diff --git a/.gitignore b/.gitignore index 477742363c05..90a766742d95 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ .DS_Store node_modules yarn-error.log -vendor +/vendor # These are NOT autogenerated. Check in files as necessary. !docs/stable/_static/js/vendor/ !docs/master/_static/js/vendor/ diff --git a/Gemfile b/Gemfile index 65f61d3b2731..e3fbe485da04 100644 --- a/Gemfile +++ b/Gemfile @@ -5,4 +5,5 @@ group :jekyll_plugins do gem "github-pages" gem "jekyll-paginate-v2" gem 'jekyll-autoprefixer' + gem 'jekyll-feed' end diff --git a/Gemfile.lock b/Gemfile.lock index f1f29bd40749..fbd99d920d5d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -267,8 +267,11 @@ PLATFORMS DEPENDENCIES github-pages jekyll-autoprefixer + jekyll-feed jekyll-paginate-v2 RUBY VERSION ruby 2.5.1p57 +BUNDLED WITH + 2.2.22 diff --git a/_includes/head.html b/_includes/head.html index aaab24f521e3..6bb86e02dcbd 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -32,4 +32,5 @@ {% include twitter_pixel.html %} {% endif %} + diff --git a/_includes/latest_episodes.html b/_includes/latest_episodes.html index 1612ea99126f..da11dd134007 100644 --- a/_includes/latest_episodes.html +++ b/_includes/latest_episodes.html @@ -1,6 +1,6 @@

Latest Episodes

- {% assign events = site.events | where: "category", "live-stream" %} + {% assign events = site.events | where: "category", "live-stream" | sort_natural: "date" | reverse %} {% capture now %}{{'now' | date: '%s' | plus: 0 %}}{% endcapture %} {% for item in events | where: "type" == "live-stream" | sort: "date" %} {% capture date %}{{item.date | date: '%s' | plus: 0 %}}{% endcapture %} diff --git a/assets/vendor/anchor.min.js b/assets/vendor/anchor.min.js new file mode 100644 index 000000000000..29a64acae6aa --- /dev/null +++ b/assets/vendor/anchor.min.js @@ -0,0 +1,6 @@ +/** + * AnchorJS - v4.1.1 - 2018-07-01 + * https://github.com/bryanbraun/anchorjs + * Copyright (c) 2018 Bryan Braun; Licensed MIT + */ +!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(this,function(){"use strict";return function(A){function d(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.ariaLabel=A.hasOwnProperty("ariaLabel")?A.ariaLabel:"Anchor",A.class=A.hasOwnProperty("class")?A.class:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64}function f(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}this.options=A||{},this.elements=[],d(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var e,t,i,n,o,s,r,a,c,h,l,u=[];if(d(this.options),"touch"===(l=this.options.visible)&&(l=this.isTouchDevice()?"always":"hover"),A||(A="h2, h3, h4, h5, h6"),0===(e=f(A)).length)return this;for(function(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style");e.className="anchorjs",e.appendChild(document.createTextNode("")),void 0===(A=document.head.querySelector('[rel="stylesheet"], style'))?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",e.sheet.cssRules.length),e.sheet.insertRule(" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",e.sheet.cssRules.length),e.sheet.insertRule(" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }",e.sheet.cssRules.length),e.sheet.insertRule(' @font-face { font-family: "anchorjs-icons"; src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype"); }',e.sheet.cssRules.length)}}(),t=document.querySelectorAll("[id]"),i=[].map.call(t,function(A){return A.id}),o=0;o\]\.\/\(\)\*\\\n\t\b\v]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),t=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||t||!1}}}); \ No newline at end of file diff --git a/assets/vendor/bootstrap.min.js b/assets/vendor/bootstrap.min.js new file mode 100644 index 000000000000..c4c0d1f95cd3 --- /dev/null +++ b/assets/vendor/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=J(f[o],a[e]-('right'===e?f.width:f.height))),ae({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=le({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!q(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,y=t(e.instance.popper),w=parseFloat(y['margin'+f],10),E=parseFloat(y['border'+f+'Width'],10),v=b-e.offsets.popper[m]-w-E;return v=$(J(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},ae(n,m,Q(v)),ae(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case he.FLIP:p=[n,i];break;case he.CLOCKWISE:p=z(n);break;case he.COUNTERCLOCKWISE:p=z(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,y=-1!==['top','bottom'].indexOf(n),w=!!t.flipVariations&&(y&&'start'===r&&h||y&&'end'===r&&c||!y&&'start'===r&&g||!y&&'end'===r&&u);(m||b||w)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),w&&(r=G(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=le({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!q(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right +{% if page.xsl %} + +{% endif %} + + Jekyll + + + {{ site.time | date_to_xmlschema }} + {{ page.url | absolute_url | xml_escape }} + + {% assign title = site.title | default: site.name %} + {% if page.collection != "posts" %} + {% assign collection = page.collection | capitalize %} + {% assign title = title | append: " | " | append: collection %} + {% endif %} + {% if page.category %} + {% assign category = page.category | capitalize %} + {% assign title = title | append: " | " | append: category %} + {% endif %} + + {% if title %} + {{ title | smartify | xml_escape }} + {% endif %} + + {% if site.description %} + {{ site.description | xml_escape }} + {% endif %} + + {% if site.author %} + + {{ site.author.name | default: site.author | xml_escape }} + {% if site.author.email %} + {{ site.author.email | xml_escape }} + {% endif %} + {% if site.author.uri %} + {{ site.author.uri | xml_escape }} + {% endif %} + + {% endif %} + + {% assign posts = site[page.collection] | where_exp: "post", "post.draft != true" | sort: "date" | reverse %} + {% if page.category %} + {% assign posts = posts | where: "category",page.category %} + {% endif %} + {% for post in posts limit: 10 %} + + {{ post.title | smartify | strip_html | normalize_whitespace | xml_escape }} + + {{ post.date | date_to_xmlschema }} + {{ post.last_modified_at | default: post.date | date_to_xmlschema }} + {{ post.id | absolute_url | xml_escape }} + {{ post.content | strip | xml_escape }} + + {% assign post_author = post.author | default: post.authors[0] | default: site.author %} + {% assign post_author = site.data.authors[post_author] | default: post_author %} + {% assign post_author_email = post_author.email | default: nil %} + {% assign post_author_uri = post_author.uri | default: nil %} + {% assign post_author_name = post_author.name | default: post_author %} + + + {{ post_author_name | default: "" | xml_escape }} + {% if post_author_email %} + {{ post_author_email | xml_escape }} + {% endif %} + {% if post_author_uri %} + {{ post_author_uri | xml_escape }} + {% endif %} + + + {% if post.category %} + + {% endif %} + + {% for tag in post.tags %} + + {% endfor %} + + {% if post.excerpt and post.excerpt != empty %} + {{ post.excerpt | strip_html | normalize_whitespace | xml_escape }} + {% endif %} + + {% assign post_image = post.image.path | default: post.image %} + {% if post_image %} + {% unless post_image contains "://" %} + {% assign post_image = post_image | absolute_url %} + {% endunless %} + + {% endif %} + + {% endfor %} + + + diff --git a/vendor/bundler/ruby/2.5.0/bin/commonmarker b/vendor/bundler/ruby/2.5.0/bin/commonmarker new file mode 100644 index 000000000000..8074f59f0af6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/commonmarker @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'commonmarker' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('commonmarker', 'commonmarker', version) +else +gem "commonmarker", version +load Gem.bin_path("commonmarker", "commonmarker", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/gemoji b/vendor/bundler/ruby/2.5.0/bin/gemoji new file mode 100644 index 000000000000..a79d093af5ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/gemoji @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'gemoji' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('gemoji', 'gemoji', version) +else +gem "gemoji", version +load Gem.bin_path("gemoji", "gemoji", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/github-pages b/vendor/bundler/ruby/2.5.0/bin/github-pages new file mode 100644 index 000000000000..4c9cd8e56a0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/github-pages @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'github-pages' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('github-pages', 'github-pages', version) +else +gem "github-pages", version +load Gem.bin_path("github-pages", "github-pages", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/jekyll b/vendor/bundler/ruby/2.5.0/bin/jekyll new file mode 100644 index 000000000000..0cc94cbf769c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/jekyll @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'jekyll' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('jekyll', 'jekyll', version) +else +gem "jekyll", version +load Gem.bin_path("jekyll", "jekyll", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/kramdown b/vendor/bundler/ruby/2.5.0/bin/kramdown new file mode 100644 index 000000000000..c0b3da982628 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/kramdown @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'kramdown' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('kramdown', 'kramdown', version) +else +gem "kramdown", version +load Gem.bin_path("kramdown", "kramdown", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/listen b/vendor/bundler/ruby/2.5.0/bin/listen new file mode 100644 index 000000000000..da64a3c89269 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/listen @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'listen' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('listen', 'listen', version) +else +gem "listen", version +load Gem.bin_path("listen", "listen", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/nokogiri b/vendor/bundler/ruby/2.5.0/bin/nokogiri new file mode 100644 index 000000000000..1bb1ce84acad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/nokogiri @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'nokogiri' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('nokogiri', 'nokogiri', version) +else +gem "nokogiri", version +load Gem.bin_path("nokogiri", "nokogiri", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/racc b/vendor/bundler/ruby/2.5.0/bin/racc new file mode 100644 index 000000000000..3ddac532b43e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/racc @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'racc' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('racc', 'racc', version) +else +gem "racc", version +load Gem.bin_path("racc", "racc", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/rougify b/vendor/bundler/ruby/2.5.0/bin/rougify new file mode 100644 index 000000000000..1f1f2c485ebd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/rougify @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'rouge' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('rouge', 'rougify', version) +else +gem "rouge", version +load Gem.bin_path("rouge", "rougify", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/safe_yaml b/vendor/bundler/ruby/2.5.0/bin/safe_yaml new file mode 100644 index 000000000000..78e139fb5578 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/safe_yaml @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'safe_yaml' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('safe_yaml', 'safe_yaml', version) +else +gem "safe_yaml", version +load Gem.bin_path("safe_yaml", "safe_yaml", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/sass b/vendor/bundler/ruby/2.5.0/bin/sass new file mode 100644 index 000000000000..e8e662dc34f3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/sass @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'sass' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('sass', 'sass', version) +else +gem "sass", version +load Gem.bin_path("sass", "sass", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/sass-convert b/vendor/bundler/ruby/2.5.0/bin/sass-convert new file mode 100644 index 000000000000..2c062d6c0682 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/sass-convert @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'sass' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('sass', 'sass-convert', version) +else +gem "sass", version +load Gem.bin_path("sass", "sass-convert", version) +end diff --git a/vendor/bundler/ruby/2.5.0/bin/scss b/vendor/bundler/ruby/2.5.0/bin/scss new file mode 100644 index 000000000000..0163fac17601 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/bin/scss @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# +# This file was generated by RubyGems. +# +# The application 'sass' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require 'rubygems' + +version = ">= 0.a" + +if ARGV.first + str = ARGV.first + str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding + if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then + version = $1 + ARGV.shift + end +end + +if Gem.respond_to?(:activate_bin_path) +load Gem.activate_bin_path('sass', 'scss', version) +else +gem "sass", version +load Gem.bin_path("sass", "scss", version) +end diff --git a/vendor/bundler/ruby/2.5.0/cache/activesupport-6.0.3.6.gem b/vendor/bundler/ruby/2.5.0/cache/activesupport-6.0.3.6.gem new file mode 100644 index 000000000000..c88866951ee0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/activesupport-6.0.3.6.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/addressable-2.8.0.gem b/vendor/bundler/ruby/2.5.0/cache/addressable-2.8.0.gem new file mode 100644 index 000000000000..1e41e1cd0d79 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/addressable-2.8.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/autoprefixer-rails-9.8.6.5.gem b/vendor/bundler/ruby/2.5.0/cache/autoprefixer-rails-9.8.6.5.gem new file mode 100644 index 000000000000..0696e7736be0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/autoprefixer-rails-9.8.6.5.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/coffee-script-2.4.1.gem b/vendor/bundler/ruby/2.5.0/cache/coffee-script-2.4.1.gem new file mode 100644 index 000000000000..7e4066d154ea Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/coffee-script-2.4.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/coffee-script-source-1.11.1.gem b/vendor/bundler/ruby/2.5.0/cache/coffee-script-source-1.11.1.gem new file mode 100644 index 000000000000..30d8fd724f70 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/coffee-script-source-1.11.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/colorator-1.1.0.gem b/vendor/bundler/ruby/2.5.0/cache/colorator-1.1.0.gem new file mode 100644 index 000000000000..d5616ad5725f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/colorator-1.1.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/commonmarker-0.17.13.gem b/vendor/bundler/ruby/2.5.0/cache/commonmarker-0.17.13.gem new file mode 100644 index 000000000000..4dd0d149af75 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/commonmarker-0.17.13.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/concurrent-ruby-1.1.8.gem b/vendor/bundler/ruby/2.5.0/cache/concurrent-ruby-1.1.8.gem new file mode 100644 index 000000000000..40b30f3f5fa8 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/concurrent-ruby-1.1.8.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/dnsruby-1.61.5.gem b/vendor/bundler/ruby/2.5.0/cache/dnsruby-1.61.5.gem new file mode 100644 index 000000000000..ed04688b50c2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/dnsruby-1.61.5.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/em-websocket-0.5.2.gem b/vendor/bundler/ruby/2.5.0/cache/em-websocket-0.5.2.gem new file mode 100644 index 000000000000..270446fedc7d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/em-websocket-0.5.2.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/ethon-0.12.0.gem b/vendor/bundler/ruby/2.5.0/cache/ethon-0.12.0.gem new file mode 100644 index 000000000000..f3793ff9ea28 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/ethon-0.12.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/eventmachine-1.2.7.gem b/vendor/bundler/ruby/2.5.0/cache/eventmachine-1.2.7.gem new file mode 100644 index 000000000000..708d366b8f4b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/eventmachine-1.2.7.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/execjs-2.7.0.gem b/vendor/bundler/ruby/2.5.0/cache/execjs-2.7.0.gem new file mode 100644 index 000000000000..1247cce4575f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/execjs-2.7.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/faraday-1.3.0.gem b/vendor/bundler/ruby/2.5.0/cache/faraday-1.3.0.gem new file mode 100644 index 000000000000..c83afaff4147 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/faraday-1.3.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/faraday-net_http-1.0.1.gem b/vendor/bundler/ruby/2.5.0/cache/faraday-net_http-1.0.1.gem new file mode 100644 index 000000000000..b1ea6b3ff36b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/faraday-net_http-1.0.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/ffi-1.15.0.gem b/vendor/bundler/ruby/2.5.0/cache/ffi-1.15.0.gem new file mode 100644 index 000000000000..37f9c727b5ea Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/ffi-1.15.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/forwardable-extended-2.6.0.gem b/vendor/bundler/ruby/2.5.0/cache/forwardable-extended-2.6.0.gem new file mode 100644 index 000000000000..370222f6928c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/forwardable-extended-2.6.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/gemoji-3.0.1.gem b/vendor/bundler/ruby/2.5.0/cache/gemoji-3.0.1.gem new file mode 100644 index 000000000000..5cb301b0f2f0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/gemoji-3.0.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/github-pages-214.gem b/vendor/bundler/ruby/2.5.0/cache/github-pages-214.gem new file mode 100644 index 000000000000..e840f76ab021 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/github-pages-214.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/github-pages-health-check-1.17.0.gem b/vendor/bundler/ruby/2.5.0/cache/github-pages-health-check-1.17.0.gem new file mode 100644 index 000000000000..3911e8e449ff Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/github-pages-health-check-1.17.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/html-pipeline-2.14.0.gem b/vendor/bundler/ruby/2.5.0/cache/html-pipeline-2.14.0.gem new file mode 100644 index 000000000000..fb7dfc276649 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/html-pipeline-2.14.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/http_parser.rb-0.6.0.gem b/vendor/bundler/ruby/2.5.0/cache/http_parser.rb-0.6.0.gem new file mode 100644 index 000000000000..3d3d508f7174 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/http_parser.rb-0.6.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/i18n-0.9.5.gem b/vendor/bundler/ruby/2.5.0/cache/i18n-0.9.5.gem new file mode 100644 index 000000000000..4c638ca51622 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/i18n-0.9.5.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-3.9.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-3.9.0.gem new file mode 100644 index 000000000000..dd2912bf1f12 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-3.9.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-autoprefixer-1.0.2.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-autoprefixer-1.0.2.gem new file mode 100644 index 000000000000..33d87ff61e6c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-autoprefixer-1.0.2.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-avatar-0.7.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-avatar-0.7.0.gem new file mode 100644 index 000000000000..cfdc8c9e9a8c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-avatar-0.7.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-coffeescript-1.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-coffeescript-1.1.1.gem new file mode 100644 index 000000000000..2069e16cfb04 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-coffeescript-1.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-commonmark-1.3.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-commonmark-1.3.1.gem new file mode 100644 index 000000000000..ab870bb11227 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-commonmark-1.3.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-commonmark-ghpages-0.1.6.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-commonmark-ghpages-0.1.6.gem new file mode 100644 index 000000000000..7ed52d33e8e0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-commonmark-ghpages-0.1.6.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-default-layout-0.1.4.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-default-layout-0.1.4.gem new file mode 100644 index 000000000000..e52d20086a7f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-default-layout-0.1.4.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-feed-0.15.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-feed-0.15.1.gem new file mode 100644 index 000000000000..7cb3a581bb7a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-feed-0.15.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-gist-1.5.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-gist-1.5.0.gem new file mode 100644 index 000000000000..a202a00041c2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-gist-1.5.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-github-metadata-2.13.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-github-metadata-2.13.0.gem new file mode 100644 index 000000000000..5704ac168c29 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-github-metadata-2.13.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-mentions-1.6.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-mentions-1.6.0.gem new file mode 100644 index 000000000000..5b8c36caa260 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-mentions-1.6.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-optional-front-matter-0.3.2.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-optional-front-matter-0.3.2.gem new file mode 100644 index 000000000000..8b27c4b4682d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-optional-front-matter-0.3.2.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-paginate-1.1.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-paginate-1.1.0.gem new file mode 100644 index 000000000000..9c7111c57a3b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-paginate-1.1.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-paginate-v2-3.0.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-paginate-v2-3.0.0.gem new file mode 100644 index 000000000000..b97d60c6daab Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-paginate-v2-3.0.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-readme-index-0.3.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-readme-index-0.3.0.gem new file mode 100644 index 000000000000..0a9ece5cdf44 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-readme-index-0.3.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-redirect-from-0.16.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-redirect-from-0.16.0.gem new file mode 100644 index 000000000000..30cd94d5e89d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-redirect-from-0.16.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-relative-links-0.6.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-relative-links-0.6.1.gem new file mode 100644 index 000000000000..d4aaa7f2b7e9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-relative-links-0.6.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-remote-theme-0.4.3.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-remote-theme-0.4.3.gem new file mode 100644 index 000000000000..342e42c22a1e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-remote-theme-0.4.3.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-sass-converter-1.5.2.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-sass-converter-1.5.2.gem new file mode 100644 index 000000000000..7f0d488d9f06 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-sass-converter-1.5.2.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-seo-tag-2.7.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-seo-tag-2.7.1.gem new file mode 100644 index 000000000000..9e8912ece7d3 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-seo-tag-2.7.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-sitemap-1.4.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-sitemap-1.4.0.gem new file mode 100644 index 000000000000..aa185d2b2b19 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-sitemap-1.4.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-swiss-1.0.0.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-swiss-1.0.0.gem new file mode 100644 index 000000000000..82a2239e3029 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-swiss-1.0.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-architect-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-architect-0.1.1.gem new file mode 100644 index 000000000000..9ef936dd7b7e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-architect-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-cayman-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-cayman-0.1.1.gem new file mode 100644 index 000000000000..05b2d5c7fb4a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-cayman-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-dinky-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-dinky-0.1.1.gem new file mode 100644 index 000000000000..1d0a441cfe64 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-dinky-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-hacker-0.1.2.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-hacker-0.1.2.gem new file mode 100644 index 000000000000..01d47dd94a5a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-hacker-0.1.2.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-leap-day-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-leap-day-0.1.1.gem new file mode 100644 index 000000000000..bdd5f5fe6eda Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-leap-day-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-merlot-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-merlot-0.1.1.gem new file mode 100644 index 000000000000..861530098618 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-merlot-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-midnight-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-midnight-0.1.1.gem new file mode 100644 index 000000000000..ab5382f5098c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-midnight-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-minimal-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-minimal-0.1.1.gem new file mode 100644 index 000000000000..f552526962d7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-minimal-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-modernist-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-modernist-0.1.1.gem new file mode 100644 index 000000000000..7690ed03d626 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-modernist-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-primer-0.5.4.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-primer-0.5.4.gem new file mode 100644 index 000000000000..f2e0df146df2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-primer-0.5.4.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-slate-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-slate-0.1.1.gem new file mode 100644 index 000000000000..9922ed02b4ee Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-slate-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-tactile-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-tactile-0.1.1.gem new file mode 100644 index 000000000000..68b94bf2637b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-tactile-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-time-machine-0.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-time-machine-0.1.1.gem new file mode 100644 index 000000000000..162e418f12db Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-theme-time-machine-0.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-titles-from-headings-0.5.3.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-titles-from-headings-0.5.3.gem new file mode 100644 index 000000000000..a0c92988f60b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-titles-from-headings-0.5.3.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jekyll-watch-2.2.1.gem b/vendor/bundler/ruby/2.5.0/cache/jekyll-watch-2.2.1.gem new file mode 100644 index 000000000000..0defcd79261b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jekyll-watch-2.2.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/jemoji-0.12.0.gem b/vendor/bundler/ruby/2.5.0/cache/jemoji-0.12.0.gem new file mode 100644 index 000000000000..84838f045cde Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/jemoji-0.12.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/kramdown-2.3.1.gem b/vendor/bundler/ruby/2.5.0/cache/kramdown-2.3.1.gem new file mode 100644 index 000000000000..29213b94f9b8 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/kramdown-2.3.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/kramdown-parser-gfm-1.1.0.gem b/vendor/bundler/ruby/2.5.0/cache/kramdown-parser-gfm-1.1.0.gem new file mode 100644 index 000000000000..f087be5cc210 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/kramdown-parser-gfm-1.1.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/liquid-4.0.3.gem b/vendor/bundler/ruby/2.5.0/cache/liquid-4.0.3.gem new file mode 100644 index 000000000000..1cb8bcb7f4f4 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/liquid-4.0.3.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/listen-3.5.1.gem b/vendor/bundler/ruby/2.5.0/cache/listen-3.5.1.gem new file mode 100644 index 000000000000..66dd605a288c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/listen-3.5.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/mercenary-0.3.6.gem b/vendor/bundler/ruby/2.5.0/cache/mercenary-0.3.6.gem new file mode 100644 index 000000000000..e5333e006bae Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/mercenary-0.3.6.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/mini_portile2-2.5.1.gem b/vendor/bundler/ruby/2.5.0/cache/mini_portile2-2.5.1.gem new file mode 100644 index 000000000000..3939c9ce0459 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/mini_portile2-2.5.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/minima-2.5.1.gem b/vendor/bundler/ruby/2.5.0/cache/minima-2.5.1.gem new file mode 100644 index 000000000000..20026a2d2eca Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/minima-2.5.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/minitest-5.14.4.gem b/vendor/bundler/ruby/2.5.0/cache/minitest-5.14.4.gem new file mode 100644 index 000000000000..6a7369480468 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/minitest-5.14.4.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/multipart-post-2.1.1.gem b/vendor/bundler/ruby/2.5.0/cache/multipart-post-2.1.1.gem new file mode 100644 index 000000000000..027956d9ad1a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/multipart-post-2.1.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/nokogiri-1.11.4-x86_64-linux.gem b/vendor/bundler/ruby/2.5.0/cache/nokogiri-1.11.4-x86_64-linux.gem new file mode 100644 index 000000000000..a0ea12e0dd26 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/nokogiri-1.11.4-x86_64-linux.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/octokit-4.20.0.gem b/vendor/bundler/ruby/2.5.0/cache/octokit-4.20.0.gem new file mode 100644 index 000000000000..e3c7b0681e24 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/octokit-4.20.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/pathutil-0.16.2.gem b/vendor/bundler/ruby/2.5.0/cache/pathutil-0.16.2.gem new file mode 100644 index 000000000000..9dd34ccc7670 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/pathutil-0.16.2.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/public_suffix-4.0.6.gem b/vendor/bundler/ruby/2.5.0/cache/public_suffix-4.0.6.gem new file mode 100644 index 000000000000..6f183f4b3def Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/public_suffix-4.0.6.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/racc-1.5.2.gem b/vendor/bundler/ruby/2.5.0/cache/racc-1.5.2.gem new file mode 100644 index 000000000000..39f03fa79c38 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/racc-1.5.2.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/rb-fsevent-0.10.4.gem b/vendor/bundler/ruby/2.5.0/cache/rb-fsevent-0.10.4.gem new file mode 100644 index 000000000000..906010689c16 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/rb-fsevent-0.10.4.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/rb-inotify-0.10.1.gem b/vendor/bundler/ruby/2.5.0/cache/rb-inotify-0.10.1.gem new file mode 100644 index 000000000000..276590b7e9e6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/rb-inotify-0.10.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/rexml-3.2.5.gem b/vendor/bundler/ruby/2.5.0/cache/rexml-3.2.5.gem new file mode 100644 index 000000000000..5680fec4c6a6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/rexml-3.2.5.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/rouge-3.26.0.gem b/vendor/bundler/ruby/2.5.0/cache/rouge-3.26.0.gem new file mode 100644 index 000000000000..8c6bf8161dbf Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/rouge-3.26.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/ruby-enum-0.9.0.gem b/vendor/bundler/ruby/2.5.0/cache/ruby-enum-0.9.0.gem new file mode 100644 index 000000000000..6a27af52e521 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/ruby-enum-0.9.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/ruby2_keywords-0.0.4.gem b/vendor/bundler/ruby/2.5.0/cache/ruby2_keywords-0.0.4.gem new file mode 100644 index 000000000000..8f14b3368cb5 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/ruby2_keywords-0.0.4.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/rubyzip-2.3.0.gem b/vendor/bundler/ruby/2.5.0/cache/rubyzip-2.3.0.gem new file mode 100644 index 000000000000..a09b3c831f59 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/rubyzip-2.3.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/safe_yaml-1.0.5.gem b/vendor/bundler/ruby/2.5.0/cache/safe_yaml-1.0.5.gem new file mode 100644 index 000000000000..b539b548a00f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/safe_yaml-1.0.5.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/sass-3.7.4.gem b/vendor/bundler/ruby/2.5.0/cache/sass-3.7.4.gem new file mode 100644 index 000000000000..b48c3b85c9c4 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/sass-3.7.4.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/sass-listen-4.0.0.gem b/vendor/bundler/ruby/2.5.0/cache/sass-listen-4.0.0.gem new file mode 100644 index 000000000000..94646539b8f7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/sass-listen-4.0.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/sawyer-0.8.2.gem b/vendor/bundler/ruby/2.5.0/cache/sawyer-0.8.2.gem new file mode 100644 index 000000000000..f8b8f8a763a3 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/sawyer-0.8.2.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/simpleidn-0.2.1.gem b/vendor/bundler/ruby/2.5.0/cache/simpleidn-0.2.1.gem new file mode 100644 index 000000000000..fda2b0eed9f0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/simpleidn-0.2.1.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/terminal-table-1.8.0.gem b/vendor/bundler/ruby/2.5.0/cache/terminal-table-1.8.0.gem new file mode 100644 index 000000000000..ac0a89c747cc Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/terminal-table-1.8.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/thread_safe-0.3.6.gem b/vendor/bundler/ruby/2.5.0/cache/thread_safe-0.3.6.gem new file mode 100644 index 000000000000..7ee950f8bdb5 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/thread_safe-0.3.6.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/typhoeus-1.4.0.gem b/vendor/bundler/ruby/2.5.0/cache/typhoeus-1.4.0.gem new file mode 100644 index 000000000000..b71baf3b189c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/typhoeus-1.4.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/tzinfo-1.2.9.gem b/vendor/bundler/ruby/2.5.0/cache/tzinfo-1.2.9.gem new file mode 100644 index 000000000000..9f596f54b415 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/tzinfo-1.2.9.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/unf-0.1.4.gem b/vendor/bundler/ruby/2.5.0/cache/unf-0.1.4.gem new file mode 100644 index 000000000000..01f1852db84d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/unf-0.1.4.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/unf_ext-0.0.7.7.gem b/vendor/bundler/ruby/2.5.0/cache/unf_ext-0.0.7.7.gem new file mode 100644 index 000000000000..bc4f8fbe6624 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/unf_ext-0.0.7.7.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/unicode-display_width-1.7.0.gem b/vendor/bundler/ruby/2.5.0/cache/unicode-display_width-1.7.0.gem new file mode 100644 index 000000000000..2f8a60d59b15 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/unicode-display_width-1.7.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/cache/zeitwerk-2.4.2.gem b/vendor/bundler/ruby/2.5.0/cache/zeitwerk-2.4.2.gem new file mode 100644 index 000000000000..8054e9466d23 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/cache/zeitwerk-2.4.2.gem differ diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/commonmarker-0.17.13/commonmarker/commonmarker.so b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/commonmarker-0.17.13/commonmarker/commonmarker.so new file mode 100644 index 000000000000..bf52e3dd8f3f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/commonmarker-0.17.13/commonmarker/commonmarker.so differ diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/commonmarker-0.17.13/gem.build_complete b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/commonmarker-0.17.13/gem.build_complete new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/commonmarker-0.17.13/gem_make.out b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/commonmarker-0.17.13/gem_make.out new file mode 100644 index 000000000000..c5efa1ac2a6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/commonmarker-0.17.13/gem_make.out @@ -0,0 +1,405 @@ +current directory: /src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker +/home/app/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20211005-8-1kqezbz.rb extconf.rb +creating Makefile + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker +make "DESTDIR=" clean +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker' +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker +make "DESTDIR=" +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker' +compiling arena.c +arena.c: In function ‘cmark_arena_pop’: +arena.c:38:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 38 | struct arena_chunk *n = A->prev; + | ^~~~~~ +arena.c: In function ‘cmark_arena_reset’: +arena.c:54:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 54 | struct arena_chunk *n = A->prev; + | ^~~~~~ +arena.c: In function ‘arena_calloc’: +arena.c:64:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 64 | size_t sz = nmem * size + sizeof(size_t); + | ^~~~~~ +arena.c:78:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 78 | void *ptr = (uint8_t *) A->ptr + A->used; + | ^~~~ +arena.c: In function ‘arena_realloc’: +arena.c:88:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 88 | void *new_ptr = arena_calloc(1, size); + | ^~~~ +arena.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling autolink.c +autolink.c: In function ‘www_match’: +autolink.c:178:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 178 | cmark_node *node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem); + | ^~~~~~~~~~ +autolink.c:186:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 186 | cmark_node *text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem); + | ^~~~~~~~~~ +autolink.c: In function ‘url_match’: +autolink.c:239:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 239 | cmark_node *node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem); + | ^~~~~~~~~~ +autolink.c:245:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 245 | cmark_node *text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem); + | ^~~~~~~~~~ +autolink.c: In function ‘postprocess_text’: +autolink.c:343:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 343 | cmark_node *link_node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem); + | ^~~~~~~~~~ +autolink.c:350:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 350 | cmark_node *link_text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem); + | ^~~~~~~~~~ +autolink.c:361:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 361 | cmark_node *post = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem); + | ^~~~~~~~~~ +autolink.c: In function ‘create_autolink_extension’: +autolink.c:415:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 415 | cmark_mem *mem = cmark_get_default_mem_allocator(); + | ^~~~~~~~~ +autolink.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling blocks.c +blocks.c: In function ‘cmark_parser_reset’: +blocks.c:118:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 118 | cmark_node *document = make_document(parser->mem); + | ^~~~~~~~~~ +blocks.c: In function ‘finalize’: +blocks.c:281:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 281 | cmark_strbuf *node_content = &b->content; + | ^~~~~~~~~~~~ +blocks.c:313:7: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 313 | cmark_strbuf tmp = CMARK_BUF_INIT(parser->mem); + | ^~~~~~~~~~~~ +blocks.c: In function ‘add_child’: +blocks.c:378:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 378 | cmark_node *child = + | ^~~~~~~~~~ +blocks.c: In function ‘process_footnotes’: +blocks.c:461:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 461 | unsigned int ix = 0; + | ^~~~~~~~ +blocks.c:471:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 471 | char n[32]; + | ^~~~ +blocks.c:474:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 474 | cmark_strbuf buf = CMARK_BUF_INIT(parser->mem); + | ^~~~~~~~~~~~ +blocks.c:483:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 483 | cmark_strbuf buf = CMARK_BUF_INIT(parser->mem); + | ^~~~~~~~~~~~ +blocks.c: In function ‘check_open_blocks’: +blocks.c:972:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 972 | cmark_node *container = parser->root; + | ^~~~~~~~~~ +blocks.c: In function ‘add_text_to_container’: +blocks.c:1257:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 1257 | const cmark_node_type ctype = S_type(container); + | ^~~~~ +blocks.c:1295:7: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 1295 | int matches_end_condition; + | ^~~ +blocks.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling buffer.c +buffer.c: In function ‘cmark_strbuf_grow’: +buffer.c:54:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 54 | bufsize_t new_size = target_size + target_size / 2; + | ^~~~~~~~~ +buffer.c: In function ‘cmark_strbuf_strchr’: +buffer.c:173:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 173 | const unsigned char *p = + | ^~~~~ +buffer.c: In function ‘cmark_strbuf_strrchr’: +buffer.c:187:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 187 | bufsize_t i; + | ^~~~~~~~~ +buffer.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling cmark.c +compiling cmark_ctype.c +compiling commonmark.c +commonmark.c: In function ‘S_render_node’: +commonmark.c:409:18: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] + 409 | emph_delim = "_"; + | ^ +commonmark.c:411:18: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] + 411 | emph_delim = "*"; + | ^ +commonmark.c:478:7: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 478 | char n[32]; + | ^~~~ +commonmark.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling commonmarker.c +In file included from /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/ruby.h:2040, + from /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby.h:33, + from commonmarker.h:9, + from commonmarker.c:1: +/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/intern.h:887:29: warning: ‘struct timespec’ declared inside parameter list will not be visible outside of this definition or declaration + 887 | void rb_timespec_now(struct timespec *); + | ^~~~~~~~ +/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/intern.h:890:41: warning: ‘struct timespec’ declared inside parameter list will not be visible outside of this definition or declaration + 890 | VALUE rb_time_timespec_new(const struct timespec *, int); + | ^~~~~~~~ +In file included from houdini.h:9, + from commonmarker.c:3: +config.h:8: warning: "HAVE_STDBOOL_H" redefined + 8 | #define HAVE_STDBOOL_H + | +In file included from /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/ruby.h:24, + from /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby.h:33, + from commonmarker.h:9, + from commonmarker.c:1: +/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux/ruby/config.h:28: note: this is the location of the previous definition + 28 | #define HAVE_STDBOOL_H 1 + | +commonmarker.c: In function ‘prepare_parser’: +commonmarker.c:123:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 123 | cmark_parser *parser = cmark_parser_new_with_mem(options, mem); + | ^~~~~~~~~~~~ +commonmarker.c:133:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 133 | cmark_syntax_extension *syntax_extension = + | ^~~~~~~~~~~~~~~~~~~~~~ +commonmarker.c: In function ‘rb_markdown_to_html’: +commonmarker.c:172:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 172 | cmark_mem *default_mem = cmark_get_default_mem_allocator(); + | ^~~~~~~~~ +commonmarker.c:176:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 176 | VALUE ruby_html = rb_str_new2(html); + | ^~~~~ +commonmarker.c: In function ‘rb_parse_document’: +commonmarker.c:270:12: warning: variable ‘options’ set but not used [-Wunused-but-set-variable] + 270 | int len, options; + | ^~~~~~~ +commonmarker.c: In function ‘rb_render_html’: +commonmarker.c:550:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 550 | cmark_syntax_extension *syntax_extension = + | ^~~~~~~~~~~~~~~~~~~~~~ +commonmarker.c:561:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 561 | char *html = cmark_render_html(node, options, extensions); + | ^~~~ +commonmarker.c: In function ‘rb_render_commonmark’: +commonmarker.c:578:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 578 | int width = 120; + | ^~~ +commonmarker.c:584:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 584 | int options; + | ^~~ +commonmarker.c:591:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 591 | char *cmark = cmark_render_commonmark(node, options, width); + | ^~~~ +commonmarker.c: In function ‘rb_render_plaintext’: +commonmarker.c:606:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 606 | int width = 120; + | ^~~ +commonmarker.c:612:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 612 | int options; + | ^~~ +commonmarker.c:619:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 619 | char *text = cmark_render_plaintext(node, options, width); + | ^~~~ +commonmarker.c: In function ‘rb_html_escape_href’: +commonmarker.c:1073:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 1073 | cmark_mem *mem = cmark_node_mem(node); + | ^~~~~~~~~ +commonmarker.c: In function ‘rb_html_escape_html’: +commonmarker.c:1093:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 1093 | cmark_mem *mem = cmark_node_mem(node); + | ^~~~~~~~~ +commonmarker.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling core-extensions.c +compiling ext_scanners.c +compiling footnotes.c +compiling houdini_href_e.c +compiling houdini_html_e.c +compiling houdini_html_u.c +compiling html.c +html.c: In function ‘S_put_footnote_backref’: +html.c:68:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 68 | char n[32]; + | ^~~~ +html.c: In function ‘S_render_node’: +html.c:399:7: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 399 | char n[32]; + | ^~~~ +html.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling inlines.c +inlines.c: In function ‘adjust_subj_node_newlines’: +inlines.c:269:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 269 | int since_newline; + | ^~~ +inlines.c: In function ‘scan_to_closing_backticks’: +inlines.c:306:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 306 | bufsize_t numticks = 0; + | ^~~~~~~~~ +inlines.c: In function ‘handle_backticks’: +inlines.c:342:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 342 | cmark_node *node = make_code(subj, startpos, endpos - openticks.len - 1, cmark_chunk_buf_detach(&buf)); + | ^~~~~~~~~~ +inlines.c: In function ‘handle_hyphen’: +inlines.c:534:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 534 | int numhyphens = subj->pos - startpos; + | ^~~ +inlines.c: In function ‘handle_backslash’: +inlines.c:758:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 758 | unsigned char nextchar = peek_char(subj); + | ^~~~~~~~ +inlines.c: In function ‘handle_pointy_brace’: +inlines.c:861:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 861 | cmark_node *node = make_raw_html(subj, subj->pos - matchlen - 1, subj->pos - 1, contents); + | ^~~~~~~~~~ +inlines.c:871:7: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 871 | cmark_node *node = make_raw_html(subj, subj->pos - matchlen - 1, subj->pos - 1, contents); + | ^~~~~~~~~~ +inlines.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling iterator.c +iterator.c: In function ‘cmark_iter_new’: +iterator.c:13:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 13 | cmark_mem *mem = root->content.mem; + | ^~~~~~~~~ +iterator.c: In function ‘cmark_consolidate_text_nodes’: +iterator.c:99:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 99 | cmark_iter *iter = cmark_iter_new(root); + | ^~~~~~~~~~ +iterator.c: In function ‘cmark_node_own’: +iterator.c:132:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 132 | cmark_iter *iter = cmark_iter_new(root); + | ^~~~~~~~~~ +iterator.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling latex.c +latex.c: In function ‘get_link_type’: +latex.c:165:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 165 | const char *url = cmark_node_get_url(node); + | ^~~~~ +latex.c:177:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 177 | const char *title = cmark_node_get_title(node); + | ^~~~~ +latex.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling linked_list.c +compiling man.c +man.c: In function ‘S_render_node’: +man.c:132:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 132 | char list_number_s[LIST_NUMBER_SIZE]; + | ^~~~ +man.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling map.c +compiling node.c +node.c: In function ‘S_node_unlink’: +node.c:761:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 761 | cmark_node *parent = node->parent; + | ^~~~~~~~~~ +node.c: In function ‘cmark_node_insert_before’: +node.c:791:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 791 | cmark_node *old_prev = node->prev; + | ^~~~~~~~~~ +node.c:802:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 802 | cmark_node *parent = node->parent; + | ^~~~~~~~~~ +node.c: In function ‘cmark_node_insert_after’: +node.c:824:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 824 | cmark_node *old_next = node->next; + | ^~~~~~~~~~ +node.c:835:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 835 | cmark_node *parent = node->parent; + | ^~~~~~~~~~ +node.c: In function ‘cmark_node_prepend_child’: +node.c:861:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 861 | cmark_node *old_first_child = node->first_child; + | ^~~~~~~~~~ +node.c: In function ‘cmark_node_append_child’: +node.c:885:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 885 | cmark_node *old_last_child = node->last_child; + | ^~~~~~~~~~ +node.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling plaintext.c +compiling plugin.c +compiling references.c +compiling registry.c +registry.c: In function ‘cmark_register_plugin’: +registry.c:23:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 23 | cmark_llist *syntax_extensions_list = cmark_plugin_steal_syntax_extensions(plugin), + | ^~~~~~~~~~~ +registry.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling render.c +compiling scanners.c +compiling strikethrough.c +strikethrough.c: In function ‘create_strikethrough_extension’: +strikethrough.c:157:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 157 | cmark_mem *mem = cmark_get_default_mem_allocator(); + | ^~~~~~~~~ +strikethrough.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling syntax_extension.c +compiling table.c +table.c: In function ‘row_from_string’: +table.c:133:7: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 133 | node_cell *cell = (node_cell *)parser->mem->calloc(1, sizeof(*cell)); + | ^~~~~~~~~ +table.c: In function ‘try_opening_table_header’: +table.c:223:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 223 | uint8_t *alignments = + | ^~~~~~~ +table.c: In function ‘matches’: +table.c:344:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 344 | table_row *new_row = row_from_string( + | ^~~~~~~~~ +table.c: In function ‘html_render’: +table.c:626:7: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 626 | int i = 0; + | ^~~ +table.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling tagfilter.c +compiling utf8.c +compiling xml.c +linking shared-object commonmarker/commonmarker.so +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker +make "DESTDIR=" install +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker' +/usr/bin/install -c -m 0755 commonmarker.so ./.gem.20211005-8-57yfuh/commonmarker +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker' diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/fastfilereaderext.so b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/fastfilereaderext.so new file mode 100644 index 000000000000..04a1e2f7da2b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/fastfilereaderext.so differ diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/gem.build_complete b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/gem.build_complete new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/gem_make.out b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/gem_make.out new file mode 100644 index 000000000000..27d0de870a00 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/gem_make.out @@ -0,0 +1,34 @@ +current directory: /src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader +/home/app/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20211005-8-11quuuu.rb extconf.rb +creating Makefile + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader +make "DESTDIR=" clean +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader' +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader +make "DESTDIR=" +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader' +compiling mapper.cpp +cc1plus: warning: command line option ‘-Wimplicit-int’ is valid for C/ObjC but not for C++ +cc1plus: warning: command line option ‘-Wdeclaration-after-statement’ is valid for C/ObjC but not for C++ +cc1plus: warning: command line option ‘-Wimplicit-function-declaration’ is valid for C/ObjC but not for C++ +cc1plus: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1plus: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1plus: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling rubymain.cpp +cc1plus: warning: command line option ‘-Wimplicit-int’ is valid for C/ObjC but not for C++ +cc1plus: warning: command line option ‘-Wdeclaration-after-statement’ is valid for C/ObjC but not for C++ +cc1plus: warning: command line option ‘-Wimplicit-function-declaration’ is valid for C/ObjC but not for C++ +cc1plus: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1plus: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1plus: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +linking shared-object fastfilereaderext.so +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader +make "DESTDIR=" install +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader' +/usr/bin/install -c -m 0755 fastfilereaderext.so ./.gem.20211005-8-29tmdc +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader' diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/mkmf.log b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/mkmf.log new file mode 100644 index 000000000000..22ee805fbf5b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/mkmf.log @@ -0,0 +1,11 @@ +"gcc -o conftest -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC conftest.c -L. -L/home/app/.rbenv/versions/2.5.1/lib -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L/home/app/.rbenv/versions/2.5.1/lib -lruby -lpthread -ldl -lcrypt -lm -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return 0; +6: } +/* end */ + diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/rubyeventmachine.so b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/rubyeventmachine.so new file mode 100644 index 000000000000..b5db129b8105 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/eventmachine-1.2.7/rubyeventmachine.so differ diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/ffi_c.so b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/ffi_c.so new file mode 100644 index 000000000000..5708a8ee3700 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/ffi_c.so differ diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/gem.build_complete b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/gem.build_complete new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/gem_make.out b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/gem_make.out new file mode 100644 index 000000000000..e4c08c687cf9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/gem_make.out @@ -0,0 +1,172 @@ +current directory: /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c +/home/app/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20211005-8-ndzfsz.rb extconf.rb +checking for ffi.h... no +checking for ffi.h in /usr/local/include,/usr/include/ffi,/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/ffi,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ffi... no +checking for whether -Wl,--exclude-libs,ALL is accepted as LDFLAGS... yes +creating extconf.h +creating Makefile + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c +make "DESTDIR=" clean +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c' +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c +make "DESTDIR=" +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c' +Configuring libffi +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure: line 7517: /usr/bin/file: No such file or directory +make -C "/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux" +make[2]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +make all-recursive +make[3]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +Making all in include +make[4]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include' +make[4]: Nothing to be done for 'all'. +make[4]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include' +Making all in testsuite +make[4]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/testsuite' +make[4]: Nothing to be done for 'all'. +make[4]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/testsuite' +Making all in man +make[4]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/man' +make[4]: Nothing to be done for 'all'. +make[4]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/man' +make[4]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/prep_cif.lo /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/prep_cif.c +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/prep_cif.c -fPIC -DPIC -o src/.libs/prep_cif.o +/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/types.lo /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/types.c +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/types.c -fPIC -DPIC -o src/.libs/types.o +/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/raw_api.lo /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/raw_api.c +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/raw_api.c -fPIC -DPIC -o src/.libs/raw_api.o +/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/java_raw_api.lo /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c -fPIC -DPIC -o src/.libs/java_raw_api.o +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c: In function ‘ffi_java_raw_call’: +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c:317:3: warning: ‘ffi_java_raw_to_ptrarray’ is deprecated [-Wdeprecated-declarations] + 317 | ffi_java_raw_to_ptrarray (cif, raw, avalue); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c:76:1: note: declared here + 76 | ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) + | ^~~~~~~~~~~~~~~~~~~~~~~~ +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c: In function ‘ffi_java_translate_args’: +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c:328:3: warning: ‘ffi_java_raw_size’ is deprecated [-Wdeprecated-declarations] + 328 | ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif)); + | ^~~~~~~~~~~~ +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c:45:1: note: declared here + 45 | ffi_java_raw_size (ffi_cif *cif) + | ^~~~~~~~~~~~~~~~~ +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c:331:3: warning: ‘ffi_java_ptrarray_to_raw’ is deprecated [-Wdeprecated-declarations] + 331 | ffi_java_ptrarray_to_raw (cif, avalue, raw); + | ^~~~~~~~~~~~~~~~~~~~~~~~ +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c:157:1: note: declared here + 157 | ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) + | ^~~~~~~~~~~~~~~~~~~~~~~~ +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c: In function ‘ffi_prep_java_raw_closure’: +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c:369:3: warning: ‘ffi_prep_java_raw_closure_loc’ is deprecated [-Wdeprecated-declarations] + 369 | return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl); + | ^~~~~~ +/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c:337:1: note: declared here + 337 | ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl, + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/closures.lo /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/closures.c +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/closures.c -fPIC -DPIC -o src/.libs/closures.o +/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/x86/ffi64.lo /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffi64.c +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffi64.c -fPIC -DPIC -o src/x86/.libs/ffi64.o +/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -c -o src/x86/unix64.lo /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/unix64.S +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -c /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/unix64.S -fPIC -DPIC -o src/x86/.libs/unix64.o +/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/x86/ffiw64.lo /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffiw64.c +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -c /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffiw64.c -fPIC -DPIC -o src/x86/.libs/ffiw64.o +/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -c -o src/x86/win64.lo /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/win64.S +libtool: compile: gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -c /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/win64.S -fPIC -DPIC -o src/x86/.libs/win64.o +gcc -DHAVE_CONFIG_H -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi -I. -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include -Iinclude -I/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src -Wall -fexceptions -DX86_64 -DGENERATE_LIBFFI_MAP \ + -E -x assembler-with-cpp -o libffi.map /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.map.in +/bin/sh ./libtool --tag=CC --mode=link gcc -Wall -fexceptions -o libffi_convenience.la src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo +libtool: link: rm -fr .libs/libffi_convenience.a(D) +libtool: link: ar cru .libs/libffi_convenience.a src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi64.o src/x86/.libs/unix64.o src/x86/.libs/ffiw64.o src/x86/.libs/win64.o +ar: `u' modifier ignored since `D' is the default (see `U') +libtool: link: ranlib .libs/libffi_convenience.a +libtool: link: ( cd ".libs" && rm -f "libffi_convenience.la" && ln -s "../libffi_convenience.la" "libffi_convenience.la" ) +/bin/sh ./libtool --tag=CC --mode=link gcc -Wall -fexceptions -no-undefined -version-info `grep -v '^#' /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libtool-version` -Wl,--version-script,libffi.map -o libffi.la -rpath /usr/local/lib/../lib src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo +libtool: link: gcc -shared -fPIC -DPIC src/.libs/prep_cif.o src/.libs/types.o src/.libs/raw_api.o src/.libs/java_raw_api.o src/.libs/closures.o src/x86/.libs/ffi64.o src/x86/.libs/unix64.o src/x86/.libs/ffiw64.o src/x86/.libs/win64.o -Wl,--version-script -Wl,libffi.map -Wl,-soname -Wl,libffi.so.8 -o .libs/libffi.so.8.1.0 +libtool: link: (cd ".libs" && rm -f "libffi.so.8" && ln -s "libffi.so.8.1.0" "libffi.so.8") +libtool: link: (cd ".libs" && rm -f "libffi.so" && ln -s "libffi.so.8.1.0" "libffi.so") +libtool: link: ( cd ".libs" && rm -f "libffi.la" && ln -s "../libffi.la" "libffi.la" ) +make[4]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +make[3]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +make[2]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +compiling AbstractMemory.c +compiling ArrayType.c +compiling Buffer.c +compiling Call.c +compiling ClosurePool.c +compiling DynamicLibrary.c +compiling Function.c +compiling FunctionInfo.c +compiling LastError.c +compiling LongDouble.c +compiling MappedType.c +compiling MemoryPointer.c +compiling MethodHandle.c +compiling Platform.c +compiling Pointer.c +compiling Struct.c +compiling StructByValue.c +compiling StructLayout.c +compiling Thread.c +compiling Type.c +compiling Types.c +compiling Variadic.c +compiling ffi.c +linking shared-object ffi_c.so +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c +make "DESTDIR=" install +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c' +make -C "/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux" +make[2]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +make all-recursive +make[3]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +Making all in include +make[4]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include' +make[4]: Nothing to be done for 'all'. +make[4]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include' +Making all in testsuite +make[4]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/testsuite' +make[4]: Nothing to be done for 'all'. +make[4]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/testsuite' +Making all in man +make[4]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/man' +make[4]: Nothing to be done for 'all'. +make[4]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/man' +make[4]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +make[4]: Nothing to be done for 'all-am'. +make[4]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +make[3]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +make[2]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +compiling AbstractMemory.c +compiling ArrayType.c +compiling Buffer.c +compiling Call.c +compiling ClosurePool.c +compiling DynamicLibrary.c +compiling Function.c +compiling FunctionInfo.c +compiling LastError.c +compiling LongDouble.c +compiling MappedType.c +compiling MemoryPointer.c +compiling MethodHandle.c +compiling Platform.c +compiling Pointer.c +compiling Struct.c +compiling StructByValue.c +compiling StructLayout.c +compiling Thread.c +compiling Type.c +compiling Types.c +compiling Variadic.c +compiling ffi.c +linking shared-object ffi_c.so +/usr/bin/install -c -m 0755 ffi_c.so ./.gem.20211005-8-aaauki +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c' diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/mkmf.log b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/mkmf.log new file mode 100644 index 000000000000..ebd9508c7b8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/ffi-1.15.0/mkmf.log @@ -0,0 +1,116 @@ +package configuration for libffi is not found +have_header: checking for ffi.h... -------------------- no + +"gcc -o conftest -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC conftest.c -L. -L/home/app/.rbenv/versions/2.5.1/lib -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L/home/app/.rbenv/versions/2.5.1/lib -lruby -lpthread -ldl -lcrypt -lm -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return 0; +6: } +/* end */ + +"gcc -E -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC conftest.c -o conftest.i" +conftest.c:3:10: fatal error: ffi.h: No such file or directory + 3 | #include + | ^~~~~~~ +compilation terminated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +find_header: checking for ffi.h in /usr/local/include,/usr/include/ffi,/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/ffi,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ffi... -------------------- no + +"gcc -E -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC conftest.c -o conftest.i" +conftest.c:3:10: fatal error: ffi.h: No such file or directory + 3 | #include + | ^~~~~~~ +compilation terminated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +"gcc -E -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC -I/usr/local/include conftest.c -o conftest.i" +conftest.c:3:10: fatal error: ffi.h: No such file or directory + 3 | #include + | ^~~~~~~ +compilation terminated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +"gcc -E -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC -I/usr/include/ffi conftest.c -o conftest.i" +conftest.c:3:10: fatal error: ffi.h: No such file or directory + 3 | #include + | ^~~~~~~ +compilation terminated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +"gcc -E -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/ffi conftest.c -o conftest.i" +conftest.c:3:10: fatal error: ffi.h: No such file or directory + 3 | #include + | ^~~~~~~ +compilation terminated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +"gcc -E -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ffi conftest.c -o conftest.i" +conftest.c:3:10: fatal error: ffi.h: No such file or directory + 3 | #include + | ^~~~~~~ +compilation terminated. +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: #include +/* end */ + +-------------------- + +block in append_ldflags: checking for whether -Wl,--exclude-libs,ALL is accepted as LDFLAGS... -------------------- yes + +"gcc -o conftest -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC conftest.c -L. -L/home/app/.rbenv/versions/2.5.1/lib -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L/home/app/.rbenv/versions/2.5.1/lib -lruby -Wl,--exclude-libs,ALL -lpthread -ldl -lcrypt -lm -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return 0; +6: } +/* end */ + +-------------------- + +extconf.h is: +/* begin */ +1: #ifndef EXTCONF_H +2: #define EXTCONF_H +3: #define HAVE_FFI_PREP_CIF_VAR 1 +4: #define USE_INTERNAL_LIBFFI 1 +5: #endif +/* end */ + diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/http_parser.rb-0.6.0/gem.build_complete b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/http_parser.rb-0.6.0/gem.build_complete new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/http_parser.rb-0.6.0/gem_make.out b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/http_parser.rb-0.6.0/gem_make.out new file mode 100644 index 000000000000..ef56de977caa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/http_parser.rb-0.6.0/gem_make.out @@ -0,0 +1,57 @@ +current directory: /src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser +/home/app/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20211005-8-123iu40.rb extconf.rb +creating Makefile + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser +make "DESTDIR=" clean +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser' +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser +make "DESTDIR=" +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser' +compiling ruby_http_parser.c +ruby_http_parser.c: In function ‘on_message_begin’: +ruby_http_parser.c:108:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 108 | VALUE ret = Qnil; + | ^~~~~ +ruby_http_parser.c: In function ‘on_header_value’: +ruby_http_parser.c:146:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 146 | int new_field = 0; + | ^~~ +ruby_http_parser.c: In function ‘on_headers_complete’: +ruby_http_parser.c:192:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 192 | VALUE ret = Qnil; + | ^~~~~ +ruby_http_parser.c: In function ‘on_body’: +ruby_http_parser.c:213:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 213 | VALUE ret = Qnil; + | ^~~~~ +ruby_http_parser.c: In function ‘on_message_complete’: +ruby_http_parser.c:232:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 232 | VALUE ret = Qnil; + | ^~~~~ +ruby_http_parser.c: In function ‘Parser_execute’: +ruby_http_parser.c:314:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 314 | char *ptr = RSTRING_PTR(data); + | ^~~~ +ruby_http_parser.c:320:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 320 | size_t nparsed = ryah_http_parser_execute(&wrapper->parser, &settings, ptr, len); + | ^~~~~~ +ruby_http_parser.c: In function ‘Parser_set_header_value_type’: +ruby_http_parser.c:451:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] + 451 | ParserWrapper *wrapper = NULL; + | ^~~~~~~~~~~~~ +ruby_http_parser.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +compiling ryah_http_parser.c +linking shared-object ruby_http_parser.so +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser +make "DESTDIR=" install +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser' +/usr/bin/install -c -m 0755 ruby_http_parser.so ./.gem.20211005-8-crl154 +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser' diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/http_parser.rb-0.6.0/ruby_http_parser.so b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/http_parser.rb-0.6.0/ruby_http_parser.so new file mode 100644 index 000000000000..6ffedd85abd3 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/http_parser.rb-0.6.0/ruby_http_parser.so differ diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/gem.build_complete b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/gem.build_complete new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/gem_make.out b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/gem_make.out new file mode 100644 index 000000000000..2a0604bb01c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/gem_make.out @@ -0,0 +1,22 @@ +current directory: /src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse +/home/app/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20211005-8-19czlgd.rb extconf.rb +checking for rb_ary_subseq()... yes +creating Makefile + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse +make "DESTDIR=" clean +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse' +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse +make "DESTDIR=" +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse' +compiling cparse.c +linking shared-object racc/cparse.so +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse +make "DESTDIR=" install +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse' +/usr/bin/install -c -m 0755 cparse.so ./.gem.20211005-8-19cl0e/racc +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse' diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/mkmf.log b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/mkmf.log new file mode 100644 index 000000000000..77323c7fd39d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/mkmf.log @@ -0,0 +1,41 @@ +have_func: checking for rb_ary_subseq()... -------------------- yes + +"gcc -o conftest -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC conftest.c -L. -L/home/app/.rbenv/versions/2.5.1/lib -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L/home/app/.rbenv/versions/2.5.1/lib -lruby -lpthread -ldl -lcrypt -lm -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return 0; +6: } +/* end */ + +"gcc -o conftest -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC conftest.c -L. -L/home/app/.rbenv/versions/2.5.1/lib -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L/home/app/.rbenv/versions/2.5.1/lib -lruby -lpthread -ldl -lcrypt -lm -lc" +conftest.c: In function ‘t’: +conftest.c:13:43: warning: cast between incompatible function types from ‘VALUE (*)(VALUE, long int, long int)’ {aka ‘long unsigned int (*)(long unsigned int, long int, long int)’} to ‘void (*)()’ [-Wcast-function-type] + 13 | int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_ary_subseq; return !p; } + | ^ +conftest.c: At top level: +cc1: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_ary_subseq; return !p; } +/* end */ + +-------------------- + diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/racc/cparse.so b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/racc/cparse.so new file mode 100644 index 000000000000..ed9bececabad Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/racc/cparse.so differ diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/gem.build_complete b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/gem.build_complete new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/gem_make.out b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/gem_make.out new file mode 100644 index 000000000000..18a255bfcc7f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/gem_make.out @@ -0,0 +1,28 @@ +current directory: /src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext +/home/app/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20211005-8-fcoxwu.rb extconf.rb +checking for -lstdc++... yes +creating Makefile + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext +make "DESTDIR=" clean +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext' +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext +make "DESTDIR=" +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext' +compiling unf.cc +cc1plus: warning: command line option ‘-Wimplicit-int’ is valid for C/ObjC but not for C++ +cc1plus: warning: command line option ‘-Wdeclaration-after-statement’ is valid for C/ObjC but not for C++ +cc1plus: warning: command line option ‘-Wimplicit-function-declaration’ is valid for C/ObjC but not for C++ +cc1plus: warning: unrecognized command line option ‘-Wno-self-assign’ +cc1plus: warning: unrecognized command line option ‘-Wno-constant-logical-operand’ +cc1plus: warning: unrecognized command line option ‘-Wno-parentheses-equality’ +linking shared-object unf_ext.so +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext' + +current directory: /src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext +make "DESTDIR=" install +make[1]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext' +/usr/bin/install -c -m 0755 unf_ext.so ./.gem.20211005-8-53ldub +make[1]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext' diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/mkmf.log b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/mkmf.log new file mode 100644 index 000000000000..1532d714d127 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/mkmf.log @@ -0,0 +1,34 @@ +have_library: checking for -lstdc++... -------------------- yes + +"gcc -o conftest -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC conftest.c -L. -L/home/app/.rbenv/versions/2.5.1/lib -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L/home/app/.rbenv/versions/2.5.1/lib -lruby -lpthread -ldl -lcrypt -lm -lc" +checked program was: +/* begin */ +1: #include "ruby.h" +2: +3: int main(int argc, char **argv) +4: { +5: return 0; +6: } +/* end */ + +"gcc -o conftest -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/app/.rbenv/versions/2.5.1/include -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict -fPIC conftest.c -L. -L/home/app/.rbenv/versions/2.5.1/lib -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/app/.rbenv/versions/2.5.1/lib -L/home/app/.rbenv/versions/2.5.1/lib -lruby -lstdc++ -lpthread -ldl -lcrypt -lm -lc" +checked program was: +/* begin */ + 1: #include "ruby.h" + 2: + 3: /*top*/ + 4: extern int t(void); + 5: int main(int argc, char **argv) + 6: { + 7: if (argc > 1000000) { + 8: printf("%p", &t); + 9: } +10: +11: return 0; +12: } +13: +14: int t(void) { ; return 0; } +/* end */ + +-------------------- + diff --git a/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/unf_ext.so b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/unf_ext.so new file mode 100644 index 000000000000..5ca586c659f7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/extensions/x86_64-linux/2.5.0/unf_ext-0.0.7.7/unf_ext.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/CHANGELOG.md new file mode 100644 index 000000000000..598c90aec330 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/CHANGELOG.md @@ -0,0 +1,691 @@ +## Rails 6.0.3.6 (March 26, 2021) ## + +* No changes. + + +## Rails 6.0.3.5 (February 10, 2021) ## + +* No changes. + + +## Rails 6.0.3.4 (October 07, 2020) ## + +* No changes. + + +## Rails 6.0.3.3 (September 09, 2020) ## + +* No changes. + + +## Rails 6.0.3.2 (June 17, 2020) ## + +* No changes. + + +## Rails 6.0.3.1 (May 18, 2020) ## + +* [CVE-2020-8165] Deprecate Marshal.load on raw cache read in RedisCacheStore + +* [CVE-2020-8165] Avoid Marshal.load on raw cache value in MemCacheStore + +## Rails 6.0.3 (May 06, 2020) ## + +* `Array#to_sentence` no longer returns a frozen string. + + Before: + + ['one', 'two'].to_sentence.frozen? + # => true + + After: + + ['one', 'two'].to_sentence.frozen? + # => false + + *Nicolas Dular* + +* Update `ActiveSupport::Messages::Metadata#fresh?` to work for cookies with expiry set when + `ActiveSupport.parse_json_times = true`. + + *Christian Gregg* + + +## Rails 6.0.2.2 (March 19, 2020) ## + +* No changes. + + +## Rails 6.0.2.1 (December 18, 2019) ## + +* No changes. + + +## Rails 6.0.2 (December 13, 2019) ## + +* Eager load translations during initialization. + + *Diego Plentz* + +* Use per-thread CPU time clock on `ActiveSupport::Notifications`. + + *George Claghorn* + + +## Rails 6.0.1 (November 5, 2019) ## + +* `ActiveSupport::SafeBuffer` supports `Enumerator` methods. + + *Shugo Maeda* + +* The Redis cache store fails gracefully when the server returns a "max number + of clients reached" error. + + *Brandon Medenwald* + +* Fixed that mutating a value returned by a memory cache store would + unexpectedly change the cached value. + + *Jonathan Hyman* + +* The default inflectors in `zeitwerk` mode support overrides: + + ```ruby + # config/initializers/zeitwerk.rb + Rails.autoloaders.each do |autoloader| + autoloader.inflector.inflect( + "html_parser" => "HTMLParser", + "ssl_error" => "SSLError" + ) + end + ``` + + That way, you can tweak how individual basenames are inflected without touching Active Support inflection rules, which are global. These inflectors fallback to `String#camelize`, so existing inflection rules are still taken into account for non-overridden basenames. + + Please, check the [autoloading guide for `zeitwerk` mode](https://guides.rubyonrails.org/v6.0/autoloading_and_reloading_constants.html#customizing-inflections) if you prefer not to depend on `String#camelize` at all. + + *Xavier Noria* + +* Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless) + and endless range targets. + + *Allen Hsu*, *Andrew Hodgkinson* + +* Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris. + + *Iain Beeston* + + +## Rails 6.0.0 (August 16, 2019) ## + +* Let `require_dependency` in `zeitwerk` mode look the autoload paths up for + better backwards compatibility. + + *Xavier Noria* + +* Let `require_dependency` in `zeitwerk` mode support arguments that respond + to `to_path` for better backwards compatibility. + + *Xavier Noria* + +* Make ActiveSupport::Logger Fiber-safe. Fixes #36752. + + Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order + to make log level local to Ruby Fibers in addition to Threads. + + Example: + + logger = ActiveSupport::Logger.new(STDOUT) + logger.level = 1 + p "Main is debug? #{logger.debug?}" + + Fiber.new { + logger.local_level = 0 + p "Thread is debug? #{logger.debug?}" + }.resume + + p "Main is debug? #{logger.debug?}" + + Before: + + Main is debug? false + Thread is debug? true + Main is debug? true + + After: + + Main is debug? false + Thread is debug? true + Main is debug? false + + *Alexander Varnin* + +* Do not delegate missing `marshal_dump` and `_dump` methods via the + `delegate_missing_to` extension. This avoids unintentionally adding instance + variables when calling `Marshal.dump(object)`, should the delegation target of + `object` be a method which would otherwise add them. Fixes #36522. + + *Aaron Lipman* + + +## Rails 6.0.0.rc2 (July 22, 2019) ## + +* `truncate` would return the original string if it was too short to be truncated + and a frozen string if it were long enough to be truncated. Now truncate will + consistently return an unfrozen string regardless. This behavior is consistent + with `gsub` and `strip`. + + Before: + + 'foobar'.truncate(5).frozen? + # => true + 'foobar'.truncate(6).frozen? + # => false + + After: + + 'foobar'.truncate(5).frozen? + # => false + 'foobar'.truncate(6).frozen? + # => false + + *Jordan Thomas* + + +## Rails 6.0.0.rc1 (April 24, 2019) ## + +* Introduce `ActiveSupport::ActionableError`. + + Actionable errors let's you dispatch actions from Rails' error pages. This + can help you save time if you have a clear action for the resolution of + common development errors. + + The de-facto example are pending migrations. Every time pending migrations + are found, a middleware raises an error. With actionable errors, you can + run the migrations right from the error page. Other examples include Rails + plugins that need to run a rake task to setup themselves. They can now + raise actionable errors to run the setup straight from the error pages. + + Here is how to define an actionable error: + + ```ruby + class PendingMigrationError < MigrationError #:nodoc: + include ActiveSupport::ActionableError + + action "Run pending migrations" do + ActiveRecord::Tasks::DatabaseTasks.migrate + end + end + ``` + + To make an error actionable, include the `ActiveSupport::ActionableError` + module and invoke the `action` class macro to define the action. An action + needs a name and a procedure to execute. The name is shown as the name of a + button on the error pages. Once clicked, it will invoke the given + procedure. + + *Vipul A M*, *Yao Jie*, *Genadi Samokovarov* + +* Preserve `html_safe?` status on `ActiveSupport::SafeBuffer#*`. + + Before: + + ("
".html_safe * 2).html_safe? #=> nil + + After: + + ("
".html_safe * 2).html_safe? #=> true + + *Ryo Nakamura* + +* Calling test methods with `with_info_handler` method to allow minitest-hooks + plugin to work. + + *Mauri Mustonen* + +* The Zeitwerk compatibility interface for `ActiveSupport::Dependencies` no + longer implements `autoloaded_constants` or `autoloaded?` (undocumented, + anyway). Experience shows introspection does not have many use cases, and + troubleshooting is done by logging. With this design trade-off we are able + to use even less memory in all environments. + + *Xavier Noria* + +* Depends on Zeitwerk 2, which stores less metadata if reloading is disabled + and hence uses less memory when `config.cache_classes` is `true`, a standard + setup in production. + + *Xavier Noria* + +* In `:zeitwerk` mode, eager load directories in engines and applications only + if present in their respective `config.eager_load_paths`. + + A common use case for this is adding `lib` to `config.autoload_paths`, but + not to `config.eager_load_paths`. In that configuration, for example, files + in the `lib` directory should not be eager loaded. + + *Xavier Noria* + +* Fix bug in Range comparisons when comparing to an excluded-end Range + + Before: + + (1..10).cover?(1...11) # => false + + After: + + (1..10).cover?(1...11) # => true + + With the same change for `Range#include?` and `Range#===`. + + *Owen Stephens* + +* Use weak references in descendants tracker to allow anonymous subclasses to + be garbage collected. + + *Edgars Beigarts* + +* Update `ActiveSupport::Notifications::Instrumenter#instrument` to make + passing a block optional. This will let users use + `ActiveSupport::Notifications` messaging features outside of + instrumentation. + + *Ali Ibrahim* + +* Fix `Time#advance` to work with dates before 1001-03-07 + + Before: + + Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-05 00:00:00 UTC + + After + + Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-06 00:00:00 UTC + + Note that this doesn't affect `DateTime#advance` as that doesn't use a proleptic calendar. + + *Andrew White* + +* In Zeitwerk mode, engines are now managed by the `main` autoloader. Engines may reference application constants, if the application is reloaded and we do not reload engines, they won't use the reloaded application code. + + *Xavier Noria* + +* Add support for supplying `locale` to `transliterate` and `parameterize`. + + I18n.backend.store_translations(:de, i18n: { transliterate: { rule: { "ü" => "ue" } } }) + + ActiveSupport::Inflector.transliterate("ü", locale: :de) # => "ue" + "Fünf autos".parameterize(locale: :de) # => "fuenf-autos" + ActiveSupport::Inflector.parameterize("Fünf autos", locale: :de) # => "fuenf-autos" + + *Kaan Ozkan*, *Sharang Dashputre* + +* Allow `Array#excluding` and `Enumerable#excluding` to deal with a passed array gracefully. + + [ 1, 2, 3, 4, 5 ].excluding([4, 5]) # => [ 1, 2, 3 ] + + *DHH* + +* Renamed `Array#without` and `Enumerable#without` to `Array#excluding` and `Enumerable#excluding`, to create parity with + `Array#including` and `Enumerable#including`. Retained the old names as aliases. + + *DHH* + +* Added `Array#including` and `Enumerable#including` to conveniently enlarge a collection with more members using a method rather than an operator: + + [ 1, 2, 3 ].including(4, 5) # => [ 1, 2, 3, 4, 5 ] + post.authors.including(Current.person) # => All the authors plus the current person! + + *DHH* + + +## Rails 6.0.0.beta3 (March 11, 2019) ## + +* No changes. + + +## Rails 6.0.0.beta2 (February 25, 2019) ## + +* New autoloading based on [Zeitwerk](https://github.com/fxn/zeitwerk). + + *Xavier Noria* + +* Revise `ActiveSupport::Notifications.unsubscribe` to correctly handle Regex or other multiple-pattern subscribers. + + *Zach Kemp* + +* Add `before_reset` callback to `CurrentAttributes` and define `after_reset` as an alias of `resets` for symmetry. + + *Rosa Gutierrez* + +* Remove the `` Kernel#` `` override that suppresses ENOENT and accidentally returns nil on Unix systems. + + *Akinori Musha* + +* Add `ActiveSupport::HashWithIndifferentAccess#assoc`. + + `assoc` can now be called with either a string or a symbol. + + *Stefan Schüßler* + +* Add `Hash#deep_transform_values`, and `Hash#deep_transform_values!`. + + *Guillermo Iguaran* + + +## Rails 6.0.0.beta1 (January 18, 2019) ## + +* Remove deprecated `Module#reachable?` method. + + *Rafael Mendonça França* + +* Remove deprecated `#acronym_regex` method from `Inflections`. + + *Rafael Mendonça França* + +* Fix `String#safe_constantize` throwing a `LoadError` for incorrectly cased constant references. + + *Keenan Brock* + +* Preserve key order passed to `ActiveSupport::CacheStore#fetch_multi`. + + `fetch_multi(*names)` now returns its results in the same order as the `*names` requested, rather than returning cache hits followed by cache misses. + + *Gannon McGibbon* + +* If the same block is `included` multiple times for a Concern, an exception is no longer raised. + + *Mark J. Titorenko*, *Vlad Bokov* + +* Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess` + would not act as alias for `#symbolize_keys`. + + *Nick Weiland* + +* Improve the logic that detects non-autoloaded constants. + + *Jan Habermann*, *Xavier Noria* + +* Deprecate `ActiveSupport::Multibyte::Unicode#pack_graphemes(array)` and `ActiveSupport::Multibyte::Unicode#unpack_graphemes(string)` + in favor of `array.flatten.pack("U*")` and `string.scan(/\X/).map(&:codepoints)`, respectively. + + *Francesco Rodríguez* + +* Deprecate `ActiveSupport::Multibyte::Chars.consumes?` in favor of `String#is_utf8?`. + + *Francesco Rodríguez* + +* Fix duration being rounded to a full second. + ``` + time = DateTime.parse("2018-1-1") + time += 0.51.seconds + ``` + Will now correctly add 0.51 second and not 1 full second. + + *Edouard Chin* + +* Deprecate `ActiveSupport::Multibyte::Unicode#normalize` and `ActiveSupport::Multibyte::Chars#normalize` + in favor of `String#unicode_normalize` + + *Francesco Rodríguez* + +* Deprecate `ActiveSupport::Multibyte::Unicode#downcase/upcase/swapcase` in favor of + `String#downcase/upcase/swapcase`. + + *Francesco Rodríguez* + +* Add `ActiveSupport::ParameterFilter`. + + *Yoshiyuki Kinjo* + +* Rename `Module#parent`, `Module#parents`, and `Module#parent_name` to + `module_parent`, `module_parents`, and `module_parent_name`. + + *Gannon McGibbon* + +* Deprecate the use of `LoggerSilence` in favor of `ActiveSupport::LoggerSilence` + + *Edouard Chin* + +* Deprecate using negative limits in `String#first` and `String#last`. + + *Gannon McGibbon*, *Eric Turner* + +* Fix bug where `#without` for `ActiveSupport::HashWithIndifferentAccess` would fail + with symbol arguments + + *Abraham Chan* + +* Treat `#delete_prefix`, `#delete_suffix` and `#unicode_normalize` results as non-`html_safe`. + Ensure safety of arguments for `#insert`, `#[]=` and `#replace` calls on `html_safe` Strings. + + *Janosch Müller* + +* Changed `ActiveSupport::TaggedLogging.new` to return a new logger instance instead + of mutating the one received as parameter. + + *Thierry Joyal* + +* Define `unfreeze_time` as an alias of `travel_back` in `ActiveSupport::Testing::TimeHelpers`. + + The alias is provided for symmetry with `freeze_time`. + + *Ryan Davidson* + +* Add support for tracing constant autoloads. Just throw + + ActiveSupport::Dependencies.logger = Rails.logger + ActiveSupport::Dependencies.verbose = true + + in an initializer. + + *Xavier Noria* + +* Maintain `html_safe?` on html_safe strings when sliced. + + string = "
test
".html_safe + string[-1..1].html_safe? # => true + + *Elom Gomez*, *Yumin Wong* + +* Add `Array#extract!`. + + The method removes and returns the elements for which the block returns a true value. + If no block is given, an Enumerator is returned instead. + + numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9] + numbers # => [0, 2, 4, 6, 8] + + *bogdanvlviv* + +* Support not to cache `nil` for `ActiveSupport::Cache#fetch`. + + cache.fetch('bar', skip_nil: true) { nil } + cache.exist?('bar') # => false + + *Martin Hong* + +* Add "event object" support to the notification system. + Before this change, end users were forced to create hand made artisanal + event objects on their own, like this: + + ActiveSupport::Notifications.subscribe('wait') do |*args| + @event = ActiveSupport::Notifications::Event.new(*args) + end + + ActiveSupport::Notifications.instrument('wait') do + sleep 1 + end + + @event.duration # => 1000.138 + + After this change, if the block passed to `subscribe` only takes one + parameter, the framework will yield an event object to the block. Now + end users are no longer required to make their own: + + ActiveSupport::Notifications.subscribe('wait') do |event| + @event = event + end + + ActiveSupport::Notifications.instrument('wait') do + sleep 1 + end + + p @event.allocations # => 7 + p @event.cpu_time # => 0.256 + p @event.idle_time # => 1003.2399 + + Now you can enjoy event objects without making them yourself. Neat! + + *Aaron "t.lo" Patterson* + +* Add cpu_time, idle_time, and allocations to Event. + + *Eileen M. Uchitelle*, *Aaron Patterson* + +* RedisCacheStore: support key expiry in increment/decrement. + + Pass `:expires_in` to `#increment` and `#decrement` to set a Redis EXPIRE on the key. + + If the key is already set to expire, RedisCacheStore won't extend its expiry. + + Rails.cache.increment("some_key", 1, expires_in: 2.minutes) + + *Jason Lee* + +* Allow `Range#===` and `Range#cover?` on Range. + + `Range#cover?` can now accept a range argument like `Range#include?` and + `Range#===`. `Range#===` works correctly on Ruby 2.6. `Range#include?` is moved + into a new file, with these two methods. + + *Requiring active_support/core_ext/range/include_range is now deprecated.* + *Use `require "active_support/core_ext/range/compare_range"` instead.* + + *utilum* + +* Add `index_with` to Enumerable. + + Allows creating a hash from an enumerable with the value from a passed block + or a default argument. + + %i( title body ).index_with { |attr| post.public_send(attr) } + # => { title: "hey", body: "what's up?" } + + %i( title body ).index_with(nil) + # => { title: nil, body: nil } + + Closely linked with `index_by`, which creates a hash where the keys are extracted from a block. + + *Kasper Timm Hansen* + +* Fix bug where `ActiveSupport::TimeZone.all` would fail when tzinfo data for + any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing. + + *Dominik Sander* + +* Redis cache store: `delete_matched` no longer blocks the Redis server. + (Switches from evaled Lua to a batched SCAN + DEL loop.) + + *Gleb Mazovetskiy* + +* Fix bug where `ActiveSupport::Cache` will massively inflate the storage + size when compression is enabled (which is true by default). This patch + does not attempt to repair existing data: please manually flush the cache + to clear out the problematic entries. + + *Godfrey Chan* + +* Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input: + + URI.unescape("\xe3\x83\x90") # => "バ" + URI.unescape("%E3%83%90") # => "バ" + URI.unescape("\xe3\x83\x90%E3%83%90") # => Encoding::CompatibilityError + + *Ashe Connor*, *Aaron Patterson* + +* Add `before?` and `after?` methods to `Date`, `DateTime`, + `Time`, and `TimeWithZone`. + + *Nick Holden* + +* `ActiveSupport::Inflector#ordinal` and `ActiveSupport::Inflector#ordinalize` now support + translations through I18n. + + # locale/fr.rb + + { + fr: { + number: { + nth: { + ordinals: lambda do |_key, number:, **_options| + if number.to_i.abs == 1 + 'er' + else + 'e' + end + end, + + ordinalized: lambda do |_key, number:, **_options| + "#{number}#{ActiveSupport::Inflector.ordinal(number)}" + end + } + } + } + } + + + *Christian Blais* + +* Add `:private` option to ActiveSupport's `Module#delegate` + in order to delegate methods as private: + + class User < ActiveRecord::Base + has_one :profile + delegate :date_of_birth, to: :profile, private: true + + def age + Date.today.year - date_of_birth.year + end + end + + # User.new.age # => 29 + # User.new.date_of_birth + # => NoMethodError: private method `date_of_birth' called for # + + *Tomas Valent* + +* `String#truncate_bytes` to truncate a string to a maximum bytesize without + breaking multibyte characters or grapheme clusters like 👩‍👩‍👦‍👦. + + *Jeremy Daer* + +* `String#strip_heredoc` preserves frozenness. + + "foo".freeze.strip_heredoc.frozen? # => true + + Fixes that frozen string literals would inadvertently become unfrozen: + + # frozen_string_literal: true + + foo = <<-MSG.strip_heredoc + la la la + MSG + + foo.frozen? # => false !?? + + *Jeremy Daer* + +* Rails 6 requires Ruby 2.5.0 or newer. + + *Jeremy Daer*, *Kasper Timm Hansen* + +* Adds parallel testing to Rails. + + Parallelize your test suite with forked processes or threads. + + *Eileen M. Uchitelle*, *Aaron Patterson* + + +Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activesupport/CHANGELOG.md) for previous changes. diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/MIT-LICENSE b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/MIT-LICENSE new file mode 100644 index 000000000000..315a4bc7c481 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2005-2019 David Heinemeier Hansson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/README.rdoc b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/README.rdoc new file mode 100644 index 000000000000..c56e63fa85ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/README.rdoc @@ -0,0 +1,40 @@ += Active Support -- Utility classes and Ruby extensions from Rails + +Active Support is a collection of utility classes and standard library +extensions that were found useful for the Rails framework. These additions +reside in this package so they can be loaded as needed in Ruby projects +outside of Rails. + +You can read more about the extensions in the {Active Support Core Extensions}[https://edgeguides.rubyonrails.org/active_support_core_extensions.html] guide. + +== Download and installation + +The latest version of Active Support can be installed with RubyGems: + + $ gem install activesupport + +Source code can be downloaded as part of the Rails project on GitHub: + +* https://github.com/rails/rails/tree/master/activesupport + + +== License + +Active Support is released under the MIT license: + +* https://opensource.org/licenses/MIT + + +== Support + +API documentation is at: + +* https://api.rubyonrails.org + +Bug reports for the Ruby on Rails project can be filed here: + +* https://github.com/rails/rails/issues + +Feature requests should be discussed on the rails-core mailing list here: + +* https://discuss.rubyonrails.org/c/rubyonrails-core diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support.rb new file mode 100644 index 000000000000..9e242ddeaa36 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +#-- +# Copyright (c) 2005-2019 David Heinemeier Hansson +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +#++ + +require "securerandom" +require "active_support/dependencies/autoload" +require "active_support/version" +require "active_support/logger" +require "active_support/lazy_load_hooks" +require "active_support/core_ext/date_and_time/compatibility" + +module ActiveSupport + extend ActiveSupport::Autoload + + autoload :Concern + autoload :ActionableError + autoload :CurrentAttributes + autoload :Dependencies + autoload :DescendantsTracker + autoload :ExecutionWrapper + autoload :Executor + autoload :FileUpdateChecker + autoload :EventedFileUpdateChecker + autoload :LogSubscriber + autoload :Notifications + autoload :Reloader + + eager_autoload do + autoload :BacktraceCleaner + autoload :ProxyObject + autoload :Benchmarkable + autoload :Cache + autoload :Callbacks + autoload :Configurable + autoload :Deprecation + autoload :Digest + autoload :Gzip + autoload :Inflector + autoload :JSON + autoload :KeyGenerator + autoload :MessageEncryptor + autoload :MessageVerifier + autoload :Multibyte + autoload :NumberHelper + autoload :OptionMerger + autoload :OrderedHash + autoload :OrderedOptions + autoload :StringInquirer + autoload :TaggedLogging + autoload :XmlMini + autoload :ArrayInquirer + end + + autoload :Rescuable + autoload :SafeBuffer, "active_support/core_ext/string/output_safety" + autoload :TestCase + + def self.eager_load! + super + + NumberHelper.eager_load! + end + + cattr_accessor :test_order # :nodoc: + + def self.to_time_preserves_timezone + DateAndTime::Compatibility.preserve_timezone + end + + def self.to_time_preserves_timezone=(value) + DateAndTime::Compatibility.preserve_timezone = value + end +end + +autoload :I18n, "active_support/i18n" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/actionable_error.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/actionable_error.rb new file mode 100644 index 000000000000..7db14cd1783a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/actionable_error.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module ActiveSupport + # Actionable errors let's you define actions to resolve an error. + # + # To make an error actionable, include the ActiveSupport::ActionableError + # module and invoke the +action+ class macro to define the action. An action + # needs a name and a block to execute. + module ActionableError + extend Concern + + class NonActionable < StandardError; end + + included do + class_attribute :_actions, default: {} + end + + def self.actions(error) # :nodoc: + case error + when ActionableError, -> it { Class === it && it < ActionableError } + error._actions + else + {} + end + end + + def self.dispatch(error, name) # :nodoc: + actions(error).fetch(name).call + rescue KeyError + raise NonActionable, "Cannot find action \"#{name}\"" + end + + module ClassMethods + # Defines an action that can resolve the error. + # + # class PendingMigrationError < MigrationError + # include ActiveSupport::ActionableError + # + # action "Run pending migrations" do + # ActiveRecord::Tasks::DatabaseTasks.migrate + # end + # end + def action(name, &block) + _actions[name] = block + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/all.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/all.rb new file mode 100644 index 000000000000..4adf446af805 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/all.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "active_support" +require "active_support/time" +require "active_support/core_ext" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/array_inquirer.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/array_inquirer.rb new file mode 100644 index 000000000000..b2b9e9c0b7ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/array_inquirer.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module ActiveSupport + # Wrapping an array in an +ArrayInquirer+ gives a friendlier way to check + # its string-like contents: + # + # variants = ActiveSupport::ArrayInquirer.new([:phone, :tablet]) + # + # variants.phone? # => true + # variants.tablet? # => true + # variants.desktop? # => false + class ArrayInquirer < Array + # Passes each element of +candidates+ collection to ArrayInquirer collection. + # The method returns true if any element from the ArrayInquirer collection + # is equal to the stringified or symbolized form of any element in the +candidates+ collection. + # + # If +candidates+ collection is not given, method returns true. + # + # variants = ActiveSupport::ArrayInquirer.new([:phone, :tablet]) + # + # variants.any? # => true + # variants.any?(:phone, :tablet) # => true + # variants.any?('phone', 'desktop') # => true + # variants.any?(:desktop, :watch) # => false + def any?(*candidates) + if candidates.none? + super + else + candidates.any? do |candidate| + include?(candidate.to_sym) || include?(candidate.to_s) + end + end + end + + private + def respond_to_missing?(name, include_private = false) + (name[-1] == "?") || super + end + + def method_missing(name, *args) + if name[-1] == "?" + any?(name[0..-2]) + else + super + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/backtrace_cleaner.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/backtrace_cleaner.rb new file mode 100644 index 000000000000..f55e821e10f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/backtrace_cleaner.rb @@ -0,0 +1,131 @@ +# frozen_string_literal: true + +module ActiveSupport + # Backtraces often include many lines that are not relevant for the context + # under review. This makes it hard to find the signal amongst the backtrace + # noise, and adds debugging time. With a BacktraceCleaner, filters and + # silencers are used to remove the noisy lines, so that only the most relevant + # lines remain. + # + # Filters are used to modify lines of data, while silencers are used to remove + # lines entirely. The typical filter use case is to remove lengthy path + # information from the start of each line, and view file paths relevant to the + # app directory instead of the file system root. The typical silencer use case + # is to exclude the output of a noisy library from the backtrace, so that you + # can focus on the rest. + # + # bc = ActiveSupport::BacktraceCleaner.new + # bc.add_filter { |line| line.gsub(Rails.root.to_s, '') } # strip the Rails.root prefix + # bc.add_silencer { |line| line =~ /puma|rubygems/ } # skip any lines from puma or rubygems + # bc.clean(exception.backtrace) # perform the cleanup + # + # To reconfigure an existing BacktraceCleaner (like the default one in Rails) + # and show as much data as possible, you can always call + # BacktraceCleaner#remove_silencers!, which will restore the + # backtrace to a pristine state. If you need to reconfigure an existing + # BacktraceCleaner so that it does not filter or modify the paths of any lines + # of the backtrace, you can call BacktraceCleaner#remove_filters! + # These two methods will give you a completely untouched backtrace. + # + # Inspired by the Quiet Backtrace gem by thoughtbot. + class BacktraceCleaner + def initialize + @filters, @silencers = [], [] + add_gem_filter + add_gem_silencer + add_stdlib_silencer + end + + # Returns the backtrace after all filters and silencers have been run + # against it. Filters run first, then silencers. + def clean(backtrace, kind = :silent) + filtered = filter_backtrace(backtrace) + + case kind + when :silent + silence(filtered) + when :noise + noise(filtered) + else + filtered + end + end + alias :filter :clean + + # Adds a filter from the block provided. Each line in the backtrace will be + # mapped against this filter. + # + # # Will turn "/my/rails/root/app/models/person.rb" into "/app/models/person.rb" + # backtrace_cleaner.add_filter { |line| line.gsub(Rails.root, '') } + def add_filter(&block) + @filters << block + end + + # Adds a silencer from the block provided. If the silencer returns +true+ + # for a given line, it will be excluded from the clean backtrace. + # + # # Will reject all lines that include the word "puma", like "/gems/puma/server.rb" or "/app/my_puma_server/rb" + # backtrace_cleaner.add_silencer { |line| line =~ /puma/ } + def add_silencer(&block) + @silencers << block + end + + # Removes all silencers, but leaves in the filters. Useful if your + # context of debugging suddenly expands as you suspect a bug in one of + # the libraries you use. + def remove_silencers! + @silencers = [] + end + + # Removes all filters, but leaves in the silencers. Useful if you suddenly + # need to see entire filepaths in the backtrace that you had already + # filtered out. + def remove_filters! + @filters = [] + end + + private + FORMATTED_GEMS_PATTERN = /\A[^\/]+ \([\w.]+\) / + + def add_gem_filter + gems_paths = (Gem.path | [Gem.default_dir]).map { |p| Regexp.escape(p) } + return if gems_paths.empty? + + gems_regexp = %r{(#{gems_paths.join('|')})/(bundler/)?gems/([^/]+)-([\w.]+)/(.*)} + gems_result = '\3 (\4) \5' + add_filter { |line| line.sub(gems_regexp, gems_result) } + end + + def add_gem_silencer + add_silencer { |line| FORMATTED_GEMS_PATTERN.match?(line) } + end + + def add_stdlib_silencer + add_silencer { |line| line.start_with?(RbConfig::CONFIG["rubylibdir"]) } + end + + def filter_backtrace(backtrace) + @filters.each do |f| + backtrace = backtrace.map { |line| f.call(line) } + end + + backtrace + end + + def silence(backtrace) + @silencers.each do |s| + backtrace = backtrace.reject { |line| s.call(line) } + end + + backtrace + end + + def noise(backtrace) + backtrace.select do |line| + @silencers.any? do |s| + s.call(line) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/benchmarkable.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/benchmarkable.rb new file mode 100644 index 000000000000..f481d6819815 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/benchmarkable.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require "active_support/core_ext/benchmark" +require "active_support/core_ext/hash/keys" + +module ActiveSupport + module Benchmarkable + # Allows you to measure the execution time of a block in a template and + # records the result to the log. Wrap this block around expensive operations + # or possible bottlenecks to get a time reading for the operation. For + # example, let's say you thought your file processing method was taking too + # long; you could wrap it in a benchmark block. + # + # <% benchmark 'Process data files' do %> + # <%= expensive_files_operation %> + # <% end %> + # + # That would add something like "Process data files (345.2ms)" to the log, + # which you can then use to compare timings when optimizing your code. + # + # You may give an optional logger level (:debug, :info, + # :warn, :error) as the :level option. The + # default logger level value is :info. + # + # <% benchmark 'Low-level files', level: :debug do %> + # <%= lowlevel_files_operation %> + # <% end %> + # + # Finally, you can pass true as the third argument to silence all log + # activity (other than the timing information) from inside the block. This + # is great for boiling down a noisy block to just a single statement that + # produces one log line: + # + # <% benchmark 'Process data files', level: :info, silence: true do %> + # <%= expensive_and_chatty_files_operation %> + # <% end %> + def benchmark(message = "Benchmarking", options = {}) + if logger + options.assert_valid_keys(:level, :silence) + options[:level] ||= :info + + result = nil + ms = Benchmark.ms { result = options[:silence] ? logger.silence { yield } : yield } + logger.send(options[:level], "%s (%.1fms)" % [ message, ms ]) + result + else + yield + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/builder.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/builder.rb new file mode 100644 index 000000000000..3fa7e6b26d9a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/builder.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +begin + require "builder" +rescue LoadError => e + $stderr.puts "You don't have builder installed in your application. Please add it to your Gemfile and run bundle install" + raise e +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache.rb new file mode 100644 index 000000000000..d58d10c6ad33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache.rb @@ -0,0 +1,831 @@ +# frozen_string_literal: true + +require "zlib" +require "active_support/core_ext/array/extract_options" +require "active_support/core_ext/array/wrap" +require "active_support/core_ext/module/attribute_accessors" +require "active_support/core_ext/numeric/bytes" +require "active_support/core_ext/numeric/time" +require "active_support/core_ext/object/to_param" +require "active_support/core_ext/string/inflections" + +module ActiveSupport + # See ActiveSupport::Cache::Store for documentation. + module Cache + autoload :FileStore, "active_support/cache/file_store" + autoload :MemoryStore, "active_support/cache/memory_store" + autoload :MemCacheStore, "active_support/cache/mem_cache_store" + autoload :NullStore, "active_support/cache/null_store" + autoload :RedisCacheStore, "active_support/cache/redis_cache_store" + + # These options mean something to all cache implementations. Individual cache + # implementations may support additional options. + UNIVERSAL_OPTIONS = [:namespace, :compress, :compress_threshold, :expires_in, :race_condition_ttl] + + module Strategy + autoload :LocalCache, "active_support/cache/strategy/local_cache" + end + + class << self + # Creates a new Store object according to the given options. + # + # If no arguments are passed to this method, then a new + # ActiveSupport::Cache::MemoryStore object will be returned. + # + # If you pass a Symbol as the first argument, then a corresponding cache + # store class under the ActiveSupport::Cache namespace will be created. + # For example: + # + # ActiveSupport::Cache.lookup_store(:memory_store) + # # => returns a new ActiveSupport::Cache::MemoryStore object + # + # ActiveSupport::Cache.lookup_store(:mem_cache_store) + # # => returns a new ActiveSupport::Cache::MemCacheStore object + # + # Any additional arguments will be passed to the corresponding cache store + # class's constructor: + # + # ActiveSupport::Cache.lookup_store(:file_store, '/tmp/cache') + # # => same as: ActiveSupport::Cache::FileStore.new('/tmp/cache') + # + # If the first argument is not a Symbol, then it will simply be returned: + # + # ActiveSupport::Cache.lookup_store(MyOwnCacheStore.new) + # # => returns MyOwnCacheStore.new + def lookup_store(store = nil, *parameters) + case store + when Symbol + options = parameters.extract_options! + retrieve_store_class(store).new(*parameters, **options) + when Array + lookup_store(*store) + when nil + ActiveSupport::Cache::MemoryStore.new + else + store + end + end + + # Expands out the +key+ argument into a key that can be used for the + # cache store. Optionally accepts a namespace, and all keys will be + # scoped within that namespace. + # + # If the +key+ argument provided is an array, or responds to +to_a+, then + # each of elements in the array will be turned into parameters/keys and + # concatenated into a single key. For example: + # + # ActiveSupport::Cache.expand_cache_key([:foo, :bar]) # => "foo/bar" + # ActiveSupport::Cache.expand_cache_key([:foo, :bar], "namespace") # => "namespace/foo/bar" + # + # The +key+ argument can also respond to +cache_key+ or +to_param+. + def expand_cache_key(key, namespace = nil) + expanded_cache_key = (namespace ? "#{namespace}/" : "").dup + + if prefix = ENV["RAILS_CACHE_ID"] || ENV["RAILS_APP_VERSION"] + expanded_cache_key << "#{prefix}/" + end + + expanded_cache_key << retrieve_cache_key(key) + expanded_cache_key + end + + private + def retrieve_cache_key(key) + case + when key.respond_to?(:cache_key_with_version) then key.cache_key_with_version + when key.respond_to?(:cache_key) then key.cache_key + when key.is_a?(Array) then key.map { |element| retrieve_cache_key(element) }.to_param + when key.respond_to?(:to_a) then retrieve_cache_key(key.to_a) + else key.to_param + end.to_s + end + + # Obtains the specified cache store class, given the name of the +store+. + # Raises an error when the store class cannot be found. + def retrieve_store_class(store) + # require_relative cannot be used here because the class might be + # provided by another gem, like redis-activesupport for example. + require "active_support/cache/#{store}" + rescue LoadError => e + raise "Could not find cache store adapter for #{store} (#{e})" + else + ActiveSupport::Cache.const_get(store.to_s.camelize) + end + end + + # An abstract cache store class. There are multiple cache store + # implementations, each having its own additional features. See the classes + # under the ActiveSupport::Cache module, e.g. + # ActiveSupport::Cache::MemCacheStore. MemCacheStore is currently the most + # popular cache store for large production websites. + # + # Some implementations may not support all methods beyond the basic cache + # methods of +fetch+, +write+, +read+, +exist?+, and +delete+. + # + # ActiveSupport::Cache::Store can store any serializable Ruby object. + # + # cache = ActiveSupport::Cache::MemoryStore.new + # + # cache.read('city') # => nil + # cache.write('city', "Duckburgh") + # cache.read('city') # => "Duckburgh" + # + # Keys are always translated into Strings and are case sensitive. When an + # object is specified as a key and has a +cache_key+ method defined, this + # method will be called to define the key. Otherwise, the +to_param+ + # method will be called. Hashes and Arrays can also be used as keys. The + # elements will be delimited by slashes, and the elements within a Hash + # will be sorted by key so they are consistent. + # + # cache.read('city') == cache.read(:city) # => true + # + # Nil values can be cached. + # + # If your cache is on a shared infrastructure, you can define a namespace + # for your cache entries. If a namespace is defined, it will be prefixed on + # to every key. The namespace can be either a static value or a Proc. If it + # is a Proc, it will be invoked when each key is evaluated so that you can + # use application logic to invalidate keys. + # + # cache.namespace = -> { @last_mod_time } # Set the namespace to a variable + # @last_mod_time = Time.now # Invalidate the entire cache by changing namespace + # + # Cached data larger than 1kB are compressed by default. To turn off + # compression, pass compress: false to the initializer or to + # individual +fetch+ or +write+ method calls. The 1kB compression + # threshold is configurable with the :compress_threshold option, + # specified in bytes. + class Store + cattr_accessor :logger, instance_writer: true + + attr_reader :silence, :options + alias :silence? :silence + + class << self + private + def retrieve_pool_options(options) + {}.tap do |pool_options| + pool_options[:size] = options.delete(:pool_size) if options[:pool_size] + pool_options[:timeout] = options.delete(:pool_timeout) if options[:pool_timeout] + end + end + + def ensure_connection_pool_added! + require "connection_pool" + rescue LoadError => e + $stderr.puts "You don't have connection_pool installed in your application. Please add it to your Gemfile and run bundle install" + raise e + end + end + + # Creates a new cache. The options will be passed to any write method calls + # except for :namespace which can be used to set the global + # namespace for the cache. + def initialize(options = nil) + @options = options ? options.dup : {} + end + + # Silences the logger. + def silence! + @silence = true + self + end + + # Silences the logger within a block. + def mute + previous_silence, @silence = defined?(@silence) && @silence, true + yield + ensure + @silence = previous_silence + end + + # Fetches data from the cache, using the given key. If there is data in + # the cache with the given key, then that data is returned. + # + # If there is no such data in the cache (a cache miss), then +nil+ will be + # returned. However, if a block has been passed, that block will be passed + # the key and executed in the event of a cache miss. The return value of the + # block will be written to the cache under the given cache key, and that + # return value will be returned. + # + # cache.write('today', 'Monday') + # cache.fetch('today') # => "Monday" + # + # cache.fetch('city') # => nil + # cache.fetch('city') do + # 'Duckburgh' + # end + # cache.fetch('city') # => "Duckburgh" + # + # You may also specify additional options via the +options+ argument. + # Setting force: true forces a cache "miss," meaning we treat + # the cache value as missing even if it's present. Passing a block is + # required when +force+ is true so this always results in a cache write. + # + # cache.write('today', 'Monday') + # cache.fetch('today', force: true) { 'Tuesday' } # => 'Tuesday' + # cache.fetch('today', force: true) # => ArgumentError + # + # The +:force+ option is useful when you're calling some other method to + # ask whether you should force a cache write. Otherwise, it's clearer to + # just call Cache#write. + # + # Setting skip_nil: true will not cache nil result: + # + # cache.fetch('foo') { nil } + # cache.fetch('bar', skip_nil: true) { nil } + # cache.exist?('foo') # => true + # cache.exist?('bar') # => false + # + # + # Setting compress: false disables compression of the cache entry. + # + # Setting :expires_in will set an expiration time on the cache. + # All caches support auto-expiring content after a specified number of + # seconds. This value can be specified as an option to the constructor + # (in which case all entries will be affected), or it can be supplied to + # the +fetch+ or +write+ method to effect just one entry. + # + # cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 5.minutes) + # cache.write(key, value, expires_in: 1.minute) # Set a lower value for one entry + # + # Setting :version verifies the cache stored under name + # is of the same version. nil is returned on mismatches despite contents. + # This feature is used to support recyclable cache keys. + # + # Setting :race_condition_ttl is very useful in situations where + # a cache entry is used very frequently and is under heavy load. If a + # cache expires and due to heavy load several different processes will try + # to read data natively and then they all will try to write to cache. To + # avoid that case the first process to find an expired cache entry will + # bump the cache expiration time by the value set in :race_condition_ttl. + # Yes, this process is extending the time for a stale value by another few + # seconds. Because of extended life of the previous cache, other processes + # will continue to use slightly stale data for a just a bit longer. In the + # meantime that first process will go ahead and will write into cache the + # new value. After that all the processes will start getting the new value. + # The key is to keep :race_condition_ttl small. + # + # If the process regenerating the entry errors out, the entry will be + # regenerated after the specified number of seconds. Also note that the + # life of stale cache is extended only if it expired recently. Otherwise + # a new value is generated and :race_condition_ttl does not play + # any role. + # + # # Set all values to expire after one minute. + # cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 1.minute) + # + # cache.write('foo', 'original value') + # val_1 = nil + # val_2 = nil + # sleep 60 + # + # Thread.new do + # val_1 = cache.fetch('foo', race_condition_ttl: 10.seconds) do + # sleep 1 + # 'new value 1' + # end + # end + # + # Thread.new do + # val_2 = cache.fetch('foo', race_condition_ttl: 10.seconds) do + # 'new value 2' + # end + # end + # + # cache.fetch('foo') # => "original value" + # sleep 10 # First thread extended the life of cache by another 10 seconds + # cache.fetch('foo') # => "new value 1" + # val_1 # => "new value 1" + # val_2 # => "original value" + # + # Other options will be handled by the specific cache store implementation. + # Internally, #fetch calls #read_entry, and calls #write_entry on a cache + # miss. +options+ will be passed to the #read and #write calls. + # + # For example, MemCacheStore's #write method supports the +:raw+ + # option, which tells the memcached server to store all values as strings. + # We can use this option with #fetch too: + # + # cache = ActiveSupport::Cache::MemCacheStore.new + # cache.fetch("foo", force: true, raw: true) do + # :bar + # end + # cache.fetch('foo') # => "bar" + def fetch(name, options = nil) + if block_given? + options = merged_options(options) + key = normalize_key(name, options) + + entry = nil + instrument(:read, name, options) do |payload| + cached_entry = read_entry(key, **options) unless options[:force] + entry = handle_expired_entry(cached_entry, key, options) + entry = nil if entry && entry.mismatched?(normalize_version(name, options)) + payload[:super_operation] = :fetch if payload + payload[:hit] = !!entry if payload + end + + if entry + get_entry_value(entry, name, **options) + else + save_block_result_to_cache(name, **options) { |_name| yield _name } + end + elsif options && options[:force] + raise ArgumentError, "Missing block: Calling `Cache#fetch` with `force: true` requires a block." + else + read(name, options) + end + end + + # Reads data from the cache, using the given key. If there is data in + # the cache with the given key, then that data is returned. Otherwise, + # +nil+ is returned. + # + # Note, if data was written with the :expires_in or + # :version options, both of these conditions are applied before + # the data is returned. + # + # Options are passed to the underlying cache implementation. + def read(name, options = nil) + options = merged_options(options) + key = normalize_key(name, options) + version = normalize_version(name, options) + + instrument(:read, name, options) do |payload| + entry = read_entry(key, **options) + + if entry + if entry.expired? + delete_entry(key, **options) + payload[:hit] = false if payload + nil + elsif entry.mismatched?(version) + payload[:hit] = false if payload + nil + else + payload[:hit] = true if payload + entry.value + end + else + payload[:hit] = false if payload + nil + end + end + end + + # Reads multiple values at once from the cache. Options can be passed + # in the last argument. + # + # Some cache implementation may optimize this method. + # + # Returns a hash mapping the names provided to the values found. + def read_multi(*names) + options = names.extract_options! + options = merged_options(options) + + instrument :read_multi, names, options do |payload| + read_multi_entries(names, **options).tap do |results| + payload[:hits] = results.keys + end + end + end + + # Cache Storage API to write multiple values at once. + def write_multi(hash, options = nil) + options = merged_options(options) + + instrument :write_multi, hash, options do |payload| + entries = hash.each_with_object({}) do |(name, value), memo| + memo[normalize_key(name, options)] = Entry.new(value, **options.merge(version: normalize_version(name, options))) + end + + write_multi_entries entries, **options + end + end + + # Fetches data from the cache, using the given keys. If there is data in + # the cache with the given keys, then that data is returned. Otherwise, + # the supplied block is called for each key for which there was no data, + # and the result will be written to the cache and returned. + # Therefore, you need to pass a block that returns the data to be written + # to the cache. If you do not want to write the cache when the cache is + # not found, use #read_multi. + # + # Returns a hash with the data for each of the names. For example: + # + # cache.write("bim", "bam") + # cache.fetch_multi("bim", "unknown_key") do |key| + # "Fallback value for key: #{key}" + # end + # # => { "bim" => "bam", + # # "unknown_key" => "Fallback value for key: unknown_key" } + # + # Options are passed to the underlying cache implementation. For example: + # + # cache.fetch_multi("fizz", expires_in: 5.seconds) do |key| + # "buzz" + # end + # # => {"fizz"=>"buzz"} + # cache.read("fizz") + # # => "buzz" + # sleep(6) + # cache.read("fizz") + # # => nil + def fetch_multi(*names) + raise ArgumentError, "Missing block: `Cache#fetch_multi` requires a block." unless block_given? + + options = names.extract_options! + options = merged_options(options) + + instrument :read_multi, names, options do |payload| + reads = read_multi_entries(names, **options) + writes = {} + ordered = names.each_with_object({}) do |name, hash| + hash[name] = reads.fetch(name) { writes[name] = yield(name) } + end + + payload[:hits] = reads.keys + payload[:super_operation] = :fetch_multi + + write_multi(writes, **options) + + ordered + end + end + + # Writes the value to the cache, with the key. + # + # Options are passed to the underlying cache implementation. + def write(name, value, options = nil) + options = merged_options(options) + + instrument(:write, name, options) do + entry = Entry.new(value, **options.merge(version: normalize_version(name, options))) + write_entry(normalize_key(name, options), entry, **options) + end + end + + # Deletes an entry in the cache. Returns +true+ if an entry is deleted. + # + # Options are passed to the underlying cache implementation. + def delete(name, options = nil) + options = merged_options(options) + + instrument(:delete, name) do + delete_entry(normalize_key(name, options), **options) + end + end + + # Returns +true+ if the cache contains an entry for the given key. + # + # Options are passed to the underlying cache implementation. + def exist?(name, options = nil) + options = merged_options(options) + + instrument(:exist?, name) do + entry = read_entry(normalize_key(name, options), **options) + (entry && !entry.expired? && !entry.mismatched?(normalize_version(name, options))) || false + end + end + + # Deletes all entries with keys matching the pattern. + # + # Options are passed to the underlying cache implementation. + # + # Some implementations may not support this method. + def delete_matched(matcher, options = nil) + raise NotImplementedError.new("#{self.class.name} does not support delete_matched") + end + + # Increments an integer value in the cache. + # + # Options are passed to the underlying cache implementation. + # + # Some implementations may not support this method. + def increment(name, amount = 1, options = nil) + raise NotImplementedError.new("#{self.class.name} does not support increment") + end + + # Decrements an integer value in the cache. + # + # Options are passed to the underlying cache implementation. + # + # Some implementations may not support this method. + def decrement(name, amount = 1, options = nil) + raise NotImplementedError.new("#{self.class.name} does not support decrement") + end + + # Cleanups the cache by removing expired entries. + # + # Options are passed to the underlying cache implementation. + # + # Some implementations may not support this method. + def cleanup(options = nil) + raise NotImplementedError.new("#{self.class.name} does not support cleanup") + end + + # Clears the entire cache. Be careful with this method since it could + # affect other processes if shared cache is being used. + # + # The options hash is passed to the underlying cache implementation. + # + # Some implementations may not support this method. + def clear(options = nil) + raise NotImplementedError.new("#{self.class.name} does not support clear") + end + + private + # Adds the namespace defined in the options to a pattern designed to + # match keys. Implementations that support delete_matched should call + # this method to translate a pattern that matches names into one that + # matches namespaced keys. + def key_matcher(pattern, options) # :doc: + prefix = options[:namespace].is_a?(Proc) ? options[:namespace].call : options[:namespace] + if prefix + source = pattern.source + if source.start_with?("^") + source = source[1, source.length] + else + source = ".*#{source[0, source.length]}" + end + Regexp.new("^#{Regexp.escape(prefix)}:#{source}", pattern.options) + else + pattern + end + end + + # Reads an entry from the cache implementation. Subclasses must implement + # this method. + def read_entry(key, **options) + raise NotImplementedError.new + end + + # Writes an entry to the cache implementation. Subclasses must implement + # this method. + def write_entry(key, entry, **options) + raise NotImplementedError.new + end + + # Reads multiple entries from the cache implementation. Subclasses MAY + # implement this method. + def read_multi_entries(names, **options) + results = {} + names.each do |name| + key = normalize_key(name, options) + version = normalize_version(name, options) + entry = read_entry(key, **options) + + if entry + if entry.expired? + delete_entry(key, **options) + elsif entry.mismatched?(version) + # Skip mismatched versions + else + results[name] = entry.value + end + end + end + results + end + + # Writes multiple entries to the cache implementation. Subclasses MAY + # implement this method. + def write_multi_entries(hash, **options) + hash.each do |key, entry| + write_entry key, entry, **options + end + end + + # Deletes an entry from the cache implementation. Subclasses must + # implement this method. + def delete_entry(key, **options) + raise NotImplementedError.new + end + + # Merges the default options with ones specific to a method call. + def merged_options(call_options) + if call_options + if options.empty? + call_options + else + options.merge(call_options) + end + else + options + end + end + + # Expands and namespaces the cache key. May be overridden by + # cache stores to do additional normalization. + def normalize_key(key, options = nil) + namespace_key expanded_key(key), options + end + + # Prefix the key with a namespace string: + # + # namespace_key 'foo', namespace: 'cache' + # # => 'cache:foo' + # + # With a namespace block: + # + # namespace_key 'foo', namespace: -> { 'cache' } + # # => 'cache:foo' + def namespace_key(key, options = nil) + options = merged_options(options) + namespace = options[:namespace] + + if namespace.respond_to?(:call) + namespace = namespace.call + end + + if namespace + "#{namespace}:#{key}" + else + key + end + end + + # Expands key to be a consistent string value. Invokes +cache_key+ if + # object responds to +cache_key+. Otherwise, +to_param+ method will be + # called. If the key is a Hash, then keys will be sorted alphabetically. + def expanded_key(key) + return key.cache_key.to_s if key.respond_to?(:cache_key) + + case key + when Array + if key.size > 1 + key = key.collect { |element| expanded_key(element) } + else + key = expanded_key(key.first) + end + when Hash + key = key.sort_by { |k, _| k.to_s }.collect { |k, v| "#{k}=#{v}" } + end + + key.to_param + end + + def normalize_version(key, options = nil) + (options && options[:version].try(:to_param)) || expanded_version(key) + end + + def expanded_version(key) + case + when key.respond_to?(:cache_version) then key.cache_version.to_param + when key.is_a?(Array) then key.map { |element| expanded_version(element) }.compact.to_param + when key.respond_to?(:to_a) then expanded_version(key.to_a) + end + end + + def instrument(operation, key, options = nil) + log { "Cache #{operation}: #{normalize_key(key, options)}#{options.blank? ? "" : " (#{options.inspect})"}" } + + payload = { key: key } + payload.merge!(options) if options.is_a?(Hash) + ActiveSupport::Notifications.instrument("cache_#{operation}.active_support", payload) { yield(payload) } + end + + def log + return unless logger && logger.debug? && !silence? + logger.debug(yield) + end + + def handle_expired_entry(entry, key, options) + if entry && entry.expired? + race_ttl = options[:race_condition_ttl].to_i + if (race_ttl > 0) && (Time.now.to_f - entry.expires_at <= race_ttl) + # When an entry has a positive :race_condition_ttl defined, put the stale entry back into the cache + # for a brief period while the entry is being recalculated. + entry.expires_at = Time.now + race_ttl + write_entry(key, entry, expires_in: race_ttl * 2) + else + delete_entry(key, **options) + end + entry = nil + end + entry + end + + def get_entry_value(entry, name, options) + instrument(:fetch_hit, name, options) { } + entry.value + end + + def save_block_result_to_cache(name, **options) + result = instrument(:generate, name, options) do + yield(name) + end + + write(name, result, options) unless result.nil? && options[:skip_nil] + result + end + end + + # This class is used to represent cache entries. Cache entries have a value, an optional + # expiration time, and an optional version. The expiration time is used to support the :race_condition_ttl option + # on the cache. The version is used to support the :version option on the cache for rejecting + # mismatches. + # + # Since cache entries in most instances will be serialized, the internals of this class are highly optimized + # using short instance variable names that are lazily defined. + class Entry # :nodoc: + attr_reader :version + + DEFAULT_COMPRESS_LIMIT = 1.kilobyte + + # Creates a new cache entry for the specified value. Options supported are + # +:compress+, +:compress_threshold+, +:version+ and +:expires_in+. + def initialize(value, compress: true, compress_threshold: DEFAULT_COMPRESS_LIMIT, version: nil, expires_in: nil, **) + @value = value + @version = version + @created_at = Time.now.to_f + @expires_in = expires_in && expires_in.to_f + + compress!(compress_threshold) if compress + end + + def value + compressed? ? uncompress(@value) : @value + end + + def mismatched?(version) + @version && version && @version != version + end + + # Checks if the entry is expired. The +expires_in+ parameter can override + # the value set when the entry was created. + def expired? + @expires_in && @created_at + @expires_in <= Time.now.to_f + end + + def expires_at + @expires_in ? @created_at + @expires_in : nil + end + + def expires_at=(value) + if value + @expires_in = value.to_f - @created_at + else + @expires_in = nil + end + end + + # Returns the size of the cached value. This could be less than + # value.size if the data is compressed. + def size + case value + when NilClass + 0 + when String + @value.bytesize + else + @s ||= Marshal.dump(@value).bytesize + end + end + + # Duplicates the value in a class. This is used by cache implementations that don't natively + # serialize entries to protect against accidental cache modifications. + def dup_value! + if @value && !compressed? && !(@value.is_a?(Numeric) || @value == true || @value == false) + if @value.is_a?(String) + @value = @value.dup + else + @value = Marshal.load(Marshal.dump(@value)) + end + end + end + + private + def compress!(compress_threshold) + case @value + when nil, true, false, Numeric + uncompressed_size = 0 + when String + uncompressed_size = @value.bytesize + else + serialized = Marshal.dump(@value) + uncompressed_size = serialized.bytesize + end + + if uncompressed_size >= compress_threshold + serialized ||= Marshal.dump(@value) + compressed = Zlib::Deflate.deflate(serialized) + + if compressed.bytesize < uncompressed_size + @value = compressed + @compressed = true + end + end + end + + def compressed? + defined?(@compressed) + end + + def uncompress(value) + Marshal.load(Zlib::Inflate.inflate(value)) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/file_store.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/file_store.rb new file mode 100644 index 000000000000..ff1d6793beb5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/file_store.rb @@ -0,0 +1,195 @@ +# frozen_string_literal: true + +require "active_support/core_ext/marshal" +require "active_support/core_ext/file/atomic" +require "active_support/core_ext/string/conversions" +require "uri/common" + +module ActiveSupport + module Cache + # A cache store implementation which stores everything on the filesystem. + # + # FileStore implements the Strategy::LocalCache strategy which implements + # an in-memory cache inside of a block. + class FileStore < Store + prepend Strategy::LocalCache + attr_reader :cache_path + + DIR_FORMATTER = "%03X" + FILENAME_MAX_SIZE = 228 # max filename size on file system is 255, minus room for timestamp and random characters appended by Tempfile (used by atomic write) + FILEPATH_MAX_SIZE = 900 # max is 1024, plus some room + GITKEEP_FILES = [".gitkeep", ".keep"].freeze + + def initialize(cache_path, options = nil) + super(options) + @cache_path = cache_path.to_s + end + + # Advertise cache versioning support. + def self.supports_cache_versioning? + true + end + + # Deletes all items from the cache. In this case it deletes all the entries in the specified + # file store directory except for .keep or .gitkeep. Be careful which directory is specified in your + # config file when using +FileStore+ because everything in that directory will be deleted. + def clear(options = nil) + root_dirs = (Dir.children(cache_path) - GITKEEP_FILES) + FileUtils.rm_r(root_dirs.collect { |f| File.join(cache_path, f) }) + rescue Errno::ENOENT, Errno::ENOTEMPTY + end + + # Preemptively iterates through all stored keys and removes the ones which have expired. + def cleanup(options = nil) + options = merged_options(options) + search_dir(cache_path) do |fname| + entry = read_entry(fname, **options) + delete_entry(fname, **options) if entry && entry.expired? + end + end + + # Increments an already existing integer value that is stored in the cache. + # If the key is not found nothing is done. + def increment(name, amount = 1, options = nil) + modify_value(name, amount, options) + end + + # Decrements an already existing integer value that is stored in the cache. + # If the key is not found nothing is done. + def decrement(name, amount = 1, options = nil) + modify_value(name, -amount, options) + end + + def delete_matched(matcher, options = nil) + options = merged_options(options) + instrument(:delete_matched, matcher.inspect) do + matcher = key_matcher(matcher, options) + search_dir(cache_path) do |path| + key = file_path_key(path) + delete_entry(path, **options) if key.match(matcher) + end + end + end + + private + def read_entry(key, **options) + if File.exist?(key) + File.open(key) { |f| Marshal.load(f) } + end + rescue => e + logger.error("FileStoreError (#{e}): #{e.message}") if logger + nil + end + + def write_entry(key, entry, **options) + return false if options[:unless_exist] && File.exist?(key) + ensure_cache_path(File.dirname(key)) + File.atomic_write(key, cache_path) { |f| Marshal.dump(entry, f) } + true + end + + def delete_entry(key, **options) + if File.exist?(key) + begin + File.delete(key) + delete_empty_directories(File.dirname(key)) + true + rescue => e + # Just in case the error was caused by another process deleting the file first. + raise e if File.exist?(key) + false + end + end + end + + # Lock a file for a block so only one process can modify it at a time. + def lock_file(file_name, &block) + if File.exist?(file_name) + File.open(file_name, "r+") do |f| + f.flock File::LOCK_EX + yield + ensure + f.flock File::LOCK_UN + end + else + yield + end + end + + # Translate a key into a file path. + def normalize_key(key, options) + key = super + fname = URI.encode_www_form_component(key) + + if fname.size > FILEPATH_MAX_SIZE + fname = ActiveSupport::Digest.hexdigest(key) + end + + hash = Zlib.adler32(fname) + hash, dir_1 = hash.divmod(0x1000) + dir_2 = hash.modulo(0x1000) + + # Make sure file name doesn't exceed file system limits. + if fname.length < FILENAME_MAX_SIZE + fname_paths = fname + else + fname_paths = [] + begin + fname_paths << fname[0, FILENAME_MAX_SIZE] + fname = fname[FILENAME_MAX_SIZE..-1] + end until fname.blank? + end + + File.join(cache_path, DIR_FORMATTER % dir_1, DIR_FORMATTER % dir_2, fname_paths) + end + + # Translate a file path into a key. + def file_path_key(path) + fname = path[cache_path.to_s.size..-1].split(File::SEPARATOR, 4).last + URI.decode_www_form_component(fname, Encoding::UTF_8) + end + + # Delete empty directories in the cache. + def delete_empty_directories(dir) + return if File.realpath(dir) == File.realpath(cache_path) + if Dir.children(dir).empty? + Dir.delete(dir) rescue nil + delete_empty_directories(File.dirname(dir)) + end + end + + # Make sure a file path's directories exist. + def ensure_cache_path(path) + FileUtils.makedirs(path) unless File.exist?(path) + end + + def search_dir(dir, &callback) + return if !File.exist?(dir) + Dir.each_child(dir) do |d| + name = File.join(dir, d) + if File.directory?(name) + search_dir(name, &callback) + else + callback.call name + end + end + end + + # Modifies the amount of an already existing integer value that is stored in the cache. + # If the key is not found nothing is done. + def modify_value(name, amount, options) + file_name = normalize_key(name, options) + + lock_file(file_name) do + options = merged_options(options) + + if num = read(name, options) + num = num.to_i + amount + write(name, num, options) + num + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/mem_cache_store.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/mem_cache_store.rb new file mode 100644 index 000000000000..fc1c1c8aa8db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/mem_cache_store.rb @@ -0,0 +1,202 @@ +# frozen_string_literal: true + +begin + require "dalli" +rescue LoadError => e + $stderr.puts "You don't have dalli installed in your application. Please add it to your Gemfile and run bundle install" + raise e +end + +require "active_support/core_ext/array/extract_options" + +module ActiveSupport + module Cache + # A cache store implementation which stores data in Memcached: + # https://memcached.org + # + # This is currently the most popular cache store for production websites. + # + # Special features: + # - Clustering and load balancing. One can specify multiple memcached servers, + # and MemCacheStore will load balance between all available servers. If a + # server goes down, then MemCacheStore will ignore it until it comes back up. + # + # MemCacheStore implements the Strategy::LocalCache strategy which implements + # an in-memory cache inside of a block. + class MemCacheStore < Store + # Provide support for raw values in the local cache strategy. + module LocalCacheWithRaw # :nodoc: + private + def write_entry(key, entry, **options) + if options[:raw] && local_cache + raw_entry = Entry.new(entry.value.to_s) + raw_entry.expires_at = entry.expires_at + super(key, raw_entry, **options) + else + super + end + end + end + + # Advertise cache versioning support. + def self.supports_cache_versioning? + true + end + + prepend Strategy::LocalCache + prepend LocalCacheWithRaw + + ESCAPE_KEY_CHARS = /[\x00-\x20%\x7F-\xFF]/n + + # Creates a new Dalli::Client instance with specified addresses and options. + # By default address is equal localhost:11211. + # + # ActiveSupport::Cache::MemCacheStore.build_mem_cache + # # => # + # ActiveSupport::Cache::MemCacheStore.build_mem_cache('localhost:10290') + # # => # + def self.build_mem_cache(*addresses) # :nodoc: + addresses = addresses.flatten + options = addresses.extract_options! + addresses = ["localhost:11211"] if addresses.empty? + pool_options = retrieve_pool_options(options) + + if pool_options.empty? + Dalli::Client.new(addresses, options) + else + ensure_connection_pool_added! + ConnectionPool.new(pool_options) { Dalli::Client.new(addresses, options.merge(threadsafe: false)) } + end + end + + # Creates a new MemCacheStore object, with the given memcached server + # addresses. Each address is either a host name, or a host-with-port string + # in the form of "host_name:port". For example: + # + # ActiveSupport::Cache::MemCacheStore.new("localhost", "server-downstairs.localnetwork:8229") + # + # If no addresses are specified, then MemCacheStore will connect to + # localhost port 11211 (the default memcached port). + def initialize(*addresses) + addresses = addresses.flatten + options = addresses.extract_options! + super(options) + + unless [String, Dalli::Client, NilClass].include?(addresses.first.class) + raise ArgumentError, "First argument must be an empty array, an array of hosts or a Dalli::Client instance." + end + if addresses.first.is_a?(Dalli::Client) + @data = addresses.first + else + mem_cache_options = options.dup + UNIVERSAL_OPTIONS.each { |name| mem_cache_options.delete(name) } + @data = self.class.build_mem_cache(*(addresses + [mem_cache_options])) + end + end + + # Increment a cached value. This method uses the memcached incr atomic + # operator and can only be used on values written with the :raw option. + # Calling it on a value not stored with :raw will initialize that value + # to zero. + def increment(name, amount = 1, options = nil) + options = merged_options(options) + instrument(:increment, name, amount: amount) do + rescue_error_with nil do + @data.with { |c| c.incr(normalize_key(name, options), amount, options[:expires_in]) } + end + end + end + + # Decrement a cached value. This method uses the memcached decr atomic + # operator and can only be used on values written with the :raw option. + # Calling it on a value not stored with :raw will initialize that value + # to zero. + def decrement(name, amount = 1, options = nil) + options = merged_options(options) + instrument(:decrement, name, amount: amount) do + rescue_error_with nil do + @data.with { |c| c.decr(normalize_key(name, options), amount, options[:expires_in]) } + end + end + end + + # Clear the entire cache on all memcached servers. This method should + # be used with care when shared cache is being used. + def clear(options = nil) + rescue_error_with(nil) { @data.with { |c| c.flush_all } } + end + + # Get the statistics from the memcached servers. + def stats + @data.with { |c| c.stats } + end + + private + # Read an entry from the cache. + def read_entry(key, **options) + rescue_error_with(nil) { deserialize_entry(@data.with { |c| c.get(key, options) }) } + end + + # Write an entry to the cache. + def write_entry(key, entry, **options) + method = options && options[:unless_exist] ? :add : :set + value = options[:raw] ? entry.value.to_s : entry + expires_in = options[:expires_in].to_i + if expires_in > 0 && !options[:raw] + # Set the memcache expire a few minutes in the future to support race condition ttls on read + expires_in += 5.minutes + end + rescue_error_with false do + @data.with { |c| c.send(method, key, value, expires_in, **options) } + end + end + + # Reads multiple entries from the cache implementation. + def read_multi_entries(names, **options) + keys_to_names = Hash[names.map { |name| [normalize_key(name, options), name] }] + + raw_values = @data.with { |c| c.get_multi(keys_to_names.keys) } + values = {} + + raw_values.each do |key, value| + entry = deserialize_entry(value) + + unless entry.expired? || entry.mismatched?(normalize_version(keys_to_names[key], options)) + values[keys_to_names[key]] = entry.value + end + end + + values + end + + # Delete an entry from the cache. + def delete_entry(key, **options) + rescue_error_with(false) { @data.with { |c| c.delete(key) } } + end + + # Memcache keys are binaries. So we need to force their encoding to binary + # before applying the regular expression to ensure we are escaping all + # characters properly. + def normalize_key(key, options) + key = super.dup + key = key.force_encoding(Encoding::ASCII_8BIT) + key = key.gsub(ESCAPE_KEY_CHARS) { |match| "%#{match.getbyte(0).to_s(16).upcase}" } + key = "#{key[0, 213]}:md5:#{ActiveSupport::Digest.hexdigest(key)}" if key.size > 250 + key + end + + def deserialize_entry(entry) + if entry + entry.is_a?(Entry) ? entry : Entry.new(entry) + end + end + + def rescue_error_with(fallback) + yield + rescue Dalli::DalliError => e + logger.error("DalliError (#{e}): #{e.message}") if logger + fallback + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/memory_store.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/memory_store.rb new file mode 100644 index 000000000000..47cb76fadb6d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/memory_store.rb @@ -0,0 +1,175 @@ +# frozen_string_literal: true + +require "monitor" + +module ActiveSupport + module Cache + # A cache store implementation which stores everything into memory in the + # same process. If you're running multiple Ruby on Rails server processes + # (which is the case if you're using Phusion Passenger or puma clustered mode), + # then this means that Rails server process instances won't be able + # to share cache data with each other and this may not be the most + # appropriate cache in that scenario. + # + # This cache has a bounded size specified by the :size options to the + # initializer (default is 32Mb). When the cache exceeds the allotted size, + # a cleanup will occur which tries to prune the cache down to three quarters + # of the maximum size by removing the least recently used entries. + # + # MemoryStore is thread-safe. + class MemoryStore < Store + def initialize(options = nil) + options ||= {} + super(options) + @data = {} + @key_access = {} + @max_size = options[:size] || 32.megabytes + @max_prune_time = options[:max_prune_time] || 2 + @cache_size = 0 + @monitor = Monitor.new + @pruning = false + end + + # Advertise cache versioning support. + def self.supports_cache_versioning? + true + end + + # Delete all data stored in a given cache store. + def clear(options = nil) + synchronize do + @data.clear + @key_access.clear + @cache_size = 0 + end + end + + # Preemptively iterates through all stored keys and removes the ones which have expired. + def cleanup(options = nil) + options = merged_options(options) + instrument(:cleanup, size: @data.size) do + keys = synchronize { @data.keys } + keys.each do |key| + entry = @data[key] + delete_entry(key, **options) if entry && entry.expired? + end + end + end + + # To ensure entries fit within the specified memory prune the cache by removing the least + # recently accessed entries. + def prune(target_size, max_time = nil) + return if pruning? + @pruning = true + begin + start_time = Concurrent.monotonic_time + cleanup + instrument(:prune, target_size, from: @cache_size) do + keys = synchronize { @key_access.keys.sort { |a, b| @key_access[a].to_f <=> @key_access[b].to_f } } + keys.each do |key| + delete_entry(key, **options) + return if @cache_size <= target_size || (max_time && Concurrent.monotonic_time - start_time > max_time) + end + end + ensure + @pruning = false + end + end + + # Returns true if the cache is currently being pruned. + def pruning? + @pruning + end + + # Increment an integer value in the cache. + def increment(name, amount = 1, options = nil) + modify_value(name, amount, options) + end + + # Decrement an integer value in the cache. + def decrement(name, amount = 1, options = nil) + modify_value(name, -amount, options) + end + + # Deletes cache entries if the cache key matches a given pattern. + def delete_matched(matcher, options = nil) + options = merged_options(options) + instrument(:delete_matched, matcher.inspect) do + matcher = key_matcher(matcher, options) + keys = synchronize { @data.keys } + keys.each do |key| + delete_entry(key, **options) if key.match(matcher) + end + end + end + + def inspect # :nodoc: + "<##{self.class.name} entries=#{@data.size}, size=#{@cache_size}, options=#{@options.inspect}>" + end + + # Synchronize calls to the cache. This should be called wherever the underlying cache implementation + # is not thread safe. + def synchronize(&block) # :nodoc: + @monitor.synchronize(&block) + end + + private + PER_ENTRY_OVERHEAD = 240 + + def cached_size(key, entry) + key.to_s.bytesize + entry.size + PER_ENTRY_OVERHEAD + end + + def read_entry(key, **options) + entry = @data[key] + synchronize do + if entry + entry = entry.dup + entry.dup_value! + @key_access[key] = Time.now.to_f + else + @key_access.delete(key) + end + end + entry + end + + def write_entry(key, entry, **options) + entry.dup_value! + synchronize do + old_entry = @data[key] + return false if @data.key?(key) && options[:unless_exist] + if old_entry + @cache_size -= (old_entry.size - entry.size) + else + @cache_size += cached_size(key, entry) + end + @key_access[key] = Time.now.to_f + @data[key] = entry + prune(@max_size * 0.75, @max_prune_time) if @cache_size > @max_size + true + end + end + + def delete_entry(key, **options) + synchronize do + @key_access.delete(key) + entry = @data.delete(key) + @cache_size -= cached_size(key, entry) if entry + !!entry + end + end + + def modify_value(name, amount, options) + synchronize do + options = merged_options(options) + if num = read(name, options) + num = num.to_i + amount + write(name, num, options) + num + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/null_store.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/null_store.rb new file mode 100644 index 000000000000..5a6b97b853e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/null_store.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module ActiveSupport + module Cache + # A cache store implementation which doesn't actually store anything. Useful in + # development and test environments where you don't want caching turned on but + # need to go through the caching interface. + # + # This cache does implement the local cache strategy, so values will actually + # be cached inside blocks that utilize this strategy. See + # ActiveSupport::Cache::Strategy::LocalCache for more details. + class NullStore < Store + prepend Strategy::LocalCache + + # Advertise cache versioning support. + def self.supports_cache_versioning? + true + end + + def clear(options = nil) + end + + def cleanup(options = nil) + end + + def increment(name, amount = 1, options = nil) + end + + def decrement(name, amount = 1, options = nil) + end + + def delete_matched(matcher, options = nil) + end + + private + def read_entry(key, **options) + end + + def write_entry(key, entry, **options) + true + end + + def delete_entry(key, **options) + false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/redis_cache_store.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/redis_cache_store.rb new file mode 100644 index 000000000000..cf41ef3803c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/redis_cache_store.rb @@ -0,0 +1,493 @@ +# frozen_string_literal: true + +begin + gem "redis", ">= 4.0.1" + require "redis" + require "redis/distributed" +rescue LoadError + warn "The Redis cache store requires the redis gem, version 4.0.1 or later. Please add it to your Gemfile: `gem \"redis\", \"~> 4.0\"`" + raise +end + +# Prefer the hiredis driver but don't require it. +begin + require "redis/connection/hiredis" +rescue LoadError +end + +require "digest/sha2" +require "active_support/core_ext/marshal" + +module ActiveSupport + module Cache + module ConnectionPoolLike + def with + yield self + end + end + + ::Redis.include(ConnectionPoolLike) + ::Redis::Distributed.include(ConnectionPoolLike) + + # Redis cache store. + # + # Deployment note: Take care to use a *dedicated Redis cache* rather + # than pointing this at your existing Redis server. It won't cope well + # with mixed usage patterns and it won't expire cache entries by default. + # + # Redis cache server setup guide: https://redis.io/topics/lru-cache + # + # * Supports vanilla Redis, hiredis, and Redis::Distributed. + # * Supports Memcached-like sharding across Redises with Redis::Distributed. + # * Fault tolerant. If the Redis server is unavailable, no exceptions are + # raised. Cache fetches are all misses and writes are dropped. + # * Local cache. Hot in-memory primary cache within block/middleware scope. + # * +read_multi+ and +write_multi+ support for Redis mget/mset. Use Redis::Distributed + # 4.0.1+ for distributed mget support. + # * +delete_matched+ support for Redis KEYS globs. + class RedisCacheStore < Store + # Keys are truncated with their own SHA2 digest if they exceed 1kB + MAX_KEY_BYTESIZE = 1024 + + DEFAULT_REDIS_OPTIONS = { + connect_timeout: 20, + read_timeout: 1, + write_timeout: 1, + reconnect_attempts: 0, + } + + DEFAULT_ERROR_HANDLER = -> (method:, returning:, exception:) do + if logger + logger.error { "RedisCacheStore: #{method} failed, returned #{returning.inspect}: #{exception.class}: #{exception.message}" } + end + end + + # The maximum number of entries to receive per SCAN call. + SCAN_BATCH_SIZE = 1000 + private_constant :SCAN_BATCH_SIZE + + # Advertise cache versioning support. + def self.supports_cache_versioning? + true + end + + # Support raw values in the local cache strategy. + module LocalCacheWithRaw # :nodoc: + private + def write_entry(key, entry, **options) + if options[:raw] && local_cache + raw_entry = Entry.new(serialize_entry(entry, raw: true)) + raw_entry.expires_at = entry.expires_at + super(key, raw_entry, **options) + else + super + end + end + + def write_multi_entries(entries, **options) + if options[:raw] && local_cache + raw_entries = entries.map do |key, entry| + raw_entry = Entry.new(serialize_entry(entry, raw: true)) + raw_entry.expires_at = entry.expires_at + end.to_h + + super(raw_entries, **options) + else + super + end + end + end + + prepend Strategy::LocalCache + prepend LocalCacheWithRaw + + class << self + # Factory method to create a new Redis instance. + # + # Handles four options: :redis block, :redis instance, single :url + # string, and multiple :url strings. + # + # Option Class Result + # :redis Proc -> options[:redis].call + # :redis Object -> options[:redis] + # :url String -> Redis.new(url: …) + # :url Array -> Redis::Distributed.new([{ url: … }, { url: … }, …]) + # + def build_redis(redis: nil, url: nil, **redis_options) #:nodoc: + urls = Array(url) + + if redis.is_a?(Proc) + redis.call + elsif redis + redis + elsif urls.size > 1 + build_redis_distributed_client urls: urls, **redis_options + else + build_redis_client url: urls.first, **redis_options + end + end + + private + def build_redis_distributed_client(urls:, **redis_options) + ::Redis::Distributed.new([], DEFAULT_REDIS_OPTIONS.merge(redis_options)).tap do |dist| + urls.each { |u| dist.add_node url: u } + end + end + + def build_redis_client(url:, **redis_options) + ::Redis.new DEFAULT_REDIS_OPTIONS.merge(redis_options.merge(url: url)) + end + end + + attr_reader :redis_options + attr_reader :max_key_bytesize + + # Creates a new Redis cache store. + # + # Handles four options: :redis block, :redis instance, single :url + # string, and multiple :url strings. + # + # Option Class Result + # :redis Proc -> options[:redis].call + # :redis Object -> options[:redis] + # :url String -> Redis.new(url: …) + # :url Array -> Redis::Distributed.new([{ url: … }, { url: … }, …]) + # + # No namespace is set by default. Provide one if the Redis cache + # server is shared with other apps: namespace: 'myapp-cache'. + # + # Compression is enabled by default with a 1kB threshold, so cached + # values larger than 1kB are automatically compressed. Disable by + # passing compress: false or change the threshold by passing + # compress_threshold: 4.kilobytes. + # + # No expiry is set on cache entries by default. Redis is expected to + # be configured with an eviction policy that automatically deletes + # least-recently or -frequently used keys when it reaches max memory. + # See https://redis.io/topics/lru-cache for cache server setup. + # + # Race condition TTL is not set by default. This can be used to avoid + # "thundering herd" cache writes when hot cache entries are expired. + # See ActiveSupport::Cache::Store#fetch for more. + def initialize(namespace: nil, compress: true, compress_threshold: 1.kilobyte, expires_in: nil, race_condition_ttl: nil, error_handler: DEFAULT_ERROR_HANDLER, **redis_options) + @redis_options = redis_options + + @max_key_bytesize = MAX_KEY_BYTESIZE + @error_handler = error_handler + + super namespace: namespace, + compress: compress, compress_threshold: compress_threshold, + expires_in: expires_in, race_condition_ttl: race_condition_ttl + end + + def redis + @redis ||= begin + pool_options = self.class.send(:retrieve_pool_options, redis_options) + + if pool_options.any? + self.class.send(:ensure_connection_pool_added!) + ::ConnectionPool.new(pool_options) { self.class.build_redis(**redis_options) } + else + self.class.build_redis(**redis_options) + end + end + end + + def inspect + instance = @redis || @redis_options + "<##{self.class} options=#{options.inspect} redis=#{instance.inspect}>" + end + + # Cache Store API implementation. + # + # Read multiple values at once. Returns a hash of requested keys -> + # fetched values. + def read_multi(*names) + if mget_capable? + instrument(:read_multi, names, options) do |payload| + read_multi_mget(*names).tap do |results| + payload[:hits] = results.keys + end + end + else + super + end + end + + # Cache Store API implementation. + # + # Supports Redis KEYS glob patterns: + # + # h?llo matches hello, hallo and hxllo + # h*llo matches hllo and heeeello + # h[ae]llo matches hello and hallo, but not hillo + # h[^e]llo matches hallo, hbllo, ... but not hello + # h[a-b]llo matches hallo and hbllo + # + # Use \ to escape special characters if you want to match them verbatim. + # + # See https://redis.io/commands/KEYS for more. + # + # Failsafe: Raises errors. + def delete_matched(matcher, options = nil) + instrument :delete_matched, matcher do + unless String === matcher + raise ArgumentError, "Only Redis glob strings are supported: #{matcher.inspect}" + end + redis.with do |c| + pattern = namespace_key(matcher, options) + cursor = "0" + # Fetch keys in batches using SCAN to avoid blocking the Redis server. + begin + cursor, keys = c.scan(cursor, match: pattern, count: SCAN_BATCH_SIZE) + c.del(*keys) unless keys.empty? + end until cursor == "0" + end + end + end + + # Cache Store API implementation. + # + # Increment a cached value. This method uses the Redis incr atomic + # operator and can only be used on values written with the :raw option. + # Calling it on a value not stored with :raw will initialize that value + # to zero. + # + # Failsafe: Raises errors. + def increment(name, amount = 1, options = nil) + instrument :increment, name, amount: amount do + failsafe :increment do + options = merged_options(options) + key = normalize_key(name, options) + + redis.with do |c| + c.incrby(key, amount).tap do + write_key_expiry(c, key, options) + end + end + end + end + end + + # Cache Store API implementation. + # + # Decrement a cached value. This method uses the Redis decr atomic + # operator and can only be used on values written with the :raw option. + # Calling it on a value not stored with :raw will initialize that value + # to zero. + # + # Failsafe: Raises errors. + def decrement(name, amount = 1, options = nil) + instrument :decrement, name, amount: amount do + failsafe :decrement do + options = merged_options(options) + key = normalize_key(name, options) + + redis.with do |c| + c.decrby(key, amount).tap do + write_key_expiry(c, key, options) + end + end + end + end + end + + # Cache Store API implementation. + # + # Removes expired entries. Handled natively by Redis least-recently-/ + # least-frequently-used expiry, so manual cleanup is not supported. + def cleanup(options = nil) + super + end + + # Clear the entire cache on all Redis servers. Safe to use on + # shared servers if the cache is namespaced. + # + # Failsafe: Raises errors. + def clear(options = nil) + failsafe :clear do + if namespace = merged_options(options)[:namespace] + delete_matched "*", namespace: namespace + else + redis.with { |c| c.flushdb } + end + end + end + + def mget_capable? #:nodoc: + set_redis_capabilities unless defined? @mget_capable + @mget_capable + end + + def mset_capable? #:nodoc: + set_redis_capabilities unless defined? @mset_capable + @mset_capable + end + + private + def set_redis_capabilities + case redis + when Redis::Distributed + @mget_capable = true + @mset_capable = false + else + @mget_capable = true + @mset_capable = true + end + end + + # Store provider interface: + # Read an entry from the cache. + def read_entry(key, **options) + failsafe :read_entry do + raw = options&.fetch(:raw, false) + deserialize_entry(redis.with { |c| c.get(key) }, raw: raw) + end + end + + def read_multi_entries(names, **options) + if mget_capable? + read_multi_mget(*names) + else + super + end + end + + def read_multi_mget(*names) + options = names.extract_options! + options = merged_options(options) + return {} if names == [] + raw = options&.fetch(:raw, false) + + keys = names.map { |name| normalize_key(name, options) } + + values = failsafe(:read_multi_mget, returning: {}) do + redis.with { |c| c.mget(*keys) } + end + + names.zip(values).each_with_object({}) do |(name, value), results| + if value + entry = deserialize_entry(value, raw: raw) + unless entry.nil? || entry.expired? || entry.mismatched?(normalize_version(name, options)) + results[name] = entry.value + end + end + end + end + + # Write an entry to the cache. + # + # Requires Redis 2.6.12+ for extended SET options. + def write_entry(key, entry, unless_exist: false, raw: false, expires_in: nil, race_condition_ttl: nil, **options) + serialized_entry = serialize_entry(entry, raw: raw) + + # If race condition TTL is in use, ensure that cache entries + # stick around a bit longer after they would have expired + # so we can purposefully serve stale entries. + if race_condition_ttl && expires_in && expires_in > 0 && !raw + expires_in += 5.minutes + end + + failsafe :write_entry, returning: false do + if unless_exist || expires_in + modifiers = {} + modifiers[:nx] = unless_exist + modifiers[:px] = (1000 * expires_in.to_f).ceil if expires_in + + redis.with { |c| c.set key, serialized_entry, modifiers } + else + redis.with { |c| c.set key, serialized_entry } + end + end + end + + def write_key_expiry(client, key, options) + if options[:expires_in] && client.ttl(key).negative? + client.expire key, options[:expires_in].to_i + end + end + + # Delete an entry from the cache. + def delete_entry(key, options) + failsafe :delete_entry, returning: false do + redis.with { |c| c.del key } + end + end + + # Nonstandard store provider API to write multiple values at once. + def write_multi_entries(entries, expires_in: nil, **options) + if entries.any? + if mset_capable? && expires_in.nil? + failsafe :write_multi_entries do + redis.with { |c| c.mapped_mset(serialize_entries(entries, raw: options[:raw])) } + end + else + super + end + end + end + + # Truncate keys that exceed 1kB. + def normalize_key(key, options) + truncate_key super.b + end + + def truncate_key(key) + if key.bytesize > max_key_bytesize + suffix = ":sha2:#{::Digest::SHA2.hexdigest(key)}" + truncate_at = max_key_bytesize - suffix.bytesize + "#{key.byteslice(0, truncate_at)}#{suffix}" + else + key + end + end + + def deserialize_entry(serialized_entry, raw:) + if serialized_entry + entry = Marshal.load(serialized_entry) rescue serialized_entry + + written_raw = serialized_entry.equal?(entry) + if raw != written_raw + ActiveSupport::Deprecation.warn(<<-MSG.squish) + Using a different value for the raw option when reading and writing + to a cache key is deprecated for :redis_cache_store and Rails 6.0 + will stop automatically detecting the format when reading to avoid + marshal loading untrusted raw strings. + MSG + end + + entry.is_a?(Entry) ? entry : Entry.new(entry) + end + end + + def serialize_entry(entry, raw: false) + if raw + entry.value.to_s + else + Marshal.dump(entry) + end + end + + def serialize_entries(entries, raw: false) + entries.transform_values do |entry| + serialize_entry entry, raw: raw + end + end + + def failsafe(method, returning: nil) + yield + rescue ::Redis::BaseError => e + handle_exception exception: e, method: method, returning: returning + returning + end + + def handle_exception(exception:, method:, returning:) + if @error_handler + @error_handler.(method: method, exception: exception, returning: returning) + end + rescue => failsafe + warn "RedisCacheStore ignored exception in handle_exception: #{failsafe.class}: #{failsafe.message}\n #{failsafe.backtrace.join("\n ")}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/strategy/local_cache.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/strategy/local_cache.rb new file mode 100644 index 000000000000..49709939024d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/strategy/local_cache.rb @@ -0,0 +1,194 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/duplicable" +require "active_support/core_ext/string/inflections" +require "active_support/per_thread_registry" + +module ActiveSupport + module Cache + module Strategy + # Caches that implement LocalCache will be backed by an in-memory cache for the + # duration of a block. Repeated calls to the cache for the same key will hit the + # in-memory cache for faster access. + module LocalCache + autoload :Middleware, "active_support/cache/strategy/local_cache_middleware" + + # Class for storing and registering the local caches. + class LocalCacheRegistry # :nodoc: + extend ActiveSupport::PerThreadRegistry + + def initialize + @registry = {} + end + + def cache_for(local_cache_key) + @registry[local_cache_key] + end + + def set_cache_for(local_cache_key, value) + @registry[local_cache_key] = value + end + + def self.set_cache_for(l, v); instance.set_cache_for l, v; end + def self.cache_for(l); instance.cache_for l; end + end + + # Simple memory backed cache. This cache is not thread safe and is intended only + # for serving as a temporary memory cache for a single thread. + class LocalStore < Store + def initialize + super + @data = {} + end + + # Don't allow synchronizing since it isn't thread safe. + def synchronize # :nodoc: + yield + end + + def clear(options = nil) + @data.clear + end + + def read_entry(key, **options) + @data[key] + end + + def read_multi_entries(keys, **options) + values = {} + + keys.each do |name| + entry = read_entry(name, **options) + values[name] = entry.value if entry + end + + values + end + + def write_entry(key, value, **options) + @data[key] = value + true + end + + def delete_entry(key, **options) + !!@data.delete(key) + end + + def fetch_entry(key, options = nil) # :nodoc: + @data.fetch(key) { @data[key] = yield } + end + end + + # Use a local cache for the duration of block. + def with_local_cache + use_temporary_local_cache(LocalStore.new) { yield } + end + + # Middleware class can be inserted as a Rack handler to be local cache for the + # duration of request. + def middleware + @middleware ||= Middleware.new( + "ActiveSupport::Cache::Strategy::LocalCache", + local_cache_key) + end + + def clear(**options) # :nodoc: + return super unless cache = local_cache + cache.clear(options) + super + end + + def cleanup(**options) # :nodoc: + return super unless cache = local_cache + cache.clear + super + end + + def increment(name, amount = 1, **options) # :nodoc: + return super unless local_cache + value = bypass_local_cache { super } + write_cache_value(name, value, **options) + value + end + + def decrement(name, amount = 1, **options) # :nodoc: + return super unless local_cache + value = bypass_local_cache { super } + write_cache_value(name, value, **options) + value + end + + private + def read_entry(key, **options) + if cache = local_cache + cache.fetch_entry(key) { super } + else + super + end + end + + def read_multi_entries(keys, **options) + return super unless local_cache + + local_entries = local_cache.read_multi_entries(keys, **options) + missed_keys = keys - local_entries.keys + + if missed_keys.any? + local_entries.merge!(super(missed_keys, **options)) + else + local_entries + end + end + + def write_entry(key, entry, **options) + if options[:unless_exist] + local_cache.delete_entry(key, **options) if local_cache + else + local_cache.write_entry(key, entry, **options) if local_cache + end + + super + end + + def delete_entry(key, **options) + local_cache.delete_entry(key, **options) if local_cache + super + end + + def write_cache_value(name, value, **options) + name = normalize_key(name, options) + cache = local_cache + cache.mute do + if value + cache.write(name, value, **options) + else + cache.delete(name, **options) + end + end + end + + def local_cache_key + @local_cache_key ||= "#{self.class.name.underscore}_local_cache_#{object_id}".gsub(/[\/-]/, "_").to_sym + end + + def local_cache + LocalCacheRegistry.cache_for(local_cache_key) + end + + def bypass_local_cache + use_temporary_local_cache(nil) { yield } + end + + def use_temporary_local_cache(temporary_cache) + save_cache = LocalCacheRegistry.cache_for(local_cache_key) + begin + LocalCacheRegistry.set_cache_for(local_cache_key, temporary_cache) + yield + ensure + LocalCacheRegistry.set_cache_for(local_cache_key, save_cache) + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/strategy/local_cache_middleware.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/strategy/local_cache_middleware.rb new file mode 100644 index 000000000000..62542bdb2242 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/cache/strategy/local_cache_middleware.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require "rack/body_proxy" +require "rack/utils" + +module ActiveSupport + module Cache + module Strategy + module LocalCache + #-- + # This class wraps up local storage for middlewares. Only the middleware method should + # construct them. + class Middleware # :nodoc: + attr_reader :name, :local_cache_key + + def initialize(name, local_cache_key) + @name = name + @local_cache_key = local_cache_key + @app = nil + end + + def new(app) + @app = app + self + end + + def call(env) + LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new) + response = @app.call(env) + response[2] = ::Rack::BodyProxy.new(response[2]) do + LocalCacheRegistry.set_cache_for(local_cache_key, nil) + end + cleanup_on_body_close = true + response + rescue Rack::Utils::InvalidParameterError + [400, {}, []] + ensure + LocalCacheRegistry.set_cache_for(local_cache_key, nil) unless + cleanup_on_body_close + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/callbacks.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/callbacks.rb new file mode 100644 index 000000000000..11746e053701 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/callbacks.rb @@ -0,0 +1,853 @@ +# frozen_string_literal: true + +require "active_support/concern" +require "active_support/descendants_tracker" +require "active_support/core_ext/array/extract_options" +require "active_support/core_ext/class/attribute" +require "active_support/core_ext/kernel/reporting" +require "active_support/core_ext/kernel/singleton_class" +require "active_support/core_ext/string/filters" +require "active_support/deprecation" +require "thread" + +module ActiveSupport + # Callbacks are code hooks that are run at key points in an object's life cycle. + # The typical use case is to have a base class define a set of callbacks + # relevant to the other functionality it supplies, so that subclasses can + # install callbacks that enhance or modify the base functionality without + # needing to override or redefine methods of the base class. + # + # Mixing in this module allows you to define the events in the object's + # life cycle that will support callbacks (via +ClassMethods.define_callbacks+), + # set the instance methods, procs, or callback objects to be called (via + # +ClassMethods.set_callback+), and run the installed callbacks at the + # appropriate times (via +run_callbacks+). + # + # By default callbacks are halted by throwing +:abort+. + # See +ClassMethods.define_callbacks+ for details. + # + # Three kinds of callbacks are supported: before callbacks, run before a + # certain event; after callbacks, run after the event; and around callbacks, + # blocks that surround the event, triggering it when they yield. Callback code + # can be contained in instance methods, procs or lambdas, or callback objects + # that respond to certain predetermined methods. See +ClassMethods.set_callback+ + # for details. + # + # class Record + # include ActiveSupport::Callbacks + # define_callbacks :save + # + # def save + # run_callbacks :save do + # puts "- save" + # end + # end + # end + # + # class PersonRecord < Record + # set_callback :save, :before, :saving_message + # def saving_message + # puts "saving..." + # end + # + # set_callback :save, :after do |object| + # puts "saved" + # end + # end + # + # person = PersonRecord.new + # person.save + # + # Output: + # saving... + # - save + # saved + module Callbacks + extend Concern + + included do + extend ActiveSupport::DescendantsTracker + class_attribute :__callbacks, instance_writer: false, default: {} + end + + CALLBACK_FILTER_TYPES = [:before, :after, :around] + + # Runs the callbacks for the given event. + # + # Calls the before and around callbacks in the order they were set, yields + # the block (if given one), and then runs the after callbacks in reverse + # order. + # + # If the callback chain was halted, returns +false+. Otherwise returns the + # result of the block, +nil+ if no callbacks have been set, or +true+ + # if callbacks have been set but no block is given. + # + # run_callbacks :save do + # save + # end + # + #-- + # + # As this method is used in many places, and often wraps large portions of + # user code, it has an additional design goal of minimizing its impact on + # the visible call stack. An exception from inside a :before or :after + # callback can be as noisy as it likes -- but when control has passed + # smoothly through and into the supplied block, we want as little evidence + # as possible that we were here. + def run_callbacks(kind) + callbacks = __callbacks[kind.to_sym] + + if callbacks.empty? + yield if block_given? + else + env = Filters::Environment.new(self, false, nil) + next_sequence = callbacks.compile + + invoke_sequence = Proc.new do + skipped = nil + while true + current = next_sequence + current.invoke_before(env) + if current.final? + env.value = !env.halted && (!block_given? || yield) + elsif current.skip?(env) + (skipped ||= []) << current + next_sequence = next_sequence.nested + next + else + next_sequence = next_sequence.nested + begin + target, block, method, *arguments = current.expand_call_template(env, invoke_sequence) + target.send(method, *arguments, &block) + ensure + next_sequence = current + end + end + current.invoke_after(env) + skipped.pop.invoke_after(env) while skipped && skipped.first + break env.value + end + end + + # Common case: no 'around' callbacks defined + if next_sequence.final? + next_sequence.invoke_before(env) + env.value = !env.halted && (!block_given? || yield) + next_sequence.invoke_after(env) + env.value + else + invoke_sequence.call + end + end + end + + private + # A hook invoked every time a before callback is halted. + # This can be overridden in ActiveSupport::Callbacks implementors in order + # to provide better debugging/logging. + def halted_callback_hook(filter) + end + + module Conditionals # :nodoc: + class Value + def initialize(&block) + @block = block + end + def call(target, value); @block.call(value); end + end + end + + module Filters + Environment = Struct.new(:target, :halted, :value) + + class Before + def self.build(callback_sequence, user_callback, user_conditions, chain_config, filter) + halted_lambda = chain_config[:terminator] + + if user_conditions.any? + halting_and_conditional(callback_sequence, user_callback, user_conditions, halted_lambda, filter) + else + halting(callback_sequence, user_callback, halted_lambda, filter) + end + end + + def self.halting_and_conditional(callback_sequence, user_callback, user_conditions, halted_lambda, filter) + callback_sequence.before do |env| + target = env.target + value = env.value + halted = env.halted + + if !halted && user_conditions.all? { |c| c.call(target, value) } + result_lambda = -> { user_callback.call target, value } + env.halted = halted_lambda.call(target, result_lambda) + if env.halted + target.send :halted_callback_hook, filter + end + end + + env + end + end + private_class_method :halting_and_conditional + + def self.halting(callback_sequence, user_callback, halted_lambda, filter) + callback_sequence.before do |env| + target = env.target + value = env.value + halted = env.halted + + unless halted + result_lambda = -> { user_callback.call target, value } + env.halted = halted_lambda.call(target, result_lambda) + + if env.halted + target.send :halted_callback_hook, filter + end + end + + env + end + end + private_class_method :halting + end + + class After + def self.build(callback_sequence, user_callback, user_conditions, chain_config) + if chain_config[:skip_after_callbacks_if_terminated] + if user_conditions.any? + halting_and_conditional(callback_sequence, user_callback, user_conditions) + else + halting(callback_sequence, user_callback) + end + else + if user_conditions.any? + conditional callback_sequence, user_callback, user_conditions + else + simple callback_sequence, user_callback + end + end + end + + def self.halting_and_conditional(callback_sequence, user_callback, user_conditions) + callback_sequence.after do |env| + target = env.target + value = env.value + halted = env.halted + + if !halted && user_conditions.all? { |c| c.call(target, value) } + user_callback.call target, value + end + + env + end + end + private_class_method :halting_and_conditional + + def self.halting(callback_sequence, user_callback) + callback_sequence.after do |env| + unless env.halted + user_callback.call env.target, env.value + end + + env + end + end + private_class_method :halting + + def self.conditional(callback_sequence, user_callback, user_conditions) + callback_sequence.after do |env| + target = env.target + value = env.value + + if user_conditions.all? { |c| c.call(target, value) } + user_callback.call target, value + end + + env + end + end + private_class_method :conditional + + def self.simple(callback_sequence, user_callback) + callback_sequence.after do |env| + user_callback.call env.target, env.value + + env + end + end + private_class_method :simple + end + end + + class Callback #:nodoc:# + def self.build(chain, filter, kind, options) + if filter.is_a?(String) + raise ArgumentError, <<-MSG.squish + Passing string to define a callback is not supported. See the `.set_callback` + documentation to see supported values. + MSG + end + + new chain.name, filter, kind, options, chain.config + end + + attr_accessor :kind, :name + attr_reader :chain_config + + def initialize(name, filter, kind, options, chain_config) + @chain_config = chain_config + @name = name + @kind = kind + @filter = filter + @key = compute_identifier filter + @if = check_conditionals(Array(options[:if])) + @unless = check_conditionals(Array(options[:unless])) + end + + def filter; @key; end + def raw_filter; @filter; end + + def merge_conditional_options(chain, if_option:, unless_option:) + options = { + if: @if.dup, + unless: @unless.dup + } + + options[:if].concat Array(unless_option) + options[:unless].concat Array(if_option) + + self.class.build chain, @filter, @kind, options + end + + def matches?(_kind, _filter) + @kind == _kind && filter == _filter + end + + def duplicates?(other) + case @filter + when Symbol + matches?(other.kind, other.filter) + else + false + end + end + + # Wraps code with filter + def apply(callback_sequence) + user_conditions = conditions_lambdas + user_callback = CallTemplate.build(@filter, self) + + case kind + when :before + Filters::Before.build(callback_sequence, user_callback.make_lambda, user_conditions, chain_config, @filter) + when :after + Filters::After.build(callback_sequence, user_callback.make_lambda, user_conditions, chain_config) + when :around + callback_sequence.around(user_callback, user_conditions) + end + end + + def current_scopes + Array(chain_config[:scope]).map { |s| public_send(s) } + end + + private + def check_conditionals(conditionals) + if conditionals.any? { |c| c.is_a?(String) } + raise ArgumentError, <<-MSG.squish + Passing string to be evaluated in :if and :unless conditional + options is not supported. Pass a symbol for an instance method, + or a lambda, proc or block, instead. + MSG + end + + conditionals + end + + def compute_identifier(filter) + case filter + when ::Proc + filter.object_id + else + filter + end + end + + def conditions_lambdas + @if.map { |c| CallTemplate.build(c, self).make_lambda } + + @unless.map { |c| CallTemplate.build(c, self).inverted_lambda } + end + end + + # A future invocation of user-supplied code (either as a callback, + # or a condition filter). + class CallTemplate # :nodoc: + def initialize(target, method, arguments, block) + @override_target = target + @method_name = method + @arguments = arguments + @override_block = block + end + + # Return the parts needed to make this call, with the given + # input values. + # + # Returns an array of the form: + # + # [target, block, method, *arguments] + # + # This array can be used as such: + # + # target.send(method, *arguments, &block) + # + # The actual invocation is left up to the caller to minimize + # call stack pollution. + def expand(target, value, block) + result = @arguments.map { |arg| + case arg + when :value; value + when :target; target + when :block; block || raise(ArgumentError) + end + } + + result.unshift @method_name + result.unshift @override_block || block + result.unshift @override_target || target + + # target, block, method, *arguments = result + # target.send(method, *arguments, &block) + result + end + + # Return a lambda that will make this call when given the input + # values. + def make_lambda + lambda do |target, value, &block| + target, block, method, *arguments = expand(target, value, block) + target.send(method, *arguments, &block) + end + end + + # Return a lambda that will make this call when given the input + # values, but then return the boolean inverse of that result. + def inverted_lambda + lambda do |target, value, &block| + target, block, method, *arguments = expand(target, value, block) + ! target.send(method, *arguments, &block) + end + end + + # Filters support: + # + # Symbols:: A method to call. + # Procs:: A proc to call with the object. + # Objects:: An object with a before_foo method on it to call. + # + # All of these objects are converted into a CallTemplate and handled + # the same after this point. + def self.build(filter, callback) + case filter + when Symbol + new(nil, filter, [], nil) + when Conditionals::Value + new(filter, :call, [:target, :value], nil) + when ::Proc + if filter.arity > 1 + new(nil, :instance_exec, [:target, :block], filter) + elsif filter.arity > 0 + new(nil, :instance_exec, [:target], filter) + else + new(nil, :instance_exec, [], filter) + end + else + method_to_call = callback.current_scopes.join("_") + + new(filter, method_to_call, [:target], nil) + end + end + end + + # Execute before and after filters in a sequence instead of + # chaining them with nested lambda calls, see: + # https://github.com/rails/rails/issues/18011 + class CallbackSequence # :nodoc: + def initialize(nested = nil, call_template = nil, user_conditions = nil) + @nested = nested + @call_template = call_template + @user_conditions = user_conditions + + @before = [] + @after = [] + end + + def before(&before) + @before.unshift(before) + self + end + + def after(&after) + @after.push(after) + self + end + + def around(call_template, user_conditions) + CallbackSequence.new(self, call_template, user_conditions) + end + + def skip?(arg) + arg.halted || !@user_conditions.all? { |c| c.call(arg.target, arg.value) } + end + + attr_reader :nested + + def final? + !@call_template + end + + def expand_call_template(arg, block) + @call_template.expand(arg.target, arg.value, block) + end + + def invoke_before(arg) + @before.each { |b| b.call(arg) } + end + + def invoke_after(arg) + @after.each { |a| a.call(arg) } + end + end + + class CallbackChain #:nodoc:# + include Enumerable + + attr_reader :name, :config + + def initialize(name, config) + @name = name + @config = { + scope: [:kind], + terminator: default_terminator + }.merge!(config) + @chain = [] + @callbacks = nil + @mutex = Mutex.new + end + + def each(&block); @chain.each(&block); end + def index(o); @chain.index(o); end + def empty?; @chain.empty?; end + + def insert(index, o) + @callbacks = nil + @chain.insert(index, o) + end + + def delete(o) + @callbacks = nil + @chain.delete(o) + end + + def clear + @callbacks = nil + @chain.clear + self + end + + def initialize_copy(other) + @callbacks = nil + @chain = other.chain.dup + @mutex = Mutex.new + end + + def compile + @callbacks || @mutex.synchronize do + final_sequence = CallbackSequence.new + @callbacks ||= @chain.reverse.inject(final_sequence) do |callback_sequence, callback| + callback.apply callback_sequence + end + end + end + + def append(*callbacks) + callbacks.each { |c| append_one(c) } + end + + def prepend(*callbacks) + callbacks.each { |c| prepend_one(c) } + end + + protected + attr_reader :chain + + private + def append_one(callback) + @callbacks = nil + remove_duplicates(callback) + @chain.push(callback) + end + + def prepend_one(callback) + @callbacks = nil + remove_duplicates(callback) + @chain.unshift(callback) + end + + def remove_duplicates(callback) + @callbacks = nil + @chain.delete_if { |c| callback.duplicates?(c) } + end + + def default_terminator + Proc.new do |target, result_lambda| + terminate = true + catch(:abort) do + result_lambda.call + terminate = false + end + terminate + end + end + end + + module ClassMethods + def normalize_callback_params(filters, block) # :nodoc: + type = CALLBACK_FILTER_TYPES.include?(filters.first) ? filters.shift : :before + options = filters.extract_options! + filters.unshift(block) if block + [type, filters, options.dup] + end + + # This is used internally to append, prepend and skip callbacks to the + # CallbackChain. + def __update_callbacks(name) #:nodoc: + ([self] + ActiveSupport::DescendantsTracker.descendants(self)).reverse_each do |target| + chain = target.get_callbacks name + yield target, chain.dup + end + end + + # Install a callback for the given event. + # + # set_callback :save, :before, :before_method + # set_callback :save, :after, :after_method, if: :condition + # set_callback :save, :around, ->(r, block) { stuff; result = block.call; stuff } + # + # The second argument indicates whether the callback is to be run +:before+, + # +:after+, or +:around+ the event. If omitted, +:before+ is assumed. This + # means the first example above can also be written as: + # + # set_callback :save, :before_method + # + # The callback can be specified as a symbol naming an instance method; as a + # proc, lambda, or block; or as an object that responds to a certain method + # determined by the :scope argument to +define_callbacks+. + # + # If a proc, lambda, or block is given, its body is evaluated in the context + # of the current object. It can also optionally accept the current object as + # an argument. + # + # Before and around callbacks are called in the order that they are set; + # after callbacks are called in the reverse order. + # + # Around callbacks can access the return value from the event, if it + # wasn't halted, from the +yield+ call. + # + # ===== Options + # + # * :if - A symbol or an array of symbols, each naming an instance + # method or a proc; the callback will be called only when they all return + # a true value. + # + # If a proc is given, its body is evaluated in the context of the + # current object. It can also optionally accept the current object as + # an argument. + # * :unless - A symbol or an array of symbols, each naming an + # instance method or a proc; the callback will be called only when they + # all return a false value. + # + # If a proc is given, its body is evaluated in the context of the + # current object. It can also optionally accept the current object as + # an argument. + # * :prepend - If +true+, the callback will be prepended to the + # existing chain rather than appended. + def set_callback(name, *filter_list, &block) + type, filters, options = normalize_callback_params(filter_list, block) + + self_chain = get_callbacks name + mapped = filters.map do |filter| + Callback.build(self_chain, filter, type, options) + end + + __update_callbacks(name) do |target, chain| + options[:prepend] ? chain.prepend(*mapped) : chain.append(*mapped) + target.set_callbacks name, chain + end + end + + # Skip a previously set callback. Like +set_callback+, :if or + # :unless options may be passed in order to control when the + # callback is skipped. + # + # class Writer < Person + # skip_callback :validate, :before, :check_membership, if: -> { age > 18 } + # end + # + # An ArgumentError will be raised if the callback has not + # already been set (unless the :raise option is set to false). + def skip_callback(name, *filter_list, &block) + type, filters, options = normalize_callback_params(filter_list, block) + + options[:raise] = true unless options.key?(:raise) + + __update_callbacks(name) do |target, chain| + filters.each do |filter| + callback = chain.find { |c| c.matches?(type, filter) } + + if !callback && options[:raise] + raise ArgumentError, "#{type.to_s.capitalize} #{name} callback #{filter.inspect} has not been defined" + end + + if callback && (options.key?(:if) || options.key?(:unless)) + new_callback = callback.merge_conditional_options(chain, if_option: options[:if], unless_option: options[:unless]) + chain.insert(chain.index(callback), new_callback) + end + + chain.delete(callback) + end + target.set_callbacks name, chain + end + end + + # Remove all set callbacks for the given event. + def reset_callbacks(name) + callbacks = get_callbacks name + + ActiveSupport::DescendantsTracker.descendants(self).each do |target| + chain = target.get_callbacks(name).dup + callbacks.each { |c| chain.delete(c) } + target.set_callbacks name, chain + end + + set_callbacks(name, callbacks.dup.clear) + end + + # Define sets of events in the object life cycle that support callbacks. + # + # define_callbacks :validate + # define_callbacks :initialize, :save, :destroy + # + # ===== Options + # + # * :terminator - Determines when a before filter will halt the + # callback chain, preventing following before and around callbacks from + # being called and the event from being triggered. + # This should be a lambda to be executed. + # The current object and the result lambda of the callback will be provided + # to the terminator lambda. + # + # define_callbacks :validate, terminator: ->(target, result_lambda) { result_lambda.call == false } + # + # In this example, if any before validate callbacks returns +false+, + # any successive before and around callback is not executed. + # + # The default terminator halts the chain when a callback throws +:abort+. + # + # * :skip_after_callbacks_if_terminated - Determines if after + # callbacks should be terminated by the :terminator option. By + # default after callbacks are executed no matter if callback chain was + # terminated or not. This option has no effect if :terminator + # option is set to +nil+. + # + # * :scope - Indicates which methods should be executed when an + # object is used as a callback. + # + # class Audit + # def before(caller) + # puts 'Audit: before is called' + # end + # + # def before_save(caller) + # puts 'Audit: before_save is called' + # end + # end + # + # class Account + # include ActiveSupport::Callbacks + # + # define_callbacks :save + # set_callback :save, :before, Audit.new + # + # def save + # run_callbacks :save do + # puts 'save in main' + # end + # end + # end + # + # In the above case whenever you save an account the method + # Audit#before will be called. On the other hand + # + # define_callbacks :save, scope: [:kind, :name] + # + # would trigger Audit#before_save instead. That's constructed + # by calling #{kind}_#{name} on the given instance. In this + # case "kind" is "before" and "name" is "save". In this context +:kind+ + # and +:name+ have special meanings: +:kind+ refers to the kind of + # callback (before/after/around) and +:name+ refers to the method on + # which callbacks are being defined. + # + # A declaration like + # + # define_callbacks :save, scope: [:name] + # + # would call Audit#save. + # + # ===== Notes + # + # +names+ passed to +define_callbacks+ must not end with + # !, ? or =. + # + # Calling +define_callbacks+ multiple times with the same +names+ will + # overwrite previous callbacks registered with +set_callback+. + def define_callbacks(*names) + options = names.extract_options! + + names.each do |name| + name = name.to_sym + + ([self] + ActiveSupport::DescendantsTracker.descendants(self)).each do |target| + target.set_callbacks name, CallbackChain.new(name, options) + end + + module_eval <<-RUBY, __FILE__, __LINE__ + 1 + def _run_#{name}_callbacks(&block) + run_callbacks #{name.inspect}, &block + end + + def self._#{name}_callbacks + get_callbacks(#{name.inspect}) + end + + def self._#{name}_callbacks=(value) + set_callbacks(#{name.inspect}, value) + end + + def _#{name}_callbacks + __callbacks[#{name.inspect}] + end + RUBY + end + end + + protected + def get_callbacks(name) # :nodoc: + __callbacks[name.to_sym] + end + + def set_callbacks(name, callbacks) # :nodoc: + self.__callbacks = __callbacks.merge(name.to_sym => callbacks) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/concern.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/concern.rb new file mode 100644 index 000000000000..708c44503178 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/concern.rb @@ -0,0 +1,171 @@ +# frozen_string_literal: true + +module ActiveSupport + # A typical module looks like this: + # + # module M + # def self.included(base) + # base.extend ClassMethods + # base.class_eval do + # scope :disabled, -> { where(disabled: true) } + # end + # end + # + # module ClassMethods + # ... + # end + # end + # + # By using ActiveSupport::Concern the above module could instead be + # written as: + # + # require 'active_support/concern' + # + # module M + # extend ActiveSupport::Concern + # + # included do + # scope :disabled, -> { where(disabled: true) } + # end + # + # class_methods do + # ... + # end + # end + # + # Moreover, it gracefully handles module dependencies. Given a +Foo+ module + # and a +Bar+ module which depends on the former, we would typically write the + # following: + # + # module Foo + # def self.included(base) + # base.class_eval do + # def self.method_injected_by_foo + # ... + # end + # end + # end + # end + # + # module Bar + # def self.included(base) + # base.method_injected_by_foo + # end + # end + # + # class Host + # include Foo # We need to include this dependency for Bar + # include Bar # Bar is the module that Host really needs + # end + # + # But why should +Host+ care about +Bar+'s dependencies, namely +Foo+? We + # could try to hide these from +Host+ directly including +Foo+ in +Bar+: + # + # module Bar + # include Foo + # def self.included(base) + # base.method_injected_by_foo + # end + # end + # + # class Host + # include Bar + # end + # + # Unfortunately this won't work, since when +Foo+ is included, its base + # is the +Bar+ module, not the +Host+ class. With ActiveSupport::Concern, + # module dependencies are properly resolved: + # + # require 'active_support/concern' + # + # module Foo + # extend ActiveSupport::Concern + # included do + # def self.method_injected_by_foo + # ... + # end + # end + # end + # + # module Bar + # extend ActiveSupport::Concern + # include Foo + # + # included do + # self.method_injected_by_foo + # end + # end + # + # class Host + # include Bar # It works, now Bar takes care of its dependencies + # end + module Concern + class MultipleIncludedBlocks < StandardError #:nodoc: + def initialize + super "Cannot define multiple 'included' blocks for a Concern" + end + end + + def self.extended(base) #:nodoc: + base.instance_variable_set(:@_dependencies, []) + end + + def append_features(base) #:nodoc: + if base.instance_variable_defined?(:@_dependencies) + base.instance_variable_get(:@_dependencies) << self + false + else + return false if base < self + @_dependencies.each { |dep| base.include(dep) } + super + base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) + base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) + end + end + + # Evaluate given block in context of base class, + # so that you can write class macros here. + # When you define more than one +included+ block, it raises an exception. + def included(base = nil, &block) + if base.nil? + if instance_variable_defined?(:@_included_block) + if @_included_block.source_location != block.source_location + raise MultipleIncludedBlocks + end + else + @_included_block = block + end + else + super + end + end + + # Define class methods from given block. + # You can define private class methods as well. + # + # module Example + # extend ActiveSupport::Concern + # + # class_methods do + # def foo; puts 'foo'; end + # + # private + # def bar; puts 'bar'; end + # end + # end + # + # class Buzz + # include Example + # end + # + # Buzz.foo # => "foo" + # Buzz.bar # => private method 'bar' called for Buzz:Class(NoMethodError) + def class_methods(&class_methods_module_definition) + mod = const_defined?(:ClassMethods, false) ? + const_get(:ClassMethods) : + const_set(:ClassMethods, Module.new) + + mod.module_eval(&class_methods_module_definition) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/concurrency/load_interlock_aware_monitor.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/concurrency/load_interlock_aware_monitor.rb new file mode 100644 index 000000000000..480c34c64017 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/concurrency/load_interlock_aware_monitor.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require "monitor" + +module ActiveSupport + module Concurrency + # A monitor that will permit dependency loading while blocked waiting for + # the lock. + class LoadInterlockAwareMonitor < Monitor + EXCEPTION_NEVER = { Exception => :never }.freeze + EXCEPTION_IMMEDIATE = { Exception => :immediate }.freeze + private_constant :EXCEPTION_NEVER, :EXCEPTION_IMMEDIATE + + # Enters an exclusive section, but allows dependency loading while blocked + def mon_enter + mon_try_enter || + ActiveSupport::Dependencies.interlock.permit_concurrent_loads { super } + end + + def synchronize + Thread.handle_interrupt(EXCEPTION_NEVER) do + mon_enter + + begin + Thread.handle_interrupt(EXCEPTION_IMMEDIATE) do + yield + end + ensure + mon_exit + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/concurrency/share_lock.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/concurrency/share_lock.rb new file mode 100644 index 000000000000..eae7d4469fd2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/concurrency/share_lock.rb @@ -0,0 +1,226 @@ +# frozen_string_literal: true + +require "thread" +require "monitor" + +module ActiveSupport + module Concurrency + # A share/exclusive lock, otherwise known as a read/write lock. + # + # https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock + class ShareLock + include MonitorMixin + + # We track Thread objects, instead of just using counters, because + # we need exclusive locks to be reentrant, and we need to be able + # to upgrade share locks to exclusive. + + def raw_state # :nodoc: + synchronize do + threads = @sleeping.keys | @sharing.keys | @waiting.keys + threads |= [@exclusive_thread] if @exclusive_thread + + data = {} + + threads.each do |thread| + purpose, compatible = @waiting[thread] + + data[thread] = { + thread: thread, + sharing: @sharing[thread], + exclusive: @exclusive_thread == thread, + purpose: purpose, + compatible: compatible, + waiting: !!@waiting[thread], + sleeper: @sleeping[thread], + } + end + + # NB: Yields while holding our *internal* synchronize lock, + # which is supposed to be used only for a few instructions at + # a time. This allows the caller to inspect additional state + # without things changing out from underneath, but would have + # disastrous effects upon normal operation. Fortunately, this + # method is only intended to be called when things have + # already gone wrong. + yield data + end + end + + def initialize + super() + + @cv = new_cond + + @sharing = Hash.new(0) + @waiting = {} + @sleeping = {} + @exclusive_thread = nil + @exclusive_depth = 0 + end + + # Returns false if +no_wait+ is set and the lock is not + # immediately available. Otherwise, returns true after the lock + # has been acquired. + # + # +purpose+ and +compatible+ work together; while this thread is + # waiting for the exclusive lock, it will yield its share (if any) + # to any other attempt whose +purpose+ appears in this attempt's + # +compatible+ list. This allows a "loose" upgrade, which, being + # less strict, prevents some classes of deadlocks. + # + # For many resources, loose upgrades are sufficient: if a thread + # is awaiting a lock, it is not running any other code. With + # +purpose+ matching, it is possible to yield only to other + # threads whose activity will not interfere. + def start_exclusive(purpose: nil, compatible: [], no_wait: false) + synchronize do + unless @exclusive_thread == Thread.current + if busy_for_exclusive?(purpose) + return false if no_wait + + yield_shares(purpose: purpose, compatible: compatible, block_share: true) do + wait_for(:start_exclusive) { busy_for_exclusive?(purpose) } + end + end + @exclusive_thread = Thread.current + end + @exclusive_depth += 1 + + true + end + end + + # Relinquish the exclusive lock. Must only be called by the thread + # that called start_exclusive (and currently holds the lock). + def stop_exclusive(compatible: []) + synchronize do + raise "invalid unlock" if @exclusive_thread != Thread.current + + @exclusive_depth -= 1 + if @exclusive_depth == 0 + @exclusive_thread = nil + + if eligible_waiters?(compatible) + yield_shares(compatible: compatible, block_share: true) do + wait_for(:stop_exclusive) { @exclusive_thread || eligible_waiters?(compatible) } + end + end + @cv.broadcast + end + end + end + + def start_sharing + synchronize do + if @sharing[Thread.current] > 0 || @exclusive_thread == Thread.current + # We already hold a lock; nothing to wait for + elsif @waiting[Thread.current] + # We're nested inside a +yield_shares+ call: we'll resume as + # soon as there isn't an exclusive lock in our way + wait_for(:start_sharing) { @exclusive_thread } + else + # This is an initial / outermost share call: any outstanding + # requests for an exclusive lock get to go first + wait_for(:start_sharing) { busy_for_sharing?(false) } + end + @sharing[Thread.current] += 1 + end + end + + def stop_sharing + synchronize do + if @sharing[Thread.current] > 1 + @sharing[Thread.current] -= 1 + else + @sharing.delete Thread.current + @cv.broadcast + end + end + end + + # Execute the supplied block while holding the Exclusive lock. If + # +no_wait+ is set and the lock is not immediately available, + # returns +nil+ without yielding. Otherwise, returns the result of + # the block. + # + # See +start_exclusive+ for other options. + def exclusive(purpose: nil, compatible: [], after_compatible: [], no_wait: false) + if start_exclusive(purpose: purpose, compatible: compatible, no_wait: no_wait) + begin + yield + ensure + stop_exclusive(compatible: after_compatible) + end + end + end + + # Execute the supplied block while holding the Share lock. + def sharing + start_sharing + begin + yield + ensure + stop_sharing + end + end + + # Temporarily give up all held Share locks while executing the + # supplied block, allowing any +compatible+ exclusive lock request + # to proceed. + def yield_shares(purpose: nil, compatible: [], block_share: false) + loose_shares = previous_wait = nil + synchronize do + if loose_shares = @sharing.delete(Thread.current) + if previous_wait = @waiting[Thread.current] + purpose = nil unless purpose == previous_wait[0] + compatible &= previous_wait[1] + end + compatible |= [false] unless block_share + @waiting[Thread.current] = [purpose, compatible] + end + + @cv.broadcast + end + + begin + yield + ensure + synchronize do + wait_for(:yield_shares) { @exclusive_thread && @exclusive_thread != Thread.current } + + if previous_wait + @waiting[Thread.current] = previous_wait + else + @waiting.delete Thread.current + end + @sharing[Thread.current] = loose_shares if loose_shares + end + end + end + + private + # Must be called within synchronize + def busy_for_exclusive?(purpose) + busy_for_sharing?(purpose) || + @sharing.size > (@sharing[Thread.current] > 0 ? 1 : 0) + end + + def busy_for_sharing?(purpose) + (@exclusive_thread && @exclusive_thread != Thread.current) || + @waiting.any? { |t, (_, c)| t != Thread.current && !c.include?(purpose) } + end + + def eligible_waiters?(compatible) + @waiting.any? { |t, (p, _)| compatible.include?(p) && @waiting.all? { |t2, (_, c2)| t == t2 || c2.include?(p) } } + end + + def wait_for(method) + @sleeping[Thread.current] = method + @cv.wait_while { yield } + ensure + @sleeping.delete Thread.current + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/configurable.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/configurable.rb new file mode 100644 index 000000000000..71c23dae9bf5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/configurable.rb @@ -0,0 +1,146 @@ +# frozen_string_literal: true + +require "active_support/concern" +require "active_support/ordered_options" + +module ActiveSupport + # Configurable provides a config method to store and retrieve + # configuration options as an OrderedHash. + module Configurable + extend ActiveSupport::Concern + + class Configuration < ActiveSupport::InheritableOptions + def compile_methods! + self.class.compile_methods!(keys) + end + + # Compiles reader methods so we don't have to go through method_missing. + def self.compile_methods!(keys) + keys.reject { |m| method_defined?(m) }.each do |key| + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{key}; _get(#{key.inspect}); end + RUBY + end + end + end + + module ClassMethods + def config + @_config ||= if respond_to?(:superclass) && superclass.respond_to?(:config) + superclass.config.inheritable_copy + else + # create a new "anonymous" class that will host the compiled reader methods + Class.new(Configuration).new + end + end + + def configure + yield config + end + + # Allows you to add shortcut so that you don't have to refer to attribute + # through config. Also look at the example for config to contrast. + # + # Defines both class and instance config accessors. + # + # class User + # include ActiveSupport::Configurable + # config_accessor :allowed_access + # end + # + # User.allowed_access # => nil + # User.allowed_access = false + # User.allowed_access # => false + # + # user = User.new + # user.allowed_access # => false + # user.allowed_access = true + # user.allowed_access # => true + # + # User.allowed_access # => false + # + # The attribute name must be a valid method name in Ruby. + # + # class User + # include ActiveSupport::Configurable + # config_accessor :"1_Badname" + # end + # # => NameError: invalid config attribute name + # + # To omit the instance writer method, pass instance_writer: false. + # To omit the instance reader method, pass instance_reader: false. + # + # class User + # include ActiveSupport::Configurable + # config_accessor :allowed_access, instance_reader: false, instance_writer: false + # end + # + # User.allowed_access = false + # User.allowed_access # => false + # + # User.new.allowed_access = true # => NoMethodError + # User.new.allowed_access # => NoMethodError + # + # Or pass instance_accessor: false, to omit both instance methods. + # + # class User + # include ActiveSupport::Configurable + # config_accessor :allowed_access, instance_accessor: false + # end + # + # User.allowed_access = false + # User.allowed_access # => false + # + # User.new.allowed_access = true # => NoMethodError + # User.new.allowed_access # => NoMethodError + # + # Also you can pass a block to set up the attribute with a default value. + # + # class User + # include ActiveSupport::Configurable + # config_accessor :hair_colors do + # [:brown, :black, :blonde, :red] + # end + # end + # + # User.hair_colors # => [:brown, :black, :blonde, :red] + def config_accessor(*names, instance_reader: true, instance_writer: true, instance_accessor: true) # :doc: + names.each do |name| + raise NameError.new("invalid config attribute name") unless /\A[_A-Za-z]\w*\z/.match?(name) + + reader, reader_line = "def #{name}; config.#{name}; end", __LINE__ + writer, writer_line = "def #{name}=(value); config.#{name} = value; end", __LINE__ + + singleton_class.class_eval reader, __FILE__, reader_line + singleton_class.class_eval writer, __FILE__, writer_line + + if instance_accessor + class_eval reader, __FILE__, reader_line if instance_reader + class_eval writer, __FILE__, writer_line if instance_writer + end + send("#{name}=", yield) if block_given? + end + end + private :config_accessor + end + + # Reads and writes attributes from a configuration OrderedHash. + # + # require 'active_support/configurable' + # + # class User + # include ActiveSupport::Configurable + # end + # + # user = User.new + # + # user.config.allowed_access = true + # user.config.level = 1 + # + # user.config.allowed_access # => true + # user.config.level # => 1 + def config + @_config ||= self.class.config.inheritable_copy + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext.rb new file mode 100644 index 000000000000..f590605d848c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +Dir.glob(File.expand_path("core_ext/*.rb", __dir__)).each do |path| + require path +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array.rb new file mode 100644 index 000000000000..88b656771237 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require "active_support/core_ext/array/wrap" +require "active_support/core_ext/array/access" +require "active_support/core_ext/array/conversions" +require "active_support/core_ext/array/extract" +require "active_support/core_ext/array/extract_options" +require "active_support/core_ext/array/grouping" +require "active_support/core_ext/array/inquiry" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/access.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/access.rb new file mode 100644 index 000000000000..ea01e5891c39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/access.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +class Array + # Returns the tail of the array from +position+. + # + # %w( a b c d ).from(0) # => ["a", "b", "c", "d"] + # %w( a b c d ).from(2) # => ["c", "d"] + # %w( a b c d ).from(10) # => [] + # %w().from(0) # => [] + # %w( a b c d ).from(-2) # => ["c", "d"] + # %w( a b c ).from(-10) # => [] + def from(position) + self[position, length] || [] + end + + # Returns the beginning of the array up to +position+. + # + # %w( a b c d ).to(0) # => ["a"] + # %w( a b c d ).to(2) # => ["a", "b", "c"] + # %w( a b c d ).to(10) # => ["a", "b", "c", "d"] + # %w().to(0) # => [] + # %w( a b c d ).to(-2) # => ["a", "b", "c"] + # %w( a b c ).to(-10) # => [] + def to(position) + if position >= 0 + take position + 1 + else + self[0..position] + end + end + + # Returns a new array that includes the passed elements. + # + # [ 1, 2, 3 ].including(4, 5) # => [ 1, 2, 3, 4, 5 ] + # [ [ 0, 1 ] ].including([ [ 1, 0 ] ]) # => [ [ 0, 1 ], [ 1, 0 ] ] + def including(*elements) + self + elements.flatten(1) + end + + # Returns a copy of the Array excluding the specified elements. + # + # ["David", "Rafael", "Aaron", "Todd"].excluding("Aaron", "Todd") # => ["David", "Rafael"] + # [ [ 0, 1 ], [ 1, 0 ] ].excluding([ [ 1, 0 ] ]) # => [ [ 0, 1 ] ] + # + # Note: This is an optimization of Enumerable#excluding that uses Array#- + # instead of Array#reject for performance reasons. + def excluding(*elements) + self - elements.flatten(1) + end + + # Alias for #excluding. + def without(*elements) + excluding(*elements) + end + + # Equal to self[1]. + # + # %w( a b c d e ).second # => "b" + def second + self[1] + end + + # Equal to self[2]. + # + # %w( a b c d e ).third # => "c" + def third + self[2] + end + + # Equal to self[3]. + # + # %w( a b c d e ).fourth # => "d" + def fourth + self[3] + end + + # Equal to self[4]. + # + # %w( a b c d e ).fifth # => "e" + def fifth + self[4] + end + + # Equal to self[41]. Also known as accessing "the reddit". + # + # (1..42).to_a.forty_two # => 42 + def forty_two + self[41] + end + + # Equal to self[-3]. + # + # %w( a b c d e ).third_to_last # => "c" + def third_to_last + self[-3] + end + + # Equal to self[-2]. + # + # %w( a b c d e ).second_to_last # => "d" + def second_to_last + self[-2] + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/conversions.rb new file mode 100644 index 000000000000..0780c4ed8aab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/conversions.rb @@ -0,0 +1,213 @@ +# frozen_string_literal: true + +require "active_support/xml_mini" +require "active_support/core_ext/hash/keys" +require "active_support/core_ext/string/inflections" +require "active_support/core_ext/object/to_param" +require "active_support/core_ext/object/to_query" + +class Array + # Converts the array to a comma-separated sentence where the last element is + # joined by the connector word. + # + # You can pass the following options to change the default behavior. If you + # pass an option key that doesn't exist in the list below, it will raise an + # ArgumentError. + # + # ==== Options + # + # * :words_connector - The sign or word used to join the elements + # in arrays with two or more elements (default: ", "). + # * :two_words_connector - The sign or word used to join the elements + # in arrays with two elements (default: " and "). + # * :last_word_connector - The sign or word used to join the last element + # in arrays with three or more elements (default: ", and "). + # * :locale - If +i18n+ is available, you can set a locale and use + # the connector options defined on the 'support.array' namespace in the + # corresponding dictionary file. + # + # ==== Examples + # + # [].to_sentence # => "" + # ['one'].to_sentence # => "one" + # ['one', 'two'].to_sentence # => "one and two" + # ['one', 'two', 'three'].to_sentence # => "one, two, and three" + # + # ['one', 'two'].to_sentence(passing: 'invalid option') + # # => ArgumentError: Unknown key: :passing. Valid keys are: :words_connector, :two_words_connector, :last_word_connector, :locale + # + # ['one', 'two'].to_sentence(two_words_connector: '-') + # # => "one-two" + # + # ['one', 'two', 'three'].to_sentence(words_connector: ' or ', last_word_connector: ' or at least ') + # # => "one or two or at least three" + # + # Using :locale option: + # + # # Given this locale dictionary: + # # + # # es: + # # support: + # # array: + # # words_connector: " o " + # # two_words_connector: " y " + # # last_word_connector: " o al menos " + # + # ['uno', 'dos'].to_sentence(locale: :es) + # # => "uno y dos" + # + # ['uno', 'dos', 'tres'].to_sentence(locale: :es) + # # => "uno o dos o al menos tres" + def to_sentence(options = {}) + options.assert_valid_keys(:words_connector, :two_words_connector, :last_word_connector, :locale) + + default_connectors = { + words_connector: ", ", + two_words_connector: " and ", + last_word_connector: ", and " + } + if defined?(I18n) + i18n_connectors = I18n.translate(:'support.array', locale: options[:locale], default: {}) + default_connectors.merge!(i18n_connectors) + end + options = default_connectors.merge!(options) + + case length + when 0 + +"" + when 1 + +"#{self[0]}" + when 2 + +"#{self[0]}#{options[:two_words_connector]}#{self[1]}" + else + +"#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}" + end + end + + # Extends Array#to_s to convert a collection of elements into a + # comma separated id list if :db argument is given as the format. + # + # Blog.all.to_formatted_s(:db) # => "1,2,3" + # Blog.none.to_formatted_s(:db) # => "null" + # [1,2].to_formatted_s # => "[1, 2]" + def to_formatted_s(format = :default) + case format + when :db + if empty? + "null" + else + collect(&:id).join(",") + end + else + to_default_s + end + end + alias_method :to_default_s, :to_s + alias_method :to_s, :to_formatted_s + + # Returns a string that represents the array in XML by invoking +to_xml+ + # on each element. Active Record collections delegate their representation + # in XML to this method. + # + # All elements are expected to respond to +to_xml+, if any of them does + # not then an exception is raised. + # + # The root node reflects the class name of the first element in plural + # if all elements belong to the same type and that's not Hash: + # + # customer.projects.to_xml + # + # + # + # + # 20000.0 + # 1567 + # 2008-04-09 + # ... + # + # + # 57230.0 + # 1567 + # 2008-04-15 + # ... + # + # + # + # Otherwise the root element is "objects": + # + # [{ foo: 1, bar: 2}, { baz: 3}].to_xml + # + # + # + # + # 2 + # 1 + # + # + # 3 + # + # + # + # If the collection is empty the root element is "nil-classes" by default: + # + # [].to_xml + # + # + # + # + # To ensure a meaningful root element use the :root option: + # + # customer_with_no_projects.projects.to_xml(root: 'projects') + # + # + # + # + # By default name of the node for the children of root is root.singularize. + # You can change it with the :children option. + # + # The +options+ hash is passed downwards: + # + # Message.all.to_xml(skip_types: true) + # + # + # + # + # 2008-03-07T09:58:18+01:00 + # 1 + # 1 + # 2008-03-07T09:58:18+01:00 + # 1 + # + # + # + def to_xml(options = {}) + require "active_support/builder" unless defined?(Builder::XmlMarkup) + + options = options.dup + options[:indent] ||= 2 + options[:builder] ||= Builder::XmlMarkup.new(indent: options[:indent]) + options[:root] ||= \ + if first.class != Hash && all? { |e| e.is_a?(first.class) } + underscored = ActiveSupport::Inflector.underscore(first.class.name) + ActiveSupport::Inflector.pluralize(underscored).tr("/", "_") + else + "objects" + end + + builder = options[:builder] + builder.instruct! unless options.delete(:skip_instruct) + + root = ActiveSupport::XmlMini.rename_key(options[:root].to_s, options) + children = options.delete(:children) || root.singularize + attributes = options[:skip_types] ? {} : { type: "array" } + + if empty? + builder.tag!(root, attributes) + else + builder.tag!(root, attributes) do + each { |value| ActiveSupport::XmlMini.to_tag(children, value, options) } + yield builder if block_given? + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/extract.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/extract.rb new file mode 100644 index 000000000000..cc5a8a3f88e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/extract.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class Array + # Removes and returns the elements for which the block returns a true value. + # If no block is given, an Enumerator is returned instead. + # + # numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + # odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9] + # numbers # => [0, 2, 4, 6, 8] + def extract! + return to_enum(:extract!) { size } unless block_given? + + extracted_elements = [] + + reject! do |element| + extracted_elements << element if yield(element) + end + + extracted_elements + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/extract_options.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/extract_options.rb new file mode 100644 index 000000000000..8c7cb2e78047 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/extract_options.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +class Hash + # By default, only instances of Hash itself are extractable. + # Subclasses of Hash may implement this method and return + # true to declare themselves as extractable. If a Hash + # is extractable, Array#extract_options! pops it from + # the Array when it is the last element of the Array. + def extractable_options? + instance_of?(Hash) + end +end + +class Array + # Extracts options from a set of arguments. Removes and returns the last + # element in the array if it's a hash, otherwise returns a blank hash. + # + # def options(*args) + # args.extract_options! + # end + # + # options(1, 2) # => {} + # options(1, 2, a: :b) # => {:a=>:b} + def extract_options! + if last.is_a?(Hash) && last.extractable_options? + pop + else + {} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/grouping.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/grouping.rb new file mode 100644 index 000000000000..67e760bc4b08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/grouping.rb @@ -0,0 +1,109 @@ +# frozen_string_literal: true + +class Array + # Splits or iterates over the array in groups of size +number+, + # padding any remaining slots with +fill_with+ unless it is +false+. + # + # %w(1 2 3 4 5 6 7 8 9 10).in_groups_of(3) {|group| p group} + # ["1", "2", "3"] + # ["4", "5", "6"] + # ["7", "8", "9"] + # ["10", nil, nil] + # + # %w(1 2 3 4 5).in_groups_of(2, ' ') {|group| p group} + # ["1", "2"] + # ["3", "4"] + # ["5", " "] + # + # %w(1 2 3 4 5).in_groups_of(2, false) {|group| p group} + # ["1", "2"] + # ["3", "4"] + # ["5"] + def in_groups_of(number, fill_with = nil) + if number.to_i <= 0 + raise ArgumentError, + "Group size must be a positive integer, was #{number.inspect}" + end + + if fill_with == false + collection = self + else + # size % number gives how many extra we have; + # subtracting from number gives how many to add; + # modulo number ensures we don't add group of just fill. + padding = (number - size % number) % number + collection = dup.concat(Array.new(padding, fill_with)) + end + + if block_given? + collection.each_slice(number) { |slice| yield(slice) } + else + collection.each_slice(number).to_a + end + end + + # Splits or iterates over the array in +number+ of groups, padding any + # remaining slots with +fill_with+ unless it is +false+. + # + # %w(1 2 3 4 5 6 7 8 9 10).in_groups(3) {|group| p group} + # ["1", "2", "3", "4"] + # ["5", "6", "7", nil] + # ["8", "9", "10", nil] + # + # %w(1 2 3 4 5 6 7 8 9 10).in_groups(3, ' ') {|group| p group} + # ["1", "2", "3", "4"] + # ["5", "6", "7", " "] + # ["8", "9", "10", " "] + # + # %w(1 2 3 4 5 6 7).in_groups(3, false) {|group| p group} + # ["1", "2", "3"] + # ["4", "5"] + # ["6", "7"] + def in_groups(number, fill_with = nil) + # size.div number gives minor group size; + # size % number gives how many objects need extra accommodation; + # each group hold either division or division + 1 items. + division = size.div number + modulo = size % number + + # create a new array avoiding dup + groups = [] + start = 0 + + number.times do |index| + length = division + (modulo > 0 && modulo > index ? 1 : 0) + groups << last_group = slice(start, length) + last_group << fill_with if fill_with != false && + modulo > 0 && length == division + start += length + end + + if block_given? + groups.each { |g| yield(g) } + else + groups + end + end + + # Divides the array into one or more subarrays based on a delimiting +value+ + # or the result of an optional block. + # + # [1, 2, 3, 4, 5].split(3) # => [[1, 2], [4, 5]] + # (1..10).to_a.split { |i| i % 3 == 0 } # => [[1, 2], [4, 5], [7, 8], [10]] + def split(value = nil) + arr = dup + result = [] + if block_given? + while (idx = arr.index { |i| yield i }) + result << arr.shift(idx) + arr.shift + end + else + while (idx = arr.index(value)) + result << arr.shift(idx) + arr.shift + end + end + result << arr + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/inquiry.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/inquiry.rb new file mode 100644 index 000000000000..92c61bf20191 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/inquiry.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require "active_support/array_inquirer" + +class Array + # Wraps the array in an +ArrayInquirer+ object, which gives a friendlier way + # to check its string-like contents. + # + # pets = [:cat, :dog].inquiry + # + # pets.cat? # => true + # pets.ferret? # => false + # + # pets.any?(:cat, :ferret) # => true + # pets.any?(:ferret, :alligator) # => false + def inquiry + ActiveSupport::ArrayInquirer.new(self) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/prepend_and_append.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/prepend_and_append.rb new file mode 100644 index 000000000000..ba3739f64072 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/prepend_and_append.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "active_support/deprecation" + +ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Array#append and Array#prepend natively, so requiring active_support/core_ext/array/prepend_and_append is no longer necessary. Requiring it will raise LoadError in Rails 6.1." diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/wrap.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/wrap.rb new file mode 100644 index 000000000000..d62f97edbf00 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/array/wrap.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +class Array + # Wraps its argument in an array unless it is already an array (or array-like). + # + # Specifically: + # + # * If the argument is +nil+ an empty array is returned. + # * Otherwise, if the argument responds to +to_ary+ it is invoked, and its result returned. + # * Otherwise, returns an array with the argument as its single element. + # + # Array.wrap(nil) # => [] + # Array.wrap([1, 2, 3]) # => [1, 2, 3] + # Array.wrap(0) # => [0] + # + # This method is similar in purpose to Kernel#Array, but there are some differences: + # + # * If the argument responds to +to_ary+ the method is invoked. Kernel#Array + # moves on to try +to_a+ if the returned value is +nil+, but Array.wrap returns + # an array with the argument as its single element right away. + # * If the returned value from +to_ary+ is neither +nil+ nor an +Array+ object, Kernel#Array + # raises an exception, while Array.wrap does not, it just returns the value. + # * It does not call +to_a+ on the argument, if the argument does not respond to +to_ary+ + # it returns an array with the argument as its single element. + # + # The last point is easily explained with some enumerables: + # + # Array(foo: :bar) # => [[:foo, :bar]] + # Array.wrap(foo: :bar) # => [{:foo=>:bar}] + # + # There's also a related idiom that uses the splat operator: + # + # [*object] + # + # which returns [] for +nil+, but calls to Array(object) otherwise. + # + # The differences with Kernel#Array explained above + # apply to the rest of objects. + def self.wrap(object) + if object.nil? + [] + elsif object.respond_to?(:to_ary) + object.to_ary || [object] + else + [object] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/benchmark.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/benchmark.rb new file mode 100644 index 000000000000..641b58c8b8c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/benchmark.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "benchmark" + +class << Benchmark + # Benchmark realtime in milliseconds. + # + # Benchmark.realtime { User.all } + # # => 8.0e-05 + # + # Benchmark.ms { User.all } + # # => 0.074 + def ms + 1000 * realtime { yield } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/big_decimal.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/big_decimal.rb new file mode 100644 index 000000000000..9e6a9d633169 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/big_decimal.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require "active_support/core_ext/big_decimal/conversions" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/big_decimal/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/big_decimal/conversions.rb new file mode 100644 index 000000000000..52bd2294166f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/big_decimal/conversions.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "bigdecimal" +require "bigdecimal/util" + +module ActiveSupport + module BigDecimalWithDefaultFormat #:nodoc: + def to_s(format = "F") + super(format) + end + end +end + +BigDecimal.prepend(ActiveSupport::BigDecimalWithDefaultFormat) diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class.rb new file mode 100644 index 000000000000..1c110fd07bd5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +require "active_support/core_ext/class/attribute" +require "active_support/core_ext/class/subclasses" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class/attribute.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class/attribute.rb new file mode 100644 index 000000000000..255cbee55cde --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class/attribute.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true + +require "active_support/core_ext/kernel/singleton_class" +require "active_support/core_ext/module/redefine_method" +require "active_support/core_ext/array/extract_options" + +class Class + # Declare a class-level attribute whose value is inheritable by subclasses. + # Subclasses can change their own value and it will not impact parent class. + # + # ==== Options + # + # * :instance_reader - Sets the instance reader method (defaults to true). + # * :instance_writer - Sets the instance writer method (defaults to true). + # * :instance_accessor - Sets both instance methods (defaults to true). + # * :instance_predicate - Sets a predicate method (defaults to true). + # * :default - Sets a default value for the attribute (defaults to nil). + # + # ==== Examples + # + # class Base + # class_attribute :setting + # end + # + # class Subclass < Base + # end + # + # Base.setting = true + # Subclass.setting # => true + # Subclass.setting = false + # Subclass.setting # => false + # Base.setting # => true + # + # In the above case as long as Subclass does not assign a value to setting + # by performing Subclass.setting = _something_, Subclass.setting + # would read value assigned to parent class. Once Subclass assigns a value then + # the value assigned by Subclass would be returned. + # + # This matches normal Ruby method inheritance: think of writing an attribute + # on a subclass as overriding the reader method. However, you need to be aware + # when using +class_attribute+ with mutable structures as +Array+ or +Hash+. + # In such cases, you don't want to do changes in place. Instead use setters: + # + # Base.setting = [] + # Base.setting # => [] + # Subclass.setting # => [] + # + # # Appending in child changes both parent and child because it is the same object: + # Subclass.setting << :foo + # Base.setting # => [:foo] + # Subclass.setting # => [:foo] + # + # # Use setters to not propagate changes: + # Base.setting = [] + # Subclass.setting += [:foo] + # Base.setting # => [] + # Subclass.setting # => [:foo] + # + # For convenience, an instance predicate method is defined as well. + # To skip it, pass instance_predicate: false. + # + # Subclass.setting? # => false + # + # Instances may overwrite the class value in the same way: + # + # Base.setting = true + # object = Base.new + # object.setting # => true + # object.setting = false + # object.setting # => false + # Base.setting # => true + # + # To opt out of the instance reader method, pass instance_reader: false. + # + # object.setting # => NoMethodError + # object.setting? # => NoMethodError + # + # To opt out of the instance writer method, pass instance_writer: false. + # + # object.setting = false # => NoMethodError + # + # To opt out of both instance methods, pass instance_accessor: false. + # + # To set a default value for the attribute, pass default:, like so: + # + # class_attribute :settings, default: {} + def class_attribute( + *attrs, + instance_accessor: true, + instance_reader: instance_accessor, + instance_writer: instance_accessor, + instance_predicate: true, + default: nil + ) + attrs.each do |name| + singleton_class.silence_redefinition_of_method(name) + define_singleton_method(name) { default } + + singleton_class.silence_redefinition_of_method("#{name}?") + define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate + + ivar = "@#{name}".to_sym + + singleton_class.silence_redefinition_of_method("#{name}=") + define_singleton_method("#{name}=") do |val| + redefine_singleton_method(name) { val } + + if singleton_class? + class_eval do + redefine_method(name) do + if instance_variable_defined? ivar + instance_variable_get ivar + else + singleton_class.send name + end + end + end + end + val + end + + if instance_reader + redefine_method(name) do + if instance_variable_defined?(ivar) + instance_variable_get ivar + else + self.class.public_send name + end + end + + redefine_method("#{name}?") { !!public_send(name) } if instance_predicate + end + + if instance_writer + redefine_method("#{name}=") do |val| + instance_variable_set ivar, val + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class/attribute_accessors.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class/attribute_accessors.rb new file mode 100644 index 000000000000..a77354e1538b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class/attribute_accessors.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +# cattr_* became mattr_* aliases in 7dfbd91b0780fbd6a1dd9bfbc176e10894871d2d, +# but we keep this around for libraries that directly require it knowing they +# want cattr_*. No need to deprecate. +require "active_support/core_ext/module/attribute_accessors" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class/subclasses.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class/subclasses.rb new file mode 100644 index 000000000000..56fb46a88de4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/class/subclasses.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +class Class + begin + # Test if this Ruby supports each_object against singleton_class + ObjectSpace.each_object(Numeric.singleton_class) { } + + # Returns an array with all classes that are < than its receiver. + # + # class C; end + # C.descendants # => [] + # + # class B < C; end + # C.descendants # => [B] + # + # class A < B; end + # C.descendants # => [B, A] + # + # class D < C; end + # C.descendants # => [B, A, D] + def descendants + descendants = [] + ObjectSpace.each_object(singleton_class) do |k| + next if k.singleton_class? + descendants.unshift k unless k == self + end + descendants + end + rescue StandardError # JRuby 9.0.4.0 and earlier + def descendants + descendants = [] + ObjectSpace.each_object(Class) do |k| + descendants.unshift k if k < self + end + descendants.uniq! + descendants + end + end + + # Returns an array with the direct children of +self+. + # + # class Foo; end + # class Bar < Foo; end + # class Baz < Bar; end + # + # Foo.subclasses # => [Bar] + def subclasses + subclasses, chain = [], descendants + chain.each do |k| + subclasses << k unless chain.any? { |c| c > k } + end + subclasses + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date.rb new file mode 100644 index 000000000000..cce73f2db223 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require "active_support/core_ext/date/acts_like" +require "active_support/core_ext/date/blank" +require "active_support/core_ext/date/calculations" +require "active_support/core_ext/date/conversions" +require "active_support/core_ext/date/zones" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/acts_like.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/acts_like.rb new file mode 100644 index 000000000000..c8077f37747c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/acts_like.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/acts_like" + +class Date + # Duck-types as a Date-like class. See Object#acts_like?. + def acts_like_date? + true + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/blank.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/blank.rb new file mode 100644 index 000000000000..e6271c79b32b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/blank.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "date" + +class Date #:nodoc: + # No Date is blank: + # + # Date.today.blank? # => false + # + # @return [false] + def blank? + false + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/calculations.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/calculations.rb new file mode 100644 index 000000000000..d03a8d3997f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/calculations.rb @@ -0,0 +1,146 @@ +# frozen_string_literal: true + +require "date" +require "active_support/duration" +require "active_support/core_ext/object/acts_like" +require "active_support/core_ext/date/zones" +require "active_support/core_ext/time/zones" +require "active_support/core_ext/date_and_time/calculations" + +class Date + include DateAndTime::Calculations + + class << self + attr_accessor :beginning_of_week_default + + # Returns the week start (e.g. :monday) for the current request, if this has been set (via Date.beginning_of_week=). + # If Date.beginning_of_week has not been set for the current request, returns the week start specified in config.beginning_of_week. + # If no config.beginning_of_week was specified, returns :monday. + def beginning_of_week + Thread.current[:beginning_of_week] || beginning_of_week_default || :monday + end + + # Sets Date.beginning_of_week to a week start (e.g. :monday) for current request/thread. + # + # This method accepts any of the following day symbols: + # :monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday + def beginning_of_week=(week_start) + Thread.current[:beginning_of_week] = find_beginning_of_week!(week_start) + end + + # Returns week start day symbol (e.g. :monday), or raises an +ArgumentError+ for invalid day symbol. + def find_beginning_of_week!(week_start) + raise ArgumentError, "Invalid beginning of week: #{week_start}" unless ::Date::DAYS_INTO_WEEK.key?(week_start) + week_start + end + + # Returns a new Date representing the date 1 day ago (i.e. yesterday's date). + def yesterday + ::Date.current.yesterday + end + + # Returns a new Date representing the date 1 day after today (i.e. tomorrow's date). + def tomorrow + ::Date.current.tomorrow + end + + # Returns Time.zone.today when Time.zone or config.time_zone are set, otherwise just returns Date.today. + def current + ::Time.zone ? ::Time.zone.today : ::Date.today + end + end + + # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00) + # and then subtracts the specified number of seconds. + def ago(seconds) + in_time_zone.since(-seconds) + end + + # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00) + # and then adds the specified number of seconds + def since(seconds) + in_time_zone.since(seconds) + end + alias :in :since + + # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00) + def beginning_of_day + in_time_zone + end + alias :midnight :beginning_of_day + alias :at_midnight :beginning_of_day + alias :at_beginning_of_day :beginning_of_day + + # Converts Date to a Time (or DateTime if necessary) with the time portion set to the middle of the day (12:00) + def middle_of_day + in_time_zone.middle_of_day + end + alias :midday :middle_of_day + alias :noon :middle_of_day + alias :at_midday :middle_of_day + alias :at_noon :middle_of_day + alias :at_middle_of_day :middle_of_day + + # Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59) + def end_of_day + in_time_zone.end_of_day + end + alias :at_end_of_day :end_of_day + + def plus_with_duration(other) #:nodoc: + if ActiveSupport::Duration === other + other.since(self) + else + plus_without_duration(other) + end + end + alias_method :plus_without_duration, :+ + alias_method :+, :plus_with_duration + + def minus_with_duration(other) #:nodoc: + if ActiveSupport::Duration === other + plus_with_duration(-other) + else + minus_without_duration(other) + end + end + alias_method :minus_without_duration, :- + alias_method :-, :minus_with_duration + + # Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with + # any of these keys: :years, :months, :weeks, :days. + def advance(options) + d = self + + d = d >> options[:years] * 12 if options[:years] + d = d >> options[:months] if options[:months] + d = d + options[:weeks] * 7 if options[:weeks] + d = d + options[:days] if options[:days] + + d + end + + # Returns a new Date where one or more of the elements have been changed according to the +options+ parameter. + # The +options+ parameter is a hash with a combination of these keys: :year, :month, :day. + # + # Date.new(2007, 5, 12).change(day: 1) # => Date.new(2007, 5, 1) + # Date.new(2007, 5, 12).change(year: 2005, month: 1) # => Date.new(2005, 1, 12) + def change(options) + ::Date.new( + options.fetch(:year, year), + options.fetch(:month, month), + options.fetch(:day, day) + ) + end + + # Allow Date to be compared with Time by converting to DateTime and relying on the <=> from there. + def compare_with_coercion(other) + if other.is_a?(Time) + to_datetime <=> other + else + compare_without_coercion(other) + end + end + alias_method :compare_without_coercion, :<=> + alias_method :<=>, :compare_with_coercion +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/conversions.rb new file mode 100644 index 000000000000..870119dc7f97 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/conversions.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +require "date" +require "active_support/inflector/methods" +require "active_support/core_ext/date/zones" +require "active_support/core_ext/module/redefine_method" + +class Date + DATE_FORMATS = { + short: "%d %b", + long: "%B %d, %Y", + db: "%Y-%m-%d", + number: "%Y%m%d", + long_ordinal: lambda { |date| + day_format = ActiveSupport::Inflector.ordinalize(date.day) + date.strftime("%B #{day_format}, %Y") # => "April 25th, 2007" + }, + rfc822: "%d %b %Y", + iso8601: lambda { |date| date.iso8601 } + } + + # Convert to a formatted string. See DATE_FORMATS for predefined formats. + # + # This method is aliased to to_s. + # + # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007 + # + # date.to_formatted_s(:db) # => "2007-11-10" + # date.to_s(:db) # => "2007-11-10" + # + # date.to_formatted_s(:short) # => "10 Nov" + # date.to_formatted_s(:number) # => "20071110" + # date.to_formatted_s(:long) # => "November 10, 2007" + # date.to_formatted_s(:long_ordinal) # => "November 10th, 2007" + # date.to_formatted_s(:rfc822) # => "10 Nov 2007" + # date.to_formatted_s(:iso8601) # => "2007-11-10" + # + # == Adding your own date formats to to_formatted_s + # You can add your own formats to the Date::DATE_FORMATS hash. + # Use the format name as the hash key and either a strftime string + # or Proc instance that takes a date argument as the value. + # + # # config/initializers/date_formats.rb + # Date::DATE_FORMATS[:month_and_year] = '%B %Y' + # Date::DATE_FORMATS[:short_ordinal] = ->(date) { date.strftime("%B #{date.day.ordinalize}") } + def to_formatted_s(format = :default) + if formatter = DATE_FORMATS[format] + if formatter.respond_to?(:call) + formatter.call(self).to_s + else + strftime(formatter) + end + else + to_default_s + end + end + alias_method :to_default_s, :to_s + alias_method :to_s, :to_formatted_s + + # Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005" + def readable_inspect + strftime("%a, %d %b %Y") + end + alias_method :default_inspect, :inspect + alias_method :inspect, :readable_inspect + + silence_redefinition_of_method :to_time + + # Converts a Date instance to a Time, where the time is set to the beginning of the day. + # The timezone can be either :local or :utc (default :local). + # + # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007 + # + # date.to_time # => 2007-11-10 00:00:00 0800 + # date.to_time(:local) # => 2007-11-10 00:00:00 0800 + # + # date.to_time(:utc) # => 2007-11-10 00:00:00 UTC + # + # NOTE: The :local timezone is Ruby's *process* timezone, i.e. ENV['TZ']. + # If the *application's* timezone is needed, then use +in_time_zone+ instead. + def to_time(form = :local) + raise ArgumentError, "Expected :local or :utc, got #{form.inspect}." unless [:local, :utc].include?(form) + ::Time.send(form, year, month, day) + end + + silence_redefinition_of_method :xmlschema + + # Returns a string which represents the time in used time zone as DateTime + # defined by XML Schema: + # + # date = Date.new(2015, 05, 23) # => Sat, 23 May 2015 + # date.xmlschema # => "2015-05-23T00:00:00+04:00" + def xmlschema + in_time_zone.xmlschema + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/zones.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/zones.rb new file mode 100644 index 000000000000..2dcf97cff80e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date/zones.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "date" +require "active_support/core_ext/date_and_time/zones" + +class Date + include DateAndTime::Zones +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_and_time/calculations.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_and_time/calculations.rb new file mode 100644 index 000000000000..c7a2378e4162 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_and_time/calculations.rb @@ -0,0 +1,351 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/try" + +module DateAndTime + module Calculations + DAYS_INTO_WEEK = { + sunday: 0, + monday: 1, + tuesday: 2, + wednesday: 3, + thursday: 4, + friday: 5, + saturday: 6 + } + WEEKEND_DAYS = [ 6, 0 ] + + # Returns a new date/time representing yesterday. + def yesterday + advance(days: -1) + end + + # Returns a new date/time representing tomorrow. + def tomorrow + advance(days: 1) + end + + # Returns true if the date/time is today. + def today? + to_date == ::Date.current + end + + # Returns true if the date/time is in the past. + def past? + self < self.class.current + end + + # Returns true if the date/time is in the future. + def future? + self > self.class.current + end + + # Returns true if the date/time falls on a Saturday or Sunday. + def on_weekend? + WEEKEND_DAYS.include?(wday) + end + + # Returns true if the date/time does not fall on a Saturday or Sunday. + def on_weekday? + !WEEKEND_DAYS.include?(wday) + end + + # Returns true if the date/time falls before date_or_time. + def before?(date_or_time) + self < date_or_time + end + + # Returns true if the date/time falls after date_or_time. + def after?(date_or_time) + self > date_or_time + end + + # Returns a new date/time the specified number of days ago. + def days_ago(days) + advance(days: -days) + end + + # Returns a new date/time the specified number of days in the future. + def days_since(days) + advance(days: days) + end + + # Returns a new date/time the specified number of weeks ago. + def weeks_ago(weeks) + advance(weeks: -weeks) + end + + # Returns a new date/time the specified number of weeks in the future. + def weeks_since(weeks) + advance(weeks: weeks) + end + + # Returns a new date/time the specified number of months ago. + def months_ago(months) + advance(months: -months) + end + + # Returns a new date/time the specified number of months in the future. + def months_since(months) + advance(months: months) + end + + # Returns a new date/time the specified number of years ago. + def years_ago(years) + advance(years: -years) + end + + # Returns a new date/time the specified number of years in the future. + def years_since(years) + advance(years: years) + end + + # Returns a new date/time at the start of the month. + # + # today = Date.today # => Thu, 18 Jun 2015 + # today.beginning_of_month # => Mon, 01 Jun 2015 + # + # +DateTime+ objects will have a time set to 0:00. + # + # now = DateTime.current # => Thu, 18 Jun 2015 15:23:13 +0000 + # now.beginning_of_month # => Mon, 01 Jun 2015 00:00:00 +0000 + def beginning_of_month + first_hour(change(day: 1)) + end + alias :at_beginning_of_month :beginning_of_month + + # Returns a new date/time at the start of the quarter. + # + # today = Date.today # => Fri, 10 Jul 2015 + # today.beginning_of_quarter # => Wed, 01 Jul 2015 + # + # +DateTime+ objects will have a time set to 0:00. + # + # now = DateTime.current # => Fri, 10 Jul 2015 18:41:29 +0000 + # now.beginning_of_quarter # => Wed, 01 Jul 2015 00:00:00 +0000 + def beginning_of_quarter + first_quarter_month = month - (2 + month) % 3 + beginning_of_month.change(month: first_quarter_month) + end + alias :at_beginning_of_quarter :beginning_of_quarter + + # Returns a new date/time at the end of the quarter. + # + # today = Date.today # => Fri, 10 Jul 2015 + # today.end_of_quarter # => Wed, 30 Sep 2015 + # + # +DateTime+ objects will have a time set to 23:59:59. + # + # now = DateTime.current # => Fri, 10 Jul 2015 18:41:29 +0000 + # now.end_of_quarter # => Wed, 30 Sep 2015 23:59:59 +0000 + def end_of_quarter + last_quarter_month = month + (12 - month) % 3 + beginning_of_month.change(month: last_quarter_month).end_of_month + end + alias :at_end_of_quarter :end_of_quarter + + # Returns a new date/time at the beginning of the year. + # + # today = Date.today # => Fri, 10 Jul 2015 + # today.beginning_of_year # => Thu, 01 Jan 2015 + # + # +DateTime+ objects will have a time set to 0:00. + # + # now = DateTime.current # => Fri, 10 Jul 2015 18:41:29 +0000 + # now.beginning_of_year # => Thu, 01 Jan 2015 00:00:00 +0000 + def beginning_of_year + change(month: 1).beginning_of_month + end + alias :at_beginning_of_year :beginning_of_year + + # Returns a new date/time representing the given day in the next week. + # + # today = Date.today # => Thu, 07 May 2015 + # today.next_week # => Mon, 11 May 2015 + # + # The +given_day_in_next_week+ defaults to the beginning of the week + # which is determined by +Date.beginning_of_week+ or +config.beginning_of_week+ + # when set. + # + # today = Date.today # => Thu, 07 May 2015 + # today.next_week(:friday) # => Fri, 15 May 2015 + # + # +DateTime+ objects have their time set to 0:00 unless +same_time+ is true. + # + # now = DateTime.current # => Thu, 07 May 2015 13:31:16 +0000 + # now.next_week # => Mon, 11 May 2015 00:00:00 +0000 + def next_week(given_day_in_next_week = Date.beginning_of_week, same_time: false) + result = first_hour(weeks_since(1).beginning_of_week.days_since(days_span(given_day_in_next_week))) + same_time ? copy_time_to(result) : result + end + + # Returns a new date/time representing the next weekday. + def next_weekday + if next_day.on_weekend? + next_week(:monday, same_time: true) + else + next_day + end + end + + # Short-hand for months_since(3) + def next_quarter + months_since(3) + end + + # Returns a new date/time representing the given day in the previous week. + # Week is assumed to start on +start_day+, default is + # +Date.beginning_of_week+ or +config.beginning_of_week+ when set. + # DateTime objects have their time set to 0:00 unless +same_time+ is true. + def prev_week(start_day = Date.beginning_of_week, same_time: false) + result = first_hour(weeks_ago(1).beginning_of_week.days_since(days_span(start_day))) + same_time ? copy_time_to(result) : result + end + alias_method :last_week, :prev_week + + # Returns a new date/time representing the previous weekday. + def prev_weekday + if prev_day.on_weekend? + copy_time_to(beginning_of_week(:friday)) + else + prev_day + end + end + alias_method :last_weekday, :prev_weekday + + # Short-hand for months_ago(1). + def last_month + months_ago(1) + end + + # Short-hand for months_ago(3). + def prev_quarter + months_ago(3) + end + alias_method :last_quarter, :prev_quarter + + # Short-hand for years_ago(1). + def last_year + years_ago(1) + end + + # Returns the number of days to the start of the week on the given day. + # Week is assumed to start on +start_day+, default is + # +Date.beginning_of_week+ or +config.beginning_of_week+ when set. + def days_to_week_start(start_day = Date.beginning_of_week) + start_day_number = DAYS_INTO_WEEK.fetch(start_day) + (wday - start_day_number) % 7 + end + + # Returns a new date/time representing the start of this week on the given day. + # Week is assumed to start on +start_day+, default is + # +Date.beginning_of_week+ or +config.beginning_of_week+ when set. + # +DateTime+ objects have their time set to 0:00. + def beginning_of_week(start_day = Date.beginning_of_week) + result = days_ago(days_to_week_start(start_day)) + acts_like?(:time) ? result.midnight : result + end + alias :at_beginning_of_week :beginning_of_week + + # Returns Monday of this week assuming that week starts on Monday. + # +DateTime+ objects have their time set to 0:00. + def monday + beginning_of_week(:monday) + end + + # Returns a new date/time representing the end of this week on the given day. + # Week is assumed to start on +start_day+, default is + # +Date.beginning_of_week+ or +config.beginning_of_week+ when set. + # DateTime objects have their time set to 23:59:59. + def end_of_week(start_day = Date.beginning_of_week) + last_hour(days_since(6 - days_to_week_start(start_day))) + end + alias :at_end_of_week :end_of_week + + # Returns Sunday of this week assuming that week starts on Monday. + # +DateTime+ objects have their time set to 23:59:59. + def sunday + end_of_week(:monday) + end + + # Returns a new date/time representing the end of the month. + # DateTime objects will have a time set to 23:59:59. + def end_of_month + last_day = ::Time.days_in_month(month, year) + last_hour(days_since(last_day - day)) + end + alias :at_end_of_month :end_of_month + + # Returns a new date/time representing the end of the year. + # DateTime objects will have a time set to 23:59:59. + def end_of_year + change(month: 12).end_of_month + end + alias :at_end_of_year :end_of_year + + # Returns a Range representing the whole day of the current date/time. + def all_day + beginning_of_day..end_of_day + end + + # Returns a Range representing the whole week of the current date/time. + # Week starts on start_day, default is Date.beginning_of_week or config.beginning_of_week when set. + def all_week(start_day = Date.beginning_of_week) + beginning_of_week(start_day)..end_of_week(start_day) + end + + # Returns a Range representing the whole month of the current date/time. + def all_month + beginning_of_month..end_of_month + end + + # Returns a Range representing the whole quarter of the current date/time. + def all_quarter + beginning_of_quarter..end_of_quarter + end + + # Returns a Range representing the whole year of the current date/time. + def all_year + beginning_of_year..end_of_year + end + + # Returns a new date/time representing the next occurrence of the specified day of week. + # + # today = Date.today # => Thu, 14 Dec 2017 + # today.next_occurring(:monday) # => Mon, 18 Dec 2017 + # today.next_occurring(:thursday) # => Thu, 21 Dec 2017 + def next_occurring(day_of_week) + from_now = DAYS_INTO_WEEK.fetch(day_of_week) - wday + from_now += 7 unless from_now > 0 + advance(days: from_now) + end + + # Returns a new date/time representing the previous occurrence of the specified day of week. + # + # today = Date.today # => Thu, 14 Dec 2017 + # today.prev_occurring(:monday) # => Mon, 11 Dec 2017 + # today.prev_occurring(:thursday) # => Thu, 07 Dec 2017 + def prev_occurring(day_of_week) + ago = wday - DAYS_INTO_WEEK.fetch(day_of_week) + ago += 7 unless ago > 0 + advance(days: -ago) + end + + private + def first_hour(date_or_time) + date_or_time.acts_like?(:time) ? date_or_time.beginning_of_day : date_or_time + end + + def last_hour(date_or_time) + date_or_time.acts_like?(:time) ? date_or_time.end_of_day : date_or_time + end + + def days_span(day) + (DAYS_INTO_WEEK.fetch(day) - DAYS_INTO_WEEK.fetch(Date.beginning_of_week)) % 7 + end + + def copy_time_to(other) + other.change(hour: hour, min: min, sec: sec, nsec: try(:nsec)) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_and_time/compatibility.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_and_time/compatibility.rb new file mode 100644 index 000000000000..d33c36ef739d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_and_time/compatibility.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/attribute_accessors" + +module DateAndTime + module Compatibility + # If true, +to_time+ preserves the timezone offset of receiver. + # + # NOTE: With Ruby 2.4+ the default for +to_time+ changed from + # converting to the local system time, to preserving the offset + # of the receiver. For backwards compatibility we're overriding + # this behavior, but new apps will have an initializer that sets + # this to true, because the new behavior is preferred. + mattr_accessor :preserve_timezone, instance_writer: false, default: false + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_and_time/zones.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_and_time/zones.rb new file mode 100644 index 000000000000..fb6a27cb27fd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_and_time/zones.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module DateAndTime + module Zones + # Returns the simultaneous time in Time.zone if a zone is given or + # if Time.zone_default is set. Otherwise, it returns the current time. + # + # Time.zone = 'Hawaii' # => 'Hawaii' + # Time.utc(2000).in_time_zone # => Fri, 31 Dec 1999 14:00:00 HST -10:00 + # Date.new(2000).in_time_zone # => Sat, 01 Jan 2000 00:00:00 HST -10:00 + # + # This method is similar to Time#localtime, except that it uses Time.zone as the local zone + # instead of the operating system's time zone. + # + # You can also pass in a TimeZone instance or string that identifies a TimeZone as an argument, + # and the conversion will be based on that zone instead of Time.zone. + # + # Time.utc(2000).in_time_zone('Alaska') # => Fri, 31 Dec 1999 15:00:00 AKST -09:00 + # Date.new(2000).in_time_zone('Alaska') # => Sat, 01 Jan 2000 00:00:00 AKST -09:00 + def in_time_zone(zone = ::Time.zone) + time_zone = ::Time.find_zone! zone + time = acts_like?(:time) ? self : nil + + if time_zone + time_with_zone(time, time_zone) + else + time || to_time + end + end + + private + def time_with_zone(time, zone) + if time + ActiveSupport::TimeWithZone.new(time.utc? ? time : time.getutc, zone) + else + ActiveSupport::TimeWithZone.new(nil, zone, to_time(:utc)) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time.rb new file mode 100644 index 000000000000..790dbeec1b47 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require "active_support/core_ext/date_time/acts_like" +require "active_support/core_ext/date_time/blank" +require "active_support/core_ext/date_time/calculations" +require "active_support/core_ext/date_time/compatibility" +require "active_support/core_ext/date_time/conversions" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/acts_like.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/acts_like.rb new file mode 100644 index 000000000000..5dccdfe2192f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/acts_like.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "date" +require "active_support/core_ext/object/acts_like" + +class DateTime + # Duck-types as a Date-like class. See Object#acts_like?. + def acts_like_date? + true + end + + # Duck-types as a Time-like class. See Object#acts_like?. + def acts_like_time? + true + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/blank.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/blank.rb new file mode 100644 index 000000000000..a52c8bc150a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/blank.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "date" + +class DateTime #:nodoc: + # No DateTime is ever blank: + # + # DateTime.now.blank? # => false + # + # @return [false] + def blank? + false + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/calculations.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/calculations.rb new file mode 100644 index 000000000000..bc670c3e764b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/calculations.rb @@ -0,0 +1,211 @@ +# frozen_string_literal: true + +require "date" + +class DateTime + class << self + # Returns Time.zone.now.to_datetime when Time.zone or + # config.time_zone are set, otherwise returns + # Time.now.to_datetime. + def current + ::Time.zone ? ::Time.zone.now.to_datetime : ::Time.now.to_datetime + end + end + + # Returns the number of seconds since 00:00:00. + # + # DateTime.new(2012, 8, 29, 0, 0, 0).seconds_since_midnight # => 0 + # DateTime.new(2012, 8, 29, 12, 34, 56).seconds_since_midnight # => 45296 + # DateTime.new(2012, 8, 29, 23, 59, 59).seconds_since_midnight # => 86399 + def seconds_since_midnight + sec + (min * 60) + (hour * 3600) + end + + # Returns the number of seconds until 23:59:59. + # + # DateTime.new(2012, 8, 29, 0, 0, 0).seconds_until_end_of_day # => 86399 + # DateTime.new(2012, 8, 29, 12, 34, 56).seconds_until_end_of_day # => 41103 + # DateTime.new(2012, 8, 29, 23, 59, 59).seconds_until_end_of_day # => 0 + def seconds_until_end_of_day + end_of_day.to_i - to_i + end + + # Returns the fraction of a second as a +Rational+ + # + # DateTime.new(2012, 8, 29, 0, 0, 0.5).subsec # => (1/2) + def subsec + sec_fraction + end + + # Returns a new DateTime where one or more of the elements have been changed + # according to the +options+ parameter. The time options (:hour, + # :min, :sec) reset cascadingly, so if only the hour is + # passed, then minute and sec is set to 0. If the hour and minute is passed, + # then sec is set to 0. The +options+ parameter takes a hash with any of these + # keys: :year, :month, :day, :hour, + # :min, :sec, :offset, :start. + # + # DateTime.new(2012, 8, 29, 22, 35, 0).change(day: 1) # => DateTime.new(2012, 8, 1, 22, 35, 0) + # DateTime.new(2012, 8, 29, 22, 35, 0).change(year: 1981, day: 1) # => DateTime.new(1981, 8, 1, 22, 35, 0) + # DateTime.new(2012, 8, 29, 22, 35, 0).change(year: 1981, hour: 0) # => DateTime.new(1981, 8, 29, 0, 0, 0) + def change(options) + if new_nsec = options[:nsec] + raise ArgumentError, "Can't change both :nsec and :usec at the same time: #{options.inspect}" if options[:usec] + new_fraction = Rational(new_nsec, 1000000000) + else + new_usec = options.fetch(:usec, (options[:hour] || options[:min] || options[:sec]) ? 0 : Rational(nsec, 1000)) + new_fraction = Rational(new_usec, 1000000) + end + + raise ArgumentError, "argument out of range" if new_fraction >= 1 + + ::DateTime.civil( + options.fetch(:year, year), + options.fetch(:month, month), + options.fetch(:day, day), + options.fetch(:hour, hour), + options.fetch(:min, options[:hour] ? 0 : min), + options.fetch(:sec, (options[:hour] || options[:min]) ? 0 : sec) + new_fraction, + options.fetch(:offset, offset), + options.fetch(:start, start) + ) + end + + # Uses Date to provide precise Time calculations for years, months, and days. + # The +options+ parameter takes a hash with any of these keys: :years, + # :months, :weeks, :days, :hours, + # :minutes, :seconds. + def advance(options) + unless options[:weeks].nil? + options[:weeks], partial_weeks = options[:weeks].divmod(1) + options[:days] = options.fetch(:days, 0) + 7 * partial_weeks + end + + unless options[:days].nil? + options[:days], partial_days = options[:days].divmod(1) + options[:hours] = options.fetch(:hours, 0) + 24 * partial_days + end + + d = to_date.advance(options) + datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) + seconds_to_advance = \ + options.fetch(:seconds, 0) + + options.fetch(:minutes, 0) * 60 + + options.fetch(:hours, 0) * 3600 + + if seconds_to_advance.zero? + datetime_advanced_by_date + else + datetime_advanced_by_date.since(seconds_to_advance) + end + end + + # Returns a new DateTime representing the time a number of seconds ago. + # Do not use this method in combination with x.months, use months_ago instead! + def ago(seconds) + since(-seconds) + end + + # Returns a new DateTime representing the time a number of seconds since the + # instance time. Do not use this method in combination with x.months, use + # months_since instead! + def since(seconds) + self + Rational(seconds, 86400) + end + alias :in :since + + # Returns a new DateTime representing the start of the day (0:00). + def beginning_of_day + change(hour: 0) + end + alias :midnight :beginning_of_day + alias :at_midnight :beginning_of_day + alias :at_beginning_of_day :beginning_of_day + + # Returns a new DateTime representing the middle of the day (12:00) + def middle_of_day + change(hour: 12) + end + alias :midday :middle_of_day + alias :noon :middle_of_day + alias :at_midday :middle_of_day + alias :at_noon :middle_of_day + alias :at_middle_of_day :middle_of_day + + # Returns a new DateTime representing the end of the day (23:59:59). + def end_of_day + change(hour: 23, min: 59, sec: 59, usec: Rational(999999999, 1000)) + end + alias :at_end_of_day :end_of_day + + # Returns a new DateTime representing the start of the hour (hh:00:00). + def beginning_of_hour + change(min: 0) + end + alias :at_beginning_of_hour :beginning_of_hour + + # Returns a new DateTime representing the end of the hour (hh:59:59). + def end_of_hour + change(min: 59, sec: 59, usec: Rational(999999999, 1000)) + end + alias :at_end_of_hour :end_of_hour + + # Returns a new DateTime representing the start of the minute (hh:mm:00). + def beginning_of_minute + change(sec: 0) + end + alias :at_beginning_of_minute :beginning_of_minute + + # Returns a new DateTime representing the end of the minute (hh:mm:59). + def end_of_minute + change(sec: 59, usec: Rational(999999999, 1000)) + end + alias :at_end_of_minute :end_of_minute + + # Returns a Time instance of the simultaneous time in the system timezone. + def localtime(utc_offset = nil) + utc = new_offset(0) + + Time.utc( + utc.year, utc.month, utc.day, + utc.hour, utc.min, utc.sec + utc.sec_fraction + ).getlocal(utc_offset) + end + alias_method :getlocal, :localtime + + # Returns a Time instance of the simultaneous time in the UTC timezone. + # + # DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)) # => Mon, 21 Feb 2005 10:11:12 -0600 + # DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc # => Mon, 21 Feb 2005 16:11:12 UTC + def utc + utc = new_offset(0) + + Time.utc( + utc.year, utc.month, utc.day, + utc.hour, utc.min, utc.sec + utc.sec_fraction + ) + end + alias_method :getgm, :utc + alias_method :getutc, :utc + alias_method :gmtime, :utc + + # Returns +true+ if offset == 0. + def utc? + offset == 0 + end + + # Returns the offset value in seconds. + def utc_offset + (offset * 86400).to_i + end + + # Layers additional behavior on DateTime#<=> so that Time and + # ActiveSupport::TimeWithZone instances can be compared with a DateTime. + def <=>(other) + if other.respond_to? :to_datetime + super other.to_datetime rescue nil + else + super + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/compatibility.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/compatibility.rb new file mode 100644 index 000000000000..7600a067cc57 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/compatibility.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require "active_support/core_ext/date_and_time/compatibility" +require "active_support/core_ext/module/redefine_method" + +class DateTime + include DateAndTime::Compatibility + + silence_redefinition_of_method :to_time + + # Either return an instance of +Time+ with the same UTC offset + # as +self+ or an instance of +Time+ representing the same time + # in the local system timezone depending on the setting of + # on the setting of +ActiveSupport.to_time_preserves_timezone+. + def to_time + preserve_timezone ? getlocal(utc_offset) : getlocal + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/conversions.rb new file mode 100644 index 000000000000..231bf870a269 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/date_time/conversions.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +require "date" +require "active_support/inflector/methods" +require "active_support/core_ext/time/conversions" +require "active_support/core_ext/date_time/calculations" +require "active_support/values/time_zone" + +class DateTime + # Convert to a formatted string. See Time::DATE_FORMATS for predefined formats. + # + # This method is aliased to to_s. + # + # === Examples + # datetime = DateTime.civil(2007, 12, 4, 0, 0, 0, 0) # => Tue, 04 Dec 2007 00:00:00 +0000 + # + # datetime.to_formatted_s(:db) # => "2007-12-04 00:00:00" + # datetime.to_s(:db) # => "2007-12-04 00:00:00" + # datetime.to_s(:number) # => "20071204000000" + # datetime.to_formatted_s(:short) # => "04 Dec 00:00" + # datetime.to_formatted_s(:long) # => "December 04, 2007 00:00" + # datetime.to_formatted_s(:long_ordinal) # => "December 4th, 2007 00:00" + # datetime.to_formatted_s(:rfc822) # => "Tue, 04 Dec 2007 00:00:00 +0000" + # datetime.to_formatted_s(:iso8601) # => "2007-12-04T00:00:00+00:00" + # + # == Adding your own datetime formats to to_formatted_s + # DateTime formats are shared with Time. You can add your own to the + # Time::DATE_FORMATS hash. Use the format name as the hash key and + # either a strftime string or Proc instance that takes a time or + # datetime argument as the value. + # + # # config/initializers/time_formats.rb + # Time::DATE_FORMATS[:month_and_year] = '%B %Y' + # Time::DATE_FORMATS[:short_ordinal] = lambda { |time| time.strftime("%B #{time.day.ordinalize}") } + def to_formatted_s(format = :default) + if formatter = ::Time::DATE_FORMATS[format] + formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter) + else + to_default_s + end + end + alias_method :to_default_s, :to_s if instance_methods(false).include?(:to_s) + alias_method :to_s, :to_formatted_s + + # Returns a formatted string of the offset from UTC, or an alternative + # string if the time zone is already UTC. + # + # datetime = DateTime.civil(2000, 1, 1, 0, 0, 0, Rational(-6, 24)) + # datetime.formatted_offset # => "-06:00" + # datetime.formatted_offset(false) # => "-0600" + def formatted_offset(colon = true, alternate_utc_string = nil) + utc? && alternate_utc_string || ActiveSupport::TimeZone.seconds_to_utc_offset(utc_offset, colon) + end + + # Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005 14:30:00 +0000". + def readable_inspect + to_s(:rfc822) + end + alias_method :default_inspect, :inspect + alias_method :inspect, :readable_inspect + + # Returns DateTime with local offset for given year if format is local else + # offset is zero. + # + # DateTime.civil_from_format :local, 2012 + # # => Sun, 01 Jan 2012 00:00:00 +0300 + # DateTime.civil_from_format :local, 2012, 12, 17 + # # => Mon, 17 Dec 2012 00:00:00 +0000 + def self.civil_from_format(utc_or_local, year, month = 1, day = 1, hour = 0, min = 0, sec = 0) + if utc_or_local.to_sym == :local + offset = ::Time.local(year, month, day).utc_offset.to_r / 86400 + else + offset = 0 + end + civil(year, month, day, hour, min, sec, offset) + end + + # Converts +self+ to a floating-point number of seconds, including fractional microseconds, since the Unix epoch. + def to_f + seconds_since_unix_epoch.to_f + sec_fraction + end + + # Converts +self+ to an integer number of seconds since the Unix epoch. + def to_i + seconds_since_unix_epoch.to_i + end + + # Returns the fraction of a second as microseconds + def usec + (sec_fraction * 1_000_000).to_i + end + + # Returns the fraction of a second as nanoseconds + def nsec + (sec_fraction * 1_000_000_000).to_i + end + + private + def offset_in_seconds + (offset * 86400).to_i + end + + def seconds_since_unix_epoch + (jd - 2440588) * 86400 - offset_in_seconds + seconds_since_midnight + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/digest.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/digest.rb new file mode 100644 index 000000000000..ce1427e13a0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/digest.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require "active_support/core_ext/digest/uuid" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/digest/uuid.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/digest/uuid.rb new file mode 100644 index 000000000000..6e949a2d72b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/digest/uuid.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require "securerandom" + +module Digest + module UUID + DNS_NAMESPACE = "k\xA7\xB8\x10\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: + URL_NAMESPACE = "k\xA7\xB8\x11\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: + OID_NAMESPACE = "k\xA7\xB8\x12\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: + X500_NAMESPACE = "k\xA7\xB8\x14\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: + + # Generates a v5 non-random UUID (Universally Unique IDentifier). + # + # Using Digest::MD5 generates version 3 UUIDs; Digest::SHA1 generates version 5 UUIDs. + # uuid_from_hash always generates the same UUID for a given name and namespace combination. + # + # See RFC 4122 for details of UUID at: https://www.ietf.org/rfc/rfc4122.txt + def self.uuid_from_hash(hash_class, uuid_namespace, name) + if hash_class == Digest::MD5 + version = 3 + elsif hash_class == Digest::SHA1 + version = 5 + else + raise ArgumentError, "Expected Digest::SHA1 or Digest::MD5, got #{hash_class.name}." + end + + hash = hash_class.new + hash.update(uuid_namespace) + hash.update(name) + + ary = hash.digest.unpack("NnnnnN") + ary[2] = (ary[2] & 0x0FFF) | (version << 12) + ary[3] = (ary[3] & 0x3FFF) | 0x8000 + + "%08x-%04x-%04x-%04x-%04x%08x" % ary + end + + # Convenience method for uuid_from_hash using Digest::MD5. + def self.uuid_v3(uuid_namespace, name) + uuid_from_hash(Digest::MD5, uuid_namespace, name) + end + + # Convenience method for uuid_from_hash using Digest::SHA1. + def self.uuid_v5(uuid_namespace, name) + uuid_from_hash(Digest::SHA1, uuid_namespace, name) + end + + # Convenience method for SecureRandom.uuid. + def self.uuid_v4 + SecureRandom.uuid + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/enumerable.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/enumerable.rb new file mode 100644 index 000000000000..4675c419369c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/enumerable.rb @@ -0,0 +1,188 @@ +# frozen_string_literal: true + +module Enumerable + INDEX_WITH_DEFAULT = Object.new + private_constant :INDEX_WITH_DEFAULT + + # Enumerable#sum was added in Ruby 2.4, but it only works with Numeric elements + # when we omit an identity. + + # :stopdoc: + + # We can't use Refinements here because Refinements with Module which will be prepended + # doesn't work well https://bugs.ruby-lang.org/issues/13446 + alias :_original_sum_with_required_identity :sum + private :_original_sum_with_required_identity + + # :startdoc: + + # Calculates a sum from the elements. + # + # payments.sum { |p| p.price * p.tax_rate } + # payments.sum(&:price) + # + # The latter is a shortcut for: + # + # payments.inject(0) { |sum, p| sum + p.price } + # + # It can also calculate the sum without the use of a block. + # + # [5, 15, 10].sum # => 30 + # ['foo', 'bar'].sum # => "foobar" + # [[1, 2], [3, 1, 5]].sum # => [1, 2, 3, 1, 5] + # + # The default sum of an empty list is zero. You can override this default: + # + # [].sum(Payment.new(0)) { |i| i.amount } # => Payment.new(0) + def sum(identity = nil, &block) + if identity + _original_sum_with_required_identity(identity, &block) + elsif block_given? + map(&block).sum(identity) + else + inject(:+) || 0 + end + end + + # Convert an enumerable to a hash keying it by the block return value. + # + # people.index_by(&:login) + # # => { "nextangle" => , "chade-" => , ...} + # + # people.index_by { |person| "#{person.first_name} #{person.last_name}" } + # # => { "Chade- Fowlersburg-e" => , "David Heinemeier Hansson" => , ...} + def index_by + if block_given? + result = {} + each { |elem| result[yield(elem)] = elem } + result + else + to_enum(:index_by) { size if respond_to?(:size) } + end + end + + # Convert an enumerable to a hash keying it with the enumerable items and with the values returned in the block. + # + # post = Post.new(title: "hey there", body: "what's up?") + # + # %i( title body ).index_with { |attr_name| post.public_send(attr_name) } + # # => { title: "hey there", body: "what's up?" } + def index_with(default = INDEX_WITH_DEFAULT) + if block_given? + result = {} + each { |elem| result[elem] = yield(elem) } + result + elsif default != INDEX_WITH_DEFAULT + result = {} + each { |elem| result[elem] = default } + result + else + to_enum(:index_with) { size if respond_to?(:size) } + end + end + + # Returns +true+ if the enumerable has more than 1 element. Functionally + # equivalent to enum.to_a.size > 1. Can be called with a block too, + # much like any?, so people.many? { |p| p.age > 26 } returns +true+ + # if more than one person is over 26. + def many? + cnt = 0 + if block_given? + any? do |element| + cnt += 1 if yield element + cnt > 1 + end + else + any? { (cnt += 1) > 1 } + end + end + + # Returns a new array that includes the passed elements. + # + # [ 1, 2, 3 ].including(4, 5) + # # => [ 1, 2, 3, 4, 5 ] + # + # ["David", "Rafael"].including %w[ Aaron Todd ] + # # => ["David", "Rafael", "Aaron", "Todd"] + def including(*elements) + to_a.including(*elements) + end + + # The negative of the Enumerable#include?. Returns +true+ if the + # collection does not include the object. + def exclude?(object) + !include?(object) + end + + # Returns a copy of the enumerable excluding the specified elements. + # + # ["David", "Rafael", "Aaron", "Todd"].excluding "Aaron", "Todd" + # # => ["David", "Rafael"] + # + # ["David", "Rafael", "Aaron", "Todd"].excluding %w[ Aaron Todd ] + # # => ["David", "Rafael"] + # + # {foo: 1, bar: 2, baz: 3}.excluding :bar + # # => {foo: 1, baz: 3} + def excluding(*elements) + elements.flatten!(1) + reject { |element| elements.include?(element) } + end + + # Alias for #excluding. + def without(*elements) + excluding(*elements) + end + + # Convert an enumerable to an array based on the given key. + # + # [{ name: "David" }, { name: "Rafael" }, { name: "Aaron" }].pluck(:name) + # # => ["David", "Rafael", "Aaron"] + # + # [{ id: 1, name: "David" }, { id: 2, name: "Rafael" }].pluck(:id, :name) + # # => [[1, "David"], [2, "Rafael"]] + def pluck(*keys) + if keys.many? + map { |element| keys.map { |key| element[key] } } + else + map { |element| element[keys.first] } + end + end +end + +class Range #:nodoc: + # Optimize range sum to use arithmetic progression if a block is not given and + # we have a range of numeric values. + def sum(identity = nil) + if block_given? || !(first.is_a?(Integer) && last.is_a?(Integer)) + super + else + actual_last = exclude_end? ? (last - 1) : last + if actual_last >= first + sum = identity || 0 + sum + (actual_last - first + 1) * (actual_last + first) / 2 + else + identity || 0 + end + end + end +end + +# Using Refinements here in order not to expose our internal method +using Module.new { + refine Array do + alias :orig_sum :sum + end +} + +class Array #:nodoc: + # Array#sum was added in Ruby 2.4 but it only works with Numeric elements. + def sum(init = nil, &block) + if init.is_a?(Numeric) || first.is_a?(Numeric) + init ||= 0 + orig_sum(init, &block) + else + super + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/file.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/file.rb new file mode 100644 index 000000000000..64553bfa4e82 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/file.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require "active_support/core_ext/file/atomic" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/file/atomic.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/file/atomic.rb new file mode 100644 index 000000000000..9deceb1bb44d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/file/atomic.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require "fileutils" + +class File + # Write to a file atomically. Useful for situations where you don't + # want other processes or threads to see half-written files. + # + # File.atomic_write('important.file') do |file| + # file.write('hello') + # end + # + # This method needs to create a temporary file. By default it will create it + # in the same directory as the destination file. If you don't like this + # behavior you can provide a different directory but it must be on the + # same physical filesystem as the file you're trying to write. + # + # File.atomic_write('/data/something.important', '/data/tmp') do |file| + # file.write('hello') + # end + def self.atomic_write(file_name, temp_dir = dirname(file_name)) + require "tempfile" unless defined?(Tempfile) + + Tempfile.open(".#{basename(file_name)}", temp_dir) do |temp_file| + temp_file.binmode + return_val = yield temp_file + temp_file.close + + old_stat = if exist?(file_name) + # Get original file permissions + stat(file_name) + else + # If not possible, probe which are the default permissions in the + # destination directory. + probe_stat_in(dirname(file_name)) + end + + if old_stat + # Set correct permissions on new file + begin + chown(old_stat.uid, old_stat.gid, temp_file.path) + # This operation will affect filesystem ACL's + chmod(old_stat.mode, temp_file.path) + rescue Errno::EPERM, Errno::EACCES + # Changing file ownership failed, moving on. + end + end + + # Overwrite original file with temp file + rename(temp_file.path, file_name) + return_val + end + end + + # Private utility method. + def self.probe_stat_in(dir) #:nodoc: + basename = [ + ".permissions_check", + Thread.current.object_id, + Process.pid, + rand(1000000) + ].join(".") + + file_name = join(dir, basename) + FileUtils.touch(file_name) + stat(file_name) + ensure + FileUtils.rm_f(file_name) if file_name + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash.rb new file mode 100644 index 000000000000..2f0901d8534b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require "active_support/core_ext/hash/conversions" +require "active_support/core_ext/hash/deep_merge" +require "active_support/core_ext/hash/deep_transform_values" +require "active_support/core_ext/hash/except" +require "active_support/core_ext/hash/indifferent_access" +require "active_support/core_ext/hash/keys" +require "active_support/core_ext/hash/reverse_merge" +require "active_support/core_ext/hash/slice" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/compact.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/compact.rb new file mode 100644 index 000000000000..5cb858af5c3f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/compact.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "active_support/deprecation" + +ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Hash#compact and Hash#compact! natively, so requiring active_support/core_ext/hash/compact is no longer necessary. Requiring it will raise LoadError in Rails 6.1." diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/conversions.rb new file mode 100644 index 000000000000..61cbcaff2799 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/conversions.rb @@ -0,0 +1,263 @@ +# frozen_string_literal: true + +require "active_support/xml_mini" +require "active_support/time" +require "active_support/core_ext/object/blank" +require "active_support/core_ext/object/to_param" +require "active_support/core_ext/object/to_query" +require "active_support/core_ext/array/wrap" +require "active_support/core_ext/hash/reverse_merge" +require "active_support/core_ext/string/inflections" + +class Hash + # Returns a string containing an XML representation of its receiver: + # + # { foo: 1, bar: 2 }.to_xml + # # => + # # + # # + # # 1 + # # 2 + # # + # + # To do so, the method loops over the pairs and builds nodes that depend on + # the _values_. Given a pair +key+, +value+: + # + # * If +value+ is a hash there's a recursive call with +key+ as :root. + # + # * If +value+ is an array there's a recursive call with +key+ as :root, + # and +key+ singularized as :children. + # + # * If +value+ is a callable object it must expect one or two arguments. Depending + # on the arity, the callable is invoked with the +options+ hash as first argument + # with +key+ as :root, and +key+ singularized as second argument. The + # callable can add nodes by using options[:builder]. + # + # {foo: lambda { |options, key| options[:builder].b(key) }}.to_xml + # # => "foo" + # + # * If +value+ responds to +to_xml+ the method is invoked with +key+ as :root. + # + # class Foo + # def to_xml(options) + # options[:builder].bar 'fooing!' + # end + # end + # + # { foo: Foo.new }.to_xml(skip_instruct: true) + # # => + # # + # # fooing! + # # + # + # * Otherwise, a node with +key+ as tag is created with a string representation of + # +value+ as text node. If +value+ is +nil+ an attribute "nil" set to "true" is added. + # Unless the option :skip_types exists and is true, an attribute "type" is + # added as well according to the following mapping: + # + # XML_TYPE_NAMES = { + # "Symbol" => "symbol", + # "Integer" => "integer", + # "BigDecimal" => "decimal", + # "Float" => "float", + # "TrueClass" => "boolean", + # "FalseClass" => "boolean", + # "Date" => "date", + # "DateTime" => "dateTime", + # "Time" => "dateTime" + # } + # + # By default the root node is "hash", but that's configurable via the :root option. + # + # The default XML builder is a fresh instance of Builder::XmlMarkup. You can + # configure your own builder with the :builder option. The method also accepts + # options like :dasherize and friends, they are forwarded to the builder. + def to_xml(options = {}) + require "active_support/builder" unless defined?(Builder::XmlMarkup) + + options = options.dup + options[:indent] ||= 2 + options[:root] ||= "hash" + options[:builder] ||= Builder::XmlMarkup.new(indent: options[:indent]) + + builder = options[:builder] + builder.instruct! unless options.delete(:skip_instruct) + + root = ActiveSupport::XmlMini.rename_key(options[:root].to_s, options) + + builder.tag!(root) do + each { |key, value| ActiveSupport::XmlMini.to_tag(key, value, options) } + yield builder if block_given? + end + end + + class << self + # Returns a Hash containing a collection of pairs when the key is the node name and the value is + # its content + # + # xml = <<-XML + # + # + # 1 + # 2 + # + # XML + # + # hash = Hash.from_xml(xml) + # # => {"hash"=>{"foo"=>1, "bar"=>2}} + # + # +DisallowedType+ is raised if the XML contains attributes with type="yaml" or + # type="symbol". Use Hash.from_trusted_xml to + # parse this XML. + # + # Custom +disallowed_types+ can also be passed in the form of an + # array. + # + # xml = <<-XML + # + # + # 1 + # "David" + # + # XML + # + # hash = Hash.from_xml(xml, ['integer']) + # # => ActiveSupport::XMLConverter::DisallowedType: Disallowed type attribute: "integer" + # + # Note that passing custom disallowed types will override the default types, + # which are Symbol and YAML. + def from_xml(xml, disallowed_types = nil) + ActiveSupport::XMLConverter.new(xml, disallowed_types).to_h + end + + # Builds a Hash from XML just like Hash.from_xml, but also allows Symbol and YAML. + def from_trusted_xml(xml) + from_xml xml, [] + end + end +end + +module ActiveSupport + class XMLConverter # :nodoc: + # Raised if the XML contains attributes with type="yaml" or + # type="symbol". Read Hash#from_xml for more details. + class DisallowedType < StandardError + def initialize(type) + super "Disallowed type attribute: #{type.inspect}" + end + end + + DISALLOWED_TYPES = %w(symbol yaml) + + def initialize(xml, disallowed_types = nil) + @xml = normalize_keys(XmlMini.parse(xml)) + @disallowed_types = disallowed_types || DISALLOWED_TYPES + end + + def to_h + deep_to_h(@xml) + end + + private + def normalize_keys(params) + case params + when Hash + Hash[params.map { |k, v| [k.to_s.tr("-", "_"), normalize_keys(v)] } ] + when Array + params.map { |v| normalize_keys(v) } + else + params + end + end + + def deep_to_h(value) + case value + when Hash + process_hash(value) + when Array + process_array(value) + when String + value + else + raise "can't typecast #{value.class.name} - #{value.inspect}" + end + end + + def process_hash(value) + if value.include?("type") && !value["type"].is_a?(Hash) && @disallowed_types.include?(value["type"]) + raise DisallowedType, value["type"] + end + + if become_array?(value) + _, entries = Array.wrap(value.detect { |k, v| not v.is_a?(String) }) + if entries.nil? || value["__content__"].try(:empty?) + [] + else + case entries + when Array + entries.collect { |v| deep_to_h(v) } + when Hash + [deep_to_h(entries)] + else + raise "can't typecast #{entries.inspect}" + end + end + elsif become_content?(value) + process_content(value) + + elsif become_empty_string?(value) + "" + elsif become_hash?(value) + xml_value = Hash[value.map { |k, v| [k, deep_to_h(v)] }] + + # Turn { files: { file: # } } into { files: # } so it is compatible with + # how multipart uploaded files from HTML appear + xml_value["file"].is_a?(StringIO) ? xml_value["file"] : xml_value + end + end + + def become_content?(value) + value["type"] == "file" || (value["__content__"] && (value.keys.size == 1 || value["__content__"].present?)) + end + + def become_array?(value) + value["type"] == "array" + end + + def become_empty_string?(value) + # { "string" => true } + # No tests fail when the second term is removed. + value["type"] == "string" && value["nil"] != "true" + end + + def become_hash?(value) + !nothing?(value) && !garbage?(value) + end + + def nothing?(value) + # blank or nil parsed values are represented by nil + value.blank? || value["nil"] == "true" + end + + def garbage?(value) + # If the type is the only element which makes it then + # this still makes the value nil, except if type is + # an XML node(where type['value'] is a Hash) + value["type"] && !value["type"].is_a?(::Hash) && value.size == 1 + end + + def process_content(value) + content = value["__content__"] + if parser = ActiveSupport::XmlMini::PARSING[value["type"]] + parser.arity == 1 ? parser.call(content) : parser.call(content, value) + else + content + end + end + + def process_array(value) + value.map! { |i| deep_to_h(i) } + value.length > 1 ? value : value.first + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/deep_merge.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/deep_merge.rb new file mode 100644 index 000000000000..9bc50b7bc63b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/deep_merge.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +class Hash + # Returns a new hash with +self+ and +other_hash+ merged recursively. + # + # h1 = { a: true, b: { c: [1, 2, 3] } } + # h2 = { a: false, b: { x: [3, 4, 5] } } + # + # h1.deep_merge(h2) # => { a: false, b: { c: [1, 2, 3], x: [3, 4, 5] } } + # + # Like with Hash#merge in the standard library, a block can be provided + # to merge values: + # + # h1 = { a: 100, b: 200, c: { c1: 100 } } + # h2 = { b: 250, c: { c1: 200 } } + # h1.deep_merge(h2) { |key, this_val, other_val| this_val + other_val } + # # => { a: 100, b: 450, c: { c1: 300 } } + def deep_merge(other_hash, &block) + dup.deep_merge!(other_hash, &block) + end + + # Same as +deep_merge+, but modifies +self+. + def deep_merge!(other_hash, &block) + merge!(other_hash) do |key, this_val, other_val| + if this_val.is_a?(Hash) && other_val.is_a?(Hash) + this_val.deep_merge(other_val, &block) + elsif block_given? + block.call(key, this_val, other_val) + else + other_val + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/deep_transform_values.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/deep_transform_values.rb new file mode 100644 index 000000000000..18acb1e70cee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/deep_transform_values.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +class Hash + # Returns a new hash with all values converted by the block operation. + # This includes the values from the root hash and from all + # nested hashes and arrays. + # + # hash = { person: { name: 'Rob', age: '28' } } + # + # hash.deep_transform_values{ |value| value.to_s.upcase } + # # => {person: {name: "ROB", age: "28"}} + def deep_transform_values(&block) + _deep_transform_values_in_object(self, &block) + end + + # Destructively converts all values by using the block operation. + # This includes the values from the root hash and from all + # nested hashes and arrays. + def deep_transform_values!(&block) + _deep_transform_values_in_object!(self, &block) + end + + private + # support methods for deep transforming nested hashes and arrays + def _deep_transform_values_in_object(object, &block) + case object + when Hash + object.transform_values { |value| _deep_transform_values_in_object(value, &block) } + when Array + object.map { |e| _deep_transform_values_in_object(e, &block) } + else + yield(object) + end + end + + def _deep_transform_values_in_object!(object, &block) + case object + when Hash + object.transform_values! { |value| _deep_transform_values_in_object!(value, &block) } + when Array + object.map! { |e| _deep_transform_values_in_object!(e, &block) } + else + yield(object) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/except.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/except.rb new file mode 100644 index 000000000000..501381246093 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/except.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class Hash + # Returns a hash that includes everything except given keys. + # hash = { a: true, b: false, c: nil } + # hash.except(:c) # => { a: true, b: false } + # hash.except(:a, :b) # => { c: nil } + # hash # => { a: true, b: false, c: nil } + # + # This is useful for limiting a set of parameters to everything but a few known toggles: + # @person.update(params[:person].except(:admin)) + def except(*keys) + slice(*self.keys - keys) + end + + # Removes the given keys from hash and returns it. + # hash = { a: true, b: false, c: nil } + # hash.except!(:c) # => { a: true, b: false } + # hash # => { a: true, b: false } + def except!(*keys) + keys.each { |key| delete(key) } + self + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/indifferent_access.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/indifferent_access.rb new file mode 100644 index 000000000000..a38f33f1282e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/indifferent_access.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require "active_support/hash_with_indifferent_access" + +class Hash + # Returns an ActiveSupport::HashWithIndifferentAccess out of its receiver: + # + # { a: 1 }.with_indifferent_access['a'] # => 1 + def with_indifferent_access + ActiveSupport::HashWithIndifferentAccess.new(self) + end + + # Called when object is nested under an object that receives + # #with_indifferent_access. This method will be called on the current object + # by the enclosing object and is aliased to #with_indifferent_access by + # default. Subclasses of Hash may overwrite this method to return +self+ if + # converting to an ActiveSupport::HashWithIndifferentAccess would not be + # desirable. + # + # b = { b: 1 } + # { a: b }.with_indifferent_access['a'] # calls b.nested_under_indifferent_access + # # => {"b"=>1} + alias nested_under_indifferent_access with_indifferent_access +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/keys.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/keys.rb new file mode 100644 index 000000000000..7d3495db2c5f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/keys.rb @@ -0,0 +1,143 @@ +# frozen_string_literal: true + +class Hash + # Returns a new hash with all keys converted to strings. + # + # hash = { name: 'Rob', age: '28' } + # + # hash.stringify_keys + # # => {"name"=>"Rob", "age"=>"28"} + def stringify_keys + transform_keys(&:to_s) + end + + # Destructively converts all keys to strings. Same as + # +stringify_keys+, but modifies +self+. + def stringify_keys! + transform_keys!(&:to_s) + end + + # Returns a new hash with all keys converted to symbols, as long as + # they respond to +to_sym+. + # + # hash = { 'name' => 'Rob', 'age' => '28' } + # + # hash.symbolize_keys + # # => {:name=>"Rob", :age=>"28"} + def symbolize_keys + transform_keys { |key| key.to_sym rescue key } + end + alias_method :to_options, :symbolize_keys + + # Destructively converts all keys to symbols, as long as they respond + # to +to_sym+. Same as +symbolize_keys+, but modifies +self+. + def symbolize_keys! + transform_keys! { |key| key.to_sym rescue key } + end + alias_method :to_options!, :symbolize_keys! + + # Validates all keys in a hash match *valid_keys, raising + # +ArgumentError+ on a mismatch. + # + # Note that keys are treated differently than HashWithIndifferentAccess, + # meaning that string and symbol keys will not match. + # + # { name: 'Rob', years: '28' }.assert_valid_keys(:name, :age) # => raises "ArgumentError: Unknown key: :years. Valid keys are: :name, :age" + # { name: 'Rob', age: '28' }.assert_valid_keys('name', 'age') # => raises "ArgumentError: Unknown key: :name. Valid keys are: 'name', 'age'" + # { name: 'Rob', age: '28' }.assert_valid_keys(:name, :age) # => passes, raises nothing + def assert_valid_keys(*valid_keys) + valid_keys.flatten! + each_key do |k| + unless valid_keys.include?(k) + raise ArgumentError.new("Unknown key: #{k.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}") + end + end + end + + # Returns a new hash with all keys converted by the block operation. + # This includes the keys from the root hash and from all + # nested hashes and arrays. + # + # hash = { person: { name: 'Rob', age: '28' } } + # + # hash.deep_transform_keys{ |key| key.to_s.upcase } + # # => {"PERSON"=>{"NAME"=>"Rob", "AGE"=>"28"}} + def deep_transform_keys(&block) + _deep_transform_keys_in_object(self, &block) + end + + # Destructively converts all keys by using the block operation. + # This includes the keys from the root hash and from all + # nested hashes and arrays. + def deep_transform_keys!(&block) + _deep_transform_keys_in_object!(self, &block) + end + + # Returns a new hash with all keys converted to strings. + # This includes the keys from the root hash and from all + # nested hashes and arrays. + # + # hash = { person: { name: 'Rob', age: '28' } } + # + # hash.deep_stringify_keys + # # => {"person"=>{"name"=>"Rob", "age"=>"28"}} + def deep_stringify_keys + deep_transform_keys(&:to_s) + end + + # Destructively converts all keys to strings. + # This includes the keys from the root hash and from all + # nested hashes and arrays. + def deep_stringify_keys! + deep_transform_keys!(&:to_s) + end + + # Returns a new hash with all keys converted to symbols, as long as + # they respond to +to_sym+. This includes the keys from the root hash + # and from all nested hashes and arrays. + # + # hash = { 'person' => { 'name' => 'Rob', 'age' => '28' } } + # + # hash.deep_symbolize_keys + # # => {:person=>{:name=>"Rob", :age=>"28"}} + def deep_symbolize_keys + deep_transform_keys { |key| key.to_sym rescue key } + end + + # Destructively converts all keys to symbols, as long as they respond + # to +to_sym+. This includes the keys from the root hash and from all + # nested hashes and arrays. + def deep_symbolize_keys! + deep_transform_keys! { |key| key.to_sym rescue key } + end + + private + # support methods for deep transforming nested hashes and arrays + def _deep_transform_keys_in_object(object, &block) + case object + when Hash + object.each_with_object({}) do |(key, value), result| + result[yield(key)] = _deep_transform_keys_in_object(value, &block) + end + when Array + object.map { |e| _deep_transform_keys_in_object(e, &block) } + else + object + end + end + + def _deep_transform_keys_in_object!(object, &block) + case object + when Hash + object.keys.each do |key| + value = object.delete(key) + object[yield(key)] = _deep_transform_keys_in_object!(value, &block) + end + object + when Array + object.map! { |e| _deep_transform_keys_in_object!(e, &block) } + else + object + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/reverse_merge.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/reverse_merge.rb new file mode 100644 index 000000000000..ef8d592829a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/reverse_merge.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class Hash + # Merges the caller into +other_hash+. For example, + # + # options = options.reverse_merge(size: 25, velocity: 10) + # + # is equivalent to + # + # options = { size: 25, velocity: 10 }.merge(options) + # + # This is particularly useful for initializing an options hash + # with default values. + def reverse_merge(other_hash) + other_hash.merge(self) + end + alias_method :with_defaults, :reverse_merge + + # Destructive +reverse_merge+. + def reverse_merge!(other_hash) + replace(reverse_merge(other_hash)) + end + alias_method :reverse_update, :reverse_merge! + alias_method :with_defaults!, :reverse_merge! +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/slice.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/slice.rb new file mode 100644 index 000000000000..3d0f8a1e6263 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/slice.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +class Hash + # Replaces the hash with only the given keys. + # Returns a hash containing the removed key/value pairs. + # + # hash = { a: 1, b: 2, c: 3, d: 4 } + # hash.slice!(:a, :b) # => {:c=>3, :d=>4} + # hash # => {:a=>1, :b=>2} + def slice!(*keys) + omit = slice(*self.keys - keys) + hash = slice(*keys) + hash.default = default + hash.default_proc = default_proc if default_proc + replace(hash) + omit + end + + # Removes and returns the key/value pairs matching the given keys. + # + # { a: 1, b: 2, c: 3, d: 4 }.extract!(:a, :b) # => {:a=>1, :b=>2} + # { a: 1, b: 2 }.extract!(:a, :x) # => {:a=>1} + def extract!(*keys) + keys.each_with_object(self.class.new) { |key, result| result[key] = delete(key) if has_key?(key) } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/transform_values.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/transform_values.rb new file mode 100644 index 000000000000..e4aeb0e891af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/hash/transform_values.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "active_support/deprecation" + +ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Hash#transform_values natively, so requiring active_support/core_ext/hash/transform_values is no longer necessary. Requiring it will raise LoadError in Rails 6.1." diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer.rb new file mode 100644 index 000000000000..d22701306a1c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "active_support/core_ext/integer/multiple" +require "active_support/core_ext/integer/inflections" +require "active_support/core_ext/integer/time" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer/inflections.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer/inflections.rb new file mode 100644 index 000000000000..aef3266f2830 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer/inflections.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require "active_support/inflector" + +class Integer + # Ordinalize turns a number into an ordinal string used to denote the + # position in an ordered sequence such as 1st, 2nd, 3rd, 4th. + # + # 1.ordinalize # => "1st" + # 2.ordinalize # => "2nd" + # 1002.ordinalize # => "1002nd" + # 1003.ordinalize # => "1003rd" + # -11.ordinalize # => "-11th" + # -1001.ordinalize # => "-1001st" + def ordinalize + ActiveSupport::Inflector.ordinalize(self) + end + + # Ordinal returns the suffix used to denote the position + # in an ordered sequence such as 1st, 2nd, 3rd, 4th. + # + # 1.ordinal # => "st" + # 2.ordinal # => "nd" + # 1002.ordinal # => "nd" + # 1003.ordinal # => "rd" + # -11.ordinal # => "th" + # -1001.ordinal # => "st" + def ordinal + ActiveSupport::Inflector.ordinal(self) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer/multiple.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer/multiple.rb new file mode 100644 index 000000000000..bd57a909c55b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer/multiple.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class Integer + # Check whether the integer is evenly divisible by the argument. + # + # 0.multiple_of?(0) # => true + # 6.multiple_of?(5) # => false + # 10.multiple_of?(2) # => true + def multiple_of?(number) + number == 0 ? self == 0 : self % number == 0 + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer/time.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer/time.rb new file mode 100644 index 000000000000..5efb89cf9f8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/integer/time.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require "active_support/duration" +require "active_support/core_ext/numeric/time" + +class Integer + # Returns a Duration instance matching the number of months provided. + # + # 2.months # => 2 months + def months + ActiveSupport::Duration.months(self) + end + alias :month :months + + # Returns a Duration instance matching the number of years provided. + # + # 2.years # => 2 years + def years + ActiveSupport::Duration.years(self) + end + alias :year :years +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel.rb new file mode 100644 index 000000000000..7708069301d7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "active_support/core_ext/kernel/concern" +require "active_support/core_ext/kernel/reporting" +require "active_support/core_ext/kernel/singleton_class" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel/concern.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel/concern.rb new file mode 100644 index 000000000000..0b2baed78073 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel/concern.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/concerning" + +module Kernel + module_function + + # A shortcut to define a toplevel concern, not within a module. + # + # See Module::Concerning for more. + def concern(topic, &module_definition) + Object.concern topic, &module_definition + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel/reporting.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel/reporting.rb new file mode 100644 index 000000000000..9155bd6c10a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel/reporting.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module Kernel + module_function + + # Sets $VERBOSE to +nil+ for the duration of the block and back to its original + # value afterwards. + # + # silence_warnings do + # value = noisy_call # no warning voiced + # end + # + # noisy_call # warning voiced + def silence_warnings + with_warnings(nil) { yield } + end + + # Sets $VERBOSE to +true+ for the duration of the block and back to its + # original value afterwards. + def enable_warnings + with_warnings(true) { yield } + end + + # Sets $VERBOSE for the duration of the block and back to its original + # value afterwards. + def with_warnings(flag) + old_verbose, $VERBOSE = $VERBOSE, flag + yield + ensure + $VERBOSE = old_verbose + end + + # Blocks and ignores any exception passed as argument if raised within the block. + # + # suppress(ZeroDivisionError) do + # 1/0 + # puts 'This code is NOT reached' + # end + # + # puts 'This code gets executed and nothing related to ZeroDivisionError was seen' + def suppress(*exception_classes) + yield + rescue *exception_classes + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel/singleton_class.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel/singleton_class.rb new file mode 100644 index 000000000000..6715eba80a0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/kernel/singleton_class.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +module Kernel + # class_eval on an object acts like singleton_class.class_eval. + def class_eval(*args, &block) + singleton_class.class_eval(*args, &block) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/load_error.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/load_error.rb new file mode 100644 index 000000000000..b81ed0605e04 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/load_error.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class LoadError + # Returns true if the given path name (except perhaps for the ".rb" + # extension) is the missing file which caused the exception to be raised. + def is_missing?(location) + location.sub(/\.rb$/, "") == path.to_s.sub(/\.rb$/, "") + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/marshal.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/marshal.rb new file mode 100644 index 000000000000..0c72cd7b470b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/marshal.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module ActiveSupport + module MarshalWithAutoloading # :nodoc: + def load(source, proc = nil) + super(source, proc) + rescue ArgumentError, NameError => exc + if exc.message.match(%r|undefined class/module (.+?)(?:::)?\z|) + # try loading the class/module + loaded = $1.constantize + + raise unless $1 == loaded.name + + # if it is an IO we need to go back to read the object + source.rewind if source.respond_to?(:rewind) + retry + else + raise exc + end + end + end +end + +Marshal.singleton_class.prepend(ActiveSupport::MarshalWithAutoloading) diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module.rb new file mode 100644 index 000000000000..542af98c04f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/aliasing" +require "active_support/core_ext/module/introspection" +require "active_support/core_ext/module/anonymous" +require "active_support/core_ext/module/attribute_accessors" +require "active_support/core_ext/module/attribute_accessors_per_thread" +require "active_support/core_ext/module/attr_internal" +require "active_support/core_ext/module/concerning" +require "active_support/core_ext/module/delegation" +require "active_support/core_ext/module/deprecation" +require "active_support/core_ext/module/redefine_method" +require "active_support/core_ext/module/remove_method" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/aliasing.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/aliasing.rb new file mode 100644 index 000000000000..6f64d1162719 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/aliasing.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +class Module + # Allows you to make aliases for attributes, which includes + # getter, setter, and a predicate. + # + # class Content < ActiveRecord::Base + # # has a title attribute + # end + # + # class Email < Content + # alias_attribute :subject, :title + # end + # + # e = Email.find(1) + # e.title # => "Superstars" + # e.subject # => "Superstars" + # e.subject? # => true + # e.subject = "Megastars" + # e.title # => "Megastars" + def alias_attribute(new_name, old_name) + # The following reader methods use an explicit `self` receiver in order to + # support aliases that start with an uppercase letter. Otherwise, they would + # be resolved as constants instead. + module_eval <<-STR, __FILE__, __LINE__ + 1 + def #{new_name}; self.#{old_name}; end # def subject; self.title; end + def #{new_name}?; self.#{old_name}?; end # def subject?; self.title?; end + def #{new_name}=(v); self.#{old_name} = v; end # def subject=(v); self.title = v; end + STR + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/anonymous.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/anonymous.rb new file mode 100644 index 000000000000..d1c86b8722d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/anonymous.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class Module + # A module may or may not have a name. + # + # module M; end + # M.name # => "M" + # + # m = Module.new + # m.name # => nil + # + # +anonymous?+ method returns true if module does not have a name, false otherwise: + # + # Module.new.anonymous? # => true + # + # module M; end + # M.anonymous? # => false + # + # A module gets a name when it is first assigned to a constant. Either + # via the +module+ or +class+ keyword or by an explicit assignment: + # + # m = Module.new # creates an anonymous module + # m.anonymous? # => true + # M = m # m gets a name here as a side-effect + # m.name # => "M" + # m.anonymous? # => false + def anonymous? + name.nil? + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/attr_internal.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/attr_internal.rb new file mode 100644 index 000000000000..7801f6d181f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/attr_internal.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +class Module + # Declares an attribute reader backed by an internally-named instance variable. + def attr_internal_reader(*attrs) + attrs.each { |attr_name| attr_internal_define(attr_name, :reader) } + end + + # Declares an attribute writer backed by an internally-named instance variable. + def attr_internal_writer(*attrs) + attrs.each { |attr_name| attr_internal_define(attr_name, :writer) } + end + + # Declares an attribute reader and writer backed by an internally-named instance + # variable. + def attr_internal_accessor(*attrs) + attr_internal_reader(*attrs) + attr_internal_writer(*attrs) + end + alias_method :attr_internal, :attr_internal_accessor + + class << self; attr_accessor :attr_internal_naming_format end + self.attr_internal_naming_format = "@_%s" + + private + def attr_internal_ivar_name(attr) + Module.attr_internal_naming_format % attr + end + + def attr_internal_define(attr_name, type) + internal_name = attr_internal_ivar_name(attr_name).sub(/\A@/, "") + # use native attr_* methods as they are faster on some Ruby implementations + send("attr_#{type}", internal_name) + attr_name, internal_name = "#{attr_name}=", "#{internal_name}=" if type == :writer + alias_method attr_name, internal_name + remove_method internal_name + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/attribute_accessors.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/attribute_accessors.rb new file mode 100644 index 000000000000..cc1926e022a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/attribute_accessors.rb @@ -0,0 +1,212 @@ +# frozen_string_literal: true + +# Extends the module object with class/module and instance accessors for +# class/module attributes, just like the native attr* accessors for instance +# attributes. +class Module + # Defines a class attribute and creates a class and instance reader methods. + # The underlying class variable is set to +nil+, if it is not previously + # defined. All class and instance methods created will be public, even if + # this method is called with a private or protected access modifier. + # + # module HairColors + # mattr_reader :hair_colors + # end + # + # HairColors.hair_colors # => nil + # HairColors.class_variable_set("@@hair_colors", [:brown, :black]) + # HairColors.hair_colors # => [:brown, :black] + # + # The attribute name must be a valid method name in Ruby. + # + # module Foo + # mattr_reader :"1_Badname" + # end + # # => NameError: invalid attribute name: 1_Badname + # + # To omit the instance reader method, pass + # instance_reader: false or instance_accessor: false. + # + # module HairColors + # mattr_reader :hair_colors, instance_reader: false + # end + # + # class Person + # include HairColors + # end + # + # Person.new.hair_colors # => NoMethodError + # + # You can set a default value for the attribute. + # + # module HairColors + # mattr_reader :hair_colors, default: [:brown, :black, :blonde, :red] + # end + # + # class Person + # include HairColors + # end + # + # Person.new.hair_colors # => [:brown, :black, :blonde, :red] + def mattr_reader(*syms, instance_reader: true, instance_accessor: true, default: nil) + syms.each do |sym| + raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym) + class_eval(<<-EOS, __FILE__, __LINE__ + 1) + @@#{sym} = nil unless defined? @@#{sym} + + def self.#{sym} + @@#{sym} + end + EOS + + if instance_reader && instance_accessor + class_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{sym} + @@#{sym} + end + EOS + end + + sym_default_value = (block_given? && default.nil?) ? yield : default + class_variable_set("@@#{sym}", sym_default_value) unless sym_default_value.nil? + end + end + alias :cattr_reader :mattr_reader + + # Defines a class attribute and creates a class and instance writer methods to + # allow assignment to the attribute. All class and instance methods created + # will be public, even if this method is called with a private or protected + # access modifier. + # + # module HairColors + # mattr_writer :hair_colors + # end + # + # class Person + # include HairColors + # end + # + # HairColors.hair_colors = [:brown, :black] + # Person.class_variable_get("@@hair_colors") # => [:brown, :black] + # Person.new.hair_colors = [:blonde, :red] + # HairColors.class_variable_get("@@hair_colors") # => [:blonde, :red] + # + # To omit the instance writer method, pass + # instance_writer: false or instance_accessor: false. + # + # module HairColors + # mattr_writer :hair_colors, instance_writer: false + # end + # + # class Person + # include HairColors + # end + # + # Person.new.hair_colors = [:blonde, :red] # => NoMethodError + # + # You can set a default value for the attribute. + # + # module HairColors + # mattr_writer :hair_colors, default: [:brown, :black, :blonde, :red] + # end + # + # class Person + # include HairColors + # end + # + # Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red] + def mattr_writer(*syms, instance_writer: true, instance_accessor: true, default: nil) + syms.each do |sym| + raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym) + class_eval(<<-EOS, __FILE__, __LINE__ + 1) + @@#{sym} = nil unless defined? @@#{sym} + + def self.#{sym}=(obj) + @@#{sym} = obj + end + EOS + + if instance_writer && instance_accessor + class_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{sym}=(obj) + @@#{sym} = obj + end + EOS + end + + sym_default_value = (block_given? && default.nil?) ? yield : default + send("#{sym}=", sym_default_value) unless sym_default_value.nil? + end + end + alias :cattr_writer :mattr_writer + + # Defines both class and instance accessors for class attributes. + # All class and instance methods created will be public, even if + # this method is called with a private or protected access modifier. + # + # module HairColors + # mattr_accessor :hair_colors + # end + # + # class Person + # include HairColors + # end + # + # HairColors.hair_colors = [:brown, :black, :blonde, :red] + # HairColors.hair_colors # => [:brown, :black, :blonde, :red] + # Person.new.hair_colors # => [:brown, :black, :blonde, :red] + # + # If a subclass changes the value then that would also change the value for + # parent class. Similarly if parent class changes the value then that would + # change the value of subclasses too. + # + # class Citizen < Person + # end + # + # Citizen.new.hair_colors << :blue + # Person.new.hair_colors # => [:brown, :black, :blonde, :red, :blue] + # + # To omit the instance writer method, pass instance_writer: false. + # To omit the instance reader method, pass instance_reader: false. + # + # module HairColors + # mattr_accessor :hair_colors, instance_writer: false, instance_reader: false + # end + # + # class Person + # include HairColors + # end + # + # Person.new.hair_colors = [:brown] # => NoMethodError + # Person.new.hair_colors # => NoMethodError + # + # Or pass instance_accessor: false, to omit both instance methods. + # + # module HairColors + # mattr_accessor :hair_colors, instance_accessor: false + # end + # + # class Person + # include HairColors + # end + # + # Person.new.hair_colors = [:brown] # => NoMethodError + # Person.new.hair_colors # => NoMethodError + # + # You can set a default value for the attribute. + # + # module HairColors + # mattr_accessor :hair_colors, default: [:brown, :black, :blonde, :red] + # end + # + # class Person + # include HairColors + # end + # + # Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red] + def mattr_accessor(*syms, instance_reader: true, instance_writer: true, instance_accessor: true, default: nil, &blk) + mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor, default: default, &blk) + mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor, default: default) + end + alias :cattr_accessor :mattr_accessor +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb new file mode 100644 index 000000000000..a6e87aeb689c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb @@ -0,0 +1,144 @@ +# frozen_string_literal: true + +# Extends the module object with class/module and instance accessors for +# class/module attributes, just like the native attr* accessors for instance +# attributes, but does so on a per-thread basis. +# +# So the values are scoped within the Thread.current space under the class name +# of the module. +class Module + # Defines a per-thread class attribute and creates class and instance reader methods. + # The underlying per-thread class variable is set to +nil+, if it is not previously defined. + # + # module Current + # thread_mattr_reader :user + # end + # + # Current.user # => nil + # Thread.current[:attr_Current_user] = "DHH" + # Current.user # => "DHH" + # + # The attribute name must be a valid method name in Ruby. + # + # module Foo + # thread_mattr_reader :"1_Badname" + # end + # # => NameError: invalid attribute name: 1_Badname + # + # To omit the instance reader method, pass + # instance_reader: false or instance_accessor: false. + # + # class Current + # thread_mattr_reader :user, instance_reader: false + # end + # + # Current.new.user # => NoMethodError + def thread_mattr_reader(*syms, instance_reader: true, instance_accessor: true) # :nodoc: + syms.each do |sym| + raise NameError.new("invalid attribute name: #{sym}") unless /^[_A-Za-z]\w*$/.match?(sym) + + # The following generated method concatenates `name` because we want it + # to work with inheritance via polymorphism. + class_eval(<<-EOS, __FILE__, __LINE__ + 1) + def self.#{sym} + Thread.current["attr_" + name + "_#{sym}"] + end + EOS + + if instance_reader && instance_accessor + class_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{sym} + self.class.#{sym} + end + EOS + end + end + end + alias :thread_cattr_reader :thread_mattr_reader + + # Defines a per-thread class attribute and creates a class and instance writer methods to + # allow assignment to the attribute. + # + # module Current + # thread_mattr_writer :user + # end + # + # Current.user = "DHH" + # Thread.current[:attr_Current_user] # => "DHH" + # + # To omit the instance writer method, pass + # instance_writer: false or instance_accessor: false. + # + # class Current + # thread_mattr_writer :user, instance_writer: false + # end + # + # Current.new.user = "DHH" # => NoMethodError + def thread_mattr_writer(*syms, instance_writer: true, instance_accessor: true) # :nodoc: + syms.each do |sym| + raise NameError.new("invalid attribute name: #{sym}") unless /^[_A-Za-z]\w*$/.match?(sym) + + # The following generated method concatenates `name` because we want it + # to work with inheritance via polymorphism. + class_eval(<<-EOS, __FILE__, __LINE__ + 1) + def self.#{sym}=(obj) + Thread.current["attr_" + name + "_#{sym}"] = obj + end + EOS + + if instance_writer && instance_accessor + class_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{sym}=(obj) + self.class.#{sym} = obj + end + EOS + end + end + end + alias :thread_cattr_writer :thread_mattr_writer + + # Defines both class and instance accessors for class attributes. + # + # class Account + # thread_mattr_accessor :user + # end + # + # Account.user = "DHH" + # Account.user # => "DHH" + # Account.new.user # => "DHH" + # + # If a subclass changes the value, the parent class' value is not changed. + # Similarly, if the parent class changes the value, the value of subclasses + # is not changed. + # + # class Customer < Account + # end + # + # Customer.user = "Rafael" + # Customer.user # => "Rafael" + # Account.user # => "DHH" + # + # To omit the instance writer method, pass instance_writer: false. + # To omit the instance reader method, pass instance_reader: false. + # + # class Current + # thread_mattr_accessor :user, instance_writer: false, instance_reader: false + # end + # + # Current.new.user = "DHH" # => NoMethodError + # Current.new.user # => NoMethodError + # + # Or pass instance_accessor: false, to omit both instance methods. + # + # class Current + # thread_mattr_accessor :user, instance_accessor: false + # end + # + # Current.new.user = "DHH" # => NoMethodError + # Current.new.user # => NoMethodError + def thread_mattr_accessor(*syms, instance_reader: true, instance_writer: true, instance_accessor: true) + thread_mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor) + thread_mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor) + end + alias :thread_cattr_accessor :thread_mattr_accessor +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/concerning.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/concerning.rb new file mode 100644 index 000000000000..7bbbf321abc4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/concerning.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true + +require "active_support/concern" + +class Module + # = Bite-sized separation of concerns + # + # We often find ourselves with a medium-sized chunk of behavior that we'd + # like to extract, but only mix in to a single class. + # + # Extracting a plain old Ruby object to encapsulate it and collaborate or + # delegate to the original object is often a good choice, but when there's + # no additional state to encapsulate or we're making DSL-style declarations + # about the parent class, introducing new collaborators can obfuscate rather + # than simplify. + # + # The typical route is to just dump everything in a monolithic class, perhaps + # with a comment, as a least-bad alternative. Using modules in separate files + # means tedious sifting to get a big-picture view. + # + # = Dissatisfying ways to separate small concerns + # + # == Using comments: + # + # class Todo < ApplicationRecord + # # Other todo implementation + # # ... + # + # ## Event tracking + # has_many :events + # + # before_create :track_creation + # + # private + # def track_creation + # # ... + # end + # end + # + # == With an inline module: + # + # Noisy syntax. + # + # class Todo < ApplicationRecord + # # Other todo implementation + # # ... + # + # module EventTracking + # extend ActiveSupport::Concern + # + # included do + # has_many :events + # before_create :track_creation + # end + # + # private + # def track_creation + # # ... + # end + # end + # include EventTracking + # end + # + # == Mix-in noise exiled to its own file: + # + # Once our chunk of behavior starts pushing the scroll-to-understand-it + # boundary, we give in and move it to a separate file. At this size, the + # increased overhead can be a reasonable tradeoff even if it reduces our + # at-a-glance perception of how things work. + # + # class Todo < ApplicationRecord + # # Other todo implementation + # # ... + # + # include TodoEventTracking + # end + # + # = Introducing Module#concerning + # + # By quieting the mix-in noise, we arrive at a natural, low-ceremony way to + # separate bite-sized concerns. + # + # class Todo < ApplicationRecord + # # Other todo implementation + # # ... + # + # concerning :EventTracking do + # included do + # has_many :events + # before_create :track_creation + # end + # + # private + # def track_creation + # # ... + # end + # end + # end + # + # Todo.ancestors + # # => [Todo, Todo::EventTracking, ApplicationRecord, Object] + # + # This small step has some wonderful ripple effects. We can + # * grok the behavior of our class in one glance, + # * clean up monolithic junk-drawer classes by separating their concerns, and + # * stop leaning on protected/private for crude "this is internal stuff" modularity. + module Concerning + # Define a new concern and mix it in. + def concerning(topic, &block) + include concern(topic, &block) + end + + # A low-cruft shortcut to define a concern. + # + # concern :EventTracking do + # ... + # end + # + # is equivalent to + # + # module EventTracking + # extend ActiveSupport::Concern + # + # ... + # end + def concern(topic, &module_definition) + const_set topic, Module.new { + extend ::ActiveSupport::Concern + module_eval(&module_definition) + } + end + end + include Concerning +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/delegation.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/delegation.rb new file mode 100644 index 000000000000..893e3aff54db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/delegation.rb @@ -0,0 +1,320 @@ +# frozen_string_literal: true + +require "set" + +class Module + # Error generated by +delegate+ when a method is called on +nil+ and +allow_nil+ + # option is not used. + class DelegationError < NoMethodError; end + + RUBY_RESERVED_KEYWORDS = %w(alias and BEGIN begin break case class def defined? do + else elsif END end ensure false for if in module next nil not or redo rescue retry + return self super then true undef unless until when while yield) + DELEGATION_RESERVED_KEYWORDS = %w(_ arg args block) + DELEGATION_RESERVED_METHOD_NAMES = Set.new( + RUBY_RESERVED_KEYWORDS + DELEGATION_RESERVED_KEYWORDS + ).freeze + + # Provides a +delegate+ class method to easily expose contained objects' + # public methods as your own. + # + # ==== Options + # * :to - Specifies the target object name as a symbol or string + # * :prefix - Prefixes the new method with the target name or a custom prefix + # * :allow_nil - If set to true, prevents a +Module::DelegationError+ + # from being raised + # * :private - If set to true, changes method visibility to private + # + # The macro receives one or more method names (specified as symbols or + # strings) and the name of the target object via the :to option + # (also a symbol or string). + # + # Delegation is particularly useful with Active Record associations: + # + # class Greeter < ActiveRecord::Base + # def hello + # 'hello' + # end + # + # def goodbye + # 'goodbye' + # end + # end + # + # class Foo < ActiveRecord::Base + # belongs_to :greeter + # delegate :hello, to: :greeter + # end + # + # Foo.new.hello # => "hello" + # Foo.new.goodbye # => NoMethodError: undefined method `goodbye' for # + # + # Multiple delegates to the same target are allowed: + # + # class Foo < ActiveRecord::Base + # belongs_to :greeter + # delegate :hello, :goodbye, to: :greeter + # end + # + # Foo.new.goodbye # => "goodbye" + # + # Methods can be delegated to instance variables, class variables, or constants + # by providing them as a symbols: + # + # class Foo + # CONSTANT_ARRAY = [0,1,2,3] + # @@class_array = [4,5,6,7] + # + # def initialize + # @instance_array = [8,9,10,11] + # end + # delegate :sum, to: :CONSTANT_ARRAY + # delegate :min, to: :@@class_array + # delegate :max, to: :@instance_array + # end + # + # Foo.new.sum # => 6 + # Foo.new.min # => 4 + # Foo.new.max # => 11 + # + # It's also possible to delegate a method to the class by using +:class+: + # + # class Foo + # def self.hello + # "world" + # end + # + # delegate :hello, to: :class + # end + # + # Foo.new.hello # => "world" + # + # Delegates can optionally be prefixed using the :prefix option. If the value + # is true, the delegate methods are prefixed with the name of the object being + # delegated to. + # + # Person = Struct.new(:name, :address) + # + # class Invoice < Struct.new(:client) + # delegate :name, :address, to: :client, prefix: true + # end + # + # john_doe = Person.new('John Doe', 'Vimmersvej 13') + # invoice = Invoice.new(john_doe) + # invoice.client_name # => "John Doe" + # invoice.client_address # => "Vimmersvej 13" + # + # It is also possible to supply a custom prefix. + # + # class Invoice < Struct.new(:client) + # delegate :name, :address, to: :client, prefix: :customer + # end + # + # invoice = Invoice.new(john_doe) + # invoice.customer_name # => 'John Doe' + # invoice.customer_address # => 'Vimmersvej 13' + # + # The delegated methods are public by default. + # Pass private: true to change that. + # + # class User < ActiveRecord::Base + # has_one :profile + # delegate :first_name, to: :profile + # delegate :date_of_birth, to: :profile, private: true + # + # def age + # Date.today.year - date_of_birth.year + # end + # end + # + # User.new.first_name # => "Tomas" + # User.new.date_of_birth # => NoMethodError: private method `date_of_birth' called for # + # User.new.age # => 2 + # + # If the target is +nil+ and does not respond to the delegated method a + # +Module::DelegationError+ is raised. If you wish to instead return +nil+, + # use the :allow_nil option. + # + # class User < ActiveRecord::Base + # has_one :profile + # delegate :age, to: :profile + # end + # + # User.new.age + # # => Module::DelegationError: User#age delegated to profile.age, but profile is nil + # + # But if not having a profile yet is fine and should not be an error + # condition: + # + # class User < ActiveRecord::Base + # has_one :profile + # delegate :age, to: :profile, allow_nil: true + # end + # + # User.new.age # nil + # + # Note that if the target is not +nil+ then the call is attempted regardless of the + # :allow_nil option, and thus an exception is still raised if said object + # does not respond to the method: + # + # class Foo + # def initialize(bar) + # @bar = bar + # end + # + # delegate :name, to: :@bar, allow_nil: true + # end + # + # Foo.new("Bar").name # raises NoMethodError: undefined method `name' + # + # The target method must be public, otherwise it will raise +NoMethodError+. + def delegate(*methods, to: nil, prefix: nil, allow_nil: nil, private: nil) + unless to + raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, to: :greeter)." + end + + if prefix == true && /^[^a-z_]/.match?(to) + raise ArgumentError, "Can only automatically set the delegation prefix when delegating to a method." + end + + method_prefix = \ + if prefix + "#{prefix == true ? to : prefix}_" + else + "" + end + + location = caller_locations(1, 1).first + file, line = location.path, location.lineno + + to = to.to_s + to = "self.#{to}" if DELEGATION_RESERVED_METHOD_NAMES.include?(to) + + method_names = methods.map do |method| + # Attribute writer methods only accept one argument. Makes sure []= + # methods still accept two arguments. + definition = if /[^\]]=$/.match?(method) + "arg" + elsif RUBY_VERSION >= "2.7" + "..." + else + "*args, &block" + end + + # The following generated method calls the target exactly once, storing + # the returned value in a dummy variable. + # + # Reason is twofold: On one hand doing less calls is in general better. + # On the other hand it could be that the target has side-effects, + # whereas conceptually, from the user point of view, the delegator should + # be doing one call. + if allow_nil + method_def = [ + "def #{method_prefix}#{method}(#{definition})", + "_ = #{to}", + "if !_.nil? || nil.respond_to?(:#{method})", + " _.#{method}(#{definition})", + "end", + "end" + ].join ";" + else + exception = %(raise DelegationError, "#{self}##{method_prefix}#{method} delegated to #{to}.#{method}, but #{to} is nil: \#{self.inspect}") + + method_def = [ + "def #{method_prefix}#{method}(#{definition})", + " _ = #{to}", + " _.#{method}(#{definition})", + "rescue NoMethodError => e", + " if _.nil? && e.name == :#{method}", + " #{exception}", + " else", + " raise", + " end", + "end" + ].join ";" + end + + module_eval(method_def, file, line) + end + + private(*method_names) if private + method_names + end + + # When building decorators, a common pattern may emerge: + # + # class Partition + # def initialize(event) + # @event = event + # end + # + # def person + # detail.person || creator + # end + # + # private + # def respond_to_missing?(name, include_private = false) + # @event.respond_to?(name, include_private) + # end + # + # def method_missing(method, *args, &block) + # @event.send(method, *args, &block) + # end + # end + # + # With Module#delegate_missing_to, the above is condensed to: + # + # class Partition + # delegate_missing_to :@event + # + # def initialize(event) + # @event = event + # end + # + # def person + # detail.person || creator + # end + # end + # + # The target can be anything callable within the object, e.g. instance + # variables, methods, constants, etc. + # + # The delegated method must be public on the target, otherwise it will + # raise +NoMethodError+. + # + # The marshal_dump and _dump methods are exempt from + # delegation due to possible interference when calling + # Marshal.dump(object), should the delegation target method + # of object add or remove instance variables. + def delegate_missing_to(target) + target = target.to_s + target = "self.#{target}" if DELEGATION_RESERVED_METHOD_NAMES.include?(target) + + module_eval <<-RUBY, __FILE__, __LINE__ + 1 + def respond_to_missing?(name, include_private = false) + # It may look like an oversight, but we deliberately do not pass + # +include_private+, because they do not get delegated. + + return false if name == :marshal_dump || name == :_dump + #{target}.respond_to?(name) || super + end + + def method_missing(method, *args, &block) + if #{target}.respond_to?(method) + #{target}.public_send(method, *args, &block) + else + begin + super + rescue NoMethodError + if #{target}.nil? + raise DelegationError, "\#{method} delegated to #{target}, but #{target} is nil" + else + raise + end + end + end + end + ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true) + RUBY + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/deprecation.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/deprecation.rb new file mode 100644 index 000000000000..71c42eb3575c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/deprecation.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class Module + # deprecate :foo + # deprecate bar: 'message' + # deprecate :foo, :bar, baz: 'warning!', qux: 'gone!' + # + # You can also use custom deprecator instance: + # + # deprecate :foo, deprecator: MyLib::Deprecator.new + # deprecate :foo, bar: "warning!", deprecator: MyLib::Deprecator.new + # + # \Custom deprecators must respond to deprecation_warning(deprecated_method_name, message, caller_backtrace) + # method where you can implement your custom warning behavior. + # + # class MyLib::Deprecator + # def deprecation_warning(deprecated_method_name, message, caller_backtrace = nil) + # message = "#{deprecated_method_name} is deprecated and will be removed from MyLibrary | #{message}" + # Kernel.warn message + # end + # end + def deprecate(*method_names) + ActiveSupport::Deprecation.deprecate_methods(self, *method_names) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/introspection.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/introspection.rb new file mode 100644 index 000000000000..aff8c2f3ce37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/introspection.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +require "active_support/core_ext/string/filters" +require "active_support/inflector" + +class Module + # Returns the name of the module containing this one. + # + # M::N.module_parent_name # => "M" + def module_parent_name + if defined?(@parent_name) + @parent_name + else + parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil + @parent_name = parent_name unless frozen? + parent_name + end + end + + def parent_name + ActiveSupport::Deprecation.warn(<<-MSG.squish) + `Module#parent_name` has been renamed to `module_parent_name`. + `parent_name` is deprecated and will be removed in Rails 6.1. + MSG + module_parent_name + end + + # Returns the module which contains this one according to its name. + # + # module M + # module N + # end + # end + # X = M::N + # + # M::N.module_parent # => M + # X.module_parent # => M + # + # The parent of top-level and anonymous modules is Object. + # + # M.module_parent # => Object + # Module.new.module_parent # => Object + def module_parent + module_parent_name ? ActiveSupport::Inflector.constantize(module_parent_name) : Object + end + + def parent + ActiveSupport::Deprecation.warn(<<-MSG.squish) + `Module#parent` has been renamed to `module_parent`. + `parent` is deprecated and will be removed in Rails 6.1. + MSG + module_parent + end + + # Returns all the parents of this module according to its name, ordered from + # nested outwards. The receiver is not contained within the result. + # + # module M + # module N + # end + # end + # X = M::N + # + # M.module_parents # => [Object] + # M::N.module_parents # => [M, Object] + # X.module_parents # => [M, Object] + def module_parents + parents = [] + if module_parent_name + parts = module_parent_name.split("::") + until parts.empty? + parents << ActiveSupport::Inflector.constantize(parts * "::") + parts.pop + end + end + parents << Object unless parents.include? Object + parents + end + + def parents + ActiveSupport::Deprecation.warn(<<-MSG.squish) + `Module#parents` has been renamed to `module_parents`. + `parents` is deprecated and will be removed in Rails 6.1. + MSG + module_parents + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/reachable.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/reachable.rb new file mode 100644 index 000000000000..2020f5204c96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/reachable.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/anonymous" +require "active_support/core_ext/string/inflections" + +ActiveSupport::Deprecation.warn("reachable is deprecated and will be removed from the framework.") diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/redefine_method.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/redefine_method.rb new file mode 100644 index 000000000000..5bd8e6e973a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/redefine_method.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +class Module + # Marks the named method as intended to be redefined, if it exists. + # Suppresses the Ruby method redefinition warning. Prefer + # #redefine_method where possible. + def silence_redefinition_of_method(method) + if method_defined?(method) || private_method_defined?(method) + # This suppresses the "method redefined" warning; the self-alias + # looks odd, but means we don't need to generate a unique name + alias_method method, method + end + end + + # Replaces the existing method definition, if there is one, with the passed + # block as its body. + def redefine_method(method, &block) + visibility = method_visibility(method) + silence_redefinition_of_method(method) + define_method(method, &block) + send(visibility, method) + end + + # Replaces the existing singleton method definition, if there is one, with + # the passed block as its body. + def redefine_singleton_method(method, &block) + singleton_class.redefine_method(method, &block) + end + + def method_visibility(method) # :nodoc: + case + when private_method_defined?(method) + :private + when protected_method_defined?(method) + :protected + else + :public + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/remove_method.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/remove_method.rb new file mode 100644 index 000000000000..97eb5f9eca69 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/module/remove_method.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/redefine_method" + +class Module + # Removes the named method, if it exists. + def remove_possible_method(method) + if method_defined?(method) || private_method_defined?(method) + undef_method(method) + end + end + + # Removes the named singleton method, if it exists. + def remove_possible_singleton_method(method) + singleton_class.remove_possible_method(method) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/name_error.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/name_error.rb new file mode 100644 index 000000000000..6d37cd9dfd6e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/name_error.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +class NameError + # Extract the name of the missing constant from the exception message. + # + # begin + # HelloWorld + # rescue NameError => e + # e.missing_name + # end + # # => "HelloWorld" + def missing_name + # Since ruby v2.3.0 `did_you_mean` gem is loaded by default. + # It extends NameError#message with spell corrections which are SLOW. + # We should use original_message message instead. + message = respond_to?(:original_message) ? original_message : self.message + + if /undefined local variable or method/ !~ message + $1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ message + end + end + + # Was this exception raised because the given name was missing? + # + # begin + # HelloWorld + # rescue NameError => e + # e.missing_name?("HelloWorld") + # end + # # => true + def missing_name?(name) + if name.is_a? Symbol + self.name == name + else + missing_name == name.to_s + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric.rb new file mode 100644 index 000000000000..fe778470f164 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "active_support/core_ext/numeric/bytes" +require "active_support/core_ext/numeric/time" +require "active_support/core_ext/numeric/conversions" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/bytes.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/bytes.rb new file mode 100644 index 000000000000..b002eba40690 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/bytes.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +class Numeric + KILOBYTE = 1024 + MEGABYTE = KILOBYTE * 1024 + GIGABYTE = MEGABYTE * 1024 + TERABYTE = GIGABYTE * 1024 + PETABYTE = TERABYTE * 1024 + EXABYTE = PETABYTE * 1024 + + # Enables the use of byte calculations and declarations, like 45.bytes + 2.6.megabytes + # + # 2.bytes # => 2 + def bytes + self + end + alias :byte :bytes + + # Returns the number of bytes equivalent to the kilobytes provided. + # + # 2.kilobytes # => 2048 + def kilobytes + self * KILOBYTE + end + alias :kilobyte :kilobytes + + # Returns the number of bytes equivalent to the megabytes provided. + # + # 2.megabytes # => 2_097_152 + def megabytes + self * MEGABYTE + end + alias :megabyte :megabytes + + # Returns the number of bytes equivalent to the gigabytes provided. + # + # 2.gigabytes # => 2_147_483_648 + def gigabytes + self * GIGABYTE + end + alias :gigabyte :gigabytes + + # Returns the number of bytes equivalent to the terabytes provided. + # + # 2.terabytes # => 2_199_023_255_552 + def terabytes + self * TERABYTE + end + alias :terabyte :terabytes + + # Returns the number of bytes equivalent to the petabytes provided. + # + # 2.petabytes # => 2_251_799_813_685_248 + def petabytes + self * PETABYTE + end + alias :petabyte :petabytes + + # Returns the number of bytes equivalent to the exabytes provided. + # + # 2.exabytes # => 2_305_843_009_213_693_952 + def exabytes + self * EXABYTE + end + alias :exabyte :exabytes +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/conversions.rb new file mode 100644 index 000000000000..8acad6164af1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/conversions.rb @@ -0,0 +1,136 @@ +# frozen_string_literal: true + +require "active_support/core_ext/big_decimal/conversions" +require "active_support/number_helper" +require "active_support/core_ext/module/deprecation" + +module ActiveSupport + module NumericWithFormat + # Provides options for converting numbers into formatted strings. + # Options are provided for phone numbers, currency, percentage, + # precision, positional notation, file size and pretty printing. + # + # ==== Options + # + # For details on which formats use which options, see ActiveSupport::NumberHelper + # + # ==== Examples + # + # Phone Numbers: + # 5551234.to_s(:phone) # => "555-1234" + # 1235551234.to_s(:phone) # => "123-555-1234" + # 1235551234.to_s(:phone, area_code: true) # => "(123) 555-1234" + # 1235551234.to_s(:phone, delimiter: ' ') # => "123 555 1234" + # 1235551234.to_s(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555" + # 1235551234.to_s(:phone, country_code: 1) # => "+1-123-555-1234" + # 1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.') + # # => "+1.123.555.1234 x 1343" + # + # Currency: + # 1234567890.50.to_s(:currency) # => "$1,234,567,890.50" + # 1234567890.506.to_s(:currency) # => "$1,234,567,890.51" + # 1234567890.506.to_s(:currency, precision: 3) # => "$1,234,567,890.506" + # 1234567890.506.to_s(:currency, locale: :fr) # => "1 234 567 890,51 €" + # -1234567890.50.to_s(:currency, negative_format: '(%u%n)') + # # => "($1,234,567,890.50)" + # 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '') + # # => "£1234567890,50" + # 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u') + # # => "1234567890,50 £" + # + # Percentage: + # 100.to_s(:percentage) # => "100.000%" + # 100.to_s(:percentage, precision: 0) # => "100%" + # 1000.to_s(:percentage, delimiter: '.', separator: ',') # => "1.000,000%" + # 302.24398923423.to_s(:percentage, precision: 5) # => "302.24399%" + # 1000.to_s(:percentage, locale: :fr) # => "1 000,000%" + # 100.to_s(:percentage, format: '%n %') # => "100.000 %" + # + # Delimited: + # 12345678.to_s(:delimited) # => "12,345,678" + # 12345678.05.to_s(:delimited) # => "12,345,678.05" + # 12345678.to_s(:delimited, delimiter: '.') # => "12.345.678" + # 12345678.to_s(:delimited, delimiter: ',') # => "12,345,678" + # 12345678.05.to_s(:delimited, separator: ' ') # => "12,345,678 05" + # 12345678.05.to_s(:delimited, locale: :fr) # => "12 345 678,05" + # 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',') + # # => "98 765 432,98" + # + # Rounded: + # 111.2345.to_s(:rounded) # => "111.235" + # 111.2345.to_s(:rounded, precision: 2) # => "111.23" + # 13.to_s(:rounded, precision: 5) # => "13.00000" + # 389.32314.to_s(:rounded, precision: 0) # => "389" + # 111.2345.to_s(:rounded, significant: true) # => "111" + # 111.2345.to_s(:rounded, precision: 1, significant: true) # => "100" + # 13.to_s(:rounded, precision: 5, significant: true) # => "13.000" + # 111.234.to_s(:rounded, locale: :fr) # => "111,234" + # 13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true) + # # => "13" + # 389.32314.to_s(:rounded, precision: 4, significant: true) # => "389.3" + # 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.') + # # => "1.111,23" + # + # Human-friendly size in Bytes: + # 123.to_s(:human_size) # => "123 Bytes" + # 1234.to_s(:human_size) # => "1.21 KB" + # 12345.to_s(:human_size) # => "12.1 KB" + # 1234567.to_s(:human_size) # => "1.18 MB" + # 1234567890.to_s(:human_size) # => "1.15 GB" + # 1234567890123.to_s(:human_size) # => "1.12 TB" + # 1234567890123456.to_s(:human_size) # => "1.1 PB" + # 1234567890123456789.to_s(:human_size) # => "1.07 EB" + # 1234567.to_s(:human_size, precision: 2) # => "1.2 MB" + # 483989.to_s(:human_size, precision: 2) # => "470 KB" + # 1234567.to_s(:human_size, precision: 2, separator: ',') # => "1,2 MB" + # 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB" + # 524288000.to_s(:human_size, precision: 5) # => "500 MB" + # + # Human-friendly format: + # 123.to_s(:human) # => "123" + # 1234.to_s(:human) # => "1.23 Thousand" + # 12345.to_s(:human) # => "12.3 Thousand" + # 1234567.to_s(:human) # => "1.23 Million" + # 1234567890.to_s(:human) # => "1.23 Billion" + # 1234567890123.to_s(:human) # => "1.23 Trillion" + # 1234567890123456.to_s(:human) # => "1.23 Quadrillion" + # 1234567890123456789.to_s(:human) # => "1230 Quadrillion" + # 489939.to_s(:human, precision: 2) # => "490 Thousand" + # 489939.to_s(:human, precision: 4) # => "489.9 Thousand" + # 1234567.to_s(:human, precision: 4, + # significant: false) # => "1.2346 Million" + # 1234567.to_s(:human, precision: 1, + # separator: ',', + # significant: false) # => "1,2 Million" + def to_s(format = nil, options = nil) + case format + when nil + super() + when Integer, String + super(format) + when :phone + ActiveSupport::NumberHelper.number_to_phone(self, options || {}) + when :currency + ActiveSupport::NumberHelper.number_to_currency(self, options || {}) + when :percentage + ActiveSupport::NumberHelper.number_to_percentage(self, options || {}) + when :delimited + ActiveSupport::NumberHelper.number_to_delimited(self, options || {}) + when :rounded + ActiveSupport::NumberHelper.number_to_rounded(self, options || {}) + when :human + ActiveSupport::NumberHelper.number_to_human(self, options || {}) + when :human_size + ActiveSupport::NumberHelper.number_to_human_size(self, options || {}) + when Symbol + super() + else + super(format) + end + end + end +end + +Integer.prepend ActiveSupport::NumericWithFormat +Float.prepend ActiveSupport::NumericWithFormat +BigDecimal.prepend ActiveSupport::NumericWithFormat diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/inquiry.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/inquiry.rb new file mode 100644 index 000000000000..6b5240d051fe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/inquiry.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "active_support/deprecation" + +ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Numeric#positive? and Numeric#negative? natively, so requiring active_support/core_ext/numeric/inquiry is no longer necessary. Requiring it will raise LoadError in Rails 6.1." diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/time.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/time.rb new file mode 100644 index 000000000000..bc4627f7a297 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/numeric/time.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require "active_support/duration" +require "active_support/core_ext/time/calculations" +require "active_support/core_ext/time/acts_like" +require "active_support/core_ext/date/calculations" +require "active_support/core_ext/date/acts_like" + +class Numeric + # Returns a Duration instance matching the number of seconds provided. + # + # 2.seconds # => 2 seconds + def seconds + ActiveSupport::Duration.seconds(self) + end + alias :second :seconds + + # Returns a Duration instance matching the number of minutes provided. + # + # 2.minutes # => 2 minutes + def minutes + ActiveSupport::Duration.minutes(self) + end + alias :minute :minutes + + # Returns a Duration instance matching the number of hours provided. + # + # 2.hours # => 2 hours + def hours + ActiveSupport::Duration.hours(self) + end + alias :hour :hours + + # Returns a Duration instance matching the number of days provided. + # + # 2.days # => 2 days + def days + ActiveSupport::Duration.days(self) + end + alias :day :days + + # Returns a Duration instance matching the number of weeks provided. + # + # 2.weeks # => 2 weeks + def weeks + ActiveSupport::Duration.weeks(self) + end + alias :week :weeks + + # Returns a Duration instance matching the number of fortnights provided. + # + # 2.fortnights # => 4 weeks + def fortnights + ActiveSupport::Duration.weeks(self * 2) + end + alias :fortnight :fortnights + + # Returns the number of milliseconds equivalent to the seconds provided. + # Used with the standard time durations. + # + # 2.in_milliseconds # => 2000 + # 1.hour.in_milliseconds # => 3600000 + def in_milliseconds + self * 1000 + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object.rb new file mode 100644 index 000000000000..efd34cc69209 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/acts_like" +require "active_support/core_ext/object/blank" +require "active_support/core_ext/object/duplicable" +require "active_support/core_ext/object/deep_dup" +require "active_support/core_ext/object/try" +require "active_support/core_ext/object/inclusion" + +require "active_support/core_ext/object/conversions" +require "active_support/core_ext/object/instance_variables" + +require "active_support/core_ext/object/json" +require "active_support/core_ext/object/to_param" +require "active_support/core_ext/object/to_query" +require "active_support/core_ext/object/with_options" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/acts_like.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/acts_like.rb new file mode 100644 index 000000000000..403ee20e398c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/acts_like.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class Object + # A duck-type assistant method. For example, Active Support extends Date + # to define an acts_like_date? method, and extends Time to define + # acts_like_time?. As a result, we can do x.acts_like?(:time) and + # x.acts_like?(:date) to do duck-type-safe comparisons, since classes that + # we want to act like Time simply need to define an acts_like_time? method. + def acts_like?(duck) + case duck + when :time + respond_to? :acts_like_time? + when :date + respond_to? :acts_like_date? + when :string + respond_to? :acts_like_string? + else + respond_to? :"acts_like_#{duck}?" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/blank.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/blank.rb new file mode 100644 index 000000000000..f36fef6cc91b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/blank.rb @@ -0,0 +1,155 @@ +# frozen_string_literal: true + +require "concurrent/map" + +class Object + # An object is blank if it's false, empty, or a whitespace string. + # For example, +nil+, '', ' ', [], {}, and +false+ are all blank. + # + # This simplifies + # + # !address || address.empty? + # + # to + # + # address.blank? + # + # @return [true, false] + def blank? + respond_to?(:empty?) ? !!empty? : !self + end + + # An object is present if it's not blank. + # + # @return [true, false] + def present? + !blank? + end + + # Returns the receiver if it's present otherwise returns +nil+. + # object.presence is equivalent to + # + # object.present? ? object : nil + # + # For example, something like + # + # state = params[:state] if params[:state].present? + # country = params[:country] if params[:country].present? + # region = state || country || 'US' + # + # becomes + # + # region = params[:state].presence || params[:country].presence || 'US' + # + # @return [Object] + def presence + self if present? + end +end + +class NilClass + # +nil+ is blank: + # + # nil.blank? # => true + # + # @return [true] + def blank? + true + end +end + +class FalseClass + # +false+ is blank: + # + # false.blank? # => true + # + # @return [true] + def blank? + true + end +end + +class TrueClass + # +true+ is not blank: + # + # true.blank? # => false + # + # @return [false] + def blank? + false + end +end + +class Array + # An array is blank if it's empty: + # + # [].blank? # => true + # [1,2,3].blank? # => false + # + # @return [true, false] + alias_method :blank?, :empty? +end + +class Hash + # A hash is blank if it's empty: + # + # {}.blank? # => true + # { key: 'value' }.blank? # => false + # + # @return [true, false] + alias_method :blank?, :empty? +end + +class String + BLANK_RE = /\A[[:space:]]*\z/ + ENCODED_BLANKS = Concurrent::Map.new do |h, enc| + h[enc] = Regexp.new(BLANK_RE.source.encode(enc), BLANK_RE.options | Regexp::FIXEDENCODING) + end + + # A string is blank if it's empty or contains whitespaces only: + # + # ''.blank? # => true + # ' '.blank? # => true + # "\t\n\r".blank? # => true + # ' blah '.blank? # => false + # + # Unicode whitespace is supported: + # + # "\u00a0".blank? # => true + # + # @return [true, false] + def blank? + # The regexp that matches blank strings is expensive. For the case of empty + # strings we can speed up this method (~3.5x) with an empty? call. The + # penalty for the rest of strings is marginal. + empty? || + begin + BLANK_RE.match?(self) + rescue Encoding::CompatibilityError + ENCODED_BLANKS[self.encoding].match?(self) + end + end +end + +class Numeric #:nodoc: + # No number is blank: + # + # 1.blank? # => false + # 0.blank? # => false + # + # @return [false] + def blank? + false + end +end + +class Time #:nodoc: + # No Time is blank: + # + # Time.now.blank? # => false + # + # @return [false] + def blank? + false + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/conversions.rb new file mode 100644 index 000000000000..624fb8d77cec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/conversions.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/to_param" +require "active_support/core_ext/object/to_query" +require "active_support/core_ext/array/conversions" +require "active_support/core_ext/hash/conversions" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/deep_dup.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/deep_dup.rb new file mode 100644 index 000000000000..c66c5eb2d91e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/deep_dup.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/duplicable" + +class Object + # Returns a deep copy of object if it's duplicable. If it's + # not duplicable, returns +self+. + # + # object = Object.new + # dup = object.deep_dup + # dup.instance_variable_set(:@a, 1) + # + # object.instance_variable_defined?(:@a) # => false + # dup.instance_variable_defined?(:@a) # => true + def deep_dup + duplicable? ? dup : self + end +end + +class Array + # Returns a deep copy of array. + # + # array = [1, [2, 3]] + # dup = array.deep_dup + # dup[1][2] = 4 + # + # array[1][2] # => nil + # dup[1][2] # => 4 + def deep_dup + map(&:deep_dup) + end +end + +class Hash + # Returns a deep copy of hash. + # + # hash = { a: { b: 'b' } } + # dup = hash.deep_dup + # dup[:a][:c] = 'c' + # + # hash[:a][:c] # => nil + # dup[:a][:c] # => "c" + def deep_dup + hash = dup + each_pair do |key, value| + if key.frozen? && ::String === key + hash[key] = value.deep_dup + else + hash.delete(key) + hash[key.deep_dup] = value.deep_dup + end + end + hash + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/duplicable.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/duplicable.rb new file mode 100644 index 000000000000..3ebcdca02b73 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/duplicable.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +#-- +# Most objects are cloneable, but not all. For example you can't dup methods: +# +# method(:puts).dup # => TypeError: allocator undefined for Method +# +# Classes may signal their instances are not duplicable removing +dup+/+clone+ +# or raising exceptions from them. So, to dup an arbitrary object you normally +# use an optimistic approach and are ready to catch an exception, say: +# +# arbitrary_object.dup rescue object +# +# Rails dups objects in a few critical spots where they are not that arbitrary. +# That rescue is very expensive (like 40 times slower than a predicate), and it +# is often triggered. +# +# That's why we hardcode the following cases and check duplicable? instead of +# using that rescue idiom. +#++ +class Object + # Can you safely dup this object? + # + # False for method objects; + # true otherwise. + def duplicable? + true + end +end + +class Method + # Methods are not duplicable: + # + # method(:puts).duplicable? # => false + # method(:puts).dup # => TypeError: allocator undefined for Method + def duplicable? + false + end +end + +class UnboundMethod + # Unbound methods are not duplicable: + # + # method(:puts).unbind.duplicable? # => false + # method(:puts).unbind.dup # => TypeError: allocator undefined for UnboundMethod + def duplicable? + false + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/inclusion.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/inclusion.rb new file mode 100644 index 000000000000..6064e92f20ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/inclusion.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +class Object + # Returns true if this object is included in the argument. Argument must be + # any object which responds to +#include?+. Usage: + # + # characters = ["Konata", "Kagami", "Tsukasa"] + # "Konata".in?(characters) # => true + # + # This will throw an +ArgumentError+ if the argument doesn't respond + # to +#include?+. + def in?(another_object) + another_object.include?(self) + rescue NoMethodError + raise ArgumentError.new("The parameter passed to #in? must respond to #include?") + end + + # Returns the receiver if it's included in the argument otherwise returns +nil+. + # Argument must be any object which responds to +#include?+. Usage: + # + # params[:bucket_type].presence_in %w( project calendar ) + # + # This will throw an +ArgumentError+ if the argument doesn't respond to +#include?+. + # + # @return [Object] + def presence_in(another_object) + in?(another_object) ? self : nil + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/instance_variables.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/instance_variables.rb new file mode 100644 index 000000000000..12fdf840b528 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/instance_variables.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class Object + # Returns a hash with string keys that maps instance variable names without "@" to their + # corresponding values. + # + # class C + # def initialize(x, y) + # @x, @y = x, y + # end + # end + # + # C.new(0, 1).instance_values # => {"x" => 0, "y" => 1} + def instance_values + Hash[instance_variables.map { |name| [name[1..-1], instance_variable_get(name)] }] + end + + # Returns an array of instance variable names as strings including "@". + # + # class C + # def initialize(x, y) + # @x, @y = x, y + # end + # end + # + # C.new(0, 1).instance_variable_names # => ["@y", "@x"] + def instance_variable_names + instance_variables.map(&:to_s) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/json.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/json.rb new file mode 100644 index 000000000000..416059d17bc3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/json.rb @@ -0,0 +1,228 @@ +# frozen_string_literal: true + +# Hack to load json gem first so we can overwrite its to_json. +require "json" +require "bigdecimal" +require "uri/generic" +require "pathname" +require "active_support/core_ext/big_decimal/conversions" # for #to_s +require "active_support/core_ext/hash/except" +require "active_support/core_ext/hash/slice" +require "active_support/core_ext/object/instance_variables" +require "time" +require "active_support/core_ext/time/conversions" +require "active_support/core_ext/date_time/conversions" +require "active_support/core_ext/date/conversions" + +#-- +# The JSON gem adds a few modules to Ruby core classes containing :to_json definition, overwriting +# their default behavior. That said, we need to define the basic to_json method in all of them, +# otherwise they will always use to_json gem implementation, which is backwards incompatible in +# several cases (for instance, the JSON implementation for Hash does not work) with inheritance +# and consequently classes as ActiveSupport::OrderedHash cannot be serialized to json. +# +# On the other hand, we should avoid conflict with ::JSON.{generate,dump}(obj). Unfortunately, the +# JSON gem's encoder relies on its own to_json implementation to encode objects. Since it always +# passes a ::JSON::State object as the only argument to to_json, we can detect that and forward the +# calls to the original to_json method. +# +# It should be noted that when using ::JSON.{generate,dump} directly, ActiveSupport's encoder is +# bypassed completely. This means that as_json won't be invoked and the JSON gem will simply +# ignore any options it does not natively understand. This also means that ::JSON.{generate,dump} +# should give exactly the same results with or without active support. + +module ActiveSupport + module ToJsonWithActiveSupportEncoder # :nodoc: + def to_json(options = nil) + if options.is_a?(::JSON::State) + # Called from JSON.{generate,dump}, forward it to JSON gem's to_json + super(options) + else + # to_json is being invoked directly, use ActiveSupport's encoder + ActiveSupport::JSON.encode(self, options) + end + end + end +end + +[Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass, Enumerable].reverse_each do |klass| + klass.prepend(ActiveSupport::ToJsonWithActiveSupportEncoder) +end + +class Object + def as_json(options = nil) #:nodoc: + if respond_to?(:to_hash) + to_hash.as_json(options) + else + instance_values.as_json(options) + end + end +end + +class Struct #:nodoc: + def as_json(options = nil) + Hash[members.zip(values)].as_json(options) + end +end + +class TrueClass + def as_json(options = nil) #:nodoc: + self + end +end + +class FalseClass + def as_json(options = nil) #:nodoc: + self + end +end + +class NilClass + def as_json(options = nil) #:nodoc: + self + end +end + +class String + def as_json(options = nil) #:nodoc: + self + end +end + +class Symbol + def as_json(options = nil) #:nodoc: + to_s + end +end + +class Numeric + def as_json(options = nil) #:nodoc: + self + end +end + +class Float + # Encoding Infinity or NaN to JSON should return "null". The default returns + # "Infinity" or "NaN" which are not valid JSON. + def as_json(options = nil) #:nodoc: + finite? ? self : nil + end +end + +class BigDecimal + # A BigDecimal would be naturally represented as a JSON number. Most libraries, + # however, parse non-integer JSON numbers directly as floats. Clients using + # those libraries would get in general a wrong number and no way to recover + # other than manually inspecting the string with the JSON code itself. + # + # That's why a JSON string is returned. The JSON literal is not numeric, but + # if the other end knows by contract that the data is supposed to be a + # BigDecimal, it still has the chance to post-process the string and get the + # real value. + def as_json(options = nil) #:nodoc: + finite? ? to_s : nil + end +end + +class Regexp + def as_json(options = nil) #:nodoc: + to_s + end +end + +module Enumerable + def as_json(options = nil) #:nodoc: + to_a.as_json(options) + end +end + +class IO + def as_json(options = nil) #:nodoc: + to_s + end +end + +class Range + def as_json(options = nil) #:nodoc: + to_s + end +end + +class Array + def as_json(options = nil) #:nodoc: + map { |v| options ? v.as_json(options.dup) : v.as_json } + end +end + +class Hash + def as_json(options = nil) #:nodoc: + # create a subset of the hash by applying :only or :except + subset = if options + if attrs = options[:only] + slice(*Array(attrs)) + elsif attrs = options[:except] + except(*Array(attrs)) + else + self + end + else + self + end + + Hash[subset.map { |k, v| [k.to_s, options ? v.as_json(options.dup) : v.as_json] }] + end +end + +class Time + def as_json(options = nil) #:nodoc: + if ActiveSupport::JSON::Encoding.use_standard_json_time_format + xmlschema(ActiveSupport::JSON::Encoding.time_precision) + else + %(#{strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)}) + end + end +end + +class Date + def as_json(options = nil) #:nodoc: + if ActiveSupport::JSON::Encoding.use_standard_json_time_format + strftime("%Y-%m-%d") + else + strftime("%Y/%m/%d") + end + end +end + +class DateTime + def as_json(options = nil) #:nodoc: + if ActiveSupport::JSON::Encoding.use_standard_json_time_format + xmlschema(ActiveSupport::JSON::Encoding.time_precision) + else + strftime("%Y/%m/%d %H:%M:%S %z") + end + end +end + +class URI::Generic #:nodoc: + def as_json(options = nil) + to_s + end +end + +class Pathname #:nodoc: + def as_json(options = nil) + to_s + end +end + +class Process::Status #:nodoc: + def as_json(options = nil) + { exitstatus: exitstatus, pid: pid } + end +end + +class Exception + def as_json(options = nil) + to_s + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/to_param.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/to_param.rb new file mode 100644 index 000000000000..6d2bdd70f3c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/to_param.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/to_query" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/to_query.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/to_query.rb new file mode 100644 index 000000000000..bac6ff9c97c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/to_query.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +require "cgi" + +class Object + # Alias of to_s. + def to_param + to_s + end + + # Converts an object into a string suitable for use as a URL query string, + # using the given key as the param name. + def to_query(key) + "#{CGI.escape(key.to_param)}=#{CGI.escape(to_param.to_s)}" + end +end + +class NilClass + # Returns +self+. + def to_param + self + end +end + +class TrueClass + # Returns +self+. + def to_param + self + end +end + +class FalseClass + # Returns +self+. + def to_param + self + end +end + +class Array + # Calls to_param on all its elements and joins the result with + # slashes. This is used by url_for in Action Pack. + def to_param + collect(&:to_param).join "/" + end + + # Converts an array into a string suitable for use as a URL query string, + # using the given +key+ as the param name. + # + # ['Rails', 'coding'].to_query('hobbies') # => "hobbies%5B%5D=Rails&hobbies%5B%5D=coding" + def to_query(key) + prefix = "#{key}[]" + + if empty? + nil.to_query(prefix) + else + collect { |value| value.to_query(prefix) }.join "&" + end + end +end + +class Hash + # Returns a string representation of the receiver suitable for use as a URL + # query string: + # + # {name: 'David', nationality: 'Danish'}.to_query + # # => "name=David&nationality=Danish" + # + # An optional namespace can be passed to enclose key names: + # + # {name: 'David', nationality: 'Danish'}.to_query('user') + # # => "user%5Bname%5D=David&user%5Bnationality%5D=Danish" + # + # The string pairs "key=value" that conform the query string + # are sorted lexicographically in ascending order. + # + # This method is also aliased as +to_param+. + def to_query(namespace = nil) + query = collect do |key, value| + unless (value.is_a?(Hash) || value.is_a?(Array)) && value.empty? + value.to_query(namespace ? "#{namespace}[#{key}]" : key) + end + end.compact + + query.sort! unless namespace.to_s.include?("[]") + query.join("&") + end + + alias_method :to_param, :to_query +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/try.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/try.rb new file mode 100644 index 000000000000..d4b13fa41370 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/try.rb @@ -0,0 +1,158 @@ +# frozen_string_literal: true + +require "delegate" + +module ActiveSupport + module Tryable #:nodoc: + def try(method_name = nil, *args, &b) + if method_name.nil? && block_given? + if b.arity == 0 + instance_eval(&b) + else + yield self + end + elsif respond_to?(method_name) + public_send(method_name, *args, &b) + end + end + ruby2_keywords(:try) if respond_to?(:ruby2_keywords, true) + + def try!(method_name = nil, *args, &b) + if method_name.nil? && block_given? + if b.arity == 0 + instance_eval(&b) + else + yield self + end + else + public_send(method_name, *args, &b) + end + end + ruby2_keywords(:try!) if respond_to?(:ruby2_keywords, true) + end +end + +class Object + include ActiveSupport::Tryable + + ## + # :method: try + # + # :call-seq: + # try(*a, &b) + # + # Invokes the public method whose name goes as first argument just like + # +public_send+ does, except that if the receiver does not respond to it the + # call returns +nil+ rather than raising an exception. + # + # This method is defined to be able to write + # + # @person.try(:name) + # + # instead of + # + # @person.name if @person + # + # +try+ calls can be chained: + # + # @person.try(:spouse).try(:name) + # + # instead of + # + # @person.spouse.name if @person && @person.spouse + # + # +try+ will also return +nil+ if the receiver does not respond to the method: + # + # @person.try(:non_existing_method) # => nil + # + # instead of + # + # @person.non_existing_method if @person.respond_to?(:non_existing_method) # => nil + # + # +try+ returns +nil+ when called on +nil+ regardless of whether it responds + # to the method: + # + # nil.try(:to_i) # => nil, rather than 0 + # + # Arguments and blocks are forwarded to the method if invoked: + # + # @posts.try(:each_slice, 2) do |a, b| + # ... + # end + # + # The number of arguments in the signature must match. If the object responds + # to the method the call is attempted and +ArgumentError+ is still raised + # in case of argument mismatch. + # + # If +try+ is called without arguments it yields the receiver to a given + # block unless it is +nil+: + # + # @person.try do |p| + # ... + # end + # + # You can also call try with a block without accepting an argument, and the block + # will be instance_eval'ed instead: + # + # @person.try { upcase.truncate(50) } + # + # Please also note that +try+ is defined on +Object+. Therefore, it won't work + # with instances of classes that do not have +Object+ among their ancestors, + # like direct subclasses of +BasicObject+. + + ## + # :method: try! + # + # :call-seq: + # try!(*a, &b) + # + # Same as #try, but raises a +NoMethodError+ exception if the receiver is + # not +nil+ and does not implement the tried method. + # + # "a".try!(:upcase) # => "A" + # nil.try!(:upcase) # => nil + # 123.try!(:upcase) # => NoMethodError: undefined method `upcase' for 123:Integer +end + +class Delegator + include ActiveSupport::Tryable + + ## + # :method: try + # + # :call-seq: + # try(a*, &b) + # + # See Object#try + + ## + # :method: try! + # + # :call-seq: + # try!(a*, &b) + # + # See Object#try! +end + +class NilClass + # Calling +try+ on +nil+ always returns +nil+. + # It becomes especially helpful when navigating through associations that may return +nil+. + # + # nil.try(:name) # => nil + # + # Without +try+ + # @person && @person.children.any? && @person.children.first.name + # + # With +try+ + # @person.try(:children).try(:first).try(:name) + def try(method_name = nil, *args) + nil + end + + # Calling +try!+ on +nil+ always returns +nil+. + # + # nil.try!(:name) # => nil + def try!(method_name = nil, *args) + nil + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/with_options.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/with_options.rb new file mode 100644 index 000000000000..1d46add6e038 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/object/with_options.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +require "active_support/option_merger" + +class Object + # An elegant way to factor duplication out of options passed to a series of + # method calls. Each method called in the block, with the block variable as + # the receiver, will have its options merged with the default +options+ hash + # provided. Each method called on the block variable must take an options + # hash as its final argument. + # + # Without with_options, this code contains duplication: + # + # class Account < ActiveRecord::Base + # has_many :customers, dependent: :destroy + # has_many :products, dependent: :destroy + # has_many :invoices, dependent: :destroy + # has_many :expenses, dependent: :destroy + # end + # + # Using with_options, we can remove the duplication: + # + # class Account < ActiveRecord::Base + # with_options dependent: :destroy do |assoc| + # assoc.has_many :customers + # assoc.has_many :products + # assoc.has_many :invoices + # assoc.has_many :expenses + # end + # end + # + # It can also be used with an explicit receiver: + # + # I18n.with_options locale: user.locale, scope: 'newsletter' do |i18n| + # subject i18n.t :subject + # body i18n.t :body, user_name: user.name + # end + # + # When you don't pass an explicit receiver, it executes the whole block + # in merging options context: + # + # class Account < ActiveRecord::Base + # with_options dependent: :destroy do + # has_many :customers + # has_many :products + # has_many :invoices + # has_many :expenses + # end + # end + # + # with_options can also be nested since the call is forwarded to its receiver. + # + # NOTE: Each nesting level will merge inherited defaults in addition to their own. + # + # class Post < ActiveRecord::Base + # with_options if: :persisted?, length: { minimum: 50 } do + # validates :content, if: -> { content.present? } + # end + # end + # + # The code is equivalent to: + # + # validates :content, length: { minimum: 50 }, if: -> { content.present? } + # + # Hence the inherited default for +if+ key is ignored. + # + # NOTE: You cannot call class methods implicitly inside of with_options. + # You can access these methods using the class name instead: + # + # class Phone < ActiveRecord::Base + # enum phone_number_type: { home: 0, office: 1, mobile: 2 } + # + # with_options presence: true do + # validates :phone_number_type, inclusion: { in: Phone.phone_number_types.keys } + # end + # end + # + def with_options(options, &block) + option_merger = ActiveSupport::OptionMerger.new(self, options) + block.arity.zero? ? option_merger.instance_eval(&block) : block.call(option_merger) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range.rb new file mode 100644 index 000000000000..78814fd18961 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require "active_support/core_ext/range/conversions" +require "active_support/core_ext/range/compare_range" +require "active_support/core_ext/range/include_time_with_zone" +require "active_support/core_ext/range/overlaps" +require "active_support/core_ext/range/each" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/compare_range.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/compare_range.rb new file mode 100644 index 000000000000..d2c85d767913 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/compare_range.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +module ActiveSupport + module CompareWithRange + # Extends the default Range#=== to support range comparisons. + # (1..5) === (1..5) # => true + # (1..5) === (2..3) # => true + # (1..5) === (1...6) # => true + # (1..5) === (2..6) # => false + # + # The native Range#=== behavior is untouched. + # ('a'..'f') === ('c') # => true + # (5..9) === (11) # => false + # + # The given range must be fully bounded, with both start and end. + def ===(value) + if value.is_a?(::Range) + # 1...10 includes 1..9 but it does not include 1..10. + # 1..10 includes 1...11 but it does not include 1...12. + operator = exclude_end? && !value.exclude_end? ? :< : :<= + value_max = !exclude_end? && value.exclude_end? ? value.max : value.last + super(value.first) && (self.end.nil? || value_max.send(operator, last)) + else + super + end + end + + # Extends the default Range#include? to support range comparisons. + # (1..5).include?(1..5) # => true + # (1..5).include?(2..3) # => true + # (1..5).include?(1...6) # => true + # (1..5).include?(2..6) # => false + # + # The native Range#include? behavior is untouched. + # ('a'..'f').include?('c') # => true + # (5..9).include?(11) # => false + # + # The given range must be fully bounded, with both start and end. + def include?(value) + if value.is_a?(::Range) + # 1...10 includes 1..9 but it does not include 1..10. + # 1..10 includes 1...11 but it does not include 1...12. + operator = exclude_end? && !value.exclude_end? ? :< : :<= + value_max = !exclude_end? && value.exclude_end? ? value.max : value.last + super(value.first) && (self.end.nil? || value_max.send(operator, last)) + else + super + end + end + + # Extends the default Range#cover? to support range comparisons. + # (1..5).cover?(1..5) # => true + # (1..5).cover?(2..3) # => true + # (1..5).cover?(1...6) # => true + # (1..5).cover?(2..6) # => false + # + # The native Range#cover? behavior is untouched. + # ('a'..'f').cover?('c') # => true + # (5..9).cover?(11) # => false + # + # The given range must be fully bounded, with both start and end. + def cover?(value) + if value.is_a?(::Range) + # 1...10 covers 1..9 but it does not cover 1..10. + # 1..10 covers 1...11 but it does not cover 1...12. + operator = exclude_end? && !value.exclude_end? ? :< : :<= + value_max = !exclude_end? && value.exclude_end? ? value.max : value.last + super(value.first) && (self.end.nil? || value_max.send(operator, last)) + else + super + end + end + end +end + +Range.prepend(ActiveSupport::CompareWithRange) diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/conversions.rb new file mode 100644 index 000000000000..024e32db4054 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/conversions.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module ActiveSupport + module RangeWithFormat + RANGE_FORMATS = { + db: -> (start, stop) do + case start + when String then "BETWEEN '#{start}' AND '#{stop}'" + else + "BETWEEN '#{start.to_s(:db)}' AND '#{stop.to_s(:db)}'" + end + end + } + + # Convert range to a formatted string. See RANGE_FORMATS for predefined formats. + # + # range = (1..100) # => 1..100 + # + # range.to_s # => "1..100" + # range.to_s(:db) # => "BETWEEN '1' AND '100'" + # + # == Adding your own range formats to to_s + # You can add your own formats to the Range::RANGE_FORMATS hash. + # Use the format name as the hash key and a Proc instance. + # + # # config/initializers/range_formats.rb + # Range::RANGE_FORMATS[:short] = ->(start, stop) { "Between #{start.to_s(:db)} and #{stop.to_s(:db)}" } + def to_s(format = :default) + if formatter = RANGE_FORMATS[format] + formatter.call(first, last) + else + super() + end + end + + alias_method :to_default_s, :to_s + alias_method :to_formatted_s, :to_s + end +end + +Range.prepend(ActiveSupport::RangeWithFormat) diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/each.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/each.rb new file mode 100644 index 000000000000..2d86997edfc2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/each.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require "active_support/time_with_zone" + +module ActiveSupport + module EachTimeWithZone #:nodoc: + def each(&block) + ensure_iteration_allowed + super + end + + def step(n = 1, &block) + ensure_iteration_allowed + super + end + + private + def ensure_iteration_allowed + raise TypeError, "can't iterate from #{first.class}" if first.is_a?(TimeWithZone) + end + end +end + +Range.prepend(ActiveSupport::EachTimeWithZone) diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/include_range.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/include_range.rb new file mode 100644 index 000000000000..2da2c587a31f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/include_range.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require "active_support/deprecation" + +ActiveSupport::Deprecation.warn "You have required `active_support/core_ext/range/include_range`. " \ +"This file will be removed in Rails 6.1. You should require `active_support/core_ext/range/compare_range` " \ + "instead." + +require "active_support/core_ext/range/compare_range" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/include_time_with_zone.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/include_time_with_zone.rb new file mode 100644 index 000000000000..2b458717ec70 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/include_time_with_zone.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require "active_support/time_with_zone" + +module ActiveSupport + module IncludeTimeWithZone #:nodoc: + # Extends the default Range#include? to support ActiveSupport::TimeWithZone. + # + # (1.hour.ago..1.hour.from_now).include?(Time.current) # => true + # + def include?(value) + if self.begin.is_a?(TimeWithZone) + cover?(value) + elsif self.end.is_a?(TimeWithZone) + cover?(value) + else + super + end + end + end +end + +Range.prepend(ActiveSupport::IncludeTimeWithZone) diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/overlaps.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/overlaps.rb new file mode 100644 index 000000000000..f753607f8bbb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/range/overlaps.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class Range + # Compare two ranges and see if they overlap each other + # (1..5).overlaps?(4..6) # => true + # (1..5).overlaps?(7..9) # => false + def overlaps?(other) + cover?(other.first) || other.cover?(first) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/regexp.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/regexp.rb new file mode 100644 index 000000000000..d92943c7ae72 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/regexp.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class Regexp #:nodoc: + def multiline? + options & MULTILINE == MULTILINE + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/securerandom.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/securerandom.rb new file mode 100644 index 000000000000..ef812f7e1afe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/securerandom.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require "securerandom" + +module SecureRandom + BASE58_ALPHABET = ("0".."9").to_a + ("A".."Z").to_a + ("a".."z").to_a - ["0", "O", "I", "l"] + BASE36_ALPHABET = ("0".."9").to_a + ("a".."z").to_a + + # SecureRandom.base58 generates a random base58 string. + # + # The argument _n_ specifies the length of the random string to be generated. + # + # If _n_ is not specified or is +nil+, 16 is assumed. It may be larger in the future. + # + # The result may contain alphanumeric characters except 0, O, I and l. + # + # p SecureRandom.base58 # => "4kUgL2pdQMSCQtjE" + # p SecureRandom.base58(24) # => "77TMHrHJFvFDwodq8w7Ev2m7" + def self.base58(n = 16) + SecureRandom.random_bytes(n).unpack("C*").map do |byte| + idx = byte % 64 + idx = SecureRandom.random_number(58) if idx >= 58 + BASE58_ALPHABET[idx] + end.join + end + + # SecureRandom.base36 generates a random base36 string in lowercase. + # + # The argument _n_ specifies the length of the random string to be generated. + # + # If _n_ is not specified or is +nil+, 16 is assumed. It may be larger in the future. + # This method can be used over +base58+ if a deterministic case key is necessary. + # + # The result will contain alphanumeric characters in lowercase. + # + # p SecureRandom.base36 # => "4kugl2pdqmscqtje" + # p SecureRandom.base36(24) # => "77tmhrhjfvfdwodq8w7ev2m7" + def self.base36(n = 16) + SecureRandom.random_bytes(n).unpack("C*").map do |byte| + idx = byte % 64 + idx = SecureRandom.random_number(36) if idx >= 36 + BASE36_ALPHABET[idx] + end.join + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string.rb new file mode 100644 index 000000000000..757d15c51ae4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require "active_support/core_ext/string/conversions" +require "active_support/core_ext/string/filters" +require "active_support/core_ext/string/multibyte" +require "active_support/core_ext/string/starts_ends_with" +require "active_support/core_ext/string/inflections" +require "active_support/core_ext/string/access" +require "active_support/core_ext/string/behavior" +require "active_support/core_ext/string/output_safety" +require "active_support/core_ext/string/exclude" +require "active_support/core_ext/string/strip" +require "active_support/core_ext/string/inquiry" +require "active_support/core_ext/string/indent" +require "active_support/core_ext/string/zones" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/access.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/access.rb new file mode 100644 index 000000000000..4ca24028b041 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/access.rb @@ -0,0 +1,114 @@ +# frozen_string_literal: true + +class String + # If you pass a single integer, returns a substring of one character at that + # position. The first character of the string is at position 0, the next at + # position 1, and so on. If a range is supplied, a substring containing + # characters at offsets given by the range is returned. In both cases, if an + # offset is negative, it is counted from the end of the string. Returns +nil+ + # if the initial offset falls outside the string. Returns an empty string if + # the beginning of the range is greater than the end of the string. + # + # str = "hello" + # str.at(0) # => "h" + # str.at(1..3) # => "ell" + # str.at(-2) # => "l" + # str.at(-2..-1) # => "lo" + # str.at(5) # => nil + # str.at(5..-1) # => "" + # + # If a Regexp is given, the matching portion of the string is returned. + # If a String is given, that given string is returned if it occurs in + # the string. In both cases, +nil+ is returned if there is no match. + # + # str = "hello" + # str.at(/lo/) # => "lo" + # str.at(/ol/) # => nil + # str.at("lo") # => "lo" + # str.at("ol") # => nil + def at(position) + self[position] + end + + # Returns a substring from the given position to the end of the string. + # If the position is negative, it is counted from the end of the string. + # + # str = "hello" + # str.from(0) # => "hello" + # str.from(3) # => "lo" + # str.from(-2) # => "lo" + # + # You can mix it with +to+ method and do fun things like: + # + # str = "hello" + # str.from(0).to(-1) # => "hello" + # str.from(1).to(-2) # => "ell" + def from(position) + self[position..-1] + end + + # Returns a substring from the beginning of the string to the given position. + # If the position is negative, it is counted from the end of the string. + # + # str = "hello" + # str.to(0) # => "h" + # str.to(3) # => "hell" + # str.to(-2) # => "hell" + # + # You can mix it with +from+ method and do fun things like: + # + # str = "hello" + # str.from(0).to(-1) # => "hello" + # str.from(1).to(-2) # => "ell" + def to(position) + self[0..position] + end + + # Returns the first character. If a limit is supplied, returns a substring + # from the beginning of the string until it reaches the limit value. If the + # given limit is greater than or equal to the string length, returns a copy of self. + # + # str = "hello" + # str.first # => "h" + # str.first(1) # => "h" + # str.first(2) # => "he" + # str.first(0) # => "" + # str.first(6) # => "hello" + def first(limit = 1) + ActiveSupport::Deprecation.warn( + "Calling String#first with a negative integer limit " \ + "will raise an ArgumentError in Rails 6.1." + ) if limit < 0 + if limit == 0 + "" + elsif limit >= size + dup + else + to(limit - 1) + end + end + + # Returns the last character of the string. If a limit is supplied, returns a substring + # from the end of the string until it reaches the limit value (counting backwards). If + # the given limit is greater than or equal to the string length, returns a copy of self. + # + # str = "hello" + # str.last # => "o" + # str.last(1) # => "o" + # str.last(2) # => "lo" + # str.last(0) # => "" + # str.last(6) # => "hello" + def last(limit = 1) + ActiveSupport::Deprecation.warn( + "Calling String#last with a negative integer limit " \ + "will raise an ArgumentError in Rails 6.1." + ) if limit < 0 + if limit == 0 + "" + elsif limit >= size + dup + else + from(-limit) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/behavior.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/behavior.rb new file mode 100644 index 000000000000..35a5aa78405a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/behavior.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class String + # Enables more predictable duck-typing on String-like classes. See Object#acts_like?. + def acts_like_string? + true + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/conversions.rb new file mode 100644 index 000000000000..29a88b07adf5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/conversions.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +require "date" +require "active_support/core_ext/time/calculations" + +class String + # Converts a string to a Time value. + # The +form+ can be either :utc or :local (default :local). + # + # The time is parsed using Time.parse method. + # If +form+ is :local, then the time is in the system timezone. + # If the date part is missing then the current date is used and if + # the time part is missing then it is assumed to be 00:00:00. + # + # "13-12-2012".to_time # => 2012-12-13 00:00:00 +0100 + # "06:12".to_time # => 2012-12-13 06:12:00 +0100 + # "2012-12-13 06:12".to_time # => 2012-12-13 06:12:00 +0100 + # "2012-12-13T06:12".to_time # => 2012-12-13 06:12:00 +0100 + # "2012-12-13T06:12".to_time(:utc) # => 2012-12-13 06:12:00 UTC + # "12/13/2012".to_time # => ArgumentError: argument out of range + def to_time(form = :local) + parts = Date._parse(self, false) + used_keys = %i(year mon mday hour min sec sec_fraction offset) + return if (parts.keys & used_keys).empty? + + now = Time.now + time = Time.new( + parts.fetch(:year, now.year), + parts.fetch(:mon, now.month), + parts.fetch(:mday, now.day), + parts.fetch(:hour, 0), + parts.fetch(:min, 0), + parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0), + parts.fetch(:offset, form == :utc ? 0 : nil) + ) + + form == :utc ? time.utc : time.to_time + end + + # Converts a string to a Date value. + # + # "1-1-2012".to_date # => Sun, 01 Jan 2012 + # "01/01/2012".to_date # => Sun, 01 Jan 2012 + # "2012-12-13".to_date # => Thu, 13 Dec 2012 + # "12/13/2012".to_date # => ArgumentError: invalid date + def to_date + ::Date.parse(self, false) unless blank? + end + + # Converts a string to a DateTime value. + # + # "1-1-2012".to_datetime # => Sun, 01 Jan 2012 00:00:00 +0000 + # "01/01/2012 23:59:59".to_datetime # => Sun, 01 Jan 2012 23:59:59 +0000 + # "2012-12-13 12:50".to_datetime # => Thu, 13 Dec 2012 12:50:00 +0000 + # "12/13/2012".to_datetime # => ArgumentError: invalid date + def to_datetime + ::DateTime.parse(self, false) unless blank? + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/exclude.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/exclude.rb new file mode 100644 index 000000000000..8e462689f1cc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/exclude.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class String + # The inverse of String#include?. Returns true if the string + # does not include the other string. + # + # "hello".exclude? "lo" # => false + # "hello".exclude? "ol" # => true + # "hello".exclude? ?h # => false + def exclude?(string) + !include?(string) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/filters.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/filters.rb new file mode 100644 index 000000000000..7f28bd52f244 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/filters.rb @@ -0,0 +1,145 @@ +# frozen_string_literal: true + +class String + # Returns the string, first removing all whitespace on both ends of + # the string, and then changing remaining consecutive whitespace + # groups into one space each. + # + # Note that it handles both ASCII and Unicode whitespace. + # + # %{ Multi-line + # string }.squish # => "Multi-line string" + # " foo bar \n \t boo".squish # => "foo bar boo" + def squish + dup.squish! + end + + # Performs a destructive squish. See String#squish. + # str = " foo bar \n \t boo" + # str.squish! # => "foo bar boo" + # str # => "foo bar boo" + def squish! + gsub!(/[[:space:]]+/, " ") + strip! + self + end + + # Returns a new string with all occurrences of the patterns removed. + # str = "foo bar test" + # str.remove(" test") # => "foo bar" + # str.remove(" test", /bar/) # => "foo " + # str # => "foo bar test" + def remove(*patterns) + dup.remove!(*patterns) + end + + # Alters the string by removing all occurrences of the patterns. + # str = "foo bar test" + # str.remove!(" test", /bar/) # => "foo " + # str # => "foo " + def remove!(*patterns) + patterns.each do |pattern| + gsub! pattern, "" + end + + self + end + + # Truncates a given +text+ after a given length if +text+ is longer than length: + # + # 'Once upon a time in a world far far away'.truncate(27) + # # => "Once upon a time in a wo..." + # + # Pass a string or regexp :separator to truncate +text+ at a natural break: + # + # 'Once upon a time in a world far far away'.truncate(27, separator: ' ') + # # => "Once upon a time in a..." + # + # 'Once upon a time in a world far far away'.truncate(27, separator: /\s/) + # # => "Once upon a time in a..." + # + # The last characters will be replaced with the :omission string (defaults to "...") + # for a total length not exceeding length: + # + # 'And they found that many people were sleeping better.'.truncate(25, omission: '... (continued)') + # # => "And they f... (continued)" + def truncate(truncate_at, options = {}) + return dup unless length > truncate_at + + omission = options[:omission] || "..." + length_with_room_for_omission = truncate_at - omission.length + stop = \ + if options[:separator] + rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission + else + length_with_room_for_omission + end + + +"#{self[0, stop]}#{omission}" + end + + # Truncates +text+ to at most bytesize bytes in length without + # breaking string encoding by splitting multibyte characters or breaking + # grapheme clusters ("perceptual characters") by truncating at combining + # characters. + # + # >> "🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪".size + # => 20 + # >> "🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪".bytesize + # => 80 + # >> "🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪".truncate_bytes(20) + # => "🔪🔪🔪🔪…" + # + # The truncated text ends with the :omission string, defaulting + # to "…", for a total length not exceeding bytesize. + def truncate_bytes(truncate_at, omission: "…") + omission ||= "" + + case + when bytesize <= truncate_at + dup + when omission.bytesize > truncate_at + raise ArgumentError, "Omission #{omission.inspect} is #{omission.bytesize}, larger than the truncation length of #{truncate_at} bytes" + when omission.bytesize == truncate_at + omission.dup + else + self.class.new.tap do |cut| + cut_at = truncate_at - omission.bytesize + + scan(/\X/) do |grapheme| + if cut.bytesize + grapheme.bytesize <= cut_at + cut << grapheme + else + break + end + end + + cut << omission + end + end + end + + # Truncates a given +text+ after a given number of words (words_count): + # + # 'Once upon a time in a world far far away'.truncate_words(4) + # # => "Once upon a time..." + # + # Pass a string or regexp :separator to specify a different separator of words: + # + # 'Once
upon
a
time
in
a
world'.truncate_words(5, separator: '
') + # # => "Once
upon
a
time
in..." + # + # The last characters will be replaced with the :omission string (defaults to "..."): + # + # 'And they found that many people were sleeping better.'.truncate_words(5, omission: '... (continued)') + # # => "And they found that many... (continued)" + def truncate_words(words_count, options = {}) + sep = options[:separator] || /\s+/ + sep = Regexp.escape(sep.to_s) unless Regexp === sep + if self =~ /\A((?>.+?#{sep}){#{words_count - 1}}.+?)#{sep}.*/m + $1 + (options[:omission] || "...") + else + dup + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/indent.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/indent.rb new file mode 100644 index 000000000000..af9d181487eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/indent.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +class String + # Same as +indent+, except it indents the receiver in-place. + # + # Returns the indented string, or +nil+ if there was nothing to indent. + def indent!(amount, indent_string = nil, indent_empty_lines = false) + indent_string = indent_string || self[/^[ \t]/] || " " + re = indent_empty_lines ? /^/ : /^(?!$)/ + gsub!(re, indent_string * amount) + end + + # Indents the lines in the receiver: + # + # < + # def some_method + # some_code + # end + # + # The second argument, +indent_string+, specifies which indent string to + # use. The default is +nil+, which tells the method to make a guess by + # peeking at the first indented line, and fallback to a space if there is + # none. + # + # " foo".indent(2) # => " foo" + # "foo\n\t\tbar".indent(2) # => "\t\tfoo\n\t\t\t\tbar" + # "foo".indent(2, "\t") # => "\t\tfoo" + # + # While +indent_string+ is typically one space or tab, it may be any string. + # + # The third argument, +indent_empty_lines+, is a flag that says whether + # empty lines should be indented. Default is false. + # + # "foo\n\nbar".indent(2) # => " foo\n\n bar" + # "foo\n\nbar".indent(2, nil, true) # => " foo\n \n bar" + # + def indent(amount, indent_string = nil, indent_empty_lines = false) + dup.tap { |_| _.indent!(amount, indent_string, indent_empty_lines) } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/inflections.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/inflections.rb new file mode 100644 index 000000000000..5eb8d9f99bf2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/inflections.rb @@ -0,0 +1,259 @@ +# frozen_string_literal: true + +require "active_support/inflector/methods" +require "active_support/inflector/transliterate" + +# String inflections define new methods on the String class to transform names for different purposes. +# For instance, you can figure out the name of a table from the name of a class. +# +# 'ScaleScore'.tableize # => "scale_scores" +# +class String + # Returns the plural form of the word in the string. + # + # If the optional parameter +count+ is specified, + # the singular form will be returned if count == 1. + # For any other value of +count+ the plural will be returned. + # + # If the optional parameter +locale+ is specified, + # the word will be pluralized as a word of that language. + # By default, this parameter is set to :en. + # You must define your own inflection rules for languages other than English. + # + # 'post'.pluralize # => "posts" + # 'octopus'.pluralize # => "octopi" + # 'sheep'.pluralize # => "sheep" + # 'words'.pluralize # => "words" + # 'the blue mailman'.pluralize # => "the blue mailmen" + # 'CamelOctopus'.pluralize # => "CamelOctopi" + # 'apple'.pluralize(1) # => "apple" + # 'apple'.pluralize(2) # => "apples" + # 'ley'.pluralize(:es) # => "leyes" + # 'ley'.pluralize(1, :es) # => "ley" + def pluralize(count = nil, locale = :en) + locale = count if count.is_a?(Symbol) + if count == 1 + dup + else + ActiveSupport::Inflector.pluralize(self, locale) + end + end + + # The reverse of +pluralize+, returns the singular form of a word in a string. + # + # If the optional parameter +locale+ is specified, + # the word will be singularized as a word of that language. + # By default, this parameter is set to :en. + # You must define your own inflection rules for languages other than English. + # + # 'posts'.singularize # => "post" + # 'octopi'.singularize # => "octopus" + # 'sheep'.singularize # => "sheep" + # 'word'.singularize # => "word" + # 'the blue mailmen'.singularize # => "the blue mailman" + # 'CamelOctopi'.singularize # => "CamelOctopus" + # 'leyes'.singularize(:es) # => "ley" + def singularize(locale = :en) + ActiveSupport::Inflector.singularize(self, locale) + end + + # +constantize+ tries to find a declared constant with the name specified + # in the string. It raises a NameError when the name is not in CamelCase + # or is not initialized. See ActiveSupport::Inflector.constantize + # + # 'Module'.constantize # => Module + # 'Class'.constantize # => Class + # 'blargle'.constantize # => NameError: wrong constant name blargle + def constantize + ActiveSupport::Inflector.constantize(self) + end + + # +safe_constantize+ tries to find a declared constant with the name specified + # in the string. It returns +nil+ when the name is not in CamelCase + # or is not initialized. See ActiveSupport::Inflector.safe_constantize + # + # 'Module'.safe_constantize # => Module + # 'Class'.safe_constantize # => Class + # 'blargle'.safe_constantize # => nil + def safe_constantize + ActiveSupport::Inflector.safe_constantize(self) + end + + # By default, +camelize+ converts strings to UpperCamelCase. If the argument to camelize + # is set to :lower then camelize produces lowerCamelCase. + # + # +camelize+ will also convert '/' to '::' which is useful for converting paths to namespaces. + # + # 'active_record'.camelize # => "ActiveRecord" + # 'active_record'.camelize(:lower) # => "activeRecord" + # 'active_record/errors'.camelize # => "ActiveRecord::Errors" + # 'active_record/errors'.camelize(:lower) # => "activeRecord::Errors" + def camelize(first_letter = :upper) + case first_letter + when :upper + ActiveSupport::Inflector.camelize(self, true) + when :lower + ActiveSupport::Inflector.camelize(self, false) + else + raise ArgumentError, "Invalid option, use either :upper or :lower." + end + end + alias_method :camelcase, :camelize + + # Capitalizes all the words and replaces some characters in the string to create + # a nicer looking title. +titleize+ is meant for creating pretty output. It is not + # used in the Rails internals. + # + # The trailing '_id','Id'.. can be kept and capitalized by setting the + # optional parameter +keep_id_suffix+ to true. + # By default, this parameter is false. + # + # +titleize+ is also aliased as +titlecase+. + # + # 'man from the boondocks'.titleize # => "Man From The Boondocks" + # 'x-men: the last stand'.titleize # => "X Men: The Last Stand" + # 'string_ending_with_id'.titleize(keep_id_suffix: true) # => "String Ending With Id" + def titleize(keep_id_suffix: false) + ActiveSupport::Inflector.titleize(self, keep_id_suffix: keep_id_suffix) + end + alias_method :titlecase, :titleize + + # The reverse of +camelize+. Makes an underscored, lowercase form from the expression in the string. + # + # +underscore+ will also change '::' to '/' to convert namespaces to paths. + # + # 'ActiveModel'.underscore # => "active_model" + # 'ActiveModel::Errors'.underscore # => "active_model/errors" + def underscore + ActiveSupport::Inflector.underscore(self) + end + + # Replaces underscores with dashes in the string. + # + # 'puni_puni'.dasherize # => "puni-puni" + def dasherize + ActiveSupport::Inflector.dasherize(self) + end + + # Removes the module part from the constant expression in the string. + # + # 'ActiveSupport::Inflector::Inflections'.demodulize # => "Inflections" + # 'Inflections'.demodulize # => "Inflections" + # '::Inflections'.demodulize # => "Inflections" + # ''.demodulize # => '' + # + # See also +deconstantize+. + def demodulize + ActiveSupport::Inflector.demodulize(self) + end + + # Removes the rightmost segment from the constant expression in the string. + # + # 'Net::HTTP'.deconstantize # => "Net" + # '::Net::HTTP'.deconstantize # => "::Net" + # 'String'.deconstantize # => "" + # '::String'.deconstantize # => "" + # ''.deconstantize # => "" + # + # See also +demodulize+. + def deconstantize + ActiveSupport::Inflector.deconstantize(self) + end + + # Replaces special characters in a string so that it may be used as part of a 'pretty' URL. + # + # If the optional parameter +locale+ is specified, + # the word will be parameterized as a word of that language. + # By default, this parameter is set to nil and it will use + # the configured I18n.locale. + # + # class Person + # def to_param + # "#{id}-#{name.parameterize}" + # end + # end + # + # @person = Person.find(1) + # # => # + # + # <%= link_to(@person.name, person_path) %> + # # => Donald E. Knuth + # + # To preserve the case of the characters in a string, use the +preserve_case+ argument. + # + # class Person + # def to_param + # "#{id}-#{name.parameterize(preserve_case: true)}" + # end + # end + # + # @person = Person.find(1) + # # => # + # + # <%= link_to(@person.name, person_path) %> + # # => Donald E. Knuth + def parameterize(separator: "-", preserve_case: false, locale: nil) + ActiveSupport::Inflector.parameterize(self, separator: separator, preserve_case: preserve_case, locale: locale) + end + + # Creates the name of a table like Rails does for models to table names. This method + # uses the +pluralize+ method on the last word in the string. + # + # 'RawScaledScorer'.tableize # => "raw_scaled_scorers" + # 'ham_and_egg'.tableize # => "ham_and_eggs" + # 'fancyCategory'.tableize # => "fancy_categories" + def tableize + ActiveSupport::Inflector.tableize(self) + end + + # Creates a class name from a plural table name like Rails does for table names to models. + # Note that this returns a string and not a class. (To convert to an actual class + # follow +classify+ with +constantize+.) + # + # 'ham_and_eggs'.classify # => "HamAndEgg" + # 'posts'.classify # => "Post" + def classify + ActiveSupport::Inflector.classify(self) + end + + # Capitalizes the first word, turns underscores into spaces, and (by default)strips a + # trailing '_id' if present. + # Like +titleize+, this is meant for creating pretty output. + # + # The capitalization of the first word can be turned off by setting the + # optional parameter +capitalize+ to false. + # By default, this parameter is true. + # + # The trailing '_id' can be kept and capitalized by setting the + # optional parameter +keep_id_suffix+ to true. + # By default, this parameter is false. + # + # 'employee_salary'.humanize # => "Employee salary" + # 'author_id'.humanize # => "Author" + # 'author_id'.humanize(capitalize: false) # => "author" + # '_id'.humanize # => "Id" + # 'author_id'.humanize(keep_id_suffix: true) # => "Author Id" + def humanize(capitalize: true, keep_id_suffix: false) + ActiveSupport::Inflector.humanize(self, capitalize: capitalize, keep_id_suffix: keep_id_suffix) + end + + # Converts just the first character to uppercase. + # + # 'what a Lovely Day'.upcase_first # => "What a Lovely Day" + # 'w'.upcase_first # => "W" + # ''.upcase_first # => "" + def upcase_first + ActiveSupport::Inflector.upcase_first(self) + end + + # Creates a foreign key name from a class name. + # +separate_class_name_and_id_with_underscore+ sets whether + # the method should put '_' between the name and 'id'. + # + # 'Message'.foreign_key # => "message_id" + # 'Message'.foreign_key(false) # => "messageid" + # 'Admin::Post'.foreign_key # => "post_id" + def foreign_key(separate_class_name_and_id_with_underscore = true) + ActiveSupport::Inflector.foreign_key(self, separate_class_name_and_id_with_underscore) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/inquiry.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/inquiry.rb new file mode 100644 index 000000000000..a796d5fb4f7d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/inquiry.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require "active_support/string_inquirer" + +class String + # Wraps the current string in the ActiveSupport::StringInquirer class, + # which gives you a prettier way to test for equality. + # + # env = 'production'.inquiry + # env.production? # => true + # env.development? # => false + def inquiry + ActiveSupport::StringInquirer.new(self) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/multibyte.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/multibyte.rb new file mode 100644 index 000000000000..6cceb465070d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/multibyte.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +require "active_support/multibyte" + +class String + # == Multibyte proxy + # + # +mb_chars+ is a multibyte safe proxy for string methods. + # + # It creates and returns an instance of the ActiveSupport::Multibyte::Chars class which + # encapsulates the original string. A Unicode safe version of all the String methods are defined on this proxy + # class. If the proxy class doesn't respond to a certain method, it's forwarded to the encapsulated string. + # + # >> "lj".mb_chars.upcase.to_s + # => "LJ" + # + # NOTE: Ruby 2.4 and later support native Unicode case mappings: + # + # >> "lj".upcase + # => "LJ" + # + # == Method chaining + # + # All the methods on the Chars proxy which normally return a string will return a Chars object. This allows + # method chaining on the result of any of these methods. + # + # name.mb_chars.reverse.length # => 12 + # + # == Interoperability and configuration + # + # The Chars object tries to be as interchangeable with String objects as possible: sorting and comparing between + # String and Char work like expected. The bang! methods change the internal string representation in the Chars + # object. Interoperability problems can be resolved easily with a +to_s+ call. + # + # For more information about the methods defined on the Chars proxy see ActiveSupport::Multibyte::Chars. For + # information about how to change the default Multibyte behavior see ActiveSupport::Multibyte. + def mb_chars + ActiveSupport::Multibyte.proxy_class.new(self) + end + + # Returns +true+ if string has utf_8 encoding. + # + # utf_8_str = "some string".encode "UTF-8" + # iso_str = "some string".encode "ISO-8859-1" + # + # utf_8_str.is_utf8? # => true + # iso_str.is_utf8? # => false + def is_utf8? + case encoding + when Encoding::UTF_8 + valid_encoding? + when Encoding::ASCII_8BIT, Encoding::US_ASCII + dup.force_encoding(Encoding::UTF_8).valid_encoding? + else + false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/output_safety.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/output_safety.rb new file mode 100644 index 000000000000..e226779422f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/output_safety.rb @@ -0,0 +1,315 @@ +# frozen_string_literal: true + +require "erb" +require "active_support/core_ext/kernel/singleton_class" +require "active_support/core_ext/module/redefine_method" +require "active_support/multibyte/unicode" + +class ERB + module Util + HTML_ESCAPE = { "&" => "&", ">" => ">", "<" => "<", '"' => """, "'" => "'" } + JSON_ESCAPE = { "&" => '\u0026', ">" => '\u003e', "<" => '\u003c', "\u2028" => '\u2028', "\u2029" => '\u2029' } + HTML_ESCAPE_ONCE_REGEXP = /["><']|&(?!([a-zA-Z]+|(#\d+)|(#[xX][\dA-Fa-f]+));)/ + JSON_ESCAPE_REGEXP = /[\u2028\u2029&><]/u + + # A utility method for escaping HTML tag characters. + # This method is also aliased as h. + # + # puts html_escape('is a > 0 & a < 10?') + # # => is a > 0 & a < 10? + def html_escape(s) + unwrapped_html_escape(s).html_safe + end + + silence_redefinition_of_method :h + alias h html_escape + + module_function :h + + singleton_class.silence_redefinition_of_method :html_escape + module_function :html_escape + + # HTML escapes strings but doesn't wrap them with an ActiveSupport::SafeBuffer. + # This method is not for public consumption! Seriously! + def unwrapped_html_escape(s) # :nodoc: + s = s.to_s + if s.html_safe? + s + else + CGI.escapeHTML(ActiveSupport::Multibyte::Unicode.tidy_bytes(s)) + end + end + module_function :unwrapped_html_escape + + # A utility method for escaping HTML without affecting existing escaped entities. + # + # html_escape_once('1 < 2 & 3') + # # => "1 < 2 & 3" + # + # html_escape_once('<< Accept & Checkout') + # # => "<< Accept & Checkout" + def html_escape_once(s) + result = ActiveSupport::Multibyte::Unicode.tidy_bytes(s.to_s).gsub(HTML_ESCAPE_ONCE_REGEXP, HTML_ESCAPE) + s.html_safe? ? result.html_safe : result + end + + module_function :html_escape_once + + # A utility method for escaping HTML entities in JSON strings. Specifically, the + # &, > and < characters are replaced with their equivalent unicode escaped form - + # \u0026, \u003e, and \u003c. The Unicode sequences \u2028 and \u2029 are also + # escaped as they are treated as newline characters in some JavaScript engines. + # These sequences have identical meaning as the original characters inside the + # context of a JSON string, so assuming the input is a valid and well-formed + # JSON value, the output will have equivalent meaning when parsed: + # + # json = JSON.generate({ name: ""}) + # # => "{\"name\":\"\"}" + # + # json_escape(json) + # # => "{\"name\":\"\\u003C/script\\u003E\\u003Cscript\\u003Ealert('PWNED!!!')\\u003C/script\\u003E\"}" + # + # JSON.parse(json) == JSON.parse(json_escape(json)) + # # => true + # + # The intended use case for this method is to escape JSON strings before including + # them inside a script tag to avoid XSS vulnerability: + # + # + # + # It is necessary to +raw+ the result of +json_escape+, so that quotation marks + # don't get converted to " entities. +json_escape+ doesn't + # automatically flag the result as HTML safe, since the raw value is unsafe to + # use inside HTML attributes. + # + # If your JSON is being used downstream for insertion into the DOM, be aware of + # whether or not it is being inserted via +html()+. Most jQuery plugins do this. + # If that is the case, be sure to +html_escape+ or +sanitize+ any user-generated + # content returned by your JSON. + # + # If you need to output JSON elsewhere in your HTML, you can just do something + # like this, as any unsafe characters (including quotation marks) will be + # automatically escaped for you: + # + #
...
+ # + # WARNING: this helper only works with valid JSON. Using this on non-JSON values + # will open up serious XSS vulnerabilities. For example, if you replace the + # +current_user.to_json+ in the example above with user input instead, the browser + # will happily eval() that string as JavaScript. + # + # The escaping performed in this method is identical to those performed in the + # Active Support JSON encoder when +ActiveSupport.escape_html_entities_in_json+ is + # set to true. Because this transformation is idempotent, this helper can be + # applied even if +ActiveSupport.escape_html_entities_in_json+ is already true. + # + # Therefore, when you are unsure if +ActiveSupport.escape_html_entities_in_json+ + # is enabled, or if you are unsure where your JSON string originated from, it + # is recommended that you always apply this helper (other libraries, such as the + # JSON gem, do not provide this kind of protection by default; also some gems + # might override +to_json+ to bypass Active Support's encoder). + def json_escape(s) + result = s.to_s.gsub(JSON_ESCAPE_REGEXP, JSON_ESCAPE) + s.html_safe? ? result.html_safe : result + end + + module_function :json_escape + end +end + +class Object + def html_safe? + false + end +end + +class Numeric + def html_safe? + true + end +end + +module ActiveSupport #:nodoc: + class SafeBuffer < String + UNSAFE_STRING_METHODS = %w( + capitalize chomp chop delete delete_prefix delete_suffix + downcase lstrip next reverse rstrip slice squeeze strip + succ swapcase tr tr_s unicode_normalize upcase + ) + + UNSAFE_STRING_METHODS_WITH_BACKREF = %w(gsub sub) + + alias_method :original_concat, :concat + private :original_concat + + # Raised when ActiveSupport::SafeBuffer#safe_concat is called on unsafe buffers. + class SafeConcatError < StandardError + def initialize + super "Could not concatenate to the buffer because it is not html safe." + end + end + + def [](*args) + if html_safe? + new_safe_buffer = super + + if new_safe_buffer + new_safe_buffer.instance_variable_set :@html_safe, true + end + + new_safe_buffer + else + to_str[*args] + end + end + + def safe_concat(value) + raise SafeConcatError unless html_safe? + original_concat(value) + end + + def initialize(str = "") + @html_safe = true + super + end + + def initialize_copy(other) + super + @html_safe = other.html_safe? + end + + def clone_empty + self[0, 0] + end + + def concat(value) + super(html_escape_interpolated_argument(value)) + end + alias << concat + + def insert(index, value) + super(index, html_escape_interpolated_argument(value)) + end + + def prepend(value) + super(html_escape_interpolated_argument(value)) + end + + def replace(value) + super(html_escape_interpolated_argument(value)) + end + + def []=(*args) + if args.count == 3 + super(args[0], args[1], html_escape_interpolated_argument(args[2])) + else + super(args[0], html_escape_interpolated_argument(args[1])) + end + end + + def +(other) + dup.concat(other) + end + + def *(*) + new_safe_buffer = super + new_safe_buffer.instance_variable_set(:@html_safe, @html_safe) + new_safe_buffer + end + + def %(args) + case args + when Hash + escaped_args = Hash[args.map { |k, arg| [k, html_escape_interpolated_argument(arg)] }] + else + escaped_args = Array(args).map { |arg| html_escape_interpolated_argument(arg) } + end + + self.class.new(super(escaped_args)) + end + + def html_safe? + defined?(@html_safe) && @html_safe + end + + def to_s + self + end + + def to_param + to_str + end + + def encode_with(coder) + coder.represent_object nil, to_str + end + + UNSAFE_STRING_METHODS.each do |unsafe_method| + if unsafe_method.respond_to?(unsafe_method) + class_eval <<-EOT, __FILE__, __LINE__ + 1 + def #{unsafe_method}(*args, &block) # def capitalize(*args, &block) + to_str.#{unsafe_method}(*args, &block) # to_str.capitalize(*args, &block) + end # end + + def #{unsafe_method}!(*args) # def capitalize!(*args) + @html_safe = false # @html_safe = false + super # super + end # end + EOT + end + end + + UNSAFE_STRING_METHODS_WITH_BACKREF.each do |unsafe_method| + if unsafe_method.respond_to?(unsafe_method) + class_eval <<-EOT, __FILE__, __LINE__ + 1 + def #{unsafe_method}(*args, &block) # def gsub(*args, &block) + if block # if block + to_str.#{unsafe_method}(*args) { |*params| # to_str.gsub(*args) { |*params| + set_block_back_references(block, $~) # set_block_back_references(block, $~) + block.call(*params) # block.call(*params) + } # } + else # else + to_str.#{unsafe_method}(*args) # to_str.gsub(*args) + end # end + end # end + + def #{unsafe_method}!(*args, &block) # def gsub!(*args, &block) + @html_safe = false # @html_safe = false + if block # if block + super(*args) { |*params| # super(*args) { |*params| + set_block_back_references(block, $~) # set_block_back_references(block, $~) + block.call(*params) # block.call(*params) + } # } + else # else + super # super + end # end + end # end + EOT + end + end + + private + def html_escape_interpolated_argument(arg) + (!html_safe? || arg.html_safe?) ? arg : CGI.escapeHTML(arg.to_s) + end + + def set_block_back_references(block, match_data) + block.binding.eval("proc { |m| $~ = m }").call(match_data) + rescue ArgumentError + # Can't create binding from C level Proc + end + end +end + +class String + # Marks a string as trusted safe. It will be inserted into HTML with no + # additional escaping performed. It is your responsibility to ensure that the + # string contains no malicious content. This method is equivalent to the + # +raw+ helper in views. It is recommended that you use +sanitize+ instead of + # this method. It should never be called on user input. + def html_safe + ActiveSupport::SafeBuffer.new(self) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/starts_ends_with.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/starts_ends_with.rb new file mode 100644 index 000000000000..919eb7a57380 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/starts_ends_with.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +class String + alias_method :starts_with?, :start_with? + alias_method :ends_with?, :end_with? +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/strip.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/strip.rb new file mode 100644 index 000000000000..60e9952ee62c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/strip.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class String + # Strips indentation in heredocs. + # + # For example in + # + # if options[:usage] + # puts <<-USAGE.strip_heredoc + # This command does such and such. + # + # Supported options are: + # -h This message + # ... + # USAGE + # end + # + # the user would see the usage message aligned against the left margin. + # + # Technically, it looks for the least indented non-empty line + # in the whole string, and removes that amount of leading whitespace. + def strip_heredoc + gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "").tap do |stripped| + stripped.freeze if frozen? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/zones.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/zones.rb new file mode 100644 index 000000000000..55dc231464bd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/string/zones.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "active_support/core_ext/string/conversions" +require "active_support/core_ext/time/zones" + +class String + # Converts String to a TimeWithZone in the current zone if Time.zone or Time.zone_default + # is set, otherwise converts String to a Time via String#to_time + def in_time_zone(zone = ::Time.zone) + if zone + ::Time.find_zone!(zone).parse(self) + else + to_time + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time.rb new file mode 100644 index 000000000000..c809def05f35 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require "active_support/core_ext/time/acts_like" +require "active_support/core_ext/time/calculations" +require "active_support/core_ext/time/compatibility" +require "active_support/core_ext/time/conversions" +require "active_support/core_ext/time/zones" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/acts_like.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/acts_like.rb new file mode 100644 index 000000000000..8572b4963995 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/acts_like.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/acts_like" + +class Time + # Duck-types as a Time-like class. See Object#acts_like?. + def acts_like_time? + true + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/calculations.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/calculations.rb new file mode 100644 index 000000000000..eed34965e398 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/calculations.rb @@ -0,0 +1,344 @@ +# frozen_string_literal: true + +require "active_support/duration" +require "active_support/core_ext/time/conversions" +require "active_support/time_with_zone" +require "active_support/core_ext/time/zones" +require "active_support/core_ext/date_and_time/calculations" +require "active_support/core_ext/date/calculations" + +class Time + include DateAndTime::Calculations + + COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + + class << self + # Overriding case equality method so that it returns true for ActiveSupport::TimeWithZone instances + def ===(other) + super || (self == Time && other.is_a?(ActiveSupport::TimeWithZone)) + end + + # Returns the number of days in the given month. + # If no year is specified, it will use the current year. + def days_in_month(month, year = current.year) + if month == 2 && ::Date.gregorian_leap?(year) + 29 + else + COMMON_YEAR_DAYS_IN_MONTH[month] + end + end + + # Returns the number of days in the given year. + # If no year is specified, it will use the current year. + def days_in_year(year = current.year) + days_in_month(2, year) + 337 + end + + # Returns Time.zone.now when Time.zone or config.time_zone are set, otherwise just returns Time.now. + def current + ::Time.zone ? ::Time.zone.now : ::Time.now + end + + # Layers additional behavior on Time.at so that ActiveSupport::TimeWithZone and DateTime + # instances can be used when called with a single argument + def at_with_coercion(*args) + return at_without_coercion(*args) if args.size != 1 + + # Time.at can be called with a time or numerical value + time_or_number = args.first + + if time_or_number.is_a?(ActiveSupport::TimeWithZone) || time_or_number.is_a?(DateTime) + at_without_coercion(time_or_number.to_f).getlocal + else + at_without_coercion(time_or_number) + end + end + alias_method :at_without_coercion, :at + alias_method :at, :at_with_coercion + + # Creates a +Time+ instance from an RFC 3339 string. + # + # Time.rfc3339('1999-12-31T14:00:00-10:00') # => 2000-01-01 00:00:00 -1000 + # + # If the time or offset components are missing then an +ArgumentError+ will be raised. + # + # Time.rfc3339('1999-12-31') # => ArgumentError: invalid date + def rfc3339(str) + parts = Date._rfc3339(str) + + raise ArgumentError, "invalid date" if parts.empty? + + Time.new( + parts.fetch(:year), + parts.fetch(:mon), + parts.fetch(:mday), + parts.fetch(:hour), + parts.fetch(:min), + parts.fetch(:sec) + parts.fetch(:sec_fraction, 0), + parts.fetch(:offset) + ) + end + end + + # Returns the number of seconds since 00:00:00. + # + # Time.new(2012, 8, 29, 0, 0, 0).seconds_since_midnight # => 0.0 + # Time.new(2012, 8, 29, 12, 34, 56).seconds_since_midnight # => 45296.0 + # Time.new(2012, 8, 29, 23, 59, 59).seconds_since_midnight # => 86399.0 + def seconds_since_midnight + to_i - change(hour: 0).to_i + (usec / 1.0e+6) + end + + # Returns the number of seconds until 23:59:59. + # + # Time.new(2012, 8, 29, 0, 0, 0).seconds_until_end_of_day # => 86399 + # Time.new(2012, 8, 29, 12, 34, 56).seconds_until_end_of_day # => 41103 + # Time.new(2012, 8, 29, 23, 59, 59).seconds_until_end_of_day # => 0 + def seconds_until_end_of_day + end_of_day.to_i - to_i + end + + # Returns the fraction of a second as a +Rational+ + # + # Time.new(2012, 8, 29, 0, 0, 0.5).sec_fraction # => (1/2) + def sec_fraction + subsec + end + + # Returns a new Time where one or more of the elements have been changed according + # to the +options+ parameter. The time options (:hour, :min, + # :sec, :usec, :nsec) reset cascadingly, so if only + # the hour is passed, then minute, sec, usec and nsec is set to 0. If the hour + # and minute is passed, then sec, usec and nsec is set to 0. The +options+ parameter + # takes a hash with any of these keys: :year, :month, :day, + # :hour, :min, :sec, :usec, :nsec, + # :offset. Pass either :usec or :nsec, not both. + # + # Time.new(2012, 8, 29, 22, 35, 0).change(day: 1) # => Time.new(2012, 8, 1, 22, 35, 0) + # Time.new(2012, 8, 29, 22, 35, 0).change(year: 1981, day: 1) # => Time.new(1981, 8, 1, 22, 35, 0) + # Time.new(2012, 8, 29, 22, 35, 0).change(year: 1981, hour: 0) # => Time.new(1981, 8, 29, 0, 0, 0) + def change(options) + new_year = options.fetch(:year, year) + new_month = options.fetch(:month, month) + new_day = options.fetch(:day, day) + new_hour = options.fetch(:hour, hour) + new_min = options.fetch(:min, options[:hour] ? 0 : min) + new_sec = options.fetch(:sec, (options[:hour] || options[:min]) ? 0 : sec) + new_offset = options.fetch(:offset, nil) + + if new_nsec = options[:nsec] + raise ArgumentError, "Can't change both :nsec and :usec at the same time: #{options.inspect}" if options[:usec] + new_usec = Rational(new_nsec, 1000) + else + new_usec = options.fetch(:usec, (options[:hour] || options[:min] || options[:sec]) ? 0 : Rational(nsec, 1000)) + end + + raise ArgumentError, "argument out of range" if new_usec >= 1000000 + + new_sec += Rational(new_usec, 1000000) + + if new_offset + ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec, new_offset) + elsif utc? + ::Time.utc(new_year, new_month, new_day, new_hour, new_min, new_sec) + elsif zone + ::Time.local(new_year, new_month, new_day, new_hour, new_min, new_sec) + else + ::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec, utc_offset) + end + end + + # Uses Date to provide precise Time calculations for years, months, and days + # according to the proleptic Gregorian calendar. The +options+ parameter + # takes a hash with any of these keys: :years, :months, + # :weeks, :days, :hours, :minutes, + # :seconds. + # + # Time.new(2015, 8, 1, 14, 35, 0).advance(seconds: 1) # => 2015-08-01 14:35:01 -0700 + # Time.new(2015, 8, 1, 14, 35, 0).advance(minutes: 1) # => 2015-08-01 14:36:00 -0700 + # Time.new(2015, 8, 1, 14, 35, 0).advance(hours: 1) # => 2015-08-01 15:35:00 -0700 + # Time.new(2015, 8, 1, 14, 35, 0).advance(days: 1) # => 2015-08-02 14:35:00 -0700 + # Time.new(2015, 8, 1, 14, 35, 0).advance(weeks: 1) # => 2015-08-08 14:35:00 -0700 + def advance(options) + unless options[:weeks].nil? + options[:weeks], partial_weeks = options[:weeks].divmod(1) + options[:days] = options.fetch(:days, 0) + 7 * partial_weeks + end + + unless options[:days].nil? + options[:days], partial_days = options[:days].divmod(1) + options[:hours] = options.fetch(:hours, 0) + 24 * partial_days + end + + d = to_date.gregorian.advance(options) + time_advanced_by_date = change(year: d.year, month: d.month, day: d.day) + seconds_to_advance = \ + options.fetch(:seconds, 0) + + options.fetch(:minutes, 0) * 60 + + options.fetch(:hours, 0) * 3600 + + if seconds_to_advance.zero? + time_advanced_by_date + else + time_advanced_by_date.since(seconds_to_advance) + end + end + + # Returns a new Time representing the time a number of seconds ago, this is basically a wrapper around the Numeric extension + def ago(seconds) + since(-seconds) + end + + # Returns a new Time representing the time a number of seconds since the instance time + def since(seconds) + self + seconds + rescue + to_datetime.since(seconds) + end + alias :in :since + + # Returns a new Time representing the start of the day (0:00) + def beginning_of_day + change(hour: 0) + end + alias :midnight :beginning_of_day + alias :at_midnight :beginning_of_day + alias :at_beginning_of_day :beginning_of_day + + # Returns a new Time representing the middle of the day (12:00) + def middle_of_day + change(hour: 12) + end + alias :midday :middle_of_day + alias :noon :middle_of_day + alias :at_midday :middle_of_day + alias :at_noon :middle_of_day + alias :at_middle_of_day :middle_of_day + + # Returns a new Time representing the end of the day, 23:59:59.999999 + def end_of_day + change( + hour: 23, + min: 59, + sec: 59, + usec: Rational(999999999, 1000) + ) + end + alias :at_end_of_day :end_of_day + + # Returns a new Time representing the start of the hour (x:00) + def beginning_of_hour + change(min: 0) + end + alias :at_beginning_of_hour :beginning_of_hour + + # Returns a new Time representing the end of the hour, x:59:59.999999 + def end_of_hour + change( + min: 59, + sec: 59, + usec: Rational(999999999, 1000) + ) + end + alias :at_end_of_hour :end_of_hour + + # Returns a new Time representing the start of the minute (x:xx:00) + def beginning_of_minute + change(sec: 0) + end + alias :at_beginning_of_minute :beginning_of_minute + + # Returns a new Time representing the end of the minute, x:xx:59.999999 + def end_of_minute + change( + sec: 59, + usec: Rational(999999999, 1000) + ) + end + alias :at_end_of_minute :end_of_minute + + def plus_with_duration(other) #:nodoc: + if ActiveSupport::Duration === other + other.since(self) + else + plus_without_duration(other) + end + end + alias_method :plus_without_duration, :+ + alias_method :+, :plus_with_duration + + def minus_with_duration(other) #:nodoc: + if ActiveSupport::Duration === other + other.until(self) + else + minus_without_duration(other) + end + end + alias_method :minus_without_duration, :- + alias_method :-, :minus_with_duration + + # Time#- can also be used to determine the number of seconds between two Time instances. + # We're layering on additional behavior so that ActiveSupport::TimeWithZone instances + # are coerced into values that Time#- will recognize + def minus_with_coercion(other) + other = other.comparable_time if other.respond_to?(:comparable_time) + other.is_a?(DateTime) ? to_f - other.to_f : minus_without_coercion(other) + end + alias_method :minus_without_coercion, :- + alias_method :-, :minus_with_coercion + + # Layers additional behavior on Time#<=> so that DateTime and ActiveSupport::TimeWithZone instances + # can be chronologically compared with a Time + def compare_with_coercion(other) + # we're avoiding Time#to_datetime and Time#to_time because they're expensive + if other.class == Time + compare_without_coercion(other) + elsif other.is_a?(Time) + compare_without_coercion(other.to_time) + else + to_datetime <=> other + end + end + alias_method :compare_without_coercion, :<=> + alias_method :<=>, :compare_with_coercion + + # Layers additional behavior on Time#eql? so that ActiveSupport::TimeWithZone instances + # can be eql? to an equivalent Time + def eql_with_coercion(other) + # if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do eql? comparison + other = other.comparable_time if other.respond_to?(:comparable_time) + eql_without_coercion(other) + end + alias_method :eql_without_coercion, :eql? + alias_method :eql?, :eql_with_coercion + + # Returns a new time the specified number of days ago. + def prev_day(days = 1) + advance(days: -days) + end + + # Returns a new time the specified number of days in the future. + def next_day(days = 1) + advance(days: days) + end + + # Returns a new time the specified number of months ago. + def prev_month(months = 1) + advance(months: -months) + end + + # Returns a new time the specified number of months in the future. + def next_month(months = 1) + advance(months: months) + end + + # Returns a new time the specified number of years ago. + def prev_year(years = 1) + advance(years: -years) + end + + # Returns a new time the specified number of years in the future. + def next_year(years = 1) + advance(years: years) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/compatibility.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/compatibility.rb new file mode 100644 index 000000000000..495e4f307b3f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/compatibility.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "active_support/core_ext/date_and_time/compatibility" +require "active_support/core_ext/module/redefine_method" + +class Time + include DateAndTime::Compatibility + + silence_redefinition_of_method :to_time + + # Either return +self+ or the time in the local system timezone depending + # on the setting of +ActiveSupport.to_time_preserves_timezone+. + def to_time + preserve_timezone ? self : getlocal + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/conversions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/conversions.rb new file mode 100644 index 000000000000..345cb2832c46 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/conversions.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require "active_support/inflector/methods" +require "active_support/values/time_zone" + +class Time + DATE_FORMATS = { + db: "%Y-%m-%d %H:%M:%S", + number: "%Y%m%d%H%M%S", + nsec: "%Y%m%d%H%M%S%9N", + usec: "%Y%m%d%H%M%S%6N", + time: "%H:%M", + short: "%d %b %H:%M", + long: "%B %d, %Y %H:%M", + long_ordinal: lambda { |time| + day_format = ActiveSupport::Inflector.ordinalize(time.day) + time.strftime("%B #{day_format}, %Y %H:%M") + }, + rfc822: lambda { |time| + offset_format = time.formatted_offset(false) + time.strftime("%a, %d %b %Y %H:%M:%S #{offset_format}") + }, + iso8601: lambda { |time| time.iso8601 } + } + + # Converts to a formatted string. See DATE_FORMATS for built-in formats. + # + # This method is aliased to to_s. + # + # time = Time.now # => 2007-01-18 06:10:17 -06:00 + # + # time.to_formatted_s(:time) # => "06:10" + # time.to_s(:time) # => "06:10" + # + # time.to_formatted_s(:db) # => "2007-01-18 06:10:17" + # time.to_formatted_s(:number) # => "20070118061017" + # time.to_formatted_s(:short) # => "18 Jan 06:10" + # time.to_formatted_s(:long) # => "January 18, 2007 06:10" + # time.to_formatted_s(:long_ordinal) # => "January 18th, 2007 06:10" + # time.to_formatted_s(:rfc822) # => "Thu, 18 Jan 2007 06:10:17 -0600" + # time.to_formatted_s(:iso8601) # => "2007-01-18T06:10:17-06:00" + # + # == Adding your own time formats to +to_formatted_s+ + # You can add your own formats to the Time::DATE_FORMATS hash. + # Use the format name as the hash key and either a strftime string + # or Proc instance that takes a time argument as the value. + # + # # config/initializers/time_formats.rb + # Time::DATE_FORMATS[:month_and_year] = '%B %Y' + # Time::DATE_FORMATS[:short_ordinal] = ->(time) { time.strftime("%B #{time.day.ordinalize}") } + def to_formatted_s(format = :default) + if formatter = DATE_FORMATS[format] + formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter) + else + to_default_s + end + end + alias_method :to_default_s, :to_s + alias_method :to_s, :to_formatted_s + + # Returns a formatted string of the offset from UTC, or an alternative + # string if the time zone is already UTC. + # + # Time.local(2000).formatted_offset # => "-06:00" + # Time.local(2000).formatted_offset(false) # => "-0600" + def formatted_offset(colon = true, alternate_utc_string = nil) + utc? && alternate_utc_string || ActiveSupport::TimeZone.seconds_to_utc_offset(utc_offset, colon) + end + + # Aliased to +xmlschema+ for compatibility with +DateTime+ + alias_method :rfc3339, :xmlschema +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/zones.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/zones.rb new file mode 100644 index 000000000000..a5588fd488f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/time/zones.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +require "active_support/time_with_zone" +require "active_support/core_ext/time/acts_like" +require "active_support/core_ext/date_and_time/zones" + +class Time + include DateAndTime::Zones + class << self + attr_accessor :zone_default + + # Returns the TimeZone for the current request, if this has been set (via Time.zone=). + # If Time.zone has not been set for the current request, returns the TimeZone specified in config.time_zone. + def zone + Thread.current[:time_zone] || zone_default + end + + # Sets Time.zone to a TimeZone object for the current request/thread. + # + # This method accepts any of the following: + # + # * A Rails TimeZone object. + # * An identifier for a Rails TimeZone object (e.g., "Eastern Time (US & Canada)", -5.hours). + # * A TZInfo::Timezone object. + # * An identifier for a TZInfo::Timezone object (e.g., "America/New_York"). + # + # Here's an example of how you might set Time.zone on a per request basis and reset it when the request is done. + # current_user.time_zone just needs to return a string identifying the user's preferred time zone: + # + # class ApplicationController < ActionController::Base + # around_action :set_time_zone + # + # def set_time_zone + # if logged_in? + # Time.use_zone(current_user.time_zone) { yield } + # else + # yield + # end + # end + # end + def zone=(time_zone) + Thread.current[:time_zone] = find_zone!(time_zone) + end + + # Allows override of Time.zone locally inside supplied block; + # resets Time.zone to existing value when done. + # + # class ApplicationController < ActionController::Base + # around_action :set_time_zone + # + # private + # + # def set_time_zone + # Time.use_zone(current_user.timezone) { yield } + # end + # end + # + # NOTE: This won't affect any ActiveSupport::TimeWithZone + # objects that have already been created, e.g. any model timestamp + # attributes that have been read before the block will remain in + # the application's default timezone. + def use_zone(time_zone) + new_zone = find_zone!(time_zone) + begin + old_zone, ::Time.zone = ::Time.zone, new_zone + yield + ensure + ::Time.zone = old_zone + end + end + + # Returns a TimeZone instance matching the time zone provided. + # Accepts the time zone in any format supported by Time.zone=. + # Raises an +ArgumentError+ for invalid time zones. + # + # Time.find_zone! "America/New_York" # => # + # Time.find_zone! "EST" # => # + # Time.find_zone! -5.hours # => # + # Time.find_zone! nil # => nil + # Time.find_zone! false # => false + # Time.find_zone! "NOT-A-TIMEZONE" # => ArgumentError: Invalid Timezone: NOT-A-TIMEZONE + def find_zone!(time_zone) + if !time_zone || time_zone.is_a?(ActiveSupport::TimeZone) + time_zone + else + # Look up the timezone based on the identifier (unless we've been + # passed a TZInfo::Timezone) + unless time_zone.respond_to?(:period_for_local) + time_zone = ActiveSupport::TimeZone[time_zone] || TZInfo::Timezone.get(time_zone) + end + + # Return if a TimeZone instance, or wrap in a TimeZone instance if a TZInfo::Timezone + if time_zone.is_a?(ActiveSupport::TimeZone) + time_zone + else + ActiveSupport::TimeZone.create(time_zone.name, nil, time_zone) + end + end + rescue TZInfo::InvalidTimezoneIdentifier + raise ArgumentError, "Invalid Timezone: #{time_zone}" + end + + # Returns a TimeZone instance matching the time zone provided. + # Accepts the time zone in any format supported by Time.zone=. + # Returns +nil+ for invalid time zones. + # + # Time.find_zone "America/New_York" # => # + # Time.find_zone "NOT-A-TIMEZONE" # => nil + def find_zone(time_zone) + find_zone!(time_zone) rescue nil + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/uri.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/uri.rb new file mode 100644 index 000000000000..cdd81ae56252 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/core_ext/uri.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require "uri" + +if RUBY_VERSION < "2.6.0" + require "active_support/core_ext/module/redefine_method" + URI::Parser.class_eval do + silence_redefinition_of_method :unescape + def unescape(str, escaped = /%[a-fA-F\d]{2}/) + # TODO: Are we actually sure that ASCII == UTF-8? + # YK: My initial experiments say yes, but let's be sure please + enc = str.encoding + enc = Encoding::UTF_8 if enc == Encoding::US_ASCII + str.dup.force_encoding(Encoding::ASCII_8BIT).gsub(escaped) { |match| [match[1, 2].hex].pack("C") }.force_encoding(enc) + end + end +end + +module URI + class << self + def parser + @parser ||= URI::Parser.new + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/current_attributes.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/current_attributes.rb new file mode 100644 index 000000000000..67ebe102d7af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/current_attributes.rb @@ -0,0 +1,203 @@ +# frozen_string_literal: true + +require "active_support/callbacks" + +module ActiveSupport + # Abstract super class that provides a thread-isolated attributes singleton, which resets automatically + # before and after each request. This allows you to keep all the per-request attributes easily + # available to the whole system. + # + # The following full app-like example demonstrates how to use a Current class to + # facilitate easy access to the global, per-request attributes without passing them deeply + # around everywhere: + # + # # app/models/current.rb + # class Current < ActiveSupport::CurrentAttributes + # attribute :account, :user + # attribute :request_id, :user_agent, :ip_address + # + # resets { Time.zone = nil } + # + # def user=(user) + # super + # self.account = user.account + # Time.zone = user.time_zone + # end + # end + # + # # app/controllers/concerns/authentication.rb + # module Authentication + # extend ActiveSupport::Concern + # + # included do + # before_action :authenticate + # end + # + # private + # def authenticate + # if authenticated_user = User.find_by(id: cookies.encrypted[:user_id]) + # Current.user = authenticated_user + # else + # redirect_to new_session_url + # end + # end + # end + # + # # app/controllers/concerns/set_current_request_details.rb + # module SetCurrentRequestDetails + # extend ActiveSupport::Concern + # + # included do + # before_action do + # Current.request_id = request.uuid + # Current.user_agent = request.user_agent + # Current.ip_address = request.ip + # end + # end + # end + # + # class ApplicationController < ActionController::Base + # include Authentication + # include SetCurrentRequestDetails + # end + # + # class MessagesController < ApplicationController + # def create + # Current.account.messages.create(message_params) + # end + # end + # + # class Message < ApplicationRecord + # belongs_to :creator, default: -> { Current.user } + # after_create { |message| Event.create(record: message) } + # end + # + # class Event < ApplicationRecord + # before_create do + # self.request_id = Current.request_id + # self.user_agent = Current.user_agent + # self.ip_address = Current.ip_address + # end + # end + # + # A word of caution: It's easy to overdo a global singleton like Current and tangle your model as a result. + # Current should only be used for a few, top-level globals, like account, user, and request details. + # The attributes stuck in Current should be used by more or less all actions on all requests. If you start + # sticking controller-specific attributes in there, you're going to create a mess. + class CurrentAttributes + include ActiveSupport::Callbacks + define_callbacks :reset + + class << self + # Returns singleton instance for this class in this thread. If none exists, one is created. + def instance + current_instances[name] ||= new + end + + # Declares one or more attributes that will be given both class and instance accessor methods. + def attribute(*names) + generated_attribute_methods.module_eval do + names.each do |name| + define_method(name) do + attributes[name.to_sym] + end + + define_method("#{name}=") do |attribute| + attributes[name.to_sym] = attribute + end + end + end + + names.each do |name| + define_singleton_method(name) do + instance.public_send(name) + end + + define_singleton_method("#{name}=") do |attribute| + instance.public_send("#{name}=", attribute) + end + end + end + + # Calls this block before #reset is called on the instance. Used for resetting external collaborators that depend on current values. + def before_reset(&block) + set_callback :reset, :before, &block + end + + # Calls this block after #reset is called on the instance. Used for resetting external collaborators, like Time.zone. + def resets(&block) + set_callback :reset, :after, &block + end + alias_method :after_reset, :resets + + delegate :set, :reset, to: :instance + + def reset_all # :nodoc: + current_instances.each_value(&:reset) + end + + def clear_all # :nodoc: + reset_all + current_instances.clear + end + + private + def generated_attribute_methods + @generated_attribute_methods ||= Module.new.tap { |mod| include mod } + end + + def current_instances + Thread.current[:current_attributes_instances] ||= {} + end + + def method_missing(name, *args, &block) + # Caches the method definition as a singleton method of the receiver. + # + # By letting #delegate handle it, we avoid an enclosure that'll capture args. + singleton_class.delegate name, to: :instance + + send(name, *args, &block) + end + end + + attr_accessor :attributes + + def initialize + @attributes = {} + end + + # Expose one or more attributes within a block. Old values are returned after the block concludes. + # Example demonstrating the common use of needing to set Current attributes outside the request-cycle: + # + # class Chat::PublicationJob < ApplicationJob + # def perform(attributes, room_number, creator) + # Current.set(person: creator) do + # Chat::Publisher.publish(attributes: attributes, room_number: room_number) + # end + # end + # end + def set(set_attributes) + old_attributes = compute_attributes(set_attributes.keys) + assign_attributes(set_attributes) + yield + ensure + assign_attributes(old_attributes) + end + + # Reset all attributes. Should be called before and after actions, when used as a per-request singleton. + def reset + run_callbacks :reset do + self.attributes = {} + end + end + + private + def assign_attributes(new_attributes) + new_attributes.each { |key, value| public_send("#{key}=", value) } + end + + def compute_attributes(keys) + keys.collect { |key| [ key, public_send(key) ] }.to_h + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies.rb new file mode 100644 index 000000000000..6d71a67a46c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies.rb @@ -0,0 +1,804 @@ +# frozen_string_literal: true + +require "set" +require "thread" +require "concurrent/map" +require "pathname" +require "active_support/core_ext/module/aliasing" +require "active_support/core_ext/module/attribute_accessors" +require "active_support/core_ext/module/introspection" +require "active_support/core_ext/module/anonymous" +require "active_support/core_ext/object/blank" +require "active_support/core_ext/kernel/reporting" +require "active_support/core_ext/load_error" +require "active_support/core_ext/name_error" +require "active_support/core_ext/string/starts_ends_with" +require "active_support/dependencies/interlock" +require "active_support/inflector" + +module ActiveSupport #:nodoc: + module Dependencies #:nodoc: + extend self + + UNBOUND_METHOD_MODULE_NAME = Module.instance_method(:name) + private_constant :UNBOUND_METHOD_MODULE_NAME + + mattr_accessor :interlock, default: Interlock.new + + # :doc: + + # Execute the supplied block without interference from any + # concurrent loads. + def self.run_interlock + Dependencies.interlock.running { yield } + end + + # Execute the supplied block while holding an exclusive lock, + # preventing any other thread from being inside a #run_interlock + # block at the same time. + def self.load_interlock + Dependencies.interlock.loading { yield } + end + + # Execute the supplied block while holding an exclusive lock, + # preventing any other thread from being inside a #run_interlock + # block at the same time. + def self.unload_interlock + Dependencies.interlock.unloading { yield } + end + + # :nodoc: + + # Should we turn on Ruby warnings on the first load of dependent files? + mattr_accessor :warnings_on_first_load, default: false + + # All files ever loaded. + mattr_accessor :history, default: Set.new + + # All files currently loaded. + mattr_accessor :loaded, default: Set.new + + # Stack of files being loaded. + mattr_accessor :loading, default: [] + + # Should we load files or require them? + mattr_accessor :mechanism, default: ENV["NO_RELOAD"] ? :require : :load + + # The set of directories from which we may automatically load files. Files + # under these directories will be reloaded on each request in development mode, + # unless the directory also appears in autoload_once_paths. + mattr_accessor :autoload_paths, default: [] + + # The set of directories from which automatically loaded constants are loaded + # only once. All directories in this set must also be present in +autoload_paths+. + mattr_accessor :autoload_once_paths, default: [] + + # This is a private set that collects all eager load paths during bootstrap. + # Useful for Zeitwerk integration. Its public interface is the config.* path + # accessors of each engine. + mattr_accessor :_eager_load_paths, default: Set.new + + # An array of qualified constant names that have been loaded. Adding a name + # to this array will cause it to be unloaded the next time Dependencies are + # cleared. + mattr_accessor :autoloaded_constants, default: [] + + # An array of constant names that need to be unloaded on every request. Used + # to allow arbitrary constants to be marked for unloading. + mattr_accessor :explicitly_unloadable_constants, default: [] + + # The logger used when tracing autoloads. + mattr_accessor :logger + + # If true, trace autoloads with +logger.debug+. + mattr_accessor :verbose, default: false + + # The WatchStack keeps a stack of the modules being watched as files are + # loaded. If a file in the process of being loaded (parent.rb) triggers the + # load of another file (child.rb) the stack will ensure that child.rb + # handles the new constants. + # + # If child.rb is being autoloaded, its constants will be added to + # autoloaded_constants. If it was being required, they will be discarded. + # + # This is handled by walking back up the watch stack and adding the constants + # found by child.rb to the list of original constants in parent.rb. + class WatchStack + include Enumerable + + # @watching is a stack of lists of constants being watched. For instance, + # if parent.rb is autoloaded, the stack will look like [[Object]]. If + # parent.rb then requires namespace/child.rb, the stack will look like + # [[Object], [Namespace]]. + + attr_reader :watching + + def initialize + @watching = [] + @stack = Hash.new { |h, k| h[k] = [] } + end + + def each(&block) + @stack.each(&block) + end + + def watching? + !@watching.empty? + end + + # Returns a list of new constants found since the last call to + # watch_namespaces. + def new_constants + constants = [] + + # Grab the list of namespaces that we're looking for new constants under + @watching.last.each do |namespace| + # Retrieve the constants that were present under the namespace when watch_namespaces + # was originally called + original_constants = @stack[namespace].last + + mod = Inflector.constantize(namespace) if Dependencies.qualified_const_defined?(namespace) + next unless mod.is_a?(Module) + + # Get a list of the constants that were added + new_constants = mod.constants(false) - original_constants + + # @stack[namespace] returns an Array of the constants that are being evaluated + # for that namespace. For instance, if parent.rb requires child.rb, the first + # element of @stack[Object] will be an Array of the constants that were present + # before parent.rb was required. The second element will be an Array of the + # constants that were present before child.rb was required. + @stack[namespace].each do |namespace_constants| + namespace_constants.concat(new_constants) + end + + # Normalize the list of new constants, and add them to the list we will return + new_constants.each do |suffix| + constants << ([namespace, suffix] - ["Object"]).join("::") + end + end + constants + ensure + # A call to new_constants is always called after a call to watch_namespaces + pop_modules(@watching.pop) + end + + # Add a set of modules to the watch stack, remembering the initial + # constants. + def watch_namespaces(namespaces) + @watching << namespaces.map do |namespace| + module_name = Dependencies.to_constant_name(namespace) + original_constants = Dependencies.qualified_const_defined?(module_name) ? + Inflector.constantize(module_name).constants(false) : [] + + @stack[module_name] << original_constants + module_name + end + end + + private + def pop_modules(modules) + modules.each { |mod| @stack[mod].pop } + end + end + + # An internal stack used to record which constants are loaded by any block. + mattr_accessor :constant_watch_stack, default: WatchStack.new + + # Module includes this module. + module ModuleConstMissing #:nodoc: + def self.append_features(base) + base.class_eval do + # Emulate #exclude via an ivar + return if defined?(@_const_missing) && @_const_missing + @_const_missing = instance_method(:const_missing) + remove_method(:const_missing) + end + super + end + + def self.exclude_from(base) + base.class_eval do + define_method :const_missing, @_const_missing + @_const_missing = nil + end + end + + def self.include_into(base) + base.include(self) + append_features(base) + end + + def const_missing(const_name) + from_mod = anonymous? ? guess_for_anonymous(const_name) : self + Dependencies.load_missing_constant(from_mod, const_name) + end + + # We assume that the name of the module reflects the nesting + # (unless it can be proven that is not the case) and the path to the file + # that defines the constant. Anonymous modules cannot follow these + # conventions and therefore we assume that the user wants to refer to a + # top-level constant. + def guess_for_anonymous(const_name) + if Object.const_defined?(const_name) + raise NameError.new "#{const_name} cannot be autoloaded from an anonymous class or module", const_name + else + Object + end + end + + def unloadable(const_desc = self) + super(const_desc) + end + end + + # Object includes this module. + module Loadable #:nodoc: + def self.exclude_from(base) + base.class_eval do + define_method(:load, Kernel.instance_method(:load)) + private :load + + define_method(:require, Kernel.instance_method(:require)) + private :require + end + end + + def self.include_into(base) + base.include(self) + + if base.instance_method(:load).owner == base + base.remove_method(:load) + end + + if base.instance_method(:require).owner == base + base.remove_method(:require) + end + end + + def require_or_load(file_name) + Dependencies.require_or_load(file_name) + end + + # :doc: + + # Interprets a file using mechanism and marks its defined + # constants as autoloaded. file_name can be either a string or + # respond to to_path. + # + # Use this method in code that absolutely needs a certain constant to be + # defined at that point. A typical use case is to make constant name + # resolution deterministic for constants with the same relative name in + # different namespaces whose evaluation would depend on load order + # otherwise. + def require_dependency(file_name, message = "No such file to load -- %s.rb") + file_name = file_name.to_path if file_name.respond_to?(:to_path) + unless file_name.is_a?(String) + raise ArgumentError, "the file name must either be a String or implement #to_path -- you passed #{file_name.inspect}" + end + + Dependencies.depend_on(file_name, message) + end + + # :nodoc: + + def load_dependency(file) + if Dependencies.load? && Dependencies.constant_watch_stack.watching? + descs = Dependencies.constant_watch_stack.watching.flatten.uniq + + Dependencies.new_constants_in(*descs) { yield } + else + yield + end + rescue Exception => exception # errors from loading file + exception.blame_file! file if exception.respond_to? :blame_file! + raise + end + + # Mark the given constant as unloadable. Unloadable constants are removed + # each time dependencies are cleared. + # + # Note that marking a constant for unloading need only be done once. Setup + # or init scripts may list each unloadable constant that may need unloading; + # each constant will be removed for every subsequent clear, as opposed to + # for the first clear. + # + # The provided constant descriptor may be a (non-anonymous) module or class, + # or a qualified constant name as a string or symbol. + # + # Returns +true+ if the constant was not previously marked for unloading, + # +false+ otherwise. + def unloadable(const_desc) + Dependencies.mark_for_unload const_desc + end + + private + def load(file, wrap = false) + result = false + load_dependency(file) { result = super } + result + end + + def require(file) + result = false + load_dependency(file) { result = super } + result + end + end + + # Exception file-blaming. + module Blamable #:nodoc: + def blame_file!(file) + (@blamed_files ||= []).unshift file + end + + def blamed_files + @blamed_files ||= [] + end + + def describe_blame + return nil if blamed_files.empty? + "This error occurred while loading the following files:\n #{blamed_files.join "\n "}" + end + + def copy_blame!(exc) + @blamed_files = exc.blamed_files.clone + self + end + end + + def hook! + Loadable.include_into(Object) + ModuleConstMissing.include_into(Module) + Exception.include(Blamable) + end + + def unhook! + ModuleConstMissing.exclude_from(Module) + Loadable.exclude_from(Object) + end + + def load? + mechanism == :load + end + + def depend_on(file_name, message = "No such file to load -- %s.rb") + path = search_for_file(file_name) + require_or_load(path || file_name) + rescue LoadError => load_error + if file_name = load_error.message[/ -- (.*?)(\.rb)?$/, 1] + load_error.message.replace(message % file_name) + load_error.copy_blame!(load_error) + end + raise + end + + def clear + Dependencies.unload_interlock do + loaded.clear + loading.clear + remove_unloadable_constants! + end + end + + def require_or_load(file_name, const_path = nil) + file_name = file_name.chomp(".rb") + expanded = File.expand_path(file_name) + return if loaded.include?(expanded) + + Dependencies.load_interlock do + # Maybe it got loaded while we were waiting for our lock: + return if loaded.include?(expanded) + + # Record that we've seen this file *before* loading it to avoid an + # infinite loop with mutual dependencies. + loaded << expanded + loading << expanded + + begin + if load? + # Enable warnings if this file has not been loaded before and + # warnings_on_first_load is set. + load_args = ["#{file_name}.rb"] + load_args << const_path unless const_path.nil? + + if !warnings_on_first_load || history.include?(expanded) + result = load_file(*load_args) + else + enable_warnings { result = load_file(*load_args) } + end + else + result = require file_name + end + rescue Exception + loaded.delete expanded + raise + ensure + loading.pop + end + + # Record history *after* loading so first load gets warnings. + history << expanded + result + end + end + + # Is the provided constant path defined? + def qualified_const_defined?(path) + Object.const_defined?(path, false) + end + + # Given +path+, a filesystem path to a ruby file, return an array of + # constant paths which would cause Dependencies to attempt to load this + # file. + def loadable_constants_for_path(path, bases = autoload_paths) + path = path.chomp(".rb") + expanded_path = File.expand_path(path) + paths = [] + + bases.each do |root| + expanded_root = File.expand_path(root) + next unless expanded_path.start_with?(expanded_root) + + root_size = expanded_root.size + next if expanded_path[root_size] != ?/ + + nesting = expanded_path[(root_size + 1)..-1] + paths << nesting.camelize unless nesting.blank? + end + + paths.uniq! + paths + end + + # Search for a file in autoload_paths matching the provided suffix. + def search_for_file(path_suffix) + path_suffix += ".rb" unless path_suffix.ends_with?(".rb") + + autoload_paths.each do |root| + path = File.join(root, path_suffix) + return path if File.file? path + end + nil # Gee, I sure wish we had first_match ;-) + end + + # Does the provided path_suffix correspond to an autoloadable module? + # Instead of returning a boolean, the autoload base for this module is + # returned. + def autoloadable_module?(path_suffix) + autoload_paths.each do |load_path| + return load_path if File.directory? File.join(load_path, path_suffix) + end + nil + end + + def load_once_path?(path) + # to_s works around a ruby issue where String#starts_with?(Pathname) + # will raise a TypeError: no implicit conversion of Pathname into String + autoload_once_paths.any? { |base| path.starts_with? base.to_s } + end + + # Attempt to autoload the provided module name by searching for a directory + # matching the expected path suffix. If found, the module is created and + # assigned to +into+'s constants with the name +const_name+. Provided that + # the directory was loaded from a reloadable base path, it is added to the + # set of constants that are to be unloaded. + def autoload_module!(into, const_name, qualified_name, path_suffix) + return nil unless base_path = autoloadable_module?(path_suffix) + mod = Module.new + into.const_set const_name, mod + log("constant #{qualified_name} autoloaded (module autovivified from #{File.join(base_path, path_suffix)})") + autoloaded_constants << qualified_name unless autoload_once_paths.include?(base_path) + autoloaded_constants.uniq! + mod + end + + # Load the file at the provided path. +const_paths+ is a set of qualified + # constant names. When loading the file, Dependencies will watch for the + # addition of these constants. Each that is defined will be marked as + # autoloaded, and will be removed when Dependencies.clear is next called. + # + # If the second parameter is left off, then Dependencies will construct a + # set of names that the file at +path+ may define. See + # +loadable_constants_for_path+ for more details. + def load_file(path, const_paths = loadable_constants_for_path(path)) + const_paths = [const_paths].compact unless const_paths.is_a? Array + parent_paths = const_paths.collect { |const_path| const_path[/.*(?=::)/] || ::Object } + + result = nil + newly_defined_paths = new_constants_in(*parent_paths) do + result = Kernel.load path + end + + autoloaded_constants.concat newly_defined_paths unless load_once_path?(path) + autoloaded_constants.uniq! + result + end + + # Returns the constant path for the provided parent and constant name. + def qualified_name_for(mod, name) + mod_name = to_constant_name mod + mod_name == "Object" ? name.to_s : "#{mod_name}::#{name}" + end + + # Load the constant named +const_name+ which is missing from +from_mod+. If + # it is not possible to load the constant into from_mod, try its parent + # module using +const_missing+. + def load_missing_constant(from_mod, const_name) + unless qualified_const_defined?(from_mod.name) && Inflector.constantize(from_mod.name).equal?(from_mod) + raise ArgumentError, "A copy of #{from_mod} has been removed from the module tree but is still active!" + end + + qualified_name = qualified_name_for(from_mod, const_name) + path_suffix = qualified_name.underscore + + file_path = search_for_file(path_suffix) + + if file_path + expanded = File.expand_path(file_path) + expanded.sub!(/\.rb\z/, "") + + if loading.include?(expanded) + raise "Circular dependency detected while autoloading constant #{qualified_name}" + else + require_or_load(expanded, qualified_name) + + if from_mod.const_defined?(const_name, false) + log("constant #{qualified_name} autoloaded from #{expanded}.rb") + return from_mod.const_get(const_name) + else + raise LoadError, "Unable to autoload constant #{qualified_name}, expected #{file_path} to define it" + end + end + elsif mod = autoload_module!(from_mod, const_name, qualified_name, path_suffix) + return mod + elsif (parent = from_mod.module_parent) && parent != from_mod && + ! from_mod.module_parents.any? { |p| p.const_defined?(const_name, false) } + # If our parents do not have a constant named +const_name+ then we are free + # to attempt to load upwards. If they do have such a constant, then this + # const_missing must be due to from_mod::const_name, which should not + # return constants from from_mod's parents. + begin + # Since Ruby does not pass the nesting at the point the unknown + # constant triggered the callback we cannot fully emulate constant + # name lookup and need to make a trade-off: we are going to assume + # that the nesting in the body of Foo::Bar is [Foo::Bar, Foo] even + # though it might not be. Counterexamples are + # + # class Foo::Bar + # Module.nesting # => [Foo::Bar] + # end + # + # or + # + # module M::N + # module S::T + # Module.nesting # => [S::T, M::N] + # end + # end + # + # for example. + return parent.const_missing(const_name) + rescue NameError => e + raise unless e.missing_name? qualified_name_for(parent, const_name) + end + end + + name_error = NameError.new("uninitialized constant #{qualified_name}", const_name) + name_error.set_backtrace(caller.reject { |l| l.starts_with? __FILE__ }) + raise name_error + end + + # Remove the constants that have been autoloaded, and those that have been + # marked for unloading. Before each constant is removed a callback is sent + # to its class/module if it implements +before_remove_const+. + # + # The callback implementation should be restricted to cleaning up caches, etc. + # as the environment will be in an inconsistent state, e.g. other constants + # may have already been unloaded and not accessible. + def remove_unloadable_constants! + log("removing unloadable constants") + autoloaded_constants.each { |const| remove_constant const } + autoloaded_constants.clear + Reference.clear! + explicitly_unloadable_constants.each { |const| remove_constant const } + end + + class ClassCache + def initialize + @store = Concurrent::Map.new + end + + def empty? + @store.empty? + end + + def key?(key) + @store.key?(key) + end + + def get(key) + key = key.name if key.respond_to?(:name) + @store[key] ||= Inflector.constantize(key) + end + alias :[] :get + + def safe_get(key) + key = key.name if key.respond_to?(:name) + @store[key] ||= Inflector.safe_constantize(key) + end + + def store(klass) + return self unless klass.respond_to?(:name) + raise(ArgumentError, "anonymous classes cannot be cached") if klass.name.empty? + @store[klass.name] = klass + self + end + + def clear! + @store.clear + end + end + + Reference = ClassCache.new + + # Store a reference to a class +klass+. + def reference(klass) + Reference.store klass + end + + # Get the reference for class named +name+. + # Raises an exception if referenced class does not exist. + def constantize(name) + Reference.get(name) + end + + # Get the reference for class named +name+ if one exists. + # Otherwise returns +nil+. + def safe_constantize(name) + Reference.safe_get(name) + end + + # Determine if the given constant has been automatically loaded. + def autoloaded?(desc) + return false if desc.is_a?(Module) && real_mod_name(desc).nil? + name = to_constant_name desc + return false unless qualified_const_defined?(name) + autoloaded_constants.include?(name) + end + + # Will the provided constant descriptor be unloaded? + def will_unload?(const_desc) + autoloaded?(const_desc) || + explicitly_unloadable_constants.include?(to_constant_name(const_desc)) + end + + # Mark the provided constant name for unloading. This constant will be + # unloaded on each request, not just the next one. + def mark_for_unload(const_desc) + name = to_constant_name const_desc + if explicitly_unloadable_constants.include? name + false + else + explicitly_unloadable_constants << name + true + end + end + + # Run the provided block and detect the new constants that were loaded during + # its execution. Constants may only be regarded as 'new' once -- so if the + # block calls +new_constants_in+ again, then the constants defined within the + # inner call will not be reported in this one. + # + # If the provided block does not run to completion, and instead raises an + # exception, any new constants are regarded as being only partially defined + # and will be removed immediately. + def new_constants_in(*descs) + constant_watch_stack.watch_namespaces(descs) + success = false + + begin + yield # Now yield to the code that is to define new constants. + success = true + ensure + new_constants = constant_watch_stack.new_constants + + return new_constants if success + + # Remove partially loaded constants. + new_constants.each { |c| remove_constant(c) } + end + end + + # Convert the provided const desc to a qualified constant name (as a string). + # A module, class, symbol, or string may be provided. + def to_constant_name(desc) #:nodoc: + case desc + when String then desc.sub(/^::/, "") + when Symbol then desc.to_s + when Module + real_mod_name(desc) || + raise(ArgumentError, "Anonymous modules have no name to be referenced by") + else raise TypeError, "Not a valid constant descriptor: #{desc.inspect}" + end + end + + def remove_constant(const) #:nodoc: + # Normalize ::Foo, ::Object::Foo, Object::Foo, Object::Object::Foo, etc. as Foo. + normalized = const.to_s.sub(/\A::/, "") + normalized.sub!(/\A(Object::)+/, "") + + constants = normalized.split("::") + to_remove = constants.pop + + # Remove the file path from the loaded list. + file_path = search_for_file(const.underscore) + if file_path + expanded = File.expand_path(file_path) + expanded.sub!(/\.rb\z/, "") + loaded.delete(expanded) + end + + if constants.empty? + parent = Object + else + # This method is robust to non-reachable constants. + # + # Non-reachable constants may be passed if some of the parents were + # autoloaded and already removed. It is easier to do a sanity check + # here than require the caller to be clever. We check the parent + # rather than the very const argument because we do not want to + # trigger Kernel#autoloads, see the comment below. + parent_name = constants.join("::") + return unless qualified_const_defined?(parent_name) + parent = constantize(parent_name) + end + + # In an autoloaded user.rb like this + # + # autoload :Foo, 'foo' + # + # class User < ActiveRecord::Base + # end + # + # we correctly register "Foo" as being autoloaded. But if the app does + # not use the "Foo" constant we need to be careful not to trigger + # loading "foo.rb" ourselves. While #const_defined? and #const_get? do + # require the file, #autoload? and #remove_const don't. + # + # We are going to remove the constant nonetheless ---which exists as + # far as Ruby is concerned--- because if the user removes the macro + # call from a class or module that were not autoloaded, as in the + # example above with Object, accessing to that constant must err. + unless parent.autoload?(to_remove) + begin + constantized = parent.const_get(to_remove, false) + rescue NameError + # The constant is no longer reachable, just skip it. + return + else + constantized.before_remove_const if constantized.respond_to?(:before_remove_const) + end + end + + begin + parent.instance_eval { remove_const to_remove } + rescue NameError + # The constant is no longer reachable, just skip it. + end + end + + def log(message) + logger.debug("autoloading: #{message}") if logger && verbose + end + + private + # Returns the original name of a class or module even if `name` has been + # overridden. + def real_mod_name(mod) + UNBOUND_METHOD_MODULE_NAME.bind(mod).call + end + end +end + +ActiveSupport::Dependencies.hook! diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies/autoload.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies/autoload.rb new file mode 100644 index 000000000000..1cee85d98fc0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies/autoload.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: true + +require "active_support/inflector/methods" + +module ActiveSupport + # Autoload and eager load conveniences for your library. + # + # This module allows you to define autoloads based on + # Rails conventions (i.e. no need to define the path + # it is automatically guessed based on the filename) + # and also define a set of constants that needs to be + # eager loaded: + # + # module MyLib + # extend ActiveSupport::Autoload + # + # autoload :Model + # + # eager_autoload do + # autoload :Cache + # end + # end + # + # Then your library can be eager loaded by simply calling: + # + # MyLib.eager_load! + module Autoload + def self.extended(base) # :nodoc: + base.class_eval do + @_autoloads = {} + @_under_path = nil + @_at_path = nil + @_eager_autoload = false + end + end + + def autoload(const_name, path = @_at_path) + unless path + full = [name, @_under_path, const_name.to_s].compact.join("::") + path = Inflector.underscore(full) + end + + if @_eager_autoload + @_autoloads[const_name] = path + end + + super const_name, path + end + + def autoload_under(path) + @_under_path, old_path = path, @_under_path + yield + ensure + @_under_path = old_path + end + + def autoload_at(path) + @_at_path, old_path = path, @_at_path + yield + ensure + @_at_path = old_path + end + + def eager_autoload + old_eager, @_eager_autoload = @_eager_autoload, true + yield + ensure + @_eager_autoload = old_eager + end + + def eager_load! + @_autoloads.each_value { |file| require file } + end + + def autoloads + @_autoloads + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies/interlock.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies/interlock.rb new file mode 100644 index 000000000000..948be756387b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies/interlock.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +require "active_support/concurrency/share_lock" + +module ActiveSupport #:nodoc: + module Dependencies #:nodoc: + class Interlock + def initialize # :nodoc: + @lock = ActiveSupport::Concurrency::ShareLock.new + end + + def loading + @lock.exclusive(purpose: :load, compatible: [:load], after_compatible: [:load]) do + yield + end + end + + def unloading + @lock.exclusive(purpose: :unload, compatible: [:load, :unload], after_compatible: [:load, :unload]) do + yield + end + end + + def start_unloading + @lock.start_exclusive(purpose: :unload, compatible: [:load, :unload]) + end + + def done_unloading + @lock.stop_exclusive(compatible: [:load, :unload]) + end + + def start_running + @lock.start_sharing + end + + def done_running + @lock.stop_sharing + end + + def running + @lock.sharing do + yield + end + end + + def permit_concurrent_loads + @lock.yield_shares(compatible: [:load]) do + yield + end + end + + def raw_state(&block) # :nodoc: + @lock.raw_state(&block) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies/zeitwerk_integration.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies/zeitwerk_integration.rb new file mode 100644 index 000000000000..2155fba0a9c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/dependencies/zeitwerk_integration.rb @@ -0,0 +1,117 @@ +# frozen_string_literal: true + +require "set" +require "active_support/core_ext/string/inflections" + +module ActiveSupport + module Dependencies + module ZeitwerkIntegration # :nodoc: all + module Decorations + def clear + Dependencies.unload_interlock do + Rails.autoloaders.main.reload + rescue Zeitwerk::ReloadingDisabledError + raise "reloading is disabled because config.cache_classes is true" + end + end + + def constantize(cpath) + ActiveSupport::Inflector.constantize(cpath) + end + + def safe_constantize(cpath) + ActiveSupport::Inflector.safe_constantize(cpath) + end + + def autoloaded_constants + Rails.autoloaders.main.unloadable_cpaths + end + + def autoloaded?(object) + cpath = object.is_a?(Module) ? real_mod_name(object) : object.to_s + Rails.autoloaders.main.unloadable_cpath?(cpath) + end + + def verbose=(verbose) + l = verbose ? logger || Rails.logger : nil + Rails.autoloaders.each { |autoloader| autoloader.logger = l } + end + + def unhook! + :no_op + end + end + + module RequireDependency + def require_dependency(filename) + filename = filename.to_path if filename.respond_to?(:to_path) + if abspath = ActiveSupport::Dependencies.search_for_file(filename) + require abspath + else + require filename + end + end + end + + module Inflector + # Concurrent::Map is not needed. This is a private class, and overrides + # must be defined while the application boots. + @overrides = {} + + def self.camelize(basename, _abspath) + @overrides[basename] || basename.camelize + end + + def self.inflect(overrides) + @overrides.merge!(overrides) + end + end + + class << self + def take_over(enable_reloading:) + setup_autoloaders(enable_reloading) + freeze_paths + decorate_dependencies + end + + private + def setup_autoloaders(enable_reloading) + Dependencies.autoload_paths.each do |autoload_path| + # Zeitwerk only accepts existing directories in `push_dir` to + # prevent misconfigurations. + next unless File.directory?(autoload_path) + + autoloader = \ + autoload_once?(autoload_path) ? Rails.autoloaders.once : Rails.autoloaders.main + + autoloader.push_dir(autoload_path) + autoloader.do_not_eager_load(autoload_path) unless eager_load?(autoload_path) + end + + Rails.autoloaders.main.enable_reloading if enable_reloading + Rails.autoloaders.each(&:setup) + end + + def autoload_once?(autoload_path) + Dependencies.autoload_once_paths.include?(autoload_path) + end + + def eager_load?(autoload_path) + Dependencies._eager_load_paths.member?(autoload_path) + end + + def freeze_paths + Dependencies.autoload_paths.freeze + Dependencies.autoload_once_paths.freeze + Dependencies._eager_load_paths.freeze + end + + def decorate_dependencies + Dependencies.unhook! + Dependencies.singleton_class.prepend(Decorations) + Object.prepend(RequireDependency) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation.rb new file mode 100644 index 000000000000..7271ab565bba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require "singleton" + +module ActiveSupport + # \Deprecation specifies the API used by Rails to deprecate methods, instance + # variables, objects and constants. + class Deprecation + # active_support.rb sets an autoload for ActiveSupport::Deprecation. + # + # If these requires were at the top of the file the constant would not be + # defined by the time their files were loaded. Since some of them reopen + # ActiveSupport::Deprecation its autoload would be triggered, resulting in + # a circular require warning for active_support/deprecation.rb. + # + # So, we define the constant first, and load dependencies later. + require "active_support/deprecation/instance_delegator" + require "active_support/deprecation/behaviors" + require "active_support/deprecation/reporting" + require "active_support/deprecation/constant_accessor" + require "active_support/deprecation/method_wrappers" + require "active_support/deprecation/proxy_wrappers" + require "active_support/core_ext/module/deprecation" + + include Singleton + include InstanceDelegator + include Behavior + include Reporting + include MethodWrapper + + # The version number in which the deprecated behavior will be removed, by default. + attr_accessor :deprecation_horizon + + # It accepts two parameters on initialization. The first is a version of library + # and the second is a library name. + # + # ActiveSupport::Deprecation.new('2.0', 'MyLibrary') + def initialize(deprecation_horizon = "6.1", gem_name = "Rails") + self.gem_name = gem_name + self.deprecation_horizon = deprecation_horizon + # By default, warnings are not silenced and debugging is off. + self.silenced = false + self.debug = false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/behaviors.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/behaviors.rb new file mode 100644 index 000000000000..725667d139f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/behaviors.rb @@ -0,0 +1,109 @@ +# frozen_string_literal: true + +require "active_support/notifications" + +module ActiveSupport + # Raised when ActiveSupport::Deprecation::Behavior#behavior is set with :raise. + # You would set :raise, as a behavior to raise errors and proactively report exceptions from deprecations. + class DeprecationException < StandardError + end + + class Deprecation + # Default warning behaviors per Rails.env. + DEFAULT_BEHAVIORS = { + raise: ->(message, callstack, deprecation_horizon, gem_name) { + e = DeprecationException.new(message) + e.set_backtrace(callstack.map(&:to_s)) + raise e + }, + + stderr: ->(message, callstack, deprecation_horizon, gem_name) { + $stderr.puts(message) + $stderr.puts callstack.join("\n ") if debug + }, + + log: ->(message, callstack, deprecation_horizon, gem_name) { + logger = + if defined?(Rails.logger) && Rails.logger + Rails.logger + else + require "active_support/logger" + ActiveSupport::Logger.new($stderr) + end + logger.warn message + logger.debug callstack.join("\n ") if debug + }, + + notify: ->(message, callstack, deprecation_horizon, gem_name) { + notification_name = "deprecation.#{gem_name.underscore.tr('/', '_')}" + ActiveSupport::Notifications.instrument(notification_name, + message: message, + callstack: callstack, + gem_name: gem_name, + deprecation_horizon: deprecation_horizon) + }, + + silence: ->(message, callstack, deprecation_horizon, gem_name) { }, + } + + # Behavior module allows to determine how to display deprecation messages. + # You can create a custom behavior or set any from the +DEFAULT_BEHAVIORS+ + # constant. Available behaviors are: + # + # [+raise+] Raise ActiveSupport::DeprecationException. + # [+stderr+] Log all deprecation warnings to +$stderr+. + # [+log+] Log all deprecation warnings to +Rails.logger+. + # [+notify+] Use +ActiveSupport::Notifications+ to notify +deprecation.rails+. + # [+silence+] Do nothing. + # + # Setting behaviors only affects deprecations that happen after boot time. + # For more information you can read the documentation of the +behavior=+ method. + module Behavior + # Whether to print a backtrace along with the warning. + attr_accessor :debug + + # Returns the current behavior or if one isn't set, defaults to +:stderr+. + def behavior + @behavior ||= [DEFAULT_BEHAVIORS[:stderr]] + end + + # Sets the behavior to the specified value. Can be a single value, array, + # or an object that responds to +call+. + # + # Available behaviors: + # + # [+raise+] Raise ActiveSupport::DeprecationException. + # [+stderr+] Log all deprecation warnings to +$stderr+. + # [+log+] Log all deprecation warnings to +Rails.logger+. + # [+notify+] Use +ActiveSupport::Notifications+ to notify +deprecation.rails+. + # [+silence+] Do nothing. + # + # Setting behaviors only affects deprecations that happen after boot time. + # Deprecation warnings raised by gems are not affected by this setting + # because they happen before Rails boots up. + # + # ActiveSupport::Deprecation.behavior = :stderr + # ActiveSupport::Deprecation.behavior = [:stderr, :log] + # ActiveSupport::Deprecation.behavior = MyCustomHandler + # ActiveSupport::Deprecation.behavior = ->(message, callstack, deprecation_horizon, gem_name) { + # # custom stuff + # } + def behavior=(behavior) + @behavior = Array(behavior).map { |b| DEFAULT_BEHAVIORS[b] || arity_coerce(b) } + end + + private + def arity_coerce(behavior) + unless behavior.respond_to?(:call) + raise ArgumentError, "#{behavior.inspect} is not a valid deprecation behavior." + end + + if behavior.arity == 4 || behavior.arity == -1 + behavior + else + -> message, callstack, _, _ { behavior.call(message, callstack) } + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/constant_accessor.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/constant_accessor.rb new file mode 100644 index 000000000000..1ed00158123e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/constant_accessor.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module ActiveSupport + class Deprecation + # DeprecatedConstantAccessor transforms a constant into a deprecated one by + # hooking +const_missing+. + # + # It takes the names of an old (deprecated) constant and of a new constant + # (both in string form) and optionally a deprecator. The deprecator defaults + # to +ActiveSupport::Deprecator+ if none is specified. + # + # The deprecated constant now returns the same object as the new one rather + # than a proxy object, so it can be used transparently in +rescue+ blocks + # etc. + # + # PLANETS = %w(mercury venus earth mars jupiter saturn uranus neptune pluto) + # + # # (In a later update, the original implementation of `PLANETS` has been removed.) + # + # PLANETS_POST_2006 = %w(mercury venus earth mars jupiter saturn uranus neptune) + # include ActiveSupport::Deprecation::DeprecatedConstantAccessor + # deprecate_constant 'PLANETS', 'PLANETS_POST_2006' + # + # PLANETS.map { |planet| planet.capitalize } + # # => DEPRECATION WARNING: PLANETS is deprecated! Use PLANETS_POST_2006 instead. + # (Backtrace information…) + # ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"] + module DeprecatedConstantAccessor + def self.included(base) + require "active_support/inflector/methods" + + extension = Module.new do + def const_missing(missing_const_name) + if class_variable_defined?(:@@_deprecated_constants) + if (replacement = class_variable_get(:@@_deprecated_constants)[missing_const_name.to_s]) + replacement[:deprecator].warn(replacement[:message] || "#{name}::#{missing_const_name} is deprecated! Use #{replacement[:new]} instead.", caller_locations) + return ActiveSupport::Inflector.constantize(replacement[:new].to_s) + end + end + super + end + + def deprecate_constant(const_name, new_constant, message: nil, deprecator: ActiveSupport::Deprecation.instance) + class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants) + class_variable_get(:@@_deprecated_constants)[const_name.to_s] = { new: new_constant, message: message, deprecator: deprecator } + end + end + base.singleton_class.prepend extension + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/instance_delegator.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/instance_delegator.rb new file mode 100644 index 000000000000..8beda373a267 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/instance_delegator.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +require "active_support/core_ext/kernel/singleton_class" +require "active_support/core_ext/module/delegation" + +module ActiveSupport + class Deprecation + module InstanceDelegator # :nodoc: + def self.included(base) + base.extend(ClassMethods) + base.singleton_class.prepend(OverrideDelegators) + base.public_class_method :new + end + + module ClassMethods # :nodoc: + def include(included_module) + included_module.instance_methods.each { |m| method_added(m) } + super + end + + def method_added(method_name) + singleton_class.delegate(method_name, to: :instance) + end + end + + module OverrideDelegators # :nodoc: + def warn(message = nil, callstack = nil) + callstack ||= caller_locations(2) + super + end + + def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil) + caller_backtrace ||= caller_locations(2) + super + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/method_wrappers.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/method_wrappers.rb new file mode 100644 index 000000000000..bc202ff2e4e0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/method_wrappers.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require "active_support/core_ext/array/extract_options" +require "active_support/core_ext/module/redefine_method" + +module ActiveSupport + class Deprecation + module MethodWrapper + # Declare that a method has been deprecated. + # + # class Fred + # def aaa; end + # def bbb; end + # def ccc; end + # def ddd; end + # def eee; end + # end + # + # Using the default deprecator: + # ActiveSupport::Deprecation.deprecate_methods(Fred, :aaa, bbb: :zzz, ccc: 'use Bar#ccc instead') + # # => Fred + # + # Fred.new.aaa + # # DEPRECATION WARNING: aaa is deprecated and will be removed from Rails 5.1. (called from irb_binding at (irb):10) + # # => nil + # + # Fred.new.bbb + # # DEPRECATION WARNING: bbb is deprecated and will be removed from Rails 5.1 (use zzz instead). (called from irb_binding at (irb):11) + # # => nil + # + # Fred.new.ccc + # # DEPRECATION WARNING: ccc is deprecated and will be removed from Rails 5.1 (use Bar#ccc instead). (called from irb_binding at (irb):12) + # # => nil + # + # Passing in a custom deprecator: + # custom_deprecator = ActiveSupport::Deprecation.new('next-release', 'MyGem') + # ActiveSupport::Deprecation.deprecate_methods(Fred, ddd: :zzz, deprecator: custom_deprecator) + # # => [:ddd] + # + # Fred.new.ddd + # DEPRECATION WARNING: ddd is deprecated and will be removed from MyGem next-release (use zzz instead). (called from irb_binding at (irb):15) + # # => nil + # + # Using a custom deprecator directly: + # custom_deprecator = ActiveSupport::Deprecation.new('next-release', 'MyGem') + # custom_deprecator.deprecate_methods(Fred, eee: :zzz) + # # => [:eee] + # + # Fred.new.eee + # DEPRECATION WARNING: eee is deprecated and will be removed from MyGem next-release (use zzz instead). (called from irb_binding at (irb):18) + # # => nil + def deprecate_methods(target_module, *method_names) + options = method_names.extract_options! + deprecator = options.delete(:deprecator) || self + method_names += options.keys + mod = nil + + method_names.each do |method_name| + if target_module.method_defined?(method_name) || target_module.private_method_defined?(method_name) + method = target_module.instance_method(method_name) + target_module.module_eval do + redefine_method(method_name) do |*args, &block| + deprecator.deprecation_warning(method_name, options[method_name]) + method.bind(self).call(*args, &block) + end + ruby2_keywords(method_name) if respond_to?(:ruby2_keywords, true) + end + else + mod ||= Module.new + mod.module_eval do + define_method(method_name) do |*args, &block| + deprecator.deprecation_warning(method_name, options[method_name]) + super(*args, &block) + end + ruby2_keywords(method_name) if respond_to?(:ruby2_keywords, true) + end + end + end + + target_module.prepend(mod) if mod + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/proxy_wrappers.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/proxy_wrappers.rb new file mode 100644 index 000000000000..b6b32e2025f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/proxy_wrappers.rb @@ -0,0 +1,177 @@ +# frozen_string_literal: true + +module ActiveSupport + class Deprecation + class DeprecationProxy #:nodoc: + def self.new(*args, &block) + object = args.first + + return object unless object + super + end + + instance_methods.each { |m| undef_method m unless /^__|^object_id$/.match?(m) } + + # Don't give a deprecation warning on inspect since test/unit and error + # logs rely on it for diagnostics. + def inspect + target.inspect + end + + private + def method_missing(called, *args, &block) + warn caller_locations, called, args + target.__send__(called, *args, &block) + end + end + + # DeprecatedObjectProxy transforms an object into a deprecated one. It + # takes an object, a deprecation message and optionally a deprecator. The + # deprecator defaults to +ActiveSupport::Deprecator+ if none is specified. + # + # deprecated_object = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(Object.new, "This object is now deprecated") + # # => # + # + # deprecated_object.to_s + # DEPRECATION WARNING: This object is now deprecated. + # (Backtrace) + # # => "#" + class DeprecatedObjectProxy < DeprecationProxy + def initialize(object, message, deprecator = ActiveSupport::Deprecation.instance) + @object = object + @message = message + @deprecator = deprecator + end + + private + def target + @object + end + + def warn(callstack, called, args) + @deprecator.warn(@message, callstack) + end + end + + # DeprecatedInstanceVariableProxy transforms an instance variable into a + # deprecated one. It takes an instance of a class, a method on that class + # and an instance variable. It optionally takes a deprecator as the last + # argument. The deprecator defaults to +ActiveSupport::Deprecator+ if none + # is specified. + # + # class Example + # def initialize + # @request = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(self, :request, :@request) + # @_request = :special_request + # end + # + # def request + # @_request + # end + # + # def old_request + # @request + # end + # end + # + # example = Example.new + # # => # + # + # example.old_request.to_s + # # => DEPRECATION WARNING: @request is deprecated! Call request.to_s instead of + # @request.to_s + # (Backtrace information…) + # "special_request" + # + # example.request.to_s + # # => "special_request" + class DeprecatedInstanceVariableProxy < DeprecationProxy + def initialize(instance, method, var = "@#{method}", deprecator = ActiveSupport::Deprecation.instance) + @instance = instance + @method = method + @var = var + @deprecator = deprecator + end + + private + def target + @instance.__send__(@method) + end + + def warn(callstack, called, args) + @deprecator.warn("#{@var} is deprecated! Call #{@method}.#{called} instead of #{@var}.#{called}. Args: #{args.inspect}", callstack) + end + end + + # DeprecatedConstantProxy transforms a constant into a deprecated one. It + # takes the names of an old (deprecated) constant and of a new constant + # (both in string form) and optionally a deprecator. The deprecator defaults + # to +ActiveSupport::Deprecator+ if none is specified. The deprecated constant + # now returns the value of the new one. + # + # PLANETS = %w(mercury venus earth mars jupiter saturn uranus neptune pluto) + # + # # (In a later update, the original implementation of `PLANETS` has been removed.) + # + # PLANETS_POST_2006 = %w(mercury venus earth mars jupiter saturn uranus neptune) + # PLANETS = ActiveSupport::Deprecation::DeprecatedConstantProxy.new('PLANETS', 'PLANETS_POST_2006') + # + # PLANETS.map { |planet| planet.capitalize } + # # => DEPRECATION WARNING: PLANETS is deprecated! Use PLANETS_POST_2006 instead. + # (Backtrace information…) + # ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"] + class DeprecatedConstantProxy < Module + def self.new(*args, **kwargs, &block) + object = args.first + + return object unless object + super + end + + def initialize(old_const, new_const, deprecator = ActiveSupport::Deprecation.instance, message: "#{old_const} is deprecated! Use #{new_const} instead.") + require "active_support/inflector/methods" + + @old_const = old_const + @new_const = new_const + @deprecator = deprecator + @message = message + end + + instance_methods.each { |m| undef_method m unless /^__|^object_id$/.match?(m) } + + # Don't give a deprecation warning on inspect since test/unit and error + # logs rely on it for diagnostics. + def inspect + target.inspect + end + + # Don't give a deprecation warning on methods that IRB may invoke + # during tab-completion. + delegate :hash, :instance_methods, :name, to: :target + + # Returns the class of the new constant. + # + # PLANETS_POST_2006 = %w(mercury venus earth mars jupiter saturn uranus neptune) + # PLANETS = ActiveSupport::Deprecation::DeprecatedConstantProxy.new('PLANETS', 'PLANETS_POST_2006') + # PLANETS.class # => Array + def class + target.class + end + + private + def target + ActiveSupport::Inflector.constantize(@new_const.to_s) + end + + def const_missing(name) + @deprecator.warn(@message, caller_locations) + target.const_get(name) + end + + def method_missing(called, *args, &block) + @deprecator.warn(@message, caller_locations) + target.__send__(called, *args, &block) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/reporting.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/reporting.rb new file mode 100644 index 000000000000..7075b5b8690f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/deprecation/reporting.rb @@ -0,0 +1,114 @@ +# frozen_string_literal: true + +require "rbconfig" + +module ActiveSupport + class Deprecation + module Reporting + # Whether to print a message (silent mode) + attr_accessor :silenced + # Name of gem where method is deprecated + attr_accessor :gem_name + + # Outputs a deprecation warning to the output configured by + # ActiveSupport::Deprecation.behavior. + # + # ActiveSupport::Deprecation.warn('something broke!') + # # => "DEPRECATION WARNING: something broke! (called from your_code.rb:1)" + def warn(message = nil, callstack = nil) + return if silenced + + callstack ||= caller_locations(2) + deprecation_message(callstack, message).tap do |m| + behavior.each { |b| b.call(m, callstack, deprecation_horizon, gem_name) } + end + end + + # Silence deprecation warnings within the block. + # + # ActiveSupport::Deprecation.warn('something broke!') + # # => "DEPRECATION WARNING: something broke! (called from your_code.rb:1)" + # + # ActiveSupport::Deprecation.silence do + # ActiveSupport::Deprecation.warn('something broke!') + # end + # # => nil + def silence + old_silenced, @silenced = @silenced, true + yield + ensure + @silenced = old_silenced + end + + def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil) + caller_backtrace ||= caller_locations(2) + deprecated_method_warning(deprecated_method_name, message).tap do |msg| + warn(msg, caller_backtrace) + end + end + + private + # Outputs a deprecation warning message + # + # deprecated_method_warning(:method_name) + # # => "method_name is deprecated and will be removed from Rails #{deprecation_horizon}" + # deprecated_method_warning(:method_name, :another_method) + # # => "method_name is deprecated and will be removed from Rails #{deprecation_horizon} (use another_method instead)" + # deprecated_method_warning(:method_name, "Optional message") + # # => "method_name is deprecated and will be removed from Rails #{deprecation_horizon} (Optional message)" + def deprecated_method_warning(method_name, message = nil) + warning = "#{method_name} is deprecated and will be removed from #{gem_name} #{deprecation_horizon}" + case message + when Symbol then "#{warning} (use #{message} instead)" + when String then "#{warning} (#{message})" + else warning + end + end + + def deprecation_message(callstack, message = nil) + message ||= "You are using deprecated behavior which will be removed from the next major or minor release." + "DEPRECATION WARNING: #{message} #{deprecation_caller_message(callstack)}" + end + + def deprecation_caller_message(callstack) + file, line, method = extract_callstack(callstack) + if file + if line && method + "(called from #{method} at #{file}:#{line})" + else + "(called from #{file}:#{line})" + end + end + end + + def extract_callstack(callstack) + return _extract_callstack(callstack) if callstack.first.is_a? String + + offending_line = callstack.find { |frame| + frame.absolute_path && !ignored_callstack(frame.absolute_path) + } || callstack.first + + [offending_line.path, offending_line.lineno, offending_line.label] + end + + def _extract_callstack(callstack) + warn "Please pass `caller_locations` to the deprecation API" if $VERBOSE + offending_line = callstack.find { |line| !ignored_callstack(line) } || callstack.first + + if offending_line + if md = offending_line.match(/^(.+?):(\d+)(?::in `(.*?)')?/) + md.captures + else + offending_line + end + end + end + + RAILS_GEM_ROOT = File.expand_path("../../../..", __dir__) + "/" + + def ignored_callstack(path) + path.start_with?(RAILS_GEM_ROOT) || path.start_with?(RbConfig::CONFIG["rubylibdir"]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/descendants_tracker.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/descendants_tracker.rb new file mode 100644 index 000000000000..1dad4f923ef9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/descendants_tracker.rb @@ -0,0 +1,108 @@ +# frozen_string_literal: true + +require "weakref" + +module ActiveSupport + # This module provides an internal implementation to track descendants + # which is faster than iterating through ObjectSpace. + module DescendantsTracker + @@direct_descendants = {} + + class << self + def direct_descendants(klass) + descendants = @@direct_descendants[klass] + descendants ? descendants.to_a : [] + end + + def descendants(klass) + arr = [] + accumulate_descendants(klass, arr) + arr + end + + def clear + if defined? ActiveSupport::Dependencies + @@direct_descendants.each do |klass, descendants| + if Dependencies.autoloaded?(klass) + @@direct_descendants.delete(klass) + else + descendants.reject! { |v| Dependencies.autoloaded?(v) } + end + end + else + @@direct_descendants.clear + end + end + + # This is the only method that is not thread safe, but is only ever called + # during the eager loading phase. + def store_inherited(klass, descendant) + (@@direct_descendants[klass] ||= DescendantsArray.new) << descendant + end + + private + def accumulate_descendants(klass, acc) + if direct_descendants = @@direct_descendants[klass] + direct_descendants.each do |direct_descendant| + acc << direct_descendant + accumulate_descendants(direct_descendant, acc) + end + end + end + end + + def inherited(base) + DescendantsTracker.store_inherited(self, base) + super + end + + def direct_descendants + DescendantsTracker.direct_descendants(self) + end + + def descendants + DescendantsTracker.descendants(self) + end + + # DescendantsArray is an array that contains weak references to classes. + class DescendantsArray # :nodoc: + include Enumerable + + def initialize + @refs = [] + end + + def initialize_copy(orig) + @refs = @refs.dup + end + + def <<(klass) + cleanup! + @refs << WeakRef.new(klass) + end + + def each + @refs.each do |ref| + yield ref.__getobj__ + rescue WeakRef::RefError + end + end + + def refs_size + @refs.size + end + + def cleanup! + @refs.delete_if { |ref| !ref.weakref_alive? } + end + + def reject! + @refs.reject! do |ref| + yield ref.__getobj__ + rescue WeakRef::RefError + true + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/digest.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/digest.rb new file mode 100644 index 000000000000..fba10fbdcf71 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/digest.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module ActiveSupport + class Digest #:nodoc: + class <(other) + if Scalar === other || Duration === other + value <=> other.value + elsif Numeric === other + value <=> other + else + nil + end + end + + def +(other) + if Duration === other + seconds = value + other.parts[:seconds] + new_parts = other.parts.merge(seconds: seconds) + new_value = value + other.value + + Duration.new(new_value, new_parts) + else + calculate(:+, other) + end + end + + def -(other) + if Duration === other + seconds = value - other.parts[:seconds] + new_parts = other.parts.map { |part, other_value| [part, -other_value] }.to_h + new_parts = new_parts.merge(seconds: seconds) + new_value = value - other.value + + Duration.new(new_value, new_parts) + else + calculate(:-, other) + end + end + + def *(other) + if Duration === other + new_parts = other.parts.map { |part, other_value| [part, value * other_value] }.to_h + new_value = value * other.value + + Duration.new(new_value, new_parts) + else + calculate(:*, other) + end + end + + def /(other) + if Duration === other + value / other.value + else + calculate(:/, other) + end + end + + def %(other) + if Duration === other + Duration.build(value % other.value) + else + calculate(:%, other) + end + end + + private + def calculate(op, other) + if Scalar === other + Scalar.new(value.public_send(op, other.value)) + elsif Numeric === other + Scalar.new(value.public_send(op, other)) + else + raise_type_error(other) + end + end + + def raise_type_error(other) + raise TypeError, "no implicit conversion of #{other.class} into #{self.class}" + end + end + + SECONDS_PER_MINUTE = 60 + SECONDS_PER_HOUR = 3600 + SECONDS_PER_DAY = 86400 + SECONDS_PER_WEEK = 604800 + SECONDS_PER_MONTH = 2629746 # 1/12 of a gregorian year + SECONDS_PER_YEAR = 31556952 # length of a gregorian year (365.2425 days) + + PARTS_IN_SECONDS = { + seconds: 1, + minutes: SECONDS_PER_MINUTE, + hours: SECONDS_PER_HOUR, + days: SECONDS_PER_DAY, + weeks: SECONDS_PER_WEEK, + months: SECONDS_PER_MONTH, + years: SECONDS_PER_YEAR + }.freeze + + PARTS = [:years, :months, :weeks, :days, :hours, :minutes, :seconds].freeze + + attr_accessor :value, :parts + + autoload :ISO8601Parser, "active_support/duration/iso8601_parser" + autoload :ISO8601Serializer, "active_support/duration/iso8601_serializer" + + class << self + # Creates a new Duration from string formatted according to ISO 8601 Duration. + # + # See {ISO 8601}[https://en.wikipedia.org/wiki/ISO_8601#Durations] for more information. + # This method allows negative parts to be present in pattern. + # If invalid string is provided, it will raise +ActiveSupport::Duration::ISO8601Parser::ParsingError+. + def parse(iso8601duration) + parts = ISO8601Parser.new(iso8601duration).parse! + new(calculate_total_seconds(parts), parts) + end + + def ===(other) #:nodoc: + other.is_a?(Duration) + rescue ::NoMethodError + false + end + + def seconds(value) #:nodoc: + new(value, [[:seconds, value]]) + end + + def minutes(value) #:nodoc: + new(value * SECONDS_PER_MINUTE, [[:minutes, value]]) + end + + def hours(value) #:nodoc: + new(value * SECONDS_PER_HOUR, [[:hours, value]]) + end + + def days(value) #:nodoc: + new(value * SECONDS_PER_DAY, [[:days, value]]) + end + + def weeks(value) #:nodoc: + new(value * SECONDS_PER_WEEK, [[:weeks, value]]) + end + + def months(value) #:nodoc: + new(value * SECONDS_PER_MONTH, [[:months, value]]) + end + + def years(value) #:nodoc: + new(value * SECONDS_PER_YEAR, [[:years, value]]) + end + + # Creates a new Duration from a seconds value that is converted + # to the individual parts: + # + # ActiveSupport::Duration.build(31556952).parts # => {:years=>1} + # ActiveSupport::Duration.build(2716146).parts # => {:months=>1, :days=>1} + # + def build(value) + parts = {} + remainder = value.round(9) + + PARTS.each do |part| + unless part == :seconds + part_in_seconds = PARTS_IN_SECONDS[part] + parts[part] = remainder.div(part_in_seconds) + remainder %= part_in_seconds + end + end unless value == 0 + + parts[:seconds] = remainder + + new(value, parts) + end + + private + def calculate_total_seconds(parts) + parts.inject(0) do |total, (part, value)| + total + value * PARTS_IN_SECONDS[part] + end + end + end + + def initialize(value, parts) #:nodoc: + @value, @parts = value, parts.to_h + @parts.default = 0 + @parts.reject! { |k, v| v.zero? } unless value == 0 + end + + def coerce(other) #:nodoc: + case other + when Scalar + [other, self] + when Duration + [Scalar.new(other.value), self] + else + [Scalar.new(other), self] + end + end + + # Compares one Duration with another or a Numeric to this Duration. + # Numeric values are treated as seconds. + def <=>(other) + if Duration === other + value <=> other.value + elsif Numeric === other + value <=> other + end + end + + # Adds another Duration or a Numeric to this Duration. Numeric values + # are treated as seconds. + def +(other) + if Duration === other + parts = @parts.dup + other.parts.each do |(key, value)| + parts[key] += value + end + Duration.new(value + other.value, parts) + else + seconds = @parts[:seconds] + other + Duration.new(value + other, @parts.merge(seconds: seconds)) + end + end + + # Subtracts another Duration or a Numeric from this Duration. Numeric + # values are treated as seconds. + def -(other) + self + (-other) + end + + # Multiplies this Duration by a Numeric and returns a new Duration. + def *(other) + if Scalar === other || Duration === other + Duration.new(value * other.value, parts.map { |type, number| [type, number * other.value] }) + elsif Numeric === other + Duration.new(value * other, parts.map { |type, number| [type, number * other] }) + else + raise_type_error(other) + end + end + + # Divides this Duration by a Numeric and returns a new Duration. + def /(other) + if Scalar === other + Duration.new(value / other.value, parts.map { |type, number| [type, number / other.value] }) + elsif Duration === other + value / other.value + elsif Numeric === other + Duration.new(value / other, parts.map { |type, number| [type, number / other] }) + else + raise_type_error(other) + end + end + + # Returns the modulo of this Duration by another Duration or Numeric. + # Numeric values are treated as seconds. + def %(other) + if Duration === other || Scalar === other + Duration.build(value % other.value) + elsif Numeric === other + Duration.build(value % other) + else + raise_type_error(other) + end + end + + def -@ #:nodoc: + Duration.new(-value, parts.map { |type, number| [type, -number] }) + end + + def is_a?(klass) #:nodoc: + Duration == klass || value.is_a?(klass) + end + alias :kind_of? :is_a? + + def instance_of?(klass) # :nodoc: + Duration == klass || value.instance_of?(klass) + end + + # Returns +true+ if +other+ is also a Duration instance with the + # same +value+, or if other == value. + def ==(other) + if Duration === other + other.value == value + else + other == value + end + end + + # Returns the amount of seconds a duration covers as a string. + # For more information check to_i method. + # + # 1.day.to_s # => "86400" + def to_s + @value.to_s + end + + # Returns the number of seconds that this Duration represents. + # + # 1.minute.to_i # => 60 + # 1.hour.to_i # => 3600 + # 1.day.to_i # => 86400 + # + # Note that this conversion makes some assumptions about the + # duration of some periods, e.g. months are always 1/12 of year + # and years are 365.2425 days: + # + # # equivalent to (1.year / 12).to_i + # 1.month.to_i # => 2629746 + # + # # equivalent to 365.2425.days.to_i + # 1.year.to_i # => 31556952 + # + # In such cases, Ruby's core + # Date[https://ruby-doc.org/stdlib/libdoc/date/rdoc/Date.html] and + # Time[https://ruby-doc.org/stdlib/libdoc/time/rdoc/Time.html] should be used for precision + # date and time arithmetic. + def to_i + @value.to_i + end + + # Returns +true+ if +other+ is also a Duration instance, which has the + # same parts as this one. + def eql?(other) + Duration === other && other.value.eql?(value) + end + + def hash + @value.hash + end + + # Calculates a new Time or Date that is as far in the future + # as this Duration represents. + def since(time = ::Time.current) + sum(1, time) + end + alias :from_now :since + alias :after :since + + # Calculates a new Time or Date that is as far in the past + # as this Duration represents. + def ago(time = ::Time.current) + sum(-1, time) + end + alias :until :ago + alias :before :ago + + def inspect #:nodoc: + return "#{value} seconds" if parts.empty? + + parts. + sort_by { |unit, _ | PARTS.index(unit) }. + map { |unit, val| "#{val} #{val == 1 ? unit.to_s.chop : unit.to_s}" }. + to_sentence(locale: ::I18n.default_locale) + end + + def as_json(options = nil) #:nodoc: + to_i + end + + def init_with(coder) #:nodoc: + initialize(coder["value"], coder["parts"]) + end + + def encode_with(coder) #:nodoc: + coder.map = { "value" => @value, "parts" => @parts } + end + + # Build ISO 8601 Duration string for this duration. + # The +precision+ parameter can be used to limit seconds' precision of duration. + def iso8601(precision: nil) + ISO8601Serializer.new(self, precision: precision).serialize + end + + private + def sum(sign, time = ::Time.current) + unless time.acts_like?(:time) || time.acts_like?(:date) + raise ::ArgumentError, "expected a time or date, got #{time.inspect}" + end + + if parts.empty? + time.since(sign * value) + else + parts.inject(time) do |t, (type, number)| + if type == :seconds + t.since(sign * number) + elsif type == :minutes + t.since(sign * number * 60) + elsif type == :hours + t.since(sign * number * 3600) + else + t.advance(type => sign * number) + end + end + end + end + + def respond_to_missing?(method, _) + value.respond_to?(method) + end + + def method_missing(method, *args, &block) + value.public_send(method, *args, &block) + end + + def raise_type_error(other) + raise TypeError, "no implicit conversion of #{other.class} into #{self.class}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/duration/iso8601_parser.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/duration/iso8601_parser.rb new file mode 100644 index 000000000000..83f3b2860270 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/duration/iso8601_parser.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true + +require "strscan" + +module ActiveSupport + class Duration + # Parses a string formatted according to ISO 8601 Duration into the hash. + # + # See {ISO 8601}[https://en.wikipedia.org/wiki/ISO_8601#Durations] for more information. + # + # This parser allows negative parts to be present in pattern. + class ISO8601Parser # :nodoc: + class ParsingError < ::ArgumentError; end + + PERIOD_OR_COMMA = /\.|,/ + PERIOD = "." + COMMA = "," + + SIGN_MARKER = /\A\-|\+|/ + DATE_MARKER = /P/ + TIME_MARKER = /T/ + DATE_COMPONENT = /(\-?\d+(?:[.,]\d+)?)(Y|M|D|W)/ + TIME_COMPONENT = /(\-?\d+(?:[.,]\d+)?)(H|M|S)/ + + DATE_TO_PART = { "Y" => :years, "M" => :months, "W" => :weeks, "D" => :days } + TIME_TO_PART = { "H" => :hours, "M" => :minutes, "S" => :seconds } + + DATE_COMPONENTS = [:years, :months, :days] + TIME_COMPONENTS = [:hours, :minutes, :seconds] + + attr_reader :parts, :scanner + attr_accessor :mode, :sign + + def initialize(string) + @scanner = StringScanner.new(string) + @parts = {} + @mode = :start + @sign = 1 + end + + def parse! + while !finished? + case mode + when :start + if scan(SIGN_MARKER) + self.sign = (scanner.matched == "-") ? -1 : 1 + self.mode = :sign + else + raise_parsing_error + end + + when :sign + if scan(DATE_MARKER) + self.mode = :date + else + raise_parsing_error + end + + when :date + if scan(TIME_MARKER) + self.mode = :time + elsif scan(DATE_COMPONENT) + parts[DATE_TO_PART[scanner[2]]] = number * sign + else + raise_parsing_error + end + + when :time + if scan(TIME_COMPONENT) + parts[TIME_TO_PART[scanner[2]]] = number * sign + else + raise_parsing_error + end + + end + end + + validate! + parts + end + + private + def finished? + scanner.eos? + end + + # Parses number which can be a float with either comma or period. + def number + PERIOD_OR_COMMA.match?(scanner[1]) ? scanner[1].tr(COMMA, PERIOD).to_f : scanner[1].to_i + end + + def scan(pattern) + scanner.scan(pattern) + end + + def raise_parsing_error(reason = nil) + raise ParsingError, "Invalid ISO 8601 duration: #{scanner.string.inspect} #{reason}".strip + end + + # Checks for various semantic errors as stated in ISO 8601 standard. + def validate! + raise_parsing_error("is empty duration") if parts.empty? + + # Mixing any of Y, M, D with W is invalid. + if parts.key?(:weeks) && (parts.keys & DATE_COMPONENTS).any? + raise_parsing_error("mixing weeks with other date parts not allowed") + end + + # Specifying an empty T part is invalid. + if mode == :time && (parts.keys & TIME_COMPONENTS).empty? + raise_parsing_error("time part marker is present but time part is empty") + end + + fractions = parts.values.reject(&:zero?).select { |a| (a % 1) != 0 } + unless fractions.empty? || (fractions.size == 1 && fractions.last == @parts.values.reject(&:zero?).last) + raise_parsing_error "(only last part can be fractional)" + end + + true + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/duration/iso8601_serializer.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/duration/iso8601_serializer.rb new file mode 100644 index 000000000000..8314df12b0f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/duration/iso8601_serializer.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/blank" + +module ActiveSupport + class Duration + # Serializes duration to string according to ISO 8601 Duration format. + class ISO8601Serializer # :nodoc: + def initialize(duration, precision: nil) + @duration = duration + @precision = precision + end + + # Builds and returns output string. + def serialize + parts, sign = normalize + return "PT0S" if parts.empty? + + output = +"P" + output << "#{parts[:years]}Y" if parts.key?(:years) + output << "#{parts[:months]}M" if parts.key?(:months) + output << "#{parts[:weeks]}W" if parts.key?(:weeks) + output << "#{parts[:days]}D" if parts.key?(:days) + time = +"" + time << "#{parts[:hours]}H" if parts.key?(:hours) + time << "#{parts[:minutes]}M" if parts.key?(:minutes) + if parts.key?(:seconds) + time << "#{sprintf(@precision ? "%0.0#{@precision}f" : '%g', parts[:seconds])}S" + end + output << "T#{time}" unless time.empty? + "#{sign}#{output}" + end + + private + # Return pair of duration's parts and whole duration sign. + # Parts are summarized (as they can become repetitive due to addition, etc). + # Zero parts are removed as not significant. + # If all parts are negative it will negate all of them and return minus as a sign. + def normalize + parts = @duration.parts.each_with_object(Hash.new(0)) do |(k, v), p| + p[k] += v unless v.zero? + end + # If all parts are negative - let's make a negative duration + sign = "" + if parts.values.all? { |v| v < 0 } + sign = "-" + parts.transform_values!(&:-@) + end + [parts, sign] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/encrypted_configuration.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/encrypted_configuration.rb new file mode 100644 index 000000000000..cc1d026737a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/encrypted_configuration.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require "yaml" +require "active_support/encrypted_file" +require "active_support/ordered_options" +require "active_support/core_ext/object/inclusion" +require "active_support/core_ext/module/delegation" + +module ActiveSupport + class EncryptedConfiguration < EncryptedFile + delegate :[], :fetch, to: :config + delegate_missing_to :options + + def initialize(config_path:, key_path:, env_key:, raise_if_missing_key:) + super content_path: config_path, key_path: key_path, + env_key: env_key, raise_if_missing_key: raise_if_missing_key + end + + # Allow a config to be started without a file present + def read + super + rescue ActiveSupport::EncryptedFile::MissingContentError + "" + end + + def write(contents) + deserialize(contents) + + super + end + + def config + @config ||= deserialize(read).deep_symbolize_keys + end + + private + def options + @options ||= ActiveSupport::InheritableOptions.new(config) + end + + def deserialize(config) + YAML.load(config).presence || {} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/encrypted_file.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/encrypted_file.rb new file mode 100644 index 000000000000..544dacb7e541 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/encrypted_file.rb @@ -0,0 +1,100 @@ +# frozen_string_literal: true + +require "pathname" +require "tmpdir" +require "active_support/message_encryptor" + +module ActiveSupport + class EncryptedFile + class MissingContentError < RuntimeError + def initialize(content_path) + super "Missing encrypted content file in #{content_path}." + end + end + + class MissingKeyError < RuntimeError + def initialize(key_path:, env_key:) + super \ + "Missing encryption key to decrypt file with. " + + "Ask your team for your master key and write it to #{key_path} or put it in the ENV['#{env_key}']." + end + end + + CIPHER = "aes-128-gcm" + + def self.generate_key + SecureRandom.hex(ActiveSupport::MessageEncryptor.key_len(CIPHER)) + end + + + attr_reader :content_path, :key_path, :env_key, :raise_if_missing_key + + def initialize(content_path:, key_path:, env_key:, raise_if_missing_key:) + @content_path, @key_path = Pathname.new(content_path), Pathname.new(key_path) + @env_key, @raise_if_missing_key = env_key, raise_if_missing_key + end + + def key + read_env_key || read_key_file || handle_missing_key + end + + def read + if !key.nil? && content_path.exist? + decrypt content_path.binread + else + raise MissingContentError, content_path + end + end + + def write(contents) + IO.binwrite "#{content_path}.tmp", encrypt(contents) + FileUtils.mv "#{content_path}.tmp", content_path + end + + def change(&block) + writing read, &block + end + + + private + def writing(contents) + tmp_file = "#{Process.pid}.#{content_path.basename.to_s.chomp('.enc')}" + tmp_path = Pathname.new File.join(Dir.tmpdir, tmp_file) + tmp_path.binwrite contents + + yield tmp_path + + updated_contents = tmp_path.binread + + write(updated_contents) if updated_contents != contents + ensure + FileUtils.rm(tmp_path) if tmp_path&.exist? + end + + + def encrypt(contents) + encryptor.encrypt_and_sign contents + end + + def decrypt(contents) + encryptor.decrypt_and_verify contents + end + + def encryptor + @encryptor ||= ActiveSupport::MessageEncryptor.new([ key ].pack("H*"), cipher: CIPHER) + end + + + def read_env_key + ENV[env_key] + end + + def read_key_file + key_path.binread.strip if key_path.exist? + end + + def handle_missing_key + raise MissingKeyError.new(key_path: key_path, env_key: env_key) if raise_if_missing_key + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/evented_file_update_checker.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/evented_file_update_checker.rb new file mode 100644 index 000000000000..9cbe1ed97341 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/evented_file_update_checker.rb @@ -0,0 +1,234 @@ +# frozen_string_literal: true + +require "set" +require "pathname" +require "concurrent/atomic/atomic_boolean" + +module ActiveSupport + # Allows you to "listen" to changes in a file system. + # The evented file updater does not hit disk when checking for updates + # instead it uses platform specific file system events to trigger a change + # in state. + # + # The file checker takes an array of files to watch or a hash specifying directories + # and file extensions to watch. It also takes a block that is called when + # EventedFileUpdateChecker#execute is run or when EventedFileUpdateChecker#execute_if_updated + # is run and there have been changes to the file system. + # + # Note: Forking will cause the first call to `updated?` to return `true`. + # + # Example: + # + # checker = ActiveSupport::EventedFileUpdateChecker.new(["/tmp/foo"]) { puts "changed" } + # checker.updated? + # # => false + # checker.execute_if_updated + # # => nil + # + # FileUtils.touch("/tmp/foo") + # + # checker.updated? + # # => true + # checker.execute_if_updated + # # => "changed" + # + class EventedFileUpdateChecker #:nodoc: all + def initialize(files, dirs = {}, &block) + unless block + raise ArgumentError, "A block is required to initialize an EventedFileUpdateChecker" + end + + @ph = PathHelper.new + @files = files.map { |f| @ph.xpath(f) }.to_set + + @dirs = {} + dirs.each do |dir, exts| + @dirs[@ph.xpath(dir)] = Array(exts).map { |ext| @ph.normalize_extension(ext) } + end + + @block = block + @updated = Concurrent::AtomicBoolean.new(false) + @lcsp = @ph.longest_common_subpath(@dirs.keys) + @pid = Process.pid + @boot_mutex = Mutex.new + + dtw = directories_to_watch + @dtw, @missing = dtw.partition(&:exist?) + + if @dtw.any? + # Loading listen triggers warnings. These are originated by a legit + # usage of attr_* macros for private attributes, but adds a lot of noise + # to our test suite. Thus, we lazy load it and disable warnings locally. + silence_warnings do + require "listen" + rescue LoadError => e + raise LoadError, "Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile", e.backtrace + end + end + boot! + end + + def updated? + @boot_mutex.synchronize do + if @pid != Process.pid + boot! + @pid = Process.pid + @updated.make_true + end + end + + if @missing.any?(&:exist?) + @boot_mutex.synchronize do + appeared, @missing = @missing.partition(&:exist?) + shutdown! + + @dtw += appeared + boot! + + @updated.make_true + end + end + + @updated.true? + end + + def execute + @updated.make_false + @block.call + end + + def execute_if_updated + if updated? + yield if block_given? + execute + true + end + end + + private + def boot! + normalize_dirs! + + unless @dtw.empty? + Listen.to(*@dtw, &method(:changed)).start + end + end + + def shutdown! + Listen.stop + end + + def normalize_dirs! + @dirs.transform_keys! do |dir| + dir.exist? ? dir.realpath : dir + end + end + + def changed(modified, added, removed) + unless updated? + @updated.make_true if (modified + added + removed).any? { |f| watching?(f) } + end + end + + def watching?(file) + file = @ph.xpath(file) + + if @files.member?(file) + true + elsif file.directory? + false + else + ext = @ph.normalize_extension(file.extname) + + file.dirname.ascend do |dir| + matching = @dirs[dir] + + if matching && (matching.empty? || matching.include?(ext)) + break true + elsif dir == @lcsp || dir.root? + break false + end + end + end + end + + def directories_to_watch + dtw = @files.map(&:dirname) + @dirs.keys + dtw.compact! + dtw.uniq! + + normalized_gem_paths = Gem.path.map { |path| File.join path, "" } + dtw = dtw.reject do |path| + normalized_gem_paths.any? { |gem_path| path.to_s.start_with?(gem_path) } + end + + @ph.filter_out_descendants(dtw) + end + + class PathHelper + def xpath(path) + Pathname.new(path).expand_path + end + + def normalize_extension(ext) + ext.to_s.sub(/\A\./, "") + end + + # Given a collection of Pathname objects returns the longest subpath + # common to all of them, or +nil+ if there is none. + def longest_common_subpath(paths) + return if paths.empty? + + lcsp = Pathname.new(paths[0]) + + paths[1..-1].each do |path| + until ascendant_of?(lcsp, path) + if lcsp.root? + # If we get here a root directory is not an ascendant of path. + # This may happen if there are paths in different drives on + # Windows. + return + else + lcsp = lcsp.parent + end + end + end + + lcsp + end + + # Returns the deepest existing ascendant, which could be the argument itself. + def existing_parent(dir) + dir.ascend do |ascendant| + break ascendant if ascendant.directory? + end + end + + # Filters out directories which are descendants of others in the collection (stable). + def filter_out_descendants(dirs) + return dirs if dirs.length < 2 + + dirs_sorted_by_nparts = dirs.sort_by { |dir| dir.each_filename.to_a.length } + descendants = [] + + until dirs_sorted_by_nparts.empty? + dir = dirs_sorted_by_nparts.shift + + dirs_sorted_by_nparts.reject! do |possible_descendant| + ascendant_of?(dir, possible_descendant) && descendants << possible_descendant + end + end + + # Array#- preserves order. + dirs - descendants + end + + private + def ascendant_of?(base, other) + base != other && other.ascend do |ascendant| + break true if base == ascendant + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/execution_wrapper.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/execution_wrapper.rb new file mode 100644 index 000000000000..ca810db5842b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/execution_wrapper.rb @@ -0,0 +1,129 @@ +# frozen_string_literal: true + +require "active_support/callbacks" +require "concurrent/hash" + +module ActiveSupport + class ExecutionWrapper + include ActiveSupport::Callbacks + + Null = Object.new # :nodoc: + def Null.complete! # :nodoc: + end + + define_callbacks :run + define_callbacks :complete + + def self.to_run(*args, &block) + set_callback(:run, *args, &block) + end + + def self.to_complete(*args, &block) + set_callback(:complete, *args, &block) + end + + RunHook = Struct.new(:hook) do # :nodoc: + def before(target) + hook_state = target.send(:hook_state) + hook_state[hook] = hook.run + end + end + + CompleteHook = Struct.new(:hook) do # :nodoc: + def before(target) + hook_state = target.send(:hook_state) + if hook_state.key?(hook) + hook.complete hook_state[hook] + end + end + alias after before + end + + # Register an object to be invoked during both the +run+ and + # +complete+ steps. + # + # +hook.complete+ will be passed the value returned from +hook.run+, + # and will only be invoked if +run+ has previously been called. + # (Mostly, this means it won't be invoked if an exception occurs in + # a preceding +to_run+ block; all ordinary +to_complete+ blocks are + # invoked in that situation.) + def self.register_hook(hook, outer: false) + if outer + to_run RunHook.new(hook), prepend: true + to_complete :after, CompleteHook.new(hook) + else + to_run RunHook.new(hook) + to_complete CompleteHook.new(hook) + end + end + + # Run this execution. + # + # Returns an instance, whose +complete!+ method *must* be invoked + # after the work has been performed. + # + # Where possible, prefer +wrap+. + def self.run! + if active? + Null + else + new.tap do |instance| + success = nil + begin + instance.run! + success = true + ensure + instance.complete! unless success + end + end + end + end + + # Perform the work in the supplied block as an execution. + def self.wrap + return yield if active? + + instance = run! + begin + yield + ensure + instance.complete! + end + end + + class << self # :nodoc: + attr_accessor :active + end + + def self.inherited(other) # :nodoc: + super + other.active = Concurrent::Hash.new + end + + self.active = Concurrent::Hash.new + + def self.active? # :nodoc: + @active[Thread.current] + end + + def run! # :nodoc: + self.class.active[Thread.current] = true + run_callbacks(:run) + end + + # Complete this in-flight execution. This method *must* be called + # exactly once on the result of any call to +run!+. + # + # Where possible, prefer +wrap+. + def complete! + run_callbacks(:complete) + ensure + self.class.active.delete Thread.current + end + + private + def hook_state + @_hook_state ||= {} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/executor.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/executor.rb new file mode 100644 index 000000000000..ce391b07ec64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/executor.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "active_support/execution_wrapper" + +module ActiveSupport + class Executor < ExecutionWrapper + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/file_update_checker.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/file_update_checker.rb new file mode 100644 index 000000000000..9b665e7f1962 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/file_update_checker.rb @@ -0,0 +1,162 @@ +# frozen_string_literal: true + +require "active_support/core_ext/time/calculations" + +module ActiveSupport + # FileUpdateChecker specifies the API used by Rails to watch files + # and control reloading. The API depends on four methods: + # + # * +initialize+ which expects two parameters and one block as + # described below. + # + # * +updated?+ which returns a boolean if there were updates in + # the filesystem or not. + # + # * +execute+ which executes the given block on initialization + # and updates the latest watched files and timestamp. + # + # * +execute_if_updated+ which just executes the block if it was updated. + # + # After initialization, a call to +execute_if_updated+ must execute + # the block only if there was really a change in the filesystem. + # + # This class is used by Rails to reload the I18n framework whenever + # they are changed upon a new request. + # + # i18n_reloader = ActiveSupport::FileUpdateChecker.new(paths) do + # I18n.reload! + # end + # + # ActiveSupport::Reloader.to_prepare do + # i18n_reloader.execute_if_updated + # end + class FileUpdateChecker + # It accepts two parameters on initialization. The first is an array + # of files and the second is an optional hash of directories. The hash must + # have directories as keys and the value is an array of extensions to be + # watched under that directory. + # + # This method must also receive a block that will be called once a path + # changes. The array of files and list of directories cannot be changed + # after FileUpdateChecker has been initialized. + def initialize(files, dirs = {}, &block) + unless block + raise ArgumentError, "A block is required to initialize a FileUpdateChecker" + end + + @files = files.freeze + @glob = compile_glob(dirs) + @block = block + + @watched = nil + @updated_at = nil + + @last_watched = watched + @last_update_at = updated_at(@last_watched) + end + + # Check if any of the entries were updated. If so, the watched and/or + # updated_at values are cached until the block is executed via +execute+ + # or +execute_if_updated+. + def updated? + current_watched = watched + if @last_watched.size != current_watched.size + @watched = current_watched + true + else + current_updated_at = updated_at(current_watched) + if @last_update_at < current_updated_at + @watched = current_watched + @updated_at = current_updated_at + true + else + false + end + end + end + + # Executes the given block and updates the latest watched files and + # timestamp. + def execute + @last_watched = watched + @last_update_at = updated_at(@last_watched) + @block.call + ensure + @watched = nil + @updated_at = nil + end + + # Execute the block given if updated. + def execute_if_updated + if updated? + yield if block_given? + execute + true + else + false + end + end + + private + def watched + @watched || begin + all = @files.select { |f| File.exist?(f) } + all.concat(Dir[@glob]) if @glob + all + end + end + + def updated_at(paths) + @updated_at || max_mtime(paths) || Time.at(0) + end + + # This method returns the maximum mtime of the files in +paths+, or +nil+ + # if the array is empty. + # + # Files with a mtime in the future are ignored. Such abnormal situation + # can happen for example if the user changes the clock by hand. It is + # healthy to consider this edge case because with mtimes in the future + # reloading is not triggered. + def max_mtime(paths) + time_now = Time.now + max_mtime = nil + + # Time comparisons are performed with #compare_without_coercion because + # AS redefines these operators in a way that is much slower and does not + # bring any benefit in this particular code. + # + # Read t1.compare_without_coercion(t2) < 0 as t1 < t2. + paths.each do |path| + mtime = File.mtime(path) + + next if time_now.compare_without_coercion(mtime) < 0 + + if max_mtime.nil? || max_mtime.compare_without_coercion(mtime) < 0 + max_mtime = mtime + end + end + + max_mtime + end + + def compile_glob(hash) + hash.freeze # Freeze so changes aren't accidentally pushed + return if hash.empty? + + globs = hash.map do |key, value| + "#{escape(key)}/**/*#{compile_ext(value)}" + end + "{#{globs.join(",")}}" + end + + def escape(key) + key.gsub(",", '\,') + end + + def compile_ext(array) + array = Array(array) + return if array.empty? + ".{#{array.join(",")}}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/gem_version.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/gem_version.rb new file mode 100644 index 000000000000..3b247c0c305e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/gem_version.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module ActiveSupport + # Returns the version of the currently loaded Active Support as a Gem::Version. + def self.gem_version + Gem::Version.new VERSION::STRING + end + + module VERSION + MAJOR = 6 + MINOR = 0 + TINY = 3 + PRE = "6" + + STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".") + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/gzip.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/gzip.rb new file mode 100644 index 000000000000..7ffa6d90a205 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/gzip.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require "zlib" +require "stringio" + +module ActiveSupport + # A convenient wrapper for the zlib standard library that allows + # compression/decompression of strings with gzip. + # + # gzip = ActiveSupport::Gzip.compress('compress me!') + # # => "\x1F\x8B\b\x00o\x8D\xCDO\x00\x03K\xCE\xCF-(J-.V\xC8MU\x04\x00R>n\x83\f\x00\x00\x00" + # + # ActiveSupport::Gzip.decompress(gzip) + # # => "compress me!" + module Gzip + class Stream < StringIO + def initialize(*) + super + set_encoding "BINARY" + end + def close; rewind; end + end + + # Decompresses a gzipped string. + def self.decompress(source) + Zlib::GzipReader.wrap(StringIO.new(source), &:read) + end + + # Compresses a string using gzip. + def self.compress(source, level = Zlib::DEFAULT_COMPRESSION, strategy = Zlib::DEFAULT_STRATEGY) + output = Stream.new + gz = Zlib::GzipWriter.new(output, level, strategy) + gz.write(source) + gz.close + output.string + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/hash_with_indifferent_access.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/hash_with_indifferent_access.rb new file mode 100644 index 000000000000..42ae7e9b7b8b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/hash_with_indifferent_access.rb @@ -0,0 +1,399 @@ +# frozen_string_literal: true + +require "active_support/core_ext/hash/keys" +require "active_support/core_ext/hash/reverse_merge" +require "active_support/core_ext/hash/except" + +module ActiveSupport + # Implements a hash where keys :foo and "foo" are considered + # to be the same. + # + # rgb = ActiveSupport::HashWithIndifferentAccess.new + # + # rgb[:black] = '#000000' + # rgb[:black] # => '#000000' + # rgb['black'] # => '#000000' + # + # rgb['white'] = '#FFFFFF' + # rgb[:white] # => '#FFFFFF' + # rgb['white'] # => '#FFFFFF' + # + # Internally symbols are mapped to strings when used as keys in the entire + # writing interface (calling []=, merge, etc). This + # mapping belongs to the public interface. For example, given: + # + # hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1) + # + # You are guaranteed that the key is returned as a string: + # + # hash.keys # => ["a"] + # + # Technically other types of keys are accepted: + # + # hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1) + # hash[0] = 0 + # hash # => {"a"=>1, 0=>0} + # + # but this class is intended for use cases where strings or symbols are the + # expected keys and it is convenient to understand both as the same. For + # example the +params+ hash in Ruby on Rails. + # + # Note that core extensions define Hash#with_indifferent_access: + # + # rgb = { black: '#000000', white: '#FFFFFF' }.with_indifferent_access + # + # which may be handy. + # + # To access this class outside of Rails, require the core extension with: + # + # require "active_support/core_ext/hash/indifferent_access" + # + # which will, in turn, require this file. + class HashWithIndifferentAccess < Hash + # Returns +true+ so that Array#extract_options! finds members of + # this class. + def extractable_options? + true + end + + def with_indifferent_access + dup + end + + def nested_under_indifferent_access + self + end + + def initialize(constructor = {}) + if constructor.respond_to?(:to_hash) + super() + update(constructor) + + hash = constructor.to_hash + self.default = hash.default if hash.default + self.default_proc = hash.default_proc if hash.default_proc + else + super(constructor) + end + end + + def self.[](*args) + new.merge!(Hash[*args]) + end + + alias_method :regular_writer, :[]= unless method_defined?(:regular_writer) + alias_method :regular_update, :update unless method_defined?(:regular_update) + + # Assigns a new value to the hash: + # + # hash = ActiveSupport::HashWithIndifferentAccess.new + # hash[:key] = 'value' + # + # This value can be later fetched using either +:key+ or 'key'. + def []=(key, value) + regular_writer(convert_key(key), convert_value(value, for: :assignment)) + end + + alias_method :store, :[]= + + # Updates the receiver in-place, merging in the hash passed as argument: + # + # hash_1 = ActiveSupport::HashWithIndifferentAccess.new + # hash_1[:key] = 'value' + # + # hash_2 = ActiveSupport::HashWithIndifferentAccess.new + # hash_2[:key] = 'New Value!' + # + # hash_1.update(hash_2) # => {"key"=>"New Value!"} + # + # The argument can be either an + # ActiveSupport::HashWithIndifferentAccess or a regular +Hash+. + # In either case the merge respects the semantics of indifferent access. + # + # If the argument is a regular hash with keys +:key+ and +"key"+ only one + # of the values end up in the receiver, but which one is unspecified. + # + # When given a block, the value for duplicated keys will be determined + # by the result of invoking the block with the duplicated key, the value + # in the receiver, and the value in +other_hash+. The rules for duplicated + # keys follow the semantics of indifferent access: + # + # hash_1[:key] = 10 + # hash_2['key'] = 12 + # hash_1.update(hash_2) { |key, old, new| old + new } # => {"key"=>22} + def update(other_hash) + if other_hash.is_a? HashWithIndifferentAccess + super(other_hash) + else + other_hash.to_hash.each_pair do |key, value| + if block_given? && key?(key) + value = yield(convert_key(key), self[key], value) + end + regular_writer(convert_key(key), convert_value(value)) + end + self + end + end + + alias_method :merge!, :update + + # Checks the hash for a key matching the argument passed in: + # + # hash = ActiveSupport::HashWithIndifferentAccess.new + # hash['key'] = 'value' + # hash.key?(:key) # => true + # hash.key?('key') # => true + def key?(key) + super(convert_key(key)) + end + + alias_method :include?, :key? + alias_method :has_key?, :key? + alias_method :member?, :key? + + # Same as Hash#[] where the key passed as argument can be + # either a string or a symbol: + # + # counters = ActiveSupport::HashWithIndifferentAccess.new + # counters[:foo] = 1 + # + # counters['foo'] # => 1 + # counters[:foo] # => 1 + # counters[:zoo] # => nil + def [](key) + super(convert_key(key)) + end + + # Same as Hash#assoc where the key passed as argument can be + # either a string or a symbol: + # + # counters = ActiveSupport::HashWithIndifferentAccess.new + # counters[:foo] = 1 + # + # counters.assoc('foo') # => ["foo", 1] + # counters.assoc(:foo) # => ["foo", 1] + # counters.assoc(:zoo) # => nil + def assoc(key) + super(convert_key(key)) + end + + # Same as Hash#fetch where the key passed as argument can be + # either a string or a symbol: + # + # counters = ActiveSupport::HashWithIndifferentAccess.new + # counters[:foo] = 1 + # + # counters.fetch('foo') # => 1 + # counters.fetch(:bar, 0) # => 0 + # counters.fetch(:bar) { |key| 0 } # => 0 + # counters.fetch(:zoo) # => KeyError: key not found: "zoo" + def fetch(key, *extras) + super(convert_key(key), *extras) + end + + # Same as Hash#dig where the key passed as argument can be + # either a string or a symbol: + # + # counters = ActiveSupport::HashWithIndifferentAccess.new + # counters[:foo] = { bar: 1 } + # + # counters.dig('foo', 'bar') # => 1 + # counters.dig(:foo, :bar) # => 1 + # counters.dig(:zoo) # => nil + def dig(*args) + args[0] = convert_key(args[0]) if args.size > 0 + super(*args) + end + + # Same as Hash#default where the key passed as argument can be + # either a string or a symbol: + # + # hash = ActiveSupport::HashWithIndifferentAccess.new(1) + # hash.default # => 1 + # + # hash = ActiveSupport::HashWithIndifferentAccess.new { |hash, key| key } + # hash.default # => nil + # hash.default('foo') # => 'foo' + # hash.default(:foo) # => 'foo' + def default(*args) + super(*args.map { |arg| convert_key(arg) }) + end + + # Returns an array of the values at the specified indices: + # + # hash = ActiveSupport::HashWithIndifferentAccess.new + # hash[:a] = 'x' + # hash[:b] = 'y' + # hash.values_at('a', 'b') # => ["x", "y"] + def values_at(*keys) + super(*keys.map { |key| convert_key(key) }) + end + + # Returns an array of the values at the specified indices, but also + # raises an exception when one of the keys can't be found. + # + # hash = ActiveSupport::HashWithIndifferentAccess.new + # hash[:a] = 'x' + # hash[:b] = 'y' + # hash.fetch_values('a', 'b') # => ["x", "y"] + # hash.fetch_values('a', 'c') { |key| 'z' } # => ["x", "z"] + # hash.fetch_values('a', 'c') # => KeyError: key not found: "c" + def fetch_values(*indices, &block) + super(*indices.map { |key| convert_key(key) }, &block) + end + + # Returns a shallow copy of the hash. + # + # hash = ActiveSupport::HashWithIndifferentAccess.new({ a: { b: 'b' } }) + # dup = hash.dup + # dup[:a][:c] = 'c' + # + # hash[:a][:c] # => "c" + # dup[:a][:c] # => "c" + def dup + self.class.new(self).tap do |new_hash| + set_defaults(new_hash) + end + end + + # This method has the same semantics of +update+, except it does not + # modify the receiver but rather returns a new hash with indifferent + # access with the result of the merge. + def merge(hash, &block) + dup.update(hash, &block) + end + + # Like +merge+ but the other way around: Merges the receiver into the + # argument and returns a new hash with indifferent access as result: + # + # hash = ActiveSupport::HashWithIndifferentAccess.new + # hash['a'] = nil + # hash.reverse_merge(a: 0, b: 1) # => {"a"=>nil, "b"=>1} + def reverse_merge(other_hash) + super(self.class.new(other_hash)) + end + alias_method :with_defaults, :reverse_merge + + # Same semantics as +reverse_merge+ but modifies the receiver in-place. + def reverse_merge!(other_hash) + super(self.class.new(other_hash)) + end + alias_method :with_defaults!, :reverse_merge! + + # Replaces the contents of this hash with other_hash. + # + # h = { "a" => 100, "b" => 200 } + # h.replace({ "c" => 300, "d" => 400 }) # => {"c"=>300, "d"=>400} + def replace(other_hash) + super(self.class.new(other_hash)) + end + + # Removes the specified key from the hash. + def delete(key) + super(convert_key(key)) + end + + def except(*keys) + slice(*self.keys - keys.map { |key| convert_key(key) }) + end + alias_method :without, :except + + def stringify_keys!; self end + def deep_stringify_keys!; self end + def stringify_keys; dup end + def deep_stringify_keys; dup end + undef :symbolize_keys! + undef :deep_symbolize_keys! + def symbolize_keys; to_hash.symbolize_keys! end + alias_method :to_options, :symbolize_keys + def deep_symbolize_keys; to_hash.deep_symbolize_keys! end + def to_options!; self end + + def select(*args, &block) + return to_enum(:select) unless block_given? + dup.tap { |hash| hash.select!(*args, &block) } + end + + def reject(*args, &block) + return to_enum(:reject) unless block_given? + dup.tap { |hash| hash.reject!(*args, &block) } + end + + def transform_values(*args, &block) + return to_enum(:transform_values) unless block_given? + dup.tap { |hash| hash.transform_values!(*args, &block) } + end + + def transform_keys(*args, &block) + return to_enum(:transform_keys) unless block_given? + dup.tap { |hash| hash.transform_keys!(*args, &block) } + end + + def transform_keys! + return enum_for(:transform_keys!) { size } unless block_given? + keys.each do |key| + self[yield(key)] = delete(key) + end + self + end + + def slice(*keys) + keys.map! { |key| convert_key(key) } + self.class.new(super) + end + + def slice!(*keys) + keys.map! { |key| convert_key(key) } + super + end + + def compact + dup.tap(&:compact!) + end + + # Convert to a regular hash with string keys. + def to_hash + _new_hash = Hash.new + set_defaults(_new_hash) + + each do |key, value| + _new_hash[key] = convert_value(value, for: :to_hash) + end + _new_hash + end + + private + def convert_key(key) # :doc: + key.kind_of?(Symbol) ? key.to_s : key + end + + def convert_value(value, options = {}) # :doc: + if value.is_a? Hash + if options[:for] == :to_hash + value.to_hash + else + value.nested_under_indifferent_access + end + elsif value.is_a?(Array) + if options[:for] != :assignment || value.frozen? + value = value.dup + end + value.map! { |e| convert_value(e, options) } + else + value + end + end + + def set_defaults(target) # :doc: + if default_proc + target.default_proc = default_proc.dup + else + target.default = default + end + end + end +end + +# :stopdoc: + +HashWithIndifferentAccess = ActiveSupport::HashWithIndifferentAccess diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/i18n.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/i18n.rb new file mode 100644 index 000000000000..39dab1cc71aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/i18n.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "active_support/core_ext/hash/deep_merge" +require "active_support/core_ext/hash/except" +require "active_support/core_ext/hash/slice" +begin + require "i18n" +rescue LoadError => e + $stderr.puts "The i18n gem is not available. Please add it to your Gemfile and run bundle install" + raise e +end +require "active_support/lazy_load_hooks" + +ActiveSupport.run_load_hooks(:i18n) +I18n.load_path << File.expand_path("locale/en.yml", __dir__) +I18n.load_path << File.expand_path("locale/en.rb", __dir__) diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/i18n_railtie.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/i18n_railtie.rb new file mode 100644 index 000000000000..8b37f6a3cae5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/i18n_railtie.rb @@ -0,0 +1,130 @@ +# frozen_string_literal: true + +require "active_support" +require "active_support/core_ext/array/wrap" + +# :enddoc: + +module I18n + class Railtie < Rails::Railtie + config.i18n = ActiveSupport::OrderedOptions.new + config.i18n.railties_load_path = [] + config.i18n.load_path = [] + config.i18n.fallbacks = ActiveSupport::OrderedOptions.new + + if I18n.respond_to?(:eager_load!) + config.eager_load_namespaces << I18n + end + + # Set the i18n configuration after initialization since a lot of + # configuration is still usually done in application initializers. + config.after_initialize do |app| + I18n::Railtie.initialize_i18n(app) + end + + # Trigger i18n config before any eager loading has happened + # so it's ready if any classes require it when eager loaded. + config.before_eager_load do |app| + I18n::Railtie.initialize_i18n(app) + end + + @i18n_inited = false + + # Setup i18n configuration. + def self.initialize_i18n(app) + return if @i18n_inited + + fallbacks = app.config.i18n.delete(:fallbacks) + + # Avoid issues with setting the default_locale by disabling available locales + # check while configuring. + enforce_available_locales = app.config.i18n.delete(:enforce_available_locales) + enforce_available_locales = I18n.enforce_available_locales if enforce_available_locales.nil? + I18n.enforce_available_locales = false + + reloadable_paths = [] + app.config.i18n.each do |setting, value| + case setting + when :railties_load_path + reloadable_paths = value + app.config.i18n.load_path.unshift(*value.flat_map(&:existent)) + when :load_path + I18n.load_path += value + else + I18n.send("#{setting}=", value) + end + end + + init_fallbacks(fallbacks) if fallbacks && validate_fallbacks(fallbacks) + + # Restore available locales check so it will take place from now on. + I18n.enforce_available_locales = enforce_available_locales + + directories = watched_dirs_with_extensions(reloadable_paths) + reloader = app.config.file_watcher.new(I18n.load_path.dup, directories) do + I18n.load_path.keep_if { |p| File.exist?(p) } + I18n.load_path |= reloadable_paths.flat_map(&:existent) + + I18n.reload! + end + + app.reloaders << reloader + app.reloader.to_run do + reloader.execute_if_updated { require_unload_lock! } + end + reloader.execute + + @i18n_inited = true + end + + def self.include_fallbacks_module + I18n.backend.class.include(I18n::Backend::Fallbacks) + end + + def self.init_fallbacks(fallbacks) + include_fallbacks_module + + args = \ + case fallbacks + when ActiveSupport::OrderedOptions + [*(fallbacks[:defaults] || []) << fallbacks[:map]].compact + when Hash, Array + Array.wrap(fallbacks) + else # TrueClass + [I18n.default_locale] + end + + if args.empty? || args.first.is_a?(Hash) + ActiveSupport::Deprecation.warn(<<-MSG.squish) + Using I18n fallbacks with an empty `defaults` sets the defaults to + include the `default_locale`. This behavior will change in Rails 6.1. + If you desire the default locale to be included in the defaults, please + explicitly configure it with `config.i18n.fallbacks.defaults = + [I18n.default_locale]` or `config.i18n.fallbacks = [I18n.default_locale, + {...}]`. If you want to opt-in to the new behavior, use + `config.i18n.fallbacks.defaults = [nil, {...}]`. + MSG + args.unshift I18n.default_locale + end + + I18n.fallbacks = I18n::Locale::Fallbacks.new(*args) + end + + def self.validate_fallbacks(fallbacks) + case fallbacks + when ActiveSupport::OrderedOptions + !fallbacks.empty? + when TrueClass, Array, Hash + true + else + raise "Unexpected fallback type #{fallbacks.inspect}" + end + end + + def self.watched_dirs_with_extensions(paths) + paths.each_with_object({}) do |path, result| + result[path.absolute_current] = path.extensions + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflections.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflections.rb new file mode 100644 index 000000000000..baf1cb30388d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflections.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require "active_support/inflector/inflections" + +#-- +# Defines the standard inflection rules. These are the starting point for +# new projects and are not considered complete. The current set of inflection +# rules is frozen. This means, we do not change them to become more complete. +# This is a safety measure to keep existing applications from breaking. +#++ +module ActiveSupport + Inflector.inflections(:en) do |inflect| + inflect.plural(/$/, "s") + inflect.plural(/s$/i, "s") + inflect.plural(/^(ax|test)is$/i, '\1es') + inflect.plural(/(octop|vir)us$/i, '\1i') + inflect.plural(/(octop|vir)i$/i, '\1i') + inflect.plural(/(alias|status)$/i, '\1es') + inflect.plural(/(bu)s$/i, '\1ses') + inflect.plural(/(buffal|tomat)o$/i, '\1oes') + inflect.plural(/([ti])um$/i, '\1a') + inflect.plural(/([ti])a$/i, '\1a') + inflect.plural(/sis$/i, "ses") + inflect.plural(/(?:([^f])fe|([lr])f)$/i, '\1\2ves') + inflect.plural(/(hive)$/i, '\1s') + inflect.plural(/([^aeiouy]|qu)y$/i, '\1ies') + inflect.plural(/(x|ch|ss|sh)$/i, '\1es') + inflect.plural(/(matr|vert|ind)(?:ix|ex)$/i, '\1ices') + inflect.plural(/^(m|l)ouse$/i, '\1ice') + inflect.plural(/^(m|l)ice$/i, '\1ice') + inflect.plural(/^(ox)$/i, '\1en') + inflect.plural(/^(oxen)$/i, '\1') + inflect.plural(/(quiz)$/i, '\1zes') + + inflect.singular(/s$/i, "") + inflect.singular(/(ss)$/i, '\1') + inflect.singular(/(n)ews$/i, '\1ews') + inflect.singular(/([ti])a$/i, '\1um') + inflect.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, '\1sis') + inflect.singular(/(^analy)(sis|ses)$/i, '\1sis') + inflect.singular(/([^f])ves$/i, '\1fe') + inflect.singular(/(hive)s$/i, '\1') + inflect.singular(/(tive)s$/i, '\1') + inflect.singular(/([lr])ves$/i, '\1f') + inflect.singular(/([^aeiouy]|qu)ies$/i, '\1y') + inflect.singular(/(s)eries$/i, '\1eries') + inflect.singular(/(m)ovies$/i, '\1ovie') + inflect.singular(/(x|ch|ss|sh)es$/i, '\1') + inflect.singular(/^(m|l)ice$/i, '\1ouse') + inflect.singular(/(bus)(es)?$/i, '\1') + inflect.singular(/(o)es$/i, '\1') + inflect.singular(/(shoe)s$/i, '\1') + inflect.singular(/(cris|test)(is|es)$/i, '\1is') + inflect.singular(/^(a)x[ie]s$/i, '\1xis') + inflect.singular(/(octop|vir)(us|i)$/i, '\1us') + inflect.singular(/(alias|status)(es)?$/i, '\1') + inflect.singular(/^(ox)en/i, '\1') + inflect.singular(/(vert|ind)ices$/i, '\1ex') + inflect.singular(/(matr)ices$/i, '\1ix') + inflect.singular(/(quiz)zes$/i, '\1') + inflect.singular(/(database)s$/i, '\1') + + inflect.irregular("person", "people") + inflect.irregular("man", "men") + inflect.irregular("child", "children") + inflect.irregular("sex", "sexes") + inflect.irregular("move", "moves") + inflect.irregular("zombie", "zombies") + + inflect.uncountable(%w(equipment information rice money species series fish sheep jeans police)) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector.rb new file mode 100644 index 000000000000..d77f04c9c5fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +# in case active_support/inflector is required without the rest of active_support +require "active_support/inflector/inflections" +require "active_support/inflector/transliterate" +require "active_support/inflector/methods" + +require "active_support/inflections" +require "active_support/core_ext/string/inflections" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector/inflections.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector/inflections.rb new file mode 100644 index 000000000000..5b29a13894b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector/inflections.rb @@ -0,0 +1,256 @@ +# frozen_string_literal: true + +require "concurrent/map" +require "active_support/i18n" +require "active_support/deprecation" + +module ActiveSupport + module Inflector + extend self + + # A singleton instance of this class is yielded by Inflector.inflections, + # which can then be used to specify additional inflection rules. If passed + # an optional locale, rules for other languages can be specified. The + # default locale is :en. Only rules for English are provided. + # + # ActiveSupport::Inflector.inflections(:en) do |inflect| + # inflect.plural /^(ox)$/i, '\1\2en' + # inflect.singular /^(ox)en/i, '\1' + # + # inflect.irregular 'octopus', 'octopi' + # + # inflect.uncountable 'equipment' + # end + # + # New rules are added at the top. So in the example above, the irregular + # rule for octopus will now be the first of the pluralization and + # singularization rules that is runs. This guarantees that your rules run + # before any of the rules that may already have been loaded. + class Inflections + @__instance__ = Concurrent::Map.new + + class Uncountables < Array + def initialize + @regex_array = [] + super + end + + def delete(entry) + super entry + @regex_array.delete(to_regex(entry)) + end + + def <<(*word) + add(word) + end + + def add(words) + words = words.flatten.map(&:downcase) + concat(words) + @regex_array += words.map { |word| to_regex(word) } + self + end + + def uncountable?(str) + @regex_array.any? { |regex| regex.match? str } + end + + private + def to_regex(string) + /\b#{::Regexp.escape(string)}\Z/i + end + end + + def self.instance(locale = :en) + @__instance__[locale] ||= new + end + + attr_reader :plurals, :singulars, :uncountables, :humans, :acronyms + + attr_reader :acronyms_camelize_regex, :acronyms_underscore_regex # :nodoc: + + def initialize + @plurals, @singulars, @uncountables, @humans, @acronyms = [], [], Uncountables.new, [], {} + define_acronym_regex_patterns + end + + # Private, for the test suite. + def initialize_dup(orig) # :nodoc: + %w(plurals singulars uncountables humans acronyms).each do |scope| + instance_variable_set("@#{scope}", orig.send(scope).dup) + end + define_acronym_regex_patterns + end + + # Specifies a new acronym. An acronym must be specified as it will appear + # in a camelized string. An underscore string that contains the acronym + # will retain the acronym when passed to +camelize+, +humanize+, or + # +titleize+. A camelized string that contains the acronym will maintain + # the acronym when titleized or humanized, and will convert the acronym + # into a non-delimited single lowercase word when passed to +underscore+. + # + # acronym 'HTML' + # titleize 'html' # => 'HTML' + # camelize 'html' # => 'HTML' + # underscore 'MyHTML' # => 'my_html' + # + # The acronym, however, must occur as a delimited unit and not be part of + # another word for conversions to recognize it: + # + # acronym 'HTTP' + # camelize 'my_http_delimited' # => 'MyHTTPDelimited' + # camelize 'https' # => 'Https', not 'HTTPs' + # underscore 'HTTPS' # => 'http_s', not 'https' + # + # acronym 'HTTPS' + # camelize 'https' # => 'HTTPS' + # underscore 'HTTPS' # => 'https' + # + # Note: Acronyms that are passed to +pluralize+ will no longer be + # recognized, since the acronym will not occur as a delimited unit in the + # pluralized result. To work around this, you must specify the pluralized + # form as an acronym as well: + # + # acronym 'API' + # camelize(pluralize('api')) # => 'Apis' + # + # acronym 'APIs' + # camelize(pluralize('api')) # => 'APIs' + # + # +acronym+ may be used to specify any word that contains an acronym or + # otherwise needs to maintain a non-standard capitalization. The only + # restriction is that the word must begin with a capital letter. + # + # acronym 'RESTful' + # underscore 'RESTful' # => 'restful' + # underscore 'RESTfulController' # => 'restful_controller' + # titleize 'RESTfulController' # => 'RESTful Controller' + # camelize 'restful' # => 'RESTful' + # camelize 'restful_controller' # => 'RESTfulController' + # + # acronym 'McDonald' + # underscore 'McDonald' # => 'mcdonald' + # camelize 'mcdonald' # => 'McDonald' + def acronym(word) + @acronyms[word.downcase] = word + define_acronym_regex_patterns + end + + # Specifies a new pluralization rule and its replacement. The rule can + # either be a string or a regular expression. The replacement should + # always be a string that may include references to the matched data from + # the rule. + def plural(rule, replacement) + @uncountables.delete(rule) if rule.is_a?(String) + @uncountables.delete(replacement) + @plurals.prepend([rule, replacement]) + end + + # Specifies a new singularization rule and its replacement. The rule can + # either be a string or a regular expression. The replacement should + # always be a string that may include references to the matched data from + # the rule. + def singular(rule, replacement) + @uncountables.delete(rule) if rule.is_a?(String) + @uncountables.delete(replacement) + @singulars.prepend([rule, replacement]) + end + + # Specifies a new irregular that applies to both pluralization and + # singularization at the same time. This can only be used for strings, not + # regular expressions. You simply pass the irregular in singular and + # plural form. + # + # irregular 'octopus', 'octopi' + # irregular 'person', 'people' + def irregular(singular, plural) + @uncountables.delete(singular) + @uncountables.delete(plural) + + s0 = singular[0] + srest = singular[1..-1] + + p0 = plural[0] + prest = plural[1..-1] + + if s0.upcase == p0.upcase + plural(/(#{s0})#{srest}$/i, '\1' + prest) + plural(/(#{p0})#{prest}$/i, '\1' + prest) + + singular(/(#{s0})#{srest}$/i, '\1' + srest) + singular(/(#{p0})#{prest}$/i, '\1' + srest) + else + plural(/#{s0.upcase}(?i)#{srest}$/, p0.upcase + prest) + plural(/#{s0.downcase}(?i)#{srest}$/, p0.downcase + prest) + plural(/#{p0.upcase}(?i)#{prest}$/, p0.upcase + prest) + plural(/#{p0.downcase}(?i)#{prest}$/, p0.downcase + prest) + + singular(/#{s0.upcase}(?i)#{srest}$/, s0.upcase + srest) + singular(/#{s0.downcase}(?i)#{srest}$/, s0.downcase + srest) + singular(/#{p0.upcase}(?i)#{prest}$/, s0.upcase + srest) + singular(/#{p0.downcase}(?i)#{prest}$/, s0.downcase + srest) + end + end + + # Specifies words that are uncountable and should not be inflected. + # + # uncountable 'money' + # uncountable 'money', 'information' + # uncountable %w( money information rice ) + def uncountable(*words) + @uncountables.add(words) + end + + # Specifies a humanized form of a string by a regular expression rule or + # by a string mapping. When using a regular expression based replacement, + # the normal humanize formatting is called after the replacement. When a + # string is used, the human form should be specified as desired (example: + # 'The name', not 'the_name'). + # + # human /_cnt$/i, '\1_count' + # human 'legacy_col_person_name', 'Name' + def human(rule, replacement) + @humans.prepend([rule, replacement]) + end + + # Clears the loaded inflections within a given scope (default is + # :all). Give the scope as a symbol of the inflection type, the + # options are: :plurals, :singulars, :uncountables, + # :humans. + # + # clear :all + # clear :plurals + def clear(scope = :all) + case scope + when :all + @plurals, @singulars, @uncountables, @humans = [], [], Uncountables.new, [] + else + instance_variable_set "@#{scope}", [] + end + end + + private + def define_acronym_regex_patterns + @acronym_regex = @acronyms.empty? ? /(?=a)b/ : /#{@acronyms.values.join("|")}/ + @acronyms_camelize_regex = /^(?:#{@acronym_regex}(?=\b|[A-Z_])|\w)/ + @acronyms_underscore_regex = /(?:(?<=([A-Za-z\d]))|\b)(#{@acronym_regex})(?=\b|[^a-z])/ + end + end + + # Yields a singleton instance of Inflector::Inflections so you can specify + # additional inflector rules. If passed an optional locale, rules for other + # languages can be specified. If not specified, defaults to :en. + # Only rules for English are provided. + # + # ActiveSupport::Inflector.inflections(:en) do |inflect| + # inflect.uncountable 'rails' + # end + def inflections(locale = :en) + if block_given? + yield Inflections.instance(locale) + else + Inflections.instance(locale) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector/methods.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector/methods.rb new file mode 100644 index 000000000000..cb8ac626822f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector/methods.rb @@ -0,0 +1,397 @@ +# frozen_string_literal: true + +require "active_support/inflections" + +module ActiveSupport + # The Inflector transforms words from singular to plural, class names to table + # names, modularized class names to ones without, and class names to foreign + # keys. The default inflections for pluralization, singularization, and + # uncountable words are kept in inflections.rb. + # + # The Rails core team has stated patches for the inflections library will not + # be accepted in order to avoid breaking legacy applications which may be + # relying on errant inflections. If you discover an incorrect inflection and + # require it for your application or wish to define rules for languages other + # than English, please correct or add them yourself (explained below). + module Inflector + extend self + + # Returns the plural form of the word in the string. + # + # If passed an optional +locale+ parameter, the word will be + # pluralized using rules defined for that language. By default, + # this parameter is set to :en. + # + # pluralize('post') # => "posts" + # pluralize('octopus') # => "octopi" + # pluralize('sheep') # => "sheep" + # pluralize('words') # => "words" + # pluralize('CamelOctopus') # => "CamelOctopi" + # pluralize('ley', :es) # => "leyes" + def pluralize(word, locale = :en) + apply_inflections(word, inflections(locale).plurals, locale) + end + + # The reverse of #pluralize, returns the singular form of a word in a + # string. + # + # If passed an optional +locale+ parameter, the word will be + # singularized using rules defined for that language. By default, + # this parameter is set to :en. + # + # singularize('posts') # => "post" + # singularize('octopi') # => "octopus" + # singularize('sheep') # => "sheep" + # singularize('word') # => "word" + # singularize('CamelOctopi') # => "CamelOctopus" + # singularize('leyes', :es) # => "ley" + def singularize(word, locale = :en) + apply_inflections(word, inflections(locale).singulars, locale) + end + + # Converts strings to UpperCamelCase. + # If the +uppercase_first_letter+ parameter is set to false, then produces + # lowerCamelCase. + # + # Also converts '/' to '::' which is useful for converting + # paths to namespaces. + # + # camelize('active_model') # => "ActiveModel" + # camelize('active_model', false) # => "activeModel" + # camelize('active_model/errors') # => "ActiveModel::Errors" + # camelize('active_model/errors', false) # => "activeModel::Errors" + # + # As a rule of thumb you can think of +camelize+ as the inverse of + # #underscore, though there are cases where that does not hold: + # + # camelize(underscore('SSLError')) # => "SslError" + def camelize(term, uppercase_first_letter = true) + string = term.to_s + if uppercase_first_letter + string = string.sub(/^[a-z\d]*/) { |match| inflections.acronyms[match] || match.capitalize } + else + string = string.sub(inflections.acronyms_camelize_regex) { |match| match.downcase } + end + string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{inflections.acronyms[$2] || $2.capitalize}" } + string.gsub!("/", "::") + string + end + + # Makes an underscored, lowercase form from the expression in the string. + # + # Changes '::' to '/' to convert namespaces to paths. + # + # underscore('ActiveModel') # => "active_model" + # underscore('ActiveModel::Errors') # => "active_model/errors" + # + # As a rule of thumb you can think of +underscore+ as the inverse of + # #camelize, though there are cases where that does not hold: + # + # camelize(underscore('SSLError')) # => "SslError" + def underscore(camel_cased_word) + return camel_cased_word unless /[A-Z-]|::/.match?(camel_cased_word) + word = camel_cased_word.to_s.gsub("::", "/") + word.gsub!(inflections.acronyms_underscore_regex) { "#{$1 && '_' }#{$2.downcase}" } + word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2') + word.gsub!(/([a-z\d])([A-Z])/, '\1_\2') + word.tr!("-", "_") + word.downcase! + word + end + + # Tweaks an attribute name for display to end users. + # + # Specifically, performs these transformations: + # + # * Applies human inflection rules to the argument. + # * Deletes leading underscores, if any. + # * Removes a "_id" suffix if present. + # * Replaces underscores with spaces, if any. + # * Downcases all words except acronyms. + # * Capitalizes the first word. + # The capitalization of the first word can be turned off by setting the + # +:capitalize+ option to false (default is true). + # + # The trailing '_id' can be kept and capitalized by setting the + # optional parameter +keep_id_suffix+ to true (default is false). + # + # humanize('employee_salary') # => "Employee salary" + # humanize('author_id') # => "Author" + # humanize('author_id', capitalize: false) # => "author" + # humanize('_id') # => "Id" + # humanize('author_id', keep_id_suffix: true) # => "Author Id" + # + # If "SSL" was defined to be an acronym: + # + # humanize('ssl_error') # => "SSL error" + # + def humanize(lower_case_and_underscored_word, capitalize: true, keep_id_suffix: false) + result = lower_case_and_underscored_word.to_s.dup + + inflections.humans.each { |(rule, replacement)| break if result.sub!(rule, replacement) } + + result.sub!(/\A_+/, "") + unless keep_id_suffix + result.sub!(/_id\z/, "") + end + result.tr!("_", " ") + + result.gsub!(/([a-z\d]*)/i) do |match| + "#{inflections.acronyms[match.downcase] || match.downcase}" + end + + if capitalize + result.sub!(/\A\w/) { |match| match.upcase } + end + + result + end + + # Converts just the first character to uppercase. + # + # upcase_first('what a Lovely Day') # => "What a Lovely Day" + # upcase_first('w') # => "W" + # upcase_first('') # => "" + def upcase_first(string) + string.length > 0 ? string[0].upcase.concat(string[1..-1]) : "" + end + + # Capitalizes all the words and replaces some characters in the string to + # create a nicer looking title. +titleize+ is meant for creating pretty + # output. It is not used in the Rails internals. + # + # The trailing '_id','Id'.. can be kept and capitalized by setting the + # optional parameter +keep_id_suffix+ to true. + # By default, this parameter is false. + # + # +titleize+ is also aliased as +titlecase+. + # + # titleize('man from the boondocks') # => "Man From The Boondocks" + # titleize('x-men: the last stand') # => "X Men: The Last Stand" + # titleize('TheManWithoutAPast') # => "The Man Without A Past" + # titleize('raiders_of_the_lost_ark') # => "Raiders Of The Lost Ark" + # titleize('string_ending_with_id', keep_id_suffix: true) # => "String Ending With Id" + def titleize(word, keep_id_suffix: false) + humanize(underscore(word), keep_id_suffix: keep_id_suffix).gsub(/\b(? "raw_scaled_scorers" + # tableize('ham_and_egg') # => "ham_and_eggs" + # tableize('fancyCategory') # => "fancy_categories" + def tableize(class_name) + pluralize(underscore(class_name)) + end + + # Creates a class name from a plural table name like Rails does for table + # names to models. Note that this returns a string and not a Class (To + # convert to an actual class follow +classify+ with #constantize). + # + # classify('ham_and_eggs') # => "HamAndEgg" + # classify('posts') # => "Post" + # + # Singular names are not handled correctly: + # + # classify('calculus') # => "Calculu" + def classify(table_name) + # strip out any leading schema name + camelize(singularize(table_name.to_s.sub(/.*\./, ""))) + end + + # Replaces underscores with dashes in the string. + # + # dasherize('puni_puni') # => "puni-puni" + def dasherize(underscored_word) + underscored_word.tr("_", "-") + end + + # Removes the module part from the expression in the string. + # + # demodulize('ActiveSupport::Inflector::Inflections') # => "Inflections" + # demodulize('Inflections') # => "Inflections" + # demodulize('::Inflections') # => "Inflections" + # demodulize('') # => "" + # + # See also #deconstantize. + def demodulize(path) + path = path.to_s + if i = path.rindex("::") + path[(i + 2)..-1] + else + path + end + end + + # Removes the rightmost segment from the constant expression in the string. + # + # deconstantize('Net::HTTP') # => "Net" + # deconstantize('::Net::HTTP') # => "::Net" + # deconstantize('String') # => "" + # deconstantize('::String') # => "" + # deconstantize('') # => "" + # + # See also #demodulize. + def deconstantize(path) + path.to_s[0, path.rindex("::") || 0] # implementation based on the one in facets' Module#spacename + end + + # Creates a foreign key name from a class name. + # +separate_class_name_and_id_with_underscore+ sets whether + # the method should put '_' between the name and 'id'. + # + # foreign_key('Message') # => "message_id" + # foreign_key('Message', false) # => "messageid" + # foreign_key('Admin::Post') # => "post_id" + def foreign_key(class_name, separate_class_name_and_id_with_underscore = true) + underscore(demodulize(class_name)) + (separate_class_name_and_id_with_underscore ? "_id" : "id") + end + + # Tries to find a constant with the name specified in the argument string. + # + # constantize('Module') # => Module + # constantize('Foo::Bar') # => Foo::Bar + # + # The name is assumed to be the one of a top-level constant, no matter + # whether it starts with "::" or not. No lexical context is taken into + # account: + # + # C = 'outside' + # module M + # C = 'inside' + # C # => 'inside' + # constantize('C') # => 'outside', same as ::C + # end + # + # NameError is raised when the name is not in CamelCase or the constant is + # unknown. + def constantize(camel_cased_word) + names = camel_cased_word.split("::") + + # Trigger a built-in NameError exception including the ill-formed constant in the message. + Object.const_get(camel_cased_word) if names.empty? + + # Remove the first blank element in case of '::ClassName' notation. + names.shift if names.size > 1 && names.first.empty? + + names.inject(Object) do |constant, name| + if constant == Object + constant.const_get(name) + else + candidate = constant.const_get(name) + next candidate if constant.const_defined?(name, false) + next candidate unless Object.const_defined?(name) + + # Go down the ancestors to check if it is owned directly. The check + # stops when we reach Object or the end of ancestors tree. + constant = constant.ancestors.inject(constant) do |const, ancestor| + break const if ancestor == Object + break ancestor if ancestor.const_defined?(name, false) + const + end + + # owner is in Object, so raise + constant.const_get(name, false) + end + end + end + + # Tries to find a constant with the name specified in the argument string. + # + # safe_constantize('Module') # => Module + # safe_constantize('Foo::Bar') # => Foo::Bar + # + # The name is assumed to be the one of a top-level constant, no matter + # whether it starts with "::" or not. No lexical context is taken into + # account: + # + # C = 'outside' + # module M + # C = 'inside' + # C # => 'inside' + # safe_constantize('C') # => 'outside', same as ::C + # end + # + # +nil+ is returned when the name is not in CamelCase or the constant (or + # part of it) is unknown. + # + # safe_constantize('blargle') # => nil + # safe_constantize('UnknownModule') # => nil + # safe_constantize('UnknownModule::Foo::Bar') # => nil + def safe_constantize(camel_cased_word) + constantize(camel_cased_word) + rescue NameError => e + raise if e.name && !(camel_cased_word.to_s.split("::").include?(e.name.to_s) || + e.name.to_s == camel_cased_word.to_s) + rescue ArgumentError => e + raise unless /not missing constant #{const_regexp(camel_cased_word)}!$/.match?(e.message) + rescue LoadError => e + raise unless /Unable to autoload constant #{const_regexp(camel_cased_word)}/.match?(e.message) + end + + # Returns the suffix that should be added to a number to denote the position + # in an ordered sequence such as 1st, 2nd, 3rd, 4th. + # + # ordinal(1) # => "st" + # ordinal(2) # => "nd" + # ordinal(1002) # => "nd" + # ordinal(1003) # => "rd" + # ordinal(-11) # => "th" + # ordinal(-1021) # => "st" + def ordinal(number) + I18n.translate("number.nth.ordinals", number: number) + end + + # Turns a number into an ordinal string used to denote the position in an + # ordered sequence such as 1st, 2nd, 3rd, 4th. + # + # ordinalize(1) # => "1st" + # ordinalize(2) # => "2nd" + # ordinalize(1002) # => "1002nd" + # ordinalize(1003) # => "1003rd" + # ordinalize(-11) # => "-11th" + # ordinalize(-1021) # => "-1021st" + def ordinalize(number) + I18n.translate("number.nth.ordinalized", number: number) + end + + private + # Mounts a regular expression, returned as a string to ease interpolation, + # that will match part by part the given constant. + # + # const_regexp("Foo::Bar::Baz") # => "Foo(::Bar(::Baz)?)?" + # const_regexp("::") # => "::" + def const_regexp(camel_cased_word) + parts = camel_cased_word.split("::") + + return Regexp.escape(camel_cased_word) if parts.blank? + + last = parts.pop + + parts.reverse.inject(last) do |acc, part| + part.empty? ? acc : "#{part}(::#{acc})?" + end + end + + # Applies inflection rules for +singularize+ and +pluralize+. + # + # If passed an optional +locale+ parameter, the uncountables will be + # found for that locale. + # + # apply_inflections('post', inflections.plurals, :en) # => "posts" + # apply_inflections('posts', inflections.singulars, :en) # => "post" + def apply_inflections(word, rules, locale = :en) + result = word.to_s.dup + + if word.empty? || inflections(locale).uncountables.uncountable?(result) + result + else + rules.each { |(rule, replacement)| break if result.sub!(rule, replacement) } + result + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector/transliterate.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector/transliterate.rb new file mode 100644 index 000000000000..3e8ffd46a089 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/inflector/transliterate.rb @@ -0,0 +1,147 @@ +# frozen_string_literal: true + +require "active_support/core_ext/string/multibyte" +require "active_support/i18n" + +module ActiveSupport + module Inflector + # Replaces non-ASCII characters with an ASCII approximation, or if none + # exists, a replacement character which defaults to "?". + # + # transliterate('Ærøskøbing') + # # => "AEroskobing" + # + # Default approximations are provided for Western/Latin characters, + # e.g, "ø", "ñ", "é", "ß", etc. + # + # This method is I18n aware, so you can set up custom approximations for a + # locale. This can be useful, for example, to transliterate German's "ü" + # and "ö" to "ue" and "oe", or to add support for transliterating Russian + # to ASCII. + # + # In order to make your custom transliterations available, you must set + # them as the i18n.transliterate.rule i18n key: + # + # # Store the transliterations in locales/de.yml + # i18n: + # transliterate: + # rule: + # ü: "ue" + # ö: "oe" + # + # # Or set them using Ruby + # I18n.backend.store_translations(:de, i18n: { + # transliterate: { + # rule: { + # 'ü' => 'ue', + # 'ö' => 'oe' + # } + # } + # }) + # + # The value for i18n.transliterate.rule can be a simple Hash that + # maps characters to ASCII approximations as shown above, or, for more + # complex requirements, a Proc: + # + # I18n.backend.store_translations(:de, i18n: { + # transliterate: { + # rule: ->(string) { MyTransliterator.transliterate(string) } + # } + # }) + # + # Now you can have different transliterations for each locale: + # + # transliterate('Jürgen', locale: :en) + # # => "Jurgen" + # + # transliterate('Jürgen', locale: :de) + # # => "Juergen" + # + # Transliteration is restricted to UTF-8, US-ASCII and GB18030 strings + # Other encodings will raise an ArgumentError. + def transliterate(string, replacement = "?", locale: nil) + string = string.dup if string.frozen? + raise ArgumentError, "Can only transliterate strings. Received #{string.class.name}" unless string.is_a?(String) + + allowed_encodings = [Encoding::UTF_8, Encoding::US_ASCII, Encoding::GB18030] + raise ArgumentError, "Can not transliterate strings with #{string.encoding} encoding" unless allowed_encodings.include?(string.encoding) + + input_encoding = string.encoding + + # US-ASCII is a subset of UTF-8 so we'll force encoding as UTF-8 if + # US-ASCII is given. This way we can let tidy_bytes handle the string + # in the same way as we do for UTF-8 + string.force_encoding(Encoding::UTF_8) if string.encoding == Encoding::US_ASCII + + # GB18030 is Unicode compatible but is not a direct mapping so needs to be + # transcoded. Using invalid/undef :replace will result in loss of data in + # the event of invalid characters, but since tidy_bytes will replace + # invalid/undef with a "?" we're safe to do the same beforehand + string.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace) if string.encoding == Encoding::GB18030 + + transliterated = I18n.transliterate( + ActiveSupport::Multibyte::Unicode.tidy_bytes(string).unicode_normalize(:nfc), + replacement: replacement, + locale: locale + ) + + # Restore the string encoding of the input if it was not UTF-8. + # Apply invalid/undef :replace as tidy_bytes does + transliterated.encode!(input_encoding, invalid: :replace, undef: :replace) if input_encoding != transliterated.encoding + + transliterated + end + + # Replaces special characters in a string so that it may be used as part of + # a 'pretty' URL. + # + # parameterize("Donald E. Knuth") # => "donald-e-knuth" + # parameterize("^très|Jolie-- ") # => "tres-jolie" + # + # To use a custom separator, override the +separator+ argument. + # + # parameterize("Donald E. Knuth", separator: '_') # => "donald_e_knuth" + # parameterize("^très|Jolie__ ", separator: '_') # => "tres_jolie" + # + # To preserve the case of the characters in a string, use the +preserve_case+ argument. + # + # parameterize("Donald E. Knuth", preserve_case: true) # => "Donald-E-Knuth" + # parameterize("^très|Jolie-- ", preserve_case: true) # => "tres-Jolie" + # + # It preserves dashes and underscores unless they are used as separators: + # + # parameterize("^très|Jolie__ ") # => "tres-jolie__" + # parameterize("^très|Jolie-- ", separator: "_") # => "tres_jolie--" + # parameterize("^très_Jolie-- ", separator: ".") # => "tres_jolie--" + # + # If the optional parameter +locale+ is specified, + # the word will be parameterized as a word of that language. + # By default, this parameter is set to nil and it will use + # the configured I18n.locale. + def parameterize(string, separator: "-", preserve_case: false, locale: nil) + # Replace accented chars with their ASCII equivalents. + parameterized_string = transliterate(string, locale: locale) + + # Turn unwanted chars into the separator. + parameterized_string.gsub!(/[^a-z0-9\-_]+/i, separator) + + unless separator.nil? || separator.empty? + if separator == "-" + re_duplicate_separator = /-{2,}/ + re_leading_trailing_separator = /^-|-$/i + else + re_sep = Regexp.escape(separator) + re_duplicate_separator = /#{re_sep}{2,}/ + re_leading_trailing_separator = /^#{re_sep}|#{re_sep}$/i + end + # No more than one of the separator in a row. + parameterized_string.gsub!(re_duplicate_separator, separator) + # Remove leading/trailing separator. + parameterized_string.gsub!(re_leading_trailing_separator, "") + end + + parameterized_string.downcase! unless preserve_case + parameterized_string + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/json.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/json.rb new file mode 100644 index 000000000000..d7887175c042 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/json.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +require "active_support/json/decoding" +require "active_support/json/encoding" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/json/decoding.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/json/decoding.rb new file mode 100644 index 000000000000..b4bf882bc341 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/json/decoding.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/attribute_accessors" +require "active_support/core_ext/module/delegation" +require "json" + +module ActiveSupport + # Look for and parse json strings that look like ISO 8601 times. + mattr_accessor :parse_json_times + + module JSON + # matches YAML-formatted dates + DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/ + DATETIME_REGEX = /^(?:\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[T \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?)?)$/ + + class << self + # Parses a JSON string (JavaScript Object Notation) into a hash. + # See http://www.json.org for more info. + # + # ActiveSupport::JSON.decode("{\"team\":\"rails\",\"players\":\"36\"}") + # => {"team" => "rails", "players" => "36"} + def decode(json) + data = ::JSON.parse(json, quirks_mode: true) + + if ActiveSupport.parse_json_times + convert_dates_from(data) + else + data + end + end + + # Returns the class of the error that will be raised when there is an + # error in decoding JSON. Using this method means you won't directly + # depend on the ActiveSupport's JSON implementation, in case it changes + # in the future. + # + # begin + # obj = ActiveSupport::JSON.decode(some_string) + # rescue ActiveSupport::JSON.parse_error + # Rails.logger.warn("Attempted to decode invalid JSON: #{some_string}") + # end + def parse_error + ::JSON::ParserError + end + + private + def convert_dates_from(data) + case data + when nil + nil + when DATE_REGEX + begin + Date.parse(data) + rescue ArgumentError + data + end + when DATETIME_REGEX + begin + Time.zone.parse(data) + rescue ArgumentError + data + end + when Array + data.map! { |d| convert_dates_from(d) } + when Hash + data.each do |key, value| + data[key] = convert_dates_from(value) + end + else + data + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/json/encoding.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/json/encoding.rb new file mode 100644 index 000000000000..de1b8ac8cf1b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/json/encoding.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/json" +require "active_support/core_ext/module/delegation" + +module ActiveSupport + class << self + delegate :use_standard_json_time_format, :use_standard_json_time_format=, + :time_precision, :time_precision=, + :escape_html_entities_in_json, :escape_html_entities_in_json=, + :json_encoder, :json_encoder=, + to: :'ActiveSupport::JSON::Encoding' + end + + module JSON + # Dumps objects in JSON (JavaScript Object Notation). + # See http://www.json.org for more info. + # + # ActiveSupport::JSON.encode({ team: 'rails', players: '36' }) + # # => "{\"team\":\"rails\",\"players\":\"36\"}" + def self.encode(value, options = nil) + Encoding.json_encoder.new(options).encode(value) + end + + module Encoding #:nodoc: + class JSONGemEncoder #:nodoc: + attr_reader :options + + def initialize(options = nil) + @options = options || {} + end + + # Encode the given object into a JSON string + def encode(value) + stringify jsonify value.as_json(options.dup) + end + + private + # Rails does more escaping than the JSON gem natively does (we + # escape \u2028 and \u2029 and optionally >, <, & to work around + # certain browser problems). + ESCAPED_CHARS = { + "\u2028" => '\u2028', + "\u2029" => '\u2029', + ">" => '\u003e', + "<" => '\u003c', + "&" => '\u0026', + } + + ESCAPE_REGEX_WITH_HTML_ENTITIES = /[\u2028\u2029><&]/u + ESCAPE_REGEX_WITHOUT_HTML_ENTITIES = /[\u2028\u2029]/u + + # This class wraps all the strings we see and does the extra escaping + class EscapedString < String #:nodoc: + def to_json(*) + if Encoding.escape_html_entities_in_json + s = super + s.gsub! ESCAPE_REGEX_WITH_HTML_ENTITIES, ESCAPED_CHARS + s + else + s = super + s.gsub! ESCAPE_REGEX_WITHOUT_HTML_ENTITIES, ESCAPED_CHARS + s + end + end + + def to_s + self + end + end + + # Mark these as private so we don't leak encoding-specific constructs + private_constant :ESCAPED_CHARS, :ESCAPE_REGEX_WITH_HTML_ENTITIES, + :ESCAPE_REGEX_WITHOUT_HTML_ENTITIES, :EscapedString + + # Convert an object into a "JSON-ready" representation composed of + # primitives like Hash, Array, String, Numeric, + # and +true+/+false+/+nil+. + # Recursively calls #as_json to the object to recursively build a + # fully JSON-ready object. + # + # This allows developers to implement #as_json without having to + # worry about what base types of objects they are allowed to return + # or having to remember to call #as_json recursively. + # + # Note: the +options+ hash passed to +object.to_json+ is only passed + # to +object.as_json+, not any of this method's recursive +#as_json+ + # calls. + def jsonify(value) + case value + when String + EscapedString.new(value) + when Numeric, NilClass, TrueClass, FalseClass + value.as_json + when Hash + Hash[value.map { |k, v| [jsonify(k), jsonify(v)] }] + when Array + value.map { |v| jsonify(v) } + else + jsonify value.as_json + end + end + + # Encode a "jsonified" Ruby data structure using the JSON gem + def stringify(jsonified) + ::JSON.generate(jsonified, quirks_mode: true, max_nesting: false) + end + end + + class << self + # If true, use ISO 8601 format for dates and times. Otherwise, fall back + # to the Active Support legacy format. + attr_accessor :use_standard_json_time_format + + # If true, encode >, <, & as escaped unicode sequences (e.g. > as \u003e) + # as a safety measure. + attr_accessor :escape_html_entities_in_json + + # Sets the precision of encoded time values. + # Defaults to 3 (equivalent to millisecond precision) + attr_accessor :time_precision + + # Sets the encoder used by Rails to encode Ruby objects into JSON strings + # in +Object#to_json+ and +ActiveSupport::JSON.encode+. + attr_accessor :json_encoder + end + + self.use_standard_json_time_format = true + self.escape_html_entities_in_json = true + self.json_encoder = JSONGemEncoder + self.time_precision = 3 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/key_generator.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/key_generator.rb new file mode 100644 index 000000000000..8b61982883f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/key_generator.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require "concurrent/map" +require "openssl" + +module ActiveSupport + # KeyGenerator is a simple wrapper around OpenSSL's implementation of PBKDF2. + # It can be used to derive a number of keys for various purposes from a given secret. + # This lets Rails applications have a single secure secret, but avoid reusing that + # key in multiple incompatible contexts. + class KeyGenerator + def initialize(secret, options = {}) + @secret = secret + # The default iterations are higher than required for our key derivation uses + # on the off chance someone uses this for password storage + @iterations = options[:iterations] || 2**16 + end + + # Returns a derived key suitable for use. The default key_size is chosen + # to be compatible with the default settings of ActiveSupport::MessageVerifier. + # i.e. OpenSSL::Digest::SHA1#block_length + def generate_key(salt, key_size = 64) + OpenSSL::PKCS5.pbkdf2_hmac_sha1(@secret, salt, @iterations, key_size) + end + end + + # CachingKeyGenerator is a wrapper around KeyGenerator which allows users to avoid + # re-executing the key generation process when it's called using the same salt and + # key_size. + class CachingKeyGenerator + def initialize(key_generator) + @key_generator = key_generator + @cache_keys = Concurrent::Map.new + end + + # Returns a derived key suitable for use. + def generate_key(*args) + @cache_keys[args.join] ||= @key_generator.generate_key(*args) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/lazy_load_hooks.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/lazy_load_hooks.rb new file mode 100644 index 000000000000..c6f7ccf0a280 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/lazy_load_hooks.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +module ActiveSupport + # lazy_load_hooks allows Rails to lazily load a lot of components and thus + # making the app boot faster. Because of this feature now there is no need to + # require ActiveRecord::Base at boot time purely to apply + # configuration. Instead a hook is registered that applies configuration once + # ActiveRecord::Base is loaded. Here ActiveRecord::Base is + # used as example but this feature can be applied elsewhere too. + # + # Here is an example where +on_load+ method is called to register a hook. + # + # initializer 'active_record.initialize_timezone' do + # ActiveSupport.on_load(:active_record) do + # self.time_zone_aware_attributes = true + # self.default_timezone = :utc + # end + # end + # + # When the entirety of +ActiveRecord::Base+ has been + # evaluated then +run_load_hooks+ is invoked. The very last line of + # +ActiveRecord::Base+ is: + # + # ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base) + module LazyLoadHooks + def self.extended(base) # :nodoc: + base.class_eval do + @load_hooks = Hash.new { |h, k| h[k] = [] } + @loaded = Hash.new { |h, k| h[k] = [] } + @run_once = Hash.new { |h, k| h[k] = [] } + end + end + + # Declares a block that will be executed when a Rails component is fully + # loaded. + # + # Options: + # + # * :yield - Yields the object that run_load_hooks to +block+. + # * :run_once - Given +block+ will run only once. + def on_load(name, options = {}, &block) + @loaded[name].each do |base| + execute_hook(name, base, options, block) + end + + @load_hooks[name] << [block, options] + end + + def run_load_hooks(name, base = Object) + @loaded[name] << base + @load_hooks[name].each do |hook, options| + execute_hook(name, base, options, hook) + end + end + + private + def with_execution_control(name, block, once) + unless @run_once[name].include?(block) + @run_once[name] << block if once + + yield + end + end + + def execute_hook(name, base, options, block) + with_execution_control(name, block, options[:run_once]) do + if options[:yield] + block.call(base) + else + if base.is_a?(Module) + base.class_eval(&block) + else + base.instance_eval(&block) + end + end + end + end + end + + extend LazyLoadHooks +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/locale/en.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/locale/en.rb new file mode 100644 index 000000000000..29eb9dec0c8c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/locale/en.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +{ + en: { + number: { + nth: { + ordinals: lambda do |_key, options| + number = options[:number] + case number + when 1; "st" + when 2; "nd" + when 3; "rd" + when 4, 5, 6, 7, 8, 9, 10, 11, 12, 13; "th" + else + num_modulo = number.to_i.abs % 100 + num_modulo %= 10 if num_modulo > 13 + case num_modulo + when 1; "st" + when 2; "nd" + when 3; "rd" + else "th" + end + end + end, + + ordinalized: lambda do |_key, options| + number = options[:number] + "#{number}#{ActiveSupport::Inflector.ordinal(number)}" + end + } + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/locale/en.yml b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/locale/en.yml new file mode 100644 index 000000000000..c64b7598ee39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/locale/en.yml @@ -0,0 +1,135 @@ +en: + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] + abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + # Used in date_select and datetime_select. + order: + - year + - month + - day + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "am" + pm: "pm" + +# Used in array.to_sentence. + support: + array: + words_connector: ", " + two_words_connector: " and " + last_word_connector: ", and " + number: + # Used in NumberHelper.number_to_delimited() + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' + format: + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) + separator: "." + # Delimits thousands (e.g. 1,000,000 is a million) (always in groups of three) + delimiter: "," + # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) + precision: 3 + # If set to true, precision will mean the number of significant digits instead + # of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2) + significant: false + # If set, the zeros after the decimal separator will always be stripped (eg.: 1.200 will be 1.2) + strip_insignificant_zeros: false + + # Used in NumberHelper.number_to_currency() + currency: + format: + # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) + format: "%u%n" + unit: "$" + # These five are to override number.format and are optional + separator: "." + delimiter: "," + precision: 2 + significant: false + strip_insignificant_zeros: false + + # Used in NumberHelper.number_to_percentage() + percentage: + format: + # These five are to override number.format and are optional + # separator: + delimiter: "" + # precision: + # significant: false + # strip_insignificant_zeros: false + format: "%n%" + + # Used in NumberHelper.number_to_rounded() + precision: + format: + # These five are to override number.format and are optional + # separator: + delimiter: "" + # precision: + # significant: false + # strip_insignificant_zeros: false + + # Used in NumberHelper.number_to_human_size() and NumberHelper.number_to_human() + human: + format: + # These five are to override number.format and are optional + # separator: + delimiter: "" + precision: 3 + significant: true + strip_insignificant_zeros: true + # Used in number_to_human_size() + storage_units: + # Storage units output formatting. + # %u is the storage unit, %n is the number (default: 2 MB) + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + pb: "PB" + eb: "EB" + # Used in NumberHelper.number_to_human() + decimal_units: + format: "%n %u" + # Decimal units output formatting + # By default we will only quantify some of the exponents + # but the commented ones might be defined or overridden + # by the user. + units: + # femto: Quadrillionth + # pico: Trillionth + # nano: Billionth + # micro: Millionth + # mili: Thousandth + # centi: Hundredth + # deci: Tenth + unit: "" + # ten: + # one: Ten + # other: Tens + # hundred: Hundred + thousand: Thousand + million: Million + billion: Billion + trillion: Trillion + quadrillion: Quadrillion diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/log_subscriber.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/log_subscriber.rb new file mode 100644 index 000000000000..db991c7a32ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/log_subscriber.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/attribute_accessors" +require "active_support/core_ext/class/attribute" +require "active_support/subscriber" + +module ActiveSupport + # ActiveSupport::LogSubscriber is an object set to consume + # ActiveSupport::Notifications with the sole purpose of logging them. + # The log subscriber dispatches notifications to a registered object based + # on its given namespace. + # + # An example would be Active Record log subscriber responsible for logging + # queries: + # + # module ActiveRecord + # class LogSubscriber < ActiveSupport::LogSubscriber + # def sql(event) + # info "#{event.payload[:name]} (#{event.duration}) #{event.payload[:sql]}" + # end + # end + # end + # + # And it's finally registered as: + # + # ActiveRecord::LogSubscriber.attach_to :active_record + # + # Since we need to know all instance methods before attaching the log + # subscriber, the line above should be called after your + # ActiveRecord::LogSubscriber definition. + # + # After configured, whenever a "sql.active_record" notification is published, + # it will properly dispatch the event + # (ActiveSupport::Notifications::Event) to the sql method. + # + # Being an ActiveSupport::Notifications consumer, + # ActiveSupport::LogSubscriber exposes a simple interface to check if + # instrumented code raises an exception. It is common to log a different + # message in case of an error, and this can be achieved by extending + # the previous example: + # + # module ActiveRecord + # class LogSubscriber < ActiveSupport::LogSubscriber + # def sql(event) + # exception = event.payload[:exception] + # + # if exception + # exception_object = event.payload[:exception_object] + # + # error "[ERROR] #{event.payload[:name]}: #{exception.join(', ')} " \ + # "(#{exception_object.backtrace.first})" + # else + # # standard logger code + # end + # end + # end + # end + # + # Log subscriber also has some helpers to deal with logging and automatically + # flushes all logs when the request finishes + # (via action_dispatch.callback notification) in a Rails environment. + class LogSubscriber < Subscriber + # Embed in a String to clear all previous ANSI sequences. + CLEAR = "\e[0m" + BOLD = "\e[1m" + + # Colors + BLACK = "\e[30m" + RED = "\e[31m" + GREEN = "\e[32m" + YELLOW = "\e[33m" + BLUE = "\e[34m" + MAGENTA = "\e[35m" + CYAN = "\e[36m" + WHITE = "\e[37m" + + mattr_accessor :colorize_logging, default: true + + class << self + def logger + @logger ||= if defined?(Rails) && Rails.respond_to?(:logger) + Rails.logger + end + end + + attr_writer :logger + + def log_subscribers + subscribers + end + + # Flush all log_subscribers' logger. + def flush_all! + logger.flush if logger.respond_to?(:flush) + end + end + + def logger + LogSubscriber.logger + end + + def start(name, id, payload) + super if logger + end + + def finish(name, id, payload) + super if logger + rescue => e + if logger + logger.error "Could not log #{name.inspect} event. #{e.class}: #{e.message} #{e.backtrace}" + end + end + + private + %w(info debug warn error fatal unknown).each do |level| + class_eval <<-METHOD, __FILE__, __LINE__ + 1 + def #{level}(progname = nil, &block) + logger.#{level}(progname, &block) if logger + end + METHOD + end + + # Set color by using a symbol or one of the defined constants. If a third + # option is set to +true+, it also adds bold to the string. This is based + # on the Highline implementation and will automatically append CLEAR to the + # end of the returned String. + def color(text, color, bold = false) # :doc: + return text unless colorize_logging + color = self.class.const_get(color.upcase) if color.is_a?(Symbol) + bold = bold ? BOLD : "" + "#{bold}#{color}#{text}#{CLEAR}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/log_subscriber/test_helper.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/log_subscriber/test_helper.rb new file mode 100644 index 000000000000..3f19ef50097a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/log_subscriber/test_helper.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +require "active_support/log_subscriber" +require "active_support/logger" +require "active_support/notifications" + +module ActiveSupport + class LogSubscriber + # Provides some helpers to deal with testing log subscribers by setting up + # notifications. Take for instance Active Record subscriber tests: + # + # class SyncLogSubscriberTest < ActiveSupport::TestCase + # include ActiveSupport::LogSubscriber::TestHelper + # + # setup do + # ActiveRecord::LogSubscriber.attach_to(:active_record) + # end + # + # def test_basic_query_logging + # Developer.all.to_a + # wait + # assert_equal 1, @logger.logged(:debug).size + # assert_match(/Developer Load/, @logger.logged(:debug).last) + # assert_match(/SELECT \* FROM "developers"/, @logger.logged(:debug).last) + # end + # end + # + # All you need to do is to ensure that your log subscriber is added to + # Rails::Subscriber, as in the second line of the code above. The test + # helpers are responsible for setting up the queue, subscriptions and + # turning colors in logs off. + # + # The messages are available in the @logger instance, which is a logger with + # limited powers (it actually does not send anything to your output), and + # you can collect them doing @logger.logged(level), where level is the level + # used in logging, like info, debug, warn and so on. + module TestHelper + def setup # :nodoc: + @logger = MockLogger.new + @notifier = ActiveSupport::Notifications::Fanout.new + + ActiveSupport::LogSubscriber.colorize_logging = false + + @old_notifier = ActiveSupport::Notifications.notifier + set_logger(@logger) + ActiveSupport::Notifications.notifier = @notifier + end + + def teardown # :nodoc: + set_logger(nil) + ActiveSupport::Notifications.notifier = @old_notifier + end + + class MockLogger + include ActiveSupport::Logger::Severity + + attr_reader :flush_count + attr_accessor :level + + def initialize(level = DEBUG) + @flush_count = 0 + @level = level + @logged = Hash.new { |h, k| h[k] = [] } + end + + def method_missing(level, message = nil) + if block_given? + @logged[level] << yield + else + @logged[level] << message + end + end + + def logged(level) + @logged[level].compact.map { |l| l.to_s.strip } + end + + def flush + @flush_count += 1 + end + + ActiveSupport::Logger::Severity.constants.each do |severity| + class_eval <<-EOT, __FILE__, __LINE__ + 1 + def #{severity.downcase}? + #{severity} >= @level + end + EOT + end + end + + # Wait notifications to be published. + def wait + @notifier.wait + end + + # Overwrite if you use another logger in your log subscriber. + # + # def logger + # ActiveRecord::Base.logger = @logger + # end + def set_logger(logger) + ActiveSupport::LogSubscriber.logger = logger + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/logger.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/logger.rb new file mode 100644 index 000000000000..d8f537c64d93 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/logger.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +require "active_support/logger_silence" +require "active_support/logger_thread_safe_level" +require "logger" + +module ActiveSupport + class Logger < ::Logger + include LoggerSilence + + # Returns true if the logger destination matches one of the sources + # + # logger = Logger.new(STDOUT) + # ActiveSupport::Logger.logger_outputs_to?(logger, STDOUT) + # # => true + def self.logger_outputs_to?(logger, *sources) + logdev = logger.instance_variable_get("@logdev") + logger_source = logdev.dev if logdev.respond_to?(:dev) + sources.any? { |source| source == logger_source } + end + + # Broadcasts logs to multiple loggers. + def self.broadcast(logger) # :nodoc: + Module.new do + define_method(:add) do |*args, &block| + logger.add(*args, &block) + super(*args, &block) + end + + define_method(:<<) do |x| + logger << x + super(x) + end + + define_method(:close) do + logger.close + super() + end + + define_method(:progname=) do |name| + logger.progname = name + super(name) + end + + define_method(:formatter=) do |formatter| + logger.formatter = formatter + super(formatter) + end + + define_method(:level=) do |level| + logger.level = level + super(level) + end + + define_method(:local_level=) do |level| + logger.local_level = level if logger.respond_to?(:local_level=) + super(level) if respond_to?(:local_level=) + end + + define_method(:silence) do |level = Logger::ERROR, &block| + if logger.respond_to?(:silence) + logger.silence(level) do + if defined?(super) + super(level, &block) + else + block.call(self) + end + end + else + if defined?(super) + super(level, &block) + else + block.call(self) + end + end + end + end + end + + def initialize(*args, **kwargs) + super + @formatter = SimpleFormatter.new + end + + # Simple formatter which only displays the message. + class SimpleFormatter < ::Logger::Formatter + # This method is invoked when a log event occurs + def call(severity, timestamp, progname, msg) + "#{String === msg ? msg : msg.inspect}\n" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/logger_silence.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/logger_silence.rb new file mode 100644 index 000000000000..b2444c1e342d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/logger_silence.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require "active_support/concern" +require "active_support/core_ext/module/attribute_accessors" +require "active_support/logger_thread_safe_level" + +module LoggerSilence + extend ActiveSupport::Concern + + included do + ActiveSupport::Deprecation.warn( + "Including LoggerSilence is deprecated and will be removed in Rails 6.1. " \ + "Please use `ActiveSupport::LoggerSilence` instead" + ) + + include ActiveSupport::LoggerSilence + end +end + +module ActiveSupport + module LoggerSilence + extend ActiveSupport::Concern + + included do + cattr_accessor :silencer, default: true + include ActiveSupport::LoggerThreadSafeLevel + end + + # Silences the logger for the duration of the block. + def silence(temporary_level = Logger::ERROR) + if silencer + begin + old_local_level = local_level + self.local_level = temporary_level + + yield self + ensure + self.local_level = old_local_level + end + else + yield self + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/logger_thread_safe_level.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/logger_thread_safe_level.rb new file mode 100644 index 000000000000..1775a4149268 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/logger_thread_safe_level.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require "active_support/concern" +require "active_support/core_ext/module/attribute_accessors" +require "concurrent" +require "fiber" + +module ActiveSupport + module LoggerThreadSafeLevel # :nodoc: + extend ActiveSupport::Concern + + included do + cattr_accessor :local_levels, default: Concurrent::Map.new(initial_capacity: 2), instance_accessor: false + end + + Logger::Severity.constants.each do |severity| + class_eval(<<-EOT, __FILE__, __LINE__ + 1) + def #{severity.downcase}? # def debug? + Logger::#{severity} >= level # DEBUG >= level + end # end + EOT + end + + def after_initialize + ActiveSupport::Deprecation.warn( + "Logger don't need to call #after_initialize directly anymore. It will be deprecated without replacement in " \ + "Rails 6.1." + ) + end + + def local_log_id + Fiber.current.__id__ + end + + def local_level + self.class.local_levels[local_log_id] + end + + def local_level=(level) + if level + self.class.local_levels[local_log_id] = level + else + self.class.local_levels.delete(local_log_id) + end + end + + def level + local_level || super + end + + def add(severity, message = nil, progname = nil, &block) # :nodoc: + return true if @logdev.nil? || (severity || UNKNOWN) < level + super + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/message_encryptor.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/message_encryptor.rb new file mode 100644 index 000000000000..00548cb38178 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/message_encryptor.rb @@ -0,0 +1,227 @@ +# frozen_string_literal: true + +require "openssl" +require "base64" +require "active_support/core_ext/array/extract_options" +require "active_support/core_ext/module/attribute_accessors" +require "active_support/message_verifier" +require "active_support/messages/metadata" + +module ActiveSupport + # MessageEncryptor is a simple way to encrypt values which get stored + # somewhere you don't trust. + # + # The cipher text and initialization vector are base64 encoded and returned + # to you. + # + # This can be used in situations similar to the MessageVerifier, but + # where you don't want users to be able to determine the value of the payload. + # + # len = ActiveSupport::MessageEncryptor.key_len + # salt = SecureRandom.random_bytes(len) + # key = ActiveSupport::KeyGenerator.new('password').generate_key(salt, len) # => "\x89\xE0\x156\xAC..." + # crypt = ActiveSupport::MessageEncryptor.new(key) # => # + # encrypted_data = crypt.encrypt_and_sign('my secret data') # => "NlFBTTMwOUV5UlA1QlNEN2xkY2d6eThYWWh..." + # crypt.decrypt_and_verify(encrypted_data) # => "my secret data" + # + # === Confining messages to a specific purpose + # + # By default any message can be used throughout your app. But they can also be + # confined to a specific +:purpose+. + # + # token = crypt.encrypt_and_sign("this is the chair", purpose: :login) + # + # Then that same purpose must be passed when verifying to get the data back out: + # + # crypt.decrypt_and_verify(token, purpose: :login) # => "this is the chair" + # crypt.decrypt_and_verify(token, purpose: :shipping) # => nil + # crypt.decrypt_and_verify(token) # => nil + # + # Likewise, if a message has no purpose it won't be returned when verifying with + # a specific purpose. + # + # token = crypt.encrypt_and_sign("the conversation is lively") + # crypt.decrypt_and_verify(token, purpose: :scare_tactics) # => nil + # crypt.decrypt_and_verify(token) # => "the conversation is lively" + # + # === Making messages expire + # + # By default messages last forever and verifying one year from now will still + # return the original value. But messages can be set to expire at a given + # time with +:expires_in+ or +:expires_at+. + # + # crypt.encrypt_and_sign(parcel, expires_in: 1.month) + # crypt.encrypt_and_sign(doowad, expires_at: Time.now.end_of_year) + # + # Then the messages can be verified and returned up to the expire time. + # Thereafter, verifying returns +nil+. + # + # === Rotating keys + # + # MessageEncryptor also supports rotating out old configurations by falling + # back to a stack of encryptors. Call +rotate+ to build and add an encryptor + # so +decrypt_and_verify+ will also try the fallback. + # + # By default any rotated encryptors use the values of the primary + # encryptor unless specified otherwise. + # + # You'd give your encryptor the new defaults: + # + # crypt = ActiveSupport::MessageEncryptor.new(@secret, cipher: "aes-256-gcm") + # + # Then gradually rotate the old values out by adding them as fallbacks. Any message + # generated with the old values will then work until the rotation is removed. + # + # crypt.rotate old_secret # Fallback to an old secret instead of @secret. + # crypt.rotate cipher: "aes-256-cbc" # Fallback to an old cipher instead of aes-256-gcm. + # + # Though if both the secret and the cipher was changed at the same time, + # the above should be combined into: + # + # crypt.rotate old_secret, cipher: "aes-256-cbc" + class MessageEncryptor + prepend Messages::Rotator::Encryptor + + cattr_accessor :use_authenticated_message_encryption, instance_accessor: false, default: false + + class << self + def default_cipher #:nodoc: + if use_authenticated_message_encryption + "aes-256-gcm" + else + "aes-256-cbc" + end + end + end + + module NullSerializer #:nodoc: + def self.load(value) + value + end + + def self.dump(value) + value + end + end + + module NullVerifier #:nodoc: + def self.verify(value) + value + end + + def self.generate(value) + value + end + end + + class InvalidMessage < StandardError; end + OpenSSLCipherError = OpenSSL::Cipher::CipherError + + # Initialize a new MessageEncryptor. +secret+ must be at least as long as + # the cipher key size. For the default 'aes-256-gcm' cipher, this is 256 + # bits. If you are using a user-entered secret, you can generate a suitable + # key by using ActiveSupport::KeyGenerator or a similar key + # derivation function. + # + # First additional parameter is used as the signature key for +MessageVerifier+. + # This allows you to specify keys to encrypt and sign data. + # + # ActiveSupport::MessageEncryptor.new('secret', 'signature_secret') + # + # Options: + # * :cipher - Cipher to use. Can be any cipher returned by + # OpenSSL::Cipher.ciphers. Default is 'aes-256-gcm'. + # * :digest - String of digest to use for signing. Default is + # +SHA1+. Ignored when using an AEAD cipher like 'aes-256-gcm'. + # * :serializer - Object serializer to use. Default is +Marshal+. + def initialize(secret, *signature_key_or_options) + options = signature_key_or_options.extract_options! + sign_secret = signature_key_or_options.first + @secret = secret + @sign_secret = sign_secret + @cipher = options[:cipher] || self.class.default_cipher + @digest = options[:digest] || "SHA1" unless aead_mode? + @verifier = resolve_verifier + @serializer = options[:serializer] || Marshal + end + + # Encrypt and sign a message. We need to sign the message in order to avoid + # padding attacks. Reference: https://www.limited-entropy.com/padding-oracle-attacks/. + def encrypt_and_sign(value, expires_at: nil, expires_in: nil, purpose: nil) + verifier.generate(_encrypt(value, expires_at: expires_at, expires_in: expires_in, purpose: purpose)) + end + + # Decrypt and verify a message. We need to verify the message in order to + # avoid padding attacks. Reference: https://www.limited-entropy.com/padding-oracle-attacks/. + def decrypt_and_verify(data, purpose: nil, **) + _decrypt(verifier.verify(data), purpose) + end + + # Given a cipher, returns the key length of the cipher to help generate the key of desired size + def self.key_len(cipher = default_cipher) + OpenSSL::Cipher.new(cipher).key_len + end + + private + def _encrypt(value, **metadata_options) + cipher = new_cipher + cipher.encrypt + cipher.key = @secret + + # Rely on OpenSSL for the initialization vector + iv = cipher.random_iv + cipher.auth_data = "" if aead_mode? + + encrypted_data = cipher.update(Messages::Metadata.wrap(@serializer.dump(value), **metadata_options)) + encrypted_data << cipher.final + + blob = "#{::Base64.strict_encode64 encrypted_data}--#{::Base64.strict_encode64 iv}" + blob = "#{blob}--#{::Base64.strict_encode64 cipher.auth_tag}" if aead_mode? + blob + end + + def _decrypt(encrypted_message, purpose) + cipher = new_cipher + encrypted_data, iv, auth_tag = encrypted_message.split("--").map { |v| ::Base64.strict_decode64(v) } + + # Currently the OpenSSL bindings do not raise an error if auth_tag is + # truncated, which would allow an attacker to easily forge it. See + # https://github.com/ruby/openssl/issues/63 + raise InvalidMessage if aead_mode? && (auth_tag.nil? || auth_tag.bytes.length != 16) + + cipher.decrypt + cipher.key = @secret + cipher.iv = iv + if aead_mode? + cipher.auth_tag = auth_tag + cipher.auth_data = "" + end + + decrypted_data = cipher.update(encrypted_data) + decrypted_data << cipher.final + + message = Messages::Metadata.verify(decrypted_data, purpose) + @serializer.load(message) if message + rescue OpenSSLCipherError, TypeError, ArgumentError + raise InvalidMessage + end + + def new_cipher + OpenSSL::Cipher.new(@cipher) + end + + attr_reader :verifier + + def aead_mode? + @aead_mode ||= new_cipher.authenticated? + end + + def resolve_verifier + if aead_mode? + NullVerifier + else + MessageVerifier.new(@sign_secret || @secret, digest: @digest, serializer: NullSerializer) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/message_verifier.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/message_verifier.rb new file mode 100644 index 000000000000..82865c779b0e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/message_verifier.rb @@ -0,0 +1,205 @@ +# frozen_string_literal: true + +require "base64" +require "active_support/core_ext/object/blank" +require "active_support/security_utils" +require "active_support/messages/metadata" +require "active_support/messages/rotator" + +module ActiveSupport + # +MessageVerifier+ makes it easy to generate and verify messages which are + # signed to prevent tampering. + # + # This is useful for cases like remember-me tokens and auto-unsubscribe links + # where the session store isn't suitable or available. + # + # Remember Me: + # cookies[:remember_me] = @verifier.generate([@user.id, 2.weeks.from_now]) + # + # In the authentication filter: + # + # id, time = @verifier.verify(cookies[:remember_me]) + # if Time.now < time + # self.current_user = User.find(id) + # end + # + # By default it uses Marshal to serialize the message. If you want to use + # another serialization method, you can set the serializer in the options + # hash upon initialization: + # + # @verifier = ActiveSupport::MessageVerifier.new('s3Krit', serializer: YAML) + # + # +MessageVerifier+ creates HMAC signatures using SHA1 hash algorithm by default. + # If you want to use a different hash algorithm, you can change it by providing + # +:digest+ key as an option while initializing the verifier: + # + # @verifier = ActiveSupport::MessageVerifier.new('s3Krit', digest: 'SHA256') + # + # === Confining messages to a specific purpose + # + # By default any message can be used throughout your app. But they can also be + # confined to a specific +:purpose+. + # + # token = @verifier.generate("this is the chair", purpose: :login) + # + # Then that same purpose must be passed when verifying to get the data back out: + # + # @verifier.verified(token, purpose: :login) # => "this is the chair" + # @verifier.verified(token, purpose: :shipping) # => nil + # @verifier.verified(token) # => nil + # + # @verifier.verify(token, purpose: :login) # => "this is the chair" + # @verifier.verify(token, purpose: :shipping) # => ActiveSupport::MessageVerifier::InvalidSignature + # @verifier.verify(token) # => ActiveSupport::MessageVerifier::InvalidSignature + # + # Likewise, if a message has no purpose it won't be returned when verifying with + # a specific purpose. + # + # token = @verifier.generate("the conversation is lively") + # @verifier.verified(token, purpose: :scare_tactics) # => nil + # @verifier.verified(token) # => "the conversation is lively" + # + # @verifier.verify(token, purpose: :scare_tactics) # => ActiveSupport::MessageVerifier::InvalidSignature + # @verifier.verify(token) # => "the conversation is lively" + # + # === Making messages expire + # + # By default messages last forever and verifying one year from now will still + # return the original value. But messages can be set to expire at a given + # time with +:expires_in+ or +:expires_at+. + # + # @verifier.generate(parcel, expires_in: 1.month) + # @verifier.generate(doowad, expires_at: Time.now.end_of_year) + # + # Then the messages can be verified and returned up to the expire time. + # Thereafter, the +verified+ method returns +nil+ while +verify+ raises + # ActiveSupport::MessageVerifier::InvalidSignature. + # + # === Rotating keys + # + # MessageVerifier also supports rotating out old configurations by falling + # back to a stack of verifiers. Call +rotate+ to build and add a verifier to + # so either +verified+ or +verify+ will also try verifying with the fallback. + # + # By default any rotated verifiers use the values of the primary + # verifier unless specified otherwise. + # + # You'd give your verifier the new defaults: + # + # verifier = ActiveSupport::MessageVerifier.new(@secret, digest: "SHA512", serializer: JSON) + # + # Then gradually rotate the old values out by adding them as fallbacks. Any message + # generated with the old values will then work until the rotation is removed. + # + # verifier.rotate old_secret # Fallback to an old secret instead of @secret. + # verifier.rotate digest: "SHA256" # Fallback to an old digest instead of SHA512. + # verifier.rotate serializer: Marshal # Fallback to an old serializer instead of JSON. + # + # Though the above would most likely be combined into one rotation: + # + # verifier.rotate old_secret, digest: "SHA256", serializer: Marshal + class MessageVerifier + prepend Messages::Rotator::Verifier + + class InvalidSignature < StandardError; end + + def initialize(secret, options = {}) + raise ArgumentError, "Secret should not be nil." unless secret + @secret = secret + @digest = options[:digest] || "SHA1" + @serializer = options[:serializer] || Marshal + end + + # Checks if a signed message could have been generated by signing an object + # with the +MessageVerifier+'s secret. + # + # verifier = ActiveSupport::MessageVerifier.new 's3Krit' + # signed_message = verifier.generate 'a private message' + # verifier.valid_message?(signed_message) # => true + # + # tampered_message = signed_message.chop # editing the message invalidates the signature + # verifier.valid_message?(tampered_message) # => false + def valid_message?(signed_message) + return if signed_message.nil? || !signed_message.valid_encoding? || signed_message.blank? + + data, digest = signed_message.split("--") + data.present? && digest.present? && ActiveSupport::SecurityUtils.secure_compare(digest, generate_digest(data)) + end + + # Decodes the signed message using the +MessageVerifier+'s secret. + # + # verifier = ActiveSupport::MessageVerifier.new 's3Krit' + # + # signed_message = verifier.generate 'a private message' + # verifier.verified(signed_message) # => 'a private message' + # + # Returns +nil+ if the message was not signed with the same secret. + # + # other_verifier = ActiveSupport::MessageVerifier.new 'd1ff3r3nt-s3Krit' + # other_verifier.verified(signed_message) # => nil + # + # Returns +nil+ if the message is not Base64-encoded. + # + # invalid_message = "f--46a0120593880c733a53b6dad75b42ddc1c8996d" + # verifier.verified(invalid_message) # => nil + # + # Raises any error raised while decoding the signed message. + # + # incompatible_message = "test--dad7b06c94abba8d46a15fafaef56c327665d5ff" + # verifier.verified(incompatible_message) # => TypeError: incompatible marshal file format + def verified(signed_message, purpose: nil, **) + if valid_message?(signed_message) + begin + data = signed_message.split("--")[0] + message = Messages::Metadata.verify(decode(data), purpose) + @serializer.load(message) if message + rescue ArgumentError => argument_error + return if argument_error.message.include?("invalid base64") + raise + end + end + end + + # Decodes the signed message using the +MessageVerifier+'s secret. + # + # verifier = ActiveSupport::MessageVerifier.new 's3Krit' + # signed_message = verifier.generate 'a private message' + # + # verifier.verify(signed_message) # => 'a private message' + # + # Raises +InvalidSignature+ if the message was not signed with the same + # secret or was not Base64-encoded. + # + # other_verifier = ActiveSupport::MessageVerifier.new 'd1ff3r3nt-s3Krit' + # other_verifier.verify(signed_message) # => ActiveSupport::MessageVerifier::InvalidSignature + def verify(*args, **options) + verified(*args, **options) || raise(InvalidSignature) + end + + # Generates a signed message for the provided value. + # + # The message is signed with the +MessageVerifier+'s secret. Without knowing + # the secret, the original value cannot be extracted from the message. + # + # verifier = ActiveSupport::MessageVerifier.new 's3Krit' + # verifier.generate 'a private message' # => "BAhJIhRwcml2YXRlLW1lc3NhZ2UGOgZFVA==--e2d724331ebdee96a10fb99b089508d1c72bd772" + def generate(value, expires_at: nil, expires_in: nil, purpose: nil) + data = encode(Messages::Metadata.wrap(@serializer.dump(value), expires_at: expires_at, expires_in: expires_in, purpose: purpose)) + "#{data}--#{generate_digest(data)}" + end + + private + def encode(data) + ::Base64.strict_encode64(data) + end + + def decode(data) + ::Base64.strict_decode64(data) + end + + def generate_digest(data) + require "openssl" unless defined?(OpenSSL) + OpenSSL::HMAC.hexdigest(OpenSSL::Digest.const_get(@digest).new, @secret, data) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/messages/metadata.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/messages/metadata.rb new file mode 100644 index 000000000000..e3be0b65e67a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/messages/metadata.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require "time" + +module ActiveSupport + module Messages #:nodoc: + class Metadata #:nodoc: + def initialize(message, expires_at = nil, purpose = nil) + @message, @purpose = message, purpose + @expires_at = expires_at.is_a?(String) ? Time.iso8601(expires_at) : expires_at + end + + def as_json(options = {}) + { _rails: { message: @message, exp: @expires_at, pur: @purpose } } + end + + class << self + def wrap(message, expires_at: nil, expires_in: nil, purpose: nil) + if expires_at || expires_in || purpose + JSON.encode new(encode(message), pick_expiry(expires_at, expires_in), purpose) + else + message + end + end + + def verify(message, purpose) + extract_metadata(message).verify(purpose) + end + + private + def pick_expiry(expires_at, expires_in) + if expires_at + expires_at.utc.iso8601(3) + elsif expires_in + Time.now.utc.advance(seconds: expires_in).iso8601(3) + end + end + + def extract_metadata(message) + data = JSON.decode(message) rescue nil + + if data.is_a?(Hash) && data.key?("_rails") + new(decode(data["_rails"]["message"]), data["_rails"]["exp"], data["_rails"]["pur"]) + else + new(message) + end + end + + def encode(message) + ::Base64.strict_encode64(message) + end + + def decode(message) + ::Base64.strict_decode64(message) + end + end + + def verify(purpose) + @message if match?(purpose) && fresh? + end + + private + def match?(purpose) + @purpose.to_s == purpose.to_s + end + + def fresh? + @expires_at.nil? || Time.now.utc < @expires_at + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/messages/rotation_configuration.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/messages/rotation_configuration.rb new file mode 100644 index 000000000000..bd50d6d348f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/messages/rotation_configuration.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module ActiveSupport + module Messages + class RotationConfiguration # :nodoc: + attr_reader :signed, :encrypted + + def initialize + @signed, @encrypted = [], [] + end + + def rotate(kind, *args) + case kind + when :signed + @signed << args + when :encrypted + @encrypted << args + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/messages/rotator.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/messages/rotator.rb new file mode 100644 index 000000000000..5a9078157c42 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/messages/rotator.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module ActiveSupport + module Messages + module Rotator # :nodoc: + def initialize(*, **options) + super + + @options = options + @rotations = [] + end + + def rotate(*secrets, **options) + @rotations << build_rotation(*secrets, @options.merge(options)) + end + + module Encryptor + include Rotator + + def decrypt_and_verify(*args, on_rotation: nil, **options) + super + rescue MessageEncryptor::InvalidMessage, MessageVerifier::InvalidSignature + run_rotations(on_rotation) { |encryptor| encryptor.decrypt_and_verify(*args, **options) } || raise + end + + private + def build_rotation(secret = @secret, sign_secret = @sign_secret, options) + self.class.new(secret, sign_secret, **options) + end + end + + module Verifier + include Rotator + + def verified(*args, on_rotation: nil, **options) + super || run_rotations(on_rotation) { |verifier| verifier.verified(*args, **options) } + end + + private + def build_rotation(secret = @secret, options) + self.class.new(secret, **options) + end + end + + private + def run_rotations(on_rotation) + @rotations.find do |rotation| + if message = yield(rotation) rescue next + on_rotation.call if on_rotation + return message + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/multibyte.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/multibyte.rb new file mode 100644 index 000000000000..3fe3a05e93e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/multibyte.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module ActiveSupport #:nodoc: + module Multibyte + autoload :Chars, "active_support/multibyte/chars" + autoload :Unicode, "active_support/multibyte/unicode" + + # The proxy class returned when calling mb_chars. You can use this accessor + # to configure your own proxy class so you can support other encodings. See + # the ActiveSupport::Multibyte::Chars implementation for an example how to + # do this. + # + # ActiveSupport::Multibyte.proxy_class = CharsForUTF32 + def self.proxy_class=(klass) + @proxy_class = klass + end + + # Returns the current proxy class. + def self.proxy_class + @proxy_class ||= ActiveSupport::Multibyte::Chars + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/multibyte/chars.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/multibyte/chars.rb new file mode 100644 index 000000000000..6f21f8b9030b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/multibyte/chars.rb @@ -0,0 +1,215 @@ +# frozen_string_literal: true + +require "active_support/json" +require "active_support/core_ext/string/access" +require "active_support/core_ext/string/behavior" +require "active_support/core_ext/module/delegation" + +module ActiveSupport #:nodoc: + module Multibyte #:nodoc: + # Chars enables you to work transparently with UTF-8 encoding in the Ruby + # String class without having extensive knowledge about the encoding. A + # Chars object accepts a string upon initialization and proxies String + # methods in an encoding safe manner. All the normal String methods are also + # implemented on the proxy. + # + # String methods are proxied through the Chars object, and can be accessed + # through the +mb_chars+ method. Methods which would normally return a + # String object now return a Chars object so methods can be chained. + # + # 'The Perfect String '.mb_chars.downcase.strip + # # => # + # + # Chars objects are perfectly interchangeable with String objects as long as + # no explicit class checks are made. If certain methods do explicitly check + # the class, call +to_s+ before you pass chars objects to them. + # + # bad.explicit_checking_method 'T'.mb_chars.downcase.to_s + # + # The default Chars implementation assumes that the encoding of the string + # is UTF-8, if you want to handle different encodings you can write your own + # multibyte string handler and configure it through + # ActiveSupport::Multibyte.proxy_class. + # + # class CharsForUTF32 + # def size + # @wrapped_string.size / 4 + # end + # + # def self.accepts?(string) + # string.length % 4 == 0 + # end + # end + # + # ActiveSupport::Multibyte.proxy_class = CharsForUTF32 + class Chars + include Comparable + attr_reader :wrapped_string + alias to_s wrapped_string + alias to_str wrapped_string + + delegate :<=>, :=~, :acts_like_string?, to: :wrapped_string + + # Creates a new Chars instance by wrapping _string_. + def initialize(string) + @wrapped_string = string + @wrapped_string.force_encoding(Encoding::UTF_8) unless @wrapped_string.frozen? + end + + # Forward all undefined methods to the wrapped string. + def method_missing(method, *args, &block) + result = @wrapped_string.__send__(method, *args, &block) + if /!$/.match?(method) + self if result + else + result.kind_of?(String) ? chars(result) : result + end + end + + # Returns +true+ if _obj_ responds to the given method. Private methods + # are included in the search only if the optional second parameter + # evaluates to +true+. + def respond_to_missing?(method, include_private) + @wrapped_string.respond_to?(method, include_private) + end + + # Returns +true+ when the proxy class can handle the string. Returns + # +false+ otherwise. + def self.consumes?(string) + ActiveSupport::Deprecation.warn(<<-MSG.squish) + ActiveSupport::Multibyte::Chars.consumes? is deprecated and will be + removed from Rails 6.1. Use string.is_utf8? instead. + MSG + + string.encoding == Encoding::UTF_8 + end + + # Works just like String#split, with the exception that the items + # in the resulting list are Chars instances instead of String. This makes + # chaining methods easier. + # + # 'Café périferôl'.mb_chars.split(/é/).map { |part| part.upcase.to_s } # => ["CAF", " P", "RIFERÔL"] + def split(*args) + @wrapped_string.split(*args).map { |i| self.class.new(i) } + end + + # Works like String#slice!, but returns an instance of + # Chars, or +nil+ if the string was not modified. The string will not be + # modified if the range given is out of bounds + # + # string = 'Welcome' + # string.mb_chars.slice!(3) # => # + # string # => 'Welome' + # string.mb_chars.slice!(0..3) # => # + # string # => 'me' + def slice!(*args) + string_sliced = @wrapped_string.slice!(*args) + if string_sliced + chars(string_sliced) + end + end + + # Reverses all characters in the string. + # + # 'Café'.mb_chars.reverse.to_s # => 'éfaC' + def reverse + chars(@wrapped_string.scan(/\X/).reverse.join) + end + + # Limits the byte size of the string to a number of bytes without breaking + # characters. Usable when the storage for a string is limited for some + # reason. + # + # 'こんにちは'.mb_chars.limit(7).to_s # => "こん" + def limit(limit) + chars(@wrapped_string.truncate_bytes(limit, omission: nil)) + end + + # Capitalizes the first letter of every word, when possible. + # + # "ÉL QUE SE ENTERÓ".mb_chars.titleize.to_s # => "Él Que Se Enteró" + # "日本語".mb_chars.titleize.to_s # => "日本語" + def titleize + chars(downcase.to_s.gsub(/\b('?\S)/u) { $1.upcase }) + end + alias_method :titlecase, :titleize + + # Returns the KC normalization of the string by default. NFKC is + # considered the best normalization form for passing strings to databases + # and validations. + # + # * form - The form you want to normalize in. Should be one of the following: + # :c, :kc, :d, or :kd. Default is + # ActiveSupport::Multibyte::Unicode.default_normalization_form + def normalize(form = nil) + form ||= Unicode.default_normalization_form + + # See https://www.unicode.org/reports/tr15, Table 1 + if alias_form = Unicode::NORMALIZATION_FORM_ALIASES[form] + ActiveSupport::Deprecation.warn(<<-MSG.squish) + ActiveSupport::Multibyte::Chars#normalize is deprecated and will be + removed from Rails 6.1. Use #unicode_normalize(:#{alias_form}) instead. + MSG + + send(:unicode_normalize, alias_form) + else + ActiveSupport::Deprecation.warn(<<-MSG.squish) + ActiveSupport::Multibyte::Chars#normalize is deprecated and will be + removed from Rails 6.1. Use #unicode_normalize instead. + MSG + + raise ArgumentError, "#{form} is not a valid normalization variant", caller + end + end + + # Performs canonical decomposition on all the characters. + # + # 'é'.length # => 2 + # 'é'.mb_chars.decompose.to_s.length # => 3 + def decompose + chars(Unicode.decompose(:canonical, @wrapped_string.codepoints.to_a).pack("U*")) + end + + # Performs composition on all the characters. + # + # 'é'.length # => 3 + # 'é'.mb_chars.compose.to_s.length # => 2 + def compose + chars(Unicode.compose(@wrapped_string.codepoints.to_a).pack("U*")) + end + + # Returns the number of grapheme clusters in the string. + # + # 'क्षि'.mb_chars.length # => 4 + # 'क्षि'.mb_chars.grapheme_length # => 3 + def grapheme_length + @wrapped_string.scan(/\X/).length + end + + # Replaces all ISO-8859-1 or CP1252 characters by their UTF-8 equivalent + # resulting in a valid UTF-8 string. + # + # Passing +true+ will forcibly tidy all bytes, assuming that the string's + # encoding is entirely CP1252 or ISO-8859-1. + def tidy_bytes(force = false) + chars(Unicode.tidy_bytes(@wrapped_string, force)) + end + + def as_json(options = nil) #:nodoc: + to_s.as_json(options) + end + + %w(reverse tidy_bytes).each do |method| + define_method("#{method}!") do |*args| + @wrapped_string = send(method, *args).to_s + self + end + end + + private + def chars(string) + self.class.new(string) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/multibyte/unicode.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/multibyte/unicode.rb new file mode 100644 index 000000000000..39561370492b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/multibyte/unicode.rb @@ -0,0 +1,156 @@ +# frozen_string_literal: true + +module ActiveSupport + module Multibyte + module Unicode + extend self + + # A list of all available normalization forms. + # See https://www.unicode.org/reports/tr15/tr15-29.html for more + # information about normalization. + NORMALIZATION_FORMS = [:c, :kc, :d, :kd] + + NORMALIZATION_FORM_ALIASES = { # :nodoc: + c: :nfc, + d: :nfd, + kc: :nfkc, + kd: :nfkd + } + + # The Unicode version that is supported by the implementation + UNICODE_VERSION = RbConfig::CONFIG["UNICODE_VERSION"] + + # The default normalization used for operations that require + # normalization. It can be set to any of the normalizations + # in NORMALIZATION_FORMS. + # + # ActiveSupport::Multibyte::Unicode.default_normalization_form = :c + attr_accessor :default_normalization_form + @default_normalization_form = :kc + + # Unpack the string at grapheme boundaries. Returns a list of character + # lists. + # + # Unicode.unpack_graphemes('क्षि') # => [[2325, 2381], [2359], [2367]] + # Unicode.unpack_graphemes('Café') # => [[67], [97], [102], [233]] + def unpack_graphemes(string) + ActiveSupport::Deprecation.warn(<<-MSG.squish) + ActiveSupport::Multibyte::Unicode#unpack_graphemes is deprecated and will be + removed from Rails 6.1. Use string.scan(/\X/).map(&:codepoints) instead. + MSG + + string.scan(/\X/).map(&:codepoints) + end + + # Reverse operation of unpack_graphemes. + # + # Unicode.pack_graphemes(Unicode.unpack_graphemes('क्षि')) # => 'क्षि' + def pack_graphemes(unpacked) + ActiveSupport::Deprecation.warn(<<-MSG.squish) + ActiveSupport::Multibyte::Unicode#pack_graphemes is deprecated and will be + removed from Rails 6.1. Use array.flatten.pack("U*") instead. + MSG + + unpacked.flatten.pack("U*") + end + + # Decompose composed characters to the decomposed form. + def decompose(type, codepoints) + if type == :compatibility + codepoints.pack("U*").unicode_normalize(:nfkd).codepoints + else + codepoints.pack("U*").unicode_normalize(:nfd).codepoints + end + end + + # Compose decomposed characters to the composed form. + def compose(codepoints) + codepoints.pack("U*").unicode_normalize(:nfc).codepoints + end + + # Rubinius' String#scrub, however, doesn't support ASCII-incompatible chars. + if !defined?(Rubinius) + # Replaces all ISO-8859-1 or CP1252 characters by their UTF-8 equivalent + # resulting in a valid UTF-8 string. + # + # Passing +true+ will forcibly tidy all bytes, assuming that the string's + # encoding is entirely CP1252 or ISO-8859-1. + def tidy_bytes(string, force = false) + return string if string.empty? + return recode_windows1252_chars(string) if force + string.scrub { |bad| recode_windows1252_chars(bad) } + end + else + def tidy_bytes(string, force = false) + return string if string.empty? + return recode_windows1252_chars(string) if force + + # We can't transcode to the same format, so we choose a nearly-identical encoding. + # We're going to 'transcode' bytes from UTF-8 when possible, then fall back to + # CP1252 when we get errors. The final string will be 'converted' back to UTF-8 + # before returning. + reader = Encoding::Converter.new(Encoding::UTF_8, Encoding::UTF_16LE) + + source = string.dup + out = "".force_encoding(Encoding::UTF_16LE) + + loop do + reader.primitive_convert(source, out) + _, _, _, error_bytes, _ = reader.primitive_errinfo + break if error_bytes.nil? + out << error_bytes.encode(Encoding::UTF_16LE, Encoding::Windows_1252, invalid: :replace, undef: :replace) + end + + reader.finish + + out.encode!(Encoding::UTF_8) + end + end + + # Returns the KC normalization of the string by default. NFKC is + # considered the best normalization form for passing strings to databases + # and validations. + # + # * string - The string to perform normalization on. + # * form - The form you want to normalize in. Should be one of + # the following: :c, :kc, :d, or :kd. + # Default is ActiveSupport::Multibyte::Unicode.default_normalization_form. + def normalize(string, form = nil) + form ||= @default_normalization_form + + # See https://www.unicode.org/reports/tr15, Table 1 + if alias_form = NORMALIZATION_FORM_ALIASES[form] + ActiveSupport::Deprecation.warn(<<-MSG.squish) + ActiveSupport::Multibyte::Unicode#normalize is deprecated and will be + removed from Rails 6.1. Use String#unicode_normalize(:#{alias_form}) instead. + MSG + + string.unicode_normalize(alias_form) + else + ActiveSupport::Deprecation.warn(<<-MSG.squish) + ActiveSupport::Multibyte::Unicode#normalize is deprecated and will be + removed from Rails 6.1. Use String#unicode_normalize instead. + MSG + + raise ArgumentError, "#{form} is not a valid normalization variant", caller + end + end + + %w(downcase upcase swapcase).each do |method| + define_method(method) do |string| + ActiveSupport::Deprecation.warn(<<-MSG.squish) + ActiveSupport::Multibyte::Unicode##{method} is deprecated and + will be removed from Rails 6.1. Use String methods directly. + MSG + + string.send(method) + end + end + + private + def recode_windows1252_chars(string) + string.encode(Encoding::UTF_8, Encoding::Windows_1252, invalid: :replace, undef: :replace) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/notifications.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/notifications.rb new file mode 100644 index 000000000000..d9e93b530c94 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/notifications.rb @@ -0,0 +1,253 @@ +# frozen_string_literal: true + +require "active_support/notifications/instrumenter" +require "active_support/notifications/fanout" +require "active_support/per_thread_registry" + +module ActiveSupport + # = Notifications + # + # ActiveSupport::Notifications provides an instrumentation API for + # Ruby. + # + # == Instrumenters + # + # To instrument an event you just need to do: + # + # ActiveSupport::Notifications.instrument('render', extra: :information) do + # render plain: 'Foo' + # end + # + # That first executes the block and then notifies all subscribers once done. + # + # In the example above +render+ is the name of the event, and the rest is called + # the _payload_. The payload is a mechanism that allows instrumenters to pass + # extra information to subscribers. Payloads consist of a hash whose contents + # are arbitrary and generally depend on the event. + # + # == Subscribers + # + # You can consume those events and the information they provide by registering + # a subscriber. + # + # ActiveSupport::Notifications.subscribe('render') do |name, start, finish, id, payload| + # name # => String, name of the event (such as 'render' from above) + # start # => Time, when the instrumented block started execution + # finish # => Time, when the instrumented block ended execution + # id # => String, unique ID for the instrumenter that fired the event + # payload # => Hash, the payload + # end + # + # For instance, let's store all "render" events in an array: + # + # events = [] + # + # ActiveSupport::Notifications.subscribe('render') do |*args| + # events << ActiveSupport::Notifications::Event.new(*args) + # end + # + # That code returns right away, you are just subscribing to "render" events. + # The block is saved and will be called whenever someone instruments "render": + # + # ActiveSupport::Notifications.instrument('render', extra: :information) do + # render plain: 'Foo' + # end + # + # event = events.first + # event.name # => "render" + # event.duration # => 10 (in milliseconds) + # event.payload # => { extra: :information } + # + # The block in the subscribe call gets the name of the event, start + # timestamp, end timestamp, a string with a unique identifier for that event's instrumenter + # (something like "535801666f04d0298cd6"), and a hash with the payload, in + # that order. + # + # If an exception happens during that particular instrumentation the payload will + # have a key :exception with an array of two elements as value: a string with + # the name of the exception class, and the exception message. + # The :exception_object key of the payload will have the exception + # itself as the value: + # + # event.payload[:exception] # => ["ArgumentError", "Invalid value"] + # event.payload[:exception_object] # => # + # + # As the earlier example depicts, the class ActiveSupport::Notifications::Event + # is able to take the arguments as they come and provide an object-oriented + # interface to that data. + # + # It is also possible to pass an object which responds to call method + # as the second parameter to the subscribe method instead of a block: + # + # module ActionController + # class PageRequest + # def call(name, started, finished, unique_id, payload) + # Rails.logger.debug ['notification:', name, started, finished, unique_id, payload].join(' ') + # end + # end + # end + # + # ActiveSupport::Notifications.subscribe('process_action.action_controller', ActionController::PageRequest.new) + # + # resulting in the following output within the logs including a hash with the payload: + # + # notification: process_action.action_controller 2012-04-13 01:08:35 +0300 2012-04-13 01:08:35 +0300 af358ed7fab884532ec7 { + # controller: "Devise::SessionsController", + # action: "new", + # params: {"action"=>"new", "controller"=>"devise/sessions"}, + # format: :html, + # method: "GET", + # path: "/login/sign_in", + # status: 200, + # view_runtime: 279.3080806732178, + # db_runtime: 40.053 + # } + # + # You can also subscribe to all events whose name matches a certain regexp: + # + # ActiveSupport::Notifications.subscribe(/render/) do |*args| + # ... + # end + # + # and even pass no argument to subscribe, in which case you are subscribing + # to all events. + # + # == Temporary Subscriptions + # + # Sometimes you do not want to subscribe to an event for the entire life of + # the application. There are two ways to unsubscribe. + # + # WARNING: The instrumentation framework is designed for long-running subscribers, + # use this feature sparingly because it wipes some internal caches and that has + # a negative impact on performance. + # + # === Subscribe While a Block Runs + # + # You can subscribe to some event temporarily while some block runs. For + # example, in + # + # callback = lambda {|*args| ... } + # ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do + # ... + # end + # + # the callback will be called for all "sql.active_record" events instrumented + # during the execution of the block. The callback is unsubscribed automatically + # after that. + # + # === Manual Unsubscription + # + # The +subscribe+ method returns a subscriber object: + # + # subscriber = ActiveSupport::Notifications.subscribe("render") do |*args| + # ... + # end + # + # To prevent that block from being called anymore, just unsubscribe passing + # that reference: + # + # ActiveSupport::Notifications.unsubscribe(subscriber) + # + # You can also unsubscribe by passing the name of the subscriber object. Note + # that this will unsubscribe all subscriptions with the given name: + # + # ActiveSupport::Notifications.unsubscribe("render") + # + # Subscribers using a regexp or other pattern-matching object will remain subscribed + # to all events that match their original pattern, unless those events match a string + # passed to `unsubscribe`: + # + # subscriber = ActiveSupport::Notifications.subscribe(/render/) { } + # ActiveSupport::Notifications.unsubscribe('render_template.action_view') + # subscriber.matches?('render_template.action_view') # => false + # subscriber.matches?('render_partial.action_view') # => true + # + # == Default Queue + # + # Notifications ships with a queue implementation that consumes and publishes events + # to all log subscribers. You can use any queue implementation you want. + # + module Notifications + class << self + attr_accessor :notifier + + def publish(name, *args) + notifier.publish(name, *args) + end + + def instrument(name, payload = {}) + if notifier.listening?(name) + instrumenter.instrument(name, payload) { yield payload if block_given? } + else + yield payload if block_given? + end + end + + # Subscribe to a given event name with the passed +block+. + # + # You can subscribe to events by passing a String to match exact event + # names, or by passing a Regexp to match all events that match a pattern. + # + # ActiveSupport::Notifications.subscribe(/render/) do |*args| + # @event = ActiveSupport::Notifications::Event.new(*args) + # end + # + # The +block+ will receive five parameters with information about the event: + # + # ActiveSupport::Notifications.subscribe('render') do |name, start, finish, id, payload| + # name # => String, name of the event (such as 'render' from above) + # start # => Time, when the instrumented block started execution + # finish # => Time, when the instrumented block ended execution + # id # => String, unique ID for the instrumenter that fired the event + # payload # => Hash, the payload + # end + # + # If the block passed to the method only takes one parameter, + # it will yield an event object to the block: + # + # ActiveSupport::Notifications.subscribe(/render/) do |event| + # @event = event + # end + def subscribe(*args, &block) + notifier.subscribe(*args, &block) + end + + def subscribed(callback, *args, &block) + subscriber = subscribe(*args, &callback) + yield + ensure + unsubscribe(subscriber) + end + + def unsubscribe(subscriber_or_name) + notifier.unsubscribe(subscriber_or_name) + end + + def instrumenter + InstrumentationRegistry.instance.instrumenter_for(notifier) + end + end + + # This class is a registry which holds all of the +Instrumenter+ objects + # in a particular thread local. To access the +Instrumenter+ object for a + # particular +notifier+, you can call the following method: + # + # InstrumentationRegistry.instrumenter_for(notifier) + # + # The instrumenters for multiple notifiers are held in a single instance of + # this class. + class InstrumentationRegistry # :nodoc: + extend ActiveSupport::PerThreadRegistry + + def initialize + @registry = {} + end + + def instrumenter_for(notifier) + @registry[notifier] ||= Instrumenter.new(notifier) + end + end + + self.notifier = Fanout.new + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/notifications/fanout.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/notifications/fanout.rb new file mode 100644 index 000000000000..c506b35b1e95 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/notifications/fanout.rb @@ -0,0 +1,244 @@ +# frozen_string_literal: true + +require "mutex_m" +require "concurrent/map" +require "set" + +module ActiveSupport + module Notifications + # This is a default queue implementation that ships with Notifications. + # It just pushes events to all registered log subscribers. + # + # This class is thread safe. All methods are reentrant. + class Fanout + include Mutex_m + + def initialize + @string_subscribers = Hash.new { |h, k| h[k] = [] } + @other_subscribers = [] + @listeners_for = Concurrent::Map.new + super + end + + def subscribe(pattern = nil, callable = nil, &block) + subscriber = Subscribers.new(pattern, callable || block) + synchronize do + if String === pattern + @string_subscribers[pattern] << subscriber + @listeners_for.delete(pattern) + else + @other_subscribers << subscriber + @listeners_for.clear + end + end + subscriber + end + + def unsubscribe(subscriber_or_name) + synchronize do + case subscriber_or_name + when String + @string_subscribers[subscriber_or_name].clear + @listeners_for.delete(subscriber_or_name) + @other_subscribers.each { |sub| sub.unsubscribe!(subscriber_or_name) } + else + pattern = subscriber_or_name.try(:pattern) + if String === pattern + @string_subscribers[pattern].delete(subscriber_or_name) + @listeners_for.delete(pattern) + else + @other_subscribers.delete(subscriber_or_name) + @listeners_for.clear + end + end + end + end + + def start(name, id, payload) + listeners_for(name).each { |s| s.start(name, id, payload) } + end + + def finish(name, id, payload, listeners = listeners_for(name)) + listeners.each { |s| s.finish(name, id, payload) } + end + + def publish(name, *args) + listeners_for(name).each { |s| s.publish(name, *args) } + end + + def listeners_for(name) + # this is correctly done double-checked locking (Concurrent::Map's lookups have volatile semantics) + @listeners_for[name] || synchronize do + # use synchronisation when accessing @subscribers + @listeners_for[name] ||= + @string_subscribers[name] + @other_subscribers.select { |s| s.subscribed_to?(name) } + end + end + + def listening?(name) + listeners_for(name).any? + end + + # This is a sync queue, so there is no waiting. + def wait + end + + module Subscribers # :nodoc: + def self.new(pattern, listener) + subscriber_class = Timed + + if listener.respond_to?(:start) && listener.respond_to?(:finish) + subscriber_class = Evented + else + # Doing all this to detect a block like `proc { |x| }` vs + # `proc { |*x| }` or `proc { |**x| }` + if listener.respond_to?(:parameters) + params = listener.parameters + if params.length == 1 && params.first.first == :opt + subscriber_class = EventObject + end + end + end + + wrap_all pattern, subscriber_class.new(pattern, listener) + end + + def self.event_object_subscriber(pattern, block) + wrap_all pattern, EventObject.new(pattern, block) + end + + def self.wrap_all(pattern, subscriber) + unless pattern + AllMessages.new(subscriber) + else + subscriber + end + end + + class Matcher #:nodoc: + attr_reader :pattern, :exclusions + + def self.wrap(pattern) + return pattern if String === pattern + new(pattern) + end + + def initialize(pattern) + @pattern = pattern + @exclusions = Set.new + end + + def unsubscribe!(name) + exclusions << -name if pattern === name + end + + def ===(name) + pattern === name && !exclusions.include?(name) + end + end + + class Evented #:nodoc: + attr_reader :pattern + + def initialize(pattern, delegate) + @pattern = Matcher.wrap(pattern) + @delegate = delegate + @can_publish = delegate.respond_to?(:publish) + end + + def publish(name, *args) + if @can_publish + @delegate.publish name, *args + end + end + + def start(name, id, payload) + @delegate.start name, id, payload + end + + def finish(name, id, payload) + @delegate.finish name, id, payload + end + + def subscribed_to?(name) + pattern === name + end + + def matches?(name) + pattern && pattern === name + end + + def unsubscribe!(name) + pattern.unsubscribe!(name) + end + end + + class Timed < Evented # :nodoc: + def publish(name, *args) + @delegate.call name, *args + end + + def start(name, id, payload) + timestack = Thread.current[:_timestack] ||= [] + timestack.push Time.now + end + + def finish(name, id, payload) + timestack = Thread.current[:_timestack] + started = timestack.pop + @delegate.call(name, started, Time.now, id, payload) + end + end + + class EventObject < Evented + def start(name, id, payload) + stack = Thread.current[:_event_stack] ||= [] + event = build_event name, id, payload + event.start! + stack.push event + end + + def finish(name, id, payload) + stack = Thread.current[:_event_stack] + event = stack.pop + event.finish! + @delegate.call event + end + + private + def build_event(name, id, payload) + ActiveSupport::Notifications::Event.new name, nil, nil, id, payload + end + end + + class AllMessages # :nodoc: + def initialize(delegate) + @delegate = delegate + end + + def start(name, id, payload) + @delegate.start name, id, payload + end + + def finish(name, id, payload) + @delegate.finish name, id, payload + end + + def publish(name, *args) + @delegate.publish name, *args + end + + def subscribed_to?(name) + true + end + + def unsubscribe!(*) + false + end + + alias :matches? :=== + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/notifications/instrumenter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/notifications/instrumenter.rb new file mode 100644 index 000000000000..927c382e5d45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/notifications/instrumenter.rb @@ -0,0 +1,164 @@ +# frozen_string_literal: true + +require "securerandom" + +module ActiveSupport + module Notifications + # Instrumenters are stored in a thread local. + class Instrumenter + attr_reader :id + + def initialize(notifier) + @id = unique_id + @notifier = notifier + end + + # Given a block, instrument it by measuring the time taken to execute + # and publish it. Without a block, simply send a message via the + # notifier. Notice that events get sent even if an error occurs in the + # passed-in block. + def instrument(name, payload = {}) + # some of the listeners might have state + listeners_state = start name, payload + begin + yield payload if block_given? + rescue Exception => e + payload[:exception] = [e.class.name, e.message] + payload[:exception_object] = e + raise e + ensure + finish_with_state listeners_state, name, payload + end + end + + # Send a start notification with +name+ and +payload+. + def start(name, payload) + @notifier.start name, @id, payload + end + + # Send a finish notification with +name+ and +payload+. + def finish(name, payload) + @notifier.finish name, @id, payload + end + + def finish_with_state(listeners_state, name, payload) + @notifier.finish name, @id, payload, listeners_state + end + + private + def unique_id + SecureRandom.hex(10) + end + end + + class Event + attr_reader :name, :time, :end, :transaction_id, :payload, :children + + def self.clock_gettime_supported? # :nodoc: + defined?(Process::CLOCK_THREAD_CPUTIME_ID) && + !Gem.win_platform? && + !RUBY_PLATFORM.match?(/solaris/i) + end + private_class_method :clock_gettime_supported? + + def initialize(name, start, ending, transaction_id, payload) + @name = name + @payload = payload.dup + @time = start + @transaction_id = transaction_id + @end = ending + @children = [] + @cpu_time_start = 0 + @cpu_time_finish = 0 + @allocation_count_start = 0 + @allocation_count_finish = 0 + end + + # Record information at the time this event starts + def start! + @time = now + @cpu_time_start = now_cpu + @allocation_count_start = now_allocations + end + + # Record information at the time this event finishes + def finish! + @cpu_time_finish = now_cpu + @end = now + @allocation_count_finish = now_allocations + end + + def end=(ending) + ActiveSupport::Deprecation.deprecation_warning(:end=, :finish!) + @end = ending + end + + # Returns the CPU time (in milliseconds) passed since the call to + # +start!+ and the call to +finish!+ + def cpu_time + (@cpu_time_finish - @cpu_time_start) * 1000 + end + + # Returns the idle time time (in milliseconds) passed since the call to + # +start!+ and the call to +finish!+ + def idle_time + duration - cpu_time + end + + # Returns the number of allocations made since the call to +start!+ and + # the call to +finish!+ + def allocations + @allocation_count_finish - @allocation_count_start + end + + # Returns the difference in milliseconds between when the execution of the + # event started and when it ended. + # + # ActiveSupport::Notifications.subscribe('wait') do |*args| + # @event = ActiveSupport::Notifications::Event.new(*args) + # end + # + # ActiveSupport::Notifications.instrument('wait') do + # sleep 1 + # end + # + # @event.duration # => 1000.138 + def duration + 1000.0 * (self.end - time) + end + + def <<(event) + @children << event + end + + def parent_of?(event) + @children.include? event + end + + private + def now + Concurrent.monotonic_time + end + + if clock_gettime_supported? + def now_cpu + Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID) + end + else + def now_cpu + 0 + end + end + + if defined?(JRUBY_VERSION) + def now_allocations + 0 + end + else + def now_allocations + GC.stat :total_allocated_objects + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper.rb new file mode 100644 index 000000000000..8c7a946d3290 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper.rb @@ -0,0 +1,382 @@ +# frozen_string_literal: true + +require "active_support/dependencies/autoload" + +module ActiveSupport + module NumberHelper + extend ActiveSupport::Autoload + + eager_autoload do + autoload :NumberConverter + autoload :RoundingHelper + autoload :NumberToRoundedConverter + autoload :NumberToDelimitedConverter + autoload :NumberToHumanConverter + autoload :NumberToHumanSizeConverter + autoload :NumberToPhoneConverter + autoload :NumberToCurrencyConverter + autoload :NumberToPercentageConverter + end + + extend self + + # Formats a +number+ into a phone number (US by default e.g., (555) + # 123-9876). You can customize the format in the +options+ hash. + # + # ==== Options + # + # * :area_code - Adds parentheses around the area code. + # * :delimiter - Specifies the delimiter to use + # (defaults to "-"). + # * :extension - Specifies an extension to add to the + # end of the generated number. + # * :country_code - Sets the country code for the phone + # number. + # * :pattern - Specifies how the number is divided into three + # groups with the custom regexp to override the default format. + # ==== Examples + # + # number_to_phone(5551234) # => "555-1234" + # number_to_phone('5551234') # => "555-1234" + # number_to_phone(1235551234) # => "123-555-1234" + # number_to_phone(1235551234, area_code: true) # => "(123) 555-1234" + # number_to_phone(1235551234, delimiter: ' ') # => "123 555 1234" + # number_to_phone(1235551234, area_code: true, extension: 555) # => "(123) 555-1234 x 555" + # number_to_phone(1235551234, country_code: 1) # => "+1-123-555-1234" + # number_to_phone('123a456') # => "123a456" + # + # number_to_phone(1235551234, country_code: 1, extension: 1343, delimiter: '.') + # # => "+1.123.555.1234 x 1343" + # + # number_to_phone(75561234567, pattern: /(\d{1,4})(\d{4})(\d{4})$/, area_code: true) + # # => "(755) 6123-4567" + # number_to_phone(13312345678, pattern: /(\d{3})(\d{4})(\d{4})$/) + # # => "133-1234-5678" + def number_to_phone(number, options = {}) + NumberToPhoneConverter.convert(number, options) + end + + # Formats a +number+ into a currency string (e.g., $13.65). You + # can customize the format in the +options+ hash. + # + # The currency unit and number formatting of the current locale will be used + # unless otherwise specified in the provided options. No currency conversion + # is performed. If the user is given a way to change their locale, they will + # also be able to change the relative value of the currency displayed with + # this helper. If your application will ever support multiple locales, you + # may want to specify a constant :locale option or consider + # using a library capable of currency conversion. + # + # ==== Options + # + # * :locale - Sets the locale to be used for formatting + # (defaults to current locale). + # * :precision - Sets the level of precision (defaults + # to 2). + # * :unit - Sets the denomination of the currency + # (defaults to "$"). + # * :separator - Sets the separator between the units + # (defaults to "."). + # * :delimiter - Sets the thousands delimiter (defaults + # to ","). + # * :format - Sets the format for non-negative numbers + # (defaults to "%u%n"). Fields are %u for the + # currency, and %n for the number. + # * :negative_format - Sets the format for negative + # numbers (defaults to prepending a hyphen to the formatted + # number given by :format). Accepts the same fields + # than :format, except %n is here the + # absolute value of the number. + # * :strip_insignificant_zeros - If +true+ removes + # insignificant zeros after the decimal separator (defaults to + # +false+). + # + # ==== Examples + # + # number_to_currency(1234567890.50) # => "$1,234,567,890.50" + # number_to_currency(1234567890.506) # => "$1,234,567,890.51" + # number_to_currency(1234567890.506, precision: 3) # => "$1,234,567,890.506" + # number_to_currency(1234567890.506, locale: :fr) # => "1 234 567 890,51 €" + # number_to_currency('123a456') # => "$123a456" + # + # number_to_currency("123a456", raise: true) # => InvalidNumberError + # + # number_to_currency(-0.456789, precision: 0) + # # => "$0" + # number_to_currency(-1234567890.50, negative_format: '(%u%n)') + # # => "($1,234,567,890.50)" + # number_to_currency(1234567890.50, unit: '£', separator: ',', delimiter: '') + # # => "£1234567890,50" + # number_to_currency(1234567890.50, unit: '£', separator: ',', delimiter: '', format: '%n %u') + # # => "1234567890,50 £" + # number_to_currency(1234567890.50, strip_insignificant_zeros: true) + # # => "$1,234,567,890.5" + def number_to_currency(number, options = {}) + NumberToCurrencyConverter.convert(number, options) + end + + # Formats a +number+ as a percentage string (e.g., 65%). You can + # customize the format in the +options+ hash. + # + # ==== Options + # + # * :locale - Sets the locale to be used for formatting + # (defaults to current locale). + # * :precision - Sets the precision of the number + # (defaults to 3). Keeps the number's precision if +nil+. + # * :significant - If +true+, precision will be the number + # of significant_digits. If +false+, the number of fractional + # digits (defaults to +false+). + # * :separator - Sets the separator between the + # fractional and integer digits (defaults to "."). + # * :delimiter - Sets the thousands delimiter (defaults + # to ""). + # * :strip_insignificant_zeros - If +true+ removes + # insignificant zeros after the decimal separator (defaults to + # +false+). + # * :format - Specifies the format of the percentage + # string The number field is %n (defaults to "%n%"). + # + # ==== Examples + # + # number_to_percentage(100) # => "100.000%" + # number_to_percentage('98') # => "98.000%" + # number_to_percentage(100, precision: 0) # => "100%" + # number_to_percentage(1000, delimiter: '.', separator: ',') # => "1.000,000%" + # number_to_percentage(302.24398923423, precision: 5) # => "302.24399%" + # number_to_percentage(1000, locale: :fr) # => "1000,000%" + # number_to_percentage(1000, precision: nil) # => "1000%" + # number_to_percentage('98a') # => "98a%" + # number_to_percentage(100, format: '%n %') # => "100.000 %" + def number_to_percentage(number, options = {}) + NumberToPercentageConverter.convert(number, options) + end + + # Formats a +number+ with grouped thousands using +delimiter+ + # (e.g., 12,324). You can customize the format in the +options+ + # hash. + # + # ==== Options + # + # * :locale - Sets the locale to be used for formatting + # (defaults to current locale). + # * :delimiter - Sets the thousands delimiter (defaults + # to ","). + # * :separator - Sets the separator between the + # fractional and integer digits (defaults to "."). + # * :delimiter_pattern - Sets a custom regular expression used for + # deriving the placement of delimiter. Helpful when using currency formats + # like INR. + # + # ==== Examples + # + # number_to_delimited(12345678) # => "12,345,678" + # number_to_delimited('123456') # => "123,456" + # number_to_delimited(12345678.05) # => "12,345,678.05" + # number_to_delimited(12345678, delimiter: '.') # => "12.345.678" + # number_to_delimited(12345678, delimiter: ',') # => "12,345,678" + # number_to_delimited(12345678.05, separator: ' ') # => "12,345,678 05" + # number_to_delimited(12345678.05, locale: :fr) # => "12 345 678,05" + # number_to_delimited('112a') # => "112a" + # number_to_delimited(98765432.98, delimiter: ' ', separator: ',') + # # => "98 765 432,98" + # number_to_delimited("123456.78", + # delimiter_pattern: /(\d+?)(?=(\d\d)+(\d)(?!\d))/) + # # => "1,23,456.78" + def number_to_delimited(number, options = {}) + NumberToDelimitedConverter.convert(number, options) + end + + # Formats a +number+ with the specified level of + # :precision (e.g., 112.32 has a precision of 2 if + # +:significant+ is +false+, and 5 if +:significant+ is +true+). + # You can customize the format in the +options+ hash. + # + # ==== Options + # + # * :locale - Sets the locale to be used for formatting + # (defaults to current locale). + # * :precision - Sets the precision of the number + # (defaults to 3). Keeps the number's precision if +nil+. + # * :significant - If +true+, precision will be the number + # of significant_digits. If +false+, the number of fractional + # digits (defaults to +false+). + # * :separator - Sets the separator between the + # fractional and integer digits (defaults to "."). + # * :delimiter - Sets the thousands delimiter (defaults + # to ""). + # * :strip_insignificant_zeros - If +true+ removes + # insignificant zeros after the decimal separator (defaults to + # +false+). + # + # ==== Examples + # + # number_to_rounded(111.2345) # => "111.235" + # number_to_rounded(111.2345, precision: 2) # => "111.23" + # number_to_rounded(13, precision: 5) # => "13.00000" + # number_to_rounded(389.32314, precision: 0) # => "389" + # number_to_rounded(111.2345, significant: true) # => "111" + # number_to_rounded(111.2345, precision: 1, significant: true) # => "100" + # number_to_rounded(13, precision: 5, significant: true) # => "13.000" + # number_to_rounded(13, precision: nil) # => "13" + # number_to_rounded(111.234, locale: :fr) # => "111,234" + # + # number_to_rounded(13, precision: 5, significant: true, strip_insignificant_zeros: true) + # # => "13" + # + # number_to_rounded(389.32314, precision: 4, significant: true) # => "389.3" + # number_to_rounded(1111.2345, precision: 2, separator: ',', delimiter: '.') + # # => "1.111,23" + def number_to_rounded(number, options = {}) + NumberToRoundedConverter.convert(number, options) + end + + # Formats the bytes in +number+ into a more understandable + # representation (e.g., giving it 1500 yields 1.5 KB). This + # method is useful for reporting file sizes to users. You can + # customize the format in the +options+ hash. + # + # See number_to_human if you want to pretty-print a + # generic number. + # + # ==== Options + # + # * :locale - Sets the locale to be used for formatting + # (defaults to current locale). + # * :precision - Sets the precision of the number + # (defaults to 3). + # * :significant - If +true+, precision will be the number + # of significant_digits. If +false+, the number of fractional + # digits (defaults to +true+) + # * :separator - Sets the separator between the + # fractional and integer digits (defaults to "."). + # * :delimiter - Sets the thousands delimiter (defaults + # to ""). + # * :strip_insignificant_zeros - If +true+ removes + # insignificant zeros after the decimal separator (defaults to + # +true+) + # + # ==== Examples + # + # number_to_human_size(123) # => "123 Bytes" + # number_to_human_size(1234) # => "1.21 KB" + # number_to_human_size(12345) # => "12.1 KB" + # number_to_human_size(1234567) # => "1.18 MB" + # number_to_human_size(1234567890) # => "1.15 GB" + # number_to_human_size(1234567890123) # => "1.12 TB" + # number_to_human_size(1234567890123456) # => "1.1 PB" + # number_to_human_size(1234567890123456789) # => "1.07 EB" + # number_to_human_size(1234567, precision: 2) # => "1.2 MB" + # number_to_human_size(483989, precision: 2) # => "470 KB" + # number_to_human_size(1234567, precision: 2, separator: ',') # => "1,2 MB" + # number_to_human_size(1234567890123, precision: 5) # => "1.1228 TB" + # number_to_human_size(524288000, precision: 5) # => "500 MB" + def number_to_human_size(number, options = {}) + NumberToHumanSizeConverter.convert(number, options) + end + + # Pretty prints (formats and approximates) a number in a way it + # is more readable by humans (eg.: 1200000000 becomes "1.2 + # Billion"). This is useful for numbers that can get very large + # (and too hard to read). + # + # See number_to_human_size if you want to print a file + # size. + # + # You can also define your own unit-quantifier names if you want + # to use other decimal units (eg.: 1500 becomes "1.5 + # kilometers", 0.150 becomes "150 milliliters", etc). You may + # define a wide range of unit quantifiers, even fractional ones + # (centi, deci, mili, etc). + # + # ==== Options + # + # * :locale - Sets the locale to be used for formatting + # (defaults to current locale). + # * :precision - Sets the precision of the number + # (defaults to 3). + # * :significant - If +true+, precision will be the number + # of significant_digits. If +false+, the number of fractional + # digits (defaults to +true+) + # * :separator - Sets the separator between the + # fractional and integer digits (defaults to "."). + # * :delimiter - Sets the thousands delimiter (defaults + # to ""). + # * :strip_insignificant_zeros - If +true+ removes + # insignificant zeros after the decimal separator (defaults to + # +true+) + # * :units - A Hash of unit quantifier names. Or a + # string containing an i18n scope where to find this hash. It + # might have the following keys: + # * *integers*: :unit, :ten, + # :hundred, :thousand, :million, + # :billion, :trillion, + # :quadrillion + # * *fractionals*: :deci, :centi, + # :mili, :micro, :nano, + # :pico, :femto + # * :format - Sets the format of the output string + # (defaults to "%n %u"). The field types are: + # * %u - The quantifier (ex.: 'thousand') + # * %n - The number + # + # ==== Examples + # + # number_to_human(123) # => "123" + # number_to_human(1234) # => "1.23 Thousand" + # number_to_human(12345) # => "12.3 Thousand" + # number_to_human(1234567) # => "1.23 Million" + # number_to_human(1234567890) # => "1.23 Billion" + # number_to_human(1234567890123) # => "1.23 Trillion" + # number_to_human(1234567890123456) # => "1.23 Quadrillion" + # number_to_human(1234567890123456789) # => "1230 Quadrillion" + # number_to_human(489939, precision: 2) # => "490 Thousand" + # number_to_human(489939, precision: 4) # => "489.9 Thousand" + # number_to_human(1234567, precision: 4, + # significant: false) # => "1.2346 Million" + # number_to_human(1234567, precision: 1, + # separator: ',', + # significant: false) # => "1,2 Million" + # + # number_to_human(500000000, precision: 5) # => "500 Million" + # number_to_human(12345012345, significant: false) # => "12.345 Billion" + # + # Non-significant zeros after the decimal separator are stripped + # out by default (set :strip_insignificant_zeros to + # +false+ to change that): + # + # number_to_human(12.00001) # => "12" + # number_to_human(12.00001, strip_insignificant_zeros: false) # => "12.0" + # + # ==== Custom Unit Quantifiers + # + # You can also use your own custom unit quantifiers: + # number_to_human(500000, units: { unit: 'ml', thousand: 'lt' }) # => "500 lt" + # + # If in your I18n locale you have: + # + # distance: + # centi: + # one: "centimeter" + # other: "centimeters" + # unit: + # one: "meter" + # other: "meters" + # thousand: + # one: "kilometer" + # other: "kilometers" + # billion: "gazillion-distance" + # + # Then you could do: + # + # number_to_human(543934, units: :distance) # => "544 kilometers" + # number_to_human(54393498, units: :distance) # => "54400 kilometers" + # number_to_human(54393498000, units: :distance) # => "54.4 gazillion-distance" + # number_to_human(343, units: :distance, precision: 1) # => "300 meters" + # number_to_human(1, units: :distance) # => "1 meter" + # number_to_human(0.34, units: :distance) # => "34 centimeters" + def number_to_human(number, options = {}) + NumberToHumanConverter.convert(number, options) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_converter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_converter.rb new file mode 100644 index 000000000000..9c1b6b03d98e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_converter.rb @@ -0,0 +1,183 @@ +# frozen_string_literal: true + +require "active_support/core_ext/big_decimal/conversions" +require "active_support/core_ext/object/blank" +require "active_support/core_ext/hash/keys" +require "active_support/i18n" +require "active_support/core_ext/class/attribute" + +module ActiveSupport + module NumberHelper + class NumberConverter # :nodoc: + # Default and i18n option namespace per class + class_attribute :namespace + + # Does the object need a number that is a valid float? + class_attribute :validate_float + + attr_reader :number, :opts + + DEFAULTS = { + # Used in number_to_delimited + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' + format: { + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) + separator: ".", + # Delimits thousands (e.g. 1,000,000 is a million) (always in groups of three) + delimiter: ",", + # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) + precision: 3, + # If set to true, precision will mean the number of significant digits instead + # of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2) + significant: false, + # If set, the zeros after the decimal separator will always be stripped (eg.: 1.200 will be 1.2) + strip_insignificant_zeros: false + }, + + # Used in number_to_currency + currency: { + format: { + format: "%u%n", + negative_format: "-%u%n", + unit: "$", + # These five are to override number.format and are optional + separator: ".", + delimiter: ",", + precision: 2, + significant: false, + strip_insignificant_zeros: false + } + }, + + # Used in number_to_percentage + percentage: { + format: { + delimiter: "", + format: "%n%" + } + }, + + # Used in number_to_rounded + precision: { + format: { + delimiter: "" + } + }, + + # Used in number_to_human_size and number_to_human + human: { + format: { + # These five are to override number.format and are optional + delimiter: "", + precision: 3, + significant: true, + strip_insignificant_zeros: true + }, + # Used in number_to_human_size + storage_units: { + # Storage units output formatting. + # %u is the storage unit, %n is the number (default: 2 MB) + format: "%n %u", + units: { + byte: "Bytes", + kb: "KB", + mb: "MB", + gb: "GB", + tb: "TB" + } + }, + # Used in number_to_human + decimal_units: { + format: "%n %u", + # Decimal units output formatting + # By default we will only quantify some of the exponents + # but the commented ones might be defined or overridden + # by the user. + units: { + # femto: Quadrillionth + # pico: Trillionth + # nano: Billionth + # micro: Millionth + # mili: Thousandth + # centi: Hundredth + # deci: Tenth + unit: "", + # ten: + # one: Ten + # other: Tens + # hundred: Hundred + thousand: "Thousand", + million: "Million", + billion: "Billion", + trillion: "Trillion", + quadrillion: "Quadrillion" + } + } + } + } + + def self.convert(number, options) + new(number, options).execute + end + + def initialize(number, options) + @number = number + @opts = options.symbolize_keys + end + + def execute + if !number + nil + elsif validate_float? && !valid_float? + number + else + convert + end + end + + private + def options + @options ||= format_options.merge(opts) + end + + def format_options + default_format_options.merge!(i18n_format_options) + end + + def default_format_options + options = DEFAULTS[:format].dup + options.merge!(DEFAULTS[namespace][:format]) if namespace + options + end + + def i18n_format_options + locale = opts[:locale] + options = I18n.translate(:'number.format', locale: locale, default: {}).dup + + if namespace + options.merge!(I18n.translate(:"number.#{namespace}.format", locale: locale, default: {})) + end + + options + end + + def translate_number_value_with_default(key, **i18n_options) + I18n.translate(key, **{ default: default_value(key), scope: :number }.merge!(i18n_options)) + end + + def translate_in_locale(key, **i18n_options) + translate_number_value_with_default(key, **{ locale: options[:locale] }.merge(i18n_options)) + end + + def default_value(key) + key.split(".").reduce(DEFAULTS) { |defaults, k| defaults[k.to_sym] } + end + + def valid_float? + Float(number) + rescue ArgumentError, TypeError + false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_currency_converter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_currency_converter.rb new file mode 100644 index 000000000000..4b8d267b4eff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_currency_converter.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require "active_support/number_helper/number_converter" + +module ActiveSupport + module NumberHelper + class NumberToCurrencyConverter < NumberConverter # :nodoc: + self.namespace = :currency + + def convert + number = self.number.to_s.strip + number_f = number.to_f + format = options[:format] + + if number_f.negative? + number = number_f.abs + + unless options[:precision] == 0 && number < 0.5 + format = options[:negative_format] + end + end + + rounded_number = NumberToRoundedConverter.convert(number, options) + format.gsub("%n", rounded_number).gsub("%u", options[:unit]) + end + + private + def options + @options ||= begin + defaults = default_format_options.merge(i18n_opts) + # Override negative format if format options are given + defaults[:negative_format] = "-#{opts[:format]}" if opts[:format] + defaults.merge!(opts) + end + end + + def i18n_opts + # Set International negative format if it does not exist + i18n = i18n_format_options + i18n[:negative_format] ||= "-#{i18n[:format]}" if i18n[:format] + i18n + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_delimited_converter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_delimited_converter.rb new file mode 100644 index 000000000000..351444289c50 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_delimited_converter.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require "active_support/number_helper/number_converter" + +module ActiveSupport + module NumberHelper + class NumberToDelimitedConverter < NumberConverter #:nodoc: + self.validate_float = true + + DEFAULT_DELIMITER_REGEX = /(\d)(?=(\d\d\d)+(?!\d))/ + + def convert + parts.join(options[:separator]) + end + + private + def parts + left, right = number.to_s.split(".") + left.gsub!(delimiter_pattern) do |digit_to_delimit| + "#{digit_to_delimit}#{options[:delimiter]}" + end + [left, right].compact + end + + def delimiter_pattern + options.fetch(:delimiter_pattern, DEFAULT_DELIMITER_REGEX) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_human_converter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_human_converter.rb new file mode 100644 index 000000000000..f089d7ae653c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_human_converter.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require "active_support/number_helper/number_converter" + +module ActiveSupport + module NumberHelper + class NumberToHumanConverter < NumberConverter # :nodoc: + DECIMAL_UNITS = { 0 => :unit, 1 => :ten, 2 => :hundred, 3 => :thousand, 6 => :million, 9 => :billion, 12 => :trillion, 15 => :quadrillion, + -1 => :deci, -2 => :centi, -3 => :mili, -6 => :micro, -9 => :nano, -12 => :pico, -15 => :femto } + INVERTED_DECIMAL_UNITS = DECIMAL_UNITS.invert + + self.namespace = :human + self.validate_float = true + + def convert # :nodoc: + @number = RoundingHelper.new(options).round(number) + @number = Float(number) + + # for backwards compatibility with those that didn't add strip_insignificant_zeros to their locale files + unless options.key?(:strip_insignificant_zeros) + options[:strip_insignificant_zeros] = true + end + + units = opts[:units] + exponent = calculate_exponent(units) + @number = number / (10**exponent) + + rounded_number = NumberToRoundedConverter.convert(number, options) + unit = determine_unit(units, exponent) + format.gsub("%n", rounded_number).gsub("%u", unit).strip + end + + private + def format + options[:format] || translate_in_locale("human.decimal_units.format") + end + + def determine_unit(units, exponent) + exp = DECIMAL_UNITS[exponent] + case units + when Hash + units[exp] || "" + when String, Symbol + I18n.translate("#{units}.#{exp}", locale: options[:locale], count: number.to_i) + else + translate_in_locale("human.decimal_units.units.#{exp}", count: number.to_i) + end + end + + def calculate_exponent(units) + exponent = number != 0 ? Math.log10(number.abs).floor : 0 + unit_exponents(units).find { |e| exponent >= e } || 0 + end + + def unit_exponents(units) + case units + when Hash + units + when String, Symbol + I18n.translate(units.to_s, locale: options[:locale], raise: true) + when nil + translate_in_locale("human.decimal_units.units", raise: true) + else + raise ArgumentError, ":units must be a Hash or String translation scope." + end.keys.map { |e_name| INVERTED_DECIMAL_UNITS[e_name] }.sort_by(&:-@) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_human_size_converter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_human_size_converter.rb new file mode 100644 index 000000000000..ed8acbda6e2d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_human_size_converter.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +require "active_support/number_helper/number_converter" + +module ActiveSupport + module NumberHelper + class NumberToHumanSizeConverter < NumberConverter #:nodoc: + STORAGE_UNITS = [:byte, :kb, :mb, :gb, :tb, :pb, :eb] + + self.namespace = :human + self.validate_float = true + + def convert + @number = Float(number) + + # for backwards compatibility with those that didn't add strip_insignificant_zeros to their locale files + unless options.key?(:strip_insignificant_zeros) + options[:strip_insignificant_zeros] = true + end + + if smaller_than_base? + number_to_format = number.to_i.to_s + else + human_size = number / (base**exponent) + number_to_format = NumberToRoundedConverter.convert(human_size, options) + end + conversion_format.gsub("%n", number_to_format).gsub("%u", unit) + end + + private + def conversion_format + translate_number_value_with_default("human.storage_units.format", locale: options[:locale], raise: true) + end + + def unit + translate_number_value_with_default(storage_unit_key, locale: options[:locale], count: number.to_i, raise: true) + end + + def storage_unit_key + key_end = smaller_than_base? ? "byte" : STORAGE_UNITS[exponent] + "human.storage_units.units.#{key_end}" + end + + def exponent + max = STORAGE_UNITS.size - 1 + exp = (Math.log(number) / Math.log(base)).to_i + exp = max if exp > max # avoid overflow for the highest unit + exp + end + + def smaller_than_base? + number.to_i < base + end + + def base + 1024 + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_percentage_converter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_percentage_converter.rb new file mode 100644 index 000000000000..0c2e190f8a2e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_percentage_converter.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require "active_support/number_helper/number_converter" + +module ActiveSupport + module NumberHelper + class NumberToPercentageConverter < NumberConverter # :nodoc: + self.namespace = :percentage + + def convert + rounded_number = NumberToRoundedConverter.convert(number, options) + options[:format].gsub("%n", rounded_number) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_phone_converter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_phone_converter.rb new file mode 100644 index 000000000000..21eadfdcc733 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_phone_converter.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +require "active_support/number_helper/number_converter" + +module ActiveSupport + module NumberHelper + class NumberToPhoneConverter < NumberConverter #:nodoc: + def convert + str = country_code(opts[:country_code]).dup + str << convert_to_phone_number(number.to_s.strip) + str << phone_ext(opts[:extension]) + end + + private + def convert_to_phone_number(number) + if opts[:area_code] + convert_with_area_code(number) + else + convert_without_area_code(number) + end + end + + def convert_with_area_code(number) + default_pattern = /(\d{1,3})(\d{3})(\d{4}$)/ + number.gsub!(regexp_pattern(default_pattern), + "(\\1) \\2#{delimiter}\\3") + number + end + + def convert_without_area_code(number) + default_pattern = /(\d{0,3})(\d{3})(\d{4})$/ + number.gsub!(regexp_pattern(default_pattern), + "\\1#{delimiter}\\2#{delimiter}\\3") + number.slice!(0, 1) if start_with_delimiter?(number) + number + end + + def start_with_delimiter?(number) + delimiter.present? && number.start_with?(delimiter) + end + + def delimiter + opts[:delimiter] || "-" + end + + def country_code(code) + code.blank? ? "" : "+#{code}#{delimiter}" + end + + def phone_ext(ext) + ext.blank? ? "" : " x #{ext}" + end + + def regexp_pattern(default_pattern) + opts.fetch :pattern, default_pattern + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_rounded_converter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_rounded_converter.rb new file mode 100644 index 000000000000..767cfe22ad41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/number_to_rounded_converter.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require "active_support/number_helper/number_converter" + +module ActiveSupport + module NumberHelper + class NumberToRoundedConverter < NumberConverter # :nodoc: + self.namespace = :precision + self.validate_float = true + + def convert + helper = RoundingHelper.new(options) + rounded_number = helper.round(number) + + if precision = options[:precision] + if options[:significant] && precision > 0 + digits = helper.digit_count(rounded_number) + precision -= digits + precision = 0 if precision < 0 # don't let it be negative + end + + formatted_string = + if BigDecimal === rounded_number && rounded_number.finite? + s = rounded_number.to_s("F") + s << "0" * precision + a, b = s.split(".", 2) + a << "." + a << b[0, precision] + else + "%00.#{precision}f" % rounded_number + end + else + formatted_string = rounded_number + end + + delimited_number = NumberToDelimitedConverter.convert(formatted_string, options) + format_number(delimited_number) + end + + private + def strip_insignificant_zeros + options[:strip_insignificant_zeros] + end + + def format_number(number) + if strip_insignificant_zeros + escaped_separator = Regexp.escape(options[:separator]) + number.sub(/(#{escaped_separator})(\d*[1-9])?0+\z/, '\1\2').sub(/#{escaped_separator}\z/, "") + else + number + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/rounding_helper.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/rounding_helper.rb new file mode 100644 index 000000000000..2ad8d49c4edb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/number_helper/rounding_helper.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +module ActiveSupport + module NumberHelper + class RoundingHelper # :nodoc: + attr_reader :options + + def initialize(options) + @options = options + end + + def round(number) + return number unless precision + number = convert_to_decimal(number) + if significant && precision > 0 + round_significant(number) + else + round_without_significant(number) + end + end + + def digit_count(number) + return 1 if number.zero? + (Math.log10(absolute_number(number)) + 1).floor + end + + private + def round_without_significant(number) + number = number.round(precision) + number = number.to_i if precision == 0 && number.finite? + number = number.abs if number.zero? # prevent showing negative zeros + number + end + + def round_significant(number) + return 0 if number.zero? + digits = digit_count(number) + multiplier = 10**(digits - precision) + (number / BigDecimal(multiplier.to_f.to_s)).round * multiplier + end + + def convert_to_decimal(number) + case number + when Float, String + BigDecimal(number.to_s) + when Rational + BigDecimal(number, digit_count(number.to_i) + precision) + else + number.to_d + end + end + + def precision + options[:precision] + end + + def significant + options[:significant] + end + + def absolute_number(number) + number.respond_to?(:abs) ? number.abs : number.to_d.abs + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/option_merger.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/option_merger.rb new file mode 100644 index 000000000000..a4f40b02a4ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/option_merger.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require "active_support/core_ext/hash/deep_merge" + +module ActiveSupport + class OptionMerger #:nodoc: + instance_methods.each do |method| + undef_method(method) if !/^(__|instance_eval|class|object_id)/.match?(method) + end + + def initialize(context, options) + @context, @options = context, options + end + + private + def method_missing(method, *arguments, &block) + options = nil + if arguments.first.is_a?(Proc) + proc = arguments.pop + arguments << lambda { |*args| @options.deep_merge(proc.call(*args)) } + elsif arguments.last.respond_to?(:to_hash) + options = @options.deep_merge(arguments.pop) + else + options = @options + end + + invoke_method(method, arguments, options, &block) + end + + if RUBY_VERSION >= "2.7" + def invoke_method(method, arguments, options, &block) + if options + @context.__send__(method, *arguments, **options, &block) + else + @context.__send__(method, *arguments, &block) + end + end + else + def invoke_method(method, arguments, options, &block) + arguments << options if options + @context.__send__(method, *arguments, &block) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/ordered_hash.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/ordered_hash.rb new file mode 100644 index 000000000000..ad11524137e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/ordered_hash.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require "yaml" + +YAML.add_builtin_type("omap") do |type, val| + ActiveSupport::OrderedHash[val.map { |v| v.to_a.first }] +end + +module ActiveSupport + # DEPRECATED: ActiveSupport::OrderedHash implements a hash that preserves + # insertion order. + # + # oh = ActiveSupport::OrderedHash.new + # oh[:a] = 1 + # oh[:b] = 2 + # oh.keys # => [:a, :b], this order is guaranteed + # + # Also, maps the +omap+ feature for YAML files + # (See https://yaml.org/type/omap.html) to support ordered items + # when loading from yaml. + # + # ActiveSupport::OrderedHash is namespaced to prevent conflicts + # with other implementations. + class OrderedHash < ::Hash + def to_yaml_type + "!tag:yaml.org,2002:omap" + end + + def encode_with(coder) + coder.represent_seq "!omap", map { |k, v| { k => v } } + end + + def select(*args, &block) + dup.tap { |hash| hash.select!(*args, &block) } + end + + def reject(*args, &block) + dup.tap { |hash| hash.reject!(*args, &block) } + end + + def nested_under_indifferent_access + self + end + + # Returns true to make sure that this hash is extractable via Array#extract_options! + def extractable_options? + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/ordered_options.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/ordered_options.rb new file mode 100644 index 000000000000..55c850dbce67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/ordered_options.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/blank" + +module ActiveSupport + # Usually key value pairs are handled something like this: + # + # h = {} + # h[:boy] = 'John' + # h[:girl] = 'Mary' + # h[:boy] # => 'John' + # h[:girl] # => 'Mary' + # h[:dog] # => nil + # + # Using +OrderedOptions+, the above code could be reduced to: + # + # h = ActiveSupport::OrderedOptions.new + # h.boy = 'John' + # h.girl = 'Mary' + # h.boy # => 'John' + # h.girl # => 'Mary' + # h.dog # => nil + # + # To raise an exception when the value is blank, append a + # bang to the key name, like: + # + # h.dog! # => raises KeyError: :dog is blank + # + class OrderedOptions < Hash + alias_method :_get, :[] # preserve the original #[] method + protected :_get # make it protected + + def []=(key, value) + super(key.to_sym, value) + end + + def [](key) + super(key.to_sym) + end + + def method_missing(name, *args) + name_string = +name.to_s + if name_string.chomp!("=") + self[name_string] = args.first + else + bangs = name_string.chomp!("!") + + if bangs + self[name_string].presence || raise(KeyError.new(":#{name_string} is blank")) + else + self[name_string] + end + end + end + + def respond_to_missing?(name, include_private) + true + end + + def extractable_options? + true + end + end + + # +InheritableOptions+ provides a constructor to build an +OrderedOptions+ + # hash inherited from another hash. + # + # Use this if you already have some hash and you want to create a new one based on it. + # + # h = ActiveSupport::InheritableOptions.new({ girl: 'Mary', boy: 'John' }) + # h.girl # => 'Mary' + # h.boy # => 'John' + class InheritableOptions < OrderedOptions + def initialize(parent = nil) + if parent.kind_of?(OrderedOptions) + # use the faster _get when dealing with OrderedOptions + super() { |h, k| parent._get(k) } + elsif parent + super() { |h, k| parent[k] } + else + super() + end + end + + def inheritable_copy + self.class.new(self) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/parameter_filter.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/parameter_filter.rb new file mode 100644 index 000000000000..f700dbbea536 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/parameter_filter.rb @@ -0,0 +1,128 @@ +# frozen_string_literal: true + +require "active_support/core_ext/object/duplicable" +require "active_support/core_ext/array/extract" + +module ActiveSupport + # +ParameterFilter+ allows you to specify keys for sensitive data from + # hash-like object and replace corresponding value. Filtering only certain + # sub-keys from a hash is possible by using the dot notation: + # 'credit_card.number'. If a proc is given, each key and value of a hash and + # all sub-hashes are passed to it, where the value or the key can be replaced + # using String#replace or similar methods. + # + # ActiveSupport::ParameterFilter.new([:password]) + # => replaces the value to all keys matching /password/i with "[FILTERED]" + # + # ActiveSupport::ParameterFilter.new([:foo, "bar"]) + # => replaces the value to all keys matching /foo|bar/i with "[FILTERED]" + # + # ActiveSupport::ParameterFilter.new(["credit_card.code"]) + # => replaces { credit_card: {code: "xxxx"} } with "[FILTERED]", does not + # change { file: { code: "xxxx"} } + # + # ActiveSupport::ParameterFilter.new([-> (k, v) do + # v.reverse! if k =~ /secret/i + # end]) + # => reverses the value to all keys matching /secret/i + class ParameterFilter + FILTERED = "[FILTERED]" # :nodoc: + + # Create instance with given filters. Supported type of filters are +String+, +Regexp+, and +Proc+. + # Other types of filters are treated as +String+ using +to_s+. + # For +Proc+ filters, key, value, and optional original hash is passed to block arguments. + # + # ==== Options + # + # * :mask - A replaced object when filtered. Defaults to +"[FILTERED]"+ + def initialize(filters = [], mask: FILTERED) + @filters = filters + @mask = mask + end + + # Mask value of +params+ if key matches one of filters. + def filter(params) + compiled_filter.call(params) + end + + # Returns filtered value for given key. For +Proc+ filters, third block argument is not populated. + def filter_param(key, value) + @filters.empty? ? value : compiled_filter.value_for_key(key, value) + end + + private + def compiled_filter + @compiled_filter ||= CompiledFilter.compile(@filters, mask: @mask) + end + + class CompiledFilter # :nodoc: + def self.compile(filters, mask:) + return lambda { |params| params.dup } if filters.empty? + + strings, regexps, blocks = [], [], [] + + filters.each do |item| + case item + when Proc + blocks << item + when Regexp + regexps << item + else + strings << Regexp.escape(item.to_s) + end + end + + deep_regexps = regexps.extract! { |r| r.to_s.include?("\\.") } + deep_strings = strings.extract! { |s| s.include?("\\.") } + + regexps << Regexp.new(strings.join("|"), true) unless strings.empty? + deep_regexps << Regexp.new(deep_strings.join("|"), true) unless deep_strings.empty? + + new regexps, deep_regexps, blocks, mask: mask + end + + attr_reader :regexps, :deep_regexps, :blocks + + def initialize(regexps, deep_regexps, blocks, mask:) + @regexps = regexps + @deep_regexps = deep_regexps.any? ? deep_regexps : nil + @blocks = blocks + @mask = mask + end + + def call(params, parents = [], original_params = params) + filtered_params = params.class.new + + params.each do |key, value| + filtered_params[key] = value_for_key(key, value, parents, original_params) + end + + filtered_params + end + + def value_for_key(key, value, parents = [], original_params = nil) + parents.push(key) if deep_regexps + if regexps.any? { |r| r.match?(key.to_s) } + value = @mask + elsif deep_regexps && (joined = parents.join(".")) && deep_regexps.any? { |r| r.match?(joined) } + value = @mask + elsif value.is_a?(Hash) + value = call(value, parents, original_params) + elsif value.is_a?(Array) + # If we don't pop the current parent it will be duplicated as we + # process each array value. + parents.pop if deep_regexps + value = value.map { |v| value_for_key(key, v, parents, original_params) } + # Restore the parent stack after processing the array. + parents.push(key) if deep_regexps + elsif blocks.any? + key = key.dup if key.duplicable? + value = value.dup if value.duplicable? + blocks.each { |b| b.arity == 2 ? b.call(key, value) : b.call(key, value, original_params) } + end + parents.pop if deep_regexps + value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/per_thread_registry.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/per_thread_registry.rb new file mode 100644 index 000000000000..eb92fb43717c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/per_thread_registry.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/delegation" + +module ActiveSupport + # NOTE: This approach has been deprecated for end-user code in favor of {thread_mattr_accessor}[rdoc-ref:Module#thread_mattr_accessor] and friends. + # Please use that approach instead. + # + # This module is used to encapsulate access to thread local variables. + # + # Instead of polluting the thread locals namespace: + # + # Thread.current[:connection_handler] + # + # you define a class that extends this module: + # + # module ActiveRecord + # class RuntimeRegistry + # extend ActiveSupport::PerThreadRegistry + # + # attr_accessor :connection_handler + # end + # end + # + # and invoke the declared instance accessors as class methods. So + # + # ActiveRecord::RuntimeRegistry.connection_handler = connection_handler + # + # sets a connection handler local to the current thread, and + # + # ActiveRecord::RuntimeRegistry.connection_handler + # + # returns a connection handler local to the current thread. + # + # This feature is accomplished by instantiating the class and storing the + # instance as a thread local keyed by the class name. In the example above + # a key "ActiveRecord::RuntimeRegistry" is stored in Thread.current. + # The class methods proxy to said thread local instance. + # + # If the class has an initializer, it must accept no arguments. + module PerThreadRegistry + def self.extended(object) + object.instance_variable_set "@per_thread_registry_key", object.name.freeze + end + + def instance + Thread.current[@per_thread_registry_key] ||= new + end + + private + def method_missing(name, *args, &block) + # Caches the method definition as a singleton method of the receiver. + # + # By letting #delegate handle it, we avoid an enclosure that'll capture args. + singleton_class.delegate name, to: :instance + + send(name, *args, &block) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/proxy_object.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/proxy_object.rb new file mode 100644 index 000000000000..0965fcd2d922 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/proxy_object.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module ActiveSupport + # A class with no predefined methods that behaves similarly to Builder's + # BlankSlate. Used for proxy classes. + class ProxyObject < ::BasicObject + undef_method :== + undef_method :equal? + + # Let ActiveSupport::ProxyObject at least raise exceptions. + def raise(*args) + ::Object.send(:raise, *args) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/rails.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/rails.rb new file mode 100644 index 000000000000..8b727a69ec54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/rails.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +# This is private interface. +# +# Rails components cherry pick from Active Support as needed, but there are a +# few features that are used for sure in some way or another and it is not worth +# putting individual requires absolutely everywhere. Think blank? for example. +# +# This file is loaded by every Rails component except Active Support itself, +# but it does not belong to the Rails public interface. It is internal to +# Rails and can change anytime. + +# Defines Object#blank? and Object#present?. +require "active_support/core_ext/object/blank" + +# Rails own autoload, eager_load, etc. +require "active_support/dependencies/autoload" + +# Support for ClassMethods and the included macro. +require "active_support/concern" + +# Defines Class#class_attribute. +require "active_support/core_ext/class/attribute" + +# Defines Module#delegate. +require "active_support/core_ext/module/delegation" + +# Defines ActiveSupport::Deprecation. +require "active_support/deprecation" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/railtie.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/railtie.rb new file mode 100644 index 000000000000..605b50d346cc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/railtie.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require "active_support" +require "active_support/i18n_railtie" + +module ActiveSupport + class Railtie < Rails::Railtie # :nodoc: + config.active_support = ActiveSupport::OrderedOptions.new + + config.eager_load_namespaces << ActiveSupport + + initializer "active_support.set_authenticated_message_encryption" do |app| + config.after_initialize do + unless app.config.active_support.use_authenticated_message_encryption.nil? + ActiveSupport::MessageEncryptor.use_authenticated_message_encryption = + app.config.active_support.use_authenticated_message_encryption + end + end + end + + initializer "active_support.reset_all_current_attributes_instances" do |app| + app.reloader.before_class_unload { ActiveSupport::CurrentAttributes.clear_all } + app.executor.to_run { ActiveSupport::CurrentAttributes.reset_all } + app.executor.to_complete { ActiveSupport::CurrentAttributes.reset_all } + end + + initializer "active_support.deprecation_behavior" do |app| + if deprecation = app.config.active_support.deprecation + ActiveSupport::Deprecation.behavior = deprecation + end + end + + # Sets the default value for Time.zone + # If assigned value cannot be matched to a TimeZone, an exception will be raised. + initializer "active_support.initialize_time_zone" do |app| + begin + TZInfo::DataSource.get + rescue TZInfo::DataSourceNotFound => e + raise e.exception "tzinfo-data is not present. Please add gem 'tzinfo-data' to your Gemfile and run bundle install" + end + require "active_support/core_ext/time/zones" + Time.zone_default = Time.find_zone!(app.config.time_zone) + end + + # Sets the default week start + # If assigned value is not a valid day symbol (e.g. :sunday, :monday, ...), an exception will be raised. + initializer "active_support.initialize_beginning_of_week" do |app| + require "active_support/core_ext/date/calculations" + beginning_of_week_default = Date.find_beginning_of_week!(app.config.beginning_of_week) + + Date.beginning_of_week_default = beginning_of_week_default + end + + initializer "active_support.require_master_key" do |app| + if app.config.respond_to?(:require_master_key) && app.config.require_master_key + begin + app.credentials.key + rescue ActiveSupport::EncryptedFile::MissingKeyError => error + $stderr.puts error.message + exit 1 + end + end + end + + initializer "active_support.set_configs" do |app| + app.config.active_support.each do |k, v| + k = "#{k}=" + ActiveSupport.send(k, v) if ActiveSupport.respond_to? k + end + end + + initializer "active_support.set_hash_digest_class" do |app| + config.after_initialize do + if app.config.active_support.use_sha1_digests + ActiveSupport::Digest.hash_digest_class = ::Digest::SHA1 + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/reloader.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/reloader.rb new file mode 100644 index 000000000000..2f81cd4f80b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/reloader.rb @@ -0,0 +1,130 @@ +# frozen_string_literal: true + +require "active_support/execution_wrapper" +require "active_support/executor" + +module ActiveSupport + #-- + # This class defines several callbacks: + # + # to_prepare -- Run once at application startup, and also from + # +to_run+. + # + # to_run -- Run before a work run that is reloading. If + # +reload_classes_only_on_change+ is true (the default), the class + # unload will have already occurred. + # + # to_complete -- Run after a work run that has reloaded. If + # +reload_classes_only_on_change+ is false, the class unload will + # have occurred after the work run, but before this callback. + # + # before_class_unload -- Run immediately before the classes are + # unloaded. + # + # after_class_unload -- Run immediately after the classes are + # unloaded. + # + class Reloader < ExecutionWrapper + define_callbacks :prepare + + define_callbacks :class_unload + + # Registers a callback that will run once at application startup and every time the code is reloaded. + def self.to_prepare(*args, &block) + set_callback(:prepare, *args, &block) + end + + # Registers a callback that will run immediately before the classes are unloaded. + def self.before_class_unload(*args, &block) + set_callback(:class_unload, *args, &block) + end + + # Registers a callback that will run immediately after the classes are unloaded. + def self.after_class_unload(*args, &block) + set_callback(:class_unload, :after, *args, &block) + end + + to_run(:after) { self.class.prepare! } + + # Initiate a manual reload + def self.reload! + executor.wrap do + new.tap do |instance| + instance.run! + ensure + instance.complete! + end + end + prepare! + end + + def self.run! # :nodoc: + if check! + super + else + Null + end + end + + # Run the supplied block as a work unit, reloading code as needed + def self.wrap + executor.wrap do + super + end + end + + class_attribute :executor, default: Executor + class_attribute :check, default: lambda { false } + + def self.check! # :nodoc: + @should_reload ||= check.call + end + + def self.reloaded! # :nodoc: + @should_reload = false + end + + def self.prepare! # :nodoc: + new.run_callbacks(:prepare) + end + + def initialize + super + @locked = false + end + + # Acquire the ActiveSupport::Dependencies::Interlock unload lock, + # ensuring it will be released automatically + def require_unload_lock! + unless @locked + ActiveSupport::Dependencies.interlock.start_unloading + @locked = true + end + end + + # Release the unload lock if it has been previously obtained + def release_unload_lock! + if @locked + @locked = false + ActiveSupport::Dependencies.interlock.done_unloading + end + end + + def run! # :nodoc: + super + release_unload_lock! + end + + def class_unload!(&block) # :nodoc: + require_unload_lock! + run_callbacks(:class_unload, &block) + end + + def complete! # :nodoc: + super + self.class.reloaded! + ensure + release_unload_lock! + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/rescuable.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/rescuable.rb new file mode 100644 index 000000000000..e0fa29cacb67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/rescuable.rb @@ -0,0 +1,174 @@ +# frozen_string_literal: true + +require "active_support/concern" +require "active_support/core_ext/class/attribute" +require "active_support/core_ext/string/inflections" + +module ActiveSupport + # Rescuable module adds support for easier exception handling. + module Rescuable + extend Concern + + included do + class_attribute :rescue_handlers, default: [] + end + + module ClassMethods + # Rescue exceptions raised in controller actions. + # + # rescue_from receives a series of exception classes or class + # names, and a trailing :with option with the name of a method + # or a Proc object to be called to handle them. Alternatively a block can + # be given. + # + # Handlers that take one argument will be called with the exception, so + # that the exception can be inspected when dealing with it. + # + # Handlers are inherited. They are searched from right to left, from + # bottom to top, and up the hierarchy. The handler of the first class for + # which exception.is_a?(klass) holds true is the one invoked, if + # any. + # + # class ApplicationController < ActionController::Base + # rescue_from User::NotAuthorized, with: :deny_access # self defined exception + # rescue_from ActiveRecord::RecordInvalid, with: :show_errors + # + # rescue_from 'MyAppError::Base' do |exception| + # render xml: exception, status: 500 + # end + # + # private + # def deny_access + # ... + # end + # + # def show_errors(exception) + # exception.record.new_record? ? ... + # end + # end + # + # Exceptions raised inside exception handlers are not propagated up. + def rescue_from(*klasses, with: nil, &block) + unless with + if block_given? + with = block + else + raise ArgumentError, "Need a handler. Pass the with: keyword argument or provide a block." + end + end + + klasses.each do |klass| + key = if klass.is_a?(Module) && klass.respond_to?(:===) + klass.name + elsif klass.is_a?(String) + klass + else + raise ArgumentError, "#{klass.inspect} must be an Exception class or a String referencing an Exception class" + end + + # Put the new handler at the end because the list is read in reverse. + self.rescue_handlers += [[key, with]] + end + end + + # Matches an exception to a handler based on the exception class. + # + # If no handler matches the exception, check for a handler matching the + # (optional) exception.cause. If no handler matches the exception or its + # cause, this returns +nil+, so you can deal with unhandled exceptions. + # Be sure to re-raise unhandled exceptions if this is what you expect. + # + # begin + # … + # rescue => exception + # rescue_with_handler(exception) || raise + # end + # + # Returns the exception if it was handled and +nil+ if it was not. + def rescue_with_handler(exception, object: self, visited_exceptions: []) + visited_exceptions << exception + + if handler = handler_for_rescue(exception, object: object) + handler.call exception + exception + elsif exception + if visited_exceptions.include?(exception.cause) + nil + else + rescue_with_handler(exception.cause, object: object, visited_exceptions: visited_exceptions) + end + end + end + + def handler_for_rescue(exception, object: self) #:nodoc: + case rescuer = find_rescue_handler(exception) + when Symbol + method = object.method(rescuer) + if method.arity == 0 + -> e { method.call } + else + method + end + when Proc + if rescuer.arity == 0 + -> e { object.instance_exec(&rescuer) } + else + -> e { object.instance_exec(e, &rescuer) } + end + end + end + + private + def find_rescue_handler(exception) + if exception + # Handlers are in order of declaration but the most recently declared + # is the highest priority match, so we search for matching handlers + # in reverse. + _, handler = rescue_handlers.reverse_each.detect do |class_or_name, _| + if klass = constantize_rescue_handler_class(class_or_name) + klass === exception + end + end + + handler + end + end + + def constantize_rescue_handler_class(class_or_name) + case class_or_name + when String, Symbol + begin + # Try a lexical lookup first since we support + # + # class Super + # rescue_from 'Error', with: … + # end + # + # class Sub + # class Error < StandardError; end + # end + # + # so an Error raised in Sub will hit the 'Error' handler. + const_get class_or_name + rescue NameError + class_or_name.safe_constantize + end + else + class_or_name + end + end + end + + # Delegates to the class method, but uses the instance as the subject for + # rescue_from handlers (method calls, instance_exec blocks). + def rescue_with_handler(exception) + self.class.rescue_with_handler exception, object: self + end + + # Internal handler lookup. Delegates to class method. Some libraries call + # this directly, so keeping it around for compatibility. + def handler_for_rescue(exception) #:nodoc: + self.class.handler_for_rescue exception, object: self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/security_utils.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/security_utils.rb new file mode 100644 index 000000000000..5e455fca5775 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/security_utils.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require "digest/sha2" + +module ActiveSupport + module SecurityUtils + # Constant time string comparison, for fixed length strings. + # + # The values compared should be of fixed length, such as strings + # that have already been processed by HMAC. Raises in case of length mismatch. + def fixed_length_secure_compare(a, b) + raise ArgumentError, "string length mismatch." unless a.bytesize == b.bytesize + + l = a.unpack "C#{a.bytesize}" + + res = 0 + b.each_byte { |byte| res |= byte ^ l.shift } + res == 0 + end + module_function :fixed_length_secure_compare + + # Constant time string comparison, for variable length strings. + # + # The values are first processed by SHA256, so that we don't leak length info + # via timing attacks. + def secure_compare(a, b) + fixed_length_secure_compare(::Digest::SHA256.digest(a), ::Digest::SHA256.digest(b)) && a == b + end + module_function :secure_compare + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/string_inquirer.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/string_inquirer.rb new file mode 100644 index 000000000000..e5091e127a06 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/string_inquirer.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module ActiveSupport + # Wrapping a string in this class gives you a prettier way to test + # for equality. The value returned by Rails.env is wrapped + # in a StringInquirer object, so instead of calling this: + # + # Rails.env == 'production' + # + # you can call this: + # + # Rails.env.production? + # + # == Instantiating a new StringInquirer + # + # vehicle = ActiveSupport::StringInquirer.new('car') + # vehicle.car? # => true + # vehicle.bike? # => false + class StringInquirer < String + private + def respond_to_missing?(method_name, include_private = false) + (method_name[-1] == "?") || super + end + + def method_missing(method_name, *arguments) + if method_name[-1] == "?" + self == method_name[0..-2] + else + super + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/subscriber.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/subscriber.rb new file mode 100644 index 000000000000..c3cd175a5280 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/subscriber.rb @@ -0,0 +1,169 @@ +# frozen_string_literal: true + +require "active_support/per_thread_registry" +require "active_support/notifications" + +module ActiveSupport + # ActiveSupport::Subscriber is an object set to consume + # ActiveSupport::Notifications. The subscriber dispatches notifications to + # a registered object based on its given namespace. + # + # An example would be an Active Record subscriber responsible for collecting + # statistics about queries: + # + # module ActiveRecord + # class StatsSubscriber < ActiveSupport::Subscriber + # attach_to :active_record + # + # def sql(event) + # Statsd.timing("sql.#{event.payload[:name]}", event.duration) + # end + # end + # end + # + # After configured, whenever a "sql.active_record" notification is published, + # it will properly dispatch the event (ActiveSupport::Notifications::Event) to + # the +sql+ method. + # + # We can detach a subscriber as well: + # + # ActiveRecord::StatsSubscriber.detach_from(:active_record) + class Subscriber + class << self + # Attach the subscriber to a namespace. + def attach_to(namespace, subscriber = new, notifier = ActiveSupport::Notifications) + @namespace = namespace + @subscriber = subscriber + @notifier = notifier + + subscribers << subscriber + + # Add event subscribers for all existing methods on the class. + subscriber.public_methods(false).each do |event| + add_event_subscriber(event) + end + end + + # Detach the subscriber from a namespace. + def detach_from(namespace, notifier = ActiveSupport::Notifications) + @namespace = namespace + @subscriber = find_attached_subscriber + @notifier = notifier + + return unless subscriber + + subscribers.delete(subscriber) + + # Remove event subscribers of all existing methods on the class. + subscriber.public_methods(false).each do |event| + remove_event_subscriber(event) + end + + # Reset notifier so that event subscribers will not add for new methods added to the class. + @notifier = nil + end + + # Adds event subscribers for all new methods added to the class. + def method_added(event) + # Only public methods are added as subscribers, and only if a notifier + # has been set up. This means that subscribers will only be set up for + # classes that call #attach_to. + if public_method_defined?(event) && notifier + add_event_subscriber(event) + end + end + + def subscribers + @@subscribers ||= [] + end + + private + attr_reader :subscriber, :notifier, :namespace + + def add_event_subscriber(event) # :doc: + return if invalid_event?(event.to_s) + + pattern = prepare_pattern(event) + + # Don't add multiple subscribers (eg. if methods are redefined). + return if pattern_subscribed?(pattern) + + subscriber.patterns[pattern] = notifier.subscribe(pattern, subscriber) + end + + def remove_event_subscriber(event) # :doc: + return if invalid_event?(event.to_s) + + pattern = prepare_pattern(event) + + return unless pattern_subscribed?(pattern) + + notifier.unsubscribe(subscriber.patterns[pattern]) + subscriber.patterns.delete(pattern) + end + + def find_attached_subscriber + subscribers.find { |attached_subscriber| attached_subscriber.instance_of?(self) } + end + + def invalid_event?(event) + %w{ start finish }.include?(event.to_s) + end + + def prepare_pattern(event) + "#{event}.#{namespace}" + end + + def pattern_subscribed?(pattern) + subscriber.patterns.key?(pattern) + end + end + + attr_reader :patterns # :nodoc: + + def initialize + @queue_key = [self.class.name, object_id].join "-" + @patterns = {} + super + end + + def start(name, id, payload) + event = ActiveSupport::Notifications::Event.new(name, nil, nil, id, payload) + event.start! + parent = event_stack.last + parent << event if parent + + event_stack.push event + end + + def finish(name, id, payload) + event = event_stack.pop + event.finish! + event.payload.merge!(payload) + + method = name.split(".").first + send(method, event) + end + + private + def event_stack + SubscriberQueueRegistry.instance.get_queue(@queue_key) + end + end + + # This is a registry for all the event stacks kept for subscribers. + # + # See the documentation of ActiveSupport::PerThreadRegistry + # for further details. + class SubscriberQueueRegistry # :nodoc: + extend PerThreadRegistry + + def initialize + @registry = {} + end + + def get_queue(queue_key) + @registry[queue_key] ||= [] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/tagged_logging.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/tagged_logging.rb new file mode 100644 index 000000000000..d8a86d997e4e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/tagged_logging.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/delegation" +require "active_support/core_ext/object/blank" +require "logger" +require "active_support/logger" + +module ActiveSupport + # Wraps any standard Logger object to provide tagging capabilities. + # + # logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT)) + # logger.tagged('BCX') { logger.info 'Stuff' } # Logs "[BCX] Stuff" + # logger.tagged('BCX', "Jason") { logger.info 'Stuff' } # Logs "[BCX] [Jason] Stuff" + # logger.tagged('BCX') { logger.tagged('Jason') { logger.info 'Stuff' } } # Logs "[BCX] [Jason] Stuff" + # + # This is used by the default Rails.logger as configured by Railties to make + # it easy to stamp log lines with subdomains, request ids, and anything else + # to aid debugging of multi-user production applications. + module TaggedLogging + module Formatter # :nodoc: + # This method is invoked when a log event occurs. + def call(severity, timestamp, progname, msg) + super(severity, timestamp, progname, "#{tags_text}#{msg}") + end + + def tagged(*tags) + new_tags = push_tags(*tags) + yield self + ensure + pop_tags(new_tags.size) + end + + def push_tags(*tags) + tags.flatten.reject(&:blank?).tap do |new_tags| + current_tags.concat new_tags + end + end + + def pop_tags(size = 1) + current_tags.pop size + end + + def clear_tags! + current_tags.clear + end + + def current_tags + # We use our object ID here to avoid conflicting with other instances + thread_key = @thread_key ||= "activesupport_tagged_logging_tags:#{object_id}" + Thread.current[thread_key] ||= [] + end + + def tags_text + tags = current_tags + if tags.one? + "[#{tags[0]}] " + elsif tags.any? + tags.collect { |tag| "[#{tag}] " }.join + end + end + end + + def self.new(logger) + logger = logger.dup + + if logger.formatter + logger.formatter = logger.formatter.dup + else + # Ensure we set a default formatter so we aren't extending nil! + logger.formatter = ActiveSupport::Logger::SimpleFormatter.new + end + + logger.formatter.extend Formatter + logger.extend(self) + end + + delegate :push_tags, :pop_tags, :clear_tags!, to: :formatter + + def tagged(*tags) + formatter.tagged(*tags) { yield self } + end + + def flush + clear_tags! + super if defined?(super) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/test_case.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/test_case.rb new file mode 100644 index 000000000000..7be4108ed770 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/test_case.rb @@ -0,0 +1,163 @@ +# frozen_string_literal: true + +gem "minitest" # make sure we get the gem, not stdlib +require "minitest" +require "active_support/testing/tagged_logging" +require "active_support/testing/setup_and_teardown" +require "active_support/testing/assertions" +require "active_support/testing/deprecation" +require "active_support/testing/declarative" +require "active_support/testing/isolation" +require "active_support/testing/constant_lookup" +require "active_support/testing/time_helpers" +require "active_support/testing/file_fixtures" +require "active_support/testing/parallelization" +require "concurrent/utility/processor_counter" + +module ActiveSupport + class TestCase < ::Minitest::Test + Assertion = Minitest::Assertion + + class << self + # Sets the order in which test cases are run. + # + # ActiveSupport::TestCase.test_order = :random # => :random + # + # Valid values are: + # * +:random+ (to run tests in random order) + # * +:parallel+ (to run tests in parallel) + # * +:sorted+ (to run tests alphabetically by method name) + # * +:alpha+ (equivalent to +:sorted+) + def test_order=(new_order) + ActiveSupport.test_order = new_order + end + + # Returns the order in which test cases are run. + # + # ActiveSupport::TestCase.test_order # => :random + # + # Possible values are +:random+, +:parallel+, +:alpha+, +:sorted+. + # Defaults to +:random+. + def test_order + ActiveSupport.test_order ||= :random + end + + # Parallelizes the test suite. + # + # Takes a +workers+ argument that controls how many times the process + # is forked. For each process a new database will be created suffixed + # with the worker number. + # + # test-database-0 + # test-database-1 + # + # If ENV["PARALLEL_WORKERS"] is set the workers argument will be ignored + # and the environment variable will be used instead. This is useful for CI + # environments, or other environments where you may need more workers than + # you do for local testing. + # + # If the number of workers is set to +1+ or fewer, the tests will not be + # parallelized. + # + # If +workers+ is set to +:number_of_processors+, the number of workers will be + # set to the actual core count on the machine you are on. + # + # The default parallelization method is to fork processes. If you'd like to + # use threads instead you can pass with: :threads to the +parallelize+ + # method. Note the threaded parallelization does not create multiple + # database and will not work with system tests at this time. + # + # parallelize(workers: :number_of_processors, with: :threads) + # + # The threaded parallelization uses minitest's parallel executor directly. + # The processes parallelization uses a Ruby DRb server. + def parallelize(workers: :number_of_processors, with: :processes) + workers = Concurrent.physical_processor_count if workers == :number_of_processors + workers = ENV["PARALLEL_WORKERS"].to_i if ENV["PARALLEL_WORKERS"] + + return if workers <= 1 + + executor = case with + when :processes + Testing::Parallelization.new(workers) + when :threads + Minitest::Parallel::Executor.new(workers) + else + raise ArgumentError, "#{with} is not a supported parallelization executor." + end + + self.lock_threads = false if defined?(self.lock_threads) && with == :threads + + Minitest.parallel_executor = executor + + parallelize_me! + end + + # Set up hook for parallel testing. This can be used if you have multiple + # databases or any behavior that needs to be run after the process is forked + # but before the tests run. + # + # Note: this feature is not available with the threaded parallelization. + # + # In your +test_helper.rb+ add the following: + # + # class ActiveSupport::TestCase + # parallelize_setup do + # # create databases + # end + # end + def parallelize_setup(&block) + ActiveSupport::Testing::Parallelization.after_fork_hook do |worker| + yield worker + end + end + + # Clean up hook for parallel testing. This can be used to drop databases + # if your app uses multiple write/read databases or other clean up before + # the tests finish. This runs before the forked process is closed. + # + # Note: this feature is not available with the threaded parallelization. + # + # In your +test_helper.rb+ add the following: + # + # class ActiveSupport::TestCase + # parallelize_teardown do + # # drop databases + # end + # end + def parallelize_teardown(&block) + ActiveSupport::Testing::Parallelization.run_cleanup_hook do |worker| + yield worker + end + end + end + + alias_method :method_name, :name + + include ActiveSupport::Testing::TaggedLogging + prepend ActiveSupport::Testing::SetupAndTeardown + include ActiveSupport::Testing::Assertions + include ActiveSupport::Testing::Deprecation + include ActiveSupport::Testing::TimeHelpers + include ActiveSupport::Testing::FileFixtures + extend ActiveSupport::Testing::Declarative + + # test/unit backwards compatibility methods + alias :assert_raise :assert_raises + alias :assert_not_empty :refute_empty + alias :assert_not_equal :refute_equal + alias :assert_not_in_delta :refute_in_delta + alias :assert_not_in_epsilon :refute_in_epsilon + alias :assert_not_includes :refute_includes + alias :assert_not_instance_of :refute_instance_of + alias :assert_not_kind_of :refute_kind_of + alias :assert_no_match :refute_match + alias :assert_not_nil :refute_nil + alias :assert_not_operator :refute_operator + alias :assert_not_predicate :refute_predicate + alias :assert_not_respond_to :refute_respond_to + alias :assert_not_same :refute_same + + ActiveSupport.run_load_hooks(:active_support_test_case, self) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/assertions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/assertions.rb new file mode 100644 index 000000000000..b27ac7ce990b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/assertions.rb @@ -0,0 +1,228 @@ +# frozen_string_literal: true + +module ActiveSupport + module Testing + module Assertions + UNTRACKED = Object.new # :nodoc: + + # Asserts that an expression is not truthy. Passes if object is + # +nil+ or +false+. "Truthy" means "considered true in a conditional" + # like if foo. + # + # assert_not nil # => true + # assert_not false # => true + # assert_not 'foo' # => Expected "foo" to be nil or false + # + # An error message can be specified. + # + # assert_not foo, 'foo should be false' + def assert_not(object, message = nil) + message ||= "Expected #{mu_pp(object)} to be nil or false" + assert !object, message + end + + # Assertion that the block should not raise an exception. + # + # Passes if evaluated code in the yielded block raises no exception. + # + # assert_nothing_raised do + # perform_service(param: 'no_exception') + # end + def assert_nothing_raised + yield + end + + # Test numeric difference between the return value of an expression as a + # result of what is evaluated in the yielded block. + # + # assert_difference 'Article.count' do + # post :create, params: { article: {...} } + # end + # + # An arbitrary expression is passed in and evaluated. + # + # assert_difference 'Article.last.comments(:reload).size' do + # post :create, params: { comment: {...} } + # end + # + # An arbitrary positive or negative difference can be specified. + # The default is 1. + # + # assert_difference 'Article.count', -1 do + # post :delete, params: { id: ... } + # end + # + # An array of expressions can also be passed in and evaluated. + # + # assert_difference [ 'Article.count', 'Post.count' ], 2 do + # post :create, params: { article: {...} } + # end + # + # A hash of expressions/numeric differences can also be passed in and evaluated. + # + # assert_difference ->{ Article.count } => 1, ->{ Notification.count } => 2 do + # post :create, params: { article: {...} } + # end + # + # A lambda or a list of lambdas can be passed in and evaluated: + # + # assert_difference ->{ Article.count }, 2 do + # post :create, params: { article: {...} } + # end + # + # assert_difference [->{ Article.count }, ->{ Post.count }], 2 do + # post :create, params: { article: {...} } + # end + # + # An error message can be specified. + # + # assert_difference 'Article.count', -1, 'An Article should be destroyed' do + # post :delete, params: { id: ... } + # end + def assert_difference(expression, *args, &block) + expressions = + if expression.is_a?(Hash) + message = args[0] + expression + else + difference = args[0] || 1 + message = args[1] + Hash[Array(expression).map { |e| [e, difference] }] + end + + exps = expressions.keys.map { |e| + e.respond_to?(:call) ? e : lambda { eval(e, block.binding) } + } + before = exps.map(&:call) + + retval = yield + + expressions.zip(exps, before) do |(code, diff), exp, before_value| + error = "#{code.inspect} didn't change by #{diff}" + error = "#{message}.\n#{error}" if message + assert_equal(before_value + diff, exp.call, error) + end + + retval + end + + # Assertion that the numeric result of evaluating an expression is not + # changed before and after invoking the passed in block. + # + # assert_no_difference 'Article.count' do + # post :create, params: { article: invalid_attributes } + # end + # + # A lambda can be passed in and evaluated. + # + # assert_no_difference -> { Article.count } do + # post :create, params: { article: invalid_attributes } + # end + # + # An error message can be specified. + # + # assert_no_difference 'Article.count', 'An Article should not be created' do + # post :create, params: { article: invalid_attributes } + # end + # + # An array of expressions can also be passed in and evaluated. + # + # assert_no_difference [ 'Article.count', -> { Post.count } ] do + # post :create, params: { article: invalid_attributes } + # end + def assert_no_difference(expression, message = nil, &block) + assert_difference expression, 0, message, &block + end + + # Assertion that the result of evaluating an expression is changed before + # and after invoking the passed in block. + # + # assert_changes 'Status.all_good?' do + # post :create, params: { status: { ok: false } } + # end + # + # You can pass the block as a string to be evaluated in the context of + # the block. A lambda can be passed for the block as well. + # + # assert_changes -> { Status.all_good? } do + # post :create, params: { status: { ok: false } } + # end + # + # The assertion is useful to test side effects. The passed block can be + # anything that can be converted to string with #to_s. + # + # assert_changes :@object do + # @object = 42 + # end + # + # The keyword arguments :from and :to can be given to specify the + # expected initial value and the expected value after the block was + # executed. + # + # assert_changes :@object, from: nil, to: :foo do + # @object = :foo + # end + # + # An error message can be specified. + # + # assert_changes -> { Status.all_good? }, 'Expected the status to be bad' do + # post :create, params: { status: { incident: true } } + # end + def assert_changes(expression, message = nil, from: UNTRACKED, to: UNTRACKED, &block) + exp = expression.respond_to?(:call) ? expression : -> { eval(expression.to_s, block.binding) } + + before = exp.call + retval = yield + + unless from == UNTRACKED + error = "#{expression.inspect} isn't #{from.inspect}" + error = "#{message}.\n#{error}" if message + assert from === before, error + end + + after = exp.call + + error = "#{expression.inspect} didn't change" + error = "#{error}. It was already #{to}" if before == to + error = "#{message}.\n#{error}" if message + assert before != after, error + + unless to == UNTRACKED + error = "#{expression.inspect} didn't change to as expected\n" + error = "#{error}Expected: #{to.inspect}\n" + error = "#{error} Actual: #{after.inspect}" + error = "#{message}.\n#{error}" if message + assert to === after, error + end + + retval + end + + # Assertion that the result of evaluating an expression is not changed before + # and after invoking the passed in block. + # + # assert_no_changes 'Status.all_good?' do + # post :create, params: { status: { ok: true } } + # end + # + # An error message can be specified. + # + # assert_no_changes -> { Status.all_good? }, 'Expected the status to be good' do + # post :create, params: { status: { ok: false } } + # end + def assert_no_changes(expression, message = nil, &block) + exp = expression.respond_to?(:call) ? expression : -> { eval(expression.to_s, block.binding) } + + before = exp.call + retval = yield + after = exp.call + + error = "#{expression.inspect} did change to #{after}" + error = "#{message}.\n#{error}" if message + assert before == after, error + + retval + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/autorun.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/autorun.rb new file mode 100644 index 000000000000..889b41659adf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/autorun.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +gem "minitest" + +require "minitest" + +Minitest.autorun diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/constant_lookup.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/constant_lookup.rb new file mode 100644 index 000000000000..51167e92377d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/constant_lookup.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require "active_support/concern" +require "active_support/inflector" + +module ActiveSupport + module Testing + # Resolves a constant from a minitest spec name. + # + # Given the following spec-style test: + # + # describe WidgetsController, :index do + # describe "authenticated user" do + # describe "returns widgets" do + # it "has a controller that exists" do + # assert_kind_of WidgetsController, @controller + # end + # end + # end + # end + # + # The test will have the following name: + # + # "WidgetsController::index::authenticated user::returns widgets" + # + # The constant WidgetsController can be resolved from the name. + # The following code will resolve the constant: + # + # controller = determine_constant_from_test_name(name) do |constant| + # Class === constant && constant < ::ActionController::Metal + # end + module ConstantLookup + extend ::ActiveSupport::Concern + + module ClassMethods # :nodoc: + def determine_constant_from_test_name(test_name) + names = test_name.split "::" + while names.size > 0 do + names.last.sub!(/Test$/, "") + begin + constant = names.join("::").safe_constantize + break(constant) if yield(constant) + ensure + names.pop + end + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/declarative.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/declarative.rb new file mode 100644 index 000000000000..7c3403684d1f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/declarative.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module ActiveSupport + module Testing + module Declarative + unless defined?(Spec) + # Helper to define a test method using a String. Under the hood, it replaces + # spaces with underscores and defines the test method. + # + # test "verify something" do + # ... + # end + def test(name, &block) + test_name = "test_#{name.gsub(/\s+/, '_')}".to_sym + defined = method_defined? test_name + raise "#{test_name} is already defined in #{self}" if defined + if block_given? + define_method(test_name, &block) + else + define_method(test_name) do + flunk "No implementation provided for #{name}" + end + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/deprecation.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/deprecation.rb new file mode 100644 index 000000000000..18d63d2780d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/deprecation.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require "active_support/deprecation" + +module ActiveSupport + module Testing + module Deprecation #:nodoc: + def assert_deprecated(match = nil, deprecator = nil, &block) + result, warnings = collect_deprecations(deprecator, &block) + assert !warnings.empty?, "Expected a deprecation warning within the block but received none" + if match + match = Regexp.new(Regexp.escape(match)) unless match.is_a?(Regexp) + assert warnings.any? { |w| match.match?(w) }, "No deprecation warning matched #{match}: #{warnings.join(', ')}" + end + result + end + + def assert_not_deprecated(deprecator = nil, &block) + result, deprecations = collect_deprecations(deprecator, &block) + assert deprecations.empty?, "Expected no deprecation warning within the block but received #{deprecations.size}: \n #{deprecations * "\n "}" + result + end + + def collect_deprecations(deprecator = nil) + deprecator ||= ActiveSupport::Deprecation + old_behavior = deprecator.behavior + deprecations = [] + deprecator.behavior = Proc.new do |message, callstack| + deprecations << message + end + result = yield + [result, deprecations] + ensure + deprecator.behavior = old_behavior + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/file_fixtures.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/file_fixtures.rb new file mode 100644 index 000000000000..4eb7a88576e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/file_fixtures.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require "active_support/concern" + +module ActiveSupport + module Testing + # Adds simple access to sample files called file fixtures. + # File fixtures are normal files stored in + # ActiveSupport::TestCase.file_fixture_path. + # + # File fixtures are represented as +Pathname+ objects. + # This makes it easy to extract specific information: + # + # file_fixture("example.txt").read # get the file's content + # file_fixture("example.mp3").size # get the file size + module FileFixtures + extend ActiveSupport::Concern + + included do + class_attribute :file_fixture_path, instance_writer: false + end + + # Returns a +Pathname+ to the fixture file named +fixture_name+. + # + # Raises +ArgumentError+ if +fixture_name+ can't be found. + def file_fixture(fixture_name) + path = Pathname.new(File.join(file_fixture_path, fixture_name)) + + if path.exist? + path + else + msg = "the directory '%s' does not contain a file named '%s'" + raise ArgumentError, msg % [file_fixture_path, fixture_name] + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/isolation.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/isolation.rb new file mode 100644 index 000000000000..652a10da2323 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/isolation.rb @@ -0,0 +1,110 @@ +# frozen_string_literal: true + +module ActiveSupport + module Testing + module Isolation + require "thread" + + def self.included(klass) #:nodoc: + klass.class_eval do + parallelize_me! + end + end + + def self.forking_env? + !ENV["NO_FORK"] && Process.respond_to?(:fork) + end + + def run + serialized = run_in_isolation do + super + end + + Marshal.load(serialized) + end + + module Forking + def run_in_isolation(&blk) + read, write = IO.pipe + read.binmode + write.binmode + + pid = fork do + read.close + yield + begin + if error? + failures.map! { |e| + begin + Marshal.dump e + e + rescue TypeError + ex = Exception.new e.message + ex.set_backtrace e.backtrace + Minitest::UnexpectedError.new ex + end + } + end + test_result = defined?(Minitest::Result) ? Minitest::Result.from(self) : dup + result = Marshal.dump(test_result) + end + + write.puts [result].pack("m") + exit! + end + + write.close + result = read.read + Process.wait2(pid) + result.unpack1("m") + end + end + + module Subprocess + ORIG_ARGV = ARGV.dup unless defined?(ORIG_ARGV) + + # Crazy H4X to get this working in windows / jruby with + # no forking. + def run_in_isolation(&blk) + require "tempfile" + + if ENV["ISOLATION_TEST"] + yield + test_result = defined?(Minitest::Result) ? Minitest::Result.from(self) : dup + File.open(ENV["ISOLATION_OUTPUT"], "w") do |file| + file.puts [Marshal.dump(test_result)].pack("m") + end + exit! + else + Tempfile.open("isolation") do |tmpfile| + env = { + "ISOLATION_TEST" => self.class.name, + "ISOLATION_OUTPUT" => tmpfile.path + } + + test_opts = "-n#{self.class.name}##{name}" + + load_path_args = [] + $-I.each do |p| + load_path_args << "-I" + load_path_args << File.expand_path(p) + end + + child = IO.popen([env, Gem.ruby, *load_path_args, $0, *ORIG_ARGV, test_opts]) + + begin + Process.wait(child.pid) + rescue Errno::ECHILD # The child process may exit before we wait + nil + end + + return tmpfile.read.unpack1("m") + end + end + end + end + + include forking_env? ? Forking : Subprocess + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/method_call_assertions.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/method_call_assertions.rb new file mode 100644 index 000000000000..03c38be48162 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/method_call_assertions.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require "minitest/mock" + +module ActiveSupport + module Testing + module MethodCallAssertions # :nodoc: + private + def assert_called(object, method_name, message = nil, times: 1, returns: nil) + times_called = 0 + + object.stub(method_name, proc { times_called += 1; returns }) { yield } + + error = "Expected #{method_name} to be called #{times} times, " \ + "but was called #{times_called} times" + error = "#{message}.\n#{error}" if message + assert_equal times, times_called, error + end + + def assert_called_with(object, method_name, args, returns: nil) + mock = Minitest::Mock.new + + if args.all? { |arg| arg.is_a?(Array) } + args.each { |arg| mock.expect(:call, returns, arg) } + else + mock.expect(:call, returns, args) + end + + object.stub(method_name, mock) { yield } + + mock.verify + end + + def assert_not_called(object, method_name, message = nil, &block) + assert_called(object, method_name, message, times: 0, &block) + end + + def assert_called_on_instance_of(klass, method_name, message = nil, times: 1, returns: nil) + times_called = 0 + klass.define_method("stubbed_#{method_name}") do |*| + times_called += 1 + + returns + end + + klass.alias_method "original_#{method_name}", method_name + klass.alias_method method_name, "stubbed_#{method_name}" + + yield + + error = "Expected #{method_name} to be called #{times} times, but was called #{times_called} times" + error = "#{message}.\n#{error}" if message + + assert_equal times, times_called, error + ensure + klass.alias_method method_name, "original_#{method_name}" + klass.undef_method "original_#{method_name}" + klass.undef_method "stubbed_#{method_name}" + end + + def assert_not_called_on_instance_of(klass, method_name, message = nil, &block) + assert_called_on_instance_of(klass, method_name, message, times: 0, &block) + end + + def stub_any_instance(klass, instance: klass.new) + klass.stub(:new, instance) { yield instance } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/parallelization.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/parallelization.rb new file mode 100644 index 000000000000..6ecb6eae8f1f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/parallelization.rb @@ -0,0 +1,134 @@ +# frozen_string_literal: true + +require "drb" +require "drb/unix" unless Gem.win_platform? +require "active_support/core_ext/module/attribute_accessors" + +module ActiveSupport + module Testing + class Parallelization # :nodoc: + class Server + include DRb::DRbUndumped + + def initialize + @queue = Queue.new + end + + def record(reporter, result) + raise DRb::DRbConnError if result.is_a?(DRb::DRbUnknown) + + reporter.synchronize do + reporter.record(result) + end + end + + def <<(o) + o[2] = DRbObject.new(o[2]) if o + @queue << o + end + + def length + @queue.length + end + + def pop; @queue.pop; end + end + + @@after_fork_hooks = [] + + def self.after_fork_hook(&blk) + @@after_fork_hooks << blk + end + + cattr_reader :after_fork_hooks + + @@run_cleanup_hooks = [] + + def self.run_cleanup_hook(&blk) + @@run_cleanup_hooks << blk + end + + cattr_reader :run_cleanup_hooks + + def initialize(queue_size) + @queue_size = queue_size + @queue = Server.new + @pool = [] + + @url = DRb.start_service("drbunix:", @queue).uri + end + + def after_fork(worker) + self.class.after_fork_hooks.each do |cb| + cb.call(worker) + end + end + + def run_cleanup(worker) + self.class.run_cleanup_hooks.each do |cb| + cb.call(worker) + end + end + + def start + @pool = @queue_size.times.map do |worker| + fork do + DRb.stop_service + + begin + after_fork(worker) + rescue => setup_exception; end + + queue = DRbObject.new_with_uri(@url) + + while job = queue.pop + klass = job[0] + method = job[1] + reporter = job[2] + result = klass.with_info_handler reporter do + Minitest.run_one_method(klass, method) + end + + add_setup_exception(result, setup_exception) if setup_exception + + begin + queue.record(reporter, result) + rescue DRb::DRbConnError + result.failures.map! do |failure| + if failure.respond_to?(:error) + # minitest >5.14.0 + error = DRb::DRbRemoteError.new(failure.error) + else + error = DRb::DRbRemoteError.new(failure.exception) + end + Minitest::UnexpectedError.new(error) + end + queue.record(reporter, result) + end + end + ensure + run_cleanup(worker) + end + end + end + + def <<(work) + @queue << work + end + + def shutdown + @queue_size.times { @queue << nil } + @pool.each { |pid| Process.waitpid pid } + + if @queue.length > 0 + raise "Queue not empty, but all workers have finished. This probably means that a worker crashed and #{@queue.length} tests were missed." + end + end + + private + def add_setup_exception(result, setup_exception) + result.failures.prepend Minitest::UnexpectedError.new(setup_exception) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/setup_and_teardown.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/setup_and_teardown.rb new file mode 100644 index 000000000000..35321cd15746 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/setup_and_teardown.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require "active_support/callbacks" + +module ActiveSupport + module Testing + # Adds support for +setup+ and +teardown+ callbacks. + # These callbacks serve as a replacement to overwriting the + # #setup and #teardown methods of your TestCase. + # + # class ExampleTest < ActiveSupport::TestCase + # setup do + # # ... + # end + # + # teardown do + # # ... + # end + # end + module SetupAndTeardown + def self.prepended(klass) + klass.include ActiveSupport::Callbacks + klass.define_callbacks :setup, :teardown + klass.extend ClassMethods + end + + module ClassMethods + # Add a callback, which runs before TestCase#setup. + def setup(*args, &block) + set_callback(:setup, :before, *args, &block) + end + + # Add a callback, which runs after TestCase#teardown. + def teardown(*args, &block) + set_callback(:teardown, :after, *args, &block) + end + end + + def before_setup # :nodoc: + super + run_callbacks :setup + end + + def after_teardown # :nodoc: + begin + run_callbacks :teardown + rescue => e + self.failures << Minitest::UnexpectedError.new(e) + end + + super + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/stream.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/stream.rb new file mode 100644 index 000000000000..f895a746445d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/stream.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module ActiveSupport + module Testing + module Stream #:nodoc: + private + def silence_stream(stream) + old_stream = stream.dup + stream.reopen(IO::NULL) + stream.sync = true + yield + ensure + stream.reopen(old_stream) + old_stream.close + end + + def quietly + silence_stream(STDOUT) do + silence_stream(STDERR) do + yield + end + end + end + + def capture(stream) + stream = stream.to_s + captured_stream = Tempfile.new(stream) + stream_io = eval("$#{stream}") + origin_stream = stream_io.dup + stream_io.reopen(captured_stream) + + yield + + stream_io.rewind + captured_stream.read + ensure + captured_stream.close + captured_stream.unlink + stream_io.reopen(origin_stream) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/tagged_logging.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/tagged_logging.rb new file mode 100644 index 000000000000..9ca50c791894 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/tagged_logging.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module ActiveSupport + module Testing + # Logs a "PostsControllerTest: test name" heading before each test to + # make test.log easier to search and follow along with. + module TaggedLogging #:nodoc: + attr_writer :tagged_logger + + def before_setup + if tagged_logger && tagged_logger.info? + heading = "#{self.class}: #{name}" + divider = "-" * heading.size + tagged_logger.info divider + tagged_logger.info heading + tagged_logger.info divider + end + super + end + + private + def tagged_logger + @tagged_logger ||= (defined?(Rails.logger) && Rails.logger) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/time_helpers.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/time_helpers.rb new file mode 100644 index 000000000000..84bd920d8609 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/testing/time_helpers.rb @@ -0,0 +1,198 @@ +# frozen_string_literal: true + +require "active_support/core_ext/module/redefine_method" +require "active_support/core_ext/time/calculations" +require "concurrent/map" + +module ActiveSupport + module Testing + class SimpleStubs # :nodoc: + Stub = Struct.new(:object, :method_name, :original_method) + + def initialize + @stubs = Concurrent::Map.new { |h, k| h[k] = {} } + end + + def stub_object(object, method_name, &block) + if stub = stubbing(object, method_name) + unstub_object(stub) + end + + new_name = "__simple_stub__#{method_name}" + + @stubs[object.object_id][method_name] = Stub.new(object, method_name, new_name) + + object.singleton_class.alias_method new_name, method_name + object.define_singleton_method(method_name, &block) + end + + def unstub_all! + @stubs.each_value do |object_stubs| + object_stubs.each_value do |stub| + unstub_object(stub) + end + end + @stubs.clear + end + + def stubbing(object, method_name) + @stubs[object.object_id][method_name] + end + + private + def unstub_object(stub) + singleton_class = stub.object.singleton_class + singleton_class.silence_redefinition_of_method stub.method_name + singleton_class.alias_method stub.method_name, stub.original_method + singleton_class.undef_method stub.original_method + end + end + + # Contains helpers that help you test passage of time. + module TimeHelpers + def after_teardown + travel_back + super + end + + # Changes current time to the time in the future or in the past by a given time difference by + # stubbing +Time.now+, +Date.today+, and +DateTime.now+. The stubs are automatically removed + # at the end of the test. + # + # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 + # travel 1.day + # Time.current # => Sun, 10 Nov 2013 15:34:49 EST -05:00 + # Date.current # => Sun, 10 Nov 2013 + # DateTime.current # => Sun, 10 Nov 2013 15:34:49 -0500 + # + # This method also accepts a block, which will return the current time back to its original + # state at the end of the block: + # + # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 + # travel 1.day do + # User.create.created_at # => Sun, 10 Nov 2013 15:34:49 EST -05:00 + # end + # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 + def travel(duration, &block) + travel_to Time.now + duration, &block + end + + # Changes current time to the given time by stubbing +Time.now+, + # +Date.today+, and +DateTime.now+ to return the time or date passed into this method. + # The stubs are automatically removed at the end of the test. + # + # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 + # travel_to Time.zone.local(2004, 11, 24, 01, 04, 44) + # Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00 + # Date.current # => Wed, 24 Nov 2004 + # DateTime.current # => Wed, 24 Nov 2004 01:04:44 -0500 + # + # Dates are taken as their timestamp at the beginning of the day in the + # application time zone. Time.current returns said timestamp, + # and Time.now its equivalent in the system time zone. Similarly, + # Date.current returns a date equal to the argument, and + # Date.today the date according to Time.now, which may + # be different. (Note that you rarely want to deal with Time.now, + # or Date.today, in order to honor the application time zone + # please always use Time.current and Date.current.) + # + # Note that the usec for the time passed will be set to 0 to prevent rounding + # errors with external services, like MySQL (which will round instead of floor, + # leading to off-by-one-second errors). + # + # This method also accepts a block, which will return the current time back to its original + # state at the end of the block: + # + # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 + # travel_to Time.zone.local(2004, 11, 24, 01, 04, 44) do + # Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00 + # end + # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 + def travel_to(date_or_time) + if block_given? && simple_stubs.stubbing(Time, :now) + travel_to_nested_block_call = <<~MSG + + Calling `travel_to` with a block, when we have previously already made a call to `travel_to`, can lead to confusing time stubbing. + + Instead of: + + travel_to 2.days.from_now do + # 2 days from today + travel_to 3.days.from_now do + # 5 days from today + end + end + + preferred way to achieve above is: + + travel 2.days do + # 2 days from today + end + + travel 5.days do + # 5 days from today + end + + MSG + raise travel_to_nested_block_call + end + + if date_or_time.is_a?(Date) && !date_or_time.is_a?(DateTime) + now = date_or_time.midnight.to_time + else + now = date_or_time.to_time.change(usec: 0) + end + + simple_stubs.stub_object(Time, :now) { at(now.to_i) } + simple_stubs.stub_object(Date, :today) { jd(now.to_date.jd) } + simple_stubs.stub_object(DateTime, :now) { jd(now.to_date.jd, now.hour, now.min, now.sec, Rational(now.utc_offset, 86400)) } + + if block_given? + begin + yield + ensure + travel_back + end + end + end + + # Returns the current time back to its original state, by removing the stubs added by + # +travel+, +travel_to+, and +freeze_time+. + # + # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 + # travel_to Time.zone.local(2004, 11, 24, 01, 04, 44) + # Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00 + # travel_back + # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00 + def travel_back + simple_stubs.unstub_all! + end + alias_method :unfreeze_time, :travel_back + + # Calls +travel_to+ with +Time.now+. + # + # Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00 + # freeze_time + # sleep(1) + # Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00 + # + # This method also accepts a block, which will return the current time back to its original + # state at the end of the block: + # + # Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00 + # freeze_time do + # sleep(1) + # User.create.created_at # => Sun, 09 Jul 2017 15:34:49 EST -05:00 + # end + # Time.current # => Sun, 09 Jul 2017 15:34:50 EST -05:00 + def freeze_time(&block) + travel_to Time.now, &block + end + + private + def simple_stubs + @simple_stubs ||= SimpleStubs.new + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/time.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/time.rb new file mode 100644 index 000000000000..51854675bf54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/time.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module ActiveSupport + autoload :Duration, "active_support/duration" + autoload :TimeWithZone, "active_support/time_with_zone" + autoload :TimeZone, "active_support/values/time_zone" +end + +require "date" +require "time" + +require "active_support/core_ext/time" +require "active_support/core_ext/date" +require "active_support/core_ext/date_time" + +require "active_support/core_ext/integer/time" +require "active_support/core_ext/numeric/time" + +require "active_support/core_ext/string/conversions" +require "active_support/core_ext/string/zones" diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/time_with_zone.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/time_with_zone.rb new file mode 100644 index 000000000000..3be5f6f7b595 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/time_with_zone.rb @@ -0,0 +1,561 @@ +# frozen_string_literal: true + +require "active_support/duration" +require "active_support/values/time_zone" +require "active_support/core_ext/object/acts_like" +require "active_support/core_ext/date_and_time/compatibility" + +module ActiveSupport + # A Time-like class that can represent a time in any time zone. Necessary + # because standard Ruby Time instances are limited to UTC and the + # system's ENV['TZ'] zone. + # + # You shouldn't ever need to create a TimeWithZone instance directly via +new+. + # Instead use methods +local+, +parse+, +at+ and +now+ on TimeZone instances, + # and +in_time_zone+ on Time and DateTime instances. + # + # Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' + # Time.zone.local(2007, 2, 10, 15, 30, 45) # => Sat, 10 Feb 2007 15:30:45 EST -05:00 + # Time.zone.parse('2007-02-10 15:30:45') # => Sat, 10 Feb 2007 15:30:45 EST -05:00 + # Time.zone.at(1171139445) # => Sat, 10 Feb 2007 15:30:45 EST -05:00 + # Time.zone.now # => Sun, 18 May 2008 13:07:55 EDT -04:00 + # Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone # => Sat, 10 Feb 2007 15:30:45 EST -05:00 + # + # See Time and TimeZone for further documentation of these methods. + # + # TimeWithZone instances implement the same API as Ruby Time instances, so + # that Time and TimeWithZone instances are interchangeable. + # + # t = Time.zone.now # => Sun, 18 May 2008 13:27:25 EDT -04:00 + # t.hour # => 13 + # t.dst? # => true + # t.utc_offset # => -14400 + # t.zone # => "EDT" + # t.to_s(:rfc822) # => "Sun, 18 May 2008 13:27:25 -0400" + # t + 1.day # => Mon, 19 May 2008 13:27:25 EDT -04:00 + # t.beginning_of_year # => Tue, 01 Jan 2008 00:00:00 EST -05:00 + # t > Time.utc(1999) # => true + # t.is_a?(Time) # => true + # t.is_a?(ActiveSupport::TimeWithZone) # => true + class TimeWithZone + # Report class name as 'Time' to thwart type checking. + def self.name + "Time" + end + + PRECISIONS = Hash.new { |h, n| h[n] = "%FT%T.%#{n}N" } + PRECISIONS[0] = "%FT%T" + + include Comparable, DateAndTime::Compatibility + attr_reader :time_zone + + def initialize(utc_time, time_zone, local_time = nil, period = nil) + @utc = utc_time ? transfer_time_values_to_utc_constructor(utc_time) : nil + @time_zone, @time = time_zone, local_time + @period = @utc ? period : get_period_and_ensure_valid_local_time(period) + end + + # Returns a Time instance that represents the time in +time_zone+. + def time + @time ||= period.to_local(@utc) + end + + # Returns a Time instance of the simultaneous time in the UTC timezone. + def utc + @utc ||= period.to_utc(@time) + end + alias_method :comparable_time, :utc + alias_method :getgm, :utc + alias_method :getutc, :utc + alias_method :gmtime, :utc + + # Returns the underlying TZInfo::TimezonePeriod. + def period + @period ||= time_zone.period_for_utc(@utc) + end + + # Returns the simultaneous time in Time.zone, or the specified zone. + def in_time_zone(new_zone = ::Time.zone) + return self if time_zone == new_zone + utc.in_time_zone(new_zone) + end + + # Returns a Time instance of the simultaneous time in the system timezone. + def localtime(utc_offset = nil) + utc.getlocal(utc_offset) + end + alias_method :getlocal, :localtime + + # Returns true if the current time is within Daylight Savings Time for the + # specified time zone. + # + # Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' + # Time.zone.parse("2012-5-30").dst? # => true + # Time.zone.parse("2012-11-30").dst? # => false + def dst? + period.dst? + end + alias_method :isdst, :dst? + + # Returns true if the current time zone is set to UTC. + # + # Time.zone = 'UTC' # => 'UTC' + # Time.zone.now.utc? # => true + # Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' + # Time.zone.now.utc? # => false + def utc? + period.offset.abbreviation == :UTC || period.offset.abbreviation == :UCT + end + alias_method :gmt?, :utc? + + # Returns the offset from current time to UTC time in seconds. + def utc_offset + period.utc_total_offset + end + alias_method :gmt_offset, :utc_offset + alias_method :gmtoff, :utc_offset + + # Returns a formatted string of the offset from UTC, or an alternative + # string if the time zone is already UTC. + # + # Time.zone = 'Eastern Time (US & Canada)' # => "Eastern Time (US & Canada)" + # Time.zone.now.formatted_offset(true) # => "-05:00" + # Time.zone.now.formatted_offset(false) # => "-0500" + # Time.zone = 'UTC' # => "UTC" + # Time.zone.now.formatted_offset(true, "0") # => "0" + def formatted_offset(colon = true, alternate_utc_string = nil) + utc? && alternate_utc_string || TimeZone.seconds_to_utc_offset(utc_offset, colon) + end + + # Returns the time zone abbreviation. + # + # Time.zone = 'Eastern Time (US & Canada)' # => "Eastern Time (US & Canada)" + # Time.zone.now.zone # => "EST" + def zone + period.zone_identifier.to_s + end + + # Returns a string of the object's date, time, zone, and offset from UTC. + # + # Time.zone.now.inspect # => "Thu, 04 Dec 2014 11:00:25 EST -05:00" + def inspect + "#{time.strftime('%a, %d %b %Y %H:%M:%S')} #{zone} #{formatted_offset}" + end + + # Returns a string of the object's date and time in the ISO 8601 standard + # format. + # + # Time.zone.now.xmlschema # => "2014-12-04T11:02:37-05:00" + def xmlschema(fraction_digits = 0) + "#{time.strftime(PRECISIONS[fraction_digits.to_i])}#{formatted_offset(true, 'Z')}" + end + alias_method :iso8601, :xmlschema + alias_method :rfc3339, :xmlschema + + # Coerces time to a string for JSON encoding. The default format is ISO 8601. + # You can get %Y/%m/%d %H:%M:%S +offset style by setting + # ActiveSupport::JSON::Encoding.use_standard_json_time_format + # to +false+. + # + # # With ActiveSupport::JSON::Encoding.use_standard_json_time_format = true + # Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").to_json + # # => "2005-02-01T05:15:10.000-10:00" + # + # # With ActiveSupport::JSON::Encoding.use_standard_json_time_format = false + # Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").to_json + # # => "2005/02/01 05:15:10 -1000" + def as_json(options = nil) + if ActiveSupport::JSON::Encoding.use_standard_json_time_format + xmlschema(ActiveSupport::JSON::Encoding.time_precision) + else + %(#{time.strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)}) + end + end + + def init_with(coder) #:nodoc: + initialize(coder["utc"], coder["zone"], coder["time"]) + end + + def encode_with(coder) #:nodoc: + coder.tag = "!ruby/object:ActiveSupport::TimeWithZone" + coder.map = { "utc" => utc, "zone" => time_zone, "time" => time } + end + + # Returns a string of the object's date and time in the format used by + # HTTP requests. + # + # Time.zone.now.httpdate # => "Tue, 01 Jan 2013 04:39:43 GMT" + def httpdate + utc.httpdate + end + + # Returns a string of the object's date and time in the RFC 2822 standard + # format. + # + # Time.zone.now.rfc2822 # => "Tue, 01 Jan 2013 04:51:39 +0000" + def rfc2822 + to_s(:rfc822) + end + alias_method :rfc822, :rfc2822 + + # Returns a string of the object's date and time. + # Accepts an optional format: + # * :default - default value, mimics Ruby Time#to_s format. + # * :db - format outputs time in UTC :db time. See Time#to_formatted_s(:db). + # * Any key in Time::DATE_FORMATS can be used. See active_support/core_ext/time/conversions.rb. + def to_s(format = :default) + if format == :db + utc.to_s(format) + elsif formatter = ::Time::DATE_FORMATS[format] + formatter.respond_to?(:call) ? formatter.call(self).to_s : strftime(formatter) + else + "#{time.strftime("%Y-%m-%d %H:%M:%S")} #{formatted_offset(false, 'UTC')}" # mimicking Ruby Time#to_s format + end + end + alias_method :to_formatted_s, :to_s + + # Replaces %Z directive with +zone before passing to Time#strftime, + # so that zone information is correct. + def strftime(format) + format = format.gsub(/((?:\A|[^%])(?:%%)*)%Z/, "\\1#{zone}") + getlocal(utc_offset).strftime(format) + end + + # Use the time in UTC for comparisons. + def <=>(other) + utc <=> other + end + alias_method :before?, :< + alias_method :after?, :> + + # Returns true if the current object's time is within the specified + # +min+ and +max+ time. + def between?(min, max) + utc.between?(min, max) + end + + # Returns true if the current object's time is in the past. + def past? + utc.past? + end + + # Returns true if the current object's time falls within + # the current day. + def today? + time.today? + end + + # Returns true if the current object's time is in the future. + def future? + utc.future? + end + + # Returns +true+ if +other+ is equal to current object. + def eql?(other) + other.eql?(utc) + end + + def hash + utc.hash + end + + # Adds an interval of time to the current object's time and returns that + # value as a new TimeWithZone object. + # + # Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' + # now = Time.zone.now # => Sun, 02 Nov 2014 01:26:28 EDT -04:00 + # now + 1000 # => Sun, 02 Nov 2014 01:43:08 EDT -04:00 + # + # If we're adding a Duration of variable length (i.e., years, months, days), + # move forward from #time, otherwise move forward from #utc, for accuracy + # when moving across DST boundaries. + # + # For instance, a time + 24.hours will advance exactly 24 hours, while a + # time + 1.day will advance 23-25 hours, depending on the day. + # + # now + 24.hours # => Mon, 03 Nov 2014 00:26:28 EST -05:00 + # now + 1.day # => Mon, 03 Nov 2014 01:26:28 EST -05:00 + def +(other) + if duration_of_variable_length?(other) + method_missing(:+, other) + else + result = utc.acts_like?(:date) ? utc.since(other) : utc + other rescue utc.since(other) + result.in_time_zone(time_zone) + end + end + alias_method :since, :+ + alias_method :in, :+ + + # Subtracts an interval of time and returns a new TimeWithZone object unless + # the other value `acts_like?` time. Then it will return a Float of the difference + # between the two times that represents the difference between the current + # object's time and the +other+ time. + # + # Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' + # now = Time.zone.now # => Mon, 03 Nov 2014 00:26:28 EST -05:00 + # now - 1000 # => Mon, 03 Nov 2014 00:09:48 EST -05:00 + # + # If subtracting a Duration of variable length (i.e., years, months, days), + # move backward from #time, otherwise move backward from #utc, for accuracy + # when moving across DST boundaries. + # + # For instance, a time - 24.hours will go subtract exactly 24 hours, while a + # time - 1.day will subtract 23-25 hours, depending on the day. + # + # now - 24.hours # => Sun, 02 Nov 2014 01:26:28 EDT -04:00 + # now - 1.day # => Sun, 02 Nov 2014 00:26:28 EDT -04:00 + # + # If both the TimeWithZone object and the other value act like Time, a Float + # will be returned. + # + # Time.zone.now - 1.day.ago # => 86399.999967 + # + def -(other) + if other.acts_like?(:time) + to_time - other.to_time + elsif duration_of_variable_length?(other) + method_missing(:-, other) + else + result = utc.acts_like?(:date) ? utc.ago(other) : utc - other rescue utc.ago(other) + result.in_time_zone(time_zone) + end + end + + # Subtracts an interval of time from the current object's time and returns + # the result as a new TimeWithZone object. + # + # Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' + # now = Time.zone.now # => Mon, 03 Nov 2014 00:26:28 EST -05:00 + # now.ago(1000) # => Mon, 03 Nov 2014 00:09:48 EST -05:00 + # + # If we're subtracting a Duration of variable length (i.e., years, months, + # days), move backward from #time, otherwise move backward from #utc, for + # accuracy when moving across DST boundaries. + # + # For instance, time.ago(24.hours) will move back exactly 24 hours, + # while time.ago(1.day) will move back 23-25 hours, depending on + # the day. + # + # now.ago(24.hours) # => Sun, 02 Nov 2014 01:26:28 EDT -04:00 + # now.ago(1.day) # => Sun, 02 Nov 2014 00:26:28 EDT -04:00 + def ago(other) + since(-other) + end + + # Returns a new +ActiveSupport::TimeWithZone+ where one or more of the elements have + # been changed according to the +options+ parameter. The time options (:hour, + # :min, :sec, :usec, :nsec) reset cascadingly, + # so if only the hour is passed, then minute, sec, usec and nsec is set to 0. If the + # hour and minute is passed, then sec, usec and nsec is set to 0. The +options+ + # parameter takes a hash with any of these keys: :year, :month, + # :day, :hour, :min, :sec, :usec, + # :nsec, :offset, :zone. Pass either :usec + # or :nsec, not both. Similarly, pass either :zone or + # :offset, not both. + # + # t = Time.zone.now # => Fri, 14 Apr 2017 11:45:15 EST -05:00 + # t.change(year: 2020) # => Tue, 14 Apr 2020 11:45:15 EST -05:00 + # t.change(hour: 12) # => Fri, 14 Apr 2017 12:00:00 EST -05:00 + # t.change(min: 30) # => Fri, 14 Apr 2017 11:30:00 EST -05:00 + # t.change(offset: "-10:00") # => Fri, 14 Apr 2017 11:45:15 HST -10:00 + # t.change(zone: "Hawaii") # => Fri, 14 Apr 2017 11:45:15 HST -10:00 + def change(options) + if options[:zone] && options[:offset] + raise ArgumentError, "Can't change both :offset and :zone at the same time: #{options.inspect}" + end + + new_time = time.change(options) + + if options[:zone] + new_zone = ::Time.find_zone(options[:zone]) + elsif options[:offset] + new_zone = ::Time.find_zone(new_time.utc_offset) + end + + new_zone ||= time_zone + periods = new_zone.periods_for_local(new_time) + + self.class.new(nil, new_zone, new_time, periods.include?(period) ? period : nil) + end + + # Uses Date to provide precise Time calculations for years, months, and days + # according to the proleptic Gregorian calendar. The result is returned as a + # new TimeWithZone object. + # + # The +options+ parameter takes a hash with any of these keys: + # :years, :months, :weeks, :days, + # :hours, :minutes, :seconds. + # + # If advancing by a value of variable length (i.e., years, weeks, months, + # days), move forward from #time, otherwise move forward from #utc, for + # accuracy when moving across DST boundaries. + # + # Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)' + # now = Time.zone.now # => Sun, 02 Nov 2014 01:26:28 EDT -04:00 + # now.advance(seconds: 1) # => Sun, 02 Nov 2014 01:26:29 EDT -04:00 + # now.advance(minutes: 1) # => Sun, 02 Nov 2014 01:27:28 EDT -04:00 + # now.advance(hours: 1) # => Sun, 02 Nov 2014 01:26:28 EST -05:00 + # now.advance(days: 1) # => Mon, 03 Nov 2014 01:26:28 EST -05:00 + # now.advance(weeks: 1) # => Sun, 09 Nov 2014 01:26:28 EST -05:00 + # now.advance(months: 1) # => Tue, 02 Dec 2014 01:26:28 EST -05:00 + # now.advance(years: 1) # => Mon, 02 Nov 2015 01:26:28 EST -05:00 + def advance(options) + # If we're advancing a value of variable length (i.e., years, weeks, months, days), advance from #time, + # otherwise advance from #utc, for accuracy when moving across DST boundaries + if options.values_at(:years, :weeks, :months, :days).any? + method_missing(:advance, options) + else + utc.advance(options).in_time_zone(time_zone) + end + end + + %w(year mon month day mday wday yday hour min sec usec nsec to_date).each do |method_name| + class_eval <<-EOV, __FILE__, __LINE__ + 1 + def #{method_name} # def month + time.#{method_name} # time.month + end # end + EOV + end + + # Returns Array of parts of Time in sequence of + # [seconds, minutes, hours, day, month, year, weekday, yearday, dst?, zone]. + # + # now = Time.zone.now # => Tue, 18 Aug 2015 02:29:27 UTC +00:00 + # now.to_a # => [27, 29, 2, 18, 8, 2015, 2, 230, false, "UTC"] + def to_a + [time.sec, time.min, time.hour, time.day, time.mon, time.year, time.wday, time.yday, dst?, zone] + end + + # Returns the object's date and time as a floating point number of seconds + # since the Epoch (January 1, 1970 00:00 UTC). + # + # Time.zone.now.to_f # => 1417709320.285418 + def to_f + utc.to_f + end + + # Returns the object's date and time as an integer number of seconds + # since the Epoch (January 1, 1970 00:00 UTC). + # + # Time.zone.now.to_i # => 1417709320 + def to_i + utc.to_i + end + alias_method :tv_sec, :to_i + + # Returns the object's date and time as a rational number of seconds + # since the Epoch (January 1, 1970 00:00 UTC). + # + # Time.zone.now.to_r # => (708854548642709/500000) + def to_r + utc.to_r + end + + # Returns an instance of DateTime with the timezone's UTC offset + # + # Time.zone.now.to_datetime # => Tue, 18 Aug 2015 02:32:20 +0000 + # Time.current.in_time_zone('Hawaii').to_datetime # => Mon, 17 Aug 2015 16:32:20 -1000 + def to_datetime + @to_datetime ||= utc.to_datetime.new_offset(Rational(utc_offset, 86_400)) + end + + # Returns an instance of +Time+, either with the same UTC offset + # as +self+ or in the local system timezone depending on the setting + # of +ActiveSupport.to_time_preserves_timezone+. + def to_time + if preserve_timezone + @to_time_with_instance_offset ||= getlocal(utc_offset) + else + @to_time_with_system_offset ||= getlocal + end + end + + # So that +self+ acts_like?(:time). + def acts_like_time? + true + end + + # Say we're a Time to thwart type checking. + def is_a?(klass) + klass == ::Time || super + end + alias_method :kind_of?, :is_a? + + # An instance of ActiveSupport::TimeWithZone is never blank + def blank? + false + end + + def freeze + # preload instance variables before freezing + period; utc; time; to_datetime; to_time + super + end + + def marshal_dump + [utc, time_zone.name, time] + end + + def marshal_load(variables) + initialize(variables[0].utc, ::Time.find_zone(variables[1]), variables[2].utc) + end + + # respond_to_missing? is not called in some cases, such as when type conversion is + # performed with Kernel#String + def respond_to?(sym, include_priv = false) + # ensure that we're not going to throw and rescue from NoMethodError in method_missing which is slow + return false if sym.to_sym == :to_str + super + end + + # Ensure proxy class responds to all methods that underlying time instance + # responds to. + def respond_to_missing?(sym, include_priv) + return false if sym.to_sym == :acts_like_date? + time.respond_to?(sym, include_priv) + end + + # Send the missing method to +time+ instance, and wrap result in a new + # TimeWithZone with the existing +time_zone+. + def method_missing(sym, *args, &block) + wrap_with_time_zone time.__send__(sym, *args, &block) + rescue NoMethodError => e + raise e, e.message.sub(time.inspect, inspect), e.backtrace + end + + private + def get_period_and_ensure_valid_local_time(period) + # we don't want a Time.local instance enforcing its own DST rules as well, + # so transfer time values to a utc constructor if necessary + @time = transfer_time_values_to_utc_constructor(@time) unless @time.utc? + begin + period || @time_zone.period_for_local(@time) + rescue ::TZInfo::PeriodNotFound + # time is in the "spring forward" hour gap, so we're moving the time forward one hour and trying again + @time += 1.hour + retry + end + end + + def transfer_time_values_to_utc_constructor(time) + # avoid creating another Time object if possible + return time if time.instance_of?(::Time) && time.utc? + ::Time.utc(time.year, time.month, time.day, time.hour, time.min, time.sec + time.subsec) + end + + def duration_of_variable_length?(obj) + ActiveSupport::Duration === obj && obj.parts.any? { |p| [:years, :months, :weeks, :days].include?(p[0]) } + end + + def wrap_with_time_zone(time) + if time.acts_like?(:time) + periods = time_zone.periods_for_local(time) + self.class.new(nil, time_zone, time, periods.include?(period) ? period : nil) + elsif time.is_a?(Range) + wrap_with_time_zone(time.begin)..wrap_with_time_zone(time.end) + else + time + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/values/time_zone.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/values/time_zone.rb new file mode 100644 index 000000000000..d9e033e23bcc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/values/time_zone.rb @@ -0,0 +1,570 @@ +# frozen_string_literal: true + +require "tzinfo" +require "concurrent/map" + +module ActiveSupport + # The TimeZone class serves as a wrapper around TZInfo::Timezone instances. + # It allows us to do the following: + # + # * Limit the set of zones provided by TZInfo to a meaningful subset of 134 + # zones. + # * Retrieve and display zones with a friendlier name + # (e.g., "Eastern Time (US & Canada)" instead of "America/New_York"). + # * Lazily load TZInfo::Timezone instances only when they're needed. + # * Create ActiveSupport::TimeWithZone instances via TimeZone's +local+, + # +parse+, +at+ and +now+ methods. + # + # If you set config.time_zone in the Rails Application, you can + # access this TimeZone object via Time.zone: + # + # # application.rb: + # class Application < Rails::Application + # config.time_zone = 'Eastern Time (US & Canada)' + # end + # + # Time.zone # => # + # Time.zone.name # => "Eastern Time (US & Canada)" + # Time.zone.now # => Sun, 18 May 2008 14:30:44 EDT -04:00 + class TimeZone + # Keys are Rails TimeZone names, values are TZInfo identifiers. + MAPPING = { + "International Date Line West" => "Etc/GMT+12", + "Midway Island" => "Pacific/Midway", + "American Samoa" => "Pacific/Pago_Pago", + "Hawaii" => "Pacific/Honolulu", + "Alaska" => "America/Juneau", + "Pacific Time (US & Canada)" => "America/Los_Angeles", + "Tijuana" => "America/Tijuana", + "Mountain Time (US & Canada)" => "America/Denver", + "Arizona" => "America/Phoenix", + "Chihuahua" => "America/Chihuahua", + "Mazatlan" => "America/Mazatlan", + "Central Time (US & Canada)" => "America/Chicago", + "Saskatchewan" => "America/Regina", + "Guadalajara" => "America/Mexico_City", + "Mexico City" => "America/Mexico_City", + "Monterrey" => "America/Monterrey", + "Central America" => "America/Guatemala", + "Eastern Time (US & Canada)" => "America/New_York", + "Indiana (East)" => "America/Indiana/Indianapolis", + "Bogota" => "America/Bogota", + "Lima" => "America/Lima", + "Quito" => "America/Lima", + "Atlantic Time (Canada)" => "America/Halifax", + "Caracas" => "America/Caracas", + "La Paz" => "America/La_Paz", + "Santiago" => "America/Santiago", + "Newfoundland" => "America/St_Johns", + "Brasilia" => "America/Sao_Paulo", + "Buenos Aires" => "America/Argentina/Buenos_Aires", + "Montevideo" => "America/Montevideo", + "Georgetown" => "America/Guyana", + "Puerto Rico" => "America/Puerto_Rico", + "Greenland" => "America/Godthab", + "Mid-Atlantic" => "Atlantic/South_Georgia", + "Azores" => "Atlantic/Azores", + "Cape Verde Is." => "Atlantic/Cape_Verde", + "Dublin" => "Europe/Dublin", + "Edinburgh" => "Europe/London", + "Lisbon" => "Europe/Lisbon", + "London" => "Europe/London", + "Casablanca" => "Africa/Casablanca", + "Monrovia" => "Africa/Monrovia", + "UTC" => "Etc/UTC", + "Belgrade" => "Europe/Belgrade", + "Bratislava" => "Europe/Bratislava", + "Budapest" => "Europe/Budapest", + "Ljubljana" => "Europe/Ljubljana", + "Prague" => "Europe/Prague", + "Sarajevo" => "Europe/Sarajevo", + "Skopje" => "Europe/Skopje", + "Warsaw" => "Europe/Warsaw", + "Zagreb" => "Europe/Zagreb", + "Brussels" => "Europe/Brussels", + "Copenhagen" => "Europe/Copenhagen", + "Madrid" => "Europe/Madrid", + "Paris" => "Europe/Paris", + "Amsterdam" => "Europe/Amsterdam", + "Berlin" => "Europe/Berlin", + "Bern" => "Europe/Zurich", + "Zurich" => "Europe/Zurich", + "Rome" => "Europe/Rome", + "Stockholm" => "Europe/Stockholm", + "Vienna" => "Europe/Vienna", + "West Central Africa" => "Africa/Algiers", + "Bucharest" => "Europe/Bucharest", + "Cairo" => "Africa/Cairo", + "Helsinki" => "Europe/Helsinki", + "Kyiv" => "Europe/Kiev", + "Riga" => "Europe/Riga", + "Sofia" => "Europe/Sofia", + "Tallinn" => "Europe/Tallinn", + "Vilnius" => "Europe/Vilnius", + "Athens" => "Europe/Athens", + "Istanbul" => "Europe/Istanbul", + "Minsk" => "Europe/Minsk", + "Jerusalem" => "Asia/Jerusalem", + "Harare" => "Africa/Harare", + "Pretoria" => "Africa/Johannesburg", + "Kaliningrad" => "Europe/Kaliningrad", + "Moscow" => "Europe/Moscow", + "St. Petersburg" => "Europe/Moscow", + "Volgograd" => "Europe/Volgograd", + "Samara" => "Europe/Samara", + "Kuwait" => "Asia/Kuwait", + "Riyadh" => "Asia/Riyadh", + "Nairobi" => "Africa/Nairobi", + "Baghdad" => "Asia/Baghdad", + "Tehran" => "Asia/Tehran", + "Abu Dhabi" => "Asia/Muscat", + "Muscat" => "Asia/Muscat", + "Baku" => "Asia/Baku", + "Tbilisi" => "Asia/Tbilisi", + "Yerevan" => "Asia/Yerevan", + "Kabul" => "Asia/Kabul", + "Ekaterinburg" => "Asia/Yekaterinburg", + "Islamabad" => "Asia/Karachi", + "Karachi" => "Asia/Karachi", + "Tashkent" => "Asia/Tashkent", + "Chennai" => "Asia/Kolkata", + "Kolkata" => "Asia/Kolkata", + "Mumbai" => "Asia/Kolkata", + "New Delhi" => "Asia/Kolkata", + "Kathmandu" => "Asia/Kathmandu", + "Astana" => "Asia/Dhaka", + "Dhaka" => "Asia/Dhaka", + "Sri Jayawardenepura" => "Asia/Colombo", + "Almaty" => "Asia/Almaty", + "Novosibirsk" => "Asia/Novosibirsk", + "Rangoon" => "Asia/Rangoon", + "Bangkok" => "Asia/Bangkok", + "Hanoi" => "Asia/Bangkok", + "Jakarta" => "Asia/Jakarta", + "Krasnoyarsk" => "Asia/Krasnoyarsk", + "Beijing" => "Asia/Shanghai", + "Chongqing" => "Asia/Chongqing", + "Hong Kong" => "Asia/Hong_Kong", + "Urumqi" => "Asia/Urumqi", + "Kuala Lumpur" => "Asia/Kuala_Lumpur", + "Singapore" => "Asia/Singapore", + "Taipei" => "Asia/Taipei", + "Perth" => "Australia/Perth", + "Irkutsk" => "Asia/Irkutsk", + "Ulaanbaatar" => "Asia/Ulaanbaatar", + "Seoul" => "Asia/Seoul", + "Osaka" => "Asia/Tokyo", + "Sapporo" => "Asia/Tokyo", + "Tokyo" => "Asia/Tokyo", + "Yakutsk" => "Asia/Yakutsk", + "Darwin" => "Australia/Darwin", + "Adelaide" => "Australia/Adelaide", + "Canberra" => "Australia/Melbourne", + "Melbourne" => "Australia/Melbourne", + "Sydney" => "Australia/Sydney", + "Brisbane" => "Australia/Brisbane", + "Hobart" => "Australia/Hobart", + "Vladivostok" => "Asia/Vladivostok", + "Guam" => "Pacific/Guam", + "Port Moresby" => "Pacific/Port_Moresby", + "Magadan" => "Asia/Magadan", + "Srednekolymsk" => "Asia/Srednekolymsk", + "Solomon Is." => "Pacific/Guadalcanal", + "New Caledonia" => "Pacific/Noumea", + "Fiji" => "Pacific/Fiji", + "Kamchatka" => "Asia/Kamchatka", + "Marshall Is." => "Pacific/Majuro", + "Auckland" => "Pacific/Auckland", + "Wellington" => "Pacific/Auckland", + "Nuku'alofa" => "Pacific/Tongatapu", + "Tokelau Is." => "Pacific/Fakaofo", + "Chatham Is." => "Pacific/Chatham", + "Samoa" => "Pacific/Apia" + } + + UTC_OFFSET_WITH_COLON = "%s%02d:%02d" # :nodoc: + UTC_OFFSET_WITHOUT_COLON = UTC_OFFSET_WITH_COLON.tr(":", "") # :nodoc: + private_constant :UTC_OFFSET_WITH_COLON, :UTC_OFFSET_WITHOUT_COLON + + @lazy_zones_map = Concurrent::Map.new + @country_zones = Concurrent::Map.new + + class << self + # Assumes self represents an offset from UTC in seconds (as returned from + # Time#utc_offset) and turns this into an +HH:MM formatted string. + # + # ActiveSupport::TimeZone.seconds_to_utc_offset(-21_600) # => "-06:00" + def seconds_to_utc_offset(seconds, colon = true) + format = colon ? UTC_OFFSET_WITH_COLON : UTC_OFFSET_WITHOUT_COLON + sign = (seconds < 0 ? "-" : "+") + hours = seconds.abs / 3600 + minutes = (seconds.abs % 3600) / 60 + format % [sign, hours, minutes] + end + + def find_tzinfo(name) + TZInfo::Timezone.new(MAPPING[name] || name) + end + + alias_method :create, :new + + # Returns a TimeZone instance with the given name, or +nil+ if no + # such TimeZone instance exists. (This exists to support the use of + # this class with the +composed_of+ macro.) + def new(name) + self[name] + end + + # Returns an array of all TimeZone objects. There are multiple + # TimeZone objects per time zone, in many cases, to make it easier + # for users to find their own time zone. + def all + @zones ||= zones_map.values.sort + end + + # Locate a specific time zone object. If the argument is a string, it + # is interpreted to mean the name of the timezone to locate. If it is a + # numeric value it is either the hour offset, or the second offset, of the + # timezone to find. (The first one with that offset will be returned.) + # Returns +nil+ if no such time zone is known to the system. + def [](arg) + case arg + when String + begin + @lazy_zones_map[arg] ||= create(arg) + rescue TZInfo::InvalidTimezoneIdentifier + nil + end + when Numeric, ActiveSupport::Duration + arg *= 3600 if arg.abs <= 13 + all.find { |z| z.utc_offset == arg.to_i } + else + raise ArgumentError, "invalid argument to TimeZone[]: #{arg.inspect}" + end + end + + # A convenience method for returning a collection of TimeZone objects + # for time zones in the USA. + def us_zones + country_zones(:us) + end + + # A convenience method for returning a collection of TimeZone objects + # for time zones in the country specified by its ISO 3166-1 Alpha2 code. + def country_zones(country_code) + code = country_code.to_s.upcase + @country_zones[code] ||= load_country_zones(code) + end + + def clear #:nodoc: + @lazy_zones_map = Concurrent::Map.new + @country_zones = Concurrent::Map.new + @zones = nil + @zones_map = nil + end + + private + def load_country_zones(code) + country = TZInfo::Country.get(code) + country.zone_identifiers.flat_map do |tz_id| + if MAPPING.value?(tz_id) + MAPPING.inject([]) do |memo, (key, value)| + memo << self[key] if value == tz_id + memo + end + else + create(tz_id, nil, TZInfo::Timezone.new(tz_id)) + end + end.sort! + end + + def zones_map + @zones_map ||= MAPPING.each_with_object({}) do |(name, _), zones| + timezone = self[name] + zones[name] = timezone if timezone + end + end + end + + include Comparable + attr_reader :name + attr_reader :tzinfo + + # Create a new TimeZone object with the given name and offset. The + # offset is the number of seconds that this time zone is offset from UTC + # (GMT). Seconds were chosen as the offset unit because that is the unit + # that Ruby uses to represent time zone offsets (see Time#utc_offset). + def initialize(name, utc_offset = nil, tzinfo = nil) + @name = name + @utc_offset = utc_offset + @tzinfo = tzinfo || TimeZone.find_tzinfo(name) + end + + # Returns the offset of this time zone from UTC in seconds. + def utc_offset + if @utc_offset + @utc_offset + else + tzinfo.current_period.utc_offset if tzinfo && tzinfo.current_period + end + end + + # Returns a formatted string of the offset from UTC, or an alternative + # string if the time zone is already UTC. + # + # zone = ActiveSupport::TimeZone['Central Time (US & Canada)'] + # zone.formatted_offset # => "-06:00" + # zone.formatted_offset(false) # => "-0600" + def formatted_offset(colon = true, alternate_utc_string = nil) + utc_offset == 0 && alternate_utc_string || self.class.seconds_to_utc_offset(utc_offset, colon) + end + + # Compare this time zone to the parameter. The two are compared first on + # their offsets, and then by name. + def <=>(zone) + return unless zone.respond_to? :utc_offset + result = (utc_offset <=> zone.utc_offset) + result = (name <=> zone.name) if result == 0 + result + end + + # Compare #name and TZInfo identifier to a supplied regexp, returning +true+ + # if a match is found. + def =~(re) + re === name || re === MAPPING[name] + end + + # Returns a textual representation of this time zone. + def to_s + "(GMT#{formatted_offset}) #{name}" + end + + # Method for creating new ActiveSupport::TimeWithZone instance in time zone + # of +self+ from given values. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.zone.local(2007, 2, 1, 15, 30, 45) # => Thu, 01 Feb 2007 15:30:45 HST -10:00 + def local(*args) + time = Time.utc(*args) + ActiveSupport::TimeWithZone.new(nil, self, time) + end + + # Method for creating new ActiveSupport::TimeWithZone instance in time zone + # of +self+ from number of seconds since the Unix epoch. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.utc(2000).to_f # => 946684800.0 + # Time.zone.at(946684800.0) # => Fri, 31 Dec 1999 14:00:00 HST -10:00 + # + # A second argument can be supplied to specify sub-second precision. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.at(946684800, 123456.789).nsec # => 123456789 + def at(*args) + Time.at(*args).utc.in_time_zone(self) + end + + # Method for creating new ActiveSupport::TimeWithZone instance in time zone + # of +self+ from an ISO 8601 string. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.zone.iso8601('1999-12-31T14:00:00') # => Fri, 31 Dec 1999 14:00:00 HST -10:00 + # + # If the time components are missing then they will be set to zero. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.zone.iso8601('1999-12-31') # => Fri, 31 Dec 1999 00:00:00 HST -10:00 + # + # If the string is invalid then an +ArgumentError+ will be raised unlike +parse+ + # which usually returns +nil+ when given an invalid date string. + def iso8601(str) + parts = Date._iso8601(str) + + raise ArgumentError, "invalid date" if parts.empty? + + time = Time.new( + parts.fetch(:year), + parts.fetch(:mon), + parts.fetch(:mday), + parts.fetch(:hour, 0), + parts.fetch(:min, 0), + parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0), + parts.fetch(:offset, 0) + ) + + if parts[:offset] + TimeWithZone.new(time.utc, self) + else + TimeWithZone.new(nil, self, time) + end + end + + # Method for creating new ActiveSupport::TimeWithZone instance in time zone + # of +self+ from parsed string. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.zone.parse('1999-12-31 14:00:00') # => Fri, 31 Dec 1999 14:00:00 HST -10:00 + # + # If upper components are missing from the string, they are supplied from + # TimeZone#now: + # + # Time.zone.now # => Fri, 31 Dec 1999 14:00:00 HST -10:00 + # Time.zone.parse('22:30:00') # => Fri, 31 Dec 1999 22:30:00 HST -10:00 + # + # However, if the date component is not provided, but any other upper + # components are supplied, then the day of the month defaults to 1: + # + # Time.zone.parse('Mar 2000') # => Wed, 01 Mar 2000 00:00:00 HST -10:00 + # + # If the string is invalid then an +ArgumentError+ could be raised. + def parse(str, now = now()) + parts_to_time(Date._parse(str, false), now) + end + + # Method for creating new ActiveSupport::TimeWithZone instance in time zone + # of +self+ from an RFC 3339 string. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.zone.rfc3339('2000-01-01T00:00:00Z') # => Fri, 31 Dec 1999 14:00:00 HST -10:00 + # + # If the time or zone components are missing then an +ArgumentError+ will + # be raised. This is much stricter than either +parse+ or +iso8601+ which + # allow for missing components. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.zone.rfc3339('1999-12-31') # => ArgumentError: invalid date + def rfc3339(str) + parts = Date._rfc3339(str) + + raise ArgumentError, "invalid date" if parts.empty? + + time = Time.new( + parts.fetch(:year), + parts.fetch(:mon), + parts.fetch(:mday), + parts.fetch(:hour), + parts.fetch(:min), + parts.fetch(:sec) + parts.fetch(:sec_fraction, 0), + parts.fetch(:offset) + ) + + TimeWithZone.new(time.utc, self) + end + + # Parses +str+ according to +format+ and returns an ActiveSupport::TimeWithZone. + # + # Assumes that +str+ is a time in the time zone +self+, + # unless +format+ includes an explicit time zone. + # (This is the same behavior as +parse+.) + # In either case, the returned TimeWithZone has the timezone of +self+. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.zone.strptime('1999-12-31 14:00:00', '%Y-%m-%d %H:%M:%S') # => Fri, 31 Dec 1999 14:00:00 HST -10:00 + # + # If upper components are missing from the string, they are supplied from + # TimeZone#now: + # + # Time.zone.now # => Fri, 31 Dec 1999 14:00:00 HST -10:00 + # Time.zone.strptime('22:30:00', '%H:%M:%S') # => Fri, 31 Dec 1999 22:30:00 HST -10:00 + # + # However, if the date component is not provided, but any other upper + # components are supplied, then the day of the month defaults to 1: + # + # Time.zone.strptime('Mar 2000', '%b %Y') # => Wed, 01 Mar 2000 00:00:00 HST -10:00 + def strptime(str, format, now = now()) + parts_to_time(DateTime._strptime(str, format), now) + end + + # Returns an ActiveSupport::TimeWithZone instance representing the current + # time in the time zone represented by +self+. + # + # Time.zone = 'Hawaii' # => "Hawaii" + # Time.zone.now # => Wed, 23 Jan 2008 20:24:27 HST -10:00 + def now + time_now.utc.in_time_zone(self) + end + + # Returns the current date in this time zone. + def today + tzinfo.now.to_date + end + + # Returns the next date in this time zone. + def tomorrow + today + 1 + end + + # Returns the previous date in this time zone. + def yesterday + today - 1 + end + + # Adjust the given time to the simultaneous time in the time zone + # represented by +self+. Returns a Time.utc() instance -- if you want an + # ActiveSupport::TimeWithZone instance, use Time#in_time_zone() instead. + def utc_to_local(time) + tzinfo.utc_to_local(time) + end + + # Adjust the given time to the simultaneous time in UTC. Returns a + # Time.utc() instance. + def local_to_utc(time, dst = true) + tzinfo.local_to_utc(time, dst) + end + + # Available so that TimeZone instances respond like TZInfo::Timezone + # instances. + def period_for_utc(time) + tzinfo.period_for_utc(time) + end + + # Available so that TimeZone instances respond like TZInfo::Timezone + # instances. + def period_for_local(time, dst = true) + tzinfo.period_for_local(time, dst) { |periods| periods.last } + end + + def periods_for_local(time) #:nodoc: + tzinfo.periods_for_local(time) + end + + def init_with(coder) #:nodoc: + initialize(coder["name"]) + end + + def encode_with(coder) #:nodoc: + coder.tag = "!ruby/object:#{self.class}" + coder.map = { "name" => tzinfo.name } + end + + private + def parts_to_time(parts, now) + raise ArgumentError, "invalid date" if parts.nil? + return if parts.empty? + + if parts[:seconds] + time = Time.at(parts[:seconds]) + else + time = Time.new( + parts.fetch(:year, now.year), + parts.fetch(:mon, now.month), + parts.fetch(:mday, parts[:year] || parts[:mon] ? 1 : now.day), + parts.fetch(:hour, 0), + parts.fetch(:min, 0), + parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0), + parts.fetch(:offset, 0) + ) + end + + if parts[:offset] || parts[:seconds] + TimeWithZone.new(time.utc, self) + else + TimeWithZone.new(nil, self, time) + end + end + + def time_now + Time.now + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/version.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/version.rb new file mode 100644 index 000000000000..928838c83714 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/version.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require_relative "gem_version" + +module ActiveSupport + # Returns the version of the currently loaded ActiveSupport as a Gem::Version + def self.version + gem_version + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini.rb new file mode 100644 index 000000000000..f6ae08bb5db0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini.rb @@ -0,0 +1,201 @@ +# frozen_string_literal: true + +require "time" +require "base64" +require "bigdecimal" +require "bigdecimal/util" +require "active_support/core_ext/module/delegation" +require "active_support/core_ext/string/inflections" +require "active_support/core_ext/date_time/calculations" + +module ActiveSupport + # = XmlMini + # + # To use the much faster libxml parser: + # gem 'libxml-ruby', '=0.9.7' + # XmlMini.backend = 'LibXML' + module XmlMini + extend self + + # This module decorates files deserialized using Hash.from_xml with + # the original_filename and content_type methods. + module FileLike #:nodoc: + attr_writer :original_filename, :content_type + + def original_filename + @original_filename || "untitled" + end + + def content_type + @content_type || "application/octet-stream" + end + end + + DEFAULT_ENCODINGS = { + "binary" => "base64" + } unless defined?(DEFAULT_ENCODINGS) + + unless defined?(TYPE_NAMES) + TYPE_NAMES = { + "Symbol" => "symbol", + "Integer" => "integer", + "BigDecimal" => "decimal", + "Float" => "float", + "TrueClass" => "boolean", + "FalseClass" => "boolean", + "Date" => "date", + "DateTime" => "dateTime", + "Time" => "dateTime", + "Array" => "array", + "Hash" => "hash" + } + end + + FORMATTING = { + "symbol" => Proc.new { |symbol| symbol.to_s }, + "date" => Proc.new { |date| date.to_s(:db) }, + "dateTime" => Proc.new { |time| time.xmlschema }, + "binary" => Proc.new { |binary| ::Base64.encode64(binary) }, + "yaml" => Proc.new { |yaml| yaml.to_yaml } + } unless defined?(FORMATTING) + + # TODO use regexp instead of Date.parse + unless defined?(PARSING) + PARSING = { + "symbol" => Proc.new { |symbol| symbol.to_s.to_sym }, + "date" => Proc.new { |date| ::Date.parse(date) }, + "datetime" => Proc.new { |time| Time.xmlschema(time).utc rescue ::DateTime.parse(time).utc }, + "integer" => Proc.new { |integer| integer.to_i }, + "float" => Proc.new { |float| float.to_f }, + "decimal" => Proc.new do |number| + if String === number + number.to_d + else + BigDecimal(number) + end + end, + "boolean" => Proc.new { |boolean| %w(1 true).include?(boolean.to_s.strip) }, + "string" => Proc.new { |string| string.to_s }, + "yaml" => Proc.new { |yaml| YAML.load(yaml) rescue yaml }, + "base64Binary" => Proc.new { |bin| ::Base64.decode64(bin) }, + "binary" => Proc.new { |bin, entity| _parse_binary(bin, entity) }, + "file" => Proc.new { |file, entity| _parse_file(file, entity) } + } + + PARSING.update( + "double" => PARSING["float"], + "dateTime" => PARSING["datetime"] + ) + end + + attr_accessor :depth + self.depth = 100 + + delegate :parse, to: :backend + + def backend + current_thread_backend || @backend + end + + def backend=(name) + backend = name && cast_backend_name_to_module(name) + self.current_thread_backend = backend if current_thread_backend + @backend = backend + end + + def with_backend(name) + old_backend = current_thread_backend + self.current_thread_backend = name && cast_backend_name_to_module(name) + yield + ensure + self.current_thread_backend = old_backend + end + + def to_tag(key, value, options) + type_name = options.delete(:type) + merged_options = options.merge(root: key, skip_instruct: true) + + if value.is_a?(::Method) || value.is_a?(::Proc) + if value.arity == 1 + value.call(merged_options) + else + value.call(merged_options, key.to_s.singularize) + end + elsif value.respond_to?(:to_xml) + value.to_xml(merged_options) + else + type_name ||= TYPE_NAMES[value.class.name] + type_name ||= value.class.name if value && !value.respond_to?(:to_str) + type_name = type_name.to_s if type_name + type_name = "dateTime" if type_name == "datetime" + + key = rename_key(key.to_s, options) + + attributes = options[:skip_types] || type_name.nil? ? {} : { type: type_name } + attributes[:nil] = true if value.nil? + + encoding = options[:encoding] || DEFAULT_ENCODINGS[type_name] + attributes[:encoding] = encoding if encoding + + formatted_value = FORMATTING[type_name] && !value.nil? ? + FORMATTING[type_name].call(value) : value + + options[:builder].tag!(key, formatted_value, attributes) + end + end + + def rename_key(key, options = {}) + camelize = options[:camelize] + dasherize = !options.has_key?(:dasherize) || options[:dasherize] + if camelize + key = true == camelize ? key.camelize : key.camelize(camelize) + end + key = _dasherize(key) if dasherize + key + end + + private + def _dasherize(key) + # $2 must be a non-greedy regex for this to work + left, middle, right = /\A(_*)(.*?)(_*)\Z/.match(key.strip)[1, 3] + "#{left}#{middle.tr('_ ', '--')}#{right}" + end + + # TODO: Add support for other encodings + def _parse_binary(bin, entity) + case entity["encoding"] + when "base64" + ::Base64.decode64(bin) + else + bin + end + end + + def _parse_file(file, entity) + f = StringIO.new(::Base64.decode64(file)) + f.extend(FileLike) + f.original_filename = entity["name"] + f.content_type = entity["content_type"] + f + end + + def current_thread_backend + Thread.current[:xml_mini_backend] + end + + def current_thread_backend=(name) + Thread.current[:xml_mini_backend] = name && cast_backend_name_to_module(name) + end + + def cast_backend_name_to_module(name) + if name.is_a?(Module) + name + else + require "active_support/xml_mini/#{name.downcase}" + ActiveSupport.const_get("XmlMini_#{name}") + end + end + end + + XmlMini.backend = "REXML" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/jdom.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/jdom.rb new file mode 100644 index 000000000000..12ca19a76fc9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/jdom.rb @@ -0,0 +1,182 @@ +# frozen_string_literal: true + +raise "JRuby is required to use the JDOM backend for XmlMini" unless RUBY_PLATFORM.include?("java") + +require "jruby" +include Java + +require "active_support/core_ext/object/blank" + +java_import javax.xml.parsers.DocumentBuilder unless defined? DocumentBuilder +java_import javax.xml.parsers.DocumentBuilderFactory unless defined? DocumentBuilderFactory +java_import java.io.StringReader unless defined? StringReader +java_import org.xml.sax.InputSource unless defined? InputSource +java_import org.xml.sax.Attributes unless defined? Attributes +java_import org.w3c.dom.Node unless defined? Node + +module ActiveSupport + module XmlMini_JDOM #:nodoc: + extend self + + CONTENT_KEY = "__content__" + + NODE_TYPE_NAMES = %w{ATTRIBUTE_NODE CDATA_SECTION_NODE COMMENT_NODE DOCUMENT_FRAGMENT_NODE + DOCUMENT_NODE DOCUMENT_TYPE_NODE ELEMENT_NODE ENTITY_NODE ENTITY_REFERENCE_NODE NOTATION_NODE + PROCESSING_INSTRUCTION_NODE TEXT_NODE} + + node_type_map = {} + NODE_TYPE_NAMES.each { |type| node_type_map[Node.send(type)] = type } + + # Parse an XML Document string or IO into a simple hash using Java's jdom. + # data:: + # XML Document string or IO to parse + def parse(data) + if data.respond_to?(:read) + data = data.read + end + + if data.blank? + {} + else + @dbf = DocumentBuilderFactory.new_instance + # secure processing of java xml + # https://archive.is/9xcQQ + @dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false) + @dbf.setFeature("http://xml.org/sax/features/external-general-entities", false) + @dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false) + @dbf.setFeature(javax.xml.XMLConstants::FEATURE_SECURE_PROCESSING, true) + xml_string_reader = StringReader.new(data) + xml_input_source = InputSource.new(xml_string_reader) + doc = @dbf.new_document_builder.parse(xml_input_source) + merge_element!({ CONTENT_KEY => "" }, doc.document_element, XmlMini.depth) + end + end + + private + # Convert an XML element and merge into the hash + # + # hash:: + # Hash to merge the converted element into. + # element:: + # XML element to merge into hash + def merge_element!(hash, element, depth) + raise "Document too deep!" if depth == 0 + delete_empty(hash) + merge!(hash, element.tag_name, collapse(element, depth)) + end + + def delete_empty(hash) + hash.delete(CONTENT_KEY) if hash[CONTENT_KEY] == "" + end + + # Actually converts an XML document element into a data structure. + # + # element:: + # The document element to be collapsed. + def collapse(element, depth) + hash = get_attributes(element) + + child_nodes = element.child_nodes + if child_nodes.length > 0 + (0...child_nodes.length).each do |i| + child = child_nodes.item(i) + merge_element!(hash, child, depth - 1) unless child.node_type == Node.TEXT_NODE + end + merge_texts!(hash, element) unless empty_content?(element) + hash + else + merge_texts!(hash, element) + end + end + + # Merge all the texts of an element into the hash + # + # hash:: + # Hash to add the converted element to. + # element:: + # XML element whose texts are to me merged into the hash + def merge_texts!(hash, element) + delete_empty(hash) + text_children = texts(element) + if text_children.join.empty? + hash + else + # must use value to prevent double-escaping + merge!(hash, CONTENT_KEY, text_children.join) + end + end + + # Adds a new key/value pair to an existing Hash. If the key to be added + # already exists and the existing value associated with key is not + # an Array, it will be wrapped in an Array. Then the new value is + # appended to that Array. + # + # hash:: + # Hash to add key/value pair to. + # key:: + # Key to be added. + # value:: + # Value to be associated with key. + def merge!(hash, key, value) + if hash.has_key?(key) + if hash[key].instance_of?(Array) + hash[key] << value + else + hash[key] = [hash[key], value] + end + elsif value.instance_of?(Array) + hash[key] = [value] + else + hash[key] = value + end + hash + end + + # Converts the attributes array of an XML element into a hash. + # Returns an empty Hash if node has no attributes. + # + # element:: + # XML element to extract attributes from. + def get_attributes(element) + attribute_hash = {} + attributes = element.attributes + (0...attributes.length).each do |i| + attribute_hash[CONTENT_KEY] ||= "" + attribute_hash[attributes.item(i).name] = attributes.item(i).value + end + attribute_hash + end + + # Determines if a document element has text content + # + # element:: + # XML element to be checked. + def texts(element) + texts = [] + child_nodes = element.child_nodes + (0...child_nodes.length).each do |i| + item = child_nodes.item(i) + if item.node_type == Node.TEXT_NODE + texts << item.get_data + end + end + texts + end + + # Determines if a document element has text content + # + # element:: + # XML element to be checked. + def empty_content?(element) + text = +"" + child_nodes = element.child_nodes + (0...child_nodes.length).each do |i| + item = child_nodes.item(i) + if item.node_type == Node.TEXT_NODE + text << item.get_data.strip + end + end + text.strip.length == 0 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/libxml.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/libxml.rb new file mode 100644 index 000000000000..c2e999ef6cdc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/libxml.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require "libxml" +require "active_support/core_ext/object/blank" +require "stringio" + +module ActiveSupport + module XmlMini_LibXML #:nodoc: + extend self + + # Parse an XML Document string or IO into a simple hash using libxml. + # data:: + # XML Document string or IO to parse + def parse(data) + if !data.respond_to?(:read) + data = StringIO.new(data || "") + end + + if data.eof? + {} + else + LibXML::XML::Parser.io(data).parse.to_hash + end + end + end +end + +module LibXML #:nodoc: + module Conversions #:nodoc: + module Document #:nodoc: + def to_hash + root.to_hash + end + end + + module Node #:nodoc: + CONTENT_ROOT = "__content__" + + # Convert XML document to hash. + # + # hash:: + # Hash to merge the converted element into. + def to_hash(hash = {}) + node_hash = {} + + # Insert node hash into parent hash correctly. + case hash[name] + when Array then hash[name] << node_hash + when Hash then hash[name] = [hash[name], node_hash] + when nil then hash[name] = node_hash + end + + # Handle child elements + each_child do |c| + if c.element? + c.to_hash(node_hash) + elsif c.text? || c.cdata? + node_hash[CONTENT_ROOT] ||= +"" + node_hash[CONTENT_ROOT] << c.content + end + end + + # Remove content node if it is blank + if node_hash.length > 1 && node_hash[CONTENT_ROOT].blank? + node_hash.delete(CONTENT_ROOT) + end + + # Handle attributes + each_attr { |a| node_hash[a.name] = a.value } + + hash + end + end + end +end + +# :enddoc: + +LibXML::XML::Document.include(LibXML::Conversions::Document) +LibXML::XML::Node.include(LibXML::Conversions::Node) diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/libxmlsax.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/libxmlsax.rb new file mode 100644 index 000000000000..ac8acdfc3ce7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/libxmlsax.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +require "libxml" +require "active_support/core_ext/object/blank" +require "stringio" + +module ActiveSupport + module XmlMini_LibXMLSAX #:nodoc: + extend self + + # Class that will build the hash while the XML document + # is being parsed using SAX events. + class HashBuilder + include LibXML::XML::SaxParser::Callbacks + + CONTENT_KEY = "__content__" + HASH_SIZE_KEY = "__hash_size__" + + attr_reader :hash + + def current_hash + @hash_stack.last + end + + def on_start_document + @hash = { CONTENT_KEY => +"" } + @hash_stack = [@hash] + end + + def on_end_document + @hash = @hash_stack.pop + @hash.delete(CONTENT_KEY) + end + + def on_start_element(name, attrs = {}) + new_hash = { CONTENT_KEY => +"" }.merge!(attrs) + new_hash[HASH_SIZE_KEY] = new_hash.size + 1 + + case current_hash[name] + when Array then current_hash[name] << new_hash + when Hash then current_hash[name] = [current_hash[name], new_hash] + when nil then current_hash[name] = new_hash + end + + @hash_stack.push(new_hash) + end + + def on_end_element(name) + if current_hash.length > current_hash.delete(HASH_SIZE_KEY) && current_hash[CONTENT_KEY].blank? || current_hash[CONTENT_KEY] == "" + current_hash.delete(CONTENT_KEY) + end + @hash_stack.pop + end + + def on_characters(string) + current_hash[CONTENT_KEY] << string + end + + alias_method :on_cdata_block, :on_characters + end + + attr_accessor :document_class + self.document_class = HashBuilder + + def parse(data) + if !data.respond_to?(:read) + data = StringIO.new(data || "") + end + + if data.eof? + {} + else + LibXML::XML::Error.set_handler(&LibXML::XML::Error::QUIET_HANDLER) + parser = LibXML::XML::SaxParser.io(data) + document = document_class.new + + parser.callbacks = document + parser.parse + document.hash + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/nokogiri.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/nokogiri.rb new file mode 100644 index 000000000000..f76513f48bcc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/nokogiri.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +begin + require "nokogiri" +rescue LoadError => e + $stderr.puts "You don't have nokogiri installed in your application. Please add it to your Gemfile and run bundle install" + raise e +end +require "active_support/core_ext/object/blank" +require "stringio" + +module ActiveSupport + module XmlMini_Nokogiri #:nodoc: + extend self + + # Parse an XML Document string or IO into a simple hash using libxml / nokogiri. + # data:: + # XML Document string or IO to parse + def parse(data) + if !data.respond_to?(:read) + data = StringIO.new(data || "") + end + + if data.eof? + {} + else + doc = Nokogiri::XML(data) + raise doc.errors.first if doc.errors.length > 0 + doc.to_hash + end + end + + module Conversions #:nodoc: + module Document #:nodoc: + def to_hash + root.to_hash + end + end + + module Node #:nodoc: + CONTENT_ROOT = "__content__" + + # Convert XML document to hash. + # + # hash:: + # Hash to merge the converted element into. + def to_hash(hash = {}) + node_hash = {} + + # Insert node hash into parent hash correctly. + case hash[name] + when Array then hash[name] << node_hash + when Hash then hash[name] = [hash[name], node_hash] + when nil then hash[name] = node_hash + end + + # Handle child elements + children.each do |c| + if c.element? + c.to_hash(node_hash) + elsif c.text? || c.cdata? + node_hash[CONTENT_ROOT] ||= +"" + node_hash[CONTENT_ROOT] << c.content + end + end + + # Remove content node if it is blank and there are child tags + if node_hash.length > 1 && node_hash[CONTENT_ROOT].blank? + node_hash.delete(CONTENT_ROOT) + end + + # Handle attributes + attribute_nodes.each { |a| node_hash[a.node_name] = a.value } + + hash + end + end + end + + Nokogiri::XML::Document.include(Conversions::Document) + Nokogiri::XML::Node.include(Conversions::Node) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/nokogirisax.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/nokogirisax.rb new file mode 100644 index 000000000000..55cd72e09305 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/nokogirisax.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +begin + require "nokogiri" +rescue LoadError => e + $stderr.puts "You don't have nokogiri installed in your application. Please add it to your Gemfile and run bundle install" + raise e +end +require "active_support/core_ext/object/blank" +require "stringio" + +module ActiveSupport + module XmlMini_NokogiriSAX #:nodoc: + extend self + + # Class that will build the hash while the XML document + # is being parsed using SAX events. + class HashBuilder < Nokogiri::XML::SAX::Document + CONTENT_KEY = "__content__" + HASH_SIZE_KEY = "__hash_size__" + + attr_reader :hash + + def current_hash + @hash_stack.last + end + + def start_document + @hash = {} + @hash_stack = [@hash] + end + + def end_document + raise "Parse stack not empty!" if @hash_stack.size > 1 + end + + def error(error_message) + raise error_message + end + + def start_element(name, attrs = []) + new_hash = { CONTENT_KEY => +"" }.merge!(Hash[attrs]) + new_hash[HASH_SIZE_KEY] = new_hash.size + 1 + + case current_hash[name] + when Array then current_hash[name] << new_hash + when Hash then current_hash[name] = [current_hash[name], new_hash] + when nil then current_hash[name] = new_hash + end + + @hash_stack.push(new_hash) + end + + def end_element(name) + if current_hash.length > current_hash.delete(HASH_SIZE_KEY) && current_hash[CONTENT_KEY].blank? || current_hash[CONTENT_KEY] == "" + current_hash.delete(CONTENT_KEY) + end + @hash_stack.pop + end + + def characters(string) + current_hash[CONTENT_KEY] << string + end + + alias_method :cdata_block, :characters + end + + attr_accessor :document_class + self.document_class = HashBuilder + + def parse(data) + if !data.respond_to?(:read) + data = StringIO.new(data || "") + end + + if data.eof? + {} + else + document = document_class.new + parser = Nokogiri::XML::SAX::Parser.new(document) + parser.parse(data) + document.hash + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/rexml.rb b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/rexml.rb new file mode 100644 index 000000000000..8d6e3af0662d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/activesupport-6.0.3.6/lib/active_support/xml_mini/rexml.rb @@ -0,0 +1,130 @@ +# frozen_string_literal: true + +require "active_support/core_ext/kernel/reporting" +require "active_support/core_ext/object/blank" +require "stringio" + +module ActiveSupport + module XmlMini_REXML #:nodoc: + extend self + + CONTENT_KEY = "__content__" + + # Parse an XML Document string or IO into a simple hash. + # + # Same as XmlSimple::xml_in but doesn't shoot itself in the foot, + # and uses the defaults from Active Support. + # + # data:: + # XML Document string or IO to parse + def parse(data) + if !data.respond_to?(:read) + data = StringIO.new(data || "") + end + + if data.eof? + {} + else + silence_warnings { require "rexml/document" } unless defined?(REXML::Document) + doc = REXML::Document.new(data) + + if doc.root + merge_element!({}, doc.root, XmlMini.depth) + else + raise REXML::ParseException, + "The document #{doc.to_s.inspect} does not have a valid root" + end + end + end + + private + # Convert an XML element and merge into the hash + # + # hash:: + # Hash to merge the converted element into. + # element:: + # XML element to merge into hash + def merge_element!(hash, element, depth) + raise REXML::ParseException, "The document is too deep" if depth == 0 + merge!(hash, element.name, collapse(element, depth)) + end + + # Actually converts an XML document element into a data structure. + # + # element:: + # The document element to be collapsed. + def collapse(element, depth) + hash = get_attributes(element) + + if element.has_elements? + element.each_element { |child| merge_element!(hash, child, depth - 1) } + merge_texts!(hash, element) unless empty_content?(element) + hash + else + merge_texts!(hash, element) + end + end + + # Merge all the texts of an element into the hash + # + # hash:: + # Hash to add the converted element to. + # element:: + # XML element whose texts are to me merged into the hash + def merge_texts!(hash, element) + unless element.has_text? + hash + else + # must use value to prevent double-escaping + texts = +"" + element.texts.each { |t| texts << t.value } + merge!(hash, CONTENT_KEY, texts) + end + end + + # Adds a new key/value pair to an existing Hash. If the key to be added + # already exists and the existing value associated with key is not + # an Array, it will be wrapped in an Array. Then the new value is + # appended to that Array. + # + # hash:: + # Hash to add key/value pair to. + # key:: + # Key to be added. + # value:: + # Value to be associated with key. + def merge!(hash, key, value) + if hash.has_key?(key) + if hash[key].instance_of?(Array) + hash[key] << value + else + hash[key] = [hash[key], value] + end + elsif value.instance_of?(Array) + hash[key] = [value] + else + hash[key] = value + end + hash + end + + # Converts the attributes array of an XML element into a hash. + # Returns an empty Hash if node has no attributes. + # + # element:: + # XML element to extract attributes from. + def get_attributes(element) + attributes = {} + element.attributes.each { |n, v| attributes[n] = v } + attributes + end + + # Determines if a document element has text content + # + # element:: + # XML element to be checked. + def empty_content?(element) + element.texts.join.blank? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/CHANGELOG.md new file mode 100644 index 000000000000..4a9f8668eb4c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/CHANGELOG.md @@ -0,0 +1,246 @@ +# Addressable 2.8.0 +- fixes ReDoS vulnerability in Addressable::Template#match +- no longer replaces `+` with spaces in queries for non-http(s) schemes +- fixed encoding ipv6 literals +- the `:compacted` flag for `normalized_query` now dedupes parameters +- fix broken `escape_component` alias +- dropping support for Ruby 2.0 and 2.1 +- adding Ruby 3.0 compatibility for development tasks +- drop support for `rack-mount` and remove Addressable::Template#generate +- performance improvements +- switch CI/CD to GitHub Actions + +# Addressable 2.7.0 +- added `:compacted` flag to `normalized_query` +- `heuristic_parse` handles `mailto:` more intuitively +- dropped explicit support for JRuby 9.0.5.0 +- compatibility w/ public_suffix 4.x +- performance improvements + +# Addressable 2.6.0 +- added `tld=` method to allow assignment to the public suffix +- most `heuristic_parse` patterns are now case-insensitive +- `heuristic_parse` handles more `file://` URI variations +- fixes bug in `heuristic_parse` when uri starts with digit +- fixes bug in `request_uri=` with query strings +- fixes template issues with `nil` and `?` operator +- `frozen_string_literal` pragmas added +- minor performance improvements in regexps +- fixes to eliminate warnings + +# Addressable 2.5.2 +- better support for frozen string literals +- fixed bug w/ uppercase characters in scheme +- IDNA errors w/ emoji URLs +- compatibility w/ public_suffix 3.x + +# Addressable 2.5.1 +- allow unicode normalization to be disabled for URI Template expansion +- removed duplicate test + +# Addressable 2.5.0 +- dropping support for Ruby 1.9 +- adding support for Ruby 2.4 preview +- add support for public suffixes and tld; first runtime dependency +- hostname escaping should match RFC; underscores in hostnames no longer escaped +- paths beginning with // and missing an authority are now considered invalid +- validation now also takes place after setting a path +- handle backslashes in authority more like a browser for `heuristic_parse` +- unescaped backslashes in host now raise an `InvalidURIError` +- `merge!`, `join!`, `omit!` and `normalize!` don't disable deferred validation +- `heuristic_parse` now trims whitespace before parsing +- host parts longer than 63 bytes will be ignored and not passed to libidn +- normalized values always encoded as UTF-8 + +# Addressable 2.4.0 +- support for 1.8.x dropped +- double quotes in a host now raises an error +- newlines in host will no longer get unescaped during normalization +- stricter handling of bogus scheme values +- stricter handling of encoded port values +- calling `require 'addressable'` will now load both the URI and Template files +- assigning to the `hostname` component with an `IPAddr` object is now supported +- assigning to the `origin` component is now supported +- fixed minor bug where an exception would be thrown for a missing ACE suffix +- better partial expansion of URI templates + +# Addressable 2.3.8 +- fix warnings +- update dependency gems +- support for 1.8.x officially deprecated + +# Addressable 2.3.7 +- fix scenario in which invalid URIs don't get an exception until inspected +- handle hostnames with two adjacent periods correctly +- upgrade of RSpec + +# Addressable 2.3.6 +- normalization drops empty query string +- better handling in template extract for missing values +- template modifier for `'?'` now treated as optional +- fixed issue where character class parameters were modified +- templates can now be tested for equality +- added `:sorted` option to normalization of query strings +- fixed issue with normalization of hosts given in `'example.com.'` form + +# Addressable 2.3.5 +- added Addressable::URI#empty? method +- Addressable::URI#hostname methods now strip square brackets from IPv6 hosts +- compatibility with Net::HTTP in Ruby 2.0.0 +- Addressable::URI#route_from should always give relative URIs + +# Addressable 2.3.4 +- fixed issue with encoding altering its inputs +- query string normalization now leaves ';' characters alone +- FakeFS is detected before attempting to load unicode tables +- additional testing to ensure frozen objects don't cause problems + +# Addressable 2.3.3 +- fixed issue with converting common primitives during template expansion +- fixed port encoding issue +- removed a few warnings +- normalize should now ignore %2B in query strings +- the IDNA logic should now be handled by libidn in Ruby 1.9 +- no template match should now result in nil instead of an empty MatchData +- added license information to gemspec + +# Addressable 2.3.2 +- added Addressable::URI#default_port method +- fixed issue with Marshalling Unicode data on Windows +- improved heuristic parsing to better handle IPv4 addresses + +# Addressable 2.3.1 +- fixed missing unicode data file + +# Addressable 2.3.0 +- updated Addressable::Template to use RFC 6570, level 4 +- fixed compatibility problems with some versions of Ruby +- moved unicode tables into a data file for performance reasons +- removing support for multiple query value notations + +# Addressable 2.2.8 +- fixed issues with dot segment removal code +- form encoding can now handle multiple values per key +- updated development environment + +# Addressable 2.2.7 +- fixed issues related to Addressable::URI#query_values= +- the Addressable::URI.parse method is now polymorphic + +# Addressable 2.2.6 +- changed the way ambiguous paths are handled +- fixed bug with frozen URIs +- https supported in heuristic parsing + +# Addressable 2.2.5 +- 'parsing' a pre-parsed URI object is now a dup operation +- introduced conditional support for libidn +- fixed normalization issue on ampersands in query strings +- added additional tests around handling of query strings + +# Addressable 2.2.4 +- added origin support from draft-ietf-websec-origin-00 +- resolved issue with attempting to navigate below root +- fixed bug with string splitting in query strings + +# Addressable 2.2.3 +- added :flat_array notation for query strings + +# Addressable 2.2.2 +- fixed issue with percent escaping of '+' character in query strings + +# Addressable 2.2.1 +- added support for application/x-www-form-urlencoded. + +# Addressable 2.2.0 +- added site methods +- improved documentation + +# Addressable 2.1.2 +- added HTTP request URI methods +- better handling of Windows file paths +- validation_deferred boolean replaced with defer_validation block +- normalization of percent-encoded paths should now be correct +- fixed issue with constructing URIs with relative paths +- fixed warnings + +# Addressable 2.1.1 +- more type checking changes +- fixed issue with unicode normalization +- added method to find template defaults +- symbolic keys are now allowed in template mappings +- numeric values and symbolic values are now allowed in template mappings + +# Addressable 2.1.0 +- refactored URI template support out into its own class +- removed extract method due to being useless and unreliable +- removed Addressable::URI.expand_template +- removed Addressable::URI#extract_mapping +- added partial template expansion +- fixed minor bugs in the parse and heuristic_parse methods +- fixed incompatibility with Ruby 1.9.1 +- fixed bottleneck in Addressable::URI#hash and Addressable::URI#to_s +- fixed unicode normalization exception +- updated query_values methods to better handle subscript notation +- worked around issue with freezing URIs +- improved specs + +# Addressable 2.0.2 +- fixed issue with URI template expansion +- fixed issue with percent escaping characters 0-15 + +# Addressable 2.0.1 +- fixed issue with query string assignment +- fixed issue with improperly encoded components + +# Addressable 2.0.0 +- the initialize method now takes an options hash as its only parameter +- added query_values method to URI class +- completely replaced IDNA implementation with pure Ruby +- renamed Addressable::ADDRESSABLE_VERSION to Addressable::VERSION +- completely reworked the Rakefile +- changed the behavior of the port method significantly +- Addressable::URI.encode_segment, Addressable::URI.unencode_segment renamed +- documentation is now in YARD format +- more rigorous type checking +- to_str method implemented, implicit conversion to Strings now allowed +- Addressable::URI#omit method added, Addressable::URI#merge method replaced +- updated URI Template code to match v 03 of the draft spec +- added a bunch of new specifications + +# Addressable 1.0.4 +- switched to using RSpec's pending system for specs that rely on IDN +- fixed issue with creating URIs with paths that are not prefixed with '/' + +# Addressable 1.0.3 +- implemented a hash method + +# Addressable 1.0.2 +- fixed minor bug with the extract_mapping method + +# Addressable 1.0.1 +- fixed minor bug with the extract_mapping method + +# Addressable 1.0.0 +- heuristic parse method added +- parsing is slightly more strict +- replaced to_h with to_hash +- fixed routing methods +- improved specifications +- improved heckle rake task +- no surviving heckle mutations + +# Addressable 0.1.2 +- improved normalization +- fixed bug in joining algorithm +- updated specifications + +# Addressable 0.1.1 +- updated documentation +- added URI Template variable extraction + +# Addressable 0.1.0 +- initial release +- implementation based on RFC 3986, 3987 +- support for IRIs via libidn +- support for the URI Template draft spec diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/Gemfile new file mode 100644 index 000000000000..2684c1543c1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/Gemfile @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +gemspec(path: __FILE__ == "(eval)" ? ".." : ".") + +group :test do + gem 'rspec', '~> 3.8' + gem 'rspec-its', '~> 1.3' +end + +group :coverage do + gem "coveralls", "> 0.7", require: false, platforms: :mri + gem "simplecov", require: false +end + +group :development do + gem 'launchy', '~> 2.4', '>= 2.4.3' + gem 'redcarpet', :platform => :mri_19 + gem 'yard' +end + +group :test, :development do + gem 'memory_profiler' + gem "rake", ">= 12.3.3" +end + +gem "idn-ruby", platform: :mri diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/LICENSE.txt new file mode 100644 index 000000000000..ef51da2b0e8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/README.md b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/README.md new file mode 100644 index 000000000000..9892f6151445 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/README.md @@ -0,0 +1,121 @@ +# Addressable + +
+
Homepage
github.com/sporkmonger/addressable
+
Author
Bob Aman
+
Copyright
Copyright © Bob Aman
+
License
Apache 2.0
+
+ +[![Gem Version](https://img.shields.io/gem/dt/addressable.svg)][gem] +[![Build Status](https://github.com/sporkmonger/addressable/workflows/CI/badge.svg)][actions] +[![Test Coverage Status](https://img.shields.io/coveralls/sporkmonger/addressable.svg)][coveralls] +[![Documentation Coverage Status](https://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch] + +[gem]: https://rubygems.org/gems/addressable +[actions]: https://github.com/sporkmonger/addressable/actions +[coveralls]: https://coveralls.io/r/sporkmonger/addressable +[inch]: https://inch-ci.org/github/sporkmonger/addressable + +# Description + +Addressable is an alternative implementation to the URI implementation +that is part of Ruby's standard library. It is flexible, offers heuristic +parsing, and additionally provides extensive support for IRIs and URI templates. + +Addressable closely conforms to RFC 3986, RFC 3987, and RFC 6570 (level 4). + +# Reference + +- {Addressable::URI} +- {Addressable::Template} + +# Example usage + +```ruby +require "addressable/uri" + +uri = Addressable::URI.parse("http://example.com/path/to/resource/") +uri.scheme +#=> "http" +uri.host +#=> "example.com" +uri.path +#=> "/path/to/resource/" + +uri = Addressable::URI.parse("http://www.詹姆斯.com/") +uri.normalize +#=> # +``` + + +# URI Templates + +For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt). + + +```ruby + +require "addressable/template" + +template = Addressable::Template.new("http://example.com/{?query*}") +template.expand({ + "query" => { + 'foo' => 'bar', + 'color' => 'red' + } +}) +#=> # + +template = Addressable::Template.new("http://example.com/{?one,two,three}") +template.partial_expand({"one" => "1", "three" => 3}).pattern +#=> "http://example.com/?one=1{&two}&three=3" + +template = Addressable::Template.new( + "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" +) +uri = Addressable::URI.parse( + "http://example.com/a/b/c/?one=1&two=2#foo" +) +template.extract(uri) +#=> +# { +# "host" => "example.com", +# "segments" => ["a", "b", "c"], +# "one" => "1", +# "two" => "2", +# "fragment" => "foo" +# } +``` + +# Install + +```console +$ gem install addressable +``` + +You may optionally turn on native IDN support by installing libidn and the +idn gem: + +```console +$ sudo apt-get install libidn11-dev # Debian/Ubuntu +$ brew install libidn # OS X +$ gem install idn-ruby +``` + +# Semantic Versioning + +This project uses [Semantic Versioning](https://semver.org/). You can (and should) specify your +dependency using a pessimistic version constraint covering the major and minor +values: + +```ruby +spec.add_dependency 'addressable', '~> 2.7' +``` + +If you need a specific bug fix, you can also specify minimum tiny versions +without preventing updates to the latest minor release: + +```ruby +spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7' +``` diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/Rakefile new file mode 100644 index 000000000000..b7e0ff31e27c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/Rakefile @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'rubygems' +require 'rake' + +require File.join(File.dirname(__FILE__), 'lib', 'addressable', 'version') + +PKG_DISPLAY_NAME = 'Addressable' +PKG_NAME = PKG_DISPLAY_NAME.downcase +PKG_VERSION = Addressable::VERSION::STRING +PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" + +RELEASE_NAME = "REL #{PKG_VERSION}" + +PKG_SUMMARY = "URI Implementation" +PKG_DESCRIPTION = <<-TEXT +Addressable is an alternative implementation to the URI implementation that is +part of Ruby's standard library. It is flexible, offers heuristic parsing, and +additionally provides extensive support for IRIs and URI templates. +TEXT + +PKG_FILES = FileList[ + "lib/**/*", "spec/**/*", "vendor/**/*", "data/**/*", + "tasks/**/*", + "[A-Z]*", "Rakefile" +].exclude(/pkg/).exclude(/database\.yml/). + exclude(/Gemfile\.lock/).exclude(/[_\.]git$/) + +task :default => "spec" + +WINDOWS = (RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/) rescue false +SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS']) + +Dir['tasks/**/*.rake'].each { |rake| load rake } diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/addressable.gemspec b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/addressable.gemspec new file mode 100644 index 000000000000..12666a0681c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/addressable.gemspec @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- +# stub: addressable 2.8.0 ruby lib + +Gem::Specification.new do |s| + s.name = "addressable".freeze + s.version = "2.8.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Bob Aman".freeze] + s.date = "2021-07-03" + s.description = "Addressable is an alternative implementation to the URI implementation that is\npart of Ruby's standard library. It is flexible, offers heuristic parsing, and\nadditionally provides extensive support for IRIs and URI templates.\n".freeze + s.email = "bob@sporkmonger.com".freeze + s.extra_rdoc_files = ["README.md".freeze] + s.files = ["CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE.txt".freeze, "README.md".freeze, "Rakefile".freeze, "addressable.gemspec".freeze, "data/unicode.data".freeze, "lib/addressable.rb".freeze, "lib/addressable/idna.rb".freeze, "lib/addressable/idna/native.rb".freeze, "lib/addressable/idna/pure.rb".freeze, "lib/addressable/template.rb".freeze, "lib/addressable/uri.rb".freeze, "lib/addressable/version.rb".freeze, "spec/addressable/idna_spec.rb".freeze, "spec/addressable/net_http_compat_spec.rb".freeze, "spec/addressable/security_spec.rb".freeze, "spec/addressable/template_spec.rb".freeze, "spec/addressable/uri_spec.rb".freeze, "spec/spec_helper.rb".freeze, "tasks/clobber.rake".freeze, "tasks/gem.rake".freeze, "tasks/git.rake".freeze, "tasks/metrics.rake".freeze, "tasks/profile.rake".freeze, "tasks/rspec.rake".freeze, "tasks/yard.rake".freeze] + s.homepage = "https://github.com/sporkmonger/addressable".freeze + s.licenses = ["Apache-2.0".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) + s.rubygems_version = "3.0.3".freeze + s.summary = "URI Implementation".freeze + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q.freeze, [">= 2.0.2", "< 5.0"]) + s.add_development_dependency(%q.freeze, [">= 1.0", "< 3.0"]) + else + s.add_dependency(%q.freeze, [">= 2.0.2", "< 5.0"]) + s.add_dependency(%q.freeze, [">= 1.0", "< 3.0"]) + end + else + s.add_dependency(%q.freeze, [">= 2.0.2", "< 5.0"]) + s.add_dependency(%q.freeze, [">= 1.0", "< 3.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/data/unicode.data b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/data/unicode.data new file mode 100644 index 000000000000..cdfc22418a51 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/data/unicode.data differ diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable.rb new file mode 100644 index 000000000000..b4e98b69656a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +require 'addressable/uri' +require 'addressable/template' diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/idna.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/idna.rb new file mode 100644 index 000000000000..e41c1f5da4ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/idna.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +begin + require "addressable/idna/native" +rescue LoadError + # libidn or the idn gem was not available, fall back on a pure-Ruby + # implementation... + require "addressable/idna/pure" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/idna/native.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/idna/native.rb new file mode 100644 index 000000000000..84de8e8cb48c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/idna/native.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +require "idn" + +module Addressable + module IDNA + def self.punycode_encode(value) + IDN::Punycode.encode(value.to_s) + end + + def self.punycode_decode(value) + IDN::Punycode.decode(value.to_s) + end + + def self.unicode_normalize_kc(value) + IDN::Stringprep.nfkc_normalize(value.to_s) + end + + def self.to_ascii(value) + value.to_s.split('.', -1).map do |segment| + if segment.size > 0 && segment.size < 64 + IDN::Idna.toASCII(segment, IDN::Idna::ALLOW_UNASSIGNED) + elsif segment.size >= 64 + segment + else + '' + end + end.join('.') + end + + def self.to_unicode(value) + value.to_s.split('.', -1).map do |segment| + if segment.size > 0 && segment.size < 64 + IDN::Idna.toUnicode(segment, IDN::Idna::ALLOW_UNASSIGNED) + elsif segment.size >= 64 + segment + else + '' + end + end.join('.') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/idna/pure.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/idna/pure.rb new file mode 100644 index 000000000000..7a0c1fda228c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/idna/pure.rb @@ -0,0 +1,678 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +module Addressable + module IDNA + # This module is loosely based on idn_actionmailer by Mick Staugaard, + # the unicode library by Yoshida Masato, and the punycode implementation + # by Kazuhiro Nishiyama. Most of the code was copied verbatim, but + # some reformatting was done, and some translation from C was done. + # + # Without their code to work from as a base, we'd all still be relying + # on the presence of libidn. Which nobody ever seems to have installed. + # + # Original sources: + # http://github.com/staugaard/idn_actionmailer + # http://www.yoshidam.net/Ruby.html#unicode + # http://rubyforge.org/frs/?group_id=2550 + + + UNICODE_TABLE = File.expand_path( + File.join(File.dirname(__FILE__), '../../..', 'data/unicode.data') + ) + + ACE_PREFIX = "xn--" + + UTF8_REGEX = /\A(?: + [\x09\x0A\x0D\x20-\x7E] # ASCII + | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte + | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte + | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates + | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 + | [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5 + | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 + )*\z/mnx + + UTF8_REGEX_MULTIBYTE = /(?: + [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte + | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte + | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates + | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 + | [\xF1-\xF3][\x80-\xBF]{3} # planes 4nil5 + | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 + )/mnx + + # :startdoc: + + # Converts from a Unicode internationalized domain name to an ASCII + # domain name as described in RFC 3490. + def self.to_ascii(input) + input = input.to_s unless input.is_a?(String) + input = input.dup + if input.respond_to?(:force_encoding) + input.force_encoding(Encoding::ASCII_8BIT) + end + if input =~ UTF8_REGEX && input =~ UTF8_REGEX_MULTIBYTE + parts = unicode_downcase(input).split('.') + parts.map! do |part| + if part.respond_to?(:force_encoding) + part.force_encoding(Encoding::ASCII_8BIT) + end + if part =~ UTF8_REGEX && part =~ UTF8_REGEX_MULTIBYTE + ACE_PREFIX + punycode_encode(unicode_normalize_kc(part)) + else + part + end + end + parts.join('.') + else + input + end + end + + # Converts from an ASCII domain name to a Unicode internationalized + # domain name as described in RFC 3490. + def self.to_unicode(input) + input = input.to_s unless input.is_a?(String) + parts = input.split('.') + parts.map! do |part| + if part =~ /^#{ACE_PREFIX}(.+)/ + begin + punycode_decode(part[/^#{ACE_PREFIX}(.+)/, 1]) + rescue Addressable::IDNA::PunycodeBadInput + # toUnicode is explicitly defined as never-fails by the spec + part + end + else + part + end + end + output = parts.join('.') + if output.respond_to?(:force_encoding) + output.force_encoding(Encoding::UTF_8) + end + output + end + + # Unicode normalization form KC. + def self.unicode_normalize_kc(input) + input = input.to_s unless input.is_a?(String) + unpacked = input.unpack("U*") + unpacked = + unicode_compose(unicode_sort_canonical(unicode_decompose(unpacked))) + return unpacked.pack("U*") + end + + ## + # Unicode aware downcase method. + # + # @api private + # @param [String] input + # The input string. + # @return [String] The downcased result. + def self.unicode_downcase(input) + input = input.to_s unless input.is_a?(String) + unpacked = input.unpack("U*") + unpacked.map! { |codepoint| lookup_unicode_lowercase(codepoint) } + return unpacked.pack("U*") + end + private_class_method :unicode_downcase + + def self.unicode_compose(unpacked) + unpacked_result = [] + length = unpacked.length + + return unpacked if length == 0 + + starter = unpacked[0] + starter_cc = lookup_unicode_combining_class(starter) + starter_cc = 256 if starter_cc != 0 + for i in 1...length + ch = unpacked[i] + + if (starter_cc == 0 && + (composite = unicode_compose_pair(starter, ch)) != nil) + starter = composite + else + unpacked_result << starter + starter = ch + end + end + unpacked_result << starter + return unpacked_result + end + private_class_method :unicode_compose + + def self.unicode_compose_pair(ch_one, ch_two) + if ch_one >= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT && + ch_two >= HANGUL_VBASE && ch_two < HANGUL_VBASE + HANGUL_VCOUNT + # Hangul L + V + return HANGUL_SBASE + ( + (ch_one - HANGUL_LBASE) * HANGUL_VCOUNT + (ch_two - HANGUL_VBASE) + ) * HANGUL_TCOUNT + elsif ch_one >= HANGUL_SBASE && + ch_one < HANGUL_SBASE + HANGUL_SCOUNT && + (ch_one - HANGUL_SBASE) % HANGUL_TCOUNT == 0 && + ch_two >= HANGUL_TBASE && ch_two < HANGUL_TBASE + HANGUL_TCOUNT + # Hangul LV + T + return ch_one + (ch_two - HANGUL_TBASE) + end + + p = [] + + ucs4_to_utf8(ch_one, p) + ucs4_to_utf8(ch_two, p) + + return lookup_unicode_composition(p) + end + private_class_method :unicode_compose_pair + + def self.ucs4_to_utf8(char, buffer) + if char < 128 + buffer << char + elsif char < 2048 + buffer << (char >> 6 | 192) + buffer << (char & 63 | 128) + elsif char < 0x10000 + buffer << (char >> 12 | 224) + buffer << (char >> 6 & 63 | 128) + buffer << (char & 63 | 128) + elsif char < 0x200000 + buffer << (char >> 18 | 240) + buffer << (char >> 12 & 63 | 128) + buffer << (char >> 6 & 63 | 128) + buffer << (char & 63 | 128) + elsif char < 0x4000000 + buffer << (char >> 24 | 248) + buffer << (char >> 18 & 63 | 128) + buffer << (char >> 12 & 63 | 128) + buffer << (char >> 6 & 63 | 128) + buffer << (char & 63 | 128) + elsif char < 0x80000000 + buffer << (char >> 30 | 252) + buffer << (char >> 24 & 63 | 128) + buffer << (char >> 18 & 63 | 128) + buffer << (char >> 12 & 63 | 128) + buffer << (char >> 6 & 63 | 128) + buffer << (char & 63 | 128) + end + end + private_class_method :ucs4_to_utf8 + + def self.unicode_sort_canonical(unpacked) + unpacked = unpacked.dup + i = 1 + length = unpacked.length + + return unpacked if length < 2 + + while i < length + last = unpacked[i-1] + ch = unpacked[i] + last_cc = lookup_unicode_combining_class(last) + cc = lookup_unicode_combining_class(ch) + if cc != 0 && last_cc != 0 && last_cc > cc + unpacked[i] = last + unpacked[i-1] = ch + i -= 1 if i > 1 + else + i += 1 + end + end + return unpacked + end + private_class_method :unicode_sort_canonical + + def self.unicode_decompose(unpacked) + unpacked_result = [] + for cp in unpacked + if cp >= HANGUL_SBASE && cp < HANGUL_SBASE + HANGUL_SCOUNT + l, v, t = unicode_decompose_hangul(cp) + unpacked_result << l + unpacked_result << v if v + unpacked_result << t if t + else + dc = lookup_unicode_compatibility(cp) + unless dc + unpacked_result << cp + else + unpacked_result.concat(unicode_decompose(dc.unpack("U*"))) + end + end + end + return unpacked_result + end + private_class_method :unicode_decompose + + def self.unicode_decompose_hangul(codepoint) + sindex = codepoint - HANGUL_SBASE; + if sindex < 0 || sindex >= HANGUL_SCOUNT + l = codepoint + v = t = nil + return l, v, t + end + l = HANGUL_LBASE + sindex / HANGUL_NCOUNT + v = HANGUL_VBASE + (sindex % HANGUL_NCOUNT) / HANGUL_TCOUNT + t = HANGUL_TBASE + sindex % HANGUL_TCOUNT + if t == HANGUL_TBASE + t = nil + end + return l, v, t + end + private_class_method :unicode_decompose_hangul + + def self.lookup_unicode_combining_class(codepoint) + codepoint_data = UNICODE_DATA[codepoint] + (codepoint_data ? + (codepoint_data[UNICODE_DATA_COMBINING_CLASS] || 0) : + 0) + end + private_class_method :lookup_unicode_combining_class + + def self.lookup_unicode_compatibility(codepoint) + codepoint_data = UNICODE_DATA[codepoint] + (codepoint_data ? + codepoint_data[UNICODE_DATA_COMPATIBILITY] : nil) + end + private_class_method :lookup_unicode_compatibility + + def self.lookup_unicode_lowercase(codepoint) + codepoint_data = UNICODE_DATA[codepoint] + (codepoint_data ? + (codepoint_data[UNICODE_DATA_LOWERCASE] || codepoint) : + codepoint) + end + private_class_method :lookup_unicode_lowercase + + def self.lookup_unicode_composition(unpacked) + return COMPOSITION_TABLE[unpacked] + end + private_class_method :lookup_unicode_composition + + HANGUL_SBASE = 0xac00 + HANGUL_LBASE = 0x1100 + HANGUL_LCOUNT = 19 + HANGUL_VBASE = 0x1161 + HANGUL_VCOUNT = 21 + HANGUL_TBASE = 0x11a7 + HANGUL_TCOUNT = 28 + HANGUL_NCOUNT = HANGUL_VCOUNT * HANGUL_TCOUNT # 588 + HANGUL_SCOUNT = HANGUL_LCOUNT * HANGUL_NCOUNT # 11172 + + UNICODE_DATA_COMBINING_CLASS = 0 + UNICODE_DATA_EXCLUSION = 1 + UNICODE_DATA_CANONICAL = 2 + UNICODE_DATA_COMPATIBILITY = 3 + UNICODE_DATA_UPPERCASE = 4 + UNICODE_DATA_LOWERCASE = 5 + UNICODE_DATA_TITLECASE = 6 + + begin + if defined?(FakeFS) + fakefs_state = FakeFS.activated? + FakeFS.deactivate! + end + # This is a sparse Unicode table. Codepoints without entries are + # assumed to have the value: [0, 0, nil, nil, nil, nil, nil] + UNICODE_DATA = File.open(UNICODE_TABLE, "rb") do |file| + Marshal.load(file.read) + end + ensure + if defined?(FakeFS) + FakeFS.activate! if fakefs_state + end + end + + COMPOSITION_TABLE = {} + UNICODE_DATA.each do |codepoint, data| + canonical = data[UNICODE_DATA_CANONICAL] + exclusion = data[UNICODE_DATA_EXCLUSION] + + if canonical && exclusion == 0 + COMPOSITION_TABLE[canonical.unpack("C*")] = codepoint + end + end + + UNICODE_MAX_LENGTH = 256 + ACE_MAX_LENGTH = 256 + + PUNYCODE_BASE = 36 + PUNYCODE_TMIN = 1 + PUNYCODE_TMAX = 26 + PUNYCODE_SKEW = 38 + PUNYCODE_DAMP = 700 + PUNYCODE_INITIAL_BIAS = 72 + PUNYCODE_INITIAL_N = 0x80 + PUNYCODE_DELIMITER = 0x2D + + PUNYCODE_MAXINT = 1 << 64 + + PUNYCODE_PRINT_ASCII = + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + + " !\"\#$%&'()*+,-./" + + "0123456789:;<=>?" + + "@ABCDEFGHIJKLMNO" + + "PQRSTUVWXYZ[\\]^_" + + "`abcdefghijklmno" + + "pqrstuvwxyz{|}~\n" + + # Input is invalid. + class PunycodeBadInput < StandardError; end + # Output would exceed the space provided. + class PunycodeBigOutput < StandardError; end + # Input needs wider integers to process. + class PunycodeOverflow < StandardError; end + + def self.punycode_encode(unicode) + unicode = unicode.to_s unless unicode.is_a?(String) + input = unicode.unpack("U*") + output = [0] * (ACE_MAX_LENGTH + 1) + input_length = input.size + output_length = [ACE_MAX_LENGTH] + + # Initialize the state + n = PUNYCODE_INITIAL_N + delta = out = 0 + max_out = output_length[0] + bias = PUNYCODE_INITIAL_BIAS + + # Handle the basic code points: + input_length.times do |j| + if punycode_basic?(input[j]) + if max_out - out < 2 + raise PunycodeBigOutput, + "Output would exceed the space provided." + end + output[out] = input[j] + out += 1 + end + end + + h = b = out + + # h is the number of code points that have been handled, b is the + # number of basic code points, and out is the number of characters + # that have been output. + + if b > 0 + output[out] = PUNYCODE_DELIMITER + out += 1 + end + + # Main encoding loop: + + while h < input_length + # All non-basic code points < n have been + # handled already. Find the next larger one: + + m = PUNYCODE_MAXINT + input_length.times do |j| + m = input[j] if (n...m) === input[j] + end + + # Increase delta enough to advance the decoder's + # state to , but guard against overflow: + + if m - n > (PUNYCODE_MAXINT - delta) / (h + 1) + raise PunycodeOverflow, "Input needs wider integers to process." + end + delta += (m - n) * (h + 1) + n = m + + input_length.times do |j| + # Punycode does not need to check whether input[j] is basic: + if input[j] < n + delta += 1 + if delta == 0 + raise PunycodeOverflow, + "Input needs wider integers to process." + end + end + + if input[j] == n + # Represent delta as a generalized variable-length integer: + + q = delta; k = PUNYCODE_BASE + while true + if out >= max_out + raise PunycodeBigOutput, + "Output would exceed the space provided." + end + t = ( + if k <= bias + PUNYCODE_TMIN + elsif k >= bias + PUNYCODE_TMAX + PUNYCODE_TMAX + else + k - bias + end + ) + break if q < t + output[out] = + punycode_encode_digit(t + (q - t) % (PUNYCODE_BASE - t)) + out += 1 + q = (q - t) / (PUNYCODE_BASE - t) + k += PUNYCODE_BASE + end + + output[out] = punycode_encode_digit(q) + out += 1 + bias = punycode_adapt(delta, h + 1, h == b) + delta = 0 + h += 1 + end + end + + delta += 1 + n += 1 + end + + output_length[0] = out + + outlen = out + outlen.times do |j| + c = output[j] + unless c >= 0 && c <= 127 + raise StandardError, "Invalid output char." + end + unless PUNYCODE_PRINT_ASCII[c] + raise PunycodeBadInput, "Input is invalid." + end + end + + output[0..outlen].map { |x| x.chr }.join("").sub(/\0+\z/, "") + end + private_class_method :punycode_encode + + def self.punycode_decode(punycode) + input = [] + output = [] + + if ACE_MAX_LENGTH * 2 < punycode.size + raise PunycodeBigOutput, "Output would exceed the space provided." + end + punycode.each_byte do |c| + unless c >= 0 && c <= 127 + raise PunycodeBadInput, "Input is invalid." + end + input.push(c) + end + + input_length = input.length + output_length = [UNICODE_MAX_LENGTH] + + # Initialize the state + n = PUNYCODE_INITIAL_N + + out = i = 0 + max_out = output_length[0] + bias = PUNYCODE_INITIAL_BIAS + + # Handle the basic code points: Let b be the number of input code + # points before the last delimiter, or 0 if there is none, then + # copy the first b code points to the output. + + b = 0 + input_length.times do |j| + b = j if punycode_delimiter?(input[j]) + end + if b > max_out + raise PunycodeBigOutput, "Output would exceed the space provided." + end + + b.times do |j| + unless punycode_basic?(input[j]) + raise PunycodeBadInput, "Input is invalid." + end + output[out] = input[j] + out+=1 + end + + # Main decoding loop: Start just after the last delimiter if any + # basic code points were copied; start at the beginning otherwise. + + in_ = b > 0 ? b + 1 : 0 + while in_ < input_length + + # in_ is the index of the next character to be consumed, and + # out is the number of code points in the output array. + + # Decode a generalized variable-length integer into delta, + # which gets added to i. The overflow checking is easier + # if we increase i as we go, then subtract off its starting + # value at the end to obtain delta. + + oldi = i; w = 1; k = PUNYCODE_BASE + while true + if in_ >= input_length + raise PunycodeBadInput, "Input is invalid." + end + digit = punycode_decode_digit(input[in_]) + in_+=1 + if digit >= PUNYCODE_BASE + raise PunycodeBadInput, "Input is invalid." + end + if digit > (PUNYCODE_MAXINT - i) / w + raise PunycodeOverflow, "Input needs wider integers to process." + end + i += digit * w + t = ( + if k <= bias + PUNYCODE_TMIN + elsif k >= bias + PUNYCODE_TMAX + PUNYCODE_TMAX + else + k - bias + end + ) + break if digit < t + if w > PUNYCODE_MAXINT / (PUNYCODE_BASE - t) + raise PunycodeOverflow, "Input needs wider integers to process." + end + w *= PUNYCODE_BASE - t + k += PUNYCODE_BASE + end + + bias = punycode_adapt(i - oldi, out + 1, oldi == 0) + + # I was supposed to wrap around from out + 1 to 0, + # incrementing n each time, so we'll fix that now: + + if i / (out + 1) > PUNYCODE_MAXINT - n + raise PunycodeOverflow, "Input needs wider integers to process." + end + n += i / (out + 1) + i %= out + 1 + + # Insert n at position i of the output: + + # not needed for Punycode: + # raise PUNYCODE_INVALID_INPUT if decode_digit(n) <= base + if out >= max_out + raise PunycodeBigOutput, "Output would exceed the space provided." + end + + #memmove(output + i + 1, output + i, (out - i) * sizeof *output) + output[i + 1, out - i] = output[i, out - i] + output[i] = n + i += 1 + + out += 1 + end + + output_length[0] = out + + output.pack("U*") + end + private_class_method :punycode_decode + + def self.punycode_basic?(codepoint) + codepoint < 0x80 + end + private_class_method :punycode_basic? + + def self.punycode_delimiter?(codepoint) + codepoint == PUNYCODE_DELIMITER + end + private_class_method :punycode_delimiter? + + def self.punycode_encode_digit(d) + d + 22 + 75 * ((d < 26) ? 1 : 0) + end + private_class_method :punycode_encode_digit + + # Returns the numeric value of a basic codepoint + # (for use in representing integers) in the range 0 to + # base - 1, or PUNYCODE_BASE if codepoint does not represent a value. + def self.punycode_decode_digit(codepoint) + if codepoint - 48 < 10 + codepoint - 22 + elsif codepoint - 65 < 26 + codepoint - 65 + elsif codepoint - 97 < 26 + codepoint - 97 + else + PUNYCODE_BASE + end + end + private_class_method :punycode_decode_digit + + # Bias adaptation method + def self.punycode_adapt(delta, numpoints, firsttime) + delta = firsttime ? delta / PUNYCODE_DAMP : delta >> 1 + # delta >> 1 is a faster way of doing delta / 2 + delta += delta / numpoints + difference = PUNYCODE_BASE - PUNYCODE_TMIN + + k = 0 + while delta > (difference * PUNYCODE_TMAX) / 2 + delta /= difference + k += PUNYCODE_BASE + end + + k + (difference + 1) * delta / (delta + PUNYCODE_SKEW) + end + private_class_method :punycode_adapt + end + # :startdoc: +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/template.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/template.rb new file mode 100644 index 000000000000..45f6ae69eece --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/template.rb @@ -0,0 +1,1031 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +require "addressable/version" +require "addressable/uri" + +module Addressable + ## + # This is an implementation of a URI template based on + # RFC 6570 (http://tools.ietf.org/html/rfc6570). + class Template + # Constants used throughout the template code. + anything = + Addressable::URI::CharacterClasses::RESERVED + + Addressable::URI::CharacterClasses::UNRESERVED + + + variable_char_class = + Addressable::URI::CharacterClasses::ALPHA + + Addressable::URI::CharacterClasses::DIGIT + '_' + + var_char = + "(?>(?:[#{variable_char_class}]|%[a-fA-F0-9][a-fA-F0-9])+)" + RESERVED = + "(?:[#{anything}]|%[a-fA-F0-9][a-fA-F0-9])" + UNRESERVED = + "(?:[#{ + Addressable::URI::CharacterClasses::UNRESERVED + }]|%[a-fA-F0-9][a-fA-F0-9])" + variable = + "(?:#{var_char}(?:\\.?#{var_char})*)" + varspec = + "(?:(#{variable})(\\*|:\\d+)?)" + VARNAME = + /^#{variable}$/ + VARSPEC = + /^#{varspec}$/ + VARIABLE_LIST = + /^#{varspec}(?:,#{varspec})*$/ + operator = + "+#./;?&=,!@|" + EXPRESSION = + /\{([#{operator}])?(#{varspec}(?:,#{varspec})*)\}/ + + + LEADERS = { + '?' => '?', + '/' => '/', + '#' => '#', + '.' => '.', + ';' => ';', + '&' => '&' + } + JOINERS = { + '?' => '&', + '.' => '.', + ';' => ';', + '&' => '&', + '/' => '/' + } + + ## + # Raised if an invalid template value is supplied. + class InvalidTemplateValueError < StandardError + end + + ## + # Raised if an invalid template operator is used in a pattern. + class InvalidTemplateOperatorError < StandardError + end + + ## + # Raised if an invalid template operator is used in a pattern. + class TemplateOperatorAbortedError < StandardError + end + + ## + # This class represents the data that is extracted when a Template + # is matched against a URI. + class MatchData + ## + # Creates a new MatchData object. + # MatchData objects should never be instantiated directly. + # + # @param [Addressable::URI] uri + # The URI that the template was matched against. + def initialize(uri, template, mapping) + @uri = uri.dup.freeze + @template = template + @mapping = mapping.dup.freeze + end + + ## + # @return [Addressable::URI] + # The URI that the Template was matched against. + attr_reader :uri + + ## + # @return [Addressable::Template] + # The Template used for the match. + attr_reader :template + + ## + # @return [Hash] + # The mapping that resulted from the match. + # Note that this mapping does not include keys or values for + # variables that appear in the Template, but are not present + # in the URI. + attr_reader :mapping + + ## + # @return [Array] + # The list of variables that were present in the Template. + # Note that this list will include variables which do not appear + # in the mapping because they were not present in URI. + def variables + self.template.variables + end + alias_method :keys, :variables + alias_method :names, :variables + + ## + # @return [Array] + # The list of values that were captured by the Template. + # Note that this list will include nils for any variables which + # were in the Template, but did not appear in the URI. + def values + @values ||= self.variables.inject([]) do |accu, key| + accu << self.mapping[key] + accu + end + end + alias_method :captures, :values + + ## + # Accesses captured values by name or by index. + # + # @param [String, Symbol, Fixnum] key + # Capture index or name. Note that when accessing by with index + # of 0, the full URI will be returned. The intention is to mimic + # the ::MatchData#[] behavior. + # + # @param [#to_int, nil] len + # If provided, an array of values will be returend with the given + # parameter used as length. + # + # @return [Array, String, nil] + # The captured value corresponding to the index or name. If the + # value was not provided or the key is unknown, nil will be + # returned. + # + # If the second parameter is provided, an array of that length will + # be returned instead. + def [](key, len = nil) + if len + to_a[key, len] + elsif String === key or Symbol === key + mapping[key.to_s] + else + to_a[key] + end + end + + ## + # @return [Array] + # Array with the matched URI as first element followed by the captured + # values. + def to_a + [to_s, *values] + end + + ## + # @return [String] + # The matched URI as String. + def to_s + uri.to_s + end + alias_method :string, :to_s + + # Returns multiple captured values at once. + # + # @param [String, Symbol, Fixnum] *indexes + # Indices of the captures to be returned + # + # @return [Array] + # Values corresponding to given indices. + # + # @see Addressable::Template::MatchData#[] + def values_at(*indexes) + indexes.map { |i| self[i] } + end + + ## + # Returns a String representation of the MatchData's state. + # + # @return [String] The MatchData's state, as a String. + def inspect + sprintf("#<%s:%#0x RESULT:%s>", + self.class.to_s, self.object_id, self.mapping.inspect) + end + + ## + # Dummy method for code expecting a ::MatchData instance + # + # @return [String] An empty string. + def pre_match + "" + end + alias_method :post_match, :pre_match + end + + ## + # Creates a new Addressable::Template object. + # + # @param [#to_str] pattern The URI Template pattern. + # + # @return [Addressable::Template] The initialized Template object. + def initialize(pattern) + if !pattern.respond_to?(:to_str) + raise TypeError, "Can't convert #{pattern.class} into String." + end + @pattern = pattern.to_str.dup.freeze + end + + ## + # Freeze URI, initializing instance variables. + # + # @return [Addressable::URI] The frozen URI object. + def freeze + self.variables + self.variable_defaults + self.named_captures + super + end + + ## + # @return [String] The Template object's pattern. + attr_reader :pattern + + ## + # Returns a String representation of the Template object's state. + # + # @return [String] The Template object's state, as a String. + def inspect + sprintf("#<%s:%#0x PATTERN:%s>", + self.class.to_s, self.object_id, self.pattern) + end + + ## + # Returns true if the Template objects are equal. This method + # does NOT normalize either Template before doing the comparison. + # + # @param [Object] template The Template to compare. + # + # @return [TrueClass, FalseClass] + # true if the Templates are equivalent, false + # otherwise. + def ==(template) + return false unless template.kind_of?(Template) + return self.pattern == template.pattern + end + + ## + # Addressable::Template makes no distinction between `==` and `eql?`. + # + # @see #== + alias_method :eql?, :== + + ## + # Extracts a mapping from the URI using a URI Template pattern. + # + # @param [Addressable::URI, #to_str] uri + # The URI to extract from. + # + # @param [#restore, #match] processor + # A template processor object may optionally be supplied. + # + # The object should respond to either the restore or + # match messages or both. The restore method should + # take two parameters: `[String] name` and `[String] value`. + # The restore method should reverse any transformations that + # have been performed on the value to ensure a valid URI. + # The match method should take a single + # parameter: `[String] name`. The match method should return + # a String containing a regular expression capture group for + # matching on that particular variable. The default value is `".*?"`. + # The match method has no effect on multivariate operator + # expansions. + # + # @return [Hash, NilClass] + # The Hash mapping that was extracted from the URI, or + # nil if the URI didn't match the template. + # + # @example + # class ExampleProcessor + # def self.restore(name, value) + # return value.gsub(/\+/, " ") if name == "query" + # return value + # end + # + # def self.match(name) + # return ".*?" if name == "first" + # return ".*" + # end + # end + # + # uri = Addressable::URI.parse( + # "http://example.com/search/an+example+search+query/" + # ) + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).extract(uri, ExampleProcessor) + # #=> {"query" => "an example search query"} + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # Addressable::Template.new( + # "http://example.com/{first}/{second}/" + # ).extract(uri, ExampleProcessor) + # #=> {"first" => "a", "second" => "b/c"} + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # Addressable::Template.new( + # "http://example.com/{first}/{-list|/|second}/" + # ).extract(uri) + # #=> {"first" => "a", "second" => ["b", "c"]} + def extract(uri, processor=nil) + match_data = self.match(uri, processor) + return (match_data ? match_data.mapping : nil) + end + + ## + # Extracts match data from the URI using a URI Template pattern. + # + # @param [Addressable::URI, #to_str] uri + # The URI to extract from. + # + # @param [#restore, #match] processor + # A template processor object may optionally be supplied. + # + # The object should respond to either the restore or + # match messages or both. The restore method should + # take two parameters: `[String] name` and `[String] value`. + # The restore method should reverse any transformations that + # have been performed on the value to ensure a valid URI. + # The match method should take a single + # parameter: `[String] name`. The match method should return + # a String containing a regular expression capture group for + # matching on that particular variable. The default value is `".*?"`. + # The match method has no effect on multivariate operator + # expansions. + # + # @return [Hash, NilClass] + # The Hash mapping that was extracted from the URI, or + # nil if the URI didn't match the template. + # + # @example + # class ExampleProcessor + # def self.restore(name, value) + # return value.gsub(/\+/, " ") if name == "query" + # return value + # end + # + # def self.match(name) + # return ".*?" if name == "first" + # return ".*" + # end + # end + # + # uri = Addressable::URI.parse( + # "http://example.com/search/an+example+search+query/" + # ) + # match = Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).match(uri, ExampleProcessor) + # match.variables + # #=> ["query"] + # match.captures + # #=> ["an example search query"] + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # match = Addressable::Template.new( + # "http://example.com/{first}/{+second}/" + # ).match(uri, ExampleProcessor) + # match.variables + # #=> ["first", "second"] + # match.captures + # #=> ["a", "b/c"] + # + # uri = Addressable::URI.parse("http://example.com/a/b/c/") + # match = Addressable::Template.new( + # "http://example.com/{first}{/second*}/" + # ).match(uri) + # match.variables + # #=> ["first", "second"] + # match.captures + # #=> ["a", ["b", "c"]] + def match(uri, processor=nil) + uri = Addressable::URI.parse(uri) unless uri.is_a?(Addressable::URI) + mapping = {} + + # First, we need to process the pattern, and extract the values. + expansions, expansion_regexp = + parse_template_pattern(pattern, processor) + + return nil unless uri.to_str.match(expansion_regexp) + unparsed_values = uri.to_str.scan(expansion_regexp).flatten + + if uri.to_str == pattern + return Addressable::Template::MatchData.new(uri, self, mapping) + elsif expansions.size > 0 + index = 0 + expansions.each do |expansion| + _, operator, varlist = *expansion.match(EXPRESSION) + varlist.split(',').each do |varspec| + _, name, modifier = *varspec.match(VARSPEC) + mapping[name] ||= nil + case operator + when nil, '+', '#', '/', '.' + unparsed_value = unparsed_values[index] + name = varspec[VARSPEC, 1] + value = unparsed_value + value = value.split(JOINERS[operator]) if value && modifier == '*' + when ';', '?', '&' + if modifier == '*' + if unparsed_values[index] + value = unparsed_values[index].split(JOINERS[operator]) + value = value.inject({}) do |acc, v| + key, val = v.split('=') + val = "" if val.nil? + acc[key] = val + acc + end + end + else + if (unparsed_values[index]) + name, value = unparsed_values[index].split('=') + value = "" if value.nil? + end + end + end + if processor != nil && processor.respond_to?(:restore) + value = processor.restore(name, value) + end + if processor == nil + if value.is_a?(Hash) + value = value.inject({}){|acc, (k, v)| + acc[Addressable::URI.unencode_component(k)] = + Addressable::URI.unencode_component(v) + acc + } + elsif value.is_a?(Array) + value = value.map{|v| Addressable::URI.unencode_component(v) } + else + value = Addressable::URI.unencode_component(value) + end + end + if !mapping.has_key?(name) || mapping[name].nil? + # Doesn't exist, set to value (even if value is nil) + mapping[name] = value + end + index = index + 1 + end + end + return Addressable::Template::MatchData.new(uri, self, mapping) + else + return nil + end + end + + ## + # Expands a URI template into another URI template. + # + # @param [Hash] mapping The mapping that corresponds to the pattern. + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError + # exception will be raised if the value is invalid. The transform + # method should return the transformed variable value as a String. + # If a transform method is used, the value will not be percent + # encoded automatically. Unicode normalization will be performed both + # before and after sending the value to the transform method. + # + # @return [Addressable::Template] The partially expanded URI template. + # + # @example + # Addressable::Template.new( + # "http://example.com/{one}/{two}/" + # ).partial_expand({"one" => "1"}).pattern + # #=> "http://example.com/1/{two}/" + # + # Addressable::Template.new( + # "http://example.com/{?one,two}/" + # ).partial_expand({"one" => "1"}).pattern + # #=> "http://example.com/?one=1{&two}/" + # + # Addressable::Template.new( + # "http://example.com/{?one,two,three}/" + # ).partial_expand({"one" => "1", "three" => 3}).pattern + # #=> "http://example.com/?one=1{&two}&three=3" + def partial_expand(mapping, processor=nil, normalize_values=true) + result = self.pattern.dup + mapping = normalize_keys(mapping) + result.gsub!( EXPRESSION ) do |capture| + transform_partial_capture(mapping, capture, processor, normalize_values) + end + return Addressable::Template.new(result) + end + + ## + # Expands a URI template into a full URI. + # + # @param [Hash] mapping The mapping that corresponds to the pattern. + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError + # exception will be raised if the value is invalid. The transform + # method should return the transformed variable value as a String. + # If a transform method is used, the value will not be percent + # encoded automatically. Unicode normalization will be performed both + # before and after sending the value to the transform method. + # + # @return [Addressable::URI] The expanded URI template. + # + # @example + # class ExampleProcessor + # def self.validate(name, value) + # return !!(value =~ /^[\w ]+$/) if name == "query" + # return true + # end + # + # def self.transform(name, value) + # return value.gsub(/ /, "+") if name == "query" + # return value + # end + # end + # + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).expand( + # {"query" => "an example search query"}, + # ExampleProcessor + # ).to_str + # #=> "http://example.com/search/an+example+search+query/" + # + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).expand( + # {"query" => "an example search query"} + # ).to_str + # #=> "http://example.com/search/an%20example%20search%20query/" + # + # Addressable::Template.new( + # "http://example.com/search/{query}/" + # ).expand( + # {"query" => "bogus!"}, + # ExampleProcessor + # ).to_str + # #=> Addressable::Template::InvalidTemplateValueError + def expand(mapping, processor=nil, normalize_values=true) + result = self.pattern.dup + mapping = normalize_keys(mapping) + result.gsub!( EXPRESSION ) do |capture| + transform_capture(mapping, capture, processor, normalize_values) + end + return Addressable::URI.parse(result) + end + + ## + # Returns an Array of variables used within the template pattern. + # The variables are listed in the Array in the order they appear within + # the pattern. Multiple occurrences of a variable within a pattern are + # not represented in this Array. + # + # @return [Array] The variables present in the template's pattern. + def variables + @variables ||= ordered_variable_defaults.map { |var, val| var }.uniq + end + alias_method :keys, :variables + alias_method :names, :variables + + ## + # Returns a mapping of variables to their default values specified + # in the template. Variables without defaults are not returned. + # + # @return [Hash] Mapping of template variables to their defaults + def variable_defaults + @variable_defaults ||= + Hash[*ordered_variable_defaults.reject { |k, v| v.nil? }.flatten] + end + + ## + # Coerces a template into a `Regexp` object. This regular expression will + # behave very similarly to the actual template, and should match the same + # URI values, but it cannot fully handle, for example, values that would + # extract to an `Array`. + # + # @return [Regexp] A regular expression which should match the template. + def to_regexp + _, source = parse_template_pattern(pattern) + Regexp.new(source) + end + + ## + # Returns the source of the coerced `Regexp`. + # + # @return [String] The source of the `Regexp` given by {#to_regexp}. + # + # @api private + def source + self.to_regexp.source + end + + ## + # Returns the named captures of the coerced `Regexp`. + # + # @return [Hash] The named captures of the `Regexp` given by {#to_regexp}. + # + # @api private + def named_captures + self.to_regexp.named_captures + end + + private + def ordered_variable_defaults + @ordered_variable_defaults ||= begin + expansions, _ = parse_template_pattern(pattern) + expansions.map do |capture| + _, _, varlist = *capture.match(EXPRESSION) + varlist.split(',').map do |varspec| + varspec[VARSPEC, 1] + end + end.flatten + end + end + + + ## + # Loops through each capture and expands any values available in mapping + # + # @param [Hash] mapping + # Set of keys to expand + # @param [String] capture + # The expression to expand + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError exception + # will be raised if the value is invalid. The transform method + # should return the transformed variable value as a String. If a + # transform method is used, the value will not be percent encoded + # automatically. Unicode normalization will be performed both before and + # after sending the value to the transform method. + # + # @return [String] The expanded expression + def transform_partial_capture(mapping, capture, processor = nil, + normalize_values = true) + _, operator, varlist = *capture.match(EXPRESSION) + + vars = varlist.split(",") + + if operator == "?" + # partial expansion of form style query variables sometimes requires a + # slight reordering of the variables to produce a valid url. + first_to_expand = vars.find { |varspec| + _, name, _ = *varspec.match(VARSPEC) + mapping.key?(name) && !mapping[name].nil? + } + + vars = [first_to_expand] + vars.reject {|varspec| varspec == first_to_expand} if first_to_expand + end + + vars. + inject("".dup) do |acc, varspec| + _, name, _ = *varspec.match(VARSPEC) + next_val = if mapping.key? name + transform_capture(mapping, "{#{operator}#{varspec}}", + processor, normalize_values) + else + "{#{operator}#{varspec}}" + end + # If we've already expanded at least one '?' operator with non-empty + # value, change to '&' + operator = "&" if (operator == "?") && (next_val != "") + acc << next_val + end + end + + ## + # Transforms a mapped value so that values can be substituted into the + # template. + # + # @param [Hash] mapping The mapping to replace captures + # @param [String] capture + # The expression to replace + # @param [#validate, #transform] processor + # An optional processor object may be supplied. + # @param [Boolean] normalize_values + # Optional flag to enable/disable unicode normalization. Default: true + # + # + # The object should respond to either the validate or + # transform messages or both. Both the validate and + # transform methods should take two parameters: name and + # value. The validate method should return true + # or false; true if the value of the variable is valid, + # false otherwise. An InvalidTemplateValueError exception + # will be raised if the value is invalid. The transform method + # should return the transformed variable value as a String. If a + # transform method is used, the value will not be percent encoded + # automatically. Unicode normalization will be performed both before and + # after sending the value to the transform method. + # + # @return [String] The expanded expression + def transform_capture(mapping, capture, processor=nil, + normalize_values=true) + _, operator, varlist = *capture.match(EXPRESSION) + return_value = varlist.split(',').inject([]) do |acc, varspec| + _, name, modifier = *varspec.match(VARSPEC) + value = mapping[name] + unless value == nil || value == {} + allow_reserved = %w(+ #).include?(operator) + # Common primitives where the .to_s output is well-defined + if Numeric === value || Symbol === value || + value == true || value == false + value = value.to_s + end + length = modifier.gsub(':', '').to_i if modifier =~ /^:\d+/ + + unless (Hash === value) || + value.respond_to?(:to_ary) || value.respond_to?(:to_str) + raise TypeError, + "Can't convert #{value.class} into String or Array." + end + + value = normalize_value(value) if normalize_values + + if processor == nil || !processor.respond_to?(:transform) + # Handle percent escaping + if allow_reserved + encode_map = + Addressable::URI::CharacterClasses::RESERVED + + Addressable::URI::CharacterClasses::UNRESERVED + else + encode_map = Addressable::URI::CharacterClasses::UNRESERVED + end + if value.kind_of?(Array) + transformed_value = value.map do |val| + if length + Addressable::URI.encode_component(val[0...length], encode_map) + else + Addressable::URI.encode_component(val, encode_map) + end + end + unless modifier == "*" + transformed_value = transformed_value.join(',') + end + elsif value.kind_of?(Hash) + transformed_value = value.map do |key, val| + if modifier == "*" + "#{ + Addressable::URI.encode_component( key, encode_map) + }=#{ + Addressable::URI.encode_component( val, encode_map) + }" + else + "#{ + Addressable::URI.encode_component( key, encode_map) + },#{ + Addressable::URI.encode_component( val, encode_map) + }" + end + end + unless modifier == "*" + transformed_value = transformed_value.join(',') + end + else + if length + transformed_value = Addressable::URI.encode_component( + value[0...length], encode_map) + else + transformed_value = Addressable::URI.encode_component( + value, encode_map) + end + end + end + + # Process, if we've got a processor + if processor != nil + if processor.respond_to?(:validate) + if !processor.validate(name, value) + display_value = value.kind_of?(Array) ? value.inspect : value + raise InvalidTemplateValueError, + "#{name}=#{display_value} is an invalid template value." + end + end + if processor.respond_to?(:transform) + transformed_value = processor.transform(name, value) + if normalize_values + transformed_value = normalize_value(transformed_value) + end + end + end + acc << [name, transformed_value] + end + acc + end + return "" if return_value.empty? + join_values(operator, return_value) + end + + ## + # Takes a set of values, and joins them together based on the + # operator. + # + # @param [String, Nil] operator One of the operators from the set + # (?,&,+,#,;,/,.), or nil if there wasn't one. + # @param [Array] return_value + # The set of return values (as [variable_name, value] tuples) that will + # be joined together. + # + # @return [String] The transformed mapped value + def join_values(operator, return_value) + leader = LEADERS.fetch(operator, '') + joiner = JOINERS.fetch(operator, ',') + case operator + when '&', '?' + leader + return_value.map{|k,v| + if v.is_a?(Array) && v.first =~ /=/ + v.join(joiner) + elsif v.is_a?(Array) + v.map{|inner_value| "#{k}=#{inner_value}"}.join(joiner) + else + "#{k}=#{v}" + end + }.join(joiner) + when ';' + return_value.map{|k,v| + if v.is_a?(Array) && v.first =~ /=/ + ';' + v.join(";") + elsif v.is_a?(Array) + ';' + v.map{|inner_value| "#{k}=#{inner_value}"}.join(";") + else + v && v != '' ? ";#{k}=#{v}" : ";#{k}" + end + }.join + else + leader + return_value.map{|k,v| v}.join(joiner) + end + end + + ## + # Takes a set of values, and joins them together based on the + # operator. + # + # @param [Hash, Array, String] value + # Normalizes keys and values with IDNA#unicode_normalize_kc + # + # @return [Hash, Array, String] The normalized values + def normalize_value(value) + unless value.is_a?(Hash) + value = value.respond_to?(:to_ary) ? value.to_ary : value.to_str + end + + # Handle unicode normalization + if value.kind_of?(Array) + value.map! { |val| Addressable::IDNA.unicode_normalize_kc(val) } + elsif value.kind_of?(Hash) + value = value.inject({}) { |acc, (k, v)| + acc[Addressable::IDNA.unicode_normalize_kc(k)] = + Addressable::IDNA.unicode_normalize_kc(v) + acc + } + else + value = Addressable::IDNA.unicode_normalize_kc(value) + end + value + end + + ## + # Generates a hash with string keys + # + # @param [Hash] mapping A mapping hash to normalize + # + # @return [Hash] + # A hash with stringified keys + def normalize_keys(mapping) + return mapping.inject({}) do |accu, pair| + name, value = pair + if Symbol === name + name = name.to_s + elsif name.respond_to?(:to_str) + name = name.to_str + else + raise TypeError, + "Can't convert #{name.class} into String." + end + accu[name] = value + accu + end + end + + ## + # Generates the Regexp that parses a template pattern. Memoizes the + # value if template processor not set (processors may not be deterministic) + # + # @param [String] pattern The URI template pattern. + # @param [#match] processor The template processor to use. + # + # @return [Array, Regexp] + # An array of expansion variables nad a regular expression which may be + # used to parse a template pattern + def parse_template_pattern(pattern, processor = nil) + if processor.nil? && pattern == @pattern + @cached_template_parse ||= + parse_new_template_pattern(pattern, processor) + else + parse_new_template_pattern(pattern, processor) + end + end + + ## + # Generates the Regexp that parses a template pattern. + # + # @param [String] pattern The URI template pattern. + # @param [#match] processor The template processor to use. + # + # @return [Array, Regexp] + # An array of expansion variables nad a regular expression which may be + # used to parse a template pattern + def parse_new_template_pattern(pattern, processor = nil) + # Escape the pattern. The two gsubs restore the escaped curly braces + # back to their original form. Basically, escape everything that isn't + # within an expansion. + escaped_pattern = Regexp.escape( + pattern + ).gsub(/\\\{(.*?)\\\}/) do |escaped| + escaped.gsub(/\\(.)/, "\\1") + end + + expansions = [] + + # Create a regular expression that captures the values of the + # variables in the URI. + regexp_string = escaped_pattern.gsub( EXPRESSION ) do |expansion| + + expansions << expansion + _, operator, varlist = *expansion.match(EXPRESSION) + leader = Regexp.escape(LEADERS.fetch(operator, '')) + joiner = Regexp.escape(JOINERS.fetch(operator, ',')) + combined = varlist.split(',').map do |varspec| + _, name, modifier = *varspec.match(VARSPEC) + + result = processor && processor.respond_to?(:match) ? processor.match(name) : nil + if result + "(?<#{name}>#{ result })" + else + group = case operator + when '+' + "#{ RESERVED }*?" + when '#' + "#{ RESERVED }*?" + when '/' + "#{ UNRESERVED }*?" + when '.' + "#{ UNRESERVED.gsub('\.', '') }*?" + when ';' + "#{ UNRESERVED }*=?#{ UNRESERVED }*?" + when '?' + "#{ UNRESERVED }*=#{ UNRESERVED }*?" + when '&' + "#{ UNRESERVED }*=#{ UNRESERVED }*?" + else + "#{ UNRESERVED }*?" + end + if modifier == '*' + "(?<#{name}>#{group}(?:#{joiner}?#{group})*)?" + else + "(?<#{name}>#{group})?" + end + end + end.join("#{joiner}?") + "(?:|#{leader}#{combined})" + end + + # Ensure that the regular expression matches the whole URI. + regexp_string = "^#{regexp_string}$" + return expansions, Regexp.new(regexp_string) + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/uri.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/uri.rb new file mode 100644 index 000000000000..6b5f4fa7b4b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/uri.rb @@ -0,0 +1,2556 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +require "addressable/version" +require "addressable/idna" +require "public_suffix" + +## +# Addressable is a library for processing links and URIs. +module Addressable + ## + # This is an implementation of a URI parser based on + # RFC 3986, + # RFC 3987. + class URI + ## + # Raised if something other than a uri is supplied. + class InvalidURIError < StandardError + end + + ## + # Container for the character classes specified in + # RFC 3986. + module CharacterClasses + ALPHA = "a-zA-Z" + DIGIT = "0-9" + GEN_DELIMS = "\\:\\/\\?\\#\\[\\]\\@" + SUB_DELIMS = "\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=" + RESERVED = GEN_DELIMS + SUB_DELIMS + UNRESERVED = ALPHA + DIGIT + "\\-\\.\\_\\~" + PCHAR = UNRESERVED + SUB_DELIMS + "\\:\\@" + SCHEME = ALPHA + DIGIT + "\\-\\+\\." + HOST = UNRESERVED + SUB_DELIMS + "\\[\\:\\]" + AUTHORITY = PCHAR + "\\[\\:\\]" + PATH = PCHAR + "\\/" + QUERY = PCHAR + "\\/\\?" + FRAGMENT = PCHAR + "\\/\\?" + end + + module NormalizeCharacterClasses + HOST = /[^#{CharacterClasses::HOST}]/ + UNRESERVED = /[^#{CharacterClasses::UNRESERVED}]/ + PCHAR = /[^#{CharacterClasses::PCHAR}]/ + SCHEME = /[^#{CharacterClasses::SCHEME}]/ + FRAGMENT = /[^#{CharacterClasses::FRAGMENT}]/ + QUERY = %r{[^a-zA-Z0-9\-\.\_\~\!\$\'\(\)\*\+\,\=\:\@\/\?%]|%(?!2B|2b)} + end + + SLASH = '/' + EMPTY_STR = '' + + URIREGEX = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/ + + PORT_MAPPING = { + "http" => 80, + "https" => 443, + "ftp" => 21, + "tftp" => 69, + "sftp" => 22, + "ssh" => 22, + "svn+ssh" => 22, + "telnet" => 23, + "nntp" => 119, + "gopher" => 70, + "wais" => 210, + "ldap" => 389, + "prospero" => 1525 + }.freeze + + ## + # Returns a URI object based on the parsed string. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI string to parse. + # No parsing is performed if the object is already an + # Addressable::URI. + # + # @return [Addressable::URI] The parsed URI. + def self.parse(uri) + # If we were given nil, return nil. + return nil unless uri + # If a URI object is passed, just return itself. + return uri.dup if uri.kind_of?(self) + + # If a URI object of the Ruby standard library variety is passed, + # convert it to a string, then parse the string. + # We do the check this way because we don't want to accidentally + # cause a missing constant exception to be thrown. + if uri.class.name =~ /^URI\b/ + uri = uri.to_s + end + + # Otherwise, convert to a String + begin + uri = uri.to_str + rescue TypeError, NoMethodError + raise TypeError, "Can't convert #{uri.class} into String." + end if not uri.is_a? String + + # This Regexp supplied as an example in RFC 3986, and it works great. + scan = uri.scan(URIREGEX) + fragments = scan[0] + scheme = fragments[1] + authority = fragments[3] + path = fragments[4] + query = fragments[6] + fragment = fragments[8] + user = nil + password = nil + host = nil + port = nil + if authority != nil + # The Regexp above doesn't split apart the authority. + userinfo = authority[/^([^\[\]]*)@/, 1] + if userinfo != nil + user = userinfo.strip[/^([^:]*):?/, 1] + password = userinfo.strip[/:(.*)$/, 1] + end + host = authority.sub( + /^([^\[\]]*)@/, EMPTY_STR + ).sub( + /:([^:@\[\]]*?)$/, EMPTY_STR + ) + port = authority[/:([^:@\[\]]*?)$/, 1] + end + if port == EMPTY_STR + port = nil + end + + return new( + :scheme => scheme, + :user => user, + :password => password, + :host => host, + :port => port, + :path => path, + :query => query, + :fragment => fragment + ) + end + + ## + # Converts an input to a URI. The input does not have to be a valid + # URI — the method will use heuristics to guess what URI was intended. + # This is not standards-compliant, merely user-friendly. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI string to parse. + # No parsing is performed if the object is already an + # Addressable::URI. + # @param [Hash] hints + # A Hash of hints to the heuristic parser. + # Defaults to {:scheme => "http"}. + # + # @return [Addressable::URI] The parsed URI. + def self.heuristic_parse(uri, hints={}) + # If we were given nil, return nil. + return nil unless uri + # If a URI object is passed, just return itself. + return uri.dup if uri.kind_of?(self) + + # If a URI object of the Ruby standard library variety is passed, + # convert it to a string, then parse the string. + # We do the check this way because we don't want to accidentally + # cause a missing constant exception to be thrown. + if uri.class.name =~ /^URI\b/ + uri = uri.to_s + end + + if !uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{uri.class} into String." + end + # Otherwise, convert to a String + uri = uri.to_str.dup.strip + hints = { + :scheme => "http" + }.merge(hints) + case uri + when /^http:\//i + uri.sub!(/^http:\/+/i, "http://") + when /^https:\//i + uri.sub!(/^https:\/+/i, "https://") + when /^feed:\/+http:\//i + uri.sub!(/^feed:\/+http:\/+/i, "feed:http://") + when /^feed:\//i + uri.sub!(/^feed:\/+/i, "feed://") + when %r[^file:/{4}]i + uri.sub!(%r[^file:/+]i, "file:////") + when %r[^file://localhost/]i + uri.sub!(%r[^file://localhost/+]i, "file:///") + when %r[^file:/+]i + uri.sub!(%r[^file:/+]i, "file:///") + when /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ + uri.sub!(/^/, hints[:scheme] + "://") + when /\A\d+\..*:\d+\z/ + uri = "#{hints[:scheme]}://#{uri}" + end + match = uri.match(URIREGEX) + fragments = match.captures + authority = fragments[3] + if authority && authority.length > 0 + new_authority = authority.tr("\\", "/").gsub(" ", "%20") + # NOTE: We want offset 4, not 3! + offset = match.offset(4) + uri = uri.dup + uri[offset[0]...offset[1]] = new_authority + end + parsed = self.parse(uri) + if parsed.scheme =~ /^[^\/?#\.]+\.[^\/?#]+$/ + parsed = self.parse(hints[:scheme] + "://" + uri) + end + if parsed.path.include?(".") + if parsed.path[/\b@\b/] + parsed.scheme = "mailto" unless parsed.scheme + elsif new_host = parsed.path[/^([^\/]+\.[^\/]*)/, 1] + parsed.defer_validation do + new_path = parsed.path.sub( + Regexp.new("^" + Regexp.escape(new_host)), EMPTY_STR) + parsed.host = new_host + parsed.path = new_path + parsed.scheme = hints[:scheme] unless parsed.scheme + end + end + end + return parsed + end + + ## + # Converts a path to a file scheme URI. If the path supplied is + # relative, it will be returned as a relative URI. If the path supplied + # is actually a non-file URI, it will parse the URI as if it had been + # parsed with Addressable::URI.parse. Handles all of the + # various Microsoft-specific formats for specifying paths. + # + # @param [String, Addressable::URI, #to_str] path + # Typically a String path to a file or directory, but + # will return a sensible return value if an absolute URI is supplied + # instead. + # + # @return [Addressable::URI] + # The parsed file scheme URI or the original URI if some other URI + # scheme was provided. + # + # @example + # base = Addressable::URI.convert_path("/absolute/path/") + # uri = Addressable::URI.convert_path("relative/path") + # (base + uri).to_s + # #=> "file:///absolute/path/relative/path" + # + # Addressable::URI.convert_path( + # "c:\\windows\\My Documents 100%20\\foo.txt" + # ).to_s + # #=> "file:///c:/windows/My%20Documents%20100%20/foo.txt" + # + # Addressable::URI.convert_path("http://example.com/").to_s + # #=> "http://example.com/" + def self.convert_path(path) + # If we were given nil, return nil. + return nil unless path + # If a URI object is passed, just return itself. + return path if path.kind_of?(self) + if !path.respond_to?(:to_str) + raise TypeError, "Can't convert #{path.class} into String." + end + # Otherwise, convert to a String + path = path.to_str.strip + + path.sub!(/^file:\/?\/?/, EMPTY_STR) if path =~ /^file:\/?\/?/ + path = SLASH + path if path =~ /^([a-zA-Z])[\|:]/ + uri = self.parse(path) + + if uri.scheme == nil + # Adjust windows-style uris + uri.path.sub!(/^\/?([a-zA-Z])[\|:][\\\/]/) do + "/#{$1.downcase}:/" + end + uri.path.tr!("\\", SLASH) + if File.exist?(uri.path) && + File.stat(uri.path).directory? + uri.path.chomp!(SLASH) + uri.path = uri.path + '/' + end + + # If the path is absolute, set the scheme and host. + if uri.path.start_with?(SLASH) + uri.scheme = "file" + uri.host = EMPTY_STR + end + uri.normalize! + end + + return uri + end + + ## + # Joins several URIs together. + # + # @param [String, Addressable::URI, #to_str] *uris + # The URIs to join. + # + # @return [Addressable::URI] The joined URI. + # + # @example + # base = "http://example.com/" + # uri = Addressable::URI.parse("relative/path") + # Addressable::URI.join(base, uri) + # #=> # + def self.join(*uris) + uri_objects = uris.collect do |uri| + if !uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{uri.class} into String." + end + uri.kind_of?(self) ? uri : self.parse(uri.to_str) + end + result = uri_objects.shift.dup + for uri in uri_objects + result.join!(uri) + end + return result + end + + ## + # Tables used to optimize encoding operations in `self.encode_component` + # and `self.normalize_component` + SEQUENCE_ENCODING_TABLE = Hash.new do |hash, sequence| + hash[sequence] = sequence.unpack("C*").map do |c| + format("%02x", c) + end.join + end + + SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE = Hash.new do |hash, sequence| + hash[sequence] = sequence.unpack("C*").map do |c| + format("%%%02X", c) + end.join + end + + ## + # Percent encodes a URI component. + # + # @param [String, #to_str] component The URI component to encode. + # + # @param [String, Regexp] character_class + # The characters which are not percent encoded. If a String + # is passed, the String must be formatted as a regular + # expression character class. (Do not include the surrounding square + # brackets.) For example, "b-zB-Z0-9" would cause + # everything but the letters 'b' through 'z' and the numbers '0' through + # '9' to be percent encoded. If a Regexp is passed, the + # value /[^b-zB-Z0-9]/ would have the same effect. A set of + # useful String values may be found in the + # Addressable::URI::CharacterClasses module. The default + # value is the reserved plus unreserved character classes specified in + # RFC 3986. + # + # @param [Regexp] upcase_encoded + # A string of characters that may already be percent encoded, and whose + # encodings should be upcased. This allows normalization of percent + # encodings for characters not included in the + # character_class. + # + # @return [String] The encoded component. + # + # @example + # Addressable::URI.encode_component("simple/example", "b-zB-Z0-9") + # => "simple%2Fex%61mple" + # Addressable::URI.encode_component("simple/example", /[^b-zB-Z0-9]/) + # => "simple%2Fex%61mple" + # Addressable::URI.encode_component( + # "simple/example", Addressable::URI::CharacterClasses::UNRESERVED + # ) + # => "simple%2Fexample" + def self.encode_component(component, character_class= + CharacterClasses::RESERVED + CharacterClasses::UNRESERVED, + upcase_encoded='') + return nil if component.nil? + + begin + if component.kind_of?(Symbol) || + component.kind_of?(Numeric) || + component.kind_of?(TrueClass) || + component.kind_of?(FalseClass) + component = component.to_s + else + component = component.to_str + end + rescue TypeError, NoMethodError + raise TypeError, "Can't convert #{component.class} into String." + end if !component.is_a? String + + if ![String, Regexp].include?(character_class.class) + raise TypeError, + "Expected String or Regexp, got #{character_class.inspect}" + end + if character_class.kind_of?(String) + character_class = /[^#{character_class}]/ + end + # We can't perform regexps on invalid UTF sequences, but + # here we need to, so switch to ASCII. + component = component.dup + component.force_encoding(Encoding::ASCII_8BIT) + # Avoiding gsub! because there are edge cases with frozen strings + component = component.gsub(character_class) do |sequence| + SEQUENCE_UPCASED_PERCENT_ENCODING_TABLE[sequence] + end + if upcase_encoded.length > 0 + upcase_encoded_chars = upcase_encoded.chars.map do |char| + SEQUENCE_ENCODING_TABLE[char] + end + component = component.gsub(/%(#{upcase_encoded_chars.join('|')})/, + &:upcase) + end + return component + end + + class << self + alias_method :escape_component, :encode_component + end + + ## + # Unencodes any percent encoded characters within a URI component. + # This method may be used for unencoding either components or full URIs, + # however, it is recommended to use the unencode_component + # alias when unencoding components. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI or component to unencode. + # + # @param [Class] return_type + # The type of object to return. + # This value may only be set to String or + # Addressable::URI. All other values are invalid. Defaults + # to String. + # + # @param [String] leave_encoded + # A string of characters to leave encoded. If a percent encoded character + # in this list is encountered then it will remain percent encoded. + # + # @return [String, Addressable::URI] + # The unencoded component or URI. + # The return type is determined by the return_type + # parameter. + def self.unencode(uri, return_type=String, leave_encoded='') + return nil if uri.nil? + + begin + uri = uri.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{uri.class} into String." + end if !uri.is_a? String + if ![String, ::Addressable::URI].include?(return_type) + raise TypeError, + "Expected Class (String or Addressable::URI), " + + "got #{return_type.inspect}" + end + uri = uri.dup + # Seriously, only use UTF-8. I'm really not kidding! + uri.force_encoding("utf-8") + + unless leave_encoded.empty? + leave_encoded = leave_encoded.dup.force_encoding("utf-8") + end + + result = uri.gsub(/%[0-9a-f]{2}/iu) do |sequence| + c = sequence[1..3].to_i(16).chr + c.force_encoding("utf-8") + leave_encoded.include?(c) ? sequence : c + end + result.force_encoding("utf-8") + if return_type == String + return result + elsif return_type == ::Addressable::URI + return ::Addressable::URI.parse(result) + end + end + + class << self + alias_method :unescape, :unencode + alias_method :unencode_component, :unencode + alias_method :unescape_component, :unencode + end + + + ## + # Normalizes the encoding of a URI component. + # + # @param [String, #to_str] component The URI component to encode. + # + # @param [String, Regexp] character_class + # The characters which are not percent encoded. If a String + # is passed, the String must be formatted as a regular + # expression character class. (Do not include the surrounding square + # brackets.) For example, "b-zB-Z0-9" would cause + # everything but the letters 'b' through 'z' and the numbers '0' + # through '9' to be percent encoded. If a Regexp is passed, + # the value /[^b-zB-Z0-9]/ would have the same effect. A + # set of useful String values may be found in the + # Addressable::URI::CharacterClasses module. The default + # value is the reserved plus unreserved character classes specified in + # RFC 3986. + # + # @param [String] leave_encoded + # When character_class is a String then + # leave_encoded is a string of characters that should remain + # percent encoded while normalizing the component; if they appear percent + # encoded in the original component, then they will be upcased ("%2f" + # normalized to "%2F") but otherwise left alone. + # + # @return [String] The normalized component. + # + # @example + # Addressable::URI.normalize_component("simpl%65/%65xampl%65", "b-zB-Z") + # => "simple%2Fex%61mple" + # Addressable::URI.normalize_component( + # "simpl%65/%65xampl%65", /[^b-zB-Z]/ + # ) + # => "simple%2Fex%61mple" + # Addressable::URI.normalize_component( + # "simpl%65/%65xampl%65", + # Addressable::URI::CharacterClasses::UNRESERVED + # ) + # => "simple%2Fexample" + # Addressable::URI.normalize_component( + # "one%20two%2fthree%26four", + # "0-9a-zA-Z &/", + # "/" + # ) + # => "one two%2Fthree&four" + def self.normalize_component(component, character_class= + CharacterClasses::RESERVED + CharacterClasses::UNRESERVED, + leave_encoded='') + return nil if component.nil? + + begin + component = component.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{component.class} into String." + end if !component.is_a? String + + if ![String, Regexp].include?(character_class.class) + raise TypeError, + "Expected String or Regexp, got #{character_class.inspect}" + end + if character_class.kind_of?(String) + leave_re = if leave_encoded.length > 0 + character_class = "#{character_class}%" unless character_class.include?('%') + + "|%(?!#{leave_encoded.chars.map do |char| + seq = SEQUENCE_ENCODING_TABLE[char] + [seq.upcase, seq.downcase] + end.flatten.join('|')})" + end + + character_class = if leave_re + /[^#{character_class}]#{leave_re}/ + else + /[^#{character_class}]/ + end + end + # We can't perform regexps on invalid UTF sequences, but + # here we need to, so switch to ASCII. + component = component.dup + component.force_encoding(Encoding::ASCII_8BIT) + unencoded = self.unencode_component(component, String, leave_encoded) + begin + encoded = self.encode_component( + Addressable::IDNA.unicode_normalize_kc(unencoded), + character_class, + leave_encoded + ) + rescue ArgumentError + encoded = self.encode_component(unencoded) + end + encoded.force_encoding(Encoding::UTF_8) + return encoded + end + + ## + # Percent encodes any special characters in the URI. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI to encode. + # + # @param [Class] return_type + # The type of object to return. + # This value may only be set to String or + # Addressable::URI. All other values are invalid. Defaults + # to String. + # + # @return [String, Addressable::URI] + # The encoded URI. + # The return type is determined by the return_type + # parameter. + def self.encode(uri, return_type=String) + return nil if uri.nil? + + begin + uri = uri.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{uri.class} into String." + end if !uri.is_a? String + + if ![String, ::Addressable::URI].include?(return_type) + raise TypeError, + "Expected Class (String or Addressable::URI), " + + "got #{return_type.inspect}" + end + uri_object = uri.kind_of?(self) ? uri : self.parse(uri) + encoded_uri = Addressable::URI.new( + :scheme => self.encode_component(uri_object.scheme, + Addressable::URI::CharacterClasses::SCHEME), + :authority => self.encode_component(uri_object.authority, + Addressable::URI::CharacterClasses::AUTHORITY), + :path => self.encode_component(uri_object.path, + Addressable::URI::CharacterClasses::PATH), + :query => self.encode_component(uri_object.query, + Addressable::URI::CharacterClasses::QUERY), + :fragment => self.encode_component(uri_object.fragment, + Addressable::URI::CharacterClasses::FRAGMENT) + ) + if return_type == String + return encoded_uri.to_s + elsif return_type == ::Addressable::URI + return encoded_uri + end + end + + class << self + alias_method :escape, :encode + end + + ## + # Normalizes the encoding of a URI. Characters within a hostname are + # not percent encoded to allow for internationalized domain names. + # + # @param [String, Addressable::URI, #to_str] uri + # The URI to encode. + # + # @param [Class] return_type + # The type of object to return. + # This value may only be set to String or + # Addressable::URI. All other values are invalid. Defaults + # to String. + # + # @return [String, Addressable::URI] + # The encoded URI. + # The return type is determined by the return_type + # parameter. + def self.normalized_encode(uri, return_type=String) + begin + uri = uri.to_str + rescue NoMethodError, TypeError + raise TypeError, "Can't convert #{uri.class} into String." + end if !uri.is_a? String + + if ![String, ::Addressable::URI].include?(return_type) + raise TypeError, + "Expected Class (String or Addressable::URI), " + + "got #{return_type.inspect}" + end + uri_object = uri.kind_of?(self) ? uri : self.parse(uri) + components = { + :scheme => self.unencode_component(uri_object.scheme), + :user => self.unencode_component(uri_object.user), + :password => self.unencode_component(uri_object.password), + :host => self.unencode_component(uri_object.host), + :port => (uri_object.port.nil? ? nil : uri_object.port.to_s), + :path => self.unencode_component(uri_object.path), + :query => self.unencode_component(uri_object.query), + :fragment => self.unencode_component(uri_object.fragment) + } + components.each do |key, value| + if value != nil + begin + components[key] = + Addressable::IDNA.unicode_normalize_kc(value.to_str) + rescue ArgumentError + # Likely a malformed UTF-8 character, skip unicode normalization + components[key] = value.to_str + end + end + end + encoded_uri = Addressable::URI.new( + :scheme => self.encode_component(components[:scheme], + Addressable::URI::CharacterClasses::SCHEME), + :user => self.encode_component(components[:user], + Addressable::URI::CharacterClasses::UNRESERVED), + :password => self.encode_component(components[:password], + Addressable::URI::CharacterClasses::UNRESERVED), + :host => components[:host], + :port => components[:port], + :path => self.encode_component(components[:path], + Addressable::URI::CharacterClasses::PATH), + :query => self.encode_component(components[:query], + Addressable::URI::CharacterClasses::QUERY), + :fragment => self.encode_component(components[:fragment], + Addressable::URI::CharacterClasses::FRAGMENT) + ) + if return_type == String + return encoded_uri.to_s + elsif return_type == ::Addressable::URI + return encoded_uri + end + end + + ## + # Encodes a set of key/value pairs according to the rules for the + # application/x-www-form-urlencoded MIME type. + # + # @param [#to_hash, #to_ary] form_values + # The form values to encode. + # + # @param [TrueClass, FalseClass] sort + # Sort the key/value pairs prior to encoding. + # Defaults to false. + # + # @return [String] + # The encoded value. + def self.form_encode(form_values, sort=false) + if form_values.respond_to?(:to_hash) + form_values = form_values.to_hash.to_a + elsif form_values.respond_to?(:to_ary) + form_values = form_values.to_ary + else + raise TypeError, "Can't convert #{form_values.class} into Array." + end + + form_values = form_values.inject([]) do |accu, (key, value)| + if value.kind_of?(Array) + value.each do |v| + accu << [key.to_s, v.to_s] + end + else + accu << [key.to_s, value.to_s] + end + accu + end + + if sort + # Useful for OAuth and optimizing caching systems + form_values = form_values.sort + end + escaped_form_values = form_values.map do |(key, value)| + # Line breaks are CRLF pairs + [ + self.encode_component( + key.gsub(/(\r\n|\n|\r)/, "\r\n"), + CharacterClasses::UNRESERVED + ).gsub("%20", "+"), + self.encode_component( + value.gsub(/(\r\n|\n|\r)/, "\r\n"), + CharacterClasses::UNRESERVED + ).gsub("%20", "+") + ] + end + return escaped_form_values.map do |(key, value)| + "#{key}=#{value}" + end.join("&") + end + + ## + # Decodes a String according to the rules for the + # application/x-www-form-urlencoded MIME type. + # + # @param [String, #to_str] encoded_value + # The form values to decode. + # + # @return [Array] + # The decoded values. + # This is not a Hash because of the possibility for + # duplicate keys. + def self.form_unencode(encoded_value) + if !encoded_value.respond_to?(:to_str) + raise TypeError, "Can't convert #{encoded_value.class} into String." + end + encoded_value = encoded_value.to_str + split_values = encoded_value.split("&").map do |pair| + pair.split("=", 2) + end + return split_values.map do |(key, value)| + [ + key ? self.unencode_component( + key.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n") : nil, + value ? (self.unencode_component( + value.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n")) : nil + ] + end + end + + ## + # Creates a new uri object from component parts. + # + # @option [String, #to_str] scheme The scheme component. + # @option [String, #to_str] user The user component. + # @option [String, #to_str] password The password component. + # @option [String, #to_str] userinfo + # The userinfo component. If this is supplied, the user and password + # components must be omitted. + # @option [String, #to_str] host The host component. + # @option [String, #to_str] port The port component. + # @option [String, #to_str] authority + # The authority component. If this is supplied, the user, password, + # userinfo, host, and port components must be omitted. + # @option [String, #to_str] path The path component. + # @option [String, #to_str] query The query component. + # @option [String, #to_str] fragment The fragment component. + # + # @return [Addressable::URI] The constructed URI object. + def initialize(options={}) + if options.has_key?(:authority) + if (options.keys & [:userinfo, :user, :password, :host, :port]).any? + raise ArgumentError, + "Cannot specify both an authority and any of the components " + + "within the authority." + end + end + if options.has_key?(:userinfo) + if (options.keys & [:user, :password]).any? + raise ArgumentError, + "Cannot specify both a userinfo and either the user or password." + end + end + + self.defer_validation do + # Bunch of crazy logic required because of the composite components + # like userinfo and authority. + self.scheme = options[:scheme] if options[:scheme] + self.user = options[:user] if options[:user] + self.password = options[:password] if options[:password] + self.userinfo = options[:userinfo] if options[:userinfo] + self.host = options[:host] if options[:host] + self.port = options[:port] if options[:port] + self.authority = options[:authority] if options[:authority] + self.path = options[:path] if options[:path] + self.query = options[:query] if options[:query] + self.query_values = options[:query_values] if options[:query_values] + self.fragment = options[:fragment] if options[:fragment] + end + self.to_s + end + + ## + # Freeze URI, initializing instance variables. + # + # @return [Addressable::URI] The frozen URI object. + def freeze + self.normalized_scheme + self.normalized_user + self.normalized_password + self.normalized_userinfo + self.normalized_host + self.normalized_port + self.normalized_authority + self.normalized_site + self.normalized_path + self.normalized_query + self.normalized_fragment + self.hash + super + end + + ## + # The scheme component for this URI. + # + # @return [String] The scheme component. + def scheme + return defined?(@scheme) ? @scheme : nil + end + + ## + # The scheme component for this URI, normalized. + # + # @return [String] The scheme component, normalized. + def normalized_scheme + return nil unless self.scheme + @normalized_scheme ||= begin + if self.scheme =~ /^\s*ssh\+svn\s*$/i + "svn+ssh".dup + else + Addressable::URI.normalize_component( + self.scheme.strip.downcase, + Addressable::URI::NormalizeCharacterClasses::SCHEME + ) + end + end + # All normalized values should be UTF-8 + @normalized_scheme.force_encoding(Encoding::UTF_8) if @normalized_scheme + @normalized_scheme + end + + ## + # Sets the scheme component for this URI. + # + # @param [String, #to_str] new_scheme The new scheme component. + def scheme=(new_scheme) + if new_scheme && !new_scheme.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_scheme.class} into String." + elsif new_scheme + new_scheme = new_scheme.to_str + end + if new_scheme && new_scheme !~ /\A[a-z][a-z0-9\.\+\-]*\z/i + raise InvalidURIError, "Invalid scheme format: '#{new_scheme}'" + end + @scheme = new_scheme + @scheme = nil if @scheme.to_s.strip.empty? + + # Reset dependent values + remove_instance_variable(:@normalized_scheme) if defined?(@normalized_scheme) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The user component for this URI. + # + # @return [String] The user component. + def user + return defined?(@user) ? @user : nil + end + + ## + # The user component for this URI, normalized. + # + # @return [String] The user component, normalized. + def normalized_user + return nil unless self.user + return @normalized_user if defined?(@normalized_user) + @normalized_user ||= begin + if normalized_scheme =~ /https?/ && self.user.strip.empty? && + (!self.password || self.password.strip.empty?) + nil + else + Addressable::URI.normalize_component( + self.user.strip, + Addressable::URI::NormalizeCharacterClasses::UNRESERVED + ) + end + end + # All normalized values should be UTF-8 + @normalized_user.force_encoding(Encoding::UTF_8) if @normalized_user + @normalized_user + end + + ## + # Sets the user component for this URI. + # + # @param [String, #to_str] new_user The new user component. + def user=(new_user) + if new_user && !new_user.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_user.class} into String." + end + @user = new_user ? new_user.to_str : nil + + # You can't have a nil user with a non-nil password + if password != nil + @user = EMPTY_STR if @user.nil? + end + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_user) if defined?(@normalized_user) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The password component for this URI. + # + # @return [String] The password component. + def password + return defined?(@password) ? @password : nil + end + + ## + # The password component for this URI, normalized. + # + # @return [String] The password component, normalized. + def normalized_password + return nil unless self.password + return @normalized_password if defined?(@normalized_password) + @normalized_password ||= begin + if self.normalized_scheme =~ /https?/ && self.password.strip.empty? && + (!self.user || self.user.strip.empty?) + nil + else + Addressable::URI.normalize_component( + self.password.strip, + Addressable::URI::NormalizeCharacterClasses::UNRESERVED + ) + end + end + # All normalized values should be UTF-8 + if @normalized_password + @normalized_password.force_encoding(Encoding::UTF_8) + end + @normalized_password + end + + ## + # Sets the password component for this URI. + # + # @param [String, #to_str] new_password The new password component. + def password=(new_password) + if new_password && !new_password.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_password.class} into String." + end + @password = new_password ? new_password.to_str : nil + + # You can't have a nil user with a non-nil password + @password ||= nil + @user ||= nil + if @password != nil + @user = EMPTY_STR if @user.nil? + end + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_password) if defined?(@normalized_password) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The userinfo component for this URI. + # Combines the user and password components. + # + # @return [String] The userinfo component. + def userinfo + current_user = self.user + current_password = self.password + (current_user || current_password) && @userinfo ||= begin + if current_user && current_password + "#{current_user}:#{current_password}" + elsif current_user && !current_password + "#{current_user}" + end + end + end + + ## + # The userinfo component for this URI, normalized. + # + # @return [String] The userinfo component, normalized. + def normalized_userinfo + return nil unless self.userinfo + return @normalized_userinfo if defined?(@normalized_userinfo) + @normalized_userinfo ||= begin + current_user = self.normalized_user + current_password = self.normalized_password + if !current_user && !current_password + nil + elsif current_user && current_password + "#{current_user}:#{current_password}".dup + elsif current_user && !current_password + "#{current_user}".dup + end + end + # All normalized values should be UTF-8 + if @normalized_userinfo + @normalized_userinfo.force_encoding(Encoding::UTF_8) + end + @normalized_userinfo + end + + ## + # Sets the userinfo component for this URI. + # + # @param [String, #to_str] new_userinfo The new userinfo component. + def userinfo=(new_userinfo) + if new_userinfo && !new_userinfo.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_userinfo.class} into String." + end + new_user, new_password = if new_userinfo + [ + new_userinfo.to_str.strip[/^(.*):/, 1], + new_userinfo.to_str.strip[/:(.*)$/, 1] + ] + else + [nil, nil] + end + + # Password assigned first to ensure validity in case of nil + self.password = new_password + self.user = new_user + + # Reset dependent values + remove_instance_variable(:@authority) if defined?(@authority) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The host component for this URI. + # + # @return [String] The host component. + def host + return defined?(@host) ? @host : nil + end + + ## + # The host component for this URI, normalized. + # + # @return [String] The host component, normalized. + def normalized_host + return nil unless self.host + + @normalized_host ||= begin + if !self.host.strip.empty? + result = ::Addressable::IDNA.to_ascii( + URI.unencode_component(self.host.strip.downcase) + ) + if result =~ /[^\.]\.$/ + # Single trailing dots are unnecessary. + result = result[0...-1] + end + result = Addressable::URI.normalize_component( + result, + NormalizeCharacterClasses::HOST + ) + result + else + EMPTY_STR.dup + end + end + # All normalized values should be UTF-8 + if @normalized_host && !@normalized_host.empty? + @normalized_host.force_encoding(Encoding::UTF_8) + end + @normalized_host + end + + ## + # Sets the host component for this URI. + # + # @param [String, #to_str] new_host The new host component. + def host=(new_host) + if new_host && !new_host.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_host.class} into String." + end + @host = new_host ? new_host.to_str : nil + + # Reset dependent values + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_host) if defined?(@normalized_host) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # This method is same as URI::Generic#host except + # brackets for IPv6 (and 'IPvFuture') addresses are removed. + # + # @see Addressable::URI#host + # + # @return [String] The hostname for this URI. + def hostname + v = self.host + /\A\[(.*)\]\z/ =~ v ? $1 : v + end + + ## + # This method is same as URI::Generic#host= except + # the argument can be a bare IPv6 address (or 'IPvFuture'). + # + # @see Addressable::URI#host= + # + # @param [String, #to_str] new_hostname The new hostname for this URI. + def hostname=(new_hostname) + if new_hostname && + (new_hostname.respond_to?(:ipv4?) || new_hostname.respond_to?(:ipv6?)) + new_hostname = new_hostname.to_s + elsif new_hostname && !new_hostname.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_hostname.class} into String." + end + v = new_hostname ? new_hostname.to_str : nil + v = "[#{v}]" if /\A\[.*\]\z/ !~ v && /:/ =~ v + self.host = v + end + + ## + # Returns the top-level domain for this host. + # + # @example + # Addressable::URI.parse("http://www.example.co.uk").tld # => "co.uk" + def tld + PublicSuffix.parse(self.host, ignore_private: true).tld + end + + ## + # Sets the top-level domain for this URI. + # + # @param [String, #to_str] new_tld The new top-level domain. + def tld=(new_tld) + replaced_tld = host.sub(/#{tld}\z/, new_tld) + self.host = PublicSuffix::Domain.new(replaced_tld).to_s + end + + ## + # Returns the public suffix domain for this host. + # + # @example + # Addressable::URI.parse("http://www.example.co.uk").domain # => "example.co.uk" + def domain + PublicSuffix.domain(self.host, ignore_private: true) + end + + ## + # The authority component for this URI. + # Combines the user, password, host, and port components. + # + # @return [String] The authority component. + def authority + self.host && @authority ||= begin + authority = String.new + if self.userinfo != nil + authority << "#{self.userinfo}@" + end + authority << self.host + if self.port != nil + authority << ":#{self.port}" + end + authority + end + end + + ## + # The authority component for this URI, normalized. + # + # @return [String] The authority component, normalized. + def normalized_authority + return nil unless self.authority + @normalized_authority ||= begin + authority = String.new + if self.normalized_userinfo != nil + authority << "#{self.normalized_userinfo}@" + end + authority << self.normalized_host + if self.normalized_port != nil + authority << ":#{self.normalized_port}" + end + authority + end + # All normalized values should be UTF-8 + if @normalized_authority + @normalized_authority.force_encoding(Encoding::UTF_8) + end + @normalized_authority + end + + ## + # Sets the authority component for this URI. + # + # @param [String, #to_str] new_authority The new authority component. + def authority=(new_authority) + if new_authority + if !new_authority.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_authority.class} into String." + end + new_authority = new_authority.to_str + new_userinfo = new_authority[/^([^\[\]]*)@/, 1] + if new_userinfo + new_user = new_userinfo.strip[/^([^:]*):?/, 1] + new_password = new_userinfo.strip[/:(.*)$/, 1] + end + new_host = new_authority.sub( + /^([^\[\]]*)@/, EMPTY_STR + ).sub( + /:([^:@\[\]]*?)$/, EMPTY_STR + ) + new_port = + new_authority[/:([^:@\[\]]*?)$/, 1] + end + + # Password assigned first to ensure validity in case of nil + self.password = defined?(new_password) ? new_password : nil + self.user = defined?(new_user) ? new_user : nil + self.host = defined?(new_host) ? new_host : nil + self.port = defined?(new_port) ? new_port : nil + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The origin for this URI, serialized to ASCII, as per + # RFC 6454, section 6.2. + # + # @return [String] The serialized origin. + def origin + if self.scheme && self.authority + if self.normalized_port + "#{self.normalized_scheme}://#{self.normalized_host}" + + ":#{self.normalized_port}" + else + "#{self.normalized_scheme}://#{self.normalized_host}" + end + else + "null" + end + end + + ## + # Sets the origin for this URI, serialized to ASCII, as per + # RFC 6454, section 6.2. This assignment will reset the `userinfo` + # component. + # + # @param [String, #to_str] new_origin The new origin component. + def origin=(new_origin) + if new_origin + if !new_origin.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_origin.class} into String." + end + new_origin = new_origin.to_str + new_scheme = new_origin[/^([^:\/?#]+):\/\//, 1] + unless new_scheme + raise InvalidURIError, 'An origin cannot omit the scheme.' + end + new_host = new_origin[/:\/\/([^\/?#:]+)/, 1] + unless new_host + raise InvalidURIError, 'An origin cannot omit the host.' + end + new_port = new_origin[/:([^:@\[\]\/]*?)$/, 1] + end + + self.scheme = defined?(new_scheme) ? new_scheme : nil + self.host = defined?(new_host) ? new_host : nil + self.port = defined?(new_port) ? new_port : nil + self.userinfo = nil + + # Reset dependent values + remove_instance_variable(:@userinfo) if defined?(@userinfo) + remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo) + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_authority) if defined?(@normalized_authority) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + # Returns an array of known ip-based schemes. These schemes typically + # use a similar URI form: + # //:@:/ + def self.ip_based_schemes + return self.port_mapping.keys + end + + # Returns a hash of common IP-based schemes and their default port + # numbers. Adding new schemes to this hash, as necessary, will allow + # for better URI normalization. + def self.port_mapping + PORT_MAPPING + end + + ## + # The port component for this URI. + # This is the port number actually given in the URI. This does not + # infer port numbers from default values. + # + # @return [Integer] The port component. + def port + return defined?(@port) ? @port : nil + end + + ## + # The port component for this URI, normalized. + # + # @return [Integer] The port component, normalized. + def normalized_port + return nil unless self.port + return @normalized_port if defined?(@normalized_port) + @normalized_port ||= begin + if URI.port_mapping[self.normalized_scheme] == self.port + nil + else + self.port + end + end + end + + ## + # Sets the port component for this URI. + # + # @param [String, Integer, #to_s] new_port The new port component. + def port=(new_port) + if new_port != nil && new_port.respond_to?(:to_str) + new_port = Addressable::URI.unencode_component(new_port.to_str) + end + + if new_port.respond_to?(:valid_encoding?) && !new_port.valid_encoding? + raise InvalidURIError, "Invalid encoding in port" + end + + if new_port != nil && !(new_port.to_s =~ /^\d+$/) + raise InvalidURIError, + "Invalid port number: #{new_port.inspect}" + end + + @port = new_port.to_s.to_i + @port = nil if @port == 0 + + # Reset dependent values + remove_instance_variable(:@authority) if defined?(@authority) + remove_instance_variable(:@normalized_port) if defined?(@normalized_port) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The inferred port component for this URI. + # This method will normalize to the default port for the URI's scheme if + # the port isn't explicitly specified in the URI. + # + # @return [Integer] The inferred port component. + def inferred_port + if self.port.to_i == 0 + self.default_port + else + self.port.to_i + end + end + + ## + # The default port for this URI's scheme. + # This method will always returns the default port for the URI's scheme + # regardless of the presence of an explicit port in the URI. + # + # @return [Integer] The default port. + def default_port + URI.port_mapping[self.scheme.strip.downcase] if self.scheme + end + + ## + # The combination of components that represent a site. + # Combines the scheme, user, password, host, and port components. + # Primarily useful for HTTP and HTTPS. + # + # For example, "http://example.com/path?query" would have a + # site value of "http://example.com". + # + # @return [String] The components that identify a site. + def site + (self.scheme || self.authority) && @site ||= begin + site_string = "".dup + site_string << "#{self.scheme}:" if self.scheme != nil + site_string << "//#{self.authority}" if self.authority != nil + site_string + end + end + + ## + # The normalized combination of components that represent a site. + # Combines the scheme, user, password, host, and port components. + # Primarily useful for HTTP and HTTPS. + # + # For example, "http://example.com/path?query" would have a + # site value of "http://example.com". + # + # @return [String] The normalized components that identify a site. + def normalized_site + return nil unless self.site + @normalized_site ||= begin + site_string = "".dup + if self.normalized_scheme != nil + site_string << "#{self.normalized_scheme}:" + end + if self.normalized_authority != nil + site_string << "//#{self.normalized_authority}" + end + site_string + end + # All normalized values should be UTF-8 + @normalized_site.force_encoding(Encoding::UTF_8) if @normalized_site + @normalized_site + end + + ## + # Sets the site value for this URI. + # + # @param [String, #to_str] new_site The new site value. + def site=(new_site) + if new_site + if !new_site.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_site.class} into String." + end + new_site = new_site.to_str + # These two regular expressions derived from the primary parsing + # expression + self.scheme = new_site[/^(?:([^:\/?#]+):)?(?:\/\/(?:[^\/?#]*))?$/, 1] + self.authority = new_site[ + /^(?:(?:[^:\/?#]+):)?(?:\/\/([^\/?#]*))?$/, 1 + ] + else + self.scheme = nil + self.authority = nil + end + end + + ## + # The path component for this URI. + # + # @return [String] The path component. + def path + return defined?(@path) ? @path : EMPTY_STR + end + + NORMPATH = /^(?!\/)[^\/:]*:.*$/ + ## + # The path component for this URI, normalized. + # + # @return [String] The path component, normalized. + def normalized_path + @normalized_path ||= begin + path = self.path.to_s + if self.scheme == nil && path =~ NORMPATH + # Relative paths with colons in the first segment are ambiguous. + path = path.sub(":", "%2F") + end + # String#split(delimeter, -1) uses the more strict splitting behavior + # found by default in Python. + result = path.strip.split(SLASH, -1).map do |segment| + Addressable::URI.normalize_component( + segment, + Addressable::URI::NormalizeCharacterClasses::PCHAR + ) + end.join(SLASH) + + result = URI.normalize_path(result) + if result.empty? && + ["http", "https", "ftp", "tftp"].include?(self.normalized_scheme) + result = SLASH.dup + end + result + end + # All normalized values should be UTF-8 + @normalized_path.force_encoding(Encoding::UTF_8) if @normalized_path + @normalized_path + end + + ## + # Sets the path component for this URI. + # + # @param [String, #to_str] new_path The new path component. + def path=(new_path) + if new_path && !new_path.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_path.class} into String." + end + @path = (new_path || EMPTY_STR).to_str + if !@path.empty? && @path[0..0] != SLASH && host != nil + @path = "/#{@path}" + end + + # Reset dependent values + remove_instance_variable(:@normalized_path) if defined?(@normalized_path) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # The basename, if any, of the file in the path component. + # + # @return [String] The path's basename. + def basename + # Path cannot be nil + return File.basename(self.path).sub(/;[^\/]*$/, EMPTY_STR) + end + + ## + # The extname, if any, of the file in the path component. + # Empty string if there is no extension. + # + # @return [String] The path's extname. + def extname + return nil unless self.path + return File.extname(self.basename) + end + + ## + # The query component for this URI. + # + # @return [String] The query component. + def query + return defined?(@query) ? @query : nil + end + + ## + # The query component for this URI, normalized. + # + # @return [String] The query component, normalized. + def normalized_query(*flags) + return nil unless self.query + return @normalized_query if defined?(@normalized_query) + @normalized_query ||= begin + modified_query_class = Addressable::URI::CharacterClasses::QUERY.dup + # Make sure possible key-value pair delimiters are escaped. + modified_query_class.sub!("\\&", "").sub!("\\;", "") + pairs = (query || "").split("&", -1) + pairs.delete_if(&:empty?).uniq! if flags.include?(:compacted) + pairs.sort! if flags.include?(:sorted) + component = pairs.map do |pair| + Addressable::URI.normalize_component( + pair, + Addressable::URI::NormalizeCharacterClasses::QUERY, + "+" + ) + end.join("&") + component == "" ? nil : component + end + # All normalized values should be UTF-8 + @normalized_query.force_encoding(Encoding::UTF_8) if @normalized_query + @normalized_query + end + + ## + # Sets the query component for this URI. + # + # @param [String, #to_str] new_query The new query component. + def query=(new_query) + if new_query && !new_query.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_query.class} into String." + end + @query = new_query ? new_query.to_str : nil + + # Reset dependent values + remove_instance_variable(:@normalized_query) if defined?(@normalized_query) + remove_composite_values + end + + ## + # Converts the query component to a Hash value. + # + # @param [Class] return_type The return type desired. Value must be either + # `Hash` or `Array`. + # + # @return [Hash, Array, nil] The query string parsed as a Hash or Array + # or nil if the query string is blank. + # + # @example + # Addressable::URI.parse("?one=1&two=2&three=3").query_values + # #=> {"one" => "1", "two" => "2", "three" => "3"} + # Addressable::URI.parse("?one=two&one=three").query_values(Array) + # #=> [["one", "two"], ["one", "three"]] + # Addressable::URI.parse("?one=two&one=three").query_values(Hash) + # #=> {"one" => "three"} + # Addressable::URI.parse("?").query_values + # #=> {} + # Addressable::URI.parse("").query_values + # #=> nil + def query_values(return_type=Hash) + empty_accumulator = Array == return_type ? [] : {} + if return_type != Hash && return_type != Array + raise ArgumentError, "Invalid return type. Must be Hash or Array." + end + return nil if self.query == nil + split_query = self.query.split("&").map do |pair| + pair.split("=", 2) if pair && !pair.empty? + end.compact + return split_query.inject(empty_accumulator.dup) do |accu, pair| + # I'd rather use key/value identifiers instead of array lookups, + # but in this case I really want to maintain the exact pair structure, + # so it's best to make all changes in-place. + pair[0] = URI.unencode_component(pair[0]) + if pair[1].respond_to?(:to_str) + value = pair[1].to_str + # I loathe the fact that I have to do this. Stupid HTML 4.01. + # Treating '+' as a space was just an unbelievably bad idea. + # There was nothing wrong with '%20'! + # If it ain't broke, don't fix it! + value = value.tr("+", " ") if ["http", "https", nil].include?(scheme) + pair[1] = URI.unencode_component(value) + end + if return_type == Hash + accu[pair[0]] = pair[1] + else + accu << pair + end + accu + end + end + + ## + # Sets the query component for this URI from a Hash object. + # An empty Hash or Array will result in an empty query string. + # + # @param [Hash, #to_hash, Array] new_query_values The new query values. + # + # @example + # uri.query_values = {:a => "a", :b => ["c", "d", "e"]} + # uri.query + # # => "a=a&b=c&b=d&b=e" + # uri.query_values = [['a', 'a'], ['b', 'c'], ['b', 'd'], ['b', 'e']] + # uri.query + # # => "a=a&b=c&b=d&b=e" + # uri.query_values = [['a', 'a'], ['b', ['c', 'd', 'e']]] + # uri.query + # # => "a=a&b=c&b=d&b=e" + # uri.query_values = [['flag'], ['key', 'value']] + # uri.query + # # => "flag&key=value" + def query_values=(new_query_values) + if new_query_values == nil + self.query = nil + return nil + end + + if !new_query_values.is_a?(Array) + if !new_query_values.respond_to?(:to_hash) + raise TypeError, + "Can't convert #{new_query_values.class} into Hash." + end + new_query_values = new_query_values.to_hash + new_query_values = new_query_values.map do |key, value| + key = key.to_s if key.kind_of?(Symbol) + [key, value] + end + # Useful default for OAuth and caching. + # Only to be used for non-Array inputs. Arrays should preserve order. + new_query_values.sort! + end + + # new_query_values have form [['key1', 'value1'], ['key2', 'value2']] + buffer = "".dup + new_query_values.each do |key, value| + encoded_key = URI.encode_component( + key, CharacterClasses::UNRESERVED + ) + if value == nil + buffer << "#{encoded_key}&" + elsif value.kind_of?(Array) + value.each do |sub_value| + encoded_value = URI.encode_component( + sub_value, CharacterClasses::UNRESERVED + ) + buffer << "#{encoded_key}=#{encoded_value}&" + end + else + encoded_value = URI.encode_component( + value, CharacterClasses::UNRESERVED + ) + buffer << "#{encoded_key}=#{encoded_value}&" + end + end + self.query = buffer.chop + end + + ## + # The HTTP request URI for this URI. This is the path and the + # query string. + # + # @return [String] The request URI required for an HTTP request. + def request_uri + return nil if self.absolute? && self.scheme !~ /^https?$/i + return ( + (!self.path.empty? ? self.path : SLASH) + + (self.query ? "?#{self.query}" : EMPTY_STR) + ) + end + + ## + # Sets the HTTP request URI for this URI. + # + # @param [String, #to_str] new_request_uri The new HTTP request URI. + def request_uri=(new_request_uri) + if !new_request_uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_request_uri.class} into String." + end + if self.absolute? && self.scheme !~ /^https?$/i + raise InvalidURIError, + "Cannot set an HTTP request URI for a non-HTTP URI." + end + new_request_uri = new_request_uri.to_str + path_component = new_request_uri[/^([^\?]*)\??(?:.*)$/, 1] + query_component = new_request_uri[/^(?:[^\?]*)\?(.*)$/, 1] + path_component = path_component.to_s + path_component = (!path_component.empty? ? path_component : SLASH) + self.path = path_component + self.query = query_component + + # Reset dependent values + remove_composite_values + end + + ## + # The fragment component for this URI. + # + # @return [String] The fragment component. + def fragment + return defined?(@fragment) ? @fragment : nil + end + + ## + # The fragment component for this URI, normalized. + # + # @return [String] The fragment component, normalized. + def normalized_fragment + return nil unless self.fragment + return @normalized_fragment if defined?(@normalized_fragment) + @normalized_fragment ||= begin + component = Addressable::URI.normalize_component( + self.fragment, + Addressable::URI::NormalizeCharacterClasses::FRAGMENT + ) + component == "" ? nil : component + end + # All normalized values should be UTF-8 + if @normalized_fragment + @normalized_fragment.force_encoding(Encoding::UTF_8) + end + @normalized_fragment + end + + ## + # Sets the fragment component for this URI. + # + # @param [String, #to_str] new_fragment The new fragment component. + def fragment=(new_fragment) + if new_fragment && !new_fragment.respond_to?(:to_str) + raise TypeError, "Can't convert #{new_fragment.class} into String." + end + @fragment = new_fragment ? new_fragment.to_str : nil + + # Reset dependent values + remove_instance_variable(:@normalized_fragment) if defined?(@normalized_fragment) + remove_composite_values + + # Ensure we haven't created an invalid URI + validate() + end + + ## + # Determines if the scheme indicates an IP-based protocol. + # + # @return [TrueClass, FalseClass] + # true if the scheme indicates an IP-based protocol. + # false otherwise. + def ip_based? + if self.scheme + return URI.ip_based_schemes.include?( + self.scheme.strip.downcase) + end + return false + end + + ## + # Determines if the URI is relative. + # + # @return [TrueClass, FalseClass] + # true if the URI is relative. false + # otherwise. + def relative? + return self.scheme.nil? + end + + ## + # Determines if the URI is absolute. + # + # @return [TrueClass, FalseClass] + # true if the URI is absolute. false + # otherwise. + def absolute? + return !relative? + end + + ## + # Joins two URIs together. + # + # @param [String, Addressable::URI, #to_str] The URI to join with. + # + # @return [Addressable::URI] The joined URI. + def join(uri) + if !uri.respond_to?(:to_str) + raise TypeError, "Can't convert #{uri.class} into String." + end + if !uri.kind_of?(URI) + # Otherwise, convert to a String, then parse. + uri = URI.parse(uri.to_str) + end + if uri.to_s.empty? + return self.dup + end + + joined_scheme = nil + joined_user = nil + joined_password = nil + joined_host = nil + joined_port = nil + joined_path = nil + joined_query = nil + joined_fragment = nil + + # Section 5.2.2 of RFC 3986 + if uri.scheme != nil + joined_scheme = uri.scheme + joined_user = uri.user + joined_password = uri.password + joined_host = uri.host + joined_port = uri.port + joined_path = URI.normalize_path(uri.path) + joined_query = uri.query + else + if uri.authority != nil + joined_user = uri.user + joined_password = uri.password + joined_host = uri.host + joined_port = uri.port + joined_path = URI.normalize_path(uri.path) + joined_query = uri.query + else + if uri.path == nil || uri.path.empty? + joined_path = self.path + if uri.query != nil + joined_query = uri.query + else + joined_query = self.query + end + else + if uri.path[0..0] == SLASH + joined_path = URI.normalize_path(uri.path) + else + base_path = self.path.dup + base_path = EMPTY_STR if base_path == nil + base_path = URI.normalize_path(base_path) + + # Section 5.2.3 of RFC 3986 + # + # Removes the right-most path segment from the base path. + if base_path.include?(SLASH) + base_path.sub!(/\/[^\/]+$/, SLASH) + else + base_path = EMPTY_STR + end + + # If the base path is empty and an authority segment has been + # defined, use a base path of SLASH + if base_path.empty? && self.authority != nil + base_path = SLASH + end + + joined_path = URI.normalize_path(base_path + uri.path) + end + joined_query = uri.query + end + joined_user = self.user + joined_password = self.password + joined_host = self.host + joined_port = self.port + end + joined_scheme = self.scheme + end + joined_fragment = uri.fragment + + return self.class.new( + :scheme => joined_scheme, + :user => joined_user, + :password => joined_password, + :host => joined_host, + :port => joined_port, + :path => joined_path, + :query => joined_query, + :fragment => joined_fragment + ) + end + alias_method :+, :join + + ## + # Destructive form of join. + # + # @param [String, Addressable::URI, #to_str] The URI to join with. + # + # @return [Addressable::URI] The joined URI. + # + # @see Addressable::URI#join + def join!(uri) + replace_self(self.join(uri)) + end + + ## + # Merges a URI with a Hash of components. + # This method has different behavior from join. Any + # components present in the hash parameter will override the + # original components. The path component is not treated specially. + # + # @param [Hash, Addressable::URI, #to_hash] The components to merge with. + # + # @return [Addressable::URI] The merged URI. + # + # @see Hash#merge + def merge(hash) + if !hash.respond_to?(:to_hash) + raise TypeError, "Can't convert #{hash.class} into Hash." + end + hash = hash.to_hash + + if hash.has_key?(:authority) + if (hash.keys & [:userinfo, :user, :password, :host, :port]).any? + raise ArgumentError, + "Cannot specify both an authority and any of the components " + + "within the authority." + end + end + if hash.has_key?(:userinfo) + if (hash.keys & [:user, :password]).any? + raise ArgumentError, + "Cannot specify both a userinfo and either the user or password." + end + end + + uri = self.class.new + uri.defer_validation do + # Bunch of crazy logic required because of the composite components + # like userinfo and authority. + uri.scheme = + hash.has_key?(:scheme) ? hash[:scheme] : self.scheme + if hash.has_key?(:authority) + uri.authority = + hash.has_key?(:authority) ? hash[:authority] : self.authority + end + if hash.has_key?(:userinfo) + uri.userinfo = + hash.has_key?(:userinfo) ? hash[:userinfo] : self.userinfo + end + if !hash.has_key?(:userinfo) && !hash.has_key?(:authority) + uri.user = + hash.has_key?(:user) ? hash[:user] : self.user + uri.password = + hash.has_key?(:password) ? hash[:password] : self.password + end + if !hash.has_key?(:authority) + uri.host = + hash.has_key?(:host) ? hash[:host] : self.host + uri.port = + hash.has_key?(:port) ? hash[:port] : self.port + end + uri.path = + hash.has_key?(:path) ? hash[:path] : self.path + uri.query = + hash.has_key?(:query) ? hash[:query] : self.query + uri.fragment = + hash.has_key?(:fragment) ? hash[:fragment] : self.fragment + end + + return uri + end + + ## + # Destructive form of merge. + # + # @param [Hash, Addressable::URI, #to_hash] The components to merge with. + # + # @return [Addressable::URI] The merged URI. + # + # @see Addressable::URI#merge + def merge!(uri) + replace_self(self.merge(uri)) + end + + ## + # Returns the shortest normalized relative form of this URI that uses the + # supplied URI as a base for resolution. Returns an absolute URI if + # necessary. This is effectively the opposite of route_to. + # + # @param [String, Addressable::URI, #to_str] uri The URI to route from. + # + # @return [Addressable::URI] + # The normalized relative URI that is equivalent to the original URI. + def route_from(uri) + uri = URI.parse(uri).normalize + normalized_self = self.normalize + if normalized_self.relative? + raise ArgumentError, "Expected absolute URI, got: #{self.to_s}" + end + if uri.relative? + raise ArgumentError, "Expected absolute URI, got: #{uri.to_s}" + end + if normalized_self == uri + return Addressable::URI.parse("##{normalized_self.fragment}") + end + components = normalized_self.to_hash + if normalized_self.scheme == uri.scheme + components[:scheme] = nil + if normalized_self.authority == uri.authority + components[:user] = nil + components[:password] = nil + components[:host] = nil + components[:port] = nil + if normalized_self.path == uri.path + components[:path] = nil + if normalized_self.query == uri.query + components[:query] = nil + end + else + if uri.path != SLASH and components[:path] + self_splitted_path = split_path(components[:path]) + uri_splitted_path = split_path(uri.path) + self_dir = self_splitted_path.shift + uri_dir = uri_splitted_path.shift + while !self_splitted_path.empty? && !uri_splitted_path.empty? and self_dir == uri_dir + self_dir = self_splitted_path.shift + uri_dir = uri_splitted_path.shift + end + components[:path] = (uri_splitted_path.fill('..') + [self_dir] + self_splitted_path).join(SLASH) + end + end + end + end + # Avoid network-path references. + if components[:host] != nil + components[:scheme] = normalized_self.scheme + end + return Addressable::URI.new( + :scheme => components[:scheme], + :user => components[:user], + :password => components[:password], + :host => components[:host], + :port => components[:port], + :path => components[:path], + :query => components[:query], + :fragment => components[:fragment] + ) + end + + ## + # Returns the shortest normalized relative form of the supplied URI that + # uses this URI as a base for resolution. Returns an absolute URI if + # necessary. This is effectively the opposite of route_from. + # + # @param [String, Addressable::URI, #to_str] uri The URI to route to. + # + # @return [Addressable::URI] + # The normalized relative URI that is equivalent to the supplied URI. + def route_to(uri) + return URI.parse(uri).route_from(self) + end + + ## + # Returns a normalized URI object. + # + # NOTE: This method does not attempt to fully conform to specifications. + # It exists largely to correct other people's failures to read the + # specifications, and also to deal with caching issues since several + # different URIs may represent the same resource and should not be + # cached multiple times. + # + # @return [Addressable::URI] The normalized URI. + def normalize + # This is a special exception for the frequently misused feed + # URI scheme. + if normalized_scheme == "feed" + if self.to_s =~ /^feed:\/*http:\/*/ + return URI.parse( + self.to_s[/^feed:\/*(http:\/*.*)/, 1] + ).normalize + end + end + + return self.class.new( + :scheme => normalized_scheme, + :authority => normalized_authority, + :path => normalized_path, + :query => normalized_query, + :fragment => normalized_fragment + ) + end + + ## + # Destructively normalizes this URI object. + # + # @return [Addressable::URI] The normalized URI. + # + # @see Addressable::URI#normalize + def normalize! + replace_self(self.normalize) + end + + ## + # Creates a URI suitable for display to users. If semantic attacks are + # likely, the application should try to detect these and warn the user. + # See RFC 3986, + # section 7.6 for more information. + # + # @return [Addressable::URI] A URI suitable for display purposes. + def display_uri + display_uri = self.normalize + display_uri.host = ::Addressable::IDNA.to_unicode(display_uri.host) + return display_uri + end + + ## + # Returns true if the URI objects are equal. This method + # normalizes both URIs before doing the comparison, and allows comparison + # against Strings. + # + # @param [Object] uri The URI to compare. + # + # @return [TrueClass, FalseClass] + # true if the URIs are equivalent, false + # otherwise. + def ===(uri) + if uri.respond_to?(:normalize) + uri_string = uri.normalize.to_s + else + begin + uri_string = ::Addressable::URI.parse(uri).normalize.to_s + rescue InvalidURIError, TypeError + return false + end + end + return self.normalize.to_s == uri_string + end + + ## + # Returns true if the URI objects are equal. This method + # normalizes both URIs before doing the comparison. + # + # @param [Object] uri The URI to compare. + # + # @return [TrueClass, FalseClass] + # true if the URIs are equivalent, false + # otherwise. + def ==(uri) + return false unless uri.kind_of?(URI) + return self.normalize.to_s == uri.normalize.to_s + end + + ## + # Returns true if the URI objects are equal. This method + # does NOT normalize either URI before doing the comparison. + # + # @param [Object] uri The URI to compare. + # + # @return [TrueClass, FalseClass] + # true if the URIs are equivalent, false + # otherwise. + def eql?(uri) + return false unless uri.kind_of?(URI) + return self.to_s == uri.to_s + end + + ## + # A hash value that will make a URI equivalent to its normalized + # form. + # + # @return [Integer] A hash of the URI. + def hash + @hash ||= self.to_s.hash * -1 + end + + ## + # Clones the URI object. + # + # @return [Addressable::URI] The cloned URI. + def dup + duplicated_uri = self.class.new( + :scheme => self.scheme ? self.scheme.dup : nil, + :user => self.user ? self.user.dup : nil, + :password => self.password ? self.password.dup : nil, + :host => self.host ? self.host.dup : nil, + :port => self.port, + :path => self.path ? self.path.dup : nil, + :query => self.query ? self.query.dup : nil, + :fragment => self.fragment ? self.fragment.dup : nil + ) + return duplicated_uri + end + + ## + # Omits components from a URI. + # + # @param [Symbol] *components The components to be omitted. + # + # @return [Addressable::URI] The URI with components omitted. + # + # @example + # uri = Addressable::URI.parse("http://example.com/path?query") + # #=> # + # uri.omit(:scheme, :authority) + # #=> # + def omit(*components) + invalid_components = components - [ + :scheme, :user, :password, :userinfo, :host, :port, :authority, + :path, :query, :fragment + ] + unless invalid_components.empty? + raise ArgumentError, + "Invalid component names: #{invalid_components.inspect}." + end + duplicated_uri = self.dup + duplicated_uri.defer_validation do + components.each do |component| + duplicated_uri.send((component.to_s + "=").to_sym, nil) + end + duplicated_uri.user = duplicated_uri.normalized_user + end + duplicated_uri + end + + ## + # Destructive form of omit. + # + # @param [Symbol] *components The components to be omitted. + # + # @return [Addressable::URI] The URI with components omitted. + # + # @see Addressable::URI#omit + def omit!(*components) + replace_self(self.omit(*components)) + end + + ## + # Determines if the URI is an empty string. + # + # @return [TrueClass, FalseClass] + # Returns true if empty, false otherwise. + def empty? + return self.to_s.empty? + end + + ## + # Converts the URI to a String. + # + # @return [String] The URI's String representation. + def to_s + if self.scheme == nil && self.path != nil && !self.path.empty? && + self.path =~ NORMPATH + raise InvalidURIError, + "Cannot assemble URI string with ambiguous path: '#{self.path}'" + end + @uri_string ||= begin + uri_string = String.new + uri_string << "#{self.scheme}:" if self.scheme != nil + uri_string << "//#{self.authority}" if self.authority != nil + uri_string << self.path.to_s + uri_string << "?#{self.query}" if self.query != nil + uri_string << "##{self.fragment}" if self.fragment != nil + uri_string.force_encoding(Encoding::UTF_8) + uri_string + end + end + + ## + # URI's are glorified Strings. Allow implicit conversion. + alias_method :to_str, :to_s + + ## + # Returns a Hash of the URI components. + # + # @return [Hash] The URI as a Hash of components. + def to_hash + return { + :scheme => self.scheme, + :user => self.user, + :password => self.password, + :host => self.host, + :port => self.port, + :path => self.path, + :query => self.query, + :fragment => self.fragment + } + end + + ## + # Returns a String representation of the URI object's state. + # + # @return [String] The URI object's state, as a String. + def inspect + sprintf("#<%s:%#0x URI:%s>", URI.to_s, self.object_id, self.to_s) + end + + ## + # This method allows you to make several changes to a URI simultaneously, + # which separately would cause validation errors, but in conjunction, + # are valid. The URI will be revalidated as soon as the entire block has + # been executed. + # + # @param [Proc] block + # A set of operations to perform on a given URI. + def defer_validation + raise LocalJumpError, "No block given." unless block_given? + @validation_deferred = true + yield + @validation_deferred = false + validate + return nil + end + + protected + SELF_REF = '.' + PARENT = '..' + + RULE_2A = /\/\.\/|\/\.$/ + RULE_2B_2C = /\/([^\/]*)\/\.\.\/|\/([^\/]*)\/\.\.$/ + RULE_2D = /^\.\.?\/?/ + RULE_PREFIXED_PARENT = /^\/\.\.?\/|^(\/\.\.?)+\/?$/ + + ## + # Resolves paths to their simplest form. + # + # @param [String] path The path to normalize. + # + # @return [String] The normalized path. + def self.normalize_path(path) + # Section 5.2.4 of RFC 3986 + + return nil if path.nil? + normalized_path = path.dup + begin + mod = nil + mod ||= normalized_path.gsub!(RULE_2A, SLASH) + + pair = normalized_path.match(RULE_2B_2C) + parent, current = pair[1], pair[2] if pair + if pair && ((parent != SELF_REF && parent != PARENT) || + (current != SELF_REF && current != PARENT)) + mod ||= normalized_path.gsub!( + Regexp.new( + "/#{Regexp.escape(parent.to_s)}/\\.\\./|" + + "(/#{Regexp.escape(current.to_s)}/\\.\\.$)" + ), SLASH + ) + end + + mod ||= normalized_path.gsub!(RULE_2D, EMPTY_STR) + # Non-standard, removes prefixed dotted segments from path. + mod ||= normalized_path.gsub!(RULE_PREFIXED_PARENT, SLASH) + end until mod.nil? + + return normalized_path + end + + ## + # Ensures that the URI is valid. + def validate + return if !!@validation_deferred + if self.scheme != nil && self.ip_based? && + (self.host == nil || self.host.empty?) && + (self.path == nil || self.path.empty?) + raise InvalidURIError, + "Absolute URI missing hierarchical segment: '#{self.to_s}'" + end + if self.host == nil + if self.port != nil || + self.user != nil || + self.password != nil + raise InvalidURIError, "Hostname not supplied: '#{self.to_s}'" + end + end + if self.path != nil && !self.path.empty? && self.path[0..0] != SLASH && + self.authority != nil + raise InvalidURIError, + "Cannot have a relative path with an authority set: '#{self.to_s}'" + end + if self.path != nil && !self.path.empty? && + self.path[0..1] == SLASH + SLASH && self.authority == nil + raise InvalidURIError, + "Cannot have a path with two leading slashes " + + "without an authority set: '#{self.to_s}'" + end + unreserved = CharacterClasses::UNRESERVED + sub_delims = CharacterClasses::SUB_DELIMS + if !self.host.nil? && (self.host =~ /[<>{}\/\\\?\#\@"[[:space:]]]/ || + (self.host[/^\[(.*)\]$/, 1] != nil && self.host[/^\[(.*)\]$/, 1] !~ + Regexp.new("^[#{unreserved}#{sub_delims}:]*$"))) + raise InvalidURIError, "Invalid character in host: '#{self.host.to_s}'" + end + return nil + end + + ## + # Replaces the internal state of self with the specified URI's state. + # Used in destructive operations to avoid massive code repetition. + # + # @param [Addressable::URI] uri The URI to replace self with. + # + # @return [Addressable::URI] self. + def replace_self(uri) + # Reset dependent values + instance_variables.each do |var| + if instance_variable_defined?(var) && var != :@validation_deferred + remove_instance_variable(var) + end + end + + @scheme = uri.scheme + @user = uri.user + @password = uri.password + @host = uri.host + @port = uri.port + @path = uri.path + @query = uri.query + @fragment = uri.fragment + return self + end + + ## + # Splits path string with "/" (slash). + # It is considered that there is empty string after last slash when + # path ends with slash. + # + # @param [String] path The path to split. + # + # @return [Array] An array of parts of path. + def split_path(path) + splitted = path.split(SLASH) + splitted << EMPTY_STR if path.end_with? SLASH + splitted + end + + ## + # Resets composite values for the entire URI + # + # @api private + def remove_composite_values + remove_instance_variable(:@uri_string) if defined?(@uri_string) + remove_instance_variable(:@hash) if defined?(@hash) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/version.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/version.rb new file mode 100644 index 000000000000..2efe4340f30d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/lib/addressable/version.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +# encoding:utf-8 +#-- +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#++ + + +# Used to prevent the class/module from being loaded more than once +if !defined?(Addressable::VERSION) + module Addressable + module VERSION + MAJOR = 2 + MINOR = 8 + TINY = 0 + + STRING = [MAJOR, MINOR, TINY].join('.') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/idna_spec.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/idna_spec.rb new file mode 100644 index 000000000000..4104b3702efa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/idna_spec.rb @@ -0,0 +1,302 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +# Have to use RubyGems to load the idn gem. +require "rubygems" + +require "addressable/idna" + +shared_examples_for "converting from unicode to ASCII" do + it "should convert 'www.google.com' correctly" do + expect(Addressable::IDNA.to_ascii("www.google.com")).to eq("www.google.com") + end + + long = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' + it "should convert '#{long}' correctly" do + expect(Addressable::IDNA.to_ascii(long)).to eq(long) + end + + it "should convert 'www.詹姆斯.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "www.詹姆斯.com" + )).to eq("www.xn--8ws00zhy3a.com") + end + + it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do + "www.Iñtërnâtiônàlizætiøn.com" + expect(Addressable::IDNA.to_ascii( + "www.I\xC3\xB1t\xC3\xABrn\xC3\xA2ti\xC3\xB4" + + "n\xC3\xA0liz\xC3\xA6ti\xC3\xB8n.com" + )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com") + end + + it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "www.In\xCC\x83te\xCC\x88rna\xCC\x82tio\xCC\x82n" + + "a\xCC\x80liz\xC3\xA6ti\xC3\xB8n.com" + )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com") + end + + it "should convert " + + "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " + + "correctly" do + expect(Addressable::IDNA.to_ascii( + "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" + + "\201\252\343\201\214\343\201\204\343\202\217\343\201\221\343\201\256" + + "\343\202\217\343\201\213\343\202\211\343\201\252\343\201\204\343\201" + + "\251\343\202\201\343\201\204\343\202\223\343\202\201\343\201\204\343" + + "\201\256\343\202\211\343\201\271\343\202\213\343\201\276\343\201\240" + + "\343\201\252\343\201\214\343\201\217\343\201\227\343\201\252\343\201" + + "\204\343\201\250\343\201\237\343\202\212\343\201\252\343\201\204." + + "w3.mag.keio.ac.jp" + )).to eq( + "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + + "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + ) + end + + it "should convert " + + "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " + + "correctly" do + expect(Addressable::IDNA.to_ascii( + "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" + + "\201\252\343\201\213\343\202\231\343\201\204\343\202\217\343\201\221" + + "\343\201\256\343\202\217\343\201\213\343\202\211\343\201\252\343\201" + + "\204\343\201\250\343\202\231\343\202\201\343\201\204\343\202\223\343" + + "\202\201\343\201\204\343\201\256\343\202\211\343\201\270\343\202\231" + + "\343\202\213\343\201\276\343\201\237\343\202\231\343\201\252\343\201" + + "\213\343\202\231\343\201\217\343\201\227\343\201\252\343\201\204\343" + + "\201\250\343\201\237\343\202\212\343\201\252\343\201\204." + + "w3.mag.keio.ac.jp" + )).to eq( + "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + + "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + ) + end + + it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do + expect(Addressable::IDNA.to_ascii( + "点心和烤鸭.w3.mag.keio.ac.jp" + )).to eq("xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp") + end + + it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "가각갂갃간갅갆갇갈갉힢힣.com" + )).to eq("xn--o39acdefghijk5883jma.com") + end + + it "should convert " + + "'\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com" + )).to eq("xn--9cs565brid46mda086o.com") + end + + it "should convert 'リ宠퐱〹.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "\357\276\230\345\256\240\355\220\261\343\200\271.com" + )).to eq("xn--eek174hoxfpr4k.com") + end + + it "should convert 'リ宠퐱卄.com' correctly" do + expect(Addressable::IDNA.to_ascii( + "\343\203\252\345\256\240\355\220\261\345\215\204.com" + )).to eq("xn--eek174hoxfpr4k.com") + end + + it "should convert 'ᆵ' correctly" do + expect(Addressable::IDNA.to_ascii( + "\341\206\265" + )).to eq("xn--4ud") + end + + it "should convert 'ᆵ' correctly" do + expect(Addressable::IDNA.to_ascii( + "\357\276\257" + )).to eq("xn--4ud") + end + + it "should convert '🌹🌹🌹.ws' correctly" do + expect(Addressable::IDNA.to_ascii( + "\360\237\214\271\360\237\214\271\360\237\214\271.ws" + )).to eq("xn--2h8haa.ws") + end + + it "should handle two adjacent '.'s correctly" do + expect(Addressable::IDNA.to_ascii( + "example..host" + )).to eq("example..host") + end +end + +shared_examples_for "converting from ASCII to unicode" do + long = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com' + it "should convert '#{long}' correctly" do + expect(Addressable::IDNA.to_unicode(long)).to eq(long) + end + + it "should return the identity conversion when punycode decode fails" do + expect(Addressable::IDNA.to_unicode("xn--zckp1cyg1.sblo.jp")).to eq( + "xn--zckp1cyg1.sblo.jp") + end + + it "should return the identity conversion when the ACE prefix has no suffix" do + expect(Addressable::IDNA.to_unicode("xn--...-")).to eq("xn--...-") + end + + it "should convert 'www.google.com' correctly" do + expect(Addressable::IDNA.to_unicode("www.google.com")).to eq( + "www.google.com") + end + + it "should convert 'www.詹姆斯.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "www.xn--8ws00zhy3a.com" + )).to eq("www.詹姆斯.com") + end + + it "should convert '詹姆斯.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--8ws00zhy3a.com" + )).to eq("詹姆斯.com") + end + + it "should convert 'www.iñtërnâtiônàlizætiøn.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "www.xn--itrntinliztin-vdb0a5exd8ewcye.com" + )).to eq("www.iñtërnâtiônàlizætiøn.com") + end + + it "should convert 'iñtërnâtiônàlizætiøn.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--itrntinliztin-vdb0a5exd8ewcye.com" + )).to eq("iñtërnâtiônàlizætiøn.com") + end + + it "should convert " + + "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " + + "correctly" do + expect(Addressable::IDNA.to_unicode( + "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" + + "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + )).to eq( + "www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp" + ) + end + + it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp" + )).to eq("点心和烤鸭.w3.mag.keio.ac.jp") + end + + it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--o39acdefghijk5883jma.com" + )).to eq("가각갂갃간갅갆갇갈갉힢힣.com") + end + + it "should convert " + + "'\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--9cs565brid46mda086o.com" + )).to eq( + "\347\242\274\346\250\231\346\272\226\350" + + "\220\254\345\234\213\347\242\274.com" + ) + end + + it "should convert 'リ宠퐱卄.com' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--eek174hoxfpr4k.com" + )).to eq("\343\203\252\345\256\240\355\220\261\345\215\204.com") + end + + it "should convert 'ᆵ' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--4ud" + )).to eq("\341\206\265") + end + + it "should convert '🌹🌹🌹.ws' correctly" do + expect(Addressable::IDNA.to_unicode( + "xn--2h8haa.ws" + )).to eq("\360\237\214\271\360\237\214\271\360\237\214\271.ws") + end + + it "should handle two adjacent '.'s correctly" do + expect(Addressable::IDNA.to_unicode( + "example..host" + )).to eq("example..host") + end + + it "should normalize 'string' correctly" do + expect(Addressable::IDNA.unicode_normalize_kc(:'string')).to eq("string") + expect(Addressable::IDNA.unicode_normalize_kc("string")).to eq("string") + end +end + +describe Addressable::IDNA, "when using the pure-Ruby implementation" do + before do + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/pure.rb" + end + + it_should_behave_like "converting from unicode to ASCII" + it_should_behave_like "converting from ASCII to unicode" + + begin + require "fiber" + + it "should not blow up inside fibers" do + f = Fiber.new do + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/pure.rb" + end + f.resume + end + rescue LoadError + # Fibers aren't supported in this version of Ruby, skip this test. + warn('Fibers unsupported.') + end +end + +begin + require "idn" + + describe Addressable::IDNA, "when using the native-code implementation" do + before do + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/native.rb" + end + + it_should_behave_like "converting from unicode to ASCII" + it_should_behave_like "converting from ASCII to unicode" + end +rescue LoadError => error + raise error if ENV["CI"] && TestHelper.native_supported? + + # Cannot test the native implementation without libidn support. + warn('Could not load native IDN implementation.') +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/net_http_compat_spec.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/net_http_compat_spec.rb new file mode 100644 index 000000000000..8663a8673b1b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/net_http_compat_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" +require "net/http" + +describe Net::HTTP do + it "should be compatible with Addressable" do + response_body = + Net::HTTP.get(Addressable::URI.parse('http://www.google.com/')) + expect(response_body).not_to be_nil + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/security_spec.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/security_spec.rb new file mode 100644 index 000000000000..601e8088ee4a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/security_spec.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" + +describe Addressable::URI, "when created with a URI known to cause crashes " + + "in certain browsers" do + it "should parse correctly" do + uri = Addressable::URI.parse('%%30%30') + expect(uri.path).to eq('%%30%30') + expect(uri.normalize.path).to eq('%2500') + end + + it "should parse correctly as a full URI" do + uri = Addressable::URI.parse('http://www.example.com/%%30%30') + expect(uri.path).to eq('/%%30%30') + expect(uri.normalize.path).to eq('/%2500') + end +end + +describe Addressable::URI, "when created with a URI known to cause crashes " + + "in certain browsers" do + it "should parse correctly" do + uri = Addressable::URI.parse('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') + expect(uri.path).to eq('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') + expect(uri.normalize.path).to eq( + '%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + + '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + + '%A3%20%E0%A5%A3%20%E5%86%97' + ) + end + + it "should parse correctly as a full URI" do + uri = Addressable::URI.parse('http://www.example.com/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') + expect(uri.path).to eq('/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗') + expect(uri.normalize.path).to eq( + '/%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' + + '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' + + '%A3%20%E0%A5%A3%20%E5%86%97' + ) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/template_spec.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/template_spec.rb new file mode 100644 index 000000000000..d47589abf855 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/template_spec.rb @@ -0,0 +1,1460 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "bigdecimal" +require "timeout" +require "addressable/template" + +shared_examples_for 'expands' do |tests| + tests.each do |template, expansion| + exp = expansion.is_a?(Array) ? expansion.first : expansion + it "#{template} to #{exp}" do + tmpl = Addressable::Template.new(template).expand(subject) + if expansion.is_a?(Array) + expect(expansion.any?{|i| i == tmpl.to_str}).to be true + else + expect(tmpl.to_str).to eq(expansion) + end + end + end +end + +describe "eql?" do + let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } + it 'is equal when the pattern matches' do + other_template = Addressable::Template.new('https://www.example.com/{foo}') + expect(template).to be_eql(other_template) + expect(other_template).to be_eql(template) + end + it 'is not equal when the pattern differs' do + other_template = Addressable::Template.new('https://www.example.com/{bar}') + expect(template).to_not be_eql(other_template) + expect(other_template).to_not be_eql(template) + end + it 'is not equal to non-templates' do + uri = 'https://www.example.com/foo/bar' + addressable_template = Addressable::Template.new uri + addressable_uri = Addressable::URI.parse uri + expect(addressable_template).to_not be_eql(addressable_uri) + expect(addressable_uri).to_not be_eql(addressable_template) + end +end + +describe "==" do + let(:template) { Addressable::Template.new('https://www.example.com/{foo}') } + it 'is equal when the pattern matches' do + other_template = Addressable::Template.new('https://www.example.com/{foo}') + expect(template).to eq other_template + expect(other_template).to eq template + end + it 'is not equal when the pattern differs' do + other_template = Addressable::Template.new('https://www.example.com/{bar}') + expect(template).not_to eq other_template + expect(other_template).not_to eq template + end + it 'is not equal to non-templates' do + uri = 'https://www.example.com/foo/bar' + addressable_template = Addressable::Template.new uri + addressable_uri = Addressable::URI.parse uri + expect(addressable_template).not_to eq addressable_uri + expect(addressable_uri).not_to eq addressable_template + end +end + +describe "Type conversion" do + subject { + { + :var => true, + :hello => 1234, + :nothing => nil, + :sym => :symbolic, + :decimal => BigDecimal('1') + } + } + + it_behaves_like 'expands', { + '{var}' => 'true', + '{hello}' => '1234', + '{nothing}' => '', + '{sym}' => 'symbolic', + '{decimal}' => RUBY_VERSION < '2.4.0' ? '0.1E1' : '0.1e1' + } +end + +describe "Level 1:" do + subject { + {:var => "value", :hello => "Hello World!"} + } + it_behaves_like 'expands', { + '{var}' => 'value', + '{hello}' => 'Hello%20World%21' + } +end + +describe "Level 2" do + subject { + { + :var => "value", + :hello => "Hello World!", + :path => "/foo/bar" + } + } + context "Operator +:" do + it_behaves_like 'expands', { + '{+var}' => 'value', + '{+hello}' => 'Hello%20World!', + '{+path}/here' => '/foo/bar/here', + 'here?ref={+path}' => 'here?ref=/foo/bar' + } + end + context "Operator #:" do + it_behaves_like 'expands', { + 'X{#var}' => 'X#value', + 'X{#hello}' => 'X#Hello%20World!' + } + end +end + +describe "Level 3" do + subject { + { + :var => "value", + :hello => "Hello World!", + :empty => "", + :path => "/foo/bar", + :x => "1024", + :y => "768" + } + } + context "Operator nil (multiple vars):" do + it_behaves_like 'expands', { + 'map?{x,y}' => 'map?1024,768', + '{x,hello,y}' => '1024,Hello%20World%21,768' + } + end + context "Operator + (multiple vars):" do + it_behaves_like 'expands', { + '{+x,hello,y}' => '1024,Hello%20World!,768', + '{+path,x}/here' => '/foo/bar,1024/here' + } + end + context "Operator # (multiple vars):" do + it_behaves_like 'expands', { + '{#x,hello,y}' => '#1024,Hello%20World!,768', + '{#path,x}/here' => '#/foo/bar,1024/here' + } + end + context "Operator ." do + it_behaves_like 'expands', { + 'X{.var}' => 'X.value', + 'X{.x,y}' => 'X.1024.768' + } + end + context "Operator /" do + it_behaves_like 'expands', { + '{/var}' => '/value', + '{/var,x}/here' => '/value/1024/here' + } + end + context "Operator ;" do + it_behaves_like 'expands', { + '{;x,y}' => ';x=1024;y=768', + '{;x,y,empty}' => ';x=1024;y=768;empty' + } + end + context "Operator ?" do + it_behaves_like 'expands', { + '{?x,y}' => '?x=1024&y=768', + '{?x,y,empty}' => '?x=1024&y=768&empty=' + } + end + context "Operator &" do + it_behaves_like 'expands', { + '?fixed=yes{&x}' => '?fixed=yes&x=1024', + '{&x,y,empty}' => '&x=1024&y=768&empty=' + } + end +end + +describe "Level 4" do + subject { + { + :var => "value", + :hello => "Hello World!", + :path => "/foo/bar", + :semi => ";", + :list => %w(red green blue), + :keys => {"semi" => ';', "dot" => '.', "comma" => ','} + } + } + context "Expansion with value modifiers" do + it_behaves_like 'expands', { + '{var:3}' => 'val', + '{var:30}' => 'value', + '{list}' => 'red,green,blue', + '{list*}' => 'red,green,blue', + '{keys}' => [ + 'semi,%3B,dot,.,comma,%2C', + 'dot,.,semi,%3B,comma,%2C', + 'comma,%2C,semi,%3B,dot,.', + 'semi,%3B,comma,%2C,dot,.', + 'dot,.,comma,%2C,semi,%3B', + 'comma,%2C,dot,.,semi,%3B' + ], + '{keys*}' => [ + 'semi=%3B,dot=.,comma=%2C', + 'dot=.,semi=%3B,comma=%2C', + 'comma=%2C,semi=%3B,dot=.', + 'semi=%3B,comma=%2C,dot=.', + 'dot=.,comma=%2C,semi=%3B', + 'comma=%2C,dot=.,semi=%3B' + ] + } + end + context "Operator + with value modifiers" do + it_behaves_like 'expands', { + '{+path:6}/here' => '/foo/b/here', + '{+list}' => 'red,green,blue', + '{+list*}' => 'red,green,blue', + '{+keys}' => [ + 'semi,;,dot,.,comma,,', + 'dot,.,semi,;,comma,,', + 'comma,,,semi,;,dot,.', + 'semi,;,comma,,,dot,.', + 'dot,.,comma,,,semi,;', + 'comma,,,dot,.,semi,;' + ], + '{+keys*}' => [ + 'semi=;,dot=.,comma=,', + 'dot=.,semi=;,comma=,', + 'comma=,,semi=;,dot=.', + 'semi=;,comma=,,dot=.', + 'dot=.,comma=,,semi=;', + 'comma=,,dot=.,semi=;' + ] + } + end + context "Operator # with value modifiers" do + it_behaves_like 'expands', { + '{#path:6}/here' => '#/foo/b/here', + '{#list}' => '#red,green,blue', + '{#list*}' => '#red,green,blue', + '{#keys}' => [ + '#semi,;,dot,.,comma,,', + '#dot,.,semi,;,comma,,', + '#comma,,,semi,;,dot,.', + '#semi,;,comma,,,dot,.', + '#dot,.,comma,,,semi,;', + '#comma,,,dot,.,semi,;' + ], + '{#keys*}' => [ + '#semi=;,dot=.,comma=,', + '#dot=.,semi=;,comma=,', + '#comma=,,semi=;,dot=.', + '#semi=;,comma=,,dot=.', + '#dot=.,comma=,,semi=;', + '#comma=,,dot=.,semi=;' + ] + } + end + context "Operator . with value modifiers" do + it_behaves_like 'expands', { + 'X{.var:3}' => 'X.val', + 'X{.list}' => 'X.red,green,blue', + 'X{.list*}' => 'X.red.green.blue', + 'X{.keys}' => [ + 'X.semi,%3B,dot,.,comma,%2C', + 'X.dot,.,semi,%3B,comma,%2C', + 'X.comma,%2C,semi,%3B,dot,.', + 'X.semi,%3B,comma,%2C,dot,.', + 'X.dot,.,comma,%2C,semi,%3B', + 'X.comma,%2C,dot,.,semi,%3B' + ], + 'X{.keys*}' => [ + 'X.semi=%3B.dot=..comma=%2C', + 'X.dot=..semi=%3B.comma=%2C', + 'X.comma=%2C.semi=%3B.dot=.', + 'X.semi=%3B.comma=%2C.dot=.', + 'X.dot=..comma=%2C.semi=%3B', + 'X.comma=%2C.dot=..semi=%3B' + ] + } + end + context "Operator / with value modifiers" do + it_behaves_like 'expands', { + '{/var:1,var}' => '/v/value', + '{/list}' => '/red,green,blue', + '{/list*}' => '/red/green/blue', + '{/list*,path:4}' => '/red/green/blue/%2Ffoo', + '{/keys}' => [ + '/semi,%3B,dot,.,comma,%2C', + '/dot,.,semi,%3B,comma,%2C', + '/comma,%2C,semi,%3B,dot,.', + '/semi,%3B,comma,%2C,dot,.', + '/dot,.,comma,%2C,semi,%3B', + '/comma,%2C,dot,.,semi,%3B' + ], + '{/keys*}' => [ + '/semi=%3B/dot=./comma=%2C', + '/dot=./semi=%3B/comma=%2C', + '/comma=%2C/semi=%3B/dot=.', + '/semi=%3B/comma=%2C/dot=.', + '/dot=./comma=%2C/semi=%3B', + '/comma=%2C/dot=./semi=%3B' + ] + } + end + context "Operator ; with value modifiers" do + it_behaves_like 'expands', { + '{;hello:5}' => ';hello=Hello', + '{;list}' => ';list=red,green,blue', + '{;list*}' => ';list=red;list=green;list=blue', + '{;keys}' => [ + ';keys=semi,%3B,dot,.,comma,%2C', + ';keys=dot,.,semi,%3B,comma,%2C', + ';keys=comma,%2C,semi,%3B,dot,.', + ';keys=semi,%3B,comma,%2C,dot,.', + ';keys=dot,.,comma,%2C,semi,%3B', + ';keys=comma,%2C,dot,.,semi,%3B' + ], + '{;keys*}' => [ + ';semi=%3B;dot=.;comma=%2C', + ';dot=.;semi=%3B;comma=%2C', + ';comma=%2C;semi=%3B;dot=.', + ';semi=%3B;comma=%2C;dot=.', + ';dot=.;comma=%2C;semi=%3B', + ';comma=%2C;dot=.;semi=%3B' + ] + } + end + context "Operator ? with value modifiers" do + it_behaves_like 'expands', { + '{?var:3}' => '?var=val', + '{?list}' => '?list=red,green,blue', + '{?list*}' => '?list=red&list=green&list=blue', + '{?keys}' => [ + '?keys=semi,%3B,dot,.,comma,%2C', + '?keys=dot,.,semi,%3B,comma,%2C', + '?keys=comma,%2C,semi,%3B,dot,.', + '?keys=semi,%3B,comma,%2C,dot,.', + '?keys=dot,.,comma,%2C,semi,%3B', + '?keys=comma,%2C,dot,.,semi,%3B' + ], + '{?keys*}' => [ + '?semi=%3B&dot=.&comma=%2C', + '?dot=.&semi=%3B&comma=%2C', + '?comma=%2C&semi=%3B&dot=.', + '?semi=%3B&comma=%2C&dot=.', + '?dot=.&comma=%2C&semi=%3B', + '?comma=%2C&dot=.&semi=%3B' + ] + } + end + context "Operator & with value modifiers" do + it_behaves_like 'expands', { + '{&var:3}' => '&var=val', + '{&list}' => '&list=red,green,blue', + '{&list*}' => '&list=red&list=green&list=blue', + '{&keys}' => [ + '&keys=semi,%3B,dot,.,comma,%2C', + '&keys=dot,.,semi,%3B,comma,%2C', + '&keys=comma,%2C,semi,%3B,dot,.', + '&keys=semi,%3B,comma,%2C,dot,.', + '&keys=dot,.,comma,%2C,semi,%3B', + '&keys=comma,%2C,dot,.,semi,%3B' + ], + '{&keys*}' => [ + '&semi=%3B&dot=.&comma=%2C', + '&dot=.&semi=%3B&comma=%2C', + '&comma=%2C&semi=%3B&dot=.', + '&semi=%3B&comma=%2C&dot=.', + '&dot=.&comma=%2C&semi=%3B', + '&comma=%2C&dot=.&semi=%3B' + ] + } + end +end +describe "Modifiers" do + subject { + { + :var => "value", + :semi => ";", + :year => %w(1965 2000 2012), + :dom => %w(example com) + } + } + context "length" do + it_behaves_like 'expands', { + '{var:3}' => 'val', + '{var:30}' => 'value', + '{var}' => 'value', + '{semi}' => '%3B', + '{semi:2}' => '%3B' + } + end + context "explode" do + it_behaves_like 'expands', { + 'find{?year*}' => 'find?year=1965&year=2000&year=2012', + 'www{.dom*}' => 'www.example.com', + } + end +end +describe "Expansion" do + subject { + { + :count => ["one", "two", "three"], + :dom => ["example", "com"], + :dub => "me/too", + :hello => "Hello World!", + :half => "50%", + :var => "value", + :who => "fred", + :base => "http://example.com/home/", + :path => "/foo/bar", + :list => ["red", "green", "blue"], + :keys => {"semi" => ";","dot" => ".","comma" => ","}, + :v => "6", + :x => "1024", + :y => "768", + :empty => "", + :empty_keys => {}, + :undef => nil + } + } + context "concatenation" do + it_behaves_like 'expands', { + '{count}' => 'one,two,three', + '{count*}' => 'one,two,three', + '{/count}' => '/one,two,three', + '{/count*}' => '/one/two/three', + '{;count}' => ';count=one,two,three', + '{;count*}' => ';count=one;count=two;count=three', + '{?count}' => '?count=one,two,three', + '{?count*}' => '?count=one&count=two&count=three', + '{&count*}' => '&count=one&count=two&count=three' + } + end + context "simple expansion" do + it_behaves_like 'expands', { + '{var}' => 'value', + '{hello}' => 'Hello%20World%21', + '{half}' => '50%25', + 'O{empty}X' => 'OX', + 'O{undef}X' => 'OX', + '{x,y}' => '1024,768', + '{x,hello,y}' => '1024,Hello%20World%21,768', + '?{x,empty}' => '?1024,', + '?{x,undef}' => '?1024', + '?{undef,y}' => '?768', + '{var:3}' => 'val', + '{var:30}' => 'value', + '{list}' => 'red,green,blue', + '{list*}' => 'red,green,blue', + '{keys}' => [ + 'semi,%3B,dot,.,comma,%2C', + 'dot,.,semi,%3B,comma,%2C', + 'comma,%2C,semi,%3B,dot,.', + 'semi,%3B,comma,%2C,dot,.', + 'dot,.,comma,%2C,semi,%3B', + 'comma,%2C,dot,.,semi,%3B' + ], + '{keys*}' => [ + 'semi=%3B,dot=.,comma=%2C', + 'dot=.,semi=%3B,comma=%2C', + 'comma=%2C,semi=%3B,dot=.', + 'semi=%3B,comma=%2C,dot=.', + 'dot=.,comma=%2C,semi=%3B', + 'comma=%2C,dot=.,semi=%3B' + ] + } + end + context "reserved expansion (+)" do + it_behaves_like 'expands', { + '{+var}' => 'value', + '{+hello}' => 'Hello%20World!', + '{+half}' => '50%25', + '{base}index' => 'http%3A%2F%2Fexample.com%2Fhome%2Findex', + '{+base}index' => 'http://example.com/home/index', + 'O{+empty}X' => 'OX', + 'O{+undef}X' => 'OX', + '{+path}/here' => '/foo/bar/here', + 'here?ref={+path}' => 'here?ref=/foo/bar', + 'up{+path}{var}/here' => 'up/foo/barvalue/here', + '{+x,hello,y}' => '1024,Hello%20World!,768', + '{+path,x}/here' => '/foo/bar,1024/here', + '{+path:6}/here' => '/foo/b/here', + '{+list}' => 'red,green,blue', + '{+list*}' => 'red,green,blue', + '{+keys}' => [ + 'semi,;,dot,.,comma,,', + 'dot,.,semi,;,comma,,', + 'comma,,,semi,;,dot,.', + 'semi,;,comma,,,dot,.', + 'dot,.,comma,,,semi,;', + 'comma,,,dot,.,semi,;' + ], + '{+keys*}' => [ + 'semi=;,dot=.,comma=,', + 'dot=.,semi=;,comma=,', + 'comma=,,semi=;,dot=.', + 'semi=;,comma=,,dot=.', + 'dot=.,comma=,,semi=;', + 'comma=,,dot=.,semi=;' + ] + } + end + context "fragment expansion (#)" do + it_behaves_like 'expands', { + '{#var}' => '#value', + '{#hello}' => '#Hello%20World!', + '{#half}' => '#50%25', + 'foo{#empty}' => 'foo#', + 'foo{#undef}' => 'foo', + '{#x,hello,y}' => '#1024,Hello%20World!,768', + '{#path,x}/here' => '#/foo/bar,1024/here', + '{#path:6}/here' => '#/foo/b/here', + '{#list}' => '#red,green,blue', + '{#list*}' => '#red,green,blue', + '{#keys}' => [ + '#semi,;,dot,.,comma,,', + '#dot,.,semi,;,comma,,', + '#comma,,,semi,;,dot,.', + '#semi,;,comma,,,dot,.', + '#dot,.,comma,,,semi,;', + '#comma,,,dot,.,semi,;' + ], + '{#keys*}' => [ + '#semi=;,dot=.,comma=,', + '#dot=.,semi=;,comma=,', + '#comma=,,semi=;,dot=.', + '#semi=;,comma=,,dot=.', + '#dot=.,comma=,,semi=;', + '#comma=,,dot=.,semi=;' + ] + } + end + context "label expansion (.)" do + it_behaves_like 'expands', { + '{.who}' => '.fred', + '{.who,who}' => '.fred.fred', + '{.half,who}' => '.50%25.fred', + 'www{.dom*}' => 'www.example.com', + 'X{.var}' => 'X.value', + 'X{.empty}' => 'X.', + 'X{.undef}' => 'X', + 'X{.var:3}' => 'X.val', + 'X{.list}' => 'X.red,green,blue', + 'X{.list*}' => 'X.red.green.blue', + 'X{.keys}' => [ + 'X.semi,%3B,dot,.,comma,%2C', + 'X.dot,.,semi,%3B,comma,%2C', + 'X.comma,%2C,semi,%3B,dot,.', + 'X.semi,%3B,comma,%2C,dot,.', + 'X.dot,.,comma,%2C,semi,%3B', + 'X.comma,%2C,dot,.,semi,%3B' + ], + 'X{.keys*}' => [ + 'X.semi=%3B.dot=..comma=%2C', + 'X.dot=..semi=%3B.comma=%2C', + 'X.comma=%2C.semi=%3B.dot=.', + 'X.semi=%3B.comma=%2C.dot=.', + 'X.dot=..comma=%2C.semi=%3B', + 'X.comma=%2C.dot=..semi=%3B' + ], + 'X{.empty_keys}' => 'X', + 'X{.empty_keys*}' => 'X' + } + end + context "path expansion (/)" do + it_behaves_like 'expands', { + '{/who}' => '/fred', + '{/who,who}' => '/fred/fred', + '{/half,who}' => '/50%25/fred', + '{/who,dub}' => '/fred/me%2Ftoo', + '{/var}' => '/value', + '{/var,empty}' => '/value/', + '{/var,undef}' => '/value', + '{/var,x}/here' => '/value/1024/here', + '{/var:1,var}' => '/v/value', + '{/list}' => '/red,green,blue', + '{/list*}' => '/red/green/blue', + '{/list*,path:4}' => '/red/green/blue/%2Ffoo', + '{/keys}' => [ + '/semi,%3B,dot,.,comma,%2C', + '/dot,.,semi,%3B,comma,%2C', + '/comma,%2C,semi,%3B,dot,.', + '/semi,%3B,comma,%2C,dot,.', + '/dot,.,comma,%2C,semi,%3B', + '/comma,%2C,dot,.,semi,%3B' + ], + '{/keys*}' => [ + '/semi=%3B/dot=./comma=%2C', + '/dot=./semi=%3B/comma=%2C', + '/comma=%2C/semi=%3B/dot=.', + '/semi=%3B/comma=%2C/dot=.', + '/dot=./comma=%2C/semi=%3B', + '/comma=%2C/dot=./semi=%3B' + ] + } + end + context "path-style expansion (;)" do + it_behaves_like 'expands', { + '{;who}' => ';who=fred', + '{;half}' => ';half=50%25', + '{;empty}' => ';empty', + '{;v,empty,who}' => ';v=6;empty;who=fred', + '{;v,bar,who}' => ';v=6;who=fred', + '{;x,y}' => ';x=1024;y=768', + '{;x,y,empty}' => ';x=1024;y=768;empty', + '{;x,y,undef}' => ';x=1024;y=768', + '{;hello:5}' => ';hello=Hello', + '{;list}' => ';list=red,green,blue', + '{;list*}' => ';list=red;list=green;list=blue', + '{;keys}' => [ + ';keys=semi,%3B,dot,.,comma,%2C', + ';keys=dot,.,semi,%3B,comma,%2C', + ';keys=comma,%2C,semi,%3B,dot,.', + ';keys=semi,%3B,comma,%2C,dot,.', + ';keys=dot,.,comma,%2C,semi,%3B', + ';keys=comma,%2C,dot,.,semi,%3B' + ], + '{;keys*}' => [ + ';semi=%3B;dot=.;comma=%2C', + ';dot=.;semi=%3B;comma=%2C', + ';comma=%2C;semi=%3B;dot=.', + ';semi=%3B;comma=%2C;dot=.', + ';dot=.;comma=%2C;semi=%3B', + ';comma=%2C;dot=.;semi=%3B' + ] + } + end + context "form query expansion (?)" do + it_behaves_like 'expands', { + '{?who}' => '?who=fred', + '{?half}' => '?half=50%25', + '{?x,y}' => '?x=1024&y=768', + '{?x,y,empty}' => '?x=1024&y=768&empty=', + '{?x,y,undef}' => '?x=1024&y=768', + '{?var:3}' => '?var=val', + '{?list}' => '?list=red,green,blue', + '{?list*}' => '?list=red&list=green&list=blue', + '{?keys}' => [ + '?keys=semi,%3B,dot,.,comma,%2C', + '?keys=dot,.,semi,%3B,comma,%2C', + '?keys=comma,%2C,semi,%3B,dot,.', + '?keys=semi,%3B,comma,%2C,dot,.', + '?keys=dot,.,comma,%2C,semi,%3B', + '?keys=comma,%2C,dot,.,semi,%3B' + ], + '{?keys*}' => [ + '?semi=%3B&dot=.&comma=%2C', + '?dot=.&semi=%3B&comma=%2C', + '?comma=%2C&semi=%3B&dot=.', + '?semi=%3B&comma=%2C&dot=.', + '?dot=.&comma=%2C&semi=%3B', + '?comma=%2C&dot=.&semi=%3B' + ] + } + end + context "form query expansion (&)" do + it_behaves_like 'expands', { + '{&who}' => '&who=fred', + '{&half}' => '&half=50%25', + '?fixed=yes{&x}' => '?fixed=yes&x=1024', + '{&x,y,empty}' => '&x=1024&y=768&empty=', + '{&x,y,undef}' => '&x=1024&y=768', + '{&var:3}' => '&var=val', + '{&list}' => '&list=red,green,blue', + '{&list*}' => '&list=red&list=green&list=blue', + '{&keys}' => [ + '&keys=semi,%3B,dot,.,comma,%2C', + '&keys=dot,.,semi,%3B,comma,%2C', + '&keys=comma,%2C,semi,%3B,dot,.', + '&keys=semi,%3B,comma,%2C,dot,.', + '&keys=dot,.,comma,%2C,semi,%3B', + '&keys=comma,%2C,dot,.,semi,%3B' + ], + '{&keys*}' => [ + '&semi=%3B&dot=.&comma=%2C', + '&dot=.&semi=%3B&comma=%2C', + '&comma=%2C&semi=%3B&dot=.', + '&semi=%3B&comma=%2C&dot=.', + '&dot=.&comma=%2C&semi=%3B', + '&comma=%2C&dot=.&semi=%3B' + ] + } + end + context "non-string key in match data" do + subject {Addressable::Template.new("http://example.com/{one}")} + + it "raises TypeError" do + expect { subject.expand(Object.new => "1") }.to raise_error TypeError + end + end +end + +class ExampleTwoProcessor + def self.restore(name, value) + return value.gsub(/-/, " ") if name == "query" + return value + end + + def self.match(name) + return ".*?" if name == "first" + return ".*" + end + def self.validate(name, value) + return !!(value =~ /^[\w ]+$/) if name == "query" + return true + end + + def self.transform(name, value) + return value.gsub(/ /, "+") if name == "query" + return value + end +end + +class DumbProcessor + def self.match(name) + return ".*?" if name == "first" + end +end + +describe Addressable::Template do + describe 'initialize' do + context 'with a non-string' do + it 'raises a TypeError' do + expect { Addressable::Template.new(nil) }.to raise_error(TypeError) + end + end + end + + describe 'freeze' do + subject { Addressable::Template.new("http://example.com/{first}/{+second}/") } + it 'freezes the template' do + expect(subject.freeze).to be_frozen + end + end + + describe "Matching" do + let(:uri){ + Addressable::URI.parse( + "http://example.com/search/an-example-search-query/" + ) + } + let(:uri2){ + Addressable::URI.parse("http://example.com/a/b/c/") + } + let(:uri3){ + Addressable::URI.parse("http://example.com/;a=1;b=2;c=3;first=foo") + } + let(:uri4){ + Addressable::URI.parse("http://example.com/?a=1&b=2&c=3&first=foo") + } + let(:uri5){ + "http://example.com/foo" + } + context "first uri with ExampleTwoProcessor" do + subject { + Addressable::Template.new( + "http://example.com/search/{query}/" + ).match(uri, ExampleTwoProcessor) + } + its(:variables){ should == ["query"] } + its(:captures){ should == ["an example search query"] } + end + + context "second uri with ExampleTwoProcessor" do + subject { + Addressable::Template.new( + "http://example.com/{first}/{+second}/" + ).match(uri2, ExampleTwoProcessor) + } + its(:variables){ should == ["first", "second"] } + its(:captures){ should == ["a", "b/c"] } + end + + context "second uri with DumbProcessor" do + subject { + Addressable::Template.new( + "http://example.com/{first}/{+second}/" + ).match(uri2, DumbProcessor) + } + its(:variables){ should == ["first", "second"] } + its(:captures){ should == ["a", "b/c"] } + end + + context "second uri" do + subject { + Addressable::Template.new( + "http://example.com/{first}{/second*}/" + ).match(uri2) + } + its(:variables){ should == ["first", "second"] } + its(:captures){ should == ["a", ["b","c"]] } + end + context "third uri" do + subject { + Addressable::Template.new( + "http://example.com/{;hash*,first}" + ).match(uri3) + } + its(:variables){ should == ["hash", "first"] } + its(:captures){ should == [ + {"a" => "1", "b" => "2", "c" => "3", "first" => "foo"}, nil] } + end + # Note that this expansion is impossible to revert deterministically - the + # * operator means first could have been a key of hash or a separate key. + # Semantically, a separate key is more likely, but both are possible. + context "fourth uri" do + subject { + Addressable::Template.new( + "http://example.com/{?hash*,first}" + ).match(uri4) + } + its(:variables){ should == ["hash", "first"] } + its(:captures){ should == [ + {"a" => "1", "b" => "2", "c" => "3", "first"=> "foo"}, nil] } + end + context "fifth uri" do + subject { + Addressable::Template.new( + "http://example.com/{path}{?hash*,first}" + ).match(uri5) + } + its(:variables){ should == ["path", "hash", "first"] } + its(:captures){ should == ["foo", nil, nil] } + end + end + + describe 'match' do + subject { Addressable::Template.new('http://example.com/first/second/') } + context 'when the URI is the same as the template' do + it 'returns the match data itself with an empty mapping' do + uri = Addressable::URI.parse('http://example.com/first/second/') + match_data = subject.match(uri) + expect(match_data).to be_an Addressable::Template::MatchData + expect(match_data.uri).to eq(uri) + expect(match_data.template).to eq(subject) + expect(match_data.mapping).to be_empty + expect(match_data.inspect).to be_an String + end + end + end + + describe "extract" do + let(:template) { + Addressable::Template.new( + "http://{host}{/segments*}/{?one,two,bogus}{#fragment}" + ) + } + let(:uri){ "http://example.com/a/b/c/?one=1&two=2#foo" } + let(:uri2){ "http://example.com/a/b/c/#foo" } + it "should be able to extract with queries" do + expect(template.extract(uri)).to eq({ + "host" => "example.com", + "segments" => %w(a b c), + "one" => "1", + "bogus" => nil, + "two" => "2", + "fragment" => "foo" + }) + end + it "should be able to extract without queries" do + expect(template.extract(uri2)).to eq({ + "host" => "example.com", + "segments" => %w(a b c), + "one" => nil, + "bogus" => nil, + "two" => nil, + "fragment" => "foo" + }) + end + + context "issue #137" do + subject { Addressable::Template.new('/path{?page,per_page}') } + + it "can match empty" do + data = subject.extract("/path") + expect(data["page"]).to eq(nil) + expect(data["per_page"]).to eq(nil) + expect(data.keys.sort).to eq(['page', 'per_page']) + end + + it "can match first var" do + data = subject.extract("/path?page=1") + expect(data["page"]).to eq("1") + expect(data["per_page"]).to eq(nil) + expect(data.keys.sort).to eq(['page', 'per_page']) + end + + it "can match second var" do + data = subject.extract("/path?per_page=1") + expect(data["page"]).to eq(nil) + expect(data["per_page"]).to eq("1") + expect(data.keys.sort).to eq(['page', 'per_page']) + end + + it "can match both vars" do + data = subject.extract("/path?page=2&per_page=1") + expect(data["page"]).to eq("2") + expect(data["per_page"]).to eq("1") + expect(data.keys.sort).to eq(['page', 'per_page']) + end + end + end + + describe "Partial expand with symbols" do + context "partial_expand with two simple values" do + subject { + Addressable::Template.new("http://example.com/{one}/{two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1").pattern).to eq( + "http://example.com/1/{two}/" + ) + end + end + context "partial_expand query with missing param in middle" do + subject { + Addressable::Template.new("http://example.com/{?one,two,three}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1", :three => "3").pattern).to eq( + "http://example.com/?one=1{&two}&three=3/" + ) + end + end + context "partial_expand form style query with missing param at beginning" do + subject { + Addressable::Template.new("http://example.com/{?one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:two => "2").pattern).to eq( + "http://example.com/?two=2{&one}/" + ) + end + end + context "issue #307 - partial_expand form query with nil params" do + subject do + Addressable::Template.new("http://example.com/{?one,two,three}/") + end + it "builds a new pattern with two=nil" do + expect(subject.partial_expand(two: nil).pattern).to eq( + "http://example.com/{?one}{&three}/" + ) + end + it "builds a new pattern with one=nil and two=nil" do + expect(subject.partial_expand(one: nil, two: nil).pattern).to eq( + "http://example.com/{?three}/" + ) + end + it "builds a new pattern with one=1 and two=nil" do + expect(subject.partial_expand(one: 1, two: nil).pattern).to eq( + "http://example.com/?one=1{&three}/" + ) + end + it "builds a new pattern with one=nil and two=2" do + expect(subject.partial_expand(one: nil, two: 2).pattern).to eq( + "http://example.com/?two=2{&three}/" + ) + end + it "builds a new pattern with one=nil" do + expect(subject.partial_expand(one: nil).pattern).to eq( + "http://example.com/{?two}{&three}/" + ) + end + end + context "partial_expand with query string" do + subject { + Addressable::Template.new("http://example.com/{?two,one}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1").pattern).to eq( + "http://example.com/?one=1{&two}/" + ) + end + end + context "partial_expand with path operator" do + subject { + Addressable::Template.new("http://example.com{/one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand(:one => "1").pattern).to eq( + "http://example.com/1{/two}/" + ) + end + end + context "partial expand with unicode values" do + subject do + Addressable::Template.new("http://example.com/{resource}/{query}/") + end + it "normalizes unicode by default" do + template = subject.partial_expand("query" => "Cafe\u0301") + expect(template.pattern).to eq( + "http://example.com/{resource}/Caf%C3%A9/" + ) + end + + it "does not normalize unicode when byte semantics requested" do + template = subject.partial_expand({"query" => "Cafe\u0301"}, nil, false) + expect(template.pattern).to eq( + "http://example.com/{resource}/Cafe%CC%81/" + ) + end + end + end + describe "Partial expand with strings" do + context "partial_expand with two simple values" do + subject { + Addressable::Template.new("http://example.com/{one}/{two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/1/{two}/" + ) + end + end + context "partial_expand query with missing param in middle" do + subject { + Addressable::Template.new("http://example.com/{?one,two,three}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( + "http://example.com/?one=1{&two}&three=3/" + ) + end + end + context "partial_expand with query string" do + subject { + Addressable::Template.new("http://example.com/{?two,one}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/?one=1{&two}/" + ) + end + end + context "partial_expand with path operator" do + subject { + Addressable::Template.new("http://example.com{/one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/1{/two}/" + ) + end + end + end + describe "Expand" do + context "expand with unicode values" do + subject do + Addressable::Template.new("http://example.com/search/{query}/") + end + it "normalizes unicode by default" do + uri = subject.expand("query" => "Cafe\u0301").to_str + expect(uri).to eq("http://example.com/search/Caf%C3%A9/") + end + + it "does not normalize unicode when byte semantics requested" do + uri = subject.expand({ "query" => "Cafe\u0301" }, nil, false).to_str + expect(uri).to eq("http://example.com/search/Cafe%CC%81/") + end + end + context "expand with a processor" do + subject { + Addressable::Template.new("http://example.com/search/{query}/") + } + it "processes spaces" do + expect(subject.expand({"query" => "an example search query"}, + ExampleTwoProcessor).to_str).to eq( + "http://example.com/search/an+example+search+query/" + ) + end + it "validates" do + expect{ + subject.expand({"query" => "Bogus!"}, + ExampleTwoProcessor).to_str + }.to raise_error(Addressable::Template::InvalidTemplateValueError) + end + end + context "partial_expand query with missing param in middle" do + subject { + Addressable::Template.new("http://example.com/{?one,two,three}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq( + "http://example.com/?one=1{&two}&three=3/" + ) + end + end + context "partial_expand with query string" do + subject { + Addressable::Template.new("http://example.com/{?two,one}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/?one=1{&two}/" + ) + end + end + context "partial_expand with path operator" do + subject { + Addressable::Template.new("http://example.com{/one,two}/") + } + it "builds a new pattern" do + expect(subject.partial_expand("one" => "1").pattern).to eq( + "http://example.com/1{/two}/" + ) + end + end + end + context "Matching with operators" do + describe "Level 1:" do + subject { Addressable::Template.new("foo{foo}/{bar}baz") } + it "can match" do + data = subject.match("foofoo/bananabaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("banana") + end + it "can fail" do + expect(subject.match("bar/foo")).to be_nil + expect(subject.match("foobaz")).to be_nil + end + it "can match empty" do + data = subject.match("foo/baz") + expect(data.mapping["foo"]).to eq(nil) + expect(data.mapping["bar"]).to eq(nil) + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + + describe "Level 2:" do + subject { Addressable::Template.new("foo{+foo}{#bar}baz") } + it "can match" do + data = subject.match("foo/test/banana#bazbaz") + expect(data.mapping["foo"]).to eq("/test/banana") + expect(data.mapping["bar"]).to eq("baz") + end + it "can match empty level 2 #" do + data = subject.match("foo/test/bananabaz") + expect(data.mapping["foo"]).to eq("/test/banana") + expect(data.mapping["bar"]).to eq(nil) + data = subject.match("foo/test/banana#baz") + expect(data.mapping["foo"]).to eq("/test/banana") + expect(data.mapping["bar"]).to eq("") + end + it "can match empty level 2 +" do + data = subject.match("foobaz") + expect(data.mapping["foo"]).to eq(nil) + expect(data.mapping["bar"]).to eq(nil) + data = subject.match("foo#barbaz") + expect(data.mapping["foo"]).to eq(nil) + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + + describe "Level 3:" do + context "no operator" do + subject { Addressable::Template.new("foo{foo,bar}baz") } + it "can match" do + data = subject.match("foofoo,barbaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context "+ operator" do + subject { Addressable::Template.new("foo{+foo,bar}baz") } + it "can match" do + data = subject.match("foofoo/bar,barbaz") + expect(data.mapping["bar"]).to eq("foo/bar,bar") + expect(data.mapping["foo"]).to eq("") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context ". operator" do + subject { Addressable::Template.new("foo{.foo,bar}baz") } + it "can match" do + data = subject.match("foo.foo.barbaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context "/ operator" do + subject { Addressable::Template.new("foo{/foo,bar}baz") } + it "can match" do + data = subject.match("foo/foo/barbaz") + expect(data.mapping["foo"]).to eq("foo") + expect(data.mapping["bar"]).to eq("bar") + end + it "lists vars" do + expect(subject.variables).to eq(["foo", "bar"]) + end + end + context "; operator" do + subject { Addressable::Template.new("foo{;foo,bar,baz}baz") } + it "can match" do + data = subject.match("foo;foo=bar%20baz;bar=foo;bazbaz") + expect(data.mapping["foo"]).to eq("bar baz") + expect(data.mapping["bar"]).to eq("foo") + expect(data.mapping["baz"]).to eq("") + end + it "lists vars" do + expect(subject.variables).to eq(%w(foo bar baz)) + end + end + context "? operator" do + context "test" do + subject { Addressable::Template.new("foo{?foo,bar}baz") } + it "can match" do + data = subject.match("foo?foo=bar%20baz&bar=foobaz") + expect(data.mapping["foo"]).to eq("bar baz") + expect(data.mapping["bar"]).to eq("foo") + end + it "lists vars" do + expect(subject.variables).to eq(%w(foo bar)) + end + end + + context "issue #137" do + subject { Addressable::Template.new('/path{?page,per_page}') } + + it "can match empty" do + data = subject.match("/path") + expect(data.mapping["page"]).to eq(nil) + expect(data.mapping["per_page"]).to eq(nil) + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + + it "can match first var" do + data = subject.match("/path?page=1") + expect(data.mapping["page"]).to eq("1") + expect(data.mapping["per_page"]).to eq(nil) + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + + it "can match second var" do + data = subject.match("/path?per_page=1") + expect(data.mapping["page"]).to eq(nil) + expect(data.mapping["per_page"]).to eq("1") + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + + it "can match both vars" do + data = subject.match("/path?page=2&per_page=1") + expect(data.mapping["page"]).to eq("2") + expect(data.mapping["per_page"]).to eq("1") + expect(data.mapping.keys.sort).to eq(['page', 'per_page']) + end + end + + context "issue #71" do + subject { Addressable::Template.new("http://cyberscore.dev/api/users{?username}") } + it "can match" do + data = subject.match("http://cyberscore.dev/api/users?username=foobaz") + expect(data.mapping["username"]).to eq("foobaz") + end + it "lists vars" do + expect(subject.variables).to eq(%w(username)) + expect(subject.keys).to eq(%w(username)) + end + end + end + context "& operator" do + subject { Addressable::Template.new("foo{&foo,bar}baz") } + it "can match" do + data = subject.match("foo&foo=bar%20baz&bar=foobaz") + expect(data.mapping["foo"]).to eq("bar baz") + expect(data.mapping["bar"]).to eq("foo") + end + it "lists vars" do + expect(subject.variables).to eq(%w(foo bar)) + end + end + end + end + + context "support regexes:" do + context "EXPRESSION" do + subject { Addressable::Template::EXPRESSION } + it "should be able to match an expression" do + expect(subject).to match("{foo}") + expect(subject).to match("{foo,9}") + expect(subject).to match("{foo.bar,baz}") + expect(subject).to match("{+foo.bar,baz}") + expect(subject).to match("{foo,foo%20bar}") + expect(subject).to match("{#foo:20,baz*}") + expect(subject).to match("stuff{#foo:20,baz*}things") + end + it "should fail on non vars" do + expect(subject).not_to match("!{foo") + expect(subject).not_to match("{foo.bar.}") + expect(subject).not_to match("!{}") + end + end + context "VARNAME" do + subject { Addressable::Template::VARNAME } + it "should be able to match a variable" do + expect(subject).to match("foo") + expect(subject).to match("9") + expect(subject).to match("foo.bar") + expect(subject).to match("foo_bar") + expect(subject).to match("foo_bar.baz") + expect(subject).to match("foo%20bar") + expect(subject).to match("foo%20bar.baz") + end + it "should fail on non vars" do + expect(subject).not_to match("!foo") + expect(subject).not_to match("foo.bar.") + expect(subject).not_to match("foo%2%00bar") + expect(subject).not_to match("foo_ba%r") + expect(subject).not_to match("foo_bar*") + expect(subject).not_to match("foo_bar:20") + end + + it 'should parse in a reasonable time' do + expect do + Timeout.timeout(0.1) do + expect(subject).not_to match("0"*25 + "!") + end + end.not_to raise_error + end + end + context "VARIABLE_LIST" do + subject { Addressable::Template::VARIABLE_LIST } + it "should be able to match a variable list" do + expect(subject).to match("foo,bar") + expect(subject).to match("foo") + expect(subject).to match("foo,bar*,baz") + expect(subject).to match("foo.bar,bar_baz*,baz:12") + end + it "should fail on non vars" do + expect(subject).not_to match(",foo,bar*,baz") + expect(subject).not_to match("foo,*bar,baz") + expect(subject).not_to match("foo,,bar*,baz") + end + end + context "VARSPEC" do + subject { Addressable::Template::VARSPEC } + it "should be able to match a variable with modifier" do + expect(subject).to match("9:8") + expect(subject).to match("foo.bar*") + expect(subject).to match("foo_bar:12") + expect(subject).to match("foo_bar.baz*") + expect(subject).to match("foo%20bar:12") + expect(subject).to match("foo%20bar.baz*") + end + it "should fail on non vars" do + expect(subject).not_to match("!foo") + expect(subject).not_to match("*foo") + expect(subject).not_to match("fo*o") + expect(subject).not_to match("fo:o") + expect(subject).not_to match("foo:") + end + end + end +end + +describe Addressable::Template::MatchData do + let(:template) { Addressable::Template.new('{foo}/{bar}') } + subject(:its) { template.match('ab/cd') } + its(:uri) { should == Addressable::URI.parse('ab/cd') } + its(:template) { should == template } + its(:mapping) { should == { 'foo' => 'ab', 'bar' => 'cd' } } + its(:variables) { should == ['foo', 'bar'] } + its(:keys) { should == ['foo', 'bar'] } + its(:names) { should == ['foo', 'bar'] } + its(:values) { should == ['ab', 'cd'] } + its(:captures) { should == ['ab', 'cd'] } + its(:to_a) { should == ['ab/cd', 'ab', 'cd'] } + its(:to_s) { should == 'ab/cd' } + its(:string) { should == its.to_s } + its(:pre_match) { should == "" } + its(:post_match) { should == "" } + + describe 'values_at' do + it 'returns an array with the values' do + expect(its.values_at(0, 2)).to eq(['ab/cd', 'cd']) + end + it 'allows mixing integer an string keys' do + expect(its.values_at('foo', 1)).to eq(['ab', 'ab']) + end + it 'accepts unknown keys' do + expect(its.values_at('baz', 'foo')).to eq([nil, 'ab']) + end + end + + describe '[]' do + context 'string key' do + it 'returns the corresponding capture' do + expect(its['foo']).to eq('ab') + expect(its['bar']).to eq('cd') + end + it 'returns nil for unknown keys' do + expect(its['baz']).to be_nil + end + end + context 'symbol key' do + it 'returns the corresponding capture' do + expect(its[:foo]).to eq('ab') + expect(its[:bar]).to eq('cd') + end + it 'returns nil for unknown keys' do + expect(its[:baz]).to be_nil + end + end + context 'integer key' do + it 'returns the full URI for index 0' do + expect(its[0]).to eq('ab/cd') + end + it 'returns the corresponding capture' do + expect(its[1]).to eq('ab') + expect(its[2]).to eq('cd') + end + it 'returns nil for unknown keys' do + expect(its[3]).to be_nil + end + end + context 'other key' do + it 'raises an exception' do + expect { its[Object.new] }.to raise_error(TypeError) + end + end + context 'with length' do + it 'returns an array starting at index with given length' do + expect(its[0, 2]).to eq(['ab/cd', 'ab']) + expect(its[2, 1]).to eq(['cd']) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/uri_spec.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/uri_spec.rb new file mode 100644 index 000000000000..00baaacf9ffd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/addressable/uri_spec.rb @@ -0,0 +1,6665 @@ +# frozen_string_literal: true + +# coding: utf-8 +# Copyright (C) Bob Aman +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +require "spec_helper" + +require "addressable/uri" +require "uri" +require "ipaddr" + +if !"".respond_to?("force_encoding") + class String + def force_encoding(encoding) + @encoding = encoding + end + + def encoding + @encoding ||= Encoding::ASCII_8BIT + end + end + + class Encoding + def initialize(name) + @name = name + end + + def to_s + return @name + end + + UTF_8 = Encoding.new("UTF-8") + ASCII_8BIT = Encoding.new("US-ASCII") + end +end + +module Fake + module URI + class HTTP + def initialize(uri) + @uri = uri + end + + def to_s + return @uri.to_s + end + + alias :to_str :to_s + end + end +end + +describe Addressable::URI, "when created with a non-numeric port number" do + it "should raise an error" do + expect do + Addressable::URI.new(:port => "bogus") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a invalid encoded port number" do + it "should raise an error" do + expect do + Addressable::URI.new(:port => "%eb") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a non-string scheme" do + it "should raise an error" do + expect do + Addressable::URI.new(:scheme => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string user" do + it "should raise an error" do + expect do + Addressable::URI.new(:user => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string password" do + it "should raise an error" do + expect do + Addressable::URI.new(:password => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string userinfo" do + it "should raise an error" do + expect do + Addressable::URI.new(:userinfo => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string host" do + it "should raise an error" do + expect do + Addressable::URI.new(:host => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string authority" do + it "should raise an error" do + expect do + Addressable::URI.new(:authority => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string path" do + it "should raise an error" do + expect do + Addressable::URI.new(:path => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string query" do + it "should raise an error" do + expect do + Addressable::URI.new(:query => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a non-string fragment" do + it "should raise an error" do + expect do + Addressable::URI.new(:fragment => :bogus) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when created with a scheme but no hierarchical " + + "segment" do + it "should raise an error" do + expect do + Addressable::URI.parse("http:") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "quote handling" do + describe 'in host name' do + it "should raise an error for single quote" do + expect do + Addressable::URI.parse("http://local\"host/") + end.to raise_error(Addressable::URI::InvalidURIError) + end + end +end + +describe Addressable::URI, "newline normalization" do + it "should not accept newlines in scheme" do + expect do + Addressable::URI.parse("ht%0atp://localhost/") + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not unescape newline in path" do + uri = Addressable::URI.parse("http://localhost/%0a").normalize + expect(uri.to_s).to eq("http://localhost/%0A") + end + + it "should not unescape newline in hostname" do + uri = Addressable::URI.parse("http://local%0ahost/").normalize + expect(uri.to_s).to eq("http://local%0Ahost/") + end + + it "should not unescape newline in username" do + uri = Addressable::URI.parse("http://foo%0abar@localhost/").normalize + expect(uri.to_s).to eq("http://foo%0Abar@localhost/") + end + + it "should not unescape newline in username" do + uri = Addressable::URI.parse("http://example:foo%0abar@example/").normalize + expect(uri.to_s).to eq("http://example:foo%0Abar@example/") + end + + it "should not accept newline in hostname" do + uri = Addressable::URI.parse("http://localhost/") + expect do + uri.host = "local\nhost" + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with ambiguous path" do + it "should raise an error" do + expect do + Addressable::URI.parse("::http") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with an invalid host" do + it "should raise an error" do + expect do + Addressable::URI.new(:host => "") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a host consisting of " + + "sub-delims characters" do + it "should not raise an error" do + expect do + Addressable::URI.new( + :host => Addressable::URI::CharacterClasses::SUB_DELIMS.gsub(/\\/, '') + ) + end.not_to raise_error + end +end + +describe Addressable::URI, "when created with a host consisting of " + + "unreserved characters" do + it "should not raise an error" do + expect do + Addressable::URI.new( + :host => Addressable::URI::CharacterClasses::UNRESERVED.gsub(/\\/, '') + ) + end.not_to raise_error + end +end + +describe Addressable::URI, "when created from nil components" do + before do + @uri = Addressable::URI.new + end + + it "should have a nil site value" do + expect(@uri.site).to eq(nil) + end + + it "should have an empty path" do + expect(@uri.path).to eq("") + end + + it "should be an empty uri" do + expect(@uri.to_s).to eq("") + end + + it "should have a nil default port" do + expect(@uri.default_port).to eq(nil) + end + + it "should be empty" do + expect(@uri).to be_empty + end + + it "should raise an error if the scheme is set to whitespace" do + expect do + @uri.scheme = "\t \n" + end.to raise_error(Addressable::URI::InvalidURIError, /'\t \n'/) + end + + it "should raise an error if the scheme is set to all digits" do + expect do + @uri.scheme = "123" + end.to raise_error(Addressable::URI::InvalidURIError, /'123'/) + end + + it "should raise an error if the scheme begins with a digit" do + expect do + @uri.scheme = "1scheme" + end.to raise_error(Addressable::URI::InvalidURIError, /'1scheme'/) + end + + it "should raise an error if the scheme begins with a plus" do + expect do + @uri.scheme = "+scheme" + end.to raise_error(Addressable::URI::InvalidURIError, /'\+scheme'/) + end + + it "should raise an error if the scheme begins with a dot" do + expect do + @uri.scheme = ".scheme" + end.to raise_error(Addressable::URI::InvalidURIError, /'\.scheme'/) + end + + it "should raise an error if the scheme begins with a dash" do + expect do + @uri.scheme = "-scheme" + end.to raise_error(Addressable::URI::InvalidURIError, /'-scheme'/) + end + + it "should raise an error if the scheme contains an illegal character" do + expect do + @uri.scheme = "scheme!" + end.to raise_error(Addressable::URI::InvalidURIError, /'scheme!'/) + end + + it "should raise an error if the scheme contains whitespace" do + expect do + @uri.scheme = "sch eme" + end.to raise_error(Addressable::URI::InvalidURIError, /'sch eme'/) + end + + it "should raise an error if the scheme contains a newline" do + expect do + @uri.scheme = "sch\neme" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect do + @uri.user = "user" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect do + @uri.password = "pass" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect do + @uri.scheme = "http" + @uri.fragment = "fragment" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should raise an error if set into an invalid state" do + expect do + @uri.fragment = "fragment" + @uri.scheme = "http" + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when initialized from individual components" do + before do + @uri = Addressable::URI.new( + :scheme => "http", + :user => "user", + :password => "password", + :host => "example.com", + :port => 8080, + :path => "/path", + :query => "query=value", + :fragment => "fragment" + ) + end + + it "returns 'http' for #scheme" do + expect(@uri.scheme).to eq("http") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + end + + it "returns 'user' for #user" do + expect(@uri.user).to eq("user") + end + + it "returns 'user' for #normalized_user" do + expect(@uri.normalized_user).to eq("user") + end + + it "returns 'password' for #password" do + expect(@uri.password).to eq("password") + end + + it "returns 'password' for #normalized_password" do + expect(@uri.normalized_password).to eq("password") + end + + it "returns 'user:password' for #userinfo" do + expect(@uri.userinfo).to eq("user:password") + end + + it "returns 'user:password' for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq("user:password") + end + + it "returns 'example.com' for #host" do + expect(@uri.host).to eq("example.com") + end + + it "returns 'example.com' for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + end + + it "returns 'com' for #tld" do + expect(@uri.tld).to eq("com") + end + + it "returns 'user:password@example.com:8080' for #authority" do + expect(@uri.authority).to eq("user:password@example.com:8080") + end + + it "returns 'user:password@example.com:8080' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("user:password@example.com:8080") + end + + it "returns 8080 for #port" do + expect(@uri.port).to eq(8080) + end + + it "returns 8080 for #normalized_port" do + expect(@uri.normalized_port).to eq(8080) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'http://user:password@example.com:8080' for #site" do + expect(@uri.site).to eq("http://user:password@example.com:8080") + end + + it "returns 'http://user:password@example.com:8080' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") + end + + it "returns '/path' for #path" do + expect(@uri.path).to eq("/path") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + end + + it "returns 'query=value' for #query" do + expect(@uri.query).to eq("query=value") + end + + it "returns 'query=value' for #normalized_query" do + expect(@uri.normalized_query).to eq("query=value") + end + + it "returns 'fragment' for #fragment" do + expect(@uri.fragment).to eq("fragment") + end + + it "returns 'fragment' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("fragment") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq( + "http://user:password@example.com:8080/path?query=value#fragment" + ) + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should not be frozen" do + expect(@uri).not_to be_frozen + end + + it "should allow destructive operations" do + expect { @uri.normalize! }.not_to raise_error + end +end + +describe Addressable::URI, "when initialized from " + + "frozen individual components" do + before do + @uri = Addressable::URI.new( + :scheme => "http".freeze, + :user => "user".freeze, + :password => "password".freeze, + :host => "example.com".freeze, + :port => "8080".freeze, + :path => "/path".freeze, + :query => "query=value".freeze, + :fragment => "fragment".freeze + ) + end + + it "returns 'http' for #scheme" do + expect(@uri.scheme).to eq("http") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + end + + it "returns 'user' for #user" do + expect(@uri.user).to eq("user") + end + + it "returns 'user' for #normalized_user" do + expect(@uri.normalized_user).to eq("user") + end + + it "returns 'password' for #password" do + expect(@uri.password).to eq("password") + end + + it "returns 'password' for #normalized_password" do + expect(@uri.normalized_password).to eq("password") + end + + it "returns 'user:password' for #userinfo" do + expect(@uri.userinfo).to eq("user:password") + end + + it "returns 'user:password' for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq("user:password") + end + + it "returns 'example.com' for #host" do + expect(@uri.host).to eq("example.com") + end + + it "returns 'example.com' for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + end + + it "returns 'user:password@example.com:8080' for #authority" do + expect(@uri.authority).to eq("user:password@example.com:8080") + end + + it "returns 'user:password@example.com:8080' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("user:password@example.com:8080") + end + + it "returns 8080 for #port" do + expect(@uri.port).to eq(8080) + end + + it "returns 8080 for #normalized_port" do + expect(@uri.normalized_port).to eq(8080) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'http://user:password@example.com:8080' for #site" do + expect(@uri.site).to eq("http://user:password@example.com:8080") + end + + it "returns 'http://user:password@example.com:8080' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") + end + + it "returns '/path' for #path" do + expect(@uri.path).to eq("/path") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + end + + it "returns 'query=value' for #query" do + expect(@uri.query).to eq("query=value") + end + + it "returns 'query=value' for #normalized_query" do + expect(@uri.normalized_query).to eq("query=value") + end + + it "returns 'fragment' for #fragment" do + expect(@uri.fragment).to eq("fragment") + end + + it "returns 'fragment' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("fragment") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq( + "http://user:password@example.com:8080/path?query=value#fragment" + ) + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should not be frozen" do + expect(@uri).not_to be_frozen + end + + it "should allow destructive operations" do + expect { @uri.normalize! }.not_to raise_error + end +end + +describe Addressable::URI, "when parsed from a frozen string" do + before do + @uri = Addressable::URI.parse( + "http://user:password@example.com:8080/path?query=value#fragment".freeze + ) + end + + it "returns 'http' for #scheme" do + expect(@uri.scheme).to eq("http") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + end + + it "returns 'user' for #user" do + expect(@uri.user).to eq("user") + end + + it "returns 'user' for #normalized_user" do + expect(@uri.normalized_user).to eq("user") + end + + it "returns 'password' for #password" do + expect(@uri.password).to eq("password") + end + + it "returns 'password' for #normalized_password" do + expect(@uri.normalized_password).to eq("password") + end + + it "returns 'user:password' for #userinfo" do + expect(@uri.userinfo).to eq("user:password") + end + + it "returns 'user:password' for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq("user:password") + end + + it "returns 'example.com' for #host" do + expect(@uri.host).to eq("example.com") + end + + it "returns 'example.com' for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + end + + it "returns 'user:password@example.com:8080' for #authority" do + expect(@uri.authority).to eq("user:password@example.com:8080") + end + + it "returns 'user:password@example.com:8080' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("user:password@example.com:8080") + end + + it "returns 8080 for #port" do + expect(@uri.port).to eq(8080) + end + + it "returns 8080 for #normalized_port" do + expect(@uri.normalized_port).to eq(8080) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'http://user:password@example.com:8080' for #site" do + expect(@uri.site).to eq("http://user:password@example.com:8080") + end + + it "returns 'http://user:password@example.com:8080' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://user:password@example.com:8080") + end + + it "returns '/path' for #path" do + expect(@uri.path).to eq("/path") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + end + + it "returns 'query=value' for #query" do + expect(@uri.query).to eq("query=value") + end + + it "returns 'query=value' for #normalized_query" do + expect(@uri.normalized_query).to eq("query=value") + end + + it "returns 'fragment' for #fragment" do + expect(@uri.fragment).to eq("fragment") + end + + it "returns 'fragment' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("fragment") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq( + "http://user:password@example.com:8080/path?query=value#fragment" + ) + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should not be frozen" do + expect(@uri).not_to be_frozen + end + + it "should allow destructive operations" do + expect { @uri.normalize! }.not_to raise_error + end +end + +describe Addressable::URI, "when frozen" do + before do + @uri = Addressable::URI.new.freeze + end + + it "returns nil for #scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "returns nil for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq(nil) + end + + it "returns nil for #user" do + expect(@uri.user).to eq(nil) + end + + it "returns nil for #normalized_user" do + expect(@uri.normalized_user).to eq(nil) + end + + it "returns nil for #password" do + expect(@uri.password).to eq(nil) + end + + it "returns nil for #normalized_password" do + expect(@uri.normalized_password).to eq(nil) + end + + it "returns nil for #userinfo" do + expect(@uri.userinfo).to eq(nil) + end + + it "returns nil for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq(nil) + end + + it "returns nil for #host" do + expect(@uri.host).to eq(nil) + end + + it "returns nil for #normalized_host" do + expect(@uri.normalized_host).to eq(nil) + end + + it "returns nil for #authority" do + expect(@uri.authority).to eq(nil) + end + + it "returns nil for #normalized_authority" do + expect(@uri.normalized_authority).to eq(nil) + end + + it "returns nil for #port" do + expect(@uri.port).to eq(nil) + end + + it "returns nil for #normalized_port" do + expect(@uri.normalized_port).to eq(nil) + end + + it "returns nil for #default_port" do + expect(@uri.default_port).to eq(nil) + end + + it "returns nil for #site" do + expect(@uri.site).to eq(nil) + end + + it "returns nil for #normalized_site" do + expect(@uri.normalized_site).to eq(nil) + end + + it "returns '' for #path" do + expect(@uri.path).to eq('') + end + + it "returns '' for #normalized_path" do + expect(@uri.normalized_path).to eq('') + end + + it "returns nil for #query" do + expect(@uri.query).to eq(nil) + end + + it "returns nil for #normalized_query" do + expect(@uri.normalized_query).to eq(nil) + end + + it "returns nil for #fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "returns nil for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq(nil) + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq('') + end + + it "should be empty" do + expect(@uri).to be_empty + end + + it "should be frozen" do + expect(@uri).to be_frozen + end + + it "should not be frozen after duping" do + expect(@uri.dup).not_to be_frozen + end + + it "should not allow destructive operations" do + expect { @uri.normalize! }.to raise_error { |error| + expect(error.message).to match(/can't modify frozen/) + expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } + } + end +end + +describe Addressable::URI, "when frozen" do + before do + @uri = Addressable::URI.parse( + "HTTP://example.com.:%38%30/%70a%74%68?a=%31#1%323" + ).freeze + end + + it "returns 'HTTP' for #scheme" do + expect(@uri.scheme).to eq("HTTP") + end + + it "returns 'http' for #normalized_scheme" do + expect(@uri.normalized_scheme).to eq("http") + expect(@uri.normalize.scheme).to eq("http") + end + + it "returns nil for #user" do + expect(@uri.user).to eq(nil) + end + + it "returns nil for #normalized_user" do + expect(@uri.normalized_user).to eq(nil) + end + + it "returns nil for #password" do + expect(@uri.password).to eq(nil) + end + + it "returns nil for #normalized_password" do + expect(@uri.normalized_password).to eq(nil) + end + + it "returns nil for #userinfo" do + expect(@uri.userinfo).to eq(nil) + end + + it "returns nil for #normalized_userinfo" do + expect(@uri.normalized_userinfo).to eq(nil) + end + + it "returns 'example.com.' for #host" do + expect(@uri.host).to eq("example.com.") + end + + it "returns nil for #normalized_host" do + expect(@uri.normalized_host).to eq("example.com") + expect(@uri.normalize.host).to eq("example.com") + end + + it "returns 'example.com.:80' for #authority" do + expect(@uri.authority).to eq("example.com.:80") + end + + it "returns 'example.com:80' for #normalized_authority" do + expect(@uri.normalized_authority).to eq("example.com") + expect(@uri.normalize.authority).to eq("example.com") + end + + it "returns 80 for #port" do + expect(@uri.port).to eq(80) + end + + it "returns nil for #normalized_port" do + expect(@uri.normalized_port).to eq(nil) + expect(@uri.normalize.port).to eq(nil) + end + + it "returns 80 for #default_port" do + expect(@uri.default_port).to eq(80) + end + + it "returns 'HTTP://example.com.:80' for #site" do + expect(@uri.site).to eq("HTTP://example.com.:80") + end + + it "returns 'http://example.com' for #normalized_site" do + expect(@uri.normalized_site).to eq("http://example.com") + expect(@uri.normalize.site).to eq("http://example.com") + end + + it "returns '/%70a%74%68' for #path" do + expect(@uri.path).to eq("/%70a%74%68") + end + + it "returns '/path' for #normalized_path" do + expect(@uri.normalized_path).to eq("/path") + expect(@uri.normalize.path).to eq("/path") + end + + it "returns 'a=%31' for #query" do + expect(@uri.query).to eq("a=%31") + end + + it "returns 'a=1' for #normalized_query" do + expect(@uri.normalized_query).to eq("a=1") + expect(@uri.normalize.query).to eq("a=1") + end + + it "returns '/%70a%74%68?a=%31' for #request_uri" do + expect(@uri.request_uri).to eq("/%70a%74%68?a=%31") + end + + it "returns '1%323' for #fragment" do + expect(@uri.fragment).to eq("1%323") + end + + it "returns '123' for #normalized_fragment" do + expect(@uri.normalized_fragment).to eq("123") + expect(@uri.normalize.fragment).to eq("123") + end + + it "returns #hash" do + expect(@uri.hash).not_to be nil + end + + it "returns #to_s" do + expect(@uri.to_s).to eq('HTTP://example.com.:80/%70a%74%68?a=%31#1%323') + expect(@uri.normalize.to_s).to eq('http://example.com/path?a=1#123') + end + + it "should not be empty" do + expect(@uri).not_to be_empty + end + + it "should be frozen" do + expect(@uri).to be_frozen + end + + it "should not be frozen after duping" do + expect(@uri.dup).not_to be_frozen + end + + it "should not allow destructive operations" do + expect { @uri.normalize! }.to raise_error { |error| + expect(error.message).to match(/can't modify frozen/) + expect(error).to satisfy { |e| RuntimeError === e || TypeError === e } + } + end +end + +describe Addressable::URI, "when created from string components" do + before do + @uri = Addressable::URI.new( + :scheme => "http", :host => "example.com" + ) + end + + it "should have a site value of 'http://example.com'" do + expect(@uri.site).to eq("http://example.com") + end + + it "should be equal to the equivalent parsed URI" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should raise an error if invalid components omitted" do + expect do + @uri.omit(:bogus) + end.to raise_error(ArgumentError) + expect do + @uri.omit(:scheme, :bogus, :path) + end.to raise_error(ArgumentError) + end +end + +describe Addressable::URI, "when created with a nil host but " + + "non-nil authority components" do + it "should raise an error" do + expect do + Addressable::URI.new(:user => "user", :password => "pass", :port => 80) + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with both an authority and a user" do + it "should raise an error" do + expect do + Addressable::URI.new( + :user => "user", :authority => "user@example.com:80" + ) + end.to raise_error(ArgumentError) + end +end + +describe Addressable::URI, "when created with an authority and no port" do + before do + @uri = Addressable::URI.new(:authority => "user@example.com") + end + + it "should not infer a port" do + expect(@uri.port).to eq(nil) + expect(@uri.default_port).to eq(nil) + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a site value of '//user@example.com'" do + expect(@uri.site).to eq("//user@example.com") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when created with a host with trailing dots" do + before do + @uri = Addressable::URI.new(:authority => "example...") + end + + it "should have a stable normalized form" do + expect(@uri.normalize.normalize.normalize.host).to eq( + @uri.normalize.host + ) + end +end + +describe Addressable::URI, "when created with a host with a backslash" do + it "should raise an error" do + expect do + Addressable::URI.new(:authority => "example\\example") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a host with a slash" do + it "should raise an error" do + expect do + Addressable::URI.new(:authority => "example/example") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with a host with a space" do + it "should raise an error" do + expect do + Addressable::URI.new(:authority => "example example") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when created with both a userinfo and a user" do + it "should raise an error" do + expect do + Addressable::URI.new(:user => "user", :userinfo => "user:pass") + end.to raise_error(ArgumentError) + end +end + +describe Addressable::URI, "when created with a path that hasn't been " + + "prefixed with a '/' but a host specified" do + before do + @uri = Addressable::URI.new( + :scheme => "http", :host => "example.com", :path => "path" + ) + end + + it "should prefix a '/' to the path" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/path")) + end + + it "should have a site value of 'http://example.com'" do + expect(@uri.site).to eq("http://example.com") + end + + it "should have an origin of 'http://example.com" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when created with a path that hasn't been " + + "prefixed with a '/' but no host specified" do + before do + @uri = Addressable::URI.new( + :scheme => "http", :path => "path" + ) + end + + it "should not prefix a '/' to the path" do + expect(@uri).to eq(Addressable::URI.parse("http:path")) + end + + it "should have a site value of 'http:'" do + expect(@uri.site).to eq("http:") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from an Addressable::URI object" do + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.parse(original_uri) + new_uri.host = 'www.example.com' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('http://www.example.com/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end + + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.heuristic_parse(original_uri) + new_uri.host = 'www.example.com' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('http://www.example.com/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end + + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.parse(original_uri) + new_uri.origin = 'https://www.example.com:8080' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('https://www.example.com:8080/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end + + it "should not have unexpected side-effects" do + original_uri = Addressable::URI.parse("http://example.com/") + new_uri = Addressable::URI.heuristic_parse(original_uri) + new_uri.origin = 'https://www.example.com:8080' + expect(new_uri.host).to eq('www.example.com') + expect(new_uri.to_s).to eq('https://www.example.com:8080/') + expect(original_uri.host).to eq('example.com') + expect(original_uri.to_s).to eq('http://example.com/') + end +end + +describe Addressable::URI, "when parsed from something that looks " + + "like a URI object" do + it "should parse without error" do + uri = Addressable::URI.parse(Fake::URI::HTTP.new("http://example.com/")) + expect do + Addressable::URI.parse(uri) + end.not_to raise_error + end +end + +describe Addressable::URI, "when parsed from a standard library URI object" do + it "should parse without error" do + uri = Addressable::URI.parse(URI.parse("http://example.com/")) + expect do + Addressable::URI.parse(uri) + end.not_to raise_error + end +end + +describe Addressable::URI, "when parsed from ''" do + before do + @uri = Addressable::URI.parse("") + end + + it "should have no scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of ''" do + expect(@uri.path).to eq("") + end + + it "should have a request URI of '/'" do + expect(@uri.request_uri).to eq("/") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'ftp://ftp.is.co.za/rfc/rfc1808.txt'" do + before do + @uri = Addressable::URI.parse("ftp://ftp.is.co.za/rfc/rfc1808.txt") + end + + it "should use the 'ftp' scheme" do + expect(@uri.scheme).to eq("ftp") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a host of 'ftp.is.co.za'" do + expect(@uri.host).to eq("ftp.is.co.za") + end + + it "should have inferred_port of 21" do + expect(@uri.inferred_port).to eq(21) + end + + it "should have a path of '/rfc/rfc1808.txt'" do + expect(@uri.path).to eq("/rfc/rfc1808.txt") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have an origin of 'ftp://ftp.is.co.za'" do + expect(@uri.origin).to eq('ftp://ftp.is.co.za') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'http://www.ietf.org/rfc/rfc2396.txt'" do + before do + @uri = Addressable::URI.parse("http://www.ietf.org/rfc/rfc2396.txt") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a host of 'www.ietf.org'" do + expect(@uri.host).to eq("www.ietf.org") + end + + it "should have inferred_port of 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/rfc/rfc2396.txt'" do + expect(@uri.path).to eq("/rfc/rfc2396.txt") + end + + it "should have a request URI of '/rfc/rfc2396.txt'" do + expect(@uri.request_uri).to eq("/rfc/rfc2396.txt") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should correctly omit components" do + expect(@uri.omit(:scheme).to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") + expect(@uri.omit(:path).to_s).to eq("http://www.ietf.org") + end + + it "should correctly omit components destructively" do + @uri.omit!(:scheme) + expect(@uri.to_s).to eq("//www.ietf.org/rfc/rfc2396.txt") + end + + it "should have an origin of 'http://www.ietf.org'" do + expect(@uri.origin).to eq('http://www.ietf.org') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'ldap://[2001:db8::7]/c=GB?objectClass?one'" do + before do + @uri = Addressable::URI.parse("ldap://[2001:db8::7]/c=GB?objectClass?one") + end + + it "should use the 'ldap' scheme" do + expect(@uri.scheme).to eq("ldap") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a host of '[2001:db8::7]'" do + expect(@uri.host).to eq("[2001:db8::7]") + end + + it "should have inferred_port of 389" do + expect(@uri.inferred_port).to eq(389) + end + + it "should have a path of '/c=GB'" do + expect(@uri.path).to eq("/c=GB") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should not allow request URI assignment" do + expect do + @uri.request_uri = "/" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should have a query of 'objectClass?one'" do + expect(@uri.query).to eq("objectClass?one") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should correctly omit components" do + expect(@uri.omit(:scheme, :authority).to_s).to eq("/c=GB?objectClass?one") + expect(@uri.omit(:path).to_s).to eq("ldap://[2001:db8::7]?objectClass?one") + end + + it "should correctly omit components destructively" do + @uri.omit!(:scheme, :authority) + expect(@uri.to_s).to eq("/c=GB?objectClass?one") + end + + it "should raise an error if omission would create an invalid URI" do + expect do + @uri.omit(:authority, :path) + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should have an origin of 'ldap://[2001:db8::7]'" do + expect(@uri.origin).to eq('ldap://[2001:db8::7]') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'mailto:John.Doe@example.com'" do + before do + @uri = Addressable::URI.parse("mailto:John.Doe@example.com") + end + + it "should use the 'mailto' scheme" do + expect(@uri.scheme).to eq("mailto") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a path of 'John.Doe@example.com'" do + expect(@uri.path).to eq("John.Doe@example.com") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 2 of RFC 6068 +describe Addressable::URI, "when parsed from " + + "'mailto:?to=addr1@an.example,addr2@an.example'" do + before do + @uri = Addressable::URI.parse( + "mailto:?to=addr1@an.example,addr2@an.example" + ) + end + + it "should use the 'mailto' scheme" do + expect(@uri.scheme).to eq("mailto") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a path of ''" do + expect(@uri.path).to eq("") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should have the To: field value parameterized" do + expect(@uri.query_values(Hash)["to"]).to eq( + "addr1@an.example,addr2@an.example" + ) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'news:comp.infosystems.www.servers.unix'" do + before do + @uri = Addressable::URI.parse("news:comp.infosystems.www.servers.unix") + end + + it "should use the 'news' scheme" do + expect(@uri.scheme).to eq("news") + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of 'comp.infosystems.www.servers.unix'" do + expect(@uri.path).to eq("comp.infosystems.www.servers.unix") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'tel:+1-816-555-1212'" do + before do + @uri = Addressable::URI.parse("tel:+1-816-555-1212") + end + + it "should use the 'tel' scheme" do + expect(@uri.scheme).to eq("tel") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should have a path of '+1-816-555-1212'" do + expect(@uri.path).to eq("+1-816-555-1212") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'telnet://192.0.2.16:80/'" do + before do + @uri = Addressable::URI.parse("telnet://192.0.2.16:80/") + end + + it "should use the 'telnet' scheme" do + expect(@uri.scheme).to eq("telnet") + end + + it "should have a host of '192.0.2.16'" do + expect(@uri.host).to eq("192.0.2.16") + end + + it "should have a port of 80" do + expect(@uri.port).to eq(80) + end + + it "should have a inferred_port of 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a default_port of 23" do + expect(@uri.default_port).to eq(23) + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have an origin of 'telnet://192.0.2.16:80'" do + expect(@uri.origin).to eq('telnet://192.0.2.16:80') + end +end + +# Section 1.1.2 of RFC 3986 +describe Addressable::URI, "when parsed from " + + "'urn:oasis:names:specification:docbook:dtd:xml:4.1.2'" do + before do + @uri = Addressable::URI.parse( + "urn:oasis:names:specification:docbook:dtd:xml:4.1.2") + end + + it "should use the 'urn' scheme" do + expect(@uri.scheme).to eq("urn") + end + + it "should not have an inferred_port" do + expect(@uri.inferred_port).to eq(nil) + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of " + + "'oasis:names:specification:docbook:dtd:xml:4.1.2'" do + expect(@uri.path).to eq("oasis:names:specification:docbook:dtd:xml:4.1.2") + end + + it "should not have a request URI" do + expect(@uri.request_uri).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when heuristically parsed from " + + "'192.0.2.16:8000/path'" do + before do + @uri = Addressable::URI.heuristic_parse("192.0.2.16:8000/path") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a host of '192.0.2.16'" do + expect(@uri.host).to eq("192.0.2.16") + end + + it "should have a port of '8000'" do + expect(@uri.port).to eq(8000) + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a path of '/path'" do + expect(@uri.path).to eq("/path") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have an origin of 'http://192.0.2.16:8000'" do + expect(@uri.origin).to eq('http://192.0.2.16:8000') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com'" do + before do + @uri = Addressable::URI.parse("http://example.com") + end + + it "when inspected, should have the correct URI" do + expect(@uri.inspect).to include("http://example.com") + end + + it "when inspected, should have the correct class name" do + expect(@uri.inspect).to include("Addressable::URI") + end + + it "when inspected, should have the correct object id" do + expect(@uri.inspect).to include("%#0x" % @uri.object_id) + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should be considered ip-based" do + expect(@uri).to be_ip_based + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not have a specified port" do + expect(@uri.port).to eq(nil) + end + + it "should have an empty path" do + expect(@uri.path).to eq("") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + expect(@uri.query_values).to eq(nil) + end + + it "should have a request URI of '/'" do + expect(@uri.request_uri).to eq("/") + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should not be exactly equal to 42" do + expect(@uri.eql?(42)).to eq(false) + end + + it "should not be equal to 42" do + expect(@uri == 42).to eq(false) + end + + it "should not be roughly equal to 42" do + expect(@uri === 42).to eq(false) + end + + it "should be exactly equal to http://example.com" do + expect(@uri.eql?(Addressable::URI.parse("http://example.com"))).to eq(true) + end + + it "should be roughly equal to http://example.com/" do + expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) + end + + it "should be roughly equal to the string 'http://example.com/'" do + expect(@uri === "http://example.com/").to eq(true) + end + + it "should not be roughly equal to the string " + + "'http://example.com:bogus/'" do + expect do + expect(@uri === "http://example.com:bogus/").to eq(false) + end.not_to raise_error + end + + it "should result in itself when joined with itself" do + expect(@uri.join(@uri).to_s).to eq("http://example.com") + expect(@uri.join!(@uri).to_s).to eq("http://example.com") + end + + it "should be equivalent to http://EXAMPLE.com" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) + end + + it "should be equivalent to http://EXAMPLE.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) + end + + it "should have the same hash as http://example.com" do + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) + end + + it "should have the same hash as http://EXAMPLE.com after assignment" do + @uri.origin = "http://EXAMPLE.com" + expect(@uri.hash).to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) + end + + it "should have a different hash from http://EXAMPLE.com" do + expect(@uri.hash).not_to eq(Addressable::URI.parse("http://EXAMPLE.com").hash) + end + + it "should not allow origin assignment without scheme" do + expect do + @uri.origin = "example.com" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow origin assignment without host" do + expect do + @uri.origin = "http://" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow origin assignment with bogus type" do + expect do + @uri.origin = :bogus + end.to raise_error(TypeError) + end + + # Section 6.2.3 of RFC 3986 + it "should be equivalent to http://example.com/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equivalent to http://example.com:/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equivalent to http://example.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) + end + + # Section 6.2.2.1 of RFC 3986 + it "should be equivalent to http://EXAMPLE.COM/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) + end + + it "should have a route of '/path/' to 'http://example.com/path/'" do + expect(@uri.route_to("http://example.com/path/")).to eq( + Addressable::URI.parse("/path/") + ) + end + + it "should have a route of '..' from 'http://example.com/path/'" do + expect(@uri.route_from("http://example.com/path/")).to eq( + Addressable::URI.parse("..") + ) + end + + it "should have a route of '#' to 'http://example.com/'" do + expect(@uri.route_to("http://example.com/")).to eq( + Addressable::URI.parse("#") + ) + end + + it "should have a route of 'http://elsewhere.com/' to " + + "'http://elsewhere.com/'" do + expect(@uri.route_to("http://elsewhere.com/")).to eq( + Addressable::URI.parse("http://elsewhere.com/") + ) + end + + it "when joined with 'relative/path' should be " + + "'http://example.com/relative/path'" do + expect(@uri.join('relative/path')).to eq( + Addressable::URI.parse("http://example.com/relative/path") + ) + end + + it "when joined with a bogus object a TypeError should be raised" do + expect do + @uri.join(42) + end.to raise_error(TypeError) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://newuser@example.com") + end + + it "should have the correct username after assignment" do + @uri.user = "user@123!" + expect(@uri.user).to eq("user@123!") + expect(@uri.normalized_user).to eq("user%40123%21") + expect(@uri.password).to eq(nil) + expect(@uri.normalize.to_s).to eq("http://user%40123%21@example.com/") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "#secret@123!" + expect(@uri.password).to eq("#secret@123!") + expect(@uri.normalized_password).to eq("%23secret%40123%21") + expect(@uri.user).to eq("") + expect(@uri.normalize.to_s).to eq("http://:%23secret%40123%21@example.com/") + expect(@uri.omit(:password).to_s).to eq("http://example.com") + end + + it "should have the correct user/pass after repeated assignment" do + @uri.user = nil + expect(@uri.user).to eq(nil) + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + # Username cannot be nil if the password is set + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + @uri.password = nil + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://newuser@example.com") + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + @uri.password = "" + expect(@uri.password).to eq("") + expect(@uri.to_s).to eq("http://newuser:@example.com") + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + @uri.user = nil + # Username cannot be nil if the password is set + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct user/pass after userinfo assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + @uri.userinfo = nil + expect(@uri.userinfo).to eq(nil) + expect(@uri.user).to eq(nil) + expect(@uri.password).to eq(nil) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +# Section 5.1.2 of RFC 2616 +describe Addressable::URI, "when parsed from " + + "'HTTP://www.w3.org/pub/WWW/TheProject.html'" do + before do + @uri = Addressable::URI.parse("HTTP://www.w3.org/pub/WWW/TheProject.html") + end + + it "should have the correct request URI" do + expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html") + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "/pub/WWW/TheProject.html?" + expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html?") + expect(@uri.path).to eq("/pub/WWW/TheProject.html") + expect(@uri.query).to eq("") + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "/some/where/else.html" + expect(@uri.request_uri).to eq("/some/where/else.html") + expect(@uri.path).to eq("/some/where/else.html") + expect(@uri.query).to eq(nil) + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "/some/where/else.html?query?string" + expect(@uri.request_uri).to eq("/some/where/else.html?query?string") + expect(@uri.path).to eq("/some/where/else.html") + expect(@uri.query).to eq("query?string") + end + + it "should have the correct request URI after assignment" do + @uri.request_uri = "?x=y" + expect(@uri.request_uri).to eq("/?x=y") + expect(@uri.path).to eq("/") + expect(@uri.query).to eq("x=y") + end + + it "should raise an error if the site value is set to something bogus" do + expect do + @uri.site = 42 + end.to raise_error(TypeError) + end + + it "should raise an error if the request URI is set to something bogus" do + expect do + @uri.request_uri = 42 + end.to raise_error(TypeError) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "HTTP", + :user => nil, + :password => nil, + :host => "www.w3.org", + :port => nil, + :path => "/pub/WWW/TheProject.html", + :query => nil, + :fragment => nil + }) + end + + it "should have an origin of 'http://www.w3.org'" do + expect(@uri.origin).to eq('http://www.w3.org') + end +end + +describe Addressable::URI, "when parsing IPv6 addresses" do + it "should not raise an error for " + + "'http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[fe80:0:0:0:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[fe80:0:0:0:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[fe80::200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[fe80::200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[::1]/'" do + Addressable::URI.parse("http://[::1]/") + end + + it "should not raise an error for " + + "'http://[fe80::1]/'" do + Addressable::URI.parse("http://[fe80::1]/") + end + + it "should raise an error for " + + "'http://[]/'" do + expect do + Addressable::URI.parse("http://[]/") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsing IPv6 address" do + subject { Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") } + its(:host) { should == '[3ffe:1900:4545:3:200:f8ff:fe21:67cf]' } + its(:hostname) { should == '3ffe:1900:4545:3:200:f8ff:fe21:67cf' } +end + +describe Addressable::URI, "when assigning IPv6 address" do + it "should allow to set bare IPv6 address as hostname" do + uri = Addressable::URI.parse("http://[::1]/") + uri.hostname = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' + expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') + end + + it "should allow to set bare IPv6 address as hostname with IPAddr object" do + uri = Addressable::URI.parse("http://[::1]/") + uri.hostname = IPAddr.new('3ffe:1900:4545:3:200:f8ff:fe21:67cf') + expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/') + end + + it "should not allow to set bare IPv6 address as host" do + uri = Addressable::URI.parse("http://[::1]/") + skip "not checked" + expect do + uri.host = '3ffe:1900:4545:3:200:f8ff:fe21:67cf' + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsing IPvFuture addresses" do + it "should not raise an error for " + + "'http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[v12.fe80::200:f8ff:fe21:67cf]/'" do + Addressable::URI.parse("http://[v12.fe80::200:f8ff:fe21:67cf]/") + end + + it "should not raise an error for " + + "'http://[va0.::1]/'" do + Addressable::URI.parse("http://[va0.::1]/") + end + + it "should not raise an error for " + + "'http://[v255.fe80::1]/'" do + Addressable::URI.parse("http://[v255.fe80::1]/") + end + + it "should raise an error for " + + "'http://[v0.]/'" do + expect do + Addressable::URI.parse("http://[v0.]/") + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/'" do + before do + @uri = Addressable::URI.parse("http://example.com/") + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to HTTP://example.com/" do + expect(@uri).to eq(Addressable::URI.parse("HTTP://example.com/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com:/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://Example.com/" do + expect(@uri).to eq(Addressable::URI.parse("http://Example.com/")) + end + + it "should have the correct username after assignment" do + @uri.user = nil + expect(@uri.user).to eq(nil) + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should have the correct password after assignment" do + @uri.password = nil + expect(@uri.password).to eq(nil) + expect(@uri.user).to eq(nil) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should have a request URI of '/'" do + expect(@uri.request_uri).to eq("/") + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have the same hash as its duplicate" do + expect(@uri.hash).to eq(@uri.dup.hash) + end + + it "should have a different hash from its equivalent String value" do + expect(@uri.hash).not_to eq(@uri.to_s.hash) + end + + it "should have the same hash as an equal URI" do + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) + end + + it "should be equivalent to http://EXAMPLE.com" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com")) + end + + it "should be equivalent to http://EXAMPLE.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/")) + end + + it "should have the same hash as http://example.com/" do + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash) + end + + it "should have the same hash as http://example.com after assignment" do + @uri.path = "" + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash) + end + + it "should have the same hash as http://example.com/? after assignment" do + @uri.query = "" + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) + end + + it "should have the same hash as http://example.com/? after assignment" do + @uri.query_values = {} + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash) + end + + it "should have the same hash as http://example.com/# after assignment" do + @uri.fragment = "" + expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/#").hash) + end + + it "should have a different hash from http://example.com" do + expect(@uri.hash).not_to eq(Addressable::URI.parse("http://example.com").hash) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com?#'" do + before do + @uri = Addressable::URI.parse("http://example.com?#") + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "", + :query => "", + :fragment => "" + }) + end + + it "should have a request URI of '/?'" do + expect(@uri.request_uri).to eq("/?") + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq("http://example.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://@example.com/'" do + before do + @uri = Addressable::URI.parse("http://@example.com/") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => "", + :password => nil, + :host => "example.com", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com./'" do + before do + @uri = Addressable::URI.parse("http://example.com./") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://:@example.com/'" do + before do + @uri = Addressable::URI.parse("http://:@example.com/") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => "", + :password => "", + :host => "example.com", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'HTTP://EXAMPLE.COM/'" do + before do + @uri = Addressable::URI.parse("HTTP://EXAMPLE.COM/") + end + + it "should be equivalent to http://example.com" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "HTTP", + :user => nil, + :password => nil, + :host => "EXAMPLE.COM", + :port => nil, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end + + it "should have a tld of 'com'" do + expect(@uri.tld).to eq('com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.example.co.uk/'" do + before do + @uri = Addressable::URI.parse("http://www.example.co.uk/") + end + + it "should have an origin of 'http://www.example.co.uk'" do + expect(@uri.origin).to eq('http://www.example.co.uk') + end + + it "should have a tld of 'co.uk'" do + expect(@uri.tld).to eq('co.uk') + end + + it "should have a domain of 'example.co.uk'" do + expect(@uri.domain).to eq('example.co.uk') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://sub_domain.blogspot.com/'" do + before do + @uri = Addressable::URI.parse("http://sub_domain.blogspot.com/") + end + + it "should have an origin of 'http://sub_domain.blogspot.com'" do + expect(@uri.origin).to eq('http://sub_domain.blogspot.com') + end + + it "should have a tld of 'com'" do + expect(@uri.tld).to eq('com') + end + + it "should have a domain of 'blogspot.com'" do + expect(@uri.domain).to eq('blogspot.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/~smith/'" do + before do + @uri = Addressable::URI.parse("http://example.com/~smith/") + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com/%7Esmith/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7Esmith/")) + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to http://example.com/%7esmith/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7esmith/")) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/%E8'" do + before do + @uri = Addressable::URI.parse("http://example.com/%E8") + end + + it "should not raise an exception when normalized" do + expect do + @uri.normalize + end.not_to raise_error + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/%E8" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/%E8" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path%2Fsegment/'" do + before do + @uri = Addressable::URI.parse("http://example.com/path%2Fsegment/") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should be equal to 'http://example.com/path%2Fsegment/'" do + expect(@uri.normalize).to be_eql( + Addressable::URI.parse("http://example.com/path%2Fsegment/") + ) + end + + it "should not be equal to 'http://example.com/path/segment/'" do + expect(@uri).not_to eq( + Addressable::URI.parse("http://example.com/path/segment/") + ) + end + + it "should not be equal to 'http://example.com/path/segment/'" do + expect(@uri.normalize).not_to be_eql( + Addressable::URI.parse("http://example.com/path/segment/") + ) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?%F6'" do + before do + @uri = Addressable::URI.parse("http://example.com/?%F6") + end + + it "should not raise an exception when normalized" do + expect do + @uri.normalize + end.not_to raise_error + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/?%F6" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/?%F6" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/#%F6'" do + before do + @uri = Addressable::URI.parse("http://example.com/#%F6") + end + + it "should not raise an exception when normalized" do + expect do + @uri.normalize + end.not_to raise_error + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/#%F6" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/#%F6" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/%C3%87'" do + before do + @uri = Addressable::URI.parse("http://example.com/%C3%87") + end + + # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence + it "should be equivalent to 'http://example.com/C%CC%A7'" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/C%CC%A7")) + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com/%C3%87" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com/%C3%87" + end + + it "should raise an error if encoding with an unexpected return type" do + expect do + Addressable::URI.normalized_encode(@uri, Integer) + end.to raise_error(TypeError) + end + + it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do + expect(Addressable::URI.encode(@uri).to_s).to eq( + "http://example.com/%25C3%2587" + ) + end + + it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do + expect(Addressable::URI.encode(@uri, Addressable::URI)).to eq( + Addressable::URI.parse("http://example.com/%25C3%2587") + ) + end + + it "should raise an error if encoding with an unexpected return type" do + expect do + Addressable::URI.encode(@uri, Integer) + end.to raise_error(TypeError) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=string'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=string") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should have a query string of 'q=string'" do + expect(@uri.query).to eq("q=string") + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com:80/'" do + before do + @uri = Addressable::URI.parse("http://example.com:80/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com:80'" do + expect(@uri.authority).to eq("example.com:80") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have explicit port 80" do + expect(@uri.port).to eq(80) + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be exactly equal to http://example.com:80/" do + expect(@uri.eql?(Addressable::URI.parse("http://example.com:80/"))).to eq(true) + end + + it "should be roughly equal to http://example.com/" do + expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true) + end + + it "should be roughly equal to the string 'http://example.com/'" do + expect(@uri === "http://example.com/").to eq(true) + end + + it "should not be roughly equal to the string " + + "'http://example.com:bogus/'" do + expect do + expect(@uri === "http://example.com:bogus/").to eq(false) + end.not_to raise_error + end + + it "should result in itself when joined with itself" do + expect(@uri.join(@uri).to_s).to eq("http://example.com:80/") + expect(@uri.join!(@uri).to_s).to eq("http://example.com:80/") + end + + # Section 6.2.3 of RFC 3986 + it "should be equal to http://example.com/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equal to http://example.com:/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:/")) + end + + # Section 6.2.3 of RFC 3986 + it "should be equal to http://example.com:80/" do + expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/")) + end + + # Section 6.2.2.1 of RFC 3986 + it "should be equal to http://EXAMPLE.COM/" do + expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/")) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => 80, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com:80/" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com:80/" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com:8080/'" do + before do + @uri = Addressable::URI.parse("http://example.com:8080/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com:8080'" do + expect(@uri.authority).to eq("example.com:8080") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 8080" do + expect(@uri.inferred_port).to eq(8080) + end + + it "should have explicit port 8080" do + expect(@uri.port).to eq(8080) + end + + it "should have default port 80" do + expect(@uri.default_port).to eq(80) + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be exactly equal to http://example.com:8080/" do + expect(@uri.eql?(Addressable::URI.parse( + "http://example.com:8080/"))).to eq(true) + end + + it "should have a route of 'http://example.com:8080/' from " + + "'http://example.com/path/to/'" do + expect(@uri.route_from("http://example.com/path/to/")).to eq( + Addressable::URI.parse("http://example.com:8080/") + ) + end + + it "should have a route of 'http://example.com:8080/' from " + + "'http://example.com:80/path/to/'" do + expect(@uri.route_from("http://example.com:80/path/to/")).to eq( + Addressable::URI.parse("http://example.com:8080/") + ) + end + + it "should have a route of '../../' from " + + "'http://example.com:8080/path/to/'" do + expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( + Addressable::URI.parse("../../") + ) + end + + it "should have a route of 'http://example.com:8080/' from " + + "'http://user:pass@example.com/path/to/'" do + expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( + Addressable::URI.parse("http://example.com:8080/") + ) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => 8080, + :path => "/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com:8080'" do + expect(@uri.origin).to eq('http://example.com:8080') + end + + it "should not change if encoded with the normalizing algorithm" do + expect(Addressable::URI.normalized_encode(@uri).to_s).to eq( + "http://example.com:8080/" + ) + expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be === + "http://example.com:8080/" + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com:%38%30/'" do + before do + @uri = Addressable::URI.parse("http://example.com:%38%30/") + end + + it "should have the correct port" do + expect(@uri.port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/%2E/'" do + before do + @uri = Addressable::URI.parse("http://example.com/%2E/") + end + + it "should be considered to be in normal form" do + skip( + 'path segment normalization should happen before ' + + 'percent escaping normalization' + ) + @uri.normalize.should be_eql(@uri) + end + + it "should normalize to 'http://example.com/%2E/'" do + skip( + 'path segment normalization should happen before ' + + 'percent escaping normalization' + ) + expect(@uri.normalize).to eq("http://example.com/%2E/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/..'" do + before do + @uri = Addressable::URI.parse("http://example.com/..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/../..'" do + before do + @uri = Addressable::URI.parse("http://example.com/../..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path(/..'" do + before do + @uri = Addressable::URI.parse("http://example.com/path(/..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/(path)/..'" do + before do + @uri = Addressable::URI.parse("http://example.com/(path)/..") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path(/../'" do + before do + @uri = Addressable::URI.parse("http://example.com/path(/../") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/(path)/../'" do + before do + @uri = Addressable::URI.parse("http://example.com/(path)/../") + end + + it "should have the correct port" do + expect(@uri.inferred_port).to eq(80) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'/..//example.com'" do + before do + @uri = Addressable::URI.parse("/..//example.com") + end + + it "should become invalid when normalized" do + expect do + @uri.normalize + end.to raise_error(Addressable::URI::InvalidURIError, /authority/) + end + + it "should have a path of '/..//example.com'" do + expect(@uri.path).to eq("/..//example.com") + end +end + +describe Addressable::URI, "when parsed from '/a/b/c/./../../g'" do + before do + @uri = Addressable::URI.parse("/a/b/c/./../../g") + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + # Section 5.2.4 of RFC 3986 + it "should normalize to '/a/g'" do + expect(@uri.normalize.to_s).to eq("/a/g") + end +end + +describe Addressable::URI, "when parsed from 'mid/content=5/../6'" do + before do + @uri = Addressable::URI.parse("mid/content=5/../6") + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + # Section 5.2.4 of RFC 3986 + it "should normalize to 'mid/6'" do + expect(@uri.normalize.to_s).to eq("mid/6") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.example.com///../'" do + before do + @uri = Addressable::URI.parse('http://www.example.com///../') + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end + + it "should normalize to 'http://www.example.com//'" do + expect(@uri.normalize.to_s).to eq("http://www.example.com//") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/path/to/resource/'" do + before do + @uri = Addressable::URI.parse("http://example.com/path/to/resource/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/path/to/resource/'" do + expect(@uri.path).to eq("/path/to/resource/") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should not be considered relative" do + expect(@uri).not_to be_relative + end + + it "should be exactly equal to http://example.com:8080/" do + expect(@uri.eql?(Addressable::URI.parse( + "http://example.com/path/to/resource/"))).to eq(true) + end + + it "should have a route of 'resource/' from " + + "'http://example.com/path/to/'" do + expect(@uri.route_from("http://example.com/path/to/")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of '../' from " + + "'http://example.com/path/to/resource/sub'" do + expect(@uri.route_from("http://example.com/path/to/resource/sub")).to eq( + Addressable::URI.parse("../") + ) + end + + + it "should have a route of 'resource/' from " + + "'http://example.com/path/to/another'" do + expect(@uri.route_from("http://example.com/path/to/another")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of 'resource/' from " + + "'http://example.com/path/to/res'" do + expect(@uri.route_from("http://example.com/path/to/res")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of 'resource/' from " + + "'http://example.com:80/path/to/'" do + expect(@uri.route_from("http://example.com:80/path/to/")).to eq( + Addressable::URI.parse("resource/") + ) + end + + it "should have a route of 'http://example.com/path/to/' from " + + "'http://example.com:8080/path/to/'" do + expect(@uri.route_from("http://example.com:8080/path/to/")).to eq( + Addressable::URI.parse("http://example.com/path/to/resource/") + ) + end + + it "should have a route of 'http://example.com/path/to/' from " + + "'http://user:pass@example.com/path/to/'" do + expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq( + Addressable::URI.parse("http://example.com/path/to/resource/") + ) + end + + it "should have a route of '../../path/to/resource/' from " + + "'http://example.com/to/resource/'" do + expect(@uri.route_from("http://example.com/to/resource/")).to eq( + Addressable::URI.parse("../../path/to/resource/") + ) + end + + it "should correctly convert to a hash" do + expect(@uri.to_hash).to eq({ + :scheme => "http", + :user => nil, + :password => nil, + :host => "example.com", + :port => nil, + :path => "/path/to/resource/", + :query => nil, + :fragment => nil + }) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'relative/path/to/resource'" do + before do + @uri = Addressable::URI.parse("relative/path/to/resource") + end + + it "should not have a scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should not be considered ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an authority segment" do + expect(@uri.authority).to eq(nil) + end + + it "should not have a host" do + expect(@uri.host).to eq(nil) + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should not have a port" do + expect(@uri.port).to eq(nil) + end + + it "should have a path of 'relative/path/to/resource'" do + expect(@uri.path).to eq("relative/path/to/resource") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should not be considered absolute" do + expect(@uri).not_to be_absolute + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should raise an error if routing is attempted" do + expect do + @uri.route_to("http://example.com/") + end.to raise_error(ArgumentError, /relative\/path\/to\/resource/) + expect do + @uri.route_from("http://example.com/") + end.to raise_error(ArgumentError, /relative\/path\/to\/resource/) + end + + it "when joined with 'another/relative/path' should be " + + "'relative/path/to/another/relative/path'" do + expect(@uri.join('another/relative/path')).to eq( + Addressable::URI.parse("relative/path/to/another/relative/path") + ) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end +end + +describe Addressable::URI, "when parsed from " + + "'relative_path_with_no_slashes'" do + before do + @uri = Addressable::URI.parse("relative_path_with_no_slashes") + end + + it "should not have a scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should not be considered ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should not have an authority segment" do + expect(@uri.authority).to eq(nil) + end + + it "should not have a host" do + expect(@uri.host).to eq(nil) + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should not have a port" do + expect(@uri.port).to eq(nil) + end + + it "should have a path of 'relative_path_with_no_slashes'" do + expect(@uri.path).to eq("relative_path_with_no_slashes") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should not be considered absolute" do + expect(@uri).not_to be_absolute + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "when joined with 'another_relative_path' should be " + + "'another_relative_path'" do + expect(@uri.join('another_relative_path')).to eq( + Addressable::URI.parse("another_relative_path") + ) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/file.txt'" do + before do + @uri = Addressable::URI.parse("http://example.com/file.txt") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/file.txt'" do + expect(@uri.path).to eq("/file.txt") + end + + it "should have a basename of 'file.txt'" do + expect(@uri.basename).to eq("file.txt") + end + + it "should have an extname of '.txt'" do + expect(@uri.extname).to eq(".txt") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/file.txt;parameter'" do + before do + @uri = Addressable::URI.parse("http://example.com/file.txt;parameter") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/file.txt;parameter'" do + expect(@uri.path).to eq("/file.txt;parameter") + end + + it "should have a basename of 'file.txt'" do + expect(@uri.basename).to eq("file.txt") + end + + it "should have an extname of '.txt'" do + expect(@uri.extname).to eq(".txt") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/file.txt;x=y'" do + before do + @uri = Addressable::URI.parse("http://example.com/file.txt;x=y") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have a scheme of 'http'" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'example.com'" do + expect(@uri.authority).to eq("example.com") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have no username" do + expect(@uri.user).to eq(nil) + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/file.txt;x=y'" do + expect(@uri.path).to eq("/file.txt;x=y") + end + + it "should have an extname of '.txt'" do + expect(@uri.extname).to eq(".txt") + end + + it "should have no query string" do + expect(@uri.query).to eq(nil) + end + + it "should have no fragment" do + expect(@uri.fragment).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'svn+ssh://developername@rubyforge.org/var/svn/project'" do + before do + @uri = Addressable::URI.parse( + "svn+ssh://developername@rubyforge.org/var/svn/project" + ) + end + + it "should have a scheme of 'svn+ssh'" do + expect(@uri.scheme).to eq("svn+ssh") + end + + it "should be considered to be ip-based" do + expect(@uri).to be_ip_based + end + + it "should have a path of '/var/svn/project'" do + expect(@uri.path).to eq("/var/svn/project") + end + + it "should have a username of 'developername'" do + expect(@uri.user).to eq("developername") + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'ssh+svn://developername@RUBYFORGE.ORG/var/svn/project'" do + before do + @uri = Addressable::URI.parse( + "ssh+svn://developername@RUBYFORGE.ORG/var/svn/project" + ) + end + + it "should have a scheme of 'ssh+svn'" do + expect(@uri.scheme).to eq("ssh+svn") + end + + it "should have a normalized scheme of 'svn+ssh'" do + expect(@uri.normalized_scheme).to eq("svn+ssh") + end + + it "should have a normalized site of 'svn+ssh'" do + expect(@uri.normalized_site).to eq("svn+ssh://developername@rubyforge.org") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of '/var/svn/project'" do + expect(@uri.path).to eq("/var/svn/project") + end + + it "should have a username of 'developername'" do + expect(@uri.user).to eq("developername") + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should not be considered to be in normal form" do + expect(@uri.normalize).not_to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'mailto:user@example.com'" do + before do + @uri = Addressable::URI.parse("mailto:user@example.com") + end + + it "should have a scheme of 'mailto'" do + expect(@uri.scheme).to eq("mailto") + end + + it "should not be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of 'user@example.com'" do + expect(@uri.path).to eq("user@example.com") + end + + it "should have no user" do + expect(@uri.user).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'tag:example.com,2006-08-18:/path/to/something'" do + before do + @uri = Addressable::URI.parse( + "tag:example.com,2006-08-18:/path/to/something") + end + + it "should have a scheme of 'tag'" do + expect(@uri.scheme).to eq("tag") + end + + it "should be considered to be ip-based" do + expect(@uri).not_to be_ip_based + end + + it "should have a path of " + + "'example.com,2006-08-18:/path/to/something'" do + expect(@uri.path).to eq("example.com,2006-08-18:/path/to/something") + end + + it "should have no user" do + expect(@uri.user).to eq(nil) + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/x;y/'" do + before do + @uri = Addressable::URI.parse("http://example.com/x;y/") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?x=1&y=2'" do + before do + @uri = Addressable::URI.parse("http://example.com/?x=1&y=2") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end +end + +describe Addressable::URI, "when parsed from " + + "'view-source:http://example.com/'" do + before do + @uri = Addressable::URI.parse("view-source:http://example.com/") + end + + it "should have a scheme of 'view-source'" do + expect(@uri.scheme).to eq("view-source") + end + + it "should have a path of 'http://example.com/'" do + expect(@uri.path).to eq("http://example.com/") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do + before do + @uri = Addressable::URI.parse( + "http://user:pass@example.com/path/to/resource?query=x#fragment") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have an authority segment of 'user:pass@example.com'" do + expect(@uri.authority).to eq("user:pass@example.com") + end + + it "should have a username of 'user'" do + expect(@uri.user).to eq("user") + end + + it "should have a password of 'pass'" do + expect(@uri.password).to eq("pass") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/path/to/resource'" do + expect(@uri.path).to eq("/path/to/resource") + end + + it "should have a query string of 'query=x'" do + expect(@uri.query).to eq("query=x") + end + + it "should have a fragment of 'fragment'" do + expect(@uri.fragment).to eq("fragment") + end + + it "should be considered to be in normal form" do + expect(@uri.normalize).to be_eql(@uri) + end + + it "should have a route of '../../' to " + + "'http://user:pass@example.com/path/'" do + expect(@uri.route_to("http://user:pass@example.com/path/")).to eq( + Addressable::URI.parse("../../") + ) + end + + it "should have a route of 'to/resource?query=x#fragment' " + + "from 'http://user:pass@example.com/path/'" do + expect(@uri.route_from("http://user:pass@example.com/path/")).to eq( + Addressable::URI.parse("to/resource?query=x#fragment") + ) + end + + it "should have a route of '?query=x#fragment' " + + "from 'http://user:pass@example.com/path/to/resource'" do + expect(@uri.route_from("http://user:pass@example.com/path/to/resource")).to eq( + Addressable::URI.parse("?query=x#fragment") + ) + end + + it "should have a route of '#fragment' " + + "from 'http://user:pass@example.com/path/to/resource?query=x'" do + expect(@uri.route_from( + "http://user:pass@example.com/path/to/resource?query=x")).to eq( + Addressable::URI.parse("#fragment") + ) + end + + it "should have a route of '#fragment' from " + + "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do + expect(@uri.route_from( + "http://user:pass@example.com/path/to/resource?query=x#fragment" + )).to eq(Addressable::URI.parse("#fragment")) + end + + it "should have a route of 'http://elsewhere.com/' to " + + "'http://elsewhere.com/'" do + expect(@uri.route_to("http://elsewhere.com/")).to eq( + Addressable::URI.parse("http://elsewhere.com/") + ) + end + + it "should have a route of " + + "'http://user:pass@example.com/path/to/resource?query=x#fragment' " + + "from 'http://example.com/path/to/'" do + expect(@uri.route_from("http://elsewhere.com/path/to/")).to eq( + Addressable::URI.parse( + "http://user:pass@example.com/path/to/resource?query=x#fragment") + ) + end + + it "should have the correct scheme after assignment" do + @uri.scheme = "ftp" + expect(@uri.scheme).to eq("ftp") + expect(@uri.to_s).to eq( + "ftp://user:pass@example.com/path/to/resource?query=x#fragment" + ) + expect(@uri.to_str).to eq( + "ftp://user:pass@example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct site segment after assignment" do + @uri.site = "https://newuser:newpass@example.com:443" + expect(@uri.scheme).to eq("https") + expect(@uri.authority).to eq("newuser:newpass@example.com:443") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.normalized_userinfo).to eq("newuser:newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(443) + expect(@uri.inferred_port).to eq(443) + expect(@uri.to_s).to eq( + "https://newuser:newpass@example.com:443" + + "/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct authority segment after assignment" do + @uri.authority = "newuser:newpass@example.com:80" + expect(@uri.authority).to eq("newuser:newpass@example.com:80") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.normalized_userinfo).to eq("newuser:newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(80) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq( + "http://newuser:newpass@example.com:80" + + "/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct userinfo segment after assignment" do + @uri.userinfo = "newuser:newpass" + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.authority).to eq("newuser:newpass@example.com") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq( + "http://newuser:newpass@example.com" + + "/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.authority).to eq("newuser:pass@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.authority).to eq("user:newpass@example.com") + end + + it "should have the correct host after assignment" do + @uri.host = "newexample.com" + expect(@uri.host).to eq("newexample.com") + expect(@uri.authority).to eq("user:pass@newexample.com") + end + + it "should have the correct host after assignment" do + @uri.hostname = "newexample.com" + expect(@uri.host).to eq("newexample.com") + expect(@uri.hostname).to eq("newexample.com") + expect(@uri.authority).to eq("user:pass@newexample.com") + end + + it "should raise an error if assigning a bogus object to the hostname" do + expect do + @uri.hostname = Object.new + end.to raise_error(TypeError) + end + + it "should have the correct port after assignment" do + @uri.port = 8080 + expect(@uri.port).to eq(8080) + expect(@uri.authority).to eq("user:pass@example.com:8080") + end + + it "should have the correct origin after assignment" do + @uri.origin = "http://newexample.com" + expect(@uri.host).to eq("newexample.com") + expect(@uri.authority).to eq("newexample.com") + end + + it "should have the correct path after assignment" do + @uri.path = "/newpath/to/resource" + expect(@uri.path).to eq("/newpath/to/resource") + expect(@uri.to_s).to eq( + "http://user:pass@example.com/newpath/to/resource?query=x#fragment" + ) + end + + it "should have the correct scheme and authority after nil assignment" do + @uri.site = nil + expect(@uri.scheme).to eq(nil) + expect(@uri.authority).to eq(nil) + expect(@uri.to_s).to eq("/path/to/resource?query=x#fragment") + end + + it "should have the correct scheme and authority after assignment" do + @uri.site = "file://" + expect(@uri.scheme).to eq("file") + expect(@uri.authority).to eq("") + expect(@uri.to_s).to eq("file:///path/to/resource?query=x#fragment") + end + + it "should have the correct path after nil assignment" do + @uri.path = nil + expect(@uri.path).to eq("") + expect(@uri.to_s).to eq( + "http://user:pass@example.com?query=x#fragment" + ) + end + + it "should have the correct query string after assignment" do + @uri.query = "newquery=x" + expect(@uri.query).to eq("newquery=x") + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?newquery=x#fragment" + ) + @uri.query = nil + expect(@uri.query).to eq(nil) + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource#fragment" + ) + end + + it "should have the correct query string after hash assignment" do + @uri.query_values = {"?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther"} + expect(@uri.query.split("&")).to include("%3Fuestion%20mark=%3Dsign") + expect(@uri.query.split("&")).to include("hello=g%C3%BCnther") + expect(@uri.query_values).to eq({ + "?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther" + }) + end + + it "should have the correct query string after flag hash assignment" do + @uri.query_values = {'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil} + expect(@uri.query.split("&")).to include("flag%3F1") + expect(@uri.query.split("&")).to include("fl%3Dag2") + expect(@uri.query.split("&")).to include("flag3") + expect(@uri.query_values(Array).sort).to eq([["fl=ag2"], ["flag3"], ["flag?1"]]) + expect(@uri.query_values(Hash)).to eq({ + 'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil + }) + end + + it "should raise an error if query values are set to a bogus type" do + expect do + @uri.query_values = "bogus" + end.to raise_error(TypeError) + end + + it "should have the correct fragment after assignment" do + @uri.fragment = "newfragment" + expect(@uri.fragment).to eq("newfragment") + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x#newfragment" + ) + + @uri.fragment = nil + expect(@uri.fragment).to eq(nil) + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:fragment => "newfragment").to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x#newfragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:fragment => nil).to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:userinfo => "newuser:newpass").to_s).to eq( + "http://newuser:newpass@example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:userinfo => nil).to_s).to eq( + "http://example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:path => "newpath").to_s).to eq( + "http://user:pass@example.com/newpath?query=x#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:port => "42", :path => "newpath", :query => "").to_s).to eq( + "http://user:pass@example.com:42/newpath?#fragment" + ) + end + + it "should have the correct values after a merge" do + expect(@uri.merge(:authority => "foo:bar@baz:42").to_s).to eq( + "http://foo:bar@baz:42/path/to/resource?query=x#fragment" + ) + # Ensure the operation was not destructive + expect(@uri.to_s).to eq( + "http://user:pass@example.com/path/to/resource?query=x#fragment" + ) + end + + it "should have the correct values after a destructive merge" do + @uri.merge!(:authority => "foo:bar@baz:42") + # Ensure the operation was destructive + expect(@uri.to_s).to eq( + "http://foo:bar@baz:42/path/to/resource?query=x#fragment" + ) + end + + it "should fail to merge with bogus values" do + expect do + @uri.merge(:port => "bogus") + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should fail to merge with bogus values" do + expect do + @uri.merge(:authority => "bar@baz:bogus") + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should fail to merge with bogus parameters" do + expect do + @uri.merge(42) + end.to raise_error(TypeError) + end + + it "should fail to merge with bogus parameters" do + expect do + @uri.merge("http://example.com/") + end.to raise_error(TypeError) + end + + it "should fail to merge with both authority and subcomponents" do + expect do + @uri.merge(:authority => "foo:bar@baz:42", :port => "42") + end.to raise_error(ArgumentError) + end + + it "should fail to merge with both userinfo and subcomponents" do + expect do + @uri.merge(:userinfo => "foo:bar", :user => "foo") + end.to raise_error(ArgumentError) + end + + it "should be identical to its duplicate" do + expect(@uri).to eq(@uri.dup) + end + + it "should have an origin of 'http://example.com'" do + expect(@uri.origin).to eq('http://example.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/search?q=Q%26A'" do + + before do + @uri = Addressable::URI.parse("http://example.com/search?q=Q%26A") + end + + it "should have a query of 'q=Q%26A'" do + expect(@uri.query).to eq("q=Q%26A") + end + + it "should have query_values of {'q' => 'Q&A'}" do + expect(@uri.query_values).to eq({ 'q' => 'Q&A' }) + end + + it "should normalize to the original uri " + + "(with the ampersand properly percent-encoded)" do + expect(@uri.normalize.to_s).to eq("http://example.com/search?q=Q%26A") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?&x=b") + end + + it "should have a query of '&x=b'" do + expect(@uri.query).to eq("&x=b") + end + + it "should have query_values of {'x' => 'b'}" do + expect(@uri.query_values).to eq({'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q='one;two'&x=1'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q='one;two'&x=1") + end + + it "should have a query of 'q='one;two'&x=1'" do + expect(@uri.query).to eq("q='one;two'&x=1") + end + + it "should have query_values of {\"q\" => \"'one;two'\", \"x\" => \"1\"}" do + expect(@uri.query_values).to eq({"q" => "'one;two'", "x" => "1"}) + end + + it "should escape the ';' character when normalizing to avoid ambiguity " + + "with the W3C HTML 4.01 specification" do + # HTML 4.01 Section B.2.2 + expect(@uri.normalize.query).to eq("q='one%3Btwo'&x=1") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?&&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?&&x=b") + end + + it "should have a query of '&&x=b'" do + expect(@uri.query).to eq("&&x=b") + end + + it "should have query_values of {'x' => 'b'}" do + expect(@uri.query_values).to eq({'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=a&&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=a&&x=b") + end + + it "should have a query of 'q=a&&x=b'" do + expect(@uri.query).to eq("q=a&&x=b") + end + + it "should have query_values of {'q' => 'a, 'x' => 'b'}" do + expect(@uri.query_values).to eq({'q' => 'a', 'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q&&x=b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q&&x=b") + end + + it "should have a query of 'q&&x=b'" do + expect(@uri.query).to eq("q&&x=b") + end + + it "should have query_values of {'q' => true, 'x' => 'b'}" do + expect(@uri.query_values).to eq({'q' => nil, 'x' => 'b'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=a+b'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=a+b") + end + + it "should have a query of 'q=a+b'" do + expect(@uri.query).to eq("q=a+b") + end + + it "should have query_values of {'q' => 'a b'}" do + expect(@uri.query_values).to eq({'q' => 'a b'}) + end + + it "should have a normalized query of 'q=a+b'" do + expect(@uri.normalized_query).to eq("q=a+b") + end +end + +describe Addressable::URI, "when parsed from 'https://example.com/?q=a+b'" do + before do + @uri = Addressable::URI.parse("https://example.com/?q=a+b") + end + + it "should have query_values of {'q' => 'a b'}" do + expect(@uri.query_values).to eq("q" => "a b") + end +end + +describe Addressable::URI, "when parsed from 'example.com?q=a+b'" do + before do + @uri = Addressable::URI.parse("example.com?q=a+b") + end + + it "should have query_values of {'q' => 'a b'}" do + expect(@uri.query_values).to eq("q" => "a b") + end +end + +describe Addressable::URI, "when parsed from 'mailto:?q=a+b'" do + before do + @uri = Addressable::URI.parse("mailto:?q=a+b") + end + + it "should have query_values of {'q' => 'a+b'}" do + expect(@uri.query_values).to eq("q" => "a+b") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q=a%2bb'" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=a%2bb") + end + + it "should have a query of 'q=a+b'" do + expect(@uri.query).to eq("q=a%2bb") + end + + it "should have query_values of {'q' => 'a+b'}" do + expect(@uri.query_values).to eq({'q' => 'a+b'}) + end + + it "should have a normalized query of 'q=a%2Bb'" do + expect(@uri.normalized_query).to eq("q=a%2Bb") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7'" do + before do + @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7") + end + + it "should have a normalized query of 'v=~&w=%25&x=%25&y=%2B&z=%C3%87'" do + expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=%2B&z=%C3%87") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7'" do + before do + @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7") + end + + it "should have a normalized query of 'v=~&w=%25&x=%25&y=+&z=%C3%87'" do + expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=+&z=%C3%87") + end +end + +describe Addressable::URI, "when parsed from 'http://example/?b=1&a=2&c=3'" do + before do + @uri = Addressable::URI.parse("http://example/?b=1&a=2&c=3") + end + + it "should have a sorted normalized query of 'a=2&b=1&c=3'" do + expect(@uri.normalized_query(:sorted)).to eq("a=2&b=1&c=3") + end +end + +describe Addressable::URI, "when parsed from 'http://example/?&a&&c&'" do + before do + @uri = Addressable::URI.parse("http://example/?&a&&c&") + end + + it "should have a compacted normalized query of 'a&c'" do + expect(@uri.normalized_query(:compacted)).to eq("a&c") + end +end + +describe Addressable::URI, "when parsed from 'http://example.com/?a=1&a=1'" do + before do + @uri = Addressable::URI.parse("http://example.com/?a=1&a=1") + end + + it "should have a compacted normalized query of 'a=1'" do + expect(@uri.normalized_query(:compacted)).to eq("a=1") + end +end + +describe Addressable::URI, "when parsed from 'http://example.com/?a=1&a=2'" do + before do + @uri = Addressable::URI.parse("http://example.com/?a=1&a=2") + end + + it "should have a compacted normalized query of 'a=1&a=2'" do + expect(@uri.normalized_query(:compacted)).to eq("a=1&a=2") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/sound%2bvision'" do + before do + @uri = Addressable::URI.parse("http://example.com/sound%2bvision") + end + + it "should have a normalized path of '/sound+vision'" do + expect(@uri.normalized_path).to eq('/sound+vision') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/?q='" do + before do + @uri = Addressable::URI.parse("http://example.com/?q=") + end + + it "should have a query of 'q='" do + expect(@uri.query).to eq("q=") + end + + it "should have query_values of {'q' => ''}" do + expect(@uri.query_values).to eq({'q' => ''}) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://user@example.com'" do + before do + @uri = Addressable::URI.parse("http://user@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of 'user'" do + expect(@uri.user).to eq("user") + end + + it "should have no password" do + expect(@uri.password).to eq(nil) + end + + it "should have a userinfo of 'user'" do + expect(@uri.userinfo).to eq("user") + end + + it "should have a normalized userinfo of 'user'" do + expect(@uri.normalized_userinfo).to eq("user") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have default_port 80" do + expect(@uri.default_port).to eq(80) + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq(nil) + expect(@uri.to_s).to eq("http://newuser@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.to_s).to eq("http://user:newpass@example.com") + end + + it "should have the correct userinfo segment after assignment" do + @uri.userinfo = "newuser:newpass" + expect(@uri.userinfo).to eq("newuser:newpass") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://newuser:newpass@example.com") + end + + it "should have the correct userinfo segment after nil assignment" do + @uri.userinfo = nil + expect(@uri.userinfo).to eq(nil) + expect(@uri.user).to eq(nil) + expect(@uri.password).to eq(nil) + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = "newuser@example.com" + expect(@uri.authority).to eq("newuser@example.com") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq(nil) + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://newuser@example.com") + end + + it "should raise an error after nil assignment of authority segment" do + expect do + # This would create an invalid URI + @uri.authority = nil + end.to raise_error(Addressable::URI::InvalidURIError) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://user:@example.com'" do + before do + @uri = Addressable::URI.parse("http://user:@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of 'user'" do + expect(@uri.user).to eq("user") + end + + it "should have a password of ''" do + expect(@uri.password).to eq("") + end + + it "should have a normalized userinfo of 'user:'" do + expect(@uri.normalized_userinfo).to eq("user:") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("") + expect(@uri.to_s).to eq("http://newuser:@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.to_s).to eq("http://user:newpass@example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = "newuser:@example.com" + expect(@uri.authority).to eq("newuser:@example.com") + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://newuser:@example.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://:pass@example.com'" do + before do + @uri = Addressable::URI.parse("http://:pass@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of ''" do + expect(@uri.user).to eq("") + end + + it "should have a password of 'pass'" do + expect(@uri.password).to eq("pass") + end + + it "should have a userinfo of ':pass'" do + expect(@uri.userinfo).to eq(":pass") + end + + it "should have a normalized userinfo of ':pass'" do + expect(@uri.normalized_userinfo).to eq(":pass") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("pass") + expect(@uri.to_s).to eq("http://newuser:pass@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = ":newpass@example.com" + expect(@uri.authority).to eq(":newpass@example.com") + expect(@uri.user).to eq("") + expect(@uri.password).to eq("newpass") + expect(@uri.host).to eq("example.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://:newpass@example.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://:@example.com'" do + before do + @uri = Addressable::URI.parse("http://:@example.com") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a username of ''" do + expect(@uri.user).to eq("") + end + + it "should have a password of ''" do + expect(@uri.password).to eq("") + end + + it "should have a normalized userinfo of nil" do + expect(@uri.normalized_userinfo).to eq(nil) + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have the correct username after assignment" do + @uri.user = "newuser" + expect(@uri.user).to eq("newuser") + expect(@uri.password).to eq("") + expect(@uri.to_s).to eq("http://newuser:@example.com") + end + + it "should have the correct password after assignment" do + @uri.password = "newpass" + expect(@uri.password).to eq("newpass") + expect(@uri.user).to eq("") + expect(@uri.to_s).to eq("http://:newpass@example.com") + end + + it "should have the correct authority segment after assignment" do + @uri.authority = ":@newexample.com" + expect(@uri.authority).to eq(":@newexample.com") + expect(@uri.user).to eq("") + expect(@uri.password).to eq("") + expect(@uri.host).to eq("newexample.com") + expect(@uri.port).to eq(nil) + expect(@uri.inferred_port).to eq(80) + expect(@uri.to_s).to eq("http://:@newexample.com") + end +end + +describe Addressable::URI, "when parsed from " + + "'#example'" do + before do + @uri = Addressable::URI.parse("#example") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should have a host of nil" do + expect(@uri.host).to eq(nil) + end + + it "should have a site of nil" do + expect(@uri.site).to eq(nil) + end + + it "should have a normalized_site of nil" do + expect(@uri.normalized_site).to eq(nil) + end + + it "should have a path of ''" do + expect(@uri.path).to eq("") + end + + it "should have a query string of nil" do + expect(@uri.query).to eq(nil) + end + + it "should have a fragment of 'example'" do + expect(@uri.fragment).to eq("example") + end +end + +describe Addressable::URI, "when parsed from " + + "the network-path reference '//example.com/'" do + before do + @uri = Addressable::URI.parse("//example.com/") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should have a path of '/'" do + expect(@uri.path).to eq("/") + end + + it "should raise an error if routing is attempted" do + expect do + @uri.route_to("http://example.com/") + end.to raise_error(ArgumentError, /\/\/example.com\//) + expect do + @uri.route_from("http://example.com/") + end.to raise_error(ArgumentError, /\/\/example.com\//) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'feed://http://example.com/'" do + before do + @uri = Addressable::URI.parse("feed://http://example.com/") + end + + it "should have a host of 'http'" do + expect(@uri.host).to eq("http") + end + + it "should have a path of '//example.com/'" do + expect(@uri.path).to eq("//example.com/") + end +end + +describe Addressable::URI, "when parsed from " + + "'feed:http://example.com/'" do + before do + @uri = Addressable::URI.parse("feed:http://example.com/") + end + + it "should have a path of 'http://example.com/'" do + expect(@uri.path).to eq("http://example.com/") + end + + it "should normalize to 'http://example.com/'" do + expect(@uri.normalize.to_s).to eq("http://example.com/") + expect(@uri.normalize!.to_s).to eq("http://example.com/") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'example://a/b/c/%7Bfoo%7D'" do + before do + @uri = Addressable::URI.parse("example://a/b/c/%7Bfoo%7D") + end + + # Section 6.2.2 of RFC 3986 + it "should be equivalent to eXAMPLE://a/./b/../b/%63/%7bfoo%7d" do + expect(@uri).to eq( + Addressable::URI.parse("eXAMPLE://a/./b/../b/%63/%7bfoo%7d") + ) + end + + it "should have an origin of 'example://a'" do + expect(@uri.origin).to eq('example://a') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://example.com/indirect/path/./to/../resource/'" do + before do + @uri = Addressable::URI.parse( + "http://example.com/indirect/path/./to/../resource/") + end + + it "should use the 'http' scheme" do + expect(@uri.scheme).to eq("http") + end + + it "should have a host of 'example.com'" do + expect(@uri.host).to eq("example.com") + end + + it "should use port 80" do + expect(@uri.inferred_port).to eq(80) + end + + it "should have a path of '/indirect/path/./to/../resource/'" do + expect(@uri.path).to eq("/indirect/path/./to/../resource/") + end + + # Section 6.2.2.3 of RFC 3986 + it "should have a normalized path of '/indirect/path/resource/'" do + expect(@uri.normalize.path).to eq("/indirect/path/resource/") + expect(@uri.normalize!.path).to eq("/indirect/path/resource/") + end +end + +describe Addressable::URI, "when parsed from " + + "'http://under_score.example.com/'" do + it "should not cause an error" do + expect do + Addressable::URI.parse("http://under_score.example.com/") + end.not_to raise_error + end +end + +describe Addressable::URI, "when parsed from " + + "'./this:that'" do + before do + @uri = Addressable::URI.parse("./this:that") + end + + it "should be considered relative" do + expect(@uri).to be_relative + end + + it "should have no scheme" do + expect(@uri.scheme).to eq(nil) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from " + + "'this:that'" do + before do + @uri = Addressable::URI.parse("this:that") + end + + it "should be considered absolute" do + expect(@uri).to be_absolute + end + + it "should have a scheme of 'this'" do + expect(@uri.scheme).to eq("this") + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from '?'" do + before do + @uri = Addressable::URI.parse("?") + end + + it "should normalize to ''" do + expect(@uri.normalize.to_s).to eq("") + end + + it "should have the correct return type" do + expect(@uri.query_values).to eq({}) + expect(@uri.query_values(Hash)).to eq({}) + expect(@uri.query_values(Array)).to eq([]) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from '?one=1&two=2&three=3'" do + before do + @uri = Addressable::URI.parse("?one=1&two=2&three=3") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({"one" => "1", "two" => "2", "three" => "3"}) + end + + it "should raise an error for invalid return type values" do + expect do + @uri.query_values(Integer) + end.to raise_error(ArgumentError) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one", "1"], ["two", "2"], ["three", "3"] + ]) + end + + it "should have a 'null' origin" do + expect(@uri.origin).to eq('null') + end +end + +describe Addressable::URI, "when parsed from '?one=1=uno&two=2=dos'" do + before do + @uri = Addressable::URI.parse("?one=1=uno&two=2=dos") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({"one" => "1=uno", "two" => "2=dos"}) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one", "1=uno"], ["two", "2=dos"] + ]) + end +end + +describe Addressable::URI, "when parsed from '?one[two][three]=four'" do + before do + @uri = Addressable::URI.parse("?one[two][three]=four") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({"one[two][three]" => "four"}) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one[two][three]", "four"] + ]) + end +end + +describe Addressable::URI, "when parsed from '?one.two.three=four'" do + before do + @uri = Addressable::URI.parse("?one.two.three=four") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one.two.three" => "four" + }) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one.two.three", "four"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three]=four&one[two][five]=six'" do + before do + @uri = Addressable::URI.parse("?one[two][three]=four&one[two][five]=six") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three]" => "four", "one[two][five]" => "six" + }) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one[two][three]", "four"], ["one[two][five]", "six"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one.two.three=four&one.two.five=six'" do + before do + @uri = Addressable::URI.parse("?one.two.three=four&one.two.five=six") + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one.two.three" => "four", "one.two.five" => "six" + }) + end + + it "should have the correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one.two.three", "four"], ["one.two.five", "six"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one=two&one=three'" do + before do + @uri = Addressable::URI.parse( + "?one=two&one=three&one=four" + ) + end + + it "should have correct array query values" do + expect(@uri.query_values(Array)).to eq( + [['one', 'two'], ['one', 'three'], ['one', 'four']] + ) + end + + it "should have correct hash query values" do + skip("This is probably more desirable behavior.") + expect(@uri.query_values(Hash)).to eq( + {'one' => ['two', 'three', 'four']} + ) + end + + it "should handle assignment with keys of mixed type" do + @uri.query_values = @uri.query_values(Hash).merge({:one => 'three'}) + expect(@uri.query_values(Hash)).to eq({'one' => 'three'}) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][]=four&one[two][three][]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][]=four&one[two][three][]=five" + ) + end + + it "should have correct query values" do + expect(@uri.query_values(Hash)).to eq({"one[two][three][]" => "five"}) + end + + it "should have correct array query values" do + expect(@uri.query_values(Array)).to eq([ + ["one[two][three][]", "four"], ["one[two][three][]", "five"] + ]) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][0]=four&one[two][three][1]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][0]=four&one[two][three][1]=five" + ) + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three][0]" => "four", "one[two][three][1]" => "five" + }) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][1]=four&one[two][three][0]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][1]=four&one[two][three][0]=five" + ) + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three][1]" => "four", "one[two][three][0]" => "five" + }) + end +end + +describe Addressable::URI, "when parsed from " + + "'?one[two][three][2]=four&one[two][three][1]=five'" do + before do + @uri = Addressable::URI.parse( + "?one[two][three][2]=four&one[two][three][1]=five" + ) + end + + it "should have the correct query values" do + expect(@uri.query_values).to eq({ + "one[two][three][2]" => "four", "one[two][three][1]" => "five" + }) + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.詹姆斯.com/'" do + before do + @uri = Addressable::URI.parse("http://www.詹姆斯.com/") + end + + it "should be equivalent to 'http://www.xn--8ws00zhy3a.com/'" do + expect(@uri).to eq( + Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") + ) + end + + it "should not have domain name encoded during normalization" do + expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( + "http://www.詹姆斯.com/" + ) + end + + it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do + expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.詹姆斯.com/ some spaces /'" do + before do + @uri = Addressable::URI.parse("http://www.詹姆斯.com/ some spaces /") + end + + it "should be equivalent to " + + "'http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/'" do + expect(@uri).to eq( + Addressable::URI.parse( + "http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/") + ) + end + + it "should not have domain name encoded during normalization" do + expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq( + "http://www.詹姆斯.com/%20some%20spaces%20/" + ) + end + + it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do + expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.xn--8ws00zhy3a.com/'" do + before do + @uri = Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/") + end + + it "should be displayed as http://www.詹姆斯.com/" do + expect(@uri.display_uri.to_s).to eq("http://www.詹姆斯.com/") + end + + it "should properly force the encoding" do + display_string = @uri.display_uri.to_str + expect(display_string).to eq("http://www.詹姆斯.com/") + if display_string.respond_to?(:encoding) + expect(display_string.encoding.to_s).to eq(Encoding::UTF_8.to_s) + end + end + + it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do + expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com') + end +end + +describe Addressable::URI, "when parsed from " + + "'http://www.詹姆斯.com/atomtests/iri/詹.html'" do + before do + @uri = Addressable::URI.parse("http://www.詹姆斯.com/atomtests/iri/詹.html") + end + + it "should normalize to " + + "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" do + expect(@uri.normalize.to_s).to eq( + "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" + ) + expect(@uri.normalize!.to_s).to eq( + "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" + ) + end +end + +describe Addressable::URI, "when parsed from a percent-encoded IRI" do + before do + @uri = Addressable::URI.parse( + "http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA" + + "%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3" + + "%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82" + + "%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0" + + "%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3" + + "%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp" + ) + end + + it "should normalize to something sane" do + expect(@uri.normalize.to_s).to eq( + "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + + "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" + ) + expect(@uri.normalize!.to_s).to eq( + "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + + "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/" + ) + end + + it "should have the correct origin" do + expect(@uri.origin).to eq( + "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" + + "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp" + ) + end +end + +describe Addressable::URI, "with a base uri of 'http://a/b/c/d;p?q'" do + before do + @uri = Addressable::URI.parse("http://a/b/c/d;p?q") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g:h' should resolve to g:h" do + expect((@uri + "g:h").to_s).to eq("g:h") + expect(Addressable::URI.join(@uri, "g:h").to_s).to eq("g:h") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g' should resolve to http://a/b/c/g" do + expect((@uri + "g").to_s).to eq("http://a/b/c/g") + expect(Addressable::URI.join(@uri.to_s, "g").to_s).to eq("http://a/b/c/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with './g' should resolve to http://a/b/c/g" do + expect((@uri + "./g").to_s).to eq("http://a/b/c/g") + expect(Addressable::URI.join(@uri.to_s, "./g").to_s).to eq("http://a/b/c/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g/' should resolve to http://a/b/c/g/" do + expect((@uri + "g/").to_s).to eq("http://a/b/c/g/") + expect(Addressable::URI.join(@uri.to_s, "g/").to_s).to eq("http://a/b/c/g/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '/g' should resolve to http://a/g" do + expect((@uri + "/g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "/g").to_s).to eq("http://a/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '//g' should resolve to http://g" do + expect((@uri + "//g").to_s).to eq("http://g") + expect(Addressable::URI.join(@uri.to_s, "//g").to_s).to eq("http://g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '?y' should resolve to http://a/b/c/d;p?y" do + expect((@uri + "?y").to_s).to eq("http://a/b/c/d;p?y") + expect(Addressable::URI.join(@uri.to_s, "?y").to_s).to eq("http://a/b/c/d;p?y") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g?y' should resolve to http://a/b/c/g?y" do + expect((@uri + "g?y").to_s).to eq("http://a/b/c/g?y") + expect(Addressable::URI.join(@uri.to_s, "g?y").to_s).to eq("http://a/b/c/g?y") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '#s' should resolve to http://a/b/c/d;p?q#s" do + expect((@uri + "#s").to_s).to eq("http://a/b/c/d;p?q#s") + expect(Addressable::URI.join(@uri.to_s, "#s").to_s).to eq( + "http://a/b/c/d;p?q#s" + ) + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g#s' should resolve to http://a/b/c/g#s" do + expect((@uri + "g#s").to_s).to eq("http://a/b/c/g#s") + expect(Addressable::URI.join(@uri.to_s, "g#s").to_s).to eq("http://a/b/c/g#s") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g?y#s' should resolve to http://a/b/c/g?y#s" do + expect((@uri + "g?y#s").to_s).to eq("http://a/b/c/g?y#s") + expect(Addressable::URI.join( + @uri.to_s, "g?y#s").to_s).to eq("http://a/b/c/g?y#s") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with ';x' should resolve to http://a/b/c/;x" do + expect((@uri + ";x").to_s).to eq("http://a/b/c/;x") + expect(Addressable::URI.join(@uri.to_s, ";x").to_s).to eq("http://a/b/c/;x") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g;x' should resolve to http://a/b/c/g;x" do + expect((@uri + "g;x").to_s).to eq("http://a/b/c/g;x") + expect(Addressable::URI.join(@uri.to_s, "g;x").to_s).to eq("http://a/b/c/g;x") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with 'g;x?y#s' should resolve to http://a/b/c/g;x?y#s" do + expect((@uri + "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") + expect(Addressable::URI.join( + @uri.to_s, "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '' should resolve to http://a/b/c/d;p?q" do + expect((@uri + "").to_s).to eq("http://a/b/c/d;p?q") + expect(Addressable::URI.join(@uri.to_s, "").to_s).to eq("http://a/b/c/d;p?q") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '.' should resolve to http://a/b/c/" do + expect((@uri + ".").to_s).to eq("http://a/b/c/") + expect(Addressable::URI.join(@uri.to_s, ".").to_s).to eq("http://a/b/c/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with './' should resolve to http://a/b/c/" do + expect((@uri + "./").to_s).to eq("http://a/b/c/") + expect(Addressable::URI.join(@uri.to_s, "./").to_s).to eq("http://a/b/c/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '..' should resolve to http://a/b/" do + expect((@uri + "..").to_s).to eq("http://a/b/") + expect(Addressable::URI.join(@uri.to_s, "..").to_s).to eq("http://a/b/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../' should resolve to http://a/b/" do + expect((@uri + "../").to_s).to eq("http://a/b/") + expect(Addressable::URI.join(@uri.to_s, "../").to_s).to eq("http://a/b/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../g' should resolve to http://a/b/g" do + expect((@uri + "../g").to_s).to eq("http://a/b/g") + expect(Addressable::URI.join(@uri.to_s, "../g").to_s).to eq("http://a/b/g") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../..' should resolve to http://a/" do + expect((@uri + "../..").to_s).to eq("http://a/") + expect(Addressable::URI.join(@uri.to_s, "../..").to_s).to eq("http://a/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../../' should resolve to http://a/" do + expect((@uri + "../../").to_s).to eq("http://a/") + expect(Addressable::URI.join(@uri.to_s, "../../").to_s).to eq("http://a/") + end + + # Section 5.4.1 of RFC 3986 + it "when joined with '../../g' should resolve to http://a/g" do + expect((@uri + "../../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "../../g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '../../../g' should resolve to http://a/g" do + expect((@uri + "../../../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "../../../g").to_s).to eq("http://a/g") + end + + it "when joined with '../.././../g' should resolve to http://a/g" do + expect((@uri + "../.././../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "../.././../g").to_s).to eq( + "http://a/g" + ) + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '../../../../g' should resolve to http://a/g" do + expect((@uri + "../../../../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join( + @uri.to_s, "../../../../g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '/./g' should resolve to http://a/g" do + expect((@uri + "/./g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "/./g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '/../g' should resolve to http://a/g" do + expect((@uri + "/../g").to_s).to eq("http://a/g") + expect(Addressable::URI.join(@uri.to_s, "/../g").to_s).to eq("http://a/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g.' should resolve to http://a/b/c/g." do + expect((@uri + "g.").to_s).to eq("http://a/b/c/g.") + expect(Addressable::URI.join(@uri.to_s, "g.").to_s).to eq("http://a/b/c/g.") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '.g' should resolve to http://a/b/c/.g" do + expect((@uri + ".g").to_s).to eq("http://a/b/c/.g") + expect(Addressable::URI.join(@uri.to_s, ".g").to_s).to eq("http://a/b/c/.g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g..' should resolve to http://a/b/c/g.." do + expect((@uri + "g..").to_s).to eq("http://a/b/c/g..") + expect(Addressable::URI.join(@uri.to_s, "g..").to_s).to eq("http://a/b/c/g..") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with '..g' should resolve to http://a/b/c/..g" do + expect((@uri + "..g").to_s).to eq("http://a/b/c/..g") + expect(Addressable::URI.join(@uri.to_s, "..g").to_s).to eq("http://a/b/c/..g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with './../g' should resolve to http://a/b/g" do + expect((@uri + "./../g").to_s).to eq("http://a/b/g") + expect(Addressable::URI.join(@uri.to_s, "./../g").to_s).to eq("http://a/b/g") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with './g/.' should resolve to http://a/b/c/g/" do + expect((@uri + "./g/.").to_s).to eq("http://a/b/c/g/") + expect(Addressable::URI.join(@uri.to_s, "./g/.").to_s).to eq("http://a/b/c/g/") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g/./h' should resolve to http://a/b/c/g/h" do + expect((@uri + "g/./h").to_s).to eq("http://a/b/c/g/h") + expect(Addressable::URI.join(@uri.to_s, "g/./h").to_s).to eq("http://a/b/c/g/h") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g/../h' should resolve to http://a/b/c/h" do + expect((@uri + "g/../h").to_s).to eq("http://a/b/c/h") + expect(Addressable::URI.join(@uri.to_s, "g/../h").to_s).to eq("http://a/b/c/h") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g;x=1/./y' " + + "should resolve to http://a/b/c/g;x=1/y" do + expect((@uri + "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") + expect(Addressable::URI.join( + @uri.to_s, "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g;x=1/../y' should resolve to http://a/b/c/y" do + expect((@uri + "g;x=1/../y").to_s).to eq("http://a/b/c/y") + expect(Addressable::URI.join( + @uri.to_s, "g;x=1/../y").to_s).to eq("http://a/b/c/y") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g?y/./x' " + + "should resolve to http://a/b/c/g?y/./x" do + expect((@uri + "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") + expect(Addressable::URI.join( + @uri.to_s, "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g?y/../x' " + + "should resolve to http://a/b/c/g?y/../x" do + expect((@uri + "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") + expect(Addressable::URI.join( + @uri.to_s, "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g#s/./x' " + + "should resolve to http://a/b/c/g#s/./x" do + expect((@uri + "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") + expect(Addressable::URI.join( + @uri.to_s, "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'g#s/../x' " + + "should resolve to http://a/b/c/g#s/../x" do + expect((@uri + "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") + expect(Addressable::URI.join( + @uri.to_s, "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x") + end + + # Section 5.4.2 of RFC 3986 + it "when joined with 'http:g' should resolve to http:g" do + expect((@uri + "http:g").to_s).to eq("http:g") + expect(Addressable::URI.join(@uri.to_s, "http:g").to_s).to eq("http:g") + end + + # Edge case to be sure + it "when joined with '//example.com/' should " + + "resolve to http://example.com/" do + expect((@uri + "//example.com/").to_s).to eq("http://example.com/") + expect(Addressable::URI.join( + @uri.to_s, "//example.com/").to_s).to eq("http://example.com/") + end + + it "when joined with a bogus object a TypeError should be raised" do + expect do + Addressable::URI.join(@uri, 42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when converting the path " + + "'relative/path/to/something'" do + before do + @path = 'relative/path/to/something' + end + + it "should convert to " + + "\'relative/path/to/something\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("relative/path/to/something") + end + + it "should join with an absolute file path correctly" do + @base = Addressable::URI.convert_path("/absolute/path/") + @uri = Addressable::URI.convert_path(@path) + expect((@base + @uri).to_str).to eq( + "file:///absolute/path/relative/path/to/something" + ) + end +end + +describe Addressable::URI, "when converting a bogus path" do + it "should raise a TypeError" do + expect do + Addressable::URI.convert_path(42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when given a UNIX root directory" do + before do + @path = "/" + end + + it "should convert to \'file:///\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given a Windows root directory" do + before do + @path = "C:\\" + end + + it "should convert to \'file:///c:/\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path '/one/two/'" do + before do + @path = '/one/two/' + end + + it "should convert to " + + "\'file:///one/two/\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///one/two/") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the tld " do + it "'uk' should have a tld of 'uk'" do + uri = Addressable::URI.parse("http://example.com") + uri.tld = "uk" + + expect(uri.tld).to eq("uk") + end + + context "which " do + let (:uri) { Addressable::URI.parse("http://www.comrade.net/path/to/source/") } + + it "contains a subdomain" do + uri.tld = "co.uk" + + expect(uri.to_s).to eq("http://www.comrade.co.uk/path/to/source/") + end + + it "is part of the domain" do + uri.tld = "com" + + expect(uri.to_s).to eq("http://www.comrade.com/path/to/source/") + end + end +end + +describe Addressable::URI, "when given the path " + + "'c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file://c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "file://c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file:c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "file:c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file:/c:\\windows\\My Documents 100%20\\foo.txt'" do + before do + @path = "file:/c:\\windows\\My Documents 100%20\\foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given the path " + + "'file:///c|/windows/My%20Documents%20100%20/foo.txt'" do + before do + @path = "file:///c|/windows/My%20Documents%20100%20/foo.txt" + end + + it "should convert to " + + "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt") + end + + it "should have an origin of 'file://'" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.origin).to eq('file://') + end +end + +describe Addressable::URI, "when given an http protocol URI" do + before do + @path = "http://example.com/" + end + + it "should not do any conversion at all" do + @uri = Addressable::URI.convert_path(@path) + expect(@uri.to_str).to eq("http://example.com/") + end +end + +class SuperString + def initialize(string) + @string = string.to_s + end + + def to_str + return @string + end +end + +describe Addressable::URI, "when parsing a non-String object" do + it "should correctly parse anything with a 'to_str' method" do + Addressable::URI.parse(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.parse(42) + end.to raise_error(TypeError) + end + + it "should correctly parse heuristically anything with a 'to_str' method" do + Addressable::URI.heuristic_parse(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.heuristic_parse(42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when form encoding a hash" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + [["&one", "/1"], ["=two", "?2"], [":three", "#3"]] + )).to eq("%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + {"q" => "one two three"} + )).to eq("q=one+two+three") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + {"key" => nil} + )).to eq("key=") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode( + {"q" => ["one", "two", "three"]} + )).to eq("q=one&q=two&q=three") + end + + it "should result in correctly encoded newlines" do + expect(Addressable::URI.form_encode( + {"text" => "one\ntwo\rthree\r\nfour\n\r"} + )).to eq("text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A") + end + + it "should result in a sorted percent encoded sequence" do + expect(Addressable::URI.form_encode( + [["a", "1"], ["dup", "3"], ["dup", "2"]], true + )).to eq("a=1&dup=2&dup=3") + end +end + +describe Addressable::URI, "when form encoding a non-Array object" do + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.form_encode(42) + end.to raise_error(TypeError) + end +end + +# See https://tools.ietf.org/html/rfc6749#appendix-B +describe Addressable::URI, "when form encoding the example value from OAuth 2" do + it "should result in correct values" do + expect(Addressable::URI.form_encode( + {"value" => " %&+£€"} + )).to eq("value=+%25%26%2B%C2%A3%E2%82%AC") + end +end + +# See https://tools.ietf.org/html/rfc6749#appendix-B +describe Addressable::URI, "when form unencoding the example value from OAuth 2" do + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "value=+%25%26%2B%C2%A3%E2%82%AC" + )).to eq([["value", " %&+£€"]]) + end +end + +describe Addressable::URI, "when form unencoding a string" do + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233" + )).to eq([["&one", "/1"], ["=two", "?2"], [":three", "#3"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "q=one+two+three" + )).to eq([["q", "one two three"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A" + )).to eq([["text", "one\ntwo\nthree\nfour\n\n"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "a=1&dup=2&dup=3" + )).to eq([["a", "1"], ["dup", "2"], ["dup", "3"]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode( + "key" + )).to eq([["key", nil]]) + end + + it "should result in correct values" do + expect(Addressable::URI.form_unencode("GivenName=Ren%C3%A9")).to eq( + [["GivenName", "René"]] + ) + end +end + +describe Addressable::URI, "when form unencoding a non-String object" do + it "should correctly parse anything with a 'to_str' method" do + Addressable::URI.form_unencode(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.form_unencode(42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when normalizing a non-String object" do + it "should correctly parse anything with a 'to_str' method" do + Addressable::URI.normalize_component(SuperString.new(42)) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.normalize_component(42) + end.to raise_error(TypeError) + end + + it "should raise a TypeError for objects than cannot be converted" do + expect do + Addressable::URI.normalize_component("component", 42) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when normalizing a path with an encoded slash" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.parse("/path%2Fsegment/").normalize.path).to eq( + "/path%2Fsegment/" + ) + end +end + +describe Addressable::URI, "when normalizing a partially encoded string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "partially % encoded%21" + )).to eq("partially%20%25%20encoded!") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "partially %25 encoded!" + )).to eq("partially%20%25%20encoded!") + end +end + +describe Addressable::URI, "when normalizing a unicode sequence" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "/C%CC%A7" + )).to eq("/%C3%87") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component( + "/%C3%87" + )).to eq("/%C3%87") + end +end + +describe Addressable::URI, "when normalizing a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component("günther")).to eq( + "g%C3%BCnther" + ) + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component("g%C3%BCnther")).to eq( + "g%C3%BCnther" + ) + end +end + +describe Addressable::URI, "when normalizing a string but leaving some characters encoded" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.normalize_component("%58X%59Y%5AZ", "0-9a-zXY", "Y")).to eq( + "XX%59Y%5A%5A" + ) + end + + it "should not modify the character class" do + character_class = "0-9a-zXY" + + character_class_copy = character_class.dup + + Addressable::URI.normalize_component("%58X%59Y%5AZ", character_class, "Y") + + expect(character_class).to eq(character_class_copy) + end +end + +describe Addressable::URI, "when encoding IP literals" do + it "should work for IPv4" do + input = "http://127.0.0.1/" + expect(Addressable::URI.encode(input)).to eq(input) + end + + it "should work for IPv6" do + input = "http://[fe80::200:f8ff:fe21:67cf]/" + expect(Addressable::URI.encode(input)).to eq(input) + end +end + +describe Addressable::URI, "when encoding a string with existing encodings to upcase" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component("JK%4c", "0-9A-IKM-Za-z%", "L")).to eq("%4AK%4C") + end +end + +describe Addressable::URI, "when encoding a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component("günther")).to eq("g%C3%BCnther") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component( + "günther", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ + )).to eq("g%C3%BCnther") + end +end + +describe Addressable::URI, "when form encoding a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.form_encode({"GivenName" => "René"})).to eq( + "GivenName=Ren%C3%A9" + ) + end +end + +describe Addressable::URI, "when encoding a string with ASCII chars 0-15" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component("one\ntwo")).to eq("one%0Atwo") + end + + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.encode_component( + "one\ntwo", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/ + )).to eq("one%0Atwo") + end +end + +describe Addressable::URI, "when unencoding a multibyte string" do + it "should result in correct percent encoded sequence" do + expect(Addressable::URI.unencode_component("g%C3%BCnther")).to eq("günther") + end + + it "should consistently use UTF-8 internally" do + expect(Addressable::URI.unencode_component("ski=%BA%DAɫ")).to eq("ski=\xBA\xDAɫ") + end + + it "should result in correct percent encoded sequence as a URI" do + expect(Addressable::URI.unencode( + "/path?g%C3%BCnther", ::Addressable::URI + )).to eq(Addressable::URI.new( + :path => "/path", :query => "günther" + )) + end +end + +describe Addressable::URI, "when partially unencoding a string" do + it "should unencode all characters by default" do + expect(Addressable::URI.unencode('%%25~%7e+%2b', String)).to eq('%%~~++') + end + + it "should unencode characters not in leave_encoded" do + expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '~')).to eq('%%~%7e++') + end + + it "should leave characters in leave_encoded alone" do + expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '%~+')).to eq('%%25~%7e+%2b') + end +end + +describe Addressable::URI, "when unencoding a bogus object" do + it "should raise a TypeError" do + expect do + Addressable::URI.unencode_component(42) + end.to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect do + Addressable::URI.unencode("/path?g%C3%BCnther", Integer) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when encoding a bogus object" do + it "should raise a TypeError" do + expect do + Addressable::URI.encode(Object.new) + end.to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect do + Addressable::URI.normalized_encode(Object.new) + end.to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect do + Addressable::URI.encode_component("günther", Object.new) + end.to raise_error(TypeError) + end + + it "should raise a TypeError" do + expect do + Addressable::URI.encode_component(Object.new) + end.to raise_error(TypeError) + end +end + +describe Addressable::URI, "when given the input " + + "'http://example.com/'" do + before do + @input = "http://example.com/" + end + + it "should heuristically parse to 'http://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should not raise error when frozen" do + expect do + Addressable::URI.heuristic_parse(@input).freeze.to_s + end.not_to raise_error + end +end + +describe Addressable::URI, "when given the input " + + "'https://example.com/'" do + before do + @input = "https://example.com/" + end + + it "should heuristically parse to 'https://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("https://example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http:example.com/'" do + before do + @input = "http:example.com/" + end + + it "should heuristically parse to 'http://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/") + end + + it "should heuristically parse to 'http://example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'https:example.com/'" do + before do + @input = "https:example.com/" + end + + it "should heuristically parse to 'https://example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("https://example.com/") + end + + it "should heuristically parse to 'https://example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("https://example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://example.com/example.com/'" do + before do + @input = "http://example.com/example.com/" + end + + it "should heuristically parse to 'http://example.com/example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://prefix\\.example.com/'" do + before do + @input = "http://prefix\\.example.com/" + end + + it "should heuristically parse to 'http://prefix/.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("prefix") + expect(@uri.to_s).to eq("http://prefix/.example.com/") + end + + it "should heuristically parse to 'http://prefix/.example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://prefix/.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://p:\\/'" do + before do + @input = "http://p:\\/" + end + + it "should heuristically parse to 'http://p//'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("p") + expect(@uri.to_s).to eq("http://p//") + end + + it "should heuristically parse to 'http://p//' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://p//") + end +end + +describe Addressable::URI, "when given the input " + + "'http://p://'" do + before do + @input = "http://p://" + end + + it "should heuristically parse to 'http://p//'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("p") + expect(@uri.to_s).to eq("http://p//") + end + + it "should heuristically parse to 'http://p//' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://p//") + end +end + +describe Addressable::URI, "when given the input " + + "'http://p://p'" do + before do + @input = "http://p://p" + end + + it "should heuristically parse to 'http://p//p'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("p") + expect(@uri.to_s).to eq("http://p//p") + end + + it "should heuristically parse to 'http://p//p' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://p//p") + end +end + +describe Addressable::URI, "when given the input " + + "'http://prefix .example.com/'" do + before do + @input = "http://prefix .example.com/" + end + + # Justification here being that no browser actually tries to resolve this. + # They all treat this as a web search. + it "should heuristically parse to 'http://prefix%20.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("prefix%20.example.com") + expect(@uri.to_s).to eq("http://prefix%20.example.com/") + end + + it "should heuristically parse to 'http://prefix%20.example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://prefix%20.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "' http://www.example.com/ '" do + before do + @input = " http://www.example.com/ " + end + + it "should heuristically parse to 'http://prefix%20.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.scheme).to eq("http") + expect(@uri.path).to eq("/") + expect(@uri.to_s).to eq("http://www.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'http://prefix%2F.example.com/'" do + before do + @input = "http://prefix%2F.example.com/" + end + + it "should heuristically parse to 'http://prefix%2F.example.com/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.authority).to eq("prefix%2F.example.com") + expect(@uri.to_s).to eq("http://prefix%2F.example.com/") + end + + it "should heuristically parse to 'http://prefix%2F.example.com/' " + + "even with a scheme hint of 'ftp'" do + @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'}) + expect(@uri.to_s).to eq("http://prefix%2F.example.com/") + end +end + +describe Addressable::URI, "when given the input " + + "'/path/to/resource'" do + before do + @input = "/path/to/resource" + end + + it "should heuristically parse to '/path/to/resource'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("/path/to/resource") + end +end + +describe Addressable::URI, "when given the input " + + "'relative/path/to/resource'" do + before do + @input = "relative/path/to/resource" + end + + it "should heuristically parse to 'relative/path/to/resource'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("relative/path/to/resource") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com'" do + before do + @input = "example.com" + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com' and a scheme hint of 'ftp'" do + before do + @input = "example.com" + @hints = {:scheme => 'ftp'} + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input, @hints) + expect(@uri.to_s).to eq("ftp://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com:21' and a scheme hint of 'ftp'" do + before do + @input = "example.com:21" + @hints = {:scheme => 'ftp'} + end + + it "should heuristically parse to 'http://example.com:21'" do + @uri = Addressable::URI.heuristic_parse(@input, @hints) + expect(@uri.to_s).to eq("ftp://example.com:21") + end +end + +describe Addressable::URI, "when given the input " + + "'example.com/path/to/resource'" do + before do + @input = "example.com/path/to/resource" + end + + it "should heuristically parse to 'http://example.com/path/to/resource'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com/path/to/resource") + end +end + +describe Addressable::URI, "when given the input " + + "'http:///example.com'" do + before do + @input = "http:///example.com" + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com") + end +end + +describe Addressable::URI, "when given the input which "\ + "start with digits and has specified port" do + before do + @input = "7777.example.org:8089" + end + + it "should heuristically parse to 'http://7777.example.org:8089'" do + uri = Addressable::URI.heuristic_parse(@input) + expect(uri.to_s).to eq("http://7777.example.org:8089") + end +end + +describe Addressable::URI, "when given the input " + + "'feed:///example.com'" do + before do + @input = "feed:///example.com" + end + + it "should heuristically parse to 'feed://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("feed://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "'file://localhost/path/to/resource/'" do + before do + @input = "file://localhost/path/to/resource/" + end + + it "should heuristically parse to 'file:///path/to/resource/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("file:///path/to/resource/") + end +end + +describe Addressable::URI, "when given the input " + + "'file://path/to/resource/'" do + before do + @input = "file://path/to/resource/" + end + + it "should heuristically parse to 'file:///path/to/resource/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("file:///path/to/resource/") + end +end + +describe Addressable::URI, "when given the input " + + "'file://///path/to/resource/'" do + before do + @input = "file:///////path/to/resource/" + end + + it "should heuristically parse to 'file:////path/to/resource/'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("file:////path/to/resource/") + end +end + +describe Addressable::URI, "when given the input " + + "'feed://http://example.com'" do + before do + @input = "feed://http://example.com" + end + + it "should heuristically parse to 'feed:http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("feed:http://example.com") + end +end + +describe Addressable::URI, "when given the input " + + "::URI.parse('http://example.com')" do + before do + @input = ::URI.parse('http://example.com') + end + + it "should heuristically parse to 'http://example.com'" do + @uri = Addressable::URI.heuristic_parse(@input) + expect(@uri.to_s).to eq("http://example.com") + end +end + +describe Addressable::URI, "when given the input: 'user@domain.com'" do + before do + @input = "user@domain.com" + end + + context "for heuristic parse" do + it "should remain 'mailto:user@domain.com'" do + uri = Addressable::URI.heuristic_parse("mailto:#{@input}") + expect(uri.to_s).to eq("mailto:user@domain.com") + end + + it "should have a scheme of 'mailto'" do + uri = Addressable::URI.heuristic_parse(@input) + expect(uri.to_s).to eq("mailto:user@domain.com") + expect(uri.scheme).to eq("mailto") + end + + it "should remain 'acct:user@domain.com'" do + uri = Addressable::URI.heuristic_parse("acct:#{@input}") + expect(uri.to_s).to eq("acct:user@domain.com") + end + + context "HTTP" do + before do + @uri = Addressable::URI.heuristic_parse("http://#{@input}/") + end + + it "should remain 'http://user@domain.com/'" do + expect(@uri.to_s).to eq("http://user@domain.com/") + end + + it "should have the username 'user' for HTTP basic authentication" do + expect(@uri.user).to eq("user") + end + end + end +end + +describe Addressable::URI, "when assigning query values" do + before do + @uri = Addressable::URI.new + end + + it "should correctly assign {:a => 'a', :b => ['c', 'd', 'e']}" do + @uri.query_values = {:a => "a", :b => ["c", "d", "e"]} + expect(@uri.query).to eq("a=a&b=c&b=d&b=e") + end + + it "should raise an error attempting to assign {'a' => {'b' => ['c']}}" do + expect do + @uri.query_values = { 'a' => {'b' => ['c'] } } + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:b => '2', :a => {:c => '1'}}" do + expect do + @uri.query_values = {:b => '2', :a => {:c => '1'}} + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => [{:c => 'c', :d => 'd'}, " + + "{:e => 'e', :f => 'f'}]}" do + expect do + @uri.query_values = { + :a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}] + } + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => [{:c => true, :d => 'd'}, " + + "{:e => 'e', :f => 'f'}]}" do + expect do + @uri.query_values = { + :a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}] + } + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => {:c => true, :d => 'd'}}" do + expect do + @uri.query_values = { + :a => 'a', :b => {:c => true, :d => 'd'} + } + end.to raise_error(TypeError) + end + + it "should raise an error attempting to assign " + + "{:a => 'a', :b => {:c => true, :d => 'd'}}" do + expect do + @uri.query_values = { + :a => 'a', :b => {:c => true, :d => 'd'} + } + end.to raise_error(TypeError) + end + + it "should correctly assign {:a => 1, :b => 1.5}" do + @uri.query_values = { :a => 1, :b => 1.5 } + expect(@uri.query).to eq("a=1&b=1.5") + end + + it "should raise an error attempting to assign " + + "{:z => 1, :f => [2, {999.1 => [3,'4']}, ['h', 'i']], " + + ":a => {:b => ['c', 'd'], :e => true, :y => 0.5}}" do + expect do + @uri.query_values = { + :z => 1, + :f => [ 2, {999.1 => [3,'4']}, ['h', 'i'] ], + :a => { :b => ['c', 'd'], :e => true, :y => 0.5 } + } + end.to raise_error(TypeError) + end + + it "should correctly assign {}" do + @uri.query_values = {} + expect(@uri.query).to eq('') + end + + it "should correctly assign nil" do + @uri.query_values = nil + expect(@uri.query).to eq(nil) + end + + it "should correctly sort {'ab' => 'c', :ab => 'a', :a => 'x'}" do + @uri.query_values = {'ab' => 'c', :ab => 'a', :a => 'x'} + expect(@uri.query).to eq("a=x&ab=a&ab=c") + end + + it "should correctly assign " + + "[['b', 'c'], ['b', 'a'], ['a', 'a']]" do + # Order can be guaranteed in this format, so preserve it. + @uri.query_values = [['b', 'c'], ['b', 'a'], ['a', 'a']] + expect(@uri.query).to eq("b=c&b=a&a=a") + end + + it "should preserve query string order" do + query_string = (('a'..'z').to_a.reverse.map { |e| "#{e}=#{e}" }).join("&") + @uri.query = query_string + original_uri = @uri.to_s + @uri.query_values = @uri.query_values(Array) + expect(@uri.to_s).to eq(original_uri) + end + + describe 'when a hash with mixed types is assigned to query_values' do + it 'should not raise an error' do + skip 'Issue #94' + expect { subject.query_values = { "page" => "1", :page => 2 } }.to_not raise_error + end + end +end + +describe Addressable::URI, "when assigning path values" do + before do + @uri = Addressable::URI.new + end + + it "should correctly assign paths containing colons" do + @uri.path = "acct:bob@sporkmonger.com" + expect(@uri.path).to eq("acct:bob@sporkmonger.com") + expect(@uri.normalize.to_str).to eq("acct%2Fbob@sporkmonger.com") + expect { @uri.to_s }.to raise_error( + Addressable::URI::InvalidURIError + ) + end + + it "should correctly assign paths containing colons" do + @uri.path = "/acct:bob@sporkmonger.com" + @uri.authority = "example.com" + expect(@uri.normalize.to_str).to eq("//example.com/acct:bob@sporkmonger.com") + end + + it "should correctly assign paths containing colons" do + @uri.path = "acct:bob@sporkmonger.com" + @uri.scheme = "something" + expect(@uri.normalize.to_str).to eq("something:acct:bob@sporkmonger.com") + end + + it "should not allow relative paths to be assigned on absolute URIs" do + expect do + @uri.scheme = "http" + @uri.host = "example.com" + @uri.path = "acct:bob@sporkmonger.com" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow relative paths to be assigned on absolute URIs" do + expect do + @uri.path = "acct:bob@sporkmonger.com" + @uri.scheme = "http" + @uri.host = "example.com" + end.to raise_error(Addressable::URI::InvalidURIError) + end + + it "should not allow relative paths to be assigned on absolute URIs" do + expect do + @uri.path = "uuid:0b3ecf60-3f93-11df-a9c3-001f5bfffe12" + @uri.scheme = "urn" + end.not_to raise_error + end +end + +describe Addressable::URI, "when initializing a subclass of Addressable::URI" do + before do + @uri = Class.new(Addressable::URI).new + end + + it "should have the same class after being parsed" do + expect(@uri.class).to eq(Addressable::URI.parse(@uri).class) + end + + it "should have the same class as its duplicate" do + expect(@uri.class).to eq(@uri.dup.class) + end + + it "should have the same class after being normalized" do + expect(@uri.class).to eq(@uri.normalize.class) + end + + it "should have the same class after being merged" do + expect(@uri.class).to eq(@uri.merge(:path => 'path').class) + end + + it "should have the same class after being joined" do + expect(@uri.class).to eq(@uri.join('path').class) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/spec_helper.rb new file mode 100644 index 000000000000..bd8e39588476 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/spec/spec_helper.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'bundler/setup' +require 'rspec/its' + +begin + require 'coveralls' + Coveralls.wear! do + add_filter "spec/" + add_filter "vendor/" + end +rescue LoadError + warn "warning: coveralls gem not found; skipping Coveralls" + require 'simplecov' + SimpleCov.start do + add_filter "spec/" + add_filter "vendor/" + end +end if Gem.loaded_specs.key?("simplecov") + +class TestHelper + def self.native_supported? + mri = RUBY_ENGINE == "ruby" + windows = RUBY_PLATFORM.include?("mingw") + + mri && !windows + end +end + +RSpec.configure do |config| + config.warnings = true + config.filter_run_when_matching :focus +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/clobber.rake b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/clobber.rake new file mode 100644 index 000000000000..a9e32b3476b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/clobber.rake @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +desc "Remove all build products" +task "clobber" diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/gem.rake b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/gem.rake new file mode 100644 index 000000000000..1f793baf3fb6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/gem.rake @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +require "rubygems/package_task" + +namespace :gem do + GEM_SPEC = Gem::Specification.new do |s| + s.name = PKG_NAME + s.version = PKG_VERSION + s.summary = PKG_SUMMARY + s.description = PKG_DESCRIPTION + + s.files = PKG_FILES.to_a + + s.extra_rdoc_files = %w( README.md ) + s.rdoc_options.concat ["--main", "README.md"] + + if !s.respond_to?(:add_development_dependency) + puts "Cannot build Gem with this version of RubyGems." + exit(1) + end + + s.required_ruby_version = ">= 2.0" + + s.add_runtime_dependency "public_suffix", ">= 2.0.2", "< 5.0" + s.add_development_dependency "bundler", ">= 1.0", "< 3.0" + + s.require_path = "lib" + + s.author = "Bob Aman" + s.email = "bob@sporkmonger.com" + s.homepage = "https://github.com/sporkmonger/addressable" + s.license = "Apache-2.0" + end + + Gem::PackageTask.new(GEM_SPEC) do |p| + p.gem_spec = GEM_SPEC + p.need_tar = true + p.need_zip = true + end + + desc "Generates .gemspec file" + task :gemspec do + spec_string = GEM_SPEC.to_ruby + File.open("#{GEM_SPEC.name}.gemspec", "w") do |file| + file.write spec_string + end + end + + desc "Show information about the gem" + task :debug do + puts GEM_SPEC.to_ruby + end + + desc "Install the gem" + task :install => ["clobber", "gem:package"] do + sh "#{SUDO} gem install --local pkg/#{GEM_SPEC.full_name}" + end + + desc "Uninstall the gem" + task :uninstall do + installed_list = Gem.source_index.find_name(PKG_NAME) + if installed_list && + (installed_list.collect { |s| s.version.to_s}.include?(PKG_VERSION)) + sh( + "#{SUDO} gem uninstall --version '#{PKG_VERSION}' " + + "--ignore-dependencies --executables #{PKG_NAME}" + ) + end + end + + desc "Reinstall the gem" + task :reinstall => [:uninstall, :install] + + desc "Package for release" + task :release => ["gem:package", "gem:gemspec"] do |t| + v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z" + abort "Versions don't match #{v} vs #{PROJ.version}" if v != PKG_VERSION + pkg = "pkg/#{GEM_SPEC.full_name}" + + changelog = File.open("CHANGELOG.md") { |file| file.read } + + puts "Releasing #{PKG_NAME} v. #{PKG_VERSION}" + Rake::Task["git:tag:create"].invoke + end +end + +desc "Alias to gem:package" +task "gem" => "gem:package" + +task "gem:release" => "gem:gemspec" + +task "clobber" => ["gem:clobber_package"] diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/git.rake b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/git.rake new file mode 100644 index 000000000000..1238c8d2146d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/git.rake @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +namespace :git do + namespace :tag do + desc "List tags from the Git repository" + task :list do + tags = `git tag -l` + tags.gsub!("\r", "") + tags = tags.split("\n").sort {|a, b| b <=> a } + puts tags.join("\n") + end + + desc "Create a new tag in the Git repository" + task :create do + changelog = File.open("CHANGELOG.md", "r") { |file| file.read } + puts "-" * 80 + puts changelog + puts "-" * 80 + puts + + v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z" + abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION + + git_status = `git status` + if git_status !~ /^nothing to commit/ + abort "Working directory isn't clean." + end + + tag = "#{PKG_NAME}-#{PKG_VERSION}" + msg = "Release #{PKG_NAME}-#{PKG_VERSION}" + + existing_tags = `git tag -l #{PKG_NAME}-*`.split('\n') + if existing_tags.include?(tag) + warn("Tag already exists, deleting...") + unless system "git tag -d #{tag}" + abort "Tag deletion failed." + end + end + puts "Creating git tag '#{tag}'..." + unless system "git tag -a -m \"#{msg}\" #{tag}" + abort "Tag creation failed." + end + end + end +end + +task "gem:release" => "git:tag:create" diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/metrics.rake b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/metrics.rake new file mode 100644 index 000000000000..107cc2442a65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/metrics.rake @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +namespace :metrics do + task :lines do + lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 + for file_name in FileList["lib/**/*.rb"] + f = File.open(file_name) + while line = f.gets + lines += 1 + next if line =~ /^\s*$/ + next if line =~ /^\s*#/ + codelines += 1 + end + puts "L: #{sprintf("%4d", lines)}, " + + "LOC #{sprintf("%4d", codelines)} | #{file_name}" + total_lines += lines + total_codelines += codelines + + lines, codelines = 0, 0 + end + + puts "Total: Lines #{total_lines}, LOC #{total_codelines}" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/profile.rake b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/profile.rake new file mode 100644 index 000000000000..b697d489dd70 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/profile.rake @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +namespace :profile do + desc "Profile Template match memory allocations" + task :template_match_memory do + require "memory_profiler" + require "addressable/template" + + start_at = Time.now.to_f + template = Addressable::Template.new("http://example.com/{?one,two,three}") + report = MemoryProfiler.report do + 30_000.times do + template.match( + "http://example.com/?one=one&two=floo&three=me" + ) + end + end + end_at = Time.now.to_f + print_options = { scale_bytes: true, normalize_paths: true } + puts "\n\n" + + if ENV["CI"] + report.pretty_print(print_options) + else + t_allocated = report.scale_bytes(report.total_allocated_memsize) + t_retained = report.scale_bytes(report.total_retained_memsize) + + puts "Total allocated: #{t_allocated} (#{report.total_allocated} objects)" + puts "Total retained: #{t_retained} (#{report.total_retained} objects)" + puts "Took #{end_at - start_at} seconds" + + FileUtils.mkdir_p("tmp") + report.pretty_print(to_file: "tmp/memprof.txt", **print_options) + end + end + + desc "Profile URI parse memory allocations" + task :memory do + require "memory_profiler" + require "addressable/uri" + if ENV["IDNA_MODE"] == "pure" + Addressable.send(:remove_const, :IDNA) + load "addressable/idna/pure.rb" + end + + start_at = Time.now.to_f + report = MemoryProfiler.report do + 30_000.times do + Addressable::URI.parse( + "http://google.com/stuff/../?with_lots=of¶ms=asdff#!stuff" + ).normalize + end + end + end_at = Time.now.to_f + print_options = { scale_bytes: true, normalize_paths: true } + puts "\n\n" + + if ENV["CI"] + report.pretty_print(**print_options) + else + t_allocated = report.scale_bytes(report.total_allocated_memsize) + t_retained = report.scale_bytes(report.total_retained_memsize) + + puts "Total allocated: #{t_allocated} (#{report.total_allocated} objects)" + puts "Total retained: #{t_retained} (#{report.total_retained} objects)" + puts "Took #{end_at - start_at} seconds" + + FileUtils.mkdir_p("tmp") + report.pretty_print(to_file: "tmp/memprof.txt", **print_options) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/rspec.rake b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/rspec.rake new file mode 100644 index 000000000000..e3d9f014c819 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/rspec.rake @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require "rspec/core/rake_task" + +namespace :spec do + RSpec::Core::RakeTask.new(:simplecov) do |t| + t.pattern = FileList['spec/**/*_spec.rb'] + t.rspec_opts = %w[--color --format documentation] unless ENV["CI"] + end + + namespace :simplecov do + desc "Browse the code coverage report." + task :browse => "spec:simplecov" do + require "launchy" + Launchy.open("coverage/index.html") + end + end +end + +desc "Alias to spec:simplecov" +task "spec" => "spec:simplecov" + +task "clobber" => ["spec:clobber_simplecov"] diff --git a/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/yard.rake b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/yard.rake new file mode 100644 index 000000000000..515f9603018c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/addressable-2.8.0/tasks/yard.rake @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require "rake" + +begin + require "yard" + require "yard/rake/yardoc_task" + + namespace :doc do + desc "Generate Yardoc documentation" + YARD::Rake::YardocTask.new do |yardoc| + yardoc.name = "yard" + yardoc.options = ["--verbose", "--markup", "markdown"] + yardoc.files = FileList[ + "lib/**/*.rb", "ext/**/*.c", + "README.md", "CHANGELOG.md", "LICENSE.txt" + ].exclude(/idna/) + end + end + + task "clobber" => ["doc:clobber_yard"] + + desc "Alias to doc:yard" + task "doc" => "doc:yard" +rescue LoadError + # If yard isn't available, it's not the end of the world + desc "Alias to doc:rdoc" + task "doc" => "doc:rdoc" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/CHANGELOG.md new file mode 100644 index 000000000000..9418e522ba3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/CHANGELOG.md @@ -0,0 +1,1158 @@ +# Change Log + +## 9.8.6.5 +* Fix `9.8.6.4` regression. + +## 9.8.6.4 +* Remove deprecation warnings. + +## 9.8.6.3 +* Fix deprecation warning for non-Rails environment. + +## 9.8.6.2 +* Print deprecation warning only once. + +## 9.8.6.1 +* Improve deprecated warnings. + +## 9.8.6 +* Fixed `env` option. +* Added deprecation warning. + +## 9.8.5 +* Improved Grid Layout warnings (by Daniel Tonon). + +## 9.8.4 +* Reduce JS bundle size. + +## 9.8.3 +* Update Can I Use data. + +## 9.8.2 +* Update Can I Use data. + +## 9.8.1 +* Replace `chalk` to `kleur` (by Luke Edwards). + +## 9.8 “Vigilo Confido” +* Add `:placeholder-shown` support (by Tanguy Krotoff). + +## 9.7.6 +* Revert `-webkit-stretch` fix. + +## 9.7.5 +* Fix `-webkit-stretch` support. +* Reduce gem file size. + +## 9.7.4 +* Update Can I Use data. + +## 9.7.3 +* Update Can I Use data. + +## 9.7.2 +* Add `-ms-user-select: element` support. + +## 9.7.1 +* Avoid unnecessary transitions in prefixed selectors (by Andrey Alexandrov). +* Fix `fit-content` for Firefox. + +## 9.7 “Ad Victoriam” +* Add `AUTOPREFIXER_GRID` env variable to enable Grid Layout polyfill for IE. +* Fix `Cannot read property 'grid' of undefined` error. + +## 9.6.5 +* Fix selector prefixing (by Andrey Alexandrov). + +## 9.6.4 +* Now the real fix for `'startsWith' of undefined` error. + +## 9.6.3 +* Fix `Cannot read property 'startsWith' of undefined` error. + +## 9.6.2 +* Fix false `Replace fill to stretch` warning. + +## 9.6.1.1 +* Update Can I Use data. + +## 9.6.1 +* Fix `-webkit-line-clamp` truncating multi-line text support. + +## 9.6 “Nunc id vides, nunc ne vides” +* Add warning-less `overrideBrowserslist` option. +* Add `text-orientation` support. +* Add `min-resolution: 2x` alias support. + +## 9.5.1.1 +* Fix `register_postprocessor' for nil:NilClass` error. +* Update Can I Use data. + +## 9.5.1 +* Fix `backdrop-filter` for Edge (by Oleh Aloshkin). +* Fix `min-resolution` media query support in Firefox < 16. + +## 9.5 “Draco dormiens nunquam titillandus” +* Add `mask-composite` support (by Semen Levenson). + +## 9.4.10.2 +* Fix Ruby < 2.4 support (by Jack Ford). +* Update Can I Use data. + +## 9.4.10.1 +* Fix non-Rails environments support (by Junya Ogura). +* Update Can I Use data. + +## 9.4.10 +* Add warning for named Grid rows. + +## 9.4.9 +* Fix `grid-template` and `@media` case (by Bogdan Dolin). + +## 9.4.8 +* Fix `calc()` support in Grid gap. + +## 9.4.7 +* Fix infinite loop on mismatched parens. + +## 9.4.6 +* Fix warning text (by Albert Juhé Lluveras). + +## 9.4.5 +* Fix `text-decoration-skip-ink` support. + +## 9.4.4 +* Use `direction` value for `-ms-writing-mode` (by Denys Kniazevych). +* Fix warning text (by @zzzzBov). + +## 9.4.3 +* Add warning to force `flex-start` instead of `start` (by Antoine du Hamel). + +## 9.4.2 +* Fix Grid autoplacement warning. + +## 9.4.1 +* Fix unnecessary Flexbox prefixes in Grid elements. + +## 9.4 “Advance Australia” +* Add Grid autoplacement for `-ms-` (by Bogdan Dolin). +* Improve warnings (by Daniel Tonon). +* Remove some unnecessary warnings for Grid (by Andrey Alexandrov). + +## 9.3.1 +* Fix Grid prefixes with `repeat()` value (by Bogdan Dolin). + +## 9.3 “Labor omnia vincit” +* Add `place-self` support (by Bogdan Dolin). +* Fix Grid row/column span inheritance bug (by Bogdan Dolin). + +## 9.2.1 +* Update Can I Use data. + +## 9.2 “Ony est glavnaya krepost” +* Add `/* autoprefixer grid: on */` control comment (by Andrey Alexandrov). +* Add duplicate `grid-area` support (by Bogdan Dolin). +* Fix `grid-gap` support for rules with different specifity (by Bogdan Dolin). +* Disable Grid in `@supports` at-rule with non-supported Grid features. +* Improve Grid warnings (by Daniel Tonon). + +## 9.1.4 +* Fix `ExecJS` runtime test (by Patrice Chalin). + +## 9.1.3 +* Sort properties in `rake autoprefixer` alphabetically. +* Fix old Firefox gradient prefix. + +## 9.1.2 +* Fix `autoprefixer --info` in new Node.js. +* Fix ExecJS runtime warning. + +## 9.1.1 +* Retain `grid-gap` through `@media` (by Bogdan Dolin). +* Fix `grid-template` and `@media` (by Bogdan Dolin). +* Fix Grid areas searching error (by Bogdan Dolin). +* Fix `span X` Grid prefix (by Bogdan Dolin). +* Fix `log2` error. + +## 9.1 “Equality before the law” +* Add `background-clip: text` support. +* Fix adding Grid span for IE (by Bogdan). + +## 9.0.2 +* Show warning on Grid area names conflict (by Bogdan). +* Fix ExecJS warning (by Jan Kmet). + +## 9.0.1 +* Fix nested at-rules in Grid prefixes (by Ivan Malov). + +## 9.0 “A Mari Usque Ad Mare” +* Remove Node.js 9 and Node.js 4 support. +* Remove RubyRacer and Sprockets 3 support. +* Use PostCSS 7.0. +* Use Browserslist 4.0. + +## 8.6.5 +* Do not show Grid warnings if IE was not selected. + +## 8.6.4 +* Fix `stretch` prefix in Chrome >= 46. + +## 8.6.3 +* Add warnings for unsupported Grid features. +* Add warnings about wrong Grid properties. +* Add note about `grid` option for grid properties in `rake autoprefixer`. + +## 8.6.2 +* Fix error during adding Grid prefixes in `@media` (by Evgeny Petukhov). + +## 8.6.1 +* Fix `grid-template` with media queries (by Evgeny Petukhov). + +## 8.6 “Follow Reason” +* Add `gap` support (by Evgeny Petukhov). +* Add two values support for `grid-gap` and `gap` (by Evgeny Petukhov). + +## 8.5.2 +* Fix `grid-template` support wit auto row sizes (by Yury Timofeev). + +## 8.5.1 +* Remove unnecessary warning on `-webkit-fill-available`. + +## 8.5 “Muito Nobre e Sempre Leal” +* Add `grid-gap` support (by Evgeny Petukhov). +* Fix radial gradients direction fix. + +## 8.4.1 +* Fix non-related to Ruby issue. + +## 8.4 “Non in aves, sed in angues” +* Add `/* autoprefixer: ignore next */` control comment (by Pavel Vostrikov). + +## 8.3.0.1 +* Remove Opera Mobile 12.1 from default browsers. +* Update Can I Use data. + +## 8.3 “Benigno Numine” +* Add `@media` support to `grid-template` (by Evgeny Petukhov). +* Fix `radial-gradient` direction warning (by Gustavo Real). + +## 8.2 “Ad Astra per Aspera” +* Add `color-adjust` (by Sergey Lysenko, Stanislav Botev, and Yuriy Alekseyev). + +## 8.1.0.1 +* Add more clear error on missed browser version. + +## 8.1 “Rex, Familia et Ultio” +* Add `overscroll-behavior` support. +* Add `grid-template` shortcut support (by Evgeny Petukhov). +* Add better `grid-column-end` and `grid-row-end` support (by Evgeny Petukhov). +* Fix Grid properties support in `@supports`. + +## 8.0 “Excelsior” +* Use Browserslist 3.0. +* Remove `break-*` to `page-break-*` conversion for Firefox. + +## 7.2.6 +* Fix `-ms-` prefix for grid cells with same `grid-area` (by Evgeny Petukhov). + +## 7.2.5 +* Fix multiple prefixes in declaration value. + +## 7.2.4 +* Update Can I Use data. + +## 7.2.3 +* Fix `grid-template-areas` in `@media` (by Evgeny Petukhov). + +## 7.2.2 +* Fix `_autoprefixerDisabled is undefined` issue. + +## 7.2.1 +* Fix IE and other old JS runtimes support. + +## 7.2 “Ordem e Progresso” +* Add `grid-template-areas` support (by Evgeny Petukhov). +* Add `grid-template` support (by Evgeny Petukhov). +* Add `grid-area` support (by Alexey Komarov). +* Add `autoprefixer-info` CLI tool. +* Add wrong `radial-gradient` properties warning. +* Use current working dir on missed `from` in `info()` (by Phil Dokas). +* Fix `grid-row` and `grid-column` support (by Alexey Komarov). +* Do not prefix `reverse` animation direction. +* Improve test coverage (by Dmitry Semigradsky). + +## 7.1.6 +* Add warning for using `browserslist` option instead of `browsers`. +* Add warning for multiple control comments in the same scope. +* Fix `Invalid array length` error during indent changes. + +## 7.1.5 +* Fix `::placeholder` prefix for Edge. +* Fix `inherit`/`initial`/`unset` values for `flex-direction`. +* Fix RegExp usage in gradients (by Yet Another Minion). + +## 7.1.4.1 +* Update PostCSS. +* Update Can I Use data. + +## 7.1.4 +* Fix `radial-gradient` direction conversion. +* Fix `image-set` in `cursor`. + +## 7.1.3 +* Add warning for old `radial-gradient` direction syntax. +* Add `last n major versions` browser query. + +## 7.1.2.6 +* Fix `.browserslistrc` support + +## 7.1.2.5 +* Fix `> 0` query for browsers with one version. +* Update Can I Use data. + +## 7.1.2.4 +* Add `unreleased versions` and `unreleased Chrome versions` browsers queries. +* Update Can I Use data. + +## 7.1.2.3 +* Add region usage statistics support. +* Fix base64 decoding for old Node.js. +* Update Can I Use data. + +## 7.1.2.2 +* Fix working with empty `autoprefixer.yml` (by Murahashi Kenichi). + +## 7.1.2.1 +* Fix loading `autoprefixer.yml` from engines (by Jim Ryan). + +## 7.1.2 +* Fix `text-decoration` shortcut support. + +## 7.1.1.3 +* Update Can I Use data. +* Update PostCSS. + +## 7.1.1.2 +* Update Can I Use data. +* Update Browserslist. + +## 7.1.1.1 +* Update Can I Use data. +* Update Browserslist. +* Update PostCSS. + +## 7.1.1 +* Remove non-`-webkit-` intrinsic prefixes in Grid Layout (by 一丝). + +## 7.1 “Universitas litterarum” +* Add `unicode-bidi` support. +* Add `-webkit-appearance` support for Edge. +* Fix intrinsic widths prefixes in Grid Layout. + +## 7.0.1 +* Fix `therubyracer` support. + +## 7.0 “Coelestem adspicit lucem” +* Remove node.js 0.12 support. +* Use PostCSS 6.0. +* Use Browserslist 2. +* Use `caniuse-lite` instead of `caniuse-db` (by Ben Briggs). +* Rewrite project from CoffeeScript to Babel (by Dmitry Semigradsky). +* Disable Grid Layout prefixes for IE by default. +* Fix `-ms-grid-column-align`. + +## 6.7.7.2 +* Update Can I Use data. +* Update PostCSS. + +## 6.7.7.1 +* Update Firefox ESR. +* Update Can I Use data. + +## 6.7.7 +* Fix `order` for non-digit values. + +## 6.7.6 +* Fix `font-kerning` (by Chi Vinh Le). + +## 6.7.5 +* Fix `text-decoration-skip` in iOS (by Chi Vinh Le). +* Fix `clip-path` (by Chi Vinh Le). + +## 6.7.4 +* Improve `browsers` option perfomance. +* Update CoffeeScript compiler. + +## 6.7.3 +* Fix compatibility with “Intrinsic & Extrinsic Sizing” spec update. + +## 6.7.2 +* Do not prefix grid/flexbox in `@supports` on `grid: false`/`flexbox: false`. + +## 6.7.1 +* Update Browserslist to fix `last n version` query. +* Update Can I Use data. + +## 6.7 “Krungthep doot thep saang” +* Add Electron support in browsers list (by Kilian Valkhof). +* Add `flex-flow` partial support for Flexbox 2009 specification. +* Fix browsers `0` version issue in some Can I Use data. + +## 6.6.1 +* Update Can I Use data. + +## 6.6 “Kaiyuan” +* Add support for separated environments in browserslist config. + +## 6.5.4 +* Fix unitless 0 basis in IE10/IE11 shorthand flex (by Google). + +## 6.5.3.1 +* Update PostCSS to 5.2.6. +* Update Can I Use data. + +## 6.5.3 +* Add error for popular mistake with `browser` option instead of `browsers`. + +## 6.5.2 +* Clean prefixes data (by Reinaldo Schiehll). + +## 6.5.1.1 +* Better syntax error messages with PostCSS 5.2.5. +* Update Can I Use data. + +## 6.5.1 +* Fix selectors with `:--` prefix support. + +## 6.5.0.2 +* Better CSS highlight by PostCSS 5.2.4. +* Update Can I Use data. + +## 6.5.0.1 +* Better syntax error output by PostCSS 5.2.3. +* Update Can I Use data. + +## 6.5 “Einigkeit und Recht und Freiheit” +* Add `defaults` keyword to browsers requirements. +* Fix CSS Grid Layout support. +* Fix `align-self` cleaning. + +## 6.4.1.1 +* Better syntax error output by PostCSS 5.2. +* Update Can I Use data. + +## 6.4.1 +* Fix node cloning. + +## 6.4.0.3 +* Update Browserslist. +* Update Can I Use data. + +## 6.4.0.2 +* Fix `autoprefixer.js` loading path in some cases (by Pavan Trikutam) +* Update Can I Use data. + +## 6.4.0.1 +* Fix Sprockets 3 support (by Eda Riedl). + +## 6.4 “Hic et ubique terrarum” +* Add `:any-link` selector support. +* Add `text-decoration-skip` support. +* Add `transition: duration property` support. +* Fix `-webkit-` prefix for `backface-visibility`. +* Fix `rad` unit support in gradients (by 刘祺). +* Fix `transition` support in Opera 12. +* Fix warning in Sprokets 3. +* Removed Safari TP Grid prefixes support. + +## 6.3.7 +* Fix `browserslist` path detection (by Jose Luis Salas). +* Fix rare `Cannot read property 'constructor' of null` issue. +* Add space-less `>1%` and `>.5%` syntax support. +* Clean `0` versions in some country-based requests. +* Update Can I Use data. + +## 6.3.6.2 +* Update Firefox ESR. +* Update Can I Use data. + +## 6.3.6.1 +* Fix source map for Sprockets 4 (by Richard Schneeman). + +## 6.3.6 +* Add Safari TP prefix support for Grid Layout. + +## 6.3.5 +* Fix duplicate prefixes for `-ms-interpolation-mode`. + +## 6.3.4 +* Show users coverage for selected browsers in `.info` and Rake task. + +## 6.3.3.1 +* Add Sprockets 4 support (by Richard Schneeman). +* Add `AutoprefixerRails.uninstall()`. +* Use `bundle_processor` for Sprockets 4 (by Adam Becker). +* Clean gem dependency from `json` (by deepj). + +## 6.3.3 +* Fix transition warning. + +## 6.3.2 +* Update Can I Use data. + +## 6.3.1 +* Fix compatibility with Flexibility polyfill. + +## 6.3 “Pro rege et lege” +* Add Grid Layout support. +* Add `text-spacing` support. +* Add `> 10% in my stats` browsers query with custom usage statistics. +* Add options to disable `@supports`, Flexbox or Grid support. +* Fix compatibility with other PostCSS plugins. + +## 6.2.3 +* Fix error on broken transition with double comma. + +## 6.2.2 +* Fix issues in broken transitions. + +## 6.2.1 +* Fix AST error in transition warning (by @jvdanilo). + +## 6.2 “Fluctuat nec mergitur” +* Use `fill` instead of `fill-available` according spec changes (by 一丝). +* Add `fill` support for logical dimension properties (by 一丝). +* Add `text-emphasis` support (by 一丝). +* Add prefixes to `@supports` only for compatible browsers. +* Add `rad`, `grad` and `turn` units support to linear gradients. +* Add some `deg` directions support for old WebKit linear gradients. +* Fix `@supports` parenthesis (by @heady). +* Fix Rails without Assets Pipeline support (by Zach Denton). +* Add warning when prefixes could not be generated + for complicated `transition-property` values. +* Add warning for outdated `fill-available` value. +* Add warning for wrong `text-emphasis-position` value. +* Add “time capsule” warning for prefix-less future. +* Normalizes all warning messages. + +## 6.1.2 +* Fix gradient hack on some parameters (by Alexey Efremov). + +## 6.1.1 +* Fix `cursor: grab` and `cusror: grabbing` support. + +## 6.1.0.1 +* Return old Rails integration to fix strange issues. + +## 6.1 “Bil-shaʿb wa lil-shaʿb” +* Change `transition` support to output more robust CSS. +* Add `:read-only` support. +* Add support for `appearance` with any values. +* Add loud `/*! autoprefixer: off */` control comments support. +* Convert `rotateZ` to `rotate` for `-ms-transform`. +* Use `postcss-value-parser` to carefully work with gradients. +* Remove `-ms-transform-style` and `-o-transform-style` that never existed. + +## 6.0.3 +* Fix old gradient direction warning. + +## 6.0.2 +* Remove unnecessary `-khtml-` prefix too. + +## 6.0.1 +* Fix `cross-fade()` support (by 一丝). + +## 6.0 “Eureka” +* Remove Ruby on Rails 3 support. +* Remove Ruby 1.9 support. +* Remove `safe` option. +* Remove Opera 12.1 from default query. +* Add `image-set` support (by 一丝). +* Add `mask-border` support (by 一丝). +* Add `filter()` function support (by Vincent De Oliveira). +* Add `backdrop-filter` support (by Vincent De Oliveira). +* Add `element()` support (by Vincent De Oliveira). +* Add CSS Regions support. +* Add Scroll Snap Points support. +* Add `writing-mode` support. +* Add `::backdrop` support. +* Add `cross-fade()` support. +* Add other `break-` properties support. +* Add Microsoft Edge support (by Andrey Polischuk). +* Add `not` keyword and exclude browsers by query. +* Add version ranges `IE 6-9` (by Ben Briggs). +* Fix `filter` in `transition` support on Safari. +* Fix `url()` parsing. +* Fix `pixelated` cleaning. +* Always show old gradient direction warning. + +## 5.2.1.3 +* Update Can I Use database. +* Update internal libraries. + +## 5.2.1.2 +* Update Can I Use database. +* Update internal libraries. + +## 5.2.1.1 +* Update Can I Use database. +* Update internal libraries. + +## 5.2.1 +* Fix parent-less node issue on some cases (by Josh Gillies) + +## 5.2.0.1 +* Update Can I Use database. + +## 5.2 “Dont tread on me” +* Add `appearance` support. +* Warn users on old gradient direction or flexbox syntax. +* Add `add: false` option to disable new prefixes adding. +* Make Autoprefixer 30% faster. +* Add prefixes for `pixelated` instead of `crisp-edges` in `image-rendering`. +* Do not add `::placeholder` prefixes for `:placeholder-shown`. +* Fix `text-decoration` prefixes. + +## 5.1.11 +* Update num2fraction to fix resolution media quuery (by 一丝). + +## 5.1.10 +* Do not generate `-webkit-image-rendering`. + +## 5.1.9 +* Fix DynJS compatibility (by Nick Howes). + +## 5.1.8.1 +* Update Can I Use database. + +## 5.1.8 +* Fix gradients in `mask` and `mask-image` properties. +* Fix old webkit prefix on some unsupported gradients. + +## 5.1.7.1 +* Update Can I Use database and JS libraries. +* Better support with Alaska runtime (by Jon Bardin). + +## 5.1.7 +* Fix placeholder selector (by Vincent De Oliveira). + +# 5.1.6 +* Use official `::placeholder-shown` selector (by Vincent De Oliveira). +* Fix problem with rails-html-sanitizer (by Alexey Vasiliev). + +# 5.1.5 +* Add transition support for CSS Masks properties. + +# 5.1.4 +* Use `-webkit-` prefix for Opera Mobile 24. + +# 5.1.3.1 +* Fix Rails 5 support (by Joshua Peek). + +# 5.1.3 +* Add IE support for `image-rendering: crisp-edges`. + +# 5.1.2 +* Add never existed `@-ms-keyframes` to common mistake. + +## 5.1.1 +* Safer value split in `flex` hack. + +## 5.1 “Jianyuan” +* Add support for resolution media query (by 一丝). +* Higher accuracy while removing prefixes in values. +* Add support for logical properties (by 一丝). +* Add `@viewport` support. +* Add `text-overflow` support (by 一丝). +* Add `text-emphasis` support (by 一丝). +* Add `image-rendering: crisp-edges` support. +* Add `text-align-last` support. +* Return `autoprefixer.defaults` as alias to current `browserslist.defaults`. +* Save code style while adding prefixes to `@keyframes` and `@viewport`. +* Do not remove `-webkit-background-clip` with non-spec `text` value. +* Fix `-webkit-filter` in `transition`. +* Better support for browser versions joined on Can I Use + like `ios_saf 7.0-7.1` (by Vincent De Oliveira). +* Fix compatibility with `postcss-import` (by Jason Kuhrt). +* Fix Flexbox prefixes for BlackBerry and UC Browser. +* Fix gradient prefixes for old Chrome. + +## 5.0.0.3 +* Fix error on `nil` in processor params. + +## 5.0.0.2 +* Fix for non-Rails environments. +* Add notice about unsupported ExecJS runtimes. +* Update Can I Use data. + +## 5.0.0.1 +* Fix issue on node.js runtime. + +## 5.0 “Pravda vítězí” +* Use PostCSS 4.0. +* Use Browserslist to parse browsers queries. +* Use global `browserslist` config. + Key `browsers` in `config/autoprefixer.yml` is now deprecated. +* Add `> 5% in US` query to select browsers by usage in some country. +* Add `object-fit` and `object-position` properties support. +* Add CSS Shape properties support. +* Fix UC Browser name in debug info. + +## 4.0.2.2 +* Update Can I Use data. +* Update some npm dependencies. + +## 4.0.2.1 +* Fix IE filter parsing with multiple commands. +* Update Can I Use dump. + +## 4.0.2 +* Remove `o-border-radius`, which is common mistake in legacy CSS. + +## 4.0.1.1 +* Use PostCSS 3.0.5 to parse complicated cases of CSS syntax. +* Update Can I Use dump. + +## 4.0.1 +* Fix `@supports` support with brackets in values (by Vincent De Oliveira). +* Fix Windows support (by Kamen Hursev). + +## 4.0.0.1 +* Update PostCSS to fix issue with empty comment. + +## 4.0 “Indivisibiliter ac Inseparabiliter” +* Become 2.5 times fatser by new PostCSS 3.0 parser. +* Do not remove outdated prefixes by `remove: false` option. +* `map.inline` and `map.sourcesContent` options are now `true` by default. +* Add `box-decoration-break` support. +* Do not add old `-webkit-` prefix for gradients with `px` units. +* Use previous source map to show origin source of CSS syntax error. +* Use `from` option from previous source map `file` field. +* Set `to` value to `from` if `to` option is missing. +* Trim Unicode BOM on source maps parsing. +* Parse at-rules without spaces like `@import"file"`. +* Better previous `sourceMappingURL` annotation comment cleaning. +* Do not remove previous `sourceMappingURL` comment on `map.annotation: false`. + +## 3.1.2 +* Update Firefox ESR version from 24 to 31. + +## 3.1.1 +* Use Flexbox 2009 spec for Android stock browser < 4.4. + +## 3.1 “Satyameva Jayate” +* Do not remove comments from prefixed values (by Eitan Rousso). +* Allow Safari 6.1 to use final Flexbox spec (by John Kreitlow). +* Fix `filter` value in `transition` in Webkits. +* Show greetings in Rake task if your browsers don’t require any prefixes. +* Add `<=` and `<` browsers requirement (by Andreas Lind). + +## 3.0.1 +* Update Can I Use data. + +## 3.0 “Liberté, Égalité, Fraternité” +* All methods now receive browsers as options key, not separated argument. +* GNU format for syntax error messages from PostCSS 2.2. + +## 2.2.20140804 +* Fix UTF-8 support in inline source maps. +* Allow to miss `from` and `to` options in inline source maps. +* Update Can I Use data. + +## 2.2 “Mobilis in mobili” +* Allow to disable Autoprefixer for some rule by control comment. +* Use PostCSS 2.1 with Safe Mode option and broken source line + in CSS syntax error messages. + +## 2.1.1 +* Fix `-webkit-background-size` hack for `contain` and `cover` values. +* Don’t add `-webkit-` prefix to `filter` with SVG (by Vincent De Oliveira). + +## 2.1 “Eleftheria i thanatos” +* Add support for `clip-path` and `mask` properties. +* Return `-webkit-` prefix to `filter` with SVG URI. + +## 2.0.2 +* Add readable names for new browsers from 2.0 release. +* Don’t add `-webkit-` prefix to `filter` with SVG URI. +* Don’t add `-o-` prefix 3D transforms. + +## 2.0.1 +* Save declaration style, when clone declaration to prefix. + +## 2.0 “Hongik Ingan” +* Based on PostCSS 1.0. + See [options changes](https://github.com/postcss/postcss/releases/tag/1.0.0). +* Restore visual cascade after declaration removing. +* Prefix declareation in `@supports` at-rule conditions. +* Add all browsers from Can I Use: `ie_mob`, `and_chr`, `and_ff`, + `op_mob` and `op_mini`. + +## 1.3.1 +* Fix gradient hack, when `background` property contains color. + +## 1.3 “Tenka Fubu” +* Add `text-size-adjust` support. +* Add `background-size` to support Android 2. +* Update Can I Use data. + +## 1.2 “Meiji” +* Use Can I Use data from official `caniuse-db` npm package. +* Change versions to `x.x.x.y`, where `x.x.x` is Autoprefixer npm version + and `y` is a `caniuse-db` date. + +## 1.1 “Nutrisco et extingo” +* Add source map annotation comment support. +* Add inline source map support. +* Autodetect previous inline source map. +* Fix source maps support on Windows. +* Fix source maps support in subdirectory. +* Prefix selector even if it is already prefixed by developer. +* Change CSS indentation to create nice visual cascade of prefixes. +* Fix flexbox support for IE 10 (by Roland Warmerdam). +* Better `break-inside` support. +* Fix prefixing, when two same properties are near. + +### 20140222: +* Add `touch-action` support. + +### 20140226: +* Chrome 33 is moved to released versions. +* Add Chrome 36 data. + +### 20140302: +* Add `text-decoration-*` properties support. +* Update browsers usage statistics. +* Fix `cascade` options without `browsers` option (by Dominik Porada). +* Use new PostCSS version. + +### 20140319: +* Check already prefixed properties after current declaration. +* Normalize spaces before already prefixed check. +* Firefox 28 is moved to released versions. +* Add Firefox 31 data. +* Add some Blackberry data. + +## 20140327: +* Don’t use `-ms-transform` in `@keyframes`, because IE 9 doesn’t support + animations. +* Update BlackBerry 10 data. + +## 20140403: +* Update browsers usage statistics. +* Opera 20 is moved to released versions. +* Add Opera 22 data. + +## 20140410: +* Chrome 34 is moved to released versions. +* Add Chrome 37 data. +* Fix Chrome 36 data. + +## 20140429: +* Fix `display: inline-flex` support by 2009 spec. +* Fix old WebKit gradient converter (by Sergey Belov). + +## 20140430: +* Separate 2D and 3D transform prefixes to clean unnecessary `-ms-` prefixes. +* Firefox 29 is moved to released versions. +* Add Firefox 32 data. + +### 20140510 +* Do not add `-ms-` prefix for `transform` with 3D functions. +* Update browsers global usage statistics. + +### 20140512 +* Remove unnecessary `-moz-` prefix for `wavy` in `text-decoration`. +* Update Safari data for font properties. + +### 20140521 +* Chrome 36 is moved to released versions. +* Add Chrome 38 data. + +### 20140523 +* Opera 21 is moved to released versions. +* Add Opera 23 data. + +### 20140605 +* Allow to parse gradients without space between color and position. +* Add iOS 8, Safari 8 and Android 4.4.3 data. +* Update browsers usage statistics. + +## 1.0 “Plus ultra” +* Source map support. +* Save origin indents and code formatting. +* Change CSS parser to PostCSS. +* Keep vendor hacks, which does right after unprefixed property. +* Show syntax errors if fixed sass-rails version if used. +* Rename compile() to process() and return result object, instead of CSS string. +* Rename inspect() to info(). +* Allow to select last versions for specified browser. +* Add full browser names aliases: `firefox`, `explorer` and `blackberry`. +* Ignore case in browser names. +* Change license to MIT. +* Add prefixes inside custom at-rules. +* Add only necessary prefixes to selector inside prefixed at-rule. +* Safer backgrounds list parser in gradient hack. +* Prefix @keyframes inside @media. +* Don’t prefix values for CSS3 PIE properties. +* Use browserify to build standalone version. + +### 20131225: +* Add ::placeholder support for Firefix >= 18. +* Fix vendor prefixes order. + +### 20140103: +* Add webkit prefix for sticky position. +* Update browsers popularity statistics. + +### 20140109: +* Add selectors and at-rules sections to debug info. +* Fix outdated prefixes cleaning. + +### 20140110: +* Add `Firefox ESR` browser requirement. +* Opera 18 is moved to released versions. +* Add Opera 20 data. + +### 20140117: +* Chrome 32 is moved to released versions. +* Add Opera 34 data. + +### 20140130: +* Fix flexbox properties names in transitions. +* Add Chrome 35 and Firefox 29 data. + +### 20140203: +* Android 4.4 stock browser and Opera 19 are moved to released versions. +* Add Opera 21 data. +* Update browsers usage statistics. + +### 20140213: +* Add case insensitive to IE’s filter hack (by Dominik Schilling). +* Improve selector prefixing in some rare cases (by Simon Lydell). +* Firefox 27 is moved to released versions. +* Add Firefox 30 data. + +## 0.8 “Unbowed, Unbent, Unbroken” +* Add more browsers to defaults ("> 1%, last 2 versions, ff 17, opera 12.1" + instead of just "last 2 browsers"). +* Keep vendor prefixes without unprefixed version (like vendor-specific hacks). +* Convert gradients to old WebKit syntax (actual for Android 2.3). +* Better support for several syntaxes with one prefix (like Flexbox and + gradients in WebKit). +* Add intrinsic and extrinsic sizing values support. +* Remove never existed prefixes from common mistakes (like -ms-transition). +* Add Opera 17 data. +* Fix selector prefixes order. +* Fix browser versions order in inspect. + +### 20130903: +* Fix old WebKit gradients convertor on rgba() colors. +* Allow to write old direction syntax in gradients. + +### 20130906: +* Fix direction syntax in radial gradients. +* Don’t prefix IE filter with modern syntax. + +### 20130911: +* Fix parsing property name with spaces. + +### 20130919: +* Fix processing custom framework prefixes (by Johannes J. Schmidt). +* Concat outputs if several files compiled to one output. +* Decrease standalone build size by removing unnecessary Binary class. +* iOS 7 is moved to released versions. +* Clean up binary code (by Simon Lydell). + +### 20130923: +* Firefox 24 is moved to released versions. + +### 20131001: +* Add support for grab, grabbing, zoom-in and zoom-out cursor values. + +### 20131006: +* Chrome 30 is moved to released versions. + +### 20131007: +* Don’t add another prefixes in rule with prefixed selector. + +### 20131009: +* Opera 17 is moved to released versions. + +### 20131015: +* Fix converting multiple gradients to old webkit syntax (by Aleksei Androsov). + +### 20131017: +* Fix @host at-rule parsing. + +### 20131020: +* IE 11 and Andrid 4.3 is moved to released versions. +* Add Opera 18 data. +* Add @namespace support. +* Sort browser versions in data file. + +### 20131029: +* Add Safari 6.1 data. +* Add fx alias for Firefox. + +### 20131104: +* Update Android future version to 4.4. +* Google Chrome 32 added to future versions list. +* Firefox 25 now is actual version, 27 and 28 added to future versions. +* Browsers statistics are updated. + +### 20131205: +* Google Chrome 33 added to future releases list. +* Google Chrome 31 moved to current releases list. + +### 20131209: +* Fix Autoprefixer initializer on Heroku (by Jason Purcell). +* Use old webkit gradients for old iOS and Safari (by Chad von Nau). +* Fix direction conversion for old webkit gradients (by Chad von Nau). +* Update browsers popularity statistics. + +### 20131213: +* Firefox ESR in default browsers was changed to 24 version. +* Firefox 26 was moved to current releases list. +* Firefox 28 was added to future releases list. + +## 0.7 “We Do Not Sow” +* Add vendor prefixes to selectors. +* Add ::selection and ::placeholder selectors support. +* Allow to load support data from Can I Use pull requests. +* Remove deprecated API. + +### 20130806: +* Add hyphens support. + +### 20130807: +* Add tab-size support. +* Add :fullscreen support. + +### 20130808: +* Allow to select browser versions by > and >= operator. +* Fix flex properties in transition. + +### 20130810: +* Add Firefox 25 data. + +### 20130824: +* Add Chrome 31 and 30 data. +* Fix CSS comments parsing (by vladkens). + +## 0.6 “As High As Honor” +* New faster API, which cache preprocessed data. Old API is deprecated. +* A lot of perfomance improvements. +* Add Opera 15 -webkit- prefix support. +* Update Chrome 29 and Safari 7 prefixes data. +* Add minor browsers in popularity select. +* Better syntax error messages. + +### 20130721: +* Add Chrome 30 data. + +### 20130728: +* Don’t remove non-standard -webkit-background-clip: text. +* Don’t remove IE hack on CSS parse. +* Fix loading into Rails without Sprockets. + +### 20130729: +* Add Opera 16 data. +* Fix “Invalid range in character class” error on JRuby. + +### 20130730: +* Fix correct clone comments inside keyframes (by Alexey Plutalov). +* Fix angle recalculation in gradients (by Roman Komarov). + +### 20130731: +* Add border-image support. + +## 0.5 “Ours is the Fury” +* Rewrite Autoprefixer to be more flexible. +* Use css, instead of Rework, to fix CSS parsing errors faster. +* Fix a lot of CSS parsing errors. +* Fix sass-rails 4.0.0.rc2 compatibility. + +### 20130616: +* More useful message for CSS parsing errors. +* Remove old WebKit gradient syntax. +* Fix parsing error on comment with braces. + +### 20130617: +* Remove old Mozilla border-radius. +* Don’t prefix old IE filter. +* Remove old background-clip, background-size and background-origin prefixes. +* Speed up regexps in values. +* Allow to hack property declarations. + +### 20130625: +* Convert flexbox properties to 2009 and 2012 specifications. +* Add support for sass-rails 4 final. + +### 20130626: +* Add Firefox 24 data. +* Add prefixes for font-feature-settings. + +### 20130629: +* Fix convert flex properties to old box-flex. +* Fix Sinatra (sprockets-sass) suuport. + +## 0.4 “Winter Is Coming” +* Remove outdated prefixes. +* Add border-radius and box-shadow properties to database. +* Change degrees in webkit gradients. + +### 20130515: +* Add old syntax in gradient direction. +* Add old syntax for display: flex. +* Update browser global usage statistics. + +### 20130521: +* Add Firefox 23 data. +* Update css-parse to fix @-moz-document issue. + +### 20130523: +* Update Rework’s libraries to fix @page statement. + +### 20130524: +* Add Chrome 29 data. + +### 20130527: +* Fix new css-stringify issue. + +### 20130528: +* Fix compatibilty with Rework from git master. +* Add minor browsers to data, which can be selected only directly. + +### 20130530: +* Add Opera 15 and iOS 6.1 data. +* Fix iOS versions in properties and values data. + +### 20130603: +* Use latest Rework 0.15 with a lot of CSS parsing fixes. +* Update browsers usage statistics. + +## 0.3 “Growing Strong” +* Use own filters instead of Rework’s `prefix` and `prefixValue`. +* Smarter value prefixer without false match “order” in “border”. +* 40% faster. +* Don’t add unnecessary properties instead of Rework’s `prefixValue`. +* Don’t change properties order. +* Sort properties and values in inspect output. + +### 20130424: +* Fix value override in prefixer. + +### 20130427: +* Prefix several same values in one property. + +### 20130502: +* Don’t add -webkit- prefix to IE filter. +* Don’t duplicate already prefixed rules. + +## 0.2 “Hear Me Roar!” +* Update parse libraries. +* Add inspect method and rake tast. + +## 0.1 “Fire and Blood” +* Initial release. diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/LICENSE b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/LICENSE new file mode 100644 index 000000000000..da057b4562a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright 2013 Andrey Sitnik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/README.md b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/README.md new file mode 100644 index 000000000000..d92c2a82a48a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/README.md @@ -0,0 +1,238 @@ +# Autoprefixer Rails [![Build Status][ci-img]][ci] + + + +[Autoprefixer] is a tool to parse CSS and add vendor prefixes to CSS rules +using values from the [Can I Use] database. This gem provides Ruby +and Ruby on Rails integration with this JavaScript tool. + + +Sponsored by Evil Martians + + +[Autoprefixer]: https://github.com/postcss/autoprefixer +[Can I Use]: http://caniuse.com/ +[PostCSS]: https://postcss.org/ +[ci-img]: https://travis-ci.org/ai/autoprefixer-rails.svg +[ci]: https://travis-ci.org/ai/autoprefixer-rails + +## Differences + +The best way to use Autoprefixer is with webpack or Gulp. + +Autoprefixer Rails doesn’t support these Autoprefixer features: + +* Browsers in `package.json`. +* Custom browsers usage statistics. + +## Usage + +Windows users should install [Node.js]. Autoprefixer Rails doesn’t work with +old JScript in Windows. + +Autoprefixer Rails uses [ExecJS] that will use the best available JavaScript +runtime. Currently this gem is tested to work with Node.js version 6 and up and +with [mini_racer], but will not work with [therubyracer]. + +[Node.js]: http://nodejs.org/ +[ExecJS]: https://github.com/rails/execjs +[mini_racer]: https://github.com/discourse/mini_racer +[therubyracer]: https://github.com/cowboyd/therubyracer + +### Ruby on Rails + +Add the `autoprefixer-rails` gem to your `Gemfile`: + +```ruby +gem "autoprefixer-rails" +``` + +Clear your cache: + +```sh +rake tmp:clear +``` + +Write your CSS (Sass, Stylus, LESS) rules without vendor prefixes +and Autoprefixer will apply prefixes for you. +For example in `app/assets/stylesheet/foobar.sass`: + +```sass +:fullscreen a + display: flex +``` + +Autoprefixer uses the Can I Use database with browser statistics and properties +support to add vendor prefixes automatically using the Asset Pipeline: + +```css +:-webkit-full-screen a { + display: -webkit-box; + display: -webkit-flex; + display: flex +} +:-moz-full-screen a { + display: flex +} +:-ms-fullscreen a { + display: -ms-flexbox; + display: flex +} +:fullscreen a { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex +} +``` + +If you need to specify browsers for your Rails project, you can save them +to `.browserslistrc` and place it under `app/assets/stylesheets/` +or any of its ancestor directories + +``` +> 1% +last 2 versions +IE > 8 # comment +``` + +See [Browserslist docs] for config format. But `> 5% in US` query is not +supported in Rails, because of ExecJS limitations. You should migrate to webpack +or Gulp if you want it. + +__Note: you have to clear cache (`rake tmp:clear`) for the configuration +to take effect.__ + +You can get what properties will be changed using a Rake task: + +```sh +rake autoprefixer:info +``` + +To disable Autoprefixer just remove postprocessor: + +```ruby +AutoprefixerRails.uninstall(Rails.application.assets) +``` + +[Browserslist docs]: https://github.com/ai/browserslist +[Firefox ESR]: http://www.mozilla.org/en/firefox/organizations/faq/ + +### Sprockets + +If you use Sinatra or another non-Rails framework with Sprockets, +just connect your Sprockets environment with Autoprefixer and write CSS +in the usual way: + +```ruby +assets = Sprockets::Environment.new do |env| + # Your assets settings +end + +require "autoprefixer-rails" +AutoprefixerRails.install(assets) +``` + +### Ruby + +If you need to call Autoprefixer from plain Ruby code, it’s very easy: + +```ruby +require "autoprefixer-rails" +prefixed = AutoprefixerRails.process(css, from: 'main.css').css +``` + +### Compass + +You should consider using Gulp instead of Compass binary, +because it has better Autoprefixer integration and many other awesome plugins. + +But if you can’t move from Compass binary right now, there’s a hack +to run Autoprefixer after `compass compile`. + +Install `autoprefixer-rails` gem: + +``` +gem install autoprefixer-rails +``` + +and add post-compile hook to `config.rb`: + +```ruby +require 'autoprefixer-rails' + +on_stylesheet_saved do |file| + css = File.read(file) + map = file + '.map' + + if File.exists? map + result = AutoprefixerRails.process(css, + from: file, + to: file, + map: { prev: File.read(map), inline: false }) + File.open(file, 'w') { |io| io << result.css } + File.open(map, 'w') { |io| io << result.map } + else + File.open(file, 'w') { |io| io << AutoprefixerRails.process(css) } + end +end +``` + +## Visual Cascade + +By default, Autoprefixer will change CSS indentation to create nice visual +cascade of prefixes. + +```css +a { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} +``` + +You can disable this by specifying `cascade: false` in `config/autoprefixer.yml` +or in `process()` options. + +## Source Map + +Autoprefixer will generate a source map if you set `map` option to `true` in +`process` method. + +You must set input and output CSS files paths (by `from` and `to` options) +to generate correct map. + +```ruby +result = AutoprefixerRails.process(css, + map: true, + from: 'main.css', + to: 'main.out.css') +``` + +Autoprefixer can also modify previous source map (for example, from Sass +compilation). Just set original source map content (as string) to `map` option: + +```ruby +result = AutoprefixerRails.process(css, { + map: File.read('main.sass.css.map'), + from: 'main.sass.css', + to: 'main.min.css') + +result.map #=> Source map from main.sass to main.min.css +``` + +See all options in [PostCSS docs]. AutoprefixerRails will convert Ruby style +to JS style, so you can use `map: { sources_content: false }` +instead of camelcase `sourcesContent`. + +[PostCSS docs]: https://github.com/postcss/postcss#source-map-1 + + +## Security Contact + +To report a security vulnerability, please use the [Tidelift security contact]. +Tidelift will coordinate the fix and disclosure. + +[Tidelift security contact]: https://tidelift.com/security diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails.rb new file mode 100644 index 000000000000..1985cd6f8af3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +# Ruby integration with Autoprefixer JS library, which parse CSS and adds +# only actual prefixed +module AutoprefixerRails + autoload :Sprockets, "autoprefixer-rails/sprockets" + + # Add prefixes to `css`. See `Processor#process` for options. + def self.process(css, opts = {}) + params = {} + params[:overrideBrowserslist] = opts.delete(:overrideBrowserslist) if opts.key?(:overrideBrowserslist) + params[:browsers] = opts.delete(:browsers) if opts.key?(:browsers) + params[:cascade] = opts.delete(:cascade) if opts.key?(:cascade) + params[:remove] = opts.delete(:remove) if opts.key?(:remove) + params[:env] = opts.delete(:env) if opts.key?(:env) + processor(params).process(css, opts) + end + + # Add Autoprefixer for Sprockets environment in `assets`. + # You can specify `browsers` actual in your project. + def self.install(assets, params = {}) + Sprockets.register_processor(processor(params)) + Sprockets.install(assets) + end + + # Disable installed Autoprefixer + def self.uninstall(assets) + Sprockets.uninstall(assets) + end + + # Cache processor instances + def self.processor(params = {}) + Processor.new(params) + end +end + +require_relative "autoprefixer-rails/result" +require_relative "autoprefixer-rails/version" +require_relative "autoprefixer-rails/processor" + +require_relative "autoprefixer-rails/railtie" if defined?(Rails) diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/processor.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/processor.rb new file mode 100644 index 000000000000..079daaad0ff3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/processor.rb @@ -0,0 +1,209 @@ +# frozen_string_literal: true + +require "pathname" +require "execjs" +require "json" + +IS_SECTION = /^\s*\[(.+)\]\s*$/.freeze + +module AutoprefixerRails + def self.show_deprecation_message! + return unless defined?(ActiveSupport::Deprecation) + + return if defined?(@deprecation_shown) + + ActiveSupport::Deprecation.warn( + "autoprefixer-rails was deprected. Migration guide:\n" \ + "https://github.com/ai/autoprefixer-rails/wiki/Deprecated" + ) + + @deprecation_shown = true + end + + # Ruby to JS wrapper for Autoprefixer processor instance + class Processor + def initialize(params = {}) + @params = params || {} + end + + # Process `css` and return result. + # + # Options can be: + # * `from` with input CSS file name. Will be used in error messages. + # * `to` with output CSS file name. + # * `map` with true to generate new source map or with previous map. + def process(css, opts = {}) + AutoprefixerRails.show_deprecation_message! + + opts = convert_options(opts) + + apply_wrapper = + "(function(opts, pluginOpts) {" \ + "return eval(process.apply(this, opts, pluginOpts));" \ + "})" + + plugin_opts = params_with_browsers(opts[:from]).merge(opts) + process_opts = { + from: plugin_opts.delete(:from), + to: plugin_opts.delete(:to), + map: plugin_opts.delete(:map) + } + + begin + result = runtime.call(apply_wrapper, [css, process_opts, plugin_opts]) + rescue ExecJS::ProgramError => e + contry_error = "BrowserslistError: " \ + "Country statistics is not supported " \ + "in client-side build of Browserslist" + if e.message == contry_error + raise "Country statistics is not supported in AutoprefixerRails. " \ + "Use Autoprefixer with webpack or other Node.js builder." + else + raise e + end + end + + Result.new(result["css"], result["map"], result["warnings"]) + end + + # Return, which browsers and prefixes will be used + def info + runtime.eval("autoprefixer(#{js_params}).info()") + end + + # Parse Browserslist config + def parse_config(config) + sections = { "defaults" => [] } + current = "defaults" + config.gsub(/#[^\n]*/, "") + .split(/\n/) + .map(&:strip) + .reject(&:empty?) + .each do |line| + if IS_SECTION =~ line + current = line.match(IS_SECTION)[1].strip + sections[current] ||= [] + else + sections[current] << line + end + end + sections + end + + private + + def params_with_browsers(from = nil) + from ||= if defined?(Rails) && Rails.respond_to?(:root) && Rails.root + Rails.root.join("app/assets/stylesheets").to_s + else + "." + end + + params = @params + if !params.key?(:browsers) && !params.key?(:overrideBrowserslist) && from + file = find_config(from) + if file + env = params[:env].to_s || "development" + config = parse_config(file) + params = params.dup + params[:overrideBrowserslist] = (config[env] || config["defaults"]) + end + end + + params + end + + # Convert params to JS string and add browsers from Browserslist config + def js_params + "{ " + + params_with_browsers.map { |k, v| "#{k}: #{v.inspect}" }.join(", ") + + " }" + end + + # Convert ruby_options to jsOptions + def convert_options(opts) + converted = {} + + opts.each_pair do |name, value| + if /_/ =~ name + name = name.to_s.gsub(/_\w/) { |i| i.delete("_").upcase }.to_sym + end + value = convert_options(value) if value.is_a? Hash + converted[name] = value + end + + converted + end + + # Try to find Browserslist config + def find_config(file) + path = Pathname(file).expand_path + + while path.parent != path + config1 = path.join("browserslist") + return config1.read if config1.exist? && !config1.directory? + + config2 = path.join(".browserslistrc") + return config2.read if config2.exist? && !config1.directory? + + path = path.parent + end + + nil + end + + # Lazy load for JS library + def runtime + @runtime ||= begin + if ExecJS.eval("typeof Uint8Array") != "function" + if ExecJS.runtime.name.start_with?("therubyracer") + raise "ExecJS::RubyRacerRuntime is not supported. " \ + "Please replace therubyracer with mini_racer " \ + "in your Gemfile or use Node.js as ExecJS runtime." + else + raise "#{ExecJS.runtime.name} runtime does’t support ES6. " \ + "Please update or replace your current ExecJS runtime." + end + end + + if ExecJS.runtime == ExecJS::Runtimes::Node + version = ExecJS.runtime.eval("process.version") + first = version.match(/^v(\d+)/)[1].to_i + raise "Autoprefixer doesn’t support Node #{version}. Update it." if first < 6 + end + + ExecJS.compile(build_js) + end + end + + # Cache autoprefixer.js content + def read_js + @read_js ||= begin + root = Pathname(File.dirname(__FILE__)) + path = root.join("../../vendor/autoprefixer.js") + path.read + end + end + + # Return processor JS with some extra methods + def build_js + "var global = this;" + read_js + process_proxy + end + + # Return JS code for process method proxy + def process_proxy + <<-JS + var processor; + var process = function() { + var result = autoprefixer.process.apply(autoprefixer, arguments); + var warns = result.warnings().map(function (i) { + delete i.plugin; + return i.toString(); + }); + var map = result.map ? result.map.toString() : null; + return { css: result.css, map: map, warnings: warns }; + }; + JS + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/railtie.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/railtie.rb new file mode 100644 index 000000000000..acd3b59459b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/railtie.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require "yaml" + +begin + module AutoprefixedRails + class Railtie < ::Rails::Railtie # :nodoc: + rake_tasks do |app| + require "rake/autoprefixer_tasks" + Rake::AutoprefixerTasks.new(config) if defined? app.assets + end + + if config.respond_to?(:assets) && !config.assets.nil? + config.assets.configure do |env| + AutoprefixerRails.install(env, config) + end + else + initializer :setup_autoprefixer, group: :all do |app| + AutoprefixerRails.install(app.assets, config) if defined?(app.assets) && !app.assets.nil? + end + end + + # Read browsers requirements from application or engine config + def config + params = {} + + roots.each do |root| + file = File.join(root, "config/autoprefixer.yml") + + next unless File.exist?(file) + + parsed = ::YAML.load_file(file) + next unless parsed + + params = parsed + + break + end + + params = params.symbolize_keys + params[:env] ||= Rails.env.to_s + params + end + + def roots + [Rails.application.root] + Rails::Engine.subclasses.map(&:root) + end + end + end +rescue LoadError +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/result.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/result.rb new file mode 100644 index 000000000000..133db8236553 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/result.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module AutoprefixerRails + # Container of prefixed CSS and source map with changes + class Result + # Prefixed CSS after Autoprefixer + attr_reader :css + + # Source map of changes + attr_reader :map + + # Warnings from Autoprefixer + attr_reader :warnings + + def initialize(css, map, warnings) + @warnings = warnings + @css = css + @map = map + end + + # Stringify prefixed CSS + def to_s + @css + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/sprockets.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/sprockets.rb new file mode 100644 index 000000000000..0ec81697a636 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/sprockets.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +require "pathname" + +module AutoprefixerRails + # Register autoprefixer postprocessor in Sprockets and fix common issues + class Sprockets + def self.register_processor(processor) + @processor = processor + end + + # Sprockets 3 and 4 API + def self.call(input) + filename = input[:filename] + source = input[:data] + run(filename, source) + end + + # Add prefixes to `css` + def self.run(filename, css) + output = filename.chomp(File.extname(filename)) + ".css" + result = @processor.process(css, from: filename, to: output) + + result.warnings.each do |warning| + warn "autoprefixer: #{warning}" + end + + result.css + end + + # Register postprocessor in Sprockets depend on issues with other gems + def self.install(env) + if ::Sprockets::VERSION.to_f < 4 + env.register_postprocessor("text/css", + ::AutoprefixerRails::Sprockets) + else + env.register_bundle_processor("text/css", + ::AutoprefixerRails::Sprockets) + end + end + + # Register postprocessor in Sprockets depend on issues with other gems + def self.uninstall(env) + if ::Sprockets::VERSION.to_f < 4 + env.unregister_postprocessor("text/css", + ::AutoprefixerRails::Sprockets) + else + env.unregister_bundle_processor("text/css", + ::AutoprefixerRails::Sprockets) + end + end + + # Sprockets 2 API new and render + def initialize(filename) + @filename = filename + @source = yield + end + + # Sprockets 2 API new and render + def render(_, _) + self.class.run(@filename, @source) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/version.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/version.rb new file mode 100644 index 000000000000..f686ffd3aa27 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/autoprefixer-rails/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module AutoprefixerRails # :nodoc: + VERSION = "9.8.6.5" unless defined? AutoprefixerRails::VERSION +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/rake/autoprefixer_tasks.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/rake/autoprefixer_tasks.rb new file mode 100644 index 000000000000..4d5f8c730507 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/lib/rake/autoprefixer_tasks.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require "rake" +require "rake/tasklib" +require "autoprefixer-rails" + +module Rake + # Define task to inspect Autoprefixer browsers, properties and values. + # Call it from your `Rakefile`: + # + # AutoprefixerTasks.new(['> 1%', 'opera 12']) + class AutoprefixerTasks < Rake::TaskLib + attr_reader :browsers + + def initialize(params = {}) + @params = params + @processor = AutoprefixerRails.processor(@params) + define + end + + def define + namespace :autoprefixer do + desc "Show selected browsers and prefixed CSS properties and values" + task :info do + puts @processor.info + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/Rakefile b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/Rakefile new file mode 100644 index 000000000000..8ef11055cf9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/Rakefile @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +require File.expand_path("config/application", __dir__) +App::Application.load_tasks diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/config/manifest.js b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/config/manifest.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/evaluate.css.erb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/evaluate.css.erb new file mode 100644 index 000000000000..a74136b6c320 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/evaluate.css.erb @@ -0,0 +1 @@ +<%= evaluate 'test.css' %> diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/loaded.sass b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/loaded.sass new file mode 100644 index 000000000000..85be83e99e3c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/loaded.sass @@ -0,0 +1,2 @@ +a + mask: none diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/sass.sass b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/sass.sass new file mode 100644 index 000000000000..c88593722182 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/sass.sass @@ -0,0 +1 @@ +@import "loaded" diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/test.css b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/test.css new file mode 100644 index 000000000000..a96b41a55956 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/test.css @@ -0,0 +1,3 @@ +a { + mask: none +} diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/wrong.css b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/wrong.css new file mode 100644 index 000000000000..213325e6a433 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/assets/stylesheets/wrong.css @@ -0,0 +1,2 @@ +a { + background: linear-gradient(top, white, black) diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/controllers/application_controller.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/controllers/application_controller.rb new file mode 100644 index 000000000000..7944f9f993a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/controllers/application_controller.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class ApplicationController < ActionController::Base +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/controllers/css_controller.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/controllers/css_controller.rb new file mode 100644 index 000000000000..dc9ce67f6cb7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/app/controllers/css_controller.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class CssController < ApplicationController + def test + file = params[:exact_file] || params[:file] + ".css" + render plain: Rails.application.assets[file].to_s.gsub(/;(\s})/, '\1') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config.ru b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config.ru new file mode 100644 index 000000000000..46ad6d84dcf3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config.ru @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +require ::File.expand_path("config/environment", __dir__) +run App::Application diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/application.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/application.rb new file mode 100644 index 000000000000..539a7c4ca4af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/application.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require File.expand_path("boot", __dir__) + +require "action_controller/railtie" +require "sprockets/railtie" + +Bundler.require(*Rails.groups(assets: %w[development test])) if defined?(Bundler) + +module App + class Application < Rails::Application + config.assets.enabled = true + config.sass.line_comments = false + config.sass.inline_source_maps = true + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/autoprefixer.yml b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/autoprefixer.yml new file mode 100644 index 000000000000..088dc91bef6f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/autoprefixer.yml @@ -0,0 +1,2 @@ +supports: false +cascade: false diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/boot.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/boot.rb new file mode 100644 index 000000000000..53e8ab0b3175 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/boot.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile", __dir__) +require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"]) diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/environment.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/environment.rb new file mode 100644 index 000000000000..ebd1d4d73a15 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/environment.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "tzinfo" +require File.expand_path("application", __dir__) +App::Application.initialize! diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/environments/test.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/environments/test.rb new file mode 100644 index 000000000000..cac4d3a51882 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/environments/test.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +App::Application.configure do + config.cache_classes = true + config.eager_load = false + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + config.action_dispatch.show_exceptions = false + config.action_controller.allow_forgery_protection = false + config.active_support.deprecation = :stderr +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/initializers/secret_token.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/initializers/secret_token.rb new file mode 100644 index 000000000000..1f0232e11af3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/initializers/secret_token.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +App::Application.config.secret_key_base = "test" diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/routes.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/routes.rb new file mode 100644 index 000000000000..9616787e0804 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/app/config/routes.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +App::Application.routes.draw do + root to: "css#test" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/autoprefixer_spec.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/autoprefixer_spec.rb new file mode 100644 index 000000000000..4c155073685d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/autoprefixer_spec.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true + +require_relative "spec_helper" + +describe AutoprefixerRails do + before :all do + @dir = Pathname(__FILE__).dirname + @css = @dir.join("app/app/assets/stylesheets/test.css").read + end + + it "process CSS" do + expect(AutoprefixerRails.process(@css)).to be_a(AutoprefixerRails::Result) + end + + it "process CSS for selected browsers" do + css = "a {\n tab-size: 2\n}" + result = AutoprefixerRails.process(css, overrideBrowserslist: ["opera 12"]) + expect(result.css).to eq "a {\n" \ + " -o-tab-size: 2;\n" \ + " tab-size: 2\n" \ + "}" + end + + it "has browsers option" do + css = "a {\n tab-size: 2\n}" + result = AutoprefixerRails.process(css, browsers: ["opera 12"]) + expect(result.css).to eq "a {\n" \ + " -o-tab-size: 2;\n" \ + " tab-size: 2\n" \ + "}" + end + + it "process @supports" do + css = "@supports (display: flex) { }" + result = AutoprefixerRails.process(css, overrideBrowserslist: ["chrome 28"]) + expect(result.css).to eq( + "@supports ((display: -webkit-flex) or (display: flex)) { }" + ) + end + + it "generates source map" do + result = AutoprefixerRails.process(@css, map: true) + expect(result.css).to include("/*# sourceMappingURL=data:") + end + + it "generates separated source map" do + result = AutoprefixerRails.process(@css, map: { inline: false }) + expect(result.map).to be_a(String) + end + + it "uses file name in syntax errors", not_jruby: true do + expect do + AutoprefixerRails.process("a {", from: "a.css") + end.to raise_error(/a.css:/) + end + + it "includes sourcesContent by default" do + map = AutoprefixerRails.process("a{}", map: { inline: false }).map + expect(map).to include("sourcesContent") + end + + it "maps options from Ruby style" do + map = AutoprefixerRails.process("a{}", map: { + sources_content: false, + inline: false + }).map + + expect(map).not_to include("sourcesContent") + end + + it "does not remove old prefixes on request" do + css = "a { -moz-border-radius: 5px; border-radius: 5px }" + result = AutoprefixerRails.process(css, remove: false) + expect(result.css).to eq(css) + end + + it "shows debug" do + info = AutoprefixerRails.processor(overrideBrowserslist: ["chrome 25"]).info + expect(info).to match(/Browsers:\n Chrome: 25\n\n/) + expect(info).to match(/ transition: webkit/) + end + + it "returns warnings" do + css = "a{background:linear-gradient(top,white,black)}" + result = AutoprefixerRails.process(css) + expect(result.warnings).to eq([":1:3: Gradient has outdated " \ + "direction syntax. New syntax is like `to left` instead of `right`."]) + end + + it "shows correct error on country statistics" do + expect do + AutoprefixerRails.process("", overrideBrowserslist: "> 1% in US") + end.to raise_error(/Use Autoprefixer with webpack/) + end + + context "Sprockets" do + before :each do + @assets = Sprockets::Environment.new + @assets.append_path(@dir.join("app/app/assets/stylesheets")) + AutoprefixerRails.install(@assets, overrideBrowserslist: ["chrome 25"]) + end + + it "integrates with Sprockets" do + css = @assets["test.css"].to_s + expect(css).to eq "a {\n" \ + " -webkit-mask: none;\n" \ + " mask: none\n" \ + "}\n" + end + + it "shows file name from Sprockets", not_jruby: true do + expect { @assets["wrong.css"] }.to raise_error(/wrong/) + end + + it "supports disabling", not_jruby: true do + AutoprefixerRails.uninstall(@assets) + css = @assets["test.css"].to_s + expect(css).to eq "a {\n" \ + " mask: none\n" \ + "}\n" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/processor_spec.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/processor_spec.rb new file mode 100644 index 000000000000..8e8574b0fe26 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/processor_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require_relative "spec_helper" + +describe AutoprefixerRails::Processor do + it "parses config" do + config = "# Comment\n ie 11\n \nie 8 # sorry\n[test ]\nios 8" + processor = AutoprefixerRails::Processor.new + expect(processor.parse_config(config)).to eql({ + "defaults" => ["ie 11", "ie 8"], + "test" => ["ios 8"] + }) + end + + context "without Rails" do + before do + hide_const("Rails") + end + + it "doesn't raise error during processing" do + processor = AutoprefixerRails::Processor.new + expect do + processor.process("") + end.not_to raise_error + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/rails_spec.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/rails_spec.rb new file mode 100644 index 000000000000..ccf1d0569dd4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/rails_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require_relative "spec_helper" + +describe CssController, type: :controller do + before :all do + cache = Rails.root.join("tmp/cache") + cache.rmtree if cache.exist? + end + + def test_file(file) + if Rails.version.split(".").first.to_i >= 5 + get :test, params: { file: file } + else + get :test, file: file + end + end + + it "integrates with Rails and Sass" do + test_file "sass" + expect(response).to be_successful + clear_css = response.body.tr("\n", " ").squeeze(" ").strip + expect(clear_css).to eq "a{-webkit-mask:none;mask:none}" + end + + if Sprockets::Context.instance_methods.include?(:evaluate) + it "supports evaluate" do + test_file "evaluate" + expect(response).to be_successful + clear_css = response.body.tr("\n", " ").squeeze(" ").strip + expect(clear_css).to eq "a { -webkit-mask: none; mask: none }" + end + end +end + +describe "Rake task" do + it "shows debug" do + info = `cd spec/app; bundle exec rake autoprefixer:info` + expect(info).to match(/Browsers:\n Chrome: 25\n\n/) + expect(info).to match(/ transition: webkit/) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/railtie_spec.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/railtie_spec.rb new file mode 100644 index 000000000000..fc25c62bfadc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/railtie_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require_relative "spec_helper" + +describe AutoprefixedRails::Railtie do + before do + @railtie = AutoprefixedRails::Railtie.instance + end + + context "with config/autoprefixer.yml" do + it "works" do + expect(@railtie.config).to eq(cascade: false, supports: false, env: "test") + end + end + + context "with empty config/autoprefixer.yml" do + before do + file_path = File.join(Rails.application.root, "config/autoprefixer.yml") + allow(File).to receive(:exists?).with(file_path) { true } + allow(::YAML).to receive(:load_file).with(file_path) { false } # empty yaml + end + + it "skips empty YAML" do + expect { @railtie.config }.not_to raise_error + end + + it "works" do + expect(@railtie.config).to eq(env: "test") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/spec_helper.rb new file mode 100644 index 000000000000..efa9ec306d90 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/spec/spec_helper.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +ENV["RAILS_ENV"] ||= "test" + +require_relative "app/config/environment" +require "autoprefixer-rails" + +require "rspec/rails" + +warn "ExecJS runtime is #{ExecJS.runtime.class}" + +RSpec.configure do |c| + c.filter_run_excluding not_jruby: RUBY_PLATFORM == "java" +end + +def sprockets_4? + Gem::Version.new(Sprockets::VERSION) > Gem::Version.new("4.0.x") +end diff --git a/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/vendor/autoprefixer.js b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/vendor/autoprefixer.js new file mode 100644 index 000000000000..115bdbc8c815 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/autoprefixer-rails-9.8.6.5/vendor/autoprefixer.js @@ -0,0 +1,70770 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.autoprefixer = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var unpack = require('caniuse-lite').feature; + +function browsersSort(a, b) { + a = a.split(' '); + b = b.split(' '); + + if (a[0] > b[0]) { + return 1; + } else if (a[0] < b[0]) { + return -1; + } else { + return Math.sign(parseFloat(a[1]) - parseFloat(b[1])); + } +} // Convert Can I Use data + + +function f(data, opts, callback) { + data = unpack(data); + + if (!callback) { + var _ref = [opts, {}]; + callback = _ref[0]; + opts = _ref[1]; + } + + var match = opts.match || /\sx($|\s)/; + var need = []; + + for (var browser in data.stats) { + var versions = data.stats[browser]; + + for (var version in versions) { + var support = versions[version]; + + if (support.match(match)) { + need.push(browser + ' ' + version); + } + } + } + + callback(need.sort(browsersSort)); +} // Add data for all properties + + +var result = {}; + +function prefix(names, data) { + for (var _iterator = _createForOfIteratorHelperLoose(names), _step; !(_step = _iterator()).done;) { + var name = _step.value; + result[name] = Object.assign({}, data); + } +} + +function add(names, data) { + for (var _iterator2 = _createForOfIteratorHelperLoose(names), _step2; !(_step2 = _iterator2()).done;) { + var name = _step2.value; + result[name].browsers = result[name].browsers.concat(data.browsers).sort(browsersSort); + } +} + +module.exports = result; // Border Radius + +f(require('caniuse-lite/data/features/border-radius'), function (browsers) { + return prefix(['border-radius', 'border-top-left-radius', 'border-top-right-radius', 'border-bottom-right-radius', 'border-bottom-left-radius'], { + mistakes: ['-khtml-', '-ms-', '-o-'], + feature: 'border-radius', + browsers: browsers + }); +}); // Box Shadow + +f(require('caniuse-lite/data/features/css-boxshadow'), function (browsers) { + return prefix(['box-shadow'], { + mistakes: ['-khtml-'], + feature: 'css-boxshadow', + browsers: browsers + }); +}); // Animation + +f(require('caniuse-lite/data/features/css-animation'), function (browsers) { + return prefix(['animation', 'animation-name', 'animation-duration', 'animation-delay', 'animation-direction', 'animation-fill-mode', 'animation-iteration-count', 'animation-play-state', 'animation-timing-function', '@keyframes'], { + mistakes: ['-khtml-', '-ms-'], + feature: 'css-animation', + browsers: browsers + }); +}); // Transition + +f(require('caniuse-lite/data/features/css-transitions'), function (browsers) { + return prefix(['transition', 'transition-property', 'transition-duration', 'transition-delay', 'transition-timing-function'], { + mistakes: ['-khtml-', '-ms-'], + browsers: browsers, + feature: 'css-transitions' + }); +}); // Transform 2D + +f(require('caniuse-lite/data/features/transforms2d'), function (browsers) { + return prefix(['transform', 'transform-origin'], { + feature: 'transforms2d', + browsers: browsers + }); +}); // Transform 3D + +var transforms3d = require('caniuse-lite/data/features/transforms3d'); + +f(transforms3d, function (browsers) { + prefix(['perspective', 'perspective-origin'], { + feature: 'transforms3d', + browsers: browsers + }); + return prefix(['transform-style'], { + mistakes: ['-ms-', '-o-'], + browsers: browsers, + feature: 'transforms3d' + }); +}); +f(transforms3d, { + match: /y\sx|y\s#2/ +}, function (browsers) { + return prefix(['backface-visibility'], { + mistakes: ['-ms-', '-o-'], + feature: 'transforms3d', + browsers: browsers + }); +}); // Gradients + +var gradients = require('caniuse-lite/data/features/css-gradients'); + +f(gradients, { + match: /y\sx/ +}, function (browsers) { + return prefix(['linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient'], { + props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'], + mistakes: ['-ms-'], + feature: 'css-gradients', + browsers: browsers + }); +}); +f(gradients, { + match: /a\sx/ +}, function (browsers) { + browsers = browsers.map(function (i) { + if (/firefox|op/.test(i)) { + return i; + } else { + return i + " old"; + } + }); + return add(['linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient'], { + feature: 'css-gradients', + browsers: browsers + }); +}); // Box sizing + +f(require('caniuse-lite/data/features/css3-boxsizing'), function (browsers) { + return prefix(['box-sizing'], { + feature: 'css3-boxsizing', + browsers: browsers + }); +}); // Filter Effects + +f(require('caniuse-lite/data/features/css-filters'), function (browsers) { + return prefix(['filter'], { + feature: 'css-filters', + browsers: browsers + }); +}); // filter() function + +f(require('caniuse-lite/data/features/css-filter-function'), function (browsers) { + return prefix(['filter-function'], { + props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'], + feature: 'css-filter-function', + browsers: browsers + }); +}); // Backdrop-filter + +var backdrop = require('caniuse-lite/data/features/css-backdrop-filter'); + +f(backdrop, { + match: /y\sx|y\s#2/ +}, function (browsers) { + return prefix(['backdrop-filter'], { + feature: 'css-backdrop-filter', + browsers: browsers + }); +}); // element() function + +f(require('caniuse-lite/data/features/css-element-function'), function (browsers) { + return prefix(['element'], { + props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'], + feature: 'css-element-function', + browsers: browsers + }); +}); // Multicolumns + +f(require('caniuse-lite/data/features/multicolumn'), function (browsers) { + prefix(['columns', 'column-width', 'column-gap', 'column-rule', 'column-rule-color', 'column-rule-width', 'column-count', 'column-rule-style', 'column-span', 'column-fill'], { + feature: 'multicolumn', + browsers: browsers + }); + var noff = browsers.filter(function (i) { + return !/firefox/.test(i); + }); + prefix(['break-before', 'break-after', 'break-inside'], { + feature: 'multicolumn', + browsers: noff + }); +}); // User select + +f(require('caniuse-lite/data/features/user-select-none'), function (browsers) { + return prefix(['user-select'], { + mistakes: ['-khtml-'], + feature: 'user-select-none', + browsers: browsers + }); +}); // Flexible Box Layout + +var flexbox = require('caniuse-lite/data/features/flexbox'); + +f(flexbox, { + match: /a\sx/ +}, function (browsers) { + browsers = browsers.map(function (i) { + if (/ie|firefox/.test(i)) { + return i; + } else { + return i + " 2009"; + } + }); + prefix(['display-flex', 'inline-flex'], { + props: ['display'], + feature: 'flexbox', + browsers: browsers + }); + prefix(['flex', 'flex-grow', 'flex-shrink', 'flex-basis'], { + feature: 'flexbox', + browsers: browsers + }); + prefix(['flex-direction', 'flex-wrap', 'flex-flow', 'justify-content', 'order', 'align-items', 'align-self', 'align-content'], { + feature: 'flexbox', + browsers: browsers + }); +}); +f(flexbox, { + match: /y\sx/ +}, function (browsers) { + add(['display-flex', 'inline-flex'], { + feature: 'flexbox', + browsers: browsers + }); + add(['flex', 'flex-grow', 'flex-shrink', 'flex-basis'], { + feature: 'flexbox', + browsers: browsers + }); + add(['flex-direction', 'flex-wrap', 'flex-flow', 'justify-content', 'order', 'align-items', 'align-self', 'align-content'], { + feature: 'flexbox', + browsers: browsers + }); +}); // calc() unit + +f(require('caniuse-lite/data/features/calc'), function (browsers) { + return prefix(['calc'], { + props: ['*'], + feature: 'calc', + browsers: browsers + }); +}); // Background options + +f(require('caniuse-lite/data/features/background-img-opts'), function (browsers) { + return prefix(['background-origin', 'background-size'], { + feature: 'background-img-opts', + browsers: browsers + }); +}); // background-clip: text + +f(require('caniuse-lite/data/features/background-clip-text'), function (browsers) { + return prefix(['background-clip'], { + feature: 'background-clip-text', + browsers: browsers + }); +}); // Font feature settings + +f(require('caniuse-lite/data/features/font-feature'), function (browsers) { + return prefix(['font-feature-settings', 'font-variant-ligatures', 'font-language-override'], { + feature: 'font-feature', + browsers: browsers + }); +}); // CSS font-kerning property + +f(require('caniuse-lite/data/features/font-kerning'), function (browsers) { + return prefix(['font-kerning'], { + feature: 'font-kerning', + browsers: browsers + }); +}); // Border image + +f(require('caniuse-lite/data/features/border-image'), function (browsers) { + return prefix(['border-image'], { + feature: 'border-image', + browsers: browsers + }); +}); // Selection selector + +f(require('caniuse-lite/data/features/css-selection'), function (browsers) { + return prefix(['::selection'], { + selector: true, + feature: 'css-selection', + browsers: browsers + }); +}); // Placeholder selector + +f(require('caniuse-lite/data/features/css-placeholder'), function (browsers) { + prefix(['::placeholder'], { + selector: true, + feature: 'css-placeholder', + browsers: browsers.concat(['ie 10 old', 'ie 11 old', 'firefox 18 old']) + }); +}); // Placeholder-shown selector + +f(require('caniuse-lite/data/features/css-placeholder-shown'), function (browsers) { + prefix([':placeholder-shown'], { + selector: true, + feature: 'css-placeholder-shown', + browsers: browsers + }); +}); // Hyphenation + +f(require('caniuse-lite/data/features/css-hyphens'), function (browsers) { + return prefix(['hyphens'], { + feature: 'css-hyphens', + browsers: browsers + }); +}); // Fullscreen selector + +var fullscreen = require('caniuse-lite/data/features/fullscreen'); + +f(fullscreen, function (browsers) { + return prefix([':fullscreen'], { + selector: true, + feature: 'fullscreen', + browsers: browsers + }); +}); +f(fullscreen, { + match: /x(\s#2|$)/ +}, function (browsers) { + return prefix(['::backdrop'], { + selector: true, + feature: 'fullscreen', + browsers: browsers + }); +}); // Tab size + +f(require('caniuse-lite/data/features/css3-tabsize'), function (browsers) { + return prefix(['tab-size'], { + feature: 'css3-tabsize', + browsers: browsers + }); +}); // Intrinsic & extrinsic sizing + +var intrinsic = require('caniuse-lite/data/features/intrinsic-width'); + +var sizeProps = ['width', 'min-width', 'max-width', 'height', 'min-height', 'max-height', 'inline-size', 'min-inline-size', 'max-inline-size', 'block-size', 'min-block-size', 'max-block-size', 'grid', 'grid-template', 'grid-template-rows', 'grid-template-columns', 'grid-auto-columns', 'grid-auto-rows']; +f(intrinsic, function (browsers) { + return prefix(['max-content', 'min-content'], { + props: sizeProps, + feature: 'intrinsic-width', + browsers: browsers + }); +}); +f(intrinsic, { + match: /x|\s#4/ +}, function (browsers) { + return prefix(['fill', 'fill-available', 'stretch'], { + props: sizeProps, + feature: 'intrinsic-width', + browsers: browsers + }); +}); +f(intrinsic, { + match: /x|\s#5/ +}, function (browsers) { + return prefix(['fit-content'], { + props: sizeProps, + feature: 'intrinsic-width', + browsers: browsers + }); +}); // Zoom cursors + +f(require('caniuse-lite/data/features/css3-cursors-newer'), function (browsers) { + return prefix(['zoom-in', 'zoom-out'], { + props: ['cursor'], + feature: 'css3-cursors-newer', + browsers: browsers + }); +}); // Grab cursors + +f(require('caniuse-lite/data/features/css3-cursors-grab'), function (browsers) { + return prefix(['grab', 'grabbing'], { + props: ['cursor'], + feature: 'css3-cursors-grab', + browsers: browsers + }); +}); // Sticky position + +f(require('caniuse-lite/data/features/css-sticky'), function (browsers) { + return prefix(['sticky'], { + props: ['position'], + feature: 'css-sticky', + browsers: browsers + }); +}); // Pointer Events + +f(require('caniuse-lite/data/features/pointer'), function (browsers) { + return prefix(['touch-action'], { + feature: 'pointer', + browsers: browsers + }); +}); // Text decoration + +var decoration = require('caniuse-lite/data/features/text-decoration'); + +f(decoration, function (browsers) { + return prefix(['text-decoration-style', 'text-decoration-color', 'text-decoration-line', 'text-decoration'], { + feature: 'text-decoration', + browsers: browsers + }); +}); +f(decoration, { + match: /x.*#[235]/ +}, function (browsers) { + return prefix(['text-decoration-skip', 'text-decoration-skip-ink'], { + feature: 'text-decoration', + browsers: browsers + }); +}); // Text Size Adjust + +f(require('caniuse-lite/data/features/text-size-adjust'), function (browsers) { + return prefix(['text-size-adjust'], { + feature: 'text-size-adjust', + browsers: browsers + }); +}); // CSS Masks + +f(require('caniuse-lite/data/features/css-masks'), function (browsers) { + prefix(['mask-clip', 'mask-composite', 'mask-image', 'mask-origin', 'mask-repeat', 'mask-border-repeat', 'mask-border-source'], { + feature: 'css-masks', + browsers: browsers + }); + prefix(['mask', 'mask-position', 'mask-size', 'mask-border', 'mask-border-outset', 'mask-border-width', 'mask-border-slice'], { + feature: 'css-masks', + browsers: browsers + }); +}); // CSS clip-path property + +f(require('caniuse-lite/data/features/css-clip-path'), function (browsers) { + return prefix(['clip-path'], { + feature: 'css-clip-path', + browsers: browsers + }); +}); // Fragmented Borders and Backgrounds + +f(require('caniuse-lite/data/features/css-boxdecorationbreak'), function (browsers) { + return prefix(['box-decoration-break'], { + feature: 'css-boxdecorationbreak', + browsers: browsers + }); +}); // CSS3 object-fit/object-position + +f(require('caniuse-lite/data/features/object-fit'), function (browsers) { + return prefix(['object-fit', 'object-position'], { + feature: 'object-fit', + browsers: browsers + }); +}); // CSS Shapes + +f(require('caniuse-lite/data/features/css-shapes'), function (browsers) { + return prefix(['shape-margin', 'shape-outside', 'shape-image-threshold'], { + feature: 'css-shapes', + browsers: browsers + }); +}); // CSS3 text-overflow + +f(require('caniuse-lite/data/features/text-overflow'), function (browsers) { + return prefix(['text-overflow'], { + feature: 'text-overflow', + browsers: browsers + }); +}); // Viewport at-rule + +f(require('caniuse-lite/data/features/css-deviceadaptation'), function (browsers) { + return prefix(['@viewport'], { + feature: 'css-deviceadaptation', + browsers: browsers + }); +}); // Resolution Media Queries + +var resolut = require('caniuse-lite/data/features/css-media-resolution'); + +f(resolut, { + match: /( x($| )|a #2)/ +}, function (browsers) { + return prefix(['@resolution'], { + feature: 'css-media-resolution', + browsers: browsers + }); +}); // CSS text-align-last + +f(require('caniuse-lite/data/features/css-text-align-last'), function (browsers) { + return prefix(['text-align-last'], { + feature: 'css-text-align-last', + browsers: browsers + }); +}); // Crisp Edges Image Rendering Algorithm + +var crispedges = require('caniuse-lite/data/features/css-crisp-edges'); + +f(crispedges, { + match: /y x|a x #1/ +}, function (browsers) { + return prefix(['pixelated'], { + props: ['image-rendering'], + feature: 'css-crisp-edges', + browsers: browsers + }); +}); +f(crispedges, { + match: /a x #2/ +}, function (browsers) { + return prefix(['image-rendering'], { + feature: 'css-crisp-edges', + browsers: browsers + }); +}); // Logical Properties + +var logicalProps = require('caniuse-lite/data/features/css-logical-props'); + +f(logicalProps, function (browsers) { + return prefix(['border-inline-start', 'border-inline-end', 'margin-inline-start', 'margin-inline-end', 'padding-inline-start', 'padding-inline-end'], { + feature: 'css-logical-props', + browsers: browsers + }); +}); +f(logicalProps, { + match: /x\s#2/ +}, function (browsers) { + return prefix(['border-block-start', 'border-block-end', 'margin-block-start', 'margin-block-end', 'padding-block-start', 'padding-block-end'], { + feature: 'css-logical-props', + browsers: browsers + }); +}); // CSS appearance + +var appearance = require('caniuse-lite/data/features/css-appearance'); + +f(appearance, { + match: /#2|x/ +}, function (browsers) { + return prefix(['appearance'], { + feature: 'css-appearance', + browsers: browsers + }); +}); // CSS Scroll snap points + +f(require('caniuse-lite/data/features/css-snappoints'), function (browsers) { + return prefix(['scroll-snap-type', 'scroll-snap-coordinate', 'scroll-snap-destination', 'scroll-snap-points-x', 'scroll-snap-points-y'], { + feature: 'css-snappoints', + browsers: browsers + }); +}); // CSS Regions + +f(require('caniuse-lite/data/features/css-regions'), function (browsers) { + return prefix(['flow-into', 'flow-from', 'region-fragment'], { + feature: 'css-regions', + browsers: browsers + }); +}); // CSS image-set + +f(require('caniuse-lite/data/features/css-image-set'), function (browsers) { + return prefix(['image-set'], { + props: ['background', 'background-image', 'border-image', 'cursor', 'mask', 'mask-image', 'list-style', 'list-style-image', 'content'], + feature: 'css-image-set', + browsers: browsers + }); +}); // Writing Mode + +var writingMode = require('caniuse-lite/data/features/css-writing-mode'); + +f(writingMode, { + match: /a|x/ +}, function (browsers) { + return prefix(['writing-mode'], { + feature: 'css-writing-mode', + browsers: browsers + }); +}); // Cross-Fade Function + +f(require('caniuse-lite/data/features/css-cross-fade'), function (browsers) { + return prefix(['cross-fade'], { + props: ['background', 'background-image', 'border-image', 'mask', 'list-style', 'list-style-image', 'content', 'mask-image'], + feature: 'css-cross-fade', + browsers: browsers + }); +}); // Read Only selector + +f(require('caniuse-lite/data/features/css-read-only-write'), function (browsers) { + return prefix([':read-only', ':read-write'], { + selector: true, + feature: 'css-read-only-write', + browsers: browsers + }); +}); // Text Emphasize + +f(require('caniuse-lite/data/features/text-emphasis'), function (browsers) { + return prefix(['text-emphasis', 'text-emphasis-position', 'text-emphasis-style', 'text-emphasis-color'], { + feature: 'text-emphasis', + browsers: browsers + }); +}); // CSS Grid Layout + +var grid = require('caniuse-lite/data/features/css-grid'); + +f(grid, function (browsers) { + prefix(['display-grid', 'inline-grid'], { + props: ['display'], + feature: 'css-grid', + browsers: browsers + }); + prefix(['grid-template-columns', 'grid-template-rows', 'grid-row-start', 'grid-column-start', 'grid-row-end', 'grid-column-end', 'grid-row', 'grid-column', 'grid-area', 'grid-template', 'grid-template-areas', 'place-self'], { + feature: 'css-grid', + browsers: browsers + }); +}); +f(grid, { + match: /a x/ +}, function (browsers) { + return prefix(['grid-column-align', 'grid-row-align'], { + feature: 'css-grid', + browsers: browsers + }); +}); // CSS text-spacing + +f(require('caniuse-lite/data/features/css-text-spacing'), function (browsers) { + return prefix(['text-spacing'], { + feature: 'css-text-spacing', + browsers: browsers + }); +}); // :any-link selector + +f(require('caniuse-lite/data/features/css-any-link'), function (browsers) { + return prefix([':any-link'], { + selector: true, + feature: 'css-any-link', + browsers: browsers + }); +}); // unicode-bidi + +var bidi = require('caniuse-lite/data/features/css-unicode-bidi'); + +f(bidi, function (browsers) { + return prefix(['isolate'], { + props: ['unicode-bidi'], + feature: 'css-unicode-bidi', + browsers: browsers + }); +}); +f(bidi, { + match: /y x|a x #2/ +}, function (browsers) { + return prefix(['plaintext'], { + props: ['unicode-bidi'], + feature: 'css-unicode-bidi', + browsers: browsers + }); +}); +f(bidi, { + match: /y x/ +}, function (browsers) { + return prefix(['isolate-override'], { + props: ['unicode-bidi'], + feature: 'css-unicode-bidi', + browsers: browsers + }); +}); // overscroll-behavior selector + +var over = require('caniuse-lite/data/features/css-overscroll-behavior'); + +f(over, { + match: /a #1/ +}, function (browsers) { + return prefix(['overscroll-behavior'], { + feature: 'css-overscroll-behavior', + browsers: browsers + }); +}); // color-adjust + +f(require('caniuse-lite/data/features/css-color-adjust'), function (browsers) { + return prefix(['color-adjust'], { + feature: 'css-color-adjust', + browsers: browsers + }); +}); // text-orientation + +f(require('caniuse-lite/data/features/css-text-orientation'), function (browsers) { + return prefix(['text-orientation'], { + feature: 'css-text-orientation', + browsers: browsers + }); +}); + +},{"caniuse-lite":637,"caniuse-lite/data/features/background-clip-text":118,"caniuse-lite/data/features/background-img-opts":119,"caniuse-lite/data/features/border-image":129,"caniuse-lite/data/features/border-radius":130,"caniuse-lite/data/features/calc":133,"caniuse-lite/data/features/css-animation":158,"caniuse-lite/data/features/css-any-link":159,"caniuse-lite/data/features/css-appearance":160,"caniuse-lite/data/features/css-backdrop-filter":163,"caniuse-lite/data/features/css-boxdecorationbreak":166,"caniuse-lite/data/features/css-boxshadow":167,"caniuse-lite/data/features/css-clip-path":171,"caniuse-lite/data/features/css-color-adjust":172,"caniuse-lite/data/features/css-crisp-edges":177,"caniuse-lite/data/features/css-cross-fade":178,"caniuse-lite/data/features/css-deviceadaptation":181,"caniuse-lite/data/features/css-element-function":184,"caniuse-lite/data/features/css-filter-function":188,"caniuse-lite/data/features/css-filters":189,"caniuse-lite/data/features/css-gradients":198,"caniuse-lite/data/features/css-grid":199,"caniuse-lite/data/features/css-hyphens":203,"caniuse-lite/data/features/css-image-set":205,"caniuse-lite/data/features/css-logical-props":212,"caniuse-lite/data/features/css-masks":214,"caniuse-lite/data/features/css-media-resolution":218,"caniuse-lite/data/features/css-overscroll-behavior":230,"caniuse-lite/data/features/css-placeholder":235,"caniuse-lite/data/features/css-placeholder-shown":234,"caniuse-lite/data/features/css-read-only-write":236,"caniuse-lite/data/features/css-regions":239,"caniuse-lite/data/features/css-selection":248,"caniuse-lite/data/features/css-shapes":249,"caniuse-lite/data/features/css-snappoints":250,"caniuse-lite/data/features/css-sticky":251,"caniuse-lite/data/features/css-text-align-last":255,"caniuse-lite/data/features/css-text-orientation":258,"caniuse-lite/data/features/css-text-spacing":259,"caniuse-lite/data/features/css-transitions":263,"caniuse-lite/data/features/css-unicode-bidi":264,"caniuse-lite/data/features/css-writing-mode":268,"caniuse-lite/data/features/css3-boxsizing":271,"caniuse-lite/data/features/css3-cursors-grab":273,"caniuse-lite/data/features/css3-cursors-newer":274,"caniuse-lite/data/features/css3-tabsize":276,"caniuse-lite/data/features/flexbox":329,"caniuse-lite/data/features/font-feature":334,"caniuse-lite/data/features/font-kerning":335,"caniuse-lite/data/features/fullscreen":348,"caniuse-lite/data/features/intrinsic-width":402,"caniuse-lite/data/features/multicolumn":447,"caniuse-lite/data/features/object-fit":459,"caniuse-lite/data/features/pointer":488,"caniuse-lite/data/features/text-decoration":564,"caniuse-lite/data/features/text-emphasis":565,"caniuse-lite/data/features/text-overflow":566,"caniuse-lite/data/features/text-size-adjust":567,"caniuse-lite/data/features/transforms2d":577,"caniuse-lite/data/features/transforms3d":578,"caniuse-lite/data/features/user-select-none":589}],2:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +var Prefixer = require('./prefixer'); + +var AtRule = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(AtRule, _Prefixer); + + function AtRule() { + return _Prefixer.apply(this, arguments) || this; + } + + var _proto = AtRule.prototype; + /** + * Clone and add prefixes for at-rule + */ + + _proto.add = function add(rule, prefix) { + var prefixed = prefix + rule.name; + var already = rule.parent.some(function (i) { + return i.name === prefixed && i.params === rule.params; + }); + + if (already) { + return undefined; + } + + var cloned = this.clone(rule, { + name: prefixed + }); + return rule.parent.insertBefore(rule, cloned); + } + /** + * Clone node with prefixes + */ + ; + + _proto.process = function process(node) { + var parent = this.parentPrefix(node); + + for (var _iterator = _createForOfIteratorHelperLoose(this.prefixes), _step; !(_step = _iterator()).done;) { + var prefix = _step.value; + + if (!parent || parent === prefix) { + this.add(node, prefix); + } + } + }; + + return AtRule; +}(Prefixer); + +module.exports = AtRule; + +},{"./prefixer":67}],3:[function(require,module,exports){ +(function (process){ +"use strict"; + +var browserslist = require('browserslist'); + +var colorette = require('colorette'); + +var postcss = require('postcss'); + +var agents = require('caniuse-lite').agents; + +var Browsers = require('./browsers'); + +var Prefixes = require('./prefixes'); + +var data = require('../data/prefixes'); + +var info = require('./info'); + +var WARNING = '\n' + ' Replace Autoprefixer `browsers` option to Browserslist config.\n' + ' Use `browserslist` key in `package.json` or `.browserslistrc` file.\n' + '\n' + ' Using `browsers` option can cause errors. Browserslist config \n' + ' can be used for Babel, Autoprefixer, postcss-normalize and other tools.\n' + '\n' + ' If you really need to use option, rename it to `overrideBrowserslist`.\n' + '\n' + ' Learn more at:\n' + ' https://github.com/browserslist/browserslist#readme\n' + ' https://twitter.com/browserslist\n' + '\n'; + +function isPlainObject(obj) { + return Object.prototype.toString.apply(obj) === '[object Object]'; +} + +var cache = {}; + +function timeCapsule(result, prefixes) { + if (prefixes.browsers.selected.length === 0) { + return; + } + + if (prefixes.add.selectors.length > 0) { + return; + } + + if (Object.keys(prefixes.add).length > 2) { + return; + } + /* istanbul ignore next */ + + + result.warn('Greetings, time traveller. ' + 'We are in the golden age of prefix-less CSS, ' + 'where Autoprefixer is no longer needed for your stylesheet.'); +} + +module.exports = postcss.plugin('autoprefixer', function () { + for (var _len = arguments.length, reqs = new Array(_len), _key = 0; _key < _len; _key++) { + reqs[_key] = arguments[_key]; + } + + var options; + + if (reqs.length === 1 && isPlainObject(reqs[0])) { + options = reqs[0]; + reqs = undefined; + } else if (reqs.length === 0 || reqs.length === 1 && !reqs[0]) { + reqs = undefined; + } else if (reqs.length <= 2 && (Array.isArray(reqs[0]) || !reqs[0])) { + options = reqs[1]; + reqs = reqs[0]; + } else if (typeof reqs[reqs.length - 1] === 'object') { + options = reqs.pop(); + } + + if (!options) { + options = {}; + } + + if (options.browser) { + throw new Error('Change `browser` option to `overrideBrowserslist` in Autoprefixer'); + } else if (options.browserslist) { + throw new Error('Change `browserslist` option to `overrideBrowserslist` in Autoprefixer'); + } + + if (options.overrideBrowserslist) { + reqs = options.overrideBrowserslist; + } else if (options.browsers) { + if (typeof console !== 'undefined' && console.warn) { + if (colorette.red) { + console.warn(colorette.red(WARNING.replace(/`[^`]+`/g, function (i) { + return colorette.yellow(i.slice(1, -1)); + }))); + } else { + console.warn(WARNING); + } + } + + reqs = options.browsers; + } + + var brwlstOpts = { + ignoreUnknownVersions: options.ignoreUnknownVersions, + stats: options.stats, + env: options.env + }; + + function loadPrefixes(opts) { + var d = module.exports.data; + var browsers = new Browsers(d.browsers, reqs, opts, brwlstOpts); + var key = browsers.selected.join(', ') + JSON.stringify(options); + + if (!cache[key]) { + cache[key] = new Prefixes(d.prefixes, browsers, options); + } + + return cache[key]; + } + + function plugin(css, result) { + var prefixes = loadPrefixes({ + from: css.source && css.source.input.file, + env: options.env + }); + timeCapsule(result, prefixes); + + if (options.remove !== false) { + prefixes.processor.remove(css, result); + } + + if (options.add !== false) { + prefixes.processor.add(css, result); + } + } + + plugin.options = options; + plugin.browsers = reqs; + + plugin.info = function (opts) { + opts = opts || {}; + opts.from = opts.from || process.cwd(); + return info(loadPrefixes(opts)); + }; + + return plugin; +}); +/** + * Autoprefixer data + */ + +module.exports.data = { + browsers: agents, + prefixes: data +}; +/** + * Autoprefixer default browsers + */ + +module.exports.defaults = browserslist.defaults; +/** + * Inspect with default Autoprefixer + */ + +module.exports.info = function () { + return module.exports().info(); +}; + +}).call(this,require('_process')) +},{"../data/prefixes":1,"./browsers":5,"./info":64,"./prefixes":68,"_process":675,"browserslist":80,"caniuse-lite":637,"colorette":77,"postcss":663}],4:[function(require,module,exports){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function last(array) { + return array[array.length - 1]; +} + +var brackets = { + /** + * Parse string to nodes tree + */ + parse: function parse(str) { + var current = ['']; + var stack = [current]; + + for (var _iterator = _createForOfIteratorHelperLoose(str), _step; !(_step = _iterator()).done;) { + var sym = _step.value; + + if (sym === '(') { + current = ['']; + last(stack).push(current); + stack.push(current); + continue; + } + + if (sym === ')') { + stack.pop(); + current = last(stack); + current.push(''); + continue; + } + + current[current.length - 1] += sym; + } + + return stack[0]; + }, + + /** + * Generate output string by nodes tree + */ + stringify: function stringify(ast) { + var result = ''; + + for (var _iterator2 = _createForOfIteratorHelperLoose(ast), _step2; !(_step2 = _iterator2()).done;) { + var i = _step2.value; + + if (typeof i === 'object') { + result += "(" + brackets.stringify(i) + ")"; + continue; + } + + result += i; + } + + return result; + } +}; +module.exports = brackets; + +},{}],5:[function(require,module,exports){ +"use strict"; + +var browserslist = require('browserslist'); + +var agents = require('caniuse-lite').agents; + +var utils = require('./utils'); + +var Browsers = /*#__PURE__*/function () { + /** + * Return all prefixes for default browser data + */ + Browsers.prefixes = function prefixes() { + if (this.prefixesCache) { + return this.prefixesCache; + } + + this.prefixesCache = []; + + for (var name in agents) { + this.prefixesCache.push("-" + agents[name].prefix + "-"); + } + + this.prefixesCache = utils.uniq(this.prefixesCache).sort(function (a, b) { + return b.length - a.length; + }); + return this.prefixesCache; + } + /** + * Check is value contain any possible prefix + */ + ; + + Browsers.withPrefix = function withPrefix(value) { + if (!this.prefixesRegexp) { + this.prefixesRegexp = new RegExp(this.prefixes().join('|')); + } + + return this.prefixesRegexp.test(value); + }; + + function Browsers(data, requirements, options, browserslistOpts) { + this.data = data; + this.options = options || {}; + this.browserslistOpts = browserslistOpts || {}; + this.selected = this.parse(requirements); + } + /** + * Return browsers selected by requirements + */ + + + var _proto = Browsers.prototype; + + _proto.parse = function parse(requirements) { + var opts = {}; + + for (var i in this.browserslistOpts) { + opts[i] = this.browserslistOpts[i]; + } + + opts.path = this.options.from; + return browserslist(requirements, opts); + } + /** + * Return prefix for selected browser + */ + ; + + _proto.prefix = function prefix(browser) { + var _browser$split = browser.split(' '), + name = _browser$split[0], + version = _browser$split[1]; + + var data = this.data[name]; + var prefix = data.prefix_exceptions && data.prefix_exceptions[version]; + + if (!prefix) { + prefix = data.prefix; + } + + return "-" + prefix + "-"; + } + /** + * Is browser is selected by requirements + */ + ; + + _proto.isSelected = function isSelected(browser) { + return this.selected.includes(browser); + }; + + return Browsers; +}(); + +module.exports = Browsers; + +},{"./utils":74,"browserslist":80,"caniuse-lite":637}],6:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +var Prefixer = require('./prefixer'); + +var Browsers = require('./browsers'); + +var utils = require('./utils'); + +var Declaration = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(Declaration, _Prefixer); + + function Declaration() { + return _Prefixer.apply(this, arguments) || this; + } + + var _proto = Declaration.prototype; + /** + * Always true, because we already get prefixer by property name + */ + + _proto.check = function check() + /* decl */ + { + return true; + } + /** + * Return prefixed version of property + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + prop; + } + /** + * Return unprefixed version of property + */ + ; + + _proto.normalize = function normalize(prop) { + return prop; + } + /** + * Check `value`, that it contain other prefixes, rather than `prefix` + */ + ; + + _proto.otherPrefixes = function otherPrefixes(value, prefix) { + for (var _iterator = _createForOfIteratorHelperLoose(Browsers.prefixes()), _step; !(_step = _iterator()).done;) { + var other = _step.value; + + if (other === prefix) { + continue; + } + + if (value.includes(other)) { + return true; + } + } + + return false; + } + /** + * Set prefix to declaration + */ + ; + + _proto.set = function set(decl, prefix) { + decl.prop = this.prefixed(decl.prop, prefix); + return decl; + } + /** + * Should we use visual cascade for prefixes + */ + ; + + _proto.needCascade = function needCascade(decl) { + if (!decl._autoprefixerCascade) { + decl._autoprefixerCascade = this.all.options.cascade !== false && decl.raw('before').includes('\n'); + } + + return decl._autoprefixerCascade; + } + /** + * Return maximum length of possible prefixed property + */ + ; + + _proto.maxPrefixed = function maxPrefixed(prefixes, decl) { + if (decl._autoprefixerMax) { + return decl._autoprefixerMax; + } + + var max = 0; + + for (var _iterator2 = _createForOfIteratorHelperLoose(prefixes), _step2; !(_step2 = _iterator2()).done;) { + var prefix = _step2.value; + prefix = utils.removeNote(prefix); + + if (prefix.length > max) { + max = prefix.length; + } + } + + decl._autoprefixerMax = max; + return decl._autoprefixerMax; + } + /** + * Calculate indentation to create visual cascade + */ + ; + + _proto.calcBefore = function calcBefore(prefixes, decl, prefix) { + if (prefix === void 0) { + prefix = ''; + } + + var max = this.maxPrefixed(prefixes, decl); + var diff = max - utils.removeNote(prefix).length; + var before = decl.raw('before'); + + if (diff > 0) { + before += Array(diff).fill(' ').join(''); + } + + return before; + } + /** + * Remove visual cascade + */ + ; + + _proto.restoreBefore = function restoreBefore(decl) { + var lines = decl.raw('before').split('\n'); + var min = lines[lines.length - 1]; + this.all.group(decl).up(function (prefixed) { + var array = prefixed.raw('before').split('\n'); + var last = array[array.length - 1]; + + if (last.length < min.length) { + min = last; + } + }); + lines[lines.length - 1] = min; + decl.raws.before = lines.join('\n'); + } + /** + * Clone and insert new declaration + */ + ; + + _proto.insert = function insert(decl, prefix, prefixes) { + var cloned = this.set(this.clone(decl), prefix); + if (!cloned) return undefined; + var already = decl.parent.some(function (i) { + return i.prop === cloned.prop && i.value === cloned.value; + }); + + if (already) { + return undefined; + } + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, cloned); + } + /** + * Did this declaration has this prefix above + */ + ; + + _proto.isAlready = function isAlready(decl, prefixed) { + var already = this.all.group(decl).up(function (i) { + return i.prop === prefixed; + }); + + if (!already) { + already = this.all.group(decl).down(function (i) { + return i.prop === prefixed; + }); + } + + return already; + } + /** + * Clone and add prefixes for declaration + */ + ; + + _proto.add = function add(decl, prefix, prefixes, result) { + var prefixed = this.prefixed(decl.prop, prefix); + + if (this.isAlready(decl, prefixed) || this.otherPrefixes(decl.value, prefix)) { + return undefined; + } + + return this.insert(decl, prefix, prefixes, result); + } + /** + * Add spaces for visual cascade + */ + ; + + _proto.process = function process(decl, result) { + if (!this.needCascade(decl)) { + _Prefixer.prototype.process.call(this, decl, result); + + return; + } + + var prefixes = _Prefixer.prototype.process.call(this, decl, result); + + if (!prefixes || !prefixes.length) { + return; + } + + this.restoreBefore(decl); + decl.raws.before = this.calcBefore(prefixes, decl); + } + /** + * Return list of prefixed properties to clean old prefixes + */ + ; + + _proto.old = function old(prop, prefix) { + return [this.prefixed(prop, prefix)]; + }; + + return Declaration; +}(Prefixer); + +module.exports = Declaration; + +},{"./browsers":5,"./prefixer":67,"./utils":74}],7:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var AlignContent = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(AlignContent, _Declaration); + + function AlignContent() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = AlignContent.prototype; + /** + * Change property name for 2012 spec + */ + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2012) { + return prefix + 'flex-line-pack'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'align-content'; + } + /** + * Change value for 2012 spec and ignore prefix for 2009 + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2012) { + decl.value = AlignContent.oldValues[decl.value] || decl.value; + return _Declaration.prototype.set.call(this, decl, prefix); + } + + if (spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return AlignContent; +}(Declaration); + +_defineProperty(AlignContent, "names", ['align-content', 'flex-line-pack']); + +_defineProperty(AlignContent, "oldValues", { + 'flex-end': 'end', + 'flex-start': 'start', + 'space-between': 'justify', + 'space-around': 'distribute' +}); + +module.exports = AlignContent; + +},{"../declaration":6,"./flex-spec":30}],8:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var AlignItems = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(AlignItems, _Declaration); + + function AlignItems() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = AlignItems.prototype; + /** + * Change property name for 2009 and 2012 specs + */ + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-align'; + } + + if (spec === 2012) { + return prefix + 'flex-align'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'align-items'; + } + /** + * Change value for 2009 and 2012 specs + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2009 || spec === 2012) { + decl.value = AlignItems.oldValues[decl.value] || decl.value; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return AlignItems; +}(Declaration); + +_defineProperty(AlignItems, "names", ['align-items', 'flex-align', 'box-align']); + +_defineProperty(AlignItems, "oldValues", { + 'flex-end': 'end', + 'flex-start': 'start' +}); + +module.exports = AlignItems; + +},{"../declaration":6,"./flex-spec":30}],9:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var AlignSelf = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(AlignSelf, _Declaration); + + function AlignSelf() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = AlignSelf.prototype; + + _proto.check = function check(decl) { + return decl.parent && !decl.parent.some(function (i) { + return i.prop && i.prop.startsWith('grid-'); + }); + } + /** + * Change property name for 2012 specs + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2012) { + return prefix + 'flex-item-align'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'align-self'; + } + /** + * Change value for 2012 spec and ignore prefix for 2009 + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2012) { + decl.value = AlignSelf.oldValues[decl.value] || decl.value; + return _Declaration.prototype.set.call(this, decl, prefix); + } + + if (spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return AlignSelf; +}(Declaration); + +_defineProperty(AlignSelf, "names", ['align-self', 'flex-item-align']); + +_defineProperty(AlignSelf, "oldValues", { + 'flex-end': 'end', + 'flex-start': 'start' +}); + +module.exports = AlignSelf; + +},{"../declaration":6,"./flex-spec":30}],10:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var Animation = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Animation, _Declaration); + + function Animation() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Animation.prototype; + /** + * Don’t add prefixes for modern values. + */ + + _proto.check = function check(decl) { + return !decl.value.split(/\s+/).some(function (i) { + var lower = i.toLowerCase(); + return lower === 'reverse' || lower === 'alternate-reverse'; + }); + }; + + return Animation; +}(Declaration); + +_defineProperty(Animation, "names", ['animation', 'animation-direction']); + +module.exports = Animation; + +},{"../declaration":6}],11:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var utils = require('../utils'); + +var Appearance = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Appearance, _Declaration); + + function Appearance(name, prefixes, all) { + var _this; + + _this = _Declaration.call(this, name, prefixes, all) || this; + + if (_this.prefixes) { + _this.prefixes = utils.uniq(_this.prefixes.map(function (i) { + if (i === '-ms-') { + return '-webkit-'; + } + + return i; + })); + } + + return _this; + } + + return Appearance; +}(Declaration); + +_defineProperty(Appearance, "names", ['appearance']); + +module.exports = Appearance; + +},{"../declaration":6,"../utils":74}],12:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var utils = require('../utils'); + +var BackdropFilter = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BackdropFilter, _Declaration); + + function BackdropFilter(name, prefixes, all) { + var _this; + + _this = _Declaration.call(this, name, prefixes, all) || this; + + if (_this.prefixes) { + _this.prefixes = utils.uniq(_this.prefixes.map(function (i) { + return i === '-ms-' ? '-webkit-' : i; + })); + } + + return _this; + } + + return BackdropFilter; +}(Declaration); + +_defineProperty(BackdropFilter, "names", ['backdrop-filter']); + +module.exports = BackdropFilter; + +},{"../declaration":6,"../utils":74}],13:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var utils = require('../utils'); + +var BackgroundClip = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BackgroundClip, _Declaration); + + function BackgroundClip(name, prefixes, all) { + var _this; + + _this = _Declaration.call(this, name, prefixes, all) || this; + + if (_this.prefixes) { + _this.prefixes = utils.uniq(_this.prefixes.map(function (i) { + return i === '-ms-' ? '-webkit-' : i; + })); + } + + return _this; + } + + var _proto = BackgroundClip.prototype; + + _proto.check = function check(decl) { + return decl.value.toLowerCase() === 'text'; + }; + + return BackgroundClip; +}(Declaration); + +_defineProperty(BackgroundClip, "names", ['background-clip']); + +module.exports = BackgroundClip; + +},{"../declaration":6,"../utils":74}],14:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var BackgroundSize = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BackgroundSize, _Declaration); + + function BackgroundSize() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BackgroundSize.prototype; + /** + * Duplication parameter for -webkit- browsers + */ + + _proto.set = function set(decl, prefix) { + var value = decl.value.toLowerCase(); + + if (prefix === '-webkit-' && !value.includes(' ') && value !== 'contain' && value !== 'cover') { + decl.value = decl.value + ' ' + decl.value; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return BackgroundSize; +}(Declaration); + +_defineProperty(BackgroundSize, "names", ['background-size']); + +module.exports = BackgroundSize; + +},{"../declaration":6}],15:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var BlockLogical = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BlockLogical, _Declaration); + + function BlockLogical() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BlockLogical.prototype; + /** + * Use old syntax for -moz- and -webkit- + */ + + _proto.prefixed = function prefixed(prop, prefix) { + if (prop.includes('-start')) { + return prefix + prop.replace('-block-start', '-before'); + } + + return prefix + prop.replace('-block-end', '-after'); + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize(prop) { + if (prop.includes('-before')) { + return prop.replace('-before', '-block-start'); + } + + return prop.replace('-after', '-block-end'); + }; + + return BlockLogical; +}(Declaration); + +_defineProperty(BlockLogical, "names", ['border-block-start', 'border-block-end', 'margin-block-start', 'margin-block-end', 'padding-block-start', 'padding-block-end', 'border-before', 'border-after', 'margin-before', 'margin-after', 'padding-before', 'padding-after']); + +module.exports = BlockLogical; + +},{"../declaration":6}],16:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var BorderImage = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BorderImage, _Declaration); + + function BorderImage() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BorderImage.prototype; + /** + * Remove fill parameter for prefixed declarations + */ + + _proto.set = function set(decl, prefix) { + decl.value = decl.value.replace(/\s+fill(\s)/, '$1'); + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return BorderImage; +}(Declaration); + +_defineProperty(BorderImage, "names", ['border-image']); + +module.exports = BorderImage; + +},{"../declaration":6}],17:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var BorderRadius = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BorderRadius, _Declaration); + + function BorderRadius() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BorderRadius.prototype; + /** + * Change syntax, when add Mozilla prefix + */ + + _proto.prefixed = function prefixed(prop, prefix) { + if (prefix === '-moz-') { + return prefix + (BorderRadius.toMozilla[prop] || prop); + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return unprefixed version of property + */ + ; + + _proto.normalize = function normalize(prop) { + return BorderRadius.toNormal[prop] || prop; + }; + + return BorderRadius; +}(Declaration); + +_defineProperty(BorderRadius, "names", ['border-radius']); + +_defineProperty(BorderRadius, "toMozilla", {}); + +_defineProperty(BorderRadius, "toNormal", {}); + +for (var _i = 0, _arr = ['top', 'bottom']; _i < _arr.length; _i++) { + var ver = _arr[_i]; + + for (var _i2 = 0, _arr2 = ['left', 'right']; _i2 < _arr2.length; _i2++) { + var hor = _arr2[_i2]; + var normal = "border-" + ver + "-" + hor + "-radius"; + var mozilla = "border-radius-" + ver + hor; + BorderRadius.names.push(normal); + BorderRadius.names.push(mozilla); + BorderRadius.toMozilla[normal] = mozilla; + BorderRadius.toNormal[mozilla] = normal; + } +} + +module.exports = BorderRadius; + +},{"../declaration":6}],18:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var BreakProps = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(BreakProps, _Declaration); + + function BreakProps() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = BreakProps.prototype; + /** + * Change name for -webkit- and -moz- prefix + */ + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + "column-" + prop; + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize(prop) { + if (prop.includes('inside')) { + return 'break-inside'; + } + + if (prop.includes('before')) { + return 'break-before'; + } + + return 'break-after'; + } + /** + * Change prefixed value for avoid-column and avoid-page + */ + ; + + _proto.set = function set(decl, prefix) { + if (decl.prop === 'break-inside' && decl.value === 'avoid-column' || decl.value === 'avoid-page') { + decl.value = 'avoid'; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + } + /** + * Don’t prefix some values + */ + ; + + _proto.insert = function insert(decl, prefix, prefixes) { + if (decl.prop !== 'break-inside') { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + + if (/region/i.test(decl.value) || /page/i.test(decl.value)) { + return undefined; + } + + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + }; + + return BreakProps; +}(Declaration); + +_defineProperty(BreakProps, "names", ['break-inside', 'page-break-inside', 'column-break-inside', 'break-before', 'page-break-before', 'column-break-before', 'break-after', 'page-break-after', 'column-break-after']); + +module.exports = BreakProps; + +},{"../declaration":6}],19:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var ColorAdjust = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(ColorAdjust, _Declaration); + + function ColorAdjust() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = ColorAdjust.prototype; + /** + * Change property name for WebKit-based browsers + */ + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + 'print-color-adjust'; + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize() { + return 'color-adjust'; + }; + + return ColorAdjust; +}(Declaration); + +_defineProperty(ColorAdjust, "names", ['color-adjust', 'print-color-adjust']); + +module.exports = ColorAdjust; + +},{"../declaration":6}],20:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var list = require('postcss').list; + +var Value = require('../value'); + +var CrossFade = /*#__PURE__*/function (_Value) { + _inheritsLoose(CrossFade, _Value); + + function CrossFade() { + return _Value.apply(this, arguments) || this; + } + + var _proto = CrossFade.prototype; + + _proto.replace = function replace(string, prefix) { + var _this = this; + + return list.space(string).map(function (value) { + if (value.slice(0, +_this.name.length + 1) !== _this.name + '(') { + return value; + } + + var close = value.lastIndexOf(')'); + var after = value.slice(close + 1); + var args = value.slice(_this.name.length + 1, close); + + if (prefix === '-webkit-') { + var match = args.match(/\d*.?\d+%?/); + + if (match) { + args = args.slice(match[0].length).trim(); + args += ", " + match[0]; + } else { + args += ', 0.5'; + } + } + + return prefix + _this.name + '(' + args + ')' + after; + }).join(' '); + }; + + return CrossFade; +}(Value); + +_defineProperty(CrossFade, "names", ['cross-fade']); + +module.exports = CrossFade; + +},{"../value":75,"postcss":663}],21:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var OldValue = require('../old-value'); + +var Value = require('../value'); + +var DisplayFlex = /*#__PURE__*/function (_Value) { + _inheritsLoose(DisplayFlex, _Value); + + function DisplayFlex(name, prefixes) { + var _this; + + _this = _Value.call(this, name, prefixes) || this; + + if (name === 'display-flex') { + _this.name = 'flex'; + } + + return _this; + } + /** + * Faster check for flex value + */ + + + var _proto = DisplayFlex.prototype; + + _proto.check = function check(decl) { + return decl.prop === 'display' && decl.value === this.name; + } + /** + * Return value by spec + */ + ; + + _proto.prefixed = function prefixed(prefix) { + var spec, value; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + if (this.name === 'flex') { + value = 'box'; + } else { + value = 'inline-box'; + } + } else if (spec === 2012) { + if (this.name === 'flex') { + value = 'flexbox'; + } else { + value = 'inline-flexbox'; + } + } else if (spec === 'final') { + value = this.name; + } + + return prefix + value; + } + /** + * Add prefix to value depend on flebox spec version + */ + ; + + _proto.replace = function replace(string, prefix) { + return this.prefixed(prefix); + } + /** + * Change value for old specs + */ + ; + + _proto.old = function old(prefix) { + var prefixed = this.prefixed(prefix); + if (!prefixed) return undefined; + return new OldValue(this.name, prefixed); + }; + + return DisplayFlex; +}(Value); + +_defineProperty(DisplayFlex, "names", ['display-flex', 'inline-flex']); + +module.exports = DisplayFlex; + +},{"../old-value":66,"../value":75,"./flex-spec":30}],22:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Value = require('../value'); + +var DisplayGrid = /*#__PURE__*/function (_Value) { + _inheritsLoose(DisplayGrid, _Value); + + function DisplayGrid(name, prefixes) { + var _this; + + _this = _Value.call(this, name, prefixes) || this; + + if (name === 'display-grid') { + _this.name = 'grid'; + } + + return _this; + } + /** + * Faster check for flex value + */ + + + var _proto = DisplayGrid.prototype; + + _proto.check = function check(decl) { + return decl.prop === 'display' && decl.value === this.name; + }; + + return DisplayGrid; +}(Value); + +_defineProperty(DisplayGrid, "names", ['display-grid', 'inline-grid']); + +module.exports = DisplayGrid; + +},{"../value":75}],23:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Value = require('../value'); + +var FilterValue = /*#__PURE__*/function (_Value) { + _inheritsLoose(FilterValue, _Value); + + function FilterValue(name, prefixes) { + var _this; + + _this = _Value.call(this, name, prefixes) || this; + + if (name === 'filter-function') { + _this.name = 'filter'; + } + + return _this; + } + + return FilterValue; +}(Value); + +_defineProperty(FilterValue, "names", ['filter', 'filter-function']); + +module.exports = FilterValue; + +},{"../value":75}],24:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var Filter = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Filter, _Declaration); + + function Filter() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Filter.prototype; + /** + * Check is it Internet Explorer filter + */ + + _proto.check = function check(decl) { + var v = decl.value; + return !v.toLowerCase().includes('alpha(') && !v.includes('DXImageTransform.Microsoft') && !v.includes('data:image/svg+xml'); + }; + + return Filter; +}(Declaration); + +_defineProperty(Filter, "names", ['filter']); + +module.exports = Filter; + +},{"../declaration":6}],25:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexBasis = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexBasis, _Declaration); + + function FlexBasis() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexBasis.prototype; + /** + * Return property name by final spec + */ + + _proto.normalize = function normalize() { + return 'flex-basis'; + } + /** + * Return flex property for 2012 spec + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2012) { + return prefix + 'flex-preferred-size'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Ignore 2009 spec and use flex property for 2012 + */ + ; + + _proto.set = function set(decl, prefix) { + var spec; + + var _flexSpec2 = flexSpec(prefix); + + spec = _flexSpec2[0]; + prefix = _flexSpec2[1]; + + if (spec === 2012 || spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return FlexBasis; +}(Declaration); + +_defineProperty(FlexBasis, "names", ['flex-basis', 'flex-preferred-size']); + +module.exports = FlexBasis; + +},{"../declaration":6,"./flex-spec":30}],26:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexDirection = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexDirection, _Declaration); + + function FlexDirection() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexDirection.prototype; + /** + * Return property name by final spec + */ + + _proto.normalize = function normalize() { + return 'flex-direction'; + } + /** + * Use two properties for 2009 spec + */ + ; + + _proto.insert = function insert(decl, prefix, prefixes) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec !== 2009) { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + + var already = decl.parent.some(function (i) { + return i.prop === prefix + 'box-orient' || i.prop === prefix + 'box-direction'; + }); + + if (already) { + return undefined; + } + + var v = decl.value; + var orient, dir; + + if (v === 'inherit' || v === 'initial' || v === 'unset') { + orient = v; + dir = v; + } else { + orient = v.includes('row') ? 'horizontal' : 'vertical'; + dir = v.includes('reverse') ? 'reverse' : 'normal'; + } + + var cloned = this.clone(decl); + cloned.prop = prefix + 'box-orient'; + cloned.value = orient; + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + decl.parent.insertBefore(decl, cloned); + cloned = this.clone(decl); + cloned.prop = prefix + 'box-direction'; + cloned.value = dir; + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, cloned); + } + /** + * Clean two properties for 2009 spec + */ + ; + + _proto.old = function old(prop, prefix) { + var spec; + + var _flexSpec2 = flexSpec(prefix); + + spec = _flexSpec2[0]; + prefix = _flexSpec2[1]; + + if (spec === 2009) { + return [prefix + 'box-orient', prefix + 'box-direction']; + } else { + return _Declaration.prototype.old.call(this, prop, prefix); + } + }; + + return FlexDirection; +}(Declaration); + +_defineProperty(FlexDirection, "names", ['flex-direction', 'box-direction', 'box-orient']); + +module.exports = FlexDirection; + +},{"../declaration":6,"./flex-spec":30}],27:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexFlow = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexFlow, _Declaration); + + function FlexFlow() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexFlow.prototype; + /** + * Use two properties for 2009 spec + */ + + _proto.insert = function insert(decl, prefix, prefixes) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec !== 2009) { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + + var values = decl.value.split(/\s+/).filter(function (i) { + return i !== 'wrap' && i !== 'nowrap' && 'wrap-reverse'; + }); + + if (values.length === 0) { + return undefined; + } + + var already = decl.parent.some(function (i) { + return i.prop === prefix + 'box-orient' || i.prop === prefix + 'box-direction'; + }); + + if (already) { + return undefined; + } + + var value = values[0]; + var orient = value.includes('row') ? 'horizontal' : 'vertical'; + var dir = value.includes('reverse') ? 'reverse' : 'normal'; + var cloned = this.clone(decl); + cloned.prop = prefix + 'box-orient'; + cloned.value = orient; + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + decl.parent.insertBefore(decl, cloned); + cloned = this.clone(decl); + cloned.prop = prefix + 'box-direction'; + cloned.value = dir; + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, cloned); + }; + + return FlexFlow; +}(Declaration); + +_defineProperty(FlexFlow, "names", ['flex-flow', 'box-direction', 'box-orient']); + +module.exports = FlexFlow; + +},{"../declaration":6,"./flex-spec":30}],28:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var Flex = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Flex, _Declaration); + + function Flex() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Flex.prototype; + /** + * Return property name by final spec + */ + + _proto.normalize = function normalize() { + return 'flex'; + } + /** + * Return flex property for 2009 and 2012 specs + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-flex'; + } + + if (spec === 2012) { + return prefix + 'flex-positive'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + }; + + return Flex; +}(Declaration); + +_defineProperty(Flex, "names", ['flex-grow', 'flex-positive']); + +module.exports = Flex; + +},{"../declaration":6,"./flex-spec":30}],29:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexShrink = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexShrink, _Declaration); + + function FlexShrink() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexShrink.prototype; + /** + * Return property name by final spec + */ + + _proto.normalize = function normalize() { + return 'flex-shrink'; + } + /** + * Return flex property for 2012 spec + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2012) { + return prefix + 'flex-negative'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Ignore 2009 spec and use flex property for 2012 + */ + ; + + _proto.set = function set(decl, prefix) { + var spec; + + var _flexSpec2 = flexSpec(prefix); + + spec = _flexSpec2[0]; + prefix = _flexSpec2[1]; + + if (spec === 2012 || spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return FlexShrink; +}(Declaration); + +_defineProperty(FlexShrink, "names", ['flex-shrink', 'flex-negative']); + +module.exports = FlexShrink; + +},{"../declaration":6,"./flex-spec":30}],30:[function(require,module,exports){ +"use strict"; +/** + * Return flexbox spec versions by prefix + */ + +module.exports = function (prefix) { + var spec; + + if (prefix === '-webkit- 2009' || prefix === '-moz-') { + spec = 2009; + } else if (prefix === '-ms-') { + spec = 2012; + } else if (prefix === '-webkit-') { + spec = 'final'; + } + + if (prefix === '-webkit- 2009') { + prefix = '-webkit-'; + } + + return [spec, prefix]; +}; + +},{}],31:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var FlexWrap = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(FlexWrap, _Declaration); + + function FlexWrap() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = FlexWrap.prototype; + /** + * Don't add prefix for 2009 spec + */ + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec !== 2009) { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return FlexWrap; +}(Declaration); + +_defineProperty(FlexWrap, "names", ['flex-wrap']); + +module.exports = FlexWrap; + +},{"../declaration":6,"./flex-spec":30}],32:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var list = require('postcss').list; + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var Flex = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Flex, _Declaration); + + function Flex() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Flex.prototype; + /** + * Change property name for 2009 spec + */ + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-flex'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'flex'; + } + /** + * Spec 2009 supports only first argument + * Spec 2012 disallows unitless basis + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2009) { + decl.value = list.space(decl.value)[0]; + decl.value = Flex.oldValues[decl.value] || decl.value; + return _Declaration.prototype.set.call(this, decl, prefix); + } + + if (spec === 2012) { + var components = list.space(decl.value); + + if (components.length === 3 && components[2] === '0') { + decl.value = components.slice(0, 2).concat('0px').join(' '); + } + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return Flex; +}(Declaration); + +_defineProperty(Flex, "names", ['flex', 'box-flex']); + +_defineProperty(Flex, "oldValues", { + auto: '1', + none: '0' +}); + +module.exports = Flex; + +},{"../declaration":6,"./flex-spec":30,"postcss":663}],33:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Selector = require('../selector'); + +var Fullscreen = /*#__PURE__*/function (_Selector) { + _inheritsLoose(Fullscreen, _Selector); + + function Fullscreen() { + return _Selector.apply(this, arguments) || this; + } + + var _proto = Fullscreen.prototype; + /** + * Return different selectors depend on prefix + */ + + _proto.prefixed = function prefixed(prefix) { + if (prefix === '-webkit-') { + return ':-webkit-full-screen'; + } + + if (prefix === '-moz-') { + return ':-moz-full-screen'; + } + + return ":" + prefix + "fullscreen"; + }; + + return Fullscreen; +}(Selector); + +_defineProperty(Fullscreen, "names", [':fullscreen']); + +module.exports = Fullscreen; + +},{"../selector":71}],34:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var parser = require('postcss-value-parser'); + +var range = require('normalize-range'); + +var OldValue = require('../old-value'); + +var Value = require('../value'); + +var utils = require('../utils'); + +var IS_DIRECTION = /top|left|right|bottom/gi; + +var Gradient = /*#__PURE__*/function (_Value) { + _inheritsLoose(Gradient, _Value); + + function Gradient() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Value.call.apply(_Value, [this].concat(args)) || this; + + _defineProperty(_assertThisInitialized(_this), "directions", { + top: 'bottom', + left: 'right', + bottom: 'top', + right: 'left' + }); + + _defineProperty(_assertThisInitialized(_this), "oldDirections", { + 'top': 'left bottom, left top', + 'left': 'right top, left top', + 'bottom': 'left top, left bottom', + 'right': 'left top, right top', + 'top right': 'left bottom, right top', + 'top left': 'right bottom, left top', + 'right top': 'left bottom, right top', + 'right bottom': 'left top, right bottom', + 'bottom right': 'left top, right bottom', + 'bottom left': 'right top, left bottom', + 'left top': 'right bottom, left top', + 'left bottom': 'right top, left bottom' + }); + + return _this; + } + + var _proto = Gradient.prototype; + /** + * Change degrees for webkit prefix + */ + + _proto.replace = function replace(string, prefix) { + var ast = parser(string); + + for (var _iterator = _createForOfIteratorHelperLoose(ast.nodes), _step; !(_step = _iterator()).done;) { + var node = _step.value; + + if (node.type === 'function' && node.value === this.name) { + node.nodes = this.newDirection(node.nodes); + node.nodes = this.normalize(node.nodes); + + if (prefix === '-webkit- old') { + var changes = this.oldWebkit(node); + + if (!changes) { + return false; + } + } else { + node.nodes = this.convertDirection(node.nodes); + node.value = prefix + node.value; + } + } + } + + return ast.toString(); + } + /** + * Replace first token + */ + ; + + _proto.replaceFirst = function replaceFirst(params) { + for (var _len2 = arguments.length, words = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + words[_key2 - 1] = arguments[_key2]; + } + + var prefix = words.map(function (i) { + if (i === ' ') { + return { + type: 'space', + value: i + }; + } + + return { + type: 'word', + value: i + }; + }); + return prefix.concat(params.slice(1)); + } + /** + * Convert angle unit to deg + */ + ; + + _proto.normalizeUnit = function normalizeUnit(str, full) { + var num = parseFloat(str); + var deg = num / full * 360; + return deg + "deg"; + } + /** + * Normalize angle + */ + ; + + _proto.normalize = function normalize(nodes) { + if (!nodes[0]) return nodes; + + if (/-?\d+(.\d+)?grad/.test(nodes[0].value)) { + nodes[0].value = this.normalizeUnit(nodes[0].value, 400); + } else if (/-?\d+(.\d+)?rad/.test(nodes[0].value)) { + nodes[0].value = this.normalizeUnit(nodes[0].value, 2 * Math.PI); + } else if (/-?\d+(.\d+)?turn/.test(nodes[0].value)) { + nodes[0].value = this.normalizeUnit(nodes[0].value, 1); + } else if (nodes[0].value.includes('deg')) { + var num = parseFloat(nodes[0].value); + num = range.wrap(0, 360, num); + nodes[0].value = num + "deg"; + } + + if (nodes[0].value === '0deg') { + nodes = this.replaceFirst(nodes, 'to', ' ', 'top'); + } else if (nodes[0].value === '90deg') { + nodes = this.replaceFirst(nodes, 'to', ' ', 'right'); + } else if (nodes[0].value === '180deg') { + nodes = this.replaceFirst(nodes, 'to', ' ', 'bottom'); + } else if (nodes[0].value === '270deg') { + nodes = this.replaceFirst(nodes, 'to', ' ', 'left'); + } + + return nodes; + } + /** + * Replace old direction to new + */ + ; + + _proto.newDirection = function newDirection(params) { + if (params[0].value === 'to') { + return params; + } + + IS_DIRECTION.lastIndex = 0; // reset search index of global regexp + + if (!IS_DIRECTION.test(params[0].value)) { + return params; + } + + params.unshift({ + type: 'word', + value: 'to' + }, { + type: 'space', + value: ' ' + }); + + for (var i = 2; i < params.length; i++) { + if (params[i].type === 'div') { + break; + } + + if (params[i].type === 'word') { + params[i].value = this.revertDirection(params[i].value); + } + } + + return params; + } + /** + * Look for at word + */ + ; + + _proto.isRadial = function isRadial(params) { + var state = 'before'; + + for (var _iterator2 = _createForOfIteratorHelperLoose(params), _step2; !(_step2 = _iterator2()).done;) { + var param = _step2.value; + + if (state === 'before' && param.type === 'space') { + state = 'at'; + } else if (state === 'at' && param.value === 'at') { + state = 'after'; + } else if (state === 'after' && param.type === 'space') { + return true; + } else if (param.type === 'div') { + break; + } else { + state = 'before'; + } + } + + return false; + } + /** + * Change new direction to old + */ + ; + + _proto.convertDirection = function convertDirection(params) { + if (params.length > 0) { + if (params[0].value === 'to') { + this.fixDirection(params); + } else if (params[0].value.includes('deg')) { + this.fixAngle(params); + } else if (this.isRadial(params)) { + this.fixRadial(params); + } + } + + return params; + } + /** + * Replace `to top left` to `bottom right` + */ + ; + + _proto.fixDirection = function fixDirection(params) { + params.splice(0, 2); + + for (var _iterator3 = _createForOfIteratorHelperLoose(params), _step3; !(_step3 = _iterator3()).done;) { + var param = _step3.value; + + if (param.type === 'div') { + break; + } + + if (param.type === 'word') { + param.value = this.revertDirection(param.value); + } + } + } + /** + * Add 90 degrees + */ + ; + + _proto.fixAngle = function fixAngle(params) { + var first = params[0].value; + first = parseFloat(first); + first = Math.abs(450 - first) % 360; + first = this.roundFloat(first, 3); + params[0].value = first + "deg"; + } + /** + * Fix radial direction syntax + */ + ; + + _proto.fixRadial = function fixRadial(params) { + var first = []; + var second = []; + var a, b, c, i, next; + + for (i = 0; i < params.length - 2; i++) { + a = params[i]; + b = params[i + 1]; + c = params[i + 2]; + + if (a.type === 'space' && b.value === 'at' && c.type === 'space') { + next = i + 3; + break; + } else { + first.push(a); + } + } + + var div; + + for (i = next; i < params.length; i++) { + if (params[i].type === 'div') { + div = params[i]; + break; + } else { + second.push(params[i]); + } + } + + params.splice.apply(params, [0, i].concat(second, [div], first)); + }; + + _proto.revertDirection = function revertDirection(word) { + return this.directions[word.toLowerCase()] || word; + } + /** + * Round float and save digits under dot + */ + ; + + _proto.roundFloat = function roundFloat(_float, digits) { + return parseFloat(_float.toFixed(digits)); + } + /** + * Convert to old webkit syntax + */ + ; + + _proto.oldWebkit = function oldWebkit(node) { + var nodes = node.nodes; + var string = parser.stringify(node.nodes); + + if (this.name !== 'linear-gradient') { + return false; + } + + if (nodes[0] && nodes[0].value.includes('deg')) { + return false; + } + + if (string.includes('px') || string.includes('-corner') || string.includes('-side')) { + return false; + } + + var params = [[]]; + + for (var _iterator4 = _createForOfIteratorHelperLoose(nodes), _step4; !(_step4 = _iterator4()).done;) { + var i = _step4.value; + params[params.length - 1].push(i); + + if (i.type === 'div' && i.value === ',') { + params.push([]); + } + } + + this.oldDirection(params); + this.colorStops(params); + node.nodes = []; + + for (var _i = 0, _params = params; _i < _params.length; _i++) { + var param = _params[_i]; + node.nodes = node.nodes.concat(param); + } + + node.nodes.unshift({ + type: 'word', + value: 'linear' + }, this.cloneDiv(node.nodes)); + node.value = '-webkit-gradient'; + return true; + } + /** + * Change direction syntax to old webkit + */ + ; + + _proto.oldDirection = function oldDirection(params) { + var div = this.cloneDiv(params[0]); + + if (params[0][0].value !== 'to') { + return params.unshift([{ + type: 'word', + value: this.oldDirections.bottom + }, div]); + } else { + var words = []; + + for (var _iterator5 = _createForOfIteratorHelperLoose(params[0].slice(2)), _step5; !(_step5 = _iterator5()).done;) { + var node = _step5.value; + + if (node.type === 'word') { + words.push(node.value.toLowerCase()); + } + } + + words = words.join(' '); + var old = this.oldDirections[words] || words; + params[0] = [{ + type: 'word', + value: old + }, div]; + return params[0]; + } + } + /** + * Get div token from exists parameters + */ + ; + + _proto.cloneDiv = function cloneDiv(params) { + for (var _iterator6 = _createForOfIteratorHelperLoose(params), _step6; !(_step6 = _iterator6()).done;) { + var i = _step6.value; + + if (i.type === 'div' && i.value === ',') { + return i; + } + } + + return { + type: 'div', + value: ',', + after: ' ' + }; + } + /** + * Change colors syntax to old webkit + */ + ; + + _proto.colorStops = function colorStops(params) { + var result = []; + + for (var i = 0; i < params.length; i++) { + var pos = void 0; + var param = params[i]; + var item = void 0; + + if (i === 0) { + continue; + } + + var color = parser.stringify(param[0]); + + if (param[1] && param[1].type === 'word') { + pos = param[1].value; + } else if (param[2] && param[2].type === 'word') { + pos = param[2].value; + } + + var stop = void 0; + + if (i === 1 && (!pos || pos === '0%')) { + stop = "from(" + color + ")"; + } else if (i === params.length - 1 && (!pos || pos === '100%')) { + stop = "to(" + color + ")"; + } else if (pos) { + stop = "color-stop(" + pos + ", " + color + ")"; + } else { + stop = "color-stop(" + color + ")"; + } + + var div = param[param.length - 1]; + params[i] = [{ + type: 'word', + value: stop + }]; + + if (div.type === 'div' && div.value === ',') { + item = params[i].push(div); + } + + result.push(item); + } + + return result; + } + /** + * Remove old WebKit gradient too + */ + ; + + _proto.old = function old(prefix) { + if (prefix === '-webkit-') { + var type = this.name === 'linear-gradient' ? 'linear' : 'radial'; + var string = '-gradient'; + var regexp = utils.regexp("-webkit-(" + type + "-gradient|gradient\\(\\s*" + type + ")", false); + return new OldValue(this.name, prefix + this.name, string, regexp); + } else { + return _Value.prototype.old.call(this, prefix); + } + } + /** + * Do not add non-webkit prefixes for list-style and object + */ + ; + + _proto.add = function add(decl, prefix) { + var p = decl.prop; + + if (p.includes('mask')) { + if (prefix === '-webkit-' || prefix === '-webkit- old') { + return _Value.prototype.add.call(this, decl, prefix); + } + } else if (p === 'list-style' || p === 'list-style-image' || p === 'content') { + if (prefix === '-webkit-' || prefix === '-webkit- old') { + return _Value.prototype.add.call(this, decl, prefix); + } + } else { + return _Value.prototype.add.call(this, decl, prefix); + } + + return undefined; + }; + + return Gradient; +}(Value); + +_defineProperty(Gradient, "names", ['linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient']); + +module.exports = Gradient; + +},{"../old-value":66,"../utils":74,"../value":75,"normalize-range":643,"postcss-value-parser":646}],35:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var utils = require('./grid-utils'); + +var GridArea = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridArea, _Declaration); + + function GridArea() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridArea.prototype; + /** + * Translate grid-area to separate -ms- prefixed properties + */ + + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var values = utils.parse(decl); + + var _utils$translate = utils.translate(values, 0, 2), + rowStart = _utils$translate[0], + rowSpan = _utils$translate[1]; + + var _utils$translate2 = utils.translate(values, 1, 3), + columnStart = _utils$translate2[0], + columnSpan = _utils$translate2[1]; + + [['grid-row', rowStart], ['grid-row-span', rowSpan], ['grid-column', columnStart], ['grid-column-span', columnSpan]].forEach(function (_ref) { + var prop = _ref[0], + value = _ref[1]; + utils.insertDecl(decl, prop, value); + }); + utils.warnTemplateSelectorNotFound(decl, result); + utils.warnIfGridRowColumnExists(decl, result); + return undefined; + }; + + return GridArea; +}(Declaration); + +_defineProperty(GridArea, "names", ['grid-area']); + +module.exports = GridArea; + +},{"../declaration":6,"./grid-utils":44}],36:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var GridColumnAlign = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridColumnAlign, _Declaration); + + function GridColumnAlign() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridColumnAlign.prototype; + /** + * Do not prefix flexbox values + */ + + _proto.check = function check(decl) { + return !decl.value.includes('flex-') && decl.value !== 'baseline'; + } + /** + * Change property name for IE + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + 'grid-column-align'; + } + /** + * Change IE property back + */ + ; + + _proto.normalize = function normalize() { + return 'justify-self'; + }; + + return GridColumnAlign; +}(Declaration); + +_defineProperty(GridColumnAlign, "names", ['grid-column-align']); + +module.exports = GridColumnAlign; + +},{"../declaration":6}],37:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var GridEnd = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridEnd, _Declaration); + + function GridEnd() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridEnd.prototype; + /** + * Change repeating syntax for IE + */ + + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var clonedDecl = this.clone(decl); + var startProp = decl.prop.replace(/end$/, 'start'); + var spanProp = prefix + decl.prop.replace(/end$/, 'span'); + + if (decl.parent.some(function (i) { + return i.prop === spanProp; + })) { + return undefined; + } + + clonedDecl.prop = spanProp; + + if (decl.value.includes('span')) { + clonedDecl.value = decl.value.replace(/span\s/i, ''); + } else { + var startDecl; + decl.parent.walkDecls(startProp, function (d) { + startDecl = d; + }); + + if (startDecl) { + var value = Number(decl.value) - Number(startDecl.value) + ''; + clonedDecl.value = value; + } else { + decl.warn(result, "Can not prefix " + decl.prop + " (" + startProp + " is not found)"); + } + } + + decl.cloneBefore(clonedDecl); + return undefined; + }; + + return GridEnd; +}(Declaration); + +_defineProperty(GridEnd, "names", ['grid-row-end', 'grid-column-end']); + +module.exports = GridEnd; + +},{"../declaration":6}],38:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var GridRowAlign = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridRowAlign, _Declaration); + + function GridRowAlign() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridRowAlign.prototype; + /** + * Do not prefix flexbox values + */ + + _proto.check = function check(decl) { + return !decl.value.includes('flex-') && decl.value !== 'baseline'; + } + /** + * Change property name for IE + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + 'grid-row-align'; + } + /** + * Change IE property back + */ + ; + + _proto.normalize = function normalize() { + return 'align-self'; + }; + + return GridRowAlign; +}(Declaration); + +_defineProperty(GridRowAlign, "names", ['grid-row-align']); + +module.exports = GridRowAlign; + +},{"../declaration":6}],39:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var utils = require('./grid-utils'); + +var GridRowColumn = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridRowColumn, _Declaration); + + function GridRowColumn() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridRowColumn.prototype; + /** + * Translate grid-row / grid-column to separate -ms- prefixed properties + */ + + _proto.insert = function insert(decl, prefix, prefixes) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var values = utils.parse(decl); + + var _utils$translate = utils.translate(values, 0, 1), + start = _utils$translate[0], + span = _utils$translate[1]; + + var hasStartValueSpan = values[0] && values[0].includes('span'); + + if (hasStartValueSpan) { + span = values[0].join('').replace(/\D/g, ''); + } + + [[decl.prop, start], [decl.prop + "-span", span]].forEach(function (_ref) { + var prop = _ref[0], + value = _ref[1]; + utils.insertDecl(decl, prop, value); + }); + return undefined; + }; + + return GridRowColumn; +}(Declaration); + +_defineProperty(GridRowColumn, "names", ['grid-row', 'grid-column']); + +module.exports = GridRowColumn; + +},{"../declaration":6,"./grid-utils":44}],40:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var _require = require('./grid-utils'), + prefixTrackProp = _require.prefixTrackProp, + prefixTrackValue = _require.prefixTrackValue, + autoplaceGridItems = _require.autoplaceGridItems, + getGridGap = _require.getGridGap, + inheritGridGap = _require.inheritGridGap; + +var Processor = require('../processor'); + +var GridRowsColumns = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridRowsColumns, _Declaration); + + function GridRowsColumns() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridRowsColumns.prototype; + /** + * Change property name for IE + */ + + _proto.prefixed = function prefixed(prop, prefix) { + if (prefix === '-ms-') { + return prefixTrackProp({ + prop: prop, + prefix: prefix + }); + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Change IE property back + */ + ; + + _proto.normalize = function normalize(prop) { + return prop.replace(/^grid-(rows|columns)/, 'grid-template-$1'); + }; + + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var parent = decl.parent, + prop = decl.prop, + value = decl.value; + var isRowProp = prop.includes('rows'); + var isColumnProp = prop.includes('columns'); + var hasGridTemplate = parent.some(function (i) { + return i.prop === 'grid-template' || i.prop === 'grid-template-areas'; + }); + /** + * Not to prefix rows declaration if grid-template(-areas) is present + */ + + if (hasGridTemplate && isRowProp) { + return false; + } + + var processor = new Processor({ + options: {} + }); + var status = processor.gridStatus(parent, result); + var gap = getGridGap(decl); + gap = inheritGridGap(decl, gap) || gap; + var gapValue = isRowProp ? gap.row : gap.column; + + if ((status === 'no-autoplace' || status === true) && !hasGridTemplate) { + gapValue = null; + } + + var prefixValue = prefixTrackValue({ + value: value, + gap: gapValue + }); + /** + * Insert prefixes + */ + + decl.cloneBefore({ + prop: prefixTrackProp({ + prop: prop, + prefix: prefix + }), + value: prefixValue + }); + var autoflow = parent.nodes.find(function (i) { + return i.prop === 'grid-auto-flow'; + }); + var autoflowValue = 'row'; + + if (autoflow && !processor.disabled(autoflow, result)) { + autoflowValue = autoflow.value.trim(); + } + + if (status === 'autoplace') { + /** + * Show warning if grid-template-rows decl is not found + */ + var rowDecl = parent.nodes.find(function (i) { + return i.prop === 'grid-template-rows'; + }); + + if (!rowDecl && hasGridTemplate) { + return undefined; + } else if (!rowDecl && !hasGridTemplate) { + decl.warn(result, 'Autoplacement does not work without grid-template-rows property'); + return undefined; + } + /** + * Show warning if grid-template-columns decl is not found + */ + + + var columnDecl = parent.nodes.find(function (i) { + return i.prop === 'grid-template-columns'; + }); + + if (!columnDecl && !hasGridTemplate) { + decl.warn(result, 'Autoplacement does not work without grid-template-columns property'); + } + /** + * Autoplace grid items + */ + + + if (isColumnProp && !hasGridTemplate) { + autoplaceGridItems(decl, result, gap, autoflowValue); + } + } + + return undefined; + }; + + return GridRowsColumns; +}(Declaration); + +_defineProperty(GridRowsColumns, "names", ['grid-template-rows', 'grid-template-columns', 'grid-rows', 'grid-columns']); + +module.exports = GridRowsColumns; + +},{"../declaration":6,"../processor":69,"./grid-utils":44}],41:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var GridStart = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridStart, _Declaration); + + function GridStart() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridStart.prototype; + /** + * Do not add prefix for unsupported value in IE + */ + + _proto.check = function check(decl) { + var value = decl.value; + return !value.includes('/') || value.includes('span'); + } + /** + * Return a final spec property + */ + ; + + _proto.normalize = function normalize(prop) { + return prop.replace('-start', ''); + } + /** + * Change property name for IE + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var result = _Declaration.prototype.prefixed.call(this, prop, prefix); + + if (prefix === '-ms-') { + result = result.replace('-start', ''); + } + + return result; + }; + + return GridStart; +}(Declaration); + +_defineProperty(GridStart, "names", ['grid-row-start', 'grid-column-start']); + +module.exports = GridStart; + +},{"../declaration":6}],42:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var _require = require('./grid-utils'), + parseGridAreas = _require.parseGridAreas, + warnMissedAreas = _require.warnMissedAreas, + prefixTrackProp = _require.prefixTrackProp, + prefixTrackValue = _require.prefixTrackValue, + getGridGap = _require.getGridGap, + warnGridGap = _require.warnGridGap, + inheritGridGap = _require.inheritGridGap; + +function getGridRows(tpl) { + return tpl.trim().slice(1, -1).split(/["']\s*["']?/g); +} + +var GridTemplateAreas = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridTemplateAreas, _Declaration); + + function GridTemplateAreas() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridTemplateAreas.prototype; + /** + * Translate grid-template-areas to separate -ms- prefixed properties + */ + + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + var hasColumns = false; + var hasRows = false; + var parent = decl.parent; + var gap = getGridGap(decl); + gap = inheritGridGap(decl, gap) || gap; // remove already prefixed rows + // to prevent doubling prefixes + + parent.walkDecls(/-ms-grid-rows/, function (i) { + return i.remove(); + }); // add empty tracks to rows + + parent.walkDecls(/grid-template-(rows|columns)/, function (trackDecl) { + if (trackDecl.prop === 'grid-template-rows') { + hasRows = true; + var prop = trackDecl.prop, + value = trackDecl.value; + trackDecl.cloneBefore({ + prop: prefixTrackProp({ + prop: prop, + prefix: prefix + }), + value: prefixTrackValue({ + value: value, + gap: gap.row + }) + }); + } else { + hasColumns = true; + } + }); + var gridRows = getGridRows(decl.value); + + if (hasColumns && !hasRows && gap.row && gridRows.length > 1) { + decl.cloneBefore({ + prop: '-ms-grid-rows', + value: prefixTrackValue({ + value: "repeat(" + gridRows.length + ", auto)", + gap: gap.row + }), + raws: {} + }); + } // warnings + + + warnGridGap({ + gap: gap, + hasColumns: hasColumns, + decl: decl, + result: result + }); + var areas = parseGridAreas({ + rows: gridRows, + gap: gap + }); + warnMissedAreas(areas, decl, result); + return decl; + }; + + return GridTemplateAreas; +}(Declaration); + +_defineProperty(GridTemplateAreas, "names", ['grid-template-areas']); + +module.exports = GridTemplateAreas; + +},{"../declaration":6,"./grid-utils":44}],43:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var _require = require('./grid-utils'), + parseTemplate = _require.parseTemplate, + warnMissedAreas = _require.warnMissedAreas, + getGridGap = _require.getGridGap, + warnGridGap = _require.warnGridGap, + inheritGridGap = _require.inheritGridGap; + +var GridTemplate = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(GridTemplate, _Declaration); + + function GridTemplate() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = GridTemplate.prototype; + /** + * Translate grid-template to separate -ms- prefixed properties + */ + + _proto.insert = function insert(decl, prefix, prefixes, result) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + + if (decl.parent.some(function (i) { + return i.prop === '-ms-grid-rows'; + })) { + return undefined; + } + + var gap = getGridGap(decl); + /** + * we must insert inherited gap values in some cases: + * if we are inside media query && if we have no grid-gap value + */ + + var inheritedGap = inheritGridGap(decl, gap); + + var _parseTemplate = parseTemplate({ + decl: decl, + gap: inheritedGap || gap + }), + rows = _parseTemplate.rows, + columns = _parseTemplate.columns, + areas = _parseTemplate.areas; + + var hasAreas = Object.keys(areas).length > 0; + var hasRows = Boolean(rows); + var hasColumns = Boolean(columns); + warnGridGap({ + gap: gap, + hasColumns: hasColumns, + decl: decl, + result: result + }); + warnMissedAreas(areas, decl, result); + + if (hasRows && hasColumns || hasAreas) { + decl.cloneBefore({ + prop: '-ms-grid-rows', + value: rows, + raws: {} + }); + } + + if (hasColumns) { + decl.cloneBefore({ + prop: '-ms-grid-columns', + value: columns, + raws: {} + }); + } + + return decl; + }; + + return GridTemplate; +}(Declaration); + +_defineProperty(GridTemplate, "names", ['grid-template']); + +module.exports = GridTemplate; + +},{"../declaration":6,"./grid-utils":44}],44:[function(require,module,exports){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var parser = require('postcss-value-parser'); + +var list = require('postcss').list; + +var uniq = require('../utils').uniq; + +var escapeRegexp = require('../utils').escapeRegexp; + +var splitSelector = require('../utils').splitSelector; + +function convert(value) { + if (value && value.length === 2 && value[0] === 'span' && parseInt(value[1], 10) > 0) { + return [false, parseInt(value[1], 10)]; + } + + if (value && value.length === 1 && parseInt(value[0], 10) > 0) { + return [parseInt(value[0], 10), false]; + } + + return [false, false]; +} + +function translate(values, startIndex, endIndex) { + var startValue = values[startIndex]; + var endValue = values[endIndex]; + + if (!startValue) { + return [false, false]; + } + + var _convert = convert(startValue), + start = _convert[0], + spanStart = _convert[1]; + + var _convert2 = convert(endValue), + end = _convert2[0], + spanEnd = _convert2[1]; + + if (start && !endValue) { + return [start, false]; + } + + if (spanStart && end) { + return [end - spanStart, spanStart]; + } + + if (start && spanEnd) { + return [start, spanEnd]; + } + + if (start && end) { + return [start, end - start]; + } + + return [false, false]; +} + +function parse(decl) { + var node = parser(decl.value); + var values = []; + var current = 0; + values[current] = []; + + for (var _iterator = _createForOfIteratorHelperLoose(node.nodes), _step; !(_step = _iterator()).done;) { + var i = _step.value; + + if (i.type === 'div') { + current += 1; + values[current] = []; + } else if (i.type === 'word') { + values[current].push(i.value); + } + } + + return values; +} + +function insertDecl(decl, prop, value) { + if (value && !decl.parent.some(function (i) { + return i.prop === "-ms-" + prop; + })) { + decl.cloneBefore({ + prop: "-ms-" + prop, + value: value.toString() + }); + } +} // Track transforms + + +function prefixTrackProp(_ref) { + var prop = _ref.prop, + prefix = _ref.prefix; + return prefix + prop.replace('template-', ''); +} + +function transformRepeat(_ref2, _ref3) { + var nodes = _ref2.nodes; + var gap = _ref3.gap; + + var _nodes$reduce = nodes.reduce(function (result, node) { + if (node.type === 'div' && node.value === ',') { + result.key = 'size'; + } else { + result[result.key].push(parser.stringify(node)); + } + + return result; + }, { + key: 'count', + size: [], + count: [] + }), + count = _nodes$reduce.count, + size = _nodes$reduce.size; // insert gap values + + + if (gap) { + var _ret = function () { + size = size.filter(function (i) { + return i.trim(); + }); + var val = []; + + var _loop = function _loop(i) { + size.forEach(function (item, index) { + if (index > 0 || i > 1) { + val.push(gap); + } + + val.push(item); + }); + }; + + for (var i = 1; i <= count; i++) { + _loop(i); + } + + return { + v: val.join(' ') + }; + }(); + + if (typeof _ret === "object") return _ret.v; + } + + return "(" + size.join('') + ")[" + count.join('') + "]"; +} + +function prefixTrackValue(_ref4) { + var value = _ref4.value, + gap = _ref4.gap; + var result = parser(value).nodes.reduce(function (nodes, node) { + if (node.type === 'function' && node.value === 'repeat') { + return nodes.concat({ + type: 'word', + value: transformRepeat(node, { + gap: gap + }) + }); + } + + if (gap && node.type === 'space') { + return nodes.concat({ + type: 'space', + value: ' ' + }, { + type: 'word', + value: gap + }, node); + } + + return nodes.concat(node); + }, []); + return parser.stringify(result); +} // Parse grid-template-areas + + +var DOTS = /^\.+$/; + +function track(start, end) { + return { + start: start, + end: end, + span: end - start + }; +} + +function getColumns(line) { + return line.trim().split(/\s+/g); +} + +function parseGridAreas(_ref5) { + var rows = _ref5.rows, + gap = _ref5.gap; + return rows.reduce(function (areas, line, rowIndex) { + if (gap.row) rowIndex *= 2; + if (line.trim() === '') return areas; + getColumns(line).forEach(function (area, columnIndex) { + if (DOTS.test(area)) return; + if (gap.column) columnIndex *= 2; + + if (typeof areas[area] === 'undefined') { + areas[area] = { + column: track(columnIndex + 1, columnIndex + 2), + row: track(rowIndex + 1, rowIndex + 2) + }; + } else { + var _areas$area = areas[area], + column = _areas$area.column, + row = _areas$area.row; + column.start = Math.min(column.start, columnIndex + 1); + column.end = Math.max(column.end, columnIndex + 2); + column.span = column.end - column.start; + row.start = Math.min(row.start, rowIndex + 1); + row.end = Math.max(row.end, rowIndex + 2); + row.span = row.end - row.start; + } + }); + return areas; + }, {}); +} // Parse grid-template + + +function testTrack(node) { + return node.type === 'word' && /^\[.+]$/.test(node.value); +} + +function verifyRowSize(result) { + if (result.areas.length > result.rows.length) { + result.rows.push('auto'); + } + + return result; +} + +function parseTemplate(_ref6) { + var decl = _ref6.decl, + gap = _ref6.gap; + var gridTemplate = parser(decl.value).nodes.reduce(function (result, node) { + var type = node.type, + value = node.value; + if (testTrack(node) || type === 'space') return result; // area + + if (type === 'string') { + result = verifyRowSize(result); + result.areas.push(value); + } // values and function + + + if (type === 'word' || type === 'function') { + result[result.key].push(parser.stringify(node)); + } // divider(/) + + + if (type === 'div' && value === '/') { + result.key = 'columns'; + result = verifyRowSize(result); + } + + return result; + }, { + key: 'rows', + columns: [], + rows: [], + areas: [] + }); + return { + areas: parseGridAreas({ + rows: gridTemplate.areas, + gap: gap + }), + columns: prefixTrackValue({ + value: gridTemplate.columns.join(' '), + gap: gap.column + }), + rows: prefixTrackValue({ + value: gridTemplate.rows.join(' '), + gap: gap.row + }) + }; +} // Insert parsed grid areas + +/** + * Get an array of -ms- prefixed props and values + * @param {Object} [area] area object with column and row data + * @param {Boolean} [addRowSpan] should we add grid-column-row value? + * @param {Boolean} [addColumnSpan] should we add grid-column-span value? + * @return {Array} + */ + + +function getMSDecls(area, addRowSpan, addColumnSpan) { + if (addRowSpan === void 0) { + addRowSpan = false; + } + + if (addColumnSpan === void 0) { + addColumnSpan = false; + } + + return [].concat({ + prop: '-ms-grid-row', + value: String(area.row.start) + }, area.row.span > 1 || addRowSpan ? { + prop: '-ms-grid-row-span', + value: String(area.row.span) + } : [], { + prop: '-ms-grid-column', + value: String(area.column.start) + }, area.column.span > 1 || addColumnSpan ? { + prop: '-ms-grid-column-span', + value: String(area.column.span) + } : []); +} + +function getParentMedia(parent) { + if (parent.type === 'atrule' && parent.name === 'media') { + return parent; + } + + if (!parent.parent) { + return false; + } + + return getParentMedia(parent.parent); +} +/** + * change selectors for rules with duplicate grid-areas. + * @param {Array} rules + * @param {Array} templateSelectors + * @return {Array} rules with changed selectors + */ + + +function changeDuplicateAreaSelectors(ruleSelectors, templateSelectors) { + ruleSelectors = ruleSelectors.map(function (selector) { + var selectorBySpace = list.space(selector); + var selectorByComma = list.comma(selector); + + if (selectorBySpace.length > selectorByComma.length) { + selector = selectorBySpace.slice(-1).join(''); + } + + return selector; + }); + return ruleSelectors.map(function (ruleSelector) { + var newSelector = templateSelectors.map(function (tplSelector, index) { + var space = index === 0 ? '' : ' '; + return "" + space + tplSelector + " > " + ruleSelector; + }); + return newSelector; + }); +} +/** + * check if selector of rules are equal + * @param {Rule} ruleA + * @param {Rule} ruleB + * @return {Boolean} + */ + + +function selectorsEqual(ruleA, ruleB) { + return ruleA.selectors.some(function (sel) { + return ruleB.selectors.some(function (s) { + return s === sel; + }); + }); +} +/** + * Parse data from all grid-template(-areas) declarations + * @param {Root} css css root + * @return {Object} parsed data + */ + + +function parseGridTemplatesData(css) { + var parsed = []; // we walk through every grid-template(-areas) declaration and store + // data with the same area names inside the item + + css.walkDecls(/grid-template(-areas)?$/, function (d) { + var rule = d.parent; + var media = getParentMedia(rule); + var gap = getGridGap(d); + var inheritedGap = inheritGridGap(d, gap); + + var _parseTemplate = parseTemplate({ + decl: d, + gap: inheritedGap || gap + }), + areas = _parseTemplate.areas; + + var areaNames = Object.keys(areas); // skip node if it doesn't have areas + + if (areaNames.length === 0) { + return true; + } // check parsed array for item that include the same area names + // return index of that item + + + var index = parsed.reduce(function (acc, _ref7, idx) { + var allAreas = _ref7.allAreas; + var hasAreas = allAreas && areaNames.some(function (area) { + return allAreas.includes(area); + }); + return hasAreas ? idx : acc; + }, null); + + if (index !== null) { + // index is found, add the grid-template data to that item + var _parsed$index = parsed[index], + allAreas = _parsed$index.allAreas, + rules = _parsed$index.rules; // check if rule has no duplicate area names + + var hasNoDuplicates = rules.some(function (r) { + return r.hasDuplicates === false && selectorsEqual(r, rule); + }); + var duplicatesFound = false; // check need to gather all duplicate area names + + var duplicateAreaNames = rules.reduce(function (acc, r) { + if (!r.params && selectorsEqual(r, rule)) { + duplicatesFound = true; + return r.duplicateAreaNames; + } + + if (!duplicatesFound) { + areaNames.forEach(function (name) { + if (r.areas[name]) { + acc.push(name); + } + }); + } + + return uniq(acc); + }, []); // update grid-row/column-span values for areas with duplicate + // area names. @see #1084 and #1146 + + rules.forEach(function (r) { + areaNames.forEach(function (name) { + var area = r.areas[name]; + + if (area && area.row.span !== areas[name].row.span) { + areas[name].row.updateSpan = true; + } + + if (area && area.column.span !== areas[name].column.span) { + areas[name].column.updateSpan = true; + } + }); + }); + parsed[index].allAreas = uniq([].concat(allAreas, areaNames)); + parsed[index].rules.push({ + hasDuplicates: !hasNoDuplicates, + params: media.params, + selectors: rule.selectors, + node: rule, + duplicateAreaNames: duplicateAreaNames, + areas: areas + }); + } else { + // index is NOT found, push the new item to the parsed array + parsed.push({ + allAreas: areaNames, + areasCount: 0, + rules: [{ + hasDuplicates: false, + duplicateRules: [], + params: media.params, + selectors: rule.selectors, + node: rule, + duplicateAreaNames: [], + areas: areas + }] + }); + } + + return undefined; + }); + return parsed; +} +/** + * insert prefixed grid-area declarations + * @param {Root} css css root + * @param {Function} isDisabled check if the rule is disabled + * @return {void} + */ + + +function insertAreas(css, isDisabled) { + // parse grid-template declarations + var gridTemplatesData = parseGridTemplatesData(css); // return undefined if no declarations found + + if (gridTemplatesData.length === 0) { + return undefined; + } // we need to store the rules that we will insert later + + + var rulesToInsert = {}; + css.walkDecls('grid-area', function (gridArea) { + var gridAreaRule = gridArea.parent; + var hasPrefixedRow = gridAreaRule.first.prop === '-ms-grid-row'; + var gridAreaMedia = getParentMedia(gridAreaRule); + + if (isDisabled(gridArea)) { + return undefined; + } + + var gridAreaRuleIndex = gridAreaMedia ? css.index(gridAreaMedia) : css.index(gridAreaRule); + var value = gridArea.value; // found the data that matches grid-area identifier + + var data = gridTemplatesData.filter(function (d) { + return d.allAreas.includes(value); + })[0]; + + if (!data) { + return true; + } + + var lastArea = data.allAreas[data.allAreas.length - 1]; + var selectorBySpace = list.space(gridAreaRule.selector); + var selectorByComma = list.comma(gridAreaRule.selector); + var selectorIsComplex = selectorBySpace.length > 1 && selectorBySpace.length > selectorByComma.length; // prevent doubling of prefixes + + if (hasPrefixedRow) { + return false; + } // create the empty object with the key as the last area name + // e.g if we have templates with "a b c" values, "c" will be the last area + + + if (!rulesToInsert[lastArea]) { + rulesToInsert[lastArea] = {}; + } + + var lastRuleIsSet = false; // walk through every grid-template rule data + + for (var _iterator2 = _createForOfIteratorHelperLoose(data.rules), _step2; !(_step2 = _iterator2()).done;) { + var rule = _step2.value; + var area = rule.areas[value]; + var hasDuplicateName = rule.duplicateAreaNames.includes(value); // if we can't find the area name, update lastRule and continue + + if (!area) { + var lastRuleIndex = css.index(rulesToInsert[lastArea].lastRule); + + if (gridAreaRuleIndex > lastRuleIndex) { + rulesToInsert[lastArea].lastRule = gridAreaMedia || gridAreaRule; + } + + continue; + } // for grid-templates inside media rule we need to create empty + // array to push prefixed grid-area rules later + + + if (rule.params && !rulesToInsert[lastArea][rule.params]) { + rulesToInsert[lastArea][rule.params] = []; + } + + if ((!rule.hasDuplicates || !hasDuplicateName) && !rule.params) { + // grid-template has no duplicates and not inside media rule + getMSDecls(area, false, false).reverse().forEach(function (i) { + return gridAreaRule.prepend(Object.assign(i, { + raws: { + between: gridArea.raws.between + } + })); + }); + rulesToInsert[lastArea].lastRule = gridAreaRule; + lastRuleIsSet = true; + } else if (rule.hasDuplicates && !rule.params && !selectorIsComplex) { + (function () { + // grid-template has duplicates and not inside media rule + var cloned = gridAreaRule.clone(); + cloned.removeAll(); + getMSDecls(area, area.row.updateSpan, area.column.updateSpan).reverse().forEach(function (i) { + return cloned.prepend(Object.assign(i, { + raws: { + between: gridArea.raws.between + } + })); + }); + cloned.selectors = changeDuplicateAreaSelectors(cloned.selectors, rule.selectors); + + if (rulesToInsert[lastArea].lastRule) { + rulesToInsert[lastArea].lastRule.after(cloned); + } + + rulesToInsert[lastArea].lastRule = cloned; + lastRuleIsSet = true; + })(); + } else if (rule.hasDuplicates && !rule.params && selectorIsComplex && gridAreaRule.selector.includes(rule.selectors[0])) { + // grid-template has duplicates and not inside media rule + // and the selector is complex + gridAreaRule.walkDecls(/-ms-grid-(row|column)/, function (d) { + return d.remove(); + }); + getMSDecls(area, area.row.updateSpan, area.column.updateSpan).reverse().forEach(function (i) { + return gridAreaRule.prepend(Object.assign(i, { + raws: { + between: gridArea.raws.between + } + })); + }); + } else if (rule.params) { + (function () { + // grid-template is inside media rule + // if we're inside media rule, we need to store prefixed rules + // inside rulesToInsert object to be able to preserve the order of media + // rules and merge them easily + var cloned = gridAreaRule.clone(); + cloned.removeAll(); + getMSDecls(area, area.row.updateSpan, area.column.updateSpan).reverse().forEach(function (i) { + return cloned.prepend(Object.assign(i, { + raws: { + between: gridArea.raws.between + } + })); + }); + + if (rule.hasDuplicates && hasDuplicateName) { + cloned.selectors = changeDuplicateAreaSelectors(cloned.selectors, rule.selectors); + } + + cloned.raws = rule.node.raws; + + if (css.index(rule.node.parent) > gridAreaRuleIndex) { + // append the prefixed rules right inside media rule + // with grid-template + rule.node.parent.append(cloned); + } else { + // store the rule to insert later + rulesToInsert[lastArea][rule.params].push(cloned); + } // set new rule as last rule ONLY if we didn't set lastRule for + // this grid-area before + + + if (!lastRuleIsSet) { + rulesToInsert[lastArea].lastRule = gridAreaMedia || gridAreaRule; + } + })(); + } + } + + return undefined; + }); // append stored rules inside the media rules + + Object.keys(rulesToInsert).forEach(function (area) { + var data = rulesToInsert[area]; + var lastRule = data.lastRule; + Object.keys(data).reverse().filter(function (p) { + return p !== 'lastRule'; + }).forEach(function (params) { + if (data[params].length > 0 && lastRule) { + lastRule.after({ + name: 'media', + params: params + }); + lastRule.next().append(data[params]); + } + }); + }); + return undefined; +} +/** + * Warn user if grid area identifiers are not found + * @param {Object} areas + * @param {Declaration} decl + * @param {Result} result + * @return {void} + */ + + +function warnMissedAreas(areas, decl, result) { + var missed = Object.keys(areas); + decl.root().walkDecls('grid-area', function (gridArea) { + missed = missed.filter(function (e) { + return e !== gridArea.value; + }); + }); + + if (missed.length > 0) { + decl.warn(result, 'Can not find grid areas: ' + missed.join(', ')); + } + + return undefined; +} +/** + * compare selectors with grid-area rule and grid-template rule + * show warning if grid-template selector is not found + * (this function used for grid-area rule) + * @param {Declaration} decl + * @param {Result} result + * @return {void} + */ + + +function warnTemplateSelectorNotFound(decl, result) { + var rule = decl.parent; + var root = decl.root(); + var duplicatesFound = false; // slice selector array. Remove the last part (for comparison) + + var slicedSelectorArr = list.space(rule.selector).filter(function (str) { + return str !== '>'; + }).slice(0, -1); // we need to compare only if selector is complex. + // e.g '.grid-cell' is simple, but '.parent > .grid-cell' is complex + + if (slicedSelectorArr.length > 0) { + var gridTemplateFound = false; + var foundAreaSelector = null; + root.walkDecls(/grid-template(-areas)?$/, function (d) { + var parent = d.parent; + var templateSelectors = parent.selectors; + + var _parseTemplate2 = parseTemplate({ + decl: d, + gap: getGridGap(d) + }), + areas = _parseTemplate2.areas; + + var hasArea = areas[decl.value]; // find the the matching selectors + + for (var _iterator3 = _createForOfIteratorHelperLoose(templateSelectors), _step3; !(_step3 = _iterator3()).done;) { + var tplSelector = _step3.value; + + if (gridTemplateFound) { + break; + } + + var tplSelectorArr = list.space(tplSelector).filter(function (str) { + return str !== '>'; + }); + gridTemplateFound = tplSelectorArr.every(function (item, idx) { + return item === slicedSelectorArr[idx]; + }); + } + + if (gridTemplateFound || !hasArea) { + return true; + } + + if (!foundAreaSelector) { + foundAreaSelector = parent.selector; + } // if we found the duplicate area with different selector + + + if (foundAreaSelector && foundAreaSelector !== parent.selector) { + duplicatesFound = true; + } + + return undefined; + }); // warn user if we didn't find template + + if (!gridTemplateFound && duplicatesFound) { + decl.warn(result, 'Autoprefixer cannot find a grid-template ' + ("containing the duplicate grid-area \"" + decl.value + "\" ") + ("with full selector matching: " + slicedSelectorArr.join(' '))); + } + } +} +/** + * warn user if both grid-area and grid-(row|column) + * declarations are present in the same rule + * @param {Declaration} decl + * @param {Result} result + * @return {void} + */ + + +function warnIfGridRowColumnExists(decl, result) { + var rule = decl.parent; + var decls = []; + rule.walkDecls(/^grid-(row|column)/, function (d) { + if (!d.prop.endsWith('-end') && !d.value.startsWith('span')) { + decls.push(d); + } + }); + + if (decls.length > 0) { + decls.forEach(function (d) { + d.warn(result, 'You already have a grid-area declaration present in the rule. ' + ("You should use either grid-area or " + d.prop + ", not both")); + }); + } + + return undefined; +} // Gap utils + + +function getGridGap(decl) { + var gap = {}; // try to find gap + + var testGap = /^(grid-)?((row|column)-)?gap$/; + decl.parent.walkDecls(testGap, function (_ref8) { + var prop = _ref8.prop, + value = _ref8.value; + + if (/^(grid-)?gap$/.test(prop)) { + var _parser$nodes = parser(value).nodes, + row = _parser$nodes[0], + column = _parser$nodes[2]; + gap.row = row && parser.stringify(row); + gap.column = column ? parser.stringify(column) : gap.row; + } + + if (/^(grid-)?row-gap$/.test(prop)) gap.row = value; + if (/^(grid-)?column-gap$/.test(prop)) gap.column = value; + }); + return gap; +} +/** + * parse media parameters (for example 'min-width: 500px') + * @param {String} params parameter to parse + * @return {} + */ + + +function parseMediaParams(params) { + if (!params) { + return false; + } + + var parsed = parser(params); + var prop; + var value; + parsed.walk(function (node) { + if (node.type === 'word' && /min|max/g.test(node.value)) { + prop = node.value; + } else if (node.value.includes('px')) { + value = parseInt(node.value.replace(/\D/g, '')); + } + }); + return [prop, value]; +} +/** + * Compare the selectors and decide if we + * need to inherit gap from compared selector or not. + * @type {String} selA + * @type {String} selB + * @return {Boolean} + */ + + +function shouldInheritGap(selA, selB) { + var result; // get arrays of selector split in 3-deep array + + var splitSelectorArrA = splitSelector(selA); + var splitSelectorArrB = splitSelector(selB); + + if (splitSelectorArrA[0].length < splitSelectorArrB[0].length) { + // abort if selectorA has lower descendant specificity then selectorB + // (e.g '.grid' and '.hello .world .grid') + return false; + } else if (splitSelectorArrA[0].length > splitSelectorArrB[0].length) { + // if selectorA has higher descendant specificity then selectorB + // (e.g '.foo .bar .grid' and '.grid') + var idx = splitSelectorArrA[0].reduce(function (res, _ref9, index) { + var item = _ref9[0]; + var firstSelectorPart = splitSelectorArrB[0][0][0]; + + if (item === firstSelectorPart) { + return index; + } + + return false; + }, false); + + if (idx) { + result = splitSelectorArrB[0].every(function (arr, index) { + return arr.every(function (part, innerIndex) { + return (// because selectorA has more space elements, we need to slice + // selectorA array by 'idx' number to compare them + splitSelectorArrA[0].slice(idx)[index][innerIndex] === part + ); + }); + }); + } + } else { + // if selectorA has the same descendant specificity as selectorB + // this condition covers cases such as: '.grid.foo.bar' and '.grid' + result = splitSelectorArrB.some(function (byCommaArr) { + return byCommaArr.every(function (bySpaceArr, index) { + return bySpaceArr.every(function (part, innerIndex) { + return splitSelectorArrA[0][index][innerIndex] === part; + }); + }); + }); + } + + return result; +} +/** + * inherit grid gap values from the closest rule above + * with the same selector + * @param {Declaration} decl + * @param {Object} gap gap values + * @return {Object | Boolean} return gap values or false (if not found) + */ + + +function inheritGridGap(decl, gap) { + var rule = decl.parent; + var mediaRule = getParentMedia(rule); + var root = rule.root(); // get an array of selector split in 3-deep array + + var splitSelectorArr = splitSelector(rule.selector); // abort if the rule already has gaps + + if (Object.keys(gap).length > 0) { + return false; + } // e.g ['min-width'] + + + var _parseMediaParams = parseMediaParams(mediaRule.params), + prop = _parseMediaParams[0]; + + var lastBySpace = splitSelectorArr[0]; // get escaped value from the selector + // if we have '.grid-2.foo.bar' selector, will be '\.grid\-2' + + var escaped = escapeRegexp(lastBySpace[lastBySpace.length - 1][0]); + var regexp = new RegExp("(" + escaped + "$)|(" + escaped + "[,.])"); // find the closest rule with the same selector + + var closestRuleGap; + root.walkRules(regexp, function (r) { + var gridGap; // abort if are checking the same rule + + if (rule.toString() === r.toString()) { + return false; + } // find grid-gap values + + + r.walkDecls('grid-gap', function (d) { + return gridGap = getGridGap(d); + }); // skip rule without gaps + + if (!gridGap || Object.keys(gridGap).length === 0) { + return true; + } // skip rules that should not be inherited from + + + if (!shouldInheritGap(rule.selector, r.selector)) { + return true; + } + + var media = getParentMedia(r); + + if (media) { + // if we are inside media, we need to check that media props match + // e.g ('min-width' === 'min-width') + var propToCompare = parseMediaParams(media.params)[0]; + + if (propToCompare === prop) { + closestRuleGap = gridGap; + return true; + } + } else { + closestRuleGap = gridGap; + return true; + } + + return undefined; + }); // if we find the closest gap object + + if (closestRuleGap && Object.keys(closestRuleGap).length > 0) { + return closestRuleGap; + } + + return false; +} + +function warnGridGap(_ref10) { + var gap = _ref10.gap, + hasColumns = _ref10.hasColumns, + decl = _ref10.decl, + result = _ref10.result; + var hasBothGaps = gap.row && gap.column; + + if (!hasColumns && (hasBothGaps || gap.column && !gap.row)) { + delete gap.column; + decl.warn(result, 'Can not implement grid-gap without grid-template-columns'); + } +} +/** + * normalize the grid-template-rows/columns values + * @param {String} str grid-template-rows/columns value + * @return {Array} normalized array with values + * @example + * let normalized = normalizeRowColumn('1fr repeat(2, 20px 50px) 1fr') + * normalized // <= ['1fr', '20px', '50px', '20px', '50px', '1fr'] + */ + + +function normalizeRowColumn(str) { + var normalized = parser(str).nodes.reduce(function (result, node) { + if (node.type === 'function' && node.value === 'repeat') { + var key = 'count'; + + var _node$nodes$reduce = node.nodes.reduce(function (acc, n) { + if (n.type === 'word' && key === 'count') { + acc[0] = Math.abs(parseInt(n.value)); + return acc; + } + + if (n.type === 'div' && n.value === ',') { + key = 'value'; + return acc; + } + + if (key === 'value') { + acc[1] += parser.stringify(n); + } + + return acc; + }, [0, '']), + count = _node$nodes$reduce[0], + value = _node$nodes$reduce[1]; + + if (count) { + for (var i = 0; i < count; i++) { + result.push(value); + } + } + + return result; + } + + if (node.type === 'space') { + return result; + } + + return result.concat(parser.stringify(node)); + }, []); + return normalized; +} +/** + * Autoplace grid items + * @param {Declaration} decl + * @param {Result} result + * @param {Object} gap gap values + * @param {String} autoflowValue grid-auto-flow value + * @return {void} + * @see https://github.com/postcss/autoprefixer/issues/1148 + */ + + +function autoplaceGridItems(decl, result, gap, autoflowValue) { + if (autoflowValue === void 0) { + autoflowValue = 'row'; + } + + var parent = decl.parent; + var rowDecl = parent.nodes.find(function (i) { + return i.prop === 'grid-template-rows'; + }); + var rows = normalizeRowColumn(rowDecl.value); + var columns = normalizeRowColumn(decl.value); // Build array of area names with dummy values. If we have 3 columns and + // 2 rows, filledRows will be equal to ['1 2 3', '4 5 6'] + + var filledRows = rows.map(function (_, rowIndex) { + return Array.from({ + length: columns.length + }, function (v, k) { + return k + rowIndex * columns.length + 1; + }).join(' '); + }); + var areas = parseGridAreas({ + rows: filledRows, + gap: gap + }); + var keys = Object.keys(areas); + var items = keys.map(function (i) { + return areas[i]; + }); // Change the order of cells if grid-auto-flow value is 'column' + + if (autoflowValue.includes('column')) { + items = items.sort(function (a, b) { + return a.column.start - b.column.start; + }); + } // Insert new rules + + + items.reverse().forEach(function (item, index) { + var column = item.column, + row = item.row; + var nodeSelector = parent.selectors.map(function (sel) { + return sel + (" > *:nth-child(" + (keys.length - index) + ")"); + }).join(', '); // create new rule + + var node = parent.clone().removeAll(); // change rule selector + + node.selector = nodeSelector; // insert prefixed row/column values + + node.append({ + prop: '-ms-grid-row', + value: row.start + }); + node.append({ + prop: '-ms-grid-column', + value: column.start + }); // insert rule + + parent.after(node); + }); + return undefined; +} + +module.exports = { + parse: parse, + translate: translate, + parseTemplate: parseTemplate, + parseGridAreas: parseGridAreas, + warnMissedAreas: warnMissedAreas, + insertAreas: insertAreas, + insertDecl: insertDecl, + prefixTrackProp: prefixTrackProp, + prefixTrackValue: prefixTrackValue, + getGridGap: getGridGap, + warnGridGap: warnGridGap, + warnTemplateSelectorNotFound: warnTemplateSelectorNotFound, + warnIfGridRowColumnExists: warnIfGridRowColumnExists, + inheritGridGap: inheritGridGap, + autoplaceGridItems: autoplaceGridItems +}; + +},{"../utils":74,"postcss":663,"postcss-value-parser":646}],45:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var ImageRendering = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(ImageRendering, _Declaration); + + function ImageRendering() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = ImageRendering.prototype; + /** + * Add hack only for crisp-edges + */ + + _proto.check = function check(decl) { + return decl.value === 'pixelated'; + } + /** + * Change property name for IE + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + if (prefix === '-ms-') { + return '-ms-interpolation-mode'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Change property and value for IE + */ + ; + + _proto.set = function set(decl, prefix) { + if (prefix !== '-ms-') return _Declaration.prototype.set.call(this, decl, prefix); + decl.prop = '-ms-interpolation-mode'; + decl.value = 'nearest-neighbor'; + return decl; + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize() { + return 'image-rendering'; + } + /** + * Warn on old value + */ + ; + + _proto.process = function process(node, result) { + return _Declaration.prototype.process.call(this, node, result); + }; + + return ImageRendering; +}(Declaration); + +_defineProperty(ImageRendering, "names", ['image-rendering', 'interpolation-mode']); + +module.exports = ImageRendering; + +},{"../declaration":6}],46:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Value = require('../value'); + +var ImageSet = /*#__PURE__*/function (_Value) { + _inheritsLoose(ImageSet, _Value); + + function ImageSet() { + return _Value.apply(this, arguments) || this; + } + + var _proto = ImageSet.prototype; + /** + * Use non-standard name for WebKit and Firefox + */ + + _proto.replace = function replace(string, prefix) { + var fixed = _Value.prototype.replace.call(this, string, prefix); + + if (prefix === '-webkit-') { + fixed = fixed.replace(/("[^"]+"|'[^']+')(\s+\d+\w)/gi, 'url($1)$2'); + } + + return fixed; + }; + + return ImageSet; +}(Value); + +_defineProperty(ImageSet, "names", ['image-set']); + +module.exports = ImageSet; + +},{"../value":75}],47:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var InlineLogical = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(InlineLogical, _Declaration); + + function InlineLogical() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = InlineLogical.prototype; + /** + * Use old syntax for -moz- and -webkit- + */ + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + prop.replace('-inline', ''); + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize(prop) { + return prop.replace(/(margin|padding|border)-(start|end)/, '$1-inline-$2'); + }; + + return InlineLogical; +}(Declaration); + +_defineProperty(InlineLogical, "names", ['border-inline-start', 'border-inline-end', 'margin-inline-start', 'margin-inline-end', 'padding-inline-start', 'padding-inline-end', 'border-start', 'border-end', 'margin-start', 'margin-end', 'padding-start', 'padding-end']); + +module.exports = InlineLogical; + +},{"../declaration":6}],48:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var OldValue = require('../old-value'); + +var Value = require('../value'); + +function _regexp(name) { + return new RegExp("(^|[\\s,(])(" + name + "($|[\\s),]))", 'gi'); +} + +var Intrinsic = /*#__PURE__*/function (_Value) { + _inheritsLoose(Intrinsic, _Value); + + function Intrinsic() { + return _Value.apply(this, arguments) || this; + } + + var _proto = Intrinsic.prototype; + + _proto.regexp = function regexp() { + if (!this.regexpCache) this.regexpCache = _regexp(this.name); + return this.regexpCache; + }; + + _proto.isStretch = function isStretch() { + return this.name === 'stretch' || this.name === 'fill' || this.name === 'fill-available'; + }; + + _proto.replace = function replace(string, prefix) { + if (prefix === '-moz-' && this.isStretch()) { + return string.replace(this.regexp(), '$1-moz-available$3'); + } + + if (prefix === '-webkit-' && this.isStretch()) { + return string.replace(this.regexp(), '$1-webkit-fill-available$3'); + } + + return _Value.prototype.replace.call(this, string, prefix); + }; + + _proto.old = function old(prefix) { + var prefixed = prefix + this.name; + + if (this.isStretch()) { + if (prefix === '-moz-') { + prefixed = '-moz-available'; + } else if (prefix === '-webkit-') { + prefixed = '-webkit-fill-available'; + } + } + + return new OldValue(this.name, prefixed, prefixed, _regexp(prefixed)); + }; + + _proto.add = function add(decl, prefix) { + if (decl.prop.includes('grid') && prefix !== '-webkit-') { + return undefined; + } + + return _Value.prototype.add.call(this, decl, prefix); + }; + + return Intrinsic; +}(Value); + +_defineProperty(Intrinsic, "names", ['max-content', 'min-content', 'fit-content', 'fill', 'fill-available', 'stretch']); + +module.exports = Intrinsic; + +},{"../old-value":66,"../value":75}],49:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var JustifyContent = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(JustifyContent, _Declaration); + + function JustifyContent() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = JustifyContent.prototype; + /** + * Change property name for 2009 and 2012 specs + */ + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-pack'; + } + + if (spec === 2012) { + return prefix + 'flex-pack'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'justify-content'; + } + /** + * Change value for 2009 and 2012 specs + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2009 || spec === 2012) { + var value = JustifyContent.oldValues[decl.value] || decl.value; + decl.value = value; + + if (spec !== 2009 || value !== 'distribute') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + } else if (spec === 'final') { + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return undefined; + }; + + return JustifyContent; +}(Declaration); + +_defineProperty(JustifyContent, "names", ['justify-content', 'flex-pack', 'box-pack']); + +_defineProperty(JustifyContent, "oldValues", { + 'flex-end': 'end', + 'flex-start': 'start', + 'space-between': 'justify', + 'space-around': 'distribute' +}); + +module.exports = JustifyContent; + +},{"../declaration":6,"./flex-spec":30}],50:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var MaskBorder = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(MaskBorder, _Declaration); + + function MaskBorder() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = MaskBorder.prototype; + /** + * Return property name by final spec + */ + + _proto.normalize = function normalize() { + return this.name.replace('box-image', 'border'); + } + /** + * Return flex property for 2012 spec + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + var result = _Declaration.prototype.prefixed.call(this, prop, prefix); + + if (prefix === '-webkit-') { + result = result.replace('border', 'box-image'); + } + + return result; + }; + + return MaskBorder; +}(Declaration); + +_defineProperty(MaskBorder, "names", ['mask-border', 'mask-border-source', 'mask-border-slice', 'mask-border-width', 'mask-border-outset', 'mask-border-repeat', 'mask-box-image', 'mask-box-image-source', 'mask-box-image-slice', 'mask-box-image-width', 'mask-box-image-outset', 'mask-box-image-repeat']); + +module.exports = MaskBorder; + +},{"../declaration":6}],51:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var MaskComposite = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(MaskComposite, _Declaration); + + function MaskComposite() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = MaskComposite.prototype; + /** + * Prefix mask-composite for webkit + */ + + _proto.insert = function insert(decl, prefix, prefixes) { + var isCompositeProp = decl.prop === 'mask-composite'; + var compositeValues; + + if (isCompositeProp) { + compositeValues = decl.value.split(','); + } else { + compositeValues = decl.value.match(MaskComposite.regexp) || []; + } + + compositeValues = compositeValues.map(function (el) { + return el.trim(); + }).filter(function (el) { + return el; + }); + var hasCompositeValues = compositeValues.length; + var compositeDecl; + + if (hasCompositeValues) { + compositeDecl = this.clone(decl); + compositeDecl.value = compositeValues.map(function (value) { + return MaskComposite.oldValues[value] || value; + }).join(', '); + + if (compositeValues.includes('intersect')) { + compositeDecl.value += ', xor'; + } + + compositeDecl.prop = prefix + 'mask-composite'; + } + + if (isCompositeProp) { + if (!hasCompositeValues) { + return undefined; + } + + if (this.needCascade(decl)) { + compositeDecl.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, compositeDecl); + } + + var cloned = this.clone(decl); + cloned.prop = prefix + cloned.prop; + + if (hasCompositeValues) { + cloned.value = cloned.value.replace(MaskComposite.regexp, ''); + } + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + decl.parent.insertBefore(decl, cloned); + + if (!hasCompositeValues) { + return decl; + } + + if (this.needCascade(decl)) { + compositeDecl.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + return decl.parent.insertBefore(decl, compositeDecl); + }; + + return MaskComposite; +}(Declaration); + +_defineProperty(MaskComposite, "names", ['mask', 'mask-composite']); + +_defineProperty(MaskComposite, "oldValues", { + add: 'source-over', + substract: 'source-out', + intersect: 'source-in', + exclude: 'xor' +}); + +_defineProperty(MaskComposite, "regexp", new RegExp("\\s+(" + Object.keys(MaskComposite.oldValues).join('|') + ")\\b(?!\\))\\s*(?=[,])", 'ig')); + +module.exports = MaskComposite; + +},{"../declaration":6}],52:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var flexSpec = require('./flex-spec'); + +var Declaration = require('../declaration'); + +var Order = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(Order, _Declaration); + + function Order() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = Order.prototype; + /** + * Change property name for 2009 and 2012 specs + */ + + _proto.prefixed = function prefixed(prop, prefix) { + var spec; + + var _flexSpec = flexSpec(prefix); + + spec = _flexSpec[0]; + prefix = _flexSpec[1]; + + if (spec === 2009) { + return prefix + 'box-ordinal-group'; + } + + if (spec === 2012) { + return prefix + 'flex-order'; + } + + return _Declaration.prototype.prefixed.call(this, prop, prefix); + } + /** + * Return property name by final spec + */ + ; + + _proto.normalize = function normalize() { + return 'order'; + } + /** + * Fix value for 2009 spec + */ + ; + + _proto.set = function set(decl, prefix) { + var spec = flexSpec(prefix)[0]; + + if (spec === 2009 && /\d/.test(decl.value)) { + decl.value = (parseInt(decl.value) + 1).toString(); + return _Declaration.prototype.set.call(this, decl, prefix); + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return Order; +}(Declaration); + +_defineProperty(Order, "names", ['order', 'flex-order', 'box-ordinal-group']); + +module.exports = Order; + +},{"../declaration":6,"./flex-spec":30}],53:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var OverscrollBehavior = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(OverscrollBehavior, _Declaration); + + function OverscrollBehavior() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = OverscrollBehavior.prototype; + /** + * Change property name for IE + */ + + _proto.prefixed = function prefixed(prop, prefix) { + return prefix + 'scroll-chaining'; + } + /** + * Return property name by spec + */ + ; + + _proto.normalize = function normalize() { + return 'overscroll-behavior'; + } + /** + * Change value for IE + */ + ; + + _proto.set = function set(decl, prefix) { + if (decl.value === 'auto') { + decl.value = 'chained'; + } else if (decl.value === 'none' || decl.value === 'contain') { + decl.value = 'none'; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return OverscrollBehavior; +}(Declaration); + +_defineProperty(OverscrollBehavior, "names", ['overscroll-behavior', 'scroll-chaining']); + +module.exports = OverscrollBehavior; + +},{"../declaration":6}],54:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var OldValue = require('../old-value'); + +var Value = require('../value'); + +var Pixelated = /*#__PURE__*/function (_Value) { + _inheritsLoose(Pixelated, _Value); + + function Pixelated() { + return _Value.apply(this, arguments) || this; + } + + var _proto = Pixelated.prototype; + /** + * Use non-standard name for WebKit and Firefox + */ + + _proto.replace = function replace(string, prefix) { + if (prefix === '-webkit-') { + return string.replace(this.regexp(), '$1-webkit-optimize-contrast'); + } + + if (prefix === '-moz-') { + return string.replace(this.regexp(), '$1-moz-crisp-edges'); + } + + return _Value.prototype.replace.call(this, string, prefix); + } + /** + * Different name for WebKit and Firefox + */ + ; + + _proto.old = function old(prefix) { + if (prefix === '-webkit-') { + return new OldValue(this.name, '-webkit-optimize-contrast'); + } + + if (prefix === '-moz-') { + return new OldValue(this.name, '-moz-crisp-edges'); + } + + return _Value.prototype.old.call(this, prefix); + }; + + return Pixelated; +}(Value); + +_defineProperty(Pixelated, "names", ['pixelated']); + +module.exports = Pixelated; + +},{"../old-value":66,"../value":75}],55:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var utils = require('./grid-utils'); + +var PlaceSelf = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(PlaceSelf, _Declaration); + + function PlaceSelf() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = PlaceSelf.prototype; + /** + * Translate place-self to separate -ms- prefixed properties + */ + + _proto.insert = function insert(decl, prefix, prefixes) { + if (prefix !== '-ms-') return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); // prevent doubling of prefixes + + if (decl.parent.some(function (i) { + return i.prop === '-ms-grid-row-align'; + })) { + return undefined; + } + + var _utils$parse = utils.parse(decl), + _utils$parse$ = _utils$parse[0], + first = _utils$parse$[0], + second = _utils$parse$[1]; + + if (second) { + utils.insertDecl(decl, 'grid-row-align', first); + utils.insertDecl(decl, 'grid-column-align', second); + } else { + utils.insertDecl(decl, 'grid-row-align', first); + utils.insertDecl(decl, 'grid-column-align', first); + } + + return undefined; + }; + + return PlaceSelf; +}(Declaration); + +_defineProperty(PlaceSelf, "names", ['place-self']); + +module.exports = PlaceSelf; + +},{"../declaration":6,"./grid-utils":44}],56:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Selector = require('../selector'); + +var PlaceholderShown = /*#__PURE__*/function (_Selector) { + _inheritsLoose(PlaceholderShown, _Selector); + + function PlaceholderShown() { + return _Selector.apply(this, arguments) || this; + } + + var _proto = PlaceholderShown.prototype; + /** + * Return different selectors depend on prefix + */ + + _proto.prefixed = function prefixed(prefix) { + if (prefix === '-ms-') { + return ':-ms-input-placeholder'; + } + + return ":" + prefix + "placeholder-shown"; + }; + + return PlaceholderShown; +}(Selector); + +_defineProperty(PlaceholderShown, "names", [':placeholder-shown']); + +module.exports = PlaceholderShown; + +},{"../selector":71}],57:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Selector = require('../selector'); + +var Placeholder = /*#__PURE__*/function (_Selector) { + _inheritsLoose(Placeholder, _Selector); + + function Placeholder() { + return _Selector.apply(this, arguments) || this; + } + + var _proto = Placeholder.prototype; + /** + * Add old mozilla to possible prefixes + */ + + _proto.possible = function possible() { + return _Selector.prototype.possible.call(this).concat(['-moz- old', '-ms- old']); + } + /** + * Return different selectors depend on prefix + */ + ; + + _proto.prefixed = function prefixed(prefix) { + if (prefix === '-webkit-') { + return '::-webkit-input-placeholder'; + } + + if (prefix === '-ms-') { + return '::-ms-input-placeholder'; + } + + if (prefix === '-ms- old') { + return ':-ms-input-placeholder'; + } + + if (prefix === '-moz- old') { + return ':-moz-placeholder'; + } + + return "::" + prefix + "placeholder"; + }; + + return Placeholder; +}(Selector); + +_defineProperty(Placeholder, "names", ['::placeholder']); + +module.exports = Placeholder; + +},{"../selector":71}],58:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var TextDecorationSkipInk = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(TextDecorationSkipInk, _Declaration); + + function TextDecorationSkipInk() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = TextDecorationSkipInk.prototype; + /** + * Change prefix for ink value + */ + + _proto.set = function set(decl, prefix) { + if (decl.prop === 'text-decoration-skip-ink' && decl.value === 'auto') { + decl.prop = prefix + 'text-decoration-skip'; + decl.value = 'ink'; + return decl; + } else { + return _Declaration.prototype.set.call(this, decl, prefix); + } + }; + + return TextDecorationSkipInk; +}(Declaration); + +_defineProperty(TextDecorationSkipInk, "names", ['text-decoration-skip-ink', 'text-decoration-skip']); + +module.exports = TextDecorationSkipInk; + +},{"../declaration":6}],59:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var BASIC = ['none', 'underline', 'overline', 'line-through', 'blink', 'inherit', 'initial', 'unset']; + +var TextDecoration = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(TextDecoration, _Declaration); + + function TextDecoration() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = TextDecoration.prototype; + /** + * Do not add prefixes for basic values. + */ + + _proto.check = function check(decl) { + return decl.value.split(/\s+/).some(function (i) { + return !BASIC.includes(i); + }); + }; + + return TextDecoration; +}(Declaration); + +_defineProperty(TextDecoration, "names", ['text-decoration']); + +module.exports = TextDecoration; + +},{"../declaration":6}],60:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var TextEmphasisPosition = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(TextEmphasisPosition, _Declaration); + + function TextEmphasisPosition() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = TextEmphasisPosition.prototype; + + _proto.set = function set(decl, prefix) { + if (prefix === '-webkit-') { + decl.value = decl.value.replace(/\s*(right|left)\s*/i, ''); + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return TextEmphasisPosition; +}(Declaration); + +_defineProperty(TextEmphasisPosition, "names", ['text-emphasis-position']); + +module.exports = TextEmphasisPosition; + +},{"../declaration":6}],61:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var TransformDecl = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(TransformDecl, _Declaration); + + function TransformDecl() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = TransformDecl.prototype; + /** + * Recursively check all parents for @keyframes + */ + + _proto.keyframeParents = function keyframeParents(decl) { + var parent = decl.parent; + + while (parent) { + if (parent.type === 'atrule' && parent.name === 'keyframes') { + return true; + } + + var _parent = parent; + parent = _parent.parent; + } + + return false; + } + /** + * Is transform contain 3D commands + */ + ; + + _proto.contain3d = function contain3d(decl) { + if (decl.prop === 'transform-origin') { + return false; + } + + for (var _iterator = _createForOfIteratorHelperLoose(TransformDecl.functions3d), _step; !(_step = _iterator()).done;) { + var func = _step.value; + + if (decl.value.includes(func + "(")) { + return true; + } + } + + return false; + } + /** + * Replace rotateZ to rotate for IE 9 + */ + ; + + _proto.set = function set(decl, prefix) { + decl = _Declaration.prototype.set.call(this, decl, prefix); + + if (prefix === '-ms-') { + decl.value = decl.value.replace(/rotatez/gi, 'rotate'); + } + + return decl; + } + /** + * Don't add prefix for IE in keyframes + */ + ; + + _proto.insert = function insert(decl, prefix, prefixes) { + if (prefix === '-ms-') { + if (!this.contain3d(decl) && !this.keyframeParents(decl)) { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + } else if (prefix === '-o-') { + if (!this.contain3d(decl)) { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + } else { + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + } + + return undefined; + }; + + return TransformDecl; +}(Declaration); + +_defineProperty(TransformDecl, "names", ['transform', 'transform-origin']); + +_defineProperty(TransformDecl, "functions3d", ['matrix3d', 'translate3d', 'translateZ', 'scale3d', 'scaleZ', 'rotate3d', 'rotateX', 'rotateY', 'perspective']); + +module.exports = TransformDecl; + +},{"../declaration":6}],62:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var UserSelect = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(UserSelect, _Declaration); + + function UserSelect() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = UserSelect.prototype; + /** + * Change prefixed value for IE + */ + + _proto.set = function set(decl, prefix) { + if (prefix === '-ms-' && decl.value === 'contain') { + decl.value = 'element'; + } + + return _Declaration.prototype.set.call(this, decl, prefix); + }; + + return UserSelect; +}(Declaration); + +_defineProperty(UserSelect, "names", ['user-select']); + +module.exports = UserSelect; + +},{"../declaration":6}],63:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var Declaration = require('../declaration'); + +var WritingMode = /*#__PURE__*/function (_Declaration) { + _inheritsLoose(WritingMode, _Declaration); + + function WritingMode() { + return _Declaration.apply(this, arguments) || this; + } + + var _proto = WritingMode.prototype; + + _proto.insert = function insert(decl, prefix, prefixes) { + if (prefix === '-ms-') { + var cloned = this.set(this.clone(decl), prefix); + + if (this.needCascade(decl)) { + cloned.raws.before = this.calcBefore(prefixes, decl, prefix); + } + + var direction = 'ltr'; + decl.parent.nodes.forEach(function (i) { + if (i.prop === 'direction') { + if (i.value === 'rtl' || i.value === 'ltr') direction = i.value; + } + }); + cloned.value = WritingMode.msValues[direction][decl.value] || decl.value; + return decl.parent.insertBefore(decl, cloned); + } + + return _Declaration.prototype.insert.call(this, decl, prefix, prefixes); + }; + + return WritingMode; +}(Declaration); + +_defineProperty(WritingMode, "names", ['writing-mode']); + +_defineProperty(WritingMode, "msValues", { + ltr: { + 'horizontal-tb': 'lr-tb', + 'vertical-rl': 'tb-rl', + 'vertical-lr': 'tb-lr' + }, + rtl: { + 'horizontal-tb': 'rl-tb', + 'vertical-rl': 'bt-rl', + 'vertical-lr': 'bt-lr' + } +}); + +module.exports = WritingMode; + +},{"../declaration":6}],64:[function(require,module,exports){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var browserslist = require('browserslist'); + +function capitalize(str) { + return str.slice(0, 1).toUpperCase() + str.slice(1); +} + +var NAMES = { + ie: 'IE', + ie_mob: 'IE Mobile', + ios_saf: 'iOS', + op_mini: 'Opera Mini', + op_mob: 'Opera Mobile', + and_chr: 'Chrome for Android', + and_ff: 'Firefox for Android', + and_uc: 'UC for Android' +}; + +function prefix(name, prefixes, note) { + var out = " " + name; + if (note) out += ' *'; + out += ': '; + out += prefixes.map(function (i) { + return i.replace(/^-(.*)-$/g, '$1'); + }).join(', '); + out += '\n'; + return out; +} + +module.exports = function (prefixes) { + if (prefixes.browsers.selected.length === 0) { + return 'No browsers selected'; + } + + var versions = {}; + + for (var _iterator = _createForOfIteratorHelperLoose(prefixes.browsers.selected), _step; !(_step = _iterator()).done;) { + var _browser = _step.value; + + var parts = _browser.split(' '); + + var _name2 = parts[0]; + var version = parts[1]; + _name2 = NAMES[_name2] || capitalize(_name2); + + if (versions[_name2]) { + versions[_name2].push(version); + } else { + versions[_name2] = [version]; + } + } + + var out = 'Browsers:\n'; + + for (var browser in versions) { + var list = versions[browser]; + list = list.sort(function (a, b) { + return parseFloat(b) - parseFloat(a); + }); + out += " " + browser + ": " + list.join(', ') + "\n"; + } + + var coverage = browserslist.coverage(prefixes.browsers.selected); + var round = Math.round(coverage * 100) / 100.0; + out += "\nThese browsers account for " + round + "% of all users globally\n"; + var atrules = []; + + for (var name in prefixes.add) { + var data = prefixes.add[name]; + + if (name[0] === '@' && data.prefixes) { + atrules.push(prefix(name, data.prefixes)); + } + } + + if (atrules.length > 0) { + out += "\nAt-Rules:\n" + atrules.sort().join(''); + } + + var selectors = []; + + for (var _iterator2 = _createForOfIteratorHelperLoose(prefixes.add.selectors), _step2; !(_step2 = _iterator2()).done;) { + var selector = _step2.value; + + if (selector.prefixes) { + selectors.push(prefix(selector.name, selector.prefixes)); + } + } + + if (selectors.length > 0) { + out += "\nSelectors:\n" + selectors.sort().join(''); + } + + var values = []; + var props = []; + var hadGrid = false; + + for (var _name in prefixes.add) { + var _data = prefixes.add[_name]; + + if (_name[0] !== '@' && _data.prefixes) { + var grid = _name.indexOf('grid-') === 0; + if (grid) hadGrid = true; + props.push(prefix(_name, _data.prefixes, grid)); + } + + if (!Array.isArray(_data.values)) { + continue; + } + + for (var _iterator3 = _createForOfIteratorHelperLoose(_data.values), _step3; !(_step3 = _iterator3()).done;) { + var value = _step3.value; + + var _grid = value.name.includes('grid'); + + if (_grid) hadGrid = true; + var string = prefix(value.name, value.prefixes, _grid); + + if (!values.includes(string)) { + values.push(string); + } + } + } + + if (props.length > 0) { + out += "\nProperties:\n" + props.sort().join(''); + } + + if (values.length > 0) { + out += "\nValues:\n" + values.sort().join(''); + } + + if (hadGrid) { + out += '\n* - Prefixes will be added only on grid: true option.\n'; + } + + if (!atrules.length && !selectors.length && !props.length && !values.length) { + out += '\nAwesome! Your browsers don\'t require any vendor prefixes.' + '\nNow you can remove Autoprefixer from build steps.'; + } + + return out; +}; + +},{"browserslist":80}],65:[function(require,module,exports){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var OldSelector = /*#__PURE__*/function () { + function OldSelector(selector, prefix) { + this.prefix = prefix; + this.prefixed = selector.prefixed(this.prefix); + this.regexp = selector.regexp(this.prefix); + this.prefixeds = selector.possible().map(function (x) { + return [selector.prefixed(x), selector.regexp(x)]; + }); + this.unprefixed = selector.name; + this.nameRegexp = selector.regexp(); + } + /** + * Is rule a hack without unprefixed version bottom + */ + + + var _proto = OldSelector.prototype; + + _proto.isHack = function isHack(rule) { + var index = rule.parent.index(rule) + 1; + var rules = rule.parent.nodes; + + while (index < rules.length) { + var before = rules[index].selector; + + if (!before) { + return true; + } + + if (before.includes(this.unprefixed) && before.match(this.nameRegexp)) { + return false; + } + + var some = false; + + for (var _iterator = _createForOfIteratorHelperLoose(this.prefixeds), _step; !(_step = _iterator()).done;) { + var _step$value = _step.value, + string = _step$value[0], + regexp = _step$value[1]; + + if (before.includes(string) && before.match(regexp)) { + some = true; + break; + } + } + + if (!some) { + return true; + } + + index += 1; + } + + return true; + } + /** + * Does rule contain an unnecessary prefixed selector + */ + ; + + _proto.check = function check(rule) { + if (!rule.selector.includes(this.prefixed)) { + return false; + } + + if (!rule.selector.match(this.regexp)) { + return false; + } + + if (this.isHack(rule)) { + return false; + } + + return true; + }; + + return OldSelector; +}(); + +module.exports = OldSelector; + +},{}],66:[function(require,module,exports){ +"use strict"; + +var utils = require('./utils'); + +var OldValue = /*#__PURE__*/function () { + function OldValue(unprefixed, prefixed, string, regexp) { + this.unprefixed = unprefixed; + this.prefixed = prefixed; + this.string = string || prefixed; + this.regexp = regexp || utils.regexp(prefixed); + } + /** + * Check, that value contain old value + */ + + + var _proto = OldValue.prototype; + + _proto.check = function check(value) { + if (value.includes(this.string)) { + return !!value.match(this.regexp); + } + + return false; + }; + + return OldValue; +}(); + +module.exports = OldValue; + +},{"./utils":74}],67:[function(require,module,exports){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var vendor = require('postcss').vendor; + +var Browsers = require('./browsers'); + +var utils = require('./utils'); +/** + * Recursively clone objects + */ + + +function _clone(obj, parent) { + var cloned = new obj.constructor(); + + for (var _i = 0, _Object$keys = Object.keys(obj || {}); _i < _Object$keys.length; _i++) { + var i = _Object$keys[_i]; + var value = obj[i]; + + if (i === 'parent' && typeof value === 'object') { + if (parent) { + cloned[i] = parent; + } + } else if (i === 'source' || i === null) { + cloned[i] = value; + } else if (Array.isArray(value)) { + cloned[i] = value.map(function (x) { + return _clone(x, cloned); + }); + } else if (i !== '_autoprefixerPrefix' && i !== '_autoprefixerValues') { + if (typeof value === 'object' && value !== null) { + value = _clone(value, cloned); + } + + cloned[i] = value; + } + } + + return cloned; +} + +var Prefixer = /*#__PURE__*/function () { + /** + * Add hack to selected names + */ + Prefixer.hack = function hack(klass) { + var _this = this; + + if (!this.hacks) { + this.hacks = {}; + } + + return klass.names.map(function (name) { + _this.hacks[name] = klass; + return _this.hacks[name]; + }); + } + /** + * Load hacks for some names + */ + ; + + Prefixer.load = function load(name, prefixes, all) { + var Klass = this.hacks && this.hacks[name]; + + if (Klass) { + return new Klass(name, prefixes, all); + } else { + return new this(name, prefixes, all); + } + } + /** + * Clone node and clean autprefixer custom caches + */ + ; + + Prefixer.clone = function clone(node, overrides) { + var cloned = _clone(node); + + for (var name in overrides) { + cloned[name] = overrides[name]; + } + + return cloned; + }; + + function Prefixer(name, prefixes, all) { + this.prefixes = prefixes; + this.name = name; + this.all = all; + } + /** + * Find prefix in node parents + */ + + + var _proto = Prefixer.prototype; + + _proto.parentPrefix = function parentPrefix(node) { + var prefix; + + if (typeof node._autoprefixerPrefix !== 'undefined') { + prefix = node._autoprefixerPrefix; + } else if (node.type === 'decl' && node.prop[0] === '-') { + prefix = vendor.prefix(node.prop); + } else if (node.type === 'root') { + prefix = false; + } else if (node.type === 'rule' && node.selector.includes(':-') && /:(-\w+-)/.test(node.selector)) { + prefix = node.selector.match(/:(-\w+-)/)[1]; + } else if (node.type === 'atrule' && node.name[0] === '-') { + prefix = vendor.prefix(node.name); + } else { + prefix = this.parentPrefix(node.parent); + } + + if (!Browsers.prefixes().includes(prefix)) { + prefix = false; + } + + node._autoprefixerPrefix = prefix; + return node._autoprefixerPrefix; + } + /** + * Clone node with prefixes + */ + ; + + _proto.process = function process(node, result) { + if (!this.check(node)) { + return undefined; + } + + var parent = this.parentPrefix(node); + var prefixes = this.prefixes.filter(function (prefix) { + return !parent || parent === utils.removeNote(prefix); + }); + var added = []; + + for (var _iterator = _createForOfIteratorHelperLoose(prefixes), _step; !(_step = _iterator()).done;) { + var prefix = _step.value; + + if (this.add(node, prefix, added.concat([prefix]), result)) { + added.push(prefix); + } + } + + return added; + } + /** + * Shortcut for Prefixer.clone + */ + ; + + _proto.clone = function clone(node, overrides) { + return Prefixer.clone(node, overrides); + }; + + return Prefixer; +}(); + +module.exports = Prefixer; + +},{"./browsers":5,"./utils":74,"postcss":663}],68:[function(require,module,exports){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var vendor = require('postcss').vendor; + +var Declaration = require('./declaration'); + +var Resolution = require('./resolution'); + +var Transition = require('./transition'); + +var Processor = require('./processor'); + +var Supports = require('./supports'); + +var Browsers = require('./browsers'); + +var Selector = require('./selector'); + +var AtRule = require('./at-rule'); + +var Value = require('./value'); + +var utils = require('./utils'); + +Selector.hack(require('./hacks/fullscreen')); +Selector.hack(require('./hacks/placeholder')); +Selector.hack(require('./hacks/placeholder-shown')); +Declaration.hack(require('./hacks/flex')); +Declaration.hack(require('./hacks/order')); +Declaration.hack(require('./hacks/filter')); +Declaration.hack(require('./hacks/grid-end')); +Declaration.hack(require('./hacks/animation')); +Declaration.hack(require('./hacks/flex-flow')); +Declaration.hack(require('./hacks/flex-grow')); +Declaration.hack(require('./hacks/flex-wrap')); +Declaration.hack(require('./hacks/grid-area')); +Declaration.hack(require('./hacks/place-self')); +Declaration.hack(require('./hacks/grid-start')); +Declaration.hack(require('./hacks/align-self')); +Declaration.hack(require('./hacks/appearance')); +Declaration.hack(require('./hacks/flex-basis')); +Declaration.hack(require('./hacks/mask-border')); +Declaration.hack(require('./hacks/mask-composite')); +Declaration.hack(require('./hacks/align-items')); +Declaration.hack(require('./hacks/user-select')); +Declaration.hack(require('./hacks/flex-shrink')); +Declaration.hack(require('./hacks/break-props')); +Declaration.hack(require('./hacks/color-adjust')); +Declaration.hack(require('./hacks/writing-mode')); +Declaration.hack(require('./hacks/border-image')); +Declaration.hack(require('./hacks/align-content')); +Declaration.hack(require('./hacks/border-radius')); +Declaration.hack(require('./hacks/block-logical')); +Declaration.hack(require('./hacks/grid-template')); +Declaration.hack(require('./hacks/inline-logical')); +Declaration.hack(require('./hacks/grid-row-align')); +Declaration.hack(require('./hacks/transform-decl')); +Declaration.hack(require('./hacks/flex-direction')); +Declaration.hack(require('./hacks/image-rendering')); +Declaration.hack(require('./hacks/backdrop-filter')); +Declaration.hack(require('./hacks/background-clip')); +Declaration.hack(require('./hacks/text-decoration')); +Declaration.hack(require('./hacks/justify-content')); +Declaration.hack(require('./hacks/background-size')); +Declaration.hack(require('./hacks/grid-row-column')); +Declaration.hack(require('./hacks/grid-rows-columns')); +Declaration.hack(require('./hacks/grid-column-align')); +Declaration.hack(require('./hacks/overscroll-behavior')); +Declaration.hack(require('./hacks/grid-template-areas')); +Declaration.hack(require('./hacks/text-emphasis-position')); +Declaration.hack(require('./hacks/text-decoration-skip-ink')); +Value.hack(require('./hacks/gradient')); +Value.hack(require('./hacks/intrinsic')); +Value.hack(require('./hacks/pixelated')); +Value.hack(require('./hacks/image-set')); +Value.hack(require('./hacks/cross-fade')); +Value.hack(require('./hacks/display-flex')); +Value.hack(require('./hacks/display-grid')); +Value.hack(require('./hacks/filter-value')); +var declsCache = {}; + +var Prefixes = /*#__PURE__*/function () { + function Prefixes(data, browsers, options) { + if (options === void 0) { + options = {}; + } + + this.data = data; + this.browsers = browsers; + this.options = options; + + var _this$preprocess = this.preprocess(this.select(this.data)); + + this.add = _this$preprocess[0]; + this.remove = _this$preprocess[1]; + this.transition = new Transition(this); + this.processor = new Processor(this); + } + /** + * Return clone instance to remove all prefixes + */ + + + var _proto = Prefixes.prototype; + + _proto.cleaner = function cleaner() { + if (this.cleanerCache) { + return this.cleanerCache; + } + + if (this.browsers.selected.length) { + var empty = new Browsers(this.browsers.data, []); + this.cleanerCache = new Prefixes(this.data, empty, this.options); + } else { + return this; + } + + return this.cleanerCache; + } + /** + * Select prefixes from data, which is necessary for selected browsers + */ + ; + + _proto.select = function select(list) { + var _this = this; + + var selected = { + add: {}, + remove: {} + }; + + var _loop = function _loop(name) { + var data = list[name]; + var add = data.browsers.map(function (i) { + var params = i.split(' '); + return { + browser: params[0] + " " + params[1], + note: params[2] + }; + }); + var notes = add.filter(function (i) { + return i.note; + }).map(function (i) { + return _this.browsers.prefix(i.browser) + " " + i.note; + }); + notes = utils.uniq(notes); + add = add.filter(function (i) { + return _this.browsers.isSelected(i.browser); + }).map(function (i) { + var prefix = _this.browsers.prefix(i.browser); + + if (i.note) { + return prefix + " " + i.note; + } else { + return prefix; + } + }); + add = _this.sort(utils.uniq(add)); + + if (_this.options.flexbox === 'no-2009') { + add = add.filter(function (i) { + return !i.includes('2009'); + }); + } + + var all = data.browsers.map(function (i) { + return _this.browsers.prefix(i); + }); + + if (data.mistakes) { + all = all.concat(data.mistakes); + } + + all = all.concat(notes); + all = utils.uniq(all); + + if (add.length) { + selected.add[name] = add; + + if (add.length < all.length) { + selected.remove[name] = all.filter(function (i) { + return !add.includes(i); + }); + } + } else { + selected.remove[name] = all; + } + }; + + for (var name in list) { + _loop(name); + } + + return selected; + } + /** + * Sort vendor prefixes + */ + ; + + _proto.sort = function sort(prefixes) { + return prefixes.sort(function (a, b) { + var aLength = utils.removeNote(a).length; + var bLength = utils.removeNote(b).length; + + if (aLength === bLength) { + return b.length - a.length; + } else { + return bLength - aLength; + } + }); + } + /** + * Cache prefixes data to fast CSS processing + */ + ; + + _proto.preprocess = function preprocess(selected) { + var add = { + 'selectors': [], + '@supports': new Supports(Prefixes, this) + }; + + for (var name in selected.add) { + var prefixes = selected.add[name]; + + if (name === '@keyframes' || name === '@viewport') { + add[name] = new AtRule(name, prefixes, this); + } else if (name === '@resolution') { + add[name] = new Resolution(name, prefixes, this); + } else if (this.data[name].selector) { + add.selectors.push(Selector.load(name, prefixes, this)); + } else { + var props = this.data[name].props; + + if (props) { + var value = Value.load(name, prefixes, this); + + for (var _iterator = _createForOfIteratorHelperLoose(props), _step; !(_step = _iterator()).done;) { + var prop = _step.value; + + if (!add[prop]) { + add[prop] = { + values: [] + }; + } + + add[prop].values.push(value); + } + } else { + var values = add[name] && add[name].values || []; + add[name] = Declaration.load(name, prefixes, this); + add[name].values = values; + } + } + } + + var remove = { + selectors: [] + }; + + for (var _name in selected.remove) { + var _prefixes = selected.remove[_name]; + + if (this.data[_name].selector) { + var selector = Selector.load(_name, _prefixes); + + for (var _iterator2 = _createForOfIteratorHelperLoose(_prefixes), _step2; !(_step2 = _iterator2()).done;) { + var prefix = _step2.value; + remove.selectors.push(selector.old(prefix)); + } + } else if (_name === '@keyframes' || _name === '@viewport') { + for (var _iterator3 = _createForOfIteratorHelperLoose(_prefixes), _step3; !(_step3 = _iterator3()).done;) { + var _prefix = _step3.value; + + var prefixed = "@" + _prefix + _name.slice(1); + + remove[prefixed] = { + remove: true + }; + } + } else if (_name === '@resolution') { + remove[_name] = new Resolution(_name, _prefixes, this); + } else { + var _props = this.data[_name].props; + + if (_props) { + var _value = Value.load(_name, [], this); + + for (var _iterator4 = _createForOfIteratorHelperLoose(_prefixes), _step4; !(_step4 = _iterator4()).done;) { + var _prefix2 = _step4.value; + + var old = _value.old(_prefix2); + + if (old) { + for (var _iterator5 = _createForOfIteratorHelperLoose(_props), _step5; !(_step5 = _iterator5()).done;) { + var _prop = _step5.value; + + if (!remove[_prop]) { + remove[_prop] = {}; + } + + if (!remove[_prop].values) { + remove[_prop].values = []; + } + + remove[_prop].values.push(old); + } + } + } + } else { + for (var _iterator6 = _createForOfIteratorHelperLoose(_prefixes), _step6; !(_step6 = _iterator6()).done;) { + var p = _step6.value; + var olds = this.decl(_name).old(_name, p); + + if (_name === 'align-self') { + var a = add[_name] && add[_name].prefixes; + + if (a) { + if (p === '-webkit- 2009' && a.includes('-webkit-')) { + continue; + } else if (p === '-webkit-' && a.includes('-webkit- 2009')) { + continue; + } + } + } + + for (var _iterator7 = _createForOfIteratorHelperLoose(olds), _step7; !(_step7 = _iterator7()).done;) { + var _prefixed = _step7.value; + + if (!remove[_prefixed]) { + remove[_prefixed] = {}; + } + + remove[_prefixed].remove = true; + } + } + } + } + } + + return [add, remove]; + } + /** + * Declaration loader with caching + */ + ; + + _proto.decl = function decl(prop) { + var decl = declsCache[prop]; + + if (decl) { + return decl; + } else { + declsCache[prop] = Declaration.load(prop); + return declsCache[prop]; + } + } + /** + * Return unprefixed version of property + */ + ; + + _proto.unprefixed = function unprefixed(prop) { + var value = this.normalize(vendor.unprefixed(prop)); + + if (value === 'flex-direction') { + value = 'flex-flow'; + } + + return value; + } + /** + * Normalize prefix for remover + */ + ; + + _proto.normalize = function normalize(prop) { + return this.decl(prop).normalize(prop); + } + /** + * Return prefixed version of property + */ + ; + + _proto.prefixed = function prefixed(prop, prefix) { + prop = vendor.unprefixed(prop); + return this.decl(prop).prefixed(prop, prefix); + } + /** + * Return values, which must be prefixed in selected property + */ + ; + + _proto.values = function values(type, prop) { + var data = this[type]; + var global = data['*'] && data['*'].values; + var values = data[prop] && data[prop].values; + + if (global && values) { + return utils.uniq(global.concat(values)); + } else { + return global || values || []; + } + } + /** + * Group declaration by unprefixed property to check them + */ + ; + + _proto.group = function group(decl) { + var _this2 = this; + + var rule = decl.parent; + var index = rule.index(decl); + var length = rule.nodes.length; + var unprefixed = this.unprefixed(decl.prop); + + var checker = function checker(step, callback) { + index += step; + + while (index >= 0 && index < length) { + var other = rule.nodes[index]; + + if (other.type === 'decl') { + if (step === -1 && other.prop === unprefixed) { + if (!Browsers.withPrefix(other.value)) { + break; + } + } + + if (_this2.unprefixed(other.prop) !== unprefixed) { + break; + } else if (callback(other) === true) { + return true; + } + + if (step === +1 && other.prop === unprefixed) { + if (!Browsers.withPrefix(other.value)) { + break; + } + } + } + + index += step; + } + + return false; + }; + + return { + up: function up(callback) { + return checker(-1, callback); + }, + down: function down(callback) { + return checker(+1, callback); + } + }; + }; + + return Prefixes; +}(); + +module.exports = Prefixes; + +},{"./at-rule":2,"./browsers":5,"./declaration":6,"./hacks/align-content":7,"./hacks/align-items":8,"./hacks/align-self":9,"./hacks/animation":10,"./hacks/appearance":11,"./hacks/backdrop-filter":12,"./hacks/background-clip":13,"./hacks/background-size":14,"./hacks/block-logical":15,"./hacks/border-image":16,"./hacks/border-radius":17,"./hacks/break-props":18,"./hacks/color-adjust":19,"./hacks/cross-fade":20,"./hacks/display-flex":21,"./hacks/display-grid":22,"./hacks/filter":24,"./hacks/filter-value":23,"./hacks/flex":32,"./hacks/flex-basis":25,"./hacks/flex-direction":26,"./hacks/flex-flow":27,"./hacks/flex-grow":28,"./hacks/flex-shrink":29,"./hacks/flex-wrap":31,"./hacks/fullscreen":33,"./hacks/gradient":34,"./hacks/grid-area":35,"./hacks/grid-column-align":36,"./hacks/grid-end":37,"./hacks/grid-row-align":38,"./hacks/grid-row-column":39,"./hacks/grid-rows-columns":40,"./hacks/grid-start":41,"./hacks/grid-template":43,"./hacks/grid-template-areas":42,"./hacks/image-rendering":45,"./hacks/image-set":46,"./hacks/inline-logical":47,"./hacks/intrinsic":48,"./hacks/justify-content":49,"./hacks/mask-border":50,"./hacks/mask-composite":51,"./hacks/order":52,"./hacks/overscroll-behavior":53,"./hacks/pixelated":54,"./hacks/place-self":55,"./hacks/placeholder":57,"./hacks/placeholder-shown":56,"./hacks/text-decoration":59,"./hacks/text-decoration-skip-ink":58,"./hacks/text-emphasis-position":60,"./hacks/transform-decl":61,"./hacks/user-select":62,"./hacks/writing-mode":63,"./processor":69,"./resolution":70,"./selector":71,"./supports":72,"./transition":73,"./utils":74,"./value":75,"postcss":663}],69:[function(require,module,exports){ +(function (process){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var parser = require('postcss-value-parser'); + +var Value = require('./value'); + +var insertAreas = require('./hacks/grid-utils').insertAreas; + +var OLD_LINEAR = /(^|[^-])linear-gradient\(\s*(top|left|right|bottom)/i; +var OLD_RADIAL = /(^|[^-])radial-gradient\(\s*\d+(\w*|%)\s+\d+(\w*|%)\s*,/i; +var IGNORE_NEXT = /(!\s*)?autoprefixer:\s*ignore\s+next/i; +var GRID_REGEX = /(!\s*)?autoprefixer\s*grid:\s*(on|off|(no-)?autoplace)/i; +var SIZES = ['width', 'height', 'min-width', 'max-width', 'min-height', 'max-height', 'inline-size', 'min-inline-size', 'max-inline-size', 'block-size', 'min-block-size', 'max-block-size']; + +function hasGridTemplate(decl) { + return decl.parent.some(function (i) { + return i.prop === 'grid-template' || i.prop === 'grid-template-areas'; + }); +} + +function hasRowsAndColumns(decl) { + var hasRows = decl.parent.some(function (i) { + return i.prop === 'grid-template-rows'; + }); + var hasColumns = decl.parent.some(function (i) { + return i.prop === 'grid-template-columns'; + }); + return hasRows && hasColumns; +} + +var Processor = /*#__PURE__*/function () { + function Processor(prefixes) { + this.prefixes = prefixes; + } + /** + * Add necessary prefixes + */ + + + var _proto = Processor.prototype; + + _proto.add = function add(css, result) { + var _this = this; // At-rules + + + var resolution = this.prefixes.add['@resolution']; + var keyframes = this.prefixes.add['@keyframes']; + var viewport = this.prefixes.add['@viewport']; + var supports = this.prefixes.add['@supports']; + css.walkAtRules(function (rule) { + if (rule.name === 'keyframes') { + if (!_this.disabled(rule, result)) { + return keyframes && keyframes.process(rule); + } + } else if (rule.name === 'viewport') { + if (!_this.disabled(rule, result)) { + return viewport && viewport.process(rule); + } + } else if (rule.name === 'supports') { + if (_this.prefixes.options.supports !== false && !_this.disabled(rule, result)) { + return supports.process(rule); + } + } else if (rule.name === 'media' && rule.params.includes('-resolution')) { + if (!_this.disabled(rule, result)) { + return resolution && resolution.process(rule); + } + } + + return undefined; + }); // Selectors + + css.walkRules(function (rule) { + if (_this.disabled(rule, result)) return undefined; + return _this.prefixes.add.selectors.map(function (selector) { + return selector.process(rule, result); + }); + }); + + function insideGrid(decl) { + return decl.parent.nodes.some(function (node) { + if (node.type !== 'decl') return false; + var displayGrid = node.prop === 'display' && /(inline-)?grid/.test(node.value); + var gridTemplate = node.prop.startsWith('grid-template'); + var gridGap = /^grid-([A-z]+-)?gap/.test(node.prop); + return displayGrid || gridTemplate || gridGap; + }); + } + + function insideFlex(decl) { + return decl.parent.some(function (node) { + return node.prop === 'display' && /(inline-)?flex/.test(node.value); + }); + } + + var gridPrefixes = this.gridStatus(css, result) && this.prefixes.add['grid-area'] && this.prefixes.add['grid-area'].prefixes; + css.walkDecls(function (decl) { + if (_this.disabledDecl(decl, result)) return undefined; + var parent = decl.parent; + var prop = decl.prop; + var value = decl.value; + + if (prop === 'grid-row-span') { + result.warn('grid-row-span is not part of final Grid Layout. Use grid-row.', { + node: decl + }); + return undefined; + } else if (prop === 'grid-column-span') { + result.warn('grid-column-span is not part of final Grid Layout. Use grid-column.', { + node: decl + }); + return undefined; + } else if (prop === 'display' && value === 'box') { + result.warn('You should write display: flex by final spec ' + 'instead of display: box', { + node: decl + }); + return undefined; + } else if (prop === 'text-emphasis-position') { + if (value === 'under' || value === 'over') { + result.warn('You should use 2 values for text-emphasis-position ' + 'For example, `under left` instead of just `under`.', { + node: decl + }); + } + } else if (/^(align|justify|place)-(items|content)$/.test(prop) && insideFlex(decl)) { + if (value === 'start' || value === 'end') { + result.warn(value + " value has mixed support, consider using " + ("flex-" + value + " instead"), { + node: decl + }); + } + } else if (prop === 'text-decoration-skip' && value === 'ink') { + result.warn('Replace text-decoration-skip: ink to ' + 'text-decoration-skip-ink: auto, because spec had been changed', { + node: decl + }); + } else { + if (gridPrefixes && _this.gridStatus(decl, result)) { + if (decl.value === 'subgrid') { + result.warn('IE does not support subgrid', { + node: decl + }); + } + + if (/^(align|justify|place)-items$/.test(prop) && insideGrid(decl)) { + var fixed = prop.replace('-items', '-self'); + result.warn("IE does not support " + prop + " on grid containers. " + ("Try using " + fixed + " on child elements instead: ") + (decl.parent.selector + " > * { " + fixed + ": " + decl.value + " }"), { + node: decl + }); + } else if (/^(align|justify|place)-content$/.test(prop) && insideGrid(decl)) { + result.warn("IE does not support " + decl.prop + " on grid containers", { + node: decl + }); + } else if (prop === 'display' && decl.value === 'contents') { + result.warn('Please do not use display: contents; ' + 'if you have grid setting enabled', { + node: decl + }); + return undefined; + } else if (decl.prop === 'grid-gap') { + var status = _this.gridStatus(decl, result); + + if (status === 'autoplace' && !hasRowsAndColumns(decl) && !hasGridTemplate(decl)) { + result.warn('grid-gap only works if grid-template(-areas) is being ' + 'used or both rows and columns have been declared ' + 'and cells have not been manually ' + 'placed inside the explicit grid', { + node: decl + }); + } else if ((status === true || status === 'no-autoplace') && !hasGridTemplate(decl)) { + result.warn('grid-gap only works if grid-template(-areas) is being used', { + node: decl + }); + } + } else if (prop === 'grid-auto-columns') { + result.warn('grid-auto-columns is not supported by IE', { + node: decl + }); + return undefined; + } else if (prop === 'grid-auto-rows') { + result.warn('grid-auto-rows is not supported by IE', { + node: decl + }); + return undefined; + } else if (prop === 'grid-auto-flow') { + var hasRows = parent.some(function (i) { + return i.prop === 'grid-template-rows'; + }); + var hasCols = parent.some(function (i) { + return i.prop === 'grid-template-columns'; + }); + + if (hasGridTemplate(decl)) { + result.warn('grid-auto-flow is not supported by IE', { + node: decl + }); + } else if (value.includes('dense')) { + result.warn('grid-auto-flow: dense is not supported by IE', { + node: decl + }); + } else if (!hasRows && !hasCols) { + result.warn('grid-auto-flow works only if grid-template-rows and ' + 'grid-template-columns are present in the same rule', { + node: decl + }); + } + + return undefined; + } else if (value.includes('auto-fit')) { + result.warn('auto-fit value is not supported by IE', { + node: decl, + word: 'auto-fit' + }); + return undefined; + } else if (value.includes('auto-fill')) { + result.warn('auto-fill value is not supported by IE', { + node: decl, + word: 'auto-fill' + }); + return undefined; + } else if (prop.startsWith('grid-template') && value.includes('[')) { + result.warn('Autoprefixer currently does not support line names. ' + 'Try using grid-template-areas instead.', { + node: decl, + word: '[' + }); + } + } + + if (value.includes('radial-gradient')) { + if (OLD_RADIAL.test(decl.value)) { + result.warn('Gradient has outdated direction syntax. ' + 'New syntax is like `closest-side at 0 0` ' + 'instead of `0 0, closest-side`.', { + node: decl + }); + } else { + var ast = parser(value); + + for (var _iterator = _createForOfIteratorHelperLoose(ast.nodes), _step; !(_step = _iterator()).done;) { + var i = _step.value; + + if (i.type === 'function' && i.value === 'radial-gradient') { + for (var _iterator2 = _createForOfIteratorHelperLoose(i.nodes), _step2; !(_step2 = _iterator2()).done;) { + var word = _step2.value; + + if (word.type === 'word') { + if (word.value === 'cover') { + result.warn('Gradient has outdated direction syntax. ' + 'Replace `cover` to `farthest-corner`.', { + node: decl + }); + } else if (word.value === 'contain') { + result.warn('Gradient has outdated direction syntax. ' + 'Replace `contain` to `closest-side`.', { + node: decl + }); + } + } + } + } + } + } + } + + if (value.includes('linear-gradient')) { + if (OLD_LINEAR.test(value)) { + result.warn('Gradient has outdated direction syntax. ' + 'New syntax is like `to left` instead of `right`.', { + node: decl + }); + } + } + } + + if (SIZES.includes(decl.prop)) { + if (!decl.value.includes('-fill-available')) { + if (decl.value.includes('fill-available')) { + result.warn('Replace fill-available to stretch, ' + 'because spec had been changed', { + node: decl + }); + } else if (decl.value.includes('fill')) { + var _ast = parser(value); + + if (_ast.nodes.some(function (i) { + return i.type === 'word' && i.value === 'fill'; + })) { + result.warn('Replace fill to stretch, because spec had been changed', { + node: decl + }); + } + } + } + } + + var prefixer; + + if (decl.prop === 'transition' || decl.prop === 'transition-property') { + // Transition + return _this.prefixes.transition.add(decl, result); + } else if (decl.prop === 'align-self') { + // align-self flexbox or grid + var display = _this.displayType(decl); + + if (display !== 'grid' && _this.prefixes.options.flexbox !== false) { + prefixer = _this.prefixes.add['align-self']; + + if (prefixer && prefixer.prefixes) { + prefixer.process(decl); + } + } + + if (_this.gridStatus(decl, result) !== false) { + prefixer = _this.prefixes.add['grid-row-align']; + + if (prefixer && prefixer.prefixes) { + return prefixer.process(decl, result); + } + } + } else if (decl.prop === 'justify-self') { + // justify-self flexbox or grid + if (_this.gridStatus(decl, result) !== false) { + prefixer = _this.prefixes.add['grid-column-align']; + + if (prefixer && prefixer.prefixes) { + return prefixer.process(decl, result); + } + } + } else if (decl.prop === 'place-self') { + prefixer = _this.prefixes.add['place-self']; + + if (prefixer && prefixer.prefixes && _this.gridStatus(decl, result) !== false) { + return prefixer.process(decl, result); + } + } else { + // Properties + prefixer = _this.prefixes.add[decl.prop]; + + if (prefixer && prefixer.prefixes) { + return prefixer.process(decl, result); + } + } + + return undefined; + }); // Insert grid-area prefixes. We need to be able to store the different + // rules as a data and hack API is not enough for this + + if (this.gridStatus(css, result)) { + insertAreas(css, this.disabled); + } // Values + + + return css.walkDecls(function (decl) { + if (_this.disabledValue(decl, result)) return; + + var unprefixed = _this.prefixes.unprefixed(decl.prop); + + var list = _this.prefixes.values('add', unprefixed); + + if (Array.isArray(list)) { + for (var _iterator3 = _createForOfIteratorHelperLoose(list), _step3; !(_step3 = _iterator3()).done;) { + var value = _step3.value; + if (value.process) value.process(decl, result); + } + } + + Value.save(_this.prefixes, decl); + }); + } + /** + * Remove unnecessary pefixes + */ + ; + + _proto.remove = function remove(css, result) { + var _this2 = this; // At-rules + + + var resolution = this.prefixes.remove['@resolution']; + css.walkAtRules(function (rule, i) { + if (_this2.prefixes.remove["@" + rule.name]) { + if (!_this2.disabled(rule, result)) { + rule.parent.removeChild(i); + } + } else if (rule.name === 'media' && rule.params.includes('-resolution') && resolution) { + resolution.clean(rule); + } + }); // Selectors + + var _loop = function _loop() { + var checker = _step4.value; + css.walkRules(function (rule, i) { + if (checker.check(rule)) { + if (!_this2.disabled(rule, result)) { + rule.parent.removeChild(i); + } + } + }); + }; + + for (var _iterator4 = _createForOfIteratorHelperLoose(this.prefixes.remove.selectors), _step4; !(_step4 = _iterator4()).done;) { + _loop(); + } + + return css.walkDecls(function (decl, i) { + if (_this2.disabled(decl, result)) return; + var rule = decl.parent; + + var unprefixed = _this2.prefixes.unprefixed(decl.prop); // Transition + + + if (decl.prop === 'transition' || decl.prop === 'transition-property') { + _this2.prefixes.transition.remove(decl); + } // Properties + + + if (_this2.prefixes.remove[decl.prop] && _this2.prefixes.remove[decl.prop].remove) { + var notHack = _this2.prefixes.group(decl).down(function (other) { + return _this2.prefixes.normalize(other.prop) === unprefixed; + }); + + if (unprefixed === 'flex-flow') { + notHack = true; + } + + if (decl.prop === '-webkit-box-orient') { + var hacks = { + 'flex-direction': true, + 'flex-flow': true + }; + if (!decl.parent.some(function (j) { + return hacks[j.prop]; + })) return; + } + + if (notHack && !_this2.withHackValue(decl)) { + if (decl.raw('before').includes('\n')) { + _this2.reduceSpaces(decl); + } + + rule.removeChild(i); + return; + } + } // Values + + + for (var _iterator5 = _createForOfIteratorHelperLoose(_this2.prefixes.values('remove', unprefixed)), _step5; !(_step5 = _iterator5()).done;) { + var checker = _step5.value; + if (!checker.check) continue; + if (!checker.check(decl.value)) continue; + unprefixed = checker.unprefixed; + + var _notHack = _this2.prefixes.group(decl).down(function (other) { + return other.value.includes(unprefixed); + }); + + if (_notHack) { + rule.removeChild(i); + return; + } + } + }); + } + /** + * Some rare old values, which is not in standard + */ + ; + + _proto.withHackValue = function withHackValue(decl) { + return decl.prop === '-webkit-background-clip' && decl.value === 'text'; + } + /** + * Check for grid/flexbox options. + */ + ; + + _proto.disabledValue = function disabledValue(node, result) { + if (this.gridStatus(node, result) === false && node.type === 'decl') { + if (node.prop === 'display' && node.value.includes('grid')) { + return true; + } + } + + if (this.prefixes.options.flexbox === false && node.type === 'decl') { + if (node.prop === 'display' && node.value.includes('flex')) { + return true; + } + } + + return this.disabled(node, result); + } + /** + * Check for grid/flexbox options. + */ + ; + + _proto.disabledDecl = function disabledDecl(node, result) { + if (this.gridStatus(node, result) === false && node.type === 'decl') { + if (node.prop.includes('grid') || node.prop === 'justify-items') { + return true; + } + } + + if (this.prefixes.options.flexbox === false && node.type === 'decl') { + var other = ['order', 'justify-content', 'align-items', 'align-content']; + + if (node.prop.includes('flex') || other.includes(node.prop)) { + return true; + } + } + + return this.disabled(node, result); + } + /** + * Check for control comment and global options + */ + ; + + _proto.disabled = function disabled(node, result) { + if (!node) return false; + + if (node._autoprefixerDisabled !== undefined) { + return node._autoprefixerDisabled; + } + + if (node.parent) { + var p = node.prev(); + + if (p && p.type === 'comment' && IGNORE_NEXT.test(p.text)) { + node._autoprefixerDisabled = true; + node._autoprefixerSelfDisabled = true; + return true; + } + } + + var value = null; + + if (node.nodes) { + var status; + node.each(function (i) { + if (i.type !== 'comment') return; + + if (/(!\s*)?autoprefixer:\s*(off|on)/i.test(i.text)) { + if (typeof status !== 'undefined') { + result.warn('Second Autoprefixer control comment ' + 'was ignored. Autoprefixer applies control ' + 'comment to whole block, not to next rules.', { + node: i + }); + } else { + status = /on/i.test(i.text); + } + } + }); + + if (status !== undefined) { + value = !status; + } + } + + if (!node.nodes || value === null) { + if (node.parent) { + var isParentDisabled = this.disabled(node.parent, result); + + if (node.parent._autoprefixerSelfDisabled === true) { + value = false; + } else { + value = isParentDisabled; + } + } else { + value = false; + } + } + + node._autoprefixerDisabled = value; + return value; + } + /** + * Normalize spaces in cascade declaration group + */ + ; + + _proto.reduceSpaces = function reduceSpaces(decl) { + var stop = false; + this.prefixes.group(decl).up(function () { + stop = true; + return true; + }); + + if (stop) { + return; + } + + var parts = decl.raw('before').split('\n'); + var prevMin = parts[parts.length - 1].length; + var diff = false; + this.prefixes.group(decl).down(function (other) { + parts = other.raw('before').split('\n'); + var last = parts.length - 1; + + if (parts[last].length > prevMin) { + if (diff === false) { + diff = parts[last].length - prevMin; + } + + parts[last] = parts[last].slice(0, -diff); + other.raws.before = parts.join('\n'); + } + }); + } + /** + * Is it flebox or grid rule + */ + ; + + _proto.displayType = function displayType(decl) { + for (var _iterator6 = _createForOfIteratorHelperLoose(decl.parent.nodes), _step6; !(_step6 = _iterator6()).done;) { + var i = _step6.value; + + if (i.prop !== 'display') { + continue; + } + + if (i.value.includes('flex')) { + return 'flex'; + } + + if (i.value.includes('grid')) { + return 'grid'; + } + } + + return false; + } + /** + * Set grid option via control comment + */ + ; + + _proto.gridStatus = function gridStatus(node, result) { + if (!node) return false; + + if (node._autoprefixerGridStatus !== undefined) { + return node._autoprefixerGridStatus; + } + + var value = null; + + if (node.nodes) { + var status; + node.each(function (i) { + if (i.type !== 'comment') return; + + if (GRID_REGEX.test(i.text)) { + var hasAutoplace = /:\s*autoplace/i.test(i.text); + var noAutoplace = /no-autoplace/i.test(i.text); + + if (typeof status !== 'undefined') { + result.warn('Second Autoprefixer grid control comment was ' + 'ignored. Autoprefixer applies control comments to the whole ' + 'block, not to the next rules.', { + node: i + }); + } else if (hasAutoplace) { + status = 'autoplace'; + } else if (noAutoplace) { + status = true; + } else { + status = /on/i.test(i.text); + } + } + }); + + if (status !== undefined) { + value = status; + } + } + + if (node.type === 'atrule' && node.name === 'supports') { + var params = node.params; + + if (params.includes('grid') && params.includes('auto')) { + value = false; + } + } + + if (!node.nodes || value === null) { + if (node.parent) { + var isParentGrid = this.gridStatus(node.parent, result); + + if (node.parent._autoprefixerSelfDisabled === true) { + value = false; + } else { + value = isParentGrid; + } + } else if (typeof this.prefixes.options.grid !== 'undefined') { + value = this.prefixes.options.grid; + } else if (typeof process.env.AUTOPREFIXER_GRID !== 'undefined') { + if (process.env.AUTOPREFIXER_GRID === 'autoplace') { + value = 'autoplace'; + } else { + value = true; + } + } else { + value = false; + } + } + + node._autoprefixerGridStatus = value; + return value; + }; + + return Processor; +}(); + +module.exports = Processor; + +}).call(this,require('_process')) +},{"./hacks/grid-utils":44,"./value":75,"_process":675,"postcss-value-parser":646}],70:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +var n2f = require('num2fraction'); + +var Prefixer = require('./prefixer'); + +var utils = require('./utils'); + +var REGEXP = /(min|max)-resolution\s*:\s*\d*\.?\d+(dppx|dpi|x)/gi; +var SPLIT = /(min|max)-resolution(\s*:\s*)(\d*\.?\d+)(dppx|dpi|x)/i; + +var Resolution = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(Resolution, _Prefixer); + + function Resolution() { + return _Prefixer.apply(this, arguments) || this; + } + + var _proto = Resolution.prototype; + /** + * Return prefixed query name + */ + + _proto.prefixName = function prefixName(prefix, name) { + if (prefix === '-moz-') { + return name + '--moz-device-pixel-ratio'; + } else { + return prefix + name + '-device-pixel-ratio'; + } + } + /** + * Return prefixed query + */ + ; + + _proto.prefixQuery = function prefixQuery(prefix, name, colon, value, units) { + if (units === 'dpi') { + value = Number(value / 96); + } + + if (prefix === '-o-') { + value = n2f(value); + } + + return this.prefixName(prefix, name) + colon + value; + } + /** + * Remove prefixed queries + */ + ; + + _proto.clean = function clean(rule) { + var _this = this; + + if (!this.bad) { + this.bad = []; + + for (var _iterator = _createForOfIteratorHelperLoose(this.prefixes), _step; !(_step = _iterator()).done;) { + var prefix = _step.value; + this.bad.push(this.prefixName(prefix, 'min')); + this.bad.push(this.prefixName(prefix, 'max')); + } + } + + rule.params = utils.editList(rule.params, function (queries) { + return queries.filter(function (query) { + return _this.bad.every(function (i) { + return !query.includes(i); + }); + }); + }); + } + /** + * Add prefixed queries + */ + ; + + _proto.process = function process(rule) { + var _this2 = this; + + var parent = this.parentPrefix(rule); + var prefixes = parent ? [parent] : this.prefixes; + rule.params = utils.editList(rule.params, function (origin, prefixed) { + for (var _iterator2 = _createForOfIteratorHelperLoose(origin), _step2; !(_step2 = _iterator2()).done;) { + var query = _step2.value; + + if (!query.includes('min-resolution') && !query.includes('max-resolution')) { + prefixed.push(query); + continue; + } + + var _loop = function _loop() { + var prefix = _step3.value; + var processed = query.replace(REGEXP, function (str) { + var parts = str.match(SPLIT); + return _this2.prefixQuery(prefix, parts[1], parts[2], parts[3], parts[4]); + }); + prefixed.push(processed); + }; + + for (var _iterator3 = _createForOfIteratorHelperLoose(prefixes), _step3; !(_step3 = _iterator3()).done;) { + _loop(); + } + + prefixed.push(query); + } + + return utils.uniq(prefixed); + }); + }; + + return Resolution; +}(Prefixer); + +module.exports = Resolution; + +},{"./prefixer":67,"./utils":74,"num2fraction":644}],71:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +var _require = require('postcss'), + list = _require.list; + +var OldSelector = require('./old-selector'); + +var Prefixer = require('./prefixer'); + +var Browsers = require('./browsers'); + +var utils = require('./utils'); + +var Selector = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(Selector, _Prefixer); + + function Selector(name, prefixes, all) { + var _this; + + _this = _Prefixer.call(this, name, prefixes, all) || this; + _this.regexpCache = {}; + return _this; + } + /** + * Is rule selectors need to be prefixed + */ + + + var _proto = Selector.prototype; + + _proto.check = function check(rule) { + if (rule.selector.includes(this.name)) { + return !!rule.selector.match(this.regexp()); + } + + return false; + } + /** + * Return prefixed version of selector + */ + ; + + _proto.prefixed = function prefixed(prefix) { + return this.name.replace(/^(\W*)/, "$1" + prefix); + } + /** + * Lazy loadRegExp for name + */ + ; + + _proto.regexp = function regexp(prefix) { + if (this.regexpCache[prefix]) { + return this.regexpCache[prefix]; + } + + var name = prefix ? this.prefixed(prefix) : this.name; + this.regexpCache[prefix] = new RegExp("(^|[^:\"'=])" + utils.escapeRegexp(name), 'gi'); + return this.regexpCache[prefix]; + } + /** + * All possible prefixes + */ + ; + + _proto.possible = function possible() { + return Browsers.prefixes(); + } + /** + * Return all possible selector prefixes + */ + ; + + _proto.prefixeds = function prefixeds(rule) { + var _this2 = this; + + if (rule._autoprefixerPrefixeds) { + if (rule._autoprefixerPrefixeds[this.name]) { + return rule._autoprefixerPrefixeds; + } + } else { + rule._autoprefixerPrefixeds = {}; + } + + var prefixeds = {}; + + if (rule.selector.includes(',')) { + var ruleParts = list.comma(rule.selector); + var toProcess = ruleParts.filter(function (el) { + return el.includes(_this2.name); + }); + + var _loop = function _loop() { + var prefix = _step.value; + prefixeds[prefix] = toProcess.map(function (el) { + return _this2.replace(el, prefix); + }).join(', '); + }; + + for (var _iterator = _createForOfIteratorHelperLoose(this.possible()), _step; !(_step = _iterator()).done;) { + _loop(); + } + } else { + for (var _iterator2 = _createForOfIteratorHelperLoose(this.possible()), _step2; !(_step2 = _iterator2()).done;) { + var prefix = _step2.value; + prefixeds[prefix] = this.replace(rule.selector, prefix); + } + } + + rule._autoprefixerPrefixeds[this.name] = prefixeds; + return rule._autoprefixerPrefixeds; + } + /** + * Is rule already prefixed before + */ + ; + + _proto.already = function already(rule, prefixeds, prefix) { + var index = rule.parent.index(rule) - 1; + + while (index >= 0) { + var before = rule.parent.nodes[index]; + + if (before.type !== 'rule') { + return false; + } + + var some = false; + + for (var key in prefixeds[this.name]) { + var prefixed = prefixeds[this.name][key]; + + if (before.selector === prefixed) { + if (prefix === key) { + return true; + } else { + some = true; + break; + } + } + } + + if (!some) { + return false; + } + + index -= 1; + } + + return false; + } + /** + * Replace selectors by prefixed one + */ + ; + + _proto.replace = function replace(selector, prefix) { + return selector.replace(this.regexp(), "$1" + this.prefixed(prefix)); + } + /** + * Clone and add prefixes for at-rule + */ + ; + + _proto.add = function add(rule, prefix) { + var prefixeds = this.prefixeds(rule); + + if (this.already(rule, prefixeds, prefix)) { + return; + } + + var cloned = this.clone(rule, { + selector: prefixeds[this.name][prefix] + }); + rule.parent.insertBefore(rule, cloned); + } + /** + * Return function to fast find prefixed selector + */ + ; + + _proto.old = function old(prefix) { + return new OldSelector(this, prefix); + }; + + return Selector; +}(Prefixer); + +module.exports = Selector; + +},{"./browsers":5,"./old-selector":65,"./prefixer":67,"./utils":74,"postcss":663}],72:[function(require,module,exports){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var postcss = require('postcss'); + +var data = require('caniuse-lite').feature(require('caniuse-lite/data/features/css-featurequeries.js')); + +var Browsers = require('./browsers'); + +var brackets = require('./brackets'); + +var Value = require('./value'); + +var utils = require('./utils'); + +var supported = []; + +for (var browser in data.stats) { + var versions = data.stats[browser]; + + for (var version in versions) { + var support = versions[version]; + + if (/y/.test(support)) { + supported.push(browser + ' ' + version); + } + } +} + +var Supports = /*#__PURE__*/function () { + function Supports(Prefixes, all) { + this.Prefixes = Prefixes; + this.all = all; + } + /** + * Return prefixer only with @supports supported browsers + */ + + + var _proto = Supports.prototype; + + _proto.prefixer = function prefixer() { + if (this.prefixerCache) { + return this.prefixerCache; + } + + var filtered = this.all.browsers.selected.filter(function (i) { + return supported.includes(i); + }); + var browsers = new Browsers(this.all.browsers.data, filtered, this.all.options); + this.prefixerCache = new this.Prefixes(this.all.data, browsers, this.all.options); + return this.prefixerCache; + } + /** + * Parse string into declaration property and value + */ + ; + + _proto.parse = function parse(str) { + var parts = str.split(':'); + var prop = parts[0]; + var value = parts[1]; + if (!value) value = ''; + return [prop.trim(), value.trim()]; + } + /** + * Create virtual rule to process it by prefixer + */ + ; + + _proto.virtual = function virtual(str) { + var _this$parse = this.parse(str), + prop = _this$parse[0], + value = _this$parse[1]; + + var rule = postcss.parse('a{}').first; + rule.append({ + prop: prop, + value: value, + raws: { + before: '' + } + }); + return rule; + } + /** + * Return array of Declaration with all necessary prefixes + */ + ; + + _proto.prefixed = function prefixed(str) { + var rule = this.virtual(str); + + if (this.disabled(rule.first)) { + return rule.nodes; + } + + var result = { + warn: function warn() { + return null; + } + }; + var prefixer = this.prefixer().add[rule.first.prop]; + prefixer && prefixer.process && prefixer.process(rule.first, result); + + for (var _iterator = _createForOfIteratorHelperLoose(rule.nodes), _step; !(_step = _iterator()).done;) { + var decl = _step.value; + + for (var _iterator2 = _createForOfIteratorHelperLoose(this.prefixer().values('add', rule.first.prop)), _step2; !(_step2 = _iterator2()).done;) { + var value = _step2.value; + value.process(decl); + } + + Value.save(this.all, decl); + } + + return rule.nodes; + } + /** + * Return true if brackets node is "not" word + */ + ; + + _proto.isNot = function isNot(node) { + return typeof node === 'string' && /not\s*/i.test(node); + } + /** + * Return true if brackets node is "or" word + */ + ; + + _proto.isOr = function isOr(node) { + return typeof node === 'string' && /\s*or\s*/i.test(node); + } + /** + * Return true if brackets node is (prop: value) + */ + ; + + _proto.isProp = function isProp(node) { + return typeof node === 'object' && node.length === 1 && typeof node[0] === 'string'; + } + /** + * Return true if prefixed property has no unprefixed + */ + ; + + _proto.isHack = function isHack(all, unprefixed) { + var check = new RegExp("(\\(|\\s)" + utils.escapeRegexp(unprefixed) + ":"); + return !check.test(all); + } + /** + * Return true if we need to remove node + */ + ; + + _proto.toRemove = function toRemove(str, all) { + var _this$parse2 = this.parse(str), + prop = _this$parse2[0], + value = _this$parse2[1]; + + var unprefixed = this.all.unprefixed(prop); + var cleaner = this.all.cleaner(); + + if (cleaner.remove[prop] && cleaner.remove[prop].remove && !this.isHack(all, unprefixed)) { + return true; + } + + for (var _iterator3 = _createForOfIteratorHelperLoose(cleaner.values('remove', unprefixed)), _step3; !(_step3 = _iterator3()).done;) { + var checker = _step3.value; + + if (checker.check(value)) { + return true; + } + } + + return false; + } + /** + * Remove all unnecessary prefixes + */ + ; + + _proto.remove = function remove(nodes, all) { + var i = 0; + + while (i < nodes.length) { + if (!this.isNot(nodes[i - 1]) && this.isProp(nodes[i]) && this.isOr(nodes[i + 1])) { + if (this.toRemove(nodes[i][0], all)) { + nodes.splice(i, 2); + continue; + } + + i += 2; + continue; + } + + if (typeof nodes[i] === 'object') { + nodes[i] = this.remove(nodes[i], all); + } + + i += 1; + } + + return nodes; + } + /** + * Clean brackets with one child + */ + ; + + _proto.cleanBrackets = function cleanBrackets(nodes) { + var _this = this; + + return nodes.map(function (i) { + if (typeof i !== 'object') { + return i; + } + + if (i.length === 1 && typeof i[0] === 'object') { + return _this.cleanBrackets(i[0]); + } + + return _this.cleanBrackets(i); + }); + } + /** + * Add " or " between properties and convert it to brackets format + */ + ; + + _proto.convert = function convert(progress) { + var result = ['']; + + for (var _iterator4 = _createForOfIteratorHelperLoose(progress), _step4; !(_step4 = _iterator4()).done;) { + var i = _step4.value; + result.push([i.prop + ": " + i.value]); + result.push(' or '); + } + + result[result.length - 1] = ''; + return result; + } + /** + * Compress value functions into a string nodes + */ + ; + + _proto.normalize = function normalize(nodes) { + var _this2 = this; + + if (typeof nodes !== 'object') { + return nodes; + } + + nodes = nodes.filter(function (i) { + return i !== ''; + }); + + if (typeof nodes[0] === 'string' && nodes[0].includes(':')) { + return [brackets.stringify(nodes)]; + } + + return nodes.map(function (i) { + return _this2.normalize(i); + }); + } + /** + * Add prefixes + */ + ; + + _proto.add = function add(nodes, all) { + var _this3 = this; + + return nodes.map(function (i) { + if (_this3.isProp(i)) { + var prefixed = _this3.prefixed(i[0]); + + if (prefixed.length > 1) { + return _this3.convert(prefixed); + } + + return i; + } + + if (typeof i === 'object') { + return _this3.add(i, all); + } + + return i; + }); + } + /** + * Add prefixed declaration + */ + ; + + _proto.process = function process(rule) { + var ast = brackets.parse(rule.params); + ast = this.normalize(ast); + ast = this.remove(ast, rule.params); + ast = this.add(ast, rule.params); + ast = this.cleanBrackets(ast); + rule.params = brackets.stringify(ast); + } + /** + * Check global options + */ + ; + + _proto.disabled = function disabled(node) { + if (!this.all.options.grid) { + if (node.prop === 'display' && node.value.includes('grid')) { + return true; + } + + if (node.prop.includes('grid') || node.prop === 'justify-items') { + return true; + } + } + + if (this.all.options.flexbox === false) { + if (node.prop === 'display' && node.value.includes('flex')) { + return true; + } + + var other = ['order', 'justify-content', 'align-items', 'align-content']; + + if (node.prop.includes('flex') || other.includes(node.prop)) { + return true; + } + } + + return false; + }; + + return Supports; +}(); + +module.exports = Supports; + +},{"./brackets":4,"./browsers":5,"./utils":74,"./value":75,"caniuse-lite":637,"caniuse-lite/data/features/css-featurequeries.js":187,"postcss":663}],73:[function(require,module,exports){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +var parser = require('postcss-value-parser'); + +var vendor = require('postcss').vendor; + +var list = require('postcss').list; + +var Browsers = require('./browsers'); + +var Transition = /*#__PURE__*/function () { + function Transition(prefixes) { + _defineProperty(this, "props", ['transition', 'transition-property']); + + this.prefixes = prefixes; + } + /** + * Process transition and add prefixes for all necessary properties + */ + + + var _proto = Transition.prototype; + + _proto.add = function add(decl, result) { + var _this = this; + + var prefix, prop; + var add = this.prefixes.add[decl.prop]; + var vendorPrefixes = this.ruleVendorPrefixes(decl); + var declPrefixes = vendorPrefixes || add && add.prefixes || []; + var params = this.parse(decl.value); + var names = params.map(function (i) { + return _this.findProp(i); + }); + var added = []; + + if (names.some(function (i) { + return i[0] === '-'; + })) { + return; + } + + for (var _iterator = _createForOfIteratorHelperLoose(params), _step; !(_step = _iterator()).done;) { + var param = _step.value; + prop = this.findProp(param); + if (prop[0] === '-') continue; + var prefixer = this.prefixes.add[prop]; + if (!prefixer || !prefixer.prefixes) continue; + + for (var _iterator3 = _createForOfIteratorHelperLoose(prefixer.prefixes), _step3; !(_step3 = _iterator3()).done;) { + prefix = _step3.value; + + if (vendorPrefixes && !vendorPrefixes.some(function (p) { + return prefix.includes(p); + })) { + continue; + } + + var prefixed = this.prefixes.prefixed(prop, prefix); + + if (prefixed !== '-ms-transform' && !names.includes(prefixed)) { + if (!this.disabled(prop, prefix)) { + added.push(this.clone(prop, prefixed, param)); + } + } + } + } + + params = params.concat(added); + var value = this.stringify(params); + var webkitClean = this.stringify(this.cleanFromUnprefixed(params, '-webkit-')); + + if (declPrefixes.includes('-webkit-')) { + this.cloneBefore(decl, "-webkit-" + decl.prop, webkitClean); + } + + this.cloneBefore(decl, decl.prop, webkitClean); + + if (declPrefixes.includes('-o-')) { + var operaClean = this.stringify(this.cleanFromUnprefixed(params, '-o-')); + this.cloneBefore(decl, "-o-" + decl.prop, operaClean); + } + + for (var _iterator2 = _createForOfIteratorHelperLoose(declPrefixes), _step2; !(_step2 = _iterator2()).done;) { + prefix = _step2.value; + + if (prefix !== '-webkit-' && prefix !== '-o-') { + var prefixValue = this.stringify(this.cleanOtherPrefixes(params, prefix)); + this.cloneBefore(decl, prefix + decl.prop, prefixValue); + } + } + + if (value !== decl.value && !this.already(decl, decl.prop, value)) { + this.checkForWarning(result, decl); + decl.cloneBefore(); + decl.value = value; + } + } + /** + * Find property name + */ + ; + + _proto.findProp = function findProp(param) { + var prop = param[0].value; + + if (/^\d/.test(prop)) { + for (var _iterator4 = _createForOfIteratorHelperLoose(param.entries()), _step4; !(_step4 = _iterator4()).done;) { + var _step4$value = _step4.value, + i = _step4$value[0], + token = _step4$value[1]; + + if (i !== 0 && token.type === 'word') { + return token.value; + } + } + } + + return prop; + } + /** + * Does we already have this declaration + */ + ; + + _proto.already = function already(decl, prop, value) { + return decl.parent.some(function (i) { + return i.prop === prop && i.value === value; + }); + } + /** + * Add declaration if it is not exist + */ + ; + + _proto.cloneBefore = function cloneBefore(decl, prop, value) { + if (!this.already(decl, prop, value)) { + decl.cloneBefore({ + prop: prop, + value: value + }); + } + } + /** + * Show transition-property warning + */ + ; + + _proto.checkForWarning = function checkForWarning(result, decl) { + if (decl.prop !== 'transition-property') { + return; + } + + decl.parent.each(function (i) { + if (i.type !== 'decl') { + return undefined; + } + + if (i.prop.indexOf('transition-') !== 0) { + return undefined; + } + + if (i.prop === 'transition-property') { + return undefined; + } + + if (list.comma(i.value).length > 1) { + decl.warn(result, 'Replace transition-property to transition, ' + 'because Autoprefixer could not support ' + 'any cases of transition-property ' + 'and other transition-*'); + } + + return false; + }); + } + /** + * Process transition and remove all unnecessary properties + */ + ; + + _proto.remove = function remove(decl) { + var _this2 = this; + + var params = this.parse(decl.value); + params = params.filter(function (i) { + var prop = _this2.prefixes.remove[_this2.findProp(i)]; + + return !prop || !prop.remove; + }); + var value = this.stringify(params); + + if (decl.value === value) { + return; + } + + if (params.length === 0) { + decl.remove(); + return; + } + + var _double = decl.parent.some(function (i) { + return i.prop === decl.prop && i.value === value; + }); + + var smaller = decl.parent.some(function (i) { + return i !== decl && i.prop === decl.prop && i.value.length > value.length; + }); + + if (_double || smaller) { + decl.remove(); + return; + } + + decl.value = value; + } + /** + * Parse properties list to array + */ + ; + + _proto.parse = function parse(value) { + var ast = parser(value); + var result = []; + var param = []; + + for (var _iterator5 = _createForOfIteratorHelperLoose(ast.nodes), _step5; !(_step5 = _iterator5()).done;) { + var node = _step5.value; + param.push(node); + + if (node.type === 'div' && node.value === ',') { + result.push(param); + param = []; + } + } + + result.push(param); + return result.filter(function (i) { + return i.length > 0; + }); + } + /** + * Return properties string from array + */ + ; + + _proto.stringify = function stringify(params) { + if (params.length === 0) { + return ''; + } + + var nodes = []; + + for (var _iterator6 = _createForOfIteratorHelperLoose(params), _step6; !(_step6 = _iterator6()).done;) { + var param = _step6.value; + + if (param[param.length - 1].type !== 'div') { + param.push(this.div(params)); + } + + nodes = nodes.concat(param); + } + + if (nodes[0].type === 'div') { + nodes = nodes.slice(1); + } + + if (nodes[nodes.length - 1].type === 'div') { + nodes = nodes.slice(0, +-2 + 1 || undefined); + } + + return parser.stringify({ + nodes: nodes + }); + } + /** + * Return new param array with different name + */ + ; + + _proto.clone = function clone(origin, name, param) { + var result = []; + var changed = false; + + for (var _iterator7 = _createForOfIteratorHelperLoose(param), _step7; !(_step7 = _iterator7()).done;) { + var i = _step7.value; + + if (!changed && i.type === 'word' && i.value === origin) { + result.push({ + type: 'word', + value: name + }); + changed = true; + } else { + result.push(i); + } + } + + return result; + } + /** + * Find or create separator + */ + ; + + _proto.div = function div(params) { + for (var _iterator8 = _createForOfIteratorHelperLoose(params), _step8; !(_step8 = _iterator8()).done;) { + var param = _step8.value; + + for (var _iterator9 = _createForOfIteratorHelperLoose(param), _step9; !(_step9 = _iterator9()).done;) { + var node = _step9.value; + + if (node.type === 'div' && node.value === ',') { + return node; + } + } + } + + return { + type: 'div', + value: ',', + after: ' ' + }; + }; + + _proto.cleanOtherPrefixes = function cleanOtherPrefixes(params, prefix) { + var _this3 = this; + + return params.filter(function (param) { + var current = vendor.prefix(_this3.findProp(param)); + return current === '' || current === prefix; + }); + } + /** + * Remove all non-webkit prefixes and unprefixed params if we have prefixed + */ + ; + + _proto.cleanFromUnprefixed = function cleanFromUnprefixed(params, prefix) { + var _this4 = this; + + var remove = params.map(function (i) { + return _this4.findProp(i); + }).filter(function (i) { + return i.slice(0, prefix.length) === prefix; + }).map(function (i) { + return _this4.prefixes.unprefixed(i); + }); + var result = []; + + for (var _iterator10 = _createForOfIteratorHelperLoose(params), _step10; !(_step10 = _iterator10()).done;) { + var param = _step10.value; + var prop = this.findProp(param); + var p = vendor.prefix(prop); + + if (!remove.includes(prop) && (p === prefix || p === '')) { + result.push(param); + } + } + + return result; + } + /** + * Check property for disabled by option + */ + ; + + _proto.disabled = function disabled(prop, prefix) { + var other = ['order', 'justify-content', 'align-self', 'align-content']; + + if (prop.includes('flex') || other.includes(prop)) { + if (this.prefixes.options.flexbox === false) { + return true; + } + + if (this.prefixes.options.flexbox === 'no-2009') { + return prefix.includes('2009'); + } + } + + return undefined; + } + /** + * Check if transition prop is inside vendor specific rule + */ + ; + + _proto.ruleVendorPrefixes = function ruleVendorPrefixes(decl) { + var parent = decl.parent; + + if (parent.type !== 'rule') { + return false; + } else if (!parent.selector.includes(':-')) { + return false; + } + + var selectors = Browsers.prefixes().filter(function (s) { + return parent.selector.includes(':' + s); + }); + return selectors.length > 0 ? selectors : false; + }; + + return Transition; +}(); + +module.exports = Transition; + +},{"./browsers":5,"postcss":663,"postcss-value-parser":646}],74:[function(require,module,exports){ +"use strict"; + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +var list = require('postcss').list; + +module.exports = { + /** + * Throw special error, to tell beniary, + * that this error is from Autoprefixer. + */ + error: function error(text) { + var err = new Error(text); + err.autoprefixer = true; + throw err; + }, + + /** + * Return array, that doesn’t contain duplicates. + */ + uniq: function uniq(array) { + var filtered = []; + + for (var _iterator = _createForOfIteratorHelperLoose(array), _step; !(_step = _iterator()).done;) { + var i = _step.value; + + if (!filtered.includes(i)) { + filtered.push(i); + } + } + + return filtered; + }, + + /** + * Return "-webkit-" on "-webkit- old" + */ + removeNote: function removeNote(string) { + if (!string.includes(' ')) { + return string; + } + + return string.split(' ')[0]; + }, + + /** + * Escape RegExp symbols + */ + escapeRegexp: function escapeRegexp(string) { + return string.replace(/[$()*+-.?[\\\]^{|}]/g, '\\$&'); + }, + + /** + * Return regexp to check, that CSS string contain word + */ + regexp: function regexp(word, escape) { + if (escape === void 0) { + escape = true; + } + + if (escape) { + word = this.escapeRegexp(word); + } + + return new RegExp("(^|[\\s,(])(" + word + "($|[\\s(,]))", 'gi'); + }, + + /** + * Change comma list + */ + editList: function editList(value, callback) { + var origin = list.comma(value); + var changed = callback(origin, []); + + if (origin === changed) { + return value; + } + + var join = value.match(/,\s*/); + join = join ? join[0] : ', '; + return changed.join(join); + }, + + /** + * Split the selector into parts. + * It returns 3 level deep array because selectors can be comma + * separated (1), space separated (2), and combined (3) + * @param {String} selector selector string + * @return {Array>} 3 level deep array of split selector + * @see utils.test.js for examples + */ + splitSelector: function splitSelector(selector) { + return list.comma(selector).map(function (i) { + return list.space(i).map(function (k) { + return k.split(/(?=\.|#)/g); + }); + }); + } +}; + +},{"postcss":663}],75:[function(require,module,exports){ +"use strict"; + +function _defaults(obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + + _defaults(subClass, superClass); +} + +var vendor = require('postcss').vendor; + +var Prefixer = require('./prefixer'); + +var OldValue = require('./old-value'); + +var utils = require('./utils'); + +var Value = /*#__PURE__*/function (_Prefixer) { + _inheritsLoose(Value, _Prefixer); + + function Value() { + return _Prefixer.apply(this, arguments) || this; + } + /** + * Clone decl for each prefixed values + */ + + + Value.save = function save(prefixes, decl) { + var _this = this; + + var prop = decl.prop; + var result = []; + + var _loop = function _loop(prefix) { + var value = decl._autoprefixerValues[prefix]; + + if (value === decl.value) { + return "continue"; + } + + var item = void 0; + var propPrefix = vendor.prefix(prop); + + if (propPrefix === '-pie-') { + return "continue"; + } + + if (propPrefix === prefix) { + item = decl.value = value; + result.push(item); + return "continue"; + } + + var prefixed = prefixes.prefixed(prop, prefix); + var rule = decl.parent; + + if (!rule.every(function (i) { + return i.prop !== prefixed; + })) { + result.push(item); + return "continue"; + } + + var trimmed = value.replace(/\s+/, ' '); + var already = rule.some(function (i) { + return i.prop === decl.prop && i.value.replace(/\s+/, ' ') === trimmed; + }); + + if (already) { + result.push(item); + return "continue"; + } + + var cloned = _this.clone(decl, { + value: value + }); + + item = decl.parent.insertBefore(decl, cloned); + result.push(item); + }; + + for (var prefix in decl._autoprefixerValues) { + var _ret = _loop(prefix); + + if (_ret === "continue") continue; + } + + return result; + } + /** + * Is declaration need to be prefixed + */ + ; + + var _proto = Value.prototype; + + _proto.check = function check(decl) { + var value = decl.value; + + if (!value.includes(this.name)) { + return false; + } + + return !!value.match(this.regexp()); + } + /** + * Lazy regexp loading + */ + ; + + _proto.regexp = function regexp() { + return this.regexpCache || (this.regexpCache = utils.regexp(this.name)); + } + /** + * Add prefix to values in string + */ + ; + + _proto.replace = function replace(string, prefix) { + return string.replace(this.regexp(), "$1" + prefix + "$2"); + } + /** + * Get value with comments if it was not changed + */ + ; + + _proto.value = function value(decl) { + if (decl.raws.value && decl.raws.value.value === decl.value) { + return decl.raws.value.raw; + } else { + return decl.value; + } + } + /** + * Save values with next prefixed token + */ + ; + + _proto.add = function add(decl, prefix) { + if (!decl._autoprefixerValues) { + decl._autoprefixerValues = {}; + } + + var value = decl._autoprefixerValues[prefix] || this.value(decl); + var before; + + do { + before = value; + value = this.replace(value, prefix); + if (value === false) return; + } while (value !== before); + + decl._autoprefixerValues[prefix] = value; + } + /** + * Return function to fast find prefixed value + */ + ; + + _proto.old = function old(prefix) { + return new OldValue(this.name, prefix + this.name); + }; + + return Value; +}(Prefixer); + +module.exports = Value; + +},{"./old-value":66,"./prefixer":67,"./utils":74,"postcss":663}],76:[function(require,module,exports){ +'use strict'; + +exports.byteLength = byteLength; +exports.toByteArray = toByteArray; +exports.fromByteArray = fromByteArray; +var lookup = []; +var revLookup = []; +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; +} // Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications + + +revLookup['-'.charCodeAt(0)] = 62; +revLookup['_'.charCodeAt(0)] = 63; + +function getLens(b64) { + var len = b64.length; + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4'); + } // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + + + var validLen = b64.indexOf('='); + if (validLen === -1) validLen = len; + var placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4; + return [validLen, placeHoldersLen]; +} // base64 is 4/3 + up to two characters of the original data + + +function byteLength(b64) { + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; +} + +function _byteLength(b64, validLen, placeHoldersLen) { + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; +} + +function toByteArray(b64) { + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)); + var curByte = 0; // if there are placeholders, only get up to the last complete 4 chars + + var len = placeHoldersLen > 0 ? validLen - 4 : validLen; + var i; + + for (i = 0; i < len; i += 4) { + tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)]; + arr[curByte++] = tmp >> 16 & 0xFF; + arr[curByte++] = tmp >> 8 & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 2) { + tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4; + arr[curByte++] = tmp & 0xFF; + } + + if (placeHoldersLen === 1) { + tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2; + arr[curByte++] = tmp >> 8 & 0xFF; + arr[curByte++] = tmp & 0xFF; + } + + return arr; +} + +function tripletToBase64(num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]; +} + +function encodeChunk(uint8, start, end) { + var tmp; + var output = []; + + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16 & 0xFF0000) + (uint8[i + 1] << 8 & 0xFF00) + (uint8[i + 2] & 0xFF); + output.push(tripletToBase64(tmp)); + } + + return output.join(''); +} + +function fromByteArray(uint8) { + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + // go through the array every three bytes, we'll deal with trailing stuff later + + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength)); + } // pad the end with zeros, but make sure to not forget the extra bytes + + + if (extraBytes === 1) { + tmp = uint8[len - 1]; + parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 0x3F] + '=='); + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1]; + parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 0x3F] + lookup[tmp << 2 & 0x3F] + '='); + } + + return parts.join(''); +} + +},{}],77:[function(require,module,exports){ +"use strict"; + +},{}],78:[function(require,module,exports){ +"use strict"; + +var BrowserslistError = require('./error'); + +function noop() {} + +module.exports = { + loadQueries: function loadQueries() { + throw new BrowserslistError('Sharable configs are not supported in client-side build of Browserslist'); + }, + getStat: function getStat(opts) { + return opts.stats; + }, + loadConfig: function loadConfig(opts) { + if (opts.config) { + throw new BrowserslistError('Browserslist config are not supported in client-side build'); + } + }, + loadCountry: function loadCountry() { + throw new BrowserslistError('Country statistics is not supported ' + 'in client-side build of Browserslist'); + }, + currentNode: function currentNode(resolve, context) { + return resolve(['maintained node versions'], context)[0]; + }, + parseConfig: noop, + readConfig: noop, + findConfig: noop, + clearCaches: noop, + oldDataWarning: noop +}; + +},{"./error":79}],79:[function(require,module,exports){ +"use strict"; + +function BrowserslistError(message) { + this.name = 'BrowserslistError'; + this.message = message; + this.browserslist = true; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, BrowserslistError); + } +} + +BrowserslistError.prototype = Error.prototype; +module.exports = BrowserslistError; + +},{}],80:[function(require,module,exports){ +(function (process){ +"use strict"; + +var jsReleases = require('node-releases/data/processed/envs.json'); + +var agents = require('caniuse-lite/dist/unpacker/agents').agents; + +var jsEOL = require('node-releases/data/release-schedule/release-schedule.json'); + +var path = require('path'); + +var e2c = require('electron-to-chromium/versions'); + +var BrowserslistError = require('./error'); + +var env = require('./node'); // Will load browser.js in webpack + + +var YEAR = 365.259641 * 24 * 60 * 60 * 1000; +var ANDROID_EVERGREEN_FIRST = 37; +var QUERY_OR = 1; +var QUERY_AND = 2; + +function isVersionsMatch(versionA, versionB) { + return (versionA + '.').indexOf(versionB + '.') === 0; +} + +function isEolReleased(name) { + var version = name.slice(1); + return jsReleases.some(function (i) { + return isVersionsMatch(i.version, version); + }); +} + +function normalize(versions) { + return versions.filter(function (version) { + return typeof version === 'string'; + }); +} + +function normalizeElectron(version) { + var versionToUse = version; + + if (version.split('.').length === 3) { + versionToUse = version.split('.').slice(0, -1).join('.'); + } + + return versionToUse; +} + +function nameMapper(name) { + return function mapName(version) { + return name + ' ' + version; + }; +} + +function getMajor(version) { + return parseInt(version.split('.')[0]); +} + +function getMajorVersions(released, number) { + if (released.length === 0) return []; + var majorVersions = uniq(released.map(getMajor)); + var minimum = majorVersions[majorVersions.length - number]; + + if (!minimum) { + return released; + } + + var selected = []; + + for (var i = released.length - 1; i >= 0; i--) { + if (minimum > getMajor(released[i])) break; + selected.unshift(released[i]); + } + + return selected; +} + +function uniq(array) { + var filtered = []; + + for (var i = 0; i < array.length; i++) { + if (filtered.indexOf(array[i]) === -1) filtered.push(array[i]); + } + + return filtered; +} // Helpers + + +function fillUsage(result, name, data) { + for (var i in data) { + result[name + ' ' + i] = data[i]; + } +} + +function generateFilter(sign, version) { + version = parseFloat(version); + + if (sign === '>') { + return function (v) { + return parseFloat(v) > version; + }; + } else if (sign === '>=') { + return function (v) { + return parseFloat(v) >= version; + }; + } else if (sign === '<') { + return function (v) { + return parseFloat(v) < version; + }; + } else { + return function (v) { + return parseFloat(v) <= version; + }; + } +} + +function generateSemverFilter(sign, version) { + version = version.split('.').map(parseSimpleInt); + version[1] = version[1] || 0; + version[2] = version[2] || 0; + + if (sign === '>') { + return function (v) { + v = v.split('.').map(parseSimpleInt); + return compareSemver(v, version) > 0; + }; + } else if (sign === '>=') { + return function (v) { + v = v.split('.').map(parseSimpleInt); + return compareSemver(v, version) >= 0; + }; + } else if (sign === '<') { + return function (v) { + v = v.split('.').map(parseSimpleInt); + return compareSemver(version, v) > 0; + }; + } else { + return function (v) { + v = v.split('.').map(parseSimpleInt); + return compareSemver(version, v) >= 0; + }; + } +} + +function parseSimpleInt(x) { + return parseInt(x); +} + +function compare(a, b) { + if (a < b) return -1; + if (a > b) return +1; + return 0; +} + +function compareSemver(a, b) { + return compare(parseInt(a[0]), parseInt(b[0])) || compare(parseInt(a[1] || '0'), parseInt(b[1] || '0')) || compare(parseInt(a[2] || '0'), parseInt(b[2] || '0')); +} // this follows the npm-like semver behavior + + +function semverFilterLoose(operator, range) { + range = range.split('.').map(parseSimpleInt); + + if (typeof range[1] === 'undefined') { + range[1] = 'x'; + } // ignore any patch version because we only return minor versions + // range[2] = 'x' + + + switch (operator) { + case '<=': + return function (version) { + version = version.split('.').map(parseSimpleInt); + return compareSemverLoose(version, range) <= 0; + }; + + default: + case '>=': + return function (version) { + version = version.split('.').map(parseSimpleInt); + return compareSemverLoose(version, range) >= 0; + }; + } +} // this follows the npm-like semver behavior + + +function compareSemverLoose(version, range) { + if (version[0] !== range[0]) { + return version[0] < range[0] ? -1 : +1; + } + + if (range[1] === 'x') { + return 0; + } + + if (version[1] !== range[1]) { + return version[1] < range[1] ? -1 : +1; + } + + return 0; +} + +function resolveVersion(data, version) { + if (data.versions.indexOf(version) !== -1) { + return version; + } else if (browserslist.versionAliases[data.name][version]) { + return browserslist.versionAliases[data.name][version]; + } else { + return false; + } +} + +function normalizeVersion(data, version) { + var resolved = resolveVersion(data, version); + + if (resolved) { + return resolved; + } else if (data.versions.length === 1) { + return data.versions[0]; + } else { + return false; + } +} + +function filterByYear(since, context) { + since = since / 1000; + return Object.keys(agents).reduce(function (selected, name) { + var data = byName(name, context); + if (!data) return selected; + var versions = Object.keys(data.releaseDate).filter(function (v) { + return data.releaseDate[v] >= since; + }); + return selected.concat(versions.map(nameMapper(data.name))); + }, []); +} + +function cloneData(data) { + return { + name: data.name, + versions: data.versions, + released: data.released, + releaseDate: data.releaseDate + }; +} + +function mapVersions(data, map) { + data.versions = data.versions.map(function (i) { + return map[i] || i; + }); + data.released = data.versions.map(function (i) { + return map[i] || i; + }); + var fixedDate = {}; + + for (var i in data.releaseDate) { + fixedDate[map[i] || i] = data.releaseDate[i]; + } + + data.releaseDate = fixedDate; + return data; +} + +function byName(name, context) { + name = name.toLowerCase(); + name = browserslist.aliases[name] || name; + + if (context.mobileToDesktop && browserslist.desktopNames[name]) { + var desktop = browserslist.data[browserslist.desktopNames[name]]; + + if (name === 'android') { + return normalizeAndroidData(cloneData(browserslist.data[name]), desktop); + } else { + var cloned = cloneData(desktop); + cloned.name = name; + + if (name === 'op_mob') { + cloned = mapVersions(cloned, { + '10.0-10.1': '10' + }); + } + + return cloned; + } + } + + return browserslist.data[name]; +} + +function normalizeAndroidVersions(androidVersions, chromeVersions) { + var firstEvergreen = ANDROID_EVERGREEN_FIRST; + var last = chromeVersions[chromeVersions.length - 1]; + return androidVersions.filter(function (version) { + return /^(?:[2-4]\.|[34]$)/.test(version); + }).concat(chromeVersions.slice(firstEvergreen - last - 1)); +} + +function normalizeAndroidData(android, chrome) { + android.released = normalizeAndroidVersions(android.released, chrome.released); + android.versions = normalizeAndroidVersions(android.versions, chrome.versions); + return android; +} + +function checkName(name, context) { + var data = byName(name, context); + if (!data) throw new BrowserslistError('Unknown browser ' + name); + return data; +} + +function unknownQuery(query) { + return new BrowserslistError('Unknown browser query `' + query + '`. ' + 'Maybe you are using old Browserslist or made typo in query.'); +} + +function filterAndroid(list, versions, context) { + if (context.mobileToDesktop) return list; + var released = browserslist.data.android.released; + var last = released[released.length - 1]; + var diff = last - ANDROID_EVERGREEN_FIRST - versions; + + if (diff > 0) { + return list.slice(-1); + } else { + return list.slice(diff - 1); + } +} +/** + * Resolves queries into a browser list. + * @param {string|string[]} queries Queries to combine. + * Either an array of queries or a long string of queries. + * @param {object} [context] Optional arguments to + * the select function in `queries`. + * @returns {string[]} A list of browsers + */ + + +function resolve(queries, context) { + if (Array.isArray(queries)) { + queries = flatten(queries.map(parse)); + } else { + queries = parse(queries); + } + + return queries.reduce(function (result, query, index) { + var selection = query.queryString; + var isExclude = selection.indexOf('not ') === 0; + + if (isExclude) { + if (index === 0) { + throw new BrowserslistError('Write any browsers query (for instance, `defaults`) ' + 'before `' + selection + '`'); + } + + selection = selection.slice(4); + } + + for (var i = 0; i < QUERIES.length; i++) { + var type = QUERIES[i]; + var match = selection.match(type.regexp); + + if (match) { + var args = [context].concat(match.slice(1)); + var array = type.select.apply(browserslist, args).map(function (j) { + var parts = j.split(' '); + + if (parts[1] === '0') { + return parts[0] + ' ' + byName(parts[0], context).versions[0]; + } else { + return j; + } + }); + + switch (query.type) { + case QUERY_AND: + if (isExclude) { + return result.filter(function (j) { + return array.indexOf(j) === -1; + }); + } else { + return result.filter(function (j) { + return array.indexOf(j) !== -1; + }); + } + + case QUERY_OR: + default: + if (isExclude) { + var filter = {}; + array.forEach(function (j) { + filter[j] = true; + }); + return result.filter(function (j) { + return !filter[j]; + }); + } + + return result.concat(array); + } + } + } + + throw unknownQuery(selection); + }, []); +} + +var cache = {}; +/** + * Return array of browsers by selection queries. + * + * @param {(string|string[])} [queries=browserslist.defaults] Browser queries. + * @param {object} [opts] Options. + * @param {string} [opts.path="."] Path to processed file. + * It will be used to find config files. + * @param {string} [opts.env="production"] Processing environment. + * It will be used to take right + * queries from config file. + * @param {string} [opts.config] Path to config file with queries. + * @param {object} [opts.stats] Custom browser usage statistics + * for "> 1% in my stats" query. + * @param {boolean} [opts.ignoreUnknownVersions=false] Do not throw on unknown + * version in direct query. + * @param {boolean} [opts.dangerousExtend] Disable security checks + * for extend query. + * @param {boolean} [opts.mobileToDesktop] Alias mobile browsers to the desktop + * version when Can I Use doesn't have + * data about the specified version. + * @returns {string[]} Array with browser names in Can I Use. + * + * @example + * browserslist('IE >= 10, IE 8') //=> ['ie 11', 'ie 10', 'ie 8'] + */ + +function browserslist(queries, opts) { + if (typeof opts === 'undefined') opts = {}; + + if (typeof opts.path === 'undefined') { + opts.path = path.resolve ? path.resolve('.') : '.'; + } + + if (typeof queries === 'undefined' || queries === null) { + var config = browserslist.loadConfig(opts); + + if (config) { + queries = config; + } else { + queries = browserslist.defaults; + } + } + + if (!(typeof queries === 'string' || Array.isArray(queries))) { + throw new BrowserslistError('Browser queries must be an array or string. Got ' + typeof queries + '.'); + } + + var context = { + ignoreUnknownVersions: opts.ignoreUnknownVersions, + dangerousExtend: opts.dangerousExtend, + mobileToDesktop: opts.mobileToDesktop, + env: opts.env + }; + env.oldDataWarning(browserslist.data); + var stats = env.getStat(opts, browserslist.data); + + if (stats) { + context.customUsage = {}; + + for (var browser in stats) { + fillUsage(context.customUsage, browser, stats[browser]); + } + } + + var cacheKey = JSON.stringify([queries, context]); + if (cache[cacheKey]) return cache[cacheKey]; + var result = uniq(resolve(queries, context)).sort(function (name1, name2) { + name1 = name1.split(' '); + name2 = name2.split(' '); + + if (name1[0] === name2[0]) { + // assumptions on caniuse data + // 1) version ranges never overlaps + // 2) if version is not a range, it never contains `-` + var version1 = name1[1].split('-')[0]; + var version2 = name2[1].split('-')[0]; + return compareSemver(version2.split('.'), version1.split('.')); + } else { + return compare(name1[0], name2[0]); + } + }); + + if (!process.env.BROWSERSLIST_DISABLE_CACHE) { + cache[cacheKey] = result; + } + + return result; +} + +function parse(queries) { + var qs = []; + + do { + queries = doMatch(queries, qs); + } while (queries); + + return qs; +} + +function doMatch(string, qs) { + var or = /^(?:,\s*|\s+or\s+)(.*)/i; + var and = /^\s+and\s+(.*)/i; + return find(string, function (parsed, n, max) { + if (and.test(parsed)) { + qs.unshift({ + type: QUERY_AND, + queryString: parsed.match(and)[1] + }); + return true; + } else if (or.test(parsed)) { + qs.unshift({ + type: QUERY_OR, + queryString: parsed.match(or)[1] + }); + return true; + } else if (n === max) { + qs.unshift({ + type: QUERY_OR, + queryString: parsed.trim() + }); + return true; + } + + return false; + }); +} + +function find(string, predicate) { + for (var n = 1, max = string.length; n <= max; n++) { + var parsed = string.substr(-n, n); + + if (predicate(parsed, n, max)) { + return string.slice(0, -n); + } + } + + return ''; +} + +function flatten(array) { + if (!Array.isArray(array)) return [array]; + return array.reduce(function (a, b) { + return a.concat(flatten(b)); + }, []); +} // Will be filled by Can I Use data below + + +browserslist.data = {}; +browserslist.usage = { + global: {}, + custom: null +}; // Default browsers query + +browserslist.defaults = ['> 0.5%', 'last 2 versions', 'Firefox ESR', 'not dead']; // Browser names aliases + +browserslist.aliases = { + fx: 'firefox', + ff: 'firefox', + ios: 'ios_saf', + explorer: 'ie', + blackberry: 'bb', + explorermobile: 'ie_mob', + operamini: 'op_mini', + operamobile: 'op_mob', + chromeandroid: 'and_chr', + firefoxandroid: 'and_ff', + ucandroid: 'and_uc', + qqandroid: 'and_qq' +}; // Can I Use only provides a few versions for some browsers (e.g. and_chr). +// Fallback to a similar browser for unknown versions + +browserslist.desktopNames = { + and_chr: 'chrome', + and_ff: 'firefox', + ie_mob: 'ie', + op_mob: 'opera', + android: 'chrome' // has extra processing logic + +}; // Aliases to work with joined versions like `ios_saf 7.0-7.1` + +browserslist.versionAliases = {}; +browserslist.clearCaches = env.clearCaches; +browserslist.parseConfig = env.parseConfig; +browserslist.readConfig = env.readConfig; +browserslist.findConfig = env.findConfig; +browserslist.loadConfig = env.loadConfig; +/** + * Return browsers market coverage. + * + * @param {string[]} browsers Browsers names in Can I Use. + * @param {string|object} [stats="global"] Which statistics should be used. + * Country code or custom statistics. + * Pass `"my stats"` to load statistics + * from Browserslist files. + * + * @return {number} Total market coverage for all selected browsers. + * + * @example + * browserslist.coverage(browserslist('> 1% in US'), 'US') //=> 83.1 + */ + +browserslist.coverage = function (browsers, stats) { + var data; + + if (typeof stats === 'undefined') { + data = browserslist.usage.global; + } else if (stats === 'my stats') { + var opts = {}; + opts.path = path.resolve ? path.resolve('.') : '.'; + var customStats = env.getStat(opts); + + if (!customStats) { + throw new BrowserslistError('Custom usage statistics was not provided'); + } + + data = {}; + + for (var browser in customStats) { + fillUsage(data, browser, customStats[browser]); + } + } else if (typeof stats === 'string') { + if (stats.length > 2) { + stats = stats.toLowerCase(); + } else { + stats = stats.toUpperCase(); + } + + env.loadCountry(browserslist.usage, stats, browserslist.data); + data = browserslist.usage[stats]; + } else { + if ('dataByBrowser' in stats) { + stats = stats.dataByBrowser; + } + + data = {}; + + for (var name in stats) { + for (var version in stats[name]) { + data[name + ' ' + version] = stats[name][version]; + } + } + } + + return browsers.reduce(function (all, i) { + var usage = data[i]; + + if (usage === undefined) { + usage = data[i.replace(/ \S+$/, ' 0')]; + } + + return all + (usage || 0); + }, 0); +}; + +var QUERIES = [{ + regexp: /^last\s+(\d+)\s+major\s+versions?$/i, + select: function select(context, versions) { + return Object.keys(agents).reduce(function (selected, name) { + var data = byName(name, context); + if (!data) return selected; + var list = getMajorVersions(data.released, versions); + list = list.map(nameMapper(data.name)); + + if (data.name === 'android') { + list = filterAndroid(list, versions, context); + } + + return selected.concat(list); + }, []); + } +}, { + regexp: /^last\s+(\d+)\s+versions?$/i, + select: function select(context, versions) { + return Object.keys(agents).reduce(function (selected, name) { + var data = byName(name, context); + if (!data) return selected; + var list = data.released.slice(-versions); + list = list.map(nameMapper(data.name)); + + if (data.name === 'android') { + list = filterAndroid(list, versions, context); + } + + return selected.concat(list); + }, []); + } +}, { + regexp: /^last\s+(\d+)\s+electron\s+major\s+versions?$/i, + select: function select(context, versions) { + var validVersions = getMajorVersions(Object.keys(e2c).reverse(), versions); + return validVersions.map(function (i) { + return 'chrome ' + e2c[i]; + }); + } +}, { + regexp: /^last\s+(\d+)\s+(\w+)\s+major\s+versions?$/i, + select: function select(context, versions, name) { + var data = checkName(name, context); + var validVersions = getMajorVersions(data.released, versions); + var list = validVersions.map(nameMapper(data.name)); + + if (data.name === 'android') { + list = filterAndroid(list, versions, context); + } + + return list; + } +}, { + regexp: /^last\s+(\d+)\s+electron\s+versions?$/i, + select: function select(context, versions) { + return Object.keys(e2c).reverse().slice(-versions).map(function (i) { + return 'chrome ' + e2c[i]; + }); + } +}, { + regexp: /^last\s+(\d+)\s+(\w+)\s+versions?$/i, + select: function select(context, versions, name) { + var data = checkName(name, context); + var list = data.released.slice(-versions).map(nameMapper(data.name)); + + if (data.name === 'android') { + list = filterAndroid(list, versions, context); + } + + return list; + } +}, { + regexp: /^unreleased\s+versions$/i, + select: function select(context) { + return Object.keys(agents).reduce(function (selected, name) { + var data = byName(name, context); + if (!data) return selected; + var list = data.versions.filter(function (v) { + return data.released.indexOf(v) === -1; + }); + list = list.map(nameMapper(data.name)); + return selected.concat(list); + }, []); + } +}, { + regexp: /^unreleased\s+electron\s+versions?$/i, + select: function select() { + return []; + } +}, { + regexp: /^unreleased\s+(\w+)\s+versions?$/i, + select: function select(context, name) { + var data = checkName(name, context); + return data.versions.filter(function (v) { + return data.released.indexOf(v) === -1; + }).map(nameMapper(data.name)); + } +}, { + regexp: /^last\s+(\d*.?\d+)\s+years?$/i, + select: function select(context, years) { + return filterByYear(Date.now() - YEAR * years, context); + } +}, { + regexp: /^since (\d+)(?:-(\d+))?(?:-(\d+))?$/i, + select: function select(context, year, month, date) { + year = parseInt(year); + month = parseInt(month || '01') - 1; + date = parseInt(date || '01'); + return filterByYear(Date.UTC(year, month, date, 0, 0, 0), context); + } +}, { + regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%$/, + select: function select(context, sign, popularity) { + popularity = parseFloat(popularity); + var usage = browserslist.usage.global; + return Object.keys(usage).reduce(function (result, version) { + if (sign === '>') { + if (usage[version] > popularity) { + result.push(version); + } + } else if (sign === '<') { + if (usage[version] < popularity) { + result.push(version); + } + } else if (sign === '<=') { + if (usage[version] <= popularity) { + result.push(version); + } + } else if (usage[version] >= popularity) { + result.push(version); + } + + return result; + }, []); + } +}, { + regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%\s+in\s+my\s+stats$/, + select: function select(context, sign, popularity) { + popularity = parseFloat(popularity); + + if (!context.customUsage) { + throw new BrowserslistError('Custom usage statistics was not provided'); + } + + var usage = context.customUsage; + return Object.keys(usage).reduce(function (result, version) { + if (sign === '>') { + if (usage[version] > popularity) { + result.push(version); + } + } else if (sign === '<') { + if (usage[version] < popularity) { + result.push(version); + } + } else if (sign === '<=') { + if (usage[version] <= popularity) { + result.push(version); + } + } else if (usage[version] >= popularity) { + result.push(version); + } + + return result; + }, []); + } +}, { + regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%\s+in\s+(\S+)\s+stats$/, + select: function select(context, sign, popularity, name) { + popularity = parseFloat(popularity); + var stats = env.loadStat(context, name, browserslist.data); + + if (stats) { + context.customUsage = {}; + + for (var browser in stats) { + fillUsage(context.customUsage, browser, stats[browser]); + } + } + + if (!context.customUsage) { + throw new BrowserslistError('Custom usage statistics was not provided'); + } + + var usage = context.customUsage; + return Object.keys(usage).reduce(function (result, version) { + if (sign === '>') { + if (usage[version] > popularity) { + result.push(version); + } + } else if (sign === '<') { + if (usage[version] < popularity) { + result.push(version); + } + } else if (sign === '<=') { + if (usage[version] <= popularity) { + result.push(version); + } + } else if (usage[version] >= popularity) { + result.push(version); + } + + return result; + }, []); + } +}, { + regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%\s+in\s+((alt-)?\w\w)$/, + select: function select(context, sign, popularity, place) { + popularity = parseFloat(popularity); + + if (place.length === 2) { + place = place.toUpperCase(); + } else { + place = place.toLowerCase(); + } + + env.loadCountry(browserslist.usage, place, browserslist.data); + var usage = browserslist.usage[place]; + return Object.keys(usage).reduce(function (result, version) { + if (sign === '>') { + if (usage[version] > popularity) { + result.push(version); + } + } else if (sign === '<') { + if (usage[version] < popularity) { + result.push(version); + } + } else if (sign === '<=') { + if (usage[version] <= popularity) { + result.push(version); + } + } else if (usage[version] >= popularity) { + result.push(version); + } + + return result; + }, []); + } +}, { + regexp: /^cover\s+(\d*\.?\d+)%(\s+in\s+(my\s+stats|(alt-)?\w\w))?$/, + select: function select(context, coverage, statMode) { + coverage = parseFloat(coverage); + var usage = browserslist.usage.global; + + if (statMode) { + if (statMode.match(/^\s+in\s+my\s+stats$/)) { + if (!context.customUsage) { + throw new BrowserslistError('Custom usage statistics was not provided'); + } + + usage = context.customUsage; + } else { + var match = statMode.match(/\s+in\s+((alt-)?\w\w)/); + var place = match[1]; + + if (place.length === 2) { + place = place.toUpperCase(); + } else { + place = place.toLowerCase(); + } + + env.loadCountry(browserslist.usage, place, browserslist.data); + usage = browserslist.usage[place]; + } + } + + var versions = Object.keys(usage).sort(function (a, b) { + return usage[b] - usage[a]; + }); + var coveraged = 0; + var result = []; + var version; + + for (var i = 0; i <= versions.length; i++) { + version = versions[i]; + if (usage[version] === 0) break; + coveraged += usage[version]; + result.push(version); + if (coveraged >= coverage) break; + } + + return result; + } +}, { + regexp: /^electron\s+([\d.]+)\s*-\s*([\d.]+)$/i, + select: function select(context, from, to) { + var fromToUse = normalizeElectron(from); + var toToUse = normalizeElectron(to); + + if (!e2c[fromToUse]) { + throw new BrowserslistError('Unknown version ' + from + ' of electron'); + } + + if (!e2c[toToUse]) { + throw new BrowserslistError('Unknown version ' + to + ' of electron'); + } + + from = parseFloat(from); + to = parseFloat(to); + return Object.keys(e2c).filter(function (i) { + var parsed = parseFloat(i); + return parsed >= from && parsed <= to; + }).map(function (i) { + return 'chrome ' + e2c[i]; + }); + } +}, { + regexp: /^node\s+([\d.]+)\s*-\s*([\d.]+)$/i, + select: function select(context, from, to) { + var nodeVersions = jsReleases.filter(function (i) { + return i.name === 'nodejs'; + }).map(function (i) { + return i.version; + }); + var semverRegExp = /^(0|[1-9]\d*)(\.(0|[1-9]\d*)){0,2}$/; + + if (!semverRegExp.test(from)) { + throw new BrowserslistError('Unknown version ' + from + ' of Node.js'); + } + + if (!semverRegExp.test(to)) { + throw new BrowserslistError('Unknown version ' + to + ' of Node.js'); + } + + return nodeVersions.filter(semverFilterLoose('>=', from)).filter(semverFilterLoose('<=', to)).map(function (v) { + return 'node ' + v; + }); + } +}, { + regexp: /^(\w+)\s+([\d.]+)\s*-\s*([\d.]+)$/i, + select: function select(context, name, from, to) { + var data = checkName(name, context); + from = parseFloat(normalizeVersion(data, from) || from); + to = parseFloat(normalizeVersion(data, to) || to); + + function filter(v) { + var parsed = parseFloat(v); + return parsed >= from && parsed <= to; + } + + return data.released.filter(filter).map(nameMapper(data.name)); + } +}, { + regexp: /^electron\s*(>=?|<=?)\s*([\d.]+)$/i, + select: function select(context, sign, version) { + var versionToUse = normalizeElectron(version); + return Object.keys(e2c).filter(generateFilter(sign, versionToUse)).map(function (i) { + return 'chrome ' + e2c[i]; + }); + } +}, { + regexp: /^node\s*(>=?|<=?)\s*([\d.]+)$/i, + select: function select(context, sign, version) { + var nodeVersions = jsReleases.filter(function (i) { + return i.name === 'nodejs'; + }).map(function (i) { + return i.version; + }); + return nodeVersions.filter(generateSemverFilter(sign, version)).map(function (v) { + return 'node ' + v; + }); + } +}, { + regexp: /^(\w+)\s*(>=?|<=?)\s*([\d.]+)$/, + select: function select(context, name, sign, version) { + var data = checkName(name, context); + var alias = browserslist.versionAliases[data.name][version]; + + if (alias) { + version = alias; + } + + return data.released.filter(generateFilter(sign, version)).map(function (v) { + return data.name + ' ' + v; + }); + } +}, { + regexp: /^(firefox|ff|fx)\s+esr$/i, + select: function select() { + return ['firefox 68']; + } +}, { + regexp: /(operamini|op_mini)\s+all/i, + select: function select() { + return ['op_mini all']; + } +}, { + regexp: /^electron\s+([\d.]+)$/i, + select: function select(context, version) { + var versionToUse = normalizeElectron(version); + var chrome = e2c[versionToUse]; + + if (!chrome) { + throw new BrowserslistError('Unknown version ' + version + ' of electron'); + } + + return ['chrome ' + chrome]; + } +}, { + regexp: /^node\s+(\d+(\.\d+)?(\.\d+)?)$/i, + select: function select(context, version) { + var nodeReleases = jsReleases.filter(function (i) { + return i.name === 'nodejs'; + }); + var matched = nodeReleases.filter(function (i) { + return isVersionsMatch(i.version, version); + }); + + if (matched.length === 0) { + if (context.ignoreUnknownVersions) { + return []; + } else { + throw new BrowserslistError('Unknown version ' + version + ' of Node.js'); + } + } + + return ['node ' + matched[matched.length - 1].version]; + } +}, { + regexp: /^current\s+node$/i, + select: function select(context) { + return [env.currentNode(resolve, context)]; + } +}, { + regexp: /^maintained\s+node\s+versions$/i, + select: function select(context) { + var now = Date.now(); + var queries = Object.keys(jsEOL).filter(function (key) { + return now < Date.parse(jsEOL[key].end) && now > Date.parse(jsEOL[key].start) && isEolReleased(key); + }).map(function (key) { + return 'node ' + key.slice(1); + }); + return resolve(queries, context); + } +}, { + regexp: /^phantomjs\s+1.9$/i, + select: function select() { + return ['safari 5']; + } +}, { + regexp: /^phantomjs\s+2.1$/i, + select: function select() { + return ['safari 6']; + } +}, { + regexp: /^(\w+)\s+(tp|[\d.]+)$/i, + select: function select(context, name, version) { + if (/^tp$/i.test(version)) version = 'TP'; + var data = checkName(name, context); + var alias = normalizeVersion(data, version); + + if (alias) { + version = alias; + } else { + if (version.indexOf('.') === -1) { + alias = version + '.0'; + } else { + alias = version.replace(/\.0$/, ''); + } + + alias = normalizeVersion(data, alias); + + if (alias) { + version = alias; + } else if (context.ignoreUnknownVersions) { + return []; + } else { + throw new BrowserslistError('Unknown version ' + version + ' of ' + name); + } + } + + return [data.name + ' ' + version]; + } +}, { + regexp: /^extends (.+)$/i, + select: function select(context, name) { + return resolve(env.loadQueries(context, name), context); + } +}, { + regexp: /^defaults$/i, + select: function select(context) { + return resolve(browserslist.defaults, context); + } +}, { + regexp: /^dead$/i, + select: function select(context) { + var dead = ['ie <= 10', 'ie_mob <= 11', 'bb <= 10', 'op_mob <= 12.1', 'samsung 4']; + return resolve(dead, context); + } +}, { + regexp: /^(\w+)$/i, + select: function select(context, name) { + if (byName(name, context)) { + throw new BrowserslistError('Specify versions in Browserslist query for browser ' + name); + } else { + throw unknownQuery(name); + } + } +}]; // Get and convert Can I Use data + +(function () { + for (var name in agents) { + var browser = agents[name]; + browserslist.data[name] = { + name: name, + versions: normalize(agents[name].versions), + released: normalize(agents[name].versions.slice(0, -3)), + releaseDate: agents[name].release_date + }; + fillUsage(browserslist.usage.global, name, browser.usage_global); + browserslist.versionAliases[name] = {}; + + for (var i = 0; i < browser.versions.length; i++) { + var full = browser.versions[i]; + if (!full) continue; + + if (full.indexOf('-') !== -1) { + var interval = full.split('-'); + + for (var j = 0; j < interval.length; j++) { + browserslist.versionAliases[name][interval[j]] = full; + } + } + } + } +})(); + +module.exports = browserslist; + +}).call(this,require('_process')) +},{"./error":79,"./node":78,"_process":675,"caniuse-lite/dist/unpacker/agents":84,"electron-to-chromium/versions":639,"node-releases/data/processed/envs.json":641,"node-releases/data/release-schedule/release-schedule.json":642,"path":77}],81:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + I: 0.00587468, + F: 0.00587468, + E: 0.0704962, + D: 0.229113, + A: 0.0176241, + B: 1.42167, + hB: 0.009298 + }, + B: "ms", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "hB", "I", "F", "E", "D", "A", "B", "", "", ""], + E: "IE", + F: { + hB: 962323200, + I: 998870400, + F: 1161129600, + E: 1237420800, + D: 1300060800, + A: 1346716800, + B: 1381968000 + } + }, + B: { + A: { + C: 0.009312, + O: 0.009312, + P: 0.013968, + H: 0.013968, + J: 0.027936, + K: 0.09312, + L: 1.90896, + S: 0, + UB: 0, + M: 0, + HB: 0 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "C", "O", "P", "H", "J", "K", "L", "S", "UB", "M", "HB", "", "", ""], + E: "Edge", + F: { + C: 1438128000, + O: 1447286400, + P: 1470096000, + H: 1491868800, + J: 1508198400, + K: 1525046400, + L: 1542067200, + S: 1579046400, + UB: 1581033600, + M: 1586736000, + HB: 1590019200 + }, + D: { + C: "ms", + O: "ms", + P: "ms", + H: "ms", + J: "ms", + K: "ms", + L: "ms" + } + }, + C: { + A: { + "0": 0.004538, + "1": 0.004656, + "2": 0.004656, + "3": 0.1164, + "4": 0.004335, + "5": 0.013968, + "6": 0.009312, + "7": 0.018624, + "8": 0.004656, + "9": 0.013005, + aB: 0.004827, + OB: 0.004538, + G: 0.018624, + V: 0.004879, + I: 0.020136, + F: 0.005725, + E: 0.004525, + D: 0.00533, + A: 0.004283, + B: 0.004656, + C: 0.004471, + O: 0.004486, + P: 0.00453, + H: 0.004465, + J: 0.004417, + K: 0.008922, + L: 0.004393, + W: 0.004443, + X: 0.004283, + Y: 0.013596, + Z: 0.013698, + a: 0.013614, + b: 0.008786, + c: 0.004403, + d: 0.004317, + e: 0.004393, + f: 0.004418, + g: 0.008834, + h: 0.004403, + i: 0.008928, + j: 0.004471, + k: 0.013968, + l: 0.004707, + m: 0.009076, + n: 0.004465, + o: 0.004783, + p: 0.004656, + q: 0.004783, + r: 0.00487, + s: 0.005029, + t: 0.0047, + u: 0.037248, + v: 0.004656, + w: 0.009312, + Q: 0.004525, + y: 0.009312, + z: 0.018624, + WB: 0.004656, + BB: 0.018624, + GB: 0.004656, + DB: 0.004656, + EB: 0.032592, + CB: 0.027936, + AB: 0.032592, + T: 0.02328, + R: 0.009312, + N: 0.130368, + IB: 0.013968, + JB: 0.013968, + KB: 0.013968, + LB: 0.041904, + MB: 0.018624, + NB: 0.079152, + FB: 0.945168, + PB: 2.30938, + QB: 0.04656, + RB: 0, + S: 0, + gB: 0.008786, + oB: 0.00487 + }, + B: "moz", + C: ["", "aB", "OB", "gB", "oB", "G", "V", "I", "F", "E", "D", "A", "B", "C", "O", "P", "H", "J", "K", "L", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "Q", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "WB", "BB", "GB", "DB", "EB", "CB", "AB", "T", "R", "N", "IB", "JB", "KB", "LB", "MB", "NB", "FB", "PB", "QB", "RB", "S", ""], + E: "Firefox", + F: { + "0": 1474329600, + "1": 1479168000, + "2": 1485216000, + "3": 1488844800, + "4": 1492560000, + "5": 1497312000, + "6": 1502150400, + "7": 1506556800, + "8": 1510617600, + "9": 1516665600, + aB: 1161648000, + OB: 1213660800, + gB: 1246320000, + oB: 1264032000, + G: 1300752000, + V: 1308614400, + I: 1313452800, + F: 1317081600, + E: 1317081600, + D: 1320710400, + A: 1324339200, + B: 1327968000, + C: 1331596800, + O: 1335225600, + P: 1338854400, + H: 1342483200, + J: 1346112000, + K: 1349740800, + L: 1353628800, + W: 1357603200, + X: 1361232000, + Y: 1364860800, + Z: 1368489600, + a: 1372118400, + b: 1375747200, + c: 1379376000, + d: 1386633600, + e: 1391472000, + f: 1395100800, + g: 1398729600, + h: 1402358400, + i: 1405987200, + j: 1409616000, + k: 1413244800, + l: 1417392000, + m: 1421107200, + n: 1424736000, + o: 1428278400, + p: 1431475200, + q: 1435881600, + r: 1439251200, + s: 1442880000, + t: 1446508800, + u: 1450137600, + v: 1453852800, + w: 1457395200, + Q: 1461628800, + y: 1465257600, + z: 1470096000, + WB: 1520985600, + BB: 1525824000, + GB: 1529971200, + DB: 1536105600, + EB: 1540252800, + CB: 1544486400, + AB: 1548720000, + T: 1552953600, + R: 1558396800, + N: 1562630400, + IB: 1567468800, + JB: 1571788800, + KB: 1575331200, + LB: 1578355200, + MB: 1581379200, + NB: 1583798400, + FB: 1586304000, + PB: 1588636800, + QB: 1591056000, + RB: null, + S: null + } + }, + D: { + A: { + "0": 0.307296, + "1": 0.004656, + "2": 0.009312, + "3": 0.004656, + "4": 0.041904, + "5": 0.018624, + "6": 0.013968, + "7": 0.02328, + "8": 0.02328, + "9": 0.02328, + G: 0.004706, + V: 0.004879, + I: 0.004879, + F: 0.005591, + E: 0.005591, + D: 0.005591, + A: 0.004534, + B: 0.004464, + C: 0.010424, + O: 0.009312, + P: 0.004706, + H: 0.015087, + J: 0.004393, + K: 0.004393, + L: 0.008652, + W: 0.004418, + X: 0.004393, + Y: 0.004317, + Z: 0.009312, + a: 0.008786, + b: 0.004538, + c: 0.004461, + d: 0.004656, + e: 0.004326, + f: 0.0047, + g: 0.004538, + h: 0.004335, + i: 0.130368, + j: 0.004566, + k: 0.009312, + l: 0.009312, + m: 0.004335, + n: 0.004335, + o: 0.004464, + p: 0.027936, + q: 0.004464, + r: 0.013968, + s: 0.027936, + t: 0.004403, + u: 0.013968, + v: 0.004465, + w: 0.004656, + Q: 0.004538, + y: 0.009312, + z: 0.027936, + WB: 0.009312, + BB: 0.013968, + GB: 0.027936, + DB: 0.018624, + EB: 0.055872, + CB: 0.018624, + AB: 0.041904, + T: 0.027936, + R: 0.051216, + N: 0.027936, + IB: 0.09312, + JB: 0.195552, + KB: 0.246768, + LB: 0.2328, + MB: 0.13968, + NB: 0.1164, + FB: 0.107088, + PB: 0.130368, + QB: 0.102432, + RB: 0.172272, + S: 0.288672, + UB: 1.0476, + M: 22.9774, + HB: 4.074, + pB: 0.027936, + rB: 0.009312, + YB: 0 + }, + B: "webkit", + C: ["G", "V", "I", "F", "E", "D", "A", "B", "C", "O", "P", "H", "J", "K", "L", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "Q", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "WB", "BB", "GB", "DB", "EB", "CB", "AB", "T", "R", "N", "IB", "JB", "KB", "LB", "MB", "NB", "FB", "PB", "QB", "RB", "S", "UB", "M", "HB", "pB", "rB", "YB"], + E: "Chrome", + F: { + "0": 1456963200, + "1": 1460592000, + "2": 1464134400, + "3": 1469059200, + "4": 1472601600, + "5": 1476230400, + "6": 1480550400, + "7": 1485302400, + "8": 1489017600, + "9": 1492560000, + G: 1264377600, + V: 1274745600, + I: 1283385600, + F: 1287619200, + E: 1291248000, + D: 1296777600, + A: 1299542400, + B: 1303862400, + C: 1307404800, + O: 1312243200, + P: 1316131200, + H: 1316131200, + J: 1319500800, + K: 1323734400, + L: 1328659200, + W: 1332892800, + X: 1337040000, + Y: 1340668800, + Z: 1343692800, + a: 1348531200, + b: 1352246400, + c: 1357862400, + d: 1361404800, + e: 1364428800, + f: 1369094400, + g: 1374105600, + h: 1376956800, + i: 1384214400, + j: 1389657600, + k: 1392940800, + l: 1397001600, + m: 1400544000, + n: 1405468800, + o: 1409011200, + p: 1412640000, + q: 1416268800, + r: 1421798400, + s: 1425513600, + t: 1429401600, + u: 1432080000, + v: 1437523200, + w: 1441152000, + Q: 1444780800, + y: 1449014400, + z: 1453248000, + WB: 1496707200, + BB: 1500940800, + GB: 1504569600, + DB: 1508198400, + EB: 1512518400, + CB: 1516752000, + AB: 1520294400, + T: 1523923200, + R: 1527552000, + N: 1532390400, + IB: 1536019200, + JB: 1539648000, + KB: 1543968000, + LB: 1548720000, + MB: 1552348800, + NB: 1555977600, + FB: 1559606400, + PB: 1564444800, + QB: 1568073600, + RB: 1571702400, + S: 1575936000, + UB: 1580860800, + M: 1586304000, + HB: 1589846400, + pB: null, + rB: null, + YB: null + } + }, + E: { + A: { + G: 0, + V: 0.004566, + I: 0.004656, + F: 0.004465, + E: 0.027936, + D: 0.009312, + A: 0.009312, + B: 0.027936, + C: 0.079152, + O: 1.15469, + P: 0, + ZB: 0, + SB: 0.008692, + bB: 0.158304, + cB: 0.00456, + dB: 0.004283, + eB: 0.041904, + TB: 0.074496, + U: 0.158304, + x: 0.297984, + iB: 2.29541, + jB: 0 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "ZB", "SB", "G", "V", "bB", "I", "cB", "F", "dB", "E", "D", "eB", "A", "TB", "B", "U", "C", "x", "O", "iB", "P", "jB", ""], + E: "Safari", + F: { + ZB: 1205798400, + SB: 1226534400, + G: 1244419200, + V: 1275868800, + bB: 1311120000, + I: 1343174400, + cB: 1382400000, + F: 1382400000, + dB: 1410998400, + E: 1413417600, + D: 1443657600, + eB: 1458518400, + A: 1474329600, + TB: 1490572800, + B: 1505779200, + U: 1522281600, + C: 1537142400, + x: 1553472000, + O: 1568851200, + iB: 1585008000, + P: null, + jB: null + } + }, + F: { + A: { + "0": 0.004827, + "1": 0.004707, + "2": 0.004707, + "3": 0.004326, + "4": 0.008922, + "5": 0.014349, + "6": 0.004725, + "7": 0.009312, + "8": 0.013968, + "9": 0.013968, + D: 0.0082, + B: 0.016581, + C: 0.004317, + H: 0.00685, + J: 0.00685, + K: 0.00685, + L: 0.005014, + W: 0.006015, + X: 0.004879, + Y: 0.006597, + Z: 0.006597, + a: 0.013434, + b: 0.006702, + c: 0.006015, + d: 0.005595, + e: 0.004393, + f: 0.008652, + g: 0.004879, + h: 0.004879, + i: 0.004656, + j: 0.005152, + k: 0.005014, + l: 0.009758, + m: 0.004879, + n: 0.009312, + o: 0.004283, + p: 0.004367, + q: 0.004534, + r: 0.004367, + s: 0.004227, + t: 0.004418, + u: 0.009042, + v: 0.004227, + w: 0.004725, + Q: 0.004417, + y: 0.008942, + z: 0.004707, + BB: 0.004403, + DB: 0.004532, + EB: 0.004566, + CB: 0.02283, + AB: 0.00867, + T: 0.004656, + R: 0.121056, + N: 0.875328, + kB: 0.00685, + lB: 0, + mB: 0.008392, + nB: 0.004706, + U: 0.006229, + VB: 0.004879, + PC: 0.008786, + x: 0.004656 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "D", "kB", "lB", "mB", "nB", "B", "U", "VB", "PC", "C", "x", "H", "J", "K", "L", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "Q", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "BB", "DB", "EB", "CB", "AB", "T", "R", "N", "", "", ""], + E: "Opera", + F: { + "0": 1510099200, + "1": 1515024000, + "2": 1517961600, + "3": 1521676800, + "4": 1525910400, + "5": 1530144000, + "6": 1534982400, + "7": 1537833600, + "8": 1543363200, + "9": 1548201600, + D: 1150761600, + kB: 1223424000, + lB: 1251763200, + mB: 1267488000, + nB: 1277942400, + B: 1292457600, + U: 1302566400, + VB: 1309219200, + PC: 1323129600, + C: 1323129600, + x: 1352073600, + H: 1372723200, + J: 1377561600, + K: 1381104000, + L: 1386288000, + W: 1390867200, + X: 1393891200, + Y: 1399334400, + Z: 1401753600, + a: 1405987200, + b: 1409616000, + c: 1413331200, + d: 1417132800, + e: 1422316800, + f: 1425945600, + g: 1430179200, + h: 1433808000, + i: 1438646400, + j: 1442448000, + k: 1445904000, + l: 1449100800, + m: 1454371200, + n: 1457308800, + o: 1462320000, + p: 1465344000, + q: 1470096000, + r: 1474329600, + s: 1477267200, + t: 1481587200, + u: 1486425600, + v: 1490054400, + w: 1494374400, + Q: 1498003200, + y: 1502236800, + z: 1506470400, + BB: 1554768000, + DB: 1561593600, + EB: 1566259200, + CB: 1570406400, + AB: 1573689600, + T: 1578441600, + R: 1583971200, + N: 1587513600 + }, + D: { + D: "o", + B: "o", + C: "o", + kB: "o", + lB: "o", + mB: "o", + nB: "o", + U: "o", + VB: "o", + PC: "o", + x: "o" + } + }, + G: { + A: { + E: 0, + SB: 0.001336, + qB: 0, + XB: 0.001336, + sB: 0.009352, + tB: 0.002672, + uB: 0.009352, + vB: 0.017368, + wB: 0.01336, + xB: 0.1336, + yB: 0.0334, + zB: 0.141616, + "0B": 0.1002, + "1B": 0.144288, + "2B": 0.215096, + "3B": 1.35738, + "4B": 0.289912, + "5B": 0.142952, + "6B": 4.80025, + "7B": 5.65262, + "8B": 0 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "SB", "qB", "XB", "sB", "tB", "uB", "E", "vB", "wB", "xB", "yB", "zB", "0B", "1B", "2B", "3B", "4B", "5B", "6B", "7B", "8B", "", ""], + E: "iOS Safari", + F: { + SB: 1270252800, + qB: 1283904000, + XB: 1299628800, + sB: 1331078400, + tB: 1359331200, + uB: 1394409600, + E: 1410912000, + vB: 1413763200, + wB: 1442361600, + xB: 1458518400, + yB: 1473724800, + zB: 1490572800, + "0B": 1505779200, + "1B": 1522281600, + "2B": 1537142400, + "3B": 1553472000, + "4B": 1568851200, + "5B": 1572220800, + "6B": 1580169600, + "7B": 1585008000, + "8B": null + } + }, + H: { + A: { + "9B": 0.7842 + }, + B: "o", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "9B", "", "", ""], + E: "Opera Mini", + F: { + "9B": 1426464000 + } + }, + I: { + A: { + OB: 0, + G: 0.00776071, + M: 0, + AC: 0, + BC: 0, + CC: 0.000646726, + DC: 0.0155214, + XB: 0.0265158, + EC: 0, + FC: 0.152627 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AC", "BC", "CC", "OB", "G", "DC", "XB", "EC", "FC", "M", "", "", ""], + E: "Android Browser", + F: { + AC: 1256515200, + BC: 1274313600, + CC: 1291593600, + OB: 1298332800, + G: 1318896000, + DC: 1341792000, + XB: 1374624000, + EC: 1386547200, + FC: 1401667200, + M: 1587427200 + } + }, + J: { + A: { + F: 0, + A: 0.005344 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "F", "A", "", "", ""], + E: "Blackberry Browser", + F: { + F: 1325376000, + A: 1359504000 + } + }, + K: { + A: { + A: 0, + B: 0, + C: 0, + Q: 0.0111391, + U: 0, + VB: 0, + x: 0 + }, + B: "o", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "A", "B", "U", "VB", "C", "x", "Q", "", "", ""], + E: "Opera Mobile", + F: { + A: 1287100800, + B: 1300752000, + U: 1314835200, + VB: 1318291200, + C: 1330300800, + x: 1349740800, + Q: 1474588800 + }, + D: { + Q: "webkit" + } + }, + L: { + A: { + M: 33.5902 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "M", "", "", ""], + E: "Chrome for Android", + F: { + M: 1587427200 + } + }, + M: { + A: { + N: 0.229792 + }, + B: "moz", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "N", "", "", ""], + E: "Firefox for Android", + F: { + N: 1567468800 + } + }, + N: { + A: { + A: 0.0115934, + B: 0.022664 + }, + B: "ms", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "A", "B", "", "", ""], + E: "IE Mobile", + F: { + A: 1340150400, + B: 1353456000 + } + }, + O: { + A: { + GC: 2.02538 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "GC", "", "", ""], + E: "UC Browser for Android", + F: { + GC: 1471392000 + }, + D: { + GC: "webkit" + } + }, + P: { + A: { + G: 0.282926, + HC: 0.0104787, + IC: 0.0104787, + JC: 0.08383, + KC: 0.0209575, + LC: 0.178139, + TB: 0.241011, + MC: 2.65112 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "G", "HC", "IC", "JC", "KC", "LC", "TB", "MC", "", "", ""], + E: "Samsung Internet", + F: { + G: 1461024000, + HC: 1481846400, + IC: 1509408000, + JC: 1528329600, + KC: 1546128000, + LC: 1554163200, + TB: 1567900800, + MC: 1582588800 + } + }, + Q: { + A: { + NC: 0.224448 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "NC", "", "", ""], + E: "QQ Browser", + F: { + NC: 1589846400 + } + }, + R: { + A: { + OC: 0 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "OC", "", "", ""], + E: "Baidu Browser", + F: { + OC: 1491004800 + } + }, + S: { + A: { + fB: 0.10688 + }, + B: "moz", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "fB", "", "", ""], + E: "KaiOS Browser", + F: { + fB: 1527811200 + } + } +}; + +},{}],82:[function(require,module,exports){ +"use strict"; + +module.exports = { + "0": "49", + "1": "50", + "2": "51", + "3": "52", + "4": "53", + "5": "54", + "6": "55", + "7": "56", + "8": "57", + "9": "58", + A: "10", + B: "11", + C: "12", + D: "9", + E: "8", + F: "7", + G: "4", + H: "15", + I: "6", + J: "16", + K: "17", + L: "18", + M: "81", + N: "68", + O: "13", + P: "14", + Q: "46", + R: "67", + S: "79", + T: "66", + U: "11.1", + V: "5", + W: "19", + X: "20", + Y: "21", + Z: "22", + a: "23", + b: "24", + c: "25", + d: "26", + e: "27", + f: "28", + g: "29", + h: "30", + i: "31", + j: "32", + k: "33", + l: "34", + m: "35", + n: "36", + o: "37", + p: "38", + q: "39", + r: "40", + s: "41", + t: "42", + u: "43", + v: "44", + w: "45", + x: "12.1", + y: "47", + z: "48", + AB: "65", + BB: "60", + CB: "64", + DB: "62", + EB: "63", + FB: "75", + GB: "61", + HB: "83", + IB: "69", + JB: "70", + KB: "71", + LB: "72", + MB: "73", + NB: "74", + OB: "3", + PB: "76", + QB: "77", + RB: "78", + SB: "3.2", + TB: "10.1", + UB: "80", + VB: "11.5", + WB: "59", + XB: "4.2-4.3", + YB: "86", + ZB: "3.1", + aB: "2", + bB: "5.1", + cB: "6.1", + dB: "7.1", + eB: "9.1", + fB: "2.5", + gB: "3.5", + hB: "5.5", + iB: "13.1", + jB: "TP", + kB: "9.5-9.6", + lB: "10.0-10.1", + mB: "10.5", + nB: "10.6", + oB: "3.6", + pB: "84", + qB: "4.0-4.1", + rB: "85", + sB: "5.0-5.1", + tB: "6.0-6.1", + uB: "7.0-7.1", + vB: "8.1-8.4", + wB: "9.0-9.2", + xB: "9.3", + yB: "10.0-10.2", + zB: "10.3", + "0B": "11.0-11.2", + "1B": "11.3-11.4", + "2B": "12.0-12.1", + "3B": "12.2-12.4", + "4B": "13.0-13.1", + "5B": "13.2", + "6B": "13.3", + "7B": "13.4-13.5", + "8B": "14.0", + "9B": "all", + AC: "2.1", + BC: "2.2", + CC: "2.3", + DC: "4.1", + EC: "4.4", + FC: "4.4.3-4.4.4", + GC: "12.12", + HC: "5.0-5.4", + IC: "6.2-6.4", + JC: "7.2-7.4", + KC: "8.2", + LC: "9.2", + MC: "11.1-11.2", + NC: "10.4", + OC: "7.12", + PC: "11.6" +}; + +},{}],83:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: "ie", + B: "edge", + C: "firefox", + D: "chrome", + E: "safari", + F: "opera", + G: "ios_saf", + H: "op_mini", + I: "android", + J: "bb", + K: "op_mob", + L: "and_chr", + M: "and_ff", + N: "ie_mob", + O: "and_uc", + P: "samsung", + Q: "and_qq", + R: "baidu", + S: "kaios" +}; + +},{}],84:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.agents = undefined; + +var _browsers = require('./browsers'); + +var _browserVersions = require('./browserVersions'); + +var agentsData = require('../../data/agents'); + +function unpackBrowserVersions(versionsData) { + return Object.keys(versionsData).reduce(function (usage, version) { + usage[_browserVersions.browserVersions[version]] = versionsData[version]; + return usage; + }, {}); +} + +var agents = exports.agents = Object.keys(agentsData).reduce(function (map, key) { + var versionsData = agentsData[key]; + map[_browsers.browsers[key]] = Object.keys(versionsData).reduce(function (data, entry) { + if (entry === 'A') { + data.usage_global = unpackBrowserVersions(versionsData[entry]); + } else if (entry === 'C') { + data.versions = versionsData[entry].reduce(function (list, version) { + if (version === '') { + list.push(null); + } else { + list.push(_browserVersions.browserVersions[version]); + } + + return list; + }, []); + } else if (entry === 'D') { + data.prefix_exceptions = unpackBrowserVersions(versionsData[entry]); + } else if (entry === 'E') { + data.browser = versionsData[entry]; + } else if (entry === 'F') { + data.release_date = Object.keys(versionsData[entry]).reduce(function (map, key) { + map[_browserVersions.browserVersions[key]] = versionsData[entry][key]; + return map; + }, {}); + } else { + // entry is B + data.prefix = versionsData[entry]; + } + + return data; + }, {}); + return map; +}, {}); + +},{"../../data/agents":81,"./browserVersions":85,"./browsers":86}],85:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var browserVersions = exports.browserVersions = require('../../data/browserVersions'); + +},{"../../data/browserVersions":82}],86:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var browsers = exports.browsers = require('../../data/browsers'); + +},{"../../data/browsers":83}],87:[function(require,module,exports){ +(function (Buffer){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +/* eslint-disable no-proto */ +'use strict'; + +var base64 = require('base64-js'); + +var ieee754 = require('ieee754'); + +exports.Buffer = Buffer; +exports.SlowBuffer = SlowBuffer; +exports.INSPECT_MAX_BYTES = 50; +var K_MAX_LENGTH = 0x7fffffff; +exports.kMaxLength = K_MAX_LENGTH; +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ + +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport(); + +if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && typeof console.error === 'function') { + console.error('This browser lacks typed array (Uint8Array) support which is required by ' + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'); +} + +function typedArraySupport() { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1); + arr.__proto__ = { + __proto__: Uint8Array.prototype, + foo: function foo() { + return 42; + } + }; + return arr.foo() === 42; + } catch (e) { + return false; + } +} + +Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, + get: function get() { + if (!Buffer.isBuffer(this)) return undefined; + return this.buffer; + } +}); +Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, + get: function get() { + if (!Buffer.isBuffer(this)) return undefined; + return this.byteOffset; + } +}); + +function createBuffer(length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"'); + } // Return an augmented `Uint8Array` instance + + + var buf = new Uint8Array(length); + buf.__proto__ = Buffer.prototype; + return buf; +} +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + + +function Buffer(arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new TypeError('The "string" argument must be of type string. Received type number'); + } + + return allocUnsafe(arg); + } + + return from(arg, encodingOrOffset, length); +} // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 + + +if (typeof Symbol !== 'undefined' && Symbol.species != null && Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }); +} + +Buffer.poolSize = 8192; // not used by this implementation + +function from(value, encodingOrOffset, length) { + if (typeof value === 'string') { + return fromString(value, encodingOrOffset); + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value); + } + + if (value == null) { + throw TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + 'or Array-like Object. Received type ' + typeof value); + } + + if (isInstance(value, ArrayBuffer) || value && isInstance(value.buffer, ArrayBuffer)) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + + if (typeof value === 'number') { + throw new TypeError('The "value" argument must not be of type number. Received type number'); + } + + var valueOf = value.valueOf && value.valueOf(); + + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length); + } + + var b = fromObject(value); + if (b) return b; + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length); + } + + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + 'or Array-like Object. Received type ' + typeof value); +} +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ + + +Buffer.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length); +}; // Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: +// https://github.com/feross/buffer/pull/148 + + +Buffer.prototype.__proto__ = Uint8Array.prototype; +Buffer.__proto__ = Uint8Array; + +function assertSize(size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be of type number'); + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"'); + } +} + +function alloc(size, fill, encoding) { + assertSize(size); + + if (size <= 0) { + return createBuffer(size); + } + + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill); + } + + return createBuffer(size); +} +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ + + +Buffer.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding); +}; + +function allocUnsafe(size) { + assertSize(size); + return createBuffer(size < 0 ? 0 : checked(size) | 0); +} +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ + + +Buffer.allocUnsafe = function (size) { + return allocUnsafe(size); +}; +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ + + +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(size); +}; + +function fromString(string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8'; + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding); + } + + var length = byteLength(string, encoding) | 0; + var buf = createBuffer(length); + var actual = buf.write(string, encoding); + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual); + } + + return buf; +} + +function fromArrayLike(array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0; + var buf = createBuffer(length); + + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255; + } + + return buf; +} + +function fromArrayBuffer(array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds'); + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds'); + } + + var buf; + + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array); + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset); + } else { + buf = new Uint8Array(array, byteOffset, length); + } // Return an augmented `Uint8Array` instance + + + buf.__proto__ = Buffer.prototype; + return buf; +} + +function fromObject(obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0; + var buf = createBuffer(len); + + if (buf.length === 0) { + return buf; + } + + obj.copy(buf, 0, 0, len); + return buf; + } + + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0); + } + + return fromArrayLike(obj); + } + + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data); + } +} + +function checked(length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes'); + } + + return length | 0; +} + +function SlowBuffer(length) { + if (+length != length) { + // eslint-disable-line eqeqeq + length = 0; + } + + return Buffer.alloc(+length); +} + +Buffer.isBuffer = function isBuffer(b) { + return b != null && b._isBuffer === true && b !== Buffer.prototype; // so Buffer.isBuffer(Buffer.prototype) will be false +}; + +Buffer.compare = function compare(a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength); + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength); + + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'); + } + + if (a === b) return 0; + var x = a.length; + var y = b.length; + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break; + } + } + + if (x < y) return -1; + if (y < x) return 1; + return 0; +}; + +Buffer.isEncoding = function isEncoding(encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true; + + default: + return false; + } +}; + +Buffer.concat = function concat(list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } + + if (list.length === 0) { + return Buffer.alloc(0); + } + + var i; + + if (length === undefined) { + length = 0; + + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + + var buffer = Buffer.allocUnsafe(length); + var pos = 0; + + for (i = 0; i < list.length; ++i) { + var buf = list[i]; + + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf); + } + + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } + + buf.copy(buffer, pos); + pos += buf.length; + } + + return buffer; +}; + +function byteLength(string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length; + } + + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength; + } + + if (typeof string !== 'string') { + throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + 'Received type ' + typeof string); + } + + var len = string.length; + var mustMatch = arguments.length > 2 && arguments[2] === true; + if (!mustMatch && len === 0) return 0; // Use a for loop to avoid recursion + + var loweredCase = false; + + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len; + + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length; + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2; + + case 'hex': + return len >>> 1; + + case 'base64': + return base64ToBytes(string).length; + + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length; // assume utf8 + } + + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } +} + +Buffer.byteLength = byteLength; + +function slowToString(encoding, start, end) { + var loweredCase = false; // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + + if (start === undefined || start < 0) { + start = 0; + } // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + + + if (start > this.length) { + return ''; + } + + if (end === undefined || end > this.length) { + end = this.length; + } + + if (end <= 0) { + return ''; + } // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + + + end >>>= 0; + start >>>= 0; + + if (end <= start) { + return ''; + } + + if (!encoding) encoding = 'utf8'; + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end); + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end); + + case 'ascii': + return asciiSlice(this, start, end); + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end); + + case 'base64': + return base64Slice(this, start, end); + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end); + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding); + encoding = (encoding + '').toLowerCase(); + loweredCase = true; + } + } +} // This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) +// to detect a Buffer instance. It's not possible to use `instanceof Buffer` +// reliably in a browserify context because there could be multiple different +// copies of the 'buffer' package in use. This method works even for Buffer +// instances that were created from another copy of the `buffer` package. +// See: https://github.com/feross/buffer/issues/154 + + +Buffer.prototype._isBuffer = true; + +function swap(b, n, m) { + var i = b[n]; + b[n] = b[m]; + b[m] = i; +} + +Buffer.prototype.swap16 = function swap16() { + var len = this.length; + + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits'); + } + + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1); + } + + return this; +}; + +Buffer.prototype.swap32 = function swap32() { + var len = this.length; + + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits'); + } + + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3); + swap(this, i + 1, i + 2); + } + + return this; +}; + +Buffer.prototype.swap64 = function swap64() { + var len = this.length; + + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits'); + } + + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7); + swap(this, i + 1, i + 6); + swap(this, i + 2, i + 5); + swap(this, i + 3, i + 4); + } + + return this; +}; + +Buffer.prototype.toString = function toString() { + var length = this.length; + if (length === 0) return ''; + if (arguments.length === 0) return utf8Slice(this, 0, length); + return slowToString.apply(this, arguments); +}; + +Buffer.prototype.toLocaleString = Buffer.prototype.toString; + +Buffer.prototype.equals = function equals(b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer'); + if (this === b) return true; + return Buffer.compare(this, b) === 0; +}; + +Buffer.prototype.inspect = function inspect() { + var str = ''; + var max = exports.INSPECT_MAX_BYTES; + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim(); + if (this.length > max) str += ' ... '; + return ''; +}; + +Buffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength); + } + + if (!Buffer.isBuffer(target)) { + throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. ' + 'Received type ' + typeof target); + } + + if (start === undefined) { + start = 0; + } + + if (end === undefined) { + end = target ? target.length : 0; + } + + if (thisStart === undefined) { + thisStart = 0; + } + + if (thisEnd === undefined) { + thisEnd = this.length; + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index'); + } + + if (thisStart >= thisEnd && start >= end) { + return 0; + } + + if (thisStart >= thisEnd) { + return -1; + } + + if (start >= end) { + return 1; + } + + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + if (this === target) return 0; + var x = thisEnd - thisStart; + var y = end - start; + var len = Math.min(x, y); + var thisCopy = this.slice(thisStart, thisEnd); + var targetCopy = target.slice(start, end); + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break; + } + } + + if (x < y) return -1; + if (y < x) return 1; + return 0; +}; // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf + + +function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1; // Normalize byteOffset + + if (typeof byteOffset === 'string') { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000; + } + + byteOffset = +byteOffset; // Coerce to Number. + + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : buffer.length - 1; + } // Normalize byteOffset: negative offsets start from the end of the buffer + + + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + + if (byteOffset >= buffer.length) { + if (dir) return -1;else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0;else return -1; + } // Normalize val + + + if (typeof val === 'string') { + val = Buffer.from(val, encoding); + } // Finally, search either indexOf (if dir is true) or lastIndexOf + + + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1; + } + + return arrayIndexOf(buffer, val, byteOffset, encoding, dir); + } else if (typeof val === 'number') { + val = val & 0xFF; // Search for a byte value [0-255] + + if (typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset); + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset); + } + } + + return arrayIndexOf(buffer, [val], byteOffset, encoding, dir); + } + + throw new TypeError('val must be string, number or Buffer'); +} + +function arrayIndexOf(arr, val, byteOffset, encoding, dir) { + var indexSize = 1; + var arrLength = arr.length; + var valLength = val.length; + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase(); + + if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1; + } + + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + + function read(buf, i) { + if (indexSize === 1) { + return buf[i]; + } else { + return buf.readUInt16BE(i * indexSize); + } + } + + var i; + + if (dir) { + var foundIndex = -1; + + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize; + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + + for (i = byteOffset; i >= 0; i--) { + var found = true; + + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break; + } + } + + if (found) return i; + } + } + + return -1; +} + +Buffer.prototype.includes = function includes(val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1; +}; + +Buffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true); +}; + +Buffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false); +}; + +function hexWrite(buf, string, offset, length) { + offset = Number(offset) || 0; + var remaining = buf.length - offset; + + if (!length) { + length = remaining; + } else { + length = Number(length); + + if (length > remaining) { + length = remaining; + } + } + + var strLen = string.length; + + if (length > strLen / 2) { + length = strLen / 2; + } + + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16); + if (numberIsNaN(parsed)) return i; + buf[offset + i] = parsed; + } + + return i; +} + +function utf8Write(buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length); +} + +function asciiWrite(buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length); +} + +function latin1Write(buf, string, offset, length) { + return asciiWrite(buf, string, offset, length); +} + +function base64Write(buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length); +} + +function ucs2Write(buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length); +} + +Buffer.prototype.write = function write(string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8'; + length = this.length; + offset = 0; // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset; + length = this.length; + offset = 0; // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0; + + if (isFinite(length)) { + length = length >>> 0; + if (encoding === undefined) encoding = 'utf8'; + } else { + encoding = length; + length = undefined; + } + } else { + throw new Error('Buffer.write(string, encoding, offset[, length]) is no longer supported'); + } + + var remaining = this.length - offset; + if (length === undefined || length > remaining) length = remaining; + + if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds'); + } + + if (!encoding) encoding = 'utf8'; + var loweredCase = false; + + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length); + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length); + + case 'ascii': + return asciiWrite(this, string, offset, length); + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length); + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length); + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length); + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding); + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } +}; + +Buffer.prototype.toJSON = function toJSON() { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + }; +}; + +function base64Slice(buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf); + } else { + return base64.fromByteArray(buf.slice(start, end)); + } +} + +function utf8Slice(buf, start, end) { + end = Math.min(buf.length, end); + var res = []; + var i = start; + + while (i < end) { + var firstByte = buf[i]; + var codePoint = null; + var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1; + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint; + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte; + } + + break; + + case 2: + secondByte = buf[i + 1]; + + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F; + + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint; + } + } + + break; + + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F; + + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint; + } + } + + break; + + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F; + + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint; + } + } + + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD; + bytesPerSequence = 1; + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000; + res.push(codePoint >>> 10 & 0x3FF | 0xD800); + codePoint = 0xDC00 | codePoint & 0x3FF; + } + + res.push(codePoint); + i += bytesPerSequence; + } + + return decodeCodePointsArray(res); +} // Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety + + +var MAX_ARGUMENTS_LENGTH = 0x1000; + +function decodeCodePointsArray(codePoints) { + var len = codePoints.length; + + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints); // avoid extra slice() + } // Decode in chunks to avoid "call stack size exceeded". + + + var res = ''; + var i = 0; + + while (i < len) { + res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)); + } + + return res; +} + +function asciiSlice(buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F); + } + + return ret; +} + +function latin1Slice(buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + + return ret; +} + +function hexSlice(buf, start, end) { + var len = buf.length; + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + var out = ''; + + for (var i = start; i < end; ++i) { + out += toHex(buf[i]); + } + + return out; +} + +function utf16leSlice(buf, start, end) { + var bytes = buf.slice(start, end); + var res = ''; + + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + + return res; +} + +Buffer.prototype.slice = function slice(start, end) { + var len = this.length; + start = ~~start; + end = end === undefined ? len : ~~end; + + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + + if (end < start) end = start; + var newBuf = this.subarray(start, end); // Return an augmented `Uint8Array` instance + + newBuf.__proto__ = Buffer.prototype; + return newBuf; +}; +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ + + +function checkOffset(offset, ext, length) { + if (offset % 1 !== 0 || offset < 0) throw new RangeError('offset is not uint'); + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length'); +} + +Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + var val = this[offset]; + var mul = 1; + var i = 0; + + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + + return val; +}; + +Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + + if (!noAssert) { + checkOffset(offset, byteLength, this.length); + } + + var val = this[offset + --byteLength]; + var mul = 1; + + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul; + } + + return val; +}; + +Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + return this[offset]; +}; + +Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] | this[offset + 1] << 8; +}; + +Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] << 8 | this[offset + 1]; +}; + +Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000; +}; + +Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]); +}; + +Buffer.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + var val = this[offset]; + var mul = 1; + var i = 0; + + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + + mul *= 0x80; + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + return val; +}; + +Buffer.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) { + offset = offset >>> 0; + byteLength = byteLength >>> 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + var i = byteLength; + var mul = 1; + var val = this[offset + --i]; + + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul; + } + + mul *= 0x80; + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + return val; +}; + +Buffer.prototype.readInt8 = function readInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + if (!(this[offset] & 0x80)) return this[offset]; + return (0xff - this[offset] + 1) * -1; +}; + +Buffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset] | this[offset + 1] << 8; + return val & 0x8000 ? val | 0xFFFF0000 : val; +}; + +Buffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset + 1] | this[offset] << 8; + return val & 0x8000 ? val | 0xFFFF0000 : val; +}; + +Buffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24; +}; + +Buffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]; +}; + +Buffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, true, 23, 4); +}; + +Buffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, false, 23, 4); +}; + +Buffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, true, 52, 8); +}; + +Buffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, false, 52, 8); +}; + +function checkInt(buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance'); + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds'); + if (offset + ext > buf.length) throw new RangeError('Index out of range'); +} + +Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength = byteLength >>> 0; + + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var mul = 1; + var i = 0; + this[offset] = value & 0xFF; + + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = value / mul & 0xFF; + } + + return offset + byteLength; +}; + +Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength = byteLength >>> 0; + + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var i = byteLength - 1; + var mul = 1; + this[offset + i] = value & 0xFF; + + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = value / mul & 0xFF; + } + + return offset + byteLength; +}; + +Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); + this[offset] = value & 0xff; + return offset + 1; +}; + +Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + this[offset] = value & 0xff; + this[offset + 1] = value >>> 8; + return offset + 2; +}; + +Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + this[offset] = value >>> 8; + this[offset + 1] = value & 0xff; + return offset + 2; +}; + +Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + this[offset + 3] = value >>> 24; + this[offset + 2] = value >>> 16; + this[offset + 1] = value >>> 8; + this[offset] = value & 0xff; + return offset + 4; +}; + +Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 0xff; + return offset + 4; +}; + +Buffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = 0; + var mul = 1; + var sub = 0; + this[offset] = value & 0xFF; + + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + + this[offset + i] = (value / mul >> 0) - sub & 0xFF; + } + + return offset + byteLength; +}; + +Buffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) { + value = +value; + offset = offset >>> 0; + + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = byteLength - 1; + var mul = 1; + var sub = 0; + this[offset + i] = value & 0xFF; + + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + + this[offset + i] = (value / mul >> 0) - sub & 0xFF; + } + + return offset + byteLength; +}; + +Buffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80); + if (value < 0) value = 0xff + value + 1; + this[offset] = value & 0xff; + return offset + 1; +}; + +Buffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + this[offset] = value & 0xff; + this[offset + 1] = value >>> 8; + return offset + 2; +}; + +Buffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + this[offset] = value >>> 8; + this[offset + 1] = value & 0xff; + return offset + 2; +}; + +Buffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + this[offset] = value & 0xff; + this[offset + 1] = value >>> 8; + this[offset + 2] = value >>> 16; + this[offset + 3] = value >>> 24; + return offset + 4; +}; + +Buffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (value < 0) value = 0xffffffff + value + 1; + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 0xff; + return offset + 4; +}; + +function checkIEEE754(buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range'); + if (offset < 0) throw new RangeError('Index out of range'); +} + +function writeFloat(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38); + } + + ieee754.write(buf, value, offset, littleEndian, 23, 4); + return offset + 4; +} + +Buffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert); +}; + +Buffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert); +}; + +function writeDouble(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308); + } + + ieee754.write(buf, value, offset, littleEndian, 52, 8); + return offset + 8; +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert); +}; + +Buffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert); +}; // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) + + +Buffer.prototype.copy = function copy(target, targetStart, start, end) { + if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer'); + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; // Copy 0 bytes; we're done + + if (end === start) return 0; + if (target.length === 0 || this.length === 0) return 0; // Fatal error conditions + + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds'); + } + + if (start < 0 || start >= this.length) throw new RangeError('Index out of range'); + if (end < 0) throw new RangeError('sourceEnd out of bounds'); // Are we oob? + + if (end > this.length) end = this.length; + + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + + var len = end - start; + + if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end); + } else if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start]; + } + } else { + Uint8Array.prototype.set.call(target, this.subarray(start, end), targetStart); + } + + return len; +}; // Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) + + +Buffer.prototype.fill = function fill(val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === 'string') { + encoding = end; + end = this.length; + } + + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string'); + } + + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding); + } + + if (val.length === 1) { + var code = val.charCodeAt(0); + + if (encoding === 'utf8' && code < 128 || encoding === 'latin1') { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code; + } + } + } else if (typeof val === 'number') { + val = val & 255; + } // Invalid ranges are not set to a default, so can range check early. + + + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index'); + } + + if (end <= start) { + return this; + } + + start = start >>> 0; + end = end === undefined ? this.length : end >>> 0; + if (!val) val = 0; + var i; + + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + var bytes = Buffer.isBuffer(val) ? val : Buffer.from(val, encoding); + var len = bytes.length; + + if (len === 0) { + throw new TypeError('The value "' + val + '" is invalid for argument "value"'); + } + + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + + return this; +}; // HELPER FUNCTIONS +// ================ + + +var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; + +function base64clean(str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split('=')[0]; // Node strips out invalid characters like \n and \t from the string, base64-js does not + + str = str.trim().replace(INVALID_BASE64_RE, ''); // Node converts strings with length < 2 to '' + + if (str.length < 2) return ''; // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + + while (str.length % 4 !== 0) { + str = str + '='; + } + + return str; +} + +function toHex(n) { + if (n < 16) return '0' + n.toString(16); + return n.toString(16); +} + +function utf8ToBytes(string, units) { + units = units || Infinity; + var codePoint; + var length = string.length; + var leadSurrogate = null; + var bytes = []; + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); // is surrogate component + + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue; + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue; + } // valid lead + + + leadSurrogate = codePoint; + continue; + } // 2 leads in a row + + + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + leadSurrogate = codePoint; + continue; + } // valid surrogate pair + + + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + } + + leadSurrogate = null; // encode utf8 + + if (codePoint < 0x80) { + if ((units -= 1) < 0) break; + bytes.push(codePoint); + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break; + bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80); + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break; + bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80); + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break; + bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80); + } else { + throw new Error('Invalid code point'); + } + } + + return bytes; +} + +function asciiToBytes(str) { + var byteArray = []; + + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF); + } + + return byteArray; +} + +function utf16leToBytes(str, units) { + var c, hi, lo; + var byteArray = []; + + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break; + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + + return byteArray; +} + +function base64ToBytes(str) { + return base64.toByteArray(base64clean(str)); +} + +function blitBuffer(src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if (i + offset >= dst.length || i >= src.length) break; + dst[i + offset] = src[i]; + } + + return i; +} // ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 + + +function isInstance(obj, type) { + return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name; +} + +function numberIsNaN(obj) { + // For IE11 support + return obj !== obj; // eslint-disable-line no-self-compare +} + +}).call(this,require("buffer").Buffer) +},{"base64-js":76,"buffer":87,"ieee754":640}],88:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + I: 0.00597493, + D: 0.00597493, + F: 0.0657242, + E: 0.238997, + A: 0.0179248, + B: 1.38021, + iB: 0.009298 + }, + B: "ms", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "iB", "I", "D", "F", "E", "A", "B", "", "", ""], + E: "IE", + F: { + iB: 962323200, + I: 998870400, + D: 1161129600, + F: 1237420800, + E: 1300060800, + A: 1346716800, + B: 1381968000 + } + }, + B: { + A: { + C: 0.009422, + O: 0.009422, + H: 0.014133, + Q: 0.009422, + J: 0.028266, + K: 0.089509, + L: 1.48868, + V: 0, + y: 0.004711, + M: 0.051821, + WB: 1.04113, + S: 0 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "C", "O", "H", "Q", "J", "K", "L", "V", "y", "M", "WB", "S", "", "", ""], + E: "Edge", + F: { + C: 1438128000, + O: 1447286400, + H: 1470096000, + Q: 1491868800, + J: 1508198400, + K: 1525046400, + L: 1542067200, + V: 1579046400, + y: 1581033600, + M: 1586736000, + WB: 1590019200, + S: 1594857600 + }, + D: { + C: "ms", + O: "ms", + H: "ms", + Q: "ms", + J: "ms", + K: "ms", + L: "ms" + } + }, + C: { + A: { + "0": 0.018844, + "1": 0.004538, + "2": 0.004711, + "3": 0.004711, + "4": 0.108353, + "5": 0.004335, + "6": 0.004711, + "7": 0.004711, + "8": 0.018844, + "9": 0.009422, + sB: 0.004827, + KB: 0.004538, + G: 0.014133, + W: 0.004879, + I: 0.020136, + D: 0.005725, + F: 0.004525, + E: 0.00533, + A: 0.004283, + B: 0.004711, + C: 0.004471, + O: 0.004486, + H: 0.00453, + Q: 0.004465, + J: 0.004417, + K: 0.008922, + L: 0.004393, + X: 0.004443, + Y: 0.004283, + Z: 0.013596, + a: 0.013698, + b: 0.013614, + c: 0.008786, + d: 0.004403, + e: 0.004317, + f: 0.004393, + g: 0.004418, + h: 0.008834, + i: 0.004403, + j: 0.008928, + k: 0.004471, + l: 0.009422, + m: 0.004707, + n: 0.009076, + o: 0.004465, + p: 0.004783, + q: 0.004711, + r: 0.004783, + s: 0.00487, + t: 0.005029, + u: 0.0047, + v: 0.037688, + w: 0.004711, + x: 0.009422, + P: 0.004525, + z: 0.009422, + AB: 0.004711, + LB: 0.004711, + CB: 0.018844, + JB: 0.004711, + EB: 0.004711, + FB: 0.028266, + GB: 0.018844, + HB: 0.023555, + DB: 0.023555, + U: 0.009422, + N: 0.136619, + T: 0.009422, + MB: 0.009422, + NB: 0.009422, + OB: 0.032977, + PB: 0.014133, + QB: 0.037688, + RB: 0.04711, + SB: 0.678384, + TB: 2.4827, + UB: 0.051821, + V: 0, + y: 0, + M: 0, + pB: 0.008786, + hB: 0.00487 + }, + B: "moz", + C: ["sB", "KB", "pB", "hB", "G", "W", "I", "D", "F", "E", "A", "B", "C", "O", "H", "Q", "J", "K", "L", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "P", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "AB", "LB", "CB", "JB", "EB", "FB", "GB", "HB", "DB", "U", "N", "T", "MB", "NB", "OB", "PB", "QB", "RB", "SB", "TB", "UB", "V", "y", "M", ""], + E: "Firefox", + F: { + "0": 1470096000, + "1": 1474329600, + "2": 1479168000, + "3": 1485216000, + "4": 1488844800, + "5": 1492560000, + "6": 1497312000, + "7": 1502150400, + "8": 1506556800, + "9": 1510617600, + sB: 1161648000, + KB: 1213660800, + pB: 1246320000, + hB: 1264032000, + G: 1300752000, + W: 1308614400, + I: 1313452800, + D: 1317081600, + F: 1317081600, + E: 1320710400, + A: 1324339200, + B: 1327968000, + C: 1331596800, + O: 1335225600, + H: 1338854400, + Q: 1342483200, + J: 1346112000, + K: 1349740800, + L: 1353628800, + X: 1357603200, + Y: 1361232000, + Z: 1364860800, + a: 1368489600, + b: 1372118400, + c: 1375747200, + d: 1379376000, + e: 1386633600, + f: 1391472000, + g: 1395100800, + h: 1398729600, + i: 1402358400, + j: 1405987200, + k: 1409616000, + l: 1413244800, + m: 1417392000, + n: 1421107200, + o: 1424736000, + p: 1428278400, + q: 1431475200, + r: 1435881600, + s: 1439251200, + t: 1442880000, + u: 1446508800, + v: 1450137600, + w: 1453852800, + x: 1457395200, + P: 1461628800, + z: 1465257600, + AB: 1516665600, + LB: 1520985600, + CB: 1525824000, + JB: 1529971200, + EB: 1536105600, + FB: 1540252800, + GB: 1544486400, + HB: 1548720000, + DB: 1552953600, + U: 1558396800, + N: 1562630400, + T: 1567468800, + MB: 1571788800, + NB: 1575331200, + OB: 1578355200, + PB: 1581379200, + QB: 1583798400, + RB: 1586304000, + SB: 1588636800, + TB: 1591056000, + UB: 1593475200, + V: 1595894400, + y: null, + M: null + } + }, + D: { + A: { + "0": 0.023555, + "1": 0.325059, + "2": 0.004711, + "3": 0.009422, + "4": 0.004711, + "5": 0.042399, + "6": 0.018844, + "7": 0.018844, + "8": 0.023555, + "9": 0.023555, + G: 0.004706, + W: 0.004879, + I: 0.004879, + D: 0.005591, + F: 0.005591, + E: 0.005591, + A: 0.004534, + B: 0.004464, + C: 0.010424, + O: 0.009422, + H: 0.004706, + Q: 0.015087, + J: 0.004393, + K: 0.004393, + L: 0.008652, + X: 0.004418, + Y: 0.004393, + Z: 0.004317, + a: 0.014133, + b: 0.008786, + c: 0.004538, + d: 0.004461, + e: 0.004711, + f: 0.004326, + g: 0.0047, + h: 0.004538, + i: 0.004335, + j: 0.009422, + k: 0.004566, + l: 0.009422, + m: 0.009422, + n: 0.004335, + o: 0.004335, + p: 0.004464, + q: 0.028266, + r: 0.004464, + s: 0.014133, + t: 0.04711, + u: 0.004403, + v: 0.014133, + w: 0.004465, + x: 0.004711, + P: 0.004538, + z: 0.009422, + AB: 0.028266, + LB: 0.009422, + CB: 0.009422, + JB: 0.037688, + EB: 0.018844, + FB: 0.051821, + GB: 0.018844, + HB: 0.042399, + DB: 0.028266, + U: 0.056532, + N: 0.023555, + T: 0.084798, + MB: 0.146041, + NB: 0.169596, + OB: 0.169596, + PB: 0.108353, + QB: 0.127197, + RB: 0.098931, + SB: 0.117775, + TB: 0.09422, + UB: 0.146041, + V: 0.249683, + y: 0.51821, + M: 1.36148, + WB: 27.3379, + S: 0.056532, + gB: 0.032977, + bB: 0, + aB: 0 + }, + B: "webkit", + C: ["G", "W", "I", "D", "F", "E", "A", "B", "C", "O", "H", "Q", "J", "K", "L", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "P", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "AB", "LB", "CB", "JB", "EB", "FB", "GB", "HB", "DB", "U", "N", "T", "MB", "NB", "OB", "PB", "QB", "RB", "SB", "TB", "UB", "V", "y", "M", "WB", "S", "gB", "bB", "aB"], + E: "Chrome", + F: { + "0": 1453248000, + "1": 1456963200, + "2": 1460592000, + "3": 1464134400, + "4": 1469059200, + "5": 1472601600, + "6": 1476230400, + "7": 1480550400, + "8": 1485302400, + "9": 1489017600, + G: 1264377600, + W: 1274745600, + I: 1283385600, + D: 1287619200, + F: 1291248000, + E: 1296777600, + A: 1299542400, + B: 1303862400, + C: 1307404800, + O: 1312243200, + H: 1316131200, + Q: 1316131200, + J: 1319500800, + K: 1323734400, + L: 1328659200, + X: 1332892800, + Y: 1337040000, + Z: 1340668800, + a: 1343692800, + b: 1348531200, + c: 1352246400, + d: 1357862400, + e: 1361404800, + f: 1364428800, + g: 1369094400, + h: 1374105600, + i: 1376956800, + j: 1384214400, + k: 1389657600, + l: 1392940800, + m: 1397001600, + n: 1400544000, + o: 1405468800, + p: 1409011200, + q: 1412640000, + r: 1416268800, + s: 1421798400, + t: 1425513600, + u: 1429401600, + v: 1432080000, + w: 1437523200, + x: 1441152000, + P: 1444780800, + z: 1449014400, + AB: 1492560000, + LB: 1496707200, + CB: 1500940800, + JB: 1504569600, + EB: 1508198400, + FB: 1512518400, + GB: 1516752000, + HB: 1520294400, + DB: 1523923200, + U: 1527552000, + N: 1532390400, + T: 1536019200, + MB: 1539648000, + NB: 1543968000, + OB: 1548720000, + PB: 1552348800, + QB: 1555977600, + RB: 1559606400, + SB: 1564444800, + TB: 1568073600, + UB: 1571702400, + V: 1575936000, + y: 1580860800, + M: 1586304000, + WB: 1589846400, + S: 1594684800, + gB: null, + bB: null, + aB: null + } + }, + E: { + A: { + G: 0, + W: 0.004566, + I: 0.004656, + D: 0.004465, + F: 0.014133, + E: 0.004711, + A: 0.009422, + B: 0.023555, + C: 0.065954, + O: 0.537054, + H: 0, + "0B": 0, + YB: 0.008692, + cB: 0.160174, + dB: 0.00456, + eB: 0.004283, + fB: 0.037688, + XB: 0.056532, + R: 0.131908, + BB: 0.244972, + jB: 2.79362, + kB: 0 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "0B", "YB", "G", "W", "cB", "I", "dB", "D", "eB", "F", "E", "fB", "A", "XB", "B", "R", "C", "BB", "O", "jB", "H", "kB", ""], + E: "Safari", + F: { + "0B": 1205798400, + YB: 1226534400, + G: 1244419200, + W: 1275868800, + cB: 1311120000, + I: 1343174400, + dB: 1382400000, + D: 1382400000, + eB: 1410998400, + F: 1413417600, + E: 1443657600, + fB: 1458518400, + A: 1474329600, + XB: 1490572800, + B: 1505779200, + R: 1522281600, + C: 1537142400, + BB: 1553472000, + O: 1568851200, + jB: 1585008000, + H: null, + kB: null + } + }, + F: { + A: { + "0": 0.004707, + "1": 0.004827, + "2": 0.004707, + "3": 0.004707, + "4": 0.004326, + "5": 0.008922, + "6": 0.014349, + "7": 0.004725, + "8": 0.004711, + "9": 0.009422, + E: 0.0082, + B: 0.016581, + C: 0.004317, + Q: 0.00685, + J: 0.00685, + K: 0.00685, + L: 0.005014, + X: 0.006015, + Y: 0.004879, + Z: 0.006597, + a: 0.006597, + b: 0.013434, + c: 0.006702, + d: 0.006015, + e: 0.005595, + f: 0.004393, + g: 0.008652, + h: 0.004879, + i: 0.004879, + j: 0.004711, + k: 0.005152, + l: 0.005014, + m: 0.009758, + n: 0.004879, + o: 0.009422, + p: 0.004283, + q: 0.004367, + r: 0.004534, + s: 0.004367, + t: 0.004227, + u: 0.004418, + v: 0.009042, + w: 0.004227, + x: 0.004725, + P: 0.004417, + z: 0.008942, + AB: 0.009422, + CB: 0.004403, + EB: 0.004532, + FB: 0.004566, + GB: 0.02283, + HB: 0.00867, + DB: 0.004656, + U: 0.009422, + N: 0.984599, + T: 0.014133, + lB: 0.00685, + mB: 0, + nB: 0.008392, + oB: 0.004706, + R: 0.006229, + VB: 0.004879, + qB: 0.008786, + BB: 0.004711 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "E", "lB", "mB", "nB", "oB", "B", "R", "VB", "qB", "C", "BB", "Q", "J", "K", "L", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "P", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "AB", "CB", "EB", "FB", "GB", "HB", "DB", "U", "N", "T", "", "", ""], + E: "Opera", + F: { + "0": 1506470400, + "1": 1510099200, + "2": 1515024000, + "3": 1517961600, + "4": 1521676800, + "5": 1525910400, + "6": 1530144000, + "7": 1534982400, + "8": 1537833600, + "9": 1543363200, + E: 1150761600, + lB: 1223424000, + mB: 1251763200, + nB: 1267488000, + oB: 1277942400, + B: 1292457600, + R: 1302566400, + VB: 1309219200, + qB: 1323129600, + C: 1323129600, + BB: 1352073600, + Q: 1372723200, + J: 1377561600, + K: 1381104000, + L: 1386288000, + X: 1390867200, + Y: 1393891200, + Z: 1399334400, + a: 1401753600, + b: 1405987200, + c: 1409616000, + d: 1413331200, + e: 1417132800, + f: 1422316800, + g: 1425945600, + h: 1430179200, + i: 1433808000, + j: 1438646400, + k: 1442448000, + l: 1445904000, + m: 1449100800, + n: 1454371200, + o: 1457308800, + p: 1462320000, + q: 1465344000, + r: 1470096000, + s: 1474329600, + t: 1477267200, + u: 1481587200, + v: 1486425600, + w: 1490054400, + x: 1494374400, + P: 1498003200, + z: 1502236800, + AB: 1548201600, + CB: 1554768000, + EB: 1561593600, + FB: 1566259200, + GB: 1570406400, + HB: 1573689600, + DB: 1578441600, + U: 1583971200, + N: 1587513600, + T: 1592956800 + }, + D: { + E: "o", + B: "o", + C: "o", + lB: "o", + mB: "o", + nB: "o", + oB: "o", + R: "o", + VB: "o", + qB: "o", + BB: "o" + } + }, + G: { + A: { + F: 0, + YB: 0.00359111, + rB: 0.00179556, + IB: 0, + tB: 0.00897778, + uB: 0.00179556, + vB: 0.0125689, + wB: 0.01616, + xB: 0.01616, + yB: 0.166987, + zB: 0.0466845, + ZB: 0.175965, + "1B": 0.114916, + "2B": 0.188533, + "3B": 0.265742, + "4B": 1.5765, + "5B": 0.332178, + "6B": 0.159805, + "7B": 2.30549, + "8B": 6.76027, + "9B": 0 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YB", "rB", "IB", "tB", "uB", "vB", "F", "wB", "xB", "yB", "zB", "ZB", "1B", "2B", "3B", "4B", "5B", "6B", "7B", "8B", "9B", "", ""], + E: "iOS Safari", + F: { + YB: 1270252800, + rB: 1283904000, + IB: 1299628800, + tB: 1331078400, + uB: 1359331200, + vB: 1394409600, + F: 1410912000, + wB: 1413763200, + xB: 1442361600, + yB: 1458518400, + zB: 1473724800, + ZB: 1490572800, + "1B": 1505779200, + "2B": 1522281600, + "3B": 1537142400, + "4B": 1553472000, + "5B": 1568851200, + "6B": 1572220800, + "7B": 1580169600, + "8B": 1585008000, + "9B": null + } + }, + H: { + A: { + AC: 0.801165 + }, + B: "o", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AC", "", "", ""], + E: "Opera Mini", + F: { + AC: 1426464000 + } + }, + I: { + A: { + KB: 0, + G: 0.00721227, + M: 0, + BC: 0, + CC: 0, + DC: 0.000601023, + EC: 0.0144245, + IB: 0.0246419, + FC: 0, + GC: 0.138235 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "BC", "CC", "DC", "KB", "G", "EC", "IB", "FC", "GC", "M", "", "", ""], + E: "Android Browser", + F: { + BC: 1256515200, + CC: 1274313600, + DC: 1291593600, + KB: 1298332800, + G: 1318896000, + EC: 1341792000, + IB: 1374624000, + FC: 1386547200, + GC: 1401667200, + M: 1587427200 + } + }, + J: { + A: { + D: 0, + A: 0.005289 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "D", "A", "", "", ""], + E: "Blackberry Browser", + F: { + D: 1325376000, + A: 1359504000 + } + }, + K: { + A: { + A: 0, + B: 0, + C: 0, + P: 0.0111391, + R: 0, + VB: 0, + BB: 0 + }, + B: "o", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "A", "B", "R", "VB", "C", "BB", "P", "", "", ""], + E: "Opera Mobile", + F: { + A: 1287100800, + B: 1300752000, + R: 1314835200, + VB: 1318291200, + C: 1330300800, + BB: 1349740800, + P: 1474588800 + }, + D: { + P: "webkit" + } + }, + L: { + A: { + S: 34.3249 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "S", "", "", ""], + E: "Chrome for Android", + F: { + S: 1594684800 + } + }, + M: { + A: { + N: 0.248583 + }, + B: "moz", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "N", "", "", ""], + E: "Firefox for Android", + F: { + N: 1567468800 + } + }, + N: { + A: { + A: 0.0115934, + B: 0.022664 + }, + B: "ms", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "A", "B", "", "", ""], + E: "IE Mobile", + F: { + A: 1340150400, + B: 1353456000 + } + }, + O: { + A: { + HC: 1.79826 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "HC", "", "", ""], + E: "UC Browser for Android", + F: { + HC: 1471392000 + }, + D: { + HC: "webkit" + } + }, + P: { + A: { + G: 0.279212, + IC: 0.0206824, + JC: 0.0103412, + KC: 0.0930706, + LC: 0.0206824, + MC: 0.1758, + XB: 0.186141, + NC: 2.43018, + OC: 0.248188 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "G", "IC", "JC", "KC", "LC", "MC", "XB", "NC", "OC", "", "", ""], + E: "Samsung Internet", + F: { + G: 1461024000, + IC: 1481846400, + JC: 1509408000, + KC: 1528329600, + LC: 1546128000, + MC: 1554163200, + XB: 1567900800, + NC: 1582588800, + OC: 1593475200 + } + }, + Q: { + A: { + PC: 0.21156 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "PC", "", "", ""], + E: "QQ Browser", + F: { + PC: 1589846400 + } + }, + R: { + A: { + QC: 0 + }, + B: "webkit", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "QC", "", "", ""], + E: "Baidu Browser", + F: { + QC: 1491004800 + } + }, + S: { + A: { + RC: 0.068757 + }, + B: "moz", + C: ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "RC", "", "", ""], + E: "KaiOS Browser", + F: { + RC: 1527811200 + } + } +}; + +},{}],89:[function(require,module,exports){ +"use strict"; + +module.exports = { + "0": "48", + "1": "49", + "2": "50", + "3": "51", + "4": "52", + "5": "53", + "6": "54", + "7": "55", + "8": "56", + "9": "57", + A: "10", + B: "11", + C: "12", + D: "7", + E: "9", + F: "8", + G: "4", + H: "14", + I: "6", + J: "16", + K: "17", + L: "18", + M: "81", + N: "68", + O: "13", + P: "46", + Q: "15", + R: "11.1", + S: "84", + T: "69", + U: "67", + V: "79", + W: "5", + X: "19", + Y: "20", + Z: "21", + a: "22", + b: "23", + c: "24", + d: "25", + e: "26", + f: "27", + g: "28", + h: "29", + i: "30", + j: "31", + k: "32", + l: "33", + m: "34", + n: "35", + o: "36", + p: "37", + q: "38", + r: "39", + s: "40", + t: "41", + u: "42", + v: "43", + w: "44", + x: "45", + y: "80", + z: "47", + AB: "58", + BB: "12.1", + CB: "60", + DB: "66", + EB: "62", + FB: "63", + GB: "64", + HB: "65", + IB: "4.2-4.3", + JB: "61", + KB: "3", + LB: "59", + MB: "70", + NB: "71", + OB: "72", + PB: "73", + QB: "74", + RB: "75", + SB: "76", + TB: "77", + UB: "78", + VB: "11.5", + WB: "83", + XB: "10.1", + YB: "3.2", + ZB: "10.3", + aB: "87", + bB: "86", + cB: "5.1", + dB: "6.1", + eB: "7.1", + fB: "9.1", + gB: "85", + hB: "3.6", + iB: "5.5", + jB: "13.1", + kB: "TP", + lB: "9.5-9.6", + mB: "10.0-10.1", + nB: "10.5", + oB: "10.6", + pB: "3.5", + qB: "11.6", + rB: "4.0-4.1", + sB: "2", + tB: "5.0-5.1", + uB: "6.0-6.1", + vB: "7.0-7.1", + wB: "8.1-8.4", + xB: "9.0-9.2", + yB: "9.3", + zB: "10.0-10.2", + "0B": "3.1", + "1B": "11.0-11.2", + "2B": "11.3-11.4", + "3B": "12.0-12.1", + "4B": "12.2-12.4", + "5B": "13.0-13.1", + "6B": "13.2", + "7B": "13.3", + "8B": "13.4-13.5", + "9B": "14.0", + AC: "all", + BC: "2.1", + CC: "2.2", + DC: "2.3", + EC: "4.1", + FC: "4.4", + GC: "4.4.3-4.4.4", + HC: "12.12", + IC: "5.0-5.4", + JC: "6.2-6.4", + KC: "7.2-7.4", + LC: "8.2", + MC: "9.2", + NC: "11.1-11.2", + OC: "12.0", + PC: "10.4", + QC: "7.12", + RC: "2.5" +}; + +},{}],90:[function(require,module,exports){ +arguments[4][83][0].apply(exports,arguments) +},{"dup":83}],91:[function(require,module,exports){ +"use strict"; + +module.exports = { + "aac": require("./features/aac"), + "abortcontroller": require("./features/abortcontroller"), + "ac3-ec3": require("./features/ac3-ec3"), + "accelerometer": require("./features/accelerometer"), + "addeventlistener": require("./features/addeventlistener"), + "alternate-stylesheet": require("./features/alternate-stylesheet"), + "ambient-light": require("./features/ambient-light"), + "apng": require("./features/apng"), + "array-find-index": require("./features/array-find-index"), + "array-find": require("./features/array-find"), + "array-flat": require("./features/array-flat"), + "array-includes": require("./features/array-includes"), + "arrow-functions": require("./features/arrow-functions"), + "asmjs": require("./features/asmjs"), + "async-clipboard": require("./features/async-clipboard"), + "async-functions": require("./features/async-functions"), + "async-iterations-and-generators": require("./features/async-iterations-and-generators"), + "atob-btoa": require("./features/atob-btoa"), + "audio-api": require("./features/audio-api"), + "audio": require("./features/audio"), + "audiotracks": require("./features/audiotracks"), + "autofocus": require("./features/autofocus"), + "auxclick": require("./features/auxclick"), + "av1": require("./features/av1"), + "avif": require("./features/avif"), + "background-attachment": require("./features/background-attachment"), + "background-clip-text": require("./features/background-clip-text"), + "background-img-opts": require("./features/background-img-opts"), + "background-position-x-y": require("./features/background-position-x-y"), + "background-repeat-round-space": require("./features/background-repeat-round-space"), + "background-sync": require("./features/background-sync"), + "battery-status": require("./features/battery-status"), + "beacon": require("./features/beacon"), + "beforeafterprint": require("./features/beforeafterprint"), + "bigint": require("./features/bigint"), + "blobbuilder": require("./features/blobbuilder"), + "bloburls": require("./features/bloburls"), + "border-image": require("./features/border-image"), + "border-radius": require("./features/border-radius"), + "broadcastchannel": require("./features/broadcastchannel"), + "brotli": require("./features/brotli"), + "calc": require("./features/calc"), + "canvas-blending": require("./features/canvas-blending"), + "canvas-text": require("./features/canvas-text"), + "canvas": require("./features/canvas"), + "ch-unit": require("./features/ch-unit"), + "chacha20-poly1305": require("./features/chacha20-poly1305"), + "channel-messaging": require("./features/channel-messaging"), + "childnode-remove": require("./features/childnode-remove"), + "classlist": require("./features/classlist"), + "clear-site-data-header": require("./features/clear-site-data-header"), + "client-hints-dpr-width-viewport": require("./features/client-hints-dpr-width-viewport"), + "clipboard": require("./features/clipboard"), + "comparedocumentposition": require("./features/comparedocumentposition"), + "console-basic": require("./features/console-basic"), + "console-time": require("./features/console-time"), + "const": require("./features/const"), + "constraint-validation": require("./features/constraint-validation"), + "contenteditable": require("./features/contenteditable"), + "contentsecuritypolicy": require("./features/contentsecuritypolicy"), + "contentsecuritypolicy2": require("./features/contentsecuritypolicy2"), + "cors": require("./features/cors"), + "createimagebitmap": require("./features/createimagebitmap"), + "credential-management": require("./features/credential-management"), + "cryptography": require("./features/cryptography"), + "css-all": require("./features/css-all"), + "css-animation": require("./features/css-animation"), + "css-any-link": require("./features/css-any-link"), + "css-appearance": require("./features/css-appearance"), + "css-apply-rule": require("./features/css-apply-rule"), + "css-at-counter-style": require("./features/css-at-counter-style"), + "css-backdrop-filter": require("./features/css-backdrop-filter"), + "css-background-offsets": require("./features/css-background-offsets"), + "css-backgroundblendmode": require("./features/css-backgroundblendmode"), + "css-boxdecorationbreak": require("./features/css-boxdecorationbreak"), + "css-boxshadow": require("./features/css-boxshadow"), + "css-canvas": require("./features/css-canvas"), + "css-caret-color": require("./features/css-caret-color"), + "css-case-insensitive": require("./features/css-case-insensitive"), + "css-clip-path": require("./features/css-clip-path"), + "css-color-adjust": require("./features/css-color-adjust"), + "css-color-function": require("./features/css-color-function"), + "css-conic-gradients": require("./features/css-conic-gradients"), + "css-containment": require("./features/css-containment"), + "css-counters": require("./features/css-counters"), + "css-crisp-edges": require("./features/css-crisp-edges"), + "css-cross-fade": require("./features/css-cross-fade"), + "css-default-pseudo": require("./features/css-default-pseudo"), + "css-descendant-gtgt": require("./features/css-descendant-gtgt"), + "css-deviceadaptation": require("./features/css-deviceadaptation"), + "css-dir-pseudo": require("./features/css-dir-pseudo"), + "css-display-contents": require("./features/css-display-contents"), + "css-element-function": require("./features/css-element-function"), + "css-env-function": require("./features/css-env-function"), + "css-exclusions": require("./features/css-exclusions"), + "css-featurequeries": require("./features/css-featurequeries"), + "css-filter-function": require("./features/css-filter-function"), + "css-filters": require("./features/css-filters"), + "css-first-letter": require("./features/css-first-letter"), + "css-first-line": require("./features/css-first-line"), + "css-fixed": require("./features/css-fixed"), + "css-focus-visible": require("./features/css-focus-visible"), + "css-focus-within": require("./features/css-focus-within"), + "css-font-rendering-controls": require("./features/css-font-rendering-controls"), + "css-font-stretch": require("./features/css-font-stretch"), + "css-gencontent": require("./features/css-gencontent"), + "css-gradients": require("./features/css-gradients"), + "css-grid": require("./features/css-grid"), + "css-hanging-punctuation": require("./features/css-hanging-punctuation"), + "css-has": require("./features/css-has"), + "css-hyphenate": require("./features/css-hyphenate"), + "css-hyphens": require("./features/css-hyphens"), + "css-image-orientation": require("./features/css-image-orientation"), + "css-image-set": require("./features/css-image-set"), + "css-in-out-of-range": require("./features/css-in-out-of-range"), + "css-indeterminate-pseudo": require("./features/css-indeterminate-pseudo"), + "css-initial-letter": require("./features/css-initial-letter"), + "css-initial-value": require("./features/css-initial-value"), + "css-letter-spacing": require("./features/css-letter-spacing"), + "css-line-clamp": require("./features/css-line-clamp"), + "css-logical-props": require("./features/css-logical-props"), + "css-marker-pseudo": require("./features/css-marker-pseudo"), + "css-masks": require("./features/css-masks"), + "css-matches-pseudo": require("./features/css-matches-pseudo"), + "css-math-functions": require("./features/css-math-functions"), + "css-media-interaction": require("./features/css-media-interaction"), + "css-media-resolution": require("./features/css-media-resolution"), + "css-media-scripting": require("./features/css-media-scripting"), + "css-mediaqueries": require("./features/css-mediaqueries"), + "css-mixblendmode": require("./features/css-mixblendmode"), + "css-motion-paths": require("./features/css-motion-paths"), + "css-namespaces": require("./features/css-namespaces"), + "css-not-sel-list": require("./features/css-not-sel-list"), + "css-nth-child-of": require("./features/css-nth-child-of"), + "css-opacity": require("./features/css-opacity"), + "css-optional-pseudo": require("./features/css-optional-pseudo"), + "css-overflow-anchor": require("./features/css-overflow-anchor"), + "css-overflow": require("./features/css-overflow"), + "css-overscroll-behavior": require("./features/css-overscroll-behavior"), + "css-page-break": require("./features/css-page-break"), + "css-paged-media": require("./features/css-paged-media"), + "css-paint-api": require("./features/css-paint-api"), + "css-placeholder-shown": require("./features/css-placeholder-shown"), + "css-placeholder": require("./features/css-placeholder"), + "css-read-only-write": require("./features/css-read-only-write"), + "css-rebeccapurple": require("./features/css-rebeccapurple"), + "css-reflections": require("./features/css-reflections"), + "css-regions": require("./features/css-regions"), + "css-repeating-gradients": require("./features/css-repeating-gradients"), + "css-resize": require("./features/css-resize"), + "css-revert-value": require("./features/css-revert-value"), + "css-rrggbbaa": require("./features/css-rrggbbaa"), + "css-scroll-behavior": require("./features/css-scroll-behavior"), + "css-scrollbar": require("./features/css-scrollbar"), + "css-sel2": require("./features/css-sel2"), + "css-sel3": require("./features/css-sel3"), + "css-selection": require("./features/css-selection"), + "css-shapes": require("./features/css-shapes"), + "css-snappoints": require("./features/css-snappoints"), + "css-sticky": require("./features/css-sticky"), + "css-subgrid": require("./features/css-subgrid"), + "css-supports-api": require("./features/css-supports-api"), + "css-table": require("./features/css-table"), + "css-text-align-last": require("./features/css-text-align-last"), + "css-text-indent": require("./features/css-text-indent"), + "css-text-justify": require("./features/css-text-justify"), + "css-text-orientation": require("./features/css-text-orientation"), + "css-text-spacing": require("./features/css-text-spacing"), + "css-textshadow": require("./features/css-textshadow"), + "css-touch-action-2": require("./features/css-touch-action-2"), + "css-touch-action": require("./features/css-touch-action"), + "css-transitions": require("./features/css-transitions"), + "css-unicode-bidi": require("./features/css-unicode-bidi"), + "css-unset-value": require("./features/css-unset-value"), + "css-variables": require("./features/css-variables"), + "css-widows-orphans": require("./features/css-widows-orphans"), + "css-writing-mode": require("./features/css-writing-mode"), + "css-zoom": require("./features/css-zoom"), + "css3-attr": require("./features/css3-attr"), + "css3-boxsizing": require("./features/css3-boxsizing"), + "css3-colors": require("./features/css3-colors"), + "css3-cursors-grab": require("./features/css3-cursors-grab"), + "css3-cursors-newer": require("./features/css3-cursors-newer"), + "css3-cursors": require("./features/css3-cursors"), + "css3-tabsize": require("./features/css3-tabsize"), + "currentcolor": require("./features/currentcolor"), + "custom-elements": require("./features/custom-elements"), + "custom-elementsv1": require("./features/custom-elementsv1"), + "customevent": require("./features/customevent"), + "datalist": require("./features/datalist"), + "dataset": require("./features/dataset"), + "datauri": require("./features/datauri"), + "date-tolocaledatestring": require("./features/date-tolocaledatestring"), + "details": require("./features/details"), + "deviceorientation": require("./features/deviceorientation"), + "devicepixelratio": require("./features/devicepixelratio"), + "dialog": require("./features/dialog"), + "dispatchevent": require("./features/dispatchevent"), + "dnssec": require("./features/dnssec"), + "do-not-track": require("./features/do-not-track"), + "document-currentscript": require("./features/document-currentscript"), + "document-evaluate-xpath": require("./features/document-evaluate-xpath"), + "document-execcommand": require("./features/document-execcommand"), + "document-policy": require("./features/document-policy"), + "document-scrollingelement": require("./features/document-scrollingelement"), + "documenthead": require("./features/documenthead"), + "dom-manip-convenience": require("./features/dom-manip-convenience"), + "dom-range": require("./features/dom-range"), + "domcontentloaded": require("./features/domcontentloaded"), + "domfocusin-domfocusout-events": require("./features/domfocusin-domfocusout-events"), + "dommatrix": require("./features/dommatrix"), + "download": require("./features/download"), + "dragndrop": require("./features/dragndrop"), + "element-closest": require("./features/element-closest"), + "element-from-point": require("./features/element-from-point"), + "element-scroll-methods": require("./features/element-scroll-methods"), + "eme": require("./features/eme"), + "eot": require("./features/eot"), + "es5": require("./features/es5"), + "es6-class": require("./features/es6-class"), + "es6-generators": require("./features/es6-generators"), + "es6-module-dynamic-import": require("./features/es6-module-dynamic-import"), + "es6-module": require("./features/es6-module"), + "es6-number": require("./features/es6-number"), + "es6-string-includes": require("./features/es6-string-includes"), + "es6": require("./features/es6"), + "eventsource": require("./features/eventsource"), + "extended-system-fonts": require("./features/extended-system-fonts"), + "feature-policy": require("./features/feature-policy"), + "fetch": require("./features/fetch"), + "fieldset-disabled": require("./features/fieldset-disabled"), + "fileapi": require("./features/fileapi"), + "filereader": require("./features/filereader"), + "filereadersync": require("./features/filereadersync"), + "filesystem": require("./features/filesystem"), + "flac": require("./features/flac"), + "flexbox-gap": require("./features/flexbox-gap"), + "flexbox": require("./features/flexbox"), + "flow-root": require("./features/flow-root"), + "focusin-focusout-events": require("./features/focusin-focusout-events"), + "focusoptions-preventscroll": require("./features/focusoptions-preventscroll"), + "font-family-system-ui": require("./features/font-family-system-ui"), + "font-feature": require("./features/font-feature"), + "font-kerning": require("./features/font-kerning"), + "font-loading": require("./features/font-loading"), + "font-size-adjust": require("./features/font-size-adjust"), + "font-smooth": require("./features/font-smooth"), + "font-unicode-range": require("./features/font-unicode-range"), + "font-variant-alternates": require("./features/font-variant-alternates"), + "font-variant-east-asian": require("./features/font-variant-east-asian"), + "font-variant-numeric": require("./features/font-variant-numeric"), + "fontface": require("./features/fontface"), + "form-attribute": require("./features/form-attribute"), + "form-submit-attributes": require("./features/form-submit-attributes"), + "form-validation": require("./features/form-validation"), + "forms": require("./features/forms"), + "fullscreen": require("./features/fullscreen"), + "gamepad": require("./features/gamepad"), + "geolocation": require("./features/geolocation"), + "getboundingclientrect": require("./features/getboundingclientrect"), + "getcomputedstyle": require("./features/getcomputedstyle"), + "getelementsbyclassname": require("./features/getelementsbyclassname"), + "getrandomvalues": require("./features/getrandomvalues"), + "gyroscope": require("./features/gyroscope"), + "hardwareconcurrency": require("./features/hardwareconcurrency"), + "hashchange": require("./features/hashchange"), + "heif": require("./features/heif"), + "hevc": require("./features/hevc"), + "hidden": require("./features/hidden"), + "high-resolution-time": require("./features/high-resolution-time"), + "history": require("./features/history"), + "html-media-capture": require("./features/html-media-capture"), + "html5semantic": require("./features/html5semantic"), + "http-live-streaming": require("./features/http-live-streaming"), + "http2": require("./features/http2"), + "http3": require("./features/http3"), + "iframe-sandbox": require("./features/iframe-sandbox"), + "iframe-seamless": require("./features/iframe-seamless"), + "iframe-srcdoc": require("./features/iframe-srcdoc"), + "imagecapture": require("./features/imagecapture"), + "ime": require("./features/ime"), + "img-naturalwidth-naturalheight": require("./features/img-naturalwidth-naturalheight"), + "imports": require("./features/imports"), + "indeterminate-checkbox": require("./features/indeterminate-checkbox"), + "indexeddb": require("./features/indexeddb"), + "indexeddb2": require("./features/indexeddb2"), + "inline-block": require("./features/inline-block"), + "innertext": require("./features/innertext"), + "input-autocomplete-onoff": require("./features/input-autocomplete-onoff"), + "input-color": require("./features/input-color"), + "input-datetime": require("./features/input-datetime"), + "input-email-tel-url": require("./features/input-email-tel-url"), + "input-event": require("./features/input-event"), + "input-file-accept": require("./features/input-file-accept"), + "input-file-directory": require("./features/input-file-directory"), + "input-file-multiple": require("./features/input-file-multiple"), + "input-inputmode": require("./features/input-inputmode"), + "input-minlength": require("./features/input-minlength"), + "input-number": require("./features/input-number"), + "input-pattern": require("./features/input-pattern"), + "input-placeholder": require("./features/input-placeholder"), + "input-range": require("./features/input-range"), + "input-search": require("./features/input-search"), + "input-selection": require("./features/input-selection"), + "insert-adjacent": require("./features/insert-adjacent"), + "insertadjacenthtml": require("./features/insertadjacenthtml"), + "internationalization": require("./features/internationalization"), + "intersectionobserver-v2": require("./features/intersectionobserver-v2"), + "intersectionobserver": require("./features/intersectionobserver"), + "intl-pluralrules": require("./features/intl-pluralrules"), + "intrinsic-width": require("./features/intrinsic-width"), + "jpeg2000": require("./features/jpeg2000"), + "jpegxr": require("./features/jpegxr"), + "js-regexp-lookbehind": require("./features/js-regexp-lookbehind"), + "json": require("./features/json"), + "justify-content-space-evenly": require("./features/justify-content-space-evenly"), + "kerning-pairs-ligatures": require("./features/kerning-pairs-ligatures"), + "keyboardevent-charcode": require("./features/keyboardevent-charcode"), + "keyboardevent-code": require("./features/keyboardevent-code"), + "keyboardevent-getmodifierstate": require("./features/keyboardevent-getmodifierstate"), + "keyboardevent-key": require("./features/keyboardevent-key"), + "keyboardevent-location": require("./features/keyboardevent-location"), + "keyboardevent-which": require("./features/keyboardevent-which"), + "lazyload": require("./features/lazyload"), + "let": require("./features/let"), + "link-icon-png": require("./features/link-icon-png"), + "link-icon-svg": require("./features/link-icon-svg"), + "link-rel-dns-prefetch": require("./features/link-rel-dns-prefetch"), + "link-rel-modulepreload": require("./features/link-rel-modulepreload"), + "link-rel-preconnect": require("./features/link-rel-preconnect"), + "link-rel-prefetch": require("./features/link-rel-prefetch"), + "link-rel-preload": require("./features/link-rel-preload"), + "link-rel-prerender": require("./features/link-rel-prerender"), + "loading-lazy-attr": require("./features/loading-lazy-attr"), + "localecompare": require("./features/localecompare"), + "magnetometer": require("./features/magnetometer"), + "matchesselector": require("./features/matchesselector"), + "matchmedia": require("./features/matchmedia"), + "mathml": require("./features/mathml"), + "maxlength": require("./features/maxlength"), + "media-attribute": require("./features/media-attribute"), + "media-fragments": require("./features/media-fragments"), + "media-session-api": require("./features/media-session-api"), + "mediacapture-fromelement": require("./features/mediacapture-fromelement"), + "mediarecorder": require("./features/mediarecorder"), + "mediasource": require("./features/mediasource"), + "menu": require("./features/menu"), + "meta-theme-color": require("./features/meta-theme-color"), + "meter": require("./features/meter"), + "midi": require("./features/midi"), + "minmaxwh": require("./features/minmaxwh"), + "mp3": require("./features/mp3"), + "mpeg-dash": require("./features/mpeg-dash"), + "mpeg4": require("./features/mpeg4"), + "multibackgrounds": require("./features/multibackgrounds"), + "multicolumn": require("./features/multicolumn"), + "mutation-events": require("./features/mutation-events"), + "mutationobserver": require("./features/mutationobserver"), + "namevalue-storage": require("./features/namevalue-storage"), + "native-filesystem-api": require("./features/native-filesystem-api"), + "nav-timing": require("./features/nav-timing"), + "navigator-language": require("./features/navigator-language"), + "netinfo": require("./features/netinfo"), + "node-contains": require("./features/node-contains"), + "node-parentelement": require("./features/node-parentelement"), + "notifications": require("./features/notifications"), + "object-entries": require("./features/object-entries"), + "object-fit": require("./features/object-fit"), + "object-observe": require("./features/object-observe"), + "object-values": require("./features/object-values"), + "objectrtc": require("./features/objectrtc"), + "offline-apps": require("./features/offline-apps"), + "offscreencanvas": require("./features/offscreencanvas"), + "ogg-vorbis": require("./features/ogg-vorbis"), + "ogv": require("./features/ogv"), + "ol-reversed": require("./features/ol-reversed"), + "once-event-listener": require("./features/once-event-listener"), + "online-status": require("./features/online-status"), + "opus": require("./features/opus"), + "orientation-sensor": require("./features/orientation-sensor"), + "outline": require("./features/outline"), + "pad-start-end": require("./features/pad-start-end"), + "page-transition-events": require("./features/page-transition-events"), + "pagevisibility": require("./features/pagevisibility"), + "passive-event-listener": require("./features/passive-event-listener"), + "passwordrules": require("./features/passwordrules"), + "path2d": require("./features/path2d"), + "payment-request": require("./features/payment-request"), + "pdf-viewer": require("./features/pdf-viewer"), + "permissions-api": require("./features/permissions-api"), + "permissions-policy": require("./features/permissions-policy"), + "picture-in-picture": require("./features/picture-in-picture"), + "picture": require("./features/picture"), + "ping": require("./features/ping"), + "png-alpha": require("./features/png-alpha"), + "pointer-events": require("./features/pointer-events"), + "pointer": require("./features/pointer"), + "pointerlock": require("./features/pointerlock"), + "portals": require("./features/portals"), + "prefers-color-scheme": require("./features/prefers-color-scheme"), + "prefers-reduced-motion": require("./features/prefers-reduced-motion"), + "private-class-fields": require("./features/private-class-fields"), + "private-methods-and-accessors": require("./features/private-methods-and-accessors"), + "progress": require("./features/progress"), + "promise-finally": require("./features/promise-finally"), + "promises": require("./features/promises"), + "proximity": require("./features/proximity"), + "proxy": require("./features/proxy"), + "public-class-fields": require("./features/public-class-fields"), + "publickeypinning": require("./features/publickeypinning"), + "push-api": require("./features/push-api"), + "queryselector": require("./features/queryselector"), + "readonly-attr": require("./features/readonly-attr"), + "referrer-policy": require("./features/referrer-policy"), + "registerprotocolhandler": require("./features/registerprotocolhandler"), + "rel-noopener": require("./features/rel-noopener"), + "rel-noreferrer": require("./features/rel-noreferrer"), + "rellist": require("./features/rellist"), + "rem": require("./features/rem"), + "replace-all": require("./features/replace-all"), + "requestanimationframe": require("./features/requestanimationframe"), + "requestidlecallback": require("./features/requestidlecallback"), + "resizeobserver": require("./features/resizeobserver"), + "resource-timing": require("./features/resource-timing"), + "rest-parameters": require("./features/rest-parameters"), + "rtcpeerconnection": require("./features/rtcpeerconnection"), + "ruby": require("./features/ruby"), + "run-in": require("./features/run-in"), + "same-site-cookie-attribute": require("./features/same-site-cookie-attribute"), + "screen-orientation": require("./features/screen-orientation"), + "script-async": require("./features/script-async"), + "script-defer": require("./features/script-defer"), + "scrollintoview": require("./features/scrollintoview"), + "scrollintoviewifneeded": require("./features/scrollintoviewifneeded"), + "sdch": require("./features/sdch"), + "selection-api": require("./features/selection-api"), + "server-timing": require("./features/server-timing"), + "serviceworkers": require("./features/serviceworkers"), + "setimmediate": require("./features/setimmediate"), + "sha-2": require("./features/sha-2"), + "shadowdom": require("./features/shadowdom"), + "shadowdomv1": require("./features/shadowdomv1"), + "sharedarraybuffer": require("./features/sharedarraybuffer"), + "sharedworkers": require("./features/sharedworkers"), + "sni": require("./features/sni"), + "spdy": require("./features/spdy"), + "speech-recognition": require("./features/speech-recognition"), + "speech-synthesis": require("./features/speech-synthesis"), + "spellcheck-attribute": require("./features/spellcheck-attribute"), + "sql-storage": require("./features/sql-storage"), + "srcset": require("./features/srcset"), + "stopimmediatepropagation": require("./features/stopimmediatepropagation"), + "stream": require("./features/stream"), + "streams": require("./features/streams"), + "stricttransportsecurity": require("./features/stricttransportsecurity"), + "style-scoped": require("./features/style-scoped"), + "subresource-integrity": require("./features/subresource-integrity"), + "svg-css": require("./features/svg-css"), + "svg-filters": require("./features/svg-filters"), + "svg-fonts": require("./features/svg-fonts"), + "svg-fragment": require("./features/svg-fragment"), + "svg-html": require("./features/svg-html"), + "svg-html5": require("./features/svg-html5"), + "svg-img": require("./features/svg-img"), + "svg-smil": require("./features/svg-smil"), + "svg": require("./features/svg"), + "sxg": require("./features/sxg"), + "symbols": require("./features/symbols"), + "tabindex-attr": require("./features/tabindex-attr"), + "template-literals": require("./features/template-literals"), + "template": require("./features/template"), + "testfeat": require("./features/testfeat"), + "text-decoration": require("./features/text-decoration"), + "text-emphasis": require("./features/text-emphasis"), + "text-overflow": require("./features/text-overflow"), + "text-size-adjust": require("./features/text-size-adjust"), + "text-stroke": require("./features/text-stroke"), + "text-underline-offset": require("./features/text-underline-offset"), + "textcontent": require("./features/textcontent"), + "textencoder": require("./features/textencoder"), + "tls1-1": require("./features/tls1-1"), + "tls1-2": require("./features/tls1-2"), + "tls1-3": require("./features/tls1-3"), + "token-binding": require("./features/token-binding"), + "touch": require("./features/touch"), + "transforms2d": require("./features/transforms2d"), + "transforms3d": require("./features/transforms3d"), + "trusted-types": require("./features/trusted-types"), + "ttf": require("./features/ttf"), + "typedarrays": require("./features/typedarrays"), + "u2f": require("./features/u2f"), + "unhandledrejection": require("./features/unhandledrejection"), + "upgradeinsecurerequests": require("./features/upgradeinsecurerequests"), + "url-scroll-to-text-fragment": require("./features/url-scroll-to-text-fragment"), + "url": require("./features/url"), + "urlsearchparams": require("./features/urlsearchparams"), + "use-strict": require("./features/use-strict"), + "user-select-none": require("./features/user-select-none"), + "user-timing": require("./features/user-timing"), + "variable-fonts": require("./features/variable-fonts"), + "vibration": require("./features/vibration"), + "video": require("./features/video"), + "videotracks": require("./features/videotracks"), + "viewport-units": require("./features/viewport-units"), + "wai-aria": require("./features/wai-aria"), + "wake-lock": require("./features/wake-lock"), + "wasm": require("./features/wasm"), + "wav": require("./features/wav"), + "wbr-element": require("./features/wbr-element"), + "web-animation": require("./features/web-animation"), + "web-app-manifest": require("./features/web-app-manifest"), + "web-bluetooth": require("./features/web-bluetooth"), + "web-share": require("./features/web-share"), + "webauthn": require("./features/webauthn"), + "webgl": require("./features/webgl"), + "webgl2": require("./features/webgl2"), + "webgpu": require("./features/webgpu"), + "webhid": require("./features/webhid"), + "webm": require("./features/webm"), + "webnfc": require("./features/webnfc"), + "webp": require("./features/webp"), + "websockets": require("./features/websockets"), + "webusb": require("./features/webusb"), + "webvr": require("./features/webvr"), + "webvtt": require("./features/webvtt"), + "webworkers": require("./features/webworkers"), + "webxr": require("./features/webxr"), + "will-change": require("./features/will-change"), + "woff": require("./features/woff"), + "woff2": require("./features/woff2"), + "word-break": require("./features/word-break"), + "wordwrap": require("./features/wordwrap"), + "x-doc-messaging": require("./features/x-doc-messaging"), + "x-frame-options": require("./features/x-frame-options"), + "xhr2": require("./features/xhr2"), + "xhtml": require("./features/xhtml"), + "xhtmlsmil": require("./features/xhtmlsmil"), + "xml-serializer": require("./features/xml-serializer") +}; + +},{"./features/aac":92,"./features/abortcontroller":93,"./features/ac3-ec3":94,"./features/accelerometer":95,"./features/addeventlistener":96,"./features/alternate-stylesheet":97,"./features/ambient-light":98,"./features/apng":99,"./features/array-find":101,"./features/array-find-index":100,"./features/array-flat":102,"./features/array-includes":103,"./features/arrow-functions":104,"./features/asmjs":105,"./features/async-clipboard":106,"./features/async-functions":107,"./features/async-iterations-and-generators":108,"./features/atob-btoa":109,"./features/audio":111,"./features/audio-api":110,"./features/audiotracks":112,"./features/autofocus":113,"./features/auxclick":114,"./features/av1":115,"./features/avif":116,"./features/background-attachment":117,"./features/background-clip-text":118,"./features/background-img-opts":119,"./features/background-position-x-y":120,"./features/background-repeat-round-space":121,"./features/background-sync":122,"./features/battery-status":123,"./features/beacon":124,"./features/beforeafterprint":125,"./features/bigint":126,"./features/blobbuilder":127,"./features/bloburls":128,"./features/border-image":129,"./features/border-radius":130,"./features/broadcastchannel":131,"./features/brotli":132,"./features/calc":133,"./features/canvas":136,"./features/canvas-blending":134,"./features/canvas-text":135,"./features/ch-unit":137,"./features/chacha20-poly1305":138,"./features/channel-messaging":139,"./features/childnode-remove":140,"./features/classlist":141,"./features/clear-site-data-header":142,"./features/client-hints-dpr-width-viewport":143,"./features/clipboard":144,"./features/comparedocumentposition":145,"./features/console-basic":146,"./features/console-time":147,"./features/const":148,"./features/constraint-validation":149,"./features/contenteditable":150,"./features/contentsecuritypolicy":151,"./features/contentsecuritypolicy2":152,"./features/cors":153,"./features/createimagebitmap":154,"./features/credential-management":155,"./features/cryptography":156,"./features/css-all":157,"./features/css-animation":158,"./features/css-any-link":159,"./features/css-appearance":160,"./features/css-apply-rule":161,"./features/css-at-counter-style":162,"./features/css-backdrop-filter":163,"./features/css-background-offsets":164,"./features/css-backgroundblendmode":165,"./features/css-boxdecorationbreak":166,"./features/css-boxshadow":167,"./features/css-canvas":168,"./features/css-caret-color":169,"./features/css-case-insensitive":170,"./features/css-clip-path":171,"./features/css-color-adjust":172,"./features/css-color-function":173,"./features/css-conic-gradients":174,"./features/css-containment":175,"./features/css-counters":176,"./features/css-crisp-edges":177,"./features/css-cross-fade":178,"./features/css-default-pseudo":179,"./features/css-descendant-gtgt":180,"./features/css-deviceadaptation":181,"./features/css-dir-pseudo":182,"./features/css-display-contents":183,"./features/css-element-function":184,"./features/css-env-function":185,"./features/css-exclusions":186,"./features/css-featurequeries":187,"./features/css-filter-function":188,"./features/css-filters":189,"./features/css-first-letter":190,"./features/css-first-line":191,"./features/css-fixed":192,"./features/css-focus-visible":193,"./features/css-focus-within":194,"./features/css-font-rendering-controls":195,"./features/css-font-stretch":196,"./features/css-gencontent":197,"./features/css-gradients":198,"./features/css-grid":199,"./features/css-hanging-punctuation":200,"./features/css-has":201,"./features/css-hyphenate":202,"./features/css-hyphens":203,"./features/css-image-orientation":204,"./features/css-image-set":205,"./features/css-in-out-of-range":206,"./features/css-indeterminate-pseudo":207,"./features/css-initial-letter":208,"./features/css-initial-value":209,"./features/css-letter-spacing":210,"./features/css-line-clamp":211,"./features/css-logical-props":212,"./features/css-marker-pseudo":213,"./features/css-masks":214,"./features/css-matches-pseudo":215,"./features/css-math-functions":216,"./features/css-media-interaction":217,"./features/css-media-resolution":218,"./features/css-media-scripting":219,"./features/css-mediaqueries":220,"./features/css-mixblendmode":221,"./features/css-motion-paths":222,"./features/css-namespaces":223,"./features/css-not-sel-list":224,"./features/css-nth-child-of":225,"./features/css-opacity":226,"./features/css-optional-pseudo":227,"./features/css-overflow":229,"./features/css-overflow-anchor":228,"./features/css-overscroll-behavior":230,"./features/css-page-break":231,"./features/css-paged-media":232,"./features/css-paint-api":233,"./features/css-placeholder":235,"./features/css-placeholder-shown":234,"./features/css-read-only-write":236,"./features/css-rebeccapurple":237,"./features/css-reflections":238,"./features/css-regions":239,"./features/css-repeating-gradients":240,"./features/css-resize":241,"./features/css-revert-value":242,"./features/css-rrggbbaa":243,"./features/css-scroll-behavior":244,"./features/css-scrollbar":245,"./features/css-sel2":246,"./features/css-sel3":247,"./features/css-selection":248,"./features/css-shapes":249,"./features/css-snappoints":250,"./features/css-sticky":251,"./features/css-subgrid":252,"./features/css-supports-api":253,"./features/css-table":254,"./features/css-text-align-last":255,"./features/css-text-indent":256,"./features/css-text-justify":257,"./features/css-text-orientation":258,"./features/css-text-spacing":259,"./features/css-textshadow":260,"./features/css-touch-action":262,"./features/css-touch-action-2":261,"./features/css-transitions":263,"./features/css-unicode-bidi":264,"./features/css-unset-value":265,"./features/css-variables":266,"./features/css-widows-orphans":267,"./features/css-writing-mode":268,"./features/css-zoom":269,"./features/css3-attr":270,"./features/css3-boxsizing":271,"./features/css3-colors":272,"./features/css3-cursors":275,"./features/css3-cursors-grab":273,"./features/css3-cursors-newer":274,"./features/css3-tabsize":276,"./features/currentcolor":277,"./features/custom-elements":278,"./features/custom-elementsv1":279,"./features/customevent":280,"./features/datalist":281,"./features/dataset":282,"./features/datauri":283,"./features/date-tolocaledatestring":284,"./features/details":285,"./features/deviceorientation":286,"./features/devicepixelratio":287,"./features/dialog":288,"./features/dispatchevent":289,"./features/dnssec":290,"./features/do-not-track":291,"./features/document-currentscript":292,"./features/document-evaluate-xpath":293,"./features/document-execcommand":294,"./features/document-policy":295,"./features/document-scrollingelement":296,"./features/documenthead":297,"./features/dom-manip-convenience":298,"./features/dom-range":299,"./features/domcontentloaded":300,"./features/domfocusin-domfocusout-events":301,"./features/dommatrix":302,"./features/download":303,"./features/dragndrop":304,"./features/element-closest":305,"./features/element-from-point":306,"./features/element-scroll-methods":307,"./features/eme":308,"./features/eot":309,"./features/es5":310,"./features/es6":317,"./features/es6-class":311,"./features/es6-generators":312,"./features/es6-module":314,"./features/es6-module-dynamic-import":313,"./features/es6-number":315,"./features/es6-string-includes":316,"./features/eventsource":318,"./features/extended-system-fonts":319,"./features/feature-policy":320,"./features/fetch":321,"./features/fieldset-disabled":322,"./features/fileapi":323,"./features/filereader":324,"./features/filereadersync":325,"./features/filesystem":326,"./features/flac":327,"./features/flexbox":329,"./features/flexbox-gap":328,"./features/flow-root":330,"./features/focusin-focusout-events":331,"./features/focusoptions-preventscroll":332,"./features/font-family-system-ui":333,"./features/font-feature":334,"./features/font-kerning":335,"./features/font-loading":336,"./features/font-size-adjust":337,"./features/font-smooth":338,"./features/font-unicode-range":339,"./features/font-variant-alternates":340,"./features/font-variant-east-asian":341,"./features/font-variant-numeric":342,"./features/fontface":343,"./features/form-attribute":344,"./features/form-submit-attributes":345,"./features/form-validation":346,"./features/forms":347,"./features/fullscreen":348,"./features/gamepad":349,"./features/geolocation":350,"./features/getboundingclientrect":351,"./features/getcomputedstyle":352,"./features/getelementsbyclassname":353,"./features/getrandomvalues":354,"./features/gyroscope":355,"./features/hardwareconcurrency":356,"./features/hashchange":357,"./features/heif":358,"./features/hevc":359,"./features/hidden":360,"./features/high-resolution-time":361,"./features/history":362,"./features/html-media-capture":363,"./features/html5semantic":364,"./features/http-live-streaming":365,"./features/http2":366,"./features/http3":367,"./features/iframe-sandbox":368,"./features/iframe-seamless":369,"./features/iframe-srcdoc":370,"./features/imagecapture":371,"./features/ime":372,"./features/img-naturalwidth-naturalheight":373,"./features/imports":374,"./features/indeterminate-checkbox":375,"./features/indexeddb":376,"./features/indexeddb2":377,"./features/inline-block":378,"./features/innertext":379,"./features/input-autocomplete-onoff":380,"./features/input-color":381,"./features/input-datetime":382,"./features/input-email-tel-url":383,"./features/input-event":384,"./features/input-file-accept":385,"./features/input-file-directory":386,"./features/input-file-multiple":387,"./features/input-inputmode":388,"./features/input-minlength":389,"./features/input-number":390,"./features/input-pattern":391,"./features/input-placeholder":392,"./features/input-range":393,"./features/input-search":394,"./features/input-selection":395,"./features/insert-adjacent":396,"./features/insertadjacenthtml":397,"./features/internationalization":398,"./features/intersectionobserver":400,"./features/intersectionobserver-v2":399,"./features/intl-pluralrules":401,"./features/intrinsic-width":402,"./features/jpeg2000":403,"./features/jpegxr":404,"./features/js-regexp-lookbehind":405,"./features/json":406,"./features/justify-content-space-evenly":407,"./features/kerning-pairs-ligatures":408,"./features/keyboardevent-charcode":409,"./features/keyboardevent-code":410,"./features/keyboardevent-getmodifierstate":411,"./features/keyboardevent-key":412,"./features/keyboardevent-location":413,"./features/keyboardevent-which":414,"./features/lazyload":415,"./features/let":416,"./features/link-icon-png":417,"./features/link-icon-svg":418,"./features/link-rel-dns-prefetch":419,"./features/link-rel-modulepreload":420,"./features/link-rel-preconnect":421,"./features/link-rel-prefetch":422,"./features/link-rel-preload":423,"./features/link-rel-prerender":424,"./features/loading-lazy-attr":425,"./features/localecompare":426,"./features/magnetometer":427,"./features/matchesselector":428,"./features/matchmedia":429,"./features/mathml":430,"./features/maxlength":431,"./features/media-attribute":432,"./features/media-fragments":433,"./features/media-session-api":434,"./features/mediacapture-fromelement":435,"./features/mediarecorder":436,"./features/mediasource":437,"./features/menu":438,"./features/meta-theme-color":439,"./features/meter":440,"./features/midi":441,"./features/minmaxwh":442,"./features/mp3":443,"./features/mpeg-dash":444,"./features/mpeg4":445,"./features/multibackgrounds":446,"./features/multicolumn":447,"./features/mutation-events":448,"./features/mutationobserver":449,"./features/namevalue-storage":450,"./features/native-filesystem-api":451,"./features/nav-timing":452,"./features/navigator-language":453,"./features/netinfo":454,"./features/node-contains":455,"./features/node-parentelement":456,"./features/notifications":457,"./features/object-entries":458,"./features/object-fit":459,"./features/object-observe":460,"./features/object-values":461,"./features/objectrtc":462,"./features/offline-apps":463,"./features/offscreencanvas":464,"./features/ogg-vorbis":465,"./features/ogv":466,"./features/ol-reversed":467,"./features/once-event-listener":468,"./features/online-status":469,"./features/opus":470,"./features/orientation-sensor":471,"./features/outline":472,"./features/pad-start-end":473,"./features/page-transition-events":474,"./features/pagevisibility":475,"./features/passive-event-listener":476,"./features/passwordrules":477,"./features/path2d":478,"./features/payment-request":479,"./features/pdf-viewer":480,"./features/permissions-api":481,"./features/permissions-policy":482,"./features/picture":484,"./features/picture-in-picture":483,"./features/ping":485,"./features/png-alpha":486,"./features/pointer":488,"./features/pointer-events":487,"./features/pointerlock":489,"./features/portals":490,"./features/prefers-color-scheme":491,"./features/prefers-reduced-motion":492,"./features/private-class-fields":493,"./features/private-methods-and-accessors":494,"./features/progress":495,"./features/promise-finally":496,"./features/promises":497,"./features/proximity":498,"./features/proxy":499,"./features/public-class-fields":500,"./features/publickeypinning":501,"./features/push-api":502,"./features/queryselector":503,"./features/readonly-attr":504,"./features/referrer-policy":505,"./features/registerprotocolhandler":506,"./features/rel-noopener":507,"./features/rel-noreferrer":508,"./features/rellist":509,"./features/rem":510,"./features/replace-all":511,"./features/requestanimationframe":512,"./features/requestidlecallback":513,"./features/resizeobserver":514,"./features/resource-timing":515,"./features/rest-parameters":516,"./features/rtcpeerconnection":517,"./features/ruby":518,"./features/run-in":519,"./features/same-site-cookie-attribute":520,"./features/screen-orientation":521,"./features/script-async":522,"./features/script-defer":523,"./features/scrollintoview":524,"./features/scrollintoviewifneeded":525,"./features/sdch":526,"./features/selection-api":527,"./features/server-timing":528,"./features/serviceworkers":529,"./features/setimmediate":530,"./features/sha-2":531,"./features/shadowdom":532,"./features/shadowdomv1":533,"./features/sharedarraybuffer":534,"./features/sharedworkers":535,"./features/sni":536,"./features/spdy":537,"./features/speech-recognition":538,"./features/speech-synthesis":539,"./features/spellcheck-attribute":540,"./features/sql-storage":541,"./features/srcset":542,"./features/stopimmediatepropagation":543,"./features/stream":544,"./features/streams":545,"./features/stricttransportsecurity":546,"./features/style-scoped":547,"./features/subresource-integrity":548,"./features/svg":557,"./features/svg-css":549,"./features/svg-filters":550,"./features/svg-fonts":551,"./features/svg-fragment":552,"./features/svg-html":553,"./features/svg-html5":554,"./features/svg-img":555,"./features/svg-smil":556,"./features/sxg":558,"./features/symbols":559,"./features/tabindex-attr":560,"./features/template":562,"./features/template-literals":561,"./features/testfeat":563,"./features/text-decoration":564,"./features/text-emphasis":565,"./features/text-overflow":566,"./features/text-size-adjust":567,"./features/text-stroke":568,"./features/text-underline-offset":569,"./features/textcontent":570,"./features/textencoder":571,"./features/tls1-1":572,"./features/tls1-2":573,"./features/tls1-3":574,"./features/token-binding":575,"./features/touch":576,"./features/transforms2d":577,"./features/transforms3d":578,"./features/trusted-types":579,"./features/ttf":580,"./features/typedarrays":581,"./features/u2f":582,"./features/unhandledrejection":583,"./features/upgradeinsecurerequests":584,"./features/url":586,"./features/url-scroll-to-text-fragment":585,"./features/urlsearchparams":587,"./features/use-strict":588,"./features/user-select-none":589,"./features/user-timing":590,"./features/variable-fonts":591,"./features/vibration":592,"./features/video":593,"./features/videotracks":594,"./features/viewport-units":595,"./features/wai-aria":596,"./features/wake-lock":597,"./features/wasm":598,"./features/wav":599,"./features/wbr-element":600,"./features/web-animation":601,"./features/web-app-manifest":602,"./features/web-bluetooth":603,"./features/web-share":604,"./features/webauthn":605,"./features/webgl":606,"./features/webgl2":607,"./features/webgpu":608,"./features/webhid":609,"./features/webm":610,"./features/webnfc":611,"./features/webp":612,"./features/websockets":613,"./features/webusb":614,"./features/webvr":615,"./features/webvtt":616,"./features/webworkers":617,"./features/webxr":618,"./features/will-change":619,"./features/woff":620,"./features/woff2":621,"./features/word-break":622,"./features/wordwrap":623,"./features/x-doc-messaging":624,"./features/x-frame-options":625,"./features/xhr2":626,"./features/xhtml":627,"./features/xhtmlsmil":628,"./features/xml-serializer":629}],92:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB", + "132": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E", + "16": "A B" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "132": "N" + }, + N: { + "1": "A", + "2": "B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "132": "RC" + } + }, + B: 6, + C: "AAC audio file format" +}; + +},{}],93:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L V y M WB S", + "2": "C O H Q" + }, + C: { + "1": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB" + }, + E: { + "1": "O H BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB", + "130": "C R" + }, + F: { + "1": "5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "MC XB NC OC", + "2": "G IC JC KC LC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "AbortController & AbortSignal" +}; + +},{}],94:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L", + "2": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB", + "132": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "132": "A" + }, + K: { + "2": "A B C P R VB", + "132": "BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "132": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "AC-3 (Dolby Digital) and EC-3 (Dolby Digital Plus) codecs" +}; + +},{}],95:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "AB LB CB JB EB FB GB HB DB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "Accelerometer" +}; + +},{}],96:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "130": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "257": "sB KB G W I pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "EventTarget.addEventListener()" +}; + +},{}],97:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "F E A B", + "2": "I D iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "E B C lB mB nB oB R VB qB BB", + "16": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "16": "S" + }, + M: { + "16": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "16": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "16": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Alternate stylesheet" +}; + +},{}],98:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O", + "132": "H Q J K L", + "322": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB", + "132": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB", + "194": "CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "322": "AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "132": "RC" + } + }, + B: 4, + C: "Ambient Light Sensor" +}; + +},{}],99:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB" + }, + D: { + "1": "LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB" + }, + E: { + "1": "F E A B C O H fB XB R BB jB kB", + "2": "G W I D 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G IC JC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "Animated PNG (APNG)" +}; + +},{}],100:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w" + }, + E: { + "1": "F E A B C O H eB fB XB R BB jB kB", + "2": "G W I D 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j lB mB nB oB R VB qB BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "16": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Array.prototype.findIndex" +}; + +},{}],101:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "Q J K L V y M WB S", + "16": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w" + }, + E: { + "1": "F E A B C O H eB fB XB R BB jB kB", + "2": "G W I D 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j lB mB nB oB R VB qB BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "16": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Array.prototype.find" +}; + +},{}],102:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB pB hB" + }, + D: { + "1": "T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N" + }, + E: { + "1": "C O H BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB R" + }, + F: { + "1": "8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 6 7 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "1": "3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "XB NC OC", + "2": "G IC JC KC LC MC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "flat & flatMap array methods" +}; + +},{}],103:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Array.prototype.includes" +}; + +},{}],104:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Arrow functions" +}; + +},{}],105:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L", + "132": "V y M WB S", + "322": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f", + "132": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "132": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "132": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "132": "P" + }, + L: { + "132": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G", + "132": "IC JC KC LC MC XB NC OC" + }, + Q: { + "132": "PC" + }, + R: { + "132": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "asm.js" +}; + +},{}],106:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "66": "AB LB CB JB" + }, + E: { + "1": "H jB kB", + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "16": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "8B 9B", + "2": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B", + "16": "YB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Asynchronous Clipboard API" +}; + +},{}],107:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "Q J K L V y M WB S", + "2": "C O", + "194": "H" + }, + C: { + "1": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB", + "514": "XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t lB mB nB oB R VB qB BB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB", + "514": "ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G IC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Async functions" +}; + +},{}],108:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB" + }, + E: { + "1": "C O H BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB R" + }, + F: { + "1": "2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Async iterators and generators" +}; + +},{}],109:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "2": "E lB mB", + "16": "nB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "16": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Base64 encoding and decoding" +}; + +},{}],110:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E", + "33": "A B C O H Q J K L X Y Z a b c d e f g h i j k l" + }, + E: { + "2": "G W 0B YB cB", + "33": "I D F E A B C O H dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "33": "Q J K L X Y Z" + }, + G: { + "2": "YB rB IB tB", + "33": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Web Audio API" +}; + +},{}],111:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "132": "G W I D F E A B C O H Q J K L X pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E", + "4": "lB mB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "2": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Audio element" +}; + +},{}],112:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L", + "322": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k pB hB", + "194": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w", + "322": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W I 0B YB cB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j lB mB nB oB R VB qB BB", + "322": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "322": "P" + }, + L: { + "322": "S" + }, + M: { + "2": "N" + }, + N: { + "1": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "194": "RC" + } + }, + B: 1, + C: "Audio Tracks" +}; + +},{}],113:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Autofocus attribute" +}; + +},{}],114:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "129": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "16": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Auxclick" +}; + +},{}],115:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K", + "194": "L" + }, + C: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "66": "7 8 9 AB LB CB", + "1090": "JB EB FB GB", + "1284": "HB", + "1540": "DB" + }, + D: { + "1": "MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB", + "66": "U N T" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 6 7 8 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "1090": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "AV1 video format" +}; + +},{}],116:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB pB hB", + "194": "TB UB V y M" + }, + D: { + "1": "gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "AVIF image format" +}; + +},{}],117:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "132": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "132": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "132": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "132": "E lB mB" + }, + G: { + "2": "YB rB IB", + "772": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC FC GC", + "132": "EC IB" + }, + J: { + "260": "D A" + }, + K: { + "1": "B C P R VB BB", + "132": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "2": "G", + "1028": "IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1028": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS background-attachment" +}; + +},{}],118:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "36": "V y M WB S", + "257": "Q J K L", + "548": "C O H" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "16": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "130": "0" + }, + D: { + "36": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "16": "0B YB", + "36": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "16": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "16": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "16": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "16": "S" + }, + M: { + "16": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "16": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "130": "RC" + } + }, + B: 1, + C: "CSS3 Background-clip: text" +}; + +},{}],119:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB", + "36": "hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "516": "G W I D F E A B C O H" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "772": "G W I 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB", + "36": "mB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "4": "YB rB IB uB", + "516": "tB" + }, + H: { + "132": "AC" + }, + I: { + "1": "M FC GC", + "36": "BC", + "516": "KB G EC IB", + "548": "CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS3 Background-image options" +}; + +},{}],120:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "background-position-x & background-position-y" +}; + +},{}],121:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F iB", + "132": "E" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E Q J K L lB mB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "CSS background-repeat round and space" +}; + +},{}],122:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V pB hB", + "16": "y M" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Background Sync API" +}; + +},{}],123:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 v w x P z", + "2": "4 5 6 7 8 9 sB KB G W I D F E AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "132": "J K L X Y Z a b c d e f g h i j k l m n o p q r s t u", + "164": "A B C O H Q" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o", + "66": "p" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Battery Status API" +}; + +},{}],124:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Beacon API" +}; + +},{}],125:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "16": "iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W pB hB" + }, + D: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "2": "IC JC KC LC MC XB NC OC", + "16": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Printing Events" +}; + +},{}],126:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB pB hB", + "194": "HB DB U" + }, + D: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB" + }, + E: { + "1": "H kB", + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB jB" + }, + F: { + "1": "6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "1": "9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "MC XB NC OC", + "2": "G IC JC KC LC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "BigInt" +}; + +},{}],127:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W pB hB", + "36": "I D F E A B C" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D", + "36": "F E A B C O H Q J K L X" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B C lB mB nB oB R VB qB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "BC CC DC", + "36": "KB G EC IB FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P BB", + "2": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Blob constructing" +}; + +},{}],128:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "129": "A B" + }, + B: { + "1": "Q J K L V y M WB S", + "129": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D", + "33": "F E A B C O H Q J K L X Y Z a" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB", + "33": "I" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB", + "33": "uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB BC CC DC", + "33": "G EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Blob URLs" +}; + +},{}],129:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "129": "C O" + }, + C: { + "1": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "260": "0 1 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "804": "G W I D F E A B C O H pB hB" + }, + D: { + "1": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "260": "3 4 5 6 7", + "388": "0 1 2 i j k l m n o p q r s t u v w x P z", + "1412": "Q J K L X Y Z a b c d e f g h", + "1956": "G W I D F E A B C O H" + }, + E: { + "129": "A B C O H fB XB R BB jB kB", + "1412": "I D F E dB eB", + "1956": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB CB EB FB GB HB DB U N T", + "2": "E lB mB", + "260": "q r s t u", + "388": "Q J K L X Y Z a b c d e f g h i j k l m n o p", + "1796": "nB oB", + "1828": "B C R VB qB BB" + }, + G: { + "129": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "1412": "F uB vB wB xB", + "1956": "YB rB IB tB" + }, + H: { + "1828": "AC" + }, + I: { + "388": "M FC GC", + "1956": "KB G BC CC DC EC IB" + }, + J: { + "1412": "A", + "1924": "D" + }, + K: { + "2": "A", + "388": "P", + "1828": "B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "388": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "260": "IC JC", + "388": "G" + }, + Q: { + "260": "PC" + }, + R: { + "260": "QC" + }, + S: { + "260": "RC" + } + }, + B: 4, + C: "CSS3 Border images" +}; + +},{}],130:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "257": "0 1 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "289": "KB pB hB", + "292": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "G" + }, + E: { + "1": "W D F E A B C O H eB fB XB R BB jB kB", + "33": "G 0B YB", + "129": "I cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "33": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M CC DC EC IB FC GC", + "33": "BC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "257": "RC" + } + }, + B: 4, + C: "CSS3 Border-radius (rounded corners)" +}; + +},{}],131:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p pB hB" + }, + D: { + "1": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G IC JC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "BroadcastChannel" +}; + +},{}],132:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "Q J K L V y M WB S", + "2": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v pB hB" + }, + D: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "1", + "257": "2" + }, + E: { + "1": "O H jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "513": "B C R BB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n lB mB nB oB R VB qB BB", + "194": "o p" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Brotli Accept-Encoding/Content-Encoding" +}; + +},{}],133:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "260": "E", + "516": "A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "33": "G W I D F E A B C O H Q" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L", + "33": "X Y Z a b c d" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB", + "33": "I" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB", + "33": "uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB", + "132": "FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "calc() as CSS unit value" +}; + +},{}],134:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "2": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W I 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Canvas blend modes" +}; + +},{}],135:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "iB", + "8": "I D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "8": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "8": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "8": "E lB mB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "8": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Text API for Canvas" +}; + +},{}],136:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "iB", + "8": "I D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "132": "sB KB pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "132": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "260": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "132": "BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Canvas (basic support)" +}; + +},{}],137:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "132": "E A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "ch (character) unit" +}; + +},{}],138:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P pB hB" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k", + "129": "0 l m n o p q r s t u v w x P z" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n lB mB nB oB R VB qB BB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC", + "16": "GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "ChaCha20-Poly1305 cipher suites for TLS" +}; + +},{}],139:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d pB hB", + "194": "e f g h i j k l m n o p q r s" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "2": "E lB mB", + "16": "nB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Channel messaging" +}; + +},{}],140:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "16": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB", + "16": "I" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "ChildNode.remove()" +}; + +},{}],141:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "8": "I D F E iB", + "1924": "A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "8": "sB KB pB", + "516": "c d", + "772": "G W I D F E A B C O H Q J K L X Y Z a b hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "8": "G W I D", + "516": "c d e f", + "772": "b", + "900": "F E A B C O H Q J K L X Y Z a" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "8": "G W 0B YB", + "900": "I cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "8": "E B lB mB nB oB R", + "900": "C VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "8": "YB rB IB", + "900": "tB uB" + }, + H: { + "900": "AC" + }, + I: { + "1": "M FC GC", + "8": "BC CC DC", + "900": "KB G EC IB" + }, + J: { + "1": "A", + "900": "D" + }, + K: { + "1": "P", + "8": "A B", + "900": "C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "900": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "classList (DOMTokenList)" +}; + +},{}],142:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "16": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "16": "C O H Q J K L" + }, + C: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "16": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB pB hB" + }, + D: { + "1": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB" + }, + E: { + "16": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "16": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "16": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "1": "M", + "16": "KB G BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "16": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "16": "RC" + } + }, + B: 5, + C: "Clear-Site-Data Header" +}; + +},{}],143:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Client Hints: DPR, Width, Viewport-Width" +}; + +},{}],144:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2436": "I D F E A B iB" + }, + B: { + "260": "K L", + "2436": "C O H Q J", + "10244": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB", + "772": "a b c d e f g h i j k l m n o p q r s", + "4100": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "G W I D F E A B C", + "2564": "O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u", + "10244": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "C O H BB jB kB", + "16": "0B YB", + "2308": "A B XB R", + "2820": "G W I D F E cB dB eB fB" + }, + F: { + "2": "E B lB mB nB oB R VB qB", + "16": "C", + "516": "BB", + "2564": "Q J K L X Y Z a b c d e f g h", + "10244": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB", + "2820": "F tB uB vB wB xB yB zB ZB 1B 2B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "2308": "M FC GC" + }, + J: { + "2": "D", + "2308": "A" + }, + K: { + "2": "A B C R VB", + "16": "BB", + "3076": "P" + }, + L: { + "2052": "S" + }, + M: { + "1028": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2052": "IC JC KC LC MC XB NC OC", + "2308": "G" + }, + Q: { + "10244": "PC" + }, + R: { + "2052": "QC" + }, + S: { + "4100": "RC" + } + }, + B: 5, + C: "Synchronous Clipboard API" +}; + +},{}],145:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "16": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H", + "132": "Q J K L X Y Z a b c d e f g h" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "16": "G W I 0B YB", + "132": "D F E dB eB fB", + "260": "cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "16": "E B lB mB nB oB R VB", + "132": "Q J" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB", + "132": "F rB IB tB uB vB wB xB yB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "16": "BC CC", + "132": "KB G DC EC IB" + }, + J: { + "132": "D A" + }, + K: { + "1": "C P BB", + "16": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Node.compareDocumentPosition()" +}; + +},{}],146:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D iB", + "132": "F E" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "2": "E lB mB nB oB" + }, + G: { + "1": "YB rB IB tB", + "513": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "4097": "AC" + }, + I: { + "1025": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "258": "D A" + }, + K: { + "2": "A", + "258": "B C P R VB BB" + }, + L: { + "1025": "S" + }, + M: { + "2049": "N" + }, + N: { + "258": "A B" + }, + O: { + "258": "HC" + }, + P: { + "1025": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1025": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Basic console logging functions" +}; + +},{}],147:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "2": "E lB mB nB oB", + "16": "B" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "16": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "console.time and console.timeEnd" +}; + +},{}],148:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "2052": "B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "132": "sB KB G W I D F E A B C pB hB", + "260": "O H Q J K L X Y Z a b c d e f g h i j k l m n" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "260": "G W I D F E A B C O H Q J K L X Y", + "772": "Z a b c d e f g h i j k l m n o p q r s", + "1028": "0 t u v w x P z" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "260": "G W 0B YB", + "772": "I D F E cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E lB", + "132": "B mB nB oB R VB", + "644": "C qB BB", + "772": "Q J K L X Y Z a b c d e f", + "1028": "g h i j k l m n" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "260": "YB rB IB", + "772": "F tB uB vB wB xB yB" + }, + H: { + "644": "AC" + }, + I: { + "1": "M", + "16": "BC CC", + "260": "DC", + "772": "KB G EC IB FC GC" + }, + J: { + "772": "D A" + }, + K: { + "1": "P", + "132": "A B R VB", + "644": "C BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "1028": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1028": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "const" +}; + +},{}],149:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "900": "A B" + }, + B: { + "1": "K L V y M WB S", + "388": "H Q J", + "900": "C O" + }, + C: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "260": "1 2", + "388": "0 h i j k l m n o p q r s t u v w x P z", + "900": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H", + "388": "d e f g h i j k l m n o p q r", + "900": "Q J K L X Y Z a b c" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "16": "G W 0B YB", + "388": "F E eB fB", + "900": "I D cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E B lB mB nB oB R VB", + "388": "Q J K L X Y Z a b c d e", + "900": "C qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB", + "388": "F vB wB xB yB", + "900": "tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "16": "KB BC CC DC", + "388": "FC GC", + "900": "G EC IB" + }, + J: { + "16": "D", + "388": "A" + }, + K: { + "1": "P", + "16": "A B R VB", + "900": "C BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "900": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "388": "RC" + } + }, + B: 1, + C: "Constraint Validation API" +}; + +},{}],150:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB", + "4": "KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P BB", + "2": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "contenteditable attribute (basic support)" +}; + +},{}],151:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "132": "A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "129": "G W I D F E A B C O H Q J K L X Y Z a" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O", + "257": "H Q J K L X Y Z a b c" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G W 0B YB", + "257": "I dB", + "260": "cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB", + "257": "uB", + "260": "tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D", + "257": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "257": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Content Security Policy 1.0" +}; + +},{}],152:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H", + "32772": "Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i pB hB", + "132": "j k l m", + "260": "n", + "516": "o p q r s t u v w", + "8196": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n", + "1028": "o p q", + "2052": "r" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a lB mB nB oB R VB qB BB", + "1028": "b c d", + "2052": "e" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "4100": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "8196": "RC" + } + }, + B: 2, + C: "Content Security Policy Level 2" +}; + +},{}],153:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D iB", + "132": "A", + "260": "F E" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB", + "1025": "JB EB FB GB HB DB U N T MB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C" + }, + E: { + "2": "0B YB", + "513": "I D F E A B C O H dB eB fB XB R BB jB kB", + "644": "G W cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB" + }, + G: { + "513": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "644": "YB rB IB tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "132": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "132": "D" + }, + K: { + "1": "C P BB", + "2": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "132": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Cross-Origin Resource Sharing" +}; + +},{}],154:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t pB hB", + "3076": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "132": "2 3", + "260": "4 5", + "516": "6 7 8 9 AB" + }, + E: { + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB", + "16": "H jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o lB mB nB oB R VB qB BB", + "132": "p q", + "260": "r s", + "516": "t u v w x" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "3076": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "16": "G IC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "3076": "RC" + } + }, + B: 1, + C: "createImageBitmap" +}; + +},{}],155:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "66": "0 1 2", + "129": "3 4 5 6 7 8" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G IC JC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Credential Management API" +}; + +},{}],156:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "8": "I D F E A", + "164": "B" + }, + B: { + "1": "V y M WB S", + "513": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "8": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j pB hB", + "66": "k l" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "8": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o" + }, + E: { + "1": "B C O H R BB jB kB", + "8": "G W I D 0B YB cB dB", + "289": "F E A eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "8": "E B C Q J K L X Y Z a b lB mB nB oB R VB qB BB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "8": "YB rB IB tB uB vB", + "289": "F wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "8": "KB G BC CC DC EC IB FC GC" + }, + J: { + "8": "D A" + }, + K: { + "1": "P", + "8": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "8": "A", + "164": "B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Web Cryptography" +}; + +},{}],157:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b lB mB nB oB R VB qB BB" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M GC", + "2": "KB G BC CC DC EC IB FC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS all property" +}; + +},{}],158:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G pB hB", + "33": "W I D F E A B C O H Q" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "0B YB", + "33": "I D F cB dB eB", + "292": "G W" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB", + "33": "C Q J K L X Y Z a b c d e f g h" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "33": "F uB vB wB", + "164": "YB rB IB tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "33": "G EC IB FC GC", + "164": "KB BC CC DC" + }, + J: { + "33": "D A" + }, + K: { + "1": "P BB", + "2": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "33": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS Animation" +}; + +},{}],159:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "16": "sB", + "33": "0 1 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H", + "33": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "16": "G W I 0B YB cB", + "33": "D F dB eB" + }, + F: { + "1": "4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "33": "0 1 2 3 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB", + "33": "F uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "16": "KB G BC CC DC EC IB", + "33": "FC GC" + }, + J: { + "16": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "33": "HC" + }, + P: { + "1": "MC XB NC OC", + "16": "G", + "33": "IC JC KC LC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "33": "RC" + } + }, + B: 5, + C: "CSS :any-link selector" +}; + +},{}],160:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "S", + "33": "WB", + "164": "V y M", + "388": "C O H Q J K L" + }, + C: { + "1": "y M", + "164": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V", + "676": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m pB hB" + }, + D: { + "1": "S gB bB aB", + "33": "WB", + "164": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + E: { + "164": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "164": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "164": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "164": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "164": "D A" + }, + K: { + "2": "A B C R VB BB", + "164": "P" + }, + L: { + "1": "S" + }, + M: { + "164": "N" + }, + N: { + "2": "A", + "388": "B" + }, + O: { + "164": "HC" + }, + P: { + "164": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "164": "PC" + }, + R: { + "164": "QC" + }, + S: { + "164": "RC" + } + }, + B: 5, + C: "CSS Appearance" +}; + +},{}],161:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "194": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p lB mB nB oB R VB qB BB", + "194": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "194": "P" + }, + L: { + "194": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G", + "194": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "194": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS @apply rule" +}; + +},{}],162:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k pB hB", + "132": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "132": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "132": "RC" + } + }, + B: 4, + C: "CSS Counter Styles" +}; + +},{}],163:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J", + "257": "K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T pB hB", + "578": "MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P", + "194": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB" + }, + E: { + "2": "G W I D F 0B YB cB dB eB", + "33": "E A B C O H fB XB R BB jB kB" + }, + F: { + "1": "GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l lB mB nB oB R VB qB BB", + "194": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB CB EB FB" + }, + G: { + "2": "F YB rB IB tB uB vB wB", + "33": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "194": "P" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "OC", + "2": "G", + "194": "IC JC KC LC MC XB NC" + }, + Q: { + "194": "PC" + }, + R: { + "194": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS Backdrop Filter" +}; + +},{}],164:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS background-position edge offsets" +}; + +},{}],165:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m", + "260": "P" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D 0B YB cB dB", + "132": "F E A eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z lB mB nB oB R VB qB BB", + "260": "l" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB", + "132": "F wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "260": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS background-blend-mode" +}; + +},{}],166:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "164": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j pB hB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z", + "164": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I 0B YB cB", + "164": "D F E A B C O H dB eB fB XB R BB jB kB" + }, + F: { + "2": "E lB mB nB oB", + "129": "B C R VB qB BB", + "164": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "YB rB IB tB uB", + "164": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "132": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "164": "M FC GC" + }, + J: { + "2": "D", + "164": "A" + }, + K: { + "2": "A", + "129": "B C R VB BB", + "164": "P" + }, + L: { + "164": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "164": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "164": "PC" + }, + R: { + "164": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS box-decoration-break" +}; + +},{}],167:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "33": "pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "G W I D F E" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "33": "W", + "164": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "33": "rB IB", + "164": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "164": "KB BC CC DC" + }, + J: { + "1": "A", + "33": "D" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS3 Box-shadow" +}; + +},{}],168:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "16": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "2": "0B YB", + "33": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "33": "Q J K L X Y Z a b c d e f g h i j k l m" + }, + G: { + "33": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "M", + "33": "KB G BC CC DC EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "IC JC KC LC MC XB NC OC", + "33": "G" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS Canvas Drawings" +}; + +},{}],169:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G IC JC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "CSS caret-color" +}; + +},{}],170:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P pB hB" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Case-insensitive CSS attribute selectors" +}; + +},{}],171:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K", + "260": "V y M WB S", + "3138": "L" + }, + C: { + "1": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P pB hB", + "644": "0 1 2 3 4 5 z" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b", + "260": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "292": "0 1 2 3 4 5 6 c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "2": "G W I 0B YB cB dB", + "292": "D F E A B C O H eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "260": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T", + "292": "Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t" + }, + G: { + "2": "YB rB IB tB uB", + "292": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "260": "M", + "292": "FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "292": "P" + }, + L: { + "260": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "292": "HC" + }, + P: { + "292": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "292": "PC" + }, + R: { + "260": "QC" + }, + S: { + "644": "RC" + } + }, + B: 4, + C: "CSS clip-path property (for HTML)" +}; + +},{}],172:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "33": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "16": "G W I D F E A B C O H Q J K L", + "33": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W 0B YB cB", + "33": "I D F E A B C O H dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "33": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "16": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "16": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "16": "S" + }, + M: { + "1": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "16": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "33": "PC" + }, + R: { + "16": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS color-adjust" +}; + +},{}],173:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS color function" +}; + +},{}],174:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB pB hB", + "578": "RB SB TB UB V y M" + }, + D: { + "1": "T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB", + "194": "LB CB JB EB FB GB HB DB U N" + }, + E: { + "1": "O H BB jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R" + }, + F: { + "1": "GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x lB mB nB oB R VB qB BB", + "194": "0 1 2 3 4 5 6 7 8 9 P z AB CB EB FB" + }, + G: { + "1": "4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "XB NC OC", + "2": "G IC JC KC LC MC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS Conical Gradients" +}; + +},{}],175:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s pB hB", + "322": "0 1 2 3 t u v w x P z", + "336": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N" + }, + D: { + "1": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "3" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p lB mB nB oB R VB qB BB", + "194": "q r" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "322": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G IC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "322": "RC" + } + }, + B: 4, + C: "CSS Containment" +}; + +},{}],176:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "F E A B", + "2": "I D iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS Counters" +}; + +},{}],177:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I iB", + "2340": "D F E A B" + }, + B: { + "2": "C O H Q J K L", + "1025": "V y M WB S" + }, + C: { + "2": "sB KB pB", + "513": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "545": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB hB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s", + "1025": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W 0B YB cB", + "164": "I", + "4644": "D F E dB eB fB" + }, + F: { + "2": "E B Q J K L X Y Z a b c d e f lB mB nB oB R VB", + "545": "C qB BB", + "1025": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB", + "4260": "tB uB", + "4644": "F vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "1025": "M" + }, + J: { + "2": "D", + "4260": "A" + }, + K: { + "2": "A B R VB", + "545": "C BB", + "1025": "P" + }, + L: { + "1025": "S" + }, + M: { + "545": "N" + }, + N: { + "2340": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1025": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1025": "PC" + }, + R: { + "1025": "QC" + }, + S: { + "4097": "RC" + } + }, + B: 7, + C: "Crisp edges/pixelated images" +}; + +},{}],178:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "33": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "G W I D F E A B C O H Q J", + "33": "0 1 2 3 4 5 6 7 8 9 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W 0B YB", + "33": "I D F E cB dB eB fB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "33": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB", + "33": "F tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "33": "M FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "33": "P" + }, + L: { + "33": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "33": "HC" + }, + P: { + "33": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "33": "PC" + }, + R: { + "33": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "CSS Cross-Fade Function" +}; + +},{}],179:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "16": "sB KB pB hB" + }, + D: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H", + "132": "0 1 2 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "16": "G W 0B YB", + "132": "I D F E A cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E B lB mB nB oB R VB", + "132": "Q J K L X Y Z a b c d e f g h i j k l m n o p", + "260": "C qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB uB", + "132": "F vB wB xB yB zB" + }, + H: { + "260": "AC" + }, + I: { + "1": "M", + "16": "KB BC CC DC", + "132": "G EC IB FC GC" + }, + J: { + "16": "D", + "132": "A" + }, + K: { + "1": "P", + "16": "A B C R VB", + "260": "BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "132": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "132": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: ":default CSS pseudo-class" +}; + +},{}],180:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L y M WB S", + "16": "V" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S", + "16": "gB bB aB" + }, + E: { + "1": "B", + "2": "G W I D F E A C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Explicit descendant combinator >>" +}; + +},{}],181:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "164": "A B" + }, + B: { + "66": "V y M WB S", + "164": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g", + "66": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r lB mB nB oB R VB qB BB", + "66": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "292": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A P", + "292": "B C R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "164": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "66": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS Device Adaptation" +}; + +},{}],182:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J pB hB", + "33": "0 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "33": "RC" + } + }, + B: 5, + C: ":dir() CSS pseudo-class" +}; + +},{}],183:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "260": "V y M WB S" + }, + C: { + "1": "EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o pB hB", + "260": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "AB LB CB JB EB FB GB", + "260": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "H jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB", + "260": "O", + "772": "C R BB" + }, + F: { + "2": "0 1 2 3 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "260": "4 5 6 7 8 9 AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B", + "260": "2B 3B 4B 5B 6B 7B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "260": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "260": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC", + "260": "MC XB NC OC" + }, + Q: { + "260": "PC" + }, + R: { + "2": "QC" + }, + S: { + "260": "RC" + } + }, + B: 5, + C: "CSS display: contents" +}; + +},{}],184:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "33": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "164": "sB KB pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "33": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "33": "RC" + } + }, + B: 5, + C: "CSS element() function" +}; + +},{}],185:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB pB hB" + }, + D: { + "1": "T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "132": "B" + }, + F: { + "1": "8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 6 7 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB", + "132": "1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "XB NC OC", + "2": "G IC JC KC LC MC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS Environment Variables env()" +}; + +},{}],186:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "33": "A B" + }, + B: { + "2": "V y M WB S", + "33": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "33": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS Exclusions Level 1" +}; + +},{}],187:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B C lB mB nB oB R VB qB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS Feature Queries" +}; + +},{}],188:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB", + "33": "E" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB", + "33": "xB yB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS filter() function" +}; + +},{}],189:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "1028": "O H Q J K L", + "1346": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB", + "196": "m", + "516": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l hB" + }, + D: { + "1": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K", + "33": "0 1 2 3 4 L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W 0B YB cB", + "33": "I D F E dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "33": "Q J K L X Y Z a b c d e f g h i j k l m n o p q r" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB", + "33": "F uB vB wB xB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB", + "33": "FC GC" + }, + J: { + "2": "D", + "33": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "33": "G IC JC" + }, + Q: { + "1": "PC" + }, + R: { + "33": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS Filter Effects" +}; + +},{}],190:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "16": "iB", + "516": "F", + "1540": "I D" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "132": "KB", + "260": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "W I D F", + "132": "G" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "W 0B", + "132": "G YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "16": "E lB", + "260": "B mB nB oB R VB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "16": "BC CC", + "132": "DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "C P BB", + "260": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "::first-letter CSS pseudo-element selector" +}; + +},{}],191:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "132": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS first-line pseudo-element" +}; + +},{}],192:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "D F E A B", + "2": "iB", + "8": "I" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB XB R BB jB kB", + "1025": "fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB", + "132": "tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB M FC GC", + "260": "BC CC DC", + "513": "G EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS position:fixed" +}; + +},{}],193:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "328": "V y M WB S" + }, + C: { + "2": "sB KB pB hB", + "161": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB", + "328": "U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB lB mB nB oB R VB qB BB", + "328": "DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "328": "S" + }, + M: { + "161": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "161": "RC" + } + }, + B: 7, + C: ":focus-visible CSS pseudo-class" +}; + +},{}],194:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB", + "194": "LB" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x lB mB nB oB R VB qB BB", + "194": "P" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "16": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: ":focus-within CSS pseudo-class" +}; + +},{}],195:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x pB hB", + "322": "0 1 2 3 4 5 6 7 8 9 P z" + }, + D: { + "1": "CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "1 2 3 4 5 6 7 8 9 AB LB" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n lB mB nB oB R VB qB BB", + "194": "o p q r s t u v w x P" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "194": "P" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G", + "194": "IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "322": "RC" + } + }, + B: 5, + C: "CSS font-rendering controls" +}; + +},{}],196:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS font-stretch" +}; + +},{}],197:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D iB", + "132": "F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS Generated content for pseudo-elements" +}; + +},{}],198:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB", + "260": "J K L X Y Z a b c d e f g h i j k l m n", + "292": "G W I D F E A B C O H Q hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "A B C O H Q J K L X Y Z a b c d", + "548": "G W I D F E" + }, + E: { + "2": "0B YB", + "260": "D F E A B C O H dB eB fB XB R BB jB kB", + "292": "I cB", + "804": "G W" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB", + "33": "C qB", + "164": "R VB" + }, + G: { + "260": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "292": "tB uB", + "804": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "33": "G EC IB", + "548": "KB BC CC DC" + }, + J: { + "1": "A", + "548": "D" + }, + K: { + "1": "P BB", + "2": "A B", + "33": "C", + "164": "R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS Gradients" +}; + +},{}],199:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "8": "E", + "292": "A B" + }, + B: { + "1": "J K L V y M WB S", + "292": "C O H Q" + }, + C: { + "1": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L pB hB", + "8": "X Y Z a b c d e f g h i j k l m n o p q r", + "584": "0 1 2 3 s t u v w x P z", + "1025": "4 5" + }, + D: { + "1": "AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c", + "8": "d e f g", + "200": "0 1 2 3 4 5 6 7 8 h i j k l m n o p q r s t u v w x P z", + "1025": "9" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W 0B YB cB", + "8": "I D F E A dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f lB mB nB oB R VB qB BB", + "200": "g h i j k l m n o p q r s t u v" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB", + "8": "F uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC", + "8": "IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "292": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "IC", + "8": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS Grid Layout (level 1)" +}; + +},{}],200:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS hanging-punctuation" +}; + +},{}],201:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: ":has() CSS relational pseudo-class" +}; + +},{}],202:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "16": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "16": "C O H Q J K L" + }, + C: { + "16": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "0 1 2 3 4 5 6 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "16": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "16": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "16": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "16": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "16": "S" + }, + M: { + "16": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "16": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "16": "RC" + } + }, + B: 5, + C: "CSS4 Hyphenation" +}; + +},{}],203:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "33": "A B" + }, + B: { + "33": "C O H Q J K L", + "132": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W pB hB", + "33": "I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u" + }, + D: { + "2": "0 1 2 3 4 5 6 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "132": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W 0B YB", + "33": "I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t lB mB nB oB R VB qB BB", + "132": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "YB rB", + "33": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "132": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "132": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "4": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G", + "132": "IC" + }, + Q: { + "2": "PC" + }, + R: { + "132": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS Hyphenation" +}; + +},{}],204:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y", + "257": "M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y", + "257": "M WB S gB bB aB" + }, + E: { + "1": "H kB", + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB jB" + }, + F: { + "1": "N T", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U lB mB nB oB R VB qB BB" + }, + G: { + "1": "9B", + "132": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS3 image-orientation" +}; + +},{}],205:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "33": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y", + "33": "0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W 0B YB cB", + "33": "I D F E dB eB fB", + "129": "A B C O H XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "33": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "YB rB IB tB", + "33": "F uB vB wB xB yB", + "129": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "33": "M FC GC" + }, + J: { + "2": "D", + "33": "A" + }, + K: { + "2": "A B C R VB BB", + "33": "P" + }, + L: { + "33": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "33": "HC" + }, + P: { + "33": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "33": "PC" + }, + R: { + "33": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS image-set" +}; + +},{}],206:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C", + "260": "O H Q J K L" + }, + C: { + "1": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB", + "516": "0 1 h i j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G", + "16": "W I D F E A B C O H", + "260": "4", + "772": "0 1 2 3 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G 0B YB", + "16": "W", + "772": "I D F E A cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E lB", + "260": "B C r mB nB oB R VB qB BB", + "772": "Q J K L X Y Z a b c d e f g h i j k l m n o p q" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB", + "772": "F tB uB vB wB xB yB zB" + }, + H: { + "132": "AC" + }, + I: { + "1": "M", + "2": "KB BC CC DC", + "260": "G EC IB FC GC" + }, + J: { + "2": "D", + "260": "A" + }, + K: { + "1": "P", + "260": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "260": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "516": "RC" + } + }, + B: 5, + C: ":in-range and :out-of-range CSS pseudo-classes" +}; + +},{}],207:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "132": "A B", + "388": "E" + }, + B: { + "1": "V y M WB S", + "132": "C O H Q J K L" + }, + C: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "16": "sB KB pB hB", + "132": "0 1 2 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "388": "G W" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H", + "132": "Q J K L X Y Z a b c d e f g h i j k l m n o p q" + }, + E: { + "1": "B C O H XB R BB jB kB", + "16": "G W I 0B YB", + "132": "D F E A dB eB fB", + "388": "cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E B lB mB nB oB R VB", + "132": "Q J K L X Y Z a b c d", + "516": "C qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB uB", + "132": "F vB wB xB yB zB" + }, + H: { + "516": "AC" + }, + I: { + "1": "M", + "16": "KB BC CC DC GC", + "132": "FC", + "388": "G EC IB" + }, + J: { + "16": "D", + "132": "A" + }, + K: { + "1": "P", + "16": "A B C R VB", + "516": "BB" + }, + L: { + "1": "S" + }, + M: { + "132": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "132": "RC" + } + }, + B: 7, + C: ":indeterminate CSS pseudo-class" +}; + +},{}],208:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F 0B YB cB dB eB", + "4": "E", + "164": "A B C O H fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB", + "164": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS Initial Letter" +}; + +},{}],209:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "33": "G W I D F E A B C O H Q J K L pB hB", + "164": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "16": "0B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS initial value" +}; + +},{}],210:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "16": "iB", + "132": "I D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "16": "0B", + "132": "G W I YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E lB", + "132": "B C Q J mB nB oB R VB qB BB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "16": "BC CC", + "132": "KB G DC EC IB" + }, + J: { + "132": "D A" + }, + K: { + "1": "P", + "132": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "letter-spacing CSS property" +}; + +},{}],211:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J", + "33": "V y M WB S", + "129": "K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U pB hB", + "33": "N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "16": "G W I D F E A B C O", + "33": "0 1 2 3 4 5 6 7 8 9 H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G 0B YB", + "33": "W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "33": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "YB rB IB", + "33": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "16": "BC CC", + "33": "KB G M DC EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "2": "A B C R VB BB", + "33": "P" + }, + L: { + "33": "S" + }, + M: { + "33": "N" + }, + N: { + "2": "A B" + }, + O: { + "33": "HC" + }, + P: { + "33": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "33": "PC" + }, + R: { + "33": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS line-clamp" +}; + +},{}],212:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB", + "164": "KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s pB hB" + }, + D: { + "1": "T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "292": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N" + }, + E: { + "1": "O H BB jB kB", + "292": "G W I D F E A B C 0B YB cB dB eB fB XB R" + }, + F: { + "1": "DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "292": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB" + }, + G: { + "1": "4B 5B 6B 7B 8B 9B", + "292": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "292": "KB G BC CC DC EC IB FC GC" + }, + J: { + "292": "D A" + }, + K: { + "2": "A B C R VB BB", + "292": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "292": "HC" + }, + P: { + "1": "XB NC OC", + "292": "G IC JC KC LC MC" + }, + Q: { + "292": "PC" + }, + R: { + "292": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS Logical Properties" +}; + +},{}],213:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U pB hB" + }, + D: { + "1": "bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB" + }, + E: { + "2": "G W I D F E A B 0B YB cB dB eB fB XB", + "129": "C O H R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS ::marker pseudo-element" +}; + +},{}],214:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J", + "164": "V y M WB S", + "3138": "K", + "12292": "L" + }, + C: { + "1": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "260": "0 1 2 3 4 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "164": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "0B YB", + "164": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "164": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "164": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "164": "M FC GC", + "676": "KB G BC CC DC EC IB" + }, + J: { + "164": "D A" + }, + K: { + "2": "A B C R VB BB", + "164": "P" + }, + L: { + "164": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "164": "HC" + }, + P: { + "164": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "164": "PC" + }, + R: { + "164": "QC" + }, + S: { + "260": "RC" + } + }, + B: 4, + C: "CSS Masks" +}; + +},{}],215:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "8388": "V y M WB S" + }, + C: { + "16": "sB KB pB hB", + "548": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB", + "4097": "UB V y M" + }, + D: { + "16": "G W I D F E A B C O H", + "164": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB", + "196": "HB DB U", + "8388": "N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G 0B YB", + "16": "W", + "164": "I D F cB dB eB", + "260": "E A B C O fB XB R BB jB", + "3073": "H kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "164": "0 1 2 3 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "196": "4 5 6", + "8388": "7 8 9 AB CB EB FB GB HB DB U N T" + }, + G: { + "16": "YB rB IB tB uB", + "164": "F vB wB", + "260": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B", + "3073": "9B" + }, + H: { + "2": "AC" + }, + I: { + "16": "KB BC CC DC", + "164": "G M EC IB FC GC" + }, + J: { + "16": "D", + "164": "A" + }, + K: { + "2": "A B C R VB BB", + "164": "P" + }, + L: { + "8388": "S" + }, + M: { + "548": "N" + }, + N: { + "2": "A B" + }, + O: { + "164": "HC" + }, + P: { + "164": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "8388": "PC" + }, + R: { + "164": "QC" + }, + S: { + "548": "RC" + } + }, + B: 5, + C: ":is() CSS pseudo-class" +}; + +},{}],216:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB pB hB" + }, + D: { + "1": "V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB" + }, + E: { + "1": "H jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB", + "132": "C O R BB" + }, + F: { + "1": "DB U N T", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB lB mB nB oB R VB qB BB" + }, + G: { + "1": "8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B", + "132": "2B 3B 4B 5B 6B 7B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "OC", + "2": "G IC JC KC LC MC XB NC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS math functions min(), max() and clamp()" +}; + +},{}],217:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Media Queries: interaction media features" +}; + +},{}],218:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "132": "E A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "260": "G W I D F E A B C O H Q pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "548": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g" + }, + E: { + "2": "0B YB", + "548": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E", + "548": "B C lB mB nB oB R VB qB" + }, + G: { + "16": "YB", + "548": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "132": "AC" + }, + I: { + "1": "M FC GC", + "16": "BC CC", + "548": "KB G DC EC IB" + }, + J: { + "548": "D A" + }, + K: { + "1": "P BB", + "548": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Media Queries: resolution feature" +}; + +},{}],219:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "16": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "16": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S", + "16": "gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Media Queries: scripting media feature" +}; + +},{}],220:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "8": "I D F iB", + "129": "E A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "129": "G W I D F E A B C O H Q J K L X Y Z a b c d" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "129": "G W I cB", + "388": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "129": "YB rB IB tB uB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "129": "KB G BC CC DC EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "129": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS3 Media Queries" +}; + +},{}],221:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g", + "194": "h i j k l m n o p q r s" + }, + E: { + "2": "G W I D 0B YB cB dB", + "260": "F E A B C O H eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g lB mB nB oB R VB qB BB" + }, + G: { + "2": "YB rB IB tB uB vB", + "260": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Blending of HTML/SVG elements" +}; + +},{}],222:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u", + "194": "v w x" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h lB mB nB oB R VB qB BB", + "194": "i j k" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS Motion Path" +}; + +},{}],223:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS namespaces" +}; + +},{}],224:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L y M WB S", + "16": "V" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V pB hB", + "16": "y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S", + "16": "gB bB aB" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "selector list argument of :not()" +}; + +},{}],225:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "selector list argument of :nth-child and :nth-last-child CSS pseudo-classes" +}; + +},{}],226:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "4": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS3 Opacity" +}; + +},{}],227:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E lB", + "132": "B C mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "132": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "132": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: ":optional CSS pseudo-class" +}; + +},{}],228:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB pB hB" + }, + D: { + "1": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS overflow-anchor (Scroll Anchoring)" +}; + +},{}],229:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "388": "I D F E A B iB" + }, + B: { + "260": "V y M WB S", + "388": "C O H Q J K L" + }, + C: { + "260": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "388": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB pB hB" + }, + D: { + "260": "N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "388": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U" + }, + E: { + "260": "H jB kB", + "388": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB" + }, + F: { + "260": "7 8 9 AB CB EB FB GB HB DB U N T", + "388": "0 1 2 3 4 5 6 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "260": "8B 9B", + "388": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B" + }, + H: { + "388": "AC" + }, + I: { + "388": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "388": "D A" + }, + K: { + "388": "A B C P R VB BB" + }, + L: { + "260": "S" + }, + M: { + "260": "N" + }, + N: { + "388": "A B" + }, + O: { + "388": "HC" + }, + P: { + "388": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "388": "PC" + }, + R: { + "388": "QC" + }, + S: { + "388": "RC" + } + }, + B: 5, + C: "CSS overflow property" +}; + +},{}],230:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "132": "A B" + }, + B: { + "1": "V y M WB S", + "132": "C O H Q J K", + "516": "L" + }, + C: { + "1": "LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB pB hB" + }, + D: { + "1": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB", + "260": "FB GB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "260": "2 3" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "132": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS overscroll-behavior" +}; + +},{}],231:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "388": "A B", + "900": "I D F E iB" + }, + B: { + "388": "C O H Q J K L", + "900": "V y M WB S" + }, + C: { + "772": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "900": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB pB hB" + }, + D: { + "900": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "772": "A", + "900": "G W I D F E B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "16": "E lB", + "129": "B C mB nB oB R VB qB BB", + "900": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "900": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "129": "AC" + }, + I: { + "900": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "900": "D A" + }, + K: { + "129": "A B C R VB BB", + "900": "P" + }, + L: { + "900": "S" + }, + M: { + "900": "N" + }, + N: { + "388": "A B" + }, + O: { + "900": "HC" + }, + P: { + "900": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "900": "PC" + }, + R: { + "900": "QC" + }, + S: { + "900": "RC" + } + }, + B: 2, + C: "CSS page-break properties" +}; + +},{}],232:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D iB", + "132": "F E A B" + }, + B: { + "1": "V y M WB S", + "132": "C O H Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L pB hB", + "132": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "132": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "16": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C R VB BB", + "258": "P" + }, + L: { + "1": "S" + }, + M: { + "132": "N" + }, + N: { + "258": "A B" + }, + O: { + "258": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "132": "RC" + } + }, + B: 5, + C: "CSS Paged Media (@page)" +}; + +},{}],233:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB" + }, + E: { + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R", + "194": "O H BB jB kB" + }, + F: { + "1": "4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS Paint API" +}; + +},{}],234:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "292": "A B" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "164": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "164": "RC" + } + }, + B: 5, + C: ":placeholder-shown CSS pseudo-class" +}; + +},{}],235:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "36": "C O H Q J K L" + }, + C: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L pB hB", + "33": "0 1 2 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "36": "0 1 2 3 4 5 6 7 8 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G 0B YB", + "36": "W I D F E A cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "36": "Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB", + "36": "F IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "36": "KB G BC CC DC EC IB FC GC" + }, + J: { + "36": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "36": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "36": "G IC JC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "33": "RC" + } + }, + B: 5, + C: "::placeholder CSS pseudo-element" +}; + +},{}],236:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "2": "C" + }, + C: { + "1": "UB V y M", + "16": "sB", + "33": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H", + "132": "Q J K L X Y Z a b c d e f g h i j k l m n" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "16": "0B YB", + "132": "G W I D F cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E B lB mB nB oB R", + "132": "C Q J K L X Y Z a VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB", + "132": "F IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "16": "BC CC", + "132": "KB G DC EC IB FC GC" + }, + J: { + "1": "A", + "132": "D" + }, + K: { + "1": "P", + "2": "A B R", + "132": "C VB BB" + }, + L: { + "1": "S" + }, + M: { + "33": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "33": "RC" + } + }, + B: 1, + C: "CSS :read-only and :read-write selectors" +}; + +},{}],237:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "132": "B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB", + "16": "dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c lB mB nB oB R VB qB BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Rebeccapurple color" +}; + +},{}],238:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "33": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "33": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "0B YB", + "33": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "33": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "33": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "33": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "2": "A B C R VB BB", + "33": "P" + }, + L: { + "33": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "33": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "33": "PC" + }, + R: { + "33": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS Reflections" +}; + +},{}],239:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "420": "A B" + }, + B: { + "2": "V y M WB S", + "420": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "36": "Q J K L", + "66": "X Y Z a b c d e f g h i j k l m" + }, + E: { + "2": "G W I C O H 0B YB cB R BB jB kB", + "33": "D F E A B dB eB fB XB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "YB rB IB tB uB 2B 3B 4B 5B 6B 7B 8B 9B", + "33": "F vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "420": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS Regions" +}; + +},{}],240:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB", + "33": "G W I D F E A B C O H Q hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E", + "33": "A B C O H Q J K L X Y Z a b c d" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB", + "33": "I cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB", + "33": "C qB", + "36": "R VB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB", + "33": "tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB BC CC DC", + "33": "G EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P BB", + "2": "A B", + "33": "C", + "36": "R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS Repeating Gradients" +}; + +},{}],241:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "33": "G" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB", + "132": "BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "CSS resize property" +}; + +},{}],242:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "S", + "2": "C O H Q J K L V y M WB" + }, + C: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB pB hB" + }, + D: { + "1": "S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS revert value" +}; + +},{}],243:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "4 5 6 7 8 9 AB LB CB JB" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q lB mB nB oB R VB qB BB", + "194": "0 1 2 3 r s t u v w x P z" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G", + "194": "IC JC KC" + }, + Q: { + "2": "PC" + }, + R: { + "194": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "#rrggbbaa hex color notation" +}; + +},{}],244:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "129": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n pB hB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s", + "129": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "450": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f lB mB nB oB R VB qB BB", + "129": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "450": "g h i j k l m n o p q r s t u v w x P z" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "129": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "129": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSSOM Scroll-behavior" +}; + +},{}],245:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "132": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "292": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB pB hB", + "3074": "FB", + "4100": "GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "292": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "16": "G W 0B YB", + "292": "I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "292": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "16": "YB rB IB tB uB", + "292": "vB", + "804": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "16": "BC CC", + "292": "KB G M DC EC IB FC GC" + }, + J: { + "292": "D A" + }, + K: { + "2": "A B C R VB BB", + "292": "P" + }, + L: { + "292": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "292": "HC" + }, + P: { + "292": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "292": "PC" + }, + R: { + "292": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS scrollbar styling" +}; + +},{}],246:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "D F E A B", + "2": "iB", + "8": "I" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS 2.1 selectors" +}; + +},{}],247:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "iB", + "8": "I", + "132": "D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "2": "0B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS3 selectors" +}; + +},{}],248:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "33": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "C P VB BB", + "16": "A B R" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "33": "RC" + } + }, + B: 5, + C: "::selection CSS pseudo-element" +}; + +},{}],249:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "322": "3 4 5 6 7 8 9 AB LB CB JB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l", + "194": "m n o" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D 0B YB cB dB", + "33": "F E A eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB", + "33": "F wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "CSS Shapes Level 1" +}; + +},{}],250:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "6308": "A", + "6436": "B" + }, + B: { + "1": "V y M WB S", + "6436": "C O H Q J K L" + }, + C: { + "1": "N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q pB hB", + "2052": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB LB CB JB EB FB GB HB DB U" + }, + D: { + "1": "T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB", + "8258": "DB U N" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F 0B YB cB dB eB", + "3108": "E A fB XB" + }, + F: { + "1": "GB HB DB U N T", + "2": "0 1 2 3 4 5 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "8258": "6 7 8 9 AB CB EB FB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB", + "3108": "xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2052": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "XB NC OC", + "2": "G IC JC KC LC MC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2052": "RC" + } + }, + B: 4, + C: "CSS Scroll Snap" +}; + +},{}],251:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q", + "1028": "V y M WB S", + "4100": "J K L" + }, + C: { + "1": "LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d pB hB", + "194": "e f g h i j", + "516": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB" + }, + D: { + "2": "0 1 2 3 G W I D F E A B C O H Q J K L X Y Z a p q r s t u v w x P z", + "322": "4 5 6 7 b c d e f g h i j k l m n o", + "1028": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "O H jB kB", + "2": "G W I 0B YB cB", + "33": "F E A B C eB fB XB R BB", + "2084": "D dB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q lB mB nB oB R VB qB BB", + "322": "r s t", + "1028": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "5B 6B 7B 8B 9B", + "2": "YB rB IB tB", + "33": "F wB xB yB zB ZB 1B 2B 3B 4B", + "2084": "uB vB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "1028": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "1028": "P" + }, + L: { + "1028": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1028": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G IC" + }, + Q: { + "1028": "PC" + }, + R: { + "2": "QC" + }, + S: { + "516": "RC" + } + }, + B: 5, + C: "CSS position:sticky" +}; + +},{}],252:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS Subgrid" +}; + +},{}],253:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "260": "C O H Q J K L" + }, + C: { + "1": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X pB hB", + "66": "Y Z", + "260": "0 1 2 3 4 5 6 a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f", + "260": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB", + "132": "BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "132": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB", + "132": "BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS.supports() API" +}; + +},{}],254:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "F E A B", + "2": "I D iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "132": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS Table display" +}; + +},{}],255:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "132": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "4": "C O H Q J K L" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B pB hB", + "33": "0 C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m", + "322": "n o p q r s t u v w x P" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z lB mB nB oB R VB qB BB", + "578": "a b c d e f g h i j k l" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "33": "RC" + } + }, + B: 5, + C: "CSS3 text-align-last" +}; + +},{}],256:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "132": "I D F E A B iB" + }, + B: { + "132": "C O H Q J K L", + "388": "V y M WB S" + }, + C: { + "132": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "132": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p", + "388": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "132": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "132": "E B C Q J K L X Y Z a b c lB mB nB oB R VB qB BB", + "388": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "132": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "132": "AC" + }, + I: { + "132": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "132": "D A" + }, + K: { + "132": "A B C R VB BB", + "388": "P" + }, + L: { + "388": "S" + }, + M: { + "132": "N" + }, + N: { + "132": "A B" + }, + O: { + "132": "HC" + }, + P: { + "132": "G", + "388": "IC JC KC LC MC XB NC OC" + }, + Q: { + "388": "PC" + }, + R: { + "388": "QC" + }, + S: { + "132": "RC" + } + }, + B: 5, + C: "CSS text-indent" +}; + +},{}],257:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "16": "I D iB", + "132": "F E A B" + }, + B: { + "132": "C O H Q J K L", + "322": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "1025": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "1602": "6" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u", + "322": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h lB mB nB oB R VB qB BB", + "322": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "322": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "322": "P" + }, + L: { + "322": "S" + }, + M: { + "1025": "N" + }, + N: { + "132": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G", + "322": "IC JC KC LC MC XB NC OC" + }, + Q: { + "322": "PC" + }, + R: { + "322": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS text-justify" +}; + +},{}],258:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p pB hB", + "194": "q r s" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "2": "G W I D F E 0B YB cB dB eB fB", + "16": "A", + "33": "B C O H XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS text-orientation" +}; + +},{}],259:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D iB", + "161": "F E A B" + }, + B: { + "2": "V y M WB S", + "161": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "16": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS Text 4 text-spacing" +}; + +},{}],260:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "129": "A B" + }, + B: { + "1": "V y M WB S", + "129": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "260": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "4": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "A", + "4": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "129": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS3 Text-shadow" +}; + +},{}],261:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "132": "B", + "164": "A" + }, + B: { + "1": "V y M WB S", + "132": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "260": "7" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t lB mB nB oB R VB qB BB", + "260": "u" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "132": "B", + "164": "A" + }, + O: { + "2": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "16": "G" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "CSS touch-action level 2 values" +}; + +},{}],262:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E iB", + "289": "A" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB", + "194": "0 1 2 3 h i j k l m n o p q r s t u v w x P z", + "1025": "4 5 6 7 8" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a lB mB nB oB R VB qB BB" + }, + G: { + "1": "5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB", + "516": "yB zB ZB 1B 2B 3B 4B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "289": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "194": "RC" + } + }, + B: 2, + C: "CSS touch-action property" +}; + +},{}],263:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "33": "W I D F E A B C O H Q", + "164": "G" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "G W I D F E A B C O H Q J K L X Y Z a b c d" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "33": "I cB", + "164": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E lB mB", + "33": "C", + "164": "B nB oB R VB qB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "33": "uB", + "164": "YB rB IB tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "33": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "33": "D" + }, + K: { + "1": "P BB", + "33": "C", + "164": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS3 Transitions" +}; + +},{}],264:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "132": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "132": "C O H Q J K L" + }, + C: { + "1": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "33": "0 1 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "132": "sB KB G W I D F E pB hB", + "292": "A B C O H Q J" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C O H Q J", + "548": "K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "132": "G W I D F 0B YB cB dB eB", + "548": "E A B C O H fB XB R BB jB kB" + }, + F: { + "132": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "132": "F YB rB IB tB uB vB wB", + "548": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "1": "M", + "16": "KB G BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "16": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "16": "G" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "33": "RC" + } + }, + B: 4, + C: "CSS unicode-bidi property" +}; + +},{}],265:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "2": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f lB mB nB oB R VB qB BB" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS unset value" +}; + +},{}],266:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L V y M WB S", + "2": "C O H", + "260": "Q" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i pB hB" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "0" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m lB mB nB oB R VB qB BB", + "194": "n" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS Variables (Custom Properties)" +}; + +},{}],267:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D iB", + "129": "F E" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "129": "E B lB mB nB oB R VB qB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P BB", + "2": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 2, + C: "CSS widows & orphans" +}; + +},{}],268:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "132": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n pB hB", + "322": "o p q r s" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I", + "16": "D", + "33": "F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G 0B YB", + "16": "W", + "33": "I D F E A cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "33": "Q J K L X Y Z a b c d e f g h i j k l m" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB", + "33": "F tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "BC CC DC", + "33": "KB G EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "36": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "33": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS writing-mode property" +}; + +},{}],269:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D iB", + "129": "F E A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "129": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS zoom" +}; + +},{}],270:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "CSS3 attr() function for all properties" +}; + +},{}],271:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "F E A B", + "8": "I D iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "33": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "G W I D F E" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "33": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "33": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "33": "KB BC CC DC" + }, + J: { + "1": "A", + "33": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS3 Box-sizing" +}; + +},{}],272:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "4": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T mB nB oB R VB qB BB", + "2": "E", + "4": "lB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS3 Colors" +}; + +},{}],273:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "Q J K L V y M WB S", + "2": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "33": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e pB hB" + }, + D: { + "1": "N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U" + }, + E: { + "1": "B C O H R BB jB kB", + "33": "G W I D F E A 0B YB cB dB eB fB XB" + }, + F: { + "1": "7 8 9 C AB CB EB FB GB HB DB U N T qB BB", + "2": "E B lB mB nB oB R VB", + "33": "0 1 2 3 4 5 6 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "2": "A B C R VB BB", + "33": "P" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "33": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 3, + C: "CSS grab & grabbing cursors" +}; + +},{}],274:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "33": "sB KB G W I D F E A B C O H Q J K L X Y Z a b pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "33": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E B lB mB nB oB R VB", + "33": "Q J K L X Y Z a b" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "CSS3 Cursors: zoom-in & zoom-out" +}; + +},{}],275:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "132": "I D F iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "260": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "4": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "4": "G" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "4": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "260": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "16": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "CSS3 Cursors (original values)" +}; + +},{}],276:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "sB KB pB hB", + "33": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "164": "0 1 2 3 4 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y", + "132": "Z a b c d e f g h i j k l m n o p q r s t" + }, + E: { + "1": "H jB kB", + "2": "G W I 0B YB cB", + "132": "D F E A B C O dB eB fB XB R BB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E lB mB nB", + "132": "Q J K L X Y Z a b c d e f g", + "164": "B C oB R VB qB BB" + }, + G: { + "1": "8B 9B", + "2": "YB rB IB tB uB", + "132": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B" + }, + H: { + "164": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB", + "132": "FC GC" + }, + J: { + "132": "D A" + }, + K: { + "1": "P", + "2": "A", + "164": "B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "33": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "164": "RC" + } + }, + B: 5, + C: "CSS3 tab-size" +}; + +},{}],277:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS currentColor value" +}; + +},{}],278:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "8": "A B" + }, + B: { + "1": "V", + "2": "y M WB S", + "8": "C O H Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "66": "b c d e f g h", + "72": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e y M WB S gB bB aB", + "66": "f g h i j k" + }, + E: { + "2": "G W 0B YB cB", + "8": "I D F E A B C O H dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB", + "2": "E B C U N T lB mB nB oB R VB qB BB", + "66": "Q J K L X" + }, + G: { + "2": "YB rB IB tB uB", + "8": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "GC", + "2": "KB G M BC CC DC EC IB FC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "72": "RC" + } + }, + B: 7, + C: "Custom Elements (deprecated V0 spec)" +}; + +},{}],279:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "8": "A B" + }, + B: { + "1": "V y M WB S", + "8": "C O H Q J K L" + }, + C: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h pB hB", + "8": "0 1 i j k l m n o p q r s t u v w x P z", + "456": "2 3 4 5 6 7 8 9 AB", + "712": "LB CB JB EB" + }, + D: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "8": "4 5", + "132": "6 7 8 9 AB LB CB JB EB FB GB HB DB" + }, + E: { + "2": "G W I D 0B YB cB dB eB", + "8": "F E A fB", + "132": "B C O H XB R BB jB kB" + }, + F: { + "1": "GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s lB mB nB oB R VB qB BB", + "132": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB CB EB FB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB", + "132": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "132": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G", + "132": "IC" + }, + Q: { + "132": "PC" + }, + R: { + "132": "QC" + }, + S: { + "8": "RC" + } + }, + B: 1, + C: "Custom Elements (V1)" +}; + +},{}],280:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "132": "E A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W pB hB", + "132": "I D F E A" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G", + "16": "W I D F O H", + "388": "E A B C" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G 0B YB", + "16": "W I", + "388": "cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E lB mB nB oB", + "132": "B R VB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "rB", + "16": "YB IB", + "388": "tB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "BC CC DC", + "388": "KB G EC IB" + }, + J: { + "1": "A", + "388": "D" + }, + K: { + "1": "C P BB", + "2": "A", + "132": "B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "CustomEvent" +}; + +},{}],281:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "8": "I D F E", + "260": "A B" + }, + B: { + "1": "V y M WB S", + "260": "C O H Q", + "1284": "J K L" + }, + C: { + "8": "sB KB pB hB", + "4612": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "8": "G W I D F E A B C O H Q J K L X", + "132": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N" + }, + E: { + "1": "O H BB jB kB", + "8": "G W I D F E A B C 0B YB cB dB eB fB XB R" + }, + F: { + "1": "E B C GB HB DB U N T lB mB nB oB R VB qB BB", + "132": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB" + }, + G: { + "8": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B", + "2049": "4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "GC", + "8": "KB G BC CC DC EC IB FC", + "132": "M" + }, + J: { + "1": "A", + "8": "D" + }, + K: { + "1": "A B C R VB BB", + "8": "P" + }, + L: { + "1": "S" + }, + M: { + "516": "N" + }, + N: { + "8": "A B" + }, + O: { + "8": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "132": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Datalist element" +}; + +},{}],282:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "4": "I D F E A iB" + }, + B: { + "1": "C O H Q J", + "129": "K L V y M WB S" + }, + C: { + "1": "0 1 2 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "4": "sB KB G W pB hB", + "129": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 x P z", + "4": "G W I", + "129": "7 8 9 D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "4": "G W 0B YB", + "129": "I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "C k l m n o p q r s t R VB qB BB", + "4": "E B lB mB nB oB", + "129": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "4": "YB rB IB", + "129": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "4": "AC" + }, + I: { + "4": "BC CC DC", + "129": "KB G M EC IB FC GC" + }, + J: { + "129": "D A" + }, + K: { + "1": "C R VB BB", + "4": "A B", + "129": "P" + }, + L: { + "129": "S" + }, + M: { + "129": "N" + }, + N: { + "1": "B", + "4": "A" + }, + O: { + "129": "HC" + }, + P: { + "129": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "129": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "dataset & data-* attributes" +}; + +},{}],283:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D iB", + "132": "F", + "260": "E A B" + }, + B: { + "1": "V y M WB S", + "260": "C O Q J K L", + "772": "H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "260": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Data URIs" +}; + +},{}],284:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "16": "iB", + "132": "I D F E A B" + }, + B: { + "1": "L V y M WB S", + "132": "C O H Q J K" + }, + C: { + "1": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "132": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB", + "260": "4 5 6 7", + "772": "0 1 2 3 h i j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b", + "260": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T", + "772": "c d e f g h i j k l m n o p" + }, + E: { + "1": "C O H BB jB kB", + "16": "G W 0B YB", + "132": "I D F E A cB dB eB fB", + "260": "B XB R" + }, + F: { + "1": "9 AB CB EB FB GB HB DB U N T", + "16": "E B C lB mB nB oB R VB qB", + "132": "BB", + "260": "0 1 2 3 4 5 6 7 8 d e f g h i j k l m n o p q r s t u v w x P z", + "772": "Q J K L X Y Z a b c" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB", + "132": "F uB vB wB xB yB zB" + }, + H: { + "132": "AC" + }, + I: { + "1": "M", + "16": "KB BC CC DC", + "132": "G EC IB", + "772": "FC GC" + }, + J: { + "132": "D A" + }, + K: { + "1": "P", + "16": "A B C R VB", + "132": "BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "260": "HC" + }, + P: { + "1": "MC XB NC OC", + "260": "G IC JC KC LC" + }, + Q: { + "260": "PC" + }, + R: { + "132": "QC" + }, + S: { + "132": "RC" + } + }, + B: 6, + C: "Date.prototype.toLocaleDateString" +}; + +},{}],285:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "E A B iB", + "8": "I D F" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB", + "8": "KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P pB hB", + "194": "0 z" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "8": "G W I D F E A B", + "257": "X Y Z a b c d e f g h i j k l m n", + "769": "C O H Q J K L" + }, + E: { + "1": "C O H BB jB kB", + "8": "G W 0B YB cB", + "257": "I D F E A dB eB fB", + "1025": "B XB R" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "C R VB qB BB", + "8": "E B lB mB nB oB" + }, + G: { + "1": "F uB vB wB xB yB 2B 3B 4B 5B 6B 7B 8B 9B", + "8": "YB rB IB tB", + "1025": "zB ZB 1B" + }, + H: { + "8": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "8": "KB BC CC DC" + }, + J: { + "1": "A", + "8": "D" + }, + K: { + "1": "P", + "8": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "769": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Details & Summary elements" +}; + +},{}],286:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "132": "B" + }, + B: { + "1": "C O H Q J K L", + "4": "V y M WB S" + }, + C: { + "2": "sB KB pB", + "4": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "8": "G W hB" + }, + D: { + "2": "G W I", + "4": "0 1 2 3 4 5 6 7 8 9 D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "4": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "YB rB", + "4": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "BC CC DC", + "4": "KB G M EC IB FC GC" + }, + J: { + "2": "D", + "4": "A" + }, + K: { + "1": "C BB", + "2": "A B R VB", + "4": "P" + }, + L: { + "4": "S" + }, + M: { + "4": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "4": "HC" + }, + P: { + "4": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "4": "PC" + }, + R: { + "4": "QC" + }, + S: { + "4": "RC" + } + }, + B: 4, + C: "DeviceOrientation & DeviceMotion events" +}; + +},{}],287:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E B lB mB nB oB R VB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "C P BB", + "2": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Window.devicePixelRatio" +}; + +},{}],288:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "194": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V", + "1218": "y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j", + "322": "k l m n o" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L lB mB nB oB R VB qB BB", + "578": "X Y Z a b" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Dialog element" +}; + +},{}],289:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "16": "iB", + "129": "E A", + "130": "I D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "16": "0B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "16": "E" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "129": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "EventTarget.dispatchEvent" +}; + +},{}],290:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "132": "I D F E A B iB" + }, + B: { + "132": "C O H Q J K L V y M WB S" + }, + C: { + "132": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "132": "0 1 2 3 4 5 6 7 8 9 G W j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "388": "I D F E A B C O H Q J K L X Y Z a b c d e f g h i" + }, + E: { + "132": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "132": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "132": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "132": "AC" + }, + I: { + "132": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "132": "D A" + }, + K: { + "132": "A B C P R VB BB" + }, + L: { + "132": "S" + }, + M: { + "132": "N" + }, + N: { + "132": "A B" + }, + O: { + "132": "HC" + }, + P: { + "132": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "132": "PC" + }, + R: { + "132": "QC" + }, + S: { + "132": "RC" + } + }, + B: 6, + C: "DNSSEC and DANE" +}; + +},{}],291:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "164": "E A", + "260": "B" + }, + B: { + "1": "K L V y M WB S", + "260": "C O H Q J" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F pB hB", + "516": "E A B C O H Q J K L X Y Z a b c d e f g h i j" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a" + }, + E: { + "1": "I A B C cB fB XB R", + "2": "G W O H 0B YB BB jB kB", + "1028": "D F E dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B", + "2": "YB rB IB tB uB 4B 5B 6B 7B 8B 9B", + "1028": "F vB wB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "16": "D", + "1028": "A" + }, + K: { + "1": "P BB", + "16": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "164": "A", + "260": "B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Do Not Track API" +}; + +},{}],292:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g" + }, + E: { + "1": "F E A B C O H fB XB R BB jB kB", + "2": "G W I D 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q lB mB nB oB R VB qB BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "document.currentScript" +}; + +},{}],293:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "16": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "16": "E" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "document.evaluate & XPath" +}; + +},{}],294:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "16": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T mB nB oB R VB qB BB", + "16": "E lB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB", + "16": "IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M EC IB FC GC", + "2": "KB G BC CC DC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "2": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "Document.execCommand()" +}; + +},{}],295:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Document Policy" +}; + +},{}],296:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "16": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "document.scrollingElement" +}; + +},{}],297:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB", + "16": "W" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "2": "E lB mB nB oB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "document.head" +}; + +},{}],298:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L V y M WB S", + "2": "C O H Q J" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "4 5" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r lB mB nB oB R VB qB BB", + "194": "s" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G IC" + }, + Q: { + "194": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "DOM manipulation convenience methods" +}; + +},{}],299:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "iB", + "8": "I D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Document Object Model Range" +}; + +},{}],300:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "DOMContentLoaded" +}; + +},{}],301:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H Q J K L X Y Z a b c d" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB", + "16": "W" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "16": "E B lB mB nB oB R VB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB uB" + }, + H: { + "16": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "16": "KB BC CC DC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "DOMFocusIn & DOMFocusOut events" +}; + +},{}],302:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "132": "A B" + }, + B: { + "132": "C O H Q J K L", + "1028": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k pB hB", + "2564": "0 l m n o p q r s t u v w x P z", + "3076": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "16": "G W I D", + "132": "0 1 2 3 4 5 6 7 8 9 E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB", + "388": "F", + "1028": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "16": "G 0B YB", + "132": "W I D F E A cB dB eB fB XB", + "1028": "B C O H R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "132": "Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "1028": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T" + }, + G: { + "16": "YB rB IB", + "132": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "132": "G EC IB FC GC", + "292": "KB BC CC DC" + }, + J: { + "16": "D", + "132": "A" + }, + K: { + "2": "A B C R VB BB", + "132": "P" + }, + L: { + "1028": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "132": "HC" + }, + P: { + "132": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "132": "PC" + }, + R: { + "132": "QC" + }, + S: { + "2564": "RC" + } + }, + B: 4, + C: "DOMMatrix" +}; + +},{}],303:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "2": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Download attribute" +}; + +},{}],304:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "644": "I D F E iB", + "772": "A B" + }, + B: { + "1": "L V y M WB S", + "260": "C O H Q J K" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "8": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "8": "E B lB mB nB oB R VB qB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "1025": "M" + }, + J: { + "2": "D A" + }, + K: { + "1": "BB", + "8": "A B C R VB", + "1025": "P" + }, + L: { + "1025": "S" + }, + M: { + "2": "N" + }, + N: { + "1": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Drag and Drop" +}; + +},{}],305:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "Q J K L V y M WB S", + "2": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Element.closest()" +}; + +},{}],306:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "16": "iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "16": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "16": "E lB mB nB oB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "C P BB", + "16": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "document.elementFromPoint()" +}; + +},{}],307:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n pB hB" + }, + D: { + "1": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB" + }, + E: { + "2": "G W I D F E 0B YB cB dB eB fB", + "132": "A B C O H XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB", + "132": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Scroll methods on elements (scroll, scrollTo, scrollBy)" +}; + +},{}],308:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "164": "B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m", + "132": "n o p q r s t" + }, + E: { + "1": "C O H BB jB kB", + "2": "G W I 0B YB cB dB", + "164": "D F E A B eB fB XB R" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z lB mB nB oB R VB qB BB", + "132": "a b c d e f g" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "16": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Encrypted Media Extensions" +}; + +},{}],309:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "2": "iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "EOT - Embedded OpenType fonts" +}; + +},{}],310:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D iB", + "260": "E", + "1026": "F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "4": "sB KB pB hB", + "132": "G W I D F E A B C O H Q J K L X Y" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "4": "G W I D F E A B C O H Q J K L", + "132": "X Y Z a" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "4": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "4": "E B C lB mB nB oB R VB qB", + "132": "BB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "4": "YB rB IB tB" + }, + H: { + "132": "AC" + }, + I: { + "1": "M FC GC", + "4": "KB BC CC DC", + "132": "EC IB", + "900": "G" + }, + J: { + "1": "A", + "4": "D" + }, + K: { + "1": "P", + "4": "A B C R VB", + "132": "BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "ECMAScript 5" +}; + +},{}],311:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w pB hB" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t", + "132": "0 u v w x P z" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g lB mB nB oB R VB qB BB", + "132": "h i j k l m n" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "ES6 classes" +}; + +},{}],312:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "2": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "ES6 Generators" +}; + +},{}],313:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB pB hB", + "194": "DB" + }, + D: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB" + }, + F: { + "1": "2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "JavaScript modules: dynamic import()" +}; + +},{}],314:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H", + "4097": "J K L", + "4290": "Q" + }, + C: { + "1": "CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "322": "6 7 8 9 AB LB" + }, + D: { + "1": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB", + "194": "CB" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB", + "3076": "XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P lB mB nB oB R VB qB BB", + "194": "z" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB", + "3076": "ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "JavaScript modules via script tag" +}; + +},{}],315:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q pB hB", + "132": "J K L X Y Z a b c", + "260": "d e f g h i", + "516": "j" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L", + "1028": "X Y Z a b c d e f g h i j k l" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "1028": "Q J K L X Y" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC", + "1028": "EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "ES6 Number" +}; + +},{}],316:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "String.prototype.includes" +}; + +},{}],317:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "388": "B" + }, + B: { + "257": "V y M WB S", + "260": "C O H", + "769": "Q J K L" + }, + C: { + "2": "sB KB G W pB hB", + "4": "0 1 2 3 4 5 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "257": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y", + "4": "0 1 2 Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "257": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D 0B YB cB dB", + "4": "F E eB fB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "4": "Q J K L X Y Z a b c d e f g h i j k l m n o p", + "257": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB", + "4": "F vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "4": "FC GC", + "257": "M" + }, + J: { + "2": "D", + "4": "A" + }, + K: { + "2": "A B C R VB BB", + "257": "P" + }, + L: { + "257": "S" + }, + M: { + "257": "N" + }, + N: { + "2": "A", + "388": "B" + }, + O: { + "257": "HC" + }, + P: { + "4": "G", + "257": "IC JC KC LC MC XB NC OC" + }, + Q: { + "257": "PC" + }, + R: { + "4": "QC" + }, + S: { + "4": "RC" + } + }, + B: 6, + C: "ECMAScript 2015 (ES6)" +}; + +},{}],318:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "4": "E lB mB nB oB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "C P R VB BB", + "4": "A B" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Server-sent events" +}; + +},{}],319:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "H jB kB", + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "ui-serif, ui-sans-serif, ui-monospace and ui-rounded values for font-family" +}; + +},{}],320:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB pB hB", + "260": "QB RB SB TB UB V y M" + }, + D: { + "1": "QB RB SB TB UB V y M WB S gB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB", + "132": "CB JB EB FB GB HB DB U N T MB NB OB PB", + "1025": "bB aB" + }, + E: { + "2": "G W I D F E A B 0B YB cB dB eB fB XB", + "772": "C O H R BB jB kB" + }, + F: { + "1": "EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P lB mB nB oB R VB qB BB", + "132": "0 1 2 3 4 5 6 7 8 9 z AB CB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B", + "772": "2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "NC OC", + "2": "G IC JC KC", + "132": "LC MC XB" + }, + Q: { + "132": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Feature Policy" +}; + +},{}],321:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l pB hB", + "1025": "r", + "1218": "m n o p q" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r", + "260": "s", + "772": "t" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e lB mB nB oB R VB qB BB", + "260": "f", + "772": "g" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Fetch" +}; + +},{}],322:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "16": "iB", + "132": "F E", + "388": "I D A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q", + "16": "J K L X" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T mB nB oB R VB qB BB", + "16": "E lB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB" + }, + H: { + "388": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A", + "260": "B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "disabled attribute of the fieldset element" +}; + +},{}],323:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "260": "A B" + }, + B: { + "1": "V y M WB S", + "260": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB", + "260": "G W I D F E A B C O H Q J K L X Y Z a b c d e f hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W", + "260": "O H Q J K L X Y Z a b c d e f g h i j k l m n o p", + "388": "I D F E A B C" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W 0B YB", + "260": "I D F E dB eB fB", + "388": "cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B lB mB nB oB", + "260": "C Q J K L X Y Z a b c R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB", + "260": "F uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M GC", + "2": "BC CC DC", + "260": "FC", + "388": "KB G EC IB" + }, + J: { + "260": "A", + "388": "D" + }, + K: { + "1": "P", + "2": "A B", + "260": "C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A", + "260": "B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "File API" +}; + +},{}],324:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "132": "A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "2": "sB KB pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "2": "E B lB mB nB oB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "C P R VB BB", + "2": "A B" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "FileReader API" +}; + +},{}],325:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E lB mB", + "16": "B nB oB R VB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "C P VB BB", + "2": "A", + "16": "B R" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "FileReaderSync" +}; + +},{}],326:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "33": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "G W I D", + "33": "0 1 2 3 4 5 6 7 8 9 O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "36": "F E A B C" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "33": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "33": "A" + }, + K: { + "2": "A B C R VB BB", + "33": "P" + }, + L: { + "33": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G", + "33": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Filesystem & FileWriter API" +}; + +},{}],327:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L V y M WB S", + "2": "C O H Q" + }, + C: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v", + "16": "w x P", + "388": "0 1 2 3 4 5 6 7 z" + }, + E: { + "1": "O H jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "516": "B C R BB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t lB mB nB oB R VB qB BB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "BC CC DC", + "16": "KB G EC IB FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "BB", + "16": "A B C R VB", + "129": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "129": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "FLAC audio format" +}; + +},{}],328:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "S", + "2": "C O H Q J K L V y M WB" + }, + C: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB pB hB" + }, + D: { + "1": "S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "gap property for Flexbox" +}; + +},{}],329:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "1028": "B", + "1316": "A" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "164": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB", + "516": "a b c d e f" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "Z a b c d e f g", + "164": "G W I D F E A B C O H Q J K L X Y" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "33": "D F dB eB", + "164": "G W I 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B C lB mB nB oB R VB qB", + "33": "Q J" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "33": "F vB wB", + "164": "YB rB IB tB uB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "164": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "164": "D" + }, + K: { + "1": "P BB", + "2": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "292": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS Flexible Box Layout Module" +}; + +},{}],330:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "O H jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R BB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w lB mB nB oB R VB qB BB" + }, + G: { + "1": "5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G IC JC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "display: flow-root" +}; + +},{}],331:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "2": "iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E lB mB nB oB", + "16": "B R VB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "2": "BC CC DC", + "16": "KB" + }, + J: { + "1": "D A" + }, + K: { + "1": "C P BB", + "2": "A", + "16": "B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "focusin & focusout events" +}; + +},{}],332:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "preventScroll support in focus" +}; + +},{}],333:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u pB hB", + "132": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "260": "5 6 7" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F 0B YB cB dB eB", + "16": "E", + "132": "A fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u lB mB nB oB R VB qB BB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB", + "132": "xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G IC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "132": "RC" + } + }, + B: 5, + C: "system-ui value for font-family" +}; + +},{}],334:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "33": "Q J K L X Y Z a b c d e f g h i j k l", + "164": "G W I D F E A B C O H" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q", + "33": "Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "292": "J K L X Y" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "D F E 0B YB dB eB", + "4": "G W I cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "33": "Q J K L X Y Z a b c d e f g h i j k l m" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F vB wB xB", + "4": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB", + "33": "FC GC" + }, + J: { + "2": "D", + "33": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "33": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS font-feature-settings" +}; + +},{}],335:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b pB hB", + "194": "c d e f g h i j k l" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g", + "33": "h i j k" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I 0B YB cB dB", + "33": "D F E eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q lB mB nB oB R VB qB BB", + "33": "J K L X" + }, + G: { + "2": "YB rB IB tB uB vB", + "33": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M GC", + "2": "KB G BC CC DC EC IB", + "33": "FC" + }, + J: { + "2": "D", + "33": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS3 font-kerning" +}; + +},{}],336:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m pB hB", + "194": "n o p q r s" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS Font Loading" +}; + +},{}],337:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "194": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u", + "194": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h lB mB nB oB R VB qB BB", + "194": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "258": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "194": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "CSS font-size-adjust" +}; + +},{}],338:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "676": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c pB hB", + "804": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "G", + "676": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "0B YB", + "676": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "676": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "804": "RC" + } + }, + B: 7, + C: "CSS font-smooth" +}; + +},{}],339:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "4": "E A B" + }, + B: { + "1": "K L V y M WB S", + "4": "C O H Q J" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n pB hB", + "194": "o p q r s t u v" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "4": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "4": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "4": "Q J K L X Y Z a" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "4": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "4": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "4": "A" + }, + K: { + "2": "A B C R VB BB", + "4": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "4": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "4": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Font unicode-range subsetting" +}; + +},{}],340:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "130": "A B" + }, + B: { + "130": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "130": "G W I D F E A B C O H Q J K L X Y Z a b", + "322": "c d e f g h i j k l" + }, + D: { + "2": "G W I D F E A B C O H Q", + "130": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "D F E 0B YB dB eB", + "130": "G W I cB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "130": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB vB wB xB", + "130": "rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "130": "M FC GC" + }, + J: { + "2": "D", + "130": "A" + }, + K: { + "2": "A B C R VB BB", + "130": "P" + }, + L: { + "130": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "130": "HC" + }, + P: { + "130": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "130": "PC" + }, + R: { + "130": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS font-variant-alternates" +}; + +},{}],341:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b pB hB", + "132": "c d e f g h i j k l" + }, + D: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "132": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS font-variant-east-asian " +}; + +},{}],342:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l pB hB" + }, + D: { + "1": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q lB mB nB oB R VB qB BB" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "16": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G IC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS font-variant-numeric" +}; + +},{}],343:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "132": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "2": "0B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T mB nB oB R VB qB BB", + "2": "E lB" + }, + G: { + "1": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "260": "YB rB" + }, + H: { + "2": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "2": "BC", + "4": "KB CC DC" + }, + J: { + "1": "A", + "4": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "@font-face Web fonts" +}; + +},{}],344:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L V y M WB S", + "2": "C O H Q" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB", + "16": "W" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Form attribute" +}; + +},{}],345:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "2": "E lB", + "16": "mB nB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "2": "BC CC DC", + "16": "KB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "B C P R VB BB", + "16": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Attributes for form submission" +}; + +},{}],346:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G 0B YB", + "132": "W I D F E A cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T mB nB oB R VB qB BB", + "2": "E lB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB", + "132": "F rB IB tB uB vB wB xB yB zB" + }, + H: { + "516": "AC" + }, + I: { + "1": "M GC", + "2": "KB BC CC DC", + "132": "G EC IB FC" + }, + J: { + "1": "A", + "132": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "260": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "132": "RC" + } + }, + B: 1, + C: "Form validation" +}; + +},{}],347:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "4": "A B", + "8": "I D F E" + }, + B: { + "1": "J K L V y M WB S", + "4": "C O H Q" + }, + C: { + "4": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "8": "sB KB pB hB" + }, + D: { + "1": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "4": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB" + }, + E: { + "4": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "8": "0B YB" + }, + F: { + "1": "4 5 6 7 8 9 E B C AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "4": "0 1 2 3 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + G: { + "2": "YB", + "4": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB", + "4": "FC GC" + }, + J: { + "2": "D", + "4": "A" + }, + K: { + "1": "A B C R VB BB", + "4": "P" + }, + L: { + "1": "S" + }, + M: { + "4": "N" + }, + N: { + "4": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "4": "G IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "4": "QC" + }, + S: { + "4": "RC" + } + }, + B: 1, + C: "HTML5 form features" +}; + +},{}],348:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "548": "B" + }, + B: { + "1": "V y M WB S", + "516": "C O H Q J K L" + }, + C: { + "1": "GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E pB hB", + "676": "A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P", + "1700": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB" + }, + D: { + "1": "NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H", + "676": "Q J K L X", + "804": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB" + }, + E: { + "2": "G W 0B YB", + "676": "cB", + "804": "I D F E A B C O H dB eB fB XB R BB jB kB" + }, + F: { + "1": "GB HB DB U N T BB", + "2": "E B C lB mB nB oB R VB qB", + "804": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B", + "2052": "3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "292": "A" + }, + K: { + "2": "A B C R VB BB", + "804": "P" + }, + L: { + "804": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A", + "548": "B" + }, + O: { + "804": "HC" + }, + P: { + "1": "XB NC OC", + "804": "G IC JC KC LC MC" + }, + Q: { + "804": "PC" + }, + R: { + "804": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Full Screen API" +}; + +},{}],349:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y", + "33": "Z a b c" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Gamepad API" +}; + +},{}],350:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "iB", + "8": "I D F" + }, + B: { + "1": "C O H Q J K L", + "129": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "8": "sB KB", + "129": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "4": "G", + "129": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I D F E B C O H cB dB eB fB XB R BB jB kB", + "8": "G 0B YB", + "129": "A" + }, + F: { + "1": "B C J K L X Y Z a b c d e f g h i j k l m n o p q oB R VB qB BB", + "2": "E Q lB", + "8": "mB nB", + "129": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB", + "129": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G BC CC DC EC IB FC GC", + "129": "M" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "8": "A" + }, + L: { + "129": "S" + }, + M: { + "129": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G", + "129": "IC JC KC LC MC XB NC OC" + }, + Q: { + "129": "PC" + }, + R: { + "129": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Geolocation" +}; + +},{}],351:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "644": "I D iB", + "2049": "E A B", + "2692": "F" + }, + B: { + "1": "V y M WB S", + "2049": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB", + "260": "G W I D F E A B", + "1156": "KB", + "1284": "pB", + "1796": "hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "16": "E lB", + "132": "mB nB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "132": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2049": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Element.getBoundingClientRect()" +}; + +},{}],352:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB", + "132": "KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "260": "G W I D F E A" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "260": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "260": "E lB mB nB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "260": "YB rB IB" + }, + H: { + "260": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "260": "KB BC CC DC" + }, + J: { + "1": "A", + "260": "D" + }, + K: { + "1": "B C P R VB BB", + "260": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "getComputedStyle" +}; + +},{}],353:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "iB", + "8": "I D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "8": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "getElementsByClassName" +}; + +},{}],354:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "33": "B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W I 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A", + "33": "B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "crypto.getRandomValues()" +}; + +},{}],355:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "AB LB CB JB EB FB GB HB DB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "Gyroscope" +}; + +},{}],356:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "Q J K L V y M WB S", + "2": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o" + }, + E: { + "2": "G W I D 0B YB cB dB eB", + "129": "B C O H XB R BB jB kB", + "194": "F E A fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b lB mB nB oB R VB qB BB" + }, + G: { + "2": "YB rB IB tB uB vB", + "129": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "194": "F wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "navigator.hardwareConcurrency" +}; + +},{}],357:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "F E A B", + "8": "I D iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "8": "sB KB pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "8": "G" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "8": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "8": "E lB mB nB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M CC DC EC IB FC GC", + "2": "BC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "8": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Hashchange event" +}; + +},{}],358:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "130": "B C O H R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB", + "130": "1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "HEIF/ISO Base Media File Format" +}; + +},{}],359:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "132": "B" + }, + B: { + "2": "V y M WB S", + "132": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "O H jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "516": "B C R BB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "258": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "258": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G", + "258": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "HEVC/H.265 video format" +}; + +},{}],360:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "2": "E B lB mB nB oB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "2": "KB BC CC DC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "C P R VB BB", + "2": "A B" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "hidden attribute" +}; + +},{}],361:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X", + "33": "Y Z a b" + }, + E: { + "1": "F E A B C O H fB XB R BB jB kB", + "2": "G W I D 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "High Resolution Time API" +}; + +},{}],362:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G 0B YB", + "4": "W cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T VB qB BB", + "2": "E B lB mB nB oB R" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB", + "4": "IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M CC DC IB FC GC", + "2": "KB G BC EC" + }, + J: { + "1": "D A" + }, + K: { + "1": "C P R VB BB", + "2": "A B" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Session history management" +}; + +},{}],363:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "YB rB IB tB", + "129": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC", + "257": "CC DC" + }, + J: { + "1": "A", + "16": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "516": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "16": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "HTML Media Capture" +}; + +},{}],364:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "8": "I D F", + "260": "E A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB", + "132": "KB pB hB", + "260": "G W I D F E A B C O H Q J K L X Y" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W", + "260": "I D F E A B C O H Q J K L X Y Z a b c d" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "132": "G 0B YB", + "260": "W I cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "132": "E B lB mB nB oB", + "260": "C R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "132": "YB", + "260": "rB IB tB uB" + }, + H: { + "132": "AC" + }, + I: { + "1": "M FC GC", + "132": "BC", + "260": "KB G CC DC EC IB" + }, + J: { + "260": "D A" + }, + K: { + "1": "P", + "132": "A", + "260": "B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "260": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "HTML5 semantic elements" +}; + +},{}],365:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L", + "2": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "HTTP Live Streaming (HLS)" +}; + +},{}],366:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "132": "B" + }, + B: { + "1": "C O H Q J K L", + "513": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 o p q r s t u v w x P z", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n pB hB", + "513": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 t u v w x P z", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s", + "513": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F 0B YB cB dB eB", + "260": "E A fB XB" + }, + F: { + "1": "g h i j k l m n o p", + "2": "E B C Q J K L X Y Z a b c d e f lB mB nB oB R VB qB BB", + "513": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "513": "M" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "513": "S" + }, + M: { + "513": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G", + "513": "IC JC KC LC MC XB NC OC" + }, + Q: { + "513": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "HTTP/2 protocol" +}; + +},{}],367:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB pB hB", + "194": "OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB", + "322": "V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB jB", + "66": "H kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B", + "66": "9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "HTTP/3 protocol" +}; + +},{}],368:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J pB hB", + "4": "K L X Y Z a b c d e f" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M CC DC EC IB FC GC", + "2": "BC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "sandbox attribute for iframes" +}; + +},{}],369:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "66": "Y Z a b c d e" + }, + E: { + "2": "G W I F E A B C O H 0B YB cB dB fB XB R BB jB kB", + "130": "D eB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "130": "vB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "seamless attribute for iframes" +}; + +},{}],370:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "8": "I D F E A B" + }, + B: { + "1": "V y M WB S", + "8": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB", + "8": "KB G W I D F E A B C O H Q J K L X Y Z a b c pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O", + "8": "H Q J K L X" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "0B YB", + "8": "G W cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B lB mB nB oB", + "8": "C R VB qB BB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB", + "8": "rB IB tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "8": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "8": "D" + }, + K: { + "1": "P", + "2": "A B", + "8": "C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "8": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "srcdoc attribute for iframes" +}; + +},{}],371:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "322": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m pB hB", + "194": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "322": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r lB mB nB oB R VB qB BB", + "322": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "322": "PC" + }, + R: { + "1": "QC" + }, + S: { + "194": "RC" + } + }, + B: 5, + C: "ImageCapture API" +}; + +},{}],372:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "161": "B" + }, + B: { + "2": "V y M WB S", + "161": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A", + "161": "B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Input Method Editor API" +}; + +},{}],373:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "naturalWidth & naturalHeight image properties" +}; + +},{}],374:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "8": "A B" + }, + B: { + "1": "V", + "2": "y M WB S", + "8": "C O H Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h pB hB", + "8": "8 9 i j AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "72": "0 1 2 3 4 5 6 7 k l m n o p q r s t u v w x P z" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h y M WB S gB bB aB", + "66": "i j k l m", + "72": "n" + }, + E: { + "2": "G W 0B YB cB", + "8": "I D F E A B C O H dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB", + "2": "E B C Q J U N T lB mB nB oB R VB qB BB", + "66": "K L X Y Z", + "72": "a" + }, + G: { + "2": "YB rB IB tB uB", + "8": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "2": "S" + }, + M: { + "8": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "HTML Imports" +}; + +},{}],375:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "16": "iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "2": "sB KB", + "16": "pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E B lB mB nB oB R VB" + }, + G: { + "1": "4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "indeterminate checkbox" +}; + +},{}],376:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "132": "A B" + }, + B: { + "1": "V y M WB S", + "132": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "33": "A B C O H Q", + "36": "G W I D F E" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "A", + "8": "G W I D F E", + "33": "b", + "36": "B C O H Q J K L X Y Z a" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "8": "G W I D 0B YB cB dB", + "260": "F E eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E lB mB", + "8": "B C nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "8": "YB rB IB tB uB vB", + "260": "F wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "8": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "8": "D" + }, + K: { + "1": "P", + "2": "A", + "8": "B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "IndexedDB" +}; + +},{}],377:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v pB hB", + "132": "w x P", + "260": "0 1 2 z" + }, + D: { + "1": "AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "132": "0 1 2 3", + "260": "4 5 6 7 8 9" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m lB mB nB oB R VB qB BB", + "132": "n o p q", + "260": "r s t u v w" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB", + "16": "zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G", + "260": "IC JC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "260": "RC" + } + }, + B: 4, + C: "IndexedDB 2.0" +}; + +},{}],378:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "F E A B", + "4": "iB", + "132": "I D" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "36": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS inline-block" +}; + +},{}],379:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "16": "iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "16": "0B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "16": "E" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "HTMLElement.innerText" +}; + +},{}],380:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A iB", + "132": "B" + }, + B: { + "132": "C O H Q J K L", + "260": "V y M WB S" + }, + C: { + "1": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h pB hB", + "516": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "K L X Y Z a b c d e", + "2": "G W I D F E A B C O H Q J", + "132": "f g h i j k l m n o p q r s", + "260": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "I cB dB", + "2": "G W 0B YB", + "2052": "D F E A B C O H eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "YB rB IB", + "1025": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1025": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2052": "A B" + }, + O: { + "1025": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "260": "PC" + }, + R: { + "1": "QC" + }, + S: { + "516": "RC" + } + }, + B: 1, + C: "autocomplete attribute: on & off values" +}; + +},{}],381:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X" + }, + E: { + "1": "O H BB jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "2": "E Q J lB mB nB oB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B", + "129": "4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Color input type" +}; + +},{}],382:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "132": "C" + }, + C: { + "2": "0 1 2 3 4 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "1090": "5 6 7 8", + "2052": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X", + "2052": "Y Z a b c" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "YB rB IB", + "260": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB BC CC DC", + "514": "G EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2052": "RC" + } + }, + B: 1, + C: "Date and time input types" +}; + +},{}],383:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "132": "BC CC DC" + }, + J: { + "1": "A", + "132": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Email, telephone & URL input types" +}; + +},{}],384:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "2561": "A B", + "2692": "E" + }, + B: { + "1": "V y M WB S", + "2561": "C O H Q J K L" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "16": "sB", + "1537": "0 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z hB", + "1796": "KB pB" + }, + D: { + "1": "DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H", + "1025": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB", + "1537": "Q J K L X Y Z a b c d e f g h i j k l m" + }, + E: { + "1": "H jB kB", + "16": "G W I 0B YB", + "1025": "D F E A B C dB eB fB XB R", + "1537": "cB", + "4097": "O BB" + }, + F: { + "1": "4 5 6 7 8 9 AB CB EB FB GB HB DB U N T BB", + "16": "E B C lB mB nB oB R VB", + "260": "qB", + "1025": "0 1 2 3 a b c d e f g h i j k l m n o p q r s t u v w x P z", + "1537": "Q J K L X Y Z" + }, + G: { + "16": "YB rB IB", + "1025": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "1537": "tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "16": "BC CC", + "1025": "M GC", + "1537": "KB G DC EC IB FC" + }, + J: { + "1025": "A", + "1537": "D" + }, + K: { + "1": "A B C R VB BB", + "1025": "P" + }, + L: { + "1": "S" + }, + M: { + "1537": "N" + }, + N: { + "2561": "A B" + }, + O: { + "1537": "HC" + }, + P: { + "1025": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1025": "PC" + }, + R: { + "1025": "QC" + }, + S: { + "1537": "RC" + } + }, + B: 1, + C: "input event" +}; + +},{}],385:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G", + "16": "W I D F Z a b c d", + "132": "E A B C O H Q J K L X Y" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W 0B YB cB", + "132": "I D F E A B dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "2": "uB vB", + "132": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "514": "YB rB IB tB" + }, + H: { + "2": "AC" + }, + I: { + "2": "BC CC DC", + "260": "KB G EC IB", + "514": "M FC GC" + }, + J: { + "132": "A", + "260": "D" + }, + K: { + "2": "A B C R VB BB", + "260": "P" + }, + L: { + "260": "S" + }, + M: { + "2": "N" + }, + N: { + "514": "A", + "1028": "B" + }, + O: { + "2": "HC" + }, + P: { + "260": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "260": "PC" + }, + R: { + "260": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "accept attribute for file input" +}; + +},{}],386:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Directory selection from file input" +}; + +},{}],387:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "2": "sB KB pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "2": "E lB mB nB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB" + }, + H: { + "130": "AC" + }, + I: { + "130": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "130": "A B C P R VB BB" + }, + L: { + "132": "S" + }, + M: { + "130": "N" + }, + N: { + "2": "A B" + }, + O: { + "130": "HC" + }, + P: { + "130": "G", + "132": "IC JC KC LC MC XB NC OC" + }, + Q: { + "132": "PC" + }, + R: { + "132": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Multiple file selection" +}; + +},{}],388:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J pB hB", + "4": "K L X Y", + "194": "0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "66": "8 9 AB LB CB JB EB FB GB HB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u lB mB nB oB R VB qB BB", + "66": "0 1 2 3 4 v w x P z" + }, + G: { + "1": "4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "194": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "MC XB NC OC", + "2": "G IC JC KC LC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "194": "RC" + } + }, + B: 1, + C: "inputmode attribute" +}; + +},{}],389:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L V y M WB S", + "2": "C O H Q J" + }, + C: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Minimum length attribute for input fields" +}; + +},{}],390:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "129": "A B" + }, + B: { + "1": "V y M WB S", + "129": "C O", + "1025": "H Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB", + "513": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "388": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB BC CC DC", + "388": "G M EC IB FC GC" + }, + J: { + "2": "D", + "388": "A" + }, + K: { + "1": "A B C R VB BB", + "388": "P" + }, + L: { + "388": "S" + }, + M: { + "641": "N" + }, + N: { + "388": "A B" + }, + O: { + "388": "HC" + }, + P: { + "388": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "388": "PC" + }, + R: { + "388": "QC" + }, + S: { + "513": "RC" + } + }, + B: 1, + C: "Number input type" +}; + +},{}],391:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G 0B YB", + "16": "W", + "388": "I D F E A cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB", + "388": "F tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M GC", + "2": "KB G BC CC DC EC IB FC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "A B C R VB BB", + "132": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Pattern attribute for input fields" +}; + +},{}],392:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "132": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T VB qB BB", + "2": "E lB mB nB oB", + "132": "B R" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB M BC CC DC IB FC GC", + "4": "G EC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "input placeholder attribute" +}; + +},{}],393:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M IB FC GC", + "4": "KB G BC CC DC EC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Range input type" +}; + +},{}],394:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "129": "A B" + }, + B: { + "1": "V y M WB S", + "129": "C O H Q J K L" + }, + C: { + "2": "sB KB pB hB", + "129": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H Z a b c d", + "129": "Q J K L X Y" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E lB mB nB oB", + "16": "B R VB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB" + }, + H: { + "129": "AC" + }, + I: { + "1": "M FC GC", + "16": "BC CC", + "129": "KB G DC EC IB" + }, + J: { + "1": "D", + "129": "A" + }, + K: { + "1": "C", + "2": "A", + "16": "B R VB", + "129": "P BB" + }, + L: { + "1": "S" + }, + M: { + "129": "N" + }, + N: { + "129": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "129": "RC" + } + }, + B: 1, + C: "Search input type" +}; + +},{}],395:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "16": "E lB mB nB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Selection controls for input & textarea" +}; + +},{}],396:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "16": "iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "16": "E" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Element.insertAdjacentElement() & Element.insertAdjacentText()" +}; + +},{}],397:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "16": "iB", + "132": "I D F E" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T mB nB oB R VB qB BB", + "16": "E lB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Element.insertAdjacentHTML()" +}; + +},{}],398:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Internationalization API" +}; + +},{}],399:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "NC OC", + "2": "G IC JC KC LC MC XB" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "IntersectionObserver V2" +}; + +},{}],400:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L", + "2": "C O H", + "516": "Q", + "1025": "V y M WB S" + }, + C: { + "1": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "194": "4 5 6" + }, + D: { + "1": "AB LB CB JB EB FB GB", + "2": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "516": "3 4 5 6 7 8 9", + "1025": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "O H BB jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB CB EB FB", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p lB mB nB oB R VB qB BB", + "516": "q r s t u v w", + "1025": "GB HB DB U N T" + }, + G: { + "1": "4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "1025": "M" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "516": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G", + "516": "IC JC" + }, + Q: { + "1025": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "IntersectionObserver" +}; + +},{}],401:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K", + "130": "L" + }, + C: { + "1": "AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB" + }, + E: { + "1": "O H jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R BB" + }, + F: { + "1": "2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "1": "5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Intl.PluralRules API" +}; + +},{}],402:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "1537": "V y M WB S" + }, + C: { + "2": "sB", + "932": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB pB hB", + "2308": "DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z", + "545": "a b c d e f g h i j k l m n o p q r s t u v w x", + "1537": "0 1 2 3 4 5 6 7 8 9 P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I 0B YB cB", + "516": "B C O H R BB jB kB", + "548": "E A fB XB", + "676": "D F dB eB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "513": "m", + "545": "Q J K L X Y Z a b c d e f g h i j k", + "1537": "0 1 2 3 4 5 6 7 8 9 l n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "YB rB IB tB uB", + "548": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "676": "F vB wB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "545": "FC GC", + "1537": "M" + }, + J: { + "2": "D", + "545": "A" + }, + K: { + "2": "A B C R VB BB", + "1537": "P" + }, + L: { + "1537": "S" + }, + M: { + "2340": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "545": "G", + "1537": "IC JC KC LC MC XB NC OC" + }, + Q: { + "545": "PC" + }, + R: { + "1537": "QC" + }, + S: { + "932": "RC" + } + }, + B: 5, + C: "Intrinsic & Extrinsic Sizing" +}; + +},{}],403:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G 0B YB", + "129": "W cB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "JPEG 2000 image format" +}; + +},{}],404:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L", + "2": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "1": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "JPEG XR image format" +}; + +},{}],405:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB pB hB" + }, + D: { + "1": "EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Lookbehind in JS regular expressions" +}; + +},{}],406:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D iB", + "129": "F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "JSON parsing" +}; + +},{}],407:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q", + "132": "J K L" + }, + C: { + "1": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "132": "9 AB LB" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB", + "132": "XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v lB mB nB oB R VB qB BB", + "132": "w x P" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB", + "132": "ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "132": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC", + "132": "KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "132": "RC" + } + }, + B: 5, + C: "CSS justify-content: space-evenly" +}; + +},{}],408:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "L V y M WB S", + "2": "C O H Q J K" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "BC CC DC", + "132": "KB G EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "High-quality kerning pairs & ligatures" +}; + +},{}],409:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "16": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB", + "16": "C" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "BB", + "2": "A B R VB", + "16": "C", + "130": "P" + }, + L: { + "1": "S" + }, + M: { + "130": "N" + }, + N: { + "130": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "KeyboardEvent.charCode" +}; + +},{}],410:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t", + "194": "u v w x P z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g lB mB nB oB R VB qB BB", + "194": "h i j k l m" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "194": "P" + }, + L: { + "194": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G", + "194": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "194": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "KeyboardEvent.code" +}; + +},{}],411:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B Q J lB mB nB oB R VB qB", + "16": "C" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P BB", + "2": "A B R VB", + "16": "C" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "KeyboardEvent.getModifierState()" +}; + +},{}],412:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "260": "E A B" + }, + B: { + "1": "V y M WB S", + "260": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a pB hB", + "132": "b c d e f g" + }, + D: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B Q J K L X Y Z a b c d e f g h i j k l m n o p lB mB nB oB R VB qB", + "16": "C" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "BB", + "2": "A B R VB", + "16": "C P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "260": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "KeyboardEvent.key" +}; + +},{}],413:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "16": "I 0B YB", + "132": "G W cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB", + "16": "C", + "132": "Q J" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB", + "132": "tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "16": "BC CC", + "132": "KB G DC EC IB" + }, + J: { + "132": "D A" + }, + K: { + "1": "P BB", + "2": "A B R VB", + "16": "C" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "KeyboardEvent.location" +}; + +},{}],414:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB", + "16": "W" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T mB nB oB R VB qB BB", + "16": "E lB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB", + "16": "BC CC", + "132": "FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C R VB BB", + "132": "P" + }, + L: { + "132": "S" + }, + M: { + "132": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "2": "G", + "132": "IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "132": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "KeyboardEvent.which" +}; + +},{}],415:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "C O H Q J K L", + "2": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Resource Hints: Lazyload" +}; + +},{}],416:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "2052": "B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "194": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v pB hB" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L", + "322": "X Y Z a b c d e f g h i j k l m n o p q r s", + "516": "0 t u v w x P z" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB", + "1028": "A XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "322": "Q J K L X Y Z a b c d e f", + "516": "g h i j k l m n" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB", + "1028": "zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "516": "G" + }, + Q: { + "1": "PC" + }, + R: { + "516": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "let" +}; + +},{}],417:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "C O H Q J K L", + "129": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "129": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "257": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "129": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "513": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1026": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1026": "AC" + }, + I: { + "1": "KB G BC CC DC EC IB", + "513": "M FC GC" + }, + J: { + "1": "D", + "1026": "A" + }, + K: { + "1026": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1026": "A B" + }, + O: { + "257": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "513": "G" + }, + Q: { + "129": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "PNG favicons" +}; + +},{}],418:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V", + "3073": "y M WB S" + }, + C: { + "2": "sB KB pB hB", + "260": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s", + "1025": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V", + "3073": "y M WB S gB bB aB" + }, + E: { + "2": "G W I D F 0B YB cB dB eB", + "516": "E A B C O H fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 w x P z", + "2": "6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v AB CB EB FB GB HB DB lB mB nB oB R VB qB BB", + "3073": "U N T" + }, + G: { + "130": "F YB rB IB tB uB vB wB", + "516": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "130": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "130": "A" + }, + K: { + "130": "A B C P R VB BB" + }, + L: { + "3073": "S" + }, + M: { + "2": "N" + }, + N: { + "130": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1025": "RC" + } + }, + B: 1, + C: "SVG favicons" +}; + +},{}],419:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F iB", + "132": "E" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "2": "sB KB", + "260": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "16": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "16": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "16": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "16": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Resource Hints: dns-prefetch" +}; + +},{}],420:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "MC XB NC OC", + "2": "G IC JC KC LC" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Resource Hints: modulepreload" +}; + +},{}],421:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H", + "260": "Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q pB hB", + "129": "r" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "16": "N" + }, + N: { + "2": "A B" + }, + O: { + "16": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Resource Hints: preconnect" +}; + +},{}],422:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D" + }, + E: { + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB", + "194": "H jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B", + "194": "8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "G M FC GC", + "2": "KB BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Resource Hints: prefetch" +}; + +},{}],423:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J", + "1028": "K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "132": "8", + "578": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "322": "B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB", + "322": "1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "578": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "Resource Hints: preload" +}; + +},{}],424:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "2": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Resource Hints: prerender" +}; + +},{}],425:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB pB hB" + }, + D: { + "1": "SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB", + "194": "RB" + }, + E: { + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB", + "322": "H jB kB" + }, + F: { + "1": "GB HB DB U N T", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B", + "322": "8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "OC", + "2": "G IC JC KC LC MC XB NC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Lazy loading via attribute for images & iframes" +}; + +},{}],426:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "16": "iB", + "132": "I D F E A" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "132": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "132": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E B C lB mB nB oB R VB qB", + "132": "BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "132": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "132": "AC" + }, + I: { + "1": "M FC GC", + "132": "KB G BC CC DC EC IB" + }, + J: { + "132": "D A" + }, + K: { + "1": "P", + "16": "A B C R VB", + "132": "BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "132": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "132": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "4": "RC" + } + }, + B: 6, + C: "localeCompare()" +}; + +},{}],427:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "AB LB CB JB EB FB GB HB DB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "194": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "Magnetometer" +}; + +},{}],428:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "36": "E A B" + }, + B: { + "1": "Q J K L V y M WB S", + "36": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB", + "36": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "36": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l" + }, + E: { + "1": "F E A B C O H eB fB XB R BB jB kB", + "2": "G 0B YB", + "36": "W I D cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B lB mB nB oB R", + "36": "C Q J K L X Y VB qB BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB", + "36": "rB IB tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "BC", + "36": "KB G CC DC EC IB FC GC" + }, + J: { + "36": "D A" + }, + K: { + "1": "P", + "2": "A B", + "36": "C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "36": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "36": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "matches() DOM method" +}; + +},{}],429:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B C lB mB nB oB R VB qB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P BB", + "2": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "matchMedia" +}; + +},{}],430:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "E A B iB", + "8": "I D F" + }, + B: { + "2": "C O H Q J K L", + "8": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "129": "sB KB pB hB" + }, + D: { + "1": "c", + "8": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "260": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "2": "E", + "4": "B C lB mB nB oB R VB qB BB", + "8": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "8": "YB rB IB" + }, + H: { + "8": "AC" + }, + I: { + "8": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "A", + "8": "D" + }, + K: { + "8": "A B C P R VB BB" + }, + L: { + "8": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "4": "HC" + }, + P: { + "8": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "8": "PC" + }, + R: { + "8": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "MathML" +}; + +},{}],431:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "16": "iB", + "900": "I D F E" + }, + B: { + "1": "V y M WB S", + "1025": "C O H Q J K L" + }, + C: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "900": "sB KB pB hB", + "1025": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "W 0B", + "900": "G YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E", + "132": "B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "rB IB tB uB vB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB", + "2052": "F wB" + }, + H: { + "132": "AC" + }, + I: { + "1": "KB G DC EC IB FC GC", + "16": "BC CC", + "4097": "M" + }, + J: { + "1": "D A" + }, + K: { + "132": "A B C R VB BB", + "4100": "P" + }, + L: { + "4097": "S" + }, + M: { + "4097": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "4097": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1025": "RC" + } + }, + B: 1, + C: "maxlength attribute for input and textarea elements" +}; + +},{}],432:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L", + "16": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H pB hB" + }, + D: { + "1": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l", + "2": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S", + "16": "gB bB aB" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G W 0B YB" + }, + F: { + "1": "B C Q J K L X Y Z a b c mB nB oB R VB qB BB", + "2": "0 1 2 3 4 5 6 7 8 9 E d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB" + }, + H: { + "16": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "16": "KB BC CC DC" + }, + J: { + "16": "D A" + }, + K: { + "1": "C P BB", + "16": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "16": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Media attribute" +}; + +},{}],433:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "132": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l pB hB", + "132": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "G W I D F E A B C O H Q J K", + "132": "0 1 2 3 4 5 6 7 8 9 L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W 0B YB cB", + "132": "I D F E A B C O H dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "132": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "YB rB IB tB uB vB", + "132": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "132": "M FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "132": "S" + }, + M: { + "132": "N" + }, + N: { + "132": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC", + "132": "JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "132": "RC" + } + }, + B: 2, + C: "Media Fragments" +}; + +},{}],434:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB", + "16": "H jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Media Session API" +}; + +},{}],435:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u pB hB", + "260": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "324": "3 4 5 6 7 8 9 AB LB CB JB" + }, + E: { + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "132": "B C O H R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n lB mB nB oB R VB qB BB", + "324": "o p q r s t u v w x P z" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "260": "N" + }, + N: { + "2": "A B" + }, + O: { + "132": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G", + "132": "IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "260": "RC" + } + }, + B: 5, + C: "Media Capture from DOM Elements API" +}; + +},{}],436:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P", + "194": "0 z" + }, + E: { + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R", + "322": "O H BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l lB mB nB oB R VB qB BB", + "194": "m n" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B", + "578": "3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "MediaRecorder API" +}; + +},{}],437:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "132": "B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c pB hB", + "66": "d e f g h i j k l m n o p q r s t" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J", + "33": "b c d e f g h i", + "66": "K L X Y Z a" + }, + E: { + "1": "F E A B C O H fB XB R BB jB kB", + "2": "G W I D 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B", + "260": "5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M GC", + "2": "KB G BC CC DC EC IB FC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "MC XB NC OC", + "2": "G IC JC KC LC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Media Source Extensions" +}; + +},{}],438:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "2114": "V y M WB S" + }, + C: { + "2": "sB KB G W I D pB hB", + "132": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s", + "322": "0 1 2 3", + "578": "t u v w x P z", + "2114": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m lB mB nB oB R VB qB BB", + "322": "n o p q", + "2114": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "1156": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2114": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Context menu item (menuitem element)" +}; + +},{}],439:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q", + "132": "PB QB RB SB TB UB V y M WB S gB bB aB", + "258": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "513": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G", + "16": "IC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "theme-color Meta Tag" +}; + +},{}],440:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "2": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "2": "E lB mB nB oB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "meter element" +}; + +},{}],441:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Web MIDI API" +}; + +},{}],442:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "8": "I iB", + "129": "D", + "257": "F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "CSS min/max-width/height" +}; + +},{}],443:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "132": "G W I D F E A B C O H Q J K L X Y Z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "2": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "MP3 audio format" +}; + +},{}],444:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L", + "2": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "386": "Z a" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Dynamic Adaptive Streaming over HTTP (MPEG-DASH)" +}; + +},{}],445:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y pB hB", + "4": "Z a b c d e f g h i j k l m" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "2": "0B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "4": "KB G BC CC EC IB", + "132": "DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "260": "N" + }, + N: { + "1": "A B" + }, + O: { + "4": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "MPEG-4/H.264 video format" +}; + +},{}],446:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "2": "sB KB pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS3 Multiple backgrounds" +}; + +},{}],447:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L", + "516": "V y M WB S" + }, + C: { + "132": "4 5 6 7 8 9 AB LB CB JB EB FB GB", + "164": "0 1 2 3 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "516": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "420": "0 1 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "516": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "132": "E fB", + "164": "D F eB", + "420": "G W I 0B YB cB dB" + }, + F: { + "1": "C R VB qB BB", + "2": "E B lB mB nB oB", + "420": "Q J K L X Y Z a b c d e f g h i j k l m n o", + "516": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "132": "xB yB", + "164": "F vB wB", + "420": "YB rB IB tB uB" + }, + H: { + "1": "AC" + }, + I: { + "420": "KB G BC CC DC EC IB FC GC", + "516": "M" + }, + J: { + "420": "D A" + }, + K: { + "1": "C R VB BB", + "2": "A B", + "132": "P" + }, + L: { + "516": "S" + }, + M: { + "132": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "420": "G" + }, + Q: { + "132": "PC" + }, + R: { + "132": "QC" + }, + S: { + "164": "RC" + } + }, + B: 4, + C: "CSS3 Multiple column layout" +}; + +},{}],448:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "260": "E A B" + }, + B: { + "132": "V y M WB S", + "260": "C O H Q J K L" + }, + C: { + "2": "sB KB G W pB hB", + "260": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "16": "G W I D F E A B C O H", + "132": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "16": "0B YB", + "132": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "C qB BB", + "2": "E lB mB nB oB", + "16": "B R VB", + "132": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "16": "YB rB", + "132": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "16": "BC CC", + "132": "KB G M DC EC IB FC GC" + }, + J: { + "132": "D A" + }, + K: { + "1": "C BB", + "2": "A", + "16": "B R VB", + "132": "P" + }, + L: { + "132": "S" + }, + M: { + "260": "N" + }, + N: { + "260": "A B" + }, + O: { + "132": "HC" + }, + P: { + "132": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "132": "PC" + }, + R: { + "132": "QC" + }, + S: { + "260": "RC" + } + }, + B: 5, + C: "Mutation events" +}; + +},{}],449:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F iB", + "8": "E A" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K", + "33": "L X Y Z a b c d e" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB", + "33": "I" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB", + "33": "uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB BC CC DC", + "8": "G EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "8": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Mutation Observer" +}; + +},{}],450:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "F E A B", + "2": "iB", + "8": "I D" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "4": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Web Storage - name/value pairs" +}; + +},{}],451:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "194": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB", + "194": "QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB lB mB nB oB R VB qB BB", + "194": "EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Native Filesystem API" +}; + +},{}],452:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W", + "33": "I D F E A B C" + }, + E: { + "1": "F E A B C O H fB XB R BB jB kB", + "2": "G W I D 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "2": "KB BC CC DC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Navigation Timing API" +}; + +},{}],453:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L V y M WB S", + "2": "C O H Q" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "16": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "16": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Navigator Language API" +}; + +},{}],454:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "1028": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB", + "1028": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "1028": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "BC FC GC", + "132": "KB G CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "516": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "132": "G", + "516": "IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "516": "QC" + }, + S: { + "260": "RC" + } + }, + B: 7, + C: "Network Information API" +}; + +},{}],455:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "16": "iB", + "644": "E A B", + "2308": "I D F" + }, + B: { + "1": "O H Q J K L V y M WB S", + "16": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H Q J K L X Y Z a b c d" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "16": "G W I 0B YB", + "1668": "cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "16": "E B C lB mB nB oB R VB", + "132": "qB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB uB" + }, + H: { + "16": "AC" + }, + I: { + "1": "M FC GC", + "16": "KB BC CC DC", + "1668": "G EC IB" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "16": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Node.contains()" +}; + +},{}],456:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "16": "iB", + "132": "E A B", + "260": "I D F" + }, + B: { + "1": "O H Q J K L V y M WB S", + "16": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H Q J K L X Y Z a b c d" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E B lB mB nB oB R VB", + "132": "C qB BB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB" + }, + H: { + "16": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "16": "KB BC CC DC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "16": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Node.parentElement" +}; + +},{}],457:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G", + "36": "W I D F E A B C O H Q J K L X Y Z" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "36": "M FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "2": "A B C R VB BB", + "36": "P" + }, + L: { + "513": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "36": "G", + "258": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "258": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Web Notifications" +}; + +},{}],458:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P pB hB" + }, + D: { + "1": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "16": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G IC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Object.entries" +}; + +},{}],459:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q", + "260": "J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D 0B YB cB dB", + "132": "F E eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E Q J K L lB mB nB", + "33": "B C oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB", + "132": "F wB xB yB" + }, + H: { + "33": "AC" + }, + I: { + "1": "M GC", + "2": "KB G BC CC DC EC IB FC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A", + "33": "B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS3 object-fit/object-position" +}; + +},{}],460:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 o p q r s t u v w x P z", + "2": "2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "b c d e f g h i j k l m n o", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "G", + "2": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Object.observe data binding" +}; + +},{}],461:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "8": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "8": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P pB hB" + }, + D: { + "1": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "8": "0 1 2 3 4 5 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "8": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB CB EB FB GB HB DB U N T", + "8": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "8": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "8": "AC" + }, + I: { + "1": "M", + "8": "KB G BC CC DC EC IB FC GC" + }, + J: { + "8": "D A" + }, + K: { + "1": "P", + "8": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "8": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "8": "G IC" + }, + Q: { + "1": "PC" + }, + R: { + "8": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Object.values method" +}; + +},{}],462:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L", + "2": "C V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "130": "A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Object RTC (ORTC) API for WebRTC" +}; + +},{}],463:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "E iB", + "8": "I D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "4": "KB", + "8": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S", + "2": "gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "8": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "2": "E lB", + "8": "mB nB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "Offline web applications" +}; + +},{}],464:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v pB hB", + "194": "0 1 2 3 4 5 6 7 8 9 w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "322": "AB LB CB JB EB FB GB HB DB U N" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w lB mB nB oB R VB qB BB", + "322": "0 1 2 3 4 5 6 7 8 9 x P z AB CB EB FB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "194": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "XB NC OC", + "2": "G IC JC KC LC MC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "194": "RC" + } + }, + B: 1, + C: "OffscreenCanvas" +}; + +},{}],465:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L V y M WB S", + "2": "C O H Q J" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Ogg Vorbis audio format" +}; + +},{}],466:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "8": "E A B" + }, + B: { + "1": "K L V y M WB S", + "8": "C O H Q J" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "1": "N" + }, + N: { + "8": "A B" + }, + O: { + "1": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Ogg/Theora video format" +}; + +},{}],467:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q", + "16": "J K L X" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB", + "16": "I" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB", + "16": "C" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Reversed attribute of ordered lists" +}; + +},{}],468:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L V y M WB S", + "2": "C O H Q" + }, + C: { + "1": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G IC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "\"once\" event listener option" +}; + +},{}],469:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D iB", + "260": "F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB", + "516": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB", + "4": "BB" + }, + G: { + "1": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "A", + "132": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Online/offline status" +}; + +},{}],470:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k" + }, + E: { + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "132": "B C O H R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB", + "132": "1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Opus" +}; + +},{}],471:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "AB LB CB JB EB FB GB HB DB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "Orientation Sensor" +}; + +},{}],472:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D iB", + "260": "F", + "388": "E A B" + }, + B: { + "1": "Q J K L V y M WB S", + "388": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB", + "129": "BB", + "260": "E B lB mB nB oB R VB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "C P BB", + "260": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "388": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS outline properties" +}; + +},{}],473:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "Q J K L V y M WB S", + "2": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G IC JC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "String.prototype.padStart(), String.prototype.padEnd()" +}; + +},{}],474:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "PageTransitionEvent" +}; + +},{}],475:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E pB hB", + "33": "A B C O H Q J K" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O", + "33": "H Q J K L X Y Z a b c d e f g h i j k" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W I 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B C lB mB nB oB R VB qB", + "33": "Q J K L X" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB", + "33": "FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P BB", + "2": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "33": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Page Visibility" +}; + +},{}],476:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L V y M WB S", + "2": "C O H Q" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Passive event listeners" +}; + +},{}],477:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "16": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V pB hB", + "16": "y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S", + "16": "gB bB aB" + }, + E: { + "1": "C O BB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB R", + "16": "H jB kB" + }, + F: { + "2": "0 1 2 3 4 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "16": "5 6 7 8 9 AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "16": "M" + }, + J: { + "2": "D", + "16": "A" + }, + K: { + "2": "A B C R VB BB", + "16": "P" + }, + L: { + "16": "S" + }, + M: { + "16": "N" + }, + N: { + "2": "A", + "16": "B" + }, + O: { + "16": "HC" + }, + P: { + "2": "G IC JC", + "16": "KC LC MC XB NC OC" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Password Rules" +}; + +},{}],478:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O", + "132": "H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i pB hB", + "132": "j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n", + "132": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I D 0B YB cB dB", + "132": "F E eB" + }, + F: { + "1": "7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a lB mB nB oB R VB qB BB", + "132": "0 1 2 3 4 5 6 b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB", + "16": "F", + "132": "wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "2": "A B C R VB BB", + "132": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "132": "HC" + }, + P: { + "1": "XB NC OC", + "132": "G IC JC KC LC MC" + }, + Q: { + "132": "PC" + }, + R: { + "132": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Path2D" +}; + +},{}],479:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O", + "322": "H", + "8196": "Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "4162": "7 8 9 AB LB CB JB EB FB GB HB", + "16452": "DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "5 6 7 8 9 AB", + "1090": "LB CB", + "8196": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB" + }, + E: { + "1": "O H BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB", + "514": "A B XB", + "8196": "C R" + }, + F: { + "1": "DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r lB mB nB oB R VB qB BB", + "194": "s t u v w x P z", + "8196": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB" + }, + G: { + "1": "4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB", + "514": "zB ZB 1B", + "8196": "2B 3B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2052": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "OC", + "2": "G", + "8196": "IC JC KC LC MC XB NC" + }, + Q: { + "8196": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "Payment Request API" +}; + +},{}],480:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "132": "B" + }, + B: { + "1": "Q J K L V y M WB S", + "16": "C O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "16": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Built-in PDF viewer" +}; + +},{}],481:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "Permissions API" +}; + +},{}],482:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "258": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB pB hB", + "258": "QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB", + "258": "CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB", + "450": "bB aB" + }, + E: { + "2": "G W I D F E A B 0B YB cB dB eB fB XB", + "258": "C O H R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P lB mB nB oB R VB qB BB", + "258": "0 1 2 3 4 5 6 7 8 9 z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B", + "258": "2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "258": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "258": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC", + "258": "LC MC XB NC OC" + }, + Q: { + "258": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Permissions Policy" +}; + +},{}],483:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB pB hB", + "132": "OB PB QB RB SB TB UB V y M", + "1090": "U", + "1412": "NB", + "1668": "N T MB" + }, + D: { + "1": "MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N", + "2114": "T" + }, + E: { + "1": "H jB kB", + "2": "G W I D F E 0B YB cB dB eB fB", + "4100": "A B C O XB R BB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o lB mB nB oB R VB qB BB", + "8196": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "9B", + "2": "F YB rB IB tB uB vB wB", + "4100": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "16388": "S" + }, + M: { + "16388": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Picture-in-Picture" +}; + +},{}],484:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "2": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l pB hB", + "578": "m n o p" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o", + "194": "p" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b lB mB nB oB R VB qB BB", + "322": "c" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Picture element" +}; + +},{}],485:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L V y M WB S", + "2": "C O H Q J" + }, + C: { + "2": "sB", + "194": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "194": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "194": "RC" + } + }, + B: 1, + C: "Ping attribute" +}; + +},{}],486:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "D F E A B", + "2": "iB", + "8": "I" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "PNG alpha transparency" +}; + +},{}],487:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "2": "sB KB pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "CSS pointer-events (for HTML)" +}; + +},{}],488:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E iB", + "164": "A" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W pB hB", + "8": "I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s", + "328": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB" + }, + D: { + "1": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z", + "8": "0 1 2 3 a b c d e f g h i j k l m n o p q r s t u v w x P z", + "584": "4 5 6" + }, + E: { + "1": "O H jB kB", + "2": "G W I 0B YB cB", + "8": "D F E A B C dB eB fB XB R", + "1096": "BB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "8": "Q J K L X Y Z a b c d e f g h i j k l m n o p q", + "584": "r s t" + }, + G: { + "1": "6B 7B 8B 9B", + "8": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B", + "6148": "5B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "8": "KB G BC CC DC EC IB FC GC" + }, + J: { + "8": "D A" + }, + K: { + "1": "P", + "2": "A", + "8": "B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "328": "N" + }, + N: { + "1": "B", + "36": "A" + }, + O: { + "8": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "IC", + "8": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "328": "RC" + } + }, + B: 2, + C: "Pointer events" +}; + +},{}],489:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "2": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O pB hB", + "33": "H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q", + "33": "a b c d e f g h i j k l m n o", + "66": "J K L X Y Z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "33": "Q J K L X Y Z a b" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Pointer Lock API" +}; + +},{}],490:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB", + "194": "RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB lB mB nB oB R VB qB BB", + "194": "EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "194": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Portals" +}; + +},{}],491:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB pB hB" + }, + D: { + "1": "SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB" + }, + E: { + "1": "O H BB jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R" + }, + F: { + "1": "EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB lB mB nB oB R VB qB BB" + }, + G: { + "1": "5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "OC", + "2": "G IC JC KC LC MC XB NC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "prefers-color-scheme media query" +}; + +},{}],492:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB pB hB" + }, + D: { + "1": "QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "GB HB DB U N T", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "NC OC", + "2": "G IC JC KC LC MC XB" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "prefers-reduced-motion media query" +}; + +},{}],493:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Private class fields" +}; + +},{}],494:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Public class fields" +}; + +},{}],495:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "2": "E lB mB nB oB" + }, + G: { + "2": "YB rB IB tB uB", + "132": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "progress element" +}; + +},{}],496:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "L V y M WB S", + "2": "C O H Q J K" + }, + C: { + "1": "AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB" + }, + F: { + "1": "2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Promise.prototype.finally" +}; + +},{}],497:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "8": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "4": "f g", + "8": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "4": "k", + "8": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j" + }, + E: { + "1": "F E A B C O H eB fB XB R BB jB kB", + "8": "G W I D 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "4": "X", + "8": "E B C Q J K L lB mB nB oB R VB qB BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "8": "YB rB IB tB uB vB" + }, + H: { + "8": "AC" + }, + I: { + "1": "M GC", + "8": "KB G BC CC DC EC IB FC" + }, + J: { + "8": "D A" + }, + K: { + "1": "P", + "8": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "8": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Promises" +}; + +},{}],498:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Proximity API" +}; + +},{}],499:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K pB hB" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 G W I D F E A B C O H Q J K L q r s t u v w x P z", + "66": "X Y Z a b c d e f g h i j k l m n o p" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C d e f g h i j k l m n lB mB nB oB R VB qB BB", + "66": "Q J K L X Y Z a b c" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Proxy object" +}; + +},{}],500:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Public class fields" +}; + +},{}],501:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB", + "2": "E B C Q J K L X DB U N T lB mB nB oB R VB qB BB", + "4": "b", + "16": "Y Z a c" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB", + "2": "NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Public Key Pinning" +}; + +},{}],502:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L", + "2": "C O H Q J", + "257": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v pB hB", + "257": "0 1 2 3 5 6 7 8 9 w P z AB LB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "1281": "4 x CB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v", + "257": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "388": "0 1 w x P z" + }, + E: { + "2": "G W I D F E 0B YB cB dB eB", + "514": "A B C O H fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o lB mB nB oB R VB qB BB", + "16": "p q r s t", + "257": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "257": "RC" + } + }, + B: 5, + C: "Push API" +}; + +},{}],503:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "iB", + "8": "I D", + "132": "F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "8": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T mB nB oB R VB qB BB", + "8": "E lB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "querySelector/querySelectorAll" +}; + +},{}],504:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "16": "iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "16": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H Q J K L X Y Z a b c d" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E lB", + "132": "B C mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB uB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "132": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "257": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "readonly attribute of input and textarea elements" +}; + +},{}],505:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "132": "B" + }, + B: { + "1": "V y M WB", + "132": "C O H Q J K L", + "513": "S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n pB hB" + }, + D: { + "1": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB", + "2": "G W I D F E A B C O H Q J K L X Y", + "260": "0 1 2 3 4 5 6 7 8 9 Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB", + "513": "S gB bB aB" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D 0B YB cB dB", + "132": "F E A B eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB", + "132": "F wB xB yB zB ZB 1B 2B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "513": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Referrer Policy" +}; + +},{}],506:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "129": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB" + }, + D: { + "2": "G W I D F E A B C", + "129": "0 1 2 3 4 5 6 7 8 9 O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B lB mB nB oB R VB", + "129": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "129": "A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Custom protocol handling" +}; + +},{}],507:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "rel=noopener" +}; + +},{}],508:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "132": "B" + }, + B: { + "1": "O H Q J K L V y M WB S", + "16": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H Q" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Link type \"noreferrer\"" +}; + +},{}],509:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "L V y M WB S", + "2": "C O H Q J", + "132": "K" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h pB hB" + }, + D: { + "1": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "132": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o lB mB nB oB R VB qB BB", + "132": "0 1 2 3 p q r s t u v w x P z" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "132": "HC" + }, + P: { + "1": "MC XB NC OC", + "2": "G", + "132": "IC JC KC LC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "relList (DOMTokenList)" +}; + +},{}],510:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F iB", + "132": "E A" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "2": "sB KB pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E B lB mB nB oB R VB" + }, + G: { + "1": "F rB IB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB", + "260": "tB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "C P BB", + "2": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "rem (root em) units" +}; + +},{}],511:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "H jB kB", + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "16": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "16": "QC" + }, + S: { + "16": "RC" + } + }, + B: 7, + C: "String.prototype.replaceAll()" +}; + +},{}],512:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "33": "B C O H Q J K L X Y Z a", + "164": "G W I D F E A" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E", + "33": "a b", + "164": "L X Y Z", + "420": "A B C O H Q J K" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB", + "33": "I" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB", + "33": "uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "requestAnimationFrame" +}; + +},{}],513:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "194": "5 6" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "requestIdleCallback" +}; + +},{}],514:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N pB hB" + }, + D: { + "1": "GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "194": "6 7 8 9 AB LB CB JB EB FB" + }, + E: { + "1": "H jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R BB", + "66": "O" + }, + F: { + "1": "4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s lB mB nB oB R VB qB BB", + "194": "0 1 2 3 t u v w x P z" + }, + G: { + "1": "8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "MC XB NC OC", + "2": "G IC JC KC LC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Resize Observer" +}; + +},{}],515:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i pB hB", + "194": "j k l m" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "260": "B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Resource Timing" +}; + +},{}],516:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v", + "194": "w x P" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i lB mB nB oB R VB qB BB", + "194": "j k l" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Rest parameters" +}; + +},{}],517:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H", + "516": "Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB", + "33": "a b c d e f g h i j k l m n o p q r s t u v" + }, + D: { + "1": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a", + "33": "0 1 2 3 4 5 6 7 b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K lB mB nB oB R VB qB BB", + "33": "L X Y Z a b c d e f g h i j k l m n o p q r s t u" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "130": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "33": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "33": "PC" + }, + R: { + "33": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "WebRTC Peer-to-peer connections" +}; + +},{}],518:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "4": "I D F E A B iB" + }, + B: { + "4": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "8": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p pB hB" + }, + D: { + "4": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "8": "G" + }, + E: { + "4": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "8": "G 0B YB" + }, + F: { + "4": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "8": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "4": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "8": "YB rB IB" + }, + H: { + "8": "AC" + }, + I: { + "4": "KB G M EC IB FC GC", + "8": "BC CC DC" + }, + J: { + "4": "A", + "8": "D" + }, + K: { + "4": "P", + "8": "A B C R VB BB" + }, + L: { + "4": "S" + }, + M: { + "1": "N" + }, + N: { + "4": "A B" + }, + O: { + "4": "HC" + }, + P: { + "4": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "4": "PC" + }, + R: { + "4": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Ruby annotation" +}; + +},{}],519:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "F E A B", + "2": "I D iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j", + "2": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I cB", + "2": "D F E A B C O H eB fB XB R BB jB kB", + "16": "dB", + "129": "G 0B YB" + }, + F: { + "1": "E B C Q J K L lB mB nB oB R VB qB BB", + "2": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "rB IB tB uB vB", + "2": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "129": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G BC CC DC EC IB FC", + "2": "M GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C R VB BB", + "2": "P" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "1": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "display: run-in" +}; + +},{}],520:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "388": "B" + }, + B: { + "1": "L V y M WB S", + "2": "C O H Q", + "129": "J K" + }, + C: { + "1": "CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB pB hB" + }, + D: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V", + "2": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "513": "y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B 0B YB cB dB eB fB XB R", + "2052": "H jB kB", + "3076": "C O BB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q lB mB nB oB R VB qB BB" + }, + G: { + "1": "5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B", + "2052": "3B 4B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "513": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "16": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "'SameSite' cookie attribute" +}; + +},{}],521:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "164": "B" + }, + B: { + "1": "V y M WB S", + "36": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K pB hB", + "36": "L X Y Z a b c d e f g h i j k l m n o p q r s t u v" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A", + "36": "B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "16": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "Screen Orientation" +}; + +},{}],522:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "2": "sB KB pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB", + "132": "W" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "async attribute for external scripts" +}; + +},{}],523:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "132": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "257": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "defer attribute for external scripts" +}; + +},{}],524:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D iB", + "132": "F E A B" + }, + B: { + "1": "V y M WB S", + "132": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "132": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n pB hB" + }, + D: { + "1": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB" + }, + E: { + "2": "G W 0B YB", + "132": "I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E lB mB nB oB", + "16": "B R VB", + "132": "C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z qB BB" + }, + G: { + "16": "YB rB IB", + "132": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "16": "BC CC", + "132": "KB G M DC EC IB FC GC" + }, + J: { + "132": "D A" + }, + K: { + "132": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "132": "HC" + }, + P: { + "132": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "132": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "scrollIntoView" +}; + +},{}],525:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Element.scrollIntoViewIfNeeded()" +}; + +},{}],526:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB", + "2": "LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "SDCH Accept-Encoding/Content-Encoding" +}; + +},{}],527:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "16": "iB", + "260": "I D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "132": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u pB hB", + "2180": "0 1 2 3 v w x P z" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "132": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "16": "IB", + "132": "YB rB", + "516": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "16": "KB G BC CC DC EC", + "1025": "IB" + }, + J: { + "1": "A", + "16": "D" + }, + K: { + "1": "P", + "16": "A B C R VB", + "132": "BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "16": "A" + }, + O: { + "1025": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2180": "RC" + } + }, + B: 5, + C: "Selection API" +}; + +},{}],528:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB pB hB" + }, + D: { + "1": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB", + "196": "CB JB EB FB", + "324": "GB" + }, + E: { + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R", + "516": "O H BB jB kB" + }, + F: { + "1": "4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Server Timing" +}; + +},{}],529:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L V y M WB S", + "2": "C O H", + "322": "Q J" + }, + C: { + "1": "0 1 2 3 5 6 7 8 9 w P z AB LB JB EB FB GB HB DB U T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k pB hB", + "194": "l m n o p q r s t u v", + "513": "4 x CB N" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r", + "4": "s t u v w" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D F E A B 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e lB mB nB oB R VB qB BB", + "4": "f g h i j" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "4": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "4": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "4": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "Service Workers" +}; + +},{}],530:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L", + "2": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "1": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Efficient Script Yielding: setImmediate()" +}; + +},{}],531:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "2": "iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "1": "KB G M CC DC EC IB FC GC", + "260": "BC" + }, + J: { + "1": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "16": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "16": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "SHA-2 SSL certificates" +}; + +},{}],532:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V", + "2": "C O H Q J K L y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "66": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c y M WB S gB bB aB", + "33": "d e f g h i j k l m" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB", + "2": "E B C U N T lB mB nB oB R VB qB BB", + "33": "Q J K L X Y Z" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB", + "33": "FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "33": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "Shadow DOM (deprecated V0 spec)" +}; + +},{}],533:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "322": "AB", + "578": "LB CB JB EB" + }, + D: { + "1": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "A B C O H XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB", + "132": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G", + "4": "IC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Shadow DOM (V1)" +}; + +},{}],534:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q", + "194": "J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "194": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB", + "450": "QB RB SB TB UB", + "513": "V y M" + }, + D: { + "1": "N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB", + "194": "CB JB EB FB GB HB DB U" + }, + E: { + "2": "G W I D F E A 0B YB cB dB eB fB", + "194": "B C O H XB R BB jB kB" + }, + F: { + "1": "GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P lB mB nB oB R VB qB BB", + "194": "0 1 2 3 4 5 6 7 8 9 z AB CB EB FB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB", + "194": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "194": "S" + }, + M: { + "194": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Shared Array Buffer" +}; + +},{}],535:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "W I cB", + "2": "G D F E A B C O H 0B YB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "2": "E lB mB nB" + }, + G: { + "1": "tB uB", + "2": "F YB rB IB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C R VB BB", + "2": "P", + "16": "A" + }, + L: { + "2": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "G", + "2": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Shared Web Workers" +}; + +},{}],536:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I iB", + "132": "D F" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Server Name Indication" +}; + +},{}],537:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E A iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "2": "3 4 5 6 7 8 9 sB KB G W I D F E A B C AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "2": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "F E A B C fB XB R", + "2": "G W I D 0B YB cB dB eB", + "129": "O H BB jB kB" + }, + F: { + "1": "Q J K L X Y Z a b c d e f g h i j k l m n o p q r u w BB", + "2": "0 1 2 3 4 5 6 7 8 9 E B C s t v x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B", + "2": "YB rB IB tB uB vB", + "257": "4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G EC IB FC GC", + "2": "M BC CC DC" + }, + J: { + "2": "D A" + }, + K: { + "1": "BB", + "2": "A B C P R VB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "2": "HC" + }, + P: { + "1": "G", + "2": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "16": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "SPDY protocol" +}; + +},{}],538:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "1026": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB", + "322": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c", + "164": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e lB mB nB oB R VB qB BB", + "1026": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "164": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "164": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "164": "PC" + }, + R: { + "164": "QC" + }, + S: { + "322": "RC" + } + }, + B: 7, + C: "Speech Recognition API" +}; + +},{}],539:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L", + "2": "C O", + "257": "V y M WB S" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i pB hB", + "194": "0 j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "0 1 2 3 4 5 6 l m n o p q r s t u v w x P z", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k", + "257": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB CB EB FB", + "2": "E B C Q J K L X Y Z a b c d e lB mB nB oB R VB qB BB", + "257": "GB HB DB U N T" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "Speech Synthesis API" +}; + +},{}],540:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "4": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "4": "AC" + }, + I: { + "4": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "A", + "4": "D" + }, + K: { + "4": "A B C P R VB BB" + }, + L: { + "4": "S" + }, + M: { + "4": "N" + }, + N: { + "4": "A B" + }, + O: { + "4": "HC" + }, + P: { + "4": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "4": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Spellcheck attribute" +}; + +},{}],541:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C 0B YB cB dB eB fB XB R BB", + "2": "O H jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B", + "2": "5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Web SQL Database" +}; + +},{}],542:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L V y M WB S", + "260": "C", + "514": "O H Q" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j pB hB", + "194": "k l m n o p" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l", + "260": "m n o p" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D 0B YB cB dB", + "260": "F eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y lB mB nB oB R VB qB BB", + "260": "Z a b c" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB", + "260": "F wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Srcset and sizes attributes" +}; + +},{}],543:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H Q J K L X Y Z a b c d" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB", + "16": "C" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB" + }, + H: { + "16": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "16": "KB BC CC DC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "16": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Event.stopImmediatePropagation()" +}; + +},{}],544:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J pB hB", + "129": "o p q r s t", + "420": "K L X Y Z a b c d e f g h i j k l m n" + }, + D: { + "1": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y", + "420": "0 1 2 3 4 Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B Q J K lB mB nB oB R VB qB", + "420": "C L X Y Z a b c d e f g h i j k l m n o p q r BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB", + "513": "8B 9B", + "1537": "1B 2B 3B 4B 5B 6B 7B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "420": "A" + }, + K: { + "1": "P", + "2": "A B R VB", + "420": "C BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "420": "G IC" + }, + Q: { + "1": "PC" + }, + R: { + "420": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "getUserMedia/Stream API" +}; + +},{}],545:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "130": "B" + }, + B: { + "16": "C O", + "260": "H Q", + "1028": "V y M WB S", + "5124": "J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "6148": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "6722": "9 AB LB CB JB EB FB GB" + }, + D: { + "2": "0 1 2 3 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "260": "4 5 6 7 8 9 AB", + "1028": "LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E 0B YB cB dB eB fB", + "3076": "A B C O H XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q lB mB nB oB R VB qB BB", + "260": "r s t u v w x", + "1028": "0 1 2 3 4 5 6 7 8 9 P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB", + "16": "zB", + "1028": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "260": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "1028": "P" + }, + L: { + "1028": "S" + }, + M: { + "2626": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC", + "1028": "KC LC MC XB NC OC" + }, + Q: { + "1028": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "Streams" +}; + +},{}],546:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A iB", + "129": "B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Strict Transport Security" +}; + +},{}],547:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "2": "sB KB G W I D F E A B C O H Q J K L X Y JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "322": "7 8 9 AB LB CB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "194": "Y Z a b c d e f g h i j k l m n o" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "322": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 7, + C: "Scoped CSS" +}; + +},{}],548:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L V y M WB S", + "2": "C O H Q J" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB", + "194": "1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Subresource Integrity" +}; + +},{}],549:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "J K L V y M WB S", + "516": "C O H Q" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "260": "G W I D F E A B C O H Q J K L X Y Z a b" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "4": "G" + }, + E: { + "1": "W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B", + "132": "G YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "132": "YB rB" + }, + H: { + "260": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P", + "260": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "SVG in CSS backgrounds" +}; + +},{}],550:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G", + "4": "W I D" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "SVG filters" +}; + +},{}],551:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "E A B iB", + "8": "I D F" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p", + "2": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "130": "0 1 2 q r s t u v w x P z" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "2": "0B" + }, + F: { + "1": "E B C Q J K L X Y Z a b c lB mB nB oB R VB qB BB", + "2": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "130": "d e f g h i j k l m n o" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "258": "AC" + }, + I: { + "1": "KB G EC IB FC GC", + "2": "M BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "130": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "G", + "130": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "130": "QC" + }, + S: { + "2": "RC" + } + }, + B: 2, + C: "SVG fonts" +}; + +},{}],552:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "260": "E A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H pB hB" + }, + D: { + "1": "2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n", + "132": "0 1 o p q r s t u v w x P z" + }, + E: { + "1": "C O H R BB jB kB", + "2": "G W I D E A B 0B YB cB dB fB XB", + "132": "F eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "Q J K L X Y Z a", + "4": "B C mB nB oB R VB qB", + "16": "E lB", + "132": "b c d e f g h i j k l m n o" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB xB yB zB ZB 1B", + "132": "F wB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D", + "132": "A" + }, + K: { + "1": "P BB", + "4": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "132": "G" + }, + Q: { + "1": "PC" + }, + R: { + "132": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "SVG fragment identifiers" +}; + +},{}],553:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "388": "E A B" + }, + B: { + "4": "V y M WB S", + "260": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB", + "4": "KB" + }, + D: { + "4": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "0B YB", + "4": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "4": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "4": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "4": "M FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "4": "A B C P R VB BB" + }, + L: { + "4": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "4": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "4": "PC" + }, + R: { + "4": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "SVG effects for HTML" +}; + +},{}],554:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "8": "I D F", + "129": "E A B" + }, + B: { + "1": "K L V y M WB S", + "129": "C O H Q J" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "8": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "8": "G W I" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "8": "G W 0B YB", + "129": "I D F cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "B oB R VB", + "8": "E lB mB nB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "8": "YB rB IB", + "129": "F tB uB vB wB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "BC CC DC", + "129": "KB G EC IB" + }, + J: { + "1": "A", + "129": "D" + }, + K: { + "1": "C P BB", + "8": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "129": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Inline SVG in HTML5" +}; + +},{}],555:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b c d e f" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "0B", + "4": "YB", + "132": "G W I D F cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "132": "F YB rB IB tB uB vB wB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "BC CC DC", + "132": "KB G EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "SVG in HTML img element" +}; + +},{}],556:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "8": "I D F E A B" + }, + B: { + "1": "V y M WB S", + "8": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "8": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "4": "G" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "8": "0B YB", + "132": "G W cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "132": "YB rB IB tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "8": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "SVG SMIL animation" +}; + +},{}],557:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "8": "I D F", + "772": "E A B" + }, + B: { + "1": "V y M WB S", + "513": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "4": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "4": "0B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "M FC GC", + "2": "BC CC DC", + "132": "KB G EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "257": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "SVG (basic support)" +}; + +},{}],558:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB", + "132": "NB OB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "GB HB DB U N T", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "16": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB", + "16": "NC OC" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Signed HTTP Exchanges (SXG)" +}; + +},{}],559:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p" + }, + E: { + "1": "E A B C O H 0B YB cB dB eB fB XB R BB jB kB", + "2": "G W I D F" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "16": "HC" + }, + P: { + "16": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Symbols" +}; + +},{}],560:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "D F E A B", + "16": "I iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "16": "sB KB pB hB", + "129": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H" + }, + E: { + "16": "G W 0B YB", + "257": "I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "16": "E" + }, + G: { + "769": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "16": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "16": "D A" + }, + K: { + "16": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "16": "A B" + }, + O: { + "16": "HC" + }, + P: { + "16": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "16": "QC" + }, + S: { + "129": "RC" + } + }, + B: 1, + C: "tabindex global attribute" +}; + +},{}],561:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "O H Q J K L V y M WB S", + "16": "C" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s" + }, + E: { + "1": "A B O H fB XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB", + "129": "C" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g lB mB nB oB R VB qB BB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB", + "129": "3B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "ES6 Template Literals (Template Strings)" +}; + +},{}],562:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "Q J K L V y M WB S", + "2": "C", + "388": "O H" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d", + "132": "e f g h i j k l m" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "2": "G W I D 0B YB cB", + "388": "F eB", + "514": "dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "132": "Q J K L X Y Z" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB", + "388": "F wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "HTML templates" +}; + +},{}],563:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F A B iB", + "16": "E" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "16": "G W" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "B C" + }, + E: { + "2": "G I 0B YB cB", + "16": "W D F E A B C O H dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB VB qB BB", + "16": "R" + }, + G: { + "2": "YB rB IB tB uB", + "16": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC EC IB FC GC", + "16": "DC" + }, + J: { + "2": "A", + "16": "D" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Test feature - updated" +}; + +},{}],564:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "2052": "V y M WB S" + }, + C: { + "2": "sB KB G W pB hB", + "1028": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "1060": "I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d", + "226": "0 1 2 3 4 5 6 7 8 e f g h i j k l m n o p q r s t u v w x P z", + "2052": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D 0B YB cB dB", + "772": "O H BB jB kB", + "804": "F E A B C fB XB R", + "1316": "eB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m lB mB nB oB R VB qB BB", + "226": "n o p q r s t u v", + "2052": "0 1 2 3 4 5 6 7 8 9 w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "YB rB IB tB uB vB", + "292": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "2052": "P" + }, + L: { + "2052": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2052": "HC" + }, + P: { + "2": "G IC JC", + "2052": "KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1028": "RC" + } + }, + B: 4, + C: "text-decoration styling" +}; + +},{}],565:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "164": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w pB hB", + "322": "x" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c", + "164": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB", + "164": "D dB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "164": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "164": "M FC GC" + }, + J: { + "2": "D", + "164": "A" + }, + K: { + "2": "A B C R VB BB", + "164": "P" + }, + L: { + "164": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "164": "HC" + }, + P: { + "164": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "164": "PC" + }, + R: { + "164": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "text-emphasis styling" +}; + +},{}],566:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B", + "2": "iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "8": "sB KB G W I pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "33": "E lB mB nB oB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "P BB", + "33": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "CSS3 Text-overflow" +}; + +},{}],567:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "33": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 G W I D F E A B C O H Q J K L X Y Z a b c d f g h i j k l m n o p q r s t u v w x P z", + "258": "e" + }, + E: { + "2": "G W I D F E A B C O H 0B YB dB eB fB XB R BB jB kB", + "258": "cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 v x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u w lB mB nB oB R VB qB BB" + }, + G: { + "2": "YB rB IB", + "33": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "33": "N" + }, + N: { + "161": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "CSS text-size-adjust" +}; + +},{}],568:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H", + "33": "V y M WB S", + "161": "Q J K L" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "161": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "450": "0" + }, + D: { + "33": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "33": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C lB mB nB oB R VB qB BB", + "33": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "33": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "36": "YB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB", + "33": "G M BC CC DC EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "2": "A B C R VB BB", + "33": "P" + }, + L: { + "33": "S" + }, + M: { + "161": "N" + }, + N: { + "2": "A B" + }, + O: { + "33": "HC" + }, + P: { + "33": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "33": "PC" + }, + R: { + "33": "QC" + }, + S: { + "161": "RC" + } + }, + B: 7, + C: "CSS text-stroke and text-fill" +}; + +},{}],569:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "1": "MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N pB hB", + "130": "T" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "O H BB jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "text-underline-offset" +}; + +},{}],570:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "16": "0B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "16": "E" + }, + G: { + "1": "F rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Node.textContent" +}; + +},{}],571:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L pB hB", + "132": "X" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "TextEncoder & TextDecoder" +}; + +},{}],572:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D iB", + "66": "F E A" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a pB hB", + "66": "b", + "129": "N T MB NB OB PB QB RB SB TB", + "388": "UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S", + "2": "G W I D F E A B C O H Q J K L X Y Z", + "1540": "gB bB aB" + }, + E: { + "1": "D F E A B C O eB fB XB R BB", + "2": "G W I 0B YB cB dB", + "513": "H jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B C lB mB nB oB R VB qB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P BB", + "2": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "129": "N" + }, + N: { + "1": "B", + "66": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "TLS 1.1" +}; + +},{}],573:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D iB", + "66": "F E A" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b pB hB", + "66": "c d e" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E Q lB", + "66": "B C mB nB oB R VB qB BB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P BB", + "2": "A B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "66": "A" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "TLS 1.2" +}; + +},{}],574:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "132": "CB JB EB", + "450": "3 4 5 6 7 8 9 AB LB" + }, + D: { + "1": "MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "706": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T" + }, + E: { + "1": "H kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R", + "1028": "O BB jB" + }, + F: { + "1": "9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "706": "6 7 8" + }, + G: { + "1": "4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "XB NC OC", + "2": "G IC JC KC LC MC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "TLS 1.3" +}; + +},{}],575:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H", + "194": "V y M WB S", + "257": "Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V pB hB", + "16": "y M" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q", + "16": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z", + "194": "AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F 0B YB cB dB eB", + "16": "E A B C O H fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h lB mB nB oB R VB qB BB", + "16": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB", + "16": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "16": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "16": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "16": "P" + }, + L: { + "16": "S" + }, + M: { + "16": "N" + }, + N: { + "2": "A", + "16": "B" + }, + O: { + "16": "HC" + }, + P: { + "16": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "16": "PC" + }, + R: { + "16": "QC" + }, + S: { + "2": "RC" + } + }, + B: 6, + C: "Token Binding" +}; + +},{}],576:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "8": "A B" + }, + B: { + "1": "V y M WB S", + "578": "C O H Q J K L" + }, + C: { + "1": "4 5 6 7 8 9 L X Y Z a b c AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "4": "G W I D F E A B C O H Q J K", + "194": "0 1 2 3 d e f g h i j k l m n o p q r s t u v w x P z" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "8": "A", + "260": "B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "2": "RC" + } + }, + B: 2, + C: "Touch events" +}; + +},{}],577:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "8": "I D F", + "129": "A B", + "161": "E" + }, + B: { + "1": "K L V y M WB S", + "129": "C O H Q J" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "33": "G W I D F E A B C O H Q pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "33": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E lB mB", + "33": "B C Q J K L X Y Z a nB oB R VB qB" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "33": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "33": "KB G BC CC DC EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS3 2D Transforms" +}; + +},{}],578:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "132": "A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E pB hB", + "33": "A B C O H Q" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B", + "33": "C O H Q J K L X Y Z a b c d e f g h i j k l m n" + }, + E: { + "2": "0B YB", + "33": "G W I D F cB dB eB", + "257": "E A B C O H fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "33": "Q J K L X Y Z a" + }, + G: { + "33": "F YB rB IB tB uB vB wB", + "257": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "BC CC DC", + "33": "KB G EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS3 3D Transforms" +}; + +},{}],579:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "WB S", + "2": "C O H Q J K L V y M" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "T", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Trusted Types for DOM manipulation" +}; + +},{}],580:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "132": "E A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T mB nB oB R VB qB BB", + "2": "E lB" + }, + G: { + "1": "F IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M CC DC EC IB FC GC", + "2": "BC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "TTF/OTF - TrueType and OpenType font support" +}; + +},{}],581:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "B", + "2": "I D F E iB", + "132": "A" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB", + "260": "cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E B lB mB nB oB R VB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB", + "260": "IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "G M EC IB FC GC", + "2": "KB BC CC DC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "C P BB", + "2": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Typed Arrays" +}; + +},{}],582:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "513": "V y M WB S" + }, + C: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P pB hB", + "322": "0 1 2 3 4 5 6 7 8 9 z AB LB CB JB EB FB GB HB DB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p", + "130": "q r s", + "513": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "O H jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R BB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r t lB mB nB oB R VB qB BB", + "513": "0 1 2 3 4 5 6 7 8 9 s u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "322": "RC" + } + }, + B: 6, + C: "FIDO U2F API" +}; + +},{}],583:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N pB hB" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n lB mB nB oB R VB qB BB" + }, + G: { + "1": "2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB", + "16": "1B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 1, + C: "unhandledrejection/rejectionhandled events" +}; + +},{}],584:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L V y M WB S", + "2": "C O H Q J" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Upgrade Insecure Requests" +}; + +},{}],585:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "WB S", + "2": "C O H Q J K L", + "66": "V y M" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB", + "66": "QB RB SB TB UB V y" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "N T", + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB lB mB nB oB R VB qB BB", + "66": "DB U" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "URL Scroll-To-Text Fragment" +}; + +},{}],586:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a", + "130": "b c d e f g h i j" + }, + E: { + "1": "F E A B C O H eB fB XB R BB jB kB", + "2": "G W I 0B YB cB dB", + "130": "D" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "130": "Q J K L" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB", + "130": "vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M GC", + "2": "KB G BC CC DC EC IB", + "130": "FC" + }, + J: { + "2": "D", + "130": "A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "URL API" +}; + +},{}],587:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L V y M WB S", + "2": "C O H Q J" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB", + "132": "h i j k l m n o p q r s t u v" + }, + D: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "1": "B C O H XB R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n lB mB nB oB R VB qB BB" + }, + G: { + "1": "ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "2": "G" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "URLSearchParams" +}; + +},{}],588:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G 0B YB", + "132": "W cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "2": "E B lB mB nB oB R VB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M EC IB FC GC", + "2": "BC CC DC" + }, + J: { + "1": "D A" + }, + K: { + "1": "C P VB BB", + "2": "A B R" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "ECMAScript 5 Strict Mode" +}; + +},{}],589:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "33": "A B" + }, + B: { + "1": "V y M WB S", + "33": "C O H Q J K L" + }, + C: { + "1": "T MB NB OB PB QB RB SB TB UB V y M", + "33": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N pB hB" + }, + D: { + "1": "6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "33": "0 1 2 3 4 5 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z" + }, + E: { + "33": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "33": "Q J K L X Y Z a b c d e f g h i j k l m n o p q r s" + }, + G: { + "33": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "33": "KB G BC CC DC EC IB FC GC" + }, + J: { + "33": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "33": "N" + }, + N: { + "33": "A B" + }, + O: { + "2": "HC" + }, + P: { + "33": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "33": "RC" + } + }, + B: 5, + C: "CSS user-select: none" +}; + +},{}],590:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "User Timing API" +}; + +},{}],591:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "K L V y M WB S", + "2": "C O H Q J" + }, + C: { + "2": "0 1 2 3 4 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "4609": "EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "4674": "JB", + "5698": "CB", + "7490": "5 6 7 8 9", + "7746": "AB LB" + }, + D: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB", + "4097": "DB", + "4290": "LB CB JB", + "6148": "EB FB GB HB" + }, + E: { + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "4609": "B C R BB", + "8193": "O H jB kB" + }, + F: { + "1": "6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "4097": "5", + "6148": "1 2 3 4" + }, + G: { + "1": "5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB", + "4097": "1B 2B 3B 4B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "4097": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC", + "4097": "LC MC XB NC OC" + }, + Q: { + "4097": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Variable fonts" +}; + +},{}],592:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A pB hB", + "33": "B C O H Q" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "Vibration API" +}; + +},{}],593:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "260": "G W I D F E A B C O H Q J K L X pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A cB dB eB fB XB", + "2": "0B YB", + "513": "B C O H R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB", + "513": "1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "132": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Video element" +}; + +},{}],594:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L", + "322": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k pB hB", + "194": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w", + "322": "0 1 2 3 4 5 6 7 8 9 x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W I 0B YB cB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j lB mB nB oB R VB qB BB", + "322": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "322": "P" + }, + L: { + "322": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "194": "RC" + } + }, + B: 1, + C: "Video Tracks" +}; + +},{}],595:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "132": "E", + "260": "A B" + }, + B: { + "1": "J K L V y M WB S", + "260": "C O H Q" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X", + "260": "Y Z a b c d" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB", + "260": "I" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB", + "516": "vB", + "772": "uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "260": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "Viewport units: vw, vh, vmin, vmax" +}; + +},{}],596:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D iB", + "4": "F E A B" + }, + B: { + "4": "C O H Q J K L V y M WB S" + }, + C: { + "4": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "4": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "0B YB", + "4": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E", + "4": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "4": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "4": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB", + "4": "M FC GC" + }, + J: { + "2": "D A" + }, + K: { + "4": "A B C P R VB BB" + }, + L: { + "4": "S" + }, + M: { + "4": "N" + }, + N: { + "4": "A B" + }, + O: { + "2": "HC" + }, + P: { + "4": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "4": "PC" + }, + R: { + "4": "QC" + }, + S: { + "4": "RC" + } + }, + B: 2, + C: "WAI-ARIA Accessibility features" +}; + +},{}],597:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "194": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB", + "194": "NB OB PB QB RB SB TB UB V y M WB S" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "194": "AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "194": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 4, + C: "Screen Wake Lock API" +}; + +},{}],598:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "J K L V y M WB S", + "2": "C O H", + "578": "Q" + }, + C: { + "1": "5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P pB hB", + "194": "0 1 2 3 z", + "1025": "4" + }, + D: { + "1": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "322": "3 4 5 6 7 8" + }, + E: { + "1": "B C O H R BB jB kB", + "2": "G W I D F E A 0B YB cB dB eB fB XB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p lB mB nB oB R VB qB BB", + "322": "q r s t u v" + }, + G: { + "1": "1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G IC JC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "194": "RC" + } + }, + B: 6, + C: "WebAssembly" +}; + +},{}],599:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T nB oB R VB qB BB", + "2": "E lB mB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "16": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "Wav audio format" +}; + +},{}],600:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D iB", + "2": "F E A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H YB cB dB eB fB XB R BB jB kB", + "16": "0B" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "16": "E" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M DC EC IB FC GC", + "16": "BC CC" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "wbr (word break opportunity) element" +}; + +},{}],601:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "260": "V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k pB hB", + "260": "LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "516": "0 1 2 3 4 5 6 7 8 9 z AB", + "580": "l m n o p q r s t u v w x P" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n", + "132": "o p q", + "260": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A 0B YB cB dB eB fB XB", + "1090": "B C O R BB", + "2049": "H jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a lB mB nB oB R VB qB BB", + "132": "b c d", + "260": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB", + "1090": "1B 2B 3B 4B 5B 6B 7B", + "2049": "8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "260": "M" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "260": "P" + }, + L: { + "260": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "260": "HC" + }, + P: { + "260": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "260": "PC" + }, + R: { + "260": "QC" + }, + S: { + "516": "RC" + } + }, + B: 5, + C: "Web Animations API" +}; + +},{}],602:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J", + "514": "K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q", + "129": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB LB CB JB EB FB GB HB DB", + "257": "U N T MB NB OB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B", + "1156": "2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "129": "P" + }, + L: { + "1": "S" + }, + M: { + "129": "N" + }, + N: { + "2": "A B" + }, + O: { + "129": "HC" + }, + P: { + "1": "NC OC", + "129": "G IC JC KC LC MC XB" + }, + Q: { + "129": "PC" + }, + R: { + "129": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "Add to home screen (A2HS)" +}; + +},{}],603:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "1025": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w", + "194": "0 1 2 3 4 x P z", + "706": "5 6 7", + "1025": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n lB mB nB oB R VB qB BB", + "450": "o p q r", + "706": "s t u", + "1025": "0 1 2 3 4 5 6 7 8 9 v w x P z AB CB EB FB GB HB DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC GC", + "1025": "M" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1025": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "JC KC LC MC XB NC OC", + "2": "G IC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Web Bluetooth" +}; + +},{}],604:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "258": "L X Y Z a b c" + }, + E: { + "1": "O H BB jB kB", + "2": "G W I D F E A B C 0B YB cB eB fB XB R", + "16": "dB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G BC CC DC EC IB FC", + "514": "M GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "514": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G", + "514": "IC JC KC" + }, + Q: { + "2": "PC" + }, + R: { + "16": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Web Share API" +}; + +},{}],605:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "L V y M WB S", + "2": "C", + "226": "O H Q J K" + }, + C: { + "1": "CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB pB hB" + }, + D: { + "1": "U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB" + }, + E: { + "1": "O H jB kB", + "2": "G W I D F E A B C 0B YB cB dB eB fB XB R", + "322": "BB" + }, + F: { + "1": "6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "0 1 2 3 4 5 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB" + }, + G: { + "1": "7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B", + "578": "6B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 2, + C: "Web Authentication API" +}; + +},{}],606:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "iB", + "8": "I D F E A", + "129": "B" + }, + B: { + "1": "V y M WB S", + "129": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "129": "G W I D F E A B C O H Q J K L X Y Z a b" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D", + "129": "F E A B C O H Q J K L X Y Z a b c d e f g h i j k" + }, + E: { + "1": "F E A B C O H fB XB R BB jB kB", + "2": "G W 0B YB", + "129": "I D cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B lB mB nB oB R VB qB", + "129": "C Q J K L BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB vB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "C P BB", + "2": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "8": "A", + "129": "B" + }, + O: { + "129": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "129": "RC" + } + }, + B: 6, + C: "WebGL - 3D Canvas graphics" +}; + +},{}],607:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c pB hB", + "194": "u v w", + "450": "d e f g h i j k l m n o p q r s t", + "2242": "0 1 2 x P z" + }, + D: { + "1": "8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u", + "578": "0 1 2 3 4 5 6 7 v w x P z" + }, + E: { + "2": "G W I D F E A 0B YB cB dB eB fB", + "1090": "B C O H XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B", + "1090": "3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "KC LC MC XB NC OC", + "2": "G IC JC" + }, + Q: { + "578": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2242": "RC" + } + }, + B: 6, + C: "WebGL 2.0" +}; + +},{}],608:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V", + "578": "y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB pB hB", + "194": "FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V", + "578": "y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B 0B YB cB dB eB fB XB", + "322": "C O H R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "194": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "WebGPU" +}; + +},{}],609:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "194": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB", + "194": "UB V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB lB mB nB oB R VB qB BB", + "194": "DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "WebHID API" +}; + +},{}],610:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F iB", + "520": "E A B" + }, + B: { + "1": "V y M WB S", + "8": "C O", + "388": "H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b c d e f" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W", + "132": "I D F E A B C O H Q J K L X Y Z a b c" + }, + E: { + "2": "0B", + "8": "G W YB cB", + "520": "I D F E A B C dB eB fB XB R", + "1028": "O BB jB", + "2052": "H kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E lB mB nB", + "132": "B C Q oB R VB qB BB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B", + "1028": "4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "BC CC", + "132": "KB G DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C R VB BB", + "132": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "8": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "IC JC KC LC MC XB NC OC", + "132": "G" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "WebM video format" +}; + +},{}],611:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L V", + "450": "y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V", + "450": "y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB lB mB nB oB R VB qB BB", + "450": "U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "450": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "Web NFC" +}; + +},{}],612:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "L V y M WB S", + "2": "C O H Q J K" + }, + C: { + "1": "HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "8": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W", + "8": "I D F", + "132": "E A B C O H Q J K L X Y Z a", + "260": "b c d e f g h i j" + }, + E: { + "1": "H kB", + "2": "G W I D F E A B C O 0B YB cB dB eB fB XB R BB jB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E lB mB nB", + "8": "B oB", + "132": "R VB qB", + "260": "C Q J K L BB" + }, + G: { + "1": "9B", + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B" + }, + H: { + "1": "AC" + }, + I: { + "1": "M IB FC GC", + "2": "KB BC CC DC", + "132": "G EC" + }, + J: { + "2": "D A" + }, + K: { + "1": "C P R VB BB", + "2": "A", + "132": "B" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "8": "RC" + } + }, + B: 7, + C: "WebP image format" +}; + +},{}],613:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB pB hB", + "132": "G W", + "292": "I D F E A" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C O H", + "260": "Q" + }, + E: { + "1": "D F E A B C O H eB fB XB R BB jB kB", + "2": "G 0B YB", + "132": "W cB", + "260": "I dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E lB mB nB oB", + "132": "B C R VB qB" + }, + G: { + "1": "F uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB", + "132": "IB tB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "129": "D" + }, + K: { + "1": "P BB", + "2": "A", + "132": "B C R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Web Sockets" +}; + +},{}],614:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "0 1 2 3 4 5 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z", + "66": "6 7 8 9 AB LB CB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s lB mB nB oB R VB qB BB", + "66": "t u v w x P z" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "1": "LC MC XB NC OC", + "2": "G IC JC KC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "WebUSB" +}; + +},{}],615:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H y M WB S", + "66": "V", + "257": "Q J K L" + }, + C: { + "2": "0 1 2 3 4 5 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB", + "129": "7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "194": "6" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z y M WB S gB bB aB", + "66": "9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v U N T lB mB nB oB R VB qB BB", + "66": "0 1 2 3 4 5 6 7 8 9 w x P z AB CB EB FB GB HB DB" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "2": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "513": "G", + "516": "IC JC KC LC MC XB NC OC" + }, + Q: { + "2": "PC" + }, + R: { + "66": "QC" + }, + S: { + "2": "RC" + } + }, + B: 7, + C: "WebVR API" +}; + +},{}],616:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b pB hB", + "66": "c d e f g h i", + "129": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K" + }, + E: { + "1": "I D F E A B C O H dB eB fB XB R BB jB kB", + "2": "G W 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "2": "D" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "B", + "2": "A" + }, + O: { + "2": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "129": "RC" + } + }, + B: 5, + C: "WebVTT - Web Video Text Tracks" +}; + +},{}],617:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "2": "iB", + "8": "I D F E" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "8": "sB KB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "8": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T oB R VB qB BB", + "2": "E lB", + "8": "mB nB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M BC FC GC", + "2": "KB G CC DC EC IB" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "8": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Web Workers" +}; + +},{}],618:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "2": "C O H Q J K L", + "132": "V y M WB S" + }, + C: { + "2": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB pB hB", + "322": "TB UB V y M" + }, + D: { + "2": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB", + "66": "HB DB U N T MB NB OB PB QB RB SB TB UB", + "132": "V y M WB S gB bB aB" + }, + E: { + "2": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "2": "0 1 2 3 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z lB mB nB oB R VB qB BB", + "66": "4 5 6 7 8 9 AB CB EB FB GB HB", + "132": "DB U N T" + }, + G: { + "2": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "2": "AC" + }, + I: { + "2": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "2": "A B C P R VB BB" + }, + L: { + "132": "S" + }, + M: { + "2": "N" + }, + N: { + "2": "A B" + }, + O: { + "2": "HC" + }, + P: { + "2": "G IC JC KC LC MC XB NC", + "132": "OC" + }, + Q: { + "2": "PC" + }, + R: { + "2": "QC" + }, + S: { + "2": "RC" + } + }, + B: 5, + C: "WebXR Device API" +}; + +},{}],619:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "V y M WB S", + "2": "C O H Q J K L" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g pB hB", + "194": "h i j k l m n" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n" + }, + E: { + "1": "A B C O H fB XB R BB jB kB", + "2": "G W I D F E 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a b lB mB nB oB R VB qB BB" + }, + G: { + "1": "yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS will-change property" +}; + +},{}],620:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M hB", + "2": "sB KB pB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G" + }, + E: { + "1": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "G W 0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T R VB qB BB", + "2": "E B lB mB nB oB" + }, + G: { + "1": "F tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M FC GC", + "2": "KB BC CC DC EC IB", + "130": "G" + }, + J: { + "1": "D A" + }, + K: { + "1": "B C P R VB BB", + "2": "A" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 2, + C: "WOFF - Web Open Font Format" +}; + +},{}],621:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E A B iB" + }, + B: { + "1": "H Q J K L V y M WB S", + "2": "C O" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "2": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n" + }, + E: { + "1": "C O H BB jB kB", + "2": "G W I D F E 0B YB cB dB eB fB", + "132": "A B XB R" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C Q J K L X Y Z a lB mB nB oB R VB qB BB" + }, + G: { + "1": "zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "F YB rB IB tB uB vB wB xB yB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "2": "KB G BC CC DC EC IB FC GC" + }, + J: { + "2": "D A" + }, + K: { + "1": "P", + "2": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "2": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "WOFF 2.0 - Web Open Font Format" +}; + +},{}],622:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "I D F E A B iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB G W I D F E A B C O H pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "4": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v" + }, + E: { + "1": "E A B C O H fB XB R BB jB kB", + "4": "G W I D F 0B YB cB dB eB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "2": "E B C lB mB nB oB R VB qB BB", + "4": "Q J K L X Y Z a b c d e f g h i" + }, + G: { + "1": "xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "4": "F YB rB IB tB uB vB wB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M", + "4": "KB G BC CC DC EC IB FC GC" + }, + J: { + "4": "D A" + }, + K: { + "2": "A B C R VB BB", + "4": "P" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "4": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "4": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 5, + C: "CSS3 word-break" +}; + +},{}],623:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "4": "I D F E A B iB" + }, + B: { + "1": "L V y M WB S", + "4": "C O H Q J K" + }, + C: { + "1": "1 2 3 4 5 6 7 8 9 AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "4": "0 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "4": "G W I D F E A B C O H Q J K L X Y Z a" + }, + E: { + "1": "D F E A B C O H dB eB fB XB R BB jB kB", + "4": "G W I 0B YB cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E lB mB", + "4": "B C nB oB R VB qB" + }, + G: { + "1": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "4": "YB rB IB tB uB" + }, + H: { + "4": "AC" + }, + I: { + "1": "M FC GC", + "4": "KB G BC CC DC EC IB" + }, + J: { + "1": "A", + "4": "D" + }, + K: { + "1": "P", + "4": "A B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "4": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "4": "RC" + } + }, + B: 5, + C: "CSS3 Overflow-wrap" +}; + +},{}],624:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D iB", + "132": "F E", + "260": "A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB", + "2": "sB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H cB dB eB fB XB R BB jB kB", + "2": "0B YB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB", + "2": "E" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "4": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "Cross-document messaging" +}; + +},{}],625:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "F E A B", + "2": "I D iB" + }, + B: { + "1": "C O H Q J K L", + "4": "V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T", + "4": "G W I D F E A B C O H Q J K MB NB OB PB QB RB SB TB UB V y M", + "16": "sB KB pB hB" + }, + D: { + "4": "0 1 2 3 4 5 6 7 8 9 e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I D F E A B C O H Q J K L X Y Z a b c d" + }, + E: { + "4": "I D F E A B C O H cB dB eB fB XB R BB jB kB", + "16": "G W 0B YB" + }, + F: { + "4": "0 1 2 3 4 5 6 7 8 9 C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T qB BB", + "16": "E B lB mB nB oB R VB" + }, + G: { + "4": "F vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "16": "YB rB IB tB uB" + }, + H: { + "2": "AC" + }, + I: { + "4": "G M EC IB FC GC", + "16": "KB BC CC DC" + }, + J: { + "4": "D A" + }, + K: { + "4": "P BB", + "16": "A B C R VB" + }, + L: { + "4": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "4": "HC" + }, + P: { + "4": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "4": "PC" + }, + R: { + "4": "QC" + }, + S: { + "1": "RC" + } + }, + B: 6, + C: "X-Frame-Options HTTP header" +}; + +},{}],626:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "I D F E iB", + "132": "A B" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "2": "sB KB", + "260": "A B", + "388": "I D F E", + "900": "G W pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "16": "G W I", + "132": "h i", + "388": "D F E A B C O H Q J K L X Y Z a b c d e f g" + }, + E: { + "1": "F E A B C O H eB fB XB R BB jB kB", + "2": "G 0B YB", + "132": "D dB", + "388": "W I cB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 C L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T BB", + "2": "E B lB mB nB oB R VB qB", + "132": "Q J K" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "2": "YB rB IB", + "132": "vB", + "388": "tB uB" + }, + H: { + "2": "AC" + }, + I: { + "1": "M GC", + "2": "BC CC DC", + "388": "FC", + "900": "KB G EC IB" + }, + J: { + "132": "A", + "388": "D" + }, + K: { + "1": "C P BB", + "2": "A B R VB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "132": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "XMLHttpRequest advanced features" +}; + +},{}],627:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "E A B", + "2": "I D F iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "1": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "1": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "1": "AC" + }, + I: { + "1": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "1": "D A" + }, + K: { + "1": "A B C P R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "2": "QC" + }, + S: { + "1": "RC" + } + }, + B: 1, + C: "XHTML served as application/xhtml+xml" +}; + +},{}],628:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "2": "E A B iB", + "4": "I D F" + }, + B: { + "2": "C O H Q J K L", + "8": "V y M WB S" + }, + C: { + "8": "0 1 2 3 4 5 6 7 8 9 sB KB G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M pB hB" + }, + D: { + "8": "0 1 2 3 4 5 6 7 8 9 G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB" + }, + E: { + "8": "G W I D F E A B C O H 0B YB cB dB eB fB XB R BB jB kB" + }, + F: { + "8": "0 1 2 3 4 5 6 7 8 9 E B C Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T lB mB nB oB R VB qB BB" + }, + G: { + "8": "F YB rB IB tB uB vB wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B" + }, + H: { + "8": "AC" + }, + I: { + "8": "KB G M BC CC DC EC IB FC GC" + }, + J: { + "8": "D A" + }, + K: { + "8": "A B C P R VB BB" + }, + L: { + "8": "S" + }, + M: { + "8": "N" + }, + N: { + "2": "A B" + }, + O: { + "8": "HC" + }, + P: { + "8": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "8": "PC" + }, + R: { + "8": "QC" + }, + S: { + "8": "RC" + } + }, + B: 7, + C: "XHTML+SMIL animation" +}; + +},{}],629:[function(require,module,exports){ +"use strict"; + +module.exports = { + A: { + A: { + "1": "A B", + "260": "I D F E iB" + }, + B: { + "1": "C O H Q J K L V y M WB S" + }, + C: { + "1": "0 1 2 3 4 5 6 7 8 9 C O H Q J K L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M", + "132": "B", + "260": "sB KB G W I D pB hB", + "516": "F E A" + }, + D: { + "1": "0 1 2 3 4 5 6 7 8 9 j k l m n o p q r s t u v w x P z AB LB CB JB EB FB GB HB DB U N T MB NB OB PB QB RB SB TB UB V y M WB S gB bB aB", + "132": "G W I D F E A B C O H Q J K L X Y Z a b c d e f g h i" + }, + E: { + "1": "F E A B C O H eB fB XB R BB jB kB", + "132": "G W I D 0B YB cB dB" + }, + F: { + "1": "0 1 2 3 4 5 6 7 8 9 L X Y Z a b c d e f g h i j k l m n o p q r s t u v w x P z AB CB EB FB GB HB DB U N T", + "16": "E lB", + "132": "B C Q J K mB nB oB R VB qB BB" + }, + G: { + "1": "F wB xB yB zB ZB 1B 2B 3B 4B 5B 6B 7B 8B 9B", + "132": "YB rB IB tB uB vB" + }, + H: { + "132": "AC" + }, + I: { + "1": "M FC GC", + "132": "KB G BC CC DC EC IB" + }, + J: { + "132": "D A" + }, + K: { + "1": "P", + "16": "A", + "132": "B C R VB BB" + }, + L: { + "1": "S" + }, + M: { + "1": "N" + }, + N: { + "1": "A B" + }, + O: { + "1": "HC" + }, + P: { + "1": "G IC JC KC LC MC XB NC OC" + }, + Q: { + "1": "PC" + }, + R: { + "1": "QC" + }, + S: { + "1": "RC" + } + }, + B: 4, + C: "DOM Parsing and Serialization" +}; + +},{}],630:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = { + 1: "ls", + // WHATWG Living Standard + 2: "rec", + // W3C Recommendation + 3: "pr", + // W3C Proposed Recommendation + 4: "cr", + // W3C Candidate Recommendation + 5: "wd", + // W3C Working Draft + 6: "other", + // Non-W3C, but reputable + 7: "unoff" // Unofficial, Editor's Draft or W3C "Note" + +}; + +},{}],631:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = { + y: 1 << 0, + n: 1 << 1, + a: 1 << 2, + p: 1 << 3, + u: 1 << 4, + x: 1 << 5, + d: 1 << 6 +}; + +},{}],632:[function(require,module,exports){ +arguments[4][84][0].apply(exports,arguments) +},{"../../data/agents":88,"./browserVersions":633,"./browsers":634,"dup":84}],633:[function(require,module,exports){ +arguments[4][85][0].apply(exports,arguments) +},{"../../data/browserVersions":89,"dup":85}],634:[function(require,module,exports){ +arguments[4][86][0].apply(exports,arguments) +},{"../../data/browsers":90,"dup":86}],635:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = unpackFeature; + +var _statuses = require('../lib/statuses'); + +var _statuses2 = _interopRequireDefault(_statuses); + +var _supported = require('../lib/supported'); + +var _supported2 = _interopRequireDefault(_supported); + +var _browsers = require('./browsers'); + +var _browserVersions = require('./browserVersions'); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +var MATH2LOG = Math.log(2); + +function unpackSupport(cipher) { + // bit flags + var stats = Object.keys(_supported2.default).reduce(function (list, support) { + if (cipher & _supported2.default[support]) list.push(support); + return list; + }, []); // notes + + var notes = cipher >> 7; + var notesArray = []; + + while (notes) { + var note = Math.floor(Math.log(notes) / MATH2LOG) + 1; + notesArray.unshift('#' + note); + notes -= Math.pow(2, note - 1); + } + + return stats.concat(notesArray).join(' '); +} + +function unpackFeature(packed) { + var unpacked = { + status: _statuses2.default[packed.B], + title: packed.C + }; + unpacked.stats = Object.keys(packed.A).reduce(function (browserStats, key) { + var browser = packed.A[key]; + browserStats[_browsers.browsers[key]] = Object.keys(browser).reduce(function (stats, support) { + var packedVersions = browser[support].split(' '); + var unpacked = unpackSupport(support); + packedVersions.forEach(function (v) { + return stats[_browserVersions.browserVersions[v]] = unpacked; + }); + return stats; + }, {}); + return browserStats; + }, {}); + return unpacked; +} + +},{"../lib/statuses":630,"../lib/supported":631,"./browserVersions":633,"./browsers":634}],636:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +/* + * Load this dynamically so that it + * doesn't appear in the rollup bundle. + */ + +var features = exports.features = require('../../data/features'); + +},{"../../data/features":91}],637:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _agents = require('./agents'); + +Object.defineProperty(exports, 'agents', { + enumerable: true, + get: function get() { + return _agents.agents; + } +}); + +var _feature = require('./feature'); + +Object.defineProperty(exports, 'feature', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_feature).default; + } +}); + +var _features = require('./features'); + +Object.defineProperty(exports, 'features', { + enumerable: true, + get: function get() { + return _features.features; + } +}); + +var _region = require('./region'); + +Object.defineProperty(exports, 'region', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_region).default; + } +}); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +},{"./agents":632,"./feature":635,"./features":636,"./region":638}],638:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = unpackRegion; + +var _browsers = require('./browsers'); + +function unpackRegion(packed) { + return Object.keys(packed).reduce(function (list, browser) { + var data = packed[browser]; + list[_browsers.browsers[browser]] = Object.keys(data).reduce(function (memo, key) { + var stats = data[key]; + + if (key === '_') { + stats.split(' ').forEach(function (version) { + return memo[version] = null; + }); + } else { + memo[key] = stats; + } + + return memo; + }, {}); + return list; + }, {}); +} + +},{"./browsers":634}],639:[function(require,module,exports){ +"use strict"; + +module.exports = { + "0.20": "39", + "0.21": "41", + "0.22": "41", + "0.23": "41", + "0.24": "41", + "0.25": "42", + "0.26": "42", + "0.27": "43", + "0.28": "43", + "0.29": "43", + "0.30": "44", + "0.31": "45", + "0.32": "45", + "0.33": "45", + "0.34": "45", + "0.35": "45", + "0.36": "47", + "0.37": "49", + "1.0": "49", + "1.1": "50", + "1.2": "51", + "1.3": "52", + "1.4": "53", + "1.5": "54", + "1.6": "56", + "1.7": "58", + "1.8": "59", + "2.0": "61", + "2.1": "61", + "3.0": "66", + "3.1": "66", + "4.0": "69", + "4.1": "69", + "4.2": "69", + "5.0": "73", + "6.0": "76", + "6.1": "76", + "7.0": "78", + "7.1": "78", + "7.2": "78", + "7.3": "78", + "8.0": "80", + "8.1": "80", + "8.2": "80", + "8.3": "80", + "9.0": "83", + "10.0": "85" +}; + +},{}],640:[function(require,module,exports){ +"use strict"; + +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? nBytes - 1 : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + i += d; + e = s & (1 << -nBits) - 1; + s >>= -nBits; + nBits += eLen; + + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & (1 << -nBits) - 1; + e >>= -nBits; + nBits += mLen; + + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : (s ? -1 : 1) * Infinity; + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + + return (s ? -1 : 1) * m * Math.pow(2, e - mLen); +}; + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0; + var i = isLE ? 0 : nBytes - 1; + var d = isLE ? 1 : -1; + var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; + value = Math.abs(value); + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + + if (value * c >= 2) { + e++; + c /= 2; + } + + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = e << mLen | m; + eLen += mLen; + + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128; +}; + +},{}],641:[function(require,module,exports){ +module.exports=[ + { + "name": "nodejs", + "version": "0.2.0", + "date": "2011-08-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.3.0", + "date": "2011-08-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.4.0", + "date": "2011-08-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.5.0", + "date": "2011-08-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.6.0", + "date": "2011-11-04", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.7.0", + "date": "2012-01-17", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.8.0", + "date": "2012-06-22", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.9.0", + "date": "2012-07-20", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.10.0", + "date": "2013-03-11", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.11.0", + "date": "2013-03-28", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "0.12.0", + "date": "2015-02-06", + "lts": false, + "security": false + }, + { + "name": "iojs", + "version": "1.0.0", + "date": "2015-01-14" + }, + { + "name": "iojs", + "version": "1.1.0", + "date": "2015-02-03" + }, + { + "name": "iojs", + "version": "1.2.0", + "date": "2015-02-11" + }, + { + "name": "iojs", + "version": "1.3.0", + "date": "2015-02-20" + }, + { + "name": "iojs", + "version": "1.5.0", + "date": "2015-03-06" + }, + { + "name": "iojs", + "version": "1.6.0", + "date": "2015-03-20" + }, + { + "name": "iojs", + "version": "2.0.0", + "date": "2015-05-04" + }, + { + "name": "iojs", + "version": "2.1.0", + "date": "2015-05-24" + }, + { + "name": "iojs", + "version": "2.2.0", + "date": "2015-06-01" + }, + { + "name": "iojs", + "version": "2.3.0", + "date": "2015-06-13" + }, + { + "name": "iojs", + "version": "2.4.0", + "date": "2015-07-17" + }, + { + "name": "iojs", + "version": "2.5.0", + "date": "2015-07-28" + }, + { + "name": "iojs", + "version": "3.0.0", + "date": "2015-08-04" + }, + { + "name": "iojs", + "version": "3.1.0", + "date": "2015-08-19" + }, + { + "name": "iojs", + "version": "3.2.0", + "date": "2015-08-25" + }, + { + "name": "iojs", + "version": "3.3.0", + "date": "2015-09-02" + }, + { + "name": "nodejs", + "version": "4.0.0", + "date": "2015-09-08", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "4.1.0", + "date": "2015-09-17", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "4.2.0", + "date": "2015-10-12", + "lts": "Argon", + "security": false + }, + { + "name": "nodejs", + "version": "4.3.0", + "date": "2016-02-09", + "lts": "Argon", + "security": false + }, + { + "name": "nodejs", + "version": "4.4.0", + "date": "2016-03-08", + "lts": "Argon", + "security": false + }, + { + "name": "nodejs", + "version": "4.5.0", + "date": "2016-08-16", + "lts": "Argon", + "security": false + }, + { + "name": "nodejs", + "version": "4.6.0", + "date": "2016-09-27", + "lts": "Argon", + "security": true + }, + { + "name": "nodejs", + "version": "4.7.0", + "date": "2016-12-06", + "lts": "Argon", + "security": false + }, + { + "name": "nodejs", + "version": "4.8.0", + "date": "2017-02-21", + "lts": "Argon", + "security": false + }, + { + "name": "nodejs", + "version": "4.9.0", + "date": "2018-03-28", + "lts": "Argon", + "security": true + }, + { + "name": "nodejs", + "version": "5.0.0", + "date": "2015-10-29", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.1.0", + "date": "2015-11-17", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.2.0", + "date": "2015-12-09", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.3.0", + "date": "2015-12-15", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.4.0", + "date": "2016-01-06", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.5.0", + "date": "2016-01-21", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.6.0", + "date": "2016-02-09", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.7.0", + "date": "2016-02-23", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.8.0", + "date": "2016-03-09", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.9.0", + "date": "2016-03-16", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.10.0", + "date": "2016-04-01", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.11.0", + "date": "2016-04-21", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "5.12.0", + "date": "2016-06-23", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "6.0.0", + "date": "2016-04-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "6.1.0", + "date": "2016-05-05", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "6.2.0", + "date": "2016-05-17", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "6.3.0", + "date": "2016-07-06", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "6.4.0", + "date": "2016-08-12", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "6.5.0", + "date": "2016-08-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "6.6.0", + "date": "2016-09-14", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "6.7.0", + "date": "2016-09-27", + "lts": false, + "security": true + }, + { + "name": "nodejs", + "version": "6.8.0", + "date": "2016-10-12", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "6.9.0", + "date": "2016-10-18", + "lts": "Boron", + "security": false + }, + { + "name": "nodejs", + "version": "6.10.0", + "date": "2017-02-21", + "lts": "Boron", + "security": false + }, + { + "name": "nodejs", + "version": "6.11.0", + "date": "2017-06-06", + "lts": "Boron", + "security": false + }, + { + "name": "nodejs", + "version": "6.12.0", + "date": "2017-11-06", + "lts": "Boron", + "security": false + }, + { + "name": "nodejs", + "version": "6.13.0", + "date": "2018-02-10", + "lts": "Boron", + "security": false + }, + { + "name": "nodejs", + "version": "6.14.0", + "date": "2018-03-28", + "lts": "Boron", + "security": true + }, + { + "name": "nodejs", + "version": "6.15.0", + "date": "2018-11-27", + "lts": "Boron", + "security": true + }, + { + "name": "nodejs", + "version": "6.16.0", + "date": "2018-12-26", + "lts": "Boron", + "security": false + }, + { + "name": "nodejs", + "version": "6.17.0", + "date": "2019-02-28", + "lts": "Boron", + "security": true + }, + { + "name": "nodejs", + "version": "7.0.0", + "date": "2016-10-25", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.1.0", + "date": "2016-11-08", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.2.0", + "date": "2016-11-22", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.3.0", + "date": "2016-12-20", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.4.0", + "date": "2017-01-04", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.5.0", + "date": "2017-01-31", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.6.0", + "date": "2017-02-21", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.7.0", + "date": "2017-02-28", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.8.0", + "date": "2017-03-29", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.9.0", + "date": "2017-04-11", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "7.10.0", + "date": "2017-05-02", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.0.0", + "date": "2017-05-30", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.1.0", + "date": "2017-06-08", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.2.0", + "date": "2017-07-19", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.3.0", + "date": "2017-08-08", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.4.0", + "date": "2017-08-15", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.5.0", + "date": "2017-09-12", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.6.0", + "date": "2017-09-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.7.0", + "date": "2017-10-11", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.8.0", + "date": "2017-10-24", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "8.9.0", + "date": "2017-10-31", + "lts": "Carbon", + "security": false + }, + { + "name": "nodejs", + "version": "8.10.0", + "date": "2018-03-06", + "lts": "Carbon", + "security": false + }, + { + "name": "nodejs", + "version": "8.11.0", + "date": "2018-03-28", + "lts": "Carbon", + "security": true + }, + { + "name": "nodejs", + "version": "8.12.0", + "date": "2018-09-10", + "lts": "Carbon", + "security": false + }, + { + "name": "nodejs", + "version": "8.13.0", + "date": "2018-11-20", + "lts": "Carbon", + "security": false + }, + { + "name": "nodejs", + "version": "8.14.0", + "date": "2018-11-27", + "lts": "Carbon", + "security": true + }, + { + "name": "nodejs", + "version": "8.15.0", + "date": "2018-12-26", + "lts": "Carbon", + "security": false + }, + { + "name": "nodejs", + "version": "8.16.0", + "date": "2019-04-16", + "lts": "Carbon", + "security": false + }, + { + "name": "nodejs", + "version": "8.17.0", + "date": "2019-12-17", + "lts": "Carbon", + "security": true + }, + { + "name": "nodejs", + "version": "9.0.0", + "date": "2017-10-31", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.1.0", + "date": "2017-11-07", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.2.0", + "date": "2017-11-14", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.3.0", + "date": "2017-12-12", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.4.0", + "date": "2018-01-10", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.5.0", + "date": "2018-01-31", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.6.0", + "date": "2018-02-21", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.7.0", + "date": "2018-03-01", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.8.0", + "date": "2018-03-07", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.9.0", + "date": "2018-03-21", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "9.10.0", + "date": "2018-03-28", + "lts": false, + "security": true + }, + { + "name": "nodejs", + "version": "9.11.0", + "date": "2018-04-04", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.0.0", + "date": "2018-04-24", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.1.0", + "date": "2018-05-08", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.2.0", + "date": "2018-05-23", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.3.0", + "date": "2018-05-29", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.4.0", + "date": "2018-06-06", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.5.0", + "date": "2018-06-20", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.6.0", + "date": "2018-07-04", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.7.0", + "date": "2018-07-18", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.8.0", + "date": "2018-08-01", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.9.0", + "date": "2018-08-15", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.10.0", + "date": "2018-09-06", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.11.0", + "date": "2018-09-19", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.12.0", + "date": "2018-10-10", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "10.13.0", + "date": "2018-10-30", + "lts": "Dubnium", + "security": false + }, + { + "name": "nodejs", + "version": "10.14.0", + "date": "2018-11-27", + "lts": "Dubnium", + "security": true + }, + { + "name": "nodejs", + "version": "10.15.0", + "date": "2018-12-26", + "lts": "Dubnium", + "security": false + }, + { + "name": "nodejs", + "version": "10.16.0", + "date": "2019-05-28", + "lts": "Dubnium", + "security": false + }, + { + "name": "nodejs", + "version": "10.17.0", + "date": "2019-10-21", + "lts": "Dubnium", + "security": false + }, + { + "name": "nodejs", + "version": "10.18.0", + "date": "2019-12-16", + "lts": "Dubnium", + "security": true + }, + { + "name": "nodejs", + "version": "10.19.0", + "date": "2020-02-05", + "lts": "Dubnium", + "security": true + }, + { + "name": "nodejs", + "version": "10.20.0", + "date": "2020-03-24", + "lts": "Dubnium", + "security": false + }, + { + "name": "nodejs", + "version": "10.21.0", + "date": "2020-06-02", + "lts": "Dubnium", + "security": true + }, + { + "name": "nodejs", + "version": "11.0.0", + "date": "2018-10-23", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.1.0", + "date": "2018-10-30", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.2.0", + "date": "2018-11-15", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.3.0", + "date": "2018-11-27", + "lts": false, + "security": true + }, + { + "name": "nodejs", + "version": "11.4.0", + "date": "2018-12-07", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.5.0", + "date": "2018-12-18", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.6.0", + "date": "2018-12-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.7.0", + "date": "2019-01-17", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.8.0", + "date": "2019-01-24", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.9.0", + "date": "2019-01-30", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.10.0", + "date": "2019-02-14", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.11.0", + "date": "2019-03-05", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.12.0", + "date": "2019-03-14", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.13.0", + "date": "2019-03-28", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.14.0", + "date": "2019-04-10", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "11.15.0", + "date": "2019-04-30", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.0.0", + "date": "2019-04-23", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.1.0", + "date": "2019-04-29", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.2.0", + "date": "2019-05-07", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.3.0", + "date": "2019-05-21", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.4.0", + "date": "2019-06-04", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.5.0", + "date": "2019-06-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.6.0", + "date": "2019-07-03", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.7.0", + "date": "2019-07-23", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.8.0", + "date": "2019-08-06", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.9.0", + "date": "2019-08-20", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.10.0", + "date": "2019-09-04", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.11.0", + "date": "2019-09-25", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.12.0", + "date": "2019-10-11", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "12.13.0", + "date": "2019-10-21", + "lts": "Erbium", + "security": false + }, + { + "name": "nodejs", + "version": "12.14.0", + "date": "2019-12-16", + "lts": "Erbium", + "security": true + }, + { + "name": "nodejs", + "version": "12.15.0", + "date": "2020-02-05", + "lts": "Erbium", + "security": true + }, + { + "name": "nodejs", + "version": "12.16.0", + "date": "2020-02-11", + "lts": "Erbium", + "security": false + }, + { + "name": "nodejs", + "version": "12.17.0", + "date": "2020-05-26", + "lts": "Erbium", + "security": false + }, + { + "name": "nodejs", + "version": "12.18.0", + "date": "2020-06-02", + "lts": "Erbium", + "security": true + }, + { + "name": "nodejs", + "version": "13.0.0", + "date": "2019-10-10", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.1.0", + "date": "2019-11-05", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.2.0", + "date": "2019-11-21", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.3.0", + "date": "2019-12-03", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.4.0", + "date": "2019-12-17", + "lts": false, + "security": true + }, + { + "name": "nodejs", + "version": "13.5.0", + "date": "2019-12-18", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.6.0", + "date": "2020-01-07", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.7.0", + "date": "2020-01-21", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.8.0", + "date": "2020-02-05", + "lts": false, + "security": true + }, + { + "name": "nodejs", + "version": "13.9.0", + "date": "2020-02-18", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.10.0", + "date": "2020-03-03", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.11.0", + "date": "2020-03-12", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.12.0", + "date": "2020-03-26", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.13.0", + "date": "2020-04-14", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "13.14.0", + "date": "2020-04-28", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "14.0.0", + "date": "2020-04-21", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "14.1.0", + "date": "2020-04-29", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "14.2.0", + "date": "2020-05-05", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "14.3.0", + "date": "2020-05-19", + "lts": false, + "security": false + }, + { + "name": "nodejs", + "version": "14.4.0", + "date": "2020-06-02", + "lts": false, + "security": true + } +] +},{}],642:[function(require,module,exports){ +module.exports={ + "v0.10": { + "start": "2013-03-11", + "end": "2016-10-31" + }, + "v0.12": { + "start": "2015-02-06", + "end": "2016-12-31" + }, + "v4": { + "start": "2015-09-08", + "lts": "2015-10-12", + "maintenance": "2017-04-01", + "end": "2018-04-30", + "codename": "Argon" + }, + "v5": { + "start": "2015-10-29", + "maintenance": "2016-04-30", + "end": "2016-06-30" + }, + "v6": { + "start": "2016-04-26", + "lts": "2016-10-18", + "maintenance": "2018-04-30", + "end": "2019-04-30", + "codename": "Boron" + }, + "v7": { + "start": "2016-10-25", + "maintenance": "2017-04-30", + "end": "2017-06-30" + }, + "v8": { + "start": "2017-05-30", + "lts": "2017-10-31", + "maintenance": "2019-01-01", + "end": "2019-12-31", + "codename": "Carbon" + }, + "v9": { + "start": "2017-10-01", + "maintenance": "2018-04-01", + "end": "2018-06-30" + }, + "v10": { + "start": "2018-04-24", + "lts": "2018-10-30", + "maintenance": "2020-05-19", + "end": "2021-04-30", + "codename": "Dubnium" + }, + "v11": { + "start": "2018-10-23", + "maintenance": "2019-04-22", + "end": "2019-06-01" + }, + "v12": { + "start": "2019-04-23", + "lts": "2019-10-21", + "maintenance": "2020-10-20", + "end": "2022-04-30", + "codename": "Erbium" + }, + "v13": { + "start": "2019-10-22", + "maintenance": "2020-04-01", + "end": "2020-06-01" + }, + "v14": { + "start": "2020-04-21", + "lts": "2020-10-20", + "maintenance": "2021-10-19", + "end": "2023-04-30", + "codename": "" + }, + "v15": { + "start": "2020-10-21", + "maintenance": "2021-04-01", + "end": "2021-06-01" + } +} + +},{}],643:[function(require,module,exports){ +'use strict'; + +module.exports = { + wrap: wrapRange, + limit: limitRange, + validate: validateRange, + test: testRange, + curry: curry, + name: name +}; + +function wrapRange(min, max, value) { + var maxLessMin = max - min; + return ((value - min) % maxLessMin + maxLessMin) % maxLessMin + min; +} + +function limitRange(min, max, value) { + return Math.max(min, Math.min(max, value)); +} + +function validateRange(min, max, value, minExclusive, maxExclusive) { + if (!testRange(min, max, value, minExclusive, maxExclusive)) { + throw new Error(value + ' is outside of range [' + min + ',' + max + ')'); + } + + return value; +} + +function testRange(min, max, value, minExclusive, maxExclusive) { + return !(value < min || value > max || maxExclusive && value === max || minExclusive && value === min); +} + +function name(min, max, minExcl, maxExcl) { + return (minExcl ? '(' : '[') + min + ',' + max + (maxExcl ? ')' : ']'); +} + +function curry(min, max, minExclusive, maxExclusive) { + var boundNameFn = name.bind(null, min, max, minExclusive, maxExclusive); + return { + wrap: wrapRange.bind(null, min, max), + limit: limitRange.bind(null, min, max), + validate: function validate(value) { + return validateRange(min, max, value, minExclusive, maxExclusive); + }, + test: function test(value) { + return testRange(min, max, value, minExclusive, maxExclusive); + }, + toString: boundNameFn, + name: boundNameFn + }; +} + +},{}],644:[function(require,module,exports){ +'use strict'; + +var abs = Math.abs; +var round = Math.round; + +function almostEq(a, b) { + return abs(a - b) <= 9.5367432e-7; +} //最大公约数 Greatest Common Divisor + + +function GCD(a, b) { + if (almostEq(b, 0)) return a; + return GCD(b, a % b); +} + +function findPrecision(n) { + var e = 1; + + while (!almostEq(round(n * e) / e, n)) { + e *= 10; + } + + return e; +} + +function num2fraction(num) { + if (num === 0 || num === '0') return '0'; + + if (typeof num === 'string') { + num = parseFloat(num); + } + + var precision = findPrecision(num); //精确度 + + var number = num * precision; + var gcd = abs(GCD(number, precision)); //分子 + + var numerator = number / gcd; //分母 + + var denominator = precision / gcd; //分数 + + return round(numerator) + '/' + round(denominator); +} + +module.exports = num2fraction; + +},{}],645:[function(require,module,exports){ +(function (process){ +"use strict"; + +// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1, +// backported and transplited with Babel, with backwards-compat fixes +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } // if the path is allowed to go above the root, restore leading ..s + + + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} // path.resolve([from ...], to) +// posix version + + +exports.resolve = function () { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = i >= 0 ? arguments[i] : process.cwd(); // Skip empty and invalid entries + + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + // Normalize the path + + + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function (p) { + return !!p; + }), !resolvedAbsolute).join('/'); + return (resolvedAbsolute ? '/' : '') + resolvedPath || '.'; +}; // path.normalize(path) +// posix version + + +exports.normalize = function (path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; // Normalize the path + + path = normalizeArray(filter(path.split('/'), function (p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; // posix version + + +exports.isAbsolute = function (path) { + return path.charAt(0) === '/'; +}; // posix version + + +exports.join = function () { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function (p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + + return p; + }).join('/')); +}; // path.relative(from, to) +// posix version + + +exports.relative = function (from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function (path) { + if (typeof path !== 'string') path = path + ''; + if (path.length === 0) return '.'; + var code = path.charCodeAt(0); + var hasRoot = code === 47 + /*/*/ + ; + var end = -1; + var matchedSlash = true; + + for (var i = path.length - 1; i >= 1; --i) { + code = path.charCodeAt(i); + + if (code === 47 + /*/*/ + ) { + if (!matchedSlash) { + end = i; + break; + } + } else { + // We saw the first non-path separator + matchedSlash = false; + } + } + + if (end === -1) return hasRoot ? '/' : '.'; + + if (hasRoot && end === 1) { + // return '//'; + // Backwards-compat fix: + return '/'; + } + + return path.slice(0, end); +}; + +function basename(path) { + if (typeof path !== 'string') path = path + ''; + var start = 0; + var end = -1; + var matchedSlash = true; + var i; + + for (i = path.length - 1; i >= 0; --i) { + if (path.charCodeAt(i) === 47 + /*/*/ + ) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // path component + matchedSlash = false; + end = i + 1; + } + } + + if (end === -1) return ''; + return path.slice(start, end); +} // Uses a mixed approach for backwards-compatibility, as ext behavior changed +// in new Node.js versions, so only basename() above is backported here + + +exports.basename = function (path, ext) { + var f = basename(path); + + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + + return f; +}; + +exports.extname = function (path) { + if (typeof path !== 'string') path = path + ''; + var startDot = -1; + var startPart = 0; + var end = -1; + var matchedSlash = true; // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + + var preDotState = 0; + + for (var i = path.length - 1; i >= 0; --i) { + var code = path.charCodeAt(i); + + if (code === 47 + /*/*/ + ) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + + continue; + } + + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + + if (code === 46 + /*.*/ + ) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1; + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if (startDot === -1 || end === -1 || // We saw a non-dot character immediately before the dot + preDotState === 0 || // The (right-most) trimmed path component is exactly '..' + preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + return ''; + } + + return path.slice(startDot, end); +}; + +function filter(xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + + return res; +} // String.prototype.substr - negative index don't work in IE8 + + +var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { + return str.substr(start, len); +} : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); +}; + +}).call(this,require('_process')) +},{"_process":675}],646:[function(require,module,exports){ +"use strict"; + +var parse = require("./parse"); + +var walk = require("./walk"); + +var stringify = require("./stringify"); + +function ValueParser(value) { + if (this instanceof ValueParser) { + this.nodes = parse(value); + return this; + } + + return new ValueParser(value); +} + +ValueParser.prototype.toString = function () { + return Array.isArray(this.nodes) ? stringify(this.nodes) : ""; +}; + +ValueParser.prototype.walk = function (cb, bubble) { + walk(this.nodes, cb, bubble); + return this; +}; + +ValueParser.unit = require("./unit"); +ValueParser.walk = walk; +ValueParser.stringify = stringify; +module.exports = ValueParser; + +},{"./parse":647,"./stringify":648,"./unit":649,"./walk":650}],647:[function(require,module,exports){ +"use strict"; + +var openParentheses = "(".charCodeAt(0); +var closeParentheses = ")".charCodeAt(0); +var singleQuote = "'".charCodeAt(0); +var doubleQuote = '"'.charCodeAt(0); +var backslash = "\\".charCodeAt(0); +var slash = "/".charCodeAt(0); +var comma = ",".charCodeAt(0); +var colon = ":".charCodeAt(0); +var star = "*".charCodeAt(0); +var uLower = "u".charCodeAt(0); +var uUpper = "U".charCodeAt(0); +var plus = "+".charCodeAt(0); +var isUnicodeRange = /^[a-f0-9?-]+$/i; + +module.exports = function (input) { + var tokens = []; + var value = input; + var next, quote, prev, token, escape, escapePos, whitespacePos, parenthesesOpenPos; + var pos = 0; + var code = value.charCodeAt(pos); + var max = value.length; + var stack = [{ + nodes: tokens + }]; + var balanced = 0; + var parent; + var name = ""; + var before = ""; + var after = ""; + + while (pos < max) { + // Whitespaces + if (code <= 32) { + next = pos; + + do { + next += 1; + code = value.charCodeAt(next); + } while (code <= 32); + + token = value.slice(pos, next); + prev = tokens[tokens.length - 1]; + + if (code === closeParentheses && balanced) { + after = token; + } else if (prev && prev.type === "div") { + prev.after = token; + } else if (code === comma || code === colon || code === slash && value.charCodeAt(next + 1) !== star && (!parent || parent && parent.type === "function" && parent.value !== "calc")) { + before = token; + } else { + tokens.push({ + type: "space", + sourceIndex: pos, + value: token + }); + } + + pos = next; // Quotes + } else if (code === singleQuote || code === doubleQuote) { + next = pos; + quote = code === singleQuote ? "'" : '"'; + token = { + type: "string", + sourceIndex: pos, + quote: quote + }; + + do { + escape = false; + next = value.indexOf(quote, next + 1); + + if (~next) { + escapePos = next; + + while (value.charCodeAt(escapePos - 1) === backslash) { + escapePos -= 1; + escape = !escape; + } + } else { + value += quote; + next = value.length - 1; + token.unclosed = true; + } + } while (escape); + + token.value = value.slice(pos + 1, next); + tokens.push(token); + pos = next + 1; + code = value.charCodeAt(pos); // Comments + } else if (code === slash && value.charCodeAt(pos + 1) === star) { + token = { + type: "comment", + sourceIndex: pos + }; + next = value.indexOf("*/", pos); + + if (next === -1) { + token.unclosed = true; + next = value.length; + } + + token.value = value.slice(pos + 2, next); + tokens.push(token); + pos = next + 2; + code = value.charCodeAt(pos); // Operation within calc + } else if ((code === slash || code === star) && parent && parent.type === "function" && parent.value === "calc") { + token = value[pos]; + tokens.push({ + type: "word", + sourceIndex: pos - before.length, + value: token + }); + pos += 1; + code = value.charCodeAt(pos); // Dividers + } else if (code === slash || code === comma || code === colon) { + token = value[pos]; + tokens.push({ + type: "div", + sourceIndex: pos - before.length, + value: token, + before: before, + after: "" + }); + before = ""; + pos += 1; + code = value.charCodeAt(pos); // Open parentheses + } else if (openParentheses === code) { + // Whitespaces after open parentheses + next = pos; + + do { + next += 1; + code = value.charCodeAt(next); + } while (code <= 32); + + parenthesesOpenPos = pos; + token = { + type: "function", + sourceIndex: pos - name.length, + value: name, + before: value.slice(parenthesesOpenPos + 1, next) + }; + pos = next; + + if (name === "url" && code !== singleQuote && code !== doubleQuote) { + next -= 1; + + do { + escape = false; + next = value.indexOf(")", next + 1); + + if (~next) { + escapePos = next; + + while (value.charCodeAt(escapePos - 1) === backslash) { + escapePos -= 1; + escape = !escape; + } + } else { + value += ")"; + next = value.length - 1; + token.unclosed = true; + } + } while (escape); // Whitespaces before closed + + + whitespacePos = next; + + do { + whitespacePos -= 1; + code = value.charCodeAt(whitespacePos); + } while (code <= 32); + + if (parenthesesOpenPos < whitespacePos) { + if (pos !== whitespacePos + 1) { + token.nodes = [{ + type: "word", + sourceIndex: pos, + value: value.slice(pos, whitespacePos + 1) + }]; + } else { + token.nodes = []; + } + + if (token.unclosed && whitespacePos + 1 !== next) { + token.after = ""; + token.nodes.push({ + type: "space", + sourceIndex: whitespacePos + 1, + value: value.slice(whitespacePos + 1, next) + }); + } else { + token.after = value.slice(whitespacePos + 1, next); + } + } else { + token.after = ""; + token.nodes = []; + } + + pos = next + 1; + code = value.charCodeAt(pos); + tokens.push(token); + } else { + balanced += 1; + token.after = ""; + tokens.push(token); + stack.push(token); + tokens = token.nodes = []; + parent = token; + } + + name = ""; // Close parentheses + } else if (closeParentheses === code && balanced) { + pos += 1; + code = value.charCodeAt(pos); + parent.after = after; + after = ""; + balanced -= 1; + stack.pop(); + parent = stack[balanced]; + tokens = parent.nodes; // Words + } else { + next = pos; + + do { + if (code === backslash) { + next += 1; + } + + next += 1; + code = value.charCodeAt(next); + } while (next < max && !(code <= 32 || code === singleQuote || code === doubleQuote || code === comma || code === colon || code === slash || code === openParentheses || code === star && parent && parent.type === "function" && parent.value === "calc" || code === slash && parent.type === "function" && parent.value === "calc" || code === closeParentheses && balanced)); + + token = value.slice(pos, next); + + if (openParentheses === code) { + name = token; + } else if ((uLower === token.charCodeAt(0) || uUpper === token.charCodeAt(0)) && plus === token.charCodeAt(1) && isUnicodeRange.test(token.slice(2))) { + tokens.push({ + type: "unicode-range", + sourceIndex: pos, + value: token + }); + } else { + tokens.push({ + type: "word", + sourceIndex: pos, + value: token + }); + } + + pos = next; + } + } + + for (pos = stack.length - 1; pos; pos -= 1) { + stack[pos].unclosed = true; + } + + return stack[0].nodes; +}; + +},{}],648:[function(require,module,exports){ +"use strict"; + +function stringifyNode(node, custom) { + var type = node.type; + var value = node.value; + var buf; + var customResult; + + if (custom && (customResult = custom(node)) !== undefined) { + return customResult; + } else if (type === "word" || type === "space") { + return value; + } else if (type === "string") { + buf = node.quote || ""; + return buf + value + (node.unclosed ? "" : buf); + } else if (type === "comment") { + return "/*" + value + (node.unclosed ? "" : "*/"); + } else if (type === "div") { + return (node.before || "") + value + (node.after || ""); + } else if (Array.isArray(node.nodes)) { + buf = stringify(node.nodes, custom); + + if (type !== "function") { + return buf; + } + + return value + "(" + (node.before || "") + buf + (node.after || "") + (node.unclosed ? "" : ")"); + } + + return value; +} + +function stringify(nodes, custom) { + var result, i; + + if (Array.isArray(nodes)) { + result = ""; + + for (i = nodes.length - 1; ~i; i -= 1) { + result = stringifyNode(nodes[i], custom) + result; + } + + return result; + } + + return stringifyNode(nodes, custom); +} + +module.exports = stringify; + +},{}],649:[function(require,module,exports){ +"use strict"; + +var minus = "-".charCodeAt(0); +var plus = "+".charCodeAt(0); +var dot = ".".charCodeAt(0); +var exp = "e".charCodeAt(0); +var EXP = "E".charCodeAt(0); // Check if three code points would start a number +// https://www.w3.org/TR/css-syntax-3/#starts-with-a-number + +function likeNumber(value) { + var code = value.charCodeAt(0); + var nextCode; + + if (code === plus || code === minus) { + nextCode = value.charCodeAt(1); + + if (nextCode >= 48 && nextCode <= 57) { + return true; + } + + var nextNextCode = value.charCodeAt(2); + + if (nextCode === dot && nextNextCode >= 48 && nextNextCode <= 57) { + return true; + } + + return false; + } + + if (code === dot) { + nextCode = value.charCodeAt(1); + + if (nextCode >= 48 && nextCode <= 57) { + return true; + } + + return false; + } + + if (code >= 48 && code <= 57) { + return true; + } + + return false; +} // Consume a number +// https://www.w3.org/TR/css-syntax-3/#consume-number + + +module.exports = function (value) { + var pos = 0; + var length = value.length; + var code; + var nextCode; + var nextNextCode; + + if (length === 0 || !likeNumber(value)) { + return false; + } + + code = value.charCodeAt(pos); + + if (code === plus || code === minus) { + pos++; + } + + while (pos < length) { + code = value.charCodeAt(pos); + + if (code < 48 || code > 57) { + break; + } + + pos += 1; + } + + code = value.charCodeAt(pos); + nextCode = value.charCodeAt(pos + 1); + + if (code === dot && nextCode >= 48 && nextCode <= 57) { + pos += 2; + + while (pos < length) { + code = value.charCodeAt(pos); + + if (code < 48 || code > 57) { + break; + } + + pos += 1; + } + } + + code = value.charCodeAt(pos); + nextCode = value.charCodeAt(pos + 1); + nextNextCode = value.charCodeAt(pos + 2); + + if ((code === exp || code === EXP) && (nextCode >= 48 && nextCode <= 57 || (nextCode === plus || nextCode === minus) && nextNextCode >= 48 && nextNextCode <= 57)) { + pos += nextCode === plus || nextCode === minus ? 3 : 2; + + while (pos < length) { + code = value.charCodeAt(pos); + + if (code < 48 || code > 57) { + break; + } + + pos += 1; + } + } + + return { + number: value.slice(0, pos), + unit: value.slice(pos) + }; +}; + +},{}],650:[function(require,module,exports){ +"use strict"; + +module.exports = function walk(nodes, cb, bubble) { + var i, max, node, result; + + for (i = 0, max = nodes.length; i < max; i += 1) { + node = nodes[i]; + + if (!bubble) { + result = cb(node, i, nodes); + } + + if (result !== false && node.type === "function" && Array.isArray(node.nodes)) { + walk(node.nodes, cb, bubble); + } + + if (bubble) { + cb(node, i, nodes); + } + } +}; + +},{}],651:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _container = _interopRequireDefault(require("./container")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} +/** + * Represents an at-rule. + * + * If it’s followed in the CSS by a {} block, this node will have + * a nodes property representing its children. + * + * @extends Container + * + * @example + * const root = postcss.parse('@charset "UTF-8"; @media print {}') + * + * const charset = root.first + * charset.type //=> 'atrule' + * charset.nodes //=> undefined + * + * const media = root.last + * media.nodes //=> [] + */ + + +var AtRule = /*#__PURE__*/function (_Container) { + _inheritsLoose(AtRule, _Container); + + function AtRule(defaults) { + var _this; + + _this = _Container.call(this, defaults) || this; + _this.type = 'atrule'; + return _this; + } + + var _proto = AtRule.prototype; + + _proto.append = function append() { + var _Container$prototype$; + + if (!this.nodes) this.nodes = []; + + for (var _len = arguments.length, children = new Array(_len), _key = 0; _key < _len; _key++) { + children[_key] = arguments[_key]; + } + + return (_Container$prototype$ = _Container.prototype.append).call.apply(_Container$prototype$, [this].concat(children)); + }; + + _proto.prepend = function prepend() { + var _Container$prototype$2; + + if (!this.nodes) this.nodes = []; + + for (var _len2 = arguments.length, children = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + children[_key2] = arguments[_key2]; + } + + return (_Container$prototype$2 = _Container.prototype.prepend).call.apply(_Container$prototype$2, [this].concat(children)); + } + /** + * @memberof AtRule# + * @member {string} name The at-rule’s name immediately follows the `@`. + * + * @example + * const root = postcss.parse('@media print {}') + * media.name //=> 'media' + * const media = root.first + */ + + /** + * @memberof AtRule# + * @member {string} params The at-rule’s parameters, the values + * that follow the at-rule’s name but precede + * any {} block. + * + * @example + * const root = postcss.parse('@media print, screen {}') + * const media = root.first + * media.params //=> 'print, screen' + */ + + /** + * @memberof AtRule# + * @member {object} raws Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `after`: the space symbols after the last child of the node + * to the end of the node. + * * `between`: the symbols between the property and value + * for declarations, selector and `{` for rules, or last parameter + * and `{` for at-rules. + * * `semicolon`: contains true if the last child has + * an (optional) semicolon. + * * `afterName`: the space between the at-rule name and its parameters. + * + * PostCSS cleans at-rule parameters from comments and extra spaces, + * but it stores origin content in raws properties. + * As such, if you don’t change a declaration’s value, + * PostCSS will use the raw value with comments. + * + * @example + * const root = postcss.parse(' @media\nprint {\n}') + * root.first.first.raws //=> { before: ' ', + * // between: ' ', + * // afterName: '\n', + * // after: '\n' } + */ + ; + + return AtRule; +}(_container.default); + +var _default = AtRule; +exports.default = _default; +module.exports = exports.default; + +},{"./container":653}],652:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _node = _interopRequireDefault(require("./node")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} +/** + * Represents a comment between declarations or statements (rule and at-rules). + * + * Comments inside selectors, at-rule parameters, or declaration values + * will be stored in the `raws` properties explained above. + * + * @extends Node + */ + + +var Comment = /*#__PURE__*/function (_Node) { + _inheritsLoose(Comment, _Node); + + function Comment(defaults) { + var _this; + + _this = _Node.call(this, defaults) || this; + _this.type = 'comment'; + return _this; + } + /** + * @memberof Comment# + * @member {string} text The comment’s text. + */ + + /** + * @memberof Comment# + * @member {object} raws Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. + * * `left`: the space symbols between `/*` and the comment’s text. + * * `right`: the space symbols between the comment’s text. + */ + + + return Comment; +}(_node.default); + +var _default = Comment; +exports.default = _default; +module.exports = exports.default; + +},{"./node":660}],653:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _declaration = _interopRequireDefault(require("./declaration")); + +var _comment = _interopRequireDefault(require("./comment")); + +var _node = _interopRequireDefault(require("./node")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +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); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} + +function cleanSource(nodes) { + return nodes.map(function (i) { + if (i.nodes) i.nodes = cleanSource(i.nodes); + delete i.source; + return i; + }); +} +/** + * The {@link Root}, {@link AtRule}, and {@link Rule} container nodes + * inherit some common methods to help work with their children. + * + * Note that all containers can store any content. If you write a rule inside + * a rule, PostCSS will parse it. + * + * @extends Node + * @abstract + */ + + +var Container = /*#__PURE__*/function (_Node) { + _inheritsLoose(Container, _Node); + + function Container() { + return _Node.apply(this, arguments) || this; + } + + var _proto = Container.prototype; + + _proto.push = function push(child) { + child.parent = this; + this.nodes.push(child); + return this; + } + /** + * Iterates through the container’s immediate children, + * calling `callback` for each child. + * + * Returning `false` in the callback will break iteration. + * + * This method only iterates through the container’s immediate children. + * If you need to recursively iterate through all the container’s descendant + * nodes, use {@link Container#walk}. + * + * Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe + * if you are mutating the array of child nodes during iteration. + * PostCSS will adjust the current index to match the mutations. + * + * @param {childIterator} callback Iterator receives each node and index. + * + * @return {false|undefined} Returns `false` if iteration was broke. + * + * @example + * const root = postcss.parse('a { color: black; z-index: 1 }') + * const rule = root.first + * + * for (const decl of rule.nodes) { + * decl.cloneBefore({ prop: '-webkit-' + decl.prop }) + * // Cycle will be infinite, because cloneBefore moves the current node + * // to the next index + * } + * + * rule.each(decl => { + * decl.cloneBefore({ prop: '-webkit-' + decl.prop }) + * // Will be executed only for color and z-index + * }) + */ + ; + + _proto.each = function each(callback) { + if (!this.lastEach) this.lastEach = 0; + if (!this.indexes) this.indexes = {}; + this.lastEach += 1; + var id = this.lastEach; + this.indexes[id] = 0; + if (!this.nodes) return undefined; + var index, result; + + while (this.indexes[id] < this.nodes.length) { + index = this.indexes[id]; + result = callback(this.nodes[index], index); + if (result === false) break; + this.indexes[id] += 1; + } + + delete this.indexes[id]; + return result; + } + /** + * Traverses the container’s descendant nodes, calling callback + * for each node. + * + * Like container.each(), this method is safe to use + * if you are mutating arrays during iteration. + * + * If you only need to iterate through the container’s immediate children, + * use {@link Container#each}. + * + * @param {childIterator} callback Iterator receives each node and index. + * + * @return {false|undefined} Returns `false` if iteration was broke. + * + * @example + * root.walk(node => { + * // Traverses all descendant nodes. + * }) + */ + ; + + _proto.walk = function walk(callback) { + return this.each(function (child, i) { + var result; + + try { + result = callback(child, i); + } catch (e) { + e.postcssNode = child; + + if (e.stack && child.source && /\n\s{4}at /.test(e.stack)) { + var s = child.source; + e.stack = e.stack.replace(/\n\s{4}at /, "$&" + s.input.from + ":" + s.start.line + ":" + s.start.column + "$&"); + } + + throw e; + } + + if (result !== false && child.walk) { + result = child.walk(callback); + } + + return result; + }); + } + /** + * Traverses the container’s descendant nodes, calling callback + * for each declaration node. + * + * If you pass a filter, iteration will only happen over declarations + * with matching properties. + * + * Like {@link Container#each}, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param {string|RegExp} [prop] String or regular expression + * to filter declarations by property name. + * @param {childIterator} callback Iterator receives each node and index. + * + * @return {false|undefined} Returns `false` if iteration was broke. + * + * @example + * root.walkDecls(decl => { + * checkPropertySupport(decl.prop) + * }) + * + * root.walkDecls('border-radius', decl => { + * decl.remove() + * }) + * + * root.walkDecls(/^background/, decl => { + * decl.value = takeFirstColorFromGradient(decl.value) + * }) + */ + ; + + _proto.walkDecls = function walkDecls(prop, callback) { + if (!callback) { + callback = prop; + return this.walk(function (child, i) { + if (child.type === 'decl') { + return callback(child, i); + } + }); + } + + if (prop instanceof RegExp) { + return this.walk(function (child, i) { + if (child.type === 'decl' && prop.test(child.prop)) { + return callback(child, i); + } + }); + } + + return this.walk(function (child, i) { + if (child.type === 'decl' && child.prop === prop) { + return callback(child, i); + } + }); + } + /** + * Traverses the container’s descendant nodes, calling callback + * for each rule node. + * + * If you pass a filter, iteration will only happen over rules + * with matching selectors. + * + * Like {@link Container#each}, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param {string|RegExp} [selector] String or regular expression + * to filter rules by selector. + * @param {childIterator} callback Iterator receives each node and index. + * + * @return {false|undefined} returns `false` if iteration was broke. + * + * @example + * const selectors = [] + * root.walkRules(rule => { + * selectors.push(rule.selector) + * }) + * console.log(`Your CSS uses ${ selectors.length } selectors`) + */ + ; + + _proto.walkRules = function walkRules(selector, callback) { + if (!callback) { + callback = selector; + return this.walk(function (child, i) { + if (child.type === 'rule') { + return callback(child, i); + } + }); + } + + if (selector instanceof RegExp) { + return this.walk(function (child, i) { + if (child.type === 'rule' && selector.test(child.selector)) { + return callback(child, i); + } + }); + } + + return this.walk(function (child, i) { + if (child.type === 'rule' && child.selector === selector) { + return callback(child, i); + } + }); + } + /** + * Traverses the container’s descendant nodes, calling callback + * for each at-rule node. + * + * If you pass a filter, iteration will only happen over at-rules + * that have matching names. + * + * Like {@link Container#each}, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param {string|RegExp} [name] String or regular expression + * to filter at-rules by name. + * @param {childIterator} callback Iterator receives each node and index. + * + * @return {false|undefined} Returns `false` if iteration was broke. + * + * @example + * root.walkAtRules(rule => { + * if (isOld(rule.name)) rule.remove() + * }) + * + * let first = false + * root.walkAtRules('charset', rule => { + * if (!first) { + * first = true + * } else { + * rule.remove() + * } + * }) + */ + ; + + _proto.walkAtRules = function walkAtRules(name, callback) { + if (!callback) { + callback = name; + return this.walk(function (child, i) { + if (child.type === 'atrule') { + return callback(child, i); + } + }); + } + + if (name instanceof RegExp) { + return this.walk(function (child, i) { + if (child.type === 'atrule' && name.test(child.name)) { + return callback(child, i); + } + }); + } + + return this.walk(function (child, i) { + if (child.type === 'atrule' && child.name === name) { + return callback(child, i); + } + }); + } + /** + * Traverses the container’s descendant nodes, calling callback + * for each comment node. + * + * Like {@link Container#each}, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param {childIterator} callback Iterator receives each node and index. + * + * @return {false|undefined} Returns `false` if iteration was broke. + * + * @example + * root.walkComments(comment => { + * comment.remove() + * }) + */ + ; + + _proto.walkComments = function walkComments(callback) { + return this.walk(function (child, i) { + if (child.type === 'comment') { + return callback(child, i); + } + }); + } + /** + * Inserts new nodes to the end of the container. + * + * @param {...(Node|object|string|Node[])} children New nodes. + * + * @return {Node} This node for methods chain. + * + * @example + * const decl1 = postcss.decl({ prop: 'color', value: 'black' }) + * const decl2 = postcss.decl({ prop: 'background-color', value: 'white' }) + * rule.append(decl1, decl2) + * + * root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule + * root.append({ selector: 'a' }) // rule + * rule.append({ prop: 'color', value: 'black' }) // declaration + * rule.append({ text: 'Comment' }) // comment + * + * root.append('a {}') + * root.first.append('color: black; z-index: 1') + */ + ; + + _proto.append = function append() { + for (var _len = arguments.length, children = new Array(_len), _key = 0; _key < _len; _key++) { + children[_key] = arguments[_key]; + } + + for (var _i = 0, _children = children; _i < _children.length; _i++) { + var child = _children[_i]; + var nodes = this.normalize(child, this.last); + + for (var _iterator = nodes, _isArray = Array.isArray(_iterator), _i2 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i2 >= _iterator.length) break; + _ref = _iterator[_i2++]; + } else { + _i2 = _iterator.next(); + if (_i2.done) break; + _ref = _i2.value; + } + + var node = _ref; + this.nodes.push(node); + } + } + + return this; + } + /** + * Inserts new nodes to the start of the container. + * + * @param {...(Node|object|string|Node[])} children New nodes. + * + * @return {Node} This node for methods chain. + * + * @example + * const decl1 = postcss.decl({ prop: 'color', value: 'black' }) + * const decl2 = postcss.decl({ prop: 'background-color', value: 'white' }) + * rule.prepend(decl1, decl2) + * + * root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule + * root.append({ selector: 'a' }) // rule + * rule.append({ prop: 'color', value: 'black' }) // declaration + * rule.append({ text: 'Comment' }) // comment + * + * root.append('a {}') + * root.first.append('color: black; z-index: 1') + */ + ; + + _proto.prepend = function prepend() { + for (var _len2 = arguments.length, children = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + children[_key2] = arguments[_key2]; + } + + children = children.reverse(); + + for (var _iterator2 = children, _isArray2 = Array.isArray(_iterator2), _i3 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i3 >= _iterator2.length) break; + _ref2 = _iterator2[_i3++]; + } else { + _i3 = _iterator2.next(); + if (_i3.done) break; + _ref2 = _i3.value; + } + + var child = _ref2; + var nodes = this.normalize(child, this.first, 'prepend').reverse(); + + for (var _iterator3 = nodes, _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i4 >= _iterator3.length) break; + _ref3 = _iterator3[_i4++]; + } else { + _i4 = _iterator3.next(); + if (_i4.done) break; + _ref3 = _i4.value; + } + + var node = _ref3; + this.nodes.unshift(node); + } + + for (var id in this.indexes) { + this.indexes[id] = this.indexes[id] + nodes.length; + } + } + + return this; + }; + + _proto.cleanRaws = function cleanRaws(keepBetween) { + _Node.prototype.cleanRaws.call(this, keepBetween); + + if (this.nodes) { + for (var _iterator4 = this.nodes, _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; + + if (_isArray4) { + if (_i5 >= _iterator4.length) break; + _ref4 = _iterator4[_i5++]; + } else { + _i5 = _iterator4.next(); + if (_i5.done) break; + _ref4 = _i5.value; + } + + var node = _ref4; + node.cleanRaws(keepBetween); + } + } + } + /** + * Insert new node before old node within the container. + * + * @param {Node|number} exist Child or child’s index. + * @param {Node|object|string|Node[]} add New node. + * + * @return {Node} This node for methods chain. + * + * @example + * rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop })) + */ + ; + + _proto.insertBefore = function insertBefore(exist, add) { + exist = this.index(exist); + var type = exist === 0 ? 'prepend' : false; + var nodes = this.normalize(add, this.nodes[exist], type).reverse(); + + for (var _iterator5 = nodes, _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; + + if (_isArray5) { + if (_i6 >= _iterator5.length) break; + _ref5 = _iterator5[_i6++]; + } else { + _i6 = _iterator5.next(); + if (_i6.done) break; + _ref5 = _i6.value; + } + + var node = _ref5; + this.nodes.splice(exist, 0, node); + } + + var index; + + for (var id in this.indexes) { + index = this.indexes[id]; + + if (exist <= index) { + this.indexes[id] = index + nodes.length; + } + } + + return this; + } + /** + * Insert new node after old node within the container. + * + * @param {Node|number} exist Child or child’s index. + * @param {Node|object|string|Node[]} add New node. + * + * @return {Node} This node for methods chain. + */ + ; + + _proto.insertAfter = function insertAfter(exist, add) { + exist = this.index(exist); + var nodes = this.normalize(add, this.nodes[exist]).reverse(); + + for (var _iterator6 = nodes, _isArray6 = Array.isArray(_iterator6), _i7 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; + + if (_isArray6) { + if (_i7 >= _iterator6.length) break; + _ref6 = _iterator6[_i7++]; + } else { + _i7 = _iterator6.next(); + if (_i7.done) break; + _ref6 = _i7.value; + } + + var node = _ref6; + this.nodes.splice(exist + 1, 0, node); + } + + var index; + + for (var id in this.indexes) { + index = this.indexes[id]; + + if (exist < index) { + this.indexes[id] = index + nodes.length; + } + } + + return this; + } + /** + * Removes node from the container and cleans the parent properties + * from the node and its children. + * + * @param {Node|number} child Child or child’s index. + * + * @return {Node} This node for methods chain + * + * @example + * rule.nodes.length //=> 5 + * rule.removeChild(decl) + * rule.nodes.length //=> 4 + * decl.parent //=> undefined + */ + ; + + _proto.removeChild = function removeChild(child) { + child = this.index(child); + this.nodes[child].parent = undefined; + this.nodes.splice(child, 1); + var index; + + for (var id in this.indexes) { + index = this.indexes[id]; + + if (index >= child) { + this.indexes[id] = index - 1; + } + } + + return this; + } + /** + * Removes all children from the container + * and cleans their parent properties. + * + * @return {Node} This node for methods chain. + * + * @example + * rule.removeAll() + * rule.nodes.length //=> 0 + */ + ; + + _proto.removeAll = function removeAll() { + for (var _iterator7 = this.nodes, _isArray7 = Array.isArray(_iterator7), _i8 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref7; + + if (_isArray7) { + if (_i8 >= _iterator7.length) break; + _ref7 = _iterator7[_i8++]; + } else { + _i8 = _iterator7.next(); + if (_i8.done) break; + _ref7 = _i8.value; + } + + var node = _ref7; + node.parent = undefined; + } + + this.nodes = []; + return this; + } + /** + * Passes all declaration values within the container that match pattern + * through callback, replacing those values with the returned result + * of callback. + * + * This method is useful if you are using a custom unit or function + * and need to iterate through all values. + * + * @param {string|RegExp} pattern Replace pattern. + * @param {object} opts Options to speed up the search. + * @param {string|string[]} opts.props An array of property names. + * @param {string} opts.fast String that’s used to narrow down + * values and speed up the regexp search. + * @param {function|string} callback String to replace pattern or callback + * that returns a new value. The callback + * will receive the same arguments + * as those passed to a function parameter + * of `String#replace`. + * + * @return {Node} This node for methods chain. + * + * @example + * root.replaceValues(/\d+rem/, { fast: 'rem' }, string => { + * return 15 * parseInt(string) + 'px' + * }) + */ + ; + + _proto.replaceValues = function replaceValues(pattern, opts, callback) { + if (!callback) { + callback = opts; + opts = {}; + } + + this.walkDecls(function (decl) { + if (opts.props && opts.props.indexOf(decl.prop) === -1) return; + if (opts.fast && decl.value.indexOf(opts.fast) === -1) return; + decl.value = decl.value.replace(pattern, callback); + }); + return this; + } + /** + * Returns `true` if callback returns `true` + * for all of the container’s children. + * + * @param {childCondition} condition Iterator returns true or false. + * + * @return {boolean} Is every child pass condition. + * + * @example + * const noPrefixes = rule.every(i => i.prop[0] !== '-') + */ + ; + + _proto.every = function every(condition) { + return this.nodes.every(condition); + } + /** + * Returns `true` if callback returns `true` for (at least) one + * of the container’s children. + * + * @param {childCondition} condition Iterator returns true or false. + * + * @return {boolean} Is some child pass condition. + * + * @example + * const hasPrefix = rule.some(i => i.prop[0] === '-') + */ + ; + + _proto.some = function some(condition) { + return this.nodes.some(condition); + } + /** + * Returns a `child`’s index within the {@link Container#nodes} array. + * + * @param {Node} child Child of the current container. + * + * @return {number} Child index. + * + * @example + * rule.index( rule.nodes[2] ) //=> 2 + */ + ; + + _proto.index = function index(child) { + if (typeof child === 'number') { + return child; + } + + return this.nodes.indexOf(child); + } + /** + * The container’s first child. + * + * @type {Node} + * + * @example + * rule.first === rules.nodes[0] + */ + ; + + _proto.normalize = function normalize(nodes, sample) { + var _this = this; + + if (typeof nodes === 'string') { + var parse = require('./parse'); + + nodes = cleanSource(parse(nodes).nodes); + } else if (Array.isArray(nodes)) { + nodes = nodes.slice(0); + + for (var _iterator8 = nodes, _isArray8 = Array.isArray(_iterator8), _i9 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + var _ref8; + + if (_isArray8) { + if (_i9 >= _iterator8.length) break; + _ref8 = _iterator8[_i9++]; + } else { + _i9 = _iterator8.next(); + if (_i9.done) break; + _ref8 = _i9.value; + } + + var i = _ref8; + if (i.parent) i.parent.removeChild(i, 'ignore'); + } + } else if (nodes.type === 'root') { + nodes = nodes.nodes.slice(0); + + for (var _iterator9 = nodes, _isArray9 = Array.isArray(_iterator9), _i10 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { + var _ref9; + + if (_isArray9) { + if (_i10 >= _iterator9.length) break; + _ref9 = _iterator9[_i10++]; + } else { + _i10 = _iterator9.next(); + if (_i10.done) break; + _ref9 = _i10.value; + } + + var _i11 = _ref9; + if (_i11.parent) _i11.parent.removeChild(_i11, 'ignore'); + } + } else if (nodes.type) { + nodes = [nodes]; + } else if (nodes.prop) { + if (typeof nodes.value === 'undefined') { + throw new Error('Value field is missed in node creation'); + } else if (typeof nodes.value !== 'string') { + nodes.value = String(nodes.value); + } + + nodes = [new _declaration.default(nodes)]; + } else if (nodes.selector) { + var Rule = require('./rule'); + + nodes = [new Rule(nodes)]; + } else if (nodes.name) { + var AtRule = require('./at-rule'); + + nodes = [new AtRule(nodes)]; + } else if (nodes.text) { + nodes = [new _comment.default(nodes)]; + } else { + throw new Error('Unknown node type in node creation'); + } + + var processed = nodes.map(function (i) { + if (i.parent) i.parent.removeChild(i); + + if (typeof i.raws.before === 'undefined') { + if (sample && typeof sample.raws.before !== 'undefined') { + i.raws.before = sample.raws.before.replace(/[^\s]/g, ''); + } + } + + i.parent = _this; + return i; + }); + return processed; + } + /** + * @memberof Container# + * @member {Node[]} nodes An array containing the container’s children. + * + * @example + * const root = postcss.parse('a { color: black }') + * root.nodes.length //=> 1 + * root.nodes[0].selector //=> 'a' + * root.nodes[0].nodes[0].prop //=> 'color' + */ + ; + + _createClass(Container, [{ + key: "first", + get: function get() { + if (!this.nodes) return undefined; + return this.nodes[0]; + } + /** + * The container’s last child. + * + * @type {Node} + * + * @example + * rule.last === rule.nodes[rule.nodes.length - 1] + */ + + }, { + key: "last", + get: function get() { + if (!this.nodes) return undefined; + return this.nodes[this.nodes.length - 1]; + } + }]); + + return Container; +}(_node.default); + +var _default = Container; +/** + * @callback childCondition + * @param {Node} node Container child. + * @param {number} index Child index. + * @param {Node[]} nodes All container children. + * @return {boolean} + */ + +/** + * @callback childIterator + * @param {Node} node Container child. + * @param {number} index Child index. + * @return {false|undefined} Returning `false` will break iteration. + */ + +exports.default = _default; +module.exports = exports.default; + +},{"./at-rule":651,"./comment":652,"./declaration":655,"./node":660,"./parse":661,"./rule":668}],654:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _supportsColor = _interopRequireDefault(require("supports-color")); + +var _chalk = _interopRequireDefault(require("chalk")); + +var _terminalHighlight = _interopRequireDefault(require("./terminal-highlight")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} + +function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + + _cache.set(Class, Wrapper); + } + + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + + return _wrapNativeSuper(Class); +} + +function isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); + return true; + } catch (e) { + return false; + } +} + +function _construct(Parent, args, Class) { + if (isNativeReflectConstruct()) { + _construct = Reflect.construct; + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + + return _construct.apply(null, arguments); +} + +function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; +} + +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); +} + +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} +/** + * The CSS parser throws this error for broken CSS. + * + * Custom parsers can throw this error for broken custom syntax using + * the {@link Node#error} method. + * + * PostCSS will use the input source map to detect the original error location. + * If you wrote a Sass file, compiled it to CSS and then parsed it with PostCSS, + * PostCSS will show the original position in the Sass file. + * + * If you need the position in the PostCSS input + * (e.g., to debug the previous compiler), use `error.input.file`. + * + * @example + * // Catching and checking syntax error + * try { + * postcss.parse('a{') + * } catch (error) { + * if (error.name === 'CssSyntaxError') { + * error //=> CssSyntaxError + * } + * } + * + * @example + * // Raising error from plugin + * throw node.error('Unknown variable', { plugin: 'postcss-vars' }) + */ + + +var CssSyntaxError = /*#__PURE__*/function (_Error) { + _inheritsLoose(CssSyntaxError, _Error); + /** + * @param {string} message Error message. + * @param {number} [line] Source line of the error. + * @param {number} [column] Source column of the error. + * @param {string} [source] Source code of the broken file. + * @param {string} [file] Absolute path to the broken file. + * @param {string} [plugin] PostCSS plugin name, if error came from plugin. + */ + + + function CssSyntaxError(message, line, column, source, file, plugin) { + var _this; + + _this = _Error.call(this, message) || this; + /** + * Always equal to `'CssSyntaxError'`. You should always check error type + * by `error.name === 'CssSyntaxError'` + * instead of `error instanceof CssSyntaxError`, + * because npm could have several PostCSS versions. + * + * @type {string} + * + * @example + * if (error.name === 'CssSyntaxError') { + * error //=> CssSyntaxError + * } + */ + + _this.name = 'CssSyntaxError'; + /** + * Error message. + * + * @type {string} + * + * @example + * error.message //=> 'Unclosed block' + */ + + _this.reason = message; + + if (file) { + /** + * Absolute path to the broken file. + * + * @type {string} + * + * @example + * error.file //=> 'a.sass' + * error.input.file //=> 'a.css' + */ + _this.file = file; + } + + if (source) { + /** + * Source code of the broken file. + * + * @type {string} + * + * @example + * error.source //=> 'a { b {} }' + * error.input.column //=> 'a b { }' + */ + _this.source = source; + } + + if (plugin) { + /** + * Plugin name, if error came from plugin. + * + * @type {string} + * + * @example + * error.plugin //=> 'postcss-vars' + */ + _this.plugin = plugin; + } + + if (typeof line !== 'undefined' && typeof column !== 'undefined') { + /** + * Source line of the error. + * + * @type {number} + * + * @example + * error.line //=> 2 + * error.input.line //=> 4 + */ + _this.line = line; + /** + * Source column of the error. + * + * @type {number} + * + * @example + * error.column //=> 1 + * error.input.column //=> 4 + */ + + _this.column = column; + } + + _this.setMessage(); + + if (Error.captureStackTrace) { + Error.captureStackTrace(_assertThisInitialized(_this), CssSyntaxError); + } + + return _this; + } + + var _proto = CssSyntaxError.prototype; + + _proto.setMessage = function setMessage() { + /** + * Full error text in the GNU error format + * with plugin, file, line and column. + * + * @type {string} + * + * @example + * error.message //=> 'a.css:1:1: Unclosed block' + */ + this.message = this.plugin ? this.plugin + ': ' : ''; + this.message += this.file ? this.file : ''; + + if (typeof this.line !== 'undefined') { + this.message += ':' + this.line + ':' + this.column; + } + + this.message += ': ' + this.reason; + } + /** + * Returns a few lines of CSS source that caused the error. + * + * If the CSS has an input source map without `sourceContent`, + * this method will return an empty string. + * + * @param {boolean} [color] Whether arrow will be colored red by terminal + * color codes. By default, PostCSS will detect + * color support by `process.stdout.isTTY` + * and `process.env.NODE_DISABLE_COLORS`. + * + * @example + * error.showSourceCode() //=> " 4 | } + * // 5 | a { + * // > 6 | bad + * // | ^ + * // 7 | } + * // 8 | b {" + * + * @return {string} Few lines of CSS source that caused the error. + */ + ; + + _proto.showSourceCode = function showSourceCode(color) { + var _this2 = this; + + if (!this.source) return ''; + var css = this.source; + + if (_terminalHighlight.default) { + if (typeof color === 'undefined') color = _supportsColor.default.stdout; + if (color) css = (0, _terminalHighlight.default)(css); + } + + var lines = css.split(/\r?\n/); + var start = Math.max(this.line - 3, 0); + var end = Math.min(this.line + 2, lines.length); + var maxWidth = String(end).length; + + function mark(text) { + if (color && _chalk.default.red) { + return _chalk.default.red.bold(text); + } + + return text; + } + + function aside(text) { + if (color && _chalk.default.gray) { + return _chalk.default.gray(text); + } + + return text; + } + + return lines.slice(start, end).map(function (line, index) { + var number = start + 1 + index; + var gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | '; + + if (number === _this2.line) { + var spacing = aside(gutter.replace(/\d/g, ' ')) + line.slice(0, _this2.column - 1).replace(/[^\t]/g, ' '); + return mark('>') + aside(gutter) + line + '\n ' + spacing + mark('^'); + } + + return ' ' + aside(gutter) + line; + }).join('\n'); + } + /** + * Returns error position, message and source code of the broken part. + * + * @example + * error.toString() //=> "CssSyntaxError: app.css:1:1: Unclosed block + * // > 1 | a { + * // | ^" + * + * @return {string} Error position, message and source code. + */ + ; + + _proto.toString = function toString() { + var code = this.showSourceCode(); + + if (code) { + code = '\n\n' + code + '\n'; + } + + return this.name + ': ' + this.message + code; + } + /** + * @memberof CssSyntaxError# + * @member {Input} input Input object with PostCSS internal information + * about input file. If input has source map + * from previous tool, PostCSS will use origin + * (for example, Sass) source. You can use this + * object to get PostCSS input source. + * + * @example + * error.input.file //=> 'a.css' + * error.file //=> 'a.sass' + */ + ; + + return CssSyntaxError; +}(_wrapNativeSuper(Error)); + +var _default = CssSyntaxError; +exports.default = _default; +module.exports = exports.default; + +},{"./terminal-highlight":77,"chalk":77,"supports-color":77}],655:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _node = _interopRequireDefault(require("./node")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} +/** + * Represents a CSS declaration. + * + * @extends Node + * + * @example + * const root = postcss.parse('a { color: black }') + * const decl = root.first.first + * decl.type //=> 'decl' + * decl.toString() //=> ' color: black' + */ + + +var Declaration = /*#__PURE__*/function (_Node) { + _inheritsLoose(Declaration, _Node); + + function Declaration(defaults) { + var _this; + + _this = _Node.call(this, defaults) || this; + _this.type = 'decl'; + return _this; + } + /** + * @memberof Declaration# + * @member {string} prop The declaration’s property name. + * + * @example + * const root = postcss.parse('a { color: black }') + * const decl = root.first.first + * decl.prop //=> 'color' + */ + + /** + * @memberof Declaration# + * @member {string} value The declaration’s value. + * + * @example + * const root = postcss.parse('a { color: black }') + * const decl = root.first.first + * decl.value //=> 'black' + */ + + /** + * @memberof Declaration# + * @member {boolean} important `true` if the declaration + * has an !important annotation. + * + * @example + * const root = postcss.parse('a { color: black !important; color: red }') + * root.first.first.important //=> true + * root.first.last.important //=> undefined + */ + + /** + * @memberof Declaration# + * @member {object} raws Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `between`: the symbols between the property and value + * for declarations. + * * `important`: the content of the important statement, + * if it is not just `!important`. + * + * PostCSS cleans declaration from comments and extra spaces, + * but it stores origin content in raws properties. + * As such, if you don’t change a declaration’s value, + * PostCSS will use the raw value with comments. + * + * @example + * const root = postcss.parse('a {\n color:black\n}') + * root.first.first.raws //=> { before: '\n ', between: ':' } + */ + + + return Declaration; +}(_node.default); + +var _default = Declaration; +exports.default = _default; +module.exports = exports.default; + +},{"./node":660}],656:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _path = _interopRequireDefault(require("path")); + +var _cssSyntaxError = _interopRequireDefault(require("./css-syntax-error")); + +var _previousMap = _interopRequireDefault(require("./previous-map")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +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); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +var sequence = 0; +/** + * Represents the source CSS. + * + * @example + * const root = postcss.parse(css, { from: file }) + * const input = root.source.input + */ + +var Input = /*#__PURE__*/function () { + /** + * @param {string} css Input CSS source. + * @param {object} [opts] {@link Processor#process} options. + */ + function Input(css, opts) { + if (opts === void 0) { + opts = {}; + } + + if (css === null || typeof css === 'undefined' || typeof css === 'object' && !css.toString) { + throw new Error("PostCSS received " + css + " instead of CSS string"); + } + /** + * Input CSS source + * + * @type {string} + * + * @example + * const input = postcss.parse('a{}', { from: file }).input + * input.css //=> "a{}" + */ + + + this.css = css.toString(); + + if (this.css[0] === "\uFEFF" || this.css[0] === "\uFFFE") { + this.hasBOM = true; + this.css = this.css.slice(1); + } else { + this.hasBOM = false; + } + + if (opts.from) { + if (/^\w+:\/\//.test(opts.from) || _path.default.isAbsolute(opts.from)) { + /** + * The absolute path to the CSS source file defined + * with the `from` option. + * + * @type {string} + * + * @example + * const root = postcss.parse(css, { from: 'a.css' }) + * root.source.input.file //=> '/home/ai/a.css' + */ + this.file = opts.from; + } else { + this.file = _path.default.resolve(opts.from); + } + } + + var map = new _previousMap.default(this.css, opts); + + if (map.text) { + /** + * The input source map passed from a compilation step before PostCSS + * (for example, from Sass compiler). + * + * @type {PreviousMap} + * + * @example + * root.source.input.map.consumer().sources //=> ['a.sass'] + */ + this.map = map; + var file = map.consumer().file; + if (!this.file && file) this.file = this.mapResolve(file); + } + + if (!this.file) { + sequence += 1; + /** + * The unique ID of the CSS source. It will be created if `from` option + * is not provided (because PostCSS does not know the file path). + * + * @type {string} + * + * @example + * const root = postcss.parse(css) + * root.source.input.file //=> undefined + * root.source.input.id //=> "" + */ + + this.id = ''; + } + + if (this.map) this.map.file = this.from; + } + + var _proto = Input.prototype; + + _proto.error = function error(message, line, column, opts) { + if (opts === void 0) { + opts = {}; + } + + var result; + var origin = this.origin(line, column); + + if (origin) { + result = new _cssSyntaxError.default(message, origin.line, origin.column, origin.source, origin.file, opts.plugin); + } else { + result = new _cssSyntaxError.default(message, line, column, this.css, this.file, opts.plugin); + } + + result.input = { + line: line, + column: column, + source: this.css + }; + if (this.file) result.input.file = this.file; + return result; + } + /** + * Reads the input source map and returns a symbol position + * in the input source (e.g., in a Sass file that was compiled + * to CSS before being passed to PostCSS). + * + * @param {number} line Line in input CSS. + * @param {number} column Column in input CSS. + * + * @return {filePosition} Position in input source. + * + * @example + * root.source.input.origin(1, 1) //=> { file: 'a.css', line: 3, column: 1 } + */ + ; + + _proto.origin = function origin(line, column) { + if (!this.map) return false; + var consumer = this.map.consumer(); + var from = consumer.originalPositionFor({ + line: line, + column: column + }); + if (!from.source) return false; + var result = { + file: this.mapResolve(from.source), + line: from.line, + column: from.column + }; + var source = consumer.sourceContentFor(from.source); + if (source) result.source = source; + return result; + }; + + _proto.mapResolve = function mapResolve(file) { + if (/^\w+:\/\//.test(file)) { + return file; + } + + return _path.default.resolve(this.map.consumer().sourceRoot || '.', file); + } + /** + * The CSS source identifier. Contains {@link Input#file} if the user + * set the `from` option, or {@link Input#id} if they did not. + * + * @type {string} + * + * @example + * const root = postcss.parse(css, { from: 'a.css' }) + * root.source.input.from //=> "/home/ai/a.css" + * + * const root = postcss.parse(css) + * root.source.input.from //=> "" + */ + ; + + _createClass(Input, [{ + key: "from", + get: function get() { + return this.file || this.id; + } + }]); + + return Input; +}(); + +var _default = Input; +/** + * @typedef {object} filePosition + * @property {string} file Path to file. + * @property {number} line Source line in file. + * @property {number} column Source column in file. + */ + +exports.default = _default; +module.exports = exports.default; + +},{"./css-syntax-error":654,"./previous-map":664,"path":645}],657:[function(require,module,exports){ +(function (process){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _mapGenerator = _interopRequireDefault(require("./map-generator")); + +var _stringify2 = _interopRequireDefault(require("./stringify")); + +var _warnOnce = _interopRequireDefault(require("./warn-once")); + +var _result = _interopRequireDefault(require("./result")); + +var _parse = _interopRequireDefault(require("./parse")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +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); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function isPromise(obj) { + return typeof obj === 'object' && typeof obj.then === 'function'; +} +/** + * A Promise proxy for the result of PostCSS transformations. + * + * A `LazyResult` instance is returned by {@link Processor#process}. + * + * @example + * const lazy = postcss([autoprefixer]).process(css) + */ + + +var LazyResult = /*#__PURE__*/function () { + function LazyResult(processor, css, opts) { + this.stringified = false; + this.processed = false; + var root; + + if (typeof css === 'object' && css !== null && css.type === 'root') { + root = css; + } else if (css instanceof LazyResult || css instanceof _result.default) { + root = css.root; + + if (css.map) { + if (typeof opts.map === 'undefined') opts.map = {}; + if (!opts.map.inline) opts.map.inline = false; + opts.map.prev = css.map; + } + } else { + var parser = _parse.default; + if (opts.syntax) parser = opts.syntax.parse; + if (opts.parser) parser = opts.parser; + if (parser.parse) parser = parser.parse; + + try { + root = parser(css, opts); + } catch (error) { + this.error = error; + } + } + + this.result = new _result.default(processor, root, opts); + } + /** + * Returns a {@link Processor} instance, which will be used + * for CSS transformations. + * + * @type {Processor} + */ + + + var _proto = LazyResult.prototype; + /** + * Processes input CSS through synchronous plugins + * and calls {@link Result#warnings()}. + * + * @return {Warning[]} Warnings from plugins. + */ + + _proto.warnings = function warnings() { + return this.sync().warnings(); + } + /** + * Alias for the {@link LazyResult#css} property. + * + * @example + * lazy + '' === lazy.css + * + * @return {string} Output CSS. + */ + ; + + _proto.toString = function toString() { + return this.css; + } + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls `onFulfilled` with a Result instance. If a plugin throws + * an error, the `onRejected` callback will be executed. + * + * It implements standard Promise API. + * + * @param {onFulfilled} onFulfilled Callback will be executed + * when all plugins will finish work. + * @param {onRejected} onRejected Callback will be executed on any error. + * + * @return {Promise} Promise API to make queue. + * + * @example + * postcss([autoprefixer]).process(css, { from: cssPath }).then(result => { + * console.log(result.css) + * }) + */ + ; + + _proto.then = function then(onFulfilled, onRejected) { + if (process.env.NODE_ENV !== 'production') { + if (!('from' in this.opts)) { + (0, _warnOnce.default)('Without `from` option PostCSS could generate wrong source map ' + 'and will not find Browserslist config. Set it to CSS file path ' + 'or to `undefined` to prevent this warning.'); + } + } + + return this.async().then(onFulfilled, onRejected); + } + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls onRejected for each error thrown in any plugin. + * + * It implements standard Promise API. + * + * @param {onRejected} onRejected Callback will be executed on any error. + * + * @return {Promise} Promise API to make queue. + * + * @example + * postcss([autoprefixer]).process(css).then(result => { + * console.log(result.css) + * }).catch(error => { + * console.error(error) + * }) + */ + ; + + _proto.catch = function _catch(onRejected) { + return this.async().catch(onRejected); + } + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls onFinally on any error or when all plugins will finish work. + * + * It implements standard Promise API. + * + * @param {onFinally} onFinally Callback will be executed on any error or + * when all plugins will finish work. + * + * @return {Promise} Promise API to make queue. + * + * @example + * postcss([autoprefixer]).process(css).finally(() => { + * console.log('processing ended') + * }) + */ + ; + + _proto.finally = function _finally(onFinally) { + return this.async().then(onFinally, onFinally); + }; + + _proto.handleError = function handleError(error, plugin) { + try { + this.error = error; + + if (error.name === 'CssSyntaxError' && !error.plugin) { + error.plugin = plugin.postcssPlugin; + error.setMessage(); + } else if (plugin.postcssVersion) { + if (process.env.NODE_ENV !== 'production') { + var pluginName = plugin.postcssPlugin; + var pluginVer = plugin.postcssVersion; + var runtimeVer = this.result.processor.version; + var a = pluginVer.split('.'); + var b = runtimeVer.split('.'); + + if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) { + console.error('Unknown error from PostCSS plugin. Your current PostCSS ' + 'version is ' + runtimeVer + ', but ' + pluginName + ' uses ' + pluginVer + '. Perhaps this is the source of the error below.'); + } + } + } + } catch (err) { + if (console && console.error) console.error(err); + } + }; + + _proto.asyncTick = function asyncTick(resolve, reject) { + var _this = this; + + if (this.plugin >= this.processor.plugins.length) { + this.processed = true; + return resolve(); + } + + try { + var plugin = this.processor.plugins[this.plugin]; + var promise = this.run(plugin); + this.plugin += 1; + + if (isPromise(promise)) { + promise.then(function () { + _this.asyncTick(resolve, reject); + }).catch(function (error) { + _this.handleError(error, plugin); + + _this.processed = true; + reject(error); + }); + } else { + this.asyncTick(resolve, reject); + } + } catch (error) { + this.processed = true; + reject(error); + } + }; + + _proto.async = function async() { + var _this2 = this; + + if (this.processed) { + return new Promise(function (resolve, reject) { + if (_this2.error) { + reject(_this2.error); + } else { + resolve(_this2.stringify()); + } + }); + } + + if (this.processing) { + return this.processing; + } + + this.processing = new Promise(function (resolve, reject) { + if (_this2.error) return reject(_this2.error); + _this2.plugin = 0; + + _this2.asyncTick(resolve, reject); + }).then(function () { + _this2.processed = true; + return _this2.stringify(); + }); + return this.processing; + }; + + _proto.sync = function sync() { + if (this.processed) return this.result; + this.processed = true; + + if (this.processing) { + throw new Error('Use process(css).then(cb) to work with async plugins'); + } + + if (this.error) throw this.error; + + for (var _iterator = this.result.processor.plugins, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var plugin = _ref; + var promise = this.run(plugin); + + if (isPromise(promise)) { + throw new Error('Use process(css).then(cb) to work with async plugins'); + } + } + + return this.result; + }; + + _proto.run = function run(plugin) { + this.result.lastPlugin = plugin; + + try { + return plugin(this.result.root, this.result); + } catch (error) { + this.handleError(error, plugin); + throw error; + } + }; + + _proto.stringify = function stringify() { + if (this.stringified) return this.result; + this.stringified = true; + this.sync(); + var opts = this.result.opts; + var str = _stringify2.default; + if (opts.syntax) str = opts.syntax.stringify; + if (opts.stringifier) str = opts.stringifier; + if (str.stringify) str = str.stringify; + var map = new _mapGenerator.default(str, this.result.root, this.result.opts); + var data = map.generate(); + this.result.css = data[0]; + this.result.map = data[1]; + return this.result; + }; + + _createClass(LazyResult, [{ + key: "processor", + get: function get() { + return this.result.processor; + } + /** + * Options from the {@link Processor#process} call. + * + * @type {processOptions} + */ + + }, { + key: "opts", + get: function get() { + return this.result.opts; + } + /** + * Processes input CSS through synchronous plugins, converts `Root` + * to a CSS string and returns {@link Result#css}. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. This is why this method is only + * for debug purpose, you should always use {@link LazyResult#then}. + * + * @type {string} + * @see Result#css + */ + + }, { + key: "css", + get: function get() { + return this.stringify().css; + } + /** + * An alias for the `css` property. Use it with syntaxes + * that generate non-CSS output. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. This is why this method is only + * for debug purpose, you should always use {@link LazyResult#then}. + * + * @type {string} + * @see Result#content + */ + + }, { + key: "content", + get: function get() { + return this.stringify().content; + } + /** + * Processes input CSS through synchronous plugins + * and returns {@link Result#map}. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. This is why this method is only + * for debug purpose, you should always use {@link LazyResult#then}. + * + * @type {SourceMapGenerator} + * @see Result#map + */ + + }, { + key: "map", + get: function get() { + return this.stringify().map; + } + /** + * Processes input CSS through synchronous plugins + * and returns {@link Result#root}. + * + * This property will only work with synchronous plugins. If the processor + * contains any asynchronous plugins it will throw an error. + * + * This is why this method is only for debug purpose, + * you should always use {@link LazyResult#then}. + * + * @type {Root} + * @see Result#root + */ + + }, { + key: "root", + get: function get() { + return this.sync().root; + } + /** + * Processes input CSS through synchronous plugins + * and returns {@link Result#messages}. + * + * This property will only work with synchronous plugins. If the processor + * contains any asynchronous plugins it will throw an error. + * + * This is why this method is only for debug purpose, + * you should always use {@link LazyResult#then}. + * + * @type {Message[]} + * @see Result#messages + */ + + }, { + key: "messages", + get: function get() { + return this.sync().messages; + } + }]); + + return LazyResult; +}(); + +var _default = LazyResult; +/** + * @callback onFulfilled + * @param {Result} result + */ + +/** + * @callback onRejected + * @param {Error} error + */ + +exports.default = _default; +module.exports = exports.default; + +}).call(this,require('_process')) +},{"./map-generator":659,"./parse":661,"./result":666,"./stringify":670,"./warn-once":673,"_process":675}],658:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; +/** + * Contains helpers for safely splitting lists of CSS values, + * preserving parentheses and quotes. + * + * @example + * const list = postcss.list + * + * @namespace list + */ + +var list = { + split: function split(string, separators, last) { + var array = []; + var current = ''; + var split = false; + var func = 0; + var quote = false; + var escape = false; + + for (var i = 0; i < string.length; i++) { + var letter = string[i]; + + if (quote) { + if (escape) { + escape = false; + } else if (letter === '\\') { + escape = true; + } else if (letter === quote) { + quote = false; + } + } else if (letter === '"' || letter === '\'') { + quote = letter; + } else if (letter === '(') { + func += 1; + } else if (letter === ')') { + if (func > 0) func -= 1; + } else if (func === 0) { + if (separators.indexOf(letter) !== -1) split = true; + } + + if (split) { + if (current !== '') array.push(current.trim()); + current = ''; + split = false; + } else { + current += letter; + } + } + + if (last || current !== '') array.push(current.trim()); + return array; + }, + + /** + * Safely splits space-separated values (such as those for `background`, + * `border-radius`, and other shorthand properties). + * + * @param {string} string Space-separated values. + * + * @return {string[]} Split values. + * + * @example + * postcss.list.space('1px calc(10% + 1px)') //=> ['1px', 'calc(10% + 1px)'] + */ + space: function space(string) { + var spaces = [' ', '\n', '\t']; + return list.split(string, spaces); + }, + + /** + * Safely splits comma-separated values (such as those for `transition-*` + * and `background` properties). + * + * @param {string} string Comma-separated values. + * + * @return {string[]} Split values. + * + * @example + * postcss.list.comma('black, linear-gradient(white, black)') + * //=> ['black', 'linear-gradient(white, black)'] + */ + comma: function comma(string) { + return list.split(string, [','], true); + } +}; +var _default = list; +exports.default = _default; +module.exports = exports.default; + +},{}],659:[function(require,module,exports){ +(function (Buffer){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _sourceMap = _interopRequireDefault(require("source-map")); + +var _path = _interopRequireDefault(require("path")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +var MapGenerator = /*#__PURE__*/function () { + function MapGenerator(stringify, root, opts) { + this.stringify = stringify; + this.mapOpts = opts.map || {}; + this.root = root; + this.opts = opts; + } + + var _proto = MapGenerator.prototype; + + _proto.isMap = function isMap() { + if (typeof this.opts.map !== 'undefined') { + return !!this.opts.map; + } + + return this.previous().length > 0; + }; + + _proto.previous = function previous() { + var _this = this; + + if (!this.previousMaps) { + this.previousMaps = []; + this.root.walk(function (node) { + if (node.source && node.source.input.map) { + var map = node.source.input.map; + + if (_this.previousMaps.indexOf(map) === -1) { + _this.previousMaps.push(map); + } + } + }); + } + + return this.previousMaps; + }; + + _proto.isInline = function isInline() { + if (typeof this.mapOpts.inline !== 'undefined') { + return this.mapOpts.inline; + } + + var annotation = this.mapOpts.annotation; + + if (typeof annotation !== 'undefined' && annotation !== true) { + return false; + } + + if (this.previous().length) { + return this.previous().some(function (i) { + return i.inline; + }); + } + + return true; + }; + + _proto.isSourcesContent = function isSourcesContent() { + if (typeof this.mapOpts.sourcesContent !== 'undefined') { + return this.mapOpts.sourcesContent; + } + + if (this.previous().length) { + return this.previous().some(function (i) { + return i.withContent(); + }); + } + + return true; + }; + + _proto.clearAnnotation = function clearAnnotation() { + if (this.mapOpts.annotation === false) return; + var node; + + for (var i = this.root.nodes.length - 1; i >= 0; i--) { + node = this.root.nodes[i]; + if (node.type !== 'comment') continue; + + if (node.text.indexOf('# sourceMappingURL=') === 0) { + this.root.removeChild(i); + } + } + }; + + _proto.setSourcesContent = function setSourcesContent() { + var _this2 = this; + + var already = {}; + this.root.walk(function (node) { + if (node.source) { + var from = node.source.input.from; + + if (from && !already[from]) { + already[from] = true; + + var relative = _this2.relative(from); + + _this2.map.setSourceContent(relative, node.source.input.css); + } + } + }); + }; + + _proto.applyPrevMaps = function applyPrevMaps() { + for (var _iterator = this.previous(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var prev = _ref; + var from = this.relative(prev.file); + + var root = prev.root || _path.default.dirname(prev.file); + + var map = void 0; + + if (this.mapOpts.sourcesContent === false) { + map = new _sourceMap.default.SourceMapConsumer(prev.text); + + if (map.sourcesContent) { + map.sourcesContent = map.sourcesContent.map(function () { + return null; + }); + } + } else { + map = prev.consumer(); + } + + this.map.applySourceMap(map, from, this.relative(root)); + } + }; + + _proto.isAnnotation = function isAnnotation() { + if (this.isInline()) { + return true; + } + + if (typeof this.mapOpts.annotation !== 'undefined') { + return this.mapOpts.annotation; + } + + if (this.previous().length) { + return this.previous().some(function (i) { + return i.annotation; + }); + } + + return true; + }; + + _proto.toBase64 = function toBase64(str) { + if (Buffer) { + return Buffer.from(str).toString('base64'); + } + + return window.btoa(unescape(encodeURIComponent(str))); + }; + + _proto.addAnnotation = function addAnnotation() { + var content; + + if (this.isInline()) { + content = 'data:application/json;base64,' + this.toBase64(this.map.toString()); + } else if (typeof this.mapOpts.annotation === 'string') { + content = this.mapOpts.annotation; + } else { + content = this.outputFile() + '.map'; + } + + var eol = '\n'; + if (this.css.indexOf('\r\n') !== -1) eol = '\r\n'; + this.css += eol + '/*# sourceMappingURL=' + content + ' */'; + }; + + _proto.outputFile = function outputFile() { + if (this.opts.to) { + return this.relative(this.opts.to); + } + + if (this.opts.from) { + return this.relative(this.opts.from); + } + + return 'to.css'; + }; + + _proto.generateMap = function generateMap() { + this.generateString(); + if (this.isSourcesContent()) this.setSourcesContent(); + if (this.previous().length > 0) this.applyPrevMaps(); + if (this.isAnnotation()) this.addAnnotation(); + + if (this.isInline()) { + return [this.css]; + } + + return [this.css, this.map]; + }; + + _proto.relative = function relative(file) { + if (file.indexOf('<') === 0) return file; + if (/^\w+:\/\//.test(file)) return file; + var from = this.opts.to ? _path.default.dirname(this.opts.to) : '.'; + + if (typeof this.mapOpts.annotation === 'string') { + from = _path.default.dirname(_path.default.resolve(from, this.mapOpts.annotation)); + } + + file = _path.default.relative(from, file); + + if (_path.default.sep === '\\') { + return file.replace(/\\/g, '/'); + } + + return file; + }; + + _proto.sourcePath = function sourcePath(node) { + if (this.mapOpts.from) { + return this.mapOpts.from; + } + + return this.relative(node.source.input.from); + }; + + _proto.generateString = function generateString() { + var _this3 = this; + + this.css = ''; + this.map = new _sourceMap.default.SourceMapGenerator({ + file: this.outputFile() + }); + var line = 1; + var column = 1; + var lines, last; + this.stringify(this.root, function (str, node, type) { + _this3.css += str; + + if (node && type !== 'end') { + if (node.source && node.source.start) { + _this3.map.addMapping({ + source: _this3.sourcePath(node), + generated: { + line: line, + column: column - 1 + }, + original: { + line: node.source.start.line, + column: node.source.start.column - 1 + } + }); + } else { + _this3.map.addMapping({ + source: '', + original: { + line: 1, + column: 0 + }, + generated: { + line: line, + column: column - 1 + } + }); + } + } + + lines = str.match(/\n/g); + + if (lines) { + line += lines.length; + last = str.lastIndexOf('\n'); + column = str.length - last; + } else { + column += str.length; + } + + if (node && type !== 'start') { + var p = node.parent || { + raws: {} + }; + + if (node.type !== 'decl' || node !== p.last || p.raws.semicolon) { + if (node.source && node.source.end) { + _this3.map.addMapping({ + source: _this3.sourcePath(node), + generated: { + line: line, + column: column - 2 + }, + original: { + line: node.source.end.line, + column: node.source.end.column - 1 + } + }); + } else { + _this3.map.addMapping({ + source: '', + original: { + line: 1, + column: 0 + }, + generated: { + line: line, + column: column - 1 + } + }); + } + } + } + }); + }; + + _proto.generate = function generate() { + this.clearAnnotation(); + + if (this.isMap()) { + return this.generateMap(); + } + + var result = ''; + this.stringify(this.root, function (i) { + result += i; + }); + return [result]; + }; + + return MapGenerator; +}(); + +var _default = MapGenerator; +exports.default = _default; +module.exports = exports.default; + +}).call(this,require("buffer").Buffer) +},{"buffer":87,"path":645,"source-map":686}],660:[function(require,module,exports){ +(function (process){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _cssSyntaxError = _interopRequireDefault(require("./css-syntax-error")); + +var _stringifier = _interopRequireDefault(require("./stringifier")); + +var _stringify = _interopRequireDefault(require("./stringify")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function cloneNode(obj, parent) { + var cloned = new obj.constructor(); + + for (var i in obj) { + if (!obj.hasOwnProperty(i)) continue; + var value = obj[i]; + var type = typeof value; + + if (i === 'parent' && type === 'object') { + if (parent) cloned[i] = parent; + } else if (i === 'source') { + cloned[i] = value; + } else if (value instanceof Array) { + cloned[i] = value.map(function (j) { + return cloneNode(j, cloned); + }); + } else { + if (type === 'object' && value !== null) value = cloneNode(value); + cloned[i] = value; + } + } + + return cloned; +} +/** + * All node classes inherit the following common methods. + * + * @abstract + */ + + +var Node = /*#__PURE__*/function () { + /** + * @param {object} [defaults] Value for node properties. + */ + function Node(defaults) { + if (defaults === void 0) { + defaults = {}; + } + + this.raws = {}; + + if (process.env.NODE_ENV !== 'production') { + if (typeof defaults !== 'object' && typeof defaults !== 'undefined') { + throw new Error('PostCSS nodes constructor accepts object, not ' + JSON.stringify(defaults)); + } + } + + for (var name in defaults) { + this[name] = defaults[name]; + } + } + /** + * Returns a `CssSyntaxError` instance containing the original position + * of the node in the source, showing line and column numbers and also + * a small excerpt to facilitate debugging. + * + * If present, an input source map will be used to get the original position + * of the source, even from a previous compilation step + * (e.g., from Sass compilation). + * + * This method produces very useful error messages. + * + * @param {string} message Error description. + * @param {object} [opts] Options. + * @param {string} opts.plugin Plugin name that created this error. + * PostCSS will set it automatically. + * @param {string} opts.word A word inside a node’s string that should + * be highlighted as the source of the error. + * @param {number} opts.index An index inside a node’s string that should + * be highlighted as the source of the error. + * + * @return {CssSyntaxError} Error object to throw it. + * + * @example + * if (!variables[name]) { + * throw decl.error('Unknown variable ' + name, { word: name }) + * // CssSyntaxError: postcss-vars:a.sass:4:3: Unknown variable $black + * // color: $black + * // a + * // ^ + * // background: white + * } + */ + + + var _proto = Node.prototype; + + _proto.error = function error(message, opts) { + if (opts === void 0) { + opts = {}; + } + + if (this.source) { + var pos = this.positionBy(opts); + return this.source.input.error(message, pos.line, pos.column, opts); + } + + return new _cssSyntaxError.default(message); + } + /** + * This method is provided as a convenience wrapper for {@link Result#warn}. + * + * @param {Result} result The {@link Result} instance + * that will receive the warning. + * @param {string} text Warning message. + * @param {object} [opts] Options + * @param {string} opts.plugin Plugin name that created this warning. + * PostCSS will set it automatically. + * @param {string} opts.word A word inside a node’s string that should + * be highlighted as the source of the warning. + * @param {number} opts.index An index inside a node’s string that should + * be highlighted as the source of the warning. + * + * @return {Warning} Created warning object. + * + * @example + * const plugin = postcss.plugin('postcss-deprecated', () => { + * return (root, result) => { + * root.walkDecls('bad', decl => { + * decl.warn(result, 'Deprecated property bad') + * }) + * } + * }) + */ + ; + + _proto.warn = function warn(result, text, opts) { + var data = { + node: this + }; + + for (var i in opts) { + data[i] = opts[i]; + } + + return result.warn(text, data); + } + /** + * Removes the node from its parent and cleans the parent properties + * from the node and its children. + * + * @example + * if (decl.prop.match(/^-webkit-/)) { + * decl.remove() + * } + * + * @return {Node} Node to make calls chain. + */ + ; + + _proto.remove = function remove() { + if (this.parent) { + this.parent.removeChild(this); + } + + this.parent = undefined; + return this; + } + /** + * Returns a CSS string representing the node. + * + * @param {stringifier|syntax} [stringifier] A syntax to use + * in string generation. + * + * @return {string} CSS string of this node. + * + * @example + * postcss.rule({ selector: 'a' }).toString() //=> "a {}" + */ + ; + + _proto.toString = function toString(stringifier) { + if (stringifier === void 0) { + stringifier = _stringify.default; + } + + if (stringifier.stringify) stringifier = stringifier.stringify; + var result = ''; + stringifier(this, function (i) { + result += i; + }); + return result; + } + /** + * Returns an exact clone of the node. + * + * The resulting cloned node and its (cloned) children will retain + * code style properties. + * + * @param {object} [overrides] New properties to override in the clone. + * + * @example + * decl.raws.before //=> "\n " + * const cloned = decl.clone({ prop: '-moz-' + decl.prop }) + * cloned.raws.before //=> "\n " + * cloned.toString() //=> -moz-transform: scale(0) + * + * @return {Node} Clone of the node. + */ + ; + + _proto.clone = function clone(overrides) { + if (overrides === void 0) { + overrides = {}; + } + + var cloned = cloneNode(this); + + for (var name in overrides) { + cloned[name] = overrides[name]; + } + + return cloned; + } + /** + * Shortcut to clone the node and insert the resulting cloned node + * before the current node. + * + * @param {object} [overrides] Mew properties to override in the clone. + * + * @example + * decl.cloneBefore({ prop: '-moz-' + decl.prop }) + * + * @return {Node} New node + */ + ; + + _proto.cloneBefore = function cloneBefore(overrides) { + if (overrides === void 0) { + overrides = {}; + } + + var cloned = this.clone(overrides); + this.parent.insertBefore(this, cloned); + return cloned; + } + /** + * Shortcut to clone the node and insert the resulting cloned node + * after the current node. + * + * @param {object} [overrides] New properties to override in the clone. + * + * @return {Node} New node. + */ + ; + + _proto.cloneAfter = function cloneAfter(overrides) { + if (overrides === void 0) { + overrides = {}; + } + + var cloned = this.clone(overrides); + this.parent.insertAfter(this, cloned); + return cloned; + } + /** + * Inserts node(s) before the current node and removes the current node. + * + * @param {...Node} nodes Mode(s) to replace current one. + * + * @example + * if (atrule.name === 'mixin') { + * atrule.replaceWith(mixinRules[atrule.params]) + * } + * + * @return {Node} Current node to methods chain. + */ + ; + + _proto.replaceWith = function replaceWith() { + if (this.parent) { + for (var _len = arguments.length, nodes = new Array(_len), _key = 0; _key < _len; _key++) { + nodes[_key] = arguments[_key]; + } + + for (var _i = 0, _nodes = nodes; _i < _nodes.length; _i++) { + var node = _nodes[_i]; + this.parent.insertBefore(this, node); + } + + this.remove(); + } + + return this; + } + /** + * Returns the next child of the node’s parent. + * Returns `undefined` if the current node is the last child. + * + * @return {Node|undefined} Next node. + * + * @example + * if (comment.text === 'delete next') { + * const next = comment.next() + * if (next) { + * next.remove() + * } + * } + */ + ; + + _proto.next = function next() { + if (!this.parent) return undefined; + var index = this.parent.index(this); + return this.parent.nodes[index + 1]; + } + /** + * Returns the previous child of the node’s parent. + * Returns `undefined` if the current node is the first child. + * + * @return {Node|undefined} Previous node. + * + * @example + * const annotation = decl.prev() + * if (annotation.type === 'comment') { + * readAnnotation(annotation.text) + * } + */ + ; + + _proto.prev = function prev() { + if (!this.parent) return undefined; + var index = this.parent.index(this); + return this.parent.nodes[index - 1]; + } + /** + * Insert new node before current node to current node’s parent. + * + * Just alias for `node.parent.insertBefore(node, add)`. + * + * @param {Node|object|string|Node[]} add New node. + * + * @return {Node} This node for methods chain. + * + * @example + * decl.before('content: ""') + */ + ; + + _proto.before = function before(add) { + this.parent.insertBefore(this, add); + return this; + } + /** + * Insert new node after current node to current node’s parent. + * + * Just alias for `node.parent.insertAfter(node, add)`. + * + * @param {Node|object|string|Node[]} add New node. + * + * @return {Node} This node for methods chain. + * + * @example + * decl.after('color: black') + */ + ; + + _proto.after = function after(add) { + this.parent.insertAfter(this, add); + return this; + }; + + _proto.toJSON = function toJSON() { + var fixed = {}; + + for (var name in this) { + if (!this.hasOwnProperty(name)) continue; + if (name === 'parent') continue; + var value = this[name]; + + if (value instanceof Array) { + fixed[name] = value.map(function (i) { + if (typeof i === 'object' && i.toJSON) { + return i.toJSON(); + } else { + return i; + } + }); + } else if (typeof value === 'object' && value.toJSON) { + fixed[name] = value.toJSON(); + } else { + fixed[name] = value; + } + } + + return fixed; + } + /** + * Returns a {@link Node#raws} value. If the node is missing + * the code style property (because the node was manually built or cloned), + * PostCSS will try to autodetect the code style property by looking + * at other nodes in the tree. + * + * @param {string} prop Name of code style property. + * @param {string} [defaultType] Name of default value, it can be missed + * if the value is the same as prop. + * + * @example + * const root = postcss.parse('a { background: white }') + * root.nodes[0].append({ prop: 'color', value: 'black' }) + * root.nodes[0].nodes[1].raws.before //=> undefined + * root.nodes[0].nodes[1].raw('before') //=> ' ' + * + * @return {string} Code style value. + */ + ; + + _proto.raw = function raw(prop, defaultType) { + var str = new _stringifier.default(); + return str.raw(this, prop, defaultType); + } + /** + * Finds the Root instance of the node’s tree. + * + * @example + * root.nodes[0].nodes[0].root() === root + * + * @return {Root} Root parent. + */ + ; + + _proto.root = function root() { + var result = this; + + while (result.parent) { + result = result.parent; + } + + return result; + } + /** + * Clear the code style properties for the node and its children. + * + * @param {boolean} [keepBetween] Keep the raws.between symbols. + * + * @return {undefined} + * + * @example + * node.raws.before //=> ' ' + * node.cleanRaws() + * node.raws.before //=> undefined + */ + ; + + _proto.cleanRaws = function cleanRaws(keepBetween) { + delete this.raws.before; + delete this.raws.after; + if (!keepBetween) delete this.raws.between; + }; + + _proto.positionInside = function positionInside(index) { + var string = this.toString(); + var column = this.source.start.column; + var line = this.source.start.line; + + for (var i = 0; i < index; i++) { + if (string[i] === '\n') { + column = 1; + line += 1; + } else { + column += 1; + } + } + + return { + line: line, + column: column + }; + }; + + _proto.positionBy = function positionBy(opts) { + var pos = this.source.start; + + if (opts.index) { + pos = this.positionInside(opts.index); + } else if (opts.word) { + var index = this.toString().indexOf(opts.word); + if (index !== -1) pos = this.positionInside(index); + } + + return pos; + } + /** + * @memberof Node# + * @member {string} type String representing the node’s type. + * Possible values are `root`, `atrule`, `rule`, + * `decl`, or `comment`. + * + * @example + * postcss.decl({ prop: 'color', value: 'black' }).type //=> 'decl' + */ + + /** + * @memberof Node# + * @member {Container} parent The node’s parent node. + * + * @example + * root.nodes[0].parent === root + */ + + /** + * @memberof Node# + * @member {source} source The input source of the node. + * + * The property is used in source map generation. + * + * If you create a node manually (e.g., with `postcss.decl()`), + * that node will not have a `source` property and will be absent + * from the source map. For this reason, the plugin developer should + * consider cloning nodes to create new ones (in which case the new node’s + * source will reference the original, cloned node) or setting + * the `source` property manually. + * + * ```js + * // Bad + * const prefixed = postcss.decl({ + * prop: '-moz-' + decl.prop, + * value: decl.value + * }) + * + * // Good + * const prefixed = decl.clone({ prop: '-moz-' + decl.prop }) + * ``` + * + * ```js + * if (atrule.name === 'add-link') { + * const rule = postcss.rule({ selector: 'a', source: atrule.source }) + * atrule.parent.insertBefore(atrule, rule) + * } + * ``` + * + * @example + * decl.source.input.from //=> '/home/ai/a.sass' + * decl.source.start //=> { line: 10, column: 2 } + * decl.source.end //=> { line: 10, column: 12 } + */ + + /** + * @memberof Node# + * @member {object} raws Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `after`: the space symbols after the last child of the node + * to the end of the node. + * * `between`: the symbols between the property and value + * for declarations, selector and `{` for rules, or last parameter + * and `{` for at-rules. + * * `semicolon`: contains true if the last child has + * an (optional) semicolon. + * * `afterName`: the space between the at-rule name and its parameters. + * * `left`: the space symbols between `/*` and the comment’s text. + * * `right`: the space symbols between the comment’s text + * and */. + * * `important`: the content of the important statement, + * if it is not just `!important`. + * + * PostCSS cleans selectors, declaration values and at-rule parameters + * from comments and extra spaces, but it stores origin content in raws + * properties. As such, if you don’t change a declaration’s value, + * PostCSS will use the raw value with comments. + * + * @example + * const root = postcss.parse('a {\n color:black\n}') + * root.first.first.raws //=> { before: '\n ', between: ':' } + */ + ; + + return Node; +}(); + +var _default = Node; +/** + * @typedef {object} position + * @property {number} line Source line in file. + * @property {number} column Source column in file. + */ + +/** + * @typedef {object} source + * @property {Input} input {@link Input} with input file + * @property {position} start The starting position of the node’s source. + * @property {position} end The ending position of the node’s source. + */ + +exports.default = _default; +module.exports = exports.default; + +}).call(this,require('_process')) +},{"./css-syntax-error":654,"./stringifier":669,"./stringify":670,"_process":675}],661:[function(require,module,exports){ +(function (process){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _parser = _interopRequireDefault(require("./parser")); + +var _input = _interopRequireDefault(require("./input")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function parse(css, opts) { + var input = new _input.default(css, opts); + var parser = new _parser.default(input); + + try { + parser.parse(); + } catch (e) { + if (process.env.NODE_ENV !== 'production') { + if (e.name === 'CssSyntaxError' && opts && opts.from) { + if (/\.scss$/i.test(opts.from)) { + e.message += '\nYou tried to parse SCSS with ' + 'the standard CSS parser; ' + 'try again with the postcss-scss parser'; + } else if (/\.sass/i.test(opts.from)) { + e.message += '\nYou tried to parse Sass with ' + 'the standard CSS parser; ' + 'try again with the postcss-sass parser'; + } else if (/\.less$/i.test(opts.from)) { + e.message += '\nYou tried to parse Less with ' + 'the standard CSS parser; ' + 'try again with the postcss-less parser'; + } + } + } + + throw e; + } + + return parser.root; +} + +var _default = parse; +exports.default = _default; +module.exports = exports.default; + +}).call(this,require('_process')) +},{"./input":656,"./parser":662,"_process":675}],662:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _declaration = _interopRequireDefault(require("./declaration")); + +var _tokenize = _interopRequireDefault(require("./tokenize")); + +var _comment = _interopRequireDefault(require("./comment")); + +var _atRule = _interopRequireDefault(require("./at-rule")); + +var _root = _interopRequireDefault(require("./root")); + +var _rule = _interopRequireDefault(require("./rule")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +var Parser = /*#__PURE__*/function () { + function Parser(input) { + this.input = input; + this.root = new _root.default(); + this.current = this.root; + this.spaces = ''; + this.semicolon = false; + this.createTokenizer(); + this.root.source = { + input: input, + start: { + line: 1, + column: 1 + } + }; + } + + var _proto = Parser.prototype; + + _proto.createTokenizer = function createTokenizer() { + this.tokenizer = (0, _tokenize.default)(this.input); + }; + + _proto.parse = function parse() { + var token; + + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken(); + + switch (token[0]) { + case 'space': + this.spaces += token[1]; + break; + + case ';': + this.freeSemicolon(token); + break; + + case '}': + this.end(token); + break; + + case 'comment': + this.comment(token); + break; + + case 'at-word': + this.atrule(token); + break; + + case '{': + this.emptyRule(token); + break; + + default: + this.other(token); + break; + } + } + + this.endFile(); + }; + + _proto.comment = function comment(token) { + var node = new _comment.default(); + this.init(node, token[2], token[3]); + node.source.end = { + line: token[4], + column: token[5] + }; + var text = token[1].slice(2, -2); + + if (/^\s*$/.test(text)) { + node.text = ''; + node.raws.left = text; + node.raws.right = ''; + } else { + var match = text.match(/^(\s*)([^]*[^\s])(\s*)$/); + node.text = match[2]; + node.raws.left = match[1]; + node.raws.right = match[3]; + } + }; + + _proto.emptyRule = function emptyRule(token) { + var node = new _rule.default(); + this.init(node, token[2], token[3]); + node.selector = ''; + node.raws.between = ''; + this.current = node; + }; + + _proto.other = function other(start) { + var end = false; + var type = null; + var colon = false; + var bracket = null; + var brackets = []; + var tokens = []; + var token = start; + + while (token) { + type = token[0]; + tokens.push(token); + + if (type === '(' || type === '[') { + if (!bracket) bracket = token; + brackets.push(type === '(' ? ')' : ']'); + } else if (brackets.length === 0) { + if (type === ';') { + if (colon) { + this.decl(tokens); + return; + } else { + break; + } + } else if (type === '{') { + this.rule(tokens); + return; + } else if (type === '}') { + this.tokenizer.back(tokens.pop()); + end = true; + break; + } else if (type === ':') { + colon = true; + } + } else if (type === brackets[brackets.length - 1]) { + brackets.pop(); + if (brackets.length === 0) bracket = null; + } + + token = this.tokenizer.nextToken(); + } + + if (this.tokenizer.endOfFile()) end = true; + if (brackets.length > 0) this.unclosedBracket(bracket); + + if (end && colon) { + while (tokens.length) { + token = tokens[tokens.length - 1][0]; + if (token !== 'space' && token !== 'comment') break; + this.tokenizer.back(tokens.pop()); + } + + this.decl(tokens); + } else { + this.unknownWord(tokens); + } + }; + + _proto.rule = function rule(tokens) { + tokens.pop(); + var node = new _rule.default(); + this.init(node, tokens[0][2], tokens[0][3]); + node.raws.between = this.spacesAndCommentsFromEnd(tokens); + this.raw(node, 'selector', tokens); + this.current = node; + }; + + _proto.decl = function decl(tokens) { + var node = new _declaration.default(); + this.init(node); + var last = tokens[tokens.length - 1]; + + if (last[0] === ';') { + this.semicolon = true; + tokens.pop(); + } + + if (last[4]) { + node.source.end = { + line: last[4], + column: last[5] + }; + } else { + node.source.end = { + line: last[2], + column: last[3] + }; + } + + while (tokens[0][0] !== 'word') { + if (tokens.length === 1) this.unknownWord(tokens); + node.raws.before += tokens.shift()[1]; + } + + node.source.start = { + line: tokens[0][2], + column: tokens[0][3] + }; + node.prop = ''; + + while (tokens.length) { + var type = tokens[0][0]; + + if (type === ':' || type === 'space' || type === 'comment') { + break; + } + + node.prop += tokens.shift()[1]; + } + + node.raws.between = ''; + var token; + + while (tokens.length) { + token = tokens.shift(); + + if (token[0] === ':') { + node.raws.between += token[1]; + break; + } else { + if (token[0] === 'word' && /\w/.test(token[1])) { + this.unknownWord([token]); + } + + node.raws.between += token[1]; + } + } + + if (node.prop[0] === '_' || node.prop[0] === '*') { + node.raws.before += node.prop[0]; + node.prop = node.prop.slice(1); + } + + node.raws.between += this.spacesAndCommentsFromStart(tokens); + this.precheckMissedSemicolon(tokens); + + for (var i = tokens.length - 1; i > 0; i--) { + token = tokens[i]; + + if (token[1].toLowerCase() === '!important') { + node.important = true; + var string = this.stringFrom(tokens, i); + string = this.spacesFromEnd(tokens) + string; + if (string !== ' !important') node.raws.important = string; + break; + } else if (token[1].toLowerCase() === 'important') { + var cache = tokens.slice(0); + var str = ''; + + for (var j = i; j > 0; j--) { + var _type = cache[j][0]; + + if (str.trim().indexOf('!') === 0 && _type !== 'space') { + break; + } + + str = cache.pop()[1] + str; + } + + if (str.trim().indexOf('!') === 0) { + node.important = true; + node.raws.important = str; + tokens = cache; + } + } + + if (token[0] !== 'space' && token[0] !== 'comment') { + break; + } + } + + this.raw(node, 'value', tokens); + if (node.value.indexOf(':') !== -1) this.checkMissedSemicolon(tokens); + }; + + _proto.atrule = function atrule(token) { + var node = new _atRule.default(); + node.name = token[1].slice(1); + + if (node.name === '') { + this.unnamedAtrule(node, token); + } + + this.init(node, token[2], token[3]); + var prev; + var shift; + var last = false; + var open = false; + var params = []; + + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken(); + + if (token[0] === ';') { + node.source.end = { + line: token[2], + column: token[3] + }; + this.semicolon = true; + break; + } else if (token[0] === '{') { + open = true; + break; + } else if (token[0] === '}') { + if (params.length > 0) { + shift = params.length - 1; + prev = params[shift]; + + while (prev && prev[0] === 'space') { + prev = params[--shift]; + } + + if (prev) { + node.source.end = { + line: prev[4], + column: prev[5] + }; + } + } + + this.end(token); + break; + } else { + params.push(token); + } + + if (this.tokenizer.endOfFile()) { + last = true; + break; + } + } + + node.raws.between = this.spacesAndCommentsFromEnd(params); + + if (params.length) { + node.raws.afterName = this.spacesAndCommentsFromStart(params); + this.raw(node, 'params', params); + + if (last) { + token = params[params.length - 1]; + node.source.end = { + line: token[4], + column: token[5] + }; + this.spaces = node.raws.between; + node.raws.between = ''; + } + } else { + node.raws.afterName = ''; + node.params = ''; + } + + if (open) { + node.nodes = []; + this.current = node; + } + }; + + _proto.end = function end(token) { + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon; + } + + this.semicolon = false; + this.current.raws.after = (this.current.raws.after || '') + this.spaces; + this.spaces = ''; + + if (this.current.parent) { + this.current.source.end = { + line: token[2], + column: token[3] + }; + this.current = this.current.parent; + } else { + this.unexpectedClose(token); + } + }; + + _proto.endFile = function endFile() { + if (this.current.parent) this.unclosedBlock(); + + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon; + } + + this.current.raws.after = (this.current.raws.after || '') + this.spaces; + }; + + _proto.freeSemicolon = function freeSemicolon(token) { + this.spaces += token[1]; + + if (this.current.nodes) { + var prev = this.current.nodes[this.current.nodes.length - 1]; + + if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) { + prev.raws.ownSemicolon = this.spaces; + this.spaces = ''; + } + } + } // Helpers + ; + + _proto.init = function init(node, line, column) { + this.current.push(node); + node.source = { + start: { + line: line, + column: column + }, + input: this.input + }; + node.raws.before = this.spaces; + this.spaces = ''; + if (node.type !== 'comment') this.semicolon = false; + }; + + _proto.raw = function raw(node, prop, tokens) { + var token, type; + var length = tokens.length; + var value = ''; + var clean = true; + var next, prev; + var pattern = /^([.|#])?([\w])+/i; + + for (var i = 0; i < length; i += 1) { + token = tokens[i]; + type = token[0]; + + if (type === 'comment' && node.type === 'rule') { + prev = tokens[i - 1]; + next = tokens[i + 1]; + + if (prev[0] !== 'space' && next[0] !== 'space' && pattern.test(prev[1]) && pattern.test(next[1])) { + value += token[1]; + } else { + clean = false; + } + + continue; + } + + if (type === 'comment' || type === 'space' && i === length - 1) { + clean = false; + } else { + value += token[1]; + } + } + + if (!clean) { + var raw = tokens.reduce(function (all, i) { + return all + i[1]; + }, ''); + node.raws[prop] = { + value: value, + raw: raw + }; + } + + node[prop] = value; + }; + + _proto.spacesAndCommentsFromEnd = function spacesAndCommentsFromEnd(tokens) { + var lastTokenType; + var spaces = ''; + + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0]; + if (lastTokenType !== 'space' && lastTokenType !== 'comment') break; + spaces = tokens.pop()[1] + spaces; + } + + return spaces; + }; + + _proto.spacesAndCommentsFromStart = function spacesAndCommentsFromStart(tokens) { + var next; + var spaces = ''; + + while (tokens.length) { + next = tokens[0][0]; + if (next !== 'space' && next !== 'comment') break; + spaces += tokens.shift()[1]; + } + + return spaces; + }; + + _proto.spacesFromEnd = function spacesFromEnd(tokens) { + var lastTokenType; + var spaces = ''; + + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0]; + if (lastTokenType !== 'space') break; + spaces = tokens.pop()[1] + spaces; + } + + return spaces; + }; + + _proto.stringFrom = function stringFrom(tokens, from) { + var result = ''; + + for (var i = from; i < tokens.length; i++) { + result += tokens[i][1]; + } + + tokens.splice(from, tokens.length - from); + return result; + }; + + _proto.colon = function colon(tokens) { + var brackets = 0; + var token, type, prev; + + for (var i = 0; i < tokens.length; i++) { + token = tokens[i]; + type = token[0]; + + if (type === '(') { + brackets += 1; + } + + if (type === ')') { + brackets -= 1; + } + + if (brackets === 0 && type === ':') { + if (!prev) { + this.doubleColon(token); + } else if (prev[0] === 'word' && prev[1] === 'progid') { + continue; + } else { + return i; + } + } + + prev = token; + } + + return false; + } // Errors + ; + + _proto.unclosedBracket = function unclosedBracket(bracket) { + throw this.input.error('Unclosed bracket', bracket[2], bracket[3]); + }; + + _proto.unknownWord = function unknownWord(tokens) { + throw this.input.error('Unknown word', tokens[0][2], tokens[0][3]); + }; + + _proto.unexpectedClose = function unexpectedClose(token) { + throw this.input.error('Unexpected }', token[2], token[3]); + }; + + _proto.unclosedBlock = function unclosedBlock() { + var pos = this.current.source.start; + throw this.input.error('Unclosed block', pos.line, pos.column); + }; + + _proto.doubleColon = function doubleColon(token) { + throw this.input.error('Double colon', token[2], token[3]); + }; + + _proto.unnamedAtrule = function unnamedAtrule(node, token) { + throw this.input.error('At-rule without name', token[2], token[3]); + }; + + _proto.precheckMissedSemicolon = function precheckMissedSemicolon() + /* tokens */ + {// Hook for Safe Parser + }; + + _proto.checkMissedSemicolon = function checkMissedSemicolon(tokens) { + var colon = this.colon(tokens); + if (colon === false) return; + var founded = 0; + var token; + + for (var j = colon - 1; j >= 0; j--) { + token = tokens[j]; + + if (token[0] !== 'space') { + founded += 1; + if (founded === 2) break; + } + } + + throw this.input.error('Missed semicolon', token[2], token[3]); + }; + + return Parser; +}(); + +exports.default = Parser; +module.exports = exports.default; + +},{"./at-rule":651,"./comment":652,"./declaration":655,"./root":667,"./rule":668,"./tokenize":671}],663:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _declaration = _interopRequireDefault(require("./declaration")); + +var _processor = _interopRequireDefault(require("./processor")); + +var _stringify = _interopRequireDefault(require("./stringify")); + +var _comment = _interopRequireDefault(require("./comment")); + +var _atRule = _interopRequireDefault(require("./at-rule")); + +var _vendor = _interopRequireDefault(require("./vendor")); + +var _parse = _interopRequireDefault(require("./parse")); + +var _list = _interopRequireDefault(require("./list")); + +var _rule = _interopRequireDefault(require("./rule")); + +var _root = _interopRequireDefault(require("./root")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} +/** + * Create a new {@link Processor} instance that will apply `plugins` + * as CSS processors. + * + * @param {Array.|Processor} plugins PostCSS plugins. + * See {@link Processor#use} for plugin format. + * + * @return {Processor} Processor to process multiple CSS. + * + * @example + * import postcss from 'postcss' + * + * postcss(plugins).process(css, { from, to }).then(result => { + * console.log(result.css) + * }) + * + * @namespace postcss + */ + + +function postcss() { + for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) { + plugins[_key] = arguments[_key]; + } + + if (plugins.length === 1 && Array.isArray(plugins[0])) { + plugins = plugins[0]; + } + + return new _processor.default(plugins); +} +/** + * Creates a PostCSS plugin with a standard API. + * + * The newly-wrapped function will provide both the name and PostCSS + * version of the plugin. + * + * ```js + * const processor = postcss([replace]) + * processor.plugins[0].postcssPlugin //=> 'postcss-replace' + * processor.plugins[0].postcssVersion //=> '6.0.0' + * ``` + * + * The plugin function receives 2 arguments: {@link Root} + * and {@link Result} instance. The function should mutate the provided + * `Root` node. Alternatively, you can create a new `Root` node + * and override the `result.root` property. + * + * ```js + * const cleaner = postcss.plugin('postcss-cleaner', () => { + * return (root, result) => { + * result.root = postcss.root() + * } + * }) + * ``` + * + * As a convenience, plugins also expose a `process` method so that you can use + * them as standalone tools. + * + * ```js + * cleaner.process(css, processOpts, pluginOpts) + * // This is equivalent to: + * postcss([ cleaner(pluginOpts) ]).process(css, processOpts) + * ``` + * + * Asynchronous plugins should return a `Promise` instance. + * + * ```js + * postcss.plugin('postcss-import', () => { + * return (root, result) => { + * return new Promise( (resolve, reject) => { + * fs.readFile('base.css', (base) => { + * root.prepend(base) + * resolve() + * }) + * }) + * } + * }) + * ``` + * + * Add warnings using the {@link Node#warn} method. + * Send data to other plugins using the {@link Result#messages} array. + * + * ```js + * postcss.plugin('postcss-caniuse-test', () => { + * return (root, result) => { + * root.walkDecls(decl => { + * if (!caniuse.support(decl.prop)) { + * decl.warn(result, 'Some browsers do not support ' + decl.prop) + * } + * }) + * } + * }) + * ``` + * + * @param {string} name PostCSS plugin name. Same as in `name` + * property in `package.json`. It will be saved + * in `plugin.postcssPlugin` property. + * @param {function} initializer Will receive plugin options + * and should return {@link pluginFunction} + * + * @return {Plugin} PostCSS plugin. + */ + + +postcss.plugin = function plugin(name, initializer) { + function creator() { + var transformer = initializer.apply(void 0, arguments); + transformer.postcssPlugin = name; + transformer.postcssVersion = new _processor.default().version; + return transformer; + } + + var cache; + Object.defineProperty(creator, 'postcss', { + get: function get() { + if (!cache) cache = creator(); + return cache; + } + }); + + creator.process = function (css, processOpts, pluginOpts) { + return postcss([creator(pluginOpts)]).process(css, processOpts); + }; + + return creator; +}; +/** + * Default function to convert a node tree into a CSS string. + * + * @param {Node} node Start node for stringifing. Usually {@link Root}. + * @param {builder} builder Function to concatenate CSS from node’s parts + * or generate string and source map. + * + * @return {void} + * + * @function + */ + + +postcss.stringify = _stringify.default; +/** + * Parses source css and returns a new {@link Root} node, + * which contains the source CSS nodes. + * + * @param {string|toString} css String with input CSS or any object + * with toString() method, like a Buffer + * @param {processOptions} [opts] Options with only `from` and `map` keys. + * + * @return {Root} PostCSS AST. + * + * @example + * // Simple CSS concatenation with source map support + * const root1 = postcss.parse(css1, { from: file1 }) + * const root2 = postcss.parse(css2, { from: file2 }) + * root1.append(root2).toResult().css + * + * @function + */ + +postcss.parse = _parse.default; +/** + * Contains the {@link vendor} module. + * + * @type {vendor} + * + * @example + * postcss.vendor.unprefixed('-moz-tab') //=> ['tab'] + */ + +postcss.vendor = _vendor.default; +/** + * Contains the {@link list} module. + * + * @member {list} + * + * @example + * postcss.list.space('5px calc(10% + 5px)') //=> ['5px', 'calc(10% + 5px)'] + */ + +postcss.list = _list.default; +/** + * Creates a new {@link Comment} node. + * + * @param {object} [defaults] Properties for the new node. + * + * @return {Comment} New comment node + * + * @example + * postcss.comment({ text: 'test' }) + */ + +postcss.comment = function (defaults) { + return new _comment.default(defaults); +}; +/** + * Creates a new {@link AtRule} node. + * + * @param {object} [defaults] Properties for the new node. + * + * @return {AtRule} new at-rule node + * + * @example + * postcss.atRule({ name: 'charset' }).toString() //=> "@charset" + */ + + +postcss.atRule = function (defaults) { + return new _atRule.default(defaults); +}; +/** + * Creates a new {@link Declaration} node. + * + * @param {object} [defaults] Properties for the new node. + * + * @return {Declaration} new declaration node + * + * @example + * postcss.decl({ prop: 'color', value: 'red' }).toString() //=> "color: red" + */ + + +postcss.decl = function (defaults) { + return new _declaration.default(defaults); +}; +/** + * Creates a new {@link Rule} node. + * + * @param {object} [defaults] Properties for the new node. + * + * @return {Rule} new rule node + * + * @example + * postcss.rule({ selector: 'a' }).toString() //=> "a {\n}" + */ + + +postcss.rule = function (defaults) { + return new _rule.default(defaults); +}; +/** + * Creates a new {@link Root} node. + * + * @param {object} [defaults] Properties for the new node. + * + * @return {Root} new root node. + * + * @example + * postcss.root({ after: '\n' }).toString() //=> "\n" + */ + + +postcss.root = function (defaults) { + return new _root.default(defaults); +}; + +var _default = postcss; +exports.default = _default; +module.exports = exports.default; + +},{"./at-rule":651,"./comment":652,"./declaration":655,"./list":658,"./parse":661,"./processor":665,"./root":667,"./rule":668,"./stringify":670,"./vendor":672}],664:[function(require,module,exports){ +(function (Buffer){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _sourceMap = _interopRequireDefault(require("source-map")); + +var _path = _interopRequireDefault(require("path")); + +var _fs = _interopRequireDefault(require("fs")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function fromBase64(str) { + if (Buffer) { + return Buffer.from(str, 'base64').toString(); + } else { + return window.atob(str); + } +} +/** + * Source map information from input CSS. + * For example, source map after Sass compiler. + * + * This class will automatically find source map in input CSS or in file system + * near input file (according `from` option). + * + * @example + * const root = postcss.parse(css, { from: 'a.sass.css' }) + * root.input.map //=> PreviousMap + */ + + +var PreviousMap = /*#__PURE__*/function () { + /** + * @param {string} css Input CSS source. + * @param {processOptions} [opts] {@link Processor#process} options. + */ + function PreviousMap(css, opts) { + this.loadAnnotation(css); + /** + * Was source map inlined by data-uri to input CSS. + * + * @type {boolean} + */ + + this.inline = this.startWith(this.annotation, 'data:'); + var prev = opts.map ? opts.map.prev : undefined; + var text = this.loadMap(opts.from, prev); + if (text) this.text = text; + } + /** + * Create a instance of `SourceMapGenerator` class + * from the `source-map` library to work with source map information. + * + * It is lazy method, so it will create object only on first call + * and then it will use cache. + * + * @return {SourceMapGenerator} Object with source map information. + */ + + + var _proto = PreviousMap.prototype; + + _proto.consumer = function consumer() { + if (!this.consumerCache) { + this.consumerCache = new _sourceMap.default.SourceMapConsumer(this.text); + } + + return this.consumerCache; + } + /** + * Does source map contains `sourcesContent` with input source text. + * + * @return {boolean} Is `sourcesContent` present. + */ + ; + + _proto.withContent = function withContent() { + return !!(this.consumer().sourcesContent && this.consumer().sourcesContent.length > 0); + }; + + _proto.startWith = function startWith(string, start) { + if (!string) return false; + return string.substr(0, start.length) === start; + }; + + _proto.getAnnotationURL = function getAnnotationURL(sourceMapString) { + return sourceMapString.match(/\/\*\s*# sourceMappingURL=(.*)\s*\*\//)[1].trim(); + }; + + _proto.loadAnnotation = function loadAnnotation(css) { + var annotations = css.match(/\/\*\s*# sourceMappingURL=(.*)\s*\*\//mg); + + if (annotations && annotations.length > 0) { + // Locate the last sourceMappingURL to avoid picking up + // sourceMappingURLs from comments, strings, etc. + var lastAnnotation = annotations[annotations.length - 1]; + + if (lastAnnotation) { + this.annotation = this.getAnnotationURL(lastAnnotation); + } + } + }; + + _proto.decodeInline = function decodeInline(text) { + var baseCharsetUri = /^data:application\/json;charset=utf-?8;base64,/; + var baseUri = /^data:application\/json;base64,/; + var uri = 'data:application/json,'; + + if (this.startWith(text, uri)) { + return decodeURIComponent(text.substr(uri.length)); + } + + if (baseCharsetUri.test(text) || baseUri.test(text)) { + return fromBase64(text.substr(RegExp.lastMatch.length)); + } + + var encoding = text.match(/data:application\/json;([^,]+),/)[1]; + throw new Error('Unsupported source map encoding ' + encoding); + }; + + _proto.loadMap = function loadMap(file, prev) { + if (prev === false) return false; + + if (prev) { + if (typeof prev === 'string') { + return prev; + } else if (typeof prev === 'function') { + var prevPath = prev(file); + + if (prevPath && _fs.default.existsSync && _fs.default.existsSync(prevPath)) { + return _fs.default.readFileSync(prevPath, 'utf-8').toString().trim(); + } else { + throw new Error('Unable to load previous source map: ' + prevPath.toString()); + } + } else if (prev instanceof _sourceMap.default.SourceMapConsumer) { + return _sourceMap.default.SourceMapGenerator.fromSourceMap(prev).toString(); + } else if (prev instanceof _sourceMap.default.SourceMapGenerator) { + return prev.toString(); + } else if (this.isMap(prev)) { + return JSON.stringify(prev); + } else { + throw new Error('Unsupported previous source map format: ' + prev.toString()); + } + } else if (this.inline) { + return this.decodeInline(this.annotation); + } else if (this.annotation) { + var map = this.annotation; + if (file) map = _path.default.join(_path.default.dirname(file), map); + this.root = _path.default.dirname(map); + + if (_fs.default.existsSync && _fs.default.existsSync(map)) { + return _fs.default.readFileSync(map, 'utf-8').toString().trim(); + } else { + return false; + } + } + }; + + _proto.isMap = function isMap(map) { + if (typeof map !== 'object') return false; + return typeof map.mappings === 'string' || typeof map._mappings === 'string'; + }; + + return PreviousMap; +}(); + +var _default = PreviousMap; +exports.default = _default; +module.exports = exports.default; + +}).call(this,require("buffer").Buffer) +},{"buffer":87,"fs":77,"path":645,"source-map":686}],665:[function(require,module,exports){ +(function (process){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _lazyResult = _interopRequireDefault(require("./lazy-result")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} +/** + * Contains plugins to process CSS. Create one `Processor` instance, + * initialize its plugins, and then use that instance on numerous CSS files. + * + * @example + * const processor = postcss([autoprefixer, precss]) + * processor.process(css1).then(result => console.log(result.css)) + * processor.process(css2).then(result => console.log(result.css)) + */ + + +var Processor = /*#__PURE__*/function () { + /** + * @param {Array.|Processor} plugins PostCSS plugins. + * See {@link Processor#use} for plugin format. + */ + function Processor(plugins) { + if (plugins === void 0) { + plugins = []; + } + /** + * Current PostCSS version. + * + * @type {string} + * + * @example + * if (result.processor.version.split('.')[0] !== '6') { + * throw new Error('This plugin works only with PostCSS 6') + * } + */ + + + this.version = '7.0.32'; + /** + * Plugins added to this processor. + * + * @type {pluginFunction[]} + * + * @example + * const processor = postcss([autoprefixer, precss]) + * processor.plugins.length //=> 2 + */ + + this.plugins = this.normalize(plugins); + } + /** + * Adds a plugin to be used as a CSS processor. + * + * PostCSS plugin can be in 4 formats: + * * A plugin created by {@link postcss.plugin} method. + * * A function. PostCSS will pass the function a @{link Root} + * as the first argument and current {@link Result} instance + * as the second. + * * An object with a `postcss` method. PostCSS will use that method + * as described in #2. + * * Another {@link Processor} instance. PostCSS will copy plugins + * from that instance into this one. + * + * Plugins can also be added by passing them as arguments when creating + * a `postcss` instance (see [`postcss(plugins)`]). + * + * Asynchronous plugins should return a `Promise` instance. + * + * @param {Plugin|pluginFunction|Processor} plugin PostCSS plugin + * or {@link Processor} + * with plugins. + * + * @example + * const processor = postcss() + * .use(autoprefixer) + * .use(precss) + * + * @return {Processes} Current processor to make methods chain. + */ + + + var _proto = Processor.prototype; + + _proto.use = function use(plugin) { + this.plugins = this.plugins.concat(this.normalize([plugin])); + return this; + } + /** + * Parses source CSS and returns a {@link LazyResult} Promise proxy. + * Because some plugins can be asynchronous it doesn’t make + * any transformations. Transformations will be applied + * in the {@link LazyResult} methods. + * + * @param {string|toString|Result} css String with input CSS or any object + * with a `toString()` method, + * like a Buffer. Optionally, send + * a {@link Result} instance + * and the processor will take + * the {@link Root} from it. + * @param {processOptions} [opts] Options. + * + * @return {LazyResult} Promise proxy. + * + * @example + * processor.process(css, { from: 'a.css', to: 'a.out.css' }) + * .then(result => { + * console.log(result.css) + * }) + */ + ; + + _proto.process = function (_process) { + function process(_x) { + return _process.apply(this, arguments); + } + + process.toString = function () { + return _process.toString(); + }; + + return process; + }(function (css, opts) { + if (opts === void 0) { + opts = {}; + } + + if (this.plugins.length === 0 && opts.parser === opts.stringifier) { + if (process.env.NODE_ENV !== 'production') { + if (typeof console !== 'undefined' && console.warn) { + console.warn('You did not set any plugins, parser, or stringifier. ' + 'Right now, PostCSS does nothing. Pick plugins for your case ' + 'on https://www.postcss.parts/ and use them in postcss.config.js.'); + } + } + } + + return new _lazyResult.default(this, css, opts); + }); + + _proto.normalize = function normalize(plugins) { + var normalized = []; + + for (var _iterator = plugins, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var i = _ref; + if (i.postcss) i = i.postcss; + + if (typeof i === 'object' && Array.isArray(i.plugins)) { + normalized = normalized.concat(i.plugins); + } else if (typeof i === 'function') { + normalized.push(i); + } else if (typeof i === 'object' && (i.parse || i.stringify)) { + if (process.env.NODE_ENV !== 'production') { + throw new Error('PostCSS syntaxes cannot be used as plugins. Instead, please use ' + 'one of the syntax/parser/stringifier options as outlined ' + 'in your PostCSS runner documentation.'); + } + } else { + throw new Error(i + ' is not a PostCSS plugin'); + } + } + + return normalized; + }; + + return Processor; +}(); + +var _default = Processor; +/** + * @callback builder + * @param {string} part Part of generated CSS connected to this node. + * @param {Node} node AST node. + * @param {"start"|"end"} [type] Node’s part type. + */ + +/** + * @callback parser + * + * @param {string|toString} css String with input CSS or any object + * with toString() method, like a Buffer. + * @param {processOptions} [opts] Options with only `from` and `map` keys. + * + * @return {Root} PostCSS AST + */ + +/** + * @callback stringifier + * + * @param {Node} node Start node for stringifing. Usually {@link Root}. + * @param {builder} builder Function to concatenate CSS from node’s parts + * or generate string and source map. + * + * @return {void} + */ + +/** + * @typedef {object} syntax + * @property {parser} parse Function to generate AST by string. + * @property {stringifier} stringify Function to generate string by AST. + */ + +/** + * @typedef {object} toString + * @property {function} toString + */ + +/** + * @callback pluginFunction + * @param {Root} root Parsed input CSS. + * @param {Result} result Result to set warnings or check other plugins. + */ + +/** + * @typedef {object} Plugin + * @property {function} postcss PostCSS plugin function. + */ + +/** + * @typedef {object} processOptions + * @property {string} from The path of the CSS source file. + * You should always set `from`, + * because it is used in source map + * generation and syntax error messages. + * @property {string} to The path where you’ll put the output + * CSS file. You should always set `to` + * to generate correct source maps. + * @property {parser} parser Function to generate AST by string. + * @property {stringifier} stringifier Class to generate string by AST. + * @property {syntax} syntax Object with `parse` and `stringify`. + * @property {object} map Source map options. + * @property {boolean} map.inline Does source map should + * be embedded in the output + * CSS as a base64-encoded + * comment. + * @property {string|object|false|function} map.prev Source map content + * from a previous + * processing step + * (for example, Sass). + * PostCSS will try to find + * previous map automatically, + * so you could disable it by + * `false` value. + * @property {boolean} map.sourcesContent Does PostCSS should set + * the origin content to map. + * @property {string|false} map.annotation Does PostCSS should set + * annotation comment to map. + * @property {string} map.from Override `from` in map’s + * sources`. + */ + +exports.default = _default; +module.exports = exports.default; + +}).call(this,require('_process')) +},{"./lazy-result":657,"_process":675}],666:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _warning = _interopRequireDefault(require("./warning")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +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); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} +/** + * Provides the result of the PostCSS transformations. + * + * A Result instance is returned by {@link LazyResult#then} + * or {@link Root#toResult} methods. + * + * @example + * postcss([autoprefixer]).process(css).then(result => { + * console.log(result.css) + * }) + * + * @example + * const result2 = postcss.parse(css).toResult() + */ + + +var Result = /*#__PURE__*/function () { + /** + * @param {Processor} processor Processor used for this transformation. + * @param {Root} root Root node after all transformations. + * @param {processOptions} opts Options from the {@link Processor#process} + * or {@link Root#toResult}. + */ + function Result(processor, root, opts) { + /** + * The Processor instance used for this transformation. + * + * @type {Processor} + * + * @example + * for (const plugin of result.processor.plugins) { + * if (plugin.postcssPlugin === 'postcss-bad') { + * throw 'postcss-good is incompatible with postcss-bad' + * } + * }) + */ + this.processor = processor; + /** + * Contains messages from plugins (e.g., warnings or custom messages). + * Each message should have type and plugin properties. + * + * @type {Message[]} + * + * @example + * postcss.plugin('postcss-min-browser', () => { + * return (root, result) => { + * const browsers = detectMinBrowsersByCanIUse(root) + * result.messages.push({ + * type: 'min-browser', + * plugin: 'postcss-min-browser', + * browsers + * }) + * } + * }) + */ + + this.messages = []; + /** + * Root node after all transformations. + * + * @type {Root} + * + * @example + * root.toResult().root === root + */ + + this.root = root; + /** + * Options from the {@link Processor#process} or {@link Root#toResult} call + * that produced this Result instance. + * + * @type {processOptions} + * + * @example + * root.toResult(opts).opts === opts + */ + + this.opts = opts; + /** + * A CSS string representing of {@link Result#root}. + * + * @type {string} + * + * @example + * postcss.parse('a{}').toResult().css //=> "a{}" + */ + + this.css = undefined; + /** + * An instance of `SourceMapGenerator` class from the `source-map` library, + * representing changes to the {@link Result#root} instance. + * + * @type {SourceMapGenerator} + * + * @example + * result.map.toJSON() //=> { version: 3, file: 'a.css', … } + * + * @example + * if (result.map) { + * fs.writeFileSync(result.opts.to + '.map', result.map.toString()) + * } + */ + + this.map = undefined; + } + /** + * Returns for @{link Result#css} content. + * + * @example + * result + '' === result.css + * + * @return {string} String representing of {@link Result#root}. + */ + + + var _proto = Result.prototype; + + _proto.toString = function toString() { + return this.css; + } + /** + * Creates an instance of {@link Warning} and adds it + * to {@link Result#messages}. + * + * @param {string} text Warning message. + * @param {Object} [opts] Warning options. + * @param {Node} opts.node CSS node that caused the warning. + * @param {string} opts.word Word in CSS source that caused the warning. + * @param {number} opts.index Index in CSS node string that caused + * the warning. + * @param {string} opts.plugin Name of the plugin that created + * this warning. {@link Result#warn} fills + * this property automatically. + * + * @return {Warning} Created warning. + */ + ; + + _proto.warn = function warn(text, opts) { + if (opts === void 0) { + opts = {}; + } + + if (!opts.plugin) { + if (this.lastPlugin && this.lastPlugin.postcssPlugin) { + opts.plugin = this.lastPlugin.postcssPlugin; + } + } + + var warning = new _warning.default(text, opts); + this.messages.push(warning); + return warning; + } + /** + * Returns warnings from plugins. Filters {@link Warning} instances + * from {@link Result#messages}. + * + * @example + * result.warnings().forEach(warn => { + * console.warn(warn.toString()) + * }) + * + * @return {Warning[]} Warnings from plugins. + */ + ; + + _proto.warnings = function warnings() { + return this.messages.filter(function (i) { + return i.type === 'warning'; + }); + } + /** + * An alias for the {@link Result#css} property. + * Use it with syntaxes that generate non-CSS output. + * + * @type {string} + * + * @example + * result.css === result.content + */ + ; + + _createClass(Result, [{ + key: "content", + get: function get() { + return this.css; + } + }]); + + return Result; +}(); + +var _default = Result; +/** + * @typedef {object} Message + * @property {string} type Message type. + * @property {string} plugin Source PostCSS plugin name. + */ + +exports.default = _default; +module.exports = exports.default; + +},{"./warning":674}],667:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _container = _interopRequireDefault(require("./container")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} +/** + * Represents a CSS file and contains all its parsed nodes. + * + * @extends Container + * + * @example + * const root = postcss.parse('a{color:black} b{z-index:2}') + * root.type //=> 'root' + * root.nodes.length //=> 2 + */ + + +var Root = /*#__PURE__*/function (_Container) { + _inheritsLoose(Root, _Container); + + function Root(defaults) { + var _this; + + _this = _Container.call(this, defaults) || this; + _this.type = 'root'; + if (!_this.nodes) _this.nodes = []; + return _this; + } + + var _proto = Root.prototype; + + _proto.removeChild = function removeChild(child, ignore) { + var index = this.index(child); + + if (!ignore && index === 0 && this.nodes.length > 1) { + this.nodes[1].raws.before = this.nodes[index].raws.before; + } + + return _Container.prototype.removeChild.call(this, child); + }; + + _proto.normalize = function normalize(child, sample, type) { + var nodes = _Container.prototype.normalize.call(this, child); + + if (sample) { + if (type === 'prepend') { + if (this.nodes.length > 1) { + sample.raws.before = this.nodes[1].raws.before; + } else { + delete sample.raws.before; + } + } else if (this.first !== sample) { + for (var _iterator = nodes, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var node = _ref; + node.raws.before = sample.raws.before; + } + } + } + + return nodes; + } + /** + * Returns a {@link Result} instance representing the root’s CSS. + * + * @param {processOptions} [opts] Options with only `to` and `map` keys. + * + * @return {Result} Result with current root’s CSS. + * + * @example + * const root1 = postcss.parse(css1, { from: 'a.css' }) + * const root2 = postcss.parse(css2, { from: 'b.css' }) + * root1.append(root2) + * const result = root1.toResult({ to: 'all.css', map: true }) + */ + ; + + _proto.toResult = function toResult(opts) { + if (opts === void 0) { + opts = {}; + } + + var LazyResult = require('./lazy-result'); + + var Processor = require('./processor'); + + var lazy = new LazyResult(new Processor(), this, opts); + return lazy.stringify(); + } + /** + * @memberof Root# + * @member {object} raws Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `after`: the space symbols after the last child to the end of file. + * * `semicolon`: is the last child has an (optional) semicolon. + * + * @example + * postcss.parse('a {}\n').raws //=> { after: '\n' } + * postcss.parse('a {}').raws //=> { after: '' } + */ + ; + + return Root; +}(_container.default); + +var _default = Root; +exports.default = _default; +module.exports = exports.default; + +},{"./container":653,"./lazy-result":657,"./processor":665}],668:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _container = _interopRequireDefault(require("./container")); + +var _list = _interopRequireDefault(require("./list")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +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); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} +/** + * Represents a CSS rule: a selector followed by a declaration block. + * + * @extends Container + * + * @example + * const root = postcss.parse('a{}') + * const rule = root.first + * rule.type //=> 'rule' + * rule.toString() //=> 'a{}' + */ + + +var Rule = /*#__PURE__*/function (_Container) { + _inheritsLoose(Rule, _Container); + + function Rule(defaults) { + var _this; + + _this = _Container.call(this, defaults) || this; + _this.type = 'rule'; + if (!_this.nodes) _this.nodes = []; + return _this; + } + /** + * An array containing the rule’s individual selectors. + * Groups of selectors are split at commas. + * + * @type {string[]} + * + * @example + * const root = postcss.parse('a, b { }') + * const rule = root.first + * + * rule.selector //=> 'a, b' + * rule.selectors //=> ['a', 'b'] + * + * rule.selectors = ['a', 'strong'] + * rule.selector //=> 'a, strong' + */ + + + _createClass(Rule, [{ + key: "selectors", + get: function get() { + return _list.default.comma(this.selector); + }, + set: function set(values) { + var match = this.selector ? this.selector.match(/,\s*/) : null; + var sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen'); + this.selector = values.join(sep); + } + /** + * @memberof Rule# + * @member {string} selector The rule’s full selector represented + * as a string. + * + * @example + * const root = postcss.parse('a, b { }') + * const rule = root.first + * rule.selector //=> 'a, b' + */ + + /** + * @memberof Rule# + * @member {object} raws Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `after`: the space symbols after the last child of the node + * to the end of the node. + * * `between`: the symbols between the property and value + * for declarations, selector and `{` for rules, or last parameter + * and `{` for at-rules. + * * `semicolon`: contains `true` if the last child has + * an (optional) semicolon. + * * `ownSemicolon`: contains `true` if there is semicolon after rule. + * + * PostCSS cleans selectors from comments and extra spaces, + * but it stores origin content in raws properties. + * As such, if you don’t change a declaration’s value, + * PostCSS will use the raw value with comments. + * + * @example + * const root = postcss.parse('a {\n color:black\n}') + * root.first.first.raws //=> { before: '', between: ' ', after: '\n' } + */ + + }]); + + return Rule; +}(_container.default); + +var _default = Rule; +exports.default = _default; +module.exports = exports.default; + +},{"./container":653,"./list":658}],669:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; +var DEFAULT_RAW = { + colon: ': ', + indent: ' ', + beforeDecl: '\n', + beforeRule: '\n', + beforeOpen: ' ', + beforeClose: '\n', + beforeComment: '\n', + after: '\n', + emptyBody: '', + commentLeft: ' ', + commentRight: ' ', + semicolon: false +}; + +function capitalize(str) { + return str[0].toUpperCase() + str.slice(1); +} + +var Stringifier = /*#__PURE__*/function () { + function Stringifier(builder) { + this.builder = builder; + } + + var _proto = Stringifier.prototype; + + _proto.stringify = function stringify(node, semicolon) { + this[node.type](node, semicolon); + }; + + _proto.root = function root(node) { + this.body(node); + if (node.raws.after) this.builder(node.raws.after); + }; + + _proto.comment = function comment(node) { + var left = this.raw(node, 'left', 'commentLeft'); + var right = this.raw(node, 'right', 'commentRight'); + this.builder('/*' + left + node.text + right + '*/', node); + }; + + _proto.decl = function decl(node, semicolon) { + var between = this.raw(node, 'between', 'colon'); + var string = node.prop + between + this.rawValue(node, 'value'); + + if (node.important) { + string += node.raws.important || ' !important'; + } + + if (semicolon) string += ';'; + this.builder(string, node); + }; + + _proto.rule = function rule(node) { + this.block(node, this.rawValue(node, 'selector')); + + if (node.raws.ownSemicolon) { + this.builder(node.raws.ownSemicolon, node, 'end'); + } + }; + + _proto.atrule = function atrule(node, semicolon) { + var name = '@' + node.name; + var params = node.params ? this.rawValue(node, 'params') : ''; + + if (typeof node.raws.afterName !== 'undefined') { + name += node.raws.afterName; + } else if (params) { + name += ' '; + } + + if (node.nodes) { + this.block(node, name + params); + } else { + var end = (node.raws.between || '') + (semicolon ? ';' : ''); + this.builder(name + params + end, node); + } + }; + + _proto.body = function body(node) { + var last = node.nodes.length - 1; + + while (last > 0) { + if (node.nodes[last].type !== 'comment') break; + last -= 1; + } + + var semicolon = this.raw(node, 'semicolon'); + + for (var i = 0; i < node.nodes.length; i++) { + var child = node.nodes[i]; + var before = this.raw(child, 'before'); + if (before) this.builder(before); + this.stringify(child, last !== i || semicolon); + } + }; + + _proto.block = function block(node, start) { + var between = this.raw(node, 'between', 'beforeOpen'); + this.builder(start + between + '{', node, 'start'); + var after; + + if (node.nodes && node.nodes.length) { + this.body(node); + after = this.raw(node, 'after'); + } else { + after = this.raw(node, 'after', 'emptyBody'); + } + + if (after) this.builder(after); + this.builder('}', node, 'end'); + }; + + _proto.raw = function raw(node, own, detect) { + var value; + if (!detect) detect = own; // Already had + + if (own) { + value = node.raws[own]; + if (typeof value !== 'undefined') return value; + } + + var parent = node.parent; // Hack for first rule in CSS + + if (detect === 'before') { + if (!parent || parent.type === 'root' && parent.first === node) { + return ''; + } + } // Floating child without parent + + + if (!parent) return DEFAULT_RAW[detect]; // Detect style by other nodes + + var root = node.root(); + if (!root.rawCache) root.rawCache = {}; + + if (typeof root.rawCache[detect] !== 'undefined') { + return root.rawCache[detect]; + } + + if (detect === 'before' || detect === 'after') { + return this.beforeAfter(node, detect); + } else { + var method = 'raw' + capitalize(detect); + + if (this[method]) { + value = this[method](root, node); + } else { + root.walk(function (i) { + value = i.raws[own]; + if (typeof value !== 'undefined') return false; + }); + } + } + + if (typeof value === 'undefined') value = DEFAULT_RAW[detect]; + root.rawCache[detect] = value; + return value; + }; + + _proto.rawSemicolon = function rawSemicolon(root) { + var value; + root.walk(function (i) { + if (i.nodes && i.nodes.length && i.last.type === 'decl') { + value = i.raws.semicolon; + if (typeof value !== 'undefined') return false; + } + }); + return value; + }; + + _proto.rawEmptyBody = function rawEmptyBody(root) { + var value; + root.walk(function (i) { + if (i.nodes && i.nodes.length === 0) { + value = i.raws.after; + if (typeof value !== 'undefined') return false; + } + }); + return value; + }; + + _proto.rawIndent = function rawIndent(root) { + if (root.raws.indent) return root.raws.indent; + var value; + root.walk(function (i) { + var p = i.parent; + + if (p && p !== root && p.parent && p.parent === root) { + if (typeof i.raws.before !== 'undefined') { + var parts = i.raws.before.split('\n'); + value = parts[parts.length - 1]; + value = value.replace(/[^\s]/g, ''); + return false; + } + } + }); + return value; + }; + + _proto.rawBeforeComment = function rawBeforeComment(root, node) { + var value; + root.walkComments(function (i) { + if (typeof i.raws.before !== 'undefined') { + value = i.raws.before; + + if (value.indexOf('\n') !== -1) { + value = value.replace(/[^\n]+$/, ''); + } + + return false; + } + }); + + if (typeof value === 'undefined') { + value = this.raw(node, null, 'beforeDecl'); + } else if (value) { + value = value.replace(/[^\s]/g, ''); + } + + return value; + }; + + _proto.rawBeforeDecl = function rawBeforeDecl(root, node) { + var value; + root.walkDecls(function (i) { + if (typeof i.raws.before !== 'undefined') { + value = i.raws.before; + + if (value.indexOf('\n') !== -1) { + value = value.replace(/[^\n]+$/, ''); + } + + return false; + } + }); + + if (typeof value === 'undefined') { + value = this.raw(node, null, 'beforeRule'); + } else if (value) { + value = value.replace(/[^\s]/g, ''); + } + + return value; + }; + + _proto.rawBeforeRule = function rawBeforeRule(root) { + var value; + root.walk(function (i) { + if (i.nodes && (i.parent !== root || root.first !== i)) { + if (typeof i.raws.before !== 'undefined') { + value = i.raws.before; + + if (value.indexOf('\n') !== -1) { + value = value.replace(/[^\n]+$/, ''); + } + + return false; + } + } + }); + if (value) value = value.replace(/[^\s]/g, ''); + return value; + }; + + _proto.rawBeforeClose = function rawBeforeClose(root) { + var value; + root.walk(function (i) { + if (i.nodes && i.nodes.length > 0) { + if (typeof i.raws.after !== 'undefined') { + value = i.raws.after; + + if (value.indexOf('\n') !== -1) { + value = value.replace(/[^\n]+$/, ''); + } + + return false; + } + } + }); + if (value) value = value.replace(/[^\s]/g, ''); + return value; + }; + + _proto.rawBeforeOpen = function rawBeforeOpen(root) { + var value; + root.walk(function (i) { + if (i.type !== 'decl') { + value = i.raws.between; + if (typeof value !== 'undefined') return false; + } + }); + return value; + }; + + _proto.rawColon = function rawColon(root) { + var value; + root.walkDecls(function (i) { + if (typeof i.raws.between !== 'undefined') { + value = i.raws.between.replace(/[^\s:]/g, ''); + return false; + } + }); + return value; + }; + + _proto.beforeAfter = function beforeAfter(node, detect) { + var value; + + if (node.type === 'decl') { + value = this.raw(node, null, 'beforeDecl'); + } else if (node.type === 'comment') { + value = this.raw(node, null, 'beforeComment'); + } else if (detect === 'before') { + value = this.raw(node, null, 'beforeRule'); + } else { + value = this.raw(node, null, 'beforeClose'); + } + + var buf = node.parent; + var depth = 0; + + while (buf && buf.type !== 'root') { + depth += 1; + buf = buf.parent; + } + + if (value.indexOf('\n') !== -1) { + var indent = this.raw(node, null, 'indent'); + + if (indent.length) { + for (var step = 0; step < depth; step++) { + value += indent; + } + } + } + + return value; + }; + + _proto.rawValue = function rawValue(node, prop) { + var value = node[prop]; + var raw = node.raws[prop]; + + if (raw && raw.value === value) { + return raw.raw; + } + + return value; + }; + + return Stringifier; +}(); + +var _default = Stringifier; +exports.default = _default; +module.exports = exports.default; + +},{}],670:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; + +var _stringifier = _interopRequireDefault(require("./stringifier")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function stringify(node, builder) { + var str = new _stringifier.default(builder); + str.stringify(node); +} + +var _default = stringify; +exports.default = _default; +module.exports = exports.default; + +},{"./stringifier":669}],671:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = tokenizer; +var SINGLE_QUOTE = '\''.charCodeAt(0); +var DOUBLE_QUOTE = '"'.charCodeAt(0); +var BACKSLASH = '\\'.charCodeAt(0); +var SLASH = '/'.charCodeAt(0); +var NEWLINE = '\n'.charCodeAt(0); +var SPACE = ' '.charCodeAt(0); +var FEED = '\f'.charCodeAt(0); +var TAB = '\t'.charCodeAt(0); +var CR = '\r'.charCodeAt(0); +var OPEN_SQUARE = '['.charCodeAt(0); +var CLOSE_SQUARE = ']'.charCodeAt(0); +var OPEN_PARENTHESES = '('.charCodeAt(0); +var CLOSE_PARENTHESES = ')'.charCodeAt(0); +var OPEN_CURLY = '{'.charCodeAt(0); +var CLOSE_CURLY = '}'.charCodeAt(0); +var SEMICOLON = ';'.charCodeAt(0); +var ASTERISK = '*'.charCodeAt(0); +var COLON = ':'.charCodeAt(0); +var AT = '@'.charCodeAt(0); +var RE_AT_END = /[ \n\t\r\f{}()'"\\;/[\]#]/g; +var RE_WORD_END = /[ \n\t\r\f(){}:;@!'"\\\][#]|\/(?=\*)/g; +var RE_BAD_BRACKET = /.[\\/("'\n]/; +var RE_HEX_ESCAPE = /[a-f0-9]/i; + +function tokenizer(input, options) { + if (options === void 0) { + options = {}; + } + + var css = input.css.valueOf(); + var ignore = options.ignoreErrors; + var code, next, quote, lines, last, content, escape; + var nextLine, nextOffset, escaped, escapePos, prev, n, currentToken; + var length = css.length; + var offset = -1; + var line = 1; + var pos = 0; + var buffer = []; + var returned = []; + + function position() { + return pos; + } + + function unclosed(what) { + throw input.error('Unclosed ' + what, line, pos - offset); + } + + function endOfFile() { + return returned.length === 0 && pos >= length; + } + + function nextToken(opts) { + if (returned.length) return returned.pop(); + if (pos >= length) return; + var ignoreUnclosed = opts ? opts.ignoreUnclosed : false; + code = css.charCodeAt(pos); + + if (code === NEWLINE || code === FEED || code === CR && css.charCodeAt(pos + 1) !== NEWLINE) { + offset = pos; + line += 1; + } + + switch (code) { + case NEWLINE: + case SPACE: + case TAB: + case CR: + case FEED: + next = pos; + + do { + next += 1; + code = css.charCodeAt(next); + + if (code === NEWLINE) { + offset = next; + line += 1; + } + } while (code === SPACE || code === NEWLINE || code === TAB || code === CR || code === FEED); + + currentToken = ['space', css.slice(pos, next)]; + pos = next - 1; + break; + + case OPEN_SQUARE: + case CLOSE_SQUARE: + case OPEN_CURLY: + case CLOSE_CURLY: + case COLON: + case SEMICOLON: + case CLOSE_PARENTHESES: + var controlChar = String.fromCharCode(code); + currentToken = [controlChar, controlChar, line, pos - offset]; + break; + + case OPEN_PARENTHESES: + prev = buffer.length ? buffer.pop()[1] : ''; + n = css.charCodeAt(pos + 1); + + if (prev === 'url' && n !== SINGLE_QUOTE && n !== DOUBLE_QUOTE && n !== SPACE && n !== NEWLINE && n !== TAB && n !== FEED && n !== CR) { + next = pos; + + do { + escaped = false; + next = css.indexOf(')', next + 1); + + if (next === -1) { + if (ignore || ignoreUnclosed) { + next = pos; + break; + } else { + unclosed('bracket'); + } + } + + escapePos = next; + + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1; + escaped = !escaped; + } + } while (escaped); + + currentToken = ['brackets', css.slice(pos, next + 1), line, pos - offset, line, next - offset]; + pos = next; + } else { + next = css.indexOf(')', pos + 1); + content = css.slice(pos, next + 1); + + if (next === -1 || RE_BAD_BRACKET.test(content)) { + currentToken = ['(', '(', line, pos - offset]; + } else { + currentToken = ['brackets', content, line, pos - offset, line, next - offset]; + pos = next; + } + } + + break; + + case SINGLE_QUOTE: + case DOUBLE_QUOTE: + quote = code === SINGLE_QUOTE ? '\'' : '"'; + next = pos; + + do { + escaped = false; + next = css.indexOf(quote, next + 1); + + if (next === -1) { + if (ignore || ignoreUnclosed) { + next = pos + 1; + break; + } else { + unclosed('string'); + } + } + + escapePos = next; + + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1; + escaped = !escaped; + } + } while (escaped); + + content = css.slice(pos, next + 1); + lines = content.split('\n'); + last = lines.length - 1; + + if (last > 0) { + nextLine = line + last; + nextOffset = next - lines[last].length; + } else { + nextLine = line; + nextOffset = offset; + } + + currentToken = ['string', css.slice(pos, next + 1), line, pos - offset, nextLine, next - nextOffset]; + offset = nextOffset; + line = nextLine; + pos = next; + break; + + case AT: + RE_AT_END.lastIndex = pos + 1; + RE_AT_END.test(css); + + if (RE_AT_END.lastIndex === 0) { + next = css.length - 1; + } else { + next = RE_AT_END.lastIndex - 2; + } + + currentToken = ['at-word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]; + pos = next; + break; + + case BACKSLASH: + next = pos; + escape = true; + + while (css.charCodeAt(next + 1) === BACKSLASH) { + next += 1; + escape = !escape; + } + + code = css.charCodeAt(next + 1); + + if (escape && code !== SLASH && code !== SPACE && code !== NEWLINE && code !== TAB && code !== CR && code !== FEED) { + next += 1; + + if (RE_HEX_ESCAPE.test(css.charAt(next))) { + while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) { + next += 1; + } + + if (css.charCodeAt(next + 1) === SPACE) { + next += 1; + } + } + } + + currentToken = ['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]; + pos = next; + break; + + default: + if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) { + next = css.indexOf('*/', pos + 2) + 1; + + if (next === 0) { + if (ignore || ignoreUnclosed) { + next = css.length; + } else { + unclosed('comment'); + } + } + + content = css.slice(pos, next + 1); + lines = content.split('\n'); + last = lines.length - 1; + + if (last > 0) { + nextLine = line + last; + nextOffset = next - lines[last].length; + } else { + nextLine = line; + nextOffset = offset; + } + + currentToken = ['comment', content, line, pos - offset, nextLine, next - nextOffset]; + offset = nextOffset; + line = nextLine; + pos = next; + } else { + RE_WORD_END.lastIndex = pos + 1; + RE_WORD_END.test(css); + + if (RE_WORD_END.lastIndex === 0) { + next = css.length - 1; + } else { + next = RE_WORD_END.lastIndex - 2; + } + + currentToken = ['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]; + buffer.push(currentToken); + pos = next; + } + + break; + } + + pos++; + return currentToken; + } + + function back(token) { + returned.push(token); + } + + return { + back: back, + nextToken: nextToken, + endOfFile: endOfFile, + position: position + }; +} + +module.exports = exports.default; + +},{}],672:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; +/** + * Contains helpers for working with vendor prefixes. + * + * @example + * const vendor = postcss.vendor + * + * @namespace vendor + */ + +var vendor = { + /** + * Returns the vendor prefix extracted from an input string. + * + * @param {string} prop String with or without vendor prefix. + * + * @return {string} vendor prefix or empty string + * + * @example + * postcss.vendor.prefix('-moz-tab-size') //=> '-moz-' + * postcss.vendor.prefix('tab-size') //=> '' + */ + prefix: function prefix(prop) { + var match = prop.match(/^(-\w+-)/); + + if (match) { + return match[0]; + } + + return ''; + }, + + /** + * Returns the input string stripped of its vendor prefix. + * + * @param {string} prop String with or without vendor prefix. + * + * @return {string} String name without vendor prefixes. + * + * @example + * postcss.vendor.unprefixed('-moz-tab-size') //=> 'tab-size' + */ + unprefixed: function unprefixed(prop) { + return prop.replace(/^-\w+-/, ''); + } +}; +var _default = vendor; +exports.default = _default; +module.exports = exports.default; + +},{}],673:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = warnOnce; +var printed = {}; + +function warnOnce(message) { + if (printed[message]) return; + printed[message] = true; + + if (typeof console !== 'undefined' && console.warn) { + console.warn(message); + } +} + +module.exports = exports.default; + +},{}],674:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports.default = void 0; +/** + * Represents a plugin’s warning. It can be created using {@link Node#warn}. + * + * @example + * if (decl.important) { + * decl.warn(result, 'Avoid !important', { word: '!important' }) + * } + */ + +var Warning = /*#__PURE__*/function () { + /** + * @param {string} text Warning message. + * @param {Object} [opts] Warning options. + * @param {Node} opts.node CSS node that caused the warning. + * @param {string} opts.word Word in CSS source that caused the warning. + * @param {number} opts.index Index in CSS node string that caused + * the warning. + * @param {string} opts.plugin Name of the plugin that created + * this warning. {@link Result#warn} fills + * this property automatically. + */ + function Warning(text, opts) { + if (opts === void 0) { + opts = {}; + } + /** + * Type to filter warnings from {@link Result#messages}. + * Always equal to `"warning"`. + * + * @type {string} + * + * @example + * const nonWarning = result.messages.filter(i => i.type !== 'warning') + */ + + + this.type = 'warning'; + /** + * The warning message. + * + * @type {string} + * + * @example + * warning.text //=> 'Try to avoid !important' + */ + + this.text = text; + + if (opts.node && opts.node.source) { + var pos = opts.node.positionBy(opts); + /** + * Line in the input file with this warning’s source. + * @type {number} + * + * @example + * warning.line //=> 5 + */ + + this.line = pos.line; + /** + * Column in the input file with this warning’s source. + * + * @type {number} + * + * @example + * warning.column //=> 6 + */ + + this.column = pos.column; + } + + for (var opt in opts) { + this[opt] = opts[opt]; + } + } + /** + * Returns a warning position and message. + * + * @example + * warning.toString() //=> 'postcss-lint:a.css:10:14: Avoid !important' + * + * @return {string} Warning position and message. + */ + + + var _proto = Warning.prototype; + + _proto.toString = function toString() { + if (this.node) { + return this.node.error(this.text, { + plugin: this.plugin, + index: this.index, + word: this.word + }).message; + } + + if (this.plugin) { + return this.plugin + ': ' + this.text; + } + + return this.text; + } + /** + * @memberof Warning# + * @member {string} plugin The name of the plugin that created + * it will fill this property automatically. + * this warning. When you call {@link Node#warn} + * + * @example + * warning.plugin //=> 'postcss-important' + */ + + /** + * @memberof Warning# + * @member {Node} node Contains the CSS node that caused the warning. + * + * @example + * warning.node.toString() //=> 'color: white !important' + */ + ; + + return Warning; +}(); + +var _default = Warning; +exports.default = _default; +module.exports = exports.default; + +},{}],675:[function(require,module,exports){ +"use strict"; + +// shim for using process in browser +var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} + +function defaultClearTimeout() { + throw new Error('clearTimeout has not been defined'); +} + +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +})(); + +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } // if setTimeout wasn't available but was latter defined + + + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } +} + +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } // if clearTimeout wasn't available but was latter defined + + + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } +} + +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + + draining = false; + + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + + var timeout = runTimeout(cleanUpNextTick); + draining = true; + var len = queue.length; + + while (len) { + currentQueue = queue; + queue = []; + + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + + queueIndex = -1; + len = queue.length; + } + + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + + queue.push(new Item(fun, args)); + + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; // v8 likes predictible objects + + +function Item(fun, array) { + this.fun = fun; + this.array = array; +} + +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; + +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues + +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { + return []; +}; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { + return '/'; +}; + +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; + +process.umask = function () { + return 0; +}; + +},{}],676:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var util = require('./util'); + +var has = Object.prototype.hasOwnProperty; +var hasNativeMap = typeof Map !== "undefined"; +/** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + +function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map() : Object.create(null); +} +/** + * Static method for creating ArraySet instances from an existing array. + */ + + +ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + + return set; +}; +/** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ + + +ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; +}; +/** + * Add the given string to this set. + * + * @param String aStr + */ + + +ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } +}; +/** + * Is the given string a member of this set? + * + * @param String aStr + */ + + +ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } +}; +/** + * What is the index of the given string in the array? + * + * @param String aStr + */ + + +ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + + throw new Error('"' + aStr + '" is not in the set.'); +}; +/** + * What is the element at the given index? + * + * @param Number aIdx + */ + + +ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + + throw new Error('No element indexed by ' + aIdx); +}; +/** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + + +ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); +}; + +exports.ArraySet = ArraySet; + +},{"./util":685}],677:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +var base64 = require('./base64'); // A single base 64 digit can contain 6 bits of data. For the base 64 variable +// length quantities we use in the source map spec, the first bit is the sign, +// the next four bits are the actual value, and the 6th bit is the +// continuation bit. The continuation bit tells us whether there are more +// digits in this value following this digit. +// +// Continuation +// | Sign +// | | +// V V +// 101011 + + +var VLQ_BASE_SHIFT = 5; // binary: 100000 + +var VLQ_BASE = 1 << VLQ_BASE_SHIFT; // binary: 011111 + +var VLQ_BASE_MASK = VLQ_BASE - 1; // binary: 100000 + +var VLQ_CONTINUATION_BIT = VLQ_BASE; +/** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + +function toVLQSigned(aValue) { + return aValue < 0 ? (-aValue << 1) + 1 : (aValue << 1) + 0; +} +/** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + + +function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative ? -shifted : shifted; +} +/** + * Returns the base 64 VLQ encoded value. + */ + + +exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; +}; +/** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ + + +exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; +}; + +},{"./base64":678}],678:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); +/** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + +exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + + throw new TypeError("Must be between 0 and 63: " + number); +}; +/** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ + + +exports.decode = function (charCode) { + var bigA = 65; // 'A' + + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + + var littleZ = 122; // 'z' + + var zero = 48; // '0' + + var nine = 57; // '9' + + var plus = 43; // '+' + + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + + if (bigA <= charCode && charCode <= bigZ) { + return charCode - bigA; + } // 26 - 51: abcdefghijklmnopqrstuvwxyz + + + if (littleA <= charCode && charCode <= littleZ) { + return charCode - littleA + littleOffset; + } // 52 - 61: 0123456789 + + + if (zero <= charCode && charCode <= nine) { + return charCode - zero + numberOffset; + } // 62: + + + + if (charCode == plus) { + return 62; + } // 63: / + + + if (charCode == slash) { + return 63; + } // Invalid base64 digit. + + + return -1; +}; + +},{}],679:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.GREATEST_LOWER_BOUND = 1; +exports.LEAST_UPPER_BOUND = 2; +/** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ + +function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + + + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } // we are in termination case (3) or (2) and return the appropriate thing. + + + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } +} +/** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ + + +exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare, aBias || exports.GREATEST_LOWER_BOUND); + + if (index < 0) { + return -1; + } // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + + + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + + --index; + } + + return index; +}; + +},{}],680:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var util = require('./util'); +/** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ + + +function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; +} +/** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ + + +function MappingList() { + this._array = []; + this._sorted = true; // Serves as infimum + + this._last = { + generatedLine: -1, + generatedColumn: 0 + }; +} +/** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ + + +MappingList.prototype.unsortedForEach = function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); +}; +/** + * Add the given source mapping. + * + * @param Object aMapping + */ + + +MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + + this._array.push(aMapping); + } else { + this._sorted = false; + + this._array.push(aMapping); + } +}; +/** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ + + +MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + + this._sorted = true; + } + + return this._array; +}; + +exports.MappingList = MappingList; + +},{"./util":685}],681:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +// It turns out that some (most?) JavaScript engines don't self-host +// `Array.prototype.sort`. This makes sense because C++ will likely remain +// faster than JS when doing raw CPU-intensive sorting. However, when using a +// custom comparator function, calling back and forth between the VM's C++ and +// JIT'd JS is rather slow *and* loses JIT type information, resulting in +// worse generated code for the comparator function than would be optimal. In +// fact, when sorting with a comparator, these costs outweigh the benefits of +// sorting in C++. By using our own JS-implemented Quick Sort (below), we get +// a ~3500ms mean speed-up in `bench/bench.html`. + +/** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ +function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; +} +/** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ + + +function randomIntInRange(low, high) { + return Math.round(low + Math.random() * (high - low)); +} +/** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ + + +function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + swap(ary, pivotIndex, r); + var pivot = ary[r]; // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } +} +/** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ + + +exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); +}; + +},{}],682:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var util = require('./util'); + +var binarySearch = require('./binary-search'); + +var ArraySet = require('./array-set').ArraySet; + +var base64VLQ = require('./base64-vlq'); + +var quickSort = require('./quick-sort').quickSort; + +function SourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + return sourceMap.sections != null ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) : new BasicSourceMapConsumer(sourceMap, aSourceMapURL); +} + +SourceMapConsumer.fromSourceMap = function (aSourceMap, aSourceMapURL) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL); +}; +/** + * The version of the source mapping spec that we are consuming. + */ + + +SourceMapConsumer.prototype._version = 3; // `__generatedMappings` and `__originalMappings` are arrays that hold the +// parsed mapping coordinates from the source map's "mappings" attribute. They +// are lazily instantiated, accessed via the `_generatedMappings` and +// `_originalMappings` getters respectively, and we only parse the mappings +// and create these arrays once queried for a source location. We jump through +// these hoops because there can be many thousands of mappings, and parsing +// them is expensive, so we only want to do it if we must. +// +// Each object in the arrays is of the form: +// +// { +// generatedLine: The line number in the generated code, +// generatedColumn: The column number in the generated code, +// source: The path to the original source file that generated this +// chunk of code, +// originalLine: The line number in the original source that +// corresponds to this chunk of generated code, +// originalColumn: The column number in the original source that +// corresponds to this chunk of generated code, +// name: The name of the original symbol which generated this chunk of +// code. +// } +// +// All properties except for `generatedLine` and `generatedColumn` can be +// `null`. +// +// `_generatedMappings` is ordered by the generated positions. +// +// `_originalMappings` is ordered by the original positions. + +SourceMapConsumer.prototype.__generatedMappings = null; +Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + configurable: true, + enumerable: true, + get: function get() { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } +}); +SourceMapConsumer.prototype.__originalMappings = null; +Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + configurable: true, + enumerable: true, + get: function get() { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } +}); + +SourceMapConsumer.prototype._charIsMappingSeparator = function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; +}; +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + + +SourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); +}; + +SourceMapConsumer.GENERATED_ORDER = 1; +SourceMapConsumer.ORIGINAL_ORDER = 2; +SourceMapConsumer.GREATEST_LOWER_BOUND = 1; +SourceMapConsumer.LEAST_UPPER_BOUND = 2; +/** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + +SourceMapConsumer.prototype.eachMapping = function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + var mappings; + + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL); + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); +}; +/** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number is 1-based. + * - column: Optional. the column number in the original source. + * The column number is 0-based. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + + +SourceMapConsumer.prototype.allGeneratedPositionsFor = function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + needle.source = this._findSourceIndex(needle.source); + + if (needle.source < 0) { + return []; + } + + var mappings = []; + + var index = this._findMapping(needle, this._originalMappings, "originalLine", "originalColumn", util.compareByOriginalPositions, binarySearch.LEAST_UPPER_BOUND); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + + while (mapping && mapping.originalLine === line && mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; +}; + +exports.SourceMapConsumer = SourceMapConsumer; +/** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The first parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + +function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + if (sourceRoot) { + sourceRoot = util.normalize(sourceRoot); + } + + sources = sources.map(String) // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) ? util.relative(sourceRoot, source) : source; + }); // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + this._absoluteSources = this._sources.toArray().map(function (s) { + return util.computeSourceURL(sourceRoot, s, aSourceMapURL); + }); + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this._sourceMapURL = aSourceMapURL; + this.file = file; +} + +BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); +BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; +/** + * Utility function to find the index of a source. Returns -1 if not + * found. + */ + +BasicSourceMapConsumer.prototype._findSourceIndex = function (aSource) { + var relativeSource = aSource; + + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + + if (this._sources.has(relativeSource)) { + return this._sources.indexOf(relativeSource); + } // Maybe aSource is an absolute URL as returned by |sources|. In + // this case we can't simply undo the transform. + + + var i; + + for (i = 0; i < this._absoluteSources.length; ++i) { + if (this._absoluteSources[i] == aSource) { + return i; + } + } + + return -1; +}; +/** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @param String aSourceMapURL + * The URL at which the source map can be found (optional) + * @returns BasicSourceMapConsumer + */ + + +BasicSourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), smc.sourceRoot); + smc.file = aSourceMap._file; + smc._sourceMapURL = aSourceMapURL; + smc._absoluteSources = smc._sources.toArray().map(function (s) { + return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL); + }); // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping(); + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + return smc; +}; +/** + * The version of the source mapping spec that we are consuming. + */ + + +BasicSourceMapConsumer.prototype._version = 3; +/** + * The list of original sources. + */ + +Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function get() { + return this._absoluteSources.slice(); + } +}); +/** + * Provide the JIT with a nice shape / hidden class. + */ + +function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; +} +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + + +BasicSourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } else if (aStr.charAt(index) === ',') { + index++; + } else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + + str = aStr.slice(index, end); + segment = cachedSegments[str]; + + if (segment) { + index += str.length; + } else { + segment = []; + + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } // Generated column. + + + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; // Original line. + + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; // Lines are stored 0-based + + mapping.originalLine += 1; // Original column. + + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; +}; +/** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + + +BasicSourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + aNeedle[aLineName]); + } + + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); +}; +/** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + + +BasicSourceMapConsumer.prototype.computeColumnSpans = function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } // The last mapping for each line spans the entire line. + + + mapping.lastGeneratedColumn = Infinity; + } +}; +/** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + + +BasicSourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping(needle, this._generatedMappings, "generatedLine", "generatedColumn", util.compareByGeneratedPositionsDeflated, util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + + if (source !== null) { + source = this._sources.at(source); + source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL); + } + + var name = util.getArg(mapping, 'name', null); + + if (name !== null) { + name = this._names.at(name); + } + + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; +}; +/** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + + +BasicSourceMapConsumer.prototype.hasContentsOfAllSources = function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + + return this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function (sc) { + return sc == null; + }); +}; +/** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + + +BasicSourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + var index = this._findSourceIndex(aSource); + + if (index >= 0) { + return this.sourcesContent[index]; + } + + var relativeSource = aSource; + + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + + var url; + + if (this.sourceRoot != null && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = relativeSource.replace(/^file:\/\//, ""); + + if (url.scheme == "file" && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]; + } + + if ((!url.path || url.path == "/") && this._sources.has("/" + relativeSource)) { + return this.sourcesContent[this._sources.indexOf("/" + relativeSource)]; + } + } // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + + + if (nullOnMissing) { + return null; + } else { + throw new Error('"' + relativeSource + '" is not in the SourceMap.'); + } +}; +/** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + + +BasicSourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + source = this._findSourceIndex(source); + + if (source < 0) { + return { + line: null, + column: null, + lastColumn: null + }; + } + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping(needle, this._originalMappings, "originalLine", "originalColumn", util.compareByOriginalPositions, util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; +}; + +exports.BasicSourceMapConsumer = BasicSourceMapConsumer; +/** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The first parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ + +function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || offsetLine === lastOffset.line && offsetColumn < lastOffset.column) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + + lastOffset = offset; + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL) + }; + }); +} + +IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); +IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; +/** + * The version of the source mapping spec that we are consuming. + */ + +IndexedSourceMapConsumer.prototype._version = 3; +/** + * The list of original sources. + */ + +Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function get() { + var sources = []; + + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + + return sources; + } +}); +/** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + +IndexedSourceMapConsumer.prototype.originalPositionFor = function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; // Find the section containing the generated position we're trying to map + // to an original position. + + var sectionIndex = binarySearch.search(needle, this._sections, function (needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + + if (cmp) { + return cmp; + } + + return needle.generatedColumn - section.generatedOffset.generatedColumn; + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - (section.generatedOffset.generatedLine === needle.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), + bias: aArgs.bias + }); +}; +/** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + + +IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); +}; +/** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + + +IndexedSourceMapConsumer.prototype.sourceContentFor = function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var content = section.consumer.sourceContentFor(aSource, true); + + if (content) { + return content; + } + } + + if (nullOnMissing) { + return null; + } else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } +}; +/** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + + +IndexedSourceMapConsumer.prototype.generatedPositionFor = function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; // Only consider this section if the requested source is in the list of + // sources of the consumer. + + if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) { + continue; + } + + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + + if (generatedPosition) { + var ret = { + line: generatedPosition.line + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + (section.generatedOffset.generatedLine === generatedPosition.line ? section.generatedOffset.generatedColumn - 1 : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; +}; +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + + +IndexedSourceMapConsumer.prototype._parseMappings = function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + + source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL); + + this._sources.add(source); + + source = this._sources.indexOf(source); + var name = null; + + if (mapping.name) { + name = section.consumer._names.at(mapping.name); + + this._names.add(name); + + name = this._names.indexOf(name); + } // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + + + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + (section.generatedOffset.generatedLine === mapping.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); +}; + +exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + +},{"./array-set":676,"./base64-vlq":677,"./binary-search":679,"./quick-sort":681,"./util":685}],683:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var base64VLQ = require('./base64-vlq'); + +var util = require('./util'); + +var ArraySet = require('./array-set').ArraySet; + +var MappingList = require('./mapping-list').MappingList; +/** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ + + +function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; +} + +SourceMapGenerator.prototype._version = 3; +/** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + +SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var sourceRelative = sourceFile; + + if (sourceRoot !== null) { + sourceRelative = util.relative(sourceRoot, sourceFile); + } + + if (!generator._sources.has(sourceRelative)) { + generator._sources.add(sourceRelative); + } + + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; +}; +/** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + + +SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); +}; +/** + * Set the source content for a source file. + */ + + +SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } +}; +/** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ + + +SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; // If aSourceFile is omitted, we will use the file property of the SourceMap + + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + 'or the source map\'s "file" property. Both were omitted.'); + } + + sourceFile = aSourceMapConsumer.file; + } + + var sourceRoot = this._sourceRoot; // Make "sourceFile" relative if an absolute Url is passed. + + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } // Applying the SourceMap can add and remove items from the sources and + // the names array. + + + var newSources = new ArraySet(); + var newNames = new ArraySet(); // Find mappings for the "sourceFile" + + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source); + } + + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + }, this); + + this._sources = newSources; + this._names = newNames; // Copy sourcesContents of applied map. + + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + + this.setSourceContent(sourceFile, content); + } + }, this); +}; +/** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + + +SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, aName) { + // When aOriginal is truthy but has empty values for .line and .column, + // it is most likely a programmer error. In this case we throw a very + // specific error message to try to guide them the right way. + // For example: https://github.com/Polymer/polymer-bundler/pull/519 + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error('original.line and original.column are not numbers -- you probably meant to omit ' + 'the original mapping entirely and only map the generated position. If so, pass ' + 'null for the original mapping instead of an object with empty or null values.'); + } + + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aGenerated.line > 0 && aGenerated.column >= 0 && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aOriginal && 'line' in aOriginal && 'column' in aOriginal && aGenerated.line > 0 && aGenerated.column >= 0 && aOriginal.line > 0 && aOriginal.column >= 0 && aSource) { + // Cases 2 and 3. + return; + } else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } +}; +/** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + + +SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = ''; + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; // lines are stored 0-based in SourceMap spec version 3 + + next += base64VLQ.encode(mapping.originalLine - 1 - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + next += base64VLQ.encode(mapping.originalColumn - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; +}; + +SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) ? this._sourcesContents[key] : null; + }, this); +}; +/** + * Externalize the source map. + */ + + +SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + + if (this._file != null) { + map.file = this._file; + } + + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; +}; +/** + * Render the source map being generated to a string. + */ + + +SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); +}; + +exports.SourceMapGenerator = SourceMapGenerator; + +},{"./array-set":676,"./base64-vlq":677,"./mapping-list":680,"./util":685}],684:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ +var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; + +var util = require('./util'); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other +// operating systems these days (capturing the result). + + +var REGEX_NEWLINE = /(\r?\n)/; // Newline character code for charCodeAt() comparisons + +var NEWLINE_CODE = 10; // Private symbol for identifying `SourceNode`s when multiple versions of +// the source-map library are loaded. This MUST NOT CHANGE across +// versions! + +var isSourceNode = "$$$isSourceNode$$$"; +/** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + +function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); +} +/** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ + + +SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are accessed by calling `shiftNextLine`. + + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + + var shiftNextLine = function shiftNextLine() { + var lineContents = getNextLine(); // The last line of a file might not have a newline. + + var newLine = getNextLine() || ""; + return lineContents + newLine; + + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? remainingLines[remainingLinesIndex++] : undefined; + } + }; // We need to remember the position of "remainingLines" + + + var lastGeneratedLine = 1, + lastGeneratedColumn = 0; // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + + var lastMapping = null; + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[remainingLinesIndex] || ''; + var code = nextLine.substr(0, mapping.generatedColumn - lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); // No more remaining code, continue + + lastMapping = mapping; + return; + } + } // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + + + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex] || ''; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + + lastMapping = mapping; + }, this); // We have processed all mappings. + + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } // and add the remaining lines without any mapping + + + node.add(remainingLines.splice(remainingLinesIndex).join("")); + } // Copy sourcesContent into SourceNode + + + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + + node.setSourceContent(sourceFile, content); + } + }); + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath ? util.join(aRelativePath, mapping.source) : mapping.source; + node.add(new SourceNode(mapping.originalLine, mapping.originalColumn, source, code, mapping.name)); + } + } +}; +/** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + + +SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } else { + throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk); + } + + return this; +}; +/** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + + +SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length - 1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } else { + throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk); + } + + return this; +}; +/** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + + +SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } else { + if (chunk !== '') { + aFn(chunk, { + source: this.source, + line: this.line, + column: this.column, + name: this.name + }); + } + } + } +}; +/** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + + +SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + + if (len > 0) { + newChildren = []; + + for (i = 0; i < len - 1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + + newChildren.push(this.children[i]); + this.children = newChildren; + } + + return this; +}; +/** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + + +SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } else { + this.children.push(''.replace(aPattern, aReplacement)); + } + + return this; +}; +/** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + + +SourceNode.prototype.setSourceContent = function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; +}; +/** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + + +SourceNode.prototype.walkSourceContents = function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } +}; +/** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + + +SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; +}; +/** + * Returns the string representation of this source node along with a source + * map. + */ + + +SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + + if (original.source !== null && original.line !== null && original.column !== null) { + if (lastOriginalSource !== original.source || lastOriginalLine !== original.line || lastOriginalColumn !== original.column || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; // Mappings end at eol + + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + return { + code: generated.code, + map: map + }; +}; + +exports.SourceNode = SourceNode; + +},{"./source-map-generator":683,"./util":685}],685:[function(require,module,exports){ +"use strict"; + +/* -*- Mode: js; js-indent-level: 2; -*- */ + +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ +function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } +} + +exports.getArg = getArg; +var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; +var dataUrlRegexp = /^data:.+\,.+$/; + +function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + + if (!match) { + return null; + } + + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; +} + +exports.urlParse = urlParse; + +function urlGenerate(aParsedUrl) { + var url = ''; + + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + + url += '//'; + + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port; + } + + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + + return url; +} + +exports.urlGenerate = urlGenerate; +/** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ + +function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + + if (url) { + if (!url.path) { + return aPath; + } + + path = url.path; + } + + var isAbsolute = exports.isAbsolute(path); + var parts = path.split(/\/+/); + + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + + return path; +} + +exports.normalize = normalize; +/** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ + +function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + if (aPath === "") { + aPath = "."; + } + + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } // `join(foo, '//www.example.org')` + + + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } // `join('http://', 'www.example.com')` + + + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' ? aPath : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + + return joined; +} + +exports.join = join; + +exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || urlRegexp.test(aPath); +}; +/** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ + + +function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + + var level = 0; + + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + + if (index < 0) { + return aPath; + } // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + + + aRoot = aRoot.slice(0, index); + + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } // Make sure we add a "../" for each component we removed from the root. + + + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); +} + +exports.relative = relative; + +var supportsNullProto = function () { + var obj = Object.create(null); + return !('__proto__' in obj); +}(); + +function identity(s) { + return s; +} +/** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + + +function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; +} + +exports.toSetString = supportsNullProto ? identity : toSetString; + +function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; +} + +exports.fromSetString = supportsNullProto ? identity : fromSetString; + +function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 + /* "__proto__".length */ + ) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 + /* '_' */ + || s.charCodeAt(length - 2) !== 95 + /* '_' */ + || s.charCodeAt(length - 3) !== 111 + /* 'o' */ + || s.charCodeAt(length - 4) !== 116 + /* 't' */ + || s.charCodeAt(length - 5) !== 111 + /* 'o' */ + || s.charCodeAt(length - 6) !== 114 + /* 'r' */ + || s.charCodeAt(length - 7) !== 112 + /* 'p' */ + || s.charCodeAt(length - 8) !== 95 + /* '_' */ + || s.charCodeAt(length - 9) !== 95 + /* '_' */ + ) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 + /* '$' */ + ) { + return false; + } + } + + return true; +} +/** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + + +function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = strcmp(mappingA.source, mappingB.source); + + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); +} + +exports.compareByOriginalPositions = compareByOriginalPositions; +/** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + +function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); +} + +exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + +function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 === null) { + return 1; // aStr2 !== null + } + + if (aStr2 === null) { + return -1; // aStr1 !== null + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; +} +/** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ + + +function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); +} + +exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; +/** + * Strip any JSON XSSI avoidance prefix from the string (as documented + * in the source maps specification), and then parse the string as + * JSON. + */ + +function parseSourceMapInput(str) { + return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, '')); +} + +exports.parseSourceMapInput = parseSourceMapInput; +/** + * Compute the URL of a source given the the source root, the source's + * URL, and the source map's URL. + */ + +function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { + sourceURL = sourceURL || ''; + + if (sourceRoot) { + // This follows what Chrome does. + if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') { + sourceRoot += '/'; + } // The spec says: + // Line 4: An optional source root, useful for relocating source + // files on a server or removing repeated values in the + // “sources” entry. This value is prepended to the individual + // entries in the “source” field. + + + sourceURL = sourceRoot + sourceURL; + } // Historically, SourceMapConsumer did not take the sourceMapURL as + // a parameter. This mode is still somewhat supported, which is why + // this code block is conditional. However, it's preferable to pass + // the source map URL to SourceMapConsumer, so that this function + // can implement the source URL resolution algorithm as outlined in + // the spec. This block is basically the equivalent of: + // new URL(sourceURL, sourceMapURL).toString() + // ... except it avoids using URL, which wasn't available in the + // older releases of node still supported by this library. + // + // The spec says: + // If the sources are not absolute URLs after prepending of the + // “sourceRoot”, the sources are resolved relative to the + // SourceMap (like resolving script src in a html document). + + + if (sourceMapURL) { + var parsed = urlParse(sourceMapURL); + + if (!parsed) { + throw new Error("sourceMapURL could not be parsed"); + } + + if (parsed.path) { + // Strip the last path component, but keep the "/". + var index = parsed.path.lastIndexOf('/'); + + if (index >= 0) { + parsed.path = parsed.path.substring(0, index + 1); + } + } + + sourceURL = join(urlGenerate(parsed), sourceURL); + } + + return normalize(sourceURL); +} + +exports.computeSourceURL = computeSourceURL; + +},{}],686:[function(require,module,exports){ +"use strict"; + +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./lib/source-node').SourceNode; + +},{"./lib/source-map-consumer":682,"./lib/source-map-generator":683,"./lib/source-node":684}]},{},[3])(3) +}); diff --git a/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/LICENSE new file mode 100644 index 000000000000..35f79f571afb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2010 Joshua Peek + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/README.md b/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/README.md new file mode 100644 index 000000000000..a76e8e2b87eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/README.md @@ -0,0 +1,43 @@ +Ruby CoffeeScript +================= + +Ruby CoffeeScript is a bridge to the official CoffeeScript compiler. + + CoffeeScript.compile File.read("script.coffee") + + +Installation +------------ + + gem install coffee-script + +*Note: This compiler library has replaced the original CoffeeScript + compiler that was written in Ruby.* + + +Dependencies +------------ + +This library depends on the `coffee-script-source` gem which is +updated any time a new version of CoffeeScript is released. (The +`coffee-script-source` gem's version number is synced with each +official CoffeeScript release.) This way you can build against +different versions of CoffeeScript by requiring the correct version of +the `coffee-script-source` gem. + +In addition, you can use this library with unreleased versions of +CoffeeScript by setting the `COFFEESCRIPT_SOURCE_PATH` environment +variable: + + export COFFEESCRIPT_SOURCE_PATH=/path/to/coffee-script/extras/coffee-script.js + +### JSON + +The `json` library is also required but is not explicitly stated as a +gem dependency. If you're on Ruby 1.8 you'll need to install the +`json` or `json_pure` gem. On Ruby 1.9, `json` is included in the +standard library. + +### ExecJS + +The [ExecJS](https://github.com/sstephenson/execjs) library is used to automatically choose the best JavaScript engine for your platform. Check out its [README](https://github.com/sstephenson/execjs/blob/master/README.md) for a complete list of supported engines. diff --git a/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/lib/coffee-script.rb b/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/lib/coffee-script.rb new file mode 100644 index 000000000000..a8186cfd731c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/lib/coffee-script.rb @@ -0,0 +1 @@ +require 'coffee_script' diff --git a/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/lib/coffee_script.rb b/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/lib/coffee_script.rb new file mode 100644 index 000000000000..072a00f16051 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/coffee-script-2.4.1/lib/coffee_script.rb @@ -0,0 +1,81 @@ +require 'execjs' +require 'coffee_script/source' + +module CoffeeScript + Error = ExecJS::Error + EngineError = ExecJS::RuntimeError + CompilationError = ExecJS::ProgramError + + module Source + def self.path + @path ||= ENV['COFFEESCRIPT_SOURCE_PATH'] || bundled_path + end + + def self.path=(path) + @contents = @version = @bare_option = @context = nil + @path = path + end + + COMPILE_FUNCTION_SOURCE = <<-JS + ;function compile(script, options) { + try { + return CoffeeScript.compile(script, options); + } catch (err) { + if (err instanceof SyntaxError && err.location) { + throw new SyntaxError([ + err.filename || "[stdin]", + err.location.first_line + 1, + err.location.first_column + 1 + ].join(":") + ": " + err.message) + } else { + throw err; + } + } + } + JS + + def self.contents + @contents ||= File.read(path) + COMPILE_FUNCTION_SOURCE + end + + def self.version + @version ||= contents[/CoffeeScript Compiler v([\d.]+)/, 1] + end + + def self.bare_option + @bare_option ||= contents.match(/noWrap/) ? 'noWrap' : 'bare' + end + + def self.context + @context ||= ExecJS.compile(contents) + end + end + + class << self + def engine + end + + def engine=(engine) + end + + def version + Source.version + end + + # Compile a script (String or IO) to JavaScript. + def compile(script, options = {}) + script = script.read if script.respond_to?(:read) + + if options.key?(:bare) + elsif options.key?(:no_wrap) + options[:bare] = options[:no_wrap] + else + options[:bare] = false + end + + # Stringify keys + options = options.inject({}) { |h, (k, v)| h[k.to_s] = v; h } + Source.context.call("compile", script, options) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/coffee-script-source-1.11.1/lib/coffee_script/coffee-script.js b/vendor/bundler/ruby/2.5.0/gems/coffee-script-source-1.11.1/lib/coffee_script/coffee-script.js new file mode 100644 index 000000000000..2341c6475b1e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/coffee-script-source-1.11.1/lib/coffee_script/coffee-script.js @@ -0,0 +1,7403 @@ +/** + * CoffeeScript Compiler v1.11.1 + * http://coffeescript.org + * + * Copyright 2011, Jeremy Ashkenas + * Released under the MIT License + */ +(function(root) { + var CoffeeScript = function() { + function require(path){ return require[path]; } + require['./helpers'] = (function() { + var exports = {}, module = {exports: exports}; + // Generated by CoffeeScript 1.11.1 +(function() { + var buildLocationData, extend, flatten, ref, repeat, syntaxErrorToString; + + exports.starts = function(string, literal, start) { + return literal === string.substr(start, literal.length); + }; + + exports.ends = function(string, literal, back) { + var len; + len = literal.length; + return literal === string.substr(string.length - len - (back || 0), len); + }; + + exports.repeat = repeat = function(str, n) { + var res; + res = ''; + while (n > 0) { + if (n & 1) { + res += str; + } + n >>>= 1; + str += str; + } + return res; + }; + + exports.compact = function(array) { + var i, item, len1, results; + results = []; + for (i = 0, len1 = array.length; i < len1; i++) { + item = array[i]; + if (item) { + results.push(item); + } + } + return results; + }; + + exports.count = function(string, substr) { + var num, pos; + num = pos = 0; + if (!substr.length) { + return 1 / 0; + } + while (pos = 1 + string.indexOf(substr, pos)) { + num++; + } + return num; + }; + + exports.merge = function(options, overrides) { + return extend(extend({}, options), overrides); + }; + + extend = exports.extend = function(object, properties) { + var key, val; + for (key in properties) { + val = properties[key]; + object[key] = val; + } + return object; + }; + + exports.flatten = flatten = function(array) { + var element, flattened, i, len1; + flattened = []; + for (i = 0, len1 = array.length; i < len1; i++) { + element = array[i]; + if ('[object Array]' === Object.prototype.toString.call(element)) { + flattened = flattened.concat(flatten(element)); + } else { + flattened.push(element); + } + } + return flattened; + }; + + exports.del = function(obj, key) { + var val; + val = obj[key]; + delete obj[key]; + return val; + }; + + exports.some = (ref = Array.prototype.some) != null ? ref : function(fn) { + var e, i, len1, ref1; + ref1 = this; + for (i = 0, len1 = ref1.length; i < len1; i++) { + e = ref1[i]; + if (fn(e)) { + return true; + } + } + return false; + }; + + exports.invertLiterate = function(code) { + var line, lines, maybe_code; + maybe_code = true; + lines = (function() { + var i, len1, ref1, results; + ref1 = code.split('\n'); + results = []; + for (i = 0, len1 = ref1.length; i < len1; i++) { + line = ref1[i]; + if (maybe_code && /^([ ]{4}|[ ]{0,3}\t)/.test(line)) { + results.push(line); + } else if (maybe_code = /^\s*$/.test(line)) { + results.push(line); + } else { + results.push('# ' + line); + } + } + return results; + })(); + return lines.join('\n'); + }; + + buildLocationData = function(first, last) { + if (!last) { + return first; + } else { + return { + first_line: first.first_line, + first_column: first.first_column, + last_line: last.last_line, + last_column: last.last_column + }; + } + }; + + exports.addLocationDataFn = function(first, last) { + return function(obj) { + if (((typeof obj) === 'object') && (!!obj['updateLocationDataIfMissing'])) { + obj.updateLocationDataIfMissing(buildLocationData(first, last)); + } + return obj; + }; + }; + + exports.locationDataToString = function(obj) { + var locationData; + if (("2" in obj) && ("first_line" in obj[2])) { + locationData = obj[2]; + } else if ("first_line" in obj) { + locationData = obj; + } + if (locationData) { + return ((locationData.first_line + 1) + ":" + (locationData.first_column + 1) + "-") + ((locationData.last_line + 1) + ":" + (locationData.last_column + 1)); + } else { + return "No location data"; + } + }; + + exports.baseFileName = function(file, stripExt, useWinPathSep) { + var parts, pathSep; + if (stripExt == null) { + stripExt = false; + } + if (useWinPathSep == null) { + useWinPathSep = false; + } + pathSep = useWinPathSep ? /\\|\// : /\//; + parts = file.split(pathSep); + file = parts[parts.length - 1]; + if (!(stripExt && file.indexOf('.') >= 0)) { + return file; + } + parts = file.split('.'); + parts.pop(); + if (parts[parts.length - 1] === 'coffee' && parts.length > 1) { + parts.pop(); + } + return parts.join('.'); + }; + + exports.isCoffee = function(file) { + return /\.((lit)?coffee|coffee\.md)$/.test(file); + }; + + exports.isLiterate = function(file) { + return /\.(litcoffee|coffee\.md)$/.test(file); + }; + + exports.throwSyntaxError = function(message, location) { + var error; + error = new SyntaxError(message); + error.location = location; + error.toString = syntaxErrorToString; + error.stack = error.toString(); + throw error; + }; + + exports.updateSyntaxError = function(error, code, filename) { + if (error.toString === syntaxErrorToString) { + error.code || (error.code = code); + error.filename || (error.filename = filename); + error.stack = error.toString(); + } + return error; + }; + + syntaxErrorToString = function() { + var codeLine, colorize, colorsEnabled, end, filename, first_column, first_line, last_column, last_line, marker, ref1, ref2, ref3, ref4, start; + if (!(this.code && this.location)) { + return Error.prototype.toString.call(this); + } + ref1 = this.location, first_line = ref1.first_line, first_column = ref1.first_column, last_line = ref1.last_line, last_column = ref1.last_column; + if (last_line == null) { + last_line = first_line; + } + if (last_column == null) { + last_column = first_column; + } + filename = this.filename || '[stdin]'; + codeLine = this.code.split('\n')[first_line]; + start = first_column; + end = first_line === last_line ? last_column + 1 : codeLine.length; + marker = codeLine.slice(0, start).replace(/[^\s]/g, ' ') + repeat('^', end - start); + if (typeof process !== "undefined" && process !== null) { + colorsEnabled = ((ref2 = process.stdout) != null ? ref2.isTTY : void 0) && !((ref3 = process.env) != null ? ref3.NODE_DISABLE_COLORS : void 0); + } + if ((ref4 = this.colorful) != null ? ref4 : colorsEnabled) { + colorize = function(str) { + return "\x1B[1;31m" + str + "\x1B[0m"; + }; + codeLine = codeLine.slice(0, start) + colorize(codeLine.slice(start, end)) + codeLine.slice(end); + marker = colorize(marker); + } + return filename + ":" + (first_line + 1) + ":" + (first_column + 1) + ": error: " + this.message + "\n" + codeLine + "\n" + marker; + }; + + exports.nameWhitespaceCharacter = function(string) { + switch (string) { + case ' ': + return 'space'; + case '\n': + return 'newline'; + case '\r': + return 'carriage return'; + case '\t': + return 'tab'; + default: + return string; + } + }; + +}).call(this); + + return module.exports; +})();require['./rewriter'] = (function() { + var exports = {}, module = {exports: exports}; + // Generated by CoffeeScript 1.11.1 +(function() { + var BALANCED_PAIRS, CALL_CLOSERS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, generate, k, left, len, ref, rite, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + slice = [].slice; + + generate = function(tag, value, origin) { + var tok; + tok = [tag, value]; + tok.generated = true; + if (origin) { + tok.origin = origin; + } + return tok; + }; + + exports.Rewriter = (function() { + function Rewriter() {} + + Rewriter.prototype.rewrite = function(tokens1) { + this.tokens = tokens1; + this.removeLeadingNewlines(); + this.closeOpenCalls(); + this.closeOpenIndexes(); + this.normalizeLines(); + this.tagPostfixConditionals(); + this.addImplicitBracesAndParens(); + this.addLocationDataToGeneratedTokens(); + return this.tokens; + }; + + Rewriter.prototype.scanTokens = function(block) { + var i, token, tokens; + tokens = this.tokens; + i = 0; + while (token = tokens[i]) { + i += block.call(this, token, i, tokens); + } + return true; + }; + + Rewriter.prototype.detectEnd = function(i, condition, action) { + var levels, ref, ref1, token, tokens; + tokens = this.tokens; + levels = 0; + while (token = tokens[i]) { + if (levels === 0 && condition.call(this, token, i)) { + return action.call(this, token, i); + } + if (!token || levels < 0) { + return action.call(this, token, i - 1); + } + if (ref = token[0], indexOf.call(EXPRESSION_START, ref) >= 0) { + levels += 1; + } else if (ref1 = token[0], indexOf.call(EXPRESSION_END, ref1) >= 0) { + levels -= 1; + } + i += 1; + } + return i - 1; + }; + + Rewriter.prototype.removeLeadingNewlines = function() { + var i, k, len, ref, tag; + ref = this.tokens; + for (i = k = 0, len = ref.length; k < len; i = ++k) { + tag = ref[i][0]; + if (tag !== 'TERMINATOR') { + break; + } + } + if (i) { + return this.tokens.splice(0, i); + } + }; + + Rewriter.prototype.closeOpenCalls = function() { + var action, condition; + condition = function(token, i) { + var ref; + return ((ref = token[0]) === ')' || ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')'; + }; + action = function(token, i) { + return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END'; + }; + return this.scanTokens(function(token, i) { + if (token[0] === 'CALL_START') { + this.detectEnd(i + 1, condition, action); + } + return 1; + }); + }; + + Rewriter.prototype.closeOpenIndexes = function() { + var action, condition; + condition = function(token, i) { + var ref; + return (ref = token[0]) === ']' || ref === 'INDEX_END'; + }; + action = function(token, i) { + return token[0] = 'INDEX_END'; + }; + return this.scanTokens(function(token, i) { + if (token[0] === 'INDEX_START') { + this.detectEnd(i + 1, condition, action); + } + return 1; + }); + }; + + Rewriter.prototype.indexOfTag = function() { + var fuzz, i, j, k, pattern, ref, ref1; + i = arguments[0], pattern = 2 <= arguments.length ? slice.call(arguments, 1) : []; + fuzz = 0; + for (j = k = 0, ref = pattern.length; 0 <= ref ? k < ref : k > ref; j = 0 <= ref ? ++k : --k) { + while (this.tag(i + j + fuzz) === 'HERECOMMENT') { + fuzz += 2; + } + if (pattern[j] == null) { + continue; + } + if (typeof pattern[j] === 'string') { + pattern[j] = [pattern[j]]; + } + if (ref1 = this.tag(i + j + fuzz), indexOf.call(pattern[j], ref1) < 0) { + return -1; + } + } + return i + j + fuzz - 1; + }; + + Rewriter.prototype.looksObjectish = function(j) { + var end, index; + if (this.indexOfTag(j, '@', null, ':') > -1 || this.indexOfTag(j, null, ':') > -1) { + return true; + } + index = this.indexOfTag(j, EXPRESSION_START); + if (index > -1) { + end = null; + this.detectEnd(index + 1, (function(token) { + var ref; + return ref = token[0], indexOf.call(EXPRESSION_END, ref) >= 0; + }), (function(token, i) { + return end = i; + })); + if (this.tag(end + 1) === ':') { + return true; + } + } + return false; + }; + + Rewriter.prototype.findTagsBackwards = function(i, tags) { + var backStack, ref, ref1, ref2, ref3, ref4, ref5; + backStack = []; + while (i >= 0 && (backStack.length || (ref2 = this.tag(i), indexOf.call(tags, ref2) < 0) && ((ref3 = this.tag(i), indexOf.call(EXPRESSION_START, ref3) < 0) || this.tokens[i].generated) && (ref4 = this.tag(i), indexOf.call(LINEBREAKS, ref4) < 0))) { + if (ref = this.tag(i), indexOf.call(EXPRESSION_END, ref) >= 0) { + backStack.push(this.tag(i)); + } + if ((ref1 = this.tag(i), indexOf.call(EXPRESSION_START, ref1) >= 0) && backStack.length) { + backStack.pop(); + } + i -= 1; + } + return ref5 = this.tag(i), indexOf.call(tags, ref5) >= 0; + }; + + Rewriter.prototype.addImplicitBracesAndParens = function() { + var stack, start; + stack = []; + start = null; + return this.scanTokens(function(token, i, tokens) { + var endImplicitCall, endImplicitObject, forward, inImplicit, inImplicitCall, inImplicitControl, inImplicitObject, newLine, nextTag, offset, prevTag, prevToken, ref, ref1, ref2, ref3, ref4, ref5, s, sameLine, stackIdx, stackTag, stackTop, startIdx, startImplicitCall, startImplicitObject, startsLine, tag; + tag = token[0]; + prevTag = (prevToken = i > 0 ? tokens[i - 1] : [])[0]; + nextTag = (i < tokens.length - 1 ? tokens[i + 1] : [])[0]; + stackTop = function() { + return stack[stack.length - 1]; + }; + startIdx = i; + forward = function(n) { + return i - startIdx + n; + }; + inImplicit = function() { + var ref, ref1; + return (ref = stackTop()) != null ? (ref1 = ref[2]) != null ? ref1.ours : void 0 : void 0; + }; + inImplicitCall = function() { + var ref; + return inImplicit() && ((ref = stackTop()) != null ? ref[0] : void 0) === '('; + }; + inImplicitObject = function() { + var ref; + return inImplicit() && ((ref = stackTop()) != null ? ref[0] : void 0) === '{'; + }; + inImplicitControl = function() { + var ref; + return inImplicit && ((ref = stackTop()) != null ? ref[0] : void 0) === 'CONTROL'; + }; + startImplicitCall = function(j) { + var idx; + idx = j != null ? j : i; + stack.push([ + '(', idx, { + ours: true + } + ]); + tokens.splice(idx, 0, generate('CALL_START', '(')); + if (j == null) { + return i += 1; + } + }; + endImplicitCall = function() { + stack.pop(); + tokens.splice(i, 0, generate('CALL_END', ')', ['', 'end of input', token[2]])); + return i += 1; + }; + startImplicitObject = function(j, startsLine) { + var idx, val; + if (startsLine == null) { + startsLine = true; + } + idx = j != null ? j : i; + stack.push([ + '{', idx, { + sameLine: true, + startsLine: startsLine, + ours: true + } + ]); + val = new String('{'); + val.generated = true; + tokens.splice(idx, 0, generate('{', val, token)); + if (j == null) { + return i += 1; + } + }; + endImplicitObject = function(j) { + j = j != null ? j : i; + stack.pop(); + tokens.splice(j, 0, generate('}', '}', token)); + return i += 1; + }; + if (inImplicitCall() && (tag === 'IF' || tag === 'TRY' || tag === 'FINALLY' || tag === 'CATCH' || tag === 'CLASS' || tag === 'SWITCH')) { + stack.push([ + 'CONTROL', i, { + ours: true + } + ]); + return forward(1); + } + if (tag === 'INDENT' && inImplicit()) { + if (prevTag !== '=>' && prevTag !== '->' && prevTag !== '[' && prevTag !== '(' && prevTag !== ',' && prevTag !== '{' && prevTag !== 'TRY' && prevTag !== 'ELSE' && prevTag !== '=') { + while (inImplicitCall()) { + endImplicitCall(); + } + } + if (inImplicitControl()) { + stack.pop(); + } + stack.push([tag, i]); + return forward(1); + } + if (indexOf.call(EXPRESSION_START, tag) >= 0) { + stack.push([tag, i]); + return forward(1); + } + if (indexOf.call(EXPRESSION_END, tag) >= 0) { + while (inImplicit()) { + if (inImplicitCall()) { + endImplicitCall(); + } else if (inImplicitObject()) { + endImplicitObject(); + } else { + stack.pop(); + } + } + start = stack.pop(); + } + if ((indexOf.call(IMPLICIT_FUNC, tag) >= 0 && token.spaced || tag === '?' && i > 0 && !tokens[i - 1].spaced) && (indexOf.call(IMPLICIT_CALL, nextTag) >= 0 || indexOf.call(IMPLICIT_UNSPACED_CALL, nextTag) >= 0 && !((ref = tokens[i + 1]) != null ? ref.spaced : void 0) && !((ref1 = tokens[i + 1]) != null ? ref1.newLine : void 0))) { + if (tag === '?') { + tag = token[0] = 'FUNC_EXIST'; + } + startImplicitCall(i + 1); + return forward(2); + } + if (indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.indexOfTag(i + 1, 'INDENT') > -1 && this.looksObjectish(i + 2) && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) { + startImplicitCall(i + 1); + stack.push(['INDENT', i + 2]); + return forward(3); + } + if (tag === ':') { + s = (function() { + var ref2; + switch (false) { + case ref2 = this.tag(i - 1), indexOf.call(EXPRESSION_END, ref2) < 0: + return start[1]; + case this.tag(i - 2) !== '@': + return i - 2; + default: + return i - 1; + } + }).call(this); + while (this.tag(s - 2) === 'HERECOMMENT') { + s -= 2; + } + this.insideForDeclaration = nextTag === 'FOR'; + startsLine = s === 0 || (ref2 = this.tag(s - 1), indexOf.call(LINEBREAKS, ref2) >= 0) || tokens[s - 1].newLine; + if (stackTop()) { + ref3 = stackTop(), stackTag = ref3[0], stackIdx = ref3[1]; + if ((stackTag === '{' || stackTag === 'INDENT' && this.tag(stackIdx - 1) === '{') && (startsLine || this.tag(s - 1) === ',' || this.tag(s - 1) === '{')) { + return forward(1); + } + } + startImplicitObject(s, !!startsLine); + return forward(2); + } + if (inImplicitObject() && indexOf.call(LINEBREAKS, tag) >= 0) { + stackTop()[2].sameLine = false; + } + newLine = prevTag === 'OUTDENT' || prevToken.newLine; + if (indexOf.call(IMPLICIT_END, tag) >= 0 || indexOf.call(CALL_CLOSERS, tag) >= 0 && newLine) { + while (inImplicit()) { + ref4 = stackTop(), stackTag = ref4[0], stackIdx = ref4[1], (ref5 = ref4[2], sameLine = ref5.sameLine, startsLine = ref5.startsLine); + if (inImplicitCall() && prevTag !== ',') { + endImplicitCall(); + } else if (inImplicitObject() && !this.insideForDeclaration && sameLine && tag !== 'TERMINATOR' && prevTag !== ':') { + endImplicitObject(); + } else if (inImplicitObject() && tag === 'TERMINATOR' && prevTag !== ',' && !(startsLine && this.looksObjectish(i + 1))) { + if (nextTag === 'HERECOMMENT') { + return forward(1); + } + endImplicitObject(); + } else { + break; + } + } + } + if (tag === ',' && !this.looksObjectish(i + 1) && inImplicitObject() && !this.insideForDeclaration && (nextTag !== 'TERMINATOR' || !this.looksObjectish(i + 2))) { + offset = nextTag === 'OUTDENT' ? 1 : 0; + while (inImplicitObject()) { + endImplicitObject(i + offset); + } + } + return forward(1); + }); + }; + + Rewriter.prototype.addLocationDataToGeneratedTokens = function() { + return this.scanTokens(function(token, i, tokens) { + var column, line, nextLocation, prevLocation, ref, ref1; + if (token[2]) { + return 1; + } + if (!(token.generated || token.explicit)) { + return 1; + } + if (token[0] === '{' && (nextLocation = (ref = tokens[i + 1]) != null ? ref[2] : void 0)) { + line = nextLocation.first_line, column = nextLocation.first_column; + } else if (prevLocation = (ref1 = tokens[i - 1]) != null ? ref1[2] : void 0) { + line = prevLocation.last_line, column = prevLocation.last_column; + } else { + line = column = 0; + } + token[2] = { + first_line: line, + first_column: column, + last_line: line, + last_column: column + }; + return 1; + }); + }; + + Rewriter.prototype.normalizeLines = function() { + var action, condition, indent, outdent, starter; + starter = indent = outdent = null; + condition = function(token, i) { + var ref, ref1, ref2, ref3; + return token[1] !== ';' && (ref = token[0], indexOf.call(SINGLE_CLOSERS, ref) >= 0) && !(token[0] === 'TERMINATOR' && (ref1 = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref1) >= 0)) && !(token[0] === 'ELSE' && starter !== 'THEN') && !(((ref2 = token[0]) === 'CATCH' || ref2 === 'FINALLY') && (starter === '->' || starter === '=>')) || (ref3 = token[0], indexOf.call(CALL_CLOSERS, ref3) >= 0) && this.tokens[i - 1].newLine; + }; + action = function(token, i) { + return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent); + }; + return this.scanTokens(function(token, i, tokens) { + var j, k, ref, ref1, ref2, tag; + tag = token[0]; + if (tag === 'TERMINATOR') { + if (this.tag(i + 1) === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') { + tokens.splice.apply(tokens, [i, 1].concat(slice.call(this.indentation()))); + return 1; + } + if (ref = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref) >= 0) { + tokens.splice(i, 1); + return 0; + } + } + if (tag === 'CATCH') { + for (j = k = 1; k <= 2; j = ++k) { + if (!((ref1 = this.tag(i + j)) === 'OUTDENT' || ref1 === 'TERMINATOR' || ref1 === 'FINALLY')) { + continue; + } + tokens.splice.apply(tokens, [i + j, 0].concat(slice.call(this.indentation()))); + return 2 + j; + } + } + if (indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) { + starter = tag; + ref2 = this.indentation(tokens[i]), indent = ref2[0], outdent = ref2[1]; + if (starter === 'THEN') { + indent.fromThen = true; + } + tokens.splice(i + 1, 0, indent); + this.detectEnd(i + 2, condition, action); + if (tag === 'THEN') { + tokens.splice(i, 1); + } + return 1; + } + return 1; + }); + }; + + Rewriter.prototype.tagPostfixConditionals = function() { + var action, condition, original; + original = null; + condition = function(token, i) { + var prevTag, tag; + tag = token[0]; + prevTag = this.tokens[i - 1][0]; + return tag === 'TERMINATOR' || (tag === 'INDENT' && indexOf.call(SINGLE_LINERS, prevTag) < 0); + }; + action = function(token, i) { + if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) { + return original[0] = 'POST_' + original[0]; + } + }; + return this.scanTokens(function(token, i) { + if (token[0] !== 'IF') { + return 1; + } + original = token; + this.detectEnd(i + 1, condition, action); + return 1; + }); + }; + + Rewriter.prototype.indentation = function(origin) { + var indent, outdent; + indent = ['INDENT', 2]; + outdent = ['OUTDENT', 2]; + if (origin) { + indent.generated = outdent.generated = true; + indent.origin = outdent.origin = origin; + } else { + indent.explicit = outdent.explicit = true; + } + return [indent, outdent]; + }; + + Rewriter.prototype.generate = generate; + + Rewriter.prototype.tag = function(i) { + var ref; + return (ref = this.tokens[i]) != null ? ref[0] : void 0; + }; + + return Rewriter; + + })(); + + BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END'], ['STRING_START', 'STRING_END'], ['REGEX_START', 'REGEX_END']]; + + exports.INVERSES = INVERSES = {}; + + EXPRESSION_START = []; + + EXPRESSION_END = []; + + for (k = 0, len = BALANCED_PAIRS.length; k < len; k++) { + ref = BALANCED_PAIRS[k], left = ref[0], rite = ref[1]; + EXPRESSION_START.push(INVERSES[rite] = left); + EXPRESSION_END.push(INVERSES[left] = rite); + } + + EXPRESSION_CLOSE = ['CATCH', 'THEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END); + + IMPLICIT_FUNC = ['IDENTIFIER', 'PROPERTY', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']; + + IMPLICIT_CALL = ['IDENTIFIER', 'PROPERTY', 'NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_START', 'REGEX', 'REGEX_START', 'JS', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'UNDEFINED', 'NULL', 'BOOL', 'UNARY', 'YIELD', 'UNARY_MATH', 'SUPER', 'THROW', '@', '->', '=>', '[', '(', '{', '--', '++']; + + IMPLICIT_UNSPACED_CALL = ['+', '-']; + + IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR']; + + SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']; + + SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']; + + LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT']; + + CALL_CLOSERS = ['.', '?.', '::', '?::']; + +}).call(this); + + return module.exports; +})();require['./lexer'] = (function() { + var exports = {}, module = {exports: exports}; + // Generated by CoffeeScript 1.11.1 +(function() { + var BOM, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HERECOMMENT_ILLEGAL, HEREDOC_DOUBLE, HEREDOC_INDENT, HEREDOC_SINGLE, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDENTABLE_CLOSERS, INDEXABLE, INVALID_ESCAPE, INVERSES, JSTOKEN, JS_KEYWORDS, LEADING_BLANK_LINE, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTI_DENT, NOT_REGEX, NUMBER, OPERATOR, POSSIBLY_DIVISION, REGEX, REGEX_FLAGS, REGEX_ILLEGAL, RELATION, RESERVED, Rewriter, SHIFT, SIMPLE_STRING_OMIT, STRICT_PROSCRIBED, STRING_DOUBLE, STRING_OMIT, STRING_SINGLE, STRING_START, TRAILING_BLANK_LINE, TRAILING_SPACES, UNARY, UNARY_MATH, VALID_FLAGS, WHITESPACE, compact, count, invertLiterate, isUnassignable, key, locationDataToString, ref, ref1, repeat, starts, throwSyntaxError, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + slice = [].slice; + + ref = require('./rewriter'), Rewriter = ref.Rewriter, INVERSES = ref.INVERSES; + + ref1 = require('./helpers'), count = ref1.count, starts = ref1.starts, compact = ref1.compact, repeat = ref1.repeat, invertLiterate = ref1.invertLiterate, locationDataToString = ref1.locationDataToString, throwSyntaxError = ref1.throwSyntaxError; + + exports.Lexer = Lexer = (function() { + function Lexer() {} + + Lexer.prototype.tokenize = function(code, opts) { + var consumed, end, i, ref2; + if (opts == null) { + opts = {}; + } + this.literate = opts.literate; + this.indent = 0; + this.baseIndent = 0; + this.indebt = 0; + this.outdebt = 0; + this.indents = []; + this.ends = []; + this.tokens = []; + this.seenFor = false; + this.seenImport = false; + this.seenExport = false; + this.chunkLine = opts.line || 0; + this.chunkColumn = opts.column || 0; + code = this.clean(code); + i = 0; + while (this.chunk = code.slice(i)) { + consumed = this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken(); + ref2 = this.getLineAndColumnFromChunk(consumed), this.chunkLine = ref2[0], this.chunkColumn = ref2[1]; + i += consumed; + if (opts.untilBalanced && this.ends.length === 0) { + return { + tokens: this.tokens, + index: i + }; + } + } + this.closeIndentation(); + if (end = this.ends.pop()) { + this.error("missing " + end.tag, end.origin[2]); + } + if (opts.rewrite === false) { + return this.tokens; + } + return (new Rewriter).rewrite(this.tokens); + }; + + Lexer.prototype.clean = function(code) { + if (code.charCodeAt(0) === BOM) { + code = code.slice(1); + } + code = code.replace(/\r/g, '').replace(TRAILING_SPACES, ''); + if (WHITESPACE.test(code)) { + code = "\n" + code; + this.chunkLine--; + } + if (this.literate) { + code = invertLiterate(code); + } + return code; + }; + + Lexer.prototype.identifierToken = function() { + var alias, colon, colonOffset, id, idLength, input, match, poppedToken, prev, ref2, ref3, ref4, ref5, tag, tagToken; + if (!(match = IDENTIFIER.exec(this.chunk))) { + return 0; + } + input = match[0], id = match[1], colon = match[2]; + idLength = id.length; + poppedToken = void 0; + if (id === 'own' && this.tag() === 'FOR') { + this.token('OWN', id); + return id.length; + } + if (id === 'from' && this.tag() === 'YIELD') { + this.token('FROM', id); + return id.length; + } + if (id === 'as' && this.seenImport && (this.tag() === 'IDENTIFIER' || this.value() === '*')) { + if (this.value() === '*') { + this.tokens[this.tokens.length - 1][0] = 'IMPORT_ALL'; + } + this.token('AS', id); + return id.length; + } + if (id === 'as' && this.seenExport && this.tag() === 'IDENTIFIER') { + this.token('AS', id); + return id.length; + } + if (id === 'default' && this.seenExport) { + this.token('DEFAULT', id); + return id.length; + } + ref2 = this.tokens, prev = ref2[ref2.length - 1]; + tag = colon || (prev != null) && (((ref3 = prev[0]) === '.' || ref3 === '?.' || ref3 === '::' || ref3 === '?::') || !prev.spaced && prev[0] === '@') ? 'PROPERTY' : 'IDENTIFIER'; + if (tag === 'IDENTIFIER' && (indexOf.call(JS_KEYWORDS, id) >= 0 || indexOf.call(COFFEE_KEYWORDS, id) >= 0)) { + tag = id.toUpperCase(); + if (tag === 'WHEN' && (ref4 = this.tag(), indexOf.call(LINE_BREAK, ref4) >= 0)) { + tag = 'LEADING_WHEN'; + } else if (tag === 'FOR') { + this.seenFor = true; + } else if (tag === 'UNLESS') { + tag = 'IF'; + } else if (tag === 'IMPORT') { + this.seenImport = true; + } else if (tag === 'EXPORT') { + this.seenExport = true; + } else if (indexOf.call(UNARY, tag) >= 0) { + tag = 'UNARY'; + } else if (indexOf.call(RELATION, tag) >= 0) { + if (tag !== 'INSTANCEOF' && this.seenFor) { + tag = 'FOR' + tag; + this.seenFor = false; + } else { + tag = 'RELATION'; + if (this.value() === '!') { + poppedToken = this.tokens.pop(); + id = '!' + id; + } + } + } + } + if (tag === 'IDENTIFIER' && indexOf.call(RESERVED, id) >= 0) { + this.error("reserved word '" + id + "'", { + length: id.length + }); + } + if (tag !== 'PROPERTY') { + if (indexOf.call(COFFEE_ALIASES, id) >= 0) { + alias = id; + id = COFFEE_ALIAS_MAP[id]; + } + tag = (function() { + switch (id) { + case '!': + return 'UNARY'; + case '==': + case '!=': + return 'COMPARE'; + case '&&': + case '||': + return 'LOGIC'; + case 'true': + case 'false': + return 'BOOL'; + case 'break': + case 'continue': + case 'debugger': + return 'STATEMENT'; + default: + return tag; + } + })(); + } + tagToken = this.token(tag, id, 0, idLength); + if (alias) { + tagToken.origin = [tag, alias, tagToken[2]]; + } + if (poppedToken) { + ref5 = [poppedToken[2].first_line, poppedToken[2].first_column], tagToken[2].first_line = ref5[0], tagToken[2].first_column = ref5[1]; + } + if (colon) { + colonOffset = input.lastIndexOf(':'); + this.token(':', ':', colonOffset, colon.length); + } + return input.length; + }; + + Lexer.prototype.numberToken = function() { + var base, lexedLength, match, number, numberValue, ref2, tag; + if (!(match = NUMBER.exec(this.chunk))) { + return 0; + } + number = match[0]; + lexedLength = number.length; + switch (false) { + case !/^0[BOX]/.test(number): + this.error("radix prefix in '" + number + "' must be lowercase", { + offset: 1 + }); + break; + case !/^(?!0x).*E/.test(number): + this.error("exponential notation in '" + number + "' must be indicated with a lowercase 'e'", { + offset: number.indexOf('E') + }); + break; + case !/^0\d*[89]/.test(number): + this.error("decimal literal '" + number + "' must not be prefixed with '0'", { + length: lexedLength + }); + break; + case !/^0\d+/.test(number): + this.error("octal literal '" + number + "' must be prefixed with '0o'", { + length: lexedLength + }); + } + base = (function() { + switch (number.charAt(1)) { + case 'b': + return 2; + case 'o': + return 8; + case 'x': + return 16; + default: + return null; + } + })(); + numberValue = base != null ? parseInt(number.slice(2), base) : parseFloat(number); + if ((ref2 = number.charAt(1)) === 'b' || ref2 === 'o') { + number = "0x" + (numberValue.toString(16)); + } + tag = numberValue === 2e308 ? 'INFINITY' : 'NUMBER'; + this.token(tag, number, 0, lexedLength); + return lexedLength; + }; + + Lexer.prototype.stringToken = function() { + var $, attempt, delimiter, doc, end, heredoc, i, indent, indentRegex, match, quote, ref2, ref3, regex, token, tokens; + quote = (STRING_START.exec(this.chunk) || [])[0]; + if (!quote) { + return 0; + } + if (this.tokens.length && this.value() === 'from' && (this.seenImport || this.seenExport)) { + this.tokens[this.tokens.length - 1][0] = 'FROM'; + } + regex = (function() { + switch (quote) { + case "'": + return STRING_SINGLE; + case '"': + return STRING_DOUBLE; + case "'''": + return HEREDOC_SINGLE; + case '"""': + return HEREDOC_DOUBLE; + } + })(); + heredoc = quote.length === 3; + ref2 = this.matchWithInterpolations(regex, quote), tokens = ref2.tokens, end = ref2.index; + $ = tokens.length - 1; + delimiter = quote.charAt(0); + if (heredoc) { + indent = null; + doc = ((function() { + var j, len, results; + results = []; + for (i = j = 0, len = tokens.length; j < len; i = ++j) { + token = tokens[i]; + if (token[0] === 'NEOSTRING') { + results.push(token[1]); + } + } + return results; + })()).join('#{}'); + while (match = HEREDOC_INDENT.exec(doc)) { + attempt = match[1]; + if (indent === null || (0 < (ref3 = attempt.length) && ref3 < indent.length)) { + indent = attempt; + } + } + if (indent) { + indentRegex = RegExp("\\n" + indent, "g"); + } + this.mergeInterpolationTokens(tokens, { + delimiter: delimiter + }, (function(_this) { + return function(value, i) { + value = _this.formatString(value); + if (indentRegex) { + value = value.replace(indentRegex, '\n'); + } + if (i === 0) { + value = value.replace(LEADING_BLANK_LINE, ''); + } + if (i === $) { + value = value.replace(TRAILING_BLANK_LINE, ''); + } + return value; + }; + })(this)); + } else { + this.mergeInterpolationTokens(tokens, { + delimiter: delimiter + }, (function(_this) { + return function(value, i) { + value = _this.formatString(value); + value = value.replace(SIMPLE_STRING_OMIT, function(match, offset) { + if ((i === 0 && offset === 0) || (i === $ && offset + match.length === value.length)) { + return ''; + } else { + return ' '; + } + }); + return value; + }; + })(this)); + } + return end; + }; + + Lexer.prototype.commentToken = function() { + var comment, here, match; + if (!(match = this.chunk.match(COMMENT))) { + return 0; + } + comment = match[0], here = match[1]; + if (here) { + if (match = HERECOMMENT_ILLEGAL.exec(comment)) { + this.error("block comments cannot contain " + match[0], { + offset: match.index, + length: match[0].length + }); + } + if (here.indexOf('\n') >= 0) { + here = here.replace(RegExp("\\n" + (repeat(' ', this.indent)), "g"), '\n'); + } + this.token('HERECOMMENT', here, 0, comment.length); + } + return comment.length; + }; + + Lexer.prototype.jsToken = function() { + var match, script; + if (!(this.chunk.charAt(0) === '`' && (match = JSTOKEN.exec(this.chunk)))) { + return 0; + } + this.token('JS', (script = match[0]).slice(1, -1), 0, script.length); + return script.length; + }; + + Lexer.prototype.regexToken = function() { + var body, closed, end, flags, index, match, origin, prev, ref2, ref3, ref4, regex, tokens; + switch (false) { + case !(match = REGEX_ILLEGAL.exec(this.chunk)): + this.error("regular expressions cannot begin with " + match[2], { + offset: match.index + match[1].length + }); + break; + case !(match = this.matchWithInterpolations(HEREGEX, '///')): + tokens = match.tokens, index = match.index; + break; + case !(match = REGEX.exec(this.chunk)): + regex = match[0], body = match[1], closed = match[2]; + this.validateEscapes(body, { + isRegex: true, + offsetInChunk: 1 + }); + index = regex.length; + ref2 = this.tokens, prev = ref2[ref2.length - 1]; + if (prev) { + if (prev.spaced && (ref3 = prev[0], indexOf.call(CALLABLE, ref3) >= 0)) { + if (!closed || POSSIBLY_DIVISION.test(regex)) { + return 0; + } + } else if (ref4 = prev[0], indexOf.call(NOT_REGEX, ref4) >= 0) { + return 0; + } + } + if (!closed) { + this.error('missing / (unclosed regex)'); + } + break; + default: + return 0; + } + flags = REGEX_FLAGS.exec(this.chunk.slice(index))[0]; + end = index + flags.length; + origin = this.makeToken('REGEX', null, 0, end); + switch (false) { + case !!VALID_FLAGS.test(flags): + this.error("invalid regular expression flags " + flags, { + offset: index, + length: flags.length + }); + break; + case !(regex || tokens.length === 1): + if (body == null) { + body = this.formatHeregex(tokens[0][1]); + } + this.token('REGEX', "" + (this.makeDelimitedLiteral(body, { + delimiter: '/' + })) + flags, 0, end, origin); + break; + default: + this.token('REGEX_START', '(', 0, 0, origin); + this.token('IDENTIFIER', 'RegExp', 0, 0); + this.token('CALL_START', '(', 0, 0); + this.mergeInterpolationTokens(tokens, { + delimiter: '"', + double: true + }, this.formatHeregex); + if (flags) { + this.token(',', ',', index, 0); + this.token('STRING', '"' + flags + '"', index, flags.length); + } + this.token(')', ')', end, 0); + this.token('REGEX_END', ')', end, 0); + } + return end; + }; + + Lexer.prototype.lineToken = function() { + var diff, indent, match, noNewlines, size; + if (!(match = MULTI_DENT.exec(this.chunk))) { + return 0; + } + indent = match[0]; + this.seenFor = false; + size = indent.length - 1 - indent.lastIndexOf('\n'); + noNewlines = this.unfinished(); + if (size - this.indebt === this.indent) { + if (noNewlines) { + this.suppressNewlines(); + } else { + this.newlineToken(0); + } + return indent.length; + } + if (size > this.indent) { + if (noNewlines) { + this.indebt = size - this.indent; + this.suppressNewlines(); + return indent.length; + } + if (!this.tokens.length) { + this.baseIndent = this.indent = size; + return indent.length; + } + diff = size - this.indent + this.outdebt; + this.token('INDENT', diff, indent.length - size, size); + this.indents.push(diff); + this.ends.push({ + tag: 'OUTDENT' + }); + this.outdebt = this.indebt = 0; + this.indent = size; + } else if (size < this.baseIndent) { + this.error('missing indentation', { + offset: indent.length + }); + } else { + this.indebt = 0; + this.outdentToken(this.indent - size, noNewlines, indent.length); + } + return indent.length; + }; + + Lexer.prototype.outdentToken = function(moveOut, noNewlines, outdentLength) { + var decreasedIndent, dent, lastIndent, ref2; + decreasedIndent = this.indent - moveOut; + while (moveOut > 0) { + lastIndent = this.indents[this.indents.length - 1]; + if (!lastIndent) { + moveOut = 0; + } else if (lastIndent === this.outdebt) { + moveOut -= this.outdebt; + this.outdebt = 0; + } else if (lastIndent < this.outdebt) { + this.outdebt -= lastIndent; + moveOut -= lastIndent; + } else { + dent = this.indents.pop() + this.outdebt; + if (outdentLength && (ref2 = this.chunk[outdentLength], indexOf.call(INDENTABLE_CLOSERS, ref2) >= 0)) { + decreasedIndent -= dent - moveOut; + moveOut = dent; + } + this.outdebt = 0; + this.pair('OUTDENT'); + this.token('OUTDENT', moveOut, 0, outdentLength); + moveOut -= dent; + } + } + if (dent) { + this.outdebt -= moveOut; + } + while (this.value() === ';') { + this.tokens.pop(); + } + if (!(this.tag() === 'TERMINATOR' || noNewlines)) { + this.token('TERMINATOR', '\n', outdentLength, 0); + } + this.indent = decreasedIndent; + return this; + }; + + Lexer.prototype.whitespaceToken = function() { + var match, nline, prev, ref2; + if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\n'))) { + return 0; + } + ref2 = this.tokens, prev = ref2[ref2.length - 1]; + if (prev) { + prev[match ? 'spaced' : 'newLine'] = true; + } + if (match) { + return match[0].length; + } else { + return 0; + } + }; + + Lexer.prototype.newlineToken = function(offset) { + while (this.value() === ';') { + this.tokens.pop(); + } + if (this.tag() !== 'TERMINATOR') { + this.token('TERMINATOR', '\n', offset, 0); + } + return this; + }; + + Lexer.prototype.suppressNewlines = function() { + if (this.value() === '\\') { + this.tokens.pop(); + } + return this; + }; + + Lexer.prototype.literalToken = function() { + var match, message, origin, prev, ref2, ref3, ref4, ref5, ref6, skipToken, tag, token, value; + if (match = OPERATOR.exec(this.chunk)) { + value = match[0]; + if (CODE.test(value)) { + this.tagParameters(); + } + } else { + value = this.chunk.charAt(0); + } + tag = value; + ref2 = this.tokens, prev = ref2[ref2.length - 1]; + if (prev && indexOf.call(['='].concat(slice.call(COMPOUND_ASSIGN)), value) >= 0) { + skipToken = false; + if (value === '=' && ((ref3 = prev[1]) === '||' || ref3 === '&&') && !prev.spaced) { + prev[0] = 'COMPOUND_ASSIGN'; + prev[1] += '='; + prev = this.tokens[this.tokens.length - 2]; + skipToken = true; + } + if (prev && prev[0] !== 'PROPERTY') { + origin = (ref4 = prev.origin) != null ? ref4 : prev; + message = isUnassignable(prev[1], origin[1]); + if (message) { + this.error(message, origin[2]); + } + } + if (skipToken) { + return value.length; + } + } + if (value === ';') { + this.seenFor = this.seenImport = this.seenExport = false; + tag = 'TERMINATOR'; + } else if (value === '*' && prev[0] === 'EXPORT') { + tag = 'EXPORT_ALL'; + } else if (indexOf.call(MATH, value) >= 0) { + tag = 'MATH'; + } else if (indexOf.call(COMPARE, value) >= 0) { + tag = 'COMPARE'; + } else if (indexOf.call(COMPOUND_ASSIGN, value) >= 0) { + tag = 'COMPOUND_ASSIGN'; + } else if (indexOf.call(UNARY, value) >= 0) { + tag = 'UNARY'; + } else if (indexOf.call(UNARY_MATH, value) >= 0) { + tag = 'UNARY_MATH'; + } else if (indexOf.call(SHIFT, value) >= 0) { + tag = 'SHIFT'; + } else if (indexOf.call(LOGIC, value) >= 0 || value === '?' && (prev != null ? prev.spaced : void 0)) { + tag = 'LOGIC'; + } else if (prev && !prev.spaced) { + if (value === '(' && (ref5 = prev[0], indexOf.call(CALLABLE, ref5) >= 0)) { + if (prev[0] === '?') { + prev[0] = 'FUNC_EXIST'; + } + tag = 'CALL_START'; + } else if (value === '[' && (ref6 = prev[0], indexOf.call(INDEXABLE, ref6) >= 0)) { + tag = 'INDEX_START'; + switch (prev[0]) { + case '?': + prev[0] = 'INDEX_SOAK'; + } + } + } + token = this.makeToken(tag, value); + switch (value) { + case '(': + case '{': + case '[': + this.ends.push({ + tag: INVERSES[value], + origin: token + }); + break; + case ')': + case '}': + case ']': + this.pair(value); + } + this.tokens.push(token); + return value.length; + }; + + Lexer.prototype.tagParameters = function() { + var i, stack, tok, tokens; + if (this.tag() !== ')') { + return this; + } + stack = []; + tokens = this.tokens; + i = tokens.length; + tokens[--i][0] = 'PARAM_END'; + while (tok = tokens[--i]) { + switch (tok[0]) { + case ')': + stack.push(tok); + break; + case '(': + case 'CALL_START': + if (stack.length) { + stack.pop(); + } else if (tok[0] === '(') { + tok[0] = 'PARAM_START'; + return this; + } else { + return this; + } + } + } + return this; + }; + + Lexer.prototype.closeIndentation = function() { + return this.outdentToken(this.indent); + }; + + Lexer.prototype.matchWithInterpolations = function(regex, delimiter) { + var close, column, firstToken, index, lastToken, line, nested, offsetInChunk, open, ref2, ref3, ref4, str, strPart, tokens; + tokens = []; + offsetInChunk = delimiter.length; + if (this.chunk.slice(0, offsetInChunk) !== delimiter) { + return null; + } + str = this.chunk.slice(offsetInChunk); + while (true) { + strPart = regex.exec(str)[0]; + this.validateEscapes(strPart, { + isRegex: delimiter.charAt(0) === '/', + offsetInChunk: offsetInChunk + }); + tokens.push(this.makeToken('NEOSTRING', strPart, offsetInChunk)); + str = str.slice(strPart.length); + offsetInChunk += strPart.length; + if (str.slice(0, 2) !== '#{') { + break; + } + ref2 = this.getLineAndColumnFromChunk(offsetInChunk + 1), line = ref2[0], column = ref2[1]; + ref3 = new Lexer().tokenize(str.slice(1), { + line: line, + column: column, + untilBalanced: true + }), nested = ref3.tokens, index = ref3.index; + index += 1; + open = nested[0], close = nested[nested.length - 1]; + open[0] = open[1] = '('; + close[0] = close[1] = ')'; + close.origin = ['', 'end of interpolation', close[2]]; + if (((ref4 = nested[1]) != null ? ref4[0] : void 0) === 'TERMINATOR') { + nested.splice(1, 1); + } + tokens.push(['TOKENS', nested]); + str = str.slice(index); + offsetInChunk += index; + } + if (str.slice(0, delimiter.length) !== delimiter) { + this.error("missing " + delimiter, { + length: delimiter.length + }); + } + firstToken = tokens[0], lastToken = tokens[tokens.length - 1]; + firstToken[2].first_column -= delimiter.length; + lastToken[2].last_column += delimiter.length; + if (lastToken[1].length === 0) { + lastToken[2].last_column -= 1; + } + return { + tokens: tokens, + index: offsetInChunk + delimiter.length + }; + }; + + Lexer.prototype.mergeInterpolationTokens = function(tokens, options, fn) { + var converted, firstEmptyStringIndex, firstIndex, i, j, lastToken, len, locationToken, lparen, plusToken, ref2, rparen, tag, token, tokensToPush, value; + if (tokens.length > 1) { + lparen = this.token('STRING_START', '(', 0, 0); + } + firstIndex = this.tokens.length; + for (i = j = 0, len = tokens.length; j < len; i = ++j) { + token = tokens[i]; + tag = token[0], value = token[1]; + switch (tag) { + case 'TOKENS': + if (value.length === 2) { + continue; + } + locationToken = value[0]; + tokensToPush = value; + break; + case 'NEOSTRING': + converted = fn(token[1], i); + if (converted.length === 0) { + if (i === 0) { + firstEmptyStringIndex = this.tokens.length; + } else { + continue; + } + } + if (i === 2 && (firstEmptyStringIndex != null)) { + this.tokens.splice(firstEmptyStringIndex, 2); + } + token[0] = 'STRING'; + token[1] = this.makeDelimitedLiteral(converted, options); + locationToken = token; + tokensToPush = [token]; + } + if (this.tokens.length > firstIndex) { + plusToken = this.token('+', '+'); + plusToken[2] = { + first_line: locationToken[2].first_line, + first_column: locationToken[2].first_column, + last_line: locationToken[2].first_line, + last_column: locationToken[2].first_column + }; + } + (ref2 = this.tokens).push.apply(ref2, tokensToPush); + } + if (lparen) { + lastToken = tokens[tokens.length - 1]; + lparen.origin = [ + 'STRING', null, { + first_line: lparen[2].first_line, + first_column: lparen[2].first_column, + last_line: lastToken[2].last_line, + last_column: lastToken[2].last_column + } + ]; + rparen = this.token('STRING_END', ')'); + return rparen[2] = { + first_line: lastToken[2].last_line, + first_column: lastToken[2].last_column, + last_line: lastToken[2].last_line, + last_column: lastToken[2].last_column + }; + } + }; + + Lexer.prototype.pair = function(tag) { + var lastIndent, prev, ref2, ref3, wanted; + ref2 = this.ends, prev = ref2[ref2.length - 1]; + if (tag !== (wanted = prev != null ? prev.tag : void 0)) { + if ('OUTDENT' !== wanted) { + this.error("unmatched " + tag); + } + ref3 = this.indents, lastIndent = ref3[ref3.length - 1]; + this.outdentToken(lastIndent, true); + return this.pair(tag); + } + return this.ends.pop(); + }; + + Lexer.prototype.getLineAndColumnFromChunk = function(offset) { + var column, lastLine, lineCount, ref2, string; + if (offset === 0) { + return [this.chunkLine, this.chunkColumn]; + } + if (offset >= this.chunk.length) { + string = this.chunk; + } else { + string = this.chunk.slice(0, +(offset - 1) + 1 || 9e9); + } + lineCount = count(string, '\n'); + column = this.chunkColumn; + if (lineCount > 0) { + ref2 = string.split('\n'), lastLine = ref2[ref2.length - 1]; + column = lastLine.length; + } else { + column += string.length; + } + return [this.chunkLine + lineCount, column]; + }; + + Lexer.prototype.makeToken = function(tag, value, offsetInChunk, length) { + var lastCharacter, locationData, ref2, ref3, token; + if (offsetInChunk == null) { + offsetInChunk = 0; + } + if (length == null) { + length = value.length; + } + locationData = {}; + ref2 = this.getLineAndColumnFromChunk(offsetInChunk), locationData.first_line = ref2[0], locationData.first_column = ref2[1]; + lastCharacter = length > 0 ? length - 1 : 0; + ref3 = this.getLineAndColumnFromChunk(offsetInChunk + lastCharacter), locationData.last_line = ref3[0], locationData.last_column = ref3[1]; + token = [tag, value, locationData]; + return token; + }; + + Lexer.prototype.token = function(tag, value, offsetInChunk, length, origin) { + var token; + token = this.makeToken(tag, value, offsetInChunk, length); + if (origin) { + token.origin = origin; + } + this.tokens.push(token); + return token; + }; + + Lexer.prototype.tag = function() { + var ref2, token; + ref2 = this.tokens, token = ref2[ref2.length - 1]; + return token != null ? token[0] : void 0; + }; + + Lexer.prototype.value = function() { + var ref2, token; + ref2 = this.tokens, token = ref2[ref2.length - 1]; + return token != null ? token[1] : void 0; + }; + + Lexer.prototype.unfinished = function() { + var ref2; + return LINE_CONTINUER.test(this.chunk) || ((ref2 = this.tag()) === '\\' || ref2 === '.' || ref2 === '?.' || ref2 === '?::' || ref2 === 'UNARY' || ref2 === 'MATH' || ref2 === 'UNARY_MATH' || ref2 === '+' || ref2 === '-' || ref2 === '**' || ref2 === 'SHIFT' || ref2 === 'RELATION' || ref2 === 'COMPARE' || ref2 === 'LOGIC' || ref2 === 'THROW' || ref2 === 'EXTENDS'); + }; + + Lexer.prototype.formatString = function(str) { + return str.replace(STRING_OMIT, '$1'); + }; + + Lexer.prototype.formatHeregex = function(str) { + return str.replace(HEREGEX_OMIT, '$1$2'); + }; + + Lexer.prototype.validateEscapes = function(str, options) { + var before, hex, invalidEscape, match, message, octal, ref2, unicode; + if (options == null) { + options = {}; + } + match = INVALID_ESCAPE.exec(str); + if (!match) { + return; + } + match[0], before = match[1], octal = match[2], hex = match[3], unicode = match[4]; + if (options.isRegex && octal && octal.charAt(0) !== '0') { + return; + } + message = octal ? "octal escape sequences are not allowed" : "invalid escape sequence"; + invalidEscape = "\\" + (octal || hex || unicode); + return this.error(message + " " + invalidEscape, { + offset: ((ref2 = options.offsetInChunk) != null ? ref2 : 0) + match.index + before.length, + length: invalidEscape.length + }); + }; + + Lexer.prototype.makeDelimitedLiteral = function(body, options) { + var regex; + if (options == null) { + options = {}; + } + if (body === '' && options.delimiter === '/') { + body = '(?:)'; + } + regex = RegExp("(\\\\\\\\)|(\\\\0(?=[1-7]))|\\\\?(" + options.delimiter + ")|\\\\?(?:(\\n)|(\\r)|(\\u2028)|(\\u2029))|(\\\\.)", "g"); + body = body.replace(regex, function(match, backslash, nul, delimiter, lf, cr, ls, ps, other) { + switch (false) { + case !backslash: + if (options.double) { + return backslash + backslash; + } else { + return backslash; + } + case !nul: + return '\\x00'; + case !delimiter: + return "\\" + delimiter; + case !lf: + return '\\n'; + case !cr: + return '\\r'; + case !ls: + return '\\u2028'; + case !ps: + return '\\u2029'; + case !other: + if (options.double) { + return "\\" + other; + } else { + return other; + } + } + }); + return "" + options.delimiter + body + options.delimiter; + }; + + Lexer.prototype.error = function(message, options) { + var first_column, first_line, location, ref2, ref3, ref4; + if (options == null) { + options = {}; + } + location = 'first_line' in options ? options : ((ref3 = this.getLineAndColumnFromChunk((ref2 = options.offset) != null ? ref2 : 0), first_line = ref3[0], first_column = ref3[1], ref3), { + first_line: first_line, + first_column: first_column, + last_column: first_column + ((ref4 = options.length) != null ? ref4 : 1) - 1 + }); + return throwSyntaxError(message, location); + }; + + return Lexer; + + })(); + + isUnassignable = function(name, displayName) { + if (displayName == null) { + displayName = name; + } + switch (false) { + case indexOf.call(slice.call(JS_KEYWORDS).concat(slice.call(COFFEE_KEYWORDS)), name) < 0: + return "keyword '" + displayName + "' can't be assigned"; + case indexOf.call(STRICT_PROSCRIBED, name) < 0: + return "'" + displayName + "' can't be assigned"; + case indexOf.call(RESERVED, name) < 0: + return "reserved word '" + displayName + "' can't be assigned"; + default: + return false; + } + }; + + exports.isUnassignable = isUnassignable; + + JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'yield', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super', 'import', 'export', 'default']; + + COFFEE_KEYWORDS = ['undefined', 'Infinity', 'NaN', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']; + + COFFEE_ALIAS_MAP = { + and: '&&', + or: '||', + is: '==', + isnt: '!=', + not: '!', + yes: 'true', + no: 'false', + on: 'true', + off: 'false' + }; + + COFFEE_ALIASES = (function() { + var results; + results = []; + for (key in COFFEE_ALIAS_MAP) { + results.push(key); + } + return results; + })(); + + COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES); + + RESERVED = ['case', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'native', 'implements', 'interface', 'package', 'private', 'protected', 'public', 'static']; + + STRICT_PROSCRIBED = ['arguments', 'eval']; + + exports.JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED); + + BOM = 65279; + + IDENTIFIER = /^(?!\d)((?:(?!\s)[$\w\x7f-\uffff])+)([^\n\S]*:(?!:))?/; + + NUMBER = /^0b[01]+|^0o[0-7]+|^0x[\da-f]+|^\d*\.?\d+(?:e[+-]?\d+)?/i; + + OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>*\/%])\2=?|\?(\.|::)|\.{2,3})/; + + WHITESPACE = /^[^\n\S]+/; + + COMMENT = /^###([^#][\s\S]*?)(?:###[^\n\S]*|###$)|^(?:\s*#(?!##[^#]).*)+/; + + CODE = /^[-=]>/; + + MULTI_DENT = /^(?:\n[^\n\S]*)+/; + + JSTOKEN = /^`[^\\`]*(?:\\.[^\\`]*)*`/; + + STRING_START = /^(?:'''|"""|'|")/; + + STRING_SINGLE = /^(?:[^\\']|\\[\s\S])*/; + + STRING_DOUBLE = /^(?:[^\\"#]|\\[\s\S]|\#(?!\{))*/; + + HEREDOC_SINGLE = /^(?:[^\\']|\\[\s\S]|'(?!''))*/; + + HEREDOC_DOUBLE = /^(?:[^\\"#]|\\[\s\S]|"(?!"")|\#(?!\{))*/; + + STRING_OMIT = /((?:\\\\)+)|\\[^\S\n]*\n\s*/g; + + SIMPLE_STRING_OMIT = /\s*\n\s*/g; + + HEREDOC_INDENT = /\n+([^\n\S]*)(?=\S)/g; + + REGEX = /^\/(?!\/)((?:[^[\/\n\\]|\\[^\n]|\[(?:\\[^\n]|[^\]\n\\])*\])*)(\/)?/; + + REGEX_FLAGS = /^\w*/; + + VALID_FLAGS = /^(?!.*(.).*\1)[imgy]*$/; + + HEREGEX = /^(?:[^\\\/#]|\\[\s\S]|\/(?!\/\/)|\#(?!\{))*/; + + HEREGEX_OMIT = /((?:\\\\)+)|\\(\s)|\s+(?:#.*)?/g; + + REGEX_ILLEGAL = /^(\/|\/{3}\s*)(\*)/; + + POSSIBLY_DIVISION = /^\/=?\s/; + + HERECOMMENT_ILLEGAL = /\*\//; + + LINE_CONTINUER = /^\s*(?:,|\??\.(?![.\d])|::)/; + + INVALID_ESCAPE = /((?:^|[^\\])(?:\\\\)*)\\(?:(0[0-7]|[1-7])|(x(?![\da-fA-F]{2}).{0,2})|(u(?![\da-fA-F]{4}).{0,4}))/; + + LEADING_BLANK_LINE = /^[^\n\S]*\n/; + + TRAILING_BLANK_LINE = /\n[^\n\S]*$/; + + TRAILING_SPACES = /\s+$/; + + COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=', '**=', '//=', '%%=']; + + UNARY = ['NEW', 'TYPEOF', 'DELETE', 'DO']; + + UNARY_MATH = ['!', '~']; + + LOGIC = ['&&', '||', '&', '|', '^']; + + SHIFT = ['<<', '>>', '>>>']; + + COMPARE = ['==', '!=', '<', '>', '<=', '>=']; + + MATH = ['*', '/', '%', '//', '%%']; + + RELATION = ['IN', 'OF', 'INSTANCEOF']; + + BOOL = ['TRUE', 'FALSE']; + + CALLABLE = ['IDENTIFIER', 'PROPERTY', ')', ']', '?', '@', 'THIS', 'SUPER']; + + INDEXABLE = CALLABLE.concat(['NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_END', 'REGEX', 'REGEX_END', 'BOOL', 'NULL', 'UNDEFINED', '}', '::']); + + NOT_REGEX = INDEXABLE.concat(['++', '--']); + + LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']; + + INDENTABLE_CLOSERS = [')', '}', ']']; + +}).call(this); + + return module.exports; +})();require['./parser'] = (function() { + var exports = {}, module = {exports: exports}; + /* parser generated by jison 0.4.17 */ +/* + Returns a Parser object of the following structure: + + Parser: { + yy: {} + } + + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, + } + } + + + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } + + + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var parser = (function(){ +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,22],$V1=[1,25],$V2=[1,83],$V3=[1,79],$V4=[1,84],$V5=[1,85],$V6=[1,81],$V7=[1,82],$V8=[1,56],$V9=[1,58],$Va=[1,59],$Vb=[1,60],$Vc=[1,61],$Vd=[1,62],$Ve=[1,49],$Vf=[1,50],$Vg=[1,32],$Vh=[1,68],$Vi=[1,69],$Vj=[1,78],$Vk=[1,47],$Vl=[1,51],$Vm=[1,52],$Vn=[1,67],$Vo=[1,65],$Vp=[1,66],$Vq=[1,64],$Vr=[1,42],$Vs=[1,48],$Vt=[1,63],$Vu=[1,73],$Vv=[1,74],$Vw=[1,75],$Vx=[1,76],$Vy=[1,46],$Vz=[1,72],$VA=[1,34],$VB=[1,35],$VC=[1,36],$VD=[1,37],$VE=[1,38],$VF=[1,39],$VG=[1,86],$VH=[1,6,32,42,131],$VI=[1,96],$VJ=[1,89],$VK=[1,88],$VL=[1,87],$VM=[1,90],$VN=[1,91],$VO=[1,92],$VP=[1,93],$VQ=[1,94],$VR=[1,95],$VS=[1,99],$VT=[1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,158,159,162,163,164,165,166,167,168],$VU=[1,105],$VV=[1,106],$VW=[1,107],$VX=[1,108],$VY=[1,110],$VZ=[1,111],$V_=[1,104],$V$=[2,161],$V01=[1,6,32,42,131,133,135,139,155],$V11=[2,27],$V21=[1,118],$V31=[1,116],$V41=[1,6,31,32,42,65,70,73,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,155,158,159,162,163,164,165,166,167,168],$V51=[2,94],$V61=[1,6,31,32,42,46,65,70,73,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,155,158,159,162,163,164,165,166,167,168],$V71=[2,73],$V81=[1,123],$V91=[1,128],$Va1=[1,129],$Vb1=[1,131],$Vc1=[1,6,31,32,42,55,65,70,73,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,155,158,159,162,163,164,165,166,167,168],$Vd1=[2,91],$Ve1=[1,6,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,158,159,162,163,164,165,166,167,168],$Vf1=[2,63],$Vg1=[1,161],$Vh1=[1,173],$Vi1=[1,175],$Vj1=[1,170],$Vk1=[1,177],$Vl1=[1,179],$Vm1=[1,6,31,32,42,55,65,70,73,82,83,84,85,87,89,90,94,96,113,114,115,120,122,131,133,134,135,139,140,155,158,159,160,161,162,163,164,165,166,167,168,169],$Vn1=[2,110],$Vo1=[1,6,31,32,42,58,65,70,73,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,155,158,159,162,163,164,165,166,167,168],$Vp1=[1,229],$Vq1=[1,228],$Vr1=[1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155],$Vs1=[2,71],$Vt1=[1,238],$Vu1=[6,31,32,65,70],$Vv1=[6,31,32,55,65,70,73],$Vw1=[1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,158,159,163,165,166,167,168],$Vx1=[82,83,84,85,87,90,113,114],$Vy1=[1,257],$Vz1=[2,62],$VA1=[1,267],$VB1=[1,273],$VC1=[2,182],$VD1=[1,6,31,32,42,55,65,70,73,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,146,147,155,158,159,162,163,164,165,166,167,168],$VE1=[1,283],$VF1=[6,31,32,70,115,120],$VG1=[1,6,31,32,42,55,58,65,70,73,82,83,84,85,87,89,90,94,96,113,114,115,120,122,131,133,134,135,139,140,146,147,155,158,159,160,161,162,163,164,165,166,167,168,169],$VH1=[1,6,31,32,42,65,70,73,89,94,115,120,122,131,140,155],$VI1=[1,6,31,32,42,65,70,73,89,94,115,120,122,131,134,140,155],$VJ1=[146,147],$VK1=[70,146,147],$VL1=[6,31,94],$VM1=[1,296],$VN1=[6,31,32,70,94],$VO1=[6,31,32,58,70,94],$VP1=[6,31,32,55,58,70,94],$VQ1=[1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,158,159,165,166,167,168],$VR1=[12,28,34,38,40,41,44,45,48,49,50,51,52,53,61,62,63,67,68,89,92,95,97,104,112,117,118,119,125,129,130,133,135,137,139,148,154,156,157,158,159,160,161],$VS1=[2,171],$VT1=[6,31,32],$VU1=[2,72],$VV1=[1,308],$VW1=[1,309],$VX1=[1,6,31,32,42,65,70,73,89,94,115,120,122,127,128,131,133,134,135,139,140,150,152,155,158,159,162,163,164,165,166,167,168],$VY1=[32,150,152],$VZ1=[1,6,32,42,65,70,73,89,94,115,120,122,131,134,140,155],$V_1=[1,335],$V$1=[1,340],$V02=[1,6,32,42,131,155],$V12=[2,86],$V22=[1,350],$V32=[1,351],$V42=[1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,150,155,158,159,162,163,164,165,166,167,168],$V52=[1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,135,139,140,155],$V62=[1,363],$V72=[1,364],$V82=[6,31,32,94],$V92=[6,31,32,70],$Va2=[1,6,31,32,42,65,70,73,89,94,115,120,122,127,131,133,134,135,139,140,155,158,159,162,163,164,165,166,167,168],$Vb2=[31,70],$Vc2=[1,390],$Vd2=[1,391],$Ve2=[1,396],$Vf2=[1,397]; +var parser = {trace: function trace() { }, +yy: {}, +symbols_: {"error":2,"Root":3,"Body":4,"Line":5,"TERMINATOR":6,"Expression":7,"Statement":8,"YieldReturn":9,"Return":10,"Comment":11,"STATEMENT":12,"Import":13,"Export":14,"Value":15,"Invocation":16,"Code":17,"Operation":18,"Assign":19,"If":20,"Try":21,"While":22,"For":23,"Switch":24,"Class":25,"Throw":26,"Yield":27,"YIELD":28,"FROM":29,"Block":30,"INDENT":31,"OUTDENT":32,"Identifier":33,"IDENTIFIER":34,"Property":35,"PROPERTY":36,"AlphaNumeric":37,"NUMBER":38,"String":39,"STRING":40,"STRING_START":41,"STRING_END":42,"Regex":43,"REGEX":44,"REGEX_START":45,"REGEX_END":46,"Literal":47,"JS":48,"UNDEFINED":49,"NULL":50,"BOOL":51,"INFINITY":52,"NAN":53,"Assignable":54,"=":55,"AssignObj":56,"ObjAssignable":57,":":58,"SimpleObjAssignable":59,"ThisProperty":60,"RETURN":61,"HERECOMMENT":62,"PARAM_START":63,"ParamList":64,"PARAM_END":65,"FuncGlyph":66,"->":67,"=>":68,"OptComma":69,",":70,"Param":71,"ParamVar":72,"...":73,"Array":74,"Object":75,"Splat":76,"SimpleAssignable":77,"Accessor":78,"Parenthetical":79,"Range":80,"This":81,".":82,"?.":83,"::":84,"?::":85,"Index":86,"INDEX_START":87,"IndexValue":88,"INDEX_END":89,"INDEX_SOAK":90,"Slice":91,"{":92,"AssignList":93,"}":94,"CLASS":95,"EXTENDS":96,"IMPORT":97,"ImportDefaultSpecifier":98,"ImportNamespaceSpecifier":99,"ImportSpecifierList":100,"ImportSpecifier":101,"AS":102,"IMPORT_ALL":103,"EXPORT":104,"ExportSpecifierList":105,"DEFAULT":106,"EXPORT_ALL":107,"ExportSpecifier":108,"OptFuncExist":109,"Arguments":110,"Super":111,"SUPER":112,"FUNC_EXIST":113,"CALL_START":114,"CALL_END":115,"ArgList":116,"THIS":117,"@":118,"[":119,"]":120,"RangeDots":121,"..":122,"Arg":123,"SimpleArgs":124,"TRY":125,"Catch":126,"FINALLY":127,"CATCH":128,"THROW":129,"(":130,")":131,"WhileSource":132,"WHILE":133,"WHEN":134,"UNTIL":135,"Loop":136,"LOOP":137,"ForBody":138,"FOR":139,"BY":140,"ForStart":141,"ForSource":142,"ForVariables":143,"OWN":144,"ForValue":145,"FORIN":146,"FOROF":147,"SWITCH":148,"Whens":149,"ELSE":150,"When":151,"LEADING_WHEN":152,"IfBlock":153,"IF":154,"POST_IF":155,"UNARY":156,"UNARY_MATH":157,"-":158,"+":159,"--":160,"++":161,"?":162,"MATH":163,"**":164,"SHIFT":165,"COMPARE":166,"LOGIC":167,"RELATION":168,"COMPOUND_ASSIGN":169,"$accept":0,"$end":1}, +terminals_: {2:"error",6:"TERMINATOR",12:"STATEMENT",28:"YIELD",29:"FROM",31:"INDENT",32:"OUTDENT",34:"IDENTIFIER",36:"PROPERTY",38:"NUMBER",40:"STRING",41:"STRING_START",42:"STRING_END",44:"REGEX",45:"REGEX_START",46:"REGEX_END",48:"JS",49:"UNDEFINED",50:"NULL",51:"BOOL",52:"INFINITY",53:"NAN",55:"=",58:":",61:"RETURN",62:"HERECOMMENT",63:"PARAM_START",65:"PARAM_END",67:"->",68:"=>",70:",",73:"...",82:".",83:"?.",84:"::",85:"?::",87:"INDEX_START",89:"INDEX_END",90:"INDEX_SOAK",92:"{",94:"}",95:"CLASS",96:"EXTENDS",97:"IMPORT",102:"AS",103:"IMPORT_ALL",104:"EXPORT",106:"DEFAULT",107:"EXPORT_ALL",112:"SUPER",113:"FUNC_EXIST",114:"CALL_START",115:"CALL_END",117:"THIS",118:"@",119:"[",120:"]",122:"..",125:"TRY",127:"FINALLY",128:"CATCH",129:"THROW",130:"(",131:")",133:"WHILE",134:"WHEN",135:"UNTIL",137:"LOOP",139:"FOR",140:"BY",144:"OWN",146:"FORIN",147:"FOROF",148:"SWITCH",150:"ELSE",152:"LEADING_WHEN",154:"IF",155:"POST_IF",156:"UNARY",157:"UNARY_MATH",158:"-",159:"+",160:"--",161:"++",162:"?",163:"MATH",164:"**",165:"SHIFT",166:"COMPARE",167:"LOGIC",168:"RELATION",169:"COMPOUND_ASSIGN"}, +productions_: [0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[5,1],[8,1],[8,1],[8,1],[8,1],[8,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[27,1],[27,2],[27,3],[30,2],[30,3],[33,1],[35,1],[37,1],[37,1],[39,1],[39,3],[43,1],[43,3],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[19,3],[19,4],[19,5],[56,1],[56,3],[56,5],[56,3],[56,5],[56,1],[59,1],[59,1],[59,1],[57,1],[57,1],[10,2],[10,1],[9,3],[9,2],[11,1],[17,5],[17,2],[66,1],[66,1],[69,0],[69,1],[64,0],[64,1],[64,3],[64,4],[64,6],[71,1],[71,2],[71,3],[71,1],[72,1],[72,1],[72,1],[72,1],[76,2],[77,1],[77,2],[77,2],[77,1],[54,1],[54,1],[54,1],[15,1],[15,1],[15,1],[15,1],[15,1],[78,2],[78,2],[78,2],[78,2],[78,1],[78,1],[86,3],[86,2],[88,1],[88,1],[75,4],[93,0],[93,1],[93,3],[93,4],[93,6],[25,1],[25,2],[25,3],[25,4],[25,2],[25,3],[25,4],[25,5],[13,2],[13,4],[13,4],[13,5],[13,7],[13,6],[13,9],[100,1],[100,3],[100,4],[100,4],[100,6],[101,1],[101,3],[98,1],[99,3],[14,3],[14,5],[14,2],[14,4],[14,5],[14,6],[14,3],[14,4],[14,7],[105,1],[105,3],[105,4],[105,4],[105,6],[108,1],[108,3],[108,3],[16,3],[16,3],[16,1],[111,1],[111,2],[109,0],[109,1],[110,2],[110,4],[81,1],[81,1],[60,2],[74,2],[74,4],[121,1],[121,1],[80,5],[91,3],[91,2],[91,2],[91,1],[116,1],[116,3],[116,4],[116,4],[116,6],[123,1],[123,1],[123,1],[124,1],[124,3],[21,2],[21,3],[21,4],[21,5],[126,3],[126,3],[126,2],[26,2],[79,3],[79,5],[132,2],[132,4],[132,2],[132,4],[22,2],[22,2],[22,2],[22,1],[136,2],[136,2],[23,2],[23,2],[23,2],[138,2],[138,4],[138,2],[141,2],[141,3],[145,1],[145,1],[145,1],[145,1],[143,1],[143,3],[142,2],[142,2],[142,4],[142,4],[142,4],[142,6],[142,6],[24,5],[24,7],[24,4],[24,6],[149,1],[149,2],[151,3],[151,4],[153,3],[153,5],[20,1],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,4],[18,3]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ + +var $0 = $$.length - 1; +switch (yystate) { +case 1: +return this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Block); +break; +case 2: +return this.$ = $$[$0]; +break; +case 3: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(yy.Block.wrap([$$[$0]])); +break; +case 4: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].push($$[$0])); +break; +case 5: +this.$ = $$[$0-1]; +break; +case 6: case 7: case 8: case 9: case 10: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 35: case 40: case 42: case 56: case 57: case 58: case 59: case 60: case 61: case 71: case 72: case 82: case 83: case 84: case 85: case 90: case 91: case 94: case 98: case 104: case 158: case 182: case 183: case 185: case 215: case 216: case 232: case 238: +this.$ = $$[$0]; +break; +case 11: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.StatementLiteral($$[$0])); +break; +case 27: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Op($$[$0], new yy.Value(new yy.Literal('')))); +break; +case 28: case 242: case 243: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op($$[$0-1], $$[$0])); +break; +case 29: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-2].concat($$[$0-1]), $$[$0])); +break; +case 30: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Block); +break; +case 31: case 105: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-1]); +break; +case 32: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.IdentifierLiteral($$[$0])); +break; +case 33: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.PropertyName($$[$0])); +break; +case 34: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.NumberLiteral($$[$0])); +break; +case 36: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.StringLiteral($$[$0])); +break; +case 37: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.StringWithInterpolations($$[$0-1])); +break; +case 38: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.RegexLiteral($$[$0])); +break; +case 39: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.RegexWithInterpolations($$[$0-1].args)); +break; +case 41: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.PassthroughLiteral($$[$0])); +break; +case 43: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.UndefinedLiteral); +break; +case 44: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.NullLiteral); +break; +case 45: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.BooleanLiteral($$[$0])); +break; +case 46: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.InfinityLiteral($$[$0])); +break; +case 47: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.NaNLiteral); +break; +case 48: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0])); +break; +case 49: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0])); +break; +case 50: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1])); +break; +case 51: case 87: case 92: case 93: case 95: case 96: case 97: case 217: case 218: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0])); +break; +case 52: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), $$[$0], 'object', { + operatorToken: yy.addLocationDataFn(_$[$0-1])(new yy.Literal($$[$0-1])) + })); +break; +case 53: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-4])(new yy.Value($$[$0-4])), $$[$0-1], 'object', { + operatorToken: yy.addLocationDataFn(_$[$0-3])(new yy.Literal($$[$0-3])) + })); +break; +case 54: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), $$[$0], null, { + operatorToken: yy.addLocationDataFn(_$[$0-1])(new yy.Literal($$[$0-1])) + })); +break; +case 55: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-4])(new yy.Value($$[$0-4])), $$[$0-1], null, { + operatorToken: yy.addLocationDataFn(_$[$0-3])(new yy.Literal($$[$0-3])) + })); +break; +case 62: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Return($$[$0])); +break; +case 63: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Return); +break; +case 64: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.YieldReturn($$[$0])); +break; +case 65: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.YieldReturn); +break; +case 66: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Comment($$[$0])); +break; +case 67: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Code($$[$0-3], $$[$0], $$[$0-1])); +break; +case 68: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Code([], $$[$0], $$[$0-1])); +break; +case 69: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('func'); +break; +case 70: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('boundfunc'); +break; +case 73: case 110: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([]); +break; +case 74: case 111: case 130: case 148: case 177: case 219: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]); +break; +case 75: case 112: case 131: case 149: case 178: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0])); +break; +case 76: case 113: case 132: case 150: case 179: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0])); +break; +case 77: case 114: case 134: case 152: case 181: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2])); +break; +case 78: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Param($$[$0])); +break; +case 79: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Param($$[$0-1], null, true)); +break; +case 80: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Param($$[$0-2], $$[$0])); +break; +case 81: case 184: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Expansion); +break; +case 86: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Splat($$[$0-1])); +break; +case 88: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].add($$[$0])); +break; +case 89: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value($$[$0-1], [].concat($$[$0]))); +break; +case 99: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0])); +break; +case 100: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0], 'soak')); +break; +case 101: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.PropertyName('prototype'))), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]); +break; +case 102: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.PropertyName('prototype'), 'soak')), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]); +break; +case 103: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Access(new yy.PropertyName('prototype'))); +break; +case 106: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(yy.extend($$[$0], { + soak: true + })); +break; +case 107: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Index($$[$0])); +break; +case 108: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Slice($$[$0])); +break; +case 109: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Obj($$[$0-2], $$[$0-3].generated)); +break; +case 115: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Class); +break; +case 116: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class(null, null, $$[$0])); +break; +case 117: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class(null, $$[$0])); +break; +case 118: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class(null, $$[$0-1], $$[$0])); +break; +case 119: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class($$[$0])); +break; +case 120: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class($$[$0-1], null, $$[$0])); +break; +case 121: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class($$[$0-2], $$[$0])); +break; +case 122: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Class($$[$0-3], $$[$0-1], $$[$0])); +break; +case 123: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.ImportDeclaration(null, $$[$0])); +break; +case 124: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause($$[$0-2], null), $$[$0])); +break; +case 125: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause(null, $$[$0-2]), $$[$0])); +break; +case 126: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList([])), $$[$0])); +break; +case 127: +this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList($$[$0-4])), $$[$0])); +break; +case 128: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4], $$[$0-2]), $$[$0])); +break; +case 129: +this.$ = yy.addLocationDataFn(_$[$0-8], _$[$0])(new yy.ImportDeclaration(new yy.ImportClause($$[$0-7], new yy.ImportSpecifierList($$[$0-4])), $$[$0])); +break; +case 133: case 151: case 164: case 180: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-2]); +break; +case 135: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ImportSpecifier($$[$0])); +break; +case 136: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ImportSpecifier($$[$0-2], $$[$0])); +break; +case 137: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ImportDefaultSpecifier($$[$0])); +break; +case 138: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ImportNamespaceSpecifier(new yy.Literal($$[$0-2]), $$[$0])); +break; +case 139: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]))); +break; +case 140: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-2]))); +break; +case 141: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.ExportNamedDeclaration($$[$0])); +break; +case 142: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ExportNamedDeclaration(new yy.Assign($$[$0-2], $$[$0], null, { + moduleDeclaration: 'export' + }))); +break; +case 143: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.ExportNamedDeclaration(new yy.Assign($$[$0-3], $$[$0], null, { + moduleDeclaration: 'export' + }))); +break; +case 144: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.ExportNamedDeclaration(new yy.Assign($$[$0-4], $$[$0-1], null, { + moduleDeclaration: 'export' + }))); +break; +case 145: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportDefaultDeclaration($$[$0])); +break; +case 146: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.ExportAllDeclaration(new yy.Literal($$[$0-2]), $$[$0])); +break; +case 147: +this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-4]), $$[$0])); +break; +case 153: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.ExportSpecifier($$[$0])); +break; +case 154: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportSpecifier($$[$0-2], $$[$0])); +break; +case 155: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.ExportSpecifier($$[$0-2], new yy.Literal($$[$0]))); +break; +case 156: case 157: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Call($$[$0-2], $$[$0], $$[$0-1])); +break; +case 159: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.SuperCall); +break; +case 160: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.SuperCall($$[$0])); +break; +case 161: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(false); +break; +case 162: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(true); +break; +case 163: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([]); +break; +case 165: case 166: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value(new yy.ThisLiteral)); +break; +case 167: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value(yy.addLocationDataFn(_$[$0-1])(new yy.ThisLiteral), [yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))], 'this')); +break; +case 168: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Arr([])); +break; +case 169: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Arr($$[$0-2])); +break; +case 170: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('inclusive'); +break; +case 171: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('exclusive'); +break; +case 172: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Range($$[$0-3], $$[$0-1], $$[$0-2])); +break; +case 173: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Range($$[$0-2], $$[$0], $$[$0-1])); +break; +case 174: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range($$[$0-1], null, $$[$0])); +break; +case 175: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range(null, $$[$0], $$[$0-1])); +break; +case 176: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Range(null, null, $$[$0])); +break; +case 186: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([].concat($$[$0-2], $$[$0])); +break; +case 187: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Try($$[$0])); +break; +case 188: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Try($$[$0-1], $$[$0][0], $$[$0][1])); +break; +case 189: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Try($$[$0-2], null, null, $$[$0])); +break; +case 190: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0])); +break; +case 191: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-1], $$[$0]]); +break; +case 192: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Value($$[$0-1])), $$[$0]]); +break; +case 193: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([null, $$[$0]]); +break; +case 194: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Throw($$[$0])); +break; +case 195: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Parens($$[$0-1])); +break; +case 196: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Parens($$[$0-2])); +break; +case 197: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0])); +break; +case 198: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], { + guard: $$[$0] + })); +break; +case 199: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0], { + invert: true + })); +break; +case 200: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], { + invert: true, + guard: $$[$0] + })); +break; +case 201: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].addBody($$[$0])); +break; +case 202: case 203: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]])))); +break; +case 204: +this.$ = yy.addLocationDataFn(_$[$0], _$[$0])($$[$0]); +break; +case 205: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.BooleanLiteral('true'))).addBody($$[$0])); +break; +case 206: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.BooleanLiteral('true'))).addBody(yy.addLocationDataFn(_$[$0])(yy.Block.wrap([$$[$0]])))); +break; +case 207: case 208: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0])); +break; +case 209: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0], $$[$0-1])); +break; +case 210: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ + source: yy.addLocationDataFn(_$[$0])(new yy.Value($$[$0])) + }); +break; +case 211: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ + source: yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), + step: $$[$0] + }); +break; +case 212: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])((function () { + $$[$0].own = $$[$0-1].own; + $$[$0].name = $$[$0-1][0]; + $$[$0].index = $$[$0-1][1]; + return $$[$0]; + }())); +break; +case 213: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0]); +break; +case 214: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () { + $$[$0].own = true; + return $$[$0]; + }())); +break; +case 220: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-2], $$[$0]]); +break; +case 221: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ + source: $$[$0] + }); +break; +case 222: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({ + source: $$[$0], + object: true + }); +break; +case 223: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ + source: $$[$0-2], + guard: $$[$0] + }); +break; +case 224: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ + source: $$[$0-2], + guard: $$[$0], + object: true + }); +break; +case 225: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({ + source: $$[$0-2], + step: $$[$0] + }); +break; +case 226: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({ + source: $$[$0-4], + guard: $$[$0-2], + step: $$[$0] + }); +break; +case 227: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({ + source: $$[$0-4], + step: $$[$0-2], + guard: $$[$0] + }); +break; +case 228: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Switch($$[$0-3], $$[$0-1])); +break; +case 229: +this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1])); +break; +case 230: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Switch(null, $$[$0-1])); +break; +case 231: +this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.Switch(null, $$[$0-3], $$[$0-1])); +break; +case 233: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].concat($$[$0])); +break; +case 234: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([[$$[$0-1], $$[$0]]]); +break; +case 235: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])([[$$[$0-2], $$[$0-1]]]); +break; +case 236: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], { + type: $$[$0-2] + })); +break; +case 237: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], { + type: $$[$0-2] + })))); +break; +case 239: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].addElse($$[$0])); +break; +case 240: case 241: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), { + type: $$[$0-1], + statement: true + })); +break; +case 244: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('-', $$[$0])); +break; +case 245: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('+', $$[$0])); +break; +case 246: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0])); +break; +case 247: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0])); +break; +case 248: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0-1], null, true)); +break; +case 249: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0-1], null, true)); +break; +case 250: +this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Existence($$[$0-1])); +break; +case 251: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('+', $$[$0-2], $$[$0])); +break; +case 252: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('-', $$[$0-2], $$[$0])); +break; +case 253: case 254: case 255: case 256: case 257: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0])); +break; +case 258: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () { + if ($$[$0-1].charAt(0) === '!') { + return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert(); + } else { + return new yy.Op($$[$0-1], $$[$0-2], $$[$0]); + } + }())); +break; +case 259: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0], $$[$0-1])); +break; +case 260: +this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3])); +break; +case 261: +this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0], $$[$0-2])); +break; +case 262: +this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Extends($$[$0-2], $$[$0])); +break; +} +}, +table: [{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{1:[3]},{1:[2,2],6:$VG},o($VH,[2,3]),o($VH,[2,6],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VH,[2,7],{141:77,132:100,138:101,133:$Vu,135:$Vv,139:$Vx,155:$VS}),o($VH,[2,8]),o($VT,[2,14],{109:102,78:103,86:109,82:$VU,83:$VV,84:$VW,85:$VX,87:$VY,90:$VZ,113:$V_,114:$V$}),o($VT,[2,15],{86:109,109:112,78:113,82:$VU,83:$VV,84:$VW,85:$VX,87:$VY,90:$VZ,113:$V_,114:$V$}),o($VT,[2,16]),o($VT,[2,17]),o($VT,[2,18]),o($VT,[2,19]),o($VT,[2,20]),o($VT,[2,21]),o($VT,[2,22]),o($VT,[2,23]),o($VT,[2,24]),o($VT,[2,25]),o($VT,[2,26]),o($V01,[2,9]),o($V01,[2,10]),o($V01,[2,11]),o($V01,[2,12]),o($V01,[2,13]),o([1,6,32,42,131,133,135,139,155,162,163,164,165,166,167,168],$V11,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,66:33,77:40,153:41,132:43,136:44,138:45,74:53,75:54,37:55,43:57,33:70,60:71,141:77,39:80,7:115,8:117,12:$V0,28:$V21,29:$V31,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:[1,114],62:$Vf,63:$Vg,67:$Vh,68:$Vi,92:$Vj,95:$Vk,97:$Vl,104:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,137:$Vw,148:$Vy,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF}),o($V41,$V51,{55:[1,119]}),o($V41,[2,95]),o($V41,[2,96]),o($V41,[2,97]),o($V41,[2,98]),o($V61,[2,158]),o([6,31,65,70],$V71,{64:120,71:121,72:122,33:124,60:125,74:126,75:127,34:$V2,73:$V81,92:$Vj,118:$V91,119:$Va1}),{30:130,31:$Vb1},{7:132,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:133,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:134,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:135,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{15:137,16:138,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:139,60:71,74:53,75:54,77:136,79:28,80:29,81:30,92:$Vj,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt},{15:137,16:138,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:139,60:71,74:53,75:54,77:140,79:28,80:29,81:30,92:$Vj,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt},o($Vc1,$Vd1,{96:[1,144],160:[1,141],161:[1,142],169:[1,143]}),o($VT,[2,238],{150:[1,145]}),{30:146,31:$Vb1},{30:147,31:$Vb1},o($VT,[2,204]),{30:148,31:$Vb1},{7:149,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:[1,150],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($Ve1,[2,115],{47:27,79:28,80:29,81:30,111:31,74:53,75:54,37:55,43:57,33:70,60:71,39:80,15:137,16:138,54:139,30:151,77:153,31:$Vb1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,92:$Vj,96:[1,152],112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt}),{7:154,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($V01,$Vf1,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,66:33,77:40,153:41,132:43,136:44,138:45,74:53,75:54,37:55,43:57,33:70,60:71,141:77,39:80,8:117,7:155,12:$V0,28:$V21,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,62:$Vf,63:$Vg,67:$Vh,68:$Vi,92:$Vj,95:$Vk,97:$Vl,104:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,137:$Vw,148:$Vy,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF}),o([1,6,31,32,42,70,94,131,133,135,139,155],[2,66]),{33:160,34:$V2,39:156,40:$V4,41:$V5,92:[1,159],98:157,99:158,103:$Vg1},{25:163,33:164,34:$V2,92:[1,162],95:$Vk,106:[1,165],107:[1,166]},o($Vc1,[2,92]),o($Vc1,[2,93]),o($V41,[2,40]),o($V41,[2,41]),o($V41,[2,42]),o($V41,[2,43]),o($V41,[2,44]),o($V41,[2,45]),o($V41,[2,46]),o($V41,[2,47]),{4:167,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,31:[1,168],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:169,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:$Vh1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,73:$Vi1,74:53,75:54,76:174,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,116:171,117:$Vo,118:$Vp,119:$Vq,120:$Vj1,123:172,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($V41,[2,165]),o($V41,[2,166],{35:176,36:$Vk1}),o([1,6,31,32,42,46,65,70,73,82,83,84,85,87,89,90,94,113,115,120,122,131,133,134,135,139,140,155,158,159,162,163,164,165,166,167,168],[2,159],{110:178,114:$Vl1}),{31:[2,69]},{31:[2,70]},o($Vm1,[2,87]),o($Vm1,[2,90]),{7:180,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:181,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:182,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:184,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,30:183,31:$Vb1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{33:189,34:$V2,60:190,74:191,75:192,80:185,92:$Vj,118:$V91,119:$Vq,143:186,144:[1,187],145:188},{142:193,146:[1,194],147:[1,195]},o([6,31,70,94],$Vn1,{39:80,93:196,56:197,57:198,59:199,11:200,37:201,33:202,35:203,60:204,34:$V2,36:$Vk1,38:$V3,40:$V4,41:$V5,62:$Vf,118:$V91}),o($Vo1,[2,34]),o($Vo1,[2,35]),o($V41,[2,38]),{15:137,16:205,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:139,60:71,74:53,75:54,77:206,79:28,80:29,81:30,92:$Vj,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,130:$Vt},o([1,6,29,31,32,42,55,58,65,70,73,82,83,84,85,87,89,90,94,96,102,113,114,115,120,122,131,133,134,135,139,140,146,147,155,158,159,160,161,162,163,164,165,166,167,168,169],[2,32]),o($Vo1,[2,36]),{4:207,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VH,[2,5],{7:4,8:5,9:6,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,66:33,77:40,153:41,132:43,136:44,138:45,74:53,75:54,37:55,43:57,33:70,60:71,141:77,39:80,5:208,12:$V0,28:$V1,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,62:$Vf,63:$Vg,67:$Vh,68:$Vi,92:$Vj,95:$Vk,97:$Vl,104:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,133:$Vu,135:$Vv,137:$Vw,139:$Vx,148:$Vy,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF}),o($VT,[2,250]),{7:209,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:210,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:211,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:212,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:213,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:214,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:215,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:216,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:217,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VT,[2,203]),o($VT,[2,208]),{7:218,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VT,[2,202]),o($VT,[2,207]),{110:219,114:$Vl1},o($Vm1,[2,88]),{114:[2,162]},{35:220,36:$Vk1},{35:221,36:$Vk1},o($Vm1,[2,103],{35:222,36:$Vk1}),{35:223,36:$Vk1},o($Vm1,[2,104]),{7:225,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,73:$Vp1,74:53,75:54,77:40,79:28,80:29,81:30,88:224,91:226,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,121:227,122:$Vq1,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{86:230,87:$VY,90:$VZ},{110:231,114:$Vl1},o($Vm1,[2,89]),o($VH,[2,65],{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,66:33,77:40,153:41,132:43,136:44,138:45,74:53,75:54,37:55,43:57,33:70,60:71,141:77,39:80,8:117,7:232,12:$V0,28:$V21,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,62:$Vf,63:$Vg,67:$Vh,68:$Vi,92:$Vj,95:$Vk,97:$Vl,104:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,133:$Vf1,135:$Vf1,139:$Vf1,155:$Vf1,137:$Vw,148:$Vy,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF}),o($Vr1,[2,28],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{7:233,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{132:100,133:$Vu,135:$Vv,138:101,139:$Vx,141:77,155:$VS},o([1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,162,163,164,165,166,167,168],$V11,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,66:33,77:40,153:41,132:43,136:44,138:45,74:53,75:54,37:55,43:57,33:70,60:71,141:77,39:80,7:115,8:117,12:$V0,28:$V21,29:$V31,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,62:$Vf,63:$Vg,67:$Vh,68:$Vi,92:$Vj,95:$Vk,97:$Vl,104:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,137:$Vw,148:$Vy,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF}),{6:[1,235],7:234,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:[1,236],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o([6,31],$Vs1,{69:239,65:[1,237],70:$Vt1}),o($Vu1,[2,74]),o($Vu1,[2,78],{55:[1,241],73:[1,240]}),o($Vu1,[2,81]),o($Vv1,[2,82]),o($Vv1,[2,83]),o($Vv1,[2,84]),o($Vv1,[2,85]),{35:176,36:$Vk1},{7:242,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:$Vh1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,73:$Vi1,74:53,75:54,76:174,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,116:171,117:$Vo,118:$Vp,119:$Vq,120:$Vj1,123:172,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VT,[2,68]),{4:244,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,32:[1,243],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o([1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,158,159,163,164,165,166,167,168],[2,242],{141:77,132:97,138:98,162:$VL}),o($Vw1,[2,243],{141:77,132:97,138:98,162:$VL,164:$VN}),o($Vw1,[2,244],{141:77,132:97,138:98,162:$VL,164:$VN}),o($Vw1,[2,245],{141:77,132:97,138:98,162:$VL,164:$VN}),o($VT,[2,246],{82:$Vd1,83:$Vd1,84:$Vd1,85:$Vd1,87:$Vd1,90:$Vd1,113:$Vd1,114:$Vd1}),{78:103,82:$VU,83:$VV,84:$VW,85:$VX,86:109,87:$VY,90:$VZ,109:102,113:$V_,114:$V$},{78:113,82:$VU,83:$VV,84:$VW,85:$VX,86:109,87:$VY,90:$VZ,109:112,113:$V_,114:$V$},o($Vx1,$V51),o($VT,[2,247],{82:$Vd1,83:$Vd1,84:$Vd1,85:$Vd1,87:$Vd1,90:$Vd1,113:$Vd1,114:$Vd1}),o($VT,[2,248]),o($VT,[2,249]),{6:[1,247],7:245,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:[1,246],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:248,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{30:249,31:$Vb1,154:[1,250]},o($VT,[2,187],{126:251,127:[1,252],128:[1,253]}),o($VT,[2,201]),o($VT,[2,209]),{31:[1,254],132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},{149:255,151:256,152:$Vy1},o($VT,[2,116]),{7:258,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($Ve1,[2,119],{30:259,31:$Vb1,82:$Vd1,83:$Vd1,84:$Vd1,85:$Vd1,87:$Vd1,90:$Vd1,113:$Vd1,114:$Vd1,96:[1,260]}),o($Vr1,[2,194],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($V01,$Vz1,{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($V01,[2,123]),{29:[1,261],70:[1,262]},{29:[1,263]},{31:$VA1,33:268,34:$V2,94:[1,264],100:265,101:266},o([29,70],[2,137]),{102:[1,269]},{31:$VB1,33:274,34:$V2,94:[1,270],105:271,108:272},o($V01,[2,141]),{55:[1,275]},{7:276,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{29:[1,277]},{6:$VG,131:[1,278]},{4:279,5:3,7:4,8:5,9:6,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o([6,31,70,120],$VC1,{141:77,132:97,138:98,121:280,73:[1,281],122:$Vq1,133:$Vu,135:$Vv,139:$Vx,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VD1,[2,168]),o([6,31,120],$Vs1,{69:282,70:$VE1}),o($VF1,[2,177]),{7:242,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:$Vh1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,73:$Vi1,74:53,75:54,76:174,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,116:284,117:$Vo,118:$Vp,119:$Vq,123:172,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VF1,[2,183]),o($VF1,[2,184]),o($VG1,[2,167]),o($VG1,[2,33]),o($V61,[2,160]),{7:242,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:$Vh1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,73:$Vi1,74:53,75:54,76:174,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,115:[1,285],116:286,117:$Vo,118:$Vp,119:$Vq,123:172,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{30:287,31:$Vb1,132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},o($VH1,[2,197],{141:77,132:97,138:98,133:$Vu,134:[1,288],135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VH1,[2,199],{141:77,132:97,138:98,133:$Vu,134:[1,289],135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VT,[2,205]),o($VI1,[2,206],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o([1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,155,158,159,162,163,164,165,166,167,168],[2,210],{140:[1,290]}),o($VJ1,[2,213]),{33:189,34:$V2,60:190,74:191,75:192,92:$Vj,118:$V91,119:$Va1,143:291,145:188},o($VJ1,[2,219],{70:[1,292]}),o($VK1,[2,215]),o($VK1,[2,216]),o($VK1,[2,217]),o($VK1,[2,218]),o($VT,[2,212]),{7:293,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:294,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VL1,$Vs1,{69:295,70:$VM1}),o($VN1,[2,111]),o($VN1,[2,51],{58:[1,297]}),o($VO1,[2,60],{55:[1,298]}),o($VN1,[2,56]),o($VO1,[2,61]),o($VP1,[2,57]),o($VP1,[2,58]),o($VP1,[2,59]),{46:[1,299],78:113,82:$VU,83:$VV,84:$VW,85:$VX,86:109,87:$VY,90:$VZ,109:112,113:$V_,114:$V$},o($Vx1,$Vd1),{6:$VG,42:[1,300]},o($VH,[2,4]),o($VQ1,[2,251],{141:77,132:97,138:98,162:$VL,163:$VM,164:$VN}),o($VQ1,[2,252],{141:77,132:97,138:98,162:$VL,163:$VM,164:$VN}),o($Vw1,[2,253],{141:77,132:97,138:98,162:$VL,164:$VN}),o($Vw1,[2,254],{141:77,132:97,138:98,162:$VL,164:$VN}),o([1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,165,166,167,168],[2,255],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN}),o([1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,166,167],[2,256],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,168:$VR}),o([1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,167],[2,257],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,168:$VR}),o([1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,140,155,166,167,168],[2,258],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO}),o($VI1,[2,241],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VI1,[2,240],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($V61,[2,156]),o($Vm1,[2,99]),o($Vm1,[2,100]),o($Vm1,[2,101]),o($Vm1,[2,102]),{89:[1,301]},{73:$Vp1,89:[2,107],121:302,122:$Vq1,132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},{89:[2,108]},{7:303,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,89:[2,176],92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VR1,[2,170]),o($VR1,$VS1),o($Vm1,[2,106]),o($V61,[2,157]),o($VH,[2,64],{141:77,132:97,138:98,133:$Vz1,135:$Vz1,139:$Vz1,155:$Vz1,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($Vr1,[2,29],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($Vr1,[2,48],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{7:304,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:305,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{66:306,67:$Vh,68:$Vi},o($VT1,$VU1,{72:122,33:124,60:125,74:126,75:127,71:307,34:$V2,73:$V81,92:$Vj,118:$V91,119:$Va1}),{6:$VV1,31:$VW1},o($Vu1,[2,79]),{7:310,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VF1,$VC1,{141:77,132:97,138:98,73:[1,311],133:$Vu,135:$Vv,139:$Vx,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VX1,[2,30]),{6:$VG,32:[1,312]},o($Vr1,[2,259],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{7:313,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:314,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($Vr1,[2,262],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VT,[2,239]),{7:315,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VT,[2,188],{127:[1,316]}),{30:317,31:$Vb1},{30:320,31:$Vb1,33:318,34:$V2,75:319,92:$Vj},{149:321,151:256,152:$Vy1},{32:[1,322],150:[1,323],151:324,152:$Vy1},o($VY1,[2,232]),{7:326,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,124:325,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VZ1,[2,117],{141:77,132:97,138:98,30:327,31:$Vb1,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VT,[2,120]),{7:328,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{39:329,40:$V4,41:$V5},{92:[1,331],99:330,103:$Vg1},{39:332,40:$V4,41:$V5},{29:[1,333]},o($VL1,$Vs1,{69:334,70:$V_1}),o($VN1,[2,130]),{31:$VA1,33:268,34:$V2,100:336,101:266},o($VN1,[2,135],{102:[1,337]}),{33:338,34:$V2},o($V01,[2,139]),o($VL1,$Vs1,{69:339,70:$V$1}),o($VN1,[2,148]),{31:$VB1,33:274,34:$V2,105:341,108:272},o($VN1,[2,153],{102:[1,342]}),{6:[1,344],7:343,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:[1,345],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($V02,[2,145],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{39:346,40:$V4,41:$V5},o($V41,[2,195]),{6:$VG,32:[1,347]},{7:348,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o([12,28,34,38,40,41,44,45,48,49,50,51,52,53,61,62,63,67,68,92,95,97,104,112,117,118,119,125,129,130,133,135,137,139,148,154,156,157,158,159,160,161],$VS1,{6:$V12,31:$V12,70:$V12,120:$V12}),{6:$V22,31:$V32,120:[1,349]},o([6,31,32,115,120],$VU1,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,66:33,77:40,153:41,132:43,136:44,138:45,74:53,75:54,37:55,43:57,33:70,60:71,141:77,39:80,8:117,76:174,7:242,123:352,12:$V0,28:$V21,34:$V2,38:$V3,40:$V4,41:$V5,44:$V6,45:$V7,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,61:$Ve,62:$Vf,63:$Vg,67:$Vh,68:$Vi,73:$Vi1,92:$Vj,95:$Vk,97:$Vl,104:$Vm,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,133:$Vu,135:$Vv,137:$Vw,139:$Vx,148:$Vy,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF}),o($VT1,$Vs1,{69:353,70:$VE1}),o($V61,[2,163]),o([6,31,115],$Vs1,{69:354,70:$VE1}),o($V42,[2,236]),{7:355,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:356,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:357,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VJ1,[2,214]),{33:189,34:$V2,60:190,74:191,75:192,92:$Vj,118:$V91,119:$Va1,145:358},o([1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,135,139,155],[2,221],{141:77,132:97,138:98,134:[1,359],140:[1,360],158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($V52,[2,222],{141:77,132:97,138:98,134:[1,361],158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{6:$V62,31:$V72,94:[1,362]},o($V82,$VU1,{39:80,57:198,59:199,11:200,37:201,33:202,35:203,60:204,56:365,34:$V2,36:$Vk1,38:$V3,40:$V4,41:$V5,62:$Vf,118:$V91}),{7:366,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:[1,367],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:368,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:[1,369],33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($V41,[2,39]),o($Vo1,[2,37]),o($Vm1,[2,105]),{7:370,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,89:[2,174],92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{89:[2,175],132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},o($Vr1,[2,49],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{32:[1,371],132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},{30:372,31:$Vb1},o($Vu1,[2,75]),{33:124,34:$V2,60:125,71:373,72:122,73:$V81,74:126,75:127,92:$Vj,118:$V91,119:$Va1},o($V92,$V71,{71:121,72:122,33:124,60:125,74:126,75:127,64:374,34:$V2,73:$V81,92:$Vj,118:$V91,119:$Va1}),o($Vu1,[2,80],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VF1,$V12),o($VX1,[2,31]),{32:[1,375],132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},o($Vr1,[2,261],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{30:376,31:$Vb1,132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},{30:377,31:$Vb1},o($VT,[2,189]),{30:378,31:$Vb1},{30:379,31:$Vb1},o($Va2,[2,193]),{32:[1,380],150:[1,381],151:324,152:$Vy1},o($VT,[2,230]),{30:382,31:$Vb1},o($VY1,[2,233]),{30:383,31:$Vb1,70:[1,384]},o($Vb2,[2,185],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VT,[2,118]),o($VZ1,[2,121],{141:77,132:97,138:98,30:385,31:$Vb1,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($V01,[2,124]),{29:[1,386]},{31:$VA1,33:268,34:$V2,100:387,101:266},o($V01,[2,125]),{39:388,40:$V4,41:$V5},{6:$Vc2,31:$Vd2,94:[1,389]},o($V82,$VU1,{33:268,101:392,34:$V2}),o($VT1,$Vs1,{69:393,70:$V_1}),{33:394,34:$V2},{29:[2,138]},{6:$Ve2,31:$Vf2,94:[1,395]},o($V82,$VU1,{33:274,108:398,34:$V2}),o($VT1,$Vs1,{69:399,70:$V$1}),{33:400,34:$V2,106:[1,401]},o($V02,[2,142],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{7:402,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:403,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($V01,[2,146]),{131:[1,404]},{120:[1,405],132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},o($VD1,[2,169]),{7:242,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,73:$Vi1,74:53,75:54,76:174,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,123:406,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:242,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,31:$Vh1,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,73:$Vi1,74:53,75:54,76:174,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,116:407,117:$Vo,118:$Vp,119:$Vq,123:172,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VF1,[2,178]),{6:$V22,31:$V32,32:[1,408]},{6:$V22,31:$V32,115:[1,409]},o($VI1,[2,198],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VI1,[2,200],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VI1,[2,211],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VJ1,[2,220]),{7:410,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:411,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:412,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VD1,[2,109]),{11:200,33:202,34:$V2,35:203,36:$Vk1,37:201,38:$V3,39:80,40:$V4,41:$V5,56:413,57:198,59:199,60:204,62:$Vf,118:$V91},o($V92,$Vn1,{39:80,56:197,57:198,59:199,11:200,37:201,33:202,35:203,60:204,93:414,34:$V2,36:$Vk1,38:$V3,40:$V4,41:$V5,62:$Vf,118:$V91}),o($VN1,[2,112]),o($VN1,[2,52],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{7:415,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VN1,[2,54],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{7:416,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{89:[2,173],132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},o($VT,[2,50]),o($VT,[2,67]),o($Vu1,[2,76]),o($VT1,$Vs1,{69:417,70:$Vt1}),o($VT,[2,260]),o($V42,[2,237]),o($VT,[2,190]),o($Va2,[2,191]),o($Va2,[2,192]),o($VT,[2,228]),{30:418,31:$Vb1},{32:[1,419]},o($VY1,[2,234],{6:[1,420]}),{7:421,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},o($VT,[2,122]),{39:422,40:$V4,41:$V5},o($VL1,$Vs1,{69:423,70:$V_1}),o($V01,[2,126]),{29:[1,424]},{33:268,34:$V2,101:425},{31:$VA1,33:268,34:$V2,100:426,101:266},o($VN1,[2,131]),{6:$Vc2,31:$Vd2,32:[1,427]},o($VN1,[2,136]),o($V01,[2,140],{29:[1,428]}),{33:274,34:$V2,108:429},{31:$VB1,33:274,34:$V2,105:430,108:272},o($VN1,[2,149]),{6:$Ve2,31:$Vf2,32:[1,431]},o($VN1,[2,154]),o($VN1,[2,155]),o($V02,[2,143],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),{32:[1,432],132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},o($V41,[2,196]),o($V41,[2,172]),o($VF1,[2,179]),o($VT1,$Vs1,{69:433,70:$VE1}),o($VF1,[2,180]),o($V61,[2,164]),o([1,6,31,32,42,65,70,73,89,94,115,120,122,131,133,134,135,139,155],[2,223],{141:77,132:97,138:98,140:[1,434],158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($V52,[2,225],{141:77,132:97,138:98,134:[1,435],158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($Vr1,[2,224],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VN1,[2,113]),o($VT1,$Vs1,{69:436,70:$VM1}),{32:[1,437],132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},{32:[1,438],132:97,133:$Vu,135:$Vv,138:98,139:$Vx,141:77,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR},{6:$VV1,31:$VW1,32:[1,439]},{32:[1,440]},o($VT,[2,231]),o($VY1,[2,235]),o($Vb2,[2,186],{141:77,132:97,138:98,133:$Vu,135:$Vv,139:$Vx,155:$VI,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($V01,[2,128]),{6:$Vc2,31:$Vd2,94:[1,441]},{39:442,40:$V4,41:$V5},o($VN1,[2,132]),o($VT1,$Vs1,{69:443,70:$V_1}),o($VN1,[2,133]),{39:444,40:$V4,41:$V5},o($VN1,[2,150]),o($VT1,$Vs1,{69:445,70:$V$1}),o($VN1,[2,151]),o($V01,[2,144]),{6:$V22,31:$V32,32:[1,446]},{7:447,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{7:448,8:117,10:20,11:21,12:$V0,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:$V21,33:70,34:$V2,37:55,38:$V3,39:80,40:$V4,41:$V5,43:57,44:$V6,45:$V7,47:27,48:$V8,49:$V9,50:$Va,51:$Vb,52:$Vc,53:$Vd,54:26,60:71,61:$Ve,62:$Vf,63:$Vg,66:33,67:$Vh,68:$Vi,74:53,75:54,77:40,79:28,80:29,81:30,92:$Vj,95:$Vk,97:$Vl,104:$Vm,111:31,112:$Vn,117:$Vo,118:$Vp,119:$Vq,125:$Vr,129:$Vs,130:$Vt,132:43,133:$Vu,135:$Vv,136:44,137:$Vw,138:45,139:$Vx,141:77,148:$Vy,153:41,154:$Vz,156:$VA,157:$VB,158:$VC,159:$VD,160:$VE,161:$VF},{6:$V62,31:$V72,32:[1,449]},o($VN1,[2,53]),o($VN1,[2,55]),o($Vu1,[2,77]),o($VT,[2,229]),{29:[1,450]},o($V01,[2,127]),{6:$Vc2,31:$Vd2,32:[1,451]},o($V01,[2,147]),{6:$Ve2,31:$Vf2,32:[1,452]},o($VF1,[2,181]),o($Vr1,[2,226],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($Vr1,[2,227],{141:77,132:97,138:98,158:$VJ,159:$VK,162:$VL,163:$VM,164:$VN,165:$VO,166:$VP,167:$VQ,168:$VR}),o($VN1,[2,114]),{39:453,40:$V4,41:$V5},o($VN1,[2,134]),o($VN1,[2,152]),o($V01,[2,129])], +defaultActions: {68:[2,69],69:[2,70],104:[2,162],226:[2,108],338:[2,138]}, +parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + function _parseError (msg, hash) { + this.message = msg; + this.hash = hash; + } + _parseError.prototype = Error; + + throw new _parseError(str, hash); + } +}, +parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; + lstack.push(yyloc); + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == 'undefined') { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } + } + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; + } else { + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); + } + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; +}}; + +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})(); + + +if (typeof require !== 'undefined' && typeof exports !== 'undefined') { +exports.parser = parser; +exports.Parser = parser.Parser; +exports.parse = function () { return parser.parse.apply(parser, arguments); }; +exports.main = function commonjsMain(args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); + } + var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8"); + return exports.parser.parse(source); +}; +if (typeof module !== 'undefined' && require.main === module) { + exports.main(process.argv.slice(1)); +} +} + return module.exports; +})();require['./scope'] = (function() { + var exports = {}, module = {exports: exports}; + // Generated by CoffeeScript 1.11.1 +(function() { + var Scope, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + exports.Scope = Scope = (function() { + function Scope(parent, expressions, method, referencedVars) { + var ref, ref1; + this.parent = parent; + this.expressions = expressions; + this.method = method; + this.referencedVars = referencedVars; + this.variables = [ + { + name: 'arguments', + type: 'arguments' + } + ]; + this.positions = {}; + if (!this.parent) { + this.utilities = {}; + } + this.root = (ref = (ref1 = this.parent) != null ? ref1.root : void 0) != null ? ref : this; + } + + Scope.prototype.add = function(name, type, immediate) { + if (this.shared && !immediate) { + return this.parent.add(name, type, immediate); + } + if (Object.prototype.hasOwnProperty.call(this.positions, name)) { + return this.variables[this.positions[name]].type = type; + } else { + return this.positions[name] = this.variables.push({ + name: name, + type: type + }) - 1; + } + }; + + Scope.prototype.namedMethod = function() { + var ref; + if (((ref = this.method) != null ? ref.name : void 0) || !this.parent) { + return this.method; + } + return this.parent.namedMethod(); + }; + + Scope.prototype.find = function(name) { + if (this.check(name)) { + return true; + } + this.add(name, 'var'); + return false; + }; + + Scope.prototype.parameter = function(name) { + if (this.shared && this.parent.check(name, true)) { + return; + } + return this.add(name, 'param'); + }; + + Scope.prototype.check = function(name) { + var ref; + return !!(this.type(name) || ((ref = this.parent) != null ? ref.check(name) : void 0)); + }; + + Scope.prototype.temporary = function(name, index, single) { + var diff, endCode, letter, newCode, num, startCode; + if (single == null) { + single = false; + } + if (single) { + startCode = name.charCodeAt(0); + endCode = 'z'.charCodeAt(0); + diff = endCode - startCode; + newCode = startCode + index % (diff + 1); + letter = String.fromCharCode(newCode); + num = Math.floor(index / (diff + 1)); + return "" + letter + (num || ''); + } else { + return "" + name + (index || ''); + } + }; + + Scope.prototype.type = function(name) { + var i, len, ref, v; + ref = this.variables; + for (i = 0, len = ref.length; i < len; i++) { + v = ref[i]; + if (v.name === name) { + return v.type; + } + } + return null; + }; + + Scope.prototype.freeVariable = function(name, options) { + var index, ref, temp; + if (options == null) { + options = {}; + } + index = 0; + while (true) { + temp = this.temporary(name, index, options.single); + if (!(this.check(temp) || indexOf.call(this.root.referencedVars, temp) >= 0)) { + break; + } + index++; + } + if ((ref = options.reserve) != null ? ref : true) { + this.add(temp, 'var', true); + } + return temp; + }; + + Scope.prototype.assign = function(name, value) { + this.add(name, { + value: value, + assigned: true + }, true); + return this.hasAssignments = true; + }; + + Scope.prototype.hasDeclarations = function() { + return !!this.declaredVariables().length; + }; + + Scope.prototype.declaredVariables = function() { + var v; + return ((function() { + var i, len, ref, results; + ref = this.variables; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + v = ref[i]; + if (v.type === 'var') { + results.push(v.name); + } + } + return results; + }).call(this)).sort(); + }; + + Scope.prototype.assignedVariables = function() { + var i, len, ref, results, v; + ref = this.variables; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + v = ref[i]; + if (v.type.assigned) { + results.push(v.name + " = " + v.type.value); + } + } + return results; + }; + + return Scope; + + })(); + +}).call(this); + + return module.exports; +})();require['./nodes'] = (function() { + var exports = {}, module = {exports: exports}; + // Generated by CoffeeScript 1.11.1 +(function() { + var Access, Arr, Assign, Base, Block, BooleanLiteral, Call, Class, Code, CodeFragment, Comment, Existence, Expansion, ExportAllDeclaration, ExportDeclaration, ExportDefaultDeclaration, ExportNamedDeclaration, ExportSpecifier, ExportSpecifierList, Extends, For, IdentifierLiteral, If, ImportClause, ImportDeclaration, ImportDefaultSpecifier, ImportNamespaceSpecifier, ImportSpecifier, ImportSpecifierList, In, Index, InfinityLiteral, JS_FORBIDDEN, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, ModuleDeclaration, ModuleSpecifier, ModuleSpecifierList, NEGATE, NO, NaNLiteral, NullLiteral, NumberLiteral, Obj, Op, Param, Parens, PassthroughLiteral, PropertyName, Range, RegexLiteral, RegexWithInterpolations, Return, SIMPLENUM, Scope, Slice, Splat, StatementLiteral, StringLiteral, StringWithInterpolations, SuperCall, Switch, TAB, THIS, ThisLiteral, Throw, Try, UTILITIES, UndefinedLiteral, Value, While, YES, YieldReturn, addLocationDataFn, compact, del, ends, extend, flatten, fragmentsToText, isComplexOrAssignable, isLiteralArguments, isLiteralThis, isUnassignable, locationDataToString, merge, multident, ref1, ref2, some, starts, throwSyntaxError, unfoldSoak, utility, + extend1 = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + slice = [].slice; + + Error.stackTraceLimit = 2e308; + + Scope = require('./scope').Scope; + + ref1 = require('./lexer'), isUnassignable = ref1.isUnassignable, JS_FORBIDDEN = ref1.JS_FORBIDDEN; + + ref2 = require('./helpers'), compact = ref2.compact, flatten = ref2.flatten, extend = ref2.extend, merge = ref2.merge, del = ref2.del, starts = ref2.starts, ends = ref2.ends, some = ref2.some, addLocationDataFn = ref2.addLocationDataFn, locationDataToString = ref2.locationDataToString, throwSyntaxError = ref2.throwSyntaxError; + + exports.extend = extend; + + exports.addLocationDataFn = addLocationDataFn; + + YES = function() { + return true; + }; + + NO = function() { + return false; + }; + + THIS = function() { + return this; + }; + + NEGATE = function() { + this.negated = !this.negated; + return this; + }; + + exports.CodeFragment = CodeFragment = (function() { + function CodeFragment(parent, code) { + var ref3; + this.code = "" + code; + this.locationData = parent != null ? parent.locationData : void 0; + this.type = (parent != null ? (ref3 = parent.constructor) != null ? ref3.name : void 0 : void 0) || 'unknown'; + } + + CodeFragment.prototype.toString = function() { + return "" + this.code + (this.locationData ? ": " + locationDataToString(this.locationData) : ''); + }; + + return CodeFragment; + + })(); + + fragmentsToText = function(fragments) { + var fragment; + return ((function() { + var j, len1, results; + results = []; + for (j = 0, len1 = fragments.length; j < len1; j++) { + fragment = fragments[j]; + results.push(fragment.code); + } + return results; + })()).join(''); + }; + + exports.Base = Base = (function() { + function Base() {} + + Base.prototype.compile = function(o, lvl) { + return fragmentsToText(this.compileToFragments(o, lvl)); + }; + + Base.prototype.compileToFragments = function(o, lvl) { + var node; + o = extend({}, o); + if (lvl) { + o.level = lvl; + } + node = this.unfoldSoak(o) || this; + node.tab = o.indent; + if (o.level === LEVEL_TOP || !node.isStatement(o)) { + return node.compileNode(o); + } else { + return node.compileClosure(o); + } + }; + + Base.prototype.compileClosure = function(o) { + var args, argumentsNode, func, jumpNode, meth, parts, ref3; + if (jumpNode = this.jumps()) { + jumpNode.error('cannot use a pure statement in an expression'); + } + o.sharedScope = true; + func = new Code([], Block.wrap([this])); + args = []; + if ((argumentsNode = this.contains(isLiteralArguments)) || this.contains(isLiteralThis)) { + args = [new ThisLiteral]; + if (argumentsNode) { + meth = 'apply'; + args.push(new IdentifierLiteral('arguments')); + } else { + meth = 'call'; + } + func = new Value(func, [new Access(new PropertyName(meth))]); + } + parts = (new Call(func, args)).compileNode(o); + if (func.isGenerator || ((ref3 = func.base) != null ? ref3.isGenerator : void 0)) { + parts.unshift(this.makeCode("(yield* ")); + parts.push(this.makeCode(")")); + } + return parts; + }; + + Base.prototype.cache = function(o, level, isComplex) { + var complex, ref, sub; + complex = isComplex != null ? isComplex(this) : this.isComplex(); + if (complex) { + ref = new IdentifierLiteral(o.scope.freeVariable('ref')); + sub = new Assign(ref, this); + if (level) { + return [sub.compileToFragments(o, level), [this.makeCode(ref.value)]]; + } else { + return [sub, ref]; + } + } else { + ref = level ? this.compileToFragments(o, level) : this; + return [ref, ref]; + } + }; + + Base.prototype.cacheToCodeFragments = function(cacheValues) { + return [fragmentsToText(cacheValues[0]), fragmentsToText(cacheValues[1])]; + }; + + Base.prototype.makeReturn = function(res) { + var me; + me = this.unwrapAll(); + if (res) { + return new Call(new Literal(res + ".push"), [me]); + } else { + return new Return(me); + } + }; + + Base.prototype.contains = function(pred) { + var node; + node = void 0; + this.traverseChildren(false, function(n) { + if (pred(n)) { + node = n; + return false; + } + }); + return node; + }; + + Base.prototype.lastNonComment = function(list) { + var i; + i = list.length; + while (i--) { + if (!(list[i] instanceof Comment)) { + return list[i]; + } + } + return null; + }; + + Base.prototype.toString = function(idt, name) { + var tree; + if (idt == null) { + idt = ''; + } + if (name == null) { + name = this.constructor.name; + } + tree = '\n' + idt + name; + if (this.soak) { + tree += '?'; + } + this.eachChild(function(node) { + return tree += node.toString(idt + TAB); + }); + return tree; + }; + + Base.prototype.eachChild = function(func) { + var attr, child, j, k, len1, len2, ref3, ref4; + if (!this.children) { + return this; + } + ref3 = this.children; + for (j = 0, len1 = ref3.length; j < len1; j++) { + attr = ref3[j]; + if (this[attr]) { + ref4 = flatten([this[attr]]); + for (k = 0, len2 = ref4.length; k < len2; k++) { + child = ref4[k]; + if (func(child) === false) { + return this; + } + } + } + } + return this; + }; + + Base.prototype.traverseChildren = function(crossScope, func) { + return this.eachChild(function(child) { + var recur; + recur = func(child); + if (recur !== false) { + return child.traverseChildren(crossScope, func); + } + }); + }; + + Base.prototype.invert = function() { + return new Op('!', this); + }; + + Base.prototype.unwrapAll = function() { + var node; + node = this; + while (node !== (node = node.unwrap())) { + continue; + } + return node; + }; + + Base.prototype.children = []; + + Base.prototype.isStatement = NO; + + Base.prototype.jumps = NO; + + Base.prototype.isComplex = YES; + + Base.prototype.isChainable = NO; + + Base.prototype.isAssignable = NO; + + Base.prototype.isNumber = NO; + + Base.prototype.unwrap = THIS; + + Base.prototype.unfoldSoak = NO; + + Base.prototype.assigns = NO; + + Base.prototype.updateLocationDataIfMissing = function(locationData) { + if (this.locationData) { + return this; + } + this.locationData = locationData; + return this.eachChild(function(child) { + return child.updateLocationDataIfMissing(locationData); + }); + }; + + Base.prototype.error = function(message) { + return throwSyntaxError(message, this.locationData); + }; + + Base.prototype.makeCode = function(code) { + return new CodeFragment(this, code); + }; + + Base.prototype.wrapInBraces = function(fragments) { + return [].concat(this.makeCode('('), fragments, this.makeCode(')')); + }; + + Base.prototype.joinFragmentArrays = function(fragmentsList, joinStr) { + var answer, fragments, i, j, len1; + answer = []; + for (i = j = 0, len1 = fragmentsList.length; j < len1; i = ++j) { + fragments = fragmentsList[i]; + if (i) { + answer.push(this.makeCode(joinStr)); + } + answer = answer.concat(fragments); + } + return answer; + }; + + return Base; + + })(); + + exports.Block = Block = (function(superClass1) { + extend1(Block, superClass1); + + function Block(nodes) { + this.expressions = compact(flatten(nodes || [])); + } + + Block.prototype.children = ['expressions']; + + Block.prototype.push = function(node) { + this.expressions.push(node); + return this; + }; + + Block.prototype.pop = function() { + return this.expressions.pop(); + }; + + Block.prototype.unshift = function(node) { + this.expressions.unshift(node); + return this; + }; + + Block.prototype.unwrap = function() { + if (this.expressions.length === 1) { + return this.expressions[0]; + } else { + return this; + } + }; + + Block.prototype.isEmpty = function() { + return !this.expressions.length; + }; + + Block.prototype.isStatement = function(o) { + var exp, j, len1, ref3; + ref3 = this.expressions; + for (j = 0, len1 = ref3.length; j < len1; j++) { + exp = ref3[j]; + if (exp.isStatement(o)) { + return true; + } + } + return false; + }; + + Block.prototype.jumps = function(o) { + var exp, j, jumpNode, len1, ref3; + ref3 = this.expressions; + for (j = 0, len1 = ref3.length; j < len1; j++) { + exp = ref3[j]; + if (jumpNode = exp.jumps(o)) { + return jumpNode; + } + } + }; + + Block.prototype.makeReturn = function(res) { + var expr, len; + len = this.expressions.length; + while (len--) { + expr = this.expressions[len]; + if (!(expr instanceof Comment)) { + this.expressions[len] = expr.makeReturn(res); + if (expr instanceof Return && !expr.expression) { + this.expressions.splice(len, 1); + } + break; + } + } + return this; + }; + + Block.prototype.compileToFragments = function(o, level) { + if (o == null) { + o = {}; + } + if (o.scope) { + return Block.__super__.compileToFragments.call(this, o, level); + } else { + return this.compileRoot(o); + } + }; + + Block.prototype.compileNode = function(o) { + var answer, compiledNodes, fragments, index, j, len1, node, ref3, top; + this.tab = o.indent; + top = o.level === LEVEL_TOP; + compiledNodes = []; + ref3 = this.expressions; + for (index = j = 0, len1 = ref3.length; j < len1; index = ++j) { + node = ref3[index]; + node = node.unwrapAll(); + node = node.unfoldSoak(o) || node; + if (node instanceof Block) { + compiledNodes.push(node.compileNode(o)); + } else if (top) { + node.front = true; + fragments = node.compileToFragments(o); + if (!node.isStatement(o)) { + fragments.unshift(this.makeCode("" + this.tab)); + fragments.push(this.makeCode(";")); + } + compiledNodes.push(fragments); + } else { + compiledNodes.push(node.compileToFragments(o, LEVEL_LIST)); + } + } + if (top) { + if (this.spaced) { + return [].concat(this.joinFragmentArrays(compiledNodes, '\n\n'), this.makeCode("\n")); + } else { + return this.joinFragmentArrays(compiledNodes, '\n'); + } + } + if (compiledNodes.length) { + answer = this.joinFragmentArrays(compiledNodes, ', '); + } else { + answer = [this.makeCode("void 0")]; + } + if (compiledNodes.length > 1 && o.level >= LEVEL_LIST) { + return this.wrapInBraces(answer); + } else { + return answer; + } + }; + + Block.prototype.compileRoot = function(o) { + var exp, fragments, i, j, len1, name, prelude, preludeExps, ref3, ref4, rest; + o.indent = o.bare ? '' : TAB; + o.level = LEVEL_TOP; + this.spaced = true; + o.scope = new Scope(null, this, null, (ref3 = o.referencedVars) != null ? ref3 : []); + ref4 = o.locals || []; + for (j = 0, len1 = ref4.length; j < len1; j++) { + name = ref4[j]; + o.scope.parameter(name); + } + prelude = []; + if (!o.bare) { + preludeExps = (function() { + var k, len2, ref5, results; + ref5 = this.expressions; + results = []; + for (i = k = 0, len2 = ref5.length; k < len2; i = ++k) { + exp = ref5[i]; + if (!(exp.unwrap() instanceof Comment)) { + break; + } + results.push(exp); + } + return results; + }).call(this); + rest = this.expressions.slice(preludeExps.length); + this.expressions = preludeExps; + if (preludeExps.length) { + prelude = this.compileNode(merge(o, { + indent: '' + })); + prelude.push(this.makeCode("\n")); + } + this.expressions = rest; + } + fragments = this.compileWithDeclarations(o); + if (o.bare) { + return fragments; + } + return [].concat(prelude, this.makeCode("(function() {\n"), fragments, this.makeCode("\n}).call(this);\n")); + }; + + Block.prototype.compileWithDeclarations = function(o) { + var assigns, declars, exp, fragments, i, j, len1, post, ref3, ref4, ref5, rest, scope, spaced; + fragments = []; + post = []; + ref3 = this.expressions; + for (i = j = 0, len1 = ref3.length; j < len1; i = ++j) { + exp = ref3[i]; + exp = exp.unwrap(); + if (!(exp instanceof Comment || exp instanceof Literal)) { + break; + } + } + o = merge(o, { + level: LEVEL_TOP + }); + if (i) { + rest = this.expressions.splice(i, 9e9); + ref4 = [this.spaced, false], spaced = ref4[0], this.spaced = ref4[1]; + ref5 = [this.compileNode(o), spaced], fragments = ref5[0], this.spaced = ref5[1]; + this.expressions = rest; + } + post = this.compileNode(o); + scope = o.scope; + if (scope.expressions === this) { + declars = o.scope.hasDeclarations(); + assigns = scope.hasAssignments; + if (declars || assigns) { + if (i) { + fragments.push(this.makeCode('\n')); + } + fragments.push(this.makeCode(this.tab + "var ")); + if (declars) { + fragments.push(this.makeCode(scope.declaredVariables().join(', '))); + } + if (assigns) { + if (declars) { + fragments.push(this.makeCode(",\n" + (this.tab + TAB))); + } + fragments.push(this.makeCode(scope.assignedVariables().join(",\n" + (this.tab + TAB)))); + } + fragments.push(this.makeCode(";\n" + (this.spaced ? '\n' : ''))); + } else if (fragments.length && post.length) { + fragments.push(this.makeCode("\n")); + } + } + return fragments.concat(post); + }; + + Block.wrap = function(nodes) { + if (nodes.length === 1 && nodes[0] instanceof Block) { + return nodes[0]; + } + return new Block(nodes); + }; + + return Block; + + })(Base); + + exports.Literal = Literal = (function(superClass1) { + extend1(Literal, superClass1); + + function Literal(value1) { + this.value = value1; + } + + Literal.prototype.isComplex = NO; + + Literal.prototype.assigns = function(name) { + return name === this.value; + }; + + Literal.prototype.compileNode = function(o) { + return [this.makeCode(this.value)]; + }; + + Literal.prototype.toString = function() { + return " " + (this.isStatement() ? Literal.__super__.toString.apply(this, arguments) : this.constructor.name) + ": " + this.value; + }; + + return Literal; + + })(Base); + + exports.NumberLiteral = NumberLiteral = (function(superClass1) { + extend1(NumberLiteral, superClass1); + + function NumberLiteral() { + return NumberLiteral.__super__.constructor.apply(this, arguments); + } + + return NumberLiteral; + + })(Literal); + + exports.InfinityLiteral = InfinityLiteral = (function(superClass1) { + extend1(InfinityLiteral, superClass1); + + function InfinityLiteral() { + return InfinityLiteral.__super__.constructor.apply(this, arguments); + } + + InfinityLiteral.prototype.compileNode = function() { + return [this.makeCode('2e308')]; + }; + + return InfinityLiteral; + + })(NumberLiteral); + + exports.NaNLiteral = NaNLiteral = (function(superClass1) { + extend1(NaNLiteral, superClass1); + + function NaNLiteral() { + NaNLiteral.__super__.constructor.call(this, 'NaN'); + } + + NaNLiteral.prototype.compileNode = function(o) { + var code; + code = [this.makeCode('0/0')]; + if (o.level >= LEVEL_OP) { + return this.wrapInBraces(code); + } else { + return code; + } + }; + + return NaNLiteral; + + })(NumberLiteral); + + exports.StringLiteral = StringLiteral = (function(superClass1) { + extend1(StringLiteral, superClass1); + + function StringLiteral() { + return StringLiteral.__super__.constructor.apply(this, arguments); + } + + return StringLiteral; + + })(Literal); + + exports.RegexLiteral = RegexLiteral = (function(superClass1) { + extend1(RegexLiteral, superClass1); + + function RegexLiteral() { + return RegexLiteral.__super__.constructor.apply(this, arguments); + } + + return RegexLiteral; + + })(Literal); + + exports.PassthroughLiteral = PassthroughLiteral = (function(superClass1) { + extend1(PassthroughLiteral, superClass1); + + function PassthroughLiteral() { + return PassthroughLiteral.__super__.constructor.apply(this, arguments); + } + + return PassthroughLiteral; + + })(Literal); + + exports.IdentifierLiteral = IdentifierLiteral = (function(superClass1) { + extend1(IdentifierLiteral, superClass1); + + function IdentifierLiteral() { + return IdentifierLiteral.__super__.constructor.apply(this, arguments); + } + + IdentifierLiteral.prototype.isAssignable = YES; + + return IdentifierLiteral; + + })(Literal); + + exports.PropertyName = PropertyName = (function(superClass1) { + extend1(PropertyName, superClass1); + + function PropertyName() { + return PropertyName.__super__.constructor.apply(this, arguments); + } + + PropertyName.prototype.isAssignable = YES; + + return PropertyName; + + })(Literal); + + exports.StatementLiteral = StatementLiteral = (function(superClass1) { + extend1(StatementLiteral, superClass1); + + function StatementLiteral() { + return StatementLiteral.__super__.constructor.apply(this, arguments); + } + + StatementLiteral.prototype.isStatement = YES; + + StatementLiteral.prototype.makeReturn = THIS; + + StatementLiteral.prototype.jumps = function(o) { + if (this.value === 'break' && !((o != null ? o.loop : void 0) || (o != null ? o.block : void 0))) { + return this; + } + if (this.value === 'continue' && !(o != null ? o.loop : void 0)) { + return this; + } + }; + + StatementLiteral.prototype.compileNode = function(o) { + return [this.makeCode("" + this.tab + this.value + ";")]; + }; + + return StatementLiteral; + + })(Literal); + + exports.ThisLiteral = ThisLiteral = (function(superClass1) { + extend1(ThisLiteral, superClass1); + + function ThisLiteral() { + ThisLiteral.__super__.constructor.call(this, 'this'); + } + + ThisLiteral.prototype.compileNode = function(o) { + var code, ref3; + code = ((ref3 = o.scope.method) != null ? ref3.bound : void 0) ? o.scope.method.context : this.value; + return [this.makeCode(code)]; + }; + + return ThisLiteral; + + })(Literal); + + exports.UndefinedLiteral = UndefinedLiteral = (function(superClass1) { + extend1(UndefinedLiteral, superClass1); + + function UndefinedLiteral() { + UndefinedLiteral.__super__.constructor.call(this, 'undefined'); + } + + UndefinedLiteral.prototype.compileNode = function(o) { + return [this.makeCode(o.level >= LEVEL_ACCESS ? '(void 0)' : 'void 0')]; + }; + + return UndefinedLiteral; + + })(Literal); + + exports.NullLiteral = NullLiteral = (function(superClass1) { + extend1(NullLiteral, superClass1); + + function NullLiteral() { + NullLiteral.__super__.constructor.call(this, 'null'); + } + + return NullLiteral; + + })(Literal); + + exports.BooleanLiteral = BooleanLiteral = (function(superClass1) { + extend1(BooleanLiteral, superClass1); + + function BooleanLiteral() { + return BooleanLiteral.__super__.constructor.apply(this, arguments); + } + + return BooleanLiteral; + + })(Literal); + + exports.Return = Return = (function(superClass1) { + extend1(Return, superClass1); + + function Return(expression) { + this.expression = expression; + } + + Return.prototype.children = ['expression']; + + Return.prototype.isStatement = YES; + + Return.prototype.makeReturn = THIS; + + Return.prototype.jumps = THIS; + + Return.prototype.compileToFragments = function(o, level) { + var expr, ref3; + expr = (ref3 = this.expression) != null ? ref3.makeReturn() : void 0; + if (expr && !(expr instanceof Return)) { + return expr.compileToFragments(o, level); + } else { + return Return.__super__.compileToFragments.call(this, o, level); + } + }; + + Return.prototype.compileNode = function(o) { + var answer; + answer = []; + answer.push(this.makeCode(this.tab + ("return" + (this.expression ? " " : "")))); + if (this.expression) { + answer = answer.concat(this.expression.compileToFragments(o, LEVEL_PAREN)); + } + answer.push(this.makeCode(";")); + return answer; + }; + + return Return; + + })(Base); + + exports.YieldReturn = YieldReturn = (function(superClass1) { + extend1(YieldReturn, superClass1); + + function YieldReturn() { + return YieldReturn.__super__.constructor.apply(this, arguments); + } + + YieldReturn.prototype.compileNode = function(o) { + if (o.scope.parent == null) { + this.error('yield can only occur inside functions'); + } + return YieldReturn.__super__.compileNode.apply(this, arguments); + }; + + return YieldReturn; + + })(Return); + + exports.Value = Value = (function(superClass1) { + extend1(Value, superClass1); + + function Value(base, props, tag) { + if (!props && base instanceof Value) { + return base; + } + this.base = base; + this.properties = props || []; + if (tag) { + this[tag] = true; + } + return this; + } + + Value.prototype.children = ['base', 'properties']; + + Value.prototype.add = function(props) { + this.properties = this.properties.concat(props); + return this; + }; + + Value.prototype.hasProperties = function() { + return !!this.properties.length; + }; + + Value.prototype.bareLiteral = function(type) { + return !this.properties.length && this.base instanceof type; + }; + + Value.prototype.isArray = function() { + return this.bareLiteral(Arr); + }; + + Value.prototype.isRange = function() { + return this.bareLiteral(Range); + }; + + Value.prototype.isComplex = function() { + return this.hasProperties() || this.base.isComplex(); + }; + + Value.prototype.isAssignable = function() { + return this.hasProperties() || this.base.isAssignable(); + }; + + Value.prototype.isNumber = function() { + return this.bareLiteral(NumberLiteral); + }; + + Value.prototype.isString = function() { + return this.bareLiteral(StringLiteral); + }; + + Value.prototype.isRegex = function() { + return this.bareLiteral(RegexLiteral); + }; + + Value.prototype.isUndefined = function() { + return this.bareLiteral(UndefinedLiteral); + }; + + Value.prototype.isNull = function() { + return this.bareLiteral(NullLiteral); + }; + + Value.prototype.isBoolean = function() { + return this.bareLiteral(BooleanLiteral); + }; + + Value.prototype.isAtomic = function() { + var j, len1, node, ref3; + ref3 = this.properties.concat(this.base); + for (j = 0, len1 = ref3.length; j < len1; j++) { + node = ref3[j]; + if (node.soak || node instanceof Call) { + return false; + } + } + return true; + }; + + Value.prototype.isNotCallable = function() { + return this.isNumber() || this.isString() || this.isRegex() || this.isArray() || this.isRange() || this.isSplice() || this.isObject() || this.isUndefined() || this.isNull() || this.isBoolean(); + }; + + Value.prototype.isStatement = function(o) { + return !this.properties.length && this.base.isStatement(o); + }; + + Value.prototype.assigns = function(name) { + return !this.properties.length && this.base.assigns(name); + }; + + Value.prototype.jumps = function(o) { + return !this.properties.length && this.base.jumps(o); + }; + + Value.prototype.isObject = function(onlyGenerated) { + if (this.properties.length) { + return false; + } + return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated); + }; + + Value.prototype.isSplice = function() { + var lastProp, ref3; + ref3 = this.properties, lastProp = ref3[ref3.length - 1]; + return lastProp instanceof Slice; + }; + + Value.prototype.looksStatic = function(className) { + var ref3; + return this.base.value === className && this.properties.length === 1 && ((ref3 = this.properties[0].name) != null ? ref3.value : void 0) !== 'prototype'; + }; + + Value.prototype.unwrap = function() { + if (this.properties.length) { + return this; + } else { + return this.base; + } + }; + + Value.prototype.cacheReference = function(o) { + var base, bref, name, nref, ref3; + ref3 = this.properties, name = ref3[ref3.length - 1]; + if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) { + return [this, this]; + } + base = new Value(this.base, this.properties.slice(0, -1)); + if (base.isComplex()) { + bref = new IdentifierLiteral(o.scope.freeVariable('base')); + base = new Value(new Parens(new Assign(bref, base))); + } + if (!name) { + return [base, bref]; + } + if (name.isComplex()) { + nref = new IdentifierLiteral(o.scope.freeVariable('name')); + name = new Index(new Assign(nref, name.index)); + nref = new Index(nref); + } + return [base.add(name), new Value(bref || base.base, [nref || name])]; + }; + + Value.prototype.compileNode = function(o) { + var fragments, j, len1, prop, props; + this.base.front = this.front; + props = this.properties; + fragments = this.base.compileToFragments(o, (props.length ? LEVEL_ACCESS : null)); + if (props.length && SIMPLENUM.test(fragmentsToText(fragments))) { + fragments.push(this.makeCode('.')); + } + for (j = 0, len1 = props.length; j < len1; j++) { + prop = props[j]; + fragments.push.apply(fragments, prop.compileToFragments(o)); + } + return fragments; + }; + + Value.prototype.unfoldSoak = function(o) { + return this.unfoldedSoak != null ? this.unfoldedSoak : this.unfoldedSoak = (function(_this) { + return function() { + var fst, i, ifn, j, len1, prop, ref, ref3, ref4, snd; + if (ifn = _this.base.unfoldSoak(o)) { + (ref3 = ifn.body.properties).push.apply(ref3, _this.properties); + return ifn; + } + ref4 = _this.properties; + for (i = j = 0, len1 = ref4.length; j < len1; i = ++j) { + prop = ref4[i]; + if (!prop.soak) { + continue; + } + prop.soak = false; + fst = new Value(_this.base, _this.properties.slice(0, i)); + snd = new Value(_this.base, _this.properties.slice(i)); + if (fst.isComplex()) { + ref = new IdentifierLiteral(o.scope.freeVariable('ref')); + fst = new Parens(new Assign(ref, fst)); + snd.base = ref; + } + return new If(new Existence(fst), snd, { + soak: true + }); + } + return false; + }; + })(this)(); + }; + + return Value; + + })(Base); + + exports.Comment = Comment = (function(superClass1) { + extend1(Comment, superClass1); + + function Comment(comment1) { + this.comment = comment1; + } + + Comment.prototype.isStatement = YES; + + Comment.prototype.makeReturn = THIS; + + Comment.prototype.compileNode = function(o, level) { + var code, comment; + comment = this.comment.replace(/^(\s*)#(?=\s)/gm, "$1 *"); + code = "/*" + (multident(comment, this.tab)) + (indexOf.call(comment, '\n') >= 0 ? "\n" + this.tab : '') + " */"; + if ((level || o.level) === LEVEL_TOP) { + code = o.indent + code; + } + return [this.makeCode("\n"), this.makeCode(code)]; + }; + + return Comment; + + })(Base); + + exports.Call = Call = (function(superClass1) { + extend1(Call, superClass1); + + function Call(variable1, args1, soak) { + this.variable = variable1; + this.args = args1 != null ? args1 : []; + this.soak = soak; + this.isNew = false; + if (this.variable instanceof Value && this.variable.isNotCallable()) { + this.variable.error("literal is not a function"); + } + } + + Call.prototype.children = ['variable', 'args']; + + Call.prototype.newInstance = function() { + var base, ref3; + base = ((ref3 = this.variable) != null ? ref3.base : void 0) || this.variable; + if (base instanceof Call && !base.isNew) { + base.newInstance(); + } else { + this.isNew = true; + } + return this; + }; + + Call.prototype.unfoldSoak = function(o) { + var call, ifn, j, left, len1, list, ref3, ref4, rite; + if (this.soak) { + if (this instanceof SuperCall) { + left = new Literal(this.superReference(o)); + rite = new Value(left); + } else { + if (ifn = unfoldSoak(o, this, 'variable')) { + return ifn; + } + ref3 = new Value(this.variable).cacheReference(o), left = ref3[0], rite = ref3[1]; + } + rite = new Call(rite, this.args); + rite.isNew = this.isNew; + left = new Literal("typeof " + (left.compile(o)) + " === \"function\""); + return new If(left, new Value(rite), { + soak: true + }); + } + call = this; + list = []; + while (true) { + if (call.variable instanceof Call) { + list.push(call); + call = call.variable; + continue; + } + if (!(call.variable instanceof Value)) { + break; + } + list.push(call); + if (!((call = call.variable.base) instanceof Call)) { + break; + } + } + ref4 = list.reverse(); + for (j = 0, len1 = ref4.length; j < len1; j++) { + call = ref4[j]; + if (ifn) { + if (call.variable instanceof Call) { + call.variable = ifn; + } else { + call.variable.base = ifn; + } + } + ifn = unfoldSoak(o, call, 'variable'); + } + return ifn; + }; + + Call.prototype.compileNode = function(o) { + var arg, argIndex, compiledArgs, compiledArray, fragments, j, len1, preface, ref3, ref4; + if ((ref3 = this.variable) != null) { + ref3.front = this.front; + } + compiledArray = Splat.compileSplattedArray(o, this.args, true); + if (compiledArray.length) { + return this.compileSplat(o, compiledArray); + } + compiledArgs = []; + ref4 = this.args; + for (argIndex = j = 0, len1 = ref4.length; j < len1; argIndex = ++j) { + arg = ref4[argIndex]; + if (argIndex) { + compiledArgs.push(this.makeCode(", ")); + } + compiledArgs.push.apply(compiledArgs, arg.compileToFragments(o, LEVEL_LIST)); + } + fragments = []; + if (this instanceof SuperCall) { + preface = this.superReference(o) + (".call(" + (this.superThis(o))); + if (compiledArgs.length) { + preface += ", "; + } + fragments.push(this.makeCode(preface)); + } else { + if (this.isNew) { + fragments.push(this.makeCode('new ')); + } + fragments.push.apply(fragments, this.variable.compileToFragments(o, LEVEL_ACCESS)); + fragments.push(this.makeCode("(")); + } + fragments.push.apply(fragments, compiledArgs); + fragments.push(this.makeCode(")")); + return fragments; + }; + + Call.prototype.compileSplat = function(o, splatArgs) { + var answer, base, fun, idt, name, ref; + if (this instanceof SuperCall) { + return [].concat(this.makeCode((this.superReference(o)) + ".apply(" + (this.superThis(o)) + ", "), splatArgs, this.makeCode(")")); + } + if (this.isNew) { + idt = this.tab + TAB; + return [].concat(this.makeCode("(function(func, args, ctor) {\n" + idt + "ctor.prototype = func.prototype;\n" + idt + "var child = new ctor, result = func.apply(child, args);\n" + idt + "return Object(result) === result ? result : child;\n" + this.tab + "})("), this.variable.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), splatArgs, this.makeCode(", function(){})")); + } + answer = []; + base = new Value(this.variable); + if ((name = base.properties.pop()) && base.isComplex()) { + ref = o.scope.freeVariable('ref'); + answer = answer.concat(this.makeCode("(" + ref + " = "), base.compileToFragments(o, LEVEL_LIST), this.makeCode(")"), name.compileToFragments(o)); + } else { + fun = base.compileToFragments(o, LEVEL_ACCESS); + if (SIMPLENUM.test(fragmentsToText(fun))) { + fun = this.wrapInBraces(fun); + } + if (name) { + ref = fragmentsToText(fun); + fun.push.apply(fun, name.compileToFragments(o)); + } else { + ref = 'null'; + } + answer = answer.concat(fun); + } + return answer = answer.concat(this.makeCode(".apply(" + ref + ", "), splatArgs, this.makeCode(")")); + }; + + return Call; + + })(Base); + + exports.SuperCall = SuperCall = (function(superClass1) { + extend1(SuperCall, superClass1); + + function SuperCall(args) { + SuperCall.__super__.constructor.call(this, null, args != null ? args : [new Splat(new IdentifierLiteral('arguments'))]); + this.isBare = args != null; + } + + SuperCall.prototype.superReference = function(o) { + var accesses, base, bref, klass, method, name, nref, variable; + method = o.scope.namedMethod(); + if (method != null ? method.klass : void 0) { + klass = method.klass, name = method.name, variable = method.variable; + if (klass.isComplex()) { + bref = new IdentifierLiteral(o.scope.parent.freeVariable('base')); + base = new Value(new Parens(new Assign(bref, klass))); + variable.base = base; + variable.properties.splice(0, klass.properties.length); + } + if (name.isComplex() || (name instanceof Index && name.index.isAssignable())) { + nref = new IdentifierLiteral(o.scope.parent.freeVariable('name')); + name = new Index(new Assign(nref, name.index)); + variable.properties.pop(); + variable.properties.push(name); + } + accesses = [new Access(new PropertyName('__super__'))]; + if (method["static"]) { + accesses.push(new Access(new PropertyName('constructor'))); + } + accesses.push(nref != null ? new Index(nref) : name); + return (new Value(bref != null ? bref : klass, accesses)).compile(o); + } else if (method != null ? method.ctor : void 0) { + return method.name + ".__super__.constructor"; + } else { + return this.error('cannot call super outside of an instance method.'); + } + }; + + SuperCall.prototype.superThis = function(o) { + var method; + method = o.scope.method; + return (method && !method.klass && method.context) || "this"; + }; + + return SuperCall; + + })(Call); + + exports.RegexWithInterpolations = RegexWithInterpolations = (function(superClass1) { + extend1(RegexWithInterpolations, superClass1); + + function RegexWithInterpolations(args) { + if (args == null) { + args = []; + } + RegexWithInterpolations.__super__.constructor.call(this, new Value(new IdentifierLiteral('RegExp')), args, false); + } + + return RegexWithInterpolations; + + })(Call); + + exports.Extends = Extends = (function(superClass1) { + extend1(Extends, superClass1); + + function Extends(child1, parent1) { + this.child = child1; + this.parent = parent1; + } + + Extends.prototype.children = ['child', 'parent']; + + Extends.prototype.compileToFragments = function(o) { + return new Call(new Value(new Literal(utility('extend', o))), [this.child, this.parent]).compileToFragments(o); + }; + + return Extends; + + })(Base); + + exports.Access = Access = (function(superClass1) { + extend1(Access, superClass1); + + function Access(name1, tag) { + this.name = name1; + this.soak = tag === 'soak'; + } + + Access.prototype.children = ['name']; + + Access.prototype.compileToFragments = function(o) { + var name, node, ref3; + name = this.name.compileToFragments(o); + node = this.name.unwrap(); + if (node instanceof PropertyName) { + if (ref3 = node.value, indexOf.call(JS_FORBIDDEN, ref3) >= 0) { + return [this.makeCode('["')].concat(slice.call(name), [this.makeCode('"]')]); + } else { + return [this.makeCode('.')].concat(slice.call(name)); + } + } else { + return [this.makeCode('[')].concat(slice.call(name), [this.makeCode(']')]); + } + }; + + Access.prototype.isComplex = NO; + + return Access; + + })(Base); + + exports.Index = Index = (function(superClass1) { + extend1(Index, superClass1); + + function Index(index1) { + this.index = index1; + } + + Index.prototype.children = ['index']; + + Index.prototype.compileToFragments = function(o) { + return [].concat(this.makeCode("["), this.index.compileToFragments(o, LEVEL_PAREN), this.makeCode("]")); + }; + + Index.prototype.isComplex = function() { + return this.index.isComplex(); + }; + + return Index; + + })(Base); + + exports.Range = Range = (function(superClass1) { + extend1(Range, superClass1); + + Range.prototype.children = ['from', 'to']; + + function Range(from1, to1, tag) { + this.from = from1; + this.to = to1; + this.exclusive = tag === 'exclusive'; + this.equals = this.exclusive ? '' : '='; + } + + Range.prototype.compileVariables = function(o) { + var isComplex, ref3, ref4, ref5, step; + o = merge(o, { + top: true + }); + isComplex = del(o, 'isComplex'); + ref3 = this.cacheToCodeFragments(this.from.cache(o, LEVEL_LIST, isComplex)), this.fromC = ref3[0], this.fromVar = ref3[1]; + ref4 = this.cacheToCodeFragments(this.to.cache(o, LEVEL_LIST, isComplex)), this.toC = ref4[0], this.toVar = ref4[1]; + if (step = del(o, 'step')) { + ref5 = this.cacheToCodeFragments(step.cache(o, LEVEL_LIST, isComplex)), this.step = ref5[0], this.stepVar = ref5[1]; + } + this.fromNum = this.from.isNumber() ? Number(this.fromVar) : null; + this.toNum = this.to.isNumber() ? Number(this.toVar) : null; + return this.stepNum = (step != null ? step.isNumber() : void 0) ? Number(this.stepVar) : null; + }; + + Range.prototype.compileNode = function(o) { + var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, ref3, ref4, stepPart, to, varPart; + if (!this.fromVar) { + this.compileVariables(o); + } + if (!o.index) { + return this.compileArray(o); + } + known = (this.fromNum != null) && (this.toNum != null); + idx = del(o, 'index'); + idxName = del(o, 'name'); + namedIndex = idxName && idxName !== idx; + varPart = idx + " = " + this.fromC; + if (this.toC !== this.toVar) { + varPart += ", " + this.toC; + } + if (this.step !== this.stepVar) { + varPart += ", " + this.step; + } + ref3 = [idx + " <" + this.equals, idx + " >" + this.equals], lt = ref3[0], gt = ref3[1]; + condPart = this.stepNum != null ? this.stepNum > 0 ? lt + " " + this.toVar : gt + " " + this.toVar : known ? ((ref4 = [this.fromNum, this.toNum], from = ref4[0], to = ref4[1], ref4), from <= to ? lt + " " + to : gt + " " + to) : (cond = this.stepVar ? this.stepVar + " > 0" : this.fromVar + " <= " + this.toVar, cond + " ? " + lt + " " + this.toVar + " : " + gt + " " + this.toVar); + stepPart = this.stepVar ? idx + " += " + this.stepVar : known ? namedIndex ? from <= to ? "++" + idx : "--" + idx : from <= to ? idx + "++" : idx + "--" : namedIndex ? cond + " ? ++" + idx + " : --" + idx : cond + " ? " + idx + "++ : " + idx + "--"; + if (namedIndex) { + varPart = idxName + " = " + varPart; + } + if (namedIndex) { + stepPart = idxName + " = " + stepPart; + } + return [this.makeCode(varPart + "; " + condPart + "; " + stepPart)]; + }; + + Range.prototype.compileArray = function(o) { + var args, body, cond, hasArgs, i, idt, j, known, post, pre, range, ref3, ref4, result, results, vars; + known = (this.fromNum != null) && (this.toNum != null); + if (known && Math.abs(this.fromNum - this.toNum) <= 20) { + range = (function() { + results = []; + for (var j = ref3 = this.fromNum, ref4 = this.toNum; ref3 <= ref4 ? j <= ref4 : j >= ref4; ref3 <= ref4 ? j++ : j--){ results.push(j); } + return results; + }).apply(this); + if (this.exclusive) { + range.pop(); + } + return [this.makeCode("[" + (range.join(', ')) + "]")]; + } + idt = this.tab + TAB; + i = o.scope.freeVariable('i', { + single: true + }); + result = o.scope.freeVariable('results'); + pre = "\n" + idt + result + " = [];"; + if (known) { + o.index = i; + body = fragmentsToText(this.compileNode(o)); + } else { + vars = (i + " = " + this.fromC) + (this.toC !== this.toVar ? ", " + this.toC : ''); + cond = this.fromVar + " <= " + this.toVar; + body = "var " + vars + "; " + cond + " ? " + i + " <" + this.equals + " " + this.toVar + " : " + i + " >" + this.equals + " " + this.toVar + "; " + cond + " ? " + i + "++ : " + i + "--"; + } + post = "{ " + result + ".push(" + i + "); }\n" + idt + "return " + result + ";\n" + o.indent; + hasArgs = function(node) { + return node != null ? node.contains(isLiteralArguments) : void 0; + }; + if (hasArgs(this.from) || hasArgs(this.to)) { + args = ', arguments'; + } + return [this.makeCode("(function() {" + pre + "\n" + idt + "for (" + body + ")" + post + "}).apply(this" + (args != null ? args : '') + ")")]; + }; + + return Range; + + })(Base); + + exports.Slice = Slice = (function(superClass1) { + extend1(Slice, superClass1); + + Slice.prototype.children = ['range']; + + function Slice(range1) { + this.range = range1; + Slice.__super__.constructor.call(this); + } + + Slice.prototype.compileNode = function(o) { + var compiled, compiledText, from, fromCompiled, ref3, to, toStr; + ref3 = this.range, to = ref3.to, from = ref3.from; + fromCompiled = from && from.compileToFragments(o, LEVEL_PAREN) || [this.makeCode('0')]; + if (to) { + compiled = to.compileToFragments(o, LEVEL_PAREN); + compiledText = fragmentsToText(compiled); + if (!(!this.range.exclusive && +compiledText === -1)) { + toStr = ', ' + (this.range.exclusive ? compiledText : to.isNumber() ? "" + (+compiledText + 1) : (compiled = to.compileToFragments(o, LEVEL_ACCESS), "+" + (fragmentsToText(compiled)) + " + 1 || 9e9")); + } + } + return [this.makeCode(".slice(" + (fragmentsToText(fromCompiled)) + (toStr || '') + ")")]; + }; + + return Slice; + + })(Base); + + exports.Obj = Obj = (function(superClass1) { + extend1(Obj, superClass1); + + function Obj(props, generated) { + this.generated = generated != null ? generated : false; + this.objects = this.properties = props || []; + } + + Obj.prototype.children = ['properties']; + + Obj.prototype.compileNode = function(o) { + var answer, dynamicIndex, hasDynamic, i, idt, indent, j, join, k, key, l, lastNoncom, len1, len2, len3, node, oref, prop, props, ref3, value; + props = this.properties; + if (this.generated) { + for (j = 0, len1 = props.length; j < len1; j++) { + node = props[j]; + if (node instanceof Value) { + node.error('cannot have an implicit value in an implicit object'); + } + } + } + for (dynamicIndex = k = 0, len2 = props.length; k < len2; dynamicIndex = ++k) { + prop = props[dynamicIndex]; + if ((prop.variable || prop).base instanceof Parens) { + break; + } + } + hasDynamic = dynamicIndex < props.length; + idt = o.indent += TAB; + lastNoncom = this.lastNonComment(this.properties); + answer = []; + if (hasDynamic) { + oref = o.scope.freeVariable('obj'); + answer.push(this.makeCode("(\n" + idt + oref + " = ")); + } + answer.push(this.makeCode("{" + (props.length === 0 || dynamicIndex === 0 ? '}' : '\n'))); + for (i = l = 0, len3 = props.length; l < len3; i = ++l) { + prop = props[i]; + if (i === dynamicIndex) { + if (i !== 0) { + answer.push(this.makeCode("\n" + idt + "}")); + } + answer.push(this.makeCode(',\n')); + } + join = i === props.length - 1 || i === dynamicIndex - 1 ? '' : prop === lastNoncom || prop instanceof Comment ? '\n' : ',\n'; + indent = prop instanceof Comment ? '' : idt; + if (hasDynamic && i < dynamicIndex) { + indent += TAB; + } + if (prop instanceof Assign) { + if (prop.context !== 'object') { + prop.operatorToken.error("unexpected " + prop.operatorToken.value); + } + if (prop.variable instanceof Value && prop.variable.hasProperties()) { + prop.variable.error('invalid object key'); + } + } + if (prop instanceof Value && prop["this"]) { + prop = new Assign(prop.properties[0].name, prop, 'object'); + } + if (!(prop instanceof Comment)) { + if (i < dynamicIndex) { + if (!(prop instanceof Assign)) { + prop = new Assign(prop, prop, 'object'); + } + } else { + if (prop instanceof Assign) { + key = prop.variable; + value = prop.value; + } else { + ref3 = prop.base.cache(o), key = ref3[0], value = ref3[1]; + if (key instanceof IdentifierLiteral) { + key = new PropertyName(key.value); + } + } + prop = new Assign(new Value(new IdentifierLiteral(oref), [new Access(key)]), value); + } + } + if (indent) { + answer.push(this.makeCode(indent)); + } + answer.push.apply(answer, prop.compileToFragments(o, LEVEL_TOP)); + if (join) { + answer.push(this.makeCode(join)); + } + } + if (hasDynamic) { + answer.push(this.makeCode(",\n" + idt + oref + "\n" + this.tab + ")")); + } else { + if (props.length !== 0) { + answer.push(this.makeCode("\n" + this.tab + "}")); + } + } + if (this.front && !hasDynamic) { + return this.wrapInBraces(answer); + } else { + return answer; + } + }; + + Obj.prototype.assigns = function(name) { + var j, len1, prop, ref3; + ref3 = this.properties; + for (j = 0, len1 = ref3.length; j < len1; j++) { + prop = ref3[j]; + if (prop.assigns(name)) { + return true; + } + } + return false; + }; + + return Obj; + + })(Base); + + exports.Arr = Arr = (function(superClass1) { + extend1(Arr, superClass1); + + function Arr(objs) { + this.objects = objs || []; + } + + Arr.prototype.children = ['objects']; + + Arr.prototype.compileNode = function(o) { + var answer, compiledObjs, fragments, index, j, len1, obj; + if (!this.objects.length) { + return [this.makeCode('[]')]; + } + o.indent += TAB; + answer = Splat.compileSplattedArray(o, this.objects); + if (answer.length) { + return answer; + } + answer = []; + compiledObjs = (function() { + var j, len1, ref3, results; + ref3 = this.objects; + results = []; + for (j = 0, len1 = ref3.length; j < len1; j++) { + obj = ref3[j]; + results.push(obj.compileToFragments(o, LEVEL_LIST)); + } + return results; + }).call(this); + for (index = j = 0, len1 = compiledObjs.length; j < len1; index = ++j) { + fragments = compiledObjs[index]; + if (index) { + answer.push(this.makeCode(", ")); + } + answer.push.apply(answer, fragments); + } + if (fragmentsToText(answer).indexOf('\n') >= 0) { + answer.unshift(this.makeCode("[\n" + o.indent)); + answer.push(this.makeCode("\n" + this.tab + "]")); + } else { + answer.unshift(this.makeCode("[")); + answer.push(this.makeCode("]")); + } + return answer; + }; + + Arr.prototype.assigns = function(name) { + var j, len1, obj, ref3; + ref3 = this.objects; + for (j = 0, len1 = ref3.length; j < len1; j++) { + obj = ref3[j]; + if (obj.assigns(name)) { + return true; + } + } + return false; + }; + + return Arr; + + })(Base); + + exports.Class = Class = (function(superClass1) { + extend1(Class, superClass1); + + function Class(variable1, parent1, body1) { + this.variable = variable1; + this.parent = parent1; + this.body = body1 != null ? body1 : new Block; + this.boundFuncs = []; + this.body.classBody = true; + } + + Class.prototype.children = ['variable', 'parent', 'body']; + + Class.prototype.defaultClassVariableName = '_Class'; + + Class.prototype.determineName = function() { + var message, name, node, ref3, tail; + if (!this.variable) { + return this.defaultClassVariableName; + } + ref3 = this.variable.properties, tail = ref3[ref3.length - 1]; + node = tail ? tail instanceof Access && tail.name : this.variable.base; + if (!(node instanceof IdentifierLiteral || node instanceof PropertyName)) { + return this.defaultClassVariableName; + } + name = node.value; + if (!tail) { + message = isUnassignable(name); + if (message) { + this.variable.error(message); + } + } + if (indexOf.call(JS_FORBIDDEN, name) >= 0) { + return "_" + name; + } else { + return name; + } + }; + + Class.prototype.setContext = function(name) { + return this.body.traverseChildren(false, function(node) { + if (node.classBody) { + return false; + } + if (node instanceof ThisLiteral) { + return node.value = name; + } else if (node instanceof Code) { + if (node.bound) { + return node.context = name; + } + } + }); + }; + + Class.prototype.addBoundFunctions = function(o) { + var bvar, j, len1, lhs, ref3; + ref3 = this.boundFuncs; + for (j = 0, len1 = ref3.length; j < len1; j++) { + bvar = ref3[j]; + lhs = (new Value(new ThisLiteral, [new Access(bvar)])).compile(o); + this.ctor.body.unshift(new Literal(lhs + " = " + (utility('bind', o)) + "(" + lhs + ", this)")); + } + }; + + Class.prototype.addProperties = function(node, name, o) { + var acc, assign, base, exprs, func, props; + props = node.base.properties.slice(0); + exprs = (function() { + var results; + results = []; + while (assign = props.shift()) { + if (assign instanceof Assign) { + base = assign.variable.base; + delete assign.context; + func = assign.value; + if (base.value === 'constructor') { + if (this.ctor) { + assign.error('cannot define more than one constructor in a class'); + } + if (func.bound) { + assign.error('cannot define a constructor as a bound function'); + } + if (func instanceof Code) { + assign = this.ctor = func; + } else { + this.externalCtor = o.classScope.freeVariable('ctor'); + assign = new Assign(new IdentifierLiteral(this.externalCtor), func); + } + } else { + if (assign.variable["this"]) { + func["static"] = true; + } else { + acc = base.isComplex() ? new Index(base) : new Access(base); + assign.variable = new Value(new IdentifierLiteral(name), [new Access(new PropertyName('prototype')), acc]); + if (func instanceof Code && func.bound) { + this.boundFuncs.push(base); + func.bound = false; + } + } + } + } + results.push(assign); + } + return results; + }).call(this); + return compact(exprs); + }; + + Class.prototype.walkBody = function(name, o) { + return this.traverseChildren(false, (function(_this) { + return function(child) { + var cont, exps, i, j, len1, node, ref3; + cont = true; + if (child instanceof Class) { + return false; + } + if (child instanceof Block) { + ref3 = exps = child.expressions; + for (i = j = 0, len1 = ref3.length; j < len1; i = ++j) { + node = ref3[i]; + if (node instanceof Assign && node.variable.looksStatic(name)) { + node.value["static"] = true; + } else if (node instanceof Value && node.isObject(true)) { + cont = false; + exps[i] = _this.addProperties(node, name, o); + } + } + child.expressions = exps = flatten(exps); + } + return cont && !(child instanceof Class); + }; + })(this)); + }; + + Class.prototype.hoistDirectivePrologue = function() { + var expressions, index, node; + index = 0; + expressions = this.body.expressions; + while ((node = expressions[index]) && node instanceof Comment || node instanceof Value && node.isString()) { + ++index; + } + return this.directives = expressions.splice(0, index); + }; + + Class.prototype.ensureConstructor = function(name) { + if (!this.ctor) { + this.ctor = new Code; + if (this.externalCtor) { + this.ctor.body.push(new Literal(this.externalCtor + ".apply(this, arguments)")); + } else if (this.parent) { + this.ctor.body.push(new Literal(name + ".__super__.constructor.apply(this, arguments)")); + } + this.ctor.body.makeReturn(); + this.body.expressions.unshift(this.ctor); + } + this.ctor.ctor = this.ctor.name = name; + this.ctor.klass = null; + return this.ctor.noReturn = true; + }; + + Class.prototype.compileNode = function(o) { + var args, argumentsNode, func, jumpNode, klass, lname, name, ref3, superClass; + if (jumpNode = this.body.jumps()) { + jumpNode.error('Class bodies cannot contain pure statements'); + } + if (argumentsNode = this.body.contains(isLiteralArguments)) { + argumentsNode.error("Class bodies shouldn't reference arguments"); + } + name = this.determineName(); + lname = new IdentifierLiteral(name); + func = new Code([], Block.wrap([this.body])); + args = []; + o.classScope = func.makeScope(o.scope); + this.hoistDirectivePrologue(); + this.setContext(name); + this.walkBody(name, o); + this.ensureConstructor(name); + this.addBoundFunctions(o); + this.body.spaced = true; + this.body.expressions.push(lname); + if (this.parent) { + superClass = new IdentifierLiteral(o.classScope.freeVariable('superClass', { + reserve: false + })); + this.body.expressions.unshift(new Extends(lname, superClass)); + func.params.push(new Param(superClass)); + args.push(this.parent); + } + (ref3 = this.body.expressions).unshift.apply(ref3, this.directives); + klass = new Parens(new Call(func, args)); + if (this.variable) { + klass = new Assign(this.variable, klass, null, { + moduleDeclaration: this.moduleDeclaration + }); + } + return klass.compileToFragments(o); + }; + + return Class; + + })(Base); + + exports.ModuleDeclaration = ModuleDeclaration = (function(superClass1) { + extend1(ModuleDeclaration, superClass1); + + function ModuleDeclaration(clause, source1) { + this.clause = clause; + this.source = source1; + this.checkSource(); + } + + ModuleDeclaration.prototype.children = ['clause', 'source']; + + ModuleDeclaration.prototype.isStatement = YES; + + ModuleDeclaration.prototype.jumps = THIS; + + ModuleDeclaration.prototype.makeReturn = THIS; + + ModuleDeclaration.prototype.checkSource = function() { + if ((this.source != null) && this.source instanceof StringWithInterpolations) { + return this.source.error('the name of the module to be imported from must be an uninterpolated string'); + } + }; + + ModuleDeclaration.prototype.checkScope = function(o, moduleDeclarationType) { + if (o.indent.length !== 0) { + return this.error(moduleDeclarationType + " statements must be at top-level scope"); + } + }; + + return ModuleDeclaration; + + })(Base); + + exports.ImportDeclaration = ImportDeclaration = (function(superClass1) { + extend1(ImportDeclaration, superClass1); + + function ImportDeclaration() { + return ImportDeclaration.__super__.constructor.apply(this, arguments); + } + + ImportDeclaration.prototype.compileNode = function(o) { + var code, ref3; + this.checkScope(o, 'import'); + o.importedSymbols = []; + code = []; + code.push(this.makeCode(this.tab + "import ")); + if (this.clause != null) { + code.push.apply(code, this.clause.compileNode(o)); + } + if (((ref3 = this.source) != null ? ref3.value : void 0) != null) { + if (this.clause !== null) { + code.push(this.makeCode(' from ')); + } + code.push(this.makeCode(this.source.value)); + } + code.push(this.makeCode(';')); + return code; + }; + + return ImportDeclaration; + + })(ModuleDeclaration); + + exports.ImportClause = ImportClause = (function(superClass1) { + extend1(ImportClause, superClass1); + + function ImportClause(defaultBinding, namedImports) { + this.defaultBinding = defaultBinding; + this.namedImports = namedImports; + } + + ImportClause.prototype.children = ['defaultBinding', 'namedImports']; + + ImportClause.prototype.compileNode = function(o) { + var code; + code = []; + if (this.defaultBinding != null) { + code.push.apply(code, this.defaultBinding.compileNode(o)); + if (this.namedImports != null) { + code.push(this.makeCode(', ')); + } + } + if (this.namedImports != null) { + code.push.apply(code, this.namedImports.compileNode(o)); + } + return code; + }; + + return ImportClause; + + })(Base); + + exports.ExportDeclaration = ExportDeclaration = (function(superClass1) { + extend1(ExportDeclaration, superClass1); + + function ExportDeclaration() { + return ExportDeclaration.__super__.constructor.apply(this, arguments); + } + + ExportDeclaration.prototype.compileNode = function(o) { + var code, ref3; + this.checkScope(o, 'export'); + code = []; + code.push(this.makeCode(this.tab + "export ")); + if (this instanceof ExportDefaultDeclaration) { + code.push(this.makeCode('default ')); + } + if (!(this instanceof ExportDefaultDeclaration) && (this.clause instanceof Assign || this.clause instanceof Class)) { + code.push(this.makeCode('var ')); + this.clause.moduleDeclaration = 'export'; + } + if ((this.clause.body != null) && this.clause.body instanceof Block) { + code = code.concat(this.clause.compileToFragments(o, LEVEL_TOP)); + } else { + code = code.concat(this.clause.compileNode(o)); + } + if (((ref3 = this.source) != null ? ref3.value : void 0) != null) { + code.push(this.makeCode(" from " + this.source.value)); + } + code.push(this.makeCode(';')); + return code; + }; + + return ExportDeclaration; + + })(ModuleDeclaration); + + exports.ExportNamedDeclaration = ExportNamedDeclaration = (function(superClass1) { + extend1(ExportNamedDeclaration, superClass1); + + function ExportNamedDeclaration() { + return ExportNamedDeclaration.__super__.constructor.apply(this, arguments); + } + + return ExportNamedDeclaration; + + })(ExportDeclaration); + + exports.ExportDefaultDeclaration = ExportDefaultDeclaration = (function(superClass1) { + extend1(ExportDefaultDeclaration, superClass1); + + function ExportDefaultDeclaration() { + return ExportDefaultDeclaration.__super__.constructor.apply(this, arguments); + } + + return ExportDefaultDeclaration; + + })(ExportDeclaration); + + exports.ExportAllDeclaration = ExportAllDeclaration = (function(superClass1) { + extend1(ExportAllDeclaration, superClass1); + + function ExportAllDeclaration() { + return ExportAllDeclaration.__super__.constructor.apply(this, arguments); + } + + return ExportAllDeclaration; + + })(ExportDeclaration); + + exports.ModuleSpecifierList = ModuleSpecifierList = (function(superClass1) { + extend1(ModuleSpecifierList, superClass1); + + function ModuleSpecifierList(specifiers) { + this.specifiers = specifiers; + } + + ModuleSpecifierList.prototype.children = ['specifiers']; + + ModuleSpecifierList.prototype.compileNode = function(o) { + var code, compiledList, fragments, index, j, len1, specifier; + code = []; + o.indent += TAB; + compiledList = (function() { + var j, len1, ref3, results; + ref3 = this.specifiers; + results = []; + for (j = 0, len1 = ref3.length; j < len1; j++) { + specifier = ref3[j]; + results.push(specifier.compileToFragments(o, LEVEL_LIST)); + } + return results; + }).call(this); + if (this.specifiers.length !== 0) { + code.push(this.makeCode("{\n" + o.indent)); + for (index = j = 0, len1 = compiledList.length; j < len1; index = ++j) { + fragments = compiledList[index]; + if (index) { + code.push(this.makeCode(",\n" + o.indent)); + } + code.push.apply(code, fragments); + } + code.push(this.makeCode("\n}")); + } else { + code.push(this.makeCode('{}')); + } + return code; + }; + + return ModuleSpecifierList; + + })(Base); + + exports.ImportSpecifierList = ImportSpecifierList = (function(superClass1) { + extend1(ImportSpecifierList, superClass1); + + function ImportSpecifierList() { + return ImportSpecifierList.__super__.constructor.apply(this, arguments); + } + + return ImportSpecifierList; + + })(ModuleSpecifierList); + + exports.ExportSpecifierList = ExportSpecifierList = (function(superClass1) { + extend1(ExportSpecifierList, superClass1); + + function ExportSpecifierList() { + return ExportSpecifierList.__super__.constructor.apply(this, arguments); + } + + return ExportSpecifierList; + + })(ModuleSpecifierList); + + exports.ModuleSpecifier = ModuleSpecifier = (function(superClass1) { + extend1(ModuleSpecifier, superClass1); + + function ModuleSpecifier(original, alias, moduleDeclarationType1) { + this.original = original; + this.alias = alias; + this.moduleDeclarationType = moduleDeclarationType1; + this.identifier = this.alias != null ? this.alias.value : this.original.value; + } + + ModuleSpecifier.prototype.children = ['original', 'alias']; + + ModuleSpecifier.prototype.compileNode = function(o) { + var code; + o.scope.add(this.identifier, this.moduleDeclarationType); + code = []; + code.push(this.makeCode(this.original.value)); + if (this.alias != null) { + code.push(this.makeCode(" as " + this.alias.value)); + } + return code; + }; + + return ModuleSpecifier; + + })(Base); + + exports.ImportSpecifier = ImportSpecifier = (function(superClass1) { + extend1(ImportSpecifier, superClass1); + + function ImportSpecifier(imported, local) { + ImportSpecifier.__super__.constructor.call(this, imported, local, 'import'); + } + + ImportSpecifier.prototype.compileNode = function(o) { + var ref3; + if ((ref3 = this.identifier, indexOf.call(o.importedSymbols, ref3) >= 0) || o.scope.check(this.identifier)) { + this.error("'" + this.identifier + "' has already been declared"); + } else { + o.importedSymbols.push(this.identifier); + } + return ImportSpecifier.__super__.compileNode.call(this, o); + }; + + return ImportSpecifier; + + })(ModuleSpecifier); + + exports.ImportDefaultSpecifier = ImportDefaultSpecifier = (function(superClass1) { + extend1(ImportDefaultSpecifier, superClass1); + + function ImportDefaultSpecifier() { + return ImportDefaultSpecifier.__super__.constructor.apply(this, arguments); + } + + return ImportDefaultSpecifier; + + })(ImportSpecifier); + + exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier = (function(superClass1) { + extend1(ImportNamespaceSpecifier, superClass1); + + function ImportNamespaceSpecifier() { + return ImportNamespaceSpecifier.__super__.constructor.apply(this, arguments); + } + + return ImportNamespaceSpecifier; + + })(ImportSpecifier); + + exports.ExportSpecifier = ExportSpecifier = (function(superClass1) { + extend1(ExportSpecifier, superClass1); + + function ExportSpecifier(local, exported) { + ExportSpecifier.__super__.constructor.call(this, local, exported, 'export'); + } + + return ExportSpecifier; + + })(ModuleSpecifier); + + exports.Assign = Assign = (function(superClass1) { + extend1(Assign, superClass1); + + function Assign(variable1, value1, context, options) { + this.variable = variable1; + this.value = value1; + this.context = context; + if (options == null) { + options = {}; + } + this.param = options.param, this.subpattern = options.subpattern, this.operatorToken = options.operatorToken, this.moduleDeclaration = options.moduleDeclaration; + } + + Assign.prototype.children = ['variable', 'value']; + + Assign.prototype.isStatement = function(o) { + return (o != null ? o.level : void 0) === LEVEL_TOP && (this.context != null) && (this.moduleDeclaration || indexOf.call(this.context, "?") >= 0); + }; + + Assign.prototype.checkAssignability = function(o, varBase) { + if (Object.prototype.hasOwnProperty.call(o.scope.positions, varBase.value) && o.scope.variables[o.scope.positions[varBase.value]].type === 'import') { + return varBase.error("'" + varBase.value + "' is read-only"); + } + }; + + Assign.prototype.assigns = function(name) { + return this[this.context === 'object' ? 'value' : 'variable'].assigns(name); + }; + + Assign.prototype.unfoldSoak = function(o) { + return unfoldSoak(o, this, 'variable'); + }; + + Assign.prototype.compileNode = function(o) { + var answer, compiledName, isValue, j, name, properties, prototype, ref3, ref4, ref5, ref6, ref7, ref8, val, varBase; + if (isValue = this.variable instanceof Value) { + if (this.variable.isArray() || this.variable.isObject()) { + return this.compilePatternMatch(o); + } + if (this.variable.isSplice()) { + return this.compileSplice(o); + } + if ((ref3 = this.context) === '||=' || ref3 === '&&=' || ref3 === '?=') { + return this.compileConditional(o); + } + if ((ref4 = this.context) === '**=' || ref4 === '//=' || ref4 === '%%=') { + return this.compileSpecialMath(o); + } + } + if (this.value instanceof Code) { + if (this.value["static"]) { + this.value.klass = this.variable.base; + this.value.name = this.variable.properties[0]; + this.value.variable = this.variable; + } else if (((ref5 = this.variable.properties) != null ? ref5.length : void 0) >= 2) { + ref6 = this.variable.properties, properties = 3 <= ref6.length ? slice.call(ref6, 0, j = ref6.length - 2) : (j = 0, []), prototype = ref6[j++], name = ref6[j++]; + if (((ref7 = prototype.name) != null ? ref7.value : void 0) === 'prototype') { + this.value.klass = new Value(this.variable.base, properties); + this.value.name = name; + this.value.variable = this.variable; + } + } + } + if (!this.context) { + varBase = this.variable.unwrapAll(); + if (!varBase.isAssignable()) { + this.variable.error("'" + (this.variable.compile(o)) + "' can't be assigned"); + } + if (!(typeof varBase.hasProperties === "function" ? varBase.hasProperties() : void 0)) { + if (this.moduleDeclaration) { + this.checkAssignability(o, varBase); + o.scope.add(varBase.value, this.moduleDeclaration); + } else if (this.param) { + o.scope.add(varBase.value, 'var'); + } else { + this.checkAssignability(o, varBase); + o.scope.find(varBase.value); + } + } + } + val = this.value.compileToFragments(o, LEVEL_LIST); + if (isValue && this.variable.base instanceof Obj) { + this.variable.front = true; + } + compiledName = this.variable.compileToFragments(o, LEVEL_LIST); + if (this.context === 'object') { + if (ref8 = fragmentsToText(compiledName), indexOf.call(JS_FORBIDDEN, ref8) >= 0) { + compiledName.unshift(this.makeCode('"')); + compiledName.push(this.makeCode('"')); + } + return compiledName.concat(this.makeCode(": "), val); + } + answer = compiledName.concat(this.makeCode(" " + (this.context || '=') + " "), val); + if (o.level <= LEVEL_LIST) { + return answer; + } else { + return this.wrapInBraces(answer); + } + }; + + Assign.prototype.compilePatternMatch = function(o) { + var acc, assigns, code, defaultValue, expandedIdx, fragments, i, idx, isObject, ivar, j, len1, message, name, obj, objects, olen, ref, ref3, ref4, ref5, ref6, rest, top, val, value, vvar, vvarText; + top = o.level === LEVEL_TOP; + value = this.value; + objects = this.variable.base.objects; + if (!(olen = objects.length)) { + code = value.compileToFragments(o); + if (o.level >= LEVEL_OP) { + return this.wrapInBraces(code); + } else { + return code; + } + } + obj = objects[0]; + if (olen === 1 && obj instanceof Expansion) { + obj.error('Destructuring assignment has no target'); + } + isObject = this.variable.isObject(); + if (top && olen === 1 && !(obj instanceof Splat)) { + defaultValue = null; + if (obj instanceof Assign && obj.context === 'object') { + ref3 = obj, (ref4 = ref3.variable, idx = ref4.base), obj = ref3.value; + if (obj instanceof Assign) { + defaultValue = obj.value; + obj = obj.variable; + } + } else { + if (obj instanceof Assign) { + defaultValue = obj.value; + obj = obj.variable; + } + idx = isObject ? obj["this"] ? obj.properties[0].name : new PropertyName(obj.unwrap().value) : new NumberLiteral(0); + } + acc = idx.unwrap() instanceof PropertyName; + value = new Value(value); + value.properties.push(new (acc ? Access : Index)(idx)); + message = isUnassignable(obj.unwrap().value); + if (message) { + obj.error(message); + } + if (defaultValue) { + value = new Op('?', value, defaultValue); + } + return new Assign(obj, value, null, { + param: this.param + }).compileToFragments(o, LEVEL_TOP); + } + vvar = value.compileToFragments(o, LEVEL_LIST); + vvarText = fragmentsToText(vvar); + assigns = []; + expandedIdx = false; + if (!(value.unwrap() instanceof IdentifierLiteral) || this.variable.assigns(vvarText)) { + assigns.push([this.makeCode((ref = o.scope.freeVariable('ref')) + " = ")].concat(slice.call(vvar))); + vvar = [this.makeCode(ref)]; + vvarText = ref; + } + for (i = j = 0, len1 = objects.length; j < len1; i = ++j) { + obj = objects[i]; + idx = i; + if (!expandedIdx && obj instanceof Splat) { + name = obj.name.unwrap().value; + obj = obj.unwrap(); + val = olen + " <= " + vvarText + ".length ? " + (utility('slice', o)) + ".call(" + vvarText + ", " + i; + if (rest = olen - i - 1) { + ivar = o.scope.freeVariable('i', { + single: true + }); + val += ", " + ivar + " = " + vvarText + ".length - " + rest + ") : (" + ivar + " = " + i + ", [])"; + } else { + val += ") : []"; + } + val = new Literal(val); + expandedIdx = ivar + "++"; + } else if (!expandedIdx && obj instanceof Expansion) { + if (rest = olen - i - 1) { + if (rest === 1) { + expandedIdx = vvarText + ".length - 1"; + } else { + ivar = o.scope.freeVariable('i', { + single: true + }); + val = new Literal(ivar + " = " + vvarText + ".length - " + rest); + expandedIdx = ivar + "++"; + assigns.push(val.compileToFragments(o, LEVEL_LIST)); + } + } + continue; + } else { + if (obj instanceof Splat || obj instanceof Expansion) { + obj.error("multiple splats/expansions are disallowed in an assignment"); + } + defaultValue = null; + if (obj instanceof Assign && obj.context === 'object') { + ref5 = obj, (ref6 = ref5.variable, idx = ref6.base), obj = ref5.value; + if (obj instanceof Assign) { + defaultValue = obj.value; + obj = obj.variable; + } + } else { + if (obj instanceof Assign) { + defaultValue = obj.value; + obj = obj.variable; + } + idx = isObject ? obj["this"] ? obj.properties[0].name : new PropertyName(obj.unwrap().value) : new Literal(expandedIdx || idx); + } + name = obj.unwrap().value; + acc = idx.unwrap() instanceof PropertyName; + val = new Value(new Literal(vvarText), [new (acc ? Access : Index)(idx)]); + if (defaultValue) { + val = new Op('?', val, defaultValue); + } + } + if (name != null) { + message = isUnassignable(name); + if (message) { + obj.error(message); + } + } + assigns.push(new Assign(obj, val, null, { + param: this.param, + subpattern: true + }).compileToFragments(o, LEVEL_LIST)); + } + if (!(top || this.subpattern)) { + assigns.push(vvar); + } + fragments = this.joinFragmentArrays(assigns, ', '); + if (o.level < LEVEL_LIST) { + return fragments; + } else { + return this.wrapInBraces(fragments); + } + }; + + Assign.prototype.compileConditional = function(o) { + var fragments, left, ref3, right; + ref3 = this.variable.cacheReference(o), left = ref3[0], right = ref3[1]; + if (!left.properties.length && left.base instanceof Literal && !(left.base instanceof ThisLiteral) && !o.scope.check(left.base.value)) { + this.variable.error("the variable \"" + left.base.value + "\" can't be assigned with " + this.context + " because it has not been declared before"); + } + if (indexOf.call(this.context, "?") >= 0) { + o.isExistentialEquals = true; + return new If(new Existence(left), right, { + type: 'if' + }).addElse(new Assign(right, this.value, '=')).compileToFragments(o); + } else { + fragments = new Op(this.context.slice(0, -1), left, new Assign(right, this.value, '=')).compileToFragments(o); + if (o.level <= LEVEL_LIST) { + return fragments; + } else { + return this.wrapInBraces(fragments); + } + } + }; + + Assign.prototype.compileSpecialMath = function(o) { + var left, ref3, right; + ref3 = this.variable.cacheReference(o), left = ref3[0], right = ref3[1]; + return new Assign(left, new Op(this.context.slice(0, -1), right, this.value)).compileToFragments(o); + }; + + Assign.prototype.compileSplice = function(o) { + var answer, exclusive, from, fromDecl, fromRef, name, ref3, ref4, ref5, to, valDef, valRef; + ref3 = this.variable.properties.pop().range, from = ref3.from, to = ref3.to, exclusive = ref3.exclusive; + name = this.variable.compile(o); + if (from) { + ref4 = this.cacheToCodeFragments(from.cache(o, LEVEL_OP)), fromDecl = ref4[0], fromRef = ref4[1]; + } else { + fromDecl = fromRef = '0'; + } + if (to) { + if ((from != null ? from.isNumber() : void 0) && to.isNumber()) { + to = to.compile(o) - fromRef; + if (!exclusive) { + to += 1; + } + } else { + to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef; + if (!exclusive) { + to += ' + 1'; + } + } + } else { + to = "9e9"; + } + ref5 = this.value.cache(o, LEVEL_LIST), valDef = ref5[0], valRef = ref5[1]; + answer = [].concat(this.makeCode("[].splice.apply(" + name + ", [" + fromDecl + ", " + to + "].concat("), valDef, this.makeCode(")), "), valRef); + if (o.level > LEVEL_TOP) { + return this.wrapInBraces(answer); + } else { + return answer; + } + }; + + return Assign; + + })(Base); + + exports.Code = Code = (function(superClass1) { + extend1(Code, superClass1); + + function Code(params, body, tag) { + this.params = params || []; + this.body = body || new Block; + this.bound = tag === 'boundfunc'; + this.isGenerator = !!this.body.contains(function(node) { + return (node instanceof Op && node.isYield()) || node instanceof YieldReturn; + }); + } + + Code.prototype.children = ['params', 'body']; + + Code.prototype.isStatement = function() { + return !!this.ctor; + }; + + Code.prototype.jumps = NO; + + Code.prototype.makeScope = function(parentScope) { + return new Scope(parentScope, this.body, this); + }; + + Code.prototype.compileNode = function(o) { + var answer, boundfunc, code, exprs, i, j, k, l, len1, len2, len3, len4, len5, len6, lit, m, p, param, params, q, r, ref, ref3, ref4, ref5, ref6, ref7, ref8, splats, uniqs, val, wasEmpty, wrapper; + if (this.bound && ((ref3 = o.scope.method) != null ? ref3.bound : void 0)) { + this.context = o.scope.method.context; + } + if (this.bound && !this.context) { + this.context = '_this'; + wrapper = new Code([new Param(new IdentifierLiteral(this.context))], new Block([this])); + boundfunc = new Call(wrapper, [new ThisLiteral]); + boundfunc.updateLocationDataIfMissing(this.locationData); + return boundfunc.compileNode(o); + } + o.scope = del(o, 'classScope') || this.makeScope(o.scope); + o.scope.shared = del(o, 'sharedScope'); + o.indent += TAB; + delete o.bare; + delete o.isExistentialEquals; + params = []; + exprs = []; + ref4 = this.params; + for (j = 0, len1 = ref4.length; j < len1; j++) { + param = ref4[j]; + if (!(param instanceof Expansion)) { + o.scope.parameter(param.asReference(o)); + } + } + ref5 = this.params; + for (k = 0, len2 = ref5.length; k < len2; k++) { + param = ref5[k]; + if (!(param.splat || param instanceof Expansion)) { + continue; + } + ref6 = this.params; + for (l = 0, len3 = ref6.length; l < len3; l++) { + p = ref6[l]; + if (!(p instanceof Expansion) && p.name.value) { + o.scope.add(p.name.value, 'var', true); + } + } + splats = new Assign(new Value(new Arr((function() { + var len4, m, ref7, results; + ref7 = this.params; + results = []; + for (m = 0, len4 = ref7.length; m < len4; m++) { + p = ref7[m]; + results.push(p.asReference(o)); + } + return results; + }).call(this))), new Value(new IdentifierLiteral('arguments'))); + break; + } + ref7 = this.params; + for (m = 0, len4 = ref7.length; m < len4; m++) { + param = ref7[m]; + if (param.isComplex()) { + val = ref = param.asReference(o); + if (param.value) { + val = new Op('?', ref, param.value); + } + exprs.push(new Assign(new Value(param.name), val, '=', { + param: true + })); + } else { + ref = param; + if (param.value) { + lit = new Literal(ref.name.value + ' == null'); + val = new Assign(new Value(param.name), param.value, '='); + exprs.push(new If(lit, val)); + } + } + if (!splats) { + params.push(ref); + } + } + wasEmpty = this.body.isEmpty(); + if (splats) { + exprs.unshift(splats); + } + if (exprs.length) { + (ref8 = this.body.expressions).unshift.apply(ref8, exprs); + } + for (i = q = 0, len5 = params.length; q < len5; i = ++q) { + p = params[i]; + params[i] = p.compileToFragments(o); + o.scope.parameter(fragmentsToText(params[i])); + } + uniqs = []; + this.eachParamName(function(name, node) { + if (indexOf.call(uniqs, name) >= 0) { + node.error("multiple parameters named " + name); + } + return uniqs.push(name); + }); + if (!(wasEmpty || this.noReturn)) { + this.body.makeReturn(); + } + code = 'function'; + if (this.isGenerator) { + code += '*'; + } + if (this.ctor) { + code += ' ' + this.name; + } + code += '('; + answer = [this.makeCode(code)]; + for (i = r = 0, len6 = params.length; r < len6; i = ++r) { + p = params[i]; + if (i) { + answer.push(this.makeCode(", ")); + } + answer.push.apply(answer, p); + } + answer.push(this.makeCode(') {')); + if (!this.body.isEmpty()) { + answer = answer.concat(this.makeCode("\n"), this.body.compileWithDeclarations(o), this.makeCode("\n" + this.tab)); + } + answer.push(this.makeCode('}')); + if (this.ctor) { + return [this.makeCode(this.tab)].concat(slice.call(answer)); + } + if (this.front || (o.level >= LEVEL_ACCESS)) { + return this.wrapInBraces(answer); + } else { + return answer; + } + }; + + Code.prototype.eachParamName = function(iterator) { + var j, len1, param, ref3, results; + ref3 = this.params; + results = []; + for (j = 0, len1 = ref3.length; j < len1; j++) { + param = ref3[j]; + results.push(param.eachName(iterator)); + } + return results; + }; + + Code.prototype.traverseChildren = function(crossScope, func) { + if (crossScope) { + return Code.__super__.traverseChildren.call(this, crossScope, func); + } + }; + + return Code; + + })(Base); + + exports.Param = Param = (function(superClass1) { + extend1(Param, superClass1); + + function Param(name1, value1, splat) { + var message, token; + this.name = name1; + this.value = value1; + this.splat = splat; + message = isUnassignable(this.name.unwrapAll().value); + if (message) { + this.name.error(message); + } + if (this.name instanceof Obj && this.name.generated) { + token = this.name.objects[0].operatorToken; + token.error("unexpected " + token.value); + } + } + + Param.prototype.children = ['name', 'value']; + + Param.prototype.compileToFragments = function(o) { + return this.name.compileToFragments(o, LEVEL_LIST); + }; + + Param.prototype.asReference = function(o) { + var name, node; + if (this.reference) { + return this.reference; + } + node = this.name; + if (node["this"]) { + name = node.properties[0].name.value; + if (indexOf.call(JS_FORBIDDEN, name) >= 0) { + name = "_" + name; + } + node = new IdentifierLiteral(o.scope.freeVariable(name)); + } else if (node.isComplex()) { + node = new IdentifierLiteral(o.scope.freeVariable('arg')); + } + node = new Value(node); + if (this.splat) { + node = new Splat(node); + } + node.updateLocationDataIfMissing(this.locationData); + return this.reference = node; + }; + + Param.prototype.isComplex = function() { + return this.name.isComplex(); + }; + + Param.prototype.eachName = function(iterator, name) { + var atParam, j, len1, node, obj, ref3, ref4; + if (name == null) { + name = this.name; + } + atParam = function(obj) { + return iterator("@" + obj.properties[0].name.value, obj); + }; + if (name instanceof Literal) { + return iterator(name.value, name); + } + if (name instanceof Value) { + return atParam(name); + } + ref4 = (ref3 = name.objects) != null ? ref3 : []; + for (j = 0, len1 = ref4.length; j < len1; j++) { + obj = ref4[j]; + if (obj instanceof Assign && (obj.context == null)) { + obj = obj.variable; + } + if (obj instanceof Assign) { + if (obj.value instanceof Assign) { + obj = obj.value; + } + this.eachName(iterator, obj.value.unwrap()); + } else if (obj instanceof Splat) { + node = obj.name.unwrap(); + iterator(node.value, node); + } else if (obj instanceof Value) { + if (obj.isArray() || obj.isObject()) { + this.eachName(iterator, obj.base); + } else if (obj["this"]) { + atParam(obj); + } else { + iterator(obj.base.value, obj.base); + } + } else if (!(obj instanceof Expansion)) { + obj.error("illegal parameter " + (obj.compile())); + } + } + }; + + return Param; + + })(Base); + + exports.Splat = Splat = (function(superClass1) { + extend1(Splat, superClass1); + + Splat.prototype.children = ['name']; + + Splat.prototype.isAssignable = YES; + + function Splat(name) { + this.name = name.compile ? name : new Literal(name); + } + + Splat.prototype.assigns = function(name) { + return this.name.assigns(name); + }; + + Splat.prototype.compileToFragments = function(o) { + return this.name.compileToFragments(o); + }; + + Splat.prototype.unwrap = function() { + return this.name; + }; + + Splat.compileSplattedArray = function(o, list, apply) { + var args, base, compiledNode, concatPart, fragments, i, index, j, last, len1, node; + index = -1; + while ((node = list[++index]) && !(node instanceof Splat)) { + continue; + } + if (index >= list.length) { + return []; + } + if (list.length === 1) { + node = list[0]; + fragments = node.compileToFragments(o, LEVEL_LIST); + if (apply) { + return fragments; + } + return [].concat(node.makeCode((utility('slice', o)) + ".call("), fragments, node.makeCode(")")); + } + args = list.slice(index); + for (i = j = 0, len1 = args.length; j < len1; i = ++j) { + node = args[i]; + compiledNode = node.compileToFragments(o, LEVEL_LIST); + args[i] = node instanceof Splat ? [].concat(node.makeCode((utility('slice', o)) + ".call("), compiledNode, node.makeCode(")")) : [].concat(node.makeCode("["), compiledNode, node.makeCode("]")); + } + if (index === 0) { + node = list[0]; + concatPart = node.joinFragmentArrays(args.slice(1), ', '); + return args[0].concat(node.makeCode(".concat("), concatPart, node.makeCode(")")); + } + base = (function() { + var k, len2, ref3, results; + ref3 = list.slice(0, index); + results = []; + for (k = 0, len2 = ref3.length; k < len2; k++) { + node = ref3[k]; + results.push(node.compileToFragments(o, LEVEL_LIST)); + } + return results; + })(); + base = list[0].joinFragmentArrays(base, ', '); + concatPart = list[index].joinFragmentArrays(args, ', '); + last = list[list.length - 1]; + return [].concat(list[0].makeCode("["), base, list[index].makeCode("].concat("), concatPart, last.makeCode(")")); + }; + + return Splat; + + })(Base); + + exports.Expansion = Expansion = (function(superClass1) { + extend1(Expansion, superClass1); + + function Expansion() { + return Expansion.__super__.constructor.apply(this, arguments); + } + + Expansion.prototype.isComplex = NO; + + Expansion.prototype.compileNode = function(o) { + return this.error('Expansion must be used inside a destructuring assignment or parameter list'); + }; + + Expansion.prototype.asReference = function(o) { + return this; + }; + + Expansion.prototype.eachName = function(iterator) {}; + + return Expansion; + + })(Base); + + exports.While = While = (function(superClass1) { + extend1(While, superClass1); + + function While(condition, options) { + this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition; + this.guard = options != null ? options.guard : void 0; + } + + While.prototype.children = ['condition', 'guard', 'body']; + + While.prototype.isStatement = YES; + + While.prototype.makeReturn = function(res) { + if (res) { + return While.__super__.makeReturn.apply(this, arguments); + } else { + this.returns = !this.jumps({ + loop: true + }); + return this; + } + }; + + While.prototype.addBody = function(body1) { + this.body = body1; + return this; + }; + + While.prototype.jumps = function() { + var expressions, j, jumpNode, len1, node; + expressions = this.body.expressions; + if (!expressions.length) { + return false; + } + for (j = 0, len1 = expressions.length; j < len1; j++) { + node = expressions[j]; + if (jumpNode = node.jumps({ + loop: true + })) { + return jumpNode; + } + } + return false; + }; + + While.prototype.compileNode = function(o) { + var answer, body, rvar, set; + o.indent += TAB; + set = ''; + body = this.body; + if (body.isEmpty()) { + body = this.makeCode(''); + } else { + if (this.returns) { + body.makeReturn(rvar = o.scope.freeVariable('results')); + set = "" + this.tab + rvar + " = [];\n"; + } + if (this.guard) { + if (body.expressions.length > 1) { + body.expressions.unshift(new If((new Parens(this.guard)).invert(), new StatementLiteral("continue"))); + } else { + if (this.guard) { + body = Block.wrap([new If(this.guard, body)]); + } + } + } + body = [].concat(this.makeCode("\n"), body.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab)); + } + answer = [].concat(this.makeCode(set + this.tab + "while ("), this.condition.compileToFragments(o, LEVEL_PAREN), this.makeCode(") {"), body, this.makeCode("}")); + if (this.returns) { + answer.push(this.makeCode("\n" + this.tab + "return " + rvar + ";")); + } + return answer; + }; + + return While; + + })(Base); + + exports.Op = Op = (function(superClass1) { + var CONVERSIONS, INVERSIONS; + + extend1(Op, superClass1); + + function Op(op, first, second, flip) { + if (op === 'in') { + return new In(first, second); + } + if (op === 'do') { + return this.generateDo(first); + } + if (op === 'new') { + if (first instanceof Call && !first["do"] && !first.isNew) { + return first.newInstance(); + } + if (first instanceof Code && first.bound || first["do"]) { + first = new Parens(first); + } + } + this.operator = CONVERSIONS[op] || op; + this.first = first; + this.second = second; + this.flip = !!flip; + return this; + } + + CONVERSIONS = { + '==': '===', + '!=': '!==', + 'of': 'in', + 'yieldfrom': 'yield*' + }; + + INVERSIONS = { + '!==': '===', + '===': '!==' + }; + + Op.prototype.children = ['first', 'second']; + + Op.prototype.isNumber = function() { + var ref3; + return this.isUnary() && ((ref3 = this.operator) === '+' || ref3 === '-') && this.first instanceof Value && this.first.isNumber(); + }; + + Op.prototype.isYield = function() { + var ref3; + return (ref3 = this.operator) === 'yield' || ref3 === 'yield*'; + }; + + Op.prototype.isUnary = function() { + return !this.second; + }; + + Op.prototype.isComplex = function() { + return !this.isNumber(); + }; + + Op.prototype.isChainable = function() { + var ref3; + return (ref3 = this.operator) === '<' || ref3 === '>' || ref3 === '>=' || ref3 === '<=' || ref3 === '===' || ref3 === '!=='; + }; + + Op.prototype.invert = function() { + var allInvertable, curr, fst, op, ref3; + if (this.isChainable() && this.first.isChainable()) { + allInvertable = true; + curr = this; + while (curr && curr.operator) { + allInvertable && (allInvertable = curr.operator in INVERSIONS); + curr = curr.first; + } + if (!allInvertable) { + return new Parens(this).invert(); + } + curr = this; + while (curr && curr.operator) { + curr.invert = !curr.invert; + curr.operator = INVERSIONS[curr.operator]; + curr = curr.first; + } + return this; + } else if (op = INVERSIONS[this.operator]) { + this.operator = op; + if (this.first.unwrap() instanceof Op) { + this.first.invert(); + } + return this; + } else if (this.second) { + return new Parens(this).invert(); + } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((ref3 = fst.operator) === '!' || ref3 === 'in' || ref3 === 'instanceof')) { + return fst; + } else { + return new Op('!', this); + } + }; + + Op.prototype.unfoldSoak = function(o) { + var ref3; + return ((ref3 = this.operator) === '++' || ref3 === '--' || ref3 === 'delete') && unfoldSoak(o, this, 'first'); + }; + + Op.prototype.generateDo = function(exp) { + var call, func, j, len1, param, passedParams, ref, ref3; + passedParams = []; + func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp; + ref3 = func.params || []; + for (j = 0, len1 = ref3.length; j < len1; j++) { + param = ref3[j]; + if (param.value) { + passedParams.push(param.value); + delete param.value; + } else { + passedParams.push(param); + } + } + call = new Call(exp, passedParams); + call["do"] = true; + return call; + }; + + Op.prototype.compileNode = function(o) { + var answer, isChain, lhs, message, ref3, rhs; + isChain = this.isChainable() && this.first.isChainable(); + if (!isChain) { + this.first.front = this.front; + } + if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) { + this.error('delete operand may not be argument or var'); + } + if ((ref3 = this.operator) === '--' || ref3 === '++') { + message = isUnassignable(this.first.unwrapAll().value); + if (message) { + this.first.error(message); + } + } + if (this.isYield()) { + return this.compileYield(o); + } + if (this.isUnary()) { + return this.compileUnary(o); + } + if (isChain) { + return this.compileChain(o); + } + switch (this.operator) { + case '?': + return this.compileExistence(o); + case '**': + return this.compilePower(o); + case '//': + return this.compileFloorDivision(o); + case '%%': + return this.compileModulo(o); + default: + lhs = this.first.compileToFragments(o, LEVEL_OP); + rhs = this.second.compileToFragments(o, LEVEL_OP); + answer = [].concat(lhs, this.makeCode(" " + this.operator + " "), rhs); + if (o.level <= LEVEL_OP) { + return answer; + } else { + return this.wrapInBraces(answer); + } + } + }; + + Op.prototype.compileChain = function(o) { + var fragments, fst, ref3, shared; + ref3 = this.first.second.cache(o), this.first.second = ref3[0], shared = ref3[1]; + fst = this.first.compileToFragments(o, LEVEL_OP); + fragments = fst.concat(this.makeCode(" " + (this.invert ? '&&' : '||') + " "), shared.compileToFragments(o), this.makeCode(" " + this.operator + " "), this.second.compileToFragments(o, LEVEL_OP)); + return this.wrapInBraces(fragments); + }; + + Op.prototype.compileExistence = function(o) { + var fst, ref; + if (this.first.isComplex()) { + ref = new IdentifierLiteral(o.scope.freeVariable('ref')); + fst = new Parens(new Assign(ref, this.first)); + } else { + fst = this.first; + ref = fst; + } + return new If(new Existence(fst), ref, { + type: 'if' + }).addElse(this.second).compileToFragments(o); + }; + + Op.prototype.compileUnary = function(o) { + var op, parts, plusMinus; + parts = []; + op = this.operator; + parts.push([this.makeCode(op)]); + if (op === '!' && this.first instanceof Existence) { + this.first.negated = !this.first.negated; + return this.first.compileToFragments(o); + } + if (o.level >= LEVEL_ACCESS) { + return (new Parens(this)).compileToFragments(o); + } + plusMinus = op === '+' || op === '-'; + if ((op === 'new' || op === 'typeof' || op === 'delete') || plusMinus && this.first instanceof Op && this.first.operator === op) { + parts.push([this.makeCode(' ')]); + } + if ((plusMinus && this.first instanceof Op) || (op === 'new' && this.first.isStatement(o))) { + this.first = new Parens(this.first); + } + parts.push(this.first.compileToFragments(o, LEVEL_OP)); + if (this.flip) { + parts.reverse(); + } + return this.joinFragmentArrays(parts, ''); + }; + + Op.prototype.compileYield = function(o) { + var op, parts, ref3; + parts = []; + op = this.operator; + if (o.scope.parent == null) { + this.error('yield can only occur inside functions'); + } + if (indexOf.call(Object.keys(this.first), 'expression') >= 0 && !(this.first instanceof Throw)) { + if (this.first.expression != null) { + parts.push(this.first.expression.compileToFragments(o, LEVEL_OP)); + } + } else { + if (o.level >= LEVEL_PAREN) { + parts.push([this.makeCode("(")]); + } + parts.push([this.makeCode(op)]); + if (((ref3 = this.first.base) != null ? ref3.value : void 0) !== '') { + parts.push([this.makeCode(" ")]); + } + parts.push(this.first.compileToFragments(o, LEVEL_OP)); + if (o.level >= LEVEL_PAREN) { + parts.push([this.makeCode(")")]); + } + } + return this.joinFragmentArrays(parts, ''); + }; + + Op.prototype.compilePower = function(o) { + var pow; + pow = new Value(new IdentifierLiteral('Math'), [new Access(new PropertyName('pow'))]); + return new Call(pow, [this.first, this.second]).compileToFragments(o); + }; + + Op.prototype.compileFloorDivision = function(o) { + var div, floor; + floor = new Value(new IdentifierLiteral('Math'), [new Access(new PropertyName('floor'))]); + div = new Op('/', this.first, this.second); + return new Call(floor, [div]).compileToFragments(o); + }; + + Op.prototype.compileModulo = function(o) { + var mod; + mod = new Value(new Literal(utility('modulo', o))); + return new Call(mod, [this.first, this.second]).compileToFragments(o); + }; + + Op.prototype.toString = function(idt) { + return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator); + }; + + return Op; + + })(Base); + + exports.In = In = (function(superClass1) { + extend1(In, superClass1); + + function In(object, array) { + this.object = object; + this.array = array; + } + + In.prototype.children = ['object', 'array']; + + In.prototype.invert = NEGATE; + + In.prototype.compileNode = function(o) { + var hasSplat, j, len1, obj, ref3; + if (this.array instanceof Value && this.array.isArray() && this.array.base.objects.length) { + ref3 = this.array.base.objects; + for (j = 0, len1 = ref3.length; j < len1; j++) { + obj = ref3[j]; + if (!(obj instanceof Splat)) { + continue; + } + hasSplat = true; + break; + } + if (!hasSplat) { + return this.compileOrTest(o); + } + } + return this.compileLoopTest(o); + }; + + In.prototype.compileOrTest = function(o) { + var cmp, cnj, i, item, j, len1, ref, ref3, ref4, ref5, sub, tests; + ref3 = this.object.cache(o, LEVEL_OP), sub = ref3[0], ref = ref3[1]; + ref4 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = ref4[0], cnj = ref4[1]; + tests = []; + ref5 = this.array.base.objects; + for (i = j = 0, len1 = ref5.length; j < len1; i = ++j) { + item = ref5[i]; + if (i) { + tests.push(this.makeCode(cnj)); + } + tests = tests.concat((i ? ref : sub), this.makeCode(cmp), item.compileToFragments(o, LEVEL_ACCESS)); + } + if (o.level < LEVEL_OP) { + return tests; + } else { + return this.wrapInBraces(tests); + } + }; + + In.prototype.compileLoopTest = function(o) { + var fragments, ref, ref3, sub; + ref3 = this.object.cache(o, LEVEL_LIST), sub = ref3[0], ref = ref3[1]; + fragments = [].concat(this.makeCode(utility('indexOf', o) + ".call("), this.array.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), ref, this.makeCode(") " + (this.negated ? '< 0' : '>= 0'))); + if (fragmentsToText(sub) === fragmentsToText(ref)) { + return fragments; + } + fragments = sub.concat(this.makeCode(', '), fragments); + if (o.level < LEVEL_LIST) { + return fragments; + } else { + return this.wrapInBraces(fragments); + } + }; + + In.prototype.toString = function(idt) { + return In.__super__.toString.call(this, idt, this.constructor.name + (this.negated ? '!' : '')); + }; + + return In; + + })(Base); + + exports.Try = Try = (function(superClass1) { + extend1(Try, superClass1); + + function Try(attempt, errorVariable, recovery, ensure) { + this.attempt = attempt; + this.errorVariable = errorVariable; + this.recovery = recovery; + this.ensure = ensure; + } + + Try.prototype.children = ['attempt', 'recovery', 'ensure']; + + Try.prototype.isStatement = YES; + + Try.prototype.jumps = function(o) { + var ref3; + return this.attempt.jumps(o) || ((ref3 = this.recovery) != null ? ref3.jumps(o) : void 0); + }; + + Try.prototype.makeReturn = function(res) { + if (this.attempt) { + this.attempt = this.attempt.makeReturn(res); + } + if (this.recovery) { + this.recovery = this.recovery.makeReturn(res); + } + return this; + }; + + Try.prototype.compileNode = function(o) { + var catchPart, ensurePart, generatedErrorVariableName, message, placeholder, tryPart; + o.indent += TAB; + tryPart = this.attempt.compileToFragments(o, LEVEL_TOP); + catchPart = this.recovery ? (generatedErrorVariableName = o.scope.freeVariable('error', { + reserve: false + }), placeholder = new IdentifierLiteral(generatedErrorVariableName), this.errorVariable ? (message = isUnassignable(this.errorVariable.unwrapAll().value), message ? this.errorVariable.error(message) : void 0, this.recovery.unshift(new Assign(this.errorVariable, placeholder))) : void 0, [].concat(this.makeCode(" catch ("), placeholder.compileToFragments(o), this.makeCode(") {\n"), this.recovery.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab + "}"))) : !(this.ensure || this.recovery) ? (generatedErrorVariableName = o.scope.freeVariable('error', { + reserve: false + }), [this.makeCode(" catch (" + generatedErrorVariableName + ") {}")]) : []; + ensurePart = this.ensure ? [].concat(this.makeCode(" finally {\n"), this.ensure.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab + "}")) : []; + return [].concat(this.makeCode(this.tab + "try {\n"), tryPart, this.makeCode("\n" + this.tab + "}"), catchPart, ensurePart); + }; + + return Try; + + })(Base); + + exports.Throw = Throw = (function(superClass1) { + extend1(Throw, superClass1); + + function Throw(expression) { + this.expression = expression; + } + + Throw.prototype.children = ['expression']; + + Throw.prototype.isStatement = YES; + + Throw.prototype.jumps = NO; + + Throw.prototype.makeReturn = THIS; + + Throw.prototype.compileNode = function(o) { + return [].concat(this.makeCode(this.tab + "throw "), this.expression.compileToFragments(o), this.makeCode(";")); + }; + + return Throw; + + })(Base); + + exports.Existence = Existence = (function(superClass1) { + extend1(Existence, superClass1); + + function Existence(expression) { + this.expression = expression; + } + + Existence.prototype.children = ['expression']; + + Existence.prototype.invert = NEGATE; + + Existence.prototype.compileNode = function(o) { + var cmp, cnj, code, ref3; + this.expression.front = this.front; + code = this.expression.compile(o, LEVEL_OP); + if (this.expression.unwrap() instanceof IdentifierLiteral && !o.scope.check(code)) { + ref3 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = ref3[0], cnj = ref3[1]; + code = "typeof " + code + " " + cmp + " \"undefined\" " + cnj + " " + code + " " + cmp + " null"; + } else { + code = code + " " + (this.negated ? '==' : '!=') + " null"; + } + return [this.makeCode(o.level <= LEVEL_COND ? code : "(" + code + ")")]; + }; + + return Existence; + + })(Base); + + exports.Parens = Parens = (function(superClass1) { + extend1(Parens, superClass1); + + function Parens(body1) { + this.body = body1; + } + + Parens.prototype.children = ['body']; + + Parens.prototype.unwrap = function() { + return this.body; + }; + + Parens.prototype.isComplex = function() { + return this.body.isComplex(); + }; + + Parens.prototype.compileNode = function(o) { + var bare, expr, fragments; + expr = this.body.unwrap(); + if (expr instanceof Value && expr.isAtomic()) { + expr.front = this.front; + return expr.compileToFragments(o); + } + fragments = expr.compileToFragments(o, LEVEL_PAREN); + bare = o.level < LEVEL_OP && (expr instanceof Op || expr instanceof Call || (expr instanceof For && expr.returns)); + if (bare) { + return fragments; + } else { + return this.wrapInBraces(fragments); + } + }; + + return Parens; + + })(Base); + + exports.StringWithInterpolations = StringWithInterpolations = (function(superClass1) { + extend1(StringWithInterpolations, superClass1); + + function StringWithInterpolations() { + return StringWithInterpolations.__super__.constructor.apply(this, arguments); + } + + return StringWithInterpolations; + + })(Parens); + + exports.For = For = (function(superClass1) { + extend1(For, superClass1); + + function For(body, source) { + var ref3; + this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index; + this.body = Block.wrap([body]); + this.own = !!source.own; + this.object = !!source.object; + if (this.object) { + ref3 = [this.index, this.name], this.name = ref3[0], this.index = ref3[1]; + } + if (this.index instanceof Value) { + this.index.error('index cannot be a pattern matching expression'); + } + this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length; + this.pattern = this.name instanceof Value; + if (this.range && this.index) { + this.index.error('indexes do not apply to range loops'); + } + if (this.range && this.pattern) { + this.name.error('cannot pattern match over range loops'); + } + if (this.own && !this.object) { + this.name.error('cannot use own with for-in'); + } + this.returns = false; + } + + For.prototype.children = ['body', 'source', 'guard', 'step']; + + For.prototype.compileNode = function(o) { + var body, bodyFragments, compare, compareDown, declare, declareDown, defPart, defPartFragments, down, forPartFragments, guardPart, idt1, increment, index, ivar, kvar, kvarAssign, last, lvar, name, namePart, ref, ref3, ref4, resultPart, returnResult, rvar, scope, source, step, stepNum, stepVar, svar, varPart; + body = Block.wrap([this.body]); + ref3 = body.expressions, last = ref3[ref3.length - 1]; + if ((last != null ? last.jumps() : void 0) instanceof Return) { + this.returns = false; + } + source = this.range ? this.source.base : this.source; + scope = o.scope; + if (!this.pattern) { + name = this.name && (this.name.compile(o, LEVEL_LIST)); + } + index = this.index && (this.index.compile(o, LEVEL_LIST)); + if (name && !this.pattern) { + scope.find(name); + } + if (index) { + scope.find(index); + } + if (this.returns) { + rvar = scope.freeVariable('results'); + } + ivar = (this.object && index) || scope.freeVariable('i', { + single: true + }); + kvar = (this.range && name) || index || ivar; + kvarAssign = kvar !== ivar ? kvar + " = " : ""; + if (this.step && !this.range) { + ref4 = this.cacheToCodeFragments(this.step.cache(o, LEVEL_LIST, isComplexOrAssignable)), step = ref4[0], stepVar = ref4[1]; + if (this.step.isNumber()) { + stepNum = Number(stepVar); + } + } + if (this.pattern) { + name = ivar; + } + varPart = ''; + guardPart = ''; + defPart = ''; + idt1 = this.tab + TAB; + if (this.range) { + forPartFragments = source.compileToFragments(merge(o, { + index: ivar, + name: name, + step: this.step, + isComplex: isComplexOrAssignable + })); + } else { + svar = this.source.compile(o, LEVEL_LIST); + if ((name || this.own) && !(this.source.unwrap() instanceof IdentifierLiteral)) { + defPart += "" + this.tab + (ref = scope.freeVariable('ref')) + " = " + svar + ";\n"; + svar = ref; + } + if (name && !this.pattern) { + namePart = name + " = " + svar + "[" + kvar + "]"; + } + if (!this.object) { + if (step !== stepVar) { + defPart += "" + this.tab + step + ";\n"; + } + down = stepNum < 0; + if (!(this.step && (stepNum != null) && down)) { + lvar = scope.freeVariable('len'); + } + declare = "" + kvarAssign + ivar + " = 0, " + lvar + " = " + svar + ".length"; + declareDown = "" + kvarAssign + ivar + " = " + svar + ".length - 1"; + compare = ivar + " < " + lvar; + compareDown = ivar + " >= 0"; + if (this.step) { + if (stepNum != null) { + if (down) { + compare = compareDown; + declare = declareDown; + } + } else { + compare = stepVar + " > 0 ? " + compare + " : " + compareDown; + declare = "(" + stepVar + " > 0 ? (" + declare + ") : " + declareDown + ")"; + } + increment = ivar + " += " + stepVar; + } else { + increment = "" + (kvar !== ivar ? "++" + ivar : ivar + "++"); + } + forPartFragments = [this.makeCode(declare + "; " + compare + "; " + kvarAssign + increment)]; + } + } + if (this.returns) { + resultPart = "" + this.tab + rvar + " = [];\n"; + returnResult = "\n" + this.tab + "return " + rvar + ";"; + body.makeReturn(rvar); + } + if (this.guard) { + if (body.expressions.length > 1) { + body.expressions.unshift(new If((new Parens(this.guard)).invert(), new StatementLiteral("continue"))); + } else { + if (this.guard) { + body = Block.wrap([new If(this.guard, body)]); + } + } + } + if (this.pattern) { + body.expressions.unshift(new Assign(this.name, new Literal(svar + "[" + kvar + "]"))); + } + defPartFragments = [].concat(this.makeCode(defPart), this.pluckDirectCall(o, body)); + if (namePart) { + varPart = "\n" + idt1 + namePart + ";"; + } + if (this.object) { + forPartFragments = [this.makeCode(kvar + " in " + svar)]; + if (this.own) { + guardPart = "\n" + idt1 + "if (!" + (utility('hasProp', o)) + ".call(" + svar + ", " + kvar + ")) continue;"; + } + } + bodyFragments = body.compileToFragments(merge(o, { + indent: idt1 + }), LEVEL_TOP); + if (bodyFragments && (bodyFragments.length > 0)) { + bodyFragments = [].concat(this.makeCode("\n"), bodyFragments, this.makeCode("\n")); + } + return [].concat(defPartFragments, this.makeCode("" + (resultPart || '') + this.tab + "for ("), forPartFragments, this.makeCode(") {" + guardPart + varPart), bodyFragments, this.makeCode(this.tab + "}" + (returnResult || ''))); + }; + + For.prototype.pluckDirectCall = function(o, body) { + var base, defs, expr, fn, idx, j, len1, ref, ref3, ref4, ref5, ref6, ref7, ref8, ref9, val; + defs = []; + ref3 = body.expressions; + for (idx = j = 0, len1 = ref3.length; j < len1; idx = ++j) { + expr = ref3[idx]; + expr = expr.unwrapAll(); + if (!(expr instanceof Call)) { + continue; + } + val = (ref4 = expr.variable) != null ? ref4.unwrapAll() : void 0; + if (!((val instanceof Code) || (val instanceof Value && ((ref5 = val.base) != null ? ref5.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((ref6 = (ref7 = val.properties[0].name) != null ? ref7.value : void 0) === 'call' || ref6 === 'apply')))) { + continue; + } + fn = ((ref8 = val.base) != null ? ref8.unwrapAll() : void 0) || val; + ref = new IdentifierLiteral(o.scope.freeVariable('fn')); + base = new Value(ref); + if (val.base) { + ref9 = [base, val], val.base = ref9[0], base = ref9[1]; + } + body.expressions[idx] = new Call(base, expr.args); + defs = defs.concat(this.makeCode(this.tab), new Assign(ref, fn).compileToFragments(o, LEVEL_TOP), this.makeCode(';\n')); + } + return defs; + }; + + return For; + + })(While); + + exports.Switch = Switch = (function(superClass1) { + extend1(Switch, superClass1); + + function Switch(subject, cases, otherwise) { + this.subject = subject; + this.cases = cases; + this.otherwise = otherwise; + } + + Switch.prototype.children = ['subject', 'cases', 'otherwise']; + + Switch.prototype.isStatement = YES; + + Switch.prototype.jumps = function(o) { + var block, conds, j, jumpNode, len1, ref3, ref4, ref5; + if (o == null) { + o = { + block: true + }; + } + ref3 = this.cases; + for (j = 0, len1 = ref3.length; j < len1; j++) { + ref4 = ref3[j], conds = ref4[0], block = ref4[1]; + if (jumpNode = block.jumps(o)) { + return jumpNode; + } + } + return (ref5 = this.otherwise) != null ? ref5.jumps(o) : void 0; + }; + + Switch.prototype.makeReturn = function(res) { + var j, len1, pair, ref3, ref4; + ref3 = this.cases; + for (j = 0, len1 = ref3.length; j < len1; j++) { + pair = ref3[j]; + pair[1].makeReturn(res); + } + if (res) { + this.otherwise || (this.otherwise = new Block([new Literal('void 0')])); + } + if ((ref4 = this.otherwise) != null) { + ref4.makeReturn(res); + } + return this; + }; + + Switch.prototype.compileNode = function(o) { + var block, body, cond, conditions, expr, fragments, i, idt1, idt2, j, k, len1, len2, ref3, ref4, ref5; + idt1 = o.indent + TAB; + idt2 = o.indent = idt1 + TAB; + fragments = [].concat(this.makeCode(this.tab + "switch ("), (this.subject ? this.subject.compileToFragments(o, LEVEL_PAREN) : this.makeCode("false")), this.makeCode(") {\n")); + ref3 = this.cases; + for (i = j = 0, len1 = ref3.length; j < len1; i = ++j) { + ref4 = ref3[i], conditions = ref4[0], block = ref4[1]; + ref5 = flatten([conditions]); + for (k = 0, len2 = ref5.length; k < len2; k++) { + cond = ref5[k]; + if (!this.subject) { + cond = cond.invert(); + } + fragments = fragments.concat(this.makeCode(idt1 + "case "), cond.compileToFragments(o, LEVEL_PAREN), this.makeCode(":\n")); + } + if ((body = block.compileToFragments(o, LEVEL_TOP)).length > 0) { + fragments = fragments.concat(body, this.makeCode('\n')); + } + if (i === this.cases.length - 1 && !this.otherwise) { + break; + } + expr = this.lastNonComment(block.expressions); + if (expr instanceof Return || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) { + continue; + } + fragments.push(cond.makeCode(idt2 + 'break;\n')); + } + if (this.otherwise && this.otherwise.expressions.length) { + fragments.push.apply(fragments, [this.makeCode(idt1 + "default:\n")].concat(slice.call(this.otherwise.compileToFragments(o, LEVEL_TOP)), [this.makeCode("\n")])); + } + fragments.push(this.makeCode(this.tab + '}')); + return fragments; + }; + + return Switch; + + })(Base); + + exports.If = If = (function(superClass1) { + extend1(If, superClass1); + + function If(condition, body1, options) { + this.body = body1; + if (options == null) { + options = {}; + } + this.condition = options.type === 'unless' ? condition.invert() : condition; + this.elseBody = null; + this.isChain = false; + this.soak = options.soak; + } + + If.prototype.children = ['condition', 'body', 'elseBody']; + + If.prototype.bodyNode = function() { + var ref3; + return (ref3 = this.body) != null ? ref3.unwrap() : void 0; + }; + + If.prototype.elseBodyNode = function() { + var ref3; + return (ref3 = this.elseBody) != null ? ref3.unwrap() : void 0; + }; + + If.prototype.addElse = function(elseBody) { + if (this.isChain) { + this.elseBodyNode().addElse(elseBody); + } else { + this.isChain = elseBody instanceof If; + this.elseBody = this.ensureBlock(elseBody); + this.elseBody.updateLocationDataIfMissing(elseBody.locationData); + } + return this; + }; + + If.prototype.isStatement = function(o) { + var ref3; + return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((ref3 = this.elseBodyNode()) != null ? ref3.isStatement(o) : void 0); + }; + + If.prototype.jumps = function(o) { + var ref3; + return this.body.jumps(o) || ((ref3 = this.elseBody) != null ? ref3.jumps(o) : void 0); + }; + + If.prototype.compileNode = function(o) { + if (this.isStatement(o)) { + return this.compileStatement(o); + } else { + return this.compileExpression(o); + } + }; + + If.prototype.makeReturn = function(res) { + if (res) { + this.elseBody || (this.elseBody = new Block([new Literal('void 0')])); + } + this.body && (this.body = new Block([this.body.makeReturn(res)])); + this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn(res)])); + return this; + }; + + If.prototype.ensureBlock = function(node) { + if (node instanceof Block) { + return node; + } else { + return new Block([node]); + } + }; + + If.prototype.compileStatement = function(o) { + var answer, body, child, cond, exeq, ifPart, indent; + child = del(o, 'chainChild'); + exeq = del(o, 'isExistentialEquals'); + if (exeq) { + return new If(this.condition.invert(), this.elseBodyNode(), { + type: 'if' + }).compileToFragments(o); + } + indent = o.indent + TAB; + cond = this.condition.compileToFragments(o, LEVEL_PAREN); + body = this.ensureBlock(this.body).compileToFragments(merge(o, { + indent: indent + })); + ifPart = [].concat(this.makeCode("if ("), cond, this.makeCode(") {\n"), body, this.makeCode("\n" + this.tab + "}")); + if (!child) { + ifPart.unshift(this.makeCode(this.tab)); + } + if (!this.elseBody) { + return ifPart; + } + answer = ifPart.concat(this.makeCode(' else ')); + if (this.isChain) { + o.chainChild = true; + answer = answer.concat(this.elseBody.unwrap().compileToFragments(o, LEVEL_TOP)); + } else { + answer = answer.concat(this.makeCode("{\n"), this.elseBody.compileToFragments(merge(o, { + indent: indent + }), LEVEL_TOP), this.makeCode("\n" + this.tab + "}")); + } + return answer; + }; + + If.prototype.compileExpression = function(o) { + var alt, body, cond, fragments; + cond = this.condition.compileToFragments(o, LEVEL_COND); + body = this.bodyNode().compileToFragments(o, LEVEL_LIST); + alt = this.elseBodyNode() ? this.elseBodyNode().compileToFragments(o, LEVEL_LIST) : [this.makeCode('void 0')]; + fragments = cond.concat(this.makeCode(" ? "), body, this.makeCode(" : "), alt); + if (o.level >= LEVEL_COND) { + return this.wrapInBraces(fragments); + } else { + return fragments; + } + }; + + If.prototype.unfoldSoak = function() { + return this.soak && this; + }; + + return If; + + })(Base); + + UTILITIES = { + extend: function(o) { + return "function(child, parent) { for (var key in parent) { if (" + (utility('hasProp', o)) + ".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }"; + }, + bind: function() { + return 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }'; + }, + indexOf: function() { + return "[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }"; + }, + modulo: function() { + return "function(a, b) { return (+a % (b = +b) + b) % b; }"; + }, + hasProp: function() { + return '{}.hasOwnProperty'; + }, + slice: function() { + return '[].slice'; + } + }; + + LEVEL_TOP = 1; + + LEVEL_PAREN = 2; + + LEVEL_LIST = 3; + + LEVEL_COND = 4; + + LEVEL_OP = 5; + + LEVEL_ACCESS = 6; + + TAB = ' '; + + SIMPLENUM = /^[+-]?\d+$/; + + utility = function(name, o) { + var ref, root; + root = o.scope.root; + if (name in root.utilities) { + return root.utilities[name]; + } else { + ref = root.freeVariable(name); + root.assign(ref, UTILITIES[name](o)); + return root.utilities[name] = ref; + } + }; + + multident = function(code, tab) { + code = code.replace(/\n/g, '$&' + tab); + return code.replace(/\s+$/, ''); + }; + + isLiteralArguments = function(node) { + return node instanceof IdentifierLiteral && node.value === 'arguments'; + }; + + isLiteralThis = function(node) { + return node instanceof ThisLiteral || (node instanceof Code && node.bound) || node instanceof SuperCall; + }; + + isComplexOrAssignable = function(node) { + return node.isComplex() || (typeof node.isAssignable === "function" ? node.isAssignable() : void 0); + }; + + unfoldSoak = function(o, parent, name) { + var ifn; + if (!(ifn = parent[name].unfoldSoak(o))) { + return; + } + parent[name] = ifn.body; + ifn.body = new Value(parent); + return ifn; + }; + +}).call(this); + + return module.exports; +})();require['./sourcemap'] = (function() { + var exports = {}, module = {exports: exports}; + // Generated by CoffeeScript 1.11.1 +(function() { + var LineMap, SourceMap; + + LineMap = (function() { + function LineMap(line1) { + this.line = line1; + this.columns = []; + } + + LineMap.prototype.add = function(column, arg, options) { + var sourceColumn, sourceLine; + sourceLine = arg[0], sourceColumn = arg[1]; + if (options == null) { + options = {}; + } + if (this.columns[column] && options.noReplace) { + return; + } + return this.columns[column] = { + line: this.line, + column: column, + sourceLine: sourceLine, + sourceColumn: sourceColumn + }; + }; + + LineMap.prototype.sourceLocation = function(column) { + var mapping; + while (!((mapping = this.columns[column]) || (column <= 0))) { + column--; + } + return mapping && [mapping.sourceLine, mapping.sourceColumn]; + }; + + return LineMap; + + })(); + + SourceMap = (function() { + var BASE64_CHARS, VLQ_CONTINUATION_BIT, VLQ_SHIFT, VLQ_VALUE_MASK; + + function SourceMap() { + this.lines = []; + } + + SourceMap.prototype.add = function(sourceLocation, generatedLocation, options) { + var base, column, line, lineMap; + if (options == null) { + options = {}; + } + line = generatedLocation[0], column = generatedLocation[1]; + lineMap = ((base = this.lines)[line] || (base[line] = new LineMap(line))); + return lineMap.add(column, sourceLocation, options); + }; + + SourceMap.prototype.sourceLocation = function(arg) { + var column, line, lineMap; + line = arg[0], column = arg[1]; + while (!((lineMap = this.lines[line]) || (line <= 0))) { + line--; + } + return lineMap && lineMap.sourceLocation(column); + }; + + SourceMap.prototype.generate = function(options, code) { + var buffer, i, j, lastColumn, lastSourceColumn, lastSourceLine, len, len1, lineMap, lineNumber, mapping, needComma, ref, ref1, v3, writingline; + if (options == null) { + options = {}; + } + if (code == null) { + code = null; + } + writingline = 0; + lastColumn = 0; + lastSourceLine = 0; + lastSourceColumn = 0; + needComma = false; + buffer = ""; + ref = this.lines; + for (lineNumber = i = 0, len = ref.length; i < len; lineNumber = ++i) { + lineMap = ref[lineNumber]; + if (lineMap) { + ref1 = lineMap.columns; + for (j = 0, len1 = ref1.length; j < len1; j++) { + mapping = ref1[j]; + if (!(mapping)) { + continue; + } + while (writingline < mapping.line) { + lastColumn = 0; + needComma = false; + buffer += ";"; + writingline++; + } + if (needComma) { + buffer += ","; + needComma = false; + } + buffer += this.encodeVlq(mapping.column - lastColumn); + lastColumn = mapping.column; + buffer += this.encodeVlq(0); + buffer += this.encodeVlq(mapping.sourceLine - lastSourceLine); + lastSourceLine = mapping.sourceLine; + buffer += this.encodeVlq(mapping.sourceColumn - lastSourceColumn); + lastSourceColumn = mapping.sourceColumn; + needComma = true; + } + } + } + v3 = { + version: 3, + file: options.generatedFile || '', + sourceRoot: options.sourceRoot || '', + sources: options.sourceFiles || [''], + names: [], + mappings: buffer + }; + if (options.inlineMap) { + v3.sourcesContent = [code]; + } + return v3; + }; + + VLQ_SHIFT = 5; + + VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT; + + VLQ_VALUE_MASK = VLQ_CONTINUATION_BIT - 1; + + SourceMap.prototype.encodeVlq = function(value) { + var answer, nextChunk, signBit, valueToEncode; + answer = ''; + signBit = value < 0 ? 1 : 0; + valueToEncode = (Math.abs(value) << 1) + signBit; + while (valueToEncode || !answer) { + nextChunk = valueToEncode & VLQ_VALUE_MASK; + valueToEncode = valueToEncode >> VLQ_SHIFT; + if (valueToEncode) { + nextChunk |= VLQ_CONTINUATION_BIT; + } + answer += this.encodeBase64(nextChunk); + } + return answer; + }; + + BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + + SourceMap.prototype.encodeBase64 = function(value) { + return BASE64_CHARS[value] || (function() { + throw new Error("Cannot Base64 encode value: " + value); + })(); + }; + + return SourceMap; + + })(); + + module.exports = SourceMap; + +}).call(this); + + return module.exports; +})();require['./coffee-script'] = (function() { + var exports = {}, module = {exports: exports}; + // Generated by CoffeeScript 1.11.1 +(function() { + var Lexer, SourceMap, base64encode, compile, ext, fn1, formatSourcePosition, fs, getSourceMap, helpers, i, len, lexer, parser, path, ref, sourceMaps, vm, withPrettyErrors, + hasProp = {}.hasOwnProperty; + + fs = require('fs'); + + vm = require('vm'); + + path = require('path'); + + Lexer = require('./lexer').Lexer; + + parser = require('./parser').parser; + + helpers = require('./helpers'); + + SourceMap = require('./sourcemap'); + + exports.VERSION = '1.11.1'; + + exports.FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md']; + + exports.helpers = helpers; + + base64encode = function(src) { + switch (false) { + case typeof Buffer !== 'function': + return new Buffer(src).toString('base64'); + case typeof btoa !== 'function': + return btoa(src); + default: + throw new Error('Unable to base64 encode inline sourcemap.'); + } + }; + + withPrettyErrors = function(fn) { + return function(code, options) { + var err; + if (options == null) { + options = {}; + } + try { + return fn.call(this, code, options); + } catch (error) { + err = error; + if (typeof code !== 'string') { + throw err; + } + throw helpers.updateSyntaxError(err, code, options.filename); + } + }; + }; + + exports.compile = compile = withPrettyErrors(function(code, options) { + var currentColumn, currentLine, encoded, extend, fragment, fragments, generateSourceMap, header, i, j, js, len, len1, map, merge, newLines, ref, ref1, sourceMapDataURI, sourceURL, token, tokens, v3SourceMap; + merge = helpers.merge, extend = helpers.extend; + options = extend({}, options); + generateSourceMap = options.sourceMap || options.inlineMap; + if (generateSourceMap) { + map = new SourceMap; + } + tokens = lexer.tokenize(code, options); + options.referencedVars = (function() { + var i, len, results; + results = []; + for (i = 0, len = tokens.length; i < len; i++) { + token = tokens[i]; + if (token[0] === 'IDENTIFIER') { + results.push(token[1]); + } + } + return results; + })(); + if (!((options.bare != null) && options.bare === true)) { + for (i = 0, len = tokens.length; i < len; i++) { + token = tokens[i]; + if ((ref = token[0]) === 'IMPORT' || ref === 'EXPORT') { + options.bare = true; + break; + } + } + } + fragments = parser.parse(tokens).compileToFragments(options); + currentLine = 0; + if (options.header) { + currentLine += 1; + } + if (options.shiftLine) { + currentLine += 1; + } + currentColumn = 0; + js = ""; + for (j = 0, len1 = fragments.length; j < len1; j++) { + fragment = fragments[j]; + if (generateSourceMap) { + if (fragment.locationData && !/^[;\s]*$/.test(fragment.code)) { + map.add([fragment.locationData.first_line, fragment.locationData.first_column], [currentLine, currentColumn], { + noReplace: true + }); + } + newLines = helpers.count(fragment.code, "\n"); + currentLine += newLines; + if (newLines) { + currentColumn = fragment.code.length - (fragment.code.lastIndexOf("\n") + 1); + } else { + currentColumn += fragment.code.length; + } + } + js += fragment.code; + } + if (options.header) { + header = "Generated by CoffeeScript " + this.VERSION; + js = "// " + header + "\n" + js; + } + if (generateSourceMap) { + v3SourceMap = map.generate(options, code); + } + if (options.inlineMap) { + encoded = base64encode(JSON.stringify(v3SourceMap)); + sourceMapDataURI = "//# sourceMappingURL=data:application/json;base64," + encoded; + sourceURL = "//# sourceURL=" + ((ref1 = options.filename) != null ? ref1 : 'coffeescript'); + js = js + "\n" + sourceMapDataURI + "\n" + sourceURL; + } + if (options.sourceMap) { + return { + js: js, + sourceMap: map, + v3SourceMap: JSON.stringify(v3SourceMap, null, 2) + }; + } else { + return js; + } + }); + + exports.tokens = withPrettyErrors(function(code, options) { + return lexer.tokenize(code, options); + }); + + exports.nodes = withPrettyErrors(function(source, options) { + if (typeof source === 'string') { + return parser.parse(lexer.tokenize(source, options)); + } else { + return parser.parse(source); + } + }); + + exports.run = function(code, options) { + var answer, dir, mainModule, ref; + if (options == null) { + options = {}; + } + mainModule = require.main; + mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '.'; + mainModule.moduleCache && (mainModule.moduleCache = {}); + dir = options.filename ? path.dirname(fs.realpathSync(options.filename)) : fs.realpathSync('.'); + mainModule.paths = require('module')._nodeModulePaths(dir); + if (!helpers.isCoffee(mainModule.filename) || require.extensions) { + answer = compile(code, options); + code = (ref = answer.js) != null ? ref : answer; + } + return mainModule._compile(code, mainModule.filename); + }; + + exports["eval"] = function(code, options) { + var Module, _module, _require, createContext, i, isContext, js, k, len, o, r, ref, ref1, ref2, ref3, sandbox, v; + if (options == null) { + options = {}; + } + if (!(code = code.trim())) { + return; + } + createContext = (ref = vm.Script.createContext) != null ? ref : vm.createContext; + isContext = (ref1 = vm.isContext) != null ? ref1 : function(ctx) { + return options.sandbox instanceof createContext().constructor; + }; + if (createContext) { + if (options.sandbox != null) { + if (isContext(options.sandbox)) { + sandbox = options.sandbox; + } else { + sandbox = createContext(); + ref2 = options.sandbox; + for (k in ref2) { + if (!hasProp.call(ref2, k)) continue; + v = ref2[k]; + sandbox[k] = v; + } + } + sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox; + } else { + sandbox = global; + } + sandbox.__filename = options.filename || 'eval'; + sandbox.__dirname = path.dirname(sandbox.__filename); + if (!(sandbox !== global || sandbox.module || sandbox.require)) { + Module = require('module'); + sandbox.module = _module = new Module(options.modulename || 'eval'); + sandbox.require = _require = function(path) { + return Module._load(path, _module, true); + }; + _module.filename = sandbox.__filename; + ref3 = Object.getOwnPropertyNames(require); + for (i = 0, len = ref3.length; i < len; i++) { + r = ref3[i]; + if (r !== 'paths' && r !== 'arguments' && r !== 'caller') { + _require[r] = require[r]; + } + } + _require.paths = _module.paths = Module._nodeModulePaths(process.cwd()); + _require.resolve = function(request) { + return Module._resolveFilename(request, _module); + }; + } + } + o = {}; + for (k in options) { + if (!hasProp.call(options, k)) continue; + v = options[k]; + o[k] = v; + } + o.bare = true; + js = compile(code, o); + if (sandbox === global) { + return vm.runInThisContext(js); + } else { + return vm.runInContext(js, sandbox); + } + }; + + exports.register = function() { + return require('./register'); + }; + + if (require.extensions) { + ref = this.FILE_EXTENSIONS; + fn1 = function(ext) { + var base; + return (base = require.extensions)[ext] != null ? base[ext] : base[ext] = function() { + throw new Error("Use CoffeeScript.register() or require the coffee-script/register module to require " + ext + " files."); + }; + }; + for (i = 0, len = ref.length; i < len; i++) { + ext = ref[i]; + fn1(ext); + } + } + + exports._compileFile = function(filename, sourceMap, inlineMap) { + var answer, err, raw, stripped; + if (sourceMap == null) { + sourceMap = false; + } + if (inlineMap == null) { + inlineMap = false; + } + raw = fs.readFileSync(filename, 'utf8'); + stripped = raw.charCodeAt(0) === 0xFEFF ? raw.substring(1) : raw; + try { + answer = compile(stripped, { + filename: filename, + sourceMap: sourceMap, + inlineMap: inlineMap, + sourceFiles: [filename], + literate: helpers.isLiterate(filename) + }); + } catch (error) { + err = error; + throw helpers.updateSyntaxError(err, stripped, filename); + } + return answer; + }; + + lexer = new Lexer; + + parser.lexer = { + lex: function() { + var tag, token; + token = parser.tokens[this.pos++]; + if (token) { + tag = token[0], this.yytext = token[1], this.yylloc = token[2]; + parser.errorToken = token.origin || token; + this.yylineno = this.yylloc.first_line; + } else { + tag = ''; + } + return tag; + }, + setInput: function(tokens) { + parser.tokens = tokens; + return this.pos = 0; + }, + upcomingInput: function() { + return ""; + } + }; + + parser.yy = require('./nodes'); + + parser.yy.parseError = function(message, arg) { + var errorLoc, errorTag, errorText, errorToken, token, tokens; + token = arg.token; + errorToken = parser.errorToken, tokens = parser.tokens; + errorTag = errorToken[0], errorText = errorToken[1], errorLoc = errorToken[2]; + errorText = (function() { + switch (false) { + case errorToken !== tokens[tokens.length - 1]: + return 'end of input'; + case errorTag !== 'INDENT' && errorTag !== 'OUTDENT': + return 'indentation'; + case errorTag !== 'IDENTIFIER' && errorTag !== 'NUMBER' && errorTag !== 'INFINITY' && errorTag !== 'STRING' && errorTag !== 'STRING_START' && errorTag !== 'REGEX' && errorTag !== 'REGEX_START': + return errorTag.replace(/_START$/, '').toLowerCase(); + default: + return helpers.nameWhitespaceCharacter(errorText); + } + })(); + return helpers.throwSyntaxError("unexpected " + errorText, errorLoc); + }; + + formatSourcePosition = function(frame, getSourceMapping) { + var as, column, fileLocation, fileName, functionName, isConstructor, isMethodCall, line, methodName, source, tp, typeName; + fileName = void 0; + fileLocation = ''; + if (frame.isNative()) { + fileLocation = "native"; + } else { + if (frame.isEval()) { + fileName = frame.getScriptNameOrSourceURL(); + if (!fileName) { + fileLocation = (frame.getEvalOrigin()) + ", "; + } + } else { + fileName = frame.getFileName(); + } + fileName || (fileName = ""); + line = frame.getLineNumber(); + column = frame.getColumnNumber(); + source = getSourceMapping(fileName, line, column); + fileLocation = source ? fileName + ":" + source[0] + ":" + source[1] : fileName + ":" + line + ":" + column; + } + functionName = frame.getFunctionName(); + isConstructor = frame.isConstructor(); + isMethodCall = !(frame.isToplevel() || isConstructor); + if (isMethodCall) { + methodName = frame.getMethodName(); + typeName = frame.getTypeName(); + if (functionName) { + tp = as = ''; + if (typeName && functionName.indexOf(typeName)) { + tp = typeName + "."; + } + if (methodName && functionName.indexOf("." + methodName) !== functionName.length - methodName.length - 1) { + as = " [as " + methodName + "]"; + } + return "" + tp + functionName + as + " (" + fileLocation + ")"; + } else { + return typeName + "." + (methodName || '') + " (" + fileLocation + ")"; + } + } else if (isConstructor) { + return "new " + (functionName || '') + " (" + fileLocation + ")"; + } else if (functionName) { + return functionName + " (" + fileLocation + ")"; + } else { + return fileLocation; + } + }; + + sourceMaps = {}; + + getSourceMap = function(filename) { + var answer, j, len1, ref1; + if (sourceMaps[filename]) { + return sourceMaps[filename]; + } + ref1 = exports.FILE_EXTENSIONS; + for (j = 0, len1 = ref1.length; j < len1; j++) { + ext = ref1[j]; + if (helpers.ends(filename, ext)) { + answer = exports._compileFile(filename, true); + return sourceMaps[filename] = answer.sourceMap; + } + } + return null; + }; + + Error.prepareStackTrace = function(err, stack) { + var frame, frames, getSourceMapping; + getSourceMapping = function(filename, line, column) { + var answer, sourceMap; + sourceMap = getSourceMap(filename); + if (sourceMap) { + answer = sourceMap.sourceLocation([line - 1, column - 1]); + } + if (answer) { + return [answer[0] + 1, answer[1] + 1]; + } else { + return null; + } + }; + frames = (function() { + var j, len1, results; + results = []; + for (j = 0, len1 = stack.length; j < len1; j++) { + frame = stack[j]; + if (frame.getFunction() === exports.run) { + break; + } + results.push(" at " + (formatSourcePosition(frame, getSourceMapping))); + } + return results; + })(); + return (err.toString()) + "\n" + (frames.join('\n')) + "\n"; + }; + +}).call(this); + + return module.exports; +})();require['./browser'] = (function() { + var exports = {}, module = {exports: exports}; + // Generated by CoffeeScript 1.11.1 +(function() { + var CoffeeScript, compile, runScripts, + indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + CoffeeScript = require('./coffee-script'); + + CoffeeScript.require = require; + + compile = CoffeeScript.compile; + + CoffeeScript["eval"] = function(code, options) { + if (options == null) { + options = {}; + } + if (options.bare == null) { + options.bare = true; + } + return eval(compile(code, options)); + }; + + CoffeeScript.run = function(code, options) { + if (options == null) { + options = {}; + } + options.bare = true; + options.shiftLine = true; + return Function(compile(code, options))(); + }; + + if (typeof window === "undefined" || window === null) { + return; + } + + if ((typeof btoa !== "undefined" && btoa !== null) && (typeof JSON !== "undefined" && JSON !== null)) { + compile = function(code, options) { + if (options == null) { + options = {}; + } + options.inlineMap = true; + return CoffeeScript.compile(code, options); + }; + } + + CoffeeScript.load = function(url, callback, options, hold) { + var xhr; + if (options == null) { + options = {}; + } + if (hold == null) { + hold = false; + } + options.sourceFiles = [url]; + xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new window.XMLHttpRequest(); + xhr.open('GET', url, true); + if ('overrideMimeType' in xhr) { + xhr.overrideMimeType('text/plain'); + } + xhr.onreadystatechange = function() { + var param, ref; + if (xhr.readyState === 4) { + if ((ref = xhr.status) === 0 || ref === 200) { + param = [xhr.responseText, options]; + if (!hold) { + CoffeeScript.run.apply(CoffeeScript, param); + } + } else { + throw new Error("Could not load " + url); + } + if (callback) { + return callback(param); + } + } + }; + return xhr.send(null); + }; + + runScripts = function() { + var coffees, coffeetypes, execute, fn, i, index, j, len, s, script, scripts; + scripts = window.document.getElementsByTagName('script'); + coffeetypes = ['text/coffeescript', 'text/literate-coffeescript']; + coffees = (function() { + var j, len, ref, results; + results = []; + for (j = 0, len = scripts.length; j < len; j++) { + s = scripts[j]; + if (ref = s.type, indexOf.call(coffeetypes, ref) >= 0) { + results.push(s); + } + } + return results; + })(); + index = 0; + execute = function() { + var param; + param = coffees[index]; + if (param instanceof Array) { + CoffeeScript.run.apply(CoffeeScript, param); + index++; + return execute(); + } + }; + fn = function(script, i) { + var options, source; + options = { + literate: script.type === coffeetypes[1] + }; + source = script.src || script.getAttribute('data-src'); + if (source) { + return CoffeeScript.load(source, function(param) { + coffees[i] = param; + return execute(); + }, options, true); + } else { + options.sourceFiles = ['embedded']; + return coffees[i] = [script.innerHTML, options]; + } + }; + for (i = j = 0, len = coffees.length; j < len; i = ++j) { + script = coffees[i]; + fn(script, i); + } + return execute(); + }; + + if (window.addEventListener) { + window.addEventListener('DOMContentLoaded', runScripts, false); + } else { + window.attachEvent('onload', runScripts); + } + +}).call(this); + + return module.exports; +})(); + return require['./coffee-script']; + }(); + + if (typeof define === 'function' && define.amd) { + define(function() { return CoffeeScript; }); + } else { + root.CoffeeScript = CoffeeScript; + } +}(this)); \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/coffee-script-source-1.11.1/lib/coffee_script/source.rb b/vendor/bundler/ruby/2.5.0/gems/coffee-script-source-1.11.1/lib/coffee_script/source.rb new file mode 100644 index 000000000000..67805545956b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/coffee-script-source-1.11.1/lib/coffee_script/source.rb @@ -0,0 +1,7 @@ +module CoffeeScript + module Source + def self.bundled_path + File.expand_path("../coffee-script.js", __FILE__) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/Gemfile new file mode 100644 index 000000000000..044fba3b0706 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/Gemfile @@ -0,0 +1,11 @@ +source "https://rubygems.org" +gemspec + +gem "rake" +group :development do + gem "rspec-helpers", :require => false + gem "luna-rspec-formatters", :require => false + gem "pry", :require => false unless ENV[ + "CI" + ] +end diff --git a/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/History.markdown b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/History.markdown new file mode 100644 index 000000000000..bac427043da7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/History.markdown @@ -0,0 +1,25 @@ +## 1.1.0 / 2016-06-28 + +### Minor Enhancements + +* Support jruby (#8) + +## 1.0.0 / 2016-04-28 + +### Major enhancements + +- Merge Simple::ANSI and Colorator. (#7) + +### Minor Enhancements + +- Delete unnecessary `Symbol#to_sym` (#2) +- Change argument name of `Enumerator#each` for better code legibility (#3) + +### Development Fixes + +- Convert to new RSpec expectation syntax (#1) +- Fix `String#blue` result in README (#4) + +## 0.1 / 2013-04-13 + +Birthday! diff --git a/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/LICENSE b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/LICENSE new file mode 100644 index 000000000000..b3b6be9ae11c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) Parker Moore + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/README.markdown b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/README.markdown new file mode 100644 index 000000000000..9cf886dee404 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/README.markdown @@ -0,0 +1,47 @@ +# colorator + +Colorize your text for the terminal + +[![Build Status](https://travis-ci.org/octopress/colorator.png?branch=master)](https://travis-ci.org/octopress/colorator) + +## Example + +```ruby +"this string".red +# => \e[31mthis string\e[0m +"my string".blue +# => \e[34mmy string\e[0m +# etc... +``` + +## Supported Colors + +- `red` +- `black` +- `green` +- `yellow` +- `magenta` +- `white` +- `blue` +- `cyan` +- `bold` + +## Other supported Ansi methods + +- `clear_line` +- `has_ansi?`, `has_color?` +- `strip_ansi`, `strip_color` +- `reset_ansi`, `reset_color` +- `clear_screen` +- `ansi_jump` + +## Why + +There are a bunch of gems that provide functionality like this, but none have +as simple an API as this. Just call `"string".color` and your text will be +colorized. + +## License + +MIT. Written as a single Ruby file by Brandon Mathis, converted into a gem by +Parker Moore. diff --git a/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/Rakefile new file mode 100644 index 000000000000..b7e9ed549be3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/Rakefile @@ -0,0 +1,6 @@ +require "bundler/gem_tasks" +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/colorator.gemspec b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/colorator.gemspec new file mode 100644 index 000000000000..a4bd0cd04160 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/colorator.gemspec @@ -0,0 +1,23 @@ +# coding: utf-8 + +require File.expand_path('lib/colorator.rb', __dir__) + +Gem::Specification.new do |spec| + spec.name = "colorator" + spec.summary = "Colorize your text in the terminal." + spec.version = Colorator::VERSION + spec.authors = ["Parker Moore", "Brandon Mathis"] + spec.email = ["parkrmoore@gmail.com", "brandon@imathis.com"] + spec.homepage = "https://github.com/octopress/colorator" + spec.licenses = ["MIT"] + + all = `git ls-files -z`.split("\x0").reject { |f| f.start_with?(".") } + spec.files = all.select { |f| File.basename(f) == f || f =~ %r{^(bin|lib)/} } + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.require_paths = ["lib"] + + spec.extra_rdoc_files = ["README.markdown", "LICENSE"] + spec.rdoc_options = ["--charset=UTF-8"] + + spec.add_development_dependency "rspec", "~> 3.1" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/lib/colorator.rb b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/lib/colorator.rb new file mode 100644 index 000000000000..107f6e3a7d49 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/lib/colorator.rb @@ -0,0 +1,111 @@ +$:.unshift File.dirname(__FILE__) + +module Colorator + module_function + VERSION = "1.1.0" + + # -------------------------------------------------------------------------- + + ANSI_MATCHR = /\x1b.*?[jkmsuABGKH]/ + ANSI_COLORS = { + :black => 30, + :red => 31, + :green => 32, + :yellow => 33, + :blue => 34, + :magenta => 35, + :cyan => 36, + :white => 37, + :bold => 1 + } + + # -------------------------------------------------------------------------- + # Allows you to check if a string currently has ansi. + # -------------------------------------------------------------------------- + + def has_ansi?(str) + str.match(ANSI_MATCHR).is_a?( + MatchData + ) + end + + # -------------------------------------------------------------------------- + # Jump the cursor, moving it up and then back down to it's spot, allowing + # you to do fancy things like multiple output (downloads) the way that Docker + # does them in an async way without breaking term. + # -------------------------------------------------------------------------- + + def ansi_jump(str, num) + "\x1b[#{num}A#{clear_line(str)}\x1b[#{ + num + }B" + end + + # -------------------------------------------------------------------------- + + def reset_ansi(str = "") + "\x1b[0m#{ + str + }" + end + + # -------------------------------------------------------------------------- + + def clear_line(str = "") + "\x1b[2K\r#{ + str + }" + end + + # -------------------------------------------------------------------------- + # Strip ANSI from the current string, making it just a normal string. + # -------------------------------------------------------------------------- + + def strip_ansi(str) + str.gsub( + ANSI_MATCHR, "" + ) + end + + # -------------------------------------------------------------------------- + # Clear the screen's current view, so the user gets a clean output. + # -------------------------------------------------------------------------- + + def clear_screen(str = "") + "\x1b[H\x1b[2J#{ + str + }" + end + + # -------------------------------------------------------------------------- + + def colorize(str = "", color) + "\x1b[#{color}m#{str}\x1b[0m" + end + + # -------------------------------------------------------------------------- + + Colorator::ANSI_COLORS.each do |color, code| + define_singleton_method color do |str| + colorize( + str, code + ) + end + end + + # -------------------------------------------------------------------------- + + class << self + alias reset_color reset_ansi + alias strip_color strip_ansi + alias has_color? has_ansi? + end + + # -------------------------------------------------------------------------- + + CORE_METHODS = ( + public_methods - Object.methods + ) +end + +require "colorator/core_ext" diff --git a/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb new file mode 100644 index 000000000000..f2e0bf0d9411 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb @@ -0,0 +1,9 @@ +class String + Colorator::CORE_METHODS.each do |method| + define_method method do |*args| + Colorator.public_send(method, + self, *args + ) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/LICENSE.txt new file mode 100644 index 000000000000..452887adc6d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2015 Garen J. Torikian + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/README.md b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/README.md new file mode 100644 index 000000000000..1f499e4c822d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/README.md @@ -0,0 +1,212 @@ +# CommonMarker + +[![Build Status](https://travis-ci.org/gjtorikian/commonmarker.svg)](https://travis-ci.org/gjtorikian/commonmarker) [![Gem Version](https://badge.fury.io/rb/commonmarker.svg)](http://badge.fury.io/rb/commonmarker) + +Ruby wrapper for [libcmark-gfm](https://github.com/github/cmark), +GitHub's fork of the reference parser for CommonMark. It passes all of the C tests, and is therefore spec-complete. It also includes extensions to the CommonMark spec as documented in the [GitHub Flavored Markdown spec](http://github.github.com/gfm/), such as support for tables, strikethroughs, and autolinking. + +For more information on available extensions, see [the documentation below](#extensions). + +## Installation + +Add this line to your application's Gemfile: + + gem 'commonmarker' + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install commonmarker + +## Usage + +### Converting to HTML + +Call `render_html` on a string to convert it to HTML: + +``` ruby +require 'commonmarker' +CommonMarker.render_html('Hi *there*', :DEFAULT) +#

Hi there

\n +``` + +The second argument is optional--[see below](#options) for more information. + +### Generating a document + +You can also parse a string to receive a `Document` node. You can then print that node to HTML, iterate over the children, and other fun node stuff. For example: + +``` ruby +require 'commonmarker' + +doc = CommonMarker.render_doc('*Hello* world', :DEFAULT) +puts(doc.to_html) #

Hi there

\n + +doc.walk do |node| + puts node.type # [:document, :paragraph, :text, :emph, :text] +end +``` + +The second argument is optional--[see below](#options) for more information. + +#### Example: walking the AST + +You can use `walk` or `each` to iterate over nodes: + +- `walk` will iterate on a node and recursively iterate on a node's children. +- `each` will iterate on a node and its children, but no further. + +``` ruby +require 'commonmarker' + +# parse the files specified on the command line +doc = CommonMarker.render_doc("# The site\n\n [GitHub](https://www.github.com)") + +# Walk tree and print out URLs for links +doc.walk do |node| + if node.type == :link + printf("URL = %s\n", node.url) + end +end + +# Capitalize all regular text in headers +doc.walk do |node| + if node.type == :header + node.each do |subnode| + if subnode.type == :text + subnode.string_content = subnode.string_content.upcase + end + end + end +end + +# Transform links to regular text +doc.walk do |node| + if node.type == :link + node.insert_before(node.first_child) + node.delete + end +end +``` + +### Creating a custom renderer + +You can also derive a class from CommonMarker's `HtmlRenderer` class. This produces slower output, but is far more customizable. For example: + +``` ruby +class MyHtmlRenderer < CommonMarker::HtmlRenderer + def initialize + super + @headerid = 1 + end + + def header(node) + block do + out("", + :children, "") + @headerid += 1 + end + end +end + +# this renderer prints directly to STDOUT, instead +# of returning a string +myrenderer = MyHtmlRenderer.new +print(myrenderer.render(doc)) + +# Print any warnings to STDERR +renderer.warnings.each do |w| + STDERR.write("#{w}\n") +end +``` + +## Options + +CommonMarker accepts the same options that CMark does, as symbols. Note that there is a distinction in CMark for "parse" options and "render" options, which are represented in the tables below. + +### Parse options + +| Name | Description +| ----------------------------- | ----------- +| `:DEFAULT` | The default parsing system. +| `:FOOTNOTES` | Parse footnotes. +| `:LIBERAL_HTML_TAG` | Support liberal parsing of inline HTML tags. +| `:SMART` | Use smart punctuation (curly quotes, etc.). +| `:STRIKETHROUGH_DOUBLE_TILDE` | Parse strikethroughs by double tildes (compatibility with [redcarpet](https://github.com/vmg/redcarpet)) +| `:VALIDATE_UTF8` | Replace illegal sequences with the replacement character `U+FFFD`. + +### Render options + +| Name | Description | +| ------------------ | ----------- | +| `:DEFAULT` | The default rendering system. | +| `:GITHUB_PRE_LANG` | Use GitHub-style `
` for fenced code blocks.          |
+| `:HARDBREAKS`                    | Treat `\n` as hardbreaks (by adding `
`). | +| `:NOBREAKS` | Translate `\n` in the source to a single whitespace. | +| `:SAFE` | Suppress raw HTML and unsafe links. | +| `:SOURCEPOS` | Include source position in rendered HTML. | +| `:TABLE_PREFER_STYLE_ATTRIBUTES` | Use `style` insted of `align` for table cells | +| `:FULL_INFO_STRING` | Include full info strings of code blocks in separate attribute | + +### Passing options + +To apply a single option, pass it in as a symbol argument: + +``` ruby +CommonMarker.render_doc("\"Hello,\" said the spider.", :SMART) +#

“Hello,” said the spider.

\n +``` + +To have multiple options applied, pass in an array of symbols: + +``` ruby +CommonMarker.render_html("\"'Shelob' is my name.\"", [:HARDBREAKS, :SOURCEPOS]) +``` + +For more information on these options, see [the CMark documentation](https://git.io/v7nh1). + +## Extensions + +Both `render_html` and `render_doc` take an optional third argument defining the extensions you want enabled as your CommonMark document is being processed. The documentation for these extensions are [defined in this spec](https://github.github.com/gfm/), and the rationale is provided [in this blog post](https://githubengineering.com/a-formal-spec-for-github-markdown/). + +The available extensions are: + +* `:table` - This provides support for tables. +* `:strikethrough` - This provides support for strikethroughs. +* `:autolink` - This provides support for automatically converting URLs to anchor tags. +* `:tagfilter` - This strips out [several "unsafe" HTML tags](https://github.github.com/gfm/#disallowed-raw-html-extension-) from being used. + +## Developing locally + +After cloning the repo: + +``` +script/bootstrap +bundle exec rake compile +``` + +If there were no errors, you're done! Otherwise, make sure to follow the CMark dependency instructions. + +## Benchmarks + +Some rough benchmarks: + +``` +$ bundle exec rake benchmark + +input size = 11063727 bytes + +redcarpet + 0.070000 0.020000 0.090000 ( 0.079641) +github-markdown + 0.070000 0.010000 0.080000 ( 0.083535) +commonmarker with to_html + 0.100000 0.010000 0.110000 ( 0.111947) +commonmarker with ruby HtmlRenderer + 1.830000 0.030000 1.860000 ( 1.866203) +kramdown + 4.610000 0.070000 4.680000 ( 4.678398) +``` diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/Rakefile b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/Rakefile new file mode 100644 index 000000000000..584906f23486 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/Rakefile @@ -0,0 +1,89 @@ +require 'date' +require 'rake/clean' +require 'rake/extensiontask' +require 'digest/md5' + +host_os = RbConfig::CONFIG['host_os'] +require 'devkit' if host_os == 'mingw32' + +task :default => [:test] + +# Gem Spec +gem_spec = Gem::Specification.load('commonmarker.gemspec') + +# Ruby Extension +Rake::ExtensionTask.new('commonmarker', gem_spec) do |ext| + ext.lib_dir = File.join('lib', 'commonmarker') +end + +# Packaging +require 'bundler/gem_tasks' + +# Testing +require 'rake/testtask' + +Rake::TestTask.new('test:unit') do |t| + t.libs << 'lib' + t.libs << 'test' + t.pattern = 'test/test_*.rb' + t.verbose = true + t.warning = false +end + +task 'test:unit' => :compile + +desc 'Run unit and conformance tests' +task :test => %w(test:unit) + +desc 'Run benchmarks' +task :benchmark do + if ENV['FETCH_PROGIT'] + `rm -rf test/progit` + `git clone https://github.com/progit/progit.git test/progit` + langs = %w(ar az be ca cs de en eo es es-ni fa fi fr hi hu id it ja ko mk nl no-nb pl pt-br ro ru sr th tr uk vi zh zh-tw) + langs.each do |lang| + `cat test/progit/#{lang}/*/*.markdown >> test/benchinput.md` + end + end + $LOAD_PATH.unshift 'lib' + load 'test/benchmark.rb' +end + +desc 'Match C style of cmark' +task :format do + sh 'clang-format -style llvm -i ext/commonmarker/*.c ext/commonmarker/*.h' +end + +# Documentation +require 'rdoc/task' + +desc 'Generate API documentation' +RDoc::Task.new do |rd| + rd.rdoc_dir = 'docs' + rd.main = 'README.md' + rd.rdoc_files.include 'README.md', 'lib/**/*.rb', 'ext/commonmarker/commonmarker.c' + + rd.options << '--markup tomdoc' + rd.options << '--inline-source' + rd.options << '--line-numbers' + rd.options << '--all' + rd.options << '--fileboxes' +end + +desc 'Generate and publish docs to gh-pages' +task :publish => [:rdoc] do + require 'shellwords' + + Dir.mktmpdir do |tmp| + system "mv docs/* #{tmp}" + system 'git checkout gh-pages' + system 'rm -rf *' + system "mv #{tmp}/* ." + message = Shellwords.escape("Site updated at #{Time.now.utc}") + system 'git add .' + system "git commit -am #{message}" + system 'git push origin gh-pages --force' + system 'git checkout master' + system 'echo yolo' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/bin/commonmarker b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/bin/commonmarker new file mode 100644 index 000000000000..9e515bafb4a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/bin/commonmarker @@ -0,0 +1,58 @@ +#!/usr/bin/env ruby +# Usage: commonmarker [--html-renderer] [--list-extensions] [--extension=EXTENSION] [FILE..] +# Convert one or more CommonMark files to HTML and write to standard output. +# If no FILE argument is provided, text will be read from STDIN. +# With --html-renderer, use the HtmlRenderer renderer rather than the native C +# renderer. +# With --extension=EXTENSION, EXTENSION will be used for parsing, and HTML +# output unless --html-renderer is specified. +if ARGV.include?('--help') or ARGV.include?('-h') + File.read(__FILE__).split("\n").grep(/^# /).each do |line| + puts line[2..-1] + end + exit 0 +end + +$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w( .. lib )) +require 'commonmarker' + +if ARGV.include?('--version') or ARGV.include?('-v') + puts "commonmarker #{CommonMarker::VERSION}" + exit 0 +end + +root = File.expand_path('../../', __FILE__) +$:.unshift File.expand_path('lib', root) + +extensions = CommonMarker.extensions +active_extensions = [] + +renderer = nil +ARGV.delete_if do |arg| + if arg =~ /^--html-renderer$/ + renderer = true + true + elsif arg =~ /^--list-extensions$/ + puts extensions + exit 0 + elsif arg =~ /^--extension=(.+)$/ + if extensions.include?($1) + active_extensions << $1.intern + else + STDERR.puts "extension #$1 not found" + exit 1 + end + true + else + false + end +end + +doc = CommonMarker.render_doc(ARGF.read, :DEFAULT, active_extensions) + +if renderer + renderer = CommonMarker::HtmlRenderer.new(extensions: active_extensions) + STDOUT.write(renderer.render(doc)) +else + STDOUT.write(doc.to_html(:DEFAULT, active_extensions)) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/commonmarker.gemspec b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/commonmarker.gemspec new file mode 100644 index 000000000000..6d1bf5d4034b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/commonmarker.gemspec @@ -0,0 +1,36 @@ +# encoding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'commonmarker/version' + +Gem::Specification.new do |s| + s.name = 'commonmarker' + s.version = CommonMarker::VERSION + s.summary = 'CommonMark parser and renderer. Written in C, wrapped in Ruby.' + s.description = 'A fast, safe, extensible parser for CommonMark. This wraps the official libcmark library.' + s.authors = ['Garen Torikian', 'Ashe Connor'] + s.homepage = 'http://github.com/gjtorikian/commonmarker' + s.license = 'MIT' + s.required_ruby_version = '>= 2.0.0' + + s.files = %w(LICENSE.txt README.md Rakefile commonmarker.gemspec bin/commonmarker) + s.files += Dir.glob('lib/**/*.rb') + s.files += Dir.glob('ext/commonmarker/*.*') + s.test_files = Dir.glob('test/**/*') + s.extensions = ['ext/commonmarker/extconf.rb'] + + s.test_files = s.files.grep(%r{^test/}) + s.executables = ['commonmarker'] + s.require_paths = %w(lib ext) + + s.rdoc_options += ['-x', 'ext/commonmarker/cmark/.*'] + + s.add_dependency 'ruby-enum', '~> 0.5' + + s.add_development_dependency 'minitest', '~> 5.6' + s.add_development_dependency 'rake-compiler', '~> 0.9' + s.add_development_dependency 'bundler', '~> 1.2' + s.add_development_dependency 'json', '~> 1.8.1' + s.add_development_dependency 'awesome_print' + s.add_development_dependency 'rdoc', '~> 5.1' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/.sitearchdir.-.commonmarker.time b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/.sitearchdir.-.commonmarker.time new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/Makefile b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/Makefile new file mode 100644 index 000000000000..428346f03560 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/Makefile @@ -0,0 +1,263 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 +hdrdir = $(topdir) +arch_hdrdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/home/app/.rbenv/versions/2.5.1 +rubysitearchprefix = $(rubylibprefix)/$(sitearch) +rubyarchprefix = $(rubylibprefix)/$(arch) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) +sitearchhdrdir = $(sitehdrdir)/$(sitearch) +rubyarchhdrdir = $(rubyhdrdir)/$(arch) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(vendorlibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)./.gem.20211005-8-57yfuh +sitelibdir = $(DESTDIR)./.gem.20211005-8-57yfuh +sitedir = $(rubylibprefix)/site_ruby +rubyarchdir = $(rubylibdir)/$(arch) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +localstatedir = $(prefix)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(prefix)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC = gcc +CXX = g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = $(optflags) $(debugflags) $(warnflags) +optflags = -O3 +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) $(cflags) -fPIC -std=c99 $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -I/home/app/.rbenv/versions/2.5.1/include $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) $(cxxflags) $(ARCH_FLAG) +ldflags = -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic +dldflags = -L/home/app/.rbenv/versions/2.5.1/lib -Wl,--compress-debug-sections=zlib +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) +RUBY_SO_NAME = ruby +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux +sitearch = $(arch) +ruby_version = 2.5.0 +ruby = $(bindir)/$(RUBY_BASE_NAME) +RUBY = $(ruby) +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /usr/bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(libdir) +LIBPATH = -L. -L$(libdir) -Wl,-rpath,$(libdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = /commonmarker +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc +ORIG_SRCS = arena.c autolink.c blocks.c buffer.c cmark.c cmark_ctype.c commonmark.c commonmarker.c core-extensions.c ext_scanners.c footnotes.c houdini_href_e.c houdini_html_e.c houdini_html_u.c html.c inlines.c iterator.c latex.c linked_list.c man.c map.c node.c plaintext.c plugin.c references.c registry.c render.c scanners.c strikethrough.c syntax_extension.c table.c tagfilter.c utf8.c xml.c +SRCS = $(ORIG_SRCS) +OBJS = arena.o autolink.o blocks.o buffer.o cmark.o cmark_ctype.o commonmark.o commonmarker.o core-extensions.o ext_scanners.o footnotes.o houdini_href_e.o houdini_html_e.o houdini_html_u.o html.o inlines.o iterator.o latex.o linked_list.o man.o map.o node.o plaintext.o plugin.o references.o registry.o render.o scanners.o strikethrough.o syntax_extension.o table.o tagfilter.o utf8.o xml.o +HDRS = $(srcdir)/syntax_extension.h $(srcdir)/parser.h $(srcdir)/tagfilter.h $(srcdir)/cmark-gfm_version.h $(srcdir)/autolink.h $(srcdir)/config.h $(srcdir)/cmark-gfm_export.h $(srcdir)/cmark-gfm-extensions_export.h $(srcdir)/scanners.h $(srcdir)/node.h $(srcdir)/cmark-gfm.h $(srcdir)/inlines.h $(srcdir)/references.h $(srcdir)/commonmarker.h $(srcdir)/ext_scanners.h $(srcdir)/plugin.h $(srcdir)/utf8.h $(srcdir)/strikethrough.h $(srcdir)/table.h $(srcdir)/render.h $(srcdir)/iterator.h $(srcdir)/chunk.h $(srcdir)/buffer.h $(srcdir)/cmark_ctype.h $(srcdir)/cmark-gfm-core-extensions.h $(srcdir)/html.h $(srcdir)/footnotes.h $(srcdir)/cmark-gfm-extension_api.h $(srcdir)/map.h $(srcdir)/houdini.h $(srcdir)/registry.h +LOCAL_HDRS = +TARGET = commonmarker +TARGET_NAME = commonmarker +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) +ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) +CLEANOBJS = *.o *.bak + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.-.commonmarker.time + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TIMESTAMP_DIR)/.sitearchdir.-.commonmarker.time: + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object commonmarker/$(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/arena.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/arena.c new file mode 100644 index 000000000000..83a15255fc33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/arena.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include "cmark-gfm.h" +#include "cmark-gfm-extension_api.h" + +static struct arena_chunk { + size_t sz, used; + uint8_t push_point; + void *ptr; + struct arena_chunk *prev; +} *A = NULL; + +static struct arena_chunk *alloc_arena_chunk(size_t sz, struct arena_chunk *prev) { + struct arena_chunk *c = (struct arena_chunk *)calloc(1, sizeof(*c)); + if (!c) + abort(); + c->sz = sz; + c->ptr = calloc(1, sz); + if (!c->ptr) + abort(); + c->prev = prev; + return c; +} + +void cmark_arena_push(void) { + if (!A) + return; + A->push_point = 1; + A = alloc_arena_chunk(10240, A); +} + +int cmark_arena_pop(void) { + if (!A) + return 0; + while (A && !A->push_point) { + free(A->ptr); + struct arena_chunk *n = A->prev; + free(A); + A = n; + } + if (A) + A->push_point = 0; + return 1; +} + +static void init_arena(void) { + A = alloc_arena_chunk(4 * 1048576, NULL); +} + +void cmark_arena_reset(void) { + while (A) { + free(A->ptr); + struct arena_chunk *n = A->prev; + free(A); + A = n; + } +} + +static void *arena_calloc(size_t nmem, size_t size) { + if (!A) + init_arena(); + + size_t sz = nmem * size + sizeof(size_t); + + // Round allocation sizes to largest integer size to + // ensure returned memory is correctly aligned + const size_t align = sizeof(size_t) - 1; + sz = (sz + align) & ~align; + + if (sz > A->sz) { + A->prev = alloc_arena_chunk(sz, A->prev); + return (uint8_t *) A->prev->ptr + sizeof(size_t); + } + if (sz > A->sz - A->used) { + A = alloc_arena_chunk(A->sz + A->sz / 2, A); + } + void *ptr = (uint8_t *) A->ptr + A->used; + A->used += sz; + *((size_t *) ptr) = sz - sizeof(size_t); + return (uint8_t *) ptr + sizeof(size_t); +} + +static void *arena_realloc(void *ptr, size_t size) { + if (!A) + init_arena(); + + void *new_ptr = arena_calloc(1, size); + if (ptr) + memcpy(new_ptr, ptr, ((size_t *) ptr)[-1]); + return new_ptr; +} + +static void arena_free(void *ptr) { + (void) ptr; + /* no-op */ +} + +cmark_mem CMARK_ARENA_MEM_ALLOCATOR = {arena_calloc, arena_realloc, arena_free}; + +cmark_mem *cmark_get_arena_mem_allocator() { + return &CMARK_ARENA_MEM_ALLOCATOR; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/arena.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/arena.o new file mode 100644 index 000000000000..538187ac4e47 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/arena.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/autolink.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/autolink.c new file mode 100644 index 000000000000..03a135f17148 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/autolink.c @@ -0,0 +1,421 @@ +#include "autolink.h" +#include +#include +#include + +#if defined(_WIN32) +#define strncasecmp _strnicmp +#else +#include +#endif + +static int is_valid_hostchar(const uint8_t *link, size_t link_len) { + int32_t ch; + int r = cmark_utf8proc_iterate(link, (bufsize_t)link_len, &ch); + if (r < 0) + return 0; + return !cmark_utf8proc_is_space(ch) && !cmark_utf8proc_is_punctuation(ch); +} + +static int sd_autolink_issafe(const uint8_t *link, size_t link_len) { + static const size_t valid_uris_count = 3; + static const char *valid_uris[] = {"http://", "https://", "ftp://"}; + + size_t i; + + for (i = 0; i < valid_uris_count; ++i) { + size_t len = strlen(valid_uris[i]); + + if (link_len > len && strncasecmp((char *)link, valid_uris[i], len) == 0 && + is_valid_hostchar(link + len, link_len - len)) + return 1; + } + + return 0; +} + +static size_t autolink_delim(uint8_t *data, size_t link_end) { + uint8_t cclose, copen; + size_t i; + + for (i = 0; i < link_end; ++i) + if (data[i] == '<') { + link_end = i; + break; + } + + while (link_end > 0) { + cclose = data[link_end - 1]; + + switch (cclose) { + case ')': + copen = '('; + break; + default: + copen = 0; + } + + if (strchr("?!.,:*_~'\"", data[link_end - 1]) != NULL) + link_end--; + + else if (data[link_end - 1] == ';') { + size_t new_end = link_end - 2; + + while (new_end > 0 && cmark_isalpha(data[new_end])) + new_end--; + + if (new_end < link_end - 2 && data[new_end] == '&') + link_end = new_end; + else + link_end--; + } else if (copen != 0) { + size_t closing = 0; + size_t opening = 0; + i = 0; + + /* Allow any number of matching brackets (as recognised in copen/cclose) + * at the end of the URL. If there is a greater number of closing + * brackets than opening ones, we remove one character from the end of + * the link. + * + * Examples (input text => output linked portion): + * + * http://www.pokemon.com/Pikachu_(Electric) + * => http://www.pokemon.com/Pikachu_(Electric) + * + * http://www.pokemon.com/Pikachu_((Electric) + * => http://www.pokemon.com/Pikachu_((Electric) + * + * http://www.pokemon.com/Pikachu_(Electric)) + * => http://www.pokemon.com/Pikachu_(Electric) + * + * http://www.pokemon.com/Pikachu_((Electric)) + * => http://www.pokemon.com/Pikachu_((Electric)) + */ + + while (i < link_end) { + if (data[i] == copen) + opening++; + else if (data[i] == cclose) + closing++; + + i++; + } + + if (closing <= opening) + break; + + link_end--; + } else + break; + } + + return link_end; +} + +static size_t check_domain(uint8_t *data, size_t size, int allow_short) { + size_t i, np = 0, uscore1 = 0, uscore2 = 0; + + for (i = 1; i < size - 1; i++) { + if (data[i] == '_') + uscore2++; + else if (data[i] == '.') { + uscore1 = uscore2; + uscore2 = 0; + np++; + } else if (!is_valid_hostchar(data + i, size - i) && data[i] != '-') + break; + } + + if (uscore1 > 0 || uscore2 > 0) + return 0; + + if (allow_short) { + /* We don't need a valid domain in the strict sense (with + * least one dot; so just make sure it's composed of valid + * domain characters and return the length of the the valid + * sequence. */ + return i; + } else { + /* a valid domain needs to have at least a dot. + * that's as far as we get */ + return np ? i : 0; + } +} + +static cmark_node *www_match(cmark_parser *parser, cmark_node *parent, + cmark_inline_parser *inline_parser) { + cmark_chunk *chunk = cmark_inline_parser_get_chunk(inline_parser); + size_t max_rewind = cmark_inline_parser_get_offset(inline_parser); + uint8_t *data = chunk->data + max_rewind; + size_t size = chunk->len - max_rewind; + int start = cmark_inline_parser_get_column(inline_parser); + + size_t link_end; + + if (max_rewind > 0 && strchr("*_~(", data[-1]) == NULL && + !cmark_isspace(data[-1])) + return 0; + + if (size < 4 || memcmp(data, "www.", strlen("www.")) != 0) + return 0; + + link_end = check_domain(data, size, 0); + + if (link_end == 0) + return NULL; + + while (link_end < size && !cmark_isspace(data[link_end])) + link_end++; + + link_end = autolink_delim(data, link_end); + + if (link_end == 0) + return NULL; + + cmark_inline_parser_set_offset(inline_parser, (int)(max_rewind + link_end)); + + cmark_node *node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem); + + cmark_strbuf buf; + cmark_strbuf_init(parser->mem, &buf, 10); + cmark_strbuf_puts(&buf, "http://"); + cmark_strbuf_put(&buf, data, (bufsize_t)link_end); + node->as.link.url = cmark_chunk_buf_detach(&buf); + + cmark_node *text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem); + text->as.literal = + cmark_chunk_dup(chunk, (bufsize_t)max_rewind, (bufsize_t)link_end); + cmark_node_append_child(node, text); + + node->start_line = text->start_line = + node->end_line = text->end_line = + cmark_inline_parser_get_line(inline_parser); + + node->start_column = text->start_column = start - 1; + node->end_column = text->end_column = cmark_inline_parser_get_column(inline_parser) - 1; + + return node; +} + +static cmark_node *url_match(cmark_parser *parser, cmark_node *parent, + cmark_inline_parser *inline_parser) { + size_t link_end, domain_len; + int rewind = 0; + + cmark_chunk *chunk = cmark_inline_parser_get_chunk(inline_parser); + int max_rewind = cmark_inline_parser_get_offset(inline_parser); + uint8_t *data = chunk->data + max_rewind; + size_t size = chunk->len - max_rewind; + + if (size < 4 || data[1] != '/' || data[2] != '/') + return 0; + + while (rewind < max_rewind && cmark_isalpha(data[-rewind - 1])) + rewind++; + + if (!sd_autolink_issafe(data - rewind, size + rewind)) + return 0; + + link_end = strlen("://"); + + domain_len = check_domain(data + link_end, size - link_end, 1); + + if (domain_len == 0) + return 0; + + link_end += domain_len; + while (link_end < size && !cmark_isspace(data[link_end])) + link_end++; + + link_end = autolink_delim(data, link_end); + + if (link_end == 0) + return NULL; + + cmark_inline_parser_set_offset(inline_parser, (int)(max_rewind + link_end)); + cmark_node_unput(parent, rewind); + + cmark_node *node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem); + + cmark_chunk url = cmark_chunk_dup(chunk, max_rewind - rewind, + (bufsize_t)(link_end + rewind)); + node->as.link.url = url; + + cmark_node *text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem); + text->as.literal = url; + cmark_node_append_child(node, text); + + return node; +} + +static cmark_node *match(cmark_syntax_extension *ext, cmark_parser *parser, + cmark_node *parent, unsigned char c, + cmark_inline_parser *inline_parser) { + if (cmark_inline_parser_in_bracket(inline_parser, false) || + cmark_inline_parser_in_bracket(inline_parser, true)) + return NULL; + + if (c == ':') + return url_match(parser, parent, inline_parser); + + if (c == 'w') + return www_match(parser, parent, inline_parser); + + return NULL; + + // note that we could end up re-consuming something already a + // part of an inline, because we don't track when the last + // inline was finished in inlines.c. +} + +static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset) { + size_t link_end; + uint8_t *data = text->as.literal.data, + *at; + size_t size = text->as.literal.len; + int rewind, max_rewind, + nb = 0, np = 0, ns = 0; + + if (offset < 0 || (size_t)offset >= size) + return; + + data += offset; + size -= offset; + + at = (uint8_t *)memchr(data, '@', size); + if (!at) + return; + + max_rewind = (int)(at - data); + data += max_rewind; + size -= max_rewind; + + for (rewind = 0; rewind < max_rewind; ++rewind) { + uint8_t c = data[-rewind - 1]; + + if (cmark_isalnum(c)) + continue; + + if (strchr(".+-_", c) != NULL) + continue; + + if (c == '/') + ns++; + + break; + } + + if (rewind == 0 || ns > 0) { + postprocess_text(parser, text, max_rewind + 1 + offset); + return; + } + + for (link_end = 0; link_end < size; ++link_end) { + uint8_t c = data[link_end]; + + if (cmark_isalnum(c)) + continue; + + if (c == '@') + nb++; + else if (c == '.' && link_end < size - 1 && cmark_isalnum(data[link_end + 1])) + np++; + else if (c != '-' && c != '_') + break; + } + + if (link_end < 2 || nb != 1 || np == 0 || + (!cmark_isalpha(data[link_end - 1]) && data[link_end - 1] != '.')) { + postprocess_text(parser, text, max_rewind + 1 + offset); + return; + } + + link_end = autolink_delim(data, link_end); + + if (link_end == 0) { + postprocess_text(parser, text, max_rewind + 1 + offset); + return; + } + + cmark_chunk_to_cstr(parser->mem, &text->as.literal); + + cmark_node *link_node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem); + cmark_strbuf buf; + cmark_strbuf_init(parser->mem, &buf, 10); + cmark_strbuf_puts(&buf, "mailto:"); + cmark_strbuf_put(&buf, data - rewind, (bufsize_t)(link_end + rewind)); + link_node->as.link.url = cmark_chunk_buf_detach(&buf); + + cmark_node *link_text = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem); + cmark_chunk email = cmark_chunk_dup( + &text->as.literal, + offset + max_rewind - rewind, + (bufsize_t)(link_end + rewind)); + cmark_chunk_to_cstr(parser->mem, &email); + link_text->as.literal = email; + cmark_node_append_child(link_node, link_text); + + cmark_node_insert_after(text, link_node); + + cmark_node *post = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem); + post->as.literal = cmark_chunk_dup(&text->as.literal, + (bufsize_t)(offset + max_rewind + link_end), + (bufsize_t)(size - link_end)); + cmark_chunk_to_cstr(parser->mem, &post->as.literal); + + cmark_node_insert_after(link_node, post); + + text->as.literal.len = offset + max_rewind - rewind; + text->as.literal.data[text->as.literal.len] = 0; + + postprocess_text(parser, post, 0); +} + +static cmark_node *postprocess(cmark_syntax_extension *ext, cmark_parser *parser, cmark_node *root) { + cmark_iter *iter; + cmark_event_type ev; + cmark_node *node; + bool in_link = false; + + cmark_consolidate_text_nodes(root); + iter = cmark_iter_new(root); + + while ((ev = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + node = cmark_iter_get_node(iter); + if (in_link) { + if (ev == CMARK_EVENT_EXIT && node->type == CMARK_NODE_LINK) { + in_link = false; + } + continue; + } + + if (ev == CMARK_EVENT_ENTER && node->type == CMARK_NODE_LINK) { + in_link = true; + continue; + } + + if (ev == CMARK_EVENT_ENTER && node->type == CMARK_NODE_TEXT) { + postprocess_text(parser, node, 0); + } + } + + cmark_iter_free(iter); + + return root; +} + +cmark_syntax_extension *create_autolink_extension(void) { + cmark_syntax_extension *ext = cmark_syntax_extension_new("autolink"); + cmark_llist *special_chars = NULL; + + cmark_syntax_extension_set_match_inline_func(ext, match); + cmark_syntax_extension_set_postprocess_func(ext, postprocess); + + cmark_mem *mem = cmark_get_default_mem_allocator(); + special_chars = cmark_llist_append(mem, special_chars, (void *)':'); + special_chars = cmark_llist_append(mem, special_chars, (void *)'w'); + cmark_syntax_extension_set_special_inline_chars(ext, special_chars); + + return ext; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/autolink.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/autolink.h new file mode 100644 index 000000000000..4e179379dd92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/autolink.h @@ -0,0 +1,8 @@ +#ifndef CMARK_GFM_AUTOLINK_H +#define CMARK_GFM_AUTOLINK_H + +#include "cmark-gfm-core-extensions.h" + +cmark_syntax_extension *create_autolink_extension(void); + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/autolink.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/autolink.o new file mode 100644 index 000000000000..7ecf44e68438 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/autolink.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/blocks.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/blocks.c new file mode 100644 index 000000000000..97661f3e6e07 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/blocks.c @@ -0,0 +1,1525 @@ +/** + * Block parsing implementation. + * + * For a high-level overview of the block parsing process, + * see http://spec.commonmark.org/0.24/#phase-1-block-structure + */ + +#include +#include +#include + +#include "cmark_ctype.h" +#include "syntax_extension.h" +#include "config.h" +#include "parser.h" +#include "cmark-gfm.h" +#include "node.h" +#include "references.h" +#include "utf8.h" +#include "scanners.h" +#include "inlines.h" +#include "houdini.h" +#include "buffer.h" +#include "footnotes.h" + +#define CODE_INDENT 4 +#define TAB_STOP 4 + +#ifndef MIN +#define MIN(x, y) ((x < y) ? x : y) +#endif + +#define peek_at(i, n) (i)->data[n] + +static bool S_last_line_blank(const cmark_node *node) { + return (node->flags & CMARK_NODE__LAST_LINE_BLANK) != 0; +} + +static CMARK_INLINE cmark_node_type S_type(const cmark_node *node) { + return (cmark_node_type)node->type; +} + +static void S_set_last_line_blank(cmark_node *node, bool is_blank) { + if (is_blank) + node->flags |= CMARK_NODE__LAST_LINE_BLANK; + else + node->flags &= ~CMARK_NODE__LAST_LINE_BLANK; +} + +static CMARK_INLINE bool S_is_line_end_char(char c) { + return (c == '\n' || c == '\r'); +} + +static CMARK_INLINE bool S_is_space_or_tab(char c) { + return (c == ' ' || c == '\t'); +} + +static void S_parser_feed(cmark_parser *parser, const unsigned char *buffer, + size_t len, bool eof); + +static void S_process_line(cmark_parser *parser, const unsigned char *buffer, + bufsize_t bytes); + +static cmark_node *make_block(cmark_mem *mem, cmark_node_type tag, + int start_line, int start_column) { + cmark_node *e; + + e = (cmark_node *)mem->calloc(1, sizeof(*e)); + cmark_strbuf_init(mem, &e->content, 32); + e->type = (uint16_t)tag; + e->flags = CMARK_NODE__OPEN; + e->start_line = start_line; + e->start_column = start_column; + e->end_line = start_line; + + return e; +} + +// Create a root document node. +static cmark_node *make_document(cmark_mem *mem) { + cmark_node *e = make_block(mem, CMARK_NODE_DOCUMENT, 1, 1); + return e; +} + +int cmark_parser_attach_syntax_extension(cmark_parser *parser, + cmark_syntax_extension *extension) { + parser->syntax_extensions = cmark_llist_append(parser->mem, parser->syntax_extensions, extension); + if (extension->match_inline || extension->insert_inline_from_delim) { + parser->inline_syntax_extensions = cmark_llist_append( + parser->mem, parser->inline_syntax_extensions, extension); + } + + return 1; +} + +static void cmark_parser_dispose(cmark_parser *parser) { + if (parser->root) + cmark_node_free(parser->root); + + if (parser->refmap) + cmark_map_free(parser->refmap); +} + +static void cmark_parser_reset(cmark_parser *parser) { + cmark_llist *saved_exts = parser->syntax_extensions; + cmark_llist *saved_inline_exts = parser->inline_syntax_extensions; + int saved_options = parser->options; + cmark_mem *saved_mem = parser->mem; + + cmark_parser_dispose(parser); + + memset(parser, 0, sizeof(cmark_parser)); + parser->mem = saved_mem; + + cmark_strbuf_init(parser->mem, &parser->curline, 256); + cmark_strbuf_init(parser->mem, &parser->linebuf, 0); + + cmark_node *document = make_document(parser->mem); + + parser->refmap = cmark_reference_map_new(parser->mem); + parser->root = document; + parser->current = document; + + parser->last_buffer_ended_with_cr = false; + + parser->syntax_extensions = saved_exts; + parser->inline_syntax_extensions = saved_inline_exts; + parser->options = saved_options; +} + +cmark_parser *cmark_parser_new_with_mem(int options, cmark_mem *mem) { + cmark_parser *parser = (cmark_parser *)mem->calloc(1, sizeof(cmark_parser)); + parser->mem = mem; + parser->options = options; + cmark_parser_reset(parser); + return parser; +} + +cmark_parser *cmark_parser_new(int options) { + extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR; + return cmark_parser_new_with_mem(options, &CMARK_DEFAULT_MEM_ALLOCATOR); +} + +void cmark_parser_free(cmark_parser *parser) { + cmark_mem *mem = parser->mem; + cmark_parser_dispose(parser); + cmark_strbuf_free(&parser->curline); + cmark_strbuf_free(&parser->linebuf); + cmark_llist_free(parser->mem, parser->syntax_extensions); + cmark_llist_free(parser->mem, parser->inline_syntax_extensions); + mem->free(parser); +} + +static cmark_node *finalize(cmark_parser *parser, cmark_node *b); + +// Returns true if line has only space characters, else false. +static bool is_blank(cmark_strbuf *s, bufsize_t offset) { + while (offset < s->size) { + switch (s->ptr[offset]) { + case '\r': + case '\n': + return true; + case ' ': + offset++; + break; + case '\t': + offset++; + break; + default: + return false; + } + } + + return true; +} + +static CMARK_INLINE bool accepts_lines(cmark_node_type block_type) { + return (block_type == CMARK_NODE_PARAGRAPH || + block_type == CMARK_NODE_HEADING || + block_type == CMARK_NODE_CODE_BLOCK); +} + +static CMARK_INLINE bool contains_inlines(cmark_node *node) { + if (node->extension && node->extension->contains_inlines_func) { + return node->extension->contains_inlines_func(node->extension, node) != 0; + } + + return (node->type == CMARK_NODE_PARAGRAPH || + node->type == CMARK_NODE_HEADING); +} + +static void add_line(cmark_node *node, cmark_chunk *ch, cmark_parser *parser) { + int chars_to_tab; + int i; + assert(node->flags & CMARK_NODE__OPEN); + if (parser->partially_consumed_tab) { + parser->offset += 1; // skip over tab + // add space characters: + chars_to_tab = TAB_STOP - (parser->column % TAB_STOP); + for (i = 0; i < chars_to_tab; i++) { + cmark_strbuf_putc(&node->content, ' '); + } + } + cmark_strbuf_put(&node->content, ch->data + parser->offset, + ch->len - parser->offset); +} + +static void remove_trailing_blank_lines(cmark_strbuf *ln) { + bufsize_t i; + unsigned char c; + + for (i = ln->size - 1; i >= 0; --i) { + c = ln->ptr[i]; + + if (c != ' ' && c != '\t' && !S_is_line_end_char(c)) + break; + } + + if (i < 0) { + cmark_strbuf_clear(ln); + return; + } + + for (; i < ln->size; ++i) { + c = ln->ptr[i]; + + if (!S_is_line_end_char(c)) + continue; + + cmark_strbuf_truncate(ln, i); + break; + } +} + +// Check to see if a node ends with a blank line, descending +// if needed into lists and sublists. +static bool ends_with_blank_line(cmark_node *node) { + cmark_node *cur = node; + while (cur != NULL) { + if (S_last_line_blank(cur)) { + return true; + } + if (S_type(cur) == CMARK_NODE_LIST || S_type(cur) == CMARK_NODE_ITEM) { + cur = cur->last_child; + } else { + cur = NULL; + } + } + return false; +} + +static cmark_node *finalize(cmark_parser *parser, cmark_node *b) { + bufsize_t pos; + cmark_node *item; + cmark_node *subitem; + cmark_node *parent; + + parent = b->parent; + assert(b->flags & + CMARK_NODE__OPEN); // shouldn't call finalize on closed blocks + b->flags &= ~CMARK_NODE__OPEN; + + if (parser->curline.size == 0) { + // end of input - line number has not been incremented + b->end_line = parser->line_number; + b->end_column = parser->last_line_length; + } else if (S_type(b) == CMARK_NODE_DOCUMENT || + (S_type(b) == CMARK_NODE_CODE_BLOCK && b->as.code.fenced) || + (S_type(b) == CMARK_NODE_HEADING && b->as.heading.setext)) { + b->end_line = parser->line_number; + b->end_column = parser->curline.size; + if (b->end_column && parser->curline.ptr[b->end_column - 1] == '\n') + b->end_column -= 1; + if (b->end_column && parser->curline.ptr[b->end_column - 1] == '\r') + b->end_column -= 1; + } else { + b->end_line = parser->line_number - 1; + b->end_column = parser->last_line_length; + } + + cmark_strbuf *node_content = &b->content; + + switch (S_type(b)) { + case CMARK_NODE_PARAGRAPH: + { + cmark_chunk chunk = {node_content->ptr, node_content->size, 0}; + while (chunk.len && chunk.data[0] == '[' && + (pos = cmark_parse_reference_inline(parser->mem, &chunk, parser->refmap))) { + + chunk.data += pos; + chunk.len -= pos; + } + cmark_strbuf_drop(node_content, (node_content->size - chunk.len)); + if (is_blank(node_content, 0)) { + // remove blank node (former reference def) + cmark_node_free(b); + } + break; + } + + case CMARK_NODE_CODE_BLOCK: + if (!b->as.code.fenced) { // indented code + remove_trailing_blank_lines(node_content); + cmark_strbuf_putc(node_content, '\n'); + } else { + // first line of contents becomes info + for (pos = 0; pos < node_content->size; ++pos) { + if (S_is_line_end_char(node_content->ptr[pos])) + break; + } + assert(pos < node_content->size); + + cmark_strbuf tmp = CMARK_BUF_INIT(parser->mem); + houdini_unescape_html_f(&tmp, node_content->ptr, pos); + cmark_strbuf_trim(&tmp); + cmark_strbuf_unescape(&tmp); + b->as.code.info = cmark_chunk_buf_detach(&tmp); + + if (node_content->ptr[pos] == '\r') + pos += 1; + if (node_content->ptr[pos] == '\n') + pos += 1; + cmark_strbuf_drop(node_content, pos); + } + b->as.code.literal = cmark_chunk_buf_detach(node_content); + break; + + case CMARK_NODE_HTML_BLOCK: + b->as.literal = cmark_chunk_buf_detach(node_content); + break; + + case CMARK_NODE_LIST: // determine tight/loose status + b->as.list.tight = true; // tight by default + item = b->first_child; + + while (item) { + // check for non-final non-empty list item ending with blank line: + if (S_last_line_blank(item) && item->next) { + b->as.list.tight = false; + break; + } + // recurse into children of list item, to see if there are + // spaces between them: + subitem = item->first_child; + while (subitem) { + if (ends_with_blank_line(subitem) && (item->next || subitem->next)) { + b->as.list.tight = false; + break; + } + subitem = subitem->next; + } + if (!(b->as.list.tight)) { + break; + } + item = item->next; + } + + break; + + default: + break; + } + + return parent; +} + +// Add a node as child of another. Return pointer to child. +static cmark_node *add_child(cmark_parser *parser, cmark_node *parent, + cmark_node_type block_type, int start_column) { + assert(parent); + + // if 'parent' isn't the kind of node that can accept this child, + // then back up til we hit a node that can. + while (!cmark_node_can_contain_type(parent, block_type)) { + parent = finalize(parser, parent); + } + + cmark_node *child = + make_block(parser->mem, block_type, parser->line_number, start_column); + child->parent = parent; + + if (parent->last_child) { + parent->last_child->next = child; + child->prev = parent->last_child; + } else { + parent->first_child = child; + child->prev = NULL; + } + parent->last_child = child; + return child; +} + +void cmark_manage_extensions_special_characters(cmark_parser *parser, int add) { + cmark_llist *tmp_ext; + + for (tmp_ext = parser->inline_syntax_extensions; tmp_ext; tmp_ext=tmp_ext->next) { + cmark_syntax_extension *ext = (cmark_syntax_extension *) tmp_ext->data; + cmark_llist *tmp_char; + for (tmp_char = ext->special_inline_chars; tmp_char; tmp_char=tmp_char->next) { + unsigned char c = (unsigned char)(size_t)tmp_char->data; + if (add) + cmark_inlines_add_special_character(c, ext->emphasis); + else + cmark_inlines_remove_special_character(c, ext->emphasis); + } + } +} + +// Walk through node and all children, recursively, parsing +// string content into inline content where appropriate. +static void process_inlines(cmark_parser *parser, + cmark_map *refmap, int options) { + cmark_iter *iter = cmark_iter_new(parser->root); + cmark_node *cur; + cmark_event_type ev_type; + + cmark_manage_extensions_special_characters(parser, true); + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (ev_type == CMARK_EVENT_ENTER) { + if (contains_inlines(cur)) { + cmark_parse_inlines(parser, cur, refmap, options); + } + } + } + + cmark_manage_extensions_special_characters(parser, false); + + cmark_iter_free(iter); +} + +static int sort_footnote_by_ix(const void *_a, const void *_b) { + cmark_footnote *a = *(cmark_footnote **)_a; + cmark_footnote *b = *(cmark_footnote **)_b; + return (int)a->ix - (int)b->ix; +} + +static void process_footnotes(cmark_parser *parser) { + // * Collect definitions in a map. + // * Iterate the references in the document in order, assigning indices to + // definitions in the order they're seen. + // * Write out the footnotes at the bottom of the document in index order. + + cmark_map *map = cmark_footnote_map_new(parser->mem); + + cmark_iter *iter = cmark_iter_new(parser->root); + cmark_node *cur; + cmark_event_type ev_type; + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (ev_type == CMARK_EVENT_EXIT && cur->type == CMARK_NODE_FOOTNOTE_DEFINITION) { + cmark_node_unlink(cur); + cmark_footnote_create(map, cur); + } + } + + cmark_iter_free(iter); + iter = cmark_iter_new(parser->root); + unsigned int ix = 0; + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (ev_type == CMARK_EVENT_EXIT && cur->type == CMARK_NODE_FOOTNOTE_REFERENCE) { + cmark_footnote *footnote = (cmark_footnote *)cmark_map_lookup(map, &cur->as.literal); + if (footnote) { + if (!footnote->ix) + footnote->ix = ++ix; + + char n[32]; + snprintf(n, sizeof(n), "%d", footnote->ix); + cmark_chunk_free(parser->mem, &cur->as.literal); + cmark_strbuf buf = CMARK_BUF_INIT(parser->mem); + cmark_strbuf_puts(&buf, n); + + cur->as.literal = cmark_chunk_buf_detach(&buf); + } else { + cmark_node *text = (cmark_node *)parser->mem->calloc(1, sizeof(*text)); + cmark_strbuf_init(parser->mem, &text->content, 0); + text->type = (uint16_t) CMARK_NODE_TEXT; + + cmark_strbuf buf = CMARK_BUF_INIT(parser->mem); + cmark_strbuf_puts(&buf, "[^"); + cmark_strbuf_put(&buf, cur->as.literal.data, cur->as.literal.len); + cmark_strbuf_putc(&buf, ']'); + + text->as.literal = cmark_chunk_buf_detach(&buf); + cmark_node_insert_after(cur, text); + cmark_node_free(cur); + } + } + } + + cmark_iter_free(iter); + + if (map->sorted) { + qsort(map->sorted, map->size, sizeof(cmark_map_entry *), sort_footnote_by_ix); + for (unsigned int i = 0; i < map->size; ++i) { + cmark_footnote *footnote = (cmark_footnote *)map->sorted[i]; + if (!footnote->ix) + continue; + cmark_node_append_child(parser->root, footnote->node); + footnote->node = NULL; + } + } + + cmark_map_free(map); +} + +// Attempts to parse a list item marker (bullet or enumerated). +// On success, returns length of the marker, and populates +// data with the details. On failure, returns 0. +static bufsize_t parse_list_marker(cmark_mem *mem, cmark_chunk *input, + bufsize_t pos, bool interrupts_paragraph, + cmark_list **dataptr) { + unsigned char c; + bufsize_t startpos; + cmark_list *data; + bufsize_t i; + + startpos = pos; + c = peek_at(input, pos); + + if (c == '*' || c == '-' || c == '+') { + pos++; + if (!cmark_isspace(peek_at(input, pos))) { + return 0; + } + + if (interrupts_paragraph) { + i = pos; + // require non-blank content after list marker: + while (S_is_space_or_tab(peek_at(input, i))) { + i++; + } + if (peek_at(input, i) == '\n') { + return 0; + } + } + + data = (cmark_list *)mem->calloc(1, sizeof(*data)); + data->marker_offset = 0; // will be adjusted later + data->list_type = CMARK_BULLET_LIST; + data->bullet_char = c; + data->start = 0; + data->delimiter = CMARK_NO_DELIM; + data->tight = false; + } else if (cmark_isdigit(c)) { + int start = 0; + int digits = 0; + + do { + start = (10 * start) + (peek_at(input, pos) - '0'); + pos++; + digits++; + // We limit to 9 digits to avoid overflow, + // assuming max int is 2^31 - 1 + // This also seems to be the limit for 'start' in some browsers. + } while (digits < 9 && cmark_isdigit(peek_at(input, pos))); + + if (interrupts_paragraph && start != 1) { + return 0; + } + c = peek_at(input, pos); + if (c == '.' || c == ')') { + pos++; + if (!cmark_isspace(peek_at(input, pos))) { + return 0; + } + if (interrupts_paragraph) { + // require non-blank content after list marker: + i = pos; + while (S_is_space_or_tab(peek_at(input, i))) { + i++; + } + if (S_is_line_end_char(peek_at(input, i))) { + return 0; + } + } + + data = (cmark_list *)mem->calloc(1, sizeof(*data)); + data->marker_offset = 0; // will be adjusted later + data->list_type = CMARK_ORDERED_LIST; + data->bullet_char = 0; + data->start = start; + data->delimiter = (c == '.' ? CMARK_PERIOD_DELIM : CMARK_PAREN_DELIM); + data->tight = false; + } else { + return 0; + } + } else { + return 0; + } + + *dataptr = data; + return (pos - startpos); +} + +// Return 1 if list item belongs in list, else 0. +static int lists_match(cmark_list *list_data, cmark_list *item_data) { + return (list_data->list_type == item_data->list_type && + list_data->delimiter == item_data->delimiter && + // list_data->marker_offset == item_data.marker_offset && + list_data->bullet_char == item_data->bullet_char); +} + +static cmark_node *finalize_document(cmark_parser *parser) { + while (parser->current != parser->root) { + parser->current = finalize(parser, parser->current); + } + + finalize(parser, parser->root); + process_inlines(parser, parser->refmap, parser->options); + if (parser->options & CMARK_OPT_FOOTNOTES) + process_footnotes(parser); + + return parser->root; +} + +cmark_node *cmark_parse_file(FILE *f, int options) { + unsigned char buffer[4096]; + cmark_parser *parser = cmark_parser_new(options); + size_t bytes; + cmark_node *document; + + while ((bytes = fread(buffer, 1, sizeof(buffer), f)) > 0) { + bool eof = bytes < sizeof(buffer); + S_parser_feed(parser, buffer, bytes, eof); + if (eof) { + break; + } + } + + document = cmark_parser_finish(parser); + cmark_parser_free(parser); + return document; +} + +cmark_node *cmark_parse_document(const char *buffer, size_t len, int options) { + cmark_parser *parser = cmark_parser_new(options); + cmark_node *document; + + S_parser_feed(parser, (const unsigned char *)buffer, len, true); + + document = cmark_parser_finish(parser); + cmark_parser_free(parser); + return document; +} + +void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len) { + S_parser_feed(parser, (const unsigned char *)buffer, len, false); +} + +void cmark_parser_feed_reentrant(cmark_parser *parser, const char *buffer, size_t len) { + cmark_strbuf saved_linebuf; + + cmark_strbuf_init(parser->mem, &saved_linebuf, 0); + cmark_strbuf_puts(&saved_linebuf, cmark_strbuf_cstr(&parser->linebuf)); + cmark_strbuf_clear(&parser->linebuf); + + S_parser_feed(parser, (const unsigned char *)buffer, len, true); + + cmark_strbuf_sets(&parser->linebuf, cmark_strbuf_cstr(&saved_linebuf)); + cmark_strbuf_free(&saved_linebuf); +} + +static void S_parser_feed(cmark_parser *parser, const unsigned char *buffer, + size_t len, bool eof) { + const unsigned char *end = buffer + len; + static const uint8_t repl[] = {239, 191, 189}; + + if (parser->last_buffer_ended_with_cr && *buffer == '\n') { + // skip NL if last buffer ended with CR ; see #117 + buffer++; + } + parser->last_buffer_ended_with_cr = false; + while (buffer < end) { + const unsigned char *eol; + bufsize_t chunk_len; + bool process = false; + for (eol = buffer; eol < end; ++eol) { + if (S_is_line_end_char(*eol)) { + process = true; + break; + } + if (*eol == '\0' && eol < end) { + break; + } + } + if (eol >= end && eof) { + process = true; + } + + chunk_len = (bufsize_t)(eol - buffer); + if (process) { + if (parser->linebuf.size > 0) { + cmark_strbuf_put(&parser->linebuf, buffer, chunk_len); + S_process_line(parser, parser->linebuf.ptr, parser->linebuf.size); + cmark_strbuf_clear(&parser->linebuf); + } else { + S_process_line(parser, buffer, chunk_len); + } + } else { + if (eol < end && *eol == '\0') { + // omit NULL byte + cmark_strbuf_put(&parser->linebuf, buffer, chunk_len); + // add replacement character + cmark_strbuf_put(&parser->linebuf, repl, 3); + } else { + cmark_strbuf_put(&parser->linebuf, buffer, chunk_len); + } + } + + buffer += chunk_len; + if (buffer < end) { + if (*buffer == '\0') { + // skip over NULL + buffer++; + } else { + // skip over line ending characters + if (*buffer == '\r') { + buffer++; + if (buffer == end) + parser->last_buffer_ended_with_cr = true; + } + if (buffer < end && *buffer == '\n') + buffer++; + } + } + } +} + +static void chop_trailing_hashtags(cmark_chunk *ch) { + bufsize_t n, orig_n; + + cmark_chunk_rtrim(ch); + orig_n = n = ch->len - 1; + + // if string ends in space followed by #s, remove these: + while (n >= 0 && peek_at(ch, n) == '#') + n--; + + // Check for a space before the final #s: + if (n != orig_n && n >= 0 && S_is_space_or_tab(peek_at(ch, n))) { + ch->len = n; + cmark_chunk_rtrim(ch); + } +} + +// Find first nonspace character from current offset, setting +// parser->first_nonspace, parser->first_nonspace_column, +// parser->indent, and parser->blank. Does not advance parser->offset. +static void S_find_first_nonspace(cmark_parser *parser, cmark_chunk *input) { + char c; + int chars_to_tab = TAB_STOP - (parser->column % TAB_STOP); + + if (parser->first_nonspace <= parser->offset) { + parser->first_nonspace = parser->offset; + parser->first_nonspace_column = parser->column; + while ((c = peek_at(input, parser->first_nonspace))) { + if (c == ' ') { + parser->first_nonspace += 1; + parser->first_nonspace_column += 1; + chars_to_tab = chars_to_tab - 1; + if (chars_to_tab == 0) { + chars_to_tab = TAB_STOP; + } + } else if (c == '\t') { + parser->first_nonspace += 1; + parser->first_nonspace_column += chars_to_tab; + chars_to_tab = TAB_STOP; + } else { + break; + } + } + } + + parser->indent = parser->first_nonspace_column - parser->column; + parser->blank = S_is_line_end_char(peek_at(input, parser->first_nonspace)); +} + +// Advance parser->offset and parser->column. parser->offset is the +// byte position in input; parser->column is a virtual column number +// that takes into account tabs. (Multibyte characters are not taken +// into account, because the Markdown line prefixes we are interested in +// analyzing are entirely ASCII.) The count parameter indicates +// how far to advance the offset. If columns is true, then count +// indicates a number of columns; otherwise, a number of bytes. +// If advancing a certain number of columns partially consumes +// a tab character, parser->partially_consumed_tab is set to true. +static void S_advance_offset(cmark_parser *parser, cmark_chunk *input, + bufsize_t count, bool columns) { + char c; + int chars_to_tab; + int chars_to_advance; + while (count > 0 && (c = peek_at(input, parser->offset))) { + if (c == '\t') { + chars_to_tab = TAB_STOP - (parser->column % TAB_STOP); + if (columns) { + parser->partially_consumed_tab = chars_to_tab > count; + chars_to_advance = MIN(count, chars_to_tab); + parser->column += chars_to_advance; + parser->offset += (parser->partially_consumed_tab ? 0 : 1); + count -= chars_to_advance; + } else { + parser->partially_consumed_tab = false; + parser->column += chars_to_tab; + parser->offset += 1; + count -= 1; + } + } else { + parser->partially_consumed_tab = false; + parser->offset += 1; + parser->column += 1; // assume ascii; block starts are ascii + count -= 1; + } + } +} + +static bool S_last_child_is_open(cmark_node *container) { + return container->last_child && + (container->last_child->flags & CMARK_NODE__OPEN); +} + +static bool parse_block_quote_prefix(cmark_parser *parser, cmark_chunk *input) { + bool res = false; + bufsize_t matched = 0; + + matched = + parser->indent <= 3 && peek_at(input, parser->first_nonspace) == '>'; + if (matched) { + + S_advance_offset(parser, input, parser->indent + 1, true); + + if (S_is_space_or_tab(peek_at(input, parser->offset))) { + S_advance_offset(parser, input, 1, true); + } + + res = true; + } + return res; +} + +static bool parse_footnote_definition_block_prefix(cmark_parser *parser, cmark_chunk *input, + cmark_node *container) { + if (parser->indent >= 4) { + S_advance_offset(parser, input, 4, true); + return true; + } else if (input->len > 0 && (input->data[0] == '\n' || (input->data[0] == '\r' && input->data[1] == '\n'))) { + return true; + } + + return false; +} + +static bool parse_node_item_prefix(cmark_parser *parser, cmark_chunk *input, + cmark_node *container) { + bool res = false; + + if (parser->indent >= + container->as.list.marker_offset + container->as.list.padding) { + S_advance_offset(parser, input, container->as.list.marker_offset + + container->as.list.padding, + true); + res = true; + } else if (parser->blank && container->first_child != NULL) { + // if container->first_child is NULL, then the opening line + // of the list item was blank after the list marker; in this + // case, we are done with the list item. + S_advance_offset(parser, input, parser->first_nonspace - parser->offset, + false); + res = true; + } + return res; +} + +static bool parse_code_block_prefix(cmark_parser *parser, cmark_chunk *input, + cmark_node *container, + bool *should_continue) { + bool res = false; + + if (!container->as.code.fenced) { // indented + if (parser->indent >= CODE_INDENT) { + S_advance_offset(parser, input, CODE_INDENT, true); + res = true; + } else if (parser->blank) { + S_advance_offset(parser, input, parser->first_nonspace - parser->offset, + false); + res = true; + } + } else { // fenced + bufsize_t matched = 0; + + if (parser->indent <= 3 && (peek_at(input, parser->first_nonspace) == + container->as.code.fence_char)) { + matched = scan_close_code_fence(input, parser->first_nonspace); + } + + if (matched >= container->as.code.fence_length) { + // closing fence - and since we're at + // the end of a line, we can stop processing it: + *should_continue = false; + S_advance_offset(parser, input, matched, false); + parser->current = finalize(parser, container); + } else { + // skip opt. spaces of fence parser->offset + int i = container->as.code.fence_offset; + + while (i > 0 && S_is_space_or_tab(peek_at(input, parser->offset))) { + S_advance_offset(parser, input, 1, true); + i--; + } + res = true; + } + } + + return res; +} + +static bool parse_html_block_prefix(cmark_parser *parser, + cmark_node *container) { + bool res = false; + int html_block_type = container->as.html_block_type; + + assert(html_block_type >= 1 && html_block_type <= 7); + switch (html_block_type) { + case 1: + case 2: + case 3: + case 4: + case 5: + // these types of blocks can accept blanks + res = true; + break; + case 6: + case 7: + res = !parser->blank; + break; + } + + return res; +} + +static bool parse_extension_block(cmark_parser *parser, + cmark_node *container, + cmark_chunk *input) +{ + bool res = false; + + if (container->extension->last_block_matches) { + if (container->extension->last_block_matches( + container->extension, parser, input->data, input->len, container)) + res = true; + } + + return res; +} + +/** + * For each containing node, try to parse the associated line start. + * + * Will not close unmatched blocks, as we may have a lazy continuation + * line -> http://spec.commonmark.org/0.24/#lazy-continuation-line + * + * Returns: The last matching node, or NULL + */ +static cmark_node *check_open_blocks(cmark_parser *parser, cmark_chunk *input, + bool *all_matched) { + bool should_continue = true; + *all_matched = false; + cmark_node *container = parser->root; + cmark_node_type cont_type; + + while (S_last_child_is_open(container)) { + container = container->last_child; + cont_type = S_type(container); + + S_find_first_nonspace(parser, input); + + if (container->extension) { + if (!parse_extension_block(parser, container, input)) + goto done; + continue; + } + + switch (cont_type) { + case CMARK_NODE_BLOCK_QUOTE: + if (!parse_block_quote_prefix(parser, input)) + goto done; + break; + case CMARK_NODE_ITEM: + if (!parse_node_item_prefix(parser, input, container)) + goto done; + break; + case CMARK_NODE_CODE_BLOCK: + if (!parse_code_block_prefix(parser, input, container, &should_continue)) + goto done; + break; + case CMARK_NODE_HEADING: + // a heading can never contain more than one line + goto done; + case CMARK_NODE_HTML_BLOCK: + if (!parse_html_block_prefix(parser, container)) + goto done; + break; + case CMARK_NODE_PARAGRAPH: + if (parser->blank) + goto done; + break; + case CMARK_NODE_FOOTNOTE_DEFINITION: + if (!parse_footnote_definition_block_prefix(parser, input, container)) + goto done; + break; + default: + break; + } + } + + *all_matched = true; + +done: + if (!*all_matched) { + container = container->parent; // back up to last matching node + } + + if (!should_continue) { + container = NULL; + } + + return container; +} + +static void open_new_blocks(cmark_parser *parser, cmark_node **container, + cmark_chunk *input, bool all_matched) { + bool indented; + cmark_list *data = NULL; + bool maybe_lazy = S_type(parser->current) == CMARK_NODE_PARAGRAPH; + cmark_node_type cont_type = S_type(*container); + bufsize_t matched = 0; + int lev = 0; + bool save_partially_consumed_tab; + int save_offset; + int save_column; + + while (cont_type != CMARK_NODE_CODE_BLOCK && + cont_type != CMARK_NODE_HTML_BLOCK) { + + S_find_first_nonspace(parser, input); + indented = parser->indent >= CODE_INDENT; + + if (!indented && peek_at(input, parser->first_nonspace) == '>') { + + bufsize_t blockquote_startpos = parser->first_nonspace; + + S_advance_offset(parser, input, + parser->first_nonspace + 1 - parser->offset, false); + // optional following character + if (S_is_space_or_tab(peek_at(input, parser->offset))) { + S_advance_offset(parser, input, 1, true); + } + *container = add_child(parser, *container, CMARK_NODE_BLOCK_QUOTE, + blockquote_startpos + 1); + + } else if (!indented && (matched = scan_atx_heading_start( + input, parser->first_nonspace))) { + bufsize_t hashpos; + int level = 0; + bufsize_t heading_startpos = parser->first_nonspace; + + S_advance_offset(parser, input, + parser->first_nonspace + matched - parser->offset, + false); + *container = add_child(parser, *container, CMARK_NODE_HEADING, + heading_startpos + 1); + + hashpos = cmark_chunk_strchr(input, '#', parser->first_nonspace); + + while (peek_at(input, hashpos) == '#') { + level++; + hashpos++; + } + + (*container)->as.heading.level = level; + (*container)->as.heading.setext = false; + (*container)->internal_offset = matched; + + } else if (!indented && (matched = scan_open_code_fence( + input, parser->first_nonspace))) { + *container = add_child(parser, *container, CMARK_NODE_CODE_BLOCK, + parser->first_nonspace + 1); + (*container)->as.code.fenced = true; + (*container)->as.code.fence_char = peek_at(input, parser->first_nonspace); + (*container)->as.code.fence_length = (matched > 255) ? 255 : (uint8_t)matched; + (*container)->as.code.fence_offset = + (int8_t)(parser->first_nonspace - parser->offset); + (*container)->as.code.info = cmark_chunk_literal(""); + S_advance_offset(parser, input, + parser->first_nonspace + matched - parser->offset, + false); + + } else if (!indented && ((matched = scan_html_block_start( + input, parser->first_nonspace)) || + (cont_type != CMARK_NODE_PARAGRAPH && + (matched = scan_html_block_start_7( + input, parser->first_nonspace))))) { + *container = add_child(parser, *container, CMARK_NODE_HTML_BLOCK, + parser->first_nonspace + 1); + (*container)->as.html_block_type = matched; + // note, we don't adjust parser->offset because the tag is part of the + // text + } else if (!indented && cont_type == CMARK_NODE_PARAGRAPH && + (lev = + scan_setext_heading_line(input, parser->first_nonspace))) { + (*container)->type = (uint16_t)CMARK_NODE_HEADING; + (*container)->as.heading.level = lev; + (*container)->as.heading.setext = true; + S_advance_offset(parser, input, input->len - 1 - parser->offset, false); + } else if (!indented && + !(cont_type == CMARK_NODE_PARAGRAPH && !all_matched) && + (matched = scan_thematic_break(input, parser->first_nonspace))) { + // it's only now that we know the line is not part of a setext heading: + *container = add_child(parser, *container, CMARK_NODE_THEMATIC_BREAK, + parser->first_nonspace + 1); + S_advance_offset(parser, input, input->len - 1 - parser->offset, false); + } else if (!indented && + parser->options & CMARK_OPT_FOOTNOTES && + (matched = scan_footnote_definition(input, parser->first_nonspace))) { + cmark_chunk c = cmark_chunk_dup(input, parser->first_nonspace + 2, matched - 2); + cmark_chunk_to_cstr(parser->mem, &c); + + while (c.data[c.len - 1] != ']') + --c.len; + --c.len; + + S_advance_offset(parser, input, parser->first_nonspace + matched - parser->offset, false); + *container = add_child(parser, *container, CMARK_NODE_FOOTNOTE_DEFINITION, parser->first_nonspace + matched + 1); + (*container)->as.literal = c; + + (*container)->internal_offset = matched; + } else if ((!indented || cont_type == CMARK_NODE_LIST) && + parser->indent < 4 && + (matched = parse_list_marker( + parser->mem, input, parser->first_nonspace, + (*container)->type == CMARK_NODE_PARAGRAPH, &data))) { + + // Note that we can have new list items starting with >= 4 + // spaces indent, as long as the list container is still open. + int i = 0; + + // compute padding: + S_advance_offset(parser, input, + parser->first_nonspace + matched - parser->offset, + false); + + save_partially_consumed_tab = parser->partially_consumed_tab; + save_offset = parser->offset; + save_column = parser->column; + + while (parser->column - save_column <= 5 && + S_is_space_or_tab(peek_at(input, parser->offset))) { + S_advance_offset(parser, input, 1, true); + } + + i = parser->column - save_column; + if (i >= 5 || i < 1 || + // only spaces after list marker: + S_is_line_end_char(peek_at(input, parser->offset))) { + data->padding = matched + 1; + parser->offset = save_offset; + parser->column = save_column; + parser->partially_consumed_tab = save_partially_consumed_tab; + if (i > 0) { + S_advance_offset(parser, input, 1, true); + } + } else { + data->padding = matched + i; + } + + // check container; if it's a list, see if this list item + // can continue the list; otherwise, create a list container. + + data->marker_offset = parser->indent; + + if (cont_type != CMARK_NODE_LIST || + !lists_match(&((*container)->as.list), data)) { + *container = add_child(parser, *container, CMARK_NODE_LIST, + parser->first_nonspace + 1); + + memcpy(&((*container)->as.list), data, sizeof(*data)); + } + + // add the list item + *container = add_child(parser, *container, CMARK_NODE_ITEM, + parser->first_nonspace + 1); + /* TODO: static */ + memcpy(&((*container)->as.list), data, sizeof(*data)); + parser->mem->free(data); + } else if (indented && !maybe_lazy && !parser->blank) { + S_advance_offset(parser, input, CODE_INDENT, true); + *container = add_child(parser, *container, CMARK_NODE_CODE_BLOCK, + parser->offset + 1); + (*container)->as.code.fenced = false; + (*container)->as.code.fence_char = 0; + (*container)->as.code.fence_length = 0; + (*container)->as.code.fence_offset = 0; + (*container)->as.code.info = cmark_chunk_literal(""); + } else { + cmark_llist *tmp; + cmark_node *new_container = NULL; + + for (tmp = parser->syntax_extensions; tmp; tmp=tmp->next) { + cmark_syntax_extension *ext = (cmark_syntax_extension *) tmp->data; + + if (ext->try_opening_block) { + new_container = ext->try_opening_block( + ext, indented, parser, *container, input->data, input->len); + + if (new_container) { + *container = new_container; + break; + } + } + } + + if (!new_container) { + break; + } + } + + if (accepts_lines(S_type(*container))) { + // if it's a line container, it can't contain other containers + break; + } + + cont_type = S_type(*container); + maybe_lazy = false; + } +} + +static void add_text_to_container(cmark_parser *parser, cmark_node *container, + cmark_node *last_matched_container, + cmark_chunk *input) { + cmark_node *tmp; + // what remains at parser->offset is a text line. add the text to the + // appropriate container. + + S_find_first_nonspace(parser, input); + + if (parser->blank && container->last_child) + S_set_last_line_blank(container->last_child, true); + + // block quote lines are never blank as they start with > + // and we don't count blanks in fenced code for purposes of tight/loose + // lists or breaking out of lists. we also don't set last_line_blank + // on an empty list item. + const cmark_node_type ctype = S_type(container); + const bool last_line_blank = + (parser->blank && ctype != CMARK_NODE_BLOCK_QUOTE && + ctype != CMARK_NODE_HEADING && ctype != CMARK_NODE_THEMATIC_BREAK && + !(ctype == CMARK_NODE_CODE_BLOCK && container->as.code.fenced) && + !(ctype == CMARK_NODE_ITEM && container->first_child == NULL && + container->start_line == parser->line_number)); + + S_set_last_line_blank(container, last_line_blank); + + tmp = container; + while (tmp->parent) { + S_set_last_line_blank(tmp->parent, false); + tmp = tmp->parent; + } + + // If the last line processed belonged to a paragraph node, + // and we didn't match all of the line prefixes for the open containers, + // and we didn't start any new containers, + // and the line isn't blank, + // then treat this as a "lazy continuation line" and add it to + // the open paragraph. + if (parser->current != last_matched_container && + container == last_matched_container && !parser->blank && + S_type(parser->current) == CMARK_NODE_PARAGRAPH) { + add_line(parser->current, input, parser); + } else { // not a lazy continuation + // Finalize any blocks that were not matched and set cur to container: + while (parser->current != last_matched_container) { + parser->current = finalize(parser, parser->current); + assert(parser->current != NULL); + } + + if (S_type(container) == CMARK_NODE_CODE_BLOCK) { + add_line(container, input, parser); + } else if (S_type(container) == CMARK_NODE_HTML_BLOCK) { + add_line(container, input, parser); + + int matches_end_condition; + switch (container->as.html_block_type) { + case 1: + // , ,
+ matches_end_condition = + scan_html_block_end_1(input, parser->first_nonspace); + break; + case 2: + // --> + matches_end_condition = + scan_html_block_end_2(input, parser->first_nonspace); + break; + case 3: + // ?> + matches_end_condition = + scan_html_block_end_3(input, parser->first_nonspace); + break; + case 4: + // > + matches_end_condition = + scan_html_block_end_4(input, parser->first_nonspace); + break; + case 5: + // ]]> + matches_end_condition = + scan_html_block_end_5(input, parser->first_nonspace); + break; + default: + matches_end_condition = 0; + break; + } + + if (matches_end_condition) { + container = finalize(parser, container); + assert(parser->current != NULL); + } + } else if (parser->blank) { + // ??? do nothing + } else if (accepts_lines(S_type(container))) { + if (S_type(container) == CMARK_NODE_HEADING && + container->as.heading.setext == false) { + chop_trailing_hashtags(input); + } + S_advance_offset(parser, input, parser->first_nonspace - parser->offset, + false); + add_line(container, input, parser); + } else { + // create paragraph container for line + container = add_child(parser, container, CMARK_NODE_PARAGRAPH, + parser->first_nonspace + 1); + S_advance_offset(parser, input, parser->first_nonspace - parser->offset, + false); + add_line(container, input, parser); + } + + parser->current = container; + } +} + +/* See http://spec.commonmark.org/0.24/#phase-1-block-structure */ +static void S_process_line(cmark_parser *parser, const unsigned char *buffer, + bufsize_t bytes) { + cmark_node *last_matched_container; + bool all_matched = true; + cmark_node *container; + cmark_chunk input; + cmark_node *current; + + cmark_strbuf_clear(&parser->curline); + + if (parser->options & CMARK_OPT_VALIDATE_UTF8) + cmark_utf8proc_check(&parser->curline, buffer, bytes); + else + cmark_strbuf_put(&parser->curline, buffer, bytes); + + bytes = parser->curline.size; + + // ensure line ends with a newline: + if (bytes == 0 || !S_is_line_end_char(parser->curline.ptr[bytes - 1])) + cmark_strbuf_putc(&parser->curline, '\n'); + + parser->offset = 0; + parser->column = 0; + parser->first_nonspace = 0; + parser->first_nonspace_column = 0; + parser->indent = 0; + parser->blank = false; + parser->partially_consumed_tab = false; + + input.data = parser->curline.ptr; + input.len = parser->curline.size; + input.alloc = 0; + + // Skip UTF-8 BOM. + if (parser->line_number == 0 && + input.len >= 3 && + memcmp(input.data, "\xef\xbb\xbf", 3) == 0) + parser->offset += 3; + + parser->line_number++; + + last_matched_container = check_open_blocks(parser, &input, &all_matched); + + if (!last_matched_container) + goto finished; + + container = last_matched_container; + + current = parser->current; + + open_new_blocks(parser, &container, &input, all_matched); + + /* parser->current might have changed if feed_reentrant was called */ + if (current == parser->current) + add_text_to_container(parser, container, last_matched_container, &input); + +finished: + parser->last_line_length = input.len; + if (parser->last_line_length && + input.data[parser->last_line_length - 1] == '\n') + parser->last_line_length -= 1; + if (parser->last_line_length && + input.data[parser->last_line_length - 1] == '\r') + parser->last_line_length -= 1; + + cmark_strbuf_clear(&parser->curline); +} + +cmark_node *cmark_parser_finish(cmark_parser *parser) { + cmark_node *res; + cmark_llist *extensions; + + /* Parser was already finished once */ + if (parser->root == NULL) + return NULL; + + if (parser->linebuf.size) { + S_process_line(parser, parser->linebuf.ptr, parser->linebuf.size); + cmark_strbuf_clear(&parser->linebuf); + } + + finalize_document(parser); + + cmark_consolidate_text_nodes(parser->root); + + cmark_strbuf_free(&parser->curline); + cmark_strbuf_free(&parser->linebuf); + +#if CMARK_DEBUG_NODES + if (cmark_node_check(parser->root, stderr)) { + abort(); + } +#endif + + for (extensions = parser->syntax_extensions; extensions; extensions = extensions->next) { + cmark_syntax_extension *ext = (cmark_syntax_extension *) extensions->data; + if (ext->postprocess_func) { + cmark_node *processed = ext->postprocess_func(ext, parser, parser->root); + if (processed) + parser->root = processed; + } + } + + res = parser->root; + parser->root = NULL; + + cmark_parser_reset(parser); + + return res; +} + +int cmark_parser_get_line_number(cmark_parser *parser) { + return parser->line_number; +} + +bufsize_t cmark_parser_get_offset(cmark_parser *parser) { + return parser->offset; +} + +bufsize_t cmark_parser_get_column(cmark_parser *parser) { + return parser->column; +} + +int cmark_parser_get_first_nonspace(cmark_parser *parser) { + return parser->first_nonspace; +} + +int cmark_parser_get_first_nonspace_column(cmark_parser *parser) { + return parser->first_nonspace_column; +} + +int cmark_parser_get_indent(cmark_parser *parser) { + return parser->indent; +} + +int cmark_parser_is_blank(cmark_parser *parser) { + return parser->blank; +} + +int cmark_parser_has_partially_consumed_tab(cmark_parser *parser) { + return parser->partially_consumed_tab; +} + +int cmark_parser_get_last_line_length(cmark_parser *parser) { + return parser->last_line_length; +} + +cmark_node *cmark_parser_add_child(cmark_parser *parser, + cmark_node *parent, + cmark_node_type block_type, + int start_column) { + return add_child(parser, parent, block_type, start_column); +} + +void cmark_parser_advance_offset(cmark_parser *parser, + const char *input, + int count, + int columns) { + cmark_chunk input_chunk = cmark_chunk_literal(input); + + S_advance_offset(parser, &input_chunk, count, columns != 0); +} + +void cmark_parser_set_backslash_ispunct_func(cmark_parser *parser, + cmark_ispunct_func func) { + parser->backslash_ispunct = func; +} + +cmark_llist *cmark_parser_get_syntax_extensions(cmark_parser *parser) { + return parser->syntax_extensions; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/blocks.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/blocks.o new file mode 100644 index 000000000000..7d906375673b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/blocks.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/buffer.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/buffer.c new file mode 100644 index 000000000000..75733d402d2f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/buffer.c @@ -0,0 +1,279 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "cmark_ctype.h" +#include "buffer.h" +#include "memory.h" + +/* Used as default value for cmark_strbuf->ptr so that people can always + * assume ptr is non-NULL and zero terminated even for new cmark_strbufs. + */ +unsigned char cmark_strbuf__initbuf[1]; + +#ifndef MIN +#define MIN(x, y) ((x < y) ? x : y) +#endif + +void cmark_strbuf_init(cmark_mem *mem, cmark_strbuf *buf, + bufsize_t initial_size) { + buf->mem = mem; + buf->asize = 0; + buf->size = 0; + buf->ptr = cmark_strbuf__initbuf; + + if (initial_size > 0) + cmark_strbuf_grow(buf, initial_size); +} + +static CMARK_INLINE void S_strbuf_grow_by(cmark_strbuf *buf, bufsize_t add) { + cmark_strbuf_grow(buf, buf->size + add); +} + +void cmark_strbuf_grow(cmark_strbuf *buf, bufsize_t target_size) { + assert(target_size > 0); + + if (target_size < buf->asize) + return; + + if (target_size > (bufsize_t)(INT32_MAX / 2)) { + fprintf(stderr, + "[cmark] cmark_strbuf_grow requests buffer with size > %d, aborting\n", + (INT32_MAX / 2)); + abort(); + } + + /* Oversize the buffer by 50% to guarantee amortized linear time + * complexity on append operations. */ + bufsize_t new_size = target_size + target_size / 2; + new_size += 1; + new_size = (new_size + 7) & ~7; + + buf->ptr = (unsigned char *)buf->mem->realloc(buf->asize ? buf->ptr : NULL, + new_size); + buf->asize = new_size; +} + +bufsize_t cmark_strbuf_len(const cmark_strbuf *buf) { return buf->size; } + +void cmark_strbuf_free(cmark_strbuf *buf) { + if (!buf) + return; + + if (buf->ptr != cmark_strbuf__initbuf) + buf->mem->free(buf->ptr); + + cmark_strbuf_init(buf->mem, buf, 0); +} + +void cmark_strbuf_clear(cmark_strbuf *buf) { + buf->size = 0; + + if (buf->asize > 0) + buf->ptr[0] = '\0'; +} + +void cmark_strbuf_set(cmark_strbuf *buf, const unsigned char *data, + bufsize_t len) { + if (len <= 0 || data == NULL) { + cmark_strbuf_clear(buf); + } else { + if (data != buf->ptr) { + if (len >= buf->asize) + cmark_strbuf_grow(buf, len); + memmove(buf->ptr, data, len); + } + buf->size = len; + buf->ptr[buf->size] = '\0'; + } +} + +void cmark_strbuf_sets(cmark_strbuf *buf, const char *string) { + cmark_strbuf_set(buf, (const unsigned char *)string, + string ? (bufsize_t)strlen(string) : 0); +} + +void cmark_strbuf_putc(cmark_strbuf *buf, int c) { + S_strbuf_grow_by(buf, 1); + buf->ptr[buf->size++] = (unsigned char)(c & 0xFF); + buf->ptr[buf->size] = '\0'; +} + +void cmark_strbuf_put(cmark_strbuf *buf, const unsigned char *data, + bufsize_t len) { + if (len <= 0) + return; + + S_strbuf_grow_by(buf, len); + memmove(buf->ptr + buf->size, data, len); + buf->size += len; + buf->ptr[buf->size] = '\0'; +} + +void cmark_strbuf_puts(cmark_strbuf *buf, const char *string) { + cmark_strbuf_put(buf, (const unsigned char *)string, (bufsize_t)strlen(string)); +} + +void cmark_strbuf_copy_cstr(char *data, bufsize_t datasize, + const cmark_strbuf *buf) { + bufsize_t copylen; + + assert(buf); + if (!data || datasize <= 0) + return; + + data[0] = '\0'; + + if (buf->size == 0 || buf->asize <= 0) + return; + + copylen = buf->size; + if (copylen > datasize - 1) + copylen = datasize - 1; + memmove(data, buf->ptr, copylen); + data[copylen] = '\0'; +} + +void cmark_strbuf_swap(cmark_strbuf *buf_a, cmark_strbuf *buf_b) { + cmark_strbuf t = *buf_a; + *buf_a = *buf_b; + *buf_b = t; +} + +unsigned char *cmark_strbuf_detach(cmark_strbuf *buf) { + unsigned char *data = buf->ptr; + + if (buf->asize == 0) { + /* return an empty string */ + return (unsigned char *)buf->mem->calloc(1, 1); + } + + cmark_strbuf_init(buf->mem, buf, 0); + return data; +} + +int cmark_strbuf_cmp(const cmark_strbuf *a, const cmark_strbuf *b) { + int result = memcmp(a->ptr, b->ptr, MIN(a->size, b->size)); + return (result != 0) ? result + : (a->size < b->size) ? -1 : (a->size > b->size) ? 1 : 0; +} + +bufsize_t cmark_strbuf_strchr(const cmark_strbuf *buf, int c, bufsize_t pos) { + if (pos >= buf->size) + return -1; + if (pos < 0) + pos = 0; + + const unsigned char *p = + (unsigned char *)memchr(buf->ptr + pos, c, buf->size - pos); + if (!p) + return -1; + + return (bufsize_t)(p - (const unsigned char *)buf->ptr); +} + +bufsize_t cmark_strbuf_strrchr(const cmark_strbuf *buf, int c, bufsize_t pos) { + if (pos < 0 || buf->size == 0) + return -1; + if (pos >= buf->size) + pos = buf->size - 1; + + bufsize_t i; + for (i = pos; i >= 0; i--) { + if (buf->ptr[i] == (unsigned char)c) + return i; + } + + return -1; +} + +void cmark_strbuf_truncate(cmark_strbuf *buf, bufsize_t len) { + if (len < 0) + len = 0; + + if (len < buf->size) { + buf->size = len; + buf->ptr[buf->size] = '\0'; + } +} + +void cmark_strbuf_drop(cmark_strbuf *buf, bufsize_t n) { + if (n > 0) { + if (n > buf->size) + n = buf->size; + buf->size = buf->size - n; + if (buf->size) + memmove(buf->ptr, buf->ptr + n, buf->size); + + buf->ptr[buf->size] = '\0'; + } +} + +void cmark_strbuf_rtrim(cmark_strbuf *buf) { + if (!buf->size) + return; + + while (buf->size > 0) { + if (!cmark_isspace(buf->ptr[buf->size - 1])) + break; + + buf->size--; + } + + buf->ptr[buf->size] = '\0'; +} + +void cmark_strbuf_trim(cmark_strbuf *buf) { + bufsize_t i = 0; + + if (!buf->size) + return; + + while (i < buf->size && cmark_isspace(buf->ptr[i])) + i++; + + cmark_strbuf_drop(buf, i); + + cmark_strbuf_rtrim(buf); +} + +// Destructively modify string, collapsing consecutive +// space and newline characters into a single space. +void cmark_strbuf_normalize_whitespace(cmark_strbuf *s) { + bool last_char_was_space = false; + bufsize_t r, w; + + for (r = 0, w = 0; r < s->size; ++r) { + if (cmark_isspace(s->ptr[r])) { + if (!last_char_was_space) { + s->ptr[w++] = ' '; + last_char_was_space = true; + } + } else { + s->ptr[w++] = s->ptr[r]; + last_char_was_space = false; + } + } + + cmark_strbuf_truncate(s, w); +} + +// Destructively unescape a string: remove backslashes before punctuation chars. +extern void cmark_strbuf_unescape(cmark_strbuf *buf) { + bufsize_t r, w; + + for (r = 0, w = 0; r < buf->size; ++r) { + if (buf->ptr[r] == '\\' && cmark_ispunct(buf->ptr[r + 1])) + r++; + + buf->ptr[w++] = buf->ptr[r]; + } + + cmark_strbuf_truncate(buf, w); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/buffer.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/buffer.h new file mode 100644 index 000000000000..b85bb4406746 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/buffer.h @@ -0,0 +1,116 @@ +#ifndef CMARK_BUFFER_H +#define CMARK_BUFFER_H + +#include +#include +#include +#include +#include +#include "config.h" +#include "cmark-gfm.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + cmark_mem *mem; + unsigned char *ptr; + bufsize_t asize, size; +} cmark_strbuf; + +extern unsigned char cmark_strbuf__initbuf[]; + +#define CMARK_BUF_INIT(mem) \ + { mem, cmark_strbuf__initbuf, 0, 0 } + +/** + * Initialize a cmark_strbuf structure. + * + * For the cases where CMARK_BUF_INIT cannot be used to do static + * initialization. + */ +CMARK_GFM_EXPORT +void cmark_strbuf_init(cmark_mem *mem, cmark_strbuf *buf, + bufsize_t initial_size); + +/** + * Grow the buffer to hold at least `target_size` bytes. + */ +CMARK_GFM_EXPORT +void cmark_strbuf_grow(cmark_strbuf *buf, bufsize_t target_size); + +CMARK_GFM_EXPORT +void cmark_strbuf_free(cmark_strbuf *buf); + +CMARK_GFM_EXPORT +void cmark_strbuf_swap(cmark_strbuf *buf_a, cmark_strbuf *buf_b); + +CMARK_GFM_EXPORT +bufsize_t cmark_strbuf_len(const cmark_strbuf *buf); + +CMARK_GFM_EXPORT +int cmark_strbuf_cmp(const cmark_strbuf *a, const cmark_strbuf *b); + +CMARK_GFM_EXPORT +unsigned char *cmark_strbuf_detach(cmark_strbuf *buf); + +CMARK_GFM_EXPORT +void cmark_strbuf_copy_cstr(char *data, bufsize_t datasize, + const cmark_strbuf *buf); + +static CMARK_INLINE const char *cmark_strbuf_cstr(const cmark_strbuf *buf) { + return (char *)buf->ptr; +} + +#define cmark_strbuf_at(buf, n) ((buf)->ptr[n]) + +CMARK_GFM_EXPORT +void cmark_strbuf_set(cmark_strbuf *buf, const unsigned char *data, + bufsize_t len); + +CMARK_GFM_EXPORT +void cmark_strbuf_sets(cmark_strbuf *buf, const char *string); + +CMARK_GFM_EXPORT +void cmark_strbuf_putc(cmark_strbuf *buf, int c); + +CMARK_GFM_EXPORT +void cmark_strbuf_put(cmark_strbuf *buf, const unsigned char *data, + bufsize_t len); + +CMARK_GFM_EXPORT +void cmark_strbuf_puts(cmark_strbuf *buf, const char *string); + +CMARK_GFM_EXPORT +void cmark_strbuf_clear(cmark_strbuf *buf); + +CMARK_GFM_EXPORT +bufsize_t cmark_strbuf_strchr(const cmark_strbuf *buf, int c, bufsize_t pos); + +CMARK_GFM_EXPORT +bufsize_t cmark_strbuf_strrchr(const cmark_strbuf *buf, int c, bufsize_t pos); + +CMARK_GFM_EXPORT +void cmark_strbuf_drop(cmark_strbuf *buf, bufsize_t n); + +CMARK_GFM_EXPORT +void cmark_strbuf_truncate(cmark_strbuf *buf, bufsize_t len); + +CMARK_GFM_EXPORT +void cmark_strbuf_rtrim(cmark_strbuf *buf); + +CMARK_GFM_EXPORT +void cmark_strbuf_trim(cmark_strbuf *buf); + +CMARK_GFM_EXPORT +void cmark_strbuf_normalize_whitespace(cmark_strbuf *s); + +CMARK_GFM_EXPORT +void cmark_strbuf_unescape(cmark_strbuf *s); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/buffer.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/buffer.o new file mode 100644 index 000000000000..cffd4a3da21a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/buffer.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/case_fold_switch.inc b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/case_fold_switch.inc new file mode 100644 index 000000000000..28e223e14dcd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/case_fold_switch.inc @@ -0,0 +1,4327 @@ + switch (c) { + case 0x0041: + bufpush(0x0061); + break; + case 0x0042: + bufpush(0x0062); + break; + case 0x0043: + bufpush(0x0063); + break; + case 0x0044: + bufpush(0x0064); + break; + case 0x0045: + bufpush(0x0065); + break; + case 0x0046: + bufpush(0x0066); + break; + case 0x0047: + bufpush(0x0067); + break; + case 0x0048: + bufpush(0x0068); + break; + case 0x0049: + bufpush(0x0069); + break; + case 0x004A: + bufpush(0x006A); + break; + case 0x004B: + bufpush(0x006B); + break; + case 0x004C: + bufpush(0x006C); + break; + case 0x004D: + bufpush(0x006D); + break; + case 0x004E: + bufpush(0x006E); + break; + case 0x004F: + bufpush(0x006F); + break; + case 0x0050: + bufpush(0x0070); + break; + case 0x0051: + bufpush(0x0071); + break; + case 0x0052: + bufpush(0x0072); + break; + case 0x0053: + bufpush(0x0073); + break; + case 0x0054: + bufpush(0x0074); + break; + case 0x0055: + bufpush(0x0075); + break; + case 0x0056: + bufpush(0x0076); + break; + case 0x0057: + bufpush(0x0077); + break; + case 0x0058: + bufpush(0x0078); + break; + case 0x0059: + bufpush(0x0079); + break; + case 0x005A: + bufpush(0x007A); + break; + case 0x00B5: + bufpush(0x03BC); + break; + case 0x00C0: + bufpush(0x00E0); + break; + case 0x00C1: + bufpush(0x00E1); + break; + case 0x00C2: + bufpush(0x00E2); + break; + case 0x00C3: + bufpush(0x00E3); + break; + case 0x00C4: + bufpush(0x00E4); + break; + case 0x00C5: + bufpush(0x00E5); + break; + case 0x00C6: + bufpush(0x00E6); + break; + case 0x00C7: + bufpush(0x00E7); + break; + case 0x00C8: + bufpush(0x00E8); + break; + case 0x00C9: + bufpush(0x00E9); + break; + case 0x00CA: + bufpush(0x00EA); + break; + case 0x00CB: + bufpush(0x00EB); + break; + case 0x00CC: + bufpush(0x00EC); + break; + case 0x00CD: + bufpush(0x00ED); + break; + case 0x00CE: + bufpush(0x00EE); + break; + case 0x00CF: + bufpush(0x00EF); + break; + case 0x00D0: + bufpush(0x00F0); + break; + case 0x00D1: + bufpush(0x00F1); + break; + case 0x00D2: + bufpush(0x00F2); + break; + case 0x00D3: + bufpush(0x00F3); + break; + case 0x00D4: + bufpush(0x00F4); + break; + case 0x00D5: + bufpush(0x00F5); + break; + case 0x00D6: + bufpush(0x00F6); + break; + case 0x00D8: + bufpush(0x00F8); + break; + case 0x00D9: + bufpush(0x00F9); + break; + case 0x00DA: + bufpush(0x00FA); + break; + case 0x00DB: + bufpush(0x00FB); + break; + case 0x00DC: + bufpush(0x00FC); + break; + case 0x00DD: + bufpush(0x00FD); + break; + case 0x00DE: + bufpush(0x00FE); + break; + case 0x00DF: + bufpush(0x0073); + bufpush(0x0073); + break; + case 0x0100: + bufpush(0x0101); + break; + case 0x0102: + bufpush(0x0103); + break; + case 0x0104: + bufpush(0x0105); + break; + case 0x0106: + bufpush(0x0107); + break; + case 0x0108: + bufpush(0x0109); + break; + case 0x010A: + bufpush(0x010B); + break; + case 0x010C: + bufpush(0x010D); + break; + case 0x010E: + bufpush(0x010F); + break; + case 0x0110: + bufpush(0x0111); + break; + case 0x0112: + bufpush(0x0113); + break; + case 0x0114: + bufpush(0x0115); + break; + case 0x0116: + bufpush(0x0117); + break; + case 0x0118: + bufpush(0x0119); + break; + case 0x011A: + bufpush(0x011B); + break; + case 0x011C: + bufpush(0x011D); + break; + case 0x011E: + bufpush(0x011F); + break; + case 0x0120: + bufpush(0x0121); + break; + case 0x0122: + bufpush(0x0123); + break; + case 0x0124: + bufpush(0x0125); + break; + case 0x0126: + bufpush(0x0127); + break; + case 0x0128: + bufpush(0x0129); + break; + case 0x012A: + bufpush(0x012B); + break; + case 0x012C: + bufpush(0x012D); + break; + case 0x012E: + bufpush(0x012F); + break; + case 0x0130: + bufpush(0x0069); + bufpush(0x0307); + break; + case 0x0132: + bufpush(0x0133); + break; + case 0x0134: + bufpush(0x0135); + break; + case 0x0136: + bufpush(0x0137); + break; + case 0x0139: + bufpush(0x013A); + break; + case 0x013B: + bufpush(0x013C); + break; + case 0x013D: + bufpush(0x013E); + break; + case 0x013F: + bufpush(0x0140); + break; + case 0x0141: + bufpush(0x0142); + break; + case 0x0143: + bufpush(0x0144); + break; + case 0x0145: + bufpush(0x0146); + break; + case 0x0147: + bufpush(0x0148); + break; + case 0x0149: + bufpush(0x02BC); + bufpush(0x006E); + break; + case 0x014A: + bufpush(0x014B); + break; + case 0x014C: + bufpush(0x014D); + break; + case 0x014E: + bufpush(0x014F); + break; + case 0x0150: + bufpush(0x0151); + break; + case 0x0152: + bufpush(0x0153); + break; + case 0x0154: + bufpush(0x0155); + break; + case 0x0156: + bufpush(0x0157); + break; + case 0x0158: + bufpush(0x0159); + break; + case 0x015A: + bufpush(0x015B); + break; + case 0x015C: + bufpush(0x015D); + break; + case 0x015E: + bufpush(0x015F); + break; + case 0x0160: + bufpush(0x0161); + break; + case 0x0162: + bufpush(0x0163); + break; + case 0x0164: + bufpush(0x0165); + break; + case 0x0166: + bufpush(0x0167); + break; + case 0x0168: + bufpush(0x0169); + break; + case 0x016A: + bufpush(0x016B); + break; + case 0x016C: + bufpush(0x016D); + break; + case 0x016E: + bufpush(0x016F); + break; + case 0x0170: + bufpush(0x0171); + break; + case 0x0172: + bufpush(0x0173); + break; + case 0x0174: + bufpush(0x0175); + break; + case 0x0176: + bufpush(0x0177); + break; + case 0x0178: + bufpush(0x00FF); + break; + case 0x0179: + bufpush(0x017A); + break; + case 0x017B: + bufpush(0x017C); + break; + case 0x017D: + bufpush(0x017E); + break; + case 0x017F: + bufpush(0x0073); + break; + case 0x0181: + bufpush(0x0253); + break; + case 0x0182: + bufpush(0x0183); + break; + case 0x0184: + bufpush(0x0185); + break; + case 0x0186: + bufpush(0x0254); + break; + case 0x0187: + bufpush(0x0188); + break; + case 0x0189: + bufpush(0x0256); + break; + case 0x018A: + bufpush(0x0257); + break; + case 0x018B: + bufpush(0x018C); + break; + case 0x018E: + bufpush(0x01DD); + break; + case 0x018F: + bufpush(0x0259); + break; + case 0x0190: + bufpush(0x025B); + break; + case 0x0191: + bufpush(0x0192); + break; + case 0x0193: + bufpush(0x0260); + break; + case 0x0194: + bufpush(0x0263); + break; + case 0x0196: + bufpush(0x0269); + break; + case 0x0197: + bufpush(0x0268); + break; + case 0x0198: + bufpush(0x0199); + break; + case 0x019C: + bufpush(0x026F); + break; + case 0x019D: + bufpush(0x0272); + break; + case 0x019F: + bufpush(0x0275); + break; + case 0x01A0: + bufpush(0x01A1); + break; + case 0x01A2: + bufpush(0x01A3); + break; + case 0x01A4: + bufpush(0x01A5); + break; + case 0x01A6: + bufpush(0x0280); + break; + case 0x01A7: + bufpush(0x01A8); + break; + case 0x01A9: + bufpush(0x0283); + break; + case 0x01AC: + bufpush(0x01AD); + break; + case 0x01AE: + bufpush(0x0288); + break; + case 0x01AF: + bufpush(0x01B0); + break; + case 0x01B1: + bufpush(0x028A); + break; + case 0x01B2: + bufpush(0x028B); + break; + case 0x01B3: + bufpush(0x01B4); + break; + case 0x01B5: + bufpush(0x01B6); + break; + case 0x01B7: + bufpush(0x0292); + break; + case 0x01B8: + bufpush(0x01B9); + break; + case 0x01BC: + bufpush(0x01BD); + break; + case 0x01C4: + bufpush(0x01C6); + break; + case 0x01C5: + bufpush(0x01C6); + break; + case 0x01C7: + bufpush(0x01C9); + break; + case 0x01C8: + bufpush(0x01C9); + break; + case 0x01CA: + bufpush(0x01CC); + break; + case 0x01CB: + bufpush(0x01CC); + break; + case 0x01CD: + bufpush(0x01CE); + break; + case 0x01CF: + bufpush(0x01D0); + break; + case 0x01D1: + bufpush(0x01D2); + break; + case 0x01D3: + bufpush(0x01D4); + break; + case 0x01D5: + bufpush(0x01D6); + break; + case 0x01D7: + bufpush(0x01D8); + break; + case 0x01D9: + bufpush(0x01DA); + break; + case 0x01DB: + bufpush(0x01DC); + break; + case 0x01DE: + bufpush(0x01DF); + break; + case 0x01E0: + bufpush(0x01E1); + break; + case 0x01E2: + bufpush(0x01E3); + break; + case 0x01E4: + bufpush(0x01E5); + break; + case 0x01E6: + bufpush(0x01E7); + break; + case 0x01E8: + bufpush(0x01E9); + break; + case 0x01EA: + bufpush(0x01EB); + break; + case 0x01EC: + bufpush(0x01ED); + break; + case 0x01EE: + bufpush(0x01EF); + break; + case 0x01F0: + bufpush(0x006A); + bufpush(0x030C); + break; + case 0x01F1: + bufpush(0x01F3); + break; + case 0x01F2: + bufpush(0x01F3); + break; + case 0x01F4: + bufpush(0x01F5); + break; + case 0x01F6: + bufpush(0x0195); + break; + case 0x01F7: + bufpush(0x01BF); + break; + case 0x01F8: + bufpush(0x01F9); + break; + case 0x01FA: + bufpush(0x01FB); + break; + case 0x01FC: + bufpush(0x01FD); + break; + case 0x01FE: + bufpush(0x01FF); + break; + case 0x0200: + bufpush(0x0201); + break; + case 0x0202: + bufpush(0x0203); + break; + case 0x0204: + bufpush(0x0205); + break; + case 0x0206: + bufpush(0x0207); + break; + case 0x0208: + bufpush(0x0209); + break; + case 0x020A: + bufpush(0x020B); + break; + case 0x020C: + bufpush(0x020D); + break; + case 0x020E: + bufpush(0x020F); + break; + case 0x0210: + bufpush(0x0211); + break; + case 0x0212: + bufpush(0x0213); + break; + case 0x0214: + bufpush(0x0215); + break; + case 0x0216: + bufpush(0x0217); + break; + case 0x0218: + bufpush(0x0219); + break; + case 0x021A: + bufpush(0x021B); + break; + case 0x021C: + bufpush(0x021D); + break; + case 0x021E: + bufpush(0x021F); + break; + case 0x0220: + bufpush(0x019E); + break; + case 0x0222: + bufpush(0x0223); + break; + case 0x0224: + bufpush(0x0225); + break; + case 0x0226: + bufpush(0x0227); + break; + case 0x0228: + bufpush(0x0229); + break; + case 0x022A: + bufpush(0x022B); + break; + case 0x022C: + bufpush(0x022D); + break; + case 0x022E: + bufpush(0x022F); + break; + case 0x0230: + bufpush(0x0231); + break; + case 0x0232: + bufpush(0x0233); + break; + case 0x023A: + bufpush(0x2C65); + break; + case 0x023B: + bufpush(0x023C); + break; + case 0x023D: + bufpush(0x019A); + break; + case 0x023E: + bufpush(0x2C66); + break; + case 0x0241: + bufpush(0x0242); + break; + case 0x0243: + bufpush(0x0180); + break; + case 0x0244: + bufpush(0x0289); + break; + case 0x0245: + bufpush(0x028C); + break; + case 0x0246: + bufpush(0x0247); + break; + case 0x0248: + bufpush(0x0249); + break; + case 0x024A: + bufpush(0x024B); + break; + case 0x024C: + bufpush(0x024D); + break; + case 0x024E: + bufpush(0x024F); + break; + case 0x0345: + bufpush(0x03B9); + break; + case 0x0370: + bufpush(0x0371); + break; + case 0x0372: + bufpush(0x0373); + break; + case 0x0376: + bufpush(0x0377); + break; + case 0x037F: + bufpush(0x03F3); + break; + case 0x0386: + bufpush(0x03AC); + break; + case 0x0388: + bufpush(0x03AD); + break; + case 0x0389: + bufpush(0x03AE); + break; + case 0x038A: + bufpush(0x03AF); + break; + case 0x038C: + bufpush(0x03CC); + break; + case 0x038E: + bufpush(0x03CD); + break; + case 0x038F: + bufpush(0x03CE); + break; + case 0x0390: + bufpush(0x03B9); + bufpush(0x0308); + bufpush(0x0301); + break; + case 0x0391: + bufpush(0x03B1); + break; + case 0x0392: + bufpush(0x03B2); + break; + case 0x0393: + bufpush(0x03B3); + break; + case 0x0394: + bufpush(0x03B4); + break; + case 0x0395: + bufpush(0x03B5); + break; + case 0x0396: + bufpush(0x03B6); + break; + case 0x0397: + bufpush(0x03B7); + break; + case 0x0398: + bufpush(0x03B8); + break; + case 0x0399: + bufpush(0x03B9); + break; + case 0x039A: + bufpush(0x03BA); + break; + case 0x039B: + bufpush(0x03BB); + break; + case 0x039C: + bufpush(0x03BC); + break; + case 0x039D: + bufpush(0x03BD); + break; + case 0x039E: + bufpush(0x03BE); + break; + case 0x039F: + bufpush(0x03BF); + break; + case 0x03A0: + bufpush(0x03C0); + break; + case 0x03A1: + bufpush(0x03C1); + break; + case 0x03A3: + bufpush(0x03C3); + break; + case 0x03A4: + bufpush(0x03C4); + break; + case 0x03A5: + bufpush(0x03C5); + break; + case 0x03A6: + bufpush(0x03C6); + break; + case 0x03A7: + bufpush(0x03C7); + break; + case 0x03A8: + bufpush(0x03C8); + break; + case 0x03A9: + bufpush(0x03C9); + break; + case 0x03AA: + bufpush(0x03CA); + break; + case 0x03AB: + bufpush(0x03CB); + break; + case 0x03B0: + bufpush(0x03C5); + bufpush(0x0308); + bufpush(0x0301); + break; + case 0x03C2: + bufpush(0x03C3); + break; + case 0x03CF: + bufpush(0x03D7); + break; + case 0x03D0: + bufpush(0x03B2); + break; + case 0x03D1: + bufpush(0x03B8); + break; + case 0x03D5: + bufpush(0x03C6); + break; + case 0x03D6: + bufpush(0x03C0); + break; + case 0x03D8: + bufpush(0x03D9); + break; + case 0x03DA: + bufpush(0x03DB); + break; + case 0x03DC: + bufpush(0x03DD); + break; + case 0x03DE: + bufpush(0x03DF); + break; + case 0x03E0: + bufpush(0x03E1); + break; + case 0x03E2: + bufpush(0x03E3); + break; + case 0x03E4: + bufpush(0x03E5); + break; + case 0x03E6: + bufpush(0x03E7); + break; + case 0x03E8: + bufpush(0x03E9); + break; + case 0x03EA: + bufpush(0x03EB); + break; + case 0x03EC: + bufpush(0x03ED); + break; + case 0x03EE: + bufpush(0x03EF); + break; + case 0x03F0: + bufpush(0x03BA); + break; + case 0x03F1: + bufpush(0x03C1); + break; + case 0x03F4: + bufpush(0x03B8); + break; + case 0x03F5: + bufpush(0x03B5); + break; + case 0x03F7: + bufpush(0x03F8); + break; + case 0x03F9: + bufpush(0x03F2); + break; + case 0x03FA: + bufpush(0x03FB); + break; + case 0x03FD: + bufpush(0x037B); + break; + case 0x03FE: + bufpush(0x037C); + break; + case 0x03FF: + bufpush(0x037D); + break; + case 0x0400: + bufpush(0x0450); + break; + case 0x0401: + bufpush(0x0451); + break; + case 0x0402: + bufpush(0x0452); + break; + case 0x0403: + bufpush(0x0453); + break; + case 0x0404: + bufpush(0x0454); + break; + case 0x0405: + bufpush(0x0455); + break; + case 0x0406: + bufpush(0x0456); + break; + case 0x0407: + bufpush(0x0457); + break; + case 0x0408: + bufpush(0x0458); + break; + case 0x0409: + bufpush(0x0459); + break; + case 0x040A: + bufpush(0x045A); + break; + case 0x040B: + bufpush(0x045B); + break; + case 0x040C: + bufpush(0x045C); + break; + case 0x040D: + bufpush(0x045D); + break; + case 0x040E: + bufpush(0x045E); + break; + case 0x040F: + bufpush(0x045F); + break; + case 0x0410: + bufpush(0x0430); + break; + case 0x0411: + bufpush(0x0431); + break; + case 0x0412: + bufpush(0x0432); + break; + case 0x0413: + bufpush(0x0433); + break; + case 0x0414: + bufpush(0x0434); + break; + case 0x0415: + bufpush(0x0435); + break; + case 0x0416: + bufpush(0x0436); + break; + case 0x0417: + bufpush(0x0437); + break; + case 0x0418: + bufpush(0x0438); + break; + case 0x0419: + bufpush(0x0439); + break; + case 0x041A: + bufpush(0x043A); + break; + case 0x041B: + bufpush(0x043B); + break; + case 0x041C: + bufpush(0x043C); + break; + case 0x041D: + bufpush(0x043D); + break; + case 0x041E: + bufpush(0x043E); + break; + case 0x041F: + bufpush(0x043F); + break; + case 0x0420: + bufpush(0x0440); + break; + case 0x0421: + bufpush(0x0441); + break; + case 0x0422: + bufpush(0x0442); + break; + case 0x0423: + bufpush(0x0443); + break; + case 0x0424: + bufpush(0x0444); + break; + case 0x0425: + bufpush(0x0445); + break; + case 0x0426: + bufpush(0x0446); + break; + case 0x0427: + bufpush(0x0447); + break; + case 0x0428: + bufpush(0x0448); + break; + case 0x0429: + bufpush(0x0449); + break; + case 0x042A: + bufpush(0x044A); + break; + case 0x042B: + bufpush(0x044B); + break; + case 0x042C: + bufpush(0x044C); + break; + case 0x042D: + bufpush(0x044D); + break; + case 0x042E: + bufpush(0x044E); + break; + case 0x042F: + bufpush(0x044F); + break; + case 0x0460: + bufpush(0x0461); + break; + case 0x0462: + bufpush(0x0463); + break; + case 0x0464: + bufpush(0x0465); + break; + case 0x0466: + bufpush(0x0467); + break; + case 0x0468: + bufpush(0x0469); + break; + case 0x046A: + bufpush(0x046B); + break; + case 0x046C: + bufpush(0x046D); + break; + case 0x046E: + bufpush(0x046F); + break; + case 0x0470: + bufpush(0x0471); + break; + case 0x0472: + bufpush(0x0473); + break; + case 0x0474: + bufpush(0x0475); + break; + case 0x0476: + bufpush(0x0477); + break; + case 0x0478: + bufpush(0x0479); + break; + case 0x047A: + bufpush(0x047B); + break; + case 0x047C: + bufpush(0x047D); + break; + case 0x047E: + bufpush(0x047F); + break; + case 0x0480: + bufpush(0x0481); + break; + case 0x048A: + bufpush(0x048B); + break; + case 0x048C: + bufpush(0x048D); + break; + case 0x048E: + bufpush(0x048F); + break; + case 0x0490: + bufpush(0x0491); + break; + case 0x0492: + bufpush(0x0493); + break; + case 0x0494: + bufpush(0x0495); + break; + case 0x0496: + bufpush(0x0497); + break; + case 0x0498: + bufpush(0x0499); + break; + case 0x049A: + bufpush(0x049B); + break; + case 0x049C: + bufpush(0x049D); + break; + case 0x049E: + bufpush(0x049F); + break; + case 0x04A0: + bufpush(0x04A1); + break; + case 0x04A2: + bufpush(0x04A3); + break; + case 0x04A4: + bufpush(0x04A5); + break; + case 0x04A6: + bufpush(0x04A7); + break; + case 0x04A8: + bufpush(0x04A9); + break; + case 0x04AA: + bufpush(0x04AB); + break; + case 0x04AC: + bufpush(0x04AD); + break; + case 0x04AE: + bufpush(0x04AF); + break; + case 0x04B0: + bufpush(0x04B1); + break; + case 0x04B2: + bufpush(0x04B3); + break; + case 0x04B4: + bufpush(0x04B5); + break; + case 0x04B6: + bufpush(0x04B7); + break; + case 0x04B8: + bufpush(0x04B9); + break; + case 0x04BA: + bufpush(0x04BB); + break; + case 0x04BC: + bufpush(0x04BD); + break; + case 0x04BE: + bufpush(0x04BF); + break; + case 0x04C0: + bufpush(0x04CF); + break; + case 0x04C1: + bufpush(0x04C2); + break; + case 0x04C3: + bufpush(0x04C4); + break; + case 0x04C5: + bufpush(0x04C6); + break; + case 0x04C7: + bufpush(0x04C8); + break; + case 0x04C9: + bufpush(0x04CA); + break; + case 0x04CB: + bufpush(0x04CC); + break; + case 0x04CD: + bufpush(0x04CE); + break; + case 0x04D0: + bufpush(0x04D1); + break; + case 0x04D2: + bufpush(0x04D3); + break; + case 0x04D4: + bufpush(0x04D5); + break; + case 0x04D6: + bufpush(0x04D7); + break; + case 0x04D8: + bufpush(0x04D9); + break; + case 0x04DA: + bufpush(0x04DB); + break; + case 0x04DC: + bufpush(0x04DD); + break; + case 0x04DE: + bufpush(0x04DF); + break; + case 0x04E0: + bufpush(0x04E1); + break; + case 0x04E2: + bufpush(0x04E3); + break; + case 0x04E4: + bufpush(0x04E5); + break; + case 0x04E6: + bufpush(0x04E7); + break; + case 0x04E8: + bufpush(0x04E9); + break; + case 0x04EA: + bufpush(0x04EB); + break; + case 0x04EC: + bufpush(0x04ED); + break; + case 0x04EE: + bufpush(0x04EF); + break; + case 0x04F0: + bufpush(0x04F1); + break; + case 0x04F2: + bufpush(0x04F3); + break; + case 0x04F4: + bufpush(0x04F5); + break; + case 0x04F6: + bufpush(0x04F7); + break; + case 0x04F8: + bufpush(0x04F9); + break; + case 0x04FA: + bufpush(0x04FB); + break; + case 0x04FC: + bufpush(0x04FD); + break; + case 0x04FE: + bufpush(0x04FF); + break; + case 0x0500: + bufpush(0x0501); + break; + case 0x0502: + bufpush(0x0503); + break; + case 0x0504: + bufpush(0x0505); + break; + case 0x0506: + bufpush(0x0507); + break; + case 0x0508: + bufpush(0x0509); + break; + case 0x050A: + bufpush(0x050B); + break; + case 0x050C: + bufpush(0x050D); + break; + case 0x050E: + bufpush(0x050F); + break; + case 0x0510: + bufpush(0x0511); + break; + case 0x0512: + bufpush(0x0513); + break; + case 0x0514: + bufpush(0x0515); + break; + case 0x0516: + bufpush(0x0517); + break; + case 0x0518: + bufpush(0x0519); + break; + case 0x051A: + bufpush(0x051B); + break; + case 0x051C: + bufpush(0x051D); + break; + case 0x051E: + bufpush(0x051F); + break; + case 0x0520: + bufpush(0x0521); + break; + case 0x0522: + bufpush(0x0523); + break; + case 0x0524: + bufpush(0x0525); + break; + case 0x0526: + bufpush(0x0527); + break; + case 0x0528: + bufpush(0x0529); + break; + case 0x052A: + bufpush(0x052B); + break; + case 0x052C: + bufpush(0x052D); + break; + case 0x052E: + bufpush(0x052F); + break; + case 0x0531: + bufpush(0x0561); + break; + case 0x0532: + bufpush(0x0562); + break; + case 0x0533: + bufpush(0x0563); + break; + case 0x0534: + bufpush(0x0564); + break; + case 0x0535: + bufpush(0x0565); + break; + case 0x0536: + bufpush(0x0566); + break; + case 0x0537: + bufpush(0x0567); + break; + case 0x0538: + bufpush(0x0568); + break; + case 0x0539: + bufpush(0x0569); + break; + case 0x053A: + bufpush(0x056A); + break; + case 0x053B: + bufpush(0x056B); + break; + case 0x053C: + bufpush(0x056C); + break; + case 0x053D: + bufpush(0x056D); + break; + case 0x053E: + bufpush(0x056E); + break; + case 0x053F: + bufpush(0x056F); + break; + case 0x0540: + bufpush(0x0570); + break; + case 0x0541: + bufpush(0x0571); + break; + case 0x0542: + bufpush(0x0572); + break; + case 0x0543: + bufpush(0x0573); + break; + case 0x0544: + bufpush(0x0574); + break; + case 0x0545: + bufpush(0x0575); + break; + case 0x0546: + bufpush(0x0576); + break; + case 0x0547: + bufpush(0x0577); + break; + case 0x0548: + bufpush(0x0578); + break; + case 0x0549: + bufpush(0x0579); + break; + case 0x054A: + bufpush(0x057A); + break; + case 0x054B: + bufpush(0x057B); + break; + case 0x054C: + bufpush(0x057C); + break; + case 0x054D: + bufpush(0x057D); + break; + case 0x054E: + bufpush(0x057E); + break; + case 0x054F: + bufpush(0x057F); + break; + case 0x0550: + bufpush(0x0580); + break; + case 0x0551: + bufpush(0x0581); + break; + case 0x0552: + bufpush(0x0582); + break; + case 0x0553: + bufpush(0x0583); + break; + case 0x0554: + bufpush(0x0584); + break; + case 0x0555: + bufpush(0x0585); + break; + case 0x0556: + bufpush(0x0586); + break; + case 0x0587: + bufpush(0x0565); + bufpush(0x0582); + break; + case 0x10A0: + bufpush(0x2D00); + break; + case 0x10A1: + bufpush(0x2D01); + break; + case 0x10A2: + bufpush(0x2D02); + break; + case 0x10A3: + bufpush(0x2D03); + break; + case 0x10A4: + bufpush(0x2D04); + break; + case 0x10A5: + bufpush(0x2D05); + break; + case 0x10A6: + bufpush(0x2D06); + break; + case 0x10A7: + bufpush(0x2D07); + break; + case 0x10A8: + bufpush(0x2D08); + break; + case 0x10A9: + bufpush(0x2D09); + break; + case 0x10AA: + bufpush(0x2D0A); + break; + case 0x10AB: + bufpush(0x2D0B); + break; + case 0x10AC: + bufpush(0x2D0C); + break; + case 0x10AD: + bufpush(0x2D0D); + break; + case 0x10AE: + bufpush(0x2D0E); + break; + case 0x10AF: + bufpush(0x2D0F); + break; + case 0x10B0: + bufpush(0x2D10); + break; + case 0x10B1: + bufpush(0x2D11); + break; + case 0x10B2: + bufpush(0x2D12); + break; + case 0x10B3: + bufpush(0x2D13); + break; + case 0x10B4: + bufpush(0x2D14); + break; + case 0x10B5: + bufpush(0x2D15); + break; + case 0x10B6: + bufpush(0x2D16); + break; + case 0x10B7: + bufpush(0x2D17); + break; + case 0x10B8: + bufpush(0x2D18); + break; + case 0x10B9: + bufpush(0x2D19); + break; + case 0x10BA: + bufpush(0x2D1A); + break; + case 0x10BB: + bufpush(0x2D1B); + break; + case 0x10BC: + bufpush(0x2D1C); + break; + case 0x10BD: + bufpush(0x2D1D); + break; + case 0x10BE: + bufpush(0x2D1E); + break; + case 0x10BF: + bufpush(0x2D1F); + break; + case 0x10C0: + bufpush(0x2D20); + break; + case 0x10C1: + bufpush(0x2D21); + break; + case 0x10C2: + bufpush(0x2D22); + break; + case 0x10C3: + bufpush(0x2D23); + break; + case 0x10C4: + bufpush(0x2D24); + break; + case 0x10C5: + bufpush(0x2D25); + break; + case 0x10C7: + bufpush(0x2D27); + break; + case 0x10CD: + bufpush(0x2D2D); + break; + case 0x13F8: + bufpush(0x13F0); + break; + case 0x13F9: + bufpush(0x13F1); + break; + case 0x13FA: + bufpush(0x13F2); + break; + case 0x13FB: + bufpush(0x13F3); + break; + case 0x13FC: + bufpush(0x13F4); + break; + case 0x13FD: + bufpush(0x13F5); + break; + case 0x1C80: + bufpush(0x0432); + break; + case 0x1C81: + bufpush(0x0434); + break; + case 0x1C82: + bufpush(0x043E); + break; + case 0x1C83: + bufpush(0x0441); + break; + case 0x1C84: + bufpush(0x0442); + break; + case 0x1C85: + bufpush(0x0442); + break; + case 0x1C86: + bufpush(0x044A); + break; + case 0x1C87: + bufpush(0x0463); + break; + case 0x1C88: + bufpush(0xA64B); + break; + case 0x1E00: + bufpush(0x1E01); + break; + case 0x1E02: + bufpush(0x1E03); + break; + case 0x1E04: + bufpush(0x1E05); + break; + case 0x1E06: + bufpush(0x1E07); + break; + case 0x1E08: + bufpush(0x1E09); + break; + case 0x1E0A: + bufpush(0x1E0B); + break; + case 0x1E0C: + bufpush(0x1E0D); + break; + case 0x1E0E: + bufpush(0x1E0F); + break; + case 0x1E10: + bufpush(0x1E11); + break; + case 0x1E12: + bufpush(0x1E13); + break; + case 0x1E14: + bufpush(0x1E15); + break; + case 0x1E16: + bufpush(0x1E17); + break; + case 0x1E18: + bufpush(0x1E19); + break; + case 0x1E1A: + bufpush(0x1E1B); + break; + case 0x1E1C: + bufpush(0x1E1D); + break; + case 0x1E1E: + bufpush(0x1E1F); + break; + case 0x1E20: + bufpush(0x1E21); + break; + case 0x1E22: + bufpush(0x1E23); + break; + case 0x1E24: + bufpush(0x1E25); + break; + case 0x1E26: + bufpush(0x1E27); + break; + case 0x1E28: + bufpush(0x1E29); + break; + case 0x1E2A: + bufpush(0x1E2B); + break; + case 0x1E2C: + bufpush(0x1E2D); + break; + case 0x1E2E: + bufpush(0x1E2F); + break; + case 0x1E30: + bufpush(0x1E31); + break; + case 0x1E32: + bufpush(0x1E33); + break; + case 0x1E34: + bufpush(0x1E35); + break; + case 0x1E36: + bufpush(0x1E37); + break; + case 0x1E38: + bufpush(0x1E39); + break; + case 0x1E3A: + bufpush(0x1E3B); + break; + case 0x1E3C: + bufpush(0x1E3D); + break; + case 0x1E3E: + bufpush(0x1E3F); + break; + case 0x1E40: + bufpush(0x1E41); + break; + case 0x1E42: + bufpush(0x1E43); + break; + case 0x1E44: + bufpush(0x1E45); + break; + case 0x1E46: + bufpush(0x1E47); + break; + case 0x1E48: + bufpush(0x1E49); + break; + case 0x1E4A: + bufpush(0x1E4B); + break; + case 0x1E4C: + bufpush(0x1E4D); + break; + case 0x1E4E: + bufpush(0x1E4F); + break; + case 0x1E50: + bufpush(0x1E51); + break; + case 0x1E52: + bufpush(0x1E53); + break; + case 0x1E54: + bufpush(0x1E55); + break; + case 0x1E56: + bufpush(0x1E57); + break; + case 0x1E58: + bufpush(0x1E59); + break; + case 0x1E5A: + bufpush(0x1E5B); + break; + case 0x1E5C: + bufpush(0x1E5D); + break; + case 0x1E5E: + bufpush(0x1E5F); + break; + case 0x1E60: + bufpush(0x1E61); + break; + case 0x1E62: + bufpush(0x1E63); + break; + case 0x1E64: + bufpush(0x1E65); + break; + case 0x1E66: + bufpush(0x1E67); + break; + case 0x1E68: + bufpush(0x1E69); + break; + case 0x1E6A: + bufpush(0x1E6B); + break; + case 0x1E6C: + bufpush(0x1E6D); + break; + case 0x1E6E: + bufpush(0x1E6F); + break; + case 0x1E70: + bufpush(0x1E71); + break; + case 0x1E72: + bufpush(0x1E73); + break; + case 0x1E74: + bufpush(0x1E75); + break; + case 0x1E76: + bufpush(0x1E77); + break; + case 0x1E78: + bufpush(0x1E79); + break; + case 0x1E7A: + bufpush(0x1E7B); + break; + case 0x1E7C: + bufpush(0x1E7D); + break; + case 0x1E7E: + bufpush(0x1E7F); + break; + case 0x1E80: + bufpush(0x1E81); + break; + case 0x1E82: + bufpush(0x1E83); + break; + case 0x1E84: + bufpush(0x1E85); + break; + case 0x1E86: + bufpush(0x1E87); + break; + case 0x1E88: + bufpush(0x1E89); + break; + case 0x1E8A: + bufpush(0x1E8B); + break; + case 0x1E8C: + bufpush(0x1E8D); + break; + case 0x1E8E: + bufpush(0x1E8F); + break; + case 0x1E90: + bufpush(0x1E91); + break; + case 0x1E92: + bufpush(0x1E93); + break; + case 0x1E94: + bufpush(0x1E95); + break; + case 0x1E96: + bufpush(0x0068); + bufpush(0x0331); + break; + case 0x1E97: + bufpush(0x0074); + bufpush(0x0308); + break; + case 0x1E98: + bufpush(0x0077); + bufpush(0x030A); + break; + case 0x1E99: + bufpush(0x0079); + bufpush(0x030A); + break; + case 0x1E9A: + bufpush(0x0061); + bufpush(0x02BE); + break; + case 0x1E9B: + bufpush(0x1E61); + break; + case 0x1E9E: + bufpush(0x0073); + bufpush(0x0073); + break; + case 0x1EA0: + bufpush(0x1EA1); + break; + case 0x1EA2: + bufpush(0x1EA3); + break; + case 0x1EA4: + bufpush(0x1EA5); + break; + case 0x1EA6: + bufpush(0x1EA7); + break; + case 0x1EA8: + bufpush(0x1EA9); + break; + case 0x1EAA: + bufpush(0x1EAB); + break; + case 0x1EAC: + bufpush(0x1EAD); + break; + case 0x1EAE: + bufpush(0x1EAF); + break; + case 0x1EB0: + bufpush(0x1EB1); + break; + case 0x1EB2: + bufpush(0x1EB3); + break; + case 0x1EB4: + bufpush(0x1EB5); + break; + case 0x1EB6: + bufpush(0x1EB7); + break; + case 0x1EB8: + bufpush(0x1EB9); + break; + case 0x1EBA: + bufpush(0x1EBB); + break; + case 0x1EBC: + bufpush(0x1EBD); + break; + case 0x1EBE: + bufpush(0x1EBF); + break; + case 0x1EC0: + bufpush(0x1EC1); + break; + case 0x1EC2: + bufpush(0x1EC3); + break; + case 0x1EC4: + bufpush(0x1EC5); + break; + case 0x1EC6: + bufpush(0x1EC7); + break; + case 0x1EC8: + bufpush(0x1EC9); + break; + case 0x1ECA: + bufpush(0x1ECB); + break; + case 0x1ECC: + bufpush(0x1ECD); + break; + case 0x1ECE: + bufpush(0x1ECF); + break; + case 0x1ED0: + bufpush(0x1ED1); + break; + case 0x1ED2: + bufpush(0x1ED3); + break; + case 0x1ED4: + bufpush(0x1ED5); + break; + case 0x1ED6: + bufpush(0x1ED7); + break; + case 0x1ED8: + bufpush(0x1ED9); + break; + case 0x1EDA: + bufpush(0x1EDB); + break; + case 0x1EDC: + bufpush(0x1EDD); + break; + case 0x1EDE: + bufpush(0x1EDF); + break; + case 0x1EE0: + bufpush(0x1EE1); + break; + case 0x1EE2: + bufpush(0x1EE3); + break; + case 0x1EE4: + bufpush(0x1EE5); + break; + case 0x1EE6: + bufpush(0x1EE7); + break; + case 0x1EE8: + bufpush(0x1EE9); + break; + case 0x1EEA: + bufpush(0x1EEB); + break; + case 0x1EEC: + bufpush(0x1EED); + break; + case 0x1EEE: + bufpush(0x1EEF); + break; + case 0x1EF0: + bufpush(0x1EF1); + break; + case 0x1EF2: + bufpush(0x1EF3); + break; + case 0x1EF4: + bufpush(0x1EF5); + break; + case 0x1EF6: + bufpush(0x1EF7); + break; + case 0x1EF8: + bufpush(0x1EF9); + break; + case 0x1EFA: + bufpush(0x1EFB); + break; + case 0x1EFC: + bufpush(0x1EFD); + break; + case 0x1EFE: + bufpush(0x1EFF); + break; + case 0x1F08: + bufpush(0x1F00); + break; + case 0x1F09: + bufpush(0x1F01); + break; + case 0x1F0A: + bufpush(0x1F02); + break; + case 0x1F0B: + bufpush(0x1F03); + break; + case 0x1F0C: + bufpush(0x1F04); + break; + case 0x1F0D: + bufpush(0x1F05); + break; + case 0x1F0E: + bufpush(0x1F06); + break; + case 0x1F0F: + bufpush(0x1F07); + break; + case 0x1F18: + bufpush(0x1F10); + break; + case 0x1F19: + bufpush(0x1F11); + break; + case 0x1F1A: + bufpush(0x1F12); + break; + case 0x1F1B: + bufpush(0x1F13); + break; + case 0x1F1C: + bufpush(0x1F14); + break; + case 0x1F1D: + bufpush(0x1F15); + break; + case 0x1F28: + bufpush(0x1F20); + break; + case 0x1F29: + bufpush(0x1F21); + break; + case 0x1F2A: + bufpush(0x1F22); + break; + case 0x1F2B: + bufpush(0x1F23); + break; + case 0x1F2C: + bufpush(0x1F24); + break; + case 0x1F2D: + bufpush(0x1F25); + break; + case 0x1F2E: + bufpush(0x1F26); + break; + case 0x1F2F: + bufpush(0x1F27); + break; + case 0x1F38: + bufpush(0x1F30); + break; + case 0x1F39: + bufpush(0x1F31); + break; + case 0x1F3A: + bufpush(0x1F32); + break; + case 0x1F3B: + bufpush(0x1F33); + break; + case 0x1F3C: + bufpush(0x1F34); + break; + case 0x1F3D: + bufpush(0x1F35); + break; + case 0x1F3E: + bufpush(0x1F36); + break; + case 0x1F3F: + bufpush(0x1F37); + break; + case 0x1F48: + bufpush(0x1F40); + break; + case 0x1F49: + bufpush(0x1F41); + break; + case 0x1F4A: + bufpush(0x1F42); + break; + case 0x1F4B: + bufpush(0x1F43); + break; + case 0x1F4C: + bufpush(0x1F44); + break; + case 0x1F4D: + bufpush(0x1F45); + break; + case 0x1F50: + bufpush(0x03C5); + bufpush(0x0313); + break; + case 0x1F52: + bufpush(0x03C5); + bufpush(0x0313); + bufpush(0x0300); + break; + case 0x1F54: + bufpush(0x03C5); + bufpush(0x0313); + bufpush(0x0301); + break; + case 0x1F56: + bufpush(0x03C5); + bufpush(0x0313); + bufpush(0x0342); + break; + case 0x1F59: + bufpush(0x1F51); + break; + case 0x1F5B: + bufpush(0x1F53); + break; + case 0x1F5D: + bufpush(0x1F55); + break; + case 0x1F5F: + bufpush(0x1F57); + break; + case 0x1F68: + bufpush(0x1F60); + break; + case 0x1F69: + bufpush(0x1F61); + break; + case 0x1F6A: + bufpush(0x1F62); + break; + case 0x1F6B: + bufpush(0x1F63); + break; + case 0x1F6C: + bufpush(0x1F64); + break; + case 0x1F6D: + bufpush(0x1F65); + break; + case 0x1F6E: + bufpush(0x1F66); + break; + case 0x1F6F: + bufpush(0x1F67); + break; + case 0x1F80: + bufpush(0x1F00); + bufpush(0x03B9); + break; + case 0x1F81: + bufpush(0x1F01); + bufpush(0x03B9); + break; + case 0x1F82: + bufpush(0x1F02); + bufpush(0x03B9); + break; + case 0x1F83: + bufpush(0x1F03); + bufpush(0x03B9); + break; + case 0x1F84: + bufpush(0x1F04); + bufpush(0x03B9); + break; + case 0x1F85: + bufpush(0x1F05); + bufpush(0x03B9); + break; + case 0x1F86: + bufpush(0x1F06); + bufpush(0x03B9); + break; + case 0x1F87: + bufpush(0x1F07); + bufpush(0x03B9); + break; + case 0x1F88: + bufpush(0x1F00); + bufpush(0x03B9); + break; + case 0x1F89: + bufpush(0x1F01); + bufpush(0x03B9); + break; + case 0x1F8A: + bufpush(0x1F02); + bufpush(0x03B9); + break; + case 0x1F8B: + bufpush(0x1F03); + bufpush(0x03B9); + break; + case 0x1F8C: + bufpush(0x1F04); + bufpush(0x03B9); + break; + case 0x1F8D: + bufpush(0x1F05); + bufpush(0x03B9); + break; + case 0x1F8E: + bufpush(0x1F06); + bufpush(0x03B9); + break; + case 0x1F8F: + bufpush(0x1F07); + bufpush(0x03B9); + break; + case 0x1F90: + bufpush(0x1F20); + bufpush(0x03B9); + break; + case 0x1F91: + bufpush(0x1F21); + bufpush(0x03B9); + break; + case 0x1F92: + bufpush(0x1F22); + bufpush(0x03B9); + break; + case 0x1F93: + bufpush(0x1F23); + bufpush(0x03B9); + break; + case 0x1F94: + bufpush(0x1F24); + bufpush(0x03B9); + break; + case 0x1F95: + bufpush(0x1F25); + bufpush(0x03B9); + break; + case 0x1F96: + bufpush(0x1F26); + bufpush(0x03B9); + break; + case 0x1F97: + bufpush(0x1F27); + bufpush(0x03B9); + break; + case 0x1F98: + bufpush(0x1F20); + bufpush(0x03B9); + break; + case 0x1F99: + bufpush(0x1F21); + bufpush(0x03B9); + break; + case 0x1F9A: + bufpush(0x1F22); + bufpush(0x03B9); + break; + case 0x1F9B: + bufpush(0x1F23); + bufpush(0x03B9); + break; + case 0x1F9C: + bufpush(0x1F24); + bufpush(0x03B9); + break; + case 0x1F9D: + bufpush(0x1F25); + bufpush(0x03B9); + break; + case 0x1F9E: + bufpush(0x1F26); + bufpush(0x03B9); + break; + case 0x1F9F: + bufpush(0x1F27); + bufpush(0x03B9); + break; + case 0x1FA0: + bufpush(0x1F60); + bufpush(0x03B9); + break; + case 0x1FA1: + bufpush(0x1F61); + bufpush(0x03B9); + break; + case 0x1FA2: + bufpush(0x1F62); + bufpush(0x03B9); + break; + case 0x1FA3: + bufpush(0x1F63); + bufpush(0x03B9); + break; + case 0x1FA4: + bufpush(0x1F64); + bufpush(0x03B9); + break; + case 0x1FA5: + bufpush(0x1F65); + bufpush(0x03B9); + break; + case 0x1FA6: + bufpush(0x1F66); + bufpush(0x03B9); + break; + case 0x1FA7: + bufpush(0x1F67); + bufpush(0x03B9); + break; + case 0x1FA8: + bufpush(0x1F60); + bufpush(0x03B9); + break; + case 0x1FA9: + bufpush(0x1F61); + bufpush(0x03B9); + break; + case 0x1FAA: + bufpush(0x1F62); + bufpush(0x03B9); + break; + case 0x1FAB: + bufpush(0x1F63); + bufpush(0x03B9); + break; + case 0x1FAC: + bufpush(0x1F64); + bufpush(0x03B9); + break; + case 0x1FAD: + bufpush(0x1F65); + bufpush(0x03B9); + break; + case 0x1FAE: + bufpush(0x1F66); + bufpush(0x03B9); + break; + case 0x1FAF: + bufpush(0x1F67); + bufpush(0x03B9); + break; + case 0x1FB2: + bufpush(0x1F70); + bufpush(0x03B9); + break; + case 0x1FB3: + bufpush(0x03B1); + bufpush(0x03B9); + break; + case 0x1FB4: + bufpush(0x03AC); + bufpush(0x03B9); + break; + case 0x1FB6: + bufpush(0x03B1); + bufpush(0x0342); + break; + case 0x1FB7: + bufpush(0x03B1); + bufpush(0x0342); + bufpush(0x03B9); + break; + case 0x1FB8: + bufpush(0x1FB0); + break; + case 0x1FB9: + bufpush(0x1FB1); + break; + case 0x1FBA: + bufpush(0x1F70); + break; + case 0x1FBB: + bufpush(0x1F71); + break; + case 0x1FBC: + bufpush(0x03B1); + bufpush(0x03B9); + break; + case 0x1FBE: + bufpush(0x03B9); + break; + case 0x1FC2: + bufpush(0x1F74); + bufpush(0x03B9); + break; + case 0x1FC3: + bufpush(0x03B7); + bufpush(0x03B9); + break; + case 0x1FC4: + bufpush(0x03AE); + bufpush(0x03B9); + break; + case 0x1FC6: + bufpush(0x03B7); + bufpush(0x0342); + break; + case 0x1FC7: + bufpush(0x03B7); + bufpush(0x0342); + bufpush(0x03B9); + break; + case 0x1FC8: + bufpush(0x1F72); + break; + case 0x1FC9: + bufpush(0x1F73); + break; + case 0x1FCA: + bufpush(0x1F74); + break; + case 0x1FCB: + bufpush(0x1F75); + break; + case 0x1FCC: + bufpush(0x03B7); + bufpush(0x03B9); + break; + case 0x1FD2: + bufpush(0x03B9); + bufpush(0x0308); + bufpush(0x0300); + break; + case 0x1FD3: + bufpush(0x03B9); + bufpush(0x0308); + bufpush(0x0301); + break; + case 0x1FD6: + bufpush(0x03B9); + bufpush(0x0342); + break; + case 0x1FD7: + bufpush(0x03B9); + bufpush(0x0308); + bufpush(0x0342); + break; + case 0x1FD8: + bufpush(0x1FD0); + break; + case 0x1FD9: + bufpush(0x1FD1); + break; + case 0x1FDA: + bufpush(0x1F76); + break; + case 0x1FDB: + bufpush(0x1F77); + break; + case 0x1FE2: + bufpush(0x03C5); + bufpush(0x0308); + bufpush(0x0300); + break; + case 0x1FE3: + bufpush(0x03C5); + bufpush(0x0308); + bufpush(0x0301); + break; + case 0x1FE4: + bufpush(0x03C1); + bufpush(0x0313); + break; + case 0x1FE6: + bufpush(0x03C5); + bufpush(0x0342); + break; + case 0x1FE7: + bufpush(0x03C5); + bufpush(0x0308); + bufpush(0x0342); + break; + case 0x1FE8: + bufpush(0x1FE0); + break; + case 0x1FE9: + bufpush(0x1FE1); + break; + case 0x1FEA: + bufpush(0x1F7A); + break; + case 0x1FEB: + bufpush(0x1F7B); + break; + case 0x1FEC: + bufpush(0x1FE5); + break; + case 0x1FF2: + bufpush(0x1F7C); + bufpush(0x03B9); + break; + case 0x1FF3: + bufpush(0x03C9); + bufpush(0x03B9); + break; + case 0x1FF4: + bufpush(0x03CE); + bufpush(0x03B9); + break; + case 0x1FF6: + bufpush(0x03C9); + bufpush(0x0342); + break; + case 0x1FF7: + bufpush(0x03C9); + bufpush(0x0342); + bufpush(0x03B9); + break; + case 0x1FF8: + bufpush(0x1F78); + break; + case 0x1FF9: + bufpush(0x1F79); + break; + case 0x1FFA: + bufpush(0x1F7C); + break; + case 0x1FFB: + bufpush(0x1F7D); + break; + case 0x1FFC: + bufpush(0x03C9); + bufpush(0x03B9); + break; + case 0x2126: + bufpush(0x03C9); + break; + case 0x212A: + bufpush(0x006B); + break; + case 0x212B: + bufpush(0x00E5); + break; + case 0x2132: + bufpush(0x214E); + break; + case 0x2160: + bufpush(0x2170); + break; + case 0x2161: + bufpush(0x2171); + break; + case 0x2162: + bufpush(0x2172); + break; + case 0x2163: + bufpush(0x2173); + break; + case 0x2164: + bufpush(0x2174); + break; + case 0x2165: + bufpush(0x2175); + break; + case 0x2166: + bufpush(0x2176); + break; + case 0x2167: + bufpush(0x2177); + break; + case 0x2168: + bufpush(0x2178); + break; + case 0x2169: + bufpush(0x2179); + break; + case 0x216A: + bufpush(0x217A); + break; + case 0x216B: + bufpush(0x217B); + break; + case 0x216C: + bufpush(0x217C); + break; + case 0x216D: + bufpush(0x217D); + break; + case 0x216E: + bufpush(0x217E); + break; + case 0x216F: + bufpush(0x217F); + break; + case 0x2183: + bufpush(0x2184); + break; + case 0x24B6: + bufpush(0x24D0); + break; + case 0x24B7: + bufpush(0x24D1); + break; + case 0x24B8: + bufpush(0x24D2); + break; + case 0x24B9: + bufpush(0x24D3); + break; + case 0x24BA: + bufpush(0x24D4); + break; + case 0x24BB: + bufpush(0x24D5); + break; + case 0x24BC: + bufpush(0x24D6); + break; + case 0x24BD: + bufpush(0x24D7); + break; + case 0x24BE: + bufpush(0x24D8); + break; + case 0x24BF: + bufpush(0x24D9); + break; + case 0x24C0: + bufpush(0x24DA); + break; + case 0x24C1: + bufpush(0x24DB); + break; + case 0x24C2: + bufpush(0x24DC); + break; + case 0x24C3: + bufpush(0x24DD); + break; + case 0x24C4: + bufpush(0x24DE); + break; + case 0x24C5: + bufpush(0x24DF); + break; + case 0x24C6: + bufpush(0x24E0); + break; + case 0x24C7: + bufpush(0x24E1); + break; + case 0x24C8: + bufpush(0x24E2); + break; + case 0x24C9: + bufpush(0x24E3); + break; + case 0x24CA: + bufpush(0x24E4); + break; + case 0x24CB: + bufpush(0x24E5); + break; + case 0x24CC: + bufpush(0x24E6); + break; + case 0x24CD: + bufpush(0x24E7); + break; + case 0x24CE: + bufpush(0x24E8); + break; + case 0x24CF: + bufpush(0x24E9); + break; + case 0x2C00: + bufpush(0x2C30); + break; + case 0x2C01: + bufpush(0x2C31); + break; + case 0x2C02: + bufpush(0x2C32); + break; + case 0x2C03: + bufpush(0x2C33); + break; + case 0x2C04: + bufpush(0x2C34); + break; + case 0x2C05: + bufpush(0x2C35); + break; + case 0x2C06: + bufpush(0x2C36); + break; + case 0x2C07: + bufpush(0x2C37); + break; + case 0x2C08: + bufpush(0x2C38); + break; + case 0x2C09: + bufpush(0x2C39); + break; + case 0x2C0A: + bufpush(0x2C3A); + break; + case 0x2C0B: + bufpush(0x2C3B); + break; + case 0x2C0C: + bufpush(0x2C3C); + break; + case 0x2C0D: + bufpush(0x2C3D); + break; + case 0x2C0E: + bufpush(0x2C3E); + break; + case 0x2C0F: + bufpush(0x2C3F); + break; + case 0x2C10: + bufpush(0x2C40); + break; + case 0x2C11: + bufpush(0x2C41); + break; + case 0x2C12: + bufpush(0x2C42); + break; + case 0x2C13: + bufpush(0x2C43); + break; + case 0x2C14: + bufpush(0x2C44); + break; + case 0x2C15: + bufpush(0x2C45); + break; + case 0x2C16: + bufpush(0x2C46); + break; + case 0x2C17: + bufpush(0x2C47); + break; + case 0x2C18: + bufpush(0x2C48); + break; + case 0x2C19: + bufpush(0x2C49); + break; + case 0x2C1A: + bufpush(0x2C4A); + break; + case 0x2C1B: + bufpush(0x2C4B); + break; + case 0x2C1C: + bufpush(0x2C4C); + break; + case 0x2C1D: + bufpush(0x2C4D); + break; + case 0x2C1E: + bufpush(0x2C4E); + break; + case 0x2C1F: + bufpush(0x2C4F); + break; + case 0x2C20: + bufpush(0x2C50); + break; + case 0x2C21: + bufpush(0x2C51); + break; + case 0x2C22: + bufpush(0x2C52); + break; + case 0x2C23: + bufpush(0x2C53); + break; + case 0x2C24: + bufpush(0x2C54); + break; + case 0x2C25: + bufpush(0x2C55); + break; + case 0x2C26: + bufpush(0x2C56); + break; + case 0x2C27: + bufpush(0x2C57); + break; + case 0x2C28: + bufpush(0x2C58); + break; + case 0x2C29: + bufpush(0x2C59); + break; + case 0x2C2A: + bufpush(0x2C5A); + break; + case 0x2C2B: + bufpush(0x2C5B); + break; + case 0x2C2C: + bufpush(0x2C5C); + break; + case 0x2C2D: + bufpush(0x2C5D); + break; + case 0x2C2E: + bufpush(0x2C5E); + break; + case 0x2C60: + bufpush(0x2C61); + break; + case 0x2C62: + bufpush(0x026B); + break; + case 0x2C63: + bufpush(0x1D7D); + break; + case 0x2C64: + bufpush(0x027D); + break; + case 0x2C67: + bufpush(0x2C68); + break; + case 0x2C69: + bufpush(0x2C6A); + break; + case 0x2C6B: + bufpush(0x2C6C); + break; + case 0x2C6D: + bufpush(0x0251); + break; + case 0x2C6E: + bufpush(0x0271); + break; + case 0x2C6F: + bufpush(0x0250); + break; + case 0x2C70: + bufpush(0x0252); + break; + case 0x2C72: + bufpush(0x2C73); + break; + case 0x2C75: + bufpush(0x2C76); + break; + case 0x2C7E: + bufpush(0x023F); + break; + case 0x2C7F: + bufpush(0x0240); + break; + case 0x2C80: + bufpush(0x2C81); + break; + case 0x2C82: + bufpush(0x2C83); + break; + case 0x2C84: + bufpush(0x2C85); + break; + case 0x2C86: + bufpush(0x2C87); + break; + case 0x2C88: + bufpush(0x2C89); + break; + case 0x2C8A: + bufpush(0x2C8B); + break; + case 0x2C8C: + bufpush(0x2C8D); + break; + case 0x2C8E: + bufpush(0x2C8F); + break; + case 0x2C90: + bufpush(0x2C91); + break; + case 0x2C92: + bufpush(0x2C93); + break; + case 0x2C94: + bufpush(0x2C95); + break; + case 0x2C96: + bufpush(0x2C97); + break; + case 0x2C98: + bufpush(0x2C99); + break; + case 0x2C9A: + bufpush(0x2C9B); + break; + case 0x2C9C: + bufpush(0x2C9D); + break; + case 0x2C9E: + bufpush(0x2C9F); + break; + case 0x2CA0: + bufpush(0x2CA1); + break; + case 0x2CA2: + bufpush(0x2CA3); + break; + case 0x2CA4: + bufpush(0x2CA5); + break; + case 0x2CA6: + bufpush(0x2CA7); + break; + case 0x2CA8: + bufpush(0x2CA9); + break; + case 0x2CAA: + bufpush(0x2CAB); + break; + case 0x2CAC: + bufpush(0x2CAD); + break; + case 0x2CAE: + bufpush(0x2CAF); + break; + case 0x2CB0: + bufpush(0x2CB1); + break; + case 0x2CB2: + bufpush(0x2CB3); + break; + case 0x2CB4: + bufpush(0x2CB5); + break; + case 0x2CB6: + bufpush(0x2CB7); + break; + case 0x2CB8: + bufpush(0x2CB9); + break; + case 0x2CBA: + bufpush(0x2CBB); + break; + case 0x2CBC: + bufpush(0x2CBD); + break; + case 0x2CBE: + bufpush(0x2CBF); + break; + case 0x2CC0: + bufpush(0x2CC1); + break; + case 0x2CC2: + bufpush(0x2CC3); + break; + case 0x2CC4: + bufpush(0x2CC5); + break; + case 0x2CC6: + bufpush(0x2CC7); + break; + case 0x2CC8: + bufpush(0x2CC9); + break; + case 0x2CCA: + bufpush(0x2CCB); + break; + case 0x2CCC: + bufpush(0x2CCD); + break; + case 0x2CCE: + bufpush(0x2CCF); + break; + case 0x2CD0: + bufpush(0x2CD1); + break; + case 0x2CD2: + bufpush(0x2CD3); + break; + case 0x2CD4: + bufpush(0x2CD5); + break; + case 0x2CD6: + bufpush(0x2CD7); + break; + case 0x2CD8: + bufpush(0x2CD9); + break; + case 0x2CDA: + bufpush(0x2CDB); + break; + case 0x2CDC: + bufpush(0x2CDD); + break; + case 0x2CDE: + bufpush(0x2CDF); + break; + case 0x2CE0: + bufpush(0x2CE1); + break; + case 0x2CE2: + bufpush(0x2CE3); + break; + case 0x2CEB: + bufpush(0x2CEC); + break; + case 0x2CED: + bufpush(0x2CEE); + break; + case 0x2CF2: + bufpush(0x2CF3); + break; + case 0xA640: + bufpush(0xA641); + break; + case 0xA642: + bufpush(0xA643); + break; + case 0xA644: + bufpush(0xA645); + break; + case 0xA646: + bufpush(0xA647); + break; + case 0xA648: + bufpush(0xA649); + break; + case 0xA64A: + bufpush(0xA64B); + break; + case 0xA64C: + bufpush(0xA64D); + break; + case 0xA64E: + bufpush(0xA64F); + break; + case 0xA650: + bufpush(0xA651); + break; + case 0xA652: + bufpush(0xA653); + break; + case 0xA654: + bufpush(0xA655); + break; + case 0xA656: + bufpush(0xA657); + break; + case 0xA658: + bufpush(0xA659); + break; + case 0xA65A: + bufpush(0xA65B); + break; + case 0xA65C: + bufpush(0xA65D); + break; + case 0xA65E: + bufpush(0xA65F); + break; + case 0xA660: + bufpush(0xA661); + break; + case 0xA662: + bufpush(0xA663); + break; + case 0xA664: + bufpush(0xA665); + break; + case 0xA666: + bufpush(0xA667); + break; + case 0xA668: + bufpush(0xA669); + break; + case 0xA66A: + bufpush(0xA66B); + break; + case 0xA66C: + bufpush(0xA66D); + break; + case 0xA680: + bufpush(0xA681); + break; + case 0xA682: + bufpush(0xA683); + break; + case 0xA684: + bufpush(0xA685); + break; + case 0xA686: + bufpush(0xA687); + break; + case 0xA688: + bufpush(0xA689); + break; + case 0xA68A: + bufpush(0xA68B); + break; + case 0xA68C: + bufpush(0xA68D); + break; + case 0xA68E: + bufpush(0xA68F); + break; + case 0xA690: + bufpush(0xA691); + break; + case 0xA692: + bufpush(0xA693); + break; + case 0xA694: + bufpush(0xA695); + break; + case 0xA696: + bufpush(0xA697); + break; + case 0xA698: + bufpush(0xA699); + break; + case 0xA69A: + bufpush(0xA69B); + break; + case 0xA722: + bufpush(0xA723); + break; + case 0xA724: + bufpush(0xA725); + break; + case 0xA726: + bufpush(0xA727); + break; + case 0xA728: + bufpush(0xA729); + break; + case 0xA72A: + bufpush(0xA72B); + break; + case 0xA72C: + bufpush(0xA72D); + break; + case 0xA72E: + bufpush(0xA72F); + break; + case 0xA732: + bufpush(0xA733); + break; + case 0xA734: + bufpush(0xA735); + break; + case 0xA736: + bufpush(0xA737); + break; + case 0xA738: + bufpush(0xA739); + break; + case 0xA73A: + bufpush(0xA73B); + break; + case 0xA73C: + bufpush(0xA73D); + break; + case 0xA73E: + bufpush(0xA73F); + break; + case 0xA740: + bufpush(0xA741); + break; + case 0xA742: + bufpush(0xA743); + break; + case 0xA744: + bufpush(0xA745); + break; + case 0xA746: + bufpush(0xA747); + break; + case 0xA748: + bufpush(0xA749); + break; + case 0xA74A: + bufpush(0xA74B); + break; + case 0xA74C: + bufpush(0xA74D); + break; + case 0xA74E: + bufpush(0xA74F); + break; + case 0xA750: + bufpush(0xA751); + break; + case 0xA752: + bufpush(0xA753); + break; + case 0xA754: + bufpush(0xA755); + break; + case 0xA756: + bufpush(0xA757); + break; + case 0xA758: + bufpush(0xA759); + break; + case 0xA75A: + bufpush(0xA75B); + break; + case 0xA75C: + bufpush(0xA75D); + break; + case 0xA75E: + bufpush(0xA75F); + break; + case 0xA760: + bufpush(0xA761); + break; + case 0xA762: + bufpush(0xA763); + break; + case 0xA764: + bufpush(0xA765); + break; + case 0xA766: + bufpush(0xA767); + break; + case 0xA768: + bufpush(0xA769); + break; + case 0xA76A: + bufpush(0xA76B); + break; + case 0xA76C: + bufpush(0xA76D); + break; + case 0xA76E: + bufpush(0xA76F); + break; + case 0xA779: + bufpush(0xA77A); + break; + case 0xA77B: + bufpush(0xA77C); + break; + case 0xA77D: + bufpush(0x1D79); + break; + case 0xA77E: + bufpush(0xA77F); + break; + case 0xA780: + bufpush(0xA781); + break; + case 0xA782: + bufpush(0xA783); + break; + case 0xA784: + bufpush(0xA785); + break; + case 0xA786: + bufpush(0xA787); + break; + case 0xA78B: + bufpush(0xA78C); + break; + case 0xA78D: + bufpush(0x0265); + break; + case 0xA790: + bufpush(0xA791); + break; + case 0xA792: + bufpush(0xA793); + break; + case 0xA796: + bufpush(0xA797); + break; + case 0xA798: + bufpush(0xA799); + break; + case 0xA79A: + bufpush(0xA79B); + break; + case 0xA79C: + bufpush(0xA79D); + break; + case 0xA79E: + bufpush(0xA79F); + break; + case 0xA7A0: + bufpush(0xA7A1); + break; + case 0xA7A2: + bufpush(0xA7A3); + break; + case 0xA7A4: + bufpush(0xA7A5); + break; + case 0xA7A6: + bufpush(0xA7A7); + break; + case 0xA7A8: + bufpush(0xA7A9); + break; + case 0xA7AA: + bufpush(0x0266); + break; + case 0xA7AB: + bufpush(0x025C); + break; + case 0xA7AC: + bufpush(0x0261); + break; + case 0xA7AD: + bufpush(0x026C); + break; + case 0xA7AE: + bufpush(0x026A); + break; + case 0xA7B0: + bufpush(0x029E); + break; + case 0xA7B1: + bufpush(0x0287); + break; + case 0xA7B2: + bufpush(0x029D); + break; + case 0xA7B3: + bufpush(0xAB53); + break; + case 0xA7B4: + bufpush(0xA7B5); + break; + case 0xA7B6: + bufpush(0xA7B7); + break; + case 0xAB70: + bufpush(0x13A0); + break; + case 0xAB71: + bufpush(0x13A1); + break; + case 0xAB72: + bufpush(0x13A2); + break; + case 0xAB73: + bufpush(0x13A3); + break; + case 0xAB74: + bufpush(0x13A4); + break; + case 0xAB75: + bufpush(0x13A5); + break; + case 0xAB76: + bufpush(0x13A6); + break; + case 0xAB77: + bufpush(0x13A7); + break; + case 0xAB78: + bufpush(0x13A8); + break; + case 0xAB79: + bufpush(0x13A9); + break; + case 0xAB7A: + bufpush(0x13AA); + break; + case 0xAB7B: + bufpush(0x13AB); + break; + case 0xAB7C: + bufpush(0x13AC); + break; + case 0xAB7D: + bufpush(0x13AD); + break; + case 0xAB7E: + bufpush(0x13AE); + break; + case 0xAB7F: + bufpush(0x13AF); + break; + case 0xAB80: + bufpush(0x13B0); + break; + case 0xAB81: + bufpush(0x13B1); + break; + case 0xAB82: + bufpush(0x13B2); + break; + case 0xAB83: + bufpush(0x13B3); + break; + case 0xAB84: + bufpush(0x13B4); + break; + case 0xAB85: + bufpush(0x13B5); + break; + case 0xAB86: + bufpush(0x13B6); + break; + case 0xAB87: + bufpush(0x13B7); + break; + case 0xAB88: + bufpush(0x13B8); + break; + case 0xAB89: + bufpush(0x13B9); + break; + case 0xAB8A: + bufpush(0x13BA); + break; + case 0xAB8B: + bufpush(0x13BB); + break; + case 0xAB8C: + bufpush(0x13BC); + break; + case 0xAB8D: + bufpush(0x13BD); + break; + case 0xAB8E: + bufpush(0x13BE); + break; + case 0xAB8F: + bufpush(0x13BF); + break; + case 0xAB90: + bufpush(0x13C0); + break; + case 0xAB91: + bufpush(0x13C1); + break; + case 0xAB92: + bufpush(0x13C2); + break; + case 0xAB93: + bufpush(0x13C3); + break; + case 0xAB94: + bufpush(0x13C4); + break; + case 0xAB95: + bufpush(0x13C5); + break; + case 0xAB96: + bufpush(0x13C6); + break; + case 0xAB97: + bufpush(0x13C7); + break; + case 0xAB98: + bufpush(0x13C8); + break; + case 0xAB99: + bufpush(0x13C9); + break; + case 0xAB9A: + bufpush(0x13CA); + break; + case 0xAB9B: + bufpush(0x13CB); + break; + case 0xAB9C: + bufpush(0x13CC); + break; + case 0xAB9D: + bufpush(0x13CD); + break; + case 0xAB9E: + bufpush(0x13CE); + break; + case 0xAB9F: + bufpush(0x13CF); + break; + case 0xABA0: + bufpush(0x13D0); + break; + case 0xABA1: + bufpush(0x13D1); + break; + case 0xABA2: + bufpush(0x13D2); + break; + case 0xABA3: + bufpush(0x13D3); + break; + case 0xABA4: + bufpush(0x13D4); + break; + case 0xABA5: + bufpush(0x13D5); + break; + case 0xABA6: + bufpush(0x13D6); + break; + case 0xABA7: + bufpush(0x13D7); + break; + case 0xABA8: + bufpush(0x13D8); + break; + case 0xABA9: + bufpush(0x13D9); + break; + case 0xABAA: + bufpush(0x13DA); + break; + case 0xABAB: + bufpush(0x13DB); + break; + case 0xABAC: + bufpush(0x13DC); + break; + case 0xABAD: + bufpush(0x13DD); + break; + case 0xABAE: + bufpush(0x13DE); + break; + case 0xABAF: + bufpush(0x13DF); + break; + case 0xABB0: + bufpush(0x13E0); + break; + case 0xABB1: + bufpush(0x13E1); + break; + case 0xABB2: + bufpush(0x13E2); + break; + case 0xABB3: + bufpush(0x13E3); + break; + case 0xABB4: + bufpush(0x13E4); + break; + case 0xABB5: + bufpush(0x13E5); + break; + case 0xABB6: + bufpush(0x13E6); + break; + case 0xABB7: + bufpush(0x13E7); + break; + case 0xABB8: + bufpush(0x13E8); + break; + case 0xABB9: + bufpush(0x13E9); + break; + case 0xABBA: + bufpush(0x13EA); + break; + case 0xABBB: + bufpush(0x13EB); + break; + case 0xABBC: + bufpush(0x13EC); + break; + case 0xABBD: + bufpush(0x13ED); + break; + case 0xABBE: + bufpush(0x13EE); + break; + case 0xABBF: + bufpush(0x13EF); + break; + case 0xFB00: + bufpush(0x0066); + bufpush(0x0066); + break; + case 0xFB01: + bufpush(0x0066); + bufpush(0x0069); + break; + case 0xFB02: + bufpush(0x0066); + bufpush(0x006C); + break; + case 0xFB03: + bufpush(0x0066); + bufpush(0x0066); + bufpush(0x0069); + break; + case 0xFB04: + bufpush(0x0066); + bufpush(0x0066); + bufpush(0x006C); + break; + case 0xFB05: + bufpush(0x0073); + bufpush(0x0074); + break; + case 0xFB06: + bufpush(0x0073); + bufpush(0x0074); + break; + case 0xFB13: + bufpush(0x0574); + bufpush(0x0576); + break; + case 0xFB14: + bufpush(0x0574); + bufpush(0x0565); + break; + case 0xFB15: + bufpush(0x0574); + bufpush(0x056B); + break; + case 0xFB16: + bufpush(0x057E); + bufpush(0x0576); + break; + case 0xFB17: + bufpush(0x0574); + bufpush(0x056D); + break; + case 0xFF21: + bufpush(0xFF41); + break; + case 0xFF22: + bufpush(0xFF42); + break; + case 0xFF23: + bufpush(0xFF43); + break; + case 0xFF24: + bufpush(0xFF44); + break; + case 0xFF25: + bufpush(0xFF45); + break; + case 0xFF26: + bufpush(0xFF46); + break; + case 0xFF27: + bufpush(0xFF47); + break; + case 0xFF28: + bufpush(0xFF48); + break; + case 0xFF29: + bufpush(0xFF49); + break; + case 0xFF2A: + bufpush(0xFF4A); + break; + case 0xFF2B: + bufpush(0xFF4B); + break; + case 0xFF2C: + bufpush(0xFF4C); + break; + case 0xFF2D: + bufpush(0xFF4D); + break; + case 0xFF2E: + bufpush(0xFF4E); + break; + case 0xFF2F: + bufpush(0xFF4F); + break; + case 0xFF30: + bufpush(0xFF50); + break; + case 0xFF31: + bufpush(0xFF51); + break; + case 0xFF32: + bufpush(0xFF52); + break; + case 0xFF33: + bufpush(0xFF53); + break; + case 0xFF34: + bufpush(0xFF54); + break; + case 0xFF35: + bufpush(0xFF55); + break; + case 0xFF36: + bufpush(0xFF56); + break; + case 0xFF37: + bufpush(0xFF57); + break; + case 0xFF38: + bufpush(0xFF58); + break; + case 0xFF39: + bufpush(0xFF59); + break; + case 0xFF3A: + bufpush(0xFF5A); + break; + case 0x10400: + bufpush(0x10428); + break; + case 0x10401: + bufpush(0x10429); + break; + case 0x10402: + bufpush(0x1042A); + break; + case 0x10403: + bufpush(0x1042B); + break; + case 0x10404: + bufpush(0x1042C); + break; + case 0x10405: + bufpush(0x1042D); + break; + case 0x10406: + bufpush(0x1042E); + break; + case 0x10407: + bufpush(0x1042F); + break; + case 0x10408: + bufpush(0x10430); + break; + case 0x10409: + bufpush(0x10431); + break; + case 0x1040A: + bufpush(0x10432); + break; + case 0x1040B: + bufpush(0x10433); + break; + case 0x1040C: + bufpush(0x10434); + break; + case 0x1040D: + bufpush(0x10435); + break; + case 0x1040E: + bufpush(0x10436); + break; + case 0x1040F: + bufpush(0x10437); + break; + case 0x10410: + bufpush(0x10438); + break; + case 0x10411: + bufpush(0x10439); + break; + case 0x10412: + bufpush(0x1043A); + break; + case 0x10413: + bufpush(0x1043B); + break; + case 0x10414: + bufpush(0x1043C); + break; + case 0x10415: + bufpush(0x1043D); + break; + case 0x10416: + bufpush(0x1043E); + break; + case 0x10417: + bufpush(0x1043F); + break; + case 0x10418: + bufpush(0x10440); + break; + case 0x10419: + bufpush(0x10441); + break; + case 0x1041A: + bufpush(0x10442); + break; + case 0x1041B: + bufpush(0x10443); + break; + case 0x1041C: + bufpush(0x10444); + break; + case 0x1041D: + bufpush(0x10445); + break; + case 0x1041E: + bufpush(0x10446); + break; + case 0x1041F: + bufpush(0x10447); + break; + case 0x10420: + bufpush(0x10448); + break; + case 0x10421: + bufpush(0x10449); + break; + case 0x10422: + bufpush(0x1044A); + break; + case 0x10423: + bufpush(0x1044B); + break; + case 0x10424: + bufpush(0x1044C); + break; + case 0x10425: + bufpush(0x1044D); + break; + case 0x10426: + bufpush(0x1044E); + break; + case 0x10427: + bufpush(0x1044F); + break; + case 0x104B0: + bufpush(0x104D8); + break; + case 0x104B1: + bufpush(0x104D9); + break; + case 0x104B2: + bufpush(0x104DA); + break; + case 0x104B3: + bufpush(0x104DB); + break; + case 0x104B4: + bufpush(0x104DC); + break; + case 0x104B5: + bufpush(0x104DD); + break; + case 0x104B6: + bufpush(0x104DE); + break; + case 0x104B7: + bufpush(0x104DF); + break; + case 0x104B8: + bufpush(0x104E0); + break; + case 0x104B9: + bufpush(0x104E1); + break; + case 0x104BA: + bufpush(0x104E2); + break; + case 0x104BB: + bufpush(0x104E3); + break; + case 0x104BC: + bufpush(0x104E4); + break; + case 0x104BD: + bufpush(0x104E5); + break; + case 0x104BE: + bufpush(0x104E6); + break; + case 0x104BF: + bufpush(0x104E7); + break; + case 0x104C0: + bufpush(0x104E8); + break; + case 0x104C1: + bufpush(0x104E9); + break; + case 0x104C2: + bufpush(0x104EA); + break; + case 0x104C3: + bufpush(0x104EB); + break; + case 0x104C4: + bufpush(0x104EC); + break; + case 0x104C5: + bufpush(0x104ED); + break; + case 0x104C6: + bufpush(0x104EE); + break; + case 0x104C7: + bufpush(0x104EF); + break; + case 0x104C8: + bufpush(0x104F0); + break; + case 0x104C9: + bufpush(0x104F1); + break; + case 0x104CA: + bufpush(0x104F2); + break; + case 0x104CB: + bufpush(0x104F3); + break; + case 0x104CC: + bufpush(0x104F4); + break; + case 0x104CD: + bufpush(0x104F5); + break; + case 0x104CE: + bufpush(0x104F6); + break; + case 0x104CF: + bufpush(0x104F7); + break; + case 0x104D0: + bufpush(0x104F8); + break; + case 0x104D1: + bufpush(0x104F9); + break; + case 0x104D2: + bufpush(0x104FA); + break; + case 0x104D3: + bufpush(0x104FB); + break; + case 0x10C80: + bufpush(0x10CC0); + break; + case 0x10C81: + bufpush(0x10CC1); + break; + case 0x10C82: + bufpush(0x10CC2); + break; + case 0x10C83: + bufpush(0x10CC3); + break; + case 0x10C84: + bufpush(0x10CC4); + break; + case 0x10C85: + bufpush(0x10CC5); + break; + case 0x10C86: + bufpush(0x10CC6); + break; + case 0x10C87: + bufpush(0x10CC7); + break; + case 0x10C88: + bufpush(0x10CC8); + break; + case 0x10C89: + bufpush(0x10CC9); + break; + case 0x10C8A: + bufpush(0x10CCA); + break; + case 0x10C8B: + bufpush(0x10CCB); + break; + case 0x10C8C: + bufpush(0x10CCC); + break; + case 0x10C8D: + bufpush(0x10CCD); + break; + case 0x10C8E: + bufpush(0x10CCE); + break; + case 0x10C8F: + bufpush(0x10CCF); + break; + case 0x10C90: + bufpush(0x10CD0); + break; + case 0x10C91: + bufpush(0x10CD1); + break; + case 0x10C92: + bufpush(0x10CD2); + break; + case 0x10C93: + bufpush(0x10CD3); + break; + case 0x10C94: + bufpush(0x10CD4); + break; + case 0x10C95: + bufpush(0x10CD5); + break; + case 0x10C96: + bufpush(0x10CD6); + break; + case 0x10C97: + bufpush(0x10CD7); + break; + case 0x10C98: + bufpush(0x10CD8); + break; + case 0x10C99: + bufpush(0x10CD9); + break; + case 0x10C9A: + bufpush(0x10CDA); + break; + case 0x10C9B: + bufpush(0x10CDB); + break; + case 0x10C9C: + bufpush(0x10CDC); + break; + case 0x10C9D: + bufpush(0x10CDD); + break; + case 0x10C9E: + bufpush(0x10CDE); + break; + case 0x10C9F: + bufpush(0x10CDF); + break; + case 0x10CA0: + bufpush(0x10CE0); + break; + case 0x10CA1: + bufpush(0x10CE1); + break; + case 0x10CA2: + bufpush(0x10CE2); + break; + case 0x10CA3: + bufpush(0x10CE3); + break; + case 0x10CA4: + bufpush(0x10CE4); + break; + case 0x10CA5: + bufpush(0x10CE5); + break; + case 0x10CA6: + bufpush(0x10CE6); + break; + case 0x10CA7: + bufpush(0x10CE7); + break; + case 0x10CA8: + bufpush(0x10CE8); + break; + case 0x10CA9: + bufpush(0x10CE9); + break; + case 0x10CAA: + bufpush(0x10CEA); + break; + case 0x10CAB: + bufpush(0x10CEB); + break; + case 0x10CAC: + bufpush(0x10CEC); + break; + case 0x10CAD: + bufpush(0x10CED); + break; + case 0x10CAE: + bufpush(0x10CEE); + break; + case 0x10CAF: + bufpush(0x10CEF); + break; + case 0x10CB0: + bufpush(0x10CF0); + break; + case 0x10CB1: + bufpush(0x10CF1); + break; + case 0x10CB2: + bufpush(0x10CF2); + break; + case 0x118A0: + bufpush(0x118C0); + break; + case 0x118A1: + bufpush(0x118C1); + break; + case 0x118A2: + bufpush(0x118C2); + break; + case 0x118A3: + bufpush(0x118C3); + break; + case 0x118A4: + bufpush(0x118C4); + break; + case 0x118A5: + bufpush(0x118C5); + break; + case 0x118A6: + bufpush(0x118C6); + break; + case 0x118A7: + bufpush(0x118C7); + break; + case 0x118A8: + bufpush(0x118C8); + break; + case 0x118A9: + bufpush(0x118C9); + break; + case 0x118AA: + bufpush(0x118CA); + break; + case 0x118AB: + bufpush(0x118CB); + break; + case 0x118AC: + bufpush(0x118CC); + break; + case 0x118AD: + bufpush(0x118CD); + break; + case 0x118AE: + bufpush(0x118CE); + break; + case 0x118AF: + bufpush(0x118CF); + break; + case 0x118B0: + bufpush(0x118D0); + break; + case 0x118B1: + bufpush(0x118D1); + break; + case 0x118B2: + bufpush(0x118D2); + break; + case 0x118B3: + bufpush(0x118D3); + break; + case 0x118B4: + bufpush(0x118D4); + break; + case 0x118B5: + bufpush(0x118D5); + break; + case 0x118B6: + bufpush(0x118D6); + break; + case 0x118B7: + bufpush(0x118D7); + break; + case 0x118B8: + bufpush(0x118D8); + break; + case 0x118B9: + bufpush(0x118D9); + break; + case 0x118BA: + bufpush(0x118DA); + break; + case 0x118BB: + bufpush(0x118DB); + break; + case 0x118BC: + bufpush(0x118DC); + break; + case 0x118BD: + bufpush(0x118DD); + break; + case 0x118BE: + bufpush(0x118DE); + break; + case 0x118BF: + bufpush(0x118DF); + break; + case 0x1E900: + bufpush(0x1E922); + break; + case 0x1E901: + bufpush(0x1E923); + break; + case 0x1E902: + bufpush(0x1E924); + break; + case 0x1E903: + bufpush(0x1E925); + break; + case 0x1E904: + bufpush(0x1E926); + break; + case 0x1E905: + bufpush(0x1E927); + break; + case 0x1E906: + bufpush(0x1E928); + break; + case 0x1E907: + bufpush(0x1E929); + break; + case 0x1E908: + bufpush(0x1E92A); + break; + case 0x1E909: + bufpush(0x1E92B); + break; + case 0x1E90A: + bufpush(0x1E92C); + break; + case 0x1E90B: + bufpush(0x1E92D); + break; + case 0x1E90C: + bufpush(0x1E92E); + break; + case 0x1E90D: + bufpush(0x1E92F); + break; + case 0x1E90E: + bufpush(0x1E930); + break; + case 0x1E90F: + bufpush(0x1E931); + break; + case 0x1E910: + bufpush(0x1E932); + break; + case 0x1E911: + bufpush(0x1E933); + break; + case 0x1E912: + bufpush(0x1E934); + break; + case 0x1E913: + bufpush(0x1E935); + break; + case 0x1E914: + bufpush(0x1E936); + break; + case 0x1E915: + bufpush(0x1E937); + break; + case 0x1E916: + bufpush(0x1E938); + break; + case 0x1E917: + bufpush(0x1E939); + break; + case 0x1E918: + bufpush(0x1E93A); + break; + case 0x1E919: + bufpush(0x1E93B); + break; + case 0x1E91A: + bufpush(0x1E93C); + break; + case 0x1E91B: + bufpush(0x1E93D); + break; + case 0x1E91C: + bufpush(0x1E93E); + break; + case 0x1E91D: + bufpush(0x1E93F); + break; + case 0x1E91E: + bufpush(0x1E940); + break; + case 0x1E91F: + bufpush(0x1E941); + break; + case 0x1E920: + bufpush(0x1E942); + break; + case 0x1E921: + bufpush(0x1E943); + break; + default: + bufpush(c); + } diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/chunk.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/chunk.h new file mode 100644 index 000000000000..dfed13f19095 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/chunk.h @@ -0,0 +1,136 @@ +#ifndef CMARK_CHUNK_H +#define CMARK_CHUNK_H + +#include +#include +#include +#include "cmark-gfm.h" +#include "buffer.h" +#include "memory.h" +#include "cmark_ctype.h" + +#define CMARK_CHUNK_EMPTY \ + { NULL, 0, 0 } + +typedef struct cmark_chunk { + unsigned char *data; + bufsize_t len; + bufsize_t alloc; // also implies a NULL-terminated string +} cmark_chunk; + +static CMARK_INLINE void cmark_chunk_free(cmark_mem *mem, cmark_chunk *c) { + if (c->alloc) + mem->free(c->data); + + c->data = NULL; + c->alloc = 0; + c->len = 0; +} + +static CMARK_INLINE void cmark_chunk_ltrim(cmark_chunk *c) { + assert(!c->alloc); + + while (c->len && cmark_isspace(c->data[0])) { + c->data++; + c->len--; + } +} + +static CMARK_INLINE void cmark_chunk_rtrim(cmark_chunk *c) { + assert(!c->alloc); + + while (c->len > 0) { + if (!cmark_isspace(c->data[c->len - 1])) + break; + + c->len--; + } +} + +static CMARK_INLINE void cmark_chunk_trim(cmark_chunk *c) { + cmark_chunk_ltrim(c); + cmark_chunk_rtrim(c); +} + +static CMARK_INLINE bufsize_t cmark_chunk_strchr(cmark_chunk *ch, int c, + bufsize_t offset) { + const unsigned char *p = + (unsigned char *)memchr(ch->data + offset, c, ch->len - offset); + return p ? (bufsize_t)(p - ch->data) : ch->len; +} + +static CMARK_INLINE const char *cmark_chunk_to_cstr(cmark_mem *mem, + cmark_chunk *c) { + unsigned char *str; + + if (c->alloc) { + return (char *)c->data; + } + str = (unsigned char *)mem->calloc(c->len + 1, 1); + if (c->len > 0) { + memcpy(str, c->data, c->len); + } + str[c->len] = 0; + c->data = str; + c->alloc = 1; + + return (char *)str; +} + +static CMARK_INLINE void cmark_chunk_set_cstr(cmark_mem *mem, cmark_chunk *c, + const char *str) { + unsigned char *old = c->alloc ? c->data : NULL; + if (str == NULL) { + c->len = 0; + c->data = NULL; + c->alloc = 0; + } else { + c->len = (bufsize_t)strlen(str); + c->data = (unsigned char *)mem->calloc(c->len + 1, 1); + c->alloc = 1; + memcpy(c->data, str, c->len + 1); + } + if (old != NULL) { + mem->free(old); + } +} + +static CMARK_INLINE cmark_chunk cmark_chunk_literal(const char *data) { + bufsize_t len = data ? (bufsize_t)strlen(data) : 0; + cmark_chunk c = {(unsigned char *)data, len, 0}; + return c; +} + +static CMARK_INLINE cmark_chunk cmark_chunk_dup(const cmark_chunk *ch, + bufsize_t pos, bufsize_t len) { + cmark_chunk c = {ch->data + pos, len, 0}; + return c; +} + +static CMARK_INLINE cmark_chunk cmark_chunk_buf_detach(cmark_strbuf *buf) { + cmark_chunk c; + + c.len = buf->size; + c.data = cmark_strbuf_detach(buf); + c.alloc = 1; + + return c; +} + +/* trim_new variants are to be used when the source chunk may or may not be + * allocated; forces a newly allocated chunk. */ +static CMARK_INLINE cmark_chunk cmark_chunk_ltrim_new(cmark_mem *mem, cmark_chunk *c) { + cmark_chunk r = cmark_chunk_dup(c, 0, c->len); + cmark_chunk_ltrim(&r); + cmark_chunk_to_cstr(mem, &r); + return r; +} + +static CMARK_INLINE cmark_chunk cmark_chunk_rtrim_new(cmark_mem *mem, cmark_chunk *c) { + cmark_chunk r = cmark_chunk_dup(c, 0, c->len); + cmark_chunk_rtrim(&r); + cmark_chunk_to_cstr(mem, &r); + return r; +} + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm-core-extensions.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm-core-extensions.h new file mode 100644 index 000000000000..075905e8258b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm-core-extensions.h @@ -0,0 +1,25 @@ +#ifndef CMARK_GFM_CORE_EXTENSIONS_H +#define CMARK_GFM_CORE_EXTENSIONS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cmark-gfm-extension_api.h" +#include "cmark-gfm-extensions_export.h" +#include + +CMARK_GFM_EXTENSIONS_EXPORT +void cmark_gfm_core_extensions_ensure_registered(void); + +CMARK_GFM_EXTENSIONS_EXPORT +uint16_t cmark_gfm_extensions_get_table_columns(cmark_node *node); + +CMARK_GFM_EXTENSIONS_EXPORT +uint8_t *cmark_gfm_extensions_get_table_alignments(cmark_node *node); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm-extension_api.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm-extension_api.h new file mode 100644 index 000000000000..853948c43a76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm-extension_api.h @@ -0,0 +1,719 @@ +#ifndef CMARK_GFM_EXTENSION_API_H +#define CMARK_GFM_EXTENSION_API_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cmark-gfm.h" + +struct cmark_renderer; +struct cmark_html_renderer; +struct cmark_chunk; + +/** + * ## Extension Support + * + * While the "core" of libcmark is strictly compliant with the + * specification, an API is provided for extension writers to + * hook into the parsing process. + * + * It should be noted that the cmark_node API already offers + * room for customization, with methods offered to traverse and + * modify the AST, and even define custom blocks. + * When the desired customization is achievable in an error-proof + * way using that API, it should be the preferred method. + * + * The following API requires a more in-depth understanding + * of libcmark's parsing strategy, which is exposed + * [here](http://spec.commonmark.org/0.24/#appendix-a-parsing-strategy). + * + * It should be used when "a posteriori" modification of the AST + * proves to be too difficult / impossible to implement correctly. + * + * It can also serve as an intermediary step before extending + * the specification, as an extension implemented using this API + * will be trivially integrated in the core if it proves to be + * desirable. + */ + +typedef struct cmark_plugin cmark_plugin; + +/** A syntax extension that can be attached to a cmark_parser + * with cmark_parser_attach_syntax_extension(). + * + * Extension writers should assign functions matching + * the signature of the following 'virtual methods' to + * implement new functionality. + * + * Their calling order and expected behaviour match the procedure outlined + * at : + * + * During step 1, cmark will call the function provided through + * 'cmark_syntax_extension_set_match_block_func' when it + * iterates over an open block created by this extension, + * to determine whether it could contain the new line. + * If no function was provided, cmark will close the block. + * + * During step 2, if and only if the new line doesn't match any + * of the standard syntax rules, cmark will call the function + * provided through 'cmark_syntax_extension_set_open_block_func' + * to let the extension determine whether that new line matches + * one of its syntax rules. + * It is the responsibility of the parser to create and add the + * new block with cmark_parser_make_block and cmark_parser_add_child. + * If no function was provided is NULL, the extension will have + * no effect at all on the final block structure of the AST. + * + * #### Inline parsing phase hooks + * + * For each character provided by the extension through + * 'cmark_syntax_extension_set_special_inline_chars', + * the function provided by the extension through + * 'cmark_syntax_extension_set_match_inline_func' + * will get called, it is the responsibility of the extension + * to scan the characters located at the current inline parsing offset + * with the cmark_inline_parser API. + * + * Depending on the type of the extension, it can either: + * + * * Scan forward, determine that the syntax matches and return + * a newly-created inline node with the appropriate type. + * This is the technique that would be used if inline code + * (with backticks) was implemented as an extension. + * * Scan only the character(s) that its syntax rules require + * for opening and closing nodes, push a delimiter on the + * delimiter stack, and return a simple text node with its + * contents set to the character(s) consumed. + * This is the technique that would be used if emphasis + * inlines were implemented as an extension. + * + * When an extension has pushed delimiters on the stack, + * the function provided through + * 'cmark_syntax_extension_set_inline_from_delim_func' + * will get called in a latter phase, + * when the inline parser has matched opener and closer delimiters + * created by the extension together. + * + * It is then the responsibility of the extension to modify + * and populate the opener inline text node, and to remove + * the necessary delimiters from the delimiter stack. + * + * Finally, the extension should return NULL if its scan didn't + * match its syntax rules. + * + * The extension can store whatever private data it might need + * with 'cmark_syntax_extension_set_private', + * and optionally define a free function for this data. + */ +typedef struct cmark_syntax_extension cmark_syntax_extension; + +typedef struct subject cmark_inline_parser; + +/** Exposed raw for now */ + +typedef struct delimiter { + struct delimiter *previous; + struct delimiter *next; + cmark_node *inl_text; + bufsize_t length; + unsigned char delim_char; + int can_open; + int can_close; +} delimiter; + +/** + * ### Plugin API. + * + * Extensions should be distributed as dynamic libraries, + * with a single exported function named after the distributed + * filename. + * + * When discovering extensions (see cmark_init), cmark will + * try to load a symbol named "init_{{filename}}" in all the + * dynamic libraries it encounters. + * + * For example, given a dynamic library named myextension.so + * (or myextension.dll), cmark will try to load the symbol + * named "init_myextension". This means that the filename + * must lend itself to forming a valid C identifier, with + * the notable exception of dashes, which will be translated + * to underscores, which means cmark will look for a function + * named "init_my_extension" if it encounters a dynamic library + * named "my-extension.so". + * + * See the 'cmark_plugin_init_func' typedef for the exact prototype + * this function should follow. + * + * For now the extensibility of cmark is not complete, as + * it only offers API to hook into the block parsing phase + * (). + * + * See 'cmark_plugin_register_syntax_extension' for more information. + */ + +/** The prototype plugins' init function should follow. + */ +typedef int (*cmark_plugin_init_func)(cmark_plugin *plugin); + +/** Register a syntax 'extension' with the 'plugin', it will be made + * available as an extension and, if attached to a cmark_parser + * with 'cmark_parser_attach_syntax_extension', it will contribute + * to the block parsing process. + * + * See the documentation for 'cmark_syntax_extension' for information + * on how to implement one. + * + * This function will typically be called from the init function + * of external modules. + * + * This takes ownership of 'extension', one should not call + * 'cmark_syntax_extension_free' on a registered extension. + */ +CMARK_GFM_EXPORT +int cmark_plugin_register_syntax_extension(cmark_plugin *plugin, + cmark_syntax_extension *extension); + +/** This will search for the syntax extension named 'name' among the + * registered syntax extensions. + * + * It can then be attached to a cmark_parser + * with the cmark_parser_attach_syntax_extension method. + */ +CMARK_GFM_EXPORT +cmark_syntax_extension *cmark_find_syntax_extension(const char *name); + +/** Should create and add a new open block to 'parent_container' if + * 'input' matches a syntax rule for that block type. It is allowed + * to modify the type of 'parent_container'. + * + * Should return the newly created block if there is one, or + * 'parent_container' if its type was modified, or NULL. + */ +typedef cmark_node * (*cmark_open_block_func) (cmark_syntax_extension *extension, + int indented, + cmark_parser *parser, + cmark_node *parent_container, + unsigned char *input, + int len); + +typedef cmark_node *(*cmark_match_inline_func)(cmark_syntax_extension *extension, + cmark_parser *parser, + cmark_node *parent, + unsigned char character, + cmark_inline_parser *inline_parser); + +typedef delimiter *(*cmark_inline_from_delim_func)(cmark_syntax_extension *extension, + cmark_parser *parser, + cmark_inline_parser *inline_parser, + delimiter *opener, + delimiter *closer); + +/** Should return 'true' if 'input' can be contained in 'container', + * 'false' otherwise. + */ +typedef int (*cmark_match_block_func) (cmark_syntax_extension *extension, + cmark_parser *parser, + unsigned char *input, + int len, + cmark_node *container); + +typedef const char *(*cmark_get_type_string_func) (cmark_syntax_extension *extension, + cmark_node *node); + +typedef int (*cmark_can_contain_func) (cmark_syntax_extension *extension, + cmark_node *node, + cmark_node_type child); + +typedef int (*cmark_contains_inlines_func) (cmark_syntax_extension *extension, + cmark_node *node); + +typedef void (*cmark_common_render_func) (cmark_syntax_extension *extension, + struct cmark_renderer *renderer, + cmark_node *node, + cmark_event_type ev_type, + int options); + +typedef int (*cmark_commonmark_escape_func) (cmark_syntax_extension *extension, + cmark_node *node, + int c); + +typedef void (*cmark_html_render_func) (cmark_syntax_extension *extension, + struct cmark_html_renderer *renderer, + cmark_node *node, + cmark_event_type ev_type, + int options); + +typedef int (*cmark_html_filter_func) (cmark_syntax_extension *extension, + const unsigned char *tag, + size_t tag_len); + +typedef cmark_node *(*cmark_postprocess_func) (cmark_syntax_extension *extension, + cmark_parser *parser, + cmark_node *root); + +typedef int (*cmark_ispunct_func) (char c); + +typedef void (*cmark_opaque_free_func) (cmark_syntax_extension *extension, + cmark_mem *mem, + cmark_node *node); + +/** Free a cmark_syntax_extension. + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_free (cmark_mem *mem, cmark_syntax_extension *extension); + +/** Return a newly-constructed cmark_syntax_extension, named 'name'. + */ +CMARK_GFM_EXPORT +cmark_syntax_extension *cmark_syntax_extension_new (const char *name); + +CMARK_GFM_EXPORT +cmark_node_type cmark_syntax_extension_add_node(int is_inline); + +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_emphasis(cmark_syntax_extension *extension, int emphasis); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_open_block_func(cmark_syntax_extension *extension, + cmark_open_block_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_match_block_func(cmark_syntax_extension *extension, + cmark_match_block_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_match_inline_func(cmark_syntax_extension *extension, + cmark_match_inline_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_inline_from_delim_func(cmark_syntax_extension *extension, + cmark_inline_from_delim_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_special_inline_chars(cmark_syntax_extension *extension, + cmark_llist *special_chars); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_get_type_string_func(cmark_syntax_extension *extension, + cmark_get_type_string_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_can_contain_func(cmark_syntax_extension *extension, + cmark_can_contain_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_contains_inlines_func(cmark_syntax_extension *extension, + cmark_contains_inlines_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_commonmark_render_func(cmark_syntax_extension *extension, + cmark_common_render_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_plaintext_render_func(cmark_syntax_extension *extension, + cmark_common_render_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_latex_render_func(cmark_syntax_extension *extension, + cmark_common_render_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_man_render_func(cmark_syntax_extension *extension, + cmark_common_render_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_html_render_func(cmark_syntax_extension *extension, + cmark_html_render_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_html_filter_func(cmark_syntax_extension *extension, + cmark_html_filter_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_commonmark_escape_func(cmark_syntax_extension *extension, + cmark_commonmark_escape_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_private(cmark_syntax_extension *extension, + void *priv, + cmark_free_func free_func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void *cmark_syntax_extension_get_private(cmark_syntax_extension *extension); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_postprocess_func(cmark_syntax_extension *extension, + cmark_postprocess_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_syntax_extension_set_opaque_free_func(cmark_syntax_extension *extension, + cmark_opaque_free_func func); + +/** See the documentation for 'cmark_syntax_extension' + */ +CMARK_GFM_EXPORT +void cmark_parser_set_backslash_ispunct_func(cmark_parser *parser, + cmark_ispunct_func func); + +/** Return the index of the line currently being parsed, starting with 1. + */ +CMARK_GFM_EXPORT +int cmark_parser_get_line_number(cmark_parser *parser); + +/** Return the offset in bytes in the line being processed. + * + * Example: + * + * ### foo + * + * Here, offset will first be 0, then 5 (the index of the 'f' character). + */ +CMARK_GFM_EXPORT +int cmark_parser_get_offset(cmark_parser *parser); + +/** + * Return the offset in 'columns' in the line being processed. + * + * This value may differ from the value returned by + * cmark_parser_get_offset() in that it accounts for tabs, + * and as such should not be used as an index in the current line's + * buffer. + * + * Example: + * + * cmark_parser_advance_offset() can be called to advance the + * offset by a number of columns, instead of a number of bytes. + * + * In that case, if offset falls "in the middle" of a tab + * character, 'column' and offset will differ. + * + * ``` + * foo \t bar + * ^ ^^ + * offset (0) 20 + * ``` + * + * If cmark_parser_advance_offset is called here with 'columns' + * set to 'true' and 'offset' set to 22, cmark_parser_get_offset() + * will return 20, whereas cmark_parser_get_column() will return + * 22. + * + * Additionally, as tabs expand to the next multiple of 4 column, + * cmark_parser_has_partially_consumed_tab() will now return + * 'true'. + */ +CMARK_GFM_EXPORT +int cmark_parser_get_column(cmark_parser *parser); + +/** Return the absolute index in bytes of the first nonspace + * character coming after the offset as returned by + * cmark_parser_get_offset() in the line currently being processed. + * + * Example: + * + * ``` + * foo bar baz \n + * ^ ^ ^ + * 0 offset (16) first_nonspace (28) + * ``` + */ +CMARK_GFM_EXPORT +int cmark_parser_get_first_nonspace(cmark_parser *parser); + +/** Return the absolute index of the first nonspace column coming after 'offset' + * in the line currently being processed, counting tabs as multiple + * columns as appropriate. + * + * See the documentation for cmark_parser_get_first_nonspace() and + * cmark_parser_get_column() for more information. + */ +CMARK_GFM_EXPORT +int cmark_parser_get_first_nonspace_column(cmark_parser *parser); + +/** Return the difference between the values returned by + * cmark_parser_get_first_nonspace_column() and + * cmark_parser_get_column(). + * + * This is not a byte offset, as it can count one tab as multiple + * characters. + */ +CMARK_GFM_EXPORT +int cmark_parser_get_indent(cmark_parser *parser); + +/** Return 'true' if the line currently being processed has been entirely + * consumed, 'false' otherwise. + * + * Example: + * + * ``` + * foo bar baz \n + * ^ + * offset + * ``` + * + * This function will return 'false' here. + * + * ``` + * foo bar baz \n + * ^ + * offset + * ``` + * This function will still return 'false'. + * + * ``` + * foo bar baz \n + * ^ + * offset + * ``` + * + * At this point, this function will now return 'true'. + */ +CMARK_GFM_EXPORT +int cmark_parser_is_blank(cmark_parser *parser); + +/** Return 'true' if the value returned by cmark_parser_get_offset() + * is 'inside' an expanded tab. + * + * See the documentation for cmark_parser_get_column() for more + * information. + */ +CMARK_GFM_EXPORT +int cmark_parser_has_partially_consumed_tab(cmark_parser *parser); + +/** Return the length in bytes of the previously processed line, excluding potential + * newline (\n) and carriage return (\r) trailing characters. + */ +CMARK_GFM_EXPORT +int cmark_parser_get_last_line_length(cmark_parser *parser); + +/** Add a child to 'parent' during the parsing process. + * + * If 'parent' isn't the kind of node that can accept this child, + * this function will back up till it hits a node that can, closing + * blocks as appropriate. + */ +CMARK_GFM_EXPORT +cmark_node*cmark_parser_add_child(cmark_parser *parser, + cmark_node *parent, + cmark_node_type block_type, + int start_column); + +/** Advance the 'offset' of the parser in the current line. + * + * See the documentation of cmark_parser_get_offset() and + * cmark_parser_get_column() for more information. + */ +CMARK_GFM_EXPORT +void cmark_parser_advance_offset(cmark_parser *parser, + const char *input, + int count, + int columns); + + +CMARK_GFM_EXPORT +void cmark_parser_feed_reentrant(cmark_parser *parser, const char *buffer, size_t len); + +/** Attach the syntax 'extension' to the 'parser', to provide extra syntax + * rules. + * See the documentation for cmark_syntax_extension for more information. + * + * Returns 'true' if the 'extension' was successfully attached, + * 'false' otherwise. + */ +CMARK_GFM_EXPORT +int cmark_parser_attach_syntax_extension(cmark_parser *parser, cmark_syntax_extension *extension); + +/** Change the type of 'node'. + * + * Return 0 if the type could be changed, 1 otherwise. + */ +CMARK_GFM_EXPORT int cmark_node_set_type(cmark_node *node, cmark_node_type type); + +/** Return the string content for all types of 'node'. + * The pointer stays valid as long as 'node' isn't freed. + */ +CMARK_GFM_EXPORT const char *cmark_node_get_string_content(cmark_node *node); + +/** Set the string 'content' for all types of 'node'. + * Copies 'content'. + */ +CMARK_GFM_EXPORT int cmark_node_set_string_content(cmark_node *node, const char *content); + +/** Get the syntax extension responsible for the creation of 'node'. + * Return NULL if 'node' was created because it matched standard syntax rules. + */ +CMARK_GFM_EXPORT cmark_syntax_extension *cmark_node_get_syntax_extension(cmark_node *node); + +/** Set the syntax extension responsible for creating 'node'. + */ +CMARK_GFM_EXPORT int cmark_node_set_syntax_extension(cmark_node *node, + cmark_syntax_extension *extension); + +/** + * ## Inline syntax extension helpers + * + * The inline parsing process is described in detail at + * + */ + +/** Should return 'true' if the predicate matches 'c', 'false' otherwise + */ +typedef int (*cmark_inline_predicate)(int c); + +/** Advance the current inline parsing offset */ +CMARK_GFM_EXPORT +void cmark_inline_parser_advance_offset(cmark_inline_parser *parser); + +/** Get the current inline parsing offset */ +CMARK_GFM_EXPORT +int cmark_inline_parser_get_offset(cmark_inline_parser *parser); + +/** Set the offset in bytes in the chunk being processed by the given inline parser. + */ +CMARK_GFM_EXPORT +void cmark_inline_parser_set_offset(cmark_inline_parser *parser, int offset); + +/** Gets the cmark_chunk being operated on by the given inline parser. + * Use cmark_inline_parser_get_offset to get our current position in the chunk. + */ +CMARK_GFM_EXPORT +struct cmark_chunk *cmark_inline_parser_get_chunk(cmark_inline_parser *parser); + +/** Returns 1 if the inline parser is currently in a bracket; pass 1 for 'image' + * if you want to know about an image-type bracket, 0 for link-type. */ +CMARK_GFM_EXPORT +int cmark_inline_parser_in_bracket(cmark_inline_parser *parser, int image); + +/** Remove the last n characters from the last child of the given node. + * This only works where all n characters are in the single last child, and the last + * child is CMARK_NODE_TEXT. + */ +CMARK_GFM_EXPORT +void cmark_node_unput(cmark_node *node, int n); + + +/** Get the character located at the current inline parsing offset + */ +CMARK_GFM_EXPORT +unsigned char cmark_inline_parser_peek_char(cmark_inline_parser *parser); + +/** Get the character located 'pos' bytes in the current line. + */ +CMARK_GFM_EXPORT +unsigned char cmark_inline_parser_peek_at(cmark_inline_parser *parser, int pos); + +/** Whether the inline parser has reached the end of the current line + */ +CMARK_GFM_EXPORT +int cmark_inline_parser_is_eof(cmark_inline_parser *parser); + +/** Get the characters located after the current inline parsing offset + * while 'pred' matches. Free after usage. + */ +CMARK_GFM_EXPORT +char *cmark_inline_parser_take_while(cmark_inline_parser *parser, cmark_inline_predicate pred); + +/** Push a delimiter on the delimiter stack. + * See < for + * more information on the parameters + */ +CMARK_GFM_EXPORT +void cmark_inline_parser_push_delimiter(cmark_inline_parser *parser, + unsigned char c, + int can_open, + int can_close, + cmark_node *inl_text); + +/** Remove 'delim' from the delimiter stack + */ +CMARK_GFM_EXPORT +void cmark_inline_parser_remove_delimiter(cmark_inline_parser *parser, delimiter *delim); + +CMARK_GFM_EXPORT +delimiter *cmark_inline_parser_get_last_delimiter(cmark_inline_parser *parser); + +CMARK_GFM_EXPORT +int cmark_inline_parser_get_line(cmark_inline_parser *parser); + +CMARK_GFM_EXPORT +int cmark_inline_parser_get_column(cmark_inline_parser *parser); + +/** Convenience function to scan a given delimiter. + * + * 'left_flanking' and 'right_flanking' will be set to true if they + * respectively precede and follow a non-space, non-punctuation + * character. + * + * Additionally, 'punct_before' and 'punct_after' will respectively be set + * if the preceding or following character is a punctuation character. + * + * Note that 'left_flanking' and 'right_flanking' can both be 'true'. + * + * Returns the number of delimiters encountered, in the limit + * of 'max_delims', and advances the inline parsing offset. + */ +CMARK_GFM_EXPORT +int cmark_inline_parser_scan_delimiters(cmark_inline_parser *parser, + int max_delims, + unsigned char c, + int *left_flanking, + int *right_flanking, + int *punct_before, + int *punct_after); + +CMARK_GFM_EXPORT +void cmark_manage_extensions_special_characters(cmark_parser *parser, int add); + +CMARK_GFM_EXPORT +cmark_llist *cmark_parser_get_syntax_extensions(cmark_parser *parser); + +CMARK_GFM_EXPORT +void cmark_arena_push(void); + +CMARK_GFM_EXPORT +int cmark_arena_pop(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm-extensions_export.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm-extensions_export.h new file mode 100644 index 000000000000..69c0bd787a5e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm-extensions_export.h @@ -0,0 +1,42 @@ + +#ifndef CMARK_GFM_EXTENSIONS_EXPORT_H +#define CMARK_GFM_EXTENSIONS_EXPORT_H + +#ifdef CMARK_GFM_EXTENSIONS_STATIC_DEFINE +# define CMARK_GFM_EXTENSIONS_EXPORT +# define CMARK_GFM_EXTENSIONS_NO_EXPORT +#else +# ifndef CMARK_GFM_EXTENSIONS_EXPORT +# ifdef libcmark_gfm_extensions_EXPORTS + /* We are building this library */ +# define CMARK_GFM_EXTENSIONS_EXPORT __attribute__((visibility("default"))) +# else + /* We are using this library */ +# define CMARK_GFM_EXTENSIONS_EXPORT __attribute__((visibility("default"))) +# endif +# endif + +# ifndef CMARK_GFM_EXTENSIONS_NO_EXPORT +# define CMARK_GFM_EXTENSIONS_NO_EXPORT __attribute__((visibility("hidden"))) +# endif +#endif + +#ifndef CMARK_GFM_EXTENSIONS_DEPRECATED +# define CMARK_GFM_EXTENSIONS_DEPRECATED __attribute__ ((__deprecated__)) +#endif + +#ifndef CMARK_GFM_EXTENSIONS_DEPRECATED_EXPORT +# define CMARK_GFM_EXTENSIONS_DEPRECATED_EXPORT CMARK_GFM_EXTENSIONS_EXPORT CMARK_GFM_EXTENSIONS_DEPRECATED +#endif + +#ifndef CMARK_GFM_EXTENSIONS_DEPRECATED_NO_EXPORT +# define CMARK_GFM_EXTENSIONS_DEPRECATED_NO_EXPORT CMARK_GFM_EXTENSIONS_NO_EXPORT CMARK_GFM_EXTENSIONS_DEPRECATED +#endif + +#if 0 /* DEFINE_NO_DEPRECATED */ +# ifndef CMARK_GFM_EXTENSIONS_NO_DEPRECATED +# define CMARK_GFM_EXTENSIONS_NO_DEPRECATED +# endif +#endif + +#endif /* CMARK_GFM_EXTENSIONS_EXPORT_H */ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm.h new file mode 100644 index 000000000000..a26f640ef375 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm.h @@ -0,0 +1,803 @@ +#ifndef CMARK_GFM_H +#define CMARK_GFM_H + +#include +#include +#include "cmark-gfm_export.h" +#include "cmark-gfm_version.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** # NAME + * + * **cmark-gfm** - CommonMark parsing, manipulating, and rendering + */ + +/** # DESCRIPTION + * + * ## Simple Interface + */ + +/** Convert 'text' (assumed to be a UTF-8 encoded string with length + * 'len') from CommonMark Markdown to HTML, returning a null-terminated, + * UTF-8-encoded string. It is the caller's responsibility + * to free the returned buffer. + */ +CMARK_GFM_EXPORT +char *cmark_markdown_to_html(const char *text, size_t len, int options); + +/** ## Node Structure + */ + +#define CMARK_NODE_TYPE_PRESENT (0x8000) +#define CMARK_NODE_TYPE_BLOCK (CMARK_NODE_TYPE_PRESENT | 0x0000) +#define CMARK_NODE_TYPE_INLINE (CMARK_NODE_TYPE_PRESENT | 0x4000) +#define CMARK_NODE_TYPE_MASK (0xc000) +#define CMARK_NODE_VALUE_MASK (0x3fff) + +typedef enum { + /* Error status */ + CMARK_NODE_NONE = 0x0000, + + /* Block */ + CMARK_NODE_DOCUMENT = CMARK_NODE_TYPE_BLOCK | 0x0001, + CMARK_NODE_BLOCK_QUOTE = CMARK_NODE_TYPE_BLOCK | 0x0002, + CMARK_NODE_LIST = CMARK_NODE_TYPE_BLOCK | 0x0003, + CMARK_NODE_ITEM = CMARK_NODE_TYPE_BLOCK | 0x0004, + CMARK_NODE_CODE_BLOCK = CMARK_NODE_TYPE_BLOCK | 0x0005, + CMARK_NODE_HTML_BLOCK = CMARK_NODE_TYPE_BLOCK | 0x0006, + CMARK_NODE_CUSTOM_BLOCK = CMARK_NODE_TYPE_BLOCK | 0x0007, + CMARK_NODE_PARAGRAPH = CMARK_NODE_TYPE_BLOCK | 0x0008, + CMARK_NODE_HEADING = CMARK_NODE_TYPE_BLOCK | 0x0009, + CMARK_NODE_THEMATIC_BREAK = CMARK_NODE_TYPE_BLOCK | 0x000a, + CMARK_NODE_FOOTNOTE_DEFINITION = CMARK_NODE_TYPE_BLOCK | 0x000b, + + /* Inline */ + CMARK_NODE_TEXT = CMARK_NODE_TYPE_INLINE | 0x0001, + CMARK_NODE_SOFTBREAK = CMARK_NODE_TYPE_INLINE | 0x0002, + CMARK_NODE_LINEBREAK = CMARK_NODE_TYPE_INLINE | 0x0003, + CMARK_NODE_CODE = CMARK_NODE_TYPE_INLINE | 0x0004, + CMARK_NODE_HTML_INLINE = CMARK_NODE_TYPE_INLINE | 0x0005, + CMARK_NODE_CUSTOM_INLINE = CMARK_NODE_TYPE_INLINE | 0x0006, + CMARK_NODE_EMPH = CMARK_NODE_TYPE_INLINE | 0x0007, + CMARK_NODE_STRONG = CMARK_NODE_TYPE_INLINE | 0x0008, + CMARK_NODE_LINK = CMARK_NODE_TYPE_INLINE | 0x0009, + CMARK_NODE_IMAGE = CMARK_NODE_TYPE_INLINE | 0x000a, + CMARK_NODE_FOOTNOTE_REFERENCE = CMARK_NODE_TYPE_INLINE | 0x000b, +} cmark_node_type; + +extern cmark_node_type CMARK_NODE_LAST_BLOCK; +extern cmark_node_type CMARK_NODE_LAST_INLINE; + +/* For backwards compatibility: */ +#define CMARK_NODE_HEADER CMARK_NODE_HEADING +#define CMARK_NODE_HRULE CMARK_NODE_THEMATIC_BREAK +#define CMARK_NODE_HTML CMARK_NODE_HTML_BLOCK +#define CMARK_NODE_INLINE_HTML CMARK_NODE_HTML_INLINE + +typedef enum { + CMARK_NO_LIST, + CMARK_BULLET_LIST, + CMARK_ORDERED_LIST +} cmark_list_type; + +typedef enum { + CMARK_NO_DELIM, + CMARK_PERIOD_DELIM, + CMARK_PAREN_DELIM +} cmark_delim_type; + +typedef struct cmark_node cmark_node; +typedef struct cmark_parser cmark_parser; +typedef struct cmark_iter cmark_iter; + +/** + * ## Custom memory allocator support + */ + +/** Defines the memory allocation functions to be used by CMark + * when parsing and allocating a document tree + */ +typedef struct cmark_mem { + void *(*calloc)(size_t, size_t); + void *(*realloc)(void *, size_t); + void (*free)(void *); +} cmark_mem; + +/** The default memory allocator; uses the system's calloc, + * realloc and free. + */ +CMARK_GFM_EXPORT +cmark_mem *cmark_get_default_mem_allocator(); + +/** An arena allocator; uses system calloc to allocate large + * slabs of memory. Memory in these slabs is not reused at all. + */ +CMARK_GFM_EXPORT +cmark_mem *cmark_get_arena_mem_allocator(); + +/** Resets the arena allocator, quickly returning all used memory + * to the operating system. + */ +CMARK_GFM_EXPORT +void cmark_arena_reset(void); + +/** Callback for freeing user data with a 'cmark_mem' context. + */ +typedef void (*cmark_free_func) (cmark_mem *mem, void *user_data); + + +/* + * ## Basic data structures + * + * To keep dependencies to the strict minimum, libcmark implements + * its own versions of "classic" data structures. + */ + +/** + * ### Linked list + */ + +/** A generic singly linked list. + */ +typedef struct _cmark_llist +{ + struct _cmark_llist *next; + void *data; +} cmark_llist; + +/** Append an element to the linked list, return the possibly modified + * head of the list. + */ +CMARK_GFM_EXPORT +cmark_llist * cmark_llist_append (cmark_mem * mem, + cmark_llist * head, + void * data); + +/** Free the list starting with 'head', calling 'free_func' with the + * data pointer of each of its elements + */ +CMARK_GFM_EXPORT +void cmark_llist_free_full (cmark_mem * mem, + cmark_llist * head, + cmark_free_func free_func); + +/** Free the list starting with 'head' + */ +CMARK_GFM_EXPORT +void cmark_llist_free (cmark_mem * mem, + cmark_llist * head); + +/** + * ## Creating and Destroying Nodes + */ + +/** Creates a new node of type 'type'. Note that the node may have + * other required properties, which it is the caller's responsibility + * to assign. + */ +CMARK_GFM_EXPORT cmark_node *cmark_node_new(cmark_node_type type); + +/** Same as `cmark_node_new`, but explicitly listing the memory + * allocator used to allocate the node. Note: be sure to use the same + * allocator for every node in a tree, or bad things can happen. + */ +CMARK_GFM_EXPORT cmark_node *cmark_node_new_with_mem(cmark_node_type type, + cmark_mem *mem); + +/** Frees the memory allocated for a node and any children. + */ +CMARK_GFM_EXPORT void cmark_node_free(cmark_node *node); + +/** + * ## Tree Traversal + */ + +/** Returns the next node in the sequence after 'node', or NULL if + * there is none. + */ +CMARK_GFM_EXPORT cmark_node *cmark_node_next(cmark_node *node); + +/** Returns the previous node in the sequence after 'node', or NULL if + * there is none. + */ +CMARK_GFM_EXPORT cmark_node *cmark_node_previous(cmark_node *node); + +/** Returns the parent of 'node', or NULL if there is none. + */ +CMARK_GFM_EXPORT cmark_node *cmark_node_parent(cmark_node *node); + +/** Returns the first child of 'node', or NULL if 'node' has no children. + */ +CMARK_GFM_EXPORT cmark_node *cmark_node_first_child(cmark_node *node); + +/** Returns the last child of 'node', or NULL if 'node' has no children. + */ +CMARK_GFM_EXPORT cmark_node *cmark_node_last_child(cmark_node *node); + +/** + * ## Iterator + * + * An iterator will walk through a tree of nodes, starting from a root + * node, returning one node at a time, together with information about + * whether the node is being entered or exited. The iterator will + * first descend to a child node, if there is one. When there is no + * child, the iterator will go to the next sibling. When there is no + * next sibling, the iterator will return to the parent (but with + * a 'cmark_event_type' of `CMARK_EVENT_EXIT`). The iterator will + * return `CMARK_EVENT_DONE` when it reaches the root node again. + * One natural application is an HTML renderer, where an `ENTER` event + * outputs an open tag and an `EXIT` event outputs a close tag. + * An iterator might also be used to transform an AST in some systematic + * way, for example, turning all level-3 headings into regular paragraphs. + * + * void + * usage_example(cmark_node *root) { + * cmark_event_type ev_type; + * cmark_iter *iter = cmark_iter_new(root); + * + * while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + * cmark_node *cur = cmark_iter_get_node(iter); + * // Do something with `cur` and `ev_type` + * } + * + * cmark_iter_free(iter); + * } + * + * Iterators will never return `EXIT` events for leaf nodes, which are nodes + * of type: + * + * * CMARK_NODE_HTML_BLOCK + * * CMARK_NODE_THEMATIC_BREAK + * * CMARK_NODE_CODE_BLOCK + * * CMARK_NODE_TEXT + * * CMARK_NODE_SOFTBREAK + * * CMARK_NODE_LINEBREAK + * * CMARK_NODE_CODE + * * CMARK_NODE_HTML_INLINE + * + * Nodes must only be modified after an `EXIT` event, or an `ENTER` event for + * leaf nodes. + */ + +typedef enum { + CMARK_EVENT_NONE, + CMARK_EVENT_DONE, + CMARK_EVENT_ENTER, + CMARK_EVENT_EXIT +} cmark_event_type; + +/** Creates a new iterator starting at 'root'. The current node and event + * type are undefined until 'cmark_iter_next' is called for the first time. + * The memory allocated for the iterator should be released using + * 'cmark_iter_free' when it is no longer needed. + */ +CMARK_GFM_EXPORT +cmark_iter *cmark_iter_new(cmark_node *root); + +/** Frees the memory allocated for an iterator. + */ +CMARK_GFM_EXPORT +void cmark_iter_free(cmark_iter *iter); + +/** Advances to the next node and returns the event type (`CMARK_EVENT_ENTER`, + * `CMARK_EVENT_EXIT` or `CMARK_EVENT_DONE`). + */ +CMARK_GFM_EXPORT +cmark_event_type cmark_iter_next(cmark_iter *iter); + +/** Returns the current node. + */ +CMARK_GFM_EXPORT +cmark_node *cmark_iter_get_node(cmark_iter *iter); + +/** Returns the current event type. + */ +CMARK_GFM_EXPORT +cmark_event_type cmark_iter_get_event_type(cmark_iter *iter); + +/** Returns the root node. + */ +CMARK_GFM_EXPORT +cmark_node *cmark_iter_get_root(cmark_iter *iter); + +/** Resets the iterator so that the current node is 'current' and + * the event type is 'event_type'. The new current node must be a + * descendant of the root node or the root node itself. + */ +CMARK_GFM_EXPORT +void cmark_iter_reset(cmark_iter *iter, cmark_node *current, + cmark_event_type event_type); + +/** + * ## Accessors + */ + +/** Returns the user data of 'node'. + */ +CMARK_GFM_EXPORT void *cmark_node_get_user_data(cmark_node *node); + +/** Sets arbitrary user data for 'node'. Returns 1 on success, + * 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_set_user_data(cmark_node *node, void *user_data); + +/** Set free function for user data */ +CMARK_GFM_EXPORT +int cmark_node_set_user_data_free_func(cmark_node *node, + cmark_free_func free_func); + +/** Returns the type of 'node', or `CMARK_NODE_NONE` on error. + */ +CMARK_GFM_EXPORT cmark_node_type cmark_node_get_type(cmark_node *node); + +/** Like 'cmark_node_get_type', but returns a string representation + of the type, or `""`. + */ +CMARK_GFM_EXPORT +const char *cmark_node_get_type_string(cmark_node *node); + +/** Returns the string contents of 'node', or an empty + string if none is set. Returns NULL if called on a + node that does not have string content. + */ +CMARK_GFM_EXPORT const char *cmark_node_get_literal(cmark_node *node); + +/** Sets the string contents of 'node'. Returns 1 on success, + * 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_set_literal(cmark_node *node, const char *content); + +/** Returns the heading level of 'node', or 0 if 'node' is not a heading. + */ +CMARK_GFM_EXPORT int cmark_node_get_heading_level(cmark_node *node); + +/* For backwards compatibility */ +#define cmark_node_get_header_level cmark_node_get_heading_level +#define cmark_node_set_header_level cmark_node_set_heading_level + +/** Sets the heading level of 'node', returning 1 on success and 0 on error. + */ +CMARK_GFM_EXPORT int cmark_node_set_heading_level(cmark_node *node, int level); + +/** Returns the list type of 'node', or `CMARK_NO_LIST` if 'node' + * is not a list. + */ +CMARK_GFM_EXPORT cmark_list_type cmark_node_get_list_type(cmark_node *node); + +/** Sets the list type of 'node', returning 1 on success and 0 on error. + */ +CMARK_GFM_EXPORT int cmark_node_set_list_type(cmark_node *node, + cmark_list_type type); + +/** Returns the list delimiter type of 'node', or `CMARK_NO_DELIM` if 'node' + * is not a list. + */ +CMARK_GFM_EXPORT cmark_delim_type cmark_node_get_list_delim(cmark_node *node); + +/** Sets the list delimiter type of 'node', returning 1 on success and 0 + * on error. + */ +CMARK_GFM_EXPORT int cmark_node_set_list_delim(cmark_node *node, + cmark_delim_type delim); + +/** Returns starting number of 'node', if it is an ordered list, otherwise 0. + */ +CMARK_GFM_EXPORT int cmark_node_get_list_start(cmark_node *node); + +/** Sets starting number of 'node', if it is an ordered list. Returns 1 + * on success, 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_set_list_start(cmark_node *node, int start); + +/** Returns 1 if 'node' is a tight list, 0 otherwise. + */ +CMARK_GFM_EXPORT int cmark_node_get_list_tight(cmark_node *node); + +/** Sets the "tightness" of a list. Returns 1 on success, 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_set_list_tight(cmark_node *node, int tight); + +/** Returns the info string from a fenced code block. + */ +CMARK_GFM_EXPORT const char *cmark_node_get_fence_info(cmark_node *node); + +/** Sets the info string in a fenced code block, returning 1 on + * success and 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_set_fence_info(cmark_node *node, const char *info); + +/** Sets code blocks fencing details + */ +CMARK_GFM_EXPORT int cmark_node_set_fenced(cmark_node * node, int fenced, + int length, int offset, char character); + +/** Returns code blocks fencing details + */ +CMARK_GFM_EXPORT int cmark_node_get_fenced(cmark_node *node, int *length, int *offset, char *character); + +/** Returns the URL of a link or image 'node', or an empty string + if no URL is set. Returns NULL if called on a node that is + not a link or image. + */ +CMARK_GFM_EXPORT const char *cmark_node_get_url(cmark_node *node); + +/** Sets the URL of a link or image 'node'. Returns 1 on success, + * 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_set_url(cmark_node *node, const char *url); + +/** Returns the title of a link or image 'node', or an empty + string if no title is set. Returns NULL if called on a node + that is not a link or image. + */ +CMARK_GFM_EXPORT const char *cmark_node_get_title(cmark_node *node); + +/** Sets the title of a link or image 'node'. Returns 1 on success, + * 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_set_title(cmark_node *node, const char *title); + +/** Returns the literal "on enter" text for a custom 'node', or + an empty string if no on_enter is set. Returns NULL if called + on a non-custom node. + */ +CMARK_GFM_EXPORT const char *cmark_node_get_on_enter(cmark_node *node); + +/** Sets the literal text to render "on enter" for a custom 'node'. + Any children of the node will be rendered after this text. + Returns 1 on success 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_set_on_enter(cmark_node *node, + const char *on_enter); + +/** Returns the literal "on exit" text for a custom 'node', or + an empty string if no on_exit is set. Returns NULL if + called on a non-custom node. + */ +CMARK_GFM_EXPORT const char *cmark_node_get_on_exit(cmark_node *node); + +/** Sets the literal text to render "on exit" for a custom 'node'. + Any children of the node will be rendered before this text. + Returns 1 on success 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_set_on_exit(cmark_node *node, const char *on_exit); + +/** Returns the line on which 'node' begins. + */ +CMARK_GFM_EXPORT int cmark_node_get_start_line(cmark_node *node); + +/** Returns the column at which 'node' begins. + */ +CMARK_GFM_EXPORT int cmark_node_get_start_column(cmark_node *node); + +/** Returns the line on which 'node' ends. + */ +CMARK_GFM_EXPORT int cmark_node_get_end_line(cmark_node *node); + +/** Returns the column at which 'node' ends. + */ +CMARK_GFM_EXPORT int cmark_node_get_end_column(cmark_node *node); + +/** + * ## Tree Manipulation + */ + +/** Unlinks a 'node', removing it from the tree, but not freeing its + * memory. (Use 'cmark_node_free' for that.) + */ +CMARK_GFM_EXPORT void cmark_node_unlink(cmark_node *node); + +/** Inserts 'sibling' before 'node'. Returns 1 on success, 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_insert_before(cmark_node *node, + cmark_node *sibling); + +/** Inserts 'sibling' after 'node'. Returns 1 on success, 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_insert_after(cmark_node *node, cmark_node *sibling); + +/** Replaces 'oldnode' with 'newnode' and unlinks 'oldnode' (but does + * not free its memory). + * Returns 1 on success, 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_replace(cmark_node *oldnode, cmark_node *newnode); + +/** Adds 'child' to the beginning of the children of 'node'. + * Returns 1 on success, 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_prepend_child(cmark_node *node, cmark_node *child); + +/** Adds 'child' to the end of the children of 'node'. + * Returns 1 on success, 0 on failure. + */ +CMARK_GFM_EXPORT int cmark_node_append_child(cmark_node *node, cmark_node *child); + +/** Consolidates adjacent text nodes. + */ +CMARK_GFM_EXPORT void cmark_consolidate_text_nodes(cmark_node *root); + +/** Ensures a node and all its children own their own chunk memory. + */ +CMARK_GFM_EXPORT void cmark_node_own(cmark_node *root); + +/** + * ## Parsing + * + * Simple interface: + * + * cmark_node *document = cmark_parse_document("Hello *world*", 13, + * CMARK_OPT_DEFAULT); + * + * Streaming interface: + * + * cmark_parser *parser = cmark_parser_new(CMARK_OPT_DEFAULT); + * FILE *fp = fopen("myfile.md", "rb"); + * while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) { + * cmark_parser_feed(parser, buffer, bytes); + * if (bytes < sizeof(buffer)) { + * break; + * } + * } + * document = cmark_parser_finish(parser); + * cmark_parser_free(parser); + */ + +/** Creates a new parser object. + */ +CMARK_GFM_EXPORT +cmark_parser *cmark_parser_new(int options); + +/** Creates a new parser object with the given memory allocator + */ +CMARK_GFM_EXPORT +cmark_parser *cmark_parser_new_with_mem(int options, cmark_mem *mem); + +/** Frees memory allocated for a parser object. + */ +CMARK_GFM_EXPORT +void cmark_parser_free(cmark_parser *parser); + +/** Feeds a string of length 'len' to 'parser'. + */ +CMARK_GFM_EXPORT +void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len); + +/** Finish parsing and return a pointer to a tree of nodes. + */ +CMARK_GFM_EXPORT +cmark_node *cmark_parser_finish(cmark_parser *parser); + +/** Parse a CommonMark document in 'buffer' of length 'len'. + * Returns a pointer to a tree of nodes. The memory allocated for + * the node tree should be released using 'cmark_node_free' + * when it is no longer needed. + */ +CMARK_GFM_EXPORT +cmark_node *cmark_parse_document(const char *buffer, size_t len, int options); + +/** Parse a CommonMark document in file 'f', returning a pointer to + * a tree of nodes. The memory allocated for the node tree should be + * released using 'cmark_node_free' when it is no longer needed. + */ +CMARK_GFM_EXPORT +cmark_node *cmark_parse_file(FILE *f, int options); + +/** + * ## Rendering + */ + +/** Render a 'node' tree as XML. It is the caller's responsibility + * to free the returned buffer. + */ +CMARK_GFM_EXPORT +char *cmark_render_xml(cmark_node *root, int options); + +/** As for 'cmark_render_xml', but specifying the allocator to use for + * the resulting string. + */ +CMARK_GFM_EXPORT +char *cmark_render_xml_with_mem(cmark_node *root, int options, cmark_mem *mem); + +/** Render a 'node' tree as an HTML fragment. It is up to the user + * to add an appropriate header and footer. It is the caller's + * responsibility to free the returned buffer. + */ +CMARK_GFM_EXPORT +char *cmark_render_html(cmark_node *root, int options, cmark_llist *extensions); + +/** As for 'cmark_render_html', but specifying the allocator to use for + * the resulting string. + */ +CMARK_GFM_EXPORT +char *cmark_render_html_with_mem(cmark_node *root, int options, cmark_llist *extensions, cmark_mem *mem); + +/** Render a 'node' tree as a groff man page, without the header. + * It is the caller's responsibility to free the returned buffer. + */ +CMARK_GFM_EXPORT +char *cmark_render_man(cmark_node *root, int options, int width); + +/** As for 'cmark_render_man', but specifying the allocator to use for + * the resulting string. + */ +CMARK_GFM_EXPORT +char *cmark_render_man_with_mem(cmark_node *root, int options, int width, cmark_mem *mem); + +/** Render a 'node' tree as a commonmark document. + * It is the caller's responsibility to free the returned buffer. + */ +CMARK_GFM_EXPORT +char *cmark_render_commonmark(cmark_node *root, int options, int width); + +/** As for 'cmark_render_commonmark', but specifying the allocator to use for + * the resulting string. + */ +CMARK_GFM_EXPORT +char *cmark_render_commonmark_with_mem(cmark_node *root, int options, int width, cmark_mem *mem); + +/** Render a 'node' tree as a plain text document. + * It is the caller's responsibility to free the returned buffer. + */ +CMARK_GFM_EXPORT +char *cmark_render_plaintext(cmark_node *root, int options, int width); + +/** As for 'cmark_render_plaintext', but specifying the allocator to use for + * the resulting string. + */ +CMARK_GFM_EXPORT +char *cmark_render_plaintext_with_mem(cmark_node *root, int options, int width, cmark_mem *mem); + +/** Render a 'node' tree as a LaTeX document. + * It is the caller's responsibility to free the returned buffer. + */ +CMARK_GFM_EXPORT +char *cmark_render_latex(cmark_node *root, int options, int width); + +/** As for 'cmark_render_latex', but specifying the allocator to use for + * the resulting string. + */ +CMARK_GFM_EXPORT +char *cmark_render_latex_with_mem(cmark_node *root, int options, int width, cmark_mem *mem); + +/** + * ## Options + */ + +/** Default options. + */ +#define CMARK_OPT_DEFAULT 0 + +/** + * ### Options affecting rendering + */ + +/** Include a `data-sourcepos` attribute on all block elements. + */ +#define CMARK_OPT_SOURCEPOS (1 << 1) + +/** Render `softbreak` elements as hard line breaks. + */ +#define CMARK_OPT_HARDBREAKS (1 << 2) + +/** Suppress raw HTML and unsafe links (`javascript:`, `vbscript:`, + * `file:`, and `data:`, except for `image/png`, `image/gif`, + * `image/jpeg`, or `image/webp` mime types). Raw HTML is replaced + * by a placeholder HTML comment. Unsafe links are replaced by + * empty strings. + */ +#define CMARK_OPT_SAFE (1 << 3) + +/** Render `softbreak` elements as spaces. + */ +#define CMARK_OPT_NOBREAKS (1 << 4) + +/** + * ### Options affecting parsing + */ + +/** Legacy option (no effect). + */ +#define CMARK_OPT_NORMALIZE (1 << 8) + +/** Validate UTF-8 in the input before parsing, replacing illegal + * sequences with the replacement character U+FFFD. + */ +#define CMARK_OPT_VALIDATE_UTF8 (1 << 9) + +/** Convert straight quotes to curly, --- to em dashes, -- to en dashes. + */ +#define CMARK_OPT_SMART (1 << 10) + +/** Use GitHub-style
 tags for code blocks instead of 
.
+ */
+#define CMARK_OPT_GITHUB_PRE_LANG (1 << 11)
+
+/** Be liberal in interpreting inline HTML tags.
+ */
+#define CMARK_OPT_LIBERAL_HTML_TAG (1 << 12)
+
+/** Parse footnotes.
+ */
+#define CMARK_OPT_FOOTNOTES (1 << 13)
+
+/** Only parse strikethroughs if surrounded by exactly 2 tildes.
+ * Gives some compatibility with redcarpet.
+ */
+#define CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE (1 << 14)
+
+/** Use style attributes to align table cells instead of align attributes.
+ */
+#define CMARK_OPT_TABLE_PREFER_STYLE_ATTRIBUTES (1 << 15)
+
+/** Include the remainder of the info string in code blocks in
+ * a separate attribute.
+ */
+#define CMARK_OPT_FULL_INFO_STRING (1 << 16)
+
+/**
+ * ## Version information
+ */
+
+/** The library version as integer for runtime checks. Also available as
+ * macro CMARK_VERSION for compile time checks.
+ *
+ * * Bits 16-23 contain the major version.
+ * * Bits 8-15 contain the minor version.
+ * * Bits 0-7 contain the patchlevel.
+ *
+ * In hexadecimal format, the number 0x010203 represents version 1.2.3.
+ */
+CMARK_GFM_EXPORT
+int cmark_version(void);
+
+/** The library version string for runtime checks. Also available as
+ * macro CMARK_VERSION_STRING for compile time checks.
+ */
+CMARK_GFM_EXPORT
+const char *cmark_version_string(void);
+
+/** # AUTHORS
+ *
+ * John MacFarlane, Vicent Marti,  Kārlis Gaņģis, Nick Wellnhofer.
+ */
+
+#ifndef CMARK_NO_SHORT_NAMES
+#define NODE_DOCUMENT CMARK_NODE_DOCUMENT
+#define NODE_BLOCK_QUOTE CMARK_NODE_BLOCK_QUOTE
+#define NODE_LIST CMARK_NODE_LIST
+#define NODE_ITEM CMARK_NODE_ITEM
+#define NODE_CODE_BLOCK CMARK_NODE_CODE_BLOCK
+#define NODE_HTML_BLOCK CMARK_NODE_HTML_BLOCK
+#define NODE_CUSTOM_BLOCK CMARK_NODE_CUSTOM_BLOCK
+#define NODE_PARAGRAPH CMARK_NODE_PARAGRAPH
+#define NODE_HEADING CMARK_NODE_HEADING
+#define NODE_HEADER CMARK_NODE_HEADER
+#define NODE_THEMATIC_BREAK CMARK_NODE_THEMATIC_BREAK
+#define NODE_HRULE CMARK_NODE_HRULE
+#define NODE_TEXT CMARK_NODE_TEXT
+#define NODE_SOFTBREAK CMARK_NODE_SOFTBREAK
+#define NODE_LINEBREAK CMARK_NODE_LINEBREAK
+#define NODE_CODE CMARK_NODE_CODE
+#define NODE_HTML_INLINE CMARK_NODE_HTML_INLINE
+#define NODE_CUSTOM_INLINE CMARK_NODE_CUSTOM_INLINE
+#define NODE_EMPH CMARK_NODE_EMPH
+#define NODE_STRONG CMARK_NODE_STRONG
+#define NODE_LINK CMARK_NODE_LINK
+#define NODE_IMAGE CMARK_NODE_IMAGE
+#define BULLET_LIST CMARK_BULLET_LIST
+#define ORDERED_LIST CMARK_ORDERED_LIST
+#define PERIOD_DELIM CMARK_PERIOD_DELIM
+#define PAREN_DELIM CMARK_PAREN_DELIM
+#endif
+
+typedef int32_t bufsize_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm_export.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm_export.h
new file mode 100644
index 000000000000..699d737f722d
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm_export.h
@@ -0,0 +1,42 @@
+
+#ifndef CMARK_GFM_EXPORT_H
+#define CMARK_GFM_EXPORT_H
+
+#ifdef CMARK_GFM_STATIC_DEFINE
+#  define CMARK_GFM_EXPORT
+#  define CMARK_GFM_NO_EXPORT
+#else
+#  ifndef CMARK_GFM_EXPORT
+#    ifdef libcmark_gfm_EXPORTS
+        /* We are building this library */
+#      define CMARK_GFM_EXPORT __attribute__((visibility("default")))
+#    else
+        /* We are using this library */
+#      define CMARK_GFM_EXPORT __attribute__((visibility("default")))
+#    endif
+#  endif
+
+#  ifndef CMARK_GFM_NO_EXPORT
+#    define CMARK_GFM_NO_EXPORT __attribute__((visibility("hidden")))
+#  endif
+#endif
+
+#ifndef CMARK_GFM_DEPRECATED
+#  define CMARK_GFM_DEPRECATED __attribute__ ((__deprecated__))
+#endif
+
+#ifndef CMARK_GFM_DEPRECATED_EXPORT
+#  define CMARK_GFM_DEPRECATED_EXPORT CMARK_GFM_EXPORT CMARK_GFM_DEPRECATED
+#endif
+
+#ifndef CMARK_GFM_DEPRECATED_NO_EXPORT
+#  define CMARK_GFM_DEPRECATED_NO_EXPORT CMARK_GFM_NO_EXPORT CMARK_GFM_DEPRECATED
+#endif
+
+#if 0 /* DEFINE_NO_DEPRECATED */
+#  ifndef CMARK_GFM_NO_DEPRECATED
+#    define CMARK_GFM_NO_DEPRECATED
+#  endif
+#endif
+
+#endif /* CMARK_GFM_EXPORT_H */
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm_version.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm_version.h
new file mode 100644
index 000000000000..03db40df3e71
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark-gfm_version.h
@@ -0,0 +1,7 @@
+#ifndef CMARK_GFM_VERSION_H
+#define CMARK_GFM_VERSION_H
+
+#define CMARK_GFM_VERSION ((0 << 24) | (28 << 16) | (3 << 8) | 16)
+#define CMARK_GFM_VERSION_STRING "0.28.3.gfm.16"
+
+#endif
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark.c
new file mode 100644
index 000000000000..b3fad4b08441
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark.c
@@ -0,0 +1,55 @@
+#include 
+#include 
+#include 
+#include "registry.h"
+#include "node.h"
+#include "houdini.h"
+#include "cmark-gfm.h"
+#include "buffer.h"
+
+cmark_node_type CMARK_NODE_LAST_BLOCK = CMARK_NODE_FOOTNOTE_DEFINITION;
+cmark_node_type CMARK_NODE_LAST_INLINE = CMARK_NODE_FOOTNOTE_REFERENCE;
+
+int cmark_version() { return CMARK_GFM_VERSION; }
+
+const char *cmark_version_string() { return CMARK_GFM_VERSION_STRING; }
+
+static void *xcalloc(size_t nmem, size_t size) {
+  void *ptr = calloc(nmem, size);
+  if (!ptr) {
+    fprintf(stderr, "[cmark] calloc returned null pointer, aborting\n");
+    abort();
+  }
+  return ptr;
+}
+
+static void *xrealloc(void *ptr, size_t size) {
+  void *new_ptr = realloc(ptr, size);
+  if (!new_ptr) {
+    fprintf(stderr, "[cmark] realloc returned null pointer, aborting\n");
+    abort();
+  }
+  return new_ptr;
+}
+
+static void xfree(void *ptr) {
+  free(ptr);
+}
+
+cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR = {xcalloc, xrealloc, xfree};
+
+cmark_mem *cmark_get_default_mem_allocator() {
+  return &CMARK_DEFAULT_MEM_ALLOCATOR;
+}
+
+char *cmark_markdown_to_html(const char *text, size_t len, int options) {
+  cmark_node *doc;
+  char *result;
+
+  doc = cmark_parse_document(text, len, options);
+
+  result = cmark_render_html(doc, options, NULL);
+  cmark_node_free(doc);
+
+  return result;
+}
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark.o
new file mode 100644
index 000000000000..486ec265181d
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark_ctype.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark_ctype.c
new file mode 100644
index 000000000000..c0c4d5b037b7
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark_ctype.c
@@ -0,0 +1,44 @@
+#include 
+
+#include "cmark_ctype.h"
+
+/** 1 = space, 2 = punct, 3 = digit, 4 = alpha, 0 = other
+ */
+static const uint8_t cmark_ctype_class[256] = {
+    /*      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f */
+    /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
+    /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    /* 2 */ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    /* 3 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2,
+    /* 4 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    /* 5 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2,
+    /* 6 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    /* 7 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0,
+    /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    /* c */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    /* d */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    /* e */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    /* f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+/**
+ * Returns 1 if c is a "whitespace" character as defined by the spec.
+ */
+int cmark_isspace(char c) { return cmark_ctype_class[(uint8_t)c] == 1; }
+
+/**
+ * Returns 1 if c is an ascii punctuation character.
+ */
+int cmark_ispunct(char c) { return cmark_ctype_class[(uint8_t)c] == 2; }
+
+int cmark_isalnum(char c) {
+  uint8_t result;
+  result = cmark_ctype_class[(uint8_t)c];
+  return (result == 3 || result == 4);
+}
+
+int cmark_isdigit(char c) { return cmark_ctype_class[(uint8_t)c] == 3; }
+
+int cmark_isalpha(char c) { return cmark_ctype_class[(uint8_t)c] == 4; }
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark_ctype.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark_ctype.h
new file mode 100644
index 000000000000..67c1cb037e3c
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark_ctype.h
@@ -0,0 +1,33 @@
+#ifndef CMARK_CMARK_CTYPE_H
+#define CMARK_CMARK_CTYPE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmark-gfm_export.h"
+
+/** Locale-independent versions of functions from ctype.h.
+ * We want cmark to behave the same no matter what the system locale.
+ */
+
+CMARK_GFM_EXPORT
+int cmark_isspace(char c);
+
+CMARK_GFM_EXPORT
+int cmark_ispunct(char c);
+
+CMARK_GFM_EXPORT
+int cmark_isalnum(char c);
+
+CMARK_GFM_EXPORT
+int cmark_isdigit(char c);
+
+CMARK_GFM_EXPORT
+int cmark_isalpha(char c);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark_ctype.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark_ctype.o
new file mode 100644
index 000000000000..4babcba3025f
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/cmark_ctype.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmark.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmark.c
new file mode 100644
index 000000000000..9943e4c53d9f
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmark.c
@@ -0,0 +1,508 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "config.h"
+#include "cmark-gfm.h"
+#include "node.h"
+#include "buffer.h"
+#include "utf8.h"
+#include "scanners.h"
+#include "render.h"
+#include "syntax_extension.h"
+
+#define OUT(s, wrap, escaping) renderer->out(renderer, node, s, wrap, escaping)
+#define LIT(s) renderer->out(renderer, node, s, false, LITERAL)
+#define CR() renderer->cr(renderer)
+#define BLANKLINE() renderer->blankline(renderer)
+#define ENCODED_SIZE 20
+#define LISTMARKER_SIZE 20
+
+// Functions to convert cmark_nodes to commonmark strings.
+
+static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_node *node, 
+                              cmark_escaping escape,
+                              int32_t c, unsigned char nextc) {
+  bool needs_escaping = false;
+  bool follows_digit =
+      renderer->buffer->size > 0 &&
+      cmark_isdigit(renderer->buffer->ptr[renderer->buffer->size - 1]);
+  char encoded[ENCODED_SIZE];
+
+  needs_escaping =
+      c < 0x80 && escape != LITERAL &&
+      ((escape == NORMAL &&
+        (c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
+         c == '>' || c == '\\' || c == '`' || c == '~' || c == '!' ||
+         (c == '&' && cmark_isalpha(nextc)) || (c == '!' && nextc == '[') ||
+         (renderer->begin_content && (c == '-' || c == '+' || c == '=') &&
+          // begin_content doesn't get set to false til we've passed digits
+          // at the beginning of line, so...
+          !follows_digit) ||
+         (renderer->begin_content && (c == '.' || c == ')') && follows_digit &&
+          (nextc == 0 || cmark_isspace(nextc))))) ||
+       (escape == URL &&
+        (c == '`' || c == '<' || c == '>' || cmark_isspace((char)c) || c == '\\' ||
+         c == ')' || c == '(')) ||
+       (escape == TITLE &&
+        (c == '`' || c == '<' || c == '>' || c == '"' || c == '\\')));
+
+  if (needs_escaping) {
+    if (cmark_isspace((char)c)) {
+      // use percent encoding for spaces
+      snprintf(encoded, ENCODED_SIZE, "%%%2x", c);
+      cmark_strbuf_puts(renderer->buffer, encoded);
+      renderer->column += 3;
+    } else {
+      cmark_render_ascii(renderer, "\\");
+      cmark_render_code_point(renderer, c);
+    }
+  } else {
+    cmark_render_code_point(renderer, c);
+  }
+}
+
+static int longest_backtick_sequence(const char *code) {
+  int longest = 0;
+  int current = 0;
+  size_t i = 0;
+  size_t code_len = strlen(code);
+  while (i <= code_len) {
+    if (code[i] == '`') {
+      current++;
+    } else {
+      if (current > longest) {
+        longest = current;
+      }
+      current = 0;
+    }
+    i++;
+  }
+  return longest;
+}
+
+static int shortest_unused_backtick_sequence(const char *code) {
+  // note: if the shortest sequence is >= 32, this returns 32
+  // so as not to overflow the bit array.
+  uint32_t used = 1;
+  int current = 0;
+  size_t i = 0;
+  size_t code_len = strlen(code);
+  while (i <= code_len) {
+    if (code[i] == '`') {
+      current++;
+    } else {
+      if (current > 0 && current < 32) {
+        used |= (1U << current);
+      }
+      current = 0;
+    }
+    i++;
+  }
+  // return number of first bit that is 0:
+  i = 0;
+  while (i < 32 && used & 1) {
+    used = used >> 1;
+    i++;
+  }
+  return (int)i;
+}
+
+static bool is_autolink(cmark_node *node) {
+  cmark_chunk *title;
+  cmark_chunk *url;
+  cmark_node *link_text;
+  char *realurl;
+  int realurllen;
+
+  if (node->type != CMARK_NODE_LINK) {
+    return false;
+  }
+
+  url = &node->as.link.url;
+  if (url->len == 0 || scan_scheme(url, 0) == 0) {
+    return false;
+  }
+
+  title = &node->as.link.title;
+  // if it has a title, we can't treat it as an autolink:
+  if (title->len > 0) {
+    return false;
+  }
+
+  link_text = node->first_child;
+  if (link_text == NULL) {
+    return false;
+  }
+  cmark_consolidate_text_nodes(link_text);
+  realurl = (char *)url->data;
+  realurllen = url->len;
+  if (strncmp(realurl, "mailto:", 7) == 0) {
+    realurl += 7;
+    realurllen -= 7;
+  }
+  return (realurllen == link_text->as.literal.len &&
+          strncmp(realurl, (char *)link_text->as.literal.data,
+                  link_text->as.literal.len) == 0);
+}
+
+// if node is a block node, returns node.
+// otherwise returns first block-level node that is an ancestor of node.
+// if there is no block-level ancestor, returns NULL.
+static cmark_node *get_containing_block(cmark_node *node) {
+  while (node) {
+    if (CMARK_NODE_BLOCK_P(node)) {
+      return node;
+    } else {
+      node = node->parent;
+    }
+  }
+  return NULL;
+}
+
+static int S_render_node(cmark_renderer *renderer, cmark_node *node,
+                         cmark_event_type ev_type, int options) {
+  cmark_node *tmp;
+  int list_number;
+  cmark_delim_type list_delim;
+  int numticks;
+  int i;
+  bool entering = (ev_type == CMARK_EVENT_ENTER);
+  const char *info, *code, *title;
+  size_t info_len, code_len;
+  char listmarker[LISTMARKER_SIZE];
+  char *emph_delim;
+  bool first_in_list_item;
+  bufsize_t marker_width;
+  bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options) &&
+                    !(CMARK_OPT_HARDBREAKS & options);
+
+  // Don't adjust tight list status til we've started the list.
+  // Otherwise we loose the blank line between a paragraph and
+  // a following list.
+  if (!(node->type == CMARK_NODE_ITEM && node->prev == NULL && entering)) {
+    tmp = get_containing_block(node);
+    renderer->in_tight_list_item =
+        tmp && // tmp might be NULL if there is no containing block
+        ((tmp->type == CMARK_NODE_ITEM &&
+          cmark_node_get_list_tight(tmp->parent)) ||
+         (tmp && tmp->parent && tmp->parent->type == CMARK_NODE_ITEM &&
+          cmark_node_get_list_tight(tmp->parent->parent)));
+  }
+
+  if (node->extension && node->extension->commonmark_render_func) {
+    node->extension->commonmark_render_func(node->extension, renderer, node, ev_type, options);
+    return 1;
+  }
+
+  switch (node->type) {
+  case CMARK_NODE_DOCUMENT:
+    break;
+
+  case CMARK_NODE_BLOCK_QUOTE:
+    if (entering) {
+      LIT("> ");
+      renderer->begin_content = true;
+      cmark_strbuf_puts(renderer->prefix, "> ");
+    } else {
+      cmark_strbuf_truncate(renderer->prefix, renderer->prefix->size - 2);
+      BLANKLINE();
+    }
+    break;
+
+  case CMARK_NODE_LIST:
+    if (!entering && node->next && (node->next->type == CMARK_NODE_CODE_BLOCK ||
+                                    node->next->type == CMARK_NODE_LIST)) {
+      // this ensures that a following indented code block or list will be
+      // inteprereted correctly.
+      CR();
+      LIT("");
+      BLANKLINE();
+    }
+    break;
+
+  case CMARK_NODE_ITEM:
+    if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
+      marker_width = 4;
+    } else {
+      list_number = cmark_node_get_list_start(node->parent);
+      list_delim = cmark_node_get_list_delim(node->parent);
+      tmp = node;
+      while (tmp->prev) {
+        tmp = tmp->prev;
+        list_number += 1;
+      }
+      // we ensure a width of at least 4 so
+      // we get nice transition from single digits
+      // to double
+      snprintf(listmarker, LISTMARKER_SIZE, "%d%s%s", list_number,
+               list_delim == CMARK_PAREN_DELIM ? ")" : ".",
+               list_number < 10 ? "  " : " ");
+      marker_width = (bufsize_t)strlen(listmarker);
+    }
+    if (entering) {
+      if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
+        LIT("  - ");
+        renderer->begin_content = true;
+      } else {
+        LIT(listmarker);
+        renderer->begin_content = true;
+      }
+      for (i = marker_width; i--;) {
+        cmark_strbuf_putc(renderer->prefix, ' ');
+      }
+    } else {
+      cmark_strbuf_truncate(renderer->prefix,
+                            renderer->prefix->size - marker_width);
+      CR();
+    }
+    break;
+
+  case CMARK_NODE_HEADING:
+    if (entering) {
+      for (i = cmark_node_get_heading_level(node); i > 0; i--) {
+        LIT("#");
+      }
+      LIT(" ");
+      renderer->begin_content = true;
+      renderer->no_linebreaks = true;
+    } else {
+      renderer->no_linebreaks = false;
+      BLANKLINE();
+    }
+    break;
+
+  case CMARK_NODE_CODE_BLOCK:
+    first_in_list_item = node->prev == NULL && node->parent &&
+                         node->parent->type == CMARK_NODE_ITEM;
+
+    if (!first_in_list_item) {
+      BLANKLINE();
+    }
+    info = cmark_node_get_fence_info(node);
+    info_len = strlen(info);
+    code = cmark_node_get_literal(node);
+    code_len = strlen(code);
+    // use indented form if no info, and code doesn't
+    // begin or end with a blank line, and code isn't
+    // first thing in a list item
+    if (info_len == 0 && (code_len > 2 && !cmark_isspace(code[0]) &&
+                          !(cmark_isspace(code[code_len - 1]) &&
+                            cmark_isspace(code[code_len - 2]))) &&
+        !first_in_list_item) {
+      LIT("    ");
+      cmark_strbuf_puts(renderer->prefix, "    ");
+      OUT(cmark_node_get_literal(node), false, LITERAL);
+      cmark_strbuf_truncate(renderer->prefix, renderer->prefix->size - 4);
+    } else {
+      numticks = longest_backtick_sequence(code) + 1;
+      if (numticks < 3) {
+        numticks = 3;
+      }
+      for (i = 0; i < numticks; i++) {
+        LIT("`");
+      }
+      LIT(" ");
+      OUT(info, false, LITERAL);
+      CR();
+      OUT(cmark_node_get_literal(node), false, LITERAL);
+      CR();
+      for (i = 0; i < numticks; i++) {
+        LIT("`");
+      }
+    }
+    BLANKLINE();
+    break;
+
+  case CMARK_NODE_HTML_BLOCK:
+    BLANKLINE();
+    OUT(cmark_node_get_literal(node), false, LITERAL);
+    BLANKLINE();
+    break;
+
+  case CMARK_NODE_CUSTOM_BLOCK:
+    BLANKLINE();
+    OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node),
+        false, LITERAL);
+    BLANKLINE();
+    break;
+
+  case CMARK_NODE_THEMATIC_BREAK:
+    BLANKLINE();
+    LIT("-----");
+    BLANKLINE();
+    break;
+
+  case CMARK_NODE_PARAGRAPH:
+    if (!entering) {
+      BLANKLINE();
+    }
+    break;
+
+  case CMARK_NODE_TEXT:
+    OUT(cmark_node_get_literal(node), allow_wrap, NORMAL);
+    break;
+
+  case CMARK_NODE_LINEBREAK:
+    if (!(CMARK_OPT_HARDBREAKS & options)) {
+      LIT("  ");
+    }
+    CR();
+    break;
+
+  case CMARK_NODE_SOFTBREAK:
+    if (CMARK_OPT_HARDBREAKS & options) {
+      LIT("  ");
+      CR();
+    } else if (!renderer->no_linebreaks && renderer->width == 0 &&
+               !(CMARK_OPT_HARDBREAKS & options) &&
+               !(CMARK_OPT_NOBREAKS & options)) {
+      CR();
+    } else {
+      OUT(" ", allow_wrap, LITERAL);
+    }
+    break;
+
+  case CMARK_NODE_CODE:
+    code = cmark_node_get_literal(node);
+    code_len = strlen(code);
+    numticks = shortest_unused_backtick_sequence(code);
+    for (i = 0; i < numticks; i++) {
+      LIT("`");
+    }
+    if (code_len == 0 || code[0] == '`') {
+      LIT(" ");
+    }
+    OUT(cmark_node_get_literal(node), allow_wrap, LITERAL);
+    if (code_len == 0 || code[code_len - 1] == '`') {
+      LIT(" ");
+    }
+    for (i = 0; i < numticks; i++) {
+      LIT("`");
+    }
+    break;
+
+  case CMARK_NODE_HTML_INLINE:
+    OUT(cmark_node_get_literal(node), false, LITERAL);
+    break;
+
+  case CMARK_NODE_CUSTOM_INLINE:
+    OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node),
+        false, LITERAL);
+    break;
+
+  case CMARK_NODE_STRONG:
+    if (entering) {
+      LIT("**");
+    } else {
+      LIT("**");
+    }
+    break;
+
+  case CMARK_NODE_EMPH:
+    // If we have EMPH(EMPH(x)), we need to use *_x_*
+    // because **x** is STRONG(x):
+    if (node->parent && node->parent->type == CMARK_NODE_EMPH &&
+        node->next == NULL && node->prev == NULL) {
+      emph_delim = "_";
+    } else {
+      emph_delim = "*";
+    }
+    if (entering) {
+      LIT(emph_delim);
+    } else {
+      LIT(emph_delim);
+    }
+    break;
+
+  case CMARK_NODE_LINK:
+    if (is_autolink(node)) {
+      if (entering) {
+        LIT("<");
+        if (strncmp(cmark_node_get_url(node), "mailto:", 7) == 0) {
+          LIT((const char *)cmark_node_get_url(node) + 7);
+        } else {
+          LIT((const char *)cmark_node_get_url(node));
+        }
+        LIT(">");
+        // return signal to skip contents of node...
+        return 0;
+      }
+    } else {
+      if (entering) {
+        LIT("[");
+      } else {
+        LIT("](");
+        OUT(cmark_node_get_url(node), false, URL);
+        title = cmark_node_get_title(node);
+        if (strlen(title) > 0) {
+          LIT(" \"");
+          OUT(title, false, TITLE);
+          LIT("\"");
+        }
+        LIT(")");
+      }
+    }
+    break;
+
+  case CMARK_NODE_IMAGE:
+    if (entering) {
+      LIT("![");
+    } else {
+      LIT("](");
+      OUT(cmark_node_get_url(node), false, URL);
+      title = cmark_node_get_title(node);
+      if (strlen(title) > 0) {
+        OUT(" \"", allow_wrap, LITERAL);
+        OUT(title, false, TITLE);
+        LIT("\"");
+      }
+      LIT(")");
+    }
+    break;
+
+  case CMARK_NODE_FOOTNOTE_REFERENCE:
+    if (entering) {
+      LIT("[^");
+      OUT(cmark_chunk_to_cstr(renderer->mem, &node->as.literal), false, LITERAL);
+      LIT("]");
+    }
+    break;
+
+  case CMARK_NODE_FOOTNOTE_DEFINITION:
+    if (entering) {
+      renderer->footnote_ix += 1;
+      LIT("[^");
+      char n[32];
+      snprintf(n, sizeof(n), "%d", renderer->footnote_ix);
+      OUT(n, false, LITERAL);
+      LIT("]:\n");
+
+      cmark_strbuf_puts(renderer->prefix, "    ");
+    } else {
+      cmark_strbuf_truncate(renderer->prefix, renderer->prefix->size - 4);
+    }
+    break;
+
+  default:
+    assert(false);
+    break;
+  }
+
+  return 1;
+}
+
+char *cmark_render_commonmark(cmark_node *root, int options, int width) {
+  return cmark_render_commonmark_with_mem(root, options, width, cmark_node_mem(root));
+}
+
+char *cmark_render_commonmark_with_mem(cmark_node *root, int options, int width, cmark_mem *mem) {
+  if (options & CMARK_OPT_HARDBREAKS) {
+    // disable breaking on width, since it has
+    // a different meaning with OPT_HARDBREAKS
+    width = 0;
+  }
+  return cmark_render(mem, root, options, width, outc, S_render_node);
+}
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmark.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmark.o
new file mode 100644
index 000000000000..1f3dd4540a82
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmark.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.c
new file mode 100644
index 000000000000..8f2c85886eff
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.c
@@ -0,0 +1,1197 @@
+#include "commonmarker.h"
+#include "cmark-gfm.h"
+#include "houdini.h"
+#include "node.h"
+#include "registry.h"
+#include "parser.h"
+#include "syntax_extension.h"
+#include "cmark-gfm-core-extensions.h"
+
+static VALUE rb_mNodeError;
+static VALUE rb_mNode;
+
+static VALUE sym_document;
+static VALUE sym_blockquote;
+static VALUE sym_list;
+static VALUE sym_list_item;
+static VALUE sym_code_block;
+static VALUE sym_html;
+static VALUE sym_paragraph;
+static VALUE sym_header;
+static VALUE sym_hrule;
+static VALUE sym_text;
+static VALUE sym_softbreak;
+static VALUE sym_linebreak;
+static VALUE sym_code;
+static VALUE sym_inline_html;
+static VALUE sym_emph;
+static VALUE sym_strong;
+static VALUE sym_link;
+static VALUE sym_image;
+static VALUE sym_footnote_reference;
+static VALUE sym_footnote_definition;
+
+static VALUE sym_bullet_list;
+static VALUE sym_ordered_list;
+
+static VALUE sym_left;
+static VALUE sym_right;
+static VALUE sym_center;
+
+static VALUE encode_utf8_string(const char *c_string) {
+  VALUE string = rb_str_new2(c_string);
+  int enc = rb_enc_find_index("UTF-8");
+  rb_enc_associate_index(string, enc);
+  return string;
+}
+
+static void rb_mark_c_struct(void *data) {
+  cmark_node *node = data;
+  cmark_node *child;
+
+  /* Mark the parent to make sure that the tree won't be freed as
+     long as a child node is referenced. */
+  cmark_node *parent = cmark_node_parent(node);
+  if (parent) {
+    void *user_data = cmark_node_get_user_data(parent);
+    if (!user_data) {
+      /* This should never happen. Child can nodes can only
+         be returned from parents that already are
+         associated with a Ruby object. */
+      fprintf(stderr, "parent without user_data\n");
+      abort();
+    }
+    rb_gc_mark((VALUE)user_data);
+  }
+
+  /* Mark all children to make sure their cached Ruby objects won't
+     be freed. */
+  for (child = cmark_node_first_child(node); child != NULL;
+       child = cmark_node_next(child)) {
+    void *user_data = cmark_node_get_user_data(child);
+    if (user_data)
+      rb_gc_mark((VALUE)user_data);
+  }
+}
+
+static void rb_free_c_struct(void *data) {
+  /* It's important that the `free` function does not inspect the
+     node data, as it may be part of a tree that was already freed. */
+  cmark_node_free(data);
+}
+
+static VALUE rb_node_to_value(cmark_node *node) {
+  void *user_data;
+  RUBY_DATA_FUNC free_func;
+  VALUE val;
+
+  if (node == NULL)
+    return Qnil;
+
+  user_data = cmark_node_get_user_data(node);
+  if (user_data)
+    return (VALUE)user_data;
+
+  /* Only free tree roots. */
+  free_func = cmark_node_parent(node) ? NULL : rb_free_c_struct;
+  val = Data_Wrap_Struct(rb_mNode, rb_mark_c_struct, free_func, node);
+  cmark_node_set_user_data(node, (void *)val);
+
+  return val;
+}
+
+/* If the node structure is changed, the finalizers must be updated. */
+
+static void rb_parent_added(VALUE val) { RDATA(val)->dfree = NULL; }
+
+static void rb_parent_removed(VALUE val) {
+  RDATA(val)->dfree = rb_free_c_struct;
+}
+
+static cmark_parser *prepare_parser(VALUE rb_options, VALUE rb_extensions, cmark_mem *mem) {
+  int options;
+  int extensions_len;
+  VALUE rb_ext_name;
+  int i;
+
+  Check_Type(rb_options, T_FIXNUM);
+  Check_Type(rb_extensions, T_ARRAY);
+
+  options = FIX2INT(rb_options);
+  extensions_len = RARRAY_LEN(rb_extensions);
+
+  cmark_parser *parser = cmark_parser_new_with_mem(options, mem);
+  for (i = 0; i < extensions_len; ++i) {
+    rb_ext_name = RARRAY_PTR(rb_extensions)[i];
+
+    if (!SYMBOL_P(rb_ext_name)) {
+      cmark_parser_free(parser);
+      cmark_arena_reset();
+      rb_raise(rb_eTypeError, "extension names should be Symbols; got a %"PRIsVALUE"", rb_obj_class(rb_ext_name));
+    }
+
+    cmark_syntax_extension *syntax_extension =
+      cmark_find_syntax_extension(rb_id2name(SYM2ID(rb_ext_name)));
+
+    if (!syntax_extension) {
+      cmark_parser_free(parser);
+      cmark_arena_reset();
+      rb_raise(rb_eArgError, "extension %s not found", rb_id2name(SYM2ID(rb_ext_name)));
+    }
+
+    cmark_parser_attach_syntax_extension(parser, syntax_extension);
+  }
+
+  return parser;
+}
+
+/*
+ * Internal: Parses a Markdown string into an HTML string.
+ *
+ */
+static VALUE rb_markdown_to_html(VALUE self, VALUE rb_text, VALUE rb_options, VALUE rb_extensions) {
+  char *str, *html;
+  int len;
+  cmark_parser *parser;
+  cmark_node *doc;
+  Check_Type(rb_text, T_STRING);
+  Check_Type(rb_options, T_FIXNUM);
+
+  parser = prepare_parser(rb_options, rb_extensions, cmark_get_arena_mem_allocator());
+
+  str = (char *)RSTRING_PTR(rb_text);
+  len = RSTRING_LEN(rb_text);
+
+  cmark_parser_feed(parser, str, len);
+  doc = cmark_parser_finish(parser);
+  if (doc == NULL) {
+    cmark_arena_reset();
+    rb_raise(rb_mNodeError, "error parsing document");
+  }
+
+  cmark_mem *default_mem = cmark_get_default_mem_allocator();
+  html = cmark_render_html_with_mem(doc, FIX2INT(rb_options), parser->syntax_extensions, default_mem);
+  cmark_arena_reset();
+
+  VALUE ruby_html = rb_str_new2(html);
+  default_mem->free(html);
+
+  return ruby_html;
+}
+
+/*
+ * Internal: Creates a node based on a node type.
+ *
+ * type -  A {Symbol} representing the node to be created. Must be one of the
+ * following:
+ * - `:document`
+ * - `:blockquote`
+ * - `:list`
+ * - `:list_item`
+ * - `:code_block`
+ * - `:html`
+ * - `:paragraph`
+ * - `:header`
+ * - `:hrule`
+ * - `:text`
+ * - `:softbreak`
+ * - `:linebreak`
+ * - `:code`
+ * - `:inline_html`
+ * - `:emph`
+ * - `:strong`
+ * - `:link`
+ * - `:image`
+ */
+static VALUE rb_node_new(VALUE self, VALUE type) {
+  cmark_node_type node_type = 0;
+  cmark_node *node;
+
+  Check_Type(type, T_SYMBOL);
+
+  if (type == sym_document)
+    node_type = CMARK_NODE_DOCUMENT;
+  else if (type == sym_blockquote)
+    node_type = CMARK_NODE_BLOCK_QUOTE;
+  else if (type == sym_list)
+    node_type = CMARK_NODE_LIST;
+  else if (type == sym_list_item)
+    node_type = CMARK_NODE_ITEM;
+  else if (type == sym_code_block)
+    node_type = CMARK_NODE_CODE_BLOCK;
+  else if (type == sym_html)
+    node_type = CMARK_NODE_HTML;
+  else if (type == sym_paragraph)
+    node_type = CMARK_NODE_PARAGRAPH;
+  else if (type == sym_header)
+    node_type = CMARK_NODE_HEADER;
+  else if (type == sym_hrule)
+    node_type = CMARK_NODE_HRULE;
+  else if (type == sym_text)
+    node_type = CMARK_NODE_TEXT;
+  else if (type == sym_softbreak)
+    node_type = CMARK_NODE_SOFTBREAK;
+  else if (type == sym_linebreak)
+    node_type = CMARK_NODE_LINEBREAK;
+  else if (type == sym_code)
+    node_type = CMARK_NODE_CODE;
+  else if (type == sym_inline_html)
+    node_type = CMARK_NODE_INLINE_HTML;
+  else if (type == sym_emph)
+    node_type = CMARK_NODE_EMPH;
+  else if (type == sym_strong)
+    node_type = CMARK_NODE_STRONG;
+  else if (type == sym_link)
+    node_type = CMARK_NODE_LINK;
+  else if (type == sym_image)
+    node_type = CMARK_NODE_IMAGE;
+  else if (type == sym_footnote_reference)
+    node_type = CMARK_NODE_FOOTNOTE_REFERENCE;
+  else if (type == sym_footnote_definition)
+    node_type = CMARK_NODE_FOOTNOTE_DEFINITION;
+  else
+    rb_raise(rb_mNodeError, "invalid node of type %d", node_type);
+
+  node = cmark_node_new(node_type);
+  if (node == NULL) {
+    rb_raise(rb_mNodeError, "could not create node of type %d", node_type);
+  }
+
+  return rb_node_to_value(node);
+}
+
+/*
+ * Internal: Parses a Markdown string into a document.
+ *
+ */
+static VALUE rb_parse_document(VALUE self, VALUE rb_text, VALUE rb_len,
+                               VALUE rb_options, VALUE rb_extensions) {
+  char *text;
+  int len, options;
+  cmark_parser *parser;
+  cmark_node *doc;
+  Check_Type(rb_text, T_STRING);
+  Check_Type(rb_len, T_FIXNUM);
+  Check_Type(rb_options, T_FIXNUM);
+
+  parser = prepare_parser(rb_options, rb_extensions, cmark_get_default_mem_allocator());
+
+  text = (char *)RSTRING_PTR(rb_text);
+  len = FIX2INT(rb_len);
+  options = FIX2INT(rb_options);
+
+  cmark_parser_feed(parser, text, len);
+  doc = cmark_parser_finish(parser);
+  if (doc == NULL) {
+    rb_raise(rb_mNodeError, "error parsing document");
+  }
+  cmark_parser_free(parser);
+
+  return rb_node_to_value(doc);
+}
+
+/*
+ * Public: Fetch the string contents of the node.
+ *
+ * Returns a {String}.
+ */
+static VALUE rb_node_get_string_content(VALUE self) {
+  const char *text;
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  text = cmark_node_get_literal(node);
+  if (text == NULL) {
+    rb_raise(rb_mNodeError, "could not get string content");
+  }
+
+  return encode_utf8_string(text);
+}
+
+/*
+ * Public: Sets the string content of the node.
+ *
+ * string - A {String} containing new content.
+ *
+ * Raises NodeError if the string content can't be set.
+ */
+static VALUE rb_node_set_string_content(VALUE self, VALUE s) {
+  char *text;
+  cmark_node *node;
+  Check_Type(s, T_STRING);
+
+  Data_Get_Struct(self, cmark_node, node);
+  text = StringValueCStr(s);
+
+  if (!cmark_node_set_literal(node, text)) {
+    rb_raise(rb_mNodeError, "could not set string content");
+  }
+
+  return Qnil;
+}
+
+/*
+ * Public: Fetches the list type of the node.
+ *
+ * Returns a {Symbol} representing the node's type.
+ */
+static VALUE rb_node_get_type(VALUE self) {
+  int node_type;
+  cmark_node *node;
+  VALUE symbol;
+  const char *s;
+
+  Data_Get_Struct(self, cmark_node, node);
+
+  node_type = cmark_node_get_type(node);
+  symbol = Qnil;
+
+  switch (node_type) {
+  case CMARK_NODE_DOCUMENT:
+    symbol = sym_document;
+    break;
+  case CMARK_NODE_BLOCK_QUOTE:
+    symbol = sym_blockquote;
+    break;
+  case CMARK_NODE_LIST:
+    symbol = sym_list;
+    break;
+  case CMARK_NODE_ITEM:
+    symbol = sym_list_item;
+    break;
+  case CMARK_NODE_CODE_BLOCK:
+    symbol = sym_code_block;
+    break;
+  case CMARK_NODE_HTML:
+    symbol = sym_html;
+    break;
+  case CMARK_NODE_PARAGRAPH:
+    symbol = sym_paragraph;
+    break;
+  case CMARK_NODE_HEADER:
+    symbol = sym_header;
+    break;
+  case CMARK_NODE_HRULE:
+    symbol = sym_hrule;
+    break;
+  case CMARK_NODE_TEXT:
+    symbol = sym_text;
+    break;
+  case CMARK_NODE_SOFTBREAK:
+    symbol = sym_softbreak;
+    break;
+  case CMARK_NODE_LINEBREAK:
+    symbol = sym_linebreak;
+    break;
+  case CMARK_NODE_CODE:
+    symbol = sym_code;
+    break;
+  case CMARK_NODE_INLINE_HTML:
+    symbol = sym_inline_html;
+    break;
+  case CMARK_NODE_EMPH:
+    symbol = sym_emph;
+    break;
+  case CMARK_NODE_STRONG:
+    symbol = sym_strong;
+    break;
+  case CMARK_NODE_LINK:
+    symbol = sym_link;
+    break;
+  case CMARK_NODE_IMAGE:
+    symbol = sym_image;
+    break;
+  case CMARK_NODE_FOOTNOTE_REFERENCE:
+    symbol = sym_footnote_reference;
+    break;
+  case CMARK_NODE_FOOTNOTE_DEFINITION:
+    symbol = sym_footnote_definition;
+    break;
+  default:
+    if (node->extension) {
+      s = node->extension->get_type_string_func(node->extension, node);
+      return ID2SYM(rb_intern(s));
+    }
+    rb_raise(rb_mNodeError, "invalid node type %d", node_type);
+  }
+
+  return symbol;
+}
+
+/*
+ * Public: Fetches the sourcepos of the node.
+ *
+ * Returns a {Hash} containing {Symbol} keys of the positions.
+ */
+static VALUE rb_node_get_sourcepos(VALUE self) {
+  int start_line, start_column, end_line, end_column;
+  VALUE result;
+
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  start_line = cmark_node_get_start_line(node);
+  start_column = cmark_node_get_start_column(node);
+  end_line = cmark_node_get_end_line(node);
+  end_column = cmark_node_get_end_column(node);
+
+  result = rb_hash_new();
+  rb_hash_aset(result, CSTR2SYM("start_line"), INT2NUM(start_line));
+  rb_hash_aset(result, CSTR2SYM("start_column"), INT2NUM(start_column));
+  rb_hash_aset(result, CSTR2SYM("end_line"), INT2NUM(end_line));
+  rb_hash_aset(result, CSTR2SYM("end_column"), INT2NUM(end_column));
+
+  return result;
+}
+
+/*
+ * Public: Returns the type of the current pointer as a string.
+ *
+ * Returns a {String}.
+ */
+static VALUE rb_node_get_type_string(VALUE self) {
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  return rb_str_new2(cmark_node_get_type_string(node));
+}
+
+/*
+ * Internal: Unlinks the node from the tree (fixing pointers in
+ * parents and siblings appropriately).
+ */
+static VALUE rb_node_unlink(VALUE self) {
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  cmark_node_unlink(node);
+
+  rb_parent_removed(self);
+
+  return Qnil;
+}
+
+/* Public: Fetches the first child of the node.
+ *
+ * Returns a {Node} if a child exists, `nil` otherise.
+ */
+static VALUE rb_node_first_child(VALUE self) {
+  cmark_node *node, *child;
+  Data_Get_Struct(self, cmark_node, node);
+
+  child = cmark_node_first_child(node);
+
+  return rb_node_to_value(child);
+}
+
+/* Public: Fetches the next sibling of the node.
+ *
+ * Returns a {Node} if a sibling exists, `nil` otherwise.
+ */
+static VALUE rb_node_next(VALUE self) {
+  cmark_node *node, *next;
+  Data_Get_Struct(self, cmark_node, node);
+
+  next = cmark_node_next(node);
+
+  return rb_node_to_value(next);
+}
+
+/*
+ * Public: Inserts a node as a sibling before the current node.
+ *
+ * sibling - A sibling {Node} to insert.
+ *
+ * Returns `true` if successful.
+ * Raises NodeError if the node can't be inserted.
+ */
+static VALUE rb_node_insert_before(VALUE self, VALUE sibling) {
+  cmark_node *node1, *node2;
+  Data_Get_Struct(self, cmark_node, node1);
+
+  Data_Get_Struct(sibling, cmark_node, node2);
+
+  if (!cmark_node_insert_before(node1, node2)) {
+    rb_raise(rb_mNodeError, "could not insert before");
+  }
+
+  rb_parent_added(sibling);
+
+  return Qtrue;
+}
+
+/* Internal: Convert the node to an HTML string.
+ *
+ * Returns a {String}.
+ */
+static VALUE rb_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
+  int options, extensions_len;
+  VALUE rb_ext_name;
+  int i;
+  cmark_node *node;
+  cmark_llist *extensions = NULL;
+  cmark_mem *mem = cmark_get_default_mem_allocator();
+  Check_Type(rb_options, T_FIXNUM);
+  Check_Type(rb_extensions, T_ARRAY);
+
+  options = FIX2INT(rb_options);
+  extensions_len = RARRAY_LEN(rb_extensions);
+
+  Data_Get_Struct(self, cmark_node, node);
+
+  for (i = 0; i < extensions_len; ++i) {
+    rb_ext_name = RARRAY_PTR(rb_extensions)[i];
+
+    if (!SYMBOL_P(rb_ext_name)) {
+      cmark_llist_free(mem, extensions);
+      rb_raise(rb_eTypeError, "extension names should be Symbols; got a %"PRIsVALUE"", rb_obj_class(rb_ext_name));
+    }
+
+    cmark_syntax_extension *syntax_extension =
+      cmark_find_syntax_extension(rb_id2name(SYM2ID(rb_ext_name)));
+
+    if (!syntax_extension) {
+      cmark_llist_free(mem, extensions);
+      rb_raise(rb_eArgError, "extension %s not found\n", rb_id2name(SYM2ID(rb_ext_name)));
+    }
+
+    extensions = cmark_llist_append(mem, extensions, syntax_extension);
+  }
+
+  char *html = cmark_render_html(node, options, extensions);
+  VALUE ruby_html = rb_str_new2(html);
+
+  cmark_llist_free(mem, extensions);
+  free(html);
+
+  return ruby_html;
+}
+
+/* Internal: Convert the node to a CommonMark string.
+ *
+ * Returns a {String}.
+ */
+static VALUE rb_render_commonmark(int argc, VALUE *argv, VALUE self) {
+  VALUE rb_options, rb_width;
+  rb_scan_args(argc, argv, "11", &rb_options, &rb_width);
+
+  int width = 120;
+  if (!NIL_P(rb_width)) {
+    Check_Type(rb_width, T_FIXNUM);
+    width = FIX2INT(rb_width);
+  }
+
+  int options;
+  cmark_node *node;
+  Check_Type(rb_options, T_FIXNUM);
+
+  options = FIX2INT(rb_options);
+  Data_Get_Struct(self, cmark_node, node);
+
+  char *cmark = cmark_render_commonmark(node, options, width);
+  VALUE ruby_cmark = rb_str_new2(cmark);
+  free(cmark);
+
+  return ruby_cmark;
+}
+
+/* Internal: Convert the node to a plain textstring.
+ *
+ * Returns a {String}.
+ */
+static VALUE rb_render_plaintext(int argc, VALUE *argv, VALUE self) {
+  VALUE rb_options, rb_width;
+  rb_scan_args(argc, argv, "11", &rb_options, &rb_width);
+
+  int width = 120;
+  if (!NIL_P(rb_width)) {
+    Check_Type(rb_width, T_FIXNUM);
+    width = FIX2INT(rb_width);
+  }
+
+  int options;
+  cmark_node *node;
+  Check_Type(rb_options, T_FIXNUM);
+
+  options = FIX2INT(rb_options);
+  Data_Get_Struct(self, cmark_node, node);
+
+  char *text = cmark_render_plaintext(node, options, width);
+  VALUE ruby_text = rb_str_new2(text);
+  free(text);
+
+  return ruby_text;
+}
+
+/*
+ * Public: Inserts a node as a sibling after the current node.
+ *
+ * sibling - A sibling {Node} to insert.
+ *
+ * Returns `true` if successful.
+ * Raises NodeError if the node can't be inserted.
+ */
+static VALUE rb_node_insert_after(VALUE self, VALUE sibling) {
+  cmark_node *node1, *node2;
+  Data_Get_Struct(self, cmark_node, node1);
+
+  Data_Get_Struct(sibling, cmark_node, node2);
+
+  if (!cmark_node_insert_after(node1, node2)) {
+    rb_raise(rb_mNodeError, "could not insert after");
+  }
+
+  rb_parent_added(sibling);
+
+  return Qtrue;
+}
+
+/*
+ * Public: Inserts a node as the first child of the current node.
+ *
+ * child - A child {Node} to insert.
+ *
+ * Returns `true` if successful.
+ * Raises NodeError if the node can't be inserted.
+ */
+static VALUE rb_node_prepend_child(VALUE self, VALUE child) {
+  cmark_node *node1, *node2;
+  Data_Get_Struct(self, cmark_node, node1);
+
+  Data_Get_Struct(child, cmark_node, node2);
+
+  if (!cmark_node_prepend_child(node1, node2)) {
+    rb_raise(rb_mNodeError, "could not prepend child");
+  }
+
+  rb_parent_added(child);
+
+  return Qtrue;
+}
+
+/*
+ * Public: Inserts a node as the last child of the current node.
+ *
+ * child - A child {Node} to insert.
+ *
+ * Returns `true` if successful.
+ * Raises NodeError if the node can't be inserted.
+ */
+static VALUE rb_node_append_child(VALUE self, VALUE child) {
+  cmark_node *node1, *node2;
+  Data_Get_Struct(self, cmark_node, node1);
+
+  Data_Get_Struct(child, cmark_node, node2);
+
+  if (!cmark_node_append_child(node1, node2)) {
+    rb_raise(rb_mNodeError, "could not append child");
+  }
+
+  rb_parent_added(child);
+
+  return Qtrue;
+}
+
+/* Public: Fetches the first child of the current node.
+ *
+ * Returns a {Node} if a child exists, `nil` otherise.
+ */
+static VALUE rb_node_last_child(VALUE self) {
+  cmark_node *node, *child;
+  Data_Get_Struct(self, cmark_node, node);
+
+  child = cmark_node_last_child(node);
+
+  return rb_node_to_value(child);
+}
+
+/* Public: Fetches the parent of the current node.
+ *
+ * Returns a {Node} if a parent exists, `nil` otherise.
+ */
+static VALUE rb_node_parent(VALUE self) {
+  cmark_node *node, *parent;
+  Data_Get_Struct(self, cmark_node, node);
+
+  parent = cmark_node_parent(node);
+
+  return rb_node_to_value(parent);
+}
+
+/* Public: Fetches the previous sibling of the current node.
+ *
+ * Returns a {Node} if a parent exists, `nil` otherise.
+ */
+static VALUE rb_node_previous(VALUE self) {
+  cmark_node *node, *previous;
+  Data_Get_Struct(self, cmark_node, node);
+
+  previous = cmark_node_previous(node);
+
+  return rb_node_to_value(previous);
+}
+
+/*
+ * Public: Gets the URL of the current node (must be a `:link` or `:image`).
+ *
+ * Returns a {String}.
+ * Raises a NodeError if the URL can't be retrieved.
+ */
+static VALUE rb_node_get_url(VALUE self) {
+  const char *text;
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  text = cmark_node_get_url(node);
+  if (text == NULL) {
+    rb_raise(rb_mNodeError, "could not get url");
+  }
+
+  return rb_str_new2(text);
+}
+
+/*
+ * Public: Sets the URL of the current node (must be a `:link` or `:image`).
+ *
+ * url - A {String} representing the new URL
+ *
+ * Raises a NodeError if the URL can't be set.
+ */
+static VALUE rb_node_set_url(VALUE self, VALUE url) {
+  cmark_node *node;
+  char *text;
+  Check_Type(url, T_STRING);
+
+  Data_Get_Struct(self, cmark_node, node);
+  text = StringValueCStr(url);
+
+  if (!cmark_node_set_url(node, text)) {
+    rb_raise(rb_mNodeError, "could not set url");
+  }
+
+  return Qnil;
+}
+
+/*
+ * Public: Gets the title of the current node (must be a `:link` or `:image`).
+ *
+ * Returns a {String}.
+ * Raises a NodeError if the title can't be retrieved.
+ */
+static VALUE rb_node_get_title(VALUE self) {
+  const char *text;
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  text = cmark_node_get_title(node);
+  if (text == NULL) {
+    rb_raise(rb_mNodeError, "could not get title");
+  }
+
+  return rb_str_new2(text);
+}
+
+/*
+ * Public: Sets the title of the current node (must be a `:link` or `:image`).
+ *
+ * title - A {String} representing the new title
+ *
+ * Raises a NodeError if the title can't be set.
+ */
+static VALUE rb_node_set_title(VALUE self, VALUE title) {
+  char *text;
+  cmark_node *node;
+  Check_Type(title, T_STRING);
+
+  Data_Get_Struct(self, cmark_node, node);
+  text = StringValueCStr(title);
+
+  if (!cmark_node_set_title(node, text)) {
+    rb_raise(rb_mNodeError, "could not set title");
+  }
+
+  return Qnil;
+}
+
+/*
+ * Public: Gets the header level of the current node (must be a `:header`).
+ *
+ * Returns a {Number} representing the header level.
+ * Raises a NodeError if the header level can't be retrieved.
+ */
+static VALUE rb_node_get_header_level(VALUE self) {
+  int header_level;
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  header_level = cmark_node_get_header_level(node);
+
+  if (header_level == 0) {
+    rb_raise(rb_mNodeError, "could not get header_level");
+  }
+
+  return INT2NUM(header_level);
+}
+
+/*
+ * Public: Sets the header level of the current node (must be a `:header`).
+ *
+ * level - A {Number} representing the new header level
+ *
+ * Raises a NodeError if the header level can't be set.
+ */
+static VALUE rb_node_set_header_level(VALUE self, VALUE level) {
+  int l;
+  cmark_node *node;
+  Check_Type(level, T_FIXNUM);
+
+  Data_Get_Struct(self, cmark_node, node);
+  l = FIX2INT(level);
+
+  if (!cmark_node_set_header_level(node, l)) {
+    rb_raise(rb_mNodeError, "could not set header_level");
+  }
+
+  return Qnil;
+}
+
+/*
+ * Public: Gets the list type of the current node (must be a `:list`).
+ *
+ * Returns a {Symbol}.
+ * Raises a NodeError if the title can't be retrieved.
+ */
+static VALUE rb_node_get_list_type(VALUE self) {
+  int list_type;
+  cmark_node *node;
+  VALUE symbol;
+  Data_Get_Struct(self, cmark_node, node);
+
+  list_type = cmark_node_get_list_type(node);
+
+  if (list_type == CMARK_BULLET_LIST) {
+    symbol = sym_bullet_list;
+  } else if (list_type == CMARK_ORDERED_LIST) {
+    symbol = sym_ordered_list;
+  } else {
+    rb_raise(rb_mNodeError, "could not get list_type");
+  }
+
+  return symbol;
+}
+
+/*
+ * Public: Sets the list type of the current node (must be a `:list`).
+ *
+ * level - A {Symbol} representing the new list type
+ *
+ * Raises a NodeError if the list type can't be set.
+ */
+static VALUE rb_node_set_list_type(VALUE self, VALUE list_type) {
+  int type = 0;
+  cmark_node *node;
+  Check_Type(list_type, T_SYMBOL);
+
+  Data_Get_Struct(self, cmark_node, node);
+
+  if (list_type == sym_bullet_list) {
+    type = CMARK_BULLET_LIST;
+  } else if (list_type == sym_ordered_list) {
+    type = CMARK_ORDERED_LIST;
+  } else {
+    rb_raise(rb_mNodeError, "invalid list_type");
+  }
+
+  if (!cmark_node_set_list_type(node, type)) {
+    rb_raise(rb_mNodeError, "could not set list_type");
+  }
+
+  return Qnil;
+}
+
+/*
+ * Public: Gets the starting number the current node (must be an
+ * `:ordered_list`).
+ *
+ * Returns a {Number} representing the starting number.
+ * Raises a NodeError if the starting number can't be retrieved.
+ */
+static VALUE rb_node_get_list_start(VALUE self) {
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  if (cmark_node_get_type(node) != CMARK_NODE_LIST ||
+      cmark_node_get_list_type(node) != CMARK_ORDERED_LIST) {
+    rb_raise(rb_mNodeError, "can't get list_start for non-ordered list %d",
+             cmark_node_get_list_type(node));
+  }
+
+  return INT2NUM(cmark_node_get_list_start(node));
+}
+
+/*
+ * Public: Sets the starting number of the current node (must be an
+ * `:ordered_list`).
+ *
+ * level - A {Number} representing the new starting number
+ *
+ * Raises a NodeError if the starting number can't be set.
+ */
+static VALUE rb_node_set_list_start(VALUE self, VALUE start) {
+  int s;
+  cmark_node *node;
+  Check_Type(start, T_FIXNUM);
+
+  Data_Get_Struct(self, cmark_node, node);
+  s = FIX2INT(start);
+
+  if (!cmark_node_set_list_start(node, s)) {
+    rb_raise(rb_mNodeError, "could not set list_start");
+  }
+
+  return Qnil;
+}
+
+/*
+ * Public: Gets the tight status the current node (must be a `:list`).
+ *
+ * Returns a `true` if the list is tight, `false` otherwise.
+ * Raises a NodeError if the starting number can't be retrieved.
+ */
+static VALUE rb_node_get_list_tight(VALUE self) {
+  int flag;
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  if (cmark_node_get_type(node) != CMARK_NODE_LIST) {
+    rb_raise(rb_mNodeError, "can't get list_tight for non-list");
+  }
+
+  flag = cmark_node_get_list_tight(node);
+
+  return flag ? Qtrue : Qfalse;
+}
+
+/*
+ * Public: Sets the tight status of the current node (must be a `:list`).
+ *
+ * tight - A {Boolean} representing the new tightness
+ *
+ * Raises a NodeError if the tightness can't be set.
+ */
+static VALUE rb_node_set_list_tight(VALUE self, VALUE tight) {
+  int t;
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+  t = RTEST(tight);
+
+  if (!cmark_node_set_list_tight(node, t)) {
+    rb_raise(rb_mNodeError, "could not set list_tight");
+  }
+
+  return Qnil;
+}
+
+/*
+ * Public: Gets the fence info of the current node (must be a `:code_block`).
+ *
+ * Returns a {String} representing the fence info.
+ * Raises a NodeError if the fence info can't be retrieved.
+ */
+static VALUE rb_node_get_fence_info(VALUE self) {
+  const char *fence_info;
+  cmark_node *node;
+  Data_Get_Struct(self, cmark_node, node);
+
+  fence_info = cmark_node_get_fence_info(node);
+
+  if (fence_info == NULL) {
+    rb_raise(rb_mNodeError, "could not get fence_info");
+  }
+
+  return rb_str_new2(fence_info);
+}
+
+/*
+ * Public: Sets the fence info of the current node (must be a `:code_block`).
+ *
+ * info - A {String} representing the new fence info
+ *
+ * Raises a NodeError if the fence info can't be set.
+ */
+static VALUE rb_node_set_fence_info(VALUE self, VALUE info) {
+  char *text;
+  cmark_node *node;
+  Check_Type(info, T_STRING);
+
+  Data_Get_Struct(self, cmark_node, node);
+  text = StringValueCStr(info);
+
+  if (!cmark_node_set_fence_info(node, text)) {
+    rb_raise(rb_mNodeError, "could not set fence_info");
+  }
+
+  return Qnil;
+}
+
+static VALUE rb_node_get_table_alignments(VALUE self) {
+  uint16_t column_count, i;
+  uint8_t *alignments;
+  cmark_node *node;
+  VALUE ary;
+  Data_Get_Struct(self, cmark_node, node);
+
+  column_count = cmark_gfm_extensions_get_table_columns(node);
+  alignments = cmark_gfm_extensions_get_table_alignments(node);
+
+  if (!column_count || !alignments) {
+    rb_raise(rb_mNodeError, "could not get column_count or alignments");
+  }
+
+  ary = rb_ary_new();
+  for (i = 0; i < column_count; ++i) {
+    if (alignments[i] == 'l')
+      rb_ary_push(ary, sym_left);
+    else if (alignments[i] == 'c')
+      rb_ary_push(ary, sym_center);
+    else if (alignments[i] == 'r')
+      rb_ary_push(ary, sym_right);
+    else
+      rb_ary_push(ary, Qnil);
+  }
+  return ary;
+}
+
+/* Internal: Escapes href URLs safely. */
+static VALUE rb_html_escape_href(VALUE self, VALUE rb_text) {
+  char *result;
+  cmark_node *node;
+  Check_Type(rb_text, T_STRING);
+
+  Data_Get_Struct(self, cmark_node, node);
+
+  cmark_mem *mem = cmark_node_mem(node);
+  cmark_strbuf buf = CMARK_BUF_INIT(mem);
+
+  if (houdini_escape_href(&buf, (const uint8_t *)RSTRING_PTR(rb_text),
+                          RSTRING_LEN(rb_text))) {
+    result = (char *)cmark_strbuf_detach(&buf);
+    return rb_str_new2(result);
+  }
+
+  return rb_text;
+}
+
+/* Internal: Escapes HTML content safely. */
+static VALUE rb_html_escape_html(VALUE self, VALUE rb_text) {
+  char *result;
+  cmark_node *node;
+  Check_Type(rb_text, T_STRING);
+
+  Data_Get_Struct(self, cmark_node, node);
+
+  cmark_mem *mem = cmark_node_mem(node);
+  cmark_strbuf buf = CMARK_BUF_INIT(mem);
+
+  if (houdini_escape_html0(&buf, (const uint8_t *)RSTRING_PTR(rb_text),
+                           RSTRING_LEN(rb_text), 0)) {
+    result = (char *)cmark_strbuf_detach(&buf);
+    return rb_str_new2(result);
+  }
+
+  return rb_text;
+}
+
+VALUE rb_extensions(VALUE self) {
+  cmark_llist *exts, *it;
+  cmark_syntax_extension *ext;
+  VALUE ary = rb_ary_new();
+
+  cmark_mem *mem = cmark_get_default_mem_allocator();
+  exts = cmark_list_syntax_extensions(mem);
+  for (it = exts; it; it = it->next) {
+    ext = it->data;
+    rb_ary_push(ary, rb_str_new2(ext->name));
+  }
+  cmark_llist_free(mem, exts);
+
+  return ary;
+}
+
+__attribute__((visibility("default"))) void Init_commonmarker() {
+  VALUE module;
+  sym_document = ID2SYM(rb_intern("document"));
+  sym_blockquote = ID2SYM(rb_intern("blockquote"));
+  sym_list = ID2SYM(rb_intern("list"));
+  sym_list_item = ID2SYM(rb_intern("list_item"));
+  sym_code_block = ID2SYM(rb_intern("code_block"));
+  sym_html = ID2SYM(rb_intern("html"));
+  sym_paragraph = ID2SYM(rb_intern("paragraph"));
+  sym_header = ID2SYM(rb_intern("header"));
+  sym_hrule = ID2SYM(rb_intern("hrule"));
+  sym_text = ID2SYM(rb_intern("text"));
+  sym_softbreak = ID2SYM(rb_intern("softbreak"));
+  sym_linebreak = ID2SYM(rb_intern("linebreak"));
+  sym_code = ID2SYM(rb_intern("code"));
+  sym_inline_html = ID2SYM(rb_intern("inline_html"));
+  sym_emph = ID2SYM(rb_intern("emph"));
+  sym_strong = ID2SYM(rb_intern("strong"));
+  sym_link = ID2SYM(rb_intern("link"));
+  sym_image = ID2SYM(rb_intern("image"));
+  sym_footnote_reference = ID2SYM(rb_intern("footnote_reference"));
+  sym_footnote_definition = ID2SYM(rb_intern("footnote_definition"));
+
+  sym_bullet_list = ID2SYM(rb_intern("bullet_list"));
+  sym_ordered_list = ID2SYM(rb_intern("ordered_list"));
+
+  sym_left = ID2SYM(rb_intern("left"));
+  sym_right = ID2SYM(rb_intern("right"));
+  sym_center = ID2SYM(rb_intern("center"));
+
+  module = rb_define_module("CommonMarker");
+  rb_define_singleton_method(module, "extensions", rb_extensions, 0);
+  rb_mNodeError = rb_define_class_under(module, "NodeError", rb_eStandardError);
+  rb_mNode = rb_define_class_under(module, "Node", rb_cObject);
+  rb_define_singleton_method(rb_mNode, "markdown_to_html", rb_markdown_to_html,
+                             3);
+  rb_define_singleton_method(rb_mNode, "new", rb_node_new, 1);
+  rb_define_singleton_method(rb_mNode, "parse_document", rb_parse_document, 4);
+  rb_define_method(rb_mNode, "string_content", rb_node_get_string_content, 0);
+  rb_define_method(rb_mNode, "string_content=", rb_node_set_string_content, 1);
+  rb_define_method(rb_mNode, "type", rb_node_get_type, 0);
+  rb_define_method(rb_mNode, "type_string", rb_node_get_type_string, 0);
+  rb_define_method(rb_mNode, "sourcepos", rb_node_get_sourcepos, 0);
+  rb_define_method(rb_mNode, "delete", rb_node_unlink, 0);
+  rb_define_method(rb_mNode, "first_child", rb_node_first_child, 0);
+  rb_define_method(rb_mNode, "next", rb_node_next, 0);
+  rb_define_method(rb_mNode, "insert_before", rb_node_insert_before, 1);
+  rb_define_method(rb_mNode, "_render_html", rb_render_html, 2);
+  rb_define_method(rb_mNode, "_render_commonmark", rb_render_commonmark, -1);
+  rb_define_method(rb_mNode, "_render_plaintext", rb_render_plaintext, -1);
+  rb_define_method(rb_mNode, "insert_after", rb_node_insert_after, 1);
+  rb_define_method(rb_mNode, "prepend_child", rb_node_prepend_child, 1);
+  rb_define_method(rb_mNode, "append_child", rb_node_append_child, 1);
+  rb_define_method(rb_mNode, "last_child", rb_node_last_child, 0);
+  rb_define_method(rb_mNode, "parent", rb_node_parent, 0);
+  rb_define_method(rb_mNode, "previous", rb_node_previous, 0);
+  rb_define_method(rb_mNode, "url", rb_node_get_url, 0);
+  rb_define_method(rb_mNode, "url=", rb_node_set_url, 1);
+  rb_define_method(rb_mNode, "title", rb_node_get_title, 0);
+  rb_define_method(rb_mNode, "title=", rb_node_set_title, 1);
+  rb_define_method(rb_mNode, "header_level", rb_node_get_header_level, 0);
+  rb_define_method(rb_mNode, "header_level=", rb_node_set_header_level, 1);
+  rb_define_method(rb_mNode, "list_type", rb_node_get_list_type, 0);
+  rb_define_method(rb_mNode, "list_type=", rb_node_set_list_type, 1);
+  rb_define_method(rb_mNode, "list_start", rb_node_get_list_start, 0);
+  rb_define_method(rb_mNode, "list_start=", rb_node_set_list_start, 1);
+  rb_define_method(rb_mNode, "list_tight", rb_node_get_list_tight, 0);
+  rb_define_method(rb_mNode, "list_tight=", rb_node_set_list_tight, 1);
+  rb_define_method(rb_mNode, "fence_info", rb_node_get_fence_info, 0);
+  rb_define_method(rb_mNode, "fence_info=", rb_node_set_fence_info, 1);
+  rb_define_method(rb_mNode, "table_alignments", rb_node_get_table_alignments, 0);
+
+  rb_define_method(rb_mNode, "html_escape_href", rb_html_escape_href, 1);
+  rb_define_method(rb_mNode, "html_escape_html", rb_html_escape_html, 1);
+
+  cmark_gfm_core_extensions_ensure_registered();
+}
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.h
new file mode 100644
index 000000000000..da05dc4ad453
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.h
@@ -0,0 +1,16 @@
+#ifndef COMMONMARKER_H
+#define COMMONMARKER_H
+
+#ifndef __MSXML_LIBRARY_DEFINED__
+#define __MSXML_LIBRARY_DEFINED__
+#endif
+
+#include "cmark-gfm.h"
+#include "ruby.h"
+#include "ruby/encoding.h"
+
+#define CSTR2SYM(s) (ID2SYM(rb_intern((s))))
+
+void Init_commonmarker();
+
+#endif
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.o
new file mode 100644
index 000000000000..9697758132be
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.so b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.so
new file mode 100644
index 000000000000..bf52e3dd8f3f
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/commonmarker.so differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/config.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/config.h
new file mode 100644
index 000000000000..d38c7c7a5991
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/config.h
@@ -0,0 +1,76 @@
+#ifndef CMARK_CONFIG_H
+#define CMARK_CONFIG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define HAVE_STDBOOL_H
+
+#ifdef HAVE_STDBOOL_H
+  #include 
+#elif !defined(__cplusplus)
+  typedef char bool;
+#endif
+
+#define HAVE___BUILTIN_EXPECT
+
+#define HAVE___ATTRIBUTE__
+
+#ifdef HAVE___ATTRIBUTE__
+  #define CMARK_ATTRIBUTE(list) __attribute__ (list)
+#else
+  #define CMARK_ATTRIBUTE(list)
+#endif
+
+#ifndef CMARK_INLINE
+  #if defined(_MSC_VER) && !defined(__cplusplus)
+    #define CMARK_INLINE __inline
+  #else
+    #define CMARK_INLINE inline
+  #endif
+#endif
+
+/* snprintf and vsnprintf fallbacks for MSVC before 2015,
+   due to Valentin Milea http://stackoverflow.com/questions/2915672/
+*/
+
+#if defined(_MSC_VER) && _MSC_VER < 1900
+
+#include 
+#include 
+
+#define snprintf c99_snprintf
+#define vsnprintf c99_vsnprintf
+
+CMARK_INLINE int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
+{
+    int count = -1;
+
+    if (size != 0)
+        count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
+    if (count == -1)
+        count = _vscprintf(format, ap);
+
+    return count;
+}
+
+CMARK_INLINE int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
+{
+    int count;
+    va_list ap;
+
+    va_start(ap, format);
+    count = c99_vsnprintf(outBuf, size, format, ap);
+    va_end(ap);
+
+    return count;
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/core-extensions.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/core-extensions.c
new file mode 100644
index 000000000000..e436a5d151c9
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/core-extensions.c
@@ -0,0 +1,25 @@
+#include "cmark-gfm-core-extensions.h"
+#include "autolink.h"
+#include "strikethrough.h"
+#include "table.h"
+#include "tagfilter.h"
+#include "registry.h"
+#include "plugin.h"
+
+static int core_extensions_registration(cmark_plugin *plugin) {
+  cmark_plugin_register_syntax_extension(plugin, create_table_extension());
+  cmark_plugin_register_syntax_extension(plugin,
+                                         create_strikethrough_extension());
+  cmark_plugin_register_syntax_extension(plugin, create_autolink_extension());
+  cmark_plugin_register_syntax_extension(plugin, create_tagfilter_extension());
+  return 1;
+}
+
+void cmark_gfm_core_extensions_ensure_registered(void) {
+  static int registered = 0;
+
+  if (!registered) {
+    cmark_register_plugin(core_extensions_registration);
+    registered = 1;
+  }
+}
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/core-extensions.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/core-extensions.o
new file mode 100644
index 000000000000..6eb5016490d7
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/core-extensions.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/entities.inc b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/entities.inc
new file mode 100644
index 000000000000..a7c36e26da0b
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/entities.inc
@@ -0,0 +1,2138 @@
+/* Autogenerated by tools/make_headers_inc.py */
+
+struct cmark_entity_node {
+	unsigned char *entity;
+        unsigned char bytes[8];
+};
+
+#define CMARK_ENTITY_MIN_LENGTH 2
+#define CMARK_ENTITY_MAX_LENGTH 32
+#define CMARK_NUM_ENTITIES 2125
+
+static const struct cmark_entity_node cmark_entities[] = {
+{(unsigned char*)"AElig", {195, 134, 0}},
+{(unsigned char*)"AMP", {38, 0}},
+{(unsigned char*)"Aacute", {195, 129, 0}},
+{(unsigned char*)"Abreve", {196, 130, 0}},
+{(unsigned char*)"Acirc", {195, 130, 0}},
+{(unsigned char*)"Acy", {208, 144, 0}},
+{(unsigned char*)"Afr", {240, 157, 148, 132, 0}},
+{(unsigned char*)"Agrave", {195, 128, 0}},
+{(unsigned char*)"Alpha", {206, 145, 0}},
+{(unsigned char*)"Amacr", {196, 128, 0}},
+{(unsigned char*)"And", {226, 169, 147, 0}},
+{(unsigned char*)"Aogon", {196, 132, 0}},
+{(unsigned char*)"Aopf", {240, 157, 148, 184, 0}},
+{(unsigned char*)"ApplyFunction", {226, 129, 161, 0}},
+{(unsigned char*)"Aring", {195, 133, 0}},
+{(unsigned char*)"Ascr", {240, 157, 146, 156, 0}},
+{(unsigned char*)"Assign", {226, 137, 148, 0}},
+{(unsigned char*)"Atilde", {195, 131, 0}},
+{(unsigned char*)"Auml", {195, 132, 0}},
+{(unsigned char*)"Backslash", {226, 136, 150, 0}},
+{(unsigned char*)"Barv", {226, 171, 167, 0}},
+{(unsigned char*)"Barwed", {226, 140, 134, 0}},
+{(unsigned char*)"Bcy", {208, 145, 0}},
+{(unsigned char*)"Because", {226, 136, 181, 0}},
+{(unsigned char*)"Bernoullis", {226, 132, 172, 0}},
+{(unsigned char*)"Beta", {206, 146, 0}},
+{(unsigned char*)"Bfr", {240, 157, 148, 133, 0}},
+{(unsigned char*)"Bopf", {240, 157, 148, 185, 0}},
+{(unsigned char*)"Breve", {203, 152, 0}},
+{(unsigned char*)"Bscr", {226, 132, 172, 0}},
+{(unsigned char*)"Bumpeq", {226, 137, 142, 0}},
+{(unsigned char*)"CHcy", {208, 167, 0}},
+{(unsigned char*)"COPY", {194, 169, 0}},
+{(unsigned char*)"Cacute", {196, 134, 0}},
+{(unsigned char*)"Cap", {226, 139, 146, 0}},
+{(unsigned char*)"CapitalDifferentialD", {226, 133, 133, 0}},
+{(unsigned char*)"Cayleys", {226, 132, 173, 0}},
+{(unsigned char*)"Ccaron", {196, 140, 0}},
+{(unsigned char*)"Ccedil", {195, 135, 0}},
+{(unsigned char*)"Ccirc", {196, 136, 0}},
+{(unsigned char*)"Cconint", {226, 136, 176, 0}},
+{(unsigned char*)"Cdot", {196, 138, 0}},
+{(unsigned char*)"Cedilla", {194, 184, 0}},
+{(unsigned char*)"CenterDot", {194, 183, 0}},
+{(unsigned char*)"Cfr", {226, 132, 173, 0}},
+{(unsigned char*)"Chi", {206, 167, 0}},
+{(unsigned char*)"CircleDot", {226, 138, 153, 0}},
+{(unsigned char*)"CircleMinus", {226, 138, 150, 0}},
+{(unsigned char*)"CirclePlus", {226, 138, 149, 0}},
+{(unsigned char*)"CircleTimes", {226, 138, 151, 0}},
+{(unsigned char*)"ClockwiseContourIntegral", {226, 136, 178, 0}},
+{(unsigned char*)"CloseCurlyDoubleQuote", {226, 128, 157, 0}},
+{(unsigned char*)"CloseCurlyQuote", {226, 128, 153, 0}},
+{(unsigned char*)"Colon", {226, 136, 183, 0}},
+{(unsigned char*)"Colone", {226, 169, 180, 0}},
+{(unsigned char*)"Congruent", {226, 137, 161, 0}},
+{(unsigned char*)"Conint", {226, 136, 175, 0}},
+{(unsigned char*)"ContourIntegral", {226, 136, 174, 0}},
+{(unsigned char*)"Copf", {226, 132, 130, 0}},
+{(unsigned char*)"Coproduct", {226, 136, 144, 0}},
+{(unsigned char*)"CounterClockwiseContourIntegral", {226, 136, 179, 0}},
+{(unsigned char*)"Cross", {226, 168, 175, 0}},
+{(unsigned char*)"Cscr", {240, 157, 146, 158, 0}},
+{(unsigned char*)"Cup", {226, 139, 147, 0}},
+{(unsigned char*)"CupCap", {226, 137, 141, 0}},
+{(unsigned char*)"DD", {226, 133, 133, 0}},
+{(unsigned char*)"DDotrahd", {226, 164, 145, 0}},
+{(unsigned char*)"DJcy", {208, 130, 0}},
+{(unsigned char*)"DScy", {208, 133, 0}},
+{(unsigned char*)"DZcy", {208, 143, 0}},
+{(unsigned char*)"Dagger", {226, 128, 161, 0}},
+{(unsigned char*)"Darr", {226, 134, 161, 0}},
+{(unsigned char*)"Dashv", {226, 171, 164, 0}},
+{(unsigned char*)"Dcaron", {196, 142, 0}},
+{(unsigned char*)"Dcy", {208, 148, 0}},
+{(unsigned char*)"Del", {226, 136, 135, 0}},
+{(unsigned char*)"Delta", {206, 148, 0}},
+{(unsigned char*)"Dfr", {240, 157, 148, 135, 0}},
+{(unsigned char*)"DiacriticalAcute", {194, 180, 0}},
+{(unsigned char*)"DiacriticalDot", {203, 153, 0}},
+{(unsigned char*)"DiacriticalDoubleAcute", {203, 157, 0}},
+{(unsigned char*)"DiacriticalGrave", {96, 0}},
+{(unsigned char*)"DiacriticalTilde", {203, 156, 0}},
+{(unsigned char*)"Diamond", {226, 139, 132, 0}},
+{(unsigned char*)"DifferentialD", {226, 133, 134, 0}},
+{(unsigned char*)"Dopf", {240, 157, 148, 187, 0}},
+{(unsigned char*)"Dot", {194, 168, 0}},
+{(unsigned char*)"DotDot", {226, 131, 156, 0}},
+{(unsigned char*)"DotEqual", {226, 137, 144, 0}},
+{(unsigned char*)"DoubleContourIntegral", {226, 136, 175, 0}},
+{(unsigned char*)"DoubleDot", {194, 168, 0}},
+{(unsigned char*)"DoubleDownArrow", {226, 135, 147, 0}},
+{(unsigned char*)"DoubleLeftArrow", {226, 135, 144, 0}},
+{(unsigned char*)"DoubleLeftRightArrow", {226, 135, 148, 0}},
+{(unsigned char*)"DoubleLeftTee", {226, 171, 164, 0}},
+{(unsigned char*)"DoubleLongLeftArrow", {226, 159, 184, 0}},
+{(unsigned char*)"DoubleLongLeftRightArrow", {226, 159, 186, 0}},
+{(unsigned char*)"DoubleLongRightArrow", {226, 159, 185, 0}},
+{(unsigned char*)"DoubleRightArrow", {226, 135, 146, 0}},
+{(unsigned char*)"DoubleRightTee", {226, 138, 168, 0}},
+{(unsigned char*)"DoubleUpArrow", {226, 135, 145, 0}},
+{(unsigned char*)"DoubleUpDownArrow", {226, 135, 149, 0}},
+{(unsigned char*)"DoubleVerticalBar", {226, 136, 165, 0}},
+{(unsigned char*)"DownArrow", {226, 134, 147, 0}},
+{(unsigned char*)"DownArrowBar", {226, 164, 147, 0}},
+{(unsigned char*)"DownArrowUpArrow", {226, 135, 181, 0}},
+{(unsigned char*)"DownBreve", {204, 145, 0}},
+{(unsigned char*)"DownLeftRightVector", {226, 165, 144, 0}},
+{(unsigned char*)"DownLeftTeeVector", {226, 165, 158, 0}},
+{(unsigned char*)"DownLeftVector", {226, 134, 189, 0}},
+{(unsigned char*)"DownLeftVectorBar", {226, 165, 150, 0}},
+{(unsigned char*)"DownRightTeeVector", {226, 165, 159, 0}},
+{(unsigned char*)"DownRightVector", {226, 135, 129, 0}},
+{(unsigned char*)"DownRightVectorBar", {226, 165, 151, 0}},
+{(unsigned char*)"DownTee", {226, 138, 164, 0}},
+{(unsigned char*)"DownTeeArrow", {226, 134, 167, 0}},
+{(unsigned char*)"Downarrow", {226, 135, 147, 0}},
+{(unsigned char*)"Dscr", {240, 157, 146, 159, 0}},
+{(unsigned char*)"Dstrok", {196, 144, 0}},
+{(unsigned char*)"ENG", {197, 138, 0}},
+{(unsigned char*)"ETH", {195, 144, 0}},
+{(unsigned char*)"Eacute", {195, 137, 0}},
+{(unsigned char*)"Ecaron", {196, 154, 0}},
+{(unsigned char*)"Ecirc", {195, 138, 0}},
+{(unsigned char*)"Ecy", {208, 173, 0}},
+{(unsigned char*)"Edot", {196, 150, 0}},
+{(unsigned char*)"Efr", {240, 157, 148, 136, 0}},
+{(unsigned char*)"Egrave", {195, 136, 0}},
+{(unsigned char*)"Element", {226, 136, 136, 0}},
+{(unsigned char*)"Emacr", {196, 146, 0}},
+{(unsigned char*)"EmptySmallSquare", {226, 151, 187, 0}},
+{(unsigned char*)"EmptyVerySmallSquare", {226, 150, 171, 0}},
+{(unsigned char*)"Eogon", {196, 152, 0}},
+{(unsigned char*)"Eopf", {240, 157, 148, 188, 0}},
+{(unsigned char*)"Epsilon", {206, 149, 0}},
+{(unsigned char*)"Equal", {226, 169, 181, 0}},
+{(unsigned char*)"EqualTilde", {226, 137, 130, 0}},
+{(unsigned char*)"Equilibrium", {226, 135, 140, 0}},
+{(unsigned char*)"Escr", {226, 132, 176, 0}},
+{(unsigned char*)"Esim", {226, 169, 179, 0}},
+{(unsigned char*)"Eta", {206, 151, 0}},
+{(unsigned char*)"Euml", {195, 139, 0}},
+{(unsigned char*)"Exists", {226, 136, 131, 0}},
+{(unsigned char*)"ExponentialE", {226, 133, 135, 0}},
+{(unsigned char*)"Fcy", {208, 164, 0}},
+{(unsigned char*)"Ffr", {240, 157, 148, 137, 0}},
+{(unsigned char*)"FilledSmallSquare", {226, 151, 188, 0}},
+{(unsigned char*)"FilledVerySmallSquare", {226, 150, 170, 0}},
+{(unsigned char*)"Fopf", {240, 157, 148, 189, 0}},
+{(unsigned char*)"ForAll", {226, 136, 128, 0}},
+{(unsigned char*)"Fouriertrf", {226, 132, 177, 0}},
+{(unsigned char*)"Fscr", {226, 132, 177, 0}},
+{(unsigned char*)"GJcy", {208, 131, 0}},
+{(unsigned char*)"GT", {62, 0}},
+{(unsigned char*)"Gamma", {206, 147, 0}},
+{(unsigned char*)"Gammad", {207, 156, 0}},
+{(unsigned char*)"Gbreve", {196, 158, 0}},
+{(unsigned char*)"Gcedil", {196, 162, 0}},
+{(unsigned char*)"Gcirc", {196, 156, 0}},
+{(unsigned char*)"Gcy", {208, 147, 0}},
+{(unsigned char*)"Gdot", {196, 160, 0}},
+{(unsigned char*)"Gfr", {240, 157, 148, 138, 0}},
+{(unsigned char*)"Gg", {226, 139, 153, 0}},
+{(unsigned char*)"Gopf", {240, 157, 148, 190, 0}},
+{(unsigned char*)"GreaterEqual", {226, 137, 165, 0}},
+{(unsigned char*)"GreaterEqualLess", {226, 139, 155, 0}},
+{(unsigned char*)"GreaterFullEqual", {226, 137, 167, 0}},
+{(unsigned char*)"GreaterGreater", {226, 170, 162, 0}},
+{(unsigned char*)"GreaterLess", {226, 137, 183, 0}},
+{(unsigned char*)"GreaterSlantEqual", {226, 169, 190, 0}},
+{(unsigned char*)"GreaterTilde", {226, 137, 179, 0}},
+{(unsigned char*)"Gscr", {240, 157, 146, 162, 0}},
+{(unsigned char*)"Gt", {226, 137, 171, 0}},
+{(unsigned char*)"HARDcy", {208, 170, 0}},
+{(unsigned char*)"Hacek", {203, 135, 0}},
+{(unsigned char*)"Hat", {94, 0}},
+{(unsigned char*)"Hcirc", {196, 164, 0}},
+{(unsigned char*)"Hfr", {226, 132, 140, 0}},
+{(unsigned char*)"HilbertSpace", {226, 132, 139, 0}},
+{(unsigned char*)"Hopf", {226, 132, 141, 0}},
+{(unsigned char*)"HorizontalLine", {226, 148, 128, 0}},
+{(unsigned char*)"Hscr", {226, 132, 139, 0}},
+{(unsigned char*)"Hstrok", {196, 166, 0}},
+{(unsigned char*)"HumpDownHump", {226, 137, 142, 0}},
+{(unsigned char*)"HumpEqual", {226, 137, 143, 0}},
+{(unsigned char*)"IEcy", {208, 149, 0}},
+{(unsigned char*)"IJlig", {196, 178, 0}},
+{(unsigned char*)"IOcy", {208, 129, 0}},
+{(unsigned char*)"Iacute", {195, 141, 0}},
+{(unsigned char*)"Icirc", {195, 142, 0}},
+{(unsigned char*)"Icy", {208, 152, 0}},
+{(unsigned char*)"Idot", {196, 176, 0}},
+{(unsigned char*)"Ifr", {226, 132, 145, 0}},
+{(unsigned char*)"Igrave", {195, 140, 0}},
+{(unsigned char*)"Im", {226, 132, 145, 0}},
+{(unsigned char*)"Imacr", {196, 170, 0}},
+{(unsigned char*)"ImaginaryI", {226, 133, 136, 0}},
+{(unsigned char*)"Implies", {226, 135, 146, 0}},
+{(unsigned char*)"Int", {226, 136, 172, 0}},
+{(unsigned char*)"Integral", {226, 136, 171, 0}},
+{(unsigned char*)"Intersection", {226, 139, 130, 0}},
+{(unsigned char*)"InvisibleComma", {226, 129, 163, 0}},
+{(unsigned char*)"InvisibleTimes", {226, 129, 162, 0}},
+{(unsigned char*)"Iogon", {196, 174, 0}},
+{(unsigned char*)"Iopf", {240, 157, 149, 128, 0}},
+{(unsigned char*)"Iota", {206, 153, 0}},
+{(unsigned char*)"Iscr", {226, 132, 144, 0}},
+{(unsigned char*)"Itilde", {196, 168, 0}},
+{(unsigned char*)"Iukcy", {208, 134, 0}},
+{(unsigned char*)"Iuml", {195, 143, 0}},
+{(unsigned char*)"Jcirc", {196, 180, 0}},
+{(unsigned char*)"Jcy", {208, 153, 0}},
+{(unsigned char*)"Jfr", {240, 157, 148, 141, 0}},
+{(unsigned char*)"Jopf", {240, 157, 149, 129, 0}},
+{(unsigned char*)"Jscr", {240, 157, 146, 165, 0}},
+{(unsigned char*)"Jsercy", {208, 136, 0}},
+{(unsigned char*)"Jukcy", {208, 132, 0}},
+{(unsigned char*)"KHcy", {208, 165, 0}},
+{(unsigned char*)"KJcy", {208, 140, 0}},
+{(unsigned char*)"Kappa", {206, 154, 0}},
+{(unsigned char*)"Kcedil", {196, 182, 0}},
+{(unsigned char*)"Kcy", {208, 154, 0}},
+{(unsigned char*)"Kfr", {240, 157, 148, 142, 0}},
+{(unsigned char*)"Kopf", {240, 157, 149, 130, 0}},
+{(unsigned char*)"Kscr", {240, 157, 146, 166, 0}},
+{(unsigned char*)"LJcy", {208, 137, 0}},
+{(unsigned char*)"LT", {60, 0}},
+{(unsigned char*)"Lacute", {196, 185, 0}},
+{(unsigned char*)"Lambda", {206, 155, 0}},
+{(unsigned char*)"Lang", {226, 159, 170, 0}},
+{(unsigned char*)"Laplacetrf", {226, 132, 146, 0}},
+{(unsigned char*)"Larr", {226, 134, 158, 0}},
+{(unsigned char*)"Lcaron", {196, 189, 0}},
+{(unsigned char*)"Lcedil", {196, 187, 0}},
+{(unsigned char*)"Lcy", {208, 155, 0}},
+{(unsigned char*)"LeftAngleBracket", {226, 159, 168, 0}},
+{(unsigned char*)"LeftArrow", {226, 134, 144, 0}},
+{(unsigned char*)"LeftArrowBar", {226, 135, 164, 0}},
+{(unsigned char*)"LeftArrowRightArrow", {226, 135, 134, 0}},
+{(unsigned char*)"LeftCeiling", {226, 140, 136, 0}},
+{(unsigned char*)"LeftDoubleBracket", {226, 159, 166, 0}},
+{(unsigned char*)"LeftDownTeeVector", {226, 165, 161, 0}},
+{(unsigned char*)"LeftDownVector", {226, 135, 131, 0}},
+{(unsigned char*)"LeftDownVectorBar", {226, 165, 153, 0}},
+{(unsigned char*)"LeftFloor", {226, 140, 138, 0}},
+{(unsigned char*)"LeftRightArrow", {226, 134, 148, 0}},
+{(unsigned char*)"LeftRightVector", {226, 165, 142, 0}},
+{(unsigned char*)"LeftTee", {226, 138, 163, 0}},
+{(unsigned char*)"LeftTeeArrow", {226, 134, 164, 0}},
+{(unsigned char*)"LeftTeeVector", {226, 165, 154, 0}},
+{(unsigned char*)"LeftTriangle", {226, 138, 178, 0}},
+{(unsigned char*)"LeftTriangleBar", {226, 167, 143, 0}},
+{(unsigned char*)"LeftTriangleEqual", {226, 138, 180, 0}},
+{(unsigned char*)"LeftUpDownVector", {226, 165, 145, 0}},
+{(unsigned char*)"LeftUpTeeVector", {226, 165, 160, 0}},
+{(unsigned char*)"LeftUpVector", {226, 134, 191, 0}},
+{(unsigned char*)"LeftUpVectorBar", {226, 165, 152, 0}},
+{(unsigned char*)"LeftVector", {226, 134, 188, 0}},
+{(unsigned char*)"LeftVectorBar", {226, 165, 146, 0}},
+{(unsigned char*)"Leftarrow", {226, 135, 144, 0}},
+{(unsigned char*)"Leftrightarrow", {226, 135, 148, 0}},
+{(unsigned char*)"LessEqualGreater", {226, 139, 154, 0}},
+{(unsigned char*)"LessFullEqual", {226, 137, 166, 0}},
+{(unsigned char*)"LessGreater", {226, 137, 182, 0}},
+{(unsigned char*)"LessLess", {226, 170, 161, 0}},
+{(unsigned char*)"LessSlantEqual", {226, 169, 189, 0}},
+{(unsigned char*)"LessTilde", {226, 137, 178, 0}},
+{(unsigned char*)"Lfr", {240, 157, 148, 143, 0}},
+{(unsigned char*)"Ll", {226, 139, 152, 0}},
+{(unsigned char*)"Lleftarrow", {226, 135, 154, 0}},
+{(unsigned char*)"Lmidot", {196, 191, 0}},
+{(unsigned char*)"LongLeftArrow", {226, 159, 181, 0}},
+{(unsigned char*)"LongLeftRightArrow", {226, 159, 183, 0}},
+{(unsigned char*)"LongRightArrow", {226, 159, 182, 0}},
+{(unsigned char*)"Longleftarrow", {226, 159, 184, 0}},
+{(unsigned char*)"Longleftrightarrow", {226, 159, 186, 0}},
+{(unsigned char*)"Longrightarrow", {226, 159, 185, 0}},
+{(unsigned char*)"Lopf", {240, 157, 149, 131, 0}},
+{(unsigned char*)"LowerLeftArrow", {226, 134, 153, 0}},
+{(unsigned char*)"LowerRightArrow", {226, 134, 152, 0}},
+{(unsigned char*)"Lscr", {226, 132, 146, 0}},
+{(unsigned char*)"Lsh", {226, 134, 176, 0}},
+{(unsigned char*)"Lstrok", {197, 129, 0}},
+{(unsigned char*)"Lt", {226, 137, 170, 0}},
+{(unsigned char*)"Map", {226, 164, 133, 0}},
+{(unsigned char*)"Mcy", {208, 156, 0}},
+{(unsigned char*)"MediumSpace", {226, 129, 159, 0}},
+{(unsigned char*)"Mellintrf", {226, 132, 179, 0}},
+{(unsigned char*)"Mfr", {240, 157, 148, 144, 0}},
+{(unsigned char*)"MinusPlus", {226, 136, 147, 0}},
+{(unsigned char*)"Mopf", {240, 157, 149, 132, 0}},
+{(unsigned char*)"Mscr", {226, 132, 179, 0}},
+{(unsigned char*)"Mu", {206, 156, 0}},
+{(unsigned char*)"NJcy", {208, 138, 0}},
+{(unsigned char*)"Nacute", {197, 131, 0}},
+{(unsigned char*)"Ncaron", {197, 135, 0}},
+{(unsigned char*)"Ncedil", {197, 133, 0}},
+{(unsigned char*)"Ncy", {208, 157, 0}},
+{(unsigned char*)"NegativeMediumSpace", {226, 128, 139, 0}},
+{(unsigned char*)"NegativeThickSpace", {226, 128, 139, 0}},
+{(unsigned char*)"NegativeThinSpace", {226, 128, 139, 0}},
+{(unsigned char*)"NegativeVeryThinSpace", {226, 128, 139, 0}},
+{(unsigned char*)"NestedGreaterGreater", {226, 137, 171, 0}},
+{(unsigned char*)"NestedLessLess", {226, 137, 170, 0}},
+{(unsigned char*)"NewLine", {10, 0}},
+{(unsigned char*)"Nfr", {240, 157, 148, 145, 0}},
+{(unsigned char*)"NoBreak", {226, 129, 160, 0}},
+{(unsigned char*)"NonBreakingSpace", {194, 160, 0}},
+{(unsigned char*)"Nopf", {226, 132, 149, 0}},
+{(unsigned char*)"Not", {226, 171, 172, 0}},
+{(unsigned char*)"NotCongruent", {226, 137, 162, 0}},
+{(unsigned char*)"NotCupCap", {226, 137, 173, 0}},
+{(unsigned char*)"NotDoubleVerticalBar", {226, 136, 166, 0}},
+{(unsigned char*)"NotElement", {226, 136, 137, 0}},
+{(unsigned char*)"NotEqual", {226, 137, 160, 0}},
+{(unsigned char*)"NotEqualTilde", {226, 137, 130, 204, 184, 0}},
+{(unsigned char*)"NotExists", {226, 136, 132, 0}},
+{(unsigned char*)"NotGreater", {226, 137, 175, 0}},
+{(unsigned char*)"NotGreaterEqual", {226, 137, 177, 0}},
+{(unsigned char*)"NotGreaterFullEqual", {226, 137, 167, 204, 184, 0}},
+{(unsigned char*)"NotGreaterGreater", {226, 137, 171, 204, 184, 0}},
+{(unsigned char*)"NotGreaterLess", {226, 137, 185, 0}},
+{(unsigned char*)"NotGreaterSlantEqual", {226, 169, 190, 204, 184, 0}},
+{(unsigned char*)"NotGreaterTilde", {226, 137, 181, 0}},
+{(unsigned char*)"NotHumpDownHump", {226, 137, 142, 204, 184, 0}},
+{(unsigned char*)"NotHumpEqual", {226, 137, 143, 204, 184, 0}},
+{(unsigned char*)"NotLeftTriangle", {226, 139, 170, 0}},
+{(unsigned char*)"NotLeftTriangleBar", {226, 167, 143, 204, 184, 0}},
+{(unsigned char*)"NotLeftTriangleEqual", {226, 139, 172, 0}},
+{(unsigned char*)"NotLess", {226, 137, 174, 0}},
+{(unsigned char*)"NotLessEqual", {226, 137, 176, 0}},
+{(unsigned char*)"NotLessGreater", {226, 137, 184, 0}},
+{(unsigned char*)"NotLessLess", {226, 137, 170, 204, 184, 0}},
+{(unsigned char*)"NotLessSlantEqual", {226, 169, 189, 204, 184, 0}},
+{(unsigned char*)"NotLessTilde", {226, 137, 180, 0}},
+{(unsigned char*)"NotNestedGreaterGreater", {226, 170, 162, 204, 184, 0}},
+{(unsigned char*)"NotNestedLessLess", {226, 170, 161, 204, 184, 0}},
+{(unsigned char*)"NotPrecedes", {226, 138, 128, 0}},
+{(unsigned char*)"NotPrecedesEqual", {226, 170, 175, 204, 184, 0}},
+{(unsigned char*)"NotPrecedesSlantEqual", {226, 139, 160, 0}},
+{(unsigned char*)"NotReverseElement", {226, 136, 140, 0}},
+{(unsigned char*)"NotRightTriangle", {226, 139, 171, 0}},
+{(unsigned char*)"NotRightTriangleBar", {226, 167, 144, 204, 184, 0}},
+{(unsigned char*)"NotRightTriangleEqual", {226, 139, 173, 0}},
+{(unsigned char*)"NotSquareSubset", {226, 138, 143, 204, 184, 0}},
+{(unsigned char*)"NotSquareSubsetEqual", {226, 139, 162, 0}},
+{(unsigned char*)"NotSquareSuperset", {226, 138, 144, 204, 184, 0}},
+{(unsigned char*)"NotSquareSupersetEqual", {226, 139, 163, 0}},
+{(unsigned char*)"NotSubset", {226, 138, 130, 226, 131, 146, 0}},
+{(unsigned char*)"NotSubsetEqual", {226, 138, 136, 0}},
+{(unsigned char*)"NotSucceeds", {226, 138, 129, 0}},
+{(unsigned char*)"NotSucceedsEqual", {226, 170, 176, 204, 184, 0}},
+{(unsigned char*)"NotSucceedsSlantEqual", {226, 139, 161, 0}},
+{(unsigned char*)"NotSucceedsTilde", {226, 137, 191, 204, 184, 0}},
+{(unsigned char*)"NotSuperset", {226, 138, 131, 226, 131, 146, 0}},
+{(unsigned char*)"NotSupersetEqual", {226, 138, 137, 0}},
+{(unsigned char*)"NotTilde", {226, 137, 129, 0}},
+{(unsigned char*)"NotTildeEqual", {226, 137, 132, 0}},
+{(unsigned char*)"NotTildeFullEqual", {226, 137, 135, 0}},
+{(unsigned char*)"NotTildeTilde", {226, 137, 137, 0}},
+{(unsigned char*)"NotVerticalBar", {226, 136, 164, 0}},
+{(unsigned char*)"Nscr", {240, 157, 146, 169, 0}},
+{(unsigned char*)"Ntilde", {195, 145, 0}},
+{(unsigned char*)"Nu", {206, 157, 0}},
+{(unsigned char*)"OElig", {197, 146, 0}},
+{(unsigned char*)"Oacute", {195, 147, 0}},
+{(unsigned char*)"Ocirc", {195, 148, 0}},
+{(unsigned char*)"Ocy", {208, 158, 0}},
+{(unsigned char*)"Odblac", {197, 144, 0}},
+{(unsigned char*)"Ofr", {240, 157, 148, 146, 0}},
+{(unsigned char*)"Ograve", {195, 146, 0}},
+{(unsigned char*)"Omacr", {197, 140, 0}},
+{(unsigned char*)"Omega", {206, 169, 0}},
+{(unsigned char*)"Omicron", {206, 159, 0}},
+{(unsigned char*)"Oopf", {240, 157, 149, 134, 0}},
+{(unsigned char*)"OpenCurlyDoubleQuote", {226, 128, 156, 0}},
+{(unsigned char*)"OpenCurlyQuote", {226, 128, 152, 0}},
+{(unsigned char*)"Or", {226, 169, 148, 0}},
+{(unsigned char*)"Oscr", {240, 157, 146, 170, 0}},
+{(unsigned char*)"Oslash", {195, 152, 0}},
+{(unsigned char*)"Otilde", {195, 149, 0}},
+{(unsigned char*)"Otimes", {226, 168, 183, 0}},
+{(unsigned char*)"Ouml", {195, 150, 0}},
+{(unsigned char*)"OverBar", {226, 128, 190, 0}},
+{(unsigned char*)"OverBrace", {226, 143, 158, 0}},
+{(unsigned char*)"OverBracket", {226, 142, 180, 0}},
+{(unsigned char*)"OverParenthesis", {226, 143, 156, 0}},
+{(unsigned char*)"PartialD", {226, 136, 130, 0}},
+{(unsigned char*)"Pcy", {208, 159, 0}},
+{(unsigned char*)"Pfr", {240, 157, 148, 147, 0}},
+{(unsigned char*)"Phi", {206, 166, 0}},
+{(unsigned char*)"Pi", {206, 160, 0}},
+{(unsigned char*)"PlusMinus", {194, 177, 0}},
+{(unsigned char*)"Poincareplane", {226, 132, 140, 0}},
+{(unsigned char*)"Popf", {226, 132, 153, 0}},
+{(unsigned char*)"Pr", {226, 170, 187, 0}},
+{(unsigned char*)"Precedes", {226, 137, 186, 0}},
+{(unsigned char*)"PrecedesEqual", {226, 170, 175, 0}},
+{(unsigned char*)"PrecedesSlantEqual", {226, 137, 188, 0}},
+{(unsigned char*)"PrecedesTilde", {226, 137, 190, 0}},
+{(unsigned char*)"Prime", {226, 128, 179, 0}},
+{(unsigned char*)"Product", {226, 136, 143, 0}},
+{(unsigned char*)"Proportion", {226, 136, 183, 0}},
+{(unsigned char*)"Proportional", {226, 136, 157, 0}},
+{(unsigned char*)"Pscr", {240, 157, 146, 171, 0}},
+{(unsigned char*)"Psi", {206, 168, 0}},
+{(unsigned char*)"QUOT", {34, 0}},
+{(unsigned char*)"Qfr", {240, 157, 148, 148, 0}},
+{(unsigned char*)"Qopf", {226, 132, 154, 0}},
+{(unsigned char*)"Qscr", {240, 157, 146, 172, 0}},
+{(unsigned char*)"RBarr", {226, 164, 144, 0}},
+{(unsigned char*)"REG", {194, 174, 0}},
+{(unsigned char*)"Racute", {197, 148, 0}},
+{(unsigned char*)"Rang", {226, 159, 171, 0}},
+{(unsigned char*)"Rarr", {226, 134, 160, 0}},
+{(unsigned char*)"Rarrtl", {226, 164, 150, 0}},
+{(unsigned char*)"Rcaron", {197, 152, 0}},
+{(unsigned char*)"Rcedil", {197, 150, 0}},
+{(unsigned char*)"Rcy", {208, 160, 0}},
+{(unsigned char*)"Re", {226, 132, 156, 0}},
+{(unsigned char*)"ReverseElement", {226, 136, 139, 0}},
+{(unsigned char*)"ReverseEquilibrium", {226, 135, 139, 0}},
+{(unsigned char*)"ReverseUpEquilibrium", {226, 165, 175, 0}},
+{(unsigned char*)"Rfr", {226, 132, 156, 0}},
+{(unsigned char*)"Rho", {206, 161, 0}},
+{(unsigned char*)"RightAngleBracket", {226, 159, 169, 0}},
+{(unsigned char*)"RightArrow", {226, 134, 146, 0}},
+{(unsigned char*)"RightArrowBar", {226, 135, 165, 0}},
+{(unsigned char*)"RightArrowLeftArrow", {226, 135, 132, 0}},
+{(unsigned char*)"RightCeiling", {226, 140, 137, 0}},
+{(unsigned char*)"RightDoubleBracket", {226, 159, 167, 0}},
+{(unsigned char*)"RightDownTeeVector", {226, 165, 157, 0}},
+{(unsigned char*)"RightDownVector", {226, 135, 130, 0}},
+{(unsigned char*)"RightDownVectorBar", {226, 165, 149, 0}},
+{(unsigned char*)"RightFloor", {226, 140, 139, 0}},
+{(unsigned char*)"RightTee", {226, 138, 162, 0}},
+{(unsigned char*)"RightTeeArrow", {226, 134, 166, 0}},
+{(unsigned char*)"RightTeeVector", {226, 165, 155, 0}},
+{(unsigned char*)"RightTriangle", {226, 138, 179, 0}},
+{(unsigned char*)"RightTriangleBar", {226, 167, 144, 0}},
+{(unsigned char*)"RightTriangleEqual", {226, 138, 181, 0}},
+{(unsigned char*)"RightUpDownVector", {226, 165, 143, 0}},
+{(unsigned char*)"RightUpTeeVector", {226, 165, 156, 0}},
+{(unsigned char*)"RightUpVector", {226, 134, 190, 0}},
+{(unsigned char*)"RightUpVectorBar", {226, 165, 148, 0}},
+{(unsigned char*)"RightVector", {226, 135, 128, 0}},
+{(unsigned char*)"RightVectorBar", {226, 165, 147, 0}},
+{(unsigned char*)"Rightarrow", {226, 135, 146, 0}},
+{(unsigned char*)"Ropf", {226, 132, 157, 0}},
+{(unsigned char*)"RoundImplies", {226, 165, 176, 0}},
+{(unsigned char*)"Rrightarrow", {226, 135, 155, 0}},
+{(unsigned char*)"Rscr", {226, 132, 155, 0}},
+{(unsigned char*)"Rsh", {226, 134, 177, 0}},
+{(unsigned char*)"RuleDelayed", {226, 167, 180, 0}},
+{(unsigned char*)"SHCHcy", {208, 169, 0}},
+{(unsigned char*)"SHcy", {208, 168, 0}},
+{(unsigned char*)"SOFTcy", {208, 172, 0}},
+{(unsigned char*)"Sacute", {197, 154, 0}},
+{(unsigned char*)"Sc", {226, 170, 188, 0}},
+{(unsigned char*)"Scaron", {197, 160, 0}},
+{(unsigned char*)"Scedil", {197, 158, 0}},
+{(unsigned char*)"Scirc", {197, 156, 0}},
+{(unsigned char*)"Scy", {208, 161, 0}},
+{(unsigned char*)"Sfr", {240, 157, 148, 150, 0}},
+{(unsigned char*)"ShortDownArrow", {226, 134, 147, 0}},
+{(unsigned char*)"ShortLeftArrow", {226, 134, 144, 0}},
+{(unsigned char*)"ShortRightArrow", {226, 134, 146, 0}},
+{(unsigned char*)"ShortUpArrow", {226, 134, 145, 0}},
+{(unsigned char*)"Sigma", {206, 163, 0}},
+{(unsigned char*)"SmallCircle", {226, 136, 152, 0}},
+{(unsigned char*)"Sopf", {240, 157, 149, 138, 0}},
+{(unsigned char*)"Sqrt", {226, 136, 154, 0}},
+{(unsigned char*)"Square", {226, 150, 161, 0}},
+{(unsigned char*)"SquareIntersection", {226, 138, 147, 0}},
+{(unsigned char*)"SquareSubset", {226, 138, 143, 0}},
+{(unsigned char*)"SquareSubsetEqual", {226, 138, 145, 0}},
+{(unsigned char*)"SquareSuperset", {226, 138, 144, 0}},
+{(unsigned char*)"SquareSupersetEqual", {226, 138, 146, 0}},
+{(unsigned char*)"SquareUnion", {226, 138, 148, 0}},
+{(unsigned char*)"Sscr", {240, 157, 146, 174, 0}},
+{(unsigned char*)"Star", {226, 139, 134, 0}},
+{(unsigned char*)"Sub", {226, 139, 144, 0}},
+{(unsigned char*)"Subset", {226, 139, 144, 0}},
+{(unsigned char*)"SubsetEqual", {226, 138, 134, 0}},
+{(unsigned char*)"Succeeds", {226, 137, 187, 0}},
+{(unsigned char*)"SucceedsEqual", {226, 170, 176, 0}},
+{(unsigned char*)"SucceedsSlantEqual", {226, 137, 189, 0}},
+{(unsigned char*)"SucceedsTilde", {226, 137, 191, 0}},
+{(unsigned char*)"SuchThat", {226, 136, 139, 0}},
+{(unsigned char*)"Sum", {226, 136, 145, 0}},
+{(unsigned char*)"Sup", {226, 139, 145, 0}},
+{(unsigned char*)"Superset", {226, 138, 131, 0}},
+{(unsigned char*)"SupersetEqual", {226, 138, 135, 0}},
+{(unsigned char*)"Supset", {226, 139, 145, 0}},
+{(unsigned char*)"THORN", {195, 158, 0}},
+{(unsigned char*)"TRADE", {226, 132, 162, 0}},
+{(unsigned char*)"TSHcy", {208, 139, 0}},
+{(unsigned char*)"TScy", {208, 166, 0}},
+{(unsigned char*)"Tab", {9, 0}},
+{(unsigned char*)"Tau", {206, 164, 0}},
+{(unsigned char*)"Tcaron", {197, 164, 0}},
+{(unsigned char*)"Tcedil", {197, 162, 0}},
+{(unsigned char*)"Tcy", {208, 162, 0}},
+{(unsigned char*)"Tfr", {240, 157, 148, 151, 0}},
+{(unsigned char*)"Therefore", {226, 136, 180, 0}},
+{(unsigned char*)"Theta", {206, 152, 0}},
+{(unsigned char*)"ThickSpace", {226, 129, 159, 226, 128, 138, 0}},
+{(unsigned char*)"ThinSpace", {226, 128, 137, 0}},
+{(unsigned char*)"Tilde", {226, 136, 188, 0}},
+{(unsigned char*)"TildeEqual", {226, 137, 131, 0}},
+{(unsigned char*)"TildeFullEqual", {226, 137, 133, 0}},
+{(unsigned char*)"TildeTilde", {226, 137, 136, 0}},
+{(unsigned char*)"Topf", {240, 157, 149, 139, 0}},
+{(unsigned char*)"TripleDot", {226, 131, 155, 0}},
+{(unsigned char*)"Tscr", {240, 157, 146, 175, 0}},
+{(unsigned char*)"Tstrok", {197, 166, 0}},
+{(unsigned char*)"Uacute", {195, 154, 0}},
+{(unsigned char*)"Uarr", {226, 134, 159, 0}},
+{(unsigned char*)"Uarrocir", {226, 165, 137, 0}},
+{(unsigned char*)"Ubrcy", {208, 142, 0}},
+{(unsigned char*)"Ubreve", {197, 172, 0}},
+{(unsigned char*)"Ucirc", {195, 155, 0}},
+{(unsigned char*)"Ucy", {208, 163, 0}},
+{(unsigned char*)"Udblac", {197, 176, 0}},
+{(unsigned char*)"Ufr", {240, 157, 148, 152, 0}},
+{(unsigned char*)"Ugrave", {195, 153, 0}},
+{(unsigned char*)"Umacr", {197, 170, 0}},
+{(unsigned char*)"UnderBar", {95, 0}},
+{(unsigned char*)"UnderBrace", {226, 143, 159, 0}},
+{(unsigned char*)"UnderBracket", {226, 142, 181, 0}},
+{(unsigned char*)"UnderParenthesis", {226, 143, 157, 0}},
+{(unsigned char*)"Union", {226, 139, 131, 0}},
+{(unsigned char*)"UnionPlus", {226, 138, 142, 0}},
+{(unsigned char*)"Uogon", {197, 178, 0}},
+{(unsigned char*)"Uopf", {240, 157, 149, 140, 0}},
+{(unsigned char*)"UpArrow", {226, 134, 145, 0}},
+{(unsigned char*)"UpArrowBar", {226, 164, 146, 0}},
+{(unsigned char*)"UpArrowDownArrow", {226, 135, 133, 0}},
+{(unsigned char*)"UpDownArrow", {226, 134, 149, 0}},
+{(unsigned char*)"UpEquilibrium", {226, 165, 174, 0}},
+{(unsigned char*)"UpTee", {226, 138, 165, 0}},
+{(unsigned char*)"UpTeeArrow", {226, 134, 165, 0}},
+{(unsigned char*)"Uparrow", {226, 135, 145, 0}},
+{(unsigned char*)"Updownarrow", {226, 135, 149, 0}},
+{(unsigned char*)"UpperLeftArrow", {226, 134, 150, 0}},
+{(unsigned char*)"UpperRightArrow", {226, 134, 151, 0}},
+{(unsigned char*)"Upsi", {207, 146, 0}},
+{(unsigned char*)"Upsilon", {206, 165, 0}},
+{(unsigned char*)"Uring", {197, 174, 0}},
+{(unsigned char*)"Uscr", {240, 157, 146, 176, 0}},
+{(unsigned char*)"Utilde", {197, 168, 0}},
+{(unsigned char*)"Uuml", {195, 156, 0}},
+{(unsigned char*)"VDash", {226, 138, 171, 0}},
+{(unsigned char*)"Vbar", {226, 171, 171, 0}},
+{(unsigned char*)"Vcy", {208, 146, 0}},
+{(unsigned char*)"Vdash", {226, 138, 169, 0}},
+{(unsigned char*)"Vdashl", {226, 171, 166, 0}},
+{(unsigned char*)"Vee", {226, 139, 129, 0}},
+{(unsigned char*)"Verbar", {226, 128, 150, 0}},
+{(unsigned char*)"Vert", {226, 128, 150, 0}},
+{(unsigned char*)"VerticalBar", {226, 136, 163, 0}},
+{(unsigned char*)"VerticalLine", {124, 0}},
+{(unsigned char*)"VerticalSeparator", {226, 157, 152, 0}},
+{(unsigned char*)"VerticalTilde", {226, 137, 128, 0}},
+{(unsigned char*)"VeryThinSpace", {226, 128, 138, 0}},
+{(unsigned char*)"Vfr", {240, 157, 148, 153, 0}},
+{(unsigned char*)"Vopf", {240, 157, 149, 141, 0}},
+{(unsigned char*)"Vscr", {240, 157, 146, 177, 0}},
+{(unsigned char*)"Vvdash", {226, 138, 170, 0}},
+{(unsigned char*)"Wcirc", {197, 180, 0}},
+{(unsigned char*)"Wedge", {226, 139, 128, 0}},
+{(unsigned char*)"Wfr", {240, 157, 148, 154, 0}},
+{(unsigned char*)"Wopf", {240, 157, 149, 142, 0}},
+{(unsigned char*)"Wscr", {240, 157, 146, 178, 0}},
+{(unsigned char*)"Xfr", {240, 157, 148, 155, 0}},
+{(unsigned char*)"Xi", {206, 158, 0}},
+{(unsigned char*)"Xopf", {240, 157, 149, 143, 0}},
+{(unsigned char*)"Xscr", {240, 157, 146, 179, 0}},
+{(unsigned char*)"YAcy", {208, 175, 0}},
+{(unsigned char*)"YIcy", {208, 135, 0}},
+{(unsigned char*)"YUcy", {208, 174, 0}},
+{(unsigned char*)"Yacute", {195, 157, 0}},
+{(unsigned char*)"Ycirc", {197, 182, 0}},
+{(unsigned char*)"Ycy", {208, 171, 0}},
+{(unsigned char*)"Yfr", {240, 157, 148, 156, 0}},
+{(unsigned char*)"Yopf", {240, 157, 149, 144, 0}},
+{(unsigned char*)"Yscr", {240, 157, 146, 180, 0}},
+{(unsigned char*)"Yuml", {197, 184, 0}},
+{(unsigned char*)"ZHcy", {208, 150, 0}},
+{(unsigned char*)"Zacute", {197, 185, 0}},
+{(unsigned char*)"Zcaron", {197, 189, 0}},
+{(unsigned char*)"Zcy", {208, 151, 0}},
+{(unsigned char*)"Zdot", {197, 187, 0}},
+{(unsigned char*)"ZeroWidthSpace", {226, 128, 139, 0}},
+{(unsigned char*)"Zeta", {206, 150, 0}},
+{(unsigned char*)"Zfr", {226, 132, 168, 0}},
+{(unsigned char*)"Zopf", {226, 132, 164, 0}},
+{(unsigned char*)"Zscr", {240, 157, 146, 181, 0}},
+{(unsigned char*)"aacute", {195, 161, 0}},
+{(unsigned char*)"abreve", {196, 131, 0}},
+{(unsigned char*)"ac", {226, 136, 190, 0}},
+{(unsigned char*)"acE", {226, 136, 190, 204, 179, 0}},
+{(unsigned char*)"acd", {226, 136, 191, 0}},
+{(unsigned char*)"acirc", {195, 162, 0}},
+{(unsigned char*)"acute", {194, 180, 0}},
+{(unsigned char*)"acy", {208, 176, 0}},
+{(unsigned char*)"aelig", {195, 166, 0}},
+{(unsigned char*)"af", {226, 129, 161, 0}},
+{(unsigned char*)"afr", {240, 157, 148, 158, 0}},
+{(unsigned char*)"agrave", {195, 160, 0}},
+{(unsigned char*)"alefsym", {226, 132, 181, 0}},
+{(unsigned char*)"aleph", {226, 132, 181, 0}},
+{(unsigned char*)"alpha", {206, 177, 0}},
+{(unsigned char*)"amacr", {196, 129, 0}},
+{(unsigned char*)"amalg", {226, 168, 191, 0}},
+{(unsigned char*)"amp", {38, 0}},
+{(unsigned char*)"and", {226, 136, 167, 0}},
+{(unsigned char*)"andand", {226, 169, 149, 0}},
+{(unsigned char*)"andd", {226, 169, 156, 0}},
+{(unsigned char*)"andslope", {226, 169, 152, 0}},
+{(unsigned char*)"andv", {226, 169, 154, 0}},
+{(unsigned char*)"ang", {226, 136, 160, 0}},
+{(unsigned char*)"ange", {226, 166, 164, 0}},
+{(unsigned char*)"angle", {226, 136, 160, 0}},
+{(unsigned char*)"angmsd", {226, 136, 161, 0}},
+{(unsigned char*)"angmsdaa", {226, 166, 168, 0}},
+{(unsigned char*)"angmsdab", {226, 166, 169, 0}},
+{(unsigned char*)"angmsdac", {226, 166, 170, 0}},
+{(unsigned char*)"angmsdad", {226, 166, 171, 0}},
+{(unsigned char*)"angmsdae", {226, 166, 172, 0}},
+{(unsigned char*)"angmsdaf", {226, 166, 173, 0}},
+{(unsigned char*)"angmsdag", {226, 166, 174, 0}},
+{(unsigned char*)"angmsdah", {226, 166, 175, 0}},
+{(unsigned char*)"angrt", {226, 136, 159, 0}},
+{(unsigned char*)"angrtvb", {226, 138, 190, 0}},
+{(unsigned char*)"angrtvbd", {226, 166, 157, 0}},
+{(unsigned char*)"angsph", {226, 136, 162, 0}},
+{(unsigned char*)"angst", {195, 133, 0}},
+{(unsigned char*)"angzarr", {226, 141, 188, 0}},
+{(unsigned char*)"aogon", {196, 133, 0}},
+{(unsigned char*)"aopf", {240, 157, 149, 146, 0}},
+{(unsigned char*)"ap", {226, 137, 136, 0}},
+{(unsigned char*)"apE", {226, 169, 176, 0}},
+{(unsigned char*)"apacir", {226, 169, 175, 0}},
+{(unsigned char*)"ape", {226, 137, 138, 0}},
+{(unsigned char*)"apid", {226, 137, 139, 0}},
+{(unsigned char*)"apos", {39, 0}},
+{(unsigned char*)"approx", {226, 137, 136, 0}},
+{(unsigned char*)"approxeq", {226, 137, 138, 0}},
+{(unsigned char*)"aring", {195, 165, 0}},
+{(unsigned char*)"ascr", {240, 157, 146, 182, 0}},
+{(unsigned char*)"ast", {42, 0}},
+{(unsigned char*)"asymp", {226, 137, 136, 0}},
+{(unsigned char*)"asympeq", {226, 137, 141, 0}},
+{(unsigned char*)"atilde", {195, 163, 0}},
+{(unsigned char*)"auml", {195, 164, 0}},
+{(unsigned char*)"awconint", {226, 136, 179, 0}},
+{(unsigned char*)"awint", {226, 168, 145, 0}},
+{(unsigned char*)"bNot", {226, 171, 173, 0}},
+{(unsigned char*)"backcong", {226, 137, 140, 0}},
+{(unsigned char*)"backepsilon", {207, 182, 0}},
+{(unsigned char*)"backprime", {226, 128, 181, 0}},
+{(unsigned char*)"backsim", {226, 136, 189, 0}},
+{(unsigned char*)"backsimeq", {226, 139, 141, 0}},
+{(unsigned char*)"barvee", {226, 138, 189, 0}},
+{(unsigned char*)"barwed", {226, 140, 133, 0}},
+{(unsigned char*)"barwedge", {226, 140, 133, 0}},
+{(unsigned char*)"bbrk", {226, 142, 181, 0}},
+{(unsigned char*)"bbrktbrk", {226, 142, 182, 0}},
+{(unsigned char*)"bcong", {226, 137, 140, 0}},
+{(unsigned char*)"bcy", {208, 177, 0}},
+{(unsigned char*)"bdquo", {226, 128, 158, 0}},
+{(unsigned char*)"becaus", {226, 136, 181, 0}},
+{(unsigned char*)"because", {226, 136, 181, 0}},
+{(unsigned char*)"bemptyv", {226, 166, 176, 0}},
+{(unsigned char*)"bepsi", {207, 182, 0}},
+{(unsigned char*)"bernou", {226, 132, 172, 0}},
+{(unsigned char*)"beta", {206, 178, 0}},
+{(unsigned char*)"beth", {226, 132, 182, 0}},
+{(unsigned char*)"between", {226, 137, 172, 0}},
+{(unsigned char*)"bfr", {240, 157, 148, 159, 0}},
+{(unsigned char*)"bigcap", {226, 139, 130, 0}},
+{(unsigned char*)"bigcirc", {226, 151, 175, 0}},
+{(unsigned char*)"bigcup", {226, 139, 131, 0}},
+{(unsigned char*)"bigodot", {226, 168, 128, 0}},
+{(unsigned char*)"bigoplus", {226, 168, 129, 0}},
+{(unsigned char*)"bigotimes", {226, 168, 130, 0}},
+{(unsigned char*)"bigsqcup", {226, 168, 134, 0}},
+{(unsigned char*)"bigstar", {226, 152, 133, 0}},
+{(unsigned char*)"bigtriangledown", {226, 150, 189, 0}},
+{(unsigned char*)"bigtriangleup", {226, 150, 179, 0}},
+{(unsigned char*)"biguplus", {226, 168, 132, 0}},
+{(unsigned char*)"bigvee", {226, 139, 129, 0}},
+{(unsigned char*)"bigwedge", {226, 139, 128, 0}},
+{(unsigned char*)"bkarow", {226, 164, 141, 0}},
+{(unsigned char*)"blacklozenge", {226, 167, 171, 0}},
+{(unsigned char*)"blacksquare", {226, 150, 170, 0}},
+{(unsigned char*)"blacktriangle", {226, 150, 180, 0}},
+{(unsigned char*)"blacktriangledown", {226, 150, 190, 0}},
+{(unsigned char*)"blacktriangleleft", {226, 151, 130, 0}},
+{(unsigned char*)"blacktriangleright", {226, 150, 184, 0}},
+{(unsigned char*)"blank", {226, 144, 163, 0}},
+{(unsigned char*)"blk12", {226, 150, 146, 0}},
+{(unsigned char*)"blk14", {226, 150, 145, 0}},
+{(unsigned char*)"blk34", {226, 150, 147, 0}},
+{(unsigned char*)"block", {226, 150, 136, 0}},
+{(unsigned char*)"bne", {61, 226, 131, 165, 0}},
+{(unsigned char*)"bnequiv", {226, 137, 161, 226, 131, 165, 0}},
+{(unsigned char*)"bnot", {226, 140, 144, 0}},
+{(unsigned char*)"bopf", {240, 157, 149, 147, 0}},
+{(unsigned char*)"bot", {226, 138, 165, 0}},
+{(unsigned char*)"bottom", {226, 138, 165, 0}},
+{(unsigned char*)"bowtie", {226, 139, 136, 0}},
+{(unsigned char*)"boxDL", {226, 149, 151, 0}},
+{(unsigned char*)"boxDR", {226, 149, 148, 0}},
+{(unsigned char*)"boxDl", {226, 149, 150, 0}},
+{(unsigned char*)"boxDr", {226, 149, 147, 0}},
+{(unsigned char*)"boxH", {226, 149, 144, 0}},
+{(unsigned char*)"boxHD", {226, 149, 166, 0}},
+{(unsigned char*)"boxHU", {226, 149, 169, 0}},
+{(unsigned char*)"boxHd", {226, 149, 164, 0}},
+{(unsigned char*)"boxHu", {226, 149, 167, 0}},
+{(unsigned char*)"boxUL", {226, 149, 157, 0}},
+{(unsigned char*)"boxUR", {226, 149, 154, 0}},
+{(unsigned char*)"boxUl", {226, 149, 156, 0}},
+{(unsigned char*)"boxUr", {226, 149, 153, 0}},
+{(unsigned char*)"boxV", {226, 149, 145, 0}},
+{(unsigned char*)"boxVH", {226, 149, 172, 0}},
+{(unsigned char*)"boxVL", {226, 149, 163, 0}},
+{(unsigned char*)"boxVR", {226, 149, 160, 0}},
+{(unsigned char*)"boxVh", {226, 149, 171, 0}},
+{(unsigned char*)"boxVl", {226, 149, 162, 0}},
+{(unsigned char*)"boxVr", {226, 149, 159, 0}},
+{(unsigned char*)"boxbox", {226, 167, 137, 0}},
+{(unsigned char*)"boxdL", {226, 149, 149, 0}},
+{(unsigned char*)"boxdR", {226, 149, 146, 0}},
+{(unsigned char*)"boxdl", {226, 148, 144, 0}},
+{(unsigned char*)"boxdr", {226, 148, 140, 0}},
+{(unsigned char*)"boxh", {226, 148, 128, 0}},
+{(unsigned char*)"boxhD", {226, 149, 165, 0}},
+{(unsigned char*)"boxhU", {226, 149, 168, 0}},
+{(unsigned char*)"boxhd", {226, 148, 172, 0}},
+{(unsigned char*)"boxhu", {226, 148, 180, 0}},
+{(unsigned char*)"boxminus", {226, 138, 159, 0}},
+{(unsigned char*)"boxplus", {226, 138, 158, 0}},
+{(unsigned char*)"boxtimes", {226, 138, 160, 0}},
+{(unsigned char*)"boxuL", {226, 149, 155, 0}},
+{(unsigned char*)"boxuR", {226, 149, 152, 0}},
+{(unsigned char*)"boxul", {226, 148, 152, 0}},
+{(unsigned char*)"boxur", {226, 148, 148, 0}},
+{(unsigned char*)"boxv", {226, 148, 130, 0}},
+{(unsigned char*)"boxvH", {226, 149, 170, 0}},
+{(unsigned char*)"boxvL", {226, 149, 161, 0}},
+{(unsigned char*)"boxvR", {226, 149, 158, 0}},
+{(unsigned char*)"boxvh", {226, 148, 188, 0}},
+{(unsigned char*)"boxvl", {226, 148, 164, 0}},
+{(unsigned char*)"boxvr", {226, 148, 156, 0}},
+{(unsigned char*)"bprime", {226, 128, 181, 0}},
+{(unsigned char*)"breve", {203, 152, 0}},
+{(unsigned char*)"brvbar", {194, 166, 0}},
+{(unsigned char*)"bscr", {240, 157, 146, 183, 0}},
+{(unsigned char*)"bsemi", {226, 129, 143, 0}},
+{(unsigned char*)"bsim", {226, 136, 189, 0}},
+{(unsigned char*)"bsime", {226, 139, 141, 0}},
+{(unsigned char*)"bsol", {92, 0}},
+{(unsigned char*)"bsolb", {226, 167, 133, 0}},
+{(unsigned char*)"bsolhsub", {226, 159, 136, 0}},
+{(unsigned char*)"bull", {226, 128, 162, 0}},
+{(unsigned char*)"bullet", {226, 128, 162, 0}},
+{(unsigned char*)"bump", {226, 137, 142, 0}},
+{(unsigned char*)"bumpE", {226, 170, 174, 0}},
+{(unsigned char*)"bumpe", {226, 137, 143, 0}},
+{(unsigned char*)"bumpeq", {226, 137, 143, 0}},
+{(unsigned char*)"cacute", {196, 135, 0}},
+{(unsigned char*)"cap", {226, 136, 169, 0}},
+{(unsigned char*)"capand", {226, 169, 132, 0}},
+{(unsigned char*)"capbrcup", {226, 169, 137, 0}},
+{(unsigned char*)"capcap", {226, 169, 139, 0}},
+{(unsigned char*)"capcup", {226, 169, 135, 0}},
+{(unsigned char*)"capdot", {226, 169, 128, 0}},
+{(unsigned char*)"caps", {226, 136, 169, 239, 184, 128, 0}},
+{(unsigned char*)"caret", {226, 129, 129, 0}},
+{(unsigned char*)"caron", {203, 135, 0}},
+{(unsigned char*)"ccaps", {226, 169, 141, 0}},
+{(unsigned char*)"ccaron", {196, 141, 0}},
+{(unsigned char*)"ccedil", {195, 167, 0}},
+{(unsigned char*)"ccirc", {196, 137, 0}},
+{(unsigned char*)"ccups", {226, 169, 140, 0}},
+{(unsigned char*)"ccupssm", {226, 169, 144, 0}},
+{(unsigned char*)"cdot", {196, 139, 0}},
+{(unsigned char*)"cedil", {194, 184, 0}},
+{(unsigned char*)"cemptyv", {226, 166, 178, 0}},
+{(unsigned char*)"cent", {194, 162, 0}},
+{(unsigned char*)"centerdot", {194, 183, 0}},
+{(unsigned char*)"cfr", {240, 157, 148, 160, 0}},
+{(unsigned char*)"chcy", {209, 135, 0}},
+{(unsigned char*)"check", {226, 156, 147, 0}},
+{(unsigned char*)"checkmark", {226, 156, 147, 0}},
+{(unsigned char*)"chi", {207, 135, 0}},
+{(unsigned char*)"cir", {226, 151, 139, 0}},
+{(unsigned char*)"cirE", {226, 167, 131, 0}},
+{(unsigned char*)"circ", {203, 134, 0}},
+{(unsigned char*)"circeq", {226, 137, 151, 0}},
+{(unsigned char*)"circlearrowleft", {226, 134, 186, 0}},
+{(unsigned char*)"circlearrowright", {226, 134, 187, 0}},
+{(unsigned char*)"circledR", {194, 174, 0}},
+{(unsigned char*)"circledS", {226, 147, 136, 0}},
+{(unsigned char*)"circledast", {226, 138, 155, 0}},
+{(unsigned char*)"circledcirc", {226, 138, 154, 0}},
+{(unsigned char*)"circleddash", {226, 138, 157, 0}},
+{(unsigned char*)"cire", {226, 137, 151, 0}},
+{(unsigned char*)"cirfnint", {226, 168, 144, 0}},
+{(unsigned char*)"cirmid", {226, 171, 175, 0}},
+{(unsigned char*)"cirscir", {226, 167, 130, 0}},
+{(unsigned char*)"clubs", {226, 153, 163, 0}},
+{(unsigned char*)"clubsuit", {226, 153, 163, 0}},
+{(unsigned char*)"colon", {58, 0}},
+{(unsigned char*)"colone", {226, 137, 148, 0}},
+{(unsigned char*)"coloneq", {226, 137, 148, 0}},
+{(unsigned char*)"comma", {44, 0}},
+{(unsigned char*)"commat", {64, 0}},
+{(unsigned char*)"comp", {226, 136, 129, 0}},
+{(unsigned char*)"compfn", {226, 136, 152, 0}},
+{(unsigned char*)"complement", {226, 136, 129, 0}},
+{(unsigned char*)"complexes", {226, 132, 130, 0}},
+{(unsigned char*)"cong", {226, 137, 133, 0}},
+{(unsigned char*)"congdot", {226, 169, 173, 0}},
+{(unsigned char*)"conint", {226, 136, 174, 0}},
+{(unsigned char*)"copf", {240, 157, 149, 148, 0}},
+{(unsigned char*)"coprod", {226, 136, 144, 0}},
+{(unsigned char*)"copy", {194, 169, 0}},
+{(unsigned char*)"copysr", {226, 132, 151, 0}},
+{(unsigned char*)"crarr", {226, 134, 181, 0}},
+{(unsigned char*)"cross", {226, 156, 151, 0}},
+{(unsigned char*)"cscr", {240, 157, 146, 184, 0}},
+{(unsigned char*)"csub", {226, 171, 143, 0}},
+{(unsigned char*)"csube", {226, 171, 145, 0}},
+{(unsigned char*)"csup", {226, 171, 144, 0}},
+{(unsigned char*)"csupe", {226, 171, 146, 0}},
+{(unsigned char*)"ctdot", {226, 139, 175, 0}},
+{(unsigned char*)"cudarrl", {226, 164, 184, 0}},
+{(unsigned char*)"cudarrr", {226, 164, 181, 0}},
+{(unsigned char*)"cuepr", {226, 139, 158, 0}},
+{(unsigned char*)"cuesc", {226, 139, 159, 0}},
+{(unsigned char*)"cularr", {226, 134, 182, 0}},
+{(unsigned char*)"cularrp", {226, 164, 189, 0}},
+{(unsigned char*)"cup", {226, 136, 170, 0}},
+{(unsigned char*)"cupbrcap", {226, 169, 136, 0}},
+{(unsigned char*)"cupcap", {226, 169, 134, 0}},
+{(unsigned char*)"cupcup", {226, 169, 138, 0}},
+{(unsigned char*)"cupdot", {226, 138, 141, 0}},
+{(unsigned char*)"cupor", {226, 169, 133, 0}},
+{(unsigned char*)"cups", {226, 136, 170, 239, 184, 128, 0}},
+{(unsigned char*)"curarr", {226, 134, 183, 0}},
+{(unsigned char*)"curarrm", {226, 164, 188, 0}},
+{(unsigned char*)"curlyeqprec", {226, 139, 158, 0}},
+{(unsigned char*)"curlyeqsucc", {226, 139, 159, 0}},
+{(unsigned char*)"curlyvee", {226, 139, 142, 0}},
+{(unsigned char*)"curlywedge", {226, 139, 143, 0}},
+{(unsigned char*)"curren", {194, 164, 0}},
+{(unsigned char*)"curvearrowleft", {226, 134, 182, 0}},
+{(unsigned char*)"curvearrowright", {226, 134, 183, 0}},
+{(unsigned char*)"cuvee", {226, 139, 142, 0}},
+{(unsigned char*)"cuwed", {226, 139, 143, 0}},
+{(unsigned char*)"cwconint", {226, 136, 178, 0}},
+{(unsigned char*)"cwint", {226, 136, 177, 0}},
+{(unsigned char*)"cylcty", {226, 140, 173, 0}},
+{(unsigned char*)"dArr", {226, 135, 147, 0}},
+{(unsigned char*)"dHar", {226, 165, 165, 0}},
+{(unsigned char*)"dagger", {226, 128, 160, 0}},
+{(unsigned char*)"daleth", {226, 132, 184, 0}},
+{(unsigned char*)"darr", {226, 134, 147, 0}},
+{(unsigned char*)"dash", {226, 128, 144, 0}},
+{(unsigned char*)"dashv", {226, 138, 163, 0}},
+{(unsigned char*)"dbkarow", {226, 164, 143, 0}},
+{(unsigned char*)"dblac", {203, 157, 0}},
+{(unsigned char*)"dcaron", {196, 143, 0}},
+{(unsigned char*)"dcy", {208, 180, 0}},
+{(unsigned char*)"dd", {226, 133, 134, 0}},
+{(unsigned char*)"ddagger", {226, 128, 161, 0}},
+{(unsigned char*)"ddarr", {226, 135, 138, 0}},
+{(unsigned char*)"ddotseq", {226, 169, 183, 0}},
+{(unsigned char*)"deg", {194, 176, 0}},
+{(unsigned char*)"delta", {206, 180, 0}},
+{(unsigned char*)"demptyv", {226, 166, 177, 0}},
+{(unsigned char*)"dfisht", {226, 165, 191, 0}},
+{(unsigned char*)"dfr", {240, 157, 148, 161, 0}},
+{(unsigned char*)"dharl", {226, 135, 131, 0}},
+{(unsigned char*)"dharr", {226, 135, 130, 0}},
+{(unsigned char*)"diam", {226, 139, 132, 0}},
+{(unsigned char*)"diamond", {226, 139, 132, 0}},
+{(unsigned char*)"diamondsuit", {226, 153, 166, 0}},
+{(unsigned char*)"diams", {226, 153, 166, 0}},
+{(unsigned char*)"die", {194, 168, 0}},
+{(unsigned char*)"digamma", {207, 157, 0}},
+{(unsigned char*)"disin", {226, 139, 178, 0}},
+{(unsigned char*)"div", {195, 183, 0}},
+{(unsigned char*)"divide", {195, 183, 0}},
+{(unsigned char*)"divideontimes", {226, 139, 135, 0}},
+{(unsigned char*)"divonx", {226, 139, 135, 0}},
+{(unsigned char*)"djcy", {209, 146, 0}},
+{(unsigned char*)"dlcorn", {226, 140, 158, 0}},
+{(unsigned char*)"dlcrop", {226, 140, 141, 0}},
+{(unsigned char*)"dollar", {36, 0}},
+{(unsigned char*)"dopf", {240, 157, 149, 149, 0}},
+{(unsigned char*)"dot", {203, 153, 0}},
+{(unsigned char*)"doteq", {226, 137, 144, 0}},
+{(unsigned char*)"doteqdot", {226, 137, 145, 0}},
+{(unsigned char*)"dotminus", {226, 136, 184, 0}},
+{(unsigned char*)"dotplus", {226, 136, 148, 0}},
+{(unsigned char*)"dotsquare", {226, 138, 161, 0}},
+{(unsigned char*)"doublebarwedge", {226, 140, 134, 0}},
+{(unsigned char*)"downarrow", {226, 134, 147, 0}},
+{(unsigned char*)"downdownarrows", {226, 135, 138, 0}},
+{(unsigned char*)"downharpoonleft", {226, 135, 131, 0}},
+{(unsigned char*)"downharpoonright", {226, 135, 130, 0}},
+{(unsigned char*)"drbkarow", {226, 164, 144, 0}},
+{(unsigned char*)"drcorn", {226, 140, 159, 0}},
+{(unsigned char*)"drcrop", {226, 140, 140, 0}},
+{(unsigned char*)"dscr", {240, 157, 146, 185, 0}},
+{(unsigned char*)"dscy", {209, 149, 0}},
+{(unsigned char*)"dsol", {226, 167, 182, 0}},
+{(unsigned char*)"dstrok", {196, 145, 0}},
+{(unsigned char*)"dtdot", {226, 139, 177, 0}},
+{(unsigned char*)"dtri", {226, 150, 191, 0}},
+{(unsigned char*)"dtrif", {226, 150, 190, 0}},
+{(unsigned char*)"duarr", {226, 135, 181, 0}},
+{(unsigned char*)"duhar", {226, 165, 175, 0}},
+{(unsigned char*)"dwangle", {226, 166, 166, 0}},
+{(unsigned char*)"dzcy", {209, 159, 0}},
+{(unsigned char*)"dzigrarr", {226, 159, 191, 0}},
+{(unsigned char*)"eDDot", {226, 169, 183, 0}},
+{(unsigned char*)"eDot", {226, 137, 145, 0}},
+{(unsigned char*)"eacute", {195, 169, 0}},
+{(unsigned char*)"easter", {226, 169, 174, 0}},
+{(unsigned char*)"ecaron", {196, 155, 0}},
+{(unsigned char*)"ecir", {226, 137, 150, 0}},
+{(unsigned char*)"ecirc", {195, 170, 0}},
+{(unsigned char*)"ecolon", {226, 137, 149, 0}},
+{(unsigned char*)"ecy", {209, 141, 0}},
+{(unsigned char*)"edot", {196, 151, 0}},
+{(unsigned char*)"ee", {226, 133, 135, 0}},
+{(unsigned char*)"efDot", {226, 137, 146, 0}},
+{(unsigned char*)"efr", {240, 157, 148, 162, 0}},
+{(unsigned char*)"eg", {226, 170, 154, 0}},
+{(unsigned char*)"egrave", {195, 168, 0}},
+{(unsigned char*)"egs", {226, 170, 150, 0}},
+{(unsigned char*)"egsdot", {226, 170, 152, 0}},
+{(unsigned char*)"el", {226, 170, 153, 0}},
+{(unsigned char*)"elinters", {226, 143, 167, 0}},
+{(unsigned char*)"ell", {226, 132, 147, 0}},
+{(unsigned char*)"els", {226, 170, 149, 0}},
+{(unsigned char*)"elsdot", {226, 170, 151, 0}},
+{(unsigned char*)"emacr", {196, 147, 0}},
+{(unsigned char*)"empty", {226, 136, 133, 0}},
+{(unsigned char*)"emptyset", {226, 136, 133, 0}},
+{(unsigned char*)"emptyv", {226, 136, 133, 0}},
+{(unsigned char*)"emsp", {226, 128, 131, 0}},
+{(unsigned char*)"emsp13", {226, 128, 132, 0}},
+{(unsigned char*)"emsp14", {226, 128, 133, 0}},
+{(unsigned char*)"eng", {197, 139, 0}},
+{(unsigned char*)"ensp", {226, 128, 130, 0}},
+{(unsigned char*)"eogon", {196, 153, 0}},
+{(unsigned char*)"eopf", {240, 157, 149, 150, 0}},
+{(unsigned char*)"epar", {226, 139, 149, 0}},
+{(unsigned char*)"eparsl", {226, 167, 163, 0}},
+{(unsigned char*)"eplus", {226, 169, 177, 0}},
+{(unsigned char*)"epsi", {206, 181, 0}},
+{(unsigned char*)"epsilon", {206, 181, 0}},
+{(unsigned char*)"epsiv", {207, 181, 0}},
+{(unsigned char*)"eqcirc", {226, 137, 150, 0}},
+{(unsigned char*)"eqcolon", {226, 137, 149, 0}},
+{(unsigned char*)"eqsim", {226, 137, 130, 0}},
+{(unsigned char*)"eqslantgtr", {226, 170, 150, 0}},
+{(unsigned char*)"eqslantless", {226, 170, 149, 0}},
+{(unsigned char*)"equals", {61, 0}},
+{(unsigned char*)"equest", {226, 137, 159, 0}},
+{(unsigned char*)"equiv", {226, 137, 161, 0}},
+{(unsigned char*)"equivDD", {226, 169, 184, 0}},
+{(unsigned char*)"eqvparsl", {226, 167, 165, 0}},
+{(unsigned char*)"erDot", {226, 137, 147, 0}},
+{(unsigned char*)"erarr", {226, 165, 177, 0}},
+{(unsigned char*)"escr", {226, 132, 175, 0}},
+{(unsigned char*)"esdot", {226, 137, 144, 0}},
+{(unsigned char*)"esim", {226, 137, 130, 0}},
+{(unsigned char*)"eta", {206, 183, 0}},
+{(unsigned char*)"eth", {195, 176, 0}},
+{(unsigned char*)"euml", {195, 171, 0}},
+{(unsigned char*)"euro", {226, 130, 172, 0}},
+{(unsigned char*)"excl", {33, 0}},
+{(unsigned char*)"exist", {226, 136, 131, 0}},
+{(unsigned char*)"expectation", {226, 132, 176, 0}},
+{(unsigned char*)"exponentiale", {226, 133, 135, 0}},
+{(unsigned char*)"fallingdotseq", {226, 137, 146, 0}},
+{(unsigned char*)"fcy", {209, 132, 0}},
+{(unsigned char*)"female", {226, 153, 128, 0}},
+{(unsigned char*)"ffilig", {239, 172, 131, 0}},
+{(unsigned char*)"fflig", {239, 172, 128, 0}},
+{(unsigned char*)"ffllig", {239, 172, 132, 0}},
+{(unsigned char*)"ffr", {240, 157, 148, 163, 0}},
+{(unsigned char*)"filig", {239, 172, 129, 0}},
+{(unsigned char*)"fjlig", {102, 106, 0}},
+{(unsigned char*)"flat", {226, 153, 173, 0}},
+{(unsigned char*)"fllig", {239, 172, 130, 0}},
+{(unsigned char*)"fltns", {226, 150, 177, 0}},
+{(unsigned char*)"fnof", {198, 146, 0}},
+{(unsigned char*)"fopf", {240, 157, 149, 151, 0}},
+{(unsigned char*)"forall", {226, 136, 128, 0}},
+{(unsigned char*)"fork", {226, 139, 148, 0}},
+{(unsigned char*)"forkv", {226, 171, 153, 0}},
+{(unsigned char*)"fpartint", {226, 168, 141, 0}},
+{(unsigned char*)"frac12", {194, 189, 0}},
+{(unsigned char*)"frac13", {226, 133, 147, 0}},
+{(unsigned char*)"frac14", {194, 188, 0}},
+{(unsigned char*)"frac15", {226, 133, 149, 0}},
+{(unsigned char*)"frac16", {226, 133, 153, 0}},
+{(unsigned char*)"frac18", {226, 133, 155, 0}},
+{(unsigned char*)"frac23", {226, 133, 148, 0}},
+{(unsigned char*)"frac25", {226, 133, 150, 0}},
+{(unsigned char*)"frac34", {194, 190, 0}},
+{(unsigned char*)"frac35", {226, 133, 151, 0}},
+{(unsigned char*)"frac38", {226, 133, 156, 0}},
+{(unsigned char*)"frac45", {226, 133, 152, 0}},
+{(unsigned char*)"frac56", {226, 133, 154, 0}},
+{(unsigned char*)"frac58", {226, 133, 157, 0}},
+{(unsigned char*)"frac78", {226, 133, 158, 0}},
+{(unsigned char*)"frasl", {226, 129, 132, 0}},
+{(unsigned char*)"frown", {226, 140, 162, 0}},
+{(unsigned char*)"fscr", {240, 157, 146, 187, 0}},
+{(unsigned char*)"gE", {226, 137, 167, 0}},
+{(unsigned char*)"gEl", {226, 170, 140, 0}},
+{(unsigned char*)"gacute", {199, 181, 0}},
+{(unsigned char*)"gamma", {206, 179, 0}},
+{(unsigned char*)"gammad", {207, 157, 0}},
+{(unsigned char*)"gap", {226, 170, 134, 0}},
+{(unsigned char*)"gbreve", {196, 159, 0}},
+{(unsigned char*)"gcirc", {196, 157, 0}},
+{(unsigned char*)"gcy", {208, 179, 0}},
+{(unsigned char*)"gdot", {196, 161, 0}},
+{(unsigned char*)"ge", {226, 137, 165, 0}},
+{(unsigned char*)"gel", {226, 139, 155, 0}},
+{(unsigned char*)"geq", {226, 137, 165, 0}},
+{(unsigned char*)"geqq", {226, 137, 167, 0}},
+{(unsigned char*)"geqslant", {226, 169, 190, 0}},
+{(unsigned char*)"ges", {226, 169, 190, 0}},
+{(unsigned char*)"gescc", {226, 170, 169, 0}},
+{(unsigned char*)"gesdot", {226, 170, 128, 0}},
+{(unsigned char*)"gesdoto", {226, 170, 130, 0}},
+{(unsigned char*)"gesdotol", {226, 170, 132, 0}},
+{(unsigned char*)"gesl", {226, 139, 155, 239, 184, 128, 0}},
+{(unsigned char*)"gesles", {226, 170, 148, 0}},
+{(unsigned char*)"gfr", {240, 157, 148, 164, 0}},
+{(unsigned char*)"gg", {226, 137, 171, 0}},
+{(unsigned char*)"ggg", {226, 139, 153, 0}},
+{(unsigned char*)"gimel", {226, 132, 183, 0}},
+{(unsigned char*)"gjcy", {209, 147, 0}},
+{(unsigned char*)"gl", {226, 137, 183, 0}},
+{(unsigned char*)"glE", {226, 170, 146, 0}},
+{(unsigned char*)"gla", {226, 170, 165, 0}},
+{(unsigned char*)"glj", {226, 170, 164, 0}},
+{(unsigned char*)"gnE", {226, 137, 169, 0}},
+{(unsigned char*)"gnap", {226, 170, 138, 0}},
+{(unsigned char*)"gnapprox", {226, 170, 138, 0}},
+{(unsigned char*)"gne", {226, 170, 136, 0}},
+{(unsigned char*)"gneq", {226, 170, 136, 0}},
+{(unsigned char*)"gneqq", {226, 137, 169, 0}},
+{(unsigned char*)"gnsim", {226, 139, 167, 0}},
+{(unsigned char*)"gopf", {240, 157, 149, 152, 0}},
+{(unsigned char*)"grave", {96, 0}},
+{(unsigned char*)"gscr", {226, 132, 138, 0}},
+{(unsigned char*)"gsim", {226, 137, 179, 0}},
+{(unsigned char*)"gsime", {226, 170, 142, 0}},
+{(unsigned char*)"gsiml", {226, 170, 144, 0}},
+{(unsigned char*)"gt", {62, 0}},
+{(unsigned char*)"gtcc", {226, 170, 167, 0}},
+{(unsigned char*)"gtcir", {226, 169, 186, 0}},
+{(unsigned char*)"gtdot", {226, 139, 151, 0}},
+{(unsigned char*)"gtlPar", {226, 166, 149, 0}},
+{(unsigned char*)"gtquest", {226, 169, 188, 0}},
+{(unsigned char*)"gtrapprox", {226, 170, 134, 0}},
+{(unsigned char*)"gtrarr", {226, 165, 184, 0}},
+{(unsigned char*)"gtrdot", {226, 139, 151, 0}},
+{(unsigned char*)"gtreqless", {226, 139, 155, 0}},
+{(unsigned char*)"gtreqqless", {226, 170, 140, 0}},
+{(unsigned char*)"gtrless", {226, 137, 183, 0}},
+{(unsigned char*)"gtrsim", {226, 137, 179, 0}},
+{(unsigned char*)"gvertneqq", {226, 137, 169, 239, 184, 128, 0}},
+{(unsigned char*)"gvnE", {226, 137, 169, 239, 184, 128, 0}},
+{(unsigned char*)"hArr", {226, 135, 148, 0}},
+{(unsigned char*)"hairsp", {226, 128, 138, 0}},
+{(unsigned char*)"half", {194, 189, 0}},
+{(unsigned char*)"hamilt", {226, 132, 139, 0}},
+{(unsigned char*)"hardcy", {209, 138, 0}},
+{(unsigned char*)"harr", {226, 134, 148, 0}},
+{(unsigned char*)"harrcir", {226, 165, 136, 0}},
+{(unsigned char*)"harrw", {226, 134, 173, 0}},
+{(unsigned char*)"hbar", {226, 132, 143, 0}},
+{(unsigned char*)"hcirc", {196, 165, 0}},
+{(unsigned char*)"hearts", {226, 153, 165, 0}},
+{(unsigned char*)"heartsuit", {226, 153, 165, 0}},
+{(unsigned char*)"hellip", {226, 128, 166, 0}},
+{(unsigned char*)"hercon", {226, 138, 185, 0}},
+{(unsigned char*)"hfr", {240, 157, 148, 165, 0}},
+{(unsigned char*)"hksearow", {226, 164, 165, 0}},
+{(unsigned char*)"hkswarow", {226, 164, 166, 0}},
+{(unsigned char*)"hoarr", {226, 135, 191, 0}},
+{(unsigned char*)"homtht", {226, 136, 187, 0}},
+{(unsigned char*)"hookleftarrow", {226, 134, 169, 0}},
+{(unsigned char*)"hookrightarrow", {226, 134, 170, 0}},
+{(unsigned char*)"hopf", {240, 157, 149, 153, 0}},
+{(unsigned char*)"horbar", {226, 128, 149, 0}},
+{(unsigned char*)"hscr", {240, 157, 146, 189, 0}},
+{(unsigned char*)"hslash", {226, 132, 143, 0}},
+{(unsigned char*)"hstrok", {196, 167, 0}},
+{(unsigned char*)"hybull", {226, 129, 131, 0}},
+{(unsigned char*)"hyphen", {226, 128, 144, 0}},
+{(unsigned char*)"iacute", {195, 173, 0}},
+{(unsigned char*)"ic", {226, 129, 163, 0}},
+{(unsigned char*)"icirc", {195, 174, 0}},
+{(unsigned char*)"icy", {208, 184, 0}},
+{(unsigned char*)"iecy", {208, 181, 0}},
+{(unsigned char*)"iexcl", {194, 161, 0}},
+{(unsigned char*)"iff", {226, 135, 148, 0}},
+{(unsigned char*)"ifr", {240, 157, 148, 166, 0}},
+{(unsigned char*)"igrave", {195, 172, 0}},
+{(unsigned char*)"ii", {226, 133, 136, 0}},
+{(unsigned char*)"iiiint", {226, 168, 140, 0}},
+{(unsigned char*)"iiint", {226, 136, 173, 0}},
+{(unsigned char*)"iinfin", {226, 167, 156, 0}},
+{(unsigned char*)"iiota", {226, 132, 169, 0}},
+{(unsigned char*)"ijlig", {196, 179, 0}},
+{(unsigned char*)"imacr", {196, 171, 0}},
+{(unsigned char*)"image", {226, 132, 145, 0}},
+{(unsigned char*)"imagline", {226, 132, 144, 0}},
+{(unsigned char*)"imagpart", {226, 132, 145, 0}},
+{(unsigned char*)"imath", {196, 177, 0}},
+{(unsigned char*)"imof", {226, 138, 183, 0}},
+{(unsigned char*)"imped", {198, 181, 0}},
+{(unsigned char*)"in", {226, 136, 136, 0}},
+{(unsigned char*)"incare", {226, 132, 133, 0}},
+{(unsigned char*)"infin", {226, 136, 158, 0}},
+{(unsigned char*)"infintie", {226, 167, 157, 0}},
+{(unsigned char*)"inodot", {196, 177, 0}},
+{(unsigned char*)"int", {226, 136, 171, 0}},
+{(unsigned char*)"intcal", {226, 138, 186, 0}},
+{(unsigned char*)"integers", {226, 132, 164, 0}},
+{(unsigned char*)"intercal", {226, 138, 186, 0}},
+{(unsigned char*)"intlarhk", {226, 168, 151, 0}},
+{(unsigned char*)"intprod", {226, 168, 188, 0}},
+{(unsigned char*)"iocy", {209, 145, 0}},
+{(unsigned char*)"iogon", {196, 175, 0}},
+{(unsigned char*)"iopf", {240, 157, 149, 154, 0}},
+{(unsigned char*)"iota", {206, 185, 0}},
+{(unsigned char*)"iprod", {226, 168, 188, 0}},
+{(unsigned char*)"iquest", {194, 191, 0}},
+{(unsigned char*)"iscr", {240, 157, 146, 190, 0}},
+{(unsigned char*)"isin", {226, 136, 136, 0}},
+{(unsigned char*)"isinE", {226, 139, 185, 0}},
+{(unsigned char*)"isindot", {226, 139, 181, 0}},
+{(unsigned char*)"isins", {226, 139, 180, 0}},
+{(unsigned char*)"isinsv", {226, 139, 179, 0}},
+{(unsigned char*)"isinv", {226, 136, 136, 0}},
+{(unsigned char*)"it", {226, 129, 162, 0}},
+{(unsigned char*)"itilde", {196, 169, 0}},
+{(unsigned char*)"iukcy", {209, 150, 0}},
+{(unsigned char*)"iuml", {195, 175, 0}},
+{(unsigned char*)"jcirc", {196, 181, 0}},
+{(unsigned char*)"jcy", {208, 185, 0}},
+{(unsigned char*)"jfr", {240, 157, 148, 167, 0}},
+{(unsigned char*)"jmath", {200, 183, 0}},
+{(unsigned char*)"jopf", {240, 157, 149, 155, 0}},
+{(unsigned char*)"jscr", {240, 157, 146, 191, 0}},
+{(unsigned char*)"jsercy", {209, 152, 0}},
+{(unsigned char*)"jukcy", {209, 148, 0}},
+{(unsigned char*)"kappa", {206, 186, 0}},
+{(unsigned char*)"kappav", {207, 176, 0}},
+{(unsigned char*)"kcedil", {196, 183, 0}},
+{(unsigned char*)"kcy", {208, 186, 0}},
+{(unsigned char*)"kfr", {240, 157, 148, 168, 0}},
+{(unsigned char*)"kgreen", {196, 184, 0}},
+{(unsigned char*)"khcy", {209, 133, 0}},
+{(unsigned char*)"kjcy", {209, 156, 0}},
+{(unsigned char*)"kopf", {240, 157, 149, 156, 0}},
+{(unsigned char*)"kscr", {240, 157, 147, 128, 0}},
+{(unsigned char*)"lAarr", {226, 135, 154, 0}},
+{(unsigned char*)"lArr", {226, 135, 144, 0}},
+{(unsigned char*)"lAtail", {226, 164, 155, 0}},
+{(unsigned char*)"lBarr", {226, 164, 142, 0}},
+{(unsigned char*)"lE", {226, 137, 166, 0}},
+{(unsigned char*)"lEg", {226, 170, 139, 0}},
+{(unsigned char*)"lHar", {226, 165, 162, 0}},
+{(unsigned char*)"lacute", {196, 186, 0}},
+{(unsigned char*)"laemptyv", {226, 166, 180, 0}},
+{(unsigned char*)"lagran", {226, 132, 146, 0}},
+{(unsigned char*)"lambda", {206, 187, 0}},
+{(unsigned char*)"lang", {226, 159, 168, 0}},
+{(unsigned char*)"langd", {226, 166, 145, 0}},
+{(unsigned char*)"langle", {226, 159, 168, 0}},
+{(unsigned char*)"lap", {226, 170, 133, 0}},
+{(unsigned char*)"laquo", {194, 171, 0}},
+{(unsigned char*)"larr", {226, 134, 144, 0}},
+{(unsigned char*)"larrb", {226, 135, 164, 0}},
+{(unsigned char*)"larrbfs", {226, 164, 159, 0}},
+{(unsigned char*)"larrfs", {226, 164, 157, 0}},
+{(unsigned char*)"larrhk", {226, 134, 169, 0}},
+{(unsigned char*)"larrlp", {226, 134, 171, 0}},
+{(unsigned char*)"larrpl", {226, 164, 185, 0}},
+{(unsigned char*)"larrsim", {226, 165, 179, 0}},
+{(unsigned char*)"larrtl", {226, 134, 162, 0}},
+{(unsigned char*)"lat", {226, 170, 171, 0}},
+{(unsigned char*)"latail", {226, 164, 153, 0}},
+{(unsigned char*)"late", {226, 170, 173, 0}},
+{(unsigned char*)"lates", {226, 170, 173, 239, 184, 128, 0}},
+{(unsigned char*)"lbarr", {226, 164, 140, 0}},
+{(unsigned char*)"lbbrk", {226, 157, 178, 0}},
+{(unsigned char*)"lbrace", {123, 0}},
+{(unsigned char*)"lbrack", {91, 0}},
+{(unsigned char*)"lbrke", {226, 166, 139, 0}},
+{(unsigned char*)"lbrksld", {226, 166, 143, 0}},
+{(unsigned char*)"lbrkslu", {226, 166, 141, 0}},
+{(unsigned char*)"lcaron", {196, 190, 0}},
+{(unsigned char*)"lcedil", {196, 188, 0}},
+{(unsigned char*)"lceil", {226, 140, 136, 0}},
+{(unsigned char*)"lcub", {123, 0}},
+{(unsigned char*)"lcy", {208, 187, 0}},
+{(unsigned char*)"ldca", {226, 164, 182, 0}},
+{(unsigned char*)"ldquo", {226, 128, 156, 0}},
+{(unsigned char*)"ldquor", {226, 128, 158, 0}},
+{(unsigned char*)"ldrdhar", {226, 165, 167, 0}},
+{(unsigned char*)"ldrushar", {226, 165, 139, 0}},
+{(unsigned char*)"ldsh", {226, 134, 178, 0}},
+{(unsigned char*)"le", {226, 137, 164, 0}},
+{(unsigned char*)"leftarrow", {226, 134, 144, 0}},
+{(unsigned char*)"leftarrowtail", {226, 134, 162, 0}},
+{(unsigned char*)"leftharpoondown", {226, 134, 189, 0}},
+{(unsigned char*)"leftharpoonup", {226, 134, 188, 0}},
+{(unsigned char*)"leftleftarrows", {226, 135, 135, 0}},
+{(unsigned char*)"leftrightarrow", {226, 134, 148, 0}},
+{(unsigned char*)"leftrightarrows", {226, 135, 134, 0}},
+{(unsigned char*)"leftrightharpoons", {226, 135, 139, 0}},
+{(unsigned char*)"leftrightsquigarrow", {226, 134, 173, 0}},
+{(unsigned char*)"leftthreetimes", {226, 139, 139, 0}},
+{(unsigned char*)"leg", {226, 139, 154, 0}},
+{(unsigned char*)"leq", {226, 137, 164, 0}},
+{(unsigned char*)"leqq", {226, 137, 166, 0}},
+{(unsigned char*)"leqslant", {226, 169, 189, 0}},
+{(unsigned char*)"les", {226, 169, 189, 0}},
+{(unsigned char*)"lescc", {226, 170, 168, 0}},
+{(unsigned char*)"lesdot", {226, 169, 191, 0}},
+{(unsigned char*)"lesdoto", {226, 170, 129, 0}},
+{(unsigned char*)"lesdotor", {226, 170, 131, 0}},
+{(unsigned char*)"lesg", {226, 139, 154, 239, 184, 128, 0}},
+{(unsigned char*)"lesges", {226, 170, 147, 0}},
+{(unsigned char*)"lessapprox", {226, 170, 133, 0}},
+{(unsigned char*)"lessdot", {226, 139, 150, 0}},
+{(unsigned char*)"lesseqgtr", {226, 139, 154, 0}},
+{(unsigned char*)"lesseqqgtr", {226, 170, 139, 0}},
+{(unsigned char*)"lessgtr", {226, 137, 182, 0}},
+{(unsigned char*)"lesssim", {226, 137, 178, 0}},
+{(unsigned char*)"lfisht", {226, 165, 188, 0}},
+{(unsigned char*)"lfloor", {226, 140, 138, 0}},
+{(unsigned char*)"lfr", {240, 157, 148, 169, 0}},
+{(unsigned char*)"lg", {226, 137, 182, 0}},
+{(unsigned char*)"lgE", {226, 170, 145, 0}},
+{(unsigned char*)"lhard", {226, 134, 189, 0}},
+{(unsigned char*)"lharu", {226, 134, 188, 0}},
+{(unsigned char*)"lharul", {226, 165, 170, 0}},
+{(unsigned char*)"lhblk", {226, 150, 132, 0}},
+{(unsigned char*)"ljcy", {209, 153, 0}},
+{(unsigned char*)"ll", {226, 137, 170, 0}},
+{(unsigned char*)"llarr", {226, 135, 135, 0}},
+{(unsigned char*)"llcorner", {226, 140, 158, 0}},
+{(unsigned char*)"llhard", {226, 165, 171, 0}},
+{(unsigned char*)"lltri", {226, 151, 186, 0}},
+{(unsigned char*)"lmidot", {197, 128, 0}},
+{(unsigned char*)"lmoust", {226, 142, 176, 0}},
+{(unsigned char*)"lmoustache", {226, 142, 176, 0}},
+{(unsigned char*)"lnE", {226, 137, 168, 0}},
+{(unsigned char*)"lnap", {226, 170, 137, 0}},
+{(unsigned char*)"lnapprox", {226, 170, 137, 0}},
+{(unsigned char*)"lne", {226, 170, 135, 0}},
+{(unsigned char*)"lneq", {226, 170, 135, 0}},
+{(unsigned char*)"lneqq", {226, 137, 168, 0}},
+{(unsigned char*)"lnsim", {226, 139, 166, 0}},
+{(unsigned char*)"loang", {226, 159, 172, 0}},
+{(unsigned char*)"loarr", {226, 135, 189, 0}},
+{(unsigned char*)"lobrk", {226, 159, 166, 0}},
+{(unsigned char*)"longleftarrow", {226, 159, 181, 0}},
+{(unsigned char*)"longleftrightarrow", {226, 159, 183, 0}},
+{(unsigned char*)"longmapsto", {226, 159, 188, 0}},
+{(unsigned char*)"longrightarrow", {226, 159, 182, 0}},
+{(unsigned char*)"looparrowleft", {226, 134, 171, 0}},
+{(unsigned char*)"looparrowright", {226, 134, 172, 0}},
+{(unsigned char*)"lopar", {226, 166, 133, 0}},
+{(unsigned char*)"lopf", {240, 157, 149, 157, 0}},
+{(unsigned char*)"loplus", {226, 168, 173, 0}},
+{(unsigned char*)"lotimes", {226, 168, 180, 0}},
+{(unsigned char*)"lowast", {226, 136, 151, 0}},
+{(unsigned char*)"lowbar", {95, 0}},
+{(unsigned char*)"loz", {226, 151, 138, 0}},
+{(unsigned char*)"lozenge", {226, 151, 138, 0}},
+{(unsigned char*)"lozf", {226, 167, 171, 0}},
+{(unsigned char*)"lpar", {40, 0}},
+{(unsigned char*)"lparlt", {226, 166, 147, 0}},
+{(unsigned char*)"lrarr", {226, 135, 134, 0}},
+{(unsigned char*)"lrcorner", {226, 140, 159, 0}},
+{(unsigned char*)"lrhar", {226, 135, 139, 0}},
+{(unsigned char*)"lrhard", {226, 165, 173, 0}},
+{(unsigned char*)"lrm", {226, 128, 142, 0}},
+{(unsigned char*)"lrtri", {226, 138, 191, 0}},
+{(unsigned char*)"lsaquo", {226, 128, 185, 0}},
+{(unsigned char*)"lscr", {240, 157, 147, 129, 0}},
+{(unsigned char*)"lsh", {226, 134, 176, 0}},
+{(unsigned char*)"lsim", {226, 137, 178, 0}},
+{(unsigned char*)"lsime", {226, 170, 141, 0}},
+{(unsigned char*)"lsimg", {226, 170, 143, 0}},
+{(unsigned char*)"lsqb", {91, 0}},
+{(unsigned char*)"lsquo", {226, 128, 152, 0}},
+{(unsigned char*)"lsquor", {226, 128, 154, 0}},
+{(unsigned char*)"lstrok", {197, 130, 0}},
+{(unsigned char*)"lt", {60, 0}},
+{(unsigned char*)"ltcc", {226, 170, 166, 0}},
+{(unsigned char*)"ltcir", {226, 169, 185, 0}},
+{(unsigned char*)"ltdot", {226, 139, 150, 0}},
+{(unsigned char*)"lthree", {226, 139, 139, 0}},
+{(unsigned char*)"ltimes", {226, 139, 137, 0}},
+{(unsigned char*)"ltlarr", {226, 165, 182, 0}},
+{(unsigned char*)"ltquest", {226, 169, 187, 0}},
+{(unsigned char*)"ltrPar", {226, 166, 150, 0}},
+{(unsigned char*)"ltri", {226, 151, 131, 0}},
+{(unsigned char*)"ltrie", {226, 138, 180, 0}},
+{(unsigned char*)"ltrif", {226, 151, 130, 0}},
+{(unsigned char*)"lurdshar", {226, 165, 138, 0}},
+{(unsigned char*)"luruhar", {226, 165, 166, 0}},
+{(unsigned char*)"lvertneqq", {226, 137, 168, 239, 184, 128, 0}},
+{(unsigned char*)"lvnE", {226, 137, 168, 239, 184, 128, 0}},
+{(unsigned char*)"mDDot", {226, 136, 186, 0}},
+{(unsigned char*)"macr", {194, 175, 0}},
+{(unsigned char*)"male", {226, 153, 130, 0}},
+{(unsigned char*)"malt", {226, 156, 160, 0}},
+{(unsigned char*)"maltese", {226, 156, 160, 0}},
+{(unsigned char*)"map", {226, 134, 166, 0}},
+{(unsigned char*)"mapsto", {226, 134, 166, 0}},
+{(unsigned char*)"mapstodown", {226, 134, 167, 0}},
+{(unsigned char*)"mapstoleft", {226, 134, 164, 0}},
+{(unsigned char*)"mapstoup", {226, 134, 165, 0}},
+{(unsigned char*)"marker", {226, 150, 174, 0}},
+{(unsigned char*)"mcomma", {226, 168, 169, 0}},
+{(unsigned char*)"mcy", {208, 188, 0}},
+{(unsigned char*)"mdash", {226, 128, 148, 0}},
+{(unsigned char*)"measuredangle", {226, 136, 161, 0}},
+{(unsigned char*)"mfr", {240, 157, 148, 170, 0}},
+{(unsigned char*)"mho", {226, 132, 167, 0}},
+{(unsigned char*)"micro", {194, 181, 0}},
+{(unsigned char*)"mid", {226, 136, 163, 0}},
+{(unsigned char*)"midast", {42, 0}},
+{(unsigned char*)"midcir", {226, 171, 176, 0}},
+{(unsigned char*)"middot", {194, 183, 0}},
+{(unsigned char*)"minus", {226, 136, 146, 0}},
+{(unsigned char*)"minusb", {226, 138, 159, 0}},
+{(unsigned char*)"minusd", {226, 136, 184, 0}},
+{(unsigned char*)"minusdu", {226, 168, 170, 0}},
+{(unsigned char*)"mlcp", {226, 171, 155, 0}},
+{(unsigned char*)"mldr", {226, 128, 166, 0}},
+{(unsigned char*)"mnplus", {226, 136, 147, 0}},
+{(unsigned char*)"models", {226, 138, 167, 0}},
+{(unsigned char*)"mopf", {240, 157, 149, 158, 0}},
+{(unsigned char*)"mp", {226, 136, 147, 0}},
+{(unsigned char*)"mscr", {240, 157, 147, 130, 0}},
+{(unsigned char*)"mstpos", {226, 136, 190, 0}},
+{(unsigned char*)"mu", {206, 188, 0}},
+{(unsigned char*)"multimap", {226, 138, 184, 0}},
+{(unsigned char*)"mumap", {226, 138, 184, 0}},
+{(unsigned char*)"nGg", {226, 139, 153, 204, 184, 0}},
+{(unsigned char*)"nGt", {226, 137, 171, 226, 131, 146, 0}},
+{(unsigned char*)"nGtv", {226, 137, 171, 204, 184, 0}},
+{(unsigned char*)"nLeftarrow", {226, 135, 141, 0}},
+{(unsigned char*)"nLeftrightarrow", {226, 135, 142, 0}},
+{(unsigned char*)"nLl", {226, 139, 152, 204, 184, 0}},
+{(unsigned char*)"nLt", {226, 137, 170, 226, 131, 146, 0}},
+{(unsigned char*)"nLtv", {226, 137, 170, 204, 184, 0}},
+{(unsigned char*)"nRightarrow", {226, 135, 143, 0}},
+{(unsigned char*)"nVDash", {226, 138, 175, 0}},
+{(unsigned char*)"nVdash", {226, 138, 174, 0}},
+{(unsigned char*)"nabla", {226, 136, 135, 0}},
+{(unsigned char*)"nacute", {197, 132, 0}},
+{(unsigned char*)"nang", {226, 136, 160, 226, 131, 146, 0}},
+{(unsigned char*)"nap", {226, 137, 137, 0}},
+{(unsigned char*)"napE", {226, 169, 176, 204, 184, 0}},
+{(unsigned char*)"napid", {226, 137, 139, 204, 184, 0}},
+{(unsigned char*)"napos", {197, 137, 0}},
+{(unsigned char*)"napprox", {226, 137, 137, 0}},
+{(unsigned char*)"natur", {226, 153, 174, 0}},
+{(unsigned char*)"natural", {226, 153, 174, 0}},
+{(unsigned char*)"naturals", {226, 132, 149, 0}},
+{(unsigned char*)"nbsp", {194, 160, 0}},
+{(unsigned char*)"nbump", {226, 137, 142, 204, 184, 0}},
+{(unsigned char*)"nbumpe", {226, 137, 143, 204, 184, 0}},
+{(unsigned char*)"ncap", {226, 169, 131, 0}},
+{(unsigned char*)"ncaron", {197, 136, 0}},
+{(unsigned char*)"ncedil", {197, 134, 0}},
+{(unsigned char*)"ncong", {226, 137, 135, 0}},
+{(unsigned char*)"ncongdot", {226, 169, 173, 204, 184, 0}},
+{(unsigned char*)"ncup", {226, 169, 130, 0}},
+{(unsigned char*)"ncy", {208, 189, 0}},
+{(unsigned char*)"ndash", {226, 128, 147, 0}},
+{(unsigned char*)"ne", {226, 137, 160, 0}},
+{(unsigned char*)"neArr", {226, 135, 151, 0}},
+{(unsigned char*)"nearhk", {226, 164, 164, 0}},
+{(unsigned char*)"nearr", {226, 134, 151, 0}},
+{(unsigned char*)"nearrow", {226, 134, 151, 0}},
+{(unsigned char*)"nedot", {226, 137, 144, 204, 184, 0}},
+{(unsigned char*)"nequiv", {226, 137, 162, 0}},
+{(unsigned char*)"nesear", {226, 164, 168, 0}},
+{(unsigned char*)"nesim", {226, 137, 130, 204, 184, 0}},
+{(unsigned char*)"nexist", {226, 136, 132, 0}},
+{(unsigned char*)"nexists", {226, 136, 132, 0}},
+{(unsigned char*)"nfr", {240, 157, 148, 171, 0}},
+{(unsigned char*)"ngE", {226, 137, 167, 204, 184, 0}},
+{(unsigned char*)"nge", {226, 137, 177, 0}},
+{(unsigned char*)"ngeq", {226, 137, 177, 0}},
+{(unsigned char*)"ngeqq", {226, 137, 167, 204, 184, 0}},
+{(unsigned char*)"ngeqslant", {226, 169, 190, 204, 184, 0}},
+{(unsigned char*)"nges", {226, 169, 190, 204, 184, 0}},
+{(unsigned char*)"ngsim", {226, 137, 181, 0}},
+{(unsigned char*)"ngt", {226, 137, 175, 0}},
+{(unsigned char*)"ngtr", {226, 137, 175, 0}},
+{(unsigned char*)"nhArr", {226, 135, 142, 0}},
+{(unsigned char*)"nharr", {226, 134, 174, 0}},
+{(unsigned char*)"nhpar", {226, 171, 178, 0}},
+{(unsigned char*)"ni", {226, 136, 139, 0}},
+{(unsigned char*)"nis", {226, 139, 188, 0}},
+{(unsigned char*)"nisd", {226, 139, 186, 0}},
+{(unsigned char*)"niv", {226, 136, 139, 0}},
+{(unsigned char*)"njcy", {209, 154, 0}},
+{(unsigned char*)"nlArr", {226, 135, 141, 0}},
+{(unsigned char*)"nlE", {226, 137, 166, 204, 184, 0}},
+{(unsigned char*)"nlarr", {226, 134, 154, 0}},
+{(unsigned char*)"nldr", {226, 128, 165, 0}},
+{(unsigned char*)"nle", {226, 137, 176, 0}},
+{(unsigned char*)"nleftarrow", {226, 134, 154, 0}},
+{(unsigned char*)"nleftrightarrow", {226, 134, 174, 0}},
+{(unsigned char*)"nleq", {226, 137, 176, 0}},
+{(unsigned char*)"nleqq", {226, 137, 166, 204, 184, 0}},
+{(unsigned char*)"nleqslant", {226, 169, 189, 204, 184, 0}},
+{(unsigned char*)"nles", {226, 169, 189, 204, 184, 0}},
+{(unsigned char*)"nless", {226, 137, 174, 0}},
+{(unsigned char*)"nlsim", {226, 137, 180, 0}},
+{(unsigned char*)"nlt", {226, 137, 174, 0}},
+{(unsigned char*)"nltri", {226, 139, 170, 0}},
+{(unsigned char*)"nltrie", {226, 139, 172, 0}},
+{(unsigned char*)"nmid", {226, 136, 164, 0}},
+{(unsigned char*)"nopf", {240, 157, 149, 159, 0}},
+{(unsigned char*)"not", {194, 172, 0}},
+{(unsigned char*)"notin", {226, 136, 137, 0}},
+{(unsigned char*)"notinE", {226, 139, 185, 204, 184, 0}},
+{(unsigned char*)"notindot", {226, 139, 181, 204, 184, 0}},
+{(unsigned char*)"notinva", {226, 136, 137, 0}},
+{(unsigned char*)"notinvb", {226, 139, 183, 0}},
+{(unsigned char*)"notinvc", {226, 139, 182, 0}},
+{(unsigned char*)"notni", {226, 136, 140, 0}},
+{(unsigned char*)"notniva", {226, 136, 140, 0}},
+{(unsigned char*)"notnivb", {226, 139, 190, 0}},
+{(unsigned char*)"notnivc", {226, 139, 189, 0}},
+{(unsigned char*)"npar", {226, 136, 166, 0}},
+{(unsigned char*)"nparallel", {226, 136, 166, 0}},
+{(unsigned char*)"nparsl", {226, 171, 189, 226, 131, 165, 0}},
+{(unsigned char*)"npart", {226, 136, 130, 204, 184, 0}},
+{(unsigned char*)"npolint", {226, 168, 148, 0}},
+{(unsigned char*)"npr", {226, 138, 128, 0}},
+{(unsigned char*)"nprcue", {226, 139, 160, 0}},
+{(unsigned char*)"npre", {226, 170, 175, 204, 184, 0}},
+{(unsigned char*)"nprec", {226, 138, 128, 0}},
+{(unsigned char*)"npreceq", {226, 170, 175, 204, 184, 0}},
+{(unsigned char*)"nrArr", {226, 135, 143, 0}},
+{(unsigned char*)"nrarr", {226, 134, 155, 0}},
+{(unsigned char*)"nrarrc", {226, 164, 179, 204, 184, 0}},
+{(unsigned char*)"nrarrw", {226, 134, 157, 204, 184, 0}},
+{(unsigned char*)"nrightarrow", {226, 134, 155, 0}},
+{(unsigned char*)"nrtri", {226, 139, 171, 0}},
+{(unsigned char*)"nrtrie", {226, 139, 173, 0}},
+{(unsigned char*)"nsc", {226, 138, 129, 0}},
+{(unsigned char*)"nsccue", {226, 139, 161, 0}},
+{(unsigned char*)"nsce", {226, 170, 176, 204, 184, 0}},
+{(unsigned char*)"nscr", {240, 157, 147, 131, 0}},
+{(unsigned char*)"nshortmid", {226, 136, 164, 0}},
+{(unsigned char*)"nshortparallel", {226, 136, 166, 0}},
+{(unsigned char*)"nsim", {226, 137, 129, 0}},
+{(unsigned char*)"nsime", {226, 137, 132, 0}},
+{(unsigned char*)"nsimeq", {226, 137, 132, 0}},
+{(unsigned char*)"nsmid", {226, 136, 164, 0}},
+{(unsigned char*)"nspar", {226, 136, 166, 0}},
+{(unsigned char*)"nsqsube", {226, 139, 162, 0}},
+{(unsigned char*)"nsqsupe", {226, 139, 163, 0}},
+{(unsigned char*)"nsub", {226, 138, 132, 0}},
+{(unsigned char*)"nsubE", {226, 171, 133, 204, 184, 0}},
+{(unsigned char*)"nsube", {226, 138, 136, 0}},
+{(unsigned char*)"nsubset", {226, 138, 130, 226, 131, 146, 0}},
+{(unsigned char*)"nsubseteq", {226, 138, 136, 0}},
+{(unsigned char*)"nsubseteqq", {226, 171, 133, 204, 184, 0}},
+{(unsigned char*)"nsucc", {226, 138, 129, 0}},
+{(unsigned char*)"nsucceq", {226, 170, 176, 204, 184, 0}},
+{(unsigned char*)"nsup", {226, 138, 133, 0}},
+{(unsigned char*)"nsupE", {226, 171, 134, 204, 184, 0}},
+{(unsigned char*)"nsupe", {226, 138, 137, 0}},
+{(unsigned char*)"nsupset", {226, 138, 131, 226, 131, 146, 0}},
+{(unsigned char*)"nsupseteq", {226, 138, 137, 0}},
+{(unsigned char*)"nsupseteqq", {226, 171, 134, 204, 184, 0}},
+{(unsigned char*)"ntgl", {226, 137, 185, 0}},
+{(unsigned char*)"ntilde", {195, 177, 0}},
+{(unsigned char*)"ntlg", {226, 137, 184, 0}},
+{(unsigned char*)"ntriangleleft", {226, 139, 170, 0}},
+{(unsigned char*)"ntrianglelefteq", {226, 139, 172, 0}},
+{(unsigned char*)"ntriangleright", {226, 139, 171, 0}},
+{(unsigned char*)"ntrianglerighteq", {226, 139, 173, 0}},
+{(unsigned char*)"nu", {206, 189, 0}},
+{(unsigned char*)"num", {35, 0}},
+{(unsigned char*)"numero", {226, 132, 150, 0}},
+{(unsigned char*)"numsp", {226, 128, 135, 0}},
+{(unsigned char*)"nvDash", {226, 138, 173, 0}},
+{(unsigned char*)"nvHarr", {226, 164, 132, 0}},
+{(unsigned char*)"nvap", {226, 137, 141, 226, 131, 146, 0}},
+{(unsigned char*)"nvdash", {226, 138, 172, 0}},
+{(unsigned char*)"nvge", {226, 137, 165, 226, 131, 146, 0}},
+{(unsigned char*)"nvgt", {62, 226, 131, 146, 0}},
+{(unsigned char*)"nvinfin", {226, 167, 158, 0}},
+{(unsigned char*)"nvlArr", {226, 164, 130, 0}},
+{(unsigned char*)"nvle", {226, 137, 164, 226, 131, 146, 0}},
+{(unsigned char*)"nvlt", {60, 226, 131, 146, 0}},
+{(unsigned char*)"nvltrie", {226, 138, 180, 226, 131, 146, 0}},
+{(unsigned char*)"nvrArr", {226, 164, 131, 0}},
+{(unsigned char*)"nvrtrie", {226, 138, 181, 226, 131, 146, 0}},
+{(unsigned char*)"nvsim", {226, 136, 188, 226, 131, 146, 0}},
+{(unsigned char*)"nwArr", {226, 135, 150, 0}},
+{(unsigned char*)"nwarhk", {226, 164, 163, 0}},
+{(unsigned char*)"nwarr", {226, 134, 150, 0}},
+{(unsigned char*)"nwarrow", {226, 134, 150, 0}},
+{(unsigned char*)"nwnear", {226, 164, 167, 0}},
+{(unsigned char*)"oS", {226, 147, 136, 0}},
+{(unsigned char*)"oacute", {195, 179, 0}},
+{(unsigned char*)"oast", {226, 138, 155, 0}},
+{(unsigned char*)"ocir", {226, 138, 154, 0}},
+{(unsigned char*)"ocirc", {195, 180, 0}},
+{(unsigned char*)"ocy", {208, 190, 0}},
+{(unsigned char*)"odash", {226, 138, 157, 0}},
+{(unsigned char*)"odblac", {197, 145, 0}},
+{(unsigned char*)"odiv", {226, 168, 184, 0}},
+{(unsigned char*)"odot", {226, 138, 153, 0}},
+{(unsigned char*)"odsold", {226, 166, 188, 0}},
+{(unsigned char*)"oelig", {197, 147, 0}},
+{(unsigned char*)"ofcir", {226, 166, 191, 0}},
+{(unsigned char*)"ofr", {240, 157, 148, 172, 0}},
+{(unsigned char*)"ogon", {203, 155, 0}},
+{(unsigned char*)"ograve", {195, 178, 0}},
+{(unsigned char*)"ogt", {226, 167, 129, 0}},
+{(unsigned char*)"ohbar", {226, 166, 181, 0}},
+{(unsigned char*)"ohm", {206, 169, 0}},
+{(unsigned char*)"oint", {226, 136, 174, 0}},
+{(unsigned char*)"olarr", {226, 134, 186, 0}},
+{(unsigned char*)"olcir", {226, 166, 190, 0}},
+{(unsigned char*)"olcross", {226, 166, 187, 0}},
+{(unsigned char*)"oline", {226, 128, 190, 0}},
+{(unsigned char*)"olt", {226, 167, 128, 0}},
+{(unsigned char*)"omacr", {197, 141, 0}},
+{(unsigned char*)"omega", {207, 137, 0}},
+{(unsigned char*)"omicron", {206, 191, 0}},
+{(unsigned char*)"omid", {226, 166, 182, 0}},
+{(unsigned char*)"ominus", {226, 138, 150, 0}},
+{(unsigned char*)"oopf", {240, 157, 149, 160, 0}},
+{(unsigned char*)"opar", {226, 166, 183, 0}},
+{(unsigned char*)"operp", {226, 166, 185, 0}},
+{(unsigned char*)"oplus", {226, 138, 149, 0}},
+{(unsigned char*)"or", {226, 136, 168, 0}},
+{(unsigned char*)"orarr", {226, 134, 187, 0}},
+{(unsigned char*)"ord", {226, 169, 157, 0}},
+{(unsigned char*)"order", {226, 132, 180, 0}},
+{(unsigned char*)"orderof", {226, 132, 180, 0}},
+{(unsigned char*)"ordf", {194, 170, 0}},
+{(unsigned char*)"ordm", {194, 186, 0}},
+{(unsigned char*)"origof", {226, 138, 182, 0}},
+{(unsigned char*)"oror", {226, 169, 150, 0}},
+{(unsigned char*)"orslope", {226, 169, 151, 0}},
+{(unsigned char*)"orv", {226, 169, 155, 0}},
+{(unsigned char*)"oscr", {226, 132, 180, 0}},
+{(unsigned char*)"oslash", {195, 184, 0}},
+{(unsigned char*)"osol", {226, 138, 152, 0}},
+{(unsigned char*)"otilde", {195, 181, 0}},
+{(unsigned char*)"otimes", {226, 138, 151, 0}},
+{(unsigned char*)"otimesas", {226, 168, 182, 0}},
+{(unsigned char*)"ouml", {195, 182, 0}},
+{(unsigned char*)"ovbar", {226, 140, 189, 0}},
+{(unsigned char*)"par", {226, 136, 165, 0}},
+{(unsigned char*)"para", {194, 182, 0}},
+{(unsigned char*)"parallel", {226, 136, 165, 0}},
+{(unsigned char*)"parsim", {226, 171, 179, 0}},
+{(unsigned char*)"parsl", {226, 171, 189, 0}},
+{(unsigned char*)"part", {226, 136, 130, 0}},
+{(unsigned char*)"pcy", {208, 191, 0}},
+{(unsigned char*)"percnt", {37, 0}},
+{(unsigned char*)"period", {46, 0}},
+{(unsigned char*)"permil", {226, 128, 176, 0}},
+{(unsigned char*)"perp", {226, 138, 165, 0}},
+{(unsigned char*)"pertenk", {226, 128, 177, 0}},
+{(unsigned char*)"pfr", {240, 157, 148, 173, 0}},
+{(unsigned char*)"phi", {207, 134, 0}},
+{(unsigned char*)"phiv", {207, 149, 0}},
+{(unsigned char*)"phmmat", {226, 132, 179, 0}},
+{(unsigned char*)"phone", {226, 152, 142, 0}},
+{(unsigned char*)"pi", {207, 128, 0}},
+{(unsigned char*)"pitchfork", {226, 139, 148, 0}},
+{(unsigned char*)"piv", {207, 150, 0}},
+{(unsigned char*)"planck", {226, 132, 143, 0}},
+{(unsigned char*)"planckh", {226, 132, 142, 0}},
+{(unsigned char*)"plankv", {226, 132, 143, 0}},
+{(unsigned char*)"plus", {43, 0}},
+{(unsigned char*)"plusacir", {226, 168, 163, 0}},
+{(unsigned char*)"plusb", {226, 138, 158, 0}},
+{(unsigned char*)"pluscir", {226, 168, 162, 0}},
+{(unsigned char*)"plusdo", {226, 136, 148, 0}},
+{(unsigned char*)"plusdu", {226, 168, 165, 0}},
+{(unsigned char*)"pluse", {226, 169, 178, 0}},
+{(unsigned char*)"plusmn", {194, 177, 0}},
+{(unsigned char*)"plussim", {226, 168, 166, 0}},
+{(unsigned char*)"plustwo", {226, 168, 167, 0}},
+{(unsigned char*)"pm", {194, 177, 0}},
+{(unsigned char*)"pointint", {226, 168, 149, 0}},
+{(unsigned char*)"popf", {240, 157, 149, 161, 0}},
+{(unsigned char*)"pound", {194, 163, 0}},
+{(unsigned char*)"pr", {226, 137, 186, 0}},
+{(unsigned char*)"prE", {226, 170, 179, 0}},
+{(unsigned char*)"prap", {226, 170, 183, 0}},
+{(unsigned char*)"prcue", {226, 137, 188, 0}},
+{(unsigned char*)"pre", {226, 170, 175, 0}},
+{(unsigned char*)"prec", {226, 137, 186, 0}},
+{(unsigned char*)"precapprox", {226, 170, 183, 0}},
+{(unsigned char*)"preccurlyeq", {226, 137, 188, 0}},
+{(unsigned char*)"preceq", {226, 170, 175, 0}},
+{(unsigned char*)"precnapprox", {226, 170, 185, 0}},
+{(unsigned char*)"precneqq", {226, 170, 181, 0}},
+{(unsigned char*)"precnsim", {226, 139, 168, 0}},
+{(unsigned char*)"precsim", {226, 137, 190, 0}},
+{(unsigned char*)"prime", {226, 128, 178, 0}},
+{(unsigned char*)"primes", {226, 132, 153, 0}},
+{(unsigned char*)"prnE", {226, 170, 181, 0}},
+{(unsigned char*)"prnap", {226, 170, 185, 0}},
+{(unsigned char*)"prnsim", {226, 139, 168, 0}},
+{(unsigned char*)"prod", {226, 136, 143, 0}},
+{(unsigned char*)"profalar", {226, 140, 174, 0}},
+{(unsigned char*)"profline", {226, 140, 146, 0}},
+{(unsigned char*)"profsurf", {226, 140, 147, 0}},
+{(unsigned char*)"prop", {226, 136, 157, 0}},
+{(unsigned char*)"propto", {226, 136, 157, 0}},
+{(unsigned char*)"prsim", {226, 137, 190, 0}},
+{(unsigned char*)"prurel", {226, 138, 176, 0}},
+{(unsigned char*)"pscr", {240, 157, 147, 133, 0}},
+{(unsigned char*)"psi", {207, 136, 0}},
+{(unsigned char*)"puncsp", {226, 128, 136, 0}},
+{(unsigned char*)"qfr", {240, 157, 148, 174, 0}},
+{(unsigned char*)"qint", {226, 168, 140, 0}},
+{(unsigned char*)"qopf", {240, 157, 149, 162, 0}},
+{(unsigned char*)"qprime", {226, 129, 151, 0}},
+{(unsigned char*)"qscr", {240, 157, 147, 134, 0}},
+{(unsigned char*)"quaternions", {226, 132, 141, 0}},
+{(unsigned char*)"quatint", {226, 168, 150, 0}},
+{(unsigned char*)"quest", {63, 0}},
+{(unsigned char*)"questeq", {226, 137, 159, 0}},
+{(unsigned char*)"quot", {34, 0}},
+{(unsigned char*)"rAarr", {226, 135, 155, 0}},
+{(unsigned char*)"rArr", {226, 135, 146, 0}},
+{(unsigned char*)"rAtail", {226, 164, 156, 0}},
+{(unsigned char*)"rBarr", {226, 164, 143, 0}},
+{(unsigned char*)"rHar", {226, 165, 164, 0}},
+{(unsigned char*)"race", {226, 136, 189, 204, 177, 0}},
+{(unsigned char*)"racute", {197, 149, 0}},
+{(unsigned char*)"radic", {226, 136, 154, 0}},
+{(unsigned char*)"raemptyv", {226, 166, 179, 0}},
+{(unsigned char*)"rang", {226, 159, 169, 0}},
+{(unsigned char*)"rangd", {226, 166, 146, 0}},
+{(unsigned char*)"range", {226, 166, 165, 0}},
+{(unsigned char*)"rangle", {226, 159, 169, 0}},
+{(unsigned char*)"raquo", {194, 187, 0}},
+{(unsigned char*)"rarr", {226, 134, 146, 0}},
+{(unsigned char*)"rarrap", {226, 165, 181, 0}},
+{(unsigned char*)"rarrb", {226, 135, 165, 0}},
+{(unsigned char*)"rarrbfs", {226, 164, 160, 0}},
+{(unsigned char*)"rarrc", {226, 164, 179, 0}},
+{(unsigned char*)"rarrfs", {226, 164, 158, 0}},
+{(unsigned char*)"rarrhk", {226, 134, 170, 0}},
+{(unsigned char*)"rarrlp", {226, 134, 172, 0}},
+{(unsigned char*)"rarrpl", {226, 165, 133, 0}},
+{(unsigned char*)"rarrsim", {226, 165, 180, 0}},
+{(unsigned char*)"rarrtl", {226, 134, 163, 0}},
+{(unsigned char*)"rarrw", {226, 134, 157, 0}},
+{(unsigned char*)"ratail", {226, 164, 154, 0}},
+{(unsigned char*)"ratio", {226, 136, 182, 0}},
+{(unsigned char*)"rationals", {226, 132, 154, 0}},
+{(unsigned char*)"rbarr", {226, 164, 141, 0}},
+{(unsigned char*)"rbbrk", {226, 157, 179, 0}},
+{(unsigned char*)"rbrace", {125, 0}},
+{(unsigned char*)"rbrack", {93, 0}},
+{(unsigned char*)"rbrke", {226, 166, 140, 0}},
+{(unsigned char*)"rbrksld", {226, 166, 142, 0}},
+{(unsigned char*)"rbrkslu", {226, 166, 144, 0}},
+{(unsigned char*)"rcaron", {197, 153, 0}},
+{(unsigned char*)"rcedil", {197, 151, 0}},
+{(unsigned char*)"rceil", {226, 140, 137, 0}},
+{(unsigned char*)"rcub", {125, 0}},
+{(unsigned char*)"rcy", {209, 128, 0}},
+{(unsigned char*)"rdca", {226, 164, 183, 0}},
+{(unsigned char*)"rdldhar", {226, 165, 169, 0}},
+{(unsigned char*)"rdquo", {226, 128, 157, 0}},
+{(unsigned char*)"rdquor", {226, 128, 157, 0}},
+{(unsigned char*)"rdsh", {226, 134, 179, 0}},
+{(unsigned char*)"real", {226, 132, 156, 0}},
+{(unsigned char*)"realine", {226, 132, 155, 0}},
+{(unsigned char*)"realpart", {226, 132, 156, 0}},
+{(unsigned char*)"reals", {226, 132, 157, 0}},
+{(unsigned char*)"rect", {226, 150, 173, 0}},
+{(unsigned char*)"reg", {194, 174, 0}},
+{(unsigned char*)"rfisht", {226, 165, 189, 0}},
+{(unsigned char*)"rfloor", {226, 140, 139, 0}},
+{(unsigned char*)"rfr", {240, 157, 148, 175, 0}},
+{(unsigned char*)"rhard", {226, 135, 129, 0}},
+{(unsigned char*)"rharu", {226, 135, 128, 0}},
+{(unsigned char*)"rharul", {226, 165, 172, 0}},
+{(unsigned char*)"rho", {207, 129, 0}},
+{(unsigned char*)"rhov", {207, 177, 0}},
+{(unsigned char*)"rightarrow", {226, 134, 146, 0}},
+{(unsigned char*)"rightarrowtail", {226, 134, 163, 0}},
+{(unsigned char*)"rightharpoondown", {226, 135, 129, 0}},
+{(unsigned char*)"rightharpoonup", {226, 135, 128, 0}},
+{(unsigned char*)"rightleftarrows", {226, 135, 132, 0}},
+{(unsigned char*)"rightleftharpoons", {226, 135, 140, 0}},
+{(unsigned char*)"rightrightarrows", {226, 135, 137, 0}},
+{(unsigned char*)"rightsquigarrow", {226, 134, 157, 0}},
+{(unsigned char*)"rightthreetimes", {226, 139, 140, 0}},
+{(unsigned char*)"ring", {203, 154, 0}},
+{(unsigned char*)"risingdotseq", {226, 137, 147, 0}},
+{(unsigned char*)"rlarr", {226, 135, 132, 0}},
+{(unsigned char*)"rlhar", {226, 135, 140, 0}},
+{(unsigned char*)"rlm", {226, 128, 143, 0}},
+{(unsigned char*)"rmoust", {226, 142, 177, 0}},
+{(unsigned char*)"rmoustache", {226, 142, 177, 0}},
+{(unsigned char*)"rnmid", {226, 171, 174, 0}},
+{(unsigned char*)"roang", {226, 159, 173, 0}},
+{(unsigned char*)"roarr", {226, 135, 190, 0}},
+{(unsigned char*)"robrk", {226, 159, 167, 0}},
+{(unsigned char*)"ropar", {226, 166, 134, 0}},
+{(unsigned char*)"ropf", {240, 157, 149, 163, 0}},
+{(unsigned char*)"roplus", {226, 168, 174, 0}},
+{(unsigned char*)"rotimes", {226, 168, 181, 0}},
+{(unsigned char*)"rpar", {41, 0}},
+{(unsigned char*)"rpargt", {226, 166, 148, 0}},
+{(unsigned char*)"rppolint", {226, 168, 146, 0}},
+{(unsigned char*)"rrarr", {226, 135, 137, 0}},
+{(unsigned char*)"rsaquo", {226, 128, 186, 0}},
+{(unsigned char*)"rscr", {240, 157, 147, 135, 0}},
+{(unsigned char*)"rsh", {226, 134, 177, 0}},
+{(unsigned char*)"rsqb", {93, 0}},
+{(unsigned char*)"rsquo", {226, 128, 153, 0}},
+{(unsigned char*)"rsquor", {226, 128, 153, 0}},
+{(unsigned char*)"rthree", {226, 139, 140, 0}},
+{(unsigned char*)"rtimes", {226, 139, 138, 0}},
+{(unsigned char*)"rtri", {226, 150, 185, 0}},
+{(unsigned char*)"rtrie", {226, 138, 181, 0}},
+{(unsigned char*)"rtrif", {226, 150, 184, 0}},
+{(unsigned char*)"rtriltri", {226, 167, 142, 0}},
+{(unsigned char*)"ruluhar", {226, 165, 168, 0}},
+{(unsigned char*)"rx", {226, 132, 158, 0}},
+{(unsigned char*)"sacute", {197, 155, 0}},
+{(unsigned char*)"sbquo", {226, 128, 154, 0}},
+{(unsigned char*)"sc", {226, 137, 187, 0}},
+{(unsigned char*)"scE", {226, 170, 180, 0}},
+{(unsigned char*)"scap", {226, 170, 184, 0}},
+{(unsigned char*)"scaron", {197, 161, 0}},
+{(unsigned char*)"sccue", {226, 137, 189, 0}},
+{(unsigned char*)"sce", {226, 170, 176, 0}},
+{(unsigned char*)"scedil", {197, 159, 0}},
+{(unsigned char*)"scirc", {197, 157, 0}},
+{(unsigned char*)"scnE", {226, 170, 182, 0}},
+{(unsigned char*)"scnap", {226, 170, 186, 0}},
+{(unsigned char*)"scnsim", {226, 139, 169, 0}},
+{(unsigned char*)"scpolint", {226, 168, 147, 0}},
+{(unsigned char*)"scsim", {226, 137, 191, 0}},
+{(unsigned char*)"scy", {209, 129, 0}},
+{(unsigned char*)"sdot", {226, 139, 133, 0}},
+{(unsigned char*)"sdotb", {226, 138, 161, 0}},
+{(unsigned char*)"sdote", {226, 169, 166, 0}},
+{(unsigned char*)"seArr", {226, 135, 152, 0}},
+{(unsigned char*)"searhk", {226, 164, 165, 0}},
+{(unsigned char*)"searr", {226, 134, 152, 0}},
+{(unsigned char*)"searrow", {226, 134, 152, 0}},
+{(unsigned char*)"sect", {194, 167, 0}},
+{(unsigned char*)"semi", {59, 0}},
+{(unsigned char*)"seswar", {226, 164, 169, 0}},
+{(unsigned char*)"setminus", {226, 136, 150, 0}},
+{(unsigned char*)"setmn", {226, 136, 150, 0}},
+{(unsigned char*)"sext", {226, 156, 182, 0}},
+{(unsigned char*)"sfr", {240, 157, 148, 176, 0}},
+{(unsigned char*)"sfrown", {226, 140, 162, 0}},
+{(unsigned char*)"sharp", {226, 153, 175, 0}},
+{(unsigned char*)"shchcy", {209, 137, 0}},
+{(unsigned char*)"shcy", {209, 136, 0}},
+{(unsigned char*)"shortmid", {226, 136, 163, 0}},
+{(unsigned char*)"shortparallel", {226, 136, 165, 0}},
+{(unsigned char*)"shy", {194, 173, 0}},
+{(unsigned char*)"sigma", {207, 131, 0}},
+{(unsigned char*)"sigmaf", {207, 130, 0}},
+{(unsigned char*)"sigmav", {207, 130, 0}},
+{(unsigned char*)"sim", {226, 136, 188, 0}},
+{(unsigned char*)"simdot", {226, 169, 170, 0}},
+{(unsigned char*)"sime", {226, 137, 131, 0}},
+{(unsigned char*)"simeq", {226, 137, 131, 0}},
+{(unsigned char*)"simg", {226, 170, 158, 0}},
+{(unsigned char*)"simgE", {226, 170, 160, 0}},
+{(unsigned char*)"siml", {226, 170, 157, 0}},
+{(unsigned char*)"simlE", {226, 170, 159, 0}},
+{(unsigned char*)"simne", {226, 137, 134, 0}},
+{(unsigned char*)"simplus", {226, 168, 164, 0}},
+{(unsigned char*)"simrarr", {226, 165, 178, 0}},
+{(unsigned char*)"slarr", {226, 134, 144, 0}},
+{(unsigned char*)"smallsetminus", {226, 136, 150, 0}},
+{(unsigned char*)"smashp", {226, 168, 179, 0}},
+{(unsigned char*)"smeparsl", {226, 167, 164, 0}},
+{(unsigned char*)"smid", {226, 136, 163, 0}},
+{(unsigned char*)"smile", {226, 140, 163, 0}},
+{(unsigned char*)"smt", {226, 170, 170, 0}},
+{(unsigned char*)"smte", {226, 170, 172, 0}},
+{(unsigned char*)"smtes", {226, 170, 172, 239, 184, 128, 0}},
+{(unsigned char*)"softcy", {209, 140, 0}},
+{(unsigned char*)"sol", {47, 0}},
+{(unsigned char*)"solb", {226, 167, 132, 0}},
+{(unsigned char*)"solbar", {226, 140, 191, 0}},
+{(unsigned char*)"sopf", {240, 157, 149, 164, 0}},
+{(unsigned char*)"spades", {226, 153, 160, 0}},
+{(unsigned char*)"spadesuit", {226, 153, 160, 0}},
+{(unsigned char*)"spar", {226, 136, 165, 0}},
+{(unsigned char*)"sqcap", {226, 138, 147, 0}},
+{(unsigned char*)"sqcaps", {226, 138, 147, 239, 184, 128, 0}},
+{(unsigned char*)"sqcup", {226, 138, 148, 0}},
+{(unsigned char*)"sqcups", {226, 138, 148, 239, 184, 128, 0}},
+{(unsigned char*)"sqsub", {226, 138, 143, 0}},
+{(unsigned char*)"sqsube", {226, 138, 145, 0}},
+{(unsigned char*)"sqsubset", {226, 138, 143, 0}},
+{(unsigned char*)"sqsubseteq", {226, 138, 145, 0}},
+{(unsigned char*)"sqsup", {226, 138, 144, 0}},
+{(unsigned char*)"sqsupe", {226, 138, 146, 0}},
+{(unsigned char*)"sqsupset", {226, 138, 144, 0}},
+{(unsigned char*)"sqsupseteq", {226, 138, 146, 0}},
+{(unsigned char*)"squ", {226, 150, 161, 0}},
+{(unsigned char*)"square", {226, 150, 161, 0}},
+{(unsigned char*)"squarf", {226, 150, 170, 0}},
+{(unsigned char*)"squf", {226, 150, 170, 0}},
+{(unsigned char*)"srarr", {226, 134, 146, 0}},
+{(unsigned char*)"sscr", {240, 157, 147, 136, 0}},
+{(unsigned char*)"ssetmn", {226, 136, 150, 0}},
+{(unsigned char*)"ssmile", {226, 140, 163, 0}},
+{(unsigned char*)"sstarf", {226, 139, 134, 0}},
+{(unsigned char*)"star", {226, 152, 134, 0}},
+{(unsigned char*)"starf", {226, 152, 133, 0}},
+{(unsigned char*)"straightepsilon", {207, 181, 0}},
+{(unsigned char*)"straightphi", {207, 149, 0}},
+{(unsigned char*)"strns", {194, 175, 0}},
+{(unsigned char*)"sub", {226, 138, 130, 0}},
+{(unsigned char*)"subE", {226, 171, 133, 0}},
+{(unsigned char*)"subdot", {226, 170, 189, 0}},
+{(unsigned char*)"sube", {226, 138, 134, 0}},
+{(unsigned char*)"subedot", {226, 171, 131, 0}},
+{(unsigned char*)"submult", {226, 171, 129, 0}},
+{(unsigned char*)"subnE", {226, 171, 139, 0}},
+{(unsigned char*)"subne", {226, 138, 138, 0}},
+{(unsigned char*)"subplus", {226, 170, 191, 0}},
+{(unsigned char*)"subrarr", {226, 165, 185, 0}},
+{(unsigned char*)"subset", {226, 138, 130, 0}},
+{(unsigned char*)"subseteq", {226, 138, 134, 0}},
+{(unsigned char*)"subseteqq", {226, 171, 133, 0}},
+{(unsigned char*)"subsetneq", {226, 138, 138, 0}},
+{(unsigned char*)"subsetneqq", {226, 171, 139, 0}},
+{(unsigned char*)"subsim", {226, 171, 135, 0}},
+{(unsigned char*)"subsub", {226, 171, 149, 0}},
+{(unsigned char*)"subsup", {226, 171, 147, 0}},
+{(unsigned char*)"succ", {226, 137, 187, 0}},
+{(unsigned char*)"succapprox", {226, 170, 184, 0}},
+{(unsigned char*)"succcurlyeq", {226, 137, 189, 0}},
+{(unsigned char*)"succeq", {226, 170, 176, 0}},
+{(unsigned char*)"succnapprox", {226, 170, 186, 0}},
+{(unsigned char*)"succneqq", {226, 170, 182, 0}},
+{(unsigned char*)"succnsim", {226, 139, 169, 0}},
+{(unsigned char*)"succsim", {226, 137, 191, 0}},
+{(unsigned char*)"sum", {226, 136, 145, 0}},
+{(unsigned char*)"sung", {226, 153, 170, 0}},
+{(unsigned char*)"sup", {226, 138, 131, 0}},
+{(unsigned char*)"sup1", {194, 185, 0}},
+{(unsigned char*)"sup2", {194, 178, 0}},
+{(unsigned char*)"sup3", {194, 179, 0}},
+{(unsigned char*)"supE", {226, 171, 134, 0}},
+{(unsigned char*)"supdot", {226, 170, 190, 0}},
+{(unsigned char*)"supdsub", {226, 171, 152, 0}},
+{(unsigned char*)"supe", {226, 138, 135, 0}},
+{(unsigned char*)"supedot", {226, 171, 132, 0}},
+{(unsigned char*)"suphsol", {226, 159, 137, 0}},
+{(unsigned char*)"suphsub", {226, 171, 151, 0}},
+{(unsigned char*)"suplarr", {226, 165, 187, 0}},
+{(unsigned char*)"supmult", {226, 171, 130, 0}},
+{(unsigned char*)"supnE", {226, 171, 140, 0}},
+{(unsigned char*)"supne", {226, 138, 139, 0}},
+{(unsigned char*)"supplus", {226, 171, 128, 0}},
+{(unsigned char*)"supset", {226, 138, 131, 0}},
+{(unsigned char*)"supseteq", {226, 138, 135, 0}},
+{(unsigned char*)"supseteqq", {226, 171, 134, 0}},
+{(unsigned char*)"supsetneq", {226, 138, 139, 0}},
+{(unsigned char*)"supsetneqq", {226, 171, 140, 0}},
+{(unsigned char*)"supsim", {226, 171, 136, 0}},
+{(unsigned char*)"supsub", {226, 171, 148, 0}},
+{(unsigned char*)"supsup", {226, 171, 150, 0}},
+{(unsigned char*)"swArr", {226, 135, 153, 0}},
+{(unsigned char*)"swarhk", {226, 164, 166, 0}},
+{(unsigned char*)"swarr", {226, 134, 153, 0}},
+{(unsigned char*)"swarrow", {226, 134, 153, 0}},
+{(unsigned char*)"swnwar", {226, 164, 170, 0}},
+{(unsigned char*)"szlig", {195, 159, 0}},
+{(unsigned char*)"target", {226, 140, 150, 0}},
+{(unsigned char*)"tau", {207, 132, 0}},
+{(unsigned char*)"tbrk", {226, 142, 180, 0}},
+{(unsigned char*)"tcaron", {197, 165, 0}},
+{(unsigned char*)"tcedil", {197, 163, 0}},
+{(unsigned char*)"tcy", {209, 130, 0}},
+{(unsigned char*)"tdot", {226, 131, 155, 0}},
+{(unsigned char*)"telrec", {226, 140, 149, 0}},
+{(unsigned char*)"tfr", {240, 157, 148, 177, 0}},
+{(unsigned char*)"there4", {226, 136, 180, 0}},
+{(unsigned char*)"therefore", {226, 136, 180, 0}},
+{(unsigned char*)"theta", {206, 184, 0}},
+{(unsigned char*)"thetasym", {207, 145, 0}},
+{(unsigned char*)"thetav", {207, 145, 0}},
+{(unsigned char*)"thickapprox", {226, 137, 136, 0}},
+{(unsigned char*)"thicksim", {226, 136, 188, 0}},
+{(unsigned char*)"thinsp", {226, 128, 137, 0}},
+{(unsigned char*)"thkap", {226, 137, 136, 0}},
+{(unsigned char*)"thksim", {226, 136, 188, 0}},
+{(unsigned char*)"thorn", {195, 190, 0}},
+{(unsigned char*)"tilde", {203, 156, 0}},
+{(unsigned char*)"times", {195, 151, 0}},
+{(unsigned char*)"timesb", {226, 138, 160, 0}},
+{(unsigned char*)"timesbar", {226, 168, 177, 0}},
+{(unsigned char*)"timesd", {226, 168, 176, 0}},
+{(unsigned char*)"tint", {226, 136, 173, 0}},
+{(unsigned char*)"toea", {226, 164, 168, 0}},
+{(unsigned char*)"top", {226, 138, 164, 0}},
+{(unsigned char*)"topbot", {226, 140, 182, 0}},
+{(unsigned char*)"topcir", {226, 171, 177, 0}},
+{(unsigned char*)"topf", {240, 157, 149, 165, 0}},
+{(unsigned char*)"topfork", {226, 171, 154, 0}},
+{(unsigned char*)"tosa", {226, 164, 169, 0}},
+{(unsigned char*)"tprime", {226, 128, 180, 0}},
+{(unsigned char*)"trade", {226, 132, 162, 0}},
+{(unsigned char*)"triangle", {226, 150, 181, 0}},
+{(unsigned char*)"triangledown", {226, 150, 191, 0}},
+{(unsigned char*)"triangleleft", {226, 151, 131, 0}},
+{(unsigned char*)"trianglelefteq", {226, 138, 180, 0}},
+{(unsigned char*)"triangleq", {226, 137, 156, 0}},
+{(unsigned char*)"triangleright", {226, 150, 185, 0}},
+{(unsigned char*)"trianglerighteq", {226, 138, 181, 0}},
+{(unsigned char*)"tridot", {226, 151, 172, 0}},
+{(unsigned char*)"trie", {226, 137, 156, 0}},
+{(unsigned char*)"triminus", {226, 168, 186, 0}},
+{(unsigned char*)"triplus", {226, 168, 185, 0}},
+{(unsigned char*)"trisb", {226, 167, 141, 0}},
+{(unsigned char*)"tritime", {226, 168, 187, 0}},
+{(unsigned char*)"trpezium", {226, 143, 162, 0}},
+{(unsigned char*)"tscr", {240, 157, 147, 137, 0}},
+{(unsigned char*)"tscy", {209, 134, 0}},
+{(unsigned char*)"tshcy", {209, 155, 0}},
+{(unsigned char*)"tstrok", {197, 167, 0}},
+{(unsigned char*)"twixt", {226, 137, 172, 0}},
+{(unsigned char*)"twoheadleftarrow", {226, 134, 158, 0}},
+{(unsigned char*)"twoheadrightarrow", {226, 134, 160, 0}},
+{(unsigned char*)"uArr", {226, 135, 145, 0}},
+{(unsigned char*)"uHar", {226, 165, 163, 0}},
+{(unsigned char*)"uacute", {195, 186, 0}},
+{(unsigned char*)"uarr", {226, 134, 145, 0}},
+{(unsigned char*)"ubrcy", {209, 158, 0}},
+{(unsigned char*)"ubreve", {197, 173, 0}},
+{(unsigned char*)"ucirc", {195, 187, 0}},
+{(unsigned char*)"ucy", {209, 131, 0}},
+{(unsigned char*)"udarr", {226, 135, 133, 0}},
+{(unsigned char*)"udblac", {197, 177, 0}},
+{(unsigned char*)"udhar", {226, 165, 174, 0}},
+{(unsigned char*)"ufisht", {226, 165, 190, 0}},
+{(unsigned char*)"ufr", {240, 157, 148, 178, 0}},
+{(unsigned char*)"ugrave", {195, 185, 0}},
+{(unsigned char*)"uharl", {226, 134, 191, 0}},
+{(unsigned char*)"uharr", {226, 134, 190, 0}},
+{(unsigned char*)"uhblk", {226, 150, 128, 0}},
+{(unsigned char*)"ulcorn", {226, 140, 156, 0}},
+{(unsigned char*)"ulcorner", {226, 140, 156, 0}},
+{(unsigned char*)"ulcrop", {226, 140, 143, 0}},
+{(unsigned char*)"ultri", {226, 151, 184, 0}},
+{(unsigned char*)"umacr", {197, 171, 0}},
+{(unsigned char*)"uml", {194, 168, 0}},
+{(unsigned char*)"uogon", {197, 179, 0}},
+{(unsigned char*)"uopf", {240, 157, 149, 166, 0}},
+{(unsigned char*)"uparrow", {226, 134, 145, 0}},
+{(unsigned char*)"updownarrow", {226, 134, 149, 0}},
+{(unsigned char*)"upharpoonleft", {226, 134, 191, 0}},
+{(unsigned char*)"upharpoonright", {226, 134, 190, 0}},
+{(unsigned char*)"uplus", {226, 138, 142, 0}},
+{(unsigned char*)"upsi", {207, 133, 0}},
+{(unsigned char*)"upsih", {207, 146, 0}},
+{(unsigned char*)"upsilon", {207, 133, 0}},
+{(unsigned char*)"upuparrows", {226, 135, 136, 0}},
+{(unsigned char*)"urcorn", {226, 140, 157, 0}},
+{(unsigned char*)"urcorner", {226, 140, 157, 0}},
+{(unsigned char*)"urcrop", {226, 140, 142, 0}},
+{(unsigned char*)"uring", {197, 175, 0}},
+{(unsigned char*)"urtri", {226, 151, 185, 0}},
+{(unsigned char*)"uscr", {240, 157, 147, 138, 0}},
+{(unsigned char*)"utdot", {226, 139, 176, 0}},
+{(unsigned char*)"utilde", {197, 169, 0}},
+{(unsigned char*)"utri", {226, 150, 181, 0}},
+{(unsigned char*)"utrif", {226, 150, 180, 0}},
+{(unsigned char*)"uuarr", {226, 135, 136, 0}},
+{(unsigned char*)"uuml", {195, 188, 0}},
+{(unsigned char*)"uwangle", {226, 166, 167, 0}},
+{(unsigned char*)"vArr", {226, 135, 149, 0}},
+{(unsigned char*)"vBar", {226, 171, 168, 0}},
+{(unsigned char*)"vBarv", {226, 171, 169, 0}},
+{(unsigned char*)"vDash", {226, 138, 168, 0}},
+{(unsigned char*)"vangrt", {226, 166, 156, 0}},
+{(unsigned char*)"varepsilon", {207, 181, 0}},
+{(unsigned char*)"varkappa", {207, 176, 0}},
+{(unsigned char*)"varnothing", {226, 136, 133, 0}},
+{(unsigned char*)"varphi", {207, 149, 0}},
+{(unsigned char*)"varpi", {207, 150, 0}},
+{(unsigned char*)"varpropto", {226, 136, 157, 0}},
+{(unsigned char*)"varr", {226, 134, 149, 0}},
+{(unsigned char*)"varrho", {207, 177, 0}},
+{(unsigned char*)"varsigma", {207, 130, 0}},
+{(unsigned char*)"varsubsetneq", {226, 138, 138, 239, 184, 128, 0}},
+{(unsigned char*)"varsubsetneqq", {226, 171, 139, 239, 184, 128, 0}},
+{(unsigned char*)"varsupsetneq", {226, 138, 139, 239, 184, 128, 0}},
+{(unsigned char*)"varsupsetneqq", {226, 171, 140, 239, 184, 128, 0}},
+{(unsigned char*)"vartheta", {207, 145, 0}},
+{(unsigned char*)"vartriangleleft", {226, 138, 178, 0}},
+{(unsigned char*)"vartriangleright", {226, 138, 179, 0}},
+{(unsigned char*)"vcy", {208, 178, 0}},
+{(unsigned char*)"vdash", {226, 138, 162, 0}},
+{(unsigned char*)"vee", {226, 136, 168, 0}},
+{(unsigned char*)"veebar", {226, 138, 187, 0}},
+{(unsigned char*)"veeeq", {226, 137, 154, 0}},
+{(unsigned char*)"vellip", {226, 139, 174, 0}},
+{(unsigned char*)"verbar", {124, 0}},
+{(unsigned char*)"vert", {124, 0}},
+{(unsigned char*)"vfr", {240, 157, 148, 179, 0}},
+{(unsigned char*)"vltri", {226, 138, 178, 0}},
+{(unsigned char*)"vnsub", {226, 138, 130, 226, 131, 146, 0}},
+{(unsigned char*)"vnsup", {226, 138, 131, 226, 131, 146, 0}},
+{(unsigned char*)"vopf", {240, 157, 149, 167, 0}},
+{(unsigned char*)"vprop", {226, 136, 157, 0}},
+{(unsigned char*)"vrtri", {226, 138, 179, 0}},
+{(unsigned char*)"vscr", {240, 157, 147, 139, 0}},
+{(unsigned char*)"vsubnE", {226, 171, 139, 239, 184, 128, 0}},
+{(unsigned char*)"vsubne", {226, 138, 138, 239, 184, 128, 0}},
+{(unsigned char*)"vsupnE", {226, 171, 140, 239, 184, 128, 0}},
+{(unsigned char*)"vsupne", {226, 138, 139, 239, 184, 128, 0}},
+{(unsigned char*)"vzigzag", {226, 166, 154, 0}},
+{(unsigned char*)"wcirc", {197, 181, 0}},
+{(unsigned char*)"wedbar", {226, 169, 159, 0}},
+{(unsigned char*)"wedge", {226, 136, 167, 0}},
+{(unsigned char*)"wedgeq", {226, 137, 153, 0}},
+{(unsigned char*)"weierp", {226, 132, 152, 0}},
+{(unsigned char*)"wfr", {240, 157, 148, 180, 0}},
+{(unsigned char*)"wopf", {240, 157, 149, 168, 0}},
+{(unsigned char*)"wp", {226, 132, 152, 0}},
+{(unsigned char*)"wr", {226, 137, 128, 0}},
+{(unsigned char*)"wreath", {226, 137, 128, 0}},
+{(unsigned char*)"wscr", {240, 157, 147, 140, 0}},
+{(unsigned char*)"xcap", {226, 139, 130, 0}},
+{(unsigned char*)"xcirc", {226, 151, 175, 0}},
+{(unsigned char*)"xcup", {226, 139, 131, 0}},
+{(unsigned char*)"xdtri", {226, 150, 189, 0}},
+{(unsigned char*)"xfr", {240, 157, 148, 181, 0}},
+{(unsigned char*)"xhArr", {226, 159, 186, 0}},
+{(unsigned char*)"xharr", {226, 159, 183, 0}},
+{(unsigned char*)"xi", {206, 190, 0}},
+{(unsigned char*)"xlArr", {226, 159, 184, 0}},
+{(unsigned char*)"xlarr", {226, 159, 181, 0}},
+{(unsigned char*)"xmap", {226, 159, 188, 0}},
+{(unsigned char*)"xnis", {226, 139, 187, 0}},
+{(unsigned char*)"xodot", {226, 168, 128, 0}},
+{(unsigned char*)"xopf", {240, 157, 149, 169, 0}},
+{(unsigned char*)"xoplus", {226, 168, 129, 0}},
+{(unsigned char*)"xotime", {226, 168, 130, 0}},
+{(unsigned char*)"xrArr", {226, 159, 185, 0}},
+{(unsigned char*)"xrarr", {226, 159, 182, 0}},
+{(unsigned char*)"xscr", {240, 157, 147, 141, 0}},
+{(unsigned char*)"xsqcup", {226, 168, 134, 0}},
+{(unsigned char*)"xuplus", {226, 168, 132, 0}},
+{(unsigned char*)"xutri", {226, 150, 179, 0}},
+{(unsigned char*)"xvee", {226, 139, 129, 0}},
+{(unsigned char*)"xwedge", {226, 139, 128, 0}},
+{(unsigned char*)"yacute", {195, 189, 0}},
+{(unsigned char*)"yacy", {209, 143, 0}},
+{(unsigned char*)"ycirc", {197, 183, 0}},
+{(unsigned char*)"ycy", {209, 139, 0}},
+{(unsigned char*)"yen", {194, 165, 0}},
+{(unsigned char*)"yfr", {240, 157, 148, 182, 0}},
+{(unsigned char*)"yicy", {209, 151, 0}},
+{(unsigned char*)"yopf", {240, 157, 149, 170, 0}},
+{(unsigned char*)"yscr", {240, 157, 147, 142, 0}},
+{(unsigned char*)"yucy", {209, 142, 0}},
+{(unsigned char*)"yuml", {195, 191, 0}},
+{(unsigned char*)"zacute", {197, 186, 0}},
+{(unsigned char*)"zcaron", {197, 190, 0}},
+{(unsigned char*)"zcy", {208, 183, 0}},
+{(unsigned char*)"zdot", {197, 188, 0}},
+{(unsigned char*)"zeetrf", {226, 132, 168, 0}},
+{(unsigned char*)"zeta", {206, 182, 0}},
+{(unsigned char*)"zfr", {240, 157, 148, 183, 0}},
+{(unsigned char*)"zhcy", {208, 182, 0}},
+{(unsigned char*)"zigrarr", {226, 135, 157, 0}},
+{(unsigned char*)"zopf", {240, 157, 149, 171, 0}},
+{(unsigned char*)"zscr", {240, 157, 147, 143, 0}},
+{(unsigned char*)"zwj", {226, 128, 141, 0}},
+{(unsigned char*)"zwnj", {226, 128, 140, 0}},
+};
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/ext_scanners.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/ext_scanners.c
new file mode 100644
index 000000000000..7e0f5f23b41a
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/ext_scanners.c
@@ -0,0 +1,941 @@
+/* Generated by re2c 0.15.3 */
+#include 
+#include "ext_scanners.h"
+
+bufsize_t _ext_scan_at(bufsize_t (*scanner)(const unsigned char *),
+                       unsigned char *ptr, int len, bufsize_t offset) {
+  bufsize_t res;
+
+  if (ptr == NULL || offset > len) {
+    return 0;
+  } else {
+    unsigned char lim = ptr[len];
+
+    ptr[len] = '\0';
+    res = scanner(ptr + offset);
+    ptr[len] = lim;
+  }
+
+  return res;
+}
+
+bufsize_t _scan_table_start(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 64, 0,  64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  64, 0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 128, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0,   0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,
+    };
+    yych = *(marker = p);
+    if (yych <= '{') {
+      if (yych <= 0x1F) {
+        if (yych <= '\t') {
+          if (yych <= 0x08)
+            goto yy6;
+          goto yy3;
+        } else {
+          if (yych <= '\n')
+            goto yy2;
+          if (yych <= '\f')
+            goto yy3;
+          goto yy6;
+        }
+      } else {
+        if (yych <= '-') {
+          if (yych <= ' ')
+            goto yy3;
+          if (yych <= ',')
+            goto yy6;
+          goto yy5;
+        } else {
+          if (yych == ':')
+            goto yy4;
+          goto yy6;
+        }
+      }
+    } else {
+      if (yych <= 0xEC) {
+        if (yych <= 0xC1) {
+          if (yych <= '|')
+            goto yy3;
+          if (yych <= 0x7F)
+            goto yy6;
+        } else {
+          if (yych <= 0xDF)
+            goto yy7;
+          if (yych <= 0xE0)
+            goto yy9;
+          goto yy10;
+        }
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xED)
+            goto yy14;
+          if (yych <= 0xEF)
+            goto yy10;
+          goto yy11;
+        } else {
+          if (yych <= 0xF3)
+            goto yy12;
+          if (yych <= 0xF4)
+            goto yy13;
+        }
+      }
+    }
+  yy2 : { return 0; }
+  yy3:
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy22;
+    }
+    if (yych <= '\f') {
+      if (yych == '\t')
+        goto yy29;
+      if (yych <= '\n')
+        goto yy2;
+      goto yy29;
+    } else {
+      if (yych <= ' ') {
+        if (yych <= 0x1F)
+          goto yy2;
+        goto yy29;
+      } else {
+        if (yych == ':')
+          goto yy31;
+        goto yy2;
+      }
+    }
+  yy4:
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy22;
+    }
+    goto yy2;
+  yy5:
+    yych = *(marker = ++p);
+    if (yybm[0 + yych] & 128) {
+      goto yy22;
+    }
+    if (yych <= ' ') {
+      if (yych <= 0x08)
+        goto yy2;
+      if (yych <= '\r')
+        goto yy16;
+      if (yych <= 0x1F)
+        goto yy2;
+      goto yy16;
+    } else {
+      if (yych <= ':') {
+        if (yych <= '9')
+          goto yy2;
+        goto yy15;
+      } else {
+        if (yych == '|')
+          goto yy16;
+        goto yy2;
+      }
+    }
+  yy6:
+    yych = *++p;
+    goto yy2;
+  yy7:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy8;
+    if (yych <= 0xBF)
+      goto yy6;
+  yy8:
+    p = marker;
+    goto yy2;
+  yy9:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy8;
+    if (yych <= 0xBF)
+      goto yy7;
+    goto yy8;
+  yy10:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy8;
+    if (yych <= 0xBF)
+      goto yy7;
+    goto yy8;
+  yy11:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy8;
+    if (yych <= 0xBF)
+      goto yy10;
+    goto yy8;
+  yy12:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy8;
+    if (yych <= 0xBF)
+      goto yy10;
+    goto yy8;
+  yy13:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy8;
+    if (yych <= 0x8F)
+      goto yy10;
+    goto yy8;
+  yy14:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy8;
+    if (yych <= 0x9F)
+      goto yy7;
+    goto yy8;
+  yy15:
+    ++p;
+    yych = *p;
+  yy16:
+    if (yybm[0 + yych] & 64) {
+      goto yy15;
+    }
+    if (yych <= '\r') {
+      if (yych <= 0x08)
+        goto yy8;
+      if (yych <= '\n')
+        goto yy20;
+      goto yy19;
+    } else {
+      if (yych != '|')
+        goto yy8;
+    }
+  yy17:
+    ++p;
+    yych = *p;
+    if (yych <= 0x1F) {
+      if (yych <= '\n') {
+        if (yych <= 0x08)
+          goto yy8;
+        if (yych <= '\t')
+          goto yy17;
+        goto yy20;
+      } else {
+        if (yych <= '\f')
+          goto yy17;
+        if (yych >= 0x0E)
+          goto yy8;
+      }
+    } else {
+      if (yych <= '-') {
+        if (yych <= ' ')
+          goto yy17;
+        if (yych <= ',')
+          goto yy8;
+        goto yy25;
+      } else {
+        if (yych == ':')
+          goto yy24;
+        goto yy8;
+      }
+    }
+  yy19:
+    yych = *++p;
+    if (yych != '\n')
+      goto yy8;
+  yy20:
+    ++p;
+    { return (bufsize_t)(p - start); }
+  yy22:
+    ++p;
+    yych = *p;
+    if (yybm[0 + yych] & 128) {
+      goto yy22;
+    }
+    if (yych <= 0x1F) {
+      if (yych <= '\n') {
+        if (yych <= 0x08)
+          goto yy8;
+        if (yych <= '\t')
+          goto yy15;
+        goto yy20;
+      } else {
+        if (yych <= '\f')
+          goto yy15;
+        if (yych <= '\r')
+          goto yy19;
+        goto yy8;
+      }
+    } else {
+      if (yych <= ':') {
+        if (yych <= ' ')
+          goto yy15;
+        if (yych <= '9')
+          goto yy8;
+        goto yy15;
+      } else {
+        if (yych == '|')
+          goto yy17;
+        goto yy8;
+      }
+    }
+  yy24:
+    ++p;
+    yych = *p;
+    if (yych != '-')
+      goto yy8;
+  yy25:
+    ++p;
+    yych = *p;
+    if (yych <= ' ') {
+      if (yych <= '\n') {
+        if (yych <= 0x08)
+          goto yy8;
+        if (yych >= '\n')
+          goto yy20;
+      } else {
+        if (yych <= '\f')
+          goto yy27;
+        if (yych <= '\r')
+          goto yy19;
+        if (yych <= 0x1F)
+          goto yy8;
+      }
+    } else {
+      if (yych <= '9') {
+        if (yych == '-')
+          goto yy25;
+        goto yy8;
+      } else {
+        if (yych <= ':')
+          goto yy27;
+        if (yych == '|')
+          goto yy17;
+        goto yy8;
+      }
+    }
+  yy27:
+    ++p;
+    yych = *p;
+    if (yych <= '\r') {
+      if (yych <= '\t') {
+        if (yych <= 0x08)
+          goto yy8;
+        goto yy27;
+      } else {
+        if (yych <= '\n')
+          goto yy20;
+        if (yych <= '\f')
+          goto yy27;
+        goto yy19;
+      }
+    } else {
+      if (yych <= ' ') {
+        if (yych <= 0x1F)
+          goto yy8;
+        goto yy27;
+      } else {
+        if (yych == '|')
+          goto yy17;
+        goto yy8;
+      }
+    }
+  yy29:
+    ++p;
+    yych = *p;
+    if (yybm[0 + yych] & 128) {
+      goto yy22;
+    }
+    if (yych <= '\f') {
+      if (yych == '\t')
+        goto yy29;
+      if (yych <= '\n')
+        goto yy8;
+      goto yy29;
+    } else {
+      if (yych <= ' ') {
+        if (yych <= 0x1F)
+          goto yy8;
+        goto yy29;
+      } else {
+        if (yych != ':')
+          goto yy8;
+      }
+    }
+  yy31:
+    ++p;
+    if (yybm[0 + (yych = *p)] & 128) {
+      goto yy22;
+    }
+    goto yy8;
+  }
+}
+
+bufsize_t _scan_table_cell(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0,   128, 128, 0,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 64,  128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0,   128,
+        128, 128, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+        0,   0,   0,   0,
+    };
+    yych = *(marker = p);
+    if (yych <= 0x7F) {
+      if (yych <= '\r') {
+        if (yych == '\n')
+          goto yy34;
+        if (yych <= '\f')
+          goto yy36;
+        goto yy45;
+      } else {
+        if (yych <= '\\') {
+          if (yych <= '[')
+            goto yy36;
+          goto yy35;
+        } else {
+          if (yych == '|')
+            goto yy45;
+          goto yy36;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF) {
+          if (yych >= 0xC2)
+            goto yy37;
+        } else {
+          if (yych <= 0xE0)
+            goto yy39;
+          if (yych <= 0xEC)
+            goto yy40;
+          goto yy44;
+        }
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy40;
+          goto yy41;
+        } else {
+          if (yych <= 0xF3)
+            goto yy42;
+          if (yych <= 0xF4)
+            goto yy43;
+        }
+      }
+    }
+  yy34 : { return (bufsize_t)(p - start); }
+  yy35:
+    yych = *(marker = ++p);
+    if (yych == '|')
+      goto yy49;
+    goto yy50;
+  yy36:
+    yych = *(marker = ++p);
+    goto yy50;
+  yy37:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy36;
+  yy38:
+    p = marker;
+    goto yy34;
+  yy39:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy37;
+    goto yy38;
+  yy40:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy37;
+    goto yy38;
+  yy41:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy40;
+    goto yy38;
+  yy42:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy40;
+    goto yy38;
+  yy43:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0x8F)
+      goto yy40;
+    goto yy38;
+  yy44:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0x9F)
+      goto yy37;
+    goto yy38;
+  yy45:
+    ++p;
+    { return 0; }
+  yy47:
+    marker = ++p;
+    yych = *p;
+    if (yybm[0 + yych] & 64) {
+      goto yy47;
+    }
+    if (yych <= 0xDF) {
+      if (yych <= '\f') {
+        if (yych == '\n')
+          goto yy34;
+      } else {
+        if (yych <= '\r')
+          goto yy34;
+        if (yych <= 0x7F)
+          goto yy49;
+        if (yych <= 0xC1)
+          goto yy34;
+        goto yy51;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy52;
+        if (yych == 0xED)
+          goto yy57;
+        goto yy53;
+      } else {
+        if (yych <= 0xF0)
+          goto yy54;
+        if (yych <= 0xF3)
+          goto yy55;
+        if (yych <= 0xF4)
+          goto yy56;
+        goto yy34;
+      }
+    }
+  yy49:
+    marker = ++p;
+    yych = *p;
+  yy50:
+    if (yybm[0 + yych] & 128) {
+      goto yy49;
+    }
+    if (yych <= 0xEC) {
+      if (yych <= 0xC1) {
+        if (yych <= '\r')
+          goto yy34;
+        if (yych <= '\\')
+          goto yy47;
+        goto yy34;
+      } else {
+        if (yych <= 0xDF)
+          goto yy51;
+        if (yych <= 0xE0)
+          goto yy52;
+        goto yy53;
+      }
+    } else {
+      if (yych <= 0xF0) {
+        if (yych <= 0xED)
+          goto yy57;
+        if (yych <= 0xEF)
+          goto yy53;
+        goto yy54;
+      } else {
+        if (yych <= 0xF3)
+          goto yy55;
+        if (yych <= 0xF4)
+          goto yy56;
+        goto yy34;
+      }
+    }
+  yy51:
+    ++p;
+    yych = *p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy49;
+    goto yy38;
+  yy52:
+    ++p;
+    yych = *p;
+    if (yych <= 0x9F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy51;
+    goto yy38;
+  yy53:
+    ++p;
+    yych = *p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy51;
+    goto yy38;
+  yy54:
+    ++p;
+    yych = *p;
+    if (yych <= 0x8F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy53;
+    goto yy38;
+  yy55:
+    ++p;
+    yych = *p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0xBF)
+      goto yy53;
+    goto yy38;
+  yy56:
+    ++p;
+    yych = *p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0x8F)
+      goto yy53;
+    goto yy38;
+  yy57:
+    ++p;
+    yych = *p;
+    if (yych <= 0x7F)
+      goto yy38;
+    if (yych <= 0x9F)
+      goto yy51;
+    goto yy38;
+  }
+}
+
+bufsize_t _scan_table_cell_end(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    unsigned int yyaccept = 0;
+    static const unsigned char yybm[] = {
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 128, 128, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   128, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0,
+    };
+    yych = *(marker = p);
+    if (yych <= 0xDF) {
+      if (yych <= '{') {
+        if (yych != '\n')
+          goto yy63;
+      } else {
+        if (yych <= '|')
+          goto yy61;
+        if (yych <= 0x7F)
+          goto yy63;
+        if (yych >= 0xC2)
+          goto yy64;
+      }
+    } else {
+      if (yych <= 0xEF) {
+        if (yych <= 0xE0)
+          goto yy66;
+        if (yych == 0xED)
+          goto yy71;
+        goto yy67;
+      } else {
+        if (yych <= 0xF0)
+          goto yy68;
+        if (yych <= 0xF3)
+          goto yy69;
+        if (yych <= 0xF4)
+          goto yy70;
+      }
+    }
+  yy60 : { return 0; }
+  yy61:
+    yyaccept = 1;
+    yych = *(marker = ++p);
+    goto yy73;
+  yy62 : { return (bufsize_t)(p - start); }
+  yy63:
+    yych = *++p;
+    goto yy60;
+  yy64:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy65;
+    if (yych <= 0xBF)
+      goto yy63;
+  yy65:
+    p = marker;
+    if (yyaccept == 0) {
+      goto yy60;
+    } else {
+      goto yy62;
+    }
+  yy66:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy65;
+    if (yych <= 0xBF)
+      goto yy64;
+    goto yy65;
+  yy67:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy65;
+    if (yych <= 0xBF)
+      goto yy64;
+    goto yy65;
+  yy68:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy65;
+    if (yych <= 0xBF)
+      goto yy67;
+    goto yy65;
+  yy69:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy65;
+    if (yych <= 0xBF)
+      goto yy67;
+    goto yy65;
+  yy70:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy65;
+    if (yych <= 0x8F)
+      goto yy67;
+    goto yy65;
+  yy71:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy65;
+    if (yych <= 0x9F)
+      goto yy64;
+    goto yy65;
+  yy72:
+    yyaccept = 1;
+    marker = ++p;
+    yych = *p;
+  yy73:
+    if (yybm[0 + yych] & 128) {
+      goto yy72;
+    }
+    if (yych <= 0x08)
+      goto yy62;
+    if (yych <= '\n')
+      goto yy75;
+    if (yych >= 0x0E)
+      goto yy62;
+    yych = *++p;
+    if (yych != '\n')
+      goto yy65;
+  yy75:
+    ++p;
+    yych = *p;
+    goto yy62;
+  }
+}
+
+bufsize_t _scan_table_row_end(const unsigned char *p) {
+  const unsigned char *marker = NULL;
+  const unsigned char *start = p;
+
+  {
+    unsigned char yych;
+    static const unsigned char yybm[] = {
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 128, 128, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   128, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0,   0,   0, 0, 0,
+    };
+    yych = *(marker = p);
+    if (yych <= 0xC1) {
+      if (yych <= '\f') {
+        if (yych <= 0x08)
+          goto yy83;
+        if (yych == '\n')
+          goto yy81;
+        goto yy79;
+      } else {
+        if (yych <= 0x1F) {
+          if (yych <= '\r')
+            goto yy80;
+          goto yy83;
+        } else {
+          if (yych <= ' ')
+            goto yy79;
+          if (yych <= 0x7F)
+            goto yy83;
+        }
+      }
+    } else {
+      if (yych <= 0xED) {
+        if (yych <= 0xDF)
+          goto yy84;
+        if (yych <= 0xE0)
+          goto yy86;
+        if (yych <= 0xEC)
+          goto yy87;
+        goto yy91;
+      } else {
+        if (yych <= 0xF0) {
+          if (yych <= 0xEF)
+            goto yy87;
+          goto yy88;
+        } else {
+          if (yych <= 0xF3)
+            goto yy89;
+          if (yych <= 0xF4)
+            goto yy90;
+        }
+      }
+    }
+  yy78 : { return 0; }
+  yy79:
+    yych = *(marker = ++p);
+    if (yych <= 0x08)
+      goto yy78;
+    if (yych <= '\r')
+      goto yy94;
+    if (yych == ' ')
+      goto yy94;
+    goto yy78;
+  yy80:
+    yych = *++p;
+    if (yych != '\n')
+      goto yy78;
+  yy81:
+    ++p;
+    { return (bufsize_t)(p - start); }
+  yy83:
+    yych = *++p;
+    goto yy78;
+  yy84:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy85;
+    if (yych <= 0xBF)
+      goto yy83;
+  yy85:
+    p = marker;
+    goto yy78;
+  yy86:
+    yych = *++p;
+    if (yych <= 0x9F)
+      goto yy85;
+    if (yych <= 0xBF)
+      goto yy84;
+    goto yy85;
+  yy87:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy85;
+    if (yych <= 0xBF)
+      goto yy84;
+    goto yy85;
+  yy88:
+    yych = *++p;
+    if (yych <= 0x8F)
+      goto yy85;
+    if (yych <= 0xBF)
+      goto yy87;
+    goto yy85;
+  yy89:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy85;
+    if (yych <= 0xBF)
+      goto yy87;
+    goto yy85;
+  yy90:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy85;
+    if (yych <= 0x8F)
+      goto yy87;
+    goto yy85;
+  yy91:
+    yych = *++p;
+    if (yych <= 0x7F)
+      goto yy85;
+    if (yych <= 0x9F)
+      goto yy84;
+    goto yy85;
+  yy92:
+    yych = *++p;
+    if (yych == '\n')
+      goto yy81;
+    goto yy85;
+  yy93:
+    ++p;
+    yych = *p;
+  yy94:
+    if (yybm[0 + yych] & 128) {
+      goto yy93;
+    }
+    if (yych <= 0x08)
+      goto yy85;
+    if (yych <= '\n')
+      goto yy81;
+    if (yych <= '\r')
+      goto yy92;
+    goto yy85;
+  }
+}
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/ext_scanners.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/ext_scanners.h
new file mode 100644
index 000000000000..3bfe586c1923
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/ext_scanners.h
@@ -0,0 +1,22 @@
+#include "chunk.h"
+#include "cmark-gfm.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+bufsize_t _ext_scan_at(bufsize_t (*scanner)(const unsigned char *),
+                       unsigned char *ptr, int len, bufsize_t offset);
+bufsize_t _scan_table_start(const unsigned char *p);
+bufsize_t _scan_table_cell(const unsigned char *p);
+bufsize_t _scan_table_cell_end(const unsigned char *p);
+bufsize_t _scan_table_row_end(const unsigned char *p);
+
+#define scan_table_start(c, l, n) _ext_scan_at(&_scan_table_start, c, l, n)
+#define scan_table_cell(c, l, n) _ext_scan_at(&_scan_table_cell, c, l, n)
+#define scan_table_cell_end(c, l, n) _ext_scan_at(&_scan_table_cell_end, c, l, n)
+#define scan_table_row_end(c, l, n) _ext_scan_at(&_scan_table_row_end, c, l, n)
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/ext_scanners.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/ext_scanners.o
new file mode 100644
index 000000000000..02bcecc26b06
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/ext_scanners.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/extconf.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/extconf.rb
new file mode 100644
index 000000000000..8283fcf2929d
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/extconf.rb
@@ -0,0 +1,5 @@
+require 'mkmf'
+
+$CFLAGS << " -std=c99"
+
+create_makefile('commonmarker/commonmarker')
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/footnotes.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/footnotes.c
new file mode 100644
index 000000000000..f2d2765f4fec
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/footnotes.c
@@ -0,0 +1,40 @@
+#include "cmark-gfm.h"
+#include "parser.h"
+#include "footnotes.h"
+#include "inlines.h"
+#include "chunk.h"
+
+static void footnote_free(cmark_map *map, cmark_map_entry *_ref) {
+  cmark_footnote *ref = (cmark_footnote *)_ref;
+  cmark_mem *mem = map->mem;
+  if (ref != NULL) {
+    mem->free(ref->entry.label);
+    if (ref->node)
+      cmark_node_free(ref->node);
+    mem->free(ref);
+  }
+}
+
+void cmark_footnote_create(cmark_map *map, cmark_node *node) {
+  cmark_footnote *ref;
+  unsigned char *reflabel = normalize_map_label(map->mem, &node->as.literal);
+
+  /* empty footnote name, or composed from only whitespace */
+  if (reflabel == NULL)
+    return;
+
+  assert(map->sorted == NULL);
+
+  ref = (cmark_footnote *)map->mem->calloc(1, sizeof(*ref));
+  ref->entry.label = reflabel;
+  ref->node = node;
+  ref->entry.age = map->size;
+  ref->entry.next = map->refs;
+
+  map->refs = (cmark_map_entry *)ref;
+  map->size++;
+}
+
+cmark_map *cmark_footnote_map_new(cmark_mem *mem) {
+  return cmark_map_new(mem, footnote_free);
+}
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/footnotes.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/footnotes.h
new file mode 100644
index 000000000000..43dd64ff60c8
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/footnotes.h
@@ -0,0 +1,25 @@
+#ifndef CMARK_FOOTNOTES_H
+#define CMARK_FOOTNOTES_H
+
+#include "map.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct cmark_footnote {
+  cmark_map_entry entry;
+  cmark_node *node;
+  unsigned int ix;
+};
+
+typedef struct cmark_footnote cmark_footnote;
+
+void cmark_footnote_create(cmark_map *map, cmark_node *node);
+cmark_map *cmark_footnote_map_new(cmark_mem *mem);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/footnotes.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/footnotes.o
new file mode 100644
index 000000000000..fc3581d01654
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/footnotes.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini.h
new file mode 100644
index 000000000000..7625b045b463
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini.h
@@ -0,0 +1,57 @@
+#ifndef CMARK_HOUDINI_H
+#define CMARK_HOUDINI_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include 
+#include "config.h"
+#include "buffer.h"
+
+#ifdef HAVE___BUILTIN_EXPECT
+#define likely(x) __builtin_expect((x), 1)
+#define unlikely(x) __builtin_expect((x), 0)
+#else
+#define likely(x) (x)
+#define unlikely(x) (x)
+#endif
+
+#ifdef HOUDINI_USE_LOCALE
+#define _isxdigit(c) isxdigit(c)
+#define _isdigit(c) isdigit(c)
+#else
+/*
+ * Helper _isdigit methods -- do not trust the current locale
+ * */
+#define _isxdigit(c) (strchr("0123456789ABCDEFabcdef", (c)) != NULL)
+#define _isdigit(c) ((c) >= '0' && (c) <= '9')
+#endif
+
+#define HOUDINI_ESCAPED_SIZE(x) (((x)*12) / 10)
+#define HOUDINI_UNESCAPED_SIZE(x) (x)
+
+CMARK_GFM_EXPORT
+bufsize_t houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src,
+                                      bufsize_t size);
+CMARK_GFM_EXPORT
+int houdini_escape_html(cmark_strbuf *ob, const uint8_t *src,
+                               bufsize_t size);
+CMARK_GFM_EXPORT
+int houdini_escape_html0(cmark_strbuf *ob, const uint8_t *src,
+                                bufsize_t size, int secure);
+CMARK_GFM_EXPORT
+int houdini_unescape_html(cmark_strbuf *ob, const uint8_t *src,
+                                 bufsize_t size);
+CMARK_GFM_EXPORT
+void houdini_unescape_html_f(cmark_strbuf *ob, const uint8_t *src,
+                                    bufsize_t size);
+CMARK_GFM_EXPORT
+int houdini_escape_href(cmark_strbuf *ob, const uint8_t *src,
+                               bufsize_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_href_e.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_href_e.c
new file mode 100644
index 000000000000..8c38d2fb9e23
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_href_e.c
@@ -0,0 +1,100 @@
+#include 
+#include 
+#include 
+
+#include "houdini.h"
+
+/*
+ * The following characters will not be escaped:
+ *
+ *		-_.+!*'(),%#@?=;:/,+&$~ alphanum
+ *
+ * Note that this character set is the addition of:
+ *
+ *	- The characters which are safe to be in an URL
+ *	- The characters which are *not* safe to be in
+ *	an URL because they are RESERVED characters.
+ *
+ * We asume (lazily) that any RESERVED char that
+ * appears inside an URL is actually meant to
+ * have its native function (i.e. as an URL
+ * component/separator) and hence needs no escaping.
+ *
+ * There are two exceptions: the chacters & (amp)
+ * and ' (single quote) do not appear in the table.
+ * They are meant to appear in the URL as components,
+ * yet they require special HTML-entity escaping
+ * to generate valid HTML markup.
+ *
+ * All other characters will be escaped to %XX.
+ *
+ */
+static const char HREF_SAFE[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+int houdini_escape_href(cmark_strbuf *ob, const uint8_t *src, bufsize_t size) {
+  static const uint8_t hex_chars[] = "0123456789ABCDEF";
+  bufsize_t i = 0, org;
+  uint8_t hex_str[3];
+
+  hex_str[0] = '%';
+
+  while (i < size) {
+    org = i;
+    while (i < size && HREF_SAFE[src[i]] != 0)
+      i++;
+
+    if (likely(i > org))
+      cmark_strbuf_put(ob, src + org, i - org);
+
+    /* escaping */
+    if (i >= size)
+      break;
+
+    switch (src[i]) {
+    /* amp appears all the time in URLs, but needs
+     * HTML-entity escaping to be inside an href */
+    case '&':
+      cmark_strbuf_puts(ob, "&");
+      break;
+
+    /* the single quote is a valid URL character
+     * according to the standard; it needs HTML
+     * entity escaping too */
+    case '\'':
+      cmark_strbuf_puts(ob, "'");
+      break;
+
+/* the space can be escaped to %20 or a plus
+ * sign. we're going with the generic escape
+ * for now. the plus thing is more commonly seen
+ * when building GET strings */
+#if 0
+		case ' ':
+			cmark_strbuf_putc(ob, '+');
+			break;
+#endif
+
+    /* every other character goes with a %XX escaping */
+    default:
+      hex_str[1] = hex_chars[(src[i] >> 4) & 0xF];
+      hex_str[2] = hex_chars[src[i] & 0xF];
+      cmark_strbuf_put(ob, hex_str, 3);
+    }
+
+    i++;
+  }
+
+  return 1;
+}
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_href_e.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_href_e.o
new file mode 100644
index 000000000000..c43ff18cd9fc
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_href_e.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_e.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_e.c
new file mode 100644
index 000000000000..da0b15c53a38
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_e.c
@@ -0,0 +1,66 @@
+#include 
+#include 
+#include 
+
+#include "houdini.h"
+
+/**
+ * According to the OWASP rules:
+ *
+ * & --> &
+ * < --> <
+ * > --> >
+ * " --> "
+ * ' --> '     ' is not recommended
+ * / --> /     forward slash is included as it helps end an HTML entity
+ *
+ */
+static const char HTML_ESCAPE_TABLE[] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 4,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const char *HTML_ESCAPES[] = {"",      """, "&", "'",
+                                     "/", "<",   ">"};
+
+int houdini_escape_html0(cmark_strbuf *ob, const uint8_t *src, bufsize_t size,
+                         int secure) {
+  bufsize_t i = 0, org, esc = 0;
+
+  while (i < size) {
+    org = i;
+    while (i < size && (esc = HTML_ESCAPE_TABLE[src[i]]) == 0)
+      i++;
+
+    if (i > org)
+      cmark_strbuf_put(ob, src + org, i - org);
+
+    /* escaping */
+    if (unlikely(i >= size))
+      break;
+
+    /* The forward slash and single quote are only escaped in secure mode */
+    if ((src[i] == '/' || src[i] == '\'') && !secure) {
+      cmark_strbuf_putc(ob, src[i]);
+    } else {
+      cmark_strbuf_puts(ob, HTML_ESCAPES[esc]);
+    }
+
+    i++;
+  }
+
+  return 1;
+}
+
+int houdini_escape_html(cmark_strbuf *ob, const uint8_t *src, bufsize_t size) {
+  return houdini_escape_html0(ob, src, size, 1);
+}
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_e.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_e.o
new file mode 100644
index 000000000000..e10c82b02041
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_e.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_u.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_u.c
new file mode 100644
index 000000000000..30d08aa4a4a4
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_u.c
@@ -0,0 +1,149 @@
+#include 
+#include 
+#include 
+
+#include "buffer.h"
+#include "houdini.h"
+#include "utf8.h"
+#include "entities.inc"
+
+/* Binary tree lookup code for entities added by JGM */
+
+static const unsigned char *S_lookup(int i, int low, int hi,
+                                     const unsigned char *s, int len) {
+  int j;
+  int cmp =
+      strncmp((const char *)s, (const char *)cmark_entities[i].entity, len);
+  if (cmp == 0 && cmark_entities[i].entity[len] == 0) {
+    return (const unsigned char *)cmark_entities[i].bytes;
+  } else if (cmp <= 0 && i > low) {
+    j = i - ((i - low) / 2);
+    if (j == i)
+      j -= 1;
+    return S_lookup(j, low, i - 1, s, len);
+  } else if (cmp > 0 && i < hi) {
+    j = i + ((hi - i) / 2);
+    if (j == i)
+      j += 1;
+    return S_lookup(j, i + 1, hi, s, len);
+  } else {
+    return NULL;
+  }
+}
+
+static const unsigned char *S_lookup_entity(const unsigned char *s, int len) {
+  return S_lookup(CMARK_NUM_ENTITIES / 2, 0, CMARK_NUM_ENTITIES - 1, s, len);
+}
+
+bufsize_t houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src,
+                               bufsize_t size) {
+  bufsize_t i = 0;
+
+  if (size >= 3 && src[0] == '#') {
+    int codepoint = 0;
+    int num_digits = 0;
+
+    if (_isdigit(src[1])) {
+      for (i = 1; i < size && _isdigit(src[i]); ++i) {
+        codepoint = (codepoint * 10) + (src[i] - '0');
+
+        if (codepoint >= 0x110000) {
+          // Keep counting digits but
+          // avoid integer overflow.
+          codepoint = 0x110000;
+        }
+      }
+
+      num_digits = i - 1;
+    }
+
+    else if (src[1] == 'x' || src[1] == 'X') {
+      for (i = 2; i < size && _isxdigit(src[i]); ++i) {
+        codepoint = (codepoint * 16) + ((src[i] | 32) % 39 - 9);
+
+        if (codepoint >= 0x110000) {
+          // Keep counting digits but
+          // avoid integer overflow.
+          codepoint = 0x110000;
+        }
+      }
+
+      num_digits = i - 2;
+    }
+
+    if (num_digits >= 1 && num_digits <= 8 && i < size && src[i] == ';') {
+      if (codepoint == 0 || (codepoint >= 0xD800 && codepoint < 0xE000) ||
+          codepoint >= 0x110000) {
+        codepoint = 0xFFFD;
+      }
+      cmark_utf8proc_encode_char(codepoint, ob);
+      return i + 1;
+    }
+  }
+
+  else {
+    if (size > CMARK_ENTITY_MAX_LENGTH)
+      size = CMARK_ENTITY_MAX_LENGTH;
+
+    for (i = CMARK_ENTITY_MIN_LENGTH; i < size; ++i) {
+      if (src[i] == ' ')
+        break;
+
+      if (src[i] == ';') {
+        const unsigned char *entity = S_lookup_entity(src, i);
+
+        if (entity != NULL) {
+          cmark_strbuf_puts(ob, (const char *)entity);
+          return i + 1;
+        }
+
+        break;
+      }
+    }
+  }
+
+  return 0;
+}
+
+int houdini_unescape_html(cmark_strbuf *ob, const uint8_t *src,
+                          bufsize_t size) {
+  bufsize_t i = 0, org, ent;
+
+  while (i < size) {
+    org = i;
+    while (i < size && src[i] != '&')
+      i++;
+
+    if (likely(i > org)) {
+      if (unlikely(org == 0)) {
+        if (i >= size)
+          return 0;
+
+        cmark_strbuf_grow(ob, HOUDINI_UNESCAPED_SIZE(size));
+      }
+
+      cmark_strbuf_put(ob, src + org, i - org);
+    }
+
+    /* escaping */
+    if (i >= size)
+      break;
+
+    i++;
+
+    ent = houdini_unescape_ent(ob, src + i, size - i);
+    i += ent;
+
+    /* not really an entity */
+    if (ent == 0)
+      cmark_strbuf_putc(ob, '&');
+  }
+
+  return 1;
+}
+
+void houdini_unescape_html_f(cmark_strbuf *ob, const uint8_t *src,
+                             bufsize_t size) {
+  if (!houdini_unescape_html(ob, src, size))
+    cmark_strbuf_put(ob, src, size);
+}
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_u.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_u.o
new file mode 100644
index 000000000000..ef663ebb5deb
Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/houdini_html_u.o differ
diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/html.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/html.c
new file mode 100644
index 000000000000..7a34f7e91bfc
--- /dev/null
+++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/html.c
@@ -0,0 +1,465 @@
+#include 
+#include 
+#include 
+#include 
+#include "cmark_ctype.h"
+#include "config.h"
+#include "cmark-gfm.h"
+#include "houdini.h"
+#include "scanners.h"
+#include "syntax_extension.h"
+#include "html.h"
+#include "render.h"
+
+// Functions to convert cmark_nodes to HTML strings.
+
+static void escape_html(cmark_strbuf *dest, const unsigned char *source,
+                        bufsize_t length) {
+  houdini_escape_html0(dest, source, length, 0);
+}
+
+static void filter_html_block(cmark_html_renderer *renderer, uint8_t *data, size_t len) {
+  cmark_strbuf *html = renderer->html;
+  cmark_llist *it;
+  cmark_syntax_extension *ext;
+  bool filtered;
+  uint8_t *match;
+
+  while (len) {
+    match = (uint8_t *) memchr(data, '<', len);
+    if (!match)
+      break;
+
+    if (match != data) {
+      cmark_strbuf_put(html, data, (bufsize_t)(match - data));
+      len -= (match - data);
+      data = match;
+    }
+
+    filtered = false;
+    for (it = renderer->filter_extensions; it; it = it->next) {
+      ext = ((cmark_syntax_extension *) it->data);
+      if (!ext->html_filter_func(ext, data, len)) {
+        filtered = true;
+        break;
+      }
+    }
+
+    if (!filtered) {
+      cmark_strbuf_putc(html, '<');
+    } else {
+      cmark_strbuf_puts(html, "<");
+    }
+
+    ++data;
+    --len;
+  }
+
+  if (len)
+    cmark_strbuf_put(html, data, (bufsize_t)len);
+}
+
+static bool S_put_footnote_backref(cmark_html_renderer *renderer, cmark_strbuf *html) {
+  if (renderer->written_footnote_ix >= renderer->footnote_ix)
+    return false;
+  renderer->written_footnote_ix = renderer->footnote_ix;
+
+  cmark_strbuf_puts(html, "footnote_ix);
+  cmark_strbuf_puts(html, n);
+  cmark_strbuf_puts(html, "\" class=\"footnote-backref\">↩");
+
+  return true;
+}
+
+static int S_render_node(cmark_html_renderer *renderer, cmark_node *node,
+                         cmark_event_type ev_type, int options) {
+  cmark_node *parent;
+  cmark_node *grandparent;
+  cmark_strbuf *html = renderer->html;
+  cmark_llist *it;
+  cmark_syntax_extension *ext;
+  char start_heading[] = "plain == node) { // back at original node
+    renderer->plain = NULL;
+  }
+
+  if (renderer->plain != NULL) {
+    switch (node->type) {
+    case CMARK_NODE_TEXT:
+    case CMARK_NODE_CODE:
+    case CMARK_NODE_HTML_INLINE:
+      escape_html(html, node->as.literal.data, node->as.literal.len);
+      break;
+
+    case CMARK_NODE_LINEBREAK:
+    case CMARK_NODE_SOFTBREAK:
+      cmark_strbuf_putc(html, ' ');
+      break;
+
+    default:
+      break;
+    }
+    return 1;
+  }
+
+  if (node->extension && node->extension->html_render_func) {
+    node->extension->html_render_func(node->extension, renderer, node, ev_type, options);
+    return 1;
+  }
+
+  switch (node->type) {
+  case CMARK_NODE_DOCUMENT:
+    break;
+
+  case CMARK_NODE_BLOCK_QUOTE:
+    if (entering) {
+      cmark_html_render_cr(html);
+      cmark_strbuf_puts(html, "\n");
+    } else {
+      cmark_html_render_cr(html);
+      cmark_strbuf_puts(html, "\n");
+    }
+    break;
+
+  case CMARK_NODE_LIST: {
+    cmark_list_type list_type = node->as.list.list_type;
+    int start = node->as.list.start;
+
+    if (entering) {
+      cmark_html_render_cr(html);
+      if (list_type == CMARK_BULLET_LIST) {
+        cmark_strbuf_puts(html, "\n");
+      } else if (start == 1) {
+        cmark_strbuf_puts(html, "\n");
+      } else {
+        snprintf(buffer, BUFFER_SIZE, "
    \n"); + } + } else { + cmark_strbuf_puts(html, + list_type == CMARK_BULLET_LIST ? "\n" : "
\n"); + } + break; + } + + case CMARK_NODE_ITEM: + if (entering) { + cmark_html_render_cr(html); + cmark_strbuf_puts(html, "'); + } else { + cmark_strbuf_puts(html, "\n"); + } + break; + + case CMARK_NODE_HEADING: + if (entering) { + cmark_html_render_cr(html); + start_heading[2] = (char)('0' + node->as.heading.level); + cmark_strbuf_puts(html, start_heading); + cmark_html_render_sourcepos(node, html, options); + cmark_strbuf_putc(html, '>'); + } else { + end_heading[3] = (char)('0' + node->as.heading.level); + cmark_strbuf_puts(html, end_heading); + cmark_strbuf_puts(html, ">\n"); + } + break; + + case CMARK_NODE_CODE_BLOCK: + cmark_html_render_cr(html); + + if (node->as.code.info.len == 0) { + cmark_strbuf_puts(html, ""); + } else { + bufsize_t first_tag = 0; + while (first_tag < node->as.code.info.len && + !cmark_isspace(node->as.code.info.data[first_tag])) { + first_tag += 1; + } + + if (options & CMARK_OPT_GITHUB_PRE_LANG) { + cmark_strbuf_puts(html, "as.code.info.data, first_tag); + if (first_tag < node->as.code.info.len && (options & CMARK_OPT_FULL_INFO_STRING)) { + cmark_strbuf_puts(html, "\" data-meta=\""); + escape_html(html, node->as.code.info.data + first_tag + 1, node->as.code.info.len - first_tag - 1); + } + cmark_strbuf_puts(html, "\">"); + } else { + cmark_strbuf_puts(html, "as.code.info.data, first_tag); + if (first_tag < node->as.code.info.len && (options & CMARK_OPT_FULL_INFO_STRING)) { + cmark_strbuf_puts(html, "\" data-meta=\""); + escape_html(html, node->as.code.info.data + first_tag + 1, node->as.code.info.len - first_tag - 1); + } + cmark_strbuf_puts(html, "\">"); + } + } + + escape_html(html, node->as.code.literal.data, node->as.code.literal.len); + cmark_strbuf_puts(html, "
\n"); + break; + + case CMARK_NODE_HTML_BLOCK: + cmark_html_render_cr(html); + if (options & CMARK_OPT_SAFE) { + cmark_strbuf_puts(html, ""); + } else if (renderer->filter_extensions) { + filter_html_block(renderer, node->as.literal.data, node->as.literal.len); + } else { + cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len); + } + cmark_html_render_cr(html); + break; + + case CMARK_NODE_CUSTOM_BLOCK: + cmark_html_render_cr(html); + if (entering) { + cmark_strbuf_put(html, node->as.custom.on_enter.data, + node->as.custom.on_enter.len); + } else { + cmark_strbuf_put(html, node->as.custom.on_exit.data, + node->as.custom.on_exit.len); + } + cmark_html_render_cr(html); + break; + + case CMARK_NODE_THEMATIC_BREAK: + cmark_html_render_cr(html); + cmark_strbuf_puts(html, "\n"); + break; + + case CMARK_NODE_PARAGRAPH: + parent = cmark_node_parent(node); + grandparent = cmark_node_parent(parent); + if (grandparent != NULL && grandparent->type == CMARK_NODE_LIST) { + tight = grandparent->as.list.tight; + } else { + tight = false; + } + if (!tight) { + if (entering) { + cmark_html_render_cr(html); + cmark_strbuf_puts(html, "'); + } else { + if (parent->type == CMARK_NODE_FOOTNOTE_DEFINITION && node->next == NULL) { + cmark_strbuf_putc(html, ' '); + S_put_footnote_backref(renderer, html); + } + cmark_strbuf_puts(html, "

\n"); + } + } + break; + + case CMARK_NODE_TEXT: + escape_html(html, node->as.literal.data, node->as.literal.len); + break; + + case CMARK_NODE_LINEBREAK: + cmark_strbuf_puts(html, "
\n"); + break; + + case CMARK_NODE_SOFTBREAK: + if (options & CMARK_OPT_HARDBREAKS) { + cmark_strbuf_puts(html, "
\n"); + } else if (options & CMARK_OPT_NOBREAKS) { + cmark_strbuf_putc(html, ' '); + } else { + cmark_strbuf_putc(html, '\n'); + } + break; + + case CMARK_NODE_CODE: + cmark_strbuf_puts(html, ""); + escape_html(html, node->as.literal.data, node->as.literal.len); + cmark_strbuf_puts(html, ""); + break; + + case CMARK_NODE_HTML_INLINE: + if (options & CMARK_OPT_SAFE) { + cmark_strbuf_puts(html, ""); + } else { + filtered = false; + for (it = renderer->filter_extensions; it; it = it->next) { + ext = (cmark_syntax_extension *) it->data; + if (!ext->html_filter_func(ext, node->as.literal.data, node->as.literal.len)) { + filtered = true; + break; + } + } + if (!filtered) { + cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len); + } else { + cmark_strbuf_puts(html, "<"); + cmark_strbuf_put(html, node->as.literal.data + 1, node->as.literal.len - 1); + } + } + break; + + case CMARK_NODE_CUSTOM_INLINE: + if (entering) { + cmark_strbuf_put(html, node->as.custom.on_enter.data, + node->as.custom.on_enter.len); + } else { + cmark_strbuf_put(html, node->as.custom.on_exit.data, + node->as.custom.on_exit.len); + } + break; + + case CMARK_NODE_STRONG: + if (entering) { + cmark_strbuf_puts(html, ""); + } else { + cmark_strbuf_puts(html, ""); + } + break; + + case CMARK_NODE_EMPH: + if (entering) { + cmark_strbuf_puts(html, ""); + } else { + cmark_strbuf_puts(html, ""); + } + break; + + case CMARK_NODE_LINK: + if (entering) { + cmark_strbuf_puts(html, "as.link.url, 0))) { + houdini_escape_href(html, node->as.link.url.data, + node->as.link.url.len); + } + if (node->as.link.title.len) { + cmark_strbuf_puts(html, "\" title=\""); + escape_html(html, node->as.link.title.data, node->as.link.title.len); + } + cmark_strbuf_puts(html, "\">"); + } else { + cmark_strbuf_puts(html, ""); + } + break; + + case CMARK_NODE_IMAGE: + if (entering) { + cmark_strbuf_puts(html, "as.link.url, 0))) { + houdini_escape_href(html, node->as.link.url.data, + node->as.link.url.len); + } + cmark_strbuf_puts(html, "\" alt=\""); + renderer->plain = node; + } else { + if (node->as.link.title.len) { + cmark_strbuf_puts(html, "\" title=\""); + escape_html(html, node->as.link.title.data, node->as.link.title.len); + } + + cmark_strbuf_puts(html, "\" />"); + } + break; + + case CMARK_NODE_FOOTNOTE_DEFINITION: + if (entering) { + if (renderer->footnote_ix == 0) { + cmark_strbuf_puts(html, "
\n
    \n"); + } + ++renderer->footnote_ix; + cmark_strbuf_puts(html, "
  1. footnote_ix); + cmark_strbuf_puts(html, n); + cmark_strbuf_puts(html, "\">\n"); + } else { + if (S_put_footnote_backref(renderer, html)) { + cmark_strbuf_putc(html, '\n'); + } + cmark_strbuf_puts(html, "
  2. \n"); + } + break; + + case CMARK_NODE_FOOTNOTE_REFERENCE: + if (entering) { + cmark_strbuf_puts(html, "as.literal.data, node->as.literal.len); + cmark_strbuf_puts(html, "\" id=\"fnref"); + cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len); + cmark_strbuf_puts(html, "\">"); + cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len); + cmark_strbuf_puts(html, ""); + } + break; + + default: + assert(false); + break; + } + + return 1; +} + +char *cmark_render_html(cmark_node *root, int options, cmark_llist *extensions) { + return cmark_render_html_with_mem(root, options, extensions, cmark_node_mem(root)); +} + +char *cmark_render_html_with_mem(cmark_node *root, int options, cmark_llist *extensions, cmark_mem *mem) { + char *result; + cmark_strbuf html = CMARK_BUF_INIT(mem); + cmark_event_type ev_type; + cmark_node *cur; + cmark_html_renderer renderer = {&html, NULL, NULL, 0, 0, NULL}; + cmark_iter *iter = cmark_iter_new(root); + + for (; extensions; extensions = extensions->next) + if (((cmark_syntax_extension *) extensions->data)->html_filter_func) + renderer.filter_extensions = cmark_llist_append( + mem, + renderer.filter_extensions, + (cmark_syntax_extension *) extensions->data); + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + S_render_node(&renderer, cur, ev_type, options); + } + + if (renderer.footnote_ix) { + cmark_strbuf_puts(&html, "
\n
\n"); + } + + result = (char *)cmark_strbuf_detach(&html); + + cmark_llist_free(mem, renderer.filter_extensions); + + cmark_iter_free(iter); + return result; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/html.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/html.h new file mode 100644 index 000000000000..aeba7bcdad22 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/html.h @@ -0,0 +1,27 @@ +#ifndef CMARK_HTML_H +#define CMARK_HTML_H + +#include "buffer.h" +#include "node.h" + +CMARK_INLINE +static void cmark_html_render_cr(cmark_strbuf *html) { + if (html->size && html->ptr[html->size - 1] != '\n') + cmark_strbuf_putc(html, '\n'); +} + +#define BUFFER_SIZE 100 + +CMARK_INLINE +static void cmark_html_render_sourcepos(cmark_node *node, cmark_strbuf *html, int options) { + char buffer[BUFFER_SIZE]; + if (CMARK_OPT_SOURCEPOS & options) { + snprintf(buffer, BUFFER_SIZE, " data-sourcepos=\"%d:%d-%d:%d\"", + cmark_node_get_start_line(node), cmark_node_get_start_column(node), + cmark_node_get_end_line(node), cmark_node_get_end_column(node)); + cmark_strbuf_puts(html, buffer); + } +} + + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/html.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/html.o new file mode 100644 index 000000000000..3d8ade3fd015 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/html.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/inlines.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/inlines.c new file mode 100644 index 000000000000..45a634877d92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/inlines.c @@ -0,0 +1,1594 @@ +#include +#include +#include + +#include "cmark_ctype.h" +#include "config.h" +#include "node.h" +#include "parser.h" +#include "references.h" +#include "cmark-gfm.h" +#include "houdini.h" +#include "utf8.h" +#include "scanners.h" +#include "inlines.h" +#include "syntax_extension.h" + +static const char *EMDASH = "\xE2\x80\x94"; +static const char *ENDASH = "\xE2\x80\x93"; +static const char *ELLIPSES = "\xE2\x80\xA6"; +static const char *LEFTDOUBLEQUOTE = "\xE2\x80\x9C"; +static const char *RIGHTDOUBLEQUOTE = "\xE2\x80\x9D"; +static const char *LEFTSINGLEQUOTE = "\xE2\x80\x98"; +static const char *RIGHTSINGLEQUOTE = "\xE2\x80\x99"; + +// Macros for creating various kinds of simple. +#define make_str(subj, sc, ec, s) make_literal(subj, CMARK_NODE_TEXT, sc, ec, s) +#define make_code(subj, sc, ec, s) make_literal(subj, CMARK_NODE_CODE, sc, ec, s) +#define make_raw_html(subj, sc, ec, s) make_literal(subj, CMARK_NODE_HTML_INLINE, sc, ec, s) +#define make_linebreak(mem) make_simple(mem, CMARK_NODE_LINEBREAK) +#define make_softbreak(mem) make_simple(mem, CMARK_NODE_SOFTBREAK) +#define make_emph(mem) make_simple(mem, CMARK_NODE_EMPH) +#define make_strong(mem) make_simple(mem, CMARK_NODE_STRONG) + +#define MAXBACKTICKS 80 + +typedef struct bracket { + struct bracket *previous; + struct delimiter *previous_delimiter; + cmark_node *inl_text; + bufsize_t position; + bool image; + bool active; + bool bracket_after; +} bracket; + +typedef struct subject{ + cmark_mem *mem; + cmark_chunk input; + int line; + bufsize_t pos; + int block_offset; + int column_offset; + cmark_map *refmap; + delimiter *last_delim; + bracket *last_bracket; + bufsize_t backticks[MAXBACKTICKS + 1]; + bool scanned_for_backticks; +} subject; + +// Extensions may populate this. +static int8_t SKIP_CHARS[256]; + +static CMARK_INLINE bool S_is_line_end_char(char c) { + return (c == '\n' || c == '\r'); +} + +static delimiter *S_insert_emph(subject *subj, delimiter *opener, + delimiter *closer); + +static int parse_inline(cmark_parser *parser, subject *subj, cmark_node *parent, int options); + +static void subject_from_buf(cmark_mem *mem, int line_number, int block_offset, subject *e, + cmark_chunk *buffer, cmark_map *refmap); +static bufsize_t subject_find_special_char(subject *subj, int options); + +// Create an inline with a literal string value. +static CMARK_INLINE cmark_node *make_literal(subject *subj, cmark_node_type t, + int start_column, int end_column, + cmark_chunk s) { + cmark_node *e = (cmark_node *)subj->mem->calloc(1, sizeof(*e)); + cmark_strbuf_init(subj->mem, &e->content, 0); + e->type = (uint16_t)t; + e->as.literal = s; + e->start_line = e->end_line = subj->line; + // columns are 1 based. + e->start_column = start_column + 1 + subj->column_offset + subj->block_offset; + e->end_column = end_column + 1 + subj->column_offset + subj->block_offset; + return e; +} + +// Create an inline with no value. +static CMARK_INLINE cmark_node *make_simple(cmark_mem *mem, cmark_node_type t) { + cmark_node *e = (cmark_node *)mem->calloc(1, sizeof(*e)); + cmark_strbuf_init(mem, &e->content, 0); + e->type = (uint16_t)t; + return e; +} + +// Like make_str, but parses entities. +static cmark_node *make_str_with_entities(subject *subj, + int start_column, int end_column, + cmark_chunk *content) { + cmark_strbuf unescaped = CMARK_BUF_INIT(subj->mem); + + if (houdini_unescape_html(&unescaped, content->data, content->len)) { + return make_str(subj, start_column, end_column, cmark_chunk_buf_detach(&unescaped)); + } else { + return make_str(subj, start_column, end_column, *content); + } +} + +// Duplicate a chunk by creating a copy of the buffer not by reusing the +// buffer like cmark_chunk_dup does. +static cmark_chunk chunk_clone(cmark_mem *mem, cmark_chunk *src) { + cmark_chunk c; + bufsize_t len = src->len; + + c.len = len; + c.data = (unsigned char *)mem->calloc(len + 1, 1); + c.alloc = 1; + if (len) + memcpy(c.data, src->data, len); + c.data[len] = '\0'; + + return c; +} + +static cmark_chunk cmark_clean_autolink(cmark_mem *mem, cmark_chunk *url, + int is_email) { + cmark_strbuf buf = CMARK_BUF_INIT(mem); + + cmark_chunk_trim(url); + + if (url->len == 0) { + cmark_chunk result = CMARK_CHUNK_EMPTY; + return result; + } + + if (is_email) + cmark_strbuf_puts(&buf, "mailto:"); + + houdini_unescape_html_f(&buf, url->data, url->len); + return cmark_chunk_buf_detach(&buf); +} + +static CMARK_INLINE cmark_node *make_autolink(subject *subj, + int start_column, int end_column, + cmark_chunk url, int is_email) { + cmark_node *link = make_simple(subj->mem, CMARK_NODE_LINK); + link->as.link.url = cmark_clean_autolink(subj->mem, &url, is_email); + link->as.link.title = cmark_chunk_literal(""); + link->start_line = link->end_line = subj->line; + link->start_column = start_column + 1; + link->end_column = end_column + 1; + cmark_node_append_child(link, make_str_with_entities(subj, start_column + 1, end_column - 1, &url)); + return link; +} + +static void subject_from_buf(cmark_mem *mem, int line_number, int block_offset, subject *e, + cmark_chunk *chunk, cmark_map *refmap) { + int i; + e->mem = mem; + e->input = *chunk; + e->line = line_number; + e->pos = 0; + e->block_offset = block_offset; + e->column_offset = 0; + e->refmap = refmap; + e->last_delim = NULL; + e->last_bracket = NULL; + for (i = 0; i <= MAXBACKTICKS; i++) { + e->backticks[i] = 0; + } + e->scanned_for_backticks = false; +} + +static CMARK_INLINE int isbacktick(int c) { return (c == '`'); } + +static CMARK_INLINE unsigned char peek_char_n(subject *subj, bufsize_t n) { + // NULL bytes should have been stripped out by now. If they're + // present, it's a programming error: + assert(!(subj->pos + n < subj->input.len && subj->input.data[subj->pos + n] == 0)); + return (subj->pos + n < subj->input.len) ? subj->input.data[subj->pos + n] : 0; +} + +static CMARK_INLINE unsigned char peek_char(subject *subj) { + return peek_char_n(subj, 0); +} + +static CMARK_INLINE unsigned char peek_at(subject *subj, bufsize_t pos) { + return subj->input.data[pos]; +} + +// Return true if there are more characters in the subject. +static CMARK_INLINE int is_eof(subject *subj) { + return (subj->pos >= subj->input.len); +} + +// Advance the subject. Doesn't check for eof. +#define advance(subj) (subj)->pos += 1 + +static CMARK_INLINE bool skip_spaces(subject *subj) { + bool skipped = false; + while (peek_char(subj) == ' ' || peek_char(subj) == '\t') { + advance(subj); + skipped = true; + } + return skipped; +} + +static CMARK_INLINE bool skip_line_end(subject *subj) { + bool seen_line_end_char = false; + if (peek_char(subj) == '\r') { + advance(subj); + seen_line_end_char = true; + } + if (peek_char(subj) == '\n') { + advance(subj); + seen_line_end_char = true; + } + return seen_line_end_char || is_eof(subj); +} + +// Take characters while a predicate holds, and return a string. +static CMARK_INLINE cmark_chunk take_while(subject *subj, int (*f)(int)) { + unsigned char c; + bufsize_t startpos = subj->pos; + bufsize_t len = 0; + + while ((c = peek_char(subj)) && (*f)(c)) { + advance(subj); + len++; + } + + return cmark_chunk_dup(&subj->input, startpos, len); +} + +// Return the number of newlines in a given span of text in a subject. If +// the number is greater than zero, also return the number of characters +// between the last newline and the end of the span in `since_newline`. +static int count_newlines(subject *subj, bufsize_t from, bufsize_t len, int *since_newline) { + int nls = 0; + int since_nl = 0; + + while (len--) { + if (subj->input.data[from++] == '\n') { + ++nls; + since_nl = 0; + } else { + ++since_nl; + } + } + + if (!nls) + return 0; + + *since_newline = since_nl; + return nls; +} + +// Adjust `node`'s `end_line`, `end_column`, and `subj`'s `line` and +// `column_offset` according to the number of newlines in a just-matched span +// of text in `subj`. +static void adjust_subj_node_newlines(subject *subj, cmark_node *node, int matchlen, int extra, int options) { + if (!(options & CMARK_OPT_SOURCEPOS)) { + return; + } + + int since_newline; + int newlines = count_newlines(subj, subj->pos - matchlen - extra, matchlen, &since_newline); + if (newlines) { + subj->line += newlines; + node->end_line += newlines; + node->end_column = since_newline; + subj->column_offset = -subj->pos + since_newline + extra; + } +} + +// Try to process a backtick code span that began with a +// span of ticks of length openticklength length (already +// parsed). Return 0 if you don't find matching closing +// backticks, otherwise return the position in the subject +// after the closing backticks. +static bufsize_t scan_to_closing_backticks(subject *subj, + bufsize_t openticklength) { + + bool found = false; + if (openticklength > MAXBACKTICKS) { + // we limit backtick string length because of the array subj->backticks: + return 0; + } + if (subj->scanned_for_backticks && + subj->backticks[openticklength] <= subj->pos) { + // return if we already know there's no closer + return 0; + } + while (!found) { + // read non backticks + unsigned char c; + while ((c = peek_char(subj)) && c != '`') { + advance(subj); + } + if (is_eof(subj)) { + break; + } + bufsize_t numticks = 0; + while (peek_char(subj) == '`') { + advance(subj); + numticks++; + } + // store position of ender + if (numticks <= MAXBACKTICKS) { + subj->backticks[numticks] = subj->pos - numticks; + } + if (numticks == openticklength) { + return (subj->pos); + } + } + // got through whole input without finding closer + subj->scanned_for_backticks = true; + return 0; +} + +// Parse backtick code section or raw backticks, return an inline. +// Assumes that the subject has a backtick at the current position. +static cmark_node *handle_backticks(subject *subj, int options) { + cmark_chunk openticks = take_while(subj, isbacktick); + bufsize_t startpos = subj->pos; + bufsize_t endpos = scan_to_closing_backticks(subj, openticks.len); + + if (endpos == 0) { // not found + subj->pos = startpos; // rewind + return make_str(subj, subj->pos, subj->pos, openticks); + } else { + cmark_strbuf buf = CMARK_BUF_INIT(subj->mem); + + cmark_strbuf_set(&buf, subj->input.data + startpos, + endpos - startpos - openticks.len); + cmark_strbuf_trim(&buf); + cmark_strbuf_normalize_whitespace(&buf); + + cmark_node *node = make_code(subj, startpos, endpos - openticks.len - 1, cmark_chunk_buf_detach(&buf)); + adjust_subj_node_newlines(subj, node, endpos - startpos, openticks.len, options); + return node; + } +} + +// Scan ***, **, or * and return number scanned, or 0. +// Advances position. +static int scan_delims(subject *subj, unsigned char c, bool *can_open, + bool *can_close) { + int numdelims = 0; + bufsize_t before_char_pos, after_char_pos; + int32_t after_char = 0; + int32_t before_char = 0; + int len; + bool left_flanking, right_flanking; + + if (subj->pos == 0) { + before_char = 10; + } else { + before_char_pos = subj->pos - 1; + // walk back to the beginning of the UTF_8 sequence: + while ((peek_at(subj, before_char_pos) >> 6 == 2 || SKIP_CHARS[peek_at(subj, before_char_pos)]) && before_char_pos > 0) { + before_char_pos -= 1; + } + len = cmark_utf8proc_iterate(subj->input.data + before_char_pos, + subj->pos - before_char_pos, &before_char); + if (len == -1 || (before_char < 256 && SKIP_CHARS[(unsigned char) before_char])) { + before_char = 10; + } + } + + if (c == '\'' || c == '"') { + numdelims++; + advance(subj); // limit to 1 delim for quotes + } else { + while (peek_char(subj) == c) { + numdelims++; + advance(subj); + } + } + + if (subj->pos == subj->input.len) { + after_char = 10; + } else { + after_char_pos = subj->pos; + while (SKIP_CHARS[peek_at(subj, after_char_pos)] && after_char_pos < subj->input.len) { + after_char_pos += 1; + } + len = cmark_utf8proc_iterate(subj->input.data + after_char_pos, + subj->input.len - after_char_pos, &after_char); + if (len == -1 || (after_char < 256 && SKIP_CHARS[(unsigned char) after_char])) { + after_char = 10; + } + } + + left_flanking = numdelims > 0 && !cmark_utf8proc_is_space(after_char) && + (!cmark_utf8proc_is_punctuation(after_char) || + cmark_utf8proc_is_space(before_char) || + cmark_utf8proc_is_punctuation(before_char)); + right_flanking = numdelims > 0 && !cmark_utf8proc_is_space(before_char) && + (!cmark_utf8proc_is_punctuation(before_char) || + cmark_utf8proc_is_space(after_char) || + cmark_utf8proc_is_punctuation(after_char)); + if (c == '_') { + *can_open = left_flanking && + (!right_flanking || cmark_utf8proc_is_punctuation(before_char)); + *can_close = right_flanking && + (!left_flanking || cmark_utf8proc_is_punctuation(after_char)); + } else if (c == '\'' || c == '"') { + *can_open = left_flanking && !right_flanking && + before_char != ']' && before_char != ')'; + *can_close = right_flanking; + } else { + *can_open = left_flanking; + *can_close = right_flanking; + } + return numdelims; +} + +/* +static void print_delimiters(subject *subj) +{ + delimiter *delim; + delim = subj->last_delim; + while (delim != NULL) { + printf("Item at stack pos %p: %d %d %d next(%p) prev(%p)\n", + (void*)delim, delim->delim_char, + delim->can_open, delim->can_close, + (void*)delim->next, (void*)delim->previous); + delim = delim->previous; + } +} +*/ + +static void remove_delimiter(subject *subj, delimiter *delim) { + if (delim == NULL) + return; + if (delim->next == NULL) { + // end of list: + assert(delim == subj->last_delim); + subj->last_delim = delim->previous; + } else { + delim->next->previous = delim->previous; + } + if (delim->previous != NULL) { + delim->previous->next = delim->next; + } + subj->mem->free(delim); +} + +static void pop_bracket(subject *subj) { + bracket *b; + if (subj->last_bracket == NULL) + return; + b = subj->last_bracket; + subj->last_bracket = subj->last_bracket->previous; + subj->mem->free(b); +} + +static void push_delimiter(subject *subj, unsigned char c, bool can_open, + bool can_close, cmark_node *inl_text) { + delimiter *delim = (delimiter *)subj->mem->calloc(1, sizeof(delimiter)); + delim->delim_char = c; + delim->can_open = can_open; + delim->can_close = can_close; + delim->inl_text = inl_text; + delim->length = inl_text->as.literal.len; + delim->previous = subj->last_delim; + delim->next = NULL; + if (delim->previous != NULL) { + delim->previous->next = delim; + } + subj->last_delim = delim; +} + +static void push_bracket(subject *subj, bool image, cmark_node *inl_text) { + bracket *b = (bracket *)subj->mem->calloc(1, sizeof(bracket)); + if (subj->last_bracket != NULL) { + subj->last_bracket->bracket_after = true; + } + b->image = image; + b->active = true; + b->inl_text = inl_text; + b->previous = subj->last_bracket; + b->previous_delimiter = subj->last_delim; + b->position = subj->pos; + b->bracket_after = false; + subj->last_bracket = b; +} + +// Assumes the subject has a c at the current position. +static cmark_node *handle_delim(subject *subj, unsigned char c, bool smart) { + bufsize_t numdelims; + cmark_node *inl_text; + bool can_open, can_close; + cmark_chunk contents; + + numdelims = scan_delims(subj, c, &can_open, &can_close); + + if (c == '\'' && smart) { + contents = cmark_chunk_literal(RIGHTSINGLEQUOTE); + } else if (c == '"' && smart) { + contents = + cmark_chunk_literal(can_close ? RIGHTDOUBLEQUOTE : LEFTDOUBLEQUOTE); + } else { + contents = cmark_chunk_dup(&subj->input, subj->pos - numdelims, numdelims); + } + + inl_text = make_str(subj, subj->pos - numdelims, subj->pos - 1, contents); + + if ((can_open || can_close) && (!(c == '\'' || c == '"') || smart)) { + push_delimiter(subj, c, can_open, can_close, inl_text); + } + + return inl_text; +} + +// Assumes we have a hyphen at the current position. +static cmark_node *handle_hyphen(subject *subj, bool smart) { + int startpos = subj->pos; + + advance(subj); + + if (!smart || peek_char(subj) != '-') { + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("-")); + } + + while (smart && peek_char(subj) == '-') { + advance(subj); + } + + int numhyphens = subj->pos - startpos; + int en_count = 0; + int em_count = 0; + int i; + cmark_strbuf buf = CMARK_BUF_INIT(subj->mem); + + if (numhyphens % 3 == 0) { // if divisible by 3, use all em dashes + em_count = numhyphens / 3; + } else if (numhyphens % 2 == 0) { // if divisible by 2, use all en dashes + en_count = numhyphens / 2; + } else if (numhyphens % 3 == 2) { // use one en dash at end + en_count = 1; + em_count = (numhyphens - 2) / 3; + } else { // use two en dashes at the end + en_count = 2; + em_count = (numhyphens - 4) / 3; + } + + for (i = em_count; i > 0; i--) { + cmark_strbuf_puts(&buf, EMDASH); + } + + for (i = en_count; i > 0; i--) { + cmark_strbuf_puts(&buf, ENDASH); + } + + return make_str(subj, startpos, subj->pos - 1, cmark_chunk_buf_detach(&buf)); +} + +// Assumes we have a period at the current position. +static cmark_node *handle_period(subject *subj, bool smart) { + advance(subj); + if (smart && peek_char(subj) == '.') { + advance(subj); + if (peek_char(subj) == '.') { + advance(subj); + return make_str(subj, subj->pos - 3, subj->pos - 1, cmark_chunk_literal(ELLIPSES)); + } else { + return make_str(subj, subj->pos - 2, subj->pos - 1, cmark_chunk_literal("..")); + } + } else { + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal(".")); + } +} + +static cmark_syntax_extension *get_extension_for_special_char(cmark_parser *parser, unsigned char c) { + cmark_llist *tmp_ext; + + for (tmp_ext = parser->inline_syntax_extensions; tmp_ext; tmp_ext=tmp_ext->next) { + cmark_syntax_extension *ext = (cmark_syntax_extension *) tmp_ext->data; + cmark_llist *tmp_char; + for (tmp_char = ext->special_inline_chars; tmp_char; tmp_char=tmp_char->next) { + unsigned char tmp_c = (unsigned char)(size_t)tmp_char->data; + + if (tmp_c == c) { + return ext; + } + } + } + + return NULL; +} + +static void process_emphasis(cmark_parser *parser, subject *subj, delimiter *stack_bottom) { + delimiter *closer = subj->last_delim; + delimiter *opener; + delimiter *old_closer; + bool opener_found; + bool odd_match; + delimiter *openers_bottom[3][128]; + int i; + + // initialize openers_bottom: + memset(&openers_bottom, 0, sizeof(openers_bottom)); + for (i=0; i < 3; i++) { + openers_bottom[i]['*'] = stack_bottom; + openers_bottom[i]['_'] = stack_bottom; + openers_bottom[i]['\''] = stack_bottom; + openers_bottom[i]['"'] = stack_bottom; + } + + // move back to first relevant delim. + while (closer != NULL && closer->previous != stack_bottom) { + closer = closer->previous; + } + + // now move forward, looking for closers, and handling each + while (closer != NULL) { + cmark_syntax_extension *extension = get_extension_for_special_char(parser, closer->delim_char); + if (closer->can_close) { + // Now look backwards for first matching opener: + opener = closer->previous; + opener_found = false; + odd_match = false; + while (opener != NULL && opener != stack_bottom && + opener != openers_bottom[closer->length % 3][closer->delim_char]) { + if (opener->can_open && opener->delim_char == closer->delim_char) { + // interior closer of size 2 can't match opener of size 1 + // or of size 1 can't match 2 + odd_match = (closer->can_open || opener->can_close) && + ((opener->length + closer->length) % 3 == 0); + if (!odd_match) { + opener_found = true; + break; + } + } + opener = opener->previous; + } + old_closer = closer; + + if (extension) { + if (opener_found) + closer = extension->insert_inline_from_delim(extension, parser, subj, opener, closer); + else + closer = closer->next; + } else if (closer->delim_char == '*' || closer->delim_char == '_') { + if (opener_found) { + closer = S_insert_emph(subj, opener, closer); + } else { + closer = closer->next; + } + } else if (closer->delim_char == '\'') { + cmark_chunk_free(subj->mem, &closer->inl_text->as.literal); + closer->inl_text->as.literal = cmark_chunk_literal(RIGHTSINGLEQUOTE); + if (opener_found) { + cmark_chunk_free(subj->mem, &opener->inl_text->as.literal); + opener->inl_text->as.literal = cmark_chunk_literal(LEFTSINGLEQUOTE); + } + closer = closer->next; + } else if (closer->delim_char == '"') { + cmark_chunk_free(subj->mem, &closer->inl_text->as.literal); + closer->inl_text->as.literal = cmark_chunk_literal(RIGHTDOUBLEQUOTE); + if (opener_found) { + cmark_chunk_free(subj->mem, &opener->inl_text->as.literal); + opener->inl_text->as.literal = cmark_chunk_literal(LEFTDOUBLEQUOTE); + } + closer = closer->next; + } + if (!opener_found) { + // set lower bound for future searches for openers + openers_bottom[old_closer->length % 3][old_closer->delim_char] = + old_closer->previous; + if (!old_closer->can_open) { + // we can remove a closer that can't be an + // opener, once we've seen there's no + // matching opener: + remove_delimiter(subj, old_closer); + } + } + } else { + closer = closer->next; + } + } + // free all delimiters in list until stack_bottom: + while (subj->last_delim != NULL && subj->last_delim != stack_bottom) { + remove_delimiter(subj, subj->last_delim); + } +} + +static delimiter *S_insert_emph(subject *subj, delimiter *opener, + delimiter *closer) { + delimiter *delim, *tmp_delim; + bufsize_t use_delims; + cmark_node *opener_inl = opener->inl_text; + cmark_node *closer_inl = closer->inl_text; + bufsize_t opener_num_chars = opener_inl->as.literal.len; + bufsize_t closer_num_chars = closer_inl->as.literal.len; + cmark_node *tmp, *tmpnext, *emph; + + // calculate the actual number of characters used from this closer + use_delims = (closer_num_chars >= 2 && opener_num_chars >= 2) ? 2 : 1; + + // remove used characters from associated inlines. + opener_num_chars -= use_delims; + closer_num_chars -= use_delims; + opener_inl->as.literal.len = opener_num_chars; + closer_inl->as.literal.len = closer_num_chars; + + // free delimiters between opener and closer + delim = closer->previous; + while (delim != NULL && delim != opener) { + tmp_delim = delim->previous; + remove_delimiter(subj, delim); + delim = tmp_delim; + } + + // create new emph or strong, and splice it in to our inlines + // between the opener and closer + emph = use_delims == 1 ? make_emph(subj->mem) : make_strong(subj->mem); + + tmp = opener_inl->next; + while (tmp && tmp != closer_inl) { + tmpnext = tmp->next; + cmark_node_append_child(emph, tmp); + tmp = tmpnext; + } + cmark_node_insert_after(opener_inl, emph); + + emph->start_line = emph->end_line = subj->line; + emph->start_column = opener_inl->start_column + subj->column_offset; + emph->end_column = closer_inl->end_column + subj->column_offset; + + // if opener has 0 characters, remove it and its associated inline + if (opener_num_chars == 0) { + cmark_node_free(opener_inl); + remove_delimiter(subj, opener); + } + + // if closer has 0 characters, remove it and its associated inline + if (closer_num_chars == 0) { + // remove empty closer inline + cmark_node_free(closer_inl); + // remove closer from list + tmp_delim = closer->next; + remove_delimiter(subj, closer); + closer = tmp_delim; + } + + return closer; +} + +// Parse backslash-escape or just a backslash, returning an inline. +static cmark_node *handle_backslash(cmark_parser *parser, subject *subj) { + advance(subj); + unsigned char nextchar = peek_char(subj); + if ((parser->backslash_ispunct ? parser->backslash_ispunct : cmark_ispunct)(nextchar)) { + // only ascii symbols and newline can be escaped + advance(subj); + return make_str(subj, subj->pos - 2, subj->pos - 1, cmark_chunk_dup(&subj->input, subj->pos - 1, 1)); + } else if (!is_eof(subj) && skip_line_end(subj)) { + return make_linebreak(subj->mem); + } else { + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("\\")); + } +} + +// Parse an entity or a regular "&" string. +// Assumes the subject has an '&' character at the current position. +static cmark_node *handle_entity(subject *subj) { + cmark_strbuf ent = CMARK_BUF_INIT(subj->mem); + bufsize_t len; + + advance(subj); + + len = houdini_unescape_ent(&ent, subj->input.data + subj->pos, + subj->input.len - subj->pos); + + if (len == 0) + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("&")); + + subj->pos += len; + return make_str(subj, subj->pos - 1 - len, subj->pos - 1, cmark_chunk_buf_detach(&ent)); +} + +// Clean a URL: remove surrounding whitespace, and remove \ that escape +// punctuation. +cmark_chunk cmark_clean_url(cmark_mem *mem, cmark_chunk *url) { + cmark_strbuf buf = CMARK_BUF_INIT(mem); + + cmark_chunk_trim(url); + + if (url->len == 0) { + cmark_chunk result = CMARK_CHUNK_EMPTY; + return result; + } + + houdini_unescape_html_f(&buf, url->data, url->len); + + cmark_strbuf_unescape(&buf); + return cmark_chunk_buf_detach(&buf); +} + +cmark_chunk cmark_clean_title(cmark_mem *mem, cmark_chunk *title) { + cmark_strbuf buf = CMARK_BUF_INIT(mem); + unsigned char first, last; + + if (title->len == 0) { + cmark_chunk result = CMARK_CHUNK_EMPTY; + return result; + } + + first = title->data[0]; + last = title->data[title->len - 1]; + + // remove surrounding quotes if any: + if ((first == '\'' && last == '\'') || (first == '(' && last == ')') || + (first == '"' && last == '"')) { + houdini_unescape_html_f(&buf, title->data + 1, title->len - 2); + } else { + houdini_unescape_html_f(&buf, title->data, title->len); + } + + cmark_strbuf_unescape(&buf); + return cmark_chunk_buf_detach(&buf); +} + +// Parse an autolink or HTML tag. +// Assumes the subject has a '<' character at the current position. +static cmark_node *handle_pointy_brace(subject *subj, int options) { + bufsize_t matchlen = 0; + cmark_chunk contents; + + advance(subj); // advance past first < + + // first try to match a URL autolink + matchlen = scan_autolink_uri(&subj->input, subj->pos); + if (matchlen > 0) { + contents = cmark_chunk_dup(&subj->input, subj->pos, matchlen - 1); + subj->pos += matchlen; + + return make_autolink(subj, subj->pos - 1 - matchlen, subj->pos - 1, contents, 0); + } + + // next try to match an email autolink + matchlen = scan_autolink_email(&subj->input, subj->pos); + if (matchlen > 0) { + contents = cmark_chunk_dup(&subj->input, subj->pos, matchlen - 1); + subj->pos += matchlen; + + return make_autolink(subj, subj->pos - 1 - matchlen, subj->pos - 1, contents, 1); + } + + // finally, try to match an html tag + matchlen = scan_html_tag(&subj->input, subj->pos); + if (matchlen > 0) { + contents = cmark_chunk_dup(&subj->input, subj->pos - 1, matchlen + 1); + subj->pos += matchlen; + cmark_node *node = make_raw_html(subj, subj->pos - matchlen - 1, subj->pos - 1, contents); + adjust_subj_node_newlines(subj, node, matchlen, 1, options); + return node; + } + + if (options & CMARK_OPT_LIBERAL_HTML_TAG) { + matchlen = scan_liberal_html_tag(&subj->input, subj->pos); + if (matchlen > 0) { + contents = cmark_chunk_dup(&subj->input, subj->pos - 1, matchlen + 1); + subj->pos += matchlen; + cmark_node *node = make_raw_html(subj, subj->pos - matchlen - 1, subj->pos - 1, contents); + adjust_subj_node_newlines(subj, node, matchlen, 1, options); + return node; + } + } + + // if nothing matches, just return the opening <: + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("<")); +} + +// Parse a link label. Returns 1 if successful. +// Note: unescaped brackets are not allowed in labels. +// The label begins with `[` and ends with the first `]` character +// encountered. Backticks in labels do not start code spans. +static int link_label(subject *subj, cmark_chunk *raw_label) { + bufsize_t startpos = subj->pos; + int length = 0; + unsigned char c; + + // advance past [ + if (peek_char(subj) == '[') { + advance(subj); + } else { + return 0; + } + + while ((c = peek_char(subj)) && c != '[' && c != ']') { + if (c == '\\') { + advance(subj); + length++; + if (cmark_ispunct(peek_char(subj))) { + advance(subj); + length++; + } + } else { + advance(subj); + length++; + } + if (length > MAX_LINK_LABEL_LENGTH) { + goto noMatch; + } + } + + if (c == ']') { // match found + *raw_label = + cmark_chunk_dup(&subj->input, startpos + 1, subj->pos - (startpos + 1)); + cmark_chunk_trim(raw_label); + advance(subj); // advance past ] + return 1; + } + +noMatch: + subj->pos = startpos; // rewind + return 0; +} + +static bufsize_t manual_scan_link_url_2(cmark_chunk *input, bufsize_t offset, + cmark_chunk *output) { + bufsize_t i = offset; + size_t nb_p = 0; + + while (i < input->len) { + if (input->data[i] == '\\' && + i + 1 < input-> len && + cmark_ispunct(input->data[i+1])) + i += 2; + else if (input->data[i] == '(') { + ++nb_p; + ++i; + if (nb_p > 32) + return -1; + } else if (input->data[i] == ')') { + if (nb_p == 0) + break; + --nb_p; + ++i; + } else if (cmark_isspace(input->data[i])) + break; + else + ++i; + } + + if (i >= input->len) + return -1; + + { + cmark_chunk result = {input->data + offset, i - offset, 0}; + *output = result; + } + return i - offset; +} + +static bufsize_t manual_scan_link_url(cmark_chunk *input, bufsize_t offset, + cmark_chunk *output) { + bufsize_t i = offset; + + if (i < input->len && input->data[i] == '<') { + ++i; + while (i < input->len) { + if (input->data[i] == '>') { + ++i; + break; + } else if (input->data[i] == '\\') + i += 2; + else if (input->data[i] == '\n' || input->data[i] == '<') + return manual_scan_link_url_2(input, offset, output); + else + ++i; + } + } else { + return manual_scan_link_url_2(input, offset, output); + } + + if (i >= input->len) + return -1; + + { + cmark_chunk result = {input->data + offset + 1, i - 2 - offset, 0}; + *output = result; + } + return i - offset; +} + +// Return a link, an image, or a literal close bracket. +static cmark_node *handle_close_bracket(cmark_parser *parser, subject *subj) { + bufsize_t initial_pos, after_link_text_pos; + bufsize_t endurl, starttitle, endtitle, endall; + bufsize_t sps, n; + cmark_reference *ref = NULL; + cmark_chunk url_chunk, title_chunk; + cmark_chunk url, title; + bracket *opener; + cmark_node *inl; + cmark_chunk raw_label; + int found_label; + cmark_node *tmp, *tmpnext; + bool is_image; + + advance(subj); // advance past ] + initial_pos = subj->pos; + + // get last [ or ![ + opener = subj->last_bracket; + + if (opener == NULL) { + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]")); + } + + if (!opener->active) { + // take delimiter off stack + pop_bracket(subj); + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]")); + } + + // If we got here, we matched a potential link/image text. + // Now we check to see if it's a link/image. + is_image = opener->image; + + after_link_text_pos = subj->pos; + + // First, look for an inline link. + if (peek_char(subj) == '(' && + ((sps = scan_spacechars(&subj->input, subj->pos + 1)) > -1) && + ((n = manual_scan_link_url(&subj->input, subj->pos + 1 + sps, + &url_chunk)) > -1)) { + + // try to parse an explicit link: + endurl = subj->pos + 1 + sps + n; + starttitle = endurl + scan_spacechars(&subj->input, endurl); + + // ensure there are spaces btw url and title + endtitle = (starttitle == endurl) + ? starttitle + : starttitle + scan_link_title(&subj->input, starttitle); + + endall = endtitle + scan_spacechars(&subj->input, endtitle); + + if (peek_at(subj, endall) == ')') { + subj->pos = endall + 1; + + title_chunk = + cmark_chunk_dup(&subj->input, starttitle, endtitle - starttitle); + url = cmark_clean_url(subj->mem, &url_chunk); + title = cmark_clean_title(subj->mem, &title_chunk); + cmark_chunk_free(subj->mem, &url_chunk); + cmark_chunk_free(subj->mem, &title_chunk); + goto match; + + } else { + // it could still be a shortcut reference link + subj->pos = after_link_text_pos; + } + } + + // Next, look for a following [link label] that matches in refmap. + // skip spaces + raw_label = cmark_chunk_literal(""); + found_label = link_label(subj, &raw_label); + if (!found_label) { + // If we have a shortcut reference link, back up + // to before the spacse we skipped. + subj->pos = initial_pos; + } + + if ((!found_label || raw_label.len == 0) && !opener->bracket_after) { + cmark_chunk_free(subj->mem, &raw_label); + raw_label = cmark_chunk_dup(&subj->input, opener->position, + initial_pos - opener->position - 1); + found_label = true; + } + + if (found_label) { + ref = (cmark_reference *)cmark_map_lookup(subj->refmap, &raw_label); + cmark_chunk_free(subj->mem, &raw_label); + } + + if (ref != NULL) { // found + url = chunk_clone(subj->mem, &ref->url); + title = chunk_clone(subj->mem, &ref->title); + goto match; + } else { + goto noMatch; + } + +noMatch: + // If we fall through to here, it means we didn't match a link. + // What if we're a footnote link? + if (parser->options & CMARK_OPT_FOOTNOTES && + opener->inl_text->next && + opener->inl_text->next->type == CMARK_NODE_TEXT && + !opener->inl_text->next->next) { + cmark_chunk *literal = &opener->inl_text->next->as.literal; + if (literal->len > 1 && literal->data[0] == '^') { + inl = make_simple(subj->mem, CMARK_NODE_FOOTNOTE_REFERENCE); + inl->as.literal = cmark_chunk_dup(literal, 1, literal->len - 1); + inl->start_line = inl->end_line = subj->line; + inl->start_column = opener->inl_text->start_column; + inl->end_column = subj->pos + subj->column_offset + subj->block_offset; + cmark_node_insert_before(opener->inl_text, inl); + cmark_node_free(opener->inl_text->next); + cmark_node_free(opener->inl_text); + process_emphasis(parser, subj, opener->previous_delimiter); + pop_bracket(subj); + return NULL; + } + } + + pop_bracket(subj); // remove this opener from delimiter list + subj->pos = initial_pos; + return make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("]")); + +match: + inl = make_simple(subj->mem, is_image ? CMARK_NODE_IMAGE : CMARK_NODE_LINK); + inl->as.link.url = url; + inl->as.link.title = title; + inl->start_line = inl->end_line = subj->line; + inl->start_column = opener->inl_text->start_column; + inl->end_column = subj->pos + subj->column_offset + subj->block_offset; + cmark_node_insert_before(opener->inl_text, inl); + // Add link text: + tmp = opener->inl_text->next; + while (tmp) { + tmpnext = tmp->next; + cmark_node_append_child(inl, tmp); + tmp = tmpnext; + } + + // Free the bracket [: + cmark_node_free(opener->inl_text); + + process_emphasis(parser, subj, opener->previous_delimiter); + pop_bracket(subj); + + // Now, if we have a link, we also want to deactivate earlier link + // delimiters. (This code can be removed if we decide to allow links + // inside links.) + if (!is_image) { + opener = subj->last_bracket; + while (opener != NULL) { + if (!opener->image) { + if (!opener->active) { + break; + } else { + opener->active = false; + } + } + opener = opener->previous; + } + } + + return NULL; +} + +// Parse a hard or soft linebreak, returning an inline. +// Assumes the subject has a cr or newline at the current position. +static cmark_node *handle_newline(subject *subj) { + bufsize_t nlpos = subj->pos; + // skip over cr, crlf, or lf: + if (peek_at(subj, subj->pos) == '\r') { + advance(subj); + } + if (peek_at(subj, subj->pos) == '\n') { + advance(subj); + } + ++subj->line; + subj->column_offset = -subj->pos; + // skip spaces at beginning of line + skip_spaces(subj); + if (nlpos > 1 && peek_at(subj, nlpos - 1) == ' ' && + peek_at(subj, nlpos - 2) == ' ') { + return make_linebreak(subj->mem); + } else { + return make_softbreak(subj->mem); + } +} + +// "\r\n\\`&_*[]pos + 1; + + while (n < subj->input.len) { + if (SPECIAL_CHARS[subj->input.data[n]]) + return n; + if (options & CMARK_OPT_SMART && SMART_PUNCT_CHARS[subj->input.data[n]]) + return n; + n++; + } + + return subj->input.len; +} + +void cmark_inlines_add_special_character(unsigned char c, bool emphasis) { + SPECIAL_CHARS[c] = 1; + if (emphasis) + SKIP_CHARS[c] = 1; +} + +void cmark_inlines_remove_special_character(unsigned char c, bool emphasis) { + SPECIAL_CHARS[c] = 0; + if (emphasis) + SKIP_CHARS[c] = 0; +} + +static cmark_node *try_extensions(cmark_parser *parser, + cmark_node *parent, + unsigned char c, + subject *subj) { + cmark_node *res = NULL; + cmark_llist *tmp; + + for (tmp = parser->inline_syntax_extensions; tmp; tmp = tmp->next) { + cmark_syntax_extension *ext = (cmark_syntax_extension *) tmp->data; + res = ext->match_inline(ext, parser, parent, c, subj); + + if (res) + break; + } + + return res; +} + +// Parse an inline, advancing subject, and add it as a child of parent. +// Return 0 if no inline can be parsed, 1 otherwise. +static int parse_inline(cmark_parser *parser, subject *subj, cmark_node *parent, int options) { + cmark_node *new_inl = NULL; + cmark_chunk contents; + unsigned char c; + bufsize_t startpos, endpos; + c = peek_char(subj); + if (c == 0) { + return 0; + } + switch (c) { + case '\r': + case '\n': + new_inl = handle_newline(subj); + break; + case '`': + new_inl = handle_backticks(subj, options); + break; + case '\\': + new_inl = handle_backslash(parser, subj); + break; + case '&': + new_inl = handle_entity(subj); + break; + case '<': + new_inl = handle_pointy_brace(subj, options); + break; + case '*': + case '_': + case '\'': + case '"': + new_inl = handle_delim(subj, c, (options & CMARK_OPT_SMART) != 0); + break; + case '-': + new_inl = handle_hyphen(subj, (options & CMARK_OPT_SMART) != 0); + break; + case '.': + new_inl = handle_period(subj, (options & CMARK_OPT_SMART) != 0); + break; + case '[': + advance(subj); + new_inl = make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("[")); + push_bracket(subj, false, new_inl); + break; + case ']': + new_inl = handle_close_bracket(parser, subj); + break; + case '!': + advance(subj); + if (peek_char(subj) == '[' && peek_char_n(subj, 1) != '^') { + advance(subj); + new_inl = make_str(subj, subj->pos - 2, subj->pos - 1, cmark_chunk_literal("![")); + push_bracket(subj, true, new_inl); + } else { + new_inl = make_str(subj, subj->pos - 1, subj->pos - 1, cmark_chunk_literal("!")); + } + break; + default: + new_inl = try_extensions(parser, parent, c, subj); + if (new_inl != NULL) + break; + + endpos = subject_find_special_char(subj, options); + contents = cmark_chunk_dup(&subj->input, subj->pos, endpos - subj->pos); + startpos = subj->pos; + subj->pos = endpos; + + // if we're at a newline, strip trailing spaces. + if (S_is_line_end_char(peek_char(subj))) { + cmark_chunk_rtrim(&contents); + } + + new_inl = make_str(subj, startpos, endpos - 1, contents); + } + if (new_inl != NULL) { + cmark_node_append_child(parent, new_inl); + } + + return 1; +} + +// Parse inlines from parent's string_content, adding as children of parent. +void cmark_parse_inlines(cmark_parser *parser, + cmark_node *parent, + cmark_map *refmap, + int options) { + subject subj; + cmark_chunk content = {parent->content.ptr, parent->content.size, 0}; + subject_from_buf(parser->mem, parent->start_line, parent->start_column - 1 + parent->internal_offset, &subj, &content, refmap); + cmark_chunk_rtrim(&subj.input); + + while (!is_eof(&subj) && parse_inline(parser, &subj, parent, options)) + ; + + process_emphasis(parser, &subj, NULL); + // free bracket and delim stack + while (subj.last_delim) { + remove_delimiter(&subj, subj.last_delim); + } + while (subj.last_bracket) { + pop_bracket(&subj); + } +} + +// Parse zero or more space characters, including at most one newline. +static void spnl(subject *subj) { + skip_spaces(subj); + if (skip_line_end(subj)) { + skip_spaces(subj); + } +} + +// Parse reference. Assumes string begins with '[' character. +// Modify refmap if a reference is encountered. +// Return 0 if no reference found, otherwise position of subject +// after reference is parsed. +bufsize_t cmark_parse_reference_inline(cmark_mem *mem, cmark_chunk *input, + cmark_map *refmap) { + subject subj; + + cmark_chunk lab; + cmark_chunk url; + cmark_chunk title; + + bufsize_t matchlen = 0; + bufsize_t beforetitle; + + subject_from_buf(mem, -1, 0, &subj, input, NULL); + + // parse label: + if (!link_label(&subj, &lab) || lab.len == 0) + return 0; + + // colon: + if (peek_char(&subj) == ':') { + advance(&subj); + } else { + return 0; + } + + // parse link url: + spnl(&subj); + if ((matchlen = manual_scan_link_url(&subj.input, subj.pos, &url)) > -1 && + url.len > 0) { + subj.pos += matchlen; + } else { + return 0; + } + + // parse optional link_title + beforetitle = subj.pos; + spnl(&subj); + matchlen = scan_link_title(&subj.input, subj.pos); + if (matchlen) { + title = cmark_chunk_dup(&subj.input, subj.pos, matchlen); + subj.pos += matchlen; + } else { + subj.pos = beforetitle; + title = cmark_chunk_literal(""); + } + + // parse final spaces and newline: + skip_spaces(&subj); + if (!skip_line_end(&subj)) { + if (matchlen) { // try rewinding before title + subj.pos = beforetitle; + skip_spaces(&subj); + if (!skip_line_end(&subj)) { + return 0; + } + } else { + return 0; + } + } + // insert reference into refmap + cmark_reference_create(refmap, &lab, &url, &title); + return subj.pos; +} + +unsigned char cmark_inline_parser_peek_char(cmark_inline_parser *parser) { + return peek_char(parser); +} + +unsigned char cmark_inline_parser_peek_at(cmark_inline_parser *parser, bufsize_t pos) { + return peek_at(parser, pos); +} + +int cmark_inline_parser_is_eof(cmark_inline_parser *parser) { + return is_eof(parser); +} + +static char * +my_strndup (const char *s, size_t n) +{ + char *result; + size_t len = strlen (s); + + if (n < len) + len = n; + + result = (char *) malloc (len + 1); + if (!result) + return 0; + + result[len] = '\0'; + return (char *) memcpy (result, s, len); +} + +char *cmark_inline_parser_take_while(cmark_inline_parser *parser, cmark_inline_predicate pred) { + unsigned char c; + bufsize_t startpos = parser->pos; + bufsize_t len = 0; + + while ((c = peek_char(parser)) && (*pred)(c)) { + advance(parser); + len++; + } + + return my_strndup((const char *) parser->input.data + startpos, len); +} + +void cmark_inline_parser_push_delimiter(cmark_inline_parser *parser, + unsigned char c, + int can_open, + int can_close, + cmark_node *inl_text) { + push_delimiter(parser, c, can_open != 0, can_close != 0, inl_text); +} + +void cmark_inline_parser_remove_delimiter(cmark_inline_parser *parser, delimiter *delim) { + remove_delimiter(parser, delim); +} + +int cmark_inline_parser_scan_delimiters(cmark_inline_parser *parser, + int max_delims, + unsigned char c, + int *left_flanking, + int *right_flanking, + int *punct_before, + int *punct_after) { + int numdelims = 0; + bufsize_t before_char_pos; + int32_t after_char = 0; + int32_t before_char = 0; + int len; + bool space_before, space_after; + + if (parser->pos == 0) { + before_char = 10; + } else { + before_char_pos = parser->pos - 1; + // walk back to the beginning of the UTF_8 sequence: + while (peek_at(parser, before_char_pos) >> 6 == 2 && before_char_pos > 0) { + before_char_pos -= 1; + } + len = cmark_utf8proc_iterate(parser->input.data + before_char_pos, + parser->pos - before_char_pos, &before_char); + if (len == -1) { + before_char = 10; + } + } + + while (peek_char(parser) == c && numdelims <= max_delims) { + numdelims++; + advance(parser); + } + + len = cmark_utf8proc_iterate(parser->input.data + parser->pos, + parser->input.len - parser->pos, &after_char); + if (len == -1) { + after_char = 10; + } + + *punct_before = cmark_utf8proc_is_punctuation(before_char); + *punct_after = cmark_utf8proc_is_punctuation(after_char); + space_before = cmark_utf8proc_is_space(before_char) != 0; + space_after = cmark_utf8proc_is_space(after_char) != 0; + + *left_flanking = numdelims > 0 && !cmark_utf8proc_is_space(after_char) && + !(*punct_after && !space_before && !*punct_before); + *right_flanking = numdelims > 0 && !cmark_utf8proc_is_space(before_char) && + !(*punct_before && !space_after && !*punct_after); + + return numdelims; +} + +void cmark_inline_parser_advance_offset(cmark_inline_parser *parser) { + advance(parser); +} + +int cmark_inline_parser_get_offset(cmark_inline_parser *parser) { + return parser->pos; +} + +void cmark_inline_parser_set_offset(cmark_inline_parser *parser, int offset) { + parser->pos = offset; +} + +int cmark_inline_parser_get_column(cmark_inline_parser *parser) { + return parser->pos + 1 + parser->column_offset + parser->block_offset; +} + +cmark_chunk *cmark_inline_parser_get_chunk(cmark_inline_parser *parser) { + return &parser->input; +} + +int cmark_inline_parser_in_bracket(cmark_inline_parser *parser, int image) { + for (bracket *b = parser->last_bracket; b; b = b->previous) + if (b->active && b->image == (image != 0)) + return 1; + return 0; +} + +void cmark_node_unput(cmark_node *node, int n) { + node = node->last_child; + while (n > 0 && node && node->type == CMARK_NODE_TEXT) { + if (node->as.literal.len < n) { + n -= node->as.literal.len; + node->as.literal.len = 0; + } else { + node->as.literal.len -= n; + n = 0; + } + node = node->prev; + } +} + +delimiter *cmark_inline_parser_get_last_delimiter(cmark_inline_parser *parser) { + return parser->last_delim; +} + +int cmark_inline_parser_get_line(cmark_inline_parser *parser) { + return parser->line; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/inlines.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/inlines.h new file mode 100644 index 000000000000..7dd91bf52e7d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/inlines.h @@ -0,0 +1,29 @@ +#ifndef CMARK_INLINES_H +#define CMARK_INLINES_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "references.h" + +cmark_chunk cmark_clean_url(cmark_mem *mem, cmark_chunk *url); +cmark_chunk cmark_clean_title(cmark_mem *mem, cmark_chunk *title); + +CMARK_GFM_EXPORT +void cmark_parse_inlines(cmark_parser *parser, + cmark_node *parent, + cmark_map *refmap, + int options); + +bufsize_t cmark_parse_reference_inline(cmark_mem *mem, cmark_chunk *input, + cmark_map *refmap); + +void cmark_inlines_add_special_character(unsigned char c, bool emphasis); +void cmark_inlines_remove_special_character(unsigned char c, bool emphasis); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/inlines.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/inlines.o new file mode 100644 index 000000000000..9e18965dadb0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/inlines.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/iterator.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/iterator.c new file mode 100644 index 000000000000..13fdb7616561 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/iterator.c @@ -0,0 +1,159 @@ +#include +#include + +#include "config.h" +#include "node.h" +#include "cmark-gfm.h" +#include "iterator.h" + +cmark_iter *cmark_iter_new(cmark_node *root) { + if (root == NULL) { + return NULL; + } + cmark_mem *mem = root->content.mem; + cmark_iter *iter = (cmark_iter *)mem->calloc(1, sizeof(cmark_iter)); + iter->mem = mem; + iter->root = root; + iter->cur.ev_type = CMARK_EVENT_NONE; + iter->cur.node = NULL; + iter->next.ev_type = CMARK_EVENT_ENTER; + iter->next.node = root; + return iter; +} + +void cmark_iter_free(cmark_iter *iter) { iter->mem->free(iter); } + +static bool S_is_leaf(cmark_node *node) { + switch (node->type) { + case CMARK_NODE_HTML_BLOCK: + case CMARK_NODE_THEMATIC_BREAK: + case CMARK_NODE_CODE_BLOCK: + case CMARK_NODE_TEXT: + case CMARK_NODE_SOFTBREAK: + case CMARK_NODE_LINEBREAK: + case CMARK_NODE_CODE: + case CMARK_NODE_HTML_INLINE: + return 1; + } + return 0; +} + +cmark_event_type cmark_iter_next(cmark_iter *iter) { + cmark_event_type ev_type = iter->next.ev_type; + cmark_node *node = iter->next.node; + + iter->cur.ev_type = ev_type; + iter->cur.node = node; + + if (ev_type == CMARK_EVENT_DONE) { + return ev_type; + } + + /* roll forward to next item, setting both fields */ + if (ev_type == CMARK_EVENT_ENTER && !S_is_leaf(node)) { + if (node->first_child == NULL) { + /* stay on this node but exit */ + iter->next.ev_type = CMARK_EVENT_EXIT; + } else { + iter->next.ev_type = CMARK_EVENT_ENTER; + iter->next.node = node->first_child; + } + } else if (node == iter->root) { + /* don't move past root */ + iter->next.ev_type = CMARK_EVENT_DONE; + iter->next.node = NULL; + } else if (node->next) { + iter->next.ev_type = CMARK_EVENT_ENTER; + iter->next.node = node->next; + } else if (node->parent) { + iter->next.ev_type = CMARK_EVENT_EXIT; + iter->next.node = node->parent; + } else { + assert(false); + iter->next.ev_type = CMARK_EVENT_DONE; + iter->next.node = NULL; + } + + return ev_type; +} + +void cmark_iter_reset(cmark_iter *iter, cmark_node *current, + cmark_event_type event_type) { + iter->next.ev_type = event_type; + iter->next.node = current; + cmark_iter_next(iter); +} + +cmark_node *cmark_iter_get_node(cmark_iter *iter) { return iter->cur.node; } + +cmark_event_type cmark_iter_get_event_type(cmark_iter *iter) { + return iter->cur.ev_type; +} + +cmark_node *cmark_iter_get_root(cmark_iter *iter) { return iter->root; } + +void cmark_consolidate_text_nodes(cmark_node *root) { + if (root == NULL) { + return; + } + cmark_iter *iter = cmark_iter_new(root); + cmark_strbuf buf = CMARK_BUF_INIT(iter->mem); + cmark_event_type ev_type; + cmark_node *cur, *tmp, *next; + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (ev_type == CMARK_EVENT_ENTER && cur->type == CMARK_NODE_TEXT && + cur->next && cur->next->type == CMARK_NODE_TEXT) { + cmark_strbuf_clear(&buf); + cmark_strbuf_put(&buf, cur->as.literal.data, cur->as.literal.len); + tmp = cur->next; + while (tmp && tmp->type == CMARK_NODE_TEXT) { + cmark_iter_next(iter); // advance pointer + cmark_strbuf_put(&buf, tmp->as.literal.data, tmp->as.literal.len); + cur->end_column = tmp->end_column; + next = tmp->next; + cmark_node_free(tmp); + tmp = next; + } + cmark_chunk_free(iter->mem, &cur->as.literal); + cur->as.literal = cmark_chunk_buf_detach(&buf); + } + } + + cmark_strbuf_free(&buf); + cmark_iter_free(iter); +} + +void cmark_node_own(cmark_node *root) { + if (root == NULL) { + return; + } + cmark_iter *iter = cmark_iter_new(root); + cmark_event_type ev_type; + cmark_node *cur; + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (ev_type == CMARK_EVENT_ENTER) { + switch (cur->type) { + case CMARK_NODE_TEXT: + case CMARK_NODE_HTML_INLINE: + case CMARK_NODE_CODE: + case CMARK_NODE_HTML_BLOCK: + cmark_chunk_to_cstr(iter->mem, &cur->as.literal); + break; + case CMARK_NODE_LINK: + cmark_chunk_to_cstr(iter->mem, &cur->as.link.url); + cmark_chunk_to_cstr(iter->mem, &cur->as.link.title); + break; + case CMARK_NODE_CUSTOM_INLINE: + cmark_chunk_to_cstr(iter->mem, &cur->as.custom.on_enter); + cmark_chunk_to_cstr(iter->mem, &cur->as.custom.on_exit); + break; + } + } + } + + cmark_iter_free(iter); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/iterator.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/iterator.h new file mode 100644 index 000000000000..1155593df61e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/iterator.h @@ -0,0 +1,27 @@ +#ifndef CMARK_ITERATOR_H +#define CMARK_ITERATOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cmark-gfm.h" +#include "memory.h" + +typedef struct { + cmark_event_type ev_type; + cmark_node *node; +} cmark_iter_state; + +struct cmark_iter { + cmark_mem *mem; + cmark_node *root; + cmark_iter_state cur; + cmark_iter_state next; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/iterator.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/iterator.o new file mode 100644 index 000000000000..024ea0f648b0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/iterator.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/latex.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/latex.c new file mode 100644 index 000000000000..8be15b0d57f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/latex.c @@ -0,0 +1,466 @@ +#include +#include +#include +#include + +#include "config.h" +#include "cmark-gfm.h" +#include "node.h" +#include "buffer.h" +#include "utf8.h" +#include "scanners.h" +#include "render.h" +#include "syntax_extension.h" + +#define OUT(s, wrap, escaping) renderer->out(renderer, node, s, wrap, escaping) +#define LIT(s) renderer->out(renderer, node, s, false, LITERAL) +#define CR() renderer->cr(renderer) +#define BLANKLINE() renderer->blankline(renderer) +#define LIST_NUMBER_STRING_SIZE 20 + +static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_node *node, + cmark_escaping escape, + int32_t c, unsigned char nextc) { + if (escape == LITERAL) { + cmark_render_code_point(renderer, c); + return; + } + + switch (c) { + case 123: // '{' + case 125: // '}' + case 35: // '#' + case 37: // '%' + case 38: // '&' + cmark_render_ascii(renderer, "\\"); + cmark_render_code_point(renderer, c); + break; + case 36: // '$' + case 95: // '_' + if (escape == NORMAL) { + cmark_render_ascii(renderer, "\\"); + } + cmark_render_code_point(renderer, c); + break; + case 45: // '-' + if (nextc == 45) { // prevent ligature + cmark_render_ascii(renderer, "-{}"); + } else { + cmark_render_ascii(renderer, "-"); + } + break; + case 126: // '~' + if (escape == NORMAL) { + cmark_render_ascii(renderer, "\\textasciitilde{}"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 94: // '^' + cmark_render_ascii(renderer, "\\^{}"); + break; + case 92: // '\\' + if (escape == URL) { + // / acts as path sep even on windows: + cmark_render_ascii(renderer, "/"); + } else { + cmark_render_ascii(renderer, "\\textbackslash{}"); + } + break; + case 124: // '|' + cmark_render_ascii(renderer, "\\textbar{}"); + break; + case 60: // '<' + cmark_render_ascii(renderer, "\\textless{}"); + break; + case 62: // '>' + cmark_render_ascii(renderer, "\\textgreater{}"); + break; + case 91: // '[' + case 93: // ']' + cmark_render_ascii(renderer, "{"); + cmark_render_code_point(renderer, c); + cmark_render_ascii(renderer, "}"); + break; + case 34: // '"' + cmark_render_ascii(renderer, "\\textquotedbl{}"); + // requires \usepackage[T1]{fontenc} + break; + case 39: // '\'' + cmark_render_ascii(renderer, "\\textquotesingle{}"); + // requires \usepackage{textcomp} + break; + case 160: // nbsp + cmark_render_ascii(renderer, "~"); + break; + case 8230: // hellip + cmark_render_ascii(renderer, "\\ldots{}"); + break; + case 8216: // lsquo + if (escape == NORMAL) { + cmark_render_ascii(renderer, "`"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8217: // rsquo + if (escape == NORMAL) { + cmark_render_ascii(renderer, "\'"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8220: // ldquo + if (escape == NORMAL) { + cmark_render_ascii(renderer, "``"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8221: // rdquo + if (escape == NORMAL) { + cmark_render_ascii(renderer, "''"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8212: // emdash + if (escape == NORMAL) { + cmark_render_ascii(renderer, "---"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 8211: // endash + if (escape == NORMAL) { + cmark_render_ascii(renderer, "--"); + } else { + cmark_render_code_point(renderer, c); + } + break; + default: + cmark_render_code_point(renderer, c); + } +} + +typedef enum { + NO_LINK, + URL_AUTOLINK, + EMAIL_AUTOLINK, + NORMAL_LINK, + INTERNAL_LINK +} link_type; + +static link_type get_link_type(cmark_node *node) { + size_t title_len, url_len; + cmark_node *link_text; + char *realurl; + int realurllen; + bool isemail = false; + + if (node->type != CMARK_NODE_LINK) { + return NO_LINK; + } + + const char *url = cmark_node_get_url(node); + cmark_chunk url_chunk = cmark_chunk_literal(url); + + if (url && *url == '#') { + return INTERNAL_LINK; + } + + url_len = strlen(url); + if (url_len == 0 || scan_scheme(&url_chunk, 0) == 0) { + return NO_LINK; + } + + const char *title = cmark_node_get_title(node); + title_len = strlen(title); + // if it has a title, we can't treat it as an autolink: + if (title_len == 0) { + + link_text = node->first_child; + cmark_consolidate_text_nodes(link_text); + + if (!link_text) + return NO_LINK; + + realurl = (char *)url; + realurllen = (int)url_len; + if (strncmp(realurl, "mailto:", 7) == 0) { + realurl += 7; + realurllen -= 7; + isemail = true; + } + if (realurllen == link_text->as.literal.len && + strncmp(realurl, (char *)link_text->as.literal.data, + link_text->as.literal.len) == 0) { + if (isemail) { + return EMAIL_AUTOLINK; + } else { + return URL_AUTOLINK; + } + } + } + + return NORMAL_LINK; +} + +static int S_get_enumlevel(cmark_node *node) { + int enumlevel = 0; + cmark_node *tmp = node; + while (tmp) { + if (tmp->type == CMARK_NODE_LIST && + cmark_node_get_list_type(node) == CMARK_ORDERED_LIST) { + enumlevel++; + } + tmp = tmp->parent; + } + return enumlevel; +} + +static int S_render_node(cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + int list_number; + int enumlevel; + char list_number_string[LIST_NUMBER_STRING_SIZE]; + bool entering = (ev_type == CMARK_EVENT_ENTER); + cmark_list_type list_type; + bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options); + + if (node->extension && node->extension->latex_render_func) { + node->extension->latex_render_func(node->extension, renderer, node, ev_type, options); + return 1; + } + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + break; + + case CMARK_NODE_BLOCK_QUOTE: + if (entering) { + LIT("\\begin{quote}"); + CR(); + } else { + LIT("\\end{quote}"); + BLANKLINE(); + } + break; + + case CMARK_NODE_LIST: + list_type = cmark_node_get_list_type(node); + if (entering) { + LIT("\\begin{"); + LIT(list_type == CMARK_ORDERED_LIST ? "enumerate" : "itemize"); + LIT("}"); + CR(); + list_number = cmark_node_get_list_start(node); + if (list_number > 1) { + enumlevel = S_get_enumlevel(node); + // latex normally supports only five levels + if (enumlevel >= 1 && enumlevel <= 5) { + snprintf(list_number_string, LIST_NUMBER_STRING_SIZE, "%d", + list_number); + LIT("\\setcounter{enum"); + switch (enumlevel) { + case 1: LIT("i"); break; + case 2: LIT("ii"); break; + case 3: LIT("iii"); break; + case 4: LIT("iv"); break; + case 5: LIT("v"); break; + default: LIT("i"); break; + } + LIT("}{"); + OUT(list_number_string, false, NORMAL); + LIT("}"); + } + CR(); + } + } else { + LIT("\\end{"); + LIT(list_type == CMARK_ORDERED_LIST ? "enumerate" : "itemize"); + LIT("}"); + BLANKLINE(); + } + break; + + case CMARK_NODE_ITEM: + if (entering) { + LIT("\\item "); + } else { + CR(); + } + break; + + case CMARK_NODE_HEADING: + if (entering) { + switch (cmark_node_get_heading_level(node)) { + case 1: + LIT("\\section"); + break; + case 2: + LIT("\\subsection"); + break; + case 3: + LIT("\\subsubsection"); + break; + case 4: + LIT("\\paragraph"); + break; + case 5: + LIT("\\subparagraph"); + break; + } + LIT("{"); + } else { + LIT("}"); + BLANKLINE(); + } + break; + + case CMARK_NODE_CODE_BLOCK: + CR(); + LIT("\\begin{verbatim}"); + CR(); + OUT(cmark_node_get_literal(node), false, LITERAL); + CR(); + LIT("\\end{verbatim}"); + BLANKLINE(); + break; + + case CMARK_NODE_HTML_BLOCK: + break; + + case CMARK_NODE_CUSTOM_BLOCK: + CR(); + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + CR(); + break; + + case CMARK_NODE_THEMATIC_BREAK: + BLANKLINE(); + LIT("\\begin{center}\\rule{0.5\\linewidth}{\\linethickness}\\end{center}"); + BLANKLINE(); + break; + + case CMARK_NODE_PARAGRAPH: + if (!entering) { + BLANKLINE(); + } + break; + + case CMARK_NODE_TEXT: + OUT(cmark_node_get_literal(node), allow_wrap, NORMAL); + break; + + case CMARK_NODE_LINEBREAK: + LIT("\\\\"); + CR(); + break; + + case CMARK_NODE_SOFTBREAK: + if (options & CMARK_OPT_HARDBREAKS) { + LIT("\\\\"); + CR(); + } else if (renderer->width == 0 && !(CMARK_OPT_NOBREAKS & options)) { + CR(); + } else { + OUT(" ", allow_wrap, NORMAL); + } + break; + + case CMARK_NODE_CODE: + LIT("\\texttt{"); + OUT(cmark_node_get_literal(node), false, NORMAL); + LIT("}"); + break; + + case CMARK_NODE_HTML_INLINE: + break; + + case CMARK_NODE_CUSTOM_INLINE: + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + break; + + case CMARK_NODE_STRONG: + if (entering) { + LIT("\\textbf{"); + } else { + LIT("}"); + } + break; + + case CMARK_NODE_EMPH: + if (entering) { + LIT("\\emph{"); + } else { + LIT("}"); + } + break; + + case CMARK_NODE_LINK: + if (entering) { + const char *url = cmark_node_get_url(node); + // requires \usepackage{hyperref} + switch (get_link_type(node)) { + case URL_AUTOLINK: + LIT("\\url{"); + OUT(url, false, URL); + LIT("}"); + return 0; // Don't process further nodes to avoid double-rendering artefacts + case EMAIL_AUTOLINK: + LIT("\\href{"); + OUT(url, false, URL); + LIT("}\\nolinkurl{"); + break; + case NORMAL_LINK: + LIT("\\href{"); + OUT(url, false, URL); + LIT("}{"); + break; + case INTERNAL_LINK: + LIT("\\protect\\hyperlink{"); + OUT(url + 1, false, URL); + LIT("}{"); + break; + case NO_LINK: + LIT("{"); // error? + } + } else { + LIT("}"); + } + + break; + + case CMARK_NODE_IMAGE: + if (entering) { + LIT("\\protect\\includegraphics{"); + // requires \include{graphicx} + OUT(cmark_node_get_url(node), false, URL); + LIT("}"); + return 0; + } + break; + + case CMARK_NODE_FOOTNOTE_DEFINITION: + case CMARK_NODE_FOOTNOTE_REFERENCE: + // TODO + break; + + default: + assert(false); + break; + } + + return 1; +} + +char *cmark_render_latex(cmark_node *root, int options, int width) { + return cmark_render_latex_with_mem(root, options, width, cmark_node_mem(root)); +} + +char *cmark_render_latex_with_mem(cmark_node *root, int options, int width, cmark_mem *mem) { + return cmark_render(mem, root, options, width, outc, S_render_node); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/latex.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/latex.o new file mode 100644 index 000000000000..1f0dac6985b7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/latex.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/linked_list.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/linked_list.c new file mode 100644 index 000000000000..8c26dc55753f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/linked_list.c @@ -0,0 +1,37 @@ +#include + +#include "cmark-gfm.h" + +cmark_llist *cmark_llist_append(cmark_mem *mem, cmark_llist *head, void *data) { + cmark_llist *tmp; + cmark_llist *new_node = (cmark_llist *) mem->calloc(1, sizeof(cmark_llist)); + + new_node->data = data; + new_node->next = NULL; + + if (!head) + return new_node; + + for (tmp = head; tmp->next; tmp=tmp->next); + + tmp->next = new_node; + + return head; +} + +void cmark_llist_free_full(cmark_mem *mem, cmark_llist *head, cmark_free_func free_func) { + cmark_llist *tmp, *prev; + + for (tmp = head; tmp;) { + if (free_func) + free_func(mem, tmp->data); + + prev = tmp; + tmp = tmp->next; + mem->free(prev); + } +} + +void cmark_llist_free(cmark_mem *mem, cmark_llist *head) { + cmark_llist_free_full(mem, head, NULL); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/linked_list.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/linked_list.o new file mode 100644 index 000000000000..fd6a97b535c4 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/linked_list.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/man.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/man.c new file mode 100644 index 000000000000..441a96e4936a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/man.c @@ -0,0 +1,278 @@ +#include +#include +#include +#include + +#include "config.h" +#include "cmark-gfm.h" +#include "node.h" +#include "buffer.h" +#include "utf8.h" +#include "render.h" +#include "syntax_extension.h" + +#define OUT(s, wrap, escaping) renderer->out(renderer, node, s, wrap, escaping) +#define LIT(s) renderer->out(renderer, node, s, false, LITERAL) +#define CR() renderer->cr(renderer) +#define BLANKLINE() renderer->blankline(renderer) +#define LIST_NUMBER_SIZE 20 + +// Functions to convert cmark_nodes to groff man strings. +static void S_outc(cmark_renderer *renderer, cmark_node *node, + cmark_escaping escape, int32_t c, + unsigned char nextc) { + (void)(nextc); + + if (escape == LITERAL) { + cmark_render_code_point(renderer, c); + return; + } + + switch (c) { + case 46: + if (renderer->begin_line) { + cmark_render_ascii(renderer, "\\&."); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 39: + if (renderer->begin_line) { + cmark_render_ascii(renderer, "\\&'"); + } else { + cmark_render_code_point(renderer, c); + } + break; + case 45: + cmark_render_ascii(renderer, "\\-"); + break; + case 92: + cmark_render_ascii(renderer, "\\e"); + break; + case 8216: // left single quote + cmark_render_ascii(renderer, "\\[oq]"); + break; + case 8217: // right single quote + cmark_render_ascii(renderer, "\\[cq]"); + break; + case 8220: // left double quote + cmark_render_ascii(renderer, "\\[lq]"); + break; + case 8221: // right double quote + cmark_render_ascii(renderer, "\\[rq]"); + break; + case 8212: // em dash + cmark_render_ascii(renderer, "\\[em]"); + break; + case 8211: // en dash + cmark_render_ascii(renderer, "\\[en]"); + break; + default: + cmark_render_code_point(renderer, c); + } +} + +static int S_render_node(cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + cmark_node *tmp; + int list_number; + bool entering = (ev_type == CMARK_EVENT_ENTER); + bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options); + + if (node->extension && node->extension->man_render_func) { + node->extension->man_render_func(node->extension, renderer, node, ev_type, options); + return 1; + } + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + if (entering) { + /* Define a strikethrough macro */ + /* Commenting out because this makes tests fail + LIT(".de ST"); + CR(); + LIT(".nr ww \\w'\\\\$1'"); + CR(); + LIT("\\Z@\\v'-.25m'\\l'\\\\n[ww]u'@\\\\$1"); + CR(); + LIT(".."); + CR(); + */ + } + break; + + case CMARK_NODE_BLOCK_QUOTE: + if (entering) { + CR(); + LIT(".RS"); + CR(); + } else { + CR(); + LIT(".RE"); + CR(); + } + break; + + case CMARK_NODE_LIST: + break; + + case CMARK_NODE_ITEM: + if (entering) { + CR(); + LIT(".IP "); + if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) { + LIT("\\[bu] 2"); + } else { + list_number = cmark_node_get_list_start(node->parent); + tmp = node; + while (tmp->prev) { + tmp = tmp->prev; + list_number += 1; + } + char list_number_s[LIST_NUMBER_SIZE]; + snprintf(list_number_s, LIST_NUMBER_SIZE, "\"%d.\" 4", list_number); + LIT(list_number_s); + } + CR(); + } else { + CR(); + } + break; + + case CMARK_NODE_HEADING: + if (entering) { + CR(); + LIT(cmark_node_get_heading_level(node) == 1 ? ".SH" : ".SS"); + CR(); + } else { + CR(); + } + break; + + case CMARK_NODE_CODE_BLOCK: + CR(); + LIT(".IP\n.nf\n\\f[C]\n"); + OUT(cmark_node_get_literal(node), false, NORMAL); + CR(); + LIT("\\f[]\n.fi"); + CR(); + break; + + case CMARK_NODE_HTML_BLOCK: + break; + + case CMARK_NODE_CUSTOM_BLOCK: + CR(); + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + CR(); + break; + + case CMARK_NODE_THEMATIC_BREAK: + CR(); + LIT(".PP\n * * * * *"); + CR(); + break; + + case CMARK_NODE_PARAGRAPH: + if (entering) { + // no blank line if first paragraph in list: + if (node->parent && node->parent->type == CMARK_NODE_ITEM && + node->prev == NULL) { + // no blank line or .PP + } else { + CR(); + LIT(".PP"); + CR(); + } + } else { + CR(); + } + break; + + case CMARK_NODE_TEXT: + OUT(cmark_node_get_literal(node), allow_wrap, NORMAL); + break; + + case CMARK_NODE_LINEBREAK: + LIT(".PD 0\n.P\n.PD"); + CR(); + break; + + case CMARK_NODE_SOFTBREAK: + if (options & CMARK_OPT_HARDBREAKS) { + LIT(".PD 0\n.P\n.PD"); + CR(); + } else if (renderer->width == 0 && !(CMARK_OPT_NOBREAKS & options)) { + CR(); + } else { + OUT(" ", allow_wrap, LITERAL); + } + break; + + case CMARK_NODE_CODE: + LIT("\\f[C]"); + OUT(cmark_node_get_literal(node), allow_wrap, NORMAL); + LIT("\\f[]"); + break; + + case CMARK_NODE_HTML_INLINE: + break; + + case CMARK_NODE_CUSTOM_INLINE: + OUT(entering ? cmark_node_get_on_enter(node) : cmark_node_get_on_exit(node), + false, LITERAL); + break; + + case CMARK_NODE_STRONG: + if (entering) { + LIT("\\f[B]"); + } else { + LIT("\\f[]"); + } + break; + + case CMARK_NODE_EMPH: + if (entering) { + LIT("\\f[I]"); + } else { + LIT("\\f[]"); + } + break; + + case CMARK_NODE_LINK: + if (!entering) { + LIT(" ("); + OUT(cmark_node_get_url(node), allow_wrap, URL); + LIT(")"); + } + break; + + case CMARK_NODE_IMAGE: + if (entering) { + LIT("[IMAGE: "); + } else { + LIT("]"); + } + break; + + case CMARK_NODE_FOOTNOTE_DEFINITION: + case CMARK_NODE_FOOTNOTE_REFERENCE: + // TODO + break; + + default: + assert(false); + break; + } + + return 1; +} + +char *cmark_render_man(cmark_node *root, int options, int width) { + return cmark_render_man_with_mem(root, options, width, cmark_node_mem(root)); +} + +char *cmark_render_man_with_mem(cmark_node *root, int options, int width, cmark_mem *mem) { + return cmark_render(mem, root, options, width, S_outc, S_render_node); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/man.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/man.o new file mode 100644 index 000000000000..82121dc5c3ee Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/man.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/map.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/map.c new file mode 100644 index 000000000000..9a418dfd4694 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/map.c @@ -0,0 +1,122 @@ +#include "map.h" +#include "utf8.h" +#include "parser.h" + +// normalize map label: collapse internal whitespace to single space, +// remove leading/trailing whitespace, case fold +// Return NULL if the label is actually empty (i.e. composed solely from +// whitespace) +unsigned char *normalize_map_label(cmark_mem *mem, cmark_chunk *ref) { + cmark_strbuf normalized = CMARK_BUF_INIT(mem); + unsigned char *result; + + if (ref == NULL) + return NULL; + + if (ref->len == 0) + return NULL; + + cmark_utf8proc_case_fold(&normalized, ref->data, ref->len); + cmark_strbuf_trim(&normalized); + cmark_strbuf_normalize_whitespace(&normalized); + + result = cmark_strbuf_detach(&normalized); + assert(result); + + if (result[0] == '\0') { + mem->free(result); + return NULL; + } + + return result; +} + +static int +labelcmp(const unsigned char *a, const unsigned char *b) { + return strcmp((const char *)a, (const char *)b); +} + +static int +refcmp(const void *p1, const void *p2) { + cmark_map_entry *r1 = *(cmark_map_entry **)p1; + cmark_map_entry *r2 = *(cmark_map_entry **)p2; + int res = labelcmp(r1->label, r2->label); + return res ? res : ((int)r1->age - (int)r2->age); +} + +static int +refsearch(const void *label, const void *p2) { + cmark_map_entry *ref = *(cmark_map_entry **)p2; + return labelcmp((const unsigned char *)label, ref->label); +} + +static void sort_map(cmark_map *map) { + unsigned int i = 0, last = 0, size = map->size; + cmark_map_entry *r = map->refs, **sorted = NULL; + + sorted = (cmark_map_entry **)map->mem->calloc(size, sizeof(cmark_map_entry *)); + while (r) { + sorted[i++] = r; + r = r->next; + } + + qsort(sorted, size, sizeof(cmark_map_entry *), refcmp); + + for (i = 1; i < size; i++) { + if (labelcmp(sorted[i]->label, sorted[last]->label) != 0) + sorted[++last] = sorted[i]; + } + + map->sorted = sorted; + map->size = last + 1; +} + +cmark_map_entry *cmark_map_lookup(cmark_map *map, cmark_chunk *label) { + cmark_map_entry **ref = NULL; + unsigned char *norm; + + if (label->len < 1 || label->len > MAX_LINK_LABEL_LENGTH) + return NULL; + + if (map == NULL || !map->size) + return NULL; + + norm = normalize_map_label(map->mem, label); + if (norm == NULL) + return NULL; + + if (!map->sorted) + sort_map(map); + + ref = (cmark_map_entry **)bsearch(norm, map->sorted, map->size, sizeof(cmark_map_entry *), refsearch); + map->mem->free(norm); + + if (!ref) + return NULL; + + return ref[0]; +} + +void cmark_map_free(cmark_map *map) { + cmark_map_entry *ref; + + if (map == NULL) + return; + + ref = map->refs; + while (ref) { + cmark_map_entry *next = ref->next; + map->free(map, ref); + ref = next; + } + + map->mem->free(map->sorted); + map->mem->free(map); +} + +cmark_map *cmark_map_new(cmark_mem *mem, cmark_map_free_f free) { + cmark_map *map = (cmark_map *)mem->calloc(1, sizeof(cmark_map)); + map->mem = mem; + map->free = free; + return map; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/map.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/map.h new file mode 100644 index 000000000000..00307be66906 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/map.h @@ -0,0 +1,42 @@ +#ifndef CMARK_MAP_H +#define CMARK_MAP_H + +#include "memory.h" +#include "chunk.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct cmark_map_entry { + struct cmark_map_entry *next; + unsigned char *label; + unsigned int age; +}; + +typedef struct cmark_map_entry cmark_map_entry; + +struct cmark_map; + +typedef void (*cmark_map_free_f)(struct cmark_map *, cmark_map_entry *); + +struct cmark_map { + cmark_mem *mem; + cmark_map_entry *refs; + cmark_map_entry **sorted; + unsigned int size; + cmark_map_free_f free; +}; + +typedef struct cmark_map cmark_map; + +unsigned char *normalize_map_label(cmark_mem *mem, cmark_chunk *ref); +cmark_map *cmark_map_new(cmark_mem *mem, cmark_map_free_f free); +void cmark_map_free(cmark_map *map); +cmark_map_entry *cmark_map_lookup(cmark_map *map, cmark_chunk *label); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/map.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/map.o new file mode 100644 index 000000000000..7db4efcf2991 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/map.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/node.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/node.c new file mode 100644 index 000000000000..3f94834cf8b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/node.c @@ -0,0 +1,965 @@ +#include +#include + +#include "config.h" +#include "node.h" +#include "syntax_extension.h" + +static void S_node_unlink(cmark_node *node); + +#define NODE_MEM(node) cmark_node_mem(node) + +bool cmark_node_can_contain_type(cmark_node *node, cmark_node_type child_type) { + if (child_type == CMARK_NODE_DOCUMENT) { + return false; + } + + if (node->extension && node->extension->can_contain_func) { + return node->extension->can_contain_func(node->extension, node, child_type) != 0; + } + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + case CMARK_NODE_BLOCK_QUOTE: + case CMARK_NODE_FOOTNOTE_DEFINITION: + case CMARK_NODE_ITEM: + return CMARK_NODE_TYPE_BLOCK_P(child_type) && child_type != CMARK_NODE_ITEM; + + case CMARK_NODE_LIST: + return child_type == CMARK_NODE_ITEM; + + case CMARK_NODE_CUSTOM_BLOCK: + return true; + + case CMARK_NODE_PARAGRAPH: + case CMARK_NODE_HEADING: + case CMARK_NODE_EMPH: + case CMARK_NODE_STRONG: + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + case CMARK_NODE_CUSTOM_INLINE: + return CMARK_NODE_TYPE_INLINE_P(child_type); + + default: + break; + } + + return false; +} + +static bool S_can_contain(cmark_node *node, cmark_node *child) { + cmark_node *cur; + + if (node == NULL || child == NULL) { + return false; + } + if (NODE_MEM(node) != NODE_MEM(child)) { + return 0; + } + + // Verify that child is not an ancestor of node or equal to node. + cur = node; + do { + if (cur == child) { + return false; + } + cur = cur->parent; + } while (cur != NULL); + + return cmark_node_can_contain_type(node, (cmark_node_type) child->type); +} + +cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) { + cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node)); + cmark_strbuf_init(mem, &node->content, 0); + node->type = (uint16_t)type; + + switch (node->type) { + case CMARK_NODE_HEADING: + node->as.heading.level = 1; + break; + + case CMARK_NODE_LIST: { + cmark_list *list = &node->as.list; + list->list_type = CMARK_BULLET_LIST; + list->start = 0; + list->tight = false; + break; + } + + default: + break; + } + + return node; +} + +cmark_node *cmark_node_new(cmark_node_type type) { + extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR; + return cmark_node_new_with_mem(type, &CMARK_DEFAULT_MEM_ALLOCATOR); +} + +static void free_node_as(cmark_node *node) { + switch (node->type) { + case CMARK_NODE_CODE_BLOCK: + cmark_chunk_free(NODE_MEM(node), &node->as.code.info); + cmark_chunk_free(NODE_MEM(node), &node->as.code.literal); + break; + case CMARK_NODE_TEXT: + case CMARK_NODE_HTML_INLINE: + case CMARK_NODE_CODE: + case CMARK_NODE_HTML_BLOCK: + case CMARK_NODE_FOOTNOTE_REFERENCE: + case CMARK_NODE_FOOTNOTE_DEFINITION: + cmark_chunk_free(NODE_MEM(node), &node->as.literal); + break; + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + cmark_chunk_free(NODE_MEM(node), &node->as.link.url); + cmark_chunk_free(NODE_MEM(node), &node->as.link.title); + break; + case CMARK_NODE_CUSTOM_BLOCK: + case CMARK_NODE_CUSTOM_INLINE: + cmark_chunk_free(NODE_MEM(node), &node->as.custom.on_enter); + cmark_chunk_free(NODE_MEM(node), &node->as.custom.on_exit); + break; + default: + break; + } +} + +// Free a cmark_node list and any children. +static void S_free_nodes(cmark_node *e) { + cmark_node *next; + while (e != NULL) { + cmark_strbuf_free(&e->content); + + if (e->user_data && e->user_data_free_func) + e->user_data_free_func(NODE_MEM(e), e->user_data); + + if (e->as.opaque && e->extension && e->extension->opaque_free_func) + e->extension->opaque_free_func(e->extension, NODE_MEM(e), e); + + free_node_as(e); + + if (e->last_child) { + // Splice children into list + e->last_child->next = e->next; + e->next = e->first_child; + } + next = e->next; + NODE_MEM(e)->free(e); + e = next; + } +} + +void cmark_node_free(cmark_node *node) { + S_node_unlink(node); + node->next = NULL; + S_free_nodes(node); +} + +cmark_node_type cmark_node_get_type(cmark_node *node) { + if (node == NULL) { + return CMARK_NODE_NONE; + } else { + return (cmark_node_type)node->type; + } +} + +int cmark_node_set_type(cmark_node * node, cmark_node_type type) { + cmark_node_type initial_type; + + if (type == node->type) + return 1; + + initial_type = (cmark_node_type) node->type; + node->type = (uint16_t)type; + + if (!S_can_contain(node->parent, node)) { + node->type = (uint16_t)initial_type; + return 0; + } + + /* We rollback the type to free the union members appropriately */ + node->type = (uint16_t)initial_type; + free_node_as(node); + + node->type = (uint16_t)type; + + return 1; +} + +const char *cmark_node_get_type_string(cmark_node *node) { + if (node == NULL) { + return "NONE"; + } + + if (node->extension && node->extension->get_type_string_func) { + return node->extension->get_type_string_func(node->extension, node); + } + + switch (node->type) { + case CMARK_NODE_NONE: + return "none"; + case CMARK_NODE_DOCUMENT: + return "document"; + case CMARK_NODE_BLOCK_QUOTE: + return "block_quote"; + case CMARK_NODE_LIST: + return "list"; + case CMARK_NODE_ITEM: + return "item"; + case CMARK_NODE_CODE_BLOCK: + return "code_block"; + case CMARK_NODE_HTML_BLOCK: + return "html_block"; + case CMARK_NODE_CUSTOM_BLOCK: + return "custom_block"; + case CMARK_NODE_PARAGRAPH: + return "paragraph"; + case CMARK_NODE_HEADING: + return "heading"; + case CMARK_NODE_THEMATIC_BREAK: + return "thematic_break"; + case CMARK_NODE_TEXT: + return "text"; + case CMARK_NODE_SOFTBREAK: + return "softbreak"; + case CMARK_NODE_LINEBREAK: + return "linebreak"; + case CMARK_NODE_CODE: + return "code"; + case CMARK_NODE_HTML_INLINE: + return "html_inline"; + case CMARK_NODE_CUSTOM_INLINE: + return "custom_inline"; + case CMARK_NODE_EMPH: + return "emph"; + case CMARK_NODE_STRONG: + return "strong"; + case CMARK_NODE_LINK: + return "link"; + case CMARK_NODE_IMAGE: + return "image"; + } + + return ""; +} + +cmark_node *cmark_node_next(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->next; + } +} + +cmark_node *cmark_node_previous(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->prev; + } +} + +cmark_node *cmark_node_parent(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->parent; + } +} + +cmark_node *cmark_node_first_child(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->first_child; + } +} + +cmark_node *cmark_node_last_child(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->last_child; + } +} + +void *cmark_node_get_user_data(cmark_node *node) { + if (node == NULL) { + return NULL; + } else { + return node->user_data; + } +} + +int cmark_node_set_user_data(cmark_node *node, void *user_data) { + if (node == NULL) { + return 0; + } + node->user_data = user_data; + return 1; +} + +int cmark_node_set_user_data_free_func(cmark_node *node, + cmark_free_func free_func) { + if (node == NULL) { + return 0; + } + node->user_data_free_func = free_func; + return 1; +} + +const char *cmark_node_get_literal(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_HTML_BLOCK: + case CMARK_NODE_TEXT: + case CMARK_NODE_HTML_INLINE: + case CMARK_NODE_CODE: + case CMARK_NODE_FOOTNOTE_REFERENCE: + return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.literal); + + case CMARK_NODE_CODE_BLOCK: + return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.literal); + + default: + break; + } + + return NULL; +} + +int cmark_node_set_literal(cmark_node *node, const char *content) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_HTML_BLOCK: + case CMARK_NODE_TEXT: + case CMARK_NODE_HTML_INLINE: + case CMARK_NODE_CODE: + case CMARK_NODE_FOOTNOTE_REFERENCE: + cmark_chunk_set_cstr(NODE_MEM(node), &node->as.literal, content); + return 1; + + case CMARK_NODE_CODE_BLOCK: + cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.literal, content); + return 1; + + default: + break; + } + + return 0; +} + +const char *cmark_node_get_string_content(cmark_node *node) { + return (char *) node->content.ptr; +} + +int cmark_node_set_string_content(cmark_node *node, const char *content) { + cmark_strbuf_sets(&node->content, content); + return true; +} + +int cmark_node_get_heading_level(cmark_node *node) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_HEADING: + return node->as.heading.level; + + default: + break; + } + + return 0; +} + +int cmark_node_set_heading_level(cmark_node *node, int level) { + if (node == NULL || level < 1 || level > 6) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_HEADING: + node->as.heading.level = level; + return 1; + + default: + break; + } + + return 0; +} + +cmark_list_type cmark_node_get_list_type(cmark_node *node) { + if (node == NULL) { + return CMARK_NO_LIST; + } + + if (node->type == CMARK_NODE_LIST) { + return node->as.list.list_type; + } else { + return CMARK_NO_LIST; + } +} + +int cmark_node_set_list_type(cmark_node *node, cmark_list_type type) { + if (!(type == CMARK_BULLET_LIST || type == CMARK_ORDERED_LIST)) { + return 0; + } + + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + node->as.list.list_type = type; + return 1; + } else { + return 0; + } +} + +cmark_delim_type cmark_node_get_list_delim(cmark_node *node) { + if (node == NULL) { + return CMARK_NO_DELIM; + } + + if (node->type == CMARK_NODE_LIST) { + return node->as.list.delimiter; + } else { + return CMARK_NO_DELIM; + } +} + +int cmark_node_set_list_delim(cmark_node *node, cmark_delim_type delim) { + if (!(delim == CMARK_PERIOD_DELIM || delim == CMARK_PAREN_DELIM)) { + return 0; + } + + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + node->as.list.delimiter = delim; + return 1; + } else { + return 0; + } +} + +int cmark_node_get_list_start(cmark_node *node) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + return node->as.list.start; + } else { + return 0; + } +} + +int cmark_node_set_list_start(cmark_node *node, int start) { + if (node == NULL || start < 0) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + node->as.list.start = start; + return 1; + } else { + return 0; + } +} + +int cmark_node_get_list_tight(cmark_node *node) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + return node->as.list.tight; + } else { + return 0; + } +} + +int cmark_node_set_list_tight(cmark_node *node, int tight) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_LIST) { + node->as.list.tight = tight == 1; + return 1; + } else { + return 0; + } +} + +const char *cmark_node_get_fence_info(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + if (node->type == CMARK_NODE_CODE_BLOCK) { + return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.info); + } else { + return NULL; + } +} + +int cmark_node_set_fence_info(cmark_node *node, const char *info) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_CODE_BLOCK) { + cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.info, info); + return 1; + } else { + return 0; + } +} + +int cmark_node_get_fenced(cmark_node *node, int *length, int *offset, char *character) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_CODE_BLOCK) { + *length = node->as.code.fence_length; + *offset = node->as.code.fence_offset; + *character = node->as.code.fence_char; + return node->as.code.fenced; + } else { + return 0; + } +} + +int cmark_node_set_fenced(cmark_node * node, int fenced, + int length, int offset, char character) { + if (node == NULL) { + return 0; + } + + if (node->type == CMARK_NODE_CODE_BLOCK) { + node->as.code.fenced = (int8_t)fenced; + node->as.code.fence_length = (uint8_t)length; + node->as.code.fence_offset = (uint8_t)offset; + node->as.code.fence_char = character; + return 1; + } else { + return 0; + } +} + +const char *cmark_node_get_url(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.url); + default: + break; + } + + return NULL; +} + +int cmark_node_set_url(cmark_node *node, const char *url) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.url, url); + return 1; + default: + break; + } + + return 0; +} + +const char *cmark_node_get_title(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.title); + default: + break; + } + + return NULL; +} + +int cmark_node_set_title(cmark_node *node, const char *title) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.title, title); + return 1; + default: + break; + } + + return 0; +} + +const char *cmark_node_get_on_enter(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_CUSTOM_INLINE: + case CMARK_NODE_CUSTOM_BLOCK: + return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_enter); + default: + break; + } + + return NULL; +} + +int cmark_node_set_on_enter(cmark_node *node, const char *on_enter) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_CUSTOM_INLINE: + case CMARK_NODE_CUSTOM_BLOCK: + cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_enter, on_enter); + return 1; + default: + break; + } + + return 0; +} + +const char *cmark_node_get_on_exit(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + switch (node->type) { + case CMARK_NODE_CUSTOM_INLINE: + case CMARK_NODE_CUSTOM_BLOCK: + return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_exit); + default: + break; + } + + return NULL; +} + +int cmark_node_set_on_exit(cmark_node *node, const char *on_exit) { + if (node == NULL) { + return 0; + } + + switch (node->type) { + case CMARK_NODE_CUSTOM_INLINE: + case CMARK_NODE_CUSTOM_BLOCK: + cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_exit, on_exit); + return 1; + default: + break; + } + + return 0; +} + +cmark_syntax_extension *cmark_node_get_syntax_extension(cmark_node *node) { + if (node == NULL) { + return NULL; + } + + return node->extension; +} + +int cmark_node_set_syntax_extension(cmark_node *node, cmark_syntax_extension *extension) { + if (node == NULL) { + return 0; + } + + node->extension = extension; + return 1; +} + +int cmark_node_get_start_line(cmark_node *node) { + if (node == NULL) { + return 0; + } + return node->start_line; +} + +int cmark_node_get_start_column(cmark_node *node) { + if (node == NULL) { + return 0; + } + return node->start_column; +} + +int cmark_node_get_end_line(cmark_node *node) { + if (node == NULL) { + return 0; + } + return node->end_line; +} + +int cmark_node_get_end_column(cmark_node *node) { + if (node == NULL) { + return 0; + } + return node->end_column; +} + +// Unlink a node without adjusting its next, prev, and parent pointers. +static void S_node_unlink(cmark_node *node) { + if (node == NULL) { + return; + } + + if (node->prev) { + node->prev->next = node->next; + } + if (node->next) { + node->next->prev = node->prev; + } + + // Adjust first_child and last_child of parent. + cmark_node *parent = node->parent; + if (parent) { + if (parent->first_child == node) { + parent->first_child = node->next; + } + if (parent->last_child == node) { + parent->last_child = node->prev; + } + } +} + +void cmark_node_unlink(cmark_node *node) { + S_node_unlink(node); + + node->next = NULL; + node->prev = NULL; + node->parent = NULL; +} + +int cmark_node_insert_before(cmark_node *node, cmark_node *sibling) { + if (node == NULL || sibling == NULL) { + return 0; + } + + if (!node->parent || !S_can_contain(node->parent, sibling)) { + return 0; + } + + S_node_unlink(sibling); + + cmark_node *old_prev = node->prev; + + // Insert 'sibling' between 'old_prev' and 'node'. + if (old_prev) { + old_prev->next = sibling; + } + sibling->prev = old_prev; + sibling->next = node; + node->prev = sibling; + + // Set new parent. + cmark_node *parent = node->parent; + sibling->parent = parent; + + // Adjust first_child of parent if inserted as first child. + if (parent && !old_prev) { + parent->first_child = sibling; + } + + return 1; +} + +int cmark_node_insert_after(cmark_node *node, cmark_node *sibling) { + if (node == NULL || sibling == NULL) { + return 0; + } + + if (!node->parent || !S_can_contain(node->parent, sibling)) { + return 0; + } + + S_node_unlink(sibling); + + cmark_node *old_next = node->next; + + // Insert 'sibling' between 'node' and 'old_next'. + if (old_next) { + old_next->prev = sibling; + } + sibling->next = old_next; + sibling->prev = node; + node->next = sibling; + + // Set new parent. + cmark_node *parent = node->parent; + sibling->parent = parent; + + // Adjust last_child of parent if inserted as last child. + if (parent && !old_next) { + parent->last_child = sibling; + } + + return 1; +} + +int cmark_node_replace(cmark_node *oldnode, cmark_node *newnode) { + if (!cmark_node_insert_before(oldnode, newnode)) { + return 0; + } + cmark_node_unlink(oldnode); + return 1; +} + +int cmark_node_prepend_child(cmark_node *node, cmark_node *child) { + if (!S_can_contain(node, child)) { + return 0; + } + + S_node_unlink(child); + + cmark_node *old_first_child = node->first_child; + + child->next = old_first_child; + child->prev = NULL; + child->parent = node; + node->first_child = child; + + if (old_first_child) { + old_first_child->prev = child; + } else { + // Also set last_child if node previously had no children. + node->last_child = child; + } + + return 1; +} + +int cmark_node_append_child(cmark_node *node, cmark_node *child) { + if (!S_can_contain(node, child)) { + return 0; + } + + S_node_unlink(child); + + cmark_node *old_last_child = node->last_child; + + child->next = NULL; + child->prev = old_last_child; + child->parent = node; + node->last_child = child; + + if (old_last_child) { + old_last_child->next = child; + } else { + // Also set first_child if node previously had no children. + node->first_child = child; + } + + return 1; +} + +static void S_print_error(FILE *out, cmark_node *node, const char *elem) { + if (out == NULL) { + return; + } + fprintf(out, "Invalid '%s' in node type %s at %d:%d\n", elem, + cmark_node_get_type_string(node), node->start_line, + node->start_column); +} + +int cmark_node_check(cmark_node *node, FILE *out) { + cmark_node *cur; + int errors = 0; + + if (!node) { + return 0; + } + + cur = node; + for (;;) { + if (cur->first_child) { + if (cur->first_child->prev != NULL) { + S_print_error(out, cur->first_child, "prev"); + cur->first_child->prev = NULL; + ++errors; + } + if (cur->first_child->parent != cur) { + S_print_error(out, cur->first_child, "parent"); + cur->first_child->parent = cur; + ++errors; + } + cur = cur->first_child; + continue; + } + + next_sibling: + if (cur == node) { + break; + } + if (cur->next) { + if (cur->next->prev != cur) { + S_print_error(out, cur->next, "prev"); + cur->next->prev = cur; + ++errors; + } + if (cur->next->parent != cur->parent) { + S_print_error(out, cur->next, "parent"); + cur->next->parent = cur->parent; + ++errors; + } + cur = cur->next; + continue; + } + + if (cur->parent->last_child != cur) { + S_print_error(out, cur->parent, "last_child"); + cur->parent->last_child = cur; + ++errors; + } + cur = cur->parent; + goto next_sibling; + } + + return errors; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/node.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/node.h new file mode 100644 index 000000000000..0a392555b53b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/node.h @@ -0,0 +1,116 @@ +#ifndef CMARK_NODE_H +#define CMARK_NODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#include "cmark-gfm.h" +#include "cmark-gfm-extension_api.h" +#include "buffer.h" +#include "chunk.h" + +typedef struct { + cmark_list_type list_type; + int marker_offset; + int padding; + int start; + cmark_delim_type delimiter; + unsigned char bullet_char; + bool tight; +} cmark_list; + +typedef struct { + cmark_chunk info; + cmark_chunk literal; + uint8_t fence_length; + uint8_t fence_offset; + unsigned char fence_char; + int8_t fenced; +} cmark_code; + +typedef struct { + int level; + bool setext; +} cmark_heading; + +typedef struct { + cmark_chunk url; + cmark_chunk title; +} cmark_link; + +typedef struct { + cmark_chunk on_enter; + cmark_chunk on_exit; +} cmark_custom; + +enum cmark_node__internal_flags { + CMARK_NODE__OPEN = (1 << 0), + CMARK_NODE__LAST_LINE_BLANK = (1 << 1), +}; + +struct cmark_node { + cmark_strbuf content; + + struct cmark_node *next; + struct cmark_node *prev; + struct cmark_node *parent; + struct cmark_node *first_child; + struct cmark_node *last_child; + + void *user_data; + cmark_free_func user_data_free_func; + + int start_line; + int start_column; + int end_line; + int end_column; + int internal_offset; + uint16_t type; + uint16_t flags; + + cmark_syntax_extension *extension; + + union { + cmark_chunk literal; + cmark_list list; + cmark_code code; + cmark_heading heading; + cmark_link link; + cmark_custom custom; + int html_block_type; + void *opaque; + } as; +}; + +static CMARK_INLINE cmark_mem *cmark_node_mem(cmark_node *node) { + return node->content.mem; +} +CMARK_GFM_EXPORT int cmark_node_check(cmark_node *node, FILE *out); + +static CMARK_INLINE bool CMARK_NODE_TYPE_BLOCK_P(cmark_node_type node_type) { + return (node_type & CMARK_NODE_TYPE_MASK) == CMARK_NODE_TYPE_BLOCK; +} + +static CMARK_INLINE bool CMARK_NODE_BLOCK_P(cmark_node *node) { + return node != NULL && CMARK_NODE_TYPE_BLOCK_P((cmark_node_type) node->type); +} + +static CMARK_INLINE bool CMARK_NODE_TYPE_INLINE_P(cmark_node_type node_type) { + return (node_type & CMARK_NODE_TYPE_MASK) == CMARK_NODE_TYPE_INLINE; +} + +static CMARK_INLINE bool CMARK_NODE_INLINE_P(cmark_node *node) { + return node != NULL && CMARK_NODE_TYPE_INLINE_P((cmark_node_type) node->type); +} + +CMARK_GFM_EXPORT bool cmark_node_can_contain_type(cmark_node *node, cmark_node_type child_type); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/node.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/node.o new file mode 100644 index 000000000000..7914a9b81d52 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/node.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/parser.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/parser.h new file mode 100644 index 000000000000..f87e309484fd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/parser.h @@ -0,0 +1,57 @@ +#ifndef CMARK_PARSER_H +#define CMARK_PARSER_H + +#include +#include "node.h" +#include "buffer.h" +#include "memory.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_LINK_LABEL_LENGTH 1000 + +struct cmark_parser { + struct cmark_mem *mem; + /* A hashtable of urls in the current document for cross-references */ + struct cmark_map *refmap; + /* The root node of the parser, always a CMARK_NODE_DOCUMENT */ + struct cmark_node *root; + /* The last open block after a line is fully processed */ + struct cmark_node *current; + /* See the documentation for cmark_parser_get_line_number() in cmark.h */ + int line_number; + /* See the documentation for cmark_parser_get_offset() in cmark.h */ + bufsize_t offset; + /* See the documentation for cmark_parser_get_column() in cmark.h */ + bufsize_t column; + /* See the documentation for cmark_parser_get_first_nonspace() in cmark.h */ + bufsize_t first_nonspace; + /* See the documentation for cmark_parser_get_first_nonspace_column() in cmark.h */ + bufsize_t first_nonspace_column; + /* See the documentation for cmark_parser_get_indent() in cmark.h */ + int indent; + /* See the documentation for cmark_parser_is_blank() in cmark.h */ + bool blank; + /* See the documentation for cmark_parser_has_partially_consumed_tab() in cmark.h */ + bool partially_consumed_tab; + /* Contains the currently processed line */ + cmark_strbuf curline; + /* See the documentation for cmark_parser_get_last_line_length() in cmark.h */ + bufsize_t last_line_length; + /* FIXME: not sure about the difference with curline */ + cmark_strbuf linebuf; + /* Options set by the user, see the Options section in cmark.h */ + int options; + bool last_buffer_ended_with_cr; + cmark_llist *syntax_extensions; + cmark_llist *inline_syntax_extensions; + cmark_ispunct_func backslash_ispunct; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plaintext.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plaintext.c new file mode 100644 index 000000000000..910adf4666b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plaintext.c @@ -0,0 +1,213 @@ +#include "node.h" +#include "syntax_extension.h" +#include "render.h" + +#define OUT(s, wrap, escaping) renderer->out(renderer, node, s, wrap, escaping) +#define LIT(s) renderer->out(renderer, node, s, false, LITERAL) +#define CR() renderer->cr(renderer) +#define BLANKLINE() renderer->blankline(renderer) +#define LISTMARKER_SIZE 20 + +// Functions to convert cmark_nodes to plain text strings. + +static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_node *node, + cmark_escaping escape, + int32_t c, unsigned char nextc) { + cmark_render_code_point(renderer, c); +} + +// if node is a block node, returns node. +// otherwise returns first block-level node that is an ancestor of node. +// if there is no block-level ancestor, returns NULL. +static cmark_node *get_containing_block(cmark_node *node) { + while (node) { + if (CMARK_NODE_BLOCK_P(node)) { + return node; + } else { + node = node->parent; + } + } + return NULL; +} + +static int S_render_node(cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + cmark_node *tmp; + int list_number; + cmark_delim_type list_delim; + int i; + bool entering = (ev_type == CMARK_EVENT_ENTER); + char listmarker[LISTMARKER_SIZE]; + bool first_in_list_item; + bufsize_t marker_width; + bool allow_wrap = renderer->width > 0 && !(CMARK_OPT_NOBREAKS & options) && + !(CMARK_OPT_HARDBREAKS & options); + + // Don't adjust tight list status til we've started the list. + // Otherwise we loose the blank line between a paragraph and + // a following list. + if (!(node->type == CMARK_NODE_ITEM && node->prev == NULL && entering)) { + tmp = get_containing_block(node); + renderer->in_tight_list_item = + tmp && // tmp might be NULL if there is no containing block + ((tmp->type == CMARK_NODE_ITEM && + cmark_node_get_list_tight(tmp->parent)) || + (tmp && tmp->parent && tmp->parent->type == CMARK_NODE_ITEM && + cmark_node_get_list_tight(tmp->parent->parent))); + } + + if (node->extension && node->extension->plaintext_render_func) { + node->extension->plaintext_render_func(node->extension, renderer, node, ev_type, options); + return 1; + } + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + break; + + case CMARK_NODE_BLOCK_QUOTE: + break; + + case CMARK_NODE_LIST: + if (!entering && node->next && (node->next->type == CMARK_NODE_CODE_BLOCK || + node->next->type == CMARK_NODE_LIST)) { + CR(); + } + break; + + case CMARK_NODE_ITEM: + if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) { + marker_width = 4; + } else { + list_number = cmark_node_get_list_start(node->parent); + list_delim = cmark_node_get_list_delim(node->parent); + tmp = node; + while (tmp->prev) { + tmp = tmp->prev; + list_number += 1; + } + // we ensure a width of at least 4 so + // we get nice transition from single digits + // to double + snprintf(listmarker, LISTMARKER_SIZE, "%d%s%s", list_number, + list_delim == CMARK_PAREN_DELIM ? ")" : ".", + list_number < 10 ? " " : " "); + marker_width = (bufsize_t)strlen(listmarker); + } + if (entering) { + if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) { + LIT(" - "); + renderer->begin_content = true; + } else { + LIT(listmarker); + renderer->begin_content = true; + } + for (i = marker_width; i--;) { + cmark_strbuf_putc(renderer->prefix, ' '); + } + } else { + cmark_strbuf_truncate(renderer->prefix, + renderer->prefix->size - marker_width); + CR(); + } + break; + + case CMARK_NODE_HEADING: + if (entering) { + renderer->begin_content = true; + renderer->no_linebreaks = true; + } else { + renderer->no_linebreaks = false; + BLANKLINE(); + } + break; + + case CMARK_NODE_CODE_BLOCK: + first_in_list_item = node->prev == NULL && node->parent && + node->parent->type == CMARK_NODE_ITEM; + + if (!first_in_list_item) { + BLANKLINE(); + } + OUT(cmark_node_get_literal(node), false, LITERAL); + BLANKLINE(); + break; + + case CMARK_NODE_HTML_BLOCK: + break; + + case CMARK_NODE_CUSTOM_BLOCK: + break; + + case CMARK_NODE_THEMATIC_BREAK: + BLANKLINE(); + break; + + case CMARK_NODE_PARAGRAPH: + if (!entering) { + BLANKLINE(); + } + break; + + case CMARK_NODE_TEXT: + OUT(cmark_node_get_literal(node), allow_wrap, NORMAL); + break; + + case CMARK_NODE_LINEBREAK: + CR(); + break; + + case CMARK_NODE_SOFTBREAK: + if (CMARK_OPT_HARDBREAKS & options) { + CR(); + } else if (!renderer->no_linebreaks && renderer->width == 0 && + !(CMARK_OPT_HARDBREAKS & options) && + !(CMARK_OPT_NOBREAKS & options)) { + CR(); + } else { + OUT(" ", allow_wrap, LITERAL); + } + break; + + case CMARK_NODE_CODE: + OUT(cmark_node_get_literal(node), allow_wrap, LITERAL); + break; + + case CMARK_NODE_HTML_INLINE: + break; + + case CMARK_NODE_CUSTOM_INLINE: + break; + + case CMARK_NODE_STRONG: + break; + + case CMARK_NODE_EMPH: + break; + + case CMARK_NODE_LINK: + break; + + case CMARK_NODE_IMAGE: + break; + + default: + assert(false); + break; + } + + return 1; +} + +char *cmark_render_plaintext(cmark_node *root, int options, int width) { + return cmark_render_plaintext_with_mem(root, options, width, cmark_node_mem(root)); +} + +char *cmark_render_plaintext_with_mem(cmark_node *root, int options, int width, cmark_mem *mem) { + if (options & CMARK_OPT_HARDBREAKS) { + // disable breaking on width, since it has + // a different meaning with OPT_HARDBREAKS + width = 0; + } + return cmark_render(mem, root, options, width, outc, S_render_node); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plaintext.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plaintext.o new file mode 100644 index 000000000000..86ceb3f21250 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plaintext.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plugin.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plugin.c new file mode 100644 index 000000000000..3992fe197071 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plugin.c @@ -0,0 +1,36 @@ +#include + +#include "plugin.h" + +extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR; + +int cmark_plugin_register_syntax_extension(cmark_plugin * plugin, + cmark_syntax_extension * extension) { + plugin->syntax_extensions = cmark_llist_append(&CMARK_DEFAULT_MEM_ALLOCATOR, plugin->syntax_extensions, extension); + return 1; +} + +cmark_plugin * +cmark_plugin_new(void) { + cmark_plugin *res = (cmark_plugin *) CMARK_DEFAULT_MEM_ALLOCATOR.calloc(1, sizeof(cmark_plugin)); + + res->syntax_extensions = NULL; + + return res; +} + +void +cmark_plugin_free(cmark_plugin *plugin) { + cmark_llist_free_full(&CMARK_DEFAULT_MEM_ALLOCATOR, + plugin->syntax_extensions, + (cmark_free_func) cmark_syntax_extension_free); + CMARK_DEFAULT_MEM_ALLOCATOR.free(plugin); +} + +cmark_llist * +cmark_plugin_steal_syntax_extensions(cmark_plugin *plugin) { + cmark_llist *res = plugin->syntax_extensions; + + plugin->syntax_extensions = NULL; + return res; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plugin.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plugin.h new file mode 100644 index 000000000000..7bcbd19a221b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plugin.h @@ -0,0 +1,34 @@ +#ifndef CMARK_PLUGIN_H +#define CMARK_PLUGIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cmark-gfm.h" +#include "cmark-gfm-extension_api.h" + +/** + * cmark_plugin: + * + * A plugin structure, which should be filled by plugin's + * init functions. + */ +struct cmark_plugin { + cmark_llist *syntax_extensions; +}; + +cmark_llist * +cmark_plugin_steal_syntax_extensions(cmark_plugin *plugin); + +cmark_plugin * +cmark_plugin_new(void); + +void +cmark_plugin_free(cmark_plugin *plugin); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plugin.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plugin.o new file mode 100644 index 000000000000..3c128270fbf8 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/plugin.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/references.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/references.c new file mode 100644 index 000000000000..7e7f34b3819e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/references.c @@ -0,0 +1,42 @@ +#include "cmark-gfm.h" +#include "parser.h" +#include "references.h" +#include "inlines.h" +#include "chunk.h" + +static void reference_free(cmark_map *map, cmark_map_entry *_ref) { + cmark_reference *ref = (cmark_reference *)_ref; + cmark_mem *mem = map->mem; + if (ref != NULL) { + mem->free(ref->entry.label); + cmark_chunk_free(mem, &ref->url); + cmark_chunk_free(mem, &ref->title); + mem->free(ref); + } +} + +void cmark_reference_create(cmark_map *map, cmark_chunk *label, + cmark_chunk *url, cmark_chunk *title) { + cmark_reference *ref; + unsigned char *reflabel = normalize_map_label(map->mem, label); + + /* empty reference name, or composed from only whitespace */ + if (reflabel == NULL) + return; + + assert(map->sorted == NULL); + + ref = (cmark_reference *)map->mem->calloc(1, sizeof(*ref)); + ref->entry.label = reflabel; + ref->url = cmark_clean_url(map->mem, url); + ref->title = cmark_clean_title(map->mem, title); + ref->entry.age = map->size; + ref->entry.next = map->refs; + + map->refs = (cmark_map_entry *)ref; + map->size++; +} + +cmark_map *cmark_reference_map_new(cmark_mem *mem) { + return cmark_map_new(mem, reference_free); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/references.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/references.h new file mode 100644 index 000000000000..def944dc7781 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/references.h @@ -0,0 +1,26 @@ +#ifndef CMARK_REFERENCES_H +#define CMARK_REFERENCES_H + +#include "map.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct cmark_reference { + cmark_map_entry entry; + cmark_chunk url; + cmark_chunk title; +}; + +typedef struct cmark_reference cmark_reference; + +void cmark_reference_create(cmark_map *map, cmark_chunk *label, + cmark_chunk *url, cmark_chunk *title); +cmark_map *cmark_reference_map_new(cmark_mem *mem); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/references.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/references.o new file mode 100644 index 000000000000..3444ea05d7cc Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/references.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/registry.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/registry.c new file mode 100644 index 000000000000..f4f2040d6aeb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/registry.c @@ -0,0 +1,63 @@ +#include +#include +#include + +#include "config.h" +#include "cmark-gfm.h" +#include "syntax_extension.h" +#include "registry.h" +#include "plugin.h" + +extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR; + +static cmark_llist *syntax_extensions = NULL; + +void cmark_register_plugin(cmark_plugin_init_func reg_fn) { + cmark_plugin *plugin = cmark_plugin_new(); + + if (!reg_fn(plugin)) { + cmark_plugin_free(plugin); + return; + } + + cmark_llist *syntax_extensions_list = cmark_plugin_steal_syntax_extensions(plugin), + *it; + + for (it = syntax_extensions_list; it; it = it->next) { + syntax_extensions = cmark_llist_append(&CMARK_DEFAULT_MEM_ALLOCATOR, syntax_extensions, it->data); + } + + cmark_llist_free(&CMARK_DEFAULT_MEM_ALLOCATOR, syntax_extensions_list); + cmark_plugin_free(plugin); +} + +void cmark_release_plugins(void) { + if (syntax_extensions) { + cmark_llist_free_full( + &CMARK_DEFAULT_MEM_ALLOCATOR, + syntax_extensions, + (cmark_free_func) cmark_syntax_extension_free); + syntax_extensions = NULL; + } +} + +cmark_llist *cmark_list_syntax_extensions(cmark_mem *mem) { + cmark_llist *it; + cmark_llist *res = NULL; + + for (it = syntax_extensions; it; it = it->next) { + res = cmark_llist_append(mem, res, it->data); + } + return res; +} + +cmark_syntax_extension *cmark_find_syntax_extension(const char *name) { + cmark_llist *tmp; + + for (tmp = syntax_extensions; tmp; tmp = tmp->next) { + cmark_syntax_extension *ext = (cmark_syntax_extension *) tmp->data; + if (!strcmp(ext->name, name)) + return ext; + } + return NULL; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/registry.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/registry.h new file mode 100644 index 000000000000..fece2b63f53b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/registry.h @@ -0,0 +1,24 @@ +#ifndef CMARK_REGISTRY_H +#define CMARK_REGISTRY_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cmark-gfm.h" +#include "plugin.h" + +CMARK_GFM_EXPORT +void cmark_register_plugin(cmark_plugin_init_func reg_fn); + +CMARK_GFM_EXPORT +void cmark_release_plugins(void); + +CMARK_GFM_EXPORT +cmark_llist *cmark_list_syntax_extensions(cmark_mem *mem); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/registry.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/registry.o new file mode 100644 index 000000000000..cf026f6339a0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/registry.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/render.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/render.c new file mode 100644 index 000000000000..feb207544e9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/render.c @@ -0,0 +1,202 @@ +#include +#include "buffer.h" +#include "chunk.h" +#include "cmark-gfm.h" +#include "utf8.h" +#include "render.h" +#include "node.h" +#include "syntax_extension.h" + +static CMARK_INLINE void S_cr(cmark_renderer *renderer) { + if (renderer->need_cr < 1) { + renderer->need_cr = 1; + } +} + +static CMARK_INLINE void S_blankline(cmark_renderer *renderer) { + if (renderer->need_cr < 2) { + renderer->need_cr = 2; + } +} + +static void S_out(cmark_renderer *renderer, cmark_node *node, + const char *source, bool wrap, + cmark_escaping escape) { + int length = (int)strlen(source); + unsigned char nextc; + int32_t c; + int i = 0; + int last_nonspace; + int len; + cmark_chunk remainder = cmark_chunk_literal(""); + int k = renderer->buffer->size - 1; + + cmark_syntax_extension *ext = NULL; + cmark_node *n = node; + while (n && !ext) { + ext = n->extension; + if (!ext) + n = n->parent; + } + if (ext && !ext->commonmark_escape_func) + ext = NULL; + + wrap = wrap && !renderer->no_linebreaks; + + if (renderer->in_tight_list_item && renderer->need_cr > 1) { + renderer->need_cr = 1; + } + while (renderer->need_cr) { + if (k < 0 || renderer->buffer->ptr[k] == '\n') { + k -= 1; + } else { + cmark_strbuf_putc(renderer->buffer, '\n'); + if (renderer->need_cr > 1) { + cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, + renderer->prefix->size); + } + } + renderer->column = 0; + renderer->begin_line = true; + renderer->begin_content = true; + renderer->need_cr -= 1; + } + + while (i < length) { + if (renderer->begin_line) { + cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, + renderer->prefix->size); + // note: this assumes prefix is ascii: + renderer->column = renderer->prefix->size; + } + + len = cmark_utf8proc_iterate((const uint8_t *)source + i, length - i, &c); + if (len == -1) { // error condition + return; // return without rendering rest of string + } + + if (ext && ext->commonmark_escape_func(ext, node, c)) + cmark_strbuf_putc(renderer->buffer, '\\'); + + nextc = source[i + len]; + if (c == 32 && wrap) { + if (!renderer->begin_line) { + last_nonspace = renderer->buffer->size; + cmark_strbuf_putc(renderer->buffer, ' '); + renderer->column += 1; + renderer->begin_line = false; + renderer->begin_content = false; + // skip following spaces + while (source[i + 1] == ' ') { + i++; + } + // We don't allow breaks that make a digit the first character + // because this causes problems with commonmark output. + if (!cmark_isdigit(source[i + 1])) { + renderer->last_breakable = last_nonspace; + } + } + + } else if (c == 10) { + cmark_strbuf_putc(renderer->buffer, '\n'); + renderer->column = 0; + renderer->begin_line = true; + renderer->begin_content = true; + renderer->last_breakable = 0; + } else if (escape == LITERAL) { + cmark_render_code_point(renderer, c); + renderer->begin_line = false; + // we don't set 'begin_content' to false til we've + // finished parsing a digit. Reason: in commonmark + // we need to escape a potential list marker after + // a digit: + renderer->begin_content = + renderer->begin_content && cmark_isdigit((char)c) == 1; + } else { + (renderer->outc)(renderer, node, escape, c, nextc); + renderer->begin_line = false; + renderer->begin_content = + renderer->begin_content && cmark_isdigit((char)c) == 1; + } + + // If adding the character went beyond width, look for an + // earlier place where the line could be broken: + if (renderer->width > 0 && renderer->column > renderer->width && + !renderer->begin_line && renderer->last_breakable > 0) { + + // copy from last_breakable to remainder + cmark_chunk_set_cstr(renderer->mem, &remainder, + (char *)renderer->buffer->ptr + + renderer->last_breakable + 1); + // truncate at last_breakable + cmark_strbuf_truncate(renderer->buffer, renderer->last_breakable); + // add newline, prefix, and remainder + cmark_strbuf_putc(renderer->buffer, '\n'); + cmark_strbuf_put(renderer->buffer, renderer->prefix->ptr, + renderer->prefix->size); + cmark_strbuf_put(renderer->buffer, remainder.data, remainder.len); + renderer->column = renderer->prefix->size + remainder.len; + cmark_chunk_free(renderer->mem, &remainder); + renderer->last_breakable = 0; + renderer->begin_line = false; + renderer->begin_content = false; + } + + i += len; + } +} + +// Assumes no newlines, assumes ascii content: +void cmark_render_ascii(cmark_renderer *renderer, const char *s) { + int origsize = renderer->buffer->size; + cmark_strbuf_puts(renderer->buffer, s); + renderer->column += renderer->buffer->size - origsize; +} + +void cmark_render_code_point(cmark_renderer *renderer, uint32_t c) { + cmark_utf8proc_encode_char(c, renderer->buffer); + renderer->column += 1; +} + +char *cmark_render(cmark_mem *mem, cmark_node *root, int options, int width, + void (*outc)(cmark_renderer *, cmark_node *, + cmark_escaping, int32_t, + unsigned char), + int (*render_node)(cmark_renderer *renderer, + cmark_node *node, + cmark_event_type ev_type, int options)) { + cmark_strbuf pref = CMARK_BUF_INIT(mem); + cmark_strbuf buf = CMARK_BUF_INIT(mem); + cmark_node *cur; + cmark_event_type ev_type; + char *result; + cmark_iter *iter = cmark_iter_new(root); + + cmark_renderer renderer = {mem, &buf, &pref, 0, width, + 0, 0, true, true, false, + false, outc, S_cr, S_blankline, S_out, + 0}; + + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + if (!render_node(&renderer, cur, ev_type, options)) { + // a false value causes us to skip processing + // the node's contents. this is used for + // autolinks. + cmark_iter_reset(iter, cur, CMARK_EVENT_EXIT); + } + } + + // ensure final newline + if (renderer.buffer->ptr[renderer.buffer->size - 1] != '\n') { + cmark_strbuf_putc(renderer.buffer, '\n'); + } + + result = (char *)cmark_strbuf_detach(renderer.buffer); + + cmark_iter_free(iter); + cmark_strbuf_free(renderer.prefix); + cmark_strbuf_free(renderer.buffer); + + return result; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/render.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/render.h new file mode 100644 index 000000000000..32005eabb6f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/render.h @@ -0,0 +1,63 @@ +#ifndef CMARK_RENDER_H +#define CMARK_RENDER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "buffer.h" +#include "chunk.h" +#include "memory.h" + +typedef enum { LITERAL, NORMAL, TITLE, URL } cmark_escaping; + +struct cmark_renderer { + cmark_mem *mem; + cmark_strbuf *buffer; + cmark_strbuf *prefix; + int column; + int width; + int need_cr; + bufsize_t last_breakable; + bool begin_line; + bool begin_content; + bool no_linebreaks; + bool in_tight_list_item; + void (*outc)(struct cmark_renderer *, cmark_node *, cmark_escaping, int32_t, unsigned char); + void (*cr)(struct cmark_renderer *); + void (*blankline)(struct cmark_renderer *); + void (*out)(struct cmark_renderer *, cmark_node *, const char *, bool, cmark_escaping); + unsigned int footnote_ix; +}; + +typedef struct cmark_renderer cmark_renderer; + +struct cmark_html_renderer { + cmark_strbuf *html; + cmark_node *plain; + cmark_llist *filter_extensions; + unsigned int footnote_ix; + unsigned int written_footnote_ix; + void *opaque; +}; + +typedef struct cmark_html_renderer cmark_html_renderer; + +void cmark_render_ascii(cmark_renderer *renderer, const char *s); + +void cmark_render_code_point(cmark_renderer *renderer, uint32_t c); + +char *cmark_render(cmark_mem *mem, cmark_node *root, int options, int width, + void (*outc)(cmark_renderer *, cmark_node *, + cmark_escaping, int32_t, + unsigned char), + int (*render_node)(cmark_renderer *renderer, + cmark_node *node, + cmark_event_type ev_type, int options)); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/render.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/render.o new file mode 100644 index 000000000000..32dd33a0b7a4 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/render.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.c new file mode 100644 index 000000000000..5a4264826cb1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.c @@ -0,0 +1,10694 @@ +/* Generated by re2c 1.0.3 */ +#include +#include "chunk.h" +#include "scanners.h" + +bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c, bufsize_t offset) +{ + bufsize_t res; + unsigned char *ptr = (unsigned char *)c->data; + + if (ptr == NULL || offset > c->len) { + return 0; + } else { + unsigned char lim = ptr[c->len]; + + ptr[c->len] = '\0'; + res = scanner(ptr + offset); + ptr[c->len] = lim; + } + + return res; +} + + + +// Try to match a scheme including colon. +bufsize_t _scan_scheme(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + yych = *p; + if (yych <= '@') goto yy2; + if (yych <= 'Z') goto yy4; + if (yych <= '`') goto yy2; + if (yych <= 'z') goto yy4; +yy2: + ++p; +yy3: + { return 0; } +yy4: + yych = *(marker = ++p); + if (yych <= '/') { + if (yych <= '+') { + if (yych <= '*') goto yy3; + } else { + if (yych <= ',') goto yy3; + if (yych >= '/') goto yy3; + } + } else { + if (yych <= 'Z') { + if (yych <= '9') goto yy5; + if (yych <= '@') goto yy3; + } else { + if (yych <= '`') goto yy3; + if (yych >= '{') goto yy3; + } + } +yy5: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') goto yy7; + } else { + if (yych != '/') goto yy7; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych >= 'A') goto yy7; + } else { + if (yych <= '`') goto yy6; + if (yych <= 'z') goto yy7; + } + } +yy6: + p = marker; + goto yy3; +yy7: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') goto yy10; + goto yy6; + } else { + if (yych == '/') goto yy6; + goto yy10; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + goto yy10; + } else { + if (yych <= '`') goto yy6; + if (yych <= 'z') goto yy10; + goto yy6; + } + } +yy8: + ++p; + { return (bufsize_t)(p - start); } +yy10: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy6; + } else { + if (yych == '/') goto yy6; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy8; + if (yych <= '@') goto yy6; + } else { + if (yych <= '`') goto yy6; + if (yych >= '{') goto yy6; + } + } + yych = *++p; + if (yych == ':') goto yy8; + goto yy6; +} + +} + +// Try to match URI autolink after first <, returning number of chars matched. +bufsize_t _scan_autolink_uri(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 0, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= '@') goto yy41; + if (yych <= 'Z') goto yy43; + if (yych <= '`') goto yy41; + if (yych <= 'z') goto yy43; +yy41: + ++p; +yy42: + { return 0; } +yy43: + yych = *(marker = ++p); + if (yych <= '/') { + if (yych <= '+') { + if (yych <= '*') goto yy42; + } else { + if (yych <= ',') goto yy42; + if (yych >= '/') goto yy42; + } + } else { + if (yych <= 'Z') { + if (yych <= '9') goto yy44; + if (yych <= '@') goto yy42; + } else { + if (yych <= '`') goto yy42; + if (yych >= '{') goto yy42; + } + } +yy44: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') goto yy46; + } else { + if (yych != '/') goto yy46; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych >= 'A') goto yy46; + } else { + if (yych <= '`') goto yy45; + if (yych <= 'z') goto yy46; + } + } +yy45: + p = marker; + goto yy42; +yy46: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') goto yy49; + goto yy45; + } else { + if (yych == '/') goto yy45; + goto yy49; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + goto yy49; + } else { + if (yych <= '`') goto yy45; + if (yych <= 'z') goto yy49; + goto yy45; + } + } +yy47: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy47; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '<') goto yy45; + if (yych <= '>') goto yy50; + goto yy45; + } else { + if (yych <= 0xDF) goto yy52; + if (yych <= 0xE0) goto yy53; + goto yy54; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy55; + if (yych <= 0xEF) goto yy54; + goto yy56; + } else { + if (yych <= 0xF3) goto yy57; + if (yych <= 0xF4) goto yy58; + goto yy45; + } + } +yy49: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych == '+') goto yy59; + goto yy45; + } else { + if (yych == '/') goto yy45; + goto yy59; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + goto yy59; + } else { + if (yych <= '`') goto yy45; + if (yych <= 'z') goto yy59; + goto yy45; + } + } +yy50: + ++p; + { return (bufsize_t)(p - start); } +yy52: + yych = *++p; + if (yych <= 0x7F) goto yy45; + if (yych <= 0xBF) goto yy47; + goto yy45; +yy53: + yych = *++p; + if (yych <= 0x9F) goto yy45; + if (yych <= 0xBF) goto yy52; + goto yy45; +yy54: + yych = *++p; + if (yych <= 0x7F) goto yy45; + if (yych <= 0xBF) goto yy52; + goto yy45; +yy55: + yych = *++p; + if (yych <= 0x7F) goto yy45; + if (yych <= 0x9F) goto yy52; + goto yy45; +yy56: + yych = *++p; + if (yych <= 0x8F) goto yy45; + if (yych <= 0xBF) goto yy54; + goto yy45; +yy57: + yych = *++p; + if (yych <= 0x7F) goto yy45; + if (yych <= 0xBF) goto yy54; + goto yy45; +yy58: + yych = *++p; + if (yych <= 0x7F) goto yy45; + if (yych <= 0x8F) goto yy54; + goto yy45; +yy59: + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych <= '9') { + if (yych <= ',') { + if (yych != '+') goto yy45; + } else { + if (yych == '/') goto yy45; + } + } else { + if (yych <= 'Z') { + if (yych <= ':') goto yy47; + if (yych <= '@') goto yy45; + } else { + if (yych <= '`') goto yy45; + if (yych >= '{') goto yy45; + } + } + yych = *++p; + if (yych == ':') goto yy47; + goto yy45; +} + +} + +// Try to match email autolink after first <, returning num of chars matched. +bufsize_t _scan_autolink_email(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 128, 128, 128, 128, 128, + 0, 0, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 128, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= '9') { + if (yych <= '\'') { + if (yych == '!') goto yy91; + if (yych >= '#') goto yy91; + } else { + if (yych <= ')') goto yy89; + if (yych != ',') goto yy91; + } + } else { + if (yych <= '?') { + if (yych == '=') goto yy91; + if (yych >= '?') goto yy91; + } else { + if (yych <= 'Z') { + if (yych >= 'A') goto yy91; + } else { + if (yych <= ']') goto yy89; + if (yych <= '~') goto yy91; + } + } + } +yy89: + ++p; +yy90: + { return 0; } +yy91: + yych = *(marker = ++p); + if (yych <= ',') { + if (yych <= '"') { + if (yych == '!') goto yy93; + goto yy90; + } else { + if (yych <= '\'') goto yy93; + if (yych <= ')') goto yy90; + if (yych <= '+') goto yy93; + goto yy90; + } + } else { + if (yych <= '>') { + if (yych <= '9') goto yy93; + if (yych == '=') goto yy93; + goto yy90; + } else { + if (yych <= 'Z') goto yy93; + if (yych <= ']') goto yy90; + if (yych <= '~') goto yy93; + goto yy90; + } + } +yy92: + yych = *++p; +yy93: + if (yybm[0+yych] & 128) { + goto yy92; + } + if (yych <= '>') goto yy94; + if (yych <= '@') goto yy95; +yy94: + p = marker; + goto yy90; +yy95: + yych = *++p; + if (yych <= '@') { + if (yych <= '/') goto yy94; + if (yych >= ':') goto yy94; + } else { + if (yych <= 'Z') goto yy96; + if (yych <= '`') goto yy94; + if (yych >= '{') goto yy94; + } +yy96: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy98; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy98; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy98; + goto yy94; + } + } + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy101; + if (yych <= '/') goto yy94; + goto yy102; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy102; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy102; + goto yy94; + } + } +yy98: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych <= '-') goto yy101; + goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy102; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy102; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy102; + goto yy94; + } + } +yy99: + ++p; + { return (bufsize_t)(p - start); } +yy101: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy103; + if (yych <= '/') goto yy94; + goto yy104; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy104; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy104; + goto yy94; + } + } +yy102: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy104; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy104; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy104; + goto yy94; + } + } +yy103: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy105; + if (yych <= '/') goto yy94; + goto yy106; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy106; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy106; + goto yy94; + } + } +yy104: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy106; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy106; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy106; + goto yy94; + } + } +yy105: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy107; + if (yych <= '/') goto yy94; + goto yy108; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy108; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy108; + goto yy94; + } + } +yy106: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy108; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy108; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy108; + goto yy94; + } + } +yy107: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy109; + if (yych <= '/') goto yy94; + goto yy110; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy110; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy110; + goto yy94; + } + } +yy108: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy110; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy110; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy110; + goto yy94; + } + } +yy109: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy111; + if (yych <= '/') goto yy94; + goto yy112; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy112; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy112; + goto yy94; + } + } +yy110: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy112; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy112; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy112; + goto yy94; + } + } +yy111: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy113; + if (yych <= '/') goto yy94; + goto yy114; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy114; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy114; + goto yy94; + } + } +yy112: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy114; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy114; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy114; + goto yy94; + } + } +yy113: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy115; + if (yych <= '/') goto yy94; + goto yy116; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy116; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy116; + goto yy94; + } + } +yy114: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy116; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy116; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy116; + goto yy94; + } + } +yy115: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy117; + if (yych <= '/') goto yy94; + goto yy118; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy118; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy118; + goto yy94; + } + } +yy116: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy118; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy118; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy118; + goto yy94; + } + } +yy117: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy119; + if (yych <= '/') goto yy94; + goto yy120; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy120; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy120; + goto yy94; + } + } +yy118: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy120; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy120; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy120; + goto yy94; + } + } +yy119: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy121; + if (yych <= '/') goto yy94; + goto yy122; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy122; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy122; + goto yy94; + } + } +yy120: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy122; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy122; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy122; + goto yy94; + } + } +yy121: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy123; + if (yych <= '/') goto yy94; + goto yy124; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy124; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy124; + goto yy94; + } + } +yy122: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy124; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy124; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy124; + goto yy94; + } + } +yy123: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy125; + if (yych <= '/') goto yy94; + goto yy126; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy126; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy126; + goto yy94; + } + } +yy124: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy126; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy126; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy126; + goto yy94; + } + } +yy125: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy127; + if (yych <= '/') goto yy94; + goto yy128; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy128; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy128; + goto yy94; + } + } +yy126: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy128; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy128; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy128; + goto yy94; + } + } +yy127: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy129; + if (yych <= '/') goto yy94; + goto yy130; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy130; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy130; + goto yy94; + } + } +yy128: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy130; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy130; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy130; + goto yy94; + } + } +yy129: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy131; + if (yych <= '/') goto yy94; + goto yy132; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy132; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy132; + goto yy94; + } + } +yy130: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy132; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy132; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy132; + goto yy94; + } + } +yy131: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy133; + if (yych <= '/') goto yy94; + goto yy134; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy134; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy134; + goto yy94; + } + } +yy132: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy134; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy134; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy134; + goto yy94; + } + } +yy133: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy135; + if (yych <= '/') goto yy94; + goto yy136; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy136; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy136; + goto yy94; + } + } +yy134: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy136; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy136; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy136; + goto yy94; + } + } +yy135: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy137; + if (yych <= '/') goto yy94; + goto yy138; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy138; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy138; + goto yy94; + } + } +yy136: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy138; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy138; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy138; + goto yy94; + } + } +yy137: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy139; + if (yych <= '/') goto yy94; + goto yy140; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy140; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy140; + goto yy94; + } + } +yy138: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy140; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy140; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy140; + goto yy94; + } + } +yy139: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy141; + if (yych <= '/') goto yy94; + goto yy142; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy142; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy142; + goto yy94; + } + } +yy140: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy142; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy142; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy142; + goto yy94; + } + } +yy141: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy143; + if (yych <= '/') goto yy94; + goto yy144; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy144; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy144; + goto yy94; + } + } +yy142: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy144; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy144; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy144; + goto yy94; + } + } +yy143: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy145; + if (yych <= '/') goto yy94; + goto yy146; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy146; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy146; + goto yy94; + } + } +yy144: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy146; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy146; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy146; + goto yy94; + } + } +yy145: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy147; + if (yych <= '/') goto yy94; + goto yy148; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy148; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy148; + goto yy94; + } + } +yy146: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy148; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy148; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy148; + goto yy94; + } + } +yy147: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy149; + if (yych <= '/') goto yy94; + goto yy150; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy150; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy150; + goto yy94; + } + } +yy148: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy150; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy150; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy150; + goto yy94; + } + } +yy149: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy151; + if (yych <= '/') goto yy94; + goto yy152; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy152; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy152; + goto yy94; + } + } +yy150: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy152; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy152; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy152; + goto yy94; + } + } +yy151: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy153; + if (yych <= '/') goto yy94; + goto yy154; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy154; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy154; + goto yy94; + } + } +yy152: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy154; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy154; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy154; + goto yy94; + } + } +yy153: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy155; + if (yych <= '/') goto yy94; + goto yy156; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy156; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy156; + goto yy94; + } + } +yy154: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy156; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy156; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy156; + goto yy94; + } + } +yy155: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy157; + if (yych <= '/') goto yy94; + goto yy158; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy158; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy158; + goto yy94; + } + } +yy156: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy158; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy158; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy158; + goto yy94; + } + } +yy157: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy159; + if (yych <= '/') goto yy94; + goto yy160; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy160; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy160; + goto yy94; + } + } +yy158: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy160; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy160; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy160; + goto yy94; + } + } +yy159: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy161; + if (yych <= '/') goto yy94; + goto yy162; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy162; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy162; + goto yy94; + } + } +yy160: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy162; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy162; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy162; + goto yy94; + } + } +yy161: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy163; + if (yych <= '/') goto yy94; + goto yy164; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy164; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy164; + goto yy94; + } + } +yy162: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy164; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy164; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy164; + goto yy94; + } + } +yy163: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy165; + if (yych <= '/') goto yy94; + goto yy166; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy166; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy166; + goto yy94; + } + } +yy164: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy166; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy166; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy166; + goto yy94; + } + } +yy165: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy167; + if (yych <= '/') goto yy94; + goto yy168; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy168; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy168; + goto yy94; + } + } +yy166: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy168; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy168; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy168; + goto yy94; + } + } +yy167: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy169; + if (yych <= '/') goto yy94; + goto yy170; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy170; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy170; + goto yy94; + } + } +yy168: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy170; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy170; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy170; + goto yy94; + } + } +yy169: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy171; + if (yych <= '/') goto yy94; + goto yy172; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy172; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy172; + goto yy94; + } + } +yy170: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy172; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy172; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy172; + goto yy94; + } + } +yy171: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy173; + if (yych <= '/') goto yy94; + goto yy174; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy174; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy174; + goto yy94; + } + } +yy172: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy174; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy174; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy174; + goto yy94; + } + } +yy173: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy175; + if (yych <= '/') goto yy94; + goto yy176; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy176; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy176; + goto yy94; + } + } +yy174: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy176; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy176; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy176; + goto yy94; + } + } +yy175: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy177; + if (yych <= '/') goto yy94; + goto yy178; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy178; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy178; + goto yy94; + } + } +yy176: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy178; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy178; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy178; + goto yy94; + } + } +yy177: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy179; + if (yych <= '/') goto yy94; + goto yy180; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy180; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy180; + goto yy94; + } + } +yy178: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy180; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy180; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy180; + goto yy94; + } + } +yy179: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy181; + if (yych <= '/') goto yy94; + goto yy182; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy182; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy182; + goto yy94; + } + } +yy180: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy182; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy182; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy182; + goto yy94; + } + } +yy181: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy183; + if (yych <= '/') goto yy94; + goto yy184; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy184; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy184; + goto yy94; + } + } +yy182: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy184; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy184; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy184; + goto yy94; + } + } +yy183: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy185; + if (yych <= '/') goto yy94; + goto yy186; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy186; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy186; + goto yy94; + } + } +yy184: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy186; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy186; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy186; + goto yy94; + } + } +yy185: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy187; + if (yych <= '/') goto yy94; + goto yy188; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy188; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy188; + goto yy94; + } + } +yy186: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy188; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy188; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy188; + goto yy94; + } + } +yy187: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy189; + if (yych <= '/') goto yy94; + goto yy190; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy190; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy190; + goto yy94; + } + } +yy188: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy190; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy190; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy190; + goto yy94; + } + } +yy189: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy191; + if (yych <= '/') goto yy94; + goto yy192; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy192; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy192; + goto yy94; + } + } +yy190: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy192; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy192; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy192; + goto yy94; + } + } +yy191: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy193; + if (yych <= '/') goto yy94; + goto yy194; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy194; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy194; + goto yy94; + } + } +yy192: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy194; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy194; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy194; + goto yy94; + } + } +yy193: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy195; + if (yych <= '/') goto yy94; + goto yy196; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy196; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy196; + goto yy94; + } + } +yy194: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy196; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy196; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy196; + goto yy94; + } + } +yy195: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy197; + if (yych <= '/') goto yy94; + goto yy198; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy198; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy198; + goto yy94; + } + } +yy196: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy198; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy198; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy198; + goto yy94; + } + } +yy197: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy199; + if (yych <= '/') goto yy94; + goto yy200; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy200; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy200; + goto yy94; + } + } +yy198: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy200; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy200; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy200; + goto yy94; + } + } +yy199: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy201; + if (yych <= '/') goto yy94; + goto yy202; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy202; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy202; + goto yy94; + } + } +yy200: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy202; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy202; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy202; + goto yy94; + } + } +yy201: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy203; + if (yych <= '/') goto yy94; + goto yy204; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy204; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy204; + goto yy94; + } + } +yy202: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy204; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy204; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy204; + goto yy94; + } + } +yy203: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy205; + if (yych <= '/') goto yy94; + goto yy206; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy206; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy206; + goto yy94; + } + } +yy204: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy206; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy206; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy206; + goto yy94; + } + } +yy205: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy207; + if (yych <= '/') goto yy94; + goto yy208; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy208; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy208; + goto yy94; + } + } +yy206: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy208; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy208; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy208; + goto yy94; + } + } +yy207: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy209; + if (yych <= '/') goto yy94; + goto yy210; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy210; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy210; + goto yy94; + } + } +yy208: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy210; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy210; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy210; + goto yy94; + } + } +yy209: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy211; + if (yych <= '/') goto yy94; + goto yy212; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy212; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy212; + goto yy94; + } + } +yy210: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy212; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy212; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy212; + goto yy94; + } + } +yy211: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy213; + if (yych <= '/') goto yy94; + goto yy214; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy214; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy214; + goto yy94; + } + } +yy212: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy214; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy214; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy214; + goto yy94; + } + } +yy213: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy215; + if (yych <= '/') goto yy94; + goto yy216; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy216; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy216; + goto yy94; + } + } +yy214: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy216; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy216; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy216; + goto yy94; + } + } +yy215: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy217; + if (yych <= '/') goto yy94; + goto yy218; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy218; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy218; + goto yy94; + } + } +yy216: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy218; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy218; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy218; + goto yy94; + } + } +yy217: + yych = *++p; + if (yych <= '9') { + if (yych == '-') goto yy219; + if (yych <= '/') goto yy94; + goto yy220; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy94; + goto yy220; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy220; + goto yy94; + } + } +yy218: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= ',') goto yy94; + if (yych >= '.') goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy220; + goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + goto yy220; + } else { + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy220; + goto yy94; + } + } +yy219: + yych = *++p; + if (yych <= '@') { + if (yych <= '/') goto yy94; + if (yych <= '9') goto yy221; + goto yy94; + } else { + if (yych <= 'Z') goto yy221; + if (yych <= '`') goto yy94; + if (yych <= 'z') goto yy221; + goto yy94; + } +yy220: + yych = *++p; + if (yych <= '=') { + if (yych <= '.') { + if (yych <= '-') goto yy94; + goto yy95; + } else { + if (yych <= '/') goto yy94; + if (yych >= ':') goto yy94; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy99; + if (yych <= '@') goto yy94; + } else { + if (yych <= '`') goto yy94; + if (yych >= '{') goto yy94; + } + } +yy221: + yych = *++p; + if (yych == '.') goto yy95; + if (yych == '>') goto yy99; + goto yy94; +} + +} + +// Try to match an HTML tag after first <, returning num of chars matched. +bufsize_t _scan_html_tag(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + static const unsigned char yybm[] = { + /* table 1 .. 8: 0 */ + 0, 250, 250, 250, 250, 250, 250, 250, + 250, 235, 235, 235, 235, 235, 250, 250, + 250, 250, 250, 250, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 250, 250, + 235, 250, 202, 250, 250, 250, 250, 170, + 250, 250, 250, 250, 250, 246, 254, 250, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 250, 234, 234, 232, 250, + 250, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 250, 250, 122, 250, 254, + 234, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 250, 250, 250, 250, 250, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + /* table 9 .. 11: 256 */ + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 192, 128, 128, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 128, 128, 128, 128, 128, 0, + 128, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 128, 128, 128, 128, 128, + 128, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 128, 128, 128, 128, 128, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= '>') { + if (yych <= '!') { + if (yych >= '!') goto yy226; + } else { + if (yych == '/') goto yy227; + } + } else { + if (yych <= 'Z') { + if (yych <= '?') goto yy228; + if (yych >= 'A') goto yy229; + } else { + if (yych <= '`') goto yy224; + if (yych <= 'z') goto yy229; + } + } +yy224: + ++p; +yy225: + { return 0; } +yy226: + yych = *(marker = ++p); + if (yybm[256+yych] & 32) { + goto yy232; + } + if (yych == '-') goto yy230; + if (yych <= '@') goto yy225; + if (yych <= '[') goto yy234; + goto yy225; +yy227: + yych = *(marker = ++p); + if (yych <= '@') goto yy225; + if (yych <= 'Z') goto yy235; + if (yych <= '`') goto yy225; + if (yych <= 'z') goto yy235; + goto yy225; +yy228: + yych = *(marker = ++p); + if (yych <= 0x00) goto yy225; + if (yych <= 0x7F) goto yy238; + if (yych <= 0xC1) goto yy225; + if (yych <= 0xF4) goto yy238; + goto yy225; +yy229: + yych = *(marker = ++p); + if (yych <= '.') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy225; + if (yych <= '\r') goto yy250; + goto yy225; + } else { + if (yych <= ' ') goto yy250; + if (yych == '-') goto yy250; + goto yy225; + } + } else { + if (yych <= '@') { + if (yych <= '9') goto yy250; + if (yych == '>') goto yy250; + goto yy225; + } else { + if (yych <= 'Z') goto yy250; + if (yych <= '`') goto yy225; + if (yych <= 'z') goto yy250; + goto yy225; + } + } +yy230: + yych = *++p; + if (yych == '-') goto yy254; +yy231: + p = marker; + goto yy225; +yy232: + yych = *++p; + if (yybm[256+yych] & 32) { + goto yy232; + } + if (yych <= 0x08) goto yy231; + if (yych <= '\r') goto yy255; + if (yych == ' ') goto yy255; + goto yy231; +yy234: + yych = *++p; + if (yych == 'C') goto yy257; + if (yych == 'c') goto yy257; + goto yy231; +yy235: + yych = *++p; + if (yybm[256+yych] & 64) { + goto yy235; + } + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy231; + if (yych <= '\r') goto yy258; + goto yy231; + } else { + if (yych <= ' ') goto yy258; + if (yych == '>') goto yy252; + goto yy231; + } +yy237: + yych = *++p; +yy238: + if (yybm[256+yych] & 128) { + goto yy237; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy231; + if (yych >= '@') goto yy231; + } else { + if (yych <= 0xDF) goto yy240; + if (yych <= 0xE0) goto yy241; + goto yy242; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy243; + if (yych <= 0xEF) goto yy242; + goto yy244; + } else { + if (yych <= 0xF3) goto yy245; + if (yych <= 0xF4) goto yy246; + goto yy231; + } + } + yych = *++p; + if (yych <= 0xE0) { + if (yych <= '>') { + if (yych <= 0x00) goto yy231; + if (yych <= '=') goto yy237; + goto yy252; + } else { + if (yych <= 0x7F) goto yy237; + if (yych <= 0xC1) goto yy231; + if (yych >= 0xE0) goto yy241; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy243; + goto yy242; + } else { + if (yych <= 0xF0) goto yy244; + if (yych <= 0xF3) goto yy245; + if (yych <= 0xF4) goto yy246; + goto yy231; + } + } +yy240: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy237; + goto yy231; +yy241: + yych = *++p; + if (yych <= 0x9F) goto yy231; + if (yych <= 0xBF) goto yy240; + goto yy231; +yy242: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy240; + goto yy231; +yy243: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x9F) goto yy240; + goto yy231; +yy244: + yych = *++p; + if (yych <= 0x8F) goto yy231; + if (yych <= 0xBF) goto yy242; + goto yy231; +yy245: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy242; + goto yy231; +yy246: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x8F) goto yy242; + goto yy231; +yy247: + yych = *++p; + if (yybm[0+yych] & 1) { + goto yy247; + } + if (yych <= '>') { + if (yych <= '9') { + if (yych == '/') goto yy251; + goto yy231; + } else { + if (yych <= ':') goto yy260; + if (yych <= '=') goto yy231; + goto yy252; + } + } else { + if (yych <= '^') { + if (yych <= '@') goto yy231; + if (yych <= 'Z') goto yy260; + goto yy231; + } else { + if (yych == '`') goto yy231; + if (yych <= 'z') goto yy260; + goto yy231; + } + } +yy249: + yych = *++p; +yy250: + if (yybm[0+yych] & 1) { + goto yy247; + } + if (yych <= '=') { + if (yych <= '.') { + if (yych == '-') goto yy249; + goto yy231; + } else { + if (yych <= '/') goto yy251; + if (yych <= '9') goto yy249; + goto yy231; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy252; + if (yych <= '@') goto yy231; + goto yy249; + } else { + if (yych <= '`') goto yy231; + if (yych <= 'z') goto yy249; + goto yy231; + } + } +yy251: + yych = *++p; + if (yych != '>') goto yy231; +yy252: + ++p; + { return (bufsize_t)(p - start); } +yy254: + yych = *++p; + if (yych == '-') goto yy264; + if (yych == '>') goto yy231; + goto yy263; +yy255: + yych = *++p; + if (yybm[0+yych] & 2) { + goto yy255; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy231; + if (yych <= '>') goto yy252; + goto yy231; + } else { + if (yych <= 0xDF) goto yy272; + if (yych <= 0xE0) goto yy273; + goto yy274; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy275; + if (yych <= 0xEF) goto yy274; + goto yy276; + } else { + if (yych <= 0xF3) goto yy277; + if (yych <= 0xF4) goto yy278; + goto yy231; + } + } +yy257: + yych = *++p; + if (yych == 'D') goto yy279; + if (yych == 'd') goto yy279; + goto yy231; +yy258: + yych = *++p; + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy231; + if (yych <= '\r') goto yy258; + goto yy231; + } else { + if (yych <= ' ') goto yy258; + if (yych == '>') goto yy252; + goto yy231; + } +yy260: + yych = *++p; + if (yybm[0+yych] & 4) { + goto yy260; + } + if (yych <= ',') { + if (yych <= '\r') { + if (yych <= 0x08) goto yy231; + goto yy280; + } else { + if (yych == ' ') goto yy280; + goto yy231; + } + } else { + if (yych <= '<') { + if (yych <= '/') goto yy251; + goto yy231; + } else { + if (yych <= '=') goto yy282; + if (yych <= '>') goto yy252; + goto yy231; + } + } +yy262: + yych = *++p; +yy263: + if (yybm[0+yych] & 8) { + goto yy262; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy231; + if (yych <= '-') goto yy284; + goto yy231; + } else { + if (yych <= 0xDF) goto yy265; + if (yych <= 0xE0) goto yy266; + goto yy267; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy268; + if (yych <= 0xEF) goto yy267; + goto yy269; + } else { + if (yych <= 0xF3) goto yy270; + if (yych <= 0xF4) goto yy271; + goto yy231; + } + } +yy264: + yych = *++p; + if (yych == '-') goto yy251; + if (yych == '>') goto yy231; + goto yy263; +yy265: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy262; + goto yy231; +yy266: + yych = *++p; + if (yych <= 0x9F) goto yy231; + if (yych <= 0xBF) goto yy265; + goto yy231; +yy267: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy265; + goto yy231; +yy268: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x9F) goto yy265; + goto yy231; +yy269: + yych = *++p; + if (yych <= 0x8F) goto yy231; + if (yych <= 0xBF) goto yy267; + goto yy231; +yy270: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy267; + goto yy231; +yy271: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x8F) goto yy267; + goto yy231; +yy272: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy255; + goto yy231; +yy273: + yych = *++p; + if (yych <= 0x9F) goto yy231; + if (yych <= 0xBF) goto yy272; + goto yy231; +yy274: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy272; + goto yy231; +yy275: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x9F) goto yy272; + goto yy231; +yy276: + yych = *++p; + if (yych <= 0x8F) goto yy231; + if (yych <= 0xBF) goto yy274; + goto yy231; +yy277: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy274; + goto yy231; +yy278: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x8F) goto yy274; + goto yy231; +yy279: + yych = *++p; + if (yych == 'A') goto yy285; + if (yych == 'a') goto yy285; + goto yy231; +yy280: + yych = *++p; + if (yych <= '<') { + if (yych <= ' ') { + if (yych <= 0x08) goto yy231; + if (yych <= '\r') goto yy280; + if (yych <= 0x1F) goto yy231; + goto yy280; + } else { + if (yych <= '/') { + if (yych <= '.') goto yy231; + goto yy251; + } else { + if (yych == ':') goto yy260; + goto yy231; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '=') goto yy282; + if (yych <= '>') goto yy252; + if (yych <= '@') goto yy231; + goto yy260; + } else { + if (yych <= '_') { + if (yych <= '^') goto yy231; + goto yy260; + } else { + if (yych <= '`') goto yy231; + if (yych <= 'z') goto yy260; + goto yy231; + } + } + } +yy282: + yych = *++p; + if (yybm[0+yych] & 16) { + goto yy286; + } + if (yych <= 0xE0) { + if (yych <= '"') { + if (yych <= 0x00) goto yy231; + if (yych <= ' ') goto yy282; + goto yy288; + } else { + if (yych <= '\'') goto yy290; + if (yych <= 0xC1) goto yy231; + if (yych <= 0xDF) goto yy292; + goto yy293; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy295; + goto yy294; + } else { + if (yych <= 0xF0) goto yy296; + if (yych <= 0xF3) goto yy297; + if (yych <= 0xF4) goto yy298; + goto yy231; + } + } +yy284: + yych = *++p; + if (yybm[0+yych] & 8) { + goto yy262; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy231; + if (yych <= '-') goto yy251; + goto yy231; + } else { + if (yych <= 0xDF) goto yy265; + if (yych <= 0xE0) goto yy266; + goto yy267; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy268; + if (yych <= 0xEF) goto yy267; + goto yy269; + } else { + if (yych <= 0xF3) goto yy270; + if (yych <= 0xF4) goto yy271; + goto yy231; + } + } +yy285: + yych = *++p; + if (yych == 'T') goto yy299; + if (yych == 't') goto yy299; + goto yy231; +yy286: + yych = *++p; + if (yybm[0+yych] & 16) { + goto yy286; + } + if (yych <= 0xE0) { + if (yych <= '=') { + if (yych <= 0x00) goto yy231; + if (yych <= ' ') goto yy247; + goto yy231; + } else { + if (yych <= '>') goto yy252; + if (yych <= 0xC1) goto yy231; + if (yych <= 0xDF) goto yy292; + goto yy293; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy295; + goto yy294; + } else { + if (yych <= 0xF0) goto yy296; + if (yych <= 0xF3) goto yy297; + if (yych <= 0xF4) goto yy298; + goto yy231; + } + } +yy288: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy288; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy231; + if (yych <= '"') goto yy300; + goto yy231; + } else { + if (yych <= 0xDF) goto yy301; + if (yych <= 0xE0) goto yy302; + goto yy303; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy304; + if (yych <= 0xEF) goto yy303; + goto yy305; + } else { + if (yych <= 0xF3) goto yy306; + if (yych <= 0xF4) goto yy307; + goto yy231; + } + } +yy290: + yych = *++p; + if (yybm[0+yych] & 64) { + goto yy290; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy231; + if (yych <= '\'') goto yy300; + goto yy231; + } else { + if (yych <= 0xDF) goto yy308; + if (yych <= 0xE0) goto yy309; + goto yy310; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy311; + if (yych <= 0xEF) goto yy310; + goto yy312; + } else { + if (yych <= 0xF3) goto yy313; + if (yych <= 0xF4) goto yy314; + goto yy231; + } + } +yy292: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy286; + goto yy231; +yy293: + yych = *++p; + if (yych <= 0x9F) goto yy231; + if (yych <= 0xBF) goto yy292; + goto yy231; +yy294: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy292; + goto yy231; +yy295: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x9F) goto yy292; + goto yy231; +yy296: + yych = *++p; + if (yych <= 0x8F) goto yy231; + if (yych <= 0xBF) goto yy294; + goto yy231; +yy297: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy294; + goto yy231; +yy298: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x8F) goto yy294; + goto yy231; +yy299: + yych = *++p; + if (yych == 'A') goto yy315; + if (yych == 'a') goto yy315; + goto yy231; +yy300: + yych = *++p; + if (yybm[0+yych] & 1) { + goto yy247; + } + if (yych == '/') goto yy251; + if (yych == '>') goto yy252; + goto yy231; +yy301: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy288; + goto yy231; +yy302: + yych = *++p; + if (yych <= 0x9F) goto yy231; + if (yych <= 0xBF) goto yy301; + goto yy231; +yy303: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy301; + goto yy231; +yy304: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x9F) goto yy301; + goto yy231; +yy305: + yych = *++p; + if (yych <= 0x8F) goto yy231; + if (yych <= 0xBF) goto yy303; + goto yy231; +yy306: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy303; + goto yy231; +yy307: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x8F) goto yy303; + goto yy231; +yy308: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy290; + goto yy231; +yy309: + yych = *++p; + if (yych <= 0x9F) goto yy231; + if (yych <= 0xBF) goto yy308; + goto yy231; +yy310: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy308; + goto yy231; +yy311: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x9F) goto yy308; + goto yy231; +yy312: + yych = *++p; + if (yych <= 0x8F) goto yy231; + if (yych <= 0xBF) goto yy310; + goto yy231; +yy313: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy310; + goto yy231; +yy314: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x8F) goto yy310; + goto yy231; +yy315: + yych = *++p; + if (yych != '[') goto yy231; +yy316: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy316; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy231; + if (yych >= '^') goto yy231; + } else { + if (yych <= 0xDF) goto yy319; + if (yych <= 0xE0) goto yy320; + goto yy321; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy322; + if (yych <= 0xEF) goto yy321; + goto yy323; + } else { + if (yych <= 0xF3) goto yy324; + if (yych <= 0xF4) goto yy325; + goto yy231; + } + } + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy316; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy231; + if (yych <= ']') goto yy326; + goto yy231; + } else { + if (yych <= 0xDF) goto yy319; + if (yych <= 0xE0) goto yy320; + goto yy321; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy322; + if (yych <= 0xEF) goto yy321; + goto yy323; + } else { + if (yych <= 0xF3) goto yy324; + if (yych <= 0xF4) goto yy325; + goto yy231; + } + } +yy319: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy316; + goto yy231; +yy320: + yych = *++p; + if (yych <= 0x9F) goto yy231; + if (yych <= 0xBF) goto yy319; + goto yy231; +yy321: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy319; + goto yy231; +yy322: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x9F) goto yy319; + goto yy231; +yy323: + yych = *++p; + if (yych <= 0x8F) goto yy231; + if (yych <= 0xBF) goto yy321; + goto yy231; +yy324: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0xBF) goto yy321; + goto yy231; +yy325: + yych = *++p; + if (yych <= 0x7F) goto yy231; + if (yych <= 0x8F) goto yy321; + goto yy231; +yy326: + yych = *++p; + if (yych <= 0xE0) { + if (yych <= '>') { + if (yych <= 0x00) goto yy231; + if (yych <= '=') goto yy316; + goto yy252; + } else { + if (yych <= 0x7F) goto yy316; + if (yych <= 0xC1) goto yy231; + if (yych <= 0xDF) goto yy319; + goto yy320; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy322; + goto yy321; + } else { + if (yych <= 0xF0) goto yy323; + if (yych <= 0xF3) goto yy324; + if (yych <= 0xF4) goto yy325; + goto yy231; + } + } +} + +} + +// Try to (liberally) match an HTML tag after first <, returning num of chars matched. +bufsize_t _scan_liberal_html_tag(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 128, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= 0xE0) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy329; + if (yych <= '\t') goto yy331; + } else { + if (yych <= 0x7F) goto yy331; + if (yych <= 0xC1) goto yy329; + if (yych <= 0xDF) goto yy332; + goto yy333; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy335; + goto yy334; + } else { + if (yych <= 0xF0) goto yy336; + if (yych <= 0xF3) goto yy337; + if (yych <= 0xF4) goto yy338; + } + } +yy329: + ++p; +yy330: + { return 0; } +yy331: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) goto yy330; + if (yych <= '\t') goto yy340; + goto yy330; + } else { + if (yych <= 0x7F) goto yy340; + if (yych <= 0xC1) goto yy330; + if (yych <= 0xF4) goto yy340; + goto yy330; + } +yy332: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy330; + if (yych <= 0xBF) goto yy339; + goto yy330; +yy333: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) goto yy330; + if (yych <= 0xBF) goto yy345; + goto yy330; +yy334: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy330; + if (yych <= 0xBF) goto yy345; + goto yy330; +yy335: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy330; + if (yych <= 0x9F) goto yy345; + goto yy330; +yy336: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) goto yy330; + if (yych <= 0xBF) goto yy347; + goto yy330; +yy337: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy330; + if (yych <= 0xBF) goto yy347; + goto yy330; +yy338: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy330; + if (yych <= 0x8F) goto yy347; + goto yy330; +yy339: + yych = *++p; +yy340: + if (yybm[0+yych] & 64) { + goto yy339; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy341; + if (yych <= '>') goto yy342; + } else { + if (yych <= 0xDF) goto yy345; + if (yych <= 0xE0) goto yy346; + goto yy347; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy348; + if (yych <= 0xEF) goto yy347; + goto yy349; + } else { + if (yych <= 0xF3) goto yy350; + if (yych <= 0xF4) goto yy351; + } + } +yy341: + p = marker; + if (yyaccept == 0) { + goto yy330; + } else { + goto yy344; + } +yy342: + yyaccept = 1; + yych = *(marker = ++p); + if (yybm[0+yych] & 64) { + goto yy339; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy344; + if (yych <= '>') goto yy342; + } else { + if (yych <= 0xDF) goto yy345; + if (yych <= 0xE0) goto yy346; + goto yy347; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy348; + if (yych <= 0xEF) goto yy347; + goto yy349; + } else { + if (yych <= 0xF3) goto yy350; + if (yych <= 0xF4) goto yy351; + } + } +yy344: + { return (bufsize_t)(p - start); } +yy345: + yych = *++p; + if (yych <= 0x7F) goto yy341; + if (yych <= 0xBF) goto yy339; + goto yy341; +yy346: + yych = *++p; + if (yych <= 0x9F) goto yy341; + if (yych <= 0xBF) goto yy345; + goto yy341; +yy347: + yych = *++p; + if (yych <= 0x7F) goto yy341; + if (yych <= 0xBF) goto yy345; + goto yy341; +yy348: + yych = *++p; + if (yych <= 0x7F) goto yy341; + if (yych <= 0x9F) goto yy345; + goto yy341; +yy349: + yych = *++p; + if (yych <= 0x8F) goto yy341; + if (yych <= 0xBF) goto yy347; + goto yy341; +yy350: + yych = *++p; + if (yych <= 0x7F) goto yy341; + if (yych <= 0xBF) goto yy347; + goto yy341; +yy351: + yych = *++p; + if (yych <= 0x7F) goto yy341; + if (yych <= 0x8F) goto yy347; + goto yy341; +} + +} + +// Try to match an HTML block tag start line, returning +// an integer code for the type of block (1-6, matching the spec). +// #7 is handled by a separate function, below. +bufsize_t _scan_html_block_start(const unsigned char *p) +{ + const unsigned char *marker = NULL; + +{ + unsigned char yych; + yych = *p; + if (yych == '<') goto yy356; + ++p; +yy355: + { return 0; } +yy356: + yych = *(marker = ++p); + switch (yych) { + case '!': goto yy357; + case '/': goto yy359; + case '?': goto yy360; + case 'A': + case 'a': goto yy362; + case 'B': + case 'b': goto yy363; + case 'C': + case 'c': goto yy364; + case 'D': + case 'd': goto yy365; + case 'F': + case 'f': goto yy366; + case 'H': + case 'h': goto yy367; + case 'I': + case 'i': goto yy368; + case 'L': + case 'l': goto yy369; + case 'M': + case 'm': goto yy370; + case 'N': + case 'n': goto yy371; + case 'O': + case 'o': goto yy372; + case 'P': + case 'p': goto yy373; + case 'S': + case 's': goto yy374; + case 'T': + case 't': goto yy375; + case 'U': + case 'u': goto yy376; + default: goto yy355; + } +yy357: + yych = *++p; + if (yych <= '@') { + if (yych == '-') goto yy377; + } else { + if (yych <= 'Z') goto yy378; + if (yych <= '[') goto yy380; + } +yy358: + p = marker; + goto yy355; +yy359: + yych = *++p; + switch (yych) { + case 'A': + case 'a': goto yy362; + case 'B': + case 'b': goto yy363; + case 'C': + case 'c': goto yy364; + case 'D': + case 'd': goto yy365; + case 'F': + case 'f': goto yy366; + case 'H': + case 'h': goto yy367; + case 'I': + case 'i': goto yy368; + case 'L': + case 'l': goto yy369; + case 'M': + case 'm': goto yy370; + case 'N': + case 'n': goto yy371; + case 'O': + case 'o': goto yy372; + case 'P': + case 'p': goto yy381; + case 'S': + case 's': goto yy382; + case 'T': + case 't': goto yy375; + case 'U': + case 'u': goto yy376; + default: goto yy358; + } +yy360: + ++p; + { return 3; } +yy362: + yych = *++p; + if (yych <= 'S') { + if (yych <= 'D') { + if (yych <= 'C') goto yy358; + goto yy383; + } else { + if (yych <= 'Q') goto yy358; + if (yych <= 'R') goto yy384; + goto yy385; + } + } else { + if (yych <= 'q') { + if (yych == 'd') goto yy383; + goto yy358; + } else { + if (yych <= 'r') goto yy384; + if (yych <= 's') goto yy385; + goto yy358; + } + } +yy363: + yych = *++p; + if (yych <= 'O') { + if (yych <= 'K') { + if (yych == 'A') goto yy386; + goto yy358; + } else { + if (yych <= 'L') goto yy387; + if (yych <= 'N') goto yy358; + goto yy388; + } + } else { + if (yych <= 'k') { + if (yych == 'a') goto yy386; + goto yy358; + } else { + if (yych <= 'l') goto yy387; + if (yych == 'o') goto yy388; + goto yy358; + } + } +yy364: + yych = *++p; + if (yych <= 'O') { + if (yych <= 'D') { + if (yych == 'A') goto yy389; + goto yy358; + } else { + if (yych <= 'E') goto yy390; + if (yych <= 'N') goto yy358; + goto yy391; + } + } else { + if (yych <= 'd') { + if (yych == 'a') goto yy389; + goto yy358; + } else { + if (yych <= 'e') goto yy390; + if (yych == 'o') goto yy391; + goto yy358; + } + } +yy365: + yych = *++p; + switch (yych) { + case 'D': + case 'L': + case 'T': + case 'd': + case 'l': + case 't': goto yy392; + case 'E': + case 'e': goto yy393; + case 'I': + case 'i': goto yy394; + default: goto yy358; + } +yy366: + yych = *++p; + if (yych <= 'R') { + if (yych <= 'N') { + if (yych == 'I') goto yy395; + goto yy358; + } else { + if (yych <= 'O') goto yy396; + if (yych <= 'Q') goto yy358; + goto yy397; + } + } else { + if (yych <= 'n') { + if (yych == 'i') goto yy395; + goto yy358; + } else { + if (yych <= 'o') goto yy396; + if (yych == 'r') goto yy397; + goto yy358; + } + } +yy367: + yych = *++p; + if (yych <= 'S') { + if (yych <= 'D') { + if (yych <= '0') goto yy358; + if (yych <= '6') goto yy392; + goto yy358; + } else { + if (yych <= 'E') goto yy398; + if (yych == 'R') goto yy392; + goto yy358; + } + } else { + if (yych <= 'q') { + if (yych <= 'T') goto yy399; + if (yych == 'e') goto yy398; + goto yy358; + } else { + if (yych <= 'r') goto yy392; + if (yych == 't') goto yy399; + goto yy358; + } + } +yy368: + yych = *++p; + if (yych == 'F') goto yy400; + if (yych == 'f') goto yy400; + goto yy358; +yy369: + yych = *++p; + if (yych <= 'I') { + if (yych == 'E') goto yy401; + if (yych <= 'H') goto yy358; + goto yy402; + } else { + if (yych <= 'e') { + if (yych <= 'd') goto yy358; + goto yy401; + } else { + if (yych == 'i') goto yy402; + goto yy358; + } + } +yy370: + yych = *++p; + if (yych <= 'E') { + if (yych == 'A') goto yy403; + if (yych <= 'D') goto yy358; + goto yy404; + } else { + if (yych <= 'a') { + if (yych <= '`') goto yy358; + goto yy403; + } else { + if (yych == 'e') goto yy404; + goto yy358; + } + } +yy371: + yych = *++p; + if (yych <= 'O') { + if (yych == 'A') goto yy405; + if (yych <= 'N') goto yy358; + goto yy406; + } else { + if (yych <= 'a') { + if (yych <= '`') goto yy358; + goto yy405; + } else { + if (yych == 'o') goto yy406; + goto yy358; + } + } +yy372: + yych = *++p; + if (yych <= 'P') { + if (yych == 'L') goto yy392; + if (yych <= 'O') goto yy358; + goto yy407; + } else { + if (yych <= 'l') { + if (yych <= 'k') goto yy358; + goto yy392; + } else { + if (yych == 'p') goto yy407; + goto yy358; + } + } +yy373: + yych = *++p; + if (yych <= '>') { + if (yych <= ' ') { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + if (yych <= 0x1F) goto yy358; + goto yy408; + } else { + if (yych == '/') goto yy410; + if (yych <= '=') goto yy358; + goto yy408; + } + } else { + if (yych <= 'R') { + if (yych == 'A') goto yy411; + if (yych <= 'Q') goto yy358; + goto yy412; + } else { + if (yych <= 'a') { + if (yych <= '`') goto yy358; + goto yy411; + } else { + if (yych == 'r') goto yy412; + goto yy358; + } + } + } +yy374: + yych = *++p; + switch (yych) { + case 'C': + case 'c': goto yy413; + case 'E': + case 'e': goto yy414; + case 'O': + case 'o': goto yy415; + case 'T': + case 't': goto yy416; + case 'U': + case 'u': goto yy417; + default: goto yy358; + } +yy375: + yych = *++p; + switch (yych) { + case 'A': + case 'a': goto yy418; + case 'B': + case 'b': goto yy419; + case 'D': + case 'd': goto yy392; + case 'F': + case 'f': goto yy420; + case 'H': + case 'h': goto yy421; + case 'I': + case 'i': goto yy422; + case 'R': + case 'r': goto yy423; + default: goto yy358; + } +yy376: + yych = *++p; + if (yych == 'L') goto yy392; + if (yych == 'l') goto yy392; + goto yy358; +yy377: + yych = *++p; + if (yych == '-') goto yy424; + goto yy358; +yy378: + ++p; + { return 4; } +yy380: + yych = *++p; + if (yych == 'C') goto yy426; + if (yych == 'c') goto yy426; + goto yy358; +yy381: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + goto yy358; + } else { + if (yych <= ' ') goto yy408; + if (yych <= '.') goto yy358; + goto yy410; + } + } else { + if (yych <= '@') { + if (yych == '>') goto yy408; + goto yy358; + } else { + if (yych <= 'A') goto yy411; + if (yych == 'a') goto yy411; + goto yy358; + } + } +yy382: + yych = *++p; + if (yych <= 'U') { + if (yych <= 'N') { + if (yych == 'E') goto yy414; + goto yy358; + } else { + if (yych <= 'O') goto yy415; + if (yych <= 'T') goto yy358; + goto yy417; + } + } else { + if (yych <= 'n') { + if (yych == 'e') goto yy414; + goto yy358; + } else { + if (yych <= 'o') goto yy415; + if (yych == 'u') goto yy417; + goto yy358; + } + } +yy383: + yych = *++p; + if (yych == 'D') goto yy427; + if (yych == 'd') goto yy427; + goto yy358; +yy384: + yych = *++p; + if (yych == 'T') goto yy428; + if (yych == 't') goto yy428; + goto yy358; +yy385: + yych = *++p; + if (yych == 'I') goto yy429; + if (yych == 'i') goto yy429; + goto yy358; +yy386: + yych = *++p; + if (yych == 'S') goto yy430; + if (yych == 's') goto yy430; + goto yy358; +yy387: + yych = *++p; + if (yych == 'O') goto yy431; + if (yych == 'o') goto yy431; + goto yy358; +yy388: + yych = *++p; + if (yych == 'D') goto yy432; + if (yych == 'd') goto yy432; + goto yy358; +yy389: + yych = *++p; + if (yych == 'P') goto yy433; + if (yych == 'p') goto yy433; + goto yy358; +yy390: + yych = *++p; + if (yych == 'N') goto yy434; + if (yych == 'n') goto yy434; + goto yy358; +yy391: + yych = *++p; + if (yych == 'L') goto yy435; + if (yych == 'l') goto yy435; + goto yy358; +yy392: + yych = *++p; + if (yych <= ' ') { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + if (yych <= 0x1F) goto yy358; + goto yy408; + } else { + if (yych <= '/') { + if (yych <= '.') goto yy358; + goto yy410; + } else { + if (yych == '>') goto yy408; + goto yy358; + } + } +yy393: + yych = *++p; + if (yych == 'T') goto yy436; + if (yych == 't') goto yy436; + goto yy358; +yy394: + yych = *++p; + if (yych <= 'V') { + if (yych <= 'Q') { + if (yych == 'A') goto yy437; + goto yy358; + } else { + if (yych <= 'R') goto yy392; + if (yych <= 'U') goto yy358; + goto yy392; + } + } else { + if (yych <= 'q') { + if (yych == 'a') goto yy437; + goto yy358; + } else { + if (yych <= 'r') goto yy392; + if (yych == 'v') goto yy392; + goto yy358; + } + } +yy395: + yych = *++p; + if (yych <= 'G') { + if (yych == 'E') goto yy438; + if (yych <= 'F') goto yy358; + goto yy439; + } else { + if (yych <= 'e') { + if (yych <= 'd') goto yy358; + goto yy438; + } else { + if (yych == 'g') goto yy439; + goto yy358; + } + } +yy396: + yych = *++p; + if (yych <= 'R') { + if (yych == 'O') goto yy434; + if (yych <= 'Q') goto yy358; + goto yy440; + } else { + if (yych <= 'o') { + if (yych <= 'n') goto yy358; + goto yy434; + } else { + if (yych == 'r') goto yy440; + goto yy358; + } + } +yy397: + yych = *++p; + if (yych == 'A') goto yy441; + if (yych == 'a') goto yy441; + goto yy358; +yy398: + yych = *++p; + if (yych == 'A') goto yy442; + if (yych == 'a') goto yy442; + goto yy358; +yy399: + yych = *++p; + if (yych == 'M') goto yy376; + if (yych == 'm') goto yy376; + goto yy358; +yy400: + yych = *++p; + if (yych == 'R') goto yy443; + if (yych == 'r') goto yy443; + goto yy358; +yy401: + yych = *++p; + if (yych == 'G') goto yy444; + if (yych == 'g') goto yy444; + goto yy358; +yy402: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + goto yy358; + } else { + if (yych <= ' ') goto yy408; + if (yych <= '.') goto yy358; + goto yy410; + } + } else { + if (yych <= 'M') { + if (yych == '>') goto yy408; + goto yy358; + } else { + if (yych <= 'N') goto yy445; + if (yych == 'n') goto yy445; + goto yy358; + } + } +yy403: + yych = *++p; + if (yych == 'I') goto yy446; + if (yych == 'i') goto yy446; + goto yy358; +yy404: + yych = *++p; + if (yych == 'N') goto yy447; + if (yych == 'n') goto yy447; + goto yy358; +yy405: + yych = *++p; + if (yych == 'V') goto yy392; + if (yych == 'v') goto yy392; + goto yy358; +yy406: + yych = *++p; + if (yych == 'F') goto yy448; + if (yych == 'f') goto yy448; + goto yy358; +yy407: + yych = *++p; + if (yych == 'T') goto yy449; + if (yych == 't') goto yy449; + goto yy358; +yy408: + ++p; + { return 6; } +yy410: + yych = *++p; + if (yych == '>') goto yy408; + goto yy358; +yy411: + yych = *++p; + if (yych == 'R') goto yy450; + if (yych == 'r') goto yy450; + goto yy358; +yy412: + yych = *++p; + if (yych == 'E') goto yy451; + if (yych == 'e') goto yy451; + goto yy358; +yy413: + yych = *++p; + if (yych == 'R') goto yy452; + if (yych == 'r') goto yy452; + goto yy358; +yy414: + yych = *++p; + if (yych == 'C') goto yy433; + if (yych == 'c') goto yy433; + goto yy358; +yy415: + yych = *++p; + if (yych == 'U') goto yy453; + if (yych == 'u') goto yy453; + goto yy358; +yy416: + yych = *++p; + if (yych == 'Y') goto yy454; + if (yych == 'y') goto yy454; + goto yy358; +yy417: + yych = *++p; + if (yych == 'M') goto yy455; + if (yych == 'm') goto yy455; + goto yy358; +yy418: + yych = *++p; + if (yych == 'B') goto yy456; + if (yych == 'b') goto yy456; + goto yy358; +yy419: + yych = *++p; + if (yych == 'O') goto yy388; + if (yych == 'o') goto yy388; + goto yy358; +yy420: + yych = *++p; + if (yych == 'O') goto yy457; + if (yych == 'o') goto yy457; + goto yy358; +yy421: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + goto yy358; + } else { + if (yych <= ' ') goto yy408; + if (yych <= '.') goto yy358; + goto yy410; + } + } else { + if (yych <= 'D') { + if (yych == '>') goto yy408; + goto yy358; + } else { + if (yych <= 'E') goto yy458; + if (yych == 'e') goto yy458; + goto yy358; + } + } +yy422: + yych = *++p; + if (yych == 'T') goto yy456; + if (yych == 't') goto yy456; + goto yy358; +yy423: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + goto yy358; + } else { + if (yych <= ' ') goto yy408; + if (yych <= '.') goto yy358; + goto yy410; + } + } else { + if (yych <= '@') { + if (yych == '>') goto yy408; + goto yy358; + } else { + if (yych <= 'A') goto yy459; + if (yych == 'a') goto yy459; + goto yy358; + } + } +yy424: + ++p; + { return 2; } +yy426: + yych = *++p; + if (yych == 'D') goto yy460; + if (yych == 'd') goto yy460; + goto yy358; +yy427: + yych = *++p; + if (yych == 'R') goto yy461; + if (yych == 'r') goto yy461; + goto yy358; +yy428: + yych = *++p; + if (yych == 'I') goto yy462; + if (yych == 'i') goto yy462; + goto yy358; +yy429: + yych = *++p; + if (yych == 'D') goto yy463; + if (yych == 'd') goto yy463; + goto yy358; +yy430: + yych = *++p; + if (yych == 'E') goto yy464; + if (yych == 'e') goto yy464; + goto yy358; +yy431: + yych = *++p; + if (yych == 'C') goto yy465; + if (yych == 'c') goto yy465; + goto yy358; +yy432: + yych = *++p; + if (yych == 'Y') goto yy392; + if (yych == 'y') goto yy392; + goto yy358; +yy433: + yych = *++p; + if (yych == 'T') goto yy466; + if (yych == 't') goto yy466; + goto yy358; +yy434: + yych = *++p; + if (yych == 'T') goto yy467; + if (yych == 't') goto yy467; + goto yy358; +yy435: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + goto yy358; + } else { + if (yych <= ' ') goto yy408; + if (yych <= '.') goto yy358; + goto yy410; + } + } else { + if (yych <= 'F') { + if (yych == '>') goto yy408; + goto yy358; + } else { + if (yych <= 'G') goto yy468; + if (yych == 'g') goto yy468; + goto yy358; + } + } +yy436: + yych = *++p; + if (yych == 'A') goto yy469; + if (yych == 'a') goto yy469; + goto yy358; +yy437: + yych = *++p; + if (yych == 'L') goto yy470; + if (yych == 'l') goto yy470; + goto yy358; +yy438: + yych = *++p; + if (yych == 'L') goto yy471; + if (yych == 'l') goto yy471; + goto yy358; +yy439: + yych = *++p; + if (yych <= 'U') { + if (yych == 'C') goto yy472; + if (yych <= 'T') goto yy358; + goto yy473; + } else { + if (yych <= 'c') { + if (yych <= 'b') goto yy358; + goto yy472; + } else { + if (yych == 'u') goto yy473; + goto yy358; + } + } +yy440: + yych = *++p; + if (yych == 'M') goto yy392; + if (yych == 'm') goto yy392; + goto yy358; +yy441: + yych = *++p; + if (yych == 'M') goto yy474; + if (yych == 'm') goto yy474; + goto yy358; +yy442: + yych = *++p; + if (yych == 'D') goto yy475; + if (yych == 'd') goto yy475; + goto yy358; +yy443: + yych = *++p; + if (yych == 'A') goto yy476; + if (yych == 'a') goto yy476; + goto yy358; +yy444: + yych = *++p; + if (yych == 'E') goto yy477; + if (yych == 'e') goto yy477; + goto yy358; +yy445: + yych = *++p; + if (yych == 'K') goto yy392; + if (yych == 'k') goto yy392; + goto yy358; +yy446: + yych = *++p; + if (yych == 'N') goto yy392; + if (yych == 'n') goto yy392; + goto yy358; +yy447: + yych = *++p; + if (yych == 'U') goto yy478; + if (yych == 'u') goto yy478; + goto yy358; +yy448: + yych = *++p; + if (yych == 'R') goto yy479; + if (yych == 'r') goto yy479; + goto yy358; +yy449: + yych = *++p; + if (yych <= 'I') { + if (yych == 'G') goto yy468; + if (yych <= 'H') goto yy358; + goto yy480; + } else { + if (yych <= 'g') { + if (yych <= 'f') goto yy358; + goto yy468; + } else { + if (yych == 'i') goto yy480; + goto yy358; + } + } +yy450: + yych = *++p; + if (yych == 'A') goto yy440; + if (yych == 'a') goto yy440; + goto yy358; +yy451: + yych = *++p; + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy481; + goto yy358; + } else { + if (yych <= ' ') goto yy481; + if (yych == '>') goto yy481; + goto yy358; + } +yy452: + yych = *++p; + if (yych == 'I') goto yy483; + if (yych == 'i') goto yy483; + goto yy358; +yy453: + yych = *++p; + if (yych == 'R') goto yy484; + if (yych == 'r') goto yy484; + goto yy358; +yy454: + yych = *++p; + if (yych == 'L') goto yy412; + if (yych == 'l') goto yy412; + goto yy358; +yy455: + yych = *++p; + if (yych == 'M') goto yy485; + if (yych == 'm') goto yy485; + goto yy358; +yy456: + yych = *++p; + if (yych == 'L') goto yy463; + if (yych == 'l') goto yy463; + goto yy358; +yy457: + yych = *++p; + if (yych == 'O') goto yy486; + if (yych == 'o') goto yy486; + goto yy358; +yy458: + yych = *++p; + if (yych == 'A') goto yy487; + if (yych == 'a') goto yy487; + goto yy358; +yy459: + yych = *++p; + if (yych == 'C') goto yy445; + if (yych == 'c') goto yy445; + goto yy358; +yy460: + yych = *++p; + if (yych == 'A') goto yy488; + if (yych == 'a') goto yy488; + goto yy358; +yy461: + yych = *++p; + if (yych == 'E') goto yy489; + if (yych == 'e') goto yy489; + goto yy358; +yy462: + yych = *++p; + if (yych == 'C') goto yy456; + if (yych == 'c') goto yy456; + goto yy358; +yy463: + yych = *++p; + if (yych == 'E') goto yy392; + if (yych == 'e') goto yy392; + goto yy358; +yy464: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + goto yy358; + } else { + if (yych <= ' ') goto yy408; + if (yych <= '.') goto yy358; + goto yy410; + } + } else { + if (yych <= 'E') { + if (yych == '>') goto yy408; + goto yy358; + } else { + if (yych <= 'F') goto yy490; + if (yych == 'f') goto yy490; + goto yy358; + } + } +yy465: + yych = *++p; + if (yych == 'K') goto yy491; + if (yych == 'k') goto yy491; + goto yy358; +yy466: + yych = *++p; + if (yych == 'I') goto yy480; + if (yych == 'i') goto yy480; + goto yy358; +yy467: + yych = *++p; + if (yych == 'E') goto yy492; + if (yych == 'e') goto yy492; + goto yy358; +yy468: + yych = *++p; + if (yych == 'R') goto yy493; + if (yych == 'r') goto yy493; + goto yy358; +yy469: + yych = *++p; + if (yych == 'I') goto yy494; + if (yych == 'i') goto yy494; + goto yy358; +yy470: + yych = *++p; + if (yych == 'O') goto yy495; + if (yych == 'o') goto yy495; + goto yy358; +yy471: + yych = *++p; + if (yych == 'D') goto yy496; + if (yych == 'd') goto yy496; + goto yy358; +yy472: + yych = *++p; + if (yych == 'A') goto yy389; + if (yych == 'a') goto yy389; + goto yy358; +yy473: + yych = *++p; + if (yych == 'R') goto yy463; + if (yych == 'r') goto yy463; + goto yy358; +yy474: + yych = *++p; + if (yych == 'E') goto yy497; + if (yych == 'e') goto yy497; + goto yy358; +yy475: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + goto yy358; + } else { + if (yych <= ' ') goto yy408; + if (yych <= '.') goto yy358; + goto yy410; + } + } else { + if (yych <= 'D') { + if (yych == '>') goto yy408; + goto yy358; + } else { + if (yych <= 'E') goto yy492; + if (yych == 'e') goto yy492; + goto yy358; + } + } +yy476: + yych = *++p; + if (yych == 'M') goto yy463; + if (yych == 'm') goto yy463; + goto yy358; +yy477: + yych = *++p; + if (yych == 'N') goto yy487; + if (yych == 'n') goto yy487; + goto yy358; +yy478: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + goto yy358; + } else { + if (yych <= ' ') goto yy408; + if (yych <= '.') goto yy358; + goto yy410; + } + } else { + if (yych <= 'H') { + if (yych == '>') goto yy408; + goto yy358; + } else { + if (yych <= 'I') goto yy498; + if (yych == 'i') goto yy498; + goto yy358; + } + } +yy479: + yych = *++p; + if (yych == 'A') goto yy499; + if (yych == 'a') goto yy499; + goto yy358; +yy480: + yych = *++p; + if (yych == 'O') goto yy446; + if (yych == 'o') goto yy446; + goto yy358; +yy481: + ++p; + { return 1; } +yy483: + yych = *++p; + if (yych == 'P') goto yy500; + if (yych == 'p') goto yy500; + goto yy358; +yy484: + yych = *++p; + if (yych == 'C') goto yy463; + if (yych == 'c') goto yy463; + goto yy358; +yy485: + yych = *++p; + if (yych == 'A') goto yy501; + if (yych == 'a') goto yy501; + goto yy358; +yy486: + yych = *++p; + if (yych == 'T') goto yy392; + if (yych == 't') goto yy392; + goto yy358; +yy487: + yych = *++p; + if (yych == 'D') goto yy392; + if (yych == 'd') goto yy392; + goto yy358; +yy488: + yych = *++p; + if (yych == 'T') goto yy502; + if (yych == 't') goto yy502; + goto yy358; +yy489: + yych = *++p; + if (yych == 'S') goto yy503; + if (yych == 's') goto yy503; + goto yy358; +yy490: + yych = *++p; + if (yych == 'O') goto yy504; + if (yych == 'o') goto yy504; + goto yy358; +yy491: + yych = *++p; + if (yych == 'Q') goto yy505; + if (yych == 'q') goto yy505; + goto yy358; +yy492: + yych = *++p; + if (yych == 'R') goto yy392; + if (yych == 'r') goto yy392; + goto yy358; +yy493: + yych = *++p; + if (yych == 'O') goto yy506; + if (yych == 'o') goto yy506; + goto yy358; +yy494: + yych = *++p; + if (yych == 'L') goto yy503; + if (yych == 'l') goto yy503; + goto yy358; +yy495: + yych = *++p; + if (yych == 'G') goto yy392; + if (yych == 'g') goto yy392; + goto yy358; +yy496: + yych = *++p; + if (yych == 'S') goto yy507; + if (yych == 's') goto yy507; + goto yy358; +yy497: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy358; + if (yych <= '\r') goto yy408; + goto yy358; + } else { + if (yych <= ' ') goto yy408; + if (yych <= '.') goto yy358; + goto yy410; + } + } else { + if (yych <= 'R') { + if (yych == '>') goto yy408; + goto yy358; + } else { + if (yych <= 'S') goto yy507; + if (yych == 's') goto yy507; + goto yy358; + } + } +yy498: + yych = *++p; + if (yych == 'T') goto yy508; + if (yych == 't') goto yy508; + goto yy358; +yy499: + yych = *++p; + if (yych == 'M') goto yy509; + if (yych == 'm') goto yy509; + goto yy358; +yy500: + yych = *++p; + if (yych == 'T') goto yy451; + if (yych == 't') goto yy451; + goto yy358; +yy501: + yych = *++p; + if (yych == 'R') goto yy432; + if (yych == 'r') goto yy432; + goto yy358; +yy502: + yych = *++p; + if (yych == 'A') goto yy510; + if (yych == 'a') goto yy510; + goto yy358; +yy503: + yych = *++p; + if (yych == 'S') goto yy392; + if (yych == 's') goto yy392; + goto yy358; +yy504: + yych = *++p; + if (yych == 'N') goto yy486; + if (yych == 'n') goto yy486; + goto yy358; +yy505: + yych = *++p; + if (yych == 'U') goto yy511; + if (yych == 'u') goto yy511; + goto yy358; +yy506: + yych = *++p; + if (yych == 'U') goto yy512; + if (yych == 'u') goto yy512; + goto yy358; +yy507: + yych = *++p; + if (yych == 'E') goto yy486; + if (yych == 'e') goto yy486; + goto yy358; +yy508: + yych = *++p; + if (yych == 'E') goto yy440; + if (yych == 'e') goto yy440; + goto yy358; +yy509: + yych = *++p; + if (yych == 'E') goto yy503; + if (yych == 'e') goto yy503; + goto yy358; +yy510: + yych = *++p; + if (yych == '[') goto yy513; + goto yy358; +yy511: + yych = *++p; + if (yych == 'O') goto yy515; + if (yych == 'o') goto yy515; + goto yy358; +yy512: + yych = *++p; + if (yych == 'P') goto yy392; + if (yych == 'p') goto yy392; + goto yy358; +yy513: + ++p; + { return 5; } +yy515: + yych = *++p; + if (yych == 'T') goto yy463; + if (yych == 't') goto yy463; + goto yy358; +} + +} + +// Try to match an HTML block tag start line of type 7, returning +// 7 if successful, 0 if not. +bufsize_t _scan_html_block_start_7(const unsigned char *p) +{ + const unsigned char *marker = NULL; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 224, 224, 224, 224, 224, 224, 224, + 224, 198, 210, 194, 198, 194, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 198, 224, 128, 224, 224, 224, 224, 64, + 224, 224, 224, 224, 224, 233, 232, 224, + 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 232, 224, 192, 192, 192, 224, + 224, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 224, 224, 224, 224, 232, + 192, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 224, 224, 224, 224, 224, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych == '<') goto yy520; + ++p; +yy519: + { return 0; } +yy520: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '@') { + if (yych != '/') goto yy519; + } else { + if (yych <= 'Z') goto yy523; + if (yych <= '`') goto yy519; + if (yych <= 'z') goto yy523; + goto yy519; + } + yych = *++p; + if (yych <= '@') goto yy522; + if (yych <= 'Z') goto yy525; + if (yych <= '`') goto yy522; + if (yych <= 'z') goto yy525; +yy522: + p = marker; + if (yyaccept == 0) { + goto yy519; + } else { + goto yy538; + } +yy523: + yych = *++p; + if (yybm[0+yych] & 2) { + goto yy527; + } + if (yych <= '=') { + if (yych <= '.') { + if (yych == '-') goto yy523; + goto yy522; + } else { + if (yych <= '/') goto yy529; + if (yych <= '9') goto yy523; + goto yy522; + } + } else { + if (yych <= 'Z') { + if (yych <= '>') goto yy530; + if (yych <= '@') goto yy522; + goto yy523; + } else { + if (yych <= '`') goto yy522; + if (yych <= 'z') goto yy523; + goto yy522; + } + } +yy525: + yych = *++p; + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy522; + if (yych <= '\r') goto yy532; + goto yy522; + } else { + if (yych <= ' ') goto yy532; + if (yych == '-') goto yy525; + goto yy522; + } + } else { + if (yych <= '@') { + if (yych <= '9') goto yy525; + if (yych == '>') goto yy530; + goto yy522; + } else { + if (yych <= 'Z') goto yy525; + if (yych <= '`') goto yy522; + if (yych <= 'z') goto yy525; + goto yy522; + } + } +yy527: + yych = *++p; + if (yybm[0+yych] & 2) { + goto yy527; + } + if (yych <= '>') { + if (yych <= '9') { + if (yych != '/') goto yy522; + } else { + if (yych <= ':') goto yy534; + if (yych <= '=') goto yy522; + goto yy530; + } + } else { + if (yych <= '^') { + if (yych <= '@') goto yy522; + if (yych <= 'Z') goto yy534; + goto yy522; + } else { + if (yych == '`') goto yy522; + if (yych <= 'z') goto yy534; + goto yy522; + } + } +yy529: + yych = *++p; + if (yych != '>') goto yy522; +yy530: + yych = *++p; + if (yybm[0+yych] & 4) { + goto yy530; + } + if (yych <= 0x08) goto yy522; + if (yych <= '\n') goto yy536; + if (yych <= '\v') goto yy522; + if (yych <= '\r') goto yy539; + goto yy522; +yy532: + yych = *++p; + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy522; + if (yych <= '\r') goto yy532; + goto yy522; + } else { + if (yych <= ' ') goto yy532; + if (yych == '>') goto yy530; + goto yy522; + } +yy534: + yych = *++p; + if (yybm[0+yych] & 8) { + goto yy534; + } + if (yych <= ',') { + if (yych <= '\r') { + if (yych <= 0x08) goto yy522; + goto yy540; + } else { + if (yych == ' ') goto yy540; + goto yy522; + } + } else { + if (yych <= '<') { + if (yych <= '/') goto yy529; + goto yy522; + } else { + if (yych <= '=') goto yy542; + if (yych <= '>') goto yy530; + goto yy522; + } + } +yy536: + yyaccept = 1; + yych = *(marker = ++p); + if (yybm[0+yych] & 4) { + goto yy530; + } + if (yych <= 0x08) goto yy538; + if (yych <= '\n') goto yy536; + if (yych <= '\v') goto yy538; + if (yych <= '\r') goto yy539; +yy538: + { return 7; } +yy539: + ++p; + goto yy538; +yy540: + yych = *++p; + if (yych <= '<') { + if (yych <= ' ') { + if (yych <= 0x08) goto yy522; + if (yych <= '\r') goto yy540; + if (yych <= 0x1F) goto yy522; + goto yy540; + } else { + if (yych <= '/') { + if (yych <= '.') goto yy522; + goto yy529; + } else { + if (yych == ':') goto yy534; + goto yy522; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '=') goto yy542; + if (yych <= '>') goto yy530; + if (yych <= '@') goto yy522; + goto yy534; + } else { + if (yych <= '_') { + if (yych <= '^') goto yy522; + goto yy534; + } else { + if (yych <= '`') goto yy522; + if (yych <= 'z') goto yy534; + goto yy522; + } + } + } +yy542: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy544; + } + if (yych <= 0xE0) { + if (yych <= '"') { + if (yych <= 0x00) goto yy522; + if (yych <= ' ') goto yy542; + goto yy546; + } else { + if (yych <= '\'') goto yy548; + if (yych <= 0xC1) goto yy522; + if (yych <= 0xDF) goto yy550; + goto yy551; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy553; + goto yy552; + } else { + if (yych <= 0xF0) goto yy554; + if (yych <= 0xF3) goto yy555; + if (yych <= 0xF4) goto yy556; + goto yy522; + } + } +yy544: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy544; + } + if (yych <= 0xE0) { + if (yych <= '=') { + if (yych <= 0x00) goto yy522; + if (yych <= ' ') goto yy527; + goto yy522; + } else { + if (yych <= '>') goto yy530; + if (yych <= 0xC1) goto yy522; + if (yych <= 0xDF) goto yy550; + goto yy551; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy553; + goto yy552; + } else { + if (yych <= 0xF0) goto yy554; + if (yych <= 0xF3) goto yy555; + if (yych <= 0xF4) goto yy556; + goto yy522; + } + } +yy546: + yych = *++p; + if (yybm[0+yych] & 64) { + goto yy546; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy522; + if (yych <= '"') goto yy557; + goto yy522; + } else { + if (yych <= 0xDF) goto yy558; + if (yych <= 0xE0) goto yy559; + goto yy560; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy561; + if (yych <= 0xEF) goto yy560; + goto yy562; + } else { + if (yych <= 0xF3) goto yy563; + if (yych <= 0xF4) goto yy564; + goto yy522; + } + } +yy548: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy548; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy522; + if (yych <= '\'') goto yy557; + goto yy522; + } else { + if (yych <= 0xDF) goto yy565; + if (yych <= 0xE0) goto yy566; + goto yy567; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy568; + if (yych <= 0xEF) goto yy567; + goto yy569; + } else { + if (yych <= 0xF3) goto yy570; + if (yych <= 0xF4) goto yy571; + goto yy522; + } + } +yy550: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0xBF) goto yy544; + goto yy522; +yy551: + yych = *++p; + if (yych <= 0x9F) goto yy522; + if (yych <= 0xBF) goto yy550; + goto yy522; +yy552: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0xBF) goto yy550; + goto yy522; +yy553: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0x9F) goto yy550; + goto yy522; +yy554: + yych = *++p; + if (yych <= 0x8F) goto yy522; + if (yych <= 0xBF) goto yy552; + goto yy522; +yy555: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0xBF) goto yy552; + goto yy522; +yy556: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0x8F) goto yy552; + goto yy522; +yy557: + yych = *++p; + if (yybm[0+yych] & 2) { + goto yy527; + } + if (yych == '/') goto yy529; + if (yych == '>') goto yy530; + goto yy522; +yy558: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0xBF) goto yy546; + goto yy522; +yy559: + yych = *++p; + if (yych <= 0x9F) goto yy522; + if (yych <= 0xBF) goto yy558; + goto yy522; +yy560: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0xBF) goto yy558; + goto yy522; +yy561: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0x9F) goto yy558; + goto yy522; +yy562: + yych = *++p; + if (yych <= 0x8F) goto yy522; + if (yych <= 0xBF) goto yy560; + goto yy522; +yy563: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0xBF) goto yy560; + goto yy522; +yy564: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0x8F) goto yy560; + goto yy522; +yy565: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0xBF) goto yy548; + goto yy522; +yy566: + yych = *++p; + if (yych <= 0x9F) goto yy522; + if (yych <= 0xBF) goto yy565; + goto yy522; +yy567: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0xBF) goto yy565; + goto yy522; +yy568: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0x9F) goto yy565; + goto yy522; +yy569: + yych = *++p; + if (yych <= 0x8F) goto yy522; + if (yych <= 0xBF) goto yy567; + goto yy522; +yy570: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0xBF) goto yy567; + goto yy522; +yy571: + yych = *++p; + if (yych <= 0x7F) goto yy522; + if (yych <= 0x8F) goto yy567; + goto yy522; +} + +} + +// Try to match an HTML block end line of type 1 +bufsize_t _scan_html_block_end_1(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 128, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= 0xDF) { + if (yych <= ';') { + if (yych <= 0x00) goto yy574; + if (yych != '\n') goto yy576; + } else { + if (yych <= '<') goto yy577; + if (yych <= 0x7F) goto yy576; + if (yych >= 0xC2) goto yy578; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy579; + if (yych == 0xED) goto yy581; + goto yy580; + } else { + if (yych <= 0xF0) goto yy582; + if (yych <= 0xF3) goto yy583; + if (yych <= 0xF4) goto yy584; + } + } +yy574: + ++p; +yy575: + { return 0; } +yy576: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) goto yy575; + if (yych <= '\t') goto yy586; + goto yy575; + } else { + if (yych <= 0x7F) goto yy586; + if (yych <= 0xC1) goto yy575; + if (yych <= 0xF4) goto yy586; + goto yy575; + } +yy577: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '.') { + if (yych <= 0x00) goto yy575; + if (yych == '\n') goto yy575; + goto yy586; + } else { + if (yych <= 0x7F) { + if (yych <= '/') goto yy597; + goto yy586; + } else { + if (yych <= 0xC1) goto yy575; + if (yych <= 0xF4) goto yy586; + goto yy575; + } + } +yy578: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy575; + if (yych <= 0xBF) goto yy585; + goto yy575; +yy579: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) goto yy575; + if (yych <= 0xBF) goto yy590; + goto yy575; +yy580: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy575; + if (yych <= 0xBF) goto yy590; + goto yy575; +yy581: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy575; + if (yych <= 0x9F) goto yy590; + goto yy575; +yy582: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) goto yy575; + if (yych <= 0xBF) goto yy592; + goto yy575; +yy583: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy575; + if (yych <= 0xBF) goto yy592; + goto yy575; +yy584: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy575; + if (yych <= 0x8F) goto yy592; + goto yy575; +yy585: + yych = *++p; +yy586: + if (yybm[0+yych] & 64) { + goto yy585; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy587; + if (yych <= '<') goto yy588; + } else { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + goto yy592; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy593; + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + } + } +yy587: + p = marker; + if (yyaccept == 0) { + goto yy575; + } else { + goto yy607; + } +yy588: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xDF) { + if (yych <= '.') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= '/') goto yy597; + if (yych <= 0x7F) goto yy585; + if (yych <= 0xC1) goto yy587; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy591; + if (yych == 0xED) goto yy593; + goto yy592; + } else { + if (yych <= 0xF0) goto yy594; + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } +yy590: + yych = *++p; + if (yych <= 0x7F) goto yy587; + if (yych <= 0xBF) goto yy585; + goto yy587; +yy591: + yych = *++p; + if (yych <= 0x9F) goto yy587; + if (yych <= 0xBF) goto yy590; + goto yy587; +yy592: + yych = *++p; + if (yych <= 0x7F) goto yy587; + if (yych <= 0xBF) goto yy590; + goto yy587; +yy593: + yych = *++p; + if (yych <= 0x7F) goto yy587; + if (yych <= 0x9F) goto yy590; + goto yy587; +yy594: + yych = *++p; + if (yych <= 0x8F) goto yy587; + if (yych <= 0xBF) goto yy592; + goto yy587; +yy595: + yych = *++p; + if (yych <= 0x7F) goto yy587; + if (yych <= 0xBF) goto yy592; + goto yy587; +yy596: + yych = *++p; + if (yych <= 0x7F) goto yy587; + if (yych <= 0x8F) goto yy592; + goto yy587; +yy597: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 's') { + if (yych <= 'P') { + if (yych <= '\t') { + if (yych <= 0x00) goto yy587; + goto yy585; + } else { + if (yych <= '\n') goto yy587; + if (yych <= 'O') goto yy585; + } + } else { + if (yych <= 'o') { + if (yych == 'S') goto yy599; + goto yy585; + } else { + if (yych <= 'p') goto yy598; + if (yych <= 'r') goto yy585; + goto yy599; + } + } + } else { + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x7F) goto yy585; + goto yy587; + } else { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + goto yy592; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy593; + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +yy598: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xC1) { + if (yych <= 'Q') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= 'q') { + if (yych <= 'R') goto yy600; + goto yy585; + } else { + if (yych <= 'r') goto yy600; + if (yych <= 0x7F) goto yy585; + goto yy587; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + if (yych <= 0xEC) goto yy592; + goto yy593; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +yy599: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 't') { + if (yych <= 'C') { + if (yych <= '\t') { + if (yych <= 0x00) goto yy587; + goto yy585; + } else { + if (yych <= '\n') goto yy587; + if (yych <= 'B') goto yy585; + goto yy601; + } + } else { + if (yych <= 'b') { + if (yych == 'T') goto yy602; + goto yy585; + } else { + if (yych <= 'c') goto yy601; + if (yych <= 's') goto yy585; + goto yy602; + } + } + } else { + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x7F) goto yy585; + goto yy587; + } else { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + goto yy592; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy593; + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +yy600: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xC1) { + if (yych <= 'D') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= 'd') { + if (yych <= 'E') goto yy603; + goto yy585; + } else { + if (yych <= 'e') goto yy603; + if (yych <= 0x7F) goto yy585; + goto yy587; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + if (yych <= 0xEC) goto yy592; + goto yy593; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +yy601: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xC1) { + if (yych <= 'Q') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= 'q') { + if (yych <= 'R') goto yy604; + goto yy585; + } else { + if (yych <= 'r') goto yy604; + if (yych <= 0x7F) goto yy585; + goto yy587; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + if (yych <= 0xEC) goto yy592; + goto yy593; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +yy602: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xC1) { + if (yych <= 'X') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= 'x') { + if (yych <= 'Y') goto yy605; + goto yy585; + } else { + if (yych <= 'y') goto yy605; + if (yych <= 0x7F) goto yy585; + goto yy587; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + if (yych <= 0xEC) goto yy592; + goto yy593; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +yy603: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xDF) { + if (yych <= '=') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= '>') goto yy606; + if (yych <= 0x7F) goto yy585; + if (yych <= 0xC1) goto yy587; + goto yy590; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy591; + if (yych == 0xED) goto yy593; + goto yy592; + } else { + if (yych <= 0xF0) goto yy594; + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } +yy604: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xC1) { + if (yych <= 'H') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= 'h') { + if (yych <= 'I') goto yy608; + goto yy585; + } else { + if (yych <= 'i') goto yy608; + if (yych <= 0x7F) goto yy585; + goto yy587; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + if (yych <= 0xEC) goto yy592; + goto yy593; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +yy605: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xC1) { + if (yych <= 'K') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= 'k') { + if (yych <= 'L') goto yy600; + goto yy585; + } else { + if (yych <= 'l') goto yy600; + if (yych <= 0x7F) goto yy585; + goto yy587; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + if (yych <= 0xEC) goto yy592; + goto yy593; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +yy606: + yyaccept = 1; + yych = *(marker = ++p); + if (yybm[0+yych] & 64) { + goto yy585; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy607; + if (yych <= '<') goto yy588; + } else { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + goto yy592; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy593; + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + } + } +yy607: + { return (bufsize_t)(p - start); } +yy608: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xC1) { + if (yych <= 'O') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= 'o') { + if (yych >= 'Q') goto yy585; + } else { + if (yych <= 'p') goto yy609; + if (yych <= 0x7F) goto yy585; + goto yy587; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + if (yych <= 0xEC) goto yy592; + goto yy593; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +yy609: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy588; + } + if (yych <= 0xC1) { + if (yych <= 'S') { + if (yych <= 0x00) goto yy587; + if (yych == '\n') goto yy587; + goto yy585; + } else { + if (yych <= 's') { + if (yych <= 'T') goto yy603; + goto yy585; + } else { + if (yych <= 't') goto yy603; + if (yych <= 0x7F) goto yy585; + goto yy587; + } + } + } else { + if (yych <= 0xED) { + if (yych <= 0xDF) goto yy590; + if (yych <= 0xE0) goto yy591; + if (yych <= 0xEC) goto yy592; + goto yy593; + } else { + if (yych <= 0xF0) { + if (yych <= 0xEF) goto yy592; + goto yy594; + } else { + if (yych <= 0xF3) goto yy595; + if (yych <= 0xF4) goto yy596; + goto yy587; + } + } + } +} + +} + +// Try to match an HTML block end line of type 2 +bufsize_t _scan_html_block_end_2(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 128, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= 0xDF) { + if (yych <= ',') { + if (yych <= 0x00) goto yy612; + if (yych != '\n') goto yy614; + } else { + if (yych <= '-') goto yy615; + if (yych <= 0x7F) goto yy614; + if (yych >= 0xC2) goto yy616; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy617; + if (yych == 0xED) goto yy619; + goto yy618; + } else { + if (yych <= 0xF0) goto yy620; + if (yych <= 0xF3) goto yy621; + if (yych <= 0xF4) goto yy622; + } + } +yy612: + ++p; +yy613: + { return 0; } +yy614: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) goto yy613; + if (yych <= '\t') goto yy624; + goto yy613; + } else { + if (yych <= 0x7F) goto yy624; + if (yych <= 0xC1) goto yy613; + if (yych <= 0xF4) goto yy624; + goto yy613; + } +yy615: + yyaccept = 0; + yych = *(marker = ++p); + if (yybm[0+yych] & 128) { + goto yy634; + } + if (yych <= '\n') { + if (yych <= 0x00) goto yy613; + if (yych <= '\t') goto yy624; + goto yy613; + } else { + if (yych <= 0x7F) goto yy624; + if (yych <= 0xC1) goto yy613; + if (yych <= 0xF4) goto yy624; + goto yy613; + } +yy616: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy613; + if (yych <= 0xBF) goto yy623; + goto yy613; +yy617: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) goto yy613; + if (yych <= 0xBF) goto yy627; + goto yy613; +yy618: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy613; + if (yych <= 0xBF) goto yy627; + goto yy613; +yy619: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy613; + if (yych <= 0x9F) goto yy627; + goto yy613; +yy620: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) goto yy613; + if (yych <= 0xBF) goto yy629; + goto yy613; +yy621: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy613; + if (yych <= 0xBF) goto yy629; + goto yy613; +yy622: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy613; + if (yych <= 0x8F) goto yy629; + goto yy613; +yy623: + yych = *++p; +yy624: + if (yybm[0+yych] & 64) { + goto yy623; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy625; + if (yych <= '-') goto yy626; + } else { + if (yych <= 0xDF) goto yy627; + if (yych <= 0xE0) goto yy628; + goto yy629; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy630; + if (yych <= 0xEF) goto yy629; + goto yy631; + } else { + if (yych <= 0xF3) goto yy632; + if (yych <= 0xF4) goto yy633; + } + } +yy625: + p = marker; + if (yyaccept == 0) { + goto yy613; + } else { + goto yy637; + } +yy626: + yych = *++p; + if (yybm[0+yych] & 64) { + goto yy623; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy625; + if (yych <= '-') goto yy634; + goto yy625; + } else { + if (yych <= 0xDF) goto yy627; + if (yych <= 0xE0) goto yy628; + goto yy629; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy630; + if (yych <= 0xEF) goto yy629; + goto yy631; + } else { + if (yych <= 0xF3) goto yy632; + if (yych <= 0xF4) goto yy633; + goto yy625; + } + } +yy627: + yych = *++p; + if (yych <= 0x7F) goto yy625; + if (yych <= 0xBF) goto yy623; + goto yy625; +yy628: + yych = *++p; + if (yych <= 0x9F) goto yy625; + if (yych <= 0xBF) goto yy627; + goto yy625; +yy629: + yych = *++p; + if (yych <= 0x7F) goto yy625; + if (yych <= 0xBF) goto yy627; + goto yy625; +yy630: + yych = *++p; + if (yych <= 0x7F) goto yy625; + if (yych <= 0x9F) goto yy627; + goto yy625; +yy631: + yych = *++p; + if (yych <= 0x8F) goto yy625; + if (yych <= 0xBF) goto yy629; + goto yy625; +yy632: + yych = *++p; + if (yych <= 0x7F) goto yy625; + if (yych <= 0xBF) goto yy629; + goto yy625; +yy633: + yych = *++p; + if (yych <= 0x7F) goto yy625; + if (yych <= 0x8F) goto yy629; + goto yy625; +yy634: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy634; + } + if (yych <= 0xDF) { + if (yych <= '=') { + if (yych <= 0x00) goto yy625; + if (yych == '\n') goto yy625; + goto yy623; + } else { + if (yych <= '>') goto yy636; + if (yych <= 0x7F) goto yy623; + if (yych <= 0xC1) goto yy625; + goto yy627; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy628; + if (yych == 0xED) goto yy630; + goto yy629; + } else { + if (yych <= 0xF0) goto yy631; + if (yych <= 0xF3) goto yy632; + if (yych <= 0xF4) goto yy633; + goto yy625; + } + } +yy636: + yyaccept = 1; + yych = *(marker = ++p); + if (yybm[0+yych] & 64) { + goto yy623; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy637; + if (yych <= '-') goto yy626; + } else { + if (yych <= 0xDF) goto yy627; + if (yych <= 0xE0) goto yy628; + goto yy629; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy630; + if (yych <= 0xEF) goto yy629; + goto yy631; + } else { + if (yych <= 0xF3) goto yy632; + if (yych <= 0xF4) goto yy633; + } + } +yy637: + { return (bufsize_t)(p - start); } +} + +} + +// Try to match an HTML block end line of type 3 +bufsize_t _scan_html_block_end_3(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 128, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= 0xDF) { + if (yych <= '>') { + if (yych <= 0x00) goto yy640; + if (yych != '\n') goto yy642; + } else { + if (yych <= '?') goto yy643; + if (yych <= 0x7F) goto yy642; + if (yych >= 0xC2) goto yy644; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy645; + if (yych == 0xED) goto yy647; + goto yy646; + } else { + if (yych <= 0xF0) goto yy648; + if (yych <= 0xF3) goto yy649; + if (yych <= 0xF4) goto yy650; + } + } +yy640: + ++p; +yy641: + { return 0; } +yy642: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) goto yy641; + if (yych <= '\t') goto yy652; + goto yy641; + } else { + if (yych <= 0x7F) goto yy652; + if (yych <= 0xC1) goto yy641; + if (yych <= 0xF4) goto yy652; + goto yy641; + } +yy643: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '=') { + if (yych <= 0x00) goto yy641; + if (yych == '\n') goto yy641; + goto yy652; + } else { + if (yych <= 0x7F) { + if (yych <= '>') goto yy663; + goto yy652; + } else { + if (yych <= 0xC1) goto yy641; + if (yych <= 0xF4) goto yy652; + goto yy641; + } + } +yy644: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy641; + if (yych <= 0xBF) goto yy651; + goto yy641; +yy645: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) goto yy641; + if (yych <= 0xBF) goto yy656; + goto yy641; +yy646: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy641; + if (yych <= 0xBF) goto yy656; + goto yy641; +yy647: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy641; + if (yych <= 0x9F) goto yy656; + goto yy641; +yy648: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) goto yy641; + if (yych <= 0xBF) goto yy658; + goto yy641; +yy649: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy641; + if (yych <= 0xBF) goto yy658; + goto yy641; +yy650: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy641; + if (yych <= 0x8F) goto yy658; + goto yy641; +yy651: + yych = *++p; +yy652: + if (yybm[0+yych] & 64) { + goto yy651; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy653; + if (yych <= '?') goto yy654; + } else { + if (yych <= 0xDF) goto yy656; + if (yych <= 0xE0) goto yy657; + goto yy658; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy659; + if (yych <= 0xEF) goto yy658; + goto yy660; + } else { + if (yych <= 0xF3) goto yy661; + if (yych <= 0xF4) goto yy662; + } + } +yy653: + p = marker; + if (yyaccept == 0) { + goto yy641; + } else { + goto yy664; + } +yy654: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy654; + } + if (yych <= 0xDF) { + if (yych <= '=') { + if (yych <= 0x00) goto yy653; + if (yych == '\n') goto yy653; + goto yy651; + } else { + if (yych <= '>') goto yy663; + if (yych <= 0x7F) goto yy651; + if (yych <= 0xC1) goto yy653; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy657; + if (yych == 0xED) goto yy659; + goto yy658; + } else { + if (yych <= 0xF0) goto yy660; + if (yych <= 0xF3) goto yy661; + if (yych <= 0xF4) goto yy662; + goto yy653; + } + } +yy656: + yych = *++p; + if (yych <= 0x7F) goto yy653; + if (yych <= 0xBF) goto yy651; + goto yy653; +yy657: + yych = *++p; + if (yych <= 0x9F) goto yy653; + if (yych <= 0xBF) goto yy656; + goto yy653; +yy658: + yych = *++p; + if (yych <= 0x7F) goto yy653; + if (yych <= 0xBF) goto yy656; + goto yy653; +yy659: + yych = *++p; + if (yych <= 0x7F) goto yy653; + if (yych <= 0x9F) goto yy656; + goto yy653; +yy660: + yych = *++p; + if (yych <= 0x8F) goto yy653; + if (yych <= 0xBF) goto yy658; + goto yy653; +yy661: + yych = *++p; + if (yych <= 0x7F) goto yy653; + if (yych <= 0xBF) goto yy658; + goto yy653; +yy662: + yych = *++p; + if (yych <= 0x7F) goto yy653; + if (yych <= 0x8F) goto yy658; + goto yy653; +yy663: + yyaccept = 1; + yych = *(marker = ++p); + if (yybm[0+yych] & 64) { + goto yy651; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy664; + if (yych <= '?') goto yy654; + } else { + if (yych <= 0xDF) goto yy656; + if (yych <= 0xE0) goto yy657; + goto yy658; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy659; + if (yych <= 0xEF) goto yy658; + goto yy660; + } else { + if (yych <= 0xF3) goto yy661; + if (yych <= 0xF4) goto yy662; + } + } +yy664: + { return (bufsize_t)(p - start); } +} + +} + +// Try to match an HTML block end line of type 4 +bufsize_t _scan_html_block_end_4(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 64, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yybm[0+yych] & 64) { + goto yy670; + } + if (yych <= 0xE0) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy667; + if (yych <= '\t') goto yy669; + } else { + if (yych <= 0x7F) goto yy669; + if (yych <= 0xC1) goto yy667; + if (yych <= 0xDF) goto yy673; + goto yy674; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy676; + goto yy675; + } else { + if (yych <= 0xF0) goto yy677; + if (yych <= 0xF3) goto yy678; + if (yych <= 0xF4) goto yy679; + } + } +yy667: + ++p; +yy668: + { return 0; } +yy669: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) goto yy668; + if (yych <= '\t') goto yy681; + goto yy668; + } else { + if (yych <= 0x7F) goto yy681; + if (yych <= 0xC1) goto yy668; + if (yych <= 0xF4) goto yy681; + goto yy668; + } +yy670: + yyaccept = 1; + yych = *(marker = ++p); + if (yybm[0+yych] & 128) { + goto yy680; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy672; + if (yych <= '>') goto yy670; + } else { + if (yych <= 0xDF) goto yy683; + if (yych <= 0xE0) goto yy684; + goto yy685; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy686; + if (yych <= 0xEF) goto yy685; + goto yy687; + } else { + if (yych <= 0xF3) goto yy688; + if (yych <= 0xF4) goto yy689; + } + } +yy672: + { return (bufsize_t)(p - start); } +yy673: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy668; + if (yych <= 0xBF) goto yy680; + goto yy668; +yy674: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) goto yy668; + if (yych <= 0xBF) goto yy683; + goto yy668; +yy675: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy668; + if (yych <= 0xBF) goto yy683; + goto yy668; +yy676: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy668; + if (yych <= 0x9F) goto yy683; + goto yy668; +yy677: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) goto yy668; + if (yych <= 0xBF) goto yy685; + goto yy668; +yy678: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy668; + if (yych <= 0xBF) goto yy685; + goto yy668; +yy679: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy668; + if (yych <= 0x8F) goto yy685; + goto yy668; +yy680: + yych = *++p; +yy681: + if (yybm[0+yych] & 128) { + goto yy680; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy682; + if (yych <= '>') goto yy670; + } else { + if (yych <= 0xDF) goto yy683; + if (yych <= 0xE0) goto yy684; + goto yy685; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy686; + if (yych <= 0xEF) goto yy685; + goto yy687; + } else { + if (yych <= 0xF3) goto yy688; + if (yych <= 0xF4) goto yy689; + } + } +yy682: + p = marker; + if (yyaccept == 0) { + goto yy668; + } else { + goto yy672; + } +yy683: + yych = *++p; + if (yych <= 0x7F) goto yy682; + if (yych <= 0xBF) goto yy680; + goto yy682; +yy684: + yych = *++p; + if (yych <= 0x9F) goto yy682; + if (yych <= 0xBF) goto yy683; + goto yy682; +yy685: + yych = *++p; + if (yych <= 0x7F) goto yy682; + if (yych <= 0xBF) goto yy683; + goto yy682; +yy686: + yych = *++p; + if (yych <= 0x7F) goto yy682; + if (yych <= 0x9F) goto yy683; + goto yy682; +yy687: + yych = *++p; + if (yych <= 0x8F) goto yy682; + if (yych <= 0xBF) goto yy685; + goto yy682; +yy688: + yych = *++p; + if (yych <= 0x7F) goto yy682; + if (yych <= 0xBF) goto yy685; + goto yy682; +yy689: + yych = *++p; + if (yych <= 0x7F) goto yy682; + if (yych <= 0x8F) goto yy685; + goto yy682; +} + +} + +// Try to match an HTML block end line of type 5 +bufsize_t _scan_html_block_end_5(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 128, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= 0xDF) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy692; + if (yych != '\n') goto yy694; + } else { + if (yych <= ']') goto yy695; + if (yych <= 0x7F) goto yy694; + if (yych >= 0xC2) goto yy696; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy697; + if (yych == 0xED) goto yy699; + goto yy698; + } else { + if (yych <= 0xF0) goto yy700; + if (yych <= 0xF3) goto yy701; + if (yych <= 0xF4) goto yy702; + } + } +yy692: + ++p; +yy693: + { return 0; } +yy694: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= '\n') { + if (yych <= 0x00) goto yy693; + if (yych <= '\t') goto yy704; + goto yy693; + } else { + if (yych <= 0x7F) goto yy704; + if (yych <= 0xC1) goto yy693; + if (yych <= 0xF4) goto yy704; + goto yy693; + } +yy695: + yyaccept = 0; + yych = *(marker = ++p); + if (yybm[0+yych] & 128) { + goto yy714; + } + if (yych <= '\n') { + if (yych <= 0x00) goto yy693; + if (yych <= '\t') goto yy704; + goto yy693; + } else { + if (yych <= 0x7F) goto yy704; + if (yych <= 0xC1) goto yy693; + if (yych <= 0xF4) goto yy704; + goto yy693; + } +yy696: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy693; + if (yych <= 0xBF) goto yy703; + goto yy693; +yy697: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x9F) goto yy693; + if (yych <= 0xBF) goto yy707; + goto yy693; +yy698: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy693; + if (yych <= 0xBF) goto yy707; + goto yy693; +yy699: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy693; + if (yych <= 0x9F) goto yy707; + goto yy693; +yy700: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x8F) goto yy693; + if (yych <= 0xBF) goto yy709; + goto yy693; +yy701: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy693; + if (yych <= 0xBF) goto yy709; + goto yy693; +yy702: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x7F) goto yy693; + if (yych <= 0x8F) goto yy709; + goto yy693; +yy703: + yych = *++p; +yy704: + if (yybm[0+yych] & 64) { + goto yy703; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy705; + if (yych <= ']') goto yy706; + } else { + if (yych <= 0xDF) goto yy707; + if (yych <= 0xE0) goto yy708; + goto yy709; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy710; + if (yych <= 0xEF) goto yy709; + goto yy711; + } else { + if (yych <= 0xF3) goto yy712; + if (yych <= 0xF4) goto yy713; + } + } +yy705: + p = marker; + if (yyaccept == 0) { + goto yy693; + } else { + goto yy717; + } +yy706: + yych = *++p; + if (yybm[0+yych] & 64) { + goto yy703; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy705; + if (yych <= ']') goto yy714; + goto yy705; + } else { + if (yych <= 0xDF) goto yy707; + if (yych <= 0xE0) goto yy708; + goto yy709; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy710; + if (yych <= 0xEF) goto yy709; + goto yy711; + } else { + if (yych <= 0xF3) goto yy712; + if (yych <= 0xF4) goto yy713; + goto yy705; + } + } +yy707: + yych = *++p; + if (yych <= 0x7F) goto yy705; + if (yych <= 0xBF) goto yy703; + goto yy705; +yy708: + yych = *++p; + if (yych <= 0x9F) goto yy705; + if (yych <= 0xBF) goto yy707; + goto yy705; +yy709: + yych = *++p; + if (yych <= 0x7F) goto yy705; + if (yych <= 0xBF) goto yy707; + goto yy705; +yy710: + yych = *++p; + if (yych <= 0x7F) goto yy705; + if (yych <= 0x9F) goto yy707; + goto yy705; +yy711: + yych = *++p; + if (yych <= 0x8F) goto yy705; + if (yych <= 0xBF) goto yy709; + goto yy705; +yy712: + yych = *++p; + if (yych <= 0x7F) goto yy705; + if (yych <= 0xBF) goto yy709; + goto yy705; +yy713: + yych = *++p; + if (yych <= 0x7F) goto yy705; + if (yych <= 0x8F) goto yy709; + goto yy705; +yy714: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy714; + } + if (yych <= 0xDF) { + if (yych <= '=') { + if (yych <= 0x00) goto yy705; + if (yych == '\n') goto yy705; + goto yy703; + } else { + if (yych <= '>') goto yy716; + if (yych <= 0x7F) goto yy703; + if (yych <= 0xC1) goto yy705; + goto yy707; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) goto yy708; + if (yych == 0xED) goto yy710; + goto yy709; + } else { + if (yych <= 0xF0) goto yy711; + if (yych <= 0xF3) goto yy712; + if (yych <= 0xF4) goto yy713; + goto yy705; + } + } +yy716: + yyaccept = 1; + yych = *(marker = ++p); + if (yybm[0+yych] & 64) { + goto yy703; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= '\n') goto yy717; + if (yych <= ']') goto yy706; + } else { + if (yych <= 0xDF) goto yy707; + if (yych <= 0xE0) goto yy708; + goto yy709; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy710; + if (yych <= 0xEF) goto yy709; + goto yy711; + } else { + if (yych <= 0xF3) goto yy712; + if (yych <= 0xF4) goto yy713; + } + } +yy717: + { return (bufsize_t)(p - start); } +} + +} + +// Try to match a link title (in single quotes, in double quotes, or +// in parentheses), returning number of chars matched. Allow one +// level of internal nesting (quotes within quotes). +bufsize_t _scan_link_title(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 192, 208, 208, 208, 208, 144, + 208, 80, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 32, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= '&') { + if (yych == '"') goto yy722; + } else { + if (yych <= '\'') goto yy723; + if (yych <= '(') goto yy724; + } + ++p; +yy721: + { return 0; } +yy722: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x00) goto yy721; + if (yych <= 0x7F) goto yy726; + if (yych <= 0xC1) goto yy721; + if (yych <= 0xF4) goto yy726; + goto yy721; +yy723: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x00) goto yy721; + if (yych <= 0x7F) goto yy740; + if (yych <= 0xC1) goto yy721; + if (yych <= 0xF4) goto yy740; + goto yy721; +yy724: + yyaccept = 0; + yych = *(marker = ++p); + if (yych <= 0x00) goto yy721; + if (yych <= 0x7F) goto yy753; + if (yych <= 0xC1) goto yy721; + if (yych <= 0xF4) goto yy753; + goto yy721; +yy725: + yych = *++p; +yy726: + if (yybm[0+yych] & 16) { + goto yy725; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy727; + if (yych <= '"') goto yy728; + goto yy730; + } else { + if (yych <= 0xC1) goto yy727; + if (yych <= 0xDF) goto yy732; + goto yy733; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy735; + goto yy734; + } else { + if (yych <= 0xF0) goto yy736; + if (yych <= 0xF3) goto yy737; + if (yych <= 0xF4) goto yy738; + } + } +yy727: + p = marker; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy721; + } else { + goto yy729; + } + } else { + if (yyaccept == 2) { + goto yy742; + } else { + goto yy755; + } + } +yy728: + ++p; +yy729: + { return (bufsize_t)(p - start); } +yy730: + yych = *++p; + if (yybm[0+yych] & 16) { + goto yy725; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy727; + if (yych <= '"') goto yy765; + goto yy730; + } else { + if (yych <= 0xC1) goto yy727; + if (yych >= 0xE0) goto yy733; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy735; + goto yy734; + } else { + if (yych <= 0xF0) goto yy736; + if (yych <= 0xF3) goto yy737; + if (yych <= 0xF4) goto yy738; + goto yy727; + } + } +yy732: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0xBF) goto yy725; + goto yy727; +yy733: + yych = *++p; + if (yych <= 0x9F) goto yy727; + if (yych <= 0xBF) goto yy732; + goto yy727; +yy734: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0xBF) goto yy732; + goto yy727; +yy735: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0x9F) goto yy732; + goto yy727; +yy736: + yych = *++p; + if (yych <= 0x8F) goto yy727; + if (yych <= 0xBF) goto yy734; + goto yy727; +yy737: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0xBF) goto yy734; + goto yy727; +yy738: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0x8F) goto yy734; + goto yy727; +yy739: + yych = *++p; +yy740: + if (yybm[0+yych] & 64) { + goto yy739; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy727; + if (yych >= '(') goto yy743; + } else { + if (yych <= 0xC1) goto yy727; + if (yych <= 0xDF) goto yy745; + goto yy746; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy748; + goto yy747; + } else { + if (yych <= 0xF0) goto yy749; + if (yych <= 0xF3) goto yy750; + if (yych <= 0xF4) goto yy751; + goto yy727; + } + } +yy741: + ++p; +yy742: + { return (bufsize_t)(p - start); } +yy743: + yych = *++p; + if (yybm[0+yych] & 64) { + goto yy739; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy727; + if (yych <= '\'') goto yy766; + goto yy743; + } else { + if (yych <= 0xC1) goto yy727; + if (yych >= 0xE0) goto yy746; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy748; + goto yy747; + } else { + if (yych <= 0xF0) goto yy749; + if (yych <= 0xF3) goto yy750; + if (yych <= 0xF4) goto yy751; + goto yy727; + } + } +yy745: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0xBF) goto yy739; + goto yy727; +yy746: + yych = *++p; + if (yych <= 0x9F) goto yy727; + if (yych <= 0xBF) goto yy745; + goto yy727; +yy747: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0xBF) goto yy745; + goto yy727; +yy748: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0x9F) goto yy745; + goto yy727; +yy749: + yych = *++p; + if (yych <= 0x8F) goto yy727; + if (yych <= 0xBF) goto yy747; + goto yy727; +yy750: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0xBF) goto yy747; + goto yy727; +yy751: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0x8F) goto yy747; + goto yy727; +yy752: + yych = *++p; +yy753: + if (yybm[0+yych] & 128) { + goto yy752; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy727; + if (yych >= '*') goto yy756; + } else { + if (yych <= 0xC1) goto yy727; + if (yych <= 0xDF) goto yy758; + goto yy759; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy761; + goto yy760; + } else { + if (yych <= 0xF0) goto yy762; + if (yych <= 0xF3) goto yy763; + if (yych <= 0xF4) goto yy764; + goto yy727; + } + } +yy754: + ++p; +yy755: + { return (bufsize_t)(p - start); } +yy756: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy752; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy727; + if (yych <= ')') goto yy767; + goto yy756; + } else { + if (yych <= 0xC1) goto yy727; + if (yych >= 0xE0) goto yy759; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy761; + goto yy760; + } else { + if (yych <= 0xF0) goto yy762; + if (yych <= 0xF3) goto yy763; + if (yych <= 0xF4) goto yy764; + goto yy727; + } + } +yy758: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0xBF) goto yy752; + goto yy727; +yy759: + yych = *++p; + if (yych <= 0x9F) goto yy727; + if (yych <= 0xBF) goto yy758; + goto yy727; +yy760: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0xBF) goto yy758; + goto yy727; +yy761: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0x9F) goto yy758; + goto yy727; +yy762: + yych = *++p; + if (yych <= 0x8F) goto yy727; + if (yych <= 0xBF) goto yy760; + goto yy727; +yy763: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0xBF) goto yy760; + goto yy727; +yy764: + yych = *++p; + if (yych <= 0x7F) goto yy727; + if (yych <= 0x8F) goto yy760; + goto yy727; +yy765: + yyaccept = 1; + yych = *(marker = ++p); + if (yybm[0+yych] & 16) { + goto yy725; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy729; + if (yych <= '"') goto yy728; + goto yy730; + } else { + if (yych <= 0xC1) goto yy729; + if (yych <= 0xDF) goto yy732; + goto yy733; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy735; + goto yy734; + } else { + if (yych <= 0xF0) goto yy736; + if (yych <= 0xF3) goto yy737; + if (yych <= 0xF4) goto yy738; + goto yy729; + } + } +yy766: + yyaccept = 2; + yych = *(marker = ++p); + if (yybm[0+yych] & 64) { + goto yy739; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy742; + if (yych <= '\'') goto yy741; + goto yy743; + } else { + if (yych <= 0xC1) goto yy742; + if (yych <= 0xDF) goto yy745; + goto yy746; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy748; + goto yy747; + } else { + if (yych <= 0xF0) goto yy749; + if (yych <= 0xF3) goto yy750; + if (yych <= 0xF4) goto yy751; + goto yy742; + } + } +yy767: + yyaccept = 3; + yych = *(marker = ++p); + if (yybm[0+yych] & 128) { + goto yy752; + } + if (yych <= 0xE0) { + if (yych <= '\\') { + if (yych <= 0x00) goto yy755; + if (yych <= ')') goto yy754; + goto yy756; + } else { + if (yych <= 0xC1) goto yy755; + if (yych <= 0xDF) goto yy758; + goto yy759; + } + } else { + if (yych <= 0xEF) { + if (yych == 0xED) goto yy761; + goto yy760; + } else { + if (yych <= 0xF0) goto yy762; + if (yych <= 0xF3) goto yy763; + if (yych <= 0xF4) goto yy764; + goto yy755; + } + } +} + +} + +// Match space characters, including newlines. +bufsize_t _scan_spacechars(const unsigned char *p) +{ + const unsigned char *start = p; \ + +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yybm[0+yych] & 128) { + goto yy772; + } + ++p; + { return 0; } +yy772: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy772; + } + { return (bufsize_t)(p - start); } +} + +} + +// Match ATX heading start. +bufsize_t _scan_atx_heading_start(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych == '#') goto yy779; + ++p; +yy778: + { return 0; } +yy779: + yych = *(marker = ++p); + if (yybm[0+yych] & 128) { + goto yy780; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy778; + if (yych <= '\n') goto yy783; + goto yy778; + } else { + if (yych <= '\r') goto yy783; + if (yych == '#') goto yy784; + goto yy778; + } +yy780: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy780; + } +yy782: + { return (bufsize_t)(p - start); } +yy783: + ++p; + goto yy782; +yy784: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy780; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy785; + if (yych <= '\n') goto yy783; + } else { + if (yych <= '\r') goto yy783; + if (yych == '#') goto yy786; + } +yy785: + p = marker; + goto yy778; +yy786: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy780; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy785; + if (yych <= '\n') goto yy783; + goto yy785; + } else { + if (yych <= '\r') goto yy783; + if (yych != '#') goto yy785; + } + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy780; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy785; + if (yych <= '\n') goto yy783; + goto yy785; + } else { + if (yych <= '\r') goto yy783; + if (yych != '#') goto yy785; + } + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy780; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy785; + if (yych <= '\n') goto yy783; + goto yy785; + } else { + if (yych <= '\r') goto yy783; + if (yych != '#') goto yy785; + } + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy780; + } + if (yych <= 0x08) goto yy785; + if (yych <= '\n') goto yy783; + if (yych == '\r') goto yy783; + goto yy785; +} + +} + +// Match setext heading line. Return 1 for level-1 heading, +// 2 for level-2, 0 for no match. +bufsize_t _scan_setext_heading_line(const unsigned char *p) +{ + const unsigned char *marker = NULL; + +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych == '-') goto yy794; + if (yych == '=') goto yy795; + ++p; +yy793: + { return 0; } +yy794: + yych = *(marker = ++p); + if (yybm[0+yych] & 64) { + goto yy801; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy793; + if (yych <= '\n') goto yy797; + goto yy793; + } else { + if (yych <= '\r') goto yy797; + if (yych == ' ') goto yy797; + goto yy793; + } +yy795: + yych = *(marker = ++p); + if (yybm[0+yych] & 128) { + goto yy807; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy793; + if (yych <= '\n') goto yy804; + goto yy793; + } else { + if (yych <= '\r') goto yy804; + if (yych == ' ') goto yy804; + goto yy793; + } +yy796: + yych = *++p; +yy797: + if (yybm[0+yych] & 32) { + goto yy796; + } + if (yych <= 0x08) goto yy798; + if (yych <= '\n') goto yy799; + if (yych == '\r') goto yy799; +yy798: + p = marker; + goto yy793; +yy799: + ++p; + { return 2; } +yy801: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy796; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy798; + if (yych <= '\n') goto yy799; + goto yy798; + } else { + if (yych <= '\r') goto yy799; + if (yych == '-') goto yy801; + goto yy798; + } +yy803: + yych = *++p; +yy804: + if (yych <= '\f') { + if (yych <= 0x08) goto yy798; + if (yych <= '\t') goto yy803; + if (yych >= '\v') goto yy798; + } else { + if (yych <= '\r') goto yy805; + if (yych == ' ') goto yy803; + goto yy798; + } +yy805: + ++p; + { return 1; } +yy807: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy807; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy798; + if (yych <= '\t') goto yy803; + if (yych <= '\n') goto yy805; + goto yy798; + } else { + if (yych <= '\r') goto yy805; + if (yych == ' ') goto yy803; + goto yy798; + } +} + +} + +// Scan a thematic break line: "...three or more hyphens, asterisks, +// or underscores on a line by themselves. If you wish, you may use +// spaces between the hyphens or asterisks." +bufsize_t _scan_thematic_break(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 240, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 128, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych <= ',') { + if (yych == '*') goto yy813; + } else { + if (yych <= '-') goto yy814; + if (yych == '_') goto yy815; + } + ++p; +yy812: + { return 0; } +yy813: + yych = *(marker = ++p); + if (yybm[0+yych] & 16) { + goto yy816; + } + if (yych == '*') goto yy819; + goto yy812; +yy814: + yych = *(marker = ++p); + if (yych <= 0x1F) { + if (yych == '\t') goto yy821; + goto yy812; + } else { + if (yych <= ' ') goto yy821; + if (yych == '-') goto yy823; + goto yy812; + } +yy815: + yych = *(marker = ++p); + if (yych <= 0x1F) { + if (yych == '\t') goto yy825; + goto yy812; + } else { + if (yych <= ' ') goto yy825; + if (yych == '_') goto yy827; + goto yy812; + } +yy816: + yych = *++p; + if (yybm[0+yych] & 16) { + goto yy816; + } + if (yych == '*') goto yy819; +yy818: + p = marker; + goto yy812; +yy819: + yych = *++p; + if (yych <= 0x1F) { + if (yych == '\t') goto yy819; + goto yy818; + } else { + if (yych <= ' ') goto yy819; + if (yych == '*') goto yy829; + goto yy818; + } +yy821: + yych = *++p; + if (yych <= 0x1F) { + if (yych == '\t') goto yy821; + goto yy818; + } else { + if (yych <= ' ') goto yy821; + if (yych != '-') goto yy818; + } +yy823: + yych = *++p; + if (yych <= 0x1F) { + if (yych == '\t') goto yy823; + goto yy818; + } else { + if (yych <= ' ') goto yy823; + if (yych == '-') goto yy831; + goto yy818; + } +yy825: + yych = *++p; + if (yych <= 0x1F) { + if (yych == '\t') goto yy825; + goto yy818; + } else { + if (yych <= ' ') goto yy825; + if (yych != '_') goto yy818; + } +yy827: + yych = *++p; + if (yych <= 0x1F) { + if (yych == '\t') goto yy827; + goto yy818; + } else { + if (yych <= ' ') goto yy827; + if (yych == '_') goto yy833; + goto yy818; + } +yy829: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy829; + } + if (yych <= 0x08) goto yy818; + if (yych <= '\n') goto yy835; + if (yych == '\r') goto yy835; + goto yy818; +yy831: + yych = *++p; + if (yybm[0+yych] & 64) { + goto yy831; + } + if (yych <= 0x08) goto yy818; + if (yych <= '\n') goto yy837; + if (yych == '\r') goto yy837; + goto yy818; +yy833: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy833; + } + if (yych <= 0x08) goto yy818; + if (yych <= '\n') goto yy839; + if (yych == '\r') goto yy839; + goto yy818; +yy835: + ++p; + { return (bufsize_t)(p - start); } +yy837: + ++p; + { return (bufsize_t)(p - start); } +yy839: + ++p; + { return (bufsize_t)(p - start); } +} + +} + +// Scan an opening code fence. +bufsize_t _scan_open_code_fence(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 0, 192, 192, 0, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 144, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 192, 96, 192, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych == '`') goto yy845; + if (yych == '~') goto yy846; + ++p; +yy844: + { return 0; } +yy845: + yych = *(marker = ++p); + if (yych == '`') goto yy847; + goto yy844; +yy846: + yych = *(marker = ++p); + if (yych == '~') goto yy849; + goto yy844; +yy847: + yych = *++p; + if (yybm[0+yych] & 16) { + goto yy850; + } +yy848: + p = marker; + goto yy844; +yy849: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy852; + } + goto yy848; +yy850: + yych = *++p; + if (yybm[0+yych] & 16) { + goto yy850; + } + if (yych <= 0xDF) { + if (yych <= '\f') { + if (yych <= 0x00) goto yy848; + if (yych == '\n') { + marker = p; + goto yy856; + } + marker = p; + goto yy854; + } else { + if (yych <= '\r') { + marker = p; + goto yy856; + } + if (yych <= 0x7F) { + marker = p; + goto yy854; + } + if (yych <= 0xC1) goto yy848; + marker = p; + goto yy858; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) { + marker = p; + goto yy859; + } + if (yych == 0xED) { + marker = p; + goto yy861; + } + marker = p; + goto yy860; + } else { + if (yych <= 0xF0) { + marker = p; + goto yy862; + } + if (yych <= 0xF3) { + marker = p; + goto yy863; + } + if (yych <= 0xF4) { + marker = p; + goto yy864; + } + goto yy848; + } + } +yy852: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy852; + } + if (yych <= 0xDF) { + if (yych <= '\f') { + if (yych <= 0x00) goto yy848; + if (yych == '\n') { + marker = p; + goto yy867; + } + marker = p; + goto yy865; + } else { + if (yych <= '\r') { + marker = p; + goto yy867; + } + if (yych <= 0x7F) { + marker = p; + goto yy865; + } + if (yych <= 0xC1) goto yy848; + marker = p; + goto yy869; + } + } else { + if (yych <= 0xEF) { + if (yych <= 0xE0) { + marker = p; + goto yy870; + } + if (yych == 0xED) { + marker = p; + goto yy872; + } + marker = p; + goto yy871; + } else { + if (yych <= 0xF0) { + marker = p; + goto yy873; + } + if (yych <= 0xF3) { + marker = p; + goto yy874; + } + if (yych <= 0xF4) { + marker = p; + goto yy875; + } + goto yy848; + } + } +yy854: + yych = *++p; + if (yybm[0+yych] & 64) { + goto yy854; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy848; + if (yych >= 0x0E) goto yy848; + } else { + if (yych <= 0xDF) goto yy858; + if (yych <= 0xE0) goto yy859; + goto yy860; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy861; + if (yych <= 0xEF) goto yy860; + goto yy862; + } else { + if (yych <= 0xF3) goto yy863; + if (yych <= 0xF4) goto yy864; + goto yy848; + } + } +yy856: + ++p; + p = marker; + { return (bufsize_t)(p - start); } +yy858: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0xBF) goto yy854; + goto yy848; +yy859: + yych = *++p; + if (yych <= 0x9F) goto yy848; + if (yych <= 0xBF) goto yy858; + goto yy848; +yy860: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0xBF) goto yy858; + goto yy848; +yy861: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0x9F) goto yy858; + goto yy848; +yy862: + yych = *++p; + if (yych <= 0x8F) goto yy848; + if (yych <= 0xBF) goto yy860; + goto yy848; +yy863: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0xBF) goto yy860; + goto yy848; +yy864: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0x8F) goto yy860; + goto yy848; +yy865: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy865; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= 0x00) goto yy848; + if (yych >= 0x0E) goto yy848; + } else { + if (yych <= 0xDF) goto yy869; + if (yych <= 0xE0) goto yy870; + goto yy871; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy872; + if (yych <= 0xEF) goto yy871; + goto yy873; + } else { + if (yych <= 0xF3) goto yy874; + if (yych <= 0xF4) goto yy875; + goto yy848; + } + } +yy867: + ++p; + p = marker; + { return (bufsize_t)(p - start); } +yy869: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0xBF) goto yy865; + goto yy848; +yy870: + yych = *++p; + if (yych <= 0x9F) goto yy848; + if (yych <= 0xBF) goto yy869; + goto yy848; +yy871: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0xBF) goto yy869; + goto yy848; +yy872: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0x9F) goto yy869; + goto yy848; +yy873: + yych = *++p; + if (yych <= 0x8F) goto yy848; + if (yych <= 0xBF) goto yy871; + goto yy848; +yy874: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0xBF) goto yy871; + goto yy848; +yy875: + yych = *++p; + if (yych <= 0x7F) goto yy848; + if (yych <= 0x8F) goto yy871; + goto yy848; +} + +} + +// Scan a closing code fence with length at least len. +bufsize_t _scan_close_code_fence(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych == '`') goto yy880; + if (yych == '~') goto yy881; + ++p; +yy879: + { return 0; } +yy880: + yych = *(marker = ++p); + if (yych == '`') goto yy882; + goto yy879; +yy881: + yych = *(marker = ++p); + if (yych == '~') goto yy884; + goto yy879; +yy882: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy885; + } +yy883: + p = marker; + goto yy879; +yy884: + yych = *++p; + if (yybm[0+yych] & 64) { + goto yy887; + } + goto yy883; +yy885: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy885; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy883; + if (yych <= '\t') { + marker = p; + goto yy889; + } + if (yych <= '\n') { + marker = p; + goto yy891; + } + goto yy883; + } else { + if (yych <= '\r') { + marker = p; + goto yy891; + } + if (yych == ' ') { + marker = p; + goto yy889; + } + goto yy883; + } +yy887: + yych = *++p; + if (yybm[0+yych] & 64) { + goto yy887; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy883; + if (yych <= '\t') { + marker = p; + goto yy893; + } + if (yych <= '\n') { + marker = p; + goto yy895; + } + goto yy883; + } else { + if (yych <= '\r') { + marker = p; + goto yy895; + } + if (yych == ' ') { + marker = p; + goto yy893; + } + goto yy883; + } +yy889: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy889; + } + if (yych <= 0x08) goto yy883; + if (yych <= '\n') goto yy891; + if (yych != '\r') goto yy883; +yy891: + ++p; + p = marker; + { return (bufsize_t)(p - start); } +yy893: + yych = *++p; + if (yych <= '\f') { + if (yych <= 0x08) goto yy883; + if (yych <= '\t') goto yy893; + if (yych >= '\v') goto yy883; + } else { + if (yych <= '\r') goto yy895; + if (yych == ' ') goto yy893; + goto yy883; + } +yy895: + ++p; + p = marker; + { return (bufsize_t)(p - start); } +} + +} + +// Scans an entity. +// Returns number of chars matched. +bufsize_t _scan_entity(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + yych = *p; + if (yych == '&') goto yy901; + ++p; +yy900: + { return 0; } +yy901: + yych = *(marker = ++p); + if (yych <= '@') { + if (yych != '#') goto yy900; + } else { + if (yych <= 'Z') goto yy904; + if (yych <= '`') goto yy900; + if (yych <= 'z') goto yy904; + goto yy900; + } + yych = *++p; + if (yych <= 'W') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy905; + } else { + if (yych <= 'X') goto yy906; + if (yych == 'x') goto yy906; + } +yy903: + p = marker; + goto yy900; +yy904: + yych = *++p; + if (yych <= '@') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy907; + goto yy903; + } else { + if (yych <= 'Z') goto yy907; + if (yych <= '`') goto yy903; + if (yych <= 'z') goto yy907; + goto yy903; + } +yy905: + yych = *++p; + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy908; + if (yych == ';') goto yy909; + goto yy903; +yy906: + yych = *++p; + if (yych <= '@') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy911; + goto yy903; + } else { + if (yych <= 'F') goto yy911; + if (yych <= '`') goto yy903; + if (yych <= 'f') goto yy911; + goto yy903; + } +yy907: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy912; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + goto yy912; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'z') goto yy912; + goto yy903; + } + } +yy908: + yych = *++p; + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy913; + if (yych != ';') goto yy903; +yy909: + ++p; + { return (bufsize_t)(p - start); } +yy911: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy914; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'F') { + if (yych <= '@') goto yy903; + goto yy914; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'f') goto yy914; + goto yy903; + } + } +yy912: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy915; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + goto yy915; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'z') goto yy915; + goto yy903; + } + } +yy913: + yych = *++p; + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy916; + if (yych == ';') goto yy909; + goto yy903; +yy914: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy917; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'F') { + if (yych <= '@') goto yy903; + goto yy917; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'f') goto yy917; + goto yy903; + } + } +yy915: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy918; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + goto yy918; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'z') goto yy918; + goto yy903; + } + } +yy916: + yych = *++p; + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy919; + if (yych == ';') goto yy909; + goto yy903; +yy917: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy920; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'F') { + if (yych <= '@') goto yy903; + goto yy920; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'f') goto yy920; + goto yy903; + } + } +yy918: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy921; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + goto yy921; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'z') goto yy921; + goto yy903; + } + } +yy919: + yych = *++p; + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy922; + if (yych == ';') goto yy909; + goto yy903; +yy920: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy923; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'F') { + if (yych <= '@') goto yy903; + goto yy923; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'f') goto yy923; + goto yy903; + } + } +yy921: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy924; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + goto yy924; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'z') goto yy924; + goto yy903; + } + } +yy922: + yych = *++p; + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy925; + if (yych == ';') goto yy909; + goto yy903; +yy923: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy925; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'F') { + if (yych <= '@') goto yy903; + goto yy925; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'f') goto yy925; + goto yy903; + } + } +yy924: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy926; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + goto yy926; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'z') goto yy926; + goto yy903; + } + } +yy925: + yych = *++p; + if (yych == ';') goto yy909; + goto yy903; +yy926: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy927; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy927: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy928; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy928: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy929; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy929: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy930; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy930: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy931; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy931: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy932; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy932: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy933; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy933: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy934; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy934: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy935; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy935: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy936; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy936: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy937; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy937: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy938; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy938: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy939; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy939: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy940; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy940: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy941; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy941: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy942; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy942: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy943; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy943: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy944; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy944: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy945; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy945: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy946; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy946: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy947; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy947: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy948; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy948: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy949; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + } else { + if (yych <= '`') goto yy903; + if (yych >= '{') goto yy903; + } + } +yy949: + yych = *++p; + if (yych <= ';') { + if (yych <= '/') goto yy903; + if (yych <= '9') goto yy925; + if (yych <= ':') goto yy903; + goto yy909; + } else { + if (yych <= 'Z') { + if (yych <= '@') goto yy903; + goto yy925; + } else { + if (yych <= '`') goto yy903; + if (yych <= 'z') goto yy925; + goto yy903; + } + } +} + +} + +// Returns positive value if a URL begins in a way that is potentially +// dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0. +bufsize_t _scan_dangerous_url(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + yych = *p; + if (yych <= 'V') { + if (yych <= 'F') { + if (yych == 'D') goto yy954; + if (yych >= 'F') goto yy955; + } else { + if (yych == 'J') goto yy956; + if (yych >= 'V') goto yy957; + } + } else { + if (yych <= 'f') { + if (yych == 'd') goto yy954; + if (yych >= 'f') goto yy955; + } else { + if (yych <= 'j') { + if (yych >= 'j') goto yy956; + } else { + if (yych == 'v') goto yy957; + } + } + } + ++p; +yy953: + { return 0; } +yy954: + yyaccept = 0; + yych = *(marker = ++p); + if (yych == 'A') goto yy958; + if (yych == 'a') goto yy958; + goto yy953; +yy955: + yyaccept = 0; + yych = *(marker = ++p); + if (yych == 'I') goto yy960; + if (yych == 'i') goto yy960; + goto yy953; +yy956: + yyaccept = 0; + yych = *(marker = ++p); + if (yych == 'A') goto yy961; + if (yych == 'a') goto yy961; + goto yy953; +yy957: + yyaccept = 0; + yych = *(marker = ++p); + if (yych == 'B') goto yy962; + if (yych == 'b') goto yy962; + goto yy953; +yy958: + yych = *++p; + if (yych == 'T') goto yy963; + if (yych == 't') goto yy963; +yy959: + p = marker; + if (yyaccept == 0) { + goto yy953; + } else { + goto yy971; + } +yy960: + yych = *++p; + if (yych == 'L') goto yy964; + if (yych == 'l') goto yy964; + goto yy959; +yy961: + yych = *++p; + if (yych == 'V') goto yy965; + if (yych == 'v') goto yy965; + goto yy959; +yy962: + yych = *++p; + if (yych == 'S') goto yy966; + if (yych == 's') goto yy966; + goto yy959; +yy963: + yych = *++p; + if (yych == 'A') goto yy967; + if (yych == 'a') goto yy967; + goto yy959; +yy964: + yych = *++p; + if (yych == 'E') goto yy968; + if (yych == 'e') goto yy968; + goto yy959; +yy965: + yych = *++p; + if (yych == 'A') goto yy962; + if (yych == 'a') goto yy962; + goto yy959; +yy966: + yych = *++p; + if (yych == 'C') goto yy969; + if (yych == 'c') goto yy969; + goto yy959; +yy967: + yych = *++p; + if (yych == ':') goto yy970; + goto yy959; +yy968: + yych = *++p; + if (yych == ':') goto yy972; + goto yy959; +yy969: + yych = *++p; + if (yych == 'R') goto yy973; + if (yych == 'r') goto yy973; + goto yy959; +yy970: + yyaccept = 1; + yych = *(marker = ++p); + if (yych == 'I') goto yy974; + if (yych == 'i') goto yy974; +yy971: + { return (bufsize_t)(p - start); } +yy972: + ++p; + goto yy971; +yy973: + yych = *++p; + if (yych == 'I') goto yy975; + if (yych == 'i') goto yy975; + goto yy959; +yy974: + yych = *++p; + if (yych == 'M') goto yy976; + if (yych == 'm') goto yy976; + goto yy959; +yy975: + yych = *++p; + if (yych == 'P') goto yy977; + if (yych == 'p') goto yy977; + goto yy959; +yy976: + yych = *++p; + if (yych == 'A') goto yy978; + if (yych == 'a') goto yy978; + goto yy959; +yy977: + yych = *++p; + if (yych == 'T') goto yy968; + if (yych == 't') goto yy968; + goto yy959; +yy978: + yych = *++p; + if (yych == 'G') goto yy979; + if (yych != 'g') goto yy959; +yy979: + yych = *++p; + if (yych == 'E') goto yy980; + if (yych != 'e') goto yy959; +yy980: + yych = *++p; + if (yych != '/') goto yy959; + yych = *++p; + if (yych <= 'W') { + if (yych <= 'J') { + if (yych == 'G') goto yy982; + if (yych <= 'I') goto yy959; + goto yy983; + } else { + if (yych == 'P') goto yy984; + if (yych <= 'V') goto yy959; + goto yy985; + } + } else { + if (yych <= 'j') { + if (yych == 'g') goto yy982; + if (yych <= 'i') goto yy959; + goto yy983; + } else { + if (yych <= 'p') { + if (yych <= 'o') goto yy959; + goto yy984; + } else { + if (yych == 'w') goto yy985; + goto yy959; + } + } + } +yy982: + yych = *++p; + if (yych == 'I') goto yy986; + if (yych == 'i') goto yy986; + goto yy959; +yy983: + yych = *++p; + if (yych == 'P') goto yy987; + if (yych == 'p') goto yy987; + goto yy959; +yy984: + yych = *++p; + if (yych == 'N') goto yy988; + if (yych == 'n') goto yy988; + goto yy959; +yy985: + yych = *++p; + if (yych == 'E') goto yy989; + if (yych == 'e') goto yy989; + goto yy959; +yy986: + yych = *++p; + if (yych == 'F') goto yy990; + if (yych == 'f') goto yy990; + goto yy959; +yy987: + yych = *++p; + if (yych == 'E') goto yy988; + if (yych != 'e') goto yy959; +yy988: + yych = *++p; + if (yych == 'G') goto yy990; + if (yych == 'g') goto yy990; + goto yy959; +yy989: + yych = *++p; + if (yych == 'B') goto yy992; + if (yych == 'b') goto yy992; + goto yy959; +yy990: + ++p; + { return 0; } +yy992: + yych = *++p; + if (yych == 'P') goto yy990; + if (yych == 'p') goto yy990; + goto yy959; +} + +} + +// Scans a footnote definition opening. +bufsize_t _scan_footnote_definition(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; + +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 64, 64, 64, 64, 64, 64, 64, + 64, 128, 0, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 128, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + yych = *p; + if (yych == '[') goto yy997; + ++p; +yy996: + { return 0; } +yy997: + yych = *(marker = ++p); + if (yych != '^') goto yy996; + yych = *++p; + if (yych != ']') goto yy1001; +yy999: + p = marker; + goto yy996; +yy1000: + yych = *++p; +yy1001: + if (yybm[0+yych] & 64) { + goto yy1000; + } + if (yych <= 0xEC) { + if (yych <= 0xC1) { + if (yych <= ' ') goto yy999; + if (yych <= ']') goto yy1009; + goto yy999; + } else { + if (yych <= 0xDF) goto yy1002; + if (yych <= 0xE0) goto yy1003; + goto yy1004; + } + } else { + if (yych <= 0xF0) { + if (yych <= 0xED) goto yy1005; + if (yych <= 0xEF) goto yy1004; + goto yy1006; + } else { + if (yych <= 0xF3) goto yy1007; + if (yych <= 0xF4) goto yy1008; + goto yy999; + } + } +yy1002: + yych = *++p; + if (yych <= 0x7F) goto yy999; + if (yych <= 0xBF) goto yy1000; + goto yy999; +yy1003: + yych = *++p; + if (yych <= 0x9F) goto yy999; + if (yych <= 0xBF) goto yy1002; + goto yy999; +yy1004: + yych = *++p; + if (yych <= 0x7F) goto yy999; + if (yych <= 0xBF) goto yy1002; + goto yy999; +yy1005: + yych = *++p; + if (yych <= 0x7F) goto yy999; + if (yych <= 0x9F) goto yy1002; + goto yy999; +yy1006: + yych = *++p; + if (yych <= 0x8F) goto yy999; + if (yych <= 0xBF) goto yy1004; + goto yy999; +yy1007: + yych = *++p; + if (yych <= 0x7F) goto yy999; + if (yych <= 0xBF) goto yy1004; + goto yy999; +yy1008: + yych = *++p; + if (yych <= 0x7F) goto yy999; + if (yych <= 0x8F) goto yy1004; + goto yy999; +yy1009: + yych = *++p; + if (yych != ':') goto yy999; +yy1010: + yych = *++p; + if (yybm[0+yych] & 128) { + goto yy1010; + } + { return (bufsize_t)(p - start); } +} + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.h new file mode 100644 index 000000000000..1e5c8ccd800a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.h @@ -0,0 +1,64 @@ +#ifndef CMARK_SCANNERS_H +#define CMARK_SCANNERS_H + +#include "cmark-gfm.h" +#include "chunk.h" + +#ifdef __cplusplus +extern "C" { +#endif + +bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c, + bufsize_t offset); +bufsize_t _scan_scheme(const unsigned char *p); +bufsize_t _scan_autolink_uri(const unsigned char *p); +bufsize_t _scan_autolink_email(const unsigned char *p); +bufsize_t _scan_html_tag(const unsigned char *p); +bufsize_t _scan_liberal_html_tag(const unsigned char *p); +bufsize_t _scan_html_block_start(const unsigned char *p); +bufsize_t _scan_html_block_start_7(const unsigned char *p); +bufsize_t _scan_html_block_end_1(const unsigned char *p); +bufsize_t _scan_html_block_end_2(const unsigned char *p); +bufsize_t _scan_html_block_end_3(const unsigned char *p); +bufsize_t _scan_html_block_end_4(const unsigned char *p); +bufsize_t _scan_html_block_end_5(const unsigned char *p); +bufsize_t _scan_link_title(const unsigned char *p); +bufsize_t _scan_spacechars(const unsigned char *p); +bufsize_t _scan_atx_heading_start(const unsigned char *p); +bufsize_t _scan_setext_heading_line(const unsigned char *p); +bufsize_t _scan_thematic_break(const unsigned char *p); +bufsize_t _scan_open_code_fence(const unsigned char *p); +bufsize_t _scan_close_code_fence(const unsigned char *p); +bufsize_t _scan_entity(const unsigned char *p); +bufsize_t _scan_dangerous_url(const unsigned char *p); +bufsize_t _scan_footnote_definition(const unsigned char *p); + +#define scan_scheme(c, n) _scan_at(&_scan_scheme, c, n) +#define scan_autolink_uri(c, n) _scan_at(&_scan_autolink_uri, c, n) +#define scan_autolink_email(c, n) _scan_at(&_scan_autolink_email, c, n) +#define scan_html_tag(c, n) _scan_at(&_scan_html_tag, c, n) +#define scan_liberal_html_tag(c, n) _scan_at(&_scan_liberal_html_tag, c, n) +#define scan_html_block_start(c, n) _scan_at(&_scan_html_block_start, c, n) +#define scan_html_block_start_7(c, n) _scan_at(&_scan_html_block_start_7, c, n) +#define scan_html_block_end_1(c, n) _scan_at(&_scan_html_block_end_1, c, n) +#define scan_html_block_end_2(c, n) _scan_at(&_scan_html_block_end_2, c, n) +#define scan_html_block_end_3(c, n) _scan_at(&_scan_html_block_end_3, c, n) +#define scan_html_block_end_4(c, n) _scan_at(&_scan_html_block_end_4, c, n) +#define scan_html_block_end_5(c, n) _scan_at(&_scan_html_block_end_5, c, n) +#define scan_link_title(c, n) _scan_at(&_scan_link_title, c, n) +#define scan_spacechars(c, n) _scan_at(&_scan_spacechars, c, n) +#define scan_atx_heading_start(c, n) _scan_at(&_scan_atx_heading_start, c, n) +#define scan_setext_heading_line(c, n) \ + _scan_at(&_scan_setext_heading_line, c, n) +#define scan_thematic_break(c, n) _scan_at(&_scan_thematic_break, c, n) +#define scan_open_code_fence(c, n) _scan_at(&_scan_open_code_fence, c, n) +#define scan_close_code_fence(c, n) _scan_at(&_scan_close_code_fence, c, n) +#define scan_entity(c, n) _scan_at(&_scan_entity, c, n) +#define scan_dangerous_url(c, n) _scan_at(&_scan_dangerous_url, c, n) +#define scan_footnote_definition(c, n) _scan_at(&_scan_footnote_definition, c, n) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.o new file mode 100644 index 000000000000..b2136de58e97 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.re b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.re new file mode 100644 index 000000000000..5af8b7b1886c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/scanners.re @@ -0,0 +1,341 @@ +#include +#include "chunk.h" +#include "scanners.h" + +bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c, bufsize_t offset) +{ + bufsize_t res; + unsigned char *ptr = (unsigned char *)c->data; + + if (ptr == NULL || offset > c->len) { + return 0; + } else { + unsigned char lim = ptr[c->len]; + + ptr[c->len] = '\0'; + res = scanner(ptr + offset); + ptr[c->len] = lim; + } + + return res; +} + +/*!re2c + re2c:define:YYCTYPE = "unsigned char"; + re2c:define:YYCURSOR = p; + re2c:define:YYMARKER = marker; + re2c:define:YYCTXMARKER = marker; + re2c:yyfill:enable = 0; + + wordchar = [^\x00-\x20]; + + spacechar = [ \t\v\f\r\n]; + + reg_char = [^\\()\x00-\x20]; + + escaped_char = [\\][!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~-]; + + tagname = [A-Za-z][A-Za-z0-9-]*; + + blocktagname = 'address'|'article'|'aside'|'base'|'basefont'|'blockquote'|'body'|'caption'|'center'|'col'|'colgroup'|'dd'|'details'|'dialog'|'dir'|'div'|'dl'|'dt'|'fieldset'|'figcaption'|'figure'|'footer'|'form'|'frame'|'frameset'|'h1'|'h2'|'h3'|'h4'|'h5'|'h6'|'head'|'header'|'hr'|'html'|'iframe'|'legend'|'li'|'link'|'main'|'menu'|'menuitem'|'meta'|'nav'|'noframes'|'ol'|'optgroup'|'option'|'p'|'param'|'section'|'source'|'title'|'summary'|'table'|'tbody'|'td'|'tfoot'|'th'|'thead'|'title'|'tr'|'track'|'ul'; + + attributename = [a-zA-Z_:][a-zA-Z0-9:._-]*; + + unquotedvalue = [^"'=<>`\x00]+; + singlequotedvalue = ['][^'\x00]*[']; + doublequotedvalue = ["][^"\x00]*["]; + + attributevalue = unquotedvalue | singlequotedvalue | doublequotedvalue; + + attributevaluespec = spacechar* [=] spacechar* attributevalue; + + attribute = spacechar+ attributename attributevaluespec?; + + opentag = tagname attribute* spacechar* [/]? [>]; + closetag = [/] tagname spacechar* [>]; + + htmlcomment = "!---->" | ("!--" ([-]? [^\x00>-]) ([-]? [^\x00-])* "-->"); + + processinginstruction = "?" ([^?>\x00]+ | [?][^>\x00] | [>])* "?>"; + + declaration = "!" [A-Z]+ spacechar+ [^>\x00]* ">"; + + cdata = "![CDATA[" ([^\]\x00]+ | "]" [^\]\x00] | "]]" [^>\x00])* "]]>"; + + htmltag = opentag | closetag | htmlcomment | processinginstruction | + declaration | cdata; + + in_parens_nosp = [(] (reg_char|escaped_char|[\\])* [)]; + + in_double_quotes = ["] (escaped_char|[^"\x00])* ["]; + in_single_quotes = ['] (escaped_char|[^'\x00])* [']; + in_parens = [(] (escaped_char|[^)\x00])* [)]; + + scheme = [A-Za-z][A-Za-z0-9.+-]{1,31}; +*/ + +// Try to match a scheme including colon. +bufsize_t _scan_scheme(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + scheme [:] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match URI autolink after first <, returning number of chars matched. +bufsize_t _scan_autolink_uri(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + scheme [:][^\x00-\x20<>]*[>] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match email autolink after first <, returning num of chars matched. +bufsize_t _scan_autolink_email(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+ + [@] + [a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])? + ([.][a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)* + [>] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML tag after first <, returning num of chars matched. +bufsize_t _scan_html_tag(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + htmltag { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to (liberally) match an HTML tag after first <, returning num of chars matched. +bufsize_t _scan_liberal_html_tag(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [^\n\x00]+ [>] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML block tag start line, returning +// an integer code for the type of block (1-6, matching the spec). +// #7 is handled by a separate function, below. +bufsize_t _scan_html_block_start(const unsigned char *p) +{ + const unsigned char *marker = NULL; +/*!re2c + [<] ('script'|'pre'|'style') (spacechar | [>]) { return 1; } + '' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML block end line of type 3 +bufsize_t _scan_html_block_end_3(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [^\n\x00]* '?>' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML block end line of type 4 +bufsize_t _scan_html_block_end_4(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [^\n\x00]* '>' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match an HTML block end line of type 5 +bufsize_t _scan_html_block_end_5(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [^\n\x00]* ']]>' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Try to match a link title (in single quotes, in double quotes, or +// in parentheses), returning number of chars matched. Allow one +// level of internal nesting (quotes within quotes). +bufsize_t _scan_link_title(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + ["] (escaped_char|[^"\x00])* ["] { return (bufsize_t)(p - start); } + ['] (escaped_char|[^'\x00])* ['] { return (bufsize_t)(p - start); } + [(] (escaped_char|[^)\x00])* [)] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Match space characters, including newlines. +bufsize_t _scan_spacechars(const unsigned char *p) +{ + const unsigned char *start = p; \ +/*!re2c + [ \t\v\f\r\n]+ { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Match ATX heading start. +bufsize_t _scan_atx_heading_start(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [#]{1,6} ([ \t]+|[\r\n]) { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Match setext heading line. Return 1 for level-1 heading, +// 2 for level-2, 0 for no match. +bufsize_t _scan_setext_heading_line(const unsigned char *p) +{ + const unsigned char *marker = NULL; +/*!re2c + [=]+ [ \t]* [\r\n] { return 1; } + [-]+ [ \t]* [\r\n] { return 2; } + * { return 0; } +*/ +} + +// Scan a thematic break line: "...three or more hyphens, asterisks, +// or underscores on a line by themselves. If you wish, you may use +// spaces between the hyphens or asterisks." +bufsize_t _scan_thematic_break(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + ([*][ \t]*){3,} [ \t]* [\r\n] { return (bufsize_t)(p - start); } + ([_][ \t]*){3,} [ \t]* [\r\n] { return (bufsize_t)(p - start); } + ([-][ \t]*){3,} [ \t]* [\r\n] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Scan an opening code fence. +bufsize_t _scan_open_code_fence(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [`]{3,} / [^`\r\n\x00]*[\r\n] { return (bufsize_t)(p - start); } + [~]{3,} / [^~\r\n\x00]*[\r\n] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Scan a closing code fence with length at least len. +bufsize_t _scan_close_code_fence(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [`]{3,} / [ \t]*[\r\n] { return (bufsize_t)(p - start); } + [~]{3,} / [ \t]*[\r\n] { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Scans an entity. +// Returns number of chars matched. +bufsize_t _scan_entity(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + [&] ([#] ([Xx][A-Fa-f0-9]{1,8}|[0-9]{1,8}) |[A-Za-z][A-Za-z0-9]{1,31} ) [;] + { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Returns positive value if a URL begins in a way that is potentially +// dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0. +bufsize_t _scan_dangerous_url(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + 'data:image/' ('png'|'gif'|'jpeg'|'webp') { return 0; } + 'javascript:' | 'vbscript:' | 'file:' | 'data:' { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} + +// Scans a footnote definition opening. +bufsize_t _scan_footnote_definition(const unsigned char *p) +{ + const unsigned char *marker = NULL; + const unsigned char *start = p; +/*!re2c + '[^' ([^\] \r\n\x00\t]+) ']:' [ \t]* { return (bufsize_t)(p - start); } + * { return 0; } +*/ +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/strikethrough.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/strikethrough.c new file mode 100644 index 000000000000..87a2ac7c3c19 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/strikethrough.c @@ -0,0 +1,164 @@ +#include "strikethrough.h" +#include +#include + +cmark_node_type CMARK_NODE_STRIKETHROUGH; + +static cmark_node *match(cmark_syntax_extension *self, cmark_parser *parser, + cmark_node *parent, unsigned char character, + cmark_inline_parser *inline_parser) { + cmark_node *res = NULL; + int left_flanking, right_flanking, punct_before, punct_after, delims; + char buffer[101]; + + if (character != '~') + return NULL; + + delims = cmark_inline_parser_scan_delimiters( + inline_parser, sizeof(buffer) - 1, '~', + &left_flanking, + &right_flanking, &punct_before, &punct_after); + + memset(buffer, '~', delims); + buffer[delims] = 0; + + res = cmark_node_new_with_mem(CMARK_NODE_TEXT, parser->mem); + cmark_node_set_literal(res, buffer); + res->start_line = res->end_line = cmark_inline_parser_get_line(inline_parser); + res->start_column = cmark_inline_parser_get_column(inline_parser) - delims; + + if ((left_flanking || right_flanking) && + (!(parser->options & CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE) || delims == 2)) { + cmark_inline_parser_push_delimiter(inline_parser, character, left_flanking, + right_flanking, res); + } + + return res; +} + +static delimiter *insert(cmark_syntax_extension *self, cmark_parser *parser, + cmark_inline_parser *inline_parser, delimiter *opener, + delimiter *closer) { + cmark_node *strikethrough; + cmark_node *tmp, *next; + delimiter *delim, *tmp_delim; + delimiter *res = closer->next; + + strikethrough = opener->inl_text; + + if (!cmark_node_set_type(strikethrough, CMARK_NODE_STRIKETHROUGH)) + goto done; + + cmark_node_set_syntax_extension(strikethrough, self); + + tmp = cmark_node_next(opener->inl_text); + + while (tmp) { + if (tmp == closer->inl_text) + break; + next = cmark_node_next(tmp); + cmark_node_append_child(strikethrough, tmp); + tmp = next; + } + + strikethrough->end_column = closer->inl_text->start_column + closer->inl_text->as.literal.len - 1; + cmark_node_free(closer->inl_text); + + delim = closer; + while (delim != NULL && delim != opener) { + tmp_delim = delim->previous; + cmark_inline_parser_remove_delimiter(inline_parser, delim); + delim = tmp_delim; + } + + cmark_inline_parser_remove_delimiter(inline_parser, opener); + +done: + return res; +} + +static const char *get_type_string(cmark_syntax_extension *extension, + cmark_node *node) { + return node->type == CMARK_NODE_STRIKETHROUGH ? "strikethrough" : ""; +} + +static int can_contain(cmark_syntax_extension *extension, cmark_node *node, + cmark_node_type child_type) { + if (node->type != CMARK_NODE_STRIKETHROUGH) + return false; + + return CMARK_NODE_TYPE_INLINE_P(child_type); +} + +static void commonmark_render(cmark_syntax_extension *extension, + cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + renderer->out(renderer, node, "~~", false, LITERAL); +} + +static void latex_render(cmark_syntax_extension *extension, + cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + // requires \usepackage{ulem} + bool entering = (ev_type == CMARK_EVENT_ENTER); + if (entering) { + renderer->out(renderer, node, "\\sout{", false, LITERAL); + } else { + renderer->out(renderer, node, "}", false, LITERAL); + } +} + +static void man_render(cmark_syntax_extension *extension, + cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + bool entering = (ev_type == CMARK_EVENT_ENTER); + if (entering) { + renderer->cr(renderer); + renderer->out(renderer, node, ".ST \"", false, LITERAL); + } else { + renderer->out(renderer, node, "\"", false, LITERAL); + renderer->cr(renderer); + } +} + +static void html_render(cmark_syntax_extension *extension, + cmark_html_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + bool entering = (ev_type == CMARK_EVENT_ENTER); + if (entering) { + cmark_strbuf_puts(renderer->html, ""); + } else { + cmark_strbuf_puts(renderer->html, ""); + } +} + +static void plaintext_render(cmark_syntax_extension *extension, + cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + renderer->out(renderer, node, "~", false, LITERAL); +} + +cmark_syntax_extension *create_strikethrough_extension(void) { + cmark_syntax_extension *ext = cmark_syntax_extension_new("strikethrough"); + cmark_llist *special_chars = NULL; + + cmark_syntax_extension_set_get_type_string_func(ext, get_type_string); + cmark_syntax_extension_set_can_contain_func(ext, can_contain); + cmark_syntax_extension_set_commonmark_render_func(ext, commonmark_render); + cmark_syntax_extension_set_latex_render_func(ext, latex_render); + cmark_syntax_extension_set_man_render_func(ext, man_render); + cmark_syntax_extension_set_html_render_func(ext, html_render); + cmark_syntax_extension_set_plaintext_render_func(ext, plaintext_render); + CMARK_NODE_STRIKETHROUGH = cmark_syntax_extension_add_node(1); + + cmark_syntax_extension_set_match_inline_func(ext, match); + cmark_syntax_extension_set_inline_from_delim_func(ext, insert); + + cmark_mem *mem = cmark_get_default_mem_allocator(); + special_chars = cmark_llist_append(mem, special_chars, (void *)'~'); + cmark_syntax_extension_set_special_inline_chars(ext, special_chars); + + cmark_syntax_extension_set_emphasis(ext, 1); + + return ext; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/strikethrough.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/strikethrough.h new file mode 100644 index 000000000000..a52a2b4ac867 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/strikethrough.h @@ -0,0 +1,9 @@ +#ifndef CMARK_GFM_STRIKETHROUGH_H +#define CMARK_GFM_STRIKETHROUGH_H + +#include "cmark-gfm-core-extensions.h" + +extern cmark_node_type CMARK_NODE_STRIKETHROUGH; +cmark_syntax_extension *create_strikethrough_extension(void); + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/strikethrough.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/strikethrough.o new file mode 100644 index 000000000000..a808c970af41 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/strikethrough.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/syntax_extension.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/syntax_extension.c new file mode 100644 index 000000000000..f5c00bb4a7ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/syntax_extension.c @@ -0,0 +1,139 @@ +#include +#include + +#include "cmark-gfm.h" +#include "syntax_extension.h" +#include "buffer.h" + +extern cmark_mem CMARK_DEFAULT_MEM_ALLOCATOR; + +static cmark_mem *_mem = &CMARK_DEFAULT_MEM_ALLOCATOR; + +void cmark_syntax_extension_free(cmark_mem *mem, cmark_syntax_extension *extension) { + if (extension->free_function && extension->priv) { + extension->free_function(mem, extension->priv); + } + + cmark_llist_free(mem, extension->special_inline_chars); + mem->free(extension->name); + mem->free(extension); +} + +cmark_syntax_extension *cmark_syntax_extension_new(const char *name) { + cmark_syntax_extension *res = (cmark_syntax_extension *) _mem->calloc(1, sizeof(cmark_syntax_extension)); + res->name = (char *) _mem->calloc(1, sizeof(char) * (strlen(name)) + 1); + strcpy(res->name, name); + return res; +} + +cmark_node_type cmark_syntax_extension_add_node(int is_inline) { + cmark_node_type *ref = !is_inline ? &CMARK_NODE_LAST_BLOCK : &CMARK_NODE_LAST_INLINE; + + if ((*ref & CMARK_NODE_VALUE_MASK) == CMARK_NODE_VALUE_MASK) { + assert(false); + return (cmark_node_type) 0; + } + + return *ref = (cmark_node_type) ((int) *ref + 1); +} + +void cmark_syntax_extension_set_emphasis(cmark_syntax_extension *extension, + int emphasis) { + extension->emphasis = emphasis == 1; +} + +void cmark_syntax_extension_set_open_block_func(cmark_syntax_extension *extension, + cmark_open_block_func func) { + extension->try_opening_block = func; +} + +void cmark_syntax_extension_set_match_block_func(cmark_syntax_extension *extension, + cmark_match_block_func func) { + extension->last_block_matches = func; +} + +void cmark_syntax_extension_set_match_inline_func(cmark_syntax_extension *extension, + cmark_match_inline_func func) { + extension->match_inline = func; +} + +void cmark_syntax_extension_set_inline_from_delim_func(cmark_syntax_extension *extension, + cmark_inline_from_delim_func func) { + extension->insert_inline_from_delim = func; +} + +void cmark_syntax_extension_set_special_inline_chars(cmark_syntax_extension *extension, + cmark_llist *special_chars) { + extension->special_inline_chars = special_chars; +} + +void cmark_syntax_extension_set_get_type_string_func(cmark_syntax_extension *extension, + cmark_get_type_string_func func) { + extension->get_type_string_func = func; +} + +void cmark_syntax_extension_set_can_contain_func(cmark_syntax_extension *extension, + cmark_can_contain_func func) { + extension->can_contain_func = func; +} + +void cmark_syntax_extension_set_contains_inlines_func(cmark_syntax_extension *extension, + cmark_contains_inlines_func func) { + extension->contains_inlines_func = func; +} + +void cmark_syntax_extension_set_commonmark_render_func(cmark_syntax_extension *extension, + cmark_common_render_func func) { + extension->commonmark_render_func = func; +} + +void cmark_syntax_extension_set_plaintext_render_func(cmark_syntax_extension *extension, + cmark_common_render_func func) { + extension->plaintext_render_func = func; +} + +void cmark_syntax_extension_set_latex_render_func(cmark_syntax_extension *extension, + cmark_common_render_func func) { + extension->latex_render_func = func; +} + +void cmark_syntax_extension_set_man_render_func(cmark_syntax_extension *extension, + cmark_common_render_func func) { + extension->man_render_func = func; +} + +void cmark_syntax_extension_set_html_render_func(cmark_syntax_extension *extension, + cmark_html_render_func func) { + extension->html_render_func = func; +} + +void cmark_syntax_extension_set_html_filter_func(cmark_syntax_extension *extension, + cmark_html_filter_func func) { + extension->html_filter_func = func; +} + +void cmark_syntax_extension_set_postprocess_func(cmark_syntax_extension *extension, + cmark_postprocess_func func) { + extension->postprocess_func = func; +} + +void cmark_syntax_extension_set_private(cmark_syntax_extension *extension, + void *priv, + cmark_free_func free_func) { + extension->priv = priv; + extension->free_function = free_func; +} + +void *cmark_syntax_extension_get_private(cmark_syntax_extension *extension) { + return extension->priv; +} + +void cmark_syntax_extension_set_opaque_free_func(cmark_syntax_extension *extension, + cmark_opaque_free_func func) { + extension->opaque_free_func = func; +} + +void cmark_syntax_extension_set_commonmark_escape_func(cmark_syntax_extension *extension, + cmark_commonmark_escape_func func) { + extension->commonmark_escape_func = func; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/syntax_extension.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/syntax_extension.h new file mode 100644 index 000000000000..e0390b2a2344 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/syntax_extension.h @@ -0,0 +1,32 @@ +#ifndef CMARK_SYNTAX_EXTENSION_H +#define CMARK_SYNTAX_EXTENSION_H + +#include "cmark-gfm.h" +#include "cmark-gfm-extension_api.h" +#include "config.h" + +struct cmark_syntax_extension { + cmark_match_block_func last_block_matches; + cmark_open_block_func try_opening_block; + cmark_match_inline_func match_inline; + cmark_inline_from_delim_func insert_inline_from_delim; + cmark_llist * special_inline_chars; + char * name; + void * priv; + bool emphasis; + cmark_free_func free_function; + cmark_get_type_string_func get_type_string_func; + cmark_can_contain_func can_contain_func; + cmark_contains_inlines_func contains_inlines_func; + cmark_common_render_func commonmark_render_func; + cmark_common_render_func plaintext_render_func; + cmark_common_render_func latex_render_func; + cmark_common_render_func man_render_func; + cmark_html_render_func html_render_func; + cmark_html_filter_func html_filter_func; + cmark_postprocess_func postprocess_func; + cmark_opaque_free_func opaque_free_func; + cmark_commonmark_escape_func commonmark_escape_func; +}; + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/syntax_extension.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/syntax_extension.o new file mode 100644 index 000000000000..5521986674e0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/syntax_extension.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/table.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/table.c new file mode 100644 index 000000000000..ef08a3ae88a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/table.c @@ -0,0 +1,701 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "ext_scanners.h" +#include "strikethrough.h" +#include "table.h" + +cmark_node_type CMARK_NODE_TABLE, CMARK_NODE_TABLE_ROW, + CMARK_NODE_TABLE_CELL; + +typedef struct { + uint16_t n_columns; + cmark_llist *cells; +} table_row; + +typedef struct { + uint16_t n_columns; + uint8_t *alignments; +} node_table; + +typedef struct { + bool is_header; +} node_table_row; + +typedef struct { + cmark_strbuf *buf; + int start_offset, end_offset, internal_offset; +} node_cell; + +static void free_table_cell(cmark_mem *mem, void *data) { + node_cell *cell = (node_cell *)data; + cmark_strbuf_free((cmark_strbuf *)cell->buf); + mem->free(cell->buf); + mem->free(cell); +} + +static void free_table_row(cmark_mem *mem, table_row *row) { + if (!row) + return; + + cmark_llist_free_full(mem, row->cells, (cmark_free_func)free_table_cell); + + mem->free(row); +} + +static void free_node_table(cmark_mem *mem, void *ptr) { + node_table *t = (node_table *)ptr; + mem->free(t->alignments); + mem->free(t); +} + +static void free_node_table_row(cmark_mem *mem, void *ptr) { + mem->free(ptr); +} + +static int get_n_table_columns(cmark_node *node) { + if (!node || node->type != CMARK_NODE_TABLE) + return -1; + + return (int)((node_table *)node->as.opaque)->n_columns; +} + +static int set_n_table_columns(cmark_node *node, uint16_t n_columns) { + if (!node || node->type != CMARK_NODE_TABLE) + return 0; + + ((node_table *)node->as.opaque)->n_columns = n_columns; + return 1; +} + +static uint8_t *get_table_alignments(cmark_node *node) { + if (!node || node->type != CMARK_NODE_TABLE) + return 0; + + return ((node_table *)node->as.opaque)->alignments; +} + +static int set_table_alignments(cmark_node *node, uint8_t *alignments) { + if (!node || node->type != CMARK_NODE_TABLE) + return 0; + + ((node_table *)node->as.opaque)->alignments = alignments; + return 1; +} + +static cmark_strbuf *unescape_pipes(cmark_mem *mem, unsigned char *string, bufsize_t len) +{ + cmark_strbuf *res = (cmark_strbuf *)mem->calloc(1, sizeof(cmark_strbuf)); + bufsize_t r, w; + + cmark_strbuf_init(mem, res, len + 1); + cmark_strbuf_put(res, string, len); + cmark_strbuf_putc(res, '\0'); + + for (r = 0, w = 0; r < len; ++r) { + if (res->ptr[r] == '\\' && res->ptr[r + 1] == '|') + r++; + + res->ptr[w++] = res->ptr[r]; + } + + cmark_strbuf_truncate(res, w); + + return res; +} + +static table_row *row_from_string(cmark_syntax_extension *self, + cmark_parser *parser, unsigned char *string, + int len) { + table_row *row = NULL; + bufsize_t cell_matched, pipe_matched, offset; + + row = (table_row *)parser->mem->calloc(1, sizeof(table_row)); + row->n_columns = 0; + row->cells = NULL; + + offset = scan_table_cell_end(string, len, 0); + + do { + cell_matched = scan_table_cell(string, len, offset); + pipe_matched = scan_table_cell_end(string, len, offset + cell_matched); + + if (cell_matched || pipe_matched) { + cmark_strbuf *cell_buf = unescape_pipes(parser->mem, string + offset, + cell_matched); + cmark_strbuf_trim(cell_buf); + + node_cell *cell = (node_cell *)parser->mem->calloc(1, sizeof(*cell)); + cell->buf = cell_buf; + cell->start_offset = offset; + cell->end_offset = offset + cell_matched - 1; + while (cell->start_offset > 0 && string[cell->start_offset - 1] != '|') { + --cell->start_offset; + ++cell->internal_offset; + } + row->n_columns += 1; + row->cells = cmark_llist_append(parser->mem, row->cells, cell); + } + + offset += cell_matched + pipe_matched; + + if (!pipe_matched) { + pipe_matched = scan_table_row_end(string, len, offset); + offset += pipe_matched; + } + } while ((cell_matched || pipe_matched) && offset < len); + + if (offset != len || !row->n_columns) { + free_table_row(parser->mem, row); + row = NULL; + } + + return row; +} + +static cmark_node *try_opening_table_header(cmark_syntax_extension *self, + cmark_parser *parser, + cmark_node *parent_container, + unsigned char *input, int len) { + bufsize_t matched = + scan_table_start(input, len, cmark_parser_get_first_nonspace(parser)); + cmark_node *table_header; + table_row *header_row = NULL; + table_row *marker_row = NULL; + node_table_row *ntr; + const char *parent_string; + uint16_t i; + + if (!matched) + return parent_container; + + parent_string = cmark_node_get_string_content(parent_container); + + cmark_arena_push(); + + header_row = row_from_string(self, parser, (unsigned char *)parent_string, + (int)strlen(parent_string)); + + if (!header_row) { + free_table_row(parser->mem, header_row); + cmark_arena_pop(); + return parent_container; + } + + marker_row = row_from_string(self, parser, + input + cmark_parser_get_first_nonspace(parser), + len - cmark_parser_get_first_nonspace(parser)); + + assert(marker_row); + + if (header_row->n_columns != marker_row->n_columns) { + free_table_row(parser->mem, header_row); + free_table_row(parser->mem, marker_row); + cmark_arena_pop(); + return parent_container; + } + + if (cmark_arena_pop()) { + header_row = row_from_string(self, parser, (unsigned char *)parent_string, + (int)strlen(parent_string)); + marker_row = row_from_string(self, parser, + input + cmark_parser_get_first_nonspace(parser), + len - cmark_parser_get_first_nonspace(parser)); + } + + if (!cmark_node_set_type(parent_container, CMARK_NODE_TABLE)) { + free_table_row(parser->mem, header_row); + free_table_row(parser->mem, marker_row); + return parent_container; + } + + cmark_node_set_syntax_extension(parent_container, self); + + parent_container->as.opaque = parser->mem->calloc(1, sizeof(node_table)); + + set_n_table_columns(parent_container, header_row->n_columns); + + uint8_t *alignments = + (uint8_t *)parser->mem->calloc(header_row->n_columns, sizeof(uint8_t)); + cmark_llist *it = marker_row->cells; + for (i = 0; it; it = it->next, ++i) { + node_cell *node = (node_cell *)it->data; + bool left = node->buf->ptr[0] == ':', right = node->buf->ptr[node->buf->size - 1] == ':'; + + if (left && right) + alignments[i] = 'c'; + else if (left) + alignments[i] = 'l'; + else if (right) + alignments[i] = 'r'; + } + set_table_alignments(parent_container, alignments); + + table_header = + cmark_parser_add_child(parser, parent_container, CMARK_NODE_TABLE_ROW, + parent_container->start_column); + cmark_node_set_syntax_extension(table_header, self); + table_header->end_column = parent_container->start_column + (int)strlen(parent_string) - 2; + table_header->start_line = table_header->end_line = parent_container->start_line; + + table_header->as.opaque = ntr = (node_table_row *)parser->mem->calloc(1, sizeof(node_table_row)); + ntr->is_header = true; + + { + cmark_llist *tmp; + + for (tmp = header_row->cells; tmp; tmp = tmp->next) { + node_cell *cell = (node_cell *) tmp->data; + cmark_node *header_cell = cmark_parser_add_child(parser, table_header, + CMARK_NODE_TABLE_CELL, parent_container->start_column + cell->start_offset); + header_cell->start_line = header_cell->end_line = parent_container->start_line; + header_cell->internal_offset = cell->internal_offset; + header_cell->end_column = parent_container->start_column + cell->end_offset; + cmark_node_set_string_content(header_cell, (char *) cell->buf->ptr); + cmark_node_set_syntax_extension(header_cell, self); + } + } + + cmark_parser_advance_offset( + parser, (char *)input, + (int)strlen((char *)input) - 1 - cmark_parser_get_offset(parser), false); + + free_table_row(parser->mem, header_row); + free_table_row(parser->mem, marker_row); + return parent_container; +} + +static cmark_node *try_opening_table_row(cmark_syntax_extension *self, + cmark_parser *parser, + cmark_node *parent_container, + unsigned char *input, int len) { + cmark_node *table_row_block; + table_row *row; + + if (cmark_parser_is_blank(parser)) + return NULL; + + table_row_block = + cmark_parser_add_child(parser, parent_container, CMARK_NODE_TABLE_ROW, + parent_container->start_column); + cmark_node_set_syntax_extension(table_row_block, self); + table_row_block->end_column = parent_container->end_column; + table_row_block->as.opaque = parser->mem->calloc(1, sizeof(node_table_row)); + + row = row_from_string(self, parser, input + cmark_parser_get_first_nonspace(parser), + len - cmark_parser_get_first_nonspace(parser)); + + { + cmark_llist *tmp; + int i, table_columns = get_n_table_columns(parent_container); + + for (tmp = row->cells, i = 0; tmp && i < table_columns; tmp = tmp->next, ++i) { + node_cell *cell = (node_cell *) tmp->data; + cmark_node *node = cmark_parser_add_child(parser, table_row_block, + CMARK_NODE_TABLE_CELL, parent_container->start_column + cell->start_offset); + node->internal_offset = cell->internal_offset; + node->end_column = parent_container->start_column + cell->end_offset; + cmark_node_set_string_content(node, (char *) cell->buf->ptr); + cmark_node_set_syntax_extension(node, self); + } + + for (; i < table_columns; ++i) { + cmark_node *node = cmark_parser_add_child( + parser, table_row_block, CMARK_NODE_TABLE_CELL, 0); + cmark_node_set_syntax_extension(node, self); + } + } + + free_table_row(parser->mem, row); + + cmark_parser_advance_offset(parser, (char *)input, + len - 1 - cmark_parser_get_offset(parser), false); + + return table_row_block; +} + +static cmark_node *try_opening_table_block(cmark_syntax_extension *self, + int indented, cmark_parser *parser, + cmark_node *parent_container, + unsigned char *input, int len) { + cmark_node_type parent_type = cmark_node_get_type(parent_container); + + if (!indented && parent_type == CMARK_NODE_PARAGRAPH) { + return try_opening_table_header(self, parser, parent_container, input, len); + } else if (!indented && parent_type == CMARK_NODE_TABLE) { + return try_opening_table_row(self, parser, parent_container, input, len); + } + + return NULL; +} + +static int matches(cmark_syntax_extension *self, cmark_parser *parser, + unsigned char *input, int len, + cmark_node *parent_container) { + int res = 0; + + if (cmark_node_get_type(parent_container) == CMARK_NODE_TABLE) { + cmark_arena_push(); + table_row *new_row = row_from_string( + self, parser, input + cmark_parser_get_first_nonspace(parser), + len - cmark_parser_get_first_nonspace(parser)); + if (new_row && new_row->n_columns) + res = 1; + free_table_row(parser->mem, new_row); + cmark_arena_pop(); + } + + return res; +} + +static const char *get_type_string(cmark_syntax_extension *self, + cmark_node *node) { + if (node->type == CMARK_NODE_TABLE) { + return "table"; + } else if (node->type == CMARK_NODE_TABLE_ROW) { + if (((node_table_row *)node->as.opaque)->is_header) + return "table_header"; + else + return "table_row"; + } else if (node->type == CMARK_NODE_TABLE_CELL) { + return "table_cell"; + } + + return ""; +} + +static int can_contain(cmark_syntax_extension *extension, cmark_node *node, + cmark_node_type child_type) { + if (node->type == CMARK_NODE_TABLE) { + return child_type == CMARK_NODE_TABLE_ROW; + } else if (node->type == CMARK_NODE_TABLE_ROW) { + return child_type == CMARK_NODE_TABLE_CELL; + } else if (node->type == CMARK_NODE_TABLE_CELL) { + return child_type == CMARK_NODE_TEXT || child_type == CMARK_NODE_CODE || + child_type == CMARK_NODE_EMPH || child_type == CMARK_NODE_STRONG || + child_type == CMARK_NODE_LINK || child_type == CMARK_NODE_IMAGE || + child_type == CMARK_NODE_STRIKETHROUGH || + child_type == CMARK_NODE_HTML_INLINE || + child_type == CMARK_NODE_FOOTNOTE_REFERENCE; + } + return false; +} + +static int contains_inlines(cmark_syntax_extension *extension, + cmark_node *node) { + return node->type == CMARK_NODE_TABLE_CELL; +} + +static void commonmark_render(cmark_syntax_extension *extension, + cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + bool entering = (ev_type == CMARK_EVENT_ENTER); + + if (node->type == CMARK_NODE_TABLE) { + renderer->blankline(renderer); + } else if (node->type == CMARK_NODE_TABLE_ROW) { + if (entering) { + renderer->cr(renderer); + renderer->out(renderer, node, "|", false, LITERAL); + } + } else if (node->type == CMARK_NODE_TABLE_CELL) { + if (entering) { + renderer->out(renderer, node, " ", false, LITERAL); + } else { + renderer->out(renderer, node, " |", false, LITERAL); + if (((node_table_row *)node->parent->as.opaque)->is_header && + !node->next) { + int i; + uint8_t *alignments = get_table_alignments(node->parent->parent); + uint16_t n_cols = + ((node_table *)node->parent->parent->as.opaque)->n_columns; + renderer->cr(renderer); + renderer->out(renderer, node, "|", false, LITERAL); + for (i = 0; i < n_cols; i++) { + switch (alignments[i]) { + case 0: renderer->out(renderer, node, " --- |", false, LITERAL); break; + case 'l': renderer->out(renderer, node, " :-- |", false, LITERAL); break; + case 'c': renderer->out(renderer, node, " :-: |", false, LITERAL); break; + case 'r': renderer->out(renderer, node, " --: |", false, LITERAL); break; + } + } + renderer->cr(renderer); + } + } + } else { + assert(false); + } +} + +static void latex_render(cmark_syntax_extension *extension, + cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + bool entering = (ev_type == CMARK_EVENT_ENTER); + + if (node->type == CMARK_NODE_TABLE) { + if (entering) { + int i; + uint16_t n_cols; + uint8_t *alignments = get_table_alignments(node); + + renderer->cr(renderer); + renderer->out(renderer, node, "\\begin{table}", false, LITERAL); + renderer->cr(renderer); + renderer->out(renderer, node, "\\begin{tabular}{", false, LITERAL); + + n_cols = ((node_table *)node->as.opaque)->n_columns; + for (i = 0; i < n_cols; i++) { + switch(alignments[i]) { + case 0: + case 'l': + renderer->out(renderer, node, "l", false, LITERAL); + break; + case 'c': + renderer->out(renderer, node, "c", false, LITERAL); + break; + case 'r': + renderer->out(renderer, node, "r", false, LITERAL); + break; + } + } + renderer->out(renderer, node, "}", false, LITERAL); + renderer->cr(renderer); + } else { + renderer->out(renderer, node, "\\end{tabular}", false, LITERAL); + renderer->cr(renderer); + renderer->out(renderer, node, "\\end{table}", false, LITERAL); + renderer->cr(renderer); + } + } else if (node->type == CMARK_NODE_TABLE_ROW) { + if (!entering) { + renderer->cr(renderer); + } + } else if (node->type == CMARK_NODE_TABLE_CELL) { + if (!entering) { + if (node->next) { + renderer->out(renderer, node, " & ", false, LITERAL); + } else { + renderer->out(renderer, node, " \\\\", false, LITERAL); + } + } + } else { + assert(false); + } +} + +static void man_render(cmark_syntax_extension *extension, + cmark_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + bool entering = (ev_type == CMARK_EVENT_ENTER); + + if (node->type == CMARK_NODE_TABLE) { + if (entering) { + int i; + uint16_t n_cols; + uint8_t *alignments = get_table_alignments(node); + + renderer->cr(renderer); + renderer->out(renderer, node, ".TS", false, LITERAL); + renderer->cr(renderer); + renderer->out(renderer, node, "tab(@);", false, LITERAL); + renderer->cr(renderer); + + n_cols = ((node_table *)node->as.opaque)->n_columns; + + for (i = 0; i < n_cols; i++) { + switch (alignments[i]) { + case 'l': + renderer->out(renderer, node, "l", false, LITERAL); + break; + case 0: + case 'c': + renderer->out(renderer, node, "c", false, LITERAL); + break; + case 'r': + renderer->out(renderer, node, "r", false, LITERAL); + break; + } + } + + if (n_cols) { + renderer->out(renderer, node, ".", false, LITERAL); + renderer->cr(renderer); + } + } else { + renderer->out(renderer, node, ".TE", false, LITERAL); + renderer->cr(renderer); + } + } else if (node->type == CMARK_NODE_TABLE_ROW) { + if (!entering) { + renderer->cr(renderer); + } + } else if (node->type == CMARK_NODE_TABLE_CELL) { + if (!entering && node->next) { + renderer->out(renderer, node, "@", false, LITERAL); + } + } else { + assert(false); + } +} + +static void html_table_add_align(cmark_strbuf* html, const char* align, int options) { + if (options & CMARK_OPT_TABLE_PREFER_STYLE_ATTRIBUTES) { + cmark_strbuf_puts(html, " style=\"text-align: "); + cmark_strbuf_puts(html, align); + cmark_strbuf_puts(html, "\""); + } else { + cmark_strbuf_puts(html, " align=\""); + cmark_strbuf_puts(html, align); + cmark_strbuf_puts(html, "\""); + } +} + +struct html_table_state { + unsigned need_closing_table_body : 1; + unsigned in_table_header : 1; +}; + +static void html_render(cmark_syntax_extension *extension, + cmark_html_renderer *renderer, cmark_node *node, + cmark_event_type ev_type, int options) { + bool entering = (ev_type == CMARK_EVENT_ENTER); + cmark_strbuf *html = renderer->html; + cmark_node *n; + + // XXX: we just monopolise renderer->opaque. + struct html_table_state *table_state = + (struct html_table_state *)&renderer->opaque; + + if (node->type == CMARK_NODE_TABLE) { + if (entering) { + cmark_html_render_cr(html); + cmark_strbuf_puts(html, "'); + table_state->need_closing_table_body = false; + } else { + if (table_state->need_closing_table_body) { + cmark_html_render_cr(html); + cmark_strbuf_puts(html, ""); + cmark_html_render_cr(html); + } + table_state->need_closing_table_body = false; + cmark_html_render_cr(html); + cmark_strbuf_puts(html, ""); + cmark_html_render_cr(html); + } + } else if (node->type == CMARK_NODE_TABLE_ROW) { + if (entering) { + cmark_html_render_cr(html); + if (((node_table_row *)node->as.opaque)->is_header) { + table_state->in_table_header = 1; + cmark_strbuf_puts(html, ""); + cmark_html_render_cr(html); + } else if (!table_state->need_closing_table_body) { + cmark_strbuf_puts(html, ""); + cmark_html_render_cr(html); + table_state->need_closing_table_body = 1; + } + cmark_strbuf_puts(html, "'); + } else { + cmark_html_render_cr(html); + cmark_strbuf_puts(html, ""); + if (((node_table_row *)node->as.opaque)->is_header) { + cmark_html_render_cr(html); + cmark_strbuf_puts(html, ""); + table_state->in_table_header = false; + } + } + } else if (node->type == CMARK_NODE_TABLE_CELL) { + uint8_t *alignments = get_table_alignments(node->parent->parent); + if (entering) { + cmark_html_render_cr(html); + if (table_state->in_table_header) { + cmark_strbuf_puts(html, "parent->first_child; n; n = n->next, ++i) + if (n == node) + break; + + switch (alignments[i]) { + case 'l': html_table_add_align(html, "left", options); break; + case 'c': html_table_add_align(html, "center", options); break; + case 'r': html_table_add_align(html, "right", options); break; + } + + cmark_html_render_sourcepos(node, html, options); + cmark_strbuf_putc(html, '>'); + } else { + if (table_state->in_table_header) { + cmark_strbuf_puts(html, ""); + } else { + cmark_strbuf_puts(html, ""); + } + } + } else { + assert(false); + } +} + +static void opaque_free(cmark_syntax_extension *self, cmark_mem *mem, cmark_node *node) { + if (node->type == CMARK_NODE_TABLE) { + free_node_table(mem, node->as.opaque); + } else if (node->type == CMARK_NODE_TABLE_ROW) { + free_node_table_row(mem, node->as.opaque); + } +} + +static int escape(cmark_syntax_extension *self, cmark_node *node, int c) { + return + node->type != CMARK_NODE_TABLE && + node->type != CMARK_NODE_TABLE_ROW && + node->type != CMARK_NODE_TABLE_CELL && + c == '|'; +} + +cmark_syntax_extension *create_table_extension(void) { + cmark_syntax_extension *self = cmark_syntax_extension_new("table"); + + cmark_syntax_extension_set_match_block_func(self, matches); + cmark_syntax_extension_set_open_block_func(self, try_opening_table_block); + cmark_syntax_extension_set_get_type_string_func(self, get_type_string); + cmark_syntax_extension_set_can_contain_func(self, can_contain); + cmark_syntax_extension_set_contains_inlines_func(self, contains_inlines); + cmark_syntax_extension_set_commonmark_render_func(self, commonmark_render); + cmark_syntax_extension_set_plaintext_render_func(self, commonmark_render); + cmark_syntax_extension_set_latex_render_func(self, latex_render); + cmark_syntax_extension_set_man_render_func(self, man_render); + cmark_syntax_extension_set_html_render_func(self, html_render); + cmark_syntax_extension_set_opaque_free_func(self, opaque_free); + cmark_syntax_extension_set_commonmark_escape_func(self, escape); + CMARK_NODE_TABLE = cmark_syntax_extension_add_node(0); + CMARK_NODE_TABLE_ROW = cmark_syntax_extension_add_node(0); + CMARK_NODE_TABLE_CELL = cmark_syntax_extension_add_node(0); + + return self; +} + +uint16_t cmark_gfm_extensions_get_table_columns(cmark_node *node) { + if (node->type != CMARK_NODE_TABLE) + return 0; + + return ((node_table *)node->as.opaque)->n_columns; +} + +uint8_t *cmark_gfm_extensions_get_table_alignments(cmark_node *node) { + if (node->type != CMARK_NODE_TABLE) + return 0; + + return ((node_table *)node->as.opaque)->alignments; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/table.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/table.h new file mode 100644 index 000000000000..f6a0634f0262 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/table.h @@ -0,0 +1,12 @@ +#ifndef CMARK_GFM_TABLE_H +#define CMARK_GFM_TABLE_H + +#include "cmark-gfm-core-extensions.h" + + +extern cmark_node_type CMARK_NODE_TABLE, CMARK_NODE_TABLE_ROW, + CMARK_NODE_TABLE_CELL; + +cmark_syntax_extension *create_table_extension(void); + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/table.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/table.o new file mode 100644 index 000000000000..70c9a93a68a6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/table.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/tagfilter.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/tagfilter.c new file mode 100644 index 000000000000..262352e0c4c2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/tagfilter.c @@ -0,0 +1,60 @@ +#include "tagfilter.h" +#include +#include + +static const char *blacklist[] = { + "title", "textarea", "style", "xmp", "iframe", + "noembed", "noframes", "script", "plaintext", NULL, +}; + +static int is_tag(const unsigned char *tag_data, size_t tag_size, + const char *tagname) { + size_t i; + + if (tag_size < 3 || tag_data[0] != '<') + return 0; + + i = 1; + + if (tag_data[i] == '/') { + i++; + } + + for (; i < tag_size; ++i, ++tagname) { + if (*tagname == 0) + break; + + if (tolower(tag_data[i]) != *tagname) + return 0; + } + + if (i == tag_size) + return 0; + + if (cmark_isspace(tag_data[i]) || tag_data[i] == '>') + return 1; + + if (tag_data[i] == '/' && tag_size >= i + 2 && tag_data[i + 1] == '>') + return 1; + + return 0; +} + +static int filter(cmark_syntax_extension *ext, const unsigned char *tag, + size_t tag_len) { + const char **it; + + for (it = blacklist; *it; ++it) { + if (is_tag(tag, tag_len, *it)) { + return 0; + } + } + + return 1; +} + +cmark_syntax_extension *create_tagfilter_extension(void) { + cmark_syntax_extension *ext = cmark_syntax_extension_new("tagfilter"); + cmark_syntax_extension_set_html_filter_func(ext, filter); + return ext; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/tagfilter.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/tagfilter.h new file mode 100644 index 000000000000..9a5f388d4e20 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/tagfilter.h @@ -0,0 +1,8 @@ +#ifndef CMARK_GFM_TAGFILTER_H +#define CMARK_GFM_TAGFILTER_H + +#include "cmark-gfm-core-extensions.h" + +cmark_syntax_extension *create_tagfilter_extension(void); + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/tagfilter.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/tagfilter.o new file mode 100644 index 000000000000..8e420c3dcee9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/tagfilter.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/utf8.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/utf8.c new file mode 100644 index 000000000000..c29bbf770b4d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/utf8.c @@ -0,0 +1,317 @@ +#include +#include +#include + +#include "cmark_ctype.h" +#include "utf8.h" + +static const int8_t utf8proc_utf8class[256] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0}; + +static void encode_unknown(cmark_strbuf *buf) { + static const uint8_t repl[] = {239, 191, 189}; + cmark_strbuf_put(buf, repl, 3); +} + +static int utf8proc_charlen(const uint8_t *str, bufsize_t str_len) { + int length, i; + + if (!str_len) + return 0; + + length = utf8proc_utf8class[str[0]]; + + if (!length) + return -1; + + if (str_len >= 0 && (bufsize_t)length > str_len) + return -str_len; + + for (i = 1; i < length; i++) { + if ((str[i] & 0xC0) != 0x80) + return -i; + } + + return length; +} + +// Validate a single UTF-8 character according to RFC 3629. +static int utf8proc_valid(const uint8_t *str, bufsize_t str_len) { + int length = utf8proc_utf8class[str[0]]; + + if (!length) + return -1; + + if ((bufsize_t)length > str_len) + return -str_len; + + switch (length) { + case 2: + if ((str[1] & 0xC0) != 0x80) + return -1; + if (str[0] < 0xC2) { + // Overlong + return -length; + } + break; + + case 3: + if ((str[1] & 0xC0) != 0x80) + return -1; + if ((str[2] & 0xC0) != 0x80) + return -2; + if (str[0] == 0xE0) { + if (str[1] < 0xA0) { + // Overlong + return -length; + } + } else if (str[0] == 0xED) { + if (str[1] >= 0xA0) { + // Surrogate + return -length; + } + } + break; + + case 4: + if ((str[1] & 0xC0) != 0x80) + return -1; + if ((str[2] & 0xC0) != 0x80) + return -2; + if ((str[3] & 0xC0) != 0x80) + return -3; + if (str[0] == 0xF0) { + if (str[1] < 0x90) { + // Overlong + return -length; + } + } else if (str[0] >= 0xF4) { + if (str[0] > 0xF4 || str[1] >= 0x90) { + // Above 0x10FFFF + return -length; + } + } + break; + } + + return length; +} + +void cmark_utf8proc_check(cmark_strbuf *ob, const uint8_t *line, + bufsize_t size) { + bufsize_t i = 0; + + while (i < size) { + bufsize_t org = i; + int charlen = 0; + + while (i < size) { + if (line[i] < 0x80 && line[i] != 0) { + i++; + } else if (line[i] >= 0x80) { + charlen = utf8proc_valid(line + i, size - i); + if (charlen < 0) { + charlen = -charlen; + break; + } + i += charlen; + } else if (line[i] == 0) { + // ASCII NUL is technically valid but rejected + // for security reasons. + charlen = 1; + break; + } + } + + if (i > org) { + cmark_strbuf_put(ob, line + org, i - org); + } + + if (i >= size) { + break; + } else { + // Invalid UTF-8 + encode_unknown(ob); + i += charlen; + } + } +} + +int cmark_utf8proc_iterate(const uint8_t *str, bufsize_t str_len, + int32_t *dst) { + int length; + int32_t uc = -1; + + *dst = -1; + length = utf8proc_charlen(str, str_len); + if (length < 0) + return -1; + + switch (length) { + case 1: + uc = str[0]; + break; + case 2: + uc = ((str[0] & 0x1F) << 6) + (str[1] & 0x3F); + if (uc < 0x80) + uc = -1; + break; + case 3: + uc = ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) << 6) + (str[2] & 0x3F); + if (uc < 0x800 || (uc >= 0xD800 && uc < 0xE000)) + uc = -1; + break; + case 4: + uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12) + + ((str[2] & 0x3F) << 6) + (str[3] & 0x3F); + if (uc < 0x10000 || uc >= 0x110000) + uc = -1; + break; + } + + if (uc < 0) + return -1; + + *dst = uc; + return length; +} + +void cmark_utf8proc_encode_char(int32_t uc, cmark_strbuf *buf) { + uint8_t dst[4]; + bufsize_t len = 0; + + assert(uc >= 0); + + if (uc < 0x80) { + dst[0] = (uint8_t)(uc); + len = 1; + } else if (uc < 0x800) { + dst[0] = (uint8_t)(0xC0 + (uc >> 6)); + dst[1] = 0x80 + (uc & 0x3F); + len = 2; + } else if (uc == 0xFFFF) { + dst[0] = 0xFF; + len = 1; + } else if (uc == 0xFFFE) { + dst[0] = 0xFE; + len = 1; + } else if (uc < 0x10000) { + dst[0] = (uint8_t)(0xE0 + (uc >> 12)); + dst[1] = 0x80 + ((uc >> 6) & 0x3F); + dst[2] = 0x80 + (uc & 0x3F); + len = 3; + } else if (uc < 0x110000) { + dst[0] = (uint8_t)(0xF0 + (uc >> 18)); + dst[1] = 0x80 + ((uc >> 12) & 0x3F); + dst[2] = 0x80 + ((uc >> 6) & 0x3F); + dst[3] = 0x80 + (uc & 0x3F); + len = 4; + } else { + encode_unknown(buf); + return; + } + + cmark_strbuf_put(buf, dst, len); +} + +void cmark_utf8proc_case_fold(cmark_strbuf *dest, const uint8_t *str, + bufsize_t len) { + int32_t c; + +#define bufpush(x) cmark_utf8proc_encode_char(x, dest) + + while (len > 0) { + bufsize_t char_len = cmark_utf8proc_iterate(str, len, &c); + + if (char_len >= 0) { +#include "case_fold_switch.inc" + } else { + encode_unknown(dest); + char_len = -char_len; + } + + str += char_len; + len -= char_len; + } +} + +// matches anything in the Zs class, plus LF, CR, TAB, FF. +int cmark_utf8proc_is_space(int32_t uc) { + return (uc == 9 || uc == 10 || uc == 12 || uc == 13 || uc == 32 || + uc == 160 || uc == 5760 || (uc >= 8192 && uc <= 8202) || uc == 8239 || + uc == 8287 || uc == 12288); +} + +// matches anything in the P[cdefios] classes. +int cmark_utf8proc_is_punctuation(int32_t uc) { + return ( + (uc < 128 && cmark_ispunct((char)uc)) || uc == 161 || uc == 167 || + uc == 171 || uc == 182 || uc == 183 || uc == 187 || uc == 191 || + uc == 894 || uc == 903 || (uc >= 1370 && uc <= 1375) || uc == 1417 || + uc == 1418 || uc == 1470 || uc == 1472 || uc == 1475 || uc == 1478 || + uc == 1523 || uc == 1524 || uc == 1545 || uc == 1546 || uc == 1548 || + uc == 1549 || uc == 1563 || uc == 1566 || uc == 1567 || + (uc >= 1642 && uc <= 1645) || uc == 1748 || (uc >= 1792 && uc <= 1805) || + (uc >= 2039 && uc <= 2041) || (uc >= 2096 && uc <= 2110) || uc == 2142 || + uc == 2404 || uc == 2405 || uc == 2416 || uc == 2800 || uc == 3572 || + uc == 3663 || uc == 3674 || uc == 3675 || (uc >= 3844 && uc <= 3858) || + uc == 3860 || (uc >= 3898 && uc <= 3901) || uc == 3973 || + (uc >= 4048 && uc <= 4052) || uc == 4057 || uc == 4058 || + (uc >= 4170 && uc <= 4175) || uc == 4347 || (uc >= 4960 && uc <= 4968) || + uc == 5120 || uc == 5741 || uc == 5742 || uc == 5787 || uc == 5788 || + (uc >= 5867 && uc <= 5869) || uc == 5941 || uc == 5942 || + (uc >= 6100 && uc <= 6102) || (uc >= 6104 && uc <= 6106) || + (uc >= 6144 && uc <= 6154) || uc == 6468 || uc == 6469 || uc == 6686 || + uc == 6687 || (uc >= 6816 && uc <= 6822) || (uc >= 6824 && uc <= 6829) || + (uc >= 7002 && uc <= 7008) || (uc >= 7164 && uc <= 7167) || + (uc >= 7227 && uc <= 7231) || uc == 7294 || uc == 7295 || + (uc >= 7360 && uc <= 7367) || uc == 7379 || (uc >= 8208 && uc <= 8231) || + (uc >= 8240 && uc <= 8259) || (uc >= 8261 && uc <= 8273) || + (uc >= 8275 && uc <= 8286) || uc == 8317 || uc == 8318 || uc == 8333 || + uc == 8334 || (uc >= 8968 && uc <= 8971) || uc == 9001 || uc == 9002 || + (uc >= 10088 && uc <= 10101) || uc == 10181 || uc == 10182 || + (uc >= 10214 && uc <= 10223) || (uc >= 10627 && uc <= 10648) || + (uc >= 10712 && uc <= 10715) || uc == 10748 || uc == 10749 || + (uc >= 11513 && uc <= 11516) || uc == 11518 || uc == 11519 || + uc == 11632 || (uc >= 11776 && uc <= 11822) || + (uc >= 11824 && uc <= 11842) || (uc >= 12289 && uc <= 12291) || + (uc >= 12296 && uc <= 12305) || (uc >= 12308 && uc <= 12319) || + uc == 12336 || uc == 12349 || uc == 12448 || uc == 12539 || uc == 42238 || + uc == 42239 || (uc >= 42509 && uc <= 42511) || uc == 42611 || + uc == 42622 || (uc >= 42738 && uc <= 42743) || + (uc >= 43124 && uc <= 43127) || uc == 43214 || uc == 43215 || + (uc >= 43256 && uc <= 43258) || uc == 43310 || uc == 43311 || + uc == 43359 || (uc >= 43457 && uc <= 43469) || uc == 43486 || + uc == 43487 || (uc >= 43612 && uc <= 43615) || uc == 43742 || + uc == 43743 || uc == 43760 || uc == 43761 || uc == 44011 || uc == 64830 || + uc == 64831 || (uc >= 65040 && uc <= 65049) || + (uc >= 65072 && uc <= 65106) || (uc >= 65108 && uc <= 65121) || + uc == 65123 || uc == 65128 || uc == 65130 || uc == 65131 || + (uc >= 65281 && uc <= 65283) || (uc >= 65285 && uc <= 65290) || + (uc >= 65292 && uc <= 65295) || uc == 65306 || uc == 65307 || + uc == 65311 || uc == 65312 || (uc >= 65339 && uc <= 65341) || + uc == 65343 || uc == 65371 || uc == 65373 || + (uc >= 65375 && uc <= 65381) || (uc >= 65792 && uc <= 65794) || + uc == 66463 || uc == 66512 || uc == 66927 || uc == 67671 || uc == 67871 || + uc == 67903 || (uc >= 68176 && uc <= 68184) || uc == 68223 || + (uc >= 68336 && uc <= 68342) || (uc >= 68409 && uc <= 68415) || + (uc >= 68505 && uc <= 68508) || (uc >= 69703 && uc <= 69709) || + uc == 69819 || uc == 69820 || (uc >= 69822 && uc <= 69825) || + (uc >= 69952 && uc <= 69955) || uc == 70004 || uc == 70005 || + (uc >= 70085 && uc <= 70088) || uc == 70093 || + (uc >= 70200 && uc <= 70205) || uc == 70854 || + (uc >= 71105 && uc <= 71113) || (uc >= 71233 && uc <= 71235) || + (uc >= 74864 && uc <= 74868) || uc == 92782 || uc == 92783 || + uc == 92917 || (uc >= 92983 && uc <= 92987) || uc == 92996 || + uc == 113823); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/utf8.h b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/utf8.h new file mode 100644 index 000000000000..04ec1611b866 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/utf8.h @@ -0,0 +1,35 @@ +#ifndef CMARK_UTF8_H +#define CMARK_UTF8_H + +#include +#include "buffer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +CMARK_GFM_EXPORT +void cmark_utf8proc_case_fold(cmark_strbuf *dest, const uint8_t *str, + bufsize_t len); + +CMARK_GFM_EXPORT +void cmark_utf8proc_encode_char(int32_t uc, cmark_strbuf *buf); + +CMARK_GFM_EXPORT +int cmark_utf8proc_iterate(const uint8_t *str, bufsize_t str_len, int32_t *dst); + +CMARK_GFM_EXPORT +void cmark_utf8proc_check(cmark_strbuf *dest, const uint8_t *line, + bufsize_t size); + +CMARK_GFM_EXPORT +int cmark_utf8proc_is_space(int32_t uc); + +CMARK_GFM_EXPORT +int cmark_utf8proc_is_punctuation(int32_t uc); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/utf8.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/utf8.o new file mode 100644 index 000000000000..6777f673372f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/utf8.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/xml.c b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/xml.c new file mode 100644 index 000000000000..920fe7171fd3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/xml.c @@ -0,0 +1,174 @@ +#include +#include +#include +#include + +#include "config.h" +#include "cmark-gfm.h" +#include "node.h" +#include "buffer.h" +#include "houdini.h" + +#define BUFFER_SIZE 100 + +// Functions to convert cmark_nodes to XML strings. + +static void escape_xml(cmark_strbuf *dest, const unsigned char *source, + bufsize_t length) { + houdini_escape_html0(dest, source, length, 0); +} + +struct render_state { + cmark_strbuf *xml; + int indent; +}; + +static CMARK_INLINE void indent(struct render_state *state) { + int i; + for (i = 0; i < state->indent; i++) { + cmark_strbuf_putc(state->xml, ' '); + } +} + +static int S_render_node(cmark_node *node, cmark_event_type ev_type, + struct render_state *state, int options) { + cmark_strbuf *xml = state->xml; + bool literal = false; + cmark_delim_type delim; + bool entering = (ev_type == CMARK_EVENT_ENTER); + char buffer[BUFFER_SIZE]; + + if (entering) { + indent(state); + cmark_strbuf_putc(xml, '<'); + cmark_strbuf_puts(xml, cmark_node_get_type_string(node)); + + if (options & CMARK_OPT_SOURCEPOS && node->start_line != 0) { + snprintf(buffer, BUFFER_SIZE, " sourcepos=\"%d:%d-%d:%d\"", + node->start_line, node->start_column, node->end_line, + node->end_column); + cmark_strbuf_puts(xml, buffer); + } + + literal = false; + + switch (node->type) { + case CMARK_NODE_DOCUMENT: + cmark_strbuf_puts(xml, " xmlns=\"http://commonmark.org/xml/1.0\""); + break; + case CMARK_NODE_TEXT: + case CMARK_NODE_CODE: + case CMARK_NODE_HTML_BLOCK: + case CMARK_NODE_HTML_INLINE: + cmark_strbuf_puts(xml, ">"); + escape_xml(xml, node->as.literal.data, node->as.literal.len); + cmark_strbuf_puts(xml, "as.heading.level); + cmark_strbuf_puts(xml, buffer); + break; + case CMARK_NODE_CODE_BLOCK: + if (node->as.code.info.len > 0) { + cmark_strbuf_puts(xml, " info=\""); + escape_xml(xml, node->as.code.info.data, node->as.code.info.len); + cmark_strbuf_putc(xml, '"'); + } + cmark_strbuf_puts(xml, ">"); + escape_xml(xml, node->as.code.literal.data, node->as.code.literal.len); + cmark_strbuf_puts(xml, "as.custom.on_enter.data, + node->as.custom.on_enter.len); + cmark_strbuf_putc(xml, '"'); + cmark_strbuf_puts(xml, " on_exit=\""); + escape_xml(xml, node->as.custom.on_exit.data, + node->as.custom.on_exit.len); + cmark_strbuf_putc(xml, '"'); + break; + case CMARK_NODE_LINK: + case CMARK_NODE_IMAGE: + cmark_strbuf_puts(xml, " destination=\""); + escape_xml(xml, node->as.link.url.data, node->as.link.url.len); + cmark_strbuf_putc(xml, '"'); + cmark_strbuf_puts(xml, " title=\""); + escape_xml(xml, node->as.link.title.data, node->as.link.title.len); + cmark_strbuf_putc(xml, '"'); + break; + default: + break; + } + if (node->first_child) { + state->indent += 2; + } else if (!literal) { + cmark_strbuf_puts(xml, " /"); + } + cmark_strbuf_puts(xml, ">\n"); + + } else if (node->first_child) { + state->indent -= 2; + indent(state); + cmark_strbuf_puts(xml, "\n"); + } + + return 1; +} + +char *cmark_render_xml(cmark_node *root, int options) { + return cmark_render_xml_with_mem(root, options, cmark_node_mem(root)); +} + +char *cmark_render_xml_with_mem(cmark_node *root, int options, cmark_mem *mem) { + char *result; + cmark_strbuf xml = CMARK_BUF_INIT(mem); + cmark_event_type ev_type; + cmark_node *cur; + struct render_state state = {&xml, 0}; + + cmark_iter *iter = cmark_iter_new(root); + + cmark_strbuf_puts(state.xml, "\n"); + cmark_strbuf_puts(state.xml, + "\n"); + while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) { + cur = cmark_iter_get_node(iter); + S_render_node(cur, ev_type, &state, options); + } + result = (char *)cmark_strbuf_detach(&xml); + + cmark_iter_free(iter); + return result; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/xml.o b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/xml.o new file mode 100644 index 000000000000..b54d5c3d40aa Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/ext/commonmarker/xml.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker.rb new file mode 100644 index 000000000000..1a266ecc4377 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker.rb @@ -0,0 +1,42 @@ +#!/usr/bin/env ruby +require 'commonmarker/commonmarker' +require 'commonmarker/config' +require 'commonmarker/node' +require 'commonmarker/renderer' +require 'commonmarker/renderer/html_renderer' +require 'commonmarker/version' + +begin + require 'awesome_print' +rescue LoadError; end + +module CommonMarker + # Public: Parses a Markdown string into an HTML string. + # + # text - A {String} of text + # option - Either a {Symbol} or {Array of Symbol}s indicating the render options + # extensions - An {Array of Symbol}s indicating the extensions to use + # + # Returns a {String} of converted HTML. + def self.render_html(text, options = :DEFAULT, extensions = []) + fail TypeError, "text must be a String; got a #{text.class}!" unless text.is_a?(String) + opts = Config.process_options(options, :render) + text = text.encode('UTF-8') + html = Node.markdown_to_html(text, opts, extensions) + html.force_encoding('UTF-8') + end + + # Public: Parses a Markdown string into a `document` node. + # + # string - {String} to be parsed + # option - A {Symbol} or {Array of Symbol}s indicating the parse options + # extensions - An {Array of Symbol}s indicating the extensions to use + # + # Returns the `document` node. + def self.render_doc(text, options = :DEFAULT, extensions = []) + fail TypeError, "text must be a String; got a #{text.class}!" unless text.is_a?(String) + opts = Config.process_options(options, :parse) + text = text.encode('UTF-8') + Node.parse_document(text, text.bytesize, opts, extensions) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/commonmarker.so b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/commonmarker.so new file mode 100644 index 000000000000..bf52e3dd8f3f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/commonmarker.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/config.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/config.rb new file mode 100644 index 000000000000..f42ea07f38ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/config.rb @@ -0,0 +1,49 @@ +require 'ruby-enum' +module CommonMarker + # For Ruby::Enum, these must be classes, not modules + module Config + class Parse + include Ruby::Enum + + define :DEFAULT, 0 + define :VALIDATE_UTF8, (1 << 9) + define :SMART, (1 << 10) + define :LIBERAL_HTML_TAG, (1 << 12) + define :FOOTNOTES, (1 << 13) + define :STRIKETHROUGH_DOUBLE_TILDE, (1 << 14) + end + + class Render + include Ruby::Enum + + define :DEFAULT, 0 + define :SOURCEPOS, (1 << 1) + define :HARDBREAKS, (1 << 2) + define :SAFE, (1 << 3) + define :NOBREAKS, (1 << 4) + define :GITHUB_PRE_LANG, (1 << 11) + define :TABLE_PREFER_STYLE_ATTRIBUTES, (1 << 15) + define :FULL_INFO_STRING, (1 << 16) + end + + def self.process_options(option, type) + type = Config.const_get(type.capitalize) + if option.is_a?(Symbol) + check_option(option, type) + type.to_h[option] + elsif option.is_a?(Array) + option = [nil] if option.empty? + # neckbearding around. the map will both check the opts and then bitwise-OR it + option.map { |o| check_option(o, type); type.to_h[o] }.inject(0, :|) + else + raise TypeError, 'option type must be a valid symbol or array of symbols' + end + end + + def self.check_option(option, type) + unless type.keys.include?(option) + raise TypeError, "option ':#{option}' does not exist for #{type}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/node.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/node.rb new file mode 100644 index 000000000000..88512586c8f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/node.rb @@ -0,0 +1,71 @@ +require 'commonmarker/node/inspect' + +module CommonMarker + class Node + include Enumerable + include Inspect + + # Public: An iterator that "walks the tree," descending into children recursively. + # + # blk - A {Proc} representing the action to take for each child + def walk(&block) + return enum_for(:walk) unless block_given? + + yield self + each do |child| + child.walk(&block) + end + end + + # Public: Convert the node to an HTML string. + # + # options - A {Symbol} or {Array of Symbol}s indicating the render options + # extensions - An {Array of Symbol}s indicating the extensions to use + # + # Returns a {String}. + def to_html(options = :DEFAULT, extensions = []) + opts = Config.process_options(options, :render) + _render_html(opts, extensions).force_encoding('utf-8') + end + + # Public: Convert the node to a CommonMark string. + # + # options - A {Symbol} or {Array of Symbol}s indicating the render options + # width - Column to wrap the output at + # + # Returns a {String}. + def to_commonmark(options = :DEFAULT, width = 120) + opts = Config.process_options(options, :render) + _render_commonmark(opts, width).force_encoding('utf-8') + end + + # Public: Convert the node to a plain text string. + # + # options - A {Symbol} or {Array of Symbol}s indicating the render options + # width - Column to wrap the output at + # + # Returns a {String}. + def to_plaintext(options = :DEFAULT, width = 120) + opts = Config.process_options(options, :render) + _render_plaintext(opts, width).force_encoding('utf-8') + end + + # Public: Iterate over the children (if any) of the current pointer. + def each(&block) + return enum_for(:each) unless block_given? + + child = first_child + while child + nextchild = child.next + yield child + child = nextchild + end + end + + # Deprecated: Please use `each` instead + def each_child(&block) + warn '[DEPRECATION] `each_child` is deprecated. Please use `each` instead.' + each(&block) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/node/inspect.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/node/inspect.rb new file mode 100644 index 000000000000..a20000a0e718 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/node/inspect.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +require 'pp' + +module CommonMarker + class Node + module Inspect + PP_INDENT_SIZE = 2 + + def inspect + PP.pp(self, String.new, Float::INFINITY) + end + + # @param [PrettyPrint] pp + def pretty_print(pp) + pp.group(PP_INDENT_SIZE, "#<#{self.class}(#{type}):", '>') do + pp.breakable + + attrs = %i[ + sourcepos + string_content + url + title + header_level + list_type + list_start + list_tight + fence_info + ].map do |name| + begin + [name, __send__(name)] + rescue NodeError + nil + end + end.compact + + pp.seplist(attrs) do |name, value| + pp.text "#{name}=" + pp.pp value + end + + if first_child + pp.breakable + pp.group(PP_INDENT_SIZE) do + children = [] + node = first_child + while node + children << node + node = node.next + end + pp.text 'children=' + pp.pp children + end + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/renderer.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/renderer.rb new file mode 100644 index 000000000000..a121018be817 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/renderer.rb @@ -0,0 +1,129 @@ +require 'set' +require 'stringio' + +module CommonMarker + class Renderer + attr_accessor :in_tight, :warnings, :in_plain + def initialize(options: :DEFAULT, extensions: []) + @opts = Config.process_options(options, :render) + @stream = StringIO.new("".force_encoding("utf-8")) + @need_blocksep = false + @warnings = Set.new [] + @in_tight = false + @in_plain = false + @tagfilter = extensions.include?(:tagfilter) + end + + def out(*args) + args.each do |arg| + if arg == :children + @node.each { |child| out(child) } + elsif arg.is_a?(Array) + arg.each { |x| render(x) } + elsif arg.is_a?(Node) + render(arg) + else + @stream.write(arg) + end + end + end + + def render(node) + @node = node + if node.type == :document + document(node) + return @stream.string + elsif @in_plain && node.type != :text && node.type != :softbreak + node.each { |child| render(child) } + else + begin + send(node.type, node) + rescue NoMethodError => e + @warnings.add("WARNING: #{node.type} not implemented.") + raise e + end + end + end + + def document(_node) + out(:children) + end + + def code_block(node) + code_block(node) + end + + def reference_def(_node) + end + + def cr + return if @stream.string.empty? || @stream.string[-1] == "\n" + out("\n") + end + + def blocksep + out("\n") + end + + def containersep + cr unless @in_tight + end + + def block + cr + yield + cr + end + + def container(starter, ender) + out(starter) + yield + out(ender) + end + + def plain + old_in_plain = @in_plain + @in_plain = true + yield + @in_plain = old_in_plain + end + + private + + def escape_href(str) + @node.html_escape_href(str) + end + + def escape_html(str) + @node.html_escape_html(str) + end + + def tagfilter(str) + if @tagfilter + str.gsub( + %r{ + < + ( + title|textarea|style|xmp|iframe| + noembed|noframes|script|plaintext + ) + (?=\s|>|/>) + }xi, + '<\1') + else + str + end + end + + def sourcepos(node) + return "" unless option_enabled?(:SOURCEPOS) + s = node.sourcepos + " data-sourcepos=\"#{s[:start_line]}:#{s[:start_column]}-" \ + "#{s[:end_line]}:#{s[:end_column]}\"" + end + + def option_enabled?(opt) + (@opts & CommonMarker::Config::Render.value(opt)) != 0 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/renderer/html_renderer.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/renderer/html_renderer.rb new file mode 100644 index 000000000000..3bb7e60c8017 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/renderer/html_renderer.rb @@ -0,0 +1,243 @@ +module CommonMarker + class HtmlRenderer < Renderer + def render(node) + super(node) + end + + def document(_) + super + if @written_footnote_ix + out("\n\n") + end + end + + def header(node) + block do + out('", :children, + '') + end + end + + def paragraph(node) + if @in_tight && node.parent.type != :blockquote + out(:children) + else + block do + container("", '

') do + out(:children) + if node.parent.type == :footnote_definition && node.next.nil? + out(" ") + out_footnote_backref + end + end + end + end + end + + def list(node) + old_in_tight = @in_tight + @in_tight = node.list_tight + + block do + if node.list_type == :bullet_list + container("\n", '') do + out(:children) + end + else + start = if node.list_start == 1 + "\n" + else + "
    \n" + end + container(start, '
') do + out(:children) + end + end + end + + @in_tight = old_in_tight + end + + def list_item(node) + block do + container("", '') do + out(:children) + end + end + end + + def blockquote(node) + block do + container("\n", '') do + out(:children) + end + end + end + + def hrule(node) + block do + out("") + end + end + + def code_block(node) + block do + if option_enabled?(:GITHUB_PRE_LANG) + out("') + else + out("') + else + out('>') + end + end + out(escape_html(node.string_content)) + out('
') + end + end + + def html(node) + block do + if option_enabled?(:SAFE) + out('') + else + out(tagfilter(node.string_content)) + end + end + end + + def inline_html(node) + if option_enabled?(:SAFE) + out('') + else + out(tagfilter(node.string_content)) + end + end + + def emph(_) + out('', :children, '') + end + + def strong(_) + out('', :children, '') + end + + def link(node) + out('', :children, '') + end + + def image(node) + out('', :children, '') + end + + def text(node) + out(escape_html(node.string_content)) + end + + def code(node) + out('') + out(escape_html(node.string_content)) + out('') + end + + def linebreak(node) + out("
\n") + end + + def softbreak(_) + if option_enabled?(:HARDBREAKS) + out("
\n") + elsif option_enabled?(:NOBREAKS) + out(' ') + else + out("\n") + end + end + + def table(node) + @alignments = node.table_alignments + @needs_close_tbody = false + out("\n", :children) + out("\n") if @needs_close_tbody + out("\n") + end + + def table_header(node) + @column_index = 0 + + @in_header = true + out("\n\n", :children, "\n\n") + @in_header = false + end + + def table_row(node) + @column_index = 0 + if !@in_header && !@needs_close_tbody + @needs_close_tbody = true + out("\n") + end + out("\n", :children, "\n") + end + + def table_cell(node) + align = case @alignments[@column_index] + when :left; ' align="left"' + when :right; ' align="right"' + when :center; ' align="center"' + else; '' + end + out(@in_header ? "" : "", :children, @in_header ? "\n" : "\n") + @column_index += 1 + end + + def strikethrough(_) + out('', :children, '') + end + + def footnote_reference(node) + out("#{node.string_content}") + end + + def footnote_definition(_) + if !@footnote_ix + out("
\n
    \n") + @footnote_ix = 0 + end + + @footnote_ix += 1 + out("
  1. \n", :children) + if out_footnote_backref + out("\n") + end + out("
  2. \n") +#
+#
+ end + + private + + def out_footnote_backref + return false if @written_footnote_ix == @footnote_ix + @written_footnote_ix = @footnote_ix + + out("") + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/version.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/version.rb new file mode 100644 index 000000000000..6341e69c9bc6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/lib/commonmarker/version.rb @@ -0,0 +1,3 @@ +module CommonMarker + VERSION = '0.17.13'.freeze +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/benchmark.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/benchmark.rb new file mode 100644 index 000000000000..9ffb53a9c183 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/benchmark.rb @@ -0,0 +1,34 @@ +require 'commonmarker' +require 'github/markdown' +require 'redcarpet' +require 'kramdown' +require 'benchmark' + +def dobench(name, &blk) + puts name + puts Benchmark.measure(&blk) +end + +benchinput = File.open('test/benchinput.md', 'r').read() + +printf("input size = %d bytes\n\n", benchinput.bytesize) + +dobench('redcarpet') do + Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: false, tables: false).render(benchinput) +end + +dobench('github-markdown') do + GitHub::Markdown.render(benchinput) +end + +dobench('commonmarker with to_html') do + CommonMarker.render_html(benchinput) +end + +dobench('commonmarker with ruby HtmlRenderer') do + CommonMarker::HtmlRenderer.new.render(CommonMarker.render_doc(benchinput)) +end + +dobench('kramdown') do + Kramdown::Document.new(benchinput).to_html(benchinput) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/fixtures/curly.md b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/fixtures/curly.md new file mode 100644 index 000000000000..314d6bf100a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/fixtures/curly.md @@ -0,0 +1 @@ +This curly quote “makes commonmarker throw an exception”. diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/fixtures/dingus.md b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/fixtures/dingus.md new file mode 100644 index 000000000000..a94623b77f66 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/fixtures/dingus.md @@ -0,0 +1,10 @@ +## Try CommonMark + +You can try CommonMark here. This dingus is powered by +[commonmark.js](https://github.com/jgm/commonmark.js), the +JavaScript reference implementation. + +1. item one +2. item two + - sublist + - sublist diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_attributes.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_attributes.rb new file mode 100644 index 000000000000..f655637365b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_attributes.rb @@ -0,0 +1,22 @@ +require 'test_helper' + +class TestAttributes < Minitest::Test + def setup + contents = File.read(File.join(FIXTURES_DIR, 'dingus.md')) + @doc = CommonMarker.render_doc(contents.strip) + end + + def test_sourcepos + sourcepos = [] + + @doc.walk do |node| + sourcepos << node.sourcepos + end + + sourcepos.delete_if { |h| h.values.all? { |v| v == 0 } } + + result = [{:start_line=>1, :start_column=>1, :end_line=>10, :end_column=>12}, {:start_line=>1, :start_column=>1, :end_line=>1, :end_column=>17}, {:start_line=>1, :start_column=>4, :end_line=>1, :end_column=>17}, {:start_line=>3, :start_column=>1, :end_line=>5, :end_column=>36}, {:start_line=>3, :start_column=>1, :end_line=>3, :end_column=>55}, {:start_line=>4, :start_column=>1, :end_line=>4, :end_column=>53}, {:start_line=>4, :start_column=>2, :end_line=>4, :end_column=>14}, {:start_line=>4, :start_column=>54, :end_line=>4, :end_column=>58}, {:start_line=>5, :start_column=>1, :end_line=>5, :end_column=>36}, {:start_line=>7, :start_column=>1, :end_line=>10, :end_column=>12}, {:start_line=>7, :start_column=>1, :end_line=>7, :end_column=>11}, {:start_line=>7, :start_column=>4, :end_line=>7, :end_column=>11}, {:start_line=>7, :start_column=>4, :end_line=>7, :end_column=>11}, {:start_line=>8, :start_column=>1, :end_line=>10, :end_column=>12}, {:start_line=>8, :start_column=>4, :end_line=>8, :end_column=>11}, {:start_line=>8, :start_column=>4, :end_line=>8, :end_column=>11}, {:start_line=>9, :start_column=>4, :end_line=>10, :end_column=>12}, {:start_line=>9, :start_column=>4, :end_line=>9, :end_column=>12}, {:start_line=>9, :start_column=>6, :end_line=>9, :end_column=>12}, {:start_line=>9, :start_column=>6, :end_line=>9, :end_column=>12}, {:start_line=>10, :start_column=>4, :end_line=>10, :end_column=>12}, {:start_line=>10, :start_column=>6, :end_line=>10, :end_column=>12}, {:start_line=>10, :start_column=>6, :end_line=>10, :end_column=>12}] + + assert_equal result, sourcepos + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_basics.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_basics.rb new file mode 100644 index 000000000000..7376cde48088 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_basics.rb @@ -0,0 +1,16 @@ +require 'test_helper' + +class TestBasics < Minitest::Test + def setup + @doc = CommonMarker.render_doc('Hi *there*') + end + + def test_to_html + assert_equal "

Hi there

\n", @doc.to_html + end + + def test_markdown_to_html + html = CommonMarker.render_html('Hi *there*') + assert_equal "

Hi there

\n", html + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_commonmark.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_commonmark.rb new file mode 100644 index 000000000000..93ab66bac293 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_commonmark.rb @@ -0,0 +1,34 @@ +require 'test_helper' + +class TestCommonmark < Minitest::Test + HTML_COMMENT = %r[\s?] + + def setup + @markdown = <<-MD +Hi *there*! + +1. I am a numeric list. +2. I continue the list. +* Suddenly, an unordered list! +* What fun! + +Okay, _enough_. + +| a | b | +| --- | --- | +| c | d | + MD + end + + def render_doc(doc) + CommonMarker.render_doc(doc, :DEFAULT, %i[table]) + end + + def test_to_commonmark + compare = render_doc(@markdown).to_commonmark + + assert_equal \ + render_doc(@markdown).to_html.gsub(/ +/, ' ').gsub(HTML_COMMENT, ''), + render_doc(compare).to_html.gsub(/ +/, ' ').gsub(HTML_COMMENT, '') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_doc.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_doc.rb new file mode 100644 index 000000000000..bedc791cd321 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_doc.rb @@ -0,0 +1,128 @@ +require 'test_helper' + +class TestDocNode < Minitest::Test + def setup + @doc = CommonMarker.render_doc('Hi *there*. This has __many nodes__!') + @first_child = @doc.first_child + @last_child = @doc.last_child + @link = CommonMarker.render_doc('[GitHub](https://www.github.com)').first_child.first_child + @image = CommonMarker.render_doc('![alt text](https://github.com/favicon.ico "Favicon")') + @image = @image.first_child.first_child + @header = CommonMarker.render_doc('### Header Three').first_child + @ul_list = CommonMarker.render_doc("* Bullet\n*Bullet").first_child + @ol_list = CommonMarker.render_doc("1. One\n2. Two").first_child + @fence = CommonMarker.render_doc("``` ruby\nputs 'wow'\n```").first_child + end + + def test_get_type + assert_equal @doc.type, :document + end + + def test_get_type_string + assert_equal @doc.type_string, 'document' + end + + def test_get_first_child + assert_equal @first_child.type, :paragraph + end + + def test_get_next + assert_equal @first_child.first_child.next.type, :emph + end + + def test_insert_before + paragraph = Node.new(:paragraph) + assert_equal @first_child.insert_before(paragraph), true + assert_match "

\n

Hi there.", @doc.to_html + end + + def test_insert_after + paragraph = Node.new(:paragraph) + assert_equal @first_child.insert_after(paragraph), true + assert_match "many nodes!

\n

\n", @doc.to_html + end + + def test_prepend_child + code = Node.new(:code) + assert_equal @first_child.prepend_child(code), true + assert_match '

Hi there.', @doc.to_html + end + + def test_append_child + strong = Node.new(:strong) + assert_equal @first_child.append_child(strong), true + assert_match "!

\n", @doc.to_html + end + + def test_get_last_child + assert_equal @last_child.type, :paragraph + end + + def test_get_parent + assert_equal @first_child.first_child.next.parent.type, :paragraph + end + + def test_get_previous + assert_equal @first_child.first_child.next.previous.type, :text + end + + def test_get_url + assert_equal @link.url, 'https://www.github.com' + end + + def test_set_url + assert_equal @link.url = 'https://www.mozilla.org', 'https://www.mozilla.org' + end + + def test_get_title + assert_equal @image.title, 'Favicon' + end + + def test_set_title + assert_equal @image.title = 'Octocat', 'Octocat' + end + + def test_get_header_level + assert_equal @header.header_level, 3 + end + + def test_set_header_level + assert_equal @header.header_level = 6, 6 + end + + def test_get_list_type + assert_equal @ul_list.list_type, :bullet_list + assert_equal @ol_list.list_type, :ordered_list + end + + def test_set_list_type + assert_equal @ul_list.list_type = :ordered_list, :ordered_list + assert_equal @ol_list.list_type = :bullet_list, :bullet_list + end + + def test_get_list_start + assert_equal @ol_list.list_start, 1 + end + + def test_set_list_start + assert_equal @ol_list.list_start = 8, 8 + end + + def test_get_list_tight + assert_equal @ul_list.list_tight, true + assert_equal @ol_list.list_tight, true + end + + def test_set_list_tight + assert_equal @ul_list.list_tight = false, false + assert_equal @ol_list.list_tight = false, false + end + + def test_get_fence_info + assert_equal @fence.fence_info, 'ruby' + end + + def test_set_fence_info + assert_equal @fence.fence_info = 'javascript', 'javascript' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_encoding.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_encoding.rb new file mode 100644 index 000000000000..baa19b948f0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_encoding.rb @@ -0,0 +1,19 @@ +# coding: utf-8 +require 'test_helper' + +class TestEncoding < Minitest::Test + # see http://git.io/vq4FR + def test_encoding + contents = File.read(File.join(FIXTURES_DIR, 'curly.md'), encoding: 'utf-8') + doc = CommonMarker.render_doc(contents, :SMART) + render = doc.to_html + assert_equal render.rstrip, '

This curly quote “makes commonmarker throw an exception”.

' + end + + def test_string_content_is_utf8 + doc = CommonMarker.render_doc('Hi *there*') + text = doc.first_child.last_child.first_child + assert_equal text.string_content, 'there' + assert_equal text.string_content.encoding.name, 'UTF-8' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_extensions.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_extensions.rb new file mode 100644 index 000000000000..f4848f5a9e82 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_extensions.rb @@ -0,0 +1,123 @@ +require 'test_helper' + +class TestExtensions < Minitest::Test + def setup + @markdown = <<-MD +One extension: + +| a | b | +| --- | --- | +| c | d | +| **x** | | + +Another extension: + +~~hi~~ + MD + end + + def test_uses_specified_extensions + CommonMarker.render_html(@markdown, :DEFAULT, %i[]).tap do |out| + assert out.include?("| a") + assert out.include?("| x") + assert out.include?("~~hi~~") + end + + CommonMarker.render_html(@markdown, :DEFAULT, %i[table]).tap do |out| + refute out.include?("| a") + %w(x).each {|html| assert out.include?(html) } + assert out.include?("~~hi~~") + end + + CommonMarker.render_html(@markdown, :DEFAULT, %i[strikethrough]).tap do |out| + assert out.include?("| a") + refute out.include?("~~hi~~") + assert out.include?("hi") + end + + doc = CommonMarker.render_doc("~a~ ~~b~~ ~~~c~~~", :STRIKETHROUGH_DOUBLE_TILDE, [:strikethrough]) + assert_equal doc.to_html, "

~a~ b ~~~c~~~

\n" + + CommonMarker.render_html(@markdown, :DEFAULT, %i[table strikethrough]).tap do |out| + refute out.include?("| a") + refute out.include?("| x") + refute out.include?("~~hi~~") + end + + end + + def test_extensions_with_renderers + doc = CommonMarker.render_doc(@markdown, :DEFAULT, %i[table]) + + doc.to_html.tap do |out| + refute out.include?("| a") + %w(
a c
x).each {|html| assert out.include?(html) } + assert out.include?("~~hi~~") + end + + HtmlRenderer.new.render(doc).tap do |out| + refute out.include?("| a") + %w(
a c
x).each {|html| assert out.include?(html) } + assert out.include?("~~hi~~") + end + + doc = CommonMarker.render_doc("~a~ ~~b~~ ~~~c~~~", :STRIKETHROUGH_DOUBLE_TILDE, [:strikethrough]) + assert_equal HtmlRenderer.new.render(doc), "

~a~ b ~~~c~~~

\n" + end + + def test_bad_extension_specifications + assert_raises(TypeError) { CommonMarker.render_html(@markdown, :DEFAULT, "nope") } + assert_raises(TypeError) { CommonMarker.render_html(@markdown, :DEFAULT, ["table"]) } + assert_raises(ArgumentError) { CommonMarker.render_html(@markdown, :DEFAULT, %i[table bad]) } + end + + def test_comments_are_kept_as_expected + assert_equal " <xmp>\n", + CommonMarker.render_html(" \n", :DEFAULT, %i[tagfilter]) + end + + def test_table_prefer_style_attributes + assert_equal(<<-HTML, CommonMarker.render_html(<<-MD, :TABLE_PREFER_STYLE_ATTRIBUTES, %i[table])) +<table> +<thead> +<tr> +<th style="text-align: left">aaa</th> +<th>bbb</th> +<th style="text-align: center">ccc</th> +<th>ddd</th> +<th style="text-align: right">eee</th> +</tr> +</thead> +<tbody> +<tr> +<td style="text-align: left">fff</td> +<td>ggg</td> +<td style="text-align: center">hhh</td> +<td>iii</td> +<td style="text-align: right">jjj</td> +</tr> +</tbody> +</table> + HTML +aaa | bbb | ccc | ddd | eee +:-- | --- | :-: | --- | --: +fff | ggg | hhh | iii | jjj + MD + end + + def test_plaintext + assert_equal(<<-HTML, CommonMarker.render_doc(<<-MD, :DEFAULT, %i[table strikethrough]).to_plaintext) +Hello ~there~. + +| a | +| --- | +| b | + HTML +Hello ~~there~~. + +| a | +| - | +| b | + MD + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_footnotes.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_footnotes.rb new file mode 100644 index 000000000000..2c3aa59f0317 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_footnotes.rb @@ -0,0 +1,25 @@ +require 'test_helper' + +class TestFootnotes < Minitest::Test + def setup + @doc = CommonMarker.render_doc("Hello[^hi].\n\n[^hi]: Hey!\n", :FOOTNOTES) + @expected = <<-HTML +<p>Hello<sup class="footnote-ref"><a href="#fn1" id="fnref1">1</a></sup>.</p> +<section class="footnotes"> +<ol> +<li id="fn1"> +<p>Hey! <a href="#fnref1" class="footnote-backref">↩</a></p> +</li> +</ol> +</section> + HTML + end + + def test_to_html + assert_equal @expected, @doc.to_html + end + + def test_html_renderer + assert_equal @expected, CommonMarker::HtmlRenderer.new.render(@doc) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_gc.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_gc.rb new file mode 100644 index 000000000000..f1212d716a44 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_gc.rb @@ -0,0 +1,43 @@ +require 'test_helper' + +class TestNode < Minitest::Test + # These tests are somewhat fragile. It would be better to allocate lots + # of memory after a GC run to make sure that potentially freed memory + # isn't valid by accident. + + def test_drop_parent_reference + doc = CommonMarker.render_doc('Hi *there*') + text = doc.first_child.last_child.first_child + doc = nil + GC.start + # Test that doc has not been freed. + assert_equal "there", text.string_content + end + + def test_drop_child_reference + doc = CommonMarker.render_doc('Hi *there*') + text = doc.first_child.last_child.first_child + text = nil + GC.start + # Test that the cached child object is still valid. + text = doc.first_child.last_child.first_child + assert_equal "there", text.string_content + end + + def test_remove_parent + doc = CommonMarker.render_doc('Hi *there*') + para = doc.first_child + para.delete + doc = nil + para = nil + # TODO: Test that the `para` node was actually freed after unlinking. + end + + def test_add_parent + doc = Node.new(:document) + hrule = Node.new(:hrule) + doc.append_child(hrule) + # If the hrule node was erroneously freed, this would result in a double + # free. + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_helper.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_helper.rb new file mode 100644 index 000000000000..cdfc57974f4c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_helper.rb @@ -0,0 +1,61 @@ +# coding: utf-8 +require 'commonmarker' +require 'minitest/autorun' +require 'minitest/pride' + +include CommonMarker + +FIXTURES_DIR = File.join(File.dirname(__FILE__), 'fixtures') + +def open_spec_file(filename) + line_number = 0 + start_line = 0 + end_line = 0 + example_number = 0 + markdown_lines = [] + html_lines = [] + state = 0 # 0 regular text, 1 markdown example, 2 html output + headertext = '' + tests = [] + extensions = [] + + header_re = Regexp.new('#+ ') + filepath = File.join('ext', 'commonmarker', 'cmark-upstream', 'test', filename) + + File.readlines(filepath, encoding: "utf-8").each do |line| + line_number += 1 + + l = line.strip + if l =~ /^`{32} example(.*)$/ + state = 1 + extensions = $1.split + elsif l == '`' * 32 + state = 0 + example_number += 1 + end_line = line_number + tests << { + :markdown => markdown_lines.join('').tr('→', "\t"), + :html => html_lines.join('').tr('→', "\t").rstrip, + :example => example_number, + :start_line => start_line, + :end_line => end_line, + :section => headertext, + :extensions => extensions.map(&:to_sym), + } + start_line = 0 + markdown_lines = [] + html_lines = [] + elsif l == '.' + state = 2 + elsif state == 1 + start_line = line_number - 1 if start_line == 0 + markdown_lines << "#{line}" + elsif state == 2 + html_lines << "#{line}" + elsif state == 0 && header_re.match(line) + headertext = line.sub(header_re, '').strip + end + end + + tests +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_linebreaks.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_linebreaks.rb new file mode 100644 index 000000000000..d601d98fabd2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_linebreaks.rb @@ -0,0 +1,13 @@ +require 'test_helper' + +class TestLinebreaks < Minitest::Test + def test_hardbreak_no_spaces + doc = CommonMarker.render_doc("foo\nbaz") + assert_equal "<p>foo<br />\nbaz</p>\n", doc.to_html(:HARDBREAKS) + end + + def test_hardbreak_with_spaces + doc = CommonMarker.render_doc("foo \nbaz") + assert_equal "<p>foo<br />\nbaz</p>\n", doc.to_html(:HARDBREAKS) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_maliciousness.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_maliciousness.rb new file mode 100644 index 000000000000..5910c172a9bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_maliciousness.rb @@ -0,0 +1,263 @@ +require 'test_helper' + +class CommonMarker::TestMaliciousness < Minitest::Test + def setup + @doc = CommonMarker.render_doc('Hi *there*') + end + + def test_init_with_bad_type + assert_raises TypeError do + Node.new(123) + end + + assert_raises NodeError do + Node.new(:totes_fake) + end + + assert_raises TypeError do + Node.new([]) + end + + assert_raises TypeError do + Node.new([23]) + end + + assert_raises TypeError do + Node.new(nil) + end + end + + def test_rendering_with_bad_type + assert_raises TypeError do + CommonMarker.render_html("foo \n baz", 123) + end + + assert_raises TypeError do + CommonMarker.render_html("foo \n baz", :totes_fake) + end + + assert_raises TypeError do + CommonMarker.render_html("foo \n baz", []) + end + + assert_raises TypeError do + CommonMarker.render_html("foo \n baz", [23]) + end + + assert_raises TypeError do + CommonMarker.render_html("foo \n baz", nil) + end + + assert_raises TypeError do + CommonMarker.render_html("foo \n baz", [:SMART, 'totes_fake']) + end + + assert_raises TypeError do + CommonMarker.render_html(123) + end + + assert_raises TypeError do + CommonMarker.render_html([123]) + end + + assert_raises TypeError do + CommonMarker.render_html(nil) + end + + err = assert_raises TypeError do + CommonMarker.render_html("foo \n baz", [:SMART]) + end + assert_equal err.message, 'option \':SMART\' does not exist for CommonMarker::Config::Render' + + assert_raises TypeError do + CommonMarker.render_doc("foo \n baz", 123) + end + + err = assert_raises TypeError do + CommonMarker.render_doc("foo \n baz", :safe) + end + assert_equal err.message, 'option \':safe\' does not exist for CommonMarker::Config::Parse' + + assert_raises TypeError do + CommonMarker.render_doc("foo \n baz", :totes_fake) + end + + assert_raises TypeError do + CommonMarker.render_doc("foo \n baz", []) + end + + assert_raises TypeError do + CommonMarker.render_doc("foo \n baz", [23]) + end + + assert_raises TypeError do + CommonMarker.render_doc("foo \n baz", nil) + end + + assert_raises TypeError do + CommonMarker.render_doc("foo \n baz", [:SMART, 'totes_fake']) + end + + assert_raises TypeError do + CommonMarker.render_doc(123) + end + + assert_raises TypeError do + CommonMarker.render_doc([123]) + end + + assert_raises TypeError do + CommonMarker.render_doc(nil) + end + end + + def test_bad_set_string_content + assert_raises TypeError do + @doc.string_content = 123 + end + end + + def test_bad_walking + assert_nil @doc.parent + assert_nil @doc.previous + end + + def test_bad_insertion + code = Node.new(:code) + assert_raises NodeError do + @doc.insert_before(code) + end + + paragraph = Node.new(:paragraph) + assert_raises NodeError do + @doc.insert_after(paragraph) + end + + document = Node.new(:document) + assert_raises NodeError do + @doc.prepend_child(document) + end + + assert_raises NodeError do + @doc.append_child(document) + end + end + + def test_bad_url_get + assert_raises NodeError do + @doc.url + end + end + + def test_bad_url_set + assert_raises NodeError do + @doc.url = '123' + end + + link = CommonMarker.render_doc('[GitHub](https://www.github.com)').first_child.first_child + assert_raises TypeError do + link.url = 123 + end + end + + def test_bad_title_get + assert_raises NodeError do + @doc.title + end + end + + def test_bad_title_set + assert_raises NodeError do + @doc.title = '123' + end + + image = CommonMarker.render_doc('![alt text](https://github.com/favicon.ico "Favicon")') + image = image.first_child.first_child + assert_raises TypeError do + image.title = 123 + end + end + + def test_bad_header_level_get + assert_raises NodeError do + @doc.header_level + end + end + + def test_bad_header_level_set + assert_raises NodeError do + @doc.header_level = 1 + end + + header = CommonMarker.render_doc('### Header Three').first_child + assert_raises TypeError do + header.header_level = '123' + end + end + + def test_bad_list_type_get + assert_raises NodeError do + @doc.list_type + end + end + + def test_bad_list_type_set + assert_raises NodeError do + @doc.list_type = :bullet_list + end + + ul_list = CommonMarker.render_doc("* Bullet\n*Bullet").first_child + assert_raises NodeError do + ul_list.list_type = :fake + end + assert_raises TypeError do + ul_list.list_type = 1234 + end + end + + def test_bad_list_start_get + assert_raises NodeError do + @doc.list_start + end + end + + def test_bad_list_start_set + assert_raises NodeError do + @doc.list_start = 12 + end + + ol_list = CommonMarker.render_doc("1. One\n2. Two").first_child + assert_raises TypeError do + ol_list.list_start = :fake + end + end + + def test_bad_list_tight_get + assert_raises NodeError do + @doc.list_tight + end + end + + def test_bad_list_tight_set + assert_raises NodeError do + @doc.list_tight = false + end + end + + def test_bad_fence_info_get + assert_raises NodeError do + @doc.fence_info + end + end + + def test_bad_fence_info_set + assert_raises NodeError do + @doc.fence_info = 'ruby' + end + + fence = CommonMarker.render_doc("``` ruby\nputs 'wow'\n```").first_child + assert_raises TypeError do + fence.fence_info = 123 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_node.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_node.rb new file mode 100644 index 000000000000..e3d9b65e4bd0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_node.rb @@ -0,0 +1,89 @@ +require 'test_helper' + +class TestNode < Minitest::Test + def setup + @doc = CommonMarker.render_doc('Hi *there*, I am mostly text!') + end + + def test_walk + nodes = [] + @doc.walk do |node| + nodes << node.type + end + assert_equal [:document, :paragraph, :text, :emph, :text, :text], nodes + end + + def test_each + nodes = [] + @doc.first_child.each do |node| + nodes << node.type + end + assert_equal [:text, :emph, :text], nodes + end + + def test_deprecated_each_child + nodes = [] + out, err = capture_io do + @doc.first_child.each_child do |node| + nodes << node.type + end + end + assert_equal [:text, :emph, :text], nodes + assert_match /`each_child` is deprecated/, err + end + + def test_select + nodes = @doc.first_child.select { |node| node.type == :text } + assert_equal CommonMarker::Node, nodes.first.class + assert_equal [:text, :text], nodes.map(&:type) + end + + def test_map + nodes = @doc.first_child.map(&:type) + assert_equal [:text, :emph, :text], nodes + end + + def test_insert_illegal + assert_raises NodeError do + @doc.insert_before(@doc) + end + end + + def test_to_html + assert_equal "<p>Hi <em>there</em>, I am mostly text!</p>\n", @doc.to_html + end + + def test_html_renderer + renderer = HtmlRenderer.new + result = renderer.render(@doc) + assert_equal "<p>Hi <em>there</em>, I am mostly text!</p>\n", result + end + + def test_walk_and_set_string_content + @doc.walk do |node| + if node.type == :text && node.string_content == 'there' + node.string_content = 'world' + end + end + result = HtmlRenderer.new.render(@doc) + assert_equal "<p>Hi <em>world</em>, I am mostly text!</p>\n", result + end + + def test_walk_and_delete_node + @doc.walk do |node| + if node.type == :emph + node.insert_before(node.first_child) + node.delete + end + end + assert_equal "<p>Hi there, I am mostly text!</p>\n", @doc.to_html + end + + def test_inspect + assert_match /#<CommonMarker::Node\(document\):/, @doc.inspect + end + + def test_pretty_print + assert_match /#<CommonMarker::Node\(document\):/, PP.pp(@doc, '') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_options.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_options.rb new file mode 100644 index 000000000000..949803529a4b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_options.rb @@ -0,0 +1,35 @@ +require 'test_helper' + +class TestExtensions < Minitest::Test + def test_full_info_string + md = <<-MD +```ruby +module Foo +``` + MD + + CommonMarker.render_html(md, :FULL_INFO_STRING).tap do |out| + assert_includes out, %q(<pre><code class="language-ruby">) + end + + md = <<-MD +```ruby my info string +module Foo +``` + MD + + CommonMarker.render_html(md, :FULL_INFO_STRING).tap do |out| + assert_includes out, %q(<pre><code class="language-ruby" data-meta="my info string">) + end + + md = <<-MD +```ruby my \x00 string +module Foo +``` + MD + + CommonMarker.render_html(md, :FULL_INFO_STRING).tap do |out| + assert_includes out, %Q(<pre><code class="language-ruby" data-meta="my � string">) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_pathological_inputs.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_pathological_inputs.rb new file mode 100644 index 000000000000..3cdeb14d1f93 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_pathological_inputs.rb @@ -0,0 +1,92 @@ +require 'test_helper' +require 'minitest/benchmark' if ENV['BENCH'] + +def markdown(s) + CommonMarker.render_doc(s).to_html +end + +# list of pairs consisting of input and a regex that must match the output. +pathological = { + 'nested strong emph' => + [('*a **a ' * 65_000) + 'b' + (' a** a*' * 65_000), + Regexp.compile('(<em>a <strong>a ){65_000}b( a</strong> a</em>){65_000}')], + 'many emph closers with no openers' => + [('a_ ' * 65_000), + Regexp.compile('(a[_] ){64999}a_')], + 'many emph openers with no closers' => + [('_a ' * 65_000), + Regexp.compile('(_a ){64999}_a')], + 'many link closers with no openers' => + [('a]' * 65_000), + Regexp.compile('(a\]){65_000}')], + 'many link openers with no closers' => + [('[a' * 65_000), + Regexp.compile('(\[a){65_000}')], + 'mismatched openers and closers' => + [('*a_ ' * 50_000), + Regexp.compile('([*]a[_] ){49999}[*]a_')], + 'link openers and emph closers' => + [('[ a_' * 50_000), + Regexp.compile('(\[ a_){50000}')], + 'hard link/emph case' => + ['**x [a*b**c*](d)', + Regexp.compile('\\*\\*x <a href=\'d\'>a<em>b</em><em>c</em></a>')], + 'nested brackets' => + [('[' * 50_000) + 'a' + (']' * 50_000), + Regexp.compile('\[{50000}a\]{50000}')], + 'nested block quotes' => + [(('> ' * 50_000) + 'a'), + Regexp.compile('(<blockquote>\n){50000}')], + 'U+0000 in input' => + ['abc\u0000de\u0000', + Regexp.compile('abc\ufffd?de\ufffd?')] +} + +pathological.each_pair do |name, description| + define_method("test_#{name}") do + input, = description + assert markdown(input) + end +end + +if ENV['BENCH'] + class PathologicalInputsPerformanceTest < Minitest::Benchmark + def bench_pathological_1 + assert_performance_linear 0.99 do |n| + star = '*' * (n * 10) + markdown("#{star}#{star}hi#{star}#{star}") + end + end + + def bench_pathological_2 + assert_performance_linear 0.99 do |n| + c = '`t`t`t`t`t`t' * (n * 10) + markdown(c) + end + end + + def bench_pathological_3 + assert_performance_linear 0.99 do |n| + markdown(" [a]: #{'A' * n}\n\n#{'[a][]' * n}\n") + end + end + + def bench_pathological_4 + assert_performance_linear 0.5 do |n| + markdown("#{'[' * n}a#{']' * n}") + end + end + + def bench_pathological_5 + assert_performance_linear 0.99 do |n| + markdown("#{'**a *a ' * n}#{'a* a**' * n}") + end + end + + def bench_unbound_recursion + assert_performance_linear 0.99 do |n| + markdown(('[' * n) + 'foo' + ('](bar)' * n)) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_plaintext.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_plaintext.rb new file mode 100644 index 000000000000..297457e84ea2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_plaintext.rb @@ -0,0 +1,44 @@ +require 'test_helper' + +class TestPlaintext < Minitest::Test + def setup + @markdown = <<-MD +Hi *there*! + +1. I am a numeric list. +2. I continue the list. +* Suddenly, an unordered list! +* What fun! + +Okay, _enough_. + +| a | b | +| --- | --- | +| c | d | + MD + end + + def render_doc(doc) + CommonMarker.render_doc(doc, :DEFAULT, %i[table]) + end + + def test_to_commonmark + compare = render_doc(@markdown).to_plaintext + + assert_equal <<-PLAINTEXT, compare +Hi there! + +1. I am a numeric list. +2. I continue the list. + + - Suddenly, an unordered list! + - What fun! + +Okay, enough. + +| a | b | +| --- | --- | +| c | d | + PLAINTEXT + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_renderer.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_renderer.rb new file mode 100644 index 000000000000..9a81f305ee49 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_renderer.rb @@ -0,0 +1,28 @@ +require 'test_helper' + +class TestRenderer < Minitest::Test + def setup + @doc = CommonMarker.render_doc('Hi *there*') + end + + def test_html_renderer + renderer = HtmlRenderer.new + result = renderer.render(@doc) + assert_equal "<p>Hi <em>there</em></p>\n", result + end + + def test_multiple_tables + content = ''' +| Input | Expected | Actual | +| ----------- | ---------------- | --------- | +| One | Two | Three | + +| Header | Row | Example | +| :------: | ---: | :------ | +| Foo | Bar | Baz | +''' + doc = CommonMarker.render_doc(content, :DEFAULT, [:autolink, :table, :tagfilter]) + results = CommonMarker::HtmlRenderer.new.render(doc) + assert_equal 2, results.scan(/<tbody>/).size + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_smartpunct.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_smartpunct.rb new file mode 100644 index 000000000000..aa8e77a0d22a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_smartpunct.rb @@ -0,0 +1,22 @@ +require 'test_helper' + +class SmartPunctTest < Minitest::Test + smart_punct = open_spec_file('smart_punct.txt') + + smart_punct.each do |testcase| + doc = CommonMarker.render_doc(testcase[:markdown], :SMART) + + define_method("test_smart_punct_example_#{testcase[:example]}") do + actual = doc.to_html.strip + + assert_equal testcase[:html], actual, testcase[:markdown] + end + end + + def test_smart_hardbreak_no_spaces_render_doc + markdown = "\"foo\"\nbaz" + result = "<p>“foo”<br />\nbaz</p>\n" + doc = CommonMarker.render_doc(markdown, :SMART) + assert_equal result, doc.to_html([:HARDBREAKS]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_spec.rb b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_spec.rb new file mode 100644 index 000000000000..57eea9269d8a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/commonmarker-0.17.13/test/test_spec.rb @@ -0,0 +1,27 @@ +require 'test_helper' +require 'json' + +class TestSpec < Minitest::Test + spec = open_spec_file('spec.txt') + + spec.each do |testcase| + next if testcase[:extensions].include?(:disabled) + doc = CommonMarker.render_doc(testcase[:markdown], :DEFAULT, testcase[:extensions]) + + define_method("test_to_html_example_#{testcase[:example]}") do + actual = doc.to_html(:DEFAULT, testcase[:extensions]).rstrip + assert_equal testcase[:html], actual, testcase[:markdown] + end + + define_method("test_html_renderer_example_#{testcase[:example]}") do + actual = HtmlRenderer.new(extensions: testcase[:extensions]).render(doc).rstrip + assert_equal testcase[:html], actual, testcase[:markdown] + end + + define_method("test_sourcepos_example_#{testcase[:example]}") do + lhs = doc.to_html(:SOURCEPOS, testcase[:extensions]).rstrip + rhs = HtmlRenderer.new(options: :SOURCEPOS, extensions: testcase[:extensions]).render(doc).rstrip + assert_equal lhs, rhs, testcase[:markdown] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/CHANGELOG.md new file mode 100644 index 000000000000..9cde76382900 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/CHANGELOG.md @@ -0,0 +1,516 @@ +## Current + +## Release v1.1.8 (20 January 2021) + +* (#885) Fix race condition in TVar for stale reads +* (#884) RubyThreadLocalVar: Do not iterate over hash which might conflict with new pair addition + +## Release v1.1.7 (6 August 2020) + +concurrent-ruby: + +* (#879) Consider falsy value on `Concurrent::Map#compute_if_absent` for fast non-blocking path +* (#876) Reset Async queue on forking, makes Async fork-safe +* (#856) Avoid running problematic code in RubyThreadLocalVar on MRI that occasionally results in segfault +* (#853) Introduce ThreadPoolExecutor without a Queue + +## Release v1.1.6, edge v0.6.0 (10 Feb 2020) + +concurrent-ruby: + +* (#841) Concurrent.disable_at_exit_handlers! is no longer needed and was deprecated. +* (#841) AbstractExecutorService#auto_terminate= was deprecated and has no effect. + Set :auto_terminate option instead when executor is initialized. + +## Release v1.1.6.pre1, edge v0.6.0.pre1 (26 Jan 2020) + +concurrent-ruby: + +* (#828) Allow to name executors, the name is also used to name their threads +* (#838) Implement #dup and #clone for structs +* (#821) Safer finalizers for thread local variables +* Documentation fixes +* (#814) Use Ruby's Etc.nprocessors if available +* (#812) Fix directory structure not to mess with packaging tools +* (#840) Fix termination of pools on JRuby + +concurrent-ruby-edge: + +* Add WrappingExecutor (#830) + +## Release v1.1.5, edge v0.5.0 (10 Mar 2019) + +concurrent-ruby: + +* fix potential leak of context on JRuby and Java 7 + +concurrent-ruby-edge: + +* Add finalized Concurrent::Cancellation +* Add finalized Concurrent::Throttle +* Add finalized Concurrent::Promises::Channel +* Add new Concurrent::ErlangActor + +## Release v1.1.4 (14 Dec 2018) + +* (#780) Remove java_alias of 'submit' method of Runnable to let executor service work on java 11 +* (#776) Fix NameError on defining a struct with a name which is already taken in an ancestor + +## Release v1.1.3 (7 Nov 2018) + +* (#775) fix partial require of the gem (although not officially supported) + +## Release v1.1.2 (6 Nov 2018) + +* (#773) more defensive 1.9.3 support + +## Release v1.1.1, edge v0.4.1 (1 Nov 2018) + +* (#768) add support for 1.9.3 back + +## Release v1.1.0, edge v0.4.0 (31 OCt 2018) (yanked) + +* (#768) yanked because of issues with removed 1.9.3 support + +## Release v1.1.0.pre2, edge v0.4.0.pre2 (18 Sep 2018) + +concurrent-ruby: + +* fixed documentation and README links +* fix Set for TruffleRuby and Rubinius +* use properly supported TruffleRuby APIs + +concurrent-ruby-edge: + +* add Promises.zip_futures_over_on + +## Release v1.1.0.pre1, edge v0.4.0.pre1 (15 Aug 2018) + +concurrent-ruby: + +* requires at least Ruby 2.0 +* [Promises](http://ruby-concurrency.github.io/concurrent-ruby/1.1.0/Concurrent/Promises.html) + are moved from `concurrent-ruby-edge` to `concurrent-ruby` +* Add support for TruffleRuby + * (#734) Fix Array/Hash/Set construction broken on TruffleRuby + * AtomicReference fixed +* CI stabilization +* remove sharp dependency edge -> core +* remove warnings +* documentation updates +* Exchanger is no longer documented as edge since it was already available in + `concurrent-ruby` +* (#644) Fix Map#each and #each_pair not returning enumerator outside of MRI +* (#659) Edge promises fail during error handling +* (#741) Raise on recursive Delay#value call +* (#727) #717 fix global IO executor on JRuby +* (#740) Drop support for CRuby 1.9, JRuby 1.7, Rubinius. +* (#737) Move AtomicMarkableReference out of Edge +* (#708) Prefer platform specific memory barriers +* (#735) Fix wrong expected exception in channel spec assertion +* (#729) Allow executor option in `Promise#then` +* (#725) fix timeout check to use timeout_interval +* (#719) update engine detection +* (#660) Add specs for Promise#zip/Promise.zip ordering +* (#654) Promise.zip execution changes +* (#666) Add thread safe set implementation +* (#651) #699 #to_s, #inspect should not output negative object IDs. +* (#685) Avoid RSpec warnings about raise_error +* (#680) Avoid RSpec monkey patching, persist spec results locally, use RSpec + v3.7.0 +* (#665) Initialize the monitor for new subarrays on Rubinius +* (#661) Fix error handling in edge promises + +concurrent-ruby-edge: + +* (#659) Edge promises fail during error handling +* Edge files clearly separated in `lib-edge` +* added ReInclude + +## Release v1.0.5, edge v0.3.1 (26 Feb 2017) + +concurrent-ruby: + +* Documentation for Event and Semaphore +* Use Unsafe#fullFence and #loadFence directly since the shortcuts were removed in JRuby +* Do not depend on org.jruby.util.unsafe.UnsafeHolder + +concurrent-ruby-edge: + +* (#620) Actors on Pool raise an error +* (#624) Delayed promises did not interact correctly with flatting + * Fix arguments yielded by callback methods +* Overridable default executor in promises factory methods +* Asking actor to terminate will always resolve to `true` + +## Release v1.0.4, edge v0.3.0 (27 Dec 2016) + +concurrent-ruby: + +* Nothing + +concurrent-ruby-edge: + +* New promises' API renamed, lots of improvements, edge bumped to 0.3.0 + * **Incompatible** with previous 0.2.3 version + * see https://github.com/ruby-concurrency/concurrent-ruby/pull/522 + +## Release v1.0.3 (17 Dec 2016) + +* Trigger execution of flattened delayed futures +* Avoid forking for processor_count if possible +* Semaphore Mutex and JRuby parity +* Adds Map#each as alias to Map#each_pair +* Fix uninitialized instance variables +* Make Fixnum, Bignum merger ready +* Allows Promise#then to receive an executor +* TimerSet now survives a fork +* Reject promise on any exception +* Allow ThreadLocalVar to be initialized with a block +* Support Alpha with `Concurrent::processor_count` +* Fixes format-security error when compiling ruby_193_compatible.h +* Concurrent::Atom#swap fixed: reraise the exceptions from block + +## Release v1.0.2 (2 May 2016) + +* Fix bug with `Concurrent::Map` MRI backend `#inspect` method +* Fix bug with `Concurrent::Map` MRI backend using `Hash#value?` +* Improved documentation and examples +* Minor updates to Edge + +## Release v1.0.1 (27 February 2016) + +* Fix "uninitialized constant Concurrent::ReentrantReadWriteLock" error. +* Better handling of `autoload` vs. `require`. +* Improved API for Edge `Future` zipping. +* Fix reference leak in Edge `Future` constructor . +* Fix bug which prevented thread pools from surviving a `fork`. +* Fix bug in which `TimerTask` did not correctly specify all its dependencies. +* Improved support for JRuby+Truffle +* Improved error messages. +* Improved documentation. +* Updated README and CONTRIBUTING. + +## Release v1.0.0 (13 November 2015) + +* Rename `attr_volatile_with_cas` to `attr_atomic` +* Add `clear_each` to `LockFreeStack` +* Update `AtomicReference` documentation +* Further updates and improvements to the synchronization layer. +* Performance and memory usage performance with `Actor` logging. +* Fixed `ThreadPoolExecutor` task count methods. +* Improved `Async` performance for both short and long-lived objects. +* Fixed bug in `LockFreeLinkedSet`. +* Fixed bug in which `Agent#await` triggered a validation failure. +* Further `Channel` updates. +* Adopted a project Code of Conduct +* Cleared interpreter warnings +* Fixed bug in `ThreadPoolExecutor` task count methods +* Fixed bug in 'LockFreeLinkedSet' +* Improved Java extension loading +* Handle Exception children in Edge::Future +* Continued improvements to channel +* Removed interpreter warnings. +* Shared constants now in `lib/concurrent/constants.rb` +* Refactored many tests. +* Improved synchronization layer/memory model documentation. +* Bug fix in Edge `Future#flat` +* Brand new `Channel` implementation in Edge gem. +* Simplification of `RubySingleThreadExecutor` +* `Async` improvements + - Each object uses its own `SingleThreadExecutor` instead of the global thread pool. + - No longers supports executor injection + - Much better documentation +* `Atom` updates + - No longer `Dereferenceable` + - Now `Observable` + - Added a `#reset` method +* Brand new `Agent` API and implementation. Now functionally equivalent to Clojure. +* Continued improvements to the synchronization layer +* Merged in the `thread_safe` gem + - `Concurrent::Array` + - `Concurrent::Hash` + - `Concurrent::Map` (formerly ThreadSafe::Cache) + - `Concurrent::Tuple` +* Minor improvements to Concurrent::Map +* Complete rewrite of `Exchanger` +* Removed all deprecated code (classes, methods, constants, etc.) +* Updated Agent, MutexAtomic, and BufferedChannel to inherit from Synchronization::Object. +* Many improved tests +* Some internal reorganization + +## Release v0.9.1 (09 August 2015) + +* Fixed a Rubiniux bug in synchronization object +* Fixed all interpreter warnings (except circular references) +* Fixed require statements when requiring `Atom` alone +* Significantly improved `ThreadLocalVar` on non-JRuby platforms +* Fixed error handling in Edge `Concurrent.zip` +* `AtomicFixnum` methods `#increment` and `#decrement` now support optional delta +* New `AtomicFixnum#update` method +* Minor optimizations in `ReadWriteLock` +* New `ReentrantReadWriteLock` class +* `ThreadLocalVar#bind` method is now public +* Refactored many tests + +## Release v0.9.0 (10 July 2015) + +* Updated `AtomicReference` + - `AtomicReference#try_update` now simply returns instead of raising exception + - `AtomicReference#try_update!` was added to raise exceptions if an update + fails. Note: this is the same behavior as the old `try_update` +* Pure Java implementations of + - `AtomicBoolean` + - `AtomicFixnum` + - `Semaphore` +* Fixed bug when pruning Ruby thread pools +* Fixed bug in time calculations within `ScheduledTask` +* Default `count` in `CountDownLatch` to 1 +* Use monotonic clock for all timers via `Concurrent.monotonic_time` + - Use `Process.clock_gettime(Process::CLOCK_MONOTONIC)` when available + - Fallback to `java.lang.System.nanoTime()` on unsupported JRuby versions + - Pure Ruby implementation for everything else + - Effects `Concurrent.timer`, `Concurrent.timeout`, `TimerSet`, `TimerTask`, and `ScheduledTask` +* Deprecated all clock-time based timer scheduling + - Only support scheduling by delay + - Effects `Concurrent.timer`, `TimerSet`, and `ScheduledTask` +* Added new `ReadWriteLock` class +* Consistent `at_exit` behavior for Java and Ruby thread pools. +* Added `at_exit` handler to Ruby thread pools (already in Java thread pools) + - Ruby handler stores the object id and retrieves from `ObjectSpace` + - JRuby disables `ObjectSpace` by default so that handler stores the object reference +* Added a `:stop_on_exit` option to thread pools to enable/disable `at_exit` handler +* Updated thread pool docs to better explain shutting down thread pools +* Simpler `:executor` option syntax for all abstractions which support this option +* Added `Executor#auto_terminate?` predicate method (for thread pools) +* Added `at_exit` handler to `TimerSet` +* Simplified auto-termination of the global executors + - Can now disable auto-termination of global executors + - Added shutdown/kill/wait_for_termination variants for global executors +* Can now disable auto-termination for *all* executors (the nuclear option) +* Simplified auto-termination of the global executors +* Deprecated terms "task pool" and "operation pool" + - New terms are "io executor" and "fast executor" + - New functions added with new names + - Deprecation warnings added to functions referencing old names +* Moved all thread pool related functions from `Concurrent::Configuration` to `Concurrent` + - Old functions still exist with deprecation warnings + - New functions have updated names as appropriate +* All high-level abstractions default to the "io executor" +* Fixed bug in `Actor` causing it to prematurely warm global thread pools on gem load + - This also fixed a `RejectedExecutionError` bug when running with minitest/autorun via JRuby +* Moved global logger up to the `Concurrent` namespace and refactored the code +* Optimized the performance of `Delay` + - Fixed a bug in which no executor option on construction caused block execution on a global thread pool +* Numerous improvements and bug fixes to `TimerSet` +* Fixed deadlock of `Future` when the handler raises Exception +* Added shared specs for more classes +* New concurrency abstractions including: + - `Atom` + - `Maybe` + - `ImmutableStruct` + - `MutableStruct` + - `SettableStruct` +* Created an Edge gem for unstable abstractions including + - `Actor` + - `Agent` + - `Channel` + - `Exchanger` + - `LazyRegister` + - **new Future Framework** <http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Edge.html> - unified + implementation of Futures and Promises which combines Features of previous `Future`, + `Promise`, `IVar`, `Event`, `Probe`, `dataflow`, `Delay`, `TimerTask` into single framework. It uses extensively + new synchronization layer to make all the paths **lock-free** with exception of blocking threads on `#wait`. + It offers better performance and does not block threads when not required. +* Actor framework changes: + - fixed reset loop in Pool + - Pool can use any actor as a worker, abstract worker class is no longer needed. + - Actor events not have format `[:event_name, *payload]` instead of just the Symbol. + - Actor now uses new Future/Promise Framework instead of `IVar` for better interoperability + - Behaviour definition array was simplified to `[BehaviourClass1, [BehaviourClass2, *initialization_args]]` + - Linking behavior responds to :linked message by returning array of linked actors + - Supervised behavior is removed in favour of just Linking + - RestartingContext is supervised by default now, `supervise: true` is not required any more + - Events can be private and public, so far only difference is that Linking will + pass to linked actors only public messages. Adding private :restarting and + :resetting events which are send before the actor restarts or resets allowing + to add callbacks to cleanup current child actors. + - Print also object_id in Reference to_s + - Add AbstractContext#default_executor to be able to override executor class wide + - Add basic IO example + - Documentation somewhat improved + - All messages should have same priority. It's now possible to send `actor << job1 << job2 << :terminate!` and + be sure that both jobs are processed first. +* Refactored `Channel` to use newer synchronization objects +* Added `#reset` and `#cancel` methods to `TimerSet` +* Added `#cancel` method to `Future` and `ScheduledTask` +* Refactored `TimerSet` to use `ScheduledTask` +* Updated `Async` with a factory that initializes the object +* Deprecated `Concurrent.timer` and `Concurrent.timeout` +* Reduced max threads on pure-Ruby thread pools (abends around 14751 threads) +* Moved many private/internal classes/modules into "namespace" modules +* Removed brute-force killing of threads in tests +* Fixed a thread pool bug when the operating system cannot allocate more threads + +## Release v0.8.0 (25 January 2015) + +* C extension for MRI have been extracted into the `concurrent-ruby-ext` companion gem. + Please see the README for more detail. +* Better variable isolation in `Promise` and `Future` via an `:args` option +* Continued to update intermittently failing tests + +## Release v0.7.2 (24 January 2015) + +* New `Semaphore` class based on [java.util.concurrent.Semaphore](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html) +* New `Promise.all?` and `Promise.any?` class methods +* Renamed `:overflow_policy` on thread pools to `:fallback_policy` +* Thread pools still accept the `:overflow_policy` option but display a warning +* Thread pools now implement `fallback_policy` behavior when not running (rather than universally rejecting tasks) +* Fixed minor `set_deref_options` constructor bug in `Promise` class +* Fixed minor `require` bug in `ThreadLocalVar` class +* Fixed race condition bug in `TimerSet` class +* Fixed race condition bug in `TimerSet` class +* Fixed signal bug in `TimerSet#post` method +* Numerous non-functional updates to clear warning when running in debug mode +* Fixed more intermittently failing tests +* Tests now run on new Travis build environment +* Multiple documentation updates + +## Release v0.7.1 (4 December 2014) + +Please see the [roadmap](https://github.com/ruby-concurrency/concurrent-ruby/issues/142) for more information on the next planned release. + +* Added `flat_map` method to `Promise` +* Added `zip` method to `Promise` +* Fixed bug with logging in `Actor` +* Improvements to `Promise` tests +* Removed actor-experimental warning +* Added an `IndirectImmediateExecutor` class +* Allow disabling auto termination of global executors +* Fix thread leaking in `ThreadLocalVar` (uses `Ref` gem on non-JRuby systems) +* Fix thread leaking when pruning pure-Ruby thread pools +* Prevent `Actor` from using an `ImmediateExecutor` (causes deadlock) +* Added missing synchronizations to `TimerSet` +* Fixed bug with return value of `Concurrent::Actor::Utils::Pool#ask` +* Fixed timing bug in `TimerTask` +* Fixed bug when creating a `JavaThreadPoolExecutor` with minimum pool size of zero +* Removed confusing warning when not using native extenstions +* Improved documentation + +## Release v0.7.0 (13 August 2014) + +* Merge the [atomic](https://github.com/ruby-concurrency/atomic) gem + - Pure Ruby `MutexAtomic` atomic reference class + - Platform native atomic reference classes `CAtomic`, `JavaAtomic`, and `RbxAtomic` + - Automated [build process](https://github.com/ruby-concurrency/rake-compiler-dev-box) + - Fat binary releases for [multiple platforms](https://rubygems.org/gems/concurrent-ruby/versions) including Windows (32/64), Linux (32/64), OS X (64-bit), Solaris (64-bit), and JRuby +* C native `CAtomicBoolean` +* C native `CAtomicFixnum` +* Refactored intermittently failing tests +* Added `dataflow!` and `dataflow_with!` methods to match `Future#value!` method +* Better handling of timeout in `Agent` +* Actor Improvements + - Fine-grained implementation using chain of behaviors. Each behavior is responsible for single aspect like: `Termination`, `Pausing`, `Linking`, `Supervising`, etc. Users can create custom Actors easily based on their needs. + - Supervision was added. `RestartingContext` will pause on error waiting on its supervisor to decide what to do next ( options are `:terminate!`, `:resume!`, `:reset!`, `:restart!`). Supervising behavior also supports strategies `:one_for_one` and `:one_for_all`. + - Linking was added to be able to monitor actor's events like: `:terminated`, `:paused`, `:restarted`, etc. + - Dead letter routing added. Rejected envelopes are collected in a configurable actor (default: `Concurrent::Actor.root.ask!(:dead_letter_routing)`) + - Old `Actor` class removed and replaced by new implementation previously called `Actress`. `Actress` was kept as an alias for `Actor` to keep compatibility. + - `Utils::Broadcast` actor which allows Publish–subscribe pattern. +* More executors for managing serialized operations + - `SerializedExecution` mixin module + - `SerializedExecutionDelegator` for serializing *any* executor +* Updated `Async` with serialized execution +* Updated `ImmediateExecutor` and `PerThreadExecutor` with full executor service lifecycle +* Added a `Delay` to root `Actress` initialization +* Minor bug fixes to thread pools +* Refactored many intermittently failing specs +* Removed Java interop warning `executor.rb:148 warning: ambiguous Java methods found, using submit(java.lang.Runnable)` +* Fixed minor bug in `RubyCachedThreadPool` overflow policy +* Updated tests to use [RSpec 3.0](http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3) +* Removed deprecated `Actor` class +* Better support for Rubinius + +## Release v0.6.1 (14 June 2014) + +* Many improvements to `Concurrent::Actress` +* Bug fixes to `Concurrent::RubyThreadPoolExecutor` +* Fixed several brittle tests +* Moved documentation to http://ruby-concurrency.github.io/concurrent-ruby/frames.html + +## Release v0.6.0 (25 May 2014) + +* Added `Concurrent::Observable` to encapsulate our thread safe observer sets +* Improvements to new `Channel` +* Major improvements to `CachedThreadPool` and `FixedThreadPool` +* Added `SingleThreadExecutor` +* Added `Current::timer` function +* Added `TimerSet` executor +* Added `AtomicBoolean` +* `ScheduledTask` refactoring +* Pure Ruby and JRuby-optimized `PriorityQueue` classes +* Updated `Agent` behavior to more closely match Clojure +* Observer sets support block callbacks to the `add_observer` method +* New algorithm for thread creation in `RubyThreadPoolExecutor` +* Minor API updates to `Event` +* Rewritten `TimerTask` now an `Executor` instead of a `Runnable` +* Fixed many brittle specs +* Renamed `FixedThreadPool` and `CachedThreadPool` to `RubyFixedThreadPool` and `RubyCachedThreadPool` +* Created JRuby optimized `JavaFixedThreadPool` and `JavaCachedThreadPool` +* Consolidated fixed thread pool tests into `spec/concurrent/fixed_thread_pool_shared.rb` and `spec/concurrent/cached_thread_pool_shared.rb` +* `FixedThreadPool` now subclasses `RubyFixedThreadPool` or `JavaFixedThreadPool` as appropriate +* `CachedThreadPool` now subclasses `RubyCachedThreadPool` or `JavaCachedThreadPool` as appropriate +* New `Delay` class +* `Concurrent::processor_count` helper function +* New `Async` module +* Renamed `NullThreadPool` to `PerThreadExecutor` +* Deprecated `Channel` (we are planning a new implementation based on [Go](http://golangtutorials.blogspot.com/2011/06/channels-in-go.html)) +* Added gem-level [configuration](http://robots.thoughtbot.com/mygem-configure-block) +* Deprecated `$GLOBAL_THREAD_POOL` in lieu of gem-level configuration +* Removed support for Ruby [1.9.2](https://www.ruby-lang.org/en/news/2013/12/17/maintenance-of-1-8-7-and-1-9-2/) +* New `RubyThreadPoolExecutor` and `JavaThreadPoolExecutor` classes +* All thread pools now extend the appropriate thread pool executor classes +* All thread pools now support `:overflow_policy` (based on Java's [reject policies](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)) +* Deprecated `UsesGlobalThreadPool` in lieu of explicit `:executor` option (dependency injection) on `Future`, `Promise`, and `Agent` +* Added `Concurrent::dataflow_with(executor, *inputs)` method to support executor dependency injection for dataflow +* Software transactional memory with `TVar` and `Concurrent::atomically` +* First implementation of [new, high-performance](https://github.com/ruby-concurrency/concurrent-ruby/pull/49) `Channel` +* `Actor` is deprecated in favor of new experimental actor implementation [#73](https://github.com/ruby-concurrency/concurrent-ruby/pull/73). To avoid namespace collision it is living in `Actress` namespace until `Actor` is removed in next release. + +## Release v0.5.0 + +This is the most significant release of this gem since its inception. This release includes many improvements and optimizations. It also includes several bug fixes. The major areas of focus for this release were: + +* Stability improvements on Ruby versions with thread-level parallelism ([JRuby](http://jruby.org/) and [Rubinius](http://rubini.us/)) +* Creation of new low-level concurrency abstractions +* Internal refactoring to use the new low-level abstractions + +Most of these updates had no effect on the gem API. There are a few notable exceptions which were unavoidable. Please read the [release notes](API-Updates-in-v0.5.0) for more information. + +Specific changes include: + +* New class `IVar` +* New class `MVar` +* New class `ThreadLocalVar` +* New class `AtomicFixnum` +* New class method `dataflow` +* New class `Condition` +* New class `CountDownLatch` +* New class `DependencyCounter` +* New class `SafeTaskExecutor` +* New class `CopyOnNotifyObserverSet` +* New class `CopyOnWriteObserverSet` +* `Future` updated with `execute` API +* `ScheduledTask` updated with `execute` API +* New `Promise` API +* `Future` now extends `IVar` +* `Postable#post?` now returns an `IVar` +* Thread safety fixes to `Dereferenceable` +* Thread safety fixes to `Obligation` +* Thread safety fixes to `Supervisor` +* Thread safety fixes to `Event` +* Various other thread safety (race condition) fixes +* Refactored brittle tests +* Implemented pending tests +* Added JRuby and Rubinius as Travis CI build targets +* Added [CodeClimate](https://codeclimate.com/) code review +* Improved YARD documentation diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/Gemfile b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/Gemfile new file mode 100644 index 000000000000..1b8d9fd9b1d0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/Gemfile @@ -0,0 +1,42 @@ +source 'https://rubygems.org' + +require File.join(File.dirname(__FILE__), 'lib/concurrent-ruby/concurrent/version') +require File.join(File.dirname(__FILE__ ), 'lib/concurrent-ruby-edge/concurrent/edge/version') +require File.join(File.dirname(__FILE__ ), 'lib/concurrent-ruby/concurrent/utility/engine') + +no_path = ENV['NO_PATH'] +options = no_path ? {} : { path: '.' } + +gem 'concurrent-ruby', Concurrent::VERSION, options +gem 'concurrent-ruby-edge', Concurrent::EDGE_VERSION, options +gem 'concurrent-ruby-ext', Concurrent::VERSION, options.merge(platform: :mri) + +group :development do + gem 'rake', (Concurrent.ruby_version :<, 2, 2, 0) ? '~> 12.0' : '~> 13.0' + gem 'rake-compiler', '~> 1.0', '>= 1.0.7' + gem 'rake-compiler-dock', '~> 1.0' + gem 'pry', '~> 0.11', platforms: :mri +end + +group :documentation, optional: true do + gem 'yard', '~> 0.9.0', require: false + gem 'redcarpet', '~> 3.0', platforms: :mri # understands github markdown + gem 'md-ruby-eval', '~> 0.6' +end + +group :testing do + gem 'rspec', '~> 3.7' + gem 'timecop', '~> 0.7.4' + gem 'sigdump', require: false +end + +# made opt-in since it will not install on jruby 1.7 +group :coverage, optional: !ENV['COVERAGE'] do + gem 'simplecov', '~> 0.16.0', require: false + gem 'coveralls', '~> 0.8.2', require: false +end + +group :benchmarks, optional: true do + gem 'benchmark-ips', '~> 2.7' + gem 'bench9000' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/LICENSE.txt new file mode 100644 index 000000000000..1026f28d0be9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/LICENSE.txt @@ -0,0 +1,21 @@ +Copyright (c) Jerry D'Antonio -- released under the MIT license. + +http://www.opensource.org/licenses/mit-license.php + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/README.md b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/README.md new file mode 100644 index 000000000000..2e89c2a5affc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/README.md @@ -0,0 +1,384 @@ +# Concurrent Ruby + +[![Gem Version](https://badge.fury.io/rb/concurrent-ruby.svg)](http://badge.fury.io/rb/concurrent-ruby) +[![Build Status](https://travis-ci.org/ruby-concurrency/concurrent-ruby.svg?branch=master)](https://travis-ci.org/ruby-concurrency/concurrent-ruby) +[![Build status](https://ci.appveyor.com/api/projects/status/iq8aboyuu3etad4w?svg=true)](https://ci.appveyor.com/project/rubyconcurrency/concurrent-ruby) +[![License](https://img.shields.io/badge/license-MIT-green.svg)](http://opensource.org/licenses/MIT) +[![Gitter chat](https://img.shields.io/badge/IRC%20(gitter)-devs%20%26%20users-brightgreen.svg)](https://gitter.im/ruby-concurrency/concurrent-ruby) + +Modern concurrency tools for Ruby. Inspired by +[Erlang](http://www.erlang.org/doc/reference_manual/processes.html), +[Clojure](http://clojure.org/concurrent_programming), +[Scala](http://akka.io/), +[Haskell](http://www.haskell.org/haskellwiki/Applications_and_libraries/Concurrency_and_parallelism#Concurrent_Haskell), +[F#](http://blogs.msdn.com/b/dsyme/archive/2010/02/15/async-and-parallel-design-patterns-in-f-part-3-agents.aspx), +[C#](http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx), +[Java](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html), +and classic concurrency patterns. + +<img src="https://raw.githubusercontent.com/ruby-concurrency/concurrent-ruby/master/docs-source/logo/concurrent-ruby-logo-300x300.png" align="right" style="margin-left: 20px;" /> + +The design goals of this gem are: + +* Be an 'unopinionated' toolbox that provides useful utilities without debating which is better + or why +* Remain free of external gem dependencies +* Stay true to the spirit of the languages providing inspiration +* But implement in a way that makes sense for Ruby +* Keep the semantics as idiomatic Ruby as possible +* Support features that make sense in Ruby +* Exclude features that don't make sense in Ruby +* Be small, lean, and loosely coupled +* Thread-safety +* Backward compatibility + +## Contributing + +**This gem depends on +[contributions](https://github.com/ruby-concurrency/concurrent-ruby/graphs/contributors) and we +appreciate your help. Would you like to contribute? Great! Have a look at +[issues with `looking-for-contributor` label](https://github.com/ruby-concurrency/concurrent-ruby/issues?q=is%3Aissue+is%3Aopen+label%3Alooking-for-contributor).** And if you pick something up let us know on the issue. + +## Thread Safety + +*Concurrent Ruby makes one of the strongest thread safety guarantees of any Ruby concurrency +library, providing consistent behavior and guarantees on all four of the main Ruby interpreters +(MRI/CRuby, JRuby, Rubinius, TruffleRuby).* + +Every abstraction in this library is thread safe. Specific thread safety guarantees are documented +with each abstraction. + +It is critical to remember, however, that Ruby is a language of mutable references. *No* +concurrency library for Ruby can ever prevent the user from making thread safety mistakes (such as +sharing a mutable object between threads and modifying it on both threads) or from creating +deadlocks through incorrect use of locks. All the library can do is provide safe abstractions which +encourage safe practices. Concurrent Ruby provides more safe concurrency abstractions than any +other Ruby library, many of which support the mantra of +["Do not communicate by sharing memory; instead, share memory by communicating"](https://blog.golang.org/share-memory-by-communicating). +Concurrent Ruby is also the only Ruby library which provides a full suite of thread safe and +immutable variable types and data structures. + +We've also initiated discussion to document [memory model](docs-source/synchronization.md) of Ruby which +would provide consistent behaviour and guarantees on all four of the main Ruby interpreters +(MRI/CRuby, JRuby, Rubinius, TruffleRuby). + +## Features & Documentation + +**The primary site for documentation is the automatically generated +[API documentation](http://ruby-concurrency.github.io/concurrent-ruby/index.html) which is up to +date with latest release.** This readme matches the master so may contain new stuff not yet +released. + +We also have a [IRC (gitter)](https://gitter.im/ruby-concurrency/concurrent-ruby). + +### Versioning + +* `concurrent-ruby` uses [Semantic Versioning](http://semver.org/) +* `concurrent-ruby-ext` has always same version as `concurrent-ruby` +* `concurrent-ruby-edge` will always be 0.y.z therefore following + [point 4](http://semver.org/#spec-item-4) applies *"Major version zero + (0.y.z) is for initial development. Anything may change at any time. The + public API should not be considered stable."* However we additionally use + following rules: + * Minor version increment means incompatible changes were made + * Patch version increment means only compatible changes were made + + +#### General-purpose Concurrency Abstractions + +* [Async](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Async.html): + A mixin module that provides simple asynchronous behavior to a class. Loosely based on Erlang's + [gen_server](http://www.erlang.org/doc/man/gen_server.html). +* [ScheduledTask](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ScheduledTask.html): + Like a Future scheduled for a specific future time. +* [TimerTask](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/TimerTask.html): + A Thread that periodically wakes up to perform work at regular intervals. +* [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html): + Unified implementation of futures and promises which combines features of previous `Future`, + `Promise`, `IVar`, `Event`, `dataflow`, `Delay`, and (partially) `TimerTask` into a single + framework. It extensively uses the new synchronization layer to make all the features + **non-blocking** and **lock-free**, with the exception of obviously blocking operations like + `#wait`, `#value`. It also offers better performance. + +#### Thread-safe Value Objects, Structures, and Collections + +Collection classes that were originally part of the (deprecated) `thread_safe` gem: + +* [Array](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Array.html) A thread-safe + subclass of Ruby's standard [Array](http://ruby-doc.org/core/Array.html). +* [Hash](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Hash.html) A thread-safe + subclass of Ruby's standard [Hash](http://ruby-doc.org/core/Hash.html). +* [Set](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Set.html) A thread-safe + subclass of Ruby's standard [Set](http://ruby-doc.org/stdlib-2.4.0/libdoc/set/rdoc/Set.html). +* [Map](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Map.html) A hash-like object + that should have much better performance characteristics, especially under high concurrency, + than `Concurrent::Hash`. +* [Tuple](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Tuple.html) A fixed size + array with volatile (synchronized, thread safe) getters/setters. + +Value objects inspired by other languages: + +* [Maybe](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Maybe.html) A thread-safe, + immutable object representing an optional value, based on + [Haskell Data.Maybe](https://hackage.haskell.org/package/base-4.2.0.1/docs/Data-Maybe.html). + +Structure classes derived from Ruby's [Struct](http://ruby-doc.org/core/Struct.html): + +* [ImmutableStruct](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ImmutableStruct.html) + Immutable struct where values are set at construction and cannot be changed later. +* [MutableStruct](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/MutableStruct.html) + Synchronized, mutable struct where values can be safely changed at any time. +* [SettableStruct](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/SettableStruct.html) + Synchronized, write-once struct where values can be set at most once, either at construction + or any time thereafter. + +Thread-safe variables: + +* [Agent](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Agent.html): A way to + manage shared, mutable, *asynchronous*, independent state. Based on Clojure's + [Agent](http://clojure.org/agents). +* [Atom](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Atom.html): A way to manage + shared, mutable, *synchronous*, independent state. Based on Clojure's + [Atom](http://clojure.org/atoms). +* [AtomicBoolean](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicBoolean.html) + A boolean value that can be updated atomically. +* [AtomicFixnum](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicFixnum.html) + A numeric value that can be updated atomically. +* [AtomicReference](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicReference.html) + An object reference that may be updated atomically. +* [Exchanger](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Exchanger.html) + A synchronization point at which threads can pair and swap elements within pairs. Based on + Java's [Exchanger](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html). +* [MVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/MVar.html) A synchronized + single element container. Based on Haskell's + [MVar](https://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Concurrent-MVar.html) and + Scala's [MVar](http://docs.typelevel.org/api/scalaz/nightly/index.html#scalaz.concurrent.MVar$). +* [ThreadLocalVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ThreadLocalVar.html) + A variable where the value is different for each thread. +* [TVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/TVar.html) A transactional + variable implementing software transactional memory (STM). Based on Clojure's + [Ref](http://clojure.org/refs). + +#### Java-inspired ThreadPools and Other Executors + +* See the [thread pool](http://ruby-concurrency.github.io/concurrent-ruby/master/file.thread_pools.html) + overview, which also contains a list of other Executors available. + +#### Thread Synchronization Classes and Algorithms + +* [CountDownLatch](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/CountDownLatch.html) + A synchronization object that allows one thread to wait on multiple other threads. +* [CyclicBarrier](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/CyclicBarrier.html) + A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. +* [Event](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Event.html) Old school + kernel-style event. +* [ReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ReadWriteLock.html) + A lock that supports multiple readers but only one writer. +* [ReentrantReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ReentrantReadWriteLock.html) + A read/write lock with reentrant and upgrade features. +* [Semaphore](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Semaphore.html) + A counting-based locking mechanism that uses permits. +* [AtomicMarkableReference](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicMarkableReference.html) + +#### Deprecated + +Deprecated features are still available and bugs are being fixed, but new features will not be added. + +* ~~[Future](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Future.html): + An asynchronous operation that produces a value.~~ Replaced by + [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). + * ~~[.dataflow](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent.html#dataflow-class_method): + Built on Futures, Dataflow allows you to create a task that will be scheduled when all of + its data dependencies are available.~~ Replaced by + [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). +* ~~[Promise](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promise.html): Similar + to Futures, with more features.~~ Replaced by + [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). +* ~~[Delay](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Delay.html) Lazy evaluation + of a block yielding an immutable result. Based on Clojure's + [delay](https://clojuredocs.org/clojure.core/delay).~~ Replaced by + [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). +* ~~[IVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/IVar.html) Similar to a + "future" but can be manually assigned once, after which it becomes immutable.~~ Replaced by + [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html). + +### Edge Features + +These are available in the `concurrent-ruby-edge` companion gem. + +These features are under active development and may change frequently. They are expected not to +keep backward compatibility (there may also lack tests and documentation). Semantic versions will +be obeyed though. Features developed in `concurrent-ruby-edge` are expected to move to +`concurrent-ruby` when final. + +* [Actor](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Actor.html): Implements + the Actor Model, where concurrent actors exchange messages. + *Status: Partial documentation and tests; depends on new future/promise framework; stability is good.* +* [Channel](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Channel.html): + Communicating Sequential Processes ([CSP](https://en.wikipedia.org/wiki/Communicating_sequential_processes)). + Functionally equivalent to Go [channels](https://tour.golang.org/concurrency/2) with additional + inspiration from Clojure [core.async](https://clojure.github.io/core.async/). + *Status: Partial documentation and tests.* +* [LazyRegister](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/LazyRegister.html) +* [LockFreeLinkedSet](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Edge/LockFreeLinkedSet.html) + *Status: will be moved to core soon.* +* [LockFreeStack](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/LockFreeStack.html) + *Status: missing documentation and tests.* +* [Promises::Channel](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises/Channel.html) + A first in first out channel that accepts messages with push family of methods and returns + messages with pop family of methods. + Pop and push operations can be represented as futures, see `#pop_op` and `#push_op`. + The capacity of the channel can be limited to support back pressure, use capacity option in `#initialize`. + `#pop` method blocks ans `#pop_op` returns pending future if there is no message in the channel. + If the capacity is limited the `#push` method blocks and `#push_op` returns pending future. +* [Cancellation](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Cancellation.html) + The Cancellation abstraction provides cooperative cancellation. + + The standard methods `Thread#raise` of `Thread#kill` available in Ruby + are very dangerous (see linked the blog posts bellow). + Therefore concurrent-ruby provides an alternative. + + * <https://jvns.ca/blog/2015/11/27/why-rubys-timeout-is-dangerous-and-thread-dot-raise-is-terrifying/> + * <http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/> + * <http://blog.headius.com/2008/02/rubys-threadraise-threadkill-timeoutrb.html> + + It provides an object which represents a task which can be executed, + the task has to get the reference to the object and periodically cooperatively check that it is not cancelled. + Good practices to make tasks cancellable: + * check cancellation every cycle of a loop which does significant work, + * do all blocking actions in a loop with a timeout then on timeout check cancellation + and if ok block again with the timeout +* [Throttle](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Throttle.html) + A tool managing concurrency level of tasks. +* [ErlangActor](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ErlangActor.html) + Actor implementation which precisely matches Erlang actor behaviour. + Requires at least Ruby 2.1 otherwise it's not loaded. +* [WrappingExecutor](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/WrappingExecutor.html) + A delegating executor which modifies each task before the task is given to + the target executor it delegates to. + +## Supported Ruby versions + +* MRI 2.0 and above +* JRuby 9000 +* TruffleRuby are supported. +* Any Ruby interpreter that is compliant with Ruby 2.0 or newer. + +Actually we still support mri 1.9.3 and jruby 1.7.27 but we are looking at ways how to drop the support. +Java 8 is preferred for JRuby but every Java version on which JRuby 9000 runs is supported. + +The legacy support for Rubinius is kept but it is no longer maintained, if you would like to help +please respond to [#739](https://github.com/ruby-concurrency/concurrent-ruby/issues/739). + +## Usage + +Everything within this gem can be loaded simply by requiring it: + +```ruby +require 'concurrent' +``` + +*Requiring only specific abstractions from Concurrent Ruby is not yet supported.* + +To use the tools in the Edge gem it must be required separately: + +```ruby +require 'concurrent-edge' +``` + +If the library does not behave as expected, `Concurrent.use_stdlib_logger(Logger::DEBUG)` could +help to reveal the problem. + +## Installation + +```shell +gem install concurrent-ruby +``` + +or add the following line to Gemfile: + +```ruby +gem 'concurrent-ruby', require: 'concurrent' +``` + +and run `bundle install` from your shell. + +### Edge Gem Installation + +The Edge gem must be installed separately from the core gem: + +```shell +gem install concurrent-ruby-edge +``` + +or add the following line to Gemfile: + +```ruby +gem 'concurrent-ruby-edge', require: 'concurrent-edge' +``` + +and run `bundle install` from your shell. + + +### C Extensions for MRI + +Potential performance improvements may be achieved under MRI by installing optional C extensions. +To minimise installation errors the C extensions are available in the `concurrent-ruby-ext` +extension gem. `concurrent-ruby` and `concurrent-ruby-ext` are always released together with same +version. Simply install the extension gem too: + +```ruby +gem install concurrent-ruby-ext +``` + +or add the following line to Gemfile: + +```ruby +gem 'concurrent-ruby-ext' +``` + +and run `bundle install` from your shell. + +In code it is only necessary to + +```ruby +require 'concurrent' +``` + +The `concurrent-ruby` gem will automatically detect the presence of the `concurrent-ruby-ext` gem +and load the appropriate C extensions. + +#### Note For gem developers + +No gems should depend on `concurrent-ruby-ext`. Doing so will force C extensions on your users. The +best practice is to depend on `concurrent-ruby` and let users to decide if they want C extensions. + +## Maintainers + +* [Petr Chalupa](https://github.com/pitr-ch) (lead maintainer, point-of-contact) +* [Jerry D'Antonio](https://github.com/jdantonio) (creator) +* [Chris Seaton](https://github.com/chrisseaton) + +### Special Thanks to + +* [Brian Durand](https://github.com/bdurand) for the `ref` gem +* [Charles Oliver Nutter](https://github.com/headius) for the `atomic` and `thread_safe` gems +* [thedarkone](https://github.com/thedarkone) for the `thread_safe` gem + +and to the past maintainers + +* [Michele Della Torre](https://github.com/mighe) +* [Paweł Obrok](https://github.com/obrok) +* [Lucas Allan](https://github.com/lucasallan) + +and to [Ruby Association](https://www.ruby.or.jp/en/) for sponsoring a project +["Enhancing Ruby’s concurrency tooling"](https://www.ruby.or.jp/en/news/20181106) in 2018. + +## License and Copyright + +*Concurrent Ruby* is free software released under the +[MIT License](http://www.opensource.org/licenses/MIT). + +The *Concurrent Ruby* [logo](https://raw.githubusercontent.com/ruby-concurrency/concurrent-ruby/master/docs-source/logo/concurrent-ruby-logo-300x300.png) was +designed by [David Jones](https://twitter.com/zombyboy). It is Copyright &copy; 2014 +[Jerry D'Antonio](https://twitter.com/jerrydantonio). All Rights Reserved. diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/Rakefile b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/Rakefile new file mode 100644 index 000000000000..7c0b4af9a538 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/Rakefile @@ -0,0 +1,334 @@ +require_relative 'lib/concurrent-ruby/concurrent/version' +require_relative 'lib/concurrent-ruby-edge/concurrent/edge/version' +require_relative 'lib/concurrent-ruby/concurrent/utility/engine' + +if Concurrent.ruby_version :<, 2, 0, 0 + # @!visibility private + module Kernel + def __dir__ + File.dirname __FILE__ + end + end +end + +core_gemspec = Gem::Specification.load File.join(__dir__, 'concurrent-ruby.gemspec') +ext_gemspec = Gem::Specification.load File.join(__dir__, 'concurrent-ruby-ext.gemspec') +edge_gemspec = Gem::Specification.load File.join(__dir__, 'concurrent-ruby-edge.gemspec') + +require 'rake/javaextensiontask' + +ENV['JRUBY_HOME'] = ENV['CONCURRENT_JRUBY_HOME'] if ENV['CONCURRENT_JRUBY_HOME'] && !Concurrent.on_jruby? + +Rake::JavaExtensionTask.new('concurrent_ruby', core_gemspec) do |ext| + ext.ext_dir = 'ext/concurrent-ruby' + ext.lib_dir = 'lib/concurrent-ruby/concurrent' +end + +unless Concurrent.on_jruby? + require 'rake/extensiontask' + + Rake::ExtensionTask.new('concurrent_ruby_ext', ext_gemspec) do |ext| + ext.ext_dir = 'ext/concurrent-ruby-ext' + ext.lib_dir = 'lib/concurrent-ruby/concurrent' + ext.source_pattern = '*.{c,h}' + + ext.cross_compile = true + ext.cross_platform = ['x86-mingw32', 'x64-mingw32'] + end +end + +require 'rake_compiler_dock' +namespace :repackage do + desc '* with Windows fat distributions' + task :all do + Dir.chdir(__dir__) do + # store gems in vendor cache for docker + sh 'bundle package' + + # build only the jar file not the whole gem for java platform, the jar is part the concurrent-ruby-x.y.z.gem + Rake::Task['lib/concurrent-ruby/concurrent/concurrent_ruby.jar'].invoke + + # build all gem files + %w[x86-mingw32 x64-mingw32].each do |plat| + RakeCompilerDock.sh "bundle install --local && bundle exec rake native:#{plat} gem --trace", platform: plat + end + end + end +end + +require 'rubygems' +require 'rubygems/package_task' + +Gem::PackageTask.new(core_gemspec) {} if core_gemspec +Gem::PackageTask.new(ext_gemspec) {} if ext_gemspec && !Concurrent.on_jruby? +Gem::PackageTask.new(edge_gemspec) {} if edge_gemspec + +CLEAN.include('lib/concurrent-ruby/concurrent/2.*', 'lib/concurrent-ruby/concurrent/*.jar') + +begin + require 'rspec' + require 'rspec/core/rake_task' + + RSpec::Core::RakeTask.new(:spec) + + namespace :spec do + desc '* Configured for ci' + RSpec::Core::RakeTask.new(:ci) do |t| + options = %w[ --color + --backtrace + --order defined + --format documentation + --tag ~notravis ] + t.rspec_opts = [*options].join(' ') + end + + desc '* test packaged and installed gems instead of local files' + task :installed do + Dir.chdir(__dir__) do + sh "gem install pkg/concurrent-ruby-#{Concurrent::VERSION}.gem" + sh "gem install pkg/concurrent-ruby-ext-#{Concurrent::VERSION}.gem" if Concurrent.on_cruby? + sh "gem install pkg/concurrent-ruby-edge-#{Concurrent::EDGE_VERSION}.gem" + ENV['NO_PATH'] = 'true' + sh 'bundle update' + sh 'bundle exec rake spec:ci' + end + end + end + + desc 'executed in CI' + task :ci => [:compile, 'spec:ci'] + + task :default => [:clobber, :compile, :spec] +rescue LoadError => e + puts 'RSpec is not installed, skipping test task definitions: ' + e.message +end + +current_yard_version_name = Concurrent::VERSION + +begin + require 'yard' + require 'md_ruby_eval' + require_relative 'support/yard_full_types' + + common_yard_options = ['--no-yardopts', + '--no-document', + '--no-private', + '--embed-mixins', + '--markup', 'markdown', + '--title', 'Concurrent Ruby', + '--template', 'default', + '--template-path', 'yard-template', + '--default-return', 'undocumented'] + + desc 'Generate YARD Documentation (signpost, master)' + task :yard => ['yard:signpost', 'yard:master'] + + namespace :yard do + + desc '* eval markdown files' + task :eval_md do + Dir.chdir File.join(__dir__, 'docs-source') do + sh 'bundle exec md-ruby-eval --auto' + end + end + + task :update_readme do + Dir.chdir __dir__ do + content = File.read(File.join('README.md')). + gsub(/\[([\w ]+)\]\(http:\/\/ruby-concurrency\.github\.io\/concurrent-ruby\/master\/.*\)/) do |_| + case $1 + when 'LockFreeLinkedSet' + "{Concurrent::Edge::#{$1} #{$1}}" + when '.dataflow' + '{Concurrent.dataflow Concurrent.dataflow}' + when 'thread pool' + '{file:thread_pools.md thread pool}' + else + "{Concurrent::#{$1} #{$1}}" + end + end + FileUtils.mkpath 'tmp' + File.write 'tmp/README.md', content + end + end + + define_yard_task = -> name do + output_dir = "docs/#{name}" + + removal_name = "remove.#{name}" + task removal_name do + Dir.chdir __dir__ do + FileUtils.rm_rf output_dir + end + end + + desc "* of #{name} into subdir #{name}" + YARD::Rake::YardocTask.new(name) do |yard| + yard.options.push( + '--output-dir', output_dir, + '--main', 'tmp/README.md', + *common_yard_options) + yard.files = ['./lib/concurrent-ruby/**/*.rb', + './lib/concurrent-ruby-edge/**/*.rb', + './ext/concurrent_ruby_ext/**/*.c', + '-', + 'docs-source/thread_pools.md', + 'docs-source/promises.out.md', + 'docs-source/medium-example.out.rb', + 'LICENSE.txt', + 'CHANGELOG.md'] + end + Rake::Task[name].prerequisites.push removal_name, + # 'yard:eval_md', + 'yard:update_readme' + end + + define_yard_task.call current_yard_version_name + define_yard_task.call 'master' + + desc "* signpost for versions" + YARD::Rake::YardocTask.new(:signpost) do |yard| + yard.options.push( + '--output-dir', 'docs', + '--main', 'docs-source/signpost.md', + *common_yard_options) + yard.files = ['no-lib'] + end + + define_uptodate_task = -> name do + namespace name do + desc "** ensure that #{name} generated documentation is matching the source code" + task :uptodate do + Dir.chdir(__dir__) do + begin + FileUtils.cp_r 'docs', 'docs-copy', verbose: true + Rake::Task["yard:#{name}"].invoke + sh 'diff -r docs/ docs-copy/' do |ok, res| + unless ok + begin + STDOUT.puts 'Command failed. Continue? (y/n)' + input = STDIN.gets.strip.downcase + end until %w(y n).include?(input) + exit 1 if input == 'n' + end + end + ensure + FileUtils.rm_rf 'docs-copy', verbose: true + end + end + end + end + end + + define_uptodate_task.call current_yard_version_name + define_uptodate_task.call 'master' + end + +rescue LoadError => e + puts 'YARD is not installed, skipping documentation task definitions: ' + e.message +end + +desc 'build, test, and publish the gem' +task :release => ['release:checks', 'release:build', 'release:test', 'release:publish'] + +namespace :release do + # Depends on environment of @pitr-ch + + mri_version = '2.6.5' + jruby_version = 'jruby-9.2.9.0' + + task :checks => "yard:#{current_yard_version_name}:uptodate" do + Dir.chdir(__dir__) do + sh 'test -z "$(git status --porcelain)"' do |ok, res| + unless ok + begin + STDOUT.puts 'Command failed. Continue? (y/n)' + input = STDIN.gets.strip.downcase + end until %w(y n).include?(input) + exit 1 if input == 'n' + end + end + sh 'git fetch' + sh 'test $(git show-ref --verify --hash refs/heads/master) = ' + + '$(git show-ref --verify --hash refs/remotes/origin/master)' do |ok, res| + unless ok + begin + STDOUT.puts 'Command failed. Continue? (y/n)' + input = STDIN.gets.strip.downcase + end until %w(y n).include?(input) + exit 1 if input == 'n' + end + end + end + end + + desc '* build all *.gem files necessary for release' + task :build => [:clobber, 'repackage:all'] + + desc '* test actual installed gems instead of cloned repository on MRI and JRuby' + task :test do + Dir.chdir(__dir__) do + old = ENV['RBENV_VERSION'] + + ENV['RBENV_VERSION'] = mri_version + sh 'rbenv version' + sh 'bundle exec rake spec:installed' + + ENV['RBENV_VERSION'] = jruby_version + sh 'rbenv version' + sh 'bundle exec rake spec:installed' + + puts 'Windows build is untested' + + ENV['RBENV_VERSION'] = old + end + end + + desc '* do all nested steps' + task :publish => ['publish:ask', 'publish:tag', 'publish:rubygems', 'publish:post_steps'] + + namespace :publish do + publish_edge = false + + task :ask do + begin + STDOUT.puts 'Do you want to publish anything? (y/n)' + input = STDIN.gets.strip.downcase + end until %w(y n).include?(input) + exit 1 if input == 'n' + begin + STDOUT.puts 'Do you want to publish edge? (y/n)' + input = STDIN.gets.strip.downcase + end until %w(y n).include?(input) + publish_edge = input == 'y' + end + + desc '** tag HEAD with current version and push to github' + task :tag => :ask do + Dir.chdir(__dir__) do + sh "git tag v#{Concurrent::VERSION}" + sh "git push origin v#{Concurrent::VERSION}" + sh "git tag edge-v#{Concurrent::EDGE_VERSION}" if publish_edge + sh "git push origin edge-v#{Concurrent::EDGE_VERSION}" if publish_edge + end + end + + desc '** push all *.gem files to rubygems' + task :rubygems => :ask do + Dir.chdir(__dir__) do + sh "gem push pkg/concurrent-ruby-#{Concurrent::VERSION}.gem" + sh "gem push pkg/concurrent-ruby-edge-#{Concurrent::EDGE_VERSION}.gem" if publish_edge + sh "gem push pkg/concurrent-ruby-ext-#{Concurrent::VERSION}.gem" + sh "gem push pkg/concurrent-ruby-ext-#{Concurrent::VERSION}-x64-mingw32.gem" + sh "gem push pkg/concurrent-ruby-ext-#{Concurrent::VERSION}-x86-mingw32.gem" + end + end + + desc '** print post release steps' + task :post_steps do + puts 'Manually: create a release on GitHub with relevant changelog part' + puts 'Manually: send email same as release with relevant changelog part' + puts 'Manually: tweet' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/ConcurrentRubyService.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/ConcurrentRubyService.java new file mode 100644 index 000000000000..fb6be96d377e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/ConcurrentRubyService.java @@ -0,0 +1,17 @@ +import org.jruby.Ruby; +import org.jruby.runtime.load.BasicLibraryService; + +import java.io.IOException; + +public class ConcurrentRubyService implements BasicLibraryService { + + public boolean basicLoad(final Ruby runtime) throws IOException { + new com.concurrent_ruby.ext.AtomicReferenceLibrary().load(runtime, false); + new com.concurrent_ruby.ext.JavaAtomicBooleanLibrary().load(runtime, false); + new com.concurrent_ruby.ext.JavaAtomicFixnumLibrary().load(runtime, false); + new com.concurrent_ruby.ext.JavaSemaphoreLibrary().load(runtime, false); + new com.concurrent_ruby.ext.SynchronizationLibrary().load(runtime, false); + new com.concurrent_ruby.ext.JRubyMapBackendLibrary().load(runtime, false); + return true; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/AtomicReferenceLibrary.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/AtomicReferenceLibrary.java new file mode 100644 index 000000000000..dfa9e7704e5e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/AtomicReferenceLibrary.java @@ -0,0 +1,175 @@ +package com.concurrent_ruby.ext; + +import java.lang.reflect.Field; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyModule; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.Library; + +/** + * This library adds an atomic reference type to JRuby for use in the atomic + * library. We do a native version to avoid the implicit value coercion that + * normally happens through JI. + * + * @author headius + */ +public class AtomicReferenceLibrary implements Library { + public void load(Ruby runtime, boolean wrap) throws IOException { + RubyModule concurrentMod = runtime.defineModule("Concurrent"); + RubyClass atomicCls = concurrentMod.defineClassUnder("JavaAtomicReference", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR); + try { + sun.misc.Unsafe.class.getMethod("getAndSetObject", Object.class); + atomicCls.setAllocator(JRUBYREFERENCE8_ALLOCATOR); + } catch (Exception e) { + // leave it as Java 6/7 version + } + atomicCls.defineAnnotatedMethods(JRubyReference.class); + } + + private static final ObjectAllocator JRUBYREFERENCE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JRubyReference(runtime, klazz); + } + }; + + private static final ObjectAllocator JRUBYREFERENCE8_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JRubyReference8(runtime, klazz); + } + }; + + @JRubyClass(name="JRubyReference", parent="Object") + public static class JRubyReference extends RubyObject { + volatile IRubyObject reference; + + static final sun.misc.Unsafe UNSAFE; + static final long referenceOffset; + + static { + try { + UNSAFE = UnsafeHolder.U; + Class k = JRubyReference.class; + referenceOffset = UNSAFE.objectFieldOffset(k.getDeclaredField("reference")); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public JRubyReference(Ruby runtime, RubyClass klass) { + super(runtime, klass); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context) { + UNSAFE.putObject(this, referenceOffset, context.nil); + return context.nil; + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject value) { + UNSAFE.putObject(this, referenceOffset, value); + return context.nil; + } + + @JRubyMethod(name = {"get", "value"}) + public IRubyObject get() { + return reference; + } + + @JRubyMethod(name = {"set", "value="}) + public IRubyObject set(IRubyObject newValue) { + UNSAFE.putObjectVolatile(this, referenceOffset, newValue); + return newValue; + } + + @JRubyMethod(name = {"compare_and_set", "compare_and_swap"}) + public IRubyObject compare_and_set(ThreadContext context, IRubyObject expectedValue, IRubyObject newValue) { + Ruby runtime = context.runtime; + + if (expectedValue instanceof RubyNumeric) { + // numerics are not always idempotent in Ruby, so we need to do slower logic + return compareAndSetNumeric(context, expectedValue, newValue); + } + + return runtime.newBoolean(UNSAFE.compareAndSwapObject(this, referenceOffset, expectedValue, newValue)); + } + + @JRubyMethod(name = {"get_and_set", "swap"}) + public IRubyObject get_and_set(ThreadContext context, IRubyObject newValue) { + // less-efficient version for Java 6 and 7 + while (true) { + IRubyObject oldValue = get(); + if (UNSAFE.compareAndSwapObject(this, referenceOffset, oldValue, newValue)) { + return oldValue; + } + } + } + + private IRubyObject compareAndSetNumeric(ThreadContext context, IRubyObject expectedValue, IRubyObject newValue) { + Ruby runtime = context.runtime; + + // loop until: + // * reference CAS would succeed for same-valued objects + // * current and expected have different values as determined by #equals + while (true) { + IRubyObject current = reference; + + if (!(current instanceof RubyNumeric)) { + // old value is not numeric, CAS fails + return runtime.getFalse(); + } + + RubyNumeric currentNumber = (RubyNumeric)current; + if (!currentNumber.equals(expectedValue)) { + // current number does not equal expected, fail CAS + return runtime.getFalse(); + } + + // check that current has not changed, or else allow loop to repeat + boolean success = UNSAFE.compareAndSwapObject(this, referenceOffset, current, newValue); + if (success) { + // value is same and did not change in interim...success + return runtime.getTrue(); + } + } + } + } + + private static final class UnsafeHolder { + private UnsafeHolder(){} + + public static final sun.misc.Unsafe U = loadUnsafe(); + + private static sun.misc.Unsafe loadUnsafe() { + try { + Class unsafeClass = Class.forName("sun.misc.Unsafe"); + Field f = unsafeClass.getDeclaredField("theUnsafe"); + f.setAccessible(true); + return (sun.misc.Unsafe) f.get(null); + } catch (Exception e) { + return null; + } + } + } + + public static class JRubyReference8 extends JRubyReference { + public JRubyReference8(Ruby runtime, RubyClass klass) { + super(runtime, klass); + } + + @Override + public IRubyObject get_and_set(ThreadContext context, IRubyObject newValue) { + // efficient version for Java 8 + return (IRubyObject)UNSAFE.getAndSetObject(this, referenceOffset, newValue); + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JRubyMapBackendLibrary.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JRubyMapBackendLibrary.java new file mode 100644 index 000000000000..a09f9162eea2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JRubyMapBackendLibrary.java @@ -0,0 +1,248 @@ +package com.concurrent_ruby.ext; + +import org.jruby.*; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import com.concurrent_ruby.ext.jsr166e.ConcurrentHashMap; +import com.concurrent_ruby.ext.jsr166e.ConcurrentHashMapV8; +import com.concurrent_ruby.ext.jsr166e.nounsafe.*; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.Library; + +import java.io.IOException; +import java.util.Map; + +import static org.jruby.runtime.Visibility.PRIVATE; + +/** + * Native Java implementation to avoid the JI overhead. + * + * @author thedarkone + */ +public class JRubyMapBackendLibrary implements Library { + public void load(Ruby runtime, boolean wrap) throws IOException { + + RubyModule concurrentMod = runtime.defineModule("Concurrent"); + RubyModule thread_safeMod = concurrentMod.defineModuleUnder("Collection"); + RubyClass jrubyRefClass = thread_safeMod.defineClassUnder("JRubyMapBackend", runtime.getObject(), BACKEND_ALLOCATOR); + jrubyRefClass.setAllocator(BACKEND_ALLOCATOR); + jrubyRefClass.defineAnnotatedMethods(JRubyMapBackend.class); + } + + private static final ObjectAllocator BACKEND_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JRubyMapBackend(runtime, klazz); + } + }; + + @JRubyClass(name="JRubyMapBackend", parent="Object") + public static class JRubyMapBackend extends RubyObject { + // Defaults used by the CHM + static final int DEFAULT_INITIAL_CAPACITY = 16; + static final float DEFAULT_LOAD_FACTOR = 0.75f; + + public static final boolean CAN_USE_UNSAFE_CHM = canUseUnsafeCHM(); + + private ConcurrentHashMap<IRubyObject, IRubyObject> map; + + private static ConcurrentHashMap<IRubyObject, IRubyObject> newCHM(int initialCapacity, float loadFactor) { + if (CAN_USE_UNSAFE_CHM) { + return new ConcurrentHashMapV8<IRubyObject, IRubyObject>(initialCapacity, loadFactor); + } else { + return new com.concurrent_ruby.ext.jsr166e.nounsafe.ConcurrentHashMapV8<IRubyObject, IRubyObject>(initialCapacity, loadFactor); + } + } + + private static ConcurrentHashMap<IRubyObject, IRubyObject> newCHM() { + return newCHM(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); + } + + private static boolean canUseUnsafeCHM() { + try { + new com.concurrent_ruby.ext.jsr166e.ConcurrentHashMapV8(); // force class load and initialization + return true; + } catch (Throwable t) { // ensuring we really do catch everything + // Doug's Unsafe setup errors always have this "Could not ini.." message + if (isCausedBySecurityException(t)) { + return false; + } + throw (t instanceof RuntimeException ? (RuntimeException) t : new RuntimeException(t)); + } + } + + private static boolean isCausedBySecurityException(Throwable t) { + while (t != null) { + if ((t.getMessage() != null && t.getMessage().contains("Could not initialize intrinsics")) || t instanceof SecurityException) { + return true; + } + t = t.getCause(); + } + return false; + } + + public JRubyMapBackend(Ruby runtime, RubyClass klass) { + super(runtime, klass); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context) { + map = newCHM(); + return context.getRuntime().getNil(); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject options) { + map = toCHM(context, options); + return context.getRuntime().getNil(); + } + + private ConcurrentHashMap<IRubyObject, IRubyObject> toCHM(ThreadContext context, IRubyObject options) { + Ruby runtime = context.getRuntime(); + if (!options.isNil() && options.respondsTo("[]")) { + IRubyObject rInitialCapacity = options.callMethod(context, "[]", runtime.newSymbol("initial_capacity")); + IRubyObject rLoadFactor = options.callMethod(context, "[]", runtime.newSymbol("load_factor")); + int initialCapacity = !rInitialCapacity.isNil() ? RubyNumeric.num2int(rInitialCapacity.convertToInteger()) : DEFAULT_INITIAL_CAPACITY; + float loadFactor = !rLoadFactor.isNil() ? (float)RubyNumeric.num2dbl(rLoadFactor.convertToFloat()) : DEFAULT_LOAD_FACTOR; + return newCHM(initialCapacity, loadFactor); + } else { + return newCHM(); + } + } + + @JRubyMethod(name = "[]", required = 1) + public IRubyObject op_aref(ThreadContext context, IRubyObject key) { + IRubyObject value; + return ((value = map.get(key)) == null) ? context.getRuntime().getNil() : value; + } + + @JRubyMethod(name = {"[]="}, required = 2) + public IRubyObject op_aset(IRubyObject key, IRubyObject value) { + map.put(key, value); + return value; + } + + @JRubyMethod + public IRubyObject put_if_absent(IRubyObject key, IRubyObject value) { + IRubyObject result = map.putIfAbsent(key, value); + return result == null ? getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject compute_if_absent(final ThreadContext context, final IRubyObject key, final Block block) { + return map.computeIfAbsent(key, new ConcurrentHashMap.Fun<IRubyObject, IRubyObject>() { + @Override + public IRubyObject apply(IRubyObject key) { + return block.yieldSpecific(context); + } + }); + } + + @JRubyMethod + public IRubyObject compute_if_present(final ThreadContext context, final IRubyObject key, final Block block) { + IRubyObject result = map.computeIfPresent(key, new ConcurrentHashMap.BiFun<IRubyObject, IRubyObject, IRubyObject>() { + @Override + public IRubyObject apply(IRubyObject key, IRubyObject oldValue) { + IRubyObject result = block.yieldSpecific(context, oldValue == null ? context.getRuntime().getNil() : oldValue); + return result.isNil() ? null : result; + } + }); + return result == null ? context.getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject compute(final ThreadContext context, final IRubyObject key, final Block block) { + IRubyObject result = map.compute(key, new ConcurrentHashMap.BiFun<IRubyObject, IRubyObject, IRubyObject>() { + @Override + public IRubyObject apply(IRubyObject key, IRubyObject oldValue) { + IRubyObject result = block.yieldSpecific(context, oldValue == null ? context.getRuntime().getNil() : oldValue); + return result.isNil() ? null : result; + } + }); + return result == null ? context.getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject merge_pair(final ThreadContext context, final IRubyObject key, final IRubyObject value, final Block block) { + IRubyObject result = map.merge(key, value, new ConcurrentHashMap.BiFun<IRubyObject, IRubyObject, IRubyObject>() { + @Override + public IRubyObject apply(IRubyObject oldValue, IRubyObject newValue) { + IRubyObject result = block.yieldSpecific(context, oldValue == null ? context.getRuntime().getNil() : oldValue); + return result.isNil() ? null : result; + } + }); + return result == null ? context.getRuntime().getNil() : result; + } + + @JRubyMethod + public RubyBoolean replace_pair(IRubyObject key, IRubyObject oldValue, IRubyObject newValue) { + return getRuntime().newBoolean(map.replace(key, oldValue, newValue)); + } + + @JRubyMethod(name = "key?", required = 1) + public RubyBoolean has_key_p(IRubyObject key) { + return map.containsKey(key) ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod + public IRubyObject key(IRubyObject value) { + final IRubyObject key = map.findKey(value); + return key == null ? getRuntime().getNil() : key; + } + + @JRubyMethod + public IRubyObject replace_if_exists(IRubyObject key, IRubyObject value) { + IRubyObject result = map.replace(key, value); + return result == null ? getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject get_and_set(IRubyObject key, IRubyObject value) { + IRubyObject result = map.put(key, value); + return result == null ? getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject delete(IRubyObject key) { + IRubyObject result = map.remove(key); + return result == null ? getRuntime().getNil() : result; + } + + @JRubyMethod + public RubyBoolean delete_pair(IRubyObject key, IRubyObject value) { + return getRuntime().newBoolean(map.remove(key, value)); + } + + @JRubyMethod + public IRubyObject clear() { + map.clear(); + return this; + } + + @JRubyMethod + public IRubyObject each_pair(ThreadContext context, Block block) { + for (Map.Entry<IRubyObject,IRubyObject> entry : map.entrySet()) { + block.yieldSpecific(context, entry.getKey(), entry.getValue()); + } + return this; + } + + @JRubyMethod + public RubyFixnum size(ThreadContext context) { + return context.getRuntime().newFixnum(map.size()); + } + + @JRubyMethod + public IRubyObject get_or_default(IRubyObject key, IRubyObject defaultValue) { + return map.getValueOrDefault(key, defaultValue); + } + + @JRubyMethod(visibility = PRIVATE) + public JRubyMapBackend initialize_copy(ThreadContext context, IRubyObject other) { + map = newCHM(); + return this; + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicBooleanLibrary.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicBooleanLibrary.java new file mode 100644 index 000000000000..b56607626cf8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicBooleanLibrary.java @@ -0,0 +1,93 @@ +package com.concurrent_ruby.ext; + +import org.jruby.Ruby; +import org.jruby.RubyBoolean; +import org.jruby.RubyClass; +import org.jruby.RubyModule; +import org.jruby.RubyNil; +import org.jruby.RubyObject; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.Library; + +import java.io.IOException; +import java.util.concurrent.atomic.AtomicBoolean; + +public class JavaAtomicBooleanLibrary implements Library { + + public void load(Ruby runtime, boolean wrap) throws IOException { + RubyModule concurrentMod = runtime.defineModule("Concurrent"); + RubyClass atomicCls = concurrentMod.defineClassUnder("JavaAtomicBoolean", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR); + atomicCls.defineAnnotatedMethods(JavaAtomicBoolean.class); + } + + private static final ObjectAllocator JRUBYREFERENCE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JavaAtomicBoolean(runtime, klazz); + } + }; + + @JRubyClass(name = "JavaAtomicBoolean", parent = "Object") + public static class JavaAtomicBoolean extends RubyObject { + + private AtomicBoolean atomicBoolean; + + public JavaAtomicBoolean(Ruby runtime, RubyClass metaClass) { + super(runtime, metaClass); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject value) { + atomicBoolean = new AtomicBoolean(convertRubyBooleanToJavaBoolean(value)); + return context.nil; + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context) { + atomicBoolean = new AtomicBoolean(); + return context.nil; + } + + @JRubyMethod(name = "value") + public IRubyObject value() { + return getRuntime().newBoolean(atomicBoolean.get()); + } + + @JRubyMethod(name = "true?") + public IRubyObject isAtomicTrue() { + return getRuntime().newBoolean(atomicBoolean.get()); + } + + @JRubyMethod(name = "false?") + public IRubyObject isAtomicFalse() { + return getRuntime().newBoolean((atomicBoolean.get() == false)); + } + + @JRubyMethod(name = "value=") + public IRubyObject setAtomic(ThreadContext context, IRubyObject newValue) { + atomicBoolean.set(convertRubyBooleanToJavaBoolean(newValue)); + return context.nil; + } + + @JRubyMethod(name = "make_true") + public IRubyObject makeTrue() { + return getRuntime().newBoolean(atomicBoolean.compareAndSet(false, true)); + } + + @JRubyMethod(name = "make_false") + public IRubyObject makeFalse() { + return getRuntime().newBoolean(atomicBoolean.compareAndSet(true, false)); + } + + private boolean convertRubyBooleanToJavaBoolean(IRubyObject newValue) { + if (newValue instanceof RubyBoolean.False || newValue instanceof RubyNil) { + return false; + } else { + return true; + } + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicFixnumLibrary.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicFixnumLibrary.java new file mode 100644 index 000000000000..672bfc048bb0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaAtomicFixnumLibrary.java @@ -0,0 +1,113 @@ +package com.concurrent_ruby.ext; + +import java.io.IOException; +import java.util.concurrent.atomic.AtomicLong; +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyFixnum; +import org.jruby.RubyModule; +import org.jruby.RubyObject; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.Library; +import org.jruby.runtime.Block; + +public class JavaAtomicFixnumLibrary implements Library { + + public void load(Ruby runtime, boolean wrap) throws IOException { + RubyModule concurrentMod = runtime.defineModule("Concurrent"); + RubyClass atomicCls = concurrentMod.defineClassUnder("JavaAtomicFixnum", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR); + + atomicCls.defineAnnotatedMethods(JavaAtomicFixnum.class); + } + + private static final ObjectAllocator JRUBYREFERENCE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JavaAtomicFixnum(runtime, klazz); + } + }; + + @JRubyClass(name = "JavaAtomicFixnum", parent = "Object") + public static class JavaAtomicFixnum extends RubyObject { + + private AtomicLong atomicLong; + + public JavaAtomicFixnum(Ruby runtime, RubyClass metaClass) { + super(runtime, metaClass); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context) { + this.atomicLong = new AtomicLong(0); + return context.nil; + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject value) { + this.atomicLong = new AtomicLong(rubyFixnumToLong(value)); + return context.nil; + } + + @JRubyMethod(name = "value") + public IRubyObject getValue() { + return getRuntime().newFixnum(atomicLong.get()); + } + + @JRubyMethod(name = "value=") + public IRubyObject setValue(ThreadContext context, IRubyObject newValue) { + atomicLong.set(rubyFixnumToLong(newValue)); + return context.nil; + } + + @JRubyMethod(name = {"increment", "up"}) + public IRubyObject increment() { + return getRuntime().newFixnum(atomicLong.incrementAndGet()); + } + + @JRubyMethod(name = {"increment", "up"}) + public IRubyObject increment(IRubyObject value) { + long delta = rubyFixnumToLong(value); + return getRuntime().newFixnum(atomicLong.addAndGet(delta)); + } + + @JRubyMethod(name = {"decrement", "down"}) + public IRubyObject decrement() { + return getRuntime().newFixnum(atomicLong.decrementAndGet()); + } + + @JRubyMethod(name = {"decrement", "down"}) + public IRubyObject decrement(IRubyObject value) { + long delta = rubyFixnumToLong(value); + return getRuntime().newFixnum(atomicLong.addAndGet(-delta)); + } + + @JRubyMethod(name = "compare_and_set") + public IRubyObject compareAndSet(ThreadContext context, IRubyObject expect, IRubyObject update) { + return getRuntime().newBoolean(atomicLong.compareAndSet(rubyFixnumToLong(expect), rubyFixnumToLong(update))); + } + + @JRubyMethod + public IRubyObject update(ThreadContext context, Block block) { + for (;;) { + long _oldValue = atomicLong.get(); + IRubyObject oldValue = getRuntime().newFixnum(_oldValue); + IRubyObject newValue = block.yield(context, oldValue); + if (atomicLong.compareAndSet(_oldValue, rubyFixnumToLong(newValue))) { + return newValue; + } + } + } + + private long rubyFixnumToLong(IRubyObject value) { + if (value instanceof RubyFixnum) { + RubyFixnum fixNum = (RubyFixnum) value; + return fixNum.getLongValue(); + } else { + throw getRuntime().newArgumentError("value must be a Fixnum"); + } + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java new file mode 100644 index 000000000000..a3e847db26ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/JavaSemaphoreLibrary.java @@ -0,0 +1,159 @@ +package com.concurrent_ruby.ext; + +import java.io.IOException; +import java.util.concurrent.Semaphore; +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyFixnum; +import org.jruby.RubyModule; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +public class JavaSemaphoreLibrary { + + public void load(Ruby runtime, boolean wrap) throws IOException { + RubyModule concurrentMod = runtime.defineModule("Concurrent"); + RubyClass atomicCls = concurrentMod.defineClassUnder("JavaSemaphore", runtime.getObject(), JRUBYREFERENCE_ALLOCATOR); + + atomicCls.defineAnnotatedMethods(JavaSemaphore.class); + } + + private static final ObjectAllocator JRUBYREFERENCE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JavaSemaphore(runtime, klazz); + } + }; + + @JRubyClass(name = "JavaSemaphore", parent = "Object") + public static class JavaSemaphore extends RubyObject { + + private JRubySemaphore semaphore; + + public JavaSemaphore(Ruby runtime, RubyClass metaClass) { + super(runtime, metaClass); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject value) { + this.semaphore = new JRubySemaphore(rubyFixnumInt(value, "count")); + return context.nil; + } + + @JRubyMethod + public IRubyObject acquire(ThreadContext context, IRubyObject value) throws InterruptedException { + this.semaphore.acquire(rubyFixnumToPositiveInt(value, "permits")); + return context.nil; + } + + @JRubyMethod(name = "available_permits") + public IRubyObject availablePermits(ThreadContext context) { + return getRuntime().newFixnum(this.semaphore.availablePermits()); + } + + @JRubyMethod(name = "drain_permits") + public IRubyObject drainPermits(ThreadContext context) { + return getRuntime().newFixnum(this.semaphore.drainPermits()); + } + + @JRubyMethod + public IRubyObject acquire(ThreadContext context) throws InterruptedException { + this.semaphore.acquire(1); + return context.nil; + } + + @JRubyMethod(name = "try_acquire") + public IRubyObject tryAcquire(ThreadContext context) throws InterruptedException { + return getRuntime().newBoolean(semaphore.tryAcquire(1)); + } + + @JRubyMethod(name = "try_acquire") + public IRubyObject tryAcquire(ThreadContext context, IRubyObject permits) throws InterruptedException { + return getRuntime().newBoolean(semaphore.tryAcquire(rubyFixnumToPositiveInt(permits, "permits"))); + } + + @JRubyMethod(name = "try_acquire") + public IRubyObject tryAcquire(ThreadContext context, IRubyObject permits, IRubyObject timeout) throws InterruptedException { + return getRuntime().newBoolean( + semaphore.tryAcquire( + rubyFixnumToPositiveInt(permits, "permits"), + rubyNumericToLong(timeout, "timeout"), + java.util.concurrent.TimeUnit.SECONDS) + ); + } + + @JRubyMethod + public IRubyObject release(ThreadContext context) { + this.semaphore.release(1); + return getRuntime().newBoolean(true); + } + + @JRubyMethod + public IRubyObject release(ThreadContext context, IRubyObject value) { + this.semaphore.release(rubyFixnumToPositiveInt(value, "permits")); + return getRuntime().newBoolean(true); + } + + @JRubyMethod(name = "reduce_permits") + public IRubyObject reducePermits(ThreadContext context, IRubyObject reduction) throws InterruptedException { + this.semaphore.publicReducePermits(rubyFixnumToNonNegativeInt(reduction, "reduction")); + return context.nil; + } + + private int rubyFixnumInt(IRubyObject value, String paramName) { + if (value instanceof RubyFixnum) { + RubyFixnum fixNum = (RubyFixnum) value; + return (int) fixNum.getLongValue(); + } else { + throw getRuntime().newArgumentError(paramName + " must be integer"); + } + } + + private int rubyFixnumToNonNegativeInt(IRubyObject value, String paramName) { + if (value instanceof RubyFixnum && ((RubyFixnum) value).getLongValue() >= 0) { + RubyFixnum fixNum = (RubyFixnum) value; + return (int) fixNum.getLongValue(); + } else { + throw getRuntime().newArgumentError(paramName + " must be a non-negative integer"); + } + } + + private int rubyFixnumToPositiveInt(IRubyObject value, String paramName) { + if (value instanceof RubyFixnum && ((RubyFixnum) value).getLongValue() > 0) { + RubyFixnum fixNum = (RubyFixnum) value; + return (int) fixNum.getLongValue(); + } else { + throw getRuntime().newArgumentError(paramName + " must be an integer greater than zero"); + } + } + + private long rubyNumericToLong(IRubyObject value, String paramName) { + if (value instanceof RubyNumeric && ((RubyNumeric) value).getDoubleValue() > 0) { + RubyNumeric fixNum = (RubyNumeric) value; + return fixNum.getLongValue(); + } else { + throw getRuntime().newArgumentError(paramName + " must be a float greater than zero"); + } + } + + class JRubySemaphore extends Semaphore { + + public JRubySemaphore(int permits) { + super(permits); + } + + public JRubySemaphore(int permits, boolean value) { + super(permits, value); + } + + public void publicReducePermits(int i) { + reducePermits(i); + } + + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java new file mode 100644 index 000000000000..bfcc0d078102 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java @@ -0,0 +1,307 @@ +package com.concurrent_ruby.ext; + +import org.jruby.Ruby; +import org.jruby.RubyBasicObject; +import org.jruby.RubyClass; +import org.jruby.RubyModule; +import org.jruby.RubyObject; +import org.jruby.RubyThread; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.Library; +import sun.misc.Unsafe; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class SynchronizationLibrary implements Library { + + private static final Unsafe UNSAFE = loadUnsafe(); + private static final boolean FULL_FENCE = supportsFences(); + + private static Unsafe loadUnsafe() { + try { + Class ncdfe = Class.forName("sun.misc.Unsafe"); + Field f = ncdfe.getDeclaredField("theUnsafe"); + f.setAccessible(true); + return (Unsafe) f.get((java.lang.Object) null); + } catch (Exception var2) { + return null; + } catch (NoClassDefFoundError var3) { + return null; + } + } + + private static boolean supportsFences() { + if (UNSAFE == null) { + return false; + } else { + try { + Method m = UNSAFE.getClass().getDeclaredMethod("fullFence", new Class[0]); + if (m != null) { + return true; + } + } catch (Exception var1) { + // nothing + } + + return false; + } + } + + private static final ObjectAllocator JRUBY_OBJECT_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JRubyObject(runtime, klazz); + } + }; + + private static final ObjectAllocator OBJECT_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new Object(runtime, klazz); + } + }; + + private static final ObjectAllocator ABSTRACT_LOCKABLE_OBJECT_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new AbstractLockableObject(runtime, klazz); + } + }; + + private static final ObjectAllocator JRUBY_LOCKABLE_OBJECT_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JRubyLockableObject(runtime, klazz); + } + }; + + public void load(Ruby runtime, boolean wrap) throws IOException { + RubyModule synchronizationModule = runtime. + defineModule("Concurrent"). + defineModuleUnder("Synchronization"); + + RubyModule jrubyAttrVolatileModule = synchronizationModule.defineModuleUnder("JRubyAttrVolatile"); + jrubyAttrVolatileModule.defineAnnotatedMethods(JRubyAttrVolatile.class); + + defineClass(runtime, synchronizationModule, "AbstractObject", "JRubyObject", + JRubyObject.class, JRUBY_OBJECT_ALLOCATOR); + + defineClass(runtime, synchronizationModule, "JRubyObject", "Object", + Object.class, OBJECT_ALLOCATOR); + + defineClass(runtime, synchronizationModule, "Object", "AbstractLockableObject", + AbstractLockableObject.class, ABSTRACT_LOCKABLE_OBJECT_ALLOCATOR); + + defineClass(runtime, synchronizationModule, "AbstractLockableObject", "JRubyLockableObject", + JRubyLockableObject.class, JRUBY_LOCKABLE_OBJECT_ALLOCATOR); + + defineClass(runtime, synchronizationModule, "Object", "JRuby", + JRuby.class, new ObjectAllocator() { + @Override + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JRuby(runtime, klazz); + } + }); + } + + private RubyClass defineClass( + Ruby runtime, + RubyModule namespace, + String parentName, + String name, + Class javaImplementation, + ObjectAllocator allocator) { + final RubyClass parentClass = namespace.getClass(parentName); + + if (parentClass == null) { + System.out.println("not found " + parentName); + throw runtime.newRuntimeError(namespace.toString() + "::" + parentName + " is missing"); + } + + final RubyClass newClass = namespace.defineClassUnder(name, parentClass, allocator); + newClass.defineAnnotatedMethods(javaImplementation); + return newClass; + } + + // Facts: + // - all ivar reads are without any synchronisation of fences see + // https://github.com/jruby/jruby/blob/master/core/src/main/java/org/jruby/runtime/ivars/VariableAccessor.java#L110-110 + // - writes depend on UnsafeHolder.U, null -> SynchronizedVariableAccessor, !null -> StampedVariableAccessor + // SynchronizedVariableAccessor wraps with synchronized block, StampedVariableAccessor uses fullFence or + // volatilePut + // TODO (pitr 16-Sep-2015): what do we do in Java 9 ? + + // module JRubyAttrVolatile + public static class JRubyAttrVolatile { + + // volatile threadContext is used as a memory barrier per the JVM memory model happens-before semantic + // on volatile fields. any volatile field could have been used but using the thread context is an + // attempt to avoid code elimination. + private static volatile int volatileField; + + @JRubyMethod(name = "full_memory_barrier", visibility = Visibility.PUBLIC) + public static IRubyObject fullMemoryBarrier(ThreadContext context, IRubyObject self) { + // Prevent reordering of ivar writes with publication of this instance + if (!FULL_FENCE) { + // Assuming that following volatile read and write is not eliminated it simulates fullFence. + // If it's eliminated it'll cause problems only on non-x86 platforms. + // http://shipilev.net/blog/2014/jmm-pragmatics/#_happens_before_test_your_understanding + final int volatileRead = volatileField; + volatileField = context.getLine(); + } else { + UNSAFE.fullFence(); + } + return context.nil; + } + + @JRubyMethod(name = "instance_variable_get_volatile", visibility = Visibility.PUBLIC) + public static IRubyObject instanceVariableGetVolatile( + ThreadContext context, + IRubyObject self, + IRubyObject name) { + // Ensure we ses latest value with loadFence + if (!FULL_FENCE) { + // piggybacking on volatile read, simulating loadFence + final int volatileRead = volatileField; + return ((RubyBasicObject) self).instance_variable_get(context, name); + } else { + UNSAFE.loadFence(); + return ((RubyBasicObject) self).instance_variable_get(context, name); + } + } + + @JRubyMethod(name = "instance_variable_set_volatile", visibility = Visibility.PUBLIC) + public static IRubyObject InstanceVariableSetVolatile( + ThreadContext context, + IRubyObject self, + IRubyObject name, + IRubyObject value) { + // Ensure we make last update visible + if (!FULL_FENCE) { + // piggybacking on volatile write, simulating storeFence + final IRubyObject result = ((RubyBasicObject) self).instance_variable_set(name, value); + volatileField = context.getLine(); + return result; + } else { + // JRuby uses StampedVariableAccessor which calls fullFence + // so no additional steps needed. + // See https://github.com/jruby/jruby/blob/master/core/src/main/java/org/jruby/runtime/ivars/StampedVariableAccessor.java#L151-L159 + return ((RubyBasicObject) self).instance_variable_set(name, value); + } + } + } + + @JRubyClass(name = "JRubyObject", parent = "AbstractObject") + public static class JRubyObject extends RubyObject { + + public JRubyObject(Ruby runtime, RubyClass metaClass) { + super(runtime, metaClass); + } + } + + @JRubyClass(name = "Object", parent = "JRubyObject") + public static class Object extends JRubyObject { + + public Object(Ruby runtime, RubyClass metaClass) { + super(runtime, metaClass); + } + } + + @JRubyClass(name = "AbstractLockableObject", parent = "Object") + public static class AbstractLockableObject extends Object { + + public AbstractLockableObject(Ruby runtime, RubyClass metaClass) { + super(runtime, metaClass); + } + } + + @JRubyClass(name = "JRubyLockableObject", parent = "AbstractLockableObject") + public static class JRubyLockableObject extends JRubyObject { + + public JRubyLockableObject(Ruby runtime, RubyClass metaClass) { + super(runtime, metaClass); + } + + @JRubyMethod(name = "synchronize", visibility = Visibility.PROTECTED) + public IRubyObject rubySynchronize(ThreadContext context, Block block) { + synchronized (this) { + return block.yield(context, null); + } + } + + @JRubyMethod(name = "ns_wait", optional = 1, visibility = Visibility.PROTECTED) + public IRubyObject nsWait(ThreadContext context, IRubyObject[] args) { + Ruby runtime = context.runtime; + if (args.length > 1) { + throw runtime.newArgumentError(args.length, 1); + } + Double timeout = null; + if (args.length > 0 && !args[0].isNil()) { + timeout = args[0].convertToFloat().getDoubleValue(); + if (timeout < 0) { + throw runtime.newArgumentError("time interval must be positive"); + } + } + if (Thread.interrupted()) { + throw runtime.newConcurrencyError("thread interrupted"); + } + boolean success = false; + try { + success = context.getThread().wait_timeout(this, timeout); + } catch (InterruptedException ie) { + throw runtime.newConcurrencyError(ie.getLocalizedMessage()); + } finally { + // An interrupt or timeout may have caused us to miss + // a notify that we consumed, so do another notify in + // case someone else is available to pick it up. + if (!success) { + this.notify(); + } + } + return this; + } + + @JRubyMethod(name = "ns_signal", visibility = Visibility.PROTECTED) + public IRubyObject nsSignal(ThreadContext context) { + notify(); + return this; + } + + @JRubyMethod(name = "ns_broadcast", visibility = Visibility.PROTECTED) + public IRubyObject nsBroadcast(ThreadContext context) { + notifyAll(); + return this; + } + } + + @JRubyClass(name = "JRuby") + public static class JRuby extends RubyObject { + public JRuby(Ruby runtime, RubyClass metaClass) { + super(runtime, metaClass); + } + + @JRubyMethod(name = "sleep_interruptibly", visibility = Visibility.PUBLIC, module = true) + public static IRubyObject sleepInterruptibly(final ThreadContext context, IRubyObject receiver, final Block block) { + try { + context.getThread().executeBlockingTask(new RubyThread.BlockingTask() { + @Override + public void run() throws InterruptedException { + block.call(context); + } + + @Override + public void wakeup() { + context.getThread().getNativeThread().interrupt(); + } + }); + } catch (InterruptedException e) { + throw context.runtime.newThreadError("interrupted in Concurrent::Synchronization::JRuby.sleep_interruptibly"); + } + return context.nil; + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMap.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMap.java new file mode 100644 index 000000000000..e11e15aa4e6b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMap.java @@ -0,0 +1,31 @@ +package com.concurrent_ruby.ext.jsr166e; + +import java.util.Map; +import java.util.Set; + +public interface ConcurrentHashMap<K, V> { + /** Interface describing a function of one argument */ + public interface Fun<A,T> { T apply(A a); } + /** Interface describing a function of two arguments */ + public interface BiFun<A,B,T> { T apply(A a, B b); } + + public V get(K key); + public V put(K key, V value); + public V putIfAbsent(K key, V value); + public V computeIfAbsent(K key, Fun<? super K, ? extends V> mf); + public V computeIfPresent(K key, BiFun<? super K, ? super V, ? extends V> mf); + public V compute(K key, BiFun<? super K, ? super V, ? extends V> mf); + public V merge(K key, V value, BiFun<? super V, ? super V, ? extends V> mf); + public boolean replace(K key, V oldVal, V newVal); + public V replace(K key, V value); + public boolean containsKey(K key); + public boolean remove(Object key, Object value); + public V remove(K key); + public void clear(); + public Set<Map.Entry<K,V>> entrySet(); + public int size(); + public V getValueOrDefault(Object key, V defaultValue); + + public boolean containsValue(V value); + public K findKey(V value); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMapV8.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMapV8.java new file mode 100644 index 000000000000..86aa4eb062b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/ConcurrentHashMapV8.java @@ -0,0 +1,3863 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on the 1.79 version. + +package com.concurrent_ruby.ext.jsr166e; + +import org.jruby.RubyClass; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.exceptions.RaiseException; +import com.concurrent_ruby.ext.jsr166y.ThreadLocalRandom; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import java.util.Arrays; +import java.util.Map; +import java.util.Set; +import java.util.Collection; +import java.util.Hashtable; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Enumeration; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.locks.AbstractQueuedSynchronizer; + +import java.io.Serializable; + +/** + * A hash table supporting full concurrency of retrievals and + * high expected concurrency for updates. This class obeys the + * same functional specification as {@link java.util.Hashtable}, and + * includes versions of methods corresponding to each method of + * {@code Hashtable}. However, even though all operations are + * thread-safe, retrieval operations do <em>not</em> entail locking, + * and there is <em>not</em> any support for locking the entire table + * in a way that prevents all access. This class is fully + * interoperable with {@code Hashtable} in programs that rely on its + * thread safety but not on its synchronization details. + * + * <p>Retrieval operations (including {@code get}) generally do not + * block, so may overlap with update operations (including {@code put} + * and {@code remove}). Retrievals reflect the results of the most + * recently <em>completed</em> update operations holding upon their + * onset. (More formally, an update operation for a given key bears a + * <em>happens-before</em> relation with any (non-null) retrieval for + * that key reporting the updated value.) For aggregate operations + * such as {@code putAll} and {@code clear}, concurrent retrievals may + * reflect insertion or removal of only some entries. Similarly, + * Iterators and Enumerations return elements reflecting the state of + * the hash table at some point at or since the creation of the + * iterator/enumeration. They do <em>not</em> throw {@link + * ConcurrentModificationException}. However, iterators are designed + * to be used by only one thread at a time. Bear in mind that the + * results of aggregate status methods including {@code size}, {@code + * isEmpty}, and {@code containsValue} are typically useful only when + * a map is not undergoing concurrent updates in other threads. + * Otherwise the results of these methods reflect transient states + * that may be adequate for monitoring or estimation purposes, but not + * for program control. + * + * <p>The table is dynamically expanded when there are too many + * collisions (i.e., keys that have distinct hash codes but fall into + * the same slot modulo the table size), with the expected average + * effect of maintaining roughly two bins per mapping (corresponding + * to a 0.75 load factor threshold for resizing). There may be much + * variance around this average as mappings are added and removed, but + * overall, this maintains a commonly accepted time/space tradeoff for + * hash tables. However, resizing this or any other kind of hash + * table may be a relatively slow operation. When possible, it is a + * good idea to provide a size estimate as an optional {@code + * initialCapacity} constructor argument. An additional optional + * {@code loadFactor} constructor argument provides a further means of + * customizing initial table capacity by specifying the table density + * to be used in calculating the amount of space to allocate for the + * given number of elements. Also, for compatibility with previous + * versions of this class, constructors may optionally specify an + * expected {@code concurrencyLevel} as an additional hint for + * internal sizing. Note that using many keys with exactly the same + * {@code hashCode()} is a sure way to slow down performance of any + * hash table. + * + * <p>A {@link Set} projection of a ConcurrentHashMapV8 may be created + * (using {@link #newKeySet()} or {@link #newKeySet(int)}), or viewed + * (using {@link #keySet(Object)} when only keys are of interest, and the + * mapped values are (perhaps transiently) not used or all take the + * same mapping value. + * + * <p>A ConcurrentHashMapV8 can be used as scalable frequency map (a + * form of histogram or multiset) by using {@link LongAdder} values + * and initializing via {@link #computeIfAbsent}. For example, to add + * a count to a {@code ConcurrentHashMapV8<String,LongAdder> freqs}, you + * can use {@code freqs.computeIfAbsent(k -> new + * LongAdder()).increment();} + * + * <p>This class and its views and iterators implement all of the + * <em>optional</em> methods of the {@link Map} and {@link Iterator} + * interfaces. + * + * <p>Like {@link Hashtable} but unlike {@link HashMap}, this class + * does <em>not</em> allow {@code null} to be used as a key or value. + * + * <p>ConcurrentHashMapV8s support parallel operations using the {@link + * ForkJoinPool#commonPool}. (Tasks that may be used in other contexts + * are available in class {@link ForkJoinTasks}). These operations are + * designed to be safely, and often sensibly, applied even with maps + * that are being concurrently updated by other threads; for example, + * when computing a snapshot summary of the values in a shared + * registry. There are three kinds of operation, each with four + * forms, accepting functions with Keys, Values, Entries, and (Key, + * Value) arguments and/or return values. (The first three forms are + * also available via the {@link #keySet()}, {@link #values()} and + * {@link #entrySet()} views). Because the elements of a + * ConcurrentHashMapV8 are not ordered in any particular way, and may be + * processed in different orders in different parallel executions, the + * correctness of supplied functions should not depend on any + * ordering, or on any other objects or values that may transiently + * change while computation is in progress; and except for forEach + * actions, should ideally be side-effect-free. + * + * <ul> + * <li> forEach: Perform a given action on each element. + * A variant form applies a given transformation on each element + * before performing the action.</li> + * + * <li> search: Return the first available non-null result of + * applying a given function on each element; skipping further + * search when a result is found.</li> + * + * <li> reduce: Accumulate each element. The supplied reduction + * function cannot rely on ordering (more formally, it should be + * both associative and commutative). There are five variants: + * + * <ul> + * + * <li> Plain reductions. (There is not a form of this method for + * (key, value) function arguments since there is no corresponding + * return type.)</li> + * + * <li> Mapped reductions that accumulate the results of a given + * function applied to each element.</li> + * + * <li> Reductions to scalar doubles, longs, and ints, using a + * given basis value.</li> + * + * </li> + * </ul> + * </ul> + * + * <p>The concurrency properties of bulk operations follow + * from those of ConcurrentHashMapV8: Any non-null result returned + * from {@code get(key)} and related access methods bears a + * happens-before relation with the associated insertion or + * update. The result of any bulk operation reflects the + * composition of these per-element relations (but is not + * necessarily atomic with respect to the map as a whole unless it + * is somehow known to be quiescent). Conversely, because keys + * and values in the map are never null, null serves as a reliable + * atomic indicator of the current lack of any result. To + * maintain this property, null serves as an implicit basis for + * all non-scalar reduction operations. For the double, long, and + * int versions, the basis should be one that, when combined with + * any other value, returns that other value (more formally, it + * should be the identity element for the reduction). Most common + * reductions have these properties; for example, computing a sum + * with basis 0 or a minimum with basis MAX_VALUE. + * + * <p>Search and transformation functions provided as arguments + * should similarly return null to indicate the lack of any result + * (in which case it is not used). In the case of mapped + * reductions, this also enables transformations to serve as + * filters, returning null (or, in the case of primitive + * specializations, the identity basis) if the element should not + * be combined. You can create compound transformations and + * filterings by composing them yourself under this "null means + * there is nothing there now" rule before using them in search or + * reduce operations. + * + * <p>Methods accepting and/or returning Entry arguments maintain + * key-value associations. They may be useful for example when + * finding the key for the greatest value. Note that "plain" Entry + * arguments can be supplied using {@code new + * AbstractMap.SimpleEntry(k,v)}. + * + * <p>Bulk operations may complete abruptly, throwing an + * exception encountered in the application of a supplied + * function. Bear in mind when handling such exceptions that other + * concurrently executing functions could also have thrown + * exceptions, or would have done so if the first exception had + * not occurred. + * + * <p>Parallel speedups for bulk operations compared to sequential + * processing are common but not guaranteed. Operations involving + * brief functions on small maps may execute more slowly than + * sequential loops if the underlying work to parallelize the + * computation is more expensive than the computation itself. + * Similarly, parallelization may not lead to much actual parallelism + * if all processors are busy performing unrelated tasks. + * + * <p>All arguments to all task methods must be non-null. + * + * <p><em>jsr166e note: During transition, this class + * uses nested functional interfaces with different names but the + * same forms as those expected for JDK8.</em> + * + * <p>This class is a member of the + * <a href="{@docRoot}/../technotes/guides/collections/index.html"> + * Java Collections Framework</a>. + * + * @since 1.5 + * @author Doug Lea + * @param <K> the type of keys maintained by this map + * @param <V> the type of mapped values + */ +public class ConcurrentHashMapV8<K, V> + implements ConcurrentMap<K, V>, Serializable, ConcurrentHashMap<K, V> { + private static final long serialVersionUID = 7249069246763182397L; + + /** + * A partitionable iterator. A Spliterator can be traversed + * directly, but can also be partitioned (before traversal) by + * creating another Spliterator that covers a non-overlapping + * portion of the elements, and so may be amenable to parallel + * execution. + * + * <p>This interface exports a subset of expected JDK8 + * functionality. + * + * <p>Sample usage: Here is one (of the several) ways to compute + * the sum of the values held in a map using the ForkJoin + * framework. As illustrated here, Spliterators are well suited to + * designs in which a task repeatedly splits off half its work + * into forked subtasks until small enough to process directly, + * and then joins these subtasks. Variants of this style can also + * be used in completion-based designs. + * + * <pre> + * {@code ConcurrentHashMapV8<String, Long> m = ... + * // split as if have 8 * parallelism, for load balance + * int n = m.size(); + * int p = aForkJoinPool.getParallelism() * 8; + * int split = (n < p)? n : p; + * long sum = aForkJoinPool.invoke(new SumValues(m.valueSpliterator(), split, null)); + * // ... + * static class SumValues extends RecursiveTask<Long> { + * final Spliterator<Long> s; + * final int split; // split while > 1 + * final SumValues nextJoin; // records forked subtasks to join + * SumValues(Spliterator<Long> s, int depth, SumValues nextJoin) { + * this.s = s; this.depth = depth; this.nextJoin = nextJoin; + * } + * public Long compute() { + * long sum = 0; + * SumValues subtasks = null; // fork subtasks + * for (int s = split >>> 1; s > 0; s >>>= 1) + * (subtasks = new SumValues(s.split(), s, subtasks)).fork(); + * while (s.hasNext()) // directly process remaining elements + * sum += s.next(); + * for (SumValues t = subtasks; t != null; t = t.nextJoin) + * sum += t.join(); // collect subtask results + * return sum; + * } + * } + * }</pre> + */ + public static interface Spliterator<T> extends Iterator<T> { + /** + * Returns a Spliterator covering approximately half of the + * elements, guaranteed not to overlap with those subsequently + * returned by this Spliterator. After invoking this method, + * the current Spliterator will <em>not</em> produce any of + * the elements of the returned Spliterator, but the two + * Spliterators together will produce all of the elements that + * would have been produced by this Spliterator had this + * method not been called. The exact number of elements + * produced by the returned Spliterator is not guaranteed, and + * may be zero (i.e., with {@code hasNext()} reporting {@code + * false}) if this Spliterator cannot be further split. + * + * @return a Spliterator covering approximately half of the + * elements + * @throws IllegalStateException if this Spliterator has + * already commenced traversing elements + */ + Spliterator<T> split(); + } + + + /* + * Overview: + * + * The primary design goal of this hash table is to maintain + * concurrent readability (typically method get(), but also + * iterators and related methods) while minimizing update + * contention. Secondary goals are to keep space consumption about + * the same or better than java.util.HashMap, and to support high + * initial insertion rates on an empty table by many threads. + * + * Each key-value mapping is held in a Node. Because Node fields + * can contain special values, they are defined using plain Object + * types. Similarly in turn, all internal methods that use them + * work off Object types. And similarly, so do the internal + * methods of auxiliary iterator and view classes. All public + * generic typed methods relay in/out of these internal methods, + * supplying null-checks and casts as needed. This also allows + * many of the public methods to be factored into a smaller number + * of internal methods (although sadly not so for the five + * variants of put-related operations). The validation-based + * approach explained below leads to a lot of code sprawl because + * retry-control precludes factoring into smaller methods. + * + * The table is lazily initialized to a power-of-two size upon the + * first insertion. Each bin in the table normally contains a + * list of Nodes (most often, the list has only zero or one Node). + * Table accesses require volatile/atomic reads, writes, and + * CASes. Because there is no other way to arrange this without + * adding further indirections, we use intrinsics + * (sun.misc.Unsafe) operations. The lists of nodes within bins + * are always accurately traversable under volatile reads, so long + * as lookups check hash code and non-nullness of value before + * checking key equality. + * + * We use the top two bits of Node hash fields for control + * purposes -- they are available anyway because of addressing + * constraints. As explained further below, these top bits are + * used as follows: + * 00 - Normal + * 01 - Locked + * 11 - Locked and may have a thread waiting for lock + * 10 - Node is a forwarding node + * + * The lower 30 bits of each Node's hash field contain a + * transformation of the key's hash code, except for forwarding + * nodes, for which the lower bits are zero (and so always have + * hash field == MOVED). + * + * Insertion (via put or its variants) of the first node in an + * empty bin is performed by just CASing it to the bin. This is + * by far the most common case for put operations under most + * key/hash distributions. Other update operations (insert, + * delete, and replace) require locks. We do not want to waste + * the space required to associate a distinct lock object with + * each bin, so instead use the first node of a bin list itself as + * a lock. Blocking support for these locks relies on the builtin + * "synchronized" monitors. However, we also need a tryLock + * construction, so we overlay these by using bits of the Node + * hash field for lock control (see above), and so normally use + * builtin monitors only for blocking and signalling using + * wait/notifyAll constructions. See Node.tryAwaitLock. + * + * Using the first node of a list as a lock does not by itself + * suffice though: When a node is locked, any update must first + * validate that it is still the first node after locking it, and + * retry if not. Because new nodes are always appended to lists, + * once a node is first in a bin, it remains first until deleted + * or the bin becomes invalidated (upon resizing). However, + * operations that only conditionally update may inspect nodes + * until the point of update. This is a converse of sorts to the + * lazy locking technique described by Herlihy & Shavit. + * + * The main disadvantage of per-bin locks is that other update + * operations on other nodes in a bin list protected by the same + * lock can stall, for example when user equals() or mapping + * functions take a long time. However, statistically, under + * random hash codes, this is not a common problem. Ideally, the + * frequency of nodes in bins follows a Poisson distribution + * (http://en.wikipedia.org/wiki/Poisson_distribution) with a + * parameter of about 0.5 on average, given the resizing threshold + * of 0.75, although with a large variance because of resizing + * granularity. Ignoring variance, the expected occurrences of + * list size k are (exp(-0.5) * pow(0.5, k) / factorial(k)). The + * first values are: + * + * 0: 0.60653066 + * 1: 0.30326533 + * 2: 0.07581633 + * 3: 0.01263606 + * 4: 0.00157952 + * 5: 0.00015795 + * 6: 0.00001316 + * 7: 0.00000094 + * 8: 0.00000006 + * more: less than 1 in ten million + * + * Lock contention probability for two threads accessing distinct + * elements is roughly 1 / (8 * #elements) under random hashes. + * + * Actual hash code distributions encountered in practice + * sometimes deviate significantly from uniform randomness. This + * includes the case when N > (1<<30), so some keys MUST collide. + * Similarly for dumb or hostile usages in which multiple keys are + * designed to have identical hash codes. Also, although we guard + * against the worst effects of this (see method spread), sets of + * hashes may differ only in bits that do not impact their bin + * index for a given power-of-two mask. So we use a secondary + * strategy that applies when the number of nodes in a bin exceeds + * a threshold, and at least one of the keys implements + * Comparable. These TreeBins use a balanced tree to hold nodes + * (a specialized form of red-black trees), bounding search time + * to O(log N). Each search step in a TreeBin is around twice as + * slow as in a regular list, but given that N cannot exceed + * (1<<64) (before running out of addresses) this bounds search + * steps, lock hold times, etc, to reasonable constants (roughly + * 100 nodes inspected per operation worst case) so long as keys + * are Comparable (which is very common -- String, Long, etc). + * TreeBin nodes (TreeNodes) also maintain the same "next" + * traversal pointers as regular nodes, so can be traversed in + * iterators in the same way. + * + * The table is resized when occupancy exceeds a percentage + * threshold (nominally, 0.75, but see below). Only a single + * thread performs the resize (using field "sizeCtl", to arrange + * exclusion), but the table otherwise remains usable for reads + * and updates. Resizing proceeds by transferring bins, one by + * one, from the table to the next table. Because we are using + * power-of-two expansion, the elements from each bin must either + * stay at same index, or move with a power of two offset. We + * eliminate unnecessary node creation by catching cases where old + * nodes can be reused because their next fields won't change. On + * average, only about one-sixth of them need cloning when a table + * doubles. The nodes they replace will be garbage collectable as + * soon as they are no longer referenced by any reader thread that + * may be in the midst of concurrently traversing table. Upon + * transfer, the old table bin contains only a special forwarding + * node (with hash field "MOVED") that contains the next table as + * its key. On encountering a forwarding node, access and update + * operations restart, using the new table. + * + * Each bin transfer requires its bin lock. However, unlike other + * cases, a transfer can skip a bin if it fails to acquire its + * lock, and revisit it later (unless it is a TreeBin). Method + * rebuild maintains a buffer of TRANSFER_BUFFER_SIZE bins that + * have been skipped because of failure to acquire a lock, and + * blocks only if none are available (i.e., only very rarely). + * The transfer operation must also ensure that all accessible + * bins in both the old and new table are usable by any traversal. + * When there are no lock acquisition failures, this is arranged + * simply by proceeding from the last bin (table.length - 1) up + * towards the first. Upon seeing a forwarding node, traversals + * (see class Iter) arrange to move to the new table + * without revisiting nodes. However, when any node is skipped + * during a transfer, all earlier table bins may have become + * visible, so are initialized with a reverse-forwarding node back + * to the old table until the new ones are established. (This + * sometimes requires transiently locking a forwarding node, which + * is possible under the above encoding.) These more expensive + * mechanics trigger only when necessary. + * + * The traversal scheme also applies to partial traversals of + * ranges of bins (via an alternate Traverser constructor) + * to support partitioned aggregate operations. Also, read-only + * operations give up if ever forwarded to a null table, which + * provides support for shutdown-style clearing, which is also not + * currently implemented. + * + * Lazy table initialization minimizes footprint until first use, + * and also avoids resizings when the first operation is from a + * putAll, constructor with map argument, or deserialization. + * These cases attempt to override the initial capacity settings, + * but harmlessly fail to take effect in cases of races. + * + * The element count is maintained using a LongAdder, which avoids + * contention on updates but can encounter cache thrashing if read + * too frequently during concurrent access. To avoid reading so + * often, resizing is attempted either when a bin lock is + * contended, or upon adding to a bin already holding two or more + * nodes (checked before adding in the xIfAbsent methods, after + * adding in others). Under uniform hash distributions, the + * probability of this occurring at threshold is around 13%, + * meaning that only about 1 in 8 puts check threshold (and after + * resizing, many fewer do so). But this approximation has high + * variance for small table sizes, so we check on any collision + * for sizes <= 64. The bulk putAll operation further reduces + * contention by only committing count updates upon these size + * checks. + * + * Maintaining API and serialization compatibility with previous + * versions of this class introduces several oddities. Mainly: We + * leave untouched but unused constructor arguments refering to + * concurrencyLevel. We accept a loadFactor constructor argument, + * but apply it only to initial table capacity (which is the only + * time that we can guarantee to honor it.) We also declare an + * unused "Segment" class that is instantiated in minimal form + * only when serializing. + */ + + /* ---------------- Constants -------------- */ + + /** + * The largest possible table capacity. This value must be + * exactly 1<<30 to stay within Java array allocation and indexing + * bounds for power of two table sizes, and is further required + * because the top two bits of 32bit hash fields are used for + * control purposes. + */ + private static final int MAXIMUM_CAPACITY = 1 << 30; + + /** + * The default initial table capacity. Must be a power of 2 + * (i.e., at least 1) and at most MAXIMUM_CAPACITY. + */ + private static final int DEFAULT_CAPACITY = 16; + + /** + * The largest possible (non-power of two) array size. + * Needed by toArray and related methods. + */ + static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + /** + * The default concurrency level for this table. Unused but + * defined for compatibility with previous versions of this class. + */ + private static final int DEFAULT_CONCURRENCY_LEVEL = 16; + + /** + * The load factor for this table. Overrides of this value in + * constructors affect only the initial table capacity. The + * actual floating point value isn't normally used -- it is + * simpler to use expressions such as {@code n - (n >>> 2)} for + * the associated resizing threshold. + */ + private static final float LOAD_FACTOR = 0.75f; + + /** + * The buffer size for skipped bins during transfers. The + * value is arbitrary but should be large enough to avoid + * most locking stalls during resizes. + */ + private static final int TRANSFER_BUFFER_SIZE = 32; + + /** + * The bin count threshold for using a tree rather than list for a + * bin. The value reflects the approximate break-even point for + * using tree-based operations. + * Note that Doug's version defaults to 8, but when dealing with + * Ruby objects it is actually beneficial to avoid TreeNodes + * as long as possible as it usually means going into Ruby land. + */ + private static final int TREE_THRESHOLD = 16; + + /* + * Encodings for special uses of Node hash fields. See above for + * explanation. + */ + static final int MOVED = 0x80000000; // hash field for forwarding nodes + static final int LOCKED = 0x40000000; // set/tested only as a bit + static final int WAITING = 0xc0000000; // both bits set/tested together + static final int HASH_BITS = 0x3fffffff; // usable bits of normal node hash + + /* ---------------- Fields -------------- */ + + /** + * The array of bins. Lazily initialized upon first insertion. + * Size is always a power of two. Accessed directly by iterators. + */ + transient volatile Node[] table; + + /** + * The counter maintaining number of elements. + */ + private transient final LongAdder counter; + + /** + * Table initialization and resizing control. When negative, the + * table is being initialized or resized. Otherwise, when table is + * null, holds the initial table size to use upon creation, or 0 + * for default. After initialization, holds the next element count + * value upon which to resize the table. + */ + private transient volatile int sizeCtl; + + // views + private transient KeySetView<K,V> keySet; + private transient ValuesView<K,V> values; + private transient EntrySetView<K,V> entrySet; + + /** For serialization compatibility. Null unless serialized; see below */ + private Segment<K,V>[] segments; + + /* ---------------- Table element access -------------- */ + + /* + * Volatile access methods are used for table elements as well as + * elements of in-progress next table while resizing. Uses are + * null checked by callers, and implicitly bounds-checked, relying + * on the invariants that tab arrays have non-zero size, and all + * indices are masked with (tab.length - 1) which is never + * negative and always less than length. Note that, to be correct + * wrt arbitrary concurrency errors by users, bounds checks must + * operate on local variables, which accounts for some odd-looking + * inline assignments below. + */ + + static final Node tabAt(Node[] tab, int i) { // used by Iter + return (Node)UNSAFE.getObjectVolatile(tab, ((long)i<<ASHIFT)+ABASE); + } + + private static final boolean casTabAt(Node[] tab, int i, Node c, Node v) { + return UNSAFE.compareAndSwapObject(tab, ((long)i<<ASHIFT)+ABASE, c, v); + } + + private static final void setTabAt(Node[] tab, int i, Node v) { + UNSAFE.putObjectVolatile(tab, ((long)i<<ASHIFT)+ABASE, v); + } + + /* ---------------- Nodes -------------- */ + + /** + * Key-value entry. Note that this is never exported out as a + * user-visible Map.Entry (see MapEntry below). Nodes with a hash + * field of MOVED are special, and do not contain user keys or + * values. Otherwise, keys are never null, and null val fields + * indicate that a node is in the process of being deleted or + * created. For purposes of read-only access, a key may be read + * before a val, but can only be used after checking val to be + * non-null. + */ + static class Node { + volatile int hash; + final Object key; + volatile Object val; + volatile Node next; + + Node(int hash, Object key, Object val, Node next) { + this.hash = hash; + this.key = key; + this.val = val; + this.next = next; + } + + /** CompareAndSet the hash field */ + final boolean casHash(int cmp, int val) { + return UNSAFE.compareAndSwapInt(this, hashOffset, cmp, val); + } + + /** The number of spins before blocking for a lock */ + static final int MAX_SPINS = + Runtime.getRuntime().availableProcessors() > 1 ? 64 : 1; + + /** + * Spins a while if LOCKED bit set and this node is the first + * of its bin, and then sets WAITING bits on hash field and + * blocks (once) if they are still set. It is OK for this + * method to return even if lock is not available upon exit, + * which enables these simple single-wait mechanics. + * + * The corresponding signalling operation is performed within + * callers: Upon detecting that WAITING has been set when + * unlocking lock (via a failed CAS from non-waiting LOCKED + * state), unlockers acquire the sync lock and perform a + * notifyAll. + * + * The initial sanity check on tab and bounds is not currently + * necessary in the only usages of this method, but enables + * use in other future contexts. + */ + final void tryAwaitLock(Node[] tab, int i) { + if (tab != null && i >= 0 && i < tab.length) { // sanity check + int r = ThreadLocalRandom.current().nextInt(); // randomize spins + int spins = MAX_SPINS, h; + while (tabAt(tab, i) == this && ((h = hash) & LOCKED) != 0) { + if (spins >= 0) { + r ^= r << 1; r ^= r >>> 3; r ^= r << 10; // xorshift + if (r >= 0 && --spins == 0) + Thread.yield(); // yield before block + } + else if (casHash(h, h | WAITING)) { + synchronized (this) { + if (tabAt(tab, i) == this && + (hash & WAITING) == WAITING) { + try { + wait(); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + else + notifyAll(); // possibly won race vs signaller + } + break; + } + } + } + } + + // Unsafe mechanics for casHash + private static final sun.misc.Unsafe UNSAFE; + private static final long hashOffset; + + static { + try { + UNSAFE = getUnsafe(); + Class<?> k = Node.class; + hashOffset = UNSAFE.objectFieldOffset + (k.getDeclaredField("hash")); + } catch (Exception e) { + throw new Error(e); + } + } + } + + /* ---------------- TreeBins -------------- */ + + /** + * Nodes for use in TreeBins + */ + static final class TreeNode extends Node { + TreeNode parent; // red-black tree links + TreeNode left; + TreeNode right; + TreeNode prev; // needed to unlink next upon deletion + boolean red; + + TreeNode(int hash, Object key, Object val, Node next, TreeNode parent) { + super(hash, key, val, next); + this.parent = parent; + } + } + + /** + * A specialized form of red-black tree for use in bins + * whose size exceeds a threshold. + * + * TreeBins use a special form of comparison for search and + * related operations (which is the main reason we cannot use + * existing collections such as TreeMaps). TreeBins contain + * Comparable elements, but may contain others, as well as + * elements that are Comparable but not necessarily Comparable<T> + * for the same T, so we cannot invoke compareTo among them. To + * handle this, the tree is ordered primarily by hash value, then + * by getClass().getName() order, and then by Comparator order + * among elements of the same class. On lookup at a node, if + * elements are not comparable or compare as 0, both left and + * right children may need to be searched in the case of tied hash + * values. (This corresponds to the full list search that would be + * necessary if all elements were non-Comparable and had tied + * hashes.) The red-black balancing code is updated from + * pre-jdk-collections + * (http://gee.cs.oswego.edu/dl/classes/collections/RBCell.java) + * based in turn on Cormen, Leiserson, and Rivest "Introduction to + * Algorithms" (CLR). + * + * TreeBins also maintain a separate locking discipline than + * regular bins. Because they are forwarded via special MOVED + * nodes at bin heads (which can never change once established), + * we cannot use those nodes as locks. Instead, TreeBin + * extends AbstractQueuedSynchronizer to support a simple form of + * read-write lock. For update operations and table validation, + * the exclusive form of lock behaves in the same way as bin-head + * locks. However, lookups use shared read-lock mechanics to allow + * multiple readers in the absence of writers. Additionally, + * these lookups do not ever block: While the lock is not + * available, they proceed along the slow traversal path (via + * next-pointers) until the lock becomes available or the list is + * exhausted, whichever comes first. (These cases are not fast, + * but maximize aggregate expected throughput.) The AQS mechanics + * for doing this are straightforward. The lock state is held as + * AQS getState(). Read counts are negative; the write count (1) + * is positive. There are no signalling preferences among readers + * and writers. Since we don't need to export full Lock API, we + * just override the minimal AQS methods and use them directly. + */ + static final class TreeBin extends AbstractQueuedSynchronizer { + private static final long serialVersionUID = 2249069246763182397L; + transient TreeNode root; // root of tree + transient TreeNode first; // head of next-pointer list + + /* AQS overrides */ + public final boolean isHeldExclusively() { return getState() > 0; } + public final boolean tryAcquire(int ignore) { + if (compareAndSetState(0, 1)) { + setExclusiveOwnerThread(Thread.currentThread()); + return true; + } + return false; + } + public final boolean tryRelease(int ignore) { + setExclusiveOwnerThread(null); + setState(0); + return true; + } + public final int tryAcquireShared(int ignore) { + for (int c;;) { + if ((c = getState()) > 0) + return -1; + if (compareAndSetState(c, c -1)) + return 1; + } + } + public final boolean tryReleaseShared(int ignore) { + int c; + do {} while (!compareAndSetState(c = getState(), c + 1)); + return c == -1; + } + + /** From CLR */ + private void rotateLeft(TreeNode p) { + if (p != null) { + TreeNode r = p.right, pp, rl; + if ((rl = p.right = r.left) != null) + rl.parent = p; + if ((pp = r.parent = p.parent) == null) + root = r; + else if (pp.left == p) + pp.left = r; + else + pp.right = r; + r.left = p; + p.parent = r; + } + } + + /** From CLR */ + private void rotateRight(TreeNode p) { + if (p != null) { + TreeNode l = p.left, pp, lr; + if ((lr = p.left = l.right) != null) + lr.parent = p; + if ((pp = l.parent = p.parent) == null) + root = l; + else if (pp.right == p) + pp.right = l; + else + pp.left = l; + l.right = p; + p.parent = l; + } + } + + @SuppressWarnings("unchecked") final TreeNode getTreeNode + (int h, Object k, TreeNode p) { + return getTreeNode(h, (RubyObject)k, p); + } + + /** + * Returns the TreeNode (or null if not found) for the given key + * starting at given root. + */ + @SuppressWarnings("unchecked") final TreeNode getTreeNode + (int h, RubyObject k, TreeNode p) { + RubyClass c = k.getMetaClass(); boolean kNotComparable = !k.respondsTo("<=>"); + while (p != null) { + int dir, ph; RubyObject pk; RubyClass pc; + if ((ph = p.hash) == h) { + if ((pk = (RubyObject)p.key) == k || k.equals(pk)) + return p; + if (c != (pc = (RubyClass)pk.getMetaClass()) || + kNotComparable || + (dir = rubyCompare(k, pk)) == 0) { + dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); + if (dir == 0) { // if still stuck, need to check both sides + TreeNode r = null, pl, pr; + // try to recurse on the right + if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) + return r; + // try to continue iterating on the left side + else if ((pl = p.left) != null && h <= pl.hash) + dir = -1; + else // no matching node found + return null; + } + } + } + else + dir = (h < ph) ? -1 : 1; + p = (dir > 0) ? p.right : p.left; + } + return null; + } + + int rubyCompare(RubyObject l, RubyObject r) { + ThreadContext context = l.getMetaClass().getRuntime().getCurrentContext(); + IRubyObject result; + try { + result = l.callMethod(context, "<=>", r); + } catch (RaiseException e) { + // handle objects "lying" about responding to <=>, ie: an Array containing non-comparable keys + if (context.runtime.getNoMethodError().isInstance(e.getException())) { + return 0; + } + throw e; + } + + return result.isNil() ? 0 : RubyNumeric.num2int(result.convertToInteger()); + } + + /** + * Wrapper for getTreeNode used by CHM.get. Tries to obtain + * read-lock to call getTreeNode, but during failure to get + * lock, searches along next links. + */ + final Object getValue(int h, Object k) { + Node r = null; + int c = getState(); // Must read lock state first + for (Node e = first; e != null; e = e.next) { + if (c <= 0 && compareAndSetState(c, c - 1)) { + try { + r = getTreeNode(h, k, root); + } finally { + releaseShared(0); + } + break; + } + else if ((e.hash & HASH_BITS) == h && k.equals(e.key)) { + r = e; + break; + } + else + c = getState(); + } + return r == null ? null : r.val; + } + + @SuppressWarnings("unchecked") final TreeNode putTreeNode + (int h, Object k, Object v) { + return putTreeNode(h, (RubyObject)k, v); + } + + /** + * Finds or adds a node. + * @return null if added + */ + @SuppressWarnings("unchecked") final TreeNode putTreeNode + (int h, RubyObject k, Object v) { + RubyClass c = k.getMetaClass(); + boolean kNotComparable = !k.respondsTo("<=>"); + TreeNode pp = root, p = null; + int dir = 0; + while (pp != null) { // find existing node or leaf to insert at + int ph; RubyObject pk; RubyClass pc; + p = pp; + if ((ph = p.hash) == h) { + if ((pk = (RubyObject)p.key) == k || k.equals(pk)) + return p; + if (c != (pc = pk.getMetaClass()) || + kNotComparable || + (dir = rubyCompare(k, pk)) == 0) { + dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); + if (dir == 0) { // if still stuck, need to check both sides + TreeNode r = null, pr; + // try to recurse on the right + if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) + return r; + else // continue descending down the left subtree + dir = -1; + } + } + } + else + dir = (h < ph) ? -1 : 1; + pp = (dir > 0) ? p.right : p.left; + } + + TreeNode f = first; + TreeNode x = first = new TreeNode(h, (Object)k, v, f, p); + if (p == null) + root = x; + else { // attach and rebalance; adapted from CLR + TreeNode xp, xpp; + if (f != null) + f.prev = x; + if (dir <= 0) + p.left = x; + else + p.right = x; + x.red = true; + while (x != null && (xp = x.parent) != null && xp.red && + (xpp = xp.parent) != null) { + TreeNode xppl = xpp.left; + if (xp == xppl) { + TreeNode y = xpp.right; + if (y != null && y.red) { + y.red = false; + xp.red = false; + xpp.red = true; + x = xpp; + } + else { + if (x == xp.right) { + rotateLeft(x = xp); + xpp = (xp = x.parent) == null ? null : xp.parent; + } + if (xp != null) { + xp.red = false; + if (xpp != null) { + xpp.red = true; + rotateRight(xpp); + } + } + } + } + else { + TreeNode y = xppl; + if (y != null && y.red) { + y.red = false; + xp.red = false; + xpp.red = true; + x = xpp; + } + else { + if (x == xp.left) { + rotateRight(x = xp); + xpp = (xp = x.parent) == null ? null : xp.parent; + } + if (xp != null) { + xp.red = false; + if (xpp != null) { + xpp.red = true; + rotateLeft(xpp); + } + } + } + } + } + TreeNode r = root; + if (r != null && r.red) + r.red = false; + } + return null; + } + + /** + * Removes the given node, that must be present before this + * call. This is messier than typical red-black deletion code + * because we cannot swap the contents of an interior node + * with a leaf successor that is pinned by "next" pointers + * that are accessible independently of lock. So instead we + * swap the tree linkages. + */ + final void deleteTreeNode(TreeNode p) { + TreeNode next = (TreeNode)p.next; // unlink traversal pointers + TreeNode pred = p.prev; + if (pred == null) + first = next; + else + pred.next = next; + if (next != null) + next.prev = pred; + TreeNode replacement; + TreeNode pl = p.left; + TreeNode pr = p.right; + if (pl != null && pr != null) { + TreeNode s = pr, sl; + while ((sl = s.left) != null) // find successor + s = sl; + boolean c = s.red; s.red = p.red; p.red = c; // swap colors + TreeNode sr = s.right; + TreeNode pp = p.parent; + if (s == pr) { // p was s's direct parent + p.parent = s; + s.right = p; + } + else { + TreeNode sp = s.parent; + if ((p.parent = sp) != null) { + if (s == sp.left) + sp.left = p; + else + sp.right = p; + } + if ((s.right = pr) != null) + pr.parent = s; + } + p.left = null; + if ((p.right = sr) != null) + sr.parent = p; + if ((s.left = pl) != null) + pl.parent = s; + if ((s.parent = pp) == null) + root = s; + else if (p == pp.left) + pp.left = s; + else + pp.right = s; + replacement = sr; + } + else + replacement = (pl != null) ? pl : pr; + TreeNode pp = p.parent; + if (replacement == null) { + if (pp == null) { + root = null; + return; + } + replacement = p; + } + else { + replacement.parent = pp; + if (pp == null) + root = replacement; + else if (p == pp.left) + pp.left = replacement; + else + pp.right = replacement; + p.left = p.right = p.parent = null; + } + if (!p.red) { // rebalance, from CLR + TreeNode x = replacement; + while (x != null) { + TreeNode xp, xpl; + if (x.red || (xp = x.parent) == null) { + x.red = false; + break; + } + if (x == (xpl = xp.left)) { + TreeNode sib = xp.right; + if (sib != null && sib.red) { + sib.red = false; + xp.red = true; + rotateLeft(xp); + sib = (xp = x.parent) == null ? null : xp.right; + } + if (sib == null) + x = xp; + else { + TreeNode sl = sib.left, sr = sib.right; + if ((sr == null || !sr.red) && + (sl == null || !sl.red)) { + sib.red = true; + x = xp; + } + else { + if (sr == null || !sr.red) { + if (sl != null) + sl.red = false; + sib.red = true; + rotateRight(sib); + sib = (xp = x.parent) == null ? null : xp.right; + } + if (sib != null) { + sib.red = (xp == null) ? false : xp.red; + if ((sr = sib.right) != null) + sr.red = false; + } + if (xp != null) { + xp.red = false; + rotateLeft(xp); + } + x = root; + } + } + } + else { // symmetric + TreeNode sib = xpl; + if (sib != null && sib.red) { + sib.red = false; + xp.red = true; + rotateRight(xp); + sib = (xp = x.parent) == null ? null : xp.left; + } + if (sib == null) + x = xp; + else { + TreeNode sl = sib.left, sr = sib.right; + if ((sl == null || !sl.red) && + (sr == null || !sr.red)) { + sib.red = true; + x = xp; + } + else { + if (sl == null || !sl.red) { + if (sr != null) + sr.red = false; + sib.red = true; + rotateLeft(sib); + sib = (xp = x.parent) == null ? null : xp.left; + } + if (sib != null) { + sib.red = (xp == null) ? false : xp.red; + if ((sl = sib.left) != null) + sl.red = false; + } + if (xp != null) { + xp.red = false; + rotateRight(xp); + } + x = root; + } + } + } + } + } + if (p == replacement && (pp = p.parent) != null) { + if (p == pp.left) // detach pointers + pp.left = null; + else if (p == pp.right) + pp.right = null; + p.parent = null; + } + } + } + + /* ---------------- Collision reduction methods -------------- */ + + /** + * Spreads higher bits to lower, and also forces top 2 bits to 0. + * Because the table uses power-of-two masking, sets of hashes + * that vary only in bits above the current mask will always + * collide. (Among known examples are sets of Float keys holding + * consecutive whole numbers in small tables.) To counter this, + * we apply a transform that spreads the impact of higher bits + * downward. There is a tradeoff between speed, utility, and + * quality of bit-spreading. Because many common sets of hashes + * are already reasonably distributed across bits (so don't benefit + * from spreading), and because we use trees to handle large sets + * of collisions in bins, we don't need excessively high quality. + */ + private static final int spread(int h) { + h ^= (h >>> 18) ^ (h >>> 12); + return (h ^ (h >>> 10)) & HASH_BITS; + } + + /** + * Replaces a list bin with a tree bin. Call only when locked. + * Fails to replace if the given key is non-comparable or table + * is, or needs, resizing. + */ + private final void replaceWithTreeBin(Node[] tab, int index, Object key) { + if ((key instanceof Comparable) && + (tab.length >= MAXIMUM_CAPACITY || counter.sum() < (long)sizeCtl)) { + TreeBin t = new TreeBin(); + for (Node e = tabAt(tab, index); e != null; e = e.next) + t.putTreeNode(e.hash & HASH_BITS, e.key, e.val); + setTabAt(tab, index, new Node(MOVED, t, null, null)); + } + } + + /* ---------------- Internal access and update methods -------------- */ + + /** Implementation for get and containsKey */ + private final Object internalGet(Object k) { + int h = spread(k.hashCode()); + retry: for (Node[] tab = table; tab != null;) { + Node e, p; Object ek, ev; int eh; // locals to read fields once + for (e = tabAt(tab, (tab.length - 1) & h); e != null; e = e.next) { + if ((eh = e.hash) == MOVED) { + if ((ek = e.key) instanceof TreeBin) // search TreeBin + return ((TreeBin)ek).getValue(h, k); + else { // restart with new table + tab = (Node[])ek; + continue retry; + } + } + else if ((eh & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + } + break; + } + return null; + } + + /** + * Implementation for the four public remove/replace methods: + * Replaces node value with v, conditional upon match of cv if + * non-null. If resulting value is null, delete. + */ + private final Object internalReplace(Object k, Object v, Object cv) { + int h = spread(k.hashCode()); + Object oldVal = null; + for (Node[] tab = table;;) { + Node f; int i, fh; Object fk; + if (tab == null || + (f = tabAt(tab, i = (tab.length - 1) & h)) == null) + break; + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + boolean deleted = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) { + Object pv = p.val; + if (cv == null || cv == pv || cv.equals(pv)) { + oldVal = pv; + if ((p.val = v) == null) { + deleted = true; + t.deleteTreeNode(p); + } + } + } + } + } finally { + t.release(0); + } + if (validated) { + if (deleted) + counter.add(-1L); + break; + } + } + else + tab = (Node[])fk; + } + else if ((fh & HASH_BITS) != h && f.next == null) // precheck + break; // rules out possible existence + else if ((fh & LOCKED) != 0) { + checkForResize(); // try resizing if can't get lock + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + boolean validated = false; + boolean deleted = false; + try { + if (tabAt(tab, i) == f) { + validated = true; + for (Node e = f, pred = null;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + ((ev = e.val) != null) && + ((ek = e.key) == k || k.equals(ek))) { + if (cv == null || cv == ev || cv.equals(ev)) { + oldVal = ev; + if ((e.val = v) == null) { + deleted = true; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + } + break; + } + pred = e; + if ((e = e.next) == null) + break; + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (validated) { + if (deleted) + counter.add(-1L); + break; + } + } + } + return oldVal; + } + + /* + * Internal versions of the six insertion methods, each a + * little more complicated than the last. All have + * the same basic structure as the first (internalPut): + * 1. If table uninitialized, create + * 2. If bin empty, try to CAS new node + * 3. If bin stale, use new table + * 4. if bin converted to TreeBin, validate and relay to TreeBin methods + * 5. Lock and validate; if valid, scan and add or update + * + * The others interweave other checks and/or alternative actions: + * * Plain put checks for and performs resize after insertion. + * * putIfAbsent prescans for mapping without lock (and fails to add + * if present), which also makes pre-emptive resize checks worthwhile. + * * computeIfAbsent extends form used in putIfAbsent with additional + * mechanics to deal with, calls, potential exceptions and null + * returns from function call. + * * compute uses the same function-call mechanics, but without + * the prescans + * * merge acts as putIfAbsent in the absent case, but invokes the + * update function if present + * * putAll attempts to pre-allocate enough table space + * and more lazily performs count updates and checks. + * + * Someday when details settle down a bit more, it might be worth + * some factoring to reduce sprawl. + */ + + /** Implementation for put */ + private final Object internalPut(Object k, Object v) { + int h = spread(k.hashCode()); + int count = 0; + for (Node[] tab = table;;) { + int i; Node f; int fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) + break; // no lock when adding to empty bin + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + Object oldVal = null; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 2; + TreeNode p = t.putTreeNode(h, k, v); + if (p != null) { + oldVal = p.val; + p.val = v; + } + } + } finally { + t.release(0); + } + if (count != 0) { + if (oldVal != null) + return oldVal; + break; + } + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + Object oldVal = null; + try { // needed in case equals() throws + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + oldVal = ev; + e.val = v; + break; + } + Node last = e; + if ((e = e.next) == null) { + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { // unlock and signal if needed + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (oldVal != null) + return oldVal; + if (tab.length <= 64) + count = 2; + break; + } + } + } + counter.add(1L); + if (count > 1) + checkForResize(); + return null; + } + + /** Implementation for putIfAbsent */ + private final Object internalPutIfAbsent(Object k, Object v) { + int h = spread(k.hashCode()); + int count = 0; + for (Node[] tab = table;;) { + int i; Node f; int fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + Object oldVal = null; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 2; + TreeNode p = t.putTreeNode(h, k, v); + if (p != null) + oldVal = p.val; + } + } finally { + t.release(0); + } + if (count != 0) { + if (oldVal != null) + return oldVal; + break; + } + } + else + tab = (Node[])fk; + } + else if ((fh & HASH_BITS) == h && (fv = f.val) != null && + ((fk = f.key) == k || k.equals(fk))) + return fv; + else { + Node g = f.next; + if (g != null) { // at least 2 nodes -- search and maybe resize + for (Node e = g;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + if ((e = e.next) == null) { + checkForResize(); + break; + } + } + } + if (((fh = f.hash) & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { + Object oldVal = null; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + oldVal = ev; + break; + } + Node last = e; + if ((e = e.next) == null) { + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (oldVal != null) + return oldVal; + if (tab.length <= 64) + count = 2; + break; + } + } + } + } + counter.add(1L); + if (count > 1) + checkForResize(); + return null; + } + + /** Implementation for computeIfAbsent */ + private final Object internalComputeIfAbsent(K k, + Fun<? super K, ?> mf) { + int h = spread(k.hashCode()); + Object val = null; + int count = 0; + for (Node[] tab = table;;) { + Node f; int i, fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + Node node = new Node(fh = h | LOCKED, k, null, null); + if (casTabAt(tab, i, null, node)) { + count = 1; + try { + if ((val = mf.apply(k)) != null) + node.val = val; + } finally { + if (val == null) + setTabAt(tab, i, null); + if (!node.casHash(fh, h)) { + node.hash = h; + synchronized (node) { node.notifyAll(); }; + } + } + } + if (count != 0) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean added = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) + val = p.val; + else if ((val = mf.apply(k)) != null) { + added = true; + count = 2; + t.putTreeNode(h, k, val); + } + } + } finally { + t.release(0); + } + if (count != 0) { + if (!added) + return val; + break; + } + } + else + tab = (Node[])fk; + } + else if ((fh & HASH_BITS) == h && (fv = f.val) != null && + ((fk = f.key) == k || k.equals(fk))) + return fv; + else { + Node g = f.next; + if (g != null) { + for (Node e = g;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + if ((e = e.next) == null) { + checkForResize(); + break; + } + } + } + if (((fh = f.hash) & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { + boolean added = false; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = ev; + break; + } + Node last = e; + if ((e = e.next) == null) { + if ((val = mf.apply(k)) != null) { + added = true; + last.next = new Node(h, k, val, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + } + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (!added) + return val; + if (tab.length <= 64) + count = 2; + break; + } + } + } + } + if (val != null) { + counter.add(1L); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for compute */ + @SuppressWarnings("unchecked") private final Object internalCompute + (K k, boolean onlyIfPresent, BiFun<? super K, ? super V, ? extends V> mf) { + int h = spread(k.hashCode()); + Object val = null; + int delta = 0; + int count = 0; + for (Node[] tab = table;;) { + Node f; int i, fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + if (onlyIfPresent) + break; + Node node = new Node(fh = h | LOCKED, k, null, null); + if (casTabAt(tab, i, null, node)) { + try { + count = 1; + if ((val = mf.apply(k, null)) != null) { + node.val = val; + delta = 1; + } + } finally { + if (delta == 0) + setTabAt(tab, i, null); + if (!node.casHash(fh, h)) { + node.hash = h; + synchronized (node) { node.notifyAll(); }; + } + } + } + if (count != 0) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + Object pv; + if (p == null) { + if (onlyIfPresent) + break; + pv = null; + } else + pv = p.val; + if ((val = mf.apply(k, (V)pv)) != null) { + if (p != null) + p.val = val; + else { + count = 2; + delta = 1; + t.putTreeNode(h, k, val); + } + } + else if (p != null) { + delta = -1; + t.deleteTreeNode(p); + } + } + } finally { + t.release(0); + } + if (count != 0) + break; + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f, pred = null;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = mf.apply(k, (V)ev); + if (val != null) + e.val = val; + else { + delta = -1; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + break; + } + pred = e; + if ((e = e.next) == null) { + if (!onlyIfPresent && (val = mf.apply(k, null)) != null) { + pred.next = new Node(h, k, val, null); + delta = 1; + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + } + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (tab.length <= 64) + count = 2; + break; + } + } + } + if (delta != 0) { + counter.add((long)delta); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for merge */ + @SuppressWarnings("unchecked") private final Object internalMerge + (K k, V v, BiFun<? super V, ? super V, ? extends V> mf) { + int h = spread(k.hashCode()); + Object val = null; + int delta = 0; + int count = 0; + for (Node[] tab = table;;) { + int i; Node f; int fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) { + delta = 1; + val = v; + break; + } + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + val = (p == null) ? v : mf.apply((V)p.val, v); + if (val != null) { + if (p != null) + p.val = val; + else { + count = 2; + delta = 1; + t.putTreeNode(h, k, val); + } + } + else if (p != null) { + delta = -1; + t.deleteTreeNode(p); + } + } + } finally { + t.release(0); + } + if (count != 0) + break; + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f, pred = null;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = mf.apply((V)ev, v); + if (val != null) + e.val = val; + else { + delta = -1; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + break; + } + pred = e; + if ((e = e.next) == null) { + val = v; + pred.next = new Node(h, k, val, null); + delta = 1; + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (tab.length <= 64) + count = 2; + break; + } + } + } + if (delta != 0) { + counter.add((long)delta); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for putAll */ + private final void internalPutAll(Map<?, ?> m) { + tryPresize(m.size()); + long delta = 0L; // number of uncommitted additions + boolean npe = false; // to throw exception on exit for nulls + try { // to clean up counts on other exceptions + for (Map.Entry<?, ?> entry : m.entrySet()) { + Object k, v; + if (entry == null || (k = entry.getKey()) == null || + (v = entry.getValue()) == null) { + npe = true; + break; + } + int h = spread(k.hashCode()); + for (Node[] tab = table;;) { + int i; Node f; int fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null){ + if (casTabAt(tab, i, null, new Node(h, k, v, null))) { + ++delta; + break; + } + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) + p.val = v; + else { + t.putTreeNode(h, k, v); + ++delta; + } + } + } finally { + t.release(0); + } + if (validated) + break; + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + counter.add(delta); + delta = 0L; + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + int count = 0; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + e.val = v; + break; + } + Node last = e; + if ((e = e.next) == null) { + ++delta; + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (count > 1) { + counter.add(delta); + delta = 0L; + checkForResize(); + } + break; + } + } + } + } + } finally { + if (delta != 0) + counter.add(delta); + } + if (npe) + throw new NullPointerException(); + } + + /* ---------------- Table Initialization and Resizing -------------- */ + + /** + * Returns a power of two table size for the given desired capacity. + * See Hackers Delight, sec 3.2 + */ + private static final int tableSizeFor(int c) { + int n = c - 1; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; + } + + /** + * Initializes table, using the size recorded in sizeCtl. + */ + private final Node[] initTable() { + Node[] tab; int sc; + while ((tab = table) == null) { + if ((sc = sizeCtl) < 0) + Thread.yield(); // lost initialization race; just spin + else if (UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if ((tab = table) == null) { + int n = (sc > 0) ? sc : DEFAULT_CAPACITY; + tab = table = new Node[n]; + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + break; + } + } + return tab; + } + + /** + * If table is too small and not already resizing, creates next + * table and transfers bins. Rechecks occupancy after a transfer + * to see if another resize is already needed because resizings + * are lagging additions. + */ + private final void checkForResize() { + Node[] tab; int n, sc; + while ((tab = table) != null && + (n = tab.length) < MAXIMUM_CAPACITY && + (sc = sizeCtl) >= 0 && counter.sum() >= (long)sc && + UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if (tab == table) { + table = rebuild(tab); + sc = (n << 1) - (n >>> 1); + } + } finally { + sizeCtl = sc; + } + } + } + + /** + * Tries to presize table to accommodate the given number of elements. + * + * @param size number of elements (doesn't need to be perfectly accurate) + */ + private final void tryPresize(int size) { + int c = (size >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : + tableSizeFor(size + (size >>> 1) + 1); + int sc; + while ((sc = sizeCtl) >= 0) { + Node[] tab = table; int n; + if (tab == null || (n = tab.length) == 0) { + n = (sc > c) ? sc : c; + if (UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if (table == tab) { + table = new Node[n]; + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + } + } + else if (c <= sc || n >= MAXIMUM_CAPACITY) + break; + else if (UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if (table == tab) { + table = rebuild(tab); + sc = (n << 1) - (n >>> 1); + } + } finally { + sizeCtl = sc; + } + } + } + } + + /* + * Moves and/or copies the nodes in each bin to new table. See + * above for explanation. + * + * @return the new table + */ + private static final Node[] rebuild(Node[] tab) { + int n = tab.length; + Node[] nextTab = new Node[n << 1]; + Node fwd = new Node(MOVED, nextTab, null, null); + int[] buffer = null; // holds bins to revisit; null until needed + Node rev = null; // reverse forwarder; null until needed + int nbuffered = 0; // the number of bins in buffer list + int bufferIndex = 0; // buffer index of current buffered bin + int bin = n - 1; // current non-buffered bin or -1 if none + + for (int i = bin;;) { // start upwards sweep + int fh; Node f; + if ((f = tabAt(tab, i)) == null) { + if (bin >= 0) { // Unbuffered; no lock needed (or available) + if (!casTabAt(tab, i, f, fwd)) + continue; + } + else { // transiently use a locked forwarding node + Node g = new Node(MOVED|LOCKED, nextTab, null, null); + if (!casTabAt(tab, i, f, g)) + continue; + setTabAt(nextTab, i, null); + setTabAt(nextTab, i + n, null); + setTabAt(tab, i, fwd); + if (!g.casHash(MOVED|LOCKED, MOVED)) { + g.hash = MOVED; + synchronized (g) { g.notifyAll(); } + } + } + } + else if ((fh = f.hash) == MOVED) { + Object fk = f.key; + if (fk instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + splitTreeBin(nextTab, i, t); + setTabAt(tab, i, fwd); + } + } finally { + t.release(0); + } + if (!validated) + continue; + } + } + else if ((fh & LOCKED) == 0 && f.casHash(fh, fh|LOCKED)) { + boolean validated = false; + try { // split to lo and hi lists; copying as needed + if (tabAt(tab, i) == f) { + validated = true; + splitBin(nextTab, i, f); + setTabAt(tab, i, fwd); + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (!validated) + continue; + } + else { + if (buffer == null) // initialize buffer for revisits + buffer = new int[TRANSFER_BUFFER_SIZE]; + if (bin < 0 && bufferIndex > 0) { + int j = buffer[--bufferIndex]; + buffer[bufferIndex] = i; + i = j; // swap with another bin + continue; + } + if (bin < 0 || nbuffered >= TRANSFER_BUFFER_SIZE) { + f.tryAwaitLock(tab, i); + continue; // no other options -- block + } + if (rev == null) // initialize reverse-forwarder + rev = new Node(MOVED, tab, null, null); + if (tabAt(tab, i) != f || (f.hash & LOCKED) == 0) + continue; // recheck before adding to list + buffer[nbuffered++] = i; + setTabAt(nextTab, i, rev); // install place-holders + setTabAt(nextTab, i + n, rev); + } + + if (bin > 0) + i = --bin; + else if (buffer != null && nbuffered > 0) { + bin = -1; + i = buffer[bufferIndex = --nbuffered]; + } + else + return nextTab; + } + } + + /** + * Splits a normal bin with list headed by e into lo and hi parts; + * installs in given table. + */ + private static void splitBin(Node[] nextTab, int i, Node e) { + int bit = nextTab.length >>> 1; // bit to split on + int runBit = e.hash & bit; + Node lastRun = e, lo = null, hi = null; + for (Node p = e.next; p != null; p = p.next) { + int b = p.hash & bit; + if (b != runBit) { + runBit = b; + lastRun = p; + } + } + if (runBit == 0) + lo = lastRun; + else + hi = lastRun; + for (Node p = e; p != lastRun; p = p.next) { + int ph = p.hash & HASH_BITS; + Object pk = p.key, pv = p.val; + if ((ph & bit) == 0) + lo = new Node(ph, pk, pv, lo); + else + hi = new Node(ph, pk, pv, hi); + } + setTabAt(nextTab, i, lo); + setTabAt(nextTab, i + bit, hi); + } + + /** + * Splits a tree bin into lo and hi parts; installs in given table. + */ + private static void splitTreeBin(Node[] nextTab, int i, TreeBin t) { + int bit = nextTab.length >>> 1; + TreeBin lt = new TreeBin(); + TreeBin ht = new TreeBin(); + int lc = 0, hc = 0; + for (Node e = t.first; e != null; e = e.next) { + int h = e.hash & HASH_BITS; + Object k = e.key, v = e.val; + if ((h & bit) == 0) { + ++lc; + lt.putTreeNode(h, k, v); + } + else { + ++hc; + ht.putTreeNode(h, k, v); + } + } + Node ln, hn; // throw away trees if too small + if (lc <= (TREE_THRESHOLD >>> 1)) { + ln = null; + for (Node p = lt.first; p != null; p = p.next) + ln = new Node(p.hash, p.key, p.val, ln); + } + else + ln = new Node(MOVED, lt, null, null); + setTabAt(nextTab, i, ln); + if (hc <= (TREE_THRESHOLD >>> 1)) { + hn = null; + for (Node p = ht.first; p != null; p = p.next) + hn = new Node(p.hash, p.key, p.val, hn); + } + else + hn = new Node(MOVED, ht, null, null); + setTabAt(nextTab, i + bit, hn); + } + + /** + * Implementation for clear. Steps through each bin, removing all + * nodes. + */ + private final void internalClear() { + long delta = 0L; // negative number of deletions + int i = 0; + Node[] tab = table; + while (tab != null && i < tab.length) { + int fh; Object fk; + Node f = tabAt(tab, i); + if (f == null) + ++i; + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + for (Node p = t.first; p != null; p = p.next) { + if (p.val != null) { // (currently always true) + p.val = null; + --delta; + } + } + t.first = null; + t.root = null; + ++i; + } + } finally { + t.release(0); + } + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + counter.add(delta); // opportunistically update count + delta = 0L; + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + for (Node e = f; e != null; e = e.next) { + if (e.val != null) { // (currently always true) + e.val = null; + --delta; + } + } + setTabAt(tab, i, null); + ++i; + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + } + } + if (delta != 0) + counter.add(delta); + } + + /* ----------------Table Traversal -------------- */ + + /** + * Encapsulates traversal for methods such as containsValue; also + * serves as a base class for other iterators and bulk tasks. + * + * At each step, the iterator snapshots the key ("nextKey") and + * value ("nextVal") of a valid node (i.e., one that, at point of + * snapshot, has a non-null user value). Because val fields can + * change (including to null, indicating deletion), field nextVal + * might not be accurate at point of use, but still maintains the + * weak consistency property of holding a value that was once + * valid. To support iterator.remove, the nextKey field is not + * updated (nulled out) when the iterator cannot advance. + * + * Internal traversals directly access these fields, as in: + * {@code while (it.advance() != null) { process(it.nextKey); }} + * + * Exported iterators must track whether the iterator has advanced + * (in hasNext vs next) (by setting/checking/nulling field + * nextVal), and then extract key, value, or key-value pairs as + * return values of next(). + * + * The iterator visits once each still-valid node that was + * reachable upon iterator construction. It might miss some that + * were added to a bin after the bin was visited, which is OK wrt + * consistency guarantees. Maintaining this property in the face + * of possible ongoing resizes requires a fair amount of + * bookkeeping state that is difficult to optimize away amidst + * volatile accesses. Even so, traversal maintains reasonable + * throughput. + * + * Normally, iteration proceeds bin-by-bin traversing lists. + * However, if the table has been resized, then all future steps + * must traverse both the bin at the current index as well as at + * (index + baseSize); and so on for further resizings. To + * paranoically cope with potential sharing by users of iterators + * across threads, iteration terminates if a bounds checks fails + * for a table read. + * + * This class extends ForkJoinTask to streamline parallel + * iteration in bulk operations (see BulkTask). This adds only an + * int of space overhead, which is close enough to negligible in + * cases where it is not needed to not worry about it. Because + * ForkJoinTask is Serializable, but iterators need not be, we + * need to add warning suppressions. + */ + @SuppressWarnings("serial") static class Traverser<K,V,R> { + final ConcurrentHashMapV8<K, V> map; + Node next; // the next entry to use + K nextKey; // cached key field of next + V nextVal; // cached val field of next + Node[] tab; // current table; updated if resized + int index; // index of bin to use next + int baseIndex; // current index of initial table + int baseLimit; // index bound for initial table + int baseSize; // initial table size + + /** Creates iterator for all entries in the table. */ + Traverser(ConcurrentHashMapV8<K, V> map) { + this.map = map; + } + + /** Creates iterator for split() methods */ + Traverser(Traverser<K,V,?> it) { + ConcurrentHashMapV8<K, V> m; Node[] t; + if ((m = this.map = it.map) == null) + t = null; + else if ((t = it.tab) == null && // force parent tab initialization + (t = it.tab = m.table) != null) + it.baseLimit = it.baseSize = t.length; + this.tab = t; + this.baseSize = it.baseSize; + it.baseLimit = this.index = this.baseIndex = + ((this.baseLimit = it.baseLimit) + it.baseIndex + 1) >>> 1; + } + + /** + * Advances next; returns nextVal or null if terminated. + * See above for explanation. + */ + final V advance() { + Node e = next; + V ev = null; + outer: do { + if (e != null) // advance past used/skipped node + e = e.next; + while (e == null) { // get to next non-null bin + ConcurrentHashMapV8<K, V> m; + Node[] t; int b, i, n; Object ek; // checks must use locals + if ((t = tab) != null) + n = t.length; + else if ((m = map) != null && (t = tab = m.table) != null) + n = baseLimit = baseSize = t.length; + else + break outer; + if ((b = baseIndex) >= baseLimit || + (i = index) < 0 || i >= n) + break outer; + if ((e = tabAt(t, i)) != null && e.hash == MOVED) { + if ((ek = e.key) instanceof TreeBin) + e = ((TreeBin)ek).first; + else { + tab = (Node[])ek; + continue; // restarts due to null val + } + } // visit upper slots if present + index = (i += baseSize) < n ? i : (baseIndex = b + 1); + } + nextKey = (K) e.key; + } while ((ev = (V) e.val) == null); // skip deleted or special nodes + next = e; + return nextVal = ev; + } + + public final void remove() { + Object k = nextKey; + if (k == null && (advance() == null || (k = nextKey) == null)) + throw new IllegalStateException(); + map.internalReplace(k, null, null); + } + + public final boolean hasNext() { + return nextVal != null || advance() != null; + } + + public final boolean hasMoreElements() { return hasNext(); } + public final void setRawResult(Object x) { } + public R getRawResult() { return null; } + public boolean exec() { return true; } + } + + /* ---------------- Public operations -------------- */ + + /** + * Creates a new, empty map with the default initial table size (16). + */ + public ConcurrentHashMapV8() { + this.counter = new LongAdder(); + } + + /** + * Creates a new, empty map with an initial table size + * accommodating the specified number of elements without the need + * to dynamically resize. + * + * @param initialCapacity The implementation performs internal + * sizing to accommodate this many elements. + * @throws IllegalArgumentException if the initial capacity of + * elements is negative + */ + public ConcurrentHashMapV8(int initialCapacity) { + if (initialCapacity < 0) + throw new IllegalArgumentException(); + int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? + MAXIMUM_CAPACITY : + tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1)); + this.counter = new LongAdder(); + this.sizeCtl = cap; + } + + /** + * Creates a new map with the same mappings as the given map. + * + * @param m the map + */ + public ConcurrentHashMapV8(Map<? extends K, ? extends V> m) { + this.counter = new LongAdder(); + this.sizeCtl = DEFAULT_CAPACITY; + internalPutAll(m); + } + + /** + * Creates a new, empty map with an initial table size based on + * the given number of elements ({@code initialCapacity}) and + * initial table density ({@code loadFactor}). + * + * @param initialCapacity the initial capacity. The implementation + * performs internal sizing to accommodate this many elements, + * given the specified load factor. + * @param loadFactor the load factor (table density) for + * establishing the initial table size + * @throws IllegalArgumentException if the initial capacity of + * elements is negative or the load factor is nonpositive + * + * @since 1.6 + */ + public ConcurrentHashMapV8(int initialCapacity, float loadFactor) { + this(initialCapacity, loadFactor, 1); + } + + /** + * Creates a new, empty map with an initial table size based on + * the given number of elements ({@code initialCapacity}), table + * density ({@code loadFactor}), and number of concurrently + * updating threads ({@code concurrencyLevel}). + * + * @param initialCapacity the initial capacity. The implementation + * performs internal sizing to accommodate this many elements, + * given the specified load factor. + * @param loadFactor the load factor (table density) for + * establishing the initial table size + * @param concurrencyLevel the estimated number of concurrently + * updating threads. The implementation may use this value as + * a sizing hint. + * @throws IllegalArgumentException if the initial capacity is + * negative or the load factor or concurrencyLevel are + * nonpositive + */ + public ConcurrentHashMapV8(int initialCapacity, + float loadFactor, int concurrencyLevel) { + if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0) + throw new IllegalArgumentException(); + if (initialCapacity < concurrencyLevel) // Use at least as many bins + initialCapacity = concurrencyLevel; // as estimated threads + long size = (long)(1.0 + (long)initialCapacity / loadFactor); + int cap = (size >= (long)MAXIMUM_CAPACITY) ? + MAXIMUM_CAPACITY : tableSizeFor((int)size); + this.counter = new LongAdder(); + this.sizeCtl = cap; + } + + /** + * Creates a new {@link Set} backed by a ConcurrentHashMapV8 + * from the given type to {@code Boolean.TRUE}. + * + * @return the new set + */ + public static <K> KeySetView<K,Boolean> newKeySet() { + return new KeySetView<K,Boolean>(new ConcurrentHashMapV8<K,Boolean>(), + Boolean.TRUE); + } + + /** + * Creates a new {@link Set} backed by a ConcurrentHashMapV8 + * from the given type to {@code Boolean.TRUE}. + * + * @param initialCapacity The implementation performs internal + * sizing to accommodate this many elements. + * @throws IllegalArgumentException if the initial capacity of + * elements is negative + * @return the new set + */ + public static <K> KeySetView<K,Boolean> newKeySet(int initialCapacity) { + return new KeySetView<K,Boolean>(new ConcurrentHashMapV8<K,Boolean>(initialCapacity), + Boolean.TRUE); + } + + /** + * {@inheritDoc} + */ + public boolean isEmpty() { + return counter.sum() <= 0L; // ignore transient negative values + } + + /** + * {@inheritDoc} + */ + public int size() { + long n = counter.sum(); + return ((n < 0L) ? 0 : + (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : + (int)n); + } + + /** + * Returns the number of mappings. This method should be used + * instead of {@link #size} because a ConcurrentHashMapV8 may + * contain more mappings than can be represented as an int. The + * value returned is a snapshot; the actual count may differ if + * there are ongoing concurrent insertions or removals. + * + * @return the number of mappings + */ + public long mappingCount() { + long n = counter.sum(); + return (n < 0L) ? 0L : n; // ignore transient negative values + } + + /** + * Returns the value to which the specified key is mapped, + * or {@code null} if this map contains no mapping for the key. + * + * <p>More formally, if this map contains a mapping from a key + * {@code k} to a value {@code v} such that {@code key.equals(k)}, + * then this method returns {@code v}; otherwise it returns + * {@code null}. (There can be at most one such mapping.) + * + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V get(Object key) { + if (key == null) + throw new NullPointerException(); + return (V)internalGet(key); + } + + /** + * Returns the value to which the specified key is mapped, + * or the given defaultValue if this map contains no mapping for the key. + * + * @param key the key + * @param defaultValue the value to return if this map contains + * no mapping for the given key + * @return the mapping for the key, if present; else the defaultValue + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V getValueOrDefault(Object key, V defaultValue) { + if (key == null) + throw new NullPointerException(); + V v = (V) internalGet(key); + return v == null ? defaultValue : v; + } + + /** + * Tests if the specified object is a key in this table. + * + * @param key possible key + * @return {@code true} if and only if the specified object + * is a key in this table, as determined by the + * {@code equals} method; {@code false} otherwise + * @throws NullPointerException if the specified key is null + */ + public boolean containsKey(Object key) { + if (key == null) + throw new NullPointerException(); + return internalGet(key) != null; + } + + /** + * Returns {@code true} if this map maps one or more keys to the + * specified value. Note: This method may require a full traversal + * of the map, and is much slower than method {@code containsKey}. + * + * @param value value whose presence in this map is to be tested + * @return {@code true} if this map maps one or more keys to the + * specified value + * @throws NullPointerException if the specified value is null + */ + public boolean containsValue(Object value) { + if (value == null) + throw new NullPointerException(); + Object v; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + while ((v = it.advance()) != null) { + if (v == value || value.equals(v)) + return true; + } + return false; + } + + public K findKey(Object value) { + if (value == null) + throw new NullPointerException(); + Object v; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + while ((v = it.advance()) != null) { + if (v == value || value.equals(v)) + return it.nextKey; + } + return null; + } + + /** + * Legacy method testing if some key maps into the specified value + * in this table. This method is identical in functionality to + * {@link #containsValue}, and exists solely to ensure + * full compatibility with class {@link java.util.Hashtable}, + * which supported this method prior to introduction of the + * Java Collections framework. + * + * @param value a value to search for + * @return {@code true} if and only if some key maps to the + * {@code value} argument in this table as + * determined by the {@code equals} method; + * {@code false} otherwise + * @throws NullPointerException if the specified value is null + */ + public boolean contains(Object value) { + return containsValue(value); + } + + /** + * Maps the specified key to the specified value in this table. + * Neither the key nor the value can be null. + * + * <p>The value can be retrieved by calling the {@code get} method + * with a key that is equal to the original key. + * + * @param key key with which the specified value is to be associated + * @param value value to be associated with the specified key + * @return the previous value associated with {@code key}, or + * {@code null} if there was no mapping for {@code key} + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V put(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalPut(key, value); + } + + /** + * {@inheritDoc} + * + * @return the previous value associated with the specified key, + * or {@code null} if there was no mapping for the key + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V putIfAbsent(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalPutIfAbsent(key, value); + } + + /** + * Copies all of the mappings from the specified map to this one. + * These mappings replace any mappings that this map had for any of the + * keys currently in the specified map. + * + * @param m mappings to be stored in this map + */ + public void putAll(Map<? extends K, ? extends V> m) { + internalPutAll(m); + } + + /** + * If the specified key is not already associated with a value, + * computes its value using the given mappingFunction and enters + * it into the map unless null. This is equivalent to + * <pre> {@code + * if (map.containsKey(key)) + * return map.get(key); + * value = mappingFunction.apply(key); + * if (value != null) + * map.put(key, value); + * return value;}</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null} no mapping is recorded. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and no mapping is recorded. Some + * attempted update operations on this map by other threads may be + * blocked while computation is in progress, so the computation + * should be short and simple, and must not attempt to update any + * other mappings of this Map. The most appropriate usage is to + * construct a new object serving as an initial mapped value, or + * memoized result, as in: + * + * <pre> {@code + * map.computeIfAbsent(key, new Fun<K, V>() { + * public V map(K k) { return new Value(f(k)); }});}</pre> + * + * @param key key with which the specified value is to be associated + * @param mappingFunction the function to compute a value + * @return the current (existing or computed) value associated with + * the specified key, or null if the computed value is null + * @throws NullPointerException if the specified key or mappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the mappingFunction does so, + * in which case the mapping is left unestablished + */ + @SuppressWarnings("unchecked") public V computeIfAbsent + (K key, Fun<? super K, ? extends V> mappingFunction) { + if (key == null || mappingFunction == null) + throw new NullPointerException(); + return (V)internalComputeIfAbsent(key, mappingFunction); + } + + /** + * If the given key is present, computes a new mapping value given a key and + * its current mapped value. This is equivalent to + * <pre> {@code + * if (map.containsKey(key)) { + * value = remappingFunction.apply(key, map.get(key)); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * } + * }</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. For example, + * to either create or append new messages to a value mapping: + * + * @param key key with which the specified value is to be associated + * @param remappingFunction the function to compute a value + * @return the new value associated with the specified key, or null if none + * @throws NullPointerException if the specified key or remappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the remappingFunction does so, + * in which case the mapping is unchanged + */ + @SuppressWarnings("unchecked") public V computeIfPresent + (K key, BiFun<? super K, ? super V, ? extends V> remappingFunction) { + if (key == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalCompute(key, true, remappingFunction); + } + + /** + * Computes a new mapping value given a key and + * its current mapped value (or {@code null} if there is no current + * mapping). This is equivalent to + * <pre> {@code + * value = remappingFunction.apply(key, map.get(key)); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * }</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. For example, + * to either create or append new messages to a value mapping: + * + * <pre> {@code + * Map<Key, String> map = ...; + * final String msg = ...; + * map.compute(key, new BiFun<Key, String, String>() { + * public String apply(Key k, String v) { + * return (v == null) ? msg : v + msg;});}}</pre> + * + * @param key key with which the specified value is to be associated + * @param remappingFunction the function to compute a value + * @return the new value associated with the specified key, or null if none + * @throws NullPointerException if the specified key or remappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the remappingFunction does so, + * in which case the mapping is unchanged + */ + @SuppressWarnings("unchecked") public V compute + (K key, BiFun<? super K, ? super V, ? extends V> remappingFunction) { + if (key == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalCompute(key, false, remappingFunction); + } + + /** + * If the specified key is not already associated + * with a value, associate it with the given value. + * Otherwise, replace the value with the results of + * the given remapping function. This is equivalent to: + * <pre> {@code + * if (!map.containsKey(key)) + * map.put(value); + * else { + * newValue = remappingFunction.apply(map.get(key), value); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * } + * }</pre> + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. + */ + @SuppressWarnings("unchecked") public V merge + (K key, V value, BiFun<? super V, ? super V, ? extends V> remappingFunction) { + if (key == null || value == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalMerge(key, value, remappingFunction); + } + + /** + * Removes the key (and its corresponding value) from this map. + * This method does nothing if the key is not in the map. + * + * @param key the key that needs to be removed + * @return the previous value associated with {@code key}, or + * {@code null} if there was no mapping for {@code key} + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V remove(Object key) { + if (key == null) + throw new NullPointerException(); + return (V)internalReplace(key, null, null); + } + + /** + * {@inheritDoc} + * + * @throws NullPointerException if the specified key is null + */ + public boolean remove(Object key, Object value) { + if (key == null) + throw new NullPointerException(); + if (value == null) + return false; + return internalReplace(key, null, value) != null; + } + + /** + * {@inheritDoc} + * + * @throws NullPointerException if any of the arguments are null + */ + public boolean replace(K key, V oldValue, V newValue) { + if (key == null || oldValue == null || newValue == null) + throw new NullPointerException(); + return internalReplace(key, newValue, oldValue) != null; + } + + /** + * {@inheritDoc} + * + * @return the previous value associated with the specified key, + * or {@code null} if there was no mapping for the key + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V replace(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalReplace(key, value, null); + } + + /** + * Removes all of the mappings from this map. + */ + public void clear() { + internalClear(); + } + + /** + * Returns a {@link Set} view of the keys contained in this map. + * The set is backed by the map, so changes to the map are + * reflected in the set, and vice-versa. + * + * @return the set view + */ + public KeySetView<K,V> keySet() { + KeySetView<K,V> ks = keySet; + return (ks != null) ? ks : (keySet = new KeySetView<K,V>(this, null)); + } + + /** + * Returns a {@link Set} view of the keys in this map, using the + * given common mapped value for any additions (i.e., {@link + * Collection#add} and {@link Collection#addAll}). This is of + * course only appropriate if it is acceptable to use the same + * value for all additions from this view. + * + * @param mappedValue the mapped value to use for any + * additions. + * @return the set view + * @throws NullPointerException if the mappedValue is null + */ + public KeySetView<K,V> keySet(V mappedValue) { + if (mappedValue == null) + throw new NullPointerException(); + return new KeySetView<K,V>(this, mappedValue); + } + + /** + * Returns a {@link Collection} view of the values contained in this map. + * The collection is backed by the map, so changes to the map are + * reflected in the collection, and vice-versa. + */ + public ValuesView<K,V> values() { + ValuesView<K,V> vs = values; + return (vs != null) ? vs : (values = new ValuesView<K,V>(this)); + } + + /** + * Returns a {@link Set} view of the mappings contained in this map. + * The set is backed by the map, so changes to the map are + * reflected in the set, and vice-versa. The set supports element + * removal, which removes the corresponding mapping from the map, + * via the {@code Iterator.remove}, {@code Set.remove}, + * {@code removeAll}, {@code retainAll}, and {@code clear} + * operations. It does not support the {@code add} or + * {@code addAll} operations. + * + * <p>The view's {@code iterator} is a "weakly consistent" iterator + * that will never throw {@link ConcurrentModificationException}, + * and guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not guaranteed to) + * reflect any modifications subsequent to construction. + */ + public Set<Map.Entry<K,V>> entrySet() { + EntrySetView<K,V> es = entrySet; + return (es != null) ? es : (entrySet = new EntrySetView<K,V>(this)); + } + + /** + * Returns an enumeration of the keys in this table. + * + * @return an enumeration of the keys in this table + * @see #keySet() + */ + public Enumeration<K> keys() { + return new KeyIterator<K,V>(this); + } + + /** + * Returns an enumeration of the values in this table. + * + * @return an enumeration of the values in this table + * @see #values() + */ + public Enumeration<V> elements() { + return new ValueIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the keys in this map. + * + * @return a partitionable iterator of the keys in this map + */ + public Spliterator<K> keySpliterator() { + return new KeyIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the values in this map. + * + * @return a partitionable iterator of the values in this map + */ + public Spliterator<V> valueSpliterator() { + return new ValueIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the entries in this map. + * + * @return a partitionable iterator of the entries in this map + */ + public Spliterator<Map.Entry<K,V>> entrySpliterator() { + return new EntryIterator<K,V>(this); + } + + /** + * Returns the hash code value for this {@link Map}, i.e., + * the sum of, for each key-value pair in the map, + * {@code key.hashCode() ^ value.hashCode()}. + * + * @return the hash code value for this map + */ + public int hashCode() { + int h = 0; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object v; + while ((v = it.advance()) != null) { + h += it.nextKey.hashCode() ^ v.hashCode(); + } + return h; + } + + /** + * Returns a string representation of this map. The string + * representation consists of a list of key-value mappings (in no + * particular order) enclosed in braces ("{@code {}}"). Adjacent + * mappings are separated by the characters {@code ", "} (comma + * and space). Each key-value mapping is rendered as the key + * followed by an equals sign ("{@code =}") followed by the + * associated value. + * + * @return a string representation of this map + */ + public String toString() { + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + StringBuilder sb = new StringBuilder(); + sb.append('{'); + Object v; + if ((v = it.advance()) != null) { + for (;;) { + Object k = it.nextKey; + sb.append(k == this ? "(this Map)" : k); + sb.append('='); + sb.append(v == this ? "(this Map)" : v); + if ((v = it.advance()) == null) + break; + sb.append(',').append(' '); + } + } + return sb.append('}').toString(); + } + + /** + * Compares the specified object with this map for equality. + * Returns {@code true} if the given object is a map with the same + * mappings as this map. This operation may return misleading + * results if either map is concurrently modified during execution + * of this method. + * + * @param o object to be compared for equality with this map + * @return {@code true} if the specified object is equal to this map + */ + public boolean equals(Object o) { + if (o != this) { + if (!(o instanceof Map)) + return false; + Map<?,?> m = (Map<?,?>) o; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object val; + while ((val = it.advance()) != null) { + Object v = m.get(it.nextKey); + if (v == null || (v != val && !v.equals(val))) + return false; + } + for (Map.Entry<?,?> e : m.entrySet()) { + Object mk, mv, v; + if ((mk = e.getKey()) == null || + (mv = e.getValue()) == null || + (v = internalGet(mk)) == null || + (mv != v && !mv.equals(v))) + return false; + } + } + return true; + } + + /* ----------------Iterators -------------- */ + + @SuppressWarnings("serial") static final class KeyIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<K>, Enumeration<K> { + KeyIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + KeyIterator(Traverser<K,V,Object> it) { + super(it); + } + public KeyIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new KeyIterator<K,V>(this); + } + @SuppressWarnings("unchecked") public final K next() { + if (nextVal == null && advance() == null) + throw new NoSuchElementException(); + Object k = nextKey; + nextVal = null; + return (K) k; + } + + public final K nextElement() { return next(); } + } + + @SuppressWarnings("serial") static final class ValueIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<V>, Enumeration<V> { + ValueIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + ValueIterator(Traverser<K,V,Object> it) { + super(it); + } + public ValueIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new ValueIterator<K,V>(this); + } + + @SuppressWarnings("unchecked") public final V next() { + Object v; + if ((v = nextVal) == null && (v = advance()) == null) + throw new NoSuchElementException(); + nextVal = null; + return (V) v; + } + + public final V nextElement() { return next(); } + } + + @SuppressWarnings("serial") static final class EntryIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<Map.Entry<K,V>> { + EntryIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + EntryIterator(Traverser<K,V,Object> it) { + super(it); + } + public EntryIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new EntryIterator<K,V>(this); + } + + @SuppressWarnings("unchecked") public final Map.Entry<K,V> next() { + Object v; + if ((v = nextVal) == null && (v = advance()) == null) + throw new NoSuchElementException(); + Object k = nextKey; + nextVal = null; + return new MapEntry<K,V>((K)k, (V)v, map); + } + } + + /** + * Exported Entry for iterators + */ + static final class MapEntry<K,V> implements Map.Entry<K, V> { + final K key; // non-null + V val; // non-null + final ConcurrentHashMapV8<K, V> map; + MapEntry(K key, V val, ConcurrentHashMapV8<K, V> map) { + this.key = key; + this.val = val; + this.map = map; + } + public final K getKey() { return key; } + public final V getValue() { return val; } + public final int hashCode() { return key.hashCode() ^ val.hashCode(); } + public final String toString(){ return key + "=" + val; } + + public final boolean equals(Object o) { + Object k, v; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (v = e.getValue()) != null && + (k == key || k.equals(key)) && + (v == val || v.equals(val))); + } + + /** + * Sets our entry's value and writes through to the map. The + * value to return is somewhat arbitrary here. Since we do not + * necessarily track asynchronous changes, the most recent + * "previous" value could be different from what we return (or + * could even have been removed in which case the put will + * re-establish). We do not and cannot guarantee more. + */ + public final V setValue(V value) { + if (value == null) throw new NullPointerException(); + V v = val; + val = value; + map.put(key, value); + return v; + } + } + + /* ---------------- Serialization Support -------------- */ + + /** + * Stripped-down version of helper class used in previous version, + * declared for the sake of serialization compatibility + */ + static class Segment<K,V> implements Serializable { + private static final long serialVersionUID = 2249069246763182397L; + final float loadFactor; + Segment(float lf) { this.loadFactor = lf; } + } + + /** + * Saves the state of the {@code ConcurrentHashMapV8} instance to a + * stream (i.e., serializes it). + * @param s the stream + * @serialData + * the key (Object) and value (Object) + * for each key-value mapping, followed by a null pair. + * The key-value mappings are emitted in no particular order. + */ + @SuppressWarnings("unchecked") private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException { + if (segments == null) { // for serialization compatibility + segments = (Segment<K,V>[]) + new Segment<?,?>[DEFAULT_CONCURRENCY_LEVEL]; + for (int i = 0; i < segments.length; ++i) + segments[i] = new Segment<K,V>(LOAD_FACTOR); + } + s.defaultWriteObject(); + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object v; + while ((v = it.advance()) != null) { + s.writeObject(it.nextKey); + s.writeObject(v); + } + s.writeObject(null); + s.writeObject(null); + segments = null; // throw away + } + + /** + * Reconstitutes the instance from a stream (that is, deserializes it). + * @param s the stream + */ + @SuppressWarnings("unchecked") private void readObject(java.io.ObjectInputStream s) + throws java.io.IOException, ClassNotFoundException { + s.defaultReadObject(); + this.segments = null; // unneeded + // initialize transient final field + UNSAFE.putObjectVolatile(this, counterOffset, new LongAdder()); + + // Create all nodes, then place in table once size is known + long size = 0L; + Node p = null; + for (;;) { + K k = (K) s.readObject(); + V v = (V) s.readObject(); + if (k != null && v != null) { + int h = spread(k.hashCode()); + p = new Node(h, k, v, p); + ++size; + } + else + break; + } + if (p != null) { + boolean init = false; + int n; + if (size >= (long)(MAXIMUM_CAPACITY >>> 1)) + n = MAXIMUM_CAPACITY; + else { + int sz = (int)size; + n = tableSizeFor(sz + (sz >>> 1) + 1); + } + int sc = sizeCtl; + boolean collide = false; + if (n > sc && + UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if (table == null) { + init = true; + Node[] tab = new Node[n]; + int mask = n - 1; + while (p != null) { + int j = p.hash & mask; + Node next = p.next; + Node q = p.next = tabAt(tab, j); + setTabAt(tab, j, p); + if (!collide && q != null && q.hash == p.hash) + collide = true; + p = next; + } + table = tab; + counter.add(size); + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + if (collide) { // rescan and convert to TreeBins + Node[] tab = table; + for (int i = 0; i < tab.length; ++i) { + int c = 0; + for (Node e = tabAt(tab, i); e != null; e = e.next) { + if (++c > TREE_THRESHOLD && + (e.key instanceof Comparable)) { + replaceWithTreeBin(tab, i, e.key); + break; + } + } + } + } + } + if (!init) { // Can only happen if unsafely published. + while (p != null) { + internalPut(p.key, p.val); + p = p.next; + } + } + } + } + + + // ------------------------------------------------------- + + // Sams + /** Interface describing a void action of one argument */ + public interface Action<A> { void apply(A a); } + /** Interface describing a void action of two arguments */ + public interface BiAction<A,B> { void apply(A a, B b); } + /** Interface describing a function of one argument */ + public interface Generator<T> { T apply(); } + /** Interface describing a function mapping its argument to a double */ + public interface ObjectToDouble<A> { double apply(A a); } + /** Interface describing a function mapping its argument to a long */ + public interface ObjectToLong<A> { long apply(A a); } + /** Interface describing a function mapping its argument to an int */ + public interface ObjectToInt<A> {int apply(A a); } + /** Interface describing a function mapping two arguments to a double */ + public interface ObjectByObjectToDouble<A,B> { double apply(A a, B b); } + /** Interface describing a function mapping two arguments to a long */ + public interface ObjectByObjectToLong<A,B> { long apply(A a, B b); } + /** Interface describing a function mapping two arguments to an int */ + public interface ObjectByObjectToInt<A,B> {int apply(A a, B b); } + /** Interface describing a function mapping a double to a double */ + public interface DoubleToDouble { double apply(double a); } + /** Interface describing a function mapping a long to a long */ + public interface LongToLong { long apply(long a); } + /** Interface describing a function mapping an int to an int */ + public interface IntToInt { int apply(int a); } + /** Interface describing a function mapping two doubles to a double */ + public interface DoubleByDoubleToDouble { double apply(double a, double b); } + /** Interface describing a function mapping two longs to a long */ + public interface LongByLongToLong { long apply(long a, long b); } + /** Interface describing a function mapping two ints to an int */ + public interface IntByIntToInt { int apply(int a, int b); } + + + /* ----------------Views -------------- */ + + /** + * Base class for views. + */ + static abstract class CHMView<K, V> { + final ConcurrentHashMapV8<K, V> map; + CHMView(ConcurrentHashMapV8<K, V> map) { this.map = map; } + + /** + * Returns the map backing this view. + * + * @return the map backing this view + */ + public ConcurrentHashMapV8<K,V> getMap() { return map; } + + public final int size() { return map.size(); } + public final boolean isEmpty() { return map.isEmpty(); } + public final void clear() { map.clear(); } + + // implementations below rely on concrete classes supplying these + abstract public Iterator<?> iterator(); + abstract public boolean contains(Object o); + abstract public boolean remove(Object o); + + private static final String oomeMsg = "Required array size too large"; + + public final Object[] toArray() { + long sz = map.mappingCount(); + if (sz > (long)(MAX_ARRAY_SIZE)) + throw new OutOfMemoryError(oomeMsg); + int n = (int)sz; + Object[] r = new Object[n]; + int i = 0; + Iterator<?> it = iterator(); + while (it.hasNext()) { + if (i == n) { + if (n >= MAX_ARRAY_SIZE) + throw new OutOfMemoryError(oomeMsg); + if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) + n = MAX_ARRAY_SIZE; + else + n += (n >>> 1) + 1; + r = Arrays.copyOf(r, n); + } + r[i++] = it.next(); + } + return (i == n) ? r : Arrays.copyOf(r, i); + } + + @SuppressWarnings("unchecked") public final <T> T[] toArray(T[] a) { + long sz = map.mappingCount(); + if (sz > (long)(MAX_ARRAY_SIZE)) + throw new OutOfMemoryError(oomeMsg); + int m = (int)sz; + T[] r = (a.length >= m) ? a : + (T[])java.lang.reflect.Array + .newInstance(a.getClass().getComponentType(), m); + int n = r.length; + int i = 0; + Iterator<?> it = iterator(); + while (it.hasNext()) { + if (i == n) { + if (n >= MAX_ARRAY_SIZE) + throw new OutOfMemoryError(oomeMsg); + if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) + n = MAX_ARRAY_SIZE; + else + n += (n >>> 1) + 1; + r = Arrays.copyOf(r, n); + } + r[i++] = (T)it.next(); + } + if (a == r && i < n) { + r[i] = null; // null-terminate + return r; + } + return (i == n) ? r : Arrays.copyOf(r, i); + } + + public final int hashCode() { + int h = 0; + for (Iterator<?> it = iterator(); it.hasNext();) + h += it.next().hashCode(); + return h; + } + + public final String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + Iterator<?> it = iterator(); + if (it.hasNext()) { + for (;;) { + Object e = it.next(); + sb.append(e == this ? "(this Collection)" : e); + if (!it.hasNext()) + break; + sb.append(',').append(' '); + } + } + return sb.append(']').toString(); + } + + public final boolean containsAll(Collection<?> c) { + if (c != this) { + for (Iterator<?> it = c.iterator(); it.hasNext();) { + Object e = it.next(); + if (e == null || !contains(e)) + return false; + } + } + return true; + } + + public final boolean removeAll(Collection<?> c) { + boolean modified = false; + for (Iterator<?> it = iterator(); it.hasNext();) { + if (c.contains(it.next())) { + it.remove(); + modified = true; + } + } + return modified; + } + + public final boolean retainAll(Collection<?> c) { + boolean modified = false; + for (Iterator<?> it = iterator(); it.hasNext();) { + if (!c.contains(it.next())) { + it.remove(); + modified = true; + } + } + return modified; + } + + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Set} of keys, in + * which additions may optionally be enabled by mapping to a + * common value. This class cannot be directly instantiated. See + * {@link #keySet}, {@link #keySet(Object)}, {@link #newKeySet()}, + * {@link #newKeySet(int)}. + */ + public static class KeySetView<K,V> extends CHMView<K,V> implements Set<K>, java.io.Serializable { + private static final long serialVersionUID = 7249069246763182397L; + private final V value; + KeySetView(ConcurrentHashMapV8<K, V> map, V value) { // non-public + super(map); + this.value = value; + } + + /** + * Returns the default mapped value for additions, + * or {@code null} if additions are not supported. + * + * @return the default mapped value for additions, or {@code null} + * if not supported. + */ + public V getMappedValue() { return value; } + + // implement Set API + + public boolean contains(Object o) { return map.containsKey(o); } + public boolean remove(Object o) { return map.remove(o) != null; } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the keys of this map + */ + public Iterator<K> iterator() { return new KeyIterator<K,V>(map); } + public boolean add(K e) { + V v; + if ((v = value) == null) + throw new UnsupportedOperationException(); + if (e == null) + throw new NullPointerException(); + return map.internalPutIfAbsent(e, v) == null; + } + public boolean addAll(Collection<? extends K> c) { + boolean added = false; + V v; + if ((v = value) == null) + throw new UnsupportedOperationException(); + for (K e : c) { + if (e == null) + throw new NullPointerException(); + if (map.internalPutIfAbsent(e, v) == null) + added = true; + } + return added; + } + public boolean equals(Object o) { + Set<?> c; + return ((o instanceof Set) && + ((c = (Set<?>)o) == this || + (containsAll(c) && c.containsAll(this)))); + } + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Collection} of + * values, in which additions are disabled. This class cannot be + * directly instantiated. See {@link #values}, + * + * <p>The view's {@code iterator} is a "weakly consistent" iterator + * that will never throw {@link ConcurrentModificationException}, + * and guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not guaranteed to) + * reflect any modifications subsequent to construction. + */ + public static final class ValuesView<K,V> extends CHMView<K,V> + implements Collection<V> { + ValuesView(ConcurrentHashMapV8<K, V> map) { super(map); } + public final boolean contains(Object o) { return map.containsValue(o); } + public final boolean remove(Object o) { + if (o != null) { + Iterator<V> it = new ValueIterator<K,V>(map); + while (it.hasNext()) { + if (o.equals(it.next())) { + it.remove(); + return true; + } + } + } + return false; + } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the values of this map + */ + public final Iterator<V> iterator() { + return new ValueIterator<K,V>(map); + } + public final boolean add(V e) { + throw new UnsupportedOperationException(); + } + public final boolean addAll(Collection<? extends V> c) { + throw new UnsupportedOperationException(); + } + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Set} of (key, value) + * entries. This class cannot be directly instantiated. See + * {@link #entrySet}. + */ + public static final class EntrySetView<K,V> extends CHMView<K,V> + implements Set<Map.Entry<K,V>> { + EntrySetView(ConcurrentHashMapV8<K, V> map) { super(map); } + public final boolean contains(Object o) { + Object k, v, r; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (r = map.get(k)) != null && + (v = e.getValue()) != null && + (v == r || v.equals(r))); + } + public final boolean remove(Object o) { + Object k, v; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (v = e.getValue()) != null && + map.remove(k, v)); + } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the entries of this map + */ + public final Iterator<Map.Entry<K,V>> iterator() { + return new EntryIterator<K,V>(map); + } + + public final boolean add(Entry<K,V> e) { + K key = e.getKey(); + V value = e.getValue(); + if (key == null || value == null) + throw new NullPointerException(); + return map.internalPut(key, value) == null; + } + public final boolean addAll(Collection<? extends Entry<K,V>> c) { + boolean added = false; + for (Entry<K,V> e : c) { + if (add(e)) + added = true; + } + return added; + } + public boolean equals(Object o) { + Set<?> c; + return ((o instanceof Set) && + ((c = (Set<?>)o) == this || + (containsAll(c) && c.containsAll(this)))); + } + } + + // Unsafe mechanics + private static final sun.misc.Unsafe UNSAFE; + private static final long counterOffset; + private static final long sizeCtlOffset; + private static final long ABASE; + private static final int ASHIFT; + + static { + int ss; + try { + UNSAFE = getUnsafe(); + Class<?> k = ConcurrentHashMapV8.class; + counterOffset = UNSAFE.objectFieldOffset + (k.getDeclaredField("counter")); + sizeCtlOffset = UNSAFE.objectFieldOffset + (k.getDeclaredField("sizeCtl")); + Class<?> sc = Node[].class; + ABASE = UNSAFE.arrayBaseOffset(sc); + ss = UNSAFE.arrayIndexScale(sc); + } catch (Exception e) { + throw new Error(e); + } + if ((ss & (ss-1)) != 0) + throw new Error("data type scale not a power of two"); + ASHIFT = 31 - Integer.numberOfLeadingZeros(ss); + } + + /** + * Returns a sun.misc.Unsafe. Suitable for use in a 3rd party package. + * Replace with a simple call to Unsafe.getUnsafe when integrating + * into a jdk. + * + * @return a sun.misc.Unsafe + */ + private static sun.misc.Unsafe getUnsafe() { + try { + return sun.misc.Unsafe.getUnsafe(); + } catch (SecurityException se) { + try { + return java.security.AccessController.doPrivileged + (new java.security + .PrivilegedExceptionAction<sun.misc.Unsafe>() { + public sun.misc.Unsafe run() throws Exception { + java.lang.reflect.Field f = sun.misc + .Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + return (sun.misc.Unsafe) f.get(null); + }}); + } catch (java.security.PrivilegedActionException e) { + throw new RuntimeException("Could not initialize intrinsics", + e.getCause()); + } + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/LongAdder.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/LongAdder.java new file mode 100644 index 000000000000..47a923c8d6bd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/LongAdder.java @@ -0,0 +1,203 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.9 version. + +package com.concurrent_ruby.ext.jsr166e; +import java.util.concurrent.atomic.AtomicLong; +import java.io.IOException; +import java.io.Serializable; +import java.io.ObjectInputStream; + +/** + * One or more variables that together maintain an initially zero + * {@code long} sum. When updates (method {@link #add}) are contended + * across threads, the set of variables may grow dynamically to reduce + * contention. Method {@link #sum} (or, equivalently, {@link + * #longValue}) returns the current total combined across the + * variables maintaining the sum. + * + * <p>This class is usually preferable to {@link AtomicLong} when + * multiple threads update a common sum that is used for purposes such + * as collecting statistics, not for fine-grained synchronization + * control. Under low update contention, the two classes have similar + * characteristics. But under high contention, expected throughput of + * this class is significantly higher, at the expense of higher space + * consumption. + * + * <p>This class extends {@link Number}, but does <em>not</em> define + * methods such as {@code hashCode} and {@code compareTo} because + * instances are expected to be mutated, and so are not useful as + * collection keys. + * + * <p><em>jsr166e note: This class is targeted to be placed in + * java.util.concurrent.atomic.</em> + * + * @since 1.8 + * @author Doug Lea + */ +public class LongAdder extends Striped64 implements Serializable { + private static final long serialVersionUID = 7249069246863182397L; + + /** + * Version of plus for use in retryUpdate + */ + final long fn(long v, long x) { return v + x; } + + /** + * Creates a new adder with initial sum of zero. + */ + public LongAdder() { + } + + /** + * Adds the given value. + * + * @param x the value to add + */ + public void add(long x) { + Cell[] as; long b, v; HashCode hc; Cell a; int n; + if ((as = cells) != null || !casBase(b = base, b + x)) { + boolean uncontended = true; + int h = (hc = threadHashCode.get()).code; + if (as == null || (n = as.length) < 1 || + (a = as[(n - 1) & h]) == null || + !(uncontended = a.cas(v = a.value, v + x))) + retryUpdate(x, hc, uncontended); + } + } + + /** + * Equivalent to {@code add(1)}. + */ + public void increment() { + add(1L); + } + + /** + * Equivalent to {@code add(-1)}. + */ + public void decrement() { + add(-1L); + } + + /** + * Returns the current sum. The returned value is <em>NOT</em> an + * atomic snapshot: Invocation in the absence of concurrent + * updates returns an accurate result, but concurrent updates that + * occur while the sum is being calculated might not be + * incorporated. + * + * @return the sum + */ + public long sum() { + long sum = base; + Cell[] as = cells; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) + sum += a.value; + } + } + return sum; + } + + /** + * Resets variables maintaining the sum to zero. This method may + * be a useful alternative to creating a new adder, but is only + * effective if there are no concurrent updates. Because this + * method is intrinsically racy, it should only be used when it is + * known that no threads are concurrently updating. + */ + public void reset() { + internalReset(0L); + } + + /** + * Equivalent in effect to {@link #sum} followed by {@link + * #reset}. This method may apply for example during quiescent + * points between multithreaded computations. If there are + * updates concurrent with this method, the returned value is + * <em>not</em> guaranteed to be the final value occurring before + * the reset. + * + * @return the sum + */ + public long sumThenReset() { + long sum = base; + Cell[] as = cells; + base = 0L; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) { + sum += a.value; + a.value = 0L; + } + } + } + return sum; + } + + /** + * Returns the String representation of the {@link #sum}. + * @return the String representation of the {@link #sum} + */ + public String toString() { + return Long.toString(sum()); + } + + /** + * Equivalent to {@link #sum}. + * + * @return the sum + */ + public long longValue() { + return sum(); + } + + /** + * Returns the {@link #sum} as an {@code int} after a narrowing + * primitive conversion. + */ + public int intValue() { + return (int)sum(); + } + + /** + * Returns the {@link #sum} as a {@code float} + * after a widening primitive conversion. + */ + public float floatValue() { + return (float)sum(); + } + + /** + * Returns the {@link #sum} as a {@code double} after a widening + * primitive conversion. + */ + public double doubleValue() { + return (double)sum(); + } + + private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException { + s.defaultWriteObject(); + s.writeLong(sum()); + } + + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + busy = 0; + cells = null; + base = s.readLong(); + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/Striped64.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/Striped64.java new file mode 100644 index 000000000000..93a277fb3515 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/Striped64.java @@ -0,0 +1,342 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.5 version. + +package com.concurrent_ruby.ext.jsr166e; +import java.util.Random; + +/** + * A package-local class holding common representation and mechanics + * for classes supporting dynamic striping on 64bit values. The class + * extends Number so that concrete subclasses must publicly do so. + */ +abstract class Striped64 extends Number { + /* + * This class maintains a lazily-initialized table of atomically + * updated variables, plus an extra "base" field. The table size + * is a power of two. Indexing uses masked per-thread hash codes. + * Nearly all declarations in this class are package-private, + * accessed directly by subclasses. + * + * Table entries are of class Cell; a variant of AtomicLong padded + * to reduce cache contention on most processors. Padding is + * overkill for most Atomics because they are usually irregularly + * scattered in memory and thus don't interfere much with each + * other. But Atomic objects residing in arrays will tend to be + * placed adjacent to each other, and so will most often share + * cache lines (with a huge negative performance impact) without + * this precaution. + * + * In part because Cells are relatively large, we avoid creating + * them until they are needed. When there is no contention, all + * updates are made to the base field. Upon first contention (a + * failed CAS on base update), the table is initialized to size 2. + * The table size is doubled upon further contention until + * reaching the nearest power of two greater than or equal to the + * number of CPUS. Table slots remain empty (null) until they are + * needed. + * + * A single spinlock ("busy") is used for initializing and + * resizing the table, as well as populating slots with new Cells. + * There is no need for a blocking lock: When the lock is not + * available, threads try other slots (or the base). During these + * retries, there is increased contention and reduced locality, + * which is still better than alternatives. + * + * Per-thread hash codes are initialized to random values. + * Contention and/or table collisions are indicated by failed + * CASes when performing an update operation (see method + * retryUpdate). Upon a collision, if the table size is less than + * the capacity, it is doubled in size unless some other thread + * holds the lock. If a hashed slot is empty, and lock is + * available, a new Cell is created. Otherwise, if the slot + * exists, a CAS is tried. Retries proceed by "double hashing", + * using a secondary hash (Marsaglia XorShift) to try to find a + * free slot. + * + * The table size is capped because, when there are more threads + * than CPUs, supposing that each thread were bound to a CPU, + * there would exist a perfect hash function mapping threads to + * slots that eliminates collisions. When we reach capacity, we + * search for this mapping by randomly varying the hash codes of + * colliding threads. Because search is random, and collisions + * only become known via CAS failures, convergence can be slow, + * and because threads are typically not bound to CPUS forever, + * may not occur at all. However, despite these limitations, + * observed contention rates are typically low in these cases. + * + * It is possible for a Cell to become unused when threads that + * once hashed to it terminate, as well as in the case where + * doubling the table causes no thread to hash to it under + * expanded mask. We do not try to detect or remove such cells, + * under the assumption that for long-running instances, observed + * contention levels will recur, so the cells will eventually be + * needed again; and for short-lived ones, it does not matter. + */ + + /** + * Padded variant of AtomicLong supporting only raw accesses plus CAS. + * The value field is placed between pads, hoping that the JVM doesn't + * reorder them. + * + * JVM intrinsics note: It would be possible to use a release-only + * form of CAS here, if it were provided. + */ + static final class Cell { + volatile long p0, p1, p2, p3, p4, p5, p6; + volatile long value; + volatile long q0, q1, q2, q3, q4, q5, q6; + Cell(long x) { value = x; } + + final boolean cas(long cmp, long val) { + return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); + } + + // Unsafe mechanics + private static final sun.misc.Unsafe UNSAFE; + private static final long valueOffset; + static { + try { + UNSAFE = getUnsafe(); + Class<?> ak = Cell.class; + valueOffset = UNSAFE.objectFieldOffset + (ak.getDeclaredField("value")); + } catch (Exception e) { + throw new Error(e); + } + } + + } + + /** + * Holder for the thread-local hash code. The code is initially + * random, but may be set to a different value upon collisions. + */ + static final class HashCode { + static final Random rng = new Random(); + int code; + HashCode() { + int h = rng.nextInt(); // Avoid zero to allow xorShift rehash + code = (h == 0) ? 1 : h; + } + } + + /** + * The corresponding ThreadLocal class + */ + static final class ThreadHashCode extends ThreadLocal<HashCode> { + public HashCode initialValue() { return new HashCode(); } + } + + /** + * Static per-thread hash codes. Shared across all instances to + * reduce ThreadLocal pollution and because adjustments due to + * collisions in one table are likely to be appropriate for + * others. + */ + static final ThreadHashCode threadHashCode = new ThreadHashCode(); + + /** Number of CPUS, to place bound on table size */ + static final int NCPU = Runtime.getRuntime().availableProcessors(); + + /** + * Table of cells. When non-null, size is a power of 2. + */ + transient volatile Cell[] cells; + + /** + * Base value, used mainly when there is no contention, but also as + * a fallback during table initialization races. Updated via CAS. + */ + transient volatile long base; + + /** + * Spinlock (locked via CAS) used when resizing and/or creating Cells. + */ + transient volatile int busy; + + /** + * Package-private default constructor + */ + Striped64() { + } + + /** + * CASes the base field. + */ + final boolean casBase(long cmp, long val) { + return UNSAFE.compareAndSwapLong(this, baseOffset, cmp, val); + } + + /** + * CASes the busy field from 0 to 1 to acquire lock. + */ + final boolean casBusy() { + return UNSAFE.compareAndSwapInt(this, busyOffset, 0, 1); + } + + /** + * Computes the function of current and new value. Subclasses + * should open-code this update function for most uses, but the + * virtualized form is needed within retryUpdate. + * + * @param currentValue the current value (of either base or a cell) + * @param newValue the argument from a user update call + * @return result of the update function + */ + abstract long fn(long currentValue, long newValue); + + /** + * Handles cases of updates involving initialization, resizing, + * creating new Cells, and/or contention. See above for + * explanation. This method suffers the usual non-modularity + * problems of optimistic retry code, relying on rechecked sets of + * reads. + * + * @param x the value + * @param hc the hash code holder + * @param wasUncontended false if CAS failed before call + */ + final void retryUpdate(long x, HashCode hc, boolean wasUncontended) { + int h = hc.code; + boolean collide = false; // True if last slot nonempty + for (;;) { + Cell[] as; Cell a; int n; long v; + if ((as = cells) != null && (n = as.length) > 0) { + if ((a = as[(n - 1) & h]) == null) { + if (busy == 0) { // Try to attach new Cell + Cell r = new Cell(x); // Optimistically create + if (busy == 0 && casBusy()) { + boolean created = false; + try { // Recheck under lock + Cell[] rs; int m, j; + if ((rs = cells) != null && + (m = rs.length) > 0 && + rs[j = (m - 1) & h] == null) { + rs[j] = r; + created = true; + } + } finally { + busy = 0; + } + if (created) + break; + continue; // Slot is now non-empty + } + } + collide = false; + } + else if (!wasUncontended) // CAS already known to fail + wasUncontended = true; // Continue after rehash + else if (a.cas(v = a.value, fn(v, x))) + break; + else if (n >= NCPU || cells != as) + collide = false; // At max size or stale + else if (!collide) + collide = true; + else if (busy == 0 && casBusy()) { + try { + if (cells == as) { // Expand table unless stale + Cell[] rs = new Cell[n << 1]; + for (int i = 0; i < n; ++i) + rs[i] = as[i]; + cells = rs; + } + } finally { + busy = 0; + } + collide = false; + continue; // Retry with expanded table + } + h ^= h << 13; // Rehash + h ^= h >>> 17; + h ^= h << 5; + } + else if (busy == 0 && cells == as && casBusy()) { + boolean init = false; + try { // Initialize table + if (cells == as) { + Cell[] rs = new Cell[2]; + rs[h & 1] = new Cell(x); + cells = rs; + init = true; + } + } finally { + busy = 0; + } + if (init) + break; + } + else if (casBase(v = base, fn(v, x))) + break; // Fall back on using base + } + hc.code = h; // Record index for next time + } + + + /** + * Sets base and all cells to the given value. + */ + final void internalReset(long initialValue) { + Cell[] as = cells; + base = initialValue; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) + a.value = initialValue; + } + } + } + + // Unsafe mechanics + private static final sun.misc.Unsafe UNSAFE; + private static final long baseOffset; + private static final long busyOffset; + static { + try { + UNSAFE = getUnsafe(); + Class<?> sk = Striped64.class; + baseOffset = UNSAFE.objectFieldOffset + (sk.getDeclaredField("base")); + busyOffset = UNSAFE.objectFieldOffset + (sk.getDeclaredField("busy")); + } catch (Exception e) { + throw new Error(e); + } + } + + /** + * Returns a sun.misc.Unsafe. Suitable for use in a 3rd party package. + * Replace with a simple call to Unsafe.getUnsafe when integrating + * into a jdk. + * + * @return a sun.misc.Unsafe + */ + private static sun.misc.Unsafe getUnsafe() { + try { + return sun.misc.Unsafe.getUnsafe(); + } catch (SecurityException se) { + try { + return java.security.AccessController.doPrivileged + (new java.security + .PrivilegedExceptionAction<sun.misc.Unsafe>() { + public sun.misc.Unsafe run() throws Exception { + java.lang.reflect.Field f = sun.misc + .Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + return (sun.misc.Unsafe) f.get(null); + }}); + } catch (java.security.PrivilegedActionException e) { + throw new RuntimeException("Could not initialize intrinsics", + e.getCause()); + } + } + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/ConcurrentHashMapV8.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/ConcurrentHashMapV8.java new file mode 100644 index 000000000000..b7fc5a937597 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/ConcurrentHashMapV8.java @@ -0,0 +1,3800 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on the 1.79 version. + +package com.concurrent_ruby.ext.jsr166e.nounsafe; + +import org.jruby.RubyClass; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.exceptions.RaiseException; +import com.concurrent_ruby.ext.jsr166e.ConcurrentHashMap; +import com.concurrent_ruby.ext.jsr166y.ThreadLocalRandom; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import java.util.Arrays; +import java.util.Map; +import java.util.Set; +import java.util.Collection; +import java.util.Hashtable; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Enumeration; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.concurrent.atomic.AtomicReferenceArray; +import java.util.concurrent.locks.AbstractQueuedSynchronizer; + +import java.io.Serializable; + +/** + * A hash table supporting full concurrency of retrievals and + * high expected concurrency for updates. This class obeys the + * same functional specification as {@link java.util.Hashtable}, and + * includes versions of methods corresponding to each method of + * {@code Hashtable}. However, even though all operations are + * thread-safe, retrieval operations do <em>not</em> entail locking, + * and there is <em>not</em> any support for locking the entire table + * in a way that prevents all access. This class is fully + * interoperable with {@code Hashtable} in programs that rely on its + * thread safety but not on its synchronization details. + * + * <p>Retrieval operations (including {@code get}) generally do not + * block, so may overlap with update operations (including {@code put} + * and {@code remove}). Retrievals reflect the results of the most + * recently <em>completed</em> update operations holding upon their + * onset. (More formally, an update operation for a given key bears a + * <em>happens-before</em> relation with any (non-null) retrieval for + * that key reporting the updated value.) For aggregate operations + * such as {@code putAll} and {@code clear}, concurrent retrievals may + * reflect insertion or removal of only some entries. Similarly, + * Iterators and Enumerations return elements reflecting the state of + * the hash table at some point at or since the creation of the + * iterator/enumeration. They do <em>not</em> throw {@link + * ConcurrentModificationException}. However, iterators are designed + * to be used by only one thread at a time. Bear in mind that the + * results of aggregate status methods including {@code size}, {@code + * isEmpty}, and {@code containsValue} are typically useful only when + * a map is not undergoing concurrent updates in other threads. + * Otherwise the results of these methods reflect transient states + * that may be adequate for monitoring or estimation purposes, but not + * for program control. + * + * <p>The table is dynamically expanded when there are too many + * collisions (i.e., keys that have distinct hash codes but fall into + * the same slot modulo the table size), with the expected average + * effect of maintaining roughly two bins per mapping (corresponding + * to a 0.75 load factor threshold for resizing). There may be much + * variance around this average as mappings are added and removed, but + * overall, this maintains a commonly accepted time/space tradeoff for + * hash tables. However, resizing this or any other kind of hash + * table may be a relatively slow operation. When possible, it is a + * good idea to provide a size estimate as an optional {@code + * initialCapacity} constructor argument. An additional optional + * {@code loadFactor} constructor argument provides a further means of + * customizing initial table capacity by specifying the table density + * to be used in calculating the amount of space to allocate for the + * given number of elements. Also, for compatibility with previous + * versions of this class, constructors may optionally specify an + * expected {@code concurrencyLevel} as an additional hint for + * internal sizing. Note that using many keys with exactly the same + * {@code hashCode()} is a sure way to slow down performance of any + * hash table. + * + * <p>A {@link Set} projection of a ConcurrentHashMapV8 may be created + * (using {@link #newKeySet()} or {@link #newKeySet(int)}), or viewed + * (using {@link #keySet(Object)} when only keys are of interest, and the + * mapped values are (perhaps transiently) not used or all take the + * same mapping value. + * + * <p>A ConcurrentHashMapV8 can be used as scalable frequency map (a + * form of histogram or multiset) by using {@link LongAdder} values + * and initializing via {@link #computeIfAbsent}. For example, to add + * a count to a {@code ConcurrentHashMapV8<String,LongAdder> freqs}, you + * can use {@code freqs.computeIfAbsent(k -> new + * LongAdder()).increment();} + * + * <p>This class and its views and iterators implement all of the + * <em>optional</em> methods of the {@link Map} and {@link Iterator} + * interfaces. + * + * <p>Like {@link Hashtable} but unlike {@link HashMap}, this class + * does <em>not</em> allow {@code null} to be used as a key or value. + * + * <p>ConcurrentHashMapV8s support parallel operations using the {@link + * ForkJoinPool#commonPool}. (Tasks that may be used in other contexts + * are available in class {@link ForkJoinTasks}). These operations are + * designed to be safely, and often sensibly, applied even with maps + * that are being concurrently updated by other threads; for example, + * when computing a snapshot summary of the values in a shared + * registry. There are three kinds of operation, each with four + * forms, accepting functions with Keys, Values, Entries, and (Key, + * Value) arguments and/or return values. (The first three forms are + * also available via the {@link #keySet()}, {@link #values()} and + * {@link #entrySet()} views). Because the elements of a + * ConcurrentHashMapV8 are not ordered in any particular way, and may be + * processed in different orders in different parallel executions, the + * correctness of supplied functions should not depend on any + * ordering, or on any other objects or values that may transiently + * change while computation is in progress; and except for forEach + * actions, should ideally be side-effect-free. + * + * <ul> + * <li> forEach: Perform a given action on each element. + * A variant form applies a given transformation on each element + * before performing the action.</li> + * + * <li> search: Return the first available non-null result of + * applying a given function on each element; skipping further + * search when a result is found.</li> + * + * <li> reduce: Accumulate each element. The supplied reduction + * function cannot rely on ordering (more formally, it should be + * both associative and commutative). There are five variants: + * + * <ul> + * + * <li> Plain reductions. (There is not a form of this method for + * (key, value) function arguments since there is no corresponding + * return type.)</li> + * + * <li> Mapped reductions that accumulate the results of a given + * function applied to each element.</li> + * + * <li> Reductions to scalar doubles, longs, and ints, using a + * given basis value.</li> + * + * </li> + * </ul> + * </ul> + * + * <p>The concurrency properties of bulk operations follow + * from those of ConcurrentHashMapV8: Any non-null result returned + * from {@code get(key)} and related access methods bears a + * happens-before relation with the associated insertion or + * update. The result of any bulk operation reflects the + * composition of these per-element relations (but is not + * necessarily atomic with respect to the map as a whole unless it + * is somehow known to be quiescent). Conversely, because keys + * and values in the map are never null, null serves as a reliable + * atomic indicator of the current lack of any result. To + * maintain this property, null serves as an implicit basis for + * all non-scalar reduction operations. For the double, long, and + * int versions, the basis should be one that, when combined with + * any other value, returns that other value (more formally, it + * should be the identity element for the reduction). Most common + * reductions have these properties; for example, computing a sum + * with basis 0 or a minimum with basis MAX_VALUE. + * + * <p>Search and transformation functions provided as arguments + * should similarly return null to indicate the lack of any result + * (in which case it is not used). In the case of mapped + * reductions, this also enables transformations to serve as + * filters, returning null (or, in the case of primitive + * specializations, the identity basis) if the element should not + * be combined. You can create compound transformations and + * filterings by composing them yourself under this "null means + * there is nothing there now" rule before using them in search or + * reduce operations. + * + * <p>Methods accepting and/or returning Entry arguments maintain + * key-value associations. They may be useful for example when + * finding the key for the greatest value. Note that "plain" Entry + * arguments can be supplied using {@code new + * AbstractMap.SimpleEntry(k,v)}. + * + * <p>Bulk operations may complete abruptly, throwing an + * exception encountered in the application of a supplied + * function. Bear in mind when handling such exceptions that other + * concurrently executing functions could also have thrown + * exceptions, or would have done so if the first exception had + * not occurred. + * + * <p>Parallel speedups for bulk operations compared to sequential + * processing are common but not guaranteed. Operations involving + * brief functions on small maps may execute more slowly than + * sequential loops if the underlying work to parallelize the + * computation is more expensive than the computation itself. + * Similarly, parallelization may not lead to much actual parallelism + * if all processors are busy performing unrelated tasks. + * + * <p>All arguments to all task methods must be non-null. + * + * <p><em>jsr166e note: During transition, this class + * uses nested functional interfaces with different names but the + * same forms as those expected for JDK8.</em> + * + * <p>This class is a member of the + * <a href="{@docRoot}/../technotes/guides/collections/index.html"> + * Java Collections Framework</a>. + * + * @since 1.5 + * @author Doug Lea + * @param <K> the type of keys maintained by this map + * @param <V> the type of mapped values + */ +public class ConcurrentHashMapV8<K, V> + implements ConcurrentMap<K, V>, Serializable, ConcurrentHashMap<K, V> { + private static final long serialVersionUID = 7249069246763182397L; + + /** + * A partitionable iterator. A Spliterator can be traversed + * directly, but can also be partitioned (before traversal) by + * creating another Spliterator that covers a non-overlapping + * portion of the elements, and so may be amenable to parallel + * execution. + * + * <p>This interface exports a subset of expected JDK8 + * functionality. + * + * <p>Sample usage: Here is one (of the several) ways to compute + * the sum of the values held in a map using the ForkJoin + * framework. As illustrated here, Spliterators are well suited to + * designs in which a task repeatedly splits off half its work + * into forked subtasks until small enough to process directly, + * and then joins these subtasks. Variants of this style can also + * be used in completion-based designs. + * + * <pre> + * {@code ConcurrentHashMapV8<String, Long> m = ... + * // split as if have 8 * parallelism, for load balance + * int n = m.size(); + * int p = aForkJoinPool.getParallelism() * 8; + * int split = (n < p)? n : p; + * long sum = aForkJoinPool.invoke(new SumValues(m.valueSpliterator(), split, null)); + * // ... + * static class SumValues extends RecursiveTask<Long> { + * final Spliterator<Long> s; + * final int split; // split while > 1 + * final SumValues nextJoin; // records forked subtasks to join + * SumValues(Spliterator<Long> s, int depth, SumValues nextJoin) { + * this.s = s; this.depth = depth; this.nextJoin = nextJoin; + * } + * public Long compute() { + * long sum = 0; + * SumValues subtasks = null; // fork subtasks + * for (int s = split >>> 1; s > 0; s >>>= 1) + * (subtasks = new SumValues(s.split(), s, subtasks)).fork(); + * while (s.hasNext()) // directly process remaining elements + * sum += s.next(); + * for (SumValues t = subtasks; t != null; t = t.nextJoin) + * sum += t.join(); // collect subtask results + * return sum; + * } + * } + * }</pre> + */ + public static interface Spliterator<T> extends Iterator<T> { + /** + * Returns a Spliterator covering approximately half of the + * elements, guaranteed not to overlap with those subsequently + * returned by this Spliterator. After invoking this method, + * the current Spliterator will <em>not</em> produce any of + * the elements of the returned Spliterator, but the two + * Spliterators together will produce all of the elements that + * would have been produced by this Spliterator had this + * method not been called. The exact number of elements + * produced by the returned Spliterator is not guaranteed, and + * may be zero (i.e., with {@code hasNext()} reporting {@code + * false}) if this Spliterator cannot be further split. + * + * @return a Spliterator covering approximately half of the + * elements + * @throws IllegalStateException if this Spliterator has + * already commenced traversing elements + */ + Spliterator<T> split(); + } + + + /* + * Overview: + * + * The primary design goal of this hash table is to maintain + * concurrent readability (typically method get(), but also + * iterators and related methods) while minimizing update + * contention. Secondary goals are to keep space consumption about + * the same or better than java.util.HashMap, and to support high + * initial insertion rates on an empty table by many threads. + * + * Each key-value mapping is held in a Node. Because Node fields + * can contain special values, they are defined using plain Object + * types. Similarly in turn, all internal methods that use them + * work off Object types. And similarly, so do the internal + * methods of auxiliary iterator and view classes. All public + * generic typed methods relay in/out of these internal methods, + * supplying null-checks and casts as needed. This also allows + * many of the public methods to be factored into a smaller number + * of internal methods (although sadly not so for the five + * variants of put-related operations). The validation-based + * approach explained below leads to a lot of code sprawl because + * retry-control precludes factoring into smaller methods. + * + * The table is lazily initialized to a power-of-two size upon the + * first insertion. Each bin in the table normally contains a + * list of Nodes (most often, the list has only zero or one Node). + * Table accesses require volatile/atomic reads, writes, and + * CASes. Because there is no other way to arrange this without + * adding further indirections, we use intrinsics + * (sun.misc.Unsafe) operations. The lists of nodes within bins + * are always accurately traversable under volatile reads, so long + * as lookups check hash code and non-nullness of value before + * checking key equality. + * + * We use the top two bits of Node hash fields for control + * purposes -- they are available anyway because of addressing + * constraints. As explained further below, these top bits are + * used as follows: + * 00 - Normal + * 01 - Locked + * 11 - Locked and may have a thread waiting for lock + * 10 - Node is a forwarding node + * + * The lower 30 bits of each Node's hash field contain a + * transformation of the key's hash code, except for forwarding + * nodes, for which the lower bits are zero (and so always have + * hash field == MOVED). + * + * Insertion (via put or its variants) of the first node in an + * empty bin is performed by just CASing it to the bin. This is + * by far the most common case for put operations under most + * key/hash distributions. Other update operations (insert, + * delete, and replace) require locks. We do not want to waste + * the space required to associate a distinct lock object with + * each bin, so instead use the first node of a bin list itself as + * a lock. Blocking support for these locks relies on the builtin + * "synchronized" monitors. However, we also need a tryLock + * construction, so we overlay these by using bits of the Node + * hash field for lock control (see above), and so normally use + * builtin monitors only for blocking and signalling using + * wait/notifyAll constructions. See Node.tryAwaitLock. + * + * Using the first node of a list as a lock does not by itself + * suffice though: When a node is locked, any update must first + * validate that it is still the first node after locking it, and + * retry if not. Because new nodes are always appended to lists, + * once a node is first in a bin, it remains first until deleted + * or the bin becomes invalidated (upon resizing). However, + * operations that only conditionally update may inspect nodes + * until the point of update. This is a converse of sorts to the + * lazy locking technique described by Herlihy & Shavit. + * + * The main disadvantage of per-bin locks is that other update + * operations on other nodes in a bin list protected by the same + * lock can stall, for example when user equals() or mapping + * functions take a long time. However, statistically, under + * random hash codes, this is not a common problem. Ideally, the + * frequency of nodes in bins follows a Poisson distribution + * (http://en.wikipedia.org/wiki/Poisson_distribution) with a + * parameter of about 0.5 on average, given the resizing threshold + * of 0.75, although with a large variance because of resizing + * granularity. Ignoring variance, the expected occurrences of + * list size k are (exp(-0.5) * pow(0.5, k) / factorial(k)). The + * first values are: + * + * 0: 0.60653066 + * 1: 0.30326533 + * 2: 0.07581633 + * 3: 0.01263606 + * 4: 0.00157952 + * 5: 0.00015795 + * 6: 0.00001316 + * 7: 0.00000094 + * 8: 0.00000006 + * more: less than 1 in ten million + * + * Lock contention probability for two threads accessing distinct + * elements is roughly 1 / (8 * #elements) under random hashes. + * + * Actual hash code distributions encountered in practice + * sometimes deviate significantly from uniform randomness. This + * includes the case when N > (1<<30), so some keys MUST collide. + * Similarly for dumb or hostile usages in which multiple keys are + * designed to have identical hash codes. Also, although we guard + * against the worst effects of this (see method spread), sets of + * hashes may differ only in bits that do not impact their bin + * index for a given power-of-two mask. So we use a secondary + * strategy that applies when the number of nodes in a bin exceeds + * a threshold, and at least one of the keys implements + * Comparable. These TreeBins use a balanced tree to hold nodes + * (a specialized form of red-black trees), bounding search time + * to O(log N). Each search step in a TreeBin is around twice as + * slow as in a regular list, but given that N cannot exceed + * (1<<64) (before running out of addresses) this bounds search + * steps, lock hold times, etc, to reasonable constants (roughly + * 100 nodes inspected per operation worst case) so long as keys + * are Comparable (which is very common -- String, Long, etc). + * TreeBin nodes (TreeNodes) also maintain the same "next" + * traversal pointers as regular nodes, so can be traversed in + * iterators in the same way. + * + * The table is resized when occupancy exceeds a percentage + * threshold (nominally, 0.75, but see below). Only a single + * thread performs the resize (using field "sizeCtl", to arrange + * exclusion), but the table otherwise remains usable for reads + * and updates. Resizing proceeds by transferring bins, one by + * one, from the table to the next table. Because we are using + * power-of-two expansion, the elements from each bin must either + * stay at same index, or move with a power of two offset. We + * eliminate unnecessary node creation by catching cases where old + * nodes can be reused because their next fields won't change. On + * average, only about one-sixth of them need cloning when a table + * doubles. The nodes they replace will be garbage collectable as + * soon as they are no longer referenced by any reader thread that + * may be in the midst of concurrently traversing table. Upon + * transfer, the old table bin contains only a special forwarding + * node (with hash field "MOVED") that contains the next table as + * its key. On encountering a forwarding node, access and update + * operations restart, using the new table. + * + * Each bin transfer requires its bin lock. However, unlike other + * cases, a transfer can skip a bin if it fails to acquire its + * lock, and revisit it later (unless it is a TreeBin). Method + * rebuild maintains a buffer of TRANSFER_BUFFER_SIZE bins that + * have been skipped because of failure to acquire a lock, and + * blocks only if none are available (i.e., only very rarely). + * The transfer operation must also ensure that all accessible + * bins in both the old and new table are usable by any traversal. + * When there are no lock acquisition failures, this is arranged + * simply by proceeding from the last bin (table.length - 1) up + * towards the first. Upon seeing a forwarding node, traversals + * (see class Iter) arrange to move to the new table + * without revisiting nodes. However, when any node is skipped + * during a transfer, all earlier table bins may have become + * visible, so are initialized with a reverse-forwarding node back + * to the old table until the new ones are established. (This + * sometimes requires transiently locking a forwarding node, which + * is possible under the above encoding.) These more expensive + * mechanics trigger only when necessary. + * + * The traversal scheme also applies to partial traversals of + * ranges of bins (via an alternate Traverser constructor) + * to support partitioned aggregate operations. Also, read-only + * operations give up if ever forwarded to a null table, which + * provides support for shutdown-style clearing, which is also not + * currently implemented. + * + * Lazy table initialization minimizes footprint until first use, + * and also avoids resizings when the first operation is from a + * putAll, constructor with map argument, or deserialization. + * These cases attempt to override the initial capacity settings, + * but harmlessly fail to take effect in cases of races. + * + * The element count is maintained using a LongAdder, which avoids + * contention on updates but can encounter cache thrashing if read + * too frequently during concurrent access. To avoid reading so + * often, resizing is attempted either when a bin lock is + * contended, or upon adding to a bin already holding two or more + * nodes (checked before adding in the xIfAbsent methods, after + * adding in others). Under uniform hash distributions, the + * probability of this occurring at threshold is around 13%, + * meaning that only about 1 in 8 puts check threshold (and after + * resizing, many fewer do so). But this approximation has high + * variance for small table sizes, so we check on any collision + * for sizes <= 64. The bulk putAll operation further reduces + * contention by only committing count updates upon these size + * checks. + * + * Maintaining API and serialization compatibility with previous + * versions of this class introduces several oddities. Mainly: We + * leave untouched but unused constructor arguments refering to + * concurrencyLevel. We accept a loadFactor constructor argument, + * but apply it only to initial table capacity (which is the only + * time that we can guarantee to honor it.) We also declare an + * unused "Segment" class that is instantiated in minimal form + * only when serializing. + */ + + /* ---------------- Constants -------------- */ + + /** + * The largest possible table capacity. This value must be + * exactly 1<<30 to stay within Java array allocation and indexing + * bounds for power of two table sizes, and is further required + * because the top two bits of 32bit hash fields are used for + * control purposes. + */ + private static final int MAXIMUM_CAPACITY = 1 << 30; + + /** + * The default initial table capacity. Must be a power of 2 + * (i.e., at least 1) and at most MAXIMUM_CAPACITY. + */ + private static final int DEFAULT_CAPACITY = 16; + + /** + * The largest possible (non-power of two) array size. + * Needed by toArray and related methods. + */ + static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + /** + * The default concurrency level for this table. Unused but + * defined for compatibility with previous versions of this class. + */ + private static final int DEFAULT_CONCURRENCY_LEVEL = 16; + + /** + * The load factor for this table. Overrides of this value in + * constructors affect only the initial table capacity. The + * actual floating point value isn't normally used -- it is + * simpler to use expressions such as {@code n - (n >>> 2)} for + * the associated resizing threshold. + */ + private static final float LOAD_FACTOR = 0.75f; + + /** + * The buffer size for skipped bins during transfers. The + * value is arbitrary but should be large enough to avoid + * most locking stalls during resizes. + */ + private static final int TRANSFER_BUFFER_SIZE = 32; + + /** + * The bin count threshold for using a tree rather than list for a + * bin. The value reflects the approximate break-even point for + * using tree-based operations. + * Note that Doug's version defaults to 8, but when dealing with + * Ruby objects it is actually beneficial to avoid TreeNodes + * as long as possible as it usually means going into Ruby land. + */ + private static final int TREE_THRESHOLD = 16; + + /* + * Encodings for special uses of Node hash fields. See above for + * explanation. + */ + static final int MOVED = 0x80000000; // hash field for forwarding nodes + static final int LOCKED = 0x40000000; // set/tested only as a bit + static final int WAITING = 0xc0000000; // both bits set/tested together + static final int HASH_BITS = 0x3fffffff; // usable bits of normal node hash + + /* ---------------- Fields -------------- */ + + /** + * The array of bins. Lazily initialized upon first insertion. + * Size is always a power of two. Accessed directly by iterators. + */ + transient volatile AtomicReferenceArray<Node> table; + + /** + * The counter maintaining number of elements. + */ + private transient LongAdder counter; + + /** + * Table initialization and resizing control. When negative, the + * table is being initialized or resized. Otherwise, when table is + * null, holds the initial table size to use upon creation, or 0 + * for default. After initialization, holds the next element count + * value upon which to resize the table. + */ + private transient volatile int sizeCtl; + + // views + private transient KeySetView<K,V> keySet; + private transient ValuesView<K,V> values; + private transient EntrySetView<K,V> entrySet; + + /** For serialization compatibility. Null unless serialized; see below */ + private Segment<K,V>[] segments; + + static AtomicIntegerFieldUpdater SIZE_CTRL_UPDATER = AtomicIntegerFieldUpdater.newUpdater(ConcurrentHashMapV8.class, "sizeCtl"); + + /* ---------------- Table element access -------------- */ + + /* + * Volatile access methods are used for table elements as well as + * elements of in-progress next table while resizing. Uses are + * null checked by callers, and implicitly bounds-checked, relying + * on the invariants that tab arrays have non-zero size, and all + * indices are masked with (tab.length - 1) which is never + * negative and always less than length. Note that, to be correct + * wrt arbitrary concurrency errors by users, bounds checks must + * operate on local variables, which accounts for some odd-looking + * inline assignments below. + */ + + static final Node tabAt(AtomicReferenceArray<Node> tab, int i) { // used by Iter + return tab.get(i); + } + + private static final boolean casTabAt(AtomicReferenceArray<Node> tab, int i, Node c, Node v) { + return tab.compareAndSet(i, c, v); + } + + private static final void setTabAt(AtomicReferenceArray<Node> tab, int i, Node v) { + tab.set(i, v); + } + + /* ---------------- Nodes -------------- */ + + /** + * Key-value entry. Note that this is never exported out as a + * user-visible Map.Entry (see MapEntry below). Nodes with a hash + * field of MOVED are special, and do not contain user keys or + * values. Otherwise, keys are never null, and null val fields + * indicate that a node is in the process of being deleted or + * created. For purposes of read-only access, a key may be read + * before a val, but can only be used after checking val to be + * non-null. + */ + static class Node { + volatile int hash; + final Object key; + volatile Object val; + volatile Node next; + + static AtomicIntegerFieldUpdater HASH_UPDATER = AtomicIntegerFieldUpdater.newUpdater(Node.class, "hash"); + + Node(int hash, Object key, Object val, Node next) { + this.hash = hash; + this.key = key; + this.val = val; + this.next = next; + } + + /** CompareAndSet the hash field */ + final boolean casHash(int cmp, int val) { + return HASH_UPDATER.compareAndSet(this, cmp, val); + } + + /** The number of spins before blocking for a lock */ + static final int MAX_SPINS = + Runtime.getRuntime().availableProcessors() > 1 ? 64 : 1; + + /** + * Spins a while if LOCKED bit set and this node is the first + * of its bin, and then sets WAITING bits on hash field and + * blocks (once) if they are still set. It is OK for this + * method to return even if lock is not available upon exit, + * which enables these simple single-wait mechanics. + * + * The corresponding signalling operation is performed within + * callers: Upon detecting that WAITING has been set when + * unlocking lock (via a failed CAS from non-waiting LOCKED + * state), unlockers acquire the sync lock and perform a + * notifyAll. + * + * The initial sanity check on tab and bounds is not currently + * necessary in the only usages of this method, but enables + * use in other future contexts. + */ + final void tryAwaitLock(AtomicReferenceArray<Node> tab, int i) { + if (tab != null && i >= 0 && i < tab.length()) { // sanity check + int r = ThreadLocalRandom.current().nextInt(); // randomize spins + int spins = MAX_SPINS, h; + while (tabAt(tab, i) == this && ((h = hash) & LOCKED) != 0) { + if (spins >= 0) { + r ^= r << 1; r ^= r >>> 3; r ^= r << 10; // xorshift + if (r >= 0 && --spins == 0) + Thread.yield(); // yield before block + } + else if (casHash(h, h | WAITING)) { + synchronized (this) { + if (tabAt(tab, i) == this && + (hash & WAITING) == WAITING) { + try { + wait(); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + else + notifyAll(); // possibly won race vs signaller + } + break; + } + } + } + } + } + + /* ---------------- TreeBins -------------- */ + + /** + * Nodes for use in TreeBins + */ + static final class TreeNode extends Node { + TreeNode parent; // red-black tree links + TreeNode left; + TreeNode right; + TreeNode prev; // needed to unlink next upon deletion + boolean red; + + TreeNode(int hash, Object key, Object val, Node next, TreeNode parent) { + super(hash, key, val, next); + this.parent = parent; + } + } + + /** + * A specialized form of red-black tree for use in bins + * whose size exceeds a threshold. + * + * TreeBins use a special form of comparison for search and + * related operations (which is the main reason we cannot use + * existing collections such as TreeMaps). TreeBins contain + * Comparable elements, but may contain others, as well as + * elements that are Comparable but not necessarily Comparable<T> + * for the same T, so we cannot invoke compareTo among them. To + * handle this, the tree is ordered primarily by hash value, then + * by getClass().getName() order, and then by Comparator order + * among elements of the same class. On lookup at a node, if + * elements are not comparable or compare as 0, both left and + * right children may need to be searched in the case of tied hash + * values. (This corresponds to the full list search that would be + * necessary if all elements were non-Comparable and had tied + * hashes.) The red-black balancing code is updated from + * pre-jdk-collections + * (http://gee.cs.oswego.edu/dl/classes/collections/RBCell.java) + * based in turn on Cormen, Leiserson, and Rivest "Introduction to + * Algorithms" (CLR). + * + * TreeBins also maintain a separate locking discipline than + * regular bins. Because they are forwarded via special MOVED + * nodes at bin heads (which can never change once established), + * we cannot use those nodes as locks. Instead, TreeBin + * extends AbstractQueuedSynchronizer to support a simple form of + * read-write lock. For update operations and table validation, + * the exclusive form of lock behaves in the same way as bin-head + * locks. However, lookups use shared read-lock mechanics to allow + * multiple readers in the absence of writers. Additionally, + * these lookups do not ever block: While the lock is not + * available, they proceed along the slow traversal path (via + * next-pointers) until the lock becomes available or the list is + * exhausted, whichever comes first. (These cases are not fast, + * but maximize aggregate expected throughput.) The AQS mechanics + * for doing this are straightforward. The lock state is held as + * AQS getState(). Read counts are negative; the write count (1) + * is positive. There are no signalling preferences among readers + * and writers. Since we don't need to export full Lock API, we + * just override the minimal AQS methods and use them directly. + */ + static final class TreeBin extends AbstractQueuedSynchronizer { + private static final long serialVersionUID = 2249069246763182397L; + transient TreeNode root; // root of tree + transient TreeNode first; // head of next-pointer list + + /* AQS overrides */ + public final boolean isHeldExclusively() { return getState() > 0; } + public final boolean tryAcquire(int ignore) { + if (compareAndSetState(0, 1)) { + setExclusiveOwnerThread(Thread.currentThread()); + return true; + } + return false; + } + public final boolean tryRelease(int ignore) { + setExclusiveOwnerThread(null); + setState(0); + return true; + } + public final int tryAcquireShared(int ignore) { + for (int c;;) { + if ((c = getState()) > 0) + return -1; + if (compareAndSetState(c, c -1)) + return 1; + } + } + public final boolean tryReleaseShared(int ignore) { + int c; + do {} while (!compareAndSetState(c = getState(), c + 1)); + return c == -1; + } + + /** From CLR */ + private void rotateLeft(TreeNode p) { + if (p != null) { + TreeNode r = p.right, pp, rl; + if ((rl = p.right = r.left) != null) + rl.parent = p; + if ((pp = r.parent = p.parent) == null) + root = r; + else if (pp.left == p) + pp.left = r; + else + pp.right = r; + r.left = p; + p.parent = r; + } + } + + /** From CLR */ + private void rotateRight(TreeNode p) { + if (p != null) { + TreeNode l = p.left, pp, lr; + if ((lr = p.left = l.right) != null) + lr.parent = p; + if ((pp = l.parent = p.parent) == null) + root = l; + else if (pp.right == p) + pp.right = l; + else + pp.left = l; + l.right = p; + p.parent = l; + } + } + + @SuppressWarnings("unchecked") final TreeNode getTreeNode + (int h, Object k, TreeNode p) { + return getTreeNode(h, (RubyObject)k, p); + } + + /** + * Returns the TreeNode (or null if not found) for the given key + * starting at given root. + */ + @SuppressWarnings("unchecked") final TreeNode getTreeNode + (int h, RubyObject k, TreeNode p) { + RubyClass c = k.getMetaClass(); boolean kNotComparable = !k.respondsTo("<=>"); + while (p != null) { + int dir, ph; RubyObject pk; RubyClass pc; + if ((ph = p.hash) == h) { + if ((pk = (RubyObject)p.key) == k || k.equals(pk)) + return p; + if (c != (pc = (RubyClass)pk.getMetaClass()) || + kNotComparable || + (dir = rubyCompare(k, pk)) == 0) { + dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); + if (dir == 0) { // if still stuck, need to check both sides + TreeNode r = null, pl, pr; + // try to recurse on the right + if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) + return r; + // try to continue iterating on the left side + else if ((pl = p.left) != null && h <= pl.hash) + dir = -1; + else // no matching node found + return null; + } + } + } + else + dir = (h < ph) ? -1 : 1; + p = (dir > 0) ? p.right : p.left; + } + return null; + } + + int rubyCompare(RubyObject l, RubyObject r) { + ThreadContext context = l.getMetaClass().getRuntime().getCurrentContext(); + IRubyObject result; + try { + result = l.callMethod(context, "<=>", r); + } catch (RaiseException e) { + // handle objects "lying" about responding to <=>, ie: an Array containing non-comparable keys + if (context.runtime.getNoMethodError().isInstance(e.getException())) { + return 0; + } + throw e; + } + + return result.isNil() ? 0 : RubyNumeric.num2int(result.convertToInteger()); + } + + /** + * Wrapper for getTreeNode used by CHM.get. Tries to obtain + * read-lock to call getTreeNode, but during failure to get + * lock, searches along next links. + */ + final Object getValue(int h, Object k) { + Node r = null; + int c = getState(); // Must read lock state first + for (Node e = first; e != null; e = e.next) { + if (c <= 0 && compareAndSetState(c, c - 1)) { + try { + r = getTreeNode(h, k, root); + } finally { + releaseShared(0); + } + break; + } + else if ((e.hash & HASH_BITS) == h && k.equals(e.key)) { + r = e; + break; + } + else + c = getState(); + } + return r == null ? null : r.val; + } + + @SuppressWarnings("unchecked") final TreeNode putTreeNode + (int h, Object k, Object v) { + return putTreeNode(h, (RubyObject)k, v); + } + + /** + * Finds or adds a node. + * @return null if added + */ + @SuppressWarnings("unchecked") final TreeNode putTreeNode + (int h, RubyObject k, Object v) { + RubyClass c = k.getMetaClass(); + boolean kNotComparable = !k.respondsTo("<=>"); + TreeNode pp = root, p = null; + int dir = 0; + while (pp != null) { // find existing node or leaf to insert at + int ph; RubyObject pk; RubyClass pc; + p = pp; + if ((ph = p.hash) == h) { + if ((pk = (RubyObject)p.key) == k || k.equals(pk)) + return p; + if (c != (pc = pk.getMetaClass()) || + kNotComparable || + (dir = rubyCompare(k, pk)) == 0) { + dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); + if (dir == 0) { // if still stuck, need to check both sides + TreeNode r = null, pr; + // try to recurse on the right + if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) + return r; + else // continue descending down the left subtree + dir = -1; + } + } + } + else + dir = (h < ph) ? -1 : 1; + pp = (dir > 0) ? p.right : p.left; + } + + TreeNode f = first; + TreeNode x = first = new TreeNode(h, (Object)k, v, f, p); + if (p == null) + root = x; + else { // attach and rebalance; adapted from CLR + TreeNode xp, xpp; + if (f != null) + f.prev = x; + if (dir <= 0) + p.left = x; + else + p.right = x; + x.red = true; + while (x != null && (xp = x.parent) != null && xp.red && + (xpp = xp.parent) != null) { + TreeNode xppl = xpp.left; + if (xp == xppl) { + TreeNode y = xpp.right; + if (y != null && y.red) { + y.red = false; + xp.red = false; + xpp.red = true; + x = xpp; + } + else { + if (x == xp.right) { + rotateLeft(x = xp); + xpp = (xp = x.parent) == null ? null : xp.parent; + } + if (xp != null) { + xp.red = false; + if (xpp != null) { + xpp.red = true; + rotateRight(xpp); + } + } + } + } + else { + TreeNode y = xppl; + if (y != null && y.red) { + y.red = false; + xp.red = false; + xpp.red = true; + x = xpp; + } + else { + if (x == xp.left) { + rotateRight(x = xp); + xpp = (xp = x.parent) == null ? null : xp.parent; + } + if (xp != null) { + xp.red = false; + if (xpp != null) { + xpp.red = true; + rotateLeft(xpp); + } + } + } + } + } + TreeNode r = root; + if (r != null && r.red) + r.red = false; + } + return null; + } + + /** + * Removes the given node, that must be present before this + * call. This is messier than typical red-black deletion code + * because we cannot swap the contents of an interior node + * with a leaf successor that is pinned by "next" pointers + * that are accessible independently of lock. So instead we + * swap the tree linkages. + */ + final void deleteTreeNode(TreeNode p) { + TreeNode next = (TreeNode)p.next; // unlink traversal pointers + TreeNode pred = p.prev; + if (pred == null) + first = next; + else + pred.next = next; + if (next != null) + next.prev = pred; + TreeNode replacement; + TreeNode pl = p.left; + TreeNode pr = p.right; + if (pl != null && pr != null) { + TreeNode s = pr, sl; + while ((sl = s.left) != null) // find successor + s = sl; + boolean c = s.red; s.red = p.red; p.red = c; // swap colors + TreeNode sr = s.right; + TreeNode pp = p.parent; + if (s == pr) { // p was s's direct parent + p.parent = s; + s.right = p; + } + else { + TreeNode sp = s.parent; + if ((p.parent = sp) != null) { + if (s == sp.left) + sp.left = p; + else + sp.right = p; + } + if ((s.right = pr) != null) + pr.parent = s; + } + p.left = null; + if ((p.right = sr) != null) + sr.parent = p; + if ((s.left = pl) != null) + pl.parent = s; + if ((s.parent = pp) == null) + root = s; + else if (p == pp.left) + pp.left = s; + else + pp.right = s; + replacement = sr; + } + else + replacement = (pl != null) ? pl : pr; + TreeNode pp = p.parent; + if (replacement == null) { + if (pp == null) { + root = null; + return; + } + replacement = p; + } + else { + replacement.parent = pp; + if (pp == null) + root = replacement; + else if (p == pp.left) + pp.left = replacement; + else + pp.right = replacement; + p.left = p.right = p.parent = null; + } + if (!p.red) { // rebalance, from CLR + TreeNode x = replacement; + while (x != null) { + TreeNode xp, xpl; + if (x.red || (xp = x.parent) == null) { + x.red = false; + break; + } + if (x == (xpl = xp.left)) { + TreeNode sib = xp.right; + if (sib != null && sib.red) { + sib.red = false; + xp.red = true; + rotateLeft(xp); + sib = (xp = x.parent) == null ? null : xp.right; + } + if (sib == null) + x = xp; + else { + TreeNode sl = sib.left, sr = sib.right; + if ((sr == null || !sr.red) && + (sl == null || !sl.red)) { + sib.red = true; + x = xp; + } + else { + if (sr == null || !sr.red) { + if (sl != null) + sl.red = false; + sib.red = true; + rotateRight(sib); + sib = (xp = x.parent) == null ? null : xp.right; + } + if (sib != null) { + sib.red = (xp == null) ? false : xp.red; + if ((sr = sib.right) != null) + sr.red = false; + } + if (xp != null) { + xp.red = false; + rotateLeft(xp); + } + x = root; + } + } + } + else { // symmetric + TreeNode sib = xpl; + if (sib != null && sib.red) { + sib.red = false; + xp.red = true; + rotateRight(xp); + sib = (xp = x.parent) == null ? null : xp.left; + } + if (sib == null) + x = xp; + else { + TreeNode sl = sib.left, sr = sib.right; + if ((sl == null || !sl.red) && + (sr == null || !sr.red)) { + sib.red = true; + x = xp; + } + else { + if (sl == null || !sl.red) { + if (sr != null) + sr.red = false; + sib.red = true; + rotateLeft(sib); + sib = (xp = x.parent) == null ? null : xp.left; + } + if (sib != null) { + sib.red = (xp == null) ? false : xp.red; + if ((sl = sib.left) != null) + sl.red = false; + } + if (xp != null) { + xp.red = false; + rotateRight(xp); + } + x = root; + } + } + } + } + } + if (p == replacement && (pp = p.parent) != null) { + if (p == pp.left) // detach pointers + pp.left = null; + else if (p == pp.right) + pp.right = null; + p.parent = null; + } + } + } + + /* ---------------- Collision reduction methods -------------- */ + + /** + * Spreads higher bits to lower, and also forces top 2 bits to 0. + * Because the table uses power-of-two masking, sets of hashes + * that vary only in bits above the current mask will always + * collide. (Among known examples are sets of Float keys holding + * consecutive whole numbers in small tables.) To counter this, + * we apply a transform that spreads the impact of higher bits + * downward. There is a tradeoff between speed, utility, and + * quality of bit-spreading. Because many common sets of hashes + * are already reasonably distributed across bits (so don't benefit + * from spreading), and because we use trees to handle large sets + * of collisions in bins, we don't need excessively high quality. + */ + private static final int spread(int h) { + h ^= (h >>> 18) ^ (h >>> 12); + return (h ^ (h >>> 10)) & HASH_BITS; + } + + /** + * Replaces a list bin with a tree bin. Call only when locked. + * Fails to replace if the given key is non-comparable or table + * is, or needs, resizing. + */ + private final void replaceWithTreeBin(AtomicReferenceArray<Node> tab, int index, Object key) { + if ((key instanceof Comparable) && + (tab.length() >= MAXIMUM_CAPACITY || counter.sum() < (long)sizeCtl)) { + TreeBin t = new TreeBin(); + for (Node e = tabAt(tab, index); e != null; e = e.next) + t.putTreeNode(e.hash & HASH_BITS, e.key, e.val); + setTabAt(tab, index, new Node(MOVED, t, null, null)); + } + } + + /* ---------------- Internal access and update methods -------------- */ + + /** Implementation for get and containsKey */ + private final Object internalGet(Object k) { + int h = spread(k.hashCode()); + retry: for (AtomicReferenceArray<Node> tab = table; tab != null;) { + Node e, p; Object ek, ev; int eh; // locals to read fields once + for (e = tabAt(tab, (tab.length() - 1) & h); e != null; e = e.next) { + if ((eh = e.hash) == MOVED) { + if ((ek = e.key) instanceof TreeBin) // search TreeBin + return ((TreeBin)ek).getValue(h, k); + else { // restart with new table + tab = (AtomicReferenceArray<Node>)ek; + continue retry; + } + } + else if ((eh & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + } + break; + } + return null; + } + + /** + * Implementation for the four public remove/replace methods: + * Replaces node value with v, conditional upon match of cv if + * non-null. If resulting value is null, delete. + */ + private final Object internalReplace(Object k, Object v, Object cv) { + int h = spread(k.hashCode()); + Object oldVal = null; + for (AtomicReferenceArray<Node> tab = table;;) { + Node f; int i, fh; Object fk; + if (tab == null || + (f = tabAt(tab, i = (tab.length() - 1) & h)) == null) + break; + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + boolean deleted = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) { + Object pv = p.val; + if (cv == null || cv == pv || cv.equals(pv)) { + oldVal = pv; + if ((p.val = v) == null) { + deleted = true; + t.deleteTreeNode(p); + } + } + } + } + } finally { + t.release(0); + } + if (validated) { + if (deleted) + counter.add(-1L); + break; + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & HASH_BITS) != h && f.next == null) // precheck + break; // rules out possible existence + else if ((fh & LOCKED) != 0) { + checkForResize(); // try resizing if can't get lock + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + boolean validated = false; + boolean deleted = false; + try { + if (tabAt(tab, i) == f) { + validated = true; + for (Node e = f, pred = null;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + ((ev = e.val) != null) && + ((ek = e.key) == k || k.equals(ek))) { + if (cv == null || cv == ev || cv.equals(ev)) { + oldVal = ev; + if ((e.val = v) == null) { + deleted = true; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + } + break; + } + pred = e; + if ((e = e.next) == null) + break; + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (validated) { + if (deleted) + counter.add(-1L); + break; + } + } + } + return oldVal; + } + + /* + * Internal versions of the six insertion methods, each a + * little more complicated than the last. All have + * the same basic structure as the first (internalPut): + * 1. If table uninitialized, create + * 2. If bin empty, try to CAS new node + * 3. If bin stale, use new table + * 4. if bin converted to TreeBin, validate and relay to TreeBin methods + * 5. Lock and validate; if valid, scan and add or update + * + * The others interweave other checks and/or alternative actions: + * * Plain put checks for and performs resize after insertion. + * * putIfAbsent prescans for mapping without lock (and fails to add + * if present), which also makes pre-emptive resize checks worthwhile. + * * computeIfAbsent extends form used in putIfAbsent with additional + * mechanics to deal with, calls, potential exceptions and null + * returns from function call. + * * compute uses the same function-call mechanics, but without + * the prescans + * * merge acts as putIfAbsent in the absent case, but invokes the + * update function if present + * * putAll attempts to pre-allocate enough table space + * and more lazily performs count updates and checks. + * + * Someday when details settle down a bit more, it might be worth + * some factoring to reduce sprawl. + */ + + /** Implementation for put */ + private final Object internalPut(Object k, Object v) { + int h = spread(k.hashCode()); + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + int i; Node f; int fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) + break; // no lock when adding to empty bin + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + Object oldVal = null; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 2; + TreeNode p = t.putTreeNode(h, k, v); + if (p != null) { + oldVal = p.val; + p.val = v; + } + } + } finally { + t.release(0); + } + if (count != 0) { + if (oldVal != null) + return oldVal; + break; + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + Object oldVal = null; + try { // needed in case equals() throws + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + oldVal = ev; + e.val = v; + break; + } + Node last = e; + if ((e = e.next) == null) { + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { // unlock and signal if needed + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (oldVal != null) + return oldVal; + if (tab.length() <= 64) + count = 2; + break; + } + } + } + counter.add(1L); + if (count > 1) + checkForResize(); + return null; + } + + /** Implementation for putIfAbsent */ + private final Object internalPutIfAbsent(Object k, Object v) { + int h = spread(k.hashCode()); + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + int i; Node f; int fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + Object oldVal = null; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 2; + TreeNode p = t.putTreeNode(h, k, v); + if (p != null) + oldVal = p.val; + } + } finally { + t.release(0); + } + if (count != 0) { + if (oldVal != null) + return oldVal; + break; + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & HASH_BITS) == h && (fv = f.val) != null && + ((fk = f.key) == k || k.equals(fk))) + return fv; + else { + Node g = f.next; + if (g != null) { // at least 2 nodes -- search and maybe resize + for (Node e = g;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + if ((e = e.next) == null) { + checkForResize(); + break; + } + } + } + if (((fh = f.hash) & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { + Object oldVal = null; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + oldVal = ev; + break; + } + Node last = e; + if ((e = e.next) == null) { + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (oldVal != null) + return oldVal; + if (tab.length() <= 64) + count = 2; + break; + } + } + } + } + counter.add(1L); + if (count > 1) + checkForResize(); + return null; + } + + /** Implementation for computeIfAbsent */ + private final Object internalComputeIfAbsent(K k, + Fun<? super K, ?> mf) { + int h = spread(k.hashCode()); + Object val = null; + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + Node f; int i, fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + Node node = new Node(fh = h | LOCKED, k, null, null); + if (casTabAt(tab, i, null, node)) { + count = 1; + try { + if ((val = mf.apply(k)) != null) + node.val = val; + } finally { + if (val == null) + setTabAt(tab, i, null); + if (!node.casHash(fh, h)) { + node.hash = h; + synchronized (node) { node.notifyAll(); }; + } + } + } + if (count != 0) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean added = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) + val = p.val; + else if ((val = mf.apply(k)) != null) { + added = true; + count = 2; + t.putTreeNode(h, k, val); + } + } + } finally { + t.release(0); + } + if (count != 0) { + if (!added) + return val; + break; + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & HASH_BITS) == h && (fv = f.val) != null && + ((fk = f.key) == k || k.equals(fk))) + return fv; + else { + Node g = f.next; + if (g != null) { + for (Node e = g;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + if ((e = e.next) == null) { + checkForResize(); + break; + } + } + } + if (((fh = f.hash) & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { + boolean added = false; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = ev; + break; + } + Node last = e; + if ((e = e.next) == null) { + if ((val = mf.apply(k)) != null) { + added = true; + last.next = new Node(h, k, val, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + } + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (!added) + return val; + if (tab.length() <= 64) + count = 2; + break; + } + } + } + } + if (val != null) { + counter.add(1L); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for compute */ + @SuppressWarnings("unchecked") private final Object internalCompute + (K k, boolean onlyIfPresent, BiFun<? super K, ? super V, ? extends V> mf) { + int h = spread(k.hashCode()); + Object val = null; + int delta = 0; + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + Node f; int i, fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + if (onlyIfPresent) + break; + Node node = new Node(fh = h | LOCKED, k, null, null); + if (casTabAt(tab, i, null, node)) { + try { + count = 1; + if ((val = mf.apply(k, null)) != null) { + node.val = val; + delta = 1; + } + } finally { + if (delta == 0) + setTabAt(tab, i, null); + if (!node.casHash(fh, h)) { + node.hash = h; + synchronized (node) { node.notifyAll(); }; + } + } + } + if (count != 0) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + Object pv; + if (p == null) { + if (onlyIfPresent) + break; + pv = null; + } else + pv = p.val; + if ((val = mf.apply(k, (V)pv)) != null) { + if (p != null) + p.val = val; + else { + count = 2; + delta = 1; + t.putTreeNode(h, k, val); + } + } + else if (p != null) { + delta = -1; + t.deleteTreeNode(p); + } + } + } finally { + t.release(0); + } + if (count != 0) + break; + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f, pred = null;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = mf.apply(k, (V)ev); + if (val != null) + e.val = val; + else { + delta = -1; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + break; + } + pred = e; + if ((e = e.next) == null) { + if (!onlyIfPresent && (val = mf.apply(k, null)) != null) { + pred.next = new Node(h, k, val, null); + delta = 1; + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + } + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (tab.length() <= 64) + count = 2; + break; + } + } + } + if (delta != 0) { + counter.add((long)delta); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for merge */ + @SuppressWarnings("unchecked") private final Object internalMerge + (K k, V v, BiFun<? super V, ? super V, ? extends V> mf) { + int h = spread(k.hashCode()); + Object val = null; + int delta = 0; + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + int i; Node f; int fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) { + delta = 1; + val = v; + break; + } + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + val = (p == null) ? v : mf.apply((V)p.val, v); + if (val != null) { + if (p != null) + p.val = val; + else { + count = 2; + delta = 1; + t.putTreeNode(h, k, val); + } + } + else if (p != null) { + delta = -1; + t.deleteTreeNode(p); + } + } + } finally { + t.release(0); + } + if (count != 0) + break; + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f, pred = null;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = mf.apply((V)ev, v); + if (val != null) + e.val = val; + else { + delta = -1; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + break; + } + pred = e; + if ((e = e.next) == null) { + val = v; + pred.next = new Node(h, k, val, null); + delta = 1; + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (tab.length() <= 64) + count = 2; + break; + } + } + } + if (delta != 0) { + counter.add((long)delta); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for putAll */ + private final void internalPutAll(Map<?, ?> m) { + tryPresize(m.size()); + long delta = 0L; // number of uncommitted additions + boolean npe = false; // to throw exception on exit for nulls + try { // to clean up counts on other exceptions + for (Map.Entry<?, ?> entry : m.entrySet()) { + Object k, v; + if (entry == null || (k = entry.getKey()) == null || + (v = entry.getValue()) == null) { + npe = true; + break; + } + int h = spread(k.hashCode()); + for (AtomicReferenceArray<Node> tab = table;;) { + int i; Node f; int fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null){ + if (casTabAt(tab, i, null, new Node(h, k, v, null))) { + ++delta; + break; + } + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) + p.val = v; + else { + t.putTreeNode(h, k, v); + ++delta; + } + } + } finally { + t.release(0); + } + if (validated) + break; + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + counter.add(delta); + delta = 0L; + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + int count = 0; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + e.val = v; + break; + } + Node last = e; + if ((e = e.next) == null) { + ++delta; + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (count > 1) { + counter.add(delta); + delta = 0L; + checkForResize(); + } + break; + } + } + } + } + } finally { + if (delta != 0) + counter.add(delta); + } + if (npe) + throw new NullPointerException(); + } + + /* ---------------- Table Initialization and Resizing -------------- */ + + /** + * Returns a power of two table size for the given desired capacity. + * See Hackers Delight, sec 3.2 + */ + private static final int tableSizeFor(int c) { + int n = c - 1; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; + } + + /** + * Initializes table, using the size recorded in sizeCtl. + */ + private final AtomicReferenceArray<Node> initTable() { + AtomicReferenceArray<Node> tab; int sc; + while ((tab = table) == null) { + if ((sc = sizeCtl) < 0) + Thread.yield(); // lost initialization race; just spin + else if (SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if ((tab = table) == null) { + int n = (sc > 0) ? sc : DEFAULT_CAPACITY; + tab = table = new AtomicReferenceArray<Node>(n); + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + break; + } + } + return tab; + } + + /** + * If table is too small and not already resizing, creates next + * table and transfers bins. Rechecks occupancy after a transfer + * to see if another resize is already needed because resizings + * are lagging additions. + */ + private final void checkForResize() { + AtomicReferenceArray<Node> tab; int n, sc; + while ((tab = table) != null && + (n = tab.length()) < MAXIMUM_CAPACITY && + (sc = sizeCtl) >= 0 && counter.sum() >= (long)sc && + SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if (tab == table) { + table = rebuild(tab); + sc = (n << 1) - (n >>> 1); + } + } finally { + sizeCtl = sc; + } + } + } + + /** + * Tries to presize table to accommodate the given number of elements. + * + * @param size number of elements (doesn't need to be perfectly accurate) + */ + private final void tryPresize(int size) { + int c = (size >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : + tableSizeFor(size + (size >>> 1) + 1); + int sc; + while ((sc = sizeCtl) >= 0) { + AtomicReferenceArray<Node> tab = table; int n; + if (tab == null || (n = tab.length()) == 0) { + n = (sc > c) ? sc : c; + if (SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if (table == tab) { + table = new AtomicReferenceArray<Node>(n); + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + } + } + else if (c <= sc || n >= MAXIMUM_CAPACITY) + break; + else if (SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if (table == tab) { + table = rebuild(tab); + sc = (n << 1) - (n >>> 1); + } + } finally { + sizeCtl = sc; + } + } + } + } + + /* + * Moves and/or copies the nodes in each bin to new table. See + * above for explanation. + * + * @return the new table + */ + private static final AtomicReferenceArray<Node> rebuild(AtomicReferenceArray<Node> tab) { + int n = tab.length(); + AtomicReferenceArray<Node> nextTab = new AtomicReferenceArray<Node>(n << 1); + Node fwd = new Node(MOVED, nextTab, null, null); + int[] buffer = null; // holds bins to revisit; null until needed + Node rev = null; // reverse forwarder; null until needed + int nbuffered = 0; // the number of bins in buffer list + int bufferIndex = 0; // buffer index of current buffered bin + int bin = n - 1; // current non-buffered bin or -1 if none + + for (int i = bin;;) { // start upwards sweep + int fh; Node f; + if ((f = tabAt(tab, i)) == null) { + if (bin >= 0) { // Unbuffered; no lock needed (or available) + if (!casTabAt(tab, i, f, fwd)) + continue; + } + else { // transiently use a locked forwarding node + Node g = new Node(MOVED|LOCKED, nextTab, null, null); + if (!casTabAt(tab, i, f, g)) + continue; + setTabAt(nextTab, i, null); + setTabAt(nextTab, i + n, null); + setTabAt(tab, i, fwd); + if (!g.casHash(MOVED|LOCKED, MOVED)) { + g.hash = MOVED; + synchronized (g) { g.notifyAll(); } + } + } + } + else if ((fh = f.hash) == MOVED) { + Object fk = f.key; + if (fk instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + splitTreeBin(nextTab, i, t); + setTabAt(tab, i, fwd); + } + } finally { + t.release(0); + } + if (!validated) + continue; + } + } + else if ((fh & LOCKED) == 0 && f.casHash(fh, fh|LOCKED)) { + boolean validated = false; + try { // split to lo and hi lists; copying as needed + if (tabAt(tab, i) == f) { + validated = true; + splitBin(nextTab, i, f); + setTabAt(tab, i, fwd); + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (!validated) + continue; + } + else { + if (buffer == null) // initialize buffer for revisits + buffer = new int[TRANSFER_BUFFER_SIZE]; + if (bin < 0 && bufferIndex > 0) { + int j = buffer[--bufferIndex]; + buffer[bufferIndex] = i; + i = j; // swap with another bin + continue; + } + if (bin < 0 || nbuffered >= TRANSFER_BUFFER_SIZE) { + f.tryAwaitLock(tab, i); + continue; // no other options -- block + } + if (rev == null) // initialize reverse-forwarder + rev = new Node(MOVED, tab, null, null); + if (tabAt(tab, i) != f || (f.hash & LOCKED) == 0) + continue; // recheck before adding to list + buffer[nbuffered++] = i; + setTabAt(nextTab, i, rev); // install place-holders + setTabAt(nextTab, i + n, rev); + } + + if (bin > 0) + i = --bin; + else if (buffer != null && nbuffered > 0) { + bin = -1; + i = buffer[bufferIndex = --nbuffered]; + } + else + return nextTab; + } + } + + /** + * Splits a normal bin with list headed by e into lo and hi parts; + * installs in given table. + */ + private static void splitBin(AtomicReferenceArray<Node> nextTab, int i, Node e) { + int bit = nextTab.length() >>> 1; // bit to split on + int runBit = e.hash & bit; + Node lastRun = e, lo = null, hi = null; + for (Node p = e.next; p != null; p = p.next) { + int b = p.hash & bit; + if (b != runBit) { + runBit = b; + lastRun = p; + } + } + if (runBit == 0) + lo = lastRun; + else + hi = lastRun; + for (Node p = e; p != lastRun; p = p.next) { + int ph = p.hash & HASH_BITS; + Object pk = p.key, pv = p.val; + if ((ph & bit) == 0) + lo = new Node(ph, pk, pv, lo); + else + hi = new Node(ph, pk, pv, hi); + } + setTabAt(nextTab, i, lo); + setTabAt(nextTab, i + bit, hi); + } + + /** + * Splits a tree bin into lo and hi parts; installs in given table. + */ + private static void splitTreeBin(AtomicReferenceArray<Node> nextTab, int i, TreeBin t) { + int bit = nextTab.length() >>> 1; + TreeBin lt = new TreeBin(); + TreeBin ht = new TreeBin(); + int lc = 0, hc = 0; + for (Node e = t.first; e != null; e = e.next) { + int h = e.hash & HASH_BITS; + Object k = e.key, v = e.val; + if ((h & bit) == 0) { + ++lc; + lt.putTreeNode(h, k, v); + } + else { + ++hc; + ht.putTreeNode(h, k, v); + } + } + Node ln, hn; // throw away trees if too small + if (lc <= (TREE_THRESHOLD >>> 1)) { + ln = null; + for (Node p = lt.first; p != null; p = p.next) + ln = new Node(p.hash, p.key, p.val, ln); + } + else + ln = new Node(MOVED, lt, null, null); + setTabAt(nextTab, i, ln); + if (hc <= (TREE_THRESHOLD >>> 1)) { + hn = null; + for (Node p = ht.first; p != null; p = p.next) + hn = new Node(p.hash, p.key, p.val, hn); + } + else + hn = new Node(MOVED, ht, null, null); + setTabAt(nextTab, i + bit, hn); + } + + /** + * Implementation for clear. Steps through each bin, removing all + * nodes. + */ + private final void internalClear() { + long delta = 0L; // negative number of deletions + int i = 0; + AtomicReferenceArray<Node> tab = table; + while (tab != null && i < tab.length()) { + int fh; Object fk; + Node f = tabAt(tab, i); + if (f == null) + ++i; + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + for (Node p = t.first; p != null; p = p.next) { + if (p.val != null) { // (currently always true) + p.val = null; + --delta; + } + } + t.first = null; + t.root = null; + ++i; + } + } finally { + t.release(0); + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + counter.add(delta); // opportunistically update count + delta = 0L; + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + for (Node e = f; e != null; e = e.next) { + if (e.val != null) { // (currently always true) + e.val = null; + --delta; + } + } + setTabAt(tab, i, null); + ++i; + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + } + } + if (delta != 0) + counter.add(delta); + } + + /* ----------------Table Traversal -------------- */ + + /** + * Encapsulates traversal for methods such as containsValue; also + * serves as a base class for other iterators and bulk tasks. + * + * At each step, the iterator snapshots the key ("nextKey") and + * value ("nextVal") of a valid node (i.e., one that, at point of + * snapshot, has a non-null user value). Because val fields can + * change (including to null, indicating deletion), field nextVal + * might not be accurate at point of use, but still maintains the + * weak consistency property of holding a value that was once + * valid. To support iterator.remove, the nextKey field is not + * updated (nulled out) when the iterator cannot advance. + * + * Internal traversals directly access these fields, as in: + * {@code while (it.advance() != null) { process(it.nextKey); }} + * + * Exported iterators must track whether the iterator has advanced + * (in hasNext vs next) (by setting/checking/nulling field + * nextVal), and then extract key, value, or key-value pairs as + * return values of next(). + * + * The iterator visits once each still-valid node that was + * reachable upon iterator construction. It might miss some that + * were added to a bin after the bin was visited, which is OK wrt + * consistency guarantees. Maintaining this property in the face + * of possible ongoing resizes requires a fair amount of + * bookkeeping state that is difficult to optimize away amidst + * volatile accesses. Even so, traversal maintains reasonable + * throughput. + * + * Normally, iteration proceeds bin-by-bin traversing lists. + * However, if the table has been resized, then all future steps + * must traverse both the bin at the current index as well as at + * (index + baseSize); and so on for further resizings. To + * paranoically cope with potential sharing by users of iterators + * across threads, iteration terminates if a bounds checks fails + * for a table read. + * + * This class extends ForkJoinTask to streamline parallel + * iteration in bulk operations (see BulkTask). This adds only an + * int of space overhead, which is close enough to negligible in + * cases where it is not needed to not worry about it. Because + * ForkJoinTask is Serializable, but iterators need not be, we + * need to add warning suppressions. + */ + @SuppressWarnings("serial") static class Traverser<K,V,R> { + final ConcurrentHashMapV8<K, V> map; + Node next; // the next entry to use + K nextKey; // cached key field of next + V nextVal; // cached val field of next + AtomicReferenceArray<Node> tab; // current table; updated if resized + int index; // index of bin to use next + int baseIndex; // current index of initial table + int baseLimit; // index bound for initial table + int baseSize; // initial table size + + /** Creates iterator for all entries in the table. */ + Traverser(ConcurrentHashMapV8<K, V> map) { + this.map = map; + } + + /** Creates iterator for split() methods */ + Traverser(Traverser<K,V,?> it) { + ConcurrentHashMapV8<K, V> m; AtomicReferenceArray<Node> t; + if ((m = this.map = it.map) == null) + t = null; + else if ((t = it.tab) == null && // force parent tab initialization + (t = it.tab = m.table) != null) + it.baseLimit = it.baseSize = t.length(); + this.tab = t; + this.baseSize = it.baseSize; + it.baseLimit = this.index = this.baseIndex = + ((this.baseLimit = it.baseLimit) + it.baseIndex + 1) >>> 1; + } + + /** + * Advances next; returns nextVal or null if terminated. + * See above for explanation. + */ + final V advance() { + Node e = next; + V ev = null; + outer: do { + if (e != null) // advance past used/skipped node + e = e.next; + while (e == null) { // get to next non-null bin + ConcurrentHashMapV8<K, V> m; + AtomicReferenceArray<Node> t; int b, i, n; Object ek; // checks must use locals + if ((t = tab) != null) + n = t.length(); + else if ((m = map) != null && (t = tab = m.table) != null) + n = baseLimit = baseSize = t.length(); + else + break outer; + if ((b = baseIndex) >= baseLimit || + (i = index) < 0 || i >= n) + break outer; + if ((e = tabAt(t, i)) != null && e.hash == MOVED) { + if ((ek = e.key) instanceof TreeBin) + e = ((TreeBin)ek).first; + else { + tab = (AtomicReferenceArray<Node>)ek; + continue; // restarts due to null val + } + } // visit upper slots if present + index = (i += baseSize) < n ? i : (baseIndex = b + 1); + } + nextKey = (K) e.key; + } while ((ev = (V) e.val) == null); // skip deleted or special nodes + next = e; + return nextVal = ev; + } + + public final void remove() { + Object k = nextKey; + if (k == null && (advance() == null || (k = nextKey) == null)) + throw new IllegalStateException(); + map.internalReplace(k, null, null); + } + + public final boolean hasNext() { + return nextVal != null || advance() != null; + } + + public final boolean hasMoreElements() { return hasNext(); } + public final void setRawResult(Object x) { } + public R getRawResult() { return null; } + public boolean exec() { return true; } + } + + /* ---------------- Public operations -------------- */ + + /** + * Creates a new, empty map with the default initial table size (16). + */ + public ConcurrentHashMapV8() { + this.counter = new LongAdder(); + } + + /** + * Creates a new, empty map with an initial table size + * accommodating the specified number of elements without the need + * to dynamically resize. + * + * @param initialCapacity The implementation performs internal + * sizing to accommodate this many elements. + * @throws IllegalArgumentException if the initial capacity of + * elements is negative + */ + public ConcurrentHashMapV8(int initialCapacity) { + if (initialCapacity < 0) + throw new IllegalArgumentException(); + int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? + MAXIMUM_CAPACITY : + tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1)); + this.counter = new LongAdder(); + this.sizeCtl = cap; + } + + /** + * Creates a new map with the same mappings as the given map. + * + * @param m the map + */ + public ConcurrentHashMapV8(Map<? extends K, ? extends V> m) { + this.counter = new LongAdder(); + this.sizeCtl = DEFAULT_CAPACITY; + internalPutAll(m); + } + + /** + * Creates a new, empty map with an initial table size based on + * the given number of elements ({@code initialCapacity}) and + * initial table density ({@code loadFactor}). + * + * @param initialCapacity the initial capacity. The implementation + * performs internal sizing to accommodate this many elements, + * given the specified load factor. + * @param loadFactor the load factor (table density) for + * establishing the initial table size + * @throws IllegalArgumentException if the initial capacity of + * elements is negative or the load factor is nonpositive + * + * @since 1.6 + */ + public ConcurrentHashMapV8(int initialCapacity, float loadFactor) { + this(initialCapacity, loadFactor, 1); + } + + /** + * Creates a new, empty map with an initial table size based on + * the given number of elements ({@code initialCapacity}), table + * density ({@code loadFactor}), and number of concurrently + * updating threads ({@code concurrencyLevel}). + * + * @param initialCapacity the initial capacity. The implementation + * performs internal sizing to accommodate this many elements, + * given the specified load factor. + * @param loadFactor the load factor (table density) for + * establishing the initial table size + * @param concurrencyLevel the estimated number of concurrently + * updating threads. The implementation may use this value as + * a sizing hint. + * @throws IllegalArgumentException if the initial capacity is + * negative or the load factor or concurrencyLevel are + * nonpositive + */ + public ConcurrentHashMapV8(int initialCapacity, + float loadFactor, int concurrencyLevel) { + if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0) + throw new IllegalArgumentException(); + if (initialCapacity < concurrencyLevel) // Use at least as many bins + initialCapacity = concurrencyLevel; // as estimated threads + long size = (long)(1.0 + (long)initialCapacity / loadFactor); + int cap = (size >= (long)MAXIMUM_CAPACITY) ? + MAXIMUM_CAPACITY : tableSizeFor((int)size); + this.counter = new LongAdder(); + this.sizeCtl = cap; + } + + /** + * Creates a new {@link Set} backed by a ConcurrentHashMapV8 + * from the given type to {@code Boolean.TRUE}. + * + * @return the new set + */ + public static <K> KeySetView<K,Boolean> newKeySet() { + return new KeySetView<K,Boolean>(new ConcurrentHashMapV8<K,Boolean>(), + Boolean.TRUE); + } + + /** + * Creates a new {@link Set} backed by a ConcurrentHashMapV8 + * from the given type to {@code Boolean.TRUE}. + * + * @param initialCapacity The implementation performs internal + * sizing to accommodate this many elements. + * @throws IllegalArgumentException if the initial capacity of + * elements is negative + * @return the new set + */ + public static <K> KeySetView<K,Boolean> newKeySet(int initialCapacity) { + return new KeySetView<K,Boolean>(new ConcurrentHashMapV8<K,Boolean>(initialCapacity), + Boolean.TRUE); + } + + /** + * {@inheritDoc} + */ + public boolean isEmpty() { + return counter.sum() <= 0L; // ignore transient negative values + } + + /** + * {@inheritDoc} + */ + public int size() { + long n = counter.sum(); + return ((n < 0L) ? 0 : + (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : + (int)n); + } + + /** + * Returns the number of mappings. This method should be used + * instead of {@link #size} because a ConcurrentHashMapV8 may + * contain more mappings than can be represented as an int. The + * value returned is a snapshot; the actual count may differ if + * there are ongoing concurrent insertions or removals. + * + * @return the number of mappings + */ + public long mappingCount() { + long n = counter.sum(); + return (n < 0L) ? 0L : n; // ignore transient negative values + } + + /** + * Returns the value to which the specified key is mapped, + * or {@code null} if this map contains no mapping for the key. + * + * <p>More formally, if this map contains a mapping from a key + * {@code k} to a value {@code v} such that {@code key.equals(k)}, + * then this method returns {@code v}; otherwise it returns + * {@code null}. (There can be at most one such mapping.) + * + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V get(Object key) { + if (key == null) + throw new NullPointerException(); + return (V)internalGet(key); + } + + /** + * Returns the value to which the specified key is mapped, + * or the given defaultValue if this map contains no mapping for the key. + * + * @param key the key + * @param defaultValue the value to return if this map contains + * no mapping for the given key + * @return the mapping for the key, if present; else the defaultValue + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V getValueOrDefault(Object key, V defaultValue) { + if (key == null) + throw new NullPointerException(); + V v = (V) internalGet(key); + return v == null ? defaultValue : v; + } + + /** + * Tests if the specified object is a key in this table. + * + * @param key possible key + * @return {@code true} if and only if the specified object + * is a key in this table, as determined by the + * {@code equals} method; {@code false} otherwise + * @throws NullPointerException if the specified key is null + */ + public boolean containsKey(Object key) { + if (key == null) + throw new NullPointerException(); + return internalGet(key) != null; + } + + /** + * Returns {@code true} if this map maps one or more keys to the + * specified value. Note: This method may require a full traversal + * of the map, and is much slower than method {@code containsKey}. + * + * @param value value whose presence in this map is to be tested + * @return {@code true} if this map maps one or more keys to the + * specified value + * @throws NullPointerException if the specified value is null + */ + public boolean containsValue(Object value) { + if (value == null) + throw new NullPointerException(); + Object v; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + while ((v = it.advance()) != null) { + if (v == value || value.equals(v)) + return true; + } + return false; + } + + public K findKey(Object value) { + if (value == null) + throw new NullPointerException(); + Object v; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + while ((v = it.advance()) != null) { + if (v == value || value.equals(v)) + return it.nextKey; + } + return null; + } + + /** + * Legacy method testing if some key maps into the specified value + * in this table. This method is identical in functionality to + * {@link #containsValue}, and exists solely to ensure + * full compatibility with class {@link java.util.Hashtable}, + * which supported this method prior to introduction of the + * Java Collections framework. + * + * @param value a value to search for + * @return {@code true} if and only if some key maps to the + * {@code value} argument in this table as + * determined by the {@code equals} method; + * {@code false} otherwise + * @throws NullPointerException if the specified value is null + */ + public boolean contains(Object value) { + return containsValue(value); + } + + /** + * Maps the specified key to the specified value in this table. + * Neither the key nor the value can be null. + * + * <p>The value can be retrieved by calling the {@code get} method + * with a key that is equal to the original key. + * + * @param key key with which the specified value is to be associated + * @param value value to be associated with the specified key + * @return the previous value associated with {@code key}, or + * {@code null} if there was no mapping for {@code key} + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V put(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalPut(key, value); + } + + /** + * {@inheritDoc} + * + * @return the previous value associated with the specified key, + * or {@code null} if there was no mapping for the key + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V putIfAbsent(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalPutIfAbsent(key, value); + } + + /** + * Copies all of the mappings from the specified map to this one. + * These mappings replace any mappings that this map had for any of the + * keys currently in the specified map. + * + * @param m mappings to be stored in this map + */ + public void putAll(Map<? extends K, ? extends V> m) { + internalPutAll(m); + } + + /** + * If the specified key is not already associated with a value, + * computes its value using the given mappingFunction and enters + * it into the map unless null. This is equivalent to + * <pre> {@code + * if (map.containsKey(key)) + * return map.get(key); + * value = mappingFunction.apply(key); + * if (value != null) + * map.put(key, value); + * return value;}</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null} no mapping is recorded. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and no mapping is recorded. Some + * attempted update operations on this map by other threads may be + * blocked while computation is in progress, so the computation + * should be short and simple, and must not attempt to update any + * other mappings of this Map. The most appropriate usage is to + * construct a new object serving as an initial mapped value, or + * memoized result, as in: + * + * <pre> {@code + * map.computeIfAbsent(key, new Fun<K, V>() { + * public V map(K k) { return new Value(f(k)); }});}</pre> + * + * @param key key with which the specified value is to be associated + * @param mappingFunction the function to compute a value + * @return the current (existing or computed) value associated with + * the specified key, or null if the computed value is null + * @throws NullPointerException if the specified key or mappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the mappingFunction does so, + * in which case the mapping is left unestablished + */ + @SuppressWarnings("unchecked") public V computeIfAbsent + (K key, Fun<? super K, ? extends V> mappingFunction) { + if (key == null || mappingFunction == null) + throw new NullPointerException(); + return (V)internalComputeIfAbsent(key, mappingFunction); + } + + /** + * If the given key is present, computes a new mapping value given a key and + * its current mapped value. This is equivalent to + * <pre> {@code + * if (map.containsKey(key)) { + * value = remappingFunction.apply(key, map.get(key)); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * } + * }</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. For example, + * to either create or append new messages to a value mapping: + * + * @param key key with which the specified value is to be associated + * @param remappingFunction the function to compute a value + * @return the new value associated with the specified key, or null if none + * @throws NullPointerException if the specified key or remappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the remappingFunction does so, + * in which case the mapping is unchanged + */ + @SuppressWarnings("unchecked") public V computeIfPresent + (K key, BiFun<? super K, ? super V, ? extends V> remappingFunction) { + if (key == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalCompute(key, true, remappingFunction); + } + + /** + * Computes a new mapping value given a key and + * its current mapped value (or {@code null} if there is no current + * mapping). This is equivalent to + * <pre> {@code + * value = remappingFunction.apply(key, map.get(key)); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * }</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. For example, + * to either create or append new messages to a value mapping: + * + * <pre> {@code + * Map<Key, String> map = ...; + * final String msg = ...; + * map.compute(key, new BiFun<Key, String, String>() { + * public String apply(Key k, String v) { + * return (v == null) ? msg : v + msg;});}}</pre> + * + * @param key key with which the specified value is to be associated + * @param remappingFunction the function to compute a value + * @return the new value associated with the specified key, or null if none + * @throws NullPointerException if the specified key or remappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the remappingFunction does so, + * in which case the mapping is unchanged + */ + @SuppressWarnings("unchecked") public V compute + (K key, BiFun<? super K, ? super V, ? extends V> remappingFunction) { + if (key == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalCompute(key, false, remappingFunction); + } + + /** + * If the specified key is not already associated + * with a value, associate it with the given value. + * Otherwise, replace the value with the results of + * the given remapping function. This is equivalent to: + * <pre> {@code + * if (!map.containsKey(key)) + * map.put(value); + * else { + * newValue = remappingFunction.apply(map.get(key), value); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * } + * }</pre> + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. + */ + @SuppressWarnings("unchecked") public V merge + (K key, V value, BiFun<? super V, ? super V, ? extends V> remappingFunction) { + if (key == null || value == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalMerge(key, value, remappingFunction); + } + + /** + * Removes the key (and its corresponding value) from this map. + * This method does nothing if the key is not in the map. + * + * @param key the key that needs to be removed + * @return the previous value associated with {@code key}, or + * {@code null} if there was no mapping for {@code key} + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V remove(Object key) { + if (key == null) + throw new NullPointerException(); + return (V)internalReplace(key, null, null); + } + + /** + * {@inheritDoc} + * + * @throws NullPointerException if the specified key is null + */ + public boolean remove(Object key, Object value) { + if (key == null) + throw new NullPointerException(); + if (value == null) + return false; + return internalReplace(key, null, value) != null; + } + + /** + * {@inheritDoc} + * + * @throws NullPointerException if any of the arguments are null + */ + public boolean replace(K key, V oldValue, V newValue) { + if (key == null || oldValue == null || newValue == null) + throw new NullPointerException(); + return internalReplace(key, newValue, oldValue) != null; + } + + /** + * {@inheritDoc} + * + * @return the previous value associated with the specified key, + * or {@code null} if there was no mapping for the key + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V replace(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalReplace(key, value, null); + } + + /** + * Removes all of the mappings from this map. + */ + public void clear() { + internalClear(); + } + + /** + * Returns a {@link Set} view of the keys contained in this map. + * The set is backed by the map, so changes to the map are + * reflected in the set, and vice-versa. + * + * @return the set view + */ + public KeySetView<K,V> keySet() { + KeySetView<K,V> ks = keySet; + return (ks != null) ? ks : (keySet = new KeySetView<K,V>(this, null)); + } + + /** + * Returns a {@link Set} view of the keys in this map, using the + * given common mapped value for any additions (i.e., {@link + * Collection#add} and {@link Collection#addAll}). This is of + * course only appropriate if it is acceptable to use the same + * value for all additions from this view. + * + * @param mappedValue the mapped value to use for any + * additions. + * @return the set view + * @throws NullPointerException if the mappedValue is null + */ + public KeySetView<K,V> keySet(V mappedValue) { + if (mappedValue == null) + throw new NullPointerException(); + return new KeySetView<K,V>(this, mappedValue); + } + + /** + * Returns a {@link Collection} view of the values contained in this map. + * The collection is backed by the map, so changes to the map are + * reflected in the collection, and vice-versa. + */ + public ValuesView<K,V> values() { + ValuesView<K,V> vs = values; + return (vs != null) ? vs : (values = new ValuesView<K,V>(this)); + } + + /** + * Returns a {@link Set} view of the mappings contained in this map. + * The set is backed by the map, so changes to the map are + * reflected in the set, and vice-versa. The set supports element + * removal, which removes the corresponding mapping from the map, + * via the {@code Iterator.remove}, {@code Set.remove}, + * {@code removeAll}, {@code retainAll}, and {@code clear} + * operations. It does not support the {@code add} or + * {@code addAll} operations. + * + * <p>The view's {@code iterator} is a "weakly consistent" iterator + * that will never throw {@link ConcurrentModificationException}, + * and guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not guaranteed to) + * reflect any modifications subsequent to construction. + */ + public Set<Map.Entry<K,V>> entrySet() { + EntrySetView<K,V> es = entrySet; + return (es != null) ? es : (entrySet = new EntrySetView<K,V>(this)); + } + + /** + * Returns an enumeration of the keys in this table. + * + * @return an enumeration of the keys in this table + * @see #keySet() + */ + public Enumeration<K> keys() { + return new KeyIterator<K,V>(this); + } + + /** + * Returns an enumeration of the values in this table. + * + * @return an enumeration of the values in this table + * @see #values() + */ + public Enumeration<V> elements() { + return new ValueIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the keys in this map. + * + * @return a partitionable iterator of the keys in this map + */ + public Spliterator<K> keySpliterator() { + return new KeyIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the values in this map. + * + * @return a partitionable iterator of the values in this map + */ + public Spliterator<V> valueSpliterator() { + return new ValueIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the entries in this map. + * + * @return a partitionable iterator of the entries in this map + */ + public Spliterator<Map.Entry<K,V>> entrySpliterator() { + return new EntryIterator<K,V>(this); + } + + /** + * Returns the hash code value for this {@link Map}, i.e., + * the sum of, for each key-value pair in the map, + * {@code key.hashCode() ^ value.hashCode()}. + * + * @return the hash code value for this map + */ + public int hashCode() { + int h = 0; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object v; + while ((v = it.advance()) != null) { + h += it.nextKey.hashCode() ^ v.hashCode(); + } + return h; + } + + /** + * Returns a string representation of this map. The string + * representation consists of a list of key-value mappings (in no + * particular order) enclosed in braces ("{@code {}}"). Adjacent + * mappings are separated by the characters {@code ", "} (comma + * and space). Each key-value mapping is rendered as the key + * followed by an equals sign ("{@code =}") followed by the + * associated value. + * + * @return a string representation of this map + */ + public String toString() { + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + StringBuilder sb = new StringBuilder(); + sb.append('{'); + Object v; + if ((v = it.advance()) != null) { + for (;;) { + Object k = it.nextKey; + sb.append(k == this ? "(this Map)" : k); + sb.append('='); + sb.append(v == this ? "(this Map)" : v); + if ((v = it.advance()) == null) + break; + sb.append(',').append(' '); + } + } + return sb.append('}').toString(); + } + + /** + * Compares the specified object with this map for equality. + * Returns {@code true} if the given object is a map with the same + * mappings as this map. This operation may return misleading + * results if either map is concurrently modified during execution + * of this method. + * + * @param o object to be compared for equality with this map + * @return {@code true} if the specified object is equal to this map + */ + public boolean equals(Object o) { + if (o != this) { + if (!(o instanceof Map)) + return false; + Map<?,?> m = (Map<?,?>) o; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object val; + while ((val = it.advance()) != null) { + Object v = m.get(it.nextKey); + if (v == null || (v != val && !v.equals(val))) + return false; + } + for (Map.Entry<?,?> e : m.entrySet()) { + Object mk, mv, v; + if ((mk = e.getKey()) == null || + (mv = e.getValue()) == null || + (v = internalGet(mk)) == null || + (mv != v && !mv.equals(v))) + return false; + } + } + return true; + } + + /* ----------------Iterators -------------- */ + + @SuppressWarnings("serial") static final class KeyIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<K>, Enumeration<K> { + KeyIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + KeyIterator(Traverser<K,V,Object> it) { + super(it); + } + public KeyIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new KeyIterator<K,V>(this); + } + @SuppressWarnings("unchecked") public final K next() { + if (nextVal == null && advance() == null) + throw new NoSuchElementException(); + Object k = nextKey; + nextVal = null; + return (K) k; + } + + public final K nextElement() { return next(); } + } + + @SuppressWarnings("serial") static final class ValueIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<V>, Enumeration<V> { + ValueIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + ValueIterator(Traverser<K,V,Object> it) { + super(it); + } + public ValueIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new ValueIterator<K,V>(this); + } + + @SuppressWarnings("unchecked") public final V next() { + Object v; + if ((v = nextVal) == null && (v = advance()) == null) + throw new NoSuchElementException(); + nextVal = null; + return (V) v; + } + + public final V nextElement() { return next(); } + } + + @SuppressWarnings("serial") static final class EntryIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<Map.Entry<K,V>> { + EntryIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + EntryIterator(Traverser<K,V,Object> it) { + super(it); + } + public EntryIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new EntryIterator<K,V>(this); + } + + @SuppressWarnings("unchecked") public final Map.Entry<K,V> next() { + Object v; + if ((v = nextVal) == null && (v = advance()) == null) + throw new NoSuchElementException(); + Object k = nextKey; + nextVal = null; + return new MapEntry<K,V>((K)k, (V)v, map); + } + } + + /** + * Exported Entry for iterators + */ + static final class MapEntry<K,V> implements Map.Entry<K, V> { + final K key; // non-null + V val; // non-null + final ConcurrentHashMapV8<K, V> map; + MapEntry(K key, V val, ConcurrentHashMapV8<K, V> map) { + this.key = key; + this.val = val; + this.map = map; + } + public final K getKey() { return key; } + public final V getValue() { return val; } + public final int hashCode() { return key.hashCode() ^ val.hashCode(); } + public final String toString(){ return key + "=" + val; } + + public final boolean equals(Object o) { + Object k, v; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (v = e.getValue()) != null && + (k == key || k.equals(key)) && + (v == val || v.equals(val))); + } + + /** + * Sets our entry's value and writes through to the map. The + * value to return is somewhat arbitrary here. Since we do not + * necessarily track asynchronous changes, the most recent + * "previous" value could be different from what we return (or + * could even have been removed in which case the put will + * re-establish). We do not and cannot guarantee more. + */ + public final V setValue(V value) { + if (value == null) throw new NullPointerException(); + V v = val; + val = value; + map.put(key, value); + return v; + } + } + + /* ---------------- Serialization Support -------------- */ + + /** + * Stripped-down version of helper class used in previous version, + * declared for the sake of serialization compatibility + */ + static class Segment<K,V> implements Serializable { + private static final long serialVersionUID = 2249069246763182397L; + final float loadFactor; + Segment(float lf) { this.loadFactor = lf; } + } + + /** + * Saves the state of the {@code ConcurrentHashMapV8} instance to a + * stream (i.e., serializes it). + * @param s the stream + * @serialData + * the key (Object) and value (Object) + * for each key-value mapping, followed by a null pair. + * The key-value mappings are emitted in no particular order. + */ + @SuppressWarnings("unchecked") private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException { + if (segments == null) { // for serialization compatibility + segments = (Segment<K,V>[]) + new Segment<?,?>[DEFAULT_CONCURRENCY_LEVEL]; + for (int i = 0; i < segments.length; ++i) + segments[i] = new Segment<K,V>(LOAD_FACTOR); + } + s.defaultWriteObject(); + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object v; + while ((v = it.advance()) != null) { + s.writeObject(it.nextKey); + s.writeObject(v); + } + s.writeObject(null); + s.writeObject(null); + segments = null; // throw away + } + + /** + * Reconstitutes the instance from a stream (that is, deserializes it). + * @param s the stream + */ + @SuppressWarnings("unchecked") private void readObject(java.io.ObjectInputStream s) + throws java.io.IOException, ClassNotFoundException { + s.defaultReadObject(); + this.segments = null; // unneeded + // initialize transient final field + this.counter = new LongAdder(); + + // Create all nodes, then place in table once size is known + long size = 0L; + Node p = null; + for (;;) { + K k = (K) s.readObject(); + V v = (V) s.readObject(); + if (k != null && v != null) { + int h = spread(k.hashCode()); + p = new Node(h, k, v, p); + ++size; + } + else + break; + } + if (p != null) { + boolean init = false; + int n; + if (size >= (long)(MAXIMUM_CAPACITY >>> 1)) + n = MAXIMUM_CAPACITY; + else { + int sz = (int)size; + n = tableSizeFor(sz + (sz >>> 1) + 1); + } + int sc = sizeCtl; + boolean collide = false; + if (n > sc && + SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if (table == null) { + init = true; + AtomicReferenceArray<Node> tab = new AtomicReferenceArray<Node>(n); + int mask = n - 1; + while (p != null) { + int j = p.hash & mask; + Node next = p.next; + Node q = p.next = tabAt(tab, j); + setTabAt(tab, j, p); + if (!collide && q != null && q.hash == p.hash) + collide = true; + p = next; + } + table = tab; + counter.add(size); + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + if (collide) { // rescan and convert to TreeBins + AtomicReferenceArray<Node> tab = table; + for (int i = 0; i < tab.length(); ++i) { + int c = 0; + for (Node e = tabAt(tab, i); e != null; e = e.next) { + if (++c > TREE_THRESHOLD && + (e.key instanceof Comparable)) { + replaceWithTreeBin(tab, i, e.key); + break; + } + } + } + } + } + if (!init) { // Can only happen if unsafely published. + while (p != null) { + internalPut(p.key, p.val); + p = p.next; + } + } + } + } + + + // ------------------------------------------------------- + + // Sams + /** Interface describing a void action of one argument */ + public interface Action<A> { void apply(A a); } + /** Interface describing a void action of two arguments */ + public interface BiAction<A,B> { void apply(A a, B b); } + /** Interface describing a function of one argument */ + public interface Generator<T> { T apply(); } + /** Interface describing a function mapping its argument to a double */ + public interface ObjectToDouble<A> { double apply(A a); } + /** Interface describing a function mapping its argument to a long */ + public interface ObjectToLong<A> { long apply(A a); } + /** Interface describing a function mapping its argument to an int */ + public interface ObjectToInt<A> {int apply(A a); } + /** Interface describing a function mapping two arguments to a double */ + public interface ObjectByObjectToDouble<A,B> { double apply(A a, B b); } + /** Interface describing a function mapping two arguments to a long */ + public interface ObjectByObjectToLong<A,B> { long apply(A a, B b); } + /** Interface describing a function mapping two arguments to an int */ + public interface ObjectByObjectToInt<A,B> {int apply(A a, B b); } + /** Interface describing a function mapping a double to a double */ + public interface DoubleToDouble { double apply(double a); } + /** Interface describing a function mapping a long to a long */ + public interface LongToLong { long apply(long a); } + /** Interface describing a function mapping an int to an int */ + public interface IntToInt { int apply(int a); } + /** Interface describing a function mapping two doubles to a double */ + public interface DoubleByDoubleToDouble { double apply(double a, double b); } + /** Interface describing a function mapping two longs to a long */ + public interface LongByLongToLong { long apply(long a, long b); } + /** Interface describing a function mapping two ints to an int */ + public interface IntByIntToInt { int apply(int a, int b); } + + + /* ----------------Views -------------- */ + + /** + * Base class for views. + */ + static abstract class CHMView<K, V> { + final ConcurrentHashMapV8<K, V> map; + CHMView(ConcurrentHashMapV8<K, V> map) { this.map = map; } + + /** + * Returns the map backing this view. + * + * @return the map backing this view + */ + public ConcurrentHashMapV8<K,V> getMap() { return map; } + + public final int size() { return map.size(); } + public final boolean isEmpty() { return map.isEmpty(); } + public final void clear() { map.clear(); } + + // implementations below rely on concrete classes supplying these + abstract public Iterator<?> iterator(); + abstract public boolean contains(Object o); + abstract public boolean remove(Object o); + + private static final String oomeMsg = "Required array size too large"; + + public final Object[] toArray() { + long sz = map.mappingCount(); + if (sz > (long)(MAX_ARRAY_SIZE)) + throw new OutOfMemoryError(oomeMsg); + int n = (int)sz; + Object[] r = new Object[n]; + int i = 0; + Iterator<?> it = iterator(); + while (it.hasNext()) { + if (i == n) { + if (n >= MAX_ARRAY_SIZE) + throw new OutOfMemoryError(oomeMsg); + if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) + n = MAX_ARRAY_SIZE; + else + n += (n >>> 1) + 1; + r = Arrays.copyOf(r, n); + } + r[i++] = it.next(); + } + return (i == n) ? r : Arrays.copyOf(r, i); + } + + @SuppressWarnings("unchecked") public final <T> T[] toArray(T[] a) { + long sz = map.mappingCount(); + if (sz > (long)(MAX_ARRAY_SIZE)) + throw new OutOfMemoryError(oomeMsg); + int m = (int)sz; + T[] r = (a.length >= m) ? a : + (T[])java.lang.reflect.Array + .newInstance(a.getClass().getComponentType(), m); + int n = r.length; + int i = 0; + Iterator<?> it = iterator(); + while (it.hasNext()) { + if (i == n) { + if (n >= MAX_ARRAY_SIZE) + throw new OutOfMemoryError(oomeMsg); + if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) + n = MAX_ARRAY_SIZE; + else + n += (n >>> 1) + 1; + r = Arrays.copyOf(r, n); + } + r[i++] = (T)it.next(); + } + if (a == r && i < n) { + r[i] = null; // null-terminate + return r; + } + return (i == n) ? r : Arrays.copyOf(r, i); + } + + public final int hashCode() { + int h = 0; + for (Iterator<?> it = iterator(); it.hasNext();) + h += it.next().hashCode(); + return h; + } + + public final String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + Iterator<?> it = iterator(); + if (it.hasNext()) { + for (;;) { + Object e = it.next(); + sb.append(e == this ? "(this Collection)" : e); + if (!it.hasNext()) + break; + sb.append(',').append(' '); + } + } + return sb.append(']').toString(); + } + + public final boolean containsAll(Collection<?> c) { + if (c != this) { + for (Iterator<?> it = c.iterator(); it.hasNext();) { + Object e = it.next(); + if (e == null || !contains(e)) + return false; + } + } + return true; + } + + public final boolean removeAll(Collection<?> c) { + boolean modified = false; + for (Iterator<?> it = iterator(); it.hasNext();) { + if (c.contains(it.next())) { + it.remove(); + modified = true; + } + } + return modified; + } + + public final boolean retainAll(Collection<?> c) { + boolean modified = false; + for (Iterator<?> it = iterator(); it.hasNext();) { + if (!c.contains(it.next())) { + it.remove(); + modified = true; + } + } + return modified; + } + + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Set} of keys, in + * which additions may optionally be enabled by mapping to a + * common value. This class cannot be directly instantiated. See + * {@link #keySet}, {@link #keySet(Object)}, {@link #newKeySet()}, + * {@link #newKeySet(int)}. + */ + public static class KeySetView<K,V> extends CHMView<K,V> implements Set<K>, java.io.Serializable { + private static final long serialVersionUID = 7249069246763182397L; + private final V value; + KeySetView(ConcurrentHashMapV8<K, V> map, V value) { // non-public + super(map); + this.value = value; + } + + /** + * Returns the default mapped value for additions, + * or {@code null} if additions are not supported. + * + * @return the default mapped value for additions, or {@code null} + * if not supported. + */ + public V getMappedValue() { return value; } + + // implement Set API + + public boolean contains(Object o) { return map.containsKey(o); } + public boolean remove(Object o) { return map.remove(o) != null; } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the keys of this map + */ + public Iterator<K> iterator() { return new KeyIterator<K,V>(map); } + public boolean add(K e) { + V v; + if ((v = value) == null) + throw new UnsupportedOperationException(); + if (e == null) + throw new NullPointerException(); + return map.internalPutIfAbsent(e, v) == null; + } + public boolean addAll(Collection<? extends K> c) { + boolean added = false; + V v; + if ((v = value) == null) + throw new UnsupportedOperationException(); + for (K e : c) { + if (e == null) + throw new NullPointerException(); + if (map.internalPutIfAbsent(e, v) == null) + added = true; + } + return added; + } + public boolean equals(Object o) { + Set<?> c; + return ((o instanceof Set) && + ((c = (Set<?>)o) == this || + (containsAll(c) && c.containsAll(this)))); + } + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Collection} of + * values, in which additions are disabled. This class cannot be + * directly instantiated. See {@link #values}, + * + * <p>The view's {@code iterator} is a "weakly consistent" iterator + * that will never throw {@link ConcurrentModificationException}, + * and guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not guaranteed to) + * reflect any modifications subsequent to construction. + */ + public static final class ValuesView<K,V> extends CHMView<K,V> + implements Collection<V> { + ValuesView(ConcurrentHashMapV8<K, V> map) { super(map); } + public final boolean contains(Object o) { return map.containsValue(o); } + public final boolean remove(Object o) { + if (o != null) { + Iterator<V> it = new ValueIterator<K,V>(map); + while (it.hasNext()) { + if (o.equals(it.next())) { + it.remove(); + return true; + } + } + } + return false; + } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the values of this map + */ + public final Iterator<V> iterator() { + return new ValueIterator<K,V>(map); + } + public final boolean add(V e) { + throw new UnsupportedOperationException(); + } + public final boolean addAll(Collection<? extends V> c) { + throw new UnsupportedOperationException(); + } + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Set} of (key, value) + * entries. This class cannot be directly instantiated. See + * {@link #entrySet}. + */ + public static final class EntrySetView<K,V> extends CHMView<K,V> + implements Set<Map.Entry<K,V>> { + EntrySetView(ConcurrentHashMapV8<K, V> map) { super(map); } + public final boolean contains(Object o) { + Object k, v, r; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (r = map.get(k)) != null && + (v = e.getValue()) != null && + (v == r || v.equals(r))); + } + public final boolean remove(Object o) { + Object k, v; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (v = e.getValue()) != null && + map.remove(k, v)); + } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the entries of this map + */ + public final Iterator<Map.Entry<K,V>> iterator() { + return new EntryIterator<K,V>(map); + } + + public final boolean add(Entry<K,V> e) { + K key = e.getKey(); + V value = e.getValue(); + if (key == null || value == null) + throw new NullPointerException(); + return map.internalPut(key, value) == null; + } + public final boolean addAll(Collection<? extends Entry<K,V>> c) { + boolean added = false; + for (Entry<K,V> e : c) { + if (add(e)) + added = true; + } + return added; + } + public boolean equals(Object o) { + Set<?> c; + return ((o instanceof Set) && + ((c = (Set<?>)o) == this || + (containsAll(c) && c.containsAll(this)))); + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/LongAdder.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/LongAdder.java new file mode 100644 index 000000000000..ecf552a23cd1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/LongAdder.java @@ -0,0 +1,204 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.9 version. + +package com.concurrent_ruby.ext.jsr166e.nounsafe; + +import java.util.concurrent.atomic.AtomicLong; +import java.io.IOException; +import java.io.Serializable; +import java.io.ObjectInputStream; + +/** + * One or more variables that together maintain an initially zero + * {@code long} sum. When updates (method {@link #add}) are contended + * across threads, the set of variables may grow dynamically to reduce + * contention. Method {@link #sum} (or, equivalently, {@link + * #longValue}) returns the current total combined across the + * variables maintaining the sum. + * + * <p>This class is usually preferable to {@link AtomicLong} when + * multiple threads update a common sum that is used for purposes such + * as collecting statistics, not for fine-grained synchronization + * control. Under low update contention, the two classes have similar + * characteristics. But under high contention, expected throughput of + * this class is significantly higher, at the expense of higher space + * consumption. + * + * <p>This class extends {@link Number}, but does <em>not</em> define + * methods such as {@code hashCode} and {@code compareTo} because + * instances are expected to be mutated, and so are not useful as + * collection keys. + * + * <p><em>jsr166e note: This class is targeted to be placed in + * java.util.concurrent.atomic.</em> + * + * @since 1.8 + * @author Doug Lea + */ +public class LongAdder extends Striped64 implements Serializable { + private static final long serialVersionUID = 7249069246863182397L; + + /** + * Version of plus for use in retryUpdate + */ + final long fn(long v, long x) { return v + x; } + + /** + * Creates a new adder with initial sum of zero. + */ + public LongAdder() { + } + + /** + * Adds the given value. + * + * @param x the value to add + */ + public void add(long x) { + Cell[] as; long b, v; HashCode hc; Cell a; int n; + if ((as = cells) != null || !casBase(b = base, b + x)) { + boolean uncontended = true; + int h = (hc = threadHashCode.get()).code; + if (as == null || (n = as.length) < 1 || + (a = as[(n - 1) & h]) == null || + !(uncontended = a.cas(v = a.value, v + x))) + retryUpdate(x, hc, uncontended); + } + } + + /** + * Equivalent to {@code add(1)}. + */ + public void increment() { + add(1L); + } + + /** + * Equivalent to {@code add(-1)}. + */ + public void decrement() { + add(-1L); + } + + /** + * Returns the current sum. The returned value is <em>NOT</em> an + * atomic snapshot: Invocation in the absence of concurrent + * updates returns an accurate result, but concurrent updates that + * occur while the sum is being calculated might not be + * incorporated. + * + * @return the sum + */ + public long sum() { + long sum = base; + Cell[] as = cells; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) + sum += a.value; + } + } + return sum; + } + + /** + * Resets variables maintaining the sum to zero. This method may + * be a useful alternative to creating a new adder, but is only + * effective if there are no concurrent updates. Because this + * method is intrinsically racy, it should only be used when it is + * known that no threads are concurrently updating. + */ + public void reset() { + internalReset(0L); + } + + /** + * Equivalent in effect to {@link #sum} followed by {@link + * #reset}. This method may apply for example during quiescent + * points between multithreaded computations. If there are + * updates concurrent with this method, the returned value is + * <em>not</em> guaranteed to be the final value occurring before + * the reset. + * + * @return the sum + */ + public long sumThenReset() { + long sum = base; + Cell[] as = cells; + base = 0L; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) { + sum += a.value; + a.value = 0L; + } + } + } + return sum; + } + + /** + * Returns the String representation of the {@link #sum}. + * @return the String representation of the {@link #sum} + */ + public String toString() { + return Long.toString(sum()); + } + + /** + * Equivalent to {@link #sum}. + * + * @return the sum + */ + public long longValue() { + return sum(); + } + + /** + * Returns the {@link #sum} as an {@code int} after a narrowing + * primitive conversion. + */ + public int intValue() { + return (int)sum(); + } + + /** + * Returns the {@link #sum} as a {@code float} + * after a widening primitive conversion. + */ + public float floatValue() { + return (float)sum(); + } + + /** + * Returns the {@link #sum} as a {@code double} after a widening + * primitive conversion. + */ + public double doubleValue() { + return (double)sum(); + } + + private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException { + s.defaultWriteObject(); + s.writeLong(sum()); + } + + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + busy = 0; + cells = null; + base = s.readLong(); + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/Striped64.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/Striped64.java new file mode 100644 index 000000000000..f52164242aa0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166e/nounsafe/Striped64.java @@ -0,0 +1,291 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.5 version. + +package com.concurrent_ruby.ext.jsr166e.nounsafe; + +import java.util.Random; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.concurrent.atomic.AtomicLongFieldUpdater; + +/** + * A package-local class holding common representation and mechanics + * for classes supporting dynamic striping on 64bit values. The class + * extends Number so that concrete subclasses must publicly do so. + */ +abstract class Striped64 extends Number { + /* + * This class maintains a lazily-initialized table of atomically + * updated variables, plus an extra "base" field. The table size + * is a power of two. Indexing uses masked per-thread hash codes. + * Nearly all declarations in this class are package-private, + * accessed directly by subclasses. + * + * Table entries are of class Cell; a variant of AtomicLong padded + * to reduce cache contention on most processors. Padding is + * overkill for most Atomics because they are usually irregularly + * scattered in memory and thus don't interfere much with each + * other. But Atomic objects residing in arrays will tend to be + * placed adjacent to each other, and so will most often share + * cache lines (with a huge negative performance impact) without + * this precaution. + * + * In part because Cells are relatively large, we avoid creating + * them until they are needed. When there is no contention, all + * updates are made to the base field. Upon first contention (a + * failed CAS on base update), the table is initialized to size 2. + * The table size is doubled upon further contention until + * reaching the nearest power of two greater than or equal to the + * number of CPUS. Table slots remain empty (null) until they are + * needed. + * + * A single spinlock ("busy") is used for initializing and + * resizing the table, as well as populating slots with new Cells. + * There is no need for a blocking lock: When the lock is not + * available, threads try other slots (or the base). During these + * retries, there is increased contention and reduced locality, + * which is still better than alternatives. + * + * Per-thread hash codes are initialized to random values. + * Contention and/or table collisions are indicated by failed + * CASes when performing an update operation (see method + * retryUpdate). Upon a collision, if the table size is less than + * the capacity, it is doubled in size unless some other thread + * holds the lock. If a hashed slot is empty, and lock is + * available, a new Cell is created. Otherwise, if the slot + * exists, a CAS is tried. Retries proceed by "double hashing", + * using a secondary hash (Marsaglia XorShift) to try to find a + * free slot. + * + * The table size is capped because, when there are more threads + * than CPUs, supposing that each thread were bound to a CPU, + * there would exist a perfect hash function mapping threads to + * slots that eliminates collisions. When we reach capacity, we + * search for this mapping by randomly varying the hash codes of + * colliding threads. Because search is random, and collisions + * only become known via CAS failures, convergence can be slow, + * and because threads are typically not bound to CPUS forever, + * may not occur at all. However, despite these limitations, + * observed contention rates are typically low in these cases. + * + * It is possible for a Cell to become unused when threads that + * once hashed to it terminate, as well as in the case where + * doubling the table causes no thread to hash to it under + * expanded mask. We do not try to detect or remove such cells, + * under the assumption that for long-running instances, observed + * contention levels will recur, so the cells will eventually be + * needed again; and for short-lived ones, it does not matter. + */ + + /** + * Padded variant of AtomicLong supporting only raw accesses plus CAS. + * The value field is placed between pads, hoping that the JVM doesn't + * reorder them. + * + * JVM intrinsics note: It would be possible to use a release-only + * form of CAS here, if it were provided. + */ + static final class Cell { + volatile long p0, p1, p2, p3, p4, p5, p6; + volatile long value; + volatile long q0, q1, q2, q3, q4, q5, q6; + + static AtomicLongFieldUpdater<Cell> VALUE_UPDATER = AtomicLongFieldUpdater.newUpdater(Cell.class, "value"); + + Cell(long x) { value = x; } + + final boolean cas(long cmp, long val) { + return VALUE_UPDATER.compareAndSet(this, cmp, val); + } + + } + + /** + * Holder for the thread-local hash code. The code is initially + * random, but may be set to a different value upon collisions. + */ + static final class HashCode { + static final Random rng = new Random(); + int code; + HashCode() { + int h = rng.nextInt(); // Avoid zero to allow xorShift rehash + code = (h == 0) ? 1 : h; + } + } + + /** + * The corresponding ThreadLocal class + */ + static final class ThreadHashCode extends ThreadLocal<HashCode> { + public HashCode initialValue() { return new HashCode(); } + } + + /** + * Static per-thread hash codes. Shared across all instances to + * reduce ThreadLocal pollution and because adjustments due to + * collisions in one table are likely to be appropriate for + * others. + */ + static final ThreadHashCode threadHashCode = new ThreadHashCode(); + + /** Number of CPUS, to place bound on table size */ + static final int NCPU = Runtime.getRuntime().availableProcessors(); + + /** + * Table of cells. When non-null, size is a power of 2. + */ + transient volatile Cell[] cells; + + /** + * Base value, used mainly when there is no contention, but also as + * a fallback during table initialization races. Updated via CAS. + */ + transient volatile long base; + + /** + * Spinlock (locked via CAS) used when resizing and/or creating Cells. + */ + transient volatile int busy; + + AtomicLongFieldUpdater<Striped64> BASE_UPDATER = AtomicLongFieldUpdater.newUpdater(Striped64.class, "base"); + AtomicIntegerFieldUpdater<Striped64> BUSY_UPDATER = AtomicIntegerFieldUpdater.newUpdater(Striped64.class, "busy"); + + /** + * Package-private default constructor + */ + Striped64() { + } + + /** + * CASes the base field. + */ + final boolean casBase(long cmp, long val) { + return BASE_UPDATER.compareAndSet(this, cmp, val); + } + + /** + * CASes the busy field from 0 to 1 to acquire lock. + */ + final boolean casBusy() { + return BUSY_UPDATER.compareAndSet(this, 0, 1); + } + + /** + * Computes the function of current and new value. Subclasses + * should open-code this update function for most uses, but the + * virtualized form is needed within retryUpdate. + * + * @param currentValue the current value (of either base or a cell) + * @param newValue the argument from a user update call + * @return result of the update function + */ + abstract long fn(long currentValue, long newValue); + + /** + * Handles cases of updates involving initialization, resizing, + * creating new Cells, and/or contention. See above for + * explanation. This method suffers the usual non-modularity + * problems of optimistic retry code, relying on rechecked sets of + * reads. + * + * @param x the value + * @param hc the hash code holder + * @param wasUncontended false if CAS failed before call + */ + final void retryUpdate(long x, HashCode hc, boolean wasUncontended) { + int h = hc.code; + boolean collide = false; // True if last slot nonempty + for (;;) { + Cell[] as; Cell a; int n; long v; + if ((as = cells) != null && (n = as.length) > 0) { + if ((a = as[(n - 1) & h]) == null) { + if (busy == 0) { // Try to attach new Cell + Cell r = new Cell(x); // Optimistically create + if (busy == 0 && casBusy()) { + boolean created = false; + try { // Recheck under lock + Cell[] rs; int m, j; + if ((rs = cells) != null && + (m = rs.length) > 0 && + rs[j = (m - 1) & h] == null) { + rs[j] = r; + created = true; + } + } finally { + busy = 0; + } + if (created) + break; + continue; // Slot is now non-empty + } + } + collide = false; + } + else if (!wasUncontended) // CAS already known to fail + wasUncontended = true; // Continue after rehash + else if (a.cas(v = a.value, fn(v, x))) + break; + else if (n >= NCPU || cells != as) + collide = false; // At max size or stale + else if (!collide) + collide = true; + else if (busy == 0 && casBusy()) { + try { + if (cells == as) { // Expand table unless stale + Cell[] rs = new Cell[n << 1]; + for (int i = 0; i < n; ++i) + rs[i] = as[i]; + cells = rs; + } + } finally { + busy = 0; + } + collide = false; + continue; // Retry with expanded table + } + h ^= h << 13; // Rehash + h ^= h >>> 17; + h ^= h << 5; + } + else if (busy == 0 && cells == as && casBusy()) { + boolean init = false; + try { // Initialize table + if (cells == as) { + Cell[] rs = new Cell[2]; + rs[h & 1] = new Cell(x); + cells = rs; + init = true; + } + } finally { + busy = 0; + } + if (init) + break; + } + else if (casBase(v = base, fn(v, x))) + break; // Fall back on using base + } + hc.code = h; // Record index for next time + } + + + /** + * Sets base and all cells to the given value. + */ + final void internalReset(long initialValue) { + Cell[] as = cells; + base = initialValue; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) + a.value = initialValue; + } + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166y/ThreadLocalRandom.java b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166y/ThreadLocalRandom.java new file mode 100644 index 000000000000..3ea409ffc497 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/ext/concurrent-ruby/com/concurrent_ruby/ext/jsr166y/ThreadLocalRandom.java @@ -0,0 +1,199 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.16 version + +package com.concurrent_ruby.ext.jsr166y; + +import java.util.Random; + +/** + * A random number generator isolated to the current thread. Like the + * global {@link java.util.Random} generator used by the {@link + * java.lang.Math} class, a {@code ThreadLocalRandom} is initialized + * with an internally generated seed that may not otherwise be + * modified. When applicable, use of {@code ThreadLocalRandom} rather + * than shared {@code Random} objects in concurrent programs will + * typically encounter much less overhead and contention. Use of + * {@code ThreadLocalRandom} is particularly appropriate when multiple + * tasks (for example, each a {@link ForkJoinTask}) use random numbers + * in parallel in thread pools. + * + * <p>Usages of this class should typically be of the form: + * {@code ThreadLocalRandom.current().nextX(...)} (where + * {@code X} is {@code Int}, {@code Long}, etc). + * When all usages are of this form, it is never possible to + * accidently share a {@code ThreadLocalRandom} across multiple threads. + * + * <p>This class also provides additional commonly used bounded random + * generation methods. + * + * @since 1.7 + * @author Doug Lea + */ +public class ThreadLocalRandom extends Random { + // same constants as Random, but must be redeclared because private + private static final long multiplier = 0x5DEECE66DL; + private static final long addend = 0xBL; + private static final long mask = (1L << 48) - 1; + + /** + * The random seed. We can't use super.seed. + */ + private long rnd; + + /** + * Initialization flag to permit calls to setSeed to succeed only + * while executing the Random constructor. We can't allow others + * since it would cause setting seed in one part of a program to + * unintentionally impact other usages by the thread. + */ + boolean initialized; + + // Padding to help avoid memory contention among seed updates in + // different TLRs in the common case that they are located near + // each other. + private long pad0, pad1, pad2, pad3, pad4, pad5, pad6, pad7; + + /** + * The actual ThreadLocal + */ + private static final ThreadLocal<ThreadLocalRandom> localRandom = + new ThreadLocal<ThreadLocalRandom>() { + protected ThreadLocalRandom initialValue() { + return new ThreadLocalRandom(); + } + }; + + + /** + * Constructor called only by localRandom.initialValue. + */ + ThreadLocalRandom() { + super(); + initialized = true; + } + + /** + * Returns the current thread's {@code ThreadLocalRandom}. + * + * @return the current thread's {@code ThreadLocalRandom} + */ + public static ThreadLocalRandom current() { + return localRandom.get(); + } + + /** + * Throws {@code UnsupportedOperationException}. Setting seeds in + * this generator is not supported. + * + * @throws UnsupportedOperationException always + */ + public void setSeed(long seed) { + if (initialized) + throw new UnsupportedOperationException(); + rnd = (seed ^ multiplier) & mask; + } + + protected int next(int bits) { + rnd = (rnd * multiplier + addend) & mask; + return (int) (rnd >>> (48-bits)); + } + + /** + * Returns a pseudorandom, uniformly distributed value between the + * given least value (inclusive) and bound (exclusive). + * + * @param least the least value returned + * @param bound the upper bound (exclusive) + * @throws IllegalArgumentException if least greater than or equal + * to bound + * @return the next value + */ + public int nextInt(int least, int bound) { + if (least >= bound) + throw new IllegalArgumentException(); + return nextInt(bound - least) + least; + } + + /** + * Returns a pseudorandom, uniformly distributed value + * between 0 (inclusive) and the specified value (exclusive). + * + * @param n the bound on the random number to be returned. Must be + * positive. + * @return the next value + * @throws IllegalArgumentException if n is not positive + */ + public long nextLong(long n) { + if (n <= 0) + throw new IllegalArgumentException("n must be positive"); + // Divide n by two until small enough for nextInt. On each + // iteration (at most 31 of them but usually much less), + // randomly choose both whether to include high bit in result + // (offset) and whether to continue with the lower vs upper + // half (which makes a difference only if odd). + long offset = 0; + while (n >= Integer.MAX_VALUE) { + int bits = next(2); + long half = n >>> 1; + long nextn = ((bits & 2) == 0) ? half : n - half; + if ((bits & 1) == 0) + offset += n - nextn; + n = nextn; + } + return offset + nextInt((int) n); + } + + /** + * Returns a pseudorandom, uniformly distributed value between the + * given least value (inclusive) and bound (exclusive). + * + * @param least the least value returned + * @param bound the upper bound (exclusive) + * @return the next value + * @throws IllegalArgumentException if least greater than or equal + * to bound + */ + public long nextLong(long least, long bound) { + if (least >= bound) + throw new IllegalArgumentException(); + return nextLong(bound - least) + least; + } + + /** + * Returns a pseudorandom, uniformly distributed {@code double} value + * between 0 (inclusive) and the specified value (exclusive). + * + * @param n the bound on the random number to be returned. Must be + * positive. + * @return the next value + * @throws IllegalArgumentException if n is not positive + */ + public double nextDouble(double n) { + if (n <= 0) + throw new IllegalArgumentException("n must be positive"); + return nextDouble() * n; + } + + /** + * Returns a pseudorandom, uniformly distributed value between the + * given least value (inclusive) and bound (exclusive). + * + * @param least the least value returned + * @param bound the upper bound (exclusive) + * @return the next value + * @throws IllegalArgumentException if least greater than or equal + * to bound + */ + public double nextDouble(double least, double bound) { + if (least >= bound) + throw new IllegalArgumentException(); + return nextDouble() * (bound - least) + least; + } + + private static final long serialVersionUID = -5851777807851030925L; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent-ruby.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent-ruby.rb new file mode 100644 index 000000000000..08917e3bb7f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent-ruby.rb @@ -0,0 +1 @@ +require_relative "./concurrent" diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent.rb new file mode 100644 index 000000000000..87de46f1b8a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent.rb @@ -0,0 +1,134 @@ +require 'concurrent/version' +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/configuration' + +require 'concurrent/atomics' +require 'concurrent/executors' +require 'concurrent/synchronization' + +require 'concurrent/atomic/atomic_markable_reference' +require 'concurrent/atomic/atomic_reference' +require 'concurrent/agent' +require 'concurrent/atom' +require 'concurrent/array' +require 'concurrent/hash' +require 'concurrent/set' +require 'concurrent/map' +require 'concurrent/tuple' +require 'concurrent/async' +require 'concurrent/dataflow' +require 'concurrent/delay' +require 'concurrent/exchanger' +require 'concurrent/future' +require 'concurrent/immutable_struct' +require 'concurrent/ivar' +require 'concurrent/maybe' +require 'concurrent/mutable_struct' +require 'concurrent/mvar' +require 'concurrent/promise' +require 'concurrent/scheduled_task' +require 'concurrent/settable_struct' +require 'concurrent/timer_task' +require 'concurrent/tvar' +require 'concurrent/promises' + +require 'concurrent/thread_safe/synchronized_delegator' +require 'concurrent/thread_safe/util' + +require 'concurrent/options' + +# @!macro internal_implementation_note +# +# @note **Private Implementation:** This abstraction is a private, internal +# implementation detail. It should never be used directly. + +# @!macro monotonic_clock_warning +# +# @note Time calculations on all platforms and languages are sensitive to +# changes to the system clock. To alleviate the potential problems +# associated with changing the system clock while an application is running, +# most modern operating systems provide a monotonic clock that operates +# independently of the system clock. A monotonic clock cannot be used to +# determine human-friendly clock times. A monotonic clock is used exclusively +# for calculating time intervals. Not all Ruby platforms provide access to an +# operating system monotonic clock. On these platforms a pure-Ruby monotonic +# clock will be used as a fallback. An operating system monotonic clock is both +# faster and more reliable than the pure-Ruby implementation. The pure-Ruby +# implementation should be fast and reliable enough for most non-realtime +# operations. At this time the common Ruby platforms that provide access to an +# operating system monotonic clock are MRI 2.1 and above and JRuby (all versions). +# +# @see http://linux.die.net/man/3/clock_gettime Linux clock_gettime(3) + +# @!macro copy_options +# +# ## Copy Options +# +# Object references in Ruby are mutable. This can lead to serious +# problems when the {#value} of an object is a mutable reference. Which +# is always the case unless the value is a `Fixnum`, `Symbol`, or similar +# "primitive" data type. Each instance can be configured with a few +# options that can help protect the program from potentially dangerous +# operations. Each of these options can be optionally set when the object +# instance is created: +# +# * `:dup_on_deref` When true the object will call the `#dup` method on +# the `value` object every time the `#value` method is called +# (default: false) +# * `:freeze_on_deref` When true the object will call the `#freeze` +# method on the `value` object every time the `#value` method is called +# (default: false) +# * `:copy_on_deref` When given a `Proc` object the `Proc` will be run +# every time the `#value` method is called. The `Proc` will be given +# the current `value` as its only argument and the result returned by +# the block will be the return value of the `#value` call. When `nil` +# this option will be ignored (default: nil) +# +# When multiple deref options are set the order of operations is strictly defined. +# The order of deref operations is: +# * `:copy_on_deref` +# * `:dup_on_deref` +# * `:freeze_on_deref` +# +# Because of this ordering there is no need to `#freeze` an object created by a +# provided `:copy_on_deref` block. Simply set `:freeze_on_deref` to `true`. +# Setting both `:dup_on_deref` to `true` and `:freeze_on_deref` to `true` is +# as close to the behavior of a "pure" functional language (like Erlang, Clojure, +# or Haskell) as we are likely to get in Ruby. + +# @!macro deref_options +# +# @option opts [Boolean] :dup_on_deref (false) Call `#dup` before +# returning the data from {#value} +# @option opts [Boolean] :freeze_on_deref (false) Call `#freeze` before +# returning the data from {#value} +# @option opts [Proc] :copy_on_deref (nil) When calling the {#value} +# method, call the given proc passing the internal value as the sole +# argument then return the new value returned from the proc. + +# @!macro executor_and_deref_options +# +# @param [Hash] opts the options used to define the behavior at update and deref +# and to specify the executor on which to perform actions +# @option opts [Executor] :executor when set use the given `Executor` instance. +# Three special values are also supported: `:io` returns the global pool for +# long, blocking (IO) tasks, `:fast` returns the global pool for short, fast +# operations, and `:immediate` returns the global `ImmediateExecutor` object. +# @!macro deref_options + +# @!macro warn.edge +# @api Edge +# @note **Edge Features** are under active development and may change frequently. +# +# - Deprecations are not added before incompatible changes. +# - Edge version: _major_ is always 0, _minor_ bump means incompatible change, +# _patch_ bump means compatible change. +# - Edge features may also lack tests and documentation. +# - Features developed in `concurrent-ruby-edge` are expected to move +# to `concurrent-ruby` when finalised. + + +# {include:file:README.md} +module Concurrent +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/agent.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/agent.rb new file mode 100644 index 000000000000..815dca008c32 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/agent.rb @@ -0,0 +1,587 @@ +require 'concurrent/configuration' +require 'concurrent/atomic/atomic_reference' +require 'concurrent/atomic/thread_local_var' +require 'concurrent/collection/copy_on_write_observer_set' +require 'concurrent/concern/observable' +require 'concurrent/synchronization' + +module Concurrent + + # `Agent` is inspired by Clojure's [agent](http://clojure.org/agents) + # function. An agent is a shared, mutable variable providing independent, + # uncoordinated, *asynchronous* change of individual values. Best used when + # the value will undergo frequent, complex updates. Suitable when the result + # of an update does not need to be known immediately. `Agent` is (mostly) + # functionally equivalent to Clojure's agent, except where the runtime + # prevents parity. + # + # Agents are reactive, not autonomous - there is no imperative message loop + # and no blocking receive. The state of an Agent should be itself immutable + # and the `#value` of an Agent is always immediately available for reading by + # any thread without any messages, i.e. observation does not require + # cooperation or coordination. + # + # Agent action dispatches are made using the various `#send` methods. These + # methods always return immediately. At some point later, in another thread, + # the following will happen: + # + # 1. The given `action` will be applied to the state of the Agent and the + # `args`, if any were supplied. + # 2. The return value of `action` will be passed to the validator lambda, + # if one has been set on the Agent. + # 3. If the validator succeeds or if no validator was given, the return value + # of the given `action` will become the new `#value` of the Agent. See + # `#initialize` for details. + # 4. If any observers were added to the Agent, they will be notified. See + # `#add_observer` for details. + # 5. If during the `action` execution any other dispatches are made (directly + # or indirectly), they will be held until after the `#value` of the Agent + # has been changed. + # + # If any exceptions are thrown by an action function, no nested dispatches + # will occur, and the exception will be cached in the Agent itself. When an + # Agent has errors cached, any subsequent interactions will immediately throw + # an exception, until the agent's errors are cleared. Agent errors can be + # examined with `#error` and the agent restarted with `#restart`. + # + # The actions of all Agents get interleaved amongst threads in a thread pool. + # At any point in time, at most one action for each Agent is being executed. + # Actions dispatched to an agent from another single agent or thread will + # occur in the order they were sent, potentially interleaved with actions + # dispatched to the same agent from other sources. The `#send` method should + # be used for actions that are CPU limited, while the `#send_off` method is + # appropriate for actions that may block on IO. + # + # Unlike in Clojure, `Agent` cannot participate in `Concurrent::TVar` transactions. + # + # ## Example + # + # ``` + # def next_fibonacci(set = nil) + # return [0, 1] if set.nil? + # set + [set[-2..-1].reduce{|sum,x| sum + x }] + # end + # + # # create an agent with an initial value + # agent = Concurrent::Agent.new(next_fibonacci) + # + # # send a few update requests + # 5.times do + # agent.send{|set| next_fibonacci(set) } + # end + # + # # wait for them to complete + # agent.await + # + # # get the current value + # agent.value #=> [0, 1, 1, 2, 3, 5, 8] + # ``` + # + # ## Observation + # + # Agents support observers through the {Concurrent::Observable} mixin module. + # Notification of observers occurs every time an action dispatch returns and + # the new value is successfully validated. Observation will *not* occur if the + # action raises an exception, if validation fails, or when a {#restart} occurs. + # + # When notified the observer will receive three arguments: `time`, `old_value`, + # and `new_value`. The `time` argument is the time at which the value change + # occurred. The `old_value` is the value of the Agent when the action began + # processing. The `new_value` is the value to which the Agent was set when the + # action completed. Note that `old_value` and `new_value` may be the same. + # This is not an error. It simply means that the action returned the same + # value. + # + # ## Nested Actions + # + # It is possible for an Agent action to post further actions back to itself. + # The nested actions will be enqueued normally then processed *after* the + # outer action completes, in the order they were sent, possibly interleaved + # with action dispatches from other threads. Nested actions never deadlock + # with one another and a failure in a nested action will never affect the + # outer action. + # + # Nested actions can be called using the Agent reference from the enclosing + # scope or by passing the reference in as a "send" argument. Nested actions + # cannot be post using `self` from within the action block/proc/lambda; `self` + # in this context will not reference the Agent. The preferred method for + # dispatching nested actions is to pass the Agent as an argument. This allows + # Ruby to more effectively manage the closing scope. + # + # Prefer this: + # + # ``` + # agent = Concurrent::Agent.new(0) + # agent.send(agent) do |value, this| + # this.send {|v| v + 42 } + # 3.14 + # end + # agent.value #=> 45.14 + # ``` + # + # Over this: + # + # ``` + # agent = Concurrent::Agent.new(0) + # agent.send do |value| + # agent.send {|v| v + 42 } + # 3.14 + # end + # ``` + # + # @!macro agent_await_warning + # + # **NOTE** Never, *under any circumstances*, call any of the "await" methods + # ({#await}, {#await_for}, {#await_for!}, and {#wait}) from within an action + # block/proc/lambda. The call will block the Agent and will always fail. + # Calling either {#await} or {#wait} (with a timeout of `nil`) will + # hopelessly deadlock the Agent with no possibility of recovery. + # + # @!macro thread_safe_variable_comparison + # + # @see http://clojure.org/Agents Clojure Agents + # @see http://clojure.org/state Values and Change - Clojure's approach to Identity and State + class Agent < Synchronization::LockableObject + include Concern::Observable + + ERROR_MODES = [:continue, :fail].freeze + private_constant :ERROR_MODES + + AWAIT_FLAG = ::Object.new + private_constant :AWAIT_FLAG + + AWAIT_ACTION = ->(value, latch) { latch.count_down; AWAIT_FLAG } + private_constant :AWAIT_ACTION + + DEFAULT_ERROR_HANDLER = ->(agent, error) { nil } + private_constant :DEFAULT_ERROR_HANDLER + + DEFAULT_VALIDATOR = ->(value) { true } + private_constant :DEFAULT_VALIDATOR + + Job = Struct.new(:action, :args, :executor, :caller) + private_constant :Job + + # Raised during action processing or any other time in an Agent's lifecycle. + class Error < StandardError + def initialize(message = nil) + message ||= 'agent must be restarted before jobs can post' + super(message) + end + end + + # Raised when a new value obtained during action processing or at `#restart` + # fails validation. + class ValidationError < Error + def initialize(message = nil) + message ||= 'invalid value' + super(message) + end + end + + # The error mode this Agent is operating in. See {#initialize} for details. + attr_reader :error_mode + + # Create a new `Agent` with the given initial value and options. + # + # The `:validator` option must be `nil` or a side-effect free proc/lambda + # which takes one argument. On any intended value change the validator, if + # provided, will be called. If the new value is invalid the validator should + # return `false` or raise an error. + # + # The `:error_handler` option must be `nil` or a proc/lambda which takes two + # arguments. When an action raises an error or validation fails, either by + # returning false or raising an error, the error handler will be called. The + # arguments to the error handler will be a reference to the agent itself and + # the error object which was raised. + # + # The `:error_mode` may be either `:continue` (the default if an error + # handler is given) or `:fail` (the default if error handler nil or not + # given). + # + # If an action being run by the agent throws an error or doesn't pass + # validation the error handler, if present, will be called. After the + # handler executes if the error mode is `:continue` the Agent will continue + # as if neither the action that caused the error nor the error itself ever + # happened. + # + # If the mode is `:fail` the Agent will become {#failed?} and will stop + # accepting new action dispatches. Any previously queued actions will be + # held until {#restart} is called. The {#value} method will still work, + # returning the value of the Agent before the error. + # + # @param [Object] initial the initial value + # @param [Hash] opts the configuration options + # + # @option opts [Symbol] :error_mode either `:continue` or `:fail` + # @option opts [nil, Proc] :error_handler the (optional) error handler + # @option opts [nil, Proc] :validator the (optional) validation procedure + def initialize(initial, opts = {}) + super() + synchronize { ns_initialize(initial, opts) } + end + + # The current value (state) of the Agent, irrespective of any pending or + # in-progress actions. The value is always available and is non-blocking. + # + # @return [Object] the current value + def value + @current.value # TODO (pitr 12-Sep-2015): broken unsafe read? + end + + alias_method :deref, :value + + # When {#failed?} and {#error_mode} is `:fail`, returns the error object + # which caused the failure, else `nil`. When {#error_mode} is `:continue` + # will *always* return `nil`. + # + # @return [nil, Error] the error which caused the failure when {#failed?} + def error + @error.value + end + + alias_method :reason, :error + + # @!macro agent_send + # + # Dispatches an action to the Agent and returns immediately. Subsequently, + # in a thread from a thread pool, the {#value} will be set to the return + # value of the action. Action dispatches are only allowed when the Agent + # is not {#failed?}. + # + # The action must be a block/proc/lambda which takes 1 or more arguments. + # The first argument is the current {#value} of the Agent. Any arguments + # passed to the send method via the `args` parameter will be passed to the + # action as the remaining arguments. The action must return the new value + # of the Agent. + # + # * {#send} and {#send!} should be used for actions that are CPU limited + # * {#send_off}, {#send_off!}, and {#<<} are appropriate for actions that + # may block on IO + # * {#send_via} and {#send_via!} are used when a specific executor is to + # be used for the action + # + # @param [Array<Object>] args zero or more arguments to be passed to + # the action + # @param [Proc] action the action dispatch to be enqueued + # + # @yield [agent, value, *args] process the old value and return the new + # @yieldparam [Object] value the current {#value} of the Agent + # @yieldparam [Array<Object>] args zero or more arguments to pass to the + # action + # @yieldreturn [Object] the new value of the Agent + # + # @!macro send_return + # @return [Boolean] true if the action is successfully enqueued, false if + # the Agent is {#failed?} + def send(*args, &action) + enqueue_action_job(action, args, Concurrent.global_fast_executor) + end + + # @!macro agent_send + # + # @!macro send_bang_return_and_raise + # @return [Boolean] true if the action is successfully enqueued + # @raise [Concurrent::Agent::Error] if the Agent is {#failed?} + def send!(*args, &action) + raise Error.new unless send(*args, &action) + true + end + + # @!macro agent_send + # @!macro send_return + def send_off(*args, &action) + enqueue_action_job(action, args, Concurrent.global_io_executor) + end + + alias_method :post, :send_off + + # @!macro agent_send + # @!macro send_bang_return_and_raise + def send_off!(*args, &action) + raise Error.new unless send_off(*args, &action) + true + end + + # @!macro agent_send + # @!macro send_return + # @param [Concurrent::ExecutorService] executor the executor on which the + # action is to be dispatched + def send_via(executor, *args, &action) + enqueue_action_job(action, args, executor) + end + + # @!macro agent_send + # @!macro send_bang_return_and_raise + # @param [Concurrent::ExecutorService] executor the executor on which the + # action is to be dispatched + def send_via!(executor, *args, &action) + raise Error.new unless send_via(executor, *args, &action) + true + end + + # Dispatches an action to the Agent and returns immediately. Subsequently, + # in a thread from a thread pool, the {#value} will be set to the return + # value of the action. Appropriate for actions that may block on IO. + # + # @param [Proc] action the action dispatch to be enqueued + # @return [Concurrent::Agent] self + # @see #send_off + def <<(action) + send_off(&action) + self + end + + # Blocks the current thread (indefinitely!) until all actions dispatched + # thus far, from this thread or nested by the Agent, have occurred. Will + # block when {#failed?}. Will never return if a failed Agent is {#restart} + # with `:clear_actions` true. + # + # Returns a reference to `self` to support method chaining: + # + # ``` + # current_value = agent.await.value + # ``` + # + # @return [Boolean] self + # + # @!macro agent_await_warning + def await + wait(nil) + self + end + + # Blocks the current thread until all actions dispatched thus far, from this + # thread or nested by the Agent, have occurred, or the timeout (in seconds) + # has elapsed. + # + # @param [Float] timeout the maximum number of seconds to wait + # @return [Boolean] true if all actions complete before timeout else false + # + # @!macro agent_await_warning + def await_for(timeout) + wait(timeout.to_f) + end + + # Blocks the current thread until all actions dispatched thus far, from this + # thread or nested by the Agent, have occurred, or the timeout (in seconds) + # has elapsed. + # + # @param [Float] timeout the maximum number of seconds to wait + # @return [Boolean] true if all actions complete before timeout + # + # @raise [Concurrent::TimeoutError] when timout is reached + # + # @!macro agent_await_warning + def await_for!(timeout) + raise Concurrent::TimeoutError unless wait(timeout.to_f) + true + end + + # Blocks the current thread until all actions dispatched thus far, from this + # thread or nested by the Agent, have occurred, or the timeout (in seconds) + # has elapsed. Will block indefinitely when timeout is nil or not given. + # + # Provided mainly for consistency with other classes in this library. Prefer + # the various `await` methods instead. + # + # @param [Float] timeout the maximum number of seconds to wait + # @return [Boolean] true if all actions complete before timeout else false + # + # @!macro agent_await_warning + def wait(timeout = nil) + latch = Concurrent::CountDownLatch.new(1) + enqueue_await_job(latch) + latch.wait(timeout) + end + + # Is the Agent in a failed state? + # + # @see #restart + def failed? + !@error.value.nil? + end + + alias_method :stopped?, :failed? + + # When an Agent is {#failed?}, changes the Agent {#value} to `new_value` + # then un-fails the Agent so that action dispatches are allowed again. If + # the `:clear_actions` option is give and true, any actions queued on the + # Agent that were being held while it was failed will be discarded, + # otherwise those held actions will proceed. The `new_value` must pass the + # validator if any, or `restart` will raise an exception and the Agent will + # remain failed with its old {#value} and {#error}. Observers, if any, will + # not be notified of the new state. + # + # @param [Object] new_value the new value for the Agent once restarted + # @param [Hash] opts the configuration options + # @option opts [Symbol] :clear_actions true if all enqueued but unprocessed + # actions should be discarded on restart, else false (default: false) + # @return [Boolean] true + # + # @raise [Concurrent:AgentError] when not failed + def restart(new_value, opts = {}) + clear_actions = opts.fetch(:clear_actions, false) + synchronize do + raise Error.new('agent is not failed') unless failed? + raise ValidationError unless ns_validate(new_value) + @current.value = new_value + @error.value = nil + @queue.clear if clear_actions + ns_post_next_job unless @queue.empty? + end + true + end + + class << self + + # Blocks the current thread (indefinitely!) until all actions dispatched + # thus far to all the given Agents, from this thread or nested by the + # given Agents, have occurred. Will block when any of the agents are + # failed. Will never return if a failed Agent is restart with + # `:clear_actions` true. + # + # @param [Array<Concurrent::Agent>] agents the Agents on which to wait + # @return [Boolean] true + # + # @!macro agent_await_warning + def await(*agents) + agents.each { |agent| agent.await } + true + end + + # Blocks the current thread until all actions dispatched thus far to all + # the given Agents, from this thread or nested by the given Agents, have + # occurred, or the timeout (in seconds) has elapsed. + # + # @param [Float] timeout the maximum number of seconds to wait + # @param [Array<Concurrent::Agent>] agents the Agents on which to wait + # @return [Boolean] true if all actions complete before timeout else false + # + # @!macro agent_await_warning + def await_for(timeout, *agents) + end_at = Concurrent.monotonic_time + timeout.to_f + ok = agents.length.times do |i| + break false if (delay = end_at - Concurrent.monotonic_time) < 0 + break false unless agents[i].await_for(delay) + end + !!ok + end + + # Blocks the current thread until all actions dispatched thus far to all + # the given Agents, from this thread or nested by the given Agents, have + # occurred, or the timeout (in seconds) has elapsed. + # + # @param [Float] timeout the maximum number of seconds to wait + # @param [Array<Concurrent::Agent>] agents the Agents on which to wait + # @return [Boolean] true if all actions complete before timeout + # + # @raise [Concurrent::TimeoutError] when timout is reached + # @!macro agent_await_warning + def await_for!(timeout, *agents) + raise Concurrent::TimeoutError unless await_for(timeout, *agents) + true + end + end + + private + + def ns_initialize(initial, opts) + @error_mode = opts[:error_mode] + @error_handler = opts[:error_handler] + + if @error_mode && !ERROR_MODES.include?(@error_mode) + raise ArgumentError.new('unrecognized error mode') + elsif @error_mode.nil? + @error_mode = @error_handler ? :continue : :fail + end + + @error_handler ||= DEFAULT_ERROR_HANDLER + @validator = opts.fetch(:validator, DEFAULT_VALIDATOR) + @current = Concurrent::AtomicReference.new(initial) + @error = Concurrent::AtomicReference.new(nil) + @caller = Concurrent::ThreadLocalVar.new(nil) + @queue = [] + + self.observers = Collection::CopyOnNotifyObserverSet.new + end + + def enqueue_action_job(action, args, executor) + raise ArgumentError.new('no action given') unless action + job = Job.new(action, args, executor, @caller.value || Thread.current.object_id) + synchronize { ns_enqueue_job(job) } + end + + def enqueue_await_job(latch) + synchronize do + if (index = ns_find_last_job_for_thread) + job = Job.new(AWAIT_ACTION, [latch], Concurrent.global_immediate_executor, + Thread.current.object_id) + ns_enqueue_job(job, index+1) + else + latch.count_down + true + end + end + end + + def ns_enqueue_job(job, index = nil) + # a non-nil index means this is an await job + return false if index.nil? && failed? + index ||= @queue.length + @queue.insert(index, job) + # if this is the only job, post to executor + ns_post_next_job if @queue.length == 1 + true + end + + def ns_post_next_job + @queue.first.executor.post { execute_next_job } + end + + def execute_next_job + job = synchronize { @queue.first } + old_value = @current.value + + @caller.value = job.caller # for nested actions + new_value = job.action.call(old_value, *job.args) + @caller.value = nil + + return if new_value == AWAIT_FLAG + + if ns_validate(new_value) + @current.value = new_value + observers.notify_observers(Time.now, old_value, new_value) + else + handle_error(ValidationError.new) + end + rescue => error + handle_error(error) + ensure + synchronize do + @queue.shift + unless failed? || @queue.empty? + ns_post_next_job + end + end + end + + def ns_validate(value) + @validator.call(value) + rescue + false + end + + def handle_error(error) + # stop new jobs from posting + @error.value = error if @error_mode == :fail + @error_handler.call(self, error) + rescue + # do nothing + end + + def ns_find_last_job_for_thread + @queue.rindex { |job| job.caller == Thread.current.object_id } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/array.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/array.rb new file mode 100644 index 000000000000..60e5b5689dbf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/array.rb @@ -0,0 +1,66 @@ +require 'concurrent/utility/engine' +require 'concurrent/thread_safe/util' + +module Concurrent + + # @!macro concurrent_array + # + # A thread-safe subclass of Array. This version locks against the object + # itself for every method call, ensuring only one thread can be reading + # or writing at a time. This includes iteration methods like `#each`. + # + # @note `a += b` is **not** a **thread-safe** operation on + # `Concurrent::Array`. It reads array `a`, then it creates new `Concurrent::Array` + # which is concatenation of `a` and `b`, then it writes the concatenation to `a`. + # The read and write are independent operations they do not form a single atomic + # operation therefore when two `+=` operations are executed concurrently updates + # may be lost. Use `#concat` instead. + # + # @see http://ruby-doc.org/core/Array.html Ruby standard library `Array` + + # @!macro internal_implementation_note + ArrayImplementation = case + when Concurrent.on_cruby? + # Array is thread-safe in practice because CRuby runs + # threads one at a time and does not do context + # switching during the execution of C functions. + ::Array + + when Concurrent.on_jruby? + require 'jruby/synchronized' + + class JRubyArray < ::Array + include JRuby::Synchronized + end + JRubyArray + + when Concurrent.on_rbx? + require 'monitor' + require 'concurrent/thread_safe/util/data_structures' + + class RbxArray < ::Array + end + + ThreadSafe::Util.make_synchronized_on_rbx RbxArray + RbxArray + + when Concurrent.on_truffleruby? + require 'concurrent/thread_safe/util/data_structures' + + class TruffleRubyArray < ::Array + end + + ThreadSafe::Util.make_synchronized_on_truffleruby TruffleRubyArray + TruffleRubyArray + + else + warn 'Possibly unsupported Ruby implementation' + ::Array + end + private_constant :ArrayImplementation + + # @!macro concurrent_array + class Array < ArrayImplementation + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/async.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/async.rb new file mode 100644 index 000000000000..5e125e4a0979 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/async.rb @@ -0,0 +1,448 @@ +require 'concurrent/configuration' +require 'concurrent/ivar' +require 'concurrent/synchronization/lockable_object' + +module Concurrent + + # A mixin module that provides simple asynchronous behavior to a class, + # turning it into a simple actor. Loosely based on Erlang's + # [gen_server](http://www.erlang.org/doc/man/gen_server.html), but without + # supervision or linking. + # + # A more feature-rich {Concurrent::Actor} is also available when the + # capabilities of `Async` are too limited. + # + # ```cucumber + # Feature: + # As a stateful, plain old Ruby class + # I want safe, asynchronous behavior + # So my long-running methods don't block the main thread + # ``` + # + # The `Async` module is a way to mix simple yet powerful asynchronous + # capabilities into any plain old Ruby object or class, turning each object + # into a simple Actor. Method calls are processed on a background thread. The + # caller is free to perform other actions while processing occurs in the + # background. + # + # Method calls to the asynchronous object are made via two proxy methods: + # `async` (alias `cast`) and `await` (alias `call`). These proxy methods post + # the method call to the object's background thread and return a "future" + # which will eventually contain the result of the method call. + # + # This behavior is loosely patterned after Erlang's `gen_server` behavior. + # When an Erlang module implements the `gen_server` behavior it becomes + # inherently asynchronous. The `start` or `start_link` function spawns a + # process (similar to a thread but much more lightweight and efficient) and + # returns the ID of the process. Using the process ID, other processes can + # send messages to the `gen_server` via the `cast` and `call` methods. Unlike + # Erlang's `gen_server`, however, `Async` classes do not support linking or + # supervision trees. + # + # ## Basic Usage + # + # When this module is mixed into a class, objects of the class become inherently + # asynchronous. Each object gets its own background thread on which to post + # asynchronous method calls. Asynchronous method calls are executed in the + # background one at a time in the order they are received. + # + # To create an asynchronous class, simply mix in the `Concurrent::Async` module: + # + # ``` + # class Hello + # include Concurrent::Async + # + # def hello(name) + # "Hello, #{name}!" + # end + # end + # ``` + # + # Mixing this module into a class provides each object two proxy methods: + # `async` and `await`. These methods are thread safe with respect to the + # enclosing object. The former proxy allows methods to be called + # asynchronously by posting to the object's internal thread. The latter proxy + # allows a method to be called synchronously but does so safely with respect + # to any pending asynchronous method calls and ensures proper ordering. Both + # methods return a {Concurrent::IVar} which can be inspected for the result + # of the proxied method call. Calling a method with `async` will return a + # `:pending` `IVar` whereas `await` will return a `:complete` `IVar`. + # + # ``` + # class Echo + # include Concurrent::Async + # + # def echo(msg) + # print "#{msg}\n" + # end + # end + # + # horn = Echo.new + # horn.echo('zero') # synchronous, not thread-safe + # # returns the actual return value of the method + # + # horn.async.echo('one') # asynchronous, non-blocking, thread-safe + # # returns an IVar in the :pending state + # + # horn.await.echo('two') # synchronous, blocking, thread-safe + # # returns an IVar in the :complete state + # ``` + # + # ## Let It Fail + # + # The `async` and `await` proxy methods have built-in error protection based + # on Erlang's famous "let it fail" philosophy. Instance methods should not be + # programmed defensively. When an exception is raised by a delegated method + # the proxy will rescue the exception, expose it to the caller as the `reason` + # attribute of the returned future, then process the next method call. + # + # ## Calling Methods Internally + # + # External method calls should *always* use the `async` and `await` proxy + # methods. When one method calls another method, the `async` proxy should + # rarely be used and the `await` proxy should *never* be used. + # + # When an object calls one of its own methods using the `await` proxy the + # second call will be enqueued *behind* the currently running method call. + # Any attempt to wait on the result will fail as the second call will never + # run until after the current call completes. + # + # Calling a method using the `await` proxy from within a method that was + # itself called using `async` or `await` will irreversibly deadlock the + # object. Do *not* do this, ever. + # + # ## Instance Variables and Attribute Accessors + # + # Instance variables do not need to be thread-safe so long as they are private. + # Asynchronous method calls are processed in the order they are received and + # are processed one at a time. Therefore private instance variables can only + # be accessed by one thread at a time. This is inherently thread-safe. + # + # When using private instance variables within asynchronous methods, the best + # practice is to read the instance variable into a local variable at the start + # of the method then update the instance variable at the *end* of the method. + # This way, should an exception be raised during method execution the internal + # state of the object will not have been changed. + # + # ### Reader Attributes + # + # The use of `attr_reader` is discouraged. Internal state exposed externally, + # when necessary, should be done through accessor methods. The instance + # variables exposed by these methods *must* be thread-safe, or they must be + # called using the `async` and `await` proxy methods. These two approaches are + # subtly different. + # + # When internal state is accessed via the `async` and `await` proxy methods, + # the returned value represents the object's state *at the time the call is + # processed*, which may *not* be the state of the object at the time the call + # is made. + # + # To get the state *at the current* time, irrespective of an enqueued method + # calls, a reader method must be called directly. This is inherently unsafe + # unless the instance variable is itself thread-safe, preferably using one + # of the thread-safe classes within this library. Because the thread-safe + # classes within this library are internally-locking or non-locking, they can + # be safely used from within asynchronous methods without causing deadlocks. + # + # Generally speaking, the best practice is to *not* expose internal state via + # reader methods. The best practice is to simply use the method's return value. + # + # ### Writer Attributes + # + # Writer attributes should never be used with asynchronous classes. Changing + # the state externally, even when done in the thread-safe way, is not logically + # consistent. Changes to state need to be timed with respect to all asynchronous + # method calls which my be in-process or enqueued. The only safe practice is to + # pass all necessary data to each method as arguments and let the method update + # the internal state as necessary. + # + # ## Class Constants, Variables, and Methods + # + # ### Class Constants + # + # Class constants do not need to be thread-safe. Since they are read-only and + # immutable they may be safely read both externally and from within + # asynchronous methods. + # + # ### Class Variables + # + # Class variables should be avoided. Class variables represent shared state. + # Shared state is anathema to concurrency. Should there be a need to share + # state using class variables they *must* be thread-safe, preferably + # using the thread-safe classes within this library. When updating class + # variables, never assign a new value/object to the variable itself. Assignment + # is not thread-safe in Ruby. Instead, use the thread-safe update functions + # of the variable itself to change the value. + # + # The best practice is to *never* use class variables with `Async` classes. + # + # ### Class Methods + # + # Class methods which are pure functions are safe. Class methods which modify + # class variables should be avoided, for all the reasons listed above. + # + # ## An Important Note About Thread Safe Guarantees + # + # > Thread safe guarantees can only be made when asynchronous method calls + # > are not mixed with direct method calls. Use only direct method calls + # > when the object is used exclusively on a single thread. Use only + # > `async` and `await` when the object is shared between threads. Once you + # > call a method using `async` or `await`, you should no longer call methods + # > directly on the object. Use `async` and `await` exclusively from then on. + # + # @example + # + # class Echo + # include Concurrent::Async + # + # def echo(msg) + # print "#{msg}\n" + # end + # end + # + # horn = Echo.new + # horn.echo('zero') # synchronous, not thread-safe + # # returns the actual return value of the method + # + # horn.async.echo('one') # asynchronous, non-blocking, thread-safe + # # returns an IVar in the :pending state + # + # horn.await.echo('two') # synchronous, blocking, thread-safe + # # returns an IVar in the :complete state + # + # @see Concurrent::Actor + # @see https://en.wikipedia.org/wiki/Actor_model "Actor Model" at Wikipedia + # @see http://www.erlang.org/doc/man/gen_server.html Erlang gen_server + # @see http://c2.com/cgi/wiki?LetItCrash "Let It Crash" at http://c2.com/ + module Async + + # @!method self.new(*args, &block) + # + # Instanciate a new object and ensure proper initialization of the + # synchronization mechanisms. + # + # @param [Array<Object>] args Zero or more arguments to be passed to the + # object's initializer. + # @param [Proc] block Optional block to pass to the object's initializer. + # @return [Object] A properly initialized object of the asynchronous class. + + # Check for the presence of a method on an object and determine if a given + # set of arguments matches the required arity. + # + # @param [Object] obj the object to check against + # @param [Symbol] method the method to check the object for + # @param [Array] args zero or more arguments for the arity check + # + # @raise [NameError] the object does not respond to `method` method + # @raise [ArgumentError] the given `args` do not match the arity of `method` + # + # @note This check is imperfect because of the way Ruby reports the arity of + # methods with a variable number of arguments. It is possible to determine + # if too few arguments are given but impossible to determine if too many + # arguments are given. This check may also fail to recognize dynamic behavior + # of the object, such as methods simulated with `method_missing`. + # + # @see http://www.ruby-doc.org/core-2.1.1/Method.html#method-i-arity Method#arity + # @see http://ruby-doc.org/core-2.1.0/Object.html#method-i-respond_to-3F Object#respond_to? + # @see http://www.ruby-doc.org/core-2.1.0/BasicObject.html#method-i-method_missing BasicObject#method_missing + # + # @!visibility private + def self.validate_argc(obj, method, *args) + argc = args.length + arity = obj.method(method).arity + + if arity >= 0 && argc != arity + raise ArgumentError.new("wrong number of arguments (#{argc} for #{arity})") + elsif arity < 0 && (arity = (arity + 1).abs) > argc + raise ArgumentError.new("wrong number of arguments (#{argc} for #{arity}..*)") + end + end + + # @!visibility private + def self.included(base) + base.singleton_class.send(:alias_method, :original_new, :new) + base.extend(ClassMethods) + super(base) + end + + # @!visibility private + module ClassMethods + def new(*args, &block) + obj = original_new(*args, &block) + obj.send(:init_synchronization) + obj + end + end + private_constant :ClassMethods + + # Delegates asynchronous, thread-safe method calls to the wrapped object. + # + # @!visibility private + class AsyncDelegator < Synchronization::LockableObject + safe_initialization! + + # Create a new delegator object wrapping the given delegate. + # + # @param [Object] delegate the object to wrap and delegate method calls to + def initialize(delegate) + super() + @delegate = delegate + @queue = [] + @executor = Concurrent.global_io_executor + @ruby_pid = $$ + end + + # Delegates method calls to the wrapped object. + # + # @param [Symbol] method the method being called + # @param [Array] args zero or more arguments to the method + # + # @return [IVar] the result of the method call + # + # @raise [NameError] the object does not respond to `method` method + # @raise [ArgumentError] the given `args` do not match the arity of `method` + def method_missing(method, *args, &block) + super unless @delegate.respond_to?(method) + Async::validate_argc(@delegate, method, *args) + + ivar = Concurrent::IVar.new + synchronize do + reset_if_forked + @queue.push [ivar, method, args, block] + @executor.post { perform } if @queue.length == 1 + end + + ivar + end + + # Check whether the method is responsive + # + # @param [Symbol] method the method being called + def respond_to_missing?(method, include_private = false) + @delegate.respond_to?(method) || super + end + + # Perform all enqueued tasks. + # + # This method must be called from within the executor. It must not be + # called while already running. It will loop until the queue is empty. + def perform + loop do + ivar, method, args, block = synchronize { @queue.first } + break unless ivar # queue is empty + + begin + ivar.set(@delegate.send(method, *args, &block)) + rescue => error + ivar.fail(error) + end + + synchronize do + @queue.shift + return if @queue.empty? + end + end + end + + def reset_if_forked + if $$ != @ruby_pid + @queue.clear + @ruby_pid = $$ + end + end + end + private_constant :AsyncDelegator + + # Delegates synchronous, thread-safe method calls to the wrapped object. + # + # @!visibility private + class AwaitDelegator + + # Create a new delegator object wrapping the given delegate. + # + # @param [AsyncDelegator] delegate the object to wrap and delegate method calls to + def initialize(delegate) + @delegate = delegate + end + + # Delegates method calls to the wrapped object. + # + # @param [Symbol] method the method being called + # @param [Array] args zero or more arguments to the method + # + # @return [IVar] the result of the method call + # + # @raise [NameError] the object does not respond to `method` method + # @raise [ArgumentError] the given `args` do not match the arity of `method` + def method_missing(method, *args, &block) + ivar = @delegate.send(method, *args, &block) + ivar.wait + ivar + end + + # Check whether the method is responsive + # + # @param [Symbol] method the method being called + def respond_to_missing?(method, include_private = false) + @delegate.respond_to?(method) || super + end + end + private_constant :AwaitDelegator + + # Causes the chained method call to be performed asynchronously on the + # object's thread. The delegated method will return a future in the + # `:pending` state and the method call will have been scheduled on the + # object's thread. The final disposition of the method call can be obtained + # by inspecting the returned future. + # + # @!macro async_thread_safety_warning + # @note The method call is guaranteed to be thread safe with respect to + # all other method calls against the same object that are called with + # either `async` or `await`. The mutable nature of Ruby references + # (and object orientation in general) prevent any other thread safety + # guarantees. Do NOT mix direct method calls with delegated method calls. + # Use *only* delegated method calls when sharing the object between threads. + # + # @return [Concurrent::IVar] the pending result of the asynchronous operation + # + # @raise [NameError] the object does not respond to the requested method + # @raise [ArgumentError] the given `args` do not match the arity of + # the requested method + def async + @__async_delegator__ + end + alias_method :cast, :async + + # Causes the chained method call to be performed synchronously on the + # current thread. The delegated will return a future in either the + # `:fulfilled` or `:rejected` state and the delegated method will have + # completed. The final disposition of the delegated method can be obtained + # by inspecting the returned future. + # + # @!macro async_thread_safety_warning + # + # @return [Concurrent::IVar] the completed result of the synchronous operation + # + # @raise [NameError] the object does not respond to the requested method + # @raise [ArgumentError] the given `args` do not match the arity of the + # requested method + def await + @__await_delegator__ + end + alias_method :call, :await + + # Initialize the internal serializer and other stnchronization mechanisms. + # + # @note This method *must* be called immediately upon object construction. + # This is the only way thread-safe initialization can be guaranteed. + # + # @!visibility private + def init_synchronization + return self if defined?(@__async_initialized__) && @__async_initialized__ + @__async_initialized__ = true + @__async_delegator__ = AsyncDelegator.new(self) + @__await_delegator__ = AwaitDelegator.new(@__async_delegator__) + self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atom.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atom.rb new file mode 100644 index 000000000000..8a4573008262 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atom.rb @@ -0,0 +1,222 @@ +require 'concurrent/atomic/atomic_reference' +require 'concurrent/collection/copy_on_notify_observer_set' +require 'concurrent/concern/observable' +require 'concurrent/synchronization' + +# @!macro thread_safe_variable_comparison +# +# ## Thread-safe Variable Classes +# +# Each of the thread-safe variable classes is designed to solve a different +# problem. In general: +# +# * *{Concurrent::Agent}:* Shared, mutable variable providing independent, +# uncoordinated, *asynchronous* change of individual values. Best used when +# the value will undergo frequent, complex updates. Suitable when the result +# of an update does not need to be known immediately. +# * *{Concurrent::Atom}:* Shared, mutable variable providing independent, +# uncoordinated, *synchronous* change of individual values. Best used when +# the value will undergo frequent reads but only occasional, though complex, +# updates. Suitable when the result of an update must be known immediately. +# * *{Concurrent::AtomicReference}:* A simple object reference that can be updated +# atomically. Updates are synchronous but fast. Best used when updates a +# simple set operations. Not suitable when updates are complex. +# {Concurrent::AtomicBoolean} and {Concurrent::AtomicFixnum} are similar +# but optimized for the given data type. +# * *{Concurrent::Exchanger}:* Shared, stateless synchronization point. Used +# when two or more threads need to exchange data. The threads will pair then +# block on each other until the exchange is complete. +# * *{Concurrent::MVar}:* Shared synchronization point. Used when one thread +# must give a value to another, which must take the value. The threads will +# block on each other until the exchange is complete. +# * *{Concurrent::ThreadLocalVar}:* Shared, mutable, isolated variable which +# holds a different value for each thread which has access. Often used as +# an instance variable in objects which must maintain different state +# for different threads. +# * *{Concurrent::TVar}:* Shared, mutable variables which provide +# *coordinated*, *synchronous*, change of *many* stated. Used when multiple +# value must change together, in an all-or-nothing transaction. + + +module Concurrent + + # Atoms provide a way to manage shared, synchronous, independent state. + # + # An atom is initialized with an initial value and an optional validation + # proc. At any time the value of the atom can be synchronously and safely + # changed. If a validator is given at construction then any new value + # will be checked against the validator and will be rejected if the + # validator returns false or raises an exception. + # + # There are two ways to change the value of an atom: {#compare_and_set} and + # {#swap}. The former will set the new value if and only if it validates and + # the current value matches the new value. The latter will atomically set the + # new value to the result of running the given block if and only if that + # value validates. + # + # ## Example + # + # ``` + # def next_fibonacci(set = nil) + # return [0, 1] if set.nil? + # set + [set[-2..-1].reduce{|sum,x| sum + x }] + # end + # + # # create an atom with an initial value + # atom = Concurrent::Atom.new(next_fibonacci) + # + # # send a few update requests + # 5.times do + # atom.swap{|set| next_fibonacci(set) } + # end + # + # # get the current value + # atom.value #=> [0, 1, 1, 2, 3, 5, 8] + # ``` + # + # ## Observation + # + # Atoms support observers through the {Concurrent::Observable} mixin module. + # Notification of observers occurs every time the value of the Atom changes. + # When notified the observer will receive three arguments: `time`, `old_value`, + # and `new_value`. The `time` argument is the time at which the value change + # occurred. The `old_value` is the value of the Atom when the change began + # The `new_value` is the value to which the Atom was set when the change + # completed. Note that `old_value` and `new_value` may be the same. This is + # not an error. It simply means that the change operation returned the same + # value. + # + # Unlike in Clojure, `Atom` cannot participate in {Concurrent::TVar} transactions. + # + # @!macro thread_safe_variable_comparison + # + # @see http://clojure.org/atoms Clojure Atoms + # @see http://clojure.org/state Values and Change - Clojure's approach to Identity and State + class Atom < Synchronization::Object + include Concern::Observable + + safe_initialization! + attr_atomic(:value) + private :value=, :swap_value, :compare_and_set_value, :update_value + public :value + alias_method :deref, :value + + # @!method value + # The current value of the atom. + # + # @return [Object] The current value. + + # Create a new atom with the given initial value. + # + # @param [Object] value The initial value + # @param [Hash] opts The options used to configure the atom + # @option opts [Proc] :validator (nil) Optional proc used to validate new + # values. It must accept one and only one argument which will be the + # intended new value. The validator will return true if the new value + # is acceptable else return false (preferrably) or raise an exception. + # + # @!macro deref_options + # + # @raise [ArgumentError] if the validator is not a `Proc` (when given) + def initialize(value, opts = {}) + super() + @Validator = opts.fetch(:validator, -> v { true }) + self.observers = Collection::CopyOnNotifyObserverSet.new + self.value = value + end + + # Atomically swaps the value of atom using the given block. The current + # value will be passed to the block, as will any arguments passed as + # arguments to the function. The new value will be validated against the + # (optional) validator proc given at construction. If validation fails the + # value will not be changed. + # + # Internally, {#swap} reads the current value, applies the block to it, and + # attempts to compare-and-set it in. Since another thread may have changed + # the value in the intervening time, it may have to retry, and does so in a + # spin loop. The net effect is that the value will always be the result of + # the application of the supplied block to a current value, atomically. + # However, because the block might be called multiple times, it must be free + # of side effects. + # + # @note The given block may be called multiple times, and thus should be free + # of side effects. + # + # @param [Object] args Zero or more arguments passed to the block. + # + # @yield [value, args] Calculates a new value for the atom based on the + # current value and any supplied arguments. + # @yieldparam value [Object] The current value of the atom. + # @yieldparam args [Object] All arguments passed to the function, in order. + # @yieldreturn [Object] The intended new value of the atom. + # + # @return [Object] The final value of the atom after all operations and + # validations are complete. + # + # @raise [ArgumentError] When no block is given. + def swap(*args) + raise ArgumentError.new('no block given') unless block_given? + + loop do + old_value = value + new_value = yield(old_value, *args) + begin + break old_value unless valid?(new_value) + break new_value if compare_and_set(old_value, new_value) + rescue + break old_value + end + end + end + + # Atomically sets the value of atom to the new value if and only if the + # current value of the atom is identical to the old value and the new + # value successfully validates against the (optional) validator given + # at construction. + # + # @param [Object] old_value The expected current value. + # @param [Object] new_value The intended new value. + # + # @return [Boolean] True if the value is changed else false. + def compare_and_set(old_value, new_value) + if valid?(new_value) && compare_and_set_value(old_value, new_value) + observers.notify_observers(Time.now, old_value, new_value) + true + else + false + end + end + + # Atomically sets the value of atom to the new value without regard for the + # current value so long as the new value successfully validates against the + # (optional) validator given at construction. + # + # @param [Object] new_value The intended new value. + # + # @return [Object] The final value of the atom after all operations and + # validations are complete. + def reset(new_value) + old_value = value + if valid?(new_value) + self.value = new_value + observers.notify_observers(Time.now, old_value, new_value) + new_value + else + old_value + end + end + + private + + # Is the new value valid? + # + # @param [Object] new_value The intended new value. + # @return [Boolean] false if the validator function returns false or raises + # an exception else true + def valid?(new_value) + @Validator.call(new_value) + rescue + false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/abstract_thread_local_var.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/abstract_thread_local_var.rb new file mode 100644 index 000000000000..fcdeed7f8506 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/abstract_thread_local_var.rb @@ -0,0 +1,66 @@ +require 'concurrent/constants' + +module Concurrent + + # @!macro thread_local_var + # @!macro internal_implementation_note + # @!visibility private + class AbstractThreadLocalVar + + # @!macro thread_local_var_method_initialize + def initialize(default = nil, &default_block) + if default && block_given? + raise ArgumentError, "Cannot use both value and block as default value" + end + + if block_given? + @default_block = default_block + @default = nil + else + @default_block = nil + @default = default + end + + allocate_storage + end + + # @!macro thread_local_var_method_get + def value + raise NotImplementedError + end + + # @!macro thread_local_var_method_set + def value=(value) + raise NotImplementedError + end + + # @!macro thread_local_var_method_bind + def bind(value, &block) + if block_given? + old_value = self.value + begin + self.value = value + yield + ensure + self.value = old_value + end + end + end + + protected + + # @!visibility private + def allocate_storage + raise NotImplementedError + end + + # @!visibility private + def default + if @default_block + self.value = @default_block.call + else + @default + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb new file mode 100644 index 000000000000..0b0373dc29ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb @@ -0,0 +1,126 @@ +require 'concurrent/atomic/mutex_atomic_boolean' +require 'concurrent/synchronization' + +module Concurrent + + ################################################################### + + # @!macro atomic_boolean_method_initialize + # + # Creates a new `AtomicBoolean` with the given initial value. + # + # @param [Boolean] initial the initial value + + # @!macro atomic_boolean_method_value_get + # + # Retrieves the current `Boolean` value. + # + # @return [Boolean] the current value + + # @!macro atomic_boolean_method_value_set + # + # Explicitly sets the value. + # + # @param [Boolean] value the new value to be set + # + # @return [Boolean] the current value + + # @!macro atomic_boolean_method_true_question + # + # Is the current value `true` + # + # @return [Boolean] true if the current value is `true`, else false + + # @!macro atomic_boolean_method_false_question + # + # Is the current value `false` + # + # @return [Boolean] true if the current value is `false`, else false + + # @!macro atomic_boolean_method_make_true + # + # Explicitly sets the value to true. + # + # @return [Boolean] true if value has changed, otherwise false + + # @!macro atomic_boolean_method_make_false + # + # Explicitly sets the value to false. + # + # @return [Boolean] true if value has changed, otherwise false + + ################################################################### + + # @!macro atomic_boolean_public_api + # + # @!method initialize(initial = false) + # @!macro atomic_boolean_method_initialize + # + # @!method value + # @!macro atomic_boolean_method_value_get + # + # @!method value=(value) + # @!macro atomic_boolean_method_value_set + # + # @!method true? + # @!macro atomic_boolean_method_true_question + # + # @!method false? + # @!macro atomic_boolean_method_false_question + # + # @!method make_true + # @!macro atomic_boolean_method_make_true + # + # @!method make_false + # @!macro atomic_boolean_method_make_false + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + AtomicBooleanImplementation = case + when defined?(JavaAtomicBoolean) + JavaAtomicBoolean + when defined?(CAtomicBoolean) + CAtomicBoolean + else + MutexAtomicBoolean + end + private_constant :AtomicBooleanImplementation + + # @!macro atomic_boolean + # + # A boolean value that can be updated atomically. Reads and writes to an atomic + # boolean and thread-safe and guaranteed to succeed. Reads and writes may block + # briefly but no explicit locking is required. + # + # @!macro thread_safe_variable_comparison + # + # Performance: + # + # ``` + # Testing with ruby 2.1.2 + # Testing with Concurrent::MutexAtomicBoolean... + # 2.790000 0.000000 2.790000 ( 2.791454) + # Testing with Concurrent::CAtomicBoolean... + # 0.740000 0.000000 0.740000 ( 0.740206) + # + # Testing with jruby 1.9.3 + # Testing with Concurrent::MutexAtomicBoolean... + # 5.240000 2.520000 7.760000 ( 3.683000) + # Testing with Concurrent::JavaAtomicBoolean... + # 3.340000 0.010000 3.350000 ( 0.855000) + # ``` + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html java.util.concurrent.atomic.AtomicBoolean + # + # @!macro atomic_boolean_public_api + class AtomicBoolean < AtomicBooleanImplementation + # @return [String] Short string representation. + def to_s + format '%s value:%s>', super[0..-2], value + end + + alias_method :inspect, :to_s + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb new file mode 100644 index 000000000000..c67166d83354 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb @@ -0,0 +1,143 @@ +require 'concurrent/atomic/mutex_atomic_fixnum' +require 'concurrent/synchronization' + +module Concurrent + + ################################################################### + + # @!macro atomic_fixnum_method_initialize + # + # Creates a new `AtomicFixnum` with the given initial value. + # + # @param [Fixnum] initial the initial value + # @raise [ArgumentError] if the initial value is not a `Fixnum` + + # @!macro atomic_fixnum_method_value_get + # + # Retrieves the current `Fixnum` value. + # + # @return [Fixnum] the current value + + # @!macro atomic_fixnum_method_value_set + # + # Explicitly sets the value. + # + # @param [Fixnum] value the new value to be set + # + # @return [Fixnum] the current value + # + # @raise [ArgumentError] if the new value is not a `Fixnum` + + # @!macro atomic_fixnum_method_increment + # + # Increases the current value by the given amount (defaults to 1). + # + # @param [Fixnum] delta the amount by which to increase the current value + # + # @return [Fixnum] the current value after incrementation + + # @!macro atomic_fixnum_method_decrement + # + # Decreases the current value by the given amount (defaults to 1). + # + # @param [Fixnum] delta the amount by which to decrease the current value + # + # @return [Fixnum] the current value after decrementation + + # @!macro atomic_fixnum_method_compare_and_set + # + # Atomically sets the value to the given updated value if the current + # value == the expected value. + # + # @param [Fixnum] expect the expected value + # @param [Fixnum] update the new value + # + # @return [Boolean] true if the value was updated else false + + # @!macro atomic_fixnum_method_update + # + # Pass the current value to the given block, replacing it + # with the block's result. May retry if the value changes + # during the block's execution. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # + # @return [Object] the new value + + ################################################################### + + # @!macro atomic_fixnum_public_api + # + # @!method initialize(initial = 0) + # @!macro atomic_fixnum_method_initialize + # + # @!method value + # @!macro atomic_fixnum_method_value_get + # + # @!method value=(value) + # @!macro atomic_fixnum_method_value_set + # + # @!method increment(delta = 1) + # @!macro atomic_fixnum_method_increment + # + # @!method decrement(delta = 1) + # @!macro atomic_fixnum_method_decrement + # + # @!method compare_and_set(expect, update) + # @!macro atomic_fixnum_method_compare_and_set + # + # @!method update + # @!macro atomic_fixnum_method_update + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + AtomicFixnumImplementation = case + when defined?(JavaAtomicFixnum) + JavaAtomicFixnum + when defined?(CAtomicFixnum) + CAtomicFixnum + else + MutexAtomicFixnum + end + private_constant :AtomicFixnumImplementation + + # @!macro atomic_fixnum + # + # A numeric value that can be updated atomically. Reads and writes to an atomic + # fixnum and thread-safe and guaranteed to succeed. Reads and writes may block + # briefly but no explicit locking is required. + # + # @!macro thread_safe_variable_comparison + # + # Performance: + # + # ``` + # Testing with ruby 2.1.2 + # Testing with Concurrent::MutexAtomicFixnum... + # 3.130000 0.000000 3.130000 ( 3.136505) + # Testing with Concurrent::CAtomicFixnum... + # 0.790000 0.000000 0.790000 ( 0.785550) + # + # Testing with jruby 1.9.3 + # Testing with Concurrent::MutexAtomicFixnum... + # 5.460000 2.460000 7.920000 ( 3.715000) + # Testing with Concurrent::JavaAtomicFixnum... + # 4.520000 0.030000 4.550000 ( 1.187000) + # ``` + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicLong.html java.util.concurrent.atomic.AtomicLong + # + # @!macro atomic_fixnum_public_api + class AtomicFixnum < AtomicFixnumImplementation + # @return [String] Short string representation. + def to_s + format '%s value:%s>', super[0..-2], value + end + + alias_method :inspect, :to_s + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb new file mode 100644 index 000000000000..f20cd46a5259 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb @@ -0,0 +1,164 @@ +module Concurrent + # An atomic reference which maintains an object reference along with a mark bit + # that can be updated atomically. + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicMarkableReference.html + # java.util.concurrent.atomic.AtomicMarkableReference + class AtomicMarkableReference < ::Concurrent::Synchronization::Object + + attr_atomic(:reference) + private :reference, :reference=, :swap_reference, :compare_and_set_reference, :update_reference + + def initialize(value = nil, mark = false) + super() + self.reference = immutable_array(value, mark) + end + + # Atomically sets the value and mark to the given updated value and + # mark given both: + # - the current value == the expected value && + # - the current mark == the expected mark + # + # @param [Object] expected_val the expected value + # @param [Object] new_val the new value + # @param [Boolean] expected_mark the expected mark + # @param [Boolean] new_mark the new mark + # + # @return [Boolean] `true` if successful. A `false` return indicates + # that the actual value was not equal to the expected value or the + # actual mark was not equal to the expected mark + def compare_and_set(expected_val, new_val, expected_mark, new_mark) + # Memoize a valid reference to the current AtomicReference for + # later comparison. + current = reference + curr_val, curr_mark = current + + # Ensure that that the expected marks match. + return false unless expected_mark == curr_mark + + if expected_val.is_a? Numeric + # If the object is a numeric, we need to ensure we are comparing + # the numerical values + return false unless expected_val == curr_val + else + # Otherwise, we need to ensure we are comparing the object identity. + # Theoretically, this could be incorrect if a user monkey-patched + # `Object#equal?`, but they should know that they are playing with + # fire at that point. + return false unless expected_val.equal? curr_val + end + + prospect = immutable_array(new_val, new_mark) + + compare_and_set_reference current, prospect + end + + alias_method :compare_and_swap, :compare_and_set + + # Gets the current reference and marked values. + # + # @return [Array] the current reference and marked values + def get + reference + end + + # Gets the current value of the reference + # + # @return [Object] the current value of the reference + def value + reference[0] + end + + # Gets the current marked value + # + # @return [Boolean] the current marked value + def mark + reference[1] + end + + alias_method :marked?, :mark + + # _Unconditionally_ sets to the given value of both the reference and + # the mark. + # + # @param [Object] new_val the new value + # @param [Boolean] new_mark the new mark + # + # @return [Array] both the new value and the new mark + def set(new_val, new_mark) + self.reference = immutable_array(new_val, new_mark) + end + + # Pass the current value and marked state to the given block, replacing it + # with the block's results. May retry if the value changes during the + # block's execution. + # + # @yield [Object] Calculate a new value and marked state for the atomic + # reference using given (old) value and (old) marked + # @yieldparam [Object] old_val the starting value of the atomic reference + # @yieldparam [Boolean] old_mark the starting state of marked + # + # @return [Array] the new value and new mark + def update + loop do + old_val, old_mark = reference + new_val, new_mark = yield old_val, old_mark + + if compare_and_set old_val, new_val, old_mark, new_mark + return immutable_array(new_val, new_mark) + end + end + end + + # Pass the current value to the given block, replacing it + # with the block's result. Raise an exception if the update + # fails. + # + # @yield [Object] Calculate a new value and marked state for the atomic + # reference using given (old) value and (old) marked + # @yieldparam [Object] old_val the starting value of the atomic reference + # @yieldparam [Boolean] old_mark the starting state of marked + # + # @return [Array] the new value and marked state + # + # @raise [Concurrent::ConcurrentUpdateError] if the update fails + def try_update! + old_val, old_mark = reference + new_val, new_mark = yield old_val, old_mark + + unless compare_and_set old_val, new_val, old_mark, new_mark + fail ::Concurrent::ConcurrentUpdateError, + 'AtomicMarkableReference: Update failed due to race condition.', + 'Note: If you would like to guarantee an update, please use ' + + 'the `AtomicMarkableReference#update` method.' + end + + immutable_array(new_val, new_mark) + end + + # Pass the current value to the given block, replacing it with the + # block's result. Simply return nil if update fails. + # + # @yield [Object] Calculate a new value and marked state for the atomic + # reference using given (old) value and (old) marked + # @yieldparam [Object] old_val the starting value of the atomic reference + # @yieldparam [Boolean] old_mark the starting state of marked + # + # @return [Array] the new value and marked state, or nil if + # the update failed + def try_update + old_val, old_mark = reference + new_val, new_mark = yield old_val, old_mark + + return unless compare_and_set old_val, new_val, old_mark, new_mark + + immutable_array(new_val, new_mark) + end + + private + + def immutable_array(*args) + args.freeze + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb new file mode 100644 index 000000000000..620c0698e7aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb @@ -0,0 +1,204 @@ +require 'concurrent/synchronization' +require 'concurrent/utility/engine' +require 'concurrent/atomic_reference/numeric_cas_wrapper' + +# Shim for TruffleRuby::AtomicReference +if Concurrent.on_truffleruby? && !defined?(TruffleRuby::AtomicReference) + # @!visibility private + module TruffleRuby + AtomicReference = Truffle::AtomicReference + end +end + +module Concurrent + + # Define update methods that use direct paths + # + # @!visibility private + # @!macro internal_implementation_note + module AtomicDirectUpdate + + # @!macro atomic_reference_method_update + # + # Pass the current value to the given block, replacing it + # with the block's result. May retry if the value changes + # during the block's execution. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # @return [Object] the new value + def update + true until compare_and_set(old_value = get, new_value = yield(old_value)) + new_value + end + + # @!macro atomic_reference_method_try_update + # + # Pass the current value to the given block, replacing it + # with the block's result. Return nil if the update fails. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # @note This method was altered to avoid raising an exception by default. + # Instead, this method now returns `nil` in case of failure. For more info, + # please see: https://github.com/ruby-concurrency/concurrent-ruby/pull/336 + # @return [Object] the new value, or nil if update failed + def try_update + old_value = get + new_value = yield old_value + + return unless compare_and_set old_value, new_value + + new_value + end + + # @!macro atomic_reference_method_try_update! + # + # Pass the current value to the given block, replacing it + # with the block's result. Raise an exception if the update + # fails. + # + # @yield [Object] Calculate a new value for the atomic reference using + # given (old) value + # @yieldparam [Object] old_value the starting value of the atomic reference + # @note This behavior mimics the behavior of the original + # `AtomicReference#try_update` API. The reason this was changed was to + # avoid raising exceptions (which are inherently slow) by default. For more + # info: https://github.com/ruby-concurrency/concurrent-ruby/pull/336 + # @return [Object] the new value + # @raise [Concurrent::ConcurrentUpdateError] if the update fails + def try_update! + old_value = get + new_value = yield old_value + unless compare_and_set(old_value, new_value) + if $VERBOSE + raise ConcurrentUpdateError, "Update failed" + else + raise ConcurrentUpdateError, "Update failed", ConcurrentUpdateError::CONC_UP_ERR_BACKTRACE + end + end + new_value + end + end + + require 'concurrent/atomic_reference/mutex_atomic' + + # @!macro atomic_reference + # + # An object reference that may be updated atomically. All read and write + # operations have java volatile semantic. + # + # @!macro thread_safe_variable_comparison + # + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html + # + # @!method initialize(value = nil) + # @!macro atomic_reference_method_initialize + # @param [Object] value The initial value. + # + # @!method get + # @!macro atomic_reference_method_get + # Gets the current value. + # @return [Object] the current value + # + # @!method set(new_value) + # @!macro atomic_reference_method_set + # Sets to the given value. + # @param [Object] new_value the new value + # @return [Object] the new value + # + # @!method get_and_set(new_value) + # @!macro atomic_reference_method_get_and_set + # Atomically sets to the given value and returns the old value. + # @param [Object] new_value the new value + # @return [Object] the old value + # + # @!method compare_and_set(old_value, new_value) + # @!macro atomic_reference_method_compare_and_set + # + # Atomically sets the value to the given updated value if + # the current value == the expected value. + # + # @param [Object] old_value the expected value + # @param [Object] new_value the new value + # + # @return [Boolean] `true` if successful. A `false` return indicates + # that the actual value was not equal to the expected value. + # + # @!method update + # @!macro atomic_reference_method_update + # + # @!method try_update + # @!macro atomic_reference_method_try_update + # + # @!method try_update! + # @!macro atomic_reference_method_try_update! + + + # @!macro internal_implementation_note + class ConcurrentUpdateError < ThreadError + # frozen pre-allocated backtrace to speed ConcurrentUpdateError + CONC_UP_ERR_BACKTRACE = ['backtrace elided; set verbose to enable'].freeze + end + + # @!macro internal_implementation_note + AtomicReferenceImplementation = case + when Concurrent.on_cruby? && Concurrent.c_extensions_loaded? + # @!visibility private + # @!macro internal_implementation_note + class CAtomicReference + include AtomicDirectUpdate + include AtomicNumericCompareAndSetWrapper + alias_method :compare_and_swap, :compare_and_set + end + CAtomicReference + when Concurrent.on_jruby? + # @!visibility private + # @!macro internal_implementation_note + class JavaAtomicReference + include AtomicDirectUpdate + end + JavaAtomicReference + when Concurrent.on_truffleruby? + class TruffleRubyAtomicReference < TruffleRuby::AtomicReference + include AtomicDirectUpdate + alias_method :value, :get + alias_method :value=, :set + alias_method :compare_and_swap, :compare_and_set + alias_method :swap, :get_and_set + end + when Concurrent.on_rbx? + # @note Extends `Rubinius::AtomicReference` version adding aliases + # and numeric logic. + # + # @!visibility private + # @!macro internal_implementation_note + class RbxAtomicReference < Rubinius::AtomicReference + alias_method :_compare_and_set, :compare_and_set + include AtomicDirectUpdate + include AtomicNumericCompareAndSetWrapper + alias_method :value, :get + alias_method :value=, :set + alias_method :swap, :get_and_set + alias_method :compare_and_swap, :compare_and_set + end + RbxAtomicReference + else + MutexAtomicReference + end + private_constant :AtomicReferenceImplementation + + # @!macro atomic_reference + class AtomicReference < AtomicReferenceImplementation + + # @return [String] Short string representation. + def to_s + format '%s value:%s>', super[0..-2], get + end + + alias_method :inspect, :to_s + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/count_down_latch.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/count_down_latch.rb new file mode 100644 index 000000000000..d883aed6f251 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/count_down_latch.rb @@ -0,0 +1,100 @@ +require 'concurrent/utility/engine' +require 'concurrent/atomic/mutex_count_down_latch' +require 'concurrent/atomic/java_count_down_latch' + +module Concurrent + + ################################################################### + + # @!macro count_down_latch_method_initialize + # + # Create a new `CountDownLatch` with the initial `count`. + # + # @param [new] count the initial count + # + # @raise [ArgumentError] if `count` is not an integer or is less than zero + + # @!macro count_down_latch_method_wait + # + # Block on the latch until the counter reaches zero or until `timeout` is reached. + # + # @param [Fixnum] timeout the number of seconds to wait for the counter or `nil` + # to block indefinitely + # @return [Boolean] `true` if the `count` reaches zero else false on `timeout` + + # @!macro count_down_latch_method_count_down + # + # Signal the latch to decrement the counter. Will signal all blocked threads when + # the `count` reaches zero. + + # @!macro count_down_latch_method_count + # + # The current value of the counter. + # + # @return [Fixnum] the current value of the counter + + ################################################################### + + # @!macro count_down_latch_public_api + # + # @!method initialize(count = 1) + # @!macro count_down_latch_method_initialize + # + # @!method wait(timeout = nil) + # @!macro count_down_latch_method_wait + # + # @!method count_down + # @!macro count_down_latch_method_count_down + # + # @!method count + # @!macro count_down_latch_method_count + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + CountDownLatchImplementation = case + when Concurrent.on_jruby? + JavaCountDownLatch + else + MutexCountDownLatch + end + private_constant :CountDownLatchImplementation + + # @!macro count_down_latch + # + # A synchronization object that allows one thread to wait on multiple other threads. + # The thread that will wait creates a `CountDownLatch` and sets the initial value + # (normally equal to the number of other threads). The initiating thread passes the + # latch to the other threads then waits for the other threads by calling the `#wait` + # method. Each of the other threads calls `#count_down` when done with its work. + # When the latch counter reaches zero the waiting thread is unblocked and continues + # with its work. A `CountDownLatch` can be used only once. Its value cannot be reset. + # + # @!macro count_down_latch_public_api + # @example Waiter and Decrementer + # latch = Concurrent::CountDownLatch.new(3) + # + # waiter = Thread.new do + # latch.wait() + # puts ("Waiter released") + # end + # + # decrementer = Thread.new do + # sleep(1) + # latch.count_down + # puts latch.count + # + # sleep(1) + # latch.count_down + # puts latch.count + # + # sleep(1) + # latch.count_down + # puts latch.count + # end + # + # [waiter, decrementer].each(&:join) + class CountDownLatch < CountDownLatchImplementation + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb new file mode 100644 index 000000000000..42f5a94967b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb @@ -0,0 +1,128 @@ +require 'concurrent/synchronization' +require 'concurrent/utility/native_integer' + +module Concurrent + + # A synchronization aid that allows a set of threads to all wait for each + # other to reach a common barrier point. + # @example + # barrier = Concurrent::CyclicBarrier.new(3) + # jobs = Array.new(3) { |i| -> { sleep i; p done: i } } + # process = -> (i) do + # # waiting to start at the same time + # barrier.wait + # # execute job + # jobs[i].call + # # wait for others to finish + # barrier.wait + # end + # threads = 2.times.map do |i| + # Thread.new(i, &process) + # end + # + # # use main as well + # process.call 2 + # + # # here we can be sure that all jobs are processed + class CyclicBarrier < Synchronization::LockableObject + + # @!visibility private + Generation = Struct.new(:status) + private_constant :Generation + + # Create a new `CyclicBarrier` that waits for `parties` threads + # + # @param [Fixnum] parties the number of parties + # @yield an optional block that will be executed that will be executed after + # the last thread arrives and before the others are released + # + # @raise [ArgumentError] if `parties` is not an integer or is less than zero + def initialize(parties, &block) + Utility::NativeInteger.ensure_integer_and_bounds parties + Utility::NativeInteger.ensure_positive_and_no_zero parties + + super(&nil) + synchronize { ns_initialize parties, &block } + end + + # @return [Fixnum] the number of threads needed to pass the barrier + def parties + synchronize { @parties } + end + + # @return [Fixnum] the number of threads currently waiting on the barrier + def number_waiting + synchronize { @number_waiting } + end + + # Blocks on the barrier until the number of waiting threads is equal to + # `parties` or until `timeout` is reached or `reset` is called + # If a block has been passed to the constructor, it will be executed once by + # the last arrived thread before releasing the others + # @param [Fixnum] timeout the number of seconds to wait for the counter or + # `nil` to block indefinitely + # @return [Boolean] `true` if the `count` reaches zero else false on + # `timeout` or on `reset` or if the barrier is broken + def wait(timeout = nil) + synchronize do + + return false unless @generation.status == :waiting + + @number_waiting += 1 + + if @number_waiting == @parties + @action.call if @action + ns_generation_done @generation, :fulfilled + true + else + generation = @generation + if ns_wait_until(timeout) { generation.status != :waiting } + generation.status == :fulfilled + else + ns_generation_done generation, :broken, false + false + end + end + end + end + + # resets the barrier to its initial state + # If there is at least one waiting thread, it will be woken up, the `wait` + # method will return false and the barrier will be broken + # If the barrier is broken, this method restores it to the original state + # + # @return [nil] + def reset + synchronize { ns_generation_done @generation, :reset } + end + + # A barrier can be broken when: + # - a thread called the `reset` method while at least one other thread was waiting + # - at least one thread timed out on `wait` method + # + # A broken barrier can be restored using `reset` it's safer to create a new one + # @return [Boolean] true if the barrier is broken otherwise false + def broken? + synchronize { @generation.status != :waiting } + end + + protected + + def ns_generation_done(generation, status, continue = true) + generation.status = status + ns_next_generation if continue + ns_broadcast + end + + def ns_next_generation + @generation = Generation.new(:waiting) + @number_waiting = 0 + end + + def ns_initialize(parties, &block) + @parties = parties + @action = block + ns_next_generation + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/event.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/event.rb new file mode 100644 index 000000000000..825f38a031b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/event.rb @@ -0,0 +1,109 @@ +require 'thread' +require 'concurrent/synchronization' + +module Concurrent + + # Old school kernel-style event reminiscent of Win32 programming in C++. + # + # When an `Event` is created it is in the `unset` state. Threads can choose to + # `#wait` on the event, blocking until released by another thread. When one + # thread wants to alert all blocking threads it calls the `#set` method which + # will then wake up all listeners. Once an `Event` has been set it remains set. + # New threads calling `#wait` will return immediately. An `Event` may be + # `#reset` at any time once it has been set. + # + # @see http://msdn.microsoft.com/en-us/library/windows/desktop/ms682655.aspx + # @example + # event = Concurrent::Event.new + # + # t1 = Thread.new do + # puts "t1 is waiting" + # event.wait(1) + # puts "event ocurred" + # end + # + # t2 = Thread.new do + # puts "t2 calling set" + # event.set + # end + # + # [t1, t2].each(&:join) + # + # # prints: + # # t2 calling set + # # t1 is waiting + # # event occurred + class Event < Synchronization::LockableObject + + # Creates a new `Event` in the unset state. Threads calling `#wait` on the + # `Event` will block. + def initialize + super + synchronize { ns_initialize } + end + + # Is the object in the set state? + # + # @return [Boolean] indicating whether or not the `Event` has been set + def set? + synchronize { @set } + end + + # Trigger the event, setting the state to `set` and releasing all threads + # waiting on the event. Has no effect if the `Event` has already been set. + # + # @return [Boolean] should always return `true` + def set + synchronize { ns_set } + end + + def try? + synchronize { @set ? false : ns_set } + end + + # Reset a previously set event back to the `unset` state. + # Has no effect if the `Event` has not yet been set. + # + # @return [Boolean] should always return `true` + def reset + synchronize do + if @set + @set = false + @iteration +=1 + end + true + end + end + + # Wait a given number of seconds for the `Event` to be set by another + # thread. Will wait forever when no `timeout` value is given. Returns + # immediately if the `Event` has already been set. + # + # @return [Boolean] true if the `Event` was set before timeout else false + def wait(timeout = nil) + synchronize do + unless @set + iteration = @iteration + ns_wait_until(timeout) { iteration < @iteration || @set } + else + true + end + end + end + + protected + + def ns_set + unless @set + @set = true + ns_broadcast + end + true + end + + def ns_initialize + @set = false + @iteration = 0 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb new file mode 100644 index 000000000000..cb5b35a567a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb @@ -0,0 +1,42 @@ +if Concurrent.on_jruby? + + module Concurrent + + # @!macro count_down_latch + # @!visibility private + # @!macro internal_implementation_note + class JavaCountDownLatch + + # @!macro count_down_latch_method_initialize + def initialize(count = 1) + Utility::NativeInteger.ensure_integer_and_bounds(count) + Utility::NativeInteger.ensure_positive(count) + @latch = java.util.concurrent.CountDownLatch.new(count) + end + + # @!macro count_down_latch_method_wait + def wait(timeout = nil) + result = nil + if timeout.nil? + Synchronization::JRuby.sleep_interruptibly { @latch.await } + result = true + else + Synchronization::JRuby.sleep_interruptibly do + result = @latch.await(1000 * timeout, java.util.concurrent.TimeUnit::MILLISECONDS) + end + end + result + end + + # @!macro count_down_latch_method_count_down + def count_down + @latch.countDown + end + + # @!macro count_down_latch_method_count + def count + @latch.getCount + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/java_thread_local_var.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/java_thread_local_var.rb new file mode 100644 index 000000000000..b41018ffed83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/java_thread_local_var.rb @@ -0,0 +1,37 @@ +require 'concurrent/atomic/abstract_thread_local_var' + +if Concurrent.on_jruby? + + module Concurrent + + # @!visibility private + # @!macro internal_implementation_note + class JavaThreadLocalVar < AbstractThreadLocalVar + + # @!macro thread_local_var_method_get + def value + value = @var.get + + if value.nil? + default + elsif value == NULL + nil + else + value + end + end + + # @!macro thread_local_var_method_set + def value=(value) + @var.set(value) + end + + protected + + # @!visibility private + def allocate_storage + @var = java.lang.ThreadLocal.new + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb new file mode 100644 index 000000000000..a033de4cade0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb @@ -0,0 +1,62 @@ +require 'concurrent/synchronization' + +module Concurrent + + # @!macro atomic_boolean + # @!visibility private + # @!macro internal_implementation_note + class MutexAtomicBoolean < Synchronization::LockableObject + + # @!macro atomic_boolean_method_initialize + def initialize(initial = false) + super() + synchronize { ns_initialize(initial) } + end + + # @!macro atomic_boolean_method_value_get + def value + synchronize { @value } + end + + # @!macro atomic_boolean_method_value_set + def value=(value) + synchronize { @value = !!value } + end + + # @!macro atomic_boolean_method_true_question + def true? + synchronize { @value } + end + + # @!macro atomic_boolean_method_false_question + def false? + synchronize { !@value } + end + + # @!macro atomic_boolean_method_make_true + def make_true + synchronize { ns_make_value(true) } + end + + # @!macro atomic_boolean_method_make_false + def make_false + synchronize { ns_make_value(false) } + end + + protected + + # @!visibility private + def ns_initialize(initial) + @value = !!initial + end + + private + + # @!visibility private + def ns_make_value(value) + old = @value + @value = value + old != @value + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb new file mode 100644 index 000000000000..77b91d2dbfb4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb @@ -0,0 +1,75 @@ +require 'concurrent/synchronization' +require 'concurrent/utility/native_integer' + +module Concurrent + + # @!macro atomic_fixnum + # @!visibility private + # @!macro internal_implementation_note + class MutexAtomicFixnum < Synchronization::LockableObject + + # @!macro atomic_fixnum_method_initialize + def initialize(initial = 0) + super() + synchronize { ns_initialize(initial) } + end + + # @!macro atomic_fixnum_method_value_get + def value + synchronize { @value } + end + + # @!macro atomic_fixnum_method_value_set + def value=(value) + synchronize { ns_set(value) } + end + + # @!macro atomic_fixnum_method_increment + def increment(delta = 1) + synchronize { ns_set(@value + delta.to_i) } + end + + alias_method :up, :increment + + # @!macro atomic_fixnum_method_decrement + def decrement(delta = 1) + synchronize { ns_set(@value - delta.to_i) } + end + + alias_method :down, :decrement + + # @!macro atomic_fixnum_method_compare_and_set + def compare_and_set(expect, update) + synchronize do + if @value == expect.to_i + @value = update.to_i + true + else + false + end + end + end + + # @!macro atomic_fixnum_method_update + def update + synchronize do + @value = yield @value + end + end + + protected + + # @!visibility private + def ns_initialize(initial) + ns_set(initial) + end + + private + + # @!visibility private + def ns_set(value) + Utility::NativeInteger.ensure_integer_and_bounds value + @value = value + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb new file mode 100644 index 000000000000..e99744cef633 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb @@ -0,0 +1,44 @@ +require 'concurrent/synchronization' +require 'concurrent/utility/native_integer' + +module Concurrent + + # @!macro count_down_latch + # @!visibility private + # @!macro internal_implementation_note + class MutexCountDownLatch < Synchronization::LockableObject + + # @!macro count_down_latch_method_initialize + def initialize(count = 1) + Utility::NativeInteger.ensure_integer_and_bounds count + Utility::NativeInteger.ensure_positive count + + super() + synchronize { ns_initialize count } + end + + # @!macro count_down_latch_method_wait + def wait(timeout = nil) + synchronize { ns_wait_until(timeout) { @count == 0 } } + end + + # @!macro count_down_latch_method_count_down + def count_down + synchronize do + @count -= 1 if @count > 0 + ns_broadcast if @count == 0 + end + end + + # @!macro count_down_latch_method_count + def count + synchronize { @count } + end + + protected + + def ns_initialize(count) + @count = count + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb new file mode 100644 index 000000000000..2042f730568f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb @@ -0,0 +1,115 @@ +require 'concurrent/synchronization' +require 'concurrent/utility/native_integer' + +module Concurrent + + # @!macro semaphore + # @!visibility private + # @!macro internal_implementation_note + class MutexSemaphore < Synchronization::LockableObject + + # @!macro semaphore_method_initialize + def initialize(count) + Utility::NativeInteger.ensure_integer_and_bounds count + + super() + synchronize { ns_initialize count } + end + + # @!macro semaphore_method_acquire + def acquire(permits = 1) + Utility::NativeInteger.ensure_integer_and_bounds permits + Utility::NativeInteger.ensure_positive permits + + synchronize do + try_acquire_timed(permits, nil) + nil + end + end + + # @!macro semaphore_method_available_permits + def available_permits + synchronize { @free } + end + + # @!macro semaphore_method_drain_permits + # + # Acquires and returns all permits that are immediately available. + # + # @return [Integer] + def drain_permits + synchronize do + @free.tap { |_| @free = 0 } + end + end + + # @!macro semaphore_method_try_acquire + def try_acquire(permits = 1, timeout = nil) + Utility::NativeInteger.ensure_integer_and_bounds permits + Utility::NativeInteger.ensure_positive permits + + synchronize do + if timeout.nil? + try_acquire_now(permits) + else + try_acquire_timed(permits, timeout) + end + end + end + + # @!macro semaphore_method_release + def release(permits = 1) + Utility::NativeInteger.ensure_integer_and_bounds permits + Utility::NativeInteger.ensure_positive permits + + synchronize do + @free += permits + permits.times { ns_signal } + end + nil + end + + # Shrinks the number of available permits by the indicated reduction. + # + # @param [Fixnum] reduction Number of permits to remove. + # + # @raise [ArgumentError] if `reduction` is not an integer or is negative + # + # @raise [ArgumentError] if `@free` - `@reduction` is less than zero + # + # @return [nil] + # + # @!visibility private + def reduce_permits(reduction) + Utility::NativeInteger.ensure_integer_and_bounds reduction + Utility::NativeInteger.ensure_positive reduction + + synchronize { @free -= reduction } + nil + end + + protected + + # @!visibility private + def ns_initialize(count) + @free = count + end + + private + + # @!visibility private + def try_acquire_now(permits) + if @free >= permits + @free -= permits + true + else + false + end + end + + # @!visibility private + def try_acquire_timed(permits, timeout) + ns_wait_until(timeout) { try_acquire_now(permits) } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb new file mode 100644 index 000000000000..246f21aac313 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb @@ -0,0 +1,254 @@ +require 'thread' +require 'concurrent/atomic/atomic_fixnum' +require 'concurrent/errors' +require 'concurrent/synchronization' + +module Concurrent + + # Ruby read-write lock implementation + # + # Allows any number of concurrent readers, but only one concurrent writer + # (And if the "write" lock is taken, any readers who come along will have to wait) + # + # If readers are already active when a writer comes along, the writer will wait for + # all the readers to finish before going ahead. + # Any additional readers that come when the writer is already waiting, will also + # wait (so writers are not starved). + # + # This implementation is based on `java.util.concurrent.ReentrantReadWriteLock`. + # + # @example + # lock = Concurrent::ReadWriteLock.new + # lock.with_read_lock { data.retrieve } + # lock.with_write_lock { data.modify! } + # + # @note Do **not** try to acquire the write lock while already holding a read lock + # **or** try to acquire the write lock while you already have it. + # This will lead to deadlock + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html java.util.concurrent.ReentrantReadWriteLock + class ReadWriteLock < Synchronization::Object + + # @!visibility private + WAITING_WRITER = 1 << 15 + + # @!visibility private + RUNNING_WRITER = 1 << 29 + + # @!visibility private + MAX_READERS = WAITING_WRITER - 1 + + # @!visibility private + MAX_WRITERS = RUNNING_WRITER - MAX_READERS - 1 + + safe_initialization! + + # Implementation notes: + # A goal is to make the uncontended path for both readers/writers lock-free + # Only if there is reader-writer or writer-writer contention, should locks be used + # Internal state is represented by a single integer ("counter"), and updated + # using atomic compare-and-swap operations + # When the counter is 0, the lock is free + # Each reader increments the counter by 1 when acquiring a read lock + # (and decrements by 1 when releasing the read lock) + # The counter is increased by (1 << 15) for each writer waiting to acquire the + # write lock, and by (1 << 29) if the write lock is taken + + # Create a new `ReadWriteLock` in the unlocked state. + def initialize + super() + @Counter = AtomicFixnum.new(0) # single integer which represents lock state + @ReadLock = Synchronization::Lock.new + @WriteLock = Synchronization::Lock.new + end + + # Execute a block operation within a read lock. + # + # @yield the task to be performed within the lock. + # + # @return [Object] the result of the block operation. + # + # @raise [ArgumentError] when no block is given. + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def with_read_lock + raise ArgumentError.new('no block given') unless block_given? + acquire_read_lock + begin + yield + ensure + release_read_lock + end + end + + # Execute a block operation within a write lock. + # + # @yield the task to be performed within the lock. + # + # @return [Object] the result of the block operation. + # + # @raise [ArgumentError] when no block is given. + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def with_write_lock + raise ArgumentError.new('no block given') unless block_given? + acquire_write_lock + begin + yield + ensure + release_write_lock + end + end + + # Acquire a read lock. If a write lock has been acquired will block until + # it is released. Will not block if other read locks have been acquired. + # + # @return [Boolean] true if the lock is successfully acquired + # + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def acquire_read_lock + while true + c = @Counter.value + raise ResourceLimitError.new('Too many reader threads') if max_readers?(c) + + # If a writer is waiting when we first queue up, we need to wait + if waiting_writer?(c) + @ReadLock.wait_until { !waiting_writer? } + + # after a reader has waited once, they are allowed to "barge" ahead of waiting writers + # but if a writer is *running*, the reader still needs to wait (naturally) + while true + c = @Counter.value + if running_writer?(c) + @ReadLock.wait_until { !running_writer? } + else + return if @Counter.compare_and_set(c, c+1) + end + end + else + break if @Counter.compare_and_set(c, c+1) + end + end + true + end + + # Release a previously acquired read lock. + # + # @return [Boolean] true if the lock is successfully released + def release_read_lock + while true + c = @Counter.value + if @Counter.compare_and_set(c, c-1) + # If one or more writers were waiting, and we were the last reader, wake a writer up + if waiting_writer?(c) && running_readers(c) == 1 + @WriteLock.signal + end + break + end + end + true + end + + # Acquire a write lock. Will block and wait for all active readers and writers. + # + # @return [Boolean] true if the lock is successfully acquired + # + # @raise [Concurrent::ResourceLimitError] if the maximum number of writers + # is exceeded. + def acquire_write_lock + while true + c = @Counter.value + raise ResourceLimitError.new('Too many writer threads') if max_writers?(c) + + if c == 0 # no readers OR writers running + # if we successfully swap the RUNNING_WRITER bit on, then we can go ahead + break if @Counter.compare_and_set(0, RUNNING_WRITER) + elsif @Counter.compare_and_set(c, c+WAITING_WRITER) + while true + # Now we have successfully incremented, so no more readers will be able to increment + # (they will wait instead) + # However, readers OR writers could decrement right here, OR another writer could increment + @WriteLock.wait_until do + # So we have to do another check inside the synchronized section + # If a writer OR reader is running, then go to sleep + c = @Counter.value + !running_writer?(c) && !running_readers?(c) + end + + # We just came out of a wait + # If we successfully turn the RUNNING_WRITER bit on with an atomic swap, + # Then we are OK to stop waiting and go ahead + # Otherwise go back and wait again + c = @Counter.value + break if !running_writer?(c) && !running_readers?(c) && @Counter.compare_and_set(c, c+RUNNING_WRITER-WAITING_WRITER) + end + break + end + end + true + end + + # Release a previously acquired write lock. + # + # @return [Boolean] true if the lock is successfully released + def release_write_lock + return true unless running_writer? + c = @Counter.update { |counter| counter - RUNNING_WRITER } + @ReadLock.broadcast + @WriteLock.signal if waiting_writers(c) > 0 + true + end + + # Queries if the write lock is held by any thread. + # + # @return [Boolean] true if the write lock is held else false` + def write_locked? + @Counter.value >= RUNNING_WRITER + end + + # Queries whether any threads are waiting to acquire the read or write lock. + # + # @return [Boolean] true if any threads are waiting for a lock else false + def has_waiters? + waiting_writer?(@Counter.value) + end + + private + + # @!visibility private + def running_readers(c = @Counter.value) + c & MAX_READERS + end + + # @!visibility private + def running_readers?(c = @Counter.value) + (c & MAX_READERS) > 0 + end + + # @!visibility private + def running_writer?(c = @Counter.value) + c >= RUNNING_WRITER + end + + # @!visibility private + def waiting_writers(c = @Counter.value) + (c & MAX_WRITERS) / WAITING_WRITER + end + + # @!visibility private + def waiting_writer?(c = @Counter.value) + c >= WAITING_WRITER + end + + # @!visibility private + def max_readers?(c = @Counter.value) + (c & MAX_READERS) == MAX_READERS + end + + # @!visibility private + def max_writers?(c = @Counter.value) + (c & MAX_WRITERS) == MAX_WRITERS + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb new file mode 100644 index 000000000000..42d7f3c3ec56 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb @@ -0,0 +1,379 @@ +require 'thread' +require 'concurrent/atomic/atomic_reference' +require 'concurrent/errors' +require 'concurrent/synchronization' +require 'concurrent/atomic/thread_local_var' + +module Concurrent + + # Re-entrant read-write lock implementation + # + # Allows any number of concurrent readers, but only one concurrent writer + # (And while the "write" lock is taken, no read locks can be obtained either. + # Hence, the write lock can also be called an "exclusive" lock.) + # + # If another thread has taken a read lock, any thread which wants a write lock + # will block until all the readers release their locks. However, once a thread + # starts waiting to obtain a write lock, any additional readers that come along + # will also wait (so writers are not starved). + # + # A thread can acquire both a read and write lock at the same time. A thread can + # also acquire a read lock OR a write lock more than once. Only when the read (or + # write) lock is released as many times as it was acquired, will the thread + # actually let it go, allowing other threads which might have been waiting + # to proceed. Therefore the lock can be upgraded by first acquiring + # read lock and then write lock and that the lock can be downgraded by first + # having both read and write lock a releasing just the write lock. + # + # If both read and write locks are acquired by the same thread, it is not strictly + # necessary to release them in the same order they were acquired. In other words, + # the following code is legal: + # + # @example + # lock = Concurrent::ReentrantReadWriteLock.new + # lock.acquire_write_lock + # lock.acquire_read_lock + # lock.release_write_lock + # # At this point, the current thread is holding only a read lock, not a write + # # lock. So other threads can take read locks, but not a write lock. + # lock.release_read_lock + # # Now the current thread is not holding either a read or write lock, so + # # another thread could potentially acquire a write lock. + # + # This implementation was inspired by `java.util.concurrent.ReentrantReadWriteLock`. + # + # @example + # lock = Concurrent::ReentrantReadWriteLock.new + # lock.with_read_lock { data.retrieve } + # lock.with_write_lock { data.modify! } + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html java.util.concurrent.ReentrantReadWriteLock + class ReentrantReadWriteLock < Synchronization::Object + + # Implementation notes: + # + # A goal is to make the uncontended path for both readers/writers mutex-free + # Only if there is reader-writer or writer-writer contention, should mutexes be used + # Otherwise, a single CAS operation is all we need to acquire/release a lock + # + # Internal state is represented by a single integer ("counter"), and updated + # using atomic compare-and-swap operations + # When the counter is 0, the lock is free + # Each thread which has one OR MORE read locks increments the counter by 1 + # (and decrements by 1 when releasing the read lock) + # The counter is increased by (1 << 15) for each writer waiting to acquire the + # write lock, and by (1 << 29) if the write lock is taken + # + # Additionally, each thread uses a thread-local variable to count how many times + # it has acquired a read lock, AND how many times it has acquired a write lock. + # It uses a similar trick; an increment of 1 means a read lock was taken, and + # an increment of (1 << 15) means a write lock was taken + # This is what makes re-entrancy possible + # + # 2 rules are followed to ensure good liveness properties: + # 1) Once a writer has queued up and is waiting for a write lock, no other thread + # can take a lock without waiting + # 2) When a write lock is released, readers are given the "first chance" to wake + # up and acquire a read lock + # Following these rules means readers and writers tend to "take turns", so neither + # can starve the other, even under heavy contention + + # @!visibility private + READER_BITS = 15 + # @!visibility private + WRITER_BITS = 14 + + # Used with @Counter: + # @!visibility private + WAITING_WRITER = 1 << READER_BITS + # @!visibility private + RUNNING_WRITER = 1 << (READER_BITS + WRITER_BITS) + # @!visibility private + MAX_READERS = WAITING_WRITER - 1 + # @!visibility private + MAX_WRITERS = RUNNING_WRITER - MAX_READERS - 1 + + # Used with @HeldCount: + # @!visibility private + WRITE_LOCK_HELD = 1 << READER_BITS + # @!visibility private + READ_LOCK_MASK = WRITE_LOCK_HELD - 1 + # @!visibility private + WRITE_LOCK_MASK = MAX_WRITERS + + safe_initialization! + + # Create a new `ReentrantReadWriteLock` in the unlocked state. + def initialize + super() + @Counter = AtomicFixnum.new(0) # single integer which represents lock state + @ReadQueue = Synchronization::Lock.new # used to queue waiting readers + @WriteQueue = Synchronization::Lock.new # used to queue waiting writers + @HeldCount = ThreadLocalVar.new(0) # indicates # of R & W locks held by this thread + end + + # Execute a block operation within a read lock. + # + # @yield the task to be performed within the lock. + # + # @return [Object] the result of the block operation. + # + # @raise [ArgumentError] when no block is given. + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def with_read_lock + raise ArgumentError.new('no block given') unless block_given? + acquire_read_lock + begin + yield + ensure + release_read_lock + end + end + + # Execute a block operation within a write lock. + # + # @yield the task to be performed within the lock. + # + # @return [Object] the result of the block operation. + # + # @raise [ArgumentError] when no block is given. + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def with_write_lock + raise ArgumentError.new('no block given') unless block_given? + acquire_write_lock + begin + yield + ensure + release_write_lock + end + end + + # Acquire a read lock. If a write lock is held by another thread, will block + # until it is released. + # + # @return [Boolean] true if the lock is successfully acquired + # + # @raise [Concurrent::ResourceLimitError] if the maximum number of readers + # is exceeded. + def acquire_read_lock + if (held = @HeldCount.value) > 0 + # If we already have a lock, there's no need to wait + if held & READ_LOCK_MASK == 0 + # But we do need to update the counter, if we were holding a write + # lock but not a read lock + @Counter.update { |c| c + 1 } + end + @HeldCount.value = held + 1 + return true + end + + while true + c = @Counter.value + raise ResourceLimitError.new('Too many reader threads') if max_readers?(c) + + # If a writer is waiting OR running when we first queue up, we need to wait + if waiting_or_running_writer?(c) + # Before going to sleep, check again with the ReadQueue mutex held + @ReadQueue.synchronize do + @ReadQueue.ns_wait if waiting_or_running_writer? + end + # Note: the above 'synchronize' block could have used #wait_until, + # but that waits repeatedly in a loop, checking the wait condition + # each time it wakes up (to protect against spurious wakeups) + # But we are already in a loop, which is only broken when we successfully + # acquire the lock! So we don't care about spurious wakeups, and would + # rather not pay the extra overhead of using #wait_until + + # After a reader has waited once, they are allowed to "barge" ahead of waiting writers + # But if a writer is *running*, the reader still needs to wait (naturally) + while true + c = @Counter.value + if running_writer?(c) + @ReadQueue.synchronize do + @ReadQueue.ns_wait if running_writer? + end + elsif @Counter.compare_and_set(c, c+1) + @HeldCount.value = held + 1 + return true + end + end + elsif @Counter.compare_and_set(c, c+1) + @HeldCount.value = held + 1 + return true + end + end + end + + # Try to acquire a read lock and return true if we succeed. If it cannot be + # acquired immediately, return false. + # + # @return [Boolean] true if the lock is successfully acquired + def try_read_lock + if (held = @HeldCount.value) > 0 + if held & READ_LOCK_MASK == 0 + # If we hold a write lock, but not a read lock... + @Counter.update { |c| c + 1 } + end + @HeldCount.value = held + 1 + return true + else + c = @Counter.value + if !waiting_or_running_writer?(c) && @Counter.compare_and_set(c, c+1) + @HeldCount.value = held + 1 + return true + end + end + false + end + + # Release a previously acquired read lock. + # + # @return [Boolean] true if the lock is successfully released + def release_read_lock + held = @HeldCount.value = @HeldCount.value - 1 + rlocks_held = held & READ_LOCK_MASK + if rlocks_held == 0 + c = @Counter.update { |counter| counter - 1 } + # If one or more writers were waiting, and we were the last reader, wake a writer up + if waiting_or_running_writer?(c) && running_readers(c) == 0 + @WriteQueue.signal + end + elsif rlocks_held == READ_LOCK_MASK + raise IllegalOperationError, "Cannot release a read lock which is not held" + end + true + end + + # Acquire a write lock. Will block and wait for all active readers and writers. + # + # @return [Boolean] true if the lock is successfully acquired + # + # @raise [Concurrent::ResourceLimitError] if the maximum number of writers + # is exceeded. + def acquire_write_lock + if (held = @HeldCount.value) >= WRITE_LOCK_HELD + # if we already have a write (exclusive) lock, there's no need to wait + @HeldCount.value = held + WRITE_LOCK_HELD + return true + end + + while true + c = @Counter.value + raise ResourceLimitError.new('Too many writer threads') if max_writers?(c) + + # To go ahead and take the lock without waiting, there must be no writer + # running right now, AND no writers who came before us still waiting to + # acquire the lock + # Additionally, if any read locks have been taken, we must hold all of them + if c == held + # If we successfully swap the RUNNING_WRITER bit on, then we can go ahead + if @Counter.compare_and_set(c, c+RUNNING_WRITER) + @HeldCount.value = held + WRITE_LOCK_HELD + return true + end + elsif @Counter.compare_and_set(c, c+WAITING_WRITER) + while true + # Now we have successfully incremented, so no more readers will be able to increment + # (they will wait instead) + # However, readers OR writers could decrement right here + @WriteQueue.synchronize do + # So we have to do another check inside the synchronized section + # If a writer OR another reader is running, then go to sleep + c = @Counter.value + @WriteQueue.ns_wait if running_writer?(c) || running_readers(c) != held + end + # Note: if you are thinking of replacing the above 'synchronize' block + # with #wait_until, read the comment in #acquire_read_lock first! + + # We just came out of a wait + # If we successfully turn the RUNNING_WRITER bit on with an atomic swap, + # then we are OK to stop waiting and go ahead + # Otherwise go back and wait again + c = @Counter.value + if !running_writer?(c) && + running_readers(c) == held && + @Counter.compare_and_set(c, c+RUNNING_WRITER-WAITING_WRITER) + @HeldCount.value = held + WRITE_LOCK_HELD + return true + end + end + end + end + end + + # Try to acquire a write lock and return true if we succeed. If it cannot be + # acquired immediately, return false. + # + # @return [Boolean] true if the lock is successfully acquired + def try_write_lock + if (held = @HeldCount.value) >= WRITE_LOCK_HELD + @HeldCount.value = held + WRITE_LOCK_HELD + return true + else + c = @Counter.value + if !waiting_or_running_writer?(c) && + running_readers(c) == held && + @Counter.compare_and_set(c, c+RUNNING_WRITER) + @HeldCount.value = held + WRITE_LOCK_HELD + return true + end + end + false + end + + # Release a previously acquired write lock. + # + # @return [Boolean] true if the lock is successfully released + def release_write_lock + held = @HeldCount.value = @HeldCount.value - WRITE_LOCK_HELD + wlocks_held = held & WRITE_LOCK_MASK + if wlocks_held == 0 + c = @Counter.update { |counter| counter - RUNNING_WRITER } + @ReadQueue.broadcast + @WriteQueue.signal if waiting_writers(c) > 0 + elsif wlocks_held == WRITE_LOCK_MASK + raise IllegalOperationError, "Cannot release a write lock which is not held" + end + true + end + + private + + # @!visibility private + def running_readers(c = @Counter.value) + c & MAX_READERS + end + + # @!visibility private + def running_readers?(c = @Counter.value) + (c & MAX_READERS) > 0 + end + + # @!visibility private + def running_writer?(c = @Counter.value) + c >= RUNNING_WRITER + end + + # @!visibility private + def waiting_writers(c = @Counter.value) + (c & MAX_WRITERS) >> READER_BITS + end + + # @!visibility private + def waiting_or_running_writer?(c = @Counter.value) + c >= WAITING_WRITER + end + + # @!visibility private + def max_readers?(c = @Counter.value) + (c & MAX_READERS) == MAX_READERS + end + + # @!visibility private + def max_writers?(c = @Counter.value) + (c & MAX_WRITERS) == MAX_WRITERS + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb new file mode 100644 index 000000000000..9a51eb288b52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb @@ -0,0 +1,181 @@ +require 'thread' +require 'concurrent/atomic/abstract_thread_local_var' + +module Concurrent + + # @!visibility private + # @!macro internal_implementation_note + class RubyThreadLocalVar < AbstractThreadLocalVar + + # Each thread has a (lazily initialized) array of thread-local variable values + # Each time a new thread-local var is created, we allocate an "index" for it + # For example, if the allocated index is 1, that means slot #1 in EVERY + # thread's thread-local array will be used for the value of that TLV + # + # The good thing about using a per-THREAD structure to hold values, rather + # than a per-TLV structure, is that no synchronization is needed when + # reading and writing those values (since the structure is only ever + # accessed by a single thread) + # + # Of course, when a TLV is GC'd, 1) we need to recover its index for use + # by other new TLVs (otherwise the thread-local arrays could get bigger + # and bigger with time), and 2) we need to null out all the references + # held in the now-unused slots (both to avoid blocking GC of those objects, + # and also to prevent "stale" values from being passed on to a new TLV + # when the index is reused) + # Because we need to null out freed slots, we need to keep references to + # ALL the thread-local arrays -- ARRAYS is for that + # But when a Thread is GC'd, we need to drop the reference to its thread-local + # array, so we don't leak memory + + FREE = [] + LOCK = Mutex.new + THREAD_LOCAL_ARRAYS = {} # used as a hash set + + # synchronize when not on MRI + # on MRI using lock in finalizer leads to "can't be called from trap context" error + # so the code is carefully written to be tread-safe on MRI relying on GIL + + if Concurrent.on_cruby? + # @!visibility private + def self.semi_sync(&block) + block.call + end + else + # @!visibility private + def self.semi_sync(&block) + LOCK.synchronize(&block) + end + end + + private_constant :FREE, :LOCK, :THREAD_LOCAL_ARRAYS + + # @!macro thread_local_var_method_get + def value + if (array = get_threadlocal_array) + value = array[@index] + if value.nil? + default + elsif value.equal?(NULL) + nil + else + value + end + else + default + end + end + + # @!macro thread_local_var_method_set + def value=(value) + me = Thread.current + # We could keep the thread-local arrays in a hash, keyed by Thread + # But why? That would require locking + # Using Ruby's built-in thread-local storage is faster + unless (array = get_threadlocal_array(me)) + array = set_threadlocal_array([], me) + self.class.semi_sync { THREAD_LOCAL_ARRAYS[array.object_id] = array } + ObjectSpace.define_finalizer(me, self.class.thread_finalizer(array.object_id)) + end + array[@index] = (value.nil? ? NULL : value) + value + end + + protected + + # @!visibility private + def allocate_storage + @index = FREE.pop || next_index + + ObjectSpace.define_finalizer(self, self.class.thread_local_finalizer(@index)) + end + + # @!visibility private + def self.thread_local_finalizer(index) + proc do + semi_sync do + # The cost of GC'ing a TLV is linear in the number of threads using TLVs + # But that is natural! More threads means more storage is used per TLV + # So naturally more CPU time is required to free more storage + # + # DO NOT use each_value which might conflict with new pair assignment + # into the hash in #value= method + THREAD_LOCAL_ARRAYS.values.each { |array| array[index] = nil } + # free index has to be published after the arrays are cleared + FREE.push(index) + end + end + end + + # @!visibility private + def self.thread_finalizer(id) + proc do + semi_sync do + # The thread which used this thread-local array is now gone + # So don't hold onto a reference to the array (thus blocking GC) + THREAD_LOCAL_ARRAYS.delete(id) + end + end + end + + private + + # noinspection RubyClassVariableUsageInspection + @@next = 0 + # noinspection RubyClassVariableUsageInspection + def next_index + LOCK.synchronize do + result = @@next + @@next += 1 + result + end + end + + if Thread.instance_methods.include?(:thread_variable_get) + + def get_threadlocal_array(thread = Thread.current) + thread.thread_variable_get(:__threadlocal_array__) + end + + def set_threadlocal_array(array, thread = Thread.current) + thread.thread_variable_set(:__threadlocal_array__, array) + end + + else + + def get_threadlocal_array(thread = Thread.current) + thread[:__threadlocal_array__] + end + + def set_threadlocal_array(array, thread = Thread.current) + thread[:__threadlocal_array__] = array + end + end + + # This exists only for use in testing + # @!visibility private + def value_for(thread) + if (array = get_threadlocal_array(thread)) + value = array[@index] + if value.nil? + get_default + elsif value.equal?(NULL) + nil + else + value + end + else + get_default + end + end + + # @!visibility private + def get_default + if @default_block + raise "Cannot use default_for with default block" + else + @default + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/semaphore.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/semaphore.rb new file mode 100644 index 000000000000..1b2bd8c95d59 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/semaphore.rb @@ -0,0 +1,145 @@ +require 'concurrent/atomic/mutex_semaphore' +require 'concurrent/synchronization' + +module Concurrent + + ################################################################### + + # @!macro semaphore_method_initialize + # + # Create a new `Semaphore` with the initial `count`. + # + # @param [Fixnum] count the initial count + # + # @raise [ArgumentError] if `count` is not an integer or is less than zero + + # @!macro semaphore_method_acquire + # + # Acquires the given number of permits from this semaphore, + # blocking until all are available. + # + # @param [Fixnum] permits Number of permits to acquire + # + # @raise [ArgumentError] if `permits` is not an integer or is less than + # one + # + # @return [nil] + + # @!macro semaphore_method_available_permits + # + # Returns the current number of permits available in this semaphore. + # + # @return [Integer] + + # @!macro semaphore_method_drain_permits + # + # Acquires and returns all permits that are immediately available. + # + # @return [Integer] + + # @!macro semaphore_method_try_acquire + # + # Acquires the given number of permits from this semaphore, + # only if all are available at the time of invocation or within + # `timeout` interval + # + # @param [Fixnum] permits the number of permits to acquire + # + # @param [Fixnum] timeout the number of seconds to wait for the counter + # or `nil` to return immediately + # + # @raise [ArgumentError] if `permits` is not an integer or is less than + # one + # + # @return [Boolean] `false` if no permits are available, `true` when + # acquired a permit + + # @!macro semaphore_method_release + # + # Releases the given number of permits, returning them to the semaphore. + # + # @param [Fixnum] permits Number of permits to return to the semaphore. + # + # @raise [ArgumentError] if `permits` is not a number or is less than one + # + # @return [nil] + + ################################################################### + + # @!macro semaphore_public_api + # + # @!method initialize(count) + # @!macro semaphore_method_initialize + # + # @!method acquire(permits = 1) + # @!macro semaphore_method_acquire + # + # @!method available_permits + # @!macro semaphore_method_available_permits + # + # @!method drain_permits + # @!macro semaphore_method_drain_permits + # + # @!method try_acquire(permits = 1, timeout = nil) + # @!macro semaphore_method_try_acquire + # + # @!method release(permits = 1) + # @!macro semaphore_method_release + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + SemaphoreImplementation = case + when defined?(JavaSemaphore) + JavaSemaphore + else + MutexSemaphore + end + private_constant :SemaphoreImplementation + + # @!macro semaphore + # + # A counting semaphore. Conceptually, a semaphore maintains a set of + # permits. Each {#acquire} blocks if necessary until a permit is + # available, and then takes it. Each {#release} adds a permit, potentially + # releasing a blocking acquirer. + # However, no actual permit objects are used; the Semaphore just keeps a + # count of the number available and acts accordingly. + # + # @!macro semaphore_public_api + # @example + # semaphore = Concurrent::Semaphore.new(2) + # + # t1 = Thread.new do + # semaphore.acquire + # puts "Thread 1 acquired semaphore" + # end + # + # t2 = Thread.new do + # semaphore.acquire + # puts "Thread 2 acquired semaphore" + # end + # + # t3 = Thread.new do + # semaphore.acquire + # puts "Thread 3 acquired semaphore" + # end + # + # t4 = Thread.new do + # sleep(2) + # puts "Thread 4 releasing semaphore" + # semaphore.release + # end + # + # [t1, t2, t3, t4].each(&:join) + # + # # prints: + # # Thread 3 acquired semaphore + # # Thread 2 acquired semaphore + # # Thread 4 releasing semaphore + # # Thread 1 acquired semaphore + # + class Semaphore < SemaphoreImplementation + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb new file mode 100644 index 000000000000..100cc8de8f9f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb @@ -0,0 +1,104 @@ +require 'concurrent/utility/engine' +require 'concurrent/atomic/ruby_thread_local_var' +require 'concurrent/atomic/java_thread_local_var' + +module Concurrent + + ################################################################### + + # @!macro thread_local_var_method_initialize + # + # Creates a thread local variable. + # + # @param [Object] default the default value when otherwise unset + # @param [Proc] default_block Optional block that gets called to obtain the + # default value for each thread + + # @!macro thread_local_var_method_get + # + # Returns the value in the current thread's copy of this thread-local variable. + # + # @return [Object] the current value + + # @!macro thread_local_var_method_set + # + # Sets the current thread's copy of this thread-local variable to the specified value. + # + # @param [Object] value the value to set + # @return [Object] the new value + + # @!macro thread_local_var_method_bind + # + # Bind the given value to thread local storage during + # execution of the given block. + # + # @param [Object] value the value to bind + # @yield the operation to be performed with the bound variable + # @return [Object] the value + + + ################################################################### + + # @!macro thread_local_var_public_api + # + # @!method initialize(default = nil, &default_block) + # @!macro thread_local_var_method_initialize + # + # @!method value + # @!macro thread_local_var_method_get + # + # @!method value=(value) + # @!macro thread_local_var_method_set + # + # @!method bind(value, &block) + # @!macro thread_local_var_method_bind + + ################################################################### + + # @!visibility private + # @!macro internal_implementation_note + ThreadLocalVarImplementation = case + when Concurrent.on_jruby? + JavaThreadLocalVar + else + RubyThreadLocalVar + end + private_constant :ThreadLocalVarImplementation + + # @!macro thread_local_var + # + # A `ThreadLocalVar` is a variable where the value is different for each thread. + # Each variable may have a default value, but when you modify the variable only + # the current thread will ever see that change. + # + # @!macro thread_safe_variable_comparison + # + # @example + # v = ThreadLocalVar.new(14) + # v.value #=> 14 + # v.value = 2 + # v.value #=> 2 + # + # @example + # v = ThreadLocalVar.new(14) + # + # t1 = Thread.new do + # v.value #=> 14 + # v.value = 1 + # v.value #=> 1 + # end + # + # t2 = Thread.new do + # v.value #=> 14 + # v.value = 2 + # v.value #=> 2 + # end + # + # v.value #=> 14 + # + # @see https://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html Java ThreadLocal + # + # @!macro thread_local_var_public_api + class ThreadLocalVar < ThreadLocalVarImplementation + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb new file mode 100644 index 000000000000..d092aedd5bbe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb @@ -0,0 +1,56 @@ +module Concurrent + + # @!visibility private + # @!macro internal_implementation_note + class MutexAtomicReference < Synchronization::LockableObject + include AtomicDirectUpdate + include AtomicNumericCompareAndSetWrapper + alias_method :compare_and_swap, :compare_and_set + + # @!macro atomic_reference_method_initialize + def initialize(value = nil) + super() + synchronize { ns_initialize(value) } + end + + # @!macro atomic_reference_method_get + def get + synchronize { @value } + end + alias_method :value, :get + + # @!macro atomic_reference_method_set + def set(new_value) + synchronize { @value = new_value } + end + alias_method :value=, :set + + # @!macro atomic_reference_method_get_and_set + def get_and_set(new_value) + synchronize do + old_value = @value + @value = new_value + old_value + end + end + alias_method :swap, :get_and_set + + # @!macro atomic_reference_method_compare_and_set + def _compare_and_set(old_value, new_value) + synchronize do + if @value.equal? old_value + @value = new_value + true + else + false + end + end + end + + protected + + def ns_initialize(value) + @value = value + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic_reference/numeric_cas_wrapper.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic_reference/numeric_cas_wrapper.rb new file mode 100644 index 000000000000..709a3822318d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomic_reference/numeric_cas_wrapper.rb @@ -0,0 +1,28 @@ +module Concurrent + + # Special "compare and set" handling of numeric values. + # + # @!visibility private + # @!macro internal_implementation_note + module AtomicNumericCompareAndSetWrapper + + # @!macro atomic_reference_method_compare_and_set + def compare_and_set(old_value, new_value) + if old_value.kind_of? Numeric + while true + old = get + + return false unless old.kind_of? Numeric + + return false unless old == old_value + + result = _compare_and_set(old, new_value) + return result if result + end + else + _compare_and_set(old_value, new_value) + end + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomics.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomics.rb new file mode 100644 index 000000000000..16cbe66101b1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/atomics.rb @@ -0,0 +1,10 @@ +require 'concurrent/atomic/atomic_reference' +require 'concurrent/atomic/atomic_boolean' +require 'concurrent/atomic/atomic_fixnum' +require 'concurrent/atomic/cyclic_barrier' +require 'concurrent/atomic/count_down_latch' +require 'concurrent/atomic/event' +require 'concurrent/atomic/read_write_lock' +require 'concurrent/atomic/reentrant_read_write_lock' +require 'concurrent/atomic/semaphore' +require 'concurrent/atomic/thread_local_var' diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb new file mode 100644 index 000000000000..50d52a6237ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb @@ -0,0 +1,107 @@ +require 'concurrent/synchronization' + +module Concurrent + module Collection + + # A thread safe observer set implemented using copy-on-read approach: + # observers are added and removed from a thread safe collection; every time + # a notification is required the internal data structure is copied to + # prevent concurrency issues + # + # @api private + class CopyOnNotifyObserverSet < Synchronization::LockableObject + + def initialize + super() + synchronize { ns_initialize } + end + + # @!macro observable_add_observer + def add_observer(observer = nil, func = :update, &block) + if observer.nil? && block.nil? + raise ArgumentError, 'should pass observer as a first argument or block' + elsif observer && block + raise ArgumentError.new('cannot provide both an observer and a block') + end + + if block + observer = block + func = :call + end + + synchronize do + @observers[observer] = func + observer + end + end + + # @!macro observable_delete_observer + def delete_observer(observer) + synchronize do + @observers.delete(observer) + observer + end + end + + # @!macro observable_delete_observers + def delete_observers + synchronize do + @observers.clear + self + end + end + + # @!macro observable_count_observers + def count_observers + synchronize { @observers.count } + end + + # Notifies all registered observers with optional args + # @param [Object] args arguments to be passed to each observer + # @return [CopyOnWriteObserverSet] self + def notify_observers(*args, &block) + observers = duplicate_observers + notify_to(observers, *args, &block) + self + end + + # Notifies all registered observers with optional args and deletes them. + # + # @param [Object] args arguments to be passed to each observer + # @return [CopyOnWriteObserverSet] self + def notify_and_delete_observers(*args, &block) + observers = duplicate_and_clear_observers + notify_to(observers, *args, &block) + self + end + + protected + + def ns_initialize + @observers = {} + end + + private + + def duplicate_and_clear_observers + synchronize do + observers = @observers.dup + @observers.clear + observers + end + end + + def duplicate_observers + synchronize { @observers.dup } + end + + def notify_to(observers, *args) + raise ArgumentError.new('cannot give arguments and a block') if block_given? && !args.empty? + observers.each do |observer, function| + args = yield if block_given? + observer.send(function, *args) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb new file mode 100644 index 000000000000..3f3f7cccd03b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb @@ -0,0 +1,111 @@ +require 'concurrent/synchronization' + +module Concurrent + module Collection + + # A thread safe observer set implemented using copy-on-write approach: + # every time an observer is added or removed the whole internal data structure is + # duplicated and replaced with a new one. + # + # @api private + class CopyOnWriteObserverSet < Synchronization::LockableObject + + def initialize + super() + synchronize { ns_initialize } + end + + # @!macro observable_add_observer + def add_observer(observer = nil, func = :update, &block) + if observer.nil? && block.nil? + raise ArgumentError, 'should pass observer as a first argument or block' + elsif observer && block + raise ArgumentError.new('cannot provide both an observer and a block') + end + + if block + observer = block + func = :call + end + + synchronize do + new_observers = @observers.dup + new_observers[observer] = func + @observers = new_observers + observer + end + end + + # @!macro observable_delete_observer + def delete_observer(observer) + synchronize do + new_observers = @observers.dup + new_observers.delete(observer) + @observers = new_observers + observer + end + end + + # @!macro observable_delete_observers + def delete_observers + self.observers = {} + self + end + + # @!macro observable_count_observers + def count_observers + observers.count + end + + # Notifies all registered observers with optional args + # @param [Object] args arguments to be passed to each observer + # @return [CopyOnWriteObserverSet] self + def notify_observers(*args, &block) + notify_to(observers, *args, &block) + self + end + + # Notifies all registered observers with optional args and deletes them. + # + # @param [Object] args arguments to be passed to each observer + # @return [CopyOnWriteObserverSet] self + def notify_and_delete_observers(*args, &block) + old = clear_observers_and_return_old + notify_to(old, *args, &block) + self + end + + protected + + def ns_initialize + @observers = {} + end + + private + + def notify_to(observers, *args) + raise ArgumentError.new('cannot give arguments and a block') if block_given? && !args.empty? + observers.each do |observer, function| + args = yield if block_given? + observer.send(function, *args) + end + end + + def observers + synchronize { @observers } + end + + def observers=(new_set) + synchronize { @observers = new_set } + end + + def clear_observers_and_return_old + synchronize do + old_observers = @observers + @observers = {} + old_observers + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/java_non_concurrent_priority_queue.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/java_non_concurrent_priority_queue.rb new file mode 100644 index 000000000000..2be9e4373a32 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/java_non_concurrent_priority_queue.rb @@ -0,0 +1,84 @@ +if Concurrent.on_jruby? + + module Concurrent + module Collection + + + # @!macro priority_queue + # + # @!visibility private + # @!macro internal_implementation_note + class JavaNonConcurrentPriorityQueue + + # @!macro priority_queue_method_initialize + def initialize(opts = {}) + order = opts.fetch(:order, :max) + if [:min, :low].include?(order) + @queue = java.util.PriorityQueue.new(11) # 11 is the default initial capacity + else + @queue = java.util.PriorityQueue.new(11, java.util.Collections.reverseOrder()) + end + end + + # @!macro priority_queue_method_clear + def clear + @queue.clear + true + end + + # @!macro priority_queue_method_delete + def delete(item) + found = false + while @queue.remove(item) do + found = true + end + found + end + + # @!macro priority_queue_method_empty + def empty? + @queue.size == 0 + end + + # @!macro priority_queue_method_include + def include?(item) + @queue.contains(item) + end + alias_method :has_priority?, :include? + + # @!macro priority_queue_method_length + def length + @queue.size + end + alias_method :size, :length + + # @!macro priority_queue_method_peek + def peek + @queue.peek + end + + # @!macro priority_queue_method_pop + def pop + @queue.poll + end + alias_method :deq, :pop + alias_method :shift, :pop + + # @!macro priority_queue_method_push + def push(item) + raise ArgumentError.new('cannot enqueue nil') if item.nil? + @queue.add(item) + end + alias_method :<<, :push + alias_method :enq, :push + + # @!macro priority_queue_method_from_list + def self.from_list(list, opts = {}) + queue = new(opts) + list.each{|item| queue << item } + queue + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb new file mode 100644 index 000000000000..d003d3cf7317 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb @@ -0,0 +1,158 @@ +module Concurrent + + # @!macro warn.edge + class LockFreeStack < Synchronization::Object + + safe_initialization! + + class Node + # TODO (pitr-ch 20-Dec-2016): Could be unified with Stack class? + + # @return [Node] + attr_reader :next_node + + # @return [Object] + attr_reader :value + + # @!visibility private + # allow to nil-ify to free GC when the entry is no longer relevant, not synchronised + attr_writer :value + + def initialize(value, next_node) + @value = value + @next_node = next_node + end + + singleton_class.send :alias_method, :[], :new + end + + # The singleton for empty node + EMPTY = Node[nil, nil] + def EMPTY.next_node + self + end + + attr_atomic(:head) + private :head, :head=, :swap_head, :compare_and_set_head, :update_head + + # @!visibility private + def self.of1(value) + new Node[value, EMPTY] + end + + # @!visibility private + def self.of2(value1, value2) + new Node[value1, Node[value2, EMPTY]] + end + + # @param [Node] head + def initialize(head = EMPTY) + super() + self.head = head + end + + # @param [Node] head + # @return [true, false] + def empty?(head = head()) + head.equal? EMPTY + end + + # @param [Node] head + # @param [Object] value + # @return [true, false] + def compare_and_push(head, value) + compare_and_set_head head, Node[value, head] + end + + # @param [Object] value + # @return [self] + def push(value) + while true + current_head = head + return self if compare_and_set_head current_head, Node[value, current_head] + end + end + + # @return [Node] + def peek + head + end + + # @param [Node] head + # @return [true, false] + def compare_and_pop(head) + compare_and_set_head head, head.next_node + end + + # @return [Object] + def pop + while true + current_head = head + return current_head.value if compare_and_set_head current_head, current_head.next_node + end + end + + # @param [Node] head + # @return [true, false] + def compare_and_clear(head) + compare_and_set_head head, EMPTY + end + + include Enumerable + + # @param [Node] head + # @return [self] + def each(head = nil) + return to_enum(:each, head) unless block_given? + it = head || peek + until it.equal?(EMPTY) + yield it.value + it = it.next_node + end + self + end + + # @return [true, false] + def clear + while true + current_head = head + return false if current_head == EMPTY + return true if compare_and_set_head current_head, EMPTY + end + end + + # @param [Node] head + # @return [true, false] + def clear_if(head) + compare_and_set_head head, EMPTY + end + + # @param [Node] head + # @param [Node] new_head + # @return [true, false] + def replace_if(head, new_head) + compare_and_set_head head, new_head + end + + # @return [self] + # @yield over the cleared stack + # @yieldparam [Object] value + def clear_each(&block) + while true + current_head = head + return self if current_head == EMPTY + if compare_and_set_head current_head, EMPTY + each current_head, &block + return self + end + end + end + + # @return [String] Short string representation. + def to_s + format '%s %s>', super[0..-2], to_a.to_s + end + + alias_method :inspect, :to_s + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb new file mode 100644 index 000000000000..dc5189389da3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/atomic_reference_map_backend.rb @@ -0,0 +1,927 @@ +require 'concurrent/constants' +require 'concurrent/thread_safe/util' +require 'concurrent/thread_safe/util/adder' +require 'concurrent/thread_safe/util/cheap_lockable' +require 'concurrent/thread_safe/util/power_of_two_tuple' +require 'concurrent/thread_safe/util/volatile' +require 'concurrent/thread_safe/util/xor_shift_random' + +module Concurrent + + # @!visibility private + module Collection + + # A Ruby port of the Doug Lea's jsr166e.ConcurrentHashMapV8 class version 1.59 + # available in public domain. + # + # Original source code available here: + # http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/ConcurrentHashMapV8.java?revision=1.59 + # + # The Ruby port skips out the +TreeBin+ (red-black trees for use in bins whose + # size exceeds a threshold). + # + # A hash table supporting full concurrency of retrievals and high expected + # concurrency for updates. However, even though all operations are + # thread-safe, retrieval operations do _not_ entail locking, and there is + # _not_ any support for locking the entire table in a way that prevents all + # access. + # + # Retrieval operations generally do not block, so may overlap with update + # operations. Retrievals reflect the results of the most recently _completed_ + # update operations holding upon their onset. (More formally, an update + # operation for a given key bears a _happens-before_ relation with any (non + # +nil+) retrieval for that key reporting the updated value.) For aggregate + # operations such as +clear()+, concurrent retrievals may reflect insertion or + # removal of only some entries. Similarly, the +each_pair+ iterator yields + # elements reflecting the state of the hash table at some point at or since + # the start of the +each_pair+. Bear in mind that the results of aggregate + # status methods including +size()+ and +empty?+} are typically useful only + # when a map is not undergoing concurrent updates in other threads. Otherwise + # the results of these methods reflect transient states that may be adequate + # for monitoring or estimation purposes, but not for program control. + # + # The table is dynamically expanded when there are too many collisions (i.e., + # keys that have distinct hash codes but fall into the same slot modulo the + # table size), with the expected average effect of maintaining roughly two + # bins per mapping (corresponding to a 0.75 load factor threshold for + # resizing). There may be much variance around this average as mappings are + # added and removed, but overall, this maintains a commonly accepted + # time/space tradeoff for hash tables. However, resizing this or any other + # kind of hash table may be a relatively slow operation. When possible, it is + # a good idea to provide a size estimate as an optional :initial_capacity + # initializer argument. An additional optional :load_factor constructor + # argument provides a further means of customizing initial table capacity by + # specifying the table density to be used in calculating the amount of space + # to allocate for the given number of elements. Note that using many keys with + # exactly the same +hash+ is a sure way to slow down performance of any hash + # table. + # + # ## Design overview + # + # The primary design goal of this hash table is to maintain concurrent + # readability (typically method +[]+, but also iteration and related methods) + # while minimizing update contention. Secondary goals are to keep space + # consumption about the same or better than plain +Hash+, and to support high + # initial insertion rates on an empty table by many threads. + # + # Each key-value mapping is held in a +Node+. The validation-based approach + # explained below leads to a lot of code sprawl because retry-control + # precludes factoring into smaller methods. + # + # The table is lazily initialized to a power-of-two size upon the first + # insertion. Each bin in the table normally contains a list of +Node+s (most + # often, the list has only zero or one +Node+). Table accesses require + # volatile/atomic reads, writes, and CASes. The lists of nodes within bins are + # always accurately traversable under volatile reads, so long as lookups check + # hash code and non-nullness of value before checking key equality. + # + # We use the top two bits of +Node+ hash fields for control purposes -- they + # are available anyway because of addressing constraints. As explained further + # below, these top bits are used as follows: + # + # - 00 - Normal + # - 01 - Locked + # - 11 - Locked and may have a thread waiting for lock + # - 10 - +Node+ is a forwarding node + # + # The lower 28 bits of each +Node+'s hash field contain a the key's hash code, + # except for forwarding nodes, for which the lower bits are zero (and so + # always have hash field == +MOVED+). + # + # Insertion (via +[]=+ or its variants) of the first node in an empty bin is + # performed by just CASing it to the bin. This is by far the most common case + # for put operations under most key/hash distributions. Other update + # operations (insert, delete, and replace) require locks. We do not want to + # waste the space required to associate a distinct lock object with each bin, + # so instead use the first node of a bin list itself as a lock. Blocking + # support for these locks relies +Concurrent::ThreadSafe::Util::CheapLockable. However, we also need a + # +try_lock+ construction, so we overlay these by using bits of the +Node+ + # hash field for lock control (see above), and so normally use builtin + # monitors only for blocking and signalling using + # +cheap_wait+/+cheap_broadcast+ constructions. See +Node#try_await_lock+. + # + # Using the first node of a list as a lock does not by itself suffice though: + # When a node is locked, any update must first validate that it is still the + # first node after locking it, and retry if not. Because new nodes are always + # appended to lists, once a node is first in a bin, it remains first until + # deleted or the bin becomes invalidated (upon resizing). However, operations + # that only conditionally update may inspect nodes until the point of update. + # This is a converse of sorts to the lazy locking technique described by + # Herlihy & Shavit. + # + # The main disadvantage of per-bin locks is that other update operations on + # other nodes in a bin list protected by the same lock can stall, for example + # when user +eql?+ or mapping functions take a long time. However, + # statistically, under random hash codes, this is not a common problem. + # Ideally, the frequency of nodes in bins follows a Poisson distribution + # (http://en.wikipedia.org/wiki/Poisson_distribution) with a parameter of + # about 0.5 on average, given the resizing threshold of 0.75, although with a + # large variance because of resizing granularity. Ignoring variance, the + # expected occurrences of list size k are (exp(-0.5) * pow(0.5, k) / + # factorial(k)). The first values are: + # + # - 0: 0.60653066 + # - 1: 0.30326533 + # - 2: 0.07581633 + # - 3: 0.01263606 + # - 4: 0.00157952 + # - 5: 0.00015795 + # - 6: 0.00001316 + # - 7: 0.00000094 + # - 8: 0.00000006 + # - more: less than 1 in ten million + # + # Lock contention probability for two threads accessing distinct elements is + # roughly 1 / (8 * #elements) under random hashes. + # + # The table is resized when occupancy exceeds a percentage threshold + # (nominally, 0.75, but see below). Only a single thread performs the resize + # (using field +size_control+, to arrange exclusion), but the table otherwise + # remains usable for reads and updates. Resizing proceeds by transferring + # bins, one by one, from the table to the next table. Because we are using + # power-of-two expansion, the elements from each bin must either stay at same + # index, or move with a power of two offset. We eliminate unnecessary node + # creation by catching cases where old nodes can be reused because their next + # fields won't change. On average, only about one-sixth of them need cloning + # when a table doubles. The nodes they replace will be garbage collectable as + # soon as they are no longer referenced by any reader thread that may be in + # the midst of concurrently traversing table. Upon transfer, the old table bin + # contains only a special forwarding node (with hash field +MOVED+) that + # contains the next table as its key. On encountering a forwarding node, + # access and update operations restart, using the new table. + # + # Each bin transfer requires its bin lock. However, unlike other cases, a + # transfer can skip a bin if it fails to acquire its lock, and revisit it + # later. Method +rebuild+ maintains a buffer of TRANSFER_BUFFER_SIZE bins that + # have been skipped because of failure to acquire a lock, and blocks only if + # none are available (i.e., only very rarely). The transfer operation must + # also ensure that all accessible bins in both the old and new table are + # usable by any traversal. When there are no lock acquisition failures, this + # is arranged simply by proceeding from the last bin (+table.size - 1+) up + # towards the first. Upon seeing a forwarding node, traversals arrange to move + # to the new table without revisiting nodes. However, when any node is skipped + # during a transfer, all earlier table bins may have become visible, so are + # initialized with a reverse-forwarding node back to the old table until the + # new ones are established. (This sometimes requires transiently locking a + # forwarding node, which is possible under the above encoding.) These more + # expensive mechanics trigger only when necessary. + # + # The traversal scheme also applies to partial traversals of + # ranges of bins (via an alternate Traverser constructor) + # to support partitioned aggregate operations. Also, read-only + # operations give up if ever forwarded to a null table, which + # provides support for shutdown-style clearing, which is also not + # currently implemented. + # + # Lazy table initialization minimizes footprint until first use. + # + # The element count is maintained using a +Concurrent::ThreadSafe::Util::Adder+, + # which avoids contention on updates but can encounter cache thrashing + # if read too frequently during concurrent access. To avoid reading so + # often, resizing is attempted either when a bin lock is + # contended, or upon adding to a bin already holding two or more + # nodes (checked before adding in the +x_if_absent+ methods, after + # adding in others). Under uniform hash distributions, the + # probability of this occurring at threshold is around 13%, + # meaning that only about 1 in 8 puts check threshold (and after + # resizing, many fewer do so). But this approximation has high + # variance for small table sizes, so we check on any collision + # for sizes <= 64. The bulk putAll operation further reduces + # contention by only committing count updates upon these size + # checks. + # + # @!visibility private + class AtomicReferenceMapBackend + + # @!visibility private + class Table < Concurrent::ThreadSafe::Util::PowerOfTwoTuple + def cas_new_node(i, hash, key, value) + cas(i, nil, Node.new(hash, key, value)) + end + + def try_to_cas_in_computed(i, hash, key) + succeeded = false + new_value = nil + new_node = Node.new(locked_hash = hash | LOCKED, key, NULL) + if cas(i, nil, new_node) + begin + if NULL == (new_value = yield(NULL)) + was_null = true + else + new_node.value = new_value + end + succeeded = true + ensure + volatile_set(i, nil) if !succeeded || was_null + new_node.unlock_via_hash(locked_hash, hash) + end + end + return succeeded, new_value + end + + def try_lock_via_hash(i, node, node_hash) + node.try_lock_via_hash(node_hash) do + yield if volatile_get(i) == node + end + end + + def delete_node_at(i, node, predecessor_node) + if predecessor_node + predecessor_node.next = node.next + else + volatile_set(i, node.next) + end + end + end + + # Key-value entry. Nodes with a hash field of +MOVED+ are special, and do + # not contain user keys or values. Otherwise, keys are never +nil+, and + # +NULL+ +value+ fields indicate that a node is in the process of being + # deleted or created. For purposes of read-only access, a key may be read + # before a value, but can only be used after checking value to be +!= NULL+. + # + # @!visibility private + class Node + extend Concurrent::ThreadSafe::Util::Volatile + attr_volatile :hash, :value, :next + + include Concurrent::ThreadSafe::Util::CheapLockable + + bit_shift = Concurrent::ThreadSafe::Util::FIXNUM_BIT_SIZE - 2 # need 2 bits for ourselves + # Encodings for special uses of Node hash fields. See above for explanation. + MOVED = ('10' << ('0' * bit_shift)).to_i(2) # hash field for forwarding nodes + LOCKED = ('01' << ('0' * bit_shift)).to_i(2) # set/tested only as a bit + WAITING = ('11' << ('0' * bit_shift)).to_i(2) # both bits set/tested together + HASH_BITS = ('00' << ('1' * bit_shift)).to_i(2) # usable bits of normal node hash + + SPIN_LOCK_ATTEMPTS = Concurrent::ThreadSafe::Util::CPU_COUNT > 1 ? Concurrent::ThreadSafe::Util::CPU_COUNT * 2 : 0 + + attr_reader :key + + def initialize(hash, key, value, next_node = nil) + super() + @key = key + self.lazy_set_hash(hash) + self.lazy_set_value(value) + self.next = next_node + end + + # Spins a while if +LOCKED+ bit set and this node is the first of its bin, + # and then sets +WAITING+ bits on hash field and blocks (once) if they are + # still set. It is OK for this method to return even if lock is not + # available upon exit, which enables these simple single-wait mechanics. + # + # The corresponding signalling operation is performed within callers: Upon + # detecting that +WAITING+ has been set when unlocking lock (via a failed + # CAS from non-waiting +LOCKED+ state), unlockers acquire the + # +cheap_synchronize+ lock and perform a +cheap_broadcast+. + def try_await_lock(table, i) + if table && i >= 0 && i < table.size # bounds check, TODO: why are we bounds checking? + spins = SPIN_LOCK_ATTEMPTS + randomizer = base_randomizer = Concurrent::ThreadSafe::Util::XorShiftRandom.get + while equal?(table.volatile_get(i)) && self.class.locked_hash?(my_hash = hash) + if spins >= 0 + if (randomizer = (randomizer >> 1)).even? # spin at random + if (spins -= 1) == 0 + Thread.pass # yield before blocking + else + randomizer = base_randomizer = Concurrent::ThreadSafe::Util::XorShiftRandom.xorshift(base_randomizer) if randomizer.zero? + end + end + elsif cas_hash(my_hash, my_hash | WAITING) + force_acquire_lock(table, i) + break + end + end + end + end + + def key?(key) + @key.eql?(key) + end + + def matches?(key, hash) + pure_hash == hash && key?(key) + end + + def pure_hash + hash & HASH_BITS + end + + def try_lock_via_hash(node_hash = hash) + if cas_hash(node_hash, locked_hash = node_hash | LOCKED) + begin + yield + ensure + unlock_via_hash(locked_hash, node_hash) + end + end + end + + def locked? + self.class.locked_hash?(hash) + end + + def unlock_via_hash(locked_hash, node_hash) + unless cas_hash(locked_hash, node_hash) + self.hash = node_hash + cheap_synchronize { cheap_broadcast } + end + end + + private + def force_acquire_lock(table, i) + cheap_synchronize do + if equal?(table.volatile_get(i)) && (hash & WAITING) == WAITING + cheap_wait + else + cheap_broadcast # possibly won race vs signaller + end + end + end + + class << self + def locked_hash?(hash) + (hash & LOCKED) != 0 + end + end + end + + # shorthands + MOVED = Node::MOVED + LOCKED = Node::LOCKED + WAITING = Node::WAITING + HASH_BITS = Node::HASH_BITS + + NOW_RESIZING = -1 + DEFAULT_CAPACITY = 16 + MAX_CAPACITY = Concurrent::ThreadSafe::Util::MAX_INT + + # The buffer size for skipped bins during transfers. The + # value is arbitrary but should be large enough to avoid + # most locking stalls during resizes. + TRANSFER_BUFFER_SIZE = 32 + + extend Concurrent::ThreadSafe::Util::Volatile + attr_volatile :table, # The array of bins. Lazily initialized upon first insertion. Size is always a power of two. + + # Table initialization and resizing control. When negative, the + # table is being initialized or resized. Otherwise, when table is + # null, holds the initial table size to use upon creation, or 0 + # for default. After initialization, holds the next element count + # value upon which to resize the table. + :size_control + + def initialize(options = nil) + super() + @counter = Concurrent::ThreadSafe::Util::Adder.new + initial_capacity = options && options[:initial_capacity] || DEFAULT_CAPACITY + self.size_control = (capacity = table_size_for(initial_capacity)) > MAX_CAPACITY ? MAX_CAPACITY : capacity + end + + def get_or_default(key, else_value = nil) + hash = key_hash(key) + current_table = table + while current_table + node = current_table.volatile_get_by_hash(hash) + current_table = + while node + if (node_hash = node.hash) == MOVED + break node.key + elsif (node_hash & HASH_BITS) == hash && node.key?(key) && NULL != (value = node.value) + return value + end + node = node.next + end + end + else_value + end + + def [](key) + get_or_default(key) + end + + def key?(key) + get_or_default(key, NULL) != NULL + end + + def []=(key, value) + get_and_set(key, value) + value + end + + def compute_if_absent(key) + hash = key_hash(key) + current_table = table || initialize_table + while true + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + succeeded, new_value = current_table.try_to_cas_in_computed(i, hash, key) { yield } + if succeeded + increment_size + return new_value + end + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif NULL != (current_value = find_value_in_node_list(node, key, hash, node_hash & HASH_BITS)) + return current_value + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, value = attempt_internal_compute_if_absent(key, hash, current_table, i, node, node_hash) { yield } + return value if succeeded + end + end + end + + def compute_if_present(key) + new_value = nil + internal_replace(key) do |old_value| + if (new_value = yield(NULL == old_value ? nil : old_value)).nil? + NULL + else + new_value + end + end + new_value + end + + def compute(key) + internal_compute(key) do |old_value| + if (new_value = yield(NULL == old_value ? nil : old_value)).nil? + NULL + else + new_value + end + end + end + + def merge_pair(key, value) + internal_compute(key) do |old_value| + if NULL == old_value || !(value = yield(old_value)).nil? + value + else + NULL + end + end + end + + def replace_pair(key, old_value, new_value) + NULL != internal_replace(key, old_value) { new_value } + end + + def replace_if_exists(key, new_value) + if (result = internal_replace(key) { new_value }) && NULL != result + result + end + end + + def get_and_set(key, value) # internalPut in the original CHMV8 + hash = key_hash(key) + current_table = table || initialize_table + while true + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + if current_table.cas_new_node(i, hash, key, value) + increment_size + break + end + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, old_value = attempt_get_and_set(key, value, hash, current_table, i, node, node_hash) + break old_value if succeeded + end + end + end + + def delete(key) + replace_if_exists(key, NULL) + end + + def delete_pair(key, value) + result = internal_replace(key, value) { NULL } + if result && NULL != result + !!result + else + false + end + end + + def each_pair + return self unless current_table = table + current_table_size = base_size = current_table.size + i = base_index = 0 + while base_index < base_size + if node = current_table.volatile_get(i) + if node.hash == MOVED + current_table = node.key + current_table_size = current_table.size + else + begin + if NULL != (value = node.value) # skip deleted or special nodes + yield node.key, value + end + end while node = node.next + end + end + + if (i_with_base = i + base_size) < current_table_size + i = i_with_base # visit upper slots if present + else + i = base_index += 1 + end + end + self + end + + def size + (sum = @counter.sum) < 0 ? 0 : sum # ignore transient negative values + end + + def empty? + size == 0 + end + + # Implementation for clear. Steps through each bin, removing all nodes. + def clear + return self unless current_table = table + current_table_size = current_table.size + deleted_count = i = 0 + while i < current_table_size + if !(node = current_table.volatile_get(i)) + i += 1 + elsif (node_hash = node.hash) == MOVED + current_table = node.key + current_table_size = current_table.size + elsif Node.locked_hash?(node_hash) + decrement_size(deleted_count) # opportunistically update count + deleted_count = 0 + node.try_await_lock(current_table, i) + else + current_table.try_lock_via_hash(i, node, node_hash) do + begin + deleted_count += 1 if NULL != node.value # recheck under lock + node.value = nil + end while node = node.next + current_table.volatile_set(i, nil) + i += 1 + end + end + end + decrement_size(deleted_count) + self + end + + private + # Internal versions of the insertion methods, each a + # little more complicated than the last. All have + # the same basic structure: + # 1. If table uninitialized, create + # 2. If bin empty, try to CAS new node + # 3. If bin stale, use new table + # 4. Lock and validate; if valid, scan and add or update + # + # The others interweave other checks and/or alternative actions: + # * Plain +get_and_set+ checks for and performs resize after insertion. + # * compute_if_absent prescans for mapping without lock (and fails to add + # if present), which also makes pre-emptive resize checks worthwhile. + # + # Someday when details settle down a bit more, it might be worth + # some factoring to reduce sprawl. + def internal_replace(key, expected_old_value = NULL, &block) + hash = key_hash(key) + current_table = table + while current_table + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + break + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif (node_hash & HASH_BITS) != hash && !node.next # precheck + break # rules out possible existence + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, old_value = attempt_internal_replace(key, expected_old_value, hash, current_table, i, node, node_hash, &block) + return old_value if succeeded + end + end + NULL + end + + def attempt_internal_replace(key, expected_old_value, hash, current_table, i, node, node_hash) + current_table.try_lock_via_hash(i, node, node_hash) do + predecessor_node = nil + old_value = NULL + begin + if node.matches?(key, hash) && NULL != (current_value = node.value) + if NULL == expected_old_value || expected_old_value == current_value # NULL == expected_old_value means whatever value + old_value = current_value + if NULL == (node.value = yield(old_value)) + current_table.delete_node_at(i, node, predecessor_node) + decrement_size + end + end + break + end + + predecessor_node = node + end while node = node.next + + return true, old_value + end + end + + def find_value_in_node_list(node, key, hash, pure_hash) + do_check_for_resize = false + while true + if pure_hash == hash && node.key?(key) && NULL != (value = node.value) + return value + elsif node = node.next + do_check_for_resize = true # at least 2 nodes -> check for resize + pure_hash = node.pure_hash + else + return NULL + end + end + ensure + check_for_resize if do_check_for_resize + end + + def internal_compute(key, &block) + hash = key_hash(key) + current_table = table || initialize_table + while true + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + succeeded, new_value = current_table.try_to_cas_in_computed(i, hash, key, &block) + if succeeded + if NULL == new_value + break nil + else + increment_size + break new_value + end + end + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, new_value = attempt_compute(key, hash, current_table, i, node, node_hash, &block) + break new_value if succeeded + end + end + end + + def attempt_internal_compute_if_absent(key, hash, current_table, i, node, node_hash) + added = false + current_table.try_lock_via_hash(i, node, node_hash) do + while true + if node.matches?(key, hash) && NULL != (value = node.value) + return true, value + end + last = node + unless node = node.next + last.next = Node.new(hash, key, value = yield) + added = true + increment_size + return true, value + end + end + end + ensure + check_for_resize if added + end + + def attempt_compute(key, hash, current_table, i, node, node_hash) + added = false + current_table.try_lock_via_hash(i, node, node_hash) do + predecessor_node = nil + while true + if node.matches?(key, hash) && NULL != (value = node.value) + if NULL == (node.value = value = yield(value)) + current_table.delete_node_at(i, node, predecessor_node) + decrement_size + value = nil + end + return true, value + end + predecessor_node = node + unless node = node.next + if NULL == (value = yield(NULL)) + value = nil + else + predecessor_node.next = Node.new(hash, key, value) + added = true + increment_size + end + return true, value + end + end + end + ensure + check_for_resize if added + end + + def attempt_get_and_set(key, value, hash, current_table, i, node, node_hash) + node_nesting = nil + current_table.try_lock_via_hash(i, node, node_hash) do + node_nesting = 1 + old_value = nil + found_old_value = false + while node + if node.matches?(key, hash) && NULL != (old_value = node.value) + found_old_value = true + node.value = value + break + end + last = node + unless node = node.next + last.next = Node.new(hash, key, value) + break + end + node_nesting += 1 + end + + return true, old_value if found_old_value + increment_size + true + end + ensure + check_for_resize if node_nesting && (node_nesting > 1 || current_table.size <= 64) + end + + def initialize_copy(other) + super + @counter = Concurrent::ThreadSafe::Util::Adder.new + self.table = nil + self.size_control = (other_table = other.table) ? other_table.size : DEFAULT_CAPACITY + self + end + + def try_await_lock(current_table, i, node) + check_for_resize # try resizing if can't get lock + node.try_await_lock(current_table, i) + end + + def key_hash(key) + key.hash & HASH_BITS + end + + # Returns a power of two table size for the given desired capacity. + def table_size_for(entry_count) + size = 2 + size <<= 1 while size < entry_count + size + end + + # Initializes table, using the size recorded in +size_control+. + def initialize_table + until current_table ||= table + if (size_ctrl = size_control) == NOW_RESIZING + Thread.pass # lost initialization race; just spin + else + try_in_resize_lock(current_table, size_ctrl) do + initial_size = size_ctrl > 0 ? size_ctrl : DEFAULT_CAPACITY + current_table = self.table = Table.new(initial_size) + initial_size - (initial_size >> 2) # 75% load factor + end + end + end + current_table + end + + # If table is too small and not already resizing, creates next table and + # transfers bins. Rechecks occupancy after a transfer to see if another + # resize is already needed because resizings are lagging additions. + def check_for_resize + while (current_table = table) && MAX_CAPACITY > (table_size = current_table.size) && NOW_RESIZING != (size_ctrl = size_control) && size_ctrl < @counter.sum + try_in_resize_lock(current_table, size_ctrl) do + self.table = rebuild(current_table) + (table_size << 1) - (table_size >> 1) # 75% load factor + end + end + end + + def try_in_resize_lock(current_table, size_ctrl) + if cas_size_control(size_ctrl, NOW_RESIZING) + begin + if current_table == table # recheck under lock + size_ctrl = yield # get new size_control + end + ensure + self.size_control = size_ctrl + end + end + end + + # Moves and/or copies the nodes in each bin to new table. See above for explanation. + def rebuild(table) + old_table_size = table.size + new_table = table.next_in_size_table + # puts "#{old_table_size} -> #{new_table.size}" + forwarder = Node.new(MOVED, new_table, NULL) + rev_forwarder = nil + locked_indexes = nil # holds bins to revisit; nil until needed + locked_arr_idx = 0 + bin = old_table_size - 1 + i = bin + while true + if !(node = table.volatile_get(i)) + # no lock needed (or available) if bin >= 0, because we're not popping values from locked_indexes until we've run through the whole table + redo unless (bin >= 0 ? table.cas(i, nil, forwarder) : lock_and_clean_up_reverse_forwarders(table, old_table_size, new_table, i, forwarder)) + elsif Node.locked_hash?(node_hash = node.hash) + locked_indexes ||= ::Array.new + if bin < 0 && locked_arr_idx > 0 + locked_arr_idx -= 1 + i, locked_indexes[locked_arr_idx] = locked_indexes[locked_arr_idx], i # swap with another bin + redo + end + if bin < 0 || locked_indexes.size >= TRANSFER_BUFFER_SIZE + node.try_await_lock(table, i) # no other options -- block + redo + end + rev_forwarder ||= Node.new(MOVED, table, NULL) + redo unless table.volatile_get(i) == node && node.locked? # recheck before adding to list + locked_indexes << i + new_table.volatile_set(i, rev_forwarder) + new_table.volatile_set(i + old_table_size, rev_forwarder) + else + redo unless split_old_bin(table, new_table, i, node, node_hash, forwarder) + end + + if bin > 0 + i = (bin -= 1) + elsif locked_indexes && !locked_indexes.empty? + bin = -1 + i = locked_indexes.pop + locked_arr_idx = locked_indexes.size - 1 + else + return new_table + end + end + end + + def lock_and_clean_up_reverse_forwarders(old_table, old_table_size, new_table, i, forwarder) + # transiently use a locked forwarding node + locked_forwarder = Node.new(moved_locked_hash = MOVED | LOCKED, new_table, NULL) + if old_table.cas(i, nil, locked_forwarder) + new_table.volatile_set(i, nil) # kill the potential reverse forwarders + new_table.volatile_set(i + old_table_size, nil) # kill the potential reverse forwarders + old_table.volatile_set(i, forwarder) + locked_forwarder.unlock_via_hash(moved_locked_hash, MOVED) + true + end + end + + # Splits a normal bin with list headed by e into lo and hi parts; installs in given table. + def split_old_bin(table, new_table, i, node, node_hash, forwarder) + table.try_lock_via_hash(i, node, node_hash) do + split_bin(new_table, i, node, node_hash) + table.volatile_set(i, forwarder) + end + end + + def split_bin(new_table, i, node, node_hash) + bit = new_table.size >> 1 # bit to split on + run_bit = node_hash & bit + last_run = nil + low = nil + high = nil + current_node = node + # this optimises for the lowest amount of volatile writes and objects created + while current_node = current_node.next + unless (b = current_node.hash & bit) == run_bit + run_bit = b + last_run = current_node + end + end + if run_bit == 0 + low = last_run + else + high = last_run + end + current_node = node + until current_node == last_run + pure_hash = current_node.pure_hash + if (pure_hash & bit) == 0 + low = Node.new(pure_hash, current_node.key, current_node.value, low) + else + high = Node.new(pure_hash, current_node.key, current_node.value, high) + end + current_node = current_node.next + end + new_table.volatile_set(i, low) + new_table.volatile_set(i + bit, high) + end + + def increment_size + @counter.increment + end + + def decrement_size(by = 1) + @counter.add(-by) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb new file mode 100644 index 000000000000..903c1f2f470a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/mri_map_backend.rb @@ -0,0 +1,66 @@ +require 'thread' +require 'concurrent/collection/map/non_concurrent_map_backend' + +module Concurrent + + # @!visibility private + module Collection + + # @!visibility private + class MriMapBackend < NonConcurrentMapBackend + + def initialize(options = nil) + super(options) + @write_lock = Mutex.new + end + + def []=(key, value) + @write_lock.synchronize { super } + end + + def compute_if_absent(key) + if NULL != (stored_value = @backend.fetch(key, NULL)) # fast non-blocking path for the most likely case + stored_value + else + @write_lock.synchronize { super } + end + end + + def compute_if_present(key) + @write_lock.synchronize { super } + end + + def compute(key) + @write_lock.synchronize { super } + end + + def merge_pair(key, value) + @write_lock.synchronize { super } + end + + def replace_pair(key, old_value, new_value) + @write_lock.synchronize { super } + end + + def replace_if_exists(key, new_value) + @write_lock.synchronize { super } + end + + def get_and_set(key, value) + @write_lock.synchronize { super } + end + + def delete(key) + @write_lock.synchronize { super } + end + + def delete_pair(key, value) + @write_lock.synchronize { super } + end + + def clear + @write_lock.synchronize { super } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb new file mode 100644 index 000000000000..e7c62e6d1909 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/non_concurrent_map_backend.rb @@ -0,0 +1,140 @@ +require 'concurrent/constants' + +module Concurrent + + # @!visibility private + module Collection + + # @!visibility private + class NonConcurrentMapBackend + + # WARNING: all public methods of the class must operate on the @backend + # directly without calling each other. This is important because of the + # SynchronizedMapBackend which uses a non-reentrant mutex for performance + # reasons. + def initialize(options = nil) + @backend = {} + end + + def [](key) + @backend[key] + end + + def []=(key, value) + @backend[key] = value + end + + def compute_if_absent(key) + if NULL != (stored_value = @backend.fetch(key, NULL)) + stored_value + else + @backend[key] = yield + end + end + + def replace_pair(key, old_value, new_value) + if pair?(key, old_value) + @backend[key] = new_value + true + else + false + end + end + + def replace_if_exists(key, new_value) + if NULL != (stored_value = @backend.fetch(key, NULL)) + @backend[key] = new_value + stored_value + end + end + + def compute_if_present(key) + if NULL != (stored_value = @backend.fetch(key, NULL)) + store_computed_value(key, yield(stored_value)) + end + end + + def compute(key) + store_computed_value(key, yield(@backend[key])) + end + + def merge_pair(key, value) + if NULL == (stored_value = @backend.fetch(key, NULL)) + @backend[key] = value + else + store_computed_value(key, yield(stored_value)) + end + end + + def get_and_set(key, value) + stored_value = @backend[key] + @backend[key] = value + stored_value + end + + def key?(key) + @backend.key?(key) + end + + def delete(key) + @backend.delete(key) + end + + def delete_pair(key, value) + if pair?(key, value) + @backend.delete(key) + true + else + false + end + end + + def clear + @backend.clear + self + end + + def each_pair + dupped_backend.each_pair do |k, v| + yield k, v + end + self + end + + def size + @backend.size + end + + def get_or_default(key, default_value) + @backend.fetch(key, default_value) + end + + alias_method :_get, :[] + alias_method :_set, :[]= + private :_get, :_set + private + def initialize_copy(other) + super + @backend = {} + self + end + + def dupped_backend + @backend.dup + end + + def pair?(key, expected_value) + NULL != (stored_value = @backend.fetch(key, NULL)) && expected_value.equal?(stored_value) + end + + def store_computed_value(key, new_value) + if new_value.nil? + @backend.delete(key) + nil + else + @backend[key] = new_value + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb new file mode 100644 index 000000000000..190c8d98d906 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/map/synchronized_map_backend.rb @@ -0,0 +1,82 @@ +require 'concurrent/collection/map/non_concurrent_map_backend' + +module Concurrent + + # @!visibility private + module Collection + + # @!visibility private + class SynchronizedMapBackend < NonConcurrentMapBackend + + require 'mutex_m' + include Mutex_m + # WARNING: Mutex_m is a non-reentrant lock, so the synchronized methods are + # not allowed to call each other. + + def [](key) + synchronize { super } + end + + def []=(key, value) + synchronize { super } + end + + def compute_if_absent(key) + synchronize { super } + end + + def compute_if_present(key) + synchronize { super } + end + + def compute(key) + synchronize { super } + end + + def merge_pair(key, value) + synchronize { super } + end + + def replace_pair(key, old_value, new_value) + synchronize { super } + end + + def replace_if_exists(key, new_value) + synchronize { super } + end + + def get_and_set(key, value) + synchronize { super } + end + + def key?(key) + synchronize { super } + end + + def delete(key) + synchronize { super } + end + + def delete_pair(key, value) + synchronize { super } + end + + def clear + synchronize { super } + end + + def size + synchronize { super } + end + + def get_or_default(key, default_value) + synchronize { super } + end + + private + def dupped_backend + synchronize { super } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/non_concurrent_priority_queue.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/non_concurrent_priority_queue.rb new file mode 100644 index 000000000000..694cd7ac7cde --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/non_concurrent_priority_queue.rb @@ -0,0 +1,143 @@ +require 'concurrent/utility/engine' +require 'concurrent/collection/java_non_concurrent_priority_queue' +require 'concurrent/collection/ruby_non_concurrent_priority_queue' + +module Concurrent + module Collection + + # @!visibility private + # @!macro internal_implementation_note + NonConcurrentPriorityQueueImplementation = case + when Concurrent.on_jruby? + JavaNonConcurrentPriorityQueue + else + RubyNonConcurrentPriorityQueue + end + private_constant :NonConcurrentPriorityQueueImplementation + + # @!macro priority_queue + # + # A queue collection in which the elements are sorted based on their + # comparison (spaceship) operator `<=>`. Items are added to the queue + # at a position relative to their priority. On removal the element + # with the "highest" priority is removed. By default the sort order is + # from highest to lowest, but a lowest-to-highest sort order can be + # set on construction. + # + # The API is based on the `Queue` class from the Ruby standard library. + # + # The pure Ruby implementation, `RubyNonConcurrentPriorityQueue` uses a heap algorithm + # stored in an array. The algorithm is based on the work of Robert Sedgewick + # and Kevin Wayne. + # + # The JRuby native implementation is a thin wrapper around the standard + # library `java.util.NonConcurrentPriorityQueue`. + # + # When running under JRuby the class `NonConcurrentPriorityQueue` extends `JavaNonConcurrentPriorityQueue`. + # When running under all other interpreters it extends `RubyNonConcurrentPriorityQueue`. + # + # @note This implementation is *not* thread safe. + # + # @see http://en.wikipedia.org/wiki/Priority_queue + # @see http://ruby-doc.org/stdlib-2.0.0/libdoc/thread/rdoc/Queue.html + # + # @see http://algs4.cs.princeton.edu/24pq/index.php#2.6 + # @see http://algs4.cs.princeton.edu/24pq/MaxPQ.java.html + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html + # + # @!visibility private + class NonConcurrentPriorityQueue < NonConcurrentPriorityQueueImplementation + + alias_method :has_priority?, :include? + + alias_method :size, :length + + alias_method :deq, :pop + alias_method :shift, :pop + + alias_method :<<, :push + alias_method :enq, :push + + # @!method initialize(opts = {}) + # @!macro priority_queue_method_initialize + # + # Create a new priority queue with no items. + # + # @param [Hash] opts the options for creating the queue + # @option opts [Symbol] :order (:max) dictates the order in which items are + # stored: from highest to lowest when `:max` or `:high`; from lowest to + # highest when `:min` or `:low` + + # @!method clear + # @!macro priority_queue_method_clear + # + # Removes all of the elements from this priority queue. + + # @!method delete(item) + # @!macro priority_queue_method_delete + # + # Deletes all items from `self` that are equal to `item`. + # + # @param [Object] item the item to be removed from the queue + # @return [Object] true if the item is found else false + + # @!method empty? + # @!macro priority_queue_method_empty + # + # Returns `true` if `self` contains no elements. + # + # @return [Boolean] true if there are no items in the queue else false + + # @!method include?(item) + # @!macro priority_queue_method_include + # + # Returns `true` if the given item is present in `self` (that is, if any + # element == `item`), otherwise returns false. + # + # @param [Object] item the item to search for + # + # @return [Boolean] true if the item is found else false + + # @!method length + # @!macro priority_queue_method_length + # + # The current length of the queue. + # + # @return [Fixnum] the number of items in the queue + + # @!method peek + # @!macro priority_queue_method_peek + # + # Retrieves, but does not remove, the head of this queue, or returns `nil` + # if this queue is empty. + # + # @return [Object] the head of the queue or `nil` when empty + + # @!method pop + # @!macro priority_queue_method_pop + # + # Retrieves and removes the head of this queue, or returns `nil` if this + # queue is empty. + # + # @return [Object] the head of the queue or `nil` when empty + + # @!method push(item) + # @!macro priority_queue_method_push + # + # Inserts the specified element into this priority queue. + # + # @param [Object] item the item to insert onto the queue + + # @!method self.from_list(list, opts = {}) + # @!macro priority_queue_method_from_list + # + # Create a new priority queue from the given list. + # + # @param [Enumerable] list the list to build the queue from + # @param [Hash] opts the options for creating the queue + # + # @return [NonConcurrentPriorityQueue] the newly created and populated queue + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb new file mode 100644 index 000000000000..bdf3cba3598d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb @@ -0,0 +1,150 @@ +module Concurrent + module Collection + + # @!macro priority_queue + # + # @!visibility private + # @!macro internal_implementation_note + class RubyNonConcurrentPriorityQueue + + # @!macro priority_queue_method_initialize + def initialize(opts = {}) + order = opts.fetch(:order, :max) + @comparator = [:min, :low].include?(order) ? -1 : 1 + clear + end + + # @!macro priority_queue_method_clear + def clear + @queue = [nil] + @length = 0 + true + end + + # @!macro priority_queue_method_delete + def delete(item) + return false if empty? + original_length = @length + k = 1 + while k <= @length + if @queue[k] == item + swap(k, @length) + @length -= 1 + sink(k) + @queue.pop + else + k += 1 + end + end + @length != original_length + end + + # @!macro priority_queue_method_empty + def empty? + size == 0 + end + + # @!macro priority_queue_method_include + def include?(item) + @queue.include?(item) + end + alias_method :has_priority?, :include? + + # @!macro priority_queue_method_length + def length + @length + end + alias_method :size, :length + + # @!macro priority_queue_method_peek + def peek + empty? ? nil : @queue[1] + end + + # @!macro priority_queue_method_pop + def pop + return nil if empty? + max = @queue[1] + swap(1, @length) + @length -= 1 + sink(1) + @queue.pop + max + end + alias_method :deq, :pop + alias_method :shift, :pop + + # @!macro priority_queue_method_push + def push(item) + raise ArgumentError.new('cannot enqueue nil') if item.nil? + @length += 1 + @queue << item + swim(@length) + true + end + alias_method :<<, :push + alias_method :enq, :push + + # @!macro priority_queue_method_from_list + def self.from_list(list, opts = {}) + queue = new(opts) + list.each{|item| queue << item } + queue + end + + private + + # Exchange the values at the given indexes within the internal array. + # + # @param [Integer] x the first index to swap + # @param [Integer] y the second index to swap + # + # @!visibility private + def swap(x, y) + temp = @queue[x] + @queue[x] = @queue[y] + @queue[y] = temp + end + + # Are the items at the given indexes ordered based on the priority + # order specified at construction? + # + # @param [Integer] x the first index from which to retrieve a comparable value + # @param [Integer] y the second index from which to retrieve a comparable value + # + # @return [Boolean] true if the two elements are in the correct priority order + # else false + # + # @!visibility private + def ordered?(x, y) + (@queue[x] <=> @queue[y]) == @comparator + end + + # Percolate down to maintain heap invariant. + # + # @param [Integer] k the index at which to start the percolation + # + # @!visibility private + def sink(k) + while (j = (2 * k)) <= @length do + j += 1 if j < @length && ! ordered?(j, j+1) + break if ordered?(k, j) + swap(k, j) + k = j + end + end + + # Percolate up to maintain heap invariant. + # + # @param [Integer] k the index at which to start the percolation + # + # @!visibility private + def swim(k) + while k > 1 && ! ordered?(k/2, k) do + swap(k, k/2) + k = k/2 + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/deprecation.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/deprecation.rb new file mode 100644 index 000000000000..35ae4b2c9df6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/deprecation.rb @@ -0,0 +1,34 @@ +require 'concurrent/concern/logging' + +module Concurrent + module Concern + + # @!visibility private + # @!macro internal_implementation_note + module Deprecation + # TODO require additional parameter: a version. Display when it'll be removed based on that. Error if not removed. + include Concern::Logging + + def deprecated(message, strip = 2) + caller_line = caller(strip).first if strip > 0 + klass = if Module === self + self + else + self.class + end + message = if strip > 0 + format("[DEPRECATED] %s\ncalled on: %s", message, caller_line) + else + format('[DEPRECATED] %s', message) + end + log WARN, klass.to_s, message + end + + def deprecated_method(old_name, new_name) + deprecated "`#{old_name}` is deprecated and it'll removed in next release, use `#{new_name}` instead", 3 + end + + extend self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/dereferenceable.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/dereferenceable.rb new file mode 100644 index 000000000000..dc172ba74d93 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/dereferenceable.rb @@ -0,0 +1,73 @@ +module Concurrent + module Concern + + # Object references in Ruby are mutable. This can lead to serious problems when + # the `#value` of a concurrent object is a mutable reference. Which is always the + # case unless the value is a `Fixnum`, `Symbol`, or similar "primitive" data type. + # Most classes in this library that expose a `#value` getter method do so using the + # `Dereferenceable` mixin module. + # + # @!macro copy_options + module Dereferenceable + # NOTE: This module is going away in 2.0. In the mean time we need it to + # play nicely with the synchronization layer. This means that the + # including class SHOULD be synchronized and it MUST implement a + # `#synchronize` method. Not doing so will lead to runtime errors. + + # Return the value this object represents after applying the options specified + # by the `#set_deref_options` method. + # + # @return [Object] the current value of the object + def value + synchronize { apply_deref_options(@value) } + end + alias_method :deref, :value + + protected + + # Set the internal value of this object + # + # @param [Object] value the new value + def value=(value) + synchronize{ @value = value } + end + + # @!macro dereferenceable_set_deref_options + # Set the options which define the operations #value performs before + # returning data to the caller (dereferencing). + # + # @note Most classes that include this module will call `#set_deref_options` + # from within the constructor, thus allowing these options to be set at + # object creation. + # + # @param [Hash] opts the options defining dereference behavior. + # @option opts [String] :dup_on_deref (false) call `#dup` before returning the data + # @option opts [String] :freeze_on_deref (false) call `#freeze` before returning the data + # @option opts [String] :copy_on_deref (nil) call the given `Proc` passing + # the internal value and returning the value returned from the proc + def set_deref_options(opts = {}) + synchronize{ ns_set_deref_options(opts) } + end + + # @!macro dereferenceable_set_deref_options + # @!visibility private + def ns_set_deref_options(opts) + @dup_on_deref = opts[:dup_on_deref] || opts[:dup] + @freeze_on_deref = opts[:freeze_on_deref] || opts[:freeze] + @copy_on_deref = opts[:copy_on_deref] || opts[:copy] + @do_nothing_on_deref = !(@dup_on_deref || @freeze_on_deref || @copy_on_deref) + nil + end + + # @!visibility private + def apply_deref_options(value) + return nil if value.nil? + return value if @do_nothing_on_deref + value = @copy_on_deref.call(value) if @copy_on_deref + value = value.dup if @dup_on_deref + value = value.freeze if @freeze_on_deref + value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/logging.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/logging.rb new file mode 100644 index 000000000000..2c749996f94f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/logging.rb @@ -0,0 +1,32 @@ +require 'logger' + +module Concurrent + module Concern + + # Include where logging is needed + # + # @!visibility private + module Logging + include Logger::Severity + + # Logs through {Concurrent.global_logger}, it can be overridden by setting @logger + # @param [Integer] level one of Logger::Severity constants + # @param [String] progname e.g. a path of an Actor + # @param [String, nil] message when nil block is used to generate the message + # @yieldreturn [String] a message + def log(level, progname, message = nil, &block) + #NOTE: Cannot require 'concurrent/configuration' above due to circular references. + # Assume that the gem has been initialized if we've gotten this far. + logger = if defined?(@logger) && @logger + @logger + else + Concurrent.global_logger + end + logger.call level, progname, message, &block + rescue => error + $stderr.puts "`Concurrent.configuration.logger` failed to log #{[level, progname, message, block]}\n" + + "#{error.message} (#{error.class})\n#{error.backtrace.join "\n"}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/obligation.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/obligation.rb new file mode 100644 index 000000000000..2c9ac1200350 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/obligation.rb @@ -0,0 +1,220 @@ +require 'thread' +require 'timeout' + +require 'concurrent/atomic/event' +require 'concurrent/concern/dereferenceable' + +module Concurrent + module Concern + + module Obligation + include Concern::Dereferenceable + # NOTE: The Dereferenceable module is going away in 2.0. In the mean time + # we need it to place nicely with the synchronization layer. This means + # that the including class SHOULD be synchronized and it MUST implement a + # `#synchronize` method. Not doing so will lead to runtime errors. + + # Has the obligation been fulfilled? + # + # @return [Boolean] + def fulfilled? + state == :fulfilled + end + alias_method :realized?, :fulfilled? + + # Has the obligation been rejected? + # + # @return [Boolean] + def rejected? + state == :rejected + end + + # Is obligation completion still pending? + # + # @return [Boolean] + def pending? + state == :pending + end + + # Is the obligation still unscheduled? + # + # @return [Boolean] + def unscheduled? + state == :unscheduled + end + + # Has the obligation completed processing? + # + # @return [Boolean] + def complete? + [:fulfilled, :rejected].include? state + end + + # Is the obligation still awaiting completion of processing? + # + # @return [Boolean] + def incomplete? + ! complete? + end + + # The current value of the obligation. Will be `nil` while the state is + # pending or the operation has been rejected. + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Object] see Dereferenceable#deref + def value(timeout = nil) + wait timeout + deref + end + + # Wait until obligation is complete or the timeout has been reached. + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Obligation] self + def wait(timeout = nil) + event.wait(timeout) if timeout != 0 && incomplete? + self + end + + # Wait until obligation is complete or the timeout is reached. Will re-raise + # any exceptions raised during processing (but will not raise an exception + # on timeout). + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Obligation] self + # @raise [Exception] raises the reason when rejected + def wait!(timeout = nil) + wait(timeout).tap { raise self if rejected? } + end + alias_method :no_error!, :wait! + + # The current value of the obligation. Will be `nil` while the state is + # pending or the operation has been rejected. Will re-raise any exceptions + # raised during processing (but will not raise an exception on timeout). + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Object] see Dereferenceable#deref + # @raise [Exception] raises the reason when rejected + def value!(timeout = nil) + wait(timeout) + if rejected? + raise self + else + deref + end + end + + # The current state of the obligation. + # + # @return [Symbol] the current state + def state + synchronize { @state } + end + + # If an exception was raised during processing this will return the + # exception object. Will return `nil` when the state is pending or if + # the obligation has been successfully fulfilled. + # + # @return [Exception] the exception raised during processing or `nil` + def reason + synchronize { @reason } + end + + # @example allows Obligation to be risen + # rejected_ivar = Ivar.new.fail + # raise rejected_ivar + def exception(*args) + raise 'obligation is not rejected' unless rejected? + reason.exception(*args) + end + + protected + + # @!visibility private + def get_arguments_from(opts = {}) + [*opts.fetch(:args, [])] + end + + # @!visibility private + def init_obligation + @event = Event.new + @value = @reason = nil + end + + # @!visibility private + def event + @event + end + + # @!visibility private + def set_state(success, value, reason) + if success + @value = value + @state = :fulfilled + else + @reason = reason + @state = :rejected + end + end + + # @!visibility private + def state=(value) + synchronize { ns_set_state(value) } + end + + # Atomic compare and set operation + # State is set to `next_state` only if `current state == expected_current`. + # + # @param [Symbol] next_state + # @param [Symbol] expected_current + # + # @return [Boolean] true is state is changed, false otherwise + # + # @!visibility private + def compare_and_set_state(next_state, *expected_current) + synchronize do + if expected_current.include? @state + @state = next_state + true + else + false + end + end + end + + # Executes the block within mutex if current state is included in expected_states + # + # @return block value if executed, false otherwise + # + # @!visibility private + def if_state(*expected_states) + synchronize do + raise ArgumentError.new('no block given') unless block_given? + + if expected_states.include? @state + yield + else + false + end + end + end + + protected + + # Am I in the current state? + # + # @param [Symbol] expected The state to check against + # @return [Boolean] true if in the expected state else false + # + # @!visibility private + def ns_check_state?(expected) + @state == expected + end + + # @!visibility private + def ns_set_state(value) + @state = value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/observable.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/observable.rb new file mode 100644 index 000000000000..b5132714bfbb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concern/observable.rb @@ -0,0 +1,110 @@ +require 'concurrent/collection/copy_on_notify_observer_set' +require 'concurrent/collection/copy_on_write_observer_set' + +module Concurrent + module Concern + + # The [observer pattern](http://en.wikipedia.org/wiki/Observer_pattern) is one + # of the most useful design patterns. + # + # The workflow is very simple: + # - an `observer` can register itself to a `subject` via a callback + # - many `observers` can be registered to the same `subject` + # - the `subject` notifies all registered observers when its status changes + # - an `observer` can deregister itself when is no more interested to receive + # event notifications + # + # In a single threaded environment the whole pattern is very easy: the + # `subject` can use a simple data structure to manage all its subscribed + # `observer`s and every `observer` can react directly to every event without + # caring about synchronization. + # + # In a multi threaded environment things are more complex. The `subject` must + # synchronize the access to its data structure and to do so currently we're + # using two specialized ObserverSet: {Concurrent::Concern::CopyOnWriteObserverSet} + # and {Concurrent::Concern::CopyOnNotifyObserverSet}. + # + # When implementing and `observer` there's a very important rule to remember: + # **there are no guarantees about the thread that will execute the callback** + # + # Let's take this example + # ``` + # class Observer + # def initialize + # @count = 0 + # end + # + # def update + # @count += 1 + # end + # end + # + # obs = Observer.new + # [obj1, obj2, obj3, obj4].each { |o| o.add_observer(obs) } + # # execute [obj1, obj2, obj3, obj4] + # ``` + # + # `obs` is wrong because the variable `@count` can be accessed by different + # threads at the same time, so it should be synchronized (using either a Mutex + # or an AtomicFixum) + module Observable + + # @!macro observable_add_observer + # + # Adds an observer to this set. If a block is passed, the observer will be + # created by this method and no other params should be passed. + # + # @param [Object] observer the observer to add + # @param [Symbol] func the function to call on the observer during notification. + # Default is :update + # @return [Object] the added observer + def add_observer(observer = nil, func = :update, &block) + observers.add_observer(observer, func, &block) + end + + # As `#add_observer` but can be used for chaining. + # + # @param [Object] observer the observer to add + # @param [Symbol] func the function to call on the observer during notification. + # @return [Observable] self + def with_observer(observer = nil, func = :update, &block) + add_observer(observer, func, &block) + self + end + + # @!macro observable_delete_observer + # + # Remove `observer` as an observer on this object so that it will no + # longer receive notifications. + # + # @param [Object] observer the observer to remove + # @return [Object] the deleted observer + def delete_observer(observer) + observers.delete_observer(observer) + end + + # @!macro observable_delete_observers + # + # Remove all observers associated with this object. + # + # @return [Observable] self + def delete_observers + observers.delete_observers + self + end + + # @!macro observable_count_observers + # + # Return the number of observers associated with this object. + # + # @return [Integer] the observers count + def count_observers + observers.count_observers + end + + protected + + attr_accessor :observers + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concurrent_ruby.jar b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concurrent_ruby.jar new file mode 100644 index 000000000000..5591d22e6d19 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/concurrent_ruby.jar differ diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/configuration.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/configuration.rb new file mode 100644 index 000000000000..a00dc84403ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/configuration.rb @@ -0,0 +1,188 @@ +require 'thread' +require 'concurrent/delay' +require 'concurrent/errors' +require 'concurrent/atomic/atomic_reference' +require 'concurrent/concern/logging' +require 'concurrent/concern/deprecation' +require 'concurrent/executor/immediate_executor' +require 'concurrent/executor/cached_thread_pool' +require 'concurrent/utility/processor_counter' + +module Concurrent + extend Concern::Logging + extend Concern::Deprecation + + autoload :Options, 'concurrent/options' + autoload :TimerSet, 'concurrent/executor/timer_set' + autoload :ThreadPoolExecutor, 'concurrent/executor/thread_pool_executor' + + # @return [Logger] Logger with provided level and output. + def self.create_simple_logger(level = Logger::FATAL, output = $stderr) + # TODO (pitr-ch 24-Dec-2016): figure out why it had to be replaced, stdlogger was deadlocking + lambda do |severity, progname, message = nil, &block| + return false if severity < level + + message = block ? block.call : message + formatted_message = case message + when String + message + when Exception + format "%s (%s)\n%s", + message.message, message.class, (message.backtrace || []).join("\n") + else + message.inspect + end + + output.print format "[%s] %5s -- %s: %s\n", + Time.now.strftime('%Y-%m-%d %H:%M:%S.%L'), + Logger::SEV_LABEL[severity], + progname, + formatted_message + true + end + end + + # Use logger created by #create_simple_logger to log concurrent-ruby messages. + def self.use_simple_logger(level = Logger::FATAL, output = $stderr) + Concurrent.global_logger = create_simple_logger level, output + end + + # @return [Logger] Logger with provided level and output. + # @deprecated + def self.create_stdlib_logger(level = Logger::FATAL, output = $stderr) + logger = Logger.new(output) + logger.level = level + logger.formatter = lambda do |severity, datetime, progname, msg| + formatted_message = case msg + when String + msg + when Exception + format "%s (%s)\n%s", + msg.message, msg.class, (msg.backtrace || []).join("\n") + else + msg.inspect + end + format "[%s] %5s -- %s: %s\n", + datetime.strftime('%Y-%m-%d %H:%M:%S.%L'), + severity, + progname, + formatted_message + end + + lambda do |loglevel, progname, message = nil, &block| + logger.add loglevel, message, progname, &block + end + end + + # Use logger created by #create_stdlib_logger to log concurrent-ruby messages. + # @deprecated + def self.use_stdlib_logger(level = Logger::FATAL, output = $stderr) + Concurrent.global_logger = create_stdlib_logger level, output + end + + # TODO (pitr-ch 27-Dec-2016): remove deadlocking stdlib_logger methods + + # Suppresses all output when used for logging. + NULL_LOGGER = lambda { |level, progname, message = nil, &block| } + + # @!visibility private + GLOBAL_LOGGER = AtomicReference.new(create_simple_logger(Logger::WARN)) + private_constant :GLOBAL_LOGGER + + def self.global_logger + GLOBAL_LOGGER.value + end + + def self.global_logger=(value) + GLOBAL_LOGGER.value = value + end + + # @!visibility private + GLOBAL_FAST_EXECUTOR = Delay.new { Concurrent.new_fast_executor } + private_constant :GLOBAL_FAST_EXECUTOR + + # @!visibility private + GLOBAL_IO_EXECUTOR = Delay.new { Concurrent.new_io_executor } + private_constant :GLOBAL_IO_EXECUTOR + + # @!visibility private + GLOBAL_TIMER_SET = Delay.new { TimerSet.new } + private_constant :GLOBAL_TIMER_SET + + # @!visibility private + GLOBAL_IMMEDIATE_EXECUTOR = ImmediateExecutor.new + private_constant :GLOBAL_IMMEDIATE_EXECUTOR + + # Disables AtExit handlers including pool auto-termination handlers. + # When disabled it will be the application programmer's responsibility + # to ensure that the handlers are shutdown properly prior to application + # exit by calling `AtExit.run` method. + # + # @note this option should be needed only because of `at_exit` ordering + # issues which may arise when running some of the testing frameworks. + # E.g. Minitest's test-suite runs itself in `at_exit` callback which + # executes after the pools are already terminated. Then auto termination + # needs to be disabled and called manually after test-suite ends. + # @note This method should *never* be called + # from within a gem. It should *only* be used from within the main + # application and even then it should be used only when necessary. + # @deprecated Has no effect since it is no longer needed, see https://github.com/ruby-concurrency/concurrent-ruby/pull/841. + # + def self.disable_at_exit_handlers! + deprecated "Method #disable_at_exit_handlers! has no effect since it is no longer needed, see https://github.com/ruby-concurrency/concurrent-ruby/pull/841." + end + + # Global thread pool optimized for short, fast *operations*. + # + # @return [ThreadPoolExecutor] the thread pool + def self.global_fast_executor + GLOBAL_FAST_EXECUTOR.value + end + + # Global thread pool optimized for long, blocking (IO) *tasks*. + # + # @return [ThreadPoolExecutor] the thread pool + def self.global_io_executor + GLOBAL_IO_EXECUTOR.value + end + + def self.global_immediate_executor + GLOBAL_IMMEDIATE_EXECUTOR + end + + # Global thread pool user for global *timers*. + # + # @return [Concurrent::TimerSet] the thread pool + def self.global_timer_set + GLOBAL_TIMER_SET.value + end + + # General access point to global executors. + # @param [Symbol, Executor] executor_identifier symbols: + # - :fast - {Concurrent.global_fast_executor} + # - :io - {Concurrent.global_io_executor} + # - :immediate - {Concurrent.global_immediate_executor} + # @return [Executor] + def self.executor(executor_identifier) + Options.executor(executor_identifier) + end + + def self.new_fast_executor(opts = {}) + FixedThreadPool.new( + [2, Concurrent.processor_count].max, + auto_terminate: opts.fetch(:auto_terminate, true), + idletime: 60, # 1 minute + max_queue: 0, # unlimited + fallback_policy: :abort, # shouldn't matter -- 0 max queue + name: "fast" + ) + end + + def self.new_io_executor(opts = {}) + CachedThreadPool.new( + auto_terminate: opts.fetch(:auto_terminate, true), + fallback_policy: :abort, # shouldn't matter -- 0 max queue + name: "io" + ) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/constants.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/constants.rb new file mode 100644 index 000000000000..676c2afb9a69 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/constants.rb @@ -0,0 +1,8 @@ +module Concurrent + + # Various classes within allows for +nil+ values to be stored, + # so a special +NULL+ token is required to indicate the "nil-ness". + # @!visibility private + NULL = ::Object.new + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/dataflow.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/dataflow.rb new file mode 100644 index 000000000000..d55f19d850c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/dataflow.rb @@ -0,0 +1,81 @@ +require 'concurrent/future' +require 'concurrent/atomic/atomic_fixnum' + +module Concurrent + + # @!visibility private + class DependencyCounter # :nodoc: + + def initialize(count, &block) + @counter = AtomicFixnum.new(count) + @block = block + end + + def update(time, value, reason) + if @counter.decrement == 0 + @block.call + end + end + end + + # Dataflow allows you to create a task that will be scheduled when all of its data dependencies are available. + # {include:file:docs-source/dataflow.md} + # + # @param [Future] inputs zero or more `Future` operations that this dataflow depends upon + # + # @yield The operation to perform once all the dependencies are met + # @yieldparam [Future] inputs each of the `Future` inputs to the dataflow + # @yieldreturn [Object] the result of the block operation + # + # @return [Object] the result of all the operations + # + # @raise [ArgumentError] if no block is given + # @raise [ArgumentError] if any of the inputs are not `IVar`s + def dataflow(*inputs, &block) + dataflow_with(Concurrent.global_io_executor, *inputs, &block) + end + module_function :dataflow + + def dataflow_with(executor, *inputs, &block) + call_dataflow(:value, executor, *inputs, &block) + end + module_function :dataflow_with + + def dataflow!(*inputs, &block) + dataflow_with!(Concurrent.global_io_executor, *inputs, &block) + end + module_function :dataflow! + + def dataflow_with!(executor, *inputs, &block) + call_dataflow(:value!, executor, *inputs, &block) + end + module_function :dataflow_with! + + private + + def call_dataflow(method, executor, *inputs, &block) + raise ArgumentError.new('an executor must be provided') if executor.nil? + raise ArgumentError.new('no block given') unless block_given? + unless inputs.all? { |input| input.is_a? IVar } + raise ArgumentError.new("Not all dependencies are IVars.\nDependencies: #{ inputs.inspect }") + end + + result = Future.new(executor: executor) do + values = inputs.map { |input| input.send(method) } + block.call(*values) + end + + if inputs.empty? + result.execute + else + counter = DependencyCounter.new(inputs.size) { result.execute } + + inputs.each do |input| + input.add_observer counter + end + end + + result + end + module_function :call_dataflow +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/delay.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/delay.rb new file mode 100644 index 000000000000..83799d03dd63 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/delay.rb @@ -0,0 +1,199 @@ +require 'thread' +require 'concurrent/concern/obligation' +require 'concurrent/executor/immediate_executor' +require 'concurrent/synchronization' + +module Concurrent + + # This file has circular require issues. It must be autoloaded here. + autoload :Options, 'concurrent/options' + + # Lazy evaluation of a block yielding an immutable result. Useful for + # expensive operations that may never be needed. It may be non-blocking, + # supports the `Concern::Obligation` interface, and accepts the injection of + # custom executor upon which to execute the block. Processing of + # block will be deferred until the first time `#value` is called. + # At that time the caller can choose to return immediately and let + # the block execute asynchronously, block indefinitely, or block + # with a timeout. + # + # When a `Delay` is created its state is set to `pending`. The value and + # reason are both `nil`. The first time the `#value` method is called the + # enclosed opration will be run and the calling thread will block. Other + # threads attempting to call `#value` will block as well. Once the operation + # is complete the *value* will be set to the result of the operation or the + # *reason* will be set to the raised exception, as appropriate. All threads + # blocked on `#value` will return. Subsequent calls to `#value` will immediately + # return the cached value. The operation will only be run once. This means that + # any side effects created by the operation will only happen once as well. + # + # `Delay` includes the `Concurrent::Concern::Dereferenceable` mixin to support thread + # safety of the reference returned by `#value`. + # + # @!macro copy_options + # + # @!macro delay_note_regarding_blocking + # @note The default behavior of `Delay` is to block indefinitely when + # calling either `value` or `wait`, executing the delayed operation on + # the current thread. This makes the `timeout` value completely + # irrelevant. To enable non-blocking behavior, use the `executor` + # constructor option. This will cause the delayed operation to be + # execute on the given executor, allowing the call to timeout. + # + # @see Concurrent::Concern::Dereferenceable + class Delay < Synchronization::LockableObject + include Concern::Obligation + + # NOTE: Because the global thread pools are lazy-loaded with these objects + # there is a performance hit every time we post a new task to one of these + # thread pools. Subsequently it is critical that `Delay` perform as fast + # as possible post-completion. This class has been highly optimized using + # the benchmark script `examples/lazy_and_delay.rb`. Do NOT attempt to + # DRY-up this class or perform other refactoring with running the + # benchmarks and ensuring that performance is not negatively impacted. + + # Create a new `Delay` in the `:pending` state. + # + # @!macro executor_and_deref_options + # + # @yield the delayed operation to perform + # + # @raise [ArgumentError] if no block is given + def initialize(opts = {}, &block) + raise ArgumentError.new('no block given') unless block_given? + super(&nil) + synchronize { ns_initialize(opts, &block) } + end + + # Return the value this object represents after applying the options + # specified by the `#set_deref_options` method. If the delayed operation + # raised an exception this method will return nil. The execption object + # can be accessed via the `#reason` method. + # + # @param [Numeric] timeout the maximum number of seconds to wait + # @return [Object] the current value of the object + # + # @!macro delay_note_regarding_blocking + def value(timeout = nil) + if @executor # TODO (pitr 12-Sep-2015): broken unsafe read? + super + else + # this function has been optimized for performance and + # should not be modified without running new benchmarks + synchronize do + execute = @evaluation_started = true unless @evaluation_started + if execute + begin + set_state(true, @task.call, nil) + rescue => ex + set_state(false, nil, ex) + end + elsif incomplete? + raise IllegalOperationError, 'Recursive call to #value during evaluation of the Delay' + end + end + if @do_nothing_on_deref + @value + else + apply_deref_options(@value) + end + end + end + + # Return the value this object represents after applying the options + # specified by the `#set_deref_options` method. If the delayed operation + # raised an exception, this method will raise that exception (even when) + # the operation has already been executed). + # + # @param [Numeric] timeout the maximum number of seconds to wait + # @return [Object] the current value of the object + # @raise [Exception] when `#rejected?` raises `#reason` + # + # @!macro delay_note_regarding_blocking + def value!(timeout = nil) + if @executor + super + else + result = value + raise @reason if @reason + result + end + end + + # Return the value this object represents after applying the options + # specified by the `#set_deref_options` method. + # + # @param [Integer] timeout (nil) the maximum number of seconds to wait for + # the value to be computed. When `nil` the caller will block indefinitely. + # + # @return [Object] self + # + # @!macro delay_note_regarding_blocking + def wait(timeout = nil) + if @executor + execute_task_once + super(timeout) + else + value + end + self + end + + # Reconfigures the block returning the value if still `#incomplete?` + # + # @yield the delayed operation to perform + # @return [true, false] if success + def reconfigure(&block) + synchronize do + raise ArgumentError.new('no block given') unless block_given? + unless @evaluation_started + @task = block + true + else + false + end + end + end + + protected + + def ns_initialize(opts, &block) + init_obligation + set_deref_options(opts) + @executor = opts[:executor] + + @task = block + @state = :pending + @evaluation_started = false + end + + private + + # @!visibility private + def execute_task_once # :nodoc: + # this function has been optimized for performance and + # should not be modified without running new benchmarks + execute = task = nil + synchronize do + execute = @evaluation_started = true unless @evaluation_started + task = @task + end + + if execute + executor = Options.executor_from_options(executor: @executor) + executor.post do + begin + result = task.call + success = true + rescue => ex + reason = ex + end + synchronize do + set_state(success, result, reason) + event.set + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/errors.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/errors.rb new file mode 100644 index 000000000000..b69fec01f203 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/errors.rb @@ -0,0 +1,69 @@ +module Concurrent + + Error = Class.new(StandardError) + + # Raised when errors occur during configuration. + ConfigurationError = Class.new(Error) + + # Raised when an asynchronous operation is cancelled before execution. + CancelledOperationError = Class.new(Error) + + # Raised when a lifecycle method (such as `stop`) is called in an improper + # sequence or when the object is in an inappropriate state. + LifecycleError = Class.new(Error) + + # Raised when an attempt is made to violate an immutability guarantee. + ImmutabilityError = Class.new(Error) + + # Raised when an operation is attempted which is not legal given the + # receiver's current state + IllegalOperationError = Class.new(Error) + + # Raised when an object's methods are called when it has not been + # properly initialized. + InitializationError = Class.new(Error) + + # Raised when an object with a start/stop lifecycle has been started an + # excessive number of times. Often used in conjunction with a restart + # policy or strategy. + MaxRestartFrequencyError = Class.new(Error) + + # Raised when an attempt is made to modify an immutable object + # (such as an `IVar`) after its final state has been set. + class MultipleAssignmentError < Error + attr_reader :inspection_data + + def initialize(message = nil, inspection_data = nil) + @inspection_data = inspection_data + super message + end + + def inspect + format '%s %s>', super[0..-2], @inspection_data.inspect + end + end + + # Raised by an `Executor` when it is unable to process a given task, + # possibly because of a reject policy or other internal error. + RejectedExecutionError = Class.new(Error) + + # Raised when any finite resource, such as a lock counter, exceeds its + # maximum limit/threshold. + ResourceLimitError = Class.new(Error) + + # Raised when an operation times out. + TimeoutError = Class.new(Error) + + # Aggregates multiple exceptions. + class MultipleErrors < Error + attr_reader :errors + + def initialize(errors, message = "#{errors.size} errors") + @errors = errors + super [*message, + *errors.map { |e| [format('%s (%s)', e.message, e.class), *e.backtrace] }.flatten(1) + ].join("\n") + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/exchanger.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/exchanger.rb new file mode 100644 index 000000000000..5a99550b33a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/exchanger.rb @@ -0,0 +1,352 @@ +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/maybe' +require 'concurrent/atomic/atomic_reference' +require 'concurrent/atomic/count_down_latch' +require 'concurrent/utility/engine' +require 'concurrent/utility/monotonic_time' + +module Concurrent + + # @!macro exchanger + # + # A synchronization point at which threads can pair and swap elements within + # pairs. Each thread presents some object on entry to the exchange method, + # matches with a partner thread, and receives its partner's object on return. + # + # @!macro thread_safe_variable_comparison + # + # This implementation is very simple, using only a single slot for each + # exchanger (unlike more advanced implementations which use an "arena"). + # This approach will work perfectly fine when there are only a few threads + # accessing a single `Exchanger`. Beyond a handful of threads the performance + # will degrade rapidly due to contention on the single slot, but the algorithm + # will remain correct. + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html java.util.concurrent.Exchanger + # @example + # + # exchanger = Concurrent::Exchanger.new + # + # threads = [ + # Thread.new { puts "first: " << exchanger.exchange('foo', 1) }, #=> "first: bar" + # Thread.new { puts "second: " << exchanger.exchange('bar', 1) } #=> "second: foo" + # ] + # threads.each {|t| t.join(2) } + + # @!visibility private + class AbstractExchanger < Synchronization::Object + + # @!visibility private + CANCEL = ::Object.new + private_constant :CANCEL + + def initialize + super + end + + # @!macro exchanger_method_do_exchange + # + # Waits for another thread to arrive at this exchange point (unless the + # current thread is interrupted), and then transfers the given object to + # it, receiving its object in return. The timeout value indicates the + # approximate number of seconds the method should block while waiting + # for the exchange. When the timeout value is `nil` the method will + # block indefinitely. + # + # @param [Object] value the value to exchange with another thread + # @param [Numeric, nil] timeout in seconds, `nil` blocks indefinitely + # + # @!macro exchanger_method_exchange + # + # In some edge cases when a `timeout` is given a return value of `nil` may be + # ambiguous. Specifically, if `nil` is a valid value in the exchange it will + # be impossible to tell whether `nil` is the actual return value or if it + # signifies timeout. When `nil` is a valid value in the exchange consider + # using {#exchange!} or {#try_exchange} instead. + # + # @return [Object] the value exchanged by the other thread or `nil` on timeout + def exchange(value, timeout = nil) + (value = do_exchange(value, timeout)) == CANCEL ? nil : value + end + + # @!macro exchanger_method_do_exchange + # @!macro exchanger_method_exchange_bang + # + # On timeout a {Concurrent::TimeoutError} exception will be raised. + # + # @return [Object] the value exchanged by the other thread + # @raise [Concurrent::TimeoutError] on timeout + def exchange!(value, timeout = nil) + if (value = do_exchange(value, timeout)) == CANCEL + raise Concurrent::TimeoutError + else + value + end + end + + # @!macro exchanger_method_do_exchange + # @!macro exchanger_method_try_exchange + # + # The return value will be a {Concurrent::Maybe} set to `Just` on success or + # `Nothing` on timeout. + # + # @return [Concurrent::Maybe] on success a `Just` maybe will be returned with + # the item exchanged by the other thread as `#value`; on timeout a + # `Nothing` maybe will be returned with {Concurrent::TimeoutError} as `#reason` + # + # @example + # + # exchanger = Concurrent::Exchanger.new + # + # result = exchanger.exchange(:foo, 0.5) + # + # if result.just? + # puts result.value #=> :bar + # else + # puts 'timeout' + # end + def try_exchange(value, timeout = nil) + if (value = do_exchange(value, timeout)) == CANCEL + Concurrent::Maybe.nothing(Concurrent::TimeoutError) + else + Concurrent::Maybe.just(value) + end + end + + private + + # @!macro exchanger_method_do_exchange + # + # @return [Object, CANCEL] the value exchanged by the other thread; {CANCEL} on timeout + def do_exchange(value, timeout) + raise NotImplementedError + end + end + + # @!macro internal_implementation_note + # @!visibility private + class RubyExchanger < AbstractExchanger + # A simplified version of java.util.concurrent.Exchanger written by + # Doug Lea, Bill Scherer, and Michael Scott with assistance from members + # of JCP JSR-166 Expert Group and released to the public domain. It does + # not include the arena or the multi-processor spin loops. + # http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/Exchanger.java + + safe_initialization! + + class Node < Concurrent::Synchronization::Object + attr_atomic :value + safe_initialization! + + def initialize(item) + super() + @Item = item + @Latch = Concurrent::CountDownLatch.new + self.value = nil + end + + def latch + @Latch + end + + def item + @Item + end + end + private_constant :Node + + def initialize + super + end + + private + + attr_atomic(:slot) + + # @!macro exchanger_method_do_exchange + # + # @return [Object, CANCEL] the value exchanged by the other thread; {CANCEL} on timeout + def do_exchange(value, timeout) + + # ALGORITHM + # + # From the original Java version: + # + # > The basic idea is to maintain a "slot", which is a reference to + # > a Node containing both an Item to offer and a "hole" waiting to + # > get filled in. If an incoming "occupying" thread sees that the + # > slot is null, it CAS'es (compareAndSets) a Node there and waits + # > for another to invoke exchange. That second "fulfilling" thread + # > sees that the slot is non-null, and so CASes it back to null, + # > also exchanging items by CASing the hole, plus waking up the + # > occupying thread if it is blocked. In each case CAS'es may + # > fail because a slot at first appears non-null but is null upon + # > CAS, or vice-versa. So threads may need to retry these + # > actions. + # + # This version: + # + # An exchange occurs between an "occupier" thread and a "fulfiller" thread. + # The "slot" is used to setup this interaction. The first thread in the + # exchange puts itself into the slot (occupies) and waits for a fulfiller. + # The second thread removes the occupier from the slot and attempts to + # perform the exchange. Removing the occupier also frees the slot for + # another occupier/fulfiller pair. + # + # Because the occupier and the fulfiller are operating independently and + # because there may be contention with other threads, any failed operation + # indicates contention. Both the occupier and the fulfiller operate within + # spin loops. Any failed actions along the happy path will cause the thread + # to repeat the loop and try again. + # + # When a timeout value is given the thread must be cognizant of time spent + # in the spin loop. The remaining time is checked every loop. When the time + # runs out the thread will exit. + # + # A "node" is the data structure used to perform the exchange. Only the + # occupier's node is necessary. It's the node used for the exchange. + # Each node has an "item," a "hole" (self), and a "latch." The item is the + # node's initial value. It never changes. It's what the fulfiller returns on + # success. The occupier's hole is where the fulfiller put its item. It's the + # item that the occupier returns on success. The latch is used for synchronization. + # Because a thread may act as either an occupier or fulfiller (or possibly + # both in periods of high contention) every thread creates a node when + # the exchange method is first called. + # + # The following steps occur within the spin loop. If any actions fail + # the thread will loop and try again, so long as there is time remaining. + # If time runs out the thread will return CANCEL. + # + # Check the slot for an occupier: + # + # * If the slot is empty try to occupy + # * If the slot is full try to fulfill + # + # Attempt to occupy: + # + # * Attempt to CAS myself into the slot + # * Go to sleep and wait to be woken by a fulfiller + # * If the sleep is successful then the fulfiller completed its happy path + # - Return the value from my hole (the value given by the fulfiller) + # * When the sleep fails (time ran out) attempt to cancel the operation + # - Attempt to CAS myself out of the hole + # - If successful there is no contention + # - Return CANCEL + # - On failure, I am competing with a fulfiller + # - Attempt to CAS my hole to CANCEL + # - On success + # - Let the fulfiller deal with my cancel + # - Return CANCEL + # - On failure the fulfiller has completed its happy path + # - Return th value from my hole (the fulfiller's value) + # + # Attempt to fulfill: + # + # * Attempt to CAS the occupier out of the slot + # - On failure loop again + # * Attempt to CAS my item into the occupier's hole + # - On failure the occupier is trying to cancel + # - Loop again + # - On success we are on the happy path + # - Wake the sleeping occupier + # - Return the occupier's item + + value = NULL if value.nil? # The sentinel allows nil to be a valid value + me = Node.new(value) # create my node in case I need to occupy + end_at = Concurrent.monotonic_time + timeout.to_f # The time to give up + + result = loop do + other = slot + if other && compare_and_set_slot(other, nil) + # try to fulfill + if other.compare_and_set_value(nil, value) + # happy path + other.latch.count_down + break other.item + end + elsif other.nil? && compare_and_set_slot(nil, me) + # try to occupy + timeout = end_at - Concurrent.monotonic_time if timeout + if me.latch.wait(timeout) + # happy path + break me.value + else + # attempt to remove myself from the slot + if compare_and_set_slot(me, nil) + break CANCEL + elsif !me.compare_and_set_value(nil, CANCEL) + # I've failed to block the fulfiller + break me.value + end + end + end + break CANCEL if timeout && Concurrent.monotonic_time >= end_at + end + + result == NULL ? nil : result + end + end + + if Concurrent.on_jruby? + + # @!macro internal_implementation_note + # @!visibility private + class JavaExchanger < AbstractExchanger + + def initialize + @exchanger = java.util.concurrent.Exchanger.new + end + + private + + # @!macro exchanger_method_do_exchange + # + # @return [Object, CANCEL] the value exchanged by the other thread; {CANCEL} on timeout + def do_exchange(value, timeout) + result = nil + if timeout.nil? + Synchronization::JRuby.sleep_interruptibly do + result = @exchanger.exchange(value) + end + else + Synchronization::JRuby.sleep_interruptibly do + result = @exchanger.exchange(value, 1000 * timeout, java.util.concurrent.TimeUnit::MILLISECONDS) + end + end + result + rescue java.util.concurrent.TimeoutException + CANCEL + end + end + end + + # @!visibility private + # @!macro internal_implementation_note + ExchangerImplementation = case + when Concurrent.on_jruby? + JavaExchanger + else + RubyExchanger + end + private_constant :ExchangerImplementation + + # @!macro exchanger + class Exchanger < ExchangerImplementation + + # @!method initialize + # Creates exchanger instance + + # @!method exchange(value, timeout = nil) + # @!macro exchanger_method_do_exchange + # @!macro exchanger_method_exchange + + # @!method exchange!(value, timeout = nil) + # @!macro exchanger_method_do_exchange + # @!macro exchanger_method_exchange_bang + + # @!method try_exchange(value, timeout = nil) + # @!macro exchanger_method_do_exchange + # @!macro exchanger_method_try_exchange + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb new file mode 100644 index 000000000000..6d0b0474d105 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb @@ -0,0 +1,128 @@ +require 'concurrent/errors' +require 'concurrent/concern/deprecation' +require 'concurrent/executor/executor_service' +require 'concurrent/synchronization' + +module Concurrent + + # @!macro abstract_executor_service_public_api + # @!visibility private + class AbstractExecutorService < Synchronization::LockableObject + include ExecutorService + include Concern::Deprecation + + # The set of possible fallback policies that may be set at thread pool creation. + FALLBACK_POLICIES = [:abort, :discard, :caller_runs].freeze + + # @!macro executor_service_attr_reader_fallback_policy + attr_reader :fallback_policy + + attr_reader :name + + # Create a new thread pool. + def initialize(opts = {}, &block) + super(&nil) + synchronize do + @auto_terminate = opts.fetch(:auto_terminate, true) + @name = opts.fetch(:name) if opts.key?(:name) + ns_initialize(opts, &block) + end + end + + def to_s + name ? "#{super[0..-2]} name: #{name}>" : super + end + + # @!macro executor_service_method_shutdown + def shutdown + raise NotImplementedError + end + + # @!macro executor_service_method_kill + def kill + raise NotImplementedError + end + + # @!macro executor_service_method_wait_for_termination + def wait_for_termination(timeout = nil) + raise NotImplementedError + end + + # @!macro executor_service_method_running_question + def running? + synchronize { ns_running? } + end + + # @!macro executor_service_method_shuttingdown_question + def shuttingdown? + synchronize { ns_shuttingdown? } + end + + # @!macro executor_service_method_shutdown_question + def shutdown? + synchronize { ns_shutdown? } + end + + # @!macro executor_service_method_auto_terminate_question + def auto_terminate? + synchronize { @auto_terminate } + end + + # @!macro executor_service_method_auto_terminate_setter + def auto_terminate=(value) + deprecated "Method #auto_terminate= has no effect. Set :auto_terminate option when executor is initialized." + end + + private + + # Handler which executes the `fallback_policy` once the queue size + # reaches `max_queue`. + # + # @param [Array] args the arguments to the task which is being handled. + # + # @!visibility private + def handle_fallback(*args) + case fallback_policy + when :abort + raise RejectedExecutionError + when :discard + false + when :caller_runs + begin + yield(*args) + rescue => ex + # let it fail + log DEBUG, ex + end + true + else + fail "Unknown fallback policy #{fallback_policy}" + end + end + + def ns_execute(*args, &task) + raise NotImplementedError + end + + # @!macro executor_service_method_ns_shutdown_execution + # + # Callback method called when an orderly shutdown has completed. + # The default behavior is to signal all waiting threads. + def ns_shutdown_execution + # do nothing + end + + # @!macro executor_service_method_ns_kill_execution + # + # Callback method called when the executor has been killed. + # The default behavior is to do nothing. + def ns_kill_execution + # do nothing + end + + def ns_auto_terminate? + @auto_terminate + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/cached_thread_pool.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/cached_thread_pool.rb new file mode 100644 index 000000000000..de50ed1791c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/cached_thread_pool.rb @@ -0,0 +1,62 @@ +require 'concurrent/utility/engine' +require 'concurrent/executor/thread_pool_executor' + +module Concurrent + + # A thread pool that dynamically grows and shrinks to fit the current workload. + # New threads are created as needed, existing threads are reused, and threads + # that remain idle for too long are killed and removed from the pool. These + # pools are particularly suited to applications that perform a high volume of + # short-lived tasks. + # + # On creation a `CachedThreadPool` has zero running threads. New threads are + # created on the pool as new operations are `#post`. The size of the pool + # will grow until `#max_length` threads are in the pool or until the number + # of threads exceeds the number of running and pending operations. When a new + # operation is post to the pool the first available idle thread will be tasked + # with the new operation. + # + # Should a thread crash for any reason the thread will immediately be removed + # from the pool. Similarly, threads which remain idle for an extended period + # of time will be killed and reclaimed. Thus these thread pools are very + # efficient at reclaiming unused resources. + # + # The API and behavior of this class are based on Java's `CachedThreadPool` + # + # @!macro thread_pool_options + class CachedThreadPool < ThreadPoolExecutor + + # @!macro cached_thread_pool_method_initialize + # + # Create a new thread pool. + # + # @param [Hash] opts the options defining pool behavior. + # @option opts [Symbol] :fallback_policy (`:abort`) the fallback policy + # + # @raise [ArgumentError] if `fallback_policy` is not a known policy + # + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool-- + def initialize(opts = {}) + defaults = { idletime: DEFAULT_THREAD_IDLETIMEOUT } + overrides = { min_threads: 0, + max_threads: DEFAULT_MAX_POOL_SIZE, + max_queue: DEFAULT_MAX_QUEUE_SIZE } + super(defaults.merge(opts).merge(overrides)) + end + + private + + # @!macro cached_thread_pool_method_initialize + # @!visibility private + def ns_initialize(opts) + super(opts) + if Concurrent.on_jruby? + @max_queue = 0 + @executor = java.util.concurrent.Executors.newCachedThreadPool( + DaemonThreadFactory.new(ns_auto_terminate?)) + @executor.setRejectedExecutionHandler(FALLBACK_POLICY_CLASSES[@fallback_policy].new) + @executor.setKeepAliveTime(opts.fetch(:idletime, DEFAULT_THREAD_IDLETIMEOUT), java.util.concurrent.TimeUnit::SECONDS) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/executor_service.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/executor_service.rb new file mode 100644 index 000000000000..7e344919e0e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/executor_service.rb @@ -0,0 +1,185 @@ +require 'concurrent/concern/logging' + +module Concurrent + + ################################################################### + + # @!macro executor_service_method_post + # + # Submit a task to the executor for asynchronous processing. + # + # @param [Array] args zero or more arguments to be passed to the task + # + # @yield the asynchronous task to perform + # + # @return [Boolean] `true` if the task is queued, `false` if the executor + # is not running + # + # @raise [ArgumentError] if no task is given + + # @!macro executor_service_method_left_shift + # + # Submit a task to the executor for asynchronous processing. + # + # @param [Proc] task the asynchronous task to perform + # + # @return [self] returns itself + + # @!macro executor_service_method_can_overflow_question + # + # Does the task queue have a maximum size? + # + # @return [Boolean] True if the task queue has a maximum size else false. + + # @!macro executor_service_method_serialized_question + # + # Does this executor guarantee serialization of its operations? + # + # @return [Boolean] True if the executor guarantees that all operations + # will be post in the order they are received and no two operations may + # occur simultaneously. Else false. + + ################################################################### + + # @!macro executor_service_public_api + # + # @!method post(*args, &task) + # @!macro executor_service_method_post + # + # @!method <<(task) + # @!macro executor_service_method_left_shift + # + # @!method can_overflow? + # @!macro executor_service_method_can_overflow_question + # + # @!method serialized? + # @!macro executor_service_method_serialized_question + + ################################################################### + + # @!macro executor_service_attr_reader_fallback_policy + # @return [Symbol] The fallback policy in effect. Either `:abort`, `:discard`, or `:caller_runs`. + + # @!macro executor_service_method_shutdown + # + # Begin an orderly shutdown. Tasks already in the queue will be executed, + # but no new tasks will be accepted. Has no additional effect if the + # thread pool is not running. + + # @!macro executor_service_method_kill + # + # Begin an immediate shutdown. In-progress tasks will be allowed to + # complete but enqueued tasks will be dismissed and no new tasks + # will be accepted. Has no additional effect if the thread pool is + # not running. + + # @!macro executor_service_method_wait_for_termination + # + # Block until executor shutdown is complete or until `timeout` seconds have + # passed. + # + # @note Does not initiate shutdown or termination. Either `shutdown` or `kill` + # must be called before this method (or on another thread). + # + # @param [Integer] timeout the maximum number of seconds to wait for shutdown to complete + # + # @return [Boolean] `true` if shutdown complete or false on `timeout` + + # @!macro executor_service_method_running_question + # + # Is the executor running? + # + # @return [Boolean] `true` when running, `false` when shutting down or shutdown + + # @!macro executor_service_method_shuttingdown_question + # + # Is the executor shuttingdown? + # + # @return [Boolean] `true` when not running and not shutdown, else `false` + + # @!macro executor_service_method_shutdown_question + # + # Is the executor shutdown? + # + # @return [Boolean] `true` when shutdown, `false` when shutting down or running + + # @!macro executor_service_method_auto_terminate_question + # + # Is the executor auto-terminate when the application exits? + # + # @return [Boolean] `true` when auto-termination is enabled else `false`. + + # @!macro executor_service_method_auto_terminate_setter + # + # + # Set the auto-terminate behavior for this executor. + # @deprecated Has no effect + # @param [Boolean] value The new auto-terminate value to set for this executor. + # @return [Boolean] `true` when auto-termination is enabled else `false`. + + ################################################################### + + # @!macro abstract_executor_service_public_api + # + # @!macro executor_service_public_api + # + # @!attribute [r] fallback_policy + # @!macro executor_service_attr_reader_fallback_policy + # + # @!method shutdown + # @!macro executor_service_method_shutdown + # + # @!method kill + # @!macro executor_service_method_kill + # + # @!method wait_for_termination(timeout = nil) + # @!macro executor_service_method_wait_for_termination + # + # @!method running? + # @!macro executor_service_method_running_question + # + # @!method shuttingdown? + # @!macro executor_service_method_shuttingdown_question + # + # @!method shutdown? + # @!macro executor_service_method_shutdown_question + # + # @!method auto_terminate? + # @!macro executor_service_method_auto_terminate_question + # + # @!method auto_terminate=(value) + # @!macro executor_service_method_auto_terminate_setter + + ################################################################### + + # @!macro executor_service_public_api + # @!visibility private + module ExecutorService + include Concern::Logging + + # @!macro executor_service_method_post + def post(*args, &task) + raise NotImplementedError + end + + # @!macro executor_service_method_left_shift + def <<(task) + post(&task) + self + end + + # @!macro executor_service_method_can_overflow_question + # + # @note Always returns `false` + def can_overflow? + false + end + + # @!macro executor_service_method_serialized_question + # + # @note Always returns `false` + def serialized? + false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/fixed_thread_pool.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/fixed_thread_pool.rb new file mode 100644 index 000000000000..b665f6c5692e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/fixed_thread_pool.rb @@ -0,0 +1,210 @@ +require 'concurrent/utility/engine' +require 'concurrent/executor/thread_pool_executor' + +module Concurrent + + # @!macro thread_pool_executor_constant_default_max_pool_size + # Default maximum number of threads that will be created in the pool. + + # @!macro thread_pool_executor_constant_default_min_pool_size + # Default minimum number of threads that will be retained in the pool. + + # @!macro thread_pool_executor_constant_default_max_queue_size + # Default maximum number of tasks that may be added to the task queue. + + # @!macro thread_pool_executor_constant_default_thread_timeout + # Default maximum number of seconds a thread in the pool may remain idle + # before being reclaimed. + + # @!macro thread_pool_executor_constant_default_synchronous + # Default value of the :synchronous option. + + # @!macro thread_pool_executor_attr_reader_max_length + # The maximum number of threads that may be created in the pool. + # @return [Integer] The maximum number of threads that may be created in the pool. + + # @!macro thread_pool_executor_attr_reader_min_length + # The minimum number of threads that may be retained in the pool. + # @return [Integer] The minimum number of threads that may be retained in the pool. + + # @!macro thread_pool_executor_attr_reader_largest_length + # The largest number of threads that have been created in the pool since construction. + # @return [Integer] The largest number of threads that have been created in the pool since construction. + + # @!macro thread_pool_executor_attr_reader_scheduled_task_count + # The number of tasks that have been scheduled for execution on the pool since construction. + # @return [Integer] The number of tasks that have been scheduled for execution on the pool since construction. + + # @!macro thread_pool_executor_attr_reader_completed_task_count + # The number of tasks that have been completed by the pool since construction. + # @return [Integer] The number of tasks that have been completed by the pool since construction. + + # @!macro thread_pool_executor_attr_reader_idletime + # The number of seconds that a thread may be idle before being reclaimed. + # @return [Integer] The number of seconds that a thread may be idle before being reclaimed. + + # @!macro thread_pool_executor_attr_reader_synchronous + # Whether or not a value of 0 for :max_queue option means the queue must perform direct hand-off or rather unbounded queue. + # @return [true, false] + + # @!macro thread_pool_executor_attr_reader_max_queue + # The maximum number of tasks that may be waiting in the work queue at any one time. + # When the queue size reaches `max_queue` subsequent tasks will be rejected in + # accordance with the configured `fallback_policy`. + # + # @return [Integer] The maximum number of tasks that may be waiting in the work queue at any one time. + # When the queue size reaches `max_queue` subsequent tasks will be rejected in + # accordance with the configured `fallback_policy`. + + # @!macro thread_pool_executor_attr_reader_length + # The number of threads currently in the pool. + # @return [Integer] The number of threads currently in the pool. + + # @!macro thread_pool_executor_attr_reader_queue_length + # The number of tasks in the queue awaiting execution. + # @return [Integer] The number of tasks in the queue awaiting execution. + + # @!macro thread_pool_executor_attr_reader_remaining_capacity + # Number of tasks that may be enqueued before reaching `max_queue` and rejecting + # new tasks. A value of -1 indicates that the queue may grow without bound. + # + # @return [Integer] Number of tasks that may be enqueued before reaching `max_queue` and rejecting + # new tasks. A value of -1 indicates that the queue may grow without bound. + + + + + + # @!macro thread_pool_executor_public_api + # + # @!macro abstract_executor_service_public_api + # + # @!attribute [r] max_length + # @!macro thread_pool_executor_attr_reader_max_length + # + # @!attribute [r] min_length + # @!macro thread_pool_executor_attr_reader_min_length + # + # @!attribute [r] largest_length + # @!macro thread_pool_executor_attr_reader_largest_length + # + # @!attribute [r] scheduled_task_count + # @!macro thread_pool_executor_attr_reader_scheduled_task_count + # + # @!attribute [r] completed_task_count + # @!macro thread_pool_executor_attr_reader_completed_task_count + # + # @!attribute [r] idletime + # @!macro thread_pool_executor_attr_reader_idletime + # + # @!attribute [r] max_queue + # @!macro thread_pool_executor_attr_reader_max_queue + # + # @!attribute [r] length + # @!macro thread_pool_executor_attr_reader_length + # + # @!attribute [r] queue_length + # @!macro thread_pool_executor_attr_reader_queue_length + # + # @!attribute [r] remaining_capacity + # @!macro thread_pool_executor_attr_reader_remaining_capacity + # + # @!method can_overflow? + # @!macro executor_service_method_can_overflow_question + + + + + # @!macro thread_pool_options + # + # **Thread Pool Options** + # + # Thread pools support several configuration options: + # + # * `idletime`: The number of seconds that a thread may be idle before being reclaimed. + # * `name`: The name of the executor (optional). Printed in the executor's `#to_s` output and + # a `<name>-worker-<id>` name is given to its threads if supported by used Ruby + # implementation. `<id>` is uniq for each thread. + # * `max_queue`: The maximum number of tasks that may be waiting in the work queue at + # any one time. When the queue size reaches `max_queue` and no new threads can be created, + # subsequent tasks will be rejected in accordance with the configured `fallback_policy`. + # * `auto_terminate`: When true (default), the threads started will be marked as daemon. + # * `fallback_policy`: The policy defining how rejected tasks are handled. + # + # Three fallback policies are supported: + # + # * `:abort`: Raise a `RejectedExecutionError` exception and discard the task. + # * `:discard`: Discard the task and return false. + # * `:caller_runs`: Execute the task on the calling thread. + # + # **Shutting Down Thread Pools** + # + # Killing a thread pool while tasks are still being processed, either by calling + # the `#kill` method or at application exit, will have unpredictable results. There + # is no way for the thread pool to know what resources are being used by the + # in-progress tasks. When those tasks are killed the impact on those resources + # cannot be predicted. The *best* practice is to explicitly shutdown all thread + # pools using the provided methods: + # + # * Call `#shutdown` to initiate an orderly termination of all in-progress tasks + # * Call `#wait_for_termination` with an appropriate timeout interval an allow + # the orderly shutdown to complete + # * Call `#kill` *only when* the thread pool fails to shutdown in the allotted time + # + # On some runtime platforms (most notably the JVM) the application will not + # exit until all thread pools have been shutdown. To prevent applications from + # "hanging" on exit, all threads can be marked as daemon according to the + # `:auto_terminate` option. + # + # ```ruby + # pool1 = Concurrent::FixedThreadPool.new(5) # threads will be marked as daemon + # pool2 = Concurrent::FixedThreadPool.new(5, auto_terminate: false) # mark threads as non-daemon + # ``` + # + # @note Failure to properly shutdown a thread pool can lead to unpredictable results. + # Please read *Shutting Down Thread Pools* for more information. + # + # @see http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html Java Tutorials: Thread Pools + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html Java Executors class + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html Java ExecutorService interface + # @see https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#setDaemon-boolean- + + + + + + # @!macro fixed_thread_pool + # + # A thread pool that reuses a fixed number of threads operating off an unbounded queue. + # At any point, at most `num_threads` will be active processing tasks. When all threads are busy new + # tasks `#post` to the thread pool are enqueued until a thread becomes available. + # Should a thread crash for any reason the thread will immediately be removed + # from the pool and replaced. + # + # The API and behavior of this class are based on Java's `FixedThreadPool` + # + # @!macro thread_pool_options + class FixedThreadPool < ThreadPoolExecutor + + # @!macro fixed_thread_pool_method_initialize + # + # Create a new thread pool. + # + # @param [Integer] num_threads the number of threads to allocate + # @param [Hash] opts the options defining pool behavior. + # @option opts [Symbol] :fallback_policy (`:abort`) the fallback policy + # + # @raise [ArgumentError] if `num_threads` is less than or equal to zero + # @raise [ArgumentError] if `fallback_policy` is not a known policy + # + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool-int- + def initialize(num_threads, opts = {}) + raise ArgumentError.new('number of threads must be greater than zero') if num_threads.to_i < 1 + defaults = { max_queue: DEFAULT_MAX_QUEUE_SIZE, + idletime: DEFAULT_THREAD_IDLETIMEOUT } + overrides = { min_threads: num_threads, + max_threads: num_threads } + super(defaults.merge(opts).merge(overrides)) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/immediate_executor.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/immediate_executor.rb new file mode 100644 index 000000000000..282df7a0593e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/immediate_executor.rb @@ -0,0 +1,66 @@ +require 'concurrent/atomic/event' +require 'concurrent/executor/abstract_executor_service' +require 'concurrent/executor/serial_executor_service' + +module Concurrent + + # An executor service which runs all operations on the current thread, + # blocking as necessary. Operations are performed in the order they are + # received and no two operations can be performed simultaneously. + # + # This executor service exists mainly for testing an debugging. When used + # it immediately runs every `#post` operation on the current thread, blocking + # that thread until the operation is complete. This can be very beneficial + # during testing because it makes all operations deterministic. + # + # @note Intended for use primarily in testing and debugging. + class ImmediateExecutor < AbstractExecutorService + include SerialExecutorService + + # Creates a new executor + def initialize + @stopped = Concurrent::Event.new + end + + # @!macro executor_service_method_post + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + return false unless running? + task.call(*args) + true + end + + # @!macro executor_service_method_left_shift + def <<(task) + post(&task) + self + end + + # @!macro executor_service_method_running_question + def running? + ! shutdown? + end + + # @!macro executor_service_method_shuttingdown_question + def shuttingdown? + false + end + + # @!macro executor_service_method_shutdown_question + def shutdown? + @stopped.set? + end + + # @!macro executor_service_method_shutdown + def shutdown + @stopped.set + true + end + alias_method :kill, :shutdown + + # @!macro executor_service_method_wait_for_termination + def wait_for_termination(timeout = nil) + @stopped.wait(timeout) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/indirect_immediate_executor.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/indirect_immediate_executor.rb new file mode 100644 index 000000000000..4f9769fa3f3b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/indirect_immediate_executor.rb @@ -0,0 +1,44 @@ +require 'concurrent/executor/immediate_executor' +require 'concurrent/executor/simple_executor_service' + +module Concurrent + # An executor service which runs all operations on a new thread, blocking + # until it completes. Operations are performed in the order they are received + # and no two operations can be performed simultaneously. + # + # This executor service exists mainly for testing an debugging. When used it + # immediately runs every `#post` operation on a new thread, blocking the + # current thread until the operation is complete. This is similar to how the + # ImmediateExecutor works, but the operation has the full stack of the new + # thread at its disposal. This can be helpful when the operations will spawn + # more operations on the same executor and so on - such a situation might + # overflow the single stack in case of an ImmediateExecutor, which is + # inconsistent with how it would behave for a threaded executor. + # + # @note Intended for use primarily in testing and debugging. + class IndirectImmediateExecutor < ImmediateExecutor + # Creates a new executor + def initialize + super + @internal_executor = SimpleExecutorService.new + end + + # @!macro executor_service_method_post + def post(*args, &task) + raise ArgumentError.new("no block given") unless block_given? + return false unless running? + + event = Concurrent::Event.new + @internal_executor.post do + begin + task.call(*args) + ensure + event.set + end + end + event.wait + + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb new file mode 100644 index 000000000000..9c0f3100cf47 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb @@ -0,0 +1,103 @@ +if Concurrent.on_jruby? + + require 'concurrent/errors' + require 'concurrent/utility/engine' + require 'concurrent/executor/abstract_executor_service' + + module Concurrent + + # @!macro abstract_executor_service_public_api + # @!visibility private + class JavaExecutorService < AbstractExecutorService + java_import 'java.lang.Runnable' + + FALLBACK_POLICY_CLASSES = { + abort: java.util.concurrent.ThreadPoolExecutor::AbortPolicy, + discard: java.util.concurrent.ThreadPoolExecutor::DiscardPolicy, + caller_runs: java.util.concurrent.ThreadPoolExecutor::CallerRunsPolicy + }.freeze + private_constant :FALLBACK_POLICY_CLASSES + + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + return handle_fallback(*args, &task) unless running? + @executor.submit Job.new(args, task) + true + rescue Java::JavaUtilConcurrent::RejectedExecutionException + raise RejectedExecutionError + end + + def wait_for_termination(timeout = nil) + if timeout.nil? + ok = @executor.awaitTermination(60, java.util.concurrent.TimeUnit::SECONDS) until ok + true + else + @executor.awaitTermination(1000 * timeout, java.util.concurrent.TimeUnit::MILLISECONDS) + end + end + + def shutdown + synchronize do + @executor.shutdown + nil + end + end + + def kill + synchronize do + @executor.shutdownNow + nil + end + end + + private + + def ns_running? + !(ns_shuttingdown? || ns_shutdown?) + end + + def ns_shuttingdown? + if @executor.respond_to? :isTerminating + @executor.isTerminating + else + false + end + end + + def ns_shutdown? + @executor.isShutdown || @executor.isTerminated + end + + class Job + include Runnable + def initialize(args, block) + @args = args + @block = block + end + + def run + @block.call(*@args) + end + end + private_constant :Job + end + + class DaemonThreadFactory + # hide include from YARD + send :include, java.util.concurrent.ThreadFactory + + def initialize(daemonize = true) + @daemonize = daemonize + end + + def newThread(runnable) + thread = java.util.concurrent.Executors.defaultThreadFactory().newThread(runnable) + thread.setDaemon(@daemonize) + return thread + end + end + + private_constant :DaemonThreadFactory + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/java_single_thread_executor.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/java_single_thread_executor.rb new file mode 100644 index 000000000000..7aa24f2d723b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/java_single_thread_executor.rb @@ -0,0 +1,30 @@ +if Concurrent.on_jruby? + + require 'concurrent/executor/java_executor_service' + require 'concurrent/executor/serial_executor_service' + + module Concurrent + + # @!macro single_thread_executor + # @!macro abstract_executor_service_public_api + # @!visibility private + class JavaSingleThreadExecutor < JavaExecutorService + include SerialExecutorService + + # @!macro single_thread_executor_method_initialize + def initialize(opts = {}) + super(opts) + end + + private + + def ns_initialize(opts) + @executor = java.util.concurrent.Executors.newSingleThreadExecutor( + DaemonThreadFactory.new(ns_auto_terminate?) + ) + @fallback_policy = opts.fetch(:fallback_policy, :discard) + raise ArgumentError.new("#{@fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICY_CLASSES.keys.include?(@fallback_policy) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/java_thread_pool_executor.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/java_thread_pool_executor.rb new file mode 100644 index 000000000000..e67066385e03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/java_thread_pool_executor.rb @@ -0,0 +1,136 @@ +if Concurrent.on_jruby? + + require 'concurrent/executor/java_executor_service' + + module Concurrent + + # @!macro thread_pool_executor + # @!macro thread_pool_options + # @!visibility private + class JavaThreadPoolExecutor < JavaExecutorService + + # @!macro thread_pool_executor_constant_default_max_pool_size + DEFAULT_MAX_POOL_SIZE = java.lang.Integer::MAX_VALUE # 2147483647 + + # @!macro thread_pool_executor_constant_default_min_pool_size + DEFAULT_MIN_POOL_SIZE = 0 + + # @!macro thread_pool_executor_constant_default_max_queue_size + DEFAULT_MAX_QUEUE_SIZE = 0 + + # @!macro thread_pool_executor_constant_default_thread_timeout + DEFAULT_THREAD_IDLETIMEOUT = 60 + + # @!macro thread_pool_executor_constant_default_synchronous + DEFAULT_SYNCHRONOUS = false + + # @!macro thread_pool_executor_attr_reader_max_length + attr_reader :max_length + + # @!macro thread_pool_executor_attr_reader_max_queue + attr_reader :max_queue + + # @!macro thread_pool_executor_attr_reader_synchronous + attr_reader :synchronous + + # @!macro thread_pool_executor_method_initialize + def initialize(opts = {}) + super(opts) + end + + # @!macro executor_service_method_can_overflow_question + def can_overflow? + @max_queue != 0 + end + + # @!macro thread_pool_executor_attr_reader_min_length + def min_length + @executor.getCorePoolSize + end + + # @!macro thread_pool_executor_attr_reader_max_length + def max_length + @executor.getMaximumPoolSize + end + + # @!macro thread_pool_executor_attr_reader_length + def length + @executor.getPoolSize + end + + # @!macro thread_pool_executor_attr_reader_largest_length + def largest_length + @executor.getLargestPoolSize + end + + # @!macro thread_pool_executor_attr_reader_scheduled_task_count + def scheduled_task_count + @executor.getTaskCount + end + + # @!macro thread_pool_executor_attr_reader_completed_task_count + def completed_task_count + @executor.getCompletedTaskCount + end + + # @!macro thread_pool_executor_attr_reader_idletime + def idletime + @executor.getKeepAliveTime(java.util.concurrent.TimeUnit::SECONDS) + end + + # @!macro thread_pool_executor_attr_reader_queue_length + def queue_length + @executor.getQueue.size + end + + # @!macro thread_pool_executor_attr_reader_remaining_capacity + def remaining_capacity + @max_queue == 0 ? -1 : @executor.getQueue.remainingCapacity + end + + # @!macro executor_service_method_running_question + def running? + super && !@executor.isTerminating + end + + private + + def ns_initialize(opts) + min_length = opts.fetch(:min_threads, DEFAULT_MIN_POOL_SIZE).to_i + max_length = opts.fetch(:max_threads, DEFAULT_MAX_POOL_SIZE).to_i + idletime = opts.fetch(:idletime, DEFAULT_THREAD_IDLETIMEOUT).to_i + @max_queue = opts.fetch(:max_queue, DEFAULT_MAX_QUEUE_SIZE).to_i + @synchronous = opts.fetch(:synchronous, DEFAULT_SYNCHRONOUS) + @fallback_policy = opts.fetch(:fallback_policy, :abort) + + raise ArgumentError.new("`synchronous` cannot be set unless `max_queue` is 0") if @synchronous && @max_queue > 0 + raise ArgumentError.new("`max_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if max_length < DEFAULT_MIN_POOL_SIZE + raise ArgumentError.new("`max_threads` cannot be greater than #{DEFAULT_MAX_POOL_SIZE}") if max_length > DEFAULT_MAX_POOL_SIZE + raise ArgumentError.new("`min_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if min_length < DEFAULT_MIN_POOL_SIZE + raise ArgumentError.new("`min_threads` cannot be more than `max_threads`") if min_length > max_length + raise ArgumentError.new("#{fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICY_CLASSES.include?(@fallback_policy) + + if @max_queue == 0 + if @synchronous + queue = java.util.concurrent.SynchronousQueue.new + else + queue = java.util.concurrent.LinkedBlockingQueue.new + end + else + queue = java.util.concurrent.LinkedBlockingQueue.new(@max_queue) + end + + @executor = java.util.concurrent.ThreadPoolExecutor.new( + min_length, + max_length, + idletime, + java.util.concurrent.TimeUnit::SECONDS, + queue, + DaemonThreadFactory.new(ns_auto_terminate?), + FALLBACK_POLICY_CLASSES[@fallback_policy].new) + + end + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/ruby_executor_service.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/ruby_executor_service.rb new file mode 100644 index 000000000000..06658d376910 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/ruby_executor_service.rb @@ -0,0 +1,76 @@ +require 'concurrent/executor/abstract_executor_service' +require 'concurrent/atomic/event' + +module Concurrent + + # @!macro abstract_executor_service_public_api + # @!visibility private + class RubyExecutorService < AbstractExecutorService + safe_initialization! + + def initialize(*args, &block) + super + @StopEvent = Event.new + @StoppedEvent = Event.new + end + + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + synchronize do + # If the executor is shut down, reject this task + return handle_fallback(*args, &task) unless running? + ns_execute(*args, &task) + true + end + end + + def shutdown + synchronize do + break unless running? + stop_event.set + ns_shutdown_execution + end + true + end + + def kill + synchronize do + break if shutdown? + stop_event.set + ns_kill_execution + stopped_event.set + end + true + end + + def wait_for_termination(timeout = nil) + stopped_event.wait(timeout) + end + + private + + def stop_event + @StopEvent + end + + def stopped_event + @StoppedEvent + end + + def ns_shutdown_execution + stopped_event.set + end + + def ns_running? + !stop_event.set? + end + + def ns_shuttingdown? + !(ns_running? || ns_shutdown?) + end + + def ns_shutdown? + stopped_event.set? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/ruby_single_thread_executor.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/ruby_single_thread_executor.rb new file mode 100644 index 000000000000..916337d4baad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/ruby_single_thread_executor.rb @@ -0,0 +1,21 @@ +require 'concurrent/executor/ruby_thread_pool_executor' + +module Concurrent + + # @!macro single_thread_executor + # @!macro abstract_executor_service_public_api + # @!visibility private + class RubySingleThreadExecutor < RubyThreadPoolExecutor + + # @!macro single_thread_executor_method_initialize + def initialize(opts = {}) + super( + min_threads: 1, + max_threads: 1, + max_queue: 0, + idletime: DEFAULT_THREAD_IDLETIMEOUT, + fallback_policy: opts.fetch(:fallback_policy, :discard), + ) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb new file mode 100644 index 000000000000..dc20d765b0b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb @@ -0,0 +1,377 @@ +require 'thread' +require 'concurrent/atomic/event' +require 'concurrent/concern/logging' +require 'concurrent/executor/ruby_executor_service' +require 'concurrent/utility/monotonic_time' + +module Concurrent + + # @!macro thread_pool_executor + # @!macro thread_pool_options + # @!visibility private + class RubyThreadPoolExecutor < RubyExecutorService + + # @!macro thread_pool_executor_constant_default_max_pool_size + DEFAULT_MAX_POOL_SIZE = 2_147_483_647 # java.lang.Integer::MAX_VALUE + + # @!macro thread_pool_executor_constant_default_min_pool_size + DEFAULT_MIN_POOL_SIZE = 0 + + # @!macro thread_pool_executor_constant_default_max_queue_size + DEFAULT_MAX_QUEUE_SIZE = 0 + + # @!macro thread_pool_executor_constant_default_thread_timeout + DEFAULT_THREAD_IDLETIMEOUT = 60 + + # @!macro thread_pool_executor_constant_default_synchronous + DEFAULT_SYNCHRONOUS = false + + # @!macro thread_pool_executor_attr_reader_max_length + attr_reader :max_length + + # @!macro thread_pool_executor_attr_reader_min_length + attr_reader :min_length + + # @!macro thread_pool_executor_attr_reader_idletime + attr_reader :idletime + + # @!macro thread_pool_executor_attr_reader_max_queue + attr_reader :max_queue + + # @!macro thread_pool_executor_attr_reader_synchronous + attr_reader :synchronous + + # @!macro thread_pool_executor_method_initialize + def initialize(opts = {}) + super(opts) + end + + # @!macro thread_pool_executor_attr_reader_largest_length + def largest_length + synchronize { @largest_length } + end + + # @!macro thread_pool_executor_attr_reader_scheduled_task_count + def scheduled_task_count + synchronize { @scheduled_task_count } + end + + # @!macro thread_pool_executor_attr_reader_completed_task_count + def completed_task_count + synchronize { @completed_task_count } + end + + # @!macro executor_service_method_can_overflow_question + def can_overflow? + synchronize { ns_limited_queue? } + end + + # @!macro thread_pool_executor_attr_reader_length + def length + synchronize { @pool.length } + end + + # @!macro thread_pool_executor_attr_reader_queue_length + def queue_length + synchronize { @queue.length } + end + + # @!macro thread_pool_executor_attr_reader_remaining_capacity + def remaining_capacity + synchronize do + if ns_limited_queue? + @max_queue - @queue.length + else + -1 + end + end + end + + # @!visibility private + def remove_busy_worker(worker) + synchronize { ns_remove_busy_worker worker } + end + + # @!visibility private + def ready_worker(worker) + synchronize { ns_ready_worker worker } + end + + # @!visibility private + def worker_not_old_enough(worker) + synchronize { ns_worker_not_old_enough worker } + end + + # @!visibility private + def worker_died(worker) + synchronize { ns_worker_died worker } + end + + # @!visibility private + def worker_task_completed + synchronize { @completed_task_count += 1 } + end + + private + + # @!visibility private + def ns_initialize(opts) + @min_length = opts.fetch(:min_threads, DEFAULT_MIN_POOL_SIZE).to_i + @max_length = opts.fetch(:max_threads, DEFAULT_MAX_POOL_SIZE).to_i + @idletime = opts.fetch(:idletime, DEFAULT_THREAD_IDLETIMEOUT).to_i + @max_queue = opts.fetch(:max_queue, DEFAULT_MAX_QUEUE_SIZE).to_i + @synchronous = opts.fetch(:synchronous, DEFAULT_SYNCHRONOUS) + @fallback_policy = opts.fetch(:fallback_policy, :abort) + + raise ArgumentError.new("`synchronous` cannot be set unless `max_queue` is 0") if @synchronous && @max_queue > 0 + raise ArgumentError.new("#{@fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICIES.include?(@fallback_policy) + raise ArgumentError.new("`max_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if @max_length < DEFAULT_MIN_POOL_SIZE + raise ArgumentError.new("`max_threads` cannot be greater than #{DEFAULT_MAX_POOL_SIZE}") if @max_length > DEFAULT_MAX_POOL_SIZE + raise ArgumentError.new("`min_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if @min_length < DEFAULT_MIN_POOL_SIZE + raise ArgumentError.new("`min_threads` cannot be more than `max_threads`") if min_length > max_length + + @pool = [] # all workers + @ready = [] # used as a stash (most idle worker is at the start) + @queue = [] # used as queue + # @ready or @queue is empty at all times + @scheduled_task_count = 0 + @completed_task_count = 0 + @largest_length = 0 + @workers_counter = 0 + @ruby_pid = $$ # detects if Ruby has forked + + @gc_interval = opts.fetch(:gc_interval, @idletime / 2.0).to_i # undocumented + @next_gc_time = Concurrent.monotonic_time + @gc_interval + end + + # @!visibility private + def ns_limited_queue? + @max_queue != 0 + end + + # @!visibility private + def ns_execute(*args, &task) + ns_reset_if_forked + + if ns_assign_worker(*args, &task) || ns_enqueue(*args, &task) + @scheduled_task_count += 1 + else + handle_fallback(*args, &task) + end + + ns_prune_pool if @next_gc_time < Concurrent.monotonic_time + end + + # @!visibility private + def ns_shutdown_execution + ns_reset_if_forked + + if @pool.empty? + # nothing to do + stopped_event.set + end + + if @queue.empty? + # no more tasks will be accepted, just stop all workers + @pool.each(&:stop) + end + end + + # @!visibility private + def ns_kill_execution + # TODO log out unprocessed tasks in queue + # TODO try to shutdown first? + @pool.each(&:kill) + @pool.clear + @ready.clear + end + + # tries to assign task to a worker, tries to get one from @ready or to create new one + # @return [true, false] if task is assigned to a worker + # + # @!visibility private + def ns_assign_worker(*args, &task) + # keep growing if the pool is not at the minimum yet + worker = (@ready.pop if @pool.size >= @min_length) || ns_add_busy_worker + if worker + worker << [task, args] + true + else + false + end + rescue ThreadError + # Raised when the operating system refuses to create the new thread + return false + end + + # tries to enqueue task + # @return [true, false] if enqueued + # + # @!visibility private + def ns_enqueue(*args, &task) + return false if @synchronous + + if !ns_limited_queue? || @queue.size < @max_queue + @queue << [task, args] + true + else + false + end + end + + # @!visibility private + def ns_worker_died(worker) + ns_remove_busy_worker worker + replacement_worker = ns_add_busy_worker + ns_ready_worker replacement_worker, false if replacement_worker + end + + # creates new worker which has to receive work to do after it's added + # @return [nil, Worker] nil of max capacity is reached + # + # @!visibility private + def ns_add_busy_worker + return if @pool.size >= @max_length + + @workers_counter += 1 + @pool << (worker = Worker.new(self, @workers_counter)) + @largest_length = @pool.length if @pool.length > @largest_length + worker + end + + # handle ready worker, giving it new job or assigning back to @ready + # + # @!visibility private + def ns_ready_worker(worker, success = true) + task_and_args = @queue.shift + if task_and_args + worker << task_and_args + else + # stop workers when !running?, do not return them to @ready + if running? + @ready.push(worker) + else + worker.stop + end + end + end + + # returns back worker to @ready which was not idle for enough time + # + # @!visibility private + def ns_worker_not_old_enough(worker) + # let's put workers coming from idle_test back to the start (as the oldest worker) + @ready.unshift(worker) + true + end + + # removes a worker which is not in not tracked in @ready + # + # @!visibility private + def ns_remove_busy_worker(worker) + @pool.delete(worker) + stopped_event.set if @pool.empty? && !running? + true + end + + # try oldest worker if it is idle for enough time, it's returned back at the start + # + # @!visibility private + def ns_prune_pool + return if @pool.size <= @min_length + + last_used = @ready.shift + last_used << :idle_test if last_used + + @next_gc_time = Concurrent.monotonic_time + @gc_interval + end + + def ns_reset_if_forked + if $$ != @ruby_pid + @queue.clear + @ready.clear + @pool.clear + @scheduled_task_count = 0 + @completed_task_count = 0 + @largest_length = 0 + @workers_counter = 0 + @ruby_pid = $$ + end + end + + # @!visibility private + class Worker + include Concern::Logging + + def initialize(pool, id) + # instance variables accessed only under pool's lock so no need to sync here again + @queue = Queue.new + @pool = pool + @thread = create_worker @queue, pool, pool.idletime + + if @thread.respond_to?(:name=) + @thread.name = [pool.name, 'worker', id].compact.join('-') + end + end + + def <<(message) + @queue << message + end + + def stop + @queue << :stop + end + + def kill + @thread.kill + end + + private + + def create_worker(queue, pool, idletime) + Thread.new(queue, pool, idletime) do |my_queue, my_pool, my_idletime| + last_message = Concurrent.monotonic_time + catch(:stop) do + loop do + + case message = my_queue.pop + when :idle_test + if (Concurrent.monotonic_time - last_message) > my_idletime + my_pool.remove_busy_worker(self) + throw :stop + else + my_pool.worker_not_old_enough(self) + end + + when :stop + my_pool.remove_busy_worker(self) + throw :stop + + else + task, args = message + run_task my_pool, task, args + last_message = Concurrent.monotonic_time + + my_pool.ready_worker(self) + end + end + end + end + end + + def run_task(pool, task, args) + task.call(*args) + pool.worker_task_completed + rescue => ex + # let it fail + log DEBUG, ex + rescue Exception => ex + log ERROR, ex + pool.worker_died(self) + throw :stop + end + end + + private_constant :Worker + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb new file mode 100644 index 000000000000..414aa641f519 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb @@ -0,0 +1,35 @@ +require 'concurrent/synchronization' + +module Concurrent + + # A simple utility class that executes a callable and returns and array of three elements: + # success - indicating if the callable has been executed without errors + # value - filled by the callable result if it has been executed without errors, nil otherwise + # reason - the error risen by the callable if it has been executed with errors, nil otherwise + class SafeTaskExecutor < Synchronization::LockableObject + + def initialize(task, opts = {}) + @task = task + @exception_class = opts.fetch(:rescue_exception, false) ? Exception : StandardError + super() # ensures visibility + end + + # @return [Array] + def execute(*args) + synchronize do + success = false + value = reason = nil + + begin + value = @task.call(*args) + success = true + rescue @exception_class => ex + reason = ex + success = false + end + + [success, value, reason] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/serial_executor_service.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/serial_executor_service.rb new file mode 100644 index 000000000000..f1c38ecfa9c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/serial_executor_service.rb @@ -0,0 +1,34 @@ +require 'concurrent/executor/executor_service' + +module Concurrent + + # Indicates that the including `ExecutorService` guarantees + # that all operations will occur in the order they are post and that no + # two operations may occur simultaneously. This module provides no + # functionality and provides no guarantees. That is the responsibility + # of the including class. This module exists solely to allow the including + # object to be interrogated for its serialization status. + # + # @example + # class Foo + # include Concurrent::SerialExecutor + # end + # + # foo = Foo.new + # + # foo.is_a? Concurrent::ExecutorService #=> true + # foo.is_a? Concurrent::SerialExecutor #=> true + # foo.serialized? #=> true + # + # @!visibility private + module SerialExecutorService + include ExecutorService + + # @!macro executor_service_method_serialized_question + # + # @note Always returns `true` + def serialized? + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb new file mode 100644 index 000000000000..d314e9061658 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb @@ -0,0 +1,107 @@ +require 'concurrent/errors' +require 'concurrent/concern/logging' +require 'concurrent/synchronization' + +module Concurrent + + # Ensures passed jobs in a serialized order never running at the same time. + class SerializedExecution < Synchronization::LockableObject + include Concern::Logging + + def initialize() + super() + synchronize { ns_initialize } + end + + Job = Struct.new(:executor, :args, :block) do + def call + block.call(*args) + end + end + + # Submit a task to the executor for asynchronous processing. + # + # @param [Executor] executor to be used for this job + # + # @param [Array] args zero or more arguments to be passed to the task + # + # @yield the asynchronous task to perform + # + # @return [Boolean] `true` if the task is queued, `false` if the executor + # is not running + # + # @raise [ArgumentError] if no task is given + def post(executor, *args, &task) + posts [[executor, args, task]] + true + end + + # As {#post} but allows to submit multiple tasks at once, it's guaranteed that they will not + # be interleaved by other tasks. + # + # @param [Array<Array(ExecutorService, Array<Object>, Proc)>] posts array of triplets where + # first is a {ExecutorService}, second is array of args for task, third is a task (Proc) + def posts(posts) + # if can_overflow? + # raise ArgumentError, 'SerializedExecution does not support thread-pools which can overflow' + # end + + return nil if posts.empty? + + jobs = posts.map { |executor, args, task| Job.new executor, args, task } + + job_to_post = synchronize do + if @being_executed + @stash.push(*jobs) + nil + else + @being_executed = true + @stash.push(*jobs[1..-1]) + jobs.first + end + end + + call_job job_to_post if job_to_post + true + end + + private + + def ns_initialize + @being_executed = false + @stash = [] + end + + def call_job(job) + did_it_run = begin + job.executor.post { work(job) } + true + rescue RejectedExecutionError => ex + false + end + + # TODO not the best idea to run it myself + unless did_it_run + begin + work job + rescue => ex + # let it fail + log DEBUG, ex + end + end + end + + # ensures next job is executed if any is stashed + def work(job) + job.call + ensure + synchronize do + job = @stash.shift || (@being_executed = false) + end + + # TODO maybe be able to tell caching pool to just enqueue this job, because the current one end at the end + # of this block + call_job job if job + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/serialized_execution_delegator.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/serialized_execution_delegator.rb new file mode 100644 index 000000000000..8197781b52f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/serialized_execution_delegator.rb @@ -0,0 +1,28 @@ +require 'delegate' +require 'concurrent/executor/serial_executor_service' +require 'concurrent/executor/serialized_execution' + +module Concurrent + + # A wrapper/delegator for any `ExecutorService` that + # guarantees serialized execution of tasks. + # + # @see [SimpleDelegator](http://www.ruby-doc.org/stdlib-2.1.2/libdoc/delegate/rdoc/SimpleDelegator.html) + # @see Concurrent::SerializedExecution + class SerializedExecutionDelegator < SimpleDelegator + include SerialExecutorService + + def initialize(executor) + @executor = executor + @serializer = SerializedExecution.new + super(executor) + end + + # @!macro executor_service_method_post + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + return false unless running? + @serializer.post(@executor, *args, &task) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb new file mode 100644 index 000000000000..b87fed5e0220 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb @@ -0,0 +1,100 @@ +require 'concurrent/atomics' +require 'concurrent/executor/executor_service' + +module Concurrent + + # An executor service in which every operation spawns a new, + # independently operating thread. + # + # This is perhaps the most inefficient executor service in this + # library. It exists mainly for testing an debugging. Thread creation + # and management is expensive in Ruby and this executor performs no + # resource pooling. This can be very beneficial during testing and + # debugging because it decouples the using code from the underlying + # executor implementation. In production this executor will likely + # lead to suboptimal performance. + # + # @note Intended for use primarily in testing and debugging. + class SimpleExecutorService < RubyExecutorService + + # @!macro executor_service_method_post + def self.post(*args) + raise ArgumentError.new('no block given') unless block_given? + Thread.new(*args) do + Thread.current.abort_on_exception = false + yield(*args) + end + true + end + + # @!macro executor_service_method_left_shift + def self.<<(task) + post(&task) + self + end + + # @!macro executor_service_method_post + def post(*args, &task) + raise ArgumentError.new('no block given') unless block_given? + return false unless running? + @count.increment + Thread.new(*args) do + Thread.current.abort_on_exception = false + begin + yield(*args) + ensure + @count.decrement + @stopped.set if @running.false? && @count.value == 0 + end + end + end + + # @!macro executor_service_method_left_shift + def <<(task) + post(&task) + self + end + + # @!macro executor_service_method_running_question + def running? + @running.true? + end + + # @!macro executor_service_method_shuttingdown_question + def shuttingdown? + @running.false? && ! @stopped.set? + end + + # @!macro executor_service_method_shutdown_question + def shutdown? + @stopped.set? + end + + # @!macro executor_service_method_shutdown + def shutdown + @running.make_false + @stopped.set if @count.value == 0 + true + end + + # @!macro executor_service_method_kill + def kill + @running.make_false + @stopped.set + true + end + + # @!macro executor_service_method_wait_for_termination + def wait_for_termination(timeout = nil) + @stopped.wait(timeout) + end + + private + + def ns_initialize(*args) + @running = Concurrent::AtomicBoolean.new(true) + @stopped = Concurrent::Event.new + @count = Concurrent::AtomicFixnum.new(0) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/single_thread_executor.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/single_thread_executor.rb new file mode 100644 index 000000000000..f1474ea9ff46 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/single_thread_executor.rb @@ -0,0 +1,57 @@ +require 'concurrent/utility/engine' +require 'concurrent/executor/ruby_single_thread_executor' + +module Concurrent + + if Concurrent.on_jruby? + require 'concurrent/executor/java_single_thread_executor' + end + + SingleThreadExecutorImplementation = case + when Concurrent.on_jruby? + JavaSingleThreadExecutor + else + RubySingleThreadExecutor + end + private_constant :SingleThreadExecutorImplementation + + # @!macro single_thread_executor + # + # A thread pool with a single thread an unlimited queue. Should the thread + # die for any reason it will be removed and replaced, thus ensuring that + # the executor will always remain viable and available to process jobs. + # + # A common pattern for background processing is to create a single thread + # on which an infinite loop is run. The thread's loop blocks on an input + # source (perhaps blocking I/O or a queue) and processes each input as it + # is received. This pattern has several issues. The thread itself is highly + # susceptible to errors during processing. Also, the thread itself must be + # constantly monitored and restarted should it die. `SingleThreadExecutor` + # encapsulates all these bahaviors. The task processor is highly resilient + # to errors from within tasks. Also, should the thread die it will + # automatically be restarted. + # + # The API and behavior of this class are based on Java's `SingleThreadExecutor`. + # + # @!macro abstract_executor_service_public_api + class SingleThreadExecutor < SingleThreadExecutorImplementation + + # @!macro single_thread_executor_method_initialize + # + # Create a new thread pool. + # + # @option opts [Symbol] :fallback_policy (:discard) the policy for handling new + # tasks that are received when the queue size has reached + # `max_queue` or the executor has shut down + # + # @raise [ArgumentError] if `:fallback_policy` is not one of the values specified + # in `FALLBACK_POLICIES` + # + # @see http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html + # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html + + # @!method initialize(opts = {}) + # @!macro single_thread_executor_method_initialize + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/thread_pool_executor.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/thread_pool_executor.rb new file mode 100644 index 000000000000..253d46a9d1d0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/thread_pool_executor.rb @@ -0,0 +1,88 @@ +require 'concurrent/utility/engine' +require 'concurrent/executor/ruby_thread_pool_executor' + +module Concurrent + + if Concurrent.on_jruby? + require 'concurrent/executor/java_thread_pool_executor' + end + + ThreadPoolExecutorImplementation = case + when Concurrent.on_jruby? + JavaThreadPoolExecutor + else + RubyThreadPoolExecutor + end + private_constant :ThreadPoolExecutorImplementation + + # @!macro thread_pool_executor + # + # An abstraction composed of one or more threads and a task queue. Tasks + # (blocks or `proc` objects) are submitted to the pool and added to the queue. + # The threads in the pool remove the tasks and execute them in the order + # they were received. + # + # A `ThreadPoolExecutor` will automatically adjust the pool size according + # to the bounds set by `min-threads` and `max-threads`. When a new task is + # submitted and fewer than `min-threads` threads are running, a new thread + # is created to handle the request, even if other worker threads are idle. + # If there are more than `min-threads` but less than `max-threads` threads + # running, a new thread will be created only if the queue is full. + # + # Threads that are idle for too long will be garbage collected, down to the + # configured minimum options. Should a thread crash it, too, will be garbage collected. + # + # `ThreadPoolExecutor` is based on the Java class of the same name. From + # the official Java documentation; + # + # > Thread pools address two different problems: they usually provide + # > improved performance when executing large numbers of asynchronous tasks, + # > due to reduced per-task invocation overhead, and they provide a means + # > of bounding and managing the resources, including threads, consumed + # > when executing a collection of tasks. Each ThreadPoolExecutor also + # > maintains some basic statistics, such as the number of completed tasks. + # > + # > To be useful across a wide range of contexts, this class provides many + # > adjustable parameters and extensibility hooks. However, programmers are + # > urged to use the more convenient Executors factory methods + # > [CachedThreadPool] (unbounded thread pool, with automatic thread reclamation), + # > [FixedThreadPool] (fixed size thread pool) and [SingleThreadExecutor] (single + # > background thread), that preconfigure settings for the most common usage + # > scenarios. + # + # @!macro thread_pool_options + # + # @!macro thread_pool_executor_public_api + class ThreadPoolExecutor < ThreadPoolExecutorImplementation + + # @!macro thread_pool_executor_method_initialize + # + # Create a new thread pool. + # + # @param [Hash] opts the options which configure the thread pool. + # + # @option opts [Integer] :max_threads (DEFAULT_MAX_POOL_SIZE) the maximum + # number of threads to be created + # @option opts [Integer] :min_threads (DEFAULT_MIN_POOL_SIZE) When a new task is submitted + # and fewer than `min_threads` are running, a new thread is created + # @option opts [Integer] :idletime (DEFAULT_THREAD_IDLETIMEOUT) the maximum + # number of seconds a thread may be idle before being reclaimed + # @option opts [Integer] :max_queue (DEFAULT_MAX_QUEUE_SIZE) the maximum + # number of tasks allowed in the work queue at any one time; a value of + # zero means the queue may grow without bound + # @option opts [Symbol] :fallback_policy (:abort) the policy for handling new + # tasks that are received when the queue size has reached + # `max_queue` or the executor has shut down + # @option opts [Boolean] :synchronous (DEFAULT_SYNCHRONOUS) whether or not a value of 0 + # for :max_queue means the queue must perform direct hand-off rather than unbounded. + # @raise [ArgumentError] if `:max_threads` is less than one + # @raise [ArgumentError] if `:min_threads` is less than zero + # @raise [ArgumentError] if `:fallback_policy` is not one of the values specified + # in `FALLBACK_POLICIES` + # + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html + + # @!method initialize(opts = {}) + # @!macro thread_pool_executor_method_initialize + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/timer_set.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/timer_set.rb new file mode 100644 index 000000000000..0dfaf1288c19 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executor/timer_set.rb @@ -0,0 +1,172 @@ +require 'concurrent/scheduled_task' +require 'concurrent/atomic/event' +require 'concurrent/collection/non_concurrent_priority_queue' +require 'concurrent/executor/executor_service' +require 'concurrent/executor/single_thread_executor' + +require 'concurrent/options' + +module Concurrent + + # Executes a collection of tasks, each after a given delay. A master task + # monitors the set and schedules each task for execution at the appropriate + # time. Tasks are run on the global thread pool or on the supplied executor. + # Each task is represented as a `ScheduledTask`. + # + # @see Concurrent::ScheduledTask + # + # @!macro monotonic_clock_warning + class TimerSet < RubyExecutorService + + # Create a new set of timed tasks. + # + # @!macro executor_options + # + # @param [Hash] opts the options used to specify the executor on which to perform actions + # @option opts [Executor] :executor when set use the given `Executor` instance. + # Three special values are also supported: `:task` returns the global task pool, + # `:operation` returns the global operation pool, and `:immediate` returns a new + # `ImmediateExecutor` object. + def initialize(opts = {}) + super(opts) + end + + # Post a task to be execute run after a given delay (in seconds). If the + # delay is less than 1/100th of a second the task will be immediately post + # to the executor. + # + # @param [Float] delay the number of seconds to wait for before executing the task. + # @param [Array<Object>] args the arguments passed to the task on execution. + # + # @yield the task to be performed. + # + # @return [Concurrent::ScheduledTask, false] IVar representing the task if the post + # is successful; false after shutdown. + # + # @raise [ArgumentError] if the intended execution time is not in the future. + # @raise [ArgumentError] if no block is given. + def post(delay, *args, &task) + raise ArgumentError.new('no block given') unless block_given? + return false unless running? + opts = { executor: @task_executor, + args: args, + timer_set: self } + task = ScheduledTask.execute(delay, opts, &task) # may raise exception + task.unscheduled? ? false : task + end + + # Begin an immediate shutdown. In-progress tasks will be allowed to + # complete but enqueued tasks will be dismissed and no new tasks + # will be accepted. Has no additional effect if the thread pool is + # not running. + def kill + shutdown + end + + private :<< + + private + + # Initialize the object. + # + # @param [Hash] opts the options to create the object with. + # @!visibility private + def ns_initialize(opts) + @queue = Collection::NonConcurrentPriorityQueue.new(order: :min) + @task_executor = Options.executor_from_options(opts) || Concurrent.global_io_executor + @timer_executor = SingleThreadExecutor.new + @condition = Event.new + @ruby_pid = $$ # detects if Ruby has forked + end + + # Post the task to the internal queue. + # + # @note This is intended as a callback method from ScheduledTask + # only. It is not intended to be used directly. Post a task + # by using the `SchedulesTask#execute` method. + # + # @!visibility private + def post_task(task) + synchronize { ns_post_task(task) } + end + + # @!visibility private + def ns_post_task(task) + return false unless ns_running? + ns_reset_if_forked + if (task.initial_delay) <= 0.01 + task.executor.post { task.process_task } + else + @queue.push(task) + # only post the process method when the queue is empty + @timer_executor.post(&method(:process_tasks)) if @queue.length == 1 + @condition.set + end + true + end + + # Remove the given task from the queue. + # + # @note This is intended as a callback method from `ScheduledTask` + # only. It is not intended to be used directly. Cancel a task + # by using the `ScheduledTask#cancel` method. + # + # @!visibility private + def remove_task(task) + synchronize { @queue.delete(task) } + end + + # `ExecutorService` callback called during shutdown. + # + # @!visibility private + def ns_shutdown_execution + ns_reset_if_forked + @queue.clear + @timer_executor.kill + stopped_event.set + end + + def ns_reset_if_forked + if $$ != @ruby_pid + @queue.clear + @condition.reset + @ruby_pid = $$ + end + end + + # Run a loop and execute tasks in the scheduled order and at the approximate + # scheduled time. If no tasks remain the thread will exit gracefully so that + # garbage collection can occur. If there are no ready tasks it will sleep + # for up to 60 seconds waiting for the next scheduled task. + # + # @!visibility private + def process_tasks + loop do + task = synchronize { @condition.reset; @queue.peek } + break unless task + + now = Concurrent.monotonic_time + diff = task.schedule_time - now + + if diff <= 0 + # We need to remove the task from the queue before passing + # it to the executor, to avoid race conditions where we pass + # the peek'ed task to the executor and then pop a different + # one that's been added in the meantime. + # + # Note that there's no race condition between the peek and + # this pop - this pop could retrieve a different task from + # the peek, but that task would be due to fire now anyway + # (because @queue is a priority queue, and this thread is + # the only reader, so whatever timer is at the head of the + # queue now must have the same pop time, or a closer one, as + # when we peeked). + task = synchronize { @queue.pop } + task.executor.post { task.process_task } + else + @condition.wait([diff, 60].min) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executors.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executors.rb new file mode 100644 index 000000000000..eb1972ce697a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/executors.rb @@ -0,0 +1,20 @@ +require 'concurrent/executor/abstract_executor_service' +require 'concurrent/executor/cached_thread_pool' +require 'concurrent/executor/executor_service' +require 'concurrent/executor/fixed_thread_pool' +require 'concurrent/executor/immediate_executor' +require 'concurrent/executor/indirect_immediate_executor' +require 'concurrent/executor/java_executor_service' +require 'concurrent/executor/java_single_thread_executor' +require 'concurrent/executor/java_thread_pool_executor' +require 'concurrent/executor/ruby_executor_service' +require 'concurrent/executor/ruby_single_thread_executor' +require 'concurrent/executor/ruby_thread_pool_executor' +require 'concurrent/executor/cached_thread_pool' +require 'concurrent/executor/safe_task_executor' +require 'concurrent/executor/serial_executor_service' +require 'concurrent/executor/serialized_execution' +require 'concurrent/executor/serialized_execution_delegator' +require 'concurrent/executor/single_thread_executor' +require 'concurrent/executor/thread_pool_executor' +require 'concurrent/executor/timer_set' diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/future.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/future.rb new file mode 100644 index 000000000000..1af182ecb280 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/future.rb @@ -0,0 +1,141 @@ +require 'thread' +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/ivar' +require 'concurrent/executor/safe_task_executor' + +require 'concurrent/options' + +# TODO (pitr-ch 14-Mar-2017): deprecate, Future, Promise, etc. + + +module Concurrent + + # {include:file:docs-source/future.md} + # + # @!macro copy_options + # + # @see http://ruby-doc.org/stdlib-2.1.1/libdoc/observer/rdoc/Observable.html Ruby Observable module + # @see http://clojuredocs.org/clojure_core/clojure.core/future Clojure's future function + # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html java.util.concurrent.Future + class Future < IVar + + # Create a new `Future` in the `:unscheduled` state. + # + # @yield the asynchronous operation to perform + # + # @!macro executor_and_deref_options + # + # @option opts [object, Array] :args zero or more arguments to be passed the task + # block on execution + # + # @raise [ArgumentError] if no block is given + def initialize(opts = {}, &block) + raise ArgumentError.new('no block given') unless block_given? + super(NULL, opts.merge(__task_from_block__: block), &nil) + end + + # Execute an `:unscheduled` `Future`. Immediately sets the state to `:pending` and + # passes the block to a new thread/thread pool for eventual execution. + # Does nothing if the `Future` is in any state other than `:unscheduled`. + # + # @return [Future] a reference to `self` + # + # @example Instance and execute in separate steps + # future = Concurrent::Future.new{ sleep(1); 42 } + # future.state #=> :unscheduled + # future.execute + # future.state #=> :pending + # + # @example Instance and execute in one line + # future = Concurrent::Future.new{ sleep(1); 42 }.execute + # future.state #=> :pending + def execute + if compare_and_set_state(:pending, :unscheduled) + @executor.post{ safe_execute(@task, @args) } + self + end + end + + # Create a new `Future` object with the given block, execute it, and return the + # `:pending` object. + # + # @yield the asynchronous operation to perform + # + # @!macro executor_and_deref_options + # + # @option opts [object, Array] :args zero or more arguments to be passed the task + # block on execution + # + # @raise [ArgumentError] if no block is given + # + # @return [Future] the newly created `Future` in the `:pending` state + # + # @example + # future = Concurrent::Future.execute{ sleep(1); 42 } + # future.state #=> :pending + def self.execute(opts = {}, &block) + Future.new(opts, &block).execute + end + + # @!macro ivar_set_method + def set(value = NULL, &block) + check_for_block_or_value!(block_given?, value) + synchronize do + if @state != :unscheduled + raise MultipleAssignmentError + else + @task = block || Proc.new { value } + end + end + execute + end + + # Attempt to cancel the operation if it has not already processed. + # The operation can only be cancelled while still `pending`. It cannot + # be cancelled once it has begun processing or has completed. + # + # @return [Boolean] was the operation successfully cancelled. + def cancel + if compare_and_set_state(:cancelled, :pending) + complete(false, nil, CancelledOperationError.new) + true + else + false + end + end + + # Has the operation been successfully cancelled? + # + # @return [Boolean] + def cancelled? + state == :cancelled + end + + # Wait the given number of seconds for the operation to complete. + # On timeout attempt to cancel the operation. + # + # @param [Numeric] timeout the maximum time in seconds to wait. + # @return [Boolean] true if the operation completed before the timeout + # else false + def wait_or_cancel(timeout) + wait(timeout) + if complete? + true + else + cancel + false + end + end + + protected + + def ns_initialize(value, opts) + super + @state = :unscheduled + @task = opts[:__task_from_block__] + @executor = Options.executor_from_options(opts) || Concurrent.global_io_executor + @args = get_arguments_from(opts) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/hash.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/hash.rb new file mode 100644 index 000000000000..92df66b790bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/hash.rb @@ -0,0 +1,59 @@ +require 'concurrent/utility/engine' +require 'concurrent/thread_safe/util' + +module Concurrent + + # @!macro concurrent_hash + # + # A thread-safe subclass of Hash. This version locks against the object + # itself for every method call, ensuring only one thread can be reading + # or writing at a time. This includes iteration methods like `#each`, + # which takes the lock repeatedly when reading an item. + # + # @see http://ruby-doc.org/core/Hash.html Ruby standard library `Hash` + + # @!macro internal_implementation_note + HashImplementation = case + when Concurrent.on_cruby? + # Hash is thread-safe in practice because CRuby runs + # threads one at a time and does not do context + # switching during the execution of C functions. + ::Hash + + when Concurrent.on_jruby? + require 'jruby/synchronized' + + class JRubyHash < ::Hash + include JRuby::Synchronized + end + JRubyHash + + when Concurrent.on_rbx? + require 'monitor' + require 'concurrent/thread_safe/util/data_structures' + + class RbxHash < ::Hash + end + ThreadSafe::Util.make_synchronized_on_rbx RbxHash + RbxHash + + when Concurrent.on_truffleruby? + require 'concurrent/thread_safe/util/data_structures' + + class TruffleRubyHash < ::Hash + end + + ThreadSafe::Util.make_synchronized_on_truffleruby TruffleRubyHash + TruffleRubyHash + + else + warn 'Possibly unsupported Ruby implementation' + ::Hash + end + private_constant :HashImplementation + + # @!macro concurrent_hash + class Hash < HashImplementation + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/immutable_struct.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/immutable_struct.rb new file mode 100644 index 000000000000..d2755951f5b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/immutable_struct.rb @@ -0,0 +1,101 @@ +require 'concurrent/synchronization/abstract_struct' +require 'concurrent/synchronization' + +module Concurrent + + # A thread-safe, immutable variation of Ruby's standard `Struct`. + # + # @see http://ruby-doc.org/core/Struct.html Ruby standard library `Struct` + module ImmutableStruct + include Synchronization::AbstractStruct + + def self.included(base) + base.safe_initialization! + end + + # @!macro struct_values + def values + ns_values + end + + alias_method :to_a, :values + + # @!macro struct_values_at + def values_at(*indexes) + ns_values_at(indexes) + end + + # @!macro struct_inspect + def inspect + ns_inspect + end + + alias_method :to_s, :inspect + + # @!macro struct_merge + def merge(other, &block) + ns_merge(other, &block) + end + + # @!macro struct_to_h + def to_h + ns_to_h + end + + # @!macro struct_get + def [](member) + ns_get(member) + end + + # @!macro struct_equality + def ==(other) + ns_equality(other) + end + + # @!macro struct_each + def each(&block) + return enum_for(:each) unless block_given? + ns_each(&block) + end + + # @!macro struct_each_pair + def each_pair(&block) + return enum_for(:each_pair) unless block_given? + ns_each_pair(&block) + end + + # @!macro struct_select + def select(&block) + return enum_for(:select) unless block_given? + ns_select(&block) + end + + private + + # @!visibility private + def initialize_copy(original) + super(original) + ns_initialize_copy + end + + # @!macro struct_new + def self.new(*args, &block) + clazz_name = nil + if args.length == 0 + raise ArgumentError.new('wrong number of arguments (0 for 1+)') + elsif args.length > 0 && args.first.is_a?(String) + clazz_name = args.shift + end + FACTORY.define_struct(clazz_name, args, &block) + end + + FACTORY = Class.new(Synchronization::LockableObject) do + def define_struct(name, members, &block) + synchronize do + Synchronization::AbstractStruct.define_struct_class(ImmutableStruct, Synchronization::Object, name, members, &block) + end + end + end.new + private_constant :FACTORY + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/ivar.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/ivar.rb new file mode 100644 index 000000000000..2a724db4674f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/ivar.rb @@ -0,0 +1,207 @@ +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/collection/copy_on_write_observer_set' +require 'concurrent/concern/obligation' +require 'concurrent/concern/observable' +require 'concurrent/synchronization' + +module Concurrent + + # An `IVar` is like a future that you can assign. As a future is a value that + # is being computed that you can wait on, an `IVar` is a value that is waiting + # to be assigned, that you can wait on. `IVars` are single assignment and + # deterministic. + # + # Then, express futures as an asynchronous computation that assigns an `IVar`. + # The `IVar` becomes the primitive on which [futures](Future) and + # [dataflow](Dataflow) are built. + # + # An `IVar` is a single-element container that is normally created empty, and + # can only be set once. The I in `IVar` stands for immutable. Reading an + # `IVar` normally blocks until it is set. It is safe to set and read an `IVar` + # from different threads. + # + # If you want to have some parallel task set the value in an `IVar`, you want + # a `Future`. If you want to create a graph of parallel tasks all executed + # when the values they depend on are ready you want `dataflow`. `IVar` is + # generally a low-level primitive. + # + # ## Examples + # + # Create, set and get an `IVar` + # + # ```ruby + # ivar = Concurrent::IVar.new + # ivar.set 14 + # ivar.value #=> 14 + # ivar.set 2 # would now be an error + # ``` + # + # ## See Also + # + # 1. For the theory: Arvind, R. Nikhil, and K. Pingali. + # [I-Structures: Data structures for parallel computing](http://dl.acm.org/citation.cfm?id=69562). + # In Proceedings of Workshop on Graph Reduction, 1986. + # 2. For recent application: + # [DataDrivenFuture in Habanero Java from Rice](http://www.cs.rice.edu/~vs3/hjlib/doc/edu/rice/hj/api/HjDataDrivenFuture.html). + class IVar < Synchronization::LockableObject + include Concern::Obligation + include Concern::Observable + + # Create a new `IVar` in the `:pending` state with the (optional) initial value. + # + # @param [Object] value the initial value + # @param [Hash] opts the options to create a message with + # @option opts [String] :dup_on_deref (false) call `#dup` before returning + # the data + # @option opts [String] :freeze_on_deref (false) call `#freeze` before + # returning the data + # @option opts [String] :copy_on_deref (nil) call the given `Proc` passing + # the internal value and returning the value returned from the proc + def initialize(value = NULL, opts = {}, &block) + if value != NULL && block_given? + raise ArgumentError.new('provide only a value or a block') + end + super(&nil) + synchronize { ns_initialize(value, opts, &block) } + end + + # Add an observer on this object that will receive notification on update. + # + # Upon completion the `IVar` will notify all observers in a thread-safe way. + # The `func` method of the observer will be called with three arguments: the + # `Time` at which the `Future` completed the asynchronous operation, the + # final `value` (or `nil` on rejection), and the final `reason` (or `nil` on + # fulfillment). + # + # @param [Object] observer the object that will be notified of changes + # @param [Symbol] func symbol naming the method to call when this + # `Observable` has changes` + def add_observer(observer = nil, func = :update, &block) + raise ArgumentError.new('cannot provide both an observer and a block') if observer && block + direct_notification = false + + if block + observer = block + func = :call + end + + synchronize do + if event.set? + direct_notification = true + else + observers.add_observer(observer, func) + end + end + + observer.send(func, Time.now, self.value, reason) if direct_notification + observer + end + + # @!macro ivar_set_method + # Set the `IVar` to a value and wake or notify all threads waiting on it. + # + # @!macro ivar_set_parameters_and_exceptions + # @param [Object] value the value to store in the `IVar` + # @yield A block operation to use for setting the value + # @raise [ArgumentError] if both a value and a block are given + # @raise [Concurrent::MultipleAssignmentError] if the `IVar` has already + # been set or otherwise completed + # + # @return [IVar] self + def set(value = NULL) + check_for_block_or_value!(block_given?, value) + raise MultipleAssignmentError unless compare_and_set_state(:processing, :pending) + + begin + value = yield if block_given? + complete_without_notification(true, value, nil) + rescue => ex + complete_without_notification(false, nil, ex) + end + + notify_observers(self.value, reason) + self + end + + # @!macro ivar_fail_method + # Set the `IVar` to failed due to some error and wake or notify all threads waiting on it. + # + # @param [Object] reason for the failure + # @raise [Concurrent::MultipleAssignmentError] if the `IVar` has already + # been set or otherwise completed + # @return [IVar] self + def fail(reason = StandardError.new) + complete(false, nil, reason) + end + + # Attempt to set the `IVar` with the given value or block. Return a + # boolean indicating the success or failure of the set operation. + # + # @!macro ivar_set_parameters_and_exceptions + # + # @return [Boolean] true if the value was set else false + def try_set(value = NULL, &block) + set(value, &block) + true + rescue MultipleAssignmentError + false + end + + protected + + # @!visibility private + def ns_initialize(value, opts) + value = yield if block_given? + init_obligation + self.observers = Collection::CopyOnWriteObserverSet.new + set_deref_options(opts) + + @state = :pending + if value != NULL + ns_complete_without_notification(true, value, nil) + end + end + + # @!visibility private + def safe_execute(task, args = []) + if compare_and_set_state(:processing, :pending) + success, val, reason = SafeTaskExecutor.new(task, rescue_exception: true).execute(*@args) + complete(success, val, reason) + yield(success, val, reason) if block_given? + end + end + + # @!visibility private + def complete(success, value, reason) + complete_without_notification(success, value, reason) + notify_observers(self.value, reason) + self + end + + # @!visibility private + def complete_without_notification(success, value, reason) + synchronize { ns_complete_without_notification(success, value, reason) } + self + end + + # @!visibility private + def notify_observers(value, reason) + observers.notify_and_delete_observers{ [Time.now, value, reason] } + end + + # @!visibility private + def ns_complete_without_notification(success, value, reason) + raise MultipleAssignmentError if [:fulfilled, :rejected].include? @state + set_state(success, value, reason) + event.set + end + + # @!visibility private + def check_for_block_or_value!(block_given, value) # :nodoc: + if (block_given && value != NULL) || (! block_given && value == NULL) + raise ArgumentError.new('must set with either a value or a block') + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/map.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/map.rb new file mode 100644 index 000000000000..3967cbf19581 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/map.rb @@ -0,0 +1,337 @@ +require 'thread' +require 'concurrent/constants' +require 'concurrent/synchronization' +require 'concurrent/utility/engine' + +module Concurrent + # @!visibility private + module Collection + + # @!visibility private + MapImplementation = case + when Concurrent.on_jruby? + # noinspection RubyResolve + JRubyMapBackend + when Concurrent.on_cruby? + require 'concurrent/collection/map/mri_map_backend' + MriMapBackend + when Concurrent.on_rbx? || Concurrent.on_truffleruby? + require 'concurrent/collection/map/atomic_reference_map_backend' + AtomicReferenceMapBackend + else + warn 'Concurrent::Map: unsupported Ruby engine, using a fully synchronized Concurrent::Map implementation' + require 'concurrent/collection/map/synchronized_map_backend' + SynchronizedMapBackend + end + end + + # `Concurrent::Map` is a hash-like object and should have much better performance + # characteristics, especially under high concurrency, than `Concurrent::Hash`. + # However, `Concurrent::Map `is not strictly semantically equivalent to a ruby `Hash` + # -- for instance, it does not necessarily retain ordering by insertion time as `Hash` + # does. For most uses it should do fine though, and we recommend you consider + # `Concurrent::Map` instead of `Concurrent::Hash` for your concurrency-safe hash needs. + class Map < Collection::MapImplementation + + # @!macro map.atomic_method + # This method is atomic. + + # @!macro map.atomic_method_with_block + # This method is atomic. + # @note Atomic methods taking a block do not allow the `self` instance + # to be used within the block. Doing so will cause a deadlock. + + # @!method compute_if_absent(key) + # Compute and store new value for key if the key is absent. + # @param [Object] key + # @yield new value + # @yieldreturn [Object] new value + # @return [Object] new value or current value + # @!macro map.atomic_method_with_block + + # @!method compute_if_present(key) + # Compute and store new value for key if the key is present. + # @param [Object] key + # @yield new value + # @yieldparam old_value [Object] + # @yieldreturn [Object, nil] new value, when nil the key is removed + # @return [Object, nil] new value or nil + # @!macro map.atomic_method_with_block + + # @!method compute(key) + # Compute and store new value for key. + # @param [Object] key + # @yield compute new value from old one + # @yieldparam old_value [Object, nil] old_value, or nil when key is absent + # @yieldreturn [Object, nil] new value, when nil the key is removed + # @return [Object, nil] new value or nil + # @!macro map.atomic_method_with_block + + # @!method merge_pair(key, value) + # If the key is absent, the value is stored, otherwise new value is + # computed with a block. + # @param [Object] key + # @param [Object] value + # @yield compute new value from old one + # @yieldparam old_value [Object] old value + # @yieldreturn [Object, nil] new value, when nil the key is removed + # @return [Object, nil] new value or nil + # @!macro map.atomic_method_with_block + + # @!method replace_pair(key, old_value, new_value) + # Replaces old_value with new_value if key exists and current value + # matches old_value + # @param [Object] key + # @param [Object] old_value + # @param [Object] new_value + # @return [true, false] true if replaced + # @!macro map.atomic_method + + # @!method replace_if_exists(key, new_value) + # Replaces current value with new_value if key exists + # @param [Object] key + # @param [Object] new_value + # @return [Object, nil] old value or nil + # @!macro map.atomic_method + + # @!method get_and_set(key, value) + # Get the current value under key and set new value. + # @param [Object] key + # @param [Object] value + # @return [Object, nil] old value or nil when the key was absent + # @!macro map.atomic_method + + # @!method delete(key) + # Delete key and its value. + # @param [Object] key + # @return [Object, nil] old value or nil when the key was absent + # @!macro map.atomic_method + + # @!method delete_pair(key, value) + # Delete pair and its value if current value equals the provided value. + # @param [Object] key + # @param [Object] value + # @return [true, false] true if deleted + # @!macro map.atomic_method + + + def initialize(options = nil, &block) + if options.kind_of?(::Hash) + validate_options_hash!(options) + else + options = nil + end + + super(options) + @default_proc = block + end + + # Get a value with key + # @param [Object] key + # @return [Object] the value + def [](key) + if value = super # non-falsy value is an existing mapping, return it right away + value + # re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call + # a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value + # would be returned) + # note: nil == value check is not technically necessary + elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL)) + @default_proc.call(self, key) + else + value + end + end + + alias_method :get, :[] + # TODO (pitr-ch 30-Oct-2018): doc + alias_method :put, :[]= + + # Get a value with key, or default_value when key is absent, + # or fail when no default_value is given. + # @param [Object] key + # @param [Object] default_value + # @yield default value for a key + # @yieldparam key [Object] + # @yieldreturn [Object] default value + # @return [Object] the value or default value + # @raise [KeyError] when key is missing and no default_value is provided + # @!macro map_method_not_atomic + # @note The "fetch-then-act" methods of `Map` are not atomic. `Map` is intended + # to be use as a concurrency primitive with strong happens-before + # guarantees. It is not intended to be used as a high-level abstraction + # supporting complex operations. All read and write operations are + # thread safe, but no guarantees are made regarding race conditions + # between the fetch operation and yielding to the block. Additionally, + # this method does not support recursion. This is due to internal + # constraints that are very unlikely to change in the near future. + def fetch(key, default_value = NULL) + if NULL != (value = get_or_default(key, NULL)) + value + elsif block_given? + yield key + elsif NULL != default_value + default_value + else + raise_fetch_no_key + end + end + + # Fetch value with key, or store default value when key is absent, + # or fail when no default_value is given. This is a two step operation, + # therefore not atomic. The store can overwrite other concurrently + # stored value. + # @param [Object] key + # @param [Object] default_value + # @yield default value for a key + # @yieldparam key [Object] + # @yieldreturn [Object] default value + # @return [Object] the value or default value + # @!macro map.atomic_method_with_block + def fetch_or_store(key, default_value = NULL) + fetch(key) do + put(key, block_given? ? yield(key) : (NULL == default_value ? raise_fetch_no_key : default_value)) + end + end + + # Insert value into map with key if key is absent in one atomic step. + # @param [Object] key + # @param [Object] value + # @return [Object, nil] the previous value when key was present or nil when there was no key + def put_if_absent(key, value) + computed = false + result = compute_if_absent(key) do + computed = true + value + end + computed ? nil : result + end unless method_defined?(:put_if_absent) + + # Is the value stored in the map. Iterates over all values. + # @param [Object] value + # @return [true, false] + def value?(value) + each_value do |v| + return true if value.equal?(v) + end + false + end + + # All keys + # @return [::Array<Object>] keys + def keys + arr = [] + each_pair { |k, v| arr << k } + arr + end unless method_defined?(:keys) + + # All values + # @return [::Array<Object>] values + def values + arr = [] + each_pair { |k, v| arr << v } + arr + end unless method_defined?(:values) + + # Iterates over each key. + # @yield for each key in the map + # @yieldparam key [Object] + # @return [self] + # @!macro map.atomic_method_with_block + def each_key + each_pair { |k, v| yield k } + end unless method_defined?(:each_key) + + # Iterates over each value. + # @yield for each value in the map + # @yieldparam value [Object] + # @return [self] + # @!macro map.atomic_method_with_block + def each_value + each_pair { |k, v| yield v } + end unless method_defined?(:each_value) + + # Iterates over each key value pair. + # @yield for each key value pair in the map + # @yieldparam key [Object] + # @yieldparam value [Object] + # @return [self] + # @!macro map.atomic_method_with_block + def each_pair + return enum_for :each_pair unless block_given? + super + end + + alias_method :each, :each_pair unless method_defined?(:each) + + # Find key of a value. + # @param [Object] value + # @return [Object, nil] key or nil when not found + def key(value) + each_pair { |k, v| return k if v == value } + nil + end unless method_defined?(:key) + alias_method :index, :key if RUBY_VERSION < '1.9' + + # Is map empty? + # @return [true, false] + def empty? + each_pair { |k, v| return false } + true + end unless method_defined?(:empty?) + + # The size of map. + # @return [Integer] size + def size + count = 0 + each_pair { |k, v| count += 1 } + count + end unless method_defined?(:size) + + # @!visibility private + def marshal_dump + raise TypeError, "can't dump hash with default proc" if @default_proc + h = {} + each_pair { |k, v| h[k] = v } + h + end + + # @!visibility private + def marshal_load(hash) + initialize + populate_from(hash) + end + + undef :freeze + + # @!visibility private + def inspect + format '%s entries=%d default_proc=%s>', to_s[0..-2], size.to_s, @default_proc.inspect + end + + private + + def raise_fetch_no_key + raise KeyError, 'key not found' + end + + def initialize_copy(other) + super + populate_from(other) + end + + def populate_from(hash) + hash.each_pair { |k, v| self[k] = v } + self + end + + def validate_options_hash!(options) + if (initial_capacity = options[:initial_capacity]) && (!initial_capacity.kind_of?(Integer) || initial_capacity < 0) + raise ArgumentError, ":initial_capacity must be a positive Integer" + end + if (load_factor = options[:load_factor]) && (!load_factor.kind_of?(Numeric) || load_factor <= 0 || load_factor > 1) + raise ArgumentError, ":load_factor must be a number between 0 and 1" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/maybe.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/maybe.rb new file mode 100644 index 000000000000..7ba3d3ebb56c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/maybe.rb @@ -0,0 +1,229 @@ +require 'concurrent/synchronization' + +module Concurrent + + # A `Maybe` encapsulates an optional value. A `Maybe` either contains a value + # of (represented as `Just`), or it is empty (represented as `Nothing`). Using + # `Maybe` is a good way to deal with errors or exceptional cases without + # resorting to drastic measures such as exceptions. + # + # `Maybe` is a replacement for the use of `nil` with better type checking. + # + # For compatibility with {Concurrent::Concern::Obligation} the predicate and + # accessor methods are aliased as `fulfilled?`, `rejected?`, `value`, and + # `reason`. + # + # ## Motivation + # + # A common pattern in languages with pattern matching, such as Erlang and + # Haskell, is to return *either* a value *or* an error from a function + # Consider this Erlang code: + # + # ```erlang + # case file:consult("data.dat") of + # {ok, Terms} -> do_something_useful(Terms); + # {error, Reason} -> lager:error(Reason) + # end. + # ``` + # + # In this example the standard library function `file:consult` returns a + # [tuple](http://erlang.org/doc/reference_manual/data_types.html#id69044) + # with two elements: an [atom](http://erlang.org/doc/reference_manual/data_types.html#id64134) + # (similar to a ruby symbol) and a variable containing ancillary data. On + # success it returns the atom `ok` and the data from the file. On failure it + # returns `error` and a string with an explanation of the problem. With this + # pattern there is no ambiguity regarding success or failure. If the file is + # empty the return value cannot be misinterpreted as an error. And when an + # error occurs the return value provides useful information. + # + # In Ruby we tend to return `nil` when an error occurs or else we raise an + # exception. Both of these idioms are problematic. Returning `nil` is + # ambiguous because `nil` may also be a valid value. It also lacks + # information pertaining to the nature of the error. Raising an exception + # is both expensive and usurps the normal flow of control. All of these + # problems can be solved with the use of a `Maybe`. + # + # A `Maybe` is unambiguous with regard to whether or not it contains a value. + # When `Just` it contains a value, when `Nothing` it does not. When `Just` + # the value it contains may be `nil`, which is perfectly valid. When + # `Nothing` the reason for the lack of a value is contained as well. The + # previous Erlang example can be duplicated in Ruby in a principled way by + # having functions return `Maybe` objects: + # + # ```ruby + # result = MyFileUtils.consult("data.dat") # returns a Maybe + # if result.just? + # do_something_useful(result.value) # or result.just + # else + # logger.error(result.reason) # or result.nothing + # end + # ``` + # + # @example Returning a Maybe from a Function + # module MyFileUtils + # def self.consult(path) + # file = File.open(path, 'r') + # Concurrent::Maybe.just(file.read) + # rescue => ex + # return Concurrent::Maybe.nothing(ex) + # ensure + # file.close if file + # end + # end + # + # maybe = MyFileUtils.consult('bogus.file') + # maybe.just? #=> false + # maybe.nothing? #=> true + # maybe.reason #=> #<Errno::ENOENT: No such file or directory @ rb_sysopen - bogus.file> + # + # maybe = MyFileUtils.consult('README.md') + # maybe.just? #=> true + # maybe.nothing? #=> false + # maybe.value #=> "# Concurrent Ruby\n[![Gem Version..." + # + # @example Using Maybe with a Block + # result = Concurrent::Maybe.from do + # Client.find(10) # Client is an ActiveRecord model + # end + # + # # -- if the record was found + # result.just? #=> true + # result.value #=> #<Client id: 10, first_name: "Ryan"> + # + # # -- if the record was not found + # result.just? #=> false + # result.reason #=> ActiveRecord::RecordNotFound + # + # @example Using Maybe with the Null Object Pattern + # # In a Rails controller... + # result = ClientService.new(10).find # returns a Maybe + # render json: result.or(NullClient.new) + # + # @see https://hackage.haskell.org/package/base-4.2.0.1/docs/Data-Maybe.html Haskell Data.Maybe + # @see https://github.com/purescript/purescript-maybe/blob/master/docs/Data.Maybe.md PureScript Data.Maybe + class Maybe < Synchronization::Object + include Comparable + safe_initialization! + + # Indicates that the given attribute has not been set. + # When `Just` the {#nothing} getter will return `NONE`. + # When `Nothing` the {#just} getter will return `NONE`. + NONE = ::Object.new.freeze + + # The value of a `Maybe` when `Just`. Will be `NONE` when `Nothing`. + attr_reader :just + + # The reason for the `Maybe` when `Nothing`. Will be `NONE` when `Just`. + attr_reader :nothing + + private_class_method :new + + # Create a new `Maybe` using the given block. + # + # Runs the given block passing all function arguments to the block as block + # arguments. If the block runs to completion without raising an exception + # a new `Just` is created with the value set to the return value of the + # block. If the block raises an exception a new `Nothing` is created with + # the reason being set to the raised exception. + # + # @param [Array<Object>] args Zero or more arguments to pass to the block. + # @yield The block from which to create a new `Maybe`. + # @yieldparam [Array<Object>] args Zero or more block arguments passed as + # arguments to the function. + # + # @return [Maybe] The newly created object. + # + # @raise [ArgumentError] when no block given. + def self.from(*args) + raise ArgumentError.new('no block given') unless block_given? + begin + value = yield(*args) + return new(value, NONE) + rescue => ex + return new(NONE, ex) + end + end + + # Create a new `Just` with the given value. + # + # @param [Object] value The value to set for the new `Maybe` object. + # + # @return [Maybe] The newly created object. + def self.just(value) + return new(value, NONE) + end + + # Create a new `Nothing` with the given (optional) reason. + # + # @param [Exception] error The reason to set for the new `Maybe` object. + # When given a string a new `StandardError` will be created with the + # argument as the message. When no argument is given a new + # `StandardError` with an empty message will be created. + # + # @return [Maybe] The newly created object. + def self.nothing(error = '') + if error.is_a?(Exception) + nothing = error + else + nothing = StandardError.new(error.to_s) + end + return new(NONE, nothing) + end + + # Is this `Maybe` a `Just` (successfully fulfilled with a value)? + # + # @return [Boolean] True if `Just` or false if `Nothing`. + def just? + ! nothing? + end + alias :fulfilled? :just? + + # Is this `Maybe` a `nothing` (rejected with an exception upon fulfillment)? + # + # @return [Boolean] True if `Nothing` or false if `Just`. + def nothing? + @nothing != NONE + end + alias :rejected? :nothing? + + alias :value :just + + alias :reason :nothing + + # Comparison operator. + # + # @return [Integer] 0 if self and other are both `Nothing`; + # -1 if self is `Nothing` and other is `Just`; + # 1 if self is `Just` and other is nothing; + # `self.just <=> other.just` if both self and other are `Just`. + def <=>(other) + if nothing? + other.nothing? ? 0 : -1 + else + other.nothing? ? 1 : just <=> other.just + end + end + + # Return either the value of self or the given default value. + # + # @return [Object] The value of self when `Just`; else the given default. + def or(other) + just? ? just : other + end + + private + + # Create a new `Maybe` with the given attributes. + # + # @param [Object] just The value when `Just` else `NONE`. + # @param [Exception, Object] nothing The exception when `Nothing` else `NONE`. + # + # @return [Maybe] The new `Maybe`. + # + # @!visibility private + def initialize(just, nothing) + @just = just + @nothing = nothing + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/mutable_struct.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/mutable_struct.rb new file mode 100644 index 000000000000..55361e753f52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/mutable_struct.rb @@ -0,0 +1,239 @@ +require 'concurrent/synchronization/abstract_struct' +require 'concurrent/synchronization' + +module Concurrent + + # An thread-safe variation of Ruby's standard `Struct`. Values can be set at + # construction or safely changed at any time during the object's lifecycle. + # + # @see http://ruby-doc.org/core/Struct.html Ruby standard library `Struct` + module MutableStruct + include Synchronization::AbstractStruct + + # @!macro struct_new + # + # Factory for creating new struct classes. + # + # ``` + # new([class_name] [, member_name]+>) -> StructClass click to toggle source + # new([class_name] [, member_name]+>) {|StructClass| block } -> StructClass + # new(value, ...) -> obj + # StructClass[value, ...] -> obj + # ``` + # + # The first two forms are used to create a new struct subclass `class_name` + # that can contain a value for each member_name . This subclass can be + # used to create instances of the structure like any other Class . + # + # If the `class_name` is omitted an anonymous struct class will be created. + # Otherwise, the name of this struct will appear as a constant in the struct class, + # so it must be unique for all structs under this base class and must start with a + # capital letter. Assigning a struct class to a constant also gives the class + # the name of the constant. + # + # If a block is given it will be evaluated in the context of `StructClass`, passing + # the created class as a parameter. This is the recommended way to customize a struct. + # Subclassing an anonymous struct creates an extra anonymous class that will never be used. + # + # The last two forms create a new instance of a struct subclass. The number of value + # parameters must be less than or equal to the number of attributes defined for the + # struct. Unset parameters default to nil. Passing more parameters than number of attributes + # will raise an `ArgumentError`. + # + # @see http://ruby-doc.org/core/Struct.html#method-c-new Ruby standard library `Struct#new` + + # @!macro struct_values + # + # Returns the values for this struct as an Array. + # + # @return [Array] the values for this struct + # + def values + synchronize { ns_values } + end + alias_method :to_a, :values + + # @!macro struct_values_at + # + # Returns the struct member values for each selector as an Array. + # + # A selector may be either an Integer offset or a Range of offsets (as in `Array#values_at`). + # + # @param [Fixnum, Range] indexes the index(es) from which to obatin the values (in order) + def values_at(*indexes) + synchronize { ns_values_at(indexes) } + end + + # @!macro struct_inspect + # + # Describe the contents of this struct in a string. + # + # @return [String] the contents of this struct in a string + def inspect + synchronize { ns_inspect } + end + alias_method :to_s, :inspect + + # @!macro struct_merge + # + # Returns a new struct containing the contents of `other` and the contents + # of `self`. If no block is specified, the value for entries with duplicate + # keys will be that of `other`. Otherwise the value for each duplicate key + # is determined by calling the block with the key, its value in `self` and + # its value in `other`. + # + # @param [Hash] other the hash from which to set the new values + # @yield an options block for resolving duplicate keys + # @yieldparam [String, Symbol] member the name of the member which is duplicated + # @yieldparam [Object] selfvalue the value of the member in `self` + # @yieldparam [Object] othervalue the value of the member in `other` + # + # @return [Synchronization::AbstractStruct] a new struct with the new values + # + # @raise [ArgumentError] of given a member that is not defined in the struct + def merge(other, &block) + synchronize { ns_merge(other, &block) } + end + + # @!macro struct_to_h + # + # Returns a hash containing the names and values for the struct’s members. + # + # @return [Hash] the names and values for the struct’s members + def to_h + synchronize { ns_to_h } + end + + # @!macro struct_get + # + # Attribute Reference + # + # @param [Symbol, String, Integer] member the string or symbol name of the member + # for which to obtain the value or the member's index + # + # @return [Object] the value of the given struct member or the member at the given index. + # + # @raise [NameError] if the member does not exist + # @raise [IndexError] if the index is out of range. + def [](member) + synchronize { ns_get(member) } + end + + # @!macro struct_equality + # + # Equality + # + # @return [Boolean] true if other has the same struct subclass and has + # equal member values (according to `Object#==`) + def ==(other) + synchronize { ns_equality(other) } + end + + # @!macro struct_each + # + # Yields the value of each struct member in order. If no block is given + # an enumerator is returned. + # + # @yield the operation to be performed on each struct member + # @yieldparam [Object] value each struct value (in order) + def each(&block) + return enum_for(:each) unless block_given? + synchronize { ns_each(&block) } + end + + # @!macro struct_each_pair + # + # Yields the name and value of each struct member in order. If no block is + # given an enumerator is returned. + # + # @yield the operation to be performed on each struct member/value pair + # @yieldparam [Object] member each struct member (in order) + # @yieldparam [Object] value each struct value (in order) + def each_pair(&block) + return enum_for(:each_pair) unless block_given? + synchronize { ns_each_pair(&block) } + end + + # @!macro struct_select + # + # Yields each member value from the struct to the block and returns an Array + # containing the member values from the struct for which the given block + # returns a true value (equivalent to `Enumerable#select`). + # + # @yield the operation to be performed on each struct member + # @yieldparam [Object] value each struct value (in order) + # + # @return [Array] an array containing each value for which the block returns true + def select(&block) + return enum_for(:select) unless block_given? + synchronize { ns_select(&block) } + end + + # @!macro struct_set + # + # Attribute Assignment + # + # Sets the value of the given struct member or the member at the given index. + # + # @param [Symbol, String, Integer] member the string or symbol name of the member + # for which to obtain the value or the member's index + # + # @return [Object] the value of the given struct member or the member at the given index. + # + # @raise [NameError] if the name does not exist + # @raise [IndexError] if the index is out of range. + def []=(member, value) + if member.is_a? Integer + length = synchronize { @values.length } + if member >= length + raise IndexError.new("offset #{member} too large for struct(size:#{length})") + end + synchronize { @values[member] = value } + else + send("#{member}=", value) + end + rescue NoMethodError + raise NameError.new("no member '#{member}' in struct") + end + + private + + # @!visibility private + def initialize_copy(original) + synchronize do + super(original) + ns_initialize_copy + end + end + + # @!macro struct_new + def self.new(*args, &block) + clazz_name = nil + if args.length == 0 + raise ArgumentError.new('wrong number of arguments (0 for 1+)') + elsif args.length > 0 && args.first.is_a?(String) + clazz_name = args.shift + end + FACTORY.define_struct(clazz_name, args, &block) + end + + FACTORY = Class.new(Synchronization::LockableObject) do + def define_struct(name, members, &block) + synchronize do + clazz = Synchronization::AbstractStruct.define_struct_class(MutableStruct, Synchronization::LockableObject, name, members, &block) + members.each_with_index do |member, index| + clazz.send :remove_method, member + clazz.send(:define_method, member) do + synchronize { @values[index] } + end + clazz.send(:define_method, "#{member}=") do |value| + synchronize { @values[index] = value } + end + end + clazz + end + end + end.new + private_constant :FACTORY + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/mvar.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/mvar.rb new file mode 100644 index 000000000000..9034711bf559 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/mvar.rb @@ -0,0 +1,242 @@ +require 'concurrent/concern/dereferenceable' +require 'concurrent/synchronization' + +module Concurrent + + # An `MVar` is a synchronized single element container. They are empty or + # contain one item. Taking a value from an empty `MVar` blocks, as does + # putting a value into a full one. You can either think of them as blocking + # queue of length one, or a special kind of mutable variable. + # + # On top of the fundamental `#put` and `#take` operations, we also provide a + # `#mutate` that is atomic with respect to operations on the same instance. + # These operations all support timeouts. + # + # We also support non-blocking operations `#try_put!` and `#try_take!`, a + # `#set!` that ignores existing values, a `#value` that returns the value + # without removing it or returns `MVar::EMPTY`, and a `#modify!` that yields + # `MVar::EMPTY` if the `MVar` is empty and can be used to set `MVar::EMPTY`. + # You shouldn't use these operations in the first instance. + # + # `MVar` is a [Dereferenceable](Dereferenceable). + # + # `MVar` is related to M-structures in Id, `MVar` in Haskell and `SyncVar` in Scala. + # + # Note that unlike the original Haskell paper, our `#take` is blocking. This is how + # Haskell and Scala do it today. + # + # @!macro copy_options + # + # ## See Also + # + # 1. P. Barth, R. Nikhil, and Arvind. [M-Structures: Extending a parallel, non- strict, functional language with state](http://dl.acm.org/citation.cfm?id=652538). In Proceedings of the 5th + # ACM Conference on Functional Programming Languages and Computer Architecture (FPCA), 1991. + # + # 2. S. Peyton Jones, A. Gordon, and S. Finne. [Concurrent Haskell](http://dl.acm.org/citation.cfm?id=237794). + # In Proceedings of the 23rd Symposium on Principles of Programming Languages + # (PoPL), 1996. + class MVar < Synchronization::Object + include Concern::Dereferenceable + safe_initialization! + + # Unique value that represents that an `MVar` was empty + EMPTY = ::Object.new + + # Unique value that represents that an `MVar` timed out before it was able + # to produce a value. + TIMEOUT = ::Object.new + + # Create a new `MVar`, either empty or with an initial value. + # + # @param [Hash] opts the options controlling how the future will be processed + # + # @!macro deref_options + def initialize(value = EMPTY, opts = {}) + @value = value + @mutex = Mutex.new + @empty_condition = ConditionVariable.new + @full_condition = ConditionVariable.new + set_deref_options(opts) + end + + # Remove the value from an `MVar`, leaving it empty, and blocking if there + # isn't a value. A timeout can be set to limit the time spent blocked, in + # which case it returns `TIMEOUT` if the time is exceeded. + # @return [Object] the value that was taken, or `TIMEOUT` + def take(timeout = nil) + @mutex.synchronize do + wait_for_full(timeout) + + # If we timed out we'll still be empty + if unlocked_full? + value = @value + @value = EMPTY + @empty_condition.signal + apply_deref_options(value) + else + TIMEOUT + end + end + end + + # acquires lock on the from an `MVAR`, yields the value to provided block, + # and release lock. A timeout can be set to limit the time spent blocked, + # in which case it returns `TIMEOUT` if the time is exceeded. + # @return [Object] the value returned by the block, or `TIMEOUT` + def borrow(timeout = nil) + @mutex.synchronize do + wait_for_full(timeout) + + # if we timeoud out we'll still be empty + if unlocked_full? + yield @value + else + TIMEOUT + end + end + end + + # Put a value into an `MVar`, blocking if there is already a value until + # it is empty. A timeout can be set to limit the time spent blocked, in + # which case it returns `TIMEOUT` if the time is exceeded. + # @return [Object] the value that was put, or `TIMEOUT` + def put(value, timeout = nil) + @mutex.synchronize do + wait_for_empty(timeout) + + # If we timed out we won't be empty + if unlocked_empty? + @value = value + @full_condition.signal + apply_deref_options(value) + else + TIMEOUT + end + end + end + + # Atomically `take`, yield the value to a block for transformation, and then + # `put` the transformed value. Returns the transformed value. A timeout can + # be set to limit the time spent blocked, in which case it returns `TIMEOUT` + # if the time is exceeded. + # @return [Object] the transformed value, or `TIMEOUT` + def modify(timeout = nil) + raise ArgumentError.new('no block given') unless block_given? + + @mutex.synchronize do + wait_for_full(timeout) + + # If we timed out we'll still be empty + if unlocked_full? + value = @value + @value = yield value + @full_condition.signal + apply_deref_options(value) + else + TIMEOUT + end + end + end + + # Non-blocking version of `take`, that returns `EMPTY` instead of blocking. + def try_take! + @mutex.synchronize do + if unlocked_full? + value = @value + @value = EMPTY + @empty_condition.signal + apply_deref_options(value) + else + EMPTY + end + end + end + + # Non-blocking version of `put`, that returns whether or not it was successful. + def try_put!(value) + @mutex.synchronize do + if unlocked_empty? + @value = value + @full_condition.signal + true + else + false + end + end + end + + # Non-blocking version of `put` that will overwrite an existing value. + def set!(value) + @mutex.synchronize do + old_value = @value + @value = value + @full_condition.signal + apply_deref_options(old_value) + end + end + + # Non-blocking version of `modify` that will yield with `EMPTY` if there is no value yet. + def modify! + raise ArgumentError.new('no block given') unless block_given? + + @mutex.synchronize do + value = @value + @value = yield value + if unlocked_empty? + @empty_condition.signal + else + @full_condition.signal + end + apply_deref_options(value) + end + end + + # Returns if the `MVar` is currently empty. + def empty? + @mutex.synchronize { @value == EMPTY } + end + + # Returns if the `MVar` currently contains a value. + def full? + !empty? + end + + protected + + def synchronize(&block) + @mutex.synchronize(&block) + end + + private + + def unlocked_empty? + @value == EMPTY + end + + def unlocked_full? + ! unlocked_empty? + end + + def wait_for_full(timeout) + wait_while(@full_condition, timeout) { unlocked_empty? } + end + + def wait_for_empty(timeout) + wait_while(@empty_condition, timeout) { unlocked_full? } + end + + def wait_while(condition, timeout) + if timeout.nil? + while yield + condition.wait(@mutex) + end + else + stop = Concurrent.monotonic_time + timeout + while yield && timeout > 0.0 + condition.wait(@mutex, timeout) + timeout = stop - Concurrent.monotonic_time + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/options.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/options.rb new file mode 100644 index 000000000000..bdd22a9df15d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/options.rb @@ -0,0 +1,42 @@ +require 'concurrent/configuration' + +module Concurrent + + # @!visibility private + module Options + + # Get the requested `Executor` based on the values set in the options hash. + # + # @param [Hash] opts the options defining the requested executor + # @option opts [Executor] :executor when set use the given `Executor` instance. + # Three special values are also supported: `:fast` returns the global fast executor, + # `:io` returns the global io executor, and `:immediate` returns a new + # `ImmediateExecutor` object. + # + # @return [Executor, nil] the requested thread pool, or nil when no option specified + # + # @!visibility private + def self.executor_from_options(opts = {}) # :nodoc: + if identifier = opts.fetch(:executor, nil) + executor(identifier) + else + nil + end + end + + def self.executor(executor_identifier) + case executor_identifier + when :fast + Concurrent.global_fast_executor + when :io + Concurrent.global_io_executor + when :immediate + Concurrent.global_immediate_executor + when Concurrent::ExecutorService + executor_identifier + else + raise ArgumentError, "executor not recognized by '#{executor_identifier}'" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/promise.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/promise.rb new file mode 100644 index 000000000000..f5f31ebbacb8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/promise.rb @@ -0,0 +1,579 @@ +require 'thread' +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/ivar' +require 'concurrent/executor/safe_task_executor' + +require 'concurrent/options' + +module Concurrent + + PromiseExecutionError = Class.new(StandardError) + + # Promises are inspired by the JavaScript [Promises/A](http://wiki.commonjs.org/wiki/Promises/A) + # and [Promises/A+](http://promises-aplus.github.io/promises-spec/) specifications. + # + # > A promise represents the eventual value returned from the single + # > completion of an operation. + # + # Promises are similar to futures and share many of the same behaviours. + # Promises are far more robust, however. Promises can be chained in a tree + # structure where each promise may have zero or more children. Promises are + # chained using the `then` method. The result of a call to `then` is always + # another promise. Promises are resolved asynchronously (with respect to the + # main thread) but in a strict order: parents are guaranteed to be resolved + # before their children, children before their younger siblings. The `then` + # method takes two parameters: an optional block to be executed upon parent + # resolution and an optional callable to be executed upon parent failure. The + # result of each promise is passed to each of its children upon resolution. + # When a promise is rejected all its children will be summarily rejected and + # will receive the reason. + # + # Promises have several possible states: *:unscheduled*, *:pending*, + # *:processing*, *:rejected*, or *:fulfilled*. These are also aggregated as + # `#incomplete?` and `#complete?`. When a Promise is created it is set to + # *:unscheduled*. Once the `#execute` method is called the state becomes + # *:pending*. Once a job is pulled from the thread pool's queue and is given + # to a thread for processing (often immediately upon `#post`) the state + # becomes *:processing*. The future will remain in this state until processing + # is complete. A future that is in the *:unscheduled*, *:pending*, or + # *:processing* is considered `#incomplete?`. A `#complete?` Promise is either + # *:rejected*, indicating that an exception was thrown during processing, or + # *:fulfilled*, indicating success. If a Promise is *:fulfilled* its `#value` + # will be updated to reflect the result of the operation. If *:rejected* the + # `reason` will be updated with a reference to the thrown exception. The + # predicate methods `#unscheduled?`, `#pending?`, `#rejected?`, and + # `#fulfilled?` can be called at any time to obtain the state of the Promise, + # as can the `#state` method, which returns a symbol. + # + # Retrieving the value of a promise is done through the `value` (alias: + # `deref`) method. Obtaining the value of a promise is a potentially blocking + # operation. When a promise is *rejected* a call to `value` will return `nil` + # immediately. When a promise is *fulfilled* a call to `value` will + # immediately return the current value. When a promise is *pending* a call to + # `value` will block until the promise is either *rejected* or *fulfilled*. A + # *timeout* value can be passed to `value` to limit how long the call will + # block. If `nil` the call will block indefinitely. If `0` the call will not + # block. Any other integer or float value will indicate the maximum number of + # seconds to block. + # + # Promises run on the global thread pool. + # + # @!macro copy_options + # + # ### Examples + # + # Start by requiring promises + # + # ```ruby + # require 'concurrent' + # ``` + # + # Then create one + # + # ```ruby + # p = Concurrent::Promise.execute do + # # do something + # 42 + # end + # ``` + # + # Promises can be chained using the `then` method. The `then` method accepts a + # block and an executor, to be executed on fulfillment, and a callable argument to be executed + # on rejection. The result of the each promise is passed as the block argument + # to chained promises. + # + # ```ruby + # p = Concurrent::Promise.new{10}.then{|x| x * 2}.then{|result| result - 10 }.execute + # ``` + # + # And so on, and so on, and so on... + # + # ```ruby + # p = Concurrent::Promise.fulfill(20). + # then{|result| result - 10 }. + # then{|result| result * 3 }. + # then(executor: different_executor){|result| result % 5 }.execute + # ``` + # + # The initial state of a newly created Promise depends on the state of its parent: + # - if parent is *unscheduled* the child will be *unscheduled* + # - if parent is *pending* the child will be *pending* + # - if parent is *fulfilled* the child will be *pending* + # - if parent is *rejected* the child will be *pending* (but will ultimately be *rejected*) + # + # Promises are executed asynchronously from the main thread. By the time a + # child Promise finishes intialization it may be in a different state than its + # parent (by the time a child is created its parent may have completed + # execution and changed state). Despite being asynchronous, however, the order + # of execution of Promise objects in a chain (or tree) is strictly defined. + # + # There are multiple ways to create and execute a new `Promise`. Both ways + # provide identical behavior: + # + # ```ruby + # # create, operate, then execute + # p1 = Concurrent::Promise.new{ "Hello World!" } + # p1.state #=> :unscheduled + # p1.execute + # + # # create and immediately execute + # p2 = Concurrent::Promise.new{ "Hello World!" }.execute + # + # # execute during creation + # p3 = Concurrent::Promise.execute{ "Hello World!" } + # ``` + # + # Once the `execute` method is called a `Promise` becomes `pending`: + # + # ```ruby + # p = Concurrent::Promise.execute{ "Hello, world!" } + # p.state #=> :pending + # p.pending? #=> true + # ``` + # + # Wait a little bit, and the promise will resolve and provide a value: + # + # ```ruby + # p = Concurrent::Promise.execute{ "Hello, world!" } + # sleep(0.1) + # + # p.state #=> :fulfilled + # p.fulfilled? #=> true + # p.value #=> "Hello, world!" + # ``` + # + # If an exception occurs, the promise will be rejected and will provide + # a reason for the rejection: + # + # ```ruby + # p = Concurrent::Promise.execute{ raise StandardError.new("Here comes the Boom!") } + # sleep(0.1) + # + # p.state #=> :rejected + # p.rejected? #=> true + # p.reason #=> "#<StandardError: Here comes the Boom!>" + # ``` + # + # #### Rejection + # + # When a promise is rejected all its children will be rejected and will + # receive the rejection `reason` as the rejection callable parameter: + # + # ```ruby + # p = Concurrent::Promise.execute { Thread.pass; raise StandardError } + # + # c1 = p.then(-> reason { 42 }) + # c2 = p.then(-> reason { raise 'Boom!' }) + # + # c1.wait.state #=> :fulfilled + # c1.value #=> 45 + # c2.wait.state #=> :rejected + # c2.reason #=> #<RuntimeError: Boom!> + # ``` + # + # Once a promise is rejected it will continue to accept children that will + # receive immediately rejection (they will be executed asynchronously). + # + # #### Aliases + # + # The `then` method is the most generic alias: it accepts a block to be + # executed upon parent fulfillment and a callable to be executed upon parent + # rejection. At least one of them should be passed. The default block is `{ + # |result| result }` that fulfills the child with the parent value. The + # default callable is `{ |reason| raise reason }` that rejects the child with + # the parent reason. + # + # - `on_success { |result| ... }` is the same as `then {|result| ... }` + # - `rescue { |reason| ... }` is the same as `then(Proc.new { |reason| ... } )` + # - `rescue` is aliased by `catch` and `on_error` + class Promise < IVar + + # Initialize a new Promise with the provided options. + # + # @!macro executor_and_deref_options + # + # @!macro promise_init_options + # + # @option opts [Promise] :parent the parent `Promise` when building a chain/tree + # @option opts [Proc] :on_fulfill fulfillment handler + # @option opts [Proc] :on_reject rejection handler + # @option opts [object, Array] :args zero or more arguments to be passed + # the task block on execution + # + # @yield The block operation to be performed asynchronously. + # + # @raise [ArgumentError] if no block is given + # + # @see http://wiki.commonjs.org/wiki/Promises/A + # @see http://promises-aplus.github.io/promises-spec/ + def initialize(opts = {}, &block) + opts.delete_if { |k, v| v.nil? } + super(NULL, opts.merge(__promise_body_from_block__: block), &nil) + end + + # Create a new `Promise` and fulfill it immediately. + # + # @!macro executor_and_deref_options + # + # @!macro promise_init_options + # + # @raise [ArgumentError] if no block is given + # + # @return [Promise] the newly created `Promise` + def self.fulfill(value, opts = {}) + Promise.new(opts).tap { |p| p.send(:synchronized_set_state!, true, value, nil) } + end + + # Create a new `Promise` and reject it immediately. + # + # @!macro executor_and_deref_options + # + # @!macro promise_init_options + # + # @raise [ArgumentError] if no block is given + # + # @return [Promise] the newly created `Promise` + def self.reject(reason, opts = {}) + Promise.new(opts).tap { |p| p.send(:synchronized_set_state!, false, nil, reason) } + end + + # Execute an `:unscheduled` `Promise`. Immediately sets the state to `:pending` and + # passes the block to a new thread/thread pool for eventual execution. + # Does nothing if the `Promise` is in any state other than `:unscheduled`. + # + # @return [Promise] a reference to `self` + def execute + if root? + if compare_and_set_state(:pending, :unscheduled) + set_pending + realize(@promise_body) + end + else + @parent.execute + end + self + end + + # @!macro ivar_set_method + # + # @raise [Concurrent::PromiseExecutionError] if not the root promise + def set(value = NULL, &block) + raise PromiseExecutionError.new('supported only on root promise') unless root? + check_for_block_or_value!(block_given?, value) + synchronize do + if @state != :unscheduled + raise MultipleAssignmentError + else + @promise_body = block || Proc.new { |result| value } + end + end + execute + end + + # @!macro ivar_fail_method + # + # @raise [Concurrent::PromiseExecutionError] if not the root promise + def fail(reason = StandardError.new) + set { raise reason } + end + + # Create a new `Promise` object with the given block, execute it, and return the + # `:pending` object. + # + # @!macro executor_and_deref_options + # + # @!macro promise_init_options + # + # @return [Promise] the newly created `Promise` in the `:pending` state + # + # @raise [ArgumentError] if no block is given + # + # @example + # promise = Concurrent::Promise.execute{ sleep(1); 42 } + # promise.state #=> :pending + def self.execute(opts = {}, &block) + new(opts, &block).execute + end + + # Chain a new promise off the current promise. + # + # @return [Promise] the new promise + # @yield The block operation to be performed asynchronously. + # @overload then(rescuer, executor, &block) + # @param [Proc] rescuer An optional rescue block to be executed if the + # promise is rejected. + # @param [ThreadPool] executor An optional thread pool executor to be used + # in the new Promise + # @overload then(rescuer, executor: executor, &block) + # @param [Proc] rescuer An optional rescue block to be executed if the + # promise is rejected. + # @param [ThreadPool] executor An optional thread pool executor to be used + # in the new Promise + def then(*args, &block) + if args.last.is_a?(::Hash) + executor = args.pop[:executor] + rescuer = args.first + else + rescuer, executor = args + end + + executor ||= @executor + + raise ArgumentError.new('rescuers and block are both missing') if rescuer.nil? && !block_given? + block = Proc.new { |result| result } unless block_given? + child = Promise.new( + parent: self, + executor: executor, + on_fulfill: block, + on_reject: rescuer + ) + + synchronize do + child.state = :pending if @state == :pending + child.on_fulfill(apply_deref_options(@value)) if @state == :fulfilled + child.on_reject(@reason) if @state == :rejected + @children << child + end + + child + end + + # Chain onto this promise an action to be undertaken on success + # (fulfillment). + # + # @yield The block to execute + # + # @return [Promise] self + def on_success(&block) + raise ArgumentError.new('no block given') unless block_given? + self.then(&block) + end + + # Chain onto this promise an action to be undertaken on failure + # (rejection). + # + # @yield The block to execute + # + # @return [Promise] self + def rescue(&block) + self.then(block) + end + + alias_method :catch, :rescue + alias_method :on_error, :rescue + + # Yield the successful result to the block that returns a promise. If that + # promise is also successful the result is the result of the yielded promise. + # If either part fails the whole also fails. + # + # @example + # Promise.execute { 1 }.flat_map { |v| Promise.execute { v + 2 } }.value! #=> 3 + # + # @return [Promise] + def flat_map(&block) + child = Promise.new( + parent: self, + executor: ImmediateExecutor.new, + ) + + on_error { |e| child.on_reject(e) } + on_success do |result1| + begin + inner = block.call(result1) + inner.execute + inner.on_success { |result2| child.on_fulfill(result2) } + inner.on_error { |e| child.on_reject(e) } + rescue => e + child.on_reject(e) + end + end + + child + end + + # Builds a promise that produces the result of promises in an Array + # and fails if any of them fails. + # + # @overload zip(*promises) + # @param [Array<Promise>] promises + # + # @overload zip(*promises, opts) + # @param [Array<Promise>] promises + # @param [Hash] opts the configuration options + # @option opts [Executor] :executor (ImmediateExecutor.new) when set use the given `Executor` instance. + # @option opts [Boolean] :execute (true) execute promise before returning + # + # @return [Promise<Array>] + def self.zip(*promises) + opts = promises.last.is_a?(::Hash) ? promises.pop.dup : {} + opts[:executor] ||= ImmediateExecutor.new + zero = if !opts.key?(:execute) || opts.delete(:execute) + fulfill([], opts) + else + Promise.new(opts) { [] } + end + + promises.reduce(zero) do |p1, p2| + p1.flat_map do |results| + p2.then do |next_result| + results << next_result + end + end + end + end + + # Builds a promise that produces the result of self and others in an Array + # and fails if any of them fails. + # + # @overload zip(*promises) + # @param [Array<Promise>] others + # + # @overload zip(*promises, opts) + # @param [Array<Promise>] others + # @param [Hash] opts the configuration options + # @option opts [Executor] :executor (ImmediateExecutor.new) when set use the given `Executor` instance. + # @option opts [Boolean] :execute (true) execute promise before returning + # + # @return [Promise<Array>] + def zip(*others) + self.class.zip(self, *others) + end + + # Aggregates a collection of promises and executes the `then` condition + # if all aggregated promises succeed. Executes the `rescue` handler with + # a `Concurrent::PromiseExecutionError` if any of the aggregated promises + # fail. Upon execution will execute any of the aggregate promises that + # were not already executed. + # + # @!macro promise_self_aggregate + # + # The returned promise will not yet have been executed. Additional `#then` + # and `#rescue` handlers may still be provided. Once the returned promise + # is execute the aggregate promises will be also be executed (if they have + # not been executed already). The results of the aggregate promises will + # be checked upon completion. The necessary `#then` and `#rescue` blocks + # on the aggregating promise will then be executed as appropriate. If the + # `#rescue` handlers are executed the raises exception will be + # `Concurrent::PromiseExecutionError`. + # + # @param [Array] promises Zero or more promises to aggregate + # @return [Promise] an unscheduled (not executed) promise that aggregates + # the promises given as arguments + def self.all?(*promises) + aggregate(:all?, *promises) + end + + # Aggregates a collection of promises and executes the `then` condition + # if any aggregated promises succeed. Executes the `rescue` handler with + # a `Concurrent::PromiseExecutionError` if any of the aggregated promises + # fail. Upon execution will execute any of the aggregate promises that + # were not already executed. + # + # @!macro promise_self_aggregate + def self.any?(*promises) + aggregate(:any?, *promises) + end + + protected + + def ns_initialize(value, opts) + super + + @executor = Options.executor_from_options(opts) || Concurrent.global_io_executor + @args = get_arguments_from(opts) + + @parent = opts.fetch(:parent) { nil } + @on_fulfill = opts.fetch(:on_fulfill) { Proc.new { |result| result } } + @on_reject = opts.fetch(:on_reject) { Proc.new { |reason| raise reason } } + + @promise_body = opts[:__promise_body_from_block__] || Proc.new { |result| result } + @state = :unscheduled + @children = [] + end + + # Aggregate a collection of zero or more promises under a composite promise, + # execute the aggregated promises and collect them into a standard Ruby array, + # call the given Ruby `Ennnumerable` predicate (such as `any?`, `all?`, `none?`, + # or `one?`) on the collection checking for the success or failure of each, + # then executing the composite's `#then` handlers if the predicate returns + # `true` or executing the composite's `#rescue` handlers if the predicate + # returns false. + # + # @!macro promise_self_aggregate + def self.aggregate(method, *promises) + composite = Promise.new do + completed = promises.collect do |promise| + promise.execute if promise.unscheduled? + promise.wait + promise + end + unless completed.empty? || completed.send(method){|promise| promise.fulfilled? } + raise PromiseExecutionError + end + end + composite + end + + # @!visibility private + def set_pending + synchronize do + @state = :pending + @children.each { |c| c.set_pending } + end + end + + # @!visibility private + def root? # :nodoc: + @parent.nil? + end + + # @!visibility private + def on_fulfill(result) + realize Proc.new { @on_fulfill.call(result) } + nil + end + + # @!visibility private + def on_reject(reason) + realize Proc.new { @on_reject.call(reason) } + nil + end + + # @!visibility private + def notify_child(child) + if_state(:fulfilled) { child.on_fulfill(apply_deref_options(@value)) } + if_state(:rejected) { child.on_reject(@reason) } + end + + # @!visibility private + def complete(success, value, reason) + children_to_notify = synchronize do + set_state!(success, value, reason) + @children.dup + end + + children_to_notify.each { |child| notify_child(child) } + observers.notify_and_delete_observers{ [Time.now, self.value, reason] } + end + + # @!visibility private + def realize(task) + @executor.post do + success, value, reason = SafeTaskExecutor.new(task, rescue_exception: true).execute(*@args) + complete(success, value, reason) + end + end + + # @!visibility private + def set_state!(success, value, reason) + set_state(success, value, reason) + event.set + end + + # @!visibility private + def synchronized_set_state!(success, value, reason) + synchronize { set_state!(success, value, reason) } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/promises.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/promises.rb new file mode 100644 index 000000000000..76af4d5963da --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/promises.rb @@ -0,0 +1,2167 @@ +require 'concurrent/synchronization' +require 'concurrent/atomic/atomic_boolean' +require 'concurrent/atomic/atomic_fixnum' +require 'concurrent/collection/lock_free_stack' +require 'concurrent/errors' +require 'concurrent/re_include' + +module Concurrent + + # {include:file:docs-source/promises-main.md} + module Promises + + # @!macro promises.param.default_executor + # @param [Executor, :io, :fast] default_executor Instance of an executor or a name of the + # global executor. Default executor propagates to chained futures unless overridden with + # executor parameter or changed with {AbstractEventFuture#with_default_executor}. + # + # @!macro promises.param.executor + # @param [Executor, :io, :fast] executor Instance of an executor or a name of the + # global executor. The task is executed on it, default executor remains unchanged. + # + # @!macro promises.param.args + # @param [Object] args arguments which are passed to the task when it's executed. + # (It might be prepended with other arguments, see the @yeild section). + # + # @!macro promises.shortcut.on + # Shortcut of {#$0_on} with default `:io` executor supplied. + # @see #$0_on + # + # @!macro promises.shortcut.using + # Shortcut of {#$0_using} with default `:io` executor supplied. + # @see #$0_using + # + # @!macro promise.param.task-future + # @yieldreturn will become result of the returned Future. + # Its returned value becomes {Future#value} fulfilling it, + # raised exception becomes {Future#reason} rejecting it. + # + # @!macro promise.param.callback + # @yieldreturn is forgotten. + + # Container of all {Future}, {Event} factory methods. They are never constructed directly with + # new. + module FactoryMethods + extend ReInclude + extend self + + module Configuration + # @return [Executor, :io, :fast] the executor which is used when none is supplied + # to a factory method. The method can be overridden in the receivers of + # `include FactoryMethod` + def default_executor + :io + end + end + + include Configuration + + # @!macro promises.shortcut.on + # @return [ResolvableEvent] + def resolvable_event + resolvable_event_on default_executor + end + + # Created resolvable event, user is responsible for resolving the event once by + # {Promises::ResolvableEvent#resolve}. + # + # @!macro promises.param.default_executor + # @return [ResolvableEvent] + def resolvable_event_on(default_executor = self.default_executor) + ResolvableEventPromise.new(default_executor).future + end + + # @!macro promises.shortcut.on + # @return [ResolvableFuture] + def resolvable_future + resolvable_future_on default_executor + end + + # Creates resolvable future, user is responsible for resolving the future once by + # {Promises::ResolvableFuture#resolve}, {Promises::ResolvableFuture#fulfill}, + # or {Promises::ResolvableFuture#reject} + # + # @!macro promises.param.default_executor + # @return [ResolvableFuture] + def resolvable_future_on(default_executor = self.default_executor) + ResolvableFuturePromise.new(default_executor).future + end + + # @!macro promises.shortcut.on + # @return [Future] + def future(*args, &task) + future_on(default_executor, *args, &task) + end + + # Constructs new Future which will be resolved after block is evaluated on default executor. + # Evaluation begins immediately. + # + # @!macro promises.param.default_executor + # @!macro promises.param.args + # @yield [*args] to the task. + # @!macro promise.param.task-future + # @return [Future] + def future_on(default_executor, *args, &task) + ImmediateEventPromise.new(default_executor).future.then(*args, &task) + end + + # Creates resolved future with will be either fulfilled with the given value or rejection with + # the given reason. + # + # @param [true, false] fulfilled + # @param [Object] value + # @param [Object] reason + # @!macro promises.param.default_executor + # @return [Future] + def resolved_future(fulfilled, value, reason, default_executor = self.default_executor) + ImmediateFuturePromise.new(default_executor, fulfilled, value, reason).future + end + + # Creates resolved future with will be fulfilled with the given value. + # + # @!macro promises.param.default_executor + # @param [Object] value + # @return [Future] + def fulfilled_future(value, default_executor = self.default_executor) + resolved_future true, value, nil, default_executor + end + + # Creates resolved future with will be rejected with the given reason. + # + # @!macro promises.param.default_executor + # @param [Object] reason + # @return [Future] + def rejected_future(reason, default_executor = self.default_executor) + resolved_future false, nil, reason, default_executor + end + + # Creates resolved event. + # + # @!macro promises.param.default_executor + # @return [Event] + def resolved_event(default_executor = self.default_executor) + ImmediateEventPromise.new(default_executor).event + end + + # General constructor. Behaves differently based on the argument's type. It's provided for convenience + # but it's better to be explicit. + # + # @see rejected_future, resolved_event, fulfilled_future + # @!macro promises.param.default_executor + # @return [Event, Future] + # + # @overload make_future(nil, default_executor = self.default_executor) + # @param [nil] nil + # @return [Event] resolved event. + # + # @overload make_future(a_future, default_executor = self.default_executor) + # @param [Future] a_future + # @return [Future] a future which will be resolved when a_future is. + # + # @overload make_future(an_event, default_executor = self.default_executor) + # @param [Event] an_event + # @return [Event] an event which will be resolved when an_event is. + # + # @overload make_future(exception, default_executor = self.default_executor) + # @param [Exception] exception + # @return [Future] a rejected future with the exception as its reason. + # + # @overload make_future(value, default_executor = self.default_executor) + # @param [Object] value when none of the above overloads fits + # @return [Future] a fulfilled future with the value. + def make_future(argument = nil, default_executor = self.default_executor) + case argument + when AbstractEventFuture + # returning wrapper would change nothing + argument + when Exception + rejected_future argument, default_executor + when nil + resolved_event default_executor + else + fulfilled_future argument, default_executor + end + end + + # @!macro promises.shortcut.on + # @return [Future, Event] + def delay(*args, &task) + delay_on default_executor, *args, &task + end + + # Creates new event or future which is resolved only after it is touched, + # see {Concurrent::AbstractEventFuture#touch}. + # + # @!macro promises.param.default_executor + # @overload delay_on(default_executor, *args, &task) + # If task is provided it returns a {Future} representing the result of the task. + # @!macro promises.param.args + # @yield [*args] to the task. + # @!macro promise.param.task-future + # @return [Future] + # @overload delay_on(default_executor) + # If no task is provided, it returns an {Event} + # @return [Event] + def delay_on(default_executor, *args, &task) + event = DelayPromise.new(default_executor).event + task ? event.chain(*args, &task) : event + end + + # @!macro promises.shortcut.on + # @return [Future, Event] + def schedule(intended_time, *args, &task) + schedule_on default_executor, intended_time, *args, &task + end + + # Creates new event or future which is resolved in intended_time. + # + # @!macro promises.param.default_executor + # @!macro promises.param.intended_time + # @param [Numeric, Time] intended_time `Numeric` means to run in `intended_time` seconds. + # `Time` means to run on `intended_time`. + # @overload schedule_on(default_executor, intended_time, *args, &task) + # If task is provided it returns a {Future} representing the result of the task. + # @!macro promises.param.args + # @yield [*args] to the task. + # @!macro promise.param.task-future + # @return [Future] + # @overload schedule_on(default_executor, intended_time) + # If no task is provided, it returns an {Event} + # @return [Event] + def schedule_on(default_executor, intended_time, *args, &task) + event = ScheduledPromise.new(default_executor, intended_time).event + task ? event.chain(*args, &task) : event + end + + # @!macro promises.shortcut.on + # @return [Future] + def zip_futures(*futures_and_or_events) + zip_futures_on default_executor, *futures_and_or_events + end + + # Creates new future which is resolved after all futures_and_or_events are resolved. + # Its value is array of zipped future values. Its reason is array of reasons for rejection. + # If there is an error it rejects. + # @!macro promises.event-conversion + # If event is supplied, which does not have value and can be only resolved, it's + # represented as `:fulfilled` with value `nil`. + # + # @!macro promises.param.default_executor + # @param [AbstractEventFuture] futures_and_or_events + # @return [Future] + def zip_futures_on(default_executor, *futures_and_or_events) + ZipFuturesPromise.new_blocked_by(futures_and_or_events, default_executor).future + end + + alias_method :zip, :zip_futures + + # @!macro promises.shortcut.on + # @return [Event] + def zip_events(*futures_and_or_events) + zip_events_on default_executor, *futures_and_or_events + end + + # Creates new event which is resolved after all futures_and_or_events are resolved. + # (Future is resolved when fulfilled or rejected.) + # + # @!macro promises.param.default_executor + # @param [AbstractEventFuture] futures_and_or_events + # @return [Event] + def zip_events_on(default_executor, *futures_and_or_events) + ZipEventsPromise.new_blocked_by(futures_and_or_events, default_executor).event + end + + # @!macro promises.shortcut.on + # @return [Future] + def any_resolved_future(*futures_and_or_events) + any_resolved_future_on default_executor, *futures_and_or_events + end + + alias_method :any, :any_resolved_future + + # Creates new future which is resolved after first futures_and_or_events is resolved. + # Its result equals result of the first resolved future. + # @!macro promises.any-touch + # If resolved it does not propagate {Concurrent::AbstractEventFuture#touch}, leaving delayed + # futures un-executed if they are not required any more. + # @!macro promises.event-conversion + # + # @!macro promises.param.default_executor + # @param [AbstractEventFuture] futures_and_or_events + # @return [Future] + def any_resolved_future_on(default_executor, *futures_and_or_events) + AnyResolvedFuturePromise.new_blocked_by(futures_and_or_events, default_executor).future + end + + # @!macro promises.shortcut.on + # @return [Future] + def any_fulfilled_future(*futures_and_or_events) + any_fulfilled_future_on default_executor, *futures_and_or_events + end + + # Creates new future which is resolved after first of futures_and_or_events is fulfilled. + # Its result equals result of the first resolved future or if all futures_and_or_events reject, + # it has reason of the last resolved future. + # @!macro promises.any-touch + # @!macro promises.event-conversion + # + # @!macro promises.param.default_executor + # @param [AbstractEventFuture] futures_and_or_events + # @return [Future] + def any_fulfilled_future_on(default_executor, *futures_and_or_events) + AnyFulfilledFuturePromise.new_blocked_by(futures_and_or_events, default_executor).future + end + + # @!macro promises.shortcut.on + # @return [Future] + def any_event(*futures_and_or_events) + any_event_on default_executor, *futures_and_or_events + end + + # Creates new event which becomes resolved after first of the futures_and_or_events resolves. + # @!macro promises.any-touch + # + # @!macro promises.param.default_executor + # @param [AbstractEventFuture] futures_and_or_events + # @return [Event] + def any_event_on(default_executor, *futures_and_or_events) + AnyResolvedEventPromise.new_blocked_by(futures_and_or_events, default_executor).event + end + + # TODO consider adding first(count, *futures) + # TODO consider adding zip_by(slice, *futures) processing futures in slices + # TODO or rather a generic aggregator taking a function + end + + module InternalStates + # @!visibility private + class State + def resolved? + raise NotImplementedError + end + + def to_sym + raise NotImplementedError + end + end + + # @!visibility private + class Pending < State + def resolved? + false + end + + def to_sym + :pending + end + end + + # @!visibility private + class Reserved < Pending + end + + # @!visibility private + class ResolvedWithResult < State + def resolved? + true + end + + def to_sym + :resolved + end + + def result + [fulfilled?, value, reason] + end + + def fulfilled? + raise NotImplementedError + end + + def value + raise NotImplementedError + end + + def reason + raise NotImplementedError + end + + def apply + raise NotImplementedError + end + end + + # @!visibility private + class Fulfilled < ResolvedWithResult + + def initialize(value) + @Value = value + end + + def fulfilled? + true + end + + def apply(args, block) + block.call value, *args + end + + def value + @Value + end + + def reason + nil + end + + def to_sym + :fulfilled + end + end + + # @!visibility private + class FulfilledArray < Fulfilled + def apply(args, block) + block.call(*value, *args) + end + end + + # @!visibility private + class Rejected < ResolvedWithResult + def initialize(reason) + @Reason = reason + end + + def fulfilled? + false + end + + def value + nil + end + + def reason + @Reason + end + + def to_sym + :rejected + end + + def apply(args, block) + block.call reason, *args + end + end + + # @!visibility private + class PartiallyRejected < ResolvedWithResult + def initialize(value, reason) + super() + @Value = value + @Reason = reason + end + + def fulfilled? + false + end + + def to_sym + :rejected + end + + def value + @Value + end + + def reason + @Reason + end + + def apply(args, block) + block.call(*reason, *args) + end + end + + # @!visibility private + PENDING = Pending.new + # @!visibility private + RESERVED = Reserved.new + # @!visibility private + RESOLVED = Fulfilled.new(nil) + + def RESOLVED.to_sym + :resolved + end + end + + private_constant :InternalStates + + # @!macro promises.shortcut.event-future + # @see Event#$0 + # @see Future#$0 + + # @!macro promises.param.timeout + # @param [Numeric] timeout the maximum time in second to wait. + + # @!macro promises.warn.blocks + # @note This function potentially blocks current thread until the Future is resolved. + # Be careful it can deadlock. Try to chain instead. + + # Common ancestor of {Event} and {Future} classes, many shared methods are defined here. + class AbstractEventFuture < Synchronization::Object + safe_initialization! + attr_atomic(:internal_state) + private :internal_state=, :swap_internal_state, :compare_and_set_internal_state, :update_internal_state + # @!method internal_state + # @!visibility private + + include InternalStates + + def initialize(promise, default_executor) + super() + @Lock = Mutex.new + @Condition = ConditionVariable.new + @Promise = promise + @DefaultExecutor = default_executor + @Callbacks = LockFreeStack.new + @Waiters = AtomicFixnum.new 0 + self.internal_state = PENDING + end + + private :initialize + + # Returns its state. + # @return [Symbol] + # + # @overload an_event.state + # @return [:pending, :resolved] + # @overload a_future.state + # Both :fulfilled, :rejected implies :resolved. + # @return [:pending, :fulfilled, :rejected] + def state + internal_state.to_sym + end + + # Is it in pending state? + # @return [Boolean] + def pending? + !internal_state.resolved? + end + + # Is it in resolved state? + # @return [Boolean] + def resolved? + internal_state.resolved? + end + + # Propagates touch. Requests all the delayed futures, which it depends on, to be + # executed. This method is called by any other method requiring resolved state, like {#wait}. + # @return [self] + def touch + @Promise.touch + self + end + + # @!macro promises.touches + # Calls {Concurrent::AbstractEventFuture#touch}. + + # @!macro promises.method.wait + # Wait (block the Thread) until receiver is {#resolved?}. + # @!macro promises.touches + # + # @!macro promises.warn.blocks + # @!macro promises.param.timeout + # @return [self, true, false] self implies timeout was not used, true implies timeout was used + # and it was resolved, false implies it was not resolved within timeout. + def wait(timeout = nil) + result = wait_until_resolved(timeout) + timeout ? result : self + end + + # Returns default executor. + # @return [Executor] default executor + # @see #with_default_executor + # @see FactoryMethods#future_on + # @see FactoryMethods#resolvable_future + # @see FactoryMethods#any_fulfilled_future_on + # @see similar + def default_executor + @DefaultExecutor + end + + # @!macro promises.shortcut.on + # @return [Future] + def chain(*args, &task) + chain_on @DefaultExecutor, *args, &task + end + + # Chains the task to be executed asynchronously on executor after it is resolved. + # + # @!macro promises.param.executor + # @!macro promises.param.args + # @return [Future] + # @!macro promise.param.task-future + # + # @overload an_event.chain_on(executor, *args, &task) + # @yield [*args] to the task. + # @overload a_future.chain_on(executor, *args, &task) + # @yield [fulfilled, value, reason, *args] to the task. + # @yieldparam [true, false] fulfilled + # @yieldparam [Object] value + # @yieldparam [Object] reason + def chain_on(executor, *args, &task) + ChainPromise.new_blocked_by1(self, @DefaultExecutor, executor, args, &task).future + end + + # @return [String] Short string representation. + def to_s + format '%s %s>', super[0..-2], state + end + + alias_method :inspect, :to_s + + # Resolves the resolvable when receiver is resolved. + # + # @param [Resolvable] resolvable + # @return [self] + def chain_resolvable(resolvable) + on_resolution! { resolvable.resolve_with internal_state } + end + + alias_method :tangle, :chain_resolvable + + # @!macro promises.shortcut.using + # @return [self] + def on_resolution(*args, &callback) + on_resolution_using @DefaultExecutor, *args, &callback + end + + # Stores the callback to be executed synchronously on resolving thread after it is + # resolved. + # + # @!macro promises.param.args + # @!macro promise.param.callback + # @return [self] + # + # @overload an_event.on_resolution!(*args, &callback) + # @yield [*args] to the callback. + # @overload a_future.on_resolution!(*args, &callback) + # @yield [fulfilled, value, reason, *args] to the callback. + # @yieldparam [true, false] fulfilled + # @yieldparam [Object] value + # @yieldparam [Object] reason + def on_resolution!(*args, &callback) + add_callback :callback_on_resolution, args, callback + end + + # Stores the callback to be executed asynchronously on executor after it is resolved. + # + # @!macro promises.param.executor + # @!macro promises.param.args + # @!macro promise.param.callback + # @return [self] + # + # @overload an_event.on_resolution_using(executor, *args, &callback) + # @yield [*args] to the callback. + # @overload a_future.on_resolution_using(executor, *args, &callback) + # @yield [fulfilled, value, reason, *args] to the callback. + # @yieldparam [true, false] fulfilled + # @yieldparam [Object] value + # @yieldparam [Object] reason + def on_resolution_using(executor, *args, &callback) + add_callback :async_callback_on_resolution, executor, args, callback + end + + # @!macro promises.method.with_default_executor + # Crates new object with same class with the executor set as its new default executor. + # Any futures depending on it will use the new default executor. + # @!macro promises.shortcut.event-future + # @abstract + # @return [AbstractEventFuture] + def with_default_executor(executor) + raise NotImplementedError + end + + # @!visibility private + def resolve_with(state, raise_on_reassign = true, reserved = false) + if compare_and_set_internal_state(reserved ? RESERVED : PENDING, state) + # go to synchronized block only if there were waiting threads + @Lock.synchronize { @Condition.broadcast } unless @Waiters.value == 0 + call_callbacks state + else + return rejected_resolution(raise_on_reassign, state) + end + self + end + + # For inspection. + # @!visibility private + # @return [Array<AbstractPromise>] + def blocks + @Callbacks.each_with_object([]) do |(method, args), promises| + promises.push(args[0]) if method == :callback_notify_blocked + end + end + + # For inspection. + # @!visibility private + def callbacks + @Callbacks.each.to_a + end + + # For inspection. + # @!visibility private + def promise + @Promise + end + + # For inspection. + # @!visibility private + def touched? + promise.touched? + end + + # For inspection. + # @!visibility private + def waiting_threads + @Waiters.each.to_a + end + + # @!visibility private + def add_callback_notify_blocked(promise, index) + add_callback :callback_notify_blocked, promise, index + end + + # @!visibility private + def add_callback_clear_delayed_node(node) + add_callback(:callback_clear_delayed_node, node) + end + + # @!visibility private + def with_hidden_resolvable + # TODO (pitr-ch 10-Dec-2018): documentation, better name if in edge + self + end + + private + + def add_callback(method, *args) + state = internal_state + if state.resolved? + call_callback method, state, args + else + @Callbacks.push [method, args] + state = internal_state + # take back if it was resolved in the meanwhile + call_callbacks state if state.resolved? + end + self + end + + def callback_clear_delayed_node(state, node) + node.value = nil + end + + # @return [Boolean] + def wait_until_resolved(timeout) + return true if resolved? + + touch + + @Lock.synchronize do + @Waiters.increment + begin + unless resolved? + @Condition.wait @Lock, timeout + end + ensure + # JRuby may raise ConcurrencyError + @Waiters.decrement + end + end + resolved? + end + + def call_callback(method, state, args) + self.send method, state, *args + end + + def call_callbacks(state) + method, args = @Callbacks.pop + while method + call_callback method, state, args + method, args = @Callbacks.pop + end + end + + def with_async(executor, *args, &block) + Concurrent.executor(executor).post(*args, &block) + end + + def async_callback_on_resolution(state, executor, args, callback) + with_async(executor, state, args, callback) do |st, ar, cb| + callback_on_resolution st, ar, cb + end + end + + def callback_notify_blocked(state, promise, index) + promise.on_blocker_resolution self, index + end + end + + # Represents an event which will happen in future (will be resolved). The event is either + # pending or resolved. It should be always resolved. Use {Future} to communicate rejections and + # cancellation. + class Event < AbstractEventFuture + + alias_method :then, :chain + + + # @!macro promises.method.zip + # Creates a new event or a future which will be resolved when receiver and other are. + # Returns an event if receiver and other are events, otherwise returns a future. + # If just one of the parties is Future then the result + # of the returned future is equal to the result of the supplied future. If both are futures + # then the result is as described in {FactoryMethods#zip_futures_on}. + # + # @return [Future, Event] + def zip(other) + if other.is_a?(Future) + ZipFutureEventPromise.new_blocked_by2(other, self, @DefaultExecutor).future + else + ZipEventEventPromise.new_blocked_by2(self, other, @DefaultExecutor).event + end + end + + alias_method :&, :zip + + # Creates a new event which will be resolved when the first of receiver, `event_or_future` + # resolves. + # + # @return [Event] + def any(event_or_future) + AnyResolvedEventPromise.new_blocked_by2(self, event_or_future, @DefaultExecutor).event + end + + alias_method :|, :any + + # Creates new event dependent on receiver which will not evaluate until touched, see {#touch}. + # In other words, it inserts delay into the chain of Futures making rest of it lazy evaluated. + # + # @return [Event] + def delay + event = DelayPromise.new(@DefaultExecutor).event + ZipEventEventPromise.new_blocked_by2(self, event, @DefaultExecutor).event + end + + # @!macro promise.method.schedule + # Creates new event dependent on receiver scheduled to execute on/in intended_time. + # In time is interpreted from the moment the receiver is resolved, therefore it inserts + # delay into the chain. + # + # @!macro promises.param.intended_time + # @return [Event] + def schedule(intended_time) + chain do + event = ScheduledPromise.new(@DefaultExecutor, intended_time).event + ZipEventEventPromise.new_blocked_by2(self, event, @DefaultExecutor).event + end.flat_event + end + + # Converts event to a future. The future is fulfilled when the event is resolved, the future may never fail. + # + # @return [Future] + def to_future + future = Promises.resolvable_future + ensure + chain_resolvable(future) + end + + # Returns self, since this is event + # @return [Event] + def to_event + self + end + + # @!macro promises.method.with_default_executor + # @return [Event] + def with_default_executor(executor) + EventWrapperPromise.new_blocked_by1(self, executor).event + end + + private + + def rejected_resolution(raise_on_reassign, state) + Concurrent::MultipleAssignmentError.new('Event can be resolved only once') if raise_on_reassign + return false + end + + def callback_on_resolution(state, args, callback) + callback.call(*args) + end + end + + # Represents a value which will become available in future. May reject with a reason instead, + # e.g. when the tasks raises an exception. + class Future < AbstractEventFuture + + # Is it in fulfilled state? + # @return [Boolean] + def fulfilled? + state = internal_state + state.resolved? && state.fulfilled? + end + + # Is it in rejected state? + # @return [Boolean] + def rejected? + state = internal_state + state.resolved? && !state.fulfilled? + end + + # @!macro promises.warn.nil + # @note Make sure returned `nil` is not confused with timeout, no value when rejected, + # no reason when fulfilled, etc. + # Use more exact methods if needed, like {#wait}, {#value!}, {#result}, etc. + + # @!macro promises.method.value + # Return value of the future. + # @!macro promises.touches + # + # @!macro promises.warn.blocks + # @!macro promises.warn.nil + # @!macro promises.param.timeout + # @!macro promises.param.timeout_value + # @param [Object] timeout_value a value returned by the method when it times out + # @return [Object, nil, timeout_value] the value of the Future when fulfilled, + # timeout_value on timeout, + # nil on rejection. + def value(timeout = nil, timeout_value = nil) + if wait_until_resolved timeout + internal_state.value + else + timeout_value + end + end + + # Returns reason of future's rejection. + # @!macro promises.touches + # + # @!macro promises.warn.blocks + # @!macro promises.warn.nil + # @!macro promises.param.timeout + # @!macro promises.param.timeout_value + # @return [Object, timeout_value] the reason, or timeout_value on timeout, or nil on fulfillment. + def reason(timeout = nil, timeout_value = nil) + if wait_until_resolved timeout + internal_state.reason + else + timeout_value + end + end + + # Returns triplet fulfilled?, value, reason. + # @!macro promises.touches + # + # @!macro promises.warn.blocks + # @!macro promises.param.timeout + # @return [Array(Boolean, Object, Object), nil] triplet of fulfilled?, value, reason, or nil + # on timeout. + def result(timeout = nil) + internal_state.result if wait_until_resolved timeout + end + + # @!macro promises.method.wait + # @raise [Exception] {#reason} on rejection + def wait!(timeout = nil) + result = wait_until_resolved!(timeout) + timeout ? result : self + end + + # @!macro promises.method.value + # @return [Object, nil, timeout_value] the value of the Future when fulfilled, + # or nil on rejection, + # or timeout_value on timeout. + # @raise [Exception] {#reason} on rejection + def value!(timeout = nil, timeout_value = nil) + if wait_until_resolved! timeout + internal_state.value + else + timeout_value + end + end + + # Allows rejected Future to be risen with `raise` method. + # If the reason is not an exception `Runtime.new(reason)` is returned. + # + # @example + # raise Promises.rejected_future(StandardError.new("boom")) + # raise Promises.rejected_future("or just boom") + # @raise [Concurrent::Error] when raising not rejected future + # @return [Exception] + def exception(*args) + raise Concurrent::Error, 'it is not rejected' unless rejected? + raise ArgumentError unless args.size <= 1 + reason = Array(internal_state.reason).flatten.compact + if reason.size > 1 + ex = Concurrent::MultipleErrors.new reason + ex.set_backtrace(caller) + ex + else + ex = if reason[0].respond_to? :exception + reason[0].exception(*args) + else + RuntimeError.new(reason[0]).exception(*args) + end + ex.set_backtrace Array(ex.backtrace) + caller + ex + end + end + + # @!macro promises.shortcut.on + # @return [Future] + def then(*args, &task) + then_on @DefaultExecutor, *args, &task + end + + # Chains the task to be executed asynchronously on executor after it fulfills. Does not run + # the task if it rejects. It will resolve though, triggering any dependent futures. + # + # @!macro promises.param.executor + # @!macro promises.param.args + # @!macro promise.param.task-future + # @return [Future] + # @yield [value, *args] to the task. + def then_on(executor, *args, &task) + ThenPromise.new_blocked_by1(self, @DefaultExecutor, executor, args, &task).future + end + + # @!macro promises.shortcut.on + # @return [Future] + def rescue(*args, &task) + rescue_on @DefaultExecutor, *args, &task + end + + # Chains the task to be executed asynchronously on executor after it rejects. Does not run + # the task if it fulfills. It will resolve though, triggering any dependent futures. + # + # @!macro promises.param.executor + # @!macro promises.param.args + # @!macro promise.param.task-future + # @return [Future] + # @yield [reason, *args] to the task. + def rescue_on(executor, *args, &task) + RescuePromise.new_blocked_by1(self, @DefaultExecutor, executor, args, &task).future + end + + # @!macro promises.method.zip + # @return [Future] + def zip(other) + if other.is_a?(Future) + ZipFuturesPromise.new_blocked_by2(self, other, @DefaultExecutor).future + else + ZipFutureEventPromise.new_blocked_by2(self, other, @DefaultExecutor).future + end + end + + alias_method :&, :zip + + # Creates a new event which will be resolved when the first of receiver, `event_or_future` + # resolves. Returning future will have value nil if event_or_future is event and resolves + # first. + # + # @return [Future] + def any(event_or_future) + AnyResolvedFuturePromise.new_blocked_by2(self, event_or_future, @DefaultExecutor).future + end + + alias_method :|, :any + + # Creates new future dependent on receiver which will not evaluate until touched, see {#touch}. + # In other words, it inserts delay into the chain of Futures making rest of it lazy evaluated. + # + # @return [Future] + def delay + event = DelayPromise.new(@DefaultExecutor).event + ZipFutureEventPromise.new_blocked_by2(self, event, @DefaultExecutor).future + end + + # @!macro promise.method.schedule + # @return [Future] + def schedule(intended_time) + chain do + event = ScheduledPromise.new(@DefaultExecutor, intended_time).event + ZipFutureEventPromise.new_blocked_by2(self, event, @DefaultExecutor).future + end.flat + end + + # @!macro promises.method.with_default_executor + # @return [Future] + def with_default_executor(executor) + FutureWrapperPromise.new_blocked_by1(self, executor).future + end + + # Creates new future which will have result of the future returned by receiver. If receiver + # rejects it will have its rejection. + # + # @param [Integer] level how many levels of futures should flatten + # @return [Future] + def flat_future(level = 1) + FlatFuturePromise.new_blocked_by1(self, level, @DefaultExecutor).future + end + + alias_method :flat, :flat_future + + # Creates new event which will be resolved when the returned event by receiver is. + # Be careful if the receiver rejects it will just resolve since Event does not hold reason. + # + # @return [Event] + def flat_event + FlatEventPromise.new_blocked_by1(self, @DefaultExecutor).event + end + + # @!macro promises.shortcut.using + # @return [self] + def on_fulfillment(*args, &callback) + on_fulfillment_using @DefaultExecutor, *args, &callback + end + + # Stores the callback to be executed synchronously on resolving thread after it is + # fulfilled. Does nothing on rejection. + # + # @!macro promises.param.args + # @!macro promise.param.callback + # @return [self] + # @yield [value, *args] to the callback. + def on_fulfillment!(*args, &callback) + add_callback :callback_on_fulfillment, args, callback + end + + # Stores the callback to be executed asynchronously on executor after it is + # fulfilled. Does nothing on rejection. + # + # @!macro promises.param.executor + # @!macro promises.param.args + # @!macro promise.param.callback + # @return [self] + # @yield [value, *args] to the callback. + def on_fulfillment_using(executor, *args, &callback) + add_callback :async_callback_on_fulfillment, executor, args, callback + end + + # @!macro promises.shortcut.using + # @return [self] + def on_rejection(*args, &callback) + on_rejection_using @DefaultExecutor, *args, &callback + end + + # Stores the callback to be executed synchronously on resolving thread after it is + # rejected. Does nothing on fulfillment. + # + # @!macro promises.param.args + # @!macro promise.param.callback + # @return [self] + # @yield [reason, *args] to the callback. + def on_rejection!(*args, &callback) + add_callback :callback_on_rejection, args, callback + end + + # Stores the callback to be executed asynchronously on executor after it is + # rejected. Does nothing on fulfillment. + # + # @!macro promises.param.executor + # @!macro promises.param.args + # @!macro promise.param.callback + # @return [self] + # @yield [reason, *args] to the callback. + def on_rejection_using(executor, *args, &callback) + add_callback :async_callback_on_rejection, executor, args, callback + end + + # Allows to use futures as green threads. The receiver has to evaluate to a future which + # represents what should be done next. It basically flattens indefinitely until non Future + # values is returned which becomes result of the returned future. Any encountered exception + # will become reason of the returned future. + # + # @return [Future] + # @param [#call(value)] run_test + # an object which when called returns either Future to keep running with + # or nil, then the run completes with the value. + # The run_test can be used to extract the Future from deeper structure, + # or to distinguish Future which is a resulting value from a future + # which is suppose to continue running. + # @example + # body = lambda do |v| + # v += 1 + # v < 5 ? Promises.future(v, &body) : v + # end + # Promises.future(0, &body).run.value! # => 5 + def run(run_test = method(:run_test)) + RunFuturePromise.new_blocked_by1(self, @DefaultExecutor, run_test).future + end + + # @!visibility private + def apply(args, block) + internal_state.apply args, block + end + + # Converts future to event which is resolved when future is resolved by fulfillment or rejection. + # + # @return [Event] + def to_event + event = Promises.resolvable_event + ensure + chain_resolvable(event) + end + + # Returns self, since this is a future + # @return [Future] + def to_future + self + end + + # @return [String] Short string representation. + def to_s + if resolved? + format '%s with %s>', super[0..-2], (fulfilled? ? value : reason).inspect + else + super + end + end + + alias_method :inspect, :to_s + + private + + def run_test(v) + v if v.is_a?(Future) + end + + def rejected_resolution(raise_on_reassign, state) + if raise_on_reassign + if internal_state == RESERVED + raise Concurrent::MultipleAssignmentError.new( + "Future can be resolved only once. It is already reserved.") + else + raise Concurrent::MultipleAssignmentError.new( + "Future can be resolved only once. It's #{result}, trying to set #{state.result}.", + current_result: result, + new_result: state.result) + end + end + return false + end + + def wait_until_resolved!(timeout = nil) + result = wait_until_resolved(timeout) + raise self if rejected? + result + end + + def async_callback_on_fulfillment(state, executor, args, callback) + with_async(executor, state, args, callback) do |st, ar, cb| + callback_on_fulfillment st, ar, cb + end + end + + def async_callback_on_rejection(state, executor, args, callback) + with_async(executor, state, args, callback) do |st, ar, cb| + callback_on_rejection st, ar, cb + end + end + + def callback_on_fulfillment(state, args, callback) + state.apply args, callback if state.fulfilled? + end + + def callback_on_rejection(state, args, callback) + state.apply args, callback unless state.fulfilled? + end + + def callback_on_resolution(state, args, callback) + callback.call(*state.result, *args) + end + + end + + # Marker module of Future, Event resolved manually. + module Resolvable + include InternalStates + end + + # A Event which can be resolved by user. + class ResolvableEvent < Event + include Resolvable + + # @!macro raise_on_reassign + # @raise [MultipleAssignmentError] when already resolved and raise_on_reassign is true. + + # @!macro promise.param.raise_on_reassign + # @param [Boolean] raise_on_reassign should method raise exception if already resolved + # @return [self, false] false is returner when raise_on_reassign is false and the receiver + # is already resolved. + # + + # Makes the event resolved, which triggers all dependent futures. + # + # @!macro promise.param.raise_on_reassign + # @!macro promise.param.reserved + # @param [true, false] reserved + # Set to true if the resolvable is {#reserve}d by you, + # marks resolution of reserved resolvable events and futures explicitly. + # Advanced feature, ignore unless you use {Resolvable#reserve} from edge. + def resolve(raise_on_reassign = true, reserved = false) + resolve_with RESOLVED, raise_on_reassign, reserved + end + + # Creates new event wrapping receiver, effectively hiding the resolve method. + # + # @return [Event] + def with_hidden_resolvable + @with_hidden_resolvable ||= EventWrapperPromise.new_blocked_by1(self, @DefaultExecutor).event + end + + # Behaves as {AbstractEventFuture#wait} but has one additional optional argument + # resolve_on_timeout. + # + # @param [true, false] resolve_on_timeout + # If it times out and the argument is true it will also resolve the event. + # @return [self, true, false] + # @see AbstractEventFuture#wait + def wait(timeout = nil, resolve_on_timeout = false) + super(timeout) or if resolve_on_timeout + # if it fails to resolve it was resolved in the meantime + # so return true as if there was no timeout + !resolve(false) + else + false + end + end + end + + # A Future which can be resolved by user. + class ResolvableFuture < Future + include Resolvable + + # Makes the future resolved with result of triplet `fulfilled?`, `value`, `reason`, + # which triggers all dependent futures. + # + # @param [true, false] fulfilled + # @param [Object] value + # @param [Object] reason + # @!macro promise.param.raise_on_reassign + # @!macro promise.param.reserved + def resolve(fulfilled = true, value = nil, reason = nil, raise_on_reassign = true, reserved = false) + resolve_with(fulfilled ? Fulfilled.new(value) : Rejected.new(reason), raise_on_reassign, reserved) + end + + # Makes the future fulfilled with `value`, + # which triggers all dependent futures. + # + # @param [Object] value + # @!macro promise.param.raise_on_reassign + # @!macro promise.param.reserved + def fulfill(value, raise_on_reassign = true, reserved = false) + resolve_with Fulfilled.new(value), raise_on_reassign, reserved + end + + # Makes the future rejected with `reason`, + # which triggers all dependent futures. + # + # @param [Object] reason + # @!macro promise.param.raise_on_reassign + # @!macro promise.param.reserved + def reject(reason, raise_on_reassign = true, reserved = false) + resolve_with Rejected.new(reason), raise_on_reassign, reserved + end + + # Evaluates the block and sets its result as future's value fulfilling, if the block raises + # an exception the future rejects with it. + # + # @yield [*args] to the block. + # @yieldreturn [Object] value + # @return [self] + def evaluate_to(*args, &block) + promise.evaluate_to(*args, block) + end + + # Evaluates the block and sets its result as future's value fulfilling, if the block raises + # an exception the future rejects with it. + # + # @yield [*args] to the block. + # @yieldreturn [Object] value + # @return [self] + # @raise [Exception] also raise reason on rejection. + def evaluate_to!(*args, &block) + promise.evaluate_to(*args, block).wait! + end + + # @!macro promises.resolvable.resolve_on_timeout + # @param [::Array(true, Object, nil), ::Array(false, nil, Exception), nil] resolve_on_timeout + # If it times out and the argument is not nil it will also resolve the future + # to the provided resolution. + + # Behaves as {AbstractEventFuture#wait} but has one additional optional argument + # resolve_on_timeout. + # + # @!macro promises.resolvable.resolve_on_timeout + # @return [self, true, false] + # @see AbstractEventFuture#wait + def wait(timeout = nil, resolve_on_timeout = nil) + super(timeout) or if resolve_on_timeout + # if it fails to resolve it was resolved in the meantime + # so return true as if there was no timeout + !resolve(*resolve_on_timeout, false) + else + false + end + end + + # Behaves as {Future#wait!} but has one additional optional argument + # resolve_on_timeout. + # + # @!macro promises.resolvable.resolve_on_timeout + # @return [self, true, false] + # @raise [Exception] {#reason} on rejection + # @see Future#wait! + def wait!(timeout = nil, resolve_on_timeout = nil) + super(timeout) or if resolve_on_timeout + if resolve(*resolve_on_timeout, false) + false + else + # if it fails to resolve it was resolved in the meantime + # so return true as if there was no timeout + raise self if rejected? + true + end + else + false + end + end + + # Behaves as {Future#value} but has one additional optional argument + # resolve_on_timeout. + # + # @!macro promises.resolvable.resolve_on_timeout + # @return [Object, timeout_value, nil] + # @see Future#value + def value(timeout = nil, timeout_value = nil, resolve_on_timeout = nil) + if wait_until_resolved timeout + internal_state.value + else + if resolve_on_timeout + unless resolve(*resolve_on_timeout, false) + # if it fails to resolve it was resolved in the meantime + # so return value as if there was no timeout + return internal_state.value + end + end + timeout_value + end + end + + # Behaves as {Future#value!} but has one additional optional argument + # resolve_on_timeout. + # + # @!macro promises.resolvable.resolve_on_timeout + # @return [Object, timeout_value, nil] + # @raise [Exception] {#reason} on rejection + # @see Future#value! + def value!(timeout = nil, timeout_value = nil, resolve_on_timeout = nil) + if wait_until_resolved! timeout + internal_state.value + else + if resolve_on_timeout + unless resolve(*resolve_on_timeout, false) + # if it fails to resolve it was resolved in the meantime + # so return value as if there was no timeout + raise self if rejected? + return internal_state.value + end + end + timeout_value + end + end + + # Behaves as {Future#reason} but has one additional optional argument + # resolve_on_timeout. + # + # @!macro promises.resolvable.resolve_on_timeout + # @return [Exception, timeout_value, nil] + # @see Future#reason + def reason(timeout = nil, timeout_value = nil, resolve_on_timeout = nil) + if wait_until_resolved timeout + internal_state.reason + else + if resolve_on_timeout + unless resolve(*resolve_on_timeout, false) + # if it fails to resolve it was resolved in the meantime + # so return value as if there was no timeout + return internal_state.reason + end + end + timeout_value + end + end + + # Behaves as {Future#result} but has one additional optional argument + # resolve_on_timeout. + # + # @!macro promises.resolvable.resolve_on_timeout + # @return [::Array(Boolean, Object, Exception), nil] + # @see Future#result + def result(timeout = nil, resolve_on_timeout = nil) + if wait_until_resolved timeout + internal_state.result + else + if resolve_on_timeout + unless resolve(*resolve_on_timeout, false) + # if it fails to resolve it was resolved in the meantime + # so return value as if there was no timeout + internal_state.result + end + end + # otherwise returns nil + end + end + + # Creates new future wrapping receiver, effectively hiding the resolve method and similar. + # + # @return [Future] + def with_hidden_resolvable + @with_hidden_resolvable ||= FutureWrapperPromise.new_blocked_by1(self, @DefaultExecutor).future + end + end + + # @abstract + # @private + class AbstractPromise < Synchronization::Object + safe_initialization! + include InternalStates + + def initialize(future) + super() + @Future = future + end + + def future + @Future + end + + alias_method :event, :future + + def default_executor + future.default_executor + end + + def state + future.state + end + + def touch + end + + def to_s + format '%s %s>', super[0..-2], @Future + end + + alias_method :inspect, :to_s + + def delayed_because + nil + end + + private + + def resolve_with(new_state, raise_on_reassign = true) + @Future.resolve_with(new_state, raise_on_reassign) + end + + # @return [Future] + def evaluate_to(*args, block) + resolve_with Fulfilled.new(block.call(*args)) + rescue Exception => error + resolve_with Rejected.new(error) + raise error unless error.is_a?(StandardError) + end + end + + class ResolvableEventPromise < AbstractPromise + def initialize(default_executor) + super ResolvableEvent.new(self, default_executor) + end + end + + class ResolvableFuturePromise < AbstractPromise + def initialize(default_executor) + super ResolvableFuture.new(self, default_executor) + end + + public :evaluate_to + end + + # @abstract + class InnerPromise < AbstractPromise + end + + # @abstract + class BlockedPromise < InnerPromise + + private_class_method :new + + def self.new_blocked_by1(blocker, *args, &block) + blocker_delayed = blocker.promise.delayed_because + promise = new(blocker_delayed, 1, *args, &block) + blocker.add_callback_notify_blocked promise, 0 + promise + end + + def self.new_blocked_by2(blocker1, blocker2, *args, &block) + blocker_delayed1 = blocker1.promise.delayed_because + blocker_delayed2 = blocker2.promise.delayed_because + delayed = if blocker_delayed1 && blocker_delayed2 + # TODO (pitr-ch 23-Dec-2016): use arrays when we know it will not grow (only flat adds delay) + LockFreeStack.of2(blocker_delayed1, blocker_delayed2) + else + blocker_delayed1 || blocker_delayed2 + end + promise = new(delayed, 2, *args, &block) + blocker1.add_callback_notify_blocked promise, 0 + blocker2.add_callback_notify_blocked promise, 1 + promise + end + + def self.new_blocked_by(blockers, *args, &block) + delayed = blockers.reduce(nil) { |d, f| add_delayed d, f.promise.delayed_because } + promise = new(delayed, blockers.size, *args, &block) + blockers.each_with_index { |f, i| f.add_callback_notify_blocked promise, i } + promise + end + + def self.add_delayed(delayed1, delayed2) + if delayed1 && delayed2 + delayed1.push delayed2 + delayed1 + else + delayed1 || delayed2 + end + end + + def initialize(delayed, blockers_count, future) + super(future) + @Delayed = delayed + @Countdown = AtomicFixnum.new blockers_count + end + + def on_blocker_resolution(future, index) + countdown = process_on_blocker_resolution(future, index) + resolvable = resolvable?(countdown, future, index) + + on_resolvable(future, index) if resolvable + end + + def delayed_because + @Delayed + end + + def touch + clear_and_propagate_touch + end + + # for inspection only + def blocked_by + blocked_by = [] + ObjectSpace.each_object(AbstractEventFuture) { |o| blocked_by.push o if o.blocks.include? self } + blocked_by + end + + private + + def clear_and_propagate_touch(stack_or_element = @Delayed) + return if stack_or_element.nil? + + if stack_or_element.is_a? LockFreeStack + stack_or_element.clear_each { |element| clear_and_propagate_touch element } + else + stack_or_element.touch unless stack_or_element.nil? # if still present + end + end + + # @return [true,false] if resolvable + def resolvable?(countdown, future, index) + countdown.zero? + end + + def process_on_blocker_resolution(future, index) + @Countdown.decrement + end + + def on_resolvable(resolved_future, index) + raise NotImplementedError + end + end + + # @abstract + class BlockedTaskPromise < BlockedPromise + def initialize(delayed, blockers_count, default_executor, executor, args, &task) + raise ArgumentError, 'no block given' unless block_given? + super delayed, 1, Future.new(self, default_executor) + @Executor = executor + @Task = task + @Args = args + end + + def executor + @Executor + end + end + + class ThenPromise < BlockedTaskPromise + private + + def initialize(delayed, blockers_count, default_executor, executor, args, &task) + super delayed, blockers_count, default_executor, executor, args, &task + end + + def on_resolvable(resolved_future, index) + if resolved_future.fulfilled? + Concurrent.executor(@Executor).post(resolved_future, @Args, @Task) do |future, args, task| + evaluate_to lambda { future.apply args, task } + end + else + resolve_with resolved_future.internal_state + end + end + end + + class RescuePromise < BlockedTaskPromise + private + + def initialize(delayed, blockers_count, default_executor, executor, args, &task) + super delayed, blockers_count, default_executor, executor, args, &task + end + + def on_resolvable(resolved_future, index) + if resolved_future.rejected? + Concurrent.executor(@Executor).post(resolved_future, @Args, @Task) do |future, args, task| + evaluate_to lambda { future.apply args, task } + end + else + resolve_with resolved_future.internal_state + end + end + end + + class ChainPromise < BlockedTaskPromise + private + + def on_resolvable(resolved_future, index) + if Future === resolved_future + Concurrent.executor(@Executor).post(resolved_future, @Args, @Task) do |future, args, task| + evaluate_to(*future.result, *args, task) + end + else + Concurrent.executor(@Executor).post(@Args, @Task) do |args, task| + evaluate_to(*args, task) + end + end + end + end + + # will be immediately resolved + class ImmediateEventPromise < InnerPromise + def initialize(default_executor) + super Event.new(self, default_executor).resolve_with(RESOLVED) + end + end + + class ImmediateFuturePromise < InnerPromise + def initialize(default_executor, fulfilled, value, reason) + super Future.new(self, default_executor). + resolve_with(fulfilled ? Fulfilled.new(value) : Rejected.new(reason)) + end + end + + class AbstractFlatPromise < BlockedPromise + + def initialize(delayed_because, blockers_count, event_or_future) + delayed = LockFreeStack.of1(self) + super(delayed, blockers_count, event_or_future) + # noinspection RubyArgCount + @Touched = AtomicBoolean.new false + @DelayedBecause = delayed_because || LockFreeStack.new + + event_or_future.add_callback_clear_delayed_node delayed.peek + end + + def touch + if @Touched.make_true + clear_and_propagate_touch @DelayedBecause + end + end + + private + + def touched? + @Touched.value + end + + def on_resolvable(resolved_future, index) + resolve_with resolved_future.internal_state + end + + def resolvable?(countdown, future, index) + !@Future.internal_state.resolved? && super(countdown, future, index) + end + + def add_delayed_of(future) + delayed = future.promise.delayed_because + if touched? + clear_and_propagate_touch delayed + else + BlockedPromise.add_delayed @DelayedBecause, delayed + clear_and_propagate_touch @DelayedBecause if touched? + end + end + + end + + class FlatEventPromise < AbstractFlatPromise + + private + + def initialize(delayed, blockers_count, default_executor) + super delayed, 2, Event.new(self, default_executor) + end + + def process_on_blocker_resolution(future, index) + countdown = super(future, index) + if countdown.nonzero? + internal_state = future.internal_state + + unless internal_state.fulfilled? + resolve_with RESOLVED + return countdown + end + + value = internal_state.value + case value + when AbstractEventFuture + add_delayed_of value + value.add_callback_notify_blocked self, nil + countdown + else + resolve_with RESOLVED + end + end + countdown + end + + end + + class FlatFuturePromise < AbstractFlatPromise + + private + + def initialize(delayed, blockers_count, levels, default_executor) + raise ArgumentError, 'levels has to be higher than 0' if levels < 1 + # flat promise may result to a future having delayed futures, therefore we have to have empty stack + # to be able to add new delayed futures + super delayed || LockFreeStack.new, 1 + levels, Future.new(self, default_executor) + end + + def process_on_blocker_resolution(future, index) + countdown = super(future, index) + if countdown.nonzero? + internal_state = future.internal_state + + unless internal_state.fulfilled? + resolve_with internal_state + return countdown + end + + value = internal_state.value + case value + when AbstractEventFuture + add_delayed_of value + value.add_callback_notify_blocked self, nil + countdown + else + evaluate_to(lambda { raise TypeError, "returned value #{value.inspect} is not a Future" }) + end + end + countdown + end + + end + + class RunFuturePromise < AbstractFlatPromise + + private + + def initialize(delayed, blockers_count, default_executor, run_test) + super delayed, 1, Future.new(self, default_executor) + @RunTest = run_test + end + + def process_on_blocker_resolution(future, index) + internal_state = future.internal_state + + unless internal_state.fulfilled? + resolve_with internal_state + return 0 + end + + value = internal_state.value + continuation_future = @RunTest.call value + + if continuation_future + add_delayed_of continuation_future + continuation_future.add_callback_notify_blocked self, nil + else + resolve_with internal_state + end + + 1 + end + end + + class ZipEventEventPromise < BlockedPromise + def initialize(delayed, blockers_count, default_executor) + super delayed, 2, Event.new(self, default_executor) + end + + private + + def on_resolvable(resolved_future, index) + resolve_with RESOLVED + end + end + + class ZipFutureEventPromise < BlockedPromise + def initialize(delayed, blockers_count, default_executor) + super delayed, 2, Future.new(self, default_executor) + @result = nil + end + + private + + def process_on_blocker_resolution(future, index) + # first blocking is future, take its result + @result = future.internal_state if index == 0 + # super has to be called after above to piggyback on volatile @Countdown + super future, index + end + + def on_resolvable(resolved_future, index) + resolve_with @result + end + end + + class EventWrapperPromise < BlockedPromise + def initialize(delayed, blockers_count, default_executor) + super delayed, 1, Event.new(self, default_executor) + end + + private + + def on_resolvable(resolved_future, index) + resolve_with RESOLVED + end + end + + class FutureWrapperPromise < BlockedPromise + def initialize(delayed, blockers_count, default_executor) + super delayed, 1, Future.new(self, default_executor) + end + + private + + def on_resolvable(resolved_future, index) + resolve_with resolved_future.internal_state + end + end + + class ZipFuturesPromise < BlockedPromise + + private + + def initialize(delayed, blockers_count, default_executor) + super(delayed, blockers_count, Future.new(self, default_executor)) + @Resolutions = ::Array.new(blockers_count, nil) + + on_resolvable nil, nil if blockers_count == 0 + end + + def process_on_blocker_resolution(future, index) + # TODO (pitr-ch 18-Dec-2016): Can we assume that array will never break under parallel access when never re-sized? + @Resolutions[index] = future.internal_state # has to be set before countdown in super + super future, index + end + + def on_resolvable(resolved_future, index) + all_fulfilled = true + values = ::Array.new(@Resolutions.size) + reasons = ::Array.new(@Resolutions.size) + + @Resolutions.each_with_index do |internal_state, i| + fulfilled, values[i], reasons[i] = internal_state.result + all_fulfilled &&= fulfilled + end + + if all_fulfilled + resolve_with FulfilledArray.new(values) + else + resolve_with PartiallyRejected.new(values, reasons) + end + end + end + + class ZipEventsPromise < BlockedPromise + + private + + def initialize(delayed, blockers_count, default_executor) + super delayed, blockers_count, Event.new(self, default_executor) + + on_resolvable nil, nil if blockers_count == 0 + end + + def on_resolvable(resolved_future, index) + resolve_with RESOLVED + end + end + + # @abstract + class AbstractAnyPromise < BlockedPromise + end + + class AnyResolvedEventPromise < AbstractAnyPromise + + private + + def initialize(delayed, blockers_count, default_executor) + super delayed, blockers_count, Event.new(self, default_executor) + end + + def resolvable?(countdown, future, index) + true + end + + def on_resolvable(resolved_future, index) + resolve_with RESOLVED, false + end + end + + class AnyResolvedFuturePromise < AbstractAnyPromise + + private + + def initialize(delayed, blockers_count, default_executor) + super delayed, blockers_count, Future.new(self, default_executor) + end + + def resolvable?(countdown, future, index) + true + end + + def on_resolvable(resolved_future, index) + resolve_with resolved_future.internal_state, false + end + end + + class AnyFulfilledFuturePromise < AnyResolvedFuturePromise + + private + + def resolvable?(countdown, future, index) + future.fulfilled? || + # inlined super from BlockedPromise + countdown.zero? + end + end + + class DelayPromise < InnerPromise + + def initialize(default_executor) + event = Event.new(self, default_executor) + @Delayed = LockFreeStack.of1(self) + super event + event.add_callback_clear_delayed_node @Delayed.peek + end + + def touch + @Future.resolve_with RESOLVED + end + + def delayed_because + @Delayed + end + + end + + class ScheduledPromise < InnerPromise + def intended_time + @IntendedTime + end + + def inspect + "#{to_s[0..-2]} intended_time: #{@IntendedTime}>" + end + + private + + def initialize(default_executor, intended_time) + super Event.new(self, default_executor) + + @IntendedTime = intended_time + + in_seconds = begin + now = Time.now + schedule_time = if @IntendedTime.is_a? Time + @IntendedTime + else + now + @IntendedTime + end + [0, schedule_time.to_f - now.to_f].max + end + + Concurrent.global_timer_set.post(in_seconds) do + @Future.resolve_with RESOLVED + end + end + end + + extend FactoryMethods + + private_constant :AbstractPromise, + :ResolvableEventPromise, + :ResolvableFuturePromise, + :InnerPromise, + :BlockedPromise, + :BlockedTaskPromise, + :ThenPromise, + :RescuePromise, + :ChainPromise, + :ImmediateEventPromise, + :ImmediateFuturePromise, + :AbstractFlatPromise, + :FlatFuturePromise, + :FlatEventPromise, + :RunFuturePromise, + :ZipEventEventPromise, + :ZipFutureEventPromise, + :EventWrapperPromise, + :FutureWrapperPromise, + :ZipFuturesPromise, + :ZipEventsPromise, + :AbstractAnyPromise, + :AnyResolvedFuturePromise, + :AnyFulfilledFuturePromise, + :AnyResolvedEventPromise, + :DelayPromise, + :ScheduledPromise + + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/re_include.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/re_include.rb new file mode 100644 index 000000000000..516d58cae13c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/re_include.rb @@ -0,0 +1,58 @@ +module Concurrent + + # Methods form module A included to a module B, which is already included into class C, + # will not be visible in the C class. If this module is extended to B then A's methods + # are correctly made visible to C. + # + # @example + # module A + # def a + # :a + # end + # end + # + # module B1 + # end + # + # class C1 + # include B1 + # end + # + # module B2 + # extend Concurrent::ReInclude + # end + # + # class C2 + # include B2 + # end + # + # B1.send :include, A + # B2.send :include, A + # + # C1.new.respond_to? :a # => false + # C2.new.respond_to? :a # => true + module ReInclude + # @!visibility private + def included(base) + (@re_include_to_bases ||= []) << [:include, base] + super(base) + end + + # @!visibility private + def extended(base) + (@re_include_to_bases ||= []) << [:extend, base] + super(base) + end + + # @!visibility private + def include(*modules) + result = super(*modules) + modules.reverse.each do |module_being_included| + (@re_include_to_bases ||= []).each do |method, mod| + mod.send method, module_being_included + end + end + result + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/scheduled_task.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/scheduled_task.rb new file mode 100644 index 000000000000..90f78b00ce59 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/scheduled_task.rb @@ -0,0 +1,318 @@ +require 'concurrent/constants' +require 'concurrent/errors' +require 'concurrent/configuration' +require 'concurrent/ivar' +require 'concurrent/collection/copy_on_notify_observer_set' +require 'concurrent/utility/monotonic_time' + +require 'concurrent/options' + +module Concurrent + + # `ScheduledTask` is a close relative of `Concurrent::Future` but with one + # important difference: A `Future` is set to execute as soon as possible + # whereas a `ScheduledTask` is set to execute after a specified delay. This + # implementation is loosely based on Java's + # [ScheduledExecutorService](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html). + # It is a more feature-rich variant of {Concurrent.timer}. + # + # The *intended* schedule time of task execution is set on object construction + # with the `delay` argument. The delay is a numeric (floating point or integer) + # representing a number of seconds in the future. Any other value or a numeric + # equal to or less than zero will result in an exception. The *actual* schedule + # time of task execution is set when the `execute` method is called. + # + # The constructor can also be given zero or more processing options. Currently + # the only supported options are those recognized by the + # [Dereferenceable](Dereferenceable) module. + # + # The final constructor argument is a block representing the task to be performed. + # If no block is given an `ArgumentError` will be raised. + # + # **States** + # + # `ScheduledTask` mixes in the [Obligation](Obligation) module thus giving it + # "future" behavior. This includes the expected lifecycle states. `ScheduledTask` + # has one additional state, however. While the task (block) is being executed the + # state of the object will be `:processing`. This additional state is necessary + # because it has implications for task cancellation. + # + # **Cancellation** + # + # A `:pending` task can be cancelled using the `#cancel` method. A task in any + # other state, including `:processing`, cannot be cancelled. The `#cancel` + # method returns a boolean indicating the success of the cancellation attempt. + # A cancelled `ScheduledTask` cannot be restarted. It is immutable. + # + # **Obligation and Observation** + # + # The result of a `ScheduledTask` can be obtained either synchronously or + # asynchronously. `ScheduledTask` mixes in both the [Obligation](Obligation) + # module and the + # [Observable](http://ruby-doc.org/stdlib-2.0/libdoc/observer/rdoc/Observable.html) + # module from the Ruby standard library. With one exception `ScheduledTask` + # behaves identically to [Future](Observable) with regard to these modules. + # + # @!macro copy_options + # + # @example Basic usage + # + # require 'concurrent' + # require 'thread' # for Queue + # require 'open-uri' # for open(uri) + # + # class Ticker + # def get_year_end_closing(symbol, year) + # uri = "http://ichart.finance.yahoo.com/table.csv?s=#{symbol}&a=11&b=01&c=#{year}&d=11&e=31&f=#{year}&g=m" + # data = open(uri) {|f| f.collect{|line| line.strip } } + # data[1].split(',')[4].to_f + # end + # end + # + # # Future + # price = Concurrent::Future.execute{ Ticker.new.get_year_end_closing('TWTR', 2013) } + # price.state #=> :pending + # sleep(1) # do other stuff + # price.value #=> 63.65 + # price.state #=> :fulfilled + # + # # ScheduledTask + # task = Concurrent::ScheduledTask.execute(2){ Ticker.new.get_year_end_closing('INTC', 2013) } + # task.state #=> :pending + # sleep(3) # do other stuff + # task.value #=> 25.96 + # + # @example Successful task execution + # + # task = Concurrent::ScheduledTask.new(2){ 'What does the fox say?' } + # task.state #=> :unscheduled + # task.execute + # task.state #=> pending + # + # # wait for it... + # sleep(3) + # + # task.unscheduled? #=> false + # task.pending? #=> false + # task.fulfilled? #=> true + # task.rejected? #=> false + # task.value #=> 'What does the fox say?' + # + # @example One line creation and execution + # + # task = Concurrent::ScheduledTask.new(2){ 'What does the fox say?' }.execute + # task.state #=> pending + # + # task = Concurrent::ScheduledTask.execute(2){ 'What do you get when you multiply 6 by 9?' } + # task.state #=> pending + # + # @example Failed task execution + # + # task = Concurrent::ScheduledTask.execute(2){ raise StandardError.new('Call me maybe?') } + # task.pending? #=> true + # + # # wait for it... + # sleep(3) + # + # task.unscheduled? #=> false + # task.pending? #=> false + # task.fulfilled? #=> false + # task.rejected? #=> true + # task.value #=> nil + # task.reason #=> #<StandardError: Call me maybe?> + # + # @example Task execution with observation + # + # observer = Class.new{ + # def update(time, value, reason) + # puts "The task completed at #{time} with value '#{value}'" + # end + # }.new + # + # task = Concurrent::ScheduledTask.new(2){ 'What does the fox say?' } + # task.add_observer(observer) + # task.execute + # task.pending? #=> true + # + # # wait for it... + # sleep(3) + # + # #>> The task completed at 2013-11-07 12:26:09 -0500 with value 'What does the fox say?' + # + # @!macro monotonic_clock_warning + # + # @see Concurrent.timer + class ScheduledTask < IVar + include Comparable + + # The executor on which to execute the task. + # @!visibility private + attr_reader :executor + + # Schedule a task for execution at a specified future time. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @yield the task to be performed + # + # @!macro executor_and_deref_options + # + # @option opts [object, Array] :args zero or more arguments to be passed the task + # block on execution + # + # @raise [ArgumentError] When no block is given + # @raise [ArgumentError] When given a time that is in the past + def initialize(delay, opts = {}, &task) + raise ArgumentError.new('no block given') unless block_given? + raise ArgumentError.new('seconds must be greater than zero') if delay.to_f < 0.0 + + super(NULL, opts, &nil) + + synchronize do + ns_set_state(:unscheduled) + @parent = opts.fetch(:timer_set, Concurrent.global_timer_set) + @args = get_arguments_from(opts) + @delay = delay.to_f + @task = task + @time = nil + @executor = Options.executor_from_options(opts) || Concurrent.global_io_executor + self.observers = Collection::CopyOnNotifyObserverSet.new + end + end + + # The `delay` value given at instanciation. + # + # @return [Float] the initial delay. + def initial_delay + synchronize { @delay } + end + + # The monotonic time at which the the task is scheduled to be executed. + # + # @return [Float] the schedule time or nil if `unscheduled` + def schedule_time + synchronize { @time } + end + + # Comparator which orders by schedule time. + # + # @!visibility private + def <=>(other) + schedule_time <=> other.schedule_time + end + + # Has the task been cancelled? + # + # @return [Boolean] true if the task is in the given state else false + def cancelled? + synchronize { ns_check_state?(:cancelled) } + end + + # In the task execution in progress? + # + # @return [Boolean] true if the task is in the given state else false + def processing? + synchronize { ns_check_state?(:processing) } + end + + # Cancel this task and prevent it from executing. A task can only be + # cancelled if it is pending or unscheduled. + # + # @return [Boolean] true if successfully cancelled else false + def cancel + if compare_and_set_state(:cancelled, :pending, :unscheduled) + complete(false, nil, CancelledOperationError.new) + # To avoid deadlocks this call must occur outside of #synchronize + # Changing the state above should prevent redundant calls + @parent.send(:remove_task, self) + else + false + end + end + + # Reschedule the task using the original delay and the current time. + # A task can only be reset while it is `:pending`. + # + # @return [Boolean] true if successfully rescheduled else false + def reset + synchronize{ ns_reschedule(@delay) } + end + + # Reschedule the task using the given delay and the current time. + # A task can only be reset while it is `:pending`. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @return [Boolean] true if successfully rescheduled else false + # + # @raise [ArgumentError] When given a time that is in the past + def reschedule(delay) + delay = delay.to_f + raise ArgumentError.new('seconds must be greater than zero') if delay < 0.0 + synchronize{ ns_reschedule(delay) } + end + + # Execute an `:unscheduled` `ScheduledTask`. Immediately sets the state to `:pending` + # and starts counting down toward execution. Does nothing if the `ScheduledTask` is + # in any state other than `:unscheduled`. + # + # @return [ScheduledTask] a reference to `self` + def execute + if compare_and_set_state(:pending, :unscheduled) + synchronize{ ns_schedule(@delay) } + end + self + end + + # Create a new `ScheduledTask` object with the given block, execute it, and return the + # `:pending` object. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @!macro executor_and_deref_options + # + # @return [ScheduledTask] the newly created `ScheduledTask` in the `:pending` state + # + # @raise [ArgumentError] if no block is given + def self.execute(delay, opts = {}, &task) + new(delay, opts, &task).execute + end + + # Execute the task. + # + # @!visibility private + def process_task + safe_execute(@task, @args) + end + + protected :set, :try_set, :fail, :complete + + protected + + # Schedule the task using the given delay and the current time. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @return [Boolean] true if successfully rescheduled else false + # + # @!visibility private + def ns_schedule(delay) + @delay = delay + @time = Concurrent.monotonic_time + @delay + @parent.send(:post_task, self) + end + + # Reschedule the task using the given delay and the current time. + # A task can only be reset while it is `:pending`. + # + # @param [Float] delay the number of seconds to wait for before executing the task + # + # @return [Boolean] true if successfully rescheduled else false + # + # @!visibility private + def ns_reschedule(delay) + return false unless ns_check_state?(:pending) + @parent.send(:remove_task, self) && ns_schedule(delay) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/set.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/set.rb new file mode 100644 index 000000000000..602d494081cc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/set.rb @@ -0,0 +1,66 @@ +require 'concurrent/utility/engine' +require 'concurrent/thread_safe/util' +require 'set' + +module Concurrent + + # @!macro concurrent_set + # + # A thread-safe subclass of Set. This version locks against the object + # itself for every method call, ensuring only one thread can be reading + # or writing at a time. This includes iteration methods like `#each`. + # + # @note `a += b` is **not** a **thread-safe** operation on + # `Concurrent::Set`. It reads Set `a`, then it creates new `Concurrent::Set` + # which is union of `a` and `b`, then it writes the union to `a`. + # The read and write are independent operations they do not form a single atomic + # operation therefore when two `+=` operations are executed concurrently updates + # may be lost. Use `#merge` instead. + # + # @see http://ruby-doc.org/stdlib-2.4.0/libdoc/set/rdoc/Set.html Ruby standard library `Set` + + + # @!macro internal_implementation_note + SetImplementation = case + when Concurrent.on_cruby? + # Because MRI never runs code in parallel, the existing + # non-thread-safe structures should usually work fine. + ::Set + + when Concurrent.on_jruby? + require 'jruby/synchronized' + + class JRubySet < ::Set + include JRuby::Synchronized + end + JRubySet + + when Concurrent.on_rbx? + require 'monitor' + require 'concurrent/thread_safe/util/data_structures' + + class RbxSet < ::Set + end + ThreadSafe::Util.make_synchronized_on_rbx Concurrent::RbxSet + RbxSet + + when Concurrent.on_truffleruby? + require 'concurrent/thread_safe/util/data_structures' + + class TruffleRubySet < ::Set + end + + ThreadSafe::Util.make_synchronized_on_truffleruby Concurrent::TruffleRubySet + TruffleRubySet + + else + warn 'Possibly unsupported Ruby implementation' + ::Set + end + private_constant :SetImplementation + + # @!macro concurrent_set + class Set < SetImplementation + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/settable_struct.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/settable_struct.rb new file mode 100644 index 000000000000..00123523cc79 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/settable_struct.rb @@ -0,0 +1,139 @@ +require 'concurrent/synchronization/abstract_struct' +require 'concurrent/errors' +require 'concurrent/synchronization' + +module Concurrent + + # An thread-safe, write-once variation of Ruby's standard `Struct`. + # Each member can have its value set at most once, either at construction + # or any time thereafter. Attempting to assign a value to a member + # that has already been set will result in a `Concurrent::ImmutabilityError`. + # + # @see http://ruby-doc.org/core/Struct.html Ruby standard library `Struct` + # @see http://en.wikipedia.org/wiki/Final_(Java) Java `final` keyword + module SettableStruct + include Synchronization::AbstractStruct + + # @!macro struct_values + def values + synchronize { ns_values } + end + alias_method :to_a, :values + + # @!macro struct_values_at + def values_at(*indexes) + synchronize { ns_values_at(indexes) } + end + + # @!macro struct_inspect + def inspect + synchronize { ns_inspect } + end + alias_method :to_s, :inspect + + # @!macro struct_merge + def merge(other, &block) + synchronize { ns_merge(other, &block) } + end + + # @!macro struct_to_h + def to_h + synchronize { ns_to_h } + end + + # @!macro struct_get + def [](member) + synchronize { ns_get(member) } + end + + # @!macro struct_equality + def ==(other) + synchronize { ns_equality(other) } + end + + # @!macro struct_each + def each(&block) + return enum_for(:each) unless block_given? + synchronize { ns_each(&block) } + end + + # @!macro struct_each_pair + def each_pair(&block) + return enum_for(:each_pair) unless block_given? + synchronize { ns_each_pair(&block) } + end + + # @!macro struct_select + def select(&block) + return enum_for(:select) unless block_given? + synchronize { ns_select(&block) } + end + + # @!macro struct_set + # + # @raise [Concurrent::ImmutabilityError] if the given member has already been set + def []=(member, value) + if member.is_a? Integer + length = synchronize { @values.length } + if member >= length + raise IndexError.new("offset #{member} too large for struct(size:#{length})") + end + synchronize do + unless @values[member].nil? + raise Concurrent::ImmutabilityError.new('struct member has already been set') + end + @values[member] = value + end + else + send("#{member}=", value) + end + rescue NoMethodError + raise NameError.new("no member '#{member}' in struct") + end + + private + + # @!visibility private + def initialize_copy(original) + synchronize do + super(original) + ns_initialize_copy + end + end + + # @!macro struct_new + def self.new(*args, &block) + clazz_name = nil + if args.length == 0 + raise ArgumentError.new('wrong number of arguments (0 for 1+)') + elsif args.length > 0 && args.first.is_a?(String) + clazz_name = args.shift + end + FACTORY.define_struct(clazz_name, args, &block) + end + + FACTORY = Class.new(Synchronization::LockableObject) do + def define_struct(name, members, &block) + synchronize do + clazz = Synchronization::AbstractStruct.define_struct_class(SettableStruct, Synchronization::LockableObject, name, members, &block) + members.each_with_index do |member, index| + clazz.send :remove_method, member if clazz.instance_methods.include? member + clazz.send(:define_method, member) do + synchronize { @values[index] } + end + clazz.send(:define_method, "#{member}=") do |value| + synchronize do + unless @values[index].nil? + raise Concurrent::ImmutabilityError.new('struct member has already been set') + end + @values[index] = value + end + end + end + clazz + end + end + end.new + private_constant :FACTORY + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization.rb new file mode 100644 index 000000000000..49c68ebbb3f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization.rb @@ -0,0 +1,30 @@ +require 'concurrent/utility/engine' + +require 'concurrent/synchronization/abstract_object' +require 'concurrent/utility/native_extension_loader' # load native parts first +Concurrent.load_native_extensions + +require 'concurrent/synchronization/mri_object' +require 'concurrent/synchronization/jruby_object' +require 'concurrent/synchronization/rbx_object' +require 'concurrent/synchronization/truffleruby_object' +require 'concurrent/synchronization/object' +require 'concurrent/synchronization/volatile' + +require 'concurrent/synchronization/abstract_lockable_object' +require 'concurrent/synchronization/mutex_lockable_object' +require 'concurrent/synchronization/jruby_lockable_object' +require 'concurrent/synchronization/rbx_lockable_object' + +require 'concurrent/synchronization/lockable_object' + +require 'concurrent/synchronization/condition' +require 'concurrent/synchronization/lock' + +module Concurrent + # {include:file:docs-source/synchronization.md} + # {include:file:docs-source/synchronization-notes.md} + module Synchronization + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb new file mode 100644 index 000000000000..bc1260336450 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb @@ -0,0 +1,98 @@ +module Concurrent + module Synchronization + + # @!visibility private + class AbstractLockableObject < Synchronization::Object + + protected + + # @!macro synchronization_object_method_synchronize + # + # @yield runs the block synchronized against this object, + # equivalent of java's `synchronize(this) {}` + # @note can by made public in descendants if required by `public :synchronize` + def synchronize + raise NotImplementedError + end + + # @!macro synchronization_object_method_ns_wait_until + # + # Wait until condition is met or timeout passes, + # protects against spurious wake-ups. + # @param [Numeric, nil] timeout in seconds, `nil` means no timeout + # @yield condition to be met + # @yieldreturn [true, false] + # @return [true, false] if condition met + # @note only to be used inside synchronized block + # @note to provide direct access to this method in a descendant add method + # ``` + # def wait_until(timeout = nil, &condition) + # synchronize { ns_wait_until(timeout, &condition) } + # end + # ``` + def ns_wait_until(timeout = nil, &condition) + if timeout + wait_until = Concurrent.monotonic_time + timeout + loop do + now = Concurrent.monotonic_time + condition_result = condition.call + return condition_result if now >= wait_until || condition_result + ns_wait wait_until - now + end + else + ns_wait timeout until condition.call + true + end + end + + # @!macro synchronization_object_method_ns_wait + # + # Wait until another thread calls #signal or #broadcast, + # spurious wake-ups can happen. + # + # @param [Numeric, nil] timeout in seconds, `nil` means no timeout + # @return [self] + # @note only to be used inside synchronized block + # @note to provide direct access to this method in a descendant add method + # ``` + # def wait(timeout = nil) + # synchronize { ns_wait(timeout) } + # end + # ``` + def ns_wait(timeout = nil) + raise NotImplementedError + end + + # @!macro synchronization_object_method_ns_signal + # + # Signal one waiting thread. + # @return [self] + # @note only to be used inside synchronized block + # @note to provide direct access to this method in a descendant add method + # ``` + # def signal + # synchronize { ns_signal } + # end + # ``` + def ns_signal + raise NotImplementedError + end + + # @!macro synchronization_object_method_ns_broadcast + # + # Broadcast to all waiting threads. + # @return [self] + # @note only to be used inside synchronized block + # @note to provide direct access to this method in a descendant add method + # ``` + # def broadcast + # synchronize { ns_broadcast } + # end + # ``` + def ns_broadcast + raise NotImplementedError + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb new file mode 100644 index 000000000000..532388b2b8e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb @@ -0,0 +1,24 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + class AbstractObject + + # @abstract has to be implemented based on Ruby runtime + def initialize + raise NotImplementedError + end + + # @!visibility private + # @abstract + def full_memory_barrier + raise NotImplementedError + end + + def self.attr_volatile(*names) + raise NotImplementedError + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb new file mode 100644 index 000000000000..1fe90c1649bf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/abstract_struct.rb @@ -0,0 +1,171 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + module AbstractStruct + + # @!visibility private + def initialize(*values) + super() + ns_initialize(*values) + end + + # @!macro struct_length + # + # Returns the number of struct members. + # + # @return [Fixnum] the number of struct members + def length + self.class::MEMBERS.length + end + alias_method :size, :length + + # @!macro struct_members + # + # Returns the struct members as an array of symbols. + # + # @return [Array] the struct members as an array of symbols + def members + self.class::MEMBERS.dup + end + + protected + + # @!macro struct_values + # + # @!visibility private + def ns_values + @values.dup + end + + # @!macro struct_values_at + # + # @!visibility private + def ns_values_at(indexes) + @values.values_at(*indexes) + end + + # @!macro struct_to_h + # + # @!visibility private + def ns_to_h + length.times.reduce({}){|memo, i| memo[self.class::MEMBERS[i]] = @values[i]; memo} + end + + # @!macro struct_get + # + # @!visibility private + def ns_get(member) + if member.is_a? Integer + if member >= @values.length + raise IndexError.new("offset #{member} too large for struct(size:#{@values.length})") + end + @values[member] + else + send(member) + end + rescue NoMethodError + raise NameError.new("no member '#{member}' in struct") + end + + # @!macro struct_equality + # + # @!visibility private + def ns_equality(other) + self.class == other.class && self.values == other.values + end + + # @!macro struct_each + # + # @!visibility private + def ns_each + values.each{|value| yield value } + end + + # @!macro struct_each_pair + # + # @!visibility private + def ns_each_pair + @values.length.times do |index| + yield self.class::MEMBERS[index], @values[index] + end + end + + # @!macro struct_select + # + # @!visibility private + def ns_select + values.select{|value| yield value } + end + + # @!macro struct_inspect + # + # @!visibility private + def ns_inspect + struct = pr_underscore(self.class.ancestors[1]) + clazz = ((self.class.to_s =~ /^#<Class:/) == 0) ? '' : " #{self.class}" + "#<#{struct}#{clazz} #{ns_to_h}>" + end + + # @!macro struct_merge + # + # @!visibility private + def ns_merge(other, &block) + self.class.new(*self.to_h.merge(other, &block).values) + end + + # @!visibility private + def ns_initialize_copy + @values = @values.map do |val| + begin + val.clone + rescue TypeError + val + end + end + end + + # @!visibility private + def pr_underscore(clazz) + word = clazz.to_s.dup # dup string to workaround JRuby 9.2.0.0 bug https://github.com/jruby/jruby/issues/5229 + word.gsub!(/::/, '/') + word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2') + word.gsub!(/([a-z\d])([A-Z])/,'\1_\2') + word.tr!("-", "_") + word.downcase! + word + end + + # @!visibility private + def self.define_struct_class(parent, base, name, members, &block) + clazz = Class.new(base || Object) do + include parent + self.const_set(:MEMBERS, members.collect{|member| member.to_s.to_sym}.freeze) + def ns_initialize(*values) + raise ArgumentError.new('struct size differs') if values.length > length + @values = values.fill(nil, values.length..length-1) + end + end + unless name.nil? + begin + parent.send :remove_const, name if parent.const_defined?(name, false) + parent.const_set(name, clazz) + clazz + rescue NameError + raise NameError.new("identifier #{name} needs to be constant") + end + end + members.each_with_index do |member, index| + clazz.send :remove_method, member if clazz.instance_methods.include? member + clazz.send(:define_method, member) do + @values[index] + end + end + clazz.class_exec(&block) unless block.nil? + clazz.singleton_class.send :alias_method, :[], :new + clazz + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/condition.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/condition.rb new file mode 100644 index 000000000000..f704b81ee6db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/condition.rb @@ -0,0 +1,60 @@ +module Concurrent + module Synchronization + + # @!visibility private + # TODO (pitr-ch 04-Dec-2016): should be in edge + class Condition < LockableObject + safe_initialization! + + # TODO (pitr 12-Sep-2015): locks two objects, improve + # TODO (pitr 26-Sep-2015): study + # http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/concurrent/locks/AbstractQueuedSynchronizer.java#AbstractQueuedSynchronizer.Node + + singleton_class.send :alias_method, :private_new, :new + private_class_method :new + + def initialize(lock) + super() + @Lock = lock + end + + def wait(timeout = nil) + @Lock.synchronize { ns_wait(timeout) } + end + + def ns_wait(timeout = nil) + synchronize { super(timeout) } + end + + def wait_until(timeout = nil, &condition) + @Lock.synchronize { ns_wait_until(timeout, &condition) } + end + + def ns_wait_until(timeout = nil, &condition) + synchronize { super(timeout, &condition) } + end + + def signal + @Lock.synchronize { ns_signal } + end + + def ns_signal + synchronize { super } + end + + def broadcast + @Lock.synchronize { ns_broadcast } + end + + def ns_broadcast + synchronize { super } + end + end + + class LockableObject < LockableObjectImplementation + def new_condition + Condition.private_new(self) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb new file mode 100644 index 000000000000..359a032b7b9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb @@ -0,0 +1,13 @@ +module Concurrent + module Synchronization + + if Concurrent.on_jruby? && Concurrent.java_extensions_loaded? + + # @!visibility private + # @!macro internal_implementation_note + class JRubyLockableObject < AbstractLockableObject + + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/jruby_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/jruby_object.rb new file mode 100644 index 000000000000..da91ac50b8f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/jruby_object.rb @@ -0,0 +1,45 @@ +module Concurrent + module Synchronization + + if Concurrent.on_jruby? && Concurrent.java_extensions_loaded? + + # @!visibility private + module JRubyAttrVolatile + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def attr_volatile(*names) + names.each do |name| + + ivar = :"@volatile_#{name}" + + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + instance_variable_get_volatile(:#{ivar}) + end + + def #{name}=(value) + instance_variable_set_volatile(:#{ivar}, value) + end + RUBY + + end + names.map { |n| [n, :"#{n}="] }.flatten + end + end + end + + # @!visibility private + # @!macro internal_implementation_note + class JRubyObject < AbstractObject + include JRubyAttrVolatile + + def initialize + # nothing to do + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/lock.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/lock.rb new file mode 100644 index 000000000000..0dbad2eb4523 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/lock.rb @@ -0,0 +1,36 @@ +module Concurrent + module Synchronization + + # @!visibility private + # TODO (pitr-ch 04-Dec-2016): should be in edge + class Lock < LockableObject + # TODO use JavaReentrantLock on JRuby + + public :synchronize + + def wait(timeout = nil) + synchronize { ns_wait(timeout) } + end + + public :ns_wait + + def wait_until(timeout = nil, &condition) + synchronize { ns_wait_until(timeout, &condition) } + end + + public :ns_wait_until + + def signal + synchronize { ns_signal } + end + + public :ns_signal + + def broadcast + synchronize { ns_broadcast } + end + + public :ns_broadcast + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb new file mode 100644 index 000000000000..cdbe4d43774e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb @@ -0,0 +1,74 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + LockableObjectImplementation = case + when Concurrent.on_cruby? && Concurrent.ruby_version(:<=, 1, 9, 3) + MonitorLockableObject + when Concurrent.on_cruby? && Concurrent.ruby_version(:>, 1, 9, 3) + MutexLockableObject + when Concurrent.on_jruby? + JRubyLockableObject + when Concurrent.on_rbx? + RbxLockableObject + when Concurrent.on_truffleruby? + MutexLockableObject + else + warn 'Possibly unsupported Ruby implementation' + MonitorLockableObject + end + private_constant :LockableObjectImplementation + + # Safe synchronization under any Ruby implementation. + # It provides methods like {#synchronize}, {#wait}, {#signal} and {#broadcast}. + # Provides a single layer which can improve its implementation over time without changes needed to + # the classes using it. Use {Synchronization::Object} not this abstract class. + # + # @note this object does not support usage together with + # [`Thread#wakeup`](http://ruby-doc.org/core/Thread.html#method-i-wakeup) + # and [`Thread#raise`](http://ruby-doc.org/core/Thread.html#method-i-raise). + # `Thread#sleep` and `Thread#wakeup` will work as expected but mixing `Synchronization::Object#wait` and + # `Thread#wakeup` will not work on all platforms. + # + # @see Event implementation as an example of this class use + # + # @example simple + # class AnClass < Synchronization::Object + # def initialize + # super + # synchronize { @value = 'asd' } + # end + # + # def value + # synchronize { @value } + # end + # end + # + # @!visibility private + class LockableObject < LockableObjectImplementation + + # TODO (pitr 12-Sep-2015): make private for c-r, prohibit subclassing + # TODO (pitr 12-Sep-2015): we inherit too much ourselves :/ + + # @!method initialize(*args, &block) + # @!macro synchronization_object_method_initialize + + # @!method synchronize + # @!macro synchronization_object_method_synchronize + + # @!method wait_until(timeout = nil, &condition) + # @!macro synchronization_object_method_ns_wait_until + + # @!method wait(timeout = nil) + # @!macro synchronization_object_method_ns_wait + + # @!method signal + # @!macro synchronization_object_method_ns_signal + + # @!method broadcast + # @!macro synchronization_object_method_ns_broadcast + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/mri_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/mri_object.rb new file mode 100644 index 000000000000..4b1d6c295649 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/mri_object.rb @@ -0,0 +1,44 @@ +module Concurrent + module Synchronization + + # @!visibility private + module MriAttrVolatile + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def attr_volatile(*names) + names.each do |name| + ivar = :"@volatile_#{name}" + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + #{ivar} + end + + def #{name}=(value) + #{ivar} = value + end + RUBY + end + names.map { |n| [n, :"#{n}="] }.flatten + end + end + + def full_memory_barrier + # relying on undocumented behavior of CRuby, GVL acquire has lock which ensures visibility of ivars + # https://github.com/ruby/ruby/blob/ruby_2_2/thread_pthread.c#L204-L211 + end + end + + # @!visibility private + # @!macro internal_implementation_note + class MriObject < AbstractObject + include MriAttrVolatile + + def initialize + # nothing to do + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb new file mode 100644 index 000000000000..f288c51a1fb3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb @@ -0,0 +1,76 @@ +module Concurrent + # noinspection RubyInstanceVariableNamingConvention + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + module ConditionSignalling + protected + + def ns_signal + @__Condition__.signal + self + end + + def ns_broadcast + @__Condition__.broadcast + self + end + end + + + # @!visibility private + # @!macro internal_implementation_note + class MutexLockableObject < AbstractLockableObject + include ConditionSignalling + + safe_initialization! + + def initialize(*defaults) + super(*defaults) + @__Lock__ = ::Mutex.new + @__Condition__ = ::ConditionVariable.new + end + + protected + + def synchronize + if @__Lock__.owned? + yield + else + @__Lock__.synchronize { yield } + end + end + + def ns_wait(timeout = nil) + @__Condition__.wait @__Lock__, timeout + self + end + end + + # @!visibility private + # @!macro internal_implementation_note + class MonitorLockableObject < AbstractLockableObject + include ConditionSignalling + + safe_initialization! + + def initialize(*defaults) + super(*defaults) + @__Lock__ = ::Monitor.new + @__Condition__ = @__Lock__.new_cond + end + + protected + + def synchronize # TODO may be a problem with lock.synchronize { lock.wait } + @__Lock__.synchronize { yield } + end + + def ns_wait(timeout = nil) + @__Condition__.wait timeout + self + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/object.rb new file mode 100644 index 000000000000..0e621128075f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/object.rb @@ -0,0 +1,183 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + ObjectImplementation = case + when Concurrent.on_cruby? + MriObject + when Concurrent.on_jruby? + JRubyObject + when Concurrent.on_rbx? + RbxObject + when Concurrent.on_truffleruby? + TruffleRubyObject + else + warn 'Possibly unsupported Ruby implementation' + MriObject + end + private_constant :ObjectImplementation + + # Abstract object providing final, volatile, ans CAS extensions to build other concurrent abstractions. + # - final instance variables see {Object.safe_initialization!} + # - volatile instance variables see {Object.attr_volatile} + # - volatile instance variables see {Object.attr_atomic} + class Object < ObjectImplementation + # TODO make it a module if possible + + # @!method self.attr_volatile(*names) + # Creates methods for reading and writing (as `attr_accessor` does) to a instance variable with + # volatile (Java) semantic. The instance variable should be accessed only through generated methods. + # + # @param [::Array<Symbol>] names of the instance variables to be volatile + # @return [::Array<Symbol>] names of defined method names + + # Has to be called by children. + def initialize + super + __initialize_atomic_fields__ + end + + # By calling this method on a class, it and all its children are marked to be constructed safely. Meaning that + # all writes (ivar initializations) are made visible to all readers of newly constructed object. It ensures + # same behaviour as Java's final fields. + # @example + # class AClass < Concurrent::Synchronization::Object + # safe_initialization! + # + # def initialize + # @AFinalValue = 'value' # published safely, does not have to be synchronized + # end + # end + # @return [true] + def self.safe_initialization! + # define only once, and not again in children + return if safe_initialization? + + # @!visibility private + def self.new(*args, &block) + object = super(*args, &block) + ensure + object.full_memory_barrier if object + end + + @safe_initialization = true + end + + # @return [true, false] if this class is safely initialized. + def self.safe_initialization? + @safe_initialization = false unless defined? @safe_initialization + @safe_initialization || (superclass.respond_to?(:safe_initialization?) && superclass.safe_initialization?) + end + + # For testing purposes, quite slow. Injects assert code to new method which will raise if class instance contains + # any instance variables with CamelCase names and isn't {.safe_initialization?}. + # @raise when offend found + # @return [true] + def self.ensure_safe_initialization_when_final_fields_are_present + Object.class_eval do + def self.new(*args, &block) + object = super(*args, &block) + ensure + has_final_field = object.instance_variables.any? { |v| v.to_s =~ /^@[A-Z]/ } + if has_final_field && !safe_initialization? + raise "there was an instance of #{object.class} with final field but not marked with safe_initialization!" + end + end + end + true + end + + # Creates methods for reading and writing to a instance variable with + # volatile (Java) semantic as {.attr_volatile} does. + # The instance variable should be accessed oly through generated methods. + # This method generates following methods: `value`, `value=(new_value) #=> new_value`, + # `swap_value(new_value) #=> old_value`, + # `compare_and_set_value(expected, value) #=> true || false`, `update_value(&block)`. + # @param [::Array<Symbol>] names of the instance variables to be volatile with CAS. + # @return [::Array<Symbol>] names of defined method names. + # @!macro attr_atomic + # @!method $1 + # @return [Object] The $1. + # @!method $1=(new_$1) + # Set the $1. + # @return [Object] new_$1. + # @!method swap_$1(new_$1) + # Set the $1 to new_$1 and return the old $1. + # @return [Object] old $1 + # @!method compare_and_set_$1(expected_$1, new_$1) + # Sets the $1 to new_$1 if the current $1 is expected_$1 + # @return [true, false] + # @!method update_$1(&block) + # Updates the $1 using the block. + # @yield [Object] Calculate a new $1 using given (old) $1 + # @yieldparam [Object] old $1 + # @return [Object] new $1 + def self.attr_atomic(*names) + @__atomic_fields__ ||= [] + @__atomic_fields__ += names + safe_initialization! + define_initialize_atomic_fields + + names.each do |name| + ivar = :"@Atomic#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }}" + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + #{ivar}.get + end + + def #{name}=(value) + #{ivar}.set value + end + + def swap_#{name}(value) + #{ivar}.swap value + end + + def compare_and_set_#{name}(expected, value) + #{ivar}.compare_and_set expected, value + end + + def update_#{name}(&block) + #{ivar}.update(&block) + end + RUBY + end + names.flat_map { |n| [n, :"#{n}=", :"swap_#{n}", :"compare_and_set_#{n}", :"update_#{n}"] } + end + + # @param [true, false] inherited should inherited volatile with CAS fields be returned? + # @return [::Array<Symbol>] Returns defined volatile with CAS fields on this class. + def self.atomic_attributes(inherited = true) + @__atomic_fields__ ||= [] + ((superclass.atomic_attributes if superclass.respond_to?(:atomic_attributes) && inherited) || []) + @__atomic_fields__ + end + + # @return [true, false] is the attribute with name atomic? + def self.atomic_attribute?(name) + atomic_attributes.include? name + end + + private + + def self.define_initialize_atomic_fields + assignments = @__atomic_fields__.map do |name| + "@Atomic#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }} = Concurrent::AtomicReference.new(nil)" + end.join("\n") + + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def __initialize_atomic_fields__ + super + #{assignments} + end + RUBY + end + + private_class_method :define_initialize_atomic_fields + + def __initialize_atomic_fields__ + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/rbx_lockable_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/rbx_lockable_object.rb new file mode 100644 index 000000000000..8dbd3c3453e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/rbx_lockable_object.rb @@ -0,0 +1,65 @@ +module Concurrent + module Synchronization + + # @!visibility private + # @!macro internal_implementation_note + class RbxLockableObject < AbstractLockableObject + safe_initialization! + + def initialize(*defaults) + super(*defaults) + @__Waiters__ = [] + @__owner__ = nil + end + + protected + + def synchronize(&block) + if @__owner__ == Thread.current + yield + else + result = nil + Rubinius.synchronize(self) do + begin + @__owner__ = Thread.current + result = yield + ensure + @__owner__ = nil + end + end + result + end + end + + def ns_wait(timeout = nil) + wchan = Rubinius::Channel.new + + begin + @__Waiters__.push wchan + Rubinius.unlock(self) + signaled = wchan.receive_timeout timeout + ensure + Rubinius.lock(self) + + if !signaled && !@__Waiters__.delete(wchan) + # we timed out, but got signaled afterwards, + # so pass that signal on to the next waiter + @__Waiters__.shift << true unless @__Waiters__.empty? + end + end + + self + end + + def ns_signal + @__Waiters__.shift << true unless @__Waiters__.empty? + self + end + + def ns_broadcast + @__Waiters__.shift << true until @__Waiters__.empty? + self + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/rbx_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/rbx_object.rb new file mode 100644 index 000000000000..4b23f2a662f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/rbx_object.rb @@ -0,0 +1,49 @@ +module Concurrent + module Synchronization + + # @!visibility private + module RbxAttrVolatile + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + + def attr_volatile(*names) + names.each do |name| + ivar = :"@volatile_#{name}" + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + Rubinius.memory_barrier + #{ivar} + end + + def #{name}=(value) + #{ivar} = value + Rubinius.memory_barrier + end + RUBY + end + names.map { |n| [n, :"#{n}="] }.flatten + end + + end + + def full_memory_barrier + # Rubinius instance variables are not volatile so we need to insert barrier + # TODO (pitr 26-Nov-2015): check comments like ^ + Rubinius.memory_barrier + end + end + + # @!visibility private + # @!macro internal_implementation_note + class RbxObject < AbstractObject + include RbxAttrVolatile + + def initialize + # nothing to do + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/truffleruby_object.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/truffleruby_object.rb new file mode 100644 index 000000000000..3919c76d21c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/truffleruby_object.rb @@ -0,0 +1,47 @@ +module Concurrent + module Synchronization + + # @!visibility private + module TruffleRubyAttrVolatile + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def attr_volatile(*names) + names.each do |name| + ivar = :"@volatile_#{name}" + + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name} + full_memory_barrier + #{ivar} + end + + def #{name}=(value) + #{ivar} = value + full_memory_barrier + end + RUBY + end + + names.map { |n| [n, :"#{n}="] }.flatten + end + end + + def full_memory_barrier + TruffleRuby.full_memory_barrier + end + end + + # @!visibility private + # @!macro internal_implementation_note + class TruffleRubyObject < AbstractObject + include TruffleRubyAttrVolatile + + def initialize + # nothing to do + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/volatile.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/volatile.rb new file mode 100644 index 000000000000..9dffa914ae69 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/synchronization/volatile.rb @@ -0,0 +1,36 @@ +module Concurrent + module Synchronization + + # Volatile adds the attr_volatile class method when included. + # + # @example + # class Foo + # include Concurrent::Synchronization::Volatile + # + # attr_volatile :bar + # + # def initialize + # self.bar = 1 + # end + # end + # + # foo = Foo.new + # foo.bar + # => 1 + # foo.bar = 2 + # => 2 + + Volatile = case + when Concurrent.on_cruby? + MriAttrVolatile + when Concurrent.on_jruby? + JRubyAttrVolatile + when Concurrent.on_rbx? + RbxAttrVolatile + when Concurrent.on_truffleruby? + TruffleRubyAttrVolatile + else + MriAttrVolatile + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb new file mode 100644 index 000000000000..92e7c45fc50c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb @@ -0,0 +1,50 @@ +require 'delegate' +require 'monitor' + +module Concurrent + unless defined?(SynchronizedDelegator) + + # This class provides a trivial way to synchronize all calls to a given object + # by wrapping it with a `Delegator` that performs `Monitor#enter/exit` calls + # around the delegated `#send`. Example: + # + # array = [] # not thread-safe on many impls + # array = SynchronizedDelegator.new([]) # thread-safe + # + # A simple `Monitor` provides a very coarse-grained way to synchronize a given + # object, in that it will cause synchronization for methods that have no need + # for it, but this is a trivial way to get thread-safety where none may exist + # currently on some implementations. + # + # This class is currently being considered for inclusion into stdlib, via + # https://bugs.ruby-lang.org/issues/8556 + # + # @!visibility private + class SynchronizedDelegator < SimpleDelegator + def setup + @old_abort = Thread.abort_on_exception + Thread.abort_on_exception = true + end + + def teardown + Thread.abort_on_exception = @old_abort + end + + def initialize(obj) + __setobj__(obj) + @monitor = Monitor.new + end + + def method_missing(method, *args, &block) + monitor = @monitor + begin + monitor.enter + super + ensure + monitor.exit + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util.rb new file mode 100644 index 000000000000..c67084a26fa3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util.rb @@ -0,0 +1,16 @@ +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # TODO (pitr-ch 15-Oct-2016): migrate to Utility::NativeInteger + FIXNUM_BIT_SIZE = (0.size * 8) - 2 + MAX_INT = (2 ** FIXNUM_BIT_SIZE) - 1 + # TODO (pitr-ch 15-Oct-2016): migrate to Utility::ProcessorCounter + CPU_COUNT = 16 # is there a way to determine this? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/adder.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/adder.rb new file mode 100644 index 000000000000..7a6e8d5c0e13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/adder.rb @@ -0,0 +1,74 @@ +require 'concurrent/thread_safe/util' +require 'concurrent/thread_safe/util/striped64' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # A Ruby port of the Doug Lea's jsr166e.LondAdder class version 1.8 + # available in public domain. + # + # Original source code available here: + # http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/LongAdder.java?revision=1.8 + # + # One or more variables that together maintain an initially zero + # sum. When updates (method +add+) are contended across threads, + # the set of variables may grow dynamically to reduce contention. + # Method +sum+ returns the current total combined across the + # variables maintaining the sum. + # + # This class is usually preferable to single +Atomic+ reference when + # multiple threads update a common sum that is used for purposes such + # as collecting statistics, not for fine-grained synchronization + # control. Under low update contention, the two classes have similar + # characteristics. But under high contention, expected throughput of + # this class is significantly higher, at the expense of higher space + # consumption. + # + # @!visibility private + class Adder < Striped64 + # Adds the given value. + def add(x) + if (current_cells = cells) || !cas_base_computed {|current_base| current_base + x} + was_uncontended = true + hash = hash_code + unless current_cells && (cell = current_cells.volatile_get_by_hash(hash)) && (was_uncontended = cell.cas_computed {|current_value| current_value + x}) + retry_update(x, hash, was_uncontended) {|current_value| current_value + x} + end + end + end + + def increment + add(1) + end + + def decrement + add(-1) + end + + # Returns the current sum. The returned value is _NOT_ an + # atomic snapshot: Invocation in the absence of concurrent + # updates returns an accurate result, but concurrent updates that + # occur while the sum is being calculated might not be + # incorporated. + def sum + x = base + if current_cells = cells + current_cells.each do |cell| + x += cell.value if cell + end + end + x + end + + def reset + internal_reset(0) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb new file mode 100644 index 000000000000..d9b4c5818694 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb @@ -0,0 +1,118 @@ +require 'concurrent/thread_safe/util' +require 'concurrent/thread_safe/util/volatile' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # Provides a cheapest possible (mainly in terms of memory usage) +Mutex+ + # with the +ConditionVariable+ bundled in. + # + # Usage: + # class A + # include CheapLockable + # + # def do_exlusively + # cheap_synchronize { yield } + # end + # + # def wait_for_something + # cheap_synchronize do + # cheap_wait until resource_available? + # do_something + # cheap_broadcast # wake up others + # end + # end + # end + # + # @!visibility private + module CheapLockable + private + engine = defined?(RUBY_ENGINE) && RUBY_ENGINE + if engine == 'rbx' + # Making use of the Rubinius' ability to lock via object headers to avoid the overhead of the extra Mutex objects. + def cheap_synchronize + Rubinius.lock(self) + begin + yield + ensure + Rubinius.unlock(self) + end + end + + def cheap_wait + wchan = Rubinius::Channel.new + + begin + waiters = @waiters ||= [] + waiters.push wchan + Rubinius.unlock(self) + signaled = wchan.receive_timeout nil + ensure + Rubinius.lock(self) + + unless signaled or waiters.delete(wchan) + # we timed out, but got signaled afterwards (e.g. while waiting to + # acquire @lock), so pass that signal on to the next waiter + waiters.shift << true unless waiters.empty? + end + end + + self + end + + def cheap_broadcast + waiters = @waiters ||= [] + waiters.shift << true until waiters.empty? + self + end + elsif engine == 'jruby' + # Use Java's native synchronized (this) { wait(); notifyAll(); } to avoid the overhead of the extra Mutex objects + require 'jruby' + + def cheap_synchronize + JRuby.reference0(self).synchronized { yield } + end + + def cheap_wait + JRuby.reference0(self).wait + end + + def cheap_broadcast + JRuby.reference0(self).notify_all + end + else + require 'thread' + + extend Volatile + attr_volatile :mutex + + # Non-reentrant Mutex#syncrhonize + def cheap_synchronize + true until (my_mutex = mutex) || cas_mutex(nil, my_mutex = Mutex.new) + my_mutex.synchronize { yield } + end + + # Releases this object's +cheap_synchronize+ lock and goes to sleep waiting for other threads to +cheap_broadcast+, reacquires the lock on wakeup. + # Must only be called in +cheap_broadcast+'s block. + def cheap_wait + conditional_variable = @conditional_variable ||= ConditionVariable.new + conditional_variable.wait(mutex) + end + + # Wakes up all threads waiting for this object's +cheap_synchronize+ lock. + # Must only be called in +cheap_broadcast+'s block. + def cheap_broadcast + if conditional_variable = @conditional_variable + conditional_variable.broadcast + end + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb new file mode 100644 index 000000000000..ff1e8ed97e3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb @@ -0,0 +1,63 @@ +require 'concurrent/thread_safe/util' + +# Shim for TruffleRuby.synchronized +if Concurrent.on_truffleruby? && !TruffleRuby.respond_to?(:synchronized) + module TruffleRuby + def self.synchronized(object, &block) + Truffle::System.synchronized(object, &block) + end + end +end + +module Concurrent + module ThreadSafe + module Util + def self.make_synchronized_on_rbx(klass) + klass.class_eval do + private + + def _mon_initialize + @_monitor = Monitor.new unless @_monitor # avoid double initialisation + end + + def self.new(*args) + obj = super(*args) + obj.send(:_mon_initialize) + obj + end + end + + klass.superclass.instance_methods(false).each do |method| + case method + when :new_range, :new_reserved + klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(*args) + obj = super + obj.send(:_mon_initialize) + obj + end + RUBY + else + klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(*args) + monitor = @_monitor + monitor or raise("BUG: Internal monitor was not properly initialized. Please report this to the concurrent-ruby developers.") + monitor.synchronize { super } + end + RUBY + end + end + end + + def self.make_synchronized_on_truffleruby(klass) + klass.superclass.instance_methods(false).each do |method| + klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(*args, &block) + TruffleRuby.synchronized(self) { super(*args, &block) } + end + RUBY + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/power_of_two_tuple.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/power_of_two_tuple.rb new file mode 100644 index 000000000000..b54be39c4cc8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/power_of_two_tuple.rb @@ -0,0 +1,38 @@ +require 'concurrent/thread_safe/util' +require 'concurrent/tuple' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # @!visibility private + class PowerOfTwoTuple < Concurrent::Tuple + + def initialize(size) + raise ArgumentError, "size must be a power of 2 (#{size.inspect} provided)" unless size > 0 && size & (size - 1) == 0 + super(size) + end + + def hash_to_index(hash) + (size - 1) & hash + end + + def volatile_get_by_hash(hash) + volatile_get(hash_to_index(hash)) + end + + def volatile_set_by_hash(hash, value) + volatile_set(hash_to_index(hash), value) + end + + def next_in_size_table + self.class.new(size << 1) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/striped64.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/striped64.rb new file mode 100644 index 000000000000..4169c3d36607 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/striped64.rb @@ -0,0 +1,246 @@ +require 'concurrent/thread_safe/util' +require 'concurrent/thread_safe/util/power_of_two_tuple' +require 'concurrent/thread_safe/util/volatile' +require 'concurrent/thread_safe/util/xor_shift_random' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # A Ruby port of the Doug Lea's jsr166e.Striped64 class version 1.6 + # available in public domain. + # + # Original source code available here: + # http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/Striped64.java?revision=1.6 + # + # Class holding common representation and mechanics for classes supporting + # dynamic striping on 64bit values. + # + # This class maintains a lazily-initialized table of atomically updated + # variables, plus an extra +base+ field. The table size is a power of two. + # Indexing uses masked per-thread hash codes. Nearly all methods on this + # class are private, accessed directly by subclasses. + # + # Table entries are of class +Cell+; a variant of AtomicLong padded to + # reduce cache contention on most processors. Padding is overkill for most + # Atomics because they are usually irregularly scattered in memory and thus + # don't interfere much with each other. But Atomic objects residing in + # arrays will tend to be placed adjacent to each other, and so will most + # often share cache lines (with a huge negative performance impact) without + # this precaution. + # + # In part because +Cell+s are relatively large, we avoid creating them until + # they are needed. When there is no contention, all updates are made to the + # +base+ field. Upon first contention (a failed CAS on +base+ update), the + # table is initialized to size 2. The table size is doubled upon further + # contention until reaching the nearest power of two greater than or equal + # to the number of CPUS. Table slots remain empty (+nil+) until they are + # needed. + # + # A single spinlock (+busy+) is used for initializing and resizing the + # table, as well as populating slots with new +Cell+s. There is no need for + # a blocking lock: When the lock is not available, threads try other slots + # (or the base). During these retries, there is increased contention and + # reduced locality, which is still better than alternatives. + # + # Per-thread hash codes are initialized to random values. Contention and/or + # table collisions are indicated by failed CASes when performing an update + # operation (see method +retry_update+). Upon a collision, if the table size + # is less than the capacity, it is doubled in size unless some other thread + # holds the lock. If a hashed slot is empty, and lock is available, a new + # +Cell+ is created. Otherwise, if the slot exists, a CAS is tried. Retries + # proceed by "double hashing", using a secondary hash (XorShift) to try to + # find a free slot. + # + # The table size is capped because, when there are more threads than CPUs, + # supposing that each thread were bound to a CPU, there would exist a + # perfect hash function mapping threads to slots that eliminates collisions. + # When we reach capacity, we search for this mapping by randomly varying the + # hash codes of colliding threads. Because search is random, and collisions + # only become known via CAS failures, convergence can be slow, and because + # threads are typically not bound to CPUS forever, may not occur at all. + # However, despite these limitations, observed contention rates are + # typically low in these cases. + # + # It is possible for a +Cell+ to become unused when threads that once hashed + # to it terminate, as well as in the case where doubling the table causes no + # thread to hash to it under expanded mask. We do not try to detect or + # remove such cells, under the assumption that for long-running instances, + # observed contention levels will recur, so the cells will eventually be + # needed again; and for short-lived ones, it does not matter. + # + # @!visibility private + class Striped64 + + # Padded variant of AtomicLong supporting only raw accesses plus CAS. + # The +value+ field is placed between pads, hoping that the JVM doesn't + # reorder them. + # + # Optimisation note: It would be possible to use a release-only + # form of CAS here, if it were provided. + # + # @!visibility private + class Cell < Concurrent::AtomicReference + + alias_method :cas, :compare_and_set + + def cas_computed + cas(current_value = value, yield(current_value)) + end + + # @!visibility private + def self.padding + # TODO: this only adds padding after the :value slot, need to find a way to add padding before the slot + # TODO (pitr-ch 28-Jul-2018): the padding instance vars may not be created + # hide from yardoc in a method + attr_reader :padding_0, :padding_1, :padding_2, :padding_3, :padding_4, :padding_5, :padding_6, :padding_7, :padding_8, :padding_9, :padding_10, :padding_11 + end + padding + end + + extend Volatile + attr_volatile :cells, # Table of cells. When non-null, size is a power of 2. + :base, # Base value, used mainly when there is no contention, but also as a fallback during table initialization races. Updated via CAS. + :busy # Spinlock (locked via CAS) used when resizing and/or creating Cells. + + alias_method :busy?, :busy + + def initialize + super() + self.busy = false + self.base = 0 + end + + # Handles cases of updates involving initialization, resizing, + # creating new Cells, and/or contention. See above for + # explanation. This method suffers the usual non-modularity + # problems of optimistic retry code, relying on rechecked sets of + # reads. + # + # Arguments: + # [+x+] + # the value + # [+hash_code+] + # hash code used + # [+x+] + # false if CAS failed before call + def retry_update(x, hash_code, was_uncontended) # :yields: current_value + hash = hash_code + collided = false # True if last slot nonempty + while true + if current_cells = cells + if !(cell = current_cells.volatile_get_by_hash(hash)) + if busy? + collided = false + else # Try to attach new Cell + if try_to_install_new_cell(Cell.new(x), hash) # Optimistically create and try to insert new cell + break + else + redo # Slot is now non-empty + end + end + elsif !was_uncontended # CAS already known to fail + was_uncontended = true # Continue after rehash + elsif cell.cas_computed {|current_value| yield current_value} + break + elsif current_cells.size >= CPU_COUNT || cells != current_cells # At max size or stale + collided = false + elsif collided && expand_table_unless_stale(current_cells) + collided = false + redo # Retry with expanded table + else + collided = true + end + hash = XorShiftRandom.xorshift(hash) + + elsif try_initialize_cells(x, hash) || cas_base_computed {|current_base| yield current_base} + break + end + end + self.hash_code = hash + end + + private + # Static per-thread hash code key. Shared across all instances to + # reduce Thread locals pollution and because adjustments due to + # collisions in one table are likely to be appropriate for + # others. + THREAD_LOCAL_KEY = "#{name}.hash_code".to_sym + + # A thread-local hash code accessor. The code is initially + # random, but may be set to a different value upon collisions. + def hash_code + Thread.current[THREAD_LOCAL_KEY] ||= XorShiftRandom.get + end + + def hash_code=(hash) + Thread.current[THREAD_LOCAL_KEY] = hash + end + + # Sets base and all +cells+ to the given value. + def internal_reset(initial_value) + current_cells = cells + self.base = initial_value + if current_cells + current_cells.each do |cell| + cell.value = initial_value if cell + end + end + end + + def cas_base_computed + cas_base(current_base = base, yield(current_base)) + end + + def free? + !busy? + end + + def try_initialize_cells(x, hash) + if free? && !cells + try_in_busy do + unless cells # Recheck under lock + new_cells = PowerOfTwoTuple.new(2) + new_cells.volatile_set_by_hash(hash, Cell.new(x)) + self.cells = new_cells + end + end + end + end + + def expand_table_unless_stale(current_cells) + try_in_busy do + if current_cells == cells # Recheck under lock + new_cells = current_cells.next_in_size_table + current_cells.each_with_index {|x, i| new_cells.volatile_set(i, x)} + self.cells = new_cells + end + end + end + + def try_to_install_new_cell(new_cell, hash) + try_in_busy do + # Recheck under lock + if (current_cells = cells) && !current_cells.volatile_get(i = current_cells.hash_to_index(hash)) + current_cells.volatile_set(i, new_cell) + end + end + end + + def try_in_busy + if cas_busy(false, true) + begin + yield + ensure + self.busy = false + end + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/volatile.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/volatile.rb new file mode 100644 index 000000000000..cdac2a396a79 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/volatile.rb @@ -0,0 +1,75 @@ +require 'concurrent/thread_safe/util' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # @!visibility private + module Volatile + + # Provides +volatile+ (in the JVM's sense) attribute accessors implemented + # atop of +Concurrent::AtomicReference+. + # + # Usage: + # class Foo + # extend Concurrent::ThreadSafe::Util::Volatile + # attr_volatile :foo, :bar + # + # def initialize(bar) + # super() # must super() into parent initializers before using the volatile attribute accessors + # self.bar = bar + # end + # + # def hello + # my_foo = foo # volatile read + # self.foo = 1 # volatile write + # cas_foo(1, 2) # => true | a strong CAS + # end + # end + def attr_volatile(*attr_names) + return if attr_names.empty? + include(Module.new do + atomic_ref_setup = attr_names.map {|attr_name| "@__#{attr_name} = Concurrent::AtomicReference.new"} + initialize_copy_setup = attr_names.zip(atomic_ref_setup).map do |attr_name, ref_setup| + "#{ref_setup}(other.instance_variable_get(:@__#{attr_name}).get)" + end + class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def initialize(*) + super + #{atomic_ref_setup.join('; ')} + end + + def initialize_copy(other) + super + #{initialize_copy_setup.join('; ')} + end + RUBY_EVAL + + attr_names.each do |attr_name| + class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def #{attr_name} + @__#{attr_name}.get + end + + def #{attr_name}=(value) + @__#{attr_name}.set(value) + end + + def compare_and_set_#{attr_name}(old_value, new_value) + @__#{attr_name}.compare_and_set(old_value, new_value) + end + RUBY_EVAL + + alias_method :"cas_#{attr_name}", :"compare_and_set_#{attr_name}" + alias_method :"lazy_set_#{attr_name}", :"#{attr_name}=" + end + end) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb new file mode 100644 index 000000000000..bdde2dd8b363 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb @@ -0,0 +1,50 @@ +require 'concurrent/thread_safe/util' + +module Concurrent + + # @!visibility private + module ThreadSafe + + # @!visibility private + module Util + + # A xorshift random number (positive +Fixnum+s) generator, provides + # reasonably cheap way to generate thread local random numbers without + # contending for the global +Kernel.rand+. + # + # Usage: + # x = XorShiftRandom.get # uses Kernel.rand to generate an initial seed + # while true + # if (x = XorShiftRandom.xorshift).odd? # thread-localy generate a next random number + # do_something_at_random + # end + # end + module XorShiftRandom + extend self + MAX_XOR_SHIFTABLE_INT = MAX_INT - 1 + + # Generates an initial non-zero positive +Fixnum+ via +Kernel.rand+. + def get + Kernel.rand(MAX_XOR_SHIFTABLE_INT) + 1 # 0 can't be xorshifted + end + + # xorshift based on: http://www.jstatsoft.org/v08/i14/paper + if 0.size == 4 + # using the "yˆ=y>>a; yˆ=y<<b; yˆ=y>>c;" transform with the (a,b,c) tuple with values (3,1,14) to minimise Bignum overflows + def xorshift(x) + x ^= x >> 3 + x ^= (x << 1) & MAX_INT # cut-off Bignum overflow + x ^= x >> 14 + end + else + # using the "yˆ=y>>a; yˆ=y<<b; yˆ=y>>c;" transform with the (a,b,c) tuple with values (1,1,54) to minimise Bignum overflows + def xorshift(x) + x ^= x >> 1 + x ^= (x << 1) & MAX_INT # cut-off Bignum overflow + x ^= x >> 54 + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/timer_task.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/timer_task.rb new file mode 100644 index 000000000000..a0b72333351e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/timer_task.rb @@ -0,0 +1,333 @@ +require 'concurrent/collection/copy_on_notify_observer_set' +require 'concurrent/concern/dereferenceable' +require 'concurrent/concern/observable' +require 'concurrent/atomic/atomic_boolean' +require 'concurrent/executor/executor_service' +require 'concurrent/executor/ruby_executor_service' +require 'concurrent/executor/safe_task_executor' +require 'concurrent/scheduled_task' + +module Concurrent + + # A very common concurrency pattern is to run a thread that performs a task at + # regular intervals. The thread that performs the task sleeps for the given + # interval then wakes up and performs the task. Lather, rinse, repeat... This + # pattern causes two problems. First, it is difficult to test the business + # logic of the task because the task itself is tightly coupled with the + # concurrency logic. Second, an exception raised while performing the task can + # cause the entire thread to abend. In a long-running application where the + # task thread is intended to run for days/weeks/years a crashed task thread + # can pose a significant problem. `TimerTask` alleviates both problems. + # + # When a `TimerTask` is launched it starts a thread for monitoring the + # execution interval. The `TimerTask` thread does not perform the task, + # however. Instead, the TimerTask launches the task on a separate thread. + # Should the task experience an unrecoverable crash only the task thread will + # crash. This makes the `TimerTask` very fault tolerant. Additionally, the + # `TimerTask` thread can respond to the success or failure of the task, + # performing logging or ancillary operations. `TimerTask` can also be + # configured with a timeout value allowing it to kill a task that runs too + # long. + # + # One other advantage of `TimerTask` is that it forces the business logic to + # be completely decoupled from the concurrency logic. The business logic can + # be tested separately then passed to the `TimerTask` for scheduling and + # running. + # + # In some cases it may be necessary for a `TimerTask` to affect its own + # execution cycle. To facilitate this, a reference to the TimerTask instance + # is passed as an argument to the provided block every time the task is + # executed. + # + # The `TimerTask` class includes the `Dereferenceable` mixin module so the + # result of the last execution is always available via the `#value` method. + # Dereferencing options can be passed to the `TimerTask` during construction or + # at any later time using the `#set_deref_options` method. + # + # `TimerTask` supports notification through the Ruby standard library + # {http://ruby-doc.org/stdlib-2.0/libdoc/observer/rdoc/Observable.html + # Observable} module. On execution the `TimerTask` will notify the observers + # with three arguments: time of execution, the result of the block (or nil on + # failure), and any raised exceptions (or nil on success). If the timeout + # interval is exceeded the observer will receive a `Concurrent::TimeoutError` + # object as the third argument. + # + # @!macro copy_options + # + # @example Basic usage + # task = Concurrent::TimerTask.new{ puts 'Boom!' } + # task.execute + # + # task.execution_interval #=> 60 (default) + # task.timeout_interval #=> 30 (default) + # + # # wait 60 seconds... + # #=> 'Boom!' + # + # task.shutdown #=> true + # + # @example Configuring `:execution_interval` and `:timeout_interval` + # task = Concurrent::TimerTask.new(execution_interval: 5, timeout_interval: 5) do + # puts 'Boom!' + # end + # + # task.execution_interval #=> 5 + # task.timeout_interval #=> 5 + # + # @example Immediate execution with `:run_now` + # task = Concurrent::TimerTask.new(run_now: true){ puts 'Boom!' } + # task.execute + # + # #=> 'Boom!' + # + # @example Last `#value` and `Dereferenceable` mixin + # task = Concurrent::TimerTask.new( + # dup_on_deref: true, + # execution_interval: 5 + # ){ Time.now } + # + # task.execute + # Time.now #=> 2013-11-07 18:06:50 -0500 + # sleep(10) + # task.value #=> 2013-11-07 18:06:55 -0500 + # + # @example Controlling execution from within the block + # timer_task = Concurrent::TimerTask.new(execution_interval: 1) do |task| + # task.execution_interval.times{ print 'Boom! ' } + # print "\n" + # task.execution_interval += 1 + # if task.execution_interval > 5 + # puts 'Stopping...' + # task.shutdown + # end + # end + # + # timer_task.execute # blocking call - this task will stop itself + # #=> Boom! + # #=> Boom! Boom! + # #=> Boom! Boom! Boom! + # #=> Boom! Boom! Boom! Boom! + # #=> Boom! Boom! Boom! Boom! Boom! + # #=> Stopping... + # + # @example Observation + # class TaskObserver + # def update(time, result, ex) + # if result + # print "(#{time}) Execution successfully returned #{result}\n" + # elsif ex.is_a?(Concurrent::TimeoutError) + # print "(#{time}) Execution timed out\n" + # else + # print "(#{time}) Execution failed with error #{ex}\n" + # end + # end + # end + # + # task = Concurrent::TimerTask.new(execution_interval: 1, timeout_interval: 1){ 42 } + # task.add_observer(TaskObserver.new) + # task.execute + # sleep 4 + # + # #=> (2013-10-13 19:08:58 -0400) Execution successfully returned 42 + # #=> (2013-10-13 19:08:59 -0400) Execution successfully returned 42 + # #=> (2013-10-13 19:09:00 -0400) Execution successfully returned 42 + # task.shutdown + # + # task = Concurrent::TimerTask.new(execution_interval: 1, timeout_interval: 1){ sleep } + # task.add_observer(TaskObserver.new) + # task.execute + # + # #=> (2013-10-13 19:07:25 -0400) Execution timed out + # #=> (2013-10-13 19:07:27 -0400) Execution timed out + # #=> (2013-10-13 19:07:29 -0400) Execution timed out + # task.shutdown + # + # task = Concurrent::TimerTask.new(execution_interval: 1){ raise StandardError } + # task.add_observer(TaskObserver.new) + # task.execute + # + # #=> (2013-10-13 19:09:37 -0400) Execution failed with error StandardError + # #=> (2013-10-13 19:09:38 -0400) Execution failed with error StandardError + # #=> (2013-10-13 19:09:39 -0400) Execution failed with error StandardError + # task.shutdown + # + # @see http://ruby-doc.org/stdlib-2.0/libdoc/observer/rdoc/Observable.html + # @see http://docs.oracle.com/javase/7/docs/api/java/util/TimerTask.html + class TimerTask < RubyExecutorService + include Concern::Dereferenceable + include Concern::Observable + + # Default `:execution_interval` in seconds. + EXECUTION_INTERVAL = 60 + + # Default `:timeout_interval` in seconds. + TIMEOUT_INTERVAL = 30 + + # Create a new TimerTask with the given task and configuration. + # + # @!macro timer_task_initialize + # @param [Hash] opts the options defining task execution. + # @option opts [Integer] :execution_interval number of seconds between + # task executions (default: EXECUTION_INTERVAL) + # @option opts [Integer] :timeout_interval number of seconds a task can + # run before it is considered to have failed (default: TIMEOUT_INTERVAL) + # @option opts [Boolean] :run_now Whether to run the task immediately + # upon instantiation or to wait until the first # execution_interval + # has passed (default: false) + # + # @!macro deref_options + # + # @raise ArgumentError when no block is given. + # + # @yield to the block after :execution_interval seconds have passed since + # the last yield + # @yieldparam task a reference to the `TimerTask` instance so that the + # block can control its own lifecycle. Necessary since `self` will + # refer to the execution context of the block rather than the running + # `TimerTask`. + # + # @return [TimerTask] the new `TimerTask` + def initialize(opts = {}, &task) + raise ArgumentError.new('no block given') unless block_given? + super + set_deref_options opts + end + + # Is the executor running? + # + # @return [Boolean] `true` when running, `false` when shutting down or shutdown + def running? + @running.true? + end + + # Execute a previously created `TimerTask`. + # + # @return [TimerTask] a reference to `self` + # + # @example Instance and execute in separate steps + # task = Concurrent::TimerTask.new(execution_interval: 10){ print "Hello World\n" } + # task.running? #=> false + # task.execute + # task.running? #=> true + # + # @example Instance and execute in one line + # task = Concurrent::TimerTask.new(execution_interval: 10){ print "Hello World\n" }.execute + # task.running? #=> true + def execute + synchronize do + if @running.false? + @running.make_true + schedule_next_task(@run_now ? 0 : @execution_interval) + end + end + self + end + + # Create and execute a new `TimerTask`. + # + # @!macro timer_task_initialize + # + # @example + # task = Concurrent::TimerTask.execute(execution_interval: 10){ print "Hello World\n" } + # task.running? #=> true + def self.execute(opts = {}, &task) + TimerTask.new(opts, &task).execute + end + + # @!attribute [rw] execution_interval + # @return [Fixnum] Number of seconds after the task completes before the + # task is performed again. + def execution_interval + synchronize { @execution_interval } + end + + # @!attribute [rw] execution_interval + # @return [Fixnum] Number of seconds after the task completes before the + # task is performed again. + def execution_interval=(value) + if (value = value.to_f) <= 0.0 + raise ArgumentError.new('must be greater than zero') + else + synchronize { @execution_interval = value } + end + end + + # @!attribute [rw] timeout_interval + # @return [Fixnum] Number of seconds the task can run before it is + # considered to have failed. + def timeout_interval + synchronize { @timeout_interval } + end + + # @!attribute [rw] timeout_interval + # @return [Fixnum] Number of seconds the task can run before it is + # considered to have failed. + def timeout_interval=(value) + if (value = value.to_f) <= 0.0 + raise ArgumentError.new('must be greater than zero') + else + synchronize { @timeout_interval = value } + end + end + + private :post, :<< + + private + + def ns_initialize(opts, &task) + set_deref_options(opts) + + self.execution_interval = opts[:execution] || opts[:execution_interval] || EXECUTION_INTERVAL + self.timeout_interval = opts[:timeout] || opts[:timeout_interval] || TIMEOUT_INTERVAL + @run_now = opts[:now] || opts[:run_now] + @executor = Concurrent::SafeTaskExecutor.new(task) + @running = Concurrent::AtomicBoolean.new(false) + @value = nil + + self.observers = Collection::CopyOnNotifyObserverSet.new + end + + # @!visibility private + def ns_shutdown_execution + @running.make_false + super + end + + # @!visibility private + def ns_kill_execution + @running.make_false + super + end + + # @!visibility private + def schedule_next_task(interval = execution_interval) + ScheduledTask.execute(interval, args: [Concurrent::Event.new], &method(:execute_task)) + nil + end + + # @!visibility private + def execute_task(completion) + return nil unless @running.true? + ScheduledTask.execute(timeout_interval, args: [completion], &method(:timeout_task)) + _success, value, reason = @executor.execute(self) + if completion.try? + self.value = value + schedule_next_task + time = Time.now + observers.notify_observers do + [time, self.value, reason] + end + end + nil + end + + # @!visibility private + def timeout_task(completion) + return unless @running.true? + if completion.try? + schedule_next_task + observers.notify_observers(Time.now, nil, Concurrent::TimeoutError.new) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/tuple.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/tuple.rb new file mode 100644 index 000000000000..f8c4c25d32b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/tuple.rb @@ -0,0 +1,86 @@ +require 'concurrent/atomic/atomic_reference' + +module Concurrent + + # A fixed size array with volatile (synchronized, thread safe) getters/setters. + # Mixes in Ruby's `Enumerable` module for enhanced search, sort, and traversal. + # + # @example + # tuple = Concurrent::Tuple.new(16) + # + # tuple.set(0, :foo) #=> :foo | volatile write + # tuple.get(0) #=> :foo | volatile read + # tuple.compare_and_set(0, :foo, :bar) #=> true | strong CAS + # tuple.cas(0, :foo, :baz) #=> false | strong CAS + # tuple.get(0) #=> :bar | volatile read + # + # @see https://en.wikipedia.org/wiki/Tuple Tuple entry at Wikipedia + # @see http://www.erlang.org/doc/reference_manual/data_types.html#id70396 Erlang Tuple + # @see http://ruby-doc.org/core-2.2.2/Enumerable.html Enumerable + class Tuple + include Enumerable + + # The (fixed) size of the tuple. + attr_reader :size + + # @!visibility private + Tuple = defined?(Rubinius::Tuple) ? Rubinius::Tuple : ::Array + private_constant :Tuple + + # Create a new tuple of the given size. + # + # @param [Integer] size the number of elements in the tuple + def initialize(size) + @size = size + @tuple = tuple = Tuple.new(size) + i = 0 + while i < size + tuple[i] = Concurrent::AtomicReference.new + i += 1 + end + end + + # Get the value of the element at the given index. + # + # @param [Integer] i the index from which to retrieve the value + # @return [Object] the value at the given index or nil if the index is out of bounds + def get(i) + return nil if i >= @size || i < 0 + @tuple[i].get + end + alias_method :volatile_get, :get + + # Set the element at the given index to the given value + # + # @param [Integer] i the index for the element to set + # @param [Object] value the value to set at the given index + # + # @return [Object] the new value of the element at the given index or nil if the index is out of bounds + def set(i, value) + return nil if i >= @size || i < 0 + @tuple[i].set(value) + end + alias_method :volatile_set, :set + + # Set the value at the given index to the new value if and only if the current + # value matches the given old value. + # + # @param [Integer] i the index for the element to set + # @param [Object] old_value the value to compare against the current value + # @param [Object] new_value the value to set at the given index + # + # @return [Boolean] true if the value at the given element was set else false + def compare_and_set(i, old_value, new_value) + return false if i >= @size || i < 0 + @tuple[i].compare_and_set(old_value, new_value) + end + alias_method :cas, :compare_and_set + + # Calls the given block once for each element in self, passing that element as a parameter. + # + # @yieldparam [Object] ref the `Concurrent::AtomicReference` object at the current index + def each + @tuple.each {|ref| yield ref.get} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/tvar.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/tvar.rb new file mode 100644 index 000000000000..d6fe3b1a3508 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/tvar.rb @@ -0,0 +1,261 @@ +require 'set' +require 'concurrent/synchronization' + +module Concurrent + + # A `TVar` is a transactional variable - a single-element container that + # is used as part of a transaction - see `Concurrent::atomically`. + # + # @!macro thread_safe_variable_comparison + # + # {include:file:docs-source/tvar.md} + class TVar < Synchronization::Object + safe_initialization! + + # Create a new `TVar` with an initial value. + def initialize(value) + @value = value + @version = 0 + @lock = Mutex.new + end + + # Get the value of a `TVar`. + def value + Concurrent::atomically do + Transaction::current.read(self) + end + end + + # Set the value of a `TVar`. + def value=(value) + Concurrent::atomically do + Transaction::current.write(self, value) + end + end + + # @!visibility private + def unsafe_value # :nodoc: + @value + end + + # @!visibility private + def unsafe_value=(value) # :nodoc: + @value = value + end + + # @!visibility private + def unsafe_version # :nodoc: + @version + end + + # @!visibility private + def unsafe_increment_version # :nodoc: + @version += 1 + end + + # @!visibility private + def unsafe_lock # :nodoc: + @lock + end + + end + + # Run a block that reads and writes `TVar`s as a single atomic transaction. + # With respect to the value of `TVar` objects, the transaction is atomic, in + # that it either happens or it does not, consistent, in that the `TVar` + # objects involved will never enter an illegal state, and isolated, in that + # transactions never interfere with each other. You may recognise these + # properties from database transactions. + # + # There are some very important and unusual semantics that you must be aware of: + # + # * Most importantly, the block that you pass to atomically may be executed + # more than once. In most cases your code should be free of + # side-effects, except for via TVar. + # + # * If an exception escapes an atomically block it will abort the transaction. + # + # * It is undefined behaviour to use callcc or Fiber with atomically. + # + # * If you create a new thread within an atomically, it will not be part of + # the transaction. Creating a thread counts as a side-effect. + # + # Transactions within transactions are flattened to a single transaction. + # + # @example + # a = new TVar(100_000) + # b = new TVar(100) + # + # Concurrent::atomically do + # a.value -= 10 + # b.value += 10 + # end + def atomically + raise ArgumentError.new('no block given') unless block_given? + + # Get the current transaction + + transaction = Transaction::current + + # Are we not already in a transaction (not nested)? + + if transaction.nil? + # New transaction + + begin + # Retry loop + + loop do + + # Create a new transaction + + transaction = Transaction.new + Transaction::current = transaction + + # Run the block, aborting on exceptions + + begin + result = yield + rescue Transaction::AbortError => e + transaction.abort + result = Transaction::ABORTED + rescue Transaction::LeaveError => e + transaction.abort + break result + rescue => e + transaction.abort + raise e + end + # If we can commit, break out of the loop + + if result != Transaction::ABORTED + if transaction.commit + break result + end + end + end + ensure + # Clear the current transaction + + Transaction::current = nil + end + else + # Nested transaction - flatten it and just run the block + + yield + end + end + + # Abort a currently running transaction - see `Concurrent::atomically`. + def abort_transaction + raise Transaction::AbortError.new + end + + # Leave a transaction without committing or aborting - see `Concurrent::atomically`. + def leave_transaction + raise Transaction::LeaveError.new + end + + module_function :atomically, :abort_transaction, :leave_transaction + + private + + class Transaction + + ABORTED = ::Object.new + + ReadLogEntry = Struct.new(:tvar, :version) + + AbortError = Class.new(StandardError) + LeaveError = Class.new(StandardError) + + def initialize + @read_log = [] + @write_log = {} + end + + def read(tvar) + Concurrent::abort_transaction unless valid? + + if @write_log.has_key? tvar + @write_log[tvar] + else + @read_log.push(ReadLogEntry.new(tvar, tvar.unsafe_version)) + tvar.unsafe_value + end + end + + def write(tvar, value) + # Have we already written to this TVar? + + if @write_log.has_key? tvar + # Record the value written + @write_log[tvar] = value + else + # Try to lock the TVar + + unless tvar.unsafe_lock.try_lock + # Someone else is writing to this TVar - abort + Concurrent::abort_transaction + end + + # Record the value written + + @write_log[tvar] = value + + # If we previously read from it, check the version hasn't changed + + @read_log.each do |log_entry| + if log_entry.tvar == tvar and tvar.unsafe_version > log_entry.version + Concurrent::abort_transaction + end + end + end + end + + def abort + unlock + end + + def commit + return false unless valid? + + @write_log.each_pair do |tvar, value| + tvar.unsafe_value = value + tvar.unsafe_increment_version + end + + unlock + + true + end + + def valid? + @read_log.each do |log_entry| + unless @write_log.has_key? log_entry.tvar + if log_entry.tvar.unsafe_version > log_entry.version + return false + end + end + end + + true + end + + def unlock + @write_log.each_key do |tvar| + tvar.unsafe_lock.unlock + end + end + + def self.current + Thread.current[:current_tvar_transaction] + end + + def self.current=(transaction) + Thread.current[:current_tvar_transaction] = transaction + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/engine.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/engine.rb new file mode 100644 index 000000000000..bc4173e448c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/engine.rb @@ -0,0 +1,56 @@ +module Concurrent + module Utility + + # @!visibility private + module EngineDetector + def on_jruby? + ruby_engine == 'jruby' + end + + def on_jruby_9000? + on_jruby? && ruby_version(JRUBY_VERSION, :>=, 9, 0, 0) + end + + def on_cruby? + ruby_engine == 'ruby' + end + + def on_rbx? + ruby_engine == 'rbx' + end + + def on_truffleruby? + ruby_engine == 'truffleruby' + end + + def on_windows? + !(RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/).nil? + end + + def on_osx? + !(RbConfig::CONFIG['host_os'] =~ /darwin|mac os/).nil? + end + + def on_linux? + !(RbConfig::CONFIG['host_os'] =~ /linux/).nil? + end + + def ruby_engine + defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby' + end + + def ruby_version(version = RUBY_VERSION, comparison, major, minor, patch) + result = (version.split('.').map(&:to_i) <=> [major, minor, patch]) + comparisons = { :== => [0], + :>= => [1, 0], + :<= => [-1, 0], + :> => [1], + :< => [-1] } + comparisons.fetch(comparison).include? result + end + end + end + + # @!visibility private + extend Utility::EngineDetector +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/monotonic_time.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/monotonic_time.rb new file mode 100644 index 000000000000..c9f4b369a4a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/monotonic_time.rb @@ -0,0 +1,58 @@ +require 'concurrent/synchronization' + +module Concurrent + + class_definition = Class.new(Synchronization::LockableObject) do + def initialize + @last_time = Time.now.to_f + super() + end + + if defined?(Process::CLOCK_MONOTONIC) + # @!visibility private + def get_time + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + elsif Concurrent.on_jruby? + # @!visibility private + def get_time + java.lang.System.nanoTime() / 1_000_000_000.0 + end + else + + # @!visibility private + def get_time + synchronize do + now = Time.now.to_f + if @last_time < now + @last_time = now + else # clock has moved back in time + @last_time += 0.000_001 + end + end + end + + end + end + + # Clock that cannot be set and represents monotonic time since + # some unspecified starting point. + # + # @!visibility private + GLOBAL_MONOTONIC_CLOCK = class_definition.new + private_constant :GLOBAL_MONOTONIC_CLOCK + + # @!macro monotonic_get_time + # + # Returns the current time a tracked by the application monotonic clock. + # + # @return [Float] The current monotonic time since some unspecified + # starting point + # + # @!macro monotonic_clock_warning + def monotonic_time + GLOBAL_MONOTONIC_CLOCK.get_time + end + + module_function :monotonic_time +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb new file mode 100644 index 000000000000..a944bd729032 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb @@ -0,0 +1,79 @@ +require 'concurrent/utility/engine' + +module Concurrent + + module Utility + + # @!visibility private + module NativeExtensionLoader + + def allow_c_extensions? + Concurrent.on_cruby? + end + + def c_extensions_loaded? + defined?(@c_extensions_loaded) && @c_extensions_loaded + end + + def java_extensions_loaded? + defined?(@java_extensions_loaded) && @java_extensions_loaded + end + + def load_native_extensions + unless defined? Synchronization::AbstractObject + raise 'native_extension_loader loaded before Synchronization::AbstractObject' + end + + if Concurrent.on_cruby? && !c_extensions_loaded? + ['concurrent/concurrent_ruby_ext', + "concurrent/#{RUBY_VERSION[0..2]}/concurrent_ruby_ext" + ].each { |p| try_load_c_extension p } + end + + if Concurrent.on_jruby? && !java_extensions_loaded? + begin + require 'concurrent/concurrent_ruby.jar' + set_java_extensions_loaded + rescue LoadError => e + raise e, "Java extensions are required for JRuby.\n" + e.message, e.backtrace + end + end + end + + private + + def load_error_path(error) + if error.respond_to? :path + error.path + else + error.message.split(' -- ').last + end + end + + def set_c_extensions_loaded + @c_extensions_loaded = true + end + + def set_java_extensions_loaded + @java_extensions_loaded = true + end + + def try_load_c_extension(path) + require path + set_c_extensions_loaded + rescue LoadError => e + if load_error_path(e) == path + # move on with pure-Ruby implementations + # TODO (pitr-ch 12-Jul-2018): warning on verbose? + else + raise e + end + end + + end + end + + # @!visibility private + extend Utility::NativeExtensionLoader +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/native_integer.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/native_integer.rb new file mode 100644 index 000000000000..10719e7caa79 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/native_integer.rb @@ -0,0 +1,53 @@ +module Concurrent + module Utility + # @private + module NativeInteger + # http://stackoverflow.com/questions/535721/ruby-max-integer + MIN_VALUE = -(2**(0.size * 8 - 2)) + MAX_VALUE = (2**(0.size * 8 - 2) - 1) + + def ensure_upper_bound(value) + if value > MAX_VALUE + raise RangeError.new("#{value} is greater than the maximum value of #{MAX_VALUE}") + end + value + end + + def ensure_lower_bound(value) + if value < MIN_VALUE + raise RangeError.new("#{value} is less than the maximum value of #{MIN_VALUE}") + end + value + end + + def ensure_integer(value) + unless value.is_a?(Integer) + raise ArgumentError.new("#{value} is not an Integer") + end + value + end + + def ensure_integer_and_bounds(value) + ensure_integer value + ensure_upper_bound value + ensure_lower_bound value + end + + def ensure_positive(value) + if value < 0 + raise ArgumentError.new("#{value} cannot be negative") + end + value + end + + def ensure_positive_and_no_zero(value) + if value < 1 + raise ArgumentError.new("#{value} cannot be negative or zero") + end + value + end + + extend self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/processor_counter.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/processor_counter.rb new file mode 100644 index 000000000000..531ca0a3c9c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/utility/processor_counter.rb @@ -0,0 +1,163 @@ +require 'etc' +require 'rbconfig' +require 'concurrent/delay' + +module Concurrent + module Utility + + # @!visibility private + class ProcessorCounter + def initialize + @processor_count = Delay.new { compute_processor_count } + @physical_processor_count = Delay.new { compute_physical_processor_count } + end + + # Number of processors seen by the OS and used for process scheduling. For + # performance reasons the calculated value will be memoized on the first + # call. + # + # When running under JRuby the Java runtime call + # `java.lang.Runtime.getRuntime.availableProcessors` will be used. According + # to the Java documentation this "value may change during a particular + # invocation of the virtual machine... [applications] should therefore + # occasionally poll this property." Subsequently the result will NOT be + # memoized under JRuby. + # + # Ruby's Etc.nprocessors will be used if available (MRI 2.2+). + # + # On Windows the Win32 API will be queried for the + # `NumberOfLogicalProcessors from Win32_Processor`. This will return the + # total number "logical processors for the current instance of the + # processor", which taked into account hyperthreading. + # + # * AIX: /usr/sbin/pmcycles (AIX 5+), /usr/sbin/lsdev + # * Alpha: /usr/bin/nproc (/proc/cpuinfo exists but cannot be used) + # * BSD: /sbin/sysctl + # * Cygwin: /proc/cpuinfo + # * Darwin: /usr/bin/hwprefs, /usr/sbin/sysctl + # * HP-UX: /usr/sbin/ioscan + # * IRIX: /usr/sbin/sysconf + # * Linux: /proc/cpuinfo + # * Minix 3+: /proc/cpuinfo + # * Solaris: /usr/sbin/psrinfo + # * Tru64 UNIX: /usr/sbin/psrinfo + # * UnixWare: /usr/sbin/psrinfo + # + # @return [Integer] number of processors seen by the OS or Java runtime + # + # @see https://github.com/grosser/parallel/blob/4fc8b89d08c7091fe0419ca8fba1ec3ce5a8d185/lib/parallel.rb + # + # @see http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#availableProcessors() + # @see http://msdn.microsoft.com/en-us/library/aa394373(v=vs.85).aspx + def processor_count + @processor_count.value + end + + # Number of physical processor cores on the current system. For performance + # reasons the calculated value will be memoized on the first call. + # + # On Windows the Win32 API will be queried for the `NumberOfCores from + # Win32_Processor`. This will return the total number "of cores for the + # current instance of the processor." On Unix-like operating systems either + # the `hwprefs` or `sysctl` utility will be called in a subshell and the + # returned value will be used. In the rare case where none of these methods + # work or an exception is raised the function will simply return 1. + # + # @return [Integer] number physical processor cores on the current system + # + # @see https://github.com/grosser/parallel/blob/4fc8b89d08c7091fe0419ca8fba1ec3ce5a8d185/lib/parallel.rb + # + # @see http://msdn.microsoft.com/en-us/library/aa394373(v=vs.85).aspx + # @see http://www.unix.com/man-page/osx/1/HWPREFS/ + # @see http://linux.die.net/man/8/sysctl + def physical_processor_count + @physical_processor_count.value + end + + private + + def compute_processor_count + if Concurrent.on_jruby? + java.lang.Runtime.getRuntime.availableProcessors + elsif Etc.respond_to?(:nprocessors) && (nprocessor = Etc.nprocessors rescue nil) + nprocessor + else + os_name = RbConfig::CONFIG["target_os"] + if os_name =~ /mingw|mswin/ + require 'win32ole' + result = WIN32OLE.connect("winmgmts://").ExecQuery( + "select NumberOfLogicalProcessors from Win32_Processor") + result.to_enum.collect(&:NumberOfLogicalProcessors).reduce(:+) + elsif File.readable?("/proc/cpuinfo") && (cpuinfo_count = IO.read("/proc/cpuinfo").scan(/^processor/).size) > 0 + cpuinfo_count + elsif File.executable?("/usr/bin/nproc") + IO.popen("/usr/bin/nproc --all", &:read).to_i + elsif File.executable?("/usr/bin/hwprefs") + IO.popen("/usr/bin/hwprefs thread_count", &:read).to_i + elsif File.executable?("/usr/sbin/psrinfo") + IO.popen("/usr/sbin/psrinfo", &:read).scan(/^.*on-*line/).size + elsif File.executable?("/usr/sbin/ioscan") + IO.popen("/usr/sbin/ioscan -kC processor", &:read).scan(/^.*processor/).size + elsif File.executable?("/usr/sbin/pmcycles") + IO.popen("/usr/sbin/pmcycles -m", &:read).count("\n") + elsif File.executable?("/usr/sbin/lsdev") + IO.popen("/usr/sbin/lsdev -Cc processor -S 1", &:read).count("\n") + elsif File.executable?("/usr/sbin/sysconf") and os_name =~ /irix/i + IO.popen("/usr/sbin/sysconf NPROC_ONLN", &:read).to_i + elsif File.executable?("/usr/sbin/sysctl") + IO.popen("/usr/sbin/sysctl -n hw.ncpu", &:read).to_i + elsif File.executable?("/sbin/sysctl") + IO.popen("/sbin/sysctl -n hw.ncpu", &:read).to_i + else + # TODO (pitr-ch 05-Nov-2016): warn about failures + 1 + end + end + rescue + return 1 + end + + def compute_physical_processor_count + ppc = case RbConfig::CONFIG["target_os"] + when /darwin1/ + IO.popen("/usr/sbin/sysctl -n hw.physicalcpu", &:read).to_i + when /linux/ + cores = {} # unique physical ID / core ID combinations + phy = 0 + IO.read("/proc/cpuinfo").scan(/^physical id.*|^core id.*/) do |ln| + if ln.start_with?("physical") + phy = ln[/\d+/] + elsif ln.start_with?("core") + cid = phy + ":" + ln[/\d+/] + cores[cid] = true if not cores[cid] + end + end + cores.count + when /mswin|mingw/ + require 'win32ole' + result_set = WIN32OLE.connect("winmgmts://").ExecQuery( + "select NumberOfCores from Win32_Processor") + result_set.to_enum.collect(&:NumberOfCores).reduce(:+) + else + processor_count + end + # fall back to logical count if physical info is invalid + ppc > 0 ? ppc : processor_count + rescue + return 1 + end + end + end + + # create the default ProcessorCounter on load + @processor_counter = Utility::ProcessorCounter.new + singleton_class.send :attr_reader, :processor_counter + + def self.processor_count + processor_counter.processor_count + end + + def self.physical_processor_count + processor_counter.physical_processor_count + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/version.rb b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/version.rb new file mode 100644 index 000000000000..8d9dde2355ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/concurrent-ruby-1.1.8/lib/concurrent-ruby/concurrent/version.rb @@ -0,0 +1,3 @@ +module Concurrent + VERSION = '1.1.8' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.coveralls.yml b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.coveralls.yml new file mode 100644 index 000000000000..5cd7e5953d30 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.coveralls.yml @@ -0,0 +1,2 @@ +service_name: travis-ci +repo_token: 99b5l6CKFt3CC4rxYUetvDQvKtaTgCJW2 diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.gitignore b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.gitignore new file mode 100644 index 000000000000..84b4694be11e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.gitignore @@ -0,0 +1,23 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +.idea/ +lib/bundler/man +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp +*.bundle +*.so +*.o +*.a +mkmf.log \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.travis.yml new file mode 100644 index 000000000000..2c757c501f2d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.travis.yml @@ -0,0 +1,17 @@ +language: ruby +cache: bundler +sudo: false + +before_install: gem install bundler + +script: "bundle exec rake test" + +rvm: + - 2.6.6 + - 2.5.8 + - 2.7.1 + - ruby-head + +matrix: + allow_failures: + - rvm: ruby-head diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.yardopts b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.yardopts new file mode 100644 index 000000000000..8d7d4107dc55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/.yardopts @@ -0,0 +1,7 @@ +- +--main README.md +LICENSE +DNSSEC +EXAMPLES +EVENTMACHINE +RELEASE_NOTES.md diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/DNSSEC b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/DNSSEC new file mode 100644 index 000000000000..b9ce66293cb5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/DNSSEC @@ -0,0 +1,19 @@ +DNSSEC support in Dnsruby +========================= + +DNSSEC defines a set of security extensions to DNS which provide a way for a resolver to verify cryptographically the DNS RRSets returned by an upstream resolver. The main standard is defined in RFCs 4033, 4034 and 4035. + +Dnsruby provides a recursive, validating security-aware stub resolver which maintains a cache of trusted keys and verifies RRSIG-signed messages with those keys (adding new trusted keys from signed DNSKEY RRSets and DS records). If dnsruby does not currently have the required key, it will attempt to walk the tree from the nearest known trusted key. + +The dnssec security status of a message is stored in Message#security_level (defined by Message::SecurityLevel). + +It is possible to tell Dnsruby to use a Recursor or a defined (or system default) Resolver to perform the validation. The default is to use a Recursor, as many systems are behind dodgy servers which mangle the DNS records. Using a Recursor means that only authoritative nameservers are queried for the DNSSEC records. + +In the absence of a signed root, Dnsruby has no trust anchor to validate messages against. It is possible to manually configure dnsruby with individual trust ancors. It is also possible to import a trust anchor repository (such as the one maintained by IANA), and configure the ISC DLV registry. Dnsruby contains basic methods to do this, although they are not currently secured. Clients are recommended to develop their own means of obtaining the initial trust anchors. + +It is possible to turn off dnssec validation on a per-message basis. Simply set Message#do_validation to false. + +DNSSEC is on by default - if desired, you can turn it off with the dnssec flag in Dnsruby::(Single)Resolver if desired. EDNS0 support is also enabled by default - if desired, you can turn this off by setting the Dnsruby::(Single)Resolver#udp_packet_size property to be 512. There should generally be no need to do this. + +Dnsruby maintains a cache of responses, and a cache of trusted keys. Once the initial keys have been downloaded, and a set of trusted keys built up, very little overhead is required to enjoy the benefits of DNSSEC. There is, however, some initial cost (to build up the caches). + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/EVENTMACHINE b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/EVENTMACHINE new file mode 100644 index 000000000000..5debbaea2ed0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/EVENTMACHINE @@ -0,0 +1 @@ +Dnsruby no longer supports EventMachine - the inbuilt select loop now works on all platforms. \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/EXAMPLES b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/EXAMPLES new file mode 100644 index 000000000000..ad2b97da5974 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/EXAMPLES @@ -0,0 +1,109 @@ +# This file shows how to do common tasks with Dnsruby : + +require 'rubygems' +require 'dnsruby' +include Dnsruby + +# Use the system configured nameservers to run a query +res = Resolver.new +ret = res.query("example.com") # Defaults to A record +a_recs = ret.answer.rrset("A") + +# Use a defined nameserver to run an asynchronous query +# with no recursion +res = Resolver.new({:nameserver => ["a.iana-servers.net", + "b.iana-servers.net"]}) +queue = Queue.new +m = Message.new("example.com", Types.NS) +m.header.rd = false +res.send_async(m, queue, 1) +# ... do some other stuff ... +id, reply, error = queue.pop +if (error) + print "Error : #{error}\n" +else + # See where the answer came from + print "Got response from : #{reply.answerfrom}, #{reply.answerip}\n" +end + +# Use a Recursor to recursively query authoritative nameservers, +# starting from the root. Note that a cache of authoritative servers +# is built up for use by future queries by any Recursors. +rec = Recursor.new +ret = rec.query("uk-dnssec.nic.uk", "NS") + +# Ask Dnsruby to send the query without using the cache. +m.do_caching = false +ret = res.send_message(m) + +# Ask Dnsruby to send a Message without doing any pre- or post-processing +ret = res.send_plain_message(Message.new("example.com")) + +# Send a TSIG signed dynamic update to a resolver +# and verify the response +res = Dnsruby::Resolver.new("ns0.validation-test-servers.nominet.org.uk") +res.dnssec = false +tsig = Dnsruby::RR.create({ + :name => "rubytsig", + :type => "TSIG", + :ttl => 0, + :klass => "ANY", + :algorithm => "hmac-md5", + :fudge => 300, + :key => "8n6gugn4aJ7MazyNlMccGKH1WxD2B3UvN/O/RA6iBupO2/03u9CTa3Ewz3gBWTSBCH3crY4Kk+tigNdeJBAvrw==", + :error => 0 + }) +update = Dnsruby::Update.new("validation-test-servers.nominet.org.uk") +# ... add stuff to the update +update.absent("notthere.update.validation-test-servers.nominet.org.uk", 'TXT') +tsig.apply(update) +response = res.send_message(update) +print "TSIG response was verified? : #{response.verified?}\n" + +# +# DNSSEC stuff +# + +# Load the ISC DLV key and query some signed zones +dlv_key = RR.create("dlv.isc.org. IN DNSKEY 257 3 5 BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2 brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5 ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt TDN0YUuWrBNh") +Dnssec.add_dlv_key(dlv_key) +res = Recursor.new +ret = res.query("frobbit.se", "NS") +print "Security level for signed zone from DLV : #{ret.security_level}\n" +frobbit_servers = ret.answer.rrset("frobbit.se", Types.NS) + + +# and query for a zone which is not signed +r = Resolver.new +ret = r.query("ed.ac.uk") +print "Security level of unsigned zone : #{ret.security_level}\n" + +res = Resolver.new +frobbit_servers.rrs.each {|s| print "Adding nameserver : #{s.nsdname}\n"; res.add_server(s.nsdname)} + +# and some non-existent domains in signed ones +res.send_async(Message.new("notthere.frobbit.se"), queue, 2) +id, reply, error = queue.pop +print "Error returned from non-existent name in signed zone : #{error}, security level : #{reply.security_level}\n" + +# Clear the keys and caches +Dnsruby::Dnssec.clear_trusted_keys +Dnsruby::Dnssec.clear_trust_anchors +Dnsruby::PacketSender.clear_caches +Dnsruby::Recursor.clear_caches + +# Load a specific trust anchor and query some signed zones +trusted_key = Dnsruby::RR.create({:name => "uk-dnssec.nic.uk.", + :type => Dnsruby::Types.DNSKEY, + :flags => 257, + :protocol => 3, + :algorithm => 5, + :key=> "AQPJO6LjrCHhzSF9PIVV7YoQ8iE31FXvghx+14E+jsv4uWJR9jLrxMYm sFOGAKWhiis832ISbPTYtF8sxbNVEotgf9eePruAFPIg6ZixG4yMO9XG LXmcKTQ/cVudqkU00V7M0cUzsYrhc4gPH/NKfQJBC5dbBkbIXJkksPLv Fe8lReKYqocYP6Bng1eBTtkA+N+6mSXzCwSApbNysFnm6yfQwtKlr75p m+pd0/Um+uBkR4nJQGYNt0mPuw4QVBu1TfF5mQYIFoDYASLiDQpvNRN3 US0U5DEG9mARulKSSw448urHvOBwT9Gx5qF2NE4H9ySjOdftjpj62kjb Lmc8/v+z" + }) +Dnssec.add_trust_anchor(trusted_key) +res = Dnsruby::Resolver.new("dnssec.nominet.org.uk") +r = res.query("aaa.bigzone.uk-dnssec.nic.uk", Dnsruby::Types.DNSKEY) +print "Security level of signed zone under manually install trusted key : #{r.security_level}\n" + +# See if we are using a Recursor for DNSSEC queries +print "Using recursion to validate DNSSEC responses? : #{Dnssec.do_validation_with_recursor?}\n" diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/Gemfile b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/Gemfile new file mode 100644 index 000000000000..fa75df156323 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' + +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/LICENSE b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/LICENSE new file mode 100644 index 000000000000..71b07dc38048 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/LICENSE @@ -0,0 +1,11 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/README.md b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/README.md new file mode 100644 index 000000000000..dadba2d11aa5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/README.md @@ -0,0 +1,96 @@ +[![Build Status](https://travis-ci.org/alexdalitz/dnsruby.svg?branch=master)](https://travis-ci.org/alexdalitz/dnsruby) +[![Coverage Status](https://img.shields.io/coveralls/alexdalitz/dnsruby.svg)](https://coveralls.io/r/alexdalitz/dnsruby?branch=master) + +<img src="http://caerkettontech.com/dnsruby/DNSRuby-colour-mid.png" width="200" height="200" /> + +Dnsruby +======= + +Dnsruby is a pure Ruby DNS client library which implements a +stub resolver. It aims to comply with all DNS RFCs. + +Dnsruby presents an enhanced API for DNS. It is based on Ruby's core +resolv.rb Resolv API, but has been much extended to provide a +complete DNS implementation. + +Dnsruby runs a single I/O thread to handle all concurrent +queries. It is therefore suitable for high volume DNS applications. + +The following is a (non-exhaustive) list of features : + +- Implemented RRs : A, AAAA, AFSDB, ANY, CAA, CERT, CNAME, DNAME, + GPOS, HINFO, ISDN, LOC, MB, MG, MINFO, MR, MX, NAPTR, NS, NSAP, + NXT, OPT, PTR, PX, RP, RT, SOA, SPF, SRV, TKEY, TSIG, TXT, + WKS, X25, DNSKEY, RRSIG, NSEC, NSEC3, NSEC3PARAM, DS, DLV + +- Generic RR types supported (RFC3597) + +- (Signed) Zone transfer (AXFR and IXFR) supported + +- (Signed) Dynamic updates supported + +- DNSSEC validation supported + +Dependencies +------------ + +Dnsruby can run with no dependencies. However, if you wish to +use TSIG or DNSSEC then the OpenSSL library must be available. +This is a part of the Ruby standard library, but appears not to +be present on all Ruby platforms. If it is not available, then +the test code will not run the tests which require it. Code which +attempts to use the library (if it is not present) will raise an +exception. + +Demo Code +--------- + +The demo folder contains some example programs using Dnsruby. +These examples include a basic dig tool (rubydig) and a tool to +concurrently resolve many names, amongst others. + +Unit Tests +---------- + +Tests require a current version of minitest (see the .gemspec file +for which version is required). In order for the tests to run +successfully you may need to have the bundler gem installed and +run `bundle` or `bundle install` from the project root to install +a suitable version of minitest. + +There are "online" and "offline" tests. You can use rake to +conveniently run the tests. From the project root you can run: +``` +rake test # run all tests +rake test_offline # run only offline tests +rake test_online # run only online tests +``` +If you get the following error when running rake test tasks, +then you may need to preface the command with bundle exec to +ensure that the gem versions specified in Gemfile.lock are used +at runtime: + +``` +bundle exec rake test +``` + +Usage Help +---------- + +There are a couple of blog articles that might be helpful +in understanding how to use Dnsruby. These used to be hosted by +Nominet UK, however the original content has been copied to the +dnsruby github wiki at : + +https://github.com/alexdalitz/dnsruby/wiki + +Contact/Links +------- + +| Link Type | Link/Text | +|-----|----- +| Author Email | alex@caerkettontech.com | +| Github | https://github.com/alexdalitz/dnsruby | +| Google Group | https://groups.google.com/forum/#!forum/dnsruby | +| Rubygems | http://rubygems.org/gems/dnsruby/ | +| Documentation | https://www.rubydoc.info/gems/dnsruby/ | diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/RELEASE_NOTES.md b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/RELEASE_NOTES.md new file mode 100644 index 000000000000..ae8baf227e6e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/RELEASE_NOTES.md @@ -0,0 +1,219 @@ +# Release Notes + +## v1.61.5 + +* CAA record fixes - add contactphone and contactemail +* Fix eprecation warnings + +## v1.61.4 + +* Dnsruby::Name : document .punycode +* gemspec enhancement +* add yard build file +* fix create name include url special characters +* Fix uninitialized constant error when using via Rails +* Implement ECDSAP256SHA256 (13) / ECDSAP384SHA384 (14) algorithms for DNSKEY +* Reinitialize all IANA TAR keys with Dnssec.reset + +## v1.61.3 + +* TCP timeout and port changes + +## v1.61.2 + +* Add new root key + +## v1.61.1 + +* Add Addressable as a gem runtime dependency + +## v1.61.0 + +* Add URI, CDS and CDNSKEY records +* Supply port to DNS.new as optiona parameter +* Supply timeout to zone transfer connect +* Fix multi-line strings +* Try absolute name as candidate in DNS even if not dot supplied +* Do not try to generate candidates if no domain is given +* Handle new OpenSSL interface as well as old +* Handle new DSA interface +* fix encode error select thread issue +* handle encoding errors +* add punycode support +* Make sure dnssec is enabled in verifier and also in digroot demo +* Other minor fixes and changes to test code and infrastructure + +## v1.60.2 + +* Fix deletion of TXT records with spaces in dynamic updates (thanks Sean Dilda) +* Fix use of non-default ports in Dnsruby::Resolver (thanks Thomas Morgan) +* Fix NAPTR encoding for null rdata dynamic update packets +* Fix CAA resource record encoding +* Avoid changing ruby global thread abort behavior (thanks Brent Cook) + +## v1.60.1 + +* DNSSEC validation switched OFF by default (but can still be switched on) +* Add APL RR support (thanks Manabu Sonoda) +* Various test fixes (thanks Keith Bennett) +* 'include' issues fixed (thanks Keith Bennett!) +* Fixnum replacement (thanks Keith Bennett) +* Zone transfer fixes (thanks Manabu Sonoda) +* Name decoding fix +* MX record passing error now raised +* CAA RR support (thanks Richard Luther) +* TLSA RR support (thanks Manabu Sonoda) + + +## v1.60.0 + +* TCP multi-packet support fixed +* Response 'Message' now included with exception. +* Docs added +* CNAME dynamic update fix + +## v1.59.3 + +* Output TXT record multiple strings correctly +* NONE class encoding fix +* only add name labels if there are any + +## v1.59.2 + +* Timeout error fix + +## v1.59.1 + +* Support for HMAC SHA512 TSIG keys +* Fix TCP pipelining tests +* IDN encoding error returned as Dnsruby::OtherResolvError + +## v1.59.0 + +* Add LICENSE file +* Add Cache max_size (gihub issue 64) +* Disable caching for SOA lookups in demo check_soa.rb +* Fix for invalid nameserver in config +* Fix encoding for OPT data (thanks Craig Despeaux) +* Various test system fixes +* OPT fixes +* DNSSEC verification failure handling wrt lack of DS chain +* DNSSEC validation policy name constants +* Fix for BOGUS DLV chains +* demo upgrades +* Resolver hints improvements + + +## v1.58.0 + +* Add TCP pipelining (reusing a single TCP connection for multiple requests). +* Enhance zone reading, including reading data from a string. +* Add add_answer! method for adding duplicate answers, as needed for an AXFR response. +* Add support for GPOS and NXT resource records. +* Test cleanup, including removal of use of Nominet servers, soak_test cleanup. +* Refactorings: MessageDecoder, Resolv, Resolver (part). +* Fix zone reader adding unwanted dot to relative hostnames being converted to absolute. +* Fix default access for tsig options in Resolver. +* Fix ZoneTransfer not to use deprecated SingleResolver. +* Fix Resolver bug in parameter to create_tsig_options. +* Fix tests to always use working copy and not gem. + + +## v1.57.0 + +* Add query_raw method as alias for send_plain_message, with option to raise or return error. +* Fixed a bug in RR hash calculation where TTL should have been ignored but wasn't. +* Add support for (obsolete) GPOS resource record type. +* Tweak Travis CI configuration. +* Fix zone reader for case where a line contains whitespace preceding a comment. +* Add post install message. +* Improve README. +* Moved content of NEWS to RELEASE_NOTES.md. +* Use git ls-files now to determine files for inclusion in gem. + + +## v1.56.0 + +* Drop support for Ruby 1.8, using lambda -> and hash 'key: value' notations. +* First release since the move from Rubyforge to Github (https://github.com/alexdalitz/dnsruby). +* Add EDNS client subnet support. +* Relocate CodeMapper subclasses, Resolv, RR, and RRSet classes. +* Add Travis CI and coveralls integration. +* Improve Google IPV6 support. +* Convert some file names to snake case. +* Remove trailing whitespace from lines, and ensure that comments have space between '#' and text. +* Restore test success when running under JRuby. +* Disabled attempt to connect to Nominet servers, which are no longer available. +* Convert from test/unit to minitest/autorun to support Ruby 2.1+. +* Remove setup.rb. +* Other minor refactoring and improvements to production code, test code, and documentation. + + +## v1.53 + +* Validation routine fixes +* Ruby 1.9 fixes +* Recursor fixes +* IPv4 Regex fixes +* Fixes for A/PTR lookups with IP-like domain name +* TXT and SSHFP processing fixes +* Default retry parameters in Resolver more sensible + + +## v1.48 + +* Fixed deadlock/performance issue seen on some platforms +* DNSSEC validation now disabled by default +* Signed root DS record can be added to validator +* ITAR support removed +* multi-line DS/RRSIG reading bug fixed (thanks Marco Davids!) +* DS algorithms of more than one digit can now be read from string +* LOC records now parsed correctly +* HINFO records now parsed correctly + + +## v1.42 + +* Complicated TXT and NAPTR records now handled correctly +* ZoneReader now handles odd escape characters correctly +* Warns when immediate timeout occurs because no nameservers are configured +* Easy hmac-sha1/256 options to Resolver#tsig= +* ZoneReader fixed for "IN CNAME @" notations +* ZoneReader supports wildcards +* Dnsruby.version method added - currently returns 1.42 + + +## v1.41 + +* RFC3597 unknown classes (e.g. CLASS32) now handled correctly + in RRSIGs +* Resolver#do_caching flag added for Resolver-level caching +* DNSKEY#key_tag now cached - only recalculated when key data + changes +* Bugfix where Resolver would not time queries out if no + nameservers were configured +* Recursor now performs A and AAAA queries in parallel +* Fix for zero length salt +* Fixing priming for signed root +* Fixes for DLV verification +* Other minor fixes + + +## v1.40 + +* Zone file reading support added (Dnsruby::ZoneReader) +* Name and Label speed-ups +* CodeMapper speed-ups +* DHCID RR added +* LOC presentation format parsing fixed +* KX RR added +* Quotations now allowed in text representation for ISDN, X25 and HINFO +* AFSDB from_string fixes +* Fixing CERT types and from_string +* CERT now allows algorithm 0 +* Fix for DS record comparison +* HIP RR added +* Minor bug fixes +* IPSECKEY RR added +* Clients can now manipulate Name::Labels + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/Rakefile b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/Rakefile new file mode 100644 index 000000000000..45827694cf8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/Rakefile @@ -0,0 +1,35 @@ +require 'rake/testtask' + +ENV['RUN_EXTRA_TASK'] = 'TRUE' if + RUBY_VERSION >= "1.9.3" && defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby' + +if ENV['RUN_EXTRA_TASK'] == 'TRUE' + require 'rdoc/task' + + Rake::RDocTask.new do |rd| + rd.rdoc_files.include("lib/**/*.rb") + rd.rdoc_files.exclude("lib/Dnsruby/iana_ports.rb") + rd.main = "Dnsruby" + # rd.options << "--ri" + end + + require 'coveralls/rake/task' + Coveralls::RakeTask.new +end + +def create_task(task_name, test_suite_filespec) + Rake::TestTask.new do |t| + t.name = task_name + t.test_files = FileList[test_suite_filespec] + t.verbose = true + t.warning = false + end +end + +create_task(:test, 'test/ts_dnsruby.rb') +create_task(:test_offline, 'test/ts_offline.rb') +create_task(:test_online, 'test/ts_online.rb') +create_task(:soak, 'test/tc_soak.rb') +create_task(:message, 'test/tc_message.rb') +create_task(:cache, 'test/tc_cache.rb') +create_task(:pipe, 'test/tc_tcp_pipelining.rb') diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/SIGNED_UPDATES b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/SIGNED_UPDATES new file mode 100644 index 000000000000..aca0344ae6e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/SIGNED_UPDATES @@ -0,0 +1,22 @@ +Signed updates with Dnsruby +=========================== + +In order to use TSIG records to automatically perform TSIG signing/verification of messages : + + res = Dnsruby::Resolver.new("ns0.validation-test-servers.nominet.org.uk") + + # Now configure the resolver with the TSIG key for signing/verifying + KEY_NAME="rubytsig" + KEY = "8n6gugn4aJ7MazyNlMccGKH1WxD2B3UvN/O/RA6iBupO2/03u9CTa3Ewz3gBWTSBCH3crY4Kk+tigNdeJBAvrw==" + res.tsig=KEY_NAME, KEY + + + # Now try sending/receiving some update messages + update = Dnsruby::Update.new("validation-test-servers.nominet.org.uk") + update_name = generate_update_name + update.absent(update_name) + update.add(update_name, 'TXT', 100, "test signed update") + + # Resolver will automatically sign message and verify response + response = res.send_message(update) + assert(response.verified?) # Check that the response has been verified \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/axfr.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/axfr.rb new file mode 100644 index 000000000000..6d061443c630 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/axfr.rb @@ -0,0 +1,197 @@ +#! /usr/bin/env ruby + +# -- +# Copyright 2007 Nominet UK +# + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +# = NAME +# +# axfr - Perform a DNS zone transfer +# +# = SYNOPSIS +# +# axfr [ -fqs ] [ -D directory ] [ @nameserver ] zone +# +# = DESCRIPTION +# +# axfr performs a DNS zone transfer, prints each record to the standard +# output, and stores the zone to a file. If the zone has already been +# stored in a file, axfr will read the file instead of performing a +# zone transfer. +# +# Zones will be stored in a directory hierarchy. For example, the +# zone transfer for foo.bar.com will be stored in the file +# HOME/.dns-zones/com/bar/foo/axfr. The directory can be changed +# with the B<-D> option. +# +# This programs requires that the Storable module be installed. +# +# = OPTIONS +# +# * -f Force a zone transfer, even if the zone has already been stored +# in a file. +# +# * -q Be quiet -- don't print the records from the zone. +# +# * -s Perform a zone transfer if the SOA serial number on the nameserver +# is different than the serial number in the zone file. +# +# * -D directory Store zone files under I<directory> instead of the default directory (see "FILES") +# +# * nameserver Query nameserver instead of the default nameserver. +# +# = FILES +# +# * ${HOME}/.dns-zones Default directory for storing zone files. +# +# = AUTHOR +# +# Michael Fuhr <mike@fuhr.org> +# + +unless (1..2).include?(ARGV.length) + puts "Usage: #{$0} [ -fqs ] [ -D directory ] [ @nameserver ] zone" + exit(-1) +end + + +require 'getoptLong' +require 'dnsruby' + + +# ------------------------------------------------------------------------------ +# Read any command-line options and check syntax. +# ------------------------------------------------------------------------------ + +# getopts("fqsD:"); +opts = GetoptLong.new(["-f", GetoptLong::NO_ARGUMENT], + ["-q", GetoptLong::NO_ARGUMENT], + ["-D", GetoptLong::REQUIRED_ARGUMENT], + ["-s", GetoptLong::NO_ARGUMENT]) + +opt_q = false +opt_f = false +opt_s = false +opt_d = nil +opts.each do |opt, arg| + case opt + when '-q' + opt_q=true + when '-f' + opt_f = true + when '-s' + opt_s = true + when '-D' + opt_d = arg + end +end + +# ------------------------------------------------------------------------------ +# Get the nameserver (if specified) and set up the zone transfer directory +# hierarchy. +# ------------------------------------------------------------------------------ + +nameserver = (ARGV[0] =~ /^@/) ? ARGV.shift : '' +nameserver = nameserver.sub(/^@/, '') +resolver = nameserver ? Dnsruby::Resolver.new(nameserver) : Dnsruby::Resolver.new + +zone = ARGV.shift +basedir = opt_d || File.join((ENV['HOME'] || ''), '.dns-zones') +zonedir = zone.split(/\./).reverse.join("/") +zonefile = File.join(basedir, zonedir, 'axfr') + +# Don't worry about the 0777 permissions here - the current umask setting +# will be applied. +# NOTE: mkdir will raise an error on failure so I don't think 'or' works here. +unless FileTest.directory?(basedir) + Dir.mkdir(basedir, 0777) or raise RuntimeError, "can't mkdir #{basedir}: #{$!}\n" +end + +dir = basedir +# NOTE: What are we doing here? Could this be replaced by mkdir_p? +zonedir.split('/').each do |subdir| + dir += '/' + subdir + unless FileTest.directory?(dir) + Dir.mkdir(dir, 0777) or raise RuntimeError, "can't mkdir #{dir}: #{$!}\n" + end +end + +# ------------------------------------------------------------------------------ +# Get the zone. +# ------------------------------------------------------------------------------ + +if FileTest.exist?(zonefile) && !opt_f + zoneref = Marshal.load(File.open(zonefile)) + if zoneref.nil? + raise RuntimeError, "couldn't retrieve zone from #{zonefile}: #{$!}\n" + end + + # ---------------------------------------------------------------------- + # Check the SOA serial number if desired. + # ---------------------------------------------------------------------- + + if opt_s + serial_file = serial_zone = nil + + zoneref.each do |rr| + if (rr.type == 'SOA') + serial_file = rr.serial + break + end + end + if serial_file.nil? + raise RuntimeError, "no SOA in #{zonefile}\n" + end + + soa = resolver.query(zone, 'SOA') + if soa.nil? + raise RuntimeError, "couldn't get SOA for #{zone}: " + resolver.errorstring + "\n" + end + + soa.answer.each do |rr| + if rr.type == 'SOA' + serial_zone = rr.serial + break + end + end + + if serial_zone != serial_file + opt_f = true + end + end +else + opt_f = true +end + +if opt_f + print "nameserver = #{nameserver}, zone=#{zone}" + zt = Dnsruby::ZoneTransfer.new + zt.server = nameserver if nameserver != '' + + zoneref = zt.transfer(zone) + if zoneref.nil? + raise RuntimeError, "couldn't transfer zone\n" + end + Marshal.dump(zoneref, File.open(zonefile, File::CREAT | File::RDWR)) +end + +# ------------------------------------------------------------------------------ +# Print the records in the zone. +# ------------------------------------------------------------------------------ + +unless opt_q + zoneref.each { |z| puts z } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/check_soa.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/check_soa.rb new file mode 100644 index 000000000000..7c13b08e267b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/check_soa.rb @@ -0,0 +1,179 @@ +#! /usr/bin/env ruby + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + + +# = NAME +# +# check_soa - Check a domain's nameservers +# +# = SYNOPSIS +# +# check_soa domain +# +# = DESCRIPTION +# +# check_soa queries each of a domain's nameservers for the Start +# of Authority (SOA) record and prints the serial number. Errors +# are printed for nameservers that couldn't be reached or didn't +# answer authoritatively. +# +# = AUTHOR +# +# The original Bourne Shell and C versions were printed in +# "DNS and BIND" by Paul Albitz & Cricket Liu. +# +# The Perl version was written by Michael Fuhr <mike@fuhr.org>. +# +# = SEE ALSO +# +# axfr, check_zone, mresolv, mx, perldig, Net::DNS + +require 'dnsruby' + +NO_DOMAIN_SPECIFIED = -1 +NO_NAMESERVERS = -2 + + +def fatal_error(message, exit_code) + puts message + exit(exit_code) +end + + +def usage + fatal_error("Usage: #{$0} domain", NO_DOMAIN_SPECIFIED) +end + + +def create_resolver + resolver = Dnsruby::Resolver.new + resolver.retry_times = 2 + resolver.recurse = 0 # Send out non-recursive queries + # disable caching otherwise SOA is cached from first nameserver queried + resolver.do_caching = false + resolver +end + + +def get_ns_response(resolver, domain) + ns_response = resolver.query(domain, 'NS') + if ns_response.header.ancount == 0 + fatal_error("No nameservers found for #{domain}.", NO_NAMESERVERS) + end + ns_response +end + + +# Finds all the nameserver domains for the domain. +def get_ns_domains(resolver, domain) + ns_response = get_ns_response(resolver, domain) + ns_answers = ns_response.answer.select { |r| r.type == 'NS'} + ns_answers.map(&:domainname) +end + + +def process_ns_domain(resolver, domain, ns_domain) + + a_response = begin + # In order to lookup the IP(s) of the nameserver, we need a Resolver + # object that is set to our local, recursive nameserver. So we create + # a new object just to do that. + local_resolver = Dnsruby::Resolver.new + + local_resolver.query(ns_domain, 'A') + rescue Exception => e + puts "Cannot find address for #{ns_domain}: #{e}" + return + end + + a_answers = a_response.answer.select {|r| r.type == 'A'} + a_answers.each do |a_answer| + + # ---------------------------------------------------------------------- + # Ask this IP. + # ---------------------------------------------------------------------- + ip_address = a_answer.address + resolver.nameserver = ip_address.to_s + print "#{ns_domain} (#{ip_address}): " + + # ---------------------------------------------------------------------- + # Get the SOA record. + # ---------------------------------------------------------------------- + soa_response = begin + resolver.query(domain, 'SOA', 'IN') + rescue Exception => e + puts "Error : #{e}" + return + end + + # ---------------------------------------------------------------------- + # Is this nameserver authoritative for the domain? + # ---------------------------------------------------------------------- + + unless soa_response.header.aa + print "isn't authoritative for #{domain}\n" + return + end + + # ---------------------------------------------------------------------- + # We should have received exactly one answer. + # ---------------------------------------------------------------------- + + unless soa_response.header.ancount == 1 + puts "expected 1 answer, got #{soa_response.header.ancount}." + return + end + + # ---------------------------------------------------------------------- + # Did we receive an SOA record? + # ---------------------------------------------------------------------- + + answer_type = soa_response.answer[0].type + unless answer_type == 'SOA' + puts "expected SOA, got #{answer_type}" + return + end + + # ---------------------------------------------------------------------- + # Print the serial number. + # ---------------------------------------------------------------------- + + puts "has serial number #{soa_response.answer[0].serial}" + end +end + + +def main + + # Get domain from command line, printing usage and exiting if none provided: + domain = ARGV.fetch(0) { usage } + + resolver = create_resolver + + ns_domains = get_ns_domains(resolver, domain) + + # ------------------------------------------------------------------------------ + # Check the SOA record on each nameserver. + # ------------------------------------------------------------------------------ + ns_domains.each do |ns_domain_name| + process_ns_domain(resolver, domain, ns_domain_name) + end +end + + +main diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/check_zone.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/check_zone.rb new file mode 100644 index 000000000000..769c35f110b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/check_zone.rb @@ -0,0 +1,178 @@ +#! /usr/bin/env ruby + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +# = NAME +# +# check_zone - Check a DNS zone for errors +# +# = SYNOPSIS +# +# check_zone [ -r ] <domain> +# +# = DESCRIPTION +# +# Checks a DNS zone for errors. Current checks are: +# +# * Checks that all A records have corresponding PTR records. +# + +# * Checks that hosts listed in NS, MX, and CNAME records have +# A records. +# +# = OPTIONS +# +# * -r Perform a recursive check on subdomains. +# +# = AUTHOR +# +# Michael Fuhr <mike@fuhr.org> +# (Ruby version AlexD, Nominet UK) +# + + +def fatal_error(message) + puts message + exit(-1) +end + +unless (1..2).include?(ARGV.length) + fatal_error("Usage: #{$0} domain [ class ]") +end + + +require 'dnsruby' +require 'getoptLong' + + +def check_domain(args) + domain = args[0] + klass = args[1] || 'IN' + puts "----------------------------------------------------------------------" + puts "#{domain} (class #{klass}\n" + puts "----------------------------------------------------------------------" + + resolver = Dnsruby::Resolver.new + resolver.retry_times = 2 + nspack = begin + resolver.query(domain, 'NS', klass) + rescue Exception => e + print "Couldn't find nameservers for #{domain}: #{e}\n" + return + end + + print "nameservers (will request zone from first available):\n" + ns_answers = nspack.answer.select {|r| r.type == 'NS' } + ns_domain_names = ns_answers.map(&:domainname) + ns_domain_names.each { |name| puts "\t#{name}" } + puts '' + + resolver.nameserver = ns_domain_names + + zt = Dnsruby::ZoneTransfer.new + zt.server = ns_domain_names + + zone = zt.transfer(domain) # , klass) + unless zone + fatal_error("Zone transfer failed: #{resolver.errorstring}") + end + + puts "checking PTR records" + check_ptr(domain, klass, zone) + + puts "\nchecking NS records" + check_ns(domain, klass, zone) + + puts "\nchecking MX records" + check_mx(domain, klass, zone) + + puts "\nchecking CNAME records" + check_cname(domain, klass, zone) + print "\n" + + if @recurse + puts 'checking subdomains' + subdomains = Hash.new + # foreach (grep { $_->type eq 'NS' and $_->name ne $domain } @zone) { + zone.select { |i| i.type == 'NS' && i.name != domain }.each do |z| + subdomains[z.name] = 1 + end + # foreach (sort keys %subdomains) { + subdomains.keys.sort.each do |k| + check_domain([k, klass]) + end + end +end + +def check_ptr(domain, klass, zone) + resolver = Dnsruby::Resolver.new + # foreach $rr (grep { $_->type eq 'A' } @zone) { + zone.select { |z| z.type == 'A' }.each do |rr| + host = rr.name + addr = rr.address + ans = nil + begin + ans = resolver.query(addr.to_s, 'A') #, klass) + puts "\t#{host} (#{addr}) has no PTR record" if ans.header.ancount < 1 + rescue Dnsruby::NXDomain + puts "\t#{host} (#{addr}) returns NXDomain" + end + end +end + +def check_ns(domain, klass, zone) + resolver = Dnsruby::Resolver.new + # foreach $rr (grep { $_->type eq "NS" } @zone) { + zone.select { |z| z.type == 'NS' }.each do |rr| + ans = resolver.query(rr.nsdname, 'A', klass) + puts "\t", rr.nsdname, ' has no A record' if (ans.header.ancount < 1) + end +end + +def check_mx(domain, klass, zone) + resolver = Dnsruby::Resolver.new + # foreach $rr (grep { $_->type eq "MX" } @zone) { + zone.select { |z| z.type == 'MX' }.each do |rr| + ans = resolver.query(rr.exchange, 'A', klass) + print "\t", rr.exchange, " has no A record\n" if (ans.header.ancount < 1) + end +end + +def check_cname(domain, klass, zone) + resolver = Dnsruby::Resolver.new + # foreach $rr (grep { $_->type eq "CNAME" } @zone) + zone.select { |z| z.type == 'CNAME' }.each do |rr| + ans = resolver.query(rr.cname, 'A', klass) + print "\t", rr.cname, " has no A record\n" if (ans.header.ancount < 1) + end +end + +def main + opts = GetoptLong.new(['-r', GetoptLong::NO_ARGUMENT]) + @recurse = false + opts.each do |opt, arg| + case opt + when '-r' + @recurse = true + end + end + + check_domain(ARGV) +end + + +main diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/digdlv.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/digdlv.rb new file mode 100644 index 000000000000..b7ff77c8d847 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/digdlv.rb @@ -0,0 +1,83 @@ +#! /usr/bin/env ruby +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +# = NAME +# +# digdlv - Ruby script to perform DNS queries, validated against the ISC DLV +# registry. +# +# = SYNOPSIS +# +# digdlv name [ type [ class ] ] +# +# = DESCRIPTION +# +# Performs a DNS query on the given name. The record type +# and class can also be specified; if left blank they default +# to A and IN. +# The program firstly loads the DLV zone signing key. Then, the +# requested DNS query is performed recursively. The response is then validated +# - the DLV registry is searched for the keys of the closest ancestor +# of the query name, and the chain of trust is followed to prove +# that the DNSSEC records are correct, or that we do not expect the +# response to be signed. +# +# = AUTHOR +# +# Michael Fuhr <mike@fuhr.org> +# Alex D <alexd@nominet.org.uk> + +require 'dnsruby' + +def fatal_error(message) + puts message + exit -1 +end + +unless (1..3).include?(ARGV.length) + fatal_error("Usage: #{$0} name [ type [ class ] ]") +end + +resolver = Dnsruby::Recursor.new +zone_transfer = Dnsruby::ZoneTransfer.new + +dlv_key = Dnsruby::RR.create("dlv.isc.org. IN DNSKEY 257 3 5 BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2 brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5 ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt TDN0YUuWrBNh") +Dnsruby::Dnssec.add_dlv_key(dlv_key) + + +name, type, klass = ARGV +type ||= 'A' +klass ||= 'IN' + +if type.upcase == 'AXFR' + rrs = zone_transfer.transfer(name) # , klass) + + if rrs + rrs.each { |rr| puts rr } + else + fatal_error("Zone transfer failed: #{resolver.errorstring}.") + end + +else + + begin + answer = resolver.query(name, type, klass) + puts answer + rescue Exception => e + fatal_error("query failed: #{e}") + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/digroot.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/digroot.rb new file mode 100644 index 000000000000..41cd814d6c77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/digroot.rb @@ -0,0 +1,69 @@ +#! /usr/bin/env ruby + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +# = NAME +# +# digitar - Ruby script to perform DNS queries, validated against the IANA TAR +# (trust anchor repository). +# +# = SYNOPSIS +# +# digroot name [ type [ class ] ] +# +# = DESCRIPTION +# +# Performs a DNS query on the given name. The record type +# and class can also be specified; if left blank they default +# to A and IN. The program firstly performs the requested DNS +# query. The response is then validated from the signed root. +# +# = AUTHOR +# +# Michael Fuhr <mike@fuhr.org> +# Alex D <alexd@nominet.org.uk> + +require 'dnsruby' + +def fatal_error(message) + puts message + exit -1 +end + +unless (1..3).include?(ARGV.length) + fatal_error("Usage: #{$0} name [ type [ class ] ]") +end + + +inner_resolver = Dnsruby::Resolver.new +inner_resolver.do_validation = true +inner_resolver.dnssec = true +resolver = Dnsruby::Recursor.new(inner_resolver) +resolver.dnssec = true + +# Dnsruby::TheLog.level=Logger::DEBUG + +name, type, klass = ARGV +type ||= 'A' +klass ||= 'IN' + +begin + answer = resolver.query(name, type, klass) + print answer +rescue Exception => e + fatal_error("query failed: #{e}") +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/example_recurse.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/example_recurse.rb new file mode 100644 index 000000000000..8705931d8c56 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/example_recurse.rb @@ -0,0 +1,43 @@ +#! /usr/bin/env ruby + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +# Example usage for Net::DNS::Resolver::Recurse +# Performs recursion for a query. + +require 'dnsruby' + +unless (1..3).include?(ARGV.length) + puts "Usage: #{$0} domain [type [ class ]]" + exit(-1) +end + + +resolver = Dnsruby::Recursor.new +resolver.hints = '198.41.0.4' # A.ROOT-SERVER.NET. + + +Dnsruby::TheLog.level = Logger::DEBUG + + +name, type, klass = ARGV +type ||= 'A' +klass ||= 'IN' + + +packet = resolver.query(name, type, klass) +puts packet diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/mresolv.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/mresolv.rb new file mode 100644 index 000000000000..d11f4844201e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/mresolv.rb @@ -0,0 +1,96 @@ +#! /usr/bin/env ruby + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + + +# mresolv [ -d ] [ -n number ] [ -t timeout ] [ filename... ] +# +# mresolv performs multiple DNS lookups in parallel. Names to query +# are read from the list of files given on the command line, or from the +# standard input. +# +# = OPTIONS +# +# *-d : Turn on debugging output. +# +# *-n number : Set the number of queries to have in progress at any time. +# +# *-t timeout : Set the query timeout for each name in seconds. + +# Examples for running: +# +# echo my-domain.com | ./mresolv.rb +# or +# ./mresolv.rb # then type domain name(s) separated by new lines and then ctrl-D + +require 'dnsruby' +require 'getoptLong' + +opts = GetoptLong.new( + ['-d', GetoptLong::NO_ARGUMENT], + ['-n', GetoptLong::REQUIRED_ARGUMENT], + ['-t', GetoptLong::REQUIRED_ARGUMENT]) + +max_outstanding = 32 # number of requests to have outstanding at any time +timeout = 15 # timeout (seconds) +debug = false +opts.each do |opt, arg| + case opt + when '-d' + Dnsruby.log.level = Logger::INFO + debug = true + when '-n' + max_outstanding = arg.to_i + when '-t' + timeout = arg + end +end + +resolver = Dnsruby::Resolver.new +resolver.query_timeout = timeout + +# We want to have a rolling window of max_outstanding queries. +in_progress = 0 + +q = Queue.new +eof = false + +until eof + # Have the thread loop round, send queries until max_num are outstanding. + while !eof && in_progress < max_outstanding + print('DEBUG: reading...') if debug + unless (name = gets) + print("EOF.\n") if debug + eof = true + break + end + name.chomp! + resolver.send_async(Dnsruby::Message.new(name), q, name) + in_progress += 1 + print("name = #{name}, outstanding = #{in_progress}\n") if debug + end + # Keep receiving while the query pool is full, or the list has been queried + while in_progress >= max_outstanding || (eof && in_progress > 0) + id, result, error = q.pop + in_progress -= 1 + if error + print("#{id}:\t#{error}\n") + else + print("#{result.answer.join("\n")}\n") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/mx.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/mx.rb new file mode 100644 index 000000000000..251e048f6865 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/mx.rb @@ -0,0 +1,59 @@ +#! /usr/bin/env ruby + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require 'dnsruby' + +# = NAME +# +# mx - Print a domain's MX records +# +# = SYNOPSIS +# +# mx domain +# +# = DESCRIPTION +# +# mx prints a domain's MX records, sorted by preference. +# +# = AUTHOR +# +# Michael Fuhr <mike@fuhr.org> +# (Ruby port AlexD, Nominet UK) +# + +def fatal_error(message) + puts message + exit -1 +end + + +unless ARGV.length == 1 + fatal_error("Usage: #{$0} name") +end + + +domain = ARGV[0] +resolver = Dnsruby::DNS.new + +begin + resolver.each_resource(domain, 'MX') do |rr| + print rr.preference, "\t", rr.exchange, "\n" + end +rescue Exception => e + fatal_error("Can't find MX hosts for #{domain}: #{e}") +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/rubydig.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/rubydig.rb new file mode 100644 index 000000000000..1b51eefc1cd4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/rubydig.rb @@ -0,0 +1,91 @@ +#! /usr/bin/env ruby + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +# = NAME +# +# rubydig - Ruby script to perform DNS queries +# +# = SYNOPSIS +# +# rubydig [ @nameserver ] name [ type [ class ] ] +# +# = DESCRIPTION +# +# Performs a DNS query on the given name. The record type +# and class can also be specified; if left blank they default +# to A and IN. +# +# = AUTHOR +# +# Michael Fuhr <mike@fuhr.org> +# + +def fatal_error(message) + puts message + exit(-1) +end + + +unless (1..3).include?(ARGV.length) + fatal_error("Usage: #{$0} [ @nameserver ] name [ type [ class ] ]") +end + + +require 'dnsruby' + + +resolver = Dnsruby::Resolver.new +Dnsruby::TheLog.level = Logger::DEBUG +zone_transfer = Dnsruby::ZoneTransfer.new + + +if ARGV[0] =~ /^@/ + nameserver = ARGV.shift + if nameserver == '@auth' + resolver = Dnsruby::Recursor.new + else + puts "Setting nameserver : #{nameserver}" + resolver.nameserver = (nameserver.sub(/^@/, '')) + puts "nameservers = #{resolver.config.nameserver}" + zone_transfer.server = (nameserver.sub(/^@/, '')) + end +end + +name, type, klass = ARGV +type ||= 'A' +klass ||= 'IN' + +if type.upcase == 'AXFR' + rrs = zone_transfer.transfer(name) # , klass) + + if rrs + rrs.each { |rr| puts rr } + else + fatal_error("Zone transfer failed: #{resolver.errorstring}") + end + +else + +# Dnsruby::TheLog.level=Logger::DEBUG + begin + answer = resolver.query(name, type, klass) + puts answer + rescue Exception => e + fatal_error("Query failed: #{e}") + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/to_resolve.txt b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/to_resolve.txt new file mode 100644 index 000000000000..f86b43117c87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/to_resolve.txt @@ -0,0 +1,3088 @@ +ddcsweden.se +ddd-direkt.se +eat.se +eat-house.se +msn.se +msn-kontakt.se +ccc.se +ccc-bild.se +rrr.se +rrrab.se +ibm.se +ibma.se +443366.se +4444.se +jah.se +jaha.se +l9.se +la-bella.se +the.se +the-archer.se +eng.se +eng-el.se +dot.se +dot-ab.se +uuu.se +uv.se +bat.se +bat-att-hyra.se +jjj.se +jjk.se +ying.se +yings.se +jahaa.se +the-art-of-planning.se +hypermind.se +hypermotion.se +jerenvik.se +jerfs.se +bayramband.se +bayrol.se +yingying.se +echotech.se +echset.se +jahadesign.se +bohdesign.se +bohed.se +uplife.se +uplight.se +0591.se +05kakelochklinker.se +yeast2003.se +yebo.se +0y.se +0z.se +bohedberg.se +effu.se +effusio.se +battidningar.se +battillbehor.se +yeezgaming.se +yeguadafavorito.se +jerfsten.se +beme.se +bemek.se +bat-consulting.se +eci.se +broome.se +broomtowncats.se +05nvd.se +1-0.se +jewel.se +jeweliamovie.se +effy.se +xylocain.se +xylon.se +bememusik.se +broomwade.se +05studios.se +upline.se +0-0.se +1-0-0.se +bemi.se +bourn.se +bourneultimatum.se +bemba.se +bemc.se +effyh.se +0-0-0.se +xylophane.se +booksellers.se +bookship.se +blastmanager.se +blastolac.se +brionvega.se +briotoys.se +benie.se +benilla.se +yesstyle.se +yesterday.se +bemce.se +0-0-1.se +yeguadakarisma.se +benedictine.se +benedictum.se +bookshop.se +0-1.se +benema.se +bener.se +blastolen.se +elevenconsulting.se +elevengroup.se +yelia.se +yell.se +benima.se +bemcon.se +bemus.se +bemyguest.se +benerotts.se +bemo-tunnel.se +bemora.se +bemda.se +emmen.se +emmens.se +bengtzon.se +bengy.se +benevolence.se +benexa.se +benhogan.se +yelles.se +bemi-service.se +0-360.se +efg.se +bemoredog.se +benimar.se +bournonville.se +yentreve.se +yeomans.se +benevent.se +benevia.se +electronix.se +electroparts.se +bourns.se +xxtreme.se +xxx.se +yek.se +yekonomi.se +boursbet.se +benesch.se +benevinum.se +electropirate.se +yellowsub.se +yellowtaxi.se +yeksungems.se +yeos.se +xxx-cam.se +yellowjello.se +yellowline.se +yemmi.se +yen.se +benfico.se +yeninc.se +yenisofra.se +benesign.se +yellowtech.se +yellowguide.se +yellowhat.se +benevo.se +yellowstonepark.se +yellowstrom.se +0-3sixty.se +yellowspider.se +xxx-camgirls.se +yellia.se +0-8.se +benhoganmusik.se +beni.se +benget.se +bengmark.se +yellowlounge.se +xview.se +xvis.se +yenco.se +benestadkeramik.se +yelp.se +yemanja.se +yenny.se +yello-gas.se +electroaudio.se +electrocity.se +yello-strom.se +benestamgolfarchitecture.se +yenom.se +yendo.se +yellowhouse.se +yellowjack.se +yellowtree.se +xxiii.se +xxk590.se +yellowhelmet.se +yellowtel.se +yellowbandit.se +yellowbf.se +benestamgolfarkitektur.se +efg-financial-product.se +xxl.se +electroclash.se +xxx-cams.se +benic.se +efg-financial-products.se +yellowtown.se +yellowhomeservices.se +electroclass.se +xq28.se +xql.se +benice.se +xxxvideos.se +xxxwebmaster.se +electromekano.se +electromontage.se +beniced.se +xylene.se +xylix.se +xqlusive.se +xxxtv.se +xxxvideo.se +xxxgirls.se +xxxit.se +electron.se +xylem.se +xylencr3w.se +electroclean.se +xoro.se +xosexshop.se +electroconsult.se +benestamgolfcoursedesign.se +xushi.se +xux.se +xqs.se +electrocontrol.se +electrona.se +electrocry.se +xterlogistics.se +xtern.se +benestamgolfdesign.se +xr.se +electrondimmer.se +xn-taxialingss-68a.se +xna.se +benestravel.se +electrodesign.se +xradio.se +xterna.se +benet.se +electronet.se +xn-alingsstaxi-28a.se +xn-blhuset-fxa.se +xramvision.se +electroedholm.se +electroluxservicelund.se +electromark.se +benetalnil.se +benidorm.se +electroenoc.se +electromecano.se +electromedia.se +electrojunkie.se +electrokit.se +xterra.se +electrokontrols.se +electroline.se +xosys.se +xxx-dvd.se +xxx-video.se +xrank.se +electrolube.se +xxx4you.se +electrolux.se +electrofishing.se +electrographic.se +electroklubben.se +electroguide.se +electrohelios.se +electrohype.se +xxx666.se +xterragear.se +lll.se +lllb.se +data.se +data-akut.se +hat.se +hat-system.se +bbb.se +bbb-ss.se +777.se +777-host.se +ooo.se +ooonicsecontrolzoneefuqasdfajewkfdgyyfd.se +ttt.se +tttak.se +kkk.se +kkk2007.se +electrohead.se +111.se +1111.se +eee.se +eeee.se +mat.se +mat-dryck.se +mmm.se +mmmab.se +555.se +5555.se +latab.se +latar.se +hhgs.se +hhhh.se +666.se +666-666.se +iii.se +iii-development.se +cat.se +cat-clean.se +ggfx.se +gggnicsecontrolzonehalskjdfhakjlsdfaskd.se +220volt.se +2222.se +nnn.se +nnnnicsecontrolzoneahsdqibwbercvhufasbd.se +af.se +af-belfrage.se +oat.se +oatly.se +ectopic.se +ectrading.se +effer.se +effero.se +praxairyara.se +praxia.se +la-bild.se +11111.se +electrolux-at-home.se +deputamadre.se +depuy.se +insyseur.se +int-idea.se +ccc-c3.se +yodavision.se +yodesign.se +infanterit.se +infantiltinferno.se +davvo.se +davys.se +satanic.se +satanigatan.se +stagno.se +stagos.se +0u.se +0v.se +ibmalpin.se +uncommonsense.se +uncover.se +0-tidsflytt.se +jjkommunikation.se +begat.se +begavia.se +444444.se +gonic.se +gonis.se +3a-advokaterna.se +3a-konsult.se +eeemetallform.se +06.se +1-0-0-0.se +xxxarkitekter.se +222222.se +fitzpatrick.se +fiung.se +4456575.se +stagreus.se +negrete.se +negut.se +1-1.se +specific-diets.se +specifikationskonsult.se +befriends.se +befuktning.se +yinochyang.se +beanie.se +beans.se +225200.se +3aab.se +eat-it.se +triphase.se +tripike.se +lafor.se +laforma.se +infarb.se +jjkonst.se +laforza.se +bat-kusthandel.se +yaukungmun.se +yava.se +eat-sweden.se +uncoveredmusic.se +cccaters.se +boutiqueannecy.se +boutiquebla.se +dataswitch.se +datasynapse.se +oooo.se +cccc.se +llldata.se +jerfstenstrale.se +eci-ab.se +baystar.se +brinkmann.se +brinkmotorsport.se +xxxbio.se +bourses.se +3abyggdelen.se +2299.se +datasynergi.se +ycdbsoya.se +yco.se +biskit.se +biskop.se +yestravel.se +yesway.se +brootak.se +bazooka.se +bazookaboys.se +ebonite.se +ebonnera.se +satansgloria.se +tripinvest.se +yangcreators.se +yangs.se +baystone.se +lafoto.se +neh.se +ebonus.se +eat-web.se +yet.se +yets.se +booksload.se +fiv.se +yacine.se +yaco.se +yawin.se +yawn.se +boheden.se +blastorp.se +xxxkatalogen.se +yelah.se +bemireklam.se +bemkonsult.se +xxxl.se +datasystem.se +yodii.se +bemic.se +yawnmedia.se +batra.se +batracing.se +lactolite.se +lacuarta.se +electropix.se +3album.se +22andberg.se +bemman.se +rrrf.se +eateknik.se +eater.se +beansprout.se +yeh.se +bypasset.se +byportalen.se +22aug.se +yepinvest.se +yeppcom.se +five.se +bray.se +brazil.se +egestammarketing.se +eget.se +yep.se +yellowmagic.se +bengmartin.se +eatertainment.se +jjkonsult.se +booksondemand.se +batraco.se +bluebirds.se +bluebit.se +llm.se +broprodukter.se +0w.se +formanspc.se +formany.se +yokel.se +yoker.se +benforlangning.se +octv.se +oculos.se +yodoi.se +bemico.se +bemindful.se +eatab.se +eatathome.se +ebony.se +beming.se +fluorcarbon.se +fluorplast.se +bundle.se +bundolo.se +brouer.se +brouwers.se +flexografi.se +flexokliche.se +ooopps.se +booksonline.se +yogini.se +yogiochyogini.se +bitchig.se +bitchtour.se +yei.se +olifant.se +oliglobal.se +0wnd.se +22augusti.se +llmarkconsult.se +brinknet.se +benfoto.se +bengnet.se +brady.se +bradykardi.se +xxl-video.se +xxlpix.se +brouzell.se +llmaudio.se +fleddeflux.se +fleece.se +judaica.se +judako.se +yavar.se +blastring.se +bemichtools.se +oatrading.se +yolk.se +yolo.se +bundy.se +borealisgroup.se +borebro.se +bengali.se +bengaliweb.se +benfurman.se +eat2day.se +jergelin.se +brovag.se +efg-financialproduct.se +0x.se +yangtorp.se +judas.se +yeppcongress.se +flexolvit.se +xxl-adventure.se +boutiqueblaze.se +beng.se +yellowbird.se +boothill-linedancers.se +bootjacks.se +bengt.se +yourself.se +yourserver.se +formapg.se +yeppmedical.se +llmd.se +22inc.se +bengt-h.se +bengt-lotta.se +0x539.se +0xdeadbeef.se +obesitasfonden.se +obeyme.se +0x0.se +yanken.se +yankyard.se +bootleg.se +0xe.se +xxxx.se +fluiddynamik.se +fluidinventor.se +uncovers.se +bengalkatt.se +xuxuca.se +jestyle.se +jesukristikyrka.se +xxlsport.se +bengalkatten.se +eci-se.se +obf.se +bracommunity.se +brad.se +egalitar.se +egalite.se +fluidosol.se +fluidspaces.se +floodland.se +floodnet.se +boyinra-stiftelsen.se +boyner.se +ebon.se +yohanzon.se +yohli.se +borebyran.se +yard.se +yardsale.se +formaplast.se +eates.se +braccoitaliano.se +brachyspira.se +electronetto.se +ebbster.se +ebbtide.se +fluidity.se +jericho.se +jerico.se +jergen.se +xv.se +yankee.se +yankeecandle.se +yohoo.se +yogurt.se +yoguza.se +yapyap.se +yaquiserver.se +oligo25.se +underscore.se +undersidan.se +jergill.se +yoh.se +bengt-martin.se +boulevart.se +boulkizz.se +yankeecarclub.se +jerkules.se +jerky.se +llmedia.se +0xff.se +yoigo.se +eav.se +eavrop.se +bradab.se +eatatwork.se +bracketurism.se +brackvattensakvariet.se +llmonitor.se +xraptor.se +yoj.se +yellowmail.se +oligophant.se +xrate.se +electronicenvironment.se +electronicgovernment.se +bengall.se +fluke.se +bengt-ake.se +yellowmate.se +yogioh.se +yaniro.se +borbo.se +borbos.se +xotec.se +obscuramagica.se +obscurity.se +bordercollies.se +borderkanalen.se +boutiquedermonie.se +bootlegs.se +egero.se +egerot.se +eawop2007.se +eaz.se +obfab.se +boreco.se +bows.se +bowt.se +idioma.se +idiot.se +kuenkel.se +kuess.se +7777.se +ecliving.se +eclub.se +catheter.se +cathie.se +cat-electric.se +fluke-sthlm.se +positronstudios.se +positus.se +electroheat.se +111111.se +boric.se +borikt.se +aratron.se +arauco.se +boureliusbygg.se +bourghardt.se +electronia.se +latbaten.se +flunk.se +flunordic.se +xrated.se +yankeehouse.se +yankeeparts.se +xotek.se +jeriksson.se +jerixson.se +nonetwork.se +nonex.se +xxxxii.se +the-attic.se +adeptsecurity.se +adeqvat.se +bootmusik.se +the-basement.se +depuyacromed.se +stagsegelsskogsservice.se +the-beach.se +pottodds.se +pottsork.se +0x1.se +jerkholmens.se +jerkland.se +bracitat.se +adventuresolutions.se +adventuresports.se +ibmanagement.se +imptob.se +impul.se +bordellen.se +border.se +discusklubben.se +discussion.se +eazmo.se +potzscher.se +begbag.se +flotutrask.se +flour.se +eclator.se +eclectic.se +jergis.se +jeriko.se +eclipsemedia.se +eclipze.se +bordeauxer.se +bordell.se +ambitionuppsala.se +ambitiousone.se +yarn.se +yarps.se +kutang.se +kuten.se +floodosoner.se +bourgogne.se +bourjois.se +xyience.se +tttnicsecontrolzonefqwgeufyqewyefygasdf.se +alife.se +alig.se +yankees.se +adventurestyle.se +eng-johnsson.se +neg-micon.se +negativ.se +ambitus.se +bouncers.se +bouncingbox.se +22q11.se +tttparkettslip.se +bourghardt-retorikutbildning.se +depzi.se +addako.se +addan.se +xxxxx.se +yankeecars.se +060.se +ggh.se +cathis.se +yatack.se +yataka.se +border-wines.se +borderbroder.se +bowwows.se +addecco.se +addeco.se +border-rangers.se +bouquetgarnimix.se +bourbon.se +eng-tex.se +specifique.se +infarkt.se +bazoo.se +bazook.se +bridgwater.se +briding.se +beninca.se +yankeedoodledandy.se +boviaoss.se +bovidhavet.se +flubber.se +flubby.se +yesterdaycars.se +yaw.se +yawd.se +crosswise.se +crosswood.se +naturique.se +naturism.se +praesum.se +praetorelab.se +engagemang.se +eazy.se +befuktningssystem.se +yesterdaymusic.se +eazyup.se +eb.se +impelmedia.se +impentab.se +ambitus-teknik.se +kutlu.se +naturist.se +yataz.se +yatf.se +posthistoria.se +posthuma.se +bowflex.se +bowhead.se +nonfire.se +borile.se +begbanken.se +yojimbo.se +yatingstudio.se +boviksbadet.se +bovin.se +yogiontheroad.se +braclub.se +begbat.se +crossworks.se +kuesschen.se +boredtodeath.se +borefelt.se +posthumandreams.se +ooops.se +aligerum.se +improva.se +improvakliniken.se +blacarat.se +black.se +gonisstad.se +lafquist.se +collectum.se +collecture.se +theoremascandinavia.se +theorganicpharmacy.se +yey.se +brightness.se +brightnessreef.se +oli.se +olibra.se +boxgraphix.se +boxhill.se +alight.se +bridion.se +box.se +postemballage.se +posten.se +flow07.se +flowart.se +yavari.se +eb-hedlund.se +yesterdaysnews.se +yesto.se +possengineering.se +possepsykoterapi.se +yogisat.se +odo.se +odon.se +yavin4.se +oestrogen.se +oet.se +bower.se +bowers-wilkins.se +black-birdie.se +neglige.se +neglinge.se +adiento.se +adifferentaspect.se +kwn.se +kwon.se +bourdon-haenni.se +fluns.se +odonet.se +stablo.se +stabshuset.se +flourish.se +flourtant.se +yeyyey.se +pradobygg.se +praegel.se +befwe.se +begbatar.se +yestosomn.se +trabearbetningsutrustning.se +trabenet.se +specimen.se +negative.se +immensus.se +immersion.se +jergo.se +yatara.se +gghandel.se +blam.se +blamagasinet.se +pou.se +nehagen.se +4466000.se +baystoneconsulting.se +ecstasy.se +ecstatics.se +alliator.se +allidator.se +blackcube.se +blackdecker.se +immunforsvar.se +immunit.se +oooups.se +begadi.se +begagnad-cykel.se +cccdalarna.se +efmobil.se +efmsverige.se +yinoyang.se +la-bilder.se +improved-reading.se +improvefond.se +eb-konsult.se +eb85.se +naturistbad.se +blackshield.se +blackshore.se +flucktare.se +fludent.se +adera.se +cat-rental-store.se +bazaarfood.se +bazaarmovement.se +blackjack.se +blackjackguide.se +immunit-secure.se +446verksamhetsstyrning.se +fluor.se +yinshu.se +gossipgirl.se +gossipnews.se +negativeoutlook.se +begroup.se +begrunda.se +oculus.se +rrs.se +byppja.se +theorganicshop.se +yippi.se +yit.se +blackjackguiden.se +bovine.se +eba.se +adiuvo.se +adiva.se +underdogs.se +underfin.se +bedford.se +bedfordstuyvesant.se +bluebits.se +eget-tryck.se +glossbonaturprodukter.se +glossip.se +bat-maskintjanst.se +addanny.se +11111111.se +1112.se +yardtech.se +patebosmedja.se +patek.se +rrstudio.se +improveit.se +postfolket.se +postforskott.se +yogiskhalsa.se +yintang.se +yinyang.se +beanthere.se +buggemala.se +buggeroff.se +malacoleaf.se +malafolkdanslag.se +blowoutproductions.se +blowtech.se +blandgodis.se +blandio.se +praes.se +yarin.se +yawp.se +lacucaracha.se +datatal.se +black-box.se +060921.se +060online.se +praesentis.se +yeigo.se +boredesign.se +negativt.se +negawatt.se +eciab.se +black-boy.se +odell-jarlemyr.se +odelli.se +odibonk.se +odido.se +chimneycorners.se +chimo.se +immobilienscout24.se +immofield.se +adventureteam.se +la-bygg.se +blanchard.se +blanche.se +odells-signalmontage.se +aderaborstahusen.se +ladstrom.se +ladu.se +bypresenten.se +ebonyivory.se +yofa.se +adivarsson.se +blackjackinfo.se +efg-financialproducts.se +blastringsab.se +xxxlankar.se +five-by-five.se +bengabus.se +bearsafari.se +bearshare.se +eb-index.se +daugaard.se +daughter.se +odontlar.se +odontolog.se +infart.se +blackboard.se +blackbone.se +ocun.se +negativet.se +gonix.se +ecceavis.se +eccehomo.se +0611.se +bearab.se +bearb.se +blandis.se +blandkobbaroskar.se +lacucina.se +beeswax.se +beetagg.se +jergovic.se +blackjacksm.se +black-bruin.se +biskopen.se +jerhammar.se +yoko.se +brovagen.se +burberry.se +burchardi.se +fluortanten.se +flowertwig.se +flowey.se +magento.se +mageras.se +oatsfield.se +dauksz.se +bloodshed-nihil.se +bloodtide.se +blameit.se +blamesen.se +kylentreprenader.se +kylfalt.se +xxxlofsweden.se +bedow.se +bedr.se +blackboots.se +donkeyshot.se +donki.se +postfoto.se +datateam.se +eccell.se +bradbolaget.se +bradcentralen.se +unmei.se +unn.se +accus.se +accusort.se +beewe.se +beez.se +ebonyporr.se +xxxmedia.se +onesec.se +oneset.se +flim.se +flimmer.se +belabelbutik.se +belach.se +thirstforknowledge.se +thirty.se +dauphinance.se +daurang.se +tolero.se +tolerud.se +yatsy.se +blame.se +yez.se +eckecammen.se +eckenscafe.se +ecstay.se +brovakten.se +flourtanten.se +flow.se +dauns.se +daup.se +yinsikt.se +neger.se +bune.se +nehdforever.se +black-diamond.se +adrina.se +adris.se +practiceworks.se +practico.se +immunitet.se +ymca.se +ymdrift.se +flinc.se +flinckafingrar.se +accutone.se +gonk.se +daun.se +jeth.se +jeti.se +blancheb.se +unna.se +ecic.se +borgland.se +borglin.se +negerboll.se +timeunit.se +timeus.se +nitrohelmets.se +nitromedia.se +bleach.se +bleachme.se +cat-tech.se +gonny.se +improvit.se +improvo.se +jerhamre.se +blastringsmaskin.se +tractionbil.se +tractis.se +xxxxxx.se +blaman.se +befa.se +cat-web.se +xxxmodels.se +eftec.se +eftefesten.se +yohan.se +bored.se +oau.se +oax.se +blackbirdsnest.se +immersis.se +burchardt.se +onoga.se +onomatepoetry.se +chibit.se +chibratz.se +flimmr.se +eclair.se +eclaser.se +flow-natural.se +alinet.se +alingetexas.se +yatta.se +underfire.se +ebur.se +ebusiness.se +eccemundus.se +kylfirman.se +improwiseconsulting.se +imps.se +7777777.se +transmissionsteamet.se +transmit.se +flimrigt.se +flin.se +060-123808.se +daundesign.se +trimchip.se +trimcut.se +ambius.se +yara.se +burcharth.se +practicum.se +practise.se +align.se +aligning.se +traceur.se +trachoma2010.se +blacksilver.se +odonnell.se +odont.se +postguard.se +posthantering.se +bengalmagic.se +eatfresh.se +bouganim.se +bougicord.se +yogitea.se +cat5.se +immi.se +oligovation.se +boukefsprivatskola.se +daune.se +gonordic.se +trackster-rmbyran.se +tracktech.se +onoof.se +jerleke.se +underflow.se +jesukristikyrkaavsistadagarsheliga.se +begsaab.se +eclient.se +jevinger.se +jevor.se +eckhardt.se +eckhell.se +obstinat.se +obstinatemotion.se +dauner.se +bengt-martins.se +yara-praxair.se +datazoo.se +datcomp.se +aliprot.se +aliquantum.se +stahab.se +nonpaperbooks.se +nonroam.se +borglund.se +floodprotection.se +obscurum-per-obscurius.se +bellicus.se +bellin.se +boulliant.se +boulodromen.se +catchlight.se +catchpress.se +eathouse.se +eatit.se +brazil-living.se +border-shop.se +adivo.se +bordercollie.se +briellbygg.se +briesch.se +kxmedia.se +ky.se +posityd.se +yattayatta.se +obskyrt.se +obsolete.se +gorahemsida.se +goran.se +yleg.se +yler.se +boving-kinnmark.se +nongfin.se +blottbleck.se +blou.se +praetoreslab.se +obfb.se +postgallerian.se +inivero.se +inizia.se +behaviorism.se +behaviorworks.se +eckerberg.se +addapartner.se +araucotours.se +eazycm.se +bat-motor.se +beetlecabriolet.se +beetree.se +date.se +daunfeldt.se +odontbok.se +kuester.se +bradag.se +yobro.se +yoc.se +alingfeldt.se +kkk2008.se +immiflex.se +kworld.se +inflectionpoint.se +inflecto.se +flukenetworks.se +praetoreslaboratory.se +jesus.se +occismarsvin.se +occlutech.se +oogabooga.se +oogle.se +obstecare.se +bradagis.se +yocal.se +engagemangscentralen.se +msn-messenger.se +eclip.se +odeon.se +oderland.se +xxxmovie.se +goran-dehlin.se +eatomato.se +eatonholec.se +engagement.se +catenafastigheter.se +catenas.se +bengt-nilsson.se +trackworld.se +traco.se +eatons.se +bovidkusten.se +stahberg.se +posix.se +posk.se +yit-dts.se +yit-sverige.se +aliorient.se +aliothfenrir.se +dauber.se +daude.se +flattv.se +flava.se +catad.se +catagon.se +immoimmo.se +obsd.se +cathkidston.se +flowcess.se +brightoffice.se +yatzees.se +davitron.se +davlar.se +tracsolutions.se +tractatus.se +five-dayweek.se +alipang.se +alipour.se +impster.se +begsajten.se +boulevarden.se +boulevardmagazine.se +advexa.se +advfa-la.se +yavis.se +bowersandwilkins.se +nons.se +davlens.se +trimediastockholm.se +trimera.se +informativa.se +informativmedia.se +jewab.se +traci.se +octillion.se +octintranet.se +bowhunting.se +beeuty.se +boullan.se +infarten.se +flina.se +alipack.se +catahoulas.se +blackjackturnering.se +060-172250.se +bourelius.se +fluortanterna.se +obsti.se +beetbox.se +beethalin.se +bloomen.se +bloomfield.se +bottlebrothers.se +bottles.se +tractive.se +briesch-consulting.se +catholic.se +blotbostad.se +blotf.se +060-194800.se +adix.se +eclipping.se +davenport.se +davenportsmusik.se +odontdr.se +inizio.se +five-elements.se +imminent.se +immittio.se +blackboule.se +obsense.se +collectus.se +jerikos.se +bootradgard.se +adifferentday.se +iiiee.se +briese.se +oogoto.se +brazil-resort.se +beetronic.se +eatout.se +impsys.se +ontario.se +ontec.se +behindthecamera.se +behm.se +ontoday.se +ontologia.se +addax.se +addaxinnovations.se +uncus.se +bazaartorget.se +daunproject.se +catholica.se +cat6.se +octo.se +ymer.se +bazar.se +baystream.se +yinyoga.se +yip.se +addarsnas.se +efnet.se +bluebiz.se +posthuset.se +yawyd.se +uncut.se +blossing.se +blossom.se +bovingroup.se +blackguide.se +blackharborband.se +improvaplastik.se +manfred.se +manfredgruppen.se +flue.se +davanti.se +davator.se +yinyangshop.se +brigade.se +brigaden.se +imptec.se +blackdiamond.se +aderadok.se +floods.se +odio.se +odis.se +naturistcamping.se +catchrelax.se +malafrakt.se +blackhat.se +pot-limit-omaha.se +potapoff.se +briex.se +briforsinstrument.se +uncutdiamond.se +daus.se +burna.se +burnaid.se +oetiker.se +impeo.se +odellsel.se +ontologix.se +malaga.se +eazycredit.se +blackguard.se +flowchart.se +addbridge.se +boaz.se +boazul.se +blindboy.se +blinddate.se +bloodymary.se +catchthedog.se +naturisten.se +bloomframe.se +adflex.se +adfontes.se +advfirmastadig.se +tetek.se +tetenoir.se +beguided.se +beguns.se +eatl.se +informatix.se +ooh.se +behave.se +behavio.se +blustep.se +blutt.se +blossom-nordic.se +davco.se +ymerab.se +brigadens.se +061124426.se +blot.se +odellselservice.se +yijie.se +yikes.se +borglund-byggk.se +catech.se +cateco.se +underbarungen.se +underberg.se +begbatprylar.se +bowell.se +bowen.se +yazdanfar.se +yazmina.se +gonorre.se +yaragas.se +aestheticexperience.se +aesthetics.se +1111111.se +blota.se +jesus-acute.se +eclips.se +yawh.se +brifus.se +blurpa.se +blurum.se +improvaplastikkirurgi.se +improve.se +tetens.se +flowfamily.se +iiii.se +blackhawk.se +goran-nilsson.se +immortalis.se +immortals.se +laducale.se +spiegelberg.se +spiegelstockholm.se +theoria.se +yezpher.se +davens.se +alinonline.se +alinterest.se +adibris.se +adibus.se +aestim.se +boazul-medical.se +bouldersinc.se +boule.se +kyon.se +kyoob.se +specimenhunters.se +blatunga.se +blau.se +informator.se +imita.se +imitera.se +behaviometrics.se +bottleshop.se +kylfokus.se +biskopenfastighetsab.se +tolfesbo.se +batinvestmarina.se +batir.se +imitthem.se +blinddatemusic.se +instrumentpolen.se +instruments.se +tracing.se +flindall.se +fling.se +nivis.se +nivita.se +flavet.se +impeomarkets.se +flum.se +flumma.se +immix.se +jesus-christ.se +blv.se +bedragen.se +imitthuvud.se +sponsnet.se +sponsor.se +laerum.se +laesker.se +advfn.se +understreet.se +undersvik.se +postgodis.se +postgresql.se +childactivitycentre.se +childcare.se +squashportal.se +squashreklam.se +burglar.se +burgler.se +jesus-kristus.se +beardrex.se +bearflight.se +poul.se +adminis.se +administration.se +flincks.se +tractel.se +traction.se +odik.se +odima.se +flavourspraydiet.se +flawless.se +brigante.se +pratsugen.se +pratus.se +instrumentservice.se +addc.se +eatmydust.se +blount-pool.se +bazar1.se +informatorer.se +spinspiration.se +spinstitut.se +ecit.se +eck.se +boul.se +flummer.se +flaviano.se +improveitsystems.se +alimentumwines.se +alimta.se +davidbergstrom.se +davidbjork.se +goodbye.se +goodcar.se +immigration-sydafrika.se +immigrationverket.se +catchword.se +catchwork.se +briggspowerproducts.se +bright.se +eazygun.se +efw.se +efx.se +bung.se +yohanna.se +influenza.se +influera.se +trackit.se +tracklistan.se +bearinn.se +bearlaw.se +ymir.se +ymkkonsult.se +posten6.se +transmitit.se +bradatorer.se +immola.se +oetker.se +eazykredit.se +boatmangbg.se +boatmeet.se +boulder.se +dooright.se +doorlin.se +oop.se +underskog.se +blastrix.se +blazingsevens.se +blb.se +blotta.se +sprintline.se +sprintxohm.se +postenab.se +doorman.se +yeildsystem.se +bearfootzoo.se +odier.se +uncutdvd.se +flawless-design.se +burckar.se +brigantia.se +catchy.se +ymsyd.se +ymusic.se +thetford.se +thethaiway.se +trackmagazine.se +adixen.se +msn-stuff.se +boulemedical.se +boulensdag.se +improve-it.se +insurrection.se +insurvey.se +dausmedia.se +adic.se +immigrantinstitutet.se +immigration.se +blinddater.se +catcon.se +catdata.se +blackjackturneringar.se +sponsor-el.se +odelros.se +odeltorp.se +belastningsskadecentrum.se +belatron.se +praty-bet.se +spina.se +spinalbalans.se +flaxy.se +flay.se +bearglue.se +bejerstrand.se +bejfred.se +biskops-arn.se +date-it.se +posthem.se +befab.se +oceanobservations.se +oceanoptics.se +tractocile.se +tracealyzer.se +tracecode.se +nivla.se +bright-arkitekter.se +immoscout.se +buonocafe.se +bup.se +adicast.se +blacklead.se +blacklevels.se +daudistel.se +goritas.se +gorji-persson.se +adesto.se +adesys.se +befab-trofen.se +infored.se +inforema.se +davenso.se +filibuster.se +filicaja.se +practica.se +practicaljokes.se +bazar2.se +bright-europe.se +catdesign.se +immix-gaming.se +immo.se +flopp.se +floppen.se +aestino.se +yax.se +tetens-hantverk.se +goran-utbult.se +powerhouse.se +powerhousemc.se +blowfly.se +blowin.se +colleen.se +adetto.se +glamorous.se +glamour.se +gorjus.se +adidassverige.se +adiels.se +datatrygghet.se +dataunit.se +ggi.se +ky-akademien.se +trinicom.se +trinitas.se +underglad.se +bradcommunications.se +adjungo.se +adjust.se +blatand.se +blaterrine.se +blowjob.se +immoserver.se +bazola.se +bupb.se +rrt.se +flooradur.se +floorandcarpet.se +dataunitserver.se +bathso.se +bathusboken.se +engagera.se +catchytunes.se +datateater.se +catalogue.se +catalys.se +bengalskatten.se +ungtval.se +ungutanpung.se +boatstream.se +boattaxi.se +engagerad.se +adicio.se +bldesign.se +bldk.se +immigrant.se +777dragon.se +goran61.se +blastro.se +blastunder.se +kyphi-parfymeri.se +kypros.se +catalysator.se +blacklight.se +floc.se +flock.se +undertak.se +boatweb.se +boavista.se +inherit.se +inhoc.se +oceanpeople.se +flukta.se +prader-willi.se +pradit.se +blownfuse.se +undertaker.se +flayme.se +blowjobfilmer.se +transcendentalism.se +transcendentgroup.se +kkknicsecontrolzonentvsadfksajdshfajsdd.se +ymerbacken.se +tracolor.se +yli.se +eckhoff.se +tracka.se +trackalyzer.se +bathuset.se +bat-protector.se +adicon.se +datautbildare.se +tracom.se +glamour4ever.se +boulevardmedia.se +davli.se +transmitransmitreceive.se +aeproduktion.se +aequitas.se +goosewood.se +goossens.se +boots.se +transmitreceive.se +brigaplat.se +multivac.se +multivan.se +onset-paintball.se +onseven.se +batbottentvatt.se +batboyslim.se +bowes.se +kyoto.se +kyotorecordings.se +bldr.se +improve-your-golf.se +immostreet.se +immovario.se +trackdown.se +trackers.se +glamourama.se +aeger.se +aegid.se +catalinafastigheter.se +catalinakliniken.se +floostajaktlag.se +flop.se +bazar3.se +flocken.se +blottare.se +aestockholm.se +immo-immo.se +catalinastranden.se +kyornskoldsvik.se +practive.se +yit285.se +boozhoundz.se +boozo.se +doormanbill.se +davidbjorkman.se +flavona.se +flavongroup.se +borglunda.se +borile-atv.se +ylife.se +ylinen.se +odensemarsipan.se +odensfors.se +five4fun.se +odellsforsakring.se +adeu.se +triax.se +tribal.se +trackerschool.se +tracingsolutions.se +track.se +datautbildarna.se +yezz.se +bellinga.se +adjustable.se +aemedia.se +aemkei.se +immunbrist.se +blata.se +impera.se +ky-akademierna.se +iisab.se +iistiftelsen.se +aer-lingus.se +eatrade.se +tribal-x.se +blaton.se +tricolorscreen.se +tricom.se +cate.se +folkshoppen.se +folkskam.se +olihn.se +nonsen.se +adiz.se +aerodyn.se +aeroenergi.se +gorilla-safaris.se +gorillacam.se +gordian.se +gordic.se +bowlcircus.se +bowler.se +omina.se +ominkasso.se +belteknik.se +beltman.se +borglundsmek.se +travertine.se +travessen.se +iiiii.se +myonly.se +myopus.se +immonen.se +immore.se +blowkart.se +blowme.se +bunga.se +bathyra.se +batia.se +behaviosec.se +jewander.se +blasvanen.se +yield.se +yieldmanager.se +blackbox.se +gorillagang.se +flaxracing.se +flaxxar.se +odensglomda.se +mulligtochgulligt.se +mullinmallin.se +efsab.se +efsflight.se +follatech.se +follin.se +cathrine.se +blackdiamonds.se +alkakonst.se +alkalon.se +beetween.se +burnball.se +immosky.se +foreignexchange.se +foreignministry.se +oneill.se +oneinteractive.se +thetheater.se +immoasis.se +blackmartiniz.se +blackmesa.se +yazoo.se +postia.se +borgmalmen.se +blowmoulding.se +ylinentalo.se +alison.se +aliss.se +allabookmakers.se +allabostader.se +trinitasfastigheter.se +aegir.se +improveme.se +catalog.se +kyangla.se +kyansailing.se +onshop.se +onside.se +naboer.se +naboforetagspartner.se +immobile.se +bldscan.se +brietling.se +bluepointsolutions.se +bluepower.se +onskinunderskin.se +onslundabyalag.se +brightofsweden.se +dave.se +ojf.se +ojinegras.se +ebook.se +aerie.se +aeriksson.se +adifone.se +la-byggkonsult.se +undelater.se +undeman.se +batista.se +squashstege.se +blus.se +kylfrakt.se +onstage07.se +onstahunddagis.se +ontology.se +blotbergsboden.se +addcall.se +floorandmore.se +blowjobporr.se +bowie.se +allabostadsannonser.se +blackline.se +chickenfoot.se +chickenhouse.se +traberliga7.se +alignit.se +gordin.se +imitz.se +catchup.se +blackburst.se +blackbycenturion.se +ecko.se +folkskola.se +nabomarketing.se +beigt.se +beija.se +efynd.se +yn.se +oneiros.se +foresee.se +foresight.se +batic.se +flamingfox.se +flamingo.se +spigotti.se +spihalland.se +efsgullanget.se +onore.se +blvab.se +eftel.se +blb-bostader.se +ylianttila.se +boax.se +gordinegenbok.se +odinspack.se +poularde.se +spelkassan.se +spelkiosken.se +yaragasab.se +burco.se +foresightlaboratory.se +ky-akademin.se +jewaru.se +eckonsult.se +chiclay.se +chiclit.se +eatmyhouse.se +brazil-resorts.se +blacklist.se +la-cantina.se +flowco-retorik.se +underskoterska.se +boatname.se +flavour.se +flavourevents.se +daustryckeri.se +boattransport.se +boatvideos.se +brazilboliger.se +brightpark.se +boralv.se +borang.se +bunkra.se +bunn.se +bearharddesign.se +lactal.se +lactamin.se +blvd.se +odensholm.se +floorballrink.se +floorcare.se +uncutversion.se +adforaid.se +gonorth.se +bradagisval.se +bureau.se +bureaudesign.se +catedia.se +blacklodge.se +burgman.se +trace.se +tracead.se +onrunsfjallby.se +ons.se +olinab.se +olinda.se +chicane.se +chicanodesign.se +spectronic.se +spectroscopy.se +ebook-store.se +iiik.se +burden.se +burdenofsin.se +spectre.se +spectro.se +aeronet.se +aeropc.se +aera-sense.se +blearning.se +blechert.se +spinstore.se +aerasense.se +aercrete.se +catalysis.se +aegrafiskform.se +aegsverige.se +bouleochbar.se +traconi.se +olinder-westerberg.se +flaviola.se +odensjoby.se +stabilisator.se +stabilisera.se +bleak.se +blackhawknetwork.se +kyansokningar.se +oneitis.se +addcap.se +onside-kommunikation.se +aerts.se +aerwhy.se +naturister.se +adeus.se +collega.se +bootshaus.se +onstep.se +multimeter.se +multimetrix.se +tribalddb.se +boulevardteatern.se +informatorn.se +informatrix.se +aegis.se +blackboxab.se +alir.se +advolill.se +advona.se +undemar.se +eckounltd.se +ecka.se +blinddaters.se +posterinitiative.se +posterism.se +laesoe.se +blackknights.se +occlutechinternational.se +ggif.se +odigos.se +blackisbeautiful.se +aeracing.se +transcom.se +onslundafoto.se +yliniemi.se +stabilisering.se +iin.se +iingeborg.se +boattracker.se +multiverket.se +unden.se +undenas.se +bradconnectivity.se +chiburai.se +adviseit.se +adviseor.se +olympiakonferens.se +olympianutrition.se +onside24.se +adh.se +adhd.se +improvement.se +061128.se +blundstone.se +blunt.se +occoinvent.se +occra.se +flaviositet.se +ylitalo.se +posthemlis.se +aliraqi.se +imivision.se +immomaxx.se +brightpeople.se +blackhawks.se +bradcontrol.se +flawless-guild.se +yarblek.se +0612.se +adev.se +alin.se +traceinface.se +batchim.se +batcofra.se +flinda.se +bedre.se +lactec.se +posterus.se +posterverkstaden.se +forestahotell.se +forestandardagar.se +occo.se +blackoutboys.se +blackoutmc.se +catasa.se +catasus.se +oceanpoker.se +ylivainio.se +blackboy.se +trackmania.se +tribalism.se +aerys.se +trainersonline.se +trainformation.se +administrationen.se +777mobile.se +boraz.se +borbird.se +ylivirta.se +blushing.se +glamourbloggen.se +blackmoney.se +blackmountain.se +aerophoto.se +efyran.se +chickan.se +chicken.se +onsidekonsult.se +posterland.se +postero.se +aerosoles.se +aerosoltrap.se +aerzen.se +floofilter.se +chiclitt.se +batik.se +batinfo.se +postherpetiskneuralgi.se +aesmaskinservice.se +aesp.se +track-it.se +brigby.se +onos.se +aesthesis.se +aesthetic.se +tractor.se +trabetongteknik.se +blacklabel.se +iik.se +adessepraktiken.se +adesso.se +bupgranskning.se +ecigarett.se +onsight.se +bowlerdesign.se +belt-buckles.se +beltbuckles.se +training.se +bowest.se +powerboat.se +powerboatracing.se +oetker-food-service.se +blurb.se +blurid.se +spectrumcases.se +speda.se +bowesystecsverige.se +baysystems.se +flinga.se +flavourofindia.se +oceanprodukter.se +trimning.se +trimpulse.se +iinternet.se +flowcoaching.se +blackbruin.se +blackbugs.se +foresor.se +foress.se +catalysisconsulting.se +beltbucklesno1.se +beltek.se +goophone.se +goorb.se +blackheart.se +posterverkstan.se +laesoe-saltcare.se +posteronline.se +blowjobs.se +catamaran.se +catana.se +flindal.se +blacklabelgames.se +eckran.se +bluride.se +beejodd.se +beeline.se +immovision.se +postgate.se +tremor.se +tren.se +aestheticanova.se +iikoto.se +bowesterdahl.se +catchcomm.se +catching.se +thethinktank.se +brigbys.se +unipalabra.se +unipars.se +aemotorsport.se +daver.se +transferprint.se +transfers.se +eatmyphoto.se +improvisator.se +transus.se +transvea.se +bedsonnet.se +bedstepornofilm.se +yithome.se +datautbildning.se +fordonbyte.se +fordonet.se +poulenc.se +immobilia.se +belaconte.se +blov.se +firmament.se +firmamoppen.se +uniquemoments.se +uniquenorth.se +tracksdirect.se +trackslistan.se +baywest.se +baz.se +immortal.se +aesseal.se +bellinger.se +trackexperience.se +olikt.se +olimp.se +chickenfarm.se +eckstein.se +olika.se +catcit.se +imma.se +immag.se +fischbach.se +fischeninschweden.se +blackbridge.se +pour.se +pourbon.se +gorillakillarna.se +kyh.se +kyhl.se +olympiaspirit.se +eckto.se +blackbull.se +occt.se +kyosho.se +blacklabelsociety.se +floom.se +floor-and-more.se +adjustablebeds.se +yazza.se +catec.se +alingfelt.se +alirev.se +catal.se +foresite.se +bowesterlund.se +trimeresurus.se +trimevent.se +borax.se +poulsens.se +pound.se +trabiten.se +yieldsystem.se +chicnuts.se +blastzone.se +7799.se +eftours.se +eftsweden.se +immanent.se +immanuel.se +batbranschensriksforbund.se +lafayette.se +lafayetteradio.se +fischer.se +fordongas.se +spelklader.se +advhr.se +aderagroup.se +onstore.se +efu.se +catator.se +posterix.se +onsightautomation.se +bupi-cleaner.se +olinderredovisning.se +tribalmedia.se +onsvala.se +immortalart.se +onsign.se +naturistforbundet.se +onslundaif.se +yb.se +ungvanster.se +blackheartband.se +aems.se +daverev.se +prado.se +spihelsingborg.se +bellinicasino.se +bellinisalltjanst.se +chic.se +traditionfastighetsmakleri.se +traditionochhantverk.se +aerospace-kth.se +aerospinningcenter.se +unipartner.se +iit.se +catalyst.se +onsvalabro.se +baysystems-northerneurope.se +tractor-pulling.se +powerboats.se +filicorizecchini.se +laesy.se +laettbyggteknik.se +trackandfield.se +tractechnology.se +efo.se +bejab.se +bejan.se +ynad.se +aerialclothing.se +aerialwork.se +bowk.se +bowl.se +filidontens.se +trialformsupport.se +trialog.se +goodink.se +goodiz.se +undertakservice.se +olaform.se +olafs.se +boranta.se +transmitrecieve.se +treper.se +trepira.se +davidzzon.se +davies-co.se +aeroplane.se +iitala.se +yndegarden.se +burgmann.se +trimsoft.se +bathusets.se +blackdiamondsforlife.se +bathusetdesign.se +bellingham.se +bellings.se +blueit.se +bluejay.se +omax.se +omb.se +trackfix.se +trackme.se +onsvalagard.se +tresuger.se +tresund.se +blackdoor.se +onsite.se +dauta.se +instrumentteknik.se +blissful.se +blissgroup.se +aesska.se +bellini.se +triogrande.se +triogruppen.se +bungalow.se +transcend.se +yitprojekt.se +spedab.se +lafdata.se +transurance.se +adject.se +adjektiv.se +behmfredin.se +odin.se +floorball.se +catanna.se +catapult.se +la-casita.se +aegis-data.se +trackart.se +stability.se +stabilizer.se +catco.se +yf.se +gordinegentshirt.se +lacouronne.se +lacream.se +bupi-solvent-cleaner.se +goodcars.se +spinalis.se +spectrochrom.se +traumata.se +traume.se +adjo.se +tractorpower.se +unipol.se +unipoll.se +burdus.se +adgood.se +adgrip.se +aegswitchgear.se +postiad.se +catcoab.se +illuminet.se +illuminum.se +iitalaab.se +aerostat.se +aerostructure.se +adfunnel.se +adfuturum.se +catalin.se +thethirdeye.se +oetker-fs.se +onsaddle.se +advonaut.se +bowmaker.se +bowmoore.se +eckankar.se +aeromedic.se +aeromix.se +chic-online.se +immox.se +trimform.se +fordonjobs.se +spinifex.se +spinit.se +borat.se +boratjr.se +trafsys.se +tragardh.se +unipatatas.se +powerful.se +powerfx.se +laetus.se +eckworks.se +bowlers.se +bowlindermarin.se +undra.se +undran.se +catcoagenturer.se +stabilo.se +trackback.se +chicamagazine.se +kyarrangemang.se +ecl.se +powerbody.se +chicago75.se +chicagoblower.se +aen.se +undertaksfirman.se +fischer-co.se +adjoin.se +adjoint.se +knubbs.se +knucklehead.se +goodwin.se +goodwind.se +forecast.se +forecom.se +poweric.se +eckard.se +chico.se +pourcrime.se +ky-guiden.se +chickenpox.se +goodwine.se +fischer-reklam.se +unipipe.se +forhenne.se +forhim.se +powergamer.se +findconsulting.se +findea.se +goodwines.se +bootsinabag.se +bluepride.se +spihk.se +boratjunior.se +adjovi.se +adizes.se +firmamsvensson.se +burkar.se +burkarna.se +olin.se +kyas.se +blume.se +blumenberg.se +transientskydd.se +transima.se +yaraindustrial.se +ebookcreator.se +forestberry.se +adviser.se +odin-fonder.se +chicola.se +fischercat.se +traceland.se +traceline.se +alist.se +immpuls.se +labi.se +labil.se +firmamt.se +insupport.se +insurance.se +forhonom.se +bellux.se +bellwox.se +trenad.se +gooster.se +bure.se +onsitegroup.se +gorillapod.se +yitrading.se +spelkliniken.se +posterxxl.se +blackmetal.se +thigereye.se +thii.se +davidblank.se +olin1.se +buraker.se +burar.se +multiverktyg.se +lacenter.se +laces.se +addcapital.se +undecem.se +undefeated.se +onekligen.se +spiky.se +spila.se +transferdesign.se +transferens.se +gorenewable.se +gorengsmattor.se +findeasy.se +laestander.se +floor54.se +transmode.se +illustro.se +illutel.se +burea.se +insurgency.se +triokawa.se +unipath.se +unipet.se +naboo.se +bradrycker.se +bradspel.se +brigge.se +tracopower.se +chieftain.se +chieftaintrailers.se +bleck.se +flintis.se +flintmastaren.se +bungalowhomes.se +blackhill.se +bedrehelse.se +spilab.se +bellino.se +buppie.se +bups.se +alin-co.se +blushed.se +imbecile.se +imber.se +dav.se +track-guard.se +powwownow.se +pox.se +traditions.se +goodwell.se +goodwill.se +ggik.se +beers.se +beershop.se +ecinema.se +necesse.se +nechrivanbarzani.se +stabilit.se +braddjup.se +onsitemedia.se +aerea.se +oceanquest.se +musicofsweden.se +musicom.se +bootstrap.se +booty.se +ungvard.se +ebukonsult.se +ebum.se +imbera.se +advocate-online.se +advocateonline.se +efsovik.se +efsroknas.se +poupon.se +bradsportforbundet.se +davey.se +davgat.se +advobo.se +advocard.se +burley.se +burlid.se +goorep.se +bearhill.se +tracentrum.se +catapult-consulting.se +blackmicas.se +blacknred.se +blacknuss.se +catchingclouds.se +ontomtid.se +gorenje.se +knuckles.se +behrensaenergi.se +behrensgroup.se +bureabostader.se +undefined.se +davero.se +ybjj.se +ybm.se +illumit.se +postendalaro.se +belaggio.se +belaieff.se +ylkraft.se +powergarnet.se +been.se +beenhouse.se +bedstesexfilm.se +lactogen.se +061210.se +0613.se +bureauk.se +aeroplast.se +imberg.se +beiersdorf.se +eftab.se +eftandlakeri.se +yarapraxair.se +specka.se +specma.se +flawlessart.se +behnn.se +fis.se +fisch.se +tragardhfalkenborn.se +beinteractive.se +beirenfuji.se +ebookers.se +bejaro.se +postenintro.se +olikabilder.se +specitek.se +poznejte.se +pozt.se +occuhealth.se +occupied.se +bowl-inn.se +traceit.se +0612-717700.se +pourhomme.se +forfew.se +forflex.se +trendz.se +trengtan.se +insurance-it.se +kyhla.se +transitions.se +transitmodels.se +natalisfond.se +natalplaza.se +nameclient.se +namedrive.se +burlin.se +fishskin.se +fishtank.se +adessobygg.se +imms.se +flavours.se +namedrop.se +bating.se +chicagopneumatic.se +powergear.se +bearleague.se +adja.se +adjackets.se +bupsjobo.se +daverock.se +spectrum.se +lafdesigns.se +catchingeye.se +chiendouceur.se +undefinedsounds.se +speel.se +speeron.se +namedropping.se +natrligansiktslyftning.se +natrom.se +kyoshobutiken.se +lactiferm.se +absolvo.se +absonet.se +spiik.se +bootybay.se +speedworks.se +speedxpert.se +goot.se +trailer-store.se +trailerbengt.se +laesser.se +buratti.se +burb.se +boatnav.se +advocate.se +undacamping.se +undae.se +datautbildningar.se +boaxelsson.se +transitor.se +okeli.se +oken.se +trackstar.se +chicbaby.se +uniqueparts.se +blacknusshairandcare.se +blockhane.se +blockhus.se +spill-tech.se +spillan.se +onshare.se +trioquinta.se +trioredovisning.se +folkskolan.se +trailercam.se +goot2b.se +imbuecommunications.se +imbumba.se +floor724.se +absonic.se +onoterade.se +behold.se +blackbrilliants.se +transferfactor.se +stablelafleur.se +stablematt.se +yaravi.se +burmese.se +burmester.se +trimfriskvard.se +behome.se +aderakommunikation.se +iio.se +bloodhounds.se +bloodline.se +gorillaresor.se +glair.se +glaj.se +trabroar.se +trabtech.se +77racing.se +gginfo.se +yitsverige.se +alinband.se +alinco.se +forebo.se +foreby.se +trapersiennspec.se +trapets.se +posterprint.se +labildesign.se +speechpower.se +speechtime.se +glajal.se +adjob.se +advony.se +blissing.se +bradstone.se +stabilometer.se +kkkonst.se +flavourspray.se +efoa.se +glam.se +chica-gaming.se +bejas.se +gorillasafaris.se +belaew.se +natron.se +uniprocess.se +unipump.se +efshelsingborg.se +trailerfynd.se +trailerhou.se +aeropoxy.se +aeros.se +catch22.se +catchafire.se +trinitec.se +behrenskennel.se +batbryggan.se +catchit.se +0620.se +datautohus.se +chiccita.se +chicagency.se +instrumenttekniker.se +gginvest.se +triokok.se +stabilotherm.se +trackster.se +traduc.se +traduco.se +onsjo.se +transvestit.se +transvision.se +beirholm.se +batbutiken.se +addcare.se +immobilien.se +unipost.se +goodwood.se +aeredovisning.se +labindustries.se +necinfrontia.se +goosebay.se +goosegreen.se +adj.se +stabilproduktion.se +triolen.se +triolog.se +blinddates.se +burbage.se +spiikensbacke.se +speedy.se +imc.se +blueprint.se +trackmypicture.se +fireshow.se +firesite.se +bluebliz.se +aerograd.se +aerogym.se +ynef.se +offtrail.se +offworld.se +davincy.se +davinyl.se +postenlogistikab.se +labora.se +laboratech.se +traducta.se +kooneva.se +koop.se +foreach.se +forebergsmissionsforsamling.se +bellini-casino.se +powerice.se +onsjosag.se +munin39.se +munk.se +bowl4joy.se +goorglad.se +colttotalplus.se +colubris.se +ocho.se +ochpetra.se +davi.se +firmitas.se +firmngro.se +blissresto.se +onoterat.se +uncutvideo.se +burab.se +bearline.se +goodcause.se +boratt.se +forebyggamigran.se +trabjerg.se +adjustables.se +gorillaz.se +advoqat.se +trablas.se +bootylicious.se +triol.se +burkart.se +blackmountains.se +speedogliid.se +speedol.se +alireza.se +aliria.se +labeldesign.se +labelinks.se +aedifico.se +aedo.se +speedyasia.se +blinddating.se +odin6.se +speed.se +aderavaluemanagement.se +olympiatandlakarna.se +bo.se diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/trace_dns.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/trace_dns.rb new file mode 100644 index 000000000000..aa823b1a782e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/demo/trace_dns.rb @@ -0,0 +1,52 @@ +#! /usr/bin/env ruby + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require 'dnsruby' + +# e.g. ruby trace_dns.rb example.com + +unless (1..2).include?(ARGV.length) + puts "Usage: #{$0} domain [type]" + exit(-1) +end + + +# Load DLV key +dlv_key = Dnsruby::RR.create("dlv.isc.org. IN DNSKEY 257 3 5 BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2 brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5 ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt TDN0YUuWrBNh") +Dnsruby::Dnssec.add_dlv_key(dlv_key) + +resolver = Dnsruby::Recursor.new +# TheLog.level = Logger::DEBUG + + +resolver.recursion_callback = Proc.new do |packet| + packet.additional.each { |a| puts a } + puts(";; Received #{packet.answersize} bytes from #{packet.answerfrom}. Security Level = #{packet.security_level.string}\n") + puts "\n#{'-' * 79}\n" +end + + +domain = ARGV[0] +type = ARGV[1] || Types.A + +begin + response = resolver.query(domain, type) + puts "\nRESPONSE : #{response}" +rescue Dnsruby::NXDomain + puts "Domain '#{domain}' doesn't exist" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/dnsruby.gemspec b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/dnsruby.gemspec new file mode 100644 index 000000000000..437bfdf194fb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/dnsruby.gemspec @@ -0,0 +1,51 @@ +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'dnsruby/version' + +SPEC = Gem::Specification.new do |s| + s.name = "dnsruby" + s.version = Dnsruby::VERSION + s.authors = ["Alex Dalitz"] + s.email = 'alex@caerkettontech.com' + s.homepage = "https://github.com/alexdalitz/dnsruby" + s.platform = Gem::Platform::RUBY + s.summary = "Ruby DNS(SEC) implementation" + s.description = \ +'Dnsruby is a pure Ruby DNS client library which implements a +stub resolver. It aims to comply with all DNS RFCs, including +DNSSEC NSEC3 support.' + s.license = "Apache License, Version 2.0" + + s.files = `git ls-files -z`.split("\x0") + + s.post_install_message = \ +"Installing dnsruby... + For issues and source code: https://github.com/alexdalitz/dnsruby + For general discussion (please tell us how you use dnsruby): https://groups.google.com/forum/#!forum/dnsruby" + + s.test_file = "test/ts_offline.rb" + s.extra_rdoc_files = ["DNSSEC", "EXAMPLES", "README.md", "EVENTMACHINE"] + + s.metadata = { + 'yard.run' => 'yard', + 'bug_tracker_uri' => 'https://github.com/alexdalitz/dnsruby/issues', + 'changelog_uri' => 'https://github.com/alexdalitz/dnsruby/blob/master/RELEASE_NOTES.md', + 'documentation_uri' => 'https://www.rubydoc.info/gems/dnsruby/', + 'homepage_uri' => 'https://github.com/alexdalitz/dnsruby', + 'source_code_uri' => 'https://github.com/alexdalitz/dnsruby', + } + + s.add_development_dependency 'rake', '>= 12.3.3' + s.add_development_dependency 'minitest', '~> 5.4' + s.add_development_dependency 'rubydns', '~> 2.0.1' + s.add_development_dependency 'nio4r', '~> 2.0' + s.add_development_dependency 'minitest-display', '>= 0.3.0' + s.add_development_dependency('yard', '~> 0.9') + + if RUBY_VERSION >= "1.9.3" + s.add_development_dependency 'coveralls', '~> 0.7' + end + + s.add_runtime_dependency 'simpleidn', '~> 0.1' +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby.rb new file mode 100644 index 000000000000..ba0b7eeb337b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby.rb @@ -0,0 +1,241 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +require 'dnsruby/code_mappers' +require 'dnsruby/message/message' +require 'dnsruby/ipv4' +require 'dnsruby/ipv6' +require 'timeout' +require 'dnsruby/the_log' +require 'dnsruby/version' +require 'dnsruby/cache' +require 'dnsruby/DNS' +require 'dnsruby/hosts' +require 'dnsruby/update' +require 'dnsruby/zone_transfer' +require 'dnsruby/dnssec' +require 'dnsruby/zone_reader' +require 'dnsruby/resolv' + + +# = Dnsruby library +# Dnsruby is a thread-aware DNS stub resolver library written in Ruby. +# +# It is based on resolv.rb, the standard Ruby DNS implementation, +# but gives a complete DNS implementation, including DNSSEC. +# +# The Resolv class can be used to resolve addresses using /etc/hosts and /etc/resolv.conf, +# or the DNS class can be used to make DNS queries. These interfaces will attempt to apply +# the default domain and searchlist when resolving names. +# +# The Resolver and SingleResolver interfaces allow finer control of individual messages. +# The Resolver class sends queries to multiple resolvers using various retry mechanisms. +# The SingleResolver class is used by Resolver to send individual Messages to individual +# resolvers. +# +# Resolver queries return Dnsruby::Message objects. Message objects have five +# sections: +# +# * The header section, a Dnsruby::Header object. +# +# * The question section, a list of Dnsruby::Question objects. +# +# * The answer section, a list of Dnsruby::Resource objects. +# +# * The authority section, a list of Dnsruby::Resource objects. +# +# * The additional section, a list of Dnsruby::Resource objects. +# +# +# == example +# res = Dnsruby::Resolver.new # System default +# ret = res.query("example.com") +# print "#{ret.anwer.length} answer records returned, #{ret.answer.rrsets.length} RRSets returned in aswer section\n" +# +# p Dnsruby::Resolv.getaddress("www.ruby-lang.org") +# p Dnsruby::Resolv.getname("210.251.121.214") +# +# Dnsruby::DNS.open {|dns| +# p dns.getresources("www.ruby-lang.org", Dnsruby::Types.A).collect {|r| r.address} +# p dns.getresources("ruby-lang.org", 'MX').collect {|r| [r.exchange.to_s, r.preference]} +# } +# +# == exceptions +# +# * ResolvError < StandardError +# +# * ResolvTimeout < Timeout::Error +# +# * NXDomain < ResolvError +# +# * FormErr < ResolvError +# +# * ServFail < ResolvError +# +# * NotImp < ResolvError +# +# * Refused < ResolvError +# +# * NotZone < ResolvError +# +# * YXDomain < ResolvError +# +# * YXRRSet < ResolvError +# +# * NXRRSet < ResolvError +# +# * NotAuth < ResolvError +# +# * OtherResolvError < ResolvError +# +# == I/O +# Dnsruby implements a pure Ruby event loop to perform I/O. +# Support for EventMachine has been deprecated. +# +# == DNSSEC +# Dnsruby supports DNSSEC and NSEC(3). +# DNSSEC support is on by default - but no trust anchors are configured by default. +# See Dnsruby::Dnssec for more details. +# +# == Codes +# Dnsruby makes extensive use of several different types of codes. These are implemented +# in the form of subclasses of CodeMapper and are located in lib/code_mappers.rb. They are: +# +# * OpCode - e.g. Query, Status, Notify +# * RCode - e.g. NOERROR, NXDOMAIN +# * ExtendedRCode - currently only BADVERS +# * Classes - IN, CH, HS, NONE, ANY +# * Types - RR types, e.g. A, NS, SOA +# * QTypes - IXFR, AXFR, MAILB, MAILA, ANY +# * MetaTypes - TKEY, TSIG, OPT +# * Algorithms - e.g. RSAMD5, DH, DSA +# * Nsec3HashAlgorithms - currently only SHA-1 + +# == Bugs +# * NIS is not supported. +# * /etc/nsswitch.conf is not supported. +# * NSEC3 validation still TBD +module Dnsruby + + def Dnsruby.version + return VERSION + end + + @@logger = Logger.new(STDOUT) + @@logger.level = Logger::FATAL + # Get the log for Dnsruby + # Use this to set the log level + # e.g. Dnsruby.log.level = Logger::INFO + def Dnsruby.log + @@logger + end + + + # Logs (error level) and raises an error. + def log_and_raise(object, error_class = RuntimeError) + if object.is_a?(Exception) + error = object + Dnsruby.log.error(error.inspect) + raise error + else + message = object.to_s + Dnsruby.log.error(message) + raise error_class.new(message) + end + end; module_function :log_and_raise + + # An error raised while querying for a resource + class ResolvError < StandardError + attr_accessor :response + end + + # A timeout error raised while querying for a resource + class ResolvTimeout < Timeout::Error + end + + # The requested domain does not exist + class NXDomain < ResolvError + end + + # A format error in a received DNS message + class FormErr < ResolvError + end + + # Indicates a failure in the remote resolver + class ServFail < ResolvError + end + + # The requested operation is not implemented in the remote resolver + class NotImp < ResolvError + end + + # The requested operation was refused by the remote resolver + class Refused < ResolvError + end + + # The update RR is outside the zone (in dynamic update) + class NotZone < ResolvError + end + + # Some name that ought to exist, does not exist (in dynamic update) + class YXDomain < ResolvError + end + + # Some RRSet that ought to exist, does not exist (in dynamic update) + class YXRRSet < ResolvError + end + + # Some RRSet that ought not to exist, does exist (in dynamic update) + class NXRRSet < ResolvError + end + + # The nameserver is not responsible for the zone (in dynamic update) + class NotAuth < ResolvError + end + + + # Another kind of resolver error has occurred + class OtherResolvError < ResolvError + end + + # Socket was closed by server before request was processed + class SocketEofResolvError < ResolvError + end + + # An error occurred processing the TSIG + class TsigError < OtherResolvError + end + + # Sent a signed packet, got an unsigned response + class TsigNotSignedResponseError < TsigError + end + + # Indicates an error in decoding an incoming DNS message + class DecodeError < ResolvError + attr_accessor :partial_message + end + + # Indicates an error encoding a DNS message for transmission + class EncodeError < ResolvError + end + + # Indicates an error verifying + class VerifyError < ResolvError + end + + # Indicates a zone transfer has failed due to SOA serial mismatch + class ZoneSerialError < ResolvError + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/DNS.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/DNS.rb new file mode 100644 index 000000000000..64fe10a67a55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/DNS.rb @@ -0,0 +1,305 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +require 'dnsruby/hosts' +require 'dnsruby/config' +require "dnsruby/resolver" +module Dnsruby + + # == Dnsruby::DNS class + # Resolv::DNS performs DNS queries. + # + # === class methods + # * Dnsruby::DNS.new(config_info=nil) + # + # ((|config_info|)) should be nil, a string or a hash. + # If nil is given, /etc/resolv.conf and platform specific information is used. + # If a string is given, it should be a filename which format is same as /etc/resolv.conf. + # If a hash is given, it may contains information for nameserver, search and ndots as follows. + # + # Dnsruby::DNS.new({:nameserver=>["210.251.121.21"], :search=>["ruby-lang.org"], :ndots=>1}) + # + # * Dnsruby::DNS.open(config_info=nil) + # * Dnsruby::Resolv::DNS.open(config_info=nil) {|dns| ...} + # + # === methods + # * Dnsruby::DNS#close + # + # * Dnsruby::DNS#getaddress(name) + # * Dnsruby::DNS#getaddresses(name) + # * Dnsruby::DNS#each_address(name) {|address| ...} + # address lookup methods. + # + # ((|name|)) must be an instance of Dnsruby::Name or String. Resultant + # address is represented as an instance of Dnsruby::IPv4 or Dnsruby::IPv6. + # + # * Dnsruby::DNS#getname(address) + # * Dnsruby::DNS#getnames(address) + # * Dnsruby::DNS#each_name(address) {|name| ...} + # These methods lookup hostnames . + # + # ((|address|)) must be an instance of Dnsruby::IPv4, Dnsruby::IPv6 or String. + # Resultant name is represented as an instance of Dnsruby::Name. + # + # * Dnsruby::DNS#getresource(name, type, class) + # * Dnsruby::DNS#getresources(name, type, class) + # * Dnsruby::DNS#each_resource(name, type, class) {|resource| ...} + # These methods lookup DNS resources of ((|name|)). + # ((|name|)) must be a instance of Dnsruby::Name or String. + # + # ((|type|)) must be a member of Dnsruby::Types + # ((|class|)) must be a member of Dnsruby::Classes + # + # Resultant resource is represented as an instance of (a subclass of) + # Dnsruby::RR. + # (Dnsruby::RR::IN::A, etc.) + # + # The searchlist and other Config info is applied to the domain name if appropriate. All the nameservers + # are tried (if there is no timely answer from the first). + # + # This class uses Resolver to perform the queries. + # + # Information taken from the following places : + # * STD0013 + # * RFC 1035, etc. + # * ftp://ftp.isi.edu/in-notes/iana/assignments/dns-parameters + # * etc. + class DNS + + attr_accessor :do_caching + + # Creates a new DNS resolver. See Resolv::DNS.new for argument details. + # + # Yields the created DNS resolver to the block, if given, otherwise returns it. + def self.open(*args) + dns = new(*args) + return dns unless block_given? + begin + yield dns + ensure + dns.close + end + end + + # Closes the resolver + def close + @resolver.close + end + + + def to_s + return "DNS : " + @config.to_s + end + + # Creates a new DNS resolver + # + # +config_info+ can be: + # + # * nil:: Uses platform default (e.g. /etc/resolv.conf) + # * String:: Path to a file using /etc/resolv.conf's format + # * Hash:: Must contain :nameserver, :search and :ndots keys + # example : + # + # Dnsruby::DNS.new({:nameserver => ['210.251.121.21'], + # :search => ['ruby-lang.org'], + # :ndots => 1}) + def initialize(config_info=nil) + @do_caching = true + @config = Config.new() + @config.set_config_info(config_info) + @resolver = Resolver.new(@config) +# if (@resolver.single_resolvers.length == 0) +# raise ArgumentError.new("Must pass at least one valid resolver address") +# end + end + + attr_reader :config + + # Gets the first IP address of +name+ from the DNS resolver + # + # +name+ can be a Dnsruby::Name or a String. Retrieved address will be a + # Dnsruby::IPv4 or a Dnsruby::IPv6 + def getaddress(name) + each_address(name) {|address| return address} + raise ResolvError.new("DNS result has no information for #{name}") + end + + # Gets all IP addresses of +name+ from the DNS resolver + # + # +name+ can be a Dnsruby::Name or a String. Retrieved address will be a + # Dnsruby::IPv4 or a Dnsruby::IPv6 + def getaddresses(name) + ret = [] + each_address(name) {|address| ret << address} + return ret + end + + # Iterates over all IP addresses of +name+ retrieved from the DNS resolver + # + # +name+ can be a Dnsruby::Name or a String. Retrieved address will be a + # Dnsruby::IPv4 or a Dnsruby::IPv6 + def each_address(name) + each_resource(name) {|resource| yield resource.address} + end + + # Gets the first hostname for +address+ from the DNS resolver + # + # +address+ must be a Dnsruby::IPv4, Dnsruby::IPv6 or a String. Retrieved + # name will be a Dnsruby::Name. + def getname(address) + each_name(address) {|name| return name} + raise ResolvError.new("DNS result has no information for #{address}") + end + + # Gets all hostnames for +address+ from the DNS resolver + # + # +address+ must be a Dnsruby::IPv4, Dnsruby::IPv6 or a String. Retrieved + # name will be a Dnsruby::Name. + def getnames(address) + ret = [] + each_name(address) {|name| ret << name} + return ret + end + + # Iterates over all hostnames for +address+ retrieved from the DNS resolver + # + # +address+ must be a Dnsruby::IPv4, Dnsruby::IPv6 or a String. Retrieved + # name will be a Dnsruby::Name. + def each_name(address) + case address + when Name + ptr = address + when IPv4, IPv6 + ptr = address.to_name + when IPv4::Regex + ptr = IPv4.create(address).to_name + when IPv6::Regex + ptr = IPv6.create(address).to_name + else + raise ResolvError.new("cannot interpret as address: #{address}") + end + each_resource(ptr, Types.PTR, Classes.IN) {|resource| yield resource.domainname} + end + + # Look up the first +type+, +klass+ resource for +name+ + # + # +type+ defaults to Dnsruby::Types.A + # +klass+ defaults to Dnsruby::Classes.IN + # + # Returned resource is represented as a Dnsruby::RR instance, e.g. + # Dnsruby::RR::IN::A + def getresource(name, type=Types.A, klass=Classes.IN) + each_resource(name, type, klass) {|resource| return resource} + raise ResolvError.new("DNS result has no information for #{name}") + end + + # Look up all +type+, +klass+ resources for +name+ + # + # +type+ defaults to Dnsruby::Types.A + # +klass+ defaults to Dnsruby::Classes.IN + # + # Returned resource is represented as a Dnsruby::RR instance, e.g. + # Dnsruby::RR::IN::A + def getresources(name, type=Types.A, klass=Classes.IN) + ret = [] + each_resource(name, type, klass) {|resource| ret << resource} + return ret + end + + # Iterates over all +type+, +klass+ resources for +name+ + # + # +type+ defaults to Dnsruby::Types.A + # +klass+ defaults to Dnsruby::Classes.IN + # + # Yielded resource is represented as a Dnsruby::RR instance, e.g. + # Dnsruby::RR::IN::A + def each_resource(name, type=Types.A, klass=Classes.IN, &proc) + type = Types.new(type) + klass = Classes.new(klass) + reply, reply_name = send_query(name, type, klass) + case reply.rcode.code + when RCode::NOERROR + extract_resources(reply, reply_name, type, klass, &proc) + return + # when RCode::NXDomain + # Dnsruby.log.debug("RCode::NXDomain returned - raising error") + # raise Config::NXDomain.new(reply_name.to_s) + else + Dnsruby.log.error{"Unexpected rcode : #{reply.rcode.string}"} + raise Config::OtherResolvError.new(reply_name.to_s) + end + end + + def extract_resources(msg, name, type, klass) # :nodoc: + if type == Types.ANY + n0 = Name.create(name) + msg.each_answer {|rec| + yield rec if n0 == rec.name + } + end + yielded = false + n0 = Name.create(name) + msg.each_answer {|rec| + if n0 == rec.name + case rec.type + when type + if (rec.klass == klass) + yield rec + yielded = true + end + when Types.CNAME + n0 = rec.domainname + end + end + } + return if yielded + msg.each_answer {|rec| + if n0 == rec.name + case rec.type + when type + if (rec.klass == klass) + yield rec + end + end + end + } + end + + def send_query(name, type=Types.A, klass=Classes.IN) # :nodoc: + candidates = @config.generate_candidates(name) + exception = nil + candidates.each do |candidate| + q = Queue.new + msg = Message.new + msg.header.rd = 1 + msg.add_question(candidate, type, klass) + msg.do_validation = false + msg.header.cd = false + msg.do_caching = do_caching + @resolver.do_validation = false + @resolver.send_async(msg, q) + id, ret, exception = q.pop + if (exception == nil && ret && ret.rcode == RCode.NOERROR) + return ret, ret.question[0].qname + end + end + raise exception + end + + end +end +# -- +# @TODO@ Asynchronous interface. Some sort of Deferrable? +# ++ diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/bit_mapping.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/bit_mapping.rb new file mode 100644 index 000000000000..2121b6fe5324 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/bit_mapping.rb @@ -0,0 +1,138 @@ +# This code is copied from the trick_bag gem (see https://github.com/keithrbennett/trick_bag). +# It is copied a) to avoid adding a new dependency and b) because that gem is in +# version 0 and is unstable. + +module Dnsruby + +# Provides methods for converting between the various representations +# of a bitmap: number, binary encoded string, array, and sparse array. +# +# Where an array is used to represent bits, the first element (#0) will be the +# low (1) bit and the last bit will be the high bit. + module BitMapping + + module_function + + # Converts from a binary string to a number, e.g. "\x01\x00" => 256 + def binary_string_to_number(string) + string = string.clone.force_encoding(Encoding::ASCII_8BIT) + string.bytes.inject(0) do |number, byte| + number * 256 + byte.ord + end + end + + + # Converts a number to a binary encoded string, e.g. 256 => "\x01\x00" + def number_to_binary_string(number, min_length = 0) + assert_non_negative(number) + binary_string = ''.force_encoding(Encoding::ASCII_8BIT) + + while number > 0 + byte_value = number & 0xFF + binary_string << byte_value + number >>= 8 + end + + binary_string.reverse.rjust(min_length, "\x00") + end + + + # Converts a number to an array of place values, e.g. 9 => [8, 0, 0, 1] + def number_to_place_value_array(number) + assert_non_negative(number) + array = [] + bit_value = 1 + while number > 0 + array << ((number & 1 == 1) ? bit_value : 0) + number >>= 1 + bit_value <<= 1 + end + array.reverse + end + + + # Converts from a value array to a number, e.g. [8, 0, 0, 1] => 9 + def place_value_array_to_number(place_value_array) + place_value_array.inject(&:+) + end + + + # Converts a number to an array of bit values, e.g. 9 => [1, 0, 0, 1] + def number_to_bit_array(number, minimum_binary_places = 0) + assert_non_negative(number) + array = [] + while number > 0 + array << (number & 1) + number >>= 1 + end + array.reverse! + zero_pad_count = minimum_binary_places - array.size + zero_pad_count.times { array.unshift(0) } + array + end + + + # Converts an array of bit values, e.g. [1, 0, 0, 1], to a number, e.g. 9 + def bit_array_to_number(bit_array) + return nil if bit_array.empty? + multiplier = 1 + bit_array.reverse.inject(0) do |result, n| + result += n * multiplier + multiplier *= 2 + result + end + end + + + # Converts a number to a sparse array containing bit positions that are set/true/1. + # Note that these are bit positions, e.g. 76543210, and not bit column values + # such as 128/64/32/16/8/4/2/1. + def number_to_set_bit_positions_array(number) + assert_non_negative(number) + array = [] + position = 0 + while number > 0 + array << position if number & 1 == 1 + position += 1 + number >>= 1 + end + array + end + + + # Converts an array of bit position numbers to a numeric value, e.g. [0, 2] => 5 + def set_bit_position_array_to_number(position_array) + return nil if position_array.empty? + position_array.inject(0) do |result, n| + result += 2 ** n + end + end + + + # Converts a binary string to an array of bit values, e.g. "\x0C" => [1, 1, 0, 0] + def binary_string_to_bit_array(string, minimum_binary_places = 0) + number = binary_string_to_number(string) + number_to_bit_array(number, minimum_binary_places) + end + + + # If number is negative, raises an ArgumentError; else does nothing. + def assert_non_negative(number) + unless number.is_a?(Integer) && number >= 0 + raise ArgumentError.new( + "Parameter must be a nonnegative Integer " + + "but is #{number.inspect} (a #{number.class})") + end + end + + # Reverses a binary string. Note that it is not enough to reverse + # the string itself because although the bytes would be reversed, + # the bits within each byte would not. + def reverse_binary_string_bits(binary_string) + binary_place_count = binary_string.size * 8 + reversed_bit_array = binary_string_to_bit_array(binary_string, binary_place_count).reverse + number = bit_array_to_number(reversed_bit_array) + number_to_binary_string(number) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/bitmap.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/bitmap.rb new file mode 100644 index 000000000000..3cadef09b9c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/bitmap.rb @@ -0,0 +1,108 @@ +# This code is copied from the trick_bag gem (see https://github.com/keithrbennett/trick_bag). +# It is copied a) to avoid adding a new dependency and b) because that gem is in +# version 0 and is unstable. + +require_relative = ->(*args) do + this_file_dir = File.expand_path(File.dirname(__FILE__)) + args.each { |arg| require(File.join(this_file_dir, arg)) } +end + +require 'forwardable' +require_relative.('bit_mapping') + + +module Dnsruby + +# Instances of this class can be created that will hold on to bitmap data and be used +# to test bits and convert to other formats. +# +# Where an array is used to represent bits, the first element (#0) will be the +# high bit and the last element will be the low (1's column) bit. +class Bitmap + + extend Forwardable + + # This is the internal representation of the bitmap value: + attr_reader :number + + # Some instance methods can be delegated to this number: + [:&, :|, :^, :hash].each do |method_name| + def_delegator :@number, method_name + end + + # Set a new value to number, validating first that it is nonnegative. + def number=(new_number) + self.assert_non_negative(new_number) + @number = new_number + end + + + # The constructor is made private because: + # + # 1) each type of initialization requires its own validation, and it + # would be wasteful to do the validation unnecessarily + # 2) to enforce that the more descriptively + # named class methods should be used to create instances. + private_class_method :new + + + # Class methods to create instances from the various representation types + # handled in the BitMapping module's methods. + + # Creates an instance from a nonnegative number. + def self.from_number(number) + new(number) + end + + # Creates an instance from a binary string (e.g. "\x0C"). + def self.from_binary_string(string) + new(BitMapping.binary_string_to_number(string)) + end + + # Creates an instance from a value array (e.g. [8, 0, 0, 1]) + def self.from_place_value_array(array) + new(BitMapping.place_value_array_to_number(array)) + end + + # Creates an instance from a bit array (e.g. [1, 0, 0, 1]) + def self.from_bit_array(array) + new(BitMapping.bit_array_to_number(array)) + end + + # Creates an instance from an array of positions for the bits that are set (e.g. [0, 3]) + def self.from_set_bit_position_array(array) + new(BitMapping.set_bit_position_array_to_number(array)) + end + + # Instance methods to convert the data to the various representation types: + + # Returns the instance's value as a binary string (e.g. "\x0C") + def to_binary_string(min_length = 0) + BitMapping.number_to_binary_string(number, min_length) + end + + # Returns the instance's value as an array of bit column values (e.g. [8, 0, 0, 1]) + def to_place_value_array + BitMapping.number_to_place_value_array(number) + end + + # Returns the instance's value as an array of bit column place values (e.g. [8, 0, 0, 1]) + def to_bit_array + BitMapping.number_to_bit_array(number) + end + + # Returns the instance's value as an array of positions for the bits that are set (e.g. [0, 3]) + def to_set_bit_position_array + BitMapping.number_to_set_bit_positions_array(number) + end + + def initialize(number) + BitMapping.assert_non_negative(number) + @number = number + end + + def ==(other) + other.is_a?(self.class) && other.number == self.number + end +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/cache.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/cache.rb new file mode 100644 index 000000000000..ff2a844b7e16 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/cache.rb @@ -0,0 +1,161 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + + +# # This class implements a cache. +# It stores data under qname-qclass-qtype tuples. +# Each tuple indexes a CacheData object (which +# stores a Message, and an expiration). +# If a new Message is stored to a tuple, it will +# overwrite the previous Message. +# When a Message is retrieved from the cache, the header +# and ttls will be "fixed" - i.e. AA cleared, etc. + + + +# @TODO@ Max size for cache? +module Dnsruby + class Cache # :nodoc: all + def initialize() + @cache = Hash.new + @@max_size = 16*1024 # Get this right... + @mutex = Mutex.new + end + def cache + @cache + end + def clear() + @mutex.synchronize { + @cache = Hash.new + } + end + def length + return @cache.length + end + def Cache.max_size=(length) + @@max_size = length + end + def add(message) + q = message.question[0] + key = CacheKey.new(q.qname, q.qtype, q.qclass).to_s + data = CacheData.new(message) + @mutex.synchronize { + if (@cache[key]) + TheLog.debug("CACHE REPLACE : #{q.qname}, #{q.qtype}\n") + else + TheLog.debug("CACHE ADD : #{q.qname}, #{q.qtype}\n") + end + @cache[key] = data + + while @cache.size > @@max_size # keep the cache size reasonable + @cache.shift + end + } + end + # This method "fixes up" the response, so that the header and ttls are OK + # The resolver will still need to copy the flags and ID across from the query + def find(qname, qtype, qclass = Classes.IN) +# print "CACHE find : #{qname}, #{qtype}\n" + qn = Name.create(qname) + qn.absolute = true + key = CacheKey.new(qn, qtype, qclass).to_s + @mutex.synchronize { + data = @cache[key] + if (!data) +# print "CACHE lookup failed\n" + return nil + end + if (data.expiration <= Time.now.to_i) + @cache.delete(key) + TheLog.debug("CACHE lookup stale\n") + return nil + end + m = data.message + TheLog.debug("CACHE found\n") + return m + } + end + def Cache.delete(qname, qtype, qclass = Classes.IN) + key = CacheKey.new(qname, qtype, qclass) + @mutex.synchronize { + @cache.delete(key) + } + end + class CacheKey # :nodoc: all + attr_accessor :qname, :qtype, :qclass + def initialize(*args) + self.qclass = Classes.IN + if (args.length > 0) + self.qname = Name.create(args[0]) + self.qname.absolute = true + if (args.length > 1) + self.qtype = Types.new(args[1]) + if (args.length > 2) + self.qclass = Classes.new(args[2]) + end + end + end + end + def to_s + return "#{qname.inspect.downcase} #{qclass} #{qtype}" + end + end + class CacheData # :nodoc: all + attr_reader :expiration + def message=(m) + @expiration = get_expiration(m) + @message = Message.decode(m.encode(true)) + @message.cached = true + end + def message + m = Message.decode(@message.encode) + m.cached = true + # @TODO@ What do we do about answerfrom, answersize, etc.? + m.header.aa = false # Anything else to do here? + # Fix up TTLs!! + offset = (Time.now - @time_stored).to_i + m.each_resource {|rr| + next if rr.type == Types::OPT + rr.ttl = rr.ttl - offset + } + return m + end + def get_expiration(m) + # Find the minimum ttl of any of the rrsets + min_ttl = 9999999 + m.each_section {|section| + section.rrsets.each {|rrset| + if (rrset.ttl < min_ttl) + min_ttl = rrset.ttl + end + } + } + if (min_ttl == 9999999) + return 0 + end + return (Time.now.to_i + min_ttl) + end + def initialize(*args) + @expiration = 0 + @time_stored = Time.now.to_i + self.message=(args[0]) + end + def to_s + return "#{self.message}" + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/code_mapper.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/code_mapper.rb new file mode 100644 index 000000000000..b2b46c31927b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/code_mapper.rb @@ -0,0 +1,180 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + # CodeMapper superclass looks after String to code mappings (e.g. OpCode, RCode, etc.) + # + # Subclasses simply define a mapping of codes to variable names, and CodeMapper provides utility methods. + # + # All strings will come out as upper case + # + # Example : + # Types::AAAA or Types.AAAA + # rcode.string or rcode.code + class CodeMapper # :nodoc: all + include Comparable + + @@arrays = {} + + attr_accessor :string, :code + alias to_code code + alias to_i code + alias to_string string + alias to_s string + + class Arrays + attr_accessor :strings, :stringsdown, :values, :maxcode + def initialize + @strings = {} + @stringsdown = {} + @values = {} + @maxcode = 0 + end + end + + def CodeMapper.strings + strings = [] + @@arrays[self].strings.keys.each {|s| strings.push(s)} + return strings + end + + # Creates the CodeMapper from the defined constants + def CodeMapper.update + + @@arrays[self] = Arrays.new + + constants = self.constants - CodeMapper.constants + constants.each do |i| + @@arrays[self].strings.store(i.to_s, const_get(i)) + end + @@arrays[self].maxcode = constants.length + @@arrays[self].values = @@arrays[self].strings.invert + @@arrays[self].stringsdown = Hash.new + @@arrays[self].strings.keys.each do |s| + @@arrays[self].stringsdown.store(s.downcase, @@arrays[self].strings[s]) + end + end + + # Add new a code to the CodeMapper + def CodeMapper.add_pair(string, code) + array = @@arrays[self] + array.strings.store(string, code) + array.values=array.strings.invert + array.stringsdown.store(string.downcase, code) + array.maxcode+=1 + end + + def unknown_string(arg) #:nodoc: all + raise ArgumentError.new("String #{arg} not a member of #{self.class}") + end + + def unknown_code(arg) #:nodoc: all + # Be liberal in what you accept... + # raise ArgumentError.new("Code #{arg} not a member of #{self.class}") + Classes.add_pair(arg.to_s, arg) + set_code(arg) + end + + def self.method_missing(methId) #:nodoc: all + str = methId.id2name + return self.new(str) + end + + def initialize(arg) #:nodoc: all + array = @@arrays[self.class] + if (arg.kind_of?String) + arg = arg.gsub("_", "-") + code = array.stringsdown[arg.downcase] + if (code != nil) + @code = code + @string = array.values[@code] + else + unknown_string(arg) + end + elsif arg.kind_of?(Integer) + if (array.values[arg] != nil) + @code = arg + @string = array.values[@code] + else + unknown_code(arg) + end + elsif (arg.kind_of?self.class) + @code = arg.code + @string = array.values[@code] + else + raise ArgumentError.new("Unknown argument of type #{arg.class}: #{arg} for #{self.class}") + end + end + + def set_string(arg) + array = @@arrays[self.class] + @code = array.stringsdown[arg.downcase] + @string = array.values[@code] + end + + def set_code(arg) + @code = arg + @string = @@arrays[self.class].values[@code] + end + + def hash + @code + end + + def inspect + return @string + end + + def CodeMapper.to_string(arg) + if (arg.kind_of?String) + return arg + else + return @@arrays[self].values[arg] + end + end + + def CodeMapper.to_code(arg) + if arg.kind_of?(Integer) + return arg + else + return @@arrays[self].stringsdown[arg.downcase] + end + end + + def <=>(other) + if other.is_a?(Integer) + self.code <=> other + else + self.code <=> other.code + end + end + + def ==(other) + return true if [@code, @string].include?other + if (CodeMapper === other) + return true if ((other.code == @code) || (other.string == @string)) + end + return false + end + alias eql? == # :nodoc: + + # Return a regular expression which matches any codes or strings from the CodeMapper. + def self.regexp + # Longest ones go first, so the regex engine will match AAAA before A, etc. + return @@arrays[self].strings.keys.sort { |a, b| b.length <=> a.length }.join('|') + end + + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/code_mappers.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/code_mappers.rb new file mode 100644 index 000000000000..e03e5218227d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/code_mappers.rb @@ -0,0 +1,300 @@ +module Dnsruby + + require 'dnsruby/code_mapper' + + class OpCode < CodeMapper + Query = 0 # RFC 1035 + IQuery = 1 # RFC 1035 + Status = 2 # RFC 1035 + Notify = 4 # RFC 1996 + Update = 5 # RFC 2136 + + update() + end + + class RCode < CodeMapper + NOERROR = 0 # RFC 1035 + FORMERR = 1 # RFC 1035 + SERVFAIL = 2 # RFC 1035 + NXDOMAIN = 3 # RFC 1035 + NOTIMP = 4 # RFC 1035 + REFUSED = 5 # RFC 1035 + YXDOMAIN = 6 # RFC 2136 + YXRRSET = 7 # RFC 2136 + NXRRSET = 8 # RFC 2136 + NOTAUTH = 9 # RFC 2136 + NOTZONE = 10 # RFC 2136 + + # BADVERS = 16 # an EDNS ExtendedRCode + BADSIG = 16 + BADKEY = 17 + BADTIME = 18 + BADMODE = 19 + BADNAME = 20 + BADALG = 21 + + update() + end + + class ExtendedRCode < CodeMapper + BADVERS = 16 + update() + end + + class Classes < CodeMapper + IN = 1 # RFC 1035 + CH = 3 # RFC 1035 + # CHAOS = 3 # RFC 1035 + HS = 4 # RFC 1035 + # HESIOD = 4 # RFC 1035 + NONE = 254 # RFC 2136 + ANY = 255 # RFC 1035 + update() + + def unknown_string(arg) + if (arg=~/^CLASS/i) + Classes.add_pair(arg, arg.gsub('CLASS', '').to_i) + set_string(arg) + else + raise ArgumentError.new("String #{arg} not a member of #{self.class}") + end + end + + def unknown_code(arg) + Classes.add_pair('CLASS' + arg.to_s, arg) + set_code(arg) + end + + # classesbyval and classesbyname functions are wrappers around the + # similarly named hashes. They are used for 'unknown' DNS RR classess + # (RFC3597) + # See typesbyval and typesbyname, these beasts have the same functionality + def Classes.classesbyname(name) #:nodoc: all + name.upcase!; + if to_code(name) + return to_code(name) + end + + if ((name =~/^\s*CLASS(\d+)\s*$/o) == nil) + raise ArgumentError, "classesbyval() argument is not CLASS### (#{name})" + end + + val = $1.to_i + if val > 0xffff + raise ArgumentError, 'classesbyval() argument larger than ' + 0xffff + end + + return val; + end + + + + def Classes.classesbyval(val) #:nodoc: all + if (val.class == String) + if ((val =~ /^\s*0*([0-9]+)\s*$/) == nil) + raise ArgumentError, "classesbybal() argument is not numeric (#{val})" # unless val.gsub!("^\s*0*([0-9]+)\s*$", "$1") + # val =~ s/^\s*0*([0-9]+)\s*$/$1/o;# + end + val = $1.to_i + end + + return to_string(val) if to_string(val) + + raise ArgumentError, 'classesbyval() argument larger than ' + 0xffff if val > 0xffff; + + return "CLASS#{val}"; + end + end + + # The RR types explicitly supported by Dnsruby. + # + # New RR types should be added to this set + class Types < CodeMapper + SIGZERO = 0 # RFC2931 consider this a pseudo type + A = 1 # RFC 1035, Section 3.4.1 + NS = 2 # RFC 1035, Section 3.3.11 + MD = 3 # RFC 1035, Section 3.3.4 (obsolete) + MF = 4 # RFC 1035, Section 3.3.5 (obsolete) + CNAME = 5 # RFC 1035, Section 3.3.1 + SOA = 6 # RFC 1035, Section 3.3.13 + MB = 7 # RFC 1035, Section 3.3.3 + MG = 8 # RFC 1035, Section 3.3.6 + MR = 9 # RFC 1035, Section 3.3.8 + NULL = 10 # RFC 1035, Section 3.3.10 + WKS = 11 # RFC 1035, Section 3.4.2 (deprecated) + PTR = 12 # RFC 1035, Section 3.3.12 + HINFO = 13 # RFC 1035, Section 3.3.2 + MINFO = 14 # RFC 1035, Section 3.3.7 + MX = 15 # RFC 1035, Section 3.3.9 + TXT = 16 # RFC 1035, Section 3.3.14 + RP = 17 # RFC 1183, Section 2.2 + AFSDB = 18 # RFC 1183, Section 1 + X25 = 19 # RFC 1183, Section 3.1 + ISDN = 20 # RFC 1183, Section 3.2 + RT = 21 # RFC 1183, Section 3.3 + NSAP = 22 # RFC 1706, Section 5 + NSAP_PTR = 23 # RFC 1348 (obsolete) + SIG = 24 # RFC 2535, Section 4.1 + KEY = 25 # RFC 2535, Section 3.1 + PX = 26 # RFC 2163, + GPOS = 27 # RFC 1712 (obsolete) + AAAA = 28 # RFC 1886, Section 2.1 + LOC = 29 # RFC 1876 + NXT = 30 # RFC 2535, Section 5.2 obsoleted by RFC3755 + EID = 31 # draft-ietf-nimrod-dns-xx.txt + NIMLOC = 32 # draft-ietf-nimrod-dns-xx.txt + SRV = 33 # RFC 2052 + ATMA = 34 # ??? + NAPTR = 35 # RFC 2168 + KX = 36 # RFC 2230 + CERT = 37 # RFC 2538 + DNAME = 39 # RFC 2672 + OPT = 41 # RFC 2671 + APL = 42 # RFC 3123 + DS = 43 # RFC 4034 + SSHFP = 44 # RFC 4255 + IPSECKEY = 45 # RFC 4025 + RRSIG = 46 # RFC 4034 + NSEC = 47 # RFC 4034 + DNSKEY = 48 # RFC 4034 + DHCID = 49 # RFC 4701 + NSEC3 = 50 # RFC still pending at time of writing + NSEC3PARAM= 51 # RFC still pending at time of writing + TLSA = 52 # RFC 6698 + HIP = 55 # RFC 5205 + CDS = 59 # RFC 7344 + CDNSKEY = 60 # RFC 7344 + SPF = 99 # RFC 4408 + UINFO = 100 # non-standard + UID = 101 # non-standard + GID = 102 # non-standard + UNSPEC = 103 # non-standard + TKEY = 249 # RFC 2930 + TSIG = 250 # RFC 2931 + IXFR = 251 # RFC 1995 + AXFR = 252 # RFC 1035 + MAILB = 253 # RFC 1035 (MB, MG, MR) + MAILA = 254 # RFC 1035 (obsolete - see MX) + ANY = 255 # RFC 1035 + URI = 256 # RFC 7553 + CAA = 257 # RFC 6844 + DLV = 32769 # RFC 4431 (informational) + update() + + def unknown_string(arg) #:nodoc: all + if (arg=~/^TYPE/i) + Types.add_pair(arg, arg.gsub('TYPE', '').to_i) + set_string(arg) + else + raise ArgumentError.new("String #{arg} not a member of #{self.class}") + end + end + + def unknown_code(arg) #:nodoc: all + Types.add_pair('TYPE' + arg.to_s, arg) + set_code(arg) + end + + # -- + # typesbyval and typesbyname functions are wrappers around the similarly named + # hashes. They are used for 'unknown' DNS RR types (RFC3597) + # typesbyname returns they TYPEcode as a function of the TYPE + # mnemonic. If the TYPE mapping is not specified the generic mnemonic + # TYPE### is returned. + def Types.typesbyname(name) #:nodoc: all + name.upcase! + + if to_code(name) + return to_code(name) + end + + + if ((name =~/^\s*TYPE(\d+)\s*$/o)==nil) + raise ArgumentError, "Net::DNS::typesbyname() argument (#{name}) is not TYPE###" + end + + val = $1.to_i + if val > 0xffff + raise ArgumentError, 'Net::DNS::typesbyname() argument larger than ' + 0xffff + end + + return val; + end + + + # typesbyval returns they TYPE mnemonic as a function of the TYPE + # code. If the TYPE mapping is not specified the generic mnemonic + # TYPE### is returned. + def Types.typesbyval(val) #:nodoc: all + if (!defined?val) + raise ArgumentError, "Net::DNS::typesbyval() argument is not defined" + end + + if val.class == String + # if val.gsub!("^\s*0*(\d+)\s*$", "$1") + if ((val =~ /^\s*0*(\d+)\s*$", "$1/o) == nil) + raise ArgumentError, "Net::DNS::typesbyval() argument (#{val}) is not numeric" + # val =~s/^\s*0*(\d+)\s*$/$1/o; + end + + val = $1.to_i + end + + + if to_string(val) + return to_string(val) + end + + raise ArgumentError, 'Net::DNS::typesbyval() argument larger than ' + 0xffff if + val > 0xffff; + + return "TYPE#{val}"; + end + end + + class QTypes < CodeMapper + IXFR = 251 # incremental transfer [RFC1995] + AXFR = 252 # transfer of an entire zone [RFC1035] + MAILB = 253 # mailbox-related RRs (MB, MG or MR) [RFC1035] + MAILA = 254 # mail agent RRs (Obsolete - see MX) [RFC1035] + ANY = 255 # all records [RFC1035] + update() + end + + class MetaTypes < CodeMapper + TKEY = 249 # Transaction Key [RFC2930] + TSIG = 250 # Transaction Signature [RFC2845] + OPT = 41 # RFC 2671 + end + + # http://www.iana.org/assignments/dns-sec-alg-numbers/ + class Algorithms < CodeMapper + RESERVED = 0 + RSAMD5 = 1 + DH = 2 + DSA = 3 + RSASHA1 = 5 + RSASHA256 = 8 + RSASHA512 = 10 + ECDSAP256SHA256 = 13 + ECDSAP384SHA384 = 14 + INDIRECT = 252 + PRIVATEDNS = 253 + PRIVATEOID = 254 + update() + # Referred to as Algorithms.DSA_NSEC3_SHA1 + add_pair("DSA-NSEC3-SHA1", 6) + # Referred to as Algorithms.RSASHA1_NSEC3_SHA1 + add_pair("RSASHA1-NSEC3-SHA1", 7) + # Referred to as Algorithms.ECC_GOST + add_pair("ECC-GOST",12) + end + + # http://www.iana.org/assignments/dnssec-nsec3-parameters/dnssec-nsec3-parameters.xhtml + class Nsec3HashAlgorithms < CodeMapper + RESERVED = 0 + update() + add_pair("SHA-1", 1) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/config.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/config.rb new file mode 100644 index 000000000000..102a4c446a08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/config.rb @@ -0,0 +1,477 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + # == Description + # The Config class determines the system configuration for DNS. + # In particular, it determines the nameserver to target queries to. + # + # + # It also specifies whether and how the search list and default + # domain should be applied to queries, according to the following + # algorithm : + # + # * If the name is absolute, then it is used as is. + # + # * If the name is not absolute, then : + # + # If apply_domain is true, and ndots is greater than the number + # of labels in the name, then the default domain is added to the name. + # + # If apply_search_list is true, then each member of the search list + # is appended to the name. + # + # The Config class has now been modified for lazy loading. Previously, the config + # was loaded when a Resolver was instantiated. Now, the config is only loaded if + # a query is performed (or a config parameter requested on) a Resolver which has + # not yet been configured. + class Config + DEFAULT_PORT = 53 + # -- + # @TODO@ Switches for : + # + # -- single socket for all packets + # -- single new socket for individual client queries (including retries and multiple nameservers) + # ++ + + # The list of nameservers to query + def nameserver + if (!@configured) + parse_config + end + return @nameserver + end + # Should the search list be applied? + attr_accessor :apply_search_list + # Should the default domain be applied? + attr_accessor :apply_domain + # The minimum number of labels in the query name (if it is not absolute) before it is considered complete + def ndots + if (!@configured) + parse_config + end + return @ndots + end + + # Set the config. Parameter can be : + # + # * A String containing the name of the config file to load + # e.g. /etc/resolv.conf + # + # * A hash with the following elements : + # nameserver (String) + # domain (String) + # search (String) + # ndots (Integer) + # + # This method should not normally be called by client code. + def set_config_info(config_info) + parse_config(config_info) + end + + # Create a new Config with system default values + def initialize() + @mutex = Mutex.new + @configured = false + # parse_config + end + # Reset the config to default values + def Config.reset + c = Config.new + @configured = false + # c.parse_config + end + + def parse_config(config_info=nil) #:nodoc: all + @mutex.synchronize { + ns = [] + @nameserver = [] + @domain, s, @search = nil + dom="" + nd = 1 + @ndots = 1 + @port = DEFAULT_PORT + @apply_search_list = true + @apply_domain = true + config_hash = Config.default_config_hash + case config_info + when nil + when String + config_hash.merge!(Config.parse_resolv_conf(config_info)) + when Hash + config_hash.merge!(config_info.dup) + if String === config_hash[:nameserver] + config_hash[:nameserver] = [config_hash[:nameserver]] + end + if String === config_hash[:search] + config_hash[:search] = [config_hash[:search]] + end + else + raise ArgumentError.new("invalid resolv configuration: #{@config_info.inspect}") + end + ns = config_hash[:nameserver] if config_hash.include? :nameserver + s = config_hash[:search] if config_hash.include? :search + nd = config_hash[:ndots] if config_hash.include? :ndots + p = config_hash[:port] if config_hash.include? :port + @apply_search_list = config_hash[:apply_search_list] if config_hash.include? :apply_search_list + @apply_domain= config_hash[:apply_domain] if config_hash.include? :apply_domain + dom = config_hash[:domain] if config_hash.include? :domain + + if (!@configured) + send("nameserver=",ns) + end + @configured = true + send("search=",s) + send("ndots=",nd) + send("port=",p) + send("domain=",dom) + } + Dnsruby.log.info{to_s} + end + + # Set the default domain + def domain=(dom) + # @configured = true + if (dom) + if !dom.kind_of?(String) + raise ArgumentError.new("invalid domain config: #{@domain.inspect}") + end + @domain = Name::split(dom) + else + @domain=nil + end + end + + # Set ndots + def ndots=(nd) + @configured = true + @ndots=nd + if !@ndots.kind_of?(Integer) + raise ArgumentError.new("invalid ndots config: #{@ndots.inspect}") + end + end + + # Set port + def port=(p) + @configured = true + @port=p if p + if !@port.kind_of?(Integer) + raise ArgumentError.new("invalid port config: #{@port.inspect}") + end + end + + # Set the default search path + def search=(s) + @configured = true + @search=s + if @search + if @search.class == Array + @search = @search.map {|arg| Name::split(arg) } + else + raise ArgumentError.new("invalid search config: search must be an array!") + end + else + hostname = Socket.gethostname + if /\./ =~ hostname + @search = [Name.split($')] + else + @search = [[]] + end + end + + if !@search.kind_of?(Array) || + # !@search.all? {|ls| ls.all? {|l| Label::Str === l } } + !@search.all? {|ls| ls.all? {|l| Name::Label === l } } + raise ArgumentError.new("invalid search config: #{@search.inspect}") + end + end + + def check_ns(ns) #:nodoc: all + if !ns.kind_of?(Array) || + !ns.all? {|n| (Name === n || String === n || IPv4 === n || IPv6 === n)} + raise ArgumentError.new("invalid nameserver config: #{ns.inspect}") + end + ns.each {|n| + if (String ===n) + # Make sure we can make a Name or an address from it + begin + a = IPv4.create(n) + rescue ArgumentError + begin + a = IPv6.create(n) + rescue ArgumentError + begin + a = Name.create(n) + rescue ArgumentError + raise ArgumentError.new("Can't interpret #{n} as IPv4, IPv6 or Name") + end + end + end + end + } + end + + # Add a nameserver to the list of nameservers. + # + # Can take either a single String or an array of Strings. + # The new nameservers are added at a higher priority. + def add_nameserver(ns) + @configured = true + if (ns.kind_of?String) + ns=[ns] + end + check_ns(ns) + ns.reverse_each do |n| + if (!@nameserver.include?(n)) + self.nameserver=[n]+@nameserver + end + end + end + + # Set the config to point to a single nameserver + def nameserver=(ns) + @configured = true + check_ns(ns) + # @nameserver = ['0.0.0.0'] if (@nameserver.class != Array || @nameserver.empty?) + # Now go through and ensure that all ns point to IP addresses, not domain names + @nameserver=ns + Dnsruby.log.debug{"Nameservers = #{@nameserver.join(", ")}"} + end + + def Config.resolve_server(ns) #:nodoc: all + # Sanity check server + # If it's an IP address, then use that for server + # If it's a name, then we'll need to resolve it first + server=ns + if (Name === ns) + ns = ns.to_s + end + begin + addr = IPv4.create(ns) + server = ns + rescue Exception + begin + addr=IPv6.create(ns) + server = ns + rescue Exception + begin + # try to resolve server to address + if ns == "localhost" + server = "127.0.0.1" + else + # Use Dnsruby to resolve the servers + # First, try the default resolvers + resolver = Resolver.new + found = false + begin + ret = resolver.query(ns) + ret.answer.each {|rr| + if ([Types::A, Types::AAAA].include?rr.type) + addr = rr.address.to_s + server = addr + found = true + end + } + rescue Exception + end + if (!found) + # That didn't work - try recursing from the root + recursor = Recursor.new + ret = recursor.query(ns) + ret.answer.each {|rr| + if ([Types::A, Types::AAAA].include?rr.type) + addr = rr.address.to_s + server = addr + end + } + if (!found) + raise ArgumentError.new("Recursor can't locate #{server}") + end + end + end + rescue Exception => e + Dnsruby.log.error{"Can't make sense of nameserver : #{server}, exception : #{e}"} + raise ArgumentError.new("Can't make sense of nameserver : #{server}, exception : #{e}") + return nil + end + end + end + return server + end + + def Config.parse_resolv_conf(filename) #:nodoc: all + nameserver = [] + search = nil + domain = nil + ndots = 1 + port = DEFAULT_PORT + open(filename) {|f| + f.each {|line| + line.sub!(/[#;].*/, '') + keyword, *args = line.split(/\s+/) + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.8") + args.each { |arg| + arg.untaint + } + end + next unless keyword + case keyword + when 'port' + port = args[0].to_i + when 'nameserver' + nameserver += args + when 'domain' + next if args.empty? + domain = args[0] + # if search == nil + # search = [] + # end + # search.push(args[0]) + when 'search' + next if args.empty? + if search == nil + search = [] + end + args.each {|a| search.push(a)} + when 'options' + args.each {|arg| + case arg + when /\Andots:(\d+)\z/ + ndots = $1.to_i + end + } + end + } + } + return { :nameserver => nameserver, :domain => domain, :search => search, :ndots => ndots, :port => port } + end + + def inspect #:nodoc: all + to_s + end + + def to_s + if (!@configured) + parse_config + end + ret = "Config - nameservers : " + @nameserver.each {|n| ret += n.to_s + ", "} + domain_string="empty" + if (@domain!=nil) + domain_string=@domain.to_s + end + ret += " domain : #{domain_string}, search : " + search.each {|s| ret += s + ", " } + ret += " ndots : #{@ndots}" + ret += " port : #{@port}" + return ret + end + + def Config.default_config_hash(filename="/etc/resolv.conf") #:nodoc: all + config_hash={} + if File.exist? filename + config_hash = Config.parse_resolv_conf(filename) + else + if (/java/ =~ RUBY_PLATFORM && !(filename=~/:/)) + # Problem with paths and Windows on JRuby - see if we can munge the drive... + wd = Dir.getwd + drive = wd.split(':')[0] + if (drive.length==1) + file = drive << ":" << filename + if File.exist? file + config_hash = Config.parse_resolv_conf(file) + end + end + elsif /mswin32|cygwin|mingw|bccwin/ =~ RUBY_PLATFORM + # @TODO@ Need to get windows domain sorted + search, nameserver = Win32::Resolv.get_resolv_info + # config_hash[:domain] = domain if domain + config_hash[:nameserver] = nameserver if nameserver + config_hash[:search] = [search].flatten if search + end + end + config_hash + end + + # Return the search path + def search + if (!@configured) + parse_config + end + search = [] + @search.each do |s| + search.push(Name.new(s).to_s) + end + return search + end + + # Return the default domain + def domain + if (!@configured) + parse_config + end + if (@domain==nil) + return nil + end + return Name.create(@domain).to_s + end + + def single? #:nodoc: all + if @nameserver.length == 1 + return @nameserver[0] + else + return nil + end + end + + def get_ready + if (!@configured) + parse_config + end + end + + def generate_candidates(name_in) #:nodoc: all + if !@configured + parse_config + end + candidates = [] + name = Name.create(name_in) + if name.absolute? + candidates = [name] + else + candidates.push(Name.create(name_in.to_s + ".")) + if (@apply_domain) + if @ndots > name.length - 1 + if (@domain != nil) + candidates.push(Name.create(name.to_a+@domain)) + end + end + end + if (!@apply_search_list) + candidates.push(Name.create(name.to_a)) + else + if @ndots <= name.length - 1 + candidates.push(Name.create(name.to_a)) + end + candidates.concat(@search.map {|domain| Name.create(name.to_a + domain)}) + if (name.length == 1) + candidates.concat([Name.create(name.to_a)]) + end + end + end + return candidates + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/dnssec.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/dnssec.rb new file mode 100644 index 000000000000..23a37cbfb939 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/dnssec.rb @@ -0,0 +1,321 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License f181or the specific language governing permissions and +# limitations under the License. +# ++ +require 'digest/sha2' +require 'net/ftp' +require 'dnsruby/key_cache' +require 'dnsruby/single_verifier' +module Dnsruby + + # RFC4033, section 7 + # "There is one more step that a security-aware stub resolver can take + # if, for whatever reason, it is not able to establish a useful trust + # relationship with the recursive name servers that it uses: it can + # perform its own signature validation by setting the Checking Disabled + # (CD) bit in its query messages. A validating stub resolver is thus + # able to treat the DNSSEC signatures as trust relationships between + # the zone administrators and the stub resolver itself. " + # + # Dnsruby is configured to validate responses by default. However, it is not + # configured with any trusted keys by default. Applications may use the + # verify() method to perform verification with of RRSets of Messages with + # given keys. Alternatively, trusted keys may be added to this class (either + # directly, or by loading the IANA TAR or the DLV ISC ZSK). Validation will then + # be performed from these keys (or the DLV registry, if configured). Negative + # and positive responses are validation. + # + # Messages are tagged with the current security_level (Message::SecurityLevel). + # UNCHECKED means Dnsruby has not attempted to validate the response. + # BOGUS means the response has been checked, and is bogus. + # INSECURE means the response has been validated to be insecure (e.g. in an unsigned zone) + # SECURE means that the response has been verfied to be correct. + # + # Several validators are provided, with each maintaining its own cache of trusted keys. + # If validators are added or removed, the caches of the other validators are not affected. + class Dnssec + # A class to cache trusted keys + + + class ValidationPolicy + # @TODO@ Could do this by getting client to add verifiers in the order they + # want them to be used. Could then dispense with all this logic + # Note that any DLV registries which have been configured will only be tried + # after both the root and any local trust anchors (RFC 5074 section 5) + + # * Always use the root and ignore local trust anchors. + ALWAYS_ROOT_ONLY = 1 + # * Use the root if successful, otherwise try local anchors. + ROOT_THEN_LOCAL_ANCHORS = 2 + # * Use local trust anchors if available, otherwise use root. + LOCAL_ANCHORS_THEN_ROOT = 3 + # * Always use local trust anchors and ignore the root. + ALWAYS_LOCAL_ANCHORS_ONLY = 4 + end + @@validation_policy = ValidationPolicy::LOCAL_ANCHORS_THEN_ROOT + + def Dnssec.validation_policy=(p) + if ((p >= ValidationPolicy::ALWAYS_ROOT_ONLY) && (p <= ValidationPolicy::ALWAYS_LOCAL_ANCHORS_ONLY)) + @@validation_policy = p + # @TODO@ Should we be clearing the trusted keys now? + end + end + def Dnssec.validation_policy + @@validation_policy + end + + @@root_verifier = SingleVerifier.new(SingleVerifier::VerifierType::ROOT) + + # #NOTE# You may wish to import these via a secure channel yourself, if + # using Dnsruby for validation. + @@root_key = RR.create(". IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5") + @@root_verifier.add_root_ds(@@root_key) + + @@root_key_new = RR.create(". IN DS 20326 8 2 E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D") + @@root_verifier.add_root_ds(@@root_key_new) + + @@dlv_verifier = SingleVerifier.new(SingleVerifier::VerifierType::DLV) + + # @TODO@ Could add a new one of these for each anchor. + @@anchor_verifier = SingleVerifier.new(SingleVerifier::VerifierType::ANCHOR) + + + # Add a trusted Key Signing Key for the ISC DLV registry. + def Dnssec.add_dlv_key(dlv_key) + @@dlv_verifier.add_dlv_key(dlv_key) + end + # Add a new trust anchor + def Dnssec.add_trust_anchor(t) + # @TODO@ Create a new verifier? + @@anchor_verifier.add_trust_anchor(t) + end + # Add the trusted key with the given expiration time + def self.add_trust_anchor_with_expiration(k, expiration) + # Create a new verifier? + @@anchor_verifier.add_trust_anchor_with_expiration(k, expiration) + end + # Remove the trusted key + def Dnssec.remove_trust_anchor(t) + @@anchor_verifier.remove_trust_anchor(t) + end + # Wipes the cache of trusted keys + def self.clear_trust_anchors + @@anchor_verifier.clear_trust_anchors + end + + def self.trust_anchors + return @@anchor_verifier.trust_anchors + end + + def self.clear_trusted_keys + [@@anchor_verifier, @@root_verifier, @@dlv_verifier].each {|v| + v.clear_trusted_keys + } + end + + def self.reset + @@validation_policy = ValidationPolicy::LOCAL_ANCHORS_THEN_ROOT + @@root_verifier = SingleVerifier.new(SingleVerifier::VerifierType::ROOT) + @@root_verifier.add_root_ds(@@root_key) + @@root_verifier.add_root_ds(@@root_key_new) + + @@dlv_verifier = SingleVerifier.new(SingleVerifier::VerifierType::DLV) + + # @TODO@ Could add a new one of these for each anchor. + @@anchor_verifier = SingleVerifier.new(SingleVerifier::VerifierType::ANCHOR) + @@do_validation_with_recursor = true # Many nameservers don't handle DNSSEC correctly yet + @@default_resolver = Resolver.new + end + + def self.set_hints(hints) + @@root_verifier.set_hints(hints) + @@anchor_verifier.set_hints(hints) + end + + def self.no_keys? + no_keys = true + [@@anchor_verifier, @@root_verifier, @@dlv_verifier].each {|v| + if (v.trusted_keys.length() > 0 || + v.trust_anchors.length() > 0) + no_keys = false + end + } + return no_keys + end + + @@do_validation_with_recursor = true # Many nameservers don't handle DNSSEC correctly yet + @@default_resolver = Resolver.new + # This method defines the choice of Resolver or Recursor, when the validator + # is checking responses. + # If set to true, then a Recursor will be used to query for the DNSSEC records. + # Otherwise, the default system resolver will be used. + def self.do_validation_with_recursor(on) + @@do_validation_with_recursor = on + end + def self.do_validation_with_recursor? + return @@do_validation_with_recursor + end + # This method overrides the system default resolver configuration for validation + # If default_resolver is set, then it will be used to follow the chain of trust. + # If it is not, then the default system resolver will be used (unless do_validation_with_recursor + # is set. + def self.default_resolver=(res) + @@default_resolver = res + end + def self.default_resolver + return @@default_resolver + end + + # Returns true for secure/insecure, false otherwise + # This method will set the security_level on msg to the appropriate value. + # Could be : secure, insecure, bogus or indeterminate + # If an error is encountered during verification, then the thrown exception + # will define the error. + def self.validate(msg) + query = Message.new() + query.header.cd=true + return self.validate_with_query(query, msg) + end + + def self.validate_with_query(query, msg) + if (!msg) + return false + end + # First, just check there is something to validate! + found_sigs = false + msg.each_resource {|rr| + if (rr.type == Types::RRSIG) + found_sigs = true + end + } + if (found_sigs) + begin + if (verify(msg)) + msg.security_level = Message::SecurityLevel.SECURE + return true + end + rescue VerifyError => e + msg.security_error = e + msg.security_level = Message::SecurityLevel.BOGUS + end + end + + # SHOULD ALWAYS VERIFY DNSSEC-SIGNED RESPONSES? + # Yes - if a trust anchor is configured. Otherwise, act on CD bit (in query) + TheLog.debug("Checking whether to validate, query.cd = #{query.header.cd}") + if (((@@validation_policy > ValidationPolicy::ALWAYS_ROOT_ONLY) && (self.trust_anchors().length > 0)) || + # Check query here, and validate if CD is true + ((query.header.cd == true))) # && (query.do_validation))) + TheLog.debug("Starting validation") + + # Validate! + # Need to think about trapping/storing exceptions and security_levels here + last_error = "" + last_level = Message::SecurityLevel.BOGUS + last_error_level = Message::SecurityLevel.BOGUS + if (@@validation_policy == ValidationPolicy::ALWAYS_LOCAL_ANCHORS_ONLY) + last_level, last_error, last_error_level = try_validation(last_level, last_error, last_error_level, + Proc.new{|m, q| validate_with_anchors(m, q)}, msg, query) + elsif (@@validation_policy == ValidationPolicy::ALWAYS_ROOT_ONLY) + last_level, last_error, last_error_level = try_validation(last_level, last_error, last_error_level, + Proc.new{|m, q| validate_with_root(m, q)}, msg, query) + elsif (@@validation_policy == ValidationPolicy::LOCAL_ANCHORS_THEN_ROOT) + last_level, last_error, last_error_level = try_validation(last_level, last_error, last_error_level, + Proc.new{|m, q| validate_with_anchors(m, q)}, msg, query) + if (last_level != Message::SecurityLevel.SECURE) + last_level, last_error, last_error_level = try_validation(last_level, last_error, last_error_level, + Proc.new{|m, q| validate_with_root(m, q)}, msg, query) + end + elsif (@@validation_policy == ValidationPolicy::ROOT_THEN_LOCAL_ANCHORS) + last_level, last_error, last_error_level = try_validation(last_level, last_error, last_error_level, + Proc.new{|m, q| validate_with_root(m, q)}, msg, query) + if (last_level != Message::SecurityLevel.SECURE) + last_level, last_error, last_error_level = try_validation(last_level, last_error, last_error_level, + Proc.new{|m, q| validate_with_anchors(m, q)}, msg, query) + end + end + if (last_level != Message::SecurityLevel.SECURE && last_level != Message::SecurityLevel.BOGUS) + last_level, last_error, last_error_level = try_validation(last_level, last_error, last_error_level, + Proc.new{|m, q| validate_with_dlv(m, q)}, msg, query) + end + # Set the message security level! + msg.security_level = last_level + msg.security_error = last_error + if (last_error && last_error.index("ification error")) + msg.security_level = Message::SecurityLevel.BOGUS + end + raise VerifyError.new(last_error) if (last_level < 0) + return (msg.security_level.code > Message::SecurityLevel::UNCHECKED) + end + msg.security_level = Message::SecurityLevel.UNCHECKED + return true + end + + def self.try_validation(last_level, last_error, last_error_level, proc, msg, query) # :nodoc: + begin + proc.call(msg, query) + last_level = Message::SecurityLevel.new([msg.security_level.code, last_level.code].max) + rescue VerifyError => e + if (last_error_level < last_level) + last_error = e.to_s + last_error_level = last_level + end + end + return last_level, last_error, last_error_level + end + + def self.validate_with_anchors(msg, query) + return @@anchor_verifier.validate(msg, query) + end + + def self.validate_with_root(msg, query) + return @@root_verifier.validate(msg, query) + end + + def self.validate_with_dlv(msg, query) + return @@dlv_verifier.validate(msg, query) + end + + def self.verify(msg, keys=nil) + begin + return true if @@anchor_verifier.verify(msg, keys) + rescue VerifyError + begin + return true if @@root_verifier.verify(msg, keys) + rescue VerifyError + return true if @@dlv_verifier.verify(msg, keys) # Will carry error to client + end + end + end + + def self.anchor_verifier + return @@anchor_verifier + end + def self.dlv_verifier + return @@dlv_verifier + end + def self.root_verifier + return @@root_verifier + end + + + + + def self.verify_rrset(rrset, keys = nil) + return ((@@anchor_verifier.verify_rrset(rrset, keys) || + @@root_verifier.verify_rrset(rrset, keys) || + @@dlv_verifier.verify_rrset(rrset, keys))) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/hosts.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/hosts.rb new file mode 100644 index 000000000000..9d1f11c852cc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/hosts.rb @@ -0,0 +1,130 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby +# == Dnsruby::Hosts class +# Dnsruby::Hosts is a hostname resolver that uses the system hosts file +# +# === class methods +# * Dnsruby::Hosts.new(hosts='/etc/hosts') +# +# === methods +# * Dnsruby::Hosts#getaddress(name) +# * Dnsruby::Hosts#getaddresses(name) +# * Dnsruby::Hosts#each_address(name) {|address| ...} +# address lookup methods. +# +# * Dnsruby::Hosts#getname(address) +# * Dnsruby::Hosts#getnames(address) +# * Dnsruby::Hosts#each_name(address) {|name| ...} +# hostnames lookup methods. +# + class Hosts + if /mswin32|cygwin|mingw|bccwin/ =~ RUBY_PLATFORM + require 'win32/resolv' + DefaultFileName = Win32::Resolv.get_hosts_path + else + DefaultFileName = '/etc/hosts' + end + + # Creates a new Dnsruby::Hosts using +filename+ for its data source + def initialize(filename = DefaultFileName) + @filename = filename + @mutex = Mutex.new + @initialized = nil + end + + def lazy_initialize# :nodoc: + @mutex.synchronize { + unless @initialized + @name2addr = {} + @addr2name = {} + begin + open(@filename) {|f| + f.each {|line| + line.sub!(/#.*/, '') + addr, hostname, *aliases = line.split(/\s+/) + next unless addr + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.8") + addr.untaint + hostname.untaint + end + @addr2name[addr] = [] unless @addr2name.include? addr + @addr2name[addr] << hostname + @addr2name[addr] += aliases + @name2addr[hostname] = [] unless @name2addr.include? hostname + @name2addr[hostname] << addr + aliases.each {|n| + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.8") + n.untaint + end + @name2addr[n] = [] unless @name2addr.include? n + @name2addr[n] << addr + } + } + } + rescue Exception + # Java won't find this file if running on Windows + end + @name2addr.each {|name, arr| arr.reverse!} + @initialized = true + end + } + self + end + + # Gets the first IP address for +name+ from the hosts file + def getaddress(name) + each_address(name) {|address| return address} + raise ResolvError.new("#{@filename} has no name: #{name}") + end + + # Gets all IP addresses for +name+ from the hosts file + def getaddresses(name) + ret = [] + each_address(name) {|address| ret << address} + return ret + end + + # Iterates over all IP addresses for +name+ retrieved from the hosts file + def each_address(name, &proc) + lazy_initialize + if @name2addr.include?(name) + @name2addr[name].each(&proc) + end + end + + # Gets the first hostname of +address+ from the hosts file + def getname(address) + each_name(address) {|name| return name} + raise ResolvError.new("#{@filename} has no address: #{address}") + end + + # Gets all hostnames for +address+ from the hosts file + def getnames(address) + ret = [] + each_name(address) {|name| ret << name} + return ret + end + + # Iterates over all hostnames for +address+ retrieved from the hosts file + def each_name(address, &proc) + lazy_initialize + if @addr2name.include?(address) + @addr2name[address].each(&proc) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/ipv4.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/ipv4.rb new file mode 100644 index 000000000000..5d10073430ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/ipv4.rb @@ -0,0 +1,74 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class IPv4 + # Regular expression IPv4 addresses must match + Regex = /\A(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\z/ + + def self.create(arg) + case arg + when IPv4 + return arg + when Regex + if (0..255) === (a = $1.to_i) && + (0..255) === (b = $2.to_i) && + (0..255) === (c = $3.to_i) && + (0..255) === (d = $4.to_i) + return self.new([a, b, c, d].pack("CCCC")) + else + raise ArgumentError.new("IPv4 address with invalid value: " + arg) + end + else + raise ArgumentError.new("cannot interpret as IPv4 address: #{arg.inspect}") + end + end + + def initialize(address) #:nodoc: + unless address.kind_of?(String) && address.length == 4 + raise ArgumentError.new('IPv4 address must be 4 bytes') + end + @address = address + end + + # A String representation of the IPv4 address. + attr_reader :address + + def to_s #:nodoc: + return sprintf("%d.%d.%d.%d", *@address.unpack("CCCC")) + end + + def inspect #:nodoc: + return "#<#{self.class} #{self.to_s}>" + end + + def to_name + return Name.create( + '%d.%d.%d.%d.in-addr.arpa.' % @address.unpack('CCCC').reverse) + end + + def ==(other) + return @address == other.address + end + + def eql?(other) + return self == other + end + + def hash + return @address.hash + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/ipv6.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/ipv6.rb new file mode 100644 index 000000000000..89bd433588cf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/ipv6.rb @@ -0,0 +1,144 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + # Dnsruby::IPv6 class + class IPv6 + # IPv6 address format a:b:c:d:e:f:g:h + Regex_8Hex = /\A + (?:[0-9A-Fa-f]{1,4}:){7} + [0-9A-Fa-f]{1,4} + \z/x + + # Compresses IPv6 format a::b + Regex_CompressedHex = /\A + ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) :: + ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) + \z/x + + # IPv4 mapped IPv6 address format a:b:c:d:e:f:w.x.y.z + Regex_6Hex4Dec = /\A + ((?:[0-9A-Fa-f]{1,4}:){6,6}) + (\d+)\.(\d+)\.(\d+)\.(\d+) + \z/x + + # Compressed IPv4 mapped IPv6 address format a::b:w.x.y.z + Regex_CompressedHex4Dec = /\A + ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) :: + ((?:[0-9A-Fa-f]{1,4}:)*) + (\d+)\.(\d+)\.(\d+)\.(\d+) + \z/x + + # A composite IPv6 address RegExp + Regex = / + (?:#{Regex_8Hex}) | + (?:#{Regex_CompressedHex}) | + (?:#{Regex_6Hex4Dec}) | + (?:#{Regex_CompressedHex4Dec})/x + + # Created a new IPv6 address from +arg+ which may be: + # + # * IPv6:: returns +arg+ + # * String:: +arg+ must match one of the IPv6::Regex* constants + def self.create(arg) + case arg + when IPv6 + return arg + when String + address = '' + if Regex_8Hex =~ arg + arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')} + elsif Regex_CompressedHex =~ arg + prefix = $1 + suffix = $2 + a1 = '' + a2 = '' + prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')} + suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')} + omitlen = 16 - a1.length - a2.length + address << a1 << "\0" * omitlen << a2 + elsif Regex_6Hex4Dec =~ arg + prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i + if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d + prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')} + address << [a, b, c, d].pack('CCCC') + else + raise ArgumentError.new("not numeric IPv6 address: " + arg) + end + elsif Regex_CompressedHex4Dec =~ arg + prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i + if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d + a1 = '' + a2 = '' + prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')} + suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')} + omitlen = 12 - a1.length - a2.length + address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC') + else + raise ArgumentError.new("not numeric IPv6 address: " + arg) + end + else + raise ArgumentError.new("not numeric IPv6 address: " + arg) + end + return IPv6.new(address) + else + raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}") + end + end + + def initialize(address) #:nodoc: + unless address.kind_of?(String) && address.length == 16 + raise ArgumentError.new('IPv6 address must be 16 bytes') + end + @address = address + end + + # The raw IPv6 address as a String + attr_reader :address + + def to_s + address = sprintf("%X:%X:%X:%X:%X:%X:%X:%X", *@address.unpack("nnnnnnnn")) + unless address.sub!(/(^|:)0(:0)+(:|$)/, '::') + address.sub!(/(^|:)0(:|$)/, '::') + end + return address + end + + def inspect #:nodoc: + return "#<#{self.class} #{self.to_s}>" + end + + # Turns this IPv6 address into a Dnsruby::Name + # -- + # ip6.arpa should be searched too. [RFC3152] + def to_name + return Name.create( + # @address.unpack("H32")[0].split(//).reverse + ['ip6', 'arpa']) + @address.unpack("H32")[0].split(//).reverse.join(".") + ".ip6.arpa") + end + + def ==(other) #:nodoc: + return @address == other.address + end + + def eql?(other) #:nodoc: + return self == other + end + + def hash + return @address.hash + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/key_cache.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/key_cache.rb new file mode 100644 index 000000000000..48fbeec0535b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/key_cache.rb @@ -0,0 +1,101 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +module Dnsruby + class KeyCache #:nodoc: all + # Cache includes expiration time for keys + # Cache removes expired records + def initialize(keys = nil) + # Store key tag against [expiry, key] + @keys = {} + add(keys) + end + def add_key_with_expiration(k, expiration) + priv_add_key(k, expiration) + end + def add(k) + if (k == nil) + return false + elsif (k.instance_of?RRSet) + add_rrset(k) + elsif (k.kind_of?KeyCache) + kaes = k.keys_and_expirations + kaes.keys.each { |keykey| + # priv_add_key(keykey, kaes[keykey]) + priv_add_key(keykey[1], keykey[0]) + } + else + raise ArgumentError.new("Expected an RRSet or KeyCache! Got #{k.class}") + end + return true + end + + def add_rrset(k) + # Get expiration from the RRSIG + # There can be several RRSIGs here, one for each key which has signed the RRSet + # We want to choose the one with the most secure signing algorithm, key length, + # and the longest expiration time - not easy! + # for now, we simply accept all signed keys + k.sigs.each { |sig| + if (sig.type_covered = Types.DNSKEY) + if (sig.inception <= Time.now.to_i) + # Check sig.expiration, sig.algorithm + if (sig.expiration > Time.now.to_i) + # add the keys to the store + k.rrs.each {|rr| priv_add_key(rr, sig.expiration)} + end + end + end + } + end + + def priv_add_key(k, exp) + # Check that the key does not already exist with a longer expiration! + if (@keys[k] == nil) + @keys[k.key_tag] = [exp,k] + elsif ((@keys[k])[0] < exp) + @keys[k.key_tag] = [exp,k] + end + end + + def each + # Only offer currently-valid keys here + remove_expired_keys + @keys.values.each {|v| yield v[1]} + end + def keys + # Only offer currently-valid keys here + remove_expired_keys + ks = [] + @keys.values.each {|a| ks.push(a[1])} + return ks + # return @keys.keys + end + def keys_and_expirations + remove_expired_keys + return keys.values + end + def remove_expired_keys + @keys.delete_if {|k,v| + v[0] < Time.now.to_i + } + end + def find_key_for(name) + each {|key| return key if key.name == name} + return false + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/decoder.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/decoder.rb new file mode 100644 index 000000000000..8f57fd98bb60 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/decoder.rb @@ -0,0 +1,179 @@ +module Dnsruby + +# This class decodes a binary string containing the raw bytes of the message +# as in coming over the wire from a nameserver, and parses it into a +# Dnsruby::Message. +class MessageDecoder #:nodoc: all + + # Keeps a running @index containing the current position (like a cursor) + # into the binary string. In general 'get_' methods will position @index + # to follow the data they have read. + + attr_reader :data, :index + + # Creates an instance of the decoder, optionally with code block + # to be executed with the instance as its parameter. + def initialize(data) + @data = data + @index = 0 + @limit = data.length + yield self if block_given? + end + + # Has bytes remaining in the binary string to be parsed? + def has_remaining? + @limit > @index + end + + # Asserts that the specified position is a valid position in the buffer. + # If not, raises a DecodeError. If so, does nothing. + def assert_buffer_position_valid(end_position) + unless (0..@limit).include?(end_position) + raise DecodeError.new("requested position of #{end_position} must be between 0 and buffer size (#{@limit}).") + end + end + + # Gets the byte value at the specified position + def get_byte_at(position) + assert_buffer_position_valid(position) + return nil if @data[position].nil? + @data[position].getbyte(0) + end + + # Gets a 16-bit length field from the binary string and yields to the block. + # This will be the length of the next item to parse in the binary string. + # Returns the object returned from that block. + # + # When this method returns, @index will point to the byte after the + # 16-bit length field. + def get_length16 + len, = self.get_unpack('n') + save_limit = @limit + @limit = @index + len + parsed_data = yield(len) + if @index < @limit + message = "Junk exists; limit = #{@limit}, index = #{@index}" + raise DecodeError.new(message) + end + assert_buffer_position_valid(@index) + @limit = save_limit + parsed_data + end + + # Returns the specified number of bytes from the binary string. + # Length defaults to the remaining (not yet processed) size of the string. + def get_bytes(len = @limit - @index) + bytes = @data[@index, len] + @index += len + bytes + end + + # Calls String.unpack to get numbers as specified in the template string. + def get_unpack(template) + len = 0 + + template.bytes.each do |byte| + case byte.chr + when 'c', 'C', 'h', 'H' + len += 1 + when 'n' + len += 2 + when 'N' + len += 4 + when '*' + len = @limit - @index + else + raise StandardError.new("unsupported template: '#{byte.chr}' in '#{template}'") + end + end + + assert_buffer_position_valid(@index + len) + number_array = @data.unpack("@#{@index}#{template}") + @index += len + number_array + end + + # Gets a string whose 1-byte length is at @index, and the string starting at @index + 1. + def get_string + len = get_byte_at(@index) || 0 + assert_buffer_position_valid(@index + 1 + len) + data_item = @data[@index + 1, len] + @index += 1 + len + data_item + end + + # Gets all strings from @index to the end of the binary string. + def get_string_list + strings = [] + strings << get_string while has_remaining? + strings + end + + # Gets a Name from the current @index position. + def get_name + Name.new(get_labels) + end + + # Returns labels starting at @index. + def get_labels(limit = nil) + limit = @index if limit.nil? || (@index < limit) + labels = [] + while true + temp = get_byte_at(@index) + case temp + when 0 + @index += 1 + return labels + when 192..255 + idx = get_unpack('n')[0] & 0x3fff + if limit <= idx + raise DecodeError.new('non-backward name pointer') + end + save_index = @index + @index = idx + labels += self.get_labels(limit) + @index = save_index + return labels + when nil + return labels + else + labels << self.get_label + end + end + labels + end + + # Gets a single label. + def get_label + begin + Name::Label.new(get_string) + rescue ResolvError => e + raise DecodeError.new(e) # Turn it into something more suitable + end + end + + # Gets a question record. + def get_question + name = self.get_name + type, klass = self.get_unpack('nn') + klass = Classes.new(klass) + Question.new(name, type, klass) + end + + # Gets a resource record. + def get_rr + name = get_name + type, klass, ttl = get_unpack('nnN') + klass = Classes.new(klass) + typeclass = RR.get_class(type, klass) + # @TODO@ Trap decode errors here, and somehow mark the record as bad. + # Need some way to represent raw data only + record = get_length16 { typeclass.decode_rdata(self) } + record.name = name + record.ttl = ttl + record.type = type + record.klass = klass + record + end +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/encoder.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/encoder.rb new file mode 100644 index 000000000000..fd0a58c034ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/encoder.rb @@ -0,0 +1,83 @@ +module Dnsruby +class MessageEncoder #:nodoc: all + def initialize + @data = '' + @names = {} + yield self if block_given? + end + + def to_s + @data + end + + def put_bytes(d) + @data << d + end + + def put_pack(template, *d) + begin + @data << d.pack(template) + rescue Encoding::CompatibilityError => e + raise Dnsruby::EncodeError.new("IDN support currently requires punycode string") + end + end + + def put_length16 + length_index = @data.length + @data << "\0\0" + data_start = @data.length + yield + data_end = @data.length + @data[length_index, 2] = [data_end - data_start].pack("n") + end + + def put_string(d) + begin + self.put_pack("C", d.length) + @data << d + rescue Encoding::CompatibilityError => e + raise Dnsruby::EncodeError.new("IDN support currently requires punycode string") + end + end + + def put_string_list(ds) + ds.each { |d| self.put_string(d) } + end + + def put_rr(rr, canonical=false) + # RFC4034 Section 6.2 + put_name(rr.name, canonical) + put_pack('nnN', rr.type.code, rr.klass.code, rr.ttl) + put_length16 { rr.encode_rdata(self, canonical) } + end + + def put_name(d, canonical = false, downcase = canonical) + # DNSSEC requires some records (e.g. NSEC, RRSIG) to be canonicalised, but + # not downcased. YUK! + d = d.downcase if downcase + put_labels(d.to_a, canonical) + end + + def put_labels(d, do_canonical) + d.each_index do |i| + domain = d[i..-1].join('.') + if !do_canonical && (idx = @names[domain]) + self.put_pack('n', 0xc000 | idx) + return + else + @names[domain] = @data.length + self.put_label(d[i]) + end + end + @data << "\0" + end + + + def put_label(d) + # s, = Name.encode(d) + s = d + raise RuntimeError, "length of #{s} is #{s.string.length} (larger than 63 octets)" if s.string.length > 63 + self.put_string(s.string) + end +end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/header.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/header.rb new file mode 100644 index 000000000000..1e3708015f94 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/header.rb @@ -0,0 +1,249 @@ +module Dnsruby + +# The header portion of a DNS packet +# +# RFC 1035 Section 4.1.1 +class Header + MAX_ID = 65535 + + # The header ID + attr_accessor :id + + # The query response flag + attr_accessor :qr + + # Authoritative answer flag + attr_accessor :aa + + # Truncated flag + attr_accessor :tc + + # Recursion Desired flag + attr_accessor :rd + + # The Checking Disabled flag + attr_accessor :cd + + # The Authenticated Data flag + # Relevant in DNSSEC context. + # (The AD bit is only set on answers where signatures have been + # cryptographically verified or the server is authoritative for the data + # and is allowed to set the bit by policy.) + attr_accessor :ad + + # The query response flag + attr_accessor :qr + + # Recursion available flag + attr_accessor :ra + + # Query response code + # deprecated - use Message#rcode + # attr_reader :rcode + + # This new get_header_rcode method is intended for use only by the Message class. + # This is because the Message OPT section may contain an extended rcode (see + # RFC 2671 section 4.6). Using the header rcode only ignores this extension, and + # is not recommended. + def get_header_rcode + @rcode + end + + # The header opcode + attr_reader :opcode + + # The number of records in the question section of the message + attr_accessor :qdcount + # The number of records in the authoriy section of the message + attr_accessor :nscount + # The number of records in the answer section of the message + attr_accessor :ancount + # The number of records in the additional record section og the message + attr_accessor :arcount + + def initialize(*args) + if (args.length == 0) + @id = rand(MAX_ID) + @qr = false + @opcode = OpCode.Query + @aa = false + @ad = false + @tc = false + @rd = false # recursion desired + @ra = false # recursion available + @cd = false + @rcode = RCode.NoError + @qdcount = 0 + @nscount = 0 + @ancount = 0 + @arcount = 0 + elsif args.length == 1 + decode(args[0]) + end + end + + def opcode=(op) + @opcode = OpCode.new(op) + end + + def rcode=(rcode) + @rcode = RCode.new(rcode) + end + + def Header.new_from_data(data) + header = Header.new + MessageDecoder.new(data) { |msg| header.decode(msg) } + header + end + + def data + MessageEncoder.new { |msg| self.encode(msg) }.to_s + end + + def encode(msg) + msg.put_pack('nnnnnn', + @id, + (@qr ? 1:0) << 15 | + (@opcode.code & 15) << 11 | + (@aa ? 1:0) << 10 | + (@tc ? 1:0) << 9 | + (@rd ? 1:0) << 8 | + (@ra ? 1:0) << 7 | + (@ad ? 1:0) << 5 | + (@cd ? 1:0) << 4 | + (@rcode.code & 15), + @qdcount, + @ancount, + @nscount, + @arcount) + end + + def Header.decrement_arcount_encoded(bytes) + header = Header.new + header_end = 0 + MessageDecoder.new(bytes) do |msg| + header.decode(msg) + header_end = msg.index + end + header.arcount -= 1 + bytes[0, header_end] = MessageEncoder.new { |msg| header.encode(msg) }.to_s + bytes + end + + def ==(other) + @qr == other.qr && + @opcode == other.opcode && + @aa == other.aa && + @tc == other.tc && + @rd == other.rd && + @ra == other.ra && + @cd == other.cd && + @ad == other.ad && + @rcode == other.get_header_rcode + end + + def to_s + to_s_with_rcode(@rcode) + end + + def old_to_s + old_to_s_with_rcode(@rcode) + end + + def to_s_with_rcode(rcode) + + if @opcode == OpCode::Update + s = ";; id = #{@id}\n" + s << ";; qr = #{@qr} opcode = #{@opcode.string} rcode = #{@rcode.string}\n" + s << ";; zocount = #{@qdcount} " + s << "prcount = #{@ancount} " + s << "upcount = #{@nscount} " + s << "adcount = #{@arcount}\n" + s + else + + flags_str = begin + flags = [] + flags << 'qr' if @qr + flags << 'aa' if @aa + flags << 'tc' if @tc + flags << 'rd' if @rd + flags << 'ra' if @ra + flags << 'ad' if @ad + flags << 'cd' if @cd + + ";; flags: #{flags.join(' ')}; " + end + + head_line_str = + ";; ->>HEADER<<- opcode: #{opcode.string.upcase}, status: #{@rcode.string}, id: #{@id}\n" + + section_counts_str = + "QUERY: #{@qdcount}, ANSWER: #{@ancount}, AUTHORITY: #{@nscount}, ADDITIONAL: #{@arcount}\n" + + head_line_str + flags_str + section_counts_str + end + end + + + def old_to_s_with_rcode(rcode) + retval = ";; id = #{@id}\n" + + if (@opcode == OpCode::Update) + retval += ";; qr = #{@qr} " \ + "opcode = #{@opcode.string} "\ + "rcode = #{@rcode.string}\n" + + retval += ";; zocount = #{@qdcount} "\ + "prcount = #{@ancount} " \ + "upcount = #{@nscount} " \ + "adcount = #{@arcount}\n" + else + retval += ";; qr = #{@qr} " \ + "opcode = #{@opcode.string} " \ + "aa = #{@aa} " \ + "tc = #{@tc} " \ + "rd = #{@rd}\n" + + retval += ";; ra = #{@ra} " \ + "ad = #{@ad} " \ + "cd = #{@cd} " \ + "rcode = #{rcode.string}\n" + + retval += ";; qdcount = #{@qdcount} " \ + "ancount = #{@ancount} " \ + "nscount = #{@nscount} " \ + "arcount = #{@arcount}\n" + end + + retval + end + + def decode(msg) + @id, flag, @qdcount, @ancount, @nscount, @arcount = + msg.get_unpack('nnnnnn') + @qr = ((flag >> 15) & 1) == 1 + @opcode = OpCode.new((flag >> 11) & 15) + @aa = ((flag >> 10) & 1) == 1 + @tc = ((flag >> 9) & 1) == 1 + @rd = ((flag >> 8) & 1) == 1 + @ra = ((flag >> 7) & 1) == 1 + @ad = ((flag >> 5) & 1) == 1 + @cd = ((flag >> 4) & 1) == 1 + @rcode = RCode.new(flag & 15) + end + + alias zocount qdcount + alias zocount= qdcount= + + alias prcount ancount + alias prcount= ancount= + + alias upcount nscount + alias upcount= nscount= + + alias adcount arcount + alias adcount= arcount= + +end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/message.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/message.rb new file mode 100644 index 000000000000..adfcef318471 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/message.rb @@ -0,0 +1,641 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require 'dnsruby/name' +require 'dnsruby/resource/resource' + +module Dnsruby + # ===Defines a DNS packet. + # + # RFC 1035 Section 4.1, RFC 2136 Section 2, RFC 2845 + # + # ===Sections + # Message objects have five sections: + # + # * The header section, a Dnsruby::Header object. + # + # msg.header=Header.new(...) + # header = msg.header + # + # * The question section, an array of Dnsruby::Question objects. + # + # msg.add_question(Question.new(domain, type, klass)) + # msg.each_question do |question| .... end + # + # * The answer section, an array of Dnsruby::RR objects. + # + # msg.add_answer(RR.create({:name => 'a2.example.com', + # :type => 'A', :address => '10.0.0.2'})) + # msg.each_answer {|answer| ... } + # + # * The authority section, an array of Dnsruby::RR objects. + # + # msg.add_authority(rr) + # msg.each_authority {|rr| ... } + # + # * The additional section, an array of Dnsruby::RR objects. + # + # msg.add_additional(rr) + # msg.each_additional {|rr| ... } + # + # In addition, each_resource iterates the answer, additional + # and authority sections : + # + # msg.each_resource {|rr| ... } + # + # ===Packet format encoding + # + # Dnsruby::Message#encode + # Dnsruby::Message::decode(data) + # + # ===Additional information + # security_level records the current DNSSEC status of this Message. + # answerfrom records the server which this Message was received from. + # cached records whether this response came from the cache. + # + class Message + + # The security level (see RFC 4035 section 4.3) + class SecurityLevel < CodeMapper + INDETERMINATE = -2 + BOGUS = -1 + UNCHECKED = 0 + INSECURE = 1 + SECURE = 2 + update + end + + # If dnssec is set on, then each message will have the security level set + # To find the precise error (if any), call Dnsruby::Dnssec::validate(msg) - + # the resultant exception will define the error. + attr_accessor :security_level + + # If there was a problem verifying this message with DNSSEC, then securiy_error + # will hold a description of the problem. It defaults to '' + attr_accessor :security_error + + # If the Message was returned from the cache, the cached flag will be set + # true. It will be false otherwise. + attr_accessor :cached + + + + # Create a new Message. Takes optional name, type and class + # + # type defaults to A, and klass defaults to IN + # + # * Dnsruby::Message.new('example.com') # defaults to A, IN + # * Dnsruby::Message.new('example.com', 'AAAA') + # * Dnsruby::Message.new('example.com', Dnsruby::Types.PTR, 'HS') + # + def initialize(*args) + @header = Header.new() + # @question = Section.new(self) + @question = [] + @answer = Section.new(self) + @authority = Section.new(self) + @additional = Section.new(self) + @tsigstate = :Unsigned + @signing = false + @tsigkey = nil + @answerfrom = nil + @answerip = nil + @send_raw = false + @do_validation = true + @do_caching = true + @security_level = SecurityLevel.UNCHECKED + @security_error = nil + @cached = false + type = Types::A + klass = Classes::IN + if (args.length > 0) + name = args[0] + if (args.length > 1) + type = Types.new(args[1]) + if (args.length > 2) + klass = Classes.new(args[2]) + end + end + add_question(name, type, klass) + end + end + + # The question section, an array of Dnsruby::Question objects. + attr_reader :question + + # The answer section, an array of Dnsruby::RR objects. + attr_reader :answer + # The authority section, an array of Dnsruby::RR objects. + attr_reader :authority + # The additional section, an array of Dnsruby::RR objects. + attr_reader :additional + # The header section, a Dnsruby::Header object. + attr_accessor :header + + # If this Message is a response from a server, then answerfrom contains the address of the server + attr_accessor :answerfrom + + # If this Message is a response from a server, then answerfrom contains the IP address of the server + attr_accessor :answerip + + # If this Message is a response from a server, then answersize contains the size of the response + attr_accessor :answersize + + # If this message has been verified using a TSIG RR then tsigerror contains + # the error code returned by the TSIG verification. The error will be an RCode + attr_accessor :tsigerror + + # Can be + # * :Unsigned - the default state + # * :Signed - the outgoing message has been signed + # * :Verified - the incoming message has been verified by TSIG + # * :Intermediate - the incoming message is an intermediate envelope in a TCP session + # in which only every 100th envelope must be signed + # * :Failed - the incoming response failed verification + attr_accessor :tsigstate + + # -- + attr_accessor :tsigstart + # ++ + + # Set send_raw if you wish to send and receive the response to this Message + # with no additional processing. In other words, if set, then Dnsruby will + # not touch the Header of the outgoing Message. This option does not affect + # caching or dnssec validation + # + # This option should not normally be set. + attr_accessor :send_raw + + # do_validation is set by default. If you do not wish dnsruby to validate + # this message (on a Resolver with @dnssec==true), then set do_validation + # to false. This option does not affect caching, or the header options + attr_accessor :do_validation + + # do_caching is set by default. If you do not wish dnsruby to inspect the + # cache before sending the query, nor cache the result of the query, then + # set do_caching to false. + attr_accessor :do_caching + + def get_exception + exception = nil + if rcode == RCode.NXDOMAIN + exception = NXDomain.new + elsif rcode == RCode.SERVFAIL + exception = ServFail.new + elsif rcode == RCode.FORMERR + exception = FormErr.new + elsif rcode == RCode.NOTIMP + exception = NotImp.new + elsif rcode == RCode.REFUSED + exception = Refused.new + elsif rcode == RCode.NOTZONE + exception = NotZone.new + elsif rcode == RCode.NOTAUTH + exception = NotAuth.new + elsif rcode == RCode.NXRRSET + exception = NXRRSet.new + elsif rcode == RCode.YXRRSET + exception = YXRRSet.new + elsif rcode == RCode.YXDOMAIN + exception = YXDomain.new + elsif rcode >= RCode.BADSIG && rcode <= RCode.BADALG + return VerifyError.new # @TODO@ + end + exception + end + + def ==(other) + other.kind_of?(Message) && + @header == other.header && + @question[0] == other.question[0] && + @answer == other.answer && + @authority == other.authority && + @additional == other.additional + end + + def remove_additional + @additional = Section.new(self) + @header.arcount = 0 + end + + # Return the first rrset of the specified attributes in the message + def rrset(name, type, klass = Classes::IN) + [@answer, @authority, @additional].each do |section| + if (rrset = section.rrset(name, type, klass)).length > 0 + return rrset + end + end + RRSet.new + end + + # Return the rrsets of the specified type in the message + def rrsets(type, klass=Classes::IN) + rrsetss = [] + [@answer, @authority, @additional].each do |section| + if (rrsets = section.rrsets(type, klass)).length > 0 + rrsets.each { |rrset| rrsetss.push(rrset) } + end + end + rrsetss + end + + # Return a hash, with the section as key, and the RRSets in that + # section as the data : {section => section_rrs} + def section_rrsets(type = nil, include_opt = false) + ret = {} + %w(answer authority additional).each do |section| + ret[section] = self.send(section).rrsets(type, include_opt) + end + ret + end + + # Add a new Question to the Message. Takes either a Question, + # or a name, and an optional type and class. + # + # * msg.add_question(Question.new('example.com', 'MX')) + # * msg.add_question('example.com') # defaults to Types.A, Classes.IN + # * msg.add_question('example.com', Types.LOC) + def add_question(question, type=Types.A, klass=Classes.IN) + unless question.kind_of?(Question) + question = Question.new(question, type, klass) + end + @question << question + update_counts + end + + def each_question + @question.each {|rec| + yield rec + } + end + + def update_counts # :nodoc:all + @header.ancount = @answer.length + @header.arcount = @additional.length + @header.qdcount = @question.length + @header.nscount = @authority.length + end + + def _add_answer(rr, force = false) + if force || (! @answer.include?(rr)) + @answer << rr + update_counts + end + end; private :_add_answer + + # Adds an RR to the answer section unless it already occurs. + def add_answer(rr) #:nodoc: all + _add_answer(rr) + end + + # When adding an RR to a Dnsruby::Message, add_answer checks to see if it already occurs, + # and, if so, does not add it again. This method adds the record whether or not + # it already occurs. This is needed in order to add + # a SOA record twice for an AXFR response. + def add_answer!(rr) + _add_answer(rr, true) + end + + + def each_answer + @answer.each {|rec| + yield rec + } + end + + def add_authority(rr) #:nodoc: all + unless @authority.include?(rr) + @authority << rr + update_counts + end + end + + def each_authority + @authority.each {|rec| + yield rec + } + end + + def add_additional(rr) #:nodoc: all + unless @additional.include?(rr) + @additional << rr + update_counts + end + end + + def each_additional + @additional.each { |rec| yield rec } + end + + # Yields each section (question, answer, authority, additional) + def each_section + [@answer, @authority, @additional].each { |section| yield section} + end + + # Calls each_answer, each_authority, each_additional + def each_resource + each_answer {|rec| yield rec} + each_authority {|rec| yield rec} + each_additional {|rec| yield rec} + end + + # Returns the TSIG record from the ADDITIONAL section, if one is present. + def tsig + if @additional.last + if @additional.last.rr_type == Types.TSIG + return @additional.last + end + end + nil + end + + # Sets the TSIG to sign this message with. Can either be a Dnsruby::RR::TSIG + # object, or it can be a (name, key) tuple, or it can be a hash which takes + # Dnsruby::RR::TSIG attributes (e.g. name, key, fudge, etc.) + def set_tsig(*args) + if args.length == 1 + if args[0].instance_of?(RR::TSIG) + @tsigkey = args[0] + elsif args[0].instance_of?(Hash) + @tsigkey = RR.create({:type=>'TSIG', :klass=>'ANY'}.merge(args[0])) + else + raise ArgumentError.new('Wrong type of argument to Dnsruby::Message#set_tsig - should be TSIG or Hash') + end + elsif args.length == 2 + @tsigkey = RR.create({:type=>'TSIG', :klass=>'ANY', :name=>args[0], :key=>args[1]}) + else + raise ArgumentError.new('Wrong number of arguments to Dnsruby::Message#set_tsig') + end + end + + # Was this message signed by a TSIG? + def signed? + @tsigstate == :Signed || + @tsigstate == :Verified || + @tsigstate == :Failed + end + + # If this message was signed by a TSIG, was the TSIG verified? + def verified? + @tsigstate == :Verified + end + + def get_opt + @additional.detect { |r| r.type == Types::OPT } + end + + def rcode + rcode = @header.get_header_rcode + opt = get_opt + if opt + rcode = rcode.code + (opt.xrcode.code << 4) + rcode = RCode.new(rcode) + end + rcode + end + + def to_s + s = '' # the output string to return + + if @answerfrom && (! @answerfrom.empty?) + s << ";; Answer received from #{@answerfrom} (#{@answersize} bytes)\n;;\n" + end + + s << ";; Security Level : #{@security_level.string}\n" + + # OPT pseudosection? EDNS flags, udpsize + opt = get_opt + + if opt + s << @header.to_s_with_rcode(rcode) << "\n#{opt}\n" + else + s << "#{@header}\n" + end + + section = (@header.opcode == OpCode.UPDATE) ? 'ZONE' : 'QUESTION' + s << ";; #{section} SECTION (#{@header.qdcount} record#{@header.qdcount == 1 ? '' : 's'})\n" + each_question { |qr| s << ";; #{qr}\n" } + + if @answer.size > 0 + s << "\n" + section = (@header.opcode == OpCode.UPDATE) ? 'PREREQUISITE' : 'ANSWER' + s << ";; #{section} SECTION (#{@header.ancount} record#{@header.ancount == 1 ? '' : 's'})\n" + each_answer { |rr| s << "#{rr}\n" } + end + + if @authority.size > 0 + s << "\n" + section = (@header.opcode == OpCode.UPDATE) ? 'UPDATE' : 'AUTHORITY' + s << ";; #{section} SECTION (#{@header.nscount} record#{@header.nscount == 1 ? '' : 's'})\n" + each_authority { |rr| s << rr.to_s + "\n" } + end + + if (@additional.size > 0 && !opt) || (@additional.size > 1) + s << "\n;; ADDITIONAL SECTION (#{@header.arcount} record#{@header.arcount == 1 ? '' : 's'})\n" + each_additional { |rr| + if rr.type != Types::OPT + s << rr.to_s+ "\n" + end + } + end + + s + end + + + def old_to_s + retval = '' + + if (@answerfrom != nil && @answerfrom != '') + retval = retval + ";; Answer received from #{@answerfrom} (#{@answersize} bytes)\n;;\n" + end + retval = retval + ";; Security Level : #{@security_level.string}\n" + + retval = retval + ";; HEADER SECTION\n" + + # OPT pseudosection? EDNS flags, udpsize + opt = get_opt + if (!opt) + retval = retval + @header.old_to_s + else + retval = retval + @header.old_to_s_with_rcode(rcode()) + end + retval = retval + "\n" + + if (opt) + retval = retval + opt.to_s + retval = retval + "\n" + end + + section = (@header.opcode == OpCode.UPDATE) ? "ZONE" : "QUESTION" + retval = retval + ";; #{section} SECTION (#{@header.qdcount} record#{@header.qdcount == 1 ? '' : 's'})\n" + each_question { |qr| + retval = retval + ";; #{qr.to_s}\n" + } + + if (@answer.size > 0) + retval = retval + "\n" + section = (@header.opcode == OpCode.UPDATE) ? "PREREQUISITE" : "ANSWER" + retval = retval + ";; #{section} SECTION (#{@header.ancount} record#{@header.ancount == 1 ? '' : 's'})\n" + each_answer { |rr| + retval = retval + rr.to_s + "\n" + } + end + + if (@authority.size > 0) + retval = retval + "\n" + section = (@header.opcode == OpCode.UPDATE) ? "UPDATE" : "AUTHORITY" + retval = retval + ";; #{section} SECTION (#{@header.nscount} record#{@header.nscount == 1 ? '' : 's'})\n" + each_authority { |rr| + retval = retval + rr.to_s + "\n" + } + end + + if ((@additional.size > 0 && !opt) || (@additional.size > 1)) + retval = retval + "\n" + retval = retval + ";; ADDITIONAL SECTION (#{@header.arcount} record#{@header.arcount == 1 ? '' : 's'})\n" + each_additional { |rr| + if (rr.type != Types::OPT) + retval = retval + rr.to_s+ "\n" + end + } + end + + retval + end + + # Signs the message. If used with no arguments, then the message must have already + # been set (set_tsig). Otherwise, the arguments can either be a Dnsruby::RR::TSIG + # object, or a (name, key) tuple, or a hash which takes + # Dnsruby::RR::TSIG attributes (e.g. name, key, fudge, etc.) + # + # NOTE that this method should only be called by the resolver, rather than the + # client code. To use signing from the client, call Dnsruby::Resolver#tsig= + def sign!(*args) #:nodoc: all + if args.length > 0 + set_tsig(*args) + sign! + else + if @tsigkey && (@tsigstate == :Unsigned) + @tsigkey.apply(self) + end + end + end + + # Return the encoded form of the message + # If there is a TSIG record present and the record has not been signed + # then sign it + def encode(canonical=false) + if @tsigkey && (@tsigstate == :Unsigned) && !@signing + @signing = true + sign! + @signing = false + end + + return MessageEncoder.new { |msg| + header = @header + header.encode(msg) + @question.each { |q| + msg.put_name(q.qname) + msg.put_pack('nn', q.qtype.code, q.qclass.code) + } + [@answer, @authority, @additional].each { |rr| + rr.each { |r| + msg.put_rr(r, canonical) + } + } + }.to_s + end + + # Decode the encoded message + def Message.decode(m) + o = Message.new() + begin + MessageDecoder.new(m) {|msg| + o.header = Header.new(msg) + o.header.qdcount.times { + question = msg.get_question + o.question << question + } + o.header.ancount.times { + rr = msg.get_rr + o.answer << rr + } + o.header.nscount.times { + rr = msg.get_rr + o.authority << rr + } + o.header.arcount.times { |count| + start = msg.index + rr = msg.get_rr + if rr.type == Types::TSIG + if count != o.header.arcount-1 + Dnsruby.log.Error('Incoming message has TSIG record before last record') + raise DecodeError.new('TSIG record present before last record') + end + o.tsigstart = start # needed for TSIG verification + end + o.additional << rr + } + } + rescue DecodeError => e + # So we got a decode error + # However, we might have been able to fill in many parts of the message + # So let's raise the DecodeError, but add the partially completed message + e.partial_message = o + raise e + end + o + end + + def clone + Message.decode(self.encode) + end + + # In dynamic update packets, the question section is known as zone and + # specifies the zone to be updated. + alias :zone :question + alias :add_zone :add_question + alias :each_zone :each_question + + # In dynamic update packets, the answer section is known as pre or + # prerequisite and specifies the RRs or RRsets which must or + # must not preexist. + alias :pre :answer + alias :add_pre :add_answer + alias :each_pre :each_answer + + # In dynamic update packets, the answer section is known as pre or + # prerequisite and specifies the RRs or RRsets which must or + # must not preexist. + alias :prerequisite :pre + alias :add_prerequisite :add_pre + alias :each_prerequisite :each_pre + + # In dynamic update packets, the authority section is known as update and + # specifies the RRs or RRsets to be added or delted. + alias :update :authority + alias :add_update :add_authority + alias :each_update :each_authority + + end +end + +require 'dnsruby/message/section' +require 'dnsruby/message/header' +require 'dnsruby/message/decoder' +require 'dnsruby/message/encoder' +require 'dnsruby/message/question' diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/question.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/question.rb new file mode 100644 index 000000000000..a1338368c865 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/question.rb @@ -0,0 +1,86 @@ +# A Dnsruby::Question object represents a record in the +# question section of a DNS packet. +# +# RFC 1035 Section 4.1.2 +module Dnsruby +class Question + + # The Question name + attr_reader :qname + # The Question type + attr_reader :qtype + # The Question class + attr_reader :qclass + + # Creates a question object from the domain, type, and class passed + # as arguments. + # + # If a String is passed in, a Name, IPv4 or IPv6 object is created. + # + # If an IPv4 or IPv6 object is used then the type is set to PTR. + def initialize(qname, qtype = :not_provided, qclass = :not_provided) + + raise ArgumentError.new('qname must not be nil') if qname.nil? + + @qtype = (qtype == :not_provided) ? Types::A : Types.new(qtype) + @qclass = (qclass == :not_provided) ? Classes::IN : Classes.new(qclass) + set_qname(qname, qtype == :not_provided) + end + + def qtype=(qtype) + @qtype = Types.new(qtype) + end + + def qclass=(qclass) + @qclass = Classes.new(qclass) + end + + def set_qname(qname, write_PTR_to_qtype_if_ip = true) + is_ipv4_addr_string = qname.is_a?(String) && IPv4::Regex.match(qname) + is_ipv6_addr_string = qname.is_a?(String) && IPv6::Regex.match(qname) + is_ip_addr_string = is_ipv4_addr_string || is_ipv6_addr_string + + is_ip_addr = [IPv4, IPv6].any? { |klass| qname.is_a?(klass) } + + if is_ipv4_addr_string + @qname = IPv4.create(qname).to_name + elsif is_ipv6_addr_string + @qname = IPv6.create(qname).to_name + else + @qname = Name.create(qname) + end + + # If the name looks like an IP address then do an appropriate + # PTR query, unless the user specified the qtype + if write_PTR_to_qtype_if_ip && (is_ip_addr || is_ip_addr_string) + @qtype = Types.PTR + end + @qname.absolute = true + end + + def qname=(qname) + set_qname(qname, true) + end + + def ==(other) + other.is_a?(Question) && + self.qname == other.qname && + self.qtype == other.qtype && + self.qclass == Classes.new(other.qclass) + end + + # Returns a string representation of the question record. + def to_s + "#{@qname}.\t#{@qclass.string}\t#{@qtype.string}" + end + + # For Updates, the qname field is redefined to zname (RFC2136, section 2.3) + alias zname qname + # For Updates, the qtype field is redefined to ztype (RFC2136, section 2.3) + alias ztype qtype + # For Updates, the qclass field is redefined to zclass (RFC2136, section 2.3) + alias zclass qclass + + alias type qtype +end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/section.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/section.rb new file mode 100644 index 000000000000..ce02cb14cb0f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/message/section.rb @@ -0,0 +1,96 @@ +module Dnsruby +class Section < Array + + def initialize(msg = nil) + @msg = msg + super(0) + end + + # Return the rrset of the specified type in this section + def rrset(name, type=Types.A, klass=Classes::IN) + rrs = select{|rr| + type_ok = (rr.type==type) + if rr.type == Types::RRSIG + type_ok = (rr.type_covered == type) + end + unless /\.\z/ =~ name.to_s + name = name.to_s + '.' + end + type_ok && (rr.klass == klass) && (rr.name.to_s(true).downcase == name.to_s().downcase) + } + rrset = RRSet.new() + rrs.each do |rr| + rrset.add(rr) + end + rrset + end + + # Return an array of all the rrsets in the section + def rrsets(type = nil, include_opt = false) + if type && !(Types === type) + type = Types.new(type) + end + ret = [] + each do |rr| + next if (!include_opt && (rr.type == Types::OPT)) + # if (type) + # next if ((rr.type == Types.RRSIG) && (type != Types.RRSIG) && (rr.type_covered != type)) + # next if (rr.type != type) + # end + if (type) + # if this is an rrsig type, then : + # only include it if the type_covered is the type requested, + # OR if the type requested is an RRSIG + if rr.type == Types::RRSIG + if (rr.type_covered == type) || (type == Types::RRSIG) + else + next + end + # next if ((rr.type_covered != type) || (type != Types.RRSIG)) + elsif rr.type != type + next + end + end + + found_rrset = false + ret.each do |rrset| + found_rrset = rrset.add(rr) + break if found_rrset + end + unless found_rrset + ret.push(RRSet.new(rr)) + end + end + ret + end + + def ==(other) + return false unless self.class == other.class + return false if other.rrsets(nil, true).length != self.rrsets(nil, true).length + + otherrrsets = other.rrsets(nil) + self.rrsets(nil).each {|rrset| + return false unless otherrrsets.include?(rrset) + } + + true + end + + def remove_rrset(name, type) + # Remove all RRs with the name and type from the section. + # Need to worry about header counts here - can we get Message to + # update the counts itself, rather than the section worrying about it? + rrs_to_delete = [] + each do |rr| + next if rr.rr_type == Types::OPT + if (rr.name.to_s.downcase == name.to_s.downcase) && + ((rr.type == type) || + ((rr.type == Types::RRSIG) && (rr.type_covered == type))) + rrs_to_delete.push(rr) + end + end + rrs_to_delete.each { |rr| delete(rr) } + @msg.update_counts if @msg + end +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/name.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/name.rb new file mode 100644 index 000000000000..74a642bf1e32 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/name.rb @@ -0,0 +1,437 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + # == Dnsruby::Name class + # + # A representation of a DNS name + # (RFC1035, section 3.1) + # + # == methods + # + # * Name::create(namestring) + # * Name#absolute? + # * Name#wild? + # * Name#subdomain_of?(other) + # * Name#labels + # + require 'simpleidn' + class Name + include Comparable + MaxNameLength=255 + # -- + # A Name is a collection of Labels. Each label is presentation-formatted + # When a Name is wire-encoded, the label array is walked, and each label is wire-encoded. + # When a Name is unencoded, each label is unencoded, and added to the Name collection of labels. + # When a Name is made from a string, the Name is split into Labels. + # ++ + # Creates a new Dnsruby::Name from +arg+. +arg+ can be : + # + # * Name:: returns +arg+ + # * String:: returns a new Name + def self.create(arg) + case arg + when Name + return Name.new(arg.labels, arg.absolute?) + when String + # arg.gsub!(/\.$/o, "") + if (arg==".") + return Name.new([],true) + end + if (arg=="") + return Name.new([],false) + end + arg = punycode(arg) + return Name.new(split_escaped(arg), /\.\z/ =~ arg ? true : false) + # return Name.new(Label.split(arg), /\.\z/ =~ arg ? true : false) + when Array + return Name.new(arg, /\.\z/ =~ (arg.last ? ((arg.last.kind_of?String)?arg.last : arg.last.string) : arg.last) ? true : false) + else + raise ArgumentError.new("cannot interpret as DNS name: #{arg.inspect}") + end + end + + # Convert IDN domain from Unicode UTF-8 to ASCII punycode + # @param [Object|String] d Unicode domain with emoji inside + # @return [String] ASCII punycode domain + # @example + # Dnsruby::Name.punycode('🏳.cf') + # => "xn--en8h.cf" + def self.punycode(d) + begin + return SimpleIDN.to_ascii(d) + rescue + return d + end + end + + def self.split_escaped(arg) #:nodoc: all + encodedlabels = name2encodedlabels(arg) + return encodedlabels + end + + def self.split(name) + encodedlabels = name2encodedlabels(name) + labels = encodedlabels.each {|el| Name.decode(el.to_s)} + return labels + end + + attr_accessor :labels + + # This method should only be called internally. + # Use Name::create to create a new Name + def initialize(labels, absolute=true) #:nodoc: all + total_length=labels.length-1 + labels.each do |l| + if (!l.kind_of?Label) + raise ArgumentError.new("Name::new called with non-labels. Use Name::create instead?") + end + total_length+=l.length + end + if (total_length > MaxNameLength) + raise ResolvError.new("Name length is #{total_length}, greater than max of #{MaxNameLength} octets!") + end + @labels = labels + @absolute = absolute + end + + def downcase + labels = [] + @labels.each do |label| labels << Label.new(label.downcase) end + return Name.new(labels) + end + + def inspect # :nodoc: + "#<#{self.class}: #{self.to_s}#{@absolute ? '.' : ''}>" + end + + # Returns true if this Name is absolute + def absolute? + return @absolute + end + + def absolute=(on) # :nodoc: + @absolute = on + end + + def strip_label # :nodoc: + n = Name.new(self.labels()[1, self.labels.length-1], self.absolute?) + return n + end + + # Is this name a wildcard? + def wild? + if (labels.length == 0) + return false + end + return (labels[0].string == '*') + end + + # Return the canonical form of this name (RFC 4034 section 6.2) + def canonical + # + return MessageEncoder.new {|msg| + msg.put_name(self, true) + }.to_s + + end + + def <=>(other) + # return -1 if other less than us, +1 if greater than us + return 0 if (canonical == other.canonical) + if (canonically_before(other)) + return +1 + end + return -1 + end + + def canonically_before(n) + if (!(Name === n)) + n = Name.create(n) + end + # Work out whether this name is canonically before the passed Name + # RFC 4034 section 6.1 + # For the purposes of DNS security, owner names are ordered by treating + # individual labels as unsigned left-justified octet strings. The + # absence of a octet sorts before a zero value octet, and uppercase + # US-ASCII letters are treated as if they were lowercase US-ASCII + # letters. + # To compute the canonical ordering of a set of DNS names, start by + # sorting the names according to their most significant (rightmost) + # labels. For names in which the most significant label is identical, + # continue sorting according to their next most significant label, and + # so forth. + + # Get the list of labels for both names, and then swap them + my_labels = @labels.reverse + other_labels = n.labels.reverse + my_labels.each_index {|i| + if (!other_labels[i]) + return false + end + next if (other_labels[i].downcase == my_labels[i].downcase) + return (my_labels[i].downcase < other_labels[i].downcase) + } + return true + end + + def ==(other) # :nodoc: + return false if other.class != Name + return @labels == other.labels && @absolute == other.absolute? + end + alias eql? == # :nodoc: + + # Tests subdomain-of relation : returns true if this name + # is a subdomain of +other+. + # + # domain = Resolv::Name.create("y.z") + # p Resolv::Name.create("w.x.y.z").subdomain_of?(domain) #=> true + # p Resolv::Name.create("x.y.z").subdomain_of?(domain) #=> true + # p Resolv::Name.create("y.z").subdomain_of?(domain) #=> false + # p Resolv::Name.create("z").subdomain_of?(domain) #=> false + # p Resolv::Name.create("x.y.z.").subdomain_of?(domain) #=> false + # p Resolv::Name.create("w.z").subdomain_of?(domain) #=> false + def subdomain_of?(other) + raise ArgumentError, "not a domain name: #{other.inspect}" unless Name === other + return false if @absolute != other.absolute? + other_len = other.length + return false if @labels.length <= other_len + return @labels[-other_len, other_len] == other.to_a + end + + def hash # :nodoc: + return @labels.hash ^ @absolute.hash + end + + def to_a #:nodoc: all + return @labels + end + + def length #:nodoc: all + return @labels.length + end + + def [](i) #:nodoc: all + return @labels[i] + end + + # returns the domain name as a string. + # + # The domain name doesn't have a trailing dot even if the name object is + # absolute. + # + # Example : + # + # p Resolv::Name.create("x.y.z.").to_s #=> "x.y.z" + # p Resolv::Name.create("x.y.z").to_s #=> "x.y.z" + # + def to_s(include_absolute=false) + ret = to_str(@labels) + if (@absolute && include_absolute) + ret += "." + end + return ret + end + + def to_str(labels) # :nodoc: all + ls =[] + labels.each {|el| ls.push(Name.decode(el.to_s))} + return ls.join('.') + # return @labels.collect{|l| (l.kind_of?String) ? l : l.string}.join('.') + end + + # Utility function + # + # name2labels to translate names from presentation format into an + # array of "wire-format" labels. + # in: dName a string with a domain name in presentation format (1035 + # sect 5.1) + # out: an array of labels in wire format. + def self.name2encodedlabels (dName) #:nodoc: all + # Check for "\" in the name : If there, then decode properly - otherwise, cheat and split on "." + if (dName.index("\\")) + names=[] + j=0; + while (dName && dName.length > 0) + names[j],dName = encode(dName) + j+=1 + end + + return names + else + labels = [] + dName.split(".").each {|l| + labels.push(Label.new(l)) + } + return labels + end + end + + def self.decode(wire) #:nodoc: all + presentation="" + length=wire.length + # There must be a nice regexp to do this.. but since I failed to + # find one I scan the name string until I find a '\', at that time + # I start looking forward and do the magic. + + i=0; + + unpacked = wire.unpack("C*") + while (i < length ) + c = unpacked[i] + if ( c < 33 || c > 126 ) + presentation=presentation + sprintf("\\%03u" ,c) + elsif ( c.chr == "\"" ) + presentation=presentation + "\\\"" + elsif ( c.chr == "\$") + presentation=presentation + "\\\$" + elsif ( c.chr == "(" ) + presentation=presentation + "\\(" + elsif ( c.chr == ")" ) + presentation=presentation + "\\)" + elsif ( c.chr == ";" ) + presentation=presentation + "\\;" + elsif ( c.chr == "@" ) + presentation=presentation + "\\@" + elsif ( c.chr == "\\" ) + presentation=presentation + "\\\\" + elsif ( c.chr == ".") + presentation=presentation + "\\." + else + presentation=presentation + c.chr() + end + i=i+1 + end + + return presentation + # return Label.new(presentation) + end + + + + # wire,leftover=presentation2wire(leftover) + # Will parse the input presentation format and return everything before + # the first non-escaped "." in the first element of the return array and + # all that has not been parsed yet in the 2nd argument. + def self.encode(presentation) #:nodoc: all + presentation=presentation.to_s + wire=""; + length=presentation.length; + + i=0; + + while (i < length ) + c=presentation.unpack("x#{i}C1")[0] + if (c == 46) # ord('.') + endstring = presentation[i+1, presentation.length-(i+1)] + return Label.new(wire),endstring + end + if (c == 92) # ord'\\' + # backslash found + pos = i+1 + # pos sets where next pattern matching should start + if (presentation.index(/\G(\d\d\d)/o, pos)) + wire=wire+[$1.to_i].pack("C") + i=i+3 + elsif(presentation.index(/\Gx(\h\h)/o, pos)) + wire=wire+[$1].pack("H*") + i=i+3 + elsif(presentation.index(/\G\./o, pos)) + wire=wire+"\." + i=i+1 + elsif(presentation.index(/\G@/o,pos)) + wire=wire+"@" + i=i+1 + elsif(presentation.index(/\G\(/o, pos)) + wire=wire+"(" + i=i+1 + elsif(presentation.index(/\G\)/o, pos)) + wire=wire+")" + i=i+1 + elsif(presentation.index(/\G\\/o, pos)) + wire=wire+"\\" + i+=1 + end + else + wire = wire + [c].pack("C") + end + i=i+1 + end + + return Label.new(wire) + end + + # end + + + # == Dnsruby::Label class + # + # (RFC1035, section 3.1) + # + class Label + include Comparable + MaxLabelLength = 63 + @@max_length=MaxLabelLength + # Split a Name into its component Labels + def self.split(arg) + return Name.split(arg) + end + + def self.set_max_length(l) + @@max_length=l + end + + def initialize(string) + if (string.length > @@max_length) + raise ResolvError.new("Label too long (#{string.length}, max length=#{MaxLabelLength}). Label = #{string}") + end + @downcase = string.downcase + @string = string + @string_length = string.length + end + attr_reader :string, :downcase + + def to_s + return @string.to_s # + "." + end + + def length + return @string_length + end + + def inspect + return "#<#{self.class} #{self.to_s}>" + end + + def <=>(other) + return (@downcase <=> other.downcase) + end + + + def ==(other) + return @downcase == other.downcase + end + + def eql?(other) + return self == other + end + + def hash + return @downcase.hash + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/packet_sender.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/packet_sender.rb new file mode 100644 index 000000000000..e3dfe7964595 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/packet_sender.rb @@ -0,0 +1,776 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +require 'dnsruby/select_thread' +require 'ipaddr' +# require 'dnsruby/iana_ports' +module Dnsruby + + class PacketSender # :nodoc: all + + include Socket::Constants + + @@authoritative_cache = Cache.new + @@recursive_cache = Cache.new + + + def PacketSender.cache(query, response) + return if response.cached + # ONLY cache the response if it is not an update response + question = query.question()[0] + if (query.do_caching && (query.class != Update) && + (question.qtype != Types::AXFR) && (question.qtype != Types::IXFR) && + (response.rcode == RCode::NOERROR) &&(!response.tsig) && + (query.class != Update) && + (response.header.ancount > 0)) + # # @TODO@ What about TSIG-signed responses? + # Don't cache any packets with "*" in the query name! (RFC1034 sec 4.3.3) + if (!question.qname.to_s.include? "*") + # Now cache response RRSets + if (query.header.rd) + PacketSender.cache_recursive(response); + else + PacketSender.cache_authoritative(response); + end + end + end + end + + def PacketSender.cache_authoritative(answer) + return if !answer.header.aa + @@authoritative_cache.add(answer) + end + + def PacketSender.cache_recursive(answer) + @@recursive_cache.add(answer) + end + + def PacketSender.clear_caches + @@recursive_cache.clear + @@authoritative_cache.clear + end + + def PacketSender.recursive_cache_length + @@recursive_cache.length + end + + attr_accessor :packet_timeout + + # The port on the resolver to send queries to. + # + # Defaults to 53 + attr_accessor :port + + # Use TCP rather than UDP as the transport. + # + # Defaults to false + attr_accessor :use_tcp + + # Reuse tcp connection + # + # Defaults to false + attr_accessor :tcp_pipelining + + # Limit the number of queries per pipeline + attr_accessor :tcp_pipelining_max_queries + + # Use UDP only - don't use TCP + # For test/debug purposes only + # Defaults to false + attr_accessor :no_tcp + + # The TSIG record to sign/verify messages with + attr_reader :tsig + + # Don't worry if the response is truncated - return it anyway. + # + # Defaults to false + attr_accessor :ignore_truncation + + # The source address to send queries from + # + # Defaults to localhost + attr_reader :src_address + + # should the Recursion Desired bit be set on queries? + # + # Defaults to true + attr_accessor :recurse + + # The max UDP packet size + # + # Defaults to 512 + attr_reader :udp_size + + # The address of the resolver to send queries to + attr_reader :server + + # Use DNSSEC for this PacketSender + # dnssec defaults to ON + attr_reader :dnssec + + # Set the source address. If the arg is nil, do nothing + def src_address6=(arg) + if (not arg.nil?) + @src_address6 = arg + end + end + + # Set the source address. If the arg is nil, do nothing + def src_address=(arg) + if (not arg.nil?) + @src_address = arg + end + end + + # Sets the TSIG to sign outgoing messages with. + # Pass in either a Dnsruby::RR::TSIG, or a key_name and key (or just a key) + # Pass in nil to stop tsig signing. + # It is possible for client code to sign packets prior to sending - see + # Dnsruby::RR::TSIG#apply and Dnsruby::Message#sign + # Note that pre-signed packets will not be signed by PacketSender. + # * res.tsig=(tsig_rr) + # * res.tsig=(key_name, key) + # * res.tsig=nil # Stop the resolver from signing + def tsig=(*args) + @tsig = Resolver.get_tsig(args) + end + + def dnssec=(on) + @dnssec=on + if (on) + # Set the UDP size (RFC 4035 section 4.1) + if (udp_packet_size < Resolver::MinDnssecUdpSize) + self.udp_size = Resolver::MinDnssecUdpSize + end + end + end + + + def udp_size=(size) + @udp_size = size + end + + def server=(server) + Dnsruby.log.debug { "InternalResolver setting server to #{server}" } + @server=Config.resolve_server(server) + check_ipv6 + end + + # Can take a hash with the following optional keys : + # + # * :server + # * :port + # * :use_tcp + # * :tcp_pipelining + # * :tcp_pipelining_max_queries + # * :no_tcp + # * :ignore_truncation + # * :src_address + # * :src_address6 + # * :src_port + # * :udp_size + # * :tsig + # * :packet_timeout + # * :recurse + def initialize(*args) + arg=args[0] + @ipv6 = false + @packet_timeout = Resolver::DefaultPacketTimeout + @port = Resolver::DefaultPort + @udp_size = Resolver::DefaultUDPSize + @dnssec = Resolver::DefaultDnssec + @use_tcp = false + @no_tcp = false + @tsig = nil + @ignore_truncation = false + @src_address = '0.0.0.0' + @src_address6 = '::' + @src_port = [0] + @recurse = true + @tcp_pipelining = false + @tcp_pipelining_max_queries = :infinite + @use_counts = {} + + if (arg==nil) + # Get default config + config = Config.new + # @server = config.nameserver[0] + elsif (arg.kind_of? String) + @server=arg + elsif (arg.kind_of? Name) + @server=arg + elsif (arg.kind_of? Hash) + arg.keys.each do |attr| + begin + if (((attr.to_s == "src_address")||(attr.to_s == "src_address6")) && + ((arg[attr] == nil) || (arg[attr] == ""))) + else + send(attr.to_s+"=", arg[attr]) + end + rescue Exception => e + Dnsruby.log.error { "PacketSender : Argument #{attr}, #{arg[attr]} not valid : #{e}\n" } + end + # end + end + end + # Check server is IP + @server=Config.resolve_server(@server) + + check_ipv6 + # ResolverRegister::register_single_resolver(self) + end + + def check_ipv6 + begin + i = IPv4.create(@server) + # @src_address = '0.0.0.0' + @ipv6=false + rescue Exception + begin + i = IPv6.create(@server) + # @src_address6 = '::' + @ipv6=true + rescue Exception + Dnsruby.log.error { "Server is neither IPv4 or IPv6!\n" } + end + end + end + + def close + # @TODO@ What about closing? + # Any queries to complete? Sockets to close? + end + + # Asynchronously send a Message to the server. The send can be done using just + # Dnsruby. Support for EventMachine has been deprecated. + # + # == Dnsruby pure Ruby event loop : + # + # A client_queue is supplied by the client, + # along with an optional client_query_id to identify the response. The client_query_id + # is generated, if not supplied, and returned to the client. + # When the response is known, the tuple + # (query_id, response_message, response_exception) is put in the queue for the client to process. + # + # The query is sent synchronously in the caller's thread. The select thread is then used to + # listen for and process the response (up to pushing it to the client_queue). The client thread + # is then used to retrieve the response and deal with it. + # + # Takes : + # + # * msg - the message to send + # * client_queue - a Queue to push the response to, when it arrives + # * client_query_id - an optional ID to identify the query to the client + # * use_tcp - whether to use TCP (defaults to PacketSender.use_tcp) + # + # Returns : + # + # * client_query_id - to identify the query response to the client. This ID is + # generated if it is not passed in by the client + # + # If the native Dsnruby networking layer is being used, then this method returns the client_query_id + # + # id = res.send_async(msg, queue) + # NOT SUPPORTED : id = res.send_async(msg, queue, use_tcp) + # id = res.send_async(msg, queue, id) + # id = res.send_async(msg, queue, id, use_tcp) + # + # Use Message#send_raw to send the packet with an untouched header. + # Use Message#do_caching to tell dnsruby whether to check the cache before + # sending, and update the cache upon receiving a response. + # Use Message#do_validation to tell dnsruby whether or not to do DNSSEC + # validation for this particular packet (assuming SingleResolver#dnssec == true) + # Note that these options should not normally be used! + def send_async(*args) # msg, client_queue, client_query_id, use_tcp=@use_tcp) + # @TODO@ Need to select a good Header ID here - see forgery-resilience RFC draft for details + msg = args[0] + client_query_id = nil + client_queue = nil + use_tcp = @use_tcp + if (msg.kind_of? String) + msg = Message.new(msg) + if (@dnssec) + msg.header.cd = @dnssec # we'll do our own validation by default + if (Dnssec.no_keys?) + msg.header.cd = false + end + end + end + if (args.length > 1) + if (args[1].class==Queue) + client_queue = args[1] + elsif (args.length == 2) + use_tcp = args[1] + end + if (args.length > 2) + client_query_id = args[2] + if (args.length > 3) + use_tcp = args[3] + end + end + end + # Need to keep track of the request mac (if using tsig) so we can validate the response (RFC2845 4.1) + # #Are we using EventMachine or native Dnsruby? + # if (Resolver.eventmachine?) + # return send_eventmachine(query_packet, msg, client_query_id, client_queue, use_tcp) + # else + if (!client_query_id) + client_query_id = Time.now + rand(10000) # is this safe?! + end + + begin + query_packet = make_query_packet(msg, use_tcp) + rescue EncodeError => err + Dnsruby.log.error { "#{err}" } + st = SelectThread.instance + st.push_exception_to_select(client_query_id, client_queue, err, nil) + return + end + + if (msg.do_caching && (msg.class != Update)) + # Check the cache!! + cachedanswer = nil + if (msg.header.rd) + cachedanswer = @@recursive_cache.find(msg.question()[0].qname, msg.question()[0].type) + else + cachedanswer = @@authoritative_cache.find(msg.question()[0].qname, msg.question()[0].type) + end + if (cachedanswer) + TheLog.debug("Sending cached answer to client\n") + # @TODO@ Fix up the header - ID and flags + cachedanswer.header.id = msg.header.id + # If we can find the answer, send it to the client straight away + # Post the result to the client using SelectThread + st = SelectThread.instance + st.push_response_to_select(client_query_id, client_queue, cachedanswer, msg, self) + return client_query_id + end + end + # Otherwise, run the query + if (udp_packet_size < query_packet.length) + if (@no_tcp) + # Can't send the message - abort! + err=IOError.new("Can't send message - too big for UDP and no_tcp=true") + Dnsruby.log.error { "#{err}" } + st.push_exception_to_select(client_query_id, client_queue, err, nil) + return + end + Dnsruby.log.debug { "Query packet length exceeds max UDP packet size - using TCP" } + use_tcp = true + end + send_dnsruby(query_packet, msg, client_query_id, client_queue, use_tcp) + return client_query_id + # end + end + + # This method returns the current tcp socket for pipelining + # If this is the first time the method is called then the socket is bound to + # @src_address:@src_port and connected to the remote dns server @server:@port. + # If the connection has been closed because of an EOF on recv_nonblock (closed by server) + # the function will recreate of the socket (since @pipeline_socket.connect will result in a IOError + # exception) + # In general, every subsequent call the function will either return the current tcp + # pipeline socket or a new connected socket if the current one was closed by the server + def tcp_pipeline_socket(src_port) + Dnsruby.log.debug("Using tcp_pipeline_socket") + sockaddr = Socket.sockaddr_in(@port, @server) + + reuse_pipeline_socket = -> do + begin + max = @tcp_pipelining_max_queries + use_count = @use_counts[@pipeline_socket] + if use_count && max != :infinite && use_count >= max + #we can't reuse the socket since max is reached + @use_counts.delete(@pipeline_socket) + @pipeline_socket = nil + Dnsruby.log.debug("Max queries per connection attained - creating new socket") + else + @pipeline_socket.connect(sockaddr) + end + rescue Errno::EISCONN + #already connected, do nothing and reuse! + rescue IOError, Errno::ECONNRESET #close by remote host, reconnect + @pipeline_socket = nil + Dnsruby.log.debug("Connection closed - recreating socket") + end + end + + create_pipeline_socket = -> do + @tcp_pipeline_local_port = src_port + src_address = @ipv6 ? @src_address6 : @src_address + begin + @pipeline_socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0) + @pipeline_socket.bind(Addrinfo.tcp(src_address, src_port)) + @pipeline_socket.connect(sockaddr) + Dnsruby.log.debug("Creating socket #{src_address}:#{src_port}") + @use_counts[@pipeline_socket] = 0 + rescue Exception => e + @pipeline_socket = nil + raise e + end + end + + # Don't combine the following 2 statements; the reuse lambda can set the + # socket to nil and if so we'd want to call the create lambda to recreate it. + reuse_pipeline_socket.() if @pipeline_socket + new_socket = @pipeline_socket.nil? + create_pipeline_socket.() unless @pipeline_socket + + @use_counts[@pipeline_socket] += 1 + + [@pipeline_socket, new_socket] + end + + # This method sends the packet using the built-in pure Ruby event loop, with no dependencies. + def send_dnsruby(query_bytes, query, client_query_id, client_queue, use_tcp) #:nodoc: all + endtime = Time.now + @packet_timeout + # First send the query (synchronously) + st = SelectThread.instance + socket = nil + runnextportloop = true + numtries = 0 + src_address = @src_address + if (@ipv6) + src_address = @src_address6 + end + while (runnextportloop) do + begin + numtries += 1 + src_port = get_next_src_port + if (use_tcp) + begin + if (@tcp_pipelining) + socket, new_socket = tcp_pipeline_socket(src_port) + src_port = @tcp_pipeline_local_port + else + socket = Socket.tcp(@server, @port, src_address, src_port, connect_timeout: @packet_timeout) + new_socket = true + end + rescue Errno::EBADF, Errno::ENETUNREACH => e + # Can't create a connection + err=IOError.new("TCP connection error to #{@server}:#{@port} from #{src_address}:#{src_port}, use_tcp=#{use_tcp}, exception = #{e.class}, #{e}") + Dnsruby.log.error { "#{err}" } + st.push_exception_to_select(client_query_id, client_queue, err, nil) + return + end + else + socket = nil + # JRuby UDPSocket only takes 0 parameters - no IPv6 support in JRuby... + if (/java/ =~ RUBY_PLATFORM) + socket = UDPSocket.new() + else + # ipv6 = @src_address =~ /:/ + socket = UDPSocket.new(@ipv6 ? Socket::AF_INET6 : Socket::AF_INET) + end + new_socket = true + socket.bind(src_address, src_port) + socket.connect(@server, @port) + end + runnextportloop = false + rescue Exception => e + if (socket!=nil) + begin + #let the select thread close the socket if tcp_pipeli + socket.close unless @tcp_pipelining && !new_socket + rescue Exception + end + end + # Try again if the error was EADDRINUSE and a random source port is used + # Maybe try a max number of times? + if ((e.class != Errno::EADDRINUSE) || (numtries > 50) || + ((e.class == Errno::EADDRINUSE) && (src_port == @src_port[0]))) + err_msg = "dnsruby can't connect to #{@server}:#{@port} from #{src_address}:#{src_port}, use_tcp=#{use_tcp}, exception = #{e.class}, #{e} #{e.backtrace}" + err=IOError.new(err_msg) + Dnsruby.log.error( "#{err}") + Dnsruby.log.error(e.backtrace) + if @tcp_pipelining + st.push_exception_to_select(client_query_id, client_queue, SocketEofResolvError.new(err_msg), nil) + else + st.push_exception_to_select(client_query_id, client_queue, err, nil) + end + return + end + end + end + if (socket==nil) + err=IOError.new("dnsruby can't connect to #{@server}:#{@port} from #{src_address}:#{src_port}, use_tcp=#{use_tcp}") + Dnsruby.log.error { "#{err}" } + st.push_exception_to_select(client_query_id, client_queue, err, nil) + return + end + Dnsruby.log.debug { "Sending packet to #{@server}:#{@port} from #{src_address}:#{src_port}, use_tcp=#{use_tcp} : #{query.question()[0].qname}, #{query.question()[0].qtype}" } + # print "#{Time.now} : Sending packet to #{@server} : #{query.question()[0].qname}, #{query.question()[0].qtype}\n" + # Listen for the response before we send the packet (to avoid any race conditions) + query_settings = SelectThread::QuerySettings.new(query_bytes, query, @ignore_truncation, client_queue, client_query_id, socket, @server, @port, endtime, udp_packet_size, self) + query_settings.is_persistent_socket = @tcp_pipelining if use_tcp + query_settings.tcp_pipelining_max_queries = @tcp_pipelining_max_queries if @tcp_pipelining + begin + if (use_tcp) + lenmsg = [query_bytes.length].pack('n') + socket.send(lenmsg, 0) + end + socket.send(query_bytes, 0) + + # The select thread will now wait for the response and send that or a + # timeout back to the client_queue. + st.add_to_select(query_settings) + rescue Exception => e + err_msg = "Send failed to #{@server}:#{@port} from #{src_address}:#{src_port}, use_tcp=#{use_tcp}, exception : #{e}" + err=IOError.new(err_msg) + Dnsruby.log.error { "#{err}" } + Dnsruby.log.error(e.backtrace) + if @tcp_pipelining + st.push_exception_to_select(client_query_id, client_queue, SocketEofResolvError.new(err_msg), nil) if new_socket + else + st.push_exception_to_select(client_query_id, client_queue, err, nil) + end + begin + #we let the select_thread close the socket when doing tcp + #pipelining + socket.close unless @tcp_pipelining && !new_socket + rescue Exception + end + return + end + + Dnsruby.log.debug { "Packet sent to #{@server}:#{@port} from #{src_address}:#{src_port}, use_tcp=#{use_tcp} : #{query.question()[0].qname}, #{query.question()[0].qtype}" } + # print "Packet sent to #{@server}:#{@port} from #{@src_address}:#{src_port}, use_tcp=#{use_tcp} : #{query.question()[0].qname}, #{query.question()[0].qtype}\n" + end + + # The source port to send queries from + # Returns either a single Integer or an Array + # e.g. "0", or "[60001, 60002, 60007]" + # + # Defaults to 0 - random port + def src_port + if (@src_port.length == 1) + return @src_port[0] + end + return @src_port + end + + # Can be a single Integer or a Range or an Array + # If an invalid port is selected (one reserved by + # IANA), then an ArgumentError will be raised. + # + # res.src_port=0 + # res.src_port=[60001,60005,60010] + # res.src_port=60015..60115 + # + def src_port=(p) + @src_port=[] + add_src_port(p) + end + + # Can be a single Integer or a Range or an Array + # If an invalid port is selected (one reserved by + # IANA), then an ArgumentError will be raised. + # "0" means "any valid port" - this is only a viable + # option if it is the only port in the list. + # An ArgumentError will be raised if "0" is added to + # an existing set of source ports. + # + # res.add_src_port(60000) + # res.add_src_port([60001,60005,60010]) + # res.add_src_port(60015..60115) + # + def add_src_port(p) + if (Resolver.check_port(p, @src_port)) + a = Resolver.get_ports_from(p) + a.each do |x| + if ((@src_port.length > 0) && (x == 0)) + raise ArgumentError.new("src_port of 0 only allowed as only src_port value (currently #{@src_port.length} values") + end + @src_port.push(x) + end + end + end + + + def get_next_src_port + # Different OSes have different interpretations of "random port" here. + # Apparently, Linux will just give you the same port as last time, unless it is still + # open, in which case you get n+1. + # We need to determine an actual (random) number here, then ask the OS for it, and + # continue until we get one. + if (@src_port[0] == 0) + candidate = -1 + # # better to construct an array of all the ports we *can* use, and then just pick one at random! + # candidate = Iana::UNRESERVED_PORTS[rand(Iana::UNRESERVED_PORTS.length())] + # # while (!(Resolver.port_in_range(candidate))) + # # candidate = (rand(65535-1024) + 1024) + # # end + # @TODO@ Should probably construct a bitmap of the IANA ports... + candidate = 50000 + (rand(15535)) # pick one over 50000 + return candidate + end + pos = rand(@src_port.length) + return @src_port[pos] + end + + def check_response(response, response_bytes, query, client_queue, client_query_id, tcp) + # @TODO@ Should send_raw avoid this? + if (!query.send_raw) + sig_value = check_tsig(query, response, response_bytes) + if (sig_value != :okay) + # Should send error back up to Resolver here, and then NOT QUERY AGAIN!!! + return sig_value + end + if ((response.header.get_header_rcode == RCode.FORMERR) && + (query.header.arcount == 0)) + # Raise an error + return true + end + # Should check that question section is same as question that was sent! RFC 5452 + # If it's not an update... + if (query.class == Update) + # @TODO@!! + else + if ((response.question.size == 0) || + (response.question[0].qname.labels != query.question[0].qname.labels) || + (response.question[0].qtype != query.question[0].qtype) || + (response.question[0].qclass != query.question[0].qclass) || + (response.question.length != query.question.length) || + (response.header.id != query.header.id)) + TheLog.info("Incorrect packet returned : #{response.to_s}") + return false + end + end + # end + # IF WE GET FORMERR BACK HERE (and we have EDNS0 on) THEN + # TRY AGAIN WITH NO OPT RECORDS! (rfc2671 section 5.3) + if ((response.header.get_header_rcode == RCode.FORMERR) && + (query.header.arcount > 0)) + # try resending the message with no OPT record + query.remove_additional + query.send_raw = true + send_async(query, client_queue, client_query_id, false) + return false + end + if (response.header.tc && !tcp && !@ignore_truncation) + if (@no_tcp) + Dnsruby.log.debug { "Truncated response - not resending over TCP as no_tcp==true" } + else + # Try to resend over tcp + Dnsruby.log.debug { "Truncated - resending over TCP" } + # @TODO@ Are the query options used correctly here? DNSSEC in particular... + # query.send_raw = true # Make sure that the packet is not messed with. + send_async(query, client_queue, client_query_id, true) + return false + end + end + end + return true + end + + def check_tsig(query, response, response_bytes) + if (query.tsig) + if (response.tsig) + if !query.tsig.verify(query, response, response_bytes) + # Discard packet and wait for correctly signed response + Dnsruby.log.error { "TSIG authentication failed!" } + return TsigError.new + end + else + # Treated as having format error and discarded (RFC2845, 4.6) + # but return a different error code, because some servers fail at + # this + Dnsruby.log.error { "Expecting TSIG signed response, but got unsigned response - discarding" } + return TsigNotSignedResponseError.new + end + elsif (response.tsig) + # Error - signed response to unsigned query + Dnsruby.log.error { "Signed response to unsigned query" } + return TsigError.new + end + return :okay + end + + def make_query(name, type = Types::A, klass = Classes::IN, set_cd=@dnssec) + msg = Message.new + msg.header.rd = 1 + msg.add_question(name, type, klass) + if (@dnssec) + msg.header.cd = set_cd # We do our own validation by default + end + return msg + end + + # Prepare the packet for sending + def make_query_packet(packet, use_tcp = @use_tcp) #:nodoc: all + if (!packet.send_raw) # Don't mess with this packet! + if (packet.header.opcode == OpCode.QUERY || @recurse) + packet.header.rd=@recurse + end + + # Only do this if the packet has not been prepared already! + if (@dnssec) + prepare_for_dnssec(packet) + elsif ((udp_packet_size > Resolver::DefaultUDPSize) && !use_tcp) + # if ((udp_packet_size > Resolver::DefaultUDPSize) && !use_tcp) + # @TODO@ What if an existing OPT RR is not big enough? Should we replace it? + add_opt_rr(packet) + end + end + + if (@tsig && !packet.signed?) + @tsig.apply(packet) + end + return packet.encode + end + + def add_opt_rr(packet) + Dnsruby.log.debug { ";; Adding EDNS extension with UDP packetsize #{udp_packet_size}.\n" } + # RFC 3225 + optrr = RR::OPT.new(udp_packet_size) + + # Only one OPT RR allowed per packet - do we already have one? + if (packet.additional.rrset(packet.question()[0].qname, Types::OPT).rrs.length == 0) + packet.add_additional(optrr) + end + end + + def prepare_for_dnssec(packet) + # RFC 4035 + Dnsruby.log.debug { ";; Adding EDNS extension with UDP packetsize #{udp_packet_size} and DNS OK bit set\n" } + optrr = RR::OPT.new(udp_packet_size) # Decimal UDPpayload + optrr.dnssec_ok=true + + if (packet.additional.rrset(packet.question()[0].qname, Types::OPT).rrs.length == 0) + packet.add_additional(optrr) + end + + packet.header.ad = false # RFC 4035 section 4.6 + + # SHOULD SET CD HERE!!! + if (packet.do_validation) + packet.header.cd = true + end + if (Dnssec.no_keys?) + packet.header.cd = false + end + + end + + # Return the packet size to use for UDP + def udp_packet_size + # if @udp_size > DefaultUDPSize then we use EDNS and + # @udp_size should be taken as the maximum packet_data length + ret = (@udp_size > Resolver::DefaultUDPSize ? @udp_size : Resolver::DefaultUDPSize) + return ret + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/recursor.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/recursor.rb new file mode 100644 index 000000000000..e161f6e755fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/recursor.rb @@ -0,0 +1,778 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + # Dnsruby::Recursor - Perform recursive dns lookups + # + # require 'Dnsruby' + # rec = Dnsruby::Recursor.new() + # answer = rec.recurse("rob.com.au") + # + # This module uses a Dnsruby::Resolver to perform recursive queries. + # + # === AUTHOR + # + # Rob Brown, bbb@cpan.org + # Alex Dalitz, alexd@nominet.org.uk + # + # === SEE ALSO + # + # Dnsruby::Resolver, + # + # === COPYRIGHT + # + # Copyright (c) 2002, Rob Brown. All rights reserved. + # Portions Copyright (c) 2005, Olaf M Kolkman. + # Ruby version with caching and validation Copyright (c) 2008, AlexD (Nominet UK) + # + # Example lookup process: + # + # [root@box root]# dig +trace www.rob.com.au. + # + # ; <<>> DiG 9.2.0 <<>> +trace www.rob.com.au. + # ;; global options: printcmd + # . 507343 IN NS C.ROOT-SERVERS.NET. + # . 507343 IN NS D.ROOT-SERVERS.NET. + # . 507343 IN NS E.ROOT-SERVERS.NET. + # . 507343 IN NS F.ROOT-SERVERS.NET. + # . 507343 IN NS G.ROOT-SERVERS.NET. + # . 507343 IN NS H.ROOT-SERVERS.NET. + # . 507343 IN NS I.ROOT-SERVERS.NET. + # . 507343 IN NS J.ROOT-SERVERS.NET. + # . 507343 IN NS K.ROOT-SERVERS.NET. + # . 507343 IN NS L.ROOT-SERVERS.NET. + # . 507343 IN NS M.ROOT-SERVERS.NET. + # . 507343 IN NS A.ROOT-SERVERS.NET. + # . 507343 IN NS B.ROOT-SERVERS.NET. + # ;; Received 436 bytes from 127.0.0.1#53(127.0.0.1) in 9 ms + # ;;; But these should be hard coded as the hints + # + # ;;; Ask H.ROOT-SERVERS.NET gave: + # au. 172800 IN NS NS2.BERKELEY.EDU. + # au. 172800 IN NS NS1.BERKELEY.EDU. + # au. 172800 IN NS NS.UU.NET. + # au. 172800 IN NS BOX2.AUNIC.NET. + # au. 172800 IN NS SEC1.APNIC.NET. + # au. 172800 IN NS SEC3.APNIC.NET. + # ;; Received 300 bytes from 128.63.2.53#53(H.ROOT-SERVERS.NET) in 322 ms + # ;;; A little closer than before + # + # ;;; Ask NS2.BERKELEY.EDU gave: + # com.au. 259200 IN NS ns4.ausregistry.net. + # com.au. 259200 IN NS dns1.telstra.net. + # com.au. 259200 IN NS au2ld.CSIRO.au. + # com.au. 259200 IN NS audns01.syd.optus.net. + # com.au. 259200 IN NS ns.ripe.net. + # com.au. 259200 IN NS ns1.ausregistry.net. + # com.au. 259200 IN NS ns2.ausregistry.net. + # com.au. 259200 IN NS ns3.ausregistry.net. + # com.au. 259200 IN NS ns3.melbourneit.com. + # ;; Received 387 bytes from 128.32.206.12#53(NS2.BERKELEY.EDU) in 10312 ms + # ;;; A little closer than before + # + # ;;; Ask ns4.ausregistry.net gave: + # com.au. 259200 IN NS ns1.ausregistry.net. + # com.au. 259200 IN NS ns2.ausregistry.net. + # com.au. 259200 IN NS ns3.ausregistry.net. + # com.au. 259200 IN NS ns4.ausregistry.net. + # com.au. 259200 IN NS ns3.melbourneit.com. + # com.au. 259200 IN NS dns1.telstra.net. + # com.au. 259200 IN NS au2ld.CSIRO.au. + # com.au. 259200 IN NS ns.ripe.net. + # com.au. 259200 IN NS audns01.syd.optus.net. + # ;; Received 259 bytes from 137.39.1.3#53(ns4.ausregistry.net) in 606 ms + # ;;; Uh... yeah... I already knew this + # ;;; from what NS2.BERKELEY.EDU told me. + # ;;; ns4.ausregistry.net must have brain damage + # + # ;;; Ask ns1.ausregistry.net gave: + # rob.com.au. 86400 IN NS sy-dns02.tmns.net.au. + # rob.com.au. 86400 IN NS sy-dns01.tmns.net.au. + # ;; Received 87 bytes from 203.18.56.41#53(ns1.ausregistry.net) in 372 ms + # ;;; Ah, much better. Something more useful. + # + # ;;; Ask sy-dns02.tmns.net.au gave: + # www.rob.com.au. 7200 IN A 139.134.5.123 + # rob.com.au. 7200 IN NS sy-dns01.tmns.net.au. + # rob.com.au. 7200 IN NS sy-dns02.tmns.net.au. + # ;; Received 135 bytes from 139.134.2.18#53(sy-dns02.tmns.net.au) in 525 ms + # ;;; FINALLY, THE ANSWER! + # Now,DNSSEC validation is performed (unless disabled). + class Recursor + class AddressCache # :nodoc: all + # Like an array, but stores the expiration of each record. + def initialize(*args) + @hash = Hash.new # stores addresses against their expiration + @mutex = Mutex.new # This class is thread-safe + end + def push(item) + address, ttl = item + expiration = Time.now + ttl + @mutex.synchronize { + @hash[address] = expiration + } + end + def values + ret =[] + keys_to_delete = [] + @mutex.synchronize { + @hash.keys.each {|address| + if (@hash[address] > Time.now) + ret.push(address) + else + keys_to_delete.push(address) + end + } + keys_to_delete.each {|key| + @hash.delete(key) + } + } + return ret + end + def length + @mutex.synchronize { + return @hash.length + } + end + def each() + values.each {|v| + yield v + } + end + end + attr_accessor :nameservers, :callback, :recurse, :ipv6_ok + attr_reader :hints, :dnssec + # The resolver to use for the queries + attr_accessor :resolver + + # For guarding access to shared caches. + @@mutex = Mutex.new # :nodoc: all + @@hints = nil + @@authority_cache = Hash.new + @@zones_cache = nil + @@nameservers = nil + + def dnssec=(dnssec_on) + @dnssec = dnssec_on + @resolver.dnssec = dnssec_on + end + + def initialize(res = nil) + if (res) + @resolver = res + else + if (defined?@@nameservers && @@nameservers.length > 0) + @resolver = Resolver.new({:nameserver => @@nameservers}) + else + @resolver = Resolver.new + end + end + @resolver.dnssec = @dnssec + @ipv6_ok = false + end + # Initialize the hint servers. Recursive queries need a starting name + # server to work off of. This method takes a list of IP addresses to use + # as the starting servers. These name servers should be authoritative for + # the root (.) zone. + # + # res.hints=(ips) + # + # If no hints are passed, the default nameserver is asked for the hints. + # Normally these IPs can be obtained from the following location: + # + # ftp://ftp.internic.net/domain/named.root + # + def hints=(hints) + Recursor.set_hints(hints, @resolver) + end + def Recursor.set_hints(hints, resolver) + TheLog.debug(";; hints(#{hints.inspect})\n") + @resolver = resolver + if (resolver.single_resolvers.length == 0) + resolver = Resolver.new() + resolver.dnssec = @dnssec + end + if (hints && hints.length > 0) + resolver.nameservers=hints + if (String === hints) + hints = [hints] + end + hints.each {|hint| + @@hints = Hash.new + @@hints[hint]=hint + } + end + if (!hints && @@nameservers) + @@hints=(@@nameservers) + else + @@nameservers=(hints) + @@hints = hints + end + TheLog.debug(";; verifying (root) zone...\n") + # bind always asks one of the hint servers + # for who it thinks is authoritative for + # the (root) zone as a sanity check. + # Nice idea. + + # if (!@@hints || @@hints.length == 0) + resolver.recurse=(1) + packet=resolver.query_no_validation_or_recursion(".", "NS", "IN") + hints = Hash.new + if (packet) + if (ans = packet.answer) + ans.each do |rr| + if (rr.name.to_s =~ /^\.?$/ and + rr.type == Types::NS) + # Found root authority + server = rr.nsdname.to_s.downcase + server.sub!(/\.$/,"") + TheLog.debug(";; FOUND HINT: #{server}\n") + hints[server] = AddressCache.new + end + end + if ((packet.additional.length == 0) || + ((packet.additional.length == 1) && (packet.additional()[0].type == Types.OPT))) + # Some resolvers (e.g. 8.8.8.8) do not send an additional section - + # need to make explicit queries for these :( + # Probably best to limit the number of outstanding queries - extremely bursty behaviour otherwise + # What happens if we select only name + q = Queue.new + hints.keys.each {|server| + # Query for the server address and add it to hints. + ['A', 'AAAA'].each {|type| + msg = Message.new + msg.do_caching = @do_caching + msg.header.rd = false + msg.do_validation = false + msg.add_question(server, type, 'IN') + if (@dnssec) + msg.header.cd = true # We do our own validation by default + end + resolver.send_async(msg, q) + } + } + (hints.length * 2).times { + id, result, error = q.pop + if (result) + result.answer.each {|rr| + TheLog.debug(";; NS address: " + rr.inspect+"\n") + add_to_hints(hints, rr) + } + end + } + else + packet.additional.each do |rr| + TheLog.debug(";; ADDITIONAL: "+rr.inspect+"\n") + add_to_hints(hints, rr) + + end + end + end + # foreach my $server (keys %hints) { + hints.keys.each do |server| + if (!hints[server] || hints[server].length == 0) + # Wipe the servers without lookups + hints.delete(server) + end + end + @@hints = hints + else + @@hints = {} + end + if (@@hints.size > 0) + TheLog.info(";; USING THE FOLLOWING HINT IPS:\n") + @@hints.values.each do |ips| + ips.each do |server| + TheLog.info(";; #{server}\n") + end + end + else + raise ResolvError.new( "Server ["+(@@nameservers)[0].to_s+".] did not give answers") + end + + # Disable recursion flag. + resolver.recurse=(0) + # end + + # return $self->nameservers( map { @{ $_ } } values %{ $self->{'hints'} } ); + if (Array === @@hints) + temp = [] + @@hints.each {|hint| + temp.push(hint) + } + @@hints = Hash.new + count = 0 + temp.each {|hint| + print "Adding hint : #{temp[count]}\n" + @@hints[count] = temp[count] + count += 1 + } + end + if (String === @@hints) + temp = @@hints + @@hints = Hash.new + @@hints[0] = temp + end + # @@nameservers = @@hints.values + @@nameservers=[] + @@hints.each {|key, value| + @@nameservers.push(key) + } + return @@nameservers + end + + def Recursor.add_to_hints(hints, rr) + server = rr.name.to_s.downcase + server.sub!(/\.$/,"") + if (server) + if ( rr.type == Types::A) + # print ";; ADDITIONAL HELP: $server -> [".$rr->rdatastr."]\n" if $self->{'debug'}; + if (hints[server]!=nil) + TheLog.debug(";; STORING IP: #{server} IN A "+rr.address.to_s+"\n") + hints[server].push([rr.address.to_s, rr.ttl]) + end + end + if ( rr.type == Types::AAAA) + # print ";; ADDITIONAL HELP: $server -> [".$rr->rdatastr."]\n" if $self->{'debug'}; + if (hints[server]) + TheLog.debug(";; STORING IP6: #{server} IN AAAA "+rr.address.to_s+"\n") + hints[server].push([rr.address.to_s, rr.ttl]) + end + end + + end + end + + + # This method takes a code reference, which is then invoked each time a + # packet is received during the recursive lookup. For example to emulate + # dig's C<+trace> function: + # + # res.recursion_callback(Proc.new { |packet| + # print packet.additional.inspect + # + # print";; Received %d bytes from %s\n\n", + # packetanswersize, + # packet.answerfrom); + # }) + # + def recursion_callback=(sub) + # if (sub && UNIVERSAL::isa(sub, 'CODE')) + @callback = sub + # end + end + + def recursion_callback + return @callback + end + + def Recursor.clear_caches(resolver = Resolver.new) + resolver.dnssec = @dnssec + Recursor.set_hints(Hash.new, resolver) + @@zones_cache = Hash.new # key zone_name, values Hash of servers and AddressCaches + @@zones_cache["."] = @@hints + + @@authority_cache = Hash.new + end + + def query_no_validation_or_recursion(name, type=Types.A, klass=Classes.IN) # :nodoc: all + return query(name, type, klass, true) + end + + # This method is much like the normal query() method except it disables + # the recurse flag in the packet and explicitly performs the recursion. + # + # packet = res.query( "www.netscape.com.", "A") + # packet = res.query( "www.netscape.com.", "A", "IN", true) # no validation + # + # The Recursor maintains a cache of known nameservers. + # DNSSEC validation is performed unless true is passed as the fourth parameter. + def query(name, type=Types.A, klass=Classes.IN, no_validation = false) + # @TODO@ PROVIDE AN ASYNCHRONOUS SEND WHICH RETURNS MESSAGE WITH ERROR!!! + + # Make sure the hint servers are initialized. + @@mutex.synchronize { + self.hints=(Hash.new) unless @@hints + } + @resolver.recurse=(0) + # Make sure the authority cache is clean. + # It is only used to store A and AAAA records of + # the suposedly authoritative name servers. + # TTLs are respected + @@mutex.synchronize { + if (!@@zones_cache) + Recursor.clear_caches(@resolver) + end + } + + # So we have normal hashes, but the array of addresses at the end is now an AddressCache + # which respects the ttls of the A/AAAA records + + # Now see if we already know the zone in question + # Otherwise, see if we know any of its parents (will know at least ".") + known_zone, known_authorities = get_closest_known_zone_authorities_for(name) # ".", @hints if nothing else + + # Seed name servers with the closest known authority + # ret = _dorecursion( name, type, klass, ".", @hints, 0) + ret = _dorecursion( name, type, klass, known_zone, known_authorities, 0, no_validation) + Dnssec.validate(ret) if !no_validation + # print "\n\nRESPONSE:\n#{ret}\n" + return ret + end + + def get_closest_known_zone_for(n) # :nodoc: + # Find the closest parent of name that we know + # e.g. for nominet.org.uk, try nominet.org.uk., org.uk., uk., . + # does @zones_cache contain the name we're after + if (Name === n) + n = n.to_s # @TODO@ This is a bit crap! + end + if (n == nil) + TheLog.error("Name is nil") + raise ResolvError.new("Nameserver invalid!") + end + name = n.tr("","") + if (name[name.length-1] != ".") + name = name + "." + end + + while (true) + # print "Checking for known zone : #{name}\n" + zone = nil + @@mutex.synchronize{ + zone = @@zones_cache[name] + if (zone != nil) + return name + end + } + return false if name=="." + # strip the name up to the first dot + first_dot = name.index(".") + if (first_dot == (name.length-1)) + name = "." + else + name = name[first_dot+1, name.length] + end + end + end + + def get_closest_known_zone_authorities_for(name) # :nodoc: + done = false + known_authorities, known_zone = nil + while (!done) + known_zone = get_closest_known_zone_for(name) + # print "GOT KNOWN ZONE : #{known_zone}\n" + @@mutex.synchronize { + known_authorities = @@zones_cache[known_zone] # ".", @hints if nothing else + } + # print "Known authorities : #{known_authorities}\n" + + # Make sure that known_authorities still contains some authorities! + # If not, remove the zone from zones_cache, and start again + if (known_authorities && known_authorities.values.length > 0) + done = true + else + @@mutex.synchronize{ + @@zones_cache.delete(known_zone) + } + end + end + return known_zone, known_authorities # @TODO@ Need to synchronize access to these! + end + + def _dorecursion(name, type, klass, known_zone, known_authorities, depth, no_validation) # :nodoc: + + if ( depth > 255 ) + TheLog.debug(";; _dorecursion() Recursion too deep, aborting...\n") + @errorstring="Recursion too deep, aborted" + return nil + end + + known_zone.sub!(/\.*$/, ".") + + ns = [] # Array of AddressCaches (was array of array of addresses) + @@mutex.synchronize{ + # Get IPs from authorities + known_authorities.keys.each do |ns_rec| + if (known_authorities[ns_rec] != nil && known_authorities[ns_rec] != [] ) + @@authority_cache[ns_rec] = known_authorities[ns_rec] + ns.push(@@authority_cache[ns_rec]) + elsif (@@authority_cache[ns_rec]!=nil && @@authority_cache[ns_rec]!=[]) + known_authorities[ns_rec] = @@authority_cache[ns_rec] + ns.push(@@authority_cache[ns_rec]) + end + end + + if (ns.length == 0) + found_auth = 0 + TheLog.debug(";; _dorecursion() Failed to extract nameserver IPs:") + TheLog.debug(known_authorities.inspect + @@authority_cache.inspect) + known_authorities.keys.each do |ns_rec| + if (known_authorities[ns_rec]==nil || known_authorities[ns_rec]==[]) + TheLog.debug(";; _dorecursion() Manual lookup for authority [#{ns_rec}]") + + auth_packet=nil + ans=[] + + # Don't query for V6 if its not there. + # Do this in parallel + ip_mutex = Mutex.new + ip6_thread = Thread.start { + if ( @ipv6_ok) + auth_packet = _dorecursion(ns_rec,"AAAA", klass, # packet + ".", # known_zone + @@hints, # known_authorities + depth+1); # depth + ip_mutex.synchronize { + ans.push(auth_packet.answer) if auth_packet + } + end + } + + ip4_thread = Thread.start { + auth_packet = _dorecursion(ns_rec,"A",klass, # packet + ".", # known_zone + @@hints, # known_authorities + depth+1); # depth + + ip_mutex.synchronize { + ans.push(auth_packet.answer ) if auth_packet + } + } + ip6_thread.join + ip4_thread.join + + if ( ans.length > 0 ) + TheLog.debug(";; _dorecursion() Answers found for [#{ns_rec}]") + # foreach my $rr (@ans) { + ans.each do |rr_arr| + rr_arr.each do |rr| + TheLog.debug(";; RR:" + rr.inspect + "") + if (rr.type == Types::CNAME) + # Follow CNAME + server = rr.name.to_s.downcase + if (server) + server.sub!(/\.*$/, ".") + if (server == ns_rec) + cname = rr.cname.downcase + cname.sub!(/\.*$/, ".") + TheLog.debug(";; _dorecursion() Following CNAME ns [#{ns_rec}] -> [#{cname}]") + if (!(known_authorities[cname])) + known_authorities[cname] = AddressCache.new + end + known_authorities.delete(ns_rec) + next + end + end + elsif (rr.type == Types::A || rr.type == Types::AAAA ) + server = rr.name.to_s.downcase + if (server) + server.sub!(/\.*$/, ".") + if (known_authorities[server]!=nil) + ip = rr.address.to_s + TheLog.debug(";; _dorecursion() Found ns: #{server} IN A #{ip}") + @@authority_cache[server] = known_authorities[server] + @@authority_cache[ns_rec].push([ip, rr.ttl]) + found_auth+=1 + next + end + end + end + TheLog.debug(";; _dorecursion() Ignoring useless answer: " + rr.inspect + "") + end + end + else + TheLog.debug(";; _dorecursion() Could not find A records for [#{ns_rec}]") + end + end + end + if (found_auth > 0) + TheLog.debug(";; _dorecursion() Found #{found_auth} new NS authorities...") + return _dorecursion( name, type, klass, known_zone, known_authorities, depth+1) + end + TheLog.debug(";; _dorecursion() No authority information could be obtained.") + return nil + end + } + + # Cut the deck of IPs in a random place. + TheLog.debug(";; _dorecursion() cutting deck of (" + ns.length.to_s + ") authorities...") + splitpos = rand(ns.length) + start = ns[0, splitpos] + endarr = ns[splitpos, ns.length - splitpos] + ns = endarr + start + + nameservers = [] + ns.each do |nss| + nss.each {|n| + nameservers.push(n.to_s) + } + end + resolver = Resolver.new({:nameserver=>nameservers}) + resolver.dnssec = @dnssec + servers = [] + resolver.single_resolvers.each {|s| + servers.push(s.server) + } + resolver.retry_delay = nameservers.length + begin + # Should construct packet ourselves and clear RD bit + query = Message.new(name, type, klass) + query.header.rd = false + query.do_validation = true + query.do_caching = false + query.do_validation = false if no_validation + # print "Sending msg from resolver, dnssec = #{resolver.dnssec}, do_validation = #{query.do_validation}\n" + packet = resolver.send_message(query) + # @TODO@ Now prune unrelated RRSets (RFC 5452 section 6) + prune_rrsets_to_rfc5452(packet, known_zone) + rescue ResolvTimeout, IOError => e + # TheLog.debug(";; nameserver #{levelns.to_s} didn't respond") + # next + TheLog.debug("No response!") + return nil + end + if (packet) # @TODO@ Check that the packet *is* actually authoritative!! + if (@callback) + @callback.call(packet) + end + + of = nil + TheLog.debug(";; _dorecursion() Response received from [" + @answerfrom.to_s + "]") + status = packet.rcode + authority = packet.authority + if (status) + if (status == "NXDOMAIN") + # I guess NXDOMAIN is the best we'll ever get + TheLog.debug(";; _dorecursion() returning NXDOMAIN") + return packet + elsif (packet.answer.length > 0) + TheLog.debug(";; _dorecursion() Answers were found.") + return packet + elsif (packet.header.aa) + TheLog.debug(";; _dorecursion() Authoritative answer found") + return packet + elsif (authority.length > 0) + auth = Hash.new + # foreach my $rr (@authority) { + authority.each do |rr| + if (rr.type.to_s =~ /^(NS|SOA)$/) + server = (rr.type == Types::NS ? rr.nsdname : rr.mname).to_s.downcase + server.sub!(/\.*$/, ".") + of = rr.name.to_s.downcase + of.sub!(/\.*$/, ".") + TheLog.debug(";; _dorecursion() Received authority [#{of}] [" + rr.type().to_s + "] [#{server}]") + if (of.length <= known_zone.length) + TheLog.debug(";; _dorecursion() Deadbeat name server did not provide new information.") + next + elsif (of =~ /#{known_zone}/) + TheLog.debug(";; _dorecursion() FOUND closer authority for [#{of}] at [#{server}].") + auth[server] ||= AddressCache.new #[] @TODO@ If there is no additional record for this, then we want to use the authority! + if (rr.type == Types.NS) + if ((packet.additional.rrset(rr.nsdname, Types::A).length == 0) && + (packet.additional.rrset(rr.nsdname, Types::AAAA).length == 0)) + auth[server].push([rr.nsdname, rr.ttl]) + end + end + else + TheLog.debug(";; _dorecursion() Confused name server [" + @answerfrom + "] thinks [#{of}] is closer than [#{known_zone}]?") + return nil + end + else + TheLog.debug(";; _dorecursion() Ignoring NON NS entry found in authority section: " + rr.inspect) + end + end + # foreach my $rr ($packet->additional) + packet.additional.each do |rr| + if (rr.type == Types::CNAME) + # Store this CNAME into %auth too + server = rr.name.to_s.downcase + if (server) + server.sub!(/\.*$/, ".") + if (auth[server]!=nil && auth[server].length > 0) + cname = rr.cname.to_s.downcase + cname.sub!(/\.*$/, ".") + TheLog.debug(";; _dorecursion() FOUND CNAME authority: " + rr.string) + auth[cname] ||= AddressCache.new # [] + auth[server] = auth[cname] + next + end + + end + elsif (rr.type == Types::A || rr.type == Types::AAAA) + server = rr.name.to_s.downcase + if (server) + server.sub!(/\.*$/, ".") + if (auth[server]!=nil) + if (rr.type == Types::A) + TheLog.debug(";; _dorecursion() STORING: #{server} IN A " + rr.address.to_s) + end + if (rr.type == Types::AAAA) + TheLog.debug(";; _dorecursion() STORING: #{server} IN AAAA " + rr.address.to_s) + end + auth[server].push([rr.address.to_s, rr.ttl]) + next + end + end + end + TheLog.debug(";; _dorecursion() Ignoring useless: " + rr.inspect) + end + if (of =~ /#{known_zone}/) + # print "Adding #{of} with :\n#{auth}\nto zones_cache\n" + @@mutex.synchronize{ + @@zones_cache[of]=auth + } + return _dorecursion( name, type, klass, of, auth, depth+1, no_validation) + else + return _dorecursion( name, type, klass, known_zone, known_authorities, depth+1, no_validation ) + end + end + end + end + + return nil + end + + def prune_rrsets_to_rfc5452(packet, zone) + # Now prune the response of any unrelated rrsets (RFC5452 section6) + # "One very simple way to achieve this is to only accept data if it is + # part of the domain for which the query was intended." + if (!packet.header.aa) + return + end + if (!packet.question()[0]) + return + end + + section_rrsets = packet.section_rrsets + section_rrsets.keys.each {|section| + section_rrsets[section].each {|rrset| + n = Name.create(rrset.name) + n.absolute = true + if ((n.to_s == zone) || (n.to_s == Name.create(zone).to_s) || + (n.subdomain_of?(Name.create(zone))) || + (rrset.type == Types::OPT)) + # # @TODO@ Leave in the response if it is an SOA, NSEC or RRSIGfor the parent zone + # # elsif ((query_name.subdomain_of?rrset.name) && + # elsif ((rrset.type == Types.SOA) || (rrset.type == Types.NSEC) || (rrset.type == Types.NSEC3)) #) + else + TheLog.debug"Removing #{rrset.name}, #{rrset.type} from response from server for #{zone}" + packet.send(section).remove_rrset(rrset.name, rrset.type) + end + } + } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resolv.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resolv.rb new file mode 100644 index 000000000000..8d8341fe184f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resolv.rb @@ -0,0 +1,127 @@ +# The Resolv class can be used to resolve addresses using /etc/hosts and /etc/resolv.conf, +# +# The DNS class may be used to perform more queries. If greater control over the sending +# of packets is required, then the Resolver or SingleResolver classes may be used. +module Dnsruby + + +# NOTE! Beware, there is a Ruby library class named Resolv, and you may need to +# explicitly specify Dnsruby::Resolv to use the Dnsruby Resolv class, +# even if you have include'd Dnsruby. + +class Resolv + + # Address RegExp to use for matching IP addresses + ADDRESS_REGEX = /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/ + + + # Some class methods require the use of an instance to compute their result. + # For this purpose we create a single instance that can be reused. + def self.instance + @instance ||= self.new + end + + + # Class methods that delegate to instance methods: + + # Looks up the first IP address for +name+ + def self.getaddress(name) + instance.getaddress(name) + end + + # Looks up all IP addresses for +name+ + def self.getaddresses(name) + instance.getaddresses(name) + end + + # Iterates over all IP addresses for +name+ + def self.each_address(name, &block) + instance.each_address(name, &block) + end + + # Looks up the first hostname of +address+ + def self.getname(address) + instance.getname(address) + end + + # Looks up all hostnames of +address+ + def self.getnames(address) + instance.getnames(address) + end + + # Iterates over all hostnames of +address+ + def self.each_name(address, &proc) + instance.each_name(address, &proc) + end + + + # Instance Methods: + + # Creates a new Resolv using +resolvers+ + def initialize(resolvers=[Hosts.new, DNS.new]) + @resolvers = resolvers + end + + # Looks up the first IP address for +name+ + def getaddress(name) + addresses = getaddresses(name) + if addresses.empty? + raise ResolvError.new("no address for #{name}") + else + addresses.first + end + end + + # Looks up all IP addresses for +name+ + def getaddresses(name) + return [name] if ADDRESS_REGEX.match(name) + @resolvers.each do |resolver| + addresses = [] + resolver.each_address(name) { |address| addresses << address } + return addresses unless addresses.empty? + end + [] + end + + # Iterates over all IP addresses for +name+ + def each_address(name) + getaddresses(name).each { |address| yield(address)} + end + + # Looks up the first hostname of +address+ + def getname(address) + names = getnames(address) + if names.empty? + raise ResolvError.new("no name for #{address}") + else + names.first + end + end + + # Looks up all hostnames of +address+ + def getnames(address) + @resolvers.each do |resolver| + names = [] + resolver.each_name(address) { |name| names << name } + return names unless names.empty? + end + [] + end + + # Iterates over all hostnames of +address+ + def each_name(address) + getnames(address).each { |address| yield(address) } + end + + + require 'dnsruby/cache' + require 'dnsruby/DNS' + require 'dnsruby/hosts' + require 'dnsruby/message/message' + require 'dnsruby/update' + require 'dnsruby/zone_transfer' + require 'dnsruby/dnssec' + require 'dnsruby/zone_reader' + +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resolver.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resolver.rb new file mode 100644 index 000000000000..fa971ff36b36 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resolver.rb @@ -0,0 +1,1252 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +# require 'Dnsruby/resolver_register.rb' + +require 'dnsruby/packet_sender' +require 'dnsruby/recursor' + +module Dnsruby + # == Description + # Dnsruby::Resolver is a DNS stub resolver. + # This class performs queries with retries across multiple nameservers. + # The system configured resolvers are used by default. + # + # The retry policy is a combination of the Net::DNS and dnsjava approach, and has the option of : + # * A total timeout for the query (defaults to 0, meaning "no total timeout") + # * A retransmission system that targets the namervers concurrently once the first query round is + # complete, but in which the total time per query round is split between the number of nameservers + # targetted for the first round. and total time for query round is doubled for each query round + # + # Note that, if a total timeout is specified, then that will apply regardless of the retry policy + # (i.e. it may cut retries short). + # + # Note also that these timeouts are distinct from the SingleResolver's packet_timeout + # + # Timeouts apply to the initial query and response. If DNSSEC validation is to + # be performed, then additional queries may be required (these are performed automatically + # by Dnsruby). Each additional query will be performed with its own timeouts. + # So, even with a query_timeout of 5 seconds, a response which required extensive + # validation may take several times that long. + # (Future versions of Dnsruby may expose finer-grained events for client tracking of + # responses and validation) + # + # == Methods + # + # === Synchronous + # These methods raise an exception or return a response message with rcode==NOERROR + # + # * Dnsruby::Resolver#send_message(msg) + # * Dnsruby::Resolver#query(name [, type [, klass]]) + # + # There are "!" versions of these two methods that return an array [response, error] + # instead of raising an error on failure. They can be called as follows: + # + # response, error = resolver.send_message!(...) + # response, error = resolver.query!(...) + # + # If the request succeeds, response will contain the Dnsruby::Message response + # and error will be nil. + # + # If the request fails, response will be nil and error will contain the error raised. + # + # === Asynchronous + # These methods use a response queue to return the response and the error + # + # * Dnsruby::Resolver#send_async(msg, response_queue, query_id) + # + # == Event Loop + # Dnsruby runs a pure Ruby event loop to handle I/O in a single thread. + # Support for EventMachine has been deprecated. + class Resolver + DefaultQueryTimeout = 0 + DefaultPacketTimeout = 5 + DefaultRetryTimes = 1 + DefaultRetryDelay = 5 + DefaultPipeLiningMaxQueries = 5 + DefaultPort = 53 + DefaultDnssec = false + AbsoluteMinDnssecUdpSize = 1220 + MinDnssecUdpSize = 4096 + DefaultUDPSize = MinDnssecUdpSize + + class EventType + RECEIVED = 0 + VALIDATED = 1 # @TODO@ Should be COMPLETE? + ERROR = 2 + end + + # The port to send queries to on the resolver + attr_reader :port + + # Should TCP be used as a transport rather than UDP? + # If use_tcp==true, then ONLY TCP will be used as a transport. + attr_reader :use_tcp + + # If tcp_pipelining==true, then we reuse the TCP connection + attr_reader :tcp_pipelining + + # How many times (number of messages) to reuse the pipelining connection + # before closing, :infinite for infinite number of requests per connection + attr_reader :tcp_pipelining_max_queries + + # If no_tcp==true, then ONLY UDP will be used as a transport. + # This should not generally be used, but is provided as a debugging aid. + attr_reader :no_tcp + + + attr_reader :tsig + + # Should truncation be ignored? + # i.e. the TC bit is ignored and thus the resolver will not requery over TCP if TC is set + attr_reader :ignore_truncation + + # The source address to send queries from for IPv4 + attr_reader :src_address + + # The source address to send queries from for IPv6 + attr_reader :src_address6 + + # Should the Recursion Desired bit be set? + attr_reader :recurse + + # The maximum UDP size to be used + attr_reader :udp_size + + # The current Config + attr_reader :config + + # Does this Resolver cache answers, and attempt to retrieve answer from the cache? + attr_reader :do_caching + + # The array of SingleResolvers used for sending query messages + # attr_accessor :single_resolvers # :nodoc: + def single_resolvers=(s) # :nodoc: + @configured = true + # @single_res_mutex.synchronize { + @single_resolvers = s + # } + end + def single_resolvers # :nodoc: + unless @configured + add_config_nameservers + end + @single_resolvers + end + + # The timeout for any individual packet. This is the timeout used by SingleResolver + attr_reader :packet_timeout + + # Note that this timeout represents the total time a query may run for - multiple packets + # can be sent to multiple nameservers in this time. + # This is distinct from the SingleResolver per-packet timeout + # The query_timeout is not required - it will default to 0, which means "do not use query_timeout". + # If this is the case then the timeout will be dictated by the retry_times and retry_delay attributes + attr_accessor :query_timeout + + # The query will be tried across nameservers retry_times times, with a delay of retry_delay seconds + # between each retry. The first time round, retry_delay will be divided by the number of nameservers + # being targetted, and a new nameserver will be queried with the resultant delay. + attr_accessor :retry_times, :retry_delay + + # Use DNSSEC for this Resolver + attr_reader :dnssec + + # Defines whether validation is performed by default on this Resolver when the + # query method is called. + # Note that send_message and send_async expect a + # Message object to be passed in, which is already configured to the callers + # requirements. + attr_accessor :do_validation + + # Defines whether we will cache responses, or pass every request to the + # upstream resolver. This is only really useful when querying authoritative + # servers (as the upstream recursive resolver is likely to cache) + attr_accessor :do_caching + + # -- + # @TODO@ add load_balance? i.e. Target nameservers in a random, rather than pre-determined, order? + # This is best done when configuring the Resolver, as it will re-order servers based on their response times. + # + # ++ + + # Query for a name. If a valid Message is received, then it is returned + # to the caller. Otherwise an exception (a Dnsruby::ResolvError or Dnsruby::ResolvTimeout) is raised. + # + # require 'dnsruby' + # res = Dnsruby::Resolver.new + # response = res.query('example.com') # defaults to Types.A, Classes.IN + # response = res.query('example.com', Types.MX) + # response = res.query('208.77.188.166') # IPv4 address so PTR query will be made + # response = res.query('208.77.188.166', Types.PTR) + def query(name, type=Types.A, klass=Classes.IN, set_cd=@dnssec) + msg = Message.new + msg.do_caching = @do_caching + msg.header.rd = 1 + msg.add_question(name, type, klass) + msg.do_validation = @do_validation + if @dnssec + msg.header.cd = set_cd # We do our own validation by default + end + send_message(msg) + end + + # Like query, but does not raise an error when an error occurs. + # Instead, it returns it. + # @return a 2 element array: [response, error] + def query!(name, type=Types.A, klass=Classes.IN, set_cd=@dnssec) + response = nil; error = nil + begin + response = query(name, type, klass, set_cd) + rescue => e + error = e + end + [response, error] + end + + def query_no_validation_or_recursion(name, type=Types.A, klass=Classes.IN) # :nodoc: all + msg = Message.new + msg.do_caching = @do_caching + msg.header.rd = false + msg.do_validation = false + msg.add_question(name, type, klass) + if @dnssec + msg.header.cd = true # We do our own validation by default + end + send_message(msg) + end + + # Send a message, and wait for the response. If a valid Message is received, then it is returned + # to the caller. Otherwise an exception (a Dnsruby::ResolvError or Dnsruby::ResolvTimeout) is raised. + # + # send_async is called internally. + # + # example : + # + # require 'dnsruby' + # include Dnsruby + # res = Dnsruby::Resolver.new + # begin + # response = res.send_message(Message.new('example.com', Types.MX)) + # rescue ResolvError + # # ... + # rescue ResolvTimeout + # # ... + # end + def send_message(message) + Dnsruby.log.debug{'Resolver : sending message'} + q = Queue.new + send_async(message, q) + + _id, result, error = q.pop + + if error + error.response = result if error.is_a?(ResolvError) + raise error + else + result + end + end + + # Like send_message, but does not raise an error when an error occurs. + # Instead, it returns it. + # @return a 2 element array: [response, error] + def send_message!(message) + response = nil; error = nil + begin + response = send_message(message) + rescue => e + error = e + end + [response, error] + end + + # Sends a message with send_plain_message. + # Effectively a wrapper around send_plain_message, but adds + # the ability to configure whether an error will be raised + # or returned if it occurs. + # + # @param message the message to send to the DNS server + # @param error_strategy :return to return [response, error] (default), + # :raise to return response only, or raise an error if one occurs + def query_raw(message, error_strategy = :return) + + unless [:return, :raise].include?(error_strategy) + raise ArgumentError.new('error_strategy should be one of [:return, :raise].') + end + + response, error = send_plain_message(message) + + if error_strategy == :return + [response, error] + else + raise error if error + response + end + end + + # This method takes a Message (supplied by the client), and sends it to + # the configured nameservers. No changes are made to the Message before it + # is sent (TSIG signatures will be applied if configured on the Resolver). + # Retries are handled as the Resolver is configured to do. + # Incoming responses to the query are not cached or validated (although TCP + # fallback will be performed if the TC bit is set and the (Single)Resolver has + # ignore_truncation set to false). + # Note that the Message is left untouched - this means that no OPT records are + # added, even if the UDP transport for the server is specified at more than 512 + # bytes. If it is desired to use EDNS for this packet, then you should call + # the Dnsruby::PacketSender#prepare_for_dnssec(msg), or + # Dnsruby::PacketSender#add_opt_rr(msg) + # The return value from this method is the [response, error] tuple. Either of + # these values may be nil - it is up to the client to check. + # + # example : + # + # require 'dnsruby' + # include Dnsruby + # res = Dnsruby::Resolver.new + # response, error = res.send_plain_message(Message.new('example.com', Types.MX)) + # if error + # print "Error returned : #{error}\n" + # else + # process_response(response) + # end + def send_plain_message(message) + Dnsruby::TheLog.debug('Resolver : send_plain_message') + message.do_caching = false + message.do_validation = false + message.send_raw = true + q = Queue.new + send_async(message, q) + _id, result, error = q.pop + error.response = result if !error.nil? && error.is_a?(ResolvError) + [result, error] + end + + + # Asynchronously send a Message to the server. The send can be done using just + # Dnsruby. Support for EventMachine has been deprecated. + # + # == Dnsruby pure Ruby event loop : + # + # A client_queue is supplied by the client, + # along with an optional client_query_id to identify the response. The client_query_id + # is generated, if not supplied, and returned to the client. + # When the response is known, + # a tuple of (query_id, response_message, exception) will be added to the client_queue. + # + # The query is sent synchronously in the caller's thread. The select thread is then used to + # listen for and process the response (up to pushing it to the client_queue). The client thread + # is then used to retrieve the response and deal with it. + # + # Takes : + # + # * msg - the message to send + # * client_queue - a Queue to push the response to, when it arrives + # * client_query_id - an optional ID to identify the query to the client + # * use_tcp - whether to use only TCP (defaults to SingleResolver.use_tcp) + # + # Returns : + # + # * client_query_id - to identify the query response to the client. This ID is + # generated if it is not passed in by the client + # + # === Example invocations : + # + # id = res.send_async(msg, queue) + # NOT SUPPORTED : id = res.send_async(msg, queue, use_tcp) + # id = res.send_async(msg, queue, id) + # id = res.send_async(msg, queue, id, use_tcp) + # + # === Example code : + # + # require 'dnsruby' + # res = Dnsruby::Resolver.newsend + # query_id = 10 # can be any object you like + # query_queue = Queue.new + # res.send_async(Message.new('example.com', Types.MX), query_queue, query_id) + # query_id_2 = res.send_async(Message.new('example.com', Types.A), query_queue) + # # ...do a load of other stuff here... + # 2.times do + # response_id, response, exception = query_queue.pop + # # You can check the ID to see which query has been answered + # if exception == nil + # # deal with good response + # else + # # deal with problem + # end + # end + # + def send_async(msg, client_queue, client_query_id = nil) + unless @configured + add_config_nameservers + end + # @single_res_mutex.synchronize { + unless @resolver_ruby # @TODO@ Synchronize this? + @resolver_ruby = ResolverRuby.new(self) + end + # } + client_query_id = @resolver_ruby.send_async(msg, client_queue, client_query_id) + if @single_resolvers.length == 0 + Thread.start { + sleep(@query_timeout == 0 ? 1 : @query_timeout) + client_queue.push([client_query_id, nil, ResolvTimeout.new('Query timed out - no nameservers configured')]) + } + end + client_query_id + end + + # Close the Resolver. Unfinished queries are terminated with OtherResolvError. + def close + @resolver_ruby.close if @resolver_ruby + end + + # Create a new Resolver object. If no parameters are passed in, then the default + # system configuration will be used. Otherwise, a Hash may be passed in with the + # following optional elements : + # + # + # * :port + # * :use_tcp + # * :tsig + # * :ignore_truncation + # * :src_address + # * :src_address6 + # * :src_port + # * :recurse + # * :udp_size + # * :config_info - see Config + # * :nameserver - can be either a String or an array of Strings + # * :packet_timeout + # * :query_timeout + # * :retry_times + # * :retry_delay + # * :do_caching + # * :tcp_pipelining + # * :tcp_pipelining_max_queries - can be a number or :infinite symbol + def initialize(*args) + # @TODO@ Should we allow :namesver to be an RRSet of NS records? Would then need to randomly order them? + @resolver_ruby = nil + @src_address = nil + @src_address6 = nil + @single_res_mutex = Mutex.new + @configured = false + @do_caching = true + @config = Config.new() + reset_attributes + + # Process args + if args.length == 1 + if args[0].class == Hash + args[0].keys.each do |key| + begin + if key == :config_info + @config.set_config_info(args[0][:config_info]) + elsif key == :nameserver + set_config_nameserver(args[0][:nameserver]) + elsif key == :nameservers + set_config_nameserver(args[0][:nameservers]) + else + send(key.to_s + '=', args[0][key]) + end + rescue Exception => e + Dnsruby.log.error{"Argument #{key} not valid : #{e}\n"} + end + end + elsif args[0].class == String + set_config_nameserver(args[0]) + elsif args[0].class == Config + # also accepts a Config object from Dnsruby::Resolv + @config = args[0] + end + else + # Anything to do? + end + update + end + + def add_config_nameservers # :nodoc: all + unless @configured + @config.get_ready + end + @configured = true + @single_res_mutex.synchronize { + # Add the Config nameservers + @config.nameserver.each do |ns| + res = PacketSender.new({ + server: ns, + port: @port, + dnssec: @dnssec, + use_tcp: @use_tcp, + no_tcp: @no_tcp, + tcp_pipelining: @tcp_pipelining, + tcp_pipelining_max_queries: @tcp_pipelining_max_queries, + packet_timeout: @packet_timeout, + tsig: @tsig, + ignore_truncation: @ignore_truncation, + src_address: @src_address, + src_address6: @src_address6, + src_port: @src_port, + recurse: @recurse, + udp_size: @udp_size}) + @single_resolvers.push(res) if res + end + } + end + + def set_config_nameserver(n) + # @TODO@ Should we allow NS RRSet here? If so, then .sort_by {rand} + @config.get_ready unless @configured + @configured = true + + @config.nameserver = n.kind_of?(String) ? [n] : n + add_config_nameservers + end + + def reset_attributes # :nodoc: all + @resolver_ruby.reset_attributes if @resolver_ruby + + # Attributes + + # do_validation tells the Resolver whether to try to validate the response + # with DNSSEC. This should work for NSEC-signed domains, but NSEC3 + # validation is not currently supported. This attribute now defaults to + # false. Please let me know if you require NSEC3 validation. + @do_validation = false + @query_timeout = DefaultQueryTimeout + @retry_delay = DefaultRetryDelay + @retry_times = DefaultRetryTimes + @packet_timeout = DefaultPacketTimeout + @port = DefaultPort + @udp_size = DefaultUDPSize + @dnssec = DefaultDnssec + @do_caching= true + @use_tcp = false + @no_tcp = false + @tcp_pipelining = false + @tcp_pipelining_max_queries = DefaultPipeLiningMaxQueries + @tsig = nil + @ignore_truncation = false + @config = Config.new() + @src_address = nil + @src_address6 = nil + @src_port = [0] + @recurse = true + @single_res_mutex.synchronize { + @single_resolvers=[] + } + @configured = false + end + + def update # :nodoc: all + # Update any resolvers we have with the latest config + @single_res_mutex.synchronize do + @single_resolvers.delete(nil) # Just in case... + @single_resolvers.each { |res| update_internal_res(res) } + end + end + + # # Add a new SingleResolver to the list of resolvers this Resolver object will + # # query. + # def add_resolver(internal) # :nodoc: + # # @TODO@ Make a new PacketSender from this SingleResolver!! + # @single_resolvers.push(internal) + # end + + def add_server(server)# :nodoc: + @configured = true + res = PacketSender.new(server) + log_and_raise("Can't create server #{server}", ArgumentError) unless res + update_internal_res(res) + @single_res_mutex.synchronize { @single_resolvers.push(res) } + end + + def update_internal_res(res) + [:port, :use_tcp, :no_tcp, :tcp_pipelining, :tcp_pipelining_max_queries, :tsig, :ignore_truncation, :packet_timeout, + :src_address, :src_address6, :src_port, :recurse, + :udp_size, :dnssec].each do |param| + + res.send(param.to_s + '=', instance_variable_get('@' + param.to_s)) + end + end + + def nameservers=(ns) + self.nameserver=(ns) + end + + def nameserver=(n) + @configured = true + @single_res_mutex.synchronize { @single_resolvers=[] } + set_config_nameserver(n) + add_config_nameservers + end + + # -- + # @TODO@ Should really auto-generate these methods. + # Also, any way to tie them up with SingleResolver RDoc? + # ++ + + def packet_timeout=(t) + @packet_timeout = t + update + end + + # The source port to send queries from + # Returns either a single Integer or an Array + # e.g. '0', or '[60001, 60002, 60007]' + # + # Defaults to 0 - random port + def src_port + @src_port.length == 1 ? @src_port[0] : @src_port + end + + # Can be a single Integer or a Range or an Array + # If an invalid port is selected (one reserved by + # IANA), then an ArgumentError will be raised. + # + # res.src_port=0 + # res.src_port=[60001,60005,60010] + # res.src_port=60015..60115 + # + def src_port=(p) + if Resolver.check_port(p) + @src_port = Resolver.get_ports_from(p) + update + end + end + + # Can be a single Integer or a Range or an Array + # If an invalid port is selected (one reserved by + # IANA), then an ArgumentError will be raised. + # "0" means "any valid port" - this is only a viable + # option if it is the only port in the list. + # An ArgumentError will be raised if "0" is added to + # an existing set of source ports. + # + # res.add_src_port(60000) + # res.add_src_port([60001,60005,60010]) + # res.add_src_port(60015..60115) + # + def add_src_port(p) + if Resolver.check_port(p, @src_port) + a = Resolver.get_ports_from(p) + a.each do |x| + if (@src_port.length > 0) && (x == 0) + log_and_raise("src_port of 0 only allowed as only src_port value (currently #{@src_port.length} values", + ArgumentError) + end + @src_port.push(x) + end + end + update + end + + def Resolver.check_port(p, src_port=[]) + unless p.is_a?(Integer) + tmp_src_ports = Array.new(src_port) + p.each do |x| + unless Resolver.check_port(x, tmp_src_ports) + return false + end + tmp_src_ports.push(x) + end + return true + end + if Resolver.port_in_range(p) + return ! ((p == 0) && (src_port.length > 0)) + else + Dnsruby.log.error("Illegal port (#{p})") + log_and_raise("Illegal port #{p}", ArgumentError) + end + end + + def Resolver.port_in_range(p) + (p == 0) || ((p >= 50000) && (p <= 65535)) + end + + def Resolver.get_ports_from(p) + a = [] + if p.is_a?(Integer) + a = [p] + else + p.each do |x| + a.push(x) + end + end + a + end + + def tcp_pipelining=(on) + @tcp_pipelining = on + update + end + + def tcp_pipelining_max_queries=(max) + @tcp_pipelining_max_queries = max + update + end + + def use_tcp=(on) + @use_tcp = on + update + end + + def no_tcp=(on) + @no_tcp=on + update + end + + # Sets the TSIG to sign outgoing messages with. + # Pass in either a Dnsruby::RR::TSIG, or a key_name and key (or just a key) + # Pass in nil to stop tsig signing. + # * res.tsig=(tsig_rr) + # * res.tsig=(key_name, key) # defaults to hmac-md5 + # * res.tsig=(key_name, key, alg) # e.g. alg = 'hmac-sha1' + # * res.tsig=nil # Stop the resolver from signing + def tsig=(t) + @tsig = t + update + end + + + protected + def Resolver.create_tsig_options(name, key, algorithm = nil) + options = { + type: Types.TSIG, + klass: Classes.ANY, + name: name, + key: key + } + options[:algorithm] = algorithm if algorithm + options + end + + + public + def Resolver.get_tsig(args) + + tsig = nil + + if args.length == 1 + if args[0] + if args[0].instance_of?(RR::TSIG) + tsig = args[0] + elsif args[0].instance_of?(Array) + tsig = RR.new_from_hash(create_tsig_options(*args[0])) + end + else + # Dnsruby.log.debug{'TSIG signing switched off'} + return nil + end + else + tsig = RR.new_from_hash(create_tsig_options(args)) + end + Dnsruby.log.info{"TSIG signing now using #{tsig.name}, key=#{tsig.key}"} + tsig + end + + + def ignore_truncation=(on) + @ignore_truncation = on + update + end + + def src_address=(a) + @src_address = a + update + end + + def src_address6=(a) + @src_address6 = a + update + end + + def port=(a) + @port = a + update + end + + def persistent_tcp=(on) + @persistent_tcp = on + update + end + + def persistent_udp=(on) + @persistent_udp = on + update + end + + def do_caching=(on) + @do_caching=on + update + end + + def recurse=(a) + @recurse = a + update + end + + def dnssec=(d) + @dnssec = d + if d + # Set the UDP size (RFC 4035 section 4.1) + if @udp_size < MinDnssecUdpSize + self.udp_size = MinDnssecUdpSize + end + end + update + end + + def udp_size=(s) + @udp_size = s + update + end + + def single_res_mutex # :nodoc: all + @single_res_mutex + end + + def generate_timeouts(base=0) # :nodoc: all + # These should be be pegged to the single_resolver they are targetting : + # e.g. timeouts[timeout1]=nameserver + timeouts = {} + retry_delay = @retry_delay + # @single_res_mutex.synchronize { + @retry_times.times do |retry_count| + if retry_count > 0 + retry_delay *= 2 + end + + @single_resolvers.delete(nil) # Just in case... + @single_resolvers.each_index do |i| + res = @single_resolvers[i] + offset = (i * @retry_delay.to_f / @single_resolvers.length) + if retry_count == 0 + timeouts[base + offset]=[res, retry_count] + else + if timeouts.has_key?(base + retry_delay + offset) + log_and_raise('Duplicate timeout key!') + end + timeouts[base + retry_delay + offset]=[res, retry_count] + end + end + end + # } + timeouts + end + end + + + # This class implements the I/O using pure Ruby, with no dependencies. + # Support for EventMachine has been deprecated. + class ResolverRuby # :nodoc: all + def initialize(parent) + reset_attributes + @parent=parent + end + def reset_attributes # :nodoc: all + # data structures + # @mutex=Mutex.new + @query_list = {} + @timeouts = {} + end + def send_async(msg, client_queue, client_query_id=nil) + # This is the whole point of the Resolver class. + # We want to use multiple SingleResolvers to run a query. + # So we kick off a system with select_thread where we send + # a query with a queue, but log ourselves as observers for that + # queue. When a new response is pushed on to the queue, then the + # select thread will call this class' handler method IN THAT THREAD. + # When the final response is known, this class then sticks it in + # to the client queue. + + q = Queue.new + if client_query_id.nil? + client_query_id = Time.now + rand(10000) + end + + unless client_queue.kind_of?(Queue) + log_and_raise('Wrong type for client_queue in Resolver# send_async') + # @TODO@ Handle different queue tuples - push this to generic send_error method + client_queue.push([client_query_id, ArgumentError.new('Wrong type of client_queue passed to Dnsruby::Resolver# send_async - should have been Queue, was #{client_queue.class}')]) + return + end + + unless msg.kind_of?Message + Dnsruby.log.error{'Wrong type for msg in Resolver# send_async'} + # @TODO@ Handle different queue tuples - push this to generic send_error method + client_queue.push([client_query_id, ArgumentError.new("Wrong type of msg passed to Dnsruby::Resolver# send_async - should have been Message, was #{msg.class}")]) + return + end + + begin + msg.encode + rescue EncodeError => err + Dnsruby.log.error { "Can't encode " + msg.to_s + " : #{err}" } + client_queue.push([client_query_id, err]) + return + end + + tick_needed = false + # add to our data structures + # @mutex.synchronize{ + @parent.single_res_mutex.synchronize { + tick_needed = true if @query_list.empty? + if @query_list.has_key?(client_query_id) + Dnsruby.log.error("Duplicate query id requested (#{client_query_id}") + # @TODO@ Handle different queue tuples - push this to generic send_error method + client_queue.push([client_query_id, ArgumentError.new('Client query ID already in use')]) + return + end + outstanding = [] + @query_list[client_query_id]=[msg, client_queue, q, outstanding] + + query_timeout = Time.now + @parent.query_timeout + if @parent.query_timeout == 0 + query_timeout = Time.now + 31536000 # a year from now + end + @timeouts[client_query_id] = [query_timeout, generate_timeouts] + } + + # Now do querying stuff using SingleResolver + # All this will be handled by the tick method (if we have 0 as the first timeout) + st = SelectThread.instance + st.add_observer(q, self) + tick if tick_needed + client_query_id + end + + def generate_timeouts # :nodoc: all + # Create the timeouts for the query from the retry_times and retry_delay attributes. + # These are created at the same time in case the parameters change during the life of the query. + # + # These should be absolute, rather than relative + # The first value should be Time.now[ + @parent.generate_timeouts(Time.now) + end + + # Close the Resolver. Unfinished queries are terminated with OtherResolvError. + def close + # @mutex.synchronize { + @parent.single_res_mutex.synchronize { + @query_list.each do |client_query_id, values| + _msg, client_queue, q, _outstanding = values + send_result_and_stop_querying(client_queue, client_query_id, q, nil, + OtherResolvError.new('Resolver closing!')) + end + } + end + + # MUST BE CALLED IN A SYNCHRONIZED BLOCK! + # + # Send the result back to the client, and close the socket for that query by removing + # the query from the select thread. + def send_result_and_stop_querying(client_queue, client_query_id, select_queue, msg, error) # :nodoc: all + stop_querying(client_query_id) + send_result(client_queue, client_query_id, select_queue, msg, error) + end + + # MUST BE CALLED IN A SYNCHRONIZED BLOCK! + # + # Stops send any more packets for a client-level query + def stop_querying(client_query_id) # :nodoc: all + @timeouts.delete(client_query_id) + end + + # MUST BE CALLED IN A SYNCHRONIZED BLOCK! + # + # Sends the result to the client's queue, and removes the queue observer from the select thread + def send_result(client_queue, client_query_id, select_queue, msg, error) # :nodoc: all + stop_querying(client_query_id) # @TODO@ ! + # We might still get some callbacks, which we should ignore + st = SelectThread.instance + st.remove_observer(select_queue, self) + # @mutex.synchronize{ + # Remove the query from all of the data structures + @query_list.delete(client_query_id) + # } + # Return the response to the client + client_queue.push([client_query_id, msg, error]) + end + + # This method is called twice a second from the select loop, in the select thread. + # It should arguably be called from another worker thread... (which also handles the queue) + # Each tick, we check if any timeouts have occurred. If so, we take the appropriate action : + # Return a timeout to the client, or send a new query + def tick # :nodoc: all + # Handle the tick + # Do we have any retries due to be sent yet? + # @mutex.synchronize{ + @parent.single_res_mutex.synchronize { + time_now = Time.now + @timeouts.keys.each do |client_query_id| + msg, client_queue, select_queue, outstanding = @query_list[client_query_id] + query_timeout, timeouts = @timeouts[client_query_id] + if query_timeout < Time.now + # Time the query out + send_result_and_stop_querying(client_queue, client_query_id, select_queue, nil, + ResolvTimeout.new('Query timed out')) + next + end + timeouts_done = [] + timeouts.keys.sort.each do |timeout| + if timeout < time_now + # Send the next query + res, retry_count = timeouts[timeout] + id = [res, msg, client_query_id, retry_count] + Dnsruby.log.debug("Sending msg to #{res.server}") + # We should keep a list of the queries which are outstanding + outstanding.push(id) + timeouts_done.push(timeout) + timeouts.delete(timeout) + + # Pick a new QID here @TODO@ !!! + # msg.header.id = rand(65535); + # print "New query : #{new_msg}\n" + res.send_async(msg, select_queue, id) + else + break + end + end + timeouts_done.each { |t| timeouts.delete(t) } + end + } + end + + # This method is called by the SelectThread (in the select thread) when the queue has a new item on it. + # The queue interface is used to separate producer/consumer threads, but we're using it here in one thread. + # It's probably a good idea to create a new "worker thread" to take items from the select thread queue and + # call this method in the worker thread. + # + def handle_queue_event(queue, id) # :nodoc: all + # Time to process a new queue event. + # If we get a callback for an ID we don't know about, don't worry - + # just ignore it. It may be for a query we've already completed. + # + # So, get the next response from the queue (presuming there is one!) + # + # @TODO@ Tick could poll the queue and then call this method if needed - no need for observer interface. + # @TODO@ Currently, tick and handle_queue_event called from select_thread - could have thread chuck events in to tick_queue. But then, clients would have to call in on other thread! + # + # So - two types of response : + # 1) we've got a coherent response (or error) - stop sending more packets for that query! + # 2) we've validated the response - it's ready to be sent to the client + # + # so need two more methods : + # handleValidationResponse : basically calls send_result_and_stop_querying and + # handleValidationError : does the same as handleValidationResponse, but for errors + # can leave handleError alone + # but need to change handleResponse to stop sending, rather than send_result_and_stop_querying. + # + # @TODO@ Also, we could really do with a MaxValidationTimeout - if validation not OK within + # this time, then raise Timeout (and stop validation)? + # + # @TODO@ Also, should there be some facility to stop validator following same chain + # concurrently? + # + # @TODO@ Also, should have option to speak only to configured resolvers (not follow authoritative chain) + # + if queue.empty? + log_and_raise('Severe internal error - Queue empty in handle_queue_event') + end + event_id, event_type, response, error = queue.pop + # We should remove this packet from the list of outstanding packets for this query + _resolver, _msg, client_query_id, _retry_count = id + if id != event_id + log_and_raise("Serious internal error!! #{id} expected, #{event_id} received") + end + # @mutex.synchronize{ + @parent.single_res_mutex.synchronize { + if @query_list[client_query_id] == nil + # print "Dead query response - ignoring\n" + Dnsruby.log.debug{'Ignoring response for dead query'} + return + end + _msg, _client_queue, _select_queue, outstanding = @query_list[client_query_id] + if event_type == Resolver::EventType::RECEIVED || + event_type == Resolver::EventType::ERROR + unless outstanding.include?(id) + log_and_raise("Query id not on outstanding list! #{outstanding.length} items. #{id} not on #{outstanding}") + end + outstanding.delete(id) + end + # } + if event_type == Resolver::EventType::RECEIVED + # if (event.kind_of?(Exception)) + if error + handle_error_response(queue, event_id, error, response) + else # if event.kind_of?(Message) + handle_response(queue, event_id, response) + # else + # Dnsruby.log.error('Random object #{event.class} returned through queue to Resolver') + end + elsif event_type == Resolver::EventType::VALIDATED + if error + handle_validation_error(queue, event_id, error, response) + else + handle_validation_response(queue, event_id, response) + end + elsif event_type == Resolver::EventType::ERROR + handle_error_response(queue, event_id, error, response) + else + # print "ERROR - UNKNOWN EVENT TYPE IN RESOLVER : #{event_type}\n" + TheLog.error("ERROR - UNKNOWN EVENT TYPE IN RESOLVER : #{event_type}") + end + } + end + + def handle_error_response(select_queue, query_id, error, response) # :nodoc: all + # Handle an error + # @mutex.synchronize{ + Dnsruby.log.debug{"handling error #{error.class}, #{error}"} + # Check what sort of error it was : + resolver, _msg, client_query_id, _retry_count = query_id + _msg, client_queue, select_queue, outstanding = @query_list[client_query_id] + if error.kind_of?(ResolvTimeout) + # - if it was a timeout, then check which number it was, and how many retries are expected on that server + # - if it was the last retry, on the last server, then return a timeout to the client (and clean up) + # - otherwise, continue + # Do we have any more packets to send to this resolver? + + decrement_resolver_priority(resolver) + timeouts = @timeouts[client_query_id] + if outstanding.empty? && timeouts && timeouts[1].values.empty? + Dnsruby.log.debug{'Sending timeout to client'} + send_result_and_stop_querying(client_queue, client_query_id, select_queue, response, error) + end + elsif error.kind_of?(NXDomain) + # - if it was an NXDomain, then return that to the client, and stop all new queries (and clean up) + # send_result_and_stop_querying(client_queue, client_query_id, select_queue, response, error) + increment_resolver_priority(resolver) unless response.cached + stop_querying(client_query_id) + # @TODO@ Does the client want notified at this point? + elsif error.kind_of?(EncodeError) + Dnsruby.log.debug{'Encode error - sending to client'} + send_result_and_stop_querying(client_queue, client_query_id, select_queue, response, error) + else + # - if it was any other error, then remove that server from the list for that query + # If a Too Many Open Files error, then don't remove, but let retry work. + timeouts = @timeouts[client_query_id] + unless error.to_s =~ /Errno::EMFILE/ + Dnsruby.log.debug{"Removing #{resolver.server} from resolver list for this query"} + if timeouts + timeouts[1].each do |key, value| + res = value[0] + if res == resolver + timeouts[1].delete(key) + end + end + end + # Also stick it to the back of the list for future queries + demote_resolver(resolver) + else + Dnsruby.log.debug("NOT Removing #{resolver.server} due to Errno::EMFILE") + end + # - if it was the last server, then return an error to the client (and clean up) + if outstanding.empty? && ((!timeouts) || (timeouts && timeouts[1].values.empty?)) + # if outstanding.empty? + Dnsruby.log.debug{'Sending error to client'} + send_result_and_stop_querying(client_queue, client_query_id, select_queue, response, error) + end + end + # @TODO@ If we're still sending packets for this query, but none are outstanding, then + # jumpstart the next query? + # } + end + + # TO BE CALLED IN A SYNCHRONIZED BLOCK + def increment_resolver_priority(res) + TheLog.debug("Incrementing resolver priority for #{res.server}\n") + # @parent.single_res_mutex.synchronize { + index = @parent.single_resolvers.index(res) + if index > 0 + @parent.single_resolvers.delete(res) + @parent.single_resolvers.insert(index-1,res) + end + # } + end + + # TO BE CALLED IN A SYNCHRONIZED BLOCK + def decrement_resolver_priority(res) + TheLog.debug("Decrementing resolver priority for #{res.server}\n") + # @parent.single_res_mutex.synchronize { + index = @parent.single_resolvers.index(res) + if index < @parent.single_resolvers.length + @parent.single_resolvers.delete(res) + @parent.single_resolvers.insert(index+1,res) + end + # } + end + + # TO BE CALLED IN A SYNCHRONIZED BLOCK + def demote_resolver(res) + TheLog.debug("Demoting resolver priority for #{res.server} to bottom\n") + # @parent.single_res_mutex.synchronize { + @parent.single_resolvers.delete(res) + @parent.single_resolvers.push(res) + # } + end + + def handle_response(select_queue, query_id, response) # :nodoc: all + # Handle a good response + # Should also stick resolver more to the front of the list for future queries + Dnsruby.log.debug('Handling good response') + resolver, _msg, client_query_id, _retry_count = query_id + increment_resolver_priority(resolver) unless response.cached + # @mutex.synchronize{ + _query, _client_queue, s_queue, _outstanding = @query_list[client_query_id] + if s_queue != select_queue + log_and_raise("Serious internal error : expected select queue #{s_queue}, got #{select_queue}") + end + stop_querying(client_query_id) + # @TODO@ Does the client want notified at this point? + # client_queue.push([client_query_id, Resolver::EventType::RECEIVED, msg, nil]) + # } + end + + def handle_validation_response(select_queue, query_id, response) # :nodoc: all + _resolver, _msg, client_query_id, _retry_count = query_id + # @mutex.synchronize { + _query, client_queue, s_queue, _outstanding = @query_list[client_query_id] + if s_queue != select_queue + log_and_raise("Serious internal error : expected select queue #{s_queue}, got #{select_queue}") + end + if response.rcode == RCode.NXDOMAIN + send_result(client_queue, client_query_id, select_queue, response, NXDomain.new) + else + # @TODO@ Was there an error validating? Should we raise an exception for certain security levels? + # This should be configurable by the client. + send_result(client_queue, client_query_id, select_queue, response, nil) + # } + end + end + + def handle_validation_error(select_queue, query_id, error, response) + _resolver, _msg, client_query_id, _retry_count = query_id + _query, client_queue, s_queue, _outstanding = @query_list[client_query_id] + if s_queue != select_queue + log_and_raise("Serious internal error : expected select queue #{s_queue}, got #{select_queue}") + end + # For some errors, we immediately send result. For others, should we retry? + # Either : + # handle_error_response(queue, event_id, error, response) + # Or: + send_result(client_queue, client_query_id, select_queue, response, error) + # + # + end + end +end +require 'dnsruby/single_resolver' diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/A.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/A.rb new file mode 100644 index 000000000000..c2c2732aef68 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/A.rb @@ -0,0 +1,56 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + module IN + # Class for DNS Address (A) resource records. + # + # RFC 1035 Section 3.4.1 + class A < RR + ClassHash[[TypeValue = Types::A, ClassValue = ClassValue]] = self #:nodoc: all + + # The RR's (Resolv::IPv4) address field + attr_accessor :address + + def from_data(data) #:nodoc: all + @address = IPv4.create(data) + end + + # Create the RR from a hash + def from_hash(hash) + @address = IPv4.create(hash[:address]) + end + + # Create the RR from a standard string + def from_string(input) + @address = IPv4.create(input) + end + + def rdata_to_string + return @address.to_s + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_bytes(@address.address) + end + + def self.decode_rdata(msg) #:nodoc: all + return self.new(IPv4.new(msg.get_bytes(4))) + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/AAAA.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/AAAA.rb new file mode 100644 index 000000000000..2d2fa91736c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/AAAA.rb @@ -0,0 +1,54 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + module IN + # Class for DNS IPv6 Address (AAAA) resource records. + # + # RFC 1886 Section 2, RFC 1884 Sections 2.2 & 2.4.4 + class AAAA < RR + ClassHash[[TypeValue = Types::AAAA, ClassValue = ClassValue]] = self #:nodoc: all + + # The RR's (Resolv::IPv6) address field + attr_accessor :address + + def from_data(data) #:nodoc: all + @address = IPv6.create(data) + end + + def from_hash(hash) #:nodoc: all + @address = IPv6.create(hash[:address]) + end + + def from_string(input) #:nodoc: all + @address = IPv6.create(input) + end + + def rdata_to_string #:nodoc: all + return @address.to_s + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_bytes(@address.address) + end + + def self.decode_rdata(msg) #:nodoc: all + return self.new(IPv6.new(msg.get_bytes(16))) + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/AFSDB.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/AFSDB.rb new file mode 100644 index 000000000000..573d1f65c8a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/AFSDB.rb @@ -0,0 +1,68 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + module IN + # Class for DNS AFS Data Base (AFSDB) resource records. + # + # RFC 1183 Section 1 + class AFSDB < RR + ClassHash[[TypeValue = Types::AFSDB, ClassValue = ClassValue]] = self #:nodoc: all + + # The RR's subtype field. See RFC 1183. + attr_accessor :subtype + + # The RR's hostname field. See RFC 1183. + attr_accessor :hostname + + def from_hash(hash) #:nodoc: all + @subtype = hash[:subtype] + @hostname = Name.create(hash[:hostname]) + end + + def from_data(data) #:nodoc: all + @subtype, @hostname = data + end + + def from_string(input) #:nodoc: all + if (input!=nil && (input =~ /^(\d+)\s+(\S+)$/o)) + @subtype = $1; + @hostname = Name.create($2) + end + end + + def rdata_to_string #:nodoc: all + if defined?@subtype + return "#{@subtype} #{@hostname.to_s(true)}" + else + return ''; + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack("n", @subtype.to_i) + msg.put_name(@hostname, canonical) + end + + def self.decode_rdata(msg) #:nodoc: all + subtype, = msg.get_unpack("n") + hostname = msg.get_name + return self.new([subtype, hostname]) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/APL.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/APL.rb new file mode 100644 index 000000000000..a717acbb7202 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/APL.rb @@ -0,0 +1,146 @@ +module Dnsruby + class Prefix + Regex = %r{\A([!])?([12]):(.*)/(\d+)\z} + attr_reader :af, :prefix_length, :negative, :address_lenght, :address + class << self + def create(prefix) #:nodoc: + unless md = Regex.match(prefix) + raise ArgumentError.new('APL format error') + end + negative=md[1] + af = md[2].to_i + prefix_length = md[4].to_i + case af + when 1 + if prefix_length > 32 || + prefix_length < 0 + raise ArgumentError.new('APL IPv4 prefix format error') + end + address = IPv4.create(md[3]) + when 2 + if prefix_length > 128 || + prefix_length < 0 + raise ArgumentError.new('APL IPv6 prefix format error') + end + address = IPv6.create(md[3]) + else + raise ArgumentError.new('APL address family error') + end + address_length = (prefix_length / 8.0).ceil + + Prefix.new(af, prefix_length, negative, address_length, address) + end + end + def initialize(af, prefix_length, negative, address_length, address) + @af = af + @prefix_length = prefix_length + @negative = negative + @address_length = address_length + @address = address + @flag = address_length + @flag |= 0x80 if @negative + end + + def to_s + "#{@negative}#{@af}:#{@address}/#{@prefix_length}" + end + + def put_msg(msg) #:nodoc: all + msg.put_pack('nCC',@af,@prefix_length,@flag) + msg.put_bytes(@address.address[0,@address_length]) + end + end + class Prefixes + attr_accessor :prefixes + class << self + def create(arg) + case arg + when Prefixes + return arg + when String + prefixes = arg.split(/\s/).map { |prefix| Prefix.create(prefix) } + when Array + prefixes = arg.map { |prefix| Prefix.create(prefix) } + else + raise ArgumentError.new("APL format erro #{arg}") + end + Prefixes.new(prefixes) + end + def create_from_message(msg) + prefixes = [] + while(msg.has_remaining?) do + negative = nil + af,prefix_length,flag = msg.get_unpack('nCC') + negative = '!' if 0x80 & flag == 0x80 + address_length = flag & 0x7f + + case(af) + when 1 + addr = msg.get_bytes(address_length) + "\0" * (4 - address_length) + address = IPv4.new(addr) + when 2 + addr = msg.get_bytes(address_length) + "\0" * (16 - address_length) + address = IPv6.new(addr) + else + raise ArgumentError.new("APL format error") + end + prefixes.push(Prefix.new(af, prefix_length, negative, address_length, address)) + end + + Prefixes.new(prefixes) + end + end + def initialize(prefixes) + @prefixes = prefixes + end + + def to_s + @prefixes.map(&:to_s).join(' ') + end + + def encode_rdata(msg, _canonical = false) #:nodoc: all + @prefixes.each do |prefix| + prefix.put_msg(msg) + end + end + end + class RR + module IN + # Class for DNS Address (A) resource records. + # + # RFC 1035 Section 3.4.1 + class APL < RR + ClassHash[[TypeValue = Types::APL, ClassValue = ClassValue]] = self #:nodoc: all + + # The RR's (Resolv::IPv4) address field + attr_accessor :prefixes + + def from_data(data) #:nodoc: all + @prefixes = Prefixes.create(data) + end + + # Create the RR from a hash + def from_hash(hash) + @prefixes = Prefixes.create(hash[:prefixes]) + end + + # Create the RR from a standard string + def from_string(input) + @prefixes = Prefixes.create(input) + end + + def rdata_to_string + @prefixes.to_s + end + + def encode_rdata(msg, canonical = false) #:nodoc: all + @prefixes.encode_rdata(msg,canonical) + end + + def self.decode_rdata(msg) #:nodoc: all + new(Prefixes.create_from_message(msg)) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CAA.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CAA.rb new file mode 100644 index 000000000000..69a61b84c577 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CAA.rb @@ -0,0 +1,72 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for CAA resource records. + # RFC 6844 + class CAA < RR + ClassValue = nil #:nodoc: all + TypeValue= Types::CAA #:nodoc: all + + # The property tag for the record (issue|issuewild|iodef) + attr_accessor :property_tag + # The value for the property_tag + attr_accessor :property_value + # The value for the flag + attr_accessor :flag + + def from_hash(hash) #:nodoc: all + @property_tag = hash[:property_tag] + @property_value = hash[:property_value] + @flag = hash[:flag] + end + + def from_data(data) #:nodoc: all + @flag, @property_tag, @property_value = data + end + + def flag + @flag.to_i + end + + def from_string(input) #:nodoc: all + matches = (/(\d+) (issuewild|issue|iodef|contactemail|contactphone) "(.+)"$/).match(input) + @flag = matches[1] + @property_tag = matches[2] + @property_value = matches[3] + end + + def rdata_to_string #:nodoc: all + "#{flag} #{@property_tag} \"#{@property_value}\"" + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack('C', flag) + msg.put_string(@property_tag) + # We don't put a length byte on the final string. + msg.put_bytes(@property_value) + end + + def self.decode_rdata(msg) #:nodoc: all + flag, = msg.get_unpack('C') + property_tag = msg.get_string + # The final string has no length byte - its length is implicit as the remainder of the packet length + property_value = msg.get_bytes + return self.new("#{flag} #{property_tag} \"#{property_value}\"") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CDNSKEY.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CDNSKEY.rb new file mode 100644 index 000000000000..86bfe59a2663 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CDNSKEY.rb @@ -0,0 +1,17 @@ +module Dnsruby + class RR + # RFC4034, section 2 + # DNSSEC uses public key cryptography to sign and authenticate DNS + # resource record sets (RRsets). The public keys are stored in DNSKEY + # resource records and are used in the DNSSEC authentication process + # described in [RFC4035]: A zone signs its authoritative RRsets by + # using a private key and stores the corresponding public key in a + # DNSKEY RR. A resolver can then use the public key to validate + # signatures covering the RRsets in the zone, and thus to authenticate + # them. + class CDNSKEY < DNSKEY + ClassValue = nil #:nodoc: all + TypeValue = Types::CDNSKEY #:nodoc: all + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CDS.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CDS.rb new file mode 100644 index 000000000000..740dfae5b008 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CDS.rb @@ -0,0 +1,35 @@ +# -- +# Copyright 2018 Caerketton Tech Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # RFC4034, section 4 + # The DS Resource Record refers to a DNSKEY RR and is used in the DNS + # DNSKEY authentication process. A DS RR refers to a DNSKEY RR by + # storing the key tag, algorithm number, and a digest of the DNSKEY RR. + # Note that while the digest should be sufficient to identify the + # public key, storing the key tag and key algorithm helps make the + # identification process more efficient. By authenticating the DS + # record, a resolver can authenticate the DNSKEY RR to which the DS + # record points. The key authentication process is described in + # [RFC4035]. + + class CDS < DS + + ClassValue = nil #:nodoc: all + TypeValue = Types::CDS #:nodoc: all + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CERT.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CERT.rb new file mode 100644 index 000000000000..1a82385f216e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/CERT.rb @@ -0,0 +1,105 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Certificate (CERT) resource records. (see RFC 2538) + # + # RFC 2782 + class CERT < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::CERT #:nodoc: all + + # Returns the format code for the certificate + attr_accessor :certtype + # Returns the key tag for the public key in the certificate + attr_accessor :keytag + # Returns the algorithm used by the certificate + attr_accessor :alg + # Returns the data comprising the certificate itself (in raw binary form) + attr_accessor :cert + + class CertificateTypes < CodeMapper + PKIX = 1 # PKIX (X.509v3) + SPKI = 2 # Simple Public Key Infrastructure + PGP = 3 # Pretty Good Privacy + IPKIX = 4 # URL of an X.509 data object + ISPKI = 5 # URL of an SPKI certificate + IPGP = 6 # Fingerprint and URL of an OpenPGP packet + ACPKIX = 7 # Attribute Certificate + IACPKIX = 8 # URL of an Attribute Certificate + URI = 253 # Certificate format defined by URI + OID = 254 # Certificate format defined by OID + + update() + end + + def from_data(data) #:nodoc: all + @certtype = CertificateTypes::new(data[0]) + @keytag = data[1] + @alg = Dnsruby::Algorithms.new(data[2]) + @cert= data[3] + end + + def from_hash(hash) #:nodoc: all + @certtype = CertificateTypes::new(hash[:certtype]) + @keytag = hash[:keytag] + @alg = Dnsruby::Algorithms.new(hash[:alg]) + @cert= hash[:cert] + end + + def from_string(input) #:nodoc: all + if (input != "") + names = input.split(" ") + begin + @certtype = CertificateTypes::new(names[0]) + rescue ArgumentError + @certtype = CertificateTypes::new(names[0].to_i) + end + @keytag = names[1].to_i + begin + @alg = Dnsruby::Algorithms.new(names[2]) + rescue ArgumentError + @alg = Dnsruby::Algorithms.new(names[2].to_i) + end + buf = "" + (names.length - 3).times {|index| + buf += names[index + 3] + } + + + buf.gsub!(/\n/, "") + buf.gsub!(/ /, "") + @cert = buf.unpack("m*").first + end + end + + def rdata_to_string #:nodoc: all + return "#{@certtype.string} #{@keytag} #{@alg.string} #{[@cert.to_s].pack("m*").gsub("\n", "")}" + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack('nnc', @certtype.code, @keytag, @alg.code) + msg.put_bytes(@cert) + end + + def self.decode_rdata(msg) #:nodoc: all + certtype, keytag, alg = msg.get_unpack('nnc') + cert = msg.get_bytes + return self.new([certtype, keytag, alg, cert]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DHCID.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DHCID.rb new file mode 100644 index 000000000000..2af194487dda --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DHCID.rb @@ -0,0 +1,55 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS DHCP ID (DHCID) resource records. + # RFC 4701 + class DHCID < RR + ClassValue = nil #:nodoc: all + TypeValue= Types::DHCID #:nodoc: all + + # The opaque rdata for DHCID + attr_accessor :dhcid_data + + def from_hash(hash) #:nodoc: all + @dhcid_data = hash[:dhcid_data] + end + + def from_data(data) #:nodoc: all + @dhcid_data, = data + end + + def from_string(input) #:nodoc: all + buf = input.gsub(/\n/, "") + buf.gsub!(/ /, "") + @dhcid_data = buf.unpack("m*").first + end + + def rdata_to_string #:nodoc: all + return "#{[@dhcid_data.to_s].pack("m*").gsub("\n", "")}" + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_bytes(@dhcid_data) + end + + def self.decode_rdata(msg) #:nodoc: all + dhcid_data, = msg.get_bytes() + return self.new([dhcid_data]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DLV.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DLV.rb new file mode 100644 index 000000000000..26ed2fa4dc6e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DLV.rb @@ -0,0 +1,27 @@ +# -- +# Copyright 2008 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +module Dnsruby + class RR + # RFC4431 specifies that the DLV is assigned type 32769, and the + # rdata is identical to that of the DS record. + + class DLV < RR::DS + ClassValue = nil #:nodoc: all + TypeValue = Types::DLV #:nodoc: all + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DNSKEY.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DNSKEY.rb new file mode 100644 index 000000000000..a5b587efa54c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DNSKEY.rb @@ -0,0 +1,400 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License f181or the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # RFC4034, section 2 + # DNSSEC uses public key cryptography to sign and authenticate DNS + # resource record sets (RRsets). The public keys are stored in DNSKEY + # resource records and are used in the DNSSEC authentication process + # described in [RFC4035]: A zone signs its authoritative RRsets by + # using a private key and stores the corresponding public key in a + # DNSKEY RR. A resolver can then use the public key to validate + # signatures covering the RRsets in the zone, and thus to authenticate + # them. + class DNSKEY < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::DNSKEY #:nodoc: all + + # Key is revoked + REVOKED_KEY = 0x80 + + # Key is a zone key + ZONE_KEY = 0x100 + + # Key is a secure entry point key + SEP_KEY = 0x1 + + # The flags for the DNSKEY RR + attr_reader :flags + # The protocol for this DNSKEY RR. + # MUST be 3. + attr_reader :protocol + # The algorithm used for this key + # See Dnsruby::Algorithms for permitted values + attr_reader :algorithm + # The public key + attr_reader :key + # The length (in bits) of the key - NOT key.length + attr_reader :key_length + + def init_defaults + @make_new_key_tag = false + self.protocol=3 + self.flags=ZONE_KEY + @algorithm=Algorithms.RSASHA1 + @public_key = nil + @key_tag = nil + @make_new_key_tag = true + end + + def protocol=(p) + if (p!=3) + raise DecodeError.new("DNSKEY protocol field set to #{p}, contrary to RFC4034 section 2.1.2") + else @protocol = p + end + get_new_key_tag + end + + def algorithm=(a) + if (a.instance_of?String) + if (a.to_i > 0) + a = a.to_i + end + end + begin + alg = Algorithms.new(a) + @algorithm = alg + rescue ArgumentError => e + raise DecodeError.new(e) + end + get_new_key_tag + end + + def revoked=(on) + if (on) + @flags |= REVOKED_KEY + else + @flags &= (~REVOKED_KEY) + end + get_new_key_tag + end + + def revoked? + return ((@flags & REVOKED_KEY) > 0) + end + + def zone_key=(on) + if (on) + @flags |= ZONE_KEY + else + @flags &= (~ZONE_KEY) + end + get_new_key_tag + end + + def zone_key? + return ((@flags & ZONE_KEY) > 0) + end + + def sep_key=(on) + if (on) + @flags |= SEP_KEY + else + @flags &= (~SEP_KEY) + end + get_new_key_tag + end + + def sep_key? + return ((@flags & SEP_KEY) > 0) + end + + def flags=(f) + # Only three values allowed - + # Zone Key flag (bit 7) + # Secure Entry Point flag (bit 15) + # Revoked bit (bit 8) - RFC 5011 + if ((f & ~ZONE_KEY & ~SEP_KEY & ~REVOKED_KEY) > 0) + TheLog.info("DNSKEY: Only zone key, secure entry point and revoked flags allowed for DNSKEY" + + " (RFC4034 section 2.1.1) : #{f} entered as input") + end + + @flags = f + get_new_key_tag + end + + # def bad_flags? + # if ((@flags & ~ZONE_KEY & ~SEP_KEY) > 0) + # return true + # end + # return false + # end + # + def from_data(data) #:nodoc: all + flags, protocol, algorithm, @key = data + @make_new_key_tag = false + self.flags=(flags) + self.protocol=(protocol) + self.algorithm=(algorithm) + @make_new_key_tag = true + get_new_key_tag + end + + def from_hash(hash) #:nodoc: all + @make_new_key_tag = false + hash.keys.each do |param| + send(param.to_s+"=", hash[param]) + end + @make_new_key_tag = true + get_new_key_tag + end + + def from_string(input) + if (input.length > 0) + @make_new_key_tag = false + data = input.split(" ") + self.flags=(data[0].to_i) + self.protocol=(data[1].to_i) + self.algorithm=(data[2]) + # key can include whitespace - include all text + # until we come to " )" at the end, and then gsub + # the white space out + # Also, brackets may or may not be present + # Not to mention comments! ";" + buf = "" + index = 3 + end_index = data.length - 1 + if (data[index]=="(") + end_index = data.length - 2 + index = 4 + end + (index..end_index).each {|i| + if (comment_index = data[i].index(";")) + buf += data[i].slice(0, comment_index) + # @TODO@ We lose the comments here - we should really keep them for when we write back to string format? + break + else + buf += data[i] + end + } + self.key=(buf) + @make_new_key_tag = true + get_new_key_tag + end + end + + def rdata_to_string #:nodoc: all + if (@flags!=nil) + # return "#{@flags} #{@protocol} #{@algorithm.string} ( #{Base64.encode64(@key.to_s)} )" + return "#{@flags} #{@protocol} #{@algorithm.string} ( #{[@key.to_s].pack("m*").gsub("\n", "")} ) ; key_tag=#{key_tag}" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + # 2 octets, then 2 sets of 1 octet + msg.put_pack('ncc', @flags, @protocol, @algorithm.code) + msg.put_bytes(@key) + end + + def self.decode_rdata(msg) #:nodoc: all + # 2 octets, then 2 sets of 1 octet + flags, protocol, algorithm = msg.get_unpack('ncc') + key = msg.get_bytes + return self.new( + [flags, protocol, algorithm, key]) + end + + # Return the the key tag this key would have had before it was revoked + # If the key is not revoked, then the current key_tag will be returned + def key_tag_pre_revoked + if (!revoked?) + return key_tag + end + new_key = clone + new_key.revoked = false + return new_key.key_tag + end + + def get_new_key_tag + if (@make_new_key_tag) + rdata = MessageEncoder.new {|msg| + encode_rdata(msg) + }.to_s + tag = generate_key_tag(rdata, @algorithm) + @key_tag = tag + end + end + + # Return the tag for this key + def key_tag + if (!@key_tag) + @make_new_key_tag = true + get_new_key_tag + end + return @key_tag + end + + def generate_key_tag(rdata, algorithm) + tag=0 + if (algorithm == Algorithms.RSAMD5) + # The key tag for algorithm 1 (RSA/MD5) is defined differently from the + # key tag for all other algorithms, for historical reasons. + d1 = rdata[rdata.length - 3] & 0xFF + d2 = rdata[rdata.length - 2] & 0xFF + tag = (d1 << 8) + d2 + else + tag = 0 + last = 0 + 0.step(rdata.length - 1, 2) {|i| + last = i + d1 = rdata[i] + d2 = rdata[i + 1] || 0 # odd number of bytes possible + + d1 = d1.getbyte(0) if d1.class == String # Ruby 1.9 + d2 = d2.getbyte(0) if d2.class == String # Ruby 1.9 + + d1 = d1 & 0xFF + d2 = d2 & 0xFF + + tag += ((d1 << 8) + d2) + } + last+=2 + if (last < rdata.length) + d1 = rdata[last] + + if (d1.class == String) # Ruby 1.9 + d1 = d1.getbyte(0) + end + + d1 = d1 & 0xFF + tag += (d1 << 8) + end + tag += ((tag >> 16) & 0xFFFF) + end + tag=tag&0xFFFF + return tag + end + + def key=(key_text) + begin + key_text.gsub!(/\n/, "") + key_text.gsub!(/ /, "") + # @key=Base64.decode64(key_text) + @key=key_text.unpack("m*")[0] + public_key + get_new_key_tag + rescue Exception + raise ArgumentError.new("Key #{key_text} invalid") + end + end + + def public_key + if (!@public_key) + if [Algorithms.RSASHA1, + Algorithms.RSASHA256, + Algorithms.RSASHA512, + Algorithms.RSASHA1_NSEC3_SHA1].include?(@algorithm) + @public_key = rsa_key + elsif [Algorithms.DSA, + Algorithms.DSA_NSEC3_SHA1].include?(@algorithm) + @public_key = dsa_key + elsif [Algorithms.ECDSAP256SHA256, Algorithms.ECDSAP384SHA384].include?(@algorithm) + @public_key = ec_key(Algorithms.ECDSAP256SHA256 == @algorithm ? 'prime256v1' : 'secp384r1') + end + end + # @TODO@ Support other key encodings! + return @public_key + end + + def rsa_key + exponentLength = @key[0] + if (exponentLength.class == String) + exponentLength = exponentLength.getbyte(0) # Ruby 1.9 + end + pos = 1 + if (exponentLength == 0) + key1 = @key[1] + if (key1.class == String) # Ruby 1.9 + key1 = key1.getbyte(0) + end + exponentLength = (key1<<8) + key1 + pos += 2 + end + exponent = RR::get_num(@key[pos, exponentLength]) + pos += exponentLength + + modulus = RR::get_num(@key[pos, @key.length]) + @key_length = (@key.length - pos) * 8 + + pkey = OpenSSL::PKey::RSA.new + begin + pkey.set_key(modulus, exponent, nil) # use set_key, present in later versions of openssl gem + rescue NoMethodError + pkey.e = exponent # set_key not available in earlier versions, use this approach instead + pkey.n = modulus + end + return pkey + end + + def dsa_key + t = @key[0] + t = t.getbyte(0) if t.class == String + pgy_len = t * 8 + 64 + pos = 1 + q = RR::get_num(@key[pos, 20]) + pos += 20 + p = RR::get_num(@key[pos, pgy_len]) + pos += pgy_len + g = RR::get_num(@key[pos, pgy_len]) + pos += pgy_len + y = RR::get_num(@key[pos, pgy_len]) + pos += pgy_len + @key_length = (pgy_len * 8) + + pkey = OpenSSL::PKey::DSA.new + begin + pkey.set_pgq(p,g,q) + pkey.set_key(y, nil) # use set_pgq and set_key, present in later versions of openssl gem + rescue NoMethodError + pkey.p = p # set_key not available in earlier versions, use this approach instead + pkey.q = q + pkey.g = g + pkey.pub_key = y + end + + pkey + end + + # RFC6605, section 4 + # ECDSA public keys consist of a single value, called "Q" in FIPS + # 186-3. In DNSSEC keys, Q is a simple bit string that represents the + # uncompressed form of a curve point, "x | y". + def ec_key(curve = 'prime256v1') + group = OpenSSL::PKey::EC::Group.new(curve) + pkey = OpenSSL::PKey::EC.new(group) + + # DNSSEC pub does not have first octet that determines whether it's uncompressed + # or compressed form, but it's required by OpenSSL to parse EC point correctly + point_from_pub = "\x04" + @key.to_s # octet string, \x04 prefix determines uncompressed + pkey.public_key = OpenSSL::PKey::EC::Point.new(group, point_from_pub) + + pkey + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DS.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DS.rb new file mode 100644 index 000000000000..6ed0331358aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/DS.rb @@ -0,0 +1,256 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +require 'base64' +begin +require 'Digest/sha2' +rescue LoadError + require 'digest/sha2' +end +module Dnsruby + class RR + # RFC4034, section 4 + # The DS Resource Record refers to a DNSKEY RR and is used in the DNS + # DNSKEY authentication process. A DS RR refers to a DNSKEY RR by + # storing the key tag, algorithm number, and a digest of the DNSKEY RR. + # Note that while the digest should be sufficient to identify the + # public key, storing the key tag and key algorithm helps make the + # identification process more efficient. By authenticating the DS + # record, a resolver can authenticate the DNSKEY RR to which the DS + # record points. The key authentication process is described in + # [RFC4035]. + + class DS < RR + class DigestTypes < CodeMapper + update() + add_pair("SHA-1", 1) + add_pair("SHA-256", 2 ) + add_pair("SHA-384", 4) + end + + ClassValue = nil #:nodoc: all + TypeValue = Types::DS #:nodoc: all + + # The RDATA for a DS RR consists of a 2 octet Key Tag field, a 1 octet + # Algorithm field, a 1 octet Digest Type field, and a Digest field. + # + # 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 + # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + # | Key Tag | Algorithm | Digest Type | + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + # / / + # / Digest / + # / / + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + + # The Key Tag field lists the key tag of the DNSKEY RR referred to by + # the DS record, in network byte order. + attr_accessor :key_tag + # The algorithm used for this key + # See Dnsruby::Algorithms for permitted values + attr_reader :algorithm + # The DS RR refers to a DNSKEY RR by including a digest of that DNSKEY + # RR. The Digest Type field identifies the algorithm used to construct + # the digest. + attr_reader :digest_type + # The DS record refers to a DNSKEY RR by including a digest of that + # DNSKEY RR. + attr_accessor :digest + attr_accessor :digestbin + + def digest_type=(d) + dig = DS.get_digest_type(d) + @digest_type = dig + end + + def DS.get_digest_type(d) + if (d.instance_of?String) + if (d.length == 1) + d = d.to_i + end + end + begin + digest = DigestTypes.new(d) + return digest + rescue ArgumentError => e + raise DecodeError.new(e) + end + end + + def algorithm=(a) + if (a.instance_of?String) + if (a.length < 3) + a = a.to_i + end + end + begin + alg = Algorithms.new(a) + @algorithm = alg + rescue ArgumentError => e + raise DecodeError.new(e) + end + end + + # Return the digest of the specified DNSKEY RR + def digest_key(*args) # key, digest_type) + digest_type = @digest_type + key = args[0] + if (args.length == 2) + digest_type = args[1] + end + + + data = MessageEncoder.new {|msg| + msg.put_name(key.name, true) + key.encode_rdata(msg, true) + }.to_s + + + if (digest_type.code == 1) + digestbin = OpenSSL::Digest::SHA1.digest(data) + return digestbin + elsif (digest_type.code == 2) + digestbin = OpenSSL::Digest::SHA256.digest(data) + return digestbin + elsif (digest_type.code == 4) + digestbin = OpenSSL::Digest::SHA384.digest(data) + return digestbin + end + + end + + # Check if the key's digest is the same as that stored in the DS record + def check_key(key) + if ((key.key_tag == @key_tag) && (key.algorithm == @algorithm)) + + digestbin = digest_key(key) + if (@digestbin == digestbin) + if (!key.zone_key?) + else + return true + end + else + end + end + return false + end + + + def DS.from_key(key, digest_type) +# # The key must not be a NULL key. +# if ((key.flags & 0xc000 ) == 0xc000 ) +# puts "\nCreating a DS record for a NULL key is illegal" +# return +# end +# +# # Bit 0 must not be set. +# if (key.flags & 0x8000) +# puts "\nCreating a DS record for a key with flag bit 0 set " + +# "to 0 is illegal" +# return +# end +# + # Bit 6 must be set to 0 bit 7 must be set to 1 + if (( key.flags & 0x300) != 0x100) + puts "\nCreating a DS record for a key with flags 6 and 7 not set "+ + "0 and 1 respectively is illegal" + return + end +# +# +# if (key.protocol != 3 ) +# puts "\nCreating a DS record for a non DNSSEC (protocol=3) " + +# "key is illegal" +# return +# end +# + digest_type = get_digest_type(digest_type) + # Create a new DS record from the specified key + ds = RR.create(:name => key.name, :type => "DS", :ttl => key.ttl, + :key_tag => key.key_tag, + :digest_type => digest_type, :algorithm => key.algorithm) + + ds.digestbin = ds.digest_key(key, digest_type) + ds.digest = ds.digestbin.unpack("H*")[0] + return ds + end + + def from_data(data) #:nodoc: all + key_tag, algorithm, digest_type, digest = data + self.key_tag=(key_tag) + self.algorithm=(algorithm) + self.digest_type=(digest_type) + self.digestbin=(digest) + self.digest=@digestbin.unpack("H*")[0] + end + + def from_string(input) + if (input.length > 0) + data = input.split(" ") + self.key_tag=(data[0].to_i) + self.algorithm=(data[1]) + self.digest_type=(data[2]) + + buf = "" + index = 3 + end_index = data.length - 1 + if (data[index]=="(") + end_index = data.length - 2 + index = 4 + end + (index..end_index).each {|i| + if (comment_index = data[i].index(";")) + buf += data[i].slice(0, comment_index) + # @TODO@ We lose the comments here - we should really keep them for when we write back to string format? + break + else + buf += data[i] + end + } +# self.digest=Base64.decode64(buf) + buf.gsub!(/\n/, "") + buf.gsub!(/ /, "") +# self.digest=buf.unpack("m*")[0] + self.digest=buf + self.digestbin = [buf].pack("H*") + end + end + + def rdata_to_string #:nodoc: all + if (@key_tag != nil) +# return "#{@key_tag.to_i} #{@algorithm.string} #{@digest_type} ( #{Base64.encode64(@digest)} )" +# return "#{@key_tag.to_i} #{@algorithm.string} #{@digest_type.code} ( #{[@digest].pack("m*").gsub("\n", "")} )" + return "#{@key_tag.to_i} #{@algorithm.string} #{@digest_type.code} ( #{@digest.upcase} )" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack("ncc", @key_tag, @algorithm.code, @digest_type.code) + msg.put_bytes(@digestbin) + end + + def self.decode_rdata(msg) #:nodoc: all + key_tag, algorithm, digest_type = msg.get_unpack("ncc") + digest = msg.get_bytes + return self.new( + [key_tag, algorithm, digest_type, digest]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/GPOS.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/GPOS.rb new file mode 100644 index 000000000000..553b43da137d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/GPOS.rb @@ -0,0 +1,193 @@ +# encoding: ASCII-8BIT + +module Dnsruby + class RR + # Class for Geographic Position (GPOS) resource records. + # + # RFC 1712 (https://www.ietf.org/rfc/rfc1712.txt) + class GPOS < RR + + TypeValue = Types::GPOS + ClassValue = Classes::IN + ClassHash[[TypeValue, ClassValue]] = self #:nodoc: all + + attr_accessor :longitude, :latitude, :altitude # NOTE: these are strings, not numbers + + REQUIRED_KEYS = [:longitude, :latitude, :altitude] + + + # As with all resource record subclasses of RR, this class cannot be + # directly instantiated, but instead must be instantiated via use of + # one of the RR class methods. These GPOS class methods are wrappers + # around those RR methods, so that there is an interface on the GPOS + # class for creating GPOS instances. + + # Create an instance from a hash of parameters, e.g.: + # { + # name: 'techhumans.com', + # type: Types::GPOS, + # ttl: 1234, + # longitude: '10.0', + # latitude: '20.0', + # altitude: '30.0', + # } + # + # Since the type is assumed to be GPOS, it will be assigned + # automatially, and any other value will be overwritten. + # Therefore, having it present in the hash is not necessary. + + def self.new_from_hash(gpos_params_hash) + gpos_params_hash[:type] = Types::GPOS + RR.new_from_hash(gpos_params_hash) + end + + + # Create an instance from a string containing parameters, e.g.: + # 'a.dnsruby.com. 10800 IN GPOS 10.0 20.0 30.0' + def self.new_from_string(gpos_params_string) + RR.new_from_string(gpos_params_string) + end + + + # Create an instance from an ordered parameter list, e.g.: + # EXAMPLE_GPOS_DATA = begin + # rdata = RR::GPOS.build_rdata(EXAMPLE_LONGITUDE, EXAMPLE_LATITUDE, EXAMPLE_ALTITUDE) + # [EXAMPLE_HOSTNAME, Types::GPOS, Classes::IN, EXAMPLE_TTL, rdata.length, rdata, 0] + # end + # self.from_data(*EXAMPLE_GPOS_DATA) + def self.new_from_data(*gpos_params_data) + RR.new_from_data(*gpos_params_data) + end + + + def from_data(array) + unless array.size == 3 + raise "Array size for creating GPOS record must be 3 (long, lat, alt). Array was:\n#{array.inspect}" + end + + from_hash({ + longitude: array[0], + latitude: array[1], + altitude: array[2] + }) + end + + def from_hash(init_data) + self.class.validate_floats(init_data) + @longitude = init_data[:longitude].to_s + @latitude = init_data[:latitude].to_s + @altitude = init_data[:altitude].to_s + self.rdata = build_rdata + self + end + + def from_string(string) + # Convert commas to spaces, then split by spaces: + from_data(string.gsub(',', ' ').split(' ')) + end + + # From the RFC: + # GPOS has the following format: + # <owner> <ttl> <class> GPOS <longitude> <latitude> <altitude> + # + # We handle the rdata, the RR superclass does the rest. + def rdata_to_string + [longitude, latitude, altitude].join(' ') + end + + def encode_rdata(msg, _canonical) + msg.put_bytes(build_rdata) + end + + def build_rdata + self.class.build_rdata(longitude, latitude, altitude) + end + + def self.build_rdata(longitude, latitude, altitude) + binary_string = ''.force_encoding('ASCII-8BIT') + + binary_string << longitude.length.chr + binary_string << longitude + binary_string << latitude.length.chr + binary_string << latitude + binary_string << altitude.length.chr + binary_string << altitude + binary_string + end + + def self.decode_rdata(message) + rdata_s = message.get_bytes.clone + + index = 0 + + long_len = rdata_s[index].ord; index += 1 + longitude = rdata_s[index, long_len]; index += long_len + + lat_len = rdata_s[index].ord; index += 1 + latitude = rdata_s[index, lat_len]; index += lat_len + + alt_len = rdata_s[index].ord; index += 1 + altitude = rdata_s[index, alt_len]; index += alt_len + + validate_latitude(latitude) + validate_longitude(longitude) + + new([longitude, latitude, altitude].join(' ')) # e.g. "10.0 20.0 30.0" + end + + # 'name' is used in the RR superclass, but 'owner' is the term referred to + # in the RFC, so we'll make owner an alias for name. + def owner + name + end + + # 'name' is used in the RR superclass, but 'owner' is the term referred to + # in the RFC, so we'll make owner an alias for name. + def owner=(owner_string) + self.name = owner_string + end + + def self.valid_float?(object) + begin + Float(object) + true + rescue + false + end + end + + def self.validate_float_in_range(label, object, bound) + number = Float(object) + valid_range = (-Float(bound)..Float(bound)) + unless valid_range.include?(number) + raise "Value of #{label} (#{number}) was not in the range #{valid_range}." + end + end + + def self.validate_longitude(value) + validate_float_in_range('longitude', value, 180) + end + + def self.validate_latitude(value) + validate_float_in_range('latitude', value, 90) + end + + def self.validate_floats(init_data) + bad_float_keys = REQUIRED_KEYS.reject { |key| valid_float?(init_data[key]) } + unless bad_float_keys.empty? + message = "The following key value pair(s) do not have valid floats or float strings:\n" + bad_float_keys.each do |key| + message << "%:-12.12s => %s\n" % [init_data[key]] + end + raise message + end + + validate_longitude(init_data[:longitude]) + validate_latitude(init_data[:latitude]) + end + end + end +end + + + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/HINFO.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/HINFO.rb new file mode 100644 index 000000000000..66600644b611 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/HINFO.rb @@ -0,0 +1,72 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Host Information (HINFO) resource records. + class HINFO < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::HINFO #:nodoc: all + + # The CPU type for this RR. + attr_accessor :cpu + # The operating system type for this RR. + attr_accessor :os + + def from_data(data) #:nodoc: all + @cpu, @os= data + end + + def from_string(input) #:nodoc: all + strings = TXT.parse(input) + cpu = "" + os = "" + if (strings.length == 1) + cpu, os = input.split(" ") + else + cpu = strings[0] + os = strings[1] + end + cpu.sub!(/^\"/, "") + @cpu = cpu.sub(/\"$/, "") + os.sub!(/^\"/, "") + @os = os.sub(/\"$/, "") + end + + def rdata_to_string #:nodoc: all + if (defined?@cpu) + temp = [] + [@cpu, @os].each {|str| + output = TXT.display(str) + temp.push("\"#{output}\"") + } + return temp.join(' ') + end + return '' + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_string(@cpu) + msg.put_string(@os) + end + + def self.decode_rdata(msg) #:nodoc: all + cpu = msg.get_string + os = msg.get_string + return self.new([cpu, os]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/HIP.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/HIP.rb new file mode 100644 index 000000000000..d34b5783ab02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/HIP.rb @@ -0,0 +1,138 @@ + +# -- +# Copyright 2009 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + class HIP < RR + + ClassValue = nil #:nodoc: all + TypeValue = Types::HIP #:nodoc: all + + # An 8-bit length for the HIT field + attr_accessor :hit_length + # The PK algorithm used : + # 0 - no key present + # 1 - DSA key present + # 2 - RSA key present + attr_accessor :pk_algorithm + # An 8-bit length for the Public Key field + attr_accessor :pk_length + + # An array of Rendezvous Servers + attr_accessor :rsvs + + def from_data(data) #:nodoc: all + @rsvs=[] + @hit_length = data[0] + @pk_algorithm = data[1] + @pk_length = data[2] + @hit = data[3] + @public_key = data[4] + @rsvs = data[5] + end + + def from_hash(hash) + @rsvs=[] + @hit_length = hash[:hit_length] + @pk_algorithm = hash[:pk_algorithm] + @pk_length = hash[:pk_length] + @hit = hash[:hit] + @public_key = hash[:public_key] + if (hash[:rsvs]) + hash[:rsvs].each {|rsv| + @rsvs.push(Name.create(rsv)) + } + end + end + + # HIT field - stored in binary : client methods should handle base16(hex) encoding + def hit_string + # Return hex value + [@hit.to_s].pack("H*").gsub("\n", "") + end + def hit_from_string(hit_text) + # Decode the hex value + hit_text.gsub!(/\n/, "") + hit_text.gsub!(/ /, "") + return hit_text.unpack("H*")[0] + end + + # Public Key field - presentation format is base64 - public_key methods reused from IPSECKEY + def public_key_string + [@public_key.to_s].pack("m*").gsub("\n", "") + end + + def public_key_from_string(key_text) + key_text.gsub!(/\n/, "") + key_text.gsub!(/ /, "") + return key_text.unpack("m*")[0] + end + + def from_string(input) + @rsvs=[] + if (input.length > 0) + split = input.split(" ") + + @pk_algorithm = split[0].to_i + @hit = hit_from_string(split[1]) + @hit_length = @hit.length + @public_key = public_key_from_string(split[2]) + @pk_length = @public_key.length + + # Now load in any RSVs there may be + count = 3 + while (split[count]) + @rsvs.push(Name.create(split[count])) + count += 1 + end + + end + end + + def rdata_to_string #:nodoc: all + ret = "#{@pk_algorithm} #{hit_string} #{public_key_string}" + @rsvs.each {|rsv| + ret += " #{rsv.to_s(true)}" + } + return ret + end + + def encode_rdata(msg, canonical=false) #:nodoc: all\ + msg.put_pack('ccC', @hit_length, @pk_algorithm, @pk_length) + msg.put_bytes(@hit) + msg.put_bytes(@public_key) + @rsvs.each {|rsv| + # RSVs MUST NOT be compressed + msg.put_name(rsv, true) + } + end + + def self.decode_rdata(msg) #:nodoc: all + hit_length, pk_algorithm, pk_length = msg.get_unpack('ccC') + hit = msg.get_bytes(hit_length) + public_key = msg.get_bytes(pk_length) + rsvs = [] + # Load in the RSV names, if there are any + while (msg.has_remaining?) + name = msg.get_name + rsvs.push(name) + end + return self.new( + [hit_length, pk_algorithm, pk_length, hit, public_key, rsvs]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/IN.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/IN.rb new file mode 100644 index 000000000000..cccfc7793577 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/IN.rb @@ -0,0 +1,111 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + ClassInsensitiveTypes = { + Types::NS => NS, + Types::CNAME => CNAME, + Types::DNAME => DNAME, + Types::URI => URI, + Types::DS => DS, + Types::CDS => CDS, + Types::DNSKEY => DNSKEY, + Types::CDNSKEY => CDNSKEY, + Types::SOA => SOA, + Types::PTR => PTR, + Types::HINFO => HINFO, + Types::MINFO => MINFO, + Types::MX => MX, + Types::TXT => TXT, + Types::ISDN => ISDN, + Types::MB => MB, + Types::MG => MG, + Types::MR => MR, + Types::NAPTR => NAPTR, + Types::NSAP => NSAP, + Types::OPT => OPT, + Types::RP => RP, + Types::RT => RT, + Types::X25 => X25, + Types::KX => KX, + Types::SPF => SPF, + Types::CERT => CERT, + Types::LOC => LOC, + Types::TSIG => TSIG, + Types::TKEY => TKEY, + Types::ANY => ANY, + Types::RRSIG => RRSIG, + Types::NSEC => NSEC, + Types::NSEC3 => NSEC3, + Types::NSEC3PARAM => NSEC3PARAM, + Types::DLV => DLV, + Types::SSHFP => SSHFP, + Types::IPSECKEY => IPSECKEY, + Types::HIP => HIP, + Types::DHCID => DHCID, + Types::GPOS => GPOS, + Types::NXT => NXT, + Types::CAA => CAA, + } #:nodoc: all + + # module IN contains ARPA Internet specific RRs + module IN + ClassValue = Classes::IN + + ClassInsensitiveTypes::values::each {|s| + c = Class.new(s) + # c < Record + c.const_set(:TypeValue, s::TypeValue) + c.const_set(:ClassValue, ClassValue) + ClassHash[[s::TypeValue, ClassValue]] = c + self.const_set(s.name.sub(/.*::/, ''), c) + } + + # RFC 1035, Section 3.4.2 (deprecated) + class WKS < RR + ClassHash[[TypeValue = Types::WKS, ClassValue = ClassValue]] = self #:nodoc: all + + def initialize(address, protocol, bitmap) + @address = IPv4.create(address) + @protocol = protocol + @bitmap = bitmap + end + attr_reader :address, :protocol, :bitmap + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_bytes(@address.address) + msg.put_pack("n", @protocol) + msg.put_bytes(@bitmap) + end + + def self.decode_rdata(msg) #:nodoc: all + address = IPv4.new(msg.get_bytes(4)) + protocol, = msg.get_unpack("n") + bitmap = msg.get_bytes + return self.new(address, protocol, bitmap) + end + end + + end + end +end +require 'dnsruby/resource/A' +require 'dnsruby/resource/AAAA' +require 'dnsruby/resource/AFSDB' +require 'dnsruby/resource/PX' +require 'dnsruby/resource/SRV' +require 'dnsruby/resource/APL' +require 'dnsruby/resource/TLSA' diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/IPSECKEY.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/IPSECKEY.rb new file mode 100644 index 000000000000..3d5381b1ea7e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/IPSECKEY.rb @@ -0,0 +1,143 @@ +# -- +# Copyright 2009 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + class IPSECKEY < RR + + ClassValue = nil #:nodoc: all + TypeValue = Types::IPSECKEY #:nodoc: all + + # An 8-bit precedence for this field. Lower values are preferred. + attr_accessor :precedence + # Specifies the type of gateway : + # 0 - no gateway present + # 1 - 4 byte IPv4 address present + # 2 - 16 byte IPv6 address present + # 3 - wire-encoded domain name present + attr_accessor :gateway_type + # The algorithm used by this key : + # 0 - no key present + # 1 - DSA key present + # 2 - RSA key present + attr_accessor :algorithm + # The gateway. May either be a 32-bit network order IPv4 address, or a + # 128-bit IPv6 address, or a domain name, or may not be present. + attr_accessor :gateway + + def from_data(data) #:nodoc: all + @precedence = data[0] + @gateway_type = data[1] + @algorithm = data[2] + @public_key = nil + @gateway = load_gateway_from_string(@gateway_type, data[3]) + if (@gateway) + @public_key = data[4] + else + @public_key = data[3] + end + end + + def from_hash(hash) + @precedence = hash[:precedence] + @gateway_type = hash[:gateway_type] + @algorithm = hash[:algorithm] + @gateway = load_gateway_from_string(@gateway_type, hash[:gateway]) + @public_key = hash[:public_key] + end + + def load_gateway_from_string(gateway_type, s) + gateway = nil + if (gateway_type == 0) + gateway = nil + elsif (gateway_type == 1) + # Load IPv4 gateway + gateway = IPv4.create(s) + elsif (gateway_type == 2) + # Load IPv6 gateway + gateway = IPv6.create(s) + else + # Load gateway domain name + gateway = Name.create(s) + end + return gateway + end + + def public_key_string + [@public_key.to_s].pack("m*").gsub("\n", "") + end + + def public_key_from_string(key_text) + key_text.gsub!(/\n/, "") + key_text.gsub!(/ /, "") + return key_text.unpack("m*")[0] + end + + def from_string(input) + if (input.length > 0) + split = input.split(" ") + + @precedence = split[0].to_i + @gateway_type = split[1].to_i + @algorithm = split[2].to_i + + @gateway = load_gateway_from_string(@gateway_type, split[3]) + + @public_key = public_key_from_string(split[4]) + end + end + + def rdata_to_string #:nodoc: all + ret = "#{@precedence} #{@gateway_type} #{@algorithm} " + if (@gateway_type > 0) + ret += "#{@gateway} " + end + ret += "#{public_key_string()}" + return ret + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack('ccc', @precedence, @gateway_type, @algorithm) + if ([1,2].include?@gateway_type) + msg.put_bytes(@gateway.address) + end + if (@gateway_type == 3) + msg.put_name(@gateway, true) # gateway MUST NOT be compressed + end + msg.put_bytes(@public_key) + end + + def self.decode_rdata(msg) #:nodoc: all + precedence, gateway_type, algorithm = msg.get_unpack('ccc') + gateway = nil + if (gateway_type == 1) + gateway = IPv4.new(msg.get_bytes(4)) + elsif (gateway_type == 2) + gateway = IPv6.new(msg.get_bytes(16)) + elsif (gateway_type == 3) + gateway = msg.get_name + end + public_key = msg.get_bytes + if (gateway_type == 0) + return self.new( + [precedence, gateway_type, algorithm, public_key]) + else + return self.new( + [precedence, gateway_type, algorithm, gateway, public_key]) + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/ISDN.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/ISDN.rb new file mode 100644 index 000000000000..f019c5a324e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/ISDN.rb @@ -0,0 +1,62 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Net::DNS::RR::ISDN - DNS ISDN resource record + # RFC 1183 Section 3.2 + class ISDN < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::ISDN #:nodoc: all + + # The RR's address field. + attr_accessor :address + + # The RR's sub-address field. + attr_accessor :subaddress + + def from_data(data) #:nodoc: all + @address, @subaddress= data + end + + def from_string(input) #:nodoc: all + address, subaddress = input.split(" ") + address.sub!(/^\"/, "") + @address = address.sub(/\"$/, "") + if (subaddress) + subaddress.sub!(/^\"/, "") + @subaddress = subaddress.sub(/\"$/, "") + else + @subaddress = nil + end + end + + def rdata_to_string #:nodoc: all + return "#{@address} #{@subaddress}" + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_string(@address) + msg.put_string(@subaddress) + end + + def self.decode_rdata(msg) #:nodoc: all + address = msg.get_string + subaddress = msg.get_string + return self.new([address, subaddress]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/KX.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/KX.rb new file mode 100644 index 000000000000..ba70248d93c5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/KX.rb @@ -0,0 +1,66 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Key Exchange (KX) resource records. + # RFC 2230 + class KX < RR + ClassValue = nil #:nodoc: all + TypeValue= Types::KX #:nodoc: all + + # The preference for this mail exchange. + attr_accessor :preference + # The name of this mail exchange. + attr_accessor :exchange + + def from_hash(hash) #:nodoc: all + @preference = hash[:preference] + @exchange = Name.create(hash[:exchange]) + end + + def from_data(data) #:nodoc: all + @preference, @exchange = data + end + + def from_string(input) #:nodoc: all + if (input.length > 0) + names = input.split(" ") + @preference = names[0].to_i + @exchange = Name.create(names[1]) + end + end + + def rdata_to_string #:nodoc: all + if (@preference!=nil) + return "#{@preference} #{@exchange.to_s(true)}" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack('n', @preference) + msg.put_name(@exchange, true) + end + + def self.decode_rdata(msg) #:nodoc: all + preference, = msg.get_unpack('n') + exchange = msg.get_name + return self.new([preference, exchange]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/LOC.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/LOC.rb new file mode 100644 index 000000000000..58dab598e5bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/LOC.rb @@ -0,0 +1,264 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Location (LOC) resource records. See RFC 1876 for + # details. + class LOC < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::LOC #:nodoc: all + + # The version number of the representation; programs should + # always check this. Dnsruby currently supports only version 0. + attr_accessor :version + @version = 0 + + # The diameter of a sphere enclosing the described entity, + # in centimeters. + attr_accessor :size + # The horizontal precision of the data, in centimeters. + attr_accessor :horiz_pre + # The vertical precision of the data, in centimeters. + attr_accessor :vert_pre + # The latitude of the center of the sphere described by + # the size method, in thousandths of a second of arc. 2**31 + # represents the equator; numbers above that are north latitude. + attr_accessor :latitude + # The longitude of the center of the sphere described by + # the size method, in thousandths of a second of arc. 2**31 + # represents the prime meridian; numbers above that are east + # longitude. + attr_accessor :longitude + # The altitude of the center of the sphere described by + # the size method, in centimeters, from a base of 100,000m + # below the WGS 84 reference spheroid used by GPS. + attr_accessor :altitude + # Powers of 10 from 0 to 9 (used to speed up calculations). + POWEROFTEN = [1, 10, 100, 1_000, 10_000, 100_000, 1_000_000, 10_000_000, 100_000_000, 1_000_000_000] + + # Reference altitude in centimeters (see RFC 1876). + REFERENCE_ALT = 100_000 * 100; + + # Reference lat/lon (see RFC 1876). + REFERENCE_LATLON = 2**31; + + # Conversions to/from thousandths of a degree. + CONV_SEC = 1000; + CONV_MIN = 60 * CONV_SEC; + CONV_DEG = 60 * CONV_MIN; + + # Defaults (from RFC 1876, Section 3). + DEFAULT_MIN = 0; + DEFAULT_SEC = 0; + DEFAULT_SIZE = 1; + DEFAULT_HORIZ_PRE = 10_000; + DEFAULT_VERT_PRE = 10; + + + def latlon2dms(rawmsec, hems) + # Tried to use modulus here, but Perl dumped core if + # the value was >= 2**31. + + abs = (rawmsec - REFERENCE_LATLON).abs; + deg = (abs / CONV_DEG).round; + abs -= deg * CONV_DEG; + min = (abs / CONV_MIN).round; + abs -= min * CONV_MIN; + sec = (abs / CONV_SEC).round; # $conv_sec + abs -= sec * CONV_SEC; + msec = abs; + + hem = hems[(rawmsec >= REFERENCE_LATLON ? 0 : 1), 1] + + return sprintf("%d %02d %02d.%03d %s", deg, min, sec, msec, hem); + end + + def dms2latlon(deg, min, sec, hem) + retval=0 + + retval = (deg * CONV_DEG) + (min * CONV_MIN) + (sec * CONV_SEC).round; + retval = -retval if ((hem != nil) && ((hem == "S") || (hem == "W"))); + retval += REFERENCE_LATLON; + return retval; + end + + # Returns the latitude and longitude as floating-point degrees. + # Positive numbers represent north latitude or east longitude; + # negative numbers represent south latitude or west longitude. + # + # lat, lon = rr.latlon + # system("xearth", "-pos", "fixed #{lat} #{lon}") + # + def latlon + retlat, retlon = nil + + if (@version == 0) + retlat = latlon2deg(@latitude); + retlon = latlon2deg(@longitude); + end + + return retlat, retlon + end + + def latlon2deg(rawmsec) + deg=0; + + deg = (rawmsec - reference_latlon) / CONV_DEG; + return deg; + end + + def from_data(data) #:nodoc: all + @version, @size, @horiz_pre, @vert_pre, @latitude, @longitude, @altitude = data + end + + def from_string(string) #:nodoc: all + if (string && + string =~ /^ (\d+) \s+ # deg lat + ((\d+) \s+)? # min lat + (([\d.]+) \s+)? # sec lat + (N|S) \s+ # hem lat + (\d+) \s+ # deg lon + ((\d+) \s+)? # min lon + (([\d.]+) \s+)? # sec lon + (E|W) \s+ # hem lon + (-?[\d.]+) m? # altitude + (\s+ ([\d.]+) m?)? # size + (\s+ ([\d.]+) m?)? # horiz precision + (\s+ ([\d.]+) m?)? # vert precision + /ix) # + + size = DEFAULT_SIZE + + # What to do for other versions? + version = 0; + + horiz_pre = DEFAULT_HORIZ_PRE + vert_pre = DEFAULT_VERT_PRE + latdeg, latmin, latsec, lathem = $1.to_i, $3.to_i, $5.to_f, $6; + londeg, lonmin, lonsec, lonhem = $7.to_i, $9.to_i, $11.to_f, $12 + alt = $13.to_i + if ($15) + size = $15.to_f + end + if ($17) + horiz_pre = $17.to_f + end + if ($19) + vert_pre = $19.to_f + end + + latmin = DEFAULT_MIN unless latmin; + latsec = DEFAULT_SEC unless latsec; + lathem = lathem.upcase; + + lonmin = DEFAULT_MIN unless lonmin; + lonsec = DEFAULT_SEC unless lonsec; + lonhem = lonhem.upcase + + @version = version; + @size = size * 100; + @horiz_pre = horiz_pre * 100; + @vert_pre = vert_pre * 100; + @latitude = dms2latlon(latdeg, latmin, latsec, lathem); + @longitude = dms2latlon(londeg, lonmin, lonsec, lonhem); + @altitude = alt * 100 + REFERENCE_ALT; + end + end + + def from_hash(hash) #:nodoc: all + super(hash) + if (@size == nil) + @size = DEFAULT_SIZE * 100 + end + if @horiz_pre == nil + @horiz_pre = DEFAULT_HORIZ_PRE * 100 + end + if @vert_pre == nil + @vert_pre = DEFAULT_VERT_PRE * 100 + end + end + + def rdata_to_string #:nodoc: all + rdatastr="" + + if (defined?@version) + if (@version == 0) + lat = @latitude; + lon = @longitude; + altitude = @altitude; + size = @size; + horiz_pre = @horiz_pre; + vert_pre = @vert_pre; + + altitude = (altitude - REFERENCE_ALT) / 100; + size /= 100; + horiz_pre /= 100; + vert_pre /= 100; + + rdatastr = latlon2dms(lat, "NS") + " " + + latlon2dms(lon, "EW") + " " + + sprintf("%.2fm", altitude) + " " + + sprintf("%.2fm", size) + " " + + sprintf("%.2fm", horiz_pre) + " " + + sprintf("%.2fm", vert_pre); + else + rdatastr = "; version " + @version + " not supported"; + end + else + rdatastr = ''; + end + + return rdatastr; + end + + def self.decode_rdata(msg) #:nodoc: all + version, = msg.get_unpack("C") + if (version == 0) + size, horiz_pre, vert_pre, latitude, longitude, altitude = msg.get_unpack('CCCNNN') + size = precsize_ntoval(size) + horiz_pre = precsize_ntoval(horiz_pre) + vert_pre = precsize_ntoval(vert_pre) + return self.new([version, size, horiz_pre, vert_pre, latitude, longitude, altitude]) + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack('C', @version) + if (@version == 0) + msg.put_pack('CCCNNN', precsize_valton(@size), + precsize_valton(@horiz_pre), precsize_valton(@vert_pre), + @latitude, @longitude, @altitude) + end + end + + def self.precsize_ntoval(prec) + mantissa = ((prec >> 4) & 0x0f) % 10; + exponent = (prec & 0x0f) % 10; + return mantissa * POWEROFTEN[exponent]; + end + + def precsize_valton(val) + exponent = 0; + while (val >= 10) + val /= 10; + exponent+=1 + end + return (val.round << 4) | (exponent & 0x0f); + end + + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/MINFO.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/MINFO.rb new file mode 100644 index 000000000000..c5d6f96d7c51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/MINFO.rb @@ -0,0 +1,70 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Mailbox Information (MINFO) resource records. + # RFC 1035 Section 3.3.7 + class MINFO < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::MINFO #:nodoc: all + + # The RR's responsible mailbox field. See RFC 1035. + attr_accessor :rmailbx + # The RR's error mailbox field. + attr_accessor :emailbx + + def from_hash(hash) #:nodoc: all + if (hash[:rmailbx]) + @rmailbx = Name.create(hash[:rmailbx]) + end + if (hash[:emailbx]) + @emailbx = Name.create(hash[:emailbx]) + end + end + + def from_data(data) #:nodoc: all + @rmailbx, @emailbx = data + end + + def from_string(input) #:nodoc: all + if (input.length > 0) + names = input.split(" ") + @rmailbx = Name.create(names[0]) + @emailbx = Name.create(names[1]) + end + end + + def rdata_to_string #:nodoc: all + if (@rmailbx!=nil) + return "#{@rmailbx.to_s(true)} #{@emailbx.to_s(true)}" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_name(@rmailbx, canonical) + msg.put_name(@emailbx, canonical) + end + + def self.decode_rdata(msg) #:nodoc: all + rmailbx = msg.get_name + emailbx = msg.get_name + return self.new([rmailbx, emailbx]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/MX.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/MX.rb new file mode 100644 index 000000000000..581882cba66c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/MX.rb @@ -0,0 +1,69 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Mail Exchanger (MX) resource records. + # RFC 1035 Section 3.3.9 + class MX < RR + ClassValue = nil #:nodoc: all + TypeValue= Types::MX #:nodoc: all + + # The preference for this mail exchange. + attr_accessor :preference + # The name of this mail exchange. + attr_accessor :exchange + + def from_hash(hash) #:nodoc: all + @preference = hash[:preference] + @exchange = Name.create(hash[:exchange]) + end + + def from_data(data) #:nodoc: all + @preference, @exchange = data + end + + def from_string(input) #:nodoc: all + if (input.length > 0) + names = input.split(" ") + if(names.size != 2) + raise DecodeError.new("MX record expects preference and domain") + end + @preference = names[0].to_i + @exchange = Name.create(names[1]) + end + end + + def rdata_to_string #:nodoc: all + if (@preference!=nil) + return "#{@preference} #{@exchange.to_s(true)}" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack('n', @preference, canonical) + msg.put_name(@exchange, canonical) + end + + def self.decode_rdata(msg) #:nodoc: all + preference, = msg.get_unpack('n') + exchange = msg.get_name + return self.new([preference, exchange]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NAPTR.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NAPTR.rb new file mode 100644 index 000000000000..48cd4768db5e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NAPTR.rb @@ -0,0 +1,100 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Naming Authority Pointer (NAPTR) resource records. + # RFC 2168 + class NAPTR < RR + ClassValue = nil #:nodoc: all + TypeValue= Types::NAPTR #:nodoc: all + + # The NAPTR RR order field + attr_accessor :order + # The NAPTR RR preference field + attr_accessor :preference + # The NAPTR RR flags field + attr_accessor :flags + # The NAPTR RR service field + attr_accessor :service + # The NAPTR RR regexp field + attr_reader :regexp + # The NAPTR RR replacement field + attr_accessor :replacement + + def from_hash(hash) #:nodoc: all + @order = hash[:order] + @preference = hash[:preference] + @flags = hash[:flags] + @service = hash[:service] + @regexp = hash[:regexp] + @replacement = Name.create(hash[:replacement]) + end + + def from_data(data) #:nodoc: all + @order, @preference, @flags, @service, @regexp, @replacement = data + end + + def regexp=(s) + @regexp = TXT.parse(s)[0] + end + + def from_string(input) #:nodoc: all + if (input.strip.length > 0) + values = input.split(" ") + @order = values [0].to_i + @preference = values [1].to_i + @flags = values [2].gsub!("\"", "") + @service = values [3].gsub!("\"", "") + @regexp = TXT.parse(values[4])[0] + @replacement = Name.create(values[5]) + end + end + + def rdata_to_string #:nodoc: all + if (@order!=nil) + ret = "#{@order} #{@preference} \"#{@flags}\" \"#{@service}\" \"" + ret += TXT.display(@regexp) + ret += "\" #{@replacement.to_s(true)}" + + return ret + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + if (@order != nil) + msg.put_pack('n', @order) + msg.put_pack('n', @preference) + msg.put_string(@flags) + msg.put_string(@service) + msg.put_string(@regexp) + msg.put_name(@replacement, true) + end + end + + def self.decode_rdata(msg) #:nodoc: all + order, = msg.get_unpack('n') + preference, = msg.get_unpack('n') + flags = msg.get_string + service = msg.get_string + regexp = msg.get_string + replacement = msg.get_name + return self.new([order, preference, flags, service, regexp, replacement]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSAP.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSAP.rb new file mode 100644 index 000000000000..c6f01f8e4e55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSAP.rb @@ -0,0 +1,172 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Network Service Access Point (NSAP) resource records. + # RFC 1706. + class NSAP < RR + ClassValue = nil #:nodoc: all + TypeValue= Types::NSAP #:nodoc: all + # The RR's authority and format identifier. Dnsruby + # currently supports only AFI 47 (GOSIP Version 2). + attr_accessor :afi + # The RR's initial domain identifier. + attr_accessor :idi + # The RR's DSP format identifier. + attr_accessor :dfi + # The RR's administrative authority. + attr_accessor :aa + # The RR's routing domain identifier. + attr_accessor :rd + # The RR's area identifier. + attr_accessor :area + # The RR's system identifier. + attr_accessor :id + # The RR's NSAP selector. + attr_accessor :sel + + # The RR's reserved field. + attr_writer :rsvd + + # The RR's initial domain part (the AFI and IDI fields). + def idp + ret = [@afi, @idi].join('') + return ret + end + + # The RR's domain specific part (the DFI, AA, Rsvd, RD, Area, + # ID, and SEL fields). + def dsp + ret = [@dfi,@aa,rsvd,@rd,@area,@id,@sel].join('') + return ret + end + + def rsvd + if (@rsvd==nil) + return "0000" + else + return @rsvd + end + end + + # ------------------------------------------------------------------------------ + # Usage: str2bcd(STRING, NUM_BYTES) + # + # Takes a string representing a hex number of arbitrary length and + # returns an equivalent BCD string of NUM_BYTES length (with + # NUM_BYTES * 2 digits), adding leading zeros if necessary. + # ------------------------------------------------------------------------------ + def str2bcd(s, bytes) + retval = ""; + + digits = bytes * 2; + string = sprintf("%#{digits}s", s); + string.tr!(" ","0"); + + i=0; + bytes.times do + bcd = string[i*2, 2]; + retval += [bcd.to_i(16)].pack("C"); + i+=1 + end + + return retval; + end + + + def from_data(data) #:nodoc: all + @afi, @idi, @dfi, @aa, @rsvd, @rd, @area, @id, @sel = data + end + + def from_string(s) #:nodoc: all + if (s) + string = s.gsub(/\./, ""); # remove all dots. + string.gsub!(/^0x/,""); # remove leading 0x + + if (string =~ /^[a-zA-Z0-9]{40}$/) + (@afi, @idi, @dfi, @aa, @rsvd, @rd, @area, @id, @sel) = string.unpack("A2A4A2A6A4A4A4A12A2") + end + end + + end + + def rdata_to_string #:nodoc: all + rdatastr="" + + if (defined?@afi) + if (@afi == "47") + rdatastr = [idp, dsp].join('') + else + rdatastr = "; AFI #{@afi} not supported" + end + else + rdatastr = '' + end + + return rdatastr + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + if (defined?@afi) + msg.put_pack("C", @afi.to_i(16)) + + if (@afi == "47") + msg.put_bytes(str2bcd(@idi, 2)) + msg.put_bytes(str2bcd(@dfi, 1)) + msg.put_bytes(str2bcd(@aa, 3)) + msg.put_bytes(str2bcd(0, 2)) # rsvd) + msg.put_bytes(str2bcd(@rd, 2)) + msg.put_bytes(str2bcd(@area, 2)) + msg.put_bytes(str2bcd(@id, 6)) + msg.put_bytes(str2bcd(@sel, 1)) + end + # Checks for other versions would go here. + end + + return rdata + end + + def self.decode_rdata(msg) #:nodoc: all + afi = msg.get_unpack("C")[0] + afi = sprintf("%02x", afi) + + if (afi == "47") + idi = msg.get_unpack("CC") + dfi = msg.get_unpack("C")[0] + aa = msg.get_unpack("CCC") + rsvd = msg.get_unpack("CC") + rd = msg.get_unpack("CC") + area = msg.get_unpack("CC") + id = msg.get_unpack("CCCCCC") + sel = msg.get_unpack("C")[0] + + idi = sprintf("%02x%02x", idi[0], idi[1]) + dfi = sprintf("%02x", dfi) + aa = sprintf("%02x%02x%02x", aa[0], aa[1], aa[2]) + rsvd = sprintf("%02x%02x", rsvd[0],rsvd[1]) + rd = sprintf("%02x%02x", rd[0],rd[1]) + area = sprintf("%02x%02x", area[0],area[1]) + id = sprintf("%02x%02x%02x%02x%02x%02x", id[0],id[1],id[2],id[3],id[4],id[5]) + sel = sprintf("%02x", sel) + + else + # What to do for unsupported versions? + end + return self.new([afi, idi, dfi, aa, rsvd, rd, area, id, sel]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSEC.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSEC.rb new file mode 100644 index 000000000000..c7a1a6c98619 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSEC.rb @@ -0,0 +1,275 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # RFC4034, section 4 + # The NSEC resource record lists two separate things: the next owner + # name (in the canonical ordering of the zone) that contains + # authoritative data or a delegation point NS RRset, and the set of RR + # types present at the NSEC RR's owner name [RFC3845]. The complete + # set of NSEC RRs in a zone indicates which authoritative RRsets exist + # in a zone and also form a chain of authoritative owner names in the + # zone. This information is used to provide authenticated denial of + # existence for DNS data, as described in [RFC4035]. + class NSEC < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::NSEC #:nodoc: all + + # The next name which exists after this NSEC + # The Next Domain field contains the next owner name (in the canonical + # ordering of the zone) that has authoritative data or contains a + # delegation point NS RRset + attr_reader :next_domain + # The Type Bit Maps field identifies the RRset types that exist at the + # NSEC RR's owner name + attr_reader :types + + def next_domain=(n) + nxt = Name.create(n) + @next_domain = nxt + end + + def check_name_in_range(n) + # Check if the name is covered by this record + @name.wild? \ + ? check_name_in_wildcard_range(n) \ + : name.canonically_before(n) && n.canonically_before(next_domain) + end + + def check_name_in_wildcard_range(n) + # Check if the name is covered by this record + return false unless @name.wild? + return false if @next_domain.canonically_before(n) + # Now just check that the wildcard is *before* the name + # Strip the first label ("*") and then compare + n2 = Name.create(@name) + n2.labels.delete_at(0) + ! n.canonically_before(n2) + end + + def types=(t) + @types = (t && t.length > 0) ? NSEC.get_types(t) : [] + end + + def self.get_types(t) + if t.instance_of?(Array) + # from the wire, already decoded + types = t + elsif t.instance_of?(String) + if (index = t.index(/[;)]/)) # check for ; or ) + t = t[0, index] + end + # List of mnemonics + types = [] + mnemonics = t.split(' ') + mnemonics.each { |m| types << Types.new(m) } + else + raise DecodeError.new('Unknown format of types for Dnsruby::RR::NSEC') + end + types + end + + def add_type(t) + self.types = (@types + [t]) + end + + def self.decode_types(bytes) + types = [] + # RFC4034 section 4.1.2 + # The RR type space is split into 256 window blocks, each representing + # the low-order 8 bits of the 16-bit RR type space. Each block that + # has at least one active RR type is encoded using a single octet + # window number (from 0 to 255), a single octet bitmap length (from 1 + # to 32) indicating the number of octets used for the window block's + # bitmap, and up to 32 octets (256 bits) of bitmap. + + # Blocks are present in the NSEC RR RDATA in increasing numerical + # order. + + # Type Bit Maps Field = ( Window Block # | Bitmap Length | Bitmap )+ + + # where "|" denotes concatenation. + + pos = 0 + while pos < bytes.length + # So, read the first two octets + if bytes.length - pos < 2 + raise DecodeError.new("NSEC : Expected window number and bitmap length octets") + end + window_number = bytes[pos] + bitmap_length = bytes[pos+1] + if window_number.class == String # Ruby 1.9 + window_number = window_number.getbyte(0) + bitmap_length = bitmap_length.getbyte(0) + end + pos += 2 + bitmap = bytes[pos,bitmap_length] + pos += bitmap_length + # Each bitmap encodes the low-order 8 bits of RR types within the + # window block, in network bit order. The first bit is bit 0. For + # window block 0, bit 1 corresponds to RR type 1 (A), bit 2 corresponds + # to RR type 2 (NS), and so forth. For window block 1, bit 1 + # corresponds to RR type 257, and bit 2 to RR type 258. If a bit is + # set, it indicates that an RRset of that type is present for the NSEC + # RR's owner name. If a bit is clear, it indicates that no RRset of + # that type is present for the NSEC RR's owner name. + index = 0 + bitmap.each_byte do |char| + if char.to_i != 0 + # decode these RR types + 8.times do |i| + if ((1 << (7-i)) & char) == (1 << (7-i)) + type = Types.new((256 * window_number) + (8 * index) + i) + # Bits representing pseudo-types MUST be clear, as they do not appear + # in zone data. If encountered, they MUST be ignored upon being read. + unless [Types::OPT, Types::TSIG].include?(type) + types << type + end + end + end + end + index += 1 + end + end + return types + end + + def encode_types + NSEC.encode_types(self) + end + + def self.encode_types(nsec) + output = '' + # types represents all 65536 possible RR types. + # Split up types into sets of 256 different types. + type_codes = [] + nsec.types.each { |type| type_codes << type.code } + type_codes.sort! + window = -1 + 0.step(65536,256) { |step| + # Gather up the RR types for this set of 256 + types_to_go = [] + while (!type_codes.empty? && type_codes[0] < step) + types_to_go << type_codes[0] + # And delete them from type_codes + type_codes = type_codes.last(type_codes.length - 1) + break if type_codes.empty? + end + + unless types_to_go.empty? + # Then create the bitmap for them + bitmap = '' + # keep on adding them until there's none left + pos = 0 + bitmap_pos = 0 + while (!types_to_go.empty?) + + # Check the next eight + byte = 0 + pos += 8 + while types_to_go[0] < (pos + step - 256) + byte = byte | (1 << (pos - 1 - (types_to_go[0] - (step - 256)))) + # Add it to the list + # And remove it from the to_go queue + types_to_go = types_to_go.last(types_to_go.length - 1) + break if types_to_go.empty? + end + bitmap << ' ' + if bitmap[bitmap_pos].class == String + bitmap.setbyte(bitmap_pos, byte) # Ruby 1.9 + else + bitmap[bitmap_pos] = byte + end + bitmap_pos += 1 + end + + # Now add data to output bytes + start = output.length + output << (' ' * (2 + bitmap.length)) + + if output[start].class == String + output.setbyte(start, window) + output.setbyte(start + 1, bitmap.length) + bitmap.length.times do |i| + output.setbyte(start + 2 + i, bitmap[i].getbyte(0)) + end + else + output[start] = window + output[start + 1] = bitmap.length + bitmap.length.times do |i| + output[start + 2 + i] = bitmap[i] + end + end + end + window += 1 + + # Are there any more types after this? + if type_codes.empty? + # If not, then break (so we don't add more zeros) + break + end + } + if output[0].class == String + output = output.force_encoding("ascii-8bit") + end + output + end + + def from_data(data) #:nodoc: all + next_domain, types = data + self.next_domain = next_domain + self.types = types + end + + def from_string(input) + if input.length > 0 + data = input.split(' ') + self.next_domain = data[0] + len = data[0].length+ 1 + if data[1] == '(' + len += data[1].length + end + self.types = input[len, input.length-len] + @types = NSEC.get_types(input[len, input.length-len]) + end + end + + def rdata_to_string #:nodoc: all + if @next_domain + type_strings = [] + @types.each { |t| type_strings << t.string } + types = type_strings.join(' ') + "#{@next_domain.to_s(true)} ( #{types} )" + else + '' + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + # Canonical + msg.put_name(@next_domain, canonical, false) # dnssec-bis-updates says NSEC should not be downcased + types = encode_types + msg.put_bytes(types) + end + + def self.decode_rdata(msg) #:nodoc: all + next_domain = msg.get_name + types = decode_types(msg.get_bytes) + return self.new([next_domain, types]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSEC3.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSEC3.rb new file mode 100644 index 000000000000..9dd1bc4148c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSEC3.rb @@ -0,0 +1,332 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +require 'digest/sha1' +module Base32 + module_function + def encode32hex(str) + str.gsub(/\G(.{5})|(.{1,4}\z)/mn) do + full = $1; frag = $2 + n, c = (full || frag.ljust(5, "\0")).unpack('NC') + full = ((n << 8) | c).to_s(32).rjust(8, '0') + if frag + full[0, (frag.length * 8 + 4).div(5)].ljust(8, '=').upcase + else + full.upcase + end + end + end + + HEX = '[0-9a-v]' + def decode32hex(str) + str.gsub(/\G\s*(#{HEX}{8}|#{HEX}{7}=|#{HEX}{5}={3}|#{HEX}{4}={4}|#{HEX}{2}={6}|(\S))/imno) do + raise 'invalid base32' if $2 + s = $1 + s.tr('=', '0').to_i(32).divmod(256).pack('NC')[0, + (s.count('^=') * 5).div(8)] + end + end +end + +module Dnsruby + class RR + # The NSEC3 Resource Record (RR) provides authenticated denial of + # existence for DNS Resource Record Sets. + # + # The NSEC3 RR lists RR types present at the original owner name of the + # NSEC3 RR. It includes the next hashed owner name in the hash order + # of the zone. The complete set of NSEC3 RRs in a zone indicates which + # RRSets exist for the original owner name of the RR and form a chain + # of hashed owner names in the zone. This information is used to + # provide authenticated denial of existence for DNS data. To provide + # protection against zone enumeration, the owner names used in the + # NSEC3 RR are cryptographic hashes of the original owner name + # prepended as a single label to the name of the zone. The NSEC3 RR + # indicates which hash function is used to construct the hash, which + # salt is used, and how many iterations of the hash function are + # performed over the original owner name. + class NSEC3 < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::NSEC3 #:nodoc: all + + # The Hash Algorithm field identifies the cryptographic hash algorithm + # used to construct the hash-value. + attr_reader :hash_alg + + # The Flags field contains 8 one-bit flags that can be used to indicate + # different processing. All undefined flags must be zero. The only + # flag defined by the NSEC3 specification is the Opt-Out flag. + attr_reader :flags + + # The Iterations field defines the number of additional times the hash + # function has been performed. + attr_accessor :iterations + + # The Salt Length field defines the length of the Salt field in octets, + # ranging in value from 0 to 255. + attr_reader :salt_length + + # The Hash Length field defines the length of the Next Hashed Owner + # Name field, ranging in value from 1 to 255 octets. + attr_reader :hash_length + + # The Next Hashed Owner Name field contains the next hashed owner name + # in hash order. + attr_accessor :next_hashed + + # The Type Bit Maps field identifies the RRset types that exist at the + # NSEC RR's owner name + attr_reader :types + + def check_name_in_range(_name) + # @TODO@ Check if the name is covered by this record + false + end + + def check_name_in_wildcard_range(_name) + # @TODO@ Check if the name is covered by this record + false + end + + def calculate_hash + NSEC3.calculate_hash(@name, @iterations, @salt, @hash_alg) + end + + def NSEC3.calculate_hash(name, iterations, salt, hash_alg) + # RFC5155 + # 5. Calculation of the Hash + + # Define H(x) to be the hash of x using the Hash Algorithm selected by + # the NSEC3 RR, k to be the number of Iterations, and || to indicate + # concatenation. Then define: + # + # IH(salt, x, 0) = H(x || salt), and + # + # IH(salt, x, k) = H(IH(salt, x, k-1) || salt), if k > 0 + # + # Then the calculated hash of an owner name is + # + # IH(salt, owner name, iterations), + # + # where the owner name is in the canonical form, defined as: + # + # The wire format of the owner name where: + # + # 1. The owner name is fully expanded (no DNS name compression) and + # fully qualified; + # 2. All uppercase US-ASCII letters are replaced by the corresponding + # lowercase US-ASCII letters; + # 3. If the owner name is a wildcard name, the owner name is in its + # original unexpanded form, including the '*' label (no wildcard + # substitution); + # + # This form is as defined in Section 6.2 of [RFC 4034]. + # + + n = Name.create(name) + out = n.canonical + begin + (iterations + 1).times { out = NSEC3.h(out + salt, hash_alg) } + return Base32.encode32hex(out).downcase + rescue ArgumentError + TheLog.error("Unknown hash algorithm #{hash_alg} used for NSEC3 hash") + return 'Unknown NSEC3 hash algorithm' + end + end + + def h(x) # :nodoc: all + NSEC3.h(x, @hash_alg) + end + + def NSEC3.h(x, hash_alg) # :nodoc: all + if Nsec3HashAlgorithms.SHA_1 == hash_alg + return Digest::SHA1.digest(x) + end + raise ArgumentError.new('Unknown hash algorithm') + end + + def hash_alg=(a) + if a.instance_of?(String) + if a.length == 1 + a = a.to_i + end + end + begin + alg = Nsec3HashAlgorithms.new(a) + @hash_alg = alg + rescue ArgumentError => e + raise DecodeError.new(e) + end + end + + def types=(t) + @types = (t && t.length > 0) ? NSEC.get_types(t) : [] + end + + def add_type(t) + self.types = (@types + [t]) + end + + OPT_OUT = 1 + def flags=(f) + if f == 0 || f == OPT_OUT + @flags = f + else + raise DecodeError.new("Unknown NSEC3 flags field - #{f}") + end + end + + # If the Opt-Out flag is set, the NSEC3 record covers zero or more + # unsigned delegations. + def opt_out? + @flags == OPT_OUT + end + + # def salt_length=(l) + # if ((l < 0) || (l > 255)) + # raise DecodeError.new('NSEC3 salt length must be between 0 and 255') + # end + # @salt_length = l + # end + # + def hash_length=(l) + if (l < 0) || (l > 255) + raise DecodeError.new("NSEC3 hash length must be between 0 and 255 but was #{l}") + end + @hash_length = l + end + + def from_data(data) #:nodoc: all + hash_alg, flags, iterations, _salt_length, salt, hash_length, next_hashed, types = data + self.hash_alg = hash_alg + self.flags = flags + self.iterations = iterations +# self.salt_length=(salt_length) +# self.salt=(salt) + @salt = salt + self.hash_length = hash_length + self.next_hashed = next_hashed + self.types = types + end + + # The Salt field is appended to the original owner name before hashing + # in order to defend against pre-calculated dictionary attacks. + def salt + return NSEC3.encode_salt(@salt) + end + + def salt=(s) + @salt = NSEC3.decode_salt(s) + @salt_length = @salt.length + end + + def NSEC3.decode_salt(input) + input == '-' ? '' : [input].pack('H*') + end + + def NSEC3.encode_salt(s) + (!s || s.length == 0) ? '-' : s.unpack('H*')[0] + end + + def decode_next_hashed(input) + @next_hashed = NSEC3.decode_next_hashed(input) + end + + def NSEC3.decode_next_hashed(input) + return Base32.decode32hex(input) + end + + def encode_next_hashed(n) + return NSEC3.encode_next_hashed(n) + end + + def NSEC3.encode_next_hashed(n) + return Base32.encode32hex(n).downcase + end + + def from_string(input) + if input.length > 0 + data = input.split + self.hash_alg = (data[0]).to_i + self.flags = (data[1]).to_i + self.iterations = (data[2]).to_i + self.salt = (data[3]) + + len = data[0].length + data[1].length + data[2].length + data[3].length + 4 + # There may or may not be brackets around next_hashed + if data[4] == '(' + len += data[4].length + 1 + end + next_hashed_and_types = (input[len, input.length-len]) + data2 = next_hashed_and_types.split() + + + self.next_hashed = decode_next_hashed(data2[0]) + self.hash_length = @next_hashed.length + len2 = data2[0].length + 1 + self.types = next_hashed_and_types[len2, next_hashed_and_types.length - len2] + # self.types=data2[1] + # # len = data[0].length + data[1].length + data[2].length + data[3].length + data[5].length + 7 + # # self.types=(input[len, input.length-len]) + end + end + + def rdata_to_string #:nodoc: all + if @next_hashed + type_strings = [] + @types.each { |t| type_strings << t.string } + # salt = NSEC3.encode_salt(@salt) + salt = salt() # TODO: Remove this? + next_hashed = encode_next_hashed(@next_hashed) + types = type_strings.join(' ') + "#{@hash_alg.code} #{@flags} #{@iterations} #{salt} ( #{next_hashed} #{types} )" + else + '' + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all +# s = salt() + s = @salt + sl = s.length + if s == '-' + sl = 0 + end + msg.put_pack('ccnc', @hash_alg.code, @flags, @iterations, sl) + if sl > 0 + msg.put_bytes(s) + end + msg.put_pack('c', @hash_length) + msg.put_bytes(@next_hashed) + types = NSEC.encode_types(self) + msg.put_bytes(types) + end + + def self.decode_rdata(msg) #:nodoc: all + hash_alg, flags, iterations, salt_length = msg.get_unpack('ccnc') + # Salt may be omitted + salt = [] + if salt_length > 0 + salt = msg.get_bytes(salt_length) + end + hash_length, = msg.get_unpack('c') + next_hashed = msg.get_bytes(hash_length) + types = NSEC.decode_types(msg.get_bytes) + return self.new( + [hash_alg, flags, iterations, salt_length, salt, hash_length, next_hashed, types]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSEC3PARAM.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSEC3PARAM.rb new file mode 100644 index 000000000000..f6dc0ee8f3be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NSEC3PARAM.rb @@ -0,0 +1,135 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # The NSEC3PARAM RR contains the NSEC3 parameters (hash algorithm, + # flags, iterations and salt) needed by authoritative servers to + # calculate hashed owner names. The presence of an NSEC3PARAM RR at a + # zone apex indicates that the specified parameters may be used by + # authoritative servers to choose an appropriate set of NSEC3 RRs for + # negative responses. The NSEC3PARAM RR is not used by validators or + # resolvers. + class NSEC3PARAM < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::NSEC3PARAM #:nodoc: all + + # The Hash Algorithm field identifies the cryptographic hash algorithm + # used to construct the hash-value. + attr_reader :hash_alg + # The Flags field contains 8 one-bit flags that can be used to indicate + # different processing. All undefined flags must be zero. The only + # flag defined by the NSEC3 specification is the Opt-Out flag. + attr_reader :flags + # The Iterations field defines the number of additional times the hash + # function has been performed. + attr_accessor :iterations + # The Salt Length field defines the length of the Salt field in octets, + # ranging in value from 0 to 255. + attr_reader :salt_length + + # The Salt field is appended to the original owner name before hashing + # in order to defend against pre-calculated dictionary attacks. + def salt + return NSEC3.encode_salt(@salt) + end + + def salt=(s) + @salt = NSEC3.decode_salt(s) + @salt_length = @salt.length + end + + def hash_alg=(a) + if (a.instance_of?String) + if (a.length == 1) + a = a.to_i + end + end + begin + alg = Nsec3HashAlgorithms.new(a) + @hash_alg = alg + rescue ArgumentError => e + raise DecodeError.new(e) + end + end + + def types=(t) + @types = NSEC.get_types(t) + end + + def flags=(f) + if (f==0 || f==1) + @flags=f + else + raise DecodeError.new("Unknown NSEC3 flags field - #{f}") + end + end + + # def salt_length=(l) # :nodoc: all + # if ((l < 0) || (l > 255)) + # raise DecodeError.new("NSEC3 salt length must be between 0 and 255") + # end + # @salt_length = l + # end + # + def from_data(data) #:nodoc: all + hash_alg, flags, iterations, salt_length, salt = data + self.hash_alg=(hash_alg) + self.flags=(flags) + self.iterations=(iterations) + # self.salt_length=(salt_length) +# self.salt=(salt) + @salt=salt + end + + def from_string(input) + if (input.length > 0) + data = input.split(" ") + self.hash_alg=(data[0]).to_i + self.flags=(data[1]).to_i + self.iterations=(data[2]).to_i + self.salt=(data[3]) + # self.salt_length=(data[3].length) + end + end + + def rdata_to_string #:nodoc: all + s = salt() + return "#{@hash_alg.code} #{@flags} #{@iterations} #{s}" + end + + def encode_rdata(msg, canonical=false) #:nodoc: all +# s = salt() + s = @salt + sl = s.length() + if (s == "-") + sl == 0 + end + msg.put_pack("ccnc", @hash_alg.code, @flags, @iterations, sl) + + if (sl > 0) + msg.put_bytes(s) + end + end + + def self.decode_rdata(msg) #:nodoc: all + hash_alg, flags, iterations, salt_length = msg.get_unpack("ccnc") + salt = msg.get_bytes(salt_length) + return self.new( + [hash_alg, flags, iterations, salt_length, salt]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NXT.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NXT.rb new file mode 100644 index 000000000000..80c8e1e4822d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/NXT.rb @@ -0,0 +1,302 @@ +require_relative = ->(*args) do + this_file_dir = File.expand_path(File.dirname(__FILE__)) + args.each { |arg| require(File.join(this_file_dir, arg)) } +end + +require_relative.('../bitmap', '../bit_mapping', 'RR') + +module Dnsruby +class RR + +# Class for NXT resource records. +# +# NXT-specific data types, present in RDATA, are: +# next_domain: the next domain name, as a Name instance +# types: array of record types as numbers +# +# RFC 2535 (https://www.ietf.org/rfc/rfc2535.txt) +# +# The RFC mentions that a low bit of zero in the type RDATA +# indicates that the highest type code does not exceed 127, +# and that a low bit of 1 indicates that some mechanism +# other than a bitmap is being used. This class does not +# support such non-bitmap mechanisms, and assumes there +# will always be a bitmap. +class NXT < RR + + ClassHash[[TypeValue = Types::NXT, Classes::IN]] = self #:nodoc: all + + attr_accessor :next_domain, :types + + REQUIRED_KEYS = [:next_domain, :types] + + def from_hash(params_hash) + unless REQUIRED_KEYS.all? { |key| params_hash[key] } + raise ArgumentError.new("NXT hash must contain all of: #{REQUIRED_KEYS.join(', ')}.") + end + @next_domain = Name.create(params_hash[:next_domain]) unless @next_domain.is_a?(Name) + @types = params_hash[:types] + end + + def from_data(data) + next_domain, types = data + from_hash(next_domain: next_domain, types: types) + end + + def from_string(string) + next_domain, *type_names = string.split # type names are all but first + types = NxtTypes::names_to_codes(type_names) + from_hash(next_domain: next_domain, types: types) + end + + # As with all resource record subclasses of RR, this class cannot be + # directly instantiated, but instead must be instantiated via use of + # one of the RR class methods. These NXT class methods are wrappers + # around those RR methods, so that there is an interface on the NXT + # class for creating NXT instances. + + # Create an instance from a hash of parameters, e.g.: + # + # rr = RR::NXT.new_from_hash( + # name: 'b.dnsruby.com.', + # ttl: 10800, + # klass: Classes::IN, + # next_domain: 'a.dnsruby.com.', + # types: [Types::SOA, Types::NXT]) + # + # Since the type is assumed to be NXT, it will be assigned + # automatically, and any other value will be overwritten. + # Therefore, having it present in the hash is not necessary. + def self.new_from_hash(params_hash) + params_hash[:type] = Types::NXT + RR.new_from_hash(params_hash) + end + + # Create an instance from a string containing parameters, e.g.: + # b.dnsruby.com. 10800 IN NXT A.dnsruby.com. SOA NXT + def self.new_from_string(params_string) + RR.new_from_string(params_string) + end + + # Create an instance from an ordered parameter list, e.g.: + # rdata = RR::NXT.build_rdata('a.dnsruby.com.', [Types::SOA, Types::NXT]) + # + # rr = RR::NXT.new_from_data('b.dnsruby.com.', Types::NXT, + # Classes::IN, 10800, rdata.size, rdata, 0) + def self.new_from_data(*params_data) + RR.new_from_data(*params_data) + end + + # Builds rdata from the provided information. + # @param next_domain either a string or a Name + # @param types an array of types (where each type is the numeric type code) + # or a TypeBitmap + def self.build_rdata(next_domain, types) + next_domain = Name.create(next_domain) if next_domain.is_a?(String) + types = TypeBitmap.from_type_codes(types) if types.is_a?(Array) + + binary_string = ''.force_encoding('ASCII-8BIT') + binary_string << next_domain.canonical + binary_string << BitMapping.reverse_binary_string_bits(types.to_binary_string) + binary_string + end + + # From the RFC: + # NXT has the following format: + # foo.nil. NXT big.foo.nil NS KEY SOA NXT + # <owner> NXT <next_domain> <record types> + # + # We handle the rdata, the RR superclass does the rest. + def rdata_to_string + "#{next_domain} #{NxtTypes.codes_to_names(types).join(' ')}" + end + + def encode_rdata(message_encoder, _canonical) + message_encoder.put_bytes(build_rdata) + end + + def build_rdata + self.class.build_rdata(next_domain, types) + end + + def self.decode_rdata(message_decoder) + + start_index = message_decoder.index + + rdata_len = -> do + rdata_length_str = message_decoder.data[start_index - 2, 2] + rdata_length_str.unpack('n').first + end + + next_domain_and_bitmap = -> do + next_domain = message_decoder.get_name + bitmap_start_index = message_decoder.index + + # If we're being called from new_from_data, the MessageDecoder + # contains only the rdata, not the entire message, and there will + # be no encoded length for us to read. + called_from_new_from_data = (start_index == 0) + bitmap_length = called_from_new_from_data \ + ? message_decoder.data.size \ + : rdata_len.() - (bitmap_start_index - start_index) + + bitmap = message_decoder.get_bytes(bitmap_length) + bitmap = BitMapping.reverse_binary_string_bits(bitmap) + [next_domain, bitmap] + end + + next_domain, type_bitmap = next_domain_and_bitmap.() + types = TypeBitmap.from_binary_string(type_bitmap).to_type_array + new(next_domain: next_domain, types: types) + end + + # 'name' is used in the RR superclass, but 'owner' is the term referred to + # in the RFC, so we'll make owner an alias for name. + alias_method(:owner, :name) + alias_method(:owner=, :name=) + + + # Methods used to manipulate the storage and representation of + # record types as stored in NXT record bitmaps. + module NxtTypes + + module_function + + # Maximum bitmap size is 128 bytes; since it's zero offset + # values are 0..(2 ** 128 - 1). However, the least + # significant bit must not be set, so the maximum is 1 less than that. + MAX_BITMAP_NUMBER_VALUE = (2 ** 128) - 1 - 1 + + # Convert a numeric type code to its corresponding name (e.g. "A" => 1). + # Unknown types are named "TYPE#{number}". + def code_to_name(number) + Types.to_string(number) || "TYPE#{number}" + end + + # Convert a type name to its corresponding numeric type code. + # Names matching /^TYPE(\d+)$/ are assumed to have a code + # corresponding to the numeric value of the substring following 'TYPE'. + def name_to_code(name) + code = Types.to_code(name) + if code.nil? + matches = /^TYPE(\d+)$/.match(name) + code = matches[1].to_i if matches + end + code + end + + # For a given array of type names, return an array of codes. + def names_to_codes(names) + names.map { |s| name_to_code(s) } + end + + # For the specified string containing names (e.g. 'A NS'), + # return an array containing the corresponding codes. + def names_string_to_codes(name_string) + names_to_codes(name_string.split(' ')) + end + + # For the given array of type codes, return an array of their + # corresponding names. + def codes_to_names(codes) + codes.map { |code| code_to_name(code) } + end + + # Generate a string containing the names corresponding to the + # numeric type codes. Sort it by the numeric type code, ascending. + def codes_to_string(codes) + codes.sort.map { |code| code_to_name(code) }.join(' ') + end + + # From a binary string of type code bits, return an array + # of type codes. + def binary_string_to_codes(binary_string) + bitmap_number = BitMapping.binary_string_to_number(binary_string) + assert_legal_bitmap_value(bitmap_number) + BitMapping.number_to_set_bit_positions_array(bitmap_number) + end + + # From a binary string of type code bits, return an array + # of type names. + def binary_string_to_names(binary_string) + codes = binary_string_to_codes(binary_string) + codes_to_names(codes) + end + + # From an array of type codes, return a binary string. + def codes_to_binary_string(codes) + codes = codes.sort + unless legal_code_value?(codes.first) && legal_code_value?(codes.last) + raise ArgumentError.new("All codes must be between 1 and 127: #{codes.inspect}.") + end + bitmap_number = BitMapping.set_bit_position_array_to_number(codes) + BitMapping.number_to_binary_string(bitmap_number) + end + + # Assert that the specified number is a legal value with which to + # instantiate a NXT type bitmap. Raise on error, do nothing on success. + def assert_legal_bitmap_value(number) + max_value = NxtTypes::MAX_BITMAP_NUMBER_VALUE + if number > max_value + raise ArgumentError.new("Bitmap maximum value is #{max_value} (0x#{max_value.to_s(16)}).") + end + if number & 1 == 1 + raise ArgumentError.new("Bitmap number must not have low bit set.") + end + end + + def legal_code_value?(code) + (1..127).include?(code) + end + end + + + class TypeBitmap + + attr_accessor :bitmap + + # Create an instance from a string containing type names separated by spaces + # e.g. "A TXT NXT" + def self.from_names_string(names_string) + type_codes = BitMapping.names_string_to_codes(names_string) + from_type_codes(type_codes) + end + + # Create an instance from type numeric codes (e.g. 30 for NXT). + def self.from_type_codes(type_codes) + new(BitMapping.set_bit_position_array_to_number(type_codes)) + end + + # Create an instance from a binary string, e.g. from a NXT record RDATA: + def self.from_binary_string(binary_string) + new(BitMapping.binary_string_to_number(binary_string)) + end + + # The constructor is made private so that the name of the method called + # to create the instance reveals to the reader the type of the initial data. + private_class_method :new + def initialize(bitmap_number) + NxtTypes.assert_legal_bitmap_value(bitmap_number) + @bitmap = Bitmap.from_number(bitmap_number) + end + + # Returns a binary string representing this data, in as few bytes as possible + # (i.e. no leading zero bytes). + def to_binary_string + bitmap.to_binary_string + end + + # Returns the instance's data as an array of type codes. + def to_type_array + bitmap.to_set_bit_position_array + end + + # Output types in dig format, e.g. "A AAAA NXT" + def to_s + type_codes = bitmap.to_set_bit_position_array + NxtTypes.codes_to_string(type_codes) + end + end +end +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/OPT.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/OPT.rb new file mode 100644 index 000000000000..944c923f3df0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/OPT.rb @@ -0,0 +1,272 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for EDNS pseudo resource record OPT. + # This class is effectively internal to Dnsruby + # See RFC 2671, RFC 2435 Section 3 + # @TODO@ Extended labels RFC2671 section 3 + class OPT < RR #:nodoc: all + ClassValue = nil #:nodoc: all + TypeValue = Types::OPT #:nodoc: all + DO_BIT = 0x8000 + + ADDRESS_FAMILIES = [1, 2] + IPV4_ADDRESS_FAMILY, IPV6_ADDRESS_FAMILY = ADDRESS_FAMILIES + + EDNS_SUBNET_OPTION = 8 + + # @TODO@ Add BADVERS to an XRCode CodeMapper object + + # Can be called with up to 3 arguments, none of which must be present + # * OPT.new() + # * OPT.new(size) + # * OPT.new(size,flags) + # * OPT.new(size,flags,options) + def initialize(*args) + @type = Types.new('OPT') + @ttl = nil + + @options=nil + if (args.length > 0) + self.payloadsize=(args[0]) + if (args.length > 1) + self.flags=(args[1]) + if (args.length > 2) + self.options=(args[2]) + else + self.options=nil + end + else + self.flags=0 + end + else + self.payloadsize=0 + end + end + + # From RFC 2671 : + # 4.3. The fixed part of an OPT RR is structured as follows: + # + # Field Name Field Type Description + # ------------------------------------------------------ + # NAME domain name empty (root domain) + # TYPE u_int16_t OPT + # CLASS u_int16_t sender's UDP payload size + # TTL u_int32_t extended RCODE and flags + # RDLEN u_int16_t describes RDATA + # RDATA octet stream {attribute,value} pairs + + # 4.6. The extended RCODE and flags (which OPT stores in the RR TTL field) + # are structured as follows: + # + # +0 (MSB) +1 (LSB) + # +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + # 0: | EXTENDED-RCODE | VERSION | + # +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + # 2: | Z | + # +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + # + # EXTENDED-RCODE Forms upper 8 bits of extended 12-bit RCODE. Note + # that EXTENDED-RCODE value "0" indicates that an + # unextended RCODE is in use (values "0" through "15"). + # + # VERSION Indicates the implementation level of whoever sets + # it. Full conformance with this specification is + # indicated by version "0." + + def flags_from_ttl + if (@ttl) + return [@ttl].pack("N") + else + return [0].pack("N") + end + end + + def xrcode + return ExtendedRCode.new(flags_from_ttl[0, 1].unpack("C")[0]) + end + + def xrcode=(c) + code = ExtendedRCode.new(c) + @ttl = (code.code << 24) + (version() << 16) + flags() + end + + def version + return flags_from_ttl[1, 1].unpack("C")[0] + end + + def version=(code) + @ttl = (xrcode().code << 24) + (code << 16) + flags() + end + + def flags + return flags_from_ttl[2, 2].unpack("n")[0] + end + + def flags=(code) + set_flags(code) + end + + def set_flags(code) # Should always be zero + @ttl = (xrcode().code << 24) + (version() << 16) + code + end + + def dnssec_ok + return ((flags() & DO_BIT) == DO_BIT) + end + + def dnssec_ok=(on) + if (on) + set_flags(flags() | DO_BIT) + else + set_flags(flags() & (~DO_BIT)) + end + end + + def payloadsize + return @klass.code + end + + def payloadsize=(size) + self.klass=Classes.new(size) + end + + def options(args) + if (args==nil) + return @options + elsif args.kind_of?(Integer) + # return list of options with that code + ret = [] + @options.each do |option| + if (option.code == args) + ret.push(option) + end + end + return ret + end + end + + def options=(options) + @options = options + end + + def from_data(data) + @options = data + end + + def from_string(input) + raise NotImplementedError + end + + def get_ip_addr(opt, family, source_netmask) + pad_format_string = family == IPV4_ADDRESS_FAMILY ? 'x3C' : 'x15C' + ip_addr = [0].pack(pad_format_string) + + num_to_copy = (source_netmask + 7) / 8 + num_to_copy.times { |index| ip_addr[index] = opt.data[index+4] } + ip_addr + end + + def get_client_subnet(opt) + family = opt.data[1].unpack('C')[0] + return "Unsupported(family=#{family})" unless ADDRESS_FAMILIES.include?(family) + + source_netmask = opt.data[2].unpack('C')[0] + scope_netmask = opt.data[3].unpack('C')[0] + + case family + when IPV4_ADDRESS_FAMILY + return "#{IPAddr::ntop(get_ip_addr(opt,family,source_netmask))}/#{source_netmask}/#{scope_netmask}" + when IPV6_ADDRESS_FAMILY + new_ipv6 = IPAddr.new(IPAddr::ntop(get_ip_addr(opt,family,source_netmask)), Socket::AF_INET6) + return "#{new_ipv6}/#{source_netmask}/#{scope_netmask}" + end + end + + def set_client_subnet(subnet) + family = IPV4_ADDRESS_FAMILY + scope_netmask = 0 + ip, source_netmask = subnet.split('/') + source_netmask = source_netmask.to_i + if subnet == "0.0.0.0/0" + edns_client_subnet = RR::OPT::Option.new( + EDNS_SUBNET_OPTION, [family, source_netmask, scope_netmask].pack("xcc*")) + else + ip_address = IPAddr.new(ip) + family = IPV6_ADDRESS_FAMILY if ip_address.ipv6? + num_addr_bytes = source_netmask / 8 + num_addr_bytes = num_addr_bytes + 1 if source_netmask % 8 > 0 + edns_client_subnet = RR::OPT::Option.new(EDNS_SUBNET_OPTION, [family, source_netmask, scope_netmask].pack("xcc*") + + ip_address.hton.slice(0, num_addr_bytes)) + end + self.options = [edns_client_subnet] + end + + def edns_client_subnet + return nil if @options.nil? + subnet_option = @options.detect { |option| option.code == EDNS_SUBNET_OPTION } + subnet_option ? get_client_subnet(subnet_option) : nil + end + + def to_s + ret = "OPT pseudo-record : payloadsize #{payloadsize}, xrcode #{xrcode.code}, version #{version}, flags #{flags}\n" + if @options + @options.each do |opt| + if opt.code == EDNS_SUBNET_OPTION + ret = ret + "CLIENT-SUBNET: #{get_client_subnet(opt)}" + else + ret = ret + " " + opt.to_s + end + end + end + ret = ret + "\n" + return ret + end + + def encode_rdata(msg, canonical=false) + if (@options) + @options.each do |opt| + msg.put_pack('n', opt.code) + msg.put_pack('n', opt.data.length) + msg.put_pack('a*', opt.data) + end + end + end + + def self.decode_rdata(msg)#:nodoc: all + if (msg.has_remaining?) + options = [] + while (msg.has_remaining?) do + code = msg.get_unpack('n')[0] + len = msg.get_unpack('n')[0] + data = msg.get_bytes(len) + options.push(Option.new(code, data)) + end + end + return self.new(0, 0, options) + end + + class Option + attr_accessor :code, :data + def initialize(code, data) + @code = code + @data = data + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/PX.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/PX.rb new file mode 100644 index 000000000000..616561095dad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/PX.rb @@ -0,0 +1,71 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + module IN + class PX < RR + ClassHash[[TypeValue = Types::PX, ClassValue = Classes::IN]] = self #:nodoc: all + + # The preference given to this RR. + attr_accessor :preference + # The RFC822 part of the RFC1327 mapping information. + attr_accessor :map822 + # The X.400 part of the RFC1327 mapping information. + attr_accessor :mapx400 + + def from_hash(hash) #:nodoc: all + @preference = hash[:preference] + @map822 = Name.create(hash[:map822]) + @mapx400 = Name.create(hash[:mapx400]) + end + + def from_data(data) #:nodoc: all + @preference, @map822, @mapx400 = data + end + + def from_string(input) #:nodoc: all + if (input.length > 0) + names = input.split(" ") + @preference = names[0].to_i + @map822 = Name.create(names[1]) + @mapx400 = Name.create(names[2]) + end + end + + def rdata_to_string #:nodoc: all + if (@preference!=nil) + return "#{@preference} #{@map822.to_s(true)} #{@mapx400.to_s(true)}" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack('n', @preference) + msg.put_name(@map822, canonical) + msg.put_name(@mapx400, canonical) + end + + def self.decode_rdata(msg) #:nodoc: all + preference, = msg.get_unpack('n') + map822 = msg.get_name + mapx400 = msg.get_name + return self.new([preference, map822, mapx400]) + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RP.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RP.rb new file mode 100644 index 000000000000..c08b92d1db52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RP.rb @@ -0,0 +1,75 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Responsible Person (RP) resource records. + # RFC 1183 Section 2.2 + class RP < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::RP #:nodoc: all + + # Returns a domain name that specifies the mailbox for the responsible person. + attr_reader :mailbox + # A domain name that specifies a TXT record containing further + # information about the responsible person. + attr_reader :txtdomain + + def txtdomain=(s) + @txtdomain = Name.create(s) + end + + def mailbox=(s) + @mailbox = Name.create(s) + end + + def from_hash(hash) + @mailbox = Name.create(hash[:mailbox]) + @txtdomain = Name.create(hash[:txtdomain]) + end + + def from_data(data) #:nodoc: all + @mailbox, @txtdomain= data + end + + def from_string(input) #:nodoc: all + if (input.length > 0) + names = input.split(" ") + @mailbox = Name.create(names[0]) + @txtdomain = Name.create(names[1]) + end + end + + def rdata_to_string #:nodoc: all + if (@mailbox!=nil) + return "#{@mailbox.to_s(true)} #{@txtdomain.to_s(true)}" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_name(@mailbox, canonical) + msg.put_name(@txtdomain, canonical) + end + + def self.decode_rdata(msg) #:nodoc: all + mailbox = msg.get_name + txtdomain = msg.get_name + return self.new([mailbox, txtdomain]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RR.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RR.rb new file mode 100644 index 000000000000..156eb31acdb3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RR.rb @@ -0,0 +1,420 @@ +# Superclass for all Dnsruby resource records. +# +# Represents a DNS RR (resource record) [RFC1035, section 3.2] +# +# Use Dnsruby::RR::create(...) to create a new RR record. +# +# mx = Dnsruby::RR.create("example.com. 7200 MX 10 mailhost.example.com.") +# +# rr = Dnsruby::RR.create({:name => "example.com", :type => "MX", :ttl => 7200, +# :preference => 10, :exchange => "mailhost.example.com"}) +# +# s = rr.to_s # Get a String representation of the RR (in zone file format) +# rr_again = Dnsruby::RR.create(s) +# + +require 'dnsruby/code_mappers' + +module Dnsruby +class RR + + include Comparable + + def <=>(other) + # return 1 if ((!other) || !(other.name) || !(other.type)) + # return -1 if (!@name) + if @name.canonical == other.name.canonical + @type.code != other.type.code ? (@type.code <=> other.type.code) : (@rdata <=> other.rdata) + else + @name <=> other.name + end + end + + # A regular expression which catches any valid resource record. + @@RR_REGEX = Regexp.new("^\\s*(\\S+)\\s*(\\d+)?\\s*(#{Classes.regexp + + "|CLASS\\d+"})?\\s*(#{Types.regexp + '|TYPE\\d+'})?\\s*([\\s\\S]*)\$") #:nodoc: all + + @@implemented_rr_map = nil + + # The Resource's domain name + attr_reader :name + + # The Resource type + attr_reader :type + + # The Resource class + attr_reader :klass + + # The Resource Time-To-Live + attr_accessor :ttl + + # The Resource data section + attr_accessor :rdata + + def rdlength + rdata.length + end + + def name=(new_name) + @name = new_name.kind_of?(Name) ? new_name : Name.create(new_name) + end + + def type=(type) + @type = Types.new(type) + end + alias :rr_type :type + + def klass=(klass) + if @type != Types::OPT + @klass = Classes.new(klass) + else + @klass = klass.is_a?(Classes) ? klass : Classes.new("CLASS#{klass}") + end + end + + def clone + encoded = MessageEncoder.new { |encoder| encoder.put_rr(self, true) }.to_s + MessageDecoder.new(encoded).get_rr + end + + + # Determines if two Records could be part of the same RRset. + # This compares the name, type, and class of the Records; the ttl and + # rdata are not compared. + def sameRRset(rec) + if @klass != rec.klass || @name.downcase != rec.name.downcase + return false + elsif (rec.type == Types.RRSIG) && (@type == Types.RRSIG) + return rec.type_covered == self.type_covered + end + [rec, self].each do |rr| + if rr.type == Types::RRSIG + return (@type == rr.type_covered) || (rec.type == rr.type_covered) + end + end + @type == rec.type + end + + def init_defaults + # Default to do nothing + end + + private + def initialize(*args) #:nodoc: all + init_defaults + if args.length > 0 + if args[0].class == Hash + from_hash(args[0]) + return + else + @rdata = args[0] + # print "Loading RR from #{args[0]}, class : #{args[0].class}\n" + if args[0].class == String + from_string(args[0]) + return + else + from_data(args[0]) + return + end + end + end + # raise ArgumentError.new("Don't call new! Use Dnsruby::RR::create() instead") + end + public + + def from_hash(hash) #:nodoc: all + hash.keys.each do |param| + send("#{param}=", hash[param]) + end + end + + # Create a new RR from the hash. The name is required; all other fields are optional. + # Type defaults to ANY and the Class defaults to IN. The TTL defaults to 0. + # + # If the type is specified, then it is necessary to provide ALL of the resource record fields which + # are specific to that record; i.e. for + # an MX record, you would need to specify the exchange and the preference + # + # require 'Dnsruby' + # rr = Dnsruby::RR.new_from_hash({:name => "example.com"}) + # rr = Dnsruby::RR.new_from_hash({:name => "example.com", :type => Types.MX, :ttl => 10, :preference => 5, :exchange => "mx1.example.com"}) + def RR.new_from_hash(inhash) + hash = inhash.clone + type = hash[:type] || Types::ANY + klass = Classes.new(hash[:klass] || Classes::IN) + ttl = hash[:ttl] || 0 + record_class = get_class(type, klass) + record = record_class.new + record.name = hash[:name] + unless record.name.kind_of?(Name) + record.name = Name.create(record.name) + end + record.ttl = ttl + record.type = type + record.klass = Classes.new(klass) + hash.delete(:name) + hash.delete(:type) + hash.delete(:ttl) + hash.delete(:klass) + record.from_hash(hash) + record + end + + # Returns a Dnsruby::RR object of the appropriate type and + # initialized from the string passed by the user. The format of the + # string is that used in zone files, and is compatible with the string + # returned by Net::DNS::RR.inspect + # + # The name and RR type are required; all other information is optional. + # If omitted, the TTL defaults to 0 and the RR class defaults to IN. + # + # All names must be fully qualified. The trailing dot (.) is optional. + # + # + # a = Dnsruby::RR.new_from_string("foo.example.com. 86400 A 10.1.2.3") + # mx = Dnsruby::RR.new_from_string("example.com. 7200 MX 10 mailhost.example.com.") + # cname = Dnsruby::RR.new_from_string("www.example.com 300 IN CNAME www1.example.com") + # txt = Dnsruby::RR.new_from_string('baz.example.com 3600 HS TXT "text record"') + # + # + def RR.new_from_string(rrstring) + # strip out comments + # Test for non escaped ";" by means of the look-behind assertion + # (the backslash is escaped) + rrstring = rrstring.gsub(/(\?<!\\);.*/o, '') + + matches = (/#{@@RR_REGEX}/xo).match(rrstring) + unless matches + raise "#{rrstring} did not match RR pattern. Please report this to the author!" + end + + name = matches[1] + ttl = matches[2].to_i || 0 + rrclass = matches[3] || '' + rrtype = matches[4] || '' + rdata = matches[5] || '' + + rdata.gsub!(/\s+$/o, '') if rdata + + # RFC3597 tweaks + # This converts to known class and type if specified as TYPE### + if rrtype =~/^TYPE\d+/o + rrtype = Dnsruby::Types.typesbyval(Dnsruby::Types::typesbyname(rrtype)) + end + if rrclass =~/^CLASS\d+/o + rrclass = Dnsruby::Classes.classesbyval(Dnsruby::Classes::classesbyname(rrclass)) + end + + if rrtype == '' && rrclass == 'ANY' + rrtype = 'ANY' + rrclass = 'IN' + elsif rrclass == '' + rrclass = 'IN' + end + + if rrtype == '' + rrtype = 'ANY' + end + + unless %w(NAPTR TXT).include?(rrtype) + if rdata + rdata.gsub!('(', '') + rdata.gsub!(')', '') + end + end + + test_length = ->(hexdump, rdlength) do + if hexdump.length != rdlength * 2 + raise "#{rdata} is inconsistent; length should be #{rdlength * 2} but is #{hexdump.length}." + end + end + + pack_rdata = ->(regex) do + rdata =~ regex + matches = regex.match(rdata) + rdlength = matches[1].to_i + hexdump = matches[2].gsub(/\s*/, '') + + test_length.(hexdump, rdlength) + packed_rdata = [hexdump].pack('H*') + + [packed_rdata, rdlength] + end + + if implemented_rrs.include?(rrtype) && rdata !~/^\s*\\#/o + return _get_subclass(name, rrtype, rrclass, ttl, rdata) + elsif implemented_rrs.include?(rrtype) # A known RR type starting with \# + packed_rdata, rdlength = pack_rdata.(/\\#\s+(\d+)\s+(.*)$/o) + return new_from_data(name, rrtype, rrclass, ttl, rdlength, packed_rdata, 0) # rdata.length() - rdlength); + elsif rdata =~ /\s*\\#\s+\d+\s+/o + regex = /\\#\s+(\d+)\s+(.*)$/o + # We are now dealing with the truly unknown. + raise 'Expected RFC3597 representation of RDATA' unless rdata =~ regex + packed_rdata, rdlength = pack_rdata.(regex) + return new_from_data(name, rrtype, rrclass, ttl, rdlength, packed_rdata, 0) # rdata.length() - rdlength); + else + # God knows how to handle these... + return _get_subclass(name, rrtype, rrclass, ttl, '') + end + end + + def RR.new_from_data(*args) #:nodoc: all + name, rrtype, rrclass, ttl, rdlength, data, offset = args + rdata = data ? data[offset, rdlength] : [] + decoder = MessageDecoder.new(rdata) + record = get_class(rrtype, rrclass).decode_rdata(decoder) + record.name = Name.create(name) + record.ttl = ttl + record.type = rrtype + record.klass = Classes.new(rrclass) + record + end + + # Return an array of all the currently implemented RR types + def RR.implemented_rrs + @@implemented_rr_map ||= ClassHash.keys.map { |key| Dnsruby::Types.to_string(key[0]) } + end + + class << self + private + def _get_subclass(name, rrtype, rrclass, ttl, rdata) #:nodoc: all + return unless (rrtype!=nil) + record = get_class(rrtype, rrclass).new(rdata) + record.name = Name.create(name) + record.ttl = ttl + record.type = rrtype + record.klass = Classes.new(rrclass) + return record + end + end + + # Returns a string representation of the RR in zone file format + def to_s + s = name ? (name.to_s(true) + "\t") : '' + s << [ttl, klass, type, rdata_to_string].map(&:to_s).join("\t") + end + + # Get a string representation of the data section of the RR (in zone file format) + def rdata_to_string + (@rdata && @rdata.length > 0) ? @rdata : 'no rdata' + end + + def from_data(data) #:nodoc: all + # to be implemented by subclasses + raise NotImplementedError.new + end + + def from_string(input) #:nodoc: all + # to be implemented by subclasses + # raise NotImplementedError.new + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + # to be implemented by subclasses + raise EncodeError.new("#{self.class} is RR.") + end + + def self.decode_rdata(msg) #:nodoc: all + # to be implemented by subclasses + raise DecodeError.new("#{self.class} is RR.") + end + + def ==(other) + return false unless self.class == other.class + + ivars_to_compare = ->(object) do + ivars = object.instance_variables.map { |var| var.to_s } + ivars.delete '@ttl' # RFC 2136 section 1.1 + ivars.delete '@rdata' + if self.type == Types.DS + ivars.delete '@digest' + end + ivars.sort + end + + get_instance_var_values = ->(object, ivar_names) do + ivar_names.map { |ivar_name| object.instance_variable_get(ivar_name) } + end + + self_ivars = ivars_to_compare.(self) + other_ivars = ivars_to_compare.(other) + return false unless self_ivars == other_ivars + + self_values = get_instance_var_values.(self, self_ivars) + other_values = get_instance_var_values.(other, other_ivars) + self_values == other_values + end + + def eql?(other) #:nodoc: + self == other + end + + def hash # :nodoc: + vars = (self.instance_variables - [:@ttl]).sort + vars.inject(0) do |hash_value, var_name| + hash_value ^ self.instance_variable_get(var_name).hash + end + end + + def self.find_class(type_value, class_value) # :nodoc: all + if !! (ret = ClassHash[[type_value, class_value]]) + return ret + elsif !! (val = ClassInsensitiveTypes[type_value]) + klass = Class.new(val) + klass.const_set(:TypeValue, type_value) + klass.const_set(:ClassValue, class_value) + return klass + else + return Generic.create(type_value, class_value) + end + end + + # Get an RR of the specified type and class + def self.get_class(type_value, class_value) #:nodoc: all + if type_value == Types::OPT + return Class.new(OPT) + elsif type_value.class == Class + type_value = type_value.const_get(:TypeValue) + return find_class(type_value, Classes.to_code(class_value)) + else + type_value = (type_value.class == Types) ? type_value.code : Types.new(type_value).code + class_value = (class_value.class == Classes) ? class_value.code : Classes.new(class_value).code + return find_class(type_value, class_value) + end + end + + + # Create a new RR from the arguments, which can be either a String or a Hash. + # See new_from_string and new_from_hash for details + # + # a = Dnsruby::RR.create('foo.example.com. 86400 A 10.1.2.3') + # mx = Dnsruby::RR.create('example.com. 7200 MX 10 mailhost.example.com.') + # cname = Dnsruby::RR.create('www.example.com 300 IN CNAME www1.example.com') + # txt = Dnsruby::RR.create('baz.example.com 3600 HS TXT 'text record'') + # + # rr = Dnsruby::RR.create({:name => 'example.com'}) + # rr = Dnsruby::RR.create({:name => 'example.com', :type => 'MX', :ttl => 10, + # :preference => 5, :exchange => 'mx1.example.com'}) + # + def RR.create(*args) + case args[0] + when String + new_from_string(args[0]) + when Hash + new_from_hash(args[0]) + else + new_from_data(args) + end + end + + def self.get_num(bytes) + ret = 0 + shift = (bytes.length - 1) * 8 + bytes.each_byte do |byte| + ret += byte.to_i << shift + shift -= 8 + end + ret + end +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RRSIG.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RRSIG.rb new file mode 100644 index 000000000000..a0fa4da2e946 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RRSIG.rb @@ -0,0 +1,275 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # (RFC4034, section 3) + # DNSSEC uses public key cryptography to sign and authenticate DNS + # resource record sets (RRsets). Digital signatures are stored in + # RRSIG resource records and are used in the DNSSEC authentication + # process described in [RFC4035]. A validator can use these RRSIG RRs + # to authenticate RRsets from the zone. The RRSIG RR MUST only be used + # to carry verification material (digital signatures) used to secure + # DNS operations. + # + # An RRSIG record contains the signature for an RRset with a particular + # name, class, and type. The RRSIG RR specifies a validity interval + # for the signature and uses the Algorithm, the Signer's Name, and the + # Key Tag to identify the DNSKEY RR containing the public key that a + # validator can use to verify the signature. + class RRSIG < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::RRSIG #:nodoc: all + + # 3.1. RRSIG RDATA Wire Format + # + # The RDATA for an RRSIG RR consists of a 2 octet Type Covered field, a + # 1 octet Algorithm field, a 1 octet Labels field, a 4 octet Original + # TTL field, a 4 octet Signature Expiration field, a 4 octet Signature + # Inception field, a 2 octet Key tag, the Signer's Name field, and the + # Signature field. + # + # 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 + # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + # | Type Covered | Algorithm | Labels | + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + # | Original TTL | + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + # | Signature Expiration | + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + # | Signature Inception | + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + # | Key Tag | / + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Signer's Name / + # / / + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + # / / + # / Signature / + # / / + # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + # The type covered by this RRSIG + attr_reader :type_covered + # The algorithm used for this RRSIG + # See Dnsruby::Algorithms for permitted values + attr_reader :algorithm + # The number of labels in the original RRSIG RR owner name + # Can be used to determine if name was synthesised from a wildcard. + attr_accessor :labels + # The TTL of the covered RRSet as it appears in the authoritative zone + attr_accessor :original_ttl + # The signature expiration + attr_accessor :expiration + # The signature inception + attr_accessor :inception + # The key tag value of the DNSKEY RR that validates this signature + attr_accessor :key_tag + # identifies the owner name of the DNSKEY RR that a validator is + # supposed to use to validate this signature + attr_reader :signers_name + + # contains the cryptographic signature that covers + # the RRSIG RDATA (excluding the Signature field) and the RRset + # specified by the RRSIG owner name, RRSIG class, and RRSIG Type + # Covered field + attr_accessor :signature + + def init_defaults + @algorithm=Algorithms.RSASHA1 + @type_covered = Types::A + @original_ttl = 3600 + @inception = Time.now.to_i + @expiration = Time.now.to_i + @key_tag = 0 + @labels = 0 + self.signers_name="." + @signature = "\0" + end + + def algorithm=(a) + if (a.instance_of?String) + if (a.to_i > 0) + a = a.to_i + end + end + begin + alg = Algorithms.new(a) + @algorithm = alg + rescue ArgumentError => e + raise DecodeError.new(e) + end + end + + def type_covered=(t) + begin + type = Types.new(t) + @type_covered = type + rescue ArgumentError => e + raise DecodeError.new(e) + end + end + + def signers_name=(s) + begin + name = Name.create(s) + @signers_name = name + rescue ArgumentError => e + raise DecodeError.new(e) + end + end + + + def from_data(data) #:nodoc: all + type_covered, algorithm, @labels, @original_ttl, expiration, inception, + @key_tag, signers_name, @signature = data + @expiration = expiration + @inception = inception + self.type_covered=(type_covered) + self.signers_name=(signers_name) + self.algorithm=(algorithm) + end + + def from_string(input) + if (input.length > 0) + data = input.split(" ") + self.type_covered=(data[0]) + self.algorithm=(data[1]) + self.labels=data[2].to_i + self.original_ttl=data[3].to_i + self.expiration=get_time(data[4]) + # Brackets may also be present + index = 5 + end_index = data.length - 1 + if (data[index]=="(") + index = 6 + end_index = data.length - 2 + end + self.inception=get_time(data[index]) + self.key_tag=data[index+1].to_i + self.signers_name=(data[index+2]) + # signature can include whitespace - include all text + # until we come to " )" at the end, and then gsub + # the white space out + buf="" + (index+3..end_index).each {|i| + if (comment_index = data[i].index(";")) + buf += data[i].slice(0, comment_index) + # @TODO@ We lose the comments here - we should really keep them for when we write back to string format? + break + else + buf += data[i] + end + } + buf.gsub!(/\n/, "") + buf.gsub!(/ /, "") + # self.signature=Base64.decode64(buf) + self.signature=buf.unpack("m*")[0] + end + end + + def RRSIG.get_time(input) + if input.kind_of?(Integer) + return input + end + # RFC 4034, section 3.2 + # The Signature Expiration Time and Inception Time field values MUST be + # represented either as an unsigned decimal integer indicating seconds + # since 1 January 1970 00:00:00 UTC, or in the form YYYYMMDDHHmmSS in + # UTC, where: + # + # YYYY is the year (0001-9999, but see Section 3.1.5); + # MM is the month number (01-12); + # DD is the day of the month (01-31); + # HH is the hour, in 24 hour notation (00-23); + # mm is the minute (00-59); and + # SS is the second (00-59). + # + # Note that it is always possible to distinguish between these two + # formats because the YYYYMMDDHHmmSS format will always be exactly 14 + # digits, while the decimal representation of a 32-bit unsigned integer + # can never be longer than 10 digits. + if (input.length == 10) + return input.to_i + elsif (input.length == 14) + year = input[0,4] + mon=input[4,2] + day=input[6,2] + hour=input[8,2] + min=input[10,2] + sec=input[12,2] + # @TODO@ REPLACE THIS BY LOCAL CODE - Time.gm DOG SLOW! + return Time.gm(year, mon, day, hour, min, sec).to_i + else + raise DecodeError.new("RRSIG : Illegal time value #{input} - see RFC 4034 section 3.2") + end + end + + def get_time(input) + return RRSIG.get_time(input) + end + + def format_time(time) + return Time.at(time).gmtime.strftime("%Y%m%d%H%M%S") + end + + def rdata_to_string #:nodoc: all + if (@type_covered!=nil) +# signature = Base64.encode64(@signature) # .gsub(/\n/, "") + signature = [@signature].pack("m*").gsub(/\n/, "") + # @TODO@ Display the expiration and inception as + return "#{@type_covered.string} #{@algorithm.string} #{@labels} #{@original_ttl} " + + "#{format_time(@expiration)} ( #{format_time(@inception)} " + + "#{@key_tag} #{@signers_name.to_s(true)} #{signature} )" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + # 2 octets, then 2 sets of 1 octet + msg.put_pack('ncc', @type_covered.to_i, @algorithm.to_i, @labels) + msg.put_pack("NNN", @original_ttl, @expiration, @inception) + msg.put_pack("n", @key_tag) + msg.put_name(@signers_name, canonical, false) + msg.put_bytes(@signature) + end + + def self.decode_rdata(msg) #:nodoc: all + type_covered, algorithm, labels = msg.get_unpack('ncc') + original_ttl, expiration, inception = msg.get_unpack('NNN') + key_tag, = msg.get_unpack('n') + signers_name = msg.get_name + signature = msg.get_bytes + return self.new( + [type_covered, algorithm, labels, original_ttl, expiration, + inception, key_tag, signers_name, signature]) + end + + def sig_data + # RRSIG_RDATA is the wire format of the RRSIG RDATA fields + # with the Signer's Name field in canonical form and + # the Signature field excluded; + data = MessageEncoder.new { |msg| + msg.put_pack('ncc', @type_covered.to_i, @algorithm.to_i, @labels) + msg.put_pack("NNN", @original_ttl, @expiration, @inception) + msg.put_pack("n", @key_tag) + msg.put_name(@signers_name, true) + }.to_s + return data + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RRSet.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RRSet.rb new file mode 100644 index 000000000000..c657c7d5c97f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RRSet.rb @@ -0,0 +1,190 @@ +module Dnsruby + +# RFC2181, section 5 +# "It is however possible for most record types to exist +# with the same label, class and type, but with different data. Such a +# group of records is hereby defined to be a Resource Record Set +# (RRSet)." +# This class also stores the RRSIG records which cover the RRSet +class RRSet + include Comparable + # The number of RRSIGs stored in this RRSet + attr_reader :num_sigs + def initialize(rrs = []) + if (!rrs.instance_of?Array) + rrs = [rrs] + end + @rrs = [] + @num_sigs = 0 + rrs.each {|rr| add(rr)} + end + def self.new_from_string(string) + rr_strings = string.split("\n") + rrs = rr_strings.map { |s| Dnsruby::RR.new_from_string(s) } + + Dnsruby::RRSet.new(rrs) + end # The RRSIGs stored with this RRSet + def sigs + return @rrs[@rrs.length-@num_sigs, @num_sigs] + end + # The RRs (not RRSIGs) stored in this RRSet + def rrs + return @rrs[0, @rrs.length-@num_sigs] + end + def privateAdd(r) #:nodoc: + if @rrs.include?r + return true + end + new_pos = @rrs.length - @num_sigs + if ((@num_sigs == @rrs.length) && @num_sigs > 0) # if we added RRSIG first + if (((r.type != @rrs.last.type_covered) && (r.type != Types.RRSIG))|| + ((r.type == Types.RRSIG) && (r.type_covered != @rrs.last.type_covered))) + return false + end + end + if (r.type == Types::RRSIG) + new_pos = @rrs.length + @num_sigs += 1 + end + @rrs.insert(new_pos, r) + return true + end + + # Add the RR to this RRSet + # Takes a copy of the RR by default. To suppress this, pass false + # as the second parameter. + def add(rin, do_clone = true) + if (rin.instance_of?RRSet) + ret = false + [rin.rrs, rin.sigs].each {|rr| ret = add(rr)} + return ret + end + # r = RR.create(r.to_s) # clone the record + r = nil + if do_clone + r = rin.clone + else + r = rin + end + if (@rrs.size() == 0) # && !(r.type == Types.RRSIG)) + return privateAdd(r) + end + # Check the type, klass and ttl are correct + first = @rrs[0] + if (!r.sameRRset(first)) + return false + # raise ArgumentError.new("record does not match rrset") + end + + if (!(r.type == Types::RRSIG) && (!(first.type == Types::RRSIG))) + if (r.ttl != first.ttl) # RFC2181, section 5.2 + if (r.ttl > first.ttl) + r.ttl=(first.ttl) + else + @rrs.each do |rr| + rr.ttl = r.ttl + end + end + end + end + + return privateAdd(r) + # return true + end + + def <=>(other) + # return 1 if ((!other) || !(other.name) || !(other.type)) + # return -1 if (!@name) + if (name.canonical == other.name.canonical) + return type.code <=> other.type.code + else + return name <=> other.name + end + end + + def sort_canonical + # Make a list, for all the RRs, where each RR contributes + # the canonical RDATA encoding + canonical_rrs = {} + self.rrs.each do |rr| + data = MessageEncoder.new {|msg| + rr.encode_rdata(msg, true) + }.to_s + canonical_rrs[data] = rr + end + + return_rrs = RRSet.new + canonical_rrs.keys.sort.each { |rdata| + return_rrs.add(canonical_rrs[rdata], false) + } + return return_rrs + end + + def ==(other) + return false unless other.instance_of?RRSet + return false if (other.sigs.length != self.sigs.length) + return false if (other.rrs.length != self.rrs.length) + return false if (other.ttl != self.ttl) + otherrrs = other.rrs + self.rrs.each {|rr| + return false if (!otherrrs.include?rr) + } + othersigs= other.sigs + self.sigs.each {|sig| + return false if (!othersigs.include?sig) + } + return true + end + # Delete the RR from this RRSet + def delete(rr) + @rrs.delete(rr) + end + def each + @rrs.each do |rr| + yield rr + end + end + def [](index) + return @rrs[index] + end + # Return the type of this RRSet + def type + if (@rrs[0]) + return @rrs[0].type + end + return nil + end + # Return the klass of this RRSet + def klass + return @rrs[0].klass + end + # Return the ttl of this RRSet + def ttl + return @rrs[0].ttl + end + def ttl=(ttl) + [rrs, sigs].each {|rrs| + rrs.each {|rr| + rr.ttl = ttl + } + } + end + def name + if (@rrs[0]) + return @rrs[0].name + else + return nil + end + end + def to_s + ret = "" + each {|rec| + ret += rec.to_s + "\n" + } + return ret + end + def length + return @rrs.length + end +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RT.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RT.rb new file mode 100644 index 000000000000..3737bfbc0ca3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/RT.rb @@ -0,0 +1,67 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS Route Through (RT) resource records. + # RFC 1183 Section 3.3 + class RT < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::RT #:nodoc: all + + # The preference for this route. + attr_accessor :preference + + # The domain name of the intermediate host. + attr_accessor :intermediate + + def from_hash(hash) #:nodoc: all + @preference = hash[:preference] + @intermediate = Name.create(hash[:intermediate]) + end + + def from_data(data) #:nodoc: all + @preference, @intermediate = data + end + + def from_string(input) #:nodoc: all + if (input.length > 0) + names = input.split(" ") + @preference = names[0].to_i + @intermediate = Name.create(names[1]) + end + end + + def rdata_to_string #:nodoc: all + if (@preference!=nil) + return "#{@preference} #{@intermediate.to_s(true)}" + else + return "" + end + end + + def encode_rdata(msg, canonical = false) #:nodoc: all + msg.put_pack('n', @preference) + msg.put_name(@intermediate, canonical) + end + + def self.decode_rdata(msg) #:nodoc: all + preference, = msg.get_unpack('n') + intermediate = msg.get_name + return self.new([preference, intermediate]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SOA.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SOA.rb new file mode 100644 index 000000000000..fe11264b557f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SOA.rb @@ -0,0 +1,95 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + class SOA < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::SOA #:nodoc: all + + # The domain name of the original or primary nameserver for + # this zone. + attr_accessor :mname + # A domain name that specifies the mailbox for the person + # responsible for this zone. + attr_accessor :rname + # The zone's serial number. + attr_accessor :serial + # The zone's refresh interval. + # How often, in seconds, a secondary nameserver is to check for + # updates from the primary nameserver. + attr_accessor :refresh + # The zone's retry interval. + # How often, in seconds, a secondary nameserver is to retry, after a + # failure to check for a refresh + attr_accessor :retry + # The zone's expire interval. + # How often, in seconds, a secondary nameserver is to use the data + # before refreshing from the primary nameserver + attr_accessor :expire + # The minimum (default) TTL for records in this zone. + attr_accessor :minimum + + def from_data(data) #:nodoc: all + @mname, @rname, @serial, @refresh, @retry, @expire, @minimum = data + end + + def from_hash(hash) + @mname = Name.create(hash[:mname]) + @rname = Name.create(hash[:rname]) + @serial = hash[:serial].to_i + @refresh = hash[:refresh].to_i + @retry = hash[:retry].to_i + @expire = hash[:expire].to_i + @minimum = hash[:minimum].to_i + end + + def from_string(input) + if (input.length > 0) + names = input.split(" ") + @mname = Name.create(names[0]) + @rname = Name.create(names[1]) + @serial = names[2].to_i + @refresh = names[3].to_i + @retry = names[4].to_i + @expire = names[5].to_i + @minimum = names[6].to_i + end + end + + def rdata_to_string #:nodoc: all + if (@mname!=nil) + return "#{@mname.to_s(true)} #{@rname.to_s(true)} #{@serial} #{@refresh} #{@retry} #{@expire} #{@minimum}" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_name(@mname, canonical) + msg.put_name(@rname, canonical) + msg.put_pack('NNNNN', @serial, @refresh, @retry, @expire, @minimum) + end + + def self.decode_rdata(msg) #:nodoc: all + mname = msg.get_name + rname = msg.get_name + serial, refresh, retry_, expire, minimum = msg.get_unpack('NNNNN') + return self.new( + [mname, rname, serial, refresh, retry_, expire, minimum]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SPF.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SPF.rb new file mode 100644 index 000000000000..2c52aaeb6c05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SPF.rb @@ -0,0 +1,29 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # DNS SPF resource record + + # This is a clone of the TXT record. This class therfore completely inherits + # all properties of the Dnsruby::Resource::TXT class. + # + # Please see the Dnsruby::Resource::TXT documentation for details + # RFC 1035 Section 3.3.14, draft-schlitt-ospf-classic-02.txt + class SPF < TXT + TypeValue = Types::SPF #:nodoc: all + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SRV.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SRV.rb new file mode 100644 index 000000000000..493bc8f381e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SRV.rb @@ -0,0 +1,112 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + module IN + # SRV resource record defined in RFC 2782 + # + # These records identify the hostname and port that a service is + # available at. + # + # The format is: + # _Service._Proto.Name TTL Class SRV Priority Weight Port Target + # + # The fields specific to SRV are defined in RFC 2782 + class SRV < RR + ClassHash[[TypeValue = Types::SRV, ClassValue = ClassValue]] = self #:nodoc: all + + # The priority of this target host. + # A client MUST attempt + # to contact the target host with the lowest-numbered priority it can + # reach; target hosts with the same priority SHOULD be tried in an + # order defined by the weight field. The range is 0-65535. Note that + # it is not widely implemented and should be set to zero. + attr_accessor :priority + + # A server selection mechanism. + # The weight field specifies + # a relative weight for entries with the same priority. Larger weights + # SHOULD be given a proportionately higher probability of being + # selected. The range of this number is 0-65535. Domain administrators + # SHOULD use Weight 0 when there isn't any server selection to do, to + # make the RR easier to read for humans (less noisy). Note that it is + # not widely implemented and should be set to zero. + attr_accessor :weight + + # The port on this target host of this service. The range is 0-65535. + attr_accessor :port + + # The domain name of the target host. A target of "." means + # that the service is decidedly not available at this domain. + attr_accessor :target + + def from_data(data) #:nodoc: all + @priority, @weight, @port, @target = data + end + + def from_hash(hash) + if hash[:priority] + @priority = hash[:priority].to_i + end + if hash[:weight] + @weight = hash[:weight].to_i + end + if hash[:port] + @port = hash[:port].to_i + end + if hash[:target] + @target= Name.create(hash[:target]) + end + end + + def from_string(input) + if (input.length > 0) + names = input.split(" ") + @priority = names[0].to_i + @weight = names[1].to_i + @port = names[2].to_i + if (names[3]) + @target = Name.create(names[3]) + end + end + end + + def rdata_to_string + if (@target!=nil) + return "#{@priority} #{@weight} #{@port} #{@target.to_s(true)}" + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack("n", @priority) + msg.put_pack("n", @weight) + msg.put_pack("n", @port) + msg.put_name(@target,canonical) + end + + def self.decode_rdata(msg) #:nodoc: all + priority, = msg.get_unpack("n") + weight, = msg.get_unpack("n") + port, = msg.get_unpack("n") + target = msg.get_name + return self.new([priority, weight, port, target]) + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SSHFP.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SSHFP.rb new file mode 100644 index 000000000000..8d760ea20f42 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/SSHFP.rb @@ -0,0 +1,95 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + class SSHFP < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::SSHFP #:nodoc: all + + attr_accessor :alg + attr_accessor :fptype + attr_accessor :fp + + class Algorithms < CodeMapper + RSA = 1 + DSS = 2 + update() + end + + class FpTypes < CodeMapper + SHA1 = 1 + update() + end + + def from_data(data) #:nodoc: all + alg, fptype, @fp = data + @alg = Algorithms.new(alg) + @fptype = FpTypes.new(fptype) + end + + def from_hash(hash) + if hash[:alg] + @alg = Algorithms.new(hash[:alg]) + end + if hash[:fptype] + @fptype = FpTypes.new(hash[:fptype]) + end + if hash[:fp] + @fp = hash[:fp] + end + end + + def from_string(input) + if (input.length > 0) + names = input.split(" ") + begin + @alg = Algorithms.new(names[0].to_i) + rescue ArgumentError + @alg = Algorithms.new(names[0]) + end + begin + @fptype = FpTypes.new(names[1].to_i) + rescue ArgumentError + @fptype = FpTypes.new(names[1]) + end + remaining = "" + for i in 2..(names.length + 1) + remaining += names[i].to_s + end + @fp = [remaining].pack("H*") + end + end + + def rdata_to_string + ret = "#{@alg.code} #{@fptype.code} " + ret += @fp.unpack("H*")[0] + return ret + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_pack("c", @alg.code) + msg.put_pack("c", @fptype.code) + msg.put_bytes(@fp) + end + + def self.decode_rdata(msg) #:nodoc: all + alg, fptype = msg.get_unpack("cc") + fp = msg.get_bytes + return self.new([alg, fptype, fp]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TKEY.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TKEY.rb new file mode 100644 index 000000000000..dc4007101463 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TKEY.rb @@ -0,0 +1,163 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + + class Modes < CodeMapper + # The key is assigned by the server (unimplemented) + SERVERASSIGNED = 1 + + # The key is computed using a Diffie-Hellman key exchange + DIFFIEHELLMAN = 2 + + # The key is computed using GSS_API (unimplemented) + GSSAPI = 3 + + # The key is assigned by the resolver (unimplemented) + RESOLVERASSIGNED = 4 + + # The key should be deleted + DELETE = 5 + update() + end + + class RR + # RFC2930 + class TKEY < RR + TypeValue = Types::TKEY #:nodoc: all + ClassValue = nil #:nodoc: all + ClassHash[[TypeValue, Classes::ANY]] = self #:nodoc: all + + attr_reader :key_size + attr_accessor :key + # Gets or sets the domain name that specifies the name of the algorithm. + # The default algorithm is gss.microsoft.com + # + # rr.algorithm=(algorithm_name) + # print "algorithm = ", rr.algorithm, "\n" + # + attr_accessor :algorithm + # Gets or sets the inception time as the number of seconds since 1 Jan 1970 + # 00:00:00 UTC. + # + # The default inception time is the current time. + # + # rr.inception=(time) + # print "inception = ", rr.inception, "\n" + # + attr_accessor :inception + # Gets or sets the expiration time as the number of seconds since 1 Jan 1970 + # 00:00:00 UTC. + # + # The default expiration time is the current time plus 1 day. + # + # rr.expiration=(time) + # print "expiration = ", rr.expiration, "\n" + # + attr_accessor :expiration + # Sets the key mode (see rfc2930). The default is 3 which corresponds to GSSAPI + # + # rr.mode=(3) + # print "mode = ", rr.mode, "\n" + # + attr_accessor :mode + # Returns the RCODE covering TKEY processing. See RFC 2930 for details. + # + # print "error = ", rr.error, "\n" + # + attr_accessor :error + # Returns the length of the Other Data. Should be zero. + # + # print "other size = ", rr.other_size, "\n" + # + attr_reader :other_size + # Returns the Other Data. This field should be empty. + # + # print "other data = ", rr.other_data, "\n" + # + attr_reader :other_data + + def other_data=(od) + @other_data=od + @other_size=@other_data.length + end + + def initialize + @algorithm = "gss.microsoft.com" + @inception = Time.now + @expiration = Time.now + 24*60*60 + @mode = Modes.GSSAPI + @error = 0 + @other_size = 0 + @other_data = "" + + # RFC 2845 Section 2.3 + @klass = Classes.ANY + # RFC 2845 Section 2.3 + @ttl = 0 + end + + def from_hash(hash) + super(hash) + if (algorithm) + @algorithm = Name.create(hash[:algorithm]) + end + end + + def from_data(data) #:nodoc: all + @algorithm, @inception, @expiration, @mode, @error, @key_size, @key, @other_size, @other_data = data + end + + # Create the RR from a standard string + def from_string(string) #:nodoc: all + Dnsruby.log.error("Dnsruby::RR::TKEY#from_string called, but no text format defined for TKEY") + end + + def rdata_to_string + rdatastr="" + + if (@algorithm!=nil) + error = @error + error = "UNDEFINED" unless error!=nil + rdatastr = "#{@algorithm.to_s(true)} #{error}" + if (@other_size != nil && @other_size >0 && @other_data!=nil) + rdatastr += " #{@other_data}" + end + end + + return rdatastr + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_name(@algorithm, canonical) + msg.put_pack("NNnn", @inception, @expiration, @mode, @error) + msg.put_pack("n", @key.length) + msg.put_bytes(@key) + msg.put_pack("n", @other_data.length) + msg.put_bytes(@other_data) + end + + def self.decode_rdata(msg) #:nodoc: all + alg=msg.get_name + inc, exp, mode, error = msg.get_unpack("NNnn") + key_size, =msg.get_unpack("n") + key=msg.get_bytes(key_size) + other_size, =msg.get_unpack("n") + other=msg.get_bytes(other_size) + return self.new([alg, inc, exp, mode, error, key_size, key, other_size, other]) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TLSA.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TLSA.rb new file mode 100644 index 000000000000..a7a35e70a153 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TLSA.rb @@ -0,0 +1,149 @@ +require 'openssl' + +module Dnsruby + class RR + module IN + # Class for DNS TLSA server certificate or public key (TLSA) resource records. + # + # RFC 6698 + class TLSA < RR + ClassHash[[TypeValue = Types::TLSA, ClassValue = ClassValue]] = self #:nodoc: all + # sec 2.1.1 ,7,2 + # + # 0 CA constraint + # 1 Service certificate constraint + # 2 Trust anchor assertion + # 3 Domain-issued certificate + # 4-254 Unassigned + # 255 Private use + attr_accessor :usage + # sec 2.1.2, 7.3 + # + # 0 Full certificate + # 1 SubjectPublicKeyInfo + # 2-254 Unassigned + # 255 Private use + attr_accessor :selector + # sec 2.3.1 + # + # 0 Exact match on selected content + # 1 SHA-256 hash of selected content + # 2 SHA-512 hash of selected content + # 3-254 Unassigned + # 255 Private use + attr_accessor :matching_type + # sec 2.1.4 + attr_accessor :data + attr_accessor :databin + + def verify + raise ArgumentError, "usage with invalid value: #{@usage}" if @usage < 0 || @usage > 255 + raise ArgumentError, "selector with invalid value: #{@selector}" if @selector < 0 || @selector > 255 + raise ArgumentError, "matching_type with invalid value: #{@matching_type}" if @matching_type < 0 || @matching_type > 255 + raise ArgumentError, "data with invalid value: #{@data}" if (@matching_type == 1 && @databin.bytesize != 32) || (@matching_type == 2 && @databin.bytesize != 64) + pkey if @matching_type == 0 + end + + def from_data(data) #:nodoc: all + self.usage = data[0] + self.selector = data[1] + self.matching_type = data[2] + self.databin = data[3] + verify + end + + # Create the RR from a hash + def from_hash(hash) + super(hash) + verify + end + + def data=(data) + self.databin = parse_string(data) + end + + def databin=(databin) + @databin = databin + @data = @databin.unpack('H*')[0].each_char.each_slice(57).map(&:join).join(' ') + end + + def cert + if @matching_type == 0 && @selector == 0 && @databin + begin + cert = OpenSSL::X509::Certificate.new(@databin) + rescue => e + raise ArgumentError, 'data is invalid cert ' + end + end + cert + end + + def pkey + pubkey = nil + if @matching_type == 0 && @databin + if @selector == 0 + cert = self.cert + pubkey = cert.public_key + elsif @selector == 1 + begin + pubkey = OpenSSL::PKey.read(@databin) + rescue + raise ArgumentError, 'data is invalid pkey' + end + end + end + pubkey + end + + def parse_string(data) + buf = '' + comment = false + multiline = false + data.each_char do |ch| + case ch + when ';' then comment = true + when '\n' + raise ArgumentError, 'string format error' unless multiline + comment = false + when '\r' then next + when ' ' then next + when comment then next + when '(' then multiline = true + when ')' then multiline = false + else + buf += ch + end + end + raise ArgumentError, 'string format error' if multiline + + [buf].pack('H*') + end + + # Create the RR from a standard string + def from_string(input) + values = input.split(' ', 4) + self.usage = values[0].to_i + self.selector = values[1].to_i + self.matching_type = values[2].to_i + self.data = values[3] + verify + end + + def rdata_to_string + "#{@usage} #{@selector} #{@matching_type} #{@data}" + end + + def encode_rdata(msg, _canonical = false) #:nodoc: all + msg.put_pack('CCC', @usage, @selector, @matching_type) + msg.put_bytes(@databin) + end + + def self.decode_rdata(msg) #:nodoc: all + usage, selector, matching_type = msg.get_unpack('CCC') + databin = msg.get_bytes + new([usage, selector, matching_type, databin]) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TSIG.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TSIG.rb new file mode 100644 index 000000000000..76622cf88e97 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TSIG.rb @@ -0,0 +1,599 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +# require 'base64' +begin +require 'openssl' +rescue LoadError + print "OpenSSL not found - ignoring\n" +end +module Dnsruby + class RR + # TSIG implements RFC2845. + # + # "This protocol allows for transaction level authentication using + # shared secrets and one way hashing. It can be used to authenticate + # dynamic updates as coming from an approved client, or to authenticate + # responses as coming from an approved recursive name server." + # + # A Dnsruby::RR::TSIG can represent the data present in a TSIG RR. + # However, it can also represent the data (specified in RFC2845) used + # to sign or verify a DNS message. + # + # + # Example code : + # res = Dnsruby::Resolver.new("ns0.validation-test-servers.nominet.org.uk") + # + # # Now configure the resolver with the TSIG key for signing/verifying + # KEY_NAME="rubytsig" + # KEY = "8n6gugn4aJ7MazyNlMccGKH1WxD2B3UvN/O/RA6iBupO2/03u9CTa3Ewz3gBWTSBCH3crY4Kk+tigNdeJBAvrw==" + # res.tsig=KEY_NAME, KEY + # + # update = Dnsruby::Update.new("validation-test-servers.nominet.org.uk") + # # Generate update record name, and test it has been made. Then delete it and check it has been deleted + # update_name = generate_update_name + # update.absent(update_name) + # update.add(update_name, 'TXT', 100, "test signed update") + # + # # Resolver will automatically sign message and verify response + # response = res.send_message(update) + # assert(response.verified?) # Check that the response has been verified + class TSIG < RR + HMAC_MD5 = Name.create("HMAC-MD5.SIG-ALG.REG.INT.") + HMAC_SHA1 = Name.create("hmac-sha1.") + HMAC_SHA256 = Name.create("hmac-sha256.") + HMAC_SHA512 = Name.create("hmac-sha512.") + + DEFAULT_FUDGE = 300 + + DEFAULT_ALGORITHM = HMAC_MD5 + + # Generates a TSIG record and adds it to the message. + # Takes an optional original_request argument for the case where this is + # a response to a query (RFC2845 3.4.1) + # + # Message#tsigstate will be set to :Signed. + def apply(message, original_request=nil) + if (!message.signed?) + tsig_rr = generate(message, original_request) + message.add_additional(tsig_rr) + message.tsigstate = :Signed + @query = message + tsig_rr.query = message + end + end + + def query=q#:nodoc: all + @query = q + end + + + # Generates a TSIG record + def generate(msg, original_request = nil, data="", msg_bytes=nil, tsig_rr=self)#:nodoc: all + time_signed=@time_signed + if (!time_signed) + time_signed=Time.now.to_i + end + if (tsig_rr.time_signed) + time_signed = tsig_rr.time_signed + end + + if (original_request) + # # Add the request MAC if present (used to validate responses). + # hmac.update(pack("H*", request_mac)) + mac_bytes = MessageEncoder.new {|m| + m.put_pack('n', original_request.tsig.mac_size) + m.put_bytes(original_request.tsig.mac) + }.to_s + data += mac_bytes + # Original ID - should we set message ID to original ID? + if (tsig_rr != self) + msg.header.id = tsig_rr.original_id + else + msg.header.id = original_request.header.id + end + end + + if (!msg_bytes) + msg_bytes = msg.encode + data += msg_bytes + else + # If msg_bytes came in, we need somehow to remove the TSIG RR + # It is the last record, so we can strip it if we know where it starts + # We must also poke the header ARcount to decrement it + msg_bytes = Header.decrement_arcount_encoded(msg_bytes) + data += msg_bytes[0, msg.tsigstart] + end + + data += sig_data(tsig_rr, time_signed) + + mac = calculate_mac(tsig_rr.algorithm, data) + + mac_size = mac.length + + new_tsig_rr = Dnsruby::RR.create({ + :name => tsig_rr.name, + :type => Types.TSIG, + :ttl => tsig_rr.ttl, + :klass => tsig_rr.klass, + :algorithm => tsig_rr.algorithm, + :fudge => tsig_rr.fudge, + :key => @key, + :mac => mac, + :mac_size => mac_size, + :error => tsig_rr.error, + :time_signed => time_signed, + :original_id => msg.header.id + }) + return new_tsig_rr + + end + + def calculate_mac(algorithm, data) + mac=nil +# + if (key_size > max_digest_len) { +# + EVP_DigestInit(&ectx, digester); +# + EVP_DigestUpdate(&ectx, (const void*) key_bytes, key_size); +# + EVP_DigestFinal(&ectx, key_bytes, NULL); +# + key_size = max_digest_len; +# + } + key = @key.gsub(" ", "") + # key = Base64::decode64(key) + key = key.unpack("m*")[0] + if (algorithm.to_s.downcase == HMAC_MD5.to_s.downcase) + mac = OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, key, data) + elsif (algorithm == HMAC_SHA1) + mac = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, key, data) + elsif (algorithm == HMAC_SHA256) + mac = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, key, data) + elsif (algorithm == HMAC_SHA512) + mac = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA512.new, key, data) + else + # Should we allow client to pass in their own signing function? + raise VerifyError.new("Algorithm #{algorithm} unsupported by TSIG") + end + return mac + end + + # Private method to return the TSIG RR data to be signed + def sig_data(tsig_rr, time_signed=@time_signed) #:nodoc: all + return MessageEncoder.new { |msg| + msg.put_name(tsig_rr.name.downcase, true) + msg.put_pack('nN', tsig_rr.klass.code, tsig_rr.ttl) + msg.put_name(tsig_rr.algorithm.downcase, true) + + time_high = (time_signed >> 32) + time_low = (time_signed & 0xFFFFFFFF) + msg.put_pack('nN', time_high, time_low) + msg.put_pack('n', tsig_rr.fudge) + msg.put_pack('n', tsig_rr.error) + msg.put_pack('n', tsig_rr.other_size) + msg.put_bytes(tsig_rr.other_data) + }.to_s + end + + # Verify a response. This method will be called by Dnsruby::SingleResolver + # before passing a response to the client code. + # The TSIG record will be removed from packet before passing to client, and + # the Message#tsigstate and Message#tsigerror will be set accordingly. + # Message#tsigstate will be set to one of : + # * :Failed + # * :Verified + def verify(query, response, response_bytes, buf="") + # 4.6. Client processing of answer + # + # When a client receives a response from a server and expects to see a + # TSIG, it first checks if the TSIG RR is present in the response. + # Otherwise, the response is treated as having a format error and + # discarded. The client then extracts the TSIG, adjusts the ARCOUNT, + # and calculates the keyed digest in the same way as the server. If + # the TSIG does not validate, that response MUST be discarded, unless + # the RCODE is 9 (NOTAUTH), in which case the client SHOULD attempt to + # verify the response as if it were a TSIG Error response, as specified + # in [4.3]. A message containing an unsigned TSIG record or a TSIG + # record which fails verification SHOULD not be considered an + # acceptable response; the client SHOULD log an error and continue to + # wait for a signed response until the request times out. + + # So, this verify method should simply remove the TSIG RR and calculate + # the MAC (using original request MAC if required). + # Should set tsigstate on packet appropriately, and return error. + # Side effect is packet is stripped of TSIG. + # Resolver (or client) can then decide what to do... + + msg_tsig_rr = response.tsig + if (!verify_common(response)) + return false + end + + new_msg_tsig_rr = generate(response, query, buf, response_bytes, msg_tsig_rr) + + if (msg_tsig_rr.mac == new_msg_tsig_rr.mac) + response.tsigstate = :Verified + response.tsigerror = RCode.NOERROR + return true + else + response.tsigstate = :Failed + response.tsigerror = RCode.BADSIG + return false + end + end + + def verify_common(response)#:nodoc: all + tsig_rr = response.tsig + + if (!tsig_rr) + response.tsigerror = RCode.FORMERR + response.tsigstate = :Failed + return false + end + + response.additional.delete(tsig_rr) + response.header.arcount-=1 + + # First, check the TSIG error in the RR + if (tsig_rr.error != RCode.NOERROR) + response.tsigstate = :Failed + response.tsigerror = tsig_rr.error + return false + end + + if ((tsig_rr.name != @name) || (tsig_rr.algorithm.downcase != @algorithm.downcase)) + Dnsruby.log.error("BADKEY failure") + response.tsigstate = :Failed + response.tsigerror = RCode.BADKEY + return false + end + + # Check time_signed (RFC2845, 4.5.2) - only really necessary for server + if (Time.now.to_i > tsig_rr.time_signed + tsig_rr.fudge || + Time.now.to_i < tsig_rr.time_signed - tsig_rr.fudge) + Dnsruby.log.error("TSIG failed with BADTIME") + response.tsigstate = :Failed + response.tsigerror = RCode.BADTIME + return false + end + + return true + end + + # Checks TSIG signatures across sessions of multiple DNS envelopes. + # This method is called each time a new envelope comes in. The envelope + # is checked - if a TSIG is present, them the stream so far is verified, + # and the response#tsigstate set to :Verified. If a TSIG is not present, + # and does not need to be present, then the message is added to the digest + # stream and the response#tsigstate is set to :Intermediate. + # If there is an error with the TSIG verification, then the response#tsigstate + # is set to :Failed. + # Like verify, this method will only be called by the Dnsruby::SingleResolver + # class. Client code need not call this method directly. + def verify_envelope(response, response_bytes) + # RFC2845 Section 4.4 + # ----- + # A DNS TCP session can include multiple DNS envelopes. This is, for + # example, commonly used by zone transfer. Using TSIG on such a + # connection can protect the connection from hijacking and provide data + # integrity. The TSIG MUST be included on the first and last DNS + # envelopes. It can be optionally placed on any intermediary + # envelopes. It is expensive to include it on every envelopes, but it + # MUST be placed on at least every 100'th envelope. The first envelope + # is processed as a standard answer, and subsequent messages have the + # following digest components: + # + # * Prior Digest (running) + # * DNS Messages (any unsigned messages since the last TSIG) + # * TSIG Timers (current message) + # + # This allows the client to rapidly detect when the session has been + # altered; at which point it can close the connection and retry. If a + # client TSIG verification fails, the client MUST close the connection. + # If the client does not receive TSIG records frequently enough (as + # specified above) it SHOULD assume the connection has been hijacked + # and it SHOULD close the connection. The client SHOULD treat this the + # same way as they would any other interrupted transfer (although the + # exact behavior is not specified). + # ----- + # + # Each time a new envelope comes in, this method is called on the QUERY TSIG RR. + # It will set the response tsigstate to :Verified :Intermediate or :Failed + # as appropriate. + + # Keep digest going of messages as they come in (and mark them intermediate) + # When TSIG comes in, work out what key should be and check. If OK, mark + # verified. Can reset digest then. + if (!@buf) + @num_envelopes = 0 + @last_signed = 0 + end + @num_envelopes += 1 + if (!response.tsig) + if ((@num_envelopes > 1) && (@num_envelopes - @last_signed < 100)) + Dnsruby.log.debug("Receiving intermediate envelope in TSIG TCP session") + response.tsigstate = :Intermediate + response.tsigerror = RCode.NOERROR + @buf = @buf + response_bytes + return + else + response.tsigstate = :Failed + Dnsruby.log.error("Expecting signed packet") + return false + end + end + @last_signed = @num_envelopes + + # We have a TSIG - process it! + tsig = response.tsig + if (@num_envelopes == 1) + Dnsruby.log.debug("First response in TSIG TCP session - verifying normally") + # Process it as a standard answer + ok = verify(@query, response, response_bytes) + if (ok) + mac_bytes = MessageEncoder.new {|m| + m.put_pack('n', tsig.mac_size) + m.put_bytes(tsig.mac) + }.to_s + @buf = mac_bytes + end + return ok + end + Dnsruby.log.debug("Processing TSIG on TSIG TCP session") + + if (!verify_common(response)) + return false + end + + # Now add the current message data - remember to frig the arcount + response_bytes = Header.decrement_arcount_encoded(response_bytes) + @buf += response_bytes[0, response.tsigstart] + + # Let's add the timers + timers_data = MessageEncoder.new { |msg| + time_high = (tsig.time_signed >> 32) + time_low = (tsig.time_signed & 0xFFFFFFFF) + msg.put_pack('nN', time_high, time_low) + msg.put_pack('n', tsig.fudge) + }.to_s + @buf += timers_data + + mac = calculate_mac(tsig.algorithm, @buf) + + if (mac != tsig.mac) + Dnsruby.log.error("TSIG Verify error on TSIG TCP session") + response.tsigstate = :Failed + return false + end + mac_bytes = MessageEncoder.new {|m| + m.put_pack('n', mac.length) + m.put_bytes(mac) + }.to_s + @buf=mac_bytes + + response.tsigstate = :Verified + response.tsigerror = RCode.NOERROR + return true + end + + + TypeValue = Types::TSIG #:nodoc: all + ClassValue = nil #:nodoc: all + ClassHash[[TypeValue, Classes::ANY]] = self #:nodoc: all + + # Gets or sets the domain name that specifies the name of the algorithm. + # The only algorithms currently supported are hmac-md5 and hmac-sha1. + # + # rr.algorithm=(algorithm_name) + # print "algorithm = ", rr.algorithm, "\n" + # + attr_reader :algorithm + + # Gets or sets the signing time as the number of seconds since 1 Jan 1970 + # 00:00:00 UTC. + # + # The default signing time is the current time. + # + # rr.time_signed=(time) + # print "time signed = ", rr.time_signed, "\n" + # + attr_accessor :time_signed + + # Gets or sets the "fudge", i.e., the seconds of error permitted in the + # signing time. + # + # The default fudge is 300 seconds. + # + # rr.fudge=(60) + # print "fudge = ", rr.fudge, "\n" + # + attr_reader :fudge + + # Returns the number of octets in the message authentication code (MAC). + # The programmer must call a Net::DNS::Packet object's data method + # before this will return anything meaningful. + # + # print "MAC size = ", rr.mac_size, "\n" + # + attr_accessor :mac_size + + # Returns the message authentication code (MAC) as a string of hex + # characters. The programmer must call a Net::DNS::Packet object's + # data method before this will return anything meaningful. + # + # print "MAC = ", rr.mac, "\n" + # + attr_accessor :mac + + # Gets or sets the original message ID. + # + # rr.original_id(12345) + # print "original ID = ", rr.original_id, "\n" + # + attr_accessor :original_id + + # Returns the RCODE covering TSIG processing. Common values are + # NOERROR, BADSIG, BADKEY, and BADTIME. See RFC 2845 for details. + # + # print "error = ", rr.error, "\n" + # + attr_accessor :error + + # Returns the length of the Other Data. Should be zero unless the + # error is BADTIME. + # + # print "other len = ", rr.other_size, "\n" + # + attr_accessor :other_size + + # Returns the Other Data. This field should be empty unless the + # error is BADTIME, in which case it will contain the server's + # time as the number of seconds since 1 Jan 1970 00:00:00 UTC. + # + # print "other data = ", rr.other_data, "\n" + # + attr_accessor :other_data + + # Stores the secret key used for signing/verifying messages. + attr_accessor :key + + def init_defaults + # @TODO@ Have new() method which takes key_name and key? + @algorithm = DEFAULT_ALGORITHM + @fudge = DEFAULT_FUDGE + @mac_size = 0 + @mac = "" + @original_id = rand(65536) + @error = 0 + @other_size = 0 + @other_data = "" + @time_signed = nil + @buf = nil + + # RFC 2845 Section 2.3 + @klass = Classes.ANY + + @ttl = 0 # RFC 2845 Section 2.3 + end + + def from_data(data) #:nodoc: all + @algorithm, @time_signed, @fudge, @mac_size, @mac, @original_id, @error, @other_size, @other_data = data + end + + def name=(n) + if (n.instance_of?String) + n = Name.create(n) + end + if (!n.absolute?) + @name = Name.create(n.to_s + ".") + else + @name = n + end + end + + # Create the RR from a standard string + def from_string(str) #:nodoc: all + parts = str.split("[:/]") + if (parts.length < 2 || parts.length > 3) + raise ArgumentException.new("Invalid TSIG key specification") + end + if (parts.length == 3) + return TSIG.new(parts[0], parts[1], parts[2]); + else + return TSIG.new(HMAC_MD5, parts[0], parts[1]); + end + end + + # Set the algorithm to use to generate the HMAC + # Supported values are : + # * hmac-md5 + # * hmac-sha1 + # * hmac-sha256 + # * hmac-sha512 + def algorithm=(alg) + if (alg.class == String) + if (alg.downcase=="hmac-md5") + @algorithm = HMAC_MD5; + elsif (alg.downcase=="hmac-sha1") + @algorithm = HMAC_SHA1; + elsif (alg.downcase=="hmac-sha256") + @algorithm = HMAC_SHA256; + elsif (alg.downcase=="hmac-sha512") + @algorithm = HMAC_SHA512; + else + raise ArgumentError.new("Invalid TSIG algorithm") + end + elsif (alg.class == Name) + if (alg!=HMAC_MD5 && alg!=HMAC_SHA1 && alg!=HMAC_SHA256 && alg!=HMAC_SHA512) + raise ArgumentException.new("Invalid TSIG algorithm") + end + @algorithm=alg + else + raise ArgumentError.new("#{alg.class} not valid type for Dnsruby::RR::TSIG#algorithm= - use String or Name") + end + Dnsruby.log.debug{"Using #{@algorithm.to_s} algorithm"} + end + + def fudge=(f) + if (f < 0 || f > 0x7FFF) + @fudge = DEFAULT_FUDGE + else + @fudge = f + end + end + + def rdata_to_string + rdatastr="" + if (@algorithm!=nil) + error = @error + error = "UNDEFINED" unless error!=nil + rdatastr = "#{@original_id} #{@time_signed} #{@algorithm.to_s(true)} #{error}"; + if (@other_size > 0 && @other_data!=nil) + rdatastr += " #{@other_data}" + end + rdatastr += " " + mac.unpack("H*").to_s + end + + return rdatastr + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + # Name needs to be added with no compression - done in Dnsruby::Message#encode + msg.put_name(@algorithm.downcase, true) + time_high = (@time_signed >> 32) + time_low = (@time_signed & 0xFFFFFFFF) + msg.put_pack('nN', time_high, time_low) + msg.put_pack('n', @fudge) + msg.put_pack('n', @mac_size) + msg.put_bytes(@mac) + msg.put_pack('n', @original_id) + msg.put_pack('n', @error) + msg.put_pack('n', @other_size) + msg.put_bytes(@other_data) + end + + def self.decode_rdata(msg) #:nodoc: all + alg=msg.get_name + time_high, time_low = msg.get_unpack("nN") + time_signed = (time_high << 32) + time_low + fudge, = msg.get_unpack("n") + mac_size, = msg.get_unpack("n") + mac = msg.get_bytes(mac_size) + original_id, = msg.get_unpack("n") + error, = msg.get_unpack("n") + other_size, = msg.get_unpack("n") + other_data = msg.get_bytes(other_size) + return self.new([alg, time_signed, fudge, mac_size, mac, original_id, error, other_size, other_data]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TXT.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TXT.rb new file mode 100644 index 000000000000..31db8ce0dd73 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/TXT.rb @@ -0,0 +1,192 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +begin + require 'jcode' +rescue LoadError => _e +end +module Dnsruby + class RR + # Class for DNS Text (TXT) resource records. + # RFC 1035 Section 3.3.14 + class TXT < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::TXT #:nodoc: all + + # List of the individual elements + attr_accessor :strings + + def data + @strings.join + end + + def from_data(data) + @strings = data + end + + def from_hash(hash) + if (hash.has_key?:strings) + from_string(hash[:strings]) + end + end + + ESCAPE_CHARS = {"b" => 8, "t" => 9, "n" => 10, "v" => 11, "f" => 12, "r" => 13} + ESCAPE_CODES = ESCAPE_CHARS.invert + + def from_string(input) + @strings = TXT.parse(input) + end + + def TXT.parse(input) + # Need to look out for special characters. + # Need to split the input up into strings (which are defined by non-escaped " characters) + # Then need to fix up any \ escape characters (should just be " and ; and binary?) + # Sadly, it's going to be easiest just to scan through this character by character... + in_escaped = false + in_string = false + count = -1 + strings = [] + current_binary = "" + current_quote_char = '"' + unquoted = false + seen_strings = false + pos = 0 + input.sub!(/^\s*\(\s*/, "") + input.sub!(/\s*\)\s*$/, "") + input.each_char {|c| + if (((c == "'") || (c == '"')) && (!in_escaped) && (!unquoted)) + if (!in_string) + seen_strings = true + current_quote_char = c + in_string = true + count+=1 + strings[count] = "" + else + if (c == current_quote_char) + in_string = false + else + strings[count]+=c + end + end + else + if (seen_strings && !in_string) + next + end + if (pos == 0) + unquoted = true + count+=1 + strings[count] = "" + elsif (unquoted) + if (c == " ") + count+=1 + strings[count] = "" + pos += 1 + next + end + end + + if (c == "\\") + if (in_escaped) + in_escaped = false + strings[count]+=(c) + else + in_escaped = true + end + else + if (in_escaped) + # Build up the binary + if (c == ";") || (c == '"') + strings[count]+=c + in_escaped = false + elsif (ESCAPE_CHARS[c]) + in_escaped=false + strings[count]+=ESCAPE_CHARS[c].chr + elsif (c<"0" || c>"9") + in_escaped = false + strings[count]+=c + else + # Must be building up three digit string to identify binary value? +# if (c >= "0" && c <= "9") + current_binary += c +# end + if ((current_binary.length == 3) ) # || (c < "0" || c > "9")) + strings[count]+=current_binary.to_i.chr + in_escaped = false + current_binary = "" + end + end + else + strings[count]+=(c) + end + end + end + pos += 1 + } + return strings + end + + def TXT.display(str, do_escapes = true) + output = "" + # Probably need to scan through each string manually + # Make sure to remember to escape binary characters. + # Go through copying to output, and adding "\" characters as necessary? + str.each_byte {|c| + if (c == 34) || (c == 92) # || (c == 59) + if (do_escapes) + output+='\\' + end + output+=c.chr + elsif (c < 32) # c is binary + if (ESCAPE_CODES[c]) + output += c.chr + else + output+= '\\' + num = c.to_i.to_s + (3-num.length).times {|i| + num="0"+num + } + output+= num # Need a 3 digit number here. + end + + else + output += c.chr + end + } + return output + end + + def rdata_to_string + if (defined?@strings) + temp = [] + @strings.each {|str| + output = TXT.display(str) + temp.push("\"#{output}\"") + } + return temp.join(' ') + end + return '' + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_string_list(@strings) + end + + def self.decode_rdata(msg) #:nodoc: all + strings = msg.get_string_list + return self.new(strings) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/URI.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/URI.rb new file mode 100644 index 000000000000..f308d86b8f64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/URI.rb @@ -0,0 +1,57 @@ +module Dnsruby + class RR + class URI < RR + ClassValue = nil #:nodoc: all + TypeValue= Types::URI #:nodoc: all + + # The NAPTR RR order field + attr_accessor :priority + + # The NAPTR RR order field + attr_accessor :weight + + # The NAPTR RR order field + attr_accessor :target + + def from_hash(hash) #:nodoc: all + @priority = hash[:priority] + @weight = hash[:weight] + @target = hash[:target] + end + + def from_data(data) #:nodoc: all + @priority, @weight, @target = data + end + + def from_string(input) #:nodoc: all + if (input.strip.length > 0) + values = input.split(" ") + @priority = values [0].to_i + @weight = values [1].to_i + @target = values [2].gsub!("\"", "") + end + end + + def rdata_to_string #:nodoc: all + "#{@priority} #{@weight} \"#{@target}\"" + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + if (@priority != nil) + msg.put_pack('n', @priority) + msg.put_pack('n', @weight) + msg.put_bytes(@target) + end + end + + def self.decode_rdata(msg) #:nodoc: all + priority, = msg.get_unpack('n') + weight, = msg.get_unpack('n') + target = msg.get_bytes + return self.new([priority, weight, target]) + end + + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/X25.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/X25.rb new file mode 100644 index 000000000000..e15a9db4f979 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/X25.rb @@ -0,0 +1,55 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class for DNS X25 resource records. + # RFC 1183 Section 3.1 + class X25 < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::X25 #:nodoc: all + + # The PSDN address + attr_accessor :address + + def from_data(data) + @address = data + end + + def from_string(input) + address = input + address.sub!(/^\"/, "") + @address = address.sub(/\"$/, "") + end + + def rdata_to_string + if (@address!=nil) + return @address + else + return "" + end + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_string(@address) + end + + def self.decode_rdata(msg) #:nodoc: all + address = msg.get_string + return self.new(*address) + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/domain_name.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/domain_name.rb new file mode 100644 index 000000000000..c4351c626e15 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/domain_name.rb @@ -0,0 +1,60 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Abstract superclass for RR's which have a domain name in the data section. + class DomainName < RR + # The domain name in the RR data section. + attr_reader :domainname + + def set_domain_name(newname) + @domainname=Name.create(newname) + end + + alias domainname= set_domain_name + + def from_hash(hash) #:nodoc: all + set_domain_name(hash[:domainname]) + end + + def from_data(data) #:nodoc: all + @domainname = data + end + + def from_string(input) #:nodoc: all + set_domain_name(input) + end + + def rdata_to_string #:nodoc: all + return @domainname.to_s(true) + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + if !([Classes::NONE, Classes::ANY].include? klass) || @rdata.length > 0 + msg.put_name(@domainname, canonical) + end + end + + def self.decode_rdata(msg) #:nodoc: all + n = msg.get_name + if n.length == 0 + # n = nil + end + self.new(n) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/generic.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/generic.rb new file mode 100644 index 000000000000..f46b8fe71fb4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/generic.rb @@ -0,0 +1,171 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + class RR + # Class to store generic RRs (RFC 3597) + class Generic < RR # RFC 3597 + # data for the generic resource record + attr_reader :data + + def from_data(data) #:nodoc: all + @data = data[0] + end + + def rdata_to_string #:nodoc: all + if (@data!=nil) + return "\\# " + @data.length.to_s + " " + @data.unpack("H*")[0] + end + return "#NO DATA" + end + + def from_string(data) #:nodoc: all + @data = data + end + + def encode_rdata(msg, canonical=false) #:nodoc: all + msg.put_bytes(data) + end + + def self.decode_rdata(msg) #:nodoc: all + return self.new(msg.get_bytes) + end + + def self.create(type_value, class_value) #:nodoc: + c = Class.new(Generic) + # c.type = type_value + # c.klass = class_value + c.const_set(:TypeValue, type_value) + c.const_set(:ClassValue, class_value) + Generic.const_set("Type#{type_value}_Class#{class_value}", c) + ClassHash[[type_value, class_value]] = c + return c + end + end + + # -- + # Standard (class generic) RRs + # ++ + # NS RR + # Nameserver resource record + class NS < DomainName + ClassValue = nil #:nodoc: all + TypeValue = Types::NS #:nodoc: all + + alias nsdname domainname + alias nsdname= domainname= + end + + # CNAME RR + # The canonical name for an alias + class CNAME < DomainName + ClassValue = nil #:nodoc: all + TypeValue = Types::CNAME #:nodoc: all + + alias cname domainname + alias cname= domainname= + end + + # DNAME RR + class DNAME < DomainName + ClassValue = nil #:nodoc: all + TypeValue = Types::DNAME #:nodoc: all + + alias dname domainname + alias dname= domainname= + end + + # MB RR + class MB < DomainName + ClassValue = nil #:nodoc: all + TypeValue = Types::MB #:nodoc: all + alias madname domainname + alias madname= domainname= + end + + # MG RR + class MG < DomainName + ClassValue = nil #:nodoc: all + TypeValue = Types::MG #:nodoc: all + alias mgmname domainname + alias mgmname= domainname= + end + + # MR RR + class MR < DomainName + ClassValue = nil #:nodoc: all + TypeValue = Types::MR #:nodoc: all + alias newname domainname + alias newname= domainname= + end + + # PTR RR + class PTR < DomainName + ClassValue = nil #:nodoc: all + TypeValue = Types::PTR #:nodoc: all + end + + # ANY RR + # A Query type requesting any RR + class ANY < RR + ClassValue = nil #:nodoc: all + TypeValue = Types::ANY #:nodoc: all + def encode_rdata(msg, canonical=false) #:nodoc: all + return "" + end + def self.decode_rdata(msg) #:nodoc: all + return self.new([]) + end + def from_data(data) + end + end + end +end +require 'dnsruby/resource/HINFO' +require 'dnsruby/resource/MINFO' +require 'dnsruby/resource/ISDN' +require 'dnsruby/resource/MX' +require 'dnsruby/resource/NAPTR' +require 'dnsruby/resource/NSAP' +require 'dnsruby/resource/PX' +require 'dnsruby/resource/RP' +require 'dnsruby/resource/RT' +require 'dnsruby/resource/SOA' +require 'dnsruby/resource/TXT' +require 'dnsruby/resource/X25' +require 'dnsruby/resource/SPF' +require 'dnsruby/resource/CERT' +require 'dnsruby/resource/LOC' +require 'dnsruby/resource/OPT' +require 'dnsruby/resource/TSIG' +require 'dnsruby/resource/TKEY' +require 'dnsruby/resource/DNSKEY' +require 'dnsruby/resource/CDNSKEY' +require 'dnsruby/resource/RRSIG' +require 'dnsruby/resource/NSEC' +require 'dnsruby/resource/DS' +require 'dnsruby/resource/CDS' +require 'dnsruby/resource/URI' +require 'dnsruby/resource/NSEC3' +require 'dnsruby/resource/NSEC3PARAM' +require 'dnsruby/resource/DLV' +require 'dnsruby/resource/SSHFP' +require 'dnsruby/resource/IPSECKEY' +require 'dnsruby/resource/HIP' +require 'dnsruby/resource/KX' +require 'dnsruby/resource/DHCID' +require 'dnsruby/resource/GPOS' +require 'dnsruby/resource/NXT' +require 'dnsruby/resource/CAA' diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/resource.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/resource.rb new file mode 100644 index 000000000000..c00b46ce8d9e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/resource.rb @@ -0,0 +1,25 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + ClassHash = {} #:nodoc: all + + +end +require 'dnsruby/resource/RRSet' +require 'dnsruby/resource/RR' +require 'dnsruby/resource/domain_name' +require 'dnsruby/resource/generic' +require 'dnsruby/resource/IN' diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/type_bitmap.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/resource/type_bitmap.rb new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/select_thread.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/select_thread.rb new file mode 100644 index 000000000000..9124d69bf039 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/select_thread.rb @@ -0,0 +1,810 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +require 'socket' +# require 'thread' +begin + require 'fastthread' +rescue LoadError + require 'thread' +end +require 'set' +require 'singleton' +require 'dnsruby/validator_thread.rb' +module Dnsruby + class SelectThread #:nodoc: all + class SelectWakeup < RuntimeError; end + include Singleton + # This singleton class runs a continuous select loop which + # listens for responses on all of the in-use sockets. + # When a new query is sent, the thread is woken up, and + # the socket is added to the select loop (and the new timeout + # calculated). + # Note that a combination of the socket and the packet ID is + # sufficient to uniquely identify the query to the select thread. + # + # But how do we find the response queue for a particular query? + # Hash of client_id->[query, client_queue, socket] + # and socket->[client_id] + # + # @todo@ should we implement some of cancel function? + + def initialize + @@mutex = Mutex.new + @@mutex.synchronize { + @@in_select=false + # @@notifier,@@notified=IO.pipe + @@sockets = Set.new + @@timeouts = Hash.new + # @@mutex.synchronize do + @@query_hash = Hash.new + @@socket_hash = Hash.new + @@socket_is_persistent = Hash.new + @@observers = Hash.new + @@tcp_buffers=Hash.new + @@socket_remaining_queries = Hash.new + @@tick_observers = [] + @@queued_exceptions=[] + @@queued_responses=[] + @@queued_validation_responses=[] + @@wakeup_sockets = get_socket_pair + @@sockets << @@wakeup_sockets[1] + + # Suppress reverse lookups + BasicSocket.do_not_reverse_lookup = true + # end + # Now start the select thread + @@select_thread = Thread.new { do_select } + + # # Start the validator thread + # @@validator = ValidatorThread.instance + } + end + + def get_socket_pair + # Emulate socketpair on platforms which don't support it + srv = nil + begin + srv = TCPServer.new('localhost', 0) + rescue Errno::EADDRNOTAVAIL, SocketError # OSX Snow Leopard issue - need to use explicit IP + begin + srv = TCPServer.new('127.0.0.1', 0) + rescue Error # Try IPv6 + srv = TCPServer.new('::1', 0) + end + end + rsock = TCPSocket.new(srv.addr[3], srv.addr[1]) + lsock = srv.accept + srv.close + return [lsock, rsock] + end + + class QuerySettings + attr_accessor :query_bytes, :query, :ignore_truncation, :client_queue, + :client_query_id, :socket, :dest_server, :dest_port, :endtime, :udp_packet_size, + :single_resolver, :is_persistent_socket, :tcp_pipelining_max_queries + # new(query_bytes, query, ignore_truncation, client_queue, client_query_id, + # socket, dest_server, dest_port, endtime, , udp_packet_size, single_resolver) + def initialize(*args) + @query_bytes = args[0] + @query = args[1] + @ignore_truncation=args[2] + @client_queue = args[3] + @client_query_id = args[4] + @socket = args[5] + @dest_server = args[6] + @dest_port=args[7] + @endtime = args[8] + @udp_packet_size = args[9] + @single_resolver = args[10] + @is_persistent_socket = false + @tcp_pipelining_max_queries = nil + end + end + + def tcp?(socket) + type = socket.getsockopt(Socket::SOL_SOCKET, Socket::SO_TYPE) + [Socket::SOCK_STREAM].pack("i") == type.data + end + + def udp?(socket) + type = socket.getsockopt(Socket::SOL_SOCKET, Socket::SO_TYPE) + [Socket::SOCK_DGRAM].pack("i") == type.data + end + + def add_to_select(query_settings) + # Add the query to sockets, and then wake the select thread up + @@mutex.synchronize { + check_select_thread_synchronized + # @TODO@ This assumes that all client_query_ids are unique! + # Would be a good idea at least to check this... + @@query_hash[query_settings.client_query_id]=query_settings + @@socket_hash[query_settings.socket] ||= [] + @@socket_hash[query_settings.socket] << query_settings.client_query_id + @@socket_remaining_queries[query_settings.socket] ||= query_settings.tcp_pipelining_max_queries if query_settings.tcp_pipelining_max_queries != :infinite + @@timeouts[query_settings.client_query_id]=query_settings.endtime + @@sockets << query_settings.socket + @@socket_is_persistent[query_settings.socket] = query_settings.is_persistent_socket + } + begin + @@wakeup_sockets[0].send("wakeup!", 0) + rescue Exception => e + # do nothing + end + end + + def check_select_thread_synchronized + if (!@@select_thread.alive?) + Dnsruby.log.debug{"Restarting select thread"} + @@select_thread = Thread.new { + do_select + } + end + end + + def select_thread_alive? + ret=true + @@mutex.synchronize{ + ret = @@select_thread.alive? + } + return ret + end + + def do_select + unused_loop_count = 0 + last_tick_time = Time.now - 10 + while true do + if (last_tick_time < (Time.now - 0.5)) + send_tick_to_observers # ONLY NEED TO SEND THIS TWICE A SECOND - NOT EVERY SELECT!!! + last_tick_time = Time.now + end + send_queued_exceptions + send_queued_responses + send_queued_validation_responses + timeout = tick_time = 0.1 # We provide a timer service to various Dnsruby classes + sockets, timeouts, has_observer = @@mutex.synchronize { [@@sockets.to_a, @@timeouts.values, !@@observers.empty?] } + if (timeouts.length > 0) + timeouts.sort! + timeout = timeouts[0] - Time.now + if (timeout <= 0) + process_timeouts + timeout = 0 + next + end + end + ready=nil + if (has_observer && (timeout > tick_time)) + timeout = tick_time + end + # next if (timeout < 0) + begin + ready, write, errors = IO.select(sockets, nil, nil, timeout) + rescue SelectWakeup + # If SelectWakeup, then just restart this loop - the select call will be made with the new data + next + rescue IOError, EncodeError => e + # print "IO Error =: #{e}\n" + exceptions = clean_up_closed_sockets + exceptions.each { |exception| send_exception_to_client(*exception) } + + next + end + if ready && ready.include?(@@wakeup_sockets[1]) + ready.delete(@@wakeup_sockets[1]) + wakeup_msg = "loop" + begin + while wakeup_msg && wakeup_msg.length > 0 + wakeup_msg = @@wakeup_sockets[1].recv_nonblock(20) + end + rescue + # do nothing + end + end + if (ready == nil) + # process the timeouts + process_timeouts + unused_loop_count+=1 + else + process_ready(ready) + unused_loop_count=0 + # process_error(errors) + end + @@mutex.synchronize do + if (unused_loop_count > 10 && @@query_hash.empty? && @@observers.empty?) + Dnsruby.log.debug("Try stop select loop") + + non_persistent_sockets = @@sockets.select { |s| ! @@socket_is_persistent[s] } + non_persistent_sockets.each do |socket| + socket.close rescue nil + @@sockets.delete(socket) + end + + Dnsruby.log.debug("Deleted #{non_persistent_sockets.size} non-persistent sockets," + + " #{@@sockets.count} persistent sockets remain.") + @@socket_hash.clear + + if @@sockets.empty? + Dnsruby.log.debug("Stopping select loop") + return + end + end + end + # } + end + end + + # Removes closed sockets from @@sockets, and returns an array containing 1 + # exception for each closed socket contained in @@socket_hash. + def clean_up_closed_sockets + exceptions = @@mutex.synchronize do + closed_sockets_in_hash = @@sockets.select(&:closed?).select { |s| @@socket_hash[s] } + @@sockets.delete_if { | socket | socket.closed? } + closed_sockets_in_hash.each_with_object([]) do |socket, exceptions| + @@socket_hash[socket].each do | client_id | + exceptions << [SocketEofResolvError.new("TCP socket closed before all answers received"), socket, client_id] + end + end + end + end + + def process_error(errors) + Dnsruby.log.debug{"Error! #{errors.inspect}"} + # @todo@ Process errors [can we do this in single socket environment?] + end + + def get_active_ids(queries, id) + queries.keys.select { |client_query_id| client_query_id[1].header.id == id } + end + + # @@query_hash[query_settings.client_query_id]=query_settings + def process_ready(ready) + persistent_sockets, nonpersistent_sockets = @@mutex.synchronize { ready.partition { |socket| persistent?(socket) } } + + nonpersistent_sockets.each do |socket| + query_settings = @@mutex.synchronize { @@query_hash[@@socket_hash[socket][0]] } + next if !query_settings + + udp_packet_size = query_settings.udp_packet_size + msg, bytes = get_incoming_data(socket, udp_packet_size) + + process_message(msg, bytes, socket) if msg + + ready.delete(socket) + end + + persistent_sockets.each do |socket| + msg, bytes = get_incoming_data(socket, 0) + process_message(msg, bytes, socket) if msg + ready.delete(socket) + end + end + + def process_message(msg, bytes, socket) + @@mutex.synchronize do + ids = get_active_ids(@@query_hash, msg.header.id) + return if ids.empty? # should be only one + query_settings = @@query_hash[ids[0]].clone + end + + answerip = msg.answerip.downcase + answerfrom = msg.answerfrom.downcase + answeripaddr = IPAddr.new(answerip) + dest_server = IPAddr.new("0.0.0.0") + + begin + destserveripaddr = IPAddr.new(dest_server) + rescue ArgumentError + # Host name not IP address + end + + if (dest_server && (dest_server != '0.0.0.0') && + (answeripaddr != destserveripaddr) && + (answerfrom != dest_server)) + Dnsruby.log.warn("Unsolicited response received from #{answerip} instead of #{query_settings.dest_server}") + else + send_response_to_client(msg, bytes, socket) + end + end + + def send_response_to_client(msg, bytes, socket) + # Figure out which client_ids we were expecting on this socket, then see if any header ids match up + # @TODO@ Can get rid of this, as we only have one query per socket. + client_ids=[] + @@mutex.synchronize{ + client_ids = @@socket_hash[socket].clone + } + # get the queries associated with them + client_ids.each do |id| + query_header_id=nil + @@mutex.synchronize{ + query_header_id = @@query_hash[id].query.header.id + } + if (query_header_id == msg.header.id) + # process the response + client_queue = nil + res = nil + query=nil + @@mutex.synchronize{ + client_queue = @@query_hash[id].client_queue + res = @@query_hash[id].single_resolver + query = @@query_hash[id].query + } + tcp = tcp?(socket) + # At this point, we should check if the response is OK + if (ret = res.check_response(msg, bytes, query, client_queue, id, tcp)) + remove_id(id) + exception = msg.get_exception + if (ret.kind_of?TsigError) + exception = ret + end + Dnsruby.log.debug{"Pushing response to client queue"} + push_to_client(id, client_queue, msg, exception, query, res) + # client_queue.push([id, msg, exception]) + # notify_queue_observers(client_queue, id) + else + # Sending query again - don't return response + end + return + end + end + # If not, then we have an error + Dnsruby.log.error{"Stray packet - " + msg.inspect + "\n from " + socket.inspect} + print("Stray packet - " + msg.question()[0].qname.to_s + " from " + msg.answerip.to_s + ", #{client_ids.length} client_ids\n") + end + + def persistent?(socket) + @@socket_is_persistent[socket] + end + + def remove_id(id) + + @@mutex.synchronize do + socket = @@query_hash[id].socket + @@timeouts.delete(id) + @@query_hash.delete(id) + @@socket_hash[socket].delete(id) + + decrement_remaining_queries(socket) if persistent?(socket) + + if !persistent?(socket) || max_attained?(socket) + @@sockets.delete(socket) + @@socket_hash.delete(socket) + Dnsruby.log.debug("Closing socket #{socket}") + socket.close rescue nil + end + end + end + + def decrement_remaining_queries(socket) + if @@socket_remaining_queries[socket] + @@socket_remaining_queries[socket] -= 1 + end + end + + def max_attained?(socket) + remaining = @@socket_remaining_queries[socket] + attained = persistent?(socket) && remaining && remaining <= 0 + Dnsruby.log.debug("Max queries per conn attained") if attained + attained + end + + def process_timeouts + # NOTE: It's @@timeouts we need to protect; after the clone we're ok + timeouts = @@mutex.synchronize { @@timeouts.clone } + time_now = Time.now + timeouts.each do |client_id, timeout| + if timeout < time_now + send_exception_to_client(ResolvTimeout.new("Query timed out"), nil, client_id) + end + end + end + + def tcp_read(socket) + # Keep buffer for all TCP sockets, and return + # to select after reading available data. Once all data has been received, + # then process message. + buf="" + expected_length = 0 + @@mutex.synchronize { + buf, expected_length = @@tcp_buffers[socket] + if (!buf) + buf = "" + expected_length = 2 + @@tcp_buffers[socket]=[buf, expected_length] + end + } + if (buf.length() < expected_length) + begin + input, = socket.recv_nonblock(expected_length-buf.length) + if (input=="") + Dnsruby.log.debug("EOF from server - no bytes read - closing socket") + socket.close #EOF closed by server, if we were interrupted we need to resend + + exceptions = @@mutex.synchronize do + @@sockets.delete(socket) #remove ourselves from select, app will have to retry + #maybe fire an event + @@socket_hash[socket].map do | client_id | + [SocketEofResolvError.new("TCP socket closed before all answers received"), socket, client_id] + end + end + + exceptions.each { |exception| send_exception_to_client(*exception) } + + return false + end + buf << input + rescue + # Oh well - better luck next time! + return false + end + end + # If data is complete, then return it. + if (buf.length == expected_length) + if (expected_length == 2) + # We just read the data_length field. Now we need to start reading that many bytes. + @@mutex.synchronize { + answersize = buf.unpack('n')[0] + @@tcp_buffers[socket] = ["", answersize] + } + return tcp_read(socket) + else + # We just read the data - now return it + @@mutex.synchronize { + @@tcp_buffers.delete(socket) + } + return buf + end + else + @@mutex.synchronize { + @@tcp_buffers[socket]=[buf, expected_length] + } + return false + end + end + + def get_incoming_data(socket, packet_size) + answerfrom,answerip,answerport,answersize=nil + ans,buf = nil + is_tcp = tcp?(socket) + + begin + if is_tcp + # Call TCP read here - that will take care of reading the 2 byte length, + # and then the full packet - without blocking select. + buf = tcp_read(socket) + if (!buf) # Wait for the buffer to comletely fill + # handle_recvfrom_failure(socket, "") + return + end + else + # @TODO@ Can we get recvfrom to stop issuing PTR queries when we already + # know both the FQDN and the IP address? + if (ret = socket.recvfrom(packet_size)) + buf = ret[0] + answerport=ret[1][1] + answerfrom=ret[1][2] + answerip=ret[1][3] + answersize=(buf.length) + else + # recvfrom failed - why? + Dnsruby.log.error{"Error - recvfrom failed from #{socket}"} + handle_recvfrom_failure(socket, "") + return + end + end + rescue Exception => e + Dnsruby.log.error{"Error - recvfrom failed from #{socket}, exception : #{e}"} + handle_recvfrom_failure(socket, e) + return + end + Dnsruby.log.debug{";; answer from #{answerfrom} : #{answersize} bytes\n"} + + begin + ans = Message.decode(buf) + + if is_tcp + @@mutex.synchronize do + ids = get_active_ids(@@query_hash, ans.header.id) + if ids.empty? + Dnsruby.log.error("Decode error from #{answerip} but can't determine packet id") + #todo add error event? The problem is we don't have a valid id so we don't + #know which client queue to send the exception to + end + answerfrom = @@query_hash[ids[0]].dest_server + answerip = answerfrom + answerport = @@query_hash[ids[0]].dest_port + end + end + + rescue Exception => e + Dnsruby.log.error("Decode error! #{e.class}, #{e}\nfor msg (length=#{buf.length}) : #{buf}") + client_id=get_client_id_from_answerfrom(socket, answerip, answerport) + if (client_id == nil) + Dnsruby.log.error{"Decode error from #{answerip} but can't determine packet id"} + end + # We should check if the TC bit is set (if we can get that far) + if ((DecodeError === e) && (e.partial_message.header.tc)) + Dnsruby.log.error{"Decode error (from {answerip})! Header shows truncation, so trying again over TCP"} + # If it is, then we should retry over TCP + sent = false + @@mutex.synchronize{ + client_ids = @@socket_hash[socket] + # get the queries associated with them + client_ids.each do |id| + query_header_id=nil + query_header_id = @@query_hash[id].query.header.id + if (query_header_id == e.partial_message.header.id) + # process the response + client_queue = nil + res = nil + query=nil + client_queue = @@query_hash[id].client_queue + res = @@query_hash[id].single_resolver + query = @@query_hash[id].query + + # NOW RESEND OVER TCP! + Thread.new { + res.send_async(query, client_queue, id, true) + } + sent = true + end + end + } + if !sent + send_exception_to_client(e, socket, client_id) + end + + else + send_exception_to_client(e, socket, client_id) + end + return + end + + if (ans!= nil) + Dnsruby.log.debug{"#{ans}"} + ans.answerfrom=(answerfrom) + ans.answersize=(answersize) + ans.answerip =(answerip) + end + return ans, buf + end + + def handle_recvfrom_failure(socket, exception) + # No way to notify the client about this error, unless there was only one connection on the socket + # Not a problem, as there only will ever be one connection on the socket (Kaminsky attack mitigation) + ids_for_socket = [] + @@mutex.synchronize{ + ids_for_socket = @@socket_hash[socket] + } + if (ids_for_socket.length == 1) + answerfrom=nil + @@mutex.synchronize{ + query_settings = @@query_hash[ids_for_socket[0]] + answerfrom=query_settings.dest_server + } + send_exception_to_client(OtherResolvError.new("recvfrom failed from #{answerfrom}; #{exception}"), socket, ids_for_socket[0]) + else + Dnsruby.log.fatal{"Recvfrom failed from #{socket}, no way to tell query id"} + end + end + + def get_client_id_from_answerfrom(socket, answerip, answerport) + # @TODO@ Can get rid of this, as there is only one query per socket + client_id=nil + # Figure out client id from answerfrom + @@mutex.synchronize{ + ids = @@socket_hash[socket] + ids.each do |id| + # Does this id speak to this dest_server? + query_settings = @@query_hash[id] + if (answerip == query_settings.dest_server && answerport == query_settings.dest_port) + # We have a match + client_id = id + break + end + end + } + return client_id + end + + def send_exception_to_client(err, socket, client_id, msg=nil) + # find the client response queue + client_queue = nil + @@mutex.synchronize { + client_queue = @@query_hash[client_id].client_queue + } + remove_id(client_id) + # push_to_client(client_id, client_queue, msg, err) + client_queue.push([client_id, Resolver::EventType::ERROR, msg, err]) + notify_queue_observers(client_queue, client_id) + end + + def push_exception_to_select(client_id, client_queue, err, msg) + @@mutex.synchronize{ + @@queued_exceptions.push([client_id, client_queue, err, msg]) + } + # Make sure select loop is running! + if (@@select_thread && @@select_thread.alive?) + else + @@select_thread = Thread.new { + do_select + } + end + end + + def push_response_to_select(client_id, client_queue, msg, query, res) + # This needs to queue the response TO THE SELECT THREAD, which then needs + # to send it out from its normal loop. + Dnsruby.log.debug{"Pushing response to client queue direct from resolver or validator"} + @@mutex.synchronize{ + err = nil + if (msg.rcode == RCode.NXDOMAIN) + err = NXDomain.new + end + @@queued_responses.push([client_id, client_queue, msg, err, query, res]) + } + # Make sure select loop is running! + if (@@select_thread && @@select_thread.alive?) + else + @@select_thread = Thread.new { + do_select + } + end + end + + def push_validation_response_to_select(client_id, client_queue, msg, err, query, res) + # This needs to queue the response TO THE SELECT THREAD, which then needs + # to send it out from its normal loop. + Dnsruby.log.debug{"Pushing response to client queue direct from resolver or validator"} + @@mutex.synchronize{ + @@queued_validation_responses.push([client_id, client_queue, msg, err, query, res]) + } + # Make sure select loop is running! + if (@@select_thread && @@select_thread.alive?) + else + @@select_thread = Thread.new { + do_select + } + end + end + + def send_queued_exceptions + exceptions = [] + @@mutex.synchronize{ + exceptions = @@queued_exceptions + @@queued_exceptions = [] + } + + exceptions.each do |item| + client_id, client_queue, err, msg = item + # push_to_client(client_id, client_queue, msg, err) + client_queue.push([client_id, Resolver::EventType::ERROR, msg, err]) + notify_queue_observers(client_queue, client_id) + end + end + + def send_queued_responses + responses = [] + @@mutex.synchronize{ + responses = @@queued_responses + @@queued_responses = [] + } + + responses.each do |item| + client_id, client_queue, msg, err, query, res = item + # push_to_client(client_id, client_queue, msg, err) + client_queue.push([client_id, Resolver::EventType::RECEIVED, msg, err]) + notify_queue_observers(client_queue, client_id) + # Do we need to validate this? The response has come from the cache - + # validate it only if it has not been validated already + # So, if we need to validate it, send it to the validation thread + # Otherwise, send VALIDATED to the requester. + if (((msg.security_level == Message::SecurityLevel.UNCHECKED) || + (msg.security_level == Message::SecurityLevel.INDETERMINATE)) && + (ValidatorThread.requires_validation?(query, msg, err, res))) + validator = ValidatorThread.new(client_id, client_queue, msg, err, query ,self, res) + validator.run + else + PacketSender.cache(query, msg) # The validator won't cache it, so we'd better do it now + client_queue.push([client_id, Resolver::EventType::VALIDATED, msg, err]) + notify_queue_observers(client_queue, client_id) + end + end + end + + def send_queued_validation_responses + responses = [] + @@mutex.synchronize{ + responses = @@queued_validation_responses + @@queued_validation_responses = [] + } + + responses.each do |item| + client_id, client_queue, msg, err, query, res = item + # push_to_client(client_id, client_queue, msg, err) + client_queue.push([client_id, Resolver::EventType::VALIDATED, msg, err]) + notify_queue_observers(client_queue, client_id) + end + end + + def push_to_client(client_id, client_queue, msg, err, query, res) + # @TODO@ Really need to let the client know that we have received a valid response! + # Can do that by calling notify_observers here, but with an identifier which + # defines the response to be a "Response received - validating. Please stop sending" + # type of response. + client_queue.push([client_id, Resolver::EventType::RECEIVED, msg, err]) + notify_queue_observers(client_queue, client_id) + + if (!err || (err.instance_of?(NXDomain))) + # + # This method now needs to push the response to the validator, + # which will then take responsibility for delivering it to the client. + # The validator will need access to the queue observers - + validator = ValidatorThread.new(client_id, client_queue, msg, err, query ,self, res) + validator.run + # @@validator.add_to_queue([client_id, client_queue, msg, err, query, self, res]) + end + end + + def add_observer(client_queue, observer) + @@mutex.synchronize { + @@observers[client_queue]=observer + check_select_thread_synchronized # Is this really necessary? The client should start the thread by sending a query, really... + if (!@@tick_observers.include?observer) + @@tick_observers.push(observer) + end + } + end + + def remove_observer(client_queue, observer) + @@mutex.synchronize { + if (@@observers[client_queue]==observer) + # @@observers.delete(observer) + @@observers.delete(client_queue) + else + if (@@observers[client_queue] == nil) + end + Dnsruby.log.error{"remove_observer called with wrong observer for queue"} + raise ArgumentError.new("remove_observer called with wrong observer for queue") + end + if (!@@observers.values.include?observer) + @@tick_observers.delete(observer) + end + } + end + + def notify_queue_observers(client_queue, client_query_id) + # If any observers are known for this query queue then notify them + observer=nil + @@mutex.synchronize { + observer = @@observers[client_queue] + } + if (observer) + observer.handle_queue_event(client_queue, client_query_id) + end + end + + def send_tick_to_observers + # If any observers are known then send them a tick + tick_observers=nil + @@mutex.synchronize { + tick_observers = @@tick_observers + } + tick_observers.each do |observer| + observer.tick + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/single_resolver.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/single_resolver.rb new file mode 100644 index 000000000000..9728d8130f90 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/single_resolver.rb @@ -0,0 +1,177 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + + # == Dnsruby::SingleResolver + # + # This class has been deprecated. + # This implementation exists for legacy clients. New code should use the Dnsruby::Resolver class. + # The SingleResolver class targets a single resolver, and controls the sending of a single + # packet with a packet timeout. It performs no retries. Only two threads are used - the client + # thread and a select thread (which is reused across all queries). + # + # == Methods + # + # === Synchronous + # These methods raise an exception or return a response message with rcode==NOERROR + # + # * Dnsruby::SingleResolver#send_message(msg [, use_tcp])) + # * Dnsruby::SingleResolver#query(name [, type [, klass]]) + # + # === Asynchronous + # These methods use a response queue to return the response and the error to the client. + # Support for EventMachine has been deprecated + # + # * Dnsruby::SingleResolver#send_async(...) + # + class SingleResolver < Resolver + # Can take a hash with the following optional keys : + # + # * :server + # * :port + # * :use_tcp + # * :no_tcp + # * :ignore_truncation + # * :src_address + # * :src_address6 + # * :src_port + # * :udp_size + # * :persistent_tcp + # * :persistent_udp + # * :tsig + # * :packet_timeout + # * :recurse + def initialize(*args) + arg=args[0] + @single_res_mutex = Mutex.new + @packet_timeout = Resolver::DefaultPacketTimeout + @query_timeout = @packet_timeout + @port = Resolver::DefaultPort + @udp_size = Resolver::DefaultUDPSize + @dnssec = Resolver::DefaultDnssec + @use_tcp = false + @no_tcp = false + @tsig = nil + @ignore_truncation = false + @src_address = nil + @src_address6 = nil + @src_port = [0] + @recurse = true + @persistent_udp = false + @persistent_tcp = false + @retry_times = 1 + @retry_delay = 0 + @single_resolvers = [] + @configured = false + @do_caching = true + @config = Config.new + + if (arg==nil) + # Get default config + @config = Config.new + @config.get_ready + @server = @config.nameserver[0] + elsif (arg.kind_of?String) + @config.get_ready + @configured= true + @config.nameserver=[arg] + @server = @config.nameserver[0] + # @server=arg + elsif (arg.kind_of?Name) + @config.get_ready + @configured= true + @config.nameserver=arg + @server = @config.nameserver[0] + # @server=arg + elsif (arg.kind_of?Hash) + arg.keys.each do |attr| + if (attr == :server) + @config.get_ready + @configured= true + @config.nameserver=[arg[attr]] + @server = @config.nameserver[0] + + else + begin + send(attr.to_s+"=", arg[attr]) + rescue Exception + Dnsruby.log.error{"Argument #{attr} not valid\n"} + end + end + end + end + + isr = PacketSender.new({:server=>@server, :port=>@port, :dnssec=>@dnssec, + :use_tcp=>@use_tcp, :no_tcp=>@no_tcp, :packet_timeout=>@packet_timeout, + :tsig => @tsig, :ignore_truncation=>@ignore_truncation, + :src_address=>@src_address, :src_address6=>@src_address6, :src_port=>@src_port, + :recurse=>@recurse, :udp_size=>@udp_size}) + + @single_resolvers = [isr] + + # ResolverRegister::register_single_resolver(self) + end + + def server=(s) + if (!@configured) + @config.get_ready + end + @server = Config.resolve_server(s).to_s + isr = PacketSender.new({:server=>@server, :dnssec=>@dnssec, + :use_tcp=>@use_tcp, :no_tcp=>@no_tcp, :packet_timeout=>@packet_timeout, + :tsig => @tsig, :ignore_truncation=>@ignore_truncation, + :src_address=>@src_address, :src_address6=>@src_address6, :src_port=>@src_port, + :recurse=>@recurse, :udp_size=>@udp_size}) + + @single_res_mutex.synchronize { + @single_resolvers = [isr] + } + end + + def server + # @single_res_mutex.synchronize { + if (!@configured) + @config.get_ready + add_config_nameservers + end + return @single_resolvers[0].server + # } + end + + def retry_times=(n) # :nodoc: + raise NoMethodError.new("SingleResolver does not have retry_times") + end + def retry_delay=(n) # :nodoc: + raise NoMethodError.new("SingleResolver does not have retry_delay") + end + + def packet_timeout=(t) + @packet_timeout = t + @query_timeout = t + end + + # Add the appropriate EDNS OPT RR for the specified packet. This is done + # automatically, unless you are using Resolver#send_plain_message + def add_opt_rr(m) + @single_res_mutex.synchronize { + @single_resolvers[0].add_opt_rr(m) + } + end + + alias :query_timeout :packet_timeout + alias :query_timeout= :packet_timeout= + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/single_verifier.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/single_verifier.rb new file mode 100644 index 000000000000..4b33ea1e2117 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/single_verifier.rb @@ -0,0 +1,1390 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + + +# This class does verification/validation from a single point - signed root, +# DLV, trust anchors. Dnssec controls a set of these to perform validation for +# the client. +# This class should only be used by Dnsruby +module Dnsruby + class SingleVerifier # :nodoc: all + class VerifierType + ROOT = 0 + ANCHOR = 1 + DLV = 2 + end + def initialize(vtype) + @verifier_type = vtype + @added_dlv_key = false + # The DNSKEY RRs for the signed root (when it exists) + @root_anchors = KeyCache.new + + # The set of trust anchors. + # If the root is unsigned, then these must be initialised with at least + # one trusted key by the client application, if verification is to be performed. + @trust_anchors = KeyCache.new + + @dlv_registries = [] + + # The set of keys which are trusted. + @trusted_keys = KeyCache.new + + # The set of keys which have been indicated by a DS RRSet which has been + # signed by a trusted key. Although we have not yet located these keys, we + # have the details (tag and digest) which can identify the keys when we + # see them. At that point, they will be added to our trusted keys. + @discovered_ds_store = [] + # The configured_ds_store is the set of DS records which have been configured + # by the client as trust anchors. Use Dnssec#add_trust_anchor to add these + @configured_ds_store = [] + end + + def set_hints(hints) + @@hints = hints + end + + def get_recursor + if (!defined?@@recursor) + if (defined?@@hints) + Recursor.set_hints(@@hints, Resolver.new) + @@recursor = Recursor.new() + else + @@recursor = Recursor.new + end + end + @@recursor.dnssec = true + return @@recursor + end + + def get_dlv_resolver # :nodoc: + # if (Dnssec.do_validation_with_recursor?) + # return Recursor.new + # else + resolver = nil + if (Dnssec.default_resolver) + resolver = Dnssec.default_resolver + else + resolver = Resolver.new + end + # end + resolver.dnssec = true + return resolver + end + def add_dlv_key(key) + # Is this a ZSK or a KSK? + # If it is a KSK, then get the ZSK from the zone + if (key.sep_key?) + get_dlv_key(key) + end + end + def get_dlv_key(ksk) # :nodoc: + # Using the KSK, get the ZSK for the DLV registry + if (!@res && (@verifier_type == VerifierType::DLV)) + @res = get_dlv_resolver + end + # print "Sending query : res.dnssec = #{@res.dnssec}" + ret = nil + begin + ret = @res.query_no_validation_or_recursion("dlv.isc.org.", Types.DNSKEY) + if (!ret) + raise ResolvError.new("Couldn't get response from Recursor") + end + rescue ResolvError => e + # print "ERROR - Couldn't find the DLV key\n" + TheLog.error("Couldn't find the DLV key\n") + return + end + key_rrset = ret.answer.rrset("dlv.isc.org", Types.DNSKEY) + begin + verify(key_rrset, ksk) + add_trusted_key(key_rrset) + # print "Successfully added DLV key\n" + TheLog.info("Successfully added DLV key") + @added_dlv_key = true + rescue VerifyError => e + # print "Error verifying DLV key : #{e}\n" + TheLog.error("Error verifying DLV key : #{e}") + end + end + def add_trust_anchor(t) + add_trust_anchor_with_expiration(t, Time.utc(2035,"jan",1,20,15,1).to_i) + end + # Add the + def add_trust_anchor_with_expiration(k, expiration) + if (k.type == Types.DNSKEY) + # k.flags = k.flags | RR::IN::DNSKEY::SEP_KEY + @trust_anchors.add_key_with_expiration(k, expiration) + # print "Adding trust anchor for #{k.name}\n" + TheLog.info("Adding trust anchor for #{k.name}") + elsif ((k.type == Types.DS) || ((k.type == Types.DLV) && (@verifier_type == VerifierType::DLV))) + @configured_ds_store.push(k) + end + end + + def remove_trust_anchor(t) + @trust_anchors.delete(t) + end + # Wipes the cache of trusted keys + def clear_trust_anchors + @trust_anchors = KeyCache.new + end + + def trust_anchors + return @trust_anchors.keys + @configured_ds_store + end + + # Check that the RRSet and RRSIG record are compatible + def check_rr_data(rrset, sigrec)#:nodoc: all + # Each RR MUST have the same owner name as the RRSIG RR; + if (rrset.name.canonical != sigrec.name.canonical) + raise VerifyError.new("RRSET should have same owner name as RRSIG for verification (rrsert=#{rrset.name}, sigrec=#{sigrec.name}") + end + + # Each RR MUST have the same class as the RRSIG RR; + if (rrset.klass != sigrec.klass) + raise VerifyError.new("RRSET should have same DNS class as RRSIG for verification") + end + + # Each RR in the RRset MUST have the RR type listed in the + # RRSIG RR's Type Covered field; + if (rrset.type != sigrec.type_covered) + raise VerifyError.new("RRSET should have same type as RRSIG for verification") + end + + # #Each RR in the RRset MUST have the TTL listed in the + # #RRSIG Original TTL Field; + # if (rrset.ttl != sigrec.original_ttl) + # raise VerifyError.new("RRSET should have same ttl as RRSIG original_ttl for verification (should be #{sigrec.original_ttl} but was #{rrset.ttl}") + # end + + # Now check that we are in the validity period for the RRSIG + now = Time.now.to_i + if ((sigrec.expiration < now) || (sigrec.inception > now)) + raise VerifyError.new("Signature record not in validity period") + end + end + + # Add the specified keys to the trusted key cache. + # k can be a KeyCache, or an RRSet of DNSKEYs. + def add_trusted_key(k) + @trusted_keys.add(k) + end + + def add_root_ds(ds) + @configured_ds_store.push(ds) + end + + # Wipes the cache of trusted keys + def clear_trusted_keys + @trusted_keys = KeyCache.new + @res = nil + @discovered_ds_store = [] + @configured_ds_store = [] + end + + def trusted_keys + discovered_ds = [] + @discovered_ds_store.each {|rrset| + rrset.rrs.each {|rr| + discovered_ds.push(rr) + } + } + return @trusted_keys.keys + @configured_ds_store + discovered_ds + end + + # Check that the key fits a signed DS record key details + # If so, then add the key to the trusted keys + def check_ds(key, ds_rrset)#:nodoc: all + expiration = 0 + found = false + ds_rrset.sigs.each { |sig| + if ((sig.type_covered == Types.DS) || ((sig.type_covered == Types.DLV)&& (@verifier_type==VerifierType::DLV))) + if (sig.inception <= Time.now.to_i) + # Check sig.expiration, sig.algorithm + if (sig.expiration > expiration) + expiration = sig.expiration + end + end + end + } + if (expiration > 0) + ds_rrset.rrs.each { |ds| + if ((ds.type === Types.DS) || ((ds.type == Types.DLV) && (@verifier_type == VerifierType::DLV))) + if (ds.check_key(key)) + @trusted_keys.add_key_with_expiration(key, expiration) + found = true + end + end + } + end + return found + end + + # Verify the specified message (or RRSet) using the set of trusted keys. + # If keys is a DNSKEY, or an Array or RRSet of DNSKEYs, then keys + # is added to the set of trusted keys before the message (or RRSet) is + # verified. + # + # If msg is a Dnsruby::Message, then any signed DNSKEY or DS RRSets are + # processed first, and any new keys are added to the trusted key set + # before the other RRSets are checked. + # + # msg can be a Dnsruby::Message or Dnsruby::RRSet. + # keys may be nil, or a KeyCache or an RRSet of Dnsruby::RR::DNSKEY + # + # Returns true if the message verifies OK, and false otherwise. + def verify(msg, keys = nil) + if (msg.kind_of?RRSet) + if (msg.type == Types.DNSKEY) + return verify_key_rrset(msg, keys) + end + if ((msg.type == Types.DS) || (msg.type == Types.DLV)) + return verify_ds_rrset(msg, keys) + + end + return verify_rrset(msg, keys) + end + # Use the set of trusted keys to check any RRSets we can, ideally + # those of other DNSKEY RRSets first. Then, see if we can use any of the + # new total set of keys to check the rest of the rrsets. + # Return true if we can verify the whole message. + + msg.each_section do |section| + # print "Checking section : #{section}\n" + ds_rrsets = section.rrsets(Types.DS) + if ((!ds_rrsets || ds_rrsets.length == 0) && (@verifier_type == VerifierType::DLV)) + ds_rrsets = section.rrsets(Types.DLV) + end + ds_rrsets.each {|ds_rrset| + if ((ds_rrset && ds_rrset.rrs.length > 0) && !verify_ds_rrset(ds_rrset, keys, msg)) + raise VerifyError.new("Failed to verify DS RRSet") + # return false + end + } + + key_rrsets = section.rrsets(Types.DNSKEY) + key_rrsets.each {|key_rrset| + if ((key_rrset && key_rrset.rrs.length > 0) && !verify_key_rrset(key_rrset, keys)) + raise VerifyError.new("Failed to verify DNSKEY RRSet") + # return false + end + } + end + + verify_nsecs(msg) + + # Then, look through all the remaining RRSets, and verify them all (unless not necessary). + msg.section_rrsets.each do |section, rrsets| + rrsets.each do |rrset| + # If delegation NS or glue AAAA/A, then don't expect RRSIG. + # Otherwise, expect RRSIG and fail verification if RRSIG is not present + + if ((section == "authority") && (rrset.type == Types.NS)) + # Check for delegation + dsrrset = msg.authority.rrsets('DS')[0] + if ((msg.answer.size == 0) && (!dsrrset) && (rrset.type == Types.NS)) # (isDelegation) + # Now check NSEC(3) records for absence of DS and SOA + nsec = msg.authority.rrsets('NSEC')[0] + if (!nsec || (nsec.length == 0)) + nsec = msg.authority.rrsets('NSEC3')[0] + end + if (nsec && (nsec.rrs.length > 0)) + if (!(nsec.rrs()[0].types.include?'DS') || !(nsec.rrs()[0].types.include?'SOA')) + next # delegation which we expect to be unsigned - so don't verify it! + end + end + end + # If NS records delegate the name to the child's nameservers, then they MUST NOT be signed + if (rrset.type == Types.NS) + # all_delegate = true + # rrset.rrs.each {|rr| + # name = Name.create(rr.nsdname) + # name.absolute = true + # if (!(name.subdomain_of?(rr.name))) + # all_delegate = false + # end + # } + # if (all_delegate && rrset.sigs.length == 0) + # next + # end + if ((rrset.name.canonical == msg.question()[0].qname.canonical) && (rrset.sigs.length == 0)) + next + end + end + end + + if (section == "additional") + # check for glue + # if the ownername (in the addtional section) of the glue address is the same or longer as the ownername of the NS record, it is glue + if (msg.additional.size > 0) + arec = msg.additional.rrsets('A')[0] + if (!arec || arec.rrs.length == 0) + arec = msg.additional.rrsets('AAAA')[0] + end + ns_rrsets = msg.additional.rrsets('NS') + ns_rrsets.each {|ns_rrset| + if (ns_rrset.length > 0) + nsname = ns_rrset.rrs()[0].name + if (arec && arec.rrs().length > 0) + aname = arec.rrs()[0].name + if (nsname.subdomain_of?aname) + next + end + end + end + } + end + end + # If records are in additional, and no RRSIG, that's Ok - just don't use them! + if ((section == "additional") && (rrset.sigs.length == 0)) + # @TODO@ Make sure that we don't cache these records! + next + end + # else verify RRSet + # print "About to verify #{rrset.name}, #{rrset.type}\n" + if (!verify_rrset(rrset, keys)) + # print "FAILED TO VERIFY RRSET #{rrset.name}, #{rrset.type}\n" + TheLog.debug("Failed to verify rrset") + return false + end + end + end + return true + end + + def verify_nsecs(msg) # :nodoc: + # NSEC(3) handling. Get NSEC(3)s in four cases : (RFC 4035, section 3.1.3) + # a) No data - <SNAME, SCLASS> matches, but no <SNAME, SCLASS, STYPE) (§3.1.3.1) + # - will expect NSEC in Authority (and associated RRSIG) + # - NOERROR returned + # b) Name error - no RRSets that match <SNAME, SCLASS> either exactly or through wildcard expansion (§3.1.3.2) + # - NSEC wil prove i) no exact match for <SNAME, SCLASS>, and ii) no RRSets that could match through wildcard expansion + # - this may be proved in one or more NSECs (and associated RRSIGs) + # - NXDOMAIN returned - should ensure we verify! + # c) Wildcard answer - No <SNAME, SCLASS> direct matches, but matches <SNAME, SCLASS, STYPE> through wildcard expansion (§3.1.3.3) + # - Answer section must include wildcard-expanded answer (and associated RRSIGs) + # - label count in answer RRSIG indicates wildcard RRSet was expanded (less labels than in owner name) + # - Authority section must include NSEC (and RRSIGs) proving that zone does not contain a closer match + # - NOERROR returned + # d) Wildcard no data - No <SNAME, SCLASS> direct. <SNAME, SCLASS> yes but <SNAME, SCLASS, STYPE> no through wildcard expansion (§3.1.3.4) + # - Authority section contains NSECs (and RRSIGs) for : + # i) NSEC proving no RRSets matching STYPE at wildcard owner name that matched <SNAME, SCLASS> via wildcard expansion + # ii) NSEC proving no RRSets in zone that would have been closer match for <SNAME, SCLASS> + # - this may be proved by one or more NSECs (and associated RRSIGs) + # - NOERROR returned + # + # Otherwise no NSECs should be returned. + + # So, check for NSEC records in response, and work out what type of answer we have. + # Then, if NSECs are present, make sure that we prove what they said they would. + # What if the message *should* have no NSEC records? That can only be known by the validator. + # We will assume that the validator has checked the (non)-existence of NSEC records - we should not + # get upset if there aren't any. However, if there are, then we should verify that they say the right thing + qtype = msg.question()[0].qtype + return if (msg.rcode == RCode.NOERROR && ((qtype == Types.ANY) || (qtype == Types.NSEC) || (qtype == Types.NSEC3))) + if ((msg.rrsets('NSEC').length > 0) || (msg.rrsets('NSEC3').length > 0)) + if (msg.rcode == RCode.NXDOMAIN) + # print "Checking NSECs for Name Error\n" + # Name error - NSEC wil prove i) no exact match for <SNAME, SCLASS>, and ii) no RRSets that could match through wildcard expansion + # - this may be proved in one or more NSECs (and associated RRSIGs) + check_name_in_nsecs(msg) + return check_no_wildcard_expansion(msg) + elsif (msg.rcode == RCode.NOERROR) + if (msg.answer.length > 0) + # print "Checking NSECs for wildcard expansion\n" + # wildcard expansion answer - check NSECs! + # We want to make sure that the NSEC tells us that there is no closer match for this name + # @TODO@ We need to make replace the RRSIG name with the wildcard name before we can verify it correctly. + check_num_rrsig_labels(msg) + return check_name_in_nsecs(msg, msg.question()[0].qtype, true) + else + # Either no data or wildcard no data - check to see which + # Should be able to tell this by checking the number of labels in the NSEC records. + # Sort these two last cases out! + isWildcardNoData = false + [msg.authority.rrsets('NSEC'), msg.authority.rrsets('NSEC3')].each {|nsec_rrsets| + nsec_rrsets.each {|nsec_rrset| + nsec_rrset.rrs.each {|nsec| + # print "Checking nsec to see if wildcard : #{nsec}\n" + if (nsec.name.wild? ||(nsec.name.labels.length < msg.question()[0].qname.labels.length)) + isWildcardNoData = true + end + } + } + } + + if (isWildcardNoData) + # print "Checking NSECs for wildcard no data\n" + # Check NSECs - + # i) NSEC proving no RRSets matching STYPE at wildcard owner name that matched <SNAME, SCLASS> via wildcard expansion + check_name_not_in_wildcard_nsecs(msg) + # ii) NSEC proving no RRSets in zone that would have been closer match for <SNAME, SCLASS> + return check_name_in_and_type_not_in_nsecs(msg) + else # (isNoData) + # print "Checking NSECs for No data\n" + # Check NSEC types covered to make sure this type not present. + return check_name_in_and_type_not_in_nsecs(msg) + end + end + else + # Anything we should do here? + end + end + + end + + def check_num_rrsig_labels(msg) # :nodoc: + # Check that the number of labels in the RRSIG is less than the number + # of labels in the answer name + answer_rrset = msg.answer.rrset(msg.question()[0].qname, msg.question()[0].qtype) + if (answer_rrset.length == 0) + raise VerifyError.new("Expected wildcard expanded answer for #{msg.question()[0].qname}") + end + rrsig = answer_rrset.sigs()[0] + if (rrsig.labels >= msg.question()[0].qname.labels.length) + raise VerifyError.new("RRSIG does not prove wildcard expansion for #{msg.question()[0].qname}") + end + end + + def check_no_wildcard_expansion(msg) # :nodoc: + # @TODO@ Do this for NSEC3 records!!! + proven_no_wildcards = false + name = msg.question()[0].qname + [msg.authority.rrsets('NSEC'), msg.authority.rrsets('NSEC3')].each {|nsec_rrsets| + nsec_rrsets.each {|nsecs| + nsecs.rrs.each {|nsec| + # print "Checking NSEC : #{nsec}\n" + next if (nsec.name.wild?) + if (check_record_proves_no_wildcard(msg, nsec)) + proven_no_wildcards = true + end + } + } + } + if (!proven_no_wildcards) + # print "No proof that no RRSets could match through wildcard expansion\n" + raise VerifyError.new("No proof that no RRSets could match through wildcard expansion") + end + + end + + def check_record_proves_no_wildcard(msg, nsec) # :nodoc: + # Check that the NSEC goes from the SOA to a zone canonically after a wildcard + # print "Checking wildcard proof for #{nsec.name}\n" + soa_rrset = msg.authority.rrset(nsec.name, 'SOA') + if (soa_rrset.length > 0) + # print "Found SOA for #{nsec.name}\n" + wildcard_name = Name.create("*." + nsec.name.to_s) + # print "Checking #{wildcard_name}\n" + if (wildcard_name.canonically_before(nsec.next_domain)) + return true + end + end + return false + end + + def check_name_in_nsecs(msg, qtype=nil, expected_qtype = false) # :nodoc: + # Check these NSECs to make sure that this name cannot be in the zone + # and that no RRSets could match through wildcard expansion + # @TODO@ Get this right for NSEC3 too! + name = msg.question()[0].qname + proven_name_in_nsecs = false + type_covered_checked = false + [msg.authority.rrsets('NSEC'), msg.authority.rrsets('NSEC3')].each {|nsec_rrsets| + nsec_rrsets.each {|nsecs| + nsecs.rrs.each {|nsec| + # print "Checking NSEC : #{nsec}\n" + next if (nsec.name.wild?) + if nsec.check_name_in_range(name) + proven_name_in_nsecs = true + qtype_present = false + if (qtype) + if (nsec.types.include?qtype) + qtype_present = true + end + if (qtype_present != expected_qtype) + # print "#{nsec.type} record #{nsec} does #{expected_qtype ? 'not ' : ''} include #{qtype} type\n" + raise VerifyError.new("#{nsec.type} record #{nsec} does #{expected_qtype ? 'not ' : ''}include #{qtype} type") + # return false + end + type_covered_checked = true + end + end + } + } + } + if (!proven_name_in_nsecs) + # print "No proof for non-existence for #{name}\n" + raise VerifyError.new("No proof for non-existence for #{name}") + end + if (qtype && !type_covered_checked) + # print "Tyes covered wrong for #{name}\n" + raise VerifyError.new("Types covered wrong for #{name}") + end + end + + def check_name_in_and_type_not_in_nsecs(msg) # :nodoc: + check_name_in_nsecs(msg, msg.question()[0].qtype, false) + end + + def check_name_not_in_wildcard_nsecs(msg) # :nodoc: + # @TODO@ Do this for NSEC3 records too! + name = msg.question()[0].qname + qtype = msg.question()[0].qtype + done= false + [msg.authority.rrsets('NSEC'), msg.authority.rrsets('NSEC3')].each {|nsec_rrsets| + nsec_rrsets.each {|nsecs| + nsecs.rrs.each {|nsec| + # print "Checking NSEC : #{nsec}\n" + next if !nsec.name.wild? + # Check the wildcard expansion + # We want to see that the name is in the wildcard range, and that the type + # is not in the types for the NSEC + if nsec.check_name_in_wildcard_range(name) + # print "Wildcard expansion in #{nsec} includes #{name}\n" + raise VerifyError.new("Wildcard expansion in #{nsec} includes #{name}") + # return false + end + if (nsec.types.include?qtype) + # print "#{qtype} present in wildcard #{nsec}\n" + raise VerifyError.new("#{qtype} present in wildcard #{nsec}") + # return false + end + done = true + } + } + } + return if done + # print("Expected wildcard expansion in #{msg}\n") + raise VerifyError.new("Expected wildcard expansion in #{msg}") + # return false + end + + def verify_ds_rrset(ds_rrset, keys = nil, msg = nil) # :nodoc: + # print "verify_ds_rrset #{ds_rrset}\n" + if (ds_rrset && ds_rrset.num_sigs > 0) + if (verify_rrset(ds_rrset, keys)) + # Need to handle DS RRSets (with RRSIGs) not just DS records. + # ds_rrset.rrs.each do |ds| + # Work out which key this refers to, and add it to the trusted key store + found = false + if (msg) + msg.each_section do |section| + section.rrsets('DNSKEY').each {|rrset| + rrset.rrs.each do |rr| + if (check_ds(rr, ds_rrset)) + found = true + end + end + } + end + end + get_keys_to_check().each {|key| + if (check_ds(key, ds_rrset)) + found = true + end + } + # If we couldn't find the trusted key, then we should store the + # key tag and digest in a @@discovered_ds_store. + # Each time we see a new key (which has been signed) then we should + # check if it is sitting on the discovered_ds_store. + # If it is, then we should add it to the trusted_keys and remove the + # DS from the discovered_ds_store + if (!found) + @discovered_ds_store.push(ds_rrset) + end + # end + return true + else + return false + end + end + return false # no DS rrset to verify + end + + def verify_key_rrset(key_rrset, keys = nil) # :nodoc: + # print "verify_key_rrset\n" + verified = false + if (key_rrset && key_rrset.num_sigs > 0) + if (verify_rrset(key_rrset, keys)) + # key_rrset.rrs.each do |rr| + # print "Adding keys : " + # key_rrset.rrs.each {|rr| print "#{rr.key_tag}, "} + # print "\n" + @trusted_keys.add(key_rrset) # rr) + verified = true + end + check_ds_stores(key_rrset) + end + return verified + end + + def check_ds_stores(key_rrset) # :nodoc: + # See if the keys match any of the to_be_trusted_keys + key_rrset.rrs.each do |key| + @configured_ds_store.each do |ds| + if (ds.check_key(key)) + @trusted_keys.add_key_with_expiration(key, key_rrset.sigs()[0].expiration) + end + end + @discovered_ds_store.each do |tbtk| + # Check that the RRSet is still valid!! + # Should we get it out of the main cache? + if ((tbtk.sigs()[0].expiration < Time.now.to_i)) + @discovered_ds_store.delete(tbtk) + else + tbtk.rrs.each {|ds| + if (ds.check_key(key)) + @trusted_keys.add_key_with_expiration(key, tbtk.sigs()[0].expiration) + @discovered_ds_store.delete(tbtk) + end + } + end + end + # end + end + + end + + def get_keys_to_check # :nodoc: + keys_to_check = @trust_anchors.keys + @trusted_keys.keys + return keys_to_check + end + + # Find the first matching DNSKEY and RRSIG record in the two sets. + def get_matching_key(keys, sigrecs)#:nodoc: all + # There can be multiple signatures in the RRSet - which one should we choose? + if ((keys == nil) || (sigrecs == nil)) + return nil, nil + end + if ((RR::DNSKEY === keys) || (RR::DS === keys) || + ((RR::DLV === keys) && (@verifier_type == VerifierType::DLV))) + keys = [keys] + end + enumerator = keys + if (enumerator.class == RRSet) + enumerator = enumerator.rrs + end + enumerator.each {|key| + if ((key.revoked?)) # || (key.bad_flags?)) + next + end + + sigrecs.each {|sig| +# print "Looking at #{sig.key_tag} on sig, #{key.key_tag} on key\n" + if ((key.key_tag == sig.key_tag) && (key.algorithm == sig.algorithm)) +# print "Found key #{key.key_tag}\n" + return key, sig + end + } + } + return nil, nil + end + + # Verify the signature of an rrset encoded with the specified KeyCache + # or RRSet. If no signature is included, false is returned. + # + # Returns true if the RRSet verified, false otherwise. + def verify_rrset(rrset, keys = nil) + # print "Verify_rrset #{rrset.name}, #{rrset.type}\n" +# print "ABOUT TO VERIFY WITH #{keys == nil ? '0' : keys.length} keys\n" +# if (keys != nil) +# if (keys.length > 0) +# print "KEY TAG : #{keys[0].key_tag}\n" +# end +# end + sigrecs = rrset.sigs + if (rrset.rrs.length == 0) + raise VerifyError.new("No RRSet to verify") + end + if (rrset.num_sigs == 0) + raise VerifyError.new("No signatures in the RRSet : #{rrset.name}, #{rrset.type}") + end + sigrecs.each do |sigrec| + check_rr_data(rrset, sigrec) + end + raise ArgumentError.new("Expecting DNSKEY, DLV, DS, RRSet, Array or nil for keys : got #{keys.class} instead") if + (keys && (![Array, RR::IN::DNSKEY, RR::IN::DLV, RR::IN::DS].include?keys.class) && (keys.class != RRSet)) + + keyrec = nil + sigrec = nil + if (rrset.type == Types.DNSKEY) + if (keys && !(Array === keys) && ((keys.type == Types.DS) || ((keys.type == Types.DLV) && (@verifier_type == VerifierType::DLV)))) + rrset.rrs.each do |key| + keys.rrs.each do |ds| + if (ds.check_key(key)) + @trusted_keys.add_key_with_expiration(key, rrset.sigs()[0].expiration) + end + end + end + else + check_ds_stores(rrset) + end + end + if ((keys.nil?) || ((keys.class != Array) && ((keys.type == Types.DS) || ((keys.type == Types.DLV) && (@verifier_type == VerifierType::DLV))))) + keyrec, sigrec = get_matching_key(get_keys_to_check, sigrecs) + else + keyrec, sigrec = get_matching_key(keys, sigrecs) + end + + # return false if !keyrec + if (!keyrec) + # print "Couldn't find signing key! #{rrset.name}, #{rrset.type},\n " + raise VerifyError.new("Signing key not found") + end + + # RFC 4034 + # 3.1.8.1. Signature Calculation + + if (keyrec.sep_key? && !keyrec.zone_key?) + Dnsruby.log.error("DNSKEY with SEP flag set and Zone Key flag not set was used to verify RRSIG over RRSET - this is not allowed by RFC4034 section 2.1.1") + # return false + raise VerifyError.new("DNSKEY with SEP flag set and Zone Key flag not set") + end + + +# print "VERIFY KEY FOUND - doing verification\n" + + # Any DNS names in the RDATA field of each RR MUST be in + # canonical form; and + # The RRset MUST be sorted in canonical order. + rrset = rrset.sort_canonical + + sig_data = sigrec.sig_data + + # RR(i) = owner | type | class | TTL | RDATA length | RDATA + rrset.each do |rec| + old_ttl = rec.ttl + rec.ttl = sigrec.original_ttl + data = MessageEncoder.new { |msg| + msg.put_rr(rec, true) + }.to_s # @TODO@ worry about wildcards here? + rec.ttl = old_ttl + if (RUBY_VERSION >= "1.9") + data.force_encoding("ASCII-8BIT") + end + sig_data += data + end + + # Now calculate the signature + verified = false + if [Algorithms.RSASHA1, + Algorithms.RSASHA1_NSEC3_SHA1].include?(sigrec.algorithm) + verified = keyrec.public_key.verify(OpenSSL::Digest::SHA1.new, sigrec.signature, sig_data) + elsif (sigrec.algorithm == Algorithms.RSASHA256) + verified = keyrec.public_key.verify(OpenSSL::Digest::SHA256.new, sigrec.signature, sig_data) + elsif (sigrec.algorithm == Algorithms.RSASHA512) + verified = keyrec.public_key.verify(OpenSSL::Digest::SHA512.new, sigrec.signature, sig_data) + elsif [Algorithms.DSA, + Algorithms.DSA_NSEC3_SHA1].include?(sigrec.algorithm) + # we are ignoring T for now + # t = sigrec.signature[0] + # t = t.getbyte(0) if t.class == String + r = RR::get_num(sigrec.signature[1, 20]) + s = RR::get_num(sigrec.signature[21, 20]) + r_asn1 = OpenSSL::ASN1::Integer.new(r) + s_asn1 = OpenSSL::ASN1::Integer.new(s) + + asn1 = OpenSSL::ASN1::Sequence.new([r_asn1, s_asn1]).to_der + verified = keyrec.public_key.verify(OpenSSL::Digest::DSS1.new, asn1, sig_data) + elsif [Algorithms.ECDSAP256SHA256, Algorithms.ECDSAP384SHA384].include?(sigrec.algorithm) + byte_size = (keyrec.public_key.group.degree + 7) / 8 + sig_bytes = sigrec.signature[0..(byte_size - 1)] + sig_char = sigrec.signature[byte_size..-1] || '' + asn1 = OpenSSL::ASN1::Sequence.new([sig_bytes, sig_char].map { |int| OpenSSL::ASN1::Integer.new(OpenSSL::BN.new(int, 2)) }).to_der + + digest_obj = if sigrec.algorithm == Algorithms.ECDSAP384SHA384 + OpenSSL::Digest::SHA384.new + else + OpenSSL::Digest::SHA256.new + end + + verified = keyrec.public_key.dsa_verify_asn1(digest_obj.digest(sig_data), asn1) + else + raise RuntimeError.new("Algorithm #{sigrec.algorithm.code} unsupported by Dnsruby") + end + + if (!verified) + raise VerifyError.new("Signature failed to cryptographically verify") + end + # Sort out the TTLs - set it to the minimum valid ttl + expiration_diff = (sigrec.expiration.to_i - Time.now.to_i).abs + rrset.ttl = ([rrset.ttl, sigrec.ttl, sigrec.original_ttl, + expiration_diff].sort)[0] + # print "VERIFIED OK\n" + return true + end + + def find_closest_dlv_anchor_for(name) # :nodoc: + # To find the closest anchor, query DLV.isc.org for [a.b.c.d], then [a.b.c], [a.b], etc. + # once closest anchor found, simply run follow_chain from that anchor + + # @TODO@ REALLY NEED AGGRESSIVE NEGATIVE CACHING HERE!! + # i.e. don't look up zones which we *know* we don't have a DLV anchor for + + n = Name.create(name) + root = Name.create(".") + while (n != root) + # Try to find name in DLV, and return it if possible + dlv_rrset = query_dlv_for(n) + if (dlv_rrset) + key_rrset = get_zone_key_from_dlv_rrset(dlv_rrset, n) + return key_rrset + end + # strip the name + n = n.strip_label + end + return false + end + + def get_zone_key_from_dlv_rrset(dlv_rrset, name) # :nodoc: + # We want to return the key for the zone i.e. DS/DNSKEY for .se, NOT DLV for se.dlv.isc.org + # So, we have the DLv record. Now use it to add the zone's DNSKEYs to the trusted key set. + res = get_nameservers_for(name) + if (!res) + if (Dnssec.do_validation_with_recursor?) + res = get_recursor + else + if(Dnssec.default_resolver) + res = Dnssec.default_resolver + else + res = Resolver.new + end + end + end + res.dnssec = true + # query = Message.new(name, Types.DNSKEY) + # query.do_validation = false + ret = nil + begin + # ret = res.send_message(query) + ret = res.query_no_validation_or_recursion(name, Types.DNSKEY) + if (!ret) + raise ResolvError.new("Couldn't get DNSKEY from Recursor") + end + rescue ResolvError => e + # print "Error getting zone key from DLV RR for #{name} : #{e}\n" + TheLog.error("Error getting zone key from DLV RR for #{name} : #{e}") + return false + end + key_rrset = ret.answer.rrset(name, Types.DNSKEY) + begin + verify(key_rrset, dlv_rrset) + # Cache.add(ret) + return key_rrset + rescue VerifyError => e + # print "Can't move from DLV RR to zone DNSKEY for #{name}, error : #{e}\n" + TheLog.debug("Can't move from DLV RR to zone DNSKEY for #{name}, error : #{e}") + end + return false + end + + def query_dlv_for(name) # :nodoc: + # See if there is a record for name in dlv.isc.org + if (!@res && (@verifier_type == VerifierType::DLV)) + @res = get_dlv_resolver + end + begin + name_to_query = name.to_s+".dlv.isc.org" + # query = Message.new(name_to_query, Types.DLV) + # @res.single_resolvers()[0].prepare_for_dnssec(query) + # query.do_validation = false + ret = nil + begin + # ret = @res.send_message(query) + ret = @res.query_no_validation_or_recursion(name_to_query, Types.DLV) + if (!ret) + raise ResolvError.new("Couldn't get DLV record from Recursor") + end + rescue ResolvError => e + # print "Error getting DLV record for #{name} : #{e}\n" + TheLog.info("Error getting DLV record for #{name} : #{e}") + return nil + end + dlv_rrset = ret.answer.rrset(name_to_query,Types.DLV) + if (dlv_rrset.rrs.length > 0) + begin + verify(dlv_rrset) + # Cache.add(ret) + return dlv_rrset + rescue VerifyError => e + # print "Error verifying DLV records for #{name}, #{e}\n" + TheLog.info("Error verifying DLV records for #{name}, #{e}") + end + end + rescue NXDomain + # print "NXDomain for DLV lookup for #{name}\n" + return nil + end + return nil + end + + def find_closest_anchor_for(name) # :nodoc: + # Check if we have an anchor for name. + # If not, strip off first label and try again + # If we get to root, then return false + name = "." if name == "" + n = Name.create(name) + root = Name.create(".") + while (true) # n != root) + # Try the trusted keys first, then the DS set + (@trust_anchors.keys + @trusted_keys.keys + @configured_ds_store + @discovered_ds_store).each {|key| + return key if key.name.canonical == n.canonical + } + break if (n.to_s == root.to_s) + # strip the name + n = n.strip_label + end + return false + end + + # @TODO@ Handle REVOKED keys! (RFC 5011) + # Remember that revoked keys will have a different key_tag than pre-revoked. + # So, if we see a revoked key, we should go through our key store for + # that authority and remove any keys with the pre-revoked key_tag. + + def follow_chain(anchor, name) # :nodoc: + # Follow the chain from the anchor to name, returning the appropriate + # key at the end, or false. + # + # i.e. anchor = se, name = foo.example.se + # get anchor for example.se with se anchor + # get anchor for foo.example.se with example.se anchor + next_key = anchor + next_step = anchor.name + parent = next_step + # print "Follow chain from #{anchor.name} to #{name}\n" + TheLog.debug("Follow chain from #{anchor.name} to #{name}") + + # res = nil + res = Dnssec.default_resolver + # while ((next_step != name) || (next_key.type != Types.DNSKEY)) + while (true) + # print "In loop for parent=#{parent}, next step = #{next_step}\n" + dont_move_on = false + if (next_key.type != Types.DNSKEY) + dont_move_on = true + end + next_key, res = get_anchor_for(next_step, parent, next_key, res) + if (next_step.canonical.to_s == name.canonical.to_s) + # print "Returning #{next_key.type} for #{next_step}, #{(next_key.type != Types.DNSKEY)}\n" + return next_key + end + return false if (!next_key) + # Add the next label on + if (!dont_move_on) + parent = next_step + next_step = Name.new(name.labels[name.labels.length-1-next_step.labels.length,1] + + next_step.labels , name.absolute?) + # print "Next parent = #{parent}, next_step = #{next_step}, next_key.type = #{next_key.type.string}\n" + end + end + + # print "Returning #{next_key.type} for #{next_step}, #{(next_key.type != Types.DNSKEY)}\n" + + return next_key + end + + def get_anchor_for(child, parent, current_anchor, parent_res = nil) # :nodoc: + # print "Trying to discover anchor for #{child} from #{parent}\n" + TheLog.debug("Trying to discover anchor for #{child} from #{parent} using #{current_anchor}, #{parent_res}") + # We wish to return a DNSKEY which the caller can use to verify name + # We are either given a key or a ds record from the parent zone + # If given a DNSKEY, then find a DS record signed by that key for the child zone + # Use the DS record to find a valid key in the child zone + # Return it + + # Find NS RRSet for parent + child_res = nil + if (Dnssec.do_validation_with_recursor?) + parent_res = get_recursor + child_res = get_recursor + end + begin + if (child!=parent) + if (!parent_res) + # print "No res passed - try to get nameservers for #{parent}\n" + parent_res = get_nameservers_for(parent) + if (!parent_res) + if (Dnssec.do_validation_with_recursor?) + parent_res = get_recursor + else + if (Dnssec.default_resolver) + parent_res = Dnssec.default_resolver + else + parent_res = Resolver.new + end + end + end + parent_res.dnssec = true + end + # Use that Resolver to query for DS record and NS for children + ds_rrset = current_anchor + if (current_anchor.type == Types.DNSKEY) + # print "Trying to find DS records for #{child} from servers for #{parent}\n" + TheLog.debug("Trying to find DS records for #{child} from servers for #{parent}") + ds_ret = nil + begin + ds_ret = parent_res.query_no_validation_or_recursion(child, Types.DS) + if (!ds_ret) + raise ResolvError.new("Couldn't get DS records from Recursor") + end + rescue ResolvError => e + # print "Error getting DS record for #{child} : #{e}\n" + TheLog.error("Error getting DS record for #{child} : #{e}") + return false, nil + end + ds_rrset = ds_ret.answer.rrset(child, Types.DS) + if (ds_rrset.rrs.length == 0) + # @TODO@ Check NSEC(3) records - still need to verify there are REALLY no ds records! + # print "NO DS RECORDS RETURNED FOR #{parent}\n" + # child_res = parent_res + else + begin + if (verify(ds_rrset, current_anchor) || verify(ds_rrset)) + # Try to make the resolver from the authority/additional NS RRSets in DS response + if (!Dnssec.do_validation_with_recursor?) + child_res = get_nameservers_from_message(child, ds_ret) + end + end + rescue VerifyError => e + # print "FAILED TO VERIFY DS RRSET FOR #{child}\n" + TheLog.info("FAILED TO VERIFY DS RRSET FOR #{child}") + # return false, nil + # raise ResolvError.new("FAILED TO VERIFY DS RRSET FOR #{child}") + raise VerifyError.new("FAILED TO VERIFY DS RRSET FOR #{child}") + end + end + end + end + # Make Resolver using all child NSs + if (!child_res) + child_res = get_nameservers_for(child, parent_res) + end + if (!child_res) + if (Dnssec.do_validation_with_recursor?) + child_res = get_recursor + else + if (Dnssec.default_resolver) + child_res = Dnssec.default_resolver + else + if (Dnssec.default_resolver) + child_res = Dnssec.default_resolver + else + child_res = Resolver.new + end + end + child_res.dnssec = true + end + end + # Query for DNSKEY record, and verify against DS in parent. + # Need to get resolver NOT to verify this message - we verify it afterwards + # print "Trying to find DNSKEY records for #{child} from servers for #{child}\n" + TheLog.info("Trying to find DNSKEY records for #{child} from servers for #{child}") + # query = Message.new(child, Types.DNSKEY) + # query.do_validation = false + key_ret = nil + begin + # key_ret = child_res.send_message(query) + key_ret = child_res.query_no_validation_or_recursion(child, Types.DNSKEY) + if (!key_ret) + raise ResolvError.new("Couldn't get info from Recursor") + end + rescue ResolvError => e + # print "Error getting DNSKEY for #{child} : #{e}\n" + TheLog.error("Error getting DNSKEY for #{child} : #{e}") + # return false, nil + raise VerifyError.new("Error getting DNSKEY for #{child} : #{e}") + end + verified = true + key_rrset = key_ret.answer.rrset(child, Types.DNSKEY) + if (key_rrset.rrs.length == 0) + # @TODO@ Still need to check NSEC records to make *sure* no key rrs returned! + # print "NO DNSKEY RECORDS RETURNED FOR #{child}\n" + TheLog.debug("NO DNSKEY RECORDS RETURNED FOR #{child}") + # end + verified = false + else + # Should check that the matching key's zone flag is set (RFC 4035 section 5.2) + key_rrset.rrs.each {|k| + if (!k.zone_key?) + # print "Discovered DNSKEY is not a zone key - ignoring\n" + TheLog.debug("Discovered DNSKEY is not a zone key - ignoring") + return false, child_res + end + } + begin + verify(key_rrset, ds_rrset) + rescue VerifyError => e + begin + verify(key_rrset) + rescue VerifyError =>e + verified = false + raise VerifyError.new("Couldn't verify DNSKEY and DS records") + end + end + end + + # Try to make the resolver from the authority/additional NS RRSets in DNSKEY response + new_res = get_nameservers_from_message(child, key_ret) # @TODO@ ? + if (!new_res) + new_res = child_res + end + if (!verified) + TheLog.info("Failed to verify DNSKEY for #{child}") + return false, nil # new_res + # raise VerifyError.new("Failed to verify DNSKEY for #{child}") + end + # Cache.add(key_ret) + return key_rrset, new_res + rescue VerifyError => e + # print "Verification error : #{e}\n" + TheLog.info("Verification error : #{e}\n") + # return false, nil # new_res + raise VerifyError.new("Verification error : #{e}\n") + end + end + + def get_nameservers_for(name, res = nil) # :nodoc: + # @TODO@ !!! + if (Dnssec.do_validation_with_recursor?) + return get_recursor + else + resolver = nil + if (Dnssec.default_resolver) + resolver = Dnssec.default_resolver + else + resolver = Resolver.new + end + resolver.dnssec = true + return resolver + end + end + + def get_nameservers_from_message(name, ns_ret) # :nodoc: + if (Dnssec.default_resolver) + return Dnssec.default_resolver + end + + ns_rrset = ns_ret.answer.rrset(name, Types.NS) + if (!ns_rrset || ns_rrset.length == 0) + ns_rrset = ns_ret.authority.rrset(name, Types.NS) # @TODO@ Is ths OK? + end + if (!ns_rrset || ns_rrset.length == 0 || ns_rrset.name.canonical != name.canonical) + return nil + end + if (ns_rrset.sigs.length > 0) + # verify_rrset(ns_rrset) # @TODO@ ?? + end + # Cache.add(ns_ret) + ns_additional = [] + ns_ret.additional.each {|rr| ns_additional.push(rr) if (rr.type == Types.A) } + nameservers = [] + add_nameservers(ns_rrset, ns_additional, nameservers) # if (ns_additional.length > 0) + ns_additional = [] + ns_ret.additional.each {|rr| ns_additional.push(rr) if (rr.type == Types.AAAA) } + add_nameservers(ns_rrset, ns_additional, nameservers) if (ns_additional.length > 0) + # Make Resolver using all NSs + if (nameservers.length == 0) + # print "Can't find nameservers for #{ns_ret.question()[0].qname} from #{ns_rrset.rrs}\n" + TheLog.info("Can't find nameservers for #{ns_ret.question()[0].qname} from #{ns_rrset.rrs}") + return nil # @TODO@ Could return a recursor here? + # return Recursor.new + end + res = Resolver.new() + res.nameserver=(nameservers) + # Set the retry_delay to be (at least) the number of nameservers + # Otherwise, the queries will be sent at a rate of more than one a second! + res.retry_delay = nameservers.length * 2 + res.dnssec = true + return res + end + + def add_nameservers(ns_rrset, ns_additional, nameservers) # :nodoc: + # Want to go through all of the ns_rrset NS records, + # print "Checking #{ns_rrset.rrs.length} NS records against #{ns_additional.length} address records\n" + ns_rrset.rrs.sort_by {rand}.each {|ns_rr| + # and see if we can find any of the names in the A/AAAA records in ns_additional + found_addr = false + ns_additional.each {|addr_rr| + if (ns_rr.nsdname.canonical == addr_rr.name.canonical) + # print "Found address #{addr_rr.address} for #{ns_rr.nsdname}\n" + nameservers.push(addr_rr.address.to_s) + found_addr = true + break + # If we can, then we add the server A/AAAA address to nameservers + end + # If we can't, then we add the server NS name to nameservers + + } + if (!found_addr) + # print "Couldn't find address - adding #{ns_rr.nsdname}\n" + nameservers.push(ns_rr.nsdname) + end + + } + end + + def validate_no_rrsigs(msg) # :nodoc: + # print "Validating unsigned response\n" + # WHAT IF THERE ARE NO RRSIGS IN MSG? + # Then we need to check that we do not expect any RRSIGs + if (!msg.question()[0] && msg.answer.length == 0) + # print "Returning Message insecure OK\n" + msg.security_level = Message::SecurityLevel.INSECURE + return true + end + qname = msg.question()[0].qname + closest_anchor = find_closest_anchor_for(qname) + # print "Found closest anchor :#{closest_anchor}\n" + if (closest_anchor) + actual_anchor = follow_chain(closest_anchor, qname) + # print "Actual anchor : #{actual_anchor}\n" + if (actual_anchor) + # print("Anchor exists for #{qname}, but no signatures in #{msg}\n") + TheLog.error("Anchor exists for #{qname}, but no signatures in #{msg}") + msg.security_level = Message::SecurityLevel.BOGUS + return false + end + end + if ((@verifier_type == VerifierType::DLV) && + @added_dlv_key) + # Remember to check DLV registry as well (if appropriate!) + # print "Checking DLV for closest anchor\n" + dlv_anchor = find_closest_dlv_anchor_for(qname) + # print "Found DLV closest anchor :#{dlv_anchor}\n" + if (dlv_anchor) + actual_anchor = follow_chain(dlv_anchor, qname) + # print "Actual anchor : #{actual_anchor}\n" + if (actual_anchor) + # print("DLV Anchor exists for #{qname}, but no signatures in #{msg}\n") + TheLog.error("DLV Anchor exists for #{qname}, but no signatures in #{msg}") + msg.security_level = Message::SecurityLevel.BOGUS + return false + end + + end + end + # print "Returning Message insecure OK\n" + msg.security_level = Message::SecurityLevel.INSECURE + return true + end + + def validate(msg, query) + if (msg.rrsets('RRSIG').length == 0) + return validate_no_rrsigs(msg) + end + + # See if it is a child of any of our trust anchors. + # If it is, then see if we have a trusted key for it + # If we don't, then see if we can get to it from the closest + # trust anchor + # Otherwise, try DLV (if configured) + # + # + # So - find closest existing trust anchor + error = nil + msg.security_level = Message::SecurityLevel.INDETERMINATE + qname = msg.question()[0].qname + closest_anchor = find_closest_anchor_for(qname) + if (!closest_anchor) + + end + TheLog.debug("Closest anchor for #{qname} is #{closest_anchor} - trying to follow down") + error = try_to_follow_from_anchor(closest_anchor, msg, qname) + + if ((msg.security_level.code < Message::SecurityLevel::SECURE) && + (@verifier_type == VerifierType::DLV) && + @added_dlv_key) + # If we can't find anything, and we're set to check DLV, then + # check the DLV registry and work down from there. + dlv_anchor = find_closest_dlv_anchor_for(qname) + if (dlv_anchor) + # print "Trying to follow DLV anchor from #{dlv_anchor.name} to #{qname}\n" + TheLog.debug("Trying to follow DLV anchor from #{dlv_anchor.name} to #{qname}") + error = try_to_follow_from_anchor(dlv_anchor, msg, qname) + else + # print "Couldn't find DLV anchor for #{qname}\n" + TheLog.debug("Couldn't find DLV anchor for #{qname}") + end + end + if (msg.security_level.code != Message::SecurityLevel::SECURE) + begin + # print "Trying to verify one last time\n" + + if verify(msg) # Just make sure we haven't picked the keys up anywhere + msg.security_level = Message::SecurityLevel.SECURE + return true + end + rescue VerifyError => e + # print "Verify failed : #{e}\n" + end + end + if (error) + raise error + end + if (msg.security_level == Message::SecurityLevel.BOGUS) + raise VerifyError.new("Bogus record") + end + if (msg.security_level.code > Message::SecurityLevel::UNCHECKED) + return true + else + return false + end + end + + def try_to_follow_from_anchor(closest_anchor, msg, qname) # :nodoc: + error = nil + if (closest_anchor) + # Then try to descend to the level we're interested in + actual_anchor = false + begin + actual_anchor = follow_chain(closest_anchor, qname) + rescue VerifyError => e + TheLog.debug("Broken chain from anchor : #{closest_anchor.name}") + msg.security_level = Message::SecurityLevel.BOGUS + return e + end + # @TODO@ We need to de ermine whether there was simply no DS record, or whether there was a failure + if (!actual_anchor) + TheLog.debug("Unable to follow chain from anchor : #{closest_anchor.name}") + msg.security_level = Message::SecurityLevel.INSECURE + else + actual_anchor_keys = "" + actual_anchor.rrs.each {|rr| actual_anchor_keys += ", #{rr.key_tag}"} + TheLog.debug("Found anchor #{actual_anchor.name}, #{actual_anchor.type} for #{qname} : #{actual_anchor_keys}") + # print "Found anchor #{actual_anchor.name}, #{actual_anchor.type} for #{qname} : #{actual_anchor_keys}\n" + begin + if (verify(msg, actual_anchor)) + TheLog.debug("Validated #{qname}") + msg.security_level = Message::SecurityLevel.SECURE + end + rescue VerifyError => e + TheLog.info("BOGUS #{qname}! Error : #{e}") + # print "BOGUS #{qname}! Error : #{e}\n" + msg.security_level = Message::SecurityLevel.BOGUS + error = e + end + end + else + # print "Unable to find an anchor for #{qname}\n" + msg.security_level = Message::SecurityLevel.INSECURE + end + return error + end + + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/the_log.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/the_log.rb new file mode 100644 index 000000000000..1f0b87875f18 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/the_log.rb @@ -0,0 +1,44 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +require 'logger' +require 'singleton' +require 'thread' +module Dnsruby + # This class exists for backwards compatibility. + # + # It's Logger (which defaults to STDOUT, level FATAL) can be configured, or a new Logger can be supplied. + # + # Dnsruby::TheLog.level=Logger::DEBUG + # Dnsruby::TheLog.debug("Debug message") + # + class TheLog + # Set a new Logger for use by Dnsruby + def set_logger(logger) + Dnsruby.log = logger + end + # Change the Logger level. + def level=(level) + Dnsruby.log.level = level + end + def level + return Dnsruby.log.level + end + + def self.method_missing(symbol, *args) #:nodoc: all + Dnsruby.log.send(symbol, *args) + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/update.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/update.rb new file mode 100644 index 000000000000..5836c8d71af9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/update.rb @@ -0,0 +1,295 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +module Dnsruby + # Dnsruby::Update is a subclass of Dnsruby::Packet, + # to be used for making DNS dynamic updates. Programmers + # should refer to RFC 2136 for the semantics of dynamic updates. + + # The first example below shows a complete program; subsequent examples + # show only the creation of the update packet. + # + # == Add a new host + # + # require 'Dnsruby' + # + # # Create the update packet. + # update = Dnsruby::Update.new('example.com') + # + # # Prerequisite is that no A records exist for the name. + # update.absent('foo.example.com.', 'A') + # + # # Add two A records for the name. + # update.add('foo.example.com.', 'A', 86400, '192.168.1.2') + # update.add('foo.example.com.', 'A', 86400, '172.16.3.4') + # + # # Send the update to the zone's primary master. + # res = Dnsruby::Resolver.new({:nameserver => 'primary-master.example.com'}) + # + # begin + # reply = res.send_message(update) + # print "Update succeeded\n" + # rescue Exception => e + # print 'Update failed: #{e}\n' + # end + # + # == Add an MX record for a name that already exists + # + # update = Dnsruby::Update.new('example.com') + # update.present('example.com') + # update.add('example.com', Dnsruby::Types.MX, 86400, 10, 'mailhost.example.com') + # + # == Add a TXT record for a name that doesn't exist + # + # update = Dnsruby::Update.new('example.com') + # update.absent('info.example.com') + # update.add('info.example.com', Types.TXT, 86400, "yabba dabba doo"') + # + # == Delete all A records for a name + # + # update = Dnsruby::Update.new('example.com') + # update.present('foo.example.com', 'A') + # update.delete('foo.example.com', 'A') + # + # == Delete all RRs for a name + # + # update = Dnsruby::Update.new('example.com') + # update.present('byebye.example.com') + # update.delete('byebye.example.com') + # + # == Perform a signed update + # + # key_name = 'tsig-key' + # key = 'awwLOtRfpGE+rRKF2+DEiw==' + # + # update = Dnsruby::Update.new('example.com') + # update.add('foo.example.com', 'A', 86400, '10.1.2.3')) + # update.add('bar.example.com', 'A', 86400, '10.4.5.6')) + # res.tsig=(key_name,key) + # + class Update < Message + # Returns a Dnsruby::Update object suitable for performing a DNS + # dynamic update. Specifically, it creates a message with the header + # opcode set to UPDATE and the zone record type to SOA (per RFC 2136, + # Section 2.3). + # + # Programs must use the push method to add RRs to the prerequisite, + # update, and additional sections before performing the update. + # + # Arguments are the zone name and the class. If the zone is omitted, + # the default domain will be taken from the resolver configuration. + # If the class is omitted, it defaults to IN. + # packet = Dnsruby::Update.new + # packet = Dnsruby::Update.new('example.com') + # packet = Dnsruby::Update.new('example.com', 'HS') + # + def initialize(zone=nil, klass=nil) + + # sort out the zone section (RFC2136, section 2.3) + if (zone==nil) + config = Config.new + zone = (config.search)[0] + return unless zone + end + + type = 'SOA' + klass ||= 'IN' + + super(zone, type, klass) || return + + @header.opcode=('UPDATE') + @header.rd=(0) + @do_validation = false + end + + # Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4) + # + # (1) RRset exists (value independent). At least one RR with a + # specified NAME and TYPE (in the zone and class specified by + # the Zone Section) must exist. + # + # update.present(name, type) + # + # (2) RRset exists (value dependent). A set of RRs with a + # specified NAME and TYPE exists and has the same members + # with the same RDATAs as the RRset specified here in this + # Section. + # + # update.present(name, type, rdata) + # + # (4) Name is in use. At least one RR with a specified NAME (in + # the zone and class specified by the Zone Section) must exist. + # Note that this prerequisite is NOT satisfied by empty + # nonterminals. + # + # update.present(name) + def present(*args) + ttl = 0 + rdata = "" + klass = Classes.ANY + if (args.length>=1) # domain (RFC2136, Section 2.4.4) + name = args[0] + type = Types.ANY + if (args.length>=2) # RRSET (RFC2136, Section 2.4.1) + type = args[1] + end + if (args.length > 2) # RRSET (RFC2136, Section 2.4.2) + klass = Classes.new(zone()[0].zclass) + rdata=args[2] + end + rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}") + add_pre(rec) + return rec + else + raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#present") + end + end + + # Ways to create the prerequisite records (exists, notexists, inuse, etc. - RFC2136, section 2.4) + # Can be called with one arg : + # + # update.absent(name) + # (5) Name is not in use. No RR of any type is owned by a + # specified NAME. Note that this prerequisite IS satisfied by + # empty nonterminals. + # + # Or with two : + # + # update.absent(name, type) + # (3) RRset does not exist. No RRs with a specified NAME and TYPE + # (in the zone and class denoted by the Zone Section) can exist. + # + def absent(*args) + ttl = 0 + rdata = "" + klass = Classes.NONE + if (args.length>=1) # domain (RFC2136, Section 2.4.5) + name = args[0] + type = Types.ANY + if (args.length==2) # RRSET (RFC2136, Section 2.4.3) + type = args[1] + end + rec = RR.create("#{name} #{ttl} #{klass} #{type} #{rdata}") + add_pre(rec) + return rec + else + raise ArgumentError.new("Wrong number of arguments (#{args.length} for 1 or 2) for Update#absent") + end + end + + # Ways to create the update records (add, delete, RFC2136, section 2.5) + # " 2.5.1 - Add To An RRset + # + # RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH + # and RDATA are those being added, and CLASS is the same as the zone + # class. Any duplicate RRs will be silently ignored by the primary + # master." + # + # update.add(rr) + # update.add([rr1, rr2]) + # update.add(name, type, ttl, rdata) + # + def add(*args) + zoneclass=zone()[0].zclass + case args[0] + when Array + args[0].each do |resource| + add(resource) + end + when RR + # Make sure that the Class is the same as the zone + resource = args[0] + if (resource.klass != zoneclass) + raise ArgumentError.new("Wrong class #{resource.klass} for update (should be #{zoneclass})!") + end + add_update(resource) + return resource + else + name=args[0] + type=args[1] + ttl=args[2] + rdata=args[3] + resource = nil + if (Types.new(type) == Types.TXT) + instring = "#{name} #{ttl} #{zoneclass} #{type} "; + if (String === rdata) + instring += " '#{rdata}'" + elsif (Array === rdata) + rdata.length.times {|rcounter| + instring += " '#{rdata[rcounter]}' " + } + else + instring += rdata + end + resource = RR.create(instring) + else + resource = RR.create("#{name} #{ttl} #{zoneclass} #{type} #{rdata}") + end + add_update(resource) + return resource + end + # @TODO@ Should be able to take RRSet! + end + + # Ways to create the update records (add, delete, RFC2136, section 2.5) + # + # 2.5.2 - Delete An RRset + # update.delete(name, type) + # + # + # 2.5.3 - Delete All RRsets From A Name + # update.delete(name) + # + # 2.5.4 - Delete An RR From An RRset + # update.delete(name, type, rdata) + # + def delete(*args) + ttl = 0 + klass = Classes.ANY + rdata="" + resource = nil + case args.length + when 1 # name + resource = RR.create("#{args[0]} #{ttl} #{klass} #{Types.ANY} #{rdata}") + add_update(resource) + when 2 # name, type + resource = RR.create("#{args[0]} #{ttl} #{klass} #{args[1]} #{rdata}") + add_update(resource) + when 3 # name, type, rdata + name = args[0] + type = args[1] + rdata = args[2] + if (Types.new(type) == Types.TXT) + instring = "#{name} #{ttl} IN #{type} "; + if (String === rdata) + instring += " '#{rdata}'" + elsif (Array === rdata) + rdata.length.times {|rcounter| + instring += " '#{rdata[rcounter]}' " + } + else + instring += rdata + end + resource = RR.create(instring) + else + resource = RR.create("#{name} #{ttl} IN #{type} #{rdata}") + end + resource.klass = Classes.NONE + add_update(resource) + end + return resource + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/validator_thread.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/validator_thread.rb new file mode 100644 index 000000000000..7ace9161a6ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/validator_thread.rb @@ -0,0 +1,125 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +module Dnsruby + # Takes care of the validation for the SelectThread. If queries need to be + # made in order to validate the response, then a separate thread is fired up + # to do this. + class ValidatorThread # :nodoc: all + # include Singleton + def initialize(*args) + @client_id, @client_queue, @response, @error, @query, @st, @res = args + # Create the validation thread, and a queue to receive validation requests + # Actually, need to have a thread per validator, as they make recursive calls. + # @@mutex = Mutex.new + # @@validation_queue = Queue.new + # @@validator_thread = Thread.new{ + # do_validate + # } + end + def run + # ONLY START THE NEW THREAD IF VALIDATION NEED OCCUR!! + if (should_validate) + Thread.new{ + do_validate + } + else + do_validate + end + end + + + # def add_to_queue(item) + # print "ADding to validator queue\n" + # # @@mutex.synchronize{ + # @@validation_queue.push(item) + # # } + # end + def do_validate + # while (true) + # item = nil + # print "Waiting to pop validation item\n" + # # @@mutex.synchronize{ + # item = @@validation_queue.pop + # # } + # print "Popped validation request\n" + # client_id, client_queue, response, err, query, st, res = item + validated_ok = validate(@query, @response, @res) + + validated_ok = false if (@error && !(NXDomain === @error)) + + cache_if_valid(@query, @response) + + # Now send the response back to the client... + # print "#{Time.now} : Got result for #{@query.question()[0].qname}, #{@query.question()[0].qtype}\n" + if (validated_ok) + @st.push_validation_response_to_select(@client_id, @client_queue, @response, nil, @query, @res) + else + @st.push_validation_response_to_select(@client_id, @client_queue, @response, + @response.security_error, @query, @res) + end + + + # end + end + + + def should_validate + return ValidatorThread.requires_validation?(@query, @response, @error, @res) + end + + def ValidatorThread.requires_validation?(query, response, error, res) + # @error will be nil for DNS RCODE errors - it will be true for TsigError. really?! + if ((!error || (error.instance_of?NXDomain)) && query.do_validation) + if (res.dnssec) + if (response.security_level != Message::SecurityLevel.SECURE) + return true + end + end + end + return false + + end + + def validate(query, response, res) + if (should_validate) + begin + # So, we really need to be able to take the response out of the select thread, along + # with the responsibility for sending the answer to the client. + # Should we have a validator thread? Or a thread per validation? + # Then, select thread gets response. It performs basic checks here. + # After basic checks, the select-thread punts the response (along with queues, etc.) + # to the validator thread. + # The validator validates it (or just releases it with no validation), and then + # sends the request to the client via the client queue. + Dnssec.validate_with_query(query,response) + return true + rescue VerifyError => e + response.security_error = e + response.security_level = Message::SecurityLevel.BOGUS + # Response security_level should already be set + return false + end + end + return true + end + + def cache_if_valid(query, response) + return if @error + PacketSender.cache(query, response) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/version.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/version.rb new file mode 100644 index 000000000000..896d843afed5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/version.rb @@ -0,0 +1,3 @@ +module Dnsruby + VERSION = '1.61.5' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/zone_reader.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/zone_reader.rb new file mode 100644 index 000000000000..7ce13b231d5d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/zone_reader.rb @@ -0,0 +1,469 @@ +# -- +# Copyright 2009 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +# This class provides the facility to load a zone file. +# It can either process one line at a time, or return an entire zone as a list of +# records. +module Dnsruby + class ZoneReader + class ParseException < Exception + + end + # Create a new ZoneReader. The zone origin is required. If the desired SOA minimum + # and TTL are passed in, then they are used as default values. + def initialize(origin, soa_minimum = nil, soa_ttl = nil) + @origin = origin.to_s + + if (!Name.create(@origin).absolute?) + @origin = @origin.to_s + "." + end + @soa_ttl = soa_ttl + if (soa_minimum && !@last_explicit_ttl) + @last_explicit_ttl = soa_minimum + else + @last_explicit_ttl = 0 + end + @last_explicit_class = Classes.new("IN") + @last_name = nil + @continued_line = nil + @in_quoted_section = false + end + + # Takes a filename string, or any type of IO object, and attempts to load a zone. + # Returns a list of RRs if successful, nil otherwise. + def process_file(source) + if source.is_a?(String) + File.open(source) do |file| + process_io(file) + end + else + process_io(source) + end + end + + # Iterate over each line in a IO object, and process it. + # Returns a list of RRs if successful, nil otherwise. + def process_io(io) + zone = nil + io.each do |line| + begin + ret = process_line(line) + if (ret) + rr = RR.create(ret) + if (!zone) + zone = [] + end + zone.push(rr) + end + rescue Exception => e + raise ParseException.new("Error reading line #{io.lineno} of #{io.inspect} : [#{line}]") + end + end + return zone + end + + # Process the next line of the file + # Returns a string representing the normalised line. + def process_line(line, do_prefix_hack = false) + return nil if (line[0,1] == ";") + line = strip_comments(line) + return nil if (line.strip.length == 0) + return nil if (!line || (line.length == 0)) + @in_quoted_section = false if !@continued_line + + if (line.index("$ORIGIN") == 0) + @origin = line.split()[1].strip # $ORIGIN <domain-name> [<comment>] + # print "Setting $ORIGIN to #{@origin}\n" + return nil + end + if (line.index("$TTL") == 0) + @last_explicit_ttl = get_ttl(line.split()[1].strip) # $TTL <ttl> + # print "Setting $TTL to #{ttl}\n" + return nil + end + if (@continued_line) + # Add the next line until we see a ")" + # REMEMBER TO STRIP OFF COMMENTS!!! + @continued_line = strip_comments(@continued_line) + line = @continued_line.rstrip.chomp + " " + line + if (line.index(")")) + # OK + @continued_line = false + end + end + open_bracket = line.index("(") + if (open_bracket) + # Keep going until we see ")" + index = line.index(")") + if (index && (index > open_bracket)) + # OK + @continued_line = false + else + @continued_line = line + end + end + return nil if @continued_line + + line = strip_comments(line) + "\n" + + # If SOA, then replace "3h" etc. with expanded seconds + # begin + return normalise_line(line, do_prefix_hack) + # rescue Exception => e + # print "ERROR parsing line #{@line_num} : #{line}\n" + # return "\n", Types::ANY + # end + end + + def strip_comments(line) + last_index = 0 + # Are we currently in a quoted section? + # Does a quoted section begin or end in this line? + # Are there any semi-colons? + # Ary any of the semi-colons inside a quoted section? + # Handle escape characters + if (line.index"\\") + return strip_comments_meticulously(line) + end + while (next_index = line.index(";", last_index + 1)) + # Have there been any quotes since we last looked? + process_quotes(line[last_index, next_index - last_index]) + + # Now use @in_quoted_section to work out if the ';' terminates the line + if (!@in_quoted_section) + return line[0,next_index] + end + + last_index = next_index + end + # Check out the quote situation to the end of the line + process_quotes(line[last_index, line.length-1]) + + return line + end + + def strip_comments_meticulously(line) + # We have escape characters in the text. Go through it character by + # character and work out what's escaped and quoted and what's not + escaped = false + quoted = false + pos = 0 + line.each_char {|c| + if (c == "\\") + if (!escaped) + escaped = true + else + escaped = false + end + else + if (escaped) + if (c >= "0" && c <= "9") # rfc 1035 5.1 \DDD + pos = pos + 2 + end + escaped = false + next + else + if (c == "\"") + if (quoted) + quoted = false + else + quoted = true + end + else + if (c == ";") + if (!quoted) + return line[0, pos+1] + end + end + end + end + end + pos +=1 + } + return line + end + + def process_quotes(section) + # Look through the section of text and set the @in_quoted_section + # as it should be at the end of the given section + last_index = 0 + while (next_index = section.index("\"", last_index + 1)) + @in_quoted_section = !@in_quoted_section + last_index = next_index + end + end + + # Take a line from the input zone file, and return the normalised form + # do_prefix_hack should always be false + def normalise_line(line, do_prefix_hack = false) + # Note that a freestanding "@" is used to denote the current origin - we can simply replace that straight away + # Remove the ( and ) + # Note that no domain name may be specified in the RR - in that case, last_name should be used. How do we tell? Tab or space at start of line. + + # If we have text in the record, then ignore that in the parsing, and stick it on again at the end + stored_line = ""; + if (line.index('"') != nil) + stored_line = line[line.index('"'), line.length]; + line = line [0, line.index('"')] + end + if ((line[0,1] == " ") || (line[0,1] == "\t")) + line = @last_name + " " + line + end + line.chomp! + line.sub!(/\s+@$/, " #{@origin}") # IN CNAME @ + line.sub!(/^@\s+/, "#{@origin} ") # IN CNAME @ + line.sub!(/\s+@\s+/, " #{@origin} ") + line.strip! + + + # o We need to identify the domain name in the record, and then + split = line.split(' ') # split on whitespace + name = split[0].strip + if (name.index"\\") + + ls =[] + Name.create(name).labels.each {|el| ls.push(Name.decode(el.to_s))} + new_name = ls.join('.') + + + if (!(/\.\z/ =~ name)) + new_name += "." + @origin + else + new_name += "." + end + line = new_name + " " + (split.length - 1).times {|i| line += "#{split[i+1]} "} + line += "\n" + name = new_name + split = line.split + # o add $ORIGIN to it if it is not absolute + elsif !(/\.\z/ =~ name) + new_name = name + "." + @origin + line.sub!(name, new_name) + name = new_name + split = line.split + end + + # If the second field is not a number, then we should add the TTL to the line + # Remember we can get "m" "w" "y" here! So need to check for appropriate regexp... + found_ttl_regexp = (split[1]=~/^[0-9]+[smhdwSMHDW]/) + if (found_ttl_regexp == 0) + # Replace the formatted ttl with an actual number + ttl = get_ttl(split[1]) + line = name + " #{ttl} " + @last_explicit_ttl = ttl + (split.length - 2).times {|i| line += "#{split[i+2]} "} + line += "\n" + split = line.split + elsif (((split[1]).to_i == 0) && (split[1] != "0")) + # Add the TTL + if (!@last_explicit_ttl) + # If this is the SOA record, and no @last_explicit_ttl is defined, + # then we need to try the SOA TTL element from the config. Otherwise, + # find the SOA Minimum field, and use that. + # We should also generate a warning to that effect + # How do we know if it is an SOA record at this stage? It must be, or + # else @last_explicit_ttl should be defined + # We could put a marker in the RR for now - and replace it once we know + # the actual type. If the type is not SOA then, then we can raise an error + line = name + " %MISSING_TTL% " + else + line = name + " #{@last_explicit_ttl} " + end + (split.length - 1).times {|i| line += "#{split[i+1]} "} + line += "\n" + split = line.split + else + @last_explicit_ttl = split[1].to_i + end + + # Now see if the clas is included. If not, then we should default to the last class used. + begin + klass = Classes.new(split[2]) + @last_explicit_class = klass + rescue ArgumentError + # Wasn't a CLASS + # So add the last explicit class in + line = "" + (2).times {|i| line += "#{split[i]} "} + line += " #{@last_explicit_class} " + (split.length - 2).times {|i| line += "#{split[i+2]} "} + line += "\n" + split = line.split + rescue Error => e + end + + # Add the type so we can load the zone one RRSet at a time. + type = Types.new(split[3].strip) + is_soa = (type == Types::SOA) + type_was = type + if (type == Types.RRSIG) + # If this is an RRSIG record, then add the TYPE COVERED rather than the type - this allows us to load a complete RRSet at a time + type = Types.new(split[4].strip) + end + + type_string=prefix_for_rrset_order(type, type_was) + @last_name = name + + if !([Types::NAPTR, Types::TXT].include?type_was) + line.sub!("(", "") + line.sub!(")", "") + end + + if (is_soa) + if (@soa_ttl) + # Replace the %MISSING_TTL% text with the SOA TTL from the config + line.sub!(" %MISSING_TTL% ", " #{@soa_ttl} ") + else + # Can we try the @last_explicit_ttl? + if (@last_explicit_ttl) + line.sub!(" %MISSING_TTL% ", " #{@last_explicit_ttl} ") + end + end + line = replace_soa_ttl_fields(line) + if (!@last_explicit_ttl) + soa_rr = Dnsruby::RR.create(line) + @last_explicit_ttl = soa_rr.minimum + end + end + + line = line.strip + + if (stored_line && stored_line != "") + line += " " + stored_line.strip + end + + # We need to fix up any non-absolute names in the RR + # Some RRs have a single name, at the end of the string - + # to do these, we can just check the last character for "." and add the + # "." + origin string if necessary + if ([Types::MX, Types::NS, Types::AFSDB, Types::NAPTR, Types::RT, + Types::SRV, Types::CNAME, Types::MB, Types::MG, Types::MR, + Types::PTR, Types::DNAME].include?type_was) + # if (line[line.length-1, 1] != ".") + if (!(/\.\z/ =~ line)) + line = line + "." + @origin.to_s + end + end + # Other RRs have several names. These should be parsed by Dnsruby, + # and the names adjusted there. + if ([Types::MINFO, Types::PX, Types::RP].include?type_was) + parsed_rr = Dnsruby::RR.create(line) + case parsed_rr.type + when Types::MINFO + if (!parsed_rr.rmailbx.absolute?) + parsed_rr.rmailbx = parsed_rr.rmailbx.to_s + "." + @origin.to_s + end + if (!parsed_rr.emailbx.absolute?) + parsed_rr.emailbx = parsed_rr.emailbx.to_s + "." + @origin.to_s + end + when Types::PX + if (!parsed_rr.map822.absolute?) + parsed_rr.map822 = parsed_rr.map822.to_s + "." + @origin.to_s + end + if (!parsed_rr.mapx400.absolute?) + parsed_rr.mapx400 = parsed_rr.mapx400.to_s + "." + @origin.to_s + end + when Types::RP + if (!parsed_rr.mailbox.absolute?) + parsed_rr.mailbox = parsed_rr.mailbox.to_s + "." + @origin.to_s + end + if (!parsed_rr.txtdomain.absolute?) + parsed_rr.txtdomain = parsed_rr.txtdomain.to_s + "." + @origin.to_s + end + end + line = parsed_rr.to_s + end + if (do_prefix_hack) + return line + "\n", type_string, @last_name + end + return line+"\n" + end + + # Get the TTL in seconds from the m, h, d, w format + def get_ttl(ttl_text_in) + # If no letter afterwards, then in seconds already + # Could be e.g. "3d4h12m" - unclear if "4h5w" is legal - best assume it is + # So, search out each letter in the string, and get the number before it. + ttl_text = ttl_text_in.downcase + index = ttl_text.index(/[whdms]/) + if (!index) + return ttl_text.to_i + end + last_index = -1 + total = 0 + while (index) + letter = ttl_text[index] + number = ttl_text[last_index + 1, index-last_index-1].to_i + new_number = 0 + case letter + when 115 then # "s" + new_number = number + when 109 then # "m" + new_number = number * 60 + when 104 then # "h" + new_number = number * 3600 + when 100 then # "d" + new_number = number * 86400 + when 119 then # "w" + new_number = number * 604800 + end + total += new_number + + last_index = index + index = ttl_text.index(/[whdms]/, last_index + 1) + end + return total + end + + def replace_soa_ttl_fields(line) + # Replace any fields which evaluate to 0 + split = line.split + 4.times {|i| + x = i + 7 + split[x].strip! + split[x] = get_ttl(split[x]).to_s + } + return split.join(" ") + "\n" + end + + # This method is included only for OpenDNSSEC support. It should not be + # used otherwise. + # Frig the RR type so that NSEC records appear last in the RRSets. + # Also make sure that DNSKEYs come first (so we have a key to verify + # the RRSet with!). + def prefix_for_rrset_order(type, type_was) # :nodoc: all + # Now make sure that NSEC(3) RRs go to the back of the list + if ['NSEC', 'NSEC3'].include?type.string + if (type_was == Types::RRSIG) + # Get the RRSIG first + type_string = "ZZ" + type.string + else + type_string = "ZZZ" + type.string + end + elsif type == Types::DNSKEY + type_string = "0" + type.string + elsif type == Types::NS + # Make sure that we see the NS records first so we know the delegation status + type_string = "1" + type.string + else + type_string = type.string + end + return type_string + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/zone_transfer.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/zone_transfer.rb new file mode 100644 index 000000000000..a2fd7a69052c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/lib/dnsruby/zone_transfer.rb @@ -0,0 +1,385 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +module Dnsruby + # This class performs zone transfers as per RFC1034 (AXFR) and RFC1995 (IXFR). + class ZoneTransfer + # The nameserver to use for the zone transfer - defaults to system config + attr_accessor :server + # What type of transfer to do (IXFR or AXFR) - defaults to AXFR + attr_accessor :transfer_type + # The class - defaults to IN + attr_accessor :klass + # The port to connect to - defaults to 53 + attr_accessor :port + # If using IXFR, this is the SOA serial number to start the incrementals from + attr_accessor :serial + # The source address to connect to + attr_accessor :src_address + # The TSIG record used to sign the transfer + attr_reader :tsig + # Returns the tsigstate of the last transfer (nil if no TSIG signed transfer has occurred) + attr_reader :last_tsigstate + # Sets the connect timeout in seconds + attr_accessor :connect_timeout + + # Sets the TSIG to sign the zone transfer with. + # Pass in either a Dnsruby::RR::TSIG, or a key_name and key (or just a key) + # Pass in nil to stop tsig signing. + # * res.tsig=(tsig_rr) + # * res.tsig=(key_name, key) + # * res.tsig=nil # Don't sign the transfer + def tsig=(*args) + @tsig = Resolver.get_tsig(args) + end + + + def initialize + @server=Config.new.nameserver[0] + @transfer_type = Types.AXFR + @klass=Classes.IN + @port=53 + @serial=0 + @tsig = nil + @axfr = nil + @src_address = nil + @connect_timeout = 5 + end + + # Perform a zone transfer (RFC1995) + # If an IXFR query is unsuccessful, then AXFR is tried (and @transfer_type is set + # to AXFR) + # TCP is used as the only transport + # + # If AXFR is performed, then the zone will be returned as a set of records : + # + # zt = Dnsruby::ZoneTransfer.new + # zt.transfer_type = Dnsruby::Types.AXFR + # zt.server = "ns0.validation-test-servers.nominet.org.uk" + # zone = zt.transfer("validation-test-servers.nominet.org.uk") + # soa = zone[0] + # rec1 = zone[1] + # print zone.to_s + # + # + # If IXFR is performed, then the incrementals will be returned as a set of Deltas. + # Each Delta contains the start and end SOA serial number, as well as an array of + # adds and deletes that occurred between the start and end. + # + # zt = Dnsruby::ZoneTransfer.new + # zt.transfer_type = Dnsruby::Types.IXFR + # zt.server = "ns0.validation-test-servers.nominet.org.uk" + # zt.serial = 2007090401 + # deltas = zt.transfer("validation-test-servers.nominet.org.uk") + # assert_equal("Should show up in transfer", deltas[0].adds[1].data) + def transfer(zone) + servers = @server + if (servers.class == String) + servers=[servers] + end + xfr = nil + exception = nil + servers.each do |server| + begin + server=Config.resolve_server(server) + xfr = do_transfer(zone, server) + break + rescue Exception => e + exception = e + end + end + if (xfr == nil && exception != nil) + raise exception + end + return xfr + end + + def do_transfer(zone, server) #:nodoc: all + @transfer_type = Types.new(@transfer_type) + @state = :InitialSoa + socket = Socket.tcp(server, @port, @src_address, connect_timeout: @connect_timeout) + # socket = TCPSocket.new(server, @port, @src_address) + begin + # Send an initial query + msg = Message.new(zone, @transfer_type, @klass) + if @transfer_type == Types.IXFR + rr = RR.create("#{zone} 0 IN SOA" + '0 0 %u 0 0 0 0' % @serial) + msg.add_authority(rr) + end + send_message(socket, msg) + + while (@state != :End) + response = receive_message(socket) + + if (@state == :InitialSoa) + rcode = response.rcode + if (rcode != RCode.NOERROR) + if (@transfer_type == Types.IXFR && + rcode == RCode.NOTIMP) + # IXFR didn't work - let's try AXFR + Dnsruby.log.debug("IXFR DID NOT WORK (rcode = NOTIMP) - TRYING AXFR!!") + @state = :InitialSoa + @transfer_type=Types.AXFR + # Send an initial AXFR query + msg = Message.new(zone, @transfer_type, @klass) + send_message(socket, msg) + next + end + raise ResolvError.new(rcode.string); + end + + if (response.question[0].qtype != @transfer_type) + raise ResolvError.new("invalid question section") + end + + if (response.header.ancount == 0 && @transfer_type == Types.IXFR) + Dnsruby.log.debug("IXFR DID NOT WORK (ancount = 0) - TRYING AXFR!!") + # IXFR didn't work - let's try AXFR + @transfer_type=Types.AXFR + # Send an initial AXFR query + @state = :InitialSoa + msg = Message.new(zone, @transfer_type, @klass) + send_message(socket, msg) + next + end + end + + response.each_answer { |rr| + parseRR(rr) + } + if (@state == :End && + response.tsigstate == :Intermediate) + raise ResolvError.new("last message must be signed") + end + if (@state == :End && @tsig) + if (response.tsigstate != :Verified) + @last_tsigstate = :Failed + raise ResolvError.new("Zone transfer not correctly signed") + end + @last_tsigstate = :Verified + end + end + # This could return with an IXFR response, or an AXFR response. + # If it fails completely, then try to send an AXFR query. + # Once the query has been sent, then enter the main response loop. + # Unless we know we're definitely AXFR, we should be prepared for either IXFR or AXFR + # AXFR response : The first and the last RR of the response is the SOA record of the zone. + # The whole zone is returned inbetween. + # IXFR response : one or more difference sequences is returned. The list of difference + # sequences is preceded and followed by a copy of the server's current + # version of the SOA. + # Each difference sequence represents one update to the zone (one SOA + # serial change) consisting of deleted RRs and added RRs. The first RR + # of the deleted RRs is the older SOA RR and the first RR of the added + # RRs is the newer SOA RR. + socket.close + if (@axfr!=nil) + return @axfr + end + return @ixfr + rescue Exception => e + socket.close + raise e + end + end + + # All changes between two versions of a zone in an IXFR response. + class Delta + + # The starting serial number of this delta. + attr_accessor :start + + # The ending serial number of this delta. + attr_accessor :end + + # A list of records added between the start and end versions + attr_accessor :adds + + # A list of records deleted between the start and end versions + attr_accessor :deletes + + def initialize() + @adds = [] + @deletes = [] + end + + def to_s + ret = "Adds : " + @adds.join(",") + ret +=", Deletes : " + @deletes.join(",") + end + end + + # Compare two serials according to RFC 1982. Return 0 if equal, + # -1 if s1 is bigger, 1 if s1 is smaller. + def compare_serial(s1, s2) + if s1 == s2 + return 0 + end + if s1 < s2 and (s2 - s1) < (2**31) + return 1 + end + if s1 > s2 and (s1 - s2) > (2**31) + return 1 + end + if s1 < s2 and (s2 - s1) > (2**31) + return -1 + end + if s1 > s2 and (s1 - s2) < (2**31) + return -1 + end + return 0 + end + + def parseRR(rec) #:nodoc: all + name = rec.name + type = rec.type + delta = Delta.new + + case @state + when :InitialSoa + if (type != Types.SOA) + raise ResolvError.new("missing initial SOA") + end + @initialsoa = rec + # Remember the serial number in the initial SOA; we need it + # to recognize the end of an IXFR. + @end_serial = rec.serial + # if ((@transfer_type == Types.IXFR) && (@end_serial <= @serial)) + if ((@transfer_type == Types.IXFR) && (compare_serial(@end_serial, @serial) >= 0)) + Dnsruby.log.debug("zone up to date") + raise ZoneSerialError.new("IXFR up to date: expected serial " + + @serial.to_s + " , got " + rec.serial.to_s); + @state = :End + else + @state = :FirstData + end + when :FirstData + # If the transfer begins with 1 SOA, it's an AXFR. + # If it begins with 2 SOAs, it's an IXFR. + if (@transfer_type == Types.IXFR && type == Types.SOA && + rec.serial == @serial) + Dnsruby.log.debug("IXFR response - using IXFR") + @rtype = Types.IXFR + @ixfr = [] + @state = :Ixfr_DelSoa + else + Dnsruby.log.debug("AXFR response - using AXFR") + @rtype = Types.AXFR + @transfer_type = Types.AXFR + @axfr = [] + @axfr << @initialsoa + @state = :Axfr + end + parseRR(rec) # Restart... + return + + when :Ixfr_DelSoa + delta = Delta.new + @ixfr.push(delta) + delta.start = rec.serial + delta.deletes << rec + @state = :Ixfr_Del + + when :Ixfr_Del + if (type == Types.SOA) + @current_serial = rec.serial + @state = :Ixfr_AddSoa + parseRR(rec); # Restart... + return; + end + delta = @ixfr[@ixfr.length - 1] + delta.deletes << rec + + when :Ixfr_AddSoa + delta = @ixfr[@ixfr.length - 1] + delta.end = rec.serial + delta.adds << rec + @state = :Ixfr_Add + + when :Ixfr_Add + if (type == Types.SOA) + soa_serial = rec.serial + if (soa_serial == @end_serial) + @state = :End + return + elsif (soa_serial != @current_serial) + raise ZoneSerialError.new("IXFR out of sync: expected serial " + + @current_serial.to_s + " , got " + soa_serial.to_s); + else + @state = :Ixfr_DelSoa + parseRR(rec); # Restart... + return; + end + end + delta = @ixfr[@ixfr.length - 1] + delta.adds << rec + + when :Axfr + # Old BINDs sent cross class A records for non IN classes. + if (type == Types.A && rec.klass() != @klass) + else + if (type == Types.SOA) + @state = :End + else + @axfr << rec + end + end + when :End + raise ResolvError.new("extra data in zone transfer") + + else + raise ResolvError.new("invalid state for zone transfer") + end + end + + + def send_message(socket, msg) #:nodoc: all + if (@tsig) + @tsig.apply(msg) + @tsig = msg.tsig + end + query_packet = msg.encode + lenmsg = [query_packet.length].pack('n') + socket.send(lenmsg, 0) + socket.send(query_packet, 0) + end + + def tcp_read(socket, len) #:nodoc: all + buf="" + while (buf.length < len) and not socket.eof? do + buf += socket.read(len-buf.length) + end + return buf + end + + def receive_message(socket) #:nodoc: all + buf = tcp_read(socket, 2) + answersize = buf.unpack('n')[0] + # Some servers (e.g. dnscache) apparently hang up on some connections. + # Thanks to Matt Palmer for the fix. + raise ResolvError.new("Server did not send a valid answer") if answersize.nil? + buf = tcp_read(socket, answersize) + msg = Message.decode(buf) + if (@tsig) + if !@tsig.verify_envelope(msg, buf) + Dnsruby.log.error("Bad signature on zone transfer - closing connection") + raise ResolvError.new("Bad signature on zone transfer") + end + end + return msg + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/custom.txt b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/custom.txt new file mode 100644 index 000000000000..671e1aa2eb70 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/custom.txt @@ -0,0 +1,4 @@ +# $Id: custom.txt 264 2005-04-06 09:16:15Z olaf $ +domain t2.dnsruby.validation-test-servers.nominet.org.uk +search alt.dnsruby.validation-test-servers.nominet.org.uk ext.dnsruby.validation-test-servers.nominet.org.uk +nameserver 10.0.1.42 10.0.2.42 diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/localdns.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/localdns.rb new file mode 100644 index 000000000000..73978074f77d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/localdns.rb @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby + +require_relative 'spec_helper' + +require_relative "test_dnsserver" + +class SimpleTCPPipeliningUDPServer < Async::DNS::Server + PORT = 53938 + IP = '127.0.0.1' + + def initialize(**options) + super(options) + + @handlers << TcpPipelineHandler.new(self, IP, PORT) + @handlers << Async::DNS::UDPServerHandler.new(self, IP, PORT) + + end + + def process(name, resource_class, transaction) + @logger.debug "name: #{name}" + transaction.respond!("93.184.216.34", { resource_class: ::Resolv::DNS::Resource::IN::A }) + end + +end + + +if __FILE__ == $0 + RubyDNS::run_server(server_class: SimpleTCPPipeliningUDPServer) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/resolv.conf b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/resolv.conf new file mode 100644 index 000000000000..f1477d8e475d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/resolv.conf @@ -0,0 +1,19 @@ +#-- +#Copyright 2007 Nominet UK +# +#Licensed under the Apache License, Version 2.0 (the "License"); +#you may not use this file except in compliance with the License. +#You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +#Unless required by applicable law or agreed to in writing, software +#distributed under the License is distributed on an "AS IS" BASIS, +#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#See the License for the specific language governing permissions and +#limitations under the License. +#++ + +domain t.dnsruby.validation-test-servers.nominet.org.uk +search dnsruby.validation-test-servers.nominet.org.uk lib.dnsruby.validation-test-servers.nominet.org.uk +nameserver 10.0.1.128 10.0.2.128 diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/run-tests-individually b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/run-tests-individually new file mode 100644 index 000000000000..cd08c45815c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/run-tests-individually @@ -0,0 +1,347 @@ +#!/usr/bin/env ruby + +# Runs each test individually in its own Ruby VM, +# shows output from those that failed, and outputs separate lists +# of the tests that succeeded and those that failed. + +# Suggest you use tee to display while running but save results to a file, e.g.: +# test/run-tests-individually | tee run-tests-individually.out.txt + +test_files = Dir[File.join(File.dirname(__FILE__), 'tc_*.rb')] + +def run_file(filespec) + output = `ruby #{filespec} 2>&1` + return_code = $? + if return_code == 0 + puts "Ok: Test #{filespec} completed successfully" + true + else + puts "Failed: Test #{filespec} failed with the following errors:\n#{output}" + false + end +end + + +successes, failures = test_files.partition { |filespec| run_file(filespec) } + +puts "Successes:\n\n"; puts successes; puts "\n\n" +puts "Failures:\n\n"; puts failures + + +=begin +Sample output: +Ok: Test test/tc_axfr.rb completed successfully +Ok: Test test/tc_cache.rb completed successfully +Failed: Test test/tc_dlv.rb failed with the following errors: +Run options: --seed 19558 + +# Running: + + +TestDlv | R + | 0.00 s +Slowest tests: +2.04 s TestDlv#test_dlv +Slowest suites: +2.04 s TestDlv + + +Finished in 2.040666s, 0.4900 runs/s, 0.4900 assertions/s. + + 1) Error: +TestDlv#test_dlv: +ArgumentError: Can't make sense of nameserver : ns2.nic.se, exception : Dnsruby::NXDomain + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:293:in `rescue in rescue in rescue in resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:256:in `rescue in rescue in resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:252:in `rescue in resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:248:in `resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/packet_sender.rb:230:in `initialize' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:569:in `new' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:569:in `add_server' + test/tc_dlv.rb:42:in `test_dlv' + +1 runs, 1 assertions, 0 failures, 1 errors, 0 skips +Ok: Test test/tc_dns.rb completed successfully +Ok: Test test/tc_dnskey.rb completed successfully +Ok: Test test/tc_ds.rb completed successfully +Ok: Test test/tc_escapedchars.rb completed successfully +Ok: Test test/tc_gpos.rb completed successfully +Ok: Test test/tc_hash.rb completed successfully +Ok: Test test/tc_header.rb completed successfully +Ok: Test test/tc_hip.rb completed successfully +Ok: Test test/tc_hs.rb completed successfully +Ok: Test test/tc_ipseckey.rb completed successfully +Ok: Test test/tc_message.rb completed successfully +Ok: Test test/tc_misc.rb completed successfully +Ok: Test test/tc_name.rb completed successfully +Ok: Test test/tc_naptr.rb completed successfully +Ok: Test test/tc_nsec.rb completed successfully +Ok: Test test/tc_nsec3.rb completed successfully +Ok: Test test/tc_nsec3param.rb completed successfully +Ok: Test test/tc_nxt.rb completed successfully +Ok: Test test/tc_packet.rb completed successfully +Ok: Test test/tc_packet_unique_push.rb completed successfully +Ok: Test test/tc_ptrin.rb completed successfully +Ok: Test test/tc_question.rb completed successfully +Ok: Test test/tc_queue.rb completed successfully +Ok: Test test/tc_recur.rb completed successfully +Ok: Test test/tc_res_config.rb completed successfully +Failed: Test test/tc_res_env.rb failed with the following errors: +Run options: --seed 61787 + +# Running: + + +TestResolverEnv | F + | 0.00 s +Slowest tests: +0.00 s TestResolverEnv#test_res_env +Slowest suites: +0.00 s TestResolverEnv + + +Finished in 0.002247s, 445.0378 runs/s, 1335.1135 assertions/s. + + 1) Failure: +TestResolverEnv#test_res_env [test/tc_res_env.rb:38]: +Nameserver set correctly. +Expected: "10.128.128.128" + Actual: "10.0.1.128" + +1 runs, 3 assertions, 1 failures, 0 errors, 0 skips +Ok: Test test/tc_res_file.rb completed successfully +Ok: Test test/tc_res_opt.rb completed successfully +Ok: Test test/tc_resolv.rb completed successfully +Ok: Test test/tc_resolver.rb completed successfully +Ok: Test test/tc_rr-opt.rb completed successfully +Ok: Test test/tc_rr-txt.rb completed successfully +Ok: Test test/tc_rr-unknown.rb completed successfully +Ok: Test test/tc_rr.rb completed successfully +Ok: Test test/tc_rrset.rb completed successfully +Ok: Test test/tc_rrsig.rb completed successfully +Ok: Test test/tc_single_resolver.rb completed successfully +Failed: Test test/tc_soak.rb failed with the following errors: +Run options: --seed 6029 + +# Running: + + +TestSingleResolverSoak | RRRRRRRRtest/tc_soak.rb:283:in `create_default_single_resolver': uninitialized constant TestSingleResolverSoak::SingleResolver (NameError) +Did you mean? SingleForwardable + from test/tc_soak.rb:243:in `block (2 levels) in test_many_threads_on_many_single_resolvers' +Ok: Test test/tc_soak_base.rb completed successfully +Ok: Test test/tc_sshfp.rb completed successfully +Ok: Test test/tc_tcp.rb completed successfully +Ok: Test test/tc_tcp_pipelining.rb completed successfully +Ok: Test test/tc_tkey.rb completed successfully +Failed: Test test/tc_tsig.rb failed with the following errors: +Run options: --seed 20864 + +# Running: + + +TestTSig | R..R + | 11.87 s +Slowest tests: +11.87 s TestTSig#test_signed_update +10.74 s TestTSig#test_signed_zone_transfer +0.00 s TestTSig#test_bad_tsig +0.00 s TestTSig#test_message_signing +Slowest suites: +22.62 s TestTSig + + +Finished in 22.616872s, 0.1769 runs/s, 0.3095 assertions/s. + + 1) Error: +TestTSig#test_signed_zone_transfer: +ArgumentError: Can't make sense of nameserver : ns0.validation-test-servers.nominet.org.uk, exception : undefined method `answer' for nil:NilClass + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:293:in `rescue in rescue in rescue in resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:256:in `rescue in rescue in resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:252:in `rescue in resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:248:in `resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/zone_transfer.rb:94:in `block in transfer' + /Users/kbennett/work/dnsruby/lib/dnsruby/zone_transfer.rb:92:in `each' + /Users/kbennett/work/dnsruby/lib/dnsruby/zone_transfer.rb:92:in `transfer' + test/tc_tsig.rb:189:in `axfr' + test/tc_tsig.rb:180:in `test_signed_zone_transfer' + + + 2) Error: +TestTSig#test_signed_update: +ArgumentError: Can't make sense of nameserver : , exception : Nameserver invalid! + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:293:in `rescue in rescue in rescue in resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:256:in `rescue in rescue in resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:252:in `rescue in resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/config.rb:248:in `resolve_server' + /Users/kbennett/work/dnsruby/lib/dnsruby/packet_sender.rb:230:in `initialize' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:488:in `new' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:488:in `block (2 levels) in add_config_nameservers' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:487:in `each' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:487:in `block in add_config_nameservers' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:485:in `synchronize' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:485:in `add_config_nameservers' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:514:in `set_config_nameserver' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:469:in `initialize' + test/tc_tsig.rb:69:in `new' + test/tc_tsig.rb:69:in `run_test_client_signs' + test/tc_tsig.rb:31:in `test_signed_update' + +4 runs, 7 assertions, 0 failures, 2 errors, 0 skips +Ok: Test test/tc_update.rb completed successfully +Failed: Test test/tc_validator.rb failed with the following errors: +Run options: --seed 12765 + +# Running: + +Test EventType API! + +TestValidator | .RRTest validation configuration options! +. + | 10.05 s +Slowest tests: +5.05 s TestValidator#test_validation +5.01 s TestValidator#test_resolver_cd_validation_fails +0.00 s TestValidator#test_eventtype_api +0.00 s TestValidator#test_config_api +Slowest suites: +10.05 s TestValidator + + +Finished in 10.054978s, 0.3978 runs/s, 0.0000 assertions/s. + + 1) Error: +TestValidator#test_resolver_cd_validation_fails: +Dnsruby::ResolvTimeout: Query timed out + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:257:in `send_message' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:203:in `query' + test/tc_validator.rb:52:in `test_resolver_cd_validation_fails' + + + 2) Error: +TestValidator#test_validation: +Dnsruby::ResolvTimeout: Query timed out + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:257:in `send_message' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:203:in `query' + test/tc_validator.rb:40:in `test_validation' + +4 runs, 0 assertions, 0 failures, 2 errors, 0 skips +Failed: Test test/tc_verifier.rb failed with the following errors: +Run options: --seed 23316 + +# Running: + + +VerifierTest | .R.R....RF. + | 14.37 s +Slowest tests: +5.40 s VerifierTest#test_tcp +5.01 s VerifierTest#test_trusted_key +2.01 s VerifierTest#test_expired_keys +1.54 s VerifierTest#test_verify_message_fails +1.21 s VerifierTest#test_dsa +0.41 s VerifierTest#test_sendraw +Slowest suites: +15.91 s VerifierTest + + +Finished in 15.914313s, 0.6912 runs/s, 0.3770 assertions/s. + + 1) Error: +VerifierTest#test_tcp: +Dnsruby::ResolvTimeout: Query timed out + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:257:in `send_message' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:203:in `query' + test/tc_verifier.rb:183:in `test_tcp' + + + 2) Error: +VerifierTest#test_trusted_key: +Dnsruby::ResolvTimeout: Query timed out + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:257:in `send_message' + /Users/kbennett/work/dnsruby/lib/dnsruby/resolver.rb:203:in `query' + test/tc_verifier.rb:125:in `test_trusted_key' + + + 3) Error: +VerifierTest#test_verify_message: +Dnsruby::VerifyError: Failed to verify DNSKEY RRSet + /Users/kbennett/work/dnsruby/lib/dnsruby/single_verifier.rb:277:in `block (2 levels) in verify' + /Users/kbennett/work/dnsruby/lib/dnsruby/single_verifier.rb:275:in `each' + /Users/kbennett/work/dnsruby/lib/dnsruby/single_verifier.rb:275:in `block in verify' + /Users/kbennett/work/dnsruby/lib/dnsruby/message/message.rb:345:in `block in each_section' + /Users/kbennett/work/dnsruby/lib/dnsruby/message/message.rb:345:in `each' + /Users/kbennett/work/dnsruby/lib/dnsruby/message/message.rb:345:in `each_section' + /Users/kbennett/work/dnsruby/lib/dnsruby/single_verifier.rb:261:in `verify' + /Users/kbennett/work/dnsruby/lib/dnsruby/dnssec.rb:293:in `rescue in rescue in verify' + /Users/kbennett/work/dnsruby/lib/dnsruby/dnssec.rb:290:in `rescue in verify' + /Users/kbennett/work/dnsruby/lib/dnsruby/dnssec.rb:287:in `verify' + test/tc_verifier.rb:98:in `test_verify_message' + + + 4) Failure: +VerifierTest#test_dsa [test/tc_verifier.rb:229]: +Expected nil to be truthy. + +11 runs, 6 assertions, 1 failures, 3 errors, 0 skips +Ok: Test test/tc_zone_reader.rb completed successfully +Successes: + +test/tc_axfr.rb +test/tc_cache.rb +test/tc_dns.rb +test/tc_dnskey.rb +test/tc_ds.rb +test/tc_escapedchars.rb +test/tc_gpos.rb +test/tc_hash.rb +test/tc_header.rb +test/tc_hip.rb +test/tc_hs.rb +test/tc_ipseckey.rb +test/tc_message.rb +test/tc_misc.rb +test/tc_name.rb +test/tc_naptr.rb +test/tc_nsec.rb +test/tc_nsec3.rb +test/tc_nsec3param.rb +test/tc_nxt.rb +test/tc_packet.rb +test/tc_packet_unique_push.rb +test/tc_ptrin.rb +test/tc_question.rb +test/tc_queue.rb +test/tc_recur.rb +test/tc_res_config.rb +test/tc_res_file.rb +test/tc_res_opt.rb +test/tc_resolv.rb +test/tc_resolver.rb +test/tc_rr-opt.rb +test/tc_rr-txt.rb +test/tc_rr-unknown.rb +test/tc_rr.rb +test/tc_rrset.rb +test/tc_rrsig.rb +test/tc_single_resolver.rb +test/tc_soak_base.rb +test/tc_sshfp.rb +test/tc_tcp.rb +test/tc_tcp_pipelining.rb +test/tc_tkey.rb +test/tc_update.rb +test/tc_zone_reader.rb + + +Failures: + +test/tc_dlv.rb +test/tc_res_env.rb +test/tc_soak.rb +test/tc_tsig.rb +test/tc_validator.rb +test/tc_verifier.rb + +=end + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/spec_helper.rb new file mode 100644 index 000000000000..e7e9b45a7618 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/spec_helper.rb @@ -0,0 +1,35 @@ +if ENV['RUN_EXTRA_TASK'] == 'TRUE' + require 'coveralls' + Coveralls.wear! + + require 'simplecov' + + # SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new( + # [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter]) + SimpleCov.formatter = Coveralls::SimpleCov::Formatter + SimpleCov.start do + add_filter 'test/' + end +end + +require 'minitest' +require 'minitest/autorun' +require 'minitest/display' + +MiniTest::Display.options = { + suite_names: true, + color: true, + print: { + success: ".", + failure: "F", + error: "R" + } +} +# This is in a self invoking anonymous lambda so local variables do not +# leak to the outer scope. +-> do + load_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')) + $LOAD_PATH.unshift(load_dir) unless $LOAD_PATH.include?(load_dir) + require_relative '../lib/dnsruby' + require_relative 'test_utils' +end.() diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_axfr.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_axfr.rb new file mode 100644 index 000000000000..a199400c03f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_axfr.rb @@ -0,0 +1,45 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestAxfr < Minitest::Test + def test_axfr + zt = Dnsruby::ZoneTransfer.new + zt.transfer_type = Dnsruby::Types.AXFR + zt.server = 'nsztm1.digi.ninja' + + if contactable?(zt.server) + zone = zt.transfer('zonetransfer.me') + assert(zone.length > 0) + assert_nil(zt.last_tsigstate) + end + end + + def contactable?(server) + begin + sock = UDPSocket.new + sock.connect(server, 25) + sock.close + true + rescue Exception + false + end + end + + # NB - test_ixfr is in tc_tsig.rg - this is becuase it requires + # TSIG to make an update (which we can then test for with ixfr) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_caa.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_caa.rb new file mode 100644 index 000000000000..80a4b968df71 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_caa.rb @@ -0,0 +1,48 @@ + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestCAA < Minitest::Test + + include Dnsruby + + def test_caa + {'foo.com. IN CAA 0 issue "ca.example.net"' => [0, 'issue', 'ca.example.net'], + 'foo.com. IN CAA 1 issue "ca.example.net"' => [1, 'issue', 'ca.example.net'], + 'foo.com. IN CAA 0 issuewild "ca.example.net"' => [0, 'issuewild', 'ca.example.net'], + 'foo.com. IN CAA 0 iodef "mailto:security@example.com"' => [0, 'iodef', 'mailto:security@example.com'], + 'foo.com. IN CAA 0 issue "ca.example.net; account=230123"' => [0, 'issue', 'ca.example.net; account=230123'] + }.each do |text, data| + caa = RR.create(text) + assert_equal(data[0], caa.flag) + assert_equal(data[1], caa.property_tag) + assert_equal(data[2], caa.property_value) + m = Dnsruby::Message.new + m.add_additional(caa) + data = m.encode + m2 = Dnsruby::Message.decode(data) + caa2 = m2.additional()[0] + assert(caa.flag == caa2.flag) + assert(caa.property_tag == caa2.property_tag) + assert(caa.property_value == caa2.property_value) + assert(caa == caa2) + end + end + +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_cache.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_cache.rb new file mode 100644 index 000000000000..a81078dfacf6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_cache.rb @@ -0,0 +1,153 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestCache < Minitest::Test + + include Dnsruby + + def test_cache + cache = Cache.new + m1 = Message.new("example.com.", Types.A, Classes.IN) + rr1 = RR.create("example.com. 3 IN A 208.77.188.166") + m1.add_answer(rr1) + m1.header.aa = true + assert(!m1.cached) + cache.add(m1) + ret = cache.find("example.com", "A") + assert(ret.cached) + assert(ret.answer.rrset("example.com", "A").to_s == m1.answer.rrset("example.com", "A").to_s, "#{m1.answer.rrset("example.com", "A").to_s}end\n#{ret.answer.rrset("example.com", "A").to_s}end" ) + assert(ret.header.aa == false) + assert(ret.answer.rrsets()[0].ttl == 3) + sleep(1) + ret = cache.find("example.com", "A") + assert(ret.cached) + assert((ret.answer.rrsets()[0].ttl == 2) || (ret.answer.rrsets()[0].ttl == 1), "ttl = #{ret.answer.rrsets()[0].ttl}") + assert(ret.answer != m1.answer, "ret.answer=#{ret.answer}\nm1.answer=#{m1.answer}" ) + assert(ret.header.aa == false) + sleep(2) # TTL of 3 should have timed out now + ret = cache.find("example.com", "A") + assert(!ret) + cache.add(m1) + m2 = Message.new("example.com.", Types.A, Classes.IN) + rr2 = RR.create("example.com. 200 IN A 208.77.188.166") + m2.add_answer(rr2) + m2.header.aa = true + cache.add(m2) + ret = cache.find("example.com", "A") + assert(ret.cached) + assert(ret.answer.rrsets()[0].ttl == 200) + end + + def test_opt_record + # Create a very large message, encode it and decode it - there should be an opt record + # test getting that in and out the cache + # We should be able to do this in the online test by getting back a very big + # record from the test zone + end + + def test_negative + + end + + def test_cache_max_size + Dnsruby::Cache.max_size=1 + res = Resolver.new() + Dnsruby::PacketSender.clear_caches() + assert(Dnsruby::PacketSender.recursive_cache_length == 0) + msg = res.query("example.com") + assert(!msg.cached) + assert(Dnsruby::PacketSender.recursive_cache_length == 1) + msg = res.query("example.com") + assert(msg.cached) + assert(Dnsruby::PacketSender.recursive_cache_length == 1) + msg = res.query("google.com") + assert(!msg.cached) + assert(Dnsruby::PacketSender.recursive_cache_length == 1) + msg = res.query("example.com") + assert(!msg.cached) + assert(Dnsruby::PacketSender.recursive_cache_length == 1) + Dnsruby::Cache.max_size=2 + assert(Dnsruby::PacketSender.recursive_cache_length == 1) + msg = res.query("example.com") + assert(msg.cached) + assert(Dnsruby::PacketSender.recursive_cache_length == 1) + msg = res.query("google.com") + assert(!msg.cached) + assert(Dnsruby::PacketSender.recursive_cache_length == 2) + end + + def test_resolver_do_caching + # Get the records back from the test zone + Dnsruby::PacketSender.clear_caches + res = Resolver.new() + res.do_caching = false + assert(!res.do_caching) + ret = res.query("example.com") + assert(!ret.cached) + assert(ret.rcode == RCode.NoError) + # Wait a while + sleep(1) + # Ask for the same records + ret = res.query("example.com") + assert(ret.rcode == RCode.NoError) + assert(!ret.cached) + end + + def test_online + # Get the records back from the test zone + Dnsruby::PacketSender.clear_caches + Dnsruby::Recursor.clear_caches + res = SingleResolver.new("ns.nlnetlabs.nl.") + # res = SingleResolver.new("ns0.validation-test-servers.nominet.org.uk.") + res.udp_size = 4096 + query = Message.new("net-dns.org", Types.TXT) + # query = Message.new("overflow.dnsruby.validation-test-servers.nominet.org.uk", Types.TXT) + ret = res.send_message(query) +# print "#{ret}\n" + assert(!ret.cached) + assert(ret.rcode == RCode.NoError) + assert(ret.header.aa) + # Store the ttls + first_ttls = ret.answer.rrset( + "net-dns.org", Types.TXT).ttl + # "overflow.dnsruby.validation-test-servers.nominet.org.uk", Types.TXT).ttl + # Wait a while + sleep(1) + # Ask for the same records + query = Message.new("net-dns.org", Types.TXT) + # query = Message.new("overflow.dnsruby.validation-test-servers.nominet.org.uk", Types.TXT) + ret = res.send_message(query) +# print "#{ret}\n" + assert(ret.rcode == RCode.NoError) + assert(ret.cached) + second_ttls = ret.answer.rrset( + "net-dns.org", Types.TXT).ttl + # "overflow.dnsruby.validation-test-servers.nominet.org.uk", Types.TXT).ttl + # make sure the ttl is less the time we waited + assert((second_ttls == first_ttls - 1) || (second_ttls == first_ttls - 2), + "First ttl = #{first_ttls}, second = #{second_ttls}\n") + # make sure the header flags (and ID) are right + assert(ret.header.id == query.header.id, "First id = #{query.header.id}, cached response was #{ret.header.id}\n") + assert(!ret.header.aa) + end + + def test_online_uncached + # @TODO@ Check that wildcard queries are not cached + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_dlv.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_dlv.rb new file mode 100644 index 000000000000..76b181413254 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_dlv.rb @@ -0,0 +1,78 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestDlv < Minitest::Test + + include Dnsruby + + def test_dlv + # Enable DLV (only) for validation. + # Try to validate some records which can only be done through dlv + # OK - if we don't configure trust anchors, and there is no signed root, then this is easy! + Dnsruby::Dnssec.clear_trusted_keys + Dnsruby::Dnssec.clear_trust_anchors + Dnsruby::PacketSender.clear_caches +# Dnssec.do_validation_with_recursor(true) + # @TODO@ Should use whole RRSet of authoritative NS for these resolvers, + # not individual servers! + res = Dnsruby::Resolver.new("a.ns.se") + res.add_server("b.ns.se") + res.dnssec=true + ret = res.query("se.", Dnsruby::Types.ANY) +# assert(ret.security_level == Dnsruby::Message::SecurityLevel::INSECURE) +# With no keys configured, checking will not be performed + assert(ret.security_level == Dnsruby::Message::SecurityLevel::UNCHECKED) + + res = Dnsruby::Resolver.new("ns3.nic.se") + res.add_server("ns2.nic.se") + res.dnssec = true + ret = res.query("ns2.nic.se", Dnsruby::Types.A) + assert(ret.security_level == Dnsruby::Message::SecurityLevel::UNCHECKED) + + # Load DLV key + dlv_key = RR.create("dlv.isc.org. IN DNSKEY 257 3 5 BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2 brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5 ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt TDN0YUuWrBNh") + Dnssec.add_dlv_key(dlv_key) + Dnsruby::PacketSender.clear_caches + + + # SE no longer in DLV +# res = Dnsruby::Recursor.new() +# ret = res.query("ns2.nic.se", Dnsruby::Types.A) +# assert(ret.security_level == Dnsruby::Message::SecurityLevel::SECURE) + + # .cz no longer in dlv? +# ret = res.query("b.ns.nic.cz", Dnsruby::Types.A) +# assert(ret.security_level == Dnsruby::Message::SecurityLevel::SECURE) + + # Test .gov +# Dnsruby::TheLog.level = Logger::DEBUG +res = Resolver.new + ret = res.query("nih.gov", "NS") + assert(ret.security_level = Dnsruby::Message::SecurityLevel::SECURE) + end + + # se no longer in dlv +# def test_scrub_non_authoritative +# # Dnssec.do_validation_with_recursor(true) +# res = Dnsruby::Recursor.new() +# ret = res.query("frobbit.se") +# res.prune_rrsets_to_rfc5452(ret, "frobbit.se.") +# Dnssec.validate(ret) +# assert(ret.security_level == Dnsruby::Message::SecurityLevel::SECURE) +# end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_dns.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_dns.rb new file mode 100644 index 000000000000..e3ae1e040f3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_dns.rb @@ -0,0 +1,262 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestDNS < Minitest::Test + + include Dnsruby + + def setup + Dnsruby::Config.reset + end + + def test_ipv4_address + Dnsruby::DNS.open { |dns| dns.getnames(Dnsruby::IPv4.create("221.186.184.68")) } + end + + # def test_resolv_rb_api + # DNS.open {|dns| + # # dns.getresources("www.ruby-lang.org", Types.A).each {|r| assert_equal(r.address.to_s, "221.186.184.68")} + # dns.getresources("www.ruby-lang.org", Types.A).each {|r| assert_equal(r.address.to_s, "54.163.249.195")} + # r= dns.getresources("ruby-lang.org", Types.MX, Classes.IN).collect {|r| [r.exchange.to_s, r.preference]} + # assert_equal(r, [["carbon.ruby-lang.org", 10]]) + # } + # d = DNS.open + # # d.getresources("www.ruby-lang.org", Types.A, Classes.IN).each {|r| assert_equal(r.address.to_s, "221.186.184.68")} + # d.getresources("www.ruby-lang.org", Types.A, Classes.IN).each {|r| assert_equal(r.address.to_s, "54.163.249.195")} + # assert_equal(d.getaddress("www.ruby-lang.org").to_s, "54.163.249.195") + # # assert_equal(d.getaddress("www.ruby-lang.org").to_s, "221.186.184.68") + # r = d.getaddresses("www.ruby-lang.org") + # assert_equal(r.length, 1) + # assert_equal(r[0].to_s, "221.186.184.68") + # d.each_address("www.ruby-lang.org") {|address| assert_equal(address.to_s, "54.163.249.195")} + # # d.each_address("www.ruby-lang.org") {|address| assert_equal(address.to_s, "221.186.184.68")} + # assert_equal(d.getname("210.251.121.214").to_s, "ci.ruby-lang.org") + # r = d.getnames("210.251.121.214") + # assert_equal(r.length, 1) + # assert_equal(r[0].to_s, "ci.ruby-lang.org") + # d.each_name("210.251.121.214") {|name| assert_equal(name.to_s, "ci.ruby-lang.org")} + # r = d.getresource("www.ruby-lang.org", Types.A) + # assert_equal(r.name.to_s, "carbon.ruby-lang.org") + # assert_equal(r.address.to_s, "221.186.184.68") + # assert_equal(r.klass, Classes.IN) + # assert_equal(r.type, Types.A) + # r = d.getresources("www.ruby-lang.org", Types.MX) + # assert(r.length==1) + # assert_equal(r[0].name.to_s, "carbon.ruby-lang.org") + # assert_equal(r[0].preference, 10) + # assert_equal(r[0].exchange.to_s, "carbon.ruby-lang.org") + # assert_equal(r[0].klass, Classes.IN) + # assert_equal(r[0].type, Types.MX) + # r = d.each_resource("www.ruby-lang.org", Types.ANY) {|r| + # assert_equal(r.name.to_s, "www.ruby-lang.org") + # assert_equal(r.domainname.to_s, "carbon.ruby-lang.org") + # assert_equal(r.klass, Classes.IN) + # assert_equal(r.type, Types.CNAME) + # } + # d.close + # end + + def test_async_api + # @TODO@ Do we really want an async API for Resolv/DNS? + # Or would users be better off with Resolver async API? + end + + def test_concurrent + # @TODO@ What kind of concurrent testing are we going to do on the top-level API? + end + + def test_bad_input + # + # Check that new() is vetting things properly. + # + Dnsruby.log.level=Logger::FATAL + [:nameserver].each do |test| +# [{}, 'kjghdfkjhase',1,'\1',nil].each do |input| +# Config now only checks that an IPv4, IPv6 or Name can be made with each input + [{},1,nil].each do |input| + res=nil + begin + res = Dnsruby::DNS.new({test => input}) + assert(false, "Accepted invalid input") + rescue + assert(res==nil, "No resolver should be returned for #{test} = #{input}") + end + end + end + end + + def test_online + res = DNS.new + rrs = [ + { + :type => Types.A, + :name => 'a.t.net-dns.org', + # :name => 'a.t.dnsruby.validation-test-servers.nominet.org.uk', + :address => '10.0.1.128' + }, + { + :type => Types::MX, + :name => 'mx.t.net-dns.org', + :exchange => 'a.t.net-dns.org', + # :name => 'mx.t.dnsruby.validation-test-servers.nominet.org.uk', + # :exchange => 'a.t.dnsruby.validation-test-servers.nominet.org.uk', + :preference => 10 + }, + { + :type => 'CNAME', + :name => 'cname.t.net-dns.org', + :domainname => 'a.t.net-dns.org' + # :name => 'cname.t.dnsruby.validation-test-servers.nominet.org.uk', + # :domainname => 'a.t.dnsruby.validation-test-servers.nominet.org.uk' + }, + { + :type => Types.TXT, + :name => 'txt.t.net-dns.org', + # :name => 'txt.t.dnsruby.validation-test-servers.nominet.org.uk', + :strings => ['Net-DNS'] + } + ] + + rrs.each do |data| + answer = res.getresource(data[:name], data[:type]) + assert(answer) + assert_equal(answer.klass, 'IN', 'Class correct' ) + + packet, queried_name = res.send_query(data[:name], data[:type]) + + assert(packet, "Got an answer for #{data[:name]} IN #{data[:type]}") + assert_equal(1, packet.header.qdcount, 'Only one question') + # assert_equal(1, answer.length, 'Got single answer') + + question = (packet.question)[0] + answer = (packet.answer)[0] + + assert(question, 'Got question' ) + assert_equal(data[:name], question.qname.to_s, 'Question has right name' ) + assert_equal(data[:name], queried_name.to_s, 'queried_name has right name' ) + assert_equal(Types.new(data[:type]), question.qtype, 'Question has right type' ) + assert_equal('IN', question.qclass.string, 'Question has right class') + + assert(answer) + assert_equal(answer.klass, 'IN', 'Class correct' ) + + + data.keys.each do |meth| + if (meth == :type) + assert_equal(Types.new(data[meth]).to_s, answer.send(meth).to_s, "#{meth} correct (#{data[:name]})") + else + assert_equal(data[meth].to_s, answer.send(meth).to_s, "#{meth} correct (#{data[:name]})") + end + end + end # do + end # test_online + + def test_search_query_reverse + # + # test that getname() DTRT with reverse lookups + # + tests = [ + { + :ip => '198.41.0.4', + :host => 'a.root-servers.net', + }, + { + :ip => '2001:500:1::803f:235', + :host => 'h.root-servers.net', + }, + ] + + res = DNS.new + tests.each do |test| + name = res.getname(test[:ip]) + + assert_instance_of(Name,name) + + next unless name + + assert_equal(name.to_s, test[:host], "getname(#{test[:ip]}) works") + end # do + end # test + + def test_searchlist + res = DNS.new( + :domain => 't.net-dns.org', + :search => ["t.net-dns.org", "net-dns.org"] + # :domain => 't.dnsruby.validation-test-servers.nominet.org.uk', + # :search => ["t.dnsruby.validation-test-servers.nominet.org.uk", "dnsruby.validation-test-servers.nominet.org.uk"] + ) + + # + # test the send_query() appends the default domain and + # searchlist correctly. + # + # @TODO@ Should really be done in Config test! + + tests = [ + { + :method => 'search', + :name => 'a' + }, + { + :method => 'search', + :name => 'a.t' + }, + { + :method => 'query', + :name => 'a' + } + ] + + # res.send_query("a.t.dnsruby.validation-test-servers.nominet.org.uk", "A") + res.send_query("a.t.net-dns.org", "A") + res.config.ndots=2 + + tests.each do |test| + method = test[:method] + + if (method=="query") + res.config.apply_search_list=false + else + res.config.apply_search_list=true + end + + ans, query = res.send_query(test[:name]) + + assert_instance_of(Message, ans) + + # assert_equal(2, ans.header.ancount, "Correct answer count (with persistent socket and #{method})") + + a = ans.answer + + assert_instance_of(RR::IN::A, a[0]) + assert_equal(a[0].name.to_s, 'a.t.net-dns.org',"Correct name (with persistent socket and #{method})") + # assert_equal(a[0].name.to_s, 'a.t.dnsruby.validation-test-servers.nominet.org.uk',"Correct name (with persistent socket and #{method})") + end + end + + def test_port + d = DNS.new({:port => 5353}) + assert(d.to_s.include?"5353") + end + + def test_port_nil + d = DNS.new({:port => nil}) + assert(d.to_s.include? Dnsruby::Config::DEFAULT_PORT.to_s) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_dnskey.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_dnskey.rb new file mode 100644 index 000000000000..dde7d2ff767d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_dnskey.rb @@ -0,0 +1,117 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class DnskeyTest < Minitest::Test + INPUT = "example.com. 86400 IN DNSKEY 256 3 5 ( AQPSKmynfzW4kyBv015MUG2DeIQ3" + + "Cbl+BBZH4b/0PY1kxkmvHjcZc8no" + + "kfzj31GajIQKY+5CptLr3buXA10h" + + "WqTkF7H6RfoRqXQeogmMHfpftf6z" + + "Mv1LyBUgia7za6ZEzOJBOztyvhjL" + + "742iU/TpPSEDhm2SNKLijfUppn1U" + + "aNvv4w== )" + BADINPUT = "example.com. 86400 IN DNSKEY 384 3 5 ( AQPSKmynfzW4kyBv015MUG2DeIQ3" + + "Cbl+BBZH4b/0PY1kxkmvHjcZc8no" + + "kfzj31GajIQKY+5CptLr3buXA10h" + + "WqTkF7H6RfoRqXQeogmMHfpftf6z" + + "Mv1LyBUgia7za6ZEzOJBOztyvhjL" + + "742iU/TpPSEDhm2SNKLijfUppn1U" + + "aNvv4w== )" + # def test_bad_flag + # dnskey = Dnsruby::RR.create(BADINPUT) + # assert_equal(384, dnskey.flags) + # assert(dnskey.bad_flags?) + # end + def test_dnskey_from_string + dnskey = Dnsruby::RR.create(INPUT) + # assert(!dnskey.bad_flags?) + assert_equal(3, dnskey.protocol) + assert_equal(256, dnskey.flags) + assert_equal(Dnsruby::Algorithms::RSASHA1, dnskey.algorithm) + assert_equal(Dnsruby::RR::DNSKEY::ZONE_KEY, dnskey.flags & Dnsruby::RR::DNSKEY::ZONE_KEY) + assert_equal(0, dnskey.flags & Dnsruby::RR::DNSKEY::SEP_KEY) + + dnskey2 = Dnsruby::RR.create(dnskey.to_s) + assert(dnskey2.to_s == dnskey.to_s, "#{dnskey.to_s} not equal to \n#{dnskey2.to_s}") + end + + def test_from_string_with_comments + k = Dnsruby::RR.create("tjeb.nl. 3600 IN DNSKEY 256 3 7 AwEAAcglEOS7bECRK5fqTuGTMJycmDhTzmUu/EQbAhKJOYJxDb5SG/RYqsJgzG7wgtGy0W1aP7I4k6SPtHmwcqjLaZLVUwRNWCGr2adjb9JTFyBR7F99Ngi11lEGM6Uiw/eDRk66lhoSGzohjj/rmhRTV6gN2+0ADPnafv3MBkPgryA3 ;{id = 53177 (zsk), size = 1024b}") + assert_equal(53177, k.key_tag) + end + + def test_dnskey_from_data + dnskey = Dnsruby::RR.create(INPUT) + m = Dnsruby::Message.new + m.add_additional(dnskey) + data = m.encode + m2 = Dnsruby::Message.decode(data) + dnskey3 = m2.additional()[0] + assert_equal(dnskey.to_s, dnskey3.to_s) + end + + def test_bad_values + dnskey = Dnsruby::RR.create(INPUT) + begin + dnskey.protocol=4 + fail() + rescue Dnsruby::DecodeError + end + dnskey.flags=4 + assert_equal(4, dnskey.flags) + assert(dnskey.flags == 4) + dnskey.flags=256 + assert_equal(256, dnskey.flags) +# assert(!dnskey.bad_flags?) + dnskey.flags=257 + assert_equal(257, dnskey.flags) +# assert(!dnskey.bad_flags?) + dnskey.flags=1 + assert_equal(1, dnskey.flags) + dnskey.protocol=3 + + end + + def test_ecdsa_integrity + ecdsa_256_pub = 'example.com. 3600 IN DNSKEY 256 3 13 ( oJMRESz5E4gYzS/q6XD' + + 'rvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA== )' + + dnskey = Dnsruby::RR.create(ecdsa_256_pub) + assert_equal(3, dnskey.protocol) + assert_equal(256, dnskey.flags) + assert_equal(Dnsruby::Algorithms::ECDSAP256SHA256, dnskey.algorithm) + assert_equal(Dnsruby::RR::DNSKEY::ZONE_KEY, dnskey.flags & Dnsruby::RR::DNSKEY::ZONE_KEY) + assert_equal(0, dnskey.flags & Dnsruby::RR::DNSKEY::SEP_KEY) + + dnskey2 = Dnsruby::RR.create(dnskey.to_s) + assert(dnskey2.to_s == dnskey.to_s, "#{dnskey} not equal to \n#{dnskey2}") + + ecdsa_384_pub = 'example.com. 3600 IN DNSKEY 256 3 14 ( Bl2HDw98sGin4lNlx7n' + + 'QX3w98jx6UhAgC73Jq+6LFlD12gnVTMHecM8Z GoTFSh+mV+qEPFZ5s3NbC4qvwUW0kkPb+0ip' + + 'CuLRwZYhYKk7D+RDb+fX XozI9hhZrsXBcEhss )' + + dnskey = Dnsruby::RR.create(ecdsa_384_pub) + assert_equal(3, dnskey.protocol) + assert_equal(256, dnskey.flags) + assert_equal(Dnsruby::Algorithms::ECDSAP384SHA384, dnskey.algorithm) + assert_equal(Dnsruby::RR::DNSKEY::ZONE_KEY, dnskey.flags & Dnsruby::RR::DNSKEY::ZONE_KEY) + assert_equal(0, dnskey.flags & Dnsruby::RR::DNSKEY::SEP_KEY) + + dnskey2 = Dnsruby::RR.create(dnskey.to_s) + assert(dnskey2.to_s == dnskey.to_s, "#{dnskey} not equal to \n#{dnskey2}") + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_ds.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_ds.rb new file mode 100644 index 000000000000..eebf297c7662 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_ds.rb @@ -0,0 +1,107 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +require 'openssl' +require 'digest/sha2' + +class DsTest < Minitest::Test + + include Dnsruby + + DLVINPUT = "dskey.example.com. 86400 IN DLV 60485 5 1 ( 2BB183AF5F22588179A53B0A" + + "98631FAD1A292118 )" + INPUT = "dskey.example.com. 86400 IN DS 60485 5 1 ( 2BB183AF5F22588179A53B0A" + + "98631FAD1A292118 )" + DNSKEY = "dskey.example.com. 86400 IN DNSKEY 256 3 5 ( AQOeiiR0GOMYkDshWoSKz9Xz" + + "fwJr1AYtsmx3TGkJaNXVbfi/" + + "2pHm822aJ5iI9BMzNXxeYCmZ"+ + "DRD99WYwYqUSdjMmmAphXdvx"+ + "egXd/M5+X7OrzKBaMbCVdFLU"+ + "Uh6DhweJBjEVv5f2wwjM9Xzc"+ + "nOf+EPbtG9DMBmADjFDc2w/r"+ + "ljwvFw== )" # key id = 60485 + DS1 = "dskey.example.com. 86400 IN DS 60485 5 1 ( 2BB183AF5F22588179A53B0A"+ + "98631FAD1A292118 )" + DS2 = "dskey.example.com. 86400 IN DS 60485 5 2 ( D4B7D520E7BB5F0F67674A0C"+ + "CEB1E3E0614B93C4F9E99B83"+ + "83F6A1E4469DA50A )" + + def test_ds_from_string + ds = Dnsruby::RR.create(INPUT) + assert_equal(60485, ds.key_tag) + assert_equal(Algorithms.RSASHA1, ds.algorithm) + assert_equal(1, ds.digest_type) + assert_equal("2BB183AF5F22588179A53B0A98631FAD1A292118", ds.digest) + + ds2 = Dnsruby::RR.create(ds.to_s) + assert(ds2.to_s == ds.to_s) + end + + def test_ds_from_data + ds = Dnsruby::RR.create(INPUT) + m = Dnsruby::Message.new + m.add_additional(ds) + data = m.encode + m2 = Dnsruby::Message.decode(data) + ds3 = m2.additional()[0] + assert_equal(ds.to_s, ds3.to_s) + end + + def test_ds_values + ds = Dnsruby::RR.create(INPUT) + ds.digest_type = 2 + # Be liberal in what you accept... +# begin +# ds.digest_type = 3 +# fail +# +# rescue DecodeError +# end + end + + def test_ds_digest + key = Dnsruby::RR.create(DNSKEY) + + # and check it is the same as DS + right_ds = Dnsruby::RR.create(DS1) + ds = Dnsruby::RR::DS.from_key(key, 1); + assert_equal(ds.to_s, right_ds.to_s) + end + + def test_sha2 + # Create a new DS from the DNSKEY, + key = Dnsruby::RR.create(DNSKEY) + + # and check it is the same as DS + right_ds = Dnsruby::RR.create(DS2) + ds = Dnsruby::RR::DS.from_key(key, 2); + assert_equal(ds.to_s, right_ds.to_s) + end + + def test_dlv_from_string + dlv = Dnsruby::RR.create(DLVINPUT) + assert_equal(60485, dlv.key_tag) + assert_equal(Algorithms.RSASHA1, dlv.algorithm) + assert_equal(1, dlv.digest_type) + assert_equal("2BB183AF5F22588179A53B0A98631FAD1A292118", dlv.digest) + + dlv2 = Dnsruby::RR.create(dlv.to_s) + assert(dlv2.to_s == dlv.to_s) + end + +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_encoding.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_encoding.rb new file mode 100644 index 000000000000..4cb695d8cbdc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_encoding.rb @@ -0,0 +1,31 @@ +require_relative 'spec_helper' + +require 'socket' + +# @TODO@ We also need a test server so we can control behaviour of server to test +# different aspects of retry strategy. +# Of course, with Ruby's limit of 256 open sockets per process, we'd need to run +# the server in a different Ruby process. + +class TestEncoding < Minitest::Test + + include Dnsruby + + Thread::abort_on_exception = true + + Dnsruby::TheLog.level = Logger::DEBUG + + + def test_cdnskey + rrString = "tjeb.nl.\t3600\tIN\tCDNSKEY\t256 3 RSASHA1-NSEC3-SHA1 ( AwEAAcglEOS7bECRK5fqTuGTMJycmDhTzmUu/EQbAhKJOYJxDb5SG/RYqsJgzG7wgtGy0W1aP7I4k6SPtHmwcqjLaZLVUwRNWCGr2adjb9JTFyBR7F99Ngi11lEGM6Uiw/eDRk66lhoSGzohjj/rmhRTV6gN2+0ADPnafv3MBkPgryA3 ) ; key_tag=53177" + rr = RR.create(rrString) + puts rr + puts rrString + assert(rrString.to_s == rr.to_s) + m = Dnsruby::Message.new + m.add_additional(rr) + m2 = Message.decode(m.encode) + rr2 = m2.additional()[0] + assert(rr.to_s == rr2.to_s) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_escapedchars.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_escapedchars.rb new file mode 100644 index 000000000000..18854a5a45ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_escapedchars.rb @@ -0,0 +1,487 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestEscapedChars < Minitest::Test + + include Dnsruby + + def test_one + Name::Label.set_max_length(150) + # + # We test al sorts of escaped non-ascii characters. + # This is all to be protocol conform... so to speak. + + # + # The collection of tests is somewhat of a hodgepodge that tried to + # assess sensitivity to combinations of characters that the regular + # expressions and perl itself are sensitive to. (like \\\\\.\..) + # Development versions of the code tried to split a domain name in + # invidual labels by a regular expression. It made no sense to remove + # the more ackward tests as they have to pass anyway ... + + + # Note that in perl the \\ in a presentation format can only be achieved + # through \\\\ . + + # The hex codes are the names in wireformat: + # length octet. content octets, length octet, content , NULL octet + + + # Below are test combos, 1st and 2nd array elements are + # representations of the name. The output of the perl functions should + # yield the 2nd presentation (eg \037 gets presented as % ) + + # The 3rd element is a label count. + # The 4th element represents the number of octets per label + # The 5th element is a hexdump of the domain name in wireformat + + testcombos=[ + ['bla.fo\.o.org', + 'bla.fo\.o.org', + 3, + [3,4,3], + # Wire: 3 b l a 4 f o . o 3 o r g 0 + "03626c6104666f2e6f036f726700" + ], + + [ + 'bla\255.foo.org', + 'bla\255.foo.org', + 3, + [4,3,3], + # Wire: 4 b l a 0xff 3 f o o 3 o r g 0 + "04626c61ff03666f6f036f726700" + ], + + [ + 'bla.f\xa9oo.org', + 'bla.f\169oo.org', + 3, + [3,4,3] , + # Wire: 3 b l a 4 f 0xa9 o o 3 o r g 0 + "03626c610466a96f6f036f726700" + ], # Note hex to decimal + ['bla.fo\.o.org', + 'bla.fo\.o.org', + 3, + [3,4,3], + # Wire: 3 b l a 4 f o . o 3 o r g 0 + "03626c6104666f2e6f036f726700" + ], + + ['bla\0000.foo.org', + 'bla\0000.foo.org', + 3, + [5,3,3], + # Wire: 5 b l a 0x00 0 3 f o o 3 o r g 0 + "05626c61003003666f6f036f726700" , + ], + + ["bla.fo\o.org", + "bla.foo.org", + 3, + [3,3,3], + # Wire: 3 b l a 3 f o o 3 o r g 0 ignoring backslash on input + "03626c6103666f6f036f726700", + ], + # drops the \ + ['bla(*.foo.org', + 'bla\(*.foo.org', + 3, + [5,3,3], + + # Wire: 5 b l a ( * 3 f o o 3 o r g 0 + "05626c61282a03666f6f036f726700" + ], + + [' .bla.foo.org', + '\032.bla.foo.org', + 4, + [1,3,3,3], + "012003626c6103666f6f036f726700", + ], + + ["\\\\a.foo", + "\\\\a.foo", + 2, + [2,3], + # Wire: 2 \ a 3 f o o 0 + "025c6103666f6f00" + ], + + + ['\\\\.foo', + '\\\\.foo', + 2, + [1,3], + # Wire: 1 \ 3 f o o 0 + "015c03666f6f00", + ], + + ['a\\..foo', + 'a\\..foo', + 2, + [2,3], + # Wire: 2 a . 3 f o o 0 + "02612e03666f6f00" + ], + + ['a\\.foo.org', + 'a\\.foo.org', + 2, [5,3], + # Wire: 5 a . f o o 3 o r g 0 + "05612e666f6f036f726700" , + ], + + ['\..foo.org', + '\..foo.org', + 3, + [1,3,3], + + # Wire: 1 . 3 f o o 3 o r g 0 + "012e03666f6f036f726700" , + ], + + [ + '\046.\046', + '\..\.', + 2, + [1,1], + '012e012e00', + ], + + [ # all non \w characters :-) + '\000\001\002\003\004\005\006\007\008\009\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031\032.\033\034\035\036\037\038\039\040\041\042\043\044\045\046\047\048.\058\059\060\061\062\063\064\065.\091\092\093\094\095\096.\123\124\125\126\127\128\129', + '\000\001\002\003\004\005\006\007\008\009\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031\032.!\"#\$%&\'\(\)*+,-\./0.:\;<=>?\@a.[\\\\]^_`.{|}~\127\128\129', + 5, + [33,16,8,6,7], + "21000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20102122232425262728292a2b2c2d2e2f30083a3b3c3d3e3f4061065b5c5d5e5f60077b7c7d7e7f808100", + ], + + ] + + + # foreach my $testinput (@testcombos){ + testcombos.each do |testinput| + # test back and forth + + name = Name.create(testinput[0]) + labels = Name.name2encodedlabels(testinput[0]) + + # assert_equal(testinput[1], Net::labels2name(labels), "consistent name2labels labels2name for " + testinput[0]) +# name_from_labels = Name.encodedlabels2name(labels) + name_from_labels = Name.new(labels) + assert_equal(name.to_s, name_from_labels.to_s, "Name->Labels->Name for " + testinput[0]) + + # test number of labels + assert_equal(testinput[2],labels.length(),"consistent labelcount (#{testinput[2]})") + # test number of elements within label. + i=0 + # Test length of each individual label + while i<testinput[2] + assert_equal(testinput[3][i], labels[i].length, + "labellength for label #{labels[i]} equals " + testinput[3][i].to_s) + i = i + 1 + end + + # wire=Name._name2wire(testinput[0]) + wire=MessageEncoder.new {|msg| + msg.put_name(name, true)}.to_s + + wireinhex=wire.unpack("H*")[0] + assert_equal( testinput[4].to_s, wireinhex.to_s,"Wireinhex for " + testinput[0] ) + # And now call DN_EXPAND + # name,offset=Name.dn_expand(wire,0) + + + MessageDecoder.new(wire) {|msg| + name = msg.get_name} + + assert_equal(name.to_s,testinput[1],"DN_EXPAND (pp) consistent") + end + + # QUESTION SECTION + # \\.eg.secret-wg.org. IN TXT + # + # ANSWER SECTION: + # \\.eg.secret-wg.org. 10 IN TXT "WildCard Match" + # + # AUTHORITY SECTION: + # eg.secret-wg.org. 600 IN NS ns.eg.secret-wg.org. + # + # ADDITIONAL SECTION: + # ns.eg.secret-wg.org. 600 IN A 10.0.53.208 + # + + uuencodedPacket=%w{ +c8 d5 85 00 00 01 00 01 00 01 00 01 02 5c 5c 02 +65 67 09 73 65 63 72 65 74 2d 77 67 03 6f 72 67 +00 00 10 00 01 c0 0c 00 10 00 01 00 00 00 0a 00 +0f 0e 57 69 6c 64 43 61 72 64 20 4d 61 74 63 68 +c0 0f 00 02 00 01 00 00 02 58 00 05 02 6e 73 c0 +0f c0 4c 00 01 00 01 00 00 02 58 00 04 0a 00 35 +d0 +} + + # uuEncodedPacket =~ s/\s*//g + # uuEncodedPacket =uuEncodedPacket.gsub("\s*", "") + # packetdata = [uuEncodedPacket].pack('H*') + + uuencodedPacket.map!{|e| e.hex} + packetdata = uuencodedPacket.pack('c*') + packetdata = packetdata.gsub("\s*", "") + + packet = Message.decode(packetdata) + assert(packet, "nil packet returned from binary data") + assert_equal( (packet.answer)[0].name.to_s,'\\\\\\\\.eg.secret-wg.org',"Correctly dealt escaped backslash from wireformat \\\\.eg.secret-wg.org") + end + + def test_esoteric_stuff + # Now testing for the real esotheric stuff. + # domain names can contain NULL and space characters (on the wire) + # these should be properly expanded + + # This only works if the dn_expand_XS() is NOT used. + + # The UUencoded packet contains a captured packet with this content: + + # QUESTION SECTION: + # \000.n\032ll.eg.secret-wg.org. IN TXT + + # ANSWER SECTION: + # \000.n ll.eg.secret-wg.org. 0 IN TXT "NULL byte ownername" + # ^ SPACE !!! + # AUTHORITY SECTION: + # eg.secret-wg.org. 600 IN NS ns.eg.secret-wg.org. + + # ADDITIONAL SECTION: + # ns.eg.secret-wg.org. 600 IN A 10.0.53.208 + + uuencodedPacket =%w{ + a6 58 85 00 00 01 00 01 00 01 00 01 01 00 04 6e + 20 6c 6c 02 65 67 09 73 65 63 72 65 74 2d 77 67 + 03 6f 72 67 00 00 10 00 01 c0 0c 00 10 00 01 00 + 00 00 00 00 14 13 4e 55 4c 4c 20 62 79 74 65 20 + 6f 77 6e 65 72 6e 61 6d 65 c0 13 00 02 00 01 00 + 00 02 58 00 05 02 6e 73 c0 13 c0 55 00 01 00 01 + 00 00 02 58 00 04 0a 00 35 d0 +} + + uuencodedPacket.map!{|e| e.hex} + packetdata = uuencodedPacket.pack('c*') + packetdata = packetdata.gsub("\s*", "") + packet = Message.decode(packetdata) + assert_equal( '\000.n\\032ll.eg.secret-wg.org',(packet.answer)[0].name.to_s,"Correctly dealt with NULL bytes in domain names") + + + # slightly modified \\ .eg.secret-wg.org instead of \\\\.eg.secret-wg.org + # That is escaped backslash space + uuencodedPacket=%w{ +c8 d5 85 00 00 01 00 01 00 01 00 01 02 5c 20 02 +65 67 09 73 65 63 72 65 74 2d 77 67 03 6f 72 67 +00 00 10 00 01 c0 0c 00 10 00 01 00 00 00 0a 00 +0f 0e 57 69 6c 64 43 61 72 64 20 4d 61 74 63 68 +c0 0f 00 02 00 01 00 00 02 58 00 05 02 6e 73 c0 +0f c0 4c 00 01 00 01 00 00 02 58 00 04 0a 00 35 +d0 +} + + uuencodedPacket.map!{|e| e.hex} + packetdata = uuencodedPacket.pack('c*') + packetdata.gsub!("\s*", "") + packet = Message.decode(packetdata) + + + assert_equal( '\\\\\\032.eg.secret-wg.org',(packet.answer)[0].name.to_s,"Correctly dealt escaped backslash from wireformat \\e.eg.secret-wg.org") + + # slightly modified \\e.eg.secret-wg.org instead of \\\\.eg.secret-wg.org + uuencodedPacket=%w{ +c8 d5 85 00 00 01 00 01 00 01 00 01 02 5c 65 02 +65 67 09 73 65 63 72 65 74 2d 77 67 03 6f 72 67 +00 00 10 00 01 c0 0c 00 10 00 01 00 00 00 0a 00 +0f 0e 57 69 6c 64 43 61 72 64 20 4d 61 74 63 68 +c0 0f 00 02 00 01 00 00 02 58 00 05 02 6e 73 c0 +0f c0 4c 00 01 00 01 00 00 02 58 00 04 0a 00 35 +d0 +} + + # uuEncodedPacket =~ s/\s*//g + # packetdata = uuEncodedPacket.pack('H*') + # packetdata = packetdata.gsub("\s*", "") + uuencodedPacket.map!{|e| e.hex} + packetdata = uuencodedPacket.pack('c*') + packet = Message.decode(packetdata) + + + assert_equal( '\\\\e.eg.secret-wg.org',(packet.answer)[0].name.to_s,"Correctly dealt escaped backslash from wireformat \\e.eg.secret-wg.org") + + + # slightly modified \\\..eg.secret-wg.org instead of \\e.eg.secret-wg.org + uuencodedPacket=%w{ +c8 d5 85 00 00 01 00 01 00 01 00 01 02 5c 65 02 +65 67 09 73 65 63 72 65 74 2d 77 67 03 6f 72 67 +00 00 10 00 01 c0 0c 00 10 00 01 00 00 00 0a 00 +0f 0e 57 69 6c 64 43 61 72 64 20 4d 61 74 63 68 +c0 0f 00 02 00 01 00 00 02 58 00 05 02 6e 73 c0 +0f c0 4c 00 01 00 01 00 00 02 58 00 04 0a 00 35 +d0 +} + + # # uuEncodedPacket =~ s/\s*//g + # packetdata = uuEncodedPacket.pack('H*') + # packetdata = packetdata.gsub("\s*", "") + uuencodedPacket.map!{|e| e.hex} + packetdata = uuencodedPacket.pack('c*') + packet = Message.decode(packetdata) + assert_equal( '\\\\e.eg.secret-wg.org',(packet.answer)[0].name.to_s,"Correctly dealt escaped backslash from wireformat \\\..eg.secret-wg.org") + + testrr=RR.create( + :name => '\\e.eg.secret-wg.org', + :type => 'TXT', + :txtdata => '"WildCard Match"', + :ttl => 10, + :class => "IN" + ) + + + + klass = "IN" + ttl = 43200 + name = 'def0au&lt.example.com' + + + + rrs = [ + { #[0] + :name => '\..bla\..example.com', + :type => Types.A, + :address => '10.0.0.1', + }, + { #[2] + :name => name, + :type => 'AFSDB', + :subtype => 1, + :hostname =>'afsdb-hostname.example.com', + }, + { #[3] + :name => '\\.funny.example.com', + :type => Types::CNAME, + :domainname => 'cname-cn\244ame.example.com', + }, + { #[4] + :name => name, + :type => Types.DNAME, + :domainname => 'dn\222ame.example.com', + }, + { #[9] + :name => name, + :type => Types.MINFO, + :rmailbx => 'minfo\.rmailbx.example.com', + :emailbx => 'minfo\007emailbx.example.com', + }, + + { #[13] + :name => name, + :type => Types.NS, + :domainname => '\001ns-nsdname.example.com', + }, + + { #[19] + :name => name, + :type => Types.SOA, + :mname => 'soa-mn\001ame.example.com', + :rname => 'soa\.rname.example.com', + :serial => 12345, + :refresh => 7200, + :retry => 3600, + :expire => 2592000, + :minimum => 86400, + }, + + ] + + # ------------------------------------------------------------------------------ + # Create the packet. + # ------------------------------------------------------------------------------ + packet = nil + packet = Message.new(name) + assert(packet, 'Packet created') + + rrs.each do |data| + data.update({:ttl => ttl,}) + + rec = RR.create(data) + packet.add_answer(rec) + end + + + # ------------------------------------------------------------------------------ + # Re-create the packet from data. + # ------------------------------------------------------------------------------ + data = packet.encode + + assert(data, 'Packet has data after pushes') + + packet = nil + + packet = Message.decode(data) + + assert(packet, 'Packet reconstructed from data') + + answer = packet.answer + + # assert(answer && answer == rrs, 'Packet returned correct answer section') + rrs.each do |rr| + record = nil + answer.each do |ansrec| + if (ansrec.type == rr[:type]) + record = ansrec + break + end + end + assert(record!=nil, "can't find answer record for #{rr}") + rr.keys.each do |key| + if (key == :type) + assert_equal(Types.new(rr[key]).string, record.send(key).to_s, "value not right for key #{key} for rr #{rr}") + else + assert_equal(rr[key].to_s, record.send(key).to_s, "value not right for key #{key} for rr #{rr}") + end + end + end + + + while (answer.size>0 and rrs.size>0) + data = rrs.shift + rr = answer.shift + type = data[:type] + # foreach my $meth (keys %{$data}) { + (data.keys.each do |meth| + if (meth == :type) + assert_equal(Types.new(data[meth]).to_s, rr.send(meth).to_s, "#{type} - #meth() correct") + else + assert_equal(data[meth].to_s, rr.send(meth).to_s, "#{type} - #meth() correct") + end + end) + + rr2 = RR.new_from_string(rr.to_s) + assert_equal(rr.to_s, rr2.to_s, "#{type} - Parsing from string works") + end + + Name::Label.set_max_length(Name::Label::MaxLabelLength) + end + end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_gpos.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_gpos.rb new file mode 100644 index 000000000000..b122866ccf2c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_gpos.rb @@ -0,0 +1,124 @@ +require_relative 'spec_helper' + +require_relative '../lib/dnsruby/resource/GPOS.rb' + +# Tests GPOS resource record. See bottom of file for sample zone file. +class TestGPOS < Minitest::Test + + include Dnsruby + + EXAMPLE_LONGITUDE = '10.0' + EXAMPLE_LATITUDE = '20.0' + EXAMPLE_ALTITUDE = '30.0' + EXAMPLE_HOSTNAME = 'a.dnsruby.com.' + EXAMPLE_TTL = 3 * 60 * 60 # 10,800 seconds, or 3 hours + + EXAMPLE_GPOS_STRING = 'a.dnsruby.com. 10800 IN GPOS 10.0 20.0 30.0' + + EXAMPLE_GPOS_HASH = { + name: EXAMPLE_HOSTNAME, + type: Types::GPOS, + ttl: EXAMPLE_TTL, + longitude: EXAMPLE_LONGITUDE, + latitude: EXAMPLE_LATITUDE, + altitude: EXAMPLE_ALTITUDE, + } + + EXAMPLE_GPOS_DATA = begin + rdata = RR::GPOS.build_rdata(EXAMPLE_LONGITUDE, EXAMPLE_LATITUDE, EXAMPLE_ALTITUDE) + [EXAMPLE_HOSTNAME, Types::GPOS, Classes::IN, EXAMPLE_TTL, rdata.length, rdata, 0] + end + + # Returns a GPOS record returned by a BIND server configured with the zone file + # shown at the bottom of this file. I (keithrbennett) was unable to find a GPOS + # record on the public Internet to use for live testing. + def gpos_from_response + # query = Message.new(EXAMPLE_HOSTNAME, 'GPOS') + # query_binary = "E0\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001a\adnsruby\u0003com\u0000\u0000\e\u0000\u0001" + # response, _error = Resolver.new('127.0.0.1').query_raw(query) + + response_binary = "E0\x84\x80\x00\x01\x00\x01\x00\x01\x00\x01\x01a\adnsruby\x03com\x00\x00\e\x00\x01\xC0\f\x00\e\x00\x01\x00\x00*0\x00\x0F\x0410.0\x0420.0\x0430.0\xC0\x0E\x00\x02\x00\x01\x00\x00*0\x00\x06\x03ns1\xC0\x0E\xC0F\x00\x01\x00\x01\x00\x00*0\x00\x04\x7F\x00\x00\x01" + response = Message.decode(response_binary) + + # response_binary = "\xE7\x01\x85\x90\x00\x01\x00\x01\x00\x01\x00\x01\x01g\adnsruby\x03com" + + # "\x00\x00\e\x00\x01\xC0\f\x00\e\x00\x01\x00\t:\x80\x00\x0F\x0420.0\x0430.0\x0410.0" + + # "\xC0\x0E\x00\x02\x00\x01\x00\t:\x80\x00\x05\x02ns\xC0\x0E\xC0F\x00\x01\x00\x01\x00" + + # "\t:\x80\x00\x04\xC0\xA8\x01\n"; nil + # + # response = Message.decode(response_binary) + + response.answer[0] + end + + + def test_answer + answer = gpos_from_response + assert answer.is_a?(RR::GPOS), "Expected RR::GPOS but got a #{answer.class}: #{answer}" + assert_equal(EXAMPLE_LONGITUDE, answer.longitude) + assert_equal(EXAMPLE_LATITUDE, answer.latitude) + assert_equal(EXAMPLE_ALTITUDE, answer.altitude) + assert_equal(EXAMPLE_TTL, answer.ttl) + end + + + # should be: <owner> <ttl> <class> GPOS <longitude> <latitude> <altitude> + def test_to_s + actual = gpos_from_response.to_s.split + expected = %w(a.dnsruby.com. 10800 IN GPOS 10.0 20.0 30.0) + assert_equal(expected, actual) + end + + def test_creation_approaches + + ans_from_data = RR::GPOS.new_from_data(*EXAMPLE_GPOS_DATA) + ans_from_string = RR::GPOS.new_from_string(EXAMPLE_GPOS_STRING) + ans_from_hash = RR::GPOS.new_from_hash(EXAMPLE_GPOS_HASH) + + fails_to_populate_rdata = [] + fails_to_populate_rdata << 'data' if ans_from_data.rdata.nil? + fails_to_populate_rdata << 'string' if ans_from_string.rdata.nil? + fails_to_populate_rdata << 'hash' if ans_from_hash.rdata.nil? + + assert_equal([], fails_to_populate_rdata, + "Populate modes failing to populate rdata: #{fails_to_populate_rdata.join(', ')}") + + assert_equal(ans_from_data.rdata, ans_from_hash.rdata) + assert_equal(ans_from_data.rdata, ans_from_string.rdata) + + assert_equal(ans_from_data, ans_from_hash) + assert_equal(ans_from_data, ans_from_string) + end + + def test_decode_encode + response_binary = "E0\x84\x80\x00\x01\x00\x01\x00\x01\x00\x01\x01a\adnsruby\x03com\x00\x00\e\x00\x01\xC0\f\x00\e\x00\x01\x00\x00*0\x00\x0F\x0410.0\x0420.0\x0430.0\xC0\x0E\x00\x02\x00\x01\x00\x00*0\x00\x06\x03ns1\xC0\x0E\xC0F\x00\x01\x00\x01\x00\x00*0\x00\x04\x7F\x00\x00\x01" + message_object = Message.decode(response_binary) + reconstructed_binary = message_object.encode + assert_equal response_binary.force_encoding('ASCII-8BIT'), reconstructed_binary + end +end + + +# Sample zone file for setting up BIND to serve GPOS records: +=begin +$TTL 3h + +@ IN SOA dnsruby.com. foo.dnsruby.com. ( + 1 ; serial + 3H ; refresh after 3 hours + 1H ; retry after 1 hour + 1W ; expire after 1 week + 1H) ; negative caching TTL of 1 hour + +dnsruby.com. IN NS ns1 + +; Addresses for canonical names + +ns1.dnsruby.com. IN A 127.0.0.1 + +a.dnsruby.com. IN A 2.4.6.8 + IN GPOS 10.0 20.0 30.0 + +b.dnsruby.com. IN A 2.4.6.9 + IN GPOS 40 50 60 + +=end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_hash.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_hash.rb new file mode 100644 index 000000000000..a24984260d13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_hash.rb @@ -0,0 +1,41 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +require 'set' + +module Dnsruby + +class TestHash < Minitest::Test + + def test_types_hash + object1 = Types.new(Types::NSEC3) + object2 = Types.new(Types::NSEC3) + assert(object1 == object2) + assert(object1.hash == object2.hash, "Hashes differed: #{object1.hash} != #{object2.hash}") + end + + def test_types_set + object1 = Types.new(Types::NSEC3) + object2 = Types.new(Types::NSEC3) + assert(object1 == object2) + set = Set.new([object1, object2]) + assert(set.size == 1, "Two equal objects should result in a set size of 1, but instead the size was #{set.size}.") + end + +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_header.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_header.rb new file mode 100644 index 000000000000..aea64d5e83fe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_header.rb @@ -0,0 +1,100 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestHeader < Minitest::Test + + include Dnsruby + + def test_header + header = Header.new(); + assert(header, "new() returned something") + + header.id=41 + assert_equal(header.id, 41, "id() works") + + header.qr=true + assert_equal(header.qr, true, "qr() works") + + header.opcode="QUERY" + assert_equal(OpCode.Query, header.opcode, + "opcode() works") + header.opcode=OpCode::Query + assert_equal(header.opcode.string, "Query", + "opcode() works") + + + header.aa=true + assert_equal(header.aa, true, "aa() works") + + header.tc=false + assert_equal(header.tc, false, "tc() works") + + header.rd=true + assert_equal(header.rd, true, "rd() works") + + header.ad=true + assert_equal(header.ad, true, "rd() works") + + header.cd=true + assert_equal(header.cd, true, "rd() works") + + header.ra=true + assert_equal(header.ra, true, "ra() works") + + header.qr=true + assert_equal(header.qr, true, "qr() works") + + header.rcode="NOERROR" + assert_equal(header.get_header_rcode, RCode::NOERROR, "rcode() works") + header.rcode=RCode.NOERROR + assert_equal(header.get_header_rcode.string, "NOERROR", "rcode() works") + + header.qdcount=1 + header.ancount=2 + header.nscount=3 + header.arcount=3 + + + # Reenable when support for CD is there + # header.cd=0 + # assert_equal(header.cd, 0, "cd() works") + data = header.data + + header2 = Header.new_from_data(data); + + assert(header==(header2), 'Headers are the same'); + + header = Header.new; + + # + # Check that the aliases work properly. + # + header.zocount=(0); + header.prcount=(1); + header.upcount=(2); + header.adcount=(3); + + assert_equal(header.zocount, 0, 'zocount works'); + assert_equal(header.prcount, 1, 'prcount works'); + assert_equal(header.upcount, 2, 'upcount works'); + assert_equal(header.adcount, 3, 'adcount works'); + + + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_hip.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_hip.rb new file mode 100644 index 000000000000..5e5cd0bf46b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_hip.rb @@ -0,0 +1,72 @@ + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestHIP < Minitest::Test + + include Dnsruby + + def test_hip + [{"www.example.com. IN HIP ( 2 200100107B1A74DF365639CC39F1D578 + AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cIvM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ryra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXdXF5D )" => + [2, "200100107B1A74DF365639CC39F1D578", "AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cIvM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ryra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXdXF5D", []]}, + + {"www.example.com. IN HIP ( 2 200100107B1A74DF365639CC39F1D578 + AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cIvM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ryra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXdXF5D + rvs.example.com. )" => + [2, "200100107B1A74DF365639CC39F1D578", "AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cIvM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ryra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXdXF5D", + ["rvs.example.com"]]}, + {"www.example.com. IN HIP ( 2 200100107B1A74DF365639CC39F1D578 + AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cIvM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ryra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXdXF5D + rvs1.example.com. + rvs2.example.com. )" => + [2, "200100107B1A74DF365639CC39F1D578", "AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cIvM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ryra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXdXF5D", + ["rvs1.example.com", "rvs2.example.com"]]}, + ].each {|hash| + hash.each {|txt, data| + + + hip = RR.create(txt) + assert(hip.pk_algorithm == data[0]) + assert(hip.hit_string == data[1]) + assert(hip.public_key_string == data[2]) + hip.rsvs.each {|in_rsv| + assert(data[3].include?in_rsv.to_s) + } + assert(data[3].length == hip.rsvs.length) + + + m = Dnsruby::Message.new + m.add_additional(hip) + data = m.encode + m2 = Dnsruby::Message.decode(data) + hip2 = m2.additional()[0] + assert(hip.pk_algorithm == hip2.pk_algorithm) + assert(hip.hit_string == hip2.hit_string) + assert(hip.public_key_string == hip2.public_key_string) + hip.rsvs.each {|in_rsv| + assert(hip2.rsvs.include?in_rsv) + } + assert(hip2.rsvs.length == hip.rsvs.length) + assert(hip == hip2) + } + } + end + +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_hs.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_hs.rb new file mode 100644 index 000000000000..3538ac2e7890 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_hs.rb @@ -0,0 +1,24 @@ +require_relative 'spec_helper' + +class TestDNS < Minitest::Test + + def setup + Dnsruby::Config.reset + end + + + # Illustrates that when a message whose class is 'HS' is sent to + # a DNS server that does not support the HS class, using send_plain_message, + # the response returns with an rcode of NOTIMP and a Dnsruby::NotImp error. + def test_hs_class_returns_notimp_code_and_error + resolver_host = 'a.gtld-servers.net' + resolver = Dnsruby::Resolver.new(resolver_host) + resolver.query_timeout = 20 + message = Dnsruby::Message.new('test.com', 'A', 'HS') + response, error = resolver.send_plain_message(message) + + assert_equal(Dnsruby::RCode::NOTIMP, response.rcode) + assert_equal(Dnsruby::NotImp, error.class) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_ipseckey.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_ipseckey.rb new file mode 100644 index 000000000000..785e1844434d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_ipseckey.rb @@ -0,0 +1,73 @@ + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestIPSECKEY < Minitest::Test + + include Dnsruby + + def test_ipseckey + [{"38.1.0.192.in-addr.arpa. 7200 IN IPSECKEY ( 10 3 2 + mygateway.example.com. + AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ== )" => + ["mygateway.example.com", "AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ==", + 10, 3, 2]}, + + {"38.2.0.192.in-addr.arpa. 7200 IN IPSECKEY ( 10 1 2 + 192.0.2.38 + AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ== )" => + ["192.0.2.38", "AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ==", 10, 1, 2]}, + {"38.2.0.192.in-addr.arpa. 7200 IN IPSECKEY ( 10 0 2 + . + AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ== )" => + ["", "AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ==", 10, 0, 2]}, + {"38.2.0.192.in-addr.arpa. 7200 IN IPSECKEY ( 10 1 2 + 192.0.2.3 + AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ== )" => + ["192.0.2.3", "AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ==", 10, 1, 2]}, + {"0.d.4.0.3.0.e.f.f.f.3.f.0.1.2.01.0.0.0.0.0.2.8.B.D.0.1.0.0.2.ip6.arpa. 7200 IN IPSECKEY ( 10 2 2 + 2001:0DB8:0:8002::2000:1 + AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ== )" => + ["2001:DB8:0:8002::2000:1", "AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ==", + 10, 2, 2]} + ].each {|hash| + hash.each {|txt, data| + + + ipseckey = RR.create(txt) + assert(ipseckey.precedence == data[2]) + assert(ipseckey.gateway_type == data[3]) + assert(ipseckey.algorithm == data[4]) + assert(ipseckey.gateway.to_s == data[0]) + assert(ipseckey.public_key_string == data[1]) + + m = Dnsruby::Message.new + m.add_additional(ipseckey) + data = m.encode + m2 = Dnsruby::Message.decode(data) + ipseckey2 = m2.additional()[0] + assert(ipseckey.gateway_type == ipseckey2.gateway_type) + assert(ipseckey.algorithm == ipseckey2.algorithm) + assert(ipseckey.gateway == ipseckey2.gateway) + assert(ipseckey.klass == ipseckey2.klass) + assert(ipseckey == ipseckey2) + } + } + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_long_labels.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_long_labels.rb new file mode 100644 index 000000000000..ac04bde578f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_long_labels.rb @@ -0,0 +1,46 @@ +require_relative 'spec_helper' + +include Dnsruby +class TestPacket < Minitest::Test + def test_labels + wirePacket = %w{0 + 68 5b 35 91 3a f7 00 0f 94 22 d9 51 08 00 45 00 05 12 71 65 40 00 3d 06 46 1f 2e e3 90 33 + c0 a8 01 a3 00 35 e3 cf 94 d5 49 0a 88 da e7 1e 80 18 00 1d 6f 52 00 00 01 01 08 0a 8e 3a + a6 b1 1f 4d ce 28 c5 b1 c0 0c 00 0c 00 01 00 00 0b 49 00 12 0f 69 6d 70 72 6f 76 65 61 6e + 61 6c 79 73 69 73 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 0e 0b 77 69 6e 64 6f 77 73 72 75 + 62 79 d3 12 c0 0c 00 0c 00 01 00 00 0b 49 00 15 12 6d 69 63 72 6f 73 6f 66 74 66 6f 72 65 + 66 72 6f 6e 74 d3 bd c0 0c 00 0c 00 01 00 00 0b 49 00 11 09 6d 69 63 72 6f 73 6f 66 74 02 + 63 6f 02 6d 7a 00 c0 0c 00 0c 00 01 00 00 0b 49 00 12 09 77 69 6e 64 6f 77 73 78 70 03 6f + 72 67 02 70 65 00 c0 0c 00 0c 00 01 00 00 0b 49 00 16 0f 65 75 67 72 61 6e 74 73 61 64 76 + 69 73 6f 72 03 63 6f 6d ca 49 c0 0c 00 0c 00 01 00 00 0b 49 00 14 11 64 65 66 79 61 6c 6c + 63 68 61 6c 6c 65 6e 67 65 73 c5 97 c0 0c 00 0c 00 01 00 00 0b 49 00 18 15 63 6f 6e 73 6f + 6c 69 64 61 74 65 64 6d 65 73 73 65 6e 67 65 72 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 19 + 16 72 65 74 61 69 6c 65 78 65 63 75 74 69 76 65 73 65 6d 69 6e 61 72 c0 a7 c0 0c 00 0c 00 + 01 00 00 0b 49 00 0e 0b 63 74 72 6f 70 65 6e 6f 72 6d 65 c0 65 c0 0c 00 0c 00 01 00 00 0b + 49 00 0e 0b 77 69 6e 64 6f 77 73 32 30 30 30 cc 6f c0 0c 00 0c 00 01 00 00 0b 49 00 1a 17 + 77 69 6e 64 6f 77 73 6d 6f 62 69 6c 65 63 6f 6d 6d 6d 75 6e 69 74 79 c0 41 c0 0c 00 0c 00 + 01 00 00 0b 49 00 11 0e 72 69 73 65 6f 66 70 65 72 61 74 68 69 61 c0 41 c0 0c 00 0c 00 01 + 00 00 0b 49 00 11 0e 72 65 6e 63 6f 6e 74 72 65 73 2d 33 36 30 c0 41 c0 0c 00 0c 00 01 00 + 00 0b 49 00 11 0e 66 75 74 75 72 65 70 6f 73 74 6d 61 69 6c c0 41 c0 0c 00 0c 00 01 00 00 + 0b 49 00 10 0d 72 65 73 70 6f 6e 73 65 70 6f 69 6e 74 cc 4d c0 0c 00 0c 00 01 00 00 0b 49 + 00 10 0d 74 61 76 75 74 61 74 72 6f 6e 63 68 65 c0 a7 c0 0c 00 0c 00 01 00 00 0b 49 00 09 + 06 66 6c 65 78 67 6f df 34 c0 0c 00 0c 00 01 00 00 0b 49 00 0e 09 77 69 6e 64 6f 77 73 78 + 70 02 73 68 00 c0 0c 00 0c 00 01 00 00 0b 49 00 16 13 73 6d 61 72 74 70 68 6f 6e 65 63 6f + 6d 6d 75 6e 69 74 79 c0 a7 c0 0c 00 0c 00 01 00 00 0b 49 00 12 0f 63 65 6e 74 72 65 64 65 + 73 75 73 61 67 65 73 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 0c 09 77 69 6e 64 6f 77 73 6e + 74 fc 07 c0 0c 00 0c 00 01 00 00 0b 49 00 19 16 6c 65 73 2d 64 6f 69 67 74 73 2d 64 61 6e + 73 2d 6c 65 2d 6e 65 7a c0 a7 c0 0c 00 0c 00 01 00 00 0b 49 00 13 10 74 65 63 68 6e 65 74 + 63 68 61 6c 6c 65 6e 67 65 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 15 12 6d 69 63 72 6f 73 6f 66 74 66 6f 72 65 66 72 6f 6e 74 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 10 0d 6c 65 73 62 6f 6e 73 6f 75 74 69 6c 73 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 0d 0a 77 69 6e 74 65 72 6e 61 6c 73 c3 d6 c0 0c 00 0c 00 01 00 00 0b 49 00 23 0e 64 65 73 69 67 6e 65 64 66 6f 72 62 69 67 02 64 65 0e 64 65 73 69 67 6e 65 64 66 6f 72 62 69 67 c2 b2 c0 0c 00 0c 00 01 00 00 0b 49 00 13 10 77 69 6e 64 6f 77 73 76 69 73 74 61 62 6c 6f 67 c9 42 c0 0c 00 0c 00 01 00 00 0b 49 00 12 09 77 69 6e 64 6f 77 73 6e 74 03 6f 72 67 02 66 6a 00 c0 0c 00 0c 00 01 00 00 0b 49 00 0c 09 77 69 6e 64 6f 77 73 6e 74 c1 b6 c0 0c 00 0c 00 01 00 00 0b 49 00 0f 0c 6f 66 66 69 63 65 73 79 73 74 65 6d c2 18 c0 0c 00 0c 00 01 00 00 0b 49 00 0f 0c 74 72 65 79 72 65 73 65 61 72 63 68 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 09 06 63 70 61 6e 64 6c c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 16 13 6f 66 66 72 65 2d 65 62 6c 6f 75 69 73 73 61 6e 74 65 73 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 0d 0a 63 6f 68 6f 77 69 6e 65 72 79 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 13 10 74 6f 64 6f 73 6c 6f 65 6e 74 69 65 6e 64 65 6e c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 0f 09 77 69 6e 64 6f 77 73 78 70 02 63 6f f1 03 c0 0c 00 0c 00 01 00 00 0b 49 00 0b 08 74 65 63 68 65 64 30 36 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 09 06 66 6c 65 78 67 6f dd 7f c0 0c 00 0c 00 01 00 00 0b 49 00 0c 09 66 6f 72 65 66 72 6f 6e 74 cb 21 c0 0c 00 0c 00 01 00 00 0b 49 00 14 11 64 65 66 79 61 6c 6c 63 68 61 6c 6c 65 6e 67 65 73 cb 44 00 00 29 05 78 00 00 80 00 00 00 + } + wirePacket.map!{|e| e.hex} + packetdata = wirePacket.pack('c*') + + packet = Message.decode(packetdata) + assert(packet, 'new data returned something'); #28 + end + + def test_live + resolver = Dnsruby::Resolver.new + query = resolver.query('207.46.197.32', 'PTR', 'IN') + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_message.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_message.rb new file mode 100644 index 000000000000..eb84ab0ee238 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_message.rb @@ -0,0 +1,93 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestMessage < Minitest::Test + + include Dnsruby + + # Creates and returns sample message: + # + # ;; QUESTION SECTION (1 record) + # ;; cnn.com. IN A + # ;; Security Level : UNCHECKED + # ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7195 + # ;; flags: ; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 + def sample_message + Message.new('cnn.com', 'A') + end + + def test_question_section_formatted_ok + multiline_regex = /QUESTION SECTION.+record.+cnn.com.\s+IN\s+A/m + assert multiline_regex.match(sample_message.to_s) + end + + def test_has_security_level_line + line_regex = /^;; Security Level : .+/ + assert line_regex.match(sample_message.to_s) + end + + def test_has_flags_and_section_count + line_regex = /^;; flags:.+QUERY: \d+, ANSWER: \d+, AUTHORITY: \d+, ADDITIONAL: \d+/ + assert line_regex.match(sample_message.to_s) + end + + def test_rd_flag_displayed_when_true + message = sample_message + message.header.instance_variable_set(:@rd, true) + assert /;; flags(.+)rd/.match(message.to_s), message + end + + def test_header_line_contains_opcode_and_status_and_id + message = sample_message + header_line = message.to_s.split("\n").grep(/->>HEADER<<-/).first + line_regex = /->>HEADER<<- opcode: .+, status: .+, id: \d+/ + assert line_regex.match(header_line) + end + + def test_getopt + message = sample_message + assert message.get_opt.nil? + + # Add an OPT record + opt = RR::OPT.new(4096, 32768) + message.additional << opt + + opt = message.get_opt + assert opt.is_a?(Dnsruby::RR::OPT), + "Expected get_opt to return a Dnsruby::RR::OPT, but it returned a #{opt.class}" + end + + def test_2eq + test = ->(msg1, msg2, expected_result) do + assert (msg1 == msg2) == expected_result + end + msg_a = sample_message + msg_b = sample_message; msg_b.header.rd = (! msg_b.header.rd) + test.(msg_a, msg_a, true) + test.(msg_a, msg_b, false) + test.(msg_a, msg_a.to_s, false) + test.(msg_a, nil, false) + # TODO: Add more tests. + end + + def test_equals + response_as_string = "\x10\a\x81\x90\x00\x01\x00\x04\x00\x00\x00\x06\x03cnn\x03com\x00\x00\x02\x00\x01\xC0\f\x00\x02\x00\x01\x00\x01QC\x00\x14\x03ns3\ntimewarner\x03net\x00\xC0\f\x00\x02\x00\x01\x00\x01QC\x00\x11\x03ns2\x03p42\x06dynect\xC04\xC0\f\x00\x02\x00\x01\x00\x01QC\x00\x06\x03ns1\xC0)\xC0\f\x00\x02\x00\x01\x00\x01QC\x00\x06\x03ns1\xC0I\xC0%\x00\x01\x00\x01\x00\x001\xA2\x00\x04\xC7\aD\xEE\xC0E\x00\x01\x00\x01\x00\x00\xB1\x0E\x00\x04\xCC\r\xFA*\xC0b\x00\x01\x00\x01\x00\x009`\x00\x04\xCCJl\xEE\xC0t\x00\x01\x00\x01\x00\x00\xBDg\x00\x04\xD0NF*\xC0t\x00\x1C\x00\x01\x00\x00\x00\xBB\x00\x10 \x01\x05\x00\x00\x90\x00\x01\x00\x00\x00\x00\x00\x00\x00B\x00\x00)\x0F\xA0\x00\x00\x80\x00\x00\x00".force_encoding("ASCII-8BIT") + message = Message.decode(response_as_string) + assert(message == message, message.to_s) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_misc.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_misc.rb new file mode 100644 index 000000000000..b756726ad34e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_misc.rb @@ -0,0 +1,138 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestMisc < Minitest::Test + def test_wildcard + # test to make sure that wildcarding works. + # + rr = Dnsruby::RR.create('*.t.dnsruby.validation-test-servers.nominet.org.uk 60 IN A 10.0.0.1') + + assert(rr, 'RR got made') + + assert_equal('*.t.dnsruby.validation-test-servers.nominet.org.uk', rr.name.to_s, 'Name is correct' ) + assert_equal(60, rr.ttl, 'TTL is correct' ) + assert_equal(Dnsruby::Classes.IN, rr.klass, 'CLASS is correct' ) + assert_equal(Dnsruby::Types.A, rr.type, 'TYPE is correct' ) + assert_equal('10.0.0.1', rr.address.to_s, 'Address is correct') + end + + def test_misc + + # + # Make sure the underscore in SRV hostnames work. + # + srv = Dnsruby::RR.create('_rvp._tcp.t.dnsruby.validation-test-servers.nominet.org.uk. 60 IN SRV 0 0 80 im.bastardsinc.biz') + + assert(srv, 'SRV not created successfully') + + + # ~ # Test that the 5.005 Use of uninitialized value at + # ~ # /usr/local/lib/perl5/site_perl/5.005/Net/DNS/RR.pm line 639. bug is gone + rr = Dnsruby::RR.create('mx.t.dnsruby.validation-test-servers.nominet.org.uk 60 IN MX 10 a.t.dnsruby.validation-test-servers.nominet.org.uk') + assert(rr, 'RR created') + + assert_equal(rr.preference, 10, 'Preference works') + + + + mx = Dnsruby::RR.create('mx.t.dnsruby.validation-test-servers.nominet.org.uk 60 IN MX 0 mail.dnsruby.validation-test-servers.nominet.org.uk') + + assert(mx.to_s =~ /0 mail.dnsruby.validation-test-servers.nominet.org.uk/) # was 'like' + assert_equal(mx.preference, 0) + assert_equal(mx.exchange.to_s, 'mail.dnsruby.validation-test-servers.nominet.org.uk') + + srv = Dnsruby::RR.create('srv.t.dnsruby.validation-test-servers.nominet.org.uk 60 IN SRV 0 2 3 target.dnsruby.validation-test-servers.nominet.org.uk') + +# # @todo@ Absolute name issues +# assert(srv.inspect =~ /0 2 3 target.dnsruby.validation-test-servers.nominet.org.uk\./) +# assert_equal(srv.rdatastr, '0 2 3 target.dnsruby.validation-test-servers.nominet.org.uk.') + + + + end + + def test_TXT_RR + + # + # + # Below are some thests that have to do with TXT RRs + # + # + + + # QUESTION SECTION: + # txt2.t.net-dns.org. IN TXT + + # ANSWER SECTION: + # txt2.t.net-dns.org. 60 IN TXT "Net-DNS\ complicated $tuff" "sort of \" text\ and binary \000 data" + + # AUTHORITY SECTION: + # net-dns.org. 3600 IN NS ns1.net-dns.org. + # net-dns.org. 3600 IN NS ns.ripe.net. + # net-dns.org. 3600 IN NS ns.hactrn.net. + + # ADDITIONAL SECTION: + # ns1.net-dns.org. 3600 IN A 193.0.4.49 + # ns1.net-dns.org. 3600 IN AAAA + + uuencodedPacket=%w{ +11 99 85 00 00 01 +00 01 00 03 00 02 04 74 78 74 32 01 74 07 6e 65 +74 2d 64 6e 73 03 6f 72 67 00 00 10 00 01 c0 0c +00 10 00 01 00 00 00 3c 00 3d 1a 4e 65 74 2d 44 +4e 53 3b 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 +24 74 75 66 66 21 73 6f 72 74 20 6f 66 20 22 20 +74 65 78 74 3b 20 61 6e 64 20 62 69 6e 61 72 79 +20 00 20 64 61 74 61 c0 13 00 02 00 01 00 00 0e +10 00 06 03 6e 73 31 c0 13 c0 13 00 02 00 01 00 +00 0e 10 00 0d 02 6e 73 04 72 69 70 65 03 6e 65 +74 00 c0 13 00 02 00 01 00 00 0e 10 00 0c 02 6e +73 06 68 61 63 74 72 6e c0 93 c0 79 00 01 00 01 +00 00 0e 10 00 04 c1 00 04 31 c0 79 00 1c 00 01 +00 00 0e 10 00 10 20 01 06 10 02 40 00 03 00 00 +12 34 be 21 e3 1e +} + + uuencodedPacket.map!{|e| e.hex} + packetdata = uuencodedPacket.pack('c*') + packetdata.gsub!("\s*", "") + + packet = Dnsruby::Message.decode(packetdata) + txtRr=(packet.answer)[0] + assert_equal('Net-DNS; complicated $tuff',txtRr.strings[0],"First Char string in TXT RR read from wireformat") + + # Compare the second char_str this contains a NULL byte (space NULL + # space=200020 in hex) + + temp = (txtRr.strings)[1].unpack('H*')[0] + # #assert_equal(unpack('H*',(TXTrr.char_str_list())[1]),"736f7274206f66202220746578743b20616e642062696e61727920002064617461", "Second Char string in TXT RR read from wireformat") + assert_equal("736f7274206f66202220746578743b20616e642062696e61727920002064617461", temp,"Second Char string in TXT RR read from wireformat") + + + txtRr2=Dnsruby::RR.create('txt2.t.dnsruby.validation-test-servers.nominet.org.uk. 60 IN TXT "Test1 \" \; more stuff" "Test2"') + + assert_equal((txtRr2.strings)[0],'Test1 " ; more stuff', "First arg string in TXT RR read from zonefileformat") + assert_equal((txtRr2.strings)[1],'Test2',"Second Char string in TXT RR read from zonefileformat") + + + # txtRr3 = RR.create("baz.example.com 3600 HS TXT '\"' 'Char Str2'") + txtRr3 = Dnsruby::RR.create("baz.example.com 3600 IN TXT '\"' 'Char Str2'") + + assert_equal( (txtRr3.strings)[0],'"',"Escaped \" between the single quotes") + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_name.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_name.rb new file mode 100644 index 000000000000..cbb9bb48d938 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_name.rb @@ -0,0 +1,102 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestName < Minitest::Test + + include Dnsruby + + def test_label_length + Name::Label.set_max_length(Name::Label::MaxLabelLength) # Other tests may have changed this + # Test max label length = 63 + begin + name = Name.create("a.b.12345678901234567890123456789012345678901234567890123456789012345.com") + assert(false, "Label of more than max=63 allowed") + rescue ResolvError + end + end + + def test_name_length + # Test max name length=255 + begin + name = Name.create("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123.com") + assert(false, "Name of length > 255 allowed") + rescue ResolvError + end + end + + def test_absolute + n = Name.create("example.com") + assert(!n.absolute?) + n = Name.create("example.com.") + assert(n.absolute?) + end + + def test_wild + n = Name.create("example.com") + assert(!n.wild?) + n = Name.create("*.example.com.") + assert(n.wild?) + end + + def test_canonical_ordering + names = [] + names.push(Name.create("example")) + names.push(Name.create("a.example")) + names.push(Name.create("yljkjljk.a.example")) + names.push(Name.create("Z.a.example")) + names.push(Name.create("zABC.a.EXAMPLE")) + names.push(Name.create("z.example")) + names.push(Name.create("\001.z.example")) + names.push(Name.create("*.z.example")) +# names.push(Name.create("\200.z.example")) + names.push(Name.create(["c8"].pack("H*")+".z.example")) + names.each_index {|i| + if (i < (names.length() - 1)) + assert(names[i].canonically_before(names[i+1])) + assert(!(names[i+1].canonically_before(names[i]))) + end + } + assert(Name.create("x.w.example").canonically_before(Name.create("z.w.example"))) + assert(Name.create("x.w.example").canonically_before(Name.create("a.z.w.example"))) + end + + def test_escapes + n1 = Name.create("\\nall.all.") + n2 = Name.create("nall.all.") + assert(n1 == n2, n1.to_s) + end + + def test_punycode + [ + [ + "møllerriis.com", + "xn--mllerriis-l8a.com" + ], + [ + "フガフガ。hogehoge.エグザンプル.JP", + "xn--mcka5jb.hogehoge.xn--ickqs6k2dyb.jp" + ], + [ + "フガ#フガ。hogehoge.エグザンプル.JP", + "xn--#-yeub5nc.hogehoge.xn--ickqs6k2dyb.jp" + ] + ].each do |tc| + assert_equal(Dnsruby::Name.create(tc[0]).to_s, tc[1]) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_naptr.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_naptr.rb new file mode 100644 index 000000000000..10083221e3ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_naptr.rb @@ -0,0 +1,62 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestNAPTR < Minitest::Test + + include Dnsruby + + def test_naptr + txt = "example.com. IN NAPTR 100 50 \"s\" \"z3950+I2L+I2C\" \"\" _z3950._tcp.gatech.edu." + naptr = RR.create(txt) + assert(naptr.type == Types.NAPTR) + assert(naptr.order == 100) + assert(naptr.preference == 50) + assert(naptr.flags == 's') + assert(naptr.service == "z3950+I2L+I2C") + assert(naptr.regexp == "") + assert(naptr.replacement == Name.create('_z3950._tcp.gatech.edu.')) + + m = Dnsruby::Message.new + m.add_additional(naptr) + data = m.encode + m2 = Dnsruby::Message.decode(data) + naptr2 = m2.additional()[0] + assert(naptr2.type == Types.NAPTR) + assert(naptr2.order == 100) + assert(naptr2.preference == 50) + assert(naptr2.flags == "s") + assert(naptr2.service == "z3950+I2L+I2C") + assert(naptr2.regexp == "") + assert(naptr2.replacement == Name.create('_z3950._tcp.gatech.edu.')) + + naptr.flags = "u" + end + + def test_string + txt = 'all.rr.org. 7200 IN NAPTR 100 10 "" "" "/urn:cid:.+@([^\\\\.]+\\\\.)(.*)$/\\\\2/i" .' + rr = RR.create(txt) + assert(rr.to_s.index('"/urn:cid:.+@([^\\\\.]+\\\\.)(.*)$/\\\\2/i"'), '"/urn:cid:.+@([^\\\\.]+\\\\.)(.*)$/\\\\2/i"' + "\n" + rr.to_s) + end + + def test_bad_string + txt = 'all.rr.binary.org. IN NAPTR 100 10 "" "" "/urn:cid:.+@([^\\.]+\\.)(.*)$/\\\\2/i" .' + rr = RR.create(txt) + assert(rr.to_s.index('"/urn:cid:.+@([^.]+.)(.*)$/\\\\2/i"'), '"/urn:cid:.+@([^.]+.)(.*)$/\\\\2/i"' + "\n" + rr.to_s) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nsec.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nsec.rb new file mode 100644 index 000000000000..f22a1fa0b845 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nsec.rb @@ -0,0 +1,226 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class NsecTest < Minitest::Test + + include Dnsruby + + INPUT = "alfa.example.com. 86400 IN NSEC host.example.com. ( " + + "A MX RRSIG NSEC TYPE1234 )" + def test_nsec_from_string + nsec = Dnsruby::RR.create(INPUT) + assert_equal("host.example.com", nsec.next_domain.to_s) + assert_equal([Types.A, Types.MX, Types.RRSIG, Types.NSEC, Types.TYPE1234], nsec.types) + + nsec2 = Dnsruby::RR.create(nsec.to_s) + assert(nsec2.to_s == nsec.to_s) + + s = "tjeb.nl. 3600 IN NSEC dragon.tjeb.nl. A NS SOA MX AAAA RRSIG NSEC DNSKEY" + nsec = Dnsruby::RR.create(s) + assert(nsec.types.include?(Types.A)) + assert(nsec.types.include?(Types.DNSKEY)) + end + + def test_nsec_from_data + nsec = Dnsruby::RR.create(INPUT) + m = Dnsruby::Message.new + m.add_additional(nsec) + data = m.encode + m2 = Dnsruby::Message.decode(data) + nsec3 = m2.additional()[0] + assert_equal(nsec.to_s, nsec3.to_s) + end + + def test_nsec_types + # Test types in last section to 65536. + # Test no zeros + nsec = Dnsruby::RR.create(INPUT) + nsec.add_type(Types.TYPE65534) + assert(nsec.types.include?(Types.TYPE65534)) + assert(nsec.to_s.include?(Types.TYPE65534.string)) + end + + def test_examples_from_rfc_4035_name_error + # Grab the example responses from RFC4035 and make sure that they pass. + # Then, try changing some of the NSEC values (ignoring the RRSIGs for now) + # and make sure that they fail verification for that reason + m = Message.new + m.header.rcode = 3 + m.add_question(Question.new("m1.example.")) + m.add_authority(RR.create("example. 3600 IN SOA ns1.example. bugs.x.w.example. ( + 1081539377 + 3600 + 300 + 3600000 + 3600 + )")) + m.add_authority(RR.create("m3.example. 3600 NSEC ns1.example. NS RRSIG NSEC")) + m.add_authority(RR.create("example. 3600 NSEC a.example. NS SOA MX RRSIG NSEC DNSKEY")) + m.add_authority(RR.create("example. 3600 RRSIG NSEC 5 1 3600 20040509183619 ( + 20040409183619 38519 example. + O0k558jHhyrC97ISHnislm4kLMW48C7U7cBm + FTfhke5iVqNRVTB1STLMpgpbDIC9hcryoO0V + Z9ME5xPzUEhbvGnHd5sfzgFVeGxr5Nyyq4tW + SDBgIBiLQUv1ivy29vhXy7WgR62dPrZ0PWvm + jfFJ5arXf4nPxp/kEowGgBRzY/U= )")) + begin + Dnssec.anchor_verifier.verify_nsecs(m) + fail("Should have failed with bad NSECs") + rescue VerifyError + end + m.authority.delete(RR.create("m3.example. 3600 NSEC ns1.example. NS RRSIG NSEC")) + m.add_authority(RR.create("b.example. 3600 NSEC ns1.example. NS RRSIG NSEC")) + Dnssec.anchor_verifier.verify_nsecs(m) + m.authority.delete(RR.create("example. 3600 NSEC a.example. NS SOA MX RRSIG NSEC DNSKEY")) + begin + Dnssec.anchor_verifier.verify_nsecs(m) + fail("Should have failed with no wildcard proof") + rescue VerifyError + end + end + + def test_examples_from_rfc_4035_no_data + # Grab the example responses from RFC4035 and make sure that they pass. + # Then, try changing some of the NSEC values (ignoring the RRSIGs for now) + # and make sure that they fail verification for that reason + m = Message.new + m.header.rcode = 0 + m.add_question(Question.new("ns1.example.", Types.MX)) + m.add_authority(RR.create("example. 3600 IN SOA ns1.example. bugs.x.w.example. ( + 1081539377 + 3600 + 300 + 3600000 + 3600 + )")) + m.add_authority(RR.create("m3.example. 3600 NSEC n1.example. NS RRSIG NSEC")) + begin + Dnssec.anchor_verifier.verify_nsecs(m) + fail("Should have failed with bad NSECs") + rescue VerifyError + end + m.authority.delete(RR.create("m3.example. 3600 NSEC n1.example. NS RRSIG NSEC")) + m.add_authority(RR.create("ns1.example. 3600 NSEC ns2.example. A RRSIG NSEC")) + Dnssec.anchor_verifier.verify_nsecs(m) + m.authority.delete(RR.create("ns1.example. 3600 NSEC ns2.example. A RRSIG NSEC")) + m.add_authority(RR.create("ns1.example. 3600 NSEC ns2.example. A RRSIG MX NSEC")) + begin + Dnssec.anchor_verifier.verify_nsecs(m) + fail("Should have failed on type covered") + rescue VerifyError + end + end + + def test_examples_from_rfc_4035_wildcard_expansion + # Grab the example responses from RFC4035 and make sure that they pass. + # Then, try changing some of the NSEC values (ignoring the RRSIGs for now) + # and make sure that they fail verification for that reason + m = Message.new + m.header.rcode = + m.add_question(Question.new("a.z.w.example.", Types.MX)) + m.add_answer(RR.create("a.z.w.example. 3600 IN MX 1 ai.example.")) + m.add_answer(RR.create("a.z.w.example. 3600 RRSIG MX 5 4 3600 20040509183619 ( + 20040409183619 38519 example. + OMK8rAZlepfzLWW75Dxd63jy2wswESzxDKG2 + f9AMN1CytCd10cYISAxfAdvXSZ7xujKAtPbc + tvOQ2ofO7AZJ+d01EeeQTVBPq4/6KCWhqe2X + TjnkVLNvvhnc0u28aoSsG0+4InvkkOHknKxw + 4kX18MMR34i8lC36SR5xBni8vHI= )")) + m.add_authority(RR.create("x.y.w.example. 3600 NSEC xx.example. MX RRSIG NSEC")) + begin + Dnssec.anchor_verifier.verify_nsecs(m) + fail("Should have failed with bad number of labels in RRSIG") + rescue VerifyError + end + m.answer.delete(RR.create("a.z.w.example. 3600 RRSIG MX 5 4 3600 20040509183619 ( + 20040409183619 38519 example. + OMK8rAZlepfzLWW75Dxd63jy2wswESzxDKG2 + f9AMN1CytCd10cYISAxfAdvXSZ7xujKAtPbc + tvOQ2ofO7AZJ+d01EeeQTVBPq4/6KCWhqe2X + TjnkVLNvvhnc0u28aoSsG0+4InvkkOHknKxw + 4kX18MMR34i8lC36SR5xBni8vHI= )")) + m.add_answer(RR.create("a.z.w.example. 3600 RRSIG MX 5 2 3600 20040509183619 ( + 20040409183619 38519 example. + OMK8rAZlepfzLWW75Dxd63jy2wswESzxDKG2 + f9AMN1CytCd10cYISAxfAdvXSZ7xujKAtPbc + tvOQ2ofO7AZJ+d01EeeQTVBPq4/6KCWhqe2X + TjnkVLNvvhnc0u28aoSsG0+4InvkkOHknKxw + 4kX18MMR34i8lC36SR5xBni8vHI= )")) + Dnssec.anchor_verifier.verify_nsecs(m) + m.authority.delete(RR.create("x.y.w.example. 3600 NSEC xx.example. MX RRSIG NSEC")) + m.add_authority(RR.create("x.y.w.example. 3600 NSEC z.w.example. MX RRSIG NSEC")) + begin + Dnssec.anchor_verifier.verify_nsecs(m) + fail("Should have failed with bad NSEC") + rescue VerifyError + end + end + + def test_examples_from_rfc_4035_wildcard_no_data + # Grab the example responses from RFC4035 and make sure that they pass. + # Then, try changing some of the NSEC values (ignoring the RRSIGs for now) + # and make sure that they fail verification for that reason + m = Message.new + m.header.rcode = 0 + m.add_question(Question.new("a.z.w.example.", Types.AAAA)) + m.add_authority(RR.create("example. 3600 IN SOA ns1.example. bugs.x.w.example. ( + 1081539377 + 3600 + 300 + 3600000 + 3600 + )")) + m.add_authority(RR.create("x.y.w.example. 3600 NSEC xx.example. MX RRSIG NSEC")) + m.add_authority(RR.create("*.w.example. 3600 NSEC x.y.example. MX RRSIG NSEC")) + begin + Dnssec.anchor_verifier.verify_nsecs(m) + fail("Should have failed with bad wildcard expansion") + rescue VerifyError + end + m.authority.delete(RR.create("*.w.example. 3600 NSEC x.y.example. MX RRSIG NSEC")) + m.add_authority(RR.create("*.w.example. 3600 NSEC x.w.example. MX RRSIG NSEC")) + # Test bad versions of wildcard no data + Dnssec.anchor_verifier.verify_nsecs(m) + m.authority.delete(RR.create("x.y.w.example. 3600 NSEC xx.example. MX RRSIG NSEC")) + begin + Dnssec.anchor_verifier.verify_nsecs(m) + fail("Should have failed with no nsecs") + rescue VerifyError + end + end + + # @TODO@ Test referrals + # def test_examples_from_rfc_4035_referral_signed + # # Grab the example responses from RFC4035 and make sure that they pass. + # # Then, try changing some of the NSEC values (ignoring the RRSIGs for now) + # # and make sure that they fail verification for that reason + # m = Message.new + # m.header.rcode = 3 + # fail + # end + # + # def test_examples_from_rfc_4035_referral_unsigned + # # Grab the example responses from RFC4035 and make sure that they pass. + # # Then, try changing some of the NSEC values (ignoring the RRSIGs for now) + # # and make sure that they fail verification for that reason + # m = Message.new + # m.header.rcode = 3 + # fail + # end + # +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nsec3.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nsec3.rb new file mode 100644 index 000000000000..0848c6e03d1b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nsec3.rb @@ -0,0 +1,139 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class Nsec3Test < Minitest::Test + + include Dnsruby + + INPUT = "2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. 3600 IN NSEC3 1 1 12 aabbccdd ( " + + "2vptu5timamqttgl4luu9kg21e0aor3s A RRSIG )" + INPUT2 = "2t7b4g4vsa5smi47k61mv5bv1a22bojr.example. 3600 IN NSEC3 1 1 12 aabbccdd " + + "2vptu5timamqttgl4luu9kg21e0aor3s" + def test_nsec_from_string + nsec = Dnsruby::RR.create(INPUT) +# assert_equal(H("x.y.w.example"), nsec.next_hashed.to_s) + assert_equal([Types.A, Types.RRSIG], nsec.types) + assert(nsec.opt_out?) + assert_equal(12, nsec.iterations) + assert_equal("aabbccdd", nsec.salt) + assert_equal(Dnsruby::Nsec3HashAlgorithms.SHA_1, nsec.hash_alg) + + nsec2 = Dnsruby::RR.create(nsec.to_s) + assert(nsec2.to_s == nsec.to_s) + + nsec = Dnsruby::RR.create(INPUT2) + assert_equal([], nsec.types) + assert(nsec.opt_out?) + assert_equal(12, nsec.iterations) + assert_equal("aabbccdd", nsec.salt) + assert_equal(Dnsruby::Nsec3HashAlgorithms.SHA_1, nsec.hash_alg) + + nsec2 = Dnsruby::RR.create(nsec.to_s) + assert(nsec2.to_s == nsec.to_s) + end + + def test_base32 + inputs = [["",""], ["f","CO======"], + ["fo","CPNG===="], ["foo", "CPNMU==="], + ["foob", "CPNMUOG="], ["fooba", "CPNMUOJ1"], + ["foobar", "CPNMUOJ1E8======"]] + + inputs.each {|dec, enc| + assert(Base32.encode32hex(dec) == enc, "Failed encoding #{dec}") + assert(Base32.decode32hex(enc) == dec, "Failed decoding #{enc}") + } + end + + def test_nsec_from_data + nsec = Dnsruby::RR.create(INPUT) + m = Dnsruby::Message.new + m.add_additional(nsec) + data = m.encode + m2 = Dnsruby::Message.decode(data) + nsec3 = m2.additional()[0] + assert_equal(nsec.to_s, nsec3.to_s) + end + + def test_calculate_hash + input = [ +[ "example" , "0p9mhaveqvm6t7vbl5lop2u3t2rp3tom"], +[ "a.example" , "35mthgpgcu1qg68fab165klnsnk3dpvl"], +[ "ai.example" , "gjeqe526plbf1g8mklp59enfd789njgi"], +[ "ns1.example" , "2t7b4g4vsa5smi47k61mv5bv1a22bojr"], +[ "ns2.example" , "q04jkcevqvmu85r014c7dkba38o0ji5r"], +[ "w.example" , "k8udemvp1j2f7eg6jebps17vp3n8i58h"], +[ "*.w.example" , "r53bq7cc2uvmubfu5ocmm6pers9tk9en"], +[ "x.w.example" , "b4um86eghhds6nea196smvmlo4ors995"], +[ "y.w.example" , "ji6neoaepv8b5o6k4ev33abha8ht9fgc"], +[ "x.y.w.example" , "2vptu5timamqttgl4luu9kg21e0aor3s"], +[ "xx.example" , "t644ebqk9bibcna874givr6joj62mlhv"], +[ "2t7b4g4vsa5smi47k61mv5bv1a22bojr.example" , "kohar7mbb8dc2ce8a9qvl8hon4k53uhi"] + ] + input.each {|name, hash| + nsec3 = Dnsruby::RR.create({:type => Dnsruby::Types.NSEC3, :name => name, :salt => "aabbccdd", :iterations => 12, :hash_alg => 1}) + n = nsec3.calculate_hash + assert_equal(n, hash, "Expected #{hash} but got #{n} for #{name}") + c = Dnsruby::RR::NSEC3.calculate_hash(name, 12, Dnsruby::RR::NSEC3.decode_salt("aabbccdd"), 1) + assert_equal(c, hash, "Expected #{hash} but got #{c} for #{name}") + } + # + end + + def test_nsec_other_stuff + nsec = Dnsruby::RR.create(INPUT) +# begin +# nsec.salt_length=256 +# fail +# rescue DecodeError +# end +# begin +# nsec.hash_length=256 +# fail +# rescue DecodeError +# end + # Be liberal in what you accept... +# begin +# nsec.hash_alg = 8 +# fail +# rescue DecodeError +# end + begin + nsec.flags = 2 + fail + rescue DecodeError + end + end + + def test_nsec_types + # Test types in last section to 65536. + # Test no zeros + nsec = Dnsruby::RR.create(INPUT) + nsec.add_type(Types.TYPE65534) + assert(nsec.types.include?(Types.TYPE65534)) + assert(nsec.to_s.include?(Types.TYPE65534.string)) + end + + def test_types + rr = RR.create("tfkha3ph6qs16qu3oqtmnfc5tbckpjl7.archi.amt. 1209600 IN NSEC3 1 1 5 - 1tmmto81uc71moj44cli3m6avs5l44l3 NSEC3 CNAME RRSIG ; flags: optout") + assert(rr.types.include?(Types::NSEC3)) + assert(rr.types.include?(Types::CNAME)) + assert(rr.types.include?(Types::RRSIG)) + rr = RR.create("929p027vb26s89h6fv5j7hmsis4tcr1p.tjeb.nl. 3600 IN NSEC3 1 0 5 beef 9rs4nbe7128ap5i6v196ge2iag5b7rcq A AAAA RRSIG + ") + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nsec3param.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nsec3param.rb new file mode 100644 index 000000000000..0846c2bd348a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nsec3param.rb @@ -0,0 +1,55 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class Nsec3ParamTest < Minitest::Test + + include Dnsruby + + INPUT = "example. 3600 IN NSEC3PARAM 1 0 12 aabbccdd" + + def test_nsec_from_string + nsec = Dnsruby::RR.create(INPUT) + + assert_equal(Dnsruby::Nsec3HashAlgorithms.SHA_1, nsec.hash_alg) + assert_equal(0, nsec.flags) + assert_equal(12, nsec.iterations) + assert_equal("aabbccdd", nsec.salt) + + nsec2 = Dnsruby::RR.create(nsec.to_s) + assert(nsec2.to_s == nsec.to_s) + end + + def test_nsec_from_data + nsec = Dnsruby::RR.create(INPUT) + m = Dnsruby::Message.new + m.add_additional(nsec) + data = m.encode + m2 = Dnsruby::Message.decode(data) + nsec3 = m2.additional()[0] + assert_equal(nsec.to_s, nsec3.to_s) + + end + + def test_from_real_string + r = Dnsruby::RR.create("tjeb.nl. 3600 IN NSEC3PARAM 1 0 5 beef") + assert_equal(Dnsruby::Name.create("tjeb.nl."), r.name) + assert_equal("beef", r.salt) + assert_equal(Dnsruby::Nsec3HashAlgorithms.SHA_1, r.hash_alg) + end + +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nxt.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nxt.rb new file mode 100644 index 000000000000..766035b1f5d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_nxt.rb @@ -0,0 +1,192 @@ +require_relative 'spec_helper' + +require_relative '../lib/dnsruby/resource/NXT' +require_relative '../lib/dnsruby/code_mappers' + +# Tests NXT resource record. See bottom of file for sample zone file. +class TestNXT < Minitest::Test + + include Dnsruby + + # Get this by running the following script: + # require 'dnsruby' + # include Dnsruby + # query = Message.new('a.dnsruby.com', 'NXT') + # resolver = Resolver.new('127.0.0.1') + # response, error = resolver.query_raw(query) + # puts response.encode.inspect # to get a quoted string to be inserted in source code + + + EXAMPLE_NXT_RESPONSE_AS_BINARY = \ + "\xC2\xE0\x84\x80\x00\x01\x00\x01\x00\x01" + + "\x00\x01\x01a\adnsruby\x03com\x00" + + "\x00\x1E\x00\x01\xC0\f\x00\x1E\x00\x01\x00\x00*0\x00\x13\x01b\adnsruby\x03com\x00" + + "@\x00\x00\n\xC0\x0E\x00\x02\x00\x01\x00\x00*0\x00\x06\x03ns1\xC0\x0E\xC0J\x00\x01\x00" + + "\x01\x00\x00*0\x00\x04\x7F\x00\x00\x01" + + def test_type_val_to_string + assert_equal 'SOA', RR::NXT::NxtTypes.code_to_name(6) + assert_equal 'AXFR', RR::NXT::NxtTypes.code_to_name(252) + assert_equal 'TYPE9999', RR::NXT::NxtTypes.code_to_name(9999) + end + + def test_type_name_to_code + assert_equal 6, RR::NXT::NxtTypes.name_to_code('SOA') + assert_equal 252, RR::NXT::NxtTypes.name_to_code('AXFR') + assert_equal 9999, RR::NXT::NxtTypes.name_to_code('TYPE9999') + end + + def test_type_names_to_codes + strings = %w(TYPE9999 SOA AXFR) + assert_equal [9999, 6, 252], RR::NXT::NxtTypes.names_to_codes(strings) + end + + def test_type_name_to_codes + assert_equal [9999, 6, 252], RR::NXT::NxtTypes.names_string_to_codes("TYPE9999 SOA AXFR") + end + + def test_codes_to_names + assert_equal %w(TYPE9999 SOA AXFR), RR::NXT::NxtTypes.codes_to_names([9999, 6, 252]) + end + + def test_codes_to_string + assert_equal 'SOA AXFR TYPE9999', RR::NXT::NxtTypes.codes_to_string([6, 252, 9999]) + end + + def test_codes_to_name_sorts_by_code + assert_equal 'SOA AXFR TYPE9999', RR::NXT::NxtTypes.codes_to_string([9999, 6, 252]) + end + + def test_binary_string_to_codes + test_type_codes_as_code_array = [1, 6, 28, 100] + test_type_codes_as_name_array = %w(A SOA AAAA UINFO) + test_type_codes_as_number = 1267650600228229401496971640898 # (2 ** 1) + (2 ** 6) + (2 ** 28) + (2 ** 100) + test_type_codes_as_binary_string = "\x10\x0\x0\x0\x0\x0\x0\x0\x0\x10\x0\x0\x42" + assert_equal(test_type_codes_as_code_array, RR::NXT::NxtTypes.binary_string_to_codes(test_type_codes_as_binary_string)) + assert_equal(test_type_codes_as_name_array, RR::NXT::NxtTypes.binary_string_to_names(test_type_codes_as_binary_string)) + assert_equal(test_type_codes_as_binary_string, RR::NXT::NxtTypes.codes_to_binary_string(test_type_codes_as_code_array)) + end + + def test_that_codes_are_in_range_1_to_127 + TestUtils.assert_not_raised(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([1]) } + TestUtils.assert_not_raised(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([127]) } + assert_raises(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([0]) } + assert_raises(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([128]) } + end + + def test_that_zero_bit_set_raises_error + assert_raises(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([]) } + end + + def test_A_AAAA_NXT + assert_equal([1, 28, 30], RR::NXT::NxtTypes.names_string_to_codes('A AAAA NXT')) + assert_equal("P\x00\x00\x02", RR::NXT::NxtTypes.codes_to_binary_string([1, 28, 30])) + end + + def test_type_bitmap_ctor_is_private + assert_raises(NoMethodError) { RR::NXT::TypeBitmap.new('') } + end + + def test_type_bitmap_to_s + type_bitmap = RR::NXT::TypeBitmap.from_type_codes([1, 16, 30]) + assert_equal('A TXT NXT', type_bitmap.to_s) + end + + def test_parse_response_correctly + response = Message.decode(EXAMPLE_NXT_RESPONSE_AS_BINARY) + answer = response.answer + nxt_record = answer[0] + + # Note: Although the NXT class is defined as Dnsruby::RR::NXT and not + # Dnsruby::RR::IN::NXT, the IN module (in IN.rb) creates new classes + # in the IN module for all class-insensitive resource record classes. + # When the binary record is parsed, it is a Dnsruby::RR::IN::NXT + # that is created. + assert_equal(Dnsruby::RR::IN::NXT, nxt_record.class) + actual_tokens = nxt_record.to_s.split + expected_tokens = 'a.dnsruby.com. 10800 IN NXT b.dnsruby.com A AAAA NXT'.split + assert_equal(actual_tokens, expected_tokens) + end + + def assert_rr_content(rr) + assert_equal(rr.type, 'NXT') # TODO: Should this be a string or a number? + assert_equal(rr.name, Name.create('b.dnsruby.com.')) + assert_equal(rr.ttl, 10800) + assert_equal(rr.klass, 'IN') + assert_equal(rr.next_domain, Name.create('a.dnsruby.com.')) + end + + def test_new_from_string + rr = RR::NXT.new_from_string('b.dnsruby.com. 10800 IN NXT a.dnsruby.com. SOA NXT') + assert_rr_content(rr) + end + + def test_new_from_hash + assert_rr_content(sample_nxt_rr) + end + + def test_new_from_data + rdata = RR::NXT.build_rdata('a.dnsruby.com.', [Types::SOA, Types::NXT]) + + rr = RR::NXT.new_from_data('b.dnsruby.com.', Types::NXT, Classes::IN, 10800, + rdata.size, rdata, 0) + assert_rr_content(rr) + end + + def test_owner_alias + rr = sample_nxt_rr + assert_equal('b.dnsruby.com', rr.owner.to_s) + assert_equal('b.dnsruby.com', rr.name.to_s) + new_name = Name.create('z.com') + rr.owner = new_name + assert_equal(new_name, rr.owner) + assert_equal(new_name, rr.name) + end + + + def test_encode_decode_message + nxt_rr = sample_nxt_rr + message = Message.new + message.add_answer(nxt_rr) + binary_message = message.encode + reconstructed_message = Message.decode(binary_message) + reconstructed_nxt_rr = reconstructed_message.answer[0] + assert_equal(nxt_rr, reconstructed_nxt_rr) + end + + def sample_nxt_rr + RR::NXT.new_from_hash( + name: 'b.dnsruby.com.', + ttl: 10800, + klass: Classes::IN, + next_domain: 'a.dnsruby.com.', + types: [Types::SOA, Types::NXT]) + end +end + + + +# Sample zone file for setting up BIND to serve a NXT record: +=begin +$TTL 3h + +@ IN SOA dnsruby.com. foo.dnsruby.com. ( + 1 ; serial + 3H ; refresh after 3 hours + 1H ; retry after 1 hour + 1W ; expire after 1 week + 1H) ; negative caching TTL of 1 hour + +dnsruby.com. IN NS ns1 + +; Addresses for canonical names + +ns1.dnsruby.com. IN A 127.0.0.1 + +a.dnsruby.com. IN A 2.4.6.8 + IN NXT b A AAAA NXT + +b.dnsruby.com. IN A 2.4.6.9 + IN GPOS 40 50 60 + +=end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_packet.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_packet.rb new file mode 100644 index 000000000000..70bbb0431675 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_packet.rb @@ -0,0 +1,299 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestPacket < Minitest::Test + + include Dnsruby + + def test_packet + domain = "example.com." + type = "MX" + klass = "IN" + + packet = Message.new(domain, type, klass) + + assert(packet, 'new() returned something'); #2 + assert(packet.header, 'header() method works'); #3 + assert_instance_of(Header,packet.header,'header() returns right thing'); #4 + + + question = packet.question; + assert(question && question.length == 1, 'question() returned right number of items'); #5 + # assert_instance_of(Net::DNS::Question,question[0], 'question() returned the right thing'); #6 + + answer = packet.answer; + assert(answer.length == 0, 'answer() works when empty'); #7 + + + authority = packet.authority; + assert(authority.length == 0, 'authority() works when empty'); #8 + + additional = packet.additional; + assert(additional.length == 0, 'additional() works when empty'); #9 + + packet.add_answer(RR.create( { + :name => "a1.example.com.", + :type => Types.A, + :address => "10.0.0.1"})); + assert_equal(1, packet.header.ancount, 'First push into answer section worked'); #10 + + + ret = packet.answer.rrset("example.com.", 'NSEC') + assert_equal(ret.rrs.length, 0, "#{ret.rrs.length}") + ret = packet.answer.rrset("a1.example.com", 'A') + assert_equal(ret.rrs.length, 1, "#{ret.rrs.length}") + ret = packet.answer.rrsets() + assert_equal(ret.length, 1, "#{ret.length}") + + packet.add_answer(RR.create({:name => "a2.example.com.", + :type => "A", :address => "10.0.0.2"})); + assert_equal(packet.header.ancount, 2, 'Second push into answer section worked'); #11 + + packet.add_authority(RR.create({:name => "a3.example.com.", + :type => "A", + :address => "10.0.0.3"})); + assert_equal(1, packet.header.nscount, 'First push into authority section worked'); #12 + + + packet.add_authority(RR.create( { + :name => "a4.example.com.", + :type => "A", + :address => "10.0.0.4"})); + assert_equal(2, packet.header.nscount, 'Second push into authority section worked'); #13 + + packet.add_additional(RR.create({ + :name => "a5.example.com.", + :type => "A", + :address => "10.0.0.5"})); + assert_equal(1, packet.header.adcount, 'First push into additional section worked'); #14 + + packet.add_additional(RR.create( { + :name => "a6.example.com.", + :type => Types.A, + :address => "10.0.0.6"})); + assert_equal(2, packet.header.adcount, 'Second push into additional section worked'); #15 + + data = packet.encode; + + packet2 = Message.decode(data); + + assert(packet2, 'new() from data buffer works'); #16 + + assert_equal(packet.to_s, packet2.to_s, 'inspect() works correctly'); #17 + + + string = packet2.to_s + 6.times do |count| + ip = "10.0.0.#{count+1}"; + assert(string =~ /#{ip}/, "Found #{ip} in packet"); # 18 though 23 + end + + assert_equal(1, packet2.header.qdcount, 'header question count correct'); #24 + assert_equal(2, packet2.header.ancount, 'header answer count correct'); #25 + assert_equal(2, packet2.header.nscount, 'header authority count correct'); #26 + assert_equal(2, packet2.header.adcount, 'header additional count correct'); #27 + + + + # Test using a predefined answer. This is an answer that was generated by a bind server. + # + + # data=["22cc85000001000000010001056461636874036e657400001e0001c00c0006000100000e100025026e730472697065c012046f6c6166c02a7754e1ae0000a8c0000038400005460000001c2000002910000000800000050000000030"].pack("H*"); + uuencodedPacket =%w{ +22 cc 85 00 00 01 00 00 00 01 00 01 05 64 61 63 +68 74 03 6e 65 74 00 00 1e 00 01 c0 0c 00 06 00 +01 00 00 0e 10 00 25 02 6e 73 04 72 69 70 65 c0 +12 04 6f 6c 61 66 c0 2a 77 54 e1 ae 00 00 a8 c0 +00 00 38 40 00 05 46 00 00 00 1c 20 00 00 29 10 +00 00 00 80 00 00 05 00 00 00 00 30 + } + + uuencodedPacket = %w{ +ba 91 81 80 00 01 +00 04 00 00 00 01 07 65 78 61 6d 70 6c 65 03 63 +6f 6d 00 00 ff 00 01 c0 0c 00 02 00 01 00 02 9f +f4 00 14 01 61 0c 69 61 6e 61 2d 73 65 72 76 65 +72 73 03 6e 65 74 00 c0 0c 00 02 00 01 00 02 9f +f4 00 04 01 62 c0 2b c0 0c 00 01 00 01 00 02 9f +7e 00 04 d0 4d bc a6 c0 0c 00 06 00 01 00 02 9f +f4 00 31 04 64 6e 73 31 05 69 63 61 6e 6e 03 6f +72 67 00 0a 68 6f 73 74 6d 61 73 74 65 72 c0 6e +77 a1 2d b7 00 00 1c 20 00 00 0e 10 00 12 75 00 +00 01 51 80 00 00 29 05 00 00 00 00 00 00 00 + } + uuencodedPacket.map!{|e| e.hex} + packetdata = uuencodedPacket.pack('c*') + + packet3 = Message.decode(packetdata) + assert(packet3, 'new data returned something'); #28 + + assert_equal(packet3.header.qdcount, 1, 'header question count in syntetic packet correct'); #29 + assert_equal(packet3.header.ancount, 4, 'header answer count in syntetic packet correct'); #30 + assert_equal(packet3.header.nscount, 0, 'header authority count in syntetic packet correct'); #31 + assert_equal(packet3.header.adcount, 1, 'header additional in sytnetic packet correct'); #32 + + rr=packet3.additional; + + assert_equal(Types.OPT, rr[0].type, "Additional section packet is EDNS0 type"); #33 + assert_equal(1280, rr[0].klass.code, "EDNS0 packet size correct"); #34 + + # In theory its valid to have multiple questions in the question section. + # Not many servers digest it though. + + packet.add_question("bla.foo", Types::TXT, Classes.CH) + question = packet.question + assert_equal(2, question.length, 'question() returned right number of items poptest:2'); #36 + end + + def get_test_packet + packet=Message.new("254.9.11.10.in-addr.arpa.","PTR","IN") + + packet.add_answer(RR.create(%q[254.9.11.10.in-addr.arpa. 86400 IN PTR host-84-11-9-254.customer.example.com.])); + + packet.add_authority(RR.create("9.11.10.in-addr.arpa. 86400 IN NS autons1.example.com.")); + packet.add_authority(RR.create("9.11.10.in-addr.arpa. 86400 IN NS autons2.example.com.")); + packet.add_authority(RR.create("9.11.10.in-addr.arpa. 86400 IN NS autons3.example.com.")); + return packet + end + + + def test_push + packet = get_test_packet + data=packet.encode + + packet2=Message.decode(data) + + assert_equal(packet.to_s,packet2.to_s,"Packet decode and encode"); #39 + end + + def test_rrset + packet = get_test_packet + packet.each_section do |section| + # print "#{section.rrsets}\n" + end + packet.section_rrsets.each do |section, rrsets| + # print "section = #{section}, rrsets = #{rrsets.length}\n" + end + assert(packet.authority.rrsets.length == 1) + assert(packet.question().length == 1) + assert(packet.answer.rrsets.length == 1) + assert(packet.additional.rrsets.length == 0) + assert(packet.authority.rrsets[0].length == 3) + # assert(packet.additional.rrsets[0].length == 0) + assert(packet.answer.rrsets[0].length == 1) + end + + def test_section + packet = Message.new("ns2.nic.se") + packet.add_answer(RR.create("ns2.nic.se. 3600 IN A 194.17.45.54")) + packet.add_answer(RR.create("ns2.nic.se. 3600 IN RRSIG A 5 3 3600 20090329175503 ( + 20090319175503 32532 nic.se. + YFvEOPpVHgAmPwtM2Q0KD5x6UaZ5bMzINMyW4xXSXOxG + /EYCTbmTfPpfZTnAUPAfNRIA4RS9etMgh5Zy3Wug4dKs + 20+3vwlSz0Ge5jluOoowkWAK3YbLkqwSi1DeZg/HT1Ns + zcBDHMJ9sxmB6d4nuRA6653w9RULVjpKng1gh0s= ) + ")) + packet.add_authority(RR.create("nic.se. 3600 IN NS ns2.nic.se.")) + packet.add_authority(RR.create("nic.se. 3600 IN NS ns3.nic.se.")) + packet.add_authority(RR.create("nic.se. 3600 IN NS ns.nic.se.")) + packet.add_authority(RR.create("nic.se. 3600 IN RRSIG NS 5 2 3600 20090329175503 ( + 20090319175503 32532 nic.se. + ZExPKC9zDiyY0TuuPGDBtzYE119fiXWqihARO41l7uTT + LBbYcCNg3ItJZW2y0o4iFYpqrp62l25uKhO4cMEZbgZs + Gq9B6zZ4/2D0v4zFjlzCEZ0lTrGb6xgOrnQbZUiTbg46 + x9iBai7Ud1w/hgV/TSxikP1SS0J1AillybPiMWQ= )")) + packet.add_additional(RR.create("ns.nic.se. 3600 IN A 212.247.7.228")) + packet.add_additional(RR.create("ns.nic.se. 3600 IN AAAA 2a00:801:f0:53::53")) + packet.add_additional(RR.create("ns3.nic.se. 60 IN A 212.247.3.83")) + packet.add_additional(RR.create("ns.nic.se. 3600 IN RRSIG A 5 3 3600 20090329175503 ( + 20090319175503 32532 nic.se. + opTtrYBF+Mm4BGK+5vvAvzxxgh4GUxa7YxflT1DybG7u + uRdi+ZD6+DFXvaMKPcmVLRcMV2wEv7v1zBj+jaAkqPno + ikOHMtd9g0FtmfxR//TLLzgjDsunee0MX6hLX/ApTUy8 + hhcGB1pxk371tZKSBkNI7SN7gaSnknUUEp6eNN4= )")) + packet.add_additional(RR.create("ns.nic.se. 3600 IN RRSIG AAAA 5 3 3600 20090329175503 ( + 20090319175503 32532 nic.se. + Qaj/eG9MPGF6QZUPpRq3LBxfxQiKki3J2myKy+OQuE65 + juDBb+29YjteqQW1PrilxRjo4apX5Q4LNAhS+bEx+PNU + dHr8x0u7z7fZMCAaZhQndnWTD5Wzf1J97bt0ml78yqDi + PkYeqNTNeM0Y40VTu0aHsPPPZpQRR7MYcODUbl0= )")) + packet.add_additional(RR.create("ns3.nic.se. 60 IN RRSIG A 5 3 60 20090329175503 ( + 20090319175503 32532 nic.se. + Ql7Msgt0HKDifPaCV8UYsiLj7hOEp6LPJJ5oaFrJhooU + Nrp4gcwlX9QbrYXWQ8cgE0Z+bL2c07EX/f+n7+xfgCIu + UtL1tXJPsujZBojMtpnkbZsCb5cQmUv0CjAVIdF82W7Q + mUg/YzRLeIyl/wBm0u8/v7TZp/KbGbaKMWMXkjo= )")) + packet.add_additional(RR::OPT.new(4096, 0x9e22)) + packet.header.aa = true + + assert(packet.answer.length == 2) + assert(packet.authority.length == 4) + assert(packet.additional.length == 7) + + ns3_a_rrset = packet.additional.rrset("ns3.nic.se", "A") + assert(ns3_a_rrset.length == 2) + + section_rrsets = packet.section_rrsets + assert(section_rrsets["answer"].length == 1) + assert(section_rrsets["authority"].length == 1) + assert(section_rrsets["additional"].length == 3) + + add_count = 0 + packet.each_additional {|rr| add_count += 1} + assert(add_count == 7) + + packet.additional.remove_rrset(Name.create("ns.nic.se."), Types.AAAA) + assert(packet.answer.length == 2) + assert(packet.authority.length == 4) + assert(packet.additional.length == 5) + section_rrsets = packet.section_rrsets + assert(section_rrsets["answer"].length == 1) + assert(section_rrsets["authority"].length == 1) + assert(section_rrsets["additional"].length == 2) + + add_count = 0 + packet.each_additional {|rr| add_count += 1} + assert(add_count == 5) + + packet.additional.remove_rrset(Name.create("ns.nic.se."), Types.A) + assert(packet.answer.length == 2) + assert(packet.authority.length == 4) + assert(packet.additional.length == 3) + section_rrsets = packet.section_rrsets + assert(section_rrsets["answer"].length == 1) + assert(section_rrsets["authority"].length == 1) + assert(section_rrsets["additional"].length == 1) + + packet.additional.remove_rrset(Name.create("ns3.nic.se."), Types.A) + assert(packet.answer.length == 2) + assert(packet.authority.length == 4) + assert(packet.additional.length == 1) + section_rrsets = packet.section_rrsets + assert(section_rrsets["answer"].length == 1) + assert(section_rrsets["authority"].length == 1) + assert(section_rrsets["additional"].length == 0) + end + + def test_clone + m = Message.new("blah.example.com", "DNSKEY", "IN") + m.header.rcode=4 + m2 = m.clone + assert_equal(m.to_s, m2.to_s, "Clone to_s failed") + assert_equal(m, m2, "Clone failed") + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_packet_unique_push.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_packet_unique_push.rb new file mode 100644 index 000000000000..eb784c054647 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_packet_unique_push.rb @@ -0,0 +1,104 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestPacketUniquePush < Minitest::Test + + include Dnsruby + + # def test_packUniquePush + # + # + # testProc('unique_push'); + # end + # + # # def test_packetSafePush + # # begin + # # testProc('safe_push'); + # # flunk("Shouldn't work!") + # # rescue Exception + # # end + # # end + + # def testProc (method) + def test_proc + domain = 'example.com'; + + tests = [ + [ + 1, + RR.create('foo.example.com 60 IN A 10.0.0.1'), + RR.create('foo.example.com 60 IN A 10.0.0.1'), + ], + [ + 2, + RR.create('foo.example.com 60 IN A 10.0.0.1'), + RR.create('bar.example.com 60 IN A 10.0.0.1'), + ], + [ + 1, # RFC 2136 section 1.1 + RR.create('foo.example.com 60 IN A 10.0.0.1'), + RR.create('foo.example.com 60 IN A 10.0.0.1'), + RR.create('foo.example.com 90 IN A 10.0.0.1'), + ], + [ + 3, + RR.create('foo.example.com 60 IN A 10.0.0.1'), + RR.create('foo.example.com 60 IN A 10.0.0.2'), + RR.create('foo.example.com 60 IN A 10.0.0.3'), + ], + [ + 3, + RR.create('foo.example.com 60 IN A 10.0.0.1'), + RR.create('foo.example.com 60 IN A 10.0.0.2'), + RR.create('foo.example.com 60 IN A 10.0.0.3'), + RR.create('foo.example.com 60 IN A 10.0.0.1'), + ], + [ + 3, + RR.create('foo.example.com 60 IN A 10.0.0.1'), + RR.create('foo.example.com 60 IN A 10.0.0.2'), + RR.create('foo.example.com 60 IN A 10.0.0.1'), + RR.create('foo.example.com 60 IN A 10.0.0.4'), + ], + ] + + methods = { + 'add_answer' => 'ancount', + 'add_authority' => 'nscount', + 'add_additional' => 'arcount', + } + + tests.each do | try | + count = try.shift; + rrs = try; + + methods.each do |method, count_meth| + + packet = Message.new(domain) + + rrs.each do |rr| + packet.send(method,rr) + end + + assert_equal(count, packet.header.send(count_meth), "#{method} right for #{rrs.inspect}"); + assert_equal(count, packet.header.send(count_meth), "#{method} right for #{rrs.inspect}"); + + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_ptrin.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_ptrin.rb new file mode 100644 index 000000000000..3ceeb5e3839e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_ptrin.rb @@ -0,0 +1,28 @@ +require_relative 'spec_helper' + +class TestPtrIn < Minitest::Test + + include Dnsruby + + # Tests that message raises no error when decoded, encoded, and decoded again. + def verify(message_data_as_hex_string, canonical = false) + # Dnsruby.log.level = Logger::DEBUG + message = Message.decode([message_data_as_hex_string].pack('H*').force_encoding("ASCII-8BIT")) + Message.decode(message.encode(canonical)) + end + + + #example.com A IN (2-byte size removed at beginning) + def test_non_canonical + verify( + 'f8f681900001000200030005076578616d706c6503636f6d0000010001c00c0001000100014f0c00045db8d822c00c002e000100014f0c00a20001080200015180580ec93f57f38df906a8076578616d706c6503636f6d006ae1882b1536a15c44f5813671af57bf9cae0366cff2ec085d6dedfddff0c469fa827ceec953de7cc1eee634f4cf695dc2caa2074f95199a5582e51e63b336d8f091d18c0c1a307ae3f5508ec650c4085a95e54e2c2451d9fc9ae04b4e62f3d1a1689e9507c3692fb84817a70afd3e9cdf066f73cc4ac11ed080a30d2af31510b457b5c04b0002000100014f0c001401620c69616e612d73657276657273036e657400c04b0002000100014f0c00040161c0e9c04b002e000100014f0c00a2000208020001518058109f4c57f56c1906a8076578616d706c6503636f6d006d8dd0fdbd0a0b0bfe7e4306a4a001bb7a13df2faedb1702a329243c326b915191335e99e16a236de99360547efa96ec6ee547a6dcfab94b57de6f7891bcaf99a2ef5d3c72d5bc18d1bf05ff4473f527bd8f2e6621489ab531dfb6a973e37e0f0be52740a362599058b204097a04c96492e527bfca6a22338eb865b51156c2ab0e6940c10700010001000004940004c72b8735c107001c00010001e209001020010500008f00000000000000000053c0e700010001000004940004c72b8535c0e7001c00010001e209001020010500008d000000000000000000530000291000000080000000') + end + + + #32.197.46.207.in-addr.arpa: type PTR, class IN (2-byte size removed at beginning) + def test_canonical + verify( + 'bb7a81900001041200000001023332033139370234360332303707696e2d61646472046172706100000c0001c00c000c0001000008aa0017116270666f726772656174706c61696e733203636f6d00c00c000c0001000008aa00130e64657369676e6564666f7262696702636e00c00c000c0001000008aa000f0a6f66666963653230303702636800c00c000c0001000008aa000e0977696e646f77737870026b7a00c00c000c0001000008aa00150f77696e646f77733230303074657374036f726700c00c000c0001000008aa000e0b77696e646f77736e743938c0bfc00c000c0001000008aa0016117370726f7374616a77797a77616e696f6d02706c00c00c000c0001000008aa000f09697462727565636b65036e657400c00c000c0001000008aa001512626c7565796f6e6465726169726c696e6573c0bfc00c000c0001000008aa00140f6d73646e746563686e6574746f757202667200c00c000c0001000008aa000c0977696e646f77733938c085c00c000c0001000008aa00130a6f66666963653230303703636f6d026d7800c00c000c0001000008aa000906617a7572696bc116c00c000c0001000008aa00140f65756772616e747361647669736f7202697400c00c000c0001000008aa00171477696e646f7773787067616d6561647669736f72c0bfc00c000c0001000008aa000e09697462727565636b6502646500c00c000c0001000008aa00100b77696e646f77737275627902686b00c00c000c0001000008aa00120977696e646f7773787003636f6d02677400c00c000c0001000008aa000e0b77696e646f777332303037c0bfc00c000c0001000008aa00151268756d6f6e676f7573696e737572616e6365c04ac00c000c0001000008aa001411756b636f6d6d756e697479617761726473c116c00c000c0001000008aa00130a77696e64736f77737870036e657402646f00c00c000c0001000008aa001509646f776e6c6f616473086263656e7472616cc04ac00c000c0001000008aa000e09666f726566726f6e7402617400c00c000c0001000008aa00120d726573706f6e7365706f696e74026c7400c00c000c0001000008aa00130e65766572796f6e6567657473697402657500c00c000c0001000008aa000e09666f726566726f6e7402626500c00c000c0001000008aa00100977696e646f77737870036f7267c2b5c00c000c0001000008aa00120977696e646f777378700372656302726f00c00c000c0001000008aa00120d726573706f6e7365706f696e7402706800c00c000c0001000008aa0015126361707375726c6573756363657332303038c116c00c000c0001000008aa000e0977696e646f7773787002706e00c00c000c0001000008aa000e0b77696e646f777332303030c085c00c000c0001000008aa001815636f686f76696e6579617264616e6477696e657279c04ac00c000c0001000008aa00120977696e646f7773787003636f6d02746c00c00c000c0001000008aa00140f65756772616e747361647669736f72026c7600c00c000c0001000008aa00140f65756772616e747361647669736f7202636c00c00c000c0001000008aa00181164656679616c6c6368616c6c656e67657303636f6dc21dc00c000c0001000008aa00110e7374617274736f6d657468696e67c347c00c000c0001000008aa00100977696e646f77737870036f7267c23bc00c000c0001000008aa00100977696e646f77737870036f7267c0fcc00c000c0001000008aa0016136f666672652d65626c6f75697373616e746573c0bfc00c000c0001000008aa00140b77696e646f77737275627903636f6d02657300c00c000c0001000008aa000f0a6f66666963653230303702636100c00c000c0001000008aa000e0977696e646f7773787002616d00c00c000c0001000008aa001109626570636c6567616c02636f02756b00c00c000c0001000008aa000d0877696e646f77787002747600c00c000c0001000008aa00110977696e646f7773787004696e666fc381c00c000c0001000008aa001f1c786e2d2d66726465726d697474656c2d72617467656265722d333962c201c00c000c0001000008aa00110e65766572796f6e65676574736974c531c00c000c0001000008aa00151268756d6f6e676f7573696e737572616e6365c0bfc00c000c0001000008aa00110e696973646961676e6f7374696373c0bfc00c000c0001000008aa00160f65756772616e747361647669736f7203636f6dc0fcc00c000c0001000008aa000b06666c6578676f02696e00c00c000c0001000008aa00120f696e73696465647269766532303032c04ac00c000c0001000008aa00100d726573706f6e7365706f696e74c18bc00c000c0001000008aa001815636f6e736f6c6964617465646d657373656e676572c116c00c000c0001000008aa000c09666f726566726f6e74c678c00c000c0001000008aa00140b77696e646f77737275627903636f6d02766500c00c000c0001000008aa0017146761676e657a2d656e2d65666669636163697465c0bfc00c000c0001000008aa000f0c636f686f76696e6579617264c0bfc00c000c0001000008aa001714636f6e73756d6572676f6f647373656d696e6172c04ac00c000c0001000008aa001310666f726f706572737065637469766173c0bfc00c000c0001000008aa00120977696e646f7773787003636f6d02616900c00c000c0001000008aa00170e65766572796f6e6567657473697403636f6d02617500c00c000c0001000008aa00120977696e646f77737870036e657402766900c00c000c0001000008aa00120f77696e646f77733230303074657374c116c00c000c0001000008aa00180f65756772616e747361647669736f7203636f6d02707400c00c000c0001000008aa00100b77696e646f777332303030026e6c00c00c000c0001000008aa000c0977696e646f77733935c0bfc00c000c0001000008aa0014117365727665757273616e736c696d697465c116c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c2f0c00c000c0001000008aa000e0977696e646f7773787002736e00c00c000c0001000008aa000e0977696e646f7773787002736300c00c000c0001000008aa0017146d6963726f736f667474696d65657870656e7365c04ac00c000c0001000008aa001c19647269766572646576656c6f706572636f6e666572656e6365c0bfc00c000c0001000008aa000b0877696e646f777870c82bc00c000c0001000008aa000b0661786170746102727500c00c000c0001000008aa000f09666f726566726f6e7402636fc678c00c000c0001000008aa000b0877696e646f777870c436c00c000c0001000008aa000c09626570636c6567616cc04ac00c000c0001000008aa000b0877696e646f777870c456c00c000c0001000008aa000b06666c6578676f02746d00c00c000c0001000008aa0017146761676e657a2d656e2d65666669636163697465c116c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c158c00c000c0001000008aa00110e636c7562736d61727470686f6e65c116c00c000c0001000008aa000c09666f726566726f6e74c158c00c000c0001000008aa00100d726573706f6e7365706f696e74c347c00c000c0001000008aa0015126361707375726c6573756363657332303038c0bfc00c000c0001000008aa000c09666f726566726f6e74c52dc00c000c0001000008aa000906666c6578676fc84bc00c000c0001000008aa00100977696e646f77737870036f7267c39fc00c000c0001000008aa00151273747265616d6c696e6566696e616e636573c04ac00c000c0001000008aa00130d726573706f6e7365706f696e740362697a00c00c000c0001000008aa00120d726573706f6e7365706f696e7402646b00c00c000c0001000008aa000f0c6d6f6e6e6f7576656c616d69c158c00c000c0001000008aa00120f77696e646f77733230303074657374c04ac00c000c0001000008aa000f0c666f75727468636f66666565c04ac00c000c0001000008aa001310666f726f706572737065637469766173c116c00c000c0001000008aa00110e6272757465666f72636567616d65c04ac00c000c0001000008aa000c09696e73656775726f73c116c00c000c0001000008aa00100d726573706f6e7365706f696e74c381c00c000c0001000008aa000f0c647269766572646576636f6ec04ac00c000c0001000008aa001611666f727265746e696e677373797374656d026e6f00c00c000c0001000008aa00140f65756772616e747361647669736f72026c7500c00c000c0001000008aa00100977696e646f77737870036e6574c436c00c000c0001000008aa00120977696e646f7773787003636f6d02666a00c00c000c0001000008aa00140d726573706f6e7365706f696e7403636f6dc06ac00c000c0001000008aa00100d726573706f6e7365706f696e74c580c00c000c0001000008aa000c09666f726566726f6e74c085c00c000c0001000008aa000e0977696e646f7773787002686e00c00c000c0001000008aa00161370736f65786563757469766573656d696e6172c04ac00c000c0001000008aa000906656e6779726fc04ac00c000c0001000008aa00110e6361736866696e616e6369616c73c04ac00c000c0001000008aa00151268756d6f6e676f7573696e737572616e6365c116c00c000c0001000008aa001512636f6e666f726d6974656c6963656e636573c0bfc00c000c0001000008aa0019166c65732d646f696774732d64616e732d6c652d6e657ac158c00c000c0001000008aa000e0977696e646f7773787002616700c00c000c0001000008aa000d0a676f746f746563686564c04ac00c000c0001000008aa00110e667574757265706f73746d61696cc580c00c000c0001000008aa0019166c7574746572636f6e7472656c657069726174616765c0bfc00c000c0001000008aa0014116c756365726e657075626c697368696e67c04ac00c000c0001000008aa000c09666f726566726f6e74cb26c00c000c0001000008aa000e0977696e646f7773787002757a00c00c000c0001000008aa000d0a636f686f77696e657279c116c00c000c0001000008aa001310657870657269656e6365746563686564c04ac00c000c0001000008aa00191677696e646f7773647269766572646576656c6f706572c0bfc00c000c0001000008aa000b0877696e646f777870cac6c00c000c0001000008aa00100d726573706f6e7365706f696e74c70ac00c000c0001000008aa000e0977696e646f7773787002666d00c00c000c0001000008aa00100d726573706f6e7365706f696e74c951c00c000c0001000008aa00130a6f66666963653230303703636f6d02736700c00c000c0001000008aa00110e64657369676e6564666f72626967c116c00c000c0001000008aa000b086370616475766f6cc0bfc00c000c0001000008aa000d0877696e646f777870026d6e00c00c000c0001000008aa000c09666f726566726f6e74c201c00c000c0001000008aa000e0977696e646f77737870026d7500c00c000c0001000008aa000a07666f7269656e74c04ac00c000c0001000008aa000c0977696e646f77737870cfa3c00c000c0001000008aa00100d6c6573626f6e736f7574696c73c0bfc00c000c0001000008aa0014117365727665757273616e736c696d697465c04ac00c000c0001000008aa000e0b6f66666963657265616479cb26c00c000c0001000008aa00120d726573706f6e7365706f696e7402626f00c00c000c0001000008aa000b086d6f6e727562616ec04ac00c000c0001000008aa00100d726573706f6e7365706f696e74c085c00c000c0001000008aa00100d726573706f6e7365706f696e74c54cc00c000c0001000008aa00110e6a65646572686174736472617566c116c00c000c0001000008aa001e1b647269766572646576656c6f706d656e74636f6e666572656e6365c0bfc00c000c0001000008aa000e0b77696e646f777372756279c84bc00c000c0001000008aa001613636f6e666f726d6974652d6c6963656e636573c116c00c000c0001000008aa0015126361707375726c6573756363657332303038c04ac00c000c0001000008aa000d0877696e646f77787002677300c00c000c0001000008aa000d0a7374756f73626f726e65c116c00c000c0001000008aa000c09666f726566726f6e74c18bc00c000c0001000008aa0013106a656465722d686174732d6472617566c201c00c000c0001000008aa0014116d6f62696c657063646576656c6f706572c04ac00c000c0001000008aa00100977696e646f77737870036f7267c3dac00c000c0001000008aa00160d726573706f6e7365706f696e7403636f6d026d7900c00c000c0001000008aa000f0c636f686f76696e6579617264c04ac00c000c0001000008aa00120f73656d696e61697265732d6e617635c158c00c000c0001000008aa000f0c647269766572646576636f6ec116c00c000c0001000008aa000b0877696e646f777870c566c00c000c0001000008aa000f0c6469676974616c616e76696cc04ac00c000c0001000008aa00100d726573706f6e7365706f696e74c158c00c000c0001000008aa000c0977696e646f77733938c04ac00c000c0001000008aa0018156e61762d636f6d706c69616e636577656263617374c04ac00c000c0001000008aa00110e70726f6a656374657870656e7365c04ac00c000c0001000008aa000906666c6578676fc0bfc00c000c0001000008aa000f0877696e646f77787003636f6dc8d8c00c000c0001000008aa000b086c69666563616d73c04ac00c000c0001000008aa00120f696d6167696e657a6c617375697465c0bfc00c000c0001000008aa00171474616b65636f6e74726f6c6f66706179726f6c6cc04ac00c000c0001000008aa0019166772617068696364657369676e696e73746974757465c04ac00c000c0001000008aa00130d726573706f6e7365706f696e7402636fc2f0c00c000c0001000008aa000e0b77696e646f777372756279c498c00c000c0001000008aa000c09697462727565636b65c0bfc00c000c0001000008aa001a17636c756270617274656e61697265737365727669636573c116c00c000c0001000008aa000d0a696d6167696e65637570c580c00c000c0001000008aa000e0b77696e646f777372756279cf52c00c000c0001000008aa001714617a7572696b726973656f667065726174686961c0bfc00c000c0001000008aa00100d726573706f6e7365706f696e74c7cbc00c000c0001000008aa001c19647269766572646576656c6f706572636f6e666572656e6365c04ac00c000c0001000008aa000f0c6d6f6e6e6f7576656c616d69c04ac00c000c0001000008aa000c09626c6f6f6477616b65c04ac00c000c0001000008aa00110e6a65646572686174736472617566c201c00c000c0001000008aa00120d726573706f6e7365706f696e7402646d00c00c000c0001000008aa001613636f6e666f726d6974652d6c6963656e636573c0bfc00c000c0001000008aa00120f696d6167696e657a6c617375697465c158c00c000c0001000008aa000c09666f726566726f6e74c951c00c000c0001000008aa000c09666f726566726f6e74c531c00c000c0001000008aa000e0b77696e646f777332303037cb07c00c000c0001000008aa00110e6d6f62696c6574656368746f7572c116c00c000c0001000008aa000e0b77696e646f777332303036c116c00c000c0001000008aa00120f63656e747265646573757361676573c0bfc00c000c0001000008aa001e1b786e2d2d66726465726d697474656c72617467656265722d713662c201c00c000c0001000008aa000b06666c6578676f02757300c00c000c0001000008aa00120d726573706f6e7365706f696e7402736500c00c000c0001000008aa0007046f727063cb26c00c000c0001000008aa001512696e666f726d61736a6f6e7373797374656dcc27c00c000c0001000008aa001109666f726566726f6e7402636f026b7200c00c000c0001000008aa00130a6f66666963653230303703636f6d02627200c00c000c0001000008aa000e0977696e646f7773787002626900c00c000c0001000008aa00252277696e646f7773647269766572646576656c6f706d656e74636f6e666572656e6365c04ac00c000c0001000008aa001310666f726f706572737065637469766173c04ac00c000c0001000008aa000a077061726c616e6fc04ac00c000c0001000008aa00110e696973646961676e6f7374696373c116c00c000c0001000008aa000906617a7572696bc0bfc00c000c0001000008aa000c09696e73656775726f73c04ac00c000c0001000008aa000e0977696e646f77737870026b6700c00c000c0001000008aa000e0977696e646f7773787002636700c00c000c0001000008aa00150e65766572796f6e65676574736974036e6574c7cfc00c000c0001000008aa000d0a636f686f77696e657279c04ac00c000c0001000008aa00120f6d797374617274757063656e746572c04ac00c000c0001000008aa001714706c75736465343030646966666572656e636573c54cc00c000c0001000008aa00100d726573706f6e7365706f696e74c0bfc00c000c0001000008aa0015126c6573646f6967747364616e736c656e657ac158c00c000c0001000008aa000c0970726f736577617265c116c00c000c0001000008aa000e0b6374726f70656e6f726d65c04ac00c000c0001000008aa000c0970726f736577617265c04ac00c000c0001000008aa000f0c77696e646f77732d32303030c84bc00c000c0001000008aa00120f696d70726f7665616e616c79736973c04ac00c000c0001000008aa000c09666f726566726f6e74c1c4c00c000c0001000008aa00191664656375706c657a766f747265706f74656e7469656cc04ac00c000c0001000008aa001a17686572617573666f72646572756e67736d656973746572c201c00c000c0001000008aa001411627033666f726772656174706c61696e73c04ac00c000c0001000008aa00120f696d6167696e65726c617375697465c04ac00c000c0001000008aa00120f696d6167696e65726c617375697465c158c00c000c0001000008aa00100d726573706f6e7365706f696e74c59cc00c000c0001000008aa000d0a77696e7465726e616c73c04ac00c000c0001000008aa0009046575676102677200c00c000c0001000008aa000e0b6374726f70656e6f726d65c116c00c000c0001000008aa001411756b636f6d6d756e697479617761726473c0bfc00c000c0001000008aa0015126c6573646f6967747364616e736c656e657ac0bfc00c000c0001000008aa0009066f6666726573d967c00c000c0001000008aa00100d6f70656e74797065666f72756dc04ac00c000c0001000008aa00100d726573706f6e7365706f696e74da48c00c000c0001000008aa00150d726573706f6e7365706f696e7402636f02696c00c00c000c0001000008aa001916656e68616e6365796f757270656f706c656173736574c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c951c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c21dc00c000c0001000008aa00100d63696f2d636f6d6d756e697479c085c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c580c00c000c0001000008aa0013106a656465722d686174732d6472617566c0bfc00c000c0001000008aa001815666f65726465726d697474656c7261746765626572c201c00c000c0001000008aa000c09626570636c6567616cc116c00c000c0001000008aa0019166d69677265727665727376697375616c73747564696fc0bfc00c000c0001000008aa000f0c6270666f72736f6c6f6d6f6ec04ac00c000c0001000008aa0019166f6666696365706f75726c65736574756469616e7473c0bfc00c000c0001000008aa00100d627033666f72736f6c6f6d6f6ec04ac00c000c0001000008aa00090669746865726fd6e4c00c000c0001000008aa0014116d6f62696c657063646576656c6f706572c0bfc00c000c0001000008aa000b08706f636b65747063c116c00c000c0001000008aa001512636f6e666f726d6974656c6963656e636573c116c00c000c0001000008aa000c096576726f706c616e6fda48c00c000c0001000008aa001a17636c756270617274656e61697265737365727669636573c0bfc00c000c0001000008aa001c19647269766572646576656c6f706572636f6e666572656e6365c116c00c000c0001000008aa00171467702d636f6d706c69616e636577656263617374c04ac00c000c0001000008aa000e0b7061636b746f7574656e31c0bfc00c000c0001000008aa0019166c65732d646f696774732d64616e732d6c652d6e657ac04ac00c000c0001000008aa001109686f77746f74656c6c02636f026e7a00c00c000c0001000008aa001e1b647269766572646576656c6f706d656e74636f6e666572656e6365c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74d696c00c000c0001000008aa000e0b7061636b746f7574656e31c116c00c000c0001000008aa001512636f6e666f726d6974656c6963656e636573c04ac00c000c0001000008aa000b0877696e646f777870c39fc00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c531c00c000c0001000008aa001613736d61727470686f6e65636f6d6d756e697479c04ac00c000c0001000008aa001e1b647269766572646576656c6f706d656e74636f6e666572656e6365c116c00c000c0001000008aa000f0c6d6f6e6e6f7576656c616d69c116c00c000c0001000008aa000f0c7061636b746f7574656e756ec0bfc00c000c0001000008aa00110e65766572796f6e65676574736974c54cc00c000c0001000008aa00100d77696e646f77736d6f62696c65d696c00c000c0001000008aa001b126d6963726f736f6674666f726566726f6e7403636f6d02747700c00c000c0001000008aa00120f6d73646e746563686e6574746f7572c04ac00c000c0001000008aa00120977696e646f77737870036f726702747000c00c000c0001000008aa00120f6f6e6c696e6573706f746c69676874c0bfc00c000c0001000008aa00100d6c6573626f6e736f7574696c73c116c00c000c0001000008aa000a076f6e6d79776179cb26c00c000c0001000008aa000c09696f2d6d6f64656c6cc201c00c000c0001000008aa000a076f6e6563617265c04ac00c000c0001000008aa00110e726973656f667065726174686961c04ac00c000c0001000008aa000f0c636c7562706f636b65747063c04ac00c000c0001000008aa001a176d6963726f736f66742d6272616e6368656e766964656fc201c00c000c0001000008aa0009066370616e646cc04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c0bfc00c000c0001000008aa0013106a656465722d686174732d6472617566c116c00c000c0001000008aa000c096f6e6d79776179756bc04ac00c000c0001000008aa000a07636f6e746f736fc04ac00c000c0001000008aa000b086e61766973696f6ec085c00c000c0001000008aa0014116361702d7375722d6c652d737563636573c0bfc00c000c0001000008aa000c09696e73656775726f73c0bfc00c000c0001000008aa00141164656679616c6c6368616c6c656e676573c1c4c00c000c0001000008aa000c096c6561726e32617370c116c00c000c0001000008aa00100d66696e656172747363686f6f6cc116c00c000c0001000008aa00110e646f776e6c6f616467726f6f7665c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74d702c00c000c0001000008aa000f0c7061636b746f7574656e756ec04ac00c000c0001000008aa0009066370616e646cc0bfc00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c52dc00c000c0001000008aa00120f646566726167636f6d6d616e646572c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c39fc00c000c0001000008aa001a17636c756270617274656e61697265737365727669636573c04ac00c000c0001000008aa0023206d6f6465726e65722d76657277616c74756e677361726265697473706c61747ac201c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c085c00c000c0001000008aa000c09666f726566726f6e74c39fc00c000c0001000008aa0013106a656465722d686174732d6472617566c04ac00c000c0001000008aa00100d77696e646f77736d6f62696c65c531c00c000c0001000008aa00110e65766572796f6e65676574736974c580c00c000c0001000008aa00131074686570686f6e652d636f6d70616e79c04ac00c000c0001000008aa00110e646f776e6c6f616467726f6f7665c116c00c000c0001000008aa0015126c6573646f6967747364616e736c656e657ac116c00c000c0001000008aa0014116d616e6167656669786564617373657473c04ac00c000c0001000008aa000c09707261786973746167c085c00c000c0001000008aa00150e65766572796f6e65676574736974036f7267c583c00c000c0001000008aa0015126f666672652d65626c6f75697373616e7465c04ac00c000c0001000008aa000c09697462727565636b65c04ac00c000c0001000008aa0014116d616e6167656669786564617373657473c0bfc00c000c0001000008aa000f0c6d6963726f736f6674646f70c116c00c000c0001000008aa000e0b77696e646f777332303030c2f0c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74cc27c00c000c0001000008aa0016136e6f74666f7270726f66697473656d696e6172c04ac00c000c0001000008aa00120f696d6167696e657a6c617375697465c116c00c000c0001000008aa00100d726573706f6e7365706f696e74d6e4c00c000c0001000008aa000c09666f726566726f6e74df83c00c000c0001000008aa0013106e6f72746877696e6474726164657273c04ac00c000c0001000008aa00100d77696e646f77736d6f62696c65c201c00c000c0001000008aa00131069697377656263617374736572696573c0bfc00c000c0001000008aa001815636f6e736f6c6964617465646d657373656e676572c04ac00c000c0001000008aa00120d726573706f6e7365706f696e7402636300c00c000c0001000008aa0014116d616e6167656669786564617373657473c116c00c000c0001000008aa000e0977696e646f7773787002766300c00c000c0001000008aa00100d646f746e657465787065727473c2f0c00c000c0001000008aa00110e6a65646572686174736472617566c0bfc00c000c0001000008aa000f0c6e636f6d706173736c616273c04ac00c000c0001000008aa00110e65766572796f6e65676574736974c201c00c000c0001000008aa000d0a6c697477617265696e63c116c00c000c0001000008aa0021066f666672657317656e7472657072656e6575722d73757065726865726f73c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74d6e4c00c000c0001000008aa00100d72656e636f6e7472652d333630c116c00c000c0001000008aa000e0b6d756e63686f6e74686973c0bfc00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74df83c00c000c0001000008aa00120f696d6167696e657a6c617375697465c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c0fcc00c000c0001000008aa00100d77696e646f77736e7432303030c0bfc00c000c0001000008aa000f0c6d6f6e2d7061636b2d70726fc04ac00c000c0001000008aa00110e646f776e6c6f616467726f6f7665c0bfc00c000c0001000008aa000c09646f742d7472757468c04ac00c000c0001000008aa00100d6465667261676d616e61676572c04ac00c000c0001000008aa000c0965727073797374656dcc27c00c000c0001000008aa00161372656c65766572746f75736c65736465666973c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c04ac00c000c0001000008aa0013106f66667265732d6d6963726f736f6674c0bfc00c000c0001000008aa000c076f6e6d7977617902666900c00c000c0001000008aa000f0c746563686461797332303038c0bfc00c000c0001000008aa000906637368617270c116c00c000c0001000008aa0015126f666672652d65626c6f75697373616e7465c116c00c000c0001000008aa000906666c6578676fc158c00c000c0001000008aa0015126d737368617265706f696e74666f72756d73c0bfc00c000c0001000008aa000e0b6c6f6f6b6f7574736f6674c04ac00c000c0001000008aa001b126d6963726f736f6674666f726566726f6e7403636f6d02617200c00c000c0001000008aa0009066370616e646cc116c00c000c0001000008aa00120f6d7977696e646f77736d6f62696c65df7fc00c000c0001000008aa000c09706f636b65746d736ec580c00c000c0001000008aa00120f6f6e6c696e6573706f746c69676874c04ac00c000c0001000008aa000d0a6f666669636532303037c96bc00c000c0001000008aa001815636f6e736f6c6964617465646d657373656e676572c0bfc00c000c0001000008aa001a1777696e646f77736d6f62696c65636f6d6d6d756e697479c0bfc00c000c0001000008aa00201d6f6666696365736d616c6c627573696e6573736163636f756e74696e67c04ac00c000c0001000008aa00120f696d6167696e65726c617375697465c0bfc00c000c0001000008aa000b086e636f6d70617373c04ac00c000c0001000008aa00181577696e646f7773616e7974696d6575706772616465c04ac00c000c0001000008aa000e0b77696e646f777332303036cb07c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74dde0c00c000c0001000008aa001411657874656e646572736d6172746c697374c04ac00c000c0001000008aa00110e646973636f766572746563686564c04ac00c000c0001000008aa0017126d6963726f736f6674666f726566726f6e74026a7000c00c000c0001000008aa0014116c756365726e657075626c697368696e67c0bfc00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74d22dc00c000c0001000008aa000b0872656d69782d3038c04ac00c000c0001000008aa00232077696e646f7773647269766572646576656c6f706572636f6e666572656e6365c116c00c000c0001000008aa00100d6f666669636572656164797063cb26c00c000c0001000008aa00110e6d6963726f736f66746174636573c04ac00c000c0001000008aa0017126d6963726f736f6674666f726566726f6e7402696500c00c000c0001000008aa000c09666f726566726f6e74cf52c00c000c0001000008aa000f0c666f75727468636f66666565c116c00c000c0001000008aa00120f6d7977696e646f77736d6f62696c65c06ac00c000c0001000008aa00100d6c6573626f6e736f7574696c73c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c1c4c00c000c0001000008aa00110e6d6963726f736f667468656c7073c04ac00c000c0001000008aa001c196d6963726f736f6674627573696e6573737365637572697479c085c00c000c0001000008aa00100d776f6f6467726f766562616e6bc0bfc00c000c0001000008aa0014116c756365726e657075626c697368696e67c116c00c000c0001000008aa000f0c666f75727468636f66666565c0bfc00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c7cbc00c000c0001000008aa000f0c636f686f76696e6579617264c116c00c000c0001000008aa000f0c6d6963726f736f6674646f70c0bfc00c000c0001000008aa000e0b77696e646f777372756279d696c00c000c0001000008aa000f086d736d6f62696c6504696e666f00c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c54cc00c000c0001000008aa00140d6d6f62696c65326d61726b6574046d6f626900c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74d678c00c000c0001000008aa000e0b6d756e63686f6e74686973c04ac00c000c0001000008aa000b086370616475766f6cc116c00c000c0001000008aa000e0b70726f746563746d797063dde0c00c000c0001000008aa00161372656c65766572746f75736c65736465666973c116c00c000c0001000008aa00191677696e646f77736d6f62696c65636f6d6d756e697479c0bfc00c000c0001000008aa00120f736572766572756e6c656173686564c0bfc00c000c0001000008aa000b08706f636b65747063c04ac00c000c0001000008aa000f0c746563686461797332303038c04ac00c000c0001000008aa000d0a64697265637462616e64c04ac00c000c0001000008aa001b1877696e646f7773647269766572646576656c6f706d656e74c04ac00c000c0001000008aa000f0c647269766572646576636f6ec0bfc00c000c0001000008aa00191672657461696c65786563757469766573656d696e6172c0bfc00c000c0001000008aa000d0a77696e7465726e616c73c0bfc00c000c0001000008aa0019166c7574746572636f6e7472656c657069726174616765c04ac00c000c0001000008aa000b0877696e646f777870c432c00c000c0001000008aa001613736d61727470686f6e65636f6d6d756e697479c116c00c000c0001000008aa000b086d6170706f696e74c116c00c000c0001000008aa000d0a6c697477617265696e63c0bfc00c000c0001000008aa0019166772617068696364657369676e696e73746974757465c116c00c000c0001000008aa000b086d6163746f706961c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74cf56c00c000c0001000008aa0015126d737368617265706f696e74666f72756d73c116c00c000c0001000008aa000e0b746f726b74686567616d65c04ac00c000c0001000008aa0019166c65732d646f696774732d64616e732d6c652d6e657ac0bfc00c000c0001000008aa0015126d737368617265706f696e74666f72756d73c04ac00c000c0001000008aa00100d70726f74656374796f75727063dde0c00c000c0001000008aa0015127465636e6f6c6f67696179656d7072657361c0bfc00c000c0001000008aa00120f6d73646e746563686e6574746f7572c116c00c000c0001000008aa00100d72657461696c77656263617374c04ac00c000c0001000008aa00120f736f7574687269646765766964656fc116c00c000c0001000008aa000e0b63616d70757367616d6573c54cc00c000c0001000008aa001613636f6e666f726d6974652d6c6963656e636573c04ac00c000c0001000008aa0015127465636e6f6c6f67696179656d7072657361c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c347c00c000c0001000008aa001a1777696e646f77736d6f62696c65636f6d6d6d756e697479c116c00c000c0001000008aa000e0b77696e67746970746f7973c116c00c000c0001000008aa000d0a6f666669636532303037c04ac00c000c0001000008aa0019166c7574746572636f6e7472656c657069726174616765c116c00c000c0001000008aa00100d72656e636f6e74726573333630c0bfc00c000c0001000008aa001512746865736572766572756e6c656173686564c116c00c000c0001000008aa00120f6d6963726f736f66746d6f62696c65cb07c00c000c0001000008aa00120f6d73646e746563686e6574746f7572c0bfc00c000c0001000008aa00100d77696e646f77736d6f62696c65d6e4c00c000c0001000008aa000f0c7061636b746f7574656e756ec116c00c000c0001000008aa00150c77696e646f7773766973746103636f6d02747200c00c000c0001000008aa00100d6d6f62696c65326d61726b6574c04ac00c000c0001000008aa00120f63656e747265646573757361676573c04ac00c000c0001000008aa00100b77696e646f77733230303002736b00c00c000c0001000008aa00100d77696e646f77736d6f62696c65c580c00c000c0001000008aa000b087465636865643036c04ac00c000c0001000008aa001815636f686f76696e6579617264616e6477696e657279c0bfc00c000c0001000008aa000f0c657264636f6d6d616e646572c04ac00c000c0001000008aa0015127465636e6f6c6f67696179656d7072657361c116c00c000c0001000008aa000f0c747265797265736561726368c0bfc00c000c0001000008aa00181170696374757265697470726f6475637473036d736ec04ac00c000c0001000008aa00100d776f6f6467726f766562616e6bc116c00c000c0001000008aa000805776d766864c04ac00c000c0001000008aa0013106f66667265732d6d6963726f736f6674c116c00c000c0001000008aa00120f63656e747265646573757361676573c116c00c000c0001000008aa00100977696e646f77736e74046e616d6500c00c000c0001000008aa000a0777696e646f7773c116c00c000c0001000008aa001310746f646f736c6f656e7469656e64656ec04ac00c000c0001000008aa00161372656c6576657a746f75736c65736465666973c158c00c000c0001000008aa00141164656679616c6c6368616c6c656e676573c347c00c000c0001000008aa000e0b6374726f70656e6f726d65c0bfc00c000c0001000008aa00100977696e646f77736e740367656ec678c00c000c0001000008aa000d0a636f686f77696e657279c0bfc00c000c0001000008aa00120f6c6f67697374696b6b73797374656dcc27c00c000c0001000008aa00110977696e646f7773787002707002617a00c00c000c0001000008aa000c0970726f736577617265c0bfc00c000c0001000008aa00110e6a65646572686174736472617566c04ac00c000c0001000008aa000d0a6c696e7465726e616c73c04ac00c000c0001000008aa0014116d6f62696c657063646576656c6f706572c116c00c000c0001000008aa00151277696e646f7773656d6265646465646b6974c04ac00c000c0001000008aa000f0c76697375616c73747564696fc116c00c000c0001000008aa000e0b77696e646f77736c6f676fc116c00c000c0001000008aa000d0a77696e7465726e616c73cb07c00c000c0001000008aa00252272656e636f6e747265732d636f6c6c6563746976697465732d6d6963726f736f6674c04ac00c000c0001000008aa000a0769742d6865726fd6e4c00c000c0001000008aa000a0777696e646f7773cc27c00c000c0001000008aa000d0a6c697477617265696e63c04ac00c000c0001000008aa000b086370616475766f6cc04ac00c000c0001000008aa00120f6d7977696e646f77736d6f62696c65cc9fc00c000c0001000008aa001c196d6963726f736f66746c6963656e736573746174656d656e74c04ac00c000c0001000008aa000a0772656d69783038c0bfc00c000c0001000008aa000d0a77696e7465726e616c73c201c00c000c0001000008aa001310746563686e65746368616c6c656e6765c04ac00c000c0001000008aa000a076e746673646f73c04ac00c000c0001000008aa001310746f646f736c6f656e7469656e64656ec0bfc00c000c0001000008aa00130e73707261766e6f75636573746f7502637a00c00c000c0001000008aa0019166c65732d646f696774732d64616e732d6c652d6e657ac116c00c000c0001000008aa00100d6d6963726f736f6674686f6d65c54cc00c000c0001000008aa000e0b7061636b746f7574656e31c04ac00c000c0001000008aa001916666f65726465726d697474656c2d7261746765626572c201c00c000c0001000008aa000d0a77696e7465726e616c73c580c00c000c0001000008aa00161372656c6576657a746f75736c65736465666973c54cc00c000c0001000008aa00100d6d6f62696c65326d61726b6574c32dc00c000c0001000008aa00252277696e646f7773647269766572646576656c6f706d656e74636f6e666572656e6365c0bfc00c000c0001000008aa00120977696e646f77736e74036f726702627a00c00c000c0001000008aa00100d72656e636f6e7472652d333630c04ac00c000c0001000008aa00110e6d6963726f736f667468656c7073c54cc00c000c0001000008aa00232077696e646f7773647269766572646576656c6f706572636f6e666572656e6365c04ac00c000c0001000008aa0019166772617068696364657369676e696e73746974757465c0bfc00c000c0001000008aa0019166d69677265727665727376697375616c73747564696fc04ac00c000c0001000008aa000f0c6d736f666669636532303037c1c4c00c000c0001000008aa00120f63656e747265646573757361676573c158c00c000c0001000008aa00252277696e646f7773647269766572646576656c6f706d656e74636f6e666572656e6365c116c00c000c0001000008aa00110c77696e646f7773766973746102626700c00c000c0001000008aa000c0977696e646f77733938f3fac00c000c0001000008aa00120f6d6963726f736f66746d6f62696c65edf7c00c000c0001000008aa00120f736f7574687269646765766964656fc0bfc00c000c0001000008aa0016136f666672652d65626c6f75697373616e746573c04ac00c000c0001000008aa000f0c746564736c656d6f6e616964c04ac00c000c0001000008aa000e0b6e69676874636173746572c04ac00c000c0001000008aa00110e6d6f62696c6574656368746f7572c0bfc00c000c0001000008aa00100977696e646f77736e74036e6574c0fcc00c000c0001000008aa00100d6f70656e74797065666f72756dc116c00c000c0001000008aa000c09776861636b65647476c04ac00c000c0001000008aa000f0c6d6963726f736f6674646f70c04ac00c000c0001000008aa000c0977696e646f77736e74c4edc00c000c0001000008aa00100d77696e646f77736d6f62696c65c1c4c00c000c0001000008aa000c0977696e646f77737870c436c00c000c0001000008aa001b1877696e646f7773647269766572646576656c6f706d656e74c116c00c000c0001000008aa000b086263656e7472616cc54cc00c000c0001000008aa00151277696465776f726c64696d706f7274657273c04ac00c000c0001000008aa000c097374756f73626f726ec0bfc00c000c0001000008aa000f0c7461696c7370696e746f7973c04ac00c000c0001000008aa0013106d616b656f7665726d796f6666696365c04ac00c000c0001000008aa000d0a6d7366746d6f62696c65c116c00c000c0001000008aa0015126c6573646f6967747364616e736c656e657ac04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c06ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c678c00c000c0001000008aa00161372656c6576657a746f75736c65736465666973c04ac00c000c0001000008aa00100d6d73646e6368616c6c656e6765c04ac00c000c0001000008aa0019166f6666696365706f75726c65736574756469616e7473c116c00c000c0001000008aa00120f736f7574687269646765766964656fc04ac00c000c0001000008aa00191672657461696c65786563757469766573656d696e6172c116c00c000c0001000008aa00110e6d6f62696c657365727669636573edf7c00c000c0001000008aa001307776562686f7374086e61766973696f6ec04ac00c000c0001000008aa00100d726573706f6e7365706f696e74f3a0c00c000c0001000008aa00120b7a65726f76697275736573036f7267dde3c00c000c0001000008aa00120f6d7977696e646f77736d6f62696c65c347c00c000c0001000008aa0016136f666672652d65626c6f75697373616e746573c116c00c000c0001000008aa00100d77696e646f77736d6f62696c65df83c00c000c0001000008aa0015126d6f62696c657063646576656c6f70657273c0bfc00c000c0001000008aa00100977696e646f77736e7403636f6df9cec00c000c0001000008aa000d0a77696e7465726e616c73c116c00c000c0001000008aa00100d747670686f746f766965776572c04ac00c000c0001000008aa00191677696e646f77736d6f62696c65636f6d6d756e697479c04ac00c000c0001000008aa00100b77696e646f77737275627902766e00c00c000c0001000008aa00100d6d6f62696c6564657669636573edf7c00c000c0001000008aa000f0c746563686564626f73746f6ec04ac00c000c0001000008aa00110e6d6f62696c6574656368746f7572c04ac00c000c0001000008aa00100d74617675746174726f6e636865c04ac00c000c0001000008aa00110e706179726f6c6c77656263617374c04ac00c000c0001000008aa00100d776577616e7474686562657374c04ac00c000c0001000008aa00151277696465776f726c64696d706f7274657273c0bfc00c000c0001000008aa001a1777696e646f77736d6f62696c65636f6d6d6d756e697479c04ac00c000c0001000008aa001c196d6963726f736f66746c6963656e736573746174656d656e74c54cc00c000c0001000008aa0015126d6963726f736f6674697461636164656d79c04ac00c000c0001000008aa00100d72656e636f6e7472652d333630c0bfc00c000c0001000008aa000c0977696e646f77737870c30ec00c000c0001000008aa000c0977696e646f77736e74c7a8c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74cb26c00c000c0001000008aa000e0b77696e67746970746f7973c04ac00c000c0001000008aa001613737570706f727477696e646f77737669737461c158c00c000c0001000008aa0013106e6f72746877696e6474726164657273c0bfc00c000c0001000008aa00232077696e646f7773647269766572646576656c6f706572636f6e666572656e6365c0bfc00c000c0001000008aa000e0b76796b6b6572736c616273c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c18bc00c000c0001000008aa000f0c747265797265736561726368c116c00c000c0001000008aa000c09746563686564766970c04ac00c000c0001000008aa00191677696e646f77736d6f62696c65636f6d6d756e697479c116c00c000c0001000008aa000e0b74696d6534746563686564c04ac00c000c0001000008aa000f0c72656e636f6e747265333630c0bfc00c000c0001000008aa0014116d6963726f736f6674736d616c6c62697ac04ac00c000c0001000008aa00191677696e646f7773647269766572646576656c6f706572c116c00c000c0001000008aa0014116d616e616765636f6c6c656374696f6e73c04ac00c000c0001000008aa000b086263656e7472616cc531c00c000c0001000008aa00100d706f776572746f676574686572c04ac00c000c0001000008aa00191677696e646f7773647269766572646576656c6f706572c04ac00c000c0001000008aa000a077265736b697473c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c201c00c000c0001000008aa00161377696e7465726e616c737265736f7572636573c04ac00c000c0001000008aa000c0977696e646f77736e74f3fac00c000c0001000008aa00100977696e646f77736e74036f7267cc81c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74e8acc00c000c0001000008aa00230e64657369676e6564666f726269670264650e64657369676e6564666f72626967c201c00c000c0001000008aa00141164656679616c6c6368616c6c656e676573c7cbc00c000c0001000008aa000e0977696e646f7773787002676d00c00c000c0001000008aa00151277696e7465726e616c73736f667477617265c04ac00c000c0001000008aa00151277696465776f726c64696d706f7274657273c116c00c000c0001000008aa000e0b77696e646f777372756279ec43c00c000c0001000008aa000a0772656d69783038c116c00c000c0001000008aa000f0c6d61696e66756e6374696f6ec04ac00c000c0001000008aa000d0a7374756f73626f726e65c04ac00c000c0001000008aa000f0c6f666669636573797374656ddde0c00c000c0001000008aa001e1b6d6963726f736f66742d627573696e6573732d7365637572697479c085c00c000c0001000008aa000e0b77696e646f777372756279c201c00c000c0001000008aa000b0872656d69782d3038c116c00c000c0001000008aa00120f7265616c6d656e74656772616e6465c04ac00c000c0001000008aa0008056d73657070c04ac00c000c0001000008aa00100d77696e646f77736d6f62696c65df7fc00c000c0001000008aa00110e72656e636f6e747265732d333630c116c00c000c0001000008aa00100977696e646f77736e74036e6574f656c00c000c0001000008aa00100d7374756f73626f726e73686f77c04ac00c000c0001000008aa0018156d6963726f736f66746269636f6e666572656e6365c04ac00c000c0001000008aa000b0877696e646f777870d804c00c000c0001000008aa000e0b696e6e6f766174652d756bc116c00c000c0001000008aa00141164656679616c6c6368616c6c656e676573d696c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c116c00c000c0001000008aa00100977696e646f77736e74036e6574f9cec00c000c0001000008aa00160f65756772616e747361647669736f7203636f6dda48c00c000c0001000008aa00120f696d6167696e65726c617375697465c116c00c000c0001000008aa00120f736572766572756e6c656173686564c116c00c000c0001000008aa00110e64657369676e6564666f72626967cc27c00c000c0001000008aa000e0b667278736f667477617265c04ac00c000c0001000008aa000f0c6d6f6e2d7061636b2d70726fc0bfc00c000c0001000008aa000d0a73686172656476696577c04ac00c000c0001000008aa00110977696e646f77736e7402636f02637200c00c000c0001000008aa000e0b77696e646f777372756279c085c00c000c0001000008aa00140c77696e646f7773766973746102636f02696400c00c000c0001000008aa00141164656679616c6c6368616c6c656e676573c2f0c00c000c0001000008aa00110e676174656b656570657274657374c2f0c00c000c0001000008aa000e0b77696e646f777372756279c18bc00c000c0001000008aa000e0b66616d696c797761766573c54cc00c000c0001000008aa00120f6f6e6c696e6573706f746c69676874c116c00c000c0001000008aa00120f65756772616e747361647669736f72f8a8c00c000c0001000008aa000b06666c6578676f026d7000c00c000c0001000008aa001613696d706f737369626c65637265617475726573c54cc00c000c0001000008aa00170f65756772616e747361647669736f7202636f02687500c00c000c0001000008aa000c0977696e646f77736e74c7e9c00c000c0001000008aa000906666c6578676fec43c00c000c0001000008aa00120f65756772616e747361647669736f72da48c00c000c0001000008aa000e0b77696e646f777372756279c951c00c000c0001000008aa00120f6d7977696e646f77736d6f62696c65c54cc00c000c0001000008aa00110e64657369676e6564666f72626967ec43c00c000c0001000008aa0015126f666672652d65626c6f75697373616e7465c0bfc00c000c0001000008aa00100977696e646f77737870036f7267c436c00c000c0001000008aa000b0872656d69782d3038c0bfc00c000c0001000008aa000e0977696e646f77737870026e6600c00c000c0001000008aa00191672657461696c65786563757469766573656d696e6172c04ac00c000c0001000008aa000b086d6163746f706961c116c00c000c0001000008aa00100d6d6f62696c6564657669636573cb07c00c000c0001000008aa000a0773776175646974f3fac00c000c0001000008aa00110e726973656f667065726174686961c0bfc00c000c0001000008aa00252272656e636f6e747265732d636f6c6c6563746976697465732d6d6963726f736f6674c116c00c000c0001000008aa00141177696e646f777373657276657232303038c0fcc00c000c0001000008aa000c096d73706172746e6572c04ac00c000c0001000008aa00110e6f66667265732d656e6f726d6573c04ac00c000c0001000008aa00100d74617675746174726f6e636865c0bfc00c000c0001000008aa00100d6d61726769657374726176656cc04ac00c000c0001000008aa00120f65756772616e747361647669736f72e429c00c000c0001000008aa00161372656c6576657a746f75736c65736465666973c0bfc00c000c0001000008aa000d0a74656368656474696d65c04ac00c000c0001000008aa0019166d6963726f736f667464656d616e64706c616e6e6572c04ac00c000c0001000008aa000e0b77696e646f77736c6f676fc04ac00c000c0001000008aa001a176d6963726f736f6674627573696e657373617761726473c04ac00c000c0001000008aa00130b77696e646f77737275627902636f027a6100c00c000c0001000008aa00110c77696e646f77737669737461026e7500c00c000c0001000008aa00171477696e646f7773787067616d6561647669736f72c04ac00c000c0001000008aa00100d747670686f746f766965776572c59cc00c000c0001000008aa00110e64657369676e6564666f72626967c32dc00c000c0001000008aa000f0c77696e7465726e616c736573c04ac00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c84bc00c000c0001000008aa000f0c6e666c666576657232303032c04ac00c000c0001000008aa00100d726573706f6e7365706f696e74c65fc00c000c0001000008aa00140f65756772616e747361647669736f7202656500c00c000c0001000008aa000b086e636f6d70617373c54cc00c000c0001000008aa001512746865736572766572756e6c656173686564c04ac00c000c0001000008aa000b06666c6578676f02687400c00c000c0001000008aa00161372656c6576657a746f75736c65736465666973c116c00c000c0001000008aa00110e72657475726e746f746563686564c04ac00c000c0001000008aa00100977696e646f77736e7403636f6dc7edc00c000c0001000008aa000e0b77696e646f777372756279da48c00c000c0001000008aa000e0b77696e646f777372756279c82bc00c000c0001000008aa00130b77696e646f77737275627902636f02687500c00c000c0001000008aa000d0a65737469656d706f6465c0bfc00c000c0001000008aa00110e676174656b656570657274657374c085c00c000c0001000008aa00131074686570686f6e652d636f6d70616e79c0bfc00c000c0001000008aa00120f6865726f7368617070656e68657265dde0c00c000c0001000008aa00100b77696e646f77737275627902616500c00c000c0001000008aa00100977696e646f7773787003636f6dc456c00c000c0001000008aa00161372656c65766572746f75736c65736465666973c0bfc00c000c0001000008aa000f0c75732d6d6963726f736f6674c04ac00c000c0001000008aa0017147669737461666f72796f7572627573696e657373c04ac00c000c0001000008aa000f0c746563686d616b656f766572dde0c00c000c0001000008aa00100977696e646f777378700362697ac0fcc00c000c0001000008aa001b03777777146d6963726f736f6674737570706c79636861696ec04ac00c000c0001000008aa00120977696e646f777378700377656202746a00c00c000c0001000008aa000b0877696e646f777870cc61c00c000c0001000008aa00120f65756772616e747361647669736f72cc27c00c000c0001000008aa000906666c6578676fd6e4c00c000c0001000008aa00110e667574757265706f73746d61696cc116c00c000c0001000008aa000c097374756f73626f726ec116c00c000c0001000008aa0014116d6963726f736f667464796e616d696373c158c00c000c0001000008aa00110e72656e636f6e747265732d333630c0bfc00c000c0001000008aa00100d726973656f666e6174696f6e73c54cc00c000c0001000008aa0009067265736b6974c04ac00c000c0001000008aa00160e64657369676e6564666f7262696702636f027a6100c00c000c0001000008aa000a07737570706f7274e66dc00c000c0001000008aa000f0877696e646f777870036f7267c436c00c000c0001000008aa001a176d6963726f736f6674627573696e657373617761726473c116c00c000c0001000008aa00131074686570686f6e652d636f6d70616e79c116c00c000c0001000008aa0009066d7377776870c04ac00c000c0001000008aa000e0b77696e646f777372756279e429c00c000c0001000008aa00110e64657369676e6564666f72626967c085c00c000c0001000008aa000a0774656d70757269c0bfc00c000c0001000008aa00110e64657369676e6564666f72626967c347c00c000c0001000008aa000e0977696e646f77736e7402636600c00c000c0001000008aa001310746f646f736c6f656e7469656e64656ec531c00c000c0001000008aa000b06666c6578676f02706b00c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74cf52c00c000c0001000008aa000e0b77696e646f777372756279c96bc00c000c0001000008aa00151277656273746f72616765706172746e657273c04ac00c000c0001000008aa00120f65756772616e747361647669736f72c347c00c000c0001000008aa000d0a77696e7465726e616c73edf7c00c000c0001000008aa00120977696e646f7773787003636f6d02746a00c00c000c0001000008aa001411726576656e7565616e64657870656e7365c04ac00c000c0001000008aa00110e64657369676e6564666f72626967c21dc00c000c0001000008aa001411636f6e636572746d6f62696c656c697665c54cc00c000c0001000008aa00100d72656e636f6e74726573333630c116c00c000c0001000008aa00110e766973696f696e666f776f636865c201c00c000c0001000008aa000e0977696e646f77737870026d6400c00c000c0001000008aa00140f65756772616e747361647669736f7202736900c00c000c0001000008aa000e0b77696e646f777372756279d3f7c00c000c0001000008aa000f0c77696e696e7465726e616c73c04ac00c000c0001000008aa00100d68617a6d6173766976656d6173c04ac00c000c0001000008aa000b086263656e7472616cc201c00c000c0001000008aa001512746865736572766572756e6c656173686564c0bfc00c000c0001000008aa0013106865726f657368617070656e68657265dde0c00c000c0001000008aa000a0772656d69783038c04ac00c000c0001000008aa001310746f646f736c6f656e7469656e64656ec116c00c000c0001000008aa00100977696e646f77736e74036f7267f656c00c000c0001000008aa0019166d69677265727665727376697375616c73747564696fc116c00c000c0001000008aa0015126d6963726f736f6674666f726566726f6e74c498c00c000c0001000008aa000c0977696e646f77737870cf52c00c000c0001000008aa000e0b696e6e6f766174652d756bc0bfc00c000c0001000008aa00100977696e646f7773787003636f6dc381c00c000c0001000008aa000c09766973696f32303033c201c00c000c0001000008aa000d0a796f7572746563686564c04ac00c000c0001000008aa00120b77696e646f77737275627903636f6dc951c00c000c0001000008aa00120977696e646f77736e7403636f6d026a6d00c00c000c0001000008aa00110e64657369676e6564666f72626967cb07c00c000c0001000008aa000e0b6d756e63686f6e74686973c116c00c000c0001000008aa00120f65756772616e747361647669736f72c531c00c000c0001000008aa00110e64657369676e6564666f72626967cb26c00c000c0001000008aa000d0a6d7366746d6f62696c65c0bfc00c000c0001000008aa000f0c746563686461797332303038c116c00c000c0001000008aa000906666c6578676fdb0ec00c000c0001000008aa00110e667574757265706f73746d61696cc04ac00c000c0001000008aa00171464657361666961746f646f736c6f737265746f73c04ac00c000c0001000008aa00120f65756772616e747361647669736f72c201c00c000c0001000008aa00100977696e646f7773787003636f6df656c00c000c0001000008aa001815636f686f76696e6579617264616e6477696e657279c116c00c000c0001000008aa00120b77696e646f77737275627903636f6dc39fc00c000c0001000008aa000d0877696e646f77787002686d00c00c000c0001000008aa00100d676f746f7779646f7072616379c0fcc00c000c0001000008aa000d0a6f666669636532303037c201c00c000c0001000008aa00110e64657369676e6564666f72626967c54cc00c000c0001000008aa000e0b77696e646f777372756279f8a8c00c000c0001000008aa000c09726166616574617469d702c00c000c0001000008aa00180f65756772616e747361647669736f7203636f6d02637900c00c000c0001000008aa00120f6d736163726f7373616d6572696361c04ac00c000c0001000008aa001613736d61727470686f6e65636f6d6d756e697479c0bfc00c000c0001000008aa000e0977696e646f7773787002727700c00c000c0001000008aa00120977696e646f777378700362697a02706b00c00c000c0001000008aa00110e64657369676e6564666f72626967c0bfc00c000c0001000008aa000d0a6672787265706f727473c04ac00c000c0001000008aa00110e72656e636f6e747265732d333630c04ac00c000c0001000008aa001411636f6e73756c746f72696f6f6666696365c531c00c000c0001000008aa000d06666c6578676f03636f6dffdec00c000c0001000008aa000e0b77696e646f777372756279dde0c00c000c0001000008aa00110c77696e646f7773766973746102697300c00c000c0001000008aa00141164656679616c6c6368616c6c656e676573c580c00c000c0001000008aa00100d7374756f73626f726e73686f77c116c00c000c0001000008aa00100d726573706f6e7365706f696e74c0fcc00c000c0001000008aa000e0b696e6e6f766174652d756bc04ac00c000c0001000008aa00120f65756772616e747361647669736f72c580c00c000c0001000008aa000d0a7369646577696e646572edf7c00c000c0001000008aa00120f6d6963726f73667473757266616365c04ac00c000c0001000008aa000e0b77696e646f777372756279c476c00c000c0001000008aa000e0977696e646f7773787002627300c00c000c0001000008aa00120f65756772616e747361647669736f72cb07c00c000c0001000008aa00110e64657369676e6564666f72626967d3f7c00c000c0001000008aa000d0877696e646f77787002746f00c00c000c0001000008aa00120f65756772616e747361647669736f72f3fac00c000c0001000008aa00120f65756772616e747361647669736f72d696c00c000c0001000008aa00110e7374756f73626f726e6573686f77c04ac00c000c0001000008aa00120f65756772616e747361647669736f72c2f0c00c000c0001000008aa000906747279696973c04ac00c000c0001000008aa00110e7374756f73626f726e6573686f77c116c00c000c0001000008aa00151273636174656e61696c74756f736572766572c1c4c00c000c0001000008aa00100d76697375616c2d73747564696fc04ac00c000c0001000008aa0016137072657373746865677265656e627574746f6ec116c00c000c0001000008aa000e0b77696e646f777372756279c2f0c00c000c0001000008aa000c0977696e646f77737870d35ac00c000c0001000008aa000b06666c6578676f02617300c00c000c0001000008aa000b086263656e7472616cc1c4c00c000c0001000008aa0015126e6261696e73696465647269766532303033c04ac00c000c0001000008aa00120977696e646f777378700362697a02746a00c00c000c0001000008aa00100977696e646f7773787003636f6dc2b5c00c000c0001000008aa00120f736572766572756e6c656173686564c04ac00c000c0001000008aa000c0977696e646f77737870c9c9c00c000c0001000008aa00221f6d6f6465726e657276657277616c74756e677361726265697473706c61747ac201c00c000c0001000008aa00090661747461696ecc27c00c000c0001000008aa00120977696e646f7773787003636f6d02627300c00c000c0001000008aa000906666c6578676fffdec00c000c0001000008aa000f0c77696e646f77737669737461f9cec00c000c0001000008aa00120f65756772616e747361647669736f72f3a0c00c000c0001000008aa000e0b77696e646f777332303030c04ac00c000c0001000008aa00120f65756772616e747361647669736f72c085c00c000c0001000008aa00110977696e646f7773787002636f02696d00c00c000c0001000008aa000c0977696e646f77737870fbe9c00c000c0001000008aa000e0977696e646f7773787002696f00c00c000c0001000008aa000906666c6578676fc96bc00c000c0001000008aa000d0a6f666669636532303037c158c00c000c0001000008aa001411636f6e73756c746f72696f6f6666696365c116c00c000c0001000008aa00120d726573706f6e7365706f696e7402616500c00c000c0001000008aa000e0b77696e646f777372756279c678c00c000c0001000008aa000e0b77696e646f777372756279c7cbc00c000c0001000008aa001512746f646f732d6c6f2d656e7469656e64656ec531c00c000c0001000008aa000e0b77696e646f777372756279c158c00c000c0001000008aa00110c77696e646f77737669737461026c6100c00c000c0001000008aa00100977696e646f77737870036f7267c456c00c000c0001000008aa00110e726973656f667065726174686961c116c00c000c0001000008aa001a176d6963726f736f6674627573696e657373617761726473c0bfc00c000c0001000008aa000f0977696e646f7773787002636fce71c00c000c0001000008aa000906666c6578676fd702c00c000c0001000008aa000e0b7265616c69747966616d65c54cc00c000c0001000008aa00120f65756772616e747361647669736f72c158c00c000c0001000008aa00120977696e646f77737870036f7267026a6500c00c000c0001000008aa000906617a7572696bc04ac00c000c0001000008aa00120f73657276657273636174656e61746fc1c4c00c000c0001000008aa000e0b6e61766973696f6e78616ccc27c00c000c0001000008aa000f0c74687265652d646567726565c04ac00c000c0001000008aa000e0977696e646f7773787002616300c00c000c0001000008aa00100977696e646f77737870036e6574c456c00c000c0001000008aa000f0977696e646f7773787002636fc3dac00c000c0001000008aa00100977696e646f77737870036f7267c7edc00c000c0001000008aa000c0977696e646f77737870c04ac00c000c0001000008aa00120d726573706f6e7365706f696e7402687500c00c000c0001000008aa000f0c646972656374616363657373c0bfc00c000c0001000008aa00100d726573706f6e7365706f696e74c32dc00c000c0001000008aa00100977696e646f77737870036e6574c3dac00c000c0001000008aa00100d6d6963726f736f667473706c61c04ac00c000c0001000008aa00100d76657374706f636b657463666fc116c00c000c0001000008aa00120f65756772616e747361647669736f72d3f7c00c000c0001000008aa00100977696e646f7773787003696e74f656c00c000c0001000008aa000d0a6f666669636532303037dde0c00c000c0001000008aa00100d7374756f73626f726e73686f77c0bfc00c000c0001000008aa00100977696e646f7773787003636f6dcfd5c00c000c0001000008aa00110e7374756f73626f726e6573686f77c0bfc00c000c0001000008aa00110e64657369676e6564666f72626967c498c00c000c0001000008aa00150d726573706f6e7365706f696e7402636f027a6100c00c000c0001000008aa000c0977696e646f77737870d183c00c000c0001000008aa0014116d6963726f736f66746d6f6d656e74756dc04ac00c000c0001000008aa00120d726573706f6e7365706f696e7402777300c00c000c0001000008aa000c0977696e646f77737870ff66c00c000c0001000008aa000e0977696e646f7773787002617300c00c000c0001000008aa001b1877696e646f7773647269766572646576656c6f706d656e74c0bfc00c000c0001000008aa00110977696e646f7773787002636f02636b00c00c000c0001000008aa00120f686f6d652d7075626c697368696e67c04ac00c000c0001000008aa001a176d6963726f736f6674627573696e657373617761726473c531c00c000c0001000008aa00110e64657369676e6564666f72626967c2f0c00c000c0001000008aa00100977696e646f77736e7403696e74f656c00c000c0001000008aa000e0b77696e646f777372756279d6e4c00c000c0001000008aa000d0877696e646f777870026e6600c00c000c0001000008aa00100977696e646f77737870036f6666c7acc00c000c0001000008aa000f0c6d6f6e2d7061636b2d70726fc116c00c000c0001000008aa00100d747670686f746f766965776572c116c00c000c0001000008aa000e0b77696e646f777372756279c65fc00c000c0001000008aa00100d74617675746174726f6e636865c116c00c000c0001000008aa00110977696e646f77737870046669726dc381c00c000c0001000008aa000d0a64616e69736372617a79c04ac00c000c0001000008aa00171477696e646f7773787067616d6561647669736f72c116c00c000c0001000008aa000b086263656e7472616cc7cbc00c000c0001000008aa001a176265737365727769737365722d77657474626577657262c201c00c000c0001000008aa000e0b77696e646f777332303030c116c00c000c0001000008aa0011096d6963726f736f667402636f026d7a00c00c000c0001000008aa000906666c6578676fc580c00c000c0001000008aa000e06666c6578676f02636f02637200c00c000c0001000008aa00120f65756772616e747361647669736f72c0fcc00c000c0001000008aa00120f65756772616e747361647669736f72c30ec00c000c0001000008aa000f0c72656e636f6e747265333630c116c00c000c0001000008aa000b0877696e646f777870dfbfc00c000c0001000008aa00110e676174656b656570657274657374c0fcc00c000c0001000008aa000c0977696e646f77737870f656c00c000c0001000008aa000e0877696e646f77787002636fce71c00c000c0001000008aa00100977696e646f77737870036f7267f656c00c000c0001000008aa00120977696e646f77737870036e657402706b00c00c000c0001000008aa000c09666f726566726f6e74e8acc00c000c0001000008aa00120977696e646f7773787003636f6d02656300c00c000c0001000008aa001714617a7572696b726973656f667065726174686961c04ac00c000c0001000008aa0019166d616e616765796f757270656f706c65617373657473c04ac00c000c0001000008aa000f0877696e646f777870036e6574dfbfc00c000c0001000008aa001512626c7565796f6e6465726169726c696e6573c116c00c000c0001000008aa000b086263656e7472616cc84bc00c000c0001000008aa000e0977696e646f77737870026c6b00c00c000c0001000008aa000e0b77696e646f777372756279d702c00c000c0001000008aa000906666c6578676fd696c00c000c0001000008aa00131077696e646f77737669737461626c6f67c158c00c000c0001000008aa000d0a65737469656d706f6465c04ac00c000c0001000008aa00100d726573706f6e7365706f696e74c201c00c000c0001000008aa00120f65756772616e747361647669736f72c84bc00c000c0001000008aa00141164656679616c6c6368616c6c656e676573e8acc00c000c0001000008aa00100d726573706f6e7365706f696e74ee38c00c000c0001000008aa000d0a65737469656d706f6465c116c00c000c0001000008aa00120977696e646f7773787003636f6d026e6600c00c000c0001000008aa00120977696e646f7773787003636f6d02756100c00c000c0001000008aa000f0977696e646f7773787002636fc7edc00c000c0001000008aa00100d737465776f73626f7273686f77c116c00c000c0001000008aa00120b77696e646f77737275627903636f6dc158c00c000c0001000008aa001714617a7572696b726973656f667065726174686961c116c00c000c0001000008aa00100977696e646f77737870036e6574dfbfc00c000c0001000008aa00100d737465776f73626f7273686f77c0bfc00c000c0001000008aa000c0977696e646f77737870f9cac00c000c0001000008aa00120977696e646f77737870036f726702706500c00c000c0001000008aa000c06666c6578676f02636fc7edc00c000c0001000008aa00100977696e646f77737870036f7267cc81c00c000c0001000008aa0013106865726f657368617070656e68657265c0fcc00c000c0001000008aa00100977696e646f77737870036e6574f9cec00c000c0001000008aa00100977696e646f7773787003636f6ddfbfc00c000c0001000008aa001411756b636f6d6d756e697479617761726473c04ac00c000c0001000008aa00252272656e636f6e747265732d636f6c6c6563746976697465732d6d6963726f736f6674c0bfc00c000c0001000008aa00100977696e646f77737870036e6574f656c00c000c0001000008aa00100977696e646f7773787003636f6dcdc4c00c000c0001000008aa00100d726573706f6e7365706f696e74c456c00c000c0001000008aa000d0a7374756f73626f726e65c0bfc00c000c0001000008aa000906666c6578676fcb26c00c000c0001000008aa00120d726573706f6e7365706f696e7402656300c00c000c0001000008aa000c09626570636c6567616cc0bfc00c000c0001000008aa000a0777696e32303030c84bc00c000c0001000008aa0014117365727665757273616e736c696d697465c0bfc00c000c0001000008aa000e037777770764657664617973dde0c00c000c0001000008aa000e0977696e646f77737870026c6900c00c000c0001000008aa000d0a6f666669636532303037c7cbc00c000c0001000008aa00100d726573706f6e7365706f696e74f8a8c00c000c0001000008aa00100977696e646f77737870036f7267cfd5c00c000c0001000008aa00160f65756772616e747361647669736f7203636f6dc381c00c000c0001000008aa00160d726573706f6e7365706f696e7403636f6d02706100c00c000c0001000008aa000e0977696e646f7773787002686d00c00c000c0001000008aa000e0977696e646f77737870026c6100c00c000c0001000008aa00120f65756772616e747361647669736f72ec43c00c000c0001000008aa000e0b77696e646f777372756279c0fcc00c000c0001000008aa000c097374756f73626f726ec04ac00c000c0001000008aa000e0977696e646f7773787002737400c00c000c0001000008aa00120f65756772616e747361647669736f72cb26c00c000c0001000008aa000b08676f6d656e74616cc54cc00c000c0001000008aa00100977696e646f77737870036e6574c23bc00c000c0001000008aa000b0877696e646f777870d720c00c000c0001000008aa00100d726573706f6e7365706f696e74edf7c00c000c0001000008aa00120977696e646f7773787003636f6d026a6d00c00c000c0001000008aa000f06666c6578676f03636f6d02756100c00c000c0001000008aa000b0877696e646f777870c8d8c00c000c0001000008aa0014116361702d7375722d6c652d737563636573c04ac00c000c0001000008aa000906666c6578676fc59cc00c000c0001000008aa000906617a7572696be429c00c000c0001000008aa000906666c6578676fc116c00c000c0001000008aa000f0c6d6f6e6e6f7576656c616d69c0bfc00c000c0001000008aa00120d726573706f6e7365706f696e7402627300c00c000c0001000008aa00160d726573706f6e7365706f696e7403636f6d02756100c00c000c0001000008aa00100977696e646f77737870036f7267c381c00c000c0001000008aa0014116361702d7375722d6c652d737563636573c116c00c000c0001000008aa00120b77696e646f77737275627903636f6dffdec00c000c0001000008aa00100d726573706f6e7365706f696e74c96bc00c000c0001000008aa00100977696e646f7773787003636f6dc7edc00c000c0001000008aa00110e64657369676e6564666f72626967cc9fc00c000c0001000008aa00110b77696e646f77737275627902636fc70ec00c000c0001000008aa000906666c6578676fdf83c00c000c0001000008aa00120977696e646f7773787003636f6d026e6900c00c000c0001000008aa000c096575726f706c616e6fda48c00c000c0001000008aa000f0977696e646f7773787002636fcfd5c00c000c0001000008aa000f06666c6578676f03636f6d02706b00c00c000c0001000008aa00120d726573706f6e7365706f696e7402656500c00c000c0001000008aa00120d726573706f6e7365706f696e74026d6100c00c000c0001000008aa000c0977696e646f77737870f9cec00c000c0001000008aa000e0b77696e646f777372756279eb60c00c000c0001000008aa00160f65756772616e747361647669736f7203636f6dc158c00c000c0001000008aa000c0977696e646f77737870dfbfc00c000c0001000008aa000c0977696e646f77737870c456c00c000c0001000008aa00100d726573706f6e7365706f696e74d678c00c000c0001000008aa000c0977696e646f77737870f3fac00c000c0001000008aa00100d726573706f6e7365706f696e74c06ac00c000c0001000008aa000e0b6270677765626361737433c04ac00c000c0001000008aa00100d726573706f6e7365706f696e74c2f0c00c000c0001000008aa000f0c66616d696c792d7761766573c54cc00c000c0001000008aa00120977696e646f77737870036e6574026a6500c00c000c0001000008aa00100b77696e646f77737275627902687500c00c000c0001000008aa000b06616d616c676102707300c00c000c0001000008aa00120977696e646f77737870036e657402706500c00c000c0001000008aa000f0c626c696e7874686567616d65c04ac00c000c0001000008aa00120977696e646f77737870036f726702687500c00c000c0001000008aa000d0a6f666669636532303037c84bc00c000c0001000008aa000f06616d616c676103636f6d02707300c00c000c0001000008aa000e0977696e646f7773787002736800c00c000c0001000008aa00120f77696e646f77737369646573686f77c04ac00c000c0001000008aa000b0877696e646f777870ce71c00c000c0001000008aa00070462657461f6f5c00c000c0001000008aa000e0b656169736f6c7574696f6ec085c00c000c0001000008aa0013106f66667265732d6d6963726f736f6674c04ac00c000c0001000008aa00100d726573706f6e7365706f696e74df7fc00c000c0001000008aa000d0a6f666669636532303037d3f7c00c000c0001000008aa00140d726573706f6e7365706f696e7403636f6dffdec00c000c0001000008aa00100d77696e646f77736e7432303030c116c00c000c0001000008aa00110e72657461696c7765626361737473c04ac00c000c0001000008aa000906666c6578676ff8a8c00c000c0001000008aa00120f65756772616e747361647669736f72c381c00c000c0001000008aa000c09666f726566726f6e74c0fcc00c000c0001000008aa00100977696e646f77737870036e6574cfd5c00c000c0001000008aa00120977696e646f777378700573746f7265c381c00c000c0001000008aa00110977696e646f77737870026d7902746a00c00c000c0001000008aa00120f65756772616e747361647669736f72c82fc00c000c0001000008aa00140d726573706f6e7365706f696e7403636f6dc456c00c000c0001000008aa00120977696e646f77737870036f726702706b00c00c000c0001000008aa00100977696e646f7773787003636f6dc09fc00c000c0001000008aa000d06666c6578676f03636f6dc158c00c000c0001000008aa00131069697377656263617374736572696573c116c00c000c0001000008aa000d0a756c74696d6174657063c04ac00c000c0001000008aa000e0b77696e646f777372756279e970c00c000c0001000008aa000b06616d616c676102707200c00c000c0001000008aa000e0977696e646f7773787002737200c00c000c0001000008aa00110e64657369676e6564666f72626967eb60c00c000c0001000008aa000b0866616272696b616dc04ac00c000c0001000008aa000c0977696e646f77737870f600c00c000c0001000008aa00110977696e646f7773787002636f02747400c00c000c0001000008aa000b0877696e646f777870dfbbc00c000c0001000008aa00110e667574757265706f73746d61696cc0bfc00c000c0001000008aa000d0a6f666669636532303037c580c00c000c0001000008aa00100d726573706f6e7365706f696e74dde0c00c000c0001000008aa000e0977696e646f7773787002676c00c00c000c0001000008aa00100d726573706f6e7365706f696e74d702c00c000c0001000008aa000906617a7572696bc580c00c000c0001000008aa0017146761676e657a2d656e2d65666669636163697465c04ac00c000c0001000008aa00120f686f6c6964617968656c70626f6f6bc04ac00c000c0001000008aa00100d726573706f6e7365706f696e74df83c00c000c0001000008aa00100d6469736b636f6d6d616e646572c04ac00c000c0001000008aa00100d72656164797365747368617265c54cc00c000c0001000008aa000b0877696e646f777870c237c00c000c0001000008aa00100d66696e656172747363686f6f6cc0bfc00c000c0001000008aa0014117461626c65747063646576656c6f706572c04a0000290200000080000000', + true) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_question.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_question.rb new file mode 100644 index 000000000000..f3c773bf64ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_question.rb @@ -0,0 +1,53 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestQuestion < Minitest::Test + + include Dnsruby + + def test_question + domain = "example.com" + type = Types.MX + klass = Classes.IN + + q = Question.new(domain, type, klass) + assert(q, "new() returned something") + assert_equal(domain, q.qname.to_s, "qName()") + assert_equal(type, q.qtype, "qType()") + assert_equal(klass, q.qclass, "qClass()") + + # + # Check the aliases + # + assert_equal(q.zname.to_s, domain, 'zName()' ); + assert_equal(q.ztype, type, 'zType()' ); + assert_equal(q.zclass, klass, 'zClass()' ); + + # + # Check that we can change stuff + # + q.qname=('example.net'); + q.qtype=('A'); + q.qclass=('CH'); + + assert_equal('example.net', q.qname.to_s, 'qName()' ); + assert_equal(q.qtype, Types.A, 'qType()' ); + assert_equal(q.qclass, Classes.CH, 'qClass()' ); + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_queue.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_queue.rb new file mode 100644 index 000000000000..208a752a8403 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_queue.rb @@ -0,0 +1,34 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestQueue < Minitest::Test + def test_queue + q = Queue.new + r = Dnsruby::Resolver.new +# Dnsruby::TheLog.level=Logger::DEBUG + timeout = 15 + num_queries = 100 + r.query_timeout = timeout + num_queries.times do |i| + r.send_async(Dnsruby::Message.new("example.com"), q, i) +# print "Sent #{i}\n" + end + sleep(timeout * 2) + assert(q.size == num_queries, "#{num_queries} expected, but got #{q.size}") + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_recur.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_recur.rb new file mode 100644 index 000000000000..5bc889df02f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_recur.rb @@ -0,0 +1,31 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestRecur < Minitest::Test + def test_recur + Dnsruby::PacketSender.clear_caches + r = Dnsruby::Recursor.new +# Dnsruby::TheLog.level = Logger::DEBUG + ret = r.query("uk", Dnsruby::Types.DNSKEY) +# print ret + assert ret, "Query result was nil." + assert ret.answer.length > 0, "Answer length should > 0, but was #{ret.answer.length}." +# ret = r.query_dorecursion("aaa.bigzone.uk-dnssec.nic.uk", Dnsruby::Types.DNSKEY) +# ret = r.query_dorecursion("uk-dnssec.nic.uk", Dnsruby::Types.DNSKEY) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_config.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_config.rb new file mode 100644 index 000000000000..d3d20e46a68b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_config.rb @@ -0,0 +1,95 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestResolverConfig < Minitest::Test + + GoodInput = { + "port" => 54, + "src_address" => '10.1.0.1', + "src_address6" => 'fc00::1:2:3', + "src_port" => 56453, + "use_tcp" => true, + # "stayopen" => 1, + "ignore_truncation" => true, + "recurse" => false, + "packet_timeout" => 5, + # "dnssec" => 1, + # "force_v4" => 1, + }; + + ExtendedInput={ + "query_timeout" => 30, + "retry_delay" => 6, + "retry_times" => 5, + } + + LookupInput={ + "domain" => 'dnsruby.rubyforge.org', + "apply_search_list" => false, + "ndots" => 4 , + "apply_domain" => false + } + + def setup + Dnsruby::Config.reset + end + + def test_multiple_resolver + res = Dnsruby::Resolver.new({:nameserver => ["127.0.0.1", "::1"]}); + assert(res, "new returned something"); + assert_instance_of(Dnsruby::Resolver, res, "new() returns an object of the correct class."); + + # assert(res.config.nameserver, 'nameserver() works'); + + searchlist = ["t.dnsruby.validation-test-servers.nominet.org.uk", "t2.dnsruby.validation-test-servers.nominet.org.uk"]; + assert_equal(res.config.search=searchlist, searchlist, 'setting searchlist returns correctly.'); + assert_equal(res.config.search, searchlist, 'setting searchlist stickts.'); + + + # ~ #diag "\n\nIf you do not have Net::DNS::SEC installed you will see a warning.\n"; + # ~ #diag "It is safe to ignore this\n"; + + (GoodInput.merge(ExtendedInput)).each do | param, value | + # puts("Setting " + param); + res.send(param+"=", value) + assert_equal(res.send(param), value, "setting #param sticks"); + end; + + end + + def test_single_resolver + [Dnsruby::SingleResolver.new()].each {|res| + # [Dnsruby::SingleResolver.new({:nameserver => ["127.0.0.1"]}), + # Dnsruby::SingleResolver.new({:nameserver => ["::1"]})].each {|res| + GoodInput.each do | param, value | + # puts("Setting " + param); + res.send(param+"=", value) + assert_equal(res.send(param), value, "setting #param sticks"); + end; + } + end + + def test_dns + res = Dnsruby::DNS.new + LookupInput.each do | param, value | + res.config.send(param+"=", value) + assert_equal(res.config.send(param), value, "setting #param sticks"); + end; + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_env.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_env.rb new file mode 100644 index 000000000000..60cd65be3898 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_env.rb @@ -0,0 +1,53 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestResolverEnv < Minitest::Test + + include Dnsruby + +# @todo@ Dnsruby does not provide this functionality + def test_res_env + ENV['RES_NAMESERVERS'] = '10.0.1.128 10.0.2.128'; + ENV['RES_SEARCHLIST'] = 'dnsruby.validation-test-servers.nominet.org.uk lib.dnsruby.validation-test-servers.nominet.org.uk'; + ENV['LOCALDOMAIN'] = 't.dnsruby.validation-test-servers.nominet.org.uk'; + ENV['RES_OPTIONS'] = 'retrans:3 retry:2 debug'; + + + res = DNS.new; + + assert(res, "new() returned something"); + assert(res.config.nameserver, "nameservers() works"); + + servers = res.config.nameserver; + + assert_equal(servers[0], '10.0.1.128', 'Nameserver set correctly'); + assert_equal(servers[1], '10.0.2.128', 'Nameserver set correctly'); + + + search = res.searchlist; + assert_equal(search[0], 'dnsruby.validation-test-servers.nominet.org.uk', 'Search set correctly' ); + assert_equal(search[1], 'lib.dnsruby.validation-test-servers.nominet.org.uk', 'Search set correctly' ); + + assert_equal(res.domain, 't.dnsruby.validation-test-servers.nominet.org.uk', 'Local domain works' ); + assert_equal(3, res.retrans, 'Retransmit works' ); + assert_equal(2, res.retry, 'Retry works' ); + assert(res.debug, 'Debug works' ); + + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_file.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_file.rb new file mode 100644 index 000000000000..fd05f53f4983 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_file.rb @@ -0,0 +1,42 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestAResolverFile < Minitest::Test + def setup + Dnsruby::Config.reset + end + + def test_resFile + res = Dnsruby::DNS.new("test/resolv.conf") + + assert(res, "new() returned something") + assert(res.config.nameserver, "nameservers() works") + + servers = res.config.nameserver + + assert_equal(servers[0], '10.0.1.128', 'Nameserver set correctly') + assert_equal(servers[1], '10.0.2.128', 'Nameserver set correctly') + + + search = res.config.search + assert(search.include?('dnsruby.validation-test-servers.nominet.org.uk'), 'Search set correctly' ) + assert(search.include?('lib.dnsruby.validation-test-servers.nominet.org.uk'), 'Search set correctly' ) + + assert(res.config.domain=='t.dnsruby.validation-test-servers.nominet.org.uk', 'Local domain works' ) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_opt.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_opt.rb new file mode 100644 index 000000000000..9b2f497cb1f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_res_opt.rb @@ -0,0 +1,187 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestResOpt < Minitest::Test + + include Dnsruby + + def test_dns_file + + # .txt because this test will run under windows, unlike the other file + # configuration tests. + res = Dnsruby::DNS.new('test/custom.txt') + + assert(res, 'new() returned something') + assert_instance_of(DNS, res, 'new() returns an object of the correct class.') + assert(res.config.nameserver, 'nameservers() works') + + servers = res.config.nameserver + + assert_equal('10.0.1.42', servers[0], 'Nameserver set correctly') + assert_equal('10.0.2.42', servers[1], 'Nameserver set correctly') + + + search = res.config.search + assert(search.include?('alt.dnsruby.validation-test-servers.nominet.org.uk'), 'Search set correctly' ) + assert(search.include?('ext.dnsruby.validation-test-servers.nominet.org.uk'), 'Search set correctly' ) + + assert(res.config.domain == 't2.dnsruby.validation-test-servers.nominet.org.uk', 'Local domain works' ) + end + + def test_resolver_file + res = Dnsruby::Resolver.new({:config_info => 'test/custom.txt'}) + assert(res.config.nameserver==['10.0.1.42', '10.0.2.42'], res.config.nameserver.to_s) + end + + def test_no_file + Dnsruby.log.level=Logger::FATAL + res=nil + begin + res = DNS.new('nosuch.txt') + assert_equal(["0.0.0.0"], res.nameserver,"No nameservers should be set for #{test} = #{input}") + rescue Exception + end + begin + res = Resolver.new('nosuch.txt') + assert_equal(["0.0.0.0"], res.nameserver,"No nameservers should be set for #{test} = #{input}") + rescue Exception + end +# Dnsruby.log.level=Logger::ERROR + end + + def test_config_hash_singleresolver + # Resolver interface gives us : port, TCP, IgnoreTruncation, TSIGkey, timeout + # SR : server, local_address, udp_size + test_config = { + :server => '10.0.0.1', + :port => 54, # SingleResolver and Multi-Resolver + :src_address => '10.1.0.1', # SingleResolver and Multi-Resolver + :src_address6 => 'fc00::1:2:3', # SingleResolver and Multi-Resolver + :src_port => 56353, # SingleResolver and Multi-Resolver + :use_tcp => true, # SingleResolver and Multi-Resolver + :ignore_truncation => true, # SingleResolver and Multi-Resolver + :recurse => false, + :packet_timeout => 60, # SingleResolver and Multi-Resolver # Only have one timeout for both UDP and TCP + :dnssec => true, + } + + res = SingleResolver.new(test_config) + test_config.keys.each do |item| + assert_equal(test_config[item], res.send(item), "#{item} is correct") + end + end + + def test_config_hash_multiresolver + # Resolver interface gives us : port, TCP, IgnoreTruncation, TSIGkey, timeout + # ER : retries, load_balance. Also loads servers from Config and configures SRs to point to them + # Also implements Resolver interface - but iterates this through *all* SRs + test_config = { + :nameserver => ['10.0.0.1', '10.0.0.2'], # for Multi-Resolver & DNS + :port => 54, # SingleResolver and Multi-Resolver + :src_address => '10.1.0.1', # SingleResolver and Multi-Resolver + :src_address6 => 'fc00::1:2:3', # SingleResolver and Multi-Resolver + :src_port => 56753, # SingleResolver and Multi-Resolver + :retry_delay => 6, # DNS and Multi-Resolver + :retry_times => 5, # DNSand Multi-Resolver + :use_tcp => true, # SingleResolver and Multi-Resolver + :ignore_truncation => true, # SingleResolver and Multi-Resolver + :recurse => false, + :packet_timeout => 60, # SingleResolver and Multi-Resolver # Only have one timeout for both UDP and TCP + :query_timeout => 60, # Multi-Resolver only + :dnssec => true, + } + + res = Resolver.new(test_config) + test_config.keys.each do |item| + if (item==:nameserver) + assert_equal(res.config.nameserver, test_config[item], "#{item} is correct") + else + assert_equal(res.send(item), test_config[item], "#{item} is correct") + end + end + end + + def test_config_hash_lookup + # Lookup : can specify resolver, searchpath + # + # Check that we can set things in new() + # + res=nil + + test_config = { + :nameserver => ['10.0.0.1', '10.0.0.2'], # for Multi-Resolver & DNS + :domain => 'dnsruby.validation-test-servers.nominet.org.uk', # one for DNS only? + :search => ['dnsruby.validation-test-servers.nominet.org.uk', 't.dnsruby.validation-test-servers.nominet.org.uk'], # one for DNS + :ndots => 2, # DNS only + :apply_search_list => false, # DNS only + :apply_domain => false, # DNS only + } + + res = DNS.new(test_config) + test_config.keys.each do |item| + assert_equal(res.config.send(item), test_config[item], "#{item} is correct") + end + end + + + def test_bad_config + res=nil + Dnsruby.log.level=Logger::FATAL + + bad_input = { + :tsig_rr => 'set', + :errorstring => 'set', + :answerfrom => 'set', + :answersize => 'set', + :querytime => 'set', + :axfr_sel => 'set', + :axfr_rr => 'set', + :axfr_soa_count => 'set', + :udppacketsize => 'set', + :cdflag => 'set', + } + res=nil + begin + res = Resolver.new(bad_input) + rescue Exception + end + if (res) + bad_input.keys.each do |key| + begin + assert_not_equal(res.send(key), 'set', "#{key} is not set") + rescue Exception + end + end + end + + res=nil + begin + res = DNS.new(bad_input) + rescue Exception + end + if (res) + bad_input.keys.each do |key| + begin + assert_not_equal(res.send(key), 'set', "#{key} is not set") + rescue Exception + end + end +# Dnsruby.log.level=Logger::ERROR + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_resolv.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_resolv.rb new file mode 100644 index 000000000000..4b0bd29cb180 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_resolv.rb @@ -0,0 +1,73 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' +require_relative '../lib/dnsruby/resolv' + +class TestResolv < Minitest::Test + + RELATIVE_NAME = 'google-public-dns-a.google.com' + SHORT_RELATIVE_NAME = 'dns.google' + ABSOLUTE_NAME = RELATIVE_NAME + '.' + IPV4_ADDR = '8.8.8.8' + IPV6_ADDR = '2001:4860:4860::8888' + ADDRESSES = [IPV4_ADDR, IPV6_ADDR] + + + def test_resolv_name_to_addresses + + assert_equal(IPV4_ADDR, Dnsruby::Resolv.getaddress(ABSOLUTE_NAME).to_s) + + addresses = Dnsruby::Resolv.getaddresses(ABSOLUTE_NAME) + + case addresses.length + when 1 + assert_equal IPV4_ADDR, addresses.first.to_s + Dnsruby::Resolv.each_address(ABSOLUTE_NAME) do |address| + assert_equal IPV4_ADDR, address.to_s + end + when 2 + assert_equal ADDRESSES.sort, addresses.map(&:to_s).sort + addresses_from_each = [] + Dnsruby::Resolv.each_address(ABSOLUTE_NAME) do |address| + addresses_from_each << address.to_s + end + assert_equal ADDRESSES.sort, addresses_from_each.sort + else + raise "Addresses length must be 1 or 2 but was #{addresses.length}" + end + end + + + def test_resolv_address_to_name + + assert_equal(SHORT_RELATIVE_NAME, Dnsruby::Resolv.getname(IPV4_ADDR).to_s) + + assert_raises(Dnsruby::ResolvError) do + Dnsruby::Resolv.getname(SHORT_RELATIVE_NAME) + end + + names = Dnsruby::Resolv.getnames(IPV4_ADDR) + assert_equal(1, names.size) + assert_equal(SHORT_RELATIVE_NAME, names.first.to_s) + Dnsruby::Resolv.each_name(IPV4_ADDR) { |name| assert_equal(SHORT_RELATIVE_NAME, name.to_s)} + end + + def test_resolv_address_to_address + local = '127.0.0.1' + assert_equal(local, Dnsruby::Resolv.new.getaddress(local)) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_resolver.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_resolver.rb new file mode 100644 index 000000000000..2e9c0f22b3dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_resolver.rb @@ -0,0 +1,404 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either tmexpress or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ +require_relative 'spec_helper' + +require 'socket' + +# @TODO@ We also need a test server so we can control behaviour of server to test +# different aspects of retry strategy. +# Of course, with Ruby's limit of 256 open sockets per process, we'd need to run +# the server in a different Ruby process. + +class TestResolver < Minitest::Test + + include Dnsruby + + Thread::abort_on_exception = true + + GOOD_DOMAIN_NAME = 'example.com' + BAD_DOMAIN_NAME = 'dnsruby-test-of-bad-domain-name.blah' + + PORT = 42138 + @@port = PORT + + def setup + Dnsruby::Config.reset + end + + def assert_valid_response(response) + assert(response.kind_of?(Message), "Expected response to be a message but was a #{response.class}") + end + + def assert_nil_response(response) + assert(response.nil?, "Expected no response but got a #{response.class}:\n#{response}") + end + + def assert_error_is_exception(error, error_class = Exception) + assert(error.is_a?(error_class), "Expected error to be an #{error_class}, but was a #{error.class}:\n#{error}") + end + + def assert_nil_error(error) + assert(error.nil?, "Expected no error but got a #{error.class}:\n#{error}") + end + + def test_send_message + response = Resolver.new.send_message(Message.new("example.com", Types.A)) + assert_valid_response(response) + end + + def test_send_message_bang_noerror + response, error = Resolver.new.send_message!(Message.new(GOOD_DOMAIN_NAME, Types.A)) + assert_nil_error(error) + assert_valid_response(response) + end + + def test_send_message_bang_error + message = Message.new(BAD_DOMAIN_NAME, Types.A) + response, error = Resolver.new.send_message!(message) + assert_nil_response(response) + assert_error_is_exception(error) + end + + def test_send_plain_message + resolver = Resolver.new + response, error = resolver.send_plain_message(Message.new("cnn.com")) + assert_nil_error(error) + assert_valid_response(response) + + m = Message.new(BAD_DOMAIN_NAME) + m.header.rd = true + response, error = resolver.send_plain_message(m) + assert_valid_response(response) + assert_error_is_exception(error, NXDomain) + end + + def test_query + response = Resolver.new.query("example.com") + assert_valid_response(response) + end + + def test_query_bang_noerror + response, error = Resolver.new.query!(GOOD_DOMAIN_NAME) + assert_nil_error(error) + assert_valid_response(response) + end + + def test_query_bang_error + response, error = Resolver.new.query!(BAD_DOMAIN_NAME) + assert_nil_response(response) + assert_error_is_exception(error) + end + + def test_query_async + q = Queue.new + Resolver.new.send_async(Message.new("example.com", Types.A),q,q) + id, response, error = q.pop + assert_equal(id, q, "Id wrong!") + assert_valid_response(response) + assert_nil_error(error) + end + + def test_query_one_duff_server_one_good + res = Resolver.new({:nameserver => ["8.8.8.8", "8.8.8.7"]}) + res.retry_delay=1 + q = Queue.new + res.send_async(Message.new("example.com", Types.A),q,q) + id, response, error = q.pop + assert_equal(id, q, "Id wrong!") + assert_valid_response(response) + assert_nil_error(error) + end + + # @TODO@ Implement!! But then, why would anyone want to do this? + # def test_many_threaded_clients + # assert(false, "IMPLEMENT!") + # end + + def test_reverse_lookup + m = Message.new("8.8.8.8", Types.PTR) + r = Resolver.new + q=Queue.new + r.send_async(m,q,q) + id,ret, error=q.pop + assert(ret.kind_of?(Message)) + no_pointer=true + ret.each_answer do |answer| + if (answer.type==Types.PTR) + no_pointer=false + assert(answer.domainname.to_s=~/google/) + end + end + assert(!no_pointer) + end + +# def test_bad_host +# res = Resolver.new({:nameserver => "localhost"}) +# res.retry_times=1 +# res.retry_delay=0 +# res.query_timeout = 1 +# q = Queue.new +# res.send_async(Message.new("example.com", Types.A), q, q) +# id, m, err = q.pop +# assert(id==q) +# assert(m == nil) +# assert(err.kind_of?(OtherResolvError) || err.kind_of?(IOError), "OtherResolvError or IOError expected : got #{err.class}") +# end +# + def test_nxdomain + resolver = Resolver.new + q = Queue.new + resolver .send_async(Message.new(BAD_DOMAIN_NAME, Types.A), q, 1) + id, m, error = q.pop + assert(id==1, "Id should have been 1 but was #{id}") + assert(m.rcode == RCode.NXDOMAIN, "Expected NXDOMAIN but got #{m.rcode} instead.") + assert_error_is_exception(error, NXDomain) + end + + def test_timeouts + # test timeout behaviour for different retry, retrans, total timeout etc. + # Problem here is that many sockets will be created for queries which time out. + # Run a query which will not respond, and check that the timeout works + if (RUBY_PLATFORM !~ /darwin/) + start=stop=0 + retry_times = 3 + retry_delay=1 + packet_timeout=2 + # Work out what time should be, then time it to check + expected = ((2**(retry_times-1))*retry_delay) + packet_timeout + begin + res = Dnsruby::Resolver.new({:nameserver => "10.0.1.128"}) + # res = Resolver.new({:nameserver => "213.248.199.17"}) + res.packet_timeout=packet_timeout + res.retry_times=retry_times + res.retry_delay=retry_delay + start=Time.now + m = res.send_message(Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk", Types.A)) + fail + rescue ResolvTimeout + stop=Time.now + time = stop-start + assert(time <= expected * 1.3 && time >= expected * 0.9, "Wrong time take, expected #{expected}, took #{time}") + end + end + end + + def test_packet_timeout + res = Dnsruby::Resolver.new({:nameserver => []}) +# res = Resolver.new({:nameserver => "10.0.1.128"}) + start=stop=0 + retry_times = retry_delay = packet_timeout= 10 + query_timeout=2 + begin + res.packet_timeout=packet_timeout + res.retry_times=retry_times + res.retry_delay=retry_delay + res.query_timeout=query_timeout + # Work out what time should be, then time it to check + expected = query_timeout + start=Time.now + m = res.send_message(Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk", Types.A)) + fail + rescue Dnsruby::ResolvTimeout + stop=Time.now + time = stop-start + assert(time <= expected * 1.3 && time >= expected * 0.9, "Wrong time take, expected #{expected}, took #{time}") + end # + end + + def test_queue_packet_timeout +# if (!RUBY_PLATFORM=~/darwin/) + res = Dnsruby::Resolver.new({:nameserver => "10.0.1.128"}) +# bad = SingleResolver.new("localhost") + res.add_server("localhost") + expected = 2 + res.query_timeout=expected + q = Queue.new + start = Time.now + m = res.send_async(Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk", Types.A), q, q) + id,ret,err = q.pop + stop = Time.now + assert(id=q) + assert(ret==nil) + assert(err.class == ResolvTimeout, "#{err.class}, #{err}") + time = stop-start + assert(time <= expected * 1.3 && time >= expected * 0.9, "Wrong time take, expected #{expected}, took #{time}") +# end + end + + def test_illegal_src_port + # Also test all singleresolver ports ok + # Try to set src_port to an illegal value - make sure error raised, and port OK + res = Dnsruby::Resolver.new + res.port = 56789 + tests = [53, 387, 1265, 3210, 48619] + tests.each do |bad_port| + begin + res.src_port = bad_port + fail("bad port #{bad_port}") + rescue + end + end + assert(res.single_resolvers[0].src_port = 56789) + end + + def test_add_src_port + # Try setting and adding port ranges, and invalid ports, and 0. + # Also test all singleresolver ports ok + res = Resolver.new + res.src_port = [56789,56790, 56793] + assert(res.src_port == [56789,56790, 56793]) + res.src_port = 56889..56891 + assert(res.src_port == [56889,56890,56891]) + res.add_src_port(60000..60002) + assert(res.src_port == [56889,56890,56891,60000,60001,60002]) + res.add_src_port([60004,60005]) + assert(res.src_port == [56889,56890,56891,60000,60001,60002,60004,60005]) + res.add_src_port(60006) + assert(res.src_port == [56889,56890,56891,60000,60001,60002,60004,60005,60006]) + # Now test invalid src_ports + tests = [0, 53, [60007, 53], [60008, 0], 55..100] + tests.each do |x| + begin + res.add_src_port(x) + fail() + rescue + end + end + assert(res.src_port == [56889,56890,56891,60000,60001,60002,60004,60005,60006]) + assert(res.single_resolvers[0].src_port == [56889,56890,56891,60000,60001,60002,60004,60005,60006]) + end + + def test_eventtype_api + # @TODO@ TEST THE Resolver::EventType interface! + end +end + + +# Tests to see that query_raw handles send_plain_message's return values correctly. +class TestRawQuery < Minitest::Test + + KEY_NAME = 'key-name' + KEY = '0123456789' + ALGO = 'hmac-md5' + + class CustomError < RuntimeError; end + + # Returns a new resolver whose send_plain_message method always returns + # nil for the response, and a RuntimeError for the error. + def resolver_returning_error + resolver = Dnsruby::Resolver.new + def resolver.send_plain_message(_message) + [nil, CustomError.new] + end + resolver + end + + # Returns a new resolver whose send_plain_message is overridden to return + # :response_from_send_plain_message instead of a real Dnsruby::Message, + # for easy comparison in the tests. + def resolver_returning_response + resolver = Dnsruby::Resolver.new + def resolver.send_plain_message(_message) + [:response_from_send_plain_message, nil] + end + resolver + end + + # Test that when a strategy other than :raise or :return is passed, + # an ArgumentError is raised. + def test_bad_strategy + assert_raises(ArgumentError) do + resolver_returning_error.query_raw(Dnsruby::Message.new, :invalid_strategy) + end + end + + # Test that when send_plain_message returns an error, + # and the error strategy is :raise, query_raw raises an error. + def test_raise_error + assert_raises(CustomError) do + resolver_returning_error.query_raw(Dnsruby::Message.new, :raise) + end + end + + # Tests that if you don't specify an error strategy, an error will be + # returned rather than raised (i.e. strategy defaults to :return). + def test_return_error_is_default + _response, error = resolver_returning_error.query_raw(Dnsruby::Message.new) + assert error.is_a?(CustomError) + end + + # Tests that when no error is returned, no error is raised. + def test_raise_no_error + response, _error = resolver_returning_response.query_raw(Dnsruby::Message.new, :raise) + assert_equal :response_from_send_plain_message, response + end + + # Test that when send_plain_message returns an error, and the error strategy + # is set to :return, then an error is returned. + def test_return_error + _response, error = resolver_returning_error.query_raw(Dnsruby::Message.new, :return) + assert error.is_a?(CustomError) + end + + # Test that when send_plain_message returns a valid and response + # and nil error, the same are returned by query_raw. + def test_return_no_error + response, error = resolver_returning_response.query_raw(Dnsruby::Message.new, :return) + assert_nil error + assert_equal :response_from_send_plain_message, response + end + + def test_2_args_init + options = Dnsruby::Resolver.create_tsig_options(KEY_NAME, KEY) + assert_equal KEY_NAME, options[:name] + assert_equal KEY, options[:key] + assert_nil options[:algorithm] + end + + def test_3_args_init + options = Dnsruby::Resolver.create_tsig_options(KEY_NAME,KEY,ALGO) + assert_equal KEY_NAME, options[:name] + assert_equal KEY, options[:key] + assert_equal ALGO, options[:algorithm] + end + + def test_threads + resolver = Dnsruby::Resolver.new(nameserver: ["8.8.8.8", "8.8.4.4"]) + resolver.query("google.com", "MX") + resolver.query("google.com", "MX") + resolver.query("google.com", "MX") + begin + resolver.query("googlöe.com", "MX") + rescue Dnsruby::ResolvError => e + # fine + end + resolver.query("google.com", "MX") + resolver.query("google.com", "MX") + begin + resolver.query("googlöe.com", "MX") + rescue Dnsruby::ResolvError => e + # fine + end + begin + resolver.query("googlöe.com", "MX") + rescue Dnsruby::ResolvError => e + # fine + end +# Dnsruby::Cache.delete("googlöe.com", "MX") + + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr-opt.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr-opt.rb new file mode 100644 index 000000000000..4515d8a28644 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr-opt.rb @@ -0,0 +1,207 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +require 'socket' + +class TestRrOpt < Minitest::Test + + include Dnsruby + + # This test illustrates that when an OPT record specifying a maximum + # UDP size is added to a query, the server will respect that setting + # and limit the response's size to <= that maximum. + # This works only with send_plain_message, not send_message, query, etc. + def test_plain_respects_bufsize + + + resolver = Resolver.new(['a.gtld-servers.net', 'b.gtld-servers.net', 'c.gtld-servers.net']) + resolver.query_timeout=20 + + run_test = ->(bufsize) do + + + create_test_query = ->(bufsize) do + message = Message.new('com', Types.ANY, Classes.IN) + message.add_additional(RR::OPT.new(bufsize)) + message + end + + query = create_test_query.(bufsize) + response, _error = resolver.send_plain_message(query) + if (_error != nil) then + print "Error at #{bufsize} : #{_error}" + end + # puts "\nBufsize is #{bufsize}, binary message size is #{response.encode.size}" + assert_equal(true, response.header.tc) + assert(response.encode.size <= bufsize) + end + + #run_test.(512) + #run_test.(612) + run_test.(4096) + end + + + def test_rropt + size=2048; + ednsflags=0x9e22; + + optrr = RR::OPT.new(size, ednsflags) + + assert(optrr.dnssec_ok,"DO bit set") + optrr.dnssec_ok=false + assert_equal(optrr.flags,0x1e22,"Clearing do, leaving the other bits "); + assert(!optrr.dnssec_ok,"DO bit cleared") + optrr.dnssec_ok=true + assert_equal(optrr.flags,0x9e22,"Clearing do, leaving the other bits "); + + assert_equal(optrr.payloadsize,2048,"Size read") + assert_equal(optrr.payloadsize=(1498),1498,"Size set") + + optrr.set_client_subnet("0.0.0.0/0") + assert_equal(optrr.edns_client_subnet,"0.0.0.0/0/0","Wildcard Address") + optrr.set_client_subnet("216.253.14.2/24") + assert_equal(optrr.edns_client_subnet,"216.253.14.0/24/0","IPv4 subnet") + optrr.set_client_subnet("216.253.14.2/1") + assert_equal(optrr.edns_client_subnet,"216.0.0.0/1/0","IPv4 subnet <8 bits") + optrr.set_client_subnet("2600:3c00:0:91fd:ab77:157e::/64") + assert_equal(optrr.edns_client_subnet,"2600:3c00:0:91fd::/64/0","IPv6 subnet") + optrr.set_client_subnet("2600:3c00:0:91fd:ab77:157e::/7") + assert_equal(optrr.edns_client_subnet,"2600::/7/0","IPv6 subnet <8 bits") + end + + def test_resolver_opt_application + return if (/java/ =~ RUBY_PLATFORM) # @TODO@ Check if this is fixed with JRuby yet + # Set up a server running on localhost. Get the resolver to send a + # query to it with the UDP size set to 4096. Make sure that it is received + # correctly. + Dnsruby::PacketSender.clear_caches + socket = UDPSocket.new + socket.bind("127.0.0.1", 0) + port = socket.addr[1] + q = Queue.new + Thread.new { + s = socket.recvfrom(65536) + received_query = s[0] + socket.connect(s[1][2], s[1][1]) + q.push(Message.decode(received_query)) + socket.send(received_query,0) + } + + # Now send query + res = Resolver.new("127.0.0.1") + res.dnssec = true + res.port = port + res.udp_size = 4096 + assert(res.udp_size == 4096) + res.query("example.com") + + # Now get received query from the server + p = q.pop + # Now check the query was what we expected + assert(p.header.arcount == 1) + assert(p.additional()[0].type = Types.OPT) + assert(p.additional()[0].klass.code == 4096) + end + + # Sadly Nominet no longer host these servers :-( + # def test_large_packet + # # Query TXT for overflow.dnsruby.validation-test-servers.nominet.org.uk + # # with a large udp_size + # res = SingleResolver.new + # res.udp_size = 4096 + # ret = res.query("overflow.dnsruby.validation-test-servers.nominet.org.uk", Types.TXT) + # assert(ret.rcode == RCode.NoError) + # end + + def test_decode_opt + # Create an OPT RR + size=2048; + ednsflags=0x9e22; + optrr = RR::OPT.new(size, ednsflags) + + # Add it to a message + m = Message.new + m.add_additional(optrr) + + # Encode the message + data = m.encode + + # Decode it + m2 = Message.decode(data) + + # Make sure there is an OPT RR there + assert(m2.rcode == RCode.NOERROR ) + end + + def test_formerr_response + # If we get a FORMERR back from the remote resolver, we should retry with no OPT record + # So, we need a server which sends back FORMERR for OPT records, and is OK without them. + # Then, we need to get a client to send a request to it (by default adorned with EDNS0), + # and make sure that the response is returned to the client OK. + # We should then check that the server only received one message with EDNS0, and one message + # without. + return if (/java/ =~ RUBY_PLATFORM) # @TODO@ Check if this is fixed with JRuby yet + # Set up a server running on localhost. Get the resolver to send a + # query to it with the UDP size set to 4096. Make sure that it is received + # correctly. + Dnsruby::PacketSender.clear_caches + socket = UDPSocket.new + socket.bind("127.0.0.1", 0) + port = socket.addr[1] + q = Queue.new + Thread.new { + 2.times { + s = socket.recvfrom(65536) + received_query = s[0] + m = Message.decode(received_query) + q.push(m) + if (m.header.arcount > 0) + # send back FORMERR + m.header.rcode = RCode.FORMERR + socket.send(m.encode,0,s[1][2], s[1][1]) + else + socket.send(received_query,0,s[1][2], s[1][1]) # @TODO@ FORMERR if edns + end + } + + } + # Now send query + res = Resolver.new("127.0.0.1") + res.dnssec = true + res.port = port + res.udp_size = 4096 + assert(res.udp_size == 4096) + ret = res.query("example.com") + assert(ret.header.get_header_rcode == RCode.NOERROR) + assert(ret.header.arcount == 0) + + # Now get received query from the server + p = q.pop + # Now check the query was what we expected + assert(p.header.arcount == 1) + assert(p.additional()[0].type = Types.OPT) + assert(p.additional()[0].klass.code == 4096) + + # Now check the second message + assert (!(q.empty?)) + p2 = q.pop + assert (p2) + assert(p2.header.arcount == 0) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr-txt.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr-txt.rb new file mode 100644 index 000000000000..31c0f79ebfd2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr-txt.rb @@ -0,0 +1,149 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestRrTest < Minitest::Test + + include Dnsruby + + # Stimulus, expected response, and test name: + + TESTLIST = [ + { # 2-5 + :stim => %<"">, + :rdatastr => %<"">, + :char_str_list_r => ['',], + :descr => 'Double-quoted null string', + }, + { # 6-9 + :stim => %<''>, + :rdatastr => %<"">, + :char_str_list_r => ['',], + :descr => 'Single-quoted null string', + }, + { # 10-13 + :stim => %<" \t">, + :rdatastr => %<" \t">, + :char_str_list_r => [ %< \t>, ], + :descr => 'Double-quoted whitespace string', + }, + { # 14-17 + :stim => %<noquotes>, + :rdatastr => %<"noquotes">, + :char_str_list_r => [ %<noquotes>, ], + :descr => 'unquoted single string', + }, + { # 18-21 + :stim => %<"yes_quotes">, + :rdatastr => %<"yes_quotes">, + :char_str_list_r => [ %<yes_quotes>, ], + :descr => 'Double-quoted single string', + }, + { # 26-29 + :stim => %<two tokens>, + :rdatastr => %<"two" "tokens">, + :char_str_list_r => [ %q|two|, %q|tokens|, ], + :descr => 'Two unquoted strings', + }, + # @TODO@ Why don't escaped quotes work? + # { # 22-25 + # :stim => %<"escaped \" quote">, + # :rdatastr => %<"escaped \" quote">, + # :char_str_list_r => [ %<escaped " quote>, ], + # :descr => 'Quoted, escaped double-quote', + # }, + # { # 30-33 + # :stim => %<"missing quote>, + # :rdatastr => %<>, + # :char_str_list_r => [], + # :descr => 'Unbalanced quotes work', + # } + ] + + def test_RrTest + # ------------------------------------------------------------------------------ + # Canned data. + # ------------------------------------------------------------------------------ + + name = 'foo.example.com'; + klass = 'IN'; + type = 'TXT'; + ttl = 43201; + + rr_base = [name, ttl, klass, type, " " ].join(' ') + + + # ------------------------------------------------------------------------------ + # Run the tests + # ------------------------------------------------------------------------------ + + TESTLIST.each do |test_hr| + assert( uut = RR.create(rr_base + test_hr[:stim]), + test_hr[:descr] + " -- Stimulus " ) + + assert_equal(test_hr[:rdatastr], uut.rdata_to_string(), + test_hr[:descr] + " -- Response ( rdatastr ) " ) + + list = uut.strings + + assert_equal(test_hr[:char_str_list_r], list, + test_hr[:descr] + " -- char_str_list equality" ) + end + + string1 = %<no> + string2 = %<quotes> + + rdata = [string1.length].pack("C") + string1 + rdata += [string2.length].pack("C") + string2 + + work_hash = { + :name => name, + :ttl => ttl, + :class => klass, + :type => type, + } + + + # Don't break RR.new_from_hash (e.i. "See the manual pages for each RR + # type to see what fields the type requires."). + + work_hash[:strings] = %<no quotes> + + uut = RR.create(work_hash) + assert( uut , # 30 + "RR.new_from_hash with txtdata -- Stimulus") + assert_equal( uut.rdata_to_string() , %<"no" "quotes">, # 31 + "RR.new_from_hash with txtdata -- Response (rdatastr())") + + rr_rdata = MessageEncoder.new {|msg| + uut.encode_rdata(msg) + }.to_s + assert( rr_rdata == rdata , "TXT.rr_rdata" ) # 32 + + + end + + def test_nasty_txt + t = RR.create('txt2.t.net-dns.org. 60 IN TXT "Net-DNS\; complicated $tuff" "sort of \" text\; and binary \000 data"') + assert(t.rdata.to_s == '"Net-DNS\; complicated $tuff" "sort of \" text\; and binary \000 data"', t.to_s) + + r1 = RR.create("auto._domainkey.cacert.org. 43200 IN TXT \"v=DKIM1\;g=*\;k=rsa\;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDNFxiNr+NHJwih3OPhGr4iwLE+BBDu72YrMSzUnU1FF50CW7iOtuhg796UZ6xrZ5VuhAix6YmmzcvF2UxYzoD/XpfZ4MzBu0ND4/nkt9/YOTyIBzwQqn9uMNve0Y76Zsel89dIJtOI+y+lfnFExV0jKwe53gzmxMVpMSSCcZPGwIDAQAB\" ; ----- DKIM auto for cacert.org") + r2 = RR.create("auto._domainkey.cacert.org. 43200 IN TXT \"v=DKIM1;g=*;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDNFxiNr+NHJwih3OPhGr4iwLE+BBDu72YrMSzUnU1FF50CW7iOtuhg796UZ6xrZ5VuhAix6YmmzcvF2UxYzoD/XpfZ4MzBu0ND4/nkt9/YOTyIBzwQqn9uMNve0Y76Zsel89dIJtOI+y+lfnFExV0jKwe53gzmxMVpMSSCcZPGwIDAQAB\"") + assert(r1.to_s == r2.to_s) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr-unknown.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr-unknown.rb new file mode 100644 index 000000000000..106eecb4a5f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr-unknown.rb @@ -0,0 +1,102 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestRrUnknown < Minitest::Test + + include Dnsruby + + def test_RrUnknown + assert_equal(10226, Types::typesbyname('TYPE10226'), 'typesbyname(TYPE10226) returns 10226') + assert_equal('TYPE10226', Types::typesbyval(10226), 'typesbyval(10226) returns TYPE10226') + assert_equal(Types::typesbyval(1), "A", ' typesbyval(1) returns A') + + assert_equal(Types::typesbyval(Types.typesbyname('TYPE001')), 'A', 'typesbyval(typebyname(TYPE001)) returns A') + + + begin + Types.typesbyval(0xffff+1) + flunk("Should fail on large TYPE code") + rescue Exception + end + + assert_equal(Classes::classesbyname('CLASS124'), 124, 'classesbyname(CLASS124) returns 124') + assert_equal(Classes::classesbyval(125), 'CLASS125','classesbyval(125) returns CLASS125') + assert_equal(Classes::classesbyval(1), 'IN', 'classesbyval(1) returns IN') + + assert_equal('HS', Classes::classesbyval(Classes::classesbyname('CLASS04')), 'classesbyval(typebyname(CLASS04)) returns HS') + + begin + Classes::classesbyval(0xffff+1) + flunk("Should fail on large CLASS code") + rescue Exception + end + end + + def test_rr_new + rr = RR.new_from_string('e.example CLASS01 TYPE01 10.0.0.2') + assert_equal(RR::IN::A, rr.class, 'TYPE01 parsed OK') + assert_equal('A', rr.type.string, 'TYPE01 parsed OK') + assert_equal('IN', rr.klass.string,'CLASS01 parsed OK') + assert_equal(1, rr.klass.code,'CLASS01 parsed OK') + + rr = RR.new_from_string('e.example IN A \# 4 0A0000 01 ') + assert_equal('10.0.0.1', rr.address.to_s,'Unknown RR representation for A parsed OK') + + begin + res=RR.new_from_string('e.example IN A \# 4 0A0000 01 11 ') + flunk "Should fail on inconsistent length and hex presentation" + rescue Exception + # like($@, '/\\\# 4 0A0000 01 11 assert_equal inconsistent\ length does not match content/', 'Fails on inconsassert_equaltent length and hex presentation') + end + + + rr = RR.new_from_string('e.example IN TYPE4555 \# 4 0A0000 01 ') + assert_equal('e.example 0 IN TYPE4555 \# 4 0a000001', rr.to_s, 'Fully unknown RR parsed correctly') + + rr4 = RR.new_from_string('e.example. CLASS122 TYPE4555 \# 4 0A0000 01 ') + assert_equal('e.example. 0 CLASS122 TYPE4555 \# 4 0a000001', rr4.to_s, 'Fully unknown RR in unknown CLASS parsed correctly') + end + + def test_real_data + uuencodedPacket=%w{ +02 79 85 00 00 01 +00 01 00 01 00 01 04 54 45 53 54 07 65 78 61 6d +70 6c 65 03 63 6f 6d 00 00 ff 00 01 c0 0c 30 39 +00 01 00 00 00 7b 00 0a 11 22 33 44 55 aa bb cc +dd ee c0 11 00 02 00 01 00 00 03 84 00 05 02 6e +73 c0 11 c0 44 00 01 00 01 00 00 03 84 00 04 7f +00 00 01} + + # packetdata = uuencodedPacket.pack('H*') + # packetdata = packetdata.gsub("\s*", "") + + uuencodedPacket.map!{|e| e.hex} + packetdata = uuencodedPacket.pack('c*') +# packet = Net::Packet.new_from_binary(packetdata) + packet = Message.decode(packetdata) + + string_representation = (packet.answer)[0].to_s + # string_representation =~ s/\s+/ /g, + string_representation = string_representation.gsub(/\s+/, " ") + assert_equal( + 'TEST.example.com. 123 IN TYPE12345 \# 10 1122334455aabbccddee', + string_representation, + 'Packet read from a packet dumped by bind...' + ) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr.rb new file mode 100644 index 000000000000..ba0b8ca64454 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rr.rb @@ -0,0 +1,400 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestRR < Minitest::Test + + include Dnsruby + + def test_rr + # ------------------------------------------------------------------------------ + # Canned data. + # ------------------------------------------------------------------------------ + + name = "foo.example.com"; + klass = "IN"; + ttl = 43200; + + rrs = [ + { #[0] + :type => Types.A, + :address => '10.0.0.1', + }, + { #[1] + :type => Types::AAAA, + :address => '102:304:506:708:90a:b0c:d0e:ff10', + }, + { #[2] + :type => 'AFSDB', + :subtype => 1, + :hostname => 'afsdb-hostname.example.com', + }, + { #[3] + :type => Types.CNAME, + :domainname => 'cname-cname.example.com', + }, + { #[4] + :type => Types.DNAME, + :domainname => 'dname.example.com', + }, + { #[5] + :type => Types.HINFO, + :cpu => 'test-cpu', + :os => 'test-os', + }, + { #[6] + :type => Types.ISDN, + :address => '987654321', + :subaddress => '001', + }, + { #[7] + :type => Types.MB, + :domainname => 'mb-madname.example.com', + }, + { #[8] + :type => Types.MG, + :domainname => 'mg-mgmname.example.com', + }, + { #[9] + :type => Types.MINFO, + :rmailbx => 'minfo-rmailbx.example.com', + :emailbx => 'minfo-emailbx.example.com', + }, + { #[10] + :type => Types.MR, + :domainname => 'mr-newname.example.com', + }, + { #[11] + :type => Types.MX, + :preference => 10, + :exchange => 'mx-exchange.example.com', + }, + { #[12] + :type => Types.NAPTR, + :order => 100, + :preference => 10, + :flags => 'naptr-flags', + :service => 'naptr-service', + :regexp => 'naptr-regexp', + :replacement => 'naptr-replacement.example.com', + }, + { #[13] + :type => Types.NS, + :domainname => 'ns-nsdname.example.com', + }, + { #[14] + :type => Types.NSAP, + :afi => '47', + :idi => '0005', + :dfi => '80', + :aa => '005a00', + :rd => '1000', + :area => '0020', + :id => '00800a123456', + :sel => '00', + # #:address => '4700580005a001000002000800a12345600' + # :address => '47000580005a0000001000002000800a12345600' + }, + { #[15] + :type => Types.PTR, + :domainname => 'ptr-ptrdname.example.com', + }, + { #[16] + :type => Types.PX, + :preference => 10, + :map822 => 'px-map822.example.com', + :mapx400 => 'px-mapx400.example.com', + }, + { #[17] + :type => Types.RP, + :mailbox => 'rp-mbox.example.com', + :txtdomain => 'rp-txtdname.example.com', + }, + { #[18] + :type => Types.RT, + :preference => 10, + :intermediate => 'rt-intermediate.example.com', + }, + { #[19] + :type => Types.SOA, + :mname => 'soa-mname.example.com', + :rname => 'soa-rname.example.com', + :serial => 12345, + :refresh => 7200, + :retry => 3600, + :expire => 2592000, + :minimum => 86400, + }, + { #[20] + :type => Types.SRV, + :priority => 1, + :weight => 2, + :port => 3, + :target => 'srv-target.example.com', + }, + { #[21] + :type => Types.TXT, + :strings => 'txt-txtdata', + }, + { #[22] + :type => Types.X25, + :address => '123456789', + }, + { #[23] + :type => Types.LOC, + :version => 0, + :size => 3000, + :horiz_pre => 500000, + :vert_pre => 500, + :latitude => 2001683648, + :longitude => 1856783648, + :altitude => 9997600, + }, #[24] + { + :type => Types.CERT, + :certtype => 3, + :keytag => 1, + :alg => 1, + :cert => 'ffsayw1dvk7higuvhn56r26uwjx/', + }, + { #[25] + :type => Types.SPF, + :strings => 'txt-txtdata', + }, + { + :type => Types.KX, + :preference => 10, + :exchange => 'kx-exchange.example.com', + }, + { # [26] + :type => Types.APL, + :prefixes => '1:10.0.0.0/8 !1:172.16.0.0/12 1:192.168.0.0/16 !1:192.168.0.0/24', + }, + { # [27] + :type => Types.APL, + :prefixes => '!2:fe80::/10 2:2001:db8::/32 2:2001:db8::/64', + }, + { # [28] + :type => Types.APL, + :prefixes => '1:0.0.0.0/0 1:255.255.255.255/32 2:::/0 2:::1/128', + } + ] + + + # ------------------------------------------------------------------------------ + # Create the packet + # ------------------------------------------------------------------------------ + + message = Message.new + assert(message, 'Message created'); + + + rrs.each do |data| + data.update({ :name => name, + :ttl => ttl, + }) + rr=RR.create(data) + + message.add_answer(rr); + end + + # ------------------------------------------------------------------------------ + # Re-create the packet from data. + # ------------------------------------------------------------------------------ + data = message.encode; + assert(data, 'Packet has data after pushes'); + + message=nil; + message= Message.decode(data); + + assert(message, 'Packet reconstructed from data'); + + answer = message.answer; + + i = 0 + rrs.each do |rec| + ret_rr = answer[i] + i += 1 + rec.each do |key, value| + # method = key+'=?' + x = ret_rr.send(key) + if (ret_rr.kind_of?RR::CERT and (key == :alg or key == :certtype)) + assert_equal(value.to_s, x.code.to_s.downcase, "Packet returned wrong answer section for #{ret_rr.to_s}, #{key}") + elsif (ret_rr.kind_of?RR::TXT and (key == :strings)) + assert_equal(value.to_s.downcase, x[0].to_s.downcase, "TXT strings wrong") + else + if (key == :type) + assert_equal(Types.new(value).to_s.downcase, x.to_s.downcase, "Packet returned wrong answer section for #{ret_rr.to_s}, #{key}") + else + assert_equal(value.to_s.downcase, x.to_s.downcase, "Packet returned wrong answer section for #{ret_rr.to_s}, #{key}") + end + end + end + end + + + + while (!answer.empty? and !rrs.empty?) + data = rrs.shift; + rr = answer.shift; + type = data[:type]; + + assert(rr, "#{type} - RR defined"); + assert_equal(name, rr.name.to_s, "#{type} - name() correct"); + assert_equal(klass, rr.klass.to_s, "#{type} - class() correct"); + assert_equal(ttl, rr.ttl, "#{type} - ttl() correct"); + + # foreach my $meth (keys %{data}) { + data.keys.each do |meth| + ret = rr.send(meth) + if (rr.kind_of?RR::CERT and (meth == :alg or meth == :certtype)) + assert_equal(data[meth].to_s, ret.code.to_s.downcase, "#{type} - #{meth}() correct") + elsif (rr.kind_of?RR::TXT and (meth == :strings)) + assert_equal(data[meth].to_s, ret[0].to_s.downcase, "TXT strings wrong") + else + if (meth == :type) + assert_equal(Types.new(data[meth]).to_s.downcase, ret.to_s.downcase, "#{type} - #{meth}() correct"); + else + assert_equal(data[meth].to_s, ret.to_s.downcase, "#{type} - #{meth}() correct"); + end + end + end + + rr2 = RR.new_from_string(rr.to_s) + assert_equal(rr.to_s, rr2.to_s, "#{type} - Parsing from string works") + end + end + + def test_naptr + update = Update.new + update.add('example.com.','NAPTR', 3600, '1 0 "s" "SIP+D2T" "" _sip._tcp.example.com.') + update.encode + end + + def test_uri + rrString = "_ftp._tcp.\t300\tIN\tURI\t10\ 1 \"ftp://ftp1.example.com/public\"" + rr = RR.create(rrString) + assert(rrString.to_s == rr.to_s) + m = Dnsruby::Message.new + m.add_additional(rr) + m2 = Message.decode(m.encode) + rr2 = m2.additional()[0] + assert(rr == rr2) + end + + def test_cds + rrString = "dskey.example.com.\t86400\tIN\tCDS\t60485 RSASHA1 1 ( 2BB183AF5F22588179A53B0A98631FAD1A292118 )" + rr = RR.create(rrString) + assert(rrString.to_s == rr.to_s) + m = Dnsruby::Message.new + m.add_additional(rr) + m2 = Message.decode(m.encode) + rr2 = m2.additional()[0] + assert(rr.to_s == rr2.to_s) + end + + def test_cdnskey + rrString = "tjeb.nl.\t3600\tIN\tCDNSKEY\t256 3 RSASHA1-NSEC3-SHA1 ( AwEAAcglEOS7bECRK5fqTuGTMJycmDhTzmUu/EQbAhKJOYJxDb5SG/RYqsJgzG7wgtGy0W1aP7I4k6SPtHmwcqjLaZLVUwRNWCGr2adjb9JTFyBR7F99Ngi11lEGM6Uiw/eDRk66lhoSGzohjj/rmhRTV6gN2+0ADPnafv3MBkPgryA3 ) ; key_tag=53177" + rr = RR.create(rrString) + assert(rrString.to_s == rr.to_s) + m = Dnsruby::Message.new + m.add_additional(rr) + m2 = Message.decode(m.encode) + rr2 = m2.additional()[0] + assert(rr.to_s == rr2.to_s) + end + + def test_cert + rr = RR.create("test.kht.se. 60 IN CERT PGP 0 0 mQGiBDnY2vERBAD3cOxqoAYHYzS+xttvuyN9wZS8CrgwLIlT8Ewo/CCFI11PEO+gJyNPvWPRQsyt1SE60reaIsie2bQTg3DYIg0PmH+ZOlNkpKesPULzdlw4Rx3dD/M3Lkrm977h4Y70ZKC+tbvoYKCCOIkUVevny1PVZ+mB94rb0mMgawSTrct03QCg/w6aHNJFQV7O9ZQ1Fir85M3RS8cEAOo4/1ASVudz3qKZQEhU2Z9O2ydXqpEanHfGirjWYi5RelVsQ9IfBSPFaPAWzQ24nvQ18NU7TgdDQhP4meZXiVXcLBR5Mee2kByf2KAnBUF9aah5s8wZbSrC6u8xEZLuiauvWmCUIWe0Ylc1/L37XeDjrBI2pT+k183X119d6Fr1BACGfZVGsot5rxBUEFPPSrBqYXG/0hRYv9Eq8a4rJAHK2IUWYfivZgL4DtrJnHlha+H5EPQVYkIAN3nGjXoHmosY+J3Sk+GyR+dCBHEwCkoHMKph3igczCEfxAWgqKeYd5mf+QQq2JKrkn2jceiIO7s3CrepeEFAjDSGuxhZjPJVm7QoRGFuaWVsIFAuIE1haG9uZXkgPGRhbm1AcHJpbWUuZ3VzaGkub3JnPohOBBARAgAOBQI52NrxBAsDAQICGQEACgkQ+75aMGJLskn6LgCbBXUD7UmGla5e1zyhuY667hP3F+UAoJIeDZJyRFkQAmb+u8KekRyLD1MLtDJEYW5pZWwgTWFob25leSAoU2Vjb25kYXJ5IEVtYWlsKSA8Z3VzaGlAZ3VzaGkub3JnPohgBBMRAgAgBQJF1J/XAhsjBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQ+75aMGJLskkVhACggsivQ9qLhfdA1rGm6f8LRJBSC4wAoI930h+/hshClj6AkNwGRtHdf5XJuQINBDnY2vQQCAD2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4INoBp1ajFOmPQFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3bzpnhV5JZzf24rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9GAFgr5fSI/VhOSdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67VYy4XTjTNP18F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7AAICB/9eGjzF2gDh6U7I72x/6bSdlExx2LvIF92OZKc0S55IOS4Lgzs7Hbfm1aOL4oJt7wBg94xkF4cerxz7y8R9J+k3GNl14KOjbYaMAh1rdxdAzikYMH1p1hS78GMtwxky6jE5en87BGGMmnbC84JlxwN+MD7diu8D0Gkgjj/pxOp32D5jEe02wBPVjFTpFLJjpFniLUY6AohRDEdSuZwWPuoKVWhpeWkasNn5qgwGyDREbXpyPsU02BkwE4JiGs+JMMdOn9KMh5dxiuwsMM9gHiQZS3mSNBBKPWI5ZXsdStVFvapjf2FUFDXLUbTROPv1Xhqf0u7YYORFnWeVtvzKIxVaiEYEGBECAAYFAjnY2vQACgkQ+75aMGJLsklBWgCeN7z9xk52y/aoaCuF6hYb0d+3k98AoMRxvHuXI1Nc2FXY/x65PwHiUbaY") + rr = RR.create("all.rr.org. IN CERT 6 0 0 FFsAyW1dVK7hIGuvhN56r26UwJx/") +# rr = RR.create("all.rr.org. IN WKS 128.32.0.10 UDP who route timed domain") + rr = RR.create('selector._domainkey.all.rr.org. IN TXT "v=DKIM1; n=Use=20DKIM; p=AwEAAZfbYw8SffZwsbrCLbC+JLErREIF6Yfe9aqsa1Pz6tpGWiLxm9rSL6/YoBvNP3UWX91YDF0JMo6lhu3UIZjITvIwDhx+RJYko9vLzaaJKXGf3ygy6z+deWoZJAV1lTY0Ltx9genboe88CSCHw9aSLkh0obN9Ck8R6zAMYR19ciM/; t=s"') + end + + def test_dhcid + rr = RR.create("all.rr.org. IN DHCID AAIBY2/AuCccgoJbsaxcQc9TUapptP69lOjxfNuVAA2kjEA=") + m = Dnsruby::Message.new + m.add_additional(rr) + data = m.encode + m2 = Dnsruby::Message.decode(data) + rr2 = m2.additional()[0] + assert(rr == rr2) + end + + def test_loc + rr = RR.create("all.rr.org. IN LOC 42 21 54 N 71 06 18 W -24m 30m") + assert(rr.vert_pre == 1000) + assert(rr.horiz_pre == 1000000) + assert(rr.to_s.index("21")) + assert(rr.to_s.index("71")) + assert(rr.to_s.index("54")) + assert(rr.to_s.index("71")) + assert(rr.to_s.index("06")) + assert(rr.to_s.index("18")) + + r2 = RR.create("helium IN LOC 51 49 17.9 N 4 39 22.9 E 0m") + assert(r2.size == 100) + assert(r2.to_s.index("17.9")) + assert(r2.to_s.index("22.9")) + end + + def test_hinfo + rr = RR.create('helium IN HINFO "Shuttle-ST61G4 Intel PIV3000" "FreeBSD 7.0-STABLE"') + assert rr.to_s.index('"Shuttle-ST61G4 Intel PIV3000"') + assert rr.to_s.index('"FreeBSD 7.0-STABLE"') + end + + def test_private_method_really_private + begin + RR._get_subclass(nil, nil, nil, nil, nil) + raise "This should not have gotten here; the method should have been private" + rescue NoMethodError + # We should be here because the method should not have been found. + end + end + + # TTL should be ignored when calculating the hash of an RR. + def test_hash_ignores_ttl + a1 = RR.new_from_string 'techhumans.com. 1111 IN A 69.89.31.97' + a2 = RR.new_from_string 'techhumans.com. 1111 IN A 69.89.31.97' + a3 = RR.new_from_string 'techhumans.com. 2222 IN A 69.89.31.97' + assert_equal a1.hash, a2.hash + assert_equal a1.hash, a3.hash + end + + def _test_duplicate_answer(method_as_symbol) + expected_count = case method_as_symbol + when :add_answer + 1 + when :add_answer! + 2 + end + + rr = RR.new_from_string 'techhumans.com. 1111 IN A 69.89.31.97' + message = Message.new + 2.times { message.send(method_as_symbol, rr) } + assert_equal(expected_count, message.header.ancount) + end + + def test_add_dup_answer_no_force + _test_duplicate_answer(:add_answer) + end + + def test_add_dup_answer_force + _test_duplicate_answer(:add_answer!) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rrset.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rrset.rb new file mode 100644 index 000000000000..a074f293aa7b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rrset.rb @@ -0,0 +1,133 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class RrsetTest < Minitest::Test + def test_rrset + rrset = Dnsruby::RRSet.new + + + rr=Dnsruby::RR.create({ :name => "example.com", + :ttl => 3600, + :type => 'MX', + :preference => 10, + :exchange => 'mx-exchange.example.com', + }) + + rrset.add(rr) + rr.preference = 12 + rrset.add(rr) + rr.preference = 1 + rrset.add(rr) + + canon = rrset.sort_canonical + + assert(1 == canon[0].preference) + assert(10 == canon[1].preference) + assert(12 == canon[2].preference) + + assert(rrset.sigs.length == 0) + assert(rrset.num_sigs == 0) + assert(rrset.rrs.length == 3) + + # Check RRSIG records (only of the right type) can be added to the RRSet + sig = Dnsruby::RR.create({:name=>"example.com", :ttl => 3600, + :type => 'RRSIG', + :type_covered => 'A', + :original_ttl => 3600, + :algorithm => Dnsruby::Algorithms::RSASHA1, + :labels => 3, + :expiration => Time.mktime(2003,03,22,17,31, 03).to_i, + :inception => Time.mktime(2003,02,20,17,31,03).to_i, + :key_tag => 2642 + }) + assert(!rrset.add(sig)) + assert(rrset.sigs.length == 0) + assert(rrset.num_sigs == 0) + assert(rrset.rrs.length == 3) + sig.type_covered = Dnsruby::Types.MX + assert(rrset.add(sig)) + assert(rrset.sigs.length == 1) + assert(rrset.num_sigs == 1) + assert(rrset.rrs.length == 3) + sig.name="example.co.uk" + assert(!rrset.add(sig)) + assert(rrset.sigs.length == 1) + assert(rrset.num_sigs == 1) + assert(rrset.rrs.length == 3) + end + + def test_real_rrset + uuencodedPacket = %w{ +7c 7d 81 80 00 01 00 02 00 0b 00 0d 03 6e 73 31 +03 6e 69 63 02 75 6b 00 00 ff 00 01 c0 0c 00 01 +00 01 00 02 a2 cc 00 04 c3 42 f0 82 c0 0c 00 1c +00 01 00 02 88 93 00 10 2a 01 00 40 10 01 00 35 +00 00 00 00 00 00 00 02 c0 10 00 02 00 01 00 02 +a2 cc 00 06 03 6e 73 33 c0 10 c0 10 00 02 00 01 +00 02 a2 cc 00 06 03 6e 73 35 c0 10 c0 10 00 02 +00 01 00 02 a2 cc 00 02 c0 0c c0 10 00 02 00 01 +00 02 a2 cc 00 06 03 6e 73 32 c0 10 c0 10 00 02 +00 01 00 02 a2 cc 00 06 03 6e 73 62 c0 10 c0 10 +00 02 00 01 00 02 a2 cc 00 06 03 6e 73 64 c0 10 +c0 10 00 02 00 01 00 02 a2 cc 00 06 03 6e 73 34 +c0 10 c0 10 00 02 00 01 00 02 a2 cc 00 06 03 6e +73 36 c0 10 c0 10 00 02 00 01 00 02 a2 cc 00 06 +03 6e 73 61 c0 10 c0 10 00 02 00 01 00 02 a2 cc +00 06 03 6e 73 37 c0 10 c0 10 00 02 00 01 00 02 +a2 cc 00 06 03 6e 73 63 c0 10 c0 86 00 01 00 01 +00 02 96 62 00 04 d9 4f a4 83 c0 54 00 01 00 01 +00 02 96 8e 00 04 d5 db 0d 83 c0 bc 00 01 00 01 +00 02 97 08 00 04 c2 53 f4 83 c0 bc 00 1c 00 01 +00 02 96 62 00 10 20 01 06 30 01 81 00 35 00 00 +00 00 00 00 00 83 c0 66 00 01 00 01 00 02 96 85 +00 04 d5 f6 a7 83 c0 ce 00 01 00 01 00 02 96 85 +00 04 d5 f8 fe 82 c0 f2 00 01 00 01 00 02 96 85 +00 04 d4 79 28 82 c0 e0 00 01 00 01 00 02 97 08 +00 04 cc 4a 70 2c c0 e0 00 1c 00 01 00 02 96 62 +00 10 20 01 05 02 d3 99 00 00 00 00 00 00 00 00 +00 44 c0 98 00 01 00 01 00 02 96 8e 00 04 cc 4a +71 2c c1 04 00 01 00 01 00 02 96 9b 00 04 c7 07 +42 2c c0 aa 00 01 00 01 00 02 96 71 00 04 c7 07 +43 2c c0 aa 00 1c 00 01 00 02 96 62 00 10 20 01 +05 02 10 0e 00 00 00 00 00 00 00 00 00 44 + } + uuencodedPacket.map!{|e| e.hex} + packetdata = uuencodedPacket.pack('c*') + + message = Dnsruby::Message.decode(packetdata) +# message.additional.rrsets.each {|rr| print "RRSet : #{rr}\n"} + sec_hash = message.section_rrsets(nil, true) # include the OPT record + sec_hash.each {|section, rrsets| + rrsets.each {|rrset| +# print "#{section} rrset : #{rrset}\n" + rrset.each { |rr| + } + } + } + + + sec_hash = message.section_rrsets(nil, true) # include the OPT record + sec_hash.each {|section, rrsets| + rrsets.each {|rrset| +# print "#{section} rrset : #{rrset}\n" + rrset.each { |rr| + } + } + } + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rrsig.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rrsig.rb new file mode 100644 index 000000000000..4c89f2a37660 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_rrsig.rb @@ -0,0 +1,57 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class RrsigTest < Minitest::Test + INPUT = "host.example.com. 86400 IN RRSIG A 5 3 86400 20030322173103 ( " + + "20030220173103 2642 example.com. " + + "oJB1W6WNGv+ldvQ3WDG0MQkg5IEhjRip8WTr" + + "PYGv07h108dUKGMeDPKijVCHX3DDKdfb+v6o" + + "B9wfuh3DTJXUAfI/M0zmO/zz8bW0Rznl8O3t" + + "GNazPwQKkRN20XPXV6nwwfoXmJQbsLNrLfkG" + + "J5D6fwFm8nN+6pBzeDQfsS3Ap3o= )" + def test_rrsig_from_string + rrsig = Dnsruby::RR.create(INPUT) + + assert_equal(Dnsruby::Types.A, rrsig.type_covered) + assert_equal(Dnsruby::Algorithms::RSASHA1, rrsig.algorithm) + assert_equal(3, rrsig.labels) + assert_equal(86400, rrsig.original_ttl) + assert_equal(Time.gm(2003,03,22,17,31, 03).to_i, rrsig.expiration) + assert_equal(Time.gm(2003,02,20,17,31,03).to_i, rrsig.inception) + assert_equal(2642, rrsig.key_tag) + assert_equal(Dnsruby::Name.create("example.com."), rrsig.signers_name) + assert_equal("oJB1W6WNGv+ldvQ3WDG0MQkg5IEhjRip8WTr" + + "PYGv07h108dUKGMeDPKijVCHX3DDKdfb+v6o" + + "B9wfuh3DTJXUAfI/M0zmO/zz8bW0Rznl8O3t" + + "GNazPwQKkRN20XPXV6nwwfoXmJQbsLNrLfkG" + + "J5D6fwFm8nN+6pBzeDQfsS3Ap3o=", ([rrsig.signature].pack("m*")).gsub(/\n/,"").chomp) + + rrsig2 = Dnsruby::RR.create(rrsig.to_s) + assert(rrsig2.to_s == rrsig.to_s) + end + + def test_unknown_types + rr = Dnsruby::RR.create("a.unknown.rr.org. 16070400 IN RRSIG TYPE731 7 4 16070400 20110220190432 20091112142325 59079 unknown.rr.org. a/iqriTleD/pkiXhH2HunBzbJ113JliHu8MrN30hwR5U8uR+FQ9UwoyqFVKmMFvhr66Q+Bn2leJhszJVLHM0GZpEP3yU9Kiux5z2sWxdNZY1phuVfe7vQhzPCG9a/gaNtOd/p42OaQRIvDpdp7Ey4m+2Lq/PfovuAa8jl1HBBSxYbt2sZ4Qh9IrP7qkabGzuF3iK8Kf+QTV+ty9enMRhv2zbGVJv0/KjfeOmLBpDnLxDtNN23ObqO2y31Ci434bWYbHRZJMofUWw/0cJHdw4qlnfraLHiXQSW/tT71mS/7CgHJcSZ89hdDFv8drAy/8py0MLT9nLrsvzH5F/knU/oA== ;{id = 59079}") + assert(rr.type_covered == Dnsruby::Types.TYPE731) + end + + def test_string_with_comments + r = Dnsruby::RR.create("tjeb.nl. 3600 IN RRSIG NSEC3PARAM 7 2 3600 20090630164649 20090602164649 53177 tjeb.nl. Fw70WQMviRFGyeze3MUpfafaAcWIvHRpnq4ZK3lxexrR1p+rLxK5C4qVKU71XYrPYR7XEBxgUG1oyKNOhFOVyx31EjC462dz7Vxn6UDpD1LIwNnD28+oHfS9AFzGKcn4zUZqT+8IvOO1jiS9c3Y8WAkOloN9AwGIIKWU8zAp1n4= ;{id = 53177}") + assert_equal("Fw70WQMviRFGyeze3MUpfafaAcWIvHRpnq4ZK3lxexrR1p+rLxK5C4qVKU71XYrPYR7XEBxgUG1oyKNOhFOVyx31EjC462dz7Vxn6UDpD1LIwNnD28+oHfS9AFzGKcn4zUZqT+8IvOO1jiS9c3Y8WAkOloN9AwGIIKWU8zAp1n4=", ([r.signature].pack("m*")).gsub(/\n/,"").chomp) + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_single_resolver.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_single_resolver.rb new file mode 100644 index 000000000000..f5fa7ad26a21 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_single_resolver.rb @@ -0,0 +1,314 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestSingleResolver < Minitest::Test + + include Dnsruby + + Thread::abort_on_exception = true + # Dnsruby.log.level=Logger::DEBUG + + def setup + Dnsruby::Config.reset + end + + Rrs = [ + { + :type => Types.A, + :name => 'a.t.net-dns.org', + :address => '10.0.1.128' + }, + { + :type => Types::MX, + :name => 'mx.t.net-dns.org', + :exchange => 'a.t.net-dns.org', + :preference => 10 + }, + { + :type => 'CNAME', + :name => 'cname.t.net-dns.org', + :domainname => 'a.t.net-dns.org' + }, + { + :type => Types.TXT, + :name => 'txt.t.net-dns.org', + :strings => ['Net-DNS'] + } + ] + + def test_simple + res = SingleResolver.new() + m = res.query("ns1.google.com.") + end + + def test_timeout + # if ((RUBY_PLATFORM=~/darwin/) == nil) + # Run a query which will not respond, and check that the timeout works + start_time = 0 + begin + udps = UDPSocket.new + udps.bind("127.0.0.1", 0) + port = *udps.addr.values_at(3, 1) + + begin + Dnsruby::PacketSender.clear_caches + res = SingleResolver.new("127.0.0.1") + res.port = port + res.packet_timeout=1 + start_time = Time.now.to_i + m = res.query("a.t.net-dns.org") + fail "Got response when should have got none" + rescue ResolvTimeout + stop_time = Time.now.to_i + assert((stop_time - start_time) <= (res.packet_timeout * 2), + "UDP timeout too long : #{stop_time - start_time}" + + ", should be #{res.packet_timeout}") + end + begin + Dnsruby::PacketSender.clear_caches + res = SingleResolver.new("127.0.0.1") + res.port = port + res.use_tcp = true + res.packet_timeout=1 + start_time = Time.now.to_i +# TheLog.level = Logger::DEBUG + m = res.query("a.t.net-dns.org") + fail "TCP timeouts" + rescue ResolvTimeout + # print "Got Timeout for TCP\n" + stop_time = Time.now.to_i + assert((stop_time - start_time) <= (res.packet_timeout * 2), + "TCP timeout too long : #{stop_time - start_time}, should be #{res.packet_timeout}") + rescue Exception => e + fail(e) + end + TheLog.level = Logger::ERROR + rescue + udps.close + end + end + + def test_queue_timeout + port = 46129 +# if (!RUBY_PLATFORM=~/darwin/) + begin + udps = UDPSocket.new + udps.bind("127.0.0.1", 0) + port = *udps.addr.values_at(3, 1) + res = SingleResolver.new("127.0.0.1") + res.dnssec = true + res.port = port + res.packet_timeout=1 + q = Queue.new + msg = Message.new("a.t.net-dns.org") + res.send_async(msg, q, msg) + id, ret, error = q.pop + assert(id==msg) + assert(ret==nil) + assert(error.class == ResolvTimeout) + rescue + udps.close + end +# end + end + + def test_queries + res = SingleResolver.new + + Rrs.each do |data| + packet=nil + 2.times do + begin + packet = res.query(data[:name], data[:type]) + rescue ResolvTimeout + end + break if packet + end + assert(packet) + assert_equal(packet.question[0].qclass, 'IN', 'Class correct') + + assert(packet, "Got an answer for #{data[:name]} IN #{data[:type]}") + assert_equal(1, packet.header.qdcount, 'Only one question') + # assert_equal(1, answer.length, "Got single answer (for question #{data[:name]}") + + question = (packet.question)[0] + answer = (packet.answer)[0] + + assert(question, 'Got question') + assert_equal(data[:name], question.qname.to_s, 'Question has right name') + assert_equal(Types.new(data[:type]), question.qtype, 'Question has right type') + assert_equal('IN', question.qclass.string, 'Question has right class') + + assert(answer) + assert_equal(answer.klass, 'IN', 'Class correct') + + + data.keys.each do |meth| + if (meth == :type) + assert_equal(Types.new(data[meth]).to_s, answer.send(meth).to_s, "#{meth} correct (#{data[:name]})") + else + assert_equal(data[meth].to_s, answer.send(meth).to_s, "#{meth} correct (#{data[:name]})") + end + end + end # do + end + + # test_queries + + # @TODO@ Although the test_thread_stopped test runs in isolation, it won't run as part + # of the whole test suite (ts_dnsruby.rb). Commented out until I can figure out how to + # get Test::Unit to run this one sequentially... + # def test_thread_stopped + # res=SingleResolver.new + # # Send a query, and check select_thread running. + # m = res.query("example.com") + # assert(Dnsruby::SelectThread.instance.select_thread_alive?) + # # Wait a second, and check select_thread stopped. + # sleep(2) + # assert(!Dnsruby::SelectThread.instance.select_thread_alive?) + # # Send another query, and check select_thread running. + # m = res.query("example.com") + # assert(Dnsruby::SelectThread.instance.select_thread_alive?) + # end + + def test_res_config + res = Dnsruby::SingleResolver.new + + res.server=('a.t.net-dns.org') + ip = res.server + assert_equal('10.0.1.128', ip.to_s, 'nameserver() looks up IP.') + + res.server=('cname.t.net-dns.org') + ip = res.server + assert_equal('10.0.1.128', ip.to_s, 'nameserver() looks up cname.') + end + + # def test_truncated_response + # res = SingleResolver.new + # # print "Dnssec = #{res.dnssec}\n" + # # res.server=('ns0.validation-test-servers.nominet.org.uk') + # res.server=('ns.nlnetlabs.nl') + # res.packet_timeout = 15 + # begin + # m = res.query("overflow.net-dns.org", 'txt') + # assert(m.header.ancount == 62, "62 answer records expected, got #{m.header.ancount}") + # assert(!m.header.tc, "Message was truncated!") + # rescue ResolvTimeout => e + # rescue ServFail => e # not sure why, but we get this on Travis... + # end + # end + + def test_illegal_src_port + # Try to set src_port to an illegal value - make sure error raised, and port OK + res = SingleResolver.new + tests = [53, 387, 1265, 3210, 48619] + tests.each do |bad_port| + begin + res.src_port = bad_port + fail("bad port #{bad_port}") + rescue + end + end + end + + def test_add_src_port + # Try setting and adding port ranges, and invalid ports, and 0. + res = SingleResolver.new + res.src_port = [56789, 56790, 56793] + assert(res.src_port == [56789, 56790, 56793]) + res.src_port = 56889..56891 + assert(res.src_port == [56889, 56890, 56891]) + res.add_src_port(60000..60002) + assert(res.src_port == [56889, 56890, 56891, 60000, 60001, 60002]) + res.add_src_port([60004, 60005]) + assert(res.src_port == [56889, 56890, 56891, 60000, 60001, 60002, 60004, 60005]) + res.add_src_port(60006) + assert(res.src_port == [56889, 56890, 56891, 60000, 60001, 60002, 60004, 60005, 60006]) + # Now test invalid src_ports + tests = [0, 53, [60007, 53], [60008, 0], 55..100] + tests.each do |x| + begin + res.add_src_port(x) + fail() + rescue + end + end + assert(res.src_port == [56889, 56890, 56891, 60000, 60001, 60002, 60004, 60005, 60006]) + end + + # TODO THIS TEST DOES NOT WORK ON TRAVIS + # It works fine outside of Travis, so feel free to uncomment it and run it locally + # Just don't check it in, as Travis will bork - not sure why, something to do with setting up localhost servers + # def test_options_preserved_on_tcp_resend + # # Send a very small EDNS message to trigger tcp resend. + # # Can we do that without using send_raw and avoiding the case we want to test? + # # Sure - just knock up a little server here, which simply returns the response with the + # # TC bit set, and records both packets sent to it + # # Need to listen once on UDP and once on TCP + # udpPacket = nil + # tcpPacket = nil + # port = 59821 + # thread = Thread.new { + # u = UDPSocket.new() + # u.bind("localhost", port) + # + # s = u.recvfrom(15000) + # received_query = s[0] + # udpPacket = Message.decode(received_query) + # u.connect(s[1][2], s[1][1]) + # udpPacket.header.tc = true + # u.send(udpPacket.encode(), 0) + # u.close + # + # ts = TCPServer.new(port) + # t = ts.accept + # packet = t.recvfrom(2)[0] + # + # len = (packet[0]<<8)+packet[1] + # if (RUBY_VERSION >= "1.9") + # len = (packet[0].getbyte(0)<<8)+packet[1].getbyte(0) # Ruby 1.9 + # end + # packet = t.recvfrom(len)[0] + # tcpPacket = Message.decode(packet) + # tcpPacket.header.tc = true + # lenmsg = [tcpPacket.encode.length].pack('n') + # t.send(lenmsg, 0) + # t.write(tcpPacket.encode) + # t.close + # ts.close + # } + # ret = nil + # done = true; + # thread2 = Thread.new { + # r = SingleResolver.new("localhost") + # r.port = port + # begin + # ret = r.query("example.com") + # rescue OtherResolvError => e + # done = false + # end + # } + # thread.join + # thread2.join + # if (done) + # assert(tcpPacket && udpPacket) + # assert(tcpPacket.header == udpPacket.header) + # assert(tcpPacket.additional.rrsets('OPT', true)[0].rrs()[0].ttl == udpPacket.additional.rrsets('OPT', true)[0].rrs()[0].ttl, "UDP : #{udpPacket.additional.rrsets('OPT', true)[0].rrs()[0]}, TCP #{tcpPacket.additional.rrsets('OPT', true)[0].rrs()[0]}") + # end + # end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_soak.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_soak.rb new file mode 100644 index 000000000000..8e01e2d216bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_soak.rb @@ -0,0 +1,256 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +# require_relative 'tc_single_resolver' +require_relative 'tc_soak_base' +require_relative 'test_dnsserver' +require_relative 'localdns' + + +# This class tries to soak test the Dnsruby library. +# It can't do this very well, owing to the small number of sockets allowed to be open simultaneously. +# @TODO@ Future versions of dnsruby will allow random streaming over a fixed number of (cycling) random sockets, +# so this test can be beefed up considerably at that point. + +class TestSingleResolverSoak < Minitest::Test + + IP = SimpleTCPPipeliningUDPServer::IP + PORT = SimpleTCPPipeliningUDPServer::PORT + + def initialize(arg) + super(arg) + end + + def teardown + Celluloid.shutdown + end + + SINGLE_RESOLVER_QUERY_TIMES = 63 + + def setup + # Instantiate a local dns server + pipe = IO.popen("./test/localdns.rb") + @dnspid = pipe.pid + sleep 1 + end + + def teardown + Process.kill("KILL", @dnspid) + sleep 1 + end + + def test_many_asynchronous_queries_one_single_resolver + run_many_asynch_queries_test_single_res(1) + end + + def test_many_asynchronous_queries_many_single_resolvers + run_many_asynch_queries_test_single_res(50) + end + + def test_many_asynchronous_queries_one_single_resolver_tcp + run_many_asynch_queries_test_single_res(1, true) + end + + def test_many_asynchronous_queries_many_single_resolvers_tcp + run_many_asynch_queries_test_single_res(50, true) + end + + def test_many_asynchronous_queries_one_single_resolver_tcp_pipelining + run_many_asynch_queries_test_single_res(1, true, true) + end + + def test_many_asynchronous_queries_many_single_resolvers_tcp_pipelining + run_many_asynch_queries_test_single_res(50, true, true) + end + + def run_many_asynch_queries_test_single_res(num_resolvers, tcp = false, pipelining = false) + q = Queue.new + timeout_count = 0 + resolvers = Array.new(num_resolvers) do + Dnsruby::SingleResolver.new(server: IP, + port: PORT, + do_caching: false, + do_validation: false, + tcp_pipelining: pipelining, + packet_timeout: 10, + tcp_pipelining_max_queries: 5, + use_tcp: tcp) + end + start = Time.now + + # @todo@ On windows, MAX_FILES is 256. This means that we have to limit + # this test while we're not using single sockets. + # We run four queries per iteration, so we're limited to 64 runs. + messages = TestSoakBase::Rrs.map do |data| + message = Dnsruby::Message.new(data[:name], data[:type]) + message.do_validation = false + message.do_caching = false + message + end + + query_count = SINGLE_RESOLVER_QUERY_TIMES * messages.count + + receive_thread = Thread.new do + query_count.times do + _id, ret, error = q.pop + if error.is_a?(Dnsruby::ResolvTimeout) + timeout_count+=1 + elsif ret.class != Dnsruby::Message + p "ERROR RETURNED : #{error}" + end + end + end + + resolver_cycler = resolvers.cycle + + SINGLE_RESOLVER_QUERY_TIMES.times do |i| + rr_count = 0 + messages.each do | message | + rr_count += 1 + resolver_cycler.next.send_async(message, q, rr_count + i * messages.count) + # p "Sent #{i}, #{rr_count}, Queue #{q}" + end + end + + receive_thread.join + + time_taken = Time.now - start + puts "Query count : #{query_count}, #{timeout_count} timed out. #{time_taken} time taken" + assert(timeout_count < query_count * 0.1, "#{timeout_count} of #{query_count} timed out!") + end + + def test_many_threads_on_one_single_resolver_synchronous + # Test multi-threaded behaviour + # Check the header IDs to make sure they're all different + threads = Array.new + + res = create_default_single_resolver + ids = [] + mutex = Mutex.new + timeout_count = 0 + query_count = 0 + res.packet_timeout=4 + start=Time.now + # Windows limits us to 256 sockets + num_times=250 + if (/java/ =~ RUBY_PLATFORM) + # JRuby threads are native threads, so let's not go too mad! + num_times=50 + end + num_times.times do |i| + threads[i] = Thread.new{ + 40.times do |j| + TestSoakBase::Rrs.each do |data| + mutex.synchronize { query_count += 1 } + packet=nil + begin + packet = res.query(data[:name], data[:type]) + rescue Dnsruby::ResolvTimeout + mutex.synchronize { timeout_count += 1 } + next + end + assert(packet) + ids.push(packet.header.id) + assert_equal(packet.question[0].qclass, 'IN', 'Class correct' ) + end + end + } + end + threads.each do |thread| + thread.join + end + stop=Time.now + time_taken=stop-start + puts "Query count : #{query_count}, #{timeout_count} timed out. #{time_taken} time taken" + # check_ids(ids) # only do this if we expect all different IDs - e.g. if we stream over a single socket + assert(timeout_count < query_count * 0.1, "#{timeout_count} of #{query_count} timed out!") + end + + def check_ids(ids) + ids.sort! + count = 0 + ids.each do |id| + count+=1 + if (count < ids.length-1) + assert(ids[count+1] != id, "Two identical header ids used!") + end + end + end + + def test_many_threads_on_many_single_resolvers + # Test multi-threaded behaviour + # @todo@ Check the header IDs to make sure they're all different + threads = Array.new + mutex = Mutex.new + timeout_count = 0 + query_count = 0 + start=Time.now + num_times=250 + if (/java/ =~ RUBY_PLATFORM) + # JRuby threads are native threads, so let's not go too mad! + num_times=50 + end + num_times.times do |i| + threads[i] = Thread.new{ + res = create_default_single_resolver + 40.times do |j| + TestSoakBase::Rrs.each do |data| + mutex.synchronize do + query_count+=1 + end + q = Queue.new + + message = Dnsruby::Message.new(data[:name], data[:type]) + message.do_validation = false + message.do_caching = false + + res.send_async(message, q, [i,j]) + + id, packet, error = q.pop + if (error.class == Dnsruby::ResolvTimeout) + mutex.synchronize { + timeout_count+=1 + } + next + elsif (packet.class!=Dnsruby::Message) + puts "ERROR! #{error}" + end + + assert(packet) + assert_equal(packet.question[0].qclass, 'IN', 'Class correct' ) + end + end + } + end + # NOTE: For methods on the objects taking no params, we can use this shorthand. + threads.each(&:join) + + time_taken = Time.now - start + puts "Query count : #{query_count}, #{timeout_count} timed out. #{time_taken} time taken" + assert(timeout_count < query_count * 0.1, "#{timeout_count} of #{query_count} timed out!") + end + + def create_default_single_resolver + Dnsruby::SingleResolver.new(server: IP, + port: PORT, + do_caching: false, + do_validation: false, + packet_timeout: 10) + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_soak_base.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_soak_base.rb new file mode 100644 index 000000000000..1866f4a30626 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_soak_base.rb @@ -0,0 +1,152 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestSoakBase # < Minitest::Test + + include Dnsruby + + Rrs = [ + { + :type => Types.A, + :name => 'ns1.google.com.', + :address => '10.0.1.128' + }, + { + :type => Types::MX, + :name => 'ns1.google.com.', + :exchange => 'ns1.google.com.', + :preference => 10 + }, + { + :type => 'CNAME', + :name => 'ns1.google.com.', + :domainname => 'a.t.dnsruby.validation-test-servers.nominet.org.uk' + }, + { + :type => Types.TXT, + :name => 'ns1.google.com.', + :strings => ['Net-DNS'] + } + ] + + def TestSoakBase.test_continuous_queries_asynch_single_res + # Have two threads looping, with one sending, and one receiving queries. + # Never exceed more than 200 concurrent queries, but make sure they're always running. + outstanding_limit = 1 + num_loops = 2000 + num_sent = 0 + q = Queue.new + timed_out = 0 + mutex = Mutex.new + start = Time.now + num_in_progress = 0 + sender = Thread.new{ + res = SingleResolver.new + res.packet_timeout=5 + num_loops.times do |i| + rr_count = 0 + Rrs.each do |data| + rr_count+=1 + while (mutex.synchronize{num_in_progress> outstanding_limit}) do + sleep(0.01) + end + res.send_async(Message.new(data[:name], data[:type]), q, [i,rr_count]) + puts num_sent + num_sent+=1 + mutex.synchronize { + num_in_progress+=1 + } + end + end + + } + receiver = Thread.new{ + (num_loops*4).times do |i| + id,ret, error = q.pop + mutex.synchronize { + num_in_progress-=1 + } + if (error.class == ResolvTimeout) + timed_out+=1 + # p "Number #{i} timed out!" + elsif (ret.class != Message) + Dnsruby.log.debug("tc_single_resolver : Query #{i} ERROR RETURNED : #{error.class}, #{error}") + end + end + } + sender.join + receiver.join + assert(num_in_progress==0) + stop=Time.now + time_taken=stop-start + puts "Query count : #{num_sent}, #{timed_out} timed out. #{time_taken} time taken" + assert(timed_out < num_sent * 0.1, "#{timed_out} of #{num_sent} timed out!") + end + + def TestSoakBase.test_continuous_queries_asynch_resolver + # Have two threads looping, with one sending, and one receiving queries. + # Never exceed more than 250 concurrent queries, but make sure they're always running. + num_loops = 1000 + num_sent = 0 + q = Queue.new + timed_out = 0 + mutex = Mutex.new + start = Time.now + num_in_progress = 0 + sender = Thread.new{ + res = Resolver.new + # On windows, MAX_FILES is 256. This means that we have to limit + # this test while we're not using single sockets. + # We run four queries per iteration, so we're limited to 64 runs. + num_loops.times do |i| + while (mutex.synchronize{num_in_progress> 50}) do # One query has several sockets in Resolver + sleep(0.01) + end + res.send_async(Message.new("example.com", Types.A), q, [i,1]) + num_sent+=1 + mutex.synchronize { + num_in_progress+=1 + } + end + } + error_count=0 + receiver = Thread.new{ + (num_loops).times do |i| + id,ret, error = q.pop + mutex.synchronize { + num_in_progress-=1 + } + if (error.class == ResolvTimeout) + timed_out+=1 + # p "Number #{i} timed out!" + elsif (ret.class != Message) + error_count+=1 + Dnsruby.log.error("tc_single_resolver : Query #{i} ERROR RETURNED : #{error.class}, #{error}") + end + end + } + sender.join + receiver.join + assert(num_in_progress==0) + stop=Time.now + time_taken=stop-start + puts "Query count : #{num_sent}, #{timed_out} timed out, #{error_count} other errors. #{time_taken} time taken" + assert(timed_out < num_sent * 0.1, "#{timed_out} of #{num_sent} timed out!") + assert(error_count == 0) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_sshfp.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_sshfp.rb new file mode 100644 index 000000000000..8f72d3be5d0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_sshfp.rb @@ -0,0 +1,43 @@ + +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestSSHFP < Minitest::Test + + include Dnsruby + + def test_sshfp + txt = "apt-blade6.nominet.org.uk. 85826 IN SSHFP 1 1 6D4CF7C68E3A959990855099E15D6E0D4DEA4FFF" + sshfp = RR.create(txt) + assert(sshfp.type == Types.SSHFP) + assert(sshfp.alg == RR::SSHFP::Algorithms.RSA) + assert(sshfp.fptype == RR::SSHFP::FpTypes.SHA1) + assert(sshfp.fp.unpack("H*")[0].upcase == "6D4CF7C68E3A959990855099E15D6E0D4DEA4FFF") + + m = Dnsruby::Message.new + m.add_additional(sshfp) + data = m.encode + m2 = Dnsruby::Message.decode(data) + sshfp2 = m2.additional()[0] + assert(sshfp.fptype == sshfp2.fptype) + assert(sshfp.alg == sshfp2.alg) + assert(sshfp.fp == sshfp2.fp) + assert(sshfp == sshfp2) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tcp.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tcp.rb new file mode 100644 index 000000000000..dfb59f782499 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tcp.rb @@ -0,0 +1,191 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +require 'socket' +class TestTcp < Minitest::Test + def test_TCP + res = Dnsruby::Resolver.new() + res.use_tcp = true + ret=res.query("example.com") + assert(ret.is_a?(Dnsruby::Message)) + end + def test_TCP_port + # Need a test server so we can tell what port this message was actually sent on! + port = nil + src_port = 57923 + Dnsruby::PacketSender.clear_caches + received_port = nil + server_thread = Thread.new { + ts = TCPServer.new(0) + port = ts.addr[1] + t = ts.accept + # Check that the source port was src_port + received_port = t.peeraddr()[1] + packet = t.recvfrom(2)[0] + + len = (packet[0]<<8)+packet[1] + if (RUBY_VERSION >= "1.9") + len = (packet[0].getbyte(0)<<8)+packet[1].getbyte(0)# Ruby 1.9 + end + packet = t.recvfrom(len)[0] + tcpPacket = Dnsruby::Message.decode(packet) + tcpPacket.header.tc = true + lenmsg = [tcpPacket.encode.length].pack('n') + t.send(lenmsg, 0) + t.write(tcpPacket.encode) + t.close + ts.close + } + ret = nil + sleep(1) + client_thread = Thread.new { +# res = Dnsruby::SingleResolver.new("127.0.0.1") + res = Dnsruby::SingleResolver.new("localhost") + res.port = port + res.use_tcp = true + res.src_port=src_port + ret=res.query("example.com") + } + server_thread.join + client_thread.join + assert(received_port == src_port) + assert(ret.is_a?(Dnsruby::Message)) + end + +# def test_no_tcp +# # Try to get a long response (which is truncated) and check that we have +# @TODO@ FIX THIS TEST!!! +# # tc bit set +# res = Dnsruby::Resolver.new() +# res.udp_size = 512 +# res.no_tcp = true +# ret = res.query("overflow.dnsruby.validation-test-servers.nominet.org.uk", Dnsruby::Types.TXT) +# assert(ret.header.tc, "Message should be truncated with no TCP") +# end + + class HackMessage < Dnsruby::Message + def wipe_additional + @additional = Dnsruby::Section.new(self) + end + + # Decode the encoded message + def HackMessage.decode(m) + o = HackMessage.new() + begin + Dnsruby::MessageDecoder.new(m) {|msg| + o.header = Dnsruby::Header.new(msg) + o.header.qdcount.times { + question = msg.get_question + o.question << question + } + o.header.ancount.times { + rr = msg.get_rr + o.answer << rr + } + o.header.nscount.times { + rr = msg.get_rr + o.authority << rr + } + o.header.arcount.times { |count| + start = msg.index + rr = msg.get_rr + if (rr.type == Dnsruby::Types::TSIG) + if (count!=o.header.arcount-1) + Dnsruby.log.Error("Incoming message has TSIG record before last record") + raise Dnsruby::DecodeError.new("TSIG record present before last record") + end + o.tsigstart = start # needed for TSIG verification + end + o.additional << rr + } + } + rescue Dnsruby::DecodeError => e + # So we got a decode error + # However, we might have been able to fill in many parts of the message + # So let's raise the DecodeError, but add the partially completed message + e.partial_message = o + raise e + end + return o + end + + end + + def test_bad_truncation + # Some servers don't do truncation properly. + # Make a UDP server which returns large badly formatted packets (arcount > num_additional), with TC bit set + #  And make a TCP server which returns large well formatted packets + # Then make sure that Dnsruby recieves response correctly. + Dnsruby::PacketSender.clear_caches + socket = UDPSocket.new + socket.bind("127.0.0.1", 0) + port = socket.addr[1] + Thread.new { + s = socket.recvfrom(65536) + received_query = s[0] + socket.connect(s[1][2], s[1][1]) + ans = HackMessage.decode(received_query) + ans.wipe_additional + 100.times {|i| + ans.add_additional(Dnsruby::RR.create("example.com 3600 IN A 1.2.3.#{i}")) + } + ans.header.arcount = 110 + ans.header.tc = true + socket.send(ans.encode,0) + } + + server_thread = Thread.new { + ts = TCPServer.new(port) + t = ts.accept + packet = t.recvfrom(2)[0] + + len = (packet[0]<<8)+packet[1] + if (RUBY_VERSION >= "1.9") + len = (packet[0].getbyte(0)<<8)+packet[1].getbyte(0)# Ruby 1.9 + end + packet = t.recvfrom(len)[0] + tcpPacket = HackMessage.decode(packet) + tcpPacket.wipe_additional + 110.times {|i| + tcpPacket.add_additional(Dnsruby::RR.create("example.com 3600 IN A 1.2.3.#{i}")) + } + lenmsg = [tcpPacket.encode.length].pack('n') + t.send(lenmsg, 0) + t.write(tcpPacket.encode) + t.close + ts.close + } + + + + # Now send query + res = Dnsruby::Resolver.new("127.0.0.1") + res.port = port + res.udp_size = 4096 + assert(res.udp_size == 4096) + ret = res.query("example.com") + assert(ret.header.arcount == 110) + count = 0 + ret.additional.each {|rr| count += 1} + assert(count == 110) + + + end + + # @TODO@ Check stuff like persistent sockets +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tcp_pipelining.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tcp_pipelining.rb new file mode 100644 index 000000000000..f644f7d01418 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tcp_pipelining.rb @@ -0,0 +1,255 @@ +# -- +# Copyright 2015 Verisign +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' +require_relative 'test_dnsserver' + +# The TCPPipeliningServer links our NioTcpPipeliningHandler on +# the loopback interface. +class TCPPipeliningServer < Async::DNS::Server + PORT = 53937 + IP = '127.0.0.1' + + DEFAULT_MAX_REQUESTS = 4 + DEFAULT_TIMEOUT = 3 + + @@stats = Stats.new + + def self.stats + @@stats + end + + def initialize(**options) + super(options) + + @handlers = [] + @handlers << NioTcpPipeliningHandler.new(self, IP, PORT, DEFAULT_MAX_REQUESTS, DEFAULT_TIMEOUT) #4 max request + end + + def process(name, resource_class, transaction) + @logger.debug "name: #{name}" + transaction.respond!("93.184.216.34", { resource_class: ::Resolv::DNS::Resource::IN::A }) + end + +end + +class TestTCPPipelining < Minitest::Test + + class << self + attr_accessor :query_id + end + + def self.init + unless @initialized + @initialized = true + @query_id = 0 + end + end + + @@server = nil + + def setup + return + self.class.init + + # Instantiate a new server that uses our tcp pipelining handler + # For each query the server sends the query upstream (193.0.14.129) + options = { + server_class: TCPPipeliningServer, + } + + #RubyDNS::run_server(options) || true + if !@@server + @@server = TCPPipeliningServer.new() + + Thread.new do + @@server.run + end + end + + # Instantiate our resolver. The resolver will use the same pipeline as much as possible. + # If a timeout occurs or max_request_per_connection a new connection should be initiated + @@resolver ||= Dnsruby::Resolver.new( + use_tcp: true, + do_caching: false, + tcp_pipelining: true, + dnssec: false, + packet_timeout: 10, + tcp_pipelining_max_queries: 10, + nameserver: TCPPipeliningServer::IP, + port: TCPPipeliningServer::PORT) + end + + # Send x number of queries asynchronously to our resolver + def send_async_messages(number_of_messages, queue, wait_seconds = 0) + Dnsruby.log.debug "Sending #{number_of_messages} messages" + number_of_messages.times do + name = "#{self.class.query_id}.com" + Dnsruby.log.debug "Sending #{name}" + message = Dnsruby::Message.new(name) + # self.class.query_id identifies our query, must be different for each message + @@resolver.send_async(message, queue, self.class.query_id) + self.class.query_id += 1 + + # Note: For 0, we don't sleep at all instead of sleeping 0 since sleeping 0 + # involves yielding the CPU. + sleep wait_seconds unless wait_seconds == 0 + end + end + + # Verify x responses with no exception + def verify_responses(number_of_messages, queue) + number_of_messages.times do + _response_id, response, exception = queue.pop + assert_nil(exception) + assert(response.is_a?(Dnsruby::Message)) + end + end + + def accept_wait(accept_count, max) + i = 0 + while TCPPipeliningServer.stats.accept_count < accept_count + sleep 0.5 + i+=0.5 + assert(i<max, "Max wait for accept reached #{TCPPipeliningServer.stats.accept_count} accepts < #{accept_count}") + end + end + + def connection_wait(connection_count, max) + i = 0 + while TCPPipeliningServer.stats.connections > connection_count + sleep 0.5 + i+=0.5 + assert(i<max, "Max wait for connection reached: #{TCPPipeliningServer.stats.connections} active connections > #{connection_count}") + end + end + + def timeout_wait(timeout_count, max) + i = 0 + while TCPPipeliningServer.stats.timeout_count < timeout_count + sleep 0.5 + i+=0.5 + assert(i<max, "Max wait for timeout reached #{TCPPipeliningServer.stats.timeout_count} timeounts < #{timeout_count}") + end + end + + # This test initiates multiple asynchronous requests and verifies they go on the same tcp + # pipeline or a new one depending on timeouts + def test_TCP_pipelining_timeout + return + Dnsruby.log.debug "test_TCP_pipelining_timeout" + connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + + accept_count = TCPPipeliningServer.stats.accept_count + timeout_count = TCPPipeliningServer.stats.timeout_count + + # This is the main queue used to communicate between Dnsruby in async mode and the client + query_queue = Queue.new + + # Test basic pipelining. All request should go on the same tcp connection. + # TCPPipeliningServer.stats.accept_count should be 1. + send_async_messages(3, query_queue) + verify_responses(3, query_queue) + + assert_equal(accept_count + 1, TCPPipeliningServer.stats.accept_count) + + connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + timeout_wait(timeout_count + 1, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + + assert_equal(timeout_count + 1, TCPPipeliningServer.stats.timeout_count) + + # Initiate another 3 queries, check accept_count and timeout_count + send_async_messages(3, query_queue) + verify_responses(3, query_queue) + + connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + timeout_wait(timeout_count + 2, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + + assert_equal(accept_count + 2, TCPPipeliningServer.stats.accept_count) + assert_equal(timeout_count + 2, TCPPipeliningServer.stats.timeout_count) + + connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + end + + # Test timeout occurs and new connection is initiated inbetween 2 sends + def test_TCP_pipelining_timeout_in_send + return + Dnsruby.log.debug "test_TCP_pipelining_timeout_in_send" + connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + + accept_count = TCPPipeliningServer.stats.accept_count + timeout_count = TCPPipeliningServer.stats.timeout_count + + query_queue = Queue.new + + # Initiate another 2 queries wait and then send a final query + # Check accept_count. Wait for timeout and verify we got 2 additional timeouts. + send_async_messages(2, query_queue) + verify_responses(2, query_queue) + + accept_wait(accept_count+1, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + + send_async_messages(1, query_queue) + + verify_responses(1, query_queue) + + assert_equal(accept_count + 2, TCPPipeliningServer.stats.accept_count) + + connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + + timeout_wait(timeout_count + 2, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + end + + # Test that we get a SocketEofResolvError if the servers closes the socket before + # all queries are answered + def test_TCP_pipelining_socket_eof + return + connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + + query_queue = Queue.new + + # Issue 6 queries. Only 4 should be replied since max_request_per_connection = 4 + # Verify we get Dnsruby::SocketEofResolvError on the last 2. + # Verify we got max_count was incremented + send_async_messages(6, query_queue) + + responses = [] + + 6.times do + response = query_queue.pop + responses << response + end + + responses.sort_by { |response| response[0] } + + step = 0 + + responses.each do | response | + _response_id, response, exception = response + if step < TCPPipeliningServer::DEFAULT_MAX_REQUESTS + assert_nil(exception, "Exception not nil for msg #{step} < #{TCPPipeliningServer::DEFAULT_MAX_REQUESTS} requests") + assert(response.is_a?(Dnsruby::Message)) + else + assert_equal(Dnsruby::SocketEofResolvError, exception.class) + assert_nil(response) + end + step += 1 + end + + connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tkey.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tkey.rb new file mode 100644 index 000000000000..c6c54c24ce81 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tkey.rb @@ -0,0 +1,76 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +require "digest/md5" +class TestTKey < Minitest::Test + def is_empty(string) + return (string == "; no data" || string == "; rdlength = 0") + end + + def test_tkey + + + # ------------------------------------------------------------------------------ + # Canned data. + # ------------------------------------------------------------------------------ + + zone = "example.com" + name = "123456789-test" + klass = "IN" + type = Dnsruby::Types.TKEY + algorithm = "fake.algorithm.example.com" + key = "fake key" + inception = 100000 # use a strange fixed inception time to give a fixed + # checksum + expiration = inception + 24*60*60 + + rr = nil + + # ------------------------------------------------------------------------------ + # Packet creation. + # ------------------------------------------------------------------------------ + + rr = Dnsruby::RR.create( + :name => name, + :type => "TKEY", + :ttl => 0, + :klass => "ANY", + :algorithm => algorithm, + :inception => inception, + :expiration => expiration, + :mode => 3, # GSSAPI + :key => "fake key", + :other_data => "" + ) + + packet = Dnsruby::Message.new(name, Dnsruby::Types.TKEY, "IN") + packet.add_answer(rr) + + z = (packet.zone)[0] + + assert(packet, 'new() returned packet') #2 + assert_equal(Dnsruby::OpCode.QUERY, packet.header.opcode, 'header opcode correct') #3 + assert_equal(name, z.zname.to_s, 'zname correct') #4 + assert_equal(Dnsruby::Classes.IN, z.zclass, 'zclass correct') #5 + assert_equal(Dnsruby::Types.TKEY, z.ztype, 'ztype correct') #6 + + # @TODO@ Test TKEY against server! + + end + + end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tlsa.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tlsa.rb new file mode 100644 index 000000000000..567f80dcdf41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tlsa.rb @@ -0,0 +1,191 @@ +require_relative 'spec_helper' + +require 'openssl' +require 'digest' + +class TLSATest < Minitest::Test + include Dnsruby + + INPUT = ['_443._tcp.example.jp. IN TLSA 3 0 1 ( 6609173804b9e31895f550db027ef7c7fa6f1bc9326c99371b61f1ba5 '\ + 'cb3595d )', + '_443._tcp.example.jp. IN TLSA 255 255 255 ( 6609173804b9e31895f550db027ef7c7fa6f1bc9326c99371b61f1ba5 '\ + 'cb3595d )', + '_443._tcp.data.iana.org. IN TLSA 3 0 0 ( 308206833082056ba003020102021009cabbe2191c8f569dd4b6dd250 '\ + 'f21d8300d06092a864886f70d01010b05003070310b30090603550406 '\ + '1302555331153013060355040a130c446967694365727420496e63311 '\ + '93017060355040b13107777772e64696769636572742e636f6d312f30 '\ + '2d0603550403132644696769436572742053484132204869676820417 '\ + '3737572616e636520536572766572204341301e170d31343130323730 '\ + '30303030305a170d3138303130333132303030305a3081a3310b30090 '\ + '60355040613025553311330110603550408130a43616c69666f726e69 '\ + '61311430120603550407130b4c6f7320416e67656c6573313c303a060 '\ + '355040a1333496e7465726e657420436f72706f726174696f6e20666f '\ + '722041737369676e6564204e616d657320616e64204e756d626572733 '\ + '1163014060355040b130d4954204f7065726174696f6e733113301106 '\ + '035504030c0a2a2e69616e612e6f726730820222300d06092a864886f '\ + '70d01010105000382020f003082020a02820201009dbdfddeb5cae53a '\ + '559747e2fda63728e4aba60f18b79a69f03310bf0164e5ee7db6b15bf '\ + '56df23fddbae6a1bb38449b8c883f18102bbd8bb655ac0e2dac2ee3ed '\ + '5cf4315868d2c598068284854b24894dcd4bd37811f0ad3a282cd4b4e '\ + '599ffd07d8d2d3f2478554f81020b320ee12f44948e2ea1edbc990b83 '\ + '0ca5cca6b4a839fb27b51850c9847eac74f26609eb24365b9751fb1c3 '\ + '208f56913bacbcae49201347c78b7e54a9d99979404c37f00fb65db84 '\ + '9fd75e3a68770c30f2abe65b33256fb59b450050b00d8139d4d80d36f '\ + '7bc46daf303e48f0f0791b2fdd72ec60b2cb3ad533c3f288c9c194e49 '\ + '337a69c496731f086d4f1f9825900713e2a551d05cb6057567850d91e '\ + '6001c4ce27176f0957873a95b880acbec19e7bd9bcf1286d0452b7378 '\ + '9c41905dd470971cd73aea52c77b080cd779af58234f337225c26f87a '\ + '8c13e2a65e9dd4e03a5b41d7e06b3353f38129b2327a531ec9627a21d '\ + 'c423733aa029d4989448ba3322891c1a5690ddf2d25c8ec8aaa894b14 '\ + 'aa92130c6b6d969a21ff671b60c4c923a94a93ea1dd0492c93393ca6e '\ + 'dd61f33ca77e9208d01d6bd15107662ec088733df4c876a7e1608b829 '\ + '73a0f7592e84ed15579d181e79024ae8a7e4b9f0078eb2005b23f9d09 '\ + 'a1df1bbc7de2a5a6085a3646d9fadb0e9da273a5f403cdd42831ce6f0 '\ + 'ca46889585602bb8bc36bb3be861ff6d1a62e350203010001a38201e3 '\ + '308201df301f0603551d230418301680145168ff90af0207753cccd96 '\ + '56462a212b859723b301d0603551d0e04160414c7d0acef898b20e4b9 '\ + '14668933032394f6bf3a61301f0603551d1104183016820a2a2e69616 '\ + 'e612e6f7267820869616e612e6f7267300e0603551d0f0101ff040403 '\ + '0205a0301d0603551d250416301406082b0601050507030106082b060 '\ + '1050507030230750603551d1f046e306c3034a032a030862e68747470 '\ + '3a2f2f63726c332e64696769636572742e636f6d2f736861322d68612 '\ + 'd7365727665722d67332e63726c3034a032a030862e687474703a2f2f '\ + '63726c342e64696769636572742e636f6d2f736861322d68612d73657 '\ + '27665722d67332e63726c30420603551d20043b303930370609608648 '\ + '0186fd6c0101302a302806082b06010505070201161c68747470733a2 '\ + 'f2f7777772e64696769636572742e636f6d2f43505330818306082b06 '\ + '01050507010104773075302406082b060105050730018618687474703 '\ + 'a2f2f6f6373702e64696769636572742e636f6d304d06082b06010505 '\ + '0730028641687474703a2f2f636163657274732e64696769636572742 '\ + 'e636f6d2f446967694365727453484132486967684173737572616e63 '\ + '6553657276657243412e637274300c0603551d130101ff04023000300 '\ + 'd06092a864886f70d01010b0500038201010070314c38e7c02fd80810 '\ + '500b9df6dae85de9b23e29fbd68bfdb5f23411c89acfaf9ae05af9123 '\ + 'a8aa6bce6954a4e68dc7cfc480a65d76f229c4bd5f5674b0c9ac6d06a '\ + '37a1a1c145c3956120b8efe67c887ab4ff7d6aa950ff3698f27c4a19d '\ + '59d93a39aca5a7b6d6c75e34974e50f5a590005b3cb665ddbd7074f9f '\ + 'cbcbf9c50228d5e25596b64ada160b48f77a93aaced22617bfe005e00 '\ + 'fe20a532a0adcb818c878dc5d6649277777ca1a814e21d0b53308af40 '\ + '78be4554715e4ce4828b012f25ffa13a6ceb30d20a75deba8a344e41d '\ + '627fa638feff38a3063a0187519b39b053f7134d9cd83e6091accf5d2 '\ + 'e3a05edfa1dfbe181a87ad86ba24fe6b97fe )', + '_443._tcp.data.iana.org. IN TLSA 3 0 1 ( 2760bc55bbb8cf398e4c90da21018b2eaafc9e375f7428cf0708e7c88 '\ + '8261b49', + '_443._tcp.data.iana.org. IN TLSA 3 0 2 ( e6f38e78b1c9f8e0969e81c555e2770eeccb3f120986558adfb2c48aa '\ + 'dc6f85d3596f0cc7362a6a6cda7b6dea222a968fef5aeeaf6d334c8b9 '\ + '725543f27683db )', + '_443._tcp.data.iana.org. IN TLSA 3 1 0 (30820222300d06092a864886f70d01010105000382020f003082020a0 '\ + '2820201009dbdfddeb5cae53a559747e2fda63728e4aba60f18b79a69 '\ + 'f03310bf0164e5ee7db6b15bf56df23fddbae6a1bb38449b8c883f181 '\ + '02bbd8bb655ac0e2dac2ee3ed5cf4315868d2c598068284854b24894d '\ + 'cd4bd37811f0ad3a282cd4b4e599ffd07d8d2d3f2478554f81020b320 '\ + 'ee12f44948e2ea1edbc990b830ca5cca6b4a839fb27b51850c9847eac '\ + '74f26609eb24365b9751fb1c3208f56913bacbcae49201347c78b7e54 '\ + 'a9d99979404c37f00fb65db849fd75e3a68770c30f2abe65b33256fb5 '\ + '9b450050b00d8139d4d80d36f7bc46daf303e48f0f0791b2fdd72ec60 '\ + 'b2cb3ad533c3f288c9c194e49337a69c496731f086d4f1f9825900713 '\ + 'e2a551d05cb6057567850d91e6001c4ce27176f0957873a95b880acbe '\ + 'c19e7bd9bcf1286d0452b73789c41905dd470971cd73aea52c77b080c '\ + 'd779af58234f337225c26f87a8c13e2a65e9dd4e03a5b41d7e06b3353 '\ + 'f38129b2327a531ec9627a21dc423733aa029d4989448ba3322891c1a '\ + '5690ddf2d25c8ec8aaa894b14aa92130c6b6d969a21ff671b60c4c923 '\ + 'a94a93ea1dd0492c93393ca6edd61f33ca77e9208d01d6bd15107662e '\ + 'c088733df4c876a7e1608b82973a0f7592e84ed15579d181e79024ae8 '\ + 'a7e4b9f0078eb2005b23f9d09a1df1bbc7de2a5a6085a3646d9fadb0e '\ + '9da273a5f403cdd42831ce6f0ca46889585602bb8bc36bb3be861ff6d '\ + '1a62e350203010001 )', + '_443._tcp.data.iana.org. IN TLSA 3 1 1 ( d56f85824b6ed2ab15b9040c20b574515d9a0ab415ca253b42cbc915a '\ + '11de18d )', + '_443._tcp.data.iana.org. IN TLSA 3 1 2 ( ba8b1b6f74782cb681373c314cf7bf4d2468c6a9dee47909fae1381ca '\ + '6447249c42cb2a4d6d808fa1486ba70b7c1bb70dd76657a281441110b '\ + 'b4043007ee5ce3 )' + ].freeze + CERT = "-----BEGIN CERTIFICATE----- +MIIGgzCCBWugAwIBAgIQCcq74hkcj1ad1LbdJQ8h2DANBgkqhkiG9w0BAQsFADBw +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMS8wLQYDVQQDEyZEaWdpQ2VydCBTSEEyIEhpZ2ggQXNz +dXJhbmNlIFNlcnZlciBDQTAeFw0xNDEwMjcwMDAwMDBaFw0xODAxMDMxMjAwMDBa +MIGjMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxML +TG9zIEFuZ2VsZXMxPDA6BgNVBAoTM0ludGVybmV0IENvcnBvcmF0aW9uIGZvciBB +c3NpZ25lZCBOYW1lcyBhbmQgTnVtYmVyczEWMBQGA1UECxMNSVQgT3BlcmF0aW9u +czETMBEGA1UEAwwKKi5pYW5hLm9yZzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC +AgoCggIBAJ29/d61yuU6VZdH4v2mNyjkq6YPGLeaafAzEL8BZOXufbaxW/Vt8j/d +uuahuzhEm4yIPxgQK72LtlWsDi2sLuPtXPQxWGjSxZgGgoSFSySJTc1L03gR8K06 +KCzUtOWZ/9B9jS0/JHhVT4ECCzIO4S9ElI4uoe28mQuDDKXMprSoOfsntRhQyYR+ +rHTyZgnrJDZbl1H7HDII9WkTusvK5JIBNHx4t+VKnZmXlATDfwD7ZduEn9deOmh3 +DDDyq+ZbMyVvtZtFAFCwDYE51NgNNve8RtrzA+SPDweRsv3XLsYLLLOtUzw/KIyc +GU5JM3ppxJZzHwhtTx+YJZAHE+KlUdBctgV1Z4UNkeYAHEzicXbwlXhzqVuICsvs +Gee9m88ShtBFK3N4nEGQXdRwlxzXOupSx3sIDNd5r1gjTzNyJcJvh6jBPipl6d1O +A6W0HX4GszU/OBKbIyelMeyWJ6IdxCNzOqAp1JiUSLozIokcGlaQ3fLSXI7IqqiU +sUqpITDGttlpoh/2cbYMTJI6lKk+od0Ekskzk8pu3WHzPKd+kgjQHWvRUQdmLsCI +cz30yHan4WCLgpc6D3WS6E7RVXnRgeeQJK6KfkufAHjrIAWyP50Jod8bvH3ipaYI +WjZG2frbDp2ic6X0A83UKDHObwykaIlYVgK7i8Nrs76GH/bRpi41AgMBAAGjggHj +MIIB3zAfBgNVHSMEGDAWgBRRaP+QrwIHdTzM2WVkYqISuFlyOzAdBgNVHQ4EFgQU +x9Cs74mLIOS5FGaJMwMjlPa/OmEwHwYDVR0RBBgwFoIKKi5pYW5hLm9yZ4IIaWFu +YS5vcmcwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF +BQcDAjB1BgNVHR8EbjBsMDSgMqAwhi5odHRwOi8vY3JsMy5kaWdpY2VydC5jb20v +c2hhMi1oYS1zZXJ2ZXItZzMuY3JsMDSgMqAwhi5odHRwOi8vY3JsNC5kaWdpY2Vy +dC5jb20vc2hhMi1oYS1zZXJ2ZXItZzMuY3JsMEIGA1UdIAQ7MDkwNwYJYIZIAYb9 +bAEBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMw +gYMGCCsGAQUFBwEBBHcwdTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl +cnQuY29tME0GCCsGAQUFBzAChkFodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v +RGlnaUNlcnRTSEEySGlnaEFzc3VyYW5jZVNlcnZlckNBLmNydDAMBgNVHRMBAf8E +AjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBwMUw458Av2AgQUAud9troXemyPin71ov9 +tfI0Eciaz6+a4Fr5EjqKprzmlUpOaNx8/EgKZddvIpxL1fVnSwyaxtBqN6GhwUXD +lWEguO/mfIh6tP99aqlQ/zaY8nxKGdWdk6Oaylp7bWx140l05Q9aWQAFs8tmXdvX +B0+fy8v5xQIo1eJVlrZK2hYLSPd6k6rO0iYXv+AF4A/iClMqCty4GMh43F1mSSd3 +d8oagU4h0LUzCK9AeL5FVHFeTOSCiwEvJf+hOmzrMNIKdd66ijROQdYn+mOP7/OK +MGOgGHUZs5sFP3E02c2D5gkazPXS46Be36Hfvhgah62GuiT+a5f+ +-----END CERTIFICATE-----".freeze + + def test_tlsa_from_string + t1 = Dnsruby::RR.create(INPUT[0]) + assert_equal(3, t1.usage) + assert_equal(0, t1.selector) + assert_equal(1, t1.matching_type) + assert_equal('6609173804b9e31895f550db027ef7c7fa6f1bc9326c99371b61f1ba5 cb3595d', t1.data) + + t2 = Dnsruby::RR.create(INPUT[1]) + assert_equal(255, t2.usage) + assert_equal(255, t2.selector) + assert_equal(255, t2.matching_type) + assert_equal('6609173804b9e31895f550db027ef7c7fa6f1bc9326c99371b61f1ba5 cb3595d', t2.data) + end + + def test_tlsa_from_data + t1 = Dnsruby::RR.create(INPUT[0]) + m = Dnsruby::Message.new + m.add_additional(t1) + data = m.encode + m2 = Dnsruby::Message.decode(data) + t3 = m2.additional[0] + assert_equal(t1.to_s, t3.to_s) + end + + def test_tlsa_verify_rsa_cert + cert = OpenSSL::X509::Certificate.new(CERT) + der = cert.to_der + t4 = Dnsruby::RR.create(INPUT[2]) + assert_equal(t4.databin, der) + + t5 = Dnsruby::RR.create(INPUT[3]) + assert_equal(t5.databin, OpenSSL::Digest::SHA256.digest(der)) + + t6 = Dnsruby::RR.create(INPUT[4]) + assert_equal(t6.databin, OpenSSL::Digest::SHA512.digest(der)) + end + + def test_tlsa_verify_rsa_pkey + cert = OpenSSL::X509::Certificate.new(CERT) + pkey = cert.public_key.to_der + + t7 = Dnsruby::RR.create(INPUT[5]) + assert_equal(t7.databin, pkey) + + t8 = Dnsruby::RR.create(INPUT[6]) + assert_equal(t8.databin, OpenSSL::Digest::SHA256.digest(pkey)) + + t9 = Dnsruby::RR.create(INPUT[7]) + assert_equal(t9.databin, OpenSSL::Digest::SHA512.digest(pkey)) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tsig.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tsig.rb new file mode 100644 index 000000000000..e63b3ba5f768 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_tsig.rb @@ -0,0 +1,255 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +require "digest/md5" +class TestTSig < Minitest::Test + + include Dnsruby + + KEY_NAME="rubytsig" + KEY = "8n6gugn4aJ7MazyNlMccGKH1WxD2B3UvN/O/RA6iBupO2/03u9CTa3Ewz3gBWTSBCH3crY4Kk+tigNdeJBAvrw==" + def is_empty(string) + return (string == "; no data" || string == "; rdlength = 0") + end + def test_signed_update + # Dnsruby::Resolver::use_eventmachine(false) + run_test_client_signs + run_test_resolver_signs + end + # def test_signed_update_em + # begin + # Dnsruby::Resolver::use_eventmachine(true) + # rescue RuntimeError + # Dnsruby.log.error("EventMachine not installed - not running tsig EM tests") + # return + # end + # run_test_client_signs + # run_test_resolver_signs + # Dnsruby::Resolver::use_eventmachine(false) + # end + + def run_test_client_signs + # NOTE - client signing is only appropriate if DNSSEC and EDNS are switched + # off. Otherwise, the resolver will attempt to alter the flags and add an + # EDNS OPT psuedo-record to the query message, invalidating the signing. + tsig = Dnsruby::RR.create({ + :name => KEY_NAME, + :type => "TSIG", + :ttl => 0, + :klass => "ANY", + :algorithm => "hmac-md5", + :fudge => 300, + :key => KEY, + :error => 0 + }) + + update = Dnsruby::Update.new("validation-test-servers.nominet.org.uk") + # Generate update record name, and test it has been made. Then delete it and check it has been deleted + update_name = generate_update_name + update.absent(update_name) + update.add(update_name, 'TXT', 100, "test signed update") + tsig.apply(update) + assert(update.signed?, "Update has not been signed") + + res = Dnsruby::Resolver.new("ns0.validation-test-servers.nominet.org.uk") + res.udp_size=512 # Or else we needed to add OPT record already + res.dnssec=false + res.recurse=false + res.query_timeout = 20 + response = res.send_message(update) + + assert_equal( Dnsruby::RCode.NOERROR, response.rcode) + assert(response.verified?, "Response has not been verified") + + # Now check the record exists + rr = res.query(update_name, 'TXT') + assert_equal("test signed update", rr.answer()[0].strings.join(" "), "TXT record has not been created in zone") + + # Now delete the record + update = Dnsruby::Update.new("validation-test-servers.nominet.org.uk") + update.present(update_name, 'TXT') + update.delete(update_name) + tsig.apply(update) + assert(update.signed?, "Update has not been signed") + response = res.send_message(update) + assert_equal( Dnsruby::RCode.NOERROR, response.rcode) + assert(response.verified?, "Response has not been verified") + + # Now check the record does not exist + Dnsruby::PacketSender.clear_caches + # Or else the cache will tell us it still deos! + begin + rr = res.query(update_name, 'TXT') + assert(false) + rescue Dnsruby::NXDomain + end + end + + @@fudge = 0 + def generate_update_name + update_name = Time.now.to_i.to_s + @@fudge.to_s + @@fudge+=1 + update_name += ".update.validation-test-servers.nominet.org.uk" + return update_name + end + + def run_test_resolver_signs + res = Dnsruby::Resolver.new("ns0.validation-test-servers.nominet.org.uk") + res.query_timeout=20 + res.tsig=KEY_NAME, KEY + + update = Dnsruby::Update.new("validation-test-servers.nominet.org.uk") + # Generate update record name, and test it has been made. Then delete it and check it has been deleted + update_name = generate_update_name + update.absent(update_name) + update.add(update_name, 'TXT', 100, "test signed update") + assert(!update.signed?, "Update has been signed") + + response = res.send_message(update) + + assert_equal( Dnsruby::RCode.NOERROR, response.rcode) + assert(response.verified?, "Response has not been verified") + + # Now check the record exists + rr = res.query(update_name, 'TXT') + assert_equal("test signed update", rr.answer()[0].strings.join(" "), "TXT record has not been created in zone") + + # Now delete the record + update = Dnsruby::Update.new("validation-test-servers.nominet.org.uk") + update.present(update_name, 'TXT') + update.delete(update_name) + tsig = Dnsruby::RR.create({ + :type => 'TSIG', :klass => 'ANY', + :name => KEY_NAME, + :key => KEY + }) + tsig.apply(update) + assert(update.signed?, "Update has not been signed") + res.dnssec=false # Or else we needed to add OPT record already + res.udp_size = 512 + response = res.send_message(update) + assert_equal( Dnsruby::RCode.NOERROR, response.rcode) + assert(response.verified?, "Response has not been verified") + + # Now check the record does not exist + Dnsruby::PacketSender.clear_caches + # Make sure the cache doesn't have an old copy! + begin + rr = res.query(update_name, 'TXT') + assert(false) + rescue Dnsruby::NXDomain + end + end + + def test_message_signing + m = Dnsruby::Message.new("example.com") + m.set_tsig("name", "key") + assert(!m.signed?) + m.encode + assert(m.signed?) + + m = Dnsruby::Message.new("example.com") + m.set_tsig("name", "key") + assert(!m.signed?) + m.sign! + assert(m.signed?) + + m = Dnsruby::Message.new("example.com") + assert(!m.signed?) + m.sign!("name", "key") + assert(m.signed?) + end + + def test_signed_zone_transfer + # test TSIG over TCP session + axfr + ixfr + end + + def axfr + zt = Dnsruby::ZoneTransfer.new + zt.transfer_type = Dnsruby::Types.AXFR + zt.tsig=KEY_NAME, KEY + zt.server = "ns0.validation-test-servers.nominet.org.uk" + zone = zt.transfer("validation-test-servers.nominet.org.uk") + assert(zone.length > 0) + assert(zt.last_tsigstate==:Verified) + end + + # We also test IXFR here - this is because we need to update a record (using + # TSIG) before we can test ixfr... + def ixfr + # Check the SOA serial, do an update, check that the IXFR for that soa serial gives us the update we did, + # then delete the updated record + start_soa_serial = get_soa_serial("validation-test-servers.nominet.org.uk") + + # Now do an update + res = Dnsruby::Resolver.new("ns0.validation-test-servers.nominet.org.uk") + res.query_timeout=10 + res.tsig=KEY_NAME, KEY + + update = Dnsruby::Update.new("validation-test-servers.nominet.org.uk") + # Generate update record name, and test it has been made. Then delete it and check it has been deleted + update_name = Time.now.to_i.to_s + rand(100).to_s + ".update.validation-test-servers.nominet.org.uk" + update.absent(update_name) + update.add(update_name, 'TXT', 100, "test zone transfer") + assert(!update.signed?, "Update has been signed") + + response = res.send_message(update) + assert(response.rcode == Dnsruby::RCode.NOERROR) + + end_soa_serial = get_soa_serial("validation-test-servers.nominet.org.uk") + + zt = Dnsruby::ZoneTransfer.new + zt.transfer_type = Dnsruby::Types.IXFR + zt.server = "ns0.validation-test-servers.nominet.org.uk" + zt.serial = start_soa_serial # 2007090401 + deltas = zt.transfer("validation-test-servers.nominet.org.uk") + assert(deltas.length > 0) + assert(deltas.last.class == Dnsruby::ZoneTransfer::Delta) + assert_equal("test zone transfer", deltas.last.adds.last.strings.join(" ")) + assert(zt.last_tsigstate==nil) + + # Now delete the updated record + update = Dnsruby::Update.new("validation-test-servers.nominet.org.uk") + update.present(update_name, 'TXT') + update.delete(update_name) + response = res.send_message(update) + assert_equal( Dnsruby::RCode.NOERROR, response.rcode) + end + + def get_soa_serial(name) + soa_serial = nil + Dnsruby::DNS.open {|dns| + soa_rr = dns.getresource(name, 'SOA') + soa_serial = soa_rr.serial + } + return soa_serial + end + + def test_bad_tsig + res = Resolver.new + res.query_timeout=10 + res.tsig=KEY_NAME, KEY + begin + ret = res.query("example.com") + assert(false, "Should not have got TSIG response from non-TSIG server!\n #{ret}\n") + rescue TsigError => e + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_update.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_update.rb new file mode 100644 index 000000000000..f8e2a97b3c9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_update.rb @@ -0,0 +1,294 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestUpdate < Minitest::Test + + include Dnsruby + + def is_empty(string) + return true if string == nil || string.length == 0 + + return (string == "; no data" || string == "; rdlength = 0"); + end + + def test_update + # ------------------------------------------------------------------------------ + # Canned data. + # ------------------------------------------------------------------------------ + + zone = "example.com"; + name = "foo.example.com"; + klass = Classes.CLASS32; + klass2 = Classes.CH; + type = Types.A; + ttl = 43200; + rdata = "10.1.2.3"; + rr = nil; + + # ------------------------------------------------------------------------------ + # Packet creation. + # ------------------------------------------------------------------------------ + + update = Dnsruby::Update.new(zone, klass); + z = (update.zone)[0]; + + assert(update, 'new() returned packet'); #2 + assert_equal(update.header.opcode, OpCode.UPDATE, 'header opcode correct'); #3 + assert_equal(z.zname.to_s, zone, 'zname correct'); #4 + assert_equal(z.zclass.to_s, klass.to_s, 'zclass correct'); #5 + assert_equal(z.ztype, Types.SOA, 'ztype correct'); #6 + + # ------------------------------------------------------------------------------ + # RRset exists (value-independent). + # ------------------------------------------------------------------------------ + + rr = update.present(name, type); + + assert(rr, 'yxrrset() returned RR'); #7 + assert_equal(name, rr.name.to_s, 'yxrrset - right name'); #8 + assert_equal(0, rr.ttl, 'yxrrset - right TTL'); #9 + assert_equal('ANY', rr.klass.string, 'yxrrset - right class'); #10 + assert_equal(type, rr.type, 'yxrrset - right type'); #11 + assert(is_empty(rr.rdata), "yxrrset - data empty (#{rr.rdata})"); #12 + + rr = nil + + # ------------------------------------------------------------------------------ + # RRset exists (value-dependent). + # ------------------------------------------------------------------------------ + + rr = update.present(name, type, rdata, klass); + + assert(rr, 'yxrrset() returned RR'); #13 + assert_equal(name, rr.name.to_s, 'yxrrset - right name'); #14 + assert_equal(0, rr.ttl, 'yxrrset - right TTL'); #15 + assert_equal(klass, rr.klass.string, 'yxrrset - right class'); #16 + assert_equal(type, rr.type, 'yxrrset - right type'); #17 + assert_equal(rdata, rr.rdata, 'yxrrset - right data'); #18 + + rr=nil + + # ------------------------------------------------------------------------------ + # RRset does not exist. + # ------------------------------------------------------------------------------ + + rr = update.absent(name, type); + + assert(rr, 'nxrrset() returned RR'); #19 + assert_equal(name, rr.name.to_s, 'nxrrset - right name'); #20 + assert_equal(0, rr.ttl, 'nxrrset - right ttl'); #21 + assert_equal('NONE', rr.klass.string, 'nxrrset - right class'); #22 + assert_equal(type, rr.type, 'nxrrset - right type'); #23 + assert(is_empty(rr.rdata), 'nxrrset - data empty'); #24 + + rr = nil + + # ------------------------------------------------------------------------------ + # Name is in use. + # ------------------------------------------------------------------------------ + + rr = update.present(name); + + assert(rr, 'yxdomain() returned RR'); #25 + assert_equal(rr.name.to_s, name, 'yxdomain - right name'); #26 + assert_equal(rr.ttl, 0, 'yxdomain - right ttl'); #27 + assert_equal(rr.klass.string, 'ANY', 'yxdomain - right class'); #28 + assert_equal(rr.type.string, 'ANY', 'yxdomain - right type'); #29 + assert(is_empty(rr.rdata), 'yxdomain - data empty'); #30 + + rr = nil + + # ------------------------------------------------------------------------------ + # Name is not in use. (No Class) + # ------------------------------------------------------------------------------ + + rr = update.absent(name); + + assert(rr, 'nxdomain() returned RR'); #31 + assert_equal(rr.name.to_s, name, 'nxdomain - right name'); #32 + assert_equal(rr.ttl, 0, 'nxdomain - right ttl'); #33 + assert_equal(rr.klass.string, 'NONE', 'nxdomain - right class'); #34 + assert_equal(rr.type.string, 'ANY', 'nxdomain - right type'); #35 + assert(is_empty(rr.rdata), 'nxdomain - data empty'); #36 + + rr = nil + + + + # ------------------------------------------------------------------------------ + # Add to an RRset. + # ------------------------------------------------------------------------------ + + rr = update.add(name, type, ttl, rdata); + + assert(rr, 'rr_add() returned RR'); #37 + assert_equal(rr.name.to_s, name, 'rr_add - right name'); #38 + assert_equal(rr.ttl, ttl, 'rr_add - right ttl'); #39 + assert_equal(rr.klass, klass, 'rr_add - right class'); #40 + assert_equal(rr.type, type, 'rr_add - right type'); #41 + assert_equal(rr.rdata, rdata, 'rr_add - right data'); #42 + + rr = nil + + # ------------------------------------------------------------------------------ + # Delete an RRset. + # ------------------------------------------------------------------------------ + + rr = update.delete(name, type); + + assert(rr, 'rr_del() returned RR'); #43 + assert_equal(name, rr.name.to_s, 'rr_del - right name'); #44 + assert_equal(0, rr.ttl, 'rr_del - right ttl'); #45 + assert_equal('ANY', rr.klass.string, 'rr_del - right class'); #46 + assert_equal(type, rr.type, 'rr_del - right type'); #47 + assert(is_empty(rr.rdata), 'rr_del - data empty'); #48 + + rr = nil + + # ------------------------------------------------------------------------------ + # Delete All RRsets From A Name. + # ------------------------------------------------------------------------------ + + rr = update.delete(name); + + assert(rr, 'rr_del() returned RR'); #49 + assert_equal(name, rr.name.to_s, 'rr_del - right name'); #50 + assert_equal(0, rr.ttl, 'rr_del - right ttl'); #51 + assert_equal(Classes.ANY, rr.klass, 'rr_del - right class'); #52 + assert_equal(Classes.ANY, rr.type, 'rr_del - right type'); #53 + assert(is_empty(rr.rdata), 'rr_del - data empty'); #54 + + rr = nil + + # ------------------------------------------------------------------------------ + # Delete An RR From An RRset. + # ------------------------------------------------------------------------------ + + rr = update.delete(name, type, rdata); + + assert(rr, 'rr_del() returned RR'); #55 + assert_equal(name, rr.name.to_s, 'rr_del - right name'); #56 + assert_equal(0, rr.ttl, 'rr_del - right ttl'); #57 + assert_equal('NONE', rr.klass.string, 'rr_del - right class'); #58 + assert_equal(type, rr.type, 'rr_del - right type'); #59 + assert_equal(rdata, rr.rdata, 'rr_del - right data'); #60 + + rr = nil + + data = update.encode + header = Header.new_from_data(data) + assert(header.opcode == OpCode.Update) + new_update = Message.decode(data) + assert(new_update.header.opcode == OpCode.Update) + + # ------------------------------------------------------------------------------ + # Make sure RRs in an update packet have the same class as the zone, unless + # the class is NONE or ANY. + # ------------------------------------------------------------------------------ + + update = Dnsruby::Update.new(zone, klass); + assert(update, 'packet created'); #61 + + + update.present(name, type, rdata); + + update.present(name, type, rdata); + + update.present(name, type); + + update.absent(name, type); + + pre = update.pre; + + assert_equal(3, pre.size, 'pushed inserted correctly'); #62 + assert_equal(klass, pre[0].klass.string, 'first class right'); #63 + assert_equal(Classes.ANY, pre[1].klass, 'third class right'); #65 + assert_equal(Classes.NONE, pre[2].klass, 'forth class right'); #66 + end + + def test_absent_cname + update = Update.new() + rr = update.absent("target_name", "CNAME") + assert(rr, 'nxdomain() returned RR'); + assert_equal(rr.name.to_s, "target_name", 'nxdomain - right name'); + assert_equal(rr.ttl, 0, 'nxdomain - right ttl'); + assert_equal(rr.klass.string, 'NONE', 'nxdomain - right class'); + assert_equal(rr.type.string, 'CNAME', 'nxdomain - right type'); + assert(is_empty(rr.rdata), 'nxdomain - data empty'); + + encoded_msg = Message.decode(update.encode) + rr = encoded_msg.answer.first + assert(rr, 'nxdomain() returned RR') + assert_equal(rr.name.to_s, "target_name", 'nxdomain - right name') + assert_equal(rr.ttl, 0, 'nxdomain - right ttl') + assert_equal(rr.klass.string, 'NONE', 'nxdomain - right class') + assert_equal(rr.type.string, 'CNAME', 'nxdomain - right type') + # assert_nil(rr.rdata, 'nxdomain - data empty') + assert(is_empty(rr.rdata), 'nxdomain - data empty') + end + + def test_delete_specific_cname + update = Update.new 'example.com' + update.delete 'test.example.com', 'CNAME', 'target.example.com' + + encoded_msg = Message.decode update.encode + rr = encoded_msg.authority.first + assert_equal rr.name.to_s, 'test.example.com', 'delete_cname - right name' + assert_equal 0, rr.ttl, 'delete_cname - right ttl' + assert_equal 'NONE', rr.klass.string, 'delete_cname - right class' + assert_equal 'CNAME', rr.type.string, 'delete_cname - right type' + assert_equal 'target.example.com', rr.rdata.to_s, 'delete_cname - right target' + end + + def test_delete_cname + update = Update.new 'example.com' + update.delete 'test.example.com', 'CNAME' + + encoded_msg = Message.decode update.encode + rr = encoded_msg.authority.first + assert_equal rr.name.to_s, 'test.example.com', 'delete_cname - right name' + assert_equal 0, rr.ttl, 'delete_cname - right ttl' + assert_equal 'ANY', rr.klass.string, 'delete_cname - right class' + assert_equal 'CNAME', rr.type.string, 'delete_cname - right type' + assert(is_empty(rr.rdata), 'delete_cname - right rdata') + end + + def test_txt + update = Update.new() + update.add("target_name", "TXT", 100, "test signed update") + assert(update.to_s.index("test signed update")) + end + + def test_delete_txt + update = Update.new 'example.com' + update.delete 'test.example.com', 'TXT', 'foo bar' + + encoded_msg = Message.decode update.encode + rr = encoded_msg.authority.first + assert_equal rr.name.to_s, 'test.example.com', 'delete_txt - right name' + assert_equal 0, rr.ttl, 'delete_txt - right ttl' + assert_equal 'TXT', rr.type.string, 'delete_txt - right type' + assert_equal ['foo bar'], rr.rdata, 'delete_txt - right rdata' + end + + def test_array + update = Update.new + update.add("target_name", "TXT", 100, ['"test signed update"', 'item#2']) + assert(update.to_s.index("item")) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_validator.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_validator.rb new file mode 100644 index 000000000000..21f2d404ce3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_validator.rb @@ -0,0 +1,75 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class TestValidator < Minitest::Test + + include Dnsruby + + def test_validation +# Dnsruby::TheLog.level = Logger::DEBUG + Dnsruby::Dnssec.clear_trusted_keys + Dnsruby::Dnssec.clear_trust_anchors + res = Dnsruby::Resolver.new("dnssec.nominet.org.uk") + res.dnssec=true + res.do_validation = true + Dnsruby::Dnssec.do_validation_with_recursor(false) + Dnsruby::Dnssec.default_resolver=(res) # This is a closed zone (not reachable by recursion) + + trusted_key = Dnsruby::RR.create({:name => "uk-dnssec.nic.uk.", + :type => Dnsruby::Types.DNSKEY, + :flags => RR::IN::DNSKEY::SEP_KEY | RR::IN::DNSKEY::ZONE_KEY, + :key=> "AQPJO6LjrCHhzSF9PIVV7YoQ8iE31FXvghx+14E+jsv4uWJR9jLrxMYm sFOGAKWhiis832ISbPTYtF8sxbNVEotgf9eePruAFPIg6ZixG4yMO9XG LXmcKTQ/cVudqkU00V7M0cUzsYrhc4gPH/NKfQJBC5dbBkbIXJkksPLv Fe8lReKYqocYP6Bng1eBTtkA+N+6mSXzCwSApbNysFnm6yfQwtKlr75p m+pd0/Um+uBkR4nJQGYNt0mPuw4QVBu1TfF5mQYIFoDYASLiDQpvNRN3 US0U5DEG9mARulKSSw448urHvOBwT9Gx5qF2NE4H9ySjOdftjpj62kjb Lmc8/v+z" + }) + ret = Dnsruby::Dnssec.add_trust_anchor(trusted_key) + + r = res.query("aaa.bigzone.uk-dnssec.nic.uk", Dnsruby::Types.A) + assert(r.security_level.code == Message::SecurityLevel::SECURE, "Level = #{r.security_level.string}") + ret = Dnsruby::Dnssec.validate(r) + assert(ret, "Dnssec validation failed") + + # @TODO@ Test other validation policies!! + end + + def test_resolver_cd_validation_fails + # Should be able to check Nominet test-zone here - no keys point to it + res = Resolver.new + res.dnssec=true + r = res.query("uk-dnssec.nic.uk", Dnsruby::Types.A) + assert(r.security_level = Message::SecurityLevel::INSECURE) + end + + def test_eventtype_api + # @TODO@ TEST THE Resolver::EventType interface! + print "Test EventType API!\n" + end + + def test_config_api + # @TODO@ Test the different configuration options for the validator, + # and their defaults + # + # Should be able to set : + # o Whether or not validation happens + # o The async API queue tuples etc. + # o Whether to use authoritative nameservers for validation + # o Whether to use authoritative nameservers generally + # + print "Test validation configuration options!\n" + end + + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_verifier.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_verifier.rb new file mode 100644 index 000000000000..67c80d0dbc0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_verifier.rb @@ -0,0 +1,380 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +class VerifierTest < Minitest::Test + + def test_sha2 + # Check if OpenSSL supports SHA2 + have_sha2 = false + begin + OpenSSL::Digest::SHA256.new + have_sha2 = true + rescue Exception + end + if (have_sha2) + # print "OpenSSL supports SHA2\n" + do_test_sha256 + do_test_sha512 + do_test_nsec + do_test_ecdsa256 + else + print "OpenSSL doesn't support SHA2 - disabling SHA256/SHA512 tests. DNSSEC validation will not work with these type of signatures.\n" + end + end + + def do_test_sha256 + key256 = Dnsruby::RR.create("example.net. 3600 IN DNSKEY (256 3 8 AwEAAcFcGsaxxdgiuuGmCkVI + my4h99CqT7jwY3pexPGcnUFtR2Fh36BponcwtkZ4cAgtvd4Qs8P + kxUdp6p/DlUmObdk= );{id = 9033 (zsk), size = 512b}") + a = Dnsruby::RR.create("www.example.net. 3600 IN A 192.0.2.91") + sig = Dnsruby::RR.create("www.example.net. 3600 IN RRSIG (A 8 3 3600 20300101000000 + 20000101000000 9033 example.net. kRCOH6u7l0QGy9qpC9 + l1sLncJcOKFLJ7GhiUOibu4teYp5VE9RncriShZNz85mwlMgNEa + cFYK/lPtPiVYP4bwg==) ;{id = 9033}") + rrset = Dnsruby::RRSet.new(a) + rrset.add(sig) + verifier = Dnsruby::SingleVerifier.new(nil) + verifier.verify_rrset(rrset, key256) + end + + def do_test_sha512 + key512 = Dnsruby::RR.create("example.net. 3600 IN DNSKEY (256 3 10 AwEAAdHoNTOW+et86KuJOWRD + p1pndvwb6Y83nSVXXyLA3DLroROUkN6X0O6pnWnjJQujX/AyhqFD + xj13tOnD9u/1kTg7cV6rklMrZDtJCQ5PCl/D7QNPsgVsMu1J2Q8g + pMpztNFLpPBz1bWXjDtaR7ZQBlZ3PFY12ZTSncorffcGmhOL + );{id = 3740 (zsk), size = 1024b}") + a = Dnsruby::RR.create("www.example.net. 3600 IN A 192.0.2.91") + sig = Dnsruby::RR.create("www.example.net. 3600 IN RRSIG (A 10 3 3600 20300101000000 + 20000101000000 3740 example.net. tsb4wnjRUDnB1BUi+t + 6TMTXThjVnG+eCkWqjvvjhzQL1d0YRoOe0CbxrVDYd0xDtsuJRa + eUw1ep94PzEWzr0iGYgZBWm/zpq+9fOuagYJRfDqfReKBzMweOL + DiNa8iP5g9vMhpuv6OPlvpXwm9Sa9ZXIbNl1MBGk0fthPgxdDLw + =);{id = 3740}") + rrset = Dnsruby::RRSet.new(a) + rrset.add(sig) + verifier = Dnsruby::SingleVerifier.new(nil) + verifier.verify_rrset(rrset, key512) + end + + def do_test_ecdsa256 + Time.stub :now, Time.parse("Wed, 01 Jul 2020 11:54:04 EEST +03:00") do + ecdsa256 = Dnsruby::RR.create("rainiselevi.ee. 3600 IN DNSKEY 256 3 ECDSAP256SHA256 ( oJMRESz5E + 4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA== ) ; key_tag=34505") + a = Dnsruby::RR.create("rainiselevi.ee. 3600 IN A 35.228.30.236") + sig = Dnsruby::RR.create("rainiselevi.ee. 3600 IN RRSIG A ECDSAP256SHA256 2 300 20200702092142 ( 20200630072142 34505 + rainiselevi.ee. kf3Fl1mSIso2kB12QOr+aNWYTUXtx9nRC/v+Kn1454u9I/YAFQd6nJQAsFd9vCTsZY+nL4wpj5pV+EsAMIxccA== )") + rrset = Dnsruby::RRSet.new(a) + rrset.add(sig) + verifier = Dnsruby::SingleVerifier.new(nil) + assert(verifier.verify_rrset(rrset, ecdsa256)) + end + end + + def test_se_query + # Run some queries on the .se zone + Dnsruby::Dnssec.clear_trusted_keys + Dnsruby::Dnssec.clear_trust_anchors + res = Dnsruby::Resolver.new(Dnsruby::Resolv.getaddress("a.ns.se")) + res.dnssec = true + r = res.query("se", Dnsruby::Types.ANY) + # See comment below + Dnsruby::Dnssec.anchor_verifier.add_trusted_key(r.answer.rrset("se", 'DNSKEY')) + nss = r.answer.rrset("se", 'NS') + ret = Dnsruby::Dnssec.verify_rrset(nss) + assert(ret, "Dnssec verification failed") + end + + def test_verify_message + Dnsruby::Dnssec.clear_trusted_keys + Dnsruby::Dnssec.clear_trust_anchors + res = Dnsruby::Resolver.new(Dnsruby::Resolv.getaddress("a.ns.se")) + res.udp_size = 5000 + r = res.query("se", Dnsruby::Types.DNSKEY) + # This shouldn't be in the code - but the key is rotated by the .se registry + # so we can't keep up with it in the test code. + # Oh, for a signed root... + # print "Adding keys : #{r.answer.rrset("se", 'DNSKEY')}\n" + Dnsruby::Dnssec.anchor_verifier.add_trusted_key(r.answer.rrset("se", 'DNSKEY')) + ret = Dnsruby::Dnssec.verify(r) + assert(ret, "Dnssec message verification failed : #{ret}") + end + + def test_verify_message_fails + Dnsruby::Dnssec.clear_trusted_keys + Dnsruby::Dnssec.clear_trust_anchors + res = Dnsruby::Resolver.new("a.ns.se") + r = res.query("se", Dnsruby::Types.ANY) + # Haven't configured key for this, so should fail + begin + ret = Dnsruby::Dnssec.verify(r) + fail("Message shouldn't have verified") + rescue (Dnsruby::VerifyError) + end + # assert(!ret, "Dnssec message verification failed") + end + + def test_trusted_key + Dnsruby::Dnssec.clear_trusted_keys + Dnsruby::Dnssec.clear_trust_anchors + res = Dnsruby::Resolver.new("dnssec.nominet.org.uk") + res.dnssec = true + bad_key = Dnsruby::RR.create( + "uk-dnssec.nic.uk. 86400 IN DNSKEY 257 3 5 "+ + "AwEAAbhThsjZqxZDyZLie1BYP+R/G1YRhmuIFCbmuQiF4NB86gpW8EVR l2s+gvNuQw6yh2YdDdyJBselE4znRP1XQbpOTC5UO5CDwge9NYja/jrX lvrX2N048vhIG8uk8yVxJDosxf6nmptsJBp3GAjF25soJs07Bailcr+5 vdZ7GibH") + ret = Dnsruby::Dnssec.add_trust_anchor(bad_key) + r = res.query("uk-dnssec.nic.uk", Dnsruby::Types.DNSKEY) + + begin + ret = Dnsruby::Dnssec.verify(r) + fail("Dnssec trusted key message verification should have failed with bad key") + rescue (Dnsruby::VerifyError) + # assert(!ret, "Dnssec trusted key message verification should have failed with bad key") + end + trusted_key = Dnsruby::RR.create({:name => "uk-dnssec.nic.uk.", + :type => Dnsruby::Types.DNSKEY, + :flags => 257, + :protocol => 3, + :algorithm => 5, + :key=> "AQPJO6LjrCHhzSF9PIVV7YoQ8iE31FXvghx+14E+jsv4uWJR9jLrxMYm sFOGAKWhiis832ISbPTYtF8sxbNVEotgf9eePruAFPIg6ZixG4yMO9XG LXmcKTQ/cVudqkU00V7M0cUzsYrhc4gPH/NKfQJBC5dbBkbIXJkksPLv Fe8lReKYqocYP6Bng1eBTtkA+N+6mSXzCwSApbNysFnm6yfQwtKlr75p m+pd0/Um+uBkR4nJQGYNt0mPuw4QVBu1TfF5mQYIFoDYASLiDQpvNRN3 US0U5DEG9mARulKSSw448urHvOBwT9Gx5qF2NE4H9ySjOdftjpj62kjb Lmc8/v+z" + }) + ret = Dnsruby::Dnssec.add_trust_anchor(trusted_key) + ret = Dnsruby::Dnssec.verify(r) + assert(ret, "Dnssec trusted key message verification failed") + + # # Check that keys have been added to trusted key cache + # ret = Dnsruby::Dnssec.verify(r) + # assert(ret, "Dnssec trusted key cache failed") + end + + def test_expired_keys + # Add some keys with an expiration of 1 second. + # Then wait a second or two, and check they are not available any more. + Dnsruby::Dnssec.clear_trusted_keys + Dnsruby::Dnssec.clear_trust_anchors + assert(Dnsruby::Dnssec.anchor_verifier.trusted_keys.length==0) + trusted_key = Dnsruby::RR.create({:name => "uk-dnssec.nic.uk.", + :type => Dnsruby::Types.DNSKEY, + :key=> "AQPJO6LjrCHhzSF9PIVV7YoQ8iE31FXvghx+14E+jsv4uWJR9jLrxMYm sFOGAKWhiis832ISbPTYtF8sxbNVEotgf9eePruAFPIg6ZixG4yMO9XG LXmcKTQ/cVudqkU00V7M0cUzsYrhc4gPH/NKfQJBC5dbBkbIXJkksPLv Fe8lReKYqocYP6Bng1eBTtkA+N+6mSXzCwSApbNysFnm6yfQwtKlr75p m+pd0/Um+uBkR4nJQGYNt0mPuw4QVBu1TfF5mQYIFoDYASLiDQpvNRN3 US0U5DEG9mARulKSSw448urHvOBwT9Gx5qF2NE4H9ySjOdftjpj62kjb Lmc8/v+z" + }) + Dnsruby::Dnssec.add_trust_anchor_with_expiration(trusted_key, Time.now.to_i + 1) + assert(Dnsruby::Dnssec.trust_anchors.length==1) + sleep(2) + assert(Dnsruby::Dnssec.trust_anchors.length==0) + end + + def test_tcp + # These queries work: + # dig @194.0.1.13 isoc.lu dnskey + # dig @194.0.1.13 isoc.lu dnskey +dnssec + # dig @194.0.1.13 isoc.lu dnskey +tcp + + # This one does not + # + # dig @194.0.1.13 isoc.lu dnskey +dnssec +tcp + r = Dnsruby::SingleResolver.new()# "194.0.1.13") + r.dnssec = true + r.use_tcp = true + ret = r.query("isoc.lu", Dnsruby::Types.DNSKEY) + # print ret.to_s+"\n" + + r = Dnsruby::SingleResolver.new("194.0.1.13") + r.dnssec = true + # r.use_tcp = true + ret = r.query("isoc.lu", Dnsruby::Types.DNSKEY) + # print ret.to_s+"\n" + + r.use_tcp = true + r.dnssec = false + ret = r.query("isoc.lu", Dnsruby::Types.DNSKEY) + # print ret.to_s+"\n" + + r.dnssec = true + begin + ret = r.query("isoc.lu", Dnsruby::Types.DNSKEY) + rescue (Dnsruby::OtherResolvError) + end + + end + + def test_sendraw + Dnsruby::Dnssec.clear_trusted_keys + Dnsruby::Dnssec.clear_trust_anchors + res = Dnsruby::Resolver.new("a.ns.se") + res.dnssec = true + message = Dnsruby::Message.new("se", Dnsruby::Types.ANY) + begin + res.send_message(message) + fail() + rescue (Exception) + end + + message.send_raw = true + res.send_message(message) + end + + def test_dsa + # Let's check sources.org for DSA keys + Dnsruby::Dnssec.clear_trusted_keys + Dnsruby::Dnssec.clear_trust_anchors + res = Dnsruby::Recursor.new() + ret = res.query("sources.org", Dnsruby::Types.DNSKEY) + keys = ret.rrset("sources.org", "DNSKEY") + assert(keys && keys.length > 0) + dsa = nil + keys.each {|key| + if (key.algorithm == Dnsruby::Algorithms.DSA) + dsa = key + end + } + assert(dsa) + # Now do something with it + + response = res.query("sources.org", Dnsruby::Types.ANY) + verified = 0 + # response.each_section {|sec| + response.answer.rrsets.each {|rs| + if (rs.sigs()[0].algorithm == Dnsruby::Algorithms.DSA && + rs.sigs()[0].key_tag == dsa.key_tag) + ret = Dnsruby::Dnssec.verify_rrset(rs, keys) + assert(ret) + verified+=1 + end + } + # } + assert(verified > 0) + end + + def do_test_nsec + begin + begin + require 'rubygems' + rescue LoadError + end + require 'timecop' + rescue LoadError + return + end + Timecop.travel(2010, 03, 24, 0, 0, 0) { + key = Dnsruby::RR.create("in-addr-servers.arpa. 3600 IN DNSKEY 256 3 8 AwEAAcoEdjN6PM57REYLqLCBNfjCbQQU8pSNOz/kRwP75YQzidnaQpCO4+rjOYSAPH5lAjtT+AxuUB33DkOhQHPDSO87JLt1pm65eNNsz10COEExfuokM98qiURN76kv3N1n/gRG2693tpkmVdvSTRCbReyq6BlzKuYABGLD3V3MUB4j ;{id = 12033 (zsk), size = 1024b}") + verifier = Dnsruby::SingleVerifier.new(Dnsruby::SingleVerifier::VerifierType::ANCHOR) + key_rrset = Dnsruby::RRSet.new(key) + verifier.add_trusted_key(key_rrset); + sig = Dnsruby::RR.create("b.in-addr-servers.arpa. 3600 IN RRSIG NSEC 8 3 3600 20100325113758 20100318052509 12033 in-addr-servers.arpa. uy5aUIhq3eKc24gcoyBoLYaR6kKtG957zpR0G2pf1XPCO2ESzwdIkXK0/XeUkRMmPRnKfGOhwNYIBK26kX3PYxaIPsDZVc5ZAC3uc/+EpCosMn3FJQQDiNx/gznEQZk0JRxTUMMMucCNW2HVU18NVtTQhT0MaAsLyG8OduWuMCI= ;{id = 12033}") + nsec = Dnsruby::RR.create("B.in-addr-servers.arpa. 3600 IN NSEC C.in-addr-servers.arpa. A AAAA RRSIG NSEC") + rrset = Dnsruby::RRSet.new(nsec) + rrset.add(sig) + verifier.verify_rrset(rrset, key_rrset) + } + end + + def test_naptr + begin + begin + require 'rubygems' + rescue LoadError + end + require 'timecop' + rescue LoadError + return + end + Timecop.travel(2010, 03, 24, 0, 0, 0) { + key = Dnsruby::RR.create("all.rr.org. 2678400 IN DNSKEY 256 3 7 AwEAAcW1ZJxnMxZAAfsQ0JJQPHOlVNeGzs/AWVSGXiIYsg9UUSsvRTiK/Wy2wD7XC6osZpgy4Blhm846wktPbCwHpkxxbjxpaMABjbhH14gRol1Gpzf+gOr8vpdii8c2y6VMN9kIXZyaZUWcshLii19ysSGlqY1a1g2XZjogFtvzDHjH ;{id = 43068 (zsk), size = 1024b}") + verifier = Dnsruby::SingleVerifier.new(Dnsruby::SingleVerifier::VerifierType::ANCHOR) + key_rrset = Dnsruby::RRSet.new(key) + verifier.add_trusted_key(key_rrset); + sig = Dnsruby::RR.create("all.rr.org. 86400 IN RRSIG NAPTR 7 3 86400 20100727230632 20090919145743 43068 all.rr.org. RpyBsaLiaZ/OqX5twE0SoMhlVZVAHuAlS4FZqmnAg+udF3EwrY6N/POt3nPCtgwf7tczaxrMK6zWkOldfv37iyIgXIxDQvhoCb7IoffI5TsBL5CWl5n7pg8BNAMpLxd8HIu1DShWvlplpFbBWIaC6tZCR6ft/iP+uhU7dYcqTHg= ;{id = 43068}") + naptr = Dnsruby::RR.create('all.rr.org. 86400 IN NAPTR 100 10 "" "" "!^urn:cid:.+@([^\\\\.]+\\\\.)(.*)$!\\\\2!i" .') + rrset = Dnsruby::RRSet.new(naptr) + rrset.add(sig) + verifier.verify_rrset(rrset, key_rrset) + } + end + + def test_txt_rr + begin + begin + require 'rubygems' + rescue LoadError + end + require 'timecop' + rescue LoadError + return + end + Timecop.travel(2010, 03, 24, 0, 0, 0) { + txt = 'txt2.all.rr.org. 86400 IN TXT "Net-DNS\\\\; complicated $tuff" "sort of \\" text\\\\; and binary \\000 data"' + rr = Dnsruby::RR.create(txt) + assert(rr.to_s.index('"Net-DNS\\\\; complicated $tuff" "sort of \\" text\\\\; and binary \\000 data"'), rr.to_s) + + key = Dnsruby::RR.create("all.rr.org. 2678400 IN DNSKEY 256 3 7 AwEAAcW1ZJxnMxZAAfsQ0JJQPHOlVNeGzs/AWVSGXiIYsg9UUSsvRTiK/Wy2wD7XC6osZpgy4Blhm846wktPbCwHpkxxbjxpaMABjbhH14gRol1Gpzf+gOr8vpdii8c2y6VMN9kIXZyaZUWcshLii19ysSGlqY1a1g2XZjogFtvzDHjH ;{id = 43068 (zsk), size = 1024b}") + verifier = Dnsruby::SingleVerifier.new(Dnsruby::SingleVerifier::VerifierType::ANCHOR) + key_rrset = Dnsruby::RRSet.new(key) + verifier.add_trusted_key(key_rrset); + sig = Dnsruby::RR.create("txt2.all.rr.org. 86400 IN RRSIG TXT 7 4 86400 20100813002344 20091006093439 43068 all.rr.org. LJv/ccd2JHyT6TK74Dtu/zH4jdeR4ScyrB8cGwaqeCjwxG4H5FY88Sk/U0JUQyxnUificnyZQwcyXAItn7QjBMHQO4ftVxl/gDCyt6MEXy9JKK/rfvXcAceo5prmlVrb8WxT5YnvPha3CxjK7f+YIs5cqppRVaZTQTxsAsJyJ20= ;{id = 43068}") + txt = Dnsruby::RR.create('txt2.all.rr.org. 86400 IN TXT "Net-DNS\\\\; complicated $tuff" "sort of \\" text\\\\; and binary \\000 data"') + rrset = Dnsruby::RRSet.new(txt) + rrset.add(sig) + verifier.verify_rrset(rrset, key_rrset) + } + end + +# def test_txt_zonefile +# reader = Dnsruby::ZoneReader.new("cacert.org.") +# zone = reader.process_file("cacert.txt") +# reader2 = Dnsruby::ZoneReader.new("cacert.org.") +# zone2 = reader.process_file("cacert.signed.txt") +# assert(zone[1].to_s.index("DAQAB\"")) +# assert(zone2[1].to_s.index("DAQAB\"")) +# +# assert(zone[1].to_s == zone2[1].to_s) +# end +# + # def test_txt_from_zone + # reader = Dnsruby::ZoneReader.new("all.rr.org.") + # zone = reader.process_file("zone.txt") + # rrset = Dnsruby::RRSet.new + # key_rrset = Dnsruby::RRSet.new + # zone.each {|rr| + # if ( (rr.type == Dnsruby::Types.TXT) || ((rr.type == Dnsruby::Types.RRSIG) && (rr.type_covered == Dnsruby::Types.TXT))) + # rrset.add(rr) + # end + # if (rr.type == Dnsruby::Types.DNSKEY) + # key_rrset.add(rr) + # end + # } + # verifier = Dnsruby::SingleVerifier.new(Dnsruby::SingleVerifier::VerifierType::ANCHOR) + # verifier.verify_rrset(rrset, key_rrset) + # end + + # def test_naptr_from_zone + # reader = Dnsruby::ZoneReader.new("all.rr.org.") + # zone = reader.process_file("zone.txt") + # rrset = Dnsruby::RRSet.new + # key_rrset = Dnsruby::RRSet.new + # zone.each {|rr| + # if ((rr.type == Dnsruby::Types.NAPTR) || ((rr.type == Dnsruby::Types.RRSIG) && (rr.type_covered == Dnsruby::Types.NAPTR))) + # rrset.add(rr) + # end + # if (rr.type == Dnsruby::Types.DNSKEY) + # key_rrset.add(rr) + # end + # } + # verifier = Dnsruby::SingleVerifier.new(Dnsruby::SingleVerifier::VerifierType::ANCHOR) + # verifier.verify_rrset(rrset, key_rrset) + # end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_zone_reader.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_zone_reader.rb new file mode 100644 index 000000000000..8a5ac1934eac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/tc_zone_reader.rb @@ -0,0 +1,75 @@ + +require_relative 'spec_helper' + +class ZoneReaderTest < Minitest::Test + + include Dnsruby + + def setup + @zone_data = <<ZONEDATA +$TTL 3600 +; Comment + ; Comment with whitespace in front +@ IN SOA ns1.example.com. hostmaster.example.com. ( + 1993112101 + 10800 + 3600 + 604800 + 7200 + ) + IN NS ns1.example.com. + IN NS ns2.example.com. + IN MX 10 mx.example.com. + IN TXT "v=spf1 mx ~all" +www IN A 192.0.2.10 + IN AAAA 2001:DB8::10 +ftp.example.com. IN CNAME www +db IN CNAME www.example.com. +foo.example.com. IN CAA 0 issue "ca.example.net; account=230123" +ZONEDATA + + @zone_file = Tempfile.new('zonefile') + @zone_file << @zone_data + @zone_file.flush + @zone_file.rewind + @reader = Dnsruby::ZoneReader.new("example.com.") + end + + def teardown + @zone_file.close + @zone_file.unlink + end + + def check_zone_data_is_valid(zone) + assert_equal(1993112101, zone[0].serial) + assert_equal("ns1.example.com.", zone[1].rdata) + assert_equal("ns2.example.com.", zone[2].rdata) + assert_equal("10 mx.example.com.", zone[3].rdata) + assert_equal("\"v=spf1 mx ~all\"", zone[4].rdata) + assert_equal("192.0.2.10", zone[5].rdata) + assert_equal("2001:DB8::10", zone[6].rdata) + assert_equal("www.example.com.", zone[7].rdata) + assert_equal("www.example.com.", zone[8].rdata) + assert_equal('0 issue "ca.example.net; account=230123"', zone[9].rdata) + end + + def test_process_file_with_filename + zone = @reader.process_file(@zone_file.path) + check_zone_data_is_valid(zone) + end + + def test_process_file_with_file_object + zone = @reader.process_file(@zone_file) + check_zone_data_is_valid(zone) + assert_equal(false, @zone_file.closed?) + end + + def test_process_file_with_stringio_object + stringio = StringIO.new(@zone_data) + zone = @reader.process_file(stringio) + check_zone_data_is_valid(zone) + assert_equal(false, stringio.closed?) + stringio.close + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/test_dnsserver.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/test_dnsserver.rb new file mode 100644 index 000000000000..ba4cd443ea24 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/test_dnsserver.rb @@ -0,0 +1,322 @@ +# -- +# Copyright 2015 Verisign +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require 'rubydns' +require 'nio' +require 'socket' +require 'thread' + +module PipelineTest + class BinaryStringIO < StringIO + def initialize + super + + set_encoding("BINARY") + end + end + + def self.read_chunk(socket) + # The data buffer: + buffer = BinaryStringIO.new + + # First we need to read in the length of the packet + while buffer.size < 2 + r = socket.read(1) + return "" if r.nil? + buffer.write r + end + + # Read in the length, the first two bytes: + length = buffer.string.byteslice(0, 2).unpack('n')[0] + + # Read data until we have the amount specified: + while (buffer.size - 2) < length + required = (2 + length) - buffer.size + + # Read precisely the required amount: + r = socket.read(required) + return "" if r.nil? + buffer.write r + end + + return buffer.string.byteslice(2, length) + end + +end + +class TcpPipelineHandler < Async::DNS::GenericHandler + + def initialize(server, host, port) + super(server) + + @socket = TCPServer.new(host, port) + @selector = NIO::Selector.new + monitor = @selector.register(@socket, :r) + monitor.value = proc { accept } + end + + def accept + handle_connection(@socket.accept) + end + + def handle_connection(socket) + @logger.debug "New connection" + @logger.debug "Add socket to @selector" + + monitor = @selector.register(socket, :r) + monitor.value = proc { process_socket(socket) } + end + + def process_socket(socket) + @logger.debug "Processing socket" + _, _remote_port, remote_host = socket.peeraddr + options = { peer: remote_host } + + #we read all data until timeout + input_data = PipelineTest.read_chunk(socket) + + if input_data == "" + remove(socket) + return + end + + response = process_query(input_data, options) + Async::DNS::StreamTransport.write_message(socket, response) + rescue EOFError + _, port, host = socket.peeraddr + @logger.debug("*** #{host}:#{port} disconnected") + + remove(socket) + end + + def remove(socket, update_connections=true) + @logger.debug("Removing socket from selector") + socket.close rescue nil + @selector.deregister(socket) rescue nil + end + + def run(reactor: Async::Task.current.reactor) + Thread.new() do + while true + @selector.select() do |monitor| + reactor.async(@socket) do |socket| + monitor.value.call(monitor) + end + end + end + end + end +end + +class SimpleTimers + def initialize + @events = {} + end + + def empty? + @events.empty? + end + + def after(seconds, &block) + eventTime = Time.now + seconds + @events[eventTime] ||= [] + @events[eventTime] << block + end + + def fire + now = Time.now + + events = @events.select { |key, value| key <= now } + + (events || []).each do |key, blocks| + blocks.each do |block| + block.call + end + @events.delete(key) + end + end + + def wait_interval + next_event = @events.keys.min + next_event.nil? ? nil : next_event - Time.now + end +end + +# NioTcpPipeliningHandler accepts new tcp connection and reads data from the sockets until +# either the client closes the connection, @max_requests_per_connection is reached +# or @timeout is attained. + +class NioTcpPipeliningHandler < Async::DNS::GenericHandler + + DEFAULT_MAX_REQUESTS = 4 + DEFAULT_TIMEOUT = 3 + # TODO Add timeout + def initialize(server, host, port, max_requests = DEFAULT_MAX_REQUESTS, timeout = DEFAULT_TIMEOUT) + @socket = TCPServer.new(host, port) + super(server, @socket) + @max_requests_per_connection = max_requests + @timeout = timeout + + @count = {} + + @server.class.stats.connections = @count.keys.count + + @timers = SimpleTimers.new + + @selector = NIO::Selector.new + monitor = @selector.register(@socket, :r) + monitor.value = proc { accept } + + end + + def run(reactor: Async::Task.current.reactor) + @selector_threead = create_selector_thread + end + + def accept + handle_connection(@socket.accept) + end + + def process_socket(socket) + @logger.debug "Processing socket" + _, _remote_port, remote_host = socket.peeraddr + options = { peer: remote_host } + + new_connection = @count[socket].nil? + @count[socket] ||= 0 + @count[socket] += 1 + @server.class.stats.connection_accept(new_connection, @count.keys.count) + + #we read all data until timeout + input_data = PipelineTest.read_chunk(socket) + + if @count[socket] <= @max_requests_per_connection + response = process_query(input_data, options) + Async::DNS::StreamTransport.write_message(socket, response) + end + +=begin + if @count[socket] >= @max_requests_per_connection + _, port, host = socket.peeraddr + @logger.debug("*** max request for #{host}:#{port}") + remove(socket) + end +=end + rescue EOFError + _, port, host = socket.peeraddr + @logger.debug("*** #{host}:#{port} disconnected") + + remove(socket) + end + + def remove(socket, update_connections=true) + @logger.debug("Removing socket from selector") + socket.close rescue nil + @selector.deregister(socket) rescue nil + socket_count = @count.delete(socket) + @server.class.stats.connections = @count.keys.count if update_connections + socket_count + end + + def create_selector_thread + Thread.new do + loop do + begin + @timers.fire + intervals = [@timers.wait_interval || 0.1, 0.1] + + @selector.select(intervals.min > 0 ? intervals.min : 0.1) do + |monitor| monitor.value.call(monitor) + end + + @logger.debug "Woke up" + break if @selector.closed? + rescue Exception => e + @logger.debug "Exception #{e}" + @logger.debug "Backtrace #{e.backtrace}" + end + end + end + end + + def handle_connection(socket) + @logger.debug "New connection" + @logger.debug "Add socket to @selector" + + monitor = @selector.register(socket, :r) + monitor.value = proc { process_socket(socket) } + + @logger.debug "Add socket timer of #{@timeout}" + @timers.after(@timeout) do + @logger.debug "Timeout fired for socket #{socket}" + count = remove(socket, false) + unless count.nil? + @logger.debug "Timeout for socket #{socket}" + @logger.debug "Increasing timeout count" + @server.class.stats.connection_timeout(@count.keys.count) + end + end + end +end + +# Stats collects statistics from our tcp handler +class Stats + def initialize() + @mutex = Mutex.new + @accept_count = 0 + @timeout_count = 0 + @max_count = 0 + @connections = 0 + end + + def increment_max; @mutex.synchronize { @max_count += 1 } end + def increment_timeout; @mutex.synchronize { @timeout_count += 1 } end + def increment_connection; @mutex.synchronize { @accept_count += 1 } end + + def connection_timeout(active_connections) + @mutex.synchronize do + @timeout_count += 1 + @connections = active_connections + end + end + + def connection_accept(new_connection, active_connections) + @mutex.synchronize { + @connections = active_connections + @accept_count += 1 if new_connection + } + end + + def connections=(active_connections) + @mutex.synchronize { @connections = active_connections } + end + + def connections + @mutex.synchronize { @connections } + end + + def accept_count + @mutex.synchronize { @accept_count } + end + + def timeout_count + @mutex.synchronize { @timeout_count } + end + + def max_count + @mutex.synchronize { @max_count } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/test_utils.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/test_utils.rb new file mode 100644 index 000000000000..edc9f82148f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/test_utils.rb @@ -0,0 +1,49 @@ +require_relative 'spec_helper' + +# Use this in tests in the tests directory with: +# require_relative 'test_utils' +# include TestUtils + +module Dnsruby + module TestUtils + + module_function + + # Asserts that all exceptions whose type are the specified exception class + # or one of its subclasses are *not* raised. + # + # If any other kind of exception is raised, the test throws an exception + # (rather than failing). + # + # The test passes if and only if no exceptions are raised. + def assert_not_raised(exception_class, failure_message = nil) + begin + yield + rescue => e + if e.is_a?(exception_class) + flunk(failure_message || "An exception was not expected but was raised: #{e}") + else + raise e + end + end + end + +=begin + # This should result in a test failure: + def test_target_exception + assert_not_raised(ArgumentError, 'ArgumentError') { raise ArgumentError.new } + end + + # This should result in a test error: + def test_other_exception + assert_not_raised(ArgumentError, 'RuntimeError') { raise RuntimeError.new } + end + + # This should result in a passed test: + def test_no_exception + assert_not_raised(ArgumentError, 'No Error') { } + end +=end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/ts_dnsruby.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/ts_dnsruby.rb new file mode 100644 index 000000000000..c05a4ed2821d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/ts_dnsruby.rb @@ -0,0 +1,18 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative "ts_online.rb" +require_relative "ts_offline.rb" diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/ts_offline.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/ts_offline.rb new file mode 100644 index 000000000000..5640973d0c2a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/ts_offline.rb @@ -0,0 +1,83 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' + +Dnsruby.log.level = Logger::FATAL + +# We'll prepend 'tc_' and append '.rb' to these: +TESTS = %w( + dnskey + escapedchars + gpos + hash + header + ipseckey + message + misc + name + naptr + nsec + nsec3 + nsec3param + nxt + tlsa + packet + packet_unique_push + ptrin + question + res_config + res_file + res_opt + rr + rr-txt + rr-unknown + rrset + rrsig + tkey + update + zone_reader +) + +# Omitted: +# +# tc_res_env + + +TESTS.each { |test| require_relative "tc_#{test}.rb" } + + +def have_open_ssl? + have_open_ssl = true + begin + require "openssl" + OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, "key", "data") + key = OpenSSL::PKey::RSA.new + key.e = 111 + rescue + have_open_ssl = false + end + have_open_ssl +end + +if have_open_ssl? + require_relative 'tc_ds.rb' +else + puts "-----------------------------------------------------------------------" + puts "OpenSSL not present (with full functionality) - skipping DS digest test" + puts "-----------------------------------------------------------------------" +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/ts_online.rb b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/ts_online.rb new file mode 100644 index 000000000000..fac7a029876e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/dnsruby-1.61.5/test/ts_online.rb @@ -0,0 +1,151 @@ +# -- +# Copyright 2007 Nominet UK +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ++ + +require_relative 'spec_helper' +Dnsruby.log.level = Logger::FATAL + +require 'socket' + + +# Tells whether or not we can connect to the Internet. +def online? + sock = UDPSocket.new() + online = false + begin + sock.connect('193.0.14.129', 25) # that address is k.root-servers.net + online = true + sock.close + rescue Exception => exception + puts " +------------------------------------------------------------ +Cannot bind to socket: + #{exception} + +This is an indication you have network problems. +No online tests will be run!! +------------------------------------------------------------ +" + end + online +end + + +if online? + online_tests = %w( + axfr + hs + recur + resolv + resolver + tcp + tcp_pipelining + single_resolver + cache + dns + rr-opt + res_config + ) + + + # Excluded are: + # + # inet6 + # recurse + # queue + # soak + + # OK - online and ready to go + puts ' +Running online tests. These tests send UDP packets - some may be lost. +If you get the odd timeout error with these tests, try running them again. +It may just be that some UDP packets got lost the first time... +' + + online_tests.each { |test| require_relative("tc_#{test}.rb") } +end + + +# We have set server_up to unconditionally return false. +# Therefore, to avoid any misconception that this code could run, +# I'm commenting it out. +=begin +def server_up? + false +# Check if we can contact the server - if we can't, then abort the test + # (but tell user that test has not been run due to connectivity problems) + + # Disabling the attempt to connect to Nominet servers... + # begin + # sock = UDPSocket.new + # sock.connect('ns0.validation-test-servers.nominet.org.uk', + # 25) + # sock.close + # server_up = true + # rescue Exception + # puts "----------------------------------------" + # puts "Cannot connect to test server\n\t"+$!.to_s+"\n" + # puts "\n\nNo tests targetting this server will be run!!\n\n" + # puts "----------------------------------------" + # end +end + + +if (server_up) + + require_relative "tc_single_resolver.rb" + require_relative "tc_cache.rb" + require_relative "tc_dns.rb" + require_relative "tc_rr-opt.rb" + require_relative "tc_res_config.rb" + + have_openssl = false + begin + require "openssl" + OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, "key", "data") + key = OpenSSL::PKey::RSA.new + key.e = 111 + + have_openssl=true + rescue Exception => e + puts "-------------------------------------------------------------------------" + puts "OpenSSL not present (with full functionality) - skipping TSIG/DNSSEC test" + puts "-------------------------------------------------------------------------" + end + if (have_openssl) + require_relative "tc_tsig.rb" + puts "------------------------------------------------------" + puts "Running DNSSEC test - may fail if OpenSSL not complete" + puts "------------------------------------------------------" + require_relative "tc_verifier.rb" + require_relative "tc_dlv.rb" + require_relative "tc_validator.rb" + end +=end + +# have_em = false +# begin +# require 'eventmachine' +# have_em = true +# rescue LoadError => e +# puts "----------------------------------------" +# puts "EventMachine not installed - skipping test" +# puts "----------------------------------------" +# end +# if (have_em) +# require 'test/tc_event_machine_single_res.rb' +# require 'test/tc_event_machine_res.rb' +# require 'test/tc_event_machine_deferrable.rb' +# end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/.gitignore b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/.gitignore new file mode 100644 index 000000000000..616915ca0c84 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/.gitignore @@ -0,0 +1,3 @@ +*.gemspec +pkg +Gemfile.lock diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/CHANGELOG.rdoc b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/CHANGELOG.rdoc new file mode 100644 index 000000000000..f7dd9fb37a51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/CHANGELOG.rdoc @@ -0,0 +1,149 @@ += Changelog + +== 0.5.1 / 2014-04-23 + +- new features: + - Support for receiving binary messages + +- changed: + - Allow additional close codes to be sent by apps + - Raise better errors on missing Sec-WebSocket-Key2 + - Updated http_parser.rb dependency to 0.6.0 + +- bug fixes: + - Abort if HTTP request URI is invalid + - Force close connections that have been sent a close handshake after a timeout + +- improved spec compliance on: + - Missing continuation frames + - Fragmented control frames + - Close behaviour after protocol errors + +== 0.5.0 / 2013-03-05 + +- new features: + - onclose handler is now passed a hash containing was_clean (set to true in drafts 03 and above when a connection is closed with a closing handshake, either by the server or the client), the close code, and reason (drafts 06 and above). Close code 1005 indicates that no code was supplied, and 1006 that the connection was closed abnormally. + - use Connection#support_close_codes? to easily check whether close codes are supported by the WebSocket protocol (drafts 06 and above) + - closes connection with 1007 close code if text frame contains invalid UTF8 + - added Handshake#secure? for checking whether the connection is secure (either ssl or behind an ssl proxy) + +- changed: + - Defaults to sending no close code rather than 1000 (consistent with browsers) + - Allows sending a 3xxx close code + - Renamed Connection#close_websocket to Connection#close (again for consistency with browsers). Old method is available till 0.6. + - Sends reasons with internally generated closure (previously only sent code) + - Echos close code when replying to close handshake + +== 0.4.0 / 2013-01-22 + +- new features: + - on_open handler is now passed a handshake object which exposes the request headers, path, and query parameters + - Easily access the protocol version via Handshake#protocol_version + - Easily access the origin via Handshake#origin + +- changed: + - Removed Connection#request - change to using handshake passed to on_open + +- internals: + - Uses the http_parser.rb gem + +== 0.3.8 / 2012-07-12 + +- bug fixes: + - Fixed support for Ruby 1.8.7 which was broken in 0.3.7 + +== 0.3.7 / 2012-07-11 + +- new features: + - Supports sending 1009 error code when incoming frame is too large to handle, and added associated exception class WSMessageTooBigError [Martyn Loughran] + - Supports overriding the maximum frame size by setting the max_frame_size accessor on the connection object (in bytes). Default unchanged at 10MB. [Martyn Loughran] + +- bug fixes: + - Fixes some encoding issues on Ruby 1.9 [Dingding Ye] + - Raises a HandshakeError if WS header is empty [Markus Fenske] + - Connection#send would mutate passed string to BINARY encoding. The fix still mutates the string by forcing the encoding back to UTF-8 before returning, but if the passed string was encoded as UTF-8 this is equivalent [Martyn Loughran] + +== 0.3.6 / 2011-12-23 + +- new features: + - Supports sending ping & pong messages + - Supports binding to received ping & pong messages + +== 0.3.5 / 2011-10-24 + +- new features: + - Support WebSocket draft 13 + +== 0.3.2 / 2011-10-09 + +- bugfixes: + - Handling of messages with > 2 frames + - Encode string passed to onmessage handler as UTF-8 on Ruby 1.9 + - Add 10MB frame length limit to all draft versions + +== 0.3.1 / 2011-07-28 + +- new features: + - Support WebSocket drafts 07 & 08 + +== 0.3.0 / 2011-05-06 + +- new features: + - Support WebSocket drafts 05 & 06 +- changes: + - Accept request headers in a case insensitive manner + - Change handling of errors. Previously some application errors were caught + internally and were invisible unless an onerror callback was supplied. See + readme for details + +== 0.2.1 / 2011-03-01 + +- bugfixes: + - Performance improvements to draft 76 framing + - Limit frame lengths for draft 76 + - Better error handling for draft 76 handshake + - Ruby 1.9 support + +== 0.2.0 / 2010-11-23 + +- new features: + - Support for WebSocket draft 03 +- bugfixes: + - Handle case when handshake split into two receive_data calls + - Stricter regexp matching of frames + +== 0.1.4 / 2010-08-23 + +- new features: + - Allow custom ssl certificate to be used by passing :tls_options + - Protect against errors caused by non limited frame lengths + - Use custom exceptions rather than RuntimeError +- bugfixes: + - Handle invalid HTTP request with HandshakeError + +== 0.1.3 / 2010-07-18 + +- new features: + - onerror callback +- bugfixes: + - proper handling of zero spaces in key1 or key2(prevent ZeroDivisionError) + - convert received data to utf-8 to prevent ruby 1.9 errors + - fix handling of null bytes within a frame + +== 0.1.2 / 2010-06-16 + +- new features: + - none +- bugfixes: + - allow $ character inside header key + +== 0.1.1 / 2010-06-13 + +- new features: + - wss/ssl support +- bugfixes: + - can't & strings + +== 0.1.0 / 2010-06-12 + +- initial release \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/Gemfile b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/Gemfile new file mode 100644 index 000000000000..633ac0cb3ecc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/Gemfile @@ -0,0 +1,9 @@ +source "http://rubygems.org" + +gemspec + +gem "em-websocket-client", git: "git@github.com:movitto/em-websocket-client.git", branch: "expose-websocket-api" +gem "em-spec", "~> 0.2.6" +gem "em-http-request", "~> 1.1.1" +gem "rspec", "~> 3.5.0" +gem "rake" diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/LICENCE b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/LICENCE new file mode 100644 index 000000000000..d4df7adadf42 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/LICENCE @@ -0,0 +1,7 @@ +Copyright (c) 2009-2014 Ilya Grigorik, Martyn Loughran + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/README.md b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/README.md new file mode 100644 index 000000000000..8e8384cecdd0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/README.md @@ -0,0 +1,142 @@ +# EM-WebSocket + +[![Gem Version](https://badge.fury.io/rb/em-websocket.png)](http://rubygems.org/gems/em-websocket) +[![Analytics](https://ga-beacon.appspot.com/UA-71196-10/em-websocket/readme)](https://github.com/igrigorik/ga-beacon) + +EventMachine based, async, Ruby WebSocket server. Take a look at examples directory, or check out the blog post: [Ruby & Websockets: TCP for the Web](http://www.igvita.com/2009/12/22/ruby-websockets-tcp-for-the-browser/). + +## Simple server example + +```ruby +require 'em-websocket' + +EM.run { + EM::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws| + ws.onopen { |handshake| + puts "WebSocket connection open" + + # Access properties on the EM::WebSocket::Handshake object, e.g. + # path, query_string, origin, headers + + # Publish message to the client + ws.send "Hello Client, you connected to #{handshake.path}" + } + + ws.onclose { puts "Connection closed" } + + ws.onmessage { |msg| + puts "Recieved message: #{msg}" + ws.send "Pong: #{msg}" + } + end +} +``` + +## Protocols supported, and protocol specific functionality + +Supports all WebSocket protocols in use in the wild (and a few that are not): drafts 75, 76, 1-17, rfc. + +While some of the changes between protocols are unimportant from the point of view of application developers, a few drafts did introduce new functionality. It's possible to easily test for this functionality by using + +### Ping & pong supported + +Call `ws.pingable?` to check whether ping & pong is supported by the protocol in use. + +It's possible to send a ping frame (`ws.ping(body = '')`), which the client must respond to with a pong, or the server can send an unsolicited pong frame (`ws.pong(body = '')`) which the client should not respond to. These methods can be used regardless of protocol version; they return true if the protocol supports ping&pong or false otherwise. + +When receiving a ping, the server will automatically respond with a pong as the spec requires (so you should _not_ write an onping handler that replies with a pong), however it is possible to bind to ping & pong events if desired by using the `onping` and `onpong` methods. + +### Close codes and reasons + +A WebSocket connection can be closed cleanly, regardless of protocol, by calling `ws.close(code = nil, body = nil)`. + +Early protocols just close the TCP connection, draft 3 introduced a close handshake, and draft 6 added close codes and reasons to the close handshake. Call `ws.supports_close_codes?` to check whether close codes are supported (i.e. the protocol version is 6 or above). + +The `onclose` callback is passed a hash which may contain following keys (depending on the protocol version): + +* `was_clean`: boolean indicating whether the connection was closed via the close handshake. +* `code`: the close code. There are two special close codes which the server may set (as defined in the WebSocket spec): + * 1005: no code was supplied + * 1006: abnormal closure (the same as `was_clean: false`) +* `reason`: the close reason + +Acceptable close codes are defined in the WebSocket rfc (<http://tools.ietf.org/html/rfc6455#section-7.4>). The following codes can be supplies when calling `ws.close(code)`: + +* 1000: a generic normal close +* range 3xxx: reserved for libraries, frameworks, and applications (and can be registered with IANA) +* range 4xxx: for private use + +If unsure use a code in the 4xxx range. em-websocket may also close a connection with one of the following close codes: + +* 1002: WebSocket protocol error. +* 1009: Message too big to process. By default em-websocket will accept frames up to 10MB in size. If a frame is larger than this the connection will be closed without reading the frame data. The limit can be overriden globally (`EM::WebSocket.max_frame_size = bytes`) or on a specific connection (`ws.max_frame_size = bytes`). + +## Secure server + +It is possible to accept secure `wss://` connections by passing `:secure => true` when opening the connection. Pass a `:tls_options` hash containing keys as described in http://www.rubydoc.info/github/eventmachine/eventmachine/EventMachine/Connection:start_tls + +**Warning**: Safari 5 does not currently support prompting on untrusted SSL certificates therefore using a self signed certificate may leave you scratching your head. + +```ruby +EM::WebSocket.start({ + :host => "0.0.0.0", + :port => 443, + :secure => true, + :tls_options => { + :private_key_file => "/private/key", + :cert_chain_file => "/ssl/certificate" + } +}) do |ws| + # ... +end +``` + +It's possible to check whether an incoming connection is secure by reading `handshake.secure?` in the onopen callback. + +## Running behind an SSL Proxy/Terminator, like Stunnel + +The `:secure_proxy => true` option makes it possible to use em-websocket behind a secure SSL proxy/terminator like [Stunnel](http://www.stunnel.org/) which does the actual encryption & decryption. + +Note that this option is only required to support drafts 75 & 76 correctly (e.g. Safari 5.1.x & earlier, and Safari on iOS 5.x & earlier). + +```ruby +EM::WebSocket.start({ + :host => "0.0.0.0", + :port => 8080, + :secure_proxy => true +}) do |ws| + # ... +end +``` + +## Handling errors + +There are two kinds of errors that need to be handled -- WebSocket protocol errors and errors in application code. + +WebSocket protocol errors (for example invalid data in the handshake or invalid message frames) raise errors which descend from `EM::WebSocket::WebSocketError`. Such errors are rescued internally and the WebSocket connection will be closed immediately or an error code sent to the browser in accordance to the WebSocket specification. It is possible to be notified in application code of such errors by including an `onerror` callback. + +```ruby +ws.onerror { |error| + if error.kind_of?(EM::WebSocket::WebSocketError) + # ... + end +} +``` + +Application errors are treated differently. If no `onerror` callback has been defined these errors will propagate to the EventMachine reactor, typically causing your program to terminate. If you wish to handle exceptions, simply supply an `onerror callback` and check for exceptions which are not descendant from `EM::WebSocket::WebSocketError`. + +It is also possible to log all errors when developing by including the `:debug => true` option when initialising the WebSocket server. + +## Emulating WebSockets in older browsers + +It is possible to emulate WebSockets in older browsers using flash emulation. For example take a look at the [web-socket-js](https://github.com/gimite/web-socket-js) project. + +Using flash emulation does require some minimal support from em-websocket which is enabled by default. If flash connects to the WebSocket port and requests a policy file (which it will do if it fails to receive a policy file on port 843 after a timeout), em-websocket will return one. Also see <https://github.com/igrigorik/em-websocket/issues/61> for an example policy file server which you can run on port 843. + +## Examples & Projects using em-websocket + +* [Pusher](http://pusher.com) - Realtime Messaging Service +* [Livereload](https://github.com/mockko/livereload) - LiveReload applies CSS/JS changes to Safari or Chrome w/o reloading +* [Twitter AMQP WebSocket Example](http://github.com/rubenfonseca/twitter-amqp-websocket-example) +* examples/multicast.rb - broadcast all ruby tweets to all subscribers +* examples/echo.rb - server <> client exchange via a websocket diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/Rakefile b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/Rakefile new file mode 100644 index 000000000000..0bd271808df6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/Rakefile @@ -0,0 +1,11 @@ +require 'bundler' +Bundler::GemHelper.install_tasks + +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new do |t| + t.rspec_opts = ["-c", "-f progress", "-r ./spec/helper.rb"] + t.pattern = 'spec/**/*_spec.rb' +end + +task :default => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/echo.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/echo.rb new file mode 100644 index 000000000000..4e648860c048 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/echo.rb @@ -0,0 +1,24 @@ +require File.expand_path('../../lib/em-websocket', __FILE__) + +EM.run { + EM::WebSocket.run(:host => "0.0.0.0", :port => 8080, :debug => false) do |ws| + ws.onopen { |handshake| + puts "WebSocket opened #{{ + :path => handshake.path, + :query => handshake.query, + :origin => handshake.origin, + }}" + + ws.send "Hello Client!" + } + ws.onmessage { |msg| + ws.send "Pong: #{msg}" + } + ws.onclose { + puts "WebSocket closed" + } + ws.onerror { |e| + puts "Error: #{e.message}" + } + end +} diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/multicast.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/multicast.rb new file mode 100644 index 000000000000..b1692d56eb83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/multicast.rb @@ -0,0 +1,47 @@ +require 'em-websocket' +# requires the twitter-stream gem +require 'twitter/json_stream' +require 'json' + +# +# broadcast all ruby related tweets to all connected users! +# + +username = ARGV.shift +password = ARGV.shift +raise "need username and password" if !username or !password + +EventMachine.run { + @channel = EM::Channel.new + + @twitter = Twitter::JSONStream.connect( + :path => '/1/statuses/filter.json?track=ruby', + :auth => "#{username}:#{password}", + :ssl => true + ) + + @twitter.each_item do |status| + status = JSON.parse(status) + @channel.push "#{status['user']['screen_name']}: #{status['text']}" + end + + + EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080, :debug => true) do |ws| + + ws.onopen { + sid = @channel.subscribe { |msg| ws.send msg } + @channel.push "#{sid} connected!" + + ws.onmessage { |msg| + @channel.push "<#{sid}>: #{msg}" + } + + ws.onclose { + @channel.unsubscribe(sid) + } + } + + end + + puts "Server started" +} diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/ping.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/ping.rb new file mode 100644 index 000000000000..fe569c3b0b78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/ping.rb @@ -0,0 +1,24 @@ +require File.expand_path('../../lib/em-websocket', __FILE__) + +EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080, :debug => false) do |ws| + timer = nil + ws.onopen { + puts "Ping supported: #{ws.pingable?}" + timer = EM.add_periodic_timer(1) { + p ["Sent ping", ws.ping('hello')] + } + } + ws.onpong { |value| + puts "Received pong: #{value}" + } + ws.onping { |value| + puts "Received ping: #{value}" + } + ws.onclose { + EM.cancel_timer(timer) + puts "WebSocket closed" + } + ws.onerror { |e| + puts "Error: #{e.message}" + } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/test.html b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/test.html new file mode 100644 index 000000000000..07d4636bfc27 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/examples/test.html @@ -0,0 +1,29 @@ +<html> + <head> + <script> + function init() { + function debug(string) { + var element = document.getElementById("debug"); + var p = document.createElement("p"); + p.appendChild(document.createTextNode(string)); + element.appendChild(p); + } + + var Socket = "MozWebSocket" in window ? MozWebSocket : WebSocket; + var ws = new Socket("ws://localhost:8080/foo/bar?hello=world"); + ws.onmessage = function(evt) { debug("Received: " + evt.data); }; + ws.onclose = function(event) { + debug("Closed - code: " + event.code + ", reason: " + event.reason + ", wasClean: " + event.wasClean); + }; + ws.onopen = function() { + debug("connected..."); + ws.send("hello server"); + ws.send("hello again"); + }; + }; + </script> + </head> + <body onload="init();"> + <div id="debug"></div> + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket.rb new file mode 100644 index 000000000000..3eaa105b39b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket.rb @@ -0,0 +1,24 @@ +$:.unshift(File.dirname(__FILE__) + '/../lib') + +require "eventmachine" + +%w[ + debugger websocket connection + handshake + handshake75 handshake76 handshake04 + framing76 framing03 framing04 framing05 framing07 + close75 close03 close05 close06 + masking04 + message_processor_03 message_processor_06 + handler handler75 handler76 handler03 handler05 handler06 handler07 handler08 handler13 +].each do |file| + require "em-websocket/#{file}" +end + +unless ''.respond_to?(:getbyte) + class String + def getbyte(i) + self[i] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close03.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close03.rb new file mode 100644 index 000000000000..8981776f950a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close03.rb @@ -0,0 +1,14 @@ +module EventMachine + module WebSocket + module Close03 + def close_websocket(code, body) + # TODO: Ideally send body data and check that it matches in ack + send_frame(:close, '') + @state = :closing + start_close_timeout + end + + def supports_close_codes?; false; end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close05.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close05.rb new file mode 100644 index 000000000000..8f8c1508e16d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close05.rb @@ -0,0 +1,14 @@ +module EventMachine + module WebSocket + module Close05 + def close_websocket(code, body) + # TODO: Ideally send body data and check that it matches in ack + send_frame(:close, "\x53") + @state = :closing + start_close_timeout + end + + def supports_close_codes?; false; end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close06.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close06.rb new file mode 100644 index 000000000000..14cc80ec6975 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close06.rb @@ -0,0 +1,19 @@ +module EventMachine + module WebSocket + module Close06 + def close_websocket(code, body) + if code + close_data = [code].pack('n') + close_data << body if body + send_frame(:close, close_data) + else + send_frame(:close, '') + end + @state = :closing + start_close_timeout + end + + def supports_close_codes?; true; end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close75.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close75.rb new file mode 100644 index 000000000000..9d6ba020ea57 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/close75.rb @@ -0,0 +1,11 @@ +module EventMachine + module WebSocket + module Close75 + def close_websocket(code, body) + @connection.close_connection_after_writing + end + + def supports_close_codes?; false; end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/connection.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/connection.rb new file mode 100644 index 000000000000..a55881dfed13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/connection.rb @@ -0,0 +1,349 @@ +module EventMachine + module WebSocket + class Connection < EventMachine::Connection + include Debugger + + attr_writer :max_frame_size + + # define WebSocket callbacks + def onopen(&blk); @onopen = blk; end + def onclose(&blk); @onclose = blk; end + def onerror(&blk); @onerror = blk; end + def onmessage(&blk); @onmessage = blk; end + def onbinary(&blk); @onbinary = blk; end + def onping(&blk); @onping = blk; end + def onpong(&blk); @onpong = blk; end + + def trigger_on_message(msg) + @onmessage.call(msg) if defined? @onmessage + end + def trigger_on_binary(msg) + @onbinary.call(msg) if defined? @onbinary + end + def trigger_on_open(handshake) + @onopen.call(handshake) if defined? @onopen + end + def trigger_on_close(event = {}) + @onclose.call(event) if defined? @onclose + end + def trigger_on_ping(data) + @onping.call(data) if defined? @onping + end + def trigger_on_pong(data) + @onpong.call(data) if defined? @onpong + end + def trigger_on_error(reason) + return false unless defined? @onerror + @onerror.call(reason) + true + end + + def initialize(options) + @options = options + @debug = options[:debug] || false + @secure = options[:secure] || false + @secure_proxy = options[:secure_proxy] || false + @tls_options = options[:tls_options] || {} + @close_timeout = options[:close_timeout] + @outbound_limit = options[:outbound_limit] || 0 + + @handler = nil + + debug [:initialize] + end + + # Use this method to close the websocket connection cleanly + # This sends a close frame and waits for acknowlegement before closing + # the connection + def close(code = nil, body = nil) + if code && !acceptable_close_code?(code) + raise "Application code may only use codes from 1000, 3000-4999" + end + + close_websocket_private(code, body) + end + + # Deprecated, to be removed in version 0.6 + alias :close_websocket :close + + def post_init + start_tls(@tls_options) if @secure + end + + def receive_data(data) + debug [:receive_data, data] + + if @handler + @handler.receive_data(data) + else + dispatch(data) + end + rescue => e + debug [:error, e] + + # There is no code defined for application errors, so use 3000 + # (which is reserved for frameworks) + close_websocket_private(3000, "Application error") + + # These are application errors - raise unless onerror defined + trigger_on_error(e) || raise(e) + end + + def send_data(data) + if @outbound_limit > 0 && + get_outbound_data_size + data.bytesize > @outbound_limit + abort(:outbound_limit_reached) + return 0 + end + + super(data) + end + + def unbind + debug [:unbind, :connection] + + @handler.unbind if @handler + rescue => e + debug [:error, e] + # These are application errors - raise unless onerror defined + trigger_on_error(e) || raise(e) + end + + def dispatch(data) + if data.match(%r|^GET /healthcheck|) + send_healthcheck_response + elsif data.match(/\A<policy-file-request\s*\/>/) + send_flash_cross_domain_file + else + @handshake ||= begin + handshake = Handshake.new(@secure || @secure_proxy) + + handshake.callback { |upgrade_response, handler_klass| + debug [:accepting_ws_version, handshake.protocol_version] + debug [:upgrade_response, upgrade_response] + self.send_data(upgrade_response) + @handler = handler_klass.new(self, @debug) + @handshake = nil + trigger_on_open(handshake) + } + + handshake.errback { |e| + debug [:error, e] + trigger_on_error(e) + # Handshake errors require the connection to be aborted + abort(:handshake_error) + } + + handshake + end + + @handshake.receive_data(data) + end + end + + def send_healthcheck_response + debug [:healthcheck, 'OK'] + + healthcheck_res = ["HTTP/1.1 200 OK"] + healthcheck_res << "Content-Type: text/plain" + healthcheck_res << "Content-Length: 2" + + healthcheck_res = healthcheck_res.join("\r\n") + "\r\n\r\nOK" + + send_data healthcheck_res + + # handle the healthcheck request transparently + # no need to notify the user about this connection + @onclose = nil + close_connection_after_writing + end + + def send_flash_cross_domain_file + file = '<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>' + debug [:cross_domain, file] + send_data file + + # handle the cross-domain request transparently + # no need to notify the user about this connection + @onclose = nil + close_connection_after_writing + end + + # Cache encodings since it's moderately expensive to look them up each time + ENCODING_SUPPORTED = "string".respond_to?(:force_encoding) + UTF8 = Encoding.find("UTF-8") if ENCODING_SUPPORTED + BINARY = Encoding.find("BINARY") if ENCODING_SUPPORTED + + # Send a WebSocket text frame. + # + # A WebSocketError may be raised if the connection is in an opening or a + # closing state, or if the passed in data is not valid UTF-8 + # + def send_text(data) + # If we're using Ruby 1.9, be pedantic about encodings + if ENCODING_SUPPORTED + # Also accept ascii only data in other encodings for convenience + unless (data.encoding == UTF8 && data.valid_encoding?) || data.ascii_only? + raise WebSocketError, "Data sent to WebSocket must be valid UTF-8 but was #{data.encoding} (valid: #{data.valid_encoding?})" + end + # This labels the encoding as binary so that it can be combined with + # the BINARY framing + data.force_encoding(BINARY) + else + # TODO: Check that data is valid UTF-8 + end + + if @handler + @handler.send_text_frame(data) + else + raise WebSocketError, "Cannot send data before onopen callback" + end + + # Revert data back to the original encoding (which we assume is UTF-8) + # Doing this to avoid duping the string - there may be a better way + data.force_encoding(UTF8) if ENCODING_SUPPORTED + return nil + end + + alias :send :send_text + + # Send a WebSocket binary frame. + # + def send_binary(data) + if @handler + @handler.send_frame(:binary, data) + else + raise WebSocketError, "Cannot send binary before onopen callback" + end + end + + # Send a ping to the client. The client must respond with a pong. + # + # In the case that the client is running a WebSocket draft < 01, false + # is returned since ping & pong are not supported + # + def ping(body = '') + if @handler + @handler.pingable? ? @handler.send_frame(:ping, body) && true : false + else + raise WebSocketError, "Cannot ping before onopen callback" + end + end + + # Send an unsolicited pong message, as allowed by the protocol. The + # client is not expected to respond to this message. + # + # em-websocket automatically takes care of sending pong replies to + # incoming ping messages, as the protocol demands. + # + def pong(body = '') + if @handler + @handler.pingable? ? @handler.send_frame(:pong, body) && true : false + else + raise WebSocketError, "Cannot ping before onopen callback" + end + end + + # Test whether the connection is pingable (i.e. the WebSocket draft in + # use is >= 01) + def pingable? + if @handler + @handler.pingable? + else + raise WebSocketError, "Cannot test whether pingable before onopen callback" + end + end + + def supports_close_codes? + if @handler + @handler.supports_close_codes? + else + raise WebSocketError, "Cannot test before onopen callback" + end + end + + def state + @handler ? @handler.state : :handshake + end + + # Returns the IP address for the remote peer + def remote_ip + get_peername[2,6].unpack('nC4')[1..4].join('.') + end + + # Returns the maximum frame size which this connection is configured to + # accept. This can be set globally or on a per connection basis, and + # defaults to a value of 10MB if not set. + # + # The behaviour when a too large frame is received varies by protocol, + # but in the newest protocols the connection will be closed with the + # correct close code (1009) immediately after receiving the frame header + # + def max_frame_size + defined?(@max_frame_size) ? @max_frame_size : WebSocket.max_frame_size + end + + def close_timeout + @close_timeout || WebSocket.close_timeout + end + + private + + # As definited in draft 06 7.2.2, some failures require that the server + # abort the websocket connection rather than close cleanly + def abort(reason) + debug [:abort, reason] + close_connection + end + + def close_websocket_private(code, body) + if @handler + debug [:closing, code] + @handler.close_websocket(code, body) + else + # The handshake hasn't completed - should be safe to terminate + abort(:handshake_incomplete) + end + end + + # Allow applications to close with 1000, 1003, 1008, 1011, 3xxx or 4xxx. + # + # em-websocket uses a few other codes internally which should not be + # used by applications + # + # Browsers generally allow connections to be closed with code 1000, + # 3xxx, and 4xxx. em-websocket allows closing with a few other codes + # which seem reasonable (for discussion see + # https://github.com/igrigorik/em-websocket/issues/98) + # + # Usage from the rfc: + # + # 1000 indicates a normal closure + # + # 1003 indicates that an endpoint is terminating the connection + # because it has received a type of data it cannot accept + # + # 1008 indicates that an endpoint is terminating the connection because + # it has received a message that violates its policy + # + # 1011 indicates that a server is terminating the connection because it + # encountered an unexpected condition that prevented it from fulfilling + # the request + # + # Status codes in the range 3000-3999 are reserved for use by libraries, + # frameworks, and applications + # + # Status codes in the range 4000-4999 are reserved for private use and + # thus can't be registered + # + def acceptable_close_code?(code) + case code + when 1000, 1003, 1008, 1011, (3000..4999) + true + else + false + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/debugger.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/debugger.rb new file mode 100644 index 000000000000..a5b326687999 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/debugger.rb @@ -0,0 +1,17 @@ +module EventMachine + module WebSocket + module Debugger + + private + + def debug(*data) + if @debug + require 'pp' + pp data + puts + end + end + + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing03.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing03.rb new file mode 100644 index 000000000000..61e6ab8ba70a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing03.rb @@ -0,0 +1,162 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module Framing03 + def initialize_framing + @data = '' + @application_data_buffer = '' # Used for MORE frames + @frame_type = nil + end + + def process_data + error = false + + while !error && @data.size > 1 + pointer = 0 + + more = ((@data.getbyte(pointer) & 0b10000000) == 0b10000000) ^ fin + # Ignoring rsv1-3 for now + opcode = @data.getbyte(0) & 0b00001111 + pointer += 1 + + # Ignoring rsv4 + length = @data.getbyte(pointer) & 0b01111111 + pointer += 1 + + payload_length = case length + when 127 # Length defined by 8 bytes + # Check buffer size + if @data.getbyte(pointer+8-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Only using the last 4 bytes for now, till I work out how to + # unpack 8 bytes. I'm sure 4GB frames will do for now :) + l = @data[(pointer+4)..(pointer+7)].unpack('N').first + pointer += 8 + l + when 126 # Length defined by 2 bytes + # Check buffer size + if @data.getbyte(pointer+2-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + l = @data[pointer..(pointer+1)].unpack('n').first + pointer += 2 + l + else + length + end + + if payload_length > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{payload_length} bytes)" + end + + # Check buffer size + if @data.getbyte(pointer+payload_length-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Throw away data up to pointer + @data.slice!(0...pointer) + + # Read application data + application_data = @data.slice!(0...payload_length) + + frame_type = opcode_to_type(opcode) + + if frame_type == :continuation && !@frame_type + raise WSProtocolError, 'Continuation frame not expected' + end + + if more + debug [:moreframe, frame_type, application_data] + @application_data_buffer << application_data + # The message type is passed in the first frame + @frame_type ||= frame_type + else + # Message is complete + if frame_type == :continuation + @application_data_buffer << application_data + message(@frame_type, '', @application_data_buffer) + @application_data_buffer = '' + @frame_type = nil + else + message(frame_type, '', application_data) + end + end + end # end while + end + + def send_frame(frame_type, application_data) + debug [:sending_frame, frame_type, application_data] + + if @state == :closing && data_frame?(frame_type) + raise WebSocketError, "Cannot send data frame since connection is closing" + end + + frame = '' + + opcode = type_to_opcode(frame_type) + byte1 = opcode # since more, rsv1-3 are 0 + frame << byte1 + + length = application_data.size + if length <= 125 + byte2 = length # since rsv4 is 0 + frame << byte2 + elsif length < 65536 # write 2 byte length + frame << 126 + frame << [length].pack('n') + else # write 8 byte length + frame << 127 + frame << [length >> 32, length & 0xFFFFFFFF].pack("NN") + end + + frame << application_data + + @connection.send_data(frame) + end + + def send_text_frame(data) + send_frame(:text, data) + end + + private + + # This allows flipping the more bit to fin for draft 04 + def fin; false; end + + FRAME_TYPES = { + :continuation => 0, + :close => 1, + :ping => 2, + :pong => 3, + :text => 4, + :binary => 5 + } + FRAME_TYPES_INVERSE = FRAME_TYPES.invert + # Frames are either data frames or control frames + DATA_FRAMES = [:text, :binary, :continuation] + + def type_to_opcode(frame_type) + FRAME_TYPES[frame_type] || raise("Unknown frame type") + end + + def opcode_to_type(opcode) + FRAME_TYPES_INVERSE[opcode] || raise(WSProtocolError, "Unknown opcode #{opcode}") + end + + def data_frame?(type) + DATA_FRAMES.include?(type) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing04.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing04.rb new file mode 100644 index 000000000000..41352e636196 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing04.rb @@ -0,0 +1,15 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + # The only difference between draft 03 framing and draft 04 framing is + # that the MORE bit has been changed to a FIN bit + module Framing04 + include Framing03 + + private + + def fin; true; end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing05.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing05.rb new file mode 100644 index 000000000000..636336aa2897 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing05.rb @@ -0,0 +1,163 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module Framing05 + def initialize_framing + @data = MaskedString.new + @application_data_buffer = '' # Used for MORE frames + @frame_type = nil + end + + def process_data + error = false + + while !error && @data.size > 5 # mask plus first byte present + pointer = 0 + + @data.read_mask + pointer += 4 + + fin = (@data.getbyte(pointer) & 0b10000000) == 0b10000000 + # Ignoring rsv1-3 for now + opcode = @data.getbyte(pointer) & 0b00001111 + pointer += 1 + + # Ignoring rsv4 + length = @data.getbyte(pointer) & 0b01111111 + pointer += 1 + + payload_length = case length + when 127 # Length defined by 8 bytes + # Check buffer size + if @data.getbyte(pointer+8-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Only using the last 4 bytes for now, till I work out how to + # unpack 8 bytes. I'm sure 4GB frames will do for now :) + l = @data.getbytes(pointer+4, 4).unpack('N').first + pointer += 8 + l + when 126 # Length defined by 2 bytes + # Check buffer size + if @data.getbyte(pointer+2-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + l = @data.getbytes(pointer, 2).unpack('n').first + pointer += 2 + l + else + length + end + + if payload_length > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{payload_length} bytes)" + end + + # Check buffer size + if @data.getbyte(pointer+payload_length-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Read application data + application_data = @data.getbytes(pointer, payload_length) + pointer += payload_length + + # Throw away data up to pointer + @data.unset_mask + @data.slice!(0...pointer) + + frame_type = opcode_to_type(opcode) + + if frame_type == :continuation && !@frame_type + raise WSProtocolError, 'Continuation frame not expected' + end + + if !fin + debug [:moreframe, frame_type, application_data] + @application_data_buffer << application_data + @frame_type = frame_type + else + # Message is complete + if frame_type == :continuation + @application_data_buffer << application_data + message(@frame_type, '', @application_data_buffer) + @application_data_buffer = '' + @frame_type = nil + else + message(frame_type, '', application_data) + end + end + end # end while + end + + def send_frame(frame_type, application_data) + debug [:sending_frame, frame_type, application_data] + + if @state == :closing && data_frame?(frame_type) + raise WebSocketError, "Cannot send data frame since connection is closing" + end + + frame = '' + + opcode = type_to_opcode(frame_type) + byte1 = opcode | 0b10000000 # fin bit set, rsv1-3 are 0 + frame << byte1 + + length = application_data.size + if length <= 125 + byte2 = length # since rsv4 is 0 + frame << byte2 + elsif length < 65536 # write 2 byte length + frame << 126 + frame << [length].pack('n') + else # write 8 byte length + frame << 127 + frame << [length >> 32, length & 0xFFFFFFFF].pack("NN") + end + + frame << application_data + + @connection.send_data(frame) + end + + def send_text_frame(data) + send_frame(:text, data) + end + + private + + FRAME_TYPES = { + :continuation => 0, + :close => 1, + :ping => 2, + :pong => 3, + :text => 4, + :binary => 5 + } + FRAME_TYPES_INVERSE = FRAME_TYPES.invert + # Frames are either data frames or control frames + DATA_FRAMES = [:text, :binary, :continuation] + + def type_to_opcode(frame_type) + FRAME_TYPES[frame_type] || raise("Unknown frame type") + end + + def opcode_to_type(opcode) + FRAME_TYPES_INVERSE[opcode] || raise(WSProtocolError, "Unknown opcode #{opcode}") + end + + def data_frame?(type) + DATA_FRAMES.include?(type) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing07.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing07.rb new file mode 100644 index 000000000000..58318e41d61f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing07.rb @@ -0,0 +1,185 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module Framing07 + + def initialize_framing + @data = MaskedString.new + @application_data_buffer = '' # Used for MORE frames + @frame_type = nil + end + + def process_data + error = false + + while !error && @data.size >= 2 + pointer = 0 + + fin = (@data.getbyte(pointer) & 0b10000000) == 0b10000000 + # Ignoring rsv1-3 for now + opcode = @data.getbyte(pointer) & 0b00001111 + pointer += 1 + + mask = (@data.getbyte(pointer) & 0b10000000) == 0b10000000 + length = @data.getbyte(pointer) & 0b01111111 + pointer += 1 + + # raise WebSocketError, 'Data from client must be masked' unless mask + + payload_length = case length + when 127 # Length defined by 8 bytes + # Check buffer size + if @data.getbyte(pointer+8-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Only using the last 4 bytes for now, till I work out how to + # unpack 8 bytes. I'm sure 4GB frames will do for now :) + l = @data.getbytes(pointer+4, 4).unpack('N').first + pointer += 8 + l + when 126 # Length defined by 2 bytes + # Check buffer size + if @data.getbyte(pointer+2-1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + l = @data.getbytes(pointer, 2).unpack('n').first + pointer += 2 + l + else + length + end + + # Compute the expected frame length + frame_length = pointer + payload_length + frame_length += 4 if mask + + if frame_length > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{frame_length} bytes)" + end + + # Check buffer size + if @data.getbyte(frame_length - 1) == nil + debug [:buffer_incomplete, @data] + error = true + next + end + + # Remove frame header + @data.slice!(0...pointer) + pointer = 0 + + # Read application data (unmasked if required) + @data.read_mask if mask + pointer += 4 if mask + application_data = @data.getbytes(pointer, payload_length) + pointer += payload_length + @data.unset_mask if mask + + # Throw away data up to pointer + @data.slice!(0...pointer) + + frame_type = opcode_to_type(opcode) + + if frame_type == :continuation + if !@frame_type + raise WSProtocolError, 'Continuation frame not expected' + end + else # Not a continuation frame + if @frame_type && data_frame?(frame_type) + raise WSProtocolError, "Continuation frame expected" + end + end + + # Validate that control frames are not fragmented + if !fin && !data_frame?(frame_type) + raise WSProtocolError, 'Control frames must not be fragmented' + end + + if !fin + debug [:moreframe, frame_type, application_data] + @application_data_buffer << application_data + # The message type is passed in the first frame + @frame_type ||= frame_type + else + # Message is complete + if frame_type == :continuation + @application_data_buffer << application_data + message(@frame_type, '', @application_data_buffer) + @application_data_buffer = '' + @frame_type = nil + else + message(frame_type, '', application_data) + end + end + end # end while + end + + def send_frame(frame_type, application_data) + debug [:sending_frame, frame_type, application_data] + + if @state == :closing && data_frame?(frame_type) + raise WebSocketError, "Cannot send data frame since connection is closing" + end + + frame = '' + + opcode = type_to_opcode(frame_type) + byte1 = opcode | 0b10000000 # fin bit set, rsv1-3 are 0 + frame << byte1 + + length = application_data.size + if length <= 125 + byte2 = length # since rsv4 is 0 + frame << byte2 + elsif length < 65536 # write 2 byte length + frame << 126 + frame << [length].pack('n') + else # write 8 byte length + frame << 127 + frame << [length >> 32, length & 0xFFFFFFFF].pack("NN") + end + + frame << application_data + + @connection.send_data(frame) + end + + def send_text_frame(data) + send_frame(:text, data) + end + + private + + FRAME_TYPES = { + :continuation => 0, + :text => 1, + :binary => 2, + :close => 8, + :ping => 9, + :pong => 10, + } + FRAME_TYPES_INVERSE = FRAME_TYPES.invert + # Frames are either data frames or control frames + DATA_FRAMES = [:text, :binary, :continuation] + + def type_to_opcode(frame_type) + FRAME_TYPES[frame_type] || raise("Unknown frame type") + end + + def opcode_to_type(opcode) + FRAME_TYPES_INVERSE[opcode] || raise(WSProtocolError, "Unknown opcode #{opcode}") + end + + def data_frame?(type) + DATA_FRAMES.include?(type) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing76.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing76.rb new file mode 100644 index 000000000000..55982ffa14bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/framing76.rb @@ -0,0 +1,105 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module Framing76 + def initialize_framing + @data = '' + end + + def process_data + debug [:message, @data] + + # This algorithm comes straight from the spec + # http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76#section-5.3 + + error = false + + while !error + return if @data.size == 0 + + pointer = 0 + frame_type = @data.getbyte(pointer) + pointer += 1 + + if (frame_type & 0x80) == 0x80 + # If the high-order bit of the /frame type/ byte is set + length = 0 + + loop do + return false if !@data.getbyte(pointer) + b = @data.getbyte(pointer) + pointer += 1 + b_v = b & 0x7F + length = length * 128 + b_v + break unless (b & 0x80) == 0x80 + end + + if length > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{length} bytes)" + end + + if @data.getbyte(pointer+length-1) == nil + debug [:buffer_incomplete, @data] + # Incomplete data - leave @data to accumulate + error = true + else + # Straight from spec - I'm sure this isn't crazy... + # 6. Read /length/ bytes. + # 7. Discard the read bytes. + @data = @data[(pointer+length)..-1] + + # If the /frame type/ is 0xFF and the /length/ was 0, then close + if length == 0 + @connection.send_data("\xff\x00") + @state = :closing + @connection.close_connection_after_writing + else + error = true + end + end + else + # If the high-order bit of the /frame type/ byte is _not_ set + + if @data.getbyte(0) != 0x00 + # Close the connection since this buffer can never match + raise WSProtocolError, "Invalid frame received" + end + + # Addition to the spec to protect against malicious requests + if @data.size > @connection.max_frame_size + raise WSMessageTooBigError, "Frame length too long (#{@data.size} bytes)" + end + + msg = @data.slice!(/\A\x00[^\xff]*\xff/) + if msg + msg.gsub!(/\A\x00|\xff\z/, '') + if @state == :closing + debug [:ignored_message, msg] + else + msg.force_encoding('UTF-8') if msg.respond_to?(:force_encoding) + @connection.trigger_on_message(msg) + end + else + error = true + end + end + end + + false + end + + # frames need to start with 0x00-0x7f byte and end with + # an 0xFF byte. Per spec, we can also set the first + # byte to a value betweent 0x80 and 0xFF, followed by + # a leading length indicator + def send_text_frame(data) + debug [:sending_text_frame, data] + ary = ["\x00", data, "\xff"] + ary.collect{ |s| s.force_encoding('UTF-8') if s.respond_to?(:force_encoding) } + @connection.send_data(ary.join) + end + + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler.rb new file mode 100644 index 000000000000..98cdd4eaa1aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler.rb @@ -0,0 +1,97 @@ +module EventMachine + module WebSocket + class Handler + def self.klass_factory(version) + case version + when 75 + Handler75 + when 76 + Handler76 + when 1..3 + # We'll use handler03 - I believe they're all compatible + Handler03 + when 5 + Handler05 + when 6 + Handler06 + when 7 + Handler07 + when 8 + # drafts 9, 10, 11 and 12 should never change the version + # number as they are all the same as version 08. + Handler08 + when 13 + # drafts 13 to 17 all identify as version 13 as they are + # only minor changes or text changes. + Handler13 + else + # According to spec should abort the connection + raise HandshakeError, "Protocol version #{version} not supported" + end + end + + include Debugger + + attr_reader :request, :state + + def initialize(connection, debug = false) + @connection = connection + @debug = debug + @state = :connected + @close_timer = nil + initialize_framing + end + + def receive_data(data) + @data << data + process_data + rescue WSProtocolError => e + fail_websocket(e) + end + + def close_websocket(code, body) + # Implemented in subclass + end + + # Used to avoid un-acked and unclosed remaining open indefinitely + def start_close_timeout + @close_timer = EM::Timer.new(@connection.close_timeout) { + @connection.close_connection + e = WSProtocolError.new("Close handshake un-acked after #{@connection.close_timeout}s, closing tcp connection") + @connection.trigger_on_error(e) + } + end + + # This corresponds to "Fail the WebSocket Connection" in the spec. + def fail_websocket(e) + debug [:error, e] + close_websocket(e.code, e.message) + @connection.close_connection_after_writing + @connection.trigger_on_error(e) + end + + def unbind + @state = :closed + + @close_timer.cancel if @close_timer + + @close_info = defined?(@close_info) ? @close_info : { + :code => 1006, + :was_clean => false, + } + + @connection.trigger_on_close(@close_info) + end + + def ping + # Overridden in subclass + false + end + + def pingable? + # Also Overridden + false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler03.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler03.rb new file mode 100644 index 000000000000..ac4b3ac4e912 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler03.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler03 < Handler + include Framing03 + include MessageProcessor03 + include Close03 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler05.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler05.rb new file mode 100644 index 000000000000..4e48e152c767 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler05.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler05 < Handler + include Framing05 + include MessageProcessor03 + include Close05 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler06.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler06.rb new file mode 100644 index 000000000000..ad55ef719c9a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler06.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler06 < Handler + include Framing05 + include MessageProcessor06 + include Close06 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler07.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler07.rb new file mode 100644 index 000000000000..d080cf5980b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler07.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler07 < Handler + include Framing07 + include MessageProcessor06 + include Close06 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler08.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler08.rb new file mode 100644 index 000000000000..632057f38b99 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler08.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler08 < Handler + include Framing07 + include MessageProcessor06 + include Close06 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler13.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler13.rb new file mode 100644 index 000000000000..1dc465d84cbf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler13.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler13 < Handler + include Framing07 + include MessageProcessor06 + include Close06 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler75.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler75.rb new file mode 100644 index 000000000000..d9a90d372fda --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler75.rb @@ -0,0 +1,9 @@ +module EventMachine + module WebSocket + class Handler75 < Handler + include Handshake75 + include Framing76 + include Close75 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler76.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler76.rb new file mode 100644 index 000000000000..c4aaa377c295 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handler76.rb @@ -0,0 +1,14 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + class Handler76 < Handler + include Handshake76 + include Framing76 + include Close75 + + # "\377\000" is octet version and "\xff\x00" is hex version + TERMINATE_STRING = "\xff\x00" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake.rb new file mode 100644 index 000000000000..12b79044bd3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake.rb @@ -0,0 +1,156 @@ +require "http/parser" +require "uri" + +module EventMachine + module WebSocket + + # Resposible for creating the server handshake response + class Handshake + include EM::Deferrable + + attr_reader :parser, :protocol_version + + # Unfortunately drafts 75 & 76 require knowledge of whether the + # connection is being terminated as ws/wss in order to generate the + # correct handshake response + def initialize(secure) + @parser = Http::Parser.new + @secure = secure + + @parser.on_headers_complete = proc { |headers| + @headers = Hash[headers.map { |k,v| [k.downcase, v] }] + } + end + + def receive_data(data) + @parser << data + + if defined? @headers + process(@headers, @parser.upgrade_data) + end + rescue HTTP::Parser::Error => e + fail(HandshakeError.new("Invalid HTTP header: #{e.message}")) + end + + # Returns the WebSocket upgrade headers as a hash. + # + # Keys are strings, unmodified from the request. + # + def headers + @parser.headers + end + + # The same as headers, except that the hash keys are downcased + # + def headers_downcased + @headers + end + + # Returns the request path (excluding any query params) + # + def path + @path + end + + # Returns the query params as a string foo=bar&baz=... + def query_string + @query_string + end + + def query + Hash[query_string.split('&').map { |c| c.split('=', 2) }] + end + + # Returns the WebSocket origin header if provided + # + def origin + @headers["origin"] || @headers["sec-websocket-origin"] || nil + end + + def secure? + @secure + end + + private + + def process(headers, remains) + unless @parser.http_method == "GET" + raise HandshakeError, "Must be GET request" + end + + # Validate request path + # + # According to http://tools.ietf.org/search/rfc2616#section-5.1.2, an + # invalid Request-URI should result in a 400 status code, but + # HandshakeError's currently result in a WebSocket abort. It's not + # clear which should take precedence, but an abort will do just fine. + begin + uri = URI.parse(@parser.request_url) + @path = uri.path + @query_string = uri.query || "" + rescue URI::InvalidURIError + raise HandshakeError, "Invalid request URI: #{@parser.request_url}" + end + + # Validate Upgrade + unless @parser.upgrade? + raise HandshakeError, "Not an upgrade request" + end + upgrade = @headers['upgrade'] + unless upgrade.kind_of?(String) && upgrade.downcase == 'websocket' + raise HandshakeError, "Invalid upgrade header: #{upgrade.inspect}" + end + + # Determine version heuristically + version = if @headers['sec-websocket-version'] + # Used from drafts 04 onwards + @headers['sec-websocket-version'].to_i + elsif @headers['sec-websocket-draft'] + # Used in drafts 01 - 03 + @headers['sec-websocket-draft'].to_i + elsif @headers['sec-websocket-key1'] + 76 + else + 75 + end + + # Additional handling of bytes after the header if required + case version + when 75 + if !remains.empty? + raise HandshakeError, "Extra bytes after header" + end + when 76, 1..3 + if remains.length < 8 + # The whole third-key has not been received yet. + return nil + elsif remains.length > 8 + raise HandshakeError, "Extra bytes after third key" + end + @headers['third-key'] = remains + end + + handshake_klass = case version + when 75 + Handshake75 + when 76, 1..3 + Handshake76 + when 5, 6, 7, 8, 13 + Handshake04 + else + # According to spec should abort the connection + raise HandshakeError, "Protocol version #{version} not supported" + end + + upgrade_response = handshake_klass.handshake(@headers, @parser.request_url, @secure) + + handler_klass = Handler.klass_factory(version) + + @protocol_version = version + succeed(upgrade_response, handler_klass) + rescue HandshakeError => e + fail(e) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake04.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake04.rb new file mode 100644 index 000000000000..76007876fdfd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake04.rb @@ -0,0 +1,37 @@ +require 'digest/sha1' +require 'base64' + +module EventMachine + module WebSocket + module Handshake04 + def self.handshake(headers, _, __) + # Required + unless key = headers['sec-websocket-key'] + raise HandshakeError, "sec-websocket-key header is required" + end + + string_to_sign = "#{key}258EAFA5-E914-47DA-95CA-C5AB0DC85B11" + signature = Base64.encode64(Digest::SHA1.digest(string_to_sign)).chomp + + upgrade = ["HTTP/1.1 101 Switching Protocols"] + upgrade << "Upgrade: websocket" + upgrade << "Connection: Upgrade" + upgrade << "Sec-WebSocket-Accept: #{signature}" + if protocol = headers['sec-websocket-protocol'] + validate_protocol!(protocol) + upgrade << "Sec-WebSocket-Protocol: #{protocol}" + end + + # TODO: Support sec-websocket-protocol selection + # TODO: sec-websocket-extensions + + return upgrade.join("\r\n") + "\r\n\r\n" + end + + def self.validate_protocol!(protocol) + raise HandshakeError, "Invalid WebSocket-Protocol: empty" if protocol.empty? + # TODO: Validate characters + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake75.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake75.rb new file mode 100644 index 000000000000..65b744fc5e58 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake75.rb @@ -0,0 +1,28 @@ +module EventMachine + module WebSocket + module Handshake75 + def self.handshake(headers, path, secure) + scheme = (secure ? "wss" : "ws") + location = "#{scheme}://#{headers['host']}#{path}" + + upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" + upgrade << "Upgrade: WebSocket\r\n" + upgrade << "Connection: Upgrade\r\n" + upgrade << "WebSocket-Origin: #{headers['origin']}\r\n" + upgrade << "WebSocket-Location: #{location}\r\n" + if protocol = headers['sec-websocket-protocol'] + validate_protocol!(protocol) + upgrade << "Sec-WebSocket-Protocol: #{protocol}\r\n" + end + upgrade << "\r\n" + + return upgrade + end + + def self.validate_protocol!(protocol) + raise HandshakeError, "Invalid WebSocket-Protocol: empty" if protocol.empty? + # TODO: Validate characters + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake76.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake76.rb new file mode 100644 index 000000000000..c18260de9750 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/handshake76.rb @@ -0,0 +1,72 @@ +require 'digest/md5' + +module EventMachine::WebSocket + module Handshake76 + class << self + def handshake(headers, path, secure) + challenge_response = solve_challenge( + headers['sec-websocket-key1'], + headers['sec-websocket-key2'], + headers['third-key'] + ) + + scheme = (secure ? "wss" : "ws") + location = "#{scheme}://#{headers['host']}#{path}" + + upgrade = "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" + upgrade << "Upgrade: WebSocket\r\n" + upgrade << "Connection: Upgrade\r\n" + upgrade << "Sec-WebSocket-Location: #{location}\r\n" + upgrade << "Sec-WebSocket-Origin: #{headers['origin']}\r\n" + if protocol = headers['sec-websocket-protocol'] + validate_protocol!(protocol) + upgrade << "Sec-WebSocket-Protocol: #{protocol}\r\n" + end + upgrade << "\r\n" + upgrade << challenge_response + + return upgrade + end + + private + + def solve_challenge(first, second, third) + # Refer to 5.2 4-9 of the draft 76 + sum = [numbers_over_spaces(first)].pack("N*") + + [numbers_over_spaces(second)].pack("N*") + + third + Digest::MD5.digest(sum) + end + + def numbers_over_spaces(string) + unless string + raise HandshakeError, "WebSocket key1 or key2 is missing" + end + + numbers = string.scan(/[0-9]/).join.to_i + + spaces = string.scan(/ /).size + # As per 5.2.5, abort the connection if spaces are zero. + raise HandshakeError, "Websocket Key1 or Key2 does not contain spaces - this is a symptom of a cross-protocol attack" if spaces == 0 + + # As per 5.2.6, abort if numbers is not an integral multiple of spaces + if numbers % spaces != 0 + raise HandshakeError, "Invalid Key #{string.inspect}" + end + + quotient = numbers / spaces + + if quotient > 2**32-1 + raise HandshakeError, "Challenge computation out of range for key #{string.inspect}" + end + + return quotient + end + + def validate_protocol!(protocol) + raise HandshakeError, "Invalid WebSocket-Protocol: empty" if protocol.empty? + # TODO: Validate characters + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/masking04.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/masking04.rb new file mode 100644 index 000000000000..ad050e9af5de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/masking04.rb @@ -0,0 +1,37 @@ +module EventMachine + module WebSocket + class MaskedString < String + # Read a 4 bit XOR mask - further requested bytes will be unmasked + def read_mask + if respond_to?(:encoding) && encoding.name != "ASCII-8BIT" + raise "MaskedString only operates on BINARY strings" + end + raise "Too short" if bytesize < 4 # TODO - change + @masking_key = String.new(self[0..3]) + end + + # Removes the mask, behaves like a normal string again + def unset_mask + @masking_key = nil + end + + def getbyte(index) + if defined?(@masking_key) && @masking_key + masked_char = super + masked_char ? masked_char ^ @masking_key.getbyte(index % 4) : nil + else + super + end + end + + def getbytes(start_index, count) + data = '' + data.force_encoding('ASCII-8BIT') if data.respond_to?(:force_encoding) + count.times do |i| + data << getbyte(start_index + i) + end + data + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/message_processor_03.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/message_processor_03.rb new file mode 100644 index 000000000000..c5dec70091ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/message_processor_03.rb @@ -0,0 +1,47 @@ +# encoding: BINARY + +module EventMachine + module WebSocket + module MessageProcessor03 + def message(message_type, extension_data, application_data) + case message_type + when :close + @close_info = { + :code => 1005, + :reason => "", + :was_clean => true, + } + if @state == :closing + # TODO: Check that message body matches sent data + # We can close connection immediately since there is no more data + # is allowed to be sent or received on this connection + @connection.close_connection + else + # Acknowlege close + # The connection is considered closed + send_frame(:close, application_data) + @connection.close_connection_after_writing + end + when :ping + # Pong back the same data + send_frame(:pong, application_data) + @connection.trigger_on_ping(application_data) + when :pong + @connection.trigger_on_pong(application_data) + when :text + if application_data.respond_to?(:force_encoding) + application_data.force_encoding("UTF-8") + end + @connection.trigger_on_message(application_data) + when :binary + @connection.trigger_on_binary(application_data) + end + end + + # Ping & Pong supported + def pingable? + true + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/message_processor_06.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/message_processor_06.rb new file mode 100644 index 000000000000..25ca5d2dbe1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/message_processor_06.rb @@ -0,0 +1,78 @@ +module EventMachine + module WebSocket + module MessageProcessor06 + def message(message_type, extension_data, application_data) + debug [:message_received, message_type, application_data] + + case message_type + when :close + status_code = case application_data.length + when 0 + # close messages MAY contain a body + nil + when 1 + # Illegal close frame + raise WSProtocolError, "Close frames with a body must contain a 2 byte status code" + else + application_data.slice!(0, 2).unpack('n').first + end + + debug [:close_frame_received, status_code, application_data] + + @close_info = { + :code => status_code || 1005, + :reason => application_data, + :was_clean => true, + } + + if @state == :closing + # We can close connection immediately since no more data may be + # sent or received on this connection + @connection.close_connection + elsif @state == :connected + # Acknowlege close & echo status back to client + # The connection is considered closed + close_data = [status_code || 1000].pack('n') + send_frame(:close, close_data) + @connection.close_connection_after_writing + end + when :ping + # There are a couple of protections here against malicious/broken WebSocket abusing ping frames. + # + # 1. Delay 200ms before replying. This reduces the number of pings from WebSocket clients behaving as + # `for (;;) { send_ping(conn); rcv_pong(conn); }`. The spec says we "SHOULD respond with Pong frame as soon + # as is practical". + # 2. Reply at most every 200ms. This reduces the number of pong frames sent to WebSocket clients behaving as + # `for (;;) { send_ping(conn); }`. The spec says "If an endpoint receives a Ping frame and has not yet sent + # Pong frame(s) in response to previous Ping frame(s), the endpoint MAY elect to send a Pong frame for only + # the most recently processed Ping frame." + @most_recent_pong_application_data = application_data + if @pong_timer == nil then + @pong_timer = EventMachine.add_timer(0.2) do + @pong_timer = nil + send_frame(:pong, @most_recent_pong_application_data) + end + end + @connection.trigger_on_ping(application_data) + when :pong + @connection.trigger_on_pong(application_data) + when :text + if application_data.respond_to?(:force_encoding) + application_data.force_encoding("UTF-8") + unless application_data.valid_encoding? + raise InvalidDataError, "Invalid UTF8 data" + end + end + @connection.trigger_on_message(application_data) + when :binary + @connection.trigger_on_binary(application_data) + end + end + + # Ping & Pong supported + def pingable? + true + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/version.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/version.rb new file mode 100644 index 000000000000..81893d7649b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/version.rb @@ -0,0 +1,5 @@ +module EventMachine + module Websocket + VERSION = "0.5.2" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/websocket.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/websocket.rb new file mode 100644 index 000000000000..02e4d86f9053 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/lib/em-websocket/websocket.rb @@ -0,0 +1,56 @@ +module EventMachine + module WebSocket + class << self + attr_accessor :max_frame_size + attr_accessor :close_timeout + end + @max_frame_size = 10 * 1024 * 1024 # 10MB + # Connections are given 60s to close after being sent a close handshake + @close_timeout = 60 + + # All errors raised by em-websocket should descend from this class + class WebSocketError < RuntimeError; end + + # Used for errors that occur during WebSocket handshake + class HandshakeError < WebSocketError; end + + # Used for errors which should cause the connection to close. + # See RFC6455 §7.4.1 for a full description of meanings + class WSProtocolError < WebSocketError + def code; 1002; end + end + + class InvalidDataError < WSProtocolError + def code; 1007; end + end + + # 1009: Message too big to process + class WSMessageTooBigError < WSProtocolError + def code; 1009; end + end + + # Start WebSocket server, including starting eventmachine run loop + def self.start(options, &blk) + EM.epoll + EM.run { + trap("TERM") { stop } + trap("INT") { stop } + + run(options, &blk) + } + end + + # Start WebSocket server inside eventmachine run loop + def self.run(options) + host, port = options.values_at(:host, :port) + EM.start_server(host, port, Connection, options) do |c| + yield c + end + end + + def self.stop + puts "Terminating WebSocket Server" + EM.stop + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/helper.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/helper.rb new file mode 100644 index 000000000000..76e45b567004 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/helper.rb @@ -0,0 +1,173 @@ +# encoding: BINARY + +require 'rubygems' +require 'rspec' +require 'em-spec/rspec' +require 'em-http' + +require 'em-websocket' +require 'em-websocket-client' + +require 'integration/shared_examples' +require 'integration/gte_03_examples' + +RSpec.configure do |c| + c.mock_with :rspec +end + +class FakeWebSocketClient < EM::Connection + attr_reader :handshake_response, :packets + + def onopen(&blk); @onopen = blk; end + def onclose(&blk); @onclose = blk; end + def onerror(&blk); @onerror = blk; end + def onmessage(&blk); @onmessage = blk; end + + def initialize + @state = :new + @packets = [] + end + + def receive_data(data) + # puts "RECEIVE DATA #{data}" + if @state == :new + @handshake_response = data + @onopen.call if defined? @onopen + @state = :open + else + @onmessage.call(data) if defined? @onmessage + @packets << data + end + end + + def send(application_data) + send_frame(:text, application_data) + end + + def send_frame(type, application_data) + send_data construct_frame(type, application_data) + end + + def unbind + @onclose.call if defined? @onclose + end + + private + + def construct_frame(type, data) + "\x00#{data}\xff" + end +end + +class Draft03FakeWebSocketClient < FakeWebSocketClient + private + + def construct_frame(type, data) + frame = "" + frame << EM::WebSocket::Framing03::FRAME_TYPES[type] + frame << encoded_length(data.size) + frame << data + end + + def encoded_length(length) + if length <= 125 + [length].pack('C') # since rsv4 is 0 + elsif length < 65536 # write 2 byte length + "\126#{[length].pack('n')}" + else # write 8 byte length + "\127#{[length >> 32, length & 0xFFFFFFFF].pack("NN")}" + end + end +end + +class Draft05FakeWebSocketClient < Draft03FakeWebSocketClient + private + + def construct_frame(type, data) + frame = "" + frame << "\x00\x00\x00\x00" # Mask with nothing for simplicity + frame << (EM::WebSocket::Framing05::FRAME_TYPES[type] | 0b10000000) + frame << encoded_length(data.size) + frame << data + end +end + +class Draft07FakeWebSocketClient < Draft05FakeWebSocketClient + private + + def construct_frame(type, data) + frame = "" + frame << (EM::WebSocket::Framing07::FRAME_TYPES[type] | 0b10000000) + # Should probably mask the data, but I get away without bothering since + # the server doesn't enforce that incoming frames are masked + frame << encoded_length(data.size) + frame << data + end +end + +# Wrapper around em-websocket-client +class Draft75WebSocketClient + def onopen(&blk); @onopen = blk; end + def onclose(&blk); @onclose = blk; end + def onerror(&blk); @onerror = blk; end + def onmessage(&blk); @onmessage = blk; end + + def initialize + @ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/', + :version => 75, + :origin => 'http://example.com') + @ws.errback { |err| @onerror.call if defined? @onerror } + @ws.callback { @onopen.call if defined? @onopen } + @ws.stream { |msg| @onmessage.call(msg) if defined? @onmessage } + @ws.disconnect { @onclose.call if defined? @onclose } + end + + def send(message) + @ws.send_msg(message) + end + + def close_connection + @ws.close_connection + end +end + +def start_server(opts = {}) + EM::WebSocket.run({:host => "0.0.0.0", :port => 12345}.merge(opts)) { |ws| + yield ws if block_given? + } +end + +def format_request(r) + data = "#{r[:method]} #{r[:path]} HTTP/1.1\r\n" + header_lines = r[:headers].map { |k,v| "#{k}: #{v}" } + data << [header_lines, '', r[:body]].join("\r\n") + data +end + +def format_response(r) + data = r[:protocol] || "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" + header_lines = r[:headers].map { |k,v| "#{k}: #{v}" } + data << [header_lines, '', r[:body]].join("\r\n") + data +end + +RSpec::Matchers.define :succeed_with_upgrade do |response| + match do |actual| + success = nil + actual.callback { |upgrade_response, handler_klass| + success = (upgrade_response.lines.sort == format_response(response).lines.sort) + } + success + end +end + +RSpec::Matchers.define :fail_with_error do |error_klass, error_message| + match do |actual| + success = nil + actual.errback { |e| + success = (e.class == error_klass) + success &= (e.message == error_message) if error_message + } + success + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/common_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/common_spec.rb new file mode 100644 index 000000000000..c89f871c0499 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/common_spec.rb @@ -0,0 +1,138 @@ +require 'helper' + +# These tests are not specific to any particular draft of the specification +# +describe "WebSocket server" do + include EM::SpecHelper + default_timeout 1 + + it "should fail on non WebSocket requests" do + em { + EM.add_timer(0.1) do + http = EM::HttpRequest.new('http://127.0.0.1:12345/').get :timeout => 0 + http.errback { done } + http.callback { fail } + end + + start_server + } + end + + it "should expose the WebSocket request headers, path and query params" do + em { + EM.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/', + :origin => 'http://example.com') + ws.errback { fail } + ws.callback { ws.close_connection } + ws.stream { |msg| } + end + + start_server do |ws| + ws.onopen { |handshake| + headers = handshake.headers + headers["Connection"].should == "Upgrade" + headers["Upgrade"].should == "websocket" + headers["Host"].to_s.should == "127.0.0.1:12345" + handshake.path.should == "/" + handshake.query.should == {} + handshake.origin.should == 'http://example.com' + } + ws.onclose { + ws.state.should == :closed + done + } + end + } + end + + it "should expose the WebSocket path and query params when nonempty" do + em { + EM.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/hello?foo=bar&baz=qux') + ws.errback { fail } + ws.callback { + ws.close_connection + } + ws.stream { |msg| } + end + + start_server do |ws| + ws.onopen { |handshake| + handshake.path.should == '/hello' + handshake.query_string.split('&').sort. + should == ["baz=qux", "foo=bar"] + handshake.query.should == {"foo"=>"bar", "baz"=>"qux"} + } + ws.onclose { + ws.state.should == :closed + done + } + end + } + end + + it "should raise an exception if frame sent before handshake complete" do + em { + # 1. Start WebSocket server + start_server { |ws| + # 3. Try to send a message to the socket + lambda { + ws.send('early message') + }.should raise_error('Cannot send data before onopen callback') + done + } + + # 2. Connect a dumb TCP connection (will not send handshake) + EM.connect('0.0.0.0', 12345, EM::Connection) + } + end + + it "should allow the server to be started inside an existing EM" do + em { + EM.add_timer(0.1) do + http = EM::HttpRequest.new('http://127.0.0.1:12345/').get :timeout => 0 + http.errback { |e| done } + http.callback { fail } + end + + start_server do |ws| + ws.onopen { |handshake| + headers = handshake.headers + headers["Host"].to_s.should == "127.0.0.1:12345" + } + ws.onclose { + ws.state.should == :closed + done + } + end + } + end + + context "outbound limit set" do + it "should close the connection if the limit is reached" do + em { + start_server(:outbound_limit => 150) do |ws| + # Increase the message size by one on each loop + ws.onmessage{|msg| ws.send(msg + "x") } + ws.onclose{|status| + status[:code].should == 1006 # Unclean + status[:was_clean].should be false + } + end + + EM.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/') + ws.callback { ws.send_msg "hello" } + ws.disconnect { done } # Server closed the connection + ws.stream { |msg| + # minus frame size ? (getting 146 max here) + msg.data.size.should <= 150 + # Return back the message + ws.send_msg(msg.data) + } + end + } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft03_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft03_spec.rb new file mode 100644 index 000000000000..f299ab6d50b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft03_spec.rb @@ -0,0 +1,298 @@ +require 'helper' + +describe "draft03" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key2' => '12998 5 Y3 1 .P00', + 'Sec-WebSocket-Protocol' => 'sample', + 'Upgrade' => 'WebSocket', + 'Sec-WebSocket-Key1' => '4 @1 46546xW%0l 1 5', + 'Origin' => 'http://example.com', + 'Sec-WebSocket-Draft' => '3' + }, + :body => '^n:ds[4U' + } + + @response = { + :headers => { + "Upgrade" => "WebSocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Location" => "ws://example.com/demo", + "Sec-WebSocket-Origin" => "http://example.com", + "Sec-WebSocket-Protocol" => "sample" + }, + :body => "8jKS\'y:G*Co,Wxa-" + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, Draft03FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 3 } + end + + it_behaves_like "a WebSocket server drafts 3 and above" do + let(:version) { 3 } + end + + # These examples are straight from the spec + # http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-03#section-4.6 + describe "examples from the spec" do + it "should accept a single-frame text message" do + em { + start_server { |ws| + ws.onmessage { |msg| + msg.should == 'Hello' + done + } + } + start_client { |client| + client.onopen { + client.send_data("\x04\x05Hello") + } + } + } + end + + it "should accept a fragmented text message" do + em { + start_server { |ws| + ws.onmessage { |msg| + msg.should == 'Hello' + done + } + } + + connection = start_client + + # Send frame + connection.onopen { + connection.send_data("\x84\x03Hel") + connection.send_data("\x00\x02lo") + } + } + end + + it "should accept a ping request and respond with the same body" do + em { + start_server + + connection = start_client + + # Send frame + connection.onopen { + connection.send_data("\x02\x05Hello") + } + + connection.onmessage { |frame| + next if frame.nil? + frame.should == "\x03\x05Hello" + done + } + } + end + + it "should accept a 256 bytes binary message in a single frame" do + em { + data = "a" * 256 + + start_server { |ws| + ws.onbinary { |msg| + msg.encoding.should == Encoding.find("BINARY") if defined?(Encoding) + msg.should == data + done + } + } + + connection = start_client + + # Send frame + connection.onopen { + connection.send_data("\x05\x7E\x01\x00" + data) + } + } + end + + it "should accept a 64KiB binary message in a single frame" do + em { + data = "a" * 65536 + + start_server { |ws| + ws.onbinary { |msg| + msg.encoding.should == Encoding.find("BINARY") if defined?(Encoding) + msg.should == data + done + } + } + + connection = start_client + + # Send frame + connection.onopen { + connection.send_data("\x05\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data) + } + } + end + end + + describe "close handling" do + it "should respond to a new close frame with a close frame" do + em { + start_server + + connection = start_client + + # Send close frame + connection.onopen { + connection.send_data("\x01\x00") + } + + # Check that close ack received + connection.onmessage { |frame| + frame.should == "\x01\x00" + done + } + } + end + + it "should close the connection on receiving a close acknowlegement and call onclose with close code 1005 and was_clean=true (initiated by server)" do + em { + ack_received = false + + start_server { |ws| + ws.onopen { + # 2. Send a close frame + EM.next_tick { + ws.close + } + } + + # 5. Onclose event on server + ws.onclose { |event| + event.should == { + :code => 1005, + :reason => "", + :was_clean => true, + } + done + } + } + + # 1. Create a fake client which sends draft 76 handshake + connection = start_client + + # 3. Check that close frame recieved and acknowlege it + connection.onmessage { |frame| + frame.should == "\x01\x00" + ack_received = true + connection.send_data("\x01\x00") + } + + # 4. Check that connection is closed _after_ the ack + connection.onclose { + ack_received.should == true + } + } + end + + # it "should repur" + # + it "should return close code 1005 and was_clean=true after closing handshake (initiated by client)" do + em { + start_server { |ws| + ws.onclose { |event| + event.should == { + :code => 1005, + :reason => "", + :was_clean => true, + } + done + } + } + start_client { |client| + client.onopen { + client.send_data("\x01\x00") + } + } + } + end + + it "should not allow data frame to be sent after close frame sent" do + em { + start_server { |ws| + ws.onopen { + # 2. Send a close frame + EM.next_tick { + ws.close + } + + # 3. Check that exception raised if I attempt to send more data + EM.add_timer(0.1) { + lambda { + ws.send('hello world') + }.should raise_error(EM::WebSocket::WebSocketError, 'Cannot send data frame since connection is closing') + done + } + } + } + + # 1. Create a fake client which sends draft 76 handshake + start_client + } + end + + it "should still respond to control frames after close frame sent" do + em { + start_server { |ws| + ws.onopen { + # 2. Send a close frame + EM.next_tick { + ws.close + } + } + } + + # 1. Create a fake client which sends draft 76 handshake + connection = start_client + + connection.onmessage { |frame| + if frame == "\x01\x00" + # 3. After the close frame is received send a ping frame, but + # don't respond with a close ack + connection.send_data("\x02\x05Hello") + else + # 4. Check that the pong is received + frame.should == "\x03\x05Hello" + done + end + } + } + end + + it "should report that close codes are not supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == false + done + } + } + start_client + } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft05_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft05_spec.rb new file mode 100644 index 000000000000..e07ea2820c00 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft05_spec.rb @@ -0,0 +1,50 @@ +require 'helper' + +describe "draft05" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Upgrade' => 'websocket', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key' => 'dGhlIHNhbXBsZSBub25jZQ==', + 'Sec-WebSocket-Protocol' => 'sample', + 'Sec-WebSocket-Origin' => 'http://example.com', + 'Sec-WebSocket-Version' => '5' + } + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, Draft05FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 5 } + end + + it_behaves_like "a WebSocket server drafts 3 and above" do + let(:version) { 5 } + end + + it "should report that close codes are not supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == false + done + } + } + start_client + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft06_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft06_spec.rb new file mode 100644 index 000000000000..ae213cba4020 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft06_spec.rb @@ -0,0 +1,145 @@ +require 'helper' + +describe "draft06" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Upgrade' => 'websocket', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key' => 'dGhlIHNhbXBsZSBub25jZQ==', + 'Sec-WebSocket-Protocol' => 'sample', + 'Sec-WebSocket-Origin' => 'http://example.com', + 'Sec-WebSocket-Version' => '6' + } + } + + @response = { + :protocol => "HTTP/1.1 101 Switching Protocols\r\n", + :headers => { + "Upgrade" => "websocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Accept" => "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "Sec-WebSocket-Protocol" => "sample", + } + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, Draft05FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 6 } + end + + it_behaves_like "a WebSocket server drafts 3 and above" do + let(:version) { 6 } + end + + it "should open connection" do + em { + start_server { |server| + server.onopen { + server.instance_variable_get(:@handler).class.should == EventMachine::WebSocket::Handler06 + } + } + + start_client { |client| + client.onopen { + client.handshake_response.lines.sort. + should == format_response(@response).lines.sort + done + } + } + } + end + + it "should accept a single-frame text message (masked)" do + em { + start_server { |server| + server.onmessage { |msg| + msg.should == 'Hello' + if msg.respond_to?(:encoding) + msg.encoding.should == Encoding.find("UTF-8") + end + done + } + server.onerror { + fail + } + } + + start_client { |client| + client.onopen { + client.send_data("\x00\x00\x01\x00\x84\x05Ielln") + } + } + } + end + + it "should return close code and reason if closed via handshake" do + em { + start_server { |ws| + ws.onclose { |event| + # 2. Receive close event in server + event.should == { + :code => 4004, + :reason => "close reason", + :was_clean => true, + } + done + } + } + start_client { |client| + client.onopen { + # 1: Send close handshake + close_data = [4004].pack('n') + close_data << "close reason" + client.send_frame(:close, close_data) + } + } + } + end + + it "should return close code 1005 if no code was specified" do + em { + start_server { |ws| + ws.onclose { |event| + event.should == { + :code => 1005, + :reason => "", + :was_clean => true, + } + done + } + } + start_client { |client| + client.onopen { + client.send_frame(:close, '') + } + } + } + end + + it "should report that close codes are supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == true + done + } + } + start_client + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft13_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft13_spec.rb new file mode 100644 index 000000000000..10dc2a3345b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft13_spec.rb @@ -0,0 +1,105 @@ +# encoding: BINARY + +require 'helper' + +describe "draft13" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Upgrade' => 'websocket', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key' => 'dGhlIHNhbXBsZSBub25jZQ==', + 'Sec-WebSocket-Protocol' => 'sample', + 'Sec-WebSocket-Origin' => 'http://example.com', + 'Sec-WebSocket-Version' => '13' + } + } + + @response = { + :protocol => "HTTP/1.1 101 Switching Protocols\r\n", + :headers => { + "Upgrade" => "websocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Accept" => "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "Sec-WebSocket-Protocol" => "sample", + } + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, Draft07FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 13 } + end + + it_behaves_like "a WebSocket server drafts 3 and above" do + let(:version) { 13 } + end + + it "should send back the correct handshake response" do + em { + start_server + + connection = start_client + + connection.onopen { + connection.handshake_response.lines.sort. + should == format_response(@response).lines.sort + done + } + } + end + + # TODO: This test would be much nicer with a real websocket client... + it "should support sending pings and binding to onpong" do + em { + start_server { |ws| + ws.onopen { + ws.should be_pingable + EM.next_tick { + ws.ping('hello').should == true + } + + } + ws.onpong { |data| + data.should == 'hello' + done + } + } + + connection = start_client + + # Confusing, fake onmessage means any data after the handshake + connection.onmessage { |data| + # This is what a ping looks like + data.should == "\x89\x05hello" + # This is what a pong looks like + connection.send_data("\x8a\x05hello") + } + } + end + + it "should report that close codes are supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == true + done + } + } + start_client + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft75_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft75_spec.rb new file mode 100644 index 000000000000..8d9faec43c45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft75_spec.rb @@ -0,0 +1,123 @@ +require 'helper' + +# These integration tests are older and use a different testing style to the +# integration tests for newer drafts. They use EM::HttpRequest which happens +# to currently estabish a websocket connection using the draft75 protocol. +# +describe "WebSocket server draft75" do + include EM::SpecHelper + default_timeout 1 + + def start_client + client = Draft75WebSocketClient.new + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 75 } + end + + it "should automatically complete WebSocket handshake" do + em { + MSG = "Hello World!" + EventMachine.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/') + ws.errback { fail } + ws.callback { } + + ws.stream { |msg| + msg.data.should == MSG + EventMachine.stop + } + end + + start_server { |ws| + ws.onopen { + ws.send MSG + } + } + } + end + + it "should split multiple messages into separate callbacks" do + em { + messages = %w[1 2] + received = [] + + EventMachine.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/') + ws.errback { fail } + ws.stream {|msg|} + ws.callback { + ws.send_msg messages[0] + ws.send_msg messages[1] + } + end + + start_server { |ws| + ws.onopen {} + ws.onclose {} + ws.onmessage {|msg| + msg.should == messages[received.size] + received.push msg + + EventMachine.stop if received.size == messages.size + } + } + } + end + + it "should call onclose callback when client closes connection" do + em { + EventMachine.add_timer(0.1) do + ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/') + ws.errback { fail } + ws.callback { + ws.close_connection + } + ws.stream{|msg|} + end + + start_server { |ws| + ws.onopen {} + ws.onclose { + ws.state.should == :closed + EventMachine.stop + } + } + } + end + + it "should call onerror callback with raised exception and close connection on bad handshake" do + em { + EventMachine.add_timer(0.1) do + http = EM::HttpRequest.new('http://127.0.0.1:12345/').get + http.errback { } + http.callback { fail } + end + + start_server { |ws| + ws.onopen { fail } + ws.onclose { EventMachine.stop } + ws.onerror {|e| + e.should be_an_instance_of EventMachine::WebSocket::HandshakeError + e.message.should match('Not an upgrade request') + EventMachine.stop + } + } + } + end + + it "should report that close codes are not supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == false + done + } + } + start_client + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft76_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft76_spec.rb new file mode 100644 index 000000000000..f1a14e60f23a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/draft76_spec.rb @@ -0,0 +1,234 @@ +# encoding: BINARY + +require 'helper' + +describe "WebSocket server draft76" do + include EM::SpecHelper + default_timeout 1 + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key2' => '12998 5 Y3 1 .P00', + 'Sec-WebSocket-Protocol' => 'sample', + 'Upgrade' => 'WebSocket', + 'Sec-WebSocket-Key1' => '4 @1 46546xW%0l 1 5', + 'Origin' => 'http://example.com' + }, + :body => '^n:ds[4U' + } + + @response = { + :headers => { + "Upgrade" => "WebSocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Location" => "ws://example.com/demo", + "Sec-WebSocket-Origin" => "http://example.com", + "Sec-WebSocket-Protocol" => "sample" + }, + :body => "8jKS\'y:G*Co,Wxa-" + } + end + + def start_client + client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) + client.send_data(format_request(@request)) + yield client if block_given? + return client + end + + it_behaves_like "a websocket server" do + let(:version) { 76 } + end + + it "should send back the correct handshake response" do + em { + start_server + + start_client { |connection| + connection.onopen { + connection.handshake_response.lines.sort. + should == format_response(@response).lines.sort + done + } + } + } + end + + it "should send closing frame back and close the connection after recieving closing frame" do + em { + start_server + + connection = start_client + + # Send closing frame after handshake complete + connection.onopen { + connection.send_data(EM::WebSocket::Handler76::TERMINATE_STRING) + } + + # Check that this causes a termination string to be returned and the + # connection close + connection.onclose { + connection.packets[0].should == + EM::WebSocket::Handler76::TERMINATE_STRING + done + } + } + end + + it "should ignore any data received after the closing frame" do + em { + start_server { |ws| + # Fail if foobar message is received + ws.onmessage { |msg| + fail + } + } + + connection = start_client + + # Send closing frame after handshake complete, followed by another msg + connection.onopen { + connection.send_data(EM::WebSocket::Handler76::TERMINATE_STRING) + connection.send('foobar') + } + + connection.onclose { + done + } + } + end + + it "should accept null bytes within the frame after a line return" do + em { + start_server { |ws| + ws.onmessage { |msg| + msg.should == "\n\000" + } + } + + connection = start_client + + # Send closing frame after handshake complete + connection.onopen { + connection.send_data("\000\n\000\377") + connection.send_data(EM::WebSocket::Handler76::TERMINATE_STRING) + } + + connection.onclose { + done + } + } + end + + it "should handle unreasonable frame lengths by calling onerror callback" do + em { + start_server { |server| + server.onerror { |error| + error.should be_an_instance_of EM::WebSocket::WSMessageTooBigError + error.message.should == "Frame length too long (1180591620717411303296 bytes)" + done + } + } + + client = start_client + + # This particular frame indicates a message length of + # 1180591620717411303296 bytes. Such a message would previously cause + # a "bignum too big to convert into `long'" error. + # However it is clearly unreasonable and should be rejected. + client.onopen { + client.send_data("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00") + } + } + end + + it "should handle impossible frames by calling onerror callback" do + em { + start_server { |server| + server.onerror { |error| + error.should be_an_instance_of EM::WebSocket::WSProtocolError + error.message.should == "Invalid frame received" + done + } + } + + client = start_client + + client.onopen { + client.send_data("foobar") # Does not start with \x00 or \xff + } + } + end + + it "should handle invalid http requests by raising HandshakeError passed to onerror callback" do + em { + start_server { |server| + server.onerror { |error| + error.should be_an_instance_of EM::WebSocket::HandshakeError + error.message.should == "Invalid HTTP header: Could not parse data entirely (1 != 29)" + done + } + } + + client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) + client.send_data("This is not a HTTP header\r\n\r\n") + } + end + + it "should handle handshake request split into two TCP packets" do + em { + start_server + + # Create a fake client which sends draft 76 handshake + connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) + data = format_request(@request) + # Sends first half of the request + connection.send_data(data[0...(data.length / 2)]) + + connection.onopen { + connection.handshake_response.lines.sort. + should == format_response(@response).lines.sort + done + } + + EM.add_timer(0.1) do + # Sends second half of the request + connection.send_data(data[(data.length / 2)..-1]) + end + } + end + + it "should report that close codes are not supported" do + em { + start_server { |ws| + ws.onopen { + ws.supports_close_codes?.should == false + done + } + } + start_client + } + end + + it "should call onclose when the server closes the connection [antiregression]" do + em { + start_server { |ws| + ws.onopen { + EM.add_timer(0.1) { + ws.close() + } + } + ws.onclose { + done + } + } + start_client + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/gte_03_examples.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/gte_03_examples.rb new file mode 100644 index 000000000000..f8416185220d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/gte_03_examples.rb @@ -0,0 +1,42 @@ +shared_examples_for "a WebSocket server drafts 3 and above" do + it "should force close connections after a timeout if close handshake is not sent by the client" do + em { + server_onerror_fired = false + server_onclose_fired = false + client_got_close_handshake = false + + start_server(:close_timeout => 0.1) { |ws| + ws.onopen { + # 1: Send close handshake to client + EM.next_tick { ws.close(4999, "Close message") } + } + + ws.onerror { |e| + # 3: Client should receive onerror + e.class.should == EM::WebSocket::WSProtocolError + e.message.should == "Close handshake un-acked after 0.1s, closing tcp connection" + server_onerror_fired = true + } + + ws.onclose { + server_onclose_fired = true + } + } + start_client { |client| + client.onmessage { |msg| + # 2: Client does not respond to close handshake (the fake client + # doesn't understand them at all hence this is in onmessage) + msg.should =~ /Close message/ if version >= 6 + client_got_close_handshake = true + } + + client.onclose { + server_onerror_fired.should == true + server_onclose_fired.should == true + client_got_close_handshake.should == true + done + } + } + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/shared_examples.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/shared_examples.rb new file mode 100644 index 000000000000..0cd6b4249ef1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/integration/shared_examples.rb @@ -0,0 +1,265 @@ +# encoding: UTF-8 + +# These tests are run against all draft versions +# +shared_examples_for "a websocket server" do + it "should expose the protocol version" do + em { + start_server { |ws| + ws.onopen { |handshake| + handshake.protocol_version.should == version + done + } + } + + start_client + } + end + + it "should expose the origin header" do + em { + start_server { |ws| + ws.onopen { |handshake| + handshake.origin.should == 'http://example.com' + done + } + } + + start_client + } + end + + it "should expose the remote IP address" do + em { + start_server { |ws| + ws.onopen { + ws.remote_ip.should == "127.0.0.1" + done + } + } + + start_client + } + end + + it "should send messages successfully" do + em { + start_server { |ws| + ws.onmessage { |message| + message.should == "hello server" + done + } + } + + start_client { |client| + client.onopen { + client.send("hello server") + } + } + } + end + + it "should allow connection to be closed with valid close code" do + em { + start_server { |ws| + ws.onopen { + ws.close(4004, "Bye bye") + done + } + } + + start_client + # TODO: Use a real client which understands how to respond to closing + # handshakes, sending the handshake currently untested + } + end + + it "should raise error if if invalid close code is used" do + em { + start_server { |ws| + ws.onopen { + lambda { + ws.close(2000) + }.should raise_error("Application code may only use codes from 1000, 3000-4999") + done + } + } + + start_client + } + end + + it "should call onclose with was_clean set to false if connection closed without closing handshake by server" do + em { + start_server { |ws| + ws.onopen { + # Close tcp connection (no close handshake) + ws.close_connection + } + ws.onclose { |event| + event.should == {:code => 1006, :was_clean => false} + done + } + } + start_client + } + end + + it "should call onclose with was_clean set to false if connection closed without closing handshake by client" do + em { + start_server { |ws| + ws.onclose { |event| + event.should == {:code => 1006, :was_clean => false} + done + } + } + start_client { |client| + client.onopen { + # Close tcp connection (no close handshake) + client.close_connection + } + } + } + end + + it "should call onerror if an application error raised in onopen" do + em { + start_server { |ws| + ws.onopen { + raise "application error" + } + + ws.onerror { |e| + e.message.should == "application error" + done + } + } + + start_client + } + end + + it "should call onerror if an application error raised in onmessage" do + em { + start_server { |server| + server.onmessage { + raise "application error" + } + + server.onerror { |e| + e.message.should == "application error" + done + } + } + + start_client { |client| + client.onopen { + client.send('a message') + } + } + } + end + + it "should call onerror in an application error raised in onclose" do + em { + start_server { |server| + server.onclose { + raise "application error" + } + + server.onerror { |e| + e.message.should == "application error" + done + } + } + + start_client { |client| + client.onopen { + EM.add_timer(0.1) { + client.close_connection + } + } + } + } + end + + it "should close the connection when a too long frame is sent" do + em { + start_server { |server| + server.max_frame_size = 20 + + server.onerror { |e| + # 3: Error should be reported to server + e.class.should == EventMachine::WebSocket::WSMessageTooBigError + e.message.should =~ /Frame length too long/ + } + } + + start_client { |client| + client.onopen { + EM.next_tick { + client.send("This message is longer than 20 characters") + } + + } + + client.onmessage { |msg| + # 4: This is actually the close message. Really need to use a real + # WebSocket client in these tests... + done + } + + client.onclose { + # 4: Drafts 75 & 76 don't send a close message, they just close the + # connection + done + } + } + } + end + + # Only run these tests on ruby 1.9 + if "a".respond_to?(:force_encoding) + it "should raise error if you try to send non utf8 text data to ws" do + em { + start_server { |server| + server.onopen { + # Create a string which claims to be UTF-8 but which is not + s = "ê" # utf-8 string + s.encode!("ISO-8859-1") + s.force_encoding("UTF-8") + s.valid_encoding?.should == false # now invalid utf8 + + # Send non utf8 encoded data + server.send(s) + } + server.onerror { |error| + error.class.should == EventMachine::WebSocket::WebSocketError + error.message.should == "Data sent to WebSocket must be valid UTF-8 but was UTF-8 (valid: false)" + done + } + } + + start_client { } + } + end + + it "should not change the encoding of strings sent to send [antiregression]" do + em { + start_server { |server| + server.onopen { + s = "example string" + s.force_encoding("UTF-8") + + server.send(s) + + s.encoding.should == Encoding.find("UTF-8") + done + } + } + + start_client { } + } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/unit/framing_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/unit/framing_spec.rb new file mode 100644 index 000000000000..b2a8d33bc65d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/unit/framing_spec.rb @@ -0,0 +1,298 @@ +# encoding: BINARY + +require 'helper' + +describe EM::WebSocket::Framing03 do + class FramingContainer + include EM::WebSocket::Framing03 + + def initialize + @connection = Object.new + def @connection.max_frame_size + 1000000 + end + end + + def <<(data) + @data << data + process_data + end + + def debug(*args); end + end + + before :each do + @f = FramingContainer.new + @f.initialize_framing + end + + describe "basic examples" do + it "connection close" do + @f.should_receive(:message).with(:close, '', '') + @f << 0b00000001 + @f << 0b00000000 + end + + it "ping" do + @f.should_receive(:message).with(:ping, '', '') + @f << 0b00000010 + @f << 0b00000000 + end + + it "pong" do + @f.should_receive(:message).with(:pong, '', '') + @f << 0b00000011 + @f << 0b00000000 + end + + it "text" do + @f.should_receive(:message).with(:text, '', 'foo') + @f << 0b00000100 + @f << 0b00000011 + @f << 'foo' + end + + it "Text in two frames" do + @f.should_receive(:message).with(:text, '', 'hello world') + @f << 0b10000100 + @f << 0b00000110 + @f << "hello " + @f << 0b00000000 + @f << 0b00000101 + @f << "world" + end + + it "2 byte extended payload length text frame" do + data = 'a' * 256 + @f.should_receive(:message).with(:text, '', data) + @f << 0b00000100 # Single frame, text + @f << 0b01111110 # Length 126 (so read 2 bytes) + @f << 0b00000001 # Two bytes in network byte order (256) + @f << 0b00000000 + @f << data + end + end + + # These examples are straight from the spec + # http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-03#section-4.6 + describe "examples from the spec" do + it "a single-frame text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x04\x05Hello" + end + + it "a fragmented text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x84\x03Hel" + @f << "\x00\x02lo" + end + + it "Ping request and response" do + @f.should_receive(:message).with(:ping, '', 'Hello') + @f << "\x02\x05Hello" + end + + it "256 bytes binary message in a single frame" do + data = "a"*256 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x05\x7E\x01\x00" + data + end + + it "64KiB binary message in a single frame" do + data = "a"*65536 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x05\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data + end + end + + describe "other tests" do + it "should accept a fragmented unmasked text message in 3 frames" do + @f.should_receive(:message).with(:text, '', 'Hello world') + @f << "\x84\x03Hel" + @f << "\x80\x02lo" + @f << "\x00\x06 world" + end + end + + describe "error cases" do + it "should raise an exception on continuation frame without preceeding more frame" do + lambda { + @f << 0b00000000 # Single frame, continuation + @f << 0b00000001 # Length 1 + @f << 'f' + }.should raise_error(EM::WebSocket::WebSocketError, 'Continuation frame not expected') + end + end +end + +# These examples are straight from the spec +# http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-03#section-4.6 +describe EM::WebSocket::Framing04 do + class FramingContainer04 + include EM::WebSocket::Framing04 + + def initialize + @connection = Object.new + def @connection.max_frame_size + 1000000 + end + end + + def <<(data) + @data << data + process_data + end + + def debug(*args); end + end + + before :each do + @f = FramingContainer04.new + @f.initialize_framing + end + + describe "examples from the spec" do + it "a single-frame text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x84\x05\x48\x65\x6c\x6c\x6f" # "\x84\x05Hello" + end + + it "a fragmented text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x04\x03Hel" + @f << "\x80\x02lo" + end + + it "Ping request" do + @f.should_receive(:message).with(:ping, '', 'Hello') + @f << "\x82\x05Hello" + end + + it "a pong response" do + @f.should_receive(:message).with(:pong, '', 'Hello') + @f << "\x83\x05Hello" + end + + it "256 bytes binary message in a single frame" do + data = "a"*256 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x85\x7E\x01\x00" + data + end + + it "64KiB binary message in a single frame" do + data = "a"*65536 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x85\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data + end + end + + describe "other tests" do + it "should accept a fragmented unmasked text message in 3 frames" do + @f.should_receive(:message).with(:text, '', 'Hello world') + @f << "\x04\x03Hel" + @f << "\x00\x02lo" + @f << "\x80\x06 world" + end + end +end + +describe EM::WebSocket::Framing07 do + class FramingContainer07 + include EM::WebSocket::Framing07 + + def initialize + @connection = Object.new + def @connection.max_frame_size + 1000000 + end + end + + def <<(data) + @data << data + process_data + end + + def debug(*args); end + end + + before :each do + @f = FramingContainer07.new + @f.initialize_framing + end + + # These examples are straight from the spec + # http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07#section-4.6 + describe "examples from the spec" do + it "a single-frame unmakedtext message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x81\x05\x48\x65\x6c\x6c\x6f" # "\x84\x05Hello" + end + + it "a single-frame masked text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x81\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58" # "\x84\x05Hello" + end + + it "a fragmented unmasked text message" do + @f.should_receive(:message).with(:text, '', 'Hello') + @f << "\x01\x03Hel" + @f << "\x80\x02lo" + end + + it "Ping request" do + @f.should_receive(:message).with(:ping, '', 'Hello') + @f << "\x89\x05Hello" + end + + it "a pong response" do + @f.should_receive(:message).with(:pong, '', 'Hello') + @f << "\x8a\x05Hello" + end + + it "256 bytes binary message in a single unmasked frame" do + data = "a"*256 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x82\x7E\x01\x00" + data + end + + it "64KiB binary message in a single unmasked frame" do + data = "a"*65536 + @f.should_receive(:message).with(:binary, '', data) + @f << "\x82\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data + end + end + + describe "other tests" do + it "should raise a WSProtocolError if an invalid frame type is requested" do + lambda { + # Opcode 3 is not supported by this draft + @f << "\x83\x05Hello" + }.should raise_error(EventMachine::WebSocket::WSProtocolError, "Unknown opcode 3") + end + + it "should accept a fragmented unmasked text message in 3 frames" do + @f.should_receive(:message).with(:text, '', 'Hello world') + @f << "\x01\x03Hel" + @f << "\x00\x02lo" + @f << "\x80\x06 world" + end + + it "should raise if non-fin frame is followed by a non-continuation data frame (continuation frame would be expected)" do + lambda { + @f << 0b00000001 # Not fin, text + @f << 0b00000001 # Length 1 + @f << 'f' + @f << 0b10000001 # fin, text (continutation expected) + @f << 0b00000001 # Length 1 + @f << 'b' + }.should raise_error(EM::WebSocket::WebSocketError, 'Continuation frame expected') + end + + it "should raise on non-fin control frames (control frames must not be fragmented)" do + lambda { + @f << 0b00001010 # Not fin, pong (opcode 10) + @f << 0b00000000 # Length 1 + }.should raise_error(EM::WebSocket::WebSocketError, 'Control frames must not be fragmented') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/unit/handshake_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/unit/handshake_spec.rb new file mode 100644 index 000000000000..2754ba7670a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/unit/handshake_spec.rb @@ -0,0 +1,216 @@ +require 'helper' + +describe EM::WebSocket::Handshake do + def handshake(request, secure = false) + handshake = EM::WebSocket::Handshake.new(secure) + handshake.receive_data(format_request(request)) + handshake + end + + before :each do + @request = { + :port => 80, + :method => "GET", + :path => "/demo", + :headers => { + 'Host' => 'example.com', + 'Connection' => 'Upgrade', + 'Sec-WebSocket-Key2' => '12998 5 Y3 1 .P00', + 'Sec-WebSocket-Protocol' => 'sample', + 'Upgrade' => 'WebSocket', + 'Sec-WebSocket-Key1' => '4 @1 46546xW%0l 1 5', + 'Origin' => 'http://example.com' + }, + :body => '^n:ds[4U' + } + @secure_request = @request.merge(:port => 443) + + @response = { + :headers => { + "Upgrade" => "WebSocket", + "Connection" => "Upgrade", + "Sec-WebSocket-Location" => "ws://example.com/demo", + "Sec-WebSocket-Origin" => "http://example.com", + "Sec-WebSocket-Protocol" => "sample" + }, + :body => "8jKS\'y:G*Co,Wxa-" + } + @secure_response = @response.merge(:headers => @response[:headers].merge('Sec-WebSocket-Location' => "wss://example.com/demo")) + end + + it "should handle good request" do + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should handle good request to secure default port if secure mode is enabled" do + handshake(@secure_request, true). + should succeed_with_upgrade(@secure_response) + end + + it "should not handle good request to secure default port if secure mode is disabled" do + handshake(@secure_request, false). + should_not succeed_with_upgrade(@secure_response) + end + + it "should handle good request on nondefault port" do + @request[:port] = 8081 + @request[:headers]['Host'] = 'example.com:8081' + @response[:headers]['Sec-WebSocket-Location'] = + 'ws://example.com:8081/demo' + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should handle good request to secure nondefault port" do + @secure_request[:port] = 8081 + @secure_request[:headers]['Host'] = 'example.com:8081' + @secure_response[:headers]['Sec-WebSocket-Location'] = 'wss://example.com:8081/demo' + + handshake(@secure_request, true). + should succeed_with_upgrade(@secure_response) + end + + it "should handle good request with no protocol" do + @request[:headers].delete('Sec-WebSocket-Protocol') + @response[:headers].delete("Sec-WebSocket-Protocol") + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should handle extra headers by simply ignoring them" do + @request[:headers]['EmptyValue'] = "" + @request[:headers]['AKey'] = "AValue" + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should raise error on HTTP request" do + @request[:headers] = { + 'Host' => 'www.google.com', + 'User-Agent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 GTB6 GTBA', + 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language' => 'en-us,en;q=0.5', + 'Accept-Encoding' => 'gzip,deflate', + 'Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', + 'Keep-Alive' => '300', + 'Connection' => 'keep-alive', + } + + handshake(@request).should fail_with_error(EM::WebSocket::HandshakeError) + end + + it "should raise error on wrong method" do + @request[:method] = 'POST' + + handshake(@request).should fail_with_error(EM::WebSocket::HandshakeError) + end + + it "should raise error if upgrade header incorrect" do + @request[:headers]['Upgrade'] = 'NonWebSocket' + + handshake(@request).should fail_with_error(EM::WebSocket::HandshakeError) + end + + it "should raise error if Sec-WebSocket-Protocol is empty" do + @request[:headers]['Sec-WebSocket-Protocol'] = '' + + handshake(@request).should fail_with_error(EM::WebSocket::HandshakeError) + end + + %w[Sec-WebSocket-Key1 Sec-WebSocket-Key2].each do |header| + it "should raise error if #{header} has zero spaces" do + @request[:headers][header] = 'nospaces' + + handshake(@request). + should fail_with_error(EM::WebSocket::HandshakeError, 'Websocket Key1 or Key2 does not contain spaces - this is a symptom of a cross-protocol attack') + end + end + + it "should raise error if Sec-WebSocket-Key1 is missing" do + @request[:headers].delete("Sec-WebSocket-Key1") + + # The error message isn't correct since key1 is used to heuristically + # determine the protocol version in use, however this test at least checks + # that the handshake does correctly fail + handshake(@request). + should fail_with_error(EM::WebSocket::HandshakeError, 'Extra bytes after header') + end + + it "should raise error if Sec-WebSocket-Key2 is missing" do + @request[:headers].delete("Sec-WebSocket-Key2") + + handshake(@request). + should fail_with_error(EM::WebSocket::HandshakeError, 'WebSocket key1 or key2 is missing') + end + + it "should raise error if spaces do not divide numbers in Sec-WebSocket-Key* " do + @request[:headers]['Sec-WebSocket-Key2'] = '12998 5 Y3 1.P00' + + handshake(@request). + should fail_with_error(EM::WebSocket::HandshakeError, 'Invalid Key "12998 5 Y3 1.P00"') + end + + it "should raise error if the HTTP header is empty" do + handshake = EM::WebSocket::Handshake.new(false) + handshake.receive_data("\r\n\r\nfoobar") + + handshake. + should fail_with_error(EM::WebSocket::HandshakeError, 'Invalid HTTP header: Could not parse data entirely (4 != 10)') + end + + # This might seems crazy, but very occasionally we saw multiple "Upgrade: + # WebSocket" headers in the wild. RFC 4.2.1 isn't particularly clear on this + # point, so for now I have decided not to accept --@mloughran + it "should raise error on multiple upgrade headers" do + handshake = EM::WebSocket::Handshake.new(false) + + # Add a duplicate upgrade header + headers = format_request(@request) + upgrade_header = "Upgrade: WebSocket\r\n" + headers.gsub!(upgrade_header, "#{upgrade_header}#{upgrade_header}") + + handshake.receive_data(headers) + + handshake.errback { |e| + e.class.should == EM::WebSocket::HandshakeError + e.message.should == 'Invalid upgrade header: ["WebSocket", "WebSocket"]' + } + end + + it "should cope with requests where the header is split" do + request = format_request(@request) + incomplete_request = request[0...(request.length / 2)] + rest = request[(request.length / 2)..-1] + handshake = EM::WebSocket::Handshake.new(false) + handshake.receive_data(incomplete_request) + + handshake.instance_variable_get(:@deferred_status).should == nil + + # Send the remaining header + handshake.receive_data(rest) + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should cope with requests where the third key is split" do + request = format_request(@request) + # Removes last two bytes of the third key + incomplete_request = request[0..-3] + rest = request[-2..-1] + handshake = EM::WebSocket::Handshake.new(false) + handshake.receive_data(incomplete_request) + + handshake.instance_variable_get(:@deferred_status).should == nil + + # Send the remaining third key + handshake.receive_data(rest) + + handshake(@request).should succeed_with_upgrade(@response) + end + + it "should fail if the request URI is invalid" do + @request[:path] = "/%" + handshake(@request).should \ + fail_with_error(EM::WebSocket::HandshakeError, 'Invalid request URI: /%') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/unit/masking_spec.rb b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/unit/masking_spec.rb new file mode 100644 index 000000000000..065aa95526c2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/em-websocket-0.5.2/spec/unit/masking_spec.rb @@ -0,0 +1,29 @@ +# encoding: BINARY + +require 'helper' + +describe EM::WebSocket::MaskedString do + it "should allow reading 4 byte mask and unmasking byte / bytes" do + t = EM::WebSocket::MaskedString.new("\x00\x00\x00\x01\x00\x01\x00\x01") + t.read_mask + t.getbyte(3).should == 0x00 + t.getbytes(4, 4).should == "\x00\x01\x00\x00" + t.getbytes(5, 3).should == "\x01\x00\x00" + end + + it "should return nil from getbyte if index requested is out of range" do + t = EM::WebSocket::MaskedString.new("\x00\x00\x00\x00\x53") + t.read_mask + t.getbyte(4).should == 0x53 + t.getbyte(5).should == nil + end + + it "should allow switching masking on and off" do + t = EM::WebSocket::MaskedString.new("\x02\x00\x00\x00\x03") + t.getbyte(4).should == 0x03 + t.read_mask + t.getbyte(4).should == 0x01 + t.unset_mask + t.getbyte(4).should == 0x03 + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/.gitignore new file mode 100644 index 000000000000..75a08dc66444 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/.gitignore @@ -0,0 +1,8 @@ +*.gem +.bundle +Gemfile.lock +.DS_Store +.yardoc +doc +coverage +.idea diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/.rspec b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/.rspec new file mode 100644 index 000000000000..7d8b8b7fbbda --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/.rspec @@ -0,0 +1,3 @@ +--tty +--color +--format documentation diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/.travis.yml new file mode 100644 index 000000000000..576083b1df49 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/.travis.yml @@ -0,0 +1,30 @@ +language: ruby +cache: bundler +sudo: false + +bundler_args: --without perf +script: bundle exec rake +before_install: + - gem install bundler + +rvm: + - 1.8.7 + - 1.9.2 + - 1.9.3 + - 2.0.0-p648 + - 2.1.10 + - 2.2.10 + - 2.3.7 + - 2.4.4 + - 2.5.1 + - ruby-head + - ree + - jruby-18mode + - jruby-19mode + - jruby-head + +matrix: + allow_failures: + - rvm: ree + - rvm: ruby-head + - rvm: jruby-head diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/CHANGELOG.md new file mode 100644 index 000000000000..4edcf28b1891 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/CHANGELOG.md @@ -0,0 +1,365 @@ +# Changelog + +## Master + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.12.0...master) + +## 0.12.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.11.0...v0.12.0) + +## 0.11.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.10.1...v0.11.0) + +## 0.10.1 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.10.0...v0.10.1) + +## 0.10.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.9.1...v0.10.0) + +## 0.9.1 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.9.0...v0.9.1) + +## 0.9.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.8.1...v0.9.0) + +## 0.8.1 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.8.0...v0.8.1) + +* Support optional escaping of params. + ([Tasos Laskos](https://github.com/zapotek) +* `Easy::Mirror`: Reduced object allocations and method calls during info handling. + ([Tasos Laskos](https://github.com/zapotek) + +## 0.8.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.3...v0.7.4) + +* `Easy::Mirror`: Reduced object allocations and method calls during info handling. + ([Tasos Laskos](https://github.com/zapotek) + +## 0.7.4 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.3...v0.7.4) + +* Support different array encodings for params. + ([Marcello Barnaba](https://github.com/ifad), [\#104](https://github.com/typhoeus/ethon/pull/104)) +* Programtic access to version infos. + ([Jonas Wagner](https://github.com/jwagner), [\#90](https://github.com/typhoeus/ethon/pull/90)) + + +## 0.7.3 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.2...v0.7.3) + +* `Ethon::Curl::FDSet` + * Set `:fd_array` size to the current MS Windows `FD_SETSIZE` (2048). + ([Tasos Laskos](https://github.com/zapotek) + +* Added `redirect_time` value to available informations and `Easy::Mirror`. + ([Adrien Jarthon](https://github.com/jarthod) + +## 0.7.2 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.1...v0.7.2) + +* FFI data-types updated to be more correct. + +## 0.7.1 + +* MS Windows determination delegated to `Gem.windows?` for better accuracy. +* FFI data-types updated to work on MS Windows. + +## 0.7.0 + +Not backwards compatible changes: + +* `mime-types` are no longer a dependency. The gem will be still used if available to determine the mime type of a file which is uploaded. That means you have to have take care of the gem installation yourself. + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.6.3...v0.7.0) + +## 0.6.3 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.6.2...v0.6.3) + +## 0.6.2 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.6.1...v0.6.2) + +## 0.6.1 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.6.0...v0.6.1) + +The changelog entries are coming soon! + +## 0.6.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.12...v0.6.0) + +The changelog entries are coming soon! + +Bugfixes: + + * URL-encode nullbytes in parameters instead of escaping them to `\\0`. + ([Tasos Laskos](https://github.com/zapotek) + +## 0.5.12 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.11...v0.5.12) + +Enhancements: + +* Performance optimizations. + ([Kyle Oppenheim](https://github.com/koppenheim) and [Richie Vos](https://github.com/richievos), [\#48](https://github.com/typhoeus/ethon/pull/48)) +* Reuse memory pointer. + ([Richie Vos](https://github.com/richievos), [\#49](https://github.com/typhoeus/ethon/pull/49)) + +Bugfixes: + +* Fix windows install. + ([Derik Olsson](https://github.com/derikolsson), [\#47](https://github.com/typhoeus/ethon/pull/47)) +* Handle urls that already contain query params. + ([Turner King](https://github.com/turnerking ), [\#45](https://github.com/typhoeus/ethon/pull/45)) + +## 0.5.11 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.10...v0.5.11) + +Enhancements: + +* Add support for postredirs, unrestricted_auth. +* Add support for cookie, cookiejar, cookiefile. + ([erwanlr](https://github.com/erwanlr), [\#46](https://github.com/typhoeus/ethon/pull/46)) +* Relax ffi requirements. + ([voxik](https://github.com/voxik), [\#40](https://github.com/typhoeus/ethon/pull/40)) +* Various documentation improvements. + ([Craig Little](https://github.com/craiglittle)) + +Bugfixes: + +* Fix the memory leaks. + ([Richie Vos](https://github.com/richievos), [\#45](https://github.com/typhoeus/ethon/pull/45)) + +## 0.5.10 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.9...v0.5.10) + +Enhancements: + +* Allow custom requests. + ([Nathan Sutton](https://github.com/nate), [\#36](https://github.com/typhoeus/ethon/pull/36)) +* Use updated version of FFI. + +Bugfixes: + +* Fix windows install issue. + ([brainsucker](https://github.com/brainsucker), [\#38](https://github.com/typhoeus/ethon/pull/38)) + +## 0.5.9 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.8...v0.5.9) + +Enhancements: + +* Allow to set multiple protocols. + +## 0.5.8 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.7...v0.5.8) + +Enhancements: + +* Add support for protocols and redir_protocols( + [libcurl SASL buffer overflow vulnerability](http://curl.haxx.se/docs/adv_20130206.html)). +* Add max_send_speed_large and max_recv_speed_large([Paul Schuegraf](https://github.com/pschuegr), [\#33](https://github.com/typhoeus/ethon/pull/33)) + +## 0.5.7 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.6...v0.5.7) + +Enhancements: + +* Use new version of ffi. + +## 0.5.6 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.4...v0.5.6) + +Bugfixes: + +* Easy#reset resets on_complete callbacks. + +## 0.5.4 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.3...v0.5.4) + +Enhancements: + +* Use Libc#getdtablesize to get the FDSet size. +* New libcurl option accept_encoding. +* Documentation updates. + +## 0.5.3 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.2...v0.5.3) + +Enhancements: + +* Deprecate Easy#prepare. It is no longer necessary. +* Unroll metaprogramming for easy and multi options. +* More specs. + +Bugfixes: + +* Correct size for FDSets +* Add proxytypes to enums. + +## 0.5.2 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.1...v0.5.2) + +Enhancements: + +* New libcurl option keypasswd. + +Bugfixes: + +* Correct request logging when using multi interface. +* Remove invalid libcurl option sslcertpasswd. + +## 0.5.1 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.5.0...v0.5.1) + +Bugfixes: + +* Mark Curl.select and Curl.easy_perform as blocking so that the GIL is + released by ffi. + +## 0.5.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.4...v0.5.0) + +Enhancements: + +* New libcurl option proxyuserpwd +* Rename response_header to response_headers + +Bugfixes: + +* Mark Curl.select and Curl.easy_perform as blocking so that the GIL is + released by ffi. + +## 0.4.4 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.3...v0.4.4) + +Enhancements: + +* Prepare multi explicit like easy + +## 0.4.3 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.2...v0.4.3) + +Enhancements: + +* Remove deprecated libcurl option put +* More documentation +* New libcurl option connecttimeout_ms and timeout_ms +* Support multi options + +Bugfixes: + +* Handle nil values in query params + +## 0.4.2 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.1...v0.4.2) + +Enhancements: + +* New libcurl option forbid_reuse +* Use libcurls escape instead of CGI::escape + +## 0.4.1 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.4.0...v0.4.1) + +Bugfixes: + +* Handle nested hash in an array in params correct + ( [\#201](https://github.com/typhoeus/typhoeus/issues/201) ) + +## 0.4.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.3.0...v0.4.0) + +Enhancements: + +* ruby 1.8.7 compatible +* Ethon.logger +* Deal with string param/body +* More documentation + +Bugfixes: + +* Add multi_cleanup to curl + +## 0.3.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.2.0...v0.3.0) + +Enhancements: + +* New libcurl option proxyport +* Raise invalid value error when providing a wrong key for sslversion or httpauth + +Bugfixes: + +* Libcurl option sslversion is handled correct + +## 0.2.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.1.0...v0.2.0) + +Enhancements: + +* GET requests are using custom requests only when there is a request body +* Easy#on_complete takes multiple callbacks +* raise Errors::GlobalInit when libcurls global_init failed instead of + runtime error +* raise Errors::InvalidOption if option is invalid + +## 0.1.0 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.0.2...v0.1.0) + +Enhancements: + +* Documentation + ( [Alex P](https://github.com/ifesdjeen), [\#13](https://github.com/typhoeus/ethon/issues/13) ) +* New libcurl option dns_cache_timeout + ( [Chris Heald](https://github.com/cheald), [\#192](https://github.com/typhoeus/typhoeus/pull/192) ) + +Bugfixes: + +* Libcurl option ssl_verifyhost takes an integer. +* Add space between header key and value. + +## 0.0.2 + +[Full Changelog](https://github.com/typhoeus/ethon/compare/v0.0.1...v0.0.2) + +Bugfixes: + +* Add libcurl.so.4 to ffi_lib in order to load correct lib on Debian. +* Escape zero bytes. + +## 0.0.1 Initial version diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/Gemfile new file mode 100644 index 000000000000..d73f3ca434be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/Gemfile @@ -0,0 +1,38 @@ +source "https://rubygems.org" +gemspec + +if Gem.ruby_version < Gem::Version.new("1.9.3") + gem "rake", "< 11" +else + gem "rake" +end + +group :development, :test do + gem "rspec", "~> 3.4" + + gem "sinatra" + + if Gem.ruby_version < Gem::Version.new("2.0.0") + gem "json", "< 2" + else + gem "json" + end + + if Gem.ruby_version >= Gem::Version.new("2.0.0") + gem "mime-types", "~> 1.18" + end + + if Gem.ruby_version >= Gem::Version.new("2.2.0") + gem "mustermann" + elsif Gem.ruby_version >= Gem::Version.new("2.1.0") + gem "mustermann", "0.4.0" + elsif Gem.ruby_version >= Gem::Version.new("2.0.0") + gem "mustermann", "0.3.1" + end +end + +group :perf do + gem "benchmark-ips" + gem "patron" + gem "curb" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/Guardfile b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/Guardfile new file mode 100644 index 000000000000..7466aa3d96ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/Guardfile @@ -0,0 +1,9 @@ +# vim:set filetype=ruby: +guard( + "rspec", + :all_after_pass => false, + :cli => "--fail-fast --tty --format documentation --colour") do + + watch(%r{^spec/.+_spec\.rb$}) + watch(%r{^lib/(.+)\.rb$}) { |match| "spec/#{match[1]}_spec.rb" } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/LICENSE b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/LICENSE new file mode 100644 index 000000000000..f064c17b1e7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-2016 Hans Hasselberg + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/README.md b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/README.md new file mode 100644 index 000000000000..31383eae5e4a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/README.md @@ -0,0 +1,95 @@ +[![Gem Version](https://badge.fury.io/rb/ethon.svg)](https://badge.fury.io/rb/ethon) +[![Build Status](https://travis-ci.org/typhoeus/ethon.svg?branch=master)](https://travis-ci.org/typhoeus/ethon) + +# Ethon + +In Greek mythology, Ethon, the son of Typhoeus and Echidna, is a gigantic eagle. So much for the history. +In the modern world, Ethon is a very basic libcurl wrapper using ffi. + +* [Documentation](http://rubydoc.info/github/typhoeus/ethon/frames/Ethon) +* [Website](http://typhoeus.github.com/) +* [Mailing list](http://groups.google.com/group/typhoeus) + +## Installation + +With bundler: + + gem "ethon" + +With rubygems: + + gem install ethon + +## Usage + +Making the first request is simple: + +```ruby +easy = Ethon::Easy.new(url: "www.example.com") +easy.perform +#=> :ok +``` + +You have access to various options, such as following redirects: + +```ruby +easy = Ethon::Easy.new(url: "www.example.com", followlocation: true) +easy.perform +#=> :ok +``` + +Once you're done you can inspect the response code and body: + +```ruby +easy = Ethon::Easy.new(url: "www.example.com", followlocation: true) +easy.perform +easy.response_code +#=> 200 +easy.response_body +#=> "<!doctype html><html ..." +``` + +## Http + +In order to make life easier, there are some helpers for making HTTP requests: + +```ruby +easy = Ethon::Easy.new +easy.http_request("www.example.com", :get, { params: {a: 1} }) +easy.perform +#=> :ok +``` + +```ruby +easy = Ethon::Easy.new +easy.http_request("www.example.com", :post, { params: { a: 1 }, body: { b: 2 } }) +easy.perform +#=> :ok +``` + +This is really handy when making requests since you don't have to care about setting +everything up correctly. + +## LICENSE + +(The MIT License) + +Copyright © 2012-2016 [Hans Hasselberg](http://www.hans.io) + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without +limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/Rakefile new file mode 100644 index 000000000000..1203f5e9bda2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/Rakefile @@ -0,0 +1,39 @@ +require "bundler" +Bundler.setup + +require "rake" +require "rspec/core/rake_task" +$LOAD_PATH.unshift File.expand_path("../lib", __FILE__) +require "ethon/version" + +task :gem => :build +task :build do + system "gem build ethon.gemspec" +end + +task :install => :build do + system "gem install ethon-#{Ethon::VERSION}.gem" +end + +task :release => :build do + system "git tag -a v#{Ethon::VERSION} -m 'Tagging #{Ethon::VERSION}'" + system "git push --tags" + system "gem push ethon-#{Ethon::VERSION}.gem" +end + +RSpec::Core::RakeTask.new(:spec) do |t| + t.verbose = false + t.ruby_opts = "-W -I./spec -rspec_helper" +end + +desc "Start up the test servers" +task :start do + require_relative 'spec/support/boot' + begin + Boot.start_servers(:rake) + rescue Exception + end +end + +task :default => :spec + diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/ethon.gemspec b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/ethon.gemspec new file mode 100644 index 000000000000..b0a56a46de11 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/ethon.gemspec @@ -0,0 +1,25 @@ +# encoding: utf-8 +lib = File.expand_path('../lib/', __FILE__) +$:.unshift lib unless $:.include?(lib) + +require 'ethon/version' + +Gem::Specification.new do |s| + s.name = "ethon" + s.version = Ethon::VERSION + s.platform = Gem::Platform::RUBY + s.authors = ["Hans Hasselberg"] + s.email = ["me@hans.io"] + s.homepage = "https://github.com/typhoeus/ethon" + s.summary = "Libcurl wrapper." + s.description = "Very lightweight libcurl wrapper." + + s.required_rubygems_version = ">= 1.3.6" + s.license = 'MIT' + + s.add_dependency('ffi', ['>= 1.3.0']) + + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- spec/*`.split("\n") + s.require_path = 'lib' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon.rb new file mode 100644 index 000000000000..893bb63bdc41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon.rb @@ -0,0 +1,35 @@ +require 'logger' +require 'ffi' +require 'thread' +begin + require 'mime/types/columnar' +rescue LoadError + begin + require 'mime/types' + rescue LoadError + end +end +require 'tempfile' + +require 'ethon/libc' +require 'ethon/curl' +require 'ethon/easy' +require 'ethon/errors' +require 'ethon/loggable' +require 'ethon/multi' +require 'ethon/version' + +# Ethon is a very simple libcurl. +# It provides direct access to libcurl functionality +# as well as some helpers for doing http requests. +# +# Ethon was extracted from Typhoeus. If you want to +# see how others use Ethon look at the Typhoeus code. +# +# @see https://www.github.com/typhoeus/typhoeus Typhoeus +# +# @note Please update to the latest libcurl version in order +# to benefit from all features and bugfixes. +# http://curl.haxx.se/download.html +module Ethon +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curl.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curl.rb new file mode 100644 index 000000000000..72656957fbf9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curl.rb @@ -0,0 +1,89 @@ +require 'ethon/curls/codes' +require 'ethon/curls/options' +require 'ethon/curls/infos' +require 'ethon/curls/form_options' +require 'ethon/curls/messages' +require 'ethon/curls/functions' + +module Ethon + + # FFI Wrapper module for Curl. Holds constants and required initializers. + # + # @api private + module Curl + extend ::FFI::Library + extend Ethon::Curls::Codes + extend Ethon::Curls::Options + extend Ethon::Curls::Infos + extend Ethon::Curls::FormOptions + extend Ethon::Curls::Messages + + # :nodoc: + def self.windows? + Libc.windows? + end + + require 'ethon/curls/constants' + require 'ethon/curls/settings' + require 'ethon/curls/classes' + extend Ethon::Curls::Functions + + @blocking = true + + @@initialized = false + @@curl_mutex = Mutex.new + + class << self + # This function sets up the program environment that libcurl needs. + # Think of it as an extension of the library loader. + # + # This function must be called at least once within a program (a program is all the + # code that shares a memory space) before the program calls any other function in libcurl. + # The environment it sets up is constant for the life of the program and is the same for + # every program, so multiple calls have the same effect as one call. + # + # The flags option is a bit pattern that tells libcurl exactly what features to init, + # as described below. Set the desired bits by ORing the values together. In normal + # operation, you must specify CURL_GLOBAL_ALL. Don't use any other value unless + # you are familiar with it and mean to control internal operations of libcurl. + # + # This function is not thread safe. You must not call it when any other thread in + # the program (i.e. a thread sharing the same memory) is running. This doesn't just + # mean no other thread that is using libcurl. Because curl_global_init() calls + # functions of other libraries that are similarly thread unsafe, it could conflict with + # any other thread that uses these other libraries. + # + # @raise [ Ethon::Errors::GlobalInit ] If Curl.global_init fails. + def init + @@curl_mutex.synchronize { + if not @@initialized + raise Errors::GlobalInit.new if Curl.global_init(GLOBAL_ALL) != 0 + @@initialized = true + Ethon.logger.debug("ETHON: Libcurl initialized") if Ethon.logger + end + } + end + + # This function releases resources acquired by curl_global_init. + # You should call curl_global_cleanup once for each call you make to + # curl_global_init, after you are done using libcurl. + # This function is not thread safe. You must not call it when any other thread in the + # program (i.e. a thread sharing the same memory) is running. This doesn't just + # mean no other thread that is using libcurl. Because curl_global_cleanup calls functions of other + # libraries that are similarly thread unsafe, it could conflict with + # any other thread that uses these other libraries. + # See the description in libcurl of global environment requirements + # for details of how to use this function. + def cleanup + @@curl_mutex.synchronize { + if @@initialized + Curl.global_cleanup() + @@initialized = false + Ethon.logger.debug("ETHON: Libcurl cleanup") if Ethon.logger + end + } + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/classes.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/classes.rb new file mode 100644 index 000000000000..da629d608034 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/classes.rb @@ -0,0 +1,54 @@ +module Ethon + module Curl + # :nodoc: + class MsgData < ::FFI::Union + layout :whatever, :pointer, :code, :easy_code + end + + # :nodoc: + class Msg < ::FFI::Struct + layout :code, :msg_code, :easy_handle, :pointer, :data, MsgData + end + + class VersionInfoData < ::FFI::Struct + layout :curl_version, :uint8, + :version, :string, + :version_num, :int, + :host, :string, + :features, :int, + :ssl_version, :string, + :ssl_version_num, :long, + :libz_version, :string, + :protocols, :pointer + end + + # :nodoc: + class FDSet < ::FFI::Struct + if Curl.windows? + layout :fd_count, :uint, + # TODO: Make it future proof by dynamically grabbing FD_SETSIZE. + :fd_array, [:uint, 2048] + + def clear; self[:fd_count] = 0; end + else + # FD Set size. + FD_SETSIZE = ::Ethon::Libc.getdtablesize + layout :fds_bits, [:long, FD_SETSIZE / ::FFI::Type::LONG.size] + + # :nodoc: + def clear; super; end + end + end + + # :nodoc: + class Timeval < ::FFI::Struct + if Curl.windows? + layout :sec, :long, + :usec, :long + else + layout :sec, :time_t, + :usec, :suseconds_t + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/codes.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/codes.rb new file mode 100644 index 000000000000..a21f536ee379 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/codes.rb @@ -0,0 +1,122 @@ +module Ethon + module Curls # :nodoc: + + # This module contains all easy and + # multi return codes. + module Codes + + # Libcurl error codes, refer + # https://github.com/bagder/curl/blob/master/include/curl/curl.h for details + def easy_codes + [ + :ok, + :unsupported_protocol, + :failed_init, + :url_malformat, + :not_built_in, + :couldnt_resolve_proxy, + :couldnt_resolve_host, + :couldnt_connect, + :ftp_weird_server_reply, + :remote_access_denied, + :ftp_accept_failed, + :ftp_weird_pass_reply, + :ftp_accept_timeout, + :ftp_weird_pasv_reply, + :ftp_weird_227_format, + :ftp_cant_get_host, + :obsolete16, + :ftp_couldnt_set_type, + :partial_file, + :ftp_couldnt_retr_file, + :obsolete20, + :quote_error, + :http_returned_error, + :write_error, + :obsolete24, + :upload_failed, + :read_error, + :out_of_memory, + :operation_timedout, + :obsolete29, + :ftp_port_failed, + :ftp_couldnt_use_rest, + :obsolete32, + :range_error, + :http_post_error, + :ssl_connect_error, + :bad_download_resume, + :file_couldnt_read_file, + :ldap_cannot_bind, + :ldap_search_failed, + :obsolete40, + :function_not_found, + :aborted_by_callback, + :bad_function_argument, + :obsolete44, + :interface_failed, + :obsolete46, + :too_many_redirects , + :unknown_option, + :telnet_option_syntax , + :obsolete50, + :peer_failed_verification, + :got_nothing, + :ssl_engine_notfound, + :ssl_engine_setfailed, + :send_error, + :recv_error, + :obsolete57, + :ssl_certproblem, + :ssl_cipher, + :ssl_cacert, + :bad_content_encoding, + :ldap_invalid_url, + :filesize_exceeded, + :use_ssl_failed, + :send_fail_rewind, + :ssl_engine_initfailed, + :login_denied, + :tftp_notfound, + :tftp_perm, + :remote_disk_full, + :tftp_illegal, + :tftp_unknownid, + :remote_file_exists, + :tftp_nosuchuser, + :conv_failed, + :conv_reqd, + :ssl_cacert_badfile, + :remote_file_not_found, + :ssh, + :ssl_shutdown_failed, + :again, + :ssl_crl_badfile, + :ssl_issuer_error, + :ftp_pret_failed, + :rtsp_cseq_error, + :rtsp_session_error, + :ftp_bad_file_list, + :chunk_failed, + :last + ] + end + + # Curl-Multi socket error codes, refer + # https://github.com/bagder/curl/blob/master/include/curl/multi.h for details + def multi_codes + [ + :call_multi_perform, -1, + :ok, + :bad_handle, + :bad_easy_handle, + :out_of_memory, + :internal_error, + :bad_socket, + :unknown_option, + :last + ] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/constants.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/constants.rb new file mode 100644 index 000000000000..02fcb28d08d2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/constants.rb @@ -0,0 +1,62 @@ +module Ethon + module Curl + # :nodoc: + VERSION_NOW = 3 + + # Flag. Initialize SSL. + GLOBAL_SSL = 0x01 + # Flag. Initialize win32 socket libraries. + GLOBAL_WIN32 = 0x02 + # Flag. Initialize everything possible. + GLOBAL_ALL = (GLOBAL_SSL | GLOBAL_WIN32) + # Flag. Initialize everything by default. + GLOBAL_DEFAULT = GLOBAL_ALL + + # :nodoc: + EasyCode = enum(:easy_code, easy_codes) + # :nodoc: + MultiCode = enum(:multi_code, multi_codes) + + # :nodoc: + EasyOption = enum(:easy_option, easy_options(:enum).to_a.flatten) + # :nodoc: + MultiOption = enum(:multi_option, multi_options(:enum).to_a.flatten) + + # Used by curl_debug_callback when setting CURLOPT_DEBUGFUNCTION + # https://github.com/bagder/curl/blob/master/include/curl/curl.h#L378 for details + DebugInfoType = enum(:debug_info_type, debug_info_types) + + # :nodoc: + InfoType = enum(info_types.to_a.flatten) + + # Info details, refer + # https://github.com/bagder/curl/blob/master/src/tool_writeout.c#L66 for details + Info = enum(:info, infos.to_a.flatten) + + # Form options, used by FormAdd for temporary storage, refer + # https://github.com/bagder/curl/blob/master/lib/formdata.h#L51 for details + FormOption = enum(:form_option, form_options) + + # :nodoc: + MsgCode = enum(:msg_code, msg_codes) + + VERSION_IPV6 = (1<<0) # IPv6-enabled + VERSION_KERBEROS4 = (1<<1) # kerberos auth is supported + VERSION_SSL = (1<<2) # SSL options are present + VERSION_LIBZ = (1<<3) # libz features are present + VERSION_NTLM = (1<<4) # NTLM auth is supported + VERSION_GSSNEGOTIATE = (1<<5) # Negotiate auth supp + VERSION_DEBUG = (1<<6) # built with debug capabilities + VERSION_ASYNCHDNS = (1<<7) # asynchronous dns resolves + VERSION_SPNEGO = (1<<8) # SPNEGO auth is supported + VERSION_LARGEFILE = (1<<9) # supports files bigger than 2GB + VERSION_IDN = (1<<10) # International Domain Names support + VERSION_SSPI = (1<<11) # SSPI is supported + VERSION_CONV = (1<<12) # character conversions supported + VERSION_CURLDEBUG = (1<<13) # debug memory tracking supported + VERSION_TLSAUTH_SRP = (1<<14) # TLS-SRP auth is supported + VERSION_NTLM_WB = (1<<15) # NTLM delegating to winbind helper + VERSION_HTTP2 = (1<<16) # HTTP2 support built + VERSION_GSSAPI = (1<<17) # GSS-API is supported + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/form_options.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/form_options.rb new file mode 100644 index 000000000000..3694dc674aa5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/form_options.rb @@ -0,0 +1,36 @@ +module Ethon + module Curls + + # This module contains the available options for forms. + module FormOptions + + # Form options, used by FormAdd for temporary storage, refer + # https://github.com/bagder/curl/blob/master/lib/formdata.h#L51 for details + def form_options + [ + :none, + :copyname, + :ptrname, + :namelength, + :copycontents, + :ptrcontents, + :contentslength, + :filecontent, + :array, + :obsolete, + :file, + :buffer, + :bufferptr, + :bufferlength, + :contenttype, + :contentheader, + :filename, + :end, + :obsolete2, + :stream, + :last + ] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/functions.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/functions.rb new file mode 100644 index 000000000000..aca3627ff45c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/functions.rb @@ -0,0 +1,66 @@ +module Ethon + module Curls + + # This module contains the functions to be attached in order to work with + # libcurl. + module Functions + + # :nodoc: + def self.extended(base) + base.attach_function :global_init, :curl_global_init, [:long], :int + base.attach_function :global_cleanup, :curl_global_cleanup, [], :void + base.attach_function :free, :curl_free, [:pointer], :void + + base.attach_function :easy_init, :curl_easy_init, [], :pointer + base.attach_function :easy_cleanup, :curl_easy_cleanup, [:pointer], :void + base.attach_function :easy_getinfo, :curl_easy_getinfo, [:pointer, :info, :pointer], :easy_code + base.attach_function :easy_setopt_ffipointer, :curl_easy_setopt, [:pointer, :easy_option, :pointer], :easy_code + base.attach_function :easy_setopt_string, :curl_easy_setopt, [:pointer, :easy_option, :string], :easy_code + base.attach_function :easy_setopt_long, :curl_easy_setopt, [:pointer, :easy_option, :long], :easy_code + base.attach_function :easy_setopt_callback, :curl_easy_setopt, [:pointer, :easy_option, :callback], :easy_code + base.attach_function :easy_setopt_debug_callback, :curl_easy_setopt, [:pointer, :easy_option, :debug_callback], :easy_code + base.attach_function :easy_setopt_progress_callback, :curl_easy_setopt, [:pointer, :easy_option, :progress_callback], :easy_code + base.attach_function :easy_setopt_off_t, :curl_easy_setopt, [:pointer, :easy_option, :int64], :easy_code + base.instance_variable_set(:@blocking, true) + base.attach_function :easy_perform, :curl_easy_perform, [:pointer], :easy_code + base.attach_function :easy_strerror, :curl_easy_strerror, [:easy_code], :string + base.attach_function :easy_escape, :curl_easy_escape, [:pointer, :pointer, :int], :pointer + base.attach_function :easy_reset, :curl_easy_reset, [:pointer], :void + base.attach_function :easy_duphandle, :curl_easy_duphandle, [:pointer], :pointer + + base.attach_function :formadd, :curl_formadd, [:pointer, :pointer, :varargs], :int + base.attach_function :formfree, :curl_formfree, [:pointer], :void + + base.attach_function :multi_init, :curl_multi_init, [], :pointer + base.attach_function :multi_cleanup, :curl_multi_cleanup, [:pointer], :void + base.attach_function :multi_add_handle, :curl_multi_add_handle, [:pointer, :pointer], :multi_code + base.attach_function :multi_remove_handle, :curl_multi_remove_handle, [:pointer, :pointer], :multi_code + base.attach_function :multi_info_read, :curl_multi_info_read, [:pointer, :pointer], Curl::Msg.ptr + base.attach_function :multi_perform, :curl_multi_perform, [:pointer, :pointer], :multi_code + base.attach_function :multi_timeout, :curl_multi_timeout, [:pointer, :pointer], :multi_code + base.attach_function :multi_fdset, :curl_multi_fdset, [:pointer, Curl::FDSet.ptr, Curl::FDSet.ptr, Curl::FDSet.ptr, :pointer], :multi_code + base.attach_function :multi_strerror, :curl_multi_strerror, [:int], :string + base.attach_function :multi_setopt_ffipointer, :curl_multi_setopt, [:pointer, :multi_option, :pointer], :multi_code + base.attach_function :multi_setopt_string, :curl_multi_setopt, [:pointer, :multi_option, :string], :multi_code + base.attach_function :multi_setopt_long, :curl_multi_setopt, [:pointer, :multi_option, :long], :multi_code + base.attach_function :multi_setopt_callback, :curl_multi_setopt, [:pointer, :multi_option, :callback], :multi_code + base.attach_function :multi_setopt_off_t, :curl_multi_setopt, [:pointer, :multi_option, :int64], :multi_code + + base.attach_function :version, :curl_version, [], :string + base.attach_function :version_info, :curl_version_info, [], Curl::VersionInfoData.ptr + + base.attach_function :slist_append, :curl_slist_append, [:pointer, :string], :pointer + base.attach_function :slist_free_all, :curl_slist_free_all, [:pointer], :void + base.instance_variable_set(:@blocking, true) + + if Curl.windows? + base.ffi_lib 'ws2_32' + else + base.ffi_lib ::FFI::Library::LIBC + end + + base.attach_function :select, [:int, Curl::FDSet.ptr, Curl::FDSet.ptr, Curl::FDSet.ptr, Curl::Timeval.ptr], :int + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/infos.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/infos.rb new file mode 100644 index 000000000000..993cd7fab701 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/infos.rb @@ -0,0 +1,150 @@ +module Ethon + module Curls + + # This module contains logic for the available informations + # on an easy, eg.: connect_time. + module Infos + + # Return info types. + # + # @example Return info types. + # Ethon::Curl.info_types + # + # @return [ Hash ] The info types. + def info_types + { + :string =>0x100000, + :long => 0x200000, + :double =>0x300000, + :slist => 0x400000 + } + end + + # http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTDEBUGFUNCTION + # https://github.com/bagder/curl/blob/master/include/curl/curl.h#L378 + # + # @example Return debug info types. + # Ethon::Curl.debug_info_types + # + # @return [ Hash ] The info types available to curl_debug_callback. + def debug_info_types + [ + :text, 0, + :header_in, + :header_out, + :data_in, + :data_out, + :ssl_data_in, + :ssl_data_out + ] + end + + # Return Info details, refer + # https://github.com/bagder/curl/blob/master/src/tool_writeout.c#L66 for details + # + # @example Return infos. + # Ethon::Curl.infos + # + # @return [ Hash ] The infos. + def infos + { + :effective_url => info_types[:string] + 1, + :response_code => info_types[:long] + 2, + :total_time => info_types[:double] + 3, + :namelookup_time => info_types[:double] + 4, + :connect_time => info_types[:double] + 5, + :pretransfer_time => info_types[:double] + 6, + :size_upload => info_types[:double] + 7, + :size_download => info_types[:double] + 8, + :speed_download => info_types[:double] + 9, + :speed_upload => info_types[:double] + 10, + :header_size => info_types[:long] + 11, + :request_size => info_types[:long] + 12, + :ssl_verifyresult => info_types[:long] + 13, + :filetime => info_types[:long] + 14, + :content_length_download =>info_types[:double] + 15, + :content_length_upload => info_types[:double] + 16, + :starttransfer_time => info_types[:double] + 17, + :content_type => info_types[:string] + 18, + :redirect_time => info_types[:double] + 19, + :redirect_count => info_types[:long] + 20, + :private => info_types[:string] + 21, + :http_connectcode => info_types[:long] + 22, + :httpauth_avail => info_types[:long] + 23, + :proxyauth_avail => info_types[:long] + 24, + :os_errno => info_types[:long] + 25, + :num_connects => info_types[:long] + 26, + :ssl_engines => info_types[:slist] + 27, + :cookielist => info_types[:slist] + 28, + :lastsocket => info_types[:long] + 29, + :ftp_entry_path => info_types[:string] + 30, + :redirect_url => info_types[:string] + 31, + :primary_ip => info_types[:string] + 32, + :appconnect_time => info_types[:double] + 33, + :certinfo => info_types[:slist] + 34, + :condition_unmet => info_types[:long] + 35, + :rtsp_session_id => info_types[:string] + 36, + :rtsp_client_cseq => info_types[:long] + 37, + :rtsp_server_cseq => info_types[:long] + 38, + :rtsp_cseq_recv => info_types[:long] + 39, + :primary_port => info_types[:long] + 40, + :local_ip => info_types[:string] + 41, + :local_port => info_types[:long] + 42, + :last =>42 + } + end + + # Return info as string. + # + # @example Return info. + # Curl.get_info_string(:primary_ip, easy) + # + # @param [ Symbol ] option The option name. + # @param [ ::FFI::Pointer ] handle The easy handle. + # + # @return [ String ] The info. + def get_info_string(option, handle) + string_ptr = ::FFI::MemoryPointer.new(:pointer) + + if easy_getinfo(handle, option, string_ptr) == :ok + ptr=string_ptr.read_pointer + ptr.null? ? nil : ptr.read_string + end + end + + # Return info as integer. + # + # @example Return info. + # Curl.get_info_long(:response_code, easy) + # + # @param [ Symbol ] option The option name. + # @param [ ::FFI::Pointer ] handle The easy handle. + # + # @return [ Integer ] The info. + def get_info_long(option, handle) + long_ptr = ::FFI::MemoryPointer.new(:long) + + if easy_getinfo(handle, option, long_ptr) == :ok + long_ptr.read_long + end + end + + # Return info as float + # + # @example Return info. + # Curl.get_info_double(:response_code, easy) + # + # @param [ Symbol ] option The option name. + # @param [ ::FFI::Pointer ] handle The easy handle. + # + # @return [ Float ] The info. + def get_info_double(option, handle) + double_ptr = ::FFI::MemoryPointer.new(:double) + + if easy_getinfo(handle, option, double_ptr) == :ok + double_ptr.read_double + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/messages.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/messages.rb new file mode 100644 index 000000000000..89893a60b775 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/messages.rb @@ -0,0 +1,18 @@ +module Ethon + module Curls + + # This module contains available message codes. + module Messages + + # Return message codes. + # + # @example Return message codes. + # Ethon::Curl.msg_codes + # + # @return [ Array ] The messages codes. + def msg_codes + [:none, :done, :last] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/options.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/options.rb new file mode 100644 index 000000000000..0c3a7d6c6e99 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/options.rb @@ -0,0 +1,468 @@ +module Ethon + module Curls + + # This module contains logic for setting options on + # easy or multi interface. + module Options + + OPTION_STRINGS = { :easy => 'easy_options', :multi => 'multi_options' }.freeze + FOPTION_STRINGS = { :easy => 'EASY_OPTIONS', :multi => 'MULTI_OPTIONS' }.freeze + FTYPES = [:long, :string, :ffipointer, :callback, :debug_callback, :progress_callback, :off_t] + FUNCS = Hash[*[:easy, :multi].zip([:easy, :multi].map { |t| Hash[*FTYPES.zip(FTYPES.map { |ft| "#{t}_setopt_#{ft}" }).flatten] }).flatten] + # Sets appropriate option for easy, depending on value type. + def set_option(option, value, handle, type = :easy) + type = type.to_sym unless type.is_a?(Symbol) + raise NameError, "Ethon::Curls::Options unknown type #{type}." unless respond_to?(OPTION_STRINGS[type]) + opthash=send(OPTION_STRINGS[type], nil) + raise Errors::InvalidOption.new(option) unless opthash.include?(option) + + case opthash[option][:type] + when :none + return if value.nil? + value=1 + func=:long + when :int + return if value.nil? + func=:long + value=value.to_i + when :bool + return if value.nil? + func=:long + value=(value&&value!=0) ? 1 : 0 + when :time + return if value.nil? + func=:long + value=value.to_i + when :enum + return if value.nil? + func=:long + value = case value + when Symbol + opthash[option][:opts][value] + when String + opthash[option][:opts][value.to_sym] + else + value + end.to_i + when :bitmask + return if value.nil? + func=:long + value = case value + when Symbol + opthash[option][:opts][value] + when Array + value.inject(0) { |res,v| res|opthash[option][:opts][v] } + else + value + end.to_i + when :string + func=:string + value=value.to_s unless value.nil? + when :string_as_pointer + func = :ffipointer + s = '' + s = value.to_s unless value.nil? + value = FFI::MemoryPointer.new(:char, s.bytesize) + value.put_bytes(0, s) + when :string_escape_null + func=:string + value=Util.escape_zero_byte(value) unless value.nil? + when :ffipointer + func=:ffipointer + raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? FFI::Pointer + when :curl_slist + func=:ffipointer + raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? FFI::Pointer + when :buffer + raise NotImplementedError, "Ethon::Curls::Options option #{option} buffer type not implemented." + when :dontuse_object + raise NotImplementedError, "Ethon::Curls::Options option #{option} type not implemented." + when :cbdata + raise NotImplementedError, "Ethon::Curls::Options option #{option} callback data type not implemented. Use Ruby closures." + when :callback + func=:callback + raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? Proc + when :debug_callback + func=:debug_callback + raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? Proc + when :progress_callback + func=:progress_callback + raise Errors::InvalidValue.new(option,value) unless value.nil? or value.is_a? Proc + when :off_t + return if value.nil? + func=:off_t + value=value.to_i + end + + if func==:long or func==:off_t then + bits=FFI.type_size(:long)*8 if func==:long + bits=FFI.type_size(:int64)*8 if func==:off_t + tv=((value<0) ? value.abs-1 : value) + raise Errors::InvalidValue.new(option,value) unless tv<(1<<bits) + end + send(FUNCS[type][func], handle, opthash[option][:opt], value) + end + + OPTION_TYPE_BASE = { + :long => 0, + :objectpoint => 10000, + :functionpoint => 20000, + :off_t => 30000 + } + OPTION_TYPE_MAP = { + :none => :long, + :int => :long, + :bool => :long, + :time => :long, + :enum => :long, # Two ways to specify values (as opts parameter): + # * Array of symbols, these will number sequentially + # starting at 0. Skip elements with nil. (see :netrc) + # * Hash of :symbol => enum_value (See :proxytype) + :bitmask => :long, # Three ways to specify values (as opts parameter): + # * Hash of :symbol => bitmask_value or Array. + # An Array can be an array of already defined + # Symbols, which represents a bitwise or of those + # symbols. (See :httpauth) + # * Array of symbols, these will number the bits + # sequentially (i.e. 0, 1, 2, 4, etc.). Skip + # elements with nil. The last element can be a + # Hash, which will be interpreted as above. + # (See :protocols) + # :all defaults to all bits set + :string => :objectpoint, + :string_escape_null => :objectpoint, + :string_as_pointer => :objectpoint, + :ffipointer => :objectpoint, # FFI::Pointer + :curl_slist => :objectpoint, + :buffer => :objectpoint, # A memory buffer of size defined in the options + :dontuse_object => :objectpoint, # An object we don't support (e.g. FILE*) + :cbdata => :objectpoint, + :callback => :functionpoint, + :debug_callback => :functionpoint, + :progress_callback => :functionpoint, + :off_t => :off_t, + } + + def self.option(ftype,name,type,num,opts=nil) + case type + when :enum + if opts.is_a? Array then + opts=Hash[opts.each_with_index.to_a] + elsif not opts.is_a? Hash then + raise TypeError, "Ethon::Curls::Options #{ftype} #{name} Expected opts to be an Array or a Hash." + end + + when :bitmask + if opts.is_a? Array then + if opts.last.is_a? Hash then + hopts=opts.pop + else + hopts={} + end + opts.each_with_index do |v,i| + next if v.nil? + if i==0 then + hopts[v]=0 + else + hopts[v]=1<<(i-1) + end + end + opts=hopts + elsif not opts.is_a? Hash then + raise TypeError, "Ethon::Curls::Options #{ftype} #{name} Expected opts to be an Array or a Hash." + end + opts[:all]=-1 unless opts.include? :all + opts.each do |k,v| + if v.is_a? Array then + opts[k]=v.map { |b| opts[b] }.inject :| + end + end + + when :buffer + raise TypeError, "Ethon::Curls::Options #{ftype} #{name} Expected opts to be an Array or a Hash." unless opts.is_a? Integer + + else + raise ArgumentError, "Ethon::Curls::Options #{ftype} #{name} Expected no opts." unless opts.nil? + end + opthash=const_get(FOPTION_STRINGS[ftype]) + opthash[name] = { :type => type, + :opt => OPTION_TYPE_BASE[OPTION_TYPE_MAP[type]] + num, + :opts => opts } + end + + def self.option_alias(ftype,name,*aliases) + opthash=const_get(FOPTION_STRINGS[ftype]) + aliases.each { |a| opthash[a]=opthash[name] } + end + + def self.option_type(type) + cname = FOPTION_STRINGS[type] + const_set(cname, {}) + define_method(OPTION_STRINGS[type]) do |rt| + return Ethon::Curls::Options.const_get(cname).map { |k, v| [k, v[:opt]] } if rt == :enum + Ethon::Curls::Options.const_get(cname) + end + end + + # Curl multi options, refer + # Defined @ https://github.com/bagder/curl/blob/master/include/curl/multi.h + # Documentation @ http://curl.haxx.se/libcurl/c/curl_multi_setopt.html + option_type :multi + + option :multi, :socketfunction, :callback, 1 + option :multi, :socketdata, :cbdata, 2 + option :multi, :pipelining, :int, 3 + option :multi, :timerfunction, :callback, 4 + option :multi, :timerdata, :cbdata, 5 + option :multi, :maxconnects, :int, 6 + option :multi, :max_host_connections, :int, 7 + option :multi, :max_pipeline_length, :int, 8 + option :multi, :content_length_penalty_size, :off_t, 9 + option :multi, :chunk_length_penalty_size, :off_t, 10 + option :multi, :pipelining_site_bl, :dontuse_object, 11 + option :multi, :pipelining_server_bl, :dontuse_object, 12 + option :multi, :max_total_connections, :int, 3 + + # Curl easy options + # Defined @ https://github.com/bagder/curl/blob/master/include/curl/curl.h + # Documentation @ http://curl.haxx.se/libcurl/c/curl_easy_setopt.html + ## BEHAVIOR OPTIONS + option_type :easy + + option :easy, :verbose, :bool, 41 + option :easy, :header, :bool, 42 + option :easy, :noprogress, :bool, 43 + option :easy, :nosignal, :bool, 99 + option :easy, :wildcardmatch, :bool, 197 + ## CALLBACK OPTIONS + option :easy, :writefunction, :callback, 11 + option :easy, :file, :cbdata, 1 + option_alias :easy, :file, :writedata + option :easy, :readfunction, :callback, 12 + option :easy, :infile, :cbdata, 9 + option_alias :easy, :infile, :readdata + option :easy, :ioctlfunction, :callback, 130 + option :easy, :ioctldata, :cbdata, 131 + option :easy, :seekfunction, :callback, 167 + option :easy, :seekdata, :cbdata, 168 + option :easy, :sockoptfunction, :callback, 148 + option :easy, :sockoptdata, :cbdata, 149 + option :easy, :opensocketfunction, :callback, 163 + option :easy, :opensocketdata, :cbdata, 164 + option :easy, :closesocketfunction, :callback, 208 + option :easy, :closesocketdata, :cbdata, 209 + option :easy, :progressfunction, :progress_callback, 56 + option :easy, :progressdata, :cbdata, 57 + option :easy, :headerfunction, :callback, 79 + option :easy, :writeheader, :cbdata, 29 + option_alias :easy, :writeheader, :headerdata + option :easy, :debugfunction, :debug_callback, 94 + option :easy, :debugdata, :cbdata, 95 + option :easy, :ssl_ctx_function, :callback, 108 + option :easy, :ssl_ctx_data, :cbdata, 109 + option :easy, :conv_to_network_function, :callback, 143 + option :easy, :conv_from_network_function, :callback, 142 + option :easy, :conv_from_utf8_function, :callback, 144 + option :easy, :interleavefunction, :callback, 196 + option :easy, :interleavedata, :cbdata, 195 + option :easy, :chunk_bgn_function, :callback, 198 + option :easy, :chunk_end_function, :callback, 199 + option :easy, :chunk_data, :cbdata, 201 + option :easy, :fnmatch_function, :callback, 200 + option :easy, :fnmatch_data, :cbdata, 202 + option :easy, :xferinfofunction, :progress_callback, 219 + option :easy, :xferinfodata, :cbdata, 57 + ## ERROR OPTIONS + option :easy, :errorbuffer, :buffer, 10, 256 + option :easy, :stderr, :dontuse_object, 37 + option :easy, :failonerror, :bool, 45 + ## NETWORK OPTIONS + option :easy, :url, :string, 2 + option :easy, :protocols, :bitmask, 181, [nil, :http, :https, :ftp, :ftps, :scp, :sftp, :telnet, :ldap, :ldaps, :dict, :file, :tftp, :imap, :imaps, :pop3, :pop3s, :smtp, :smtps, :rtsp, :rtmp, :rtmpt, :rtmpe, :rtmpte, :rtmps, :rtmpts, :gopher] + option :easy, :redir_protocols, :bitmask, 182, [nil, :http, :https, :ftp, :ftps, :scp, :sftp, :telnet, :ldap, :ldaps, :dict, :file, :tftp, :imap, :imaps, :pop3, :pop3s, :smtp, :smtps, :rtsp, :rtmp, :rtmpt, :rtmpe, :rtmpte, :rtmps, :rtmpts, :gopher] + option :easy, :proxy, :string, 4 + option :easy, :proxyport, :int, 59 + option :easy, :proxytype, :enum, 101, [:http, :http_1_0, nil, nil, :socks4, :socks5, :socks4a, :socks5_hostname] + option :easy, :noproxy, :string, 177 + option :easy, :httpproxytunnel, :bool, 61 + option :easy, :socks5_gssapi_service, :string, 179 + option :easy, :socks5_gssapi_nec, :bool, 180 + option :easy, :interface, :string, 62 + option :easy, :localport, :int, 139 + option :easy, :localportrange, :int, 140 + option :easy, :dns_cache_timeout, :int, 92 + option :easy, :dns_use_global_cache, :bool, 91 # Obsolete + option :easy, :dns_interface, :string, 221 + option :easy, :dns_local_ip4, :string, 222 + option :easy, :buffersize, :int, 98 + option :easy, :port, :int, 3 + option :easy, :tcp_nodelay, :bool, 121 + option :easy, :address_scope, :int, 171 + option :easy, :tcp_keepalive, :bool, 213 + option :easy, :tcp_keepidle, :int, 214 + option :easy, :tcp_keepintvl, :int, 215 + ## NAMES and PASSWORDS OPTIONS (Authentication) + option :easy, :netrc, :enum, 51, [:ignored, :optional, :required] + option :easy, :netrc_file, :string, 118 + option :easy, :userpwd, :string, 5 + option :easy, :proxyuserpwd, :string, 6 + option :easy, :username, :string, 173 + option :easy, :password, :string, 174 + option :easy, :proxyusername, :string, 175 + option :easy, :proxypassword, :string, 176 + option :easy, :httpauth, :bitmask, 107, [:none, :basic, :digest, :gssnegotiate, :ntlm, :digest_ie, :ntlm_wb, {:only => 1<<31, :any => ~0x10, :anysafe => ~0x11, :auto => 0x1f}] + option :easy, :tlsauth_type, :enum, 206, [:none, :srp] + option :easy, :tlsauth_username, :string, 204 + option :easy, :tlsauth_password, :string, 205 + option :easy, :proxyauth, :bitmask, 111, [:none, :basic, :digest, :gssnegotiate, :ntlm, :digest_ie, :ntlm_wb, {:only => 1<<31, :any => ~0x10, :anysafe => ~0x11, :auto => 0x1f}] + option :easy, :sasl_ir, :bool, 218 + ## HTTP OPTIONS + option :easy, :autoreferer, :bool, 58 + option :easy, :accept_encoding, :string, 102 + option_alias :easy, :accept_encoding, :encoding + option :easy, :transfer_encoding, :bool, 207 + option :easy, :followlocation, :bool, 52 + option :easy, :unrestricted_auth, :bool, 105 + option :easy, :maxredirs, :int, 68 + option :easy, :postredir, :bitmask, 161, [:get_all, :post_301, :post_302, :post_303, {:post_all => [:post_301, :post_302, :post_303]}] + option_alias :easy, :postredir, :post301 + option :easy, :put, :bool, 54 + option :easy, :post, :bool, 47 + option :easy, :postfields, :string, 15 + option :easy, :postfieldsize, :int, 60 + option :easy, :postfieldsize_large, :off_t, 120 + option :easy, :copypostfields, :string_as_pointer, 165 + option :easy, :httppost, :ffipointer, 24 + option :easy, :referer, :string, 16 + option :easy, :useragent, :string, 18 + option :easy, :httpheader, :curl_slist, 23 + option :easy, :http200aliases, :curl_slist, 104 + option :easy, :cookie, :string, 22 + option :easy, :cookiefile, :string, 31 + option :easy, :cookiejar, :string, 82 + option :easy, :cookiesession, :bool, 96 + option :easy, :cookielist, :string, 135 + option :easy, :httpget, :bool, 80 + option :easy, :http_version, :enum, 84, [:none, :httpv1_0, :httpv1_1, :httpv2_0] + option :easy, :ignore_content_length, :bool, 136 + option :easy, :http_content_decoding, :bool, 158 + option :easy, :http_transfer_decoding, :bool, 157 + ## SMTP OPTIONS + option :easy, :mail_from, :string, 186 + option :easy, :mail_rcpt, :curl_slist, 187 + option :easy, :mail_auth, :string, 217 + ## TFTP OPTIONS + option :easy, :tftp_blksize, :int, 178 + ## FTP OPTIONS + option :easy, :ftpport, :string, 17 + option :easy, :quote, :curl_slist, 28 + option :easy, :postquote, :curl_slist, 39 + option :easy, :prequote, :curl_slist, 93 + option :easy, :dirlistonly, :bool, 48 + option_alias :easy, :dirlistonly, :ftplistonly + option :easy, :append, :bool, 50 + option_alias :easy, :append, :ftpappend + option :easy, :ftp_use_eprt, :bool, 106 + option :easy, :ftp_use_epsv, :bool, 85 + option :easy, :ftp_use_pret, :bool, 188 + option :easy, :ftp_create_missing_dirs, :bool, 110 + option :easy, :ftp_response_timeout, :int, 112 + option_alias :easy, :ftp_response_timeout, :server_response_timeout + option :easy, :ftp_alternative_to_user, :string, 147 + option :easy, :ftp_skip_pasv_ip, :bool, 137 + option :easy, :ftpsslauth, :enum, 129, [:default, :ssl, :tls] + option :easy, :ftp_ssl_ccc, :enum, 154, [:none, :passive, :active] + option :easy, :ftp_account, :string, 134 + option :easy, :ftp_filemethod, :enum, 138, [:default, :multicwd, :nocwd, :singlecwd] + ## RTSP OPTIONS + option :easy, :rtsp_request, :enum, 189, [:none, :options, :describe, :announce, :setup, :play, :pause, :teardown, :get_parameter, :set_parameter, :record, :receive] + option :easy, :rtsp_session_id, :string, 190 + option :easy, :rtsp_stream_uri, :string, 191 + option :easy, :rtsp_transport, :string, 192 + option_alias :easy, :httpheader, :rtspheader + option :easy, :rtsp_client_cseq, :int, 193 + option :easy, :rtsp_server_cseq, :int, 194 + ## PROTOCOL OPTIONS + option :easy, :transfertext, :bool, 53 + option :easy, :proxy_transfer_mode, :bool, 166 + option :easy, :crlf, :bool, 27 + option :easy, :range, :string, 7 + option :easy, :resume_from, :int, 21 + option :easy, :resume_from_large, :off_t, 116 + option :easy, :customrequest, :string, 36 + option :easy, :filetime, :bool, 69 + option :easy, :nobody, :bool, 44 + option :easy, :infilesize, :int, 14 + option :easy, :infilesize_large, :off_t, 115 + option :easy, :upload, :bool, 46 + option :easy, :maxfilesize, :int, 114 + option :easy, :maxfilesize_large, :off_t, 117 + option :easy, :timecondition, :enum, 33, [:none, :ifmodsince, :ifunmodsince, :lastmod] + option :easy, :timevalue, :time, 34 + ## CONNECTION OPTIONS + option :easy, :timeout, :int, 13 + option :easy, :timeout_ms, :int, 155 + option :easy, :low_speed_limit, :int, 19 + option :easy, :low_speed_time, :int, 20 + option :easy, :max_send_speed_large, :off_t, 145 + option :easy, :max_recv_speed_large, :off_t, 146 + option :easy, :maxconnects, :int, 71 + option :easy, :fresh_connect, :bool, 74 + option :easy, :forbid_reuse, :bool, 75 + option :easy, :connecttimeout, :int, 78 + option :easy, :connecttimeout_ms, :int, 156 + option :easy, :ipresolve, :enum, 113, [:whatever, :v4, :v6] + option :easy, :connect_only, :bool, 141 + option :easy, :use_ssl, :enum, 119, [:none, :try, :control, :all] + option_alias :easy, :use_ssl, :ftp_ssl + option :easy, :resolve, :curl_slist, 203 + option :easy, :dns_servers, :string, 211 + option :easy, :accepttimeout_ms, :int, 212 + option :easy, :unix_socket_path, :string, 231 + option :easy, :pipewait, :bool, 237 + option_alias :easy, :unix_socket_path, :unix_socket + ## SSL and SECURITY OPTIONS + option :easy, :sslcert, :string, 25 + option :easy, :sslcerttype, :string, 86 + option :easy, :sslkey, :string, 87 + option :easy, :sslkeytype, :string, 88 + option :easy, :keypasswd, :string, 26 + option_alias :easy, :keypasswd, :sslcertpasswd + option_alias :easy, :keypasswd, :sslkeypasswd + option :easy, :sslengine, :string, 89 + option :easy, :sslengine_default, :none, 90 + option :easy, :sslversion, :enum, 32, [:default, :tlsv1, :sslv2, :sslv3, :tlsv1_0, :tlsv1_1, :tlsv1_2] + option :easy, :ssl_verifypeer, :bool, 64 + option :easy, :cainfo, :string, 65 + option :easy, :issuercert, :string, 170 + option :easy, :capath, :string, 97 + option :easy, :crlfile, :string, 169 + option :easy, :ssl_verifyhost, :int, 81 + option :easy, :certinfo, :bool, 172 + option :easy, :random_file, :string, 76 + option :easy, :egdsocket, :string, 77 + option :easy, :ssl_cipher_list, :string, 83 + option :easy, :ssl_sessionid_cache, :bool, 150 + option :easy, :ssl_options, :bitmask, 216, [nil, :allow_beast] + option :easy, :krblevel, :string, 63 + option_alias :easy, :krblevel, :krb4level + option :easy, :gssapi_delegation, :bitmask, 210, [:none, :policy_flag, :flag] + ## SSH OPTIONS + option :easy, :ssh_auth_types, :bitmask, 151, [:none, :publickey, :password, :host, :keyboard, :agent, {:any => [:all], :default => [:any]}] + option :easy, :ssh_host_public_key_md5, :string, 162 + option :easy, :ssh_public_keyfile, :string, 152 + option :easy, :ssh_private_keyfile, :string, 153 + option :easy, :ssh_knownhosts, :string, 183 + option :easy, :ssh_keyfunction, :callback, 184 + option :easy, :khstat, :enum, -1, [:fine_add_to_file, :fine, :reject, :defer] # Kludge to make this enum available... Access via CurL::EASY_OPTIONS[:khstat][:opt] + option :easy, :ssh_keydata, :cbdata, 185 + ## OTHER OPTIONS + option :easy, :private, :cbdata, 103 + option :easy, :share, :dontuse_object, 100 + option :easy, :new_file_perms, :int, 159 + option :easy, :new_directory_perms, :int, 160 + ## TELNET OPTIONS + option :easy, :telnetoptions, :curl_slist, 70 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/settings.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/settings.rb new file mode 100644 index 000000000000..345e6dfb02e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/curls/settings.rb @@ -0,0 +1,9 @@ +module Ethon + module Curl + callback :callback, [:pointer, :size_t, :size_t, :pointer], :size_t + callback :debug_callback, [:pointer, :debug_info_type, :pointer, :size_t, :pointer], :int + callback :progress_callback, [:pointer, :long_long, :long_long, :long_long, :long_long], :int + ffi_lib_flags :now, :global + ffi_lib ['libcurl', 'libcurl.so.4'] + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy.rb new file mode 100644 index 000000000000..34e291cf66c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy.rb @@ -0,0 +1,315 @@ +require 'ethon/easy/informations' +require 'ethon/easy/features' +require 'ethon/easy/callbacks' +require 'ethon/easy/options' +require 'ethon/easy/header' +require 'ethon/easy/util' +require 'ethon/easy/params' +require 'ethon/easy/form' +require 'ethon/easy/http' +require 'ethon/easy/operations' +require 'ethon/easy/response_callbacks' +require 'ethon/easy/debug_info' +require 'ethon/easy/mirror' + +module Ethon + + # This is the class representing the libcurl easy interface + # See http://curl.haxx.se/libcurl/c/libcurl-easy.html for more informations. + # + # @example You can access the libcurl easy interface through this class, every request is based on it. The simplest setup looks like that: + # + # e = Ethon::Easy.new(url: "www.example.com") + # e.perform + # #=> :ok + # + # @example You can the reuse this Easy for the next request: + # + # e.reset # reset easy handle + # e.url = "www.google.com" + # e.followlocation = true + # e.perform + # #=> :ok + # + # @see initialize + class Easy + include Ethon::Easy::Informations + include Ethon::Easy::Callbacks + include Ethon::Easy::Options + include Ethon::Easy::Header + include Ethon::Easy::Http + include Ethon::Easy::Operations + include Ethon::Easy::ResponseCallbacks + extend Ethon::Easy::Features + + # Returns the curl return code. + # + # @return [ Symbol ] The return code. + # * :ok: All fine. Proceed as usual. + # * :unsupported_protocol: The URL you passed to libcurl used a + # protocol that this libcurl does not support. The support + # might be a compile-time option that you didn't use, it can + # be a misspelled protocol string or just a protocol + # libcurl has no code for. + # * :failed_init: Very early initialization code failed. This + # is likely to be an internal error or problem, or a + # resource problem where something fundamental couldn't + # get done at init time. + # * :url_malformat: The URL was not properly formatted. + # * :not_built_in: A requested feature, protocol or option + # was not found built-in in this libcurl due to a build-time + # decision. This means that a feature or option was not enabled + # or explicitly disabled when libcurl was built and in + # order to get it to function you have to get a rebuilt libcurl. + # * :couldnt_resolve_proxy: Couldn't resolve proxy. The given + # proxy host could not be resolved. + # * :couldnt_resolve_host: Couldn't resolve host. The given remote + # host was not resolved. + # * :couldnt_connect: Failed to connect() to host or proxy. + # * :ftp_weird_server_reply: After connecting to a FTP server, + # libcurl expects to get a certain reply back. This error + # code implies that it got a strange or bad reply. The given + # remote server is probably not an OK FTP server. + # * :remote_access_denied: We were denied access to the resource + # given in the URL. For FTP, this occurs while trying to + # change to the remote directory. + # * :ftp_accept_failed: While waiting for the server to connect + # back when an active FTP session is used, an error code was + # sent over the control connection or similar. + # * :ftp_weird_pass_reply: After having sent the FTP password to + # the server, libcurl expects a proper reply. This error code + # indicates that an unexpected code was returned. + # * :ftp_accept_timeout: During an active FTP session while + # waiting for the server to connect, the CURLOPT_ACCEPTTIMOUT_MS + # (or the internal default) timeout expired. + # * :ftp_weird_pasv_reply: libcurl failed to get a sensible result + # back from the server as a response to either a PASV or a + # EPSV command. The server is flawed. + # * :ftp_weird_227_format: FTP servers return a 227-line as a response + # to a PASV command. If libcurl fails to parse that line, + # this return code is passed back. + # * :ftp_cant_get_host: An internal failure to lookup the host used + # for the new connection. + # * :ftp_couldnt_set_type: Received an error when trying to set + # the transfer mode to binary or ASCII. + # * :partial_file: A file transfer was shorter or larger than + # expected. This happens when the server first reports an expected + # transfer size, and then delivers data that doesn't match the + # previously given size. + # * :ftp_couldnt_retr_file: This was either a weird reply to a + # 'RETR' command or a zero byte transfer complete. + # * :quote_error: When sending custom "QUOTE" commands to the + # remote server, one of the commands returned an error code that + # was 400 or higher (for FTP) or otherwise indicated unsuccessful + # completion of the command. + # * :http_returned_error: This is returned if CURLOPT_FAILONERROR is + # set TRUE and the HTTP server returns an error code that is >= 400. + # * :write_error: An error occurred when writing received data to a + # local file, or an error was returned to libcurl from a write callback. + # * :upload_failed: Failed starting the upload. For FTP, the server + # typically denied the STOR command. The error buffer usually + # contains the server's explanation for this. + # * :read_error: There was a problem reading a local file or an error + # returned by the read callback. + # * :out_of_memory: A memory allocation request failed. This is serious + # badness and things are severely screwed up if this ever occurs. + # * :operation_timedout: Operation timeout. The specified time-out + # period was reached according to the conditions. + # * :ftp_port_failed: The FTP PORT command returned error. This mostly + # happens when you haven't specified a good enough address for + # libcurl to use. See CURLOPT_FTPPORT. + # * :ftp_couldnt_use_rest: The FTP REST command returned error. This + # should never happen if the server is sane. + # * :range_error: The server does not support or accept range requests. + # * :http_post_error: This is an odd error that mainly occurs due to + # internal confusion. + # * :ssl_connect_error: A problem occurred somewhere in the SSL/TLS + # handshake. You really want the error buffer and read the message + # there as it pinpoints the problem slightly more. Could be + # certificates (file formats, paths, permissions), passwords, and others. + # * :bad_download_resume: The download could not be resumed because + # the specified offset was out of the file boundary. + # * :file_couldnt_read_file: A file given with FILE:// couldn't be + # opened. Most likely because the file path doesn't identify an + # existing file. Did you check file permissions? + # * :ldap_cannot_bind: LDAP cannot bind. LDAP bind operation failed. + # * :ldap_search_failed: LDAP search failed. + # * :function_not_found: Function not found. A required zlib function was not found. + # * :aborted_by_callback: Aborted by callback. A callback returned + # "abort" to libcurl. + # * :bad_function_argument: Internal error. A function was called with + # a bad parameter. + # * :interface_failed: Interface error. A specified outgoing interface + # could not be used. Set which interface to use for outgoing + # connections' source IP address with CURLOPT_INTERFACE. + # * :too_many_redirects: Too many redirects. When following redirects, + # libcurl hit the maximum amount. Set your limit with CURLOPT_MAXREDIRS. + # * :unknown_option: An option passed to libcurl is not recognized/known. + # Refer to the appropriate documentation. This is most likely a + # problem in the program that uses libcurl. The error buffer might + # contain more specific information about which exact option it concerns. + # * :telnet_option_syntax: A telnet option string was Illegally formatted. + # * :peer_failed_verification: The remote server's SSL certificate or + # SSH md5 fingerprint was deemed not OK. + # * :got_nothing: Nothing was returned from the server, and under the + # circumstances, getting nothing is considered an error. + # * :ssl_engine_notfound: The specified crypto engine wasn't found. + # * :ssl_engine_setfailed: Failed setting the selected SSL crypto engine as default! + # * :send_error: Failed sending network data. + # * :recv_error: Failure with receiving network data. + # * :ssl_certproblem: problem with the local client certificate. + # * :ssl_cipher: Couldn't use specified cipher. + # * :ssl_cacert: Peer certificate cannot be authenticated with known CA certificates. + # * :bad_content_encoding: Unrecognized transfer encoding. + # * :ldap_invalid_url: Invalid LDAP URL. + # * :filesize_exceeded: Maximum file size exceeded. + # * :use_ssl_failed: Requested FTP SSL level failed. + # * :send_fail_rewind: When doing a send operation curl had to rewind the data to + # retransmit, but the rewinding operation failed. + # * :ssl_engine_initfailed: Initiating the SSL Engine failed. + # * :login_denied: The remote server denied curl to login + # * :tftp_notfound: File not found on TFTP server. + # * :tftp_perm: Permission problem on TFTP server. + # * :remote_disk_full: Out of disk space on the server. + # * :tftp_illegal: Illegal TFTP operation. + # * :tftp_unknownid: Unknown TFTP transfer ID. + # * :remote_file_exists: File already exists and will not be overwritten. + # * :tftp_nosuchuser: This error should never be returned by a properly + # functioning TFTP server. + # * :conv_failed: Character conversion failed. + # * :conv_reqd: Caller must register conversion callbacks. + # * :ssl_cacert_badfile: Problem with reading the SSL CA cert (path? access rights?): + # * :remote_file_not_found: The resource referenced in the URL does not exist. + # * :ssh: An unspecified error occurred during the SSH session. + # * :ssl_shutdown_failed: Failed to shut down the SSL connection. + # * :again: Socket is not ready for send/recv wait till it's ready and try again. + # This return code is only returned from curl_easy_recv(3) and curl_easy_send(3) + # * :ssl_crl_badfile: Failed to load CRL file + # * :ssl_issuer_error: Issuer check failed + # * :ftp_pret_failed: The FTP server does not understand the PRET command at + # all or does not support the given argument. Be careful when + # using CURLOPT_CUSTOMREQUEST, a custom LIST command will be sent with PRET CMD + # before PASV as well. + # * :rtsp_cseq_error: Mismatch of RTSP CSeq numbers. + # * :rtsp_session_error: Mismatch of RTSP Session Identifiers. + # * :ftp_bad_file_list: Unable to parse FTP file list (during FTP wildcard downloading). + # * :chunk_failed: Chunk callback reported error. + # * :obsolete: These error codes will never be returned. They were used in an old + # libcurl version and are currently unused. + # + # @see http://curl.haxx.se/libcurl/c/libcurl-errors.html + attr_accessor :return_code + + # Initialize a new Easy. + # It initializes curl, if not already done and applies the provided options. + # Look into {Ethon::Easy::Options Options} to see what you can provide in the + # options hash. + # + # @example Create a new Easy. + # Easy.new(url: "www.google.de") + # + # @param [ Hash ] options The options to set. + # @option options :headers [ Hash ] Request headers. + # + # @return [ Easy ] A new Easy. + # + # @see Ethon::Easy::Options + # @see http://curl.haxx.se/libcurl/c/curl_easy_setopt.html + def initialize(options = {}) + Curl.init + set_attributes(options) + set_callbacks + end + + # Set given options. + # + # @example Set options. + # easy.set_attributes(options) + # + # @param [ Hash ] options The options. + # + # @raise InvalidOption + # + # @see initialize + def set_attributes(options) + options.each_pair do |key, value| + method = "#{key}=" + unless respond_to?(method) + raise Errors::InvalidOption.new(key) + end + send(method, value) + end + end + + # Reset easy. This means resetting all options and instance variables. + # Also the easy handle is resetted. + # + # @example Reset. + # easy.reset + def reset + @url = nil + @escape = nil + @hash = nil + @on_complete = nil + @on_headers = nil + @on_body = nil + @on_progress = nil + @procs = nil + @mirror = nil + Curl.easy_reset(handle) + set_callbacks + end + + # Clones libcurl session handle. This means that all options that is set in + # the current handle will be set on duplicated handle. + def dup + e = super + e.handle = Curl.easy_duphandle(handle) + e.instance_variable_set(:@body_write_callback, nil) + e.instance_variable_set(:@header_write_callback, nil) + e.instance_variable_set(:@debug_callback, nil) + e.instance_variable_set(:@progress_callback, nil) + e.set_callbacks + e + end + # Url escapes the value. + # + # @example Url escape. + # easy.escape(value) + # + # @param [ String ] value The value to escape. + # + # @return [ String ] The escaped value. + # + # @api private + def escape(value) + string_pointer = Curl.easy_escape(handle, value, value.bytesize) + returned_string = string_pointer.read_string + Curl.free(string_pointer) + returned_string + end + + # Returns the informations available through libcurl as + # a hash. + # + # @return [ Hash ] The informations hash. + def to_hash + Kernel.warn("Ethon: Easy#to_hash is deprecated and will be removed, please use #mirror.") + mirror.to_hash + end + + def mirror + @mirror ||= Mirror.from_easy(self) + end + + # Return pretty log out. + # + # @example Return log out. + # easy.log_inspect + # + # @return [ String ] The log out. + def log_inspect + "EASY #{mirror.log_informations.map{|k, v| "#{k}=#{v}"}.flatten.join(' ')}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/callbacks.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/callbacks.rb new file mode 100644 index 000000000000..719c821b6f89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/callbacks.rb @@ -0,0 +1,147 @@ +module Ethon + class Easy + + # This module contains all the logic around the callbacks, + # which are needed to interact with libcurl. + # + # @api private + module Callbacks + + # :nodoc: + def self.included(base) + base.send(:attr_accessor, *[:response_body, :response_headers, :debug_info]) + end + + # Set writefunction and headerfunction callback. + # They are called by libcurl in order to provide the header and + # the body from the request. + # + # @example Set callbacks. + # easy.set_callbacks + def set_callbacks + Curl.set_option(:writefunction, body_write_callback, handle) + Curl.set_option(:headerfunction, header_write_callback, handle) + Curl.set_option(:debugfunction, debug_callback, handle) + @response_body = "" + @response_headers = "" + @headers_called = false + @debug_info = Ethon::Easy::DebugInfo.new + end + + # Returns the body write callback. + # + # @example Return the callback. + # easy.body_write_callback + # + # @return [ Proc ] The callback. + def body_write_callback + @body_write_callback ||= proc do |stream, size, num, object| + headers + result = body(chunk = stream.read_string(size * num)) + @response_body << chunk if result == :unyielded + result != :abort ? size * num : -1 + end + end + + # Returns the header write callback. + # + # @example Return the callback. + # easy.header_write_callback + # + # @return [ Proc ] The callback. + def header_write_callback + @header_write_callback ||= proc {|stream, size, num, object| + @response_headers << stream.read_string(size * num) + size * num + } + end + + # Returns the debug callback. This callback is currently used + # write the raw http request headers. + # + # @example Return the callback. + # easy.body_write_callback + # + # @return [ Proc ] The callback. + def debug_callback + @debug_callback ||= proc {|handle, type, data, size, udata| + message = data.read_string(size) + @debug_info.add type, message + print message unless [:data_in, :data_out].include?(type) + 0 + } + end + + def set_progress_callback + if Curl.version_info[:version] >= "7.32.0" + Curl.set_option(:xferinfofunction, progress_callback, handle) + else + Curl.set_option(:progressfunction, progress_callback, handle) + end + end + + # Returns the progress callback. + # + # @example Return the callback. + # easy.progress_callback + # + # @return [ Proc ] The callback. + def progress_callback + @progress_callback ||= proc { |_, dltotal, dlnow, ultotal, ulnow| + progress(dltotal, dlnow, ultotal, ulnow) + 0 + } + end + + # Set the read callback. This callback is used by libcurl to + # read data when performing a PUT request. + # + # @example Set the callback. + # easy.set_read_callback("a=1") + # + # @param [ String ] body The body. + def set_read_callback(body) + @request_body_read = 0 + readfunction do |stream, size, num, object| + size = size * num + body_size = if body.respond_to?(:bytesize) + body.bytesize + elsif body.respond_to?(:size) + body.size + elsif body.is_a?(File) + File.size(body.path) + end + + left = body_size - @request_body_read + size = left if size > left + + if size > 0 + chunk = if body.respond_to?(:byteslice) + body.byteslice(@request_body_read, size) + elsif body.respond_to?(:read) + body.read(size) + else + body[@request_body_read, size] + end + + stream.write_string( + chunk, size + ) + @request_body_read += size + end + size + end + end + + # Returns the body read callback. + # + # @example Return the callback. + # easy.read_callback + # + # @return [ Proc ] The callback. + def read_callback + @read_callback + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/debug_info.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/debug_info.rb new file mode 100644 index 000000000000..91a6a15a577b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/debug_info.rb @@ -0,0 +1,46 @@ +module Ethon + class Easy + + # This class is used to store and retreive debug information, + # which is only saved when verbose is set to true. + # + # @api private + class DebugInfo + + MESSAGE_TYPES = Ethon::Curl::DebugInfoType.to_h.keys + + class Message + attr_reader :type, :message + + def initialize(type, message) + @type = type + @message = message + end + end + + def initialize + @messages = [] + end + + def add(type, message) + @messages << Message.new(type, message) + end + + def messages_for(type) + @messages.select {|m| m.type == type }.map(&:message) + end + + MESSAGE_TYPES.each do |type| + eval %Q|def #{type}; messages_for(:#{type}); end| + end + + def to_a + @messages.map(&:message) + end + + def to_h + Hash[MESSAGE_TYPES.map {|k| [k, send(k)] }] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/features.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/features.rb new file mode 100644 index 000000000000..51bd90182a3b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/features.rb @@ -0,0 +1,30 @@ +module Ethon + class Easy + + # This module contains class methods for feature checks + module Features + # Returns true if this curl version supports zlib. + # + # @example Return wether zlib is supported. + # Ethon::Easy.supports_zlib? + # + # @return [ Boolean ] True if supported, else false. + def supports_zlib? + !!(Curl.version_info[:features] & Curl::VERSION_LIBZ) + end + + # Returns true if this curl version supports AsynchDNS. + # + # @example + # Ethon::Easy.supports_asynch_dns? + # + # @return [ Boolean ] True if supported, else false. + def supports_asynch_dns? + !!(Curl.version_info[:features] & Curl::VERSION_ASYNCHDNS) + end + + alias :supports_timeout_ms? :supports_asynch_dns? + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/form.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/form.rb new file mode 100644 index 000000000000..f2543a9ff8ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/form.rb @@ -0,0 +1,106 @@ +require 'ethon/easy/util' +require 'ethon/easy/queryable' + +module Ethon + class Easy + + # This class represents a form and is used to send a payload in the + # request body via POST/PUT. + # It handles multipart forms, too. + # + # @api private + class Form + include Ethon::Easy::Util + include Ethon::Easy::Queryable + + # Return a new Form. + # + # @example Return a new Form. + # Form.new({}) + # + # @param [ Hash ] params The parameter with which to initialize the form. + # + # @return [ Form ] A new Form. + def initialize(easy, params, multipart = nil) + @easy = easy + @params = params || {} + @multipart = multipart + end + + # Return a pointer to the first form element in libcurl. + # + # @example Return the first form element. + # form.first + # + # @return [ FFI::Pointer ] The first element. + def first + @first ||= FFI::MemoryPointer.new(:pointer) + end + + # Return a pointer to the last form element in libcurl. + # + # @example Return the last form element. + # form.last + # + # @return [ FFI::Pointer ] The last element. + def last + @last ||= FFI::MemoryPointer.new(:pointer) + end + + # Return if form is multipart. The form is multipart + # when it contains a file or multipart option is set on the form during creation. + # + # @example Return if form is multipart. + # form.multipart? + # + # @return [ Boolean ] True if form is multipart, else false. + def multipart? + return true if @multipart + query_pairs.any?{|pair| pair.respond_to?(:last) && pair.last.is_a?(Array)} + end + + # Add form elements to libcurl. + # + # @example Add form to libcurl. + # form.materialize + def materialize + query_pairs.each { |pair| form_add(pair.first.to_s, pair.last) } + end + + private + + def form_add(name, content) + case content + when Array + Curl.formadd(first, last, + :form_option, :copyname, :pointer, name, + :form_option, :namelength, :long, name.bytesize, + :form_option, :file, :string, content[2], + :form_option, :filename, :string, content[0], + :form_option, :contenttype, :string, content[1], + :form_option, :end + ) + else + Curl.formadd(first, last, + :form_option, :copyname, :pointer, name, + :form_option, :namelength, :long, name.bytesize, + :form_option, :copycontents, :pointer, content.to_s, + :form_option, :contentslength, :long, content ? content.to_s.bytesize : 0, + :form_option, :end + ) + end + + setup_garbage_collection + end + + def setup_garbage_collection + # first is a pointer to a pointer. Since it's a MemoryPointer it will + # auto clean itself up, but we need to clean up the object it points + # to. So this results in (pseudo-c): + # form_data_cleanup_handler = *first + # curl_form_free(form_data_cleanup_handler) + @form_data_cleanup_handler ||= FFI::AutoPointer.new(@first.get_pointer(0), Curl.method(:formfree)) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/header.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/header.rb new file mode 100644 index 000000000000..893d21c00da7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/header.rb @@ -0,0 +1,60 @@ +module Ethon + class Easy + # This module contains the logic around adding headers to libcurl. + # + # @api private + module Header + # Return headers, return empty hash if none. + # + # @example Return the headers. + # easy.headers + # + # @return [ Hash ] The headers. + def headers + @headers ||= {} + end + + # Set the headers. + # + # @example Set the headers. + # easy.headers = {'User-Agent' => 'ethon'} + # + # @param [ Hash ] headers The headers. + def headers=(headers) + headers ||= {} + header_list = nil + headers.each do |k, v| + header_list = Curl.slist_append(header_list, compose_header(k,v)) + end + Curl.set_option(:httpheader, header_list, handle) + + @header_list = header_list && FFI::AutoPointer.new(header_list, Curl.method(:slist_free_all)) + end + + # Return header_list. + # + # @example Return header_list. + # easy.header_list + # + # @return [ FFI::Pointer ] The header list. + def header_list + @header_list + end + + # Compose libcurl header string from key and value. + # Also replaces null bytes, because libcurl will complain + # otherwise. + # + # @example Compose header. + # easy.compose_header('User-Agent', 'Ethon') + # + # @param [ String ] key The header name. + # @param [ String ] value The header value. + # + # @return [ String ] The composed header. + def compose_header(key, value) + Util.escape_zero_byte("#{key}: #{value}") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http.rb new file mode 100644 index 000000000000..e405ce155c41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http.rb @@ -0,0 +1,67 @@ +require 'ethon/easy/http/actionable' +require 'ethon/easy/http/post' +require 'ethon/easy/http/get' +require 'ethon/easy/http/head' +require 'ethon/easy/http/put' +require 'ethon/easy/http/delete' +require 'ethon/easy/http/patch' +require 'ethon/easy/http/options' +require 'ethon/easy/http/custom' + +module Ethon + class Easy + + # This module contains logic about making valid HTTP requests. + module Http + + # Set specified options in order to make a HTTP request. + # Look at {Ethon::Easy::Options Options} to see what you can + # provide in the options hash. + # + # @example Set options for HTTP request. + # easy.http_request("www.google.com", :get, {}) + # + # @param [ String ] url The url. + # @param [ String ] action_name The HTTP action name. + # @param [ Hash ] options The options hash. + # + # @option options :params [ Hash ] Params hash which + # is attached to the url. + # @option options :body [ Hash ] Body hash which + # becomes the request body. It is a PUT body for + # PUT requests and a POST for everything else. + # @option options :headers [ Hash ] Request headers. + # + # @return [ void ] + # + # @see Ethon::Easy::Options + def http_request(url, action_name, options = {}) + fabricate(url, action_name, options).setup(self) + end + + private + + # Return the corresponding action class. + # + # @example Return the action. + # Action.fabricate(:get) + # Action.fabricate(:smash) + # + # @param [ String ] url The url. + # @param [ String ] action_name The HTTP action name. + # @param [ Hash ] options The option hash. + # + # @return [ Easy::Ethon::Actionable ] The request instance. + def fabricate(url, action_name, options) + constant_name = action_name.to_s.capitalize + + if Ethon::Easy::Http.const_defined?(constant_name) + Ethon::Easy::Http.const_get(constant_name).new(url, options) + else + Ethon::Easy::Http::Custom.new(constant_name.upcase, url, options) + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/actionable.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/actionable.rb new file mode 100644 index 000000000000..329ab5433a0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/actionable.rb @@ -0,0 +1,156 @@ +require 'ethon/easy/http/putable' +require 'ethon/easy/http/postable' + +module Ethon + class Easy + module Http + # This module represents a Http Action and is a factory + # for more real actions like GET, HEAD, POST and PUT. + module Actionable + + QUERY_OPTIONS = [ :params, :body, :params_encoding ] + + # Create a new action. + # + # @example Create a new action. + # Action.new("www.example.com", {}) + # + # @param [ String ] url The url. + # @param [ Hash ] options The options. + # + # @return [ Action ] A new action. + def initialize(url, options) + @url = url + @options, @query_options = parse_options(options) + end + + # Return the url. + # + # @example Return url. + # action.url + # + # @return [ String ] The url. + def url + @url + end + + # Return the options hash. + # + # @example Return options. + # action.options + # + # @return [ Hash ] The options. + def options + @options + end + + # Returns the query options hash. + # + # @example Return query options. + # action.query_options + # + # @return [ Hash ] The query options. + def query_options + @query_options + end + + # Return the params. + # + # @example Return params. + # action.params + # + # @return [ Params ] The params. + def params + @params ||= Params.new(@easy, query_options.fetch(:params, nil)) + end + + # Return the form. + # + # @example Return form. + # action.form + # + # @return [ Form ] The form. + def form + @form ||= Form.new(@easy, query_options.fetch(:body, nil), options.fetch(:multipart, nil)) + end + + # Get the requested array encoding. By default it's + # :typhoeus, but it can also be set to :rack. + # + # @example Get encoding from options + # action.params_encoding + # + def params_encoding + @params_encoding ||= query_options.fetch(:params_encoding, :typhoeus) + end + + # Setup everything necessary for a proper request. + # + # @example setup. + # action.setup(easy) + # + # @param [ easy ] easy the easy to setup. + def setup(easy) + @easy = easy + + # Order is important, @easy will be used to provide access to options + # relevant to the following operations (like whether or not to escape + # values). + easy.set_attributes(options) + + set_form(easy) unless form.empty? + + if params.empty? + easy.url = url + else + set_params(easy) + end + end + + # Setup request with params. + # + # @example Setup nothing. + # action.set_params(easy) + # + # @param [ Easy ] easy The easy to setup. + def set_params(easy) + params.escape = easy.escape? + params.params_encoding = params_encoding + + base_url, base_params = url.split('?') + base_url << '?' + base_url << base_params.to_s + base_url << '&' if base_params + base_url << params.to_s + + easy.url = base_url + end + + # Setup request with form. + # + # @example Setup nothing. + # action.set_form(easy) + # + # @param [ Easy ] easy The easy to setup. + def set_form(easy) + end + + private + + def parse_options(options) + query_options = {} + options = options.dup + + QUERY_OPTIONS.each do |query_option| + if options.key?(query_option) + query_options[query_option] = options.delete(query_option) + end + end + + return options, query_options + end + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/custom.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/custom.rb new file mode 100644 index 000000000000..1bee2f6532b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/custom.rb @@ -0,0 +1,28 @@ +module Ethon + class Easy + module Http + + # This class knows everything about making requests for custom HTTP verbs. + class Custom + include Ethon::Easy::Http::Actionable + include Ethon::Easy::Http::Postable + + def initialize(verb, url, options) + @verb = verb + super(url, options) + end + + # Setup easy to make a request. + # + # @example Setup. + # custom.set_params(easy) + # + # @param [ Easy ] easy The easy to setup. + def setup(easy) + super + easy.customrequest = @verb + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/delete.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/delete.rb new file mode 100644 index 000000000000..ecdf33aaf9eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/delete.rb @@ -0,0 +1,24 @@ +module Ethon + class Easy + module Http + + # This class knows everything about making DELETE requests. + class Delete + include Ethon::Easy::Http::Actionable + include Ethon::Easy::Http::Postable + + # Setup easy to make a DELETE request. + # + # @example Setup customrequest. + # delete.setup(easy) + # + # @param [ Easy ] easy The easy to setup. + def setup(easy) + super + easy.customrequest = "DELETE" + end + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/get.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/get.rb new file mode 100644 index 000000000000..345146bdab15 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/get.rb @@ -0,0 +1,23 @@ +module Ethon + class Easy + module Http + + # This class knows everything about making GET requests. + class Get + include Ethon::Easy::Http::Actionable + include Ethon::Easy::Http::Postable + + # Setup easy to make a GET request. + # + # @example Setup. + # get.set_params(easy) + # + # @param [ Easy ] easy The easy to setup. + def setup(easy) + super + easy.customrequest = "GET" unless form.empty? + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/head.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/head.rb new file mode 100644 index 000000000000..b15460cce7d1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/head.rb @@ -0,0 +1,23 @@ +module Ethon + class Easy + module Http + + # This class knows everything about making HEAD requests. + class Head + include Ethon::Easy::Http::Actionable + include Ethon::Easy::Http::Postable + + # Setup easy to make a HEAD request. + # + # @example Setup. + # get.set_params(easy) + # + # @param [ Easy ] easy The easy to setup. + def setup(easy) + super + easy.nobody = true + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/options.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/options.rb new file mode 100644 index 000000000000..b49f75ee232a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/options.rb @@ -0,0 +1,23 @@ +module Ethon + class Easy + module Http + + # This class knows everything about making OPTIONS requests. + class Options + include Ethon::Easy::Http::Actionable + include Ethon::Easy::Http::Postable + + # Setup easy to make a OPTIONS request. + # + # @example Setup. + # options.setup(easy) + # + # @param [ Easy ] easy The easy to setup. + def setup(easy) + super + easy.customrequest = "OPTIONS" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/patch.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/patch.rb new file mode 100644 index 000000000000..36a69a664d5a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/patch.rb @@ -0,0 +1,23 @@ +module Ethon + class Easy + module Http + + # This class knows everything about making PATCH requests. + class Patch + include Ethon::Easy::Http::Actionable + include Ethon::Easy::Http::Postable + + # Setup easy to make a PATCH request. + # + # @example Setup. + # patch.setup(easy) + # + # @param [ Easy ] easy The easy to setup. + def setup(easy) + super + easy.customrequest = "PATCH" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/post.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/post.rb new file mode 100644 index 000000000000..c454cbe9324c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/post.rb @@ -0,0 +1,25 @@ +module Ethon + class Easy + module Http + # This class knows everything about making POST requests. + class Post + include Ethon::Easy::Http::Actionable + include Ethon::Easy::Http::Postable + + # Setup easy to make a POST request. + # + # @example Setup. + # post.setup(easy) + # + # @param [ Easy ] easy The easy to setup. + def setup(easy) + super + if form.empty? + easy.postfieldsize = 0 + easy.copypostfields = "" + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/postable.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/postable.rb new file mode 100644 index 000000000000..a93ce175497f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/postable.rb @@ -0,0 +1,31 @@ +module Ethon + class Easy + module Http + + # This module contains logic for setting up a [multipart] POST body. + module Postable + + # Set things up when form is provided. + # Deals with multipart forms. + # + # @example Setup. + # post.set_form(easy) + # + # @param [ Easy ] easy The easy to setup. + def set_form(easy) + easy.url ||= url + form.params_encoding = params_encoding + if form.multipart? + form.escape = false + form.materialize + easy.httppost = form.first.read_pointer + else + form.escape = easy.escape? + easy.postfieldsize = form.to_s.bytesize + easy.copypostfields = form.to_s + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/put.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/put.rb new file mode 100644 index 000000000000..4bfa415504a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/put.rb @@ -0,0 +1,26 @@ +module Ethon + class Easy + module Http + + # This class knows everything about making PUT requests. + class Put + include Ethon::Easy::Http::Actionable + include Ethon::Easy::Http::Putable + + # Setup easy to make a PUT request. + # + # @example Setup. + # put.setup(easy) + # + # @param [ Easy ] easy The easy to setup. + def setup(easy) + super + if form.empty? + easy.upload = true + easy.infilesize = 0 + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/putable.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/putable.rb new file mode 100644 index 000000000000..5bca8750a28a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/http/putable.rb @@ -0,0 +1,24 @@ +module Ethon + class Easy + module Http + + # This module contains logic about setting up a PUT body. + module Putable + # Set things up when form is provided. + # Deals with multipart forms. + # + # @example Setup. + # put.set_form(easy) + # + # @param [ Easy ] easy The easy to setup. + def set_form(easy) + easy.upload = true + form.escape = true + form.params_encoding = params_encoding + easy.infilesize = form.to_s.bytesize + easy.set_read_callback(form.to_s) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/informations.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/informations.rb new file mode 100644 index 000000000000..111993989d4f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/informations.rb @@ -0,0 +1,94 @@ +module Ethon + class Easy + + # This module contains the methods to return informations + # from the easy handle. See http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html + # for more information. + module Informations + + # Holds available informations and their type, which is needed to + # request the informations from libcurl. + AVAILABLE_INFORMATIONS = { + # Return the available HTTP auth methods. + :httpauth_avail => :long, + + # Return the total time in seconds for the previous + # transfer, including name resolution, TCP connection, etc. + :total_time => :double, + + # Return the time, in seconds, it took from the start + # until the first byte was received by libcurl. This + # includes pre-transfer time and also the time the + # server needs to calculate the result. + :starttransfer_time => :double, + + # Return the time, in seconds, it took from the start + # until the SSL/SSH connect/handshake to the remote + # host was completed. This time is most often very near + # to the pre-transfer time, except for cases such as HTTP + # pipelining where the pre-transfer time can be delayed + # due to waits in line for the pipeline and more. + :appconnect_time => :double, + + # Return the time, in seconds, it took from the start + # until the file transfer was just about to begin. This + # includes all pre-transfer commands and negotiations + # that are specific to the particular protocol(s) involved. + # It does not involve the sending of the protocol- + # specific request that triggers a transfer. + :pretransfer_time => :double, + + # Return the time, in seconds, it took from the start + # until the connect to the remote host (or proxy) was completed. + :connect_time => :double, + + # Return the time, in seconds, it took from the + # start until the name resolution was completed. + :namelookup_time => :double, + + # Return the time, in seconds, it took for all redirection steps + # include name lookup, connect, pretransfer and transfer before the + # final transaction was started. time_redirect shows the complete + # execution time for multiple redirections. (Added in 7.12.3) + :redirect_time => :double, + + # Return the last used effective url. + :effective_url => :string, + + # Return the string holding the IP address of the most recent + # connection done with this curl handle. This string + # may be IPv6 if that's enabled. + :primary_ip => :string, + + # Return the last received HTTP, FTP or SMTP response code. + # The value will be zero if no server response code has + # been received. Note that a proxy's CONNECT response should + # be read with http_connect_code and not this. + :response_code => :long, + + :request_size => :long, + + # Return the total number of redirections that were + # actually followed. + :redirect_count => :long + } + + AVAILABLE_INFORMATIONS.each do |name, type| + eval %Q|def #{name}; Curl.send(:get_info_#{type}, :#{name}, handle); end| + end + + # Returns true if this curl version supports zlib. + # + # @example Return wether zlib is supported. + # easy.supports_zlib? + # + # @return [ Boolean ] True if supported, else false. + # @deprecated Please use the static version instead + def supports_zlib? + Kernel.warn("Ethon: Easy#supports_zlib? is deprecated and will be removed, please use Easy#.") + Easy.supports_zlib? + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/mirror.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/mirror.rb new file mode 100644 index 000000000000..f6920e66ed1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/mirror.rb @@ -0,0 +1,35 @@ +module Ethon + class Easy + class Mirror + attr_reader :options + alias_method :to_hash, :options + + INFORMATIONS_TO_MIRROR = Informations::AVAILABLE_INFORMATIONS.keys + + [:return_code, :response_headers, :response_body, :debug_info] + + INFORMATIONS_TO_LOG = [:effective_url, :response_code, :return_code, :total_time] + + def self.from_easy(easy) + options = {} + INFORMATIONS_TO_MIRROR.each do |info| + options[info] = easy.send(info) + end + new(options) + end + + def initialize(options = {}) + @options = options + end + + def log_informations + Hash[*INFORMATIONS_TO_LOG.map do |info| + [info, options[info]] + end.flatten] + end + + INFORMATIONS_TO_MIRROR.each do |info| + eval %Q|def #{info}; options[#{info}]; end| + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/operations.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/operations.rb new file mode 100644 index 000000000000..43702f4068e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/operations.rb @@ -0,0 +1,63 @@ +module Ethon + class Easy + # This module contains the logic to prepare and perform + # an easy. + module Operations + # Returns a pointer to the curl easy handle. + # + # @example Return the handle. + # easy.handle + # + # @return [ FFI::Pointer ] A pointer to the curl easy handle. + def handle + @handle ||= FFI::AutoPointer.new(Curl.easy_init, Curl.method(:easy_cleanup)) + end + + # Sets a pointer to the curl easy handle. + # @param [ ::FFI::Pointer ] Easy handle that will be assigned. + def handle=(h) + @handle = h + end + + # Perform the easy request. + # + # @example Perform the request. + # easy.perform + # + # @return [ Integer ] The return code. + def perform + @return_code = Curl.easy_perform(handle) + if Ethon.logger.debug? + Ethon.logger.debug { "ETHON: performed #{log_inspect}" } + end + complete + @return_code + end + + # Clean up the easy. + # + # @example Perform clean up. + # easy.cleanup + # + # @return the result of the free which is nil + def cleanup + handle.free + end + + # Prepare the easy. Options, headers and callbacks + # were set. + # + # @example Prepare easy. + # easy.prepare + # + # @deprecated It is no longer necessary to call prepare. + def prepare + Ethon.logger.warn( + "ETHON: It is no longer necessary to call "+ + "Easy#prepare. It's going to be removed "+ + "in future versions." + ) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/options.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/options.rb new file mode 100644 index 000000000000..d9395239234e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/options.rb @@ -0,0 +1,49 @@ +module Ethon + class Easy + + # This module contains the logic and knowledge about the + # available options on easy. + module Options + attr_reader :url + + def url=(value) + @url = value + Curl.set_option(:url, value, handle) + end + + def escape=( b ) + @escape = b + end + + def escape? + return true if !defined?(@escape) || @escape.nil? + @escape + end + + def multipart=(b) + @multipart = b + end + + def multipart? + !!@multipart + end + + Curl.easy_options(nil).each do |opt, props| + method_name = "#{opt}=".freeze + unless method_defined? method_name + define_method(method_name) do |value| + Curl.set_option(opt, value, handle) + value + end + end + next if props[:type] != :callback || method_defined?(opt) + define_method(opt) do |&block| + @procs ||= {} + @procs[opt.to_sym] = block + Curl.set_option(opt, block, handle) + nil + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/params.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/params.rb new file mode 100644 index 000000000000..634a03fde64c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/params.rb @@ -0,0 +1,28 @@ +require 'ethon/easy/util' +require 'ethon/easy/queryable' + +module Ethon + class Easy + + # This class represents HTTP request parameters. + # + # @api private + class Params + include Ethon::Easy::Util + include Ethon::Easy::Queryable + + # Create a new Params. + # + # @example Create a new Params. + # Params.new({}) + # + # @param [ Hash ] params The params to use. + # + # @return [ Params ] A new Params. + def initialize(easy, params) + @easy = easy + @params = params || {} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/queryable.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/queryable.rb new file mode 100644 index 000000000000..ae35ef652ecb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/queryable.rb @@ -0,0 +1,153 @@ +module Ethon + class Easy + + # This module contains logic about building + # query parameters for url or form. + module Queryable + + # :nodoc: + def self.included(base) + base.send(:attr_accessor, :escape) + base.send(:attr_accessor, :params_encoding) + end + + # Return wether there are elements in params or not. + # + # @example Return if params is empty. + # form.empty? + # + # @return [ Boolean ] True if params is empty, else false. + def empty? + @params.empty? + end + + # Return the string representation of params. + # + # @example Return string representation. + # params.to_s + # + # @return [ String ] The string representation. + def to_s + @to_s ||= query_pairs.map{ |pair| + return pair if pair.is_a?(String) + + if escape && @easy + pair.map{ |e| @easy.escape(e.to_s) }.join("=") + else + pair.join("=") + end + }.join('&') + end + + # Return the query pairs. + # + # @example Return the query pairs. + # params.query_pairs + # + # @return [ Array ] The query pairs. + def query_pairs + @query_pairs ||= build_query_pairs(@params) + end + + # Return query pairs build from a hash. + # + # @example Build query pairs. + # action.build_query_pairs({a: 1, b: 2}) + # #=> [[:a, 1], [:b, 2]] + # + # @param [ Hash ] hash The hash to go through. + # + # @return [ Array ] The array of query pairs. + def build_query_pairs(hash) + return [hash] if hash.is_a?(String) + + pairs = [] + recursively_generate_pairs(hash, nil, pairs) + pairs + end + + # Return file info for a file. + # + # @example Return file info. + # action.file_info(File.open('fubar', 'r')) + # + # @param [ File ] file The file to handle. + # + # @return [ Array ] Array of informations. + def file_info(file) + filename = File.basename(file.path) + [ + filename, + mime_type(filename), + File.expand_path(file.path) + ] + end + + private + + def mime_type(filename) + if defined?(MIME) && t = MIME::Types.type_for(filename).first + t.to_s + else + 'application/octet-stream' + end + end + + def recursively_generate_pairs(h, prefix, pairs) + case h + when Hash + encode_hash_pairs(h, prefix, pairs) + when Array + if params_encoding == :rack + encode_rack_array_pairs(h, prefix, pairs) + elsif params_encoding == :multi + encode_multi_array_pairs(h, prefix, pairs) + elsif params_encoding == :none + pairs << [prefix, h] + else + encode_indexed_array_pairs(h, prefix, pairs) + end + end + end + + def encode_hash_pairs(h, prefix, pairs) + h.each_pair do |k,v| + key = prefix.nil? ? k : "#{prefix}[#{k}]" + pairs_for(v, key, pairs) + end + end + + def encode_indexed_array_pairs(h, prefix, pairs) + h.each_with_index do |v, i| + key = "#{prefix}[#{i}]" + pairs_for(v, key, pairs) + end + end + + def encode_rack_array_pairs(h, prefix, pairs) + h.each do |v| + key = "#{prefix}[]" + pairs_for(v, key, pairs) + end + end + + def encode_multi_array_pairs(h, prefix, pairs) + h.each_with_index do |v, i| + key = prefix + pairs_for(v, key, pairs) + end + end + + def pairs_for(v, key, pairs) + case v + when Hash, Array + recursively_generate_pairs(v, key, pairs) + when File, Tempfile + pairs << [key, file_info(v)] + else + pairs << [key, v] + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/response_callbacks.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/response_callbacks.rb new file mode 100644 index 000000000000..835d495da9db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/response_callbacks.rb @@ -0,0 +1,130 @@ +module Ethon + class Easy + + # This module contains the logic for the response callbacks. + # The on_complete callback is the only one at the moment. + # + # You can set multiple callbacks, which are then executed + # in the same order. + # + # easy.on_complete { p 1 } + # easy.on_complete { p 2 } + # easy.complete + # #=> 1 + # #=> 2 + # + # You can clear the callbacks: + # + # easy.on_complete { p 1 } + # easy.on_complete { p 2 } + # easy.on_complete.clear + # easy.on_complete + # #=> [] + module ResponseCallbacks + + # Set on_headers callback. + # + # @example Set on_headers. + # request.on_headers { p "yay" } + # + # @param [ Block ] block The block to execute. + def on_headers(&block) + @on_headers ||= [] + @on_headers << block if block_given? + @on_headers + end + + # Execute on_headers callbacks. + # + # @example Execute on_headers. + # request.headers + def headers + return if @headers_called + @headers_called = true + if defined?(@on_headers) and not @on_headers.nil? + @on_headers.each{ |callback| callback.call(self) } + end + end + + # Set on_complete callback. + # + # @example Set on_complete. + # request.on_complete { p "yay" } + # + # @param [ Block ] block The block to execute. + def on_complete(&block) + @on_complete ||= [] + @on_complete << block if block_given? + @on_complete + end + + # Execute on_complete callbacks. + # + # @example Execute on_completes. + # request.complete + def complete + headers unless @response_headers.empty? + if defined?(@on_complete) and not @on_complete.nil? + @on_complete.each{ |callback| callback.call(self) } + end + end + + # Set on_progress callback. + # + # @example Set on_progress. + # request.on_progress {|dltotal, dlnow, ultotal, ulnow| p "#{dltotal} #{dlnow} #{ultotal} #{ulnow}" } + # + # @param [ Block ] block The block to execute. + def on_progress(&block) + @on_progress ||= [] + if block_given? + @on_progress << block + set_progress_callback + self.noprogress = 0 + end + @on_progress + end + + # Execute on_progress callbacks. + # + # @example Execute on_progress. + # request.body(1, 1, 1, 1) + def progress(dltotal, dlnow, ultotal, ulnow) + if defined?(@on_progress) and not @on_progress.nil? + @on_progress.each{ |callback| callback.call(dltotal, dlnow, ultotal, ulnow) } + end + end + + # Set on_body callback. + # + # @example Set on_body. + # request.on_body { |chunk| p "yay" } + # + # @param [ Block ] block The block to execute. + def on_body(&block) + @on_body ||= [] + @on_body << block if block_given? + @on_body + end + + # Execute on_body callbacks. + # + # @example Execute on_body. + # request.body("This data came from HTTP.") + # + # @return [ Object ] If there are no on_body callbacks, returns the symbol :unyielded. + def body(chunk) + if defined?(@on_body) and not @on_body.nil? + result = nil + @on_body.each do |callback| + result = callback.call(chunk, self) + break if result == :abort + end + result + else + :unyielded + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/util.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/util.rb new file mode 100644 index 000000000000..6b222cce2048 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/easy/util.rb @@ -0,0 +1,27 @@ +module Ethon + class Easy # :nodoc: + + # This module contains small helpers. + # + # @api private + module Util + + # Escapes zero bytes in strings. + # + # @example Escape zero bytes. + # Util.escape_zero_byte("1\0") + # #=> "1\\0" + # + # @param [ Object ] value The value to escape. + # + # @return [ String, Object ] Escaped String if + # zero byte found, original object if not. + def escape_zero_byte(value) + return value unless value.to_s.include?(0.chr) + value.to_s.gsub(0.chr, '\\\0') + end + + extend self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors.rb new file mode 100644 index 000000000000..185d749e07db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors.rb @@ -0,0 +1,16 @@ +require 'ethon/errors/ethon_error' +require 'ethon/errors/global_init' +require 'ethon/errors/multi_timeout' +require 'ethon/errors/multi_fdset' +require 'ethon/errors/multi_add' +require 'ethon/errors/multi_remove' +require 'ethon/errors/select' +require 'ethon/errors/invalid_option' +require 'ethon/errors/invalid_value' + +module Ethon + + # This namespace contains all errors raised by ethon. + module Errors + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/ethon_error.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/ethon_error.rb new file mode 100644 index 000000000000..ad12e88a5ee0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/ethon_error.rb @@ -0,0 +1,8 @@ +module Ethon + module Errors + + # Default Ethon error class for all custom errors. + class EthonError < StandardError + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/global_init.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/global_init.rb new file mode 100644 index 000000000000..7056dcc022be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/global_init.rb @@ -0,0 +1,12 @@ +module Ethon + module Errors + + # Raises when global_init failed. + class GlobalInit < EthonError + def initialize + super("An error occured initializing curl.") + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/invalid_option.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/invalid_option.rb new file mode 100644 index 000000000000..2ef4e534d3ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/invalid_option.rb @@ -0,0 +1,12 @@ +module Ethon + module Errors + + # Raises when option is invalid. + class InvalidOption < EthonError + def initialize(option) + super("The option: #{option} is invalid.") + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/invalid_value.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/invalid_value.rb new file mode 100644 index 000000000000..c45b8f244bd8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/invalid_value.rb @@ -0,0 +1,12 @@ +module Ethon + module Errors + + # Raises when option is invalid. + class InvalidValue < EthonError + def initialize(option, value) + super("The value: #{value} is invalid for option: #{option}.") + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_add.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_add.rb new file mode 100644 index 000000000000..194ef9663f97 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_add.rb @@ -0,0 +1,11 @@ +module Ethon + module Errors + + # Raises when multi_add_handle failed. + class MultiAdd < EthonError + def initialize(code, easy) + super("An error occured adding the easy handle: #{easy} to the multi: #{code}") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_fdset.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_fdset.rb new file mode 100644 index 000000000000..2364015d4cdb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_fdset.rb @@ -0,0 +1,11 @@ +module Ethon + module Errors + + # Raises when multi_fdset failed. + class MultiFdset < EthonError + def initialize(code) + super("An error occured getting the fdset: #{code}") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_remove.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_remove.rb new file mode 100644 index 000000000000..fb43998b8961 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_remove.rb @@ -0,0 +1,11 @@ +module Ethon + module Errors + + # Raises when multi_remove_handle failed. + class MultiRemove < EthonError + def initialize(code, easy) + super("An error occured removing the easy handle: #{easy} from the multi: #{code}") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_timeout.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_timeout.rb new file mode 100644 index 000000000000..647de75d4dd1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/multi_timeout.rb @@ -0,0 +1,12 @@ +module Ethon + module Errors + + # Raised when multi_timeout failed. + class MultiTimeout < EthonError + def initialize(code) + super("An error occured getting the timeout: #{code}") + # "An error occured getting the timeout: #{code}: #{Curl.multi_strerror(code)}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/select.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/select.rb new file mode 100644 index 000000000000..9bd22df793cc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/errors/select.rb @@ -0,0 +1,12 @@ +module Ethon + module Errors + + # Raised when select failed. + class Select < EthonError + def initialize(errno) + super("An error occured on select: #{errno}") + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/libc.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/libc.rb new file mode 100644 index 000000000000..8459866780d0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/libc.rb @@ -0,0 +1,20 @@ +module Ethon + + # FFI Wrapper module for Libc. + # + # @api private + module Libc + extend FFI::Library + ffi_lib 'c' + + # :nodoc: + def self.windows? + Gem.win_platform? + end + + unless windows? + attach_function :getdtablesize, [], :int + attach_function :free, [:pointer], :void + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/loggable.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/loggable.rb new file mode 100644 index 000000000000..a442399febbf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/loggable.rb @@ -0,0 +1,58 @@ +# encoding: utf-8 +module Ethon + + # Contains logging behaviour. + module Loggable + + # Get the logger. + # + # @note Will try to grab Rails' logger first before creating a new logger + # with stdout. + # + # @example Get the logger. + # Loggable.logger + # + # @return [ Logger ] The logger. + def logger + return @logger if defined?(@logger) + @logger = rails_logger || default_logger + end + + # Set the logger. + # + # @example Set the logger. + # Loggable.logger = Logger.new($stdout) + # + # @param [ Logger ] logger The logger to set. + # + # @return [ Logger ] The new logger. + def logger=(logger) + @logger = logger + end + + private + + # Gets the default Ethon logger - stdout. + # + # @example Get the default logger. + # Loggable.default_logger + # + # @return [ Logger ] The default logger. + def default_logger + logger = Logger.new($stdout) + logger.level = Logger::INFO + logger + end + + # Get the Rails logger if it's defined. + # + # @example Get Rails' logger. + # Loggable.rails_logger + # + # @return [ Logger ] The Rails logger. + def rails_logger + defined?(::Rails) && ::Rails.respond_to?(:logger) && ::Rails.logger + end + end + extend Loggable +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi.rb new file mode 100644 index 000000000000..e51bb2976f2d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi.rb @@ -0,0 +1,103 @@ +require 'ethon/easy/util' +require 'ethon/multi/stack' +require 'ethon/multi/operations' +require 'ethon/multi/options' + +module Ethon + + # This class represents libcurl multi. + class Multi + include Ethon::Multi::Stack + include Ethon::Multi::Operations + include Ethon::Multi::Options + + # Create a new multi. Initialize curl in case + # it didn't happen before. + # + # @example Create a new Multi. + # Multi.new + # + # @param [ Hash ] options The options. + # + # @option options :socketdata [String] + # Pass a pointer to whatever you want passed to the + # curl_socket_callback's forth argument, the userp pointer. This is not + # used by libcurl but only passed-thru as-is. Set the callback pointer + # with CURLMOPT_SOCKETFUNCTION. + # @option options :pipelining [Boolean] + # Pass a long set to 1 to enable or 0 to disable. Enabling pipelining + # on a multi handle will make it attempt to perform HTTP Pipelining as + # far as possible for transfers using this handle. This means that if + # you add a second request that can use an already existing connection, + # the second request will be "piped" on the same connection rather than + # being executed in parallel. (Added in 7.16.0) + # @option options :timerfunction [Proc] + # Pass a pointer to a function matching the curl_multi_timer_callback + # prototype. This function will then be called when the timeout value + # changes. The timeout value is at what latest time the application + # should call one of the "performing" functions of the multi interface + # (curl_multi_socket_action(3) and curl_multi_perform(3)) - to allow + # libcurl to keep timeouts and retries etc to work. A timeout value of + # -1 means that there is no timeout at all, and 0 means that the + # timeout is already reached. Libcurl attempts to limit calling this + # only when the fixed future timeout time actually changes. See also + # CURLMOPT_TIMERDATA. This callback can be used instead of, or in + # addition to, curl_multi_timeout(3). (Added in 7.16.0) + # @option options :timerdata [String] + # Pass a pointer to whatever you want passed to the + # curl_multi_timer_callback's third argument, the userp pointer. This + # is not used by libcurl but only passed-thru as-is. Set the callback + # pointer with CURLMOPT_TIMERFUNCTION. (Added in 7.16.0) + # @option options :maxconnects [Integer] + # Pass a long. The set number will be used as the maximum amount of + # simultaneously open connections that libcurl may cache. Default is + # 10, and libcurl will enlarge the size for each added easy handle to + # make it fit 4 times the number of added easy handles. + # By setting this option, you can prevent the cache size from growing + # beyond the limit set by you. + # When the cache is full, curl closes the oldest one in the cache to + # prevent the number of open connections from increasing. + # This option is for the multi handle's use only, when using the easy + # interface you should instead use the CURLOPT_MAXCONNECTS option. + # (Added in 7.16.3) + # @option options :max_total_connections [Integer] + # Pass a long. The set number will be used as the maximum amount of + # simultaneously open connections in total. For each new session, + # libcurl will open a new connection up to the limit set by + # CURLMOPT_MAX_TOTAL_CONNECTIONS. When the limit is reached, the + # sessions will be pending until there are available connections. + # If CURLMOPT_PIPELINING is 1, libcurl will try to pipeline if the host + # is capable of it. + # The default value is 0, which means that there is no limit. However, + # for backwards compatibility, setting it to 0 when CURLMOPT_PIPELINING + # is 1 will not be treated as unlimited. Instead it will open only 1 + # connection and try to pipeline on it. + # (Added in 7.30.0) + # + # @return [ Multi ] The new multi. + def initialize(options = {}) + Curl.init + set_attributes(options) + init_vars + end + + # Set given options. + # + # @example Set options. + # multi.set_attributes(options) + # + # @raise InvalidOption + # + # @see initialize + # + # @api private + def set_attributes(options) + options.each_pair do |key, value| + unless respond_to?("#{key}=") + raise Errors::InvalidOption.new(key) + end + method("#{key}=").call(value) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi/operations.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi/operations.rb new file mode 100644 index 000000000000..8e0c49d8adaf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi/operations.rb @@ -0,0 +1,190 @@ +module Ethon + class Multi # :nodoc + # This module contains logic to run a multi. + module Operations + STARTED_MULTI = "ETHON: started MULTI" + PERFORMED_MULTI = "ETHON: performed MULTI" + + # Return the multi handle. Inititialize multi handle, + # in case it didn't happened already. + # + # @example Return multi handle. + # multi.handle + # + # @return [ FFI::Pointer ] The multi handle. + def handle + @handle ||= FFI::AutoPointer.new(Curl.multi_init, Curl.method(:multi_cleanup)) + end + + # Initialize variables. + # + # @example Initialize variables. + # multi.init_vars + # + # @return [ void ] + def init_vars + @timeout = ::FFI::MemoryPointer.new(:long) + @timeval = Curl::Timeval.new + @fd_read = Curl::FDSet.new + @fd_write = Curl::FDSet.new + @fd_excep = Curl::FDSet.new + @max_fd = ::FFI::MemoryPointer.new(:int) + end + + # Perform multi. + # + # @return [ nil ] + # + # @example Perform multi. + # multi.perform + def perform + Ethon.logger.debug(STARTED_MULTI) + while ongoing? + run + timeout = get_timeout + next if timeout == 0 + reset_fds + set_fds(timeout) + end + Ethon.logger.debug(PERFORMED_MULTI) + nil + end + + # Prepare multi. + # + # @return [ nil ] + # + # @example Prepare multi. + # multi.prepare + # + # @deprecated It is no longer necessary to call prepare. + def prepare + Ethon.logger.warn( + "ETHON: It is no longer necessay to call "+ + "Multi#prepare. Its going to be removed "+ + "in future versions." + ) + end + + private + + # Return wether the multi still requests or not. + # + # @example Return if ongoing. + # multi.ongoing? + # + # @return [ Boolean ] True if ongoing, else false. + def ongoing? + easy_handles.size > 0 || (!defined?(@running_count) || running_count > 0) + end + + # Get timeout. + # + # @example Get timeout. + # multi.get_timeout + # + # @return [ Integer ] The timeout. + # + # @raise [ Ethon::Errors::MultiTimeout ] If getting the timeout fails. + def get_timeout + code = Curl.multi_timeout(handle, @timeout) + raise Errors::MultiTimeout.new(code) unless code == :ok + timeout = @timeout.read_long + timeout = 1 if timeout < 0 + timeout + end + + # Reset file describtors. + # + # @example Reset fds. + # multi.reset_fds + # + # @return [ void ] + def reset_fds + @fd_read.clear + @fd_write.clear + @fd_excep.clear + end + + # Set fds. + # + # @example Set fds. + # multi.set_fds + # + # @return [ void ] + # + # @raise [ Ethon::Errors::MultiFdset ] If setting the file descriptors fails. + # @raise [ Ethon::Errors::Select ] If select fails. + def set_fds(timeout) + code = Curl.multi_fdset(handle, @fd_read, @fd_write, @fd_excep, @max_fd) + raise Errors::MultiFdset.new(code) unless code == :ok + max_fd = @max_fd.read_int + if max_fd == -1 + sleep(0.001) + else + @timeval[:sec] = timeout / 1000 + @timeval[:usec] = (timeout * 1000) % 1000000 + loop do + code = Curl.select(max_fd + 1, @fd_read, @fd_write, @fd_excep, @timeval) + break unless code < 0 && ::FFI.errno == Errno::EINTR::Errno + end + raise Errors::Select.new(::FFI.errno) if code < 0 + end + end + + # Check. + # + # @example Check. + # multi.check + # + # @return [ void ] + def check + msgs_left = ::FFI::MemoryPointer.new(:int) + while true + msg = Curl.multi_info_read(handle, msgs_left) + break if msg.null? + next if msg[:code] != :done + easy = easy_handles.find{ |e| e.handle == msg[:easy_handle] } + easy.return_code = msg[:data][:code] + Ethon.logger.debug { "ETHON: performed #{easy.log_inspect}" } + delete(easy) + easy.complete + end + end + + # Run. + # + # @example Run + # multi.run + # + # @return [ void ] + def run + running_count_pointer = FFI::MemoryPointer.new(:int) + begin code = trigger(running_count_pointer) end while code == :call_multi_perform + check + end + + # Trigger. + # + # @example Trigger. + # multi.trigger + # + # @return [ Symbol ] The Curl.multi_perform return code. + def trigger(running_count_pointer) + code = Curl.multi_perform(handle, running_count_pointer) + @running_count = running_count_pointer.read_int + code + end + + # Return number of running requests. + # + # @example Return count. + # multi.running_count + # + # @return [ Integer ] Number running requests. + def running_count + @running_count ||= nil + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi/options.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi/options.rb new file mode 100644 index 000000000000..a564ac6d9810 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi/options.rb @@ -0,0 +1,116 @@ +module Ethon + class Multi + + # This module contains the logic and knowledge about the + # available options on multi. + module Options + + # Sets max_total_connections option. + # + # @example Set max_total_connections option. + # easy.max_total_conections = $value + # + # @param [ String ] value The value to set. + # + # @return [ void ] + def max_total_connections=(value) + Curl.set_option(:max_total_connections, value_for(value, :int), handle, :multi) + end + + # Sets maxconnects option. + # + # @example Set maxconnects option. + # easy.maxconnects = $value + # + # @param [ String ] value The value to set. + # + # @return [ void ] + def maxconnects=(value) + Curl.set_option(:maxconnects, value_for(value, :int), handle, :multi) + end + + # Sets pipelining option. + # + # @example Set pipelining option. + # easy.pipelining = $value + # + # @param [ String ] value The value to set. + # + # @return [ void ] + def pipelining=(value) + Curl.set_option(:pipelining, value_for(value, :int), handle, :multi) + end + + # Sets socketdata option. + # + # @example Set socketdata option. + # easy.socketdata = $value + # + # @param [ String ] value The value to set. + # + # @return [ void ] + def socketdata=(value) + Curl.set_option(:socketdata, value_for(value, :string), handle, :multi) + end + + # Sets socketfunction option. + # + # @example Set socketfunction option. + # easy.socketfunction = $value + # + # @param [ String ] value The value to set. + # + # @return [ void ] + def socketfunction=(value) + Curl.set_option(:socketfunction, value_for(value, :string), handle, :multi) + end + + # Sets timerdata option. + # + # @example Set timerdata option. + # easy.timerdata = $value + # + # @param [ String ] value The value to set. + # + # @return [ void ] + def timerdata=(value) + Curl.set_option(:timerdata, value_for(value, :string), handle, :multi) + end + + # Sets timerfunction option. + # + # @example Set timerfunction option. + # easy.timerfunction = $value + # + # @param [ String ] value The value to set. + # + # @return [ void ] + def timerfunction=(value) + Curl.set_option(:timerfunction, value_for(value, :string), handle, :multi) + end + + private + + # Return the value to set to multi handle. It is converted with the help + # of bool_options, enum_options and int_options. + # + # @example Return casted the value. + # multi.value_for(:verbose) + # + # @return [ Object ] The casted value. + def value_for(value, type, option = nil) + return nil if value.nil? + + if type == :bool + value ? 1 : 0 + elsif type == :int + value.to_i + elsif value.is_a?(String) + Ethon::Easy::Util.escape_zero_byte(value) + else + value + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi/stack.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi/stack.rb new file mode 100644 index 000000000000..fe1619f502a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/multi/stack.rb @@ -0,0 +1,48 @@ +module Ethon + class Multi + + # This module provides the multi stack behaviour. + module Stack + + # Return easy handles. + # + # @example Return easy handles. + # multi.easy_handles + # + # @return [ Array ] The easy handles. + def easy_handles + @easy_handles ||= [] + end + + # Add an easy to the stack. + # + # @example Add easy. + # multi.add(easy) + # + # @param [ Easy ] easy The easy to add. + # + # @raise [ Ethon::Errors::MultiAdd ] If adding an easy failed. + def add(easy) + return nil if easy_handles.include?(easy) + + code = Curl.multi_add_handle(handle, easy.handle) + raise Errors::MultiAdd.new(code, easy) unless code == :ok + easy_handles << easy + end + + # Delete an easy from stack. + # + # @example Delete easy from stack. + # + # @param [ Easy ] easy The easy to delete. + # + # @raise [ Ethon::Errors::MultiRemove ] If removing an easy failed. + def delete(easy) + if easy_handles.delete(easy) + code = Curl.multi_remove_handle(handle, easy.handle) + raise Errors::MultiRemove.new(code, handle) unless code == :ok + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/version.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/version.rb new file mode 100644 index 000000000000..a2c62deca94b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/lib/ethon/version.rb @@ -0,0 +1,5 @@ +module Ethon + + # Ethon version. + VERSION = '0.12.0' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/benchmarks.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/benchmarks.rb new file mode 100644 index 000000000000..3a5e24d2d618 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/benchmarks.rb @@ -0,0 +1,103 @@ +# encoding: utf-8 +require 'ethon' +require 'open-uri' +require 'patron' +require 'curb' +require 'net/http' +require 'cgi' +require 'benchmark/ips' + +require_relative '../spec/support/server' +require_relative '../spec/support/localhost_server' + +LocalhostServer.new(TESTSERVER.new, 3000) +LocalhostServer.new(TESTSERVER.new, 3001) +LocalhostServer.new(TESTSERVER.new, 3002) + +url = 'http://localhost:3000/'.freeze +uri = URI.parse('http://localhost:3000/').freeze +ethon = Ethon::Easy.new(url: url) +patron = Patron::Session.new +patron_url = Patron::Session.new(base_url: url) +curb = Curl::Easy.new(url) + +puts '[Creation]' +Benchmark.ips do |x| + x.report('String.new') { '' } + x.report('Easy.new') { Ethon::Easy.new } +end + +puts '[Escape]' +Benchmark.ips do |x| + x.report('CGI.escape') { CGI.escape("まつもと") } + x.report('Easy.escape') { ethon.escape("まつもと") } +end + +puts '[Requests]' +Benchmark.ips do |x| + x.report('net/http') { Net::HTTP.get_response(uri) } + x.report('open-uri') { open url } + + x.report('patron') do + patron.base_url = url + patron.get('/') + end + + x.report('patron reuse') { patron_url.get('/') } + + x.report('curb') do + curb.url = url + curb.perform + end + + x.report('curb reuse') { curb.perform } + + x.report('Easy.perform') do + ethon.url = url + ethon.perform + end + + x.report('Easy.perform reuse') { ethon.perform } +end + +puts "[ 4 delayed Requests ]" +Benchmark.ips do |x| + x.report('net/http') do + 3.times do |i| + uri = URI.parse("http://localhost:300#{i}/?delay=1") + Net::HTTP.get_response(uri) + end + end + + x.report("open-uri") do + 3.times do |i| + open("http://localhost:300#{i}/?delay=1") + end + end + + x.report("patron") do + sess = Patron::Session.new + 3.times do |i| + sess.base_url = "http://localhost:300#{i}/?delay=1" + sess.get("/") + end + end + + x.report("Easy.perform") do + easy = Ethon::Easy.new + 3.times do |i| + easy.url = "http://localhost:300#{i}/?delay=1" + easy.perform + end + end + + x.report("Multi.perform") do + multi = Ethon::Multi.new + 3.times do |i| + easy = Ethon::Easy.new + easy.url = "http://localhost:300#{i}/?delay=1" + multi.add(easy) + end + multi.perform + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/memory_leaks.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/memory_leaks.rb new file mode 100644 index 000000000000..f8821081fbd7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/memory_leaks.rb @@ -0,0 +1,113 @@ +require 'ethon' +require 'ethon/easy' + +require_relative 'perf_spec_helper' +require 'rspec/autorun' + +describe "low-level interactions with libcurl" do + describe Ethon::Multi do + memory_leak_test("init") do + Ethon::Multi.new + end + + memory_leak_test("handle") do + Ethon::Multi.new.handle + end + end + + describe Ethon::Easy do + memory_leak_test("init") do + Ethon::Easy.new + end + + memory_leak_test("handle") do + Ethon::Easy.new.handle + end + + memory_leak_test("headers") do + Ethon::Easy.new.headers = { "a" => 1, "b" => 2, "c" => 3, "d" => 4} + end + + memory_leak_test("escape") do + Ethon::Easy.new.escape("the_sky&is_blue") + end + end + + + describe Ethon::Easy::Form do + memory_leak_test("init") do + Ethon::Easy::Form.new(nil, {}) + end + + memory_leak_test("first") do + Ethon::Easy::Form.new(nil, {}).first + end + + memory_leak_test("last") do + Ethon::Easy::Form.new(nil, {}).last + end + + memory_leak_test("materialized with some params") do + form = Ethon::Easy::Form.new(nil, { "a" => "1" }) + form.materialize + end + + memory_leak_test("materialized with a file") do + File.open(__FILE__, "r") do |file| + form = Ethon::Easy::Form.new(nil, { "a" => file }) + form.materialize + end + end + end +end + +describe "higher level operations" do + memory_leak_test("a simple request") do + Ethon::Easy.new(:url => "http://localhost:3001/", + :forbid_reuse => true).perform + end + + memory_leak_test("a request with headers") do + Ethon::Easy.new(:url => "http://localhost:3001/", + :headers => { "Content-Type" => "application/json", + "Something" => "1", + "Else" => "qwerty", + "Long-String" => "aassddffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"}, + :forbid_reuse => true).perform + end + + memory_leak_test("a request with headers and params") do + easy = Ethon::Easy.new(:url => "http://localhost:3001/", + :headers => { "Content-Type" => "application/json", + "Something" => "1", + "Else" => "qwerty", + "Long-String" => "aassddffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"}, + :forbid_reuse => true) + easy.http_request("http://localhost:3001/", + :get, + :params => { "param1" => "value1", + "param2" => "value2", + "param3" => "value3", + "param4" => "value4"}) + end + + memory_leak_test("a request with headers, params, and body") do + easy = Ethon::Easy.new(:url => "http://localhost:3001/", + :headers => { "Content-Type" => "application/json", + "Something" => "1", + "Else" => "qwerty", + "Long-String" => "aassddffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"}, + :forbid_reuse => true) + easy.http_request("http://localhost:3001/", + :get, + :params => { "param1" => "value1", + "param2" => "value2", + "param3" => "value3", + "param4" => "value4"}, + :body => { + "body1" => "value1", + "body2" => "value2", + "body3" => "value3" + }) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/perf_spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/perf_spec_helper.rb new file mode 100644 index 000000000000..9b433fc89450 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/perf_spec_helper.rb @@ -0,0 +1,36 @@ +#### SETUP +require 'bundler' +Bundler.setup +require 'rspec' + +require 'support/localhost_server' +require 'support/server' +require_relative 'support/memory_test_helpers' + +require 'logger' + +if ENV['VERBOSE'] + Ethon.logger = Logger.new($stdout) + Ethon.logger.level = Logger::DEBUG +end + +RSpec.configure do |config| + config.before(:suite) do + LocalhostServer.new(TESTSERVER.new, 3001) + end + config.include(MemoryTestHelpers) + config.extend(MemoryTestHelpers::TestMethods) +end + +MemoryTestHelpers.setup +MemoryTestHelpers.logger = Logger.new($stdout) +MemoryTestHelpers.logger.level = Logger::INFO +MemoryTestHelpers.logger.formatter = proc do |severity, datetime, progname, msg| + "\t\t#{msg}\n" +end + +if ENV['VERBOSE'] + MemoryTestHelpers.logger.level = Logger::DEBUG +end + +MemoryTestHelpers.iterations = ENV.fetch("ITERATIONS", 10_000).to_i diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/support/memory_test_helpers.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/support/memory_test_helpers.rb new file mode 100644 index 000000000000..99f8bd5a8e77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/support/memory_test_helpers.rb @@ -0,0 +1,75 @@ +require_relative 'ruby_object_leak_tracker' +require_relative 'os_memory_leak_tracker' + +module MemoryTestHelpers + class << self + attr_accessor :gc_proc, :iterations, :logger + + def setup + if RUBY_PLATFORM == "java" + # for leak detection + JRuby.objectspace = true if defined?(JRuby) + # for gc + require 'java' + java_import 'java.lang.System' + self.gc_proc = proc { System.gc } + else + self.gc_proc = proc { GC.start } + end + end + end + + module TestMethods + def memory_leak_test(description, &block) + context(description) do + it "doesn't leak ruby objects" do + object_leak_tracker = RubyObjectLeakTracker.new + track_memory_usage(object_leak_tracker, &block) + object_leak_tracker.total_difference_between_runs.should be <= 10 + end + + it "doesn't leak OS memory (C interop check)" do + os_memory_leak_tracker = OSMemoryLeakTracker.new + track_memory_usage(os_memory_leak_tracker, &block) + os_memory_leak_tracker.total_difference_between_runs.should be <= 10 + end + end + end + end + + def track_memory_usage(tracker) + # Intentionally do all this setup before we do any testing + logger = MemoryTestHelpers.logger + iterations = MemoryTestHelpers.iterations + + checkpoint_frequency = (iterations / 10.0).to_i + gc_frequency = 20 + + warmup_iterations = [(iterations / 3.0).to_i, 500].min + logger.info "Performing #{warmup_iterations} warmup iterations" + warmup_iterations.times do + yield + MemoryTestHelpers.gc_proc.call + end + tracker.capture_initial_memory_usage + + logger.info "Performing #{iterations} iterations (checkpoint every #{checkpoint_frequency})" + + iterations.times do |i| + yield + + last_iteration = (i == iterations - 1) + checkpoint = last_iteration || (i % checkpoint_frequency == 0) + + if checkpoint || (i % gc_frequency == 0) + MemoryTestHelpers.gc_proc.call + end + + if checkpoint + logger.info "Iteration #{i} checkpoint" + tracker.capture_memory_usage + tracker.dump_status(logger) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/support/os_memory_leak_tracker.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/support/os_memory_leak_tracker.rb new file mode 100644 index 000000000000..082c756f2518 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/support/os_memory_leak_tracker.rb @@ -0,0 +1,47 @@ +class OSMemoryLeakTracker + attr_reader :current_run + + def initialize + @previous_run = @current_run = 0 + end + + def difference_between_runs(basis=@previous_run) + @current_run - basis + end + + def total_difference_between_runs + difference_between_runs(@initial_count_run) + end + + def capture_initial_memory_usage + capture_memory_usage + @initial_count_run = @current_run + end + + def capture_memory_usage + @previous_run = @current_run + @current_run = rss_bytes + end + + def dump_status(logger) + delta = difference_between_runs + logger.add(log_level(delta), sprintf("\tTotal memory usage (kb): %d (%+d)", current_run, delta)) + end + + private + # amount of memory the current process "is using", in RAM + # (doesn't include any swap memory that it may be using, just that in actual RAM) + # Code loosely based on https://github.com/rdp/os/blob/master/lib/os.rb + # returns 0 on windows + def rss_bytes + if ENV['OS'] == 'Windows_NT' + 0 + else + `ps -o rss= -p #{Process.pid}`.to_i # in kilobytes + end + end + + def log_level(delta) + delta > 0 ? Logger::WARN : Logger::DEBUG + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/support/ruby_object_leak_tracker.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/support/ruby_object_leak_tracker.rb new file mode 100644 index 000000000000..f744cac991ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/profile/support/ruby_object_leak_tracker.rb @@ -0,0 +1,48 @@ +class RubyObjectLeakTracker + attr_reader :previous_count_hash, :current_count_hash + + def initialize + @previous_count_hash = @current_count_hash = {} + end + + def difference_between_runs(basis=@previous_count_hash) + @difference_between_runs ||= Hash[@current_count_hash.map do |object_class, count| + [object_class, count - (basis[object_class] || 0)] + end] + end + + def total_difference_between_runs + difference_between_runs(@initial_count_hash).values.inject(0) { |sum, count| sum + count } + end + + def capture_initial_memory_usage + capture_memory_usage + @initial_count_hash = @current_count_hash + end + + def capture_memory_usage + @difference_between_runs = nil + @previous_count_hash = @current_count_hash + + class_to_count = Hash.new { |hash, key| hash[key] = 0 } + ObjectSpace.each_object { |obj| class_to_count[obj.class] += 1 } + + sorted_class_to_count = class_to_count.sort_by { |k, v| -v } + @current_count_hash = Hash[sorted_class_to_count] + end + + def dump_status(logger) + diff = difference_between_runs + most_used_objects = current_count_hash.to_a.sort_by(&:last).reverse[0, 20] + + most_used_objects.each do |object_class, count| + delta = diff[object_class] + logger.add(log_level(delta), sprintf("\t%s: %d (%+d)", object_class, count, delta)) + end + end + + private + def log_level(delta) + delta > 0 ? Logger::WARN : Logger::DEBUG + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/curl_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/curl_spec.rb new file mode 100644 index 000000000000..8f68537f1c7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/curl_spec.rb @@ -0,0 +1,37 @@ +require 'spec_helper' + +describe Ethon::Curl do + describe ".init" do + before { Ethon::Curl.send(:class_variable_set, :@@initialized, false) } + + context "when global_init fails" do + it "raises global init error" do + expect(Ethon::Curl).to receive(:global_init).and_return(1) + expect{ Ethon::Curl.init }.to raise_error(Ethon::Errors::GlobalInit) + end + end + + context "when global_init works" do + before { expect(Ethon::Curl).to receive(:global_init).and_return(0) } + + it "doesn't raises global init error" do + expect{ Ethon::Curl.init }.to_not raise_error + end + + it "logs" do + expect(Ethon.logger).to receive(:debug) + Ethon::Curl.init + end + end + + context "when global_cleanup is called" do + before { expect(Ethon::Curl).to receive(:global_cleanup) } + + it "logs" do + expect(Ethon.logger).to receive(:debug).twice + Ethon::Curl.init + Ethon::Curl.cleanup + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/callbacks_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/callbacks_spec.rb new file mode 100644 index 000000000000..a9c8d1a9a285 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/callbacks_spec.rb @@ -0,0 +1,58 @@ +require 'spec_helper' + +describe Ethon::Easy::Callbacks do + let!(:easy) { Ethon::Easy.new } + + describe "#set_callbacks" do + before do + expect(Ethon::Curl).to receive(:set_option).exactly(3).times + end + + it "sets write-, debug-, and headerfunction" do + easy.set_callbacks + end + + it "resets @response_body" do + easy.set_callbacks + expect(easy.instance_variable_get(:@response_body)).to eq("") + end + + it "resets @response_headers" do + easy.set_callbacks + expect(easy.instance_variable_get(:@response_headers)).to eq("") + end + + it "resets @debug_info" do + easy.set_callbacks + expect(easy.instance_variable_get(:@debug_info).to_a).to eq([]) + end + end + + describe "#progress_callback" do + it "returns 0" do + expect(easy.progress_callback.call(0,1,1,1,1)).to be(0) + end + end + + describe "#body_write_callback" do + let(:body_write_callback) { easy.instance_variable_get(:@body_write_callback) } + let(:stream) { double(:read_string => "") } + context "when body returns not :abort" do + it "returns number bigger than 0" do + expect(body_write_callback.call(stream, 1, 1, nil) > 0).to be(true) + end + end + + context "when body returns :abort" do + before do + easy.on_body.clear + easy.on_body { :abort } + end + let(:body_write_callback) { easy.instance_variable_get(:@body_write_callback) } + + it "returns -1 to indicate abort to libcurl" do + expect(body_write_callback.call(stream, 1, 1, nil)).to eq(-1) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/debug_info_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/debug_info_spec.rb new file mode 100644 index 000000000000..77d3d57ac5b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/debug_info_spec.rb @@ -0,0 +1,53 @@ +require 'spec_helper' + +describe Ethon::Easy::DebugInfo do + let(:easy) { Ethon::Easy.new } + + before do + easy.url = "http://localhost:3001/" + easy.perform + end + + describe "#debug_info" do + context "when verbose is not set to true" do + it "does not save any debug info after a request" do + expect(easy.debug_info.to_a.length).to eq(0) + expect(easy.debug_info.to_h.values.flatten.length).to eq(0) + end + end + + context "when verbose is set to true" do + before do + easy.verbose = true + easy.perform + end + + after do + easy.verbose = false + easy.reset + end + + it "saves debug info after a request" do + expect(easy.debug_info.to_a.length).to be > 0 + end + + it "saves request headers" do + expect(easy.debug_info.header_out.join).to include('GET / HTTP/1.1') + end + + it "saves response headers" do + expect(easy.debug_info.header_in.length).to be > 0 + expect(easy.response_headers).to include(easy.debug_info.header_in.join) + end + + it "saves incoming data" do + expect(easy.debug_info.data_in.length).to be > 0 + expect(easy.response_body).to include(easy.debug_info.data_in.join) + end + + it "saves debug text" do + expect(easy.debug_info.text.length).to be > 0 + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/features_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/features_spec.rb new file mode 100644 index 000000000000..1c84ebff37a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/features_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe Ethon::Easy::Informations do + + describe "#supports_asynch_dns?" do + it "returns boolean" do + expect([true, false].include? Ethon::Easy.supports_asynch_dns?).to be_truthy + end + end + + describe "#supports_zlib?" do + it "returns boolean" do + expect([true, false].include? Ethon::Easy.supports_zlib?).to be_truthy + end + end + + describe "#supports_timeout_ms?" do + it "returns boolean" do + expect([true, false].include? Ethon::Easy.supports_timeout_ms?).to be_truthy + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/form_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/form_spec.rb new file mode 100644 index 000000000000..99885c7f2948 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/form_spec.rb @@ -0,0 +1,103 @@ +require 'spec_helper' + +describe Ethon::Easy::Form do + let(:hash) { {} } + let!(:easy) { Ethon::Easy.new } + let(:form) { Ethon::Easy::Form.new(easy, hash) } + + describe ".new" do + it "assigns attribute to @params" do + expect(form.instance_variable_get(:@params)).to eq(hash) + end + end + + describe "#first" do + it "returns a pointer" do + expect(form.first).to be_a(FFI::Pointer) + end + end + + describe "#last" do + it "returns a pointer" do + expect(form.first).to be_a(FFI::Pointer) + end + end + + describe "#multipart?" do + before { form.instance_variable_set(:@query_pairs, pairs) } + + context "when query_pairs contains string values" do + let(:pairs) { [['a', '1'], ['b', '2']] } + + it "returns false" do + expect(form.multipart?).to be_falsey + end + end + + context "when query_pairs contains file" do + let(:pairs) { [['a', '1'], ['b', ['path', 'encoding', 'abs_path']]] } + + it "returns true" do + expect(form.multipart?).to be_truthy + end + end + + context "when options contains multipart=true" do + before { form.instance_variable_set(:@multipart, true) } + let(:pairs) { [['a', '1'], ['b', '2']] } + + it "returns true" do + expect(form.multipart?).to be_truthy + end + end + end + + describe "#materialize" do + before { form.instance_variable_set(:@query_pairs, pairs) } + + context "when query_pairs contains string values" do + let(:pairs) { [['a', '1']] } + + it "adds params to form" do + expect(Ethon::Curl).to receive(:formadd) + form.materialize + end + end + + context "when query_pairs contains nil" do + let(:pairs) { [['a', nil]] } + + it "adds params to form" do + expect(Ethon::Curl).to receive(:formadd) + form.materialize + end + end + + context "when query_pairs contains file" do + let(:pairs) { [['a', ["file", "type", "path/file"]]] } + + it "adds file to form" do + expect(Ethon::Curl).to receive(:formadd) + form.materialize + end + end + + context "when query_pairs contains file and string values" do + let(:pairs) { [['a', ["file", "type", "path/file"]], ['b', '1']] } + + it "adds file to form" do + expect(Ethon::Curl).to receive(:formadd).twice + form.materialize + end + end + + context "when query_pairs contains file, string and int values" do + let(:pairs) { [['a', ["file", "type", "path/file"]], ['b', '1'], ['c', 1]] } + + it "adds file to form" do + expect(Ethon::Curl).to receive(:formadd).exactly(3).times + form.materialize + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/header_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/header_spec.rb new file mode 100644 index 000000000000..9ab22e67877a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/header_spec.rb @@ -0,0 +1,78 @@ +require 'spec_helper' + +describe Ethon::Easy::Header do + let(:easy) { Ethon::Easy.new } + + describe "#headers=" do + let(:headers) { { 'User-Agent' => 'Ethon' } } + + it "sets header" do + expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) + expect(Ethon::Curl).to receive(:set_option) + easy.headers = headers + end + + context "when requesting" do + before do + easy.headers = headers + easy.url = "http://localhost:3001" + easy.perform + end + + it "sends" do + expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon"') + end + + context "when header value contains null byte" do + let(:headers) { { 'User-Agent' => "Ethon\0" } } + + it "escapes" do + expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon\\\\0"') + end + end + + context "when header value has leading whitespace" do + let(:headers) { { 'User-Agent' => " Ethon" } } + + it "removes" do + expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon"') + end + end + + context "when header value has traiing whitespace" do + let(:headers) { { 'User-Agent' => "Ethon " } } + + it "removes" do + expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon"') + end + end + end + end + + describe "#compose_header" do + it "has space in between" do + expect(easy.compose_header('a', 'b')).to eq('a: b') + end + + context "when value is a symbol" do + it "works" do + expect{ easy.compose_header('a', :b) }.to_not raise_error + end + end + end + + describe "#header_list" do + context "when no set_headers" do + it "returns nil" do + expect(easy.header_list).to eq(nil) + end + end + + context "when set_headers" do + it "returns pointer to header list" do + easy.headers = {'User-Agent' => 'Custom'} + expect(easy.header_list).to be_a(FFI::Pointer) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/custom_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/custom_spec.rb new file mode 100644 index 000000000000..729df51f2a70 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/custom_spec.rb @@ -0,0 +1,176 @@ +require 'spec_helper' + +describe Ethon::Easy::Http::Custom do + let(:easy) { Ethon::Easy.new } + let(:url) { "http://localhost:3001/" } + let(:params) { nil } + let(:form) { nil } + let(:custom) { described_class.new("PURGE", url, {:params => params, :body => form}) } + + describe "#setup" do + context "when nothing" do + it "sets url" do + custom.setup(easy) + expect(easy.url).to eq(url) + end + + it "makes a custom request" do + custom.setup(easy) + easy.perform + expect(easy.response_body).to include('"REQUEST_METHOD":"PURGE"') + end + end + + context "when params" do + let(:params) { {:a => "1&"} } + + it "attaches escaped to url" do + custom.setup(easy) + expect(easy.url).to eq("#{url}?a=1%26") + end + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + custom.setup(easy) + easy.perform + end + + it "is a custom verb" do + expect(easy.response_body).to include('"REQUEST_METHOD":"PURGE"') + end + + it "does not use application/x-www-form-urlencoded content type" do + expect(easy.response_body).to_not include('"CONTENT_TYPE":"application/x-www-form-urlencoded"') + end + + it "requests parameterized url" do + expect(easy.response_body).to include('"REQUEST_URI":"http://localhost:3001/?a=1%26"') + end + end + end + + context "when body" do + context "when multipart" do + let(:form) { {:a => File.open(__FILE__, 'r')} } + + it "sets httppost" do + expect(easy).to receive(:httppost=) + custom.setup(easy) + end + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + custom.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "is a custom verb" do + expect(easy.response_body).to include('"REQUEST_METHOD":"PURGE"') + end + + it "uses multipart/form-data content type" do + expect(easy.response_body).to include('"CONTENT_TYPE":"multipart/form-data') + end + + it "submits a body" do + expect(easy.response_body).to match('"body":".+"') + end + + it "submits the data" do + expect(easy.response_body).to include('"filename":"custom_spec.rb"') + end + end + end + + context "when not multipart" do + let(:form) { {:a => "1&b=2"} } + let(:encoded) { "a=1%26b%3D2" } + + it "sets escaped copypostfields" do + expect(easy).to receive(:copypostfields=).with(encoded) + custom.setup(easy) + end + + it "sets postfieldsize" do + expect(easy).to receive(:postfieldsize=).with(encoded.bytesize) + custom.setup(easy) + end + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + custom.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "is a custom verb" do + expect(easy.response_body).to include('"REQUEST_METHOD":"PURGE"') + end + + it "uses multipart/form-data content type" do + expect(easy.response_body).to include('"CONTENT_TYPE":"application/x-www-form-urlencoded') + end + + it "submits a body" do + expect(easy.response_body).to match('"body":"a=1%26b%3D2"') + end + + it "submits the data" do + expect(easy.response_body).to include('"rack.request.form_hash":{"a":"1&b=2"}') + end + end + end + + context "when string" do + let(:form) { "{a: 1}" } + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + custom.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "sends string" do + expect(easy.response_body).to include('"body":"{a: 1}"') + end + end + end + end + + context "when params and body" do + let(:form) { {:a => "1"} } + let(:params) { {:b => "2"} } + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + custom.setup(easy) + easy.perform + end + + it "url contains params" do + expect(easy.response_body).to include('"REQUEST_URI":"http://localhost:3001/?b=2"') + end + + it "body contains form" do + expect(easy.response_body).to include('"body":"a=1"') + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/delete_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/delete_spec.rb new file mode 100644 index 000000000000..073c97dbf6a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/delete_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe Ethon::Easy::Http::Delete do + let(:easy) { Ethon::Easy.new } + let(:url) { "http://localhost:3001/" } + let(:params) { nil } + let(:form) { nil } + let(:delete) { described_class.new(url, {:params => params, :body => form}) } + + context "when requesting" do + before do + delete.setup(easy) + easy.perform + end + + it "makes a delete request" do + expect(easy.response_body).to include('"REQUEST_METHOD":"DELETE"') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/get_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/get_spec.rb new file mode 100644 index 000000000000..ea384498b2ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/get_spec.rb @@ -0,0 +1,125 @@ +require 'spec_helper' + +describe Ethon::Easy::Http::Get do + let(:easy) { Ethon::Easy.new } + let(:url) { "http://localhost:3001/" } + let(:params) { nil } + let(:form) { nil } + let(:options) { {} } + let(:get) { described_class.new(url, {:params => params, :body => form}.merge(options)) } + + describe "#setup" do + it "sets url" do + get.setup(easy) + expect(easy.url).to eq(url) + end + + context "when body" do + let(:form) { { :a => 1 } } + + it "sets customrequest" do + expect(easy).to receive(:customrequest=).with("GET") + get.setup(easy) + end + end + + context "when no body" do + it "doesn't set customrequest" do + expect(easy).to receive(:customrequest=).never + get.setup(easy) + end + end + + context "when requesting" do + before do + get.setup(easy) + easy.perform + end + + context "when url already contains params" do + let(:url) { "http://localhost:3001/?query=here" } + let(:params) { {:a => "1&b=2"} } + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "is a get request" do + expect(easy.response_body).to include('"REQUEST_METHOD":"GET"') + end + + it "requests parameterized url" do + expect(easy.effective_url).to eq("http://localhost:3001/?query=here&a=1%26b%3D2") + end + end + + context "when params and no body" do + let(:params) { {:a => "1&b=2"} } + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "is a get request" do + expect(easy.response_body).to include('"REQUEST_METHOD":"GET"') + end + + it "requests parameterized url" do + expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") + end + end + + context "when params and body" do + let(:params) { {:a => "1&b=2"} } + let(:form) { {:b => "2"} } + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "is a get request" do + expect(easy.response_body).to include('"REQUEST_METHOD":"GET"') + end + + it "requests parameterized url" do + expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") + end + end + + context "with :escape" do + let(:params) { {:a => "1&b=2"} } + + context 'missing' do + it "escapes values" do + expect(easy.url).to eq("#{url}?a=1%26b%3D2") + end + end + + context 'nil' do + let(:options) { {:escape => nil} } + + it "escapes values" do + expect(easy.url).to eq("#{url}?a=1%26b%3D2") + end + end + + context 'true' do + let(:options) { {:escape => true} } + + it "escapes values" do + expect(easy.url).to eq("#{url}?a=1%26b%3D2") + end + end + + context 'false' do + let(:options) { {:escape => false} } + + it "sends raw values" do + expect(easy.url).to eq("#{url}?a=1&b=2") + end + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/head_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/head_spec.rb new file mode 100644 index 000000000000..9325b61e1f00 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/head_spec.rb @@ -0,0 +1,79 @@ +require 'spec_helper' + +describe Ethon::Easy::Http::Head do + let(:easy) { Ethon::Easy.new } + let(:url) { "http://localhost:3001/" } + let(:params) { nil } + let(:form) { nil } + let(:head) { described_class.new(url, {:params => params, :body => form}) } + + describe "#setup" do + context "when nothing" do + it "sets nobody" do + expect(easy).to receive(:nobody=).with(true) + head.setup(easy) + end + + it "sets url" do + head.setup(easy) + expect(easy.url).to eq(url) + end + end + + context "when params" do + let(:params) { {:a => "1&b=2"} } + + it "sets nobody" do + expect(easy).to receive(:nobody=).with(true) + head.setup(easy) + end + + it "attaches escaped to url" do + head.setup(easy) + expect(easy.url).to eq("#{url}?a=1%26b%3D2") + end + + context "when requesting" do + before do + head.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "has no body" do + expect(easy.response_body).to be_empty + end + + it "requests parameterized url" do + expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") + end + + context "when url already contains params" do + let(:url) { "http://localhost:3001/?query=here" } + + it "requests parameterized url" do + expect(easy.effective_url).to eq("http://localhost:3001/?query=here&a=1%26b%3D2") + end + end + end + end + + context "when body" do + let(:form) { {:a => 1} } + + context "when requesting" do + before do + head.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/options_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/options_spec.rb new file mode 100644 index 000000000000..b85b5941c383 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/options_spec.rb @@ -0,0 +1,50 @@ +require 'spec_helper' + +describe Ethon::Easy::Http::Options do + let(:easy) { Ethon::Easy.new } + let(:url) { "http://localhost:3001/" } + let(:params) { nil } + let(:form) { nil } + let(:options) { described_class.new(url, {:params => params, :body => form}) } + + describe "#setup" do + it "sets customrequest" do + expect(easy).to receive(:customrequest=).with("OPTIONS") + options.setup(easy) + end + + it "sets url" do + options.setup(easy) + expect(easy.url).to eq(url) + end + + context "when requesting" do + let(:params) { {:a => "1&b=2"} } + + before do + options.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "is a options request" do + expect(easy.response_body).to include('"REQUEST_METHOD":"OPTIONS"') + end + + it "requests parameterized url" do + expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") + end + + context "when url already contains params" do + let(:url) { "http://localhost:3001/?query=here" } + + it "requests parameterized url" do + expect(easy.effective_url).to eq("http://localhost:3001/?query=here&a=1%26b%3D2") + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/patch_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/patch_spec.rb new file mode 100644 index 000000000000..7c1b957a00de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/patch_spec.rb @@ -0,0 +1,50 @@ +require 'spec_helper' + +describe Ethon::Easy::Http::Patch do + let(:easy) { Ethon::Easy.new } + let(:url) { "http://localhost:3001/" } + let(:params) { nil } + let(:form) { nil } + let(:patch) { described_class.new(url, {:params => params, :body => form}) } + + describe "#setup" do + it "sets customrequest" do + expect(easy).to receive(:customrequest=).with("PATCH") + patch.setup(easy) + end + + it "sets url" do + patch.setup(easy) + expect(easy.url).to eq(url) + end + + context "when requesting" do + let(:params) { {:a => "1&b=2"} } + + before do + patch.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "is a patch request" do + expect(easy.response_body).to include('"REQUEST_METHOD":"PATCH"') + end + + it "requests parameterized url" do + expect(easy.effective_url).to eq("http://localhost:3001/?a=1%26b%3D2") + end + + context "when url already contains params" do + let(:url) { "http://localhost:3001/?query=here" } + + it "requests parameterized url" do + expect(easy.effective_url).to eq("http://localhost:3001/?query=here&a=1%26b%3D2") + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/post_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/post_spec.rb new file mode 100644 index 000000000000..2389e3bbf6a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/post_spec.rb @@ -0,0 +1,316 @@ +require 'spec_helper' + +describe Ethon::Easy::Http::Post do + let(:easy) { Ethon::Easy.new } + let(:url) { "http://localhost:3001/" } + let(:params) { nil } + let(:form) { nil } + let(:options) { Hash.new } + let(:post) { described_class.new(url, options.merge({:params => params, :body => form})) } + + describe "#setup" do + context "when nothing" do + it "sets url" do + post.setup(easy) + expect(easy.url).to eq(url) + end + + it "sets postfield_size" do + expect(easy).to receive(:postfieldsize=).with(0) + post.setup(easy) + end + + it "sets copy_postfields" do + expect(easy).to receive(:copypostfields=).with("") + post.setup(easy) + end + + it "makes a post request" do + post.setup(easy) + easy.perform + expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') + end + end + + context "when params" do + let(:params) { {:a => "1&"} } + + it "attaches escaped to url" do + post.setup(easy) + expect(easy.url).to eq("#{url}?a=1%26") + end + + context "with arrays" do + let(:params) { {:a => %w( foo bar )} } + + context "by default" do + it "encodes them with indexes" do + post.setup(easy) + expect(easy.url).to eq("#{url}?a%5B0%5D=foo&a%5B1%5D=bar") + end + end + + context "when params_encoding is :rack" do + let(:options) { {:params_encoding => :rack} } + it "encodes them without indexes" do + post.setup(easy) + expect(easy.url).to eq("#{url}?a%5B%5D=foo&a%5B%5D=bar") + end + end + end + + context "with :escape" do + context 'missing' do + it "escapes values" do + post.setup(easy) + expect(easy.url).to eq("#{url}?a=1%26") + end + end + + context 'nil' do + let(:options) { {:escape => nil} } + + it "escapes values" do + post.setup(easy) + expect(easy.url).to eq("#{url}?a=1%26") + end + end + + context 'true' do + let(:options) { {:escape => true} } + + it "escapes values" do + post.setup(easy) + expect(easy.url).to eq("#{url}?a=1%26") + end + end + + context 'false' do + let(:options) { {:escape => false} } + + it "sends raw values" do + post.setup(easy) + expect(easy.url).to eq("#{url}?a=1&") + end + end + end + + it "sets postfieldsize" do + expect(easy).to receive(:postfieldsize=).with(0) + post.setup(easy) + end + + it "sets copypostfields" do + expect(easy).to receive(:copypostfields=).with("") + post.setup(easy) + end + + context "when requesting" do + let(:postredir) { nil } + + before do + easy.headers = { 'Expect' => '' } + post.setup(easy) + easy.postredir = postredir + easy.followlocation = true + easy.perform + end + + it "is a post" do + expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') + end + + it "uses application/x-www-form-urlencoded content type" do + expect(easy.response_body).to include('"CONTENT_TYPE":"application/x-www-form-urlencoded"') + end + + it "requests parameterized url" do + expect(easy.response_body).to include('"REQUEST_URI":"http://localhost:3001/?a=1%26"') + end + + context "when redirection" do + let(:url) { "localhost:3001/redirect" } + + context "when no postredirs" do + it "is a get" do + expect(easy.response_body).to include('"REQUEST_METHOD":"GET"') + end + end + + unless ENV['TRAVIS'] + context "when postredirs" do + let(:postredir) { :post_all } + + it "is a post" do + expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') + end + end + end + end + end + end + + context "when body" do + context "when multipart" do + let(:form) { {:a => File.open(__FILE__, 'r')} } + + it "sets httppost" do + expect(easy).to receive(:httppost=) + post.setup(easy) + end + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + post.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "is a post" do + expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') + end + + it "uses multipart/form-data content type" do + expect(easy.response_body).to include('"CONTENT_TYPE":"multipart/form-data') + end + + it "submits a body" do + expect(easy.response_body).to match('"body":".+"') + end + + it "submits the data" do + expect(easy.response_body).to include('"filename":"post_spec.rb"') + end + end + end + + context "when not multipart" do + let(:form) { {:a => "1&b=2"} } + let(:encoded) { "a=1%26b%3D2" } + + it "sets escaped copypostfields" do + expect(easy).to receive(:copypostfields=).with(encoded) + post.setup(easy) + end + + it "sets postfieldsize" do + expect(easy).to receive(:postfieldsize=).with(encoded.bytesize) + post.setup(easy) + end + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + post.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "is a post" do + expect(easy.response_body).to include('"REQUEST_METHOD":"POST"') + end + + it "uses multipart/form-data content type" do + expect(easy.response_body).to include('"CONTENT_TYPE":"application/x-www-form-urlencoded') + end + + it "submits a body" do + expect(easy.response_body).to match('"body":"a=1%26b%3D2"') + end + + it "submits the data" do + expect(easy.response_body).to include('"rack.request.form_hash":{"a":"1&b=2"}') + end + end + end + + context "when string" do + let(:form) { "{a: 1}" } + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + post.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "sends string" do + expect(easy.response_body).to include('"body":"{a: 1}"') + end + end + end + + context "when binary with null bytes" do + let(:form) { [1, 0, 1].pack('c*') } + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + post.setup(easy) + easy.perform + end + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "sends binary data" do + expect(easy.response_body).to include('"body":"\\u0001\\u0000\\u0001"') + end + end + end + + context "when arrays" do + let(:form) { {:a => %w( foo bar )} } + + context "by default" do + it "sets copypostfields with indexed, escaped representation" do + expect(easy).to receive(:copypostfields=).with('a%5B0%5D=foo&a%5B1%5D=bar') + post.setup(easy) + end + end + + context "when params_encoding is :rack" do + let(:options) { {:params_encoding => :rack} } + + it "sets copypostfields with non-indexed, escaped representation" do + expect(easy).to receive(:copypostfields=).with('a%5B%5D=foo&a%5B%5D=bar') + post.setup(easy) + end + end + end + end + + context "when params and body" do + let(:form) { {:a => "1"} } + let(:params) { {:b => "2"} } + + context "when requesting" do + before do + easy.headers = { 'Expect' => '' } + post.setup(easy) + easy.perform + end + + it "url contains params" do + expect(easy.response_body).to include('"REQUEST_URI":"http://localhost:3001/?b=2"') + end + + it "body contains form" do + expect(easy.response_body).to include('"body":"a=1"') + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/put_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/put_spec.rb new file mode 100644 index 000000000000..5067774b820b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http/put_spec.rb @@ -0,0 +1,167 @@ +require 'spec_helper' + +describe Ethon::Easy::Http::Put do + let(:easy) { Ethon::Easy.new } + let(:url) { "http://localhost:3001/" } + let(:params) { nil } + let(:form) { nil } + let(:options) { Hash.new } + let(:put) { described_class.new(url, options.merge({:params => params, :body => form})) } + + describe "#setup" do + context "when nothing" do + it "sets url" do + put.setup(easy) + expect(easy.url).to eq(url) + end + + it "sets upload" do + expect(easy).to receive(:upload=).with(true) + put.setup(easy) + end + + it "sets infilesize" do + expect(easy).to receive(:infilesize=).with(0) + put.setup(easy) + end + + context "when requesting" do + it "makes a put request" do + put.setup(easy) + easy.perform + expect(easy.response_body).to include('"REQUEST_METHOD":"PUT"') + end + end + end + + context "when params" do + let(:params) { {:a => "1&"} } + + it "attaches escaped to url" do + put.setup(easy) + expect(easy.url).to eq("#{url}?a=1%26") + end + + context "with arrays" do + let(:params) { {:a => %w( foo bar )} } + + context "by default" do + it "encodes them with indexes" do + put.setup(easy) + expect(easy.url).to eq("#{url}?a%5B0%5D=foo&a%5B1%5D=bar") + end + end + + context "when params_encoding is :rack" do + let(:options) { {:params_encoding => :rack} } + it "encodes them without indexes" do + put.setup(easy) + expect(easy.url).to eq("#{url}?a%5B%5D=foo&a%5B%5D=bar") + end + end + end + + it "sets upload" do + expect(easy).to receive(:upload=).with(true) + put.setup(easy) + end + + it "sets infilesize" do + expect(easy).to receive(:infilesize=).with(0) + put.setup(easy) + end + + context "when requesting" do + before do + put.setup(easy) + easy.perform + end + + it "makes a put request" do + expect(easy.response_body).to include('"REQUEST_METHOD":"PUT"') + end + end + end + + context "when body" do + let(:form) { {:a => "1&b=2"} } + + it "sets infilesize" do + expect(easy).to receive(:infilesize=).with(11) + put.setup(easy) + end + + it "sets readfunction" do + expect(easy).to receive(:readfunction) + put.setup(easy) + end + + it "sets upload" do + expect(easy).to receive(:upload=).with(true) + put.setup(easy) + end + + context "when requesting" do + context "sending string body" do + before do + easy.headers = { 'Expect' => '' } + put.setup(easy) + easy.perform + end + + it "makes a put request" do + expect(easy.response_body).to include('"REQUEST_METHOD":"PUT"') + end + + it "submits a body" do + expect(easy.response_body).to include('"body":"a=1%26b%3D2"') + end + end + + context "when injecting a file as body" do + let(:file) { File.open(__FILE__) } + let(:easy) do + e = Ethon::Easy.new(:url => url, :upload => true) + e.set_read_callback(file) + e.infilesize = File.size(file.path) + e + end + + before do + easy.headers = { 'Expect' => '' } + easy.perform + end + + it "submits file" do + expect(easy.response_body).to include("injecting") + end + end + end + + context "when arrays" do + let(:form) { {:a => %w( foo bar )} } + + before do + put.setup(easy) + easy.perform + end + + context "by default" do + it "submits an indexed, escaped representation" do + expect(easy.response_body).to include('"body":"a%5B0%5D=foo&a%5B1%5D=bar"') + end + end + + context "when params_encoding is :rack" do + let(:options) { {:params_encoding => :rack} } + + it "submits an non-indexed, escaped representation" do + expect(easy.response_body).to include('"body":"a%5B%5D=foo&a%5B%5D=bar"') + end + end + end + end + + context "when params and body" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http_spec.rb new file mode 100644 index 000000000000..93f476ecc99d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/http_spec.rb @@ -0,0 +1,63 @@ +require 'spec_helper' + +describe Ethon::Easy::Http do + let(:easy) { Ethon::Easy.new } + + describe "#http_request" do + let(:url) { "http://localhost:3001/" } + let(:action_name) { :get } + let(:options) { {} } + + let(:get) { double(:setup) } + let(:get_class) { Ethon::Easy::Http::Get } + + it "instanciates action" do + expect(get).to receive(:setup) + expect(get_class).to receive(:new).and_return(get) + easy.http_request(url, action_name, options) + end + + context "when requesting" do + [ :get, :post, :put, :delete, :head, :patch, :options ].map do |action| + it "returns ok" do + easy.http_request(url, action, options) + easy.perform + expect(easy.return_code).to be(:ok) + end + + unless action == :head + it "makes a #{action.to_s.upcase} request" do + easy.http_request(url, action, options) + easy.perform + expect(easy.response_body).to include("\"REQUEST_METHOD\":\"#{action.to_s.upcase}\"") + end + + it "streams the response body from the #{action.to_s.upcase} request" do + bytes_read = 0 + easy.on_body { |chunk, response| bytes_read += chunk.bytesize } + easy.http_request(url, action, options) + easy.perform + content_length = ((easy.response_headers =~ /Content-Length: (\d+)/) && $1.to_i) + expect(bytes_read).to eq(content_length) + expect(easy.response_body).to eq("") + end + + it "notifies when headers are ready" do + headers = [] + easy.on_headers { |r| headers << r.response_headers } + easy.http_request(url, action, options) + easy.perform + expect(headers).to eq([easy.response_headers]) + expect(headers.first).to match(/Content-Length: (\d+)/) + end + end + end + + it "makes requests with custom HTTP verbs" do + easy.http_request(url, :purge, options) + easy.perform + expect(easy.response_body).to include(%{"REQUEST_METHOD":"PURGE"}) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/informations_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/informations_spec.rb new file mode 100644 index 000000000000..1e6522c29bd9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/informations_spec.rb @@ -0,0 +1,97 @@ +require 'spec_helper' + +describe Ethon::Easy::Informations do + let(:easy) { Ethon::Easy.new } + + before do + easy.url = "http://localhost:3001" + easy.perform + end + + describe "#httpauth_avail" do + it "returns" do + expect(easy.httpauth_avail).to be + end + end + + describe "#total_time" do + it "returns float" do + expect(easy.total_time).to be_a(Float) + end + end + + describe "#starttransfer_time" do + it "returns float" do + expect(easy.starttransfer_time).to be_a(Float) + end + end + + describe "#appconnect_time" do + it "returns float" do + expect(easy.appconnect_time).to be_a(Float) + end + end + + describe "#pretransfer_time" do + it "returns float" do + expect(easy.pretransfer_time).to be_a(Float) + end + end + + describe "#connect_time" do + it "returns float" do + expect(easy.connect_time).to be_a(Float) + end + end + + describe "#namelookup_time" do + it "returns float" do + expect(easy.namelookup_time).to be_a(Float) + end + end + + describe "#redirect_time" do + it "returns float" do + expect(easy.redirect_time).to be_a(Float) + end + end + + describe "#effective_url" do + it "returns url" do + expect(easy.effective_url).to match(/^http:\/\/localhost:3001\/?/) + end + end + + describe "#primary_ip" do + it "returns localhost" do + expect(easy.primary_ip).to match(/::1|127\.0\.0\.1/) + end + end + + describe "#response_code" do + it "returns 200" do + expect(easy.response_code).to eq(200) + end + end + + describe "#redirect_count" do + it "returns 0" do + expect(easy.redirect_count).to eq(0) + end + end + + describe "#request_size" do + it "returns 53" do + expect(easy.request_size).to eq(53) + end + end + + describe "#supports_zlib?" do + it "returns true" do + expect(Kernel).to receive(:warn) + expect(easy.supports_zlib?).to be_truthy + end + end + + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/mirror_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/mirror_spec.rb new file mode 100644 index 000000000000..7a03c6baf76d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/mirror_spec.rb @@ -0,0 +1,45 @@ +require 'spec_helper' + +describe Ethon::Easy::Mirror do + let(:options) { nil } + let(:mirror) { described_class.new(options) } + + describe "::INFORMATIONS_TO_LOG" do + [ + :return_code, :response_code, :response_body, :response_headers, + :total_time, :starttransfer_time, :appconnect_time, + :pretransfer_time, :connect_time, :namelookup_time, :redirect_time, + :effective_url, :primary_ip, :redirect_count, :debug_info + ].each do |name| + it "contains #{name}" do + expect(described_class::INFORMATIONS_TO_MIRROR).to include(name) + end + end + end + + describe "#to_hash" do + let(:options) { {:return_code => 1} } + + it "returns mirror as hash" do + expect(mirror.to_hash).to eq(options) + end + end + + describe "#log_informations" do + let(:options) { {:return_code => 1} } + + it "returns hash" do + expect(mirror.log_informations).to be_a(Hash) + end + + it "only calls methods that exist" do + described_class::INFORMATIONS_TO_LOG.each do |method_name| + expect(mirror.respond_to? method_name).to eql(true) + end + end + + it "includes return code" do + expect(mirror.log_informations).to include(options) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/operations_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/operations_spec.rb new file mode 100644 index 000000000000..153a94ff310e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/operations_spec.rb @@ -0,0 +1,267 @@ +require 'spec_helper' + +describe Ethon::Easy::Operations do + let(:easy) { Ethon::Easy.new } + + describe "#handle" do + it "returns a pointer" do + expect(easy.handle).to be_a(FFI::Pointer) + end + end + + + describe "#perform" do + let(:url) { nil } + let(:timeout) { nil } + let(:connect_timeout) { nil } + let(:follow_location) { nil } + let(:max_redirs) { nil } + let(:user_pwd) { nil } + let(:http_auth) { nil } + let(:headers) { nil } + let(:protocols) { nil } + let(:redir_protocols) { nil } + let(:username) { nil } + let(:password) { nil } + + before do + Ethon.logger.level = Logger::DEBUG + easy.url = url + easy.timeout = timeout + easy.connecttimeout = connect_timeout + easy.followlocation = follow_location + easy.maxredirs = max_redirs + easy.httpauth = http_auth + easy.headers = headers + easy.protocols = protocols + easy.redir_protocols = redir_protocols + + if user_pwd + easy.userpwd = user_pwd + else + easy.username = username + easy.password = password + end + + easy.perform + end + + it "calls Curl.easy_perform" do + expect(Ethon::Curl).to receive(:easy_perform) + easy.perform + end + + it "calls Curl.easy_cleanup" do + expect_any_instance_of(FFI::AutoPointer).to receive(:free) + easy.cleanup + end + + it "logs" do + expect(Ethon.logger).to receive(:debug) + easy.perform + end + + it "doesn't log after completing because completing could reset" do + easy.on_complete{ expect(Ethon.logger).to receive(:debug).never } + easy.perform + end + + context "when url" do + let(:url) { "http://localhost:3001/" } + + it "returns ok" do + expect(easy.return_code).to eq(:ok) + end + + it "sets response body" do + expect(easy.response_body).to be + end + + it "sets response headers" do + expect(easy.response_headers).to be + end + + context "when request timed out" do + let(:url) { "http://localhost:3001/?delay=1" } + let(:timeout) { 1 } + + it "returns operation_timedout" do + expect(easy.return_code).to eq(:operation_timedout) + end + end + + context "when connection timed out" do + let(:url) { "http://localhost:3009" } + let(:connect_timeout) { 1 } + + it "returns couldnt_connect" do + expect(easy.return_code).to eq(:couldnt_connect) + end + end + + context "when no follow location" do + let(:url) { "http://localhost:3001/redirect" } + let(:follow_location) { false } + + it "doesn't follow" do + expect(easy.response_code).to eq(302) + end + end + + context "when follow location" do + let(:url) { "http://localhost:3001/redirect" } + let(:follow_location) { true } + + it "follows" do + expect(easy.response_code).to eq(200) + end + + context "when infinite redirect loop" do + let(:url) { "http://localhost:3001/bad_redirect" } + let(:max_redirs) { 5 } + + context "when max redirect set" do + it "follows only x times" do + expect(easy.response_code).to eq(302) + end + end + end + end + + context "when user agent" do + let(:headers) { { 'User-Agent' => 'Ethon' } } + + it "sets" do + expect(easy.response_body).to include('"HTTP_USER_AGENT":"Ethon"') + end + end + end + + context "when auth url" do + before { easy.url = url } + + context "when basic auth" do + let(:url) { "http://localhost:3001/auth_basic/username/password" } + + context "when no user_pwd" do + it "returns 401" do + expect(easy.response_code).to eq(401) + end + end + + context "when invalid user_pwd" do + let(:user_pwd) { "invalid:invalid" } + + it "returns 401" do + expect(easy.response_code).to eq(401) + end + end + + context "when valid user_pwd" do + let(:user_pwd) { "username:password" } + + it "returns 200" do + expect(easy.response_code).to eq(200) + end + end + + context "when user and password" do + let(:username) { "username" } + let(:password) { "password" } + + it "returns 200" do + expect(easy.response_code).to eq(200) + end + end + end + + context "when ntlm" do + let(:url) { "http://localhost:3001/auth_ntlm" } + let(:http_auth) { :ntlm } + + context "when no user_pwd" do + it "returns 401" do + expect(easy.response_code).to eq(401) + end + end + + context "when user_pwd" do + let(:user_pwd) { "username:password" } + + it "returns 200" do + expect(easy.response_code).to eq(200) + end + end + end + end + + context "when protocols" do + context "when asking for a allowed url" do + let(:url) { "http://localhost:3001" } + let(:protocols) { :http } + + it "returns ok" do + expect(easy.return_code).to be(:ok) + end + end + + context "when asking for a not allowed url" do + let(:url) { "http://localhost:3001" } + let(:protocols) { :https } + + it "returns unsupported_protocol" do + expect(easy.return_code).to be(:unsupported_protocol) + end + end + end + + context "when multiple protocols" do + context "when asking for a allowed url" do + let(:protocols) { [:http, :https] } + + context "when http" do + let(:url) { "http://localhost:3001" } + + it "returns ok for http" do + expect(easy.return_code).to be(:ok) + end + end + + context "when https" do + let(:url) { "https://localhost:3001" } + + it "returns ssl_connect_error for https" do + expect(easy.return_code).to be(:ssl_connect_error) + end + end + end + + context "when asking for a not allowed url" do + let(:url) { "ssh://localhost" } + let(:protocols) { [:https, :http] } + + it "returns unsupported_protocol" do + expect(easy.return_code).to be(:unsupported_protocol) + end + end + end + + context "when redir_protocols" do + context "when redirecting to a not allowed url" do + let(:url) { "http://localhost:3001/redirect" } + let(:follow_location) { true } + let(:redir_protocols) { :https } + + it "returns unsupported_protocol" do + expect(easy.return_code).to be(:unsupported_protocol) + end + end + end + + context "when no url" do + it "returns url_malformat" do + expect(easy.perform).to eq(:url_malformat) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/options_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/options_spec.rb new file mode 100644 index 000000000000..80414806e9d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/options_spec.rb @@ -0,0 +1,192 @@ +require 'spec_helper' + +describe Ethon::Easy::Options do + let(:easy) { Ethon::Easy.new } + + [ + :accept_encoding, :cainfo, :capath, :connecttimeout, :connecttimeout_ms, :cookie, + :cookiejar, :cookiefile, :copypostfields, :customrequest, :dns_cache_timeout, + :followlocation, :forbid_reuse, :http_version, :httpauth, :httpget, :httppost, + :infilesize, :interface, :keypasswd, :maxredirs, :nobody, :nosignal, + :postfieldsize, :postredir, :protocols, :proxy, :proxyauth, :proxyport, :proxytype, + :proxyuserpwd, :readdata, :readfunction, :redir_protocols, :ssl_verifyhost, + :ssl_verifypeer, :sslcert, :sslcerttype, :sslkey, :sslkeytype, :sslversion, + :timeout, :timeout_ms, :unrestricted_auth, :upload, :url, :useragent, + :userpwd, :verbose, :pipewait + ].each do |name| + describe "#{name}=" do + it "responds_to" do + expect(easy).to respond_to("#{name}=") + end + + it "sets option" do + expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) + expect(Ethon::Curl).to receive(:set_option).with(name, anything, anything) + value = case name + when :http_version + :httpv1_0 + when :httpauth + :basic + when :protocols, :redir_protocols + :http + when :postredir + :post_301 + when :proxytype + :http + when :sslversion + :default + when :httppost + FFI::Pointer::NULL + else + 1 + end + easy.method("#{name}=").call(value) + end + end + end + + describe '#escape?' do + context 'by default' do + it 'returns true' do + expect(easy.escape?).to be_truthy + end + end + + context 'when #escape=nil' do + it 'returns true' do + easy.escape = nil + expect(easy.escape?).to be_truthy + end + end + + context 'when #escape=true' do + it 'returns true' do + easy.escape = true + expect(easy.escape?).to be_truthy + end + end + + context 'when #escape=false' do + it 'returns true' do + easy.escape = false + expect(easy.escape?).to be_falsey + end + end + end + + describe '#multipart?' do + context 'by default' do + it 'returns false' do + expect(easy.multipart?).to be_falsey + end + end + + context 'when #multipart=nil' do + it 'returns false' do + easy.multipart = nil + expect(easy.multipart?).to be_falsey + end + end + + context 'when #multipart=true' do + it 'returns true' do + easy.multipart = true + expect(easy.multipart?).to be_truthy + end + end + + context 'when #multipart=false' do + it 'returns false' do + easy.multipart = false + expect(easy.multipart?).to be_falsey + end + end + end + + describe "#httppost=" do + it "raises unless given a FFI::Pointer" do + expect{ easy.httppost = 1 }.to raise_error(Ethon::Errors::InvalidValue) + end + end + + context "when requesting" do + let(:url) { "localhost:3001" } + let(:timeout) { nil } + let(:timeout_ms) { nil } + let(:connecttimeout) { nil } + let(:connecttimeout_ms) { nil } + let(:userpwd) { nil } + + before do + easy.url = url + easy.timeout = timeout + easy.timeout_ms = timeout_ms + easy.connecttimeout = connecttimeout + easy.connecttimeout_ms = connecttimeout_ms + easy.userpwd = userpwd + easy.perform + end + + context "when userpwd" do + context "when contains /" do + let(:url) { "localhost:3001/auth_basic/test/te%2Fst" } + let(:userpwd) { "test:te/st" } + + it "works" do + expect(easy.response_code).to eq(200) + end + end + end + + context "when timeout" do + let(:timeout) { 1 } + + context "when request takes longer" do + let(:url) { "localhost:3001?delay=2" } + + it "times out" do + expect(easy.return_code).to eq(:operation_timedout) + end + end + end + + context "when connecttimeout" do + let(:connecttimeout) { 1 } + + context "when cannot connect" do + let(:url) { "localhost:3002" } + + it "times out" do + expect(easy.return_code).to eq(:couldnt_connect) + end + end + end + + if Ethon::Easy.supports_timeout_ms? + context "when timeout_ms" do + let(:timeout_ms) { 100 } + + context "when request takes longer" do + let(:url) { "localhost:3001?delay=1" } + + it "times out" do + expect(easy.return_code).to eq(:operation_timedout) + end + end + end + + context "when connecttimeout_ms" do + let(:connecttimeout_ms) { 100 } + + context "when cannot connect" do + let(:url) { "localhost:3002" } + + it "times out" do + # this can either lead to a timeout or couldnt connect depending on which happens first + expect([:couldnt_connect, :operation_timedout]).to include(easy.return_code) + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/queryable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/queryable_spec.rb new file mode 100644 index 000000000000..4ac78370fcb2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/queryable_spec.rb @@ -0,0 +1,234 @@ +# encoding: utf-8 +require 'spec_helper' + +describe Ethon::Easy::Queryable do + let(:hash) { {} } + let!(:easy) { Ethon::Easy.new } + let(:params) { Ethon::Easy::Params.new(easy, hash) } + + describe "#to_s" do + context "when query_pairs empty" do + before { params.instance_variable_set(:@query_pairs, []) } + + it "returns empty string" do + expect(params.to_s).to eq("") + end + end + + context "when query_pairs not empty" do + context "when escape" do + before do + params.escape = true + end + + { + '!' => '%21', '*' => '%2A', "'" => '%27', '(' => '%28', + ')' => '%29', ';' => '%3B', ':' => '%3A', '@' => '%40', + '&' => '%26', '=' => '%3D', '+' => '%2B', '$' => '%24', + ',' => '%2C', '/' => '%2F', '?' => '%3F', '#' => '%23', + '[' => '%5B', ']' => '%5D', + + '<' => '%3C', '>' => '%3E', '"' => '%22', '{' => '%7B', + '}' => '%7D', '|' => '%7C', '\\' => '%5C', '`' => '%60', + '^' => '%5E', '%' => '%25', ' ' => '%20', "\0" => '%00', + + 'まつもと' => '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8', + }.each do |value, percent| + it "turns #{value.inspect} into #{percent}" do + params.instance_variable_set(:@query_pairs, [[:a, value]]) + expect(params.to_s).to eq("a=#{percent}") + end + end + + { + '.' => '%2E', '-' => '%2D', '_' => '%5F', '~' => '%7E', + }.each do |value, percent| + it "leaves #{value.inspect} instead of turning into #{percent}" do + params.instance_variable_set(:@query_pairs, [[:a, value]]) + expect(params.to_s).to eq("a=#{value}") + end + end + end + + context "when no escape" do + before { params.instance_variable_set(:@query_pairs, [[:a, 1], [:b, 2]]) } + + it "returns concatenated query string" do + expect(params.to_s).to eq("a=1&b=2") + end + end + end + + context "when query_pairs contains a string" do + before { params.instance_variable_set(:@query_pairs, ["{a: 1}"]) } + + it "returns correct string" do + expect(params.to_s).to eq("{a: 1}") + end + end + end + + describe "#build_query_pairs" do + let(:pairs) { params.method(:build_query_pairs).call(hash) } + + context "when params is empty" do + it "returns empty array" do + expect(pairs).to eq([]) + end + end + + context "when params is string" do + let(:hash) { "{a: 1}" } + + it "wraps it in an array" do + expect(pairs).to eq([hash]) + end + end + + context "when params is simple hash" do + let(:hash) { {:a => 1, :b => 2} } + + it "transforms" do + expect(pairs).to include([:a, 1]) + expect(pairs).to include([:b, 2]) + end + end + + context "when params is a nested hash" do + let(:hash) { {:a => 1, :b => {:c => 2}} } + + it "transforms" do + expect(pairs).to include([:a, 1]) + expect(pairs).to include(["b[c]", 2]) + end + end + + context "when params contains an array" do + let(:hash) { {:a => 1, :b => [2, 3]} } + + context "by default" do + it "transforms" do + expect(pairs).to include([:a, 1]) + expect(pairs).to include(["b[0]", 2]) + expect(pairs).to include(["b[1]", 3]) + end + end + + context "when params_encoding is :rack" do + before { params.params_encoding = :rack } + it "transforms without indexes" do + expect(pairs).to include([:a, 1]) + expect(pairs).to include(["b[]", 2]) + expect(pairs).to include(["b[]", 3]) + end + end + + context "when params_encoding is :none" do + before { params.params_encoding = :none } + it "does no transformation" do + expect(pairs).to include([:a, 1]) + expect(pairs).to include([:b, [2, 3]]) + end + end + end + + context "when params contains something nested in an array" do + context "when string" do + let(:hash) { {:a => {:b => ["hello", "world"]}} } + + it "transforms" do + expect(pairs).to eq([["a[b][0]", "hello"], ["a[b][1]", "world"]]) + end + end + + context "when hash" do + let(:hash) { {:a => {:b => [{:c =>1}, {:d => 2}]}} } + + it "transforms" do + expect(pairs).to eq([["a[b][0][c]", 1], ["a[b][1][d]", 2]]) + end + end + + context "when file" do + let(:file) { File.open("spec/spec_helper.rb") } + let(:file_info) { params.method(:file_info).call(file) } + let(:hash) { {:a => {:b => [file]}} } + let(:mime_type) { file_info[1] } + + it "transforms" do + expect(pairs).to eq([["a[b][0]", file_info]]) + end + + context "when MIME" do + if defined?(MIME) + context "when mime type" do + it "sets mime type to text" do + expect(mime_type).to eq("application/x-ruby") + end + end + end + + context "when no mime type" do + let(:file) { Tempfile.new("fubar") } + + it "sets mime type to default application/octet-stream" do + expect(mime_type).to eq("application/octet-stream") + end + end + end + + context "when no MIME" do + before { hide_const("MIME") } + + it "sets mime type to default application/octet-stream" do + expect(mime_type).to eq("application/octet-stream") + end + end + end + end + + + context "when params contains file" do + let(:file) { Tempfile.new("fubar") } + let(:file_info) { params.method(:file_info).call(file) } + let(:hash) { {:a => 1, :b => file} } + + it "transforms" do + expect(pairs).to include([:a, 1]) + expect(pairs).to include([:b, file_info]) + end + end + + context "when params key contains a null byte" do + let(:hash) { {:a => "1\0" } } + + it "preserves" do + expect(pairs).to eq([[:a, "1\0"]]) + end + end + + context "when params value contains a null byte" do + let(:hash) { {"a\0" => 1 } } + + it "preserves" do + expect(pairs).to eq([["a\0", 1]]) + end + end + end + + describe "#empty?" do + context "when params empty" do + it "returns true" do + expect(params.empty?).to be_truthy + end + end + + context "when params not empty" do + let(:hash) { {:a => 1} } + + it "returns false" do + expect(params.empty?).to be_falsey + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/response_callbacks_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/response_callbacks_spec.rb new file mode 100644 index 000000000000..eab1c144ab16 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/response_callbacks_spec.rb @@ -0,0 +1,151 @@ +require 'spec_helper' + +describe Ethon::Easy::ResponseCallbacks do + let(:easy) { Ethon::Easy.new } + + [:on_complete, :on_headers, :on_body, :on_progress].each do |callback_type| + describe "##{callback_type}" do + it "responds" do + expect(easy).to respond_to("#{callback_type}") + end + + context "when no block given" do + it "returns @#{callback_type}" do + expect(easy.send("#{callback_type}")).to eq([]) + end + end + + context "when block given" do + it "stores" do + easy.send(callback_type) { p 1 } + expect(easy.instance_variable_get("@#{callback_type}").size).to eq(1) + end + end + + context "when multiple blocks given" do + it "stores" do + easy.send(callback_type) { p 1 } + easy.send(callback_type) { p 2 } + expect(easy.instance_variable_get("@#{callback_type}").size).to eq(2) + end + end + end + end + + describe "#complete" do + before do + easy.on_complete {|r| String.new(r.url) } + end + + it "executes blocks and passes self" do + expect(String).to receive(:new).with(easy.url) + easy.complete + end + + context "when @on_complete nil" do + it "doesn't raise" do + easy.instance_variable_set(:@on_complete, nil) + expect{ easy.complete }.to_not raise_error + end + end + end + + describe "#headers" do + before do + easy.on_headers {|r| String.new(r.url) } + end + + it "executes blocks and passes self" do + expect(String).to receive(:new).with(easy.url) + easy.headers + end + + context "when @on_headers nil" do + it "doesn't raise" do + easy.instance_variable_set(:@on_headers, nil) + expect{ easy.headers }.to_not raise_error + end + end + end + + describe "#progress" do + context "when requesting for realz" do + it "executes callback" do + post = Ethon::Easy::Http::Post.new("http://localhost:3001", {:body => "bar=fu"}) + post.setup(easy) + @called = false + @has_dltotal = false + @has_ultotal = false + easy.on_progress { @called = true } + easy.on_progress { |dltotal, _, _, _| @has_dltotal ||= true } + easy.on_progress { |_, _, ultotal, _| @has_ultotal ||= true } + easy.perform + expect(@called).to be true + expect(@has_dltotal).to be true + expect(@has_ultotal).to be true + end + end + + context "when pretending" do + before do + @dltotal = nil + @dlnow = nil + @ultotal = nil + @ulnow = nil + easy.on_progress { |dltotal, dlnow, ultotal, ulnow| @dltotal = dltotal ; @dlnow = dlnow; @ultotal = ultotal; @ulnow = ulnow } + end + + it "executes blocks and passes dltotal" do + easy.progress(1, 2, 3, 4) + expect(@dltotal).to eq(1) + end + + it "executes blocks and passes dlnow" do + easy.progress(1, 2, 3, 4) + expect(@dlnow).to eq(2) + end + + it "executes blocks and passes ultotal" do + easy.progress(1, 2, 3, 4) + expect(@ultotal).to eq(3) + end + + it "executes blocks and passes ulnow" do + easy.progress(1, 2, 3, 4) + expect(@ulnow).to eq(4) + end + + context "when @on_progress nil" do + it "doesn't raise" do + easy.instance_variable_set(:@on_progress, nil) + expect{ easy.progress(1, 2, 3, 4) }.to_not raise_error + end + end + end + end + + describe "#body" do + before do + @chunk = nil + @r = nil + easy.on_body { |chunk, r| @chunk = chunk ; @r = r } + end + + it "executes blocks and passes self" do + easy.body("the chunk") + expect(@r).to be(easy) + end + + it "executes blocks and passes chunk" do + easy.body("the chunk") + expect(@chunk).to eq("the chunk") + end + + context "when @on_body nil" do + it "doesn't raise" do + easy.instance_variable_set(:@on_body, nil) + expect{ easy.body("the chunk") }.to_not raise_error + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/util_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/util_spec.rb new file mode 100644 index 000000000000..24ddef0522b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy/util_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe Ethon::Easy::Util do + class Dummy + include Ethon::Easy::Util + end + + let(:klass) { Dummy.new } + + describe "escape_zero_byte" do + context "when value has no zero byte" do + let(:value) { "hello world" } + + it "returns same value" do + expect(klass.escape_zero_byte(value)).to be(value) + end + end + + context "when value has zero byte" do + let(:value) { "hello \0world" } + + it "returns escaped" do + expect(klass.escape_zero_byte(value)).to eq("hello \\0world") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy_spec.rb new file mode 100644 index 000000000000..619c2edf5a2c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/easy_spec.rb @@ -0,0 +1,202 @@ +require 'spec_helper' + +describe Ethon::Easy do + let(:easy) { Ethon::Easy.new } + + describe ".new" do + it "inits curl" do + expect(Ethon::Curl).to receive(:init) + easy + end + + context "when options are empty" do + it "sets only callbacks" do + expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) + expect(Ethon::Easy).to receive(:set_option).never + easy + end + end + + context "when options not empty" do + context "when followlocation is set" do + let(:options) { { :followlocation => true } } + let(:easy) { Ethon::Easy.new(options) } + + it "sets followlocation" do + expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) + expect(Ethon::Curl).to receive(:set_option).with(:followlocation, true, anything) + easy + end + end + end + end + + describe "#set_attributes" do + context "when options are empty" do + it "sets only callbacks" do + expect_any_instance_of(Ethon::Easy).to receive(:set_callbacks) + expect(Ethon::Easy).to receive(:set_option).never + easy + end + end + + context "when options aren't empty" do + context "when valid key" do + it "sets" do + expect(easy).to receive(:verbose=).with(true) + easy.set_attributes({:verbose => true}) + end + end + + context "when invalid key" do + it "raises invalid option error" do + expect{ easy.set_attributes({:fubar => 1}) }.to raise_error(Ethon::Errors::InvalidOption) + end + end + end + end + + describe "#reset" do + before { easy.url = "www.example.com" } + + it "resets url" do + easy.reset + expect(easy.url).to be_nil + end + + it "resets escape?" do + easy.escape = false + easy.reset + expect(easy.escape?).to be_truthy + end + + it "resets hash" do + easy.reset + expect(easy.instance_variable_get(:@hash)).to be_nil + end + + it "resets easy handle" do + expect(Ethon::Curl).to receive(:easy_reset) + easy.reset + end + + it "resets on_complete" do + easy.on_complete { p 1 } + easy.reset + expect(easy.on_complete).to be_empty + end + + it "resets on_headers" do + easy.on_headers { p 1 } + easy.reset + expect(easy.on_headers).to be_empty + end + + it "resets on_body" do + easy.on_body { p 1 } + easy.reset + expect(easy.on_body).to be_empty + end + end + + describe "#dup" do + let!(:easy) do + easy = Ethon::Easy.new + easy.url = "http://localhost:3001/" + easy.on_complete { 'on_complete' } + easy.on_headers { 'on_headers' } + easy.on_progress { 'on_progress' } + easy.response_body = 'test_body' + easy.response_headers = 'test_headers' + easy + end + let!(:e) { easy.dup } + + it "sets a new handle" do + expect(e.handle).not_to eq(easy.handle) + end + + it "preserves url" do + expect(e.url).to eq(easy.url) + end + + it "preserves on_complete callback" do + expect(e.on_complete).to be(easy.on_complete) + end + + it "preserves on_headers callback" do + expect(e.on_headers).to be(easy.on_headers) + end + + it 'preserves body_write_callback of original handle' do + expect { easy.perform }.to change { easy.response_body } + expect { easy.perform }.not_to change { e.response_body } + end + + it "preserves on_progress callback" do + expect(e.on_progress).to be(easy.on_progress) + end + + it 'sets new body_write_callback of duplicated handle' do + expect { e.perform }.to change { e.response_body } + expect { e.perform }.not_to change { easy.response_body } + end + + it 'preserves headers_write_callback of original handle' do + expect { easy.perform }.to change { easy.response_headers } + expect { easy.perform }.not_to change { e.response_headers } + end + + it 'sets new headers_write_callback of duplicated handle' do + expect { e.perform }.to change { e.response_headers } + expect { e.perform }.not_to change { easy.response_headers } + end + + it "resets response_body" do + expect(e.response_body).to be_empty + end + + it "resets response_headers" do + expect(e.response_headers).to be_empty + end + + it "sets response_body for duplicated Easy" do + e.perform + expect(e.response_body).not_to be_empty + end + + it "sets response_headers for duplicated Easy" do + e.perform + expect(e.response_headers).not_to be_empty + end + + it "preserves response_body for original Easy" do + e.perform + expect(easy.response_body).to eq('test_body') + end + + it "preserves response_headers for original Easy" do + e.perform + expect(easy.response_headers).to eq('test_headers') + end + end + + describe "#mirror" do + it "returns a Mirror" do + expect(easy.mirror).to be_a(Ethon::Easy::Mirror) + end + + it "builds from easy" do + expect(Ethon::Easy::Mirror).to receive(:from_easy).with(easy) + easy.mirror + end + end + + describe "#log_inspect" do + [ :url, :response_code, :return_code, :total_time ].each do |name| + it "contains #{name}" do + expect(easy.log_inspect).to match name.to_s + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/libc_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/libc_spec.rb new file mode 100644 index 000000000000..0f8b7d41b7d7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/libc_spec.rb @@ -0,0 +1,13 @@ +require 'spec_helper' + +describe Ethon::Libc do + describe "#getdtablesize", :if => !Ethon::Curl.windows? do + it "returns an integer" do + expect(Ethon::Libc.getdtablesize).to be_a(Integer) + end + + it "returns bigger zero", :if => !Ethon::Curl.windows? do + expect(Ethon::Libc.getdtablesize).to_not be_zero + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/loggable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/loggable_spec.rb new file mode 100644 index 000000000000..c307c247acb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/loggable_spec.rb @@ -0,0 +1,21 @@ +require "spec_helper" + +describe Ethon::Loggable do + + describe "#logger=" do + + let(:logger) do + Logger.new($stdout).tap do |log| + log.level = Logger::INFO + end + end + + before do + Ethon.logger = logger + end + + it "sets the logger" do + expect(Ethon.logger).to eq(logger) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi/operations_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi/operations_spec.rb new file mode 100644 index 000000000000..f8c04236cd16 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi/operations_spec.rb @@ -0,0 +1,297 @@ +require 'spec_helper' + +describe Ethon::Multi::Operations do + let(:multi) { Ethon::Multi.new } + let(:easy) { Ethon::Easy.new } + let(:pointer) { FFI::MemoryPointer.new(:int) } + + describe "#handle" do + it "returns a pointer" do + expect(multi.handle).to be_a(FFI::Pointer) + end + end + + describe "#running_count" do + context "when hydra has no easy" do + it "returns nil" do + expect(multi.send(:running_count)).to be_nil + end + end + + context "when hydra has easy" do + before do + easy.url = "http://localhost:3001/" + multi.add(easy) + multi.send(:trigger, pointer) + end + + it "returns 1" do + expect(multi.send(:running_count)).to eq(1) + end + end + + context "when hydra has more easys" do + let(:another_easy) { Ethon::Easy.new } + + before do + easy.url = "http://localhost:3001/" + another_easy.url = "http://localhost:3001/" + multi.add(easy) + multi.add(another_easy) + multi.send(:trigger, pointer) + end + + it "returns 2" do + expect(multi.send(:running_count)).to eq(2) + end + end + end + + describe "#get_timeout" do + context "when code ok" do + let(:timeout) { 1 } + + before do + expect(Ethon::Curl).to receive(:multi_timeout).and_return(:ok) + multi.instance_variable_set(:@timeout, double(:read_long => timeout)) + end + + it "doesn't raise" do + expect{ multi.send(:get_timeout) }.to_not raise_error + end + + context "when timeout smaller zero" do + let(:timeout) { -1 } + + it "returns 1" do + expect(multi.send(:get_timeout)).to eq(1) + end + end + + context "when timeout bigger or equal zero" do + let(:timeout) { 2 } + + it "returns timeout" do + expect(multi.send(:get_timeout)).to eq(timeout) + end + end + end + + context "when code not ok" do + before { expect(Ethon::Curl).to receive(:multi_timeout).and_return(:not_ok) } + + it "raises MultiTimeout error" do + expect{ multi.send(:get_timeout) }.to raise_error(Ethon::Errors::MultiTimeout) + end + end + end + + describe "#set_fds" do + let(:timeout) { 1 } + let(:max_fd) { 1 } + + context "when code ok" do + before { expect(Ethon::Curl).to receive(:multi_fdset).and_return(:ok) } + + it "doesn't raise" do + expect{ multi.method(:set_fds).call(timeout) }.to_not raise_error + end + + context "when max_fd -1" do + let(:max_fd) { -1 } + + before do + multi.instance_variable_set(:@max_fd, double(:read_int => max_fd)) + expect(multi).to receive(:sleep).with(0.001) + end + + it "waits 100ms" do + multi.method(:set_fds).call(timeout) + end + end + + context "when max_fd not -1" do + context "when code smaller zero" do + before { expect(Ethon::Curl).to receive(:select).and_return(-1) } + + it "raises Select error" do + expect{ multi.method(:set_fds).call(timeout) }.to raise_error(Ethon::Errors::Select) + end + end + + context "when code bigger or equal zero" do + before { expect(Ethon::Curl).to receive(:select).and_return(0) } + + it "doesn't raise" do + expect{ multi.method(:set_fds).call(timeout) }.to_not raise_error + end + end + end + end + + context "when code not ok" do + before { expect(Ethon::Curl).to receive(:multi_fdset).and_return(:not_ok) } + + it "raises MultiFdset error" do + expect{ multi.method(:set_fds).call(timeout) }.to raise_error(Ethon::Errors::MultiFdset) + end + end + end + + describe "#perform" do + context "when no easy handles" do + it "returns nil" do + expect(multi.perform).to be_nil + end + + it "logs" do + expect(Ethon.logger).to receive(:debug).twice + multi.perform + end + end + + context "when easy handle" do + before do + easy.url = "http://localhost:3001/" + multi.add(easy) + end + + it "requests" do + multi.perform + end + + it "sets easy" do + multi.perform + expect(easy.response_code).to eq(200) + end + end + + context "when four easy handles" do + let(:easies) do + ary = [] + 4.times do + ary << another_easy = Ethon::Easy.new + another_easy.url = "http://localhost:3001/" + end + ary + end + + before do + easies.each { |e| multi.add(e) } + multi.perform + end + + it "sets response codes" do + expect(easies.all?{ |e| e.response_code == 200 }).to be_truthy + end + end + end + + describe "#ongoing?" do + context "when easy_handles" do + before { multi.easy_handles << 1 } + + context "when running_count not greater 0" do + before { multi.instance_variable_set(:@running_count, 0) } + + it "returns true" do + expect(multi.method(:ongoing?).call).to be_truthy + end + end + + context "when running_count greater 0" do + before { multi.instance_variable_set(:@running_count, 1) } + + it "returns true" do + expect(multi.method(:ongoing?).call).to be_truthy + end + end + end + + context "when no easy_handles" do + context "when running_count not greater 0" do + before { multi.instance_variable_set(:@running_count, 0) } + + it "returns false" do + expect(multi.method(:ongoing?).call).to be_falsey + end + end + + context "when running_count greater 0" do + before { multi.instance_variable_set(:@running_count, 1) } + + it "returns true" do + expect(multi.method(:ongoing?).call).to be_truthy + end + end + end + end + + describe "#init_vars" do + it "sets @timeout" do + expect(multi.instance_variable_get(:@timeout)).to be_a(FFI::MemoryPointer) + end + + it "sets @timeval" do + expect(multi.instance_variable_get(:@timeval)).to be_a(Ethon::Curl::Timeval) + end + + it "sets @fd_read" do + expect(multi.instance_variable_get(:@fd_read)).to be_a(Ethon::Curl::FDSet) + end + + it "sets @fd_write" do + expect(multi.instance_variable_get(:@fd_write)).to be_a(Ethon::Curl::FDSet) + end + + it "sets @fd_excep" do + expect(multi.instance_variable_get(:@fd_excep)).to be_a(Ethon::Curl::FDSet) + end + + it "sets @max_fd" do + expect(multi.instance_variable_get(:@max_fd)).to be_a(FFI::MemoryPointer) + end + end + + describe "#reset_fds" do + after { multi.method(:reset_fds).call } + + it "resets @fd_read" do + expect(multi.instance_variable_get(:@fd_read)).to receive(:clear) + end + + it "resets @fd_write" do + expect(multi.instance_variable_get(:@fd_write)).to receive(:clear) + end + + it "resets @fd_excep" do + expect(multi.instance_variable_get(:@fd_excep)).to receive(:clear) + end + end + + describe "#check" do + it { skip("untested") } + end + + describe "#run" do + it { skip("untested") } + end + + describe "#trigger" do + it "calls multi perform" do + expect(Ethon::Curl).to receive(:multi_perform) + multi.send(:trigger, pointer) + end + + it "sets running count" do + multi.instance_variable_set(:@running_count, nil) + multi.send(:trigger, pointer) + expect(multi.instance_variable_get(:@running_count)).to_not be_nil + end + + it "returns multi perform code" do + expect(Ethon::Curl).to receive(:multi_perform).and_return(:ok) + expect(multi.send(:trigger, pointer)).to eq(:ok) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi/options_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi/options_spec.rb new file mode 100644 index 000000000000..a651a5072ad5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi/options_spec.rb @@ -0,0 +1,68 @@ +require 'spec_helper' + +describe Ethon::Multi::Options do + let(:multi) { Ethon::Multi.new } + + [ + :maxconnects, :pipelining, :socketdata, :socketfunction, + :timerdata, :timerfunction, :max_total_connections + ].each do |name| + describe "#{name}=" do + it "responds_to" do + expect(multi).to respond_to("#{name}=") + end + + it "sets option" do + expect(Ethon::Curl).to receive(:set_option).with(name, anything, anything, anything) + multi.method("#{name}=").call(1) + end + end + end + + describe "#value_for" do + context "when option in bool" do + context "when value true" do + let(:value) { true } + + it "returns 1" do + expect(multi.method(:value_for).call(value, :bool)).to eq(1) + end + end + + context "when value false" do + let(:value) { false } + + it "returns 0" do + expect(multi.method(:value_for).call(value, :bool)).to eq(0) + end + end + end + + + context "when value in int" do + let(:value) { "2" } + + it "returns value casted to int" do + expect(multi.method(:value_for).call(value, :int)).to eq(2) + end + end + + context "when value in unspecific_options" do + context "when value a string" do + let(:value) { "www.example.\0com" } + + it "returns zero byte escaped string" do + expect(multi.method(:value_for).call(value, nil)).to eq("www.example.\\0com") + end + end + + context "when value not a string" do + let(:value) { 1 } + + it "returns value" do + expect(multi.method(:value_for).call(value, nil)).to eq(1) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi/stack_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi/stack_spec.rb new file mode 100644 index 000000000000..933cfc81efb2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi/stack_spec.rb @@ -0,0 +1,79 @@ +require 'spec_helper' + +describe Ethon::Multi::Stack do + let(:multi) { Ethon::Multi.new } + let(:easy) { Ethon::Easy.new } + + describe "#add" do + context "when easy already added" do + before { multi.add(easy) } + + it "returns nil" do + expect(multi.add(easy)).to be_nil + end + end + + context "when easy new" do + it "adds easy to multi" do + expect(Ethon::Curl).to receive(:multi_add_handle).and_return(:ok) + multi.add(easy) + end + + it "adds easy to easy_handles" do + multi.add(easy) + expect(multi.easy_handles).to include(easy) + end + end + + context "when multi_add_handle fails" do + it "raises multi add error" do + expect(Ethon::Curl).to receive(:multi_add_handle).and_return(:bad_easy_handle) + expect{ multi.add(easy) }.to raise_error(Ethon::Errors::MultiAdd) + end + end + + context "when multi cleaned up before" do + it "raises multi add error" do + Ethon::Curl.multi_cleanup(multi.handle) + expect{ multi.add(easy) }.to raise_error(Ethon::Errors::MultiAdd) + end + end + end + + describe "#delete" do + context "when easy in easy_handles" do + before { multi.add(easy) } + + it "deletes easy from multi" do + expect(Ethon::Curl).to receive(:multi_remove_handle).and_return(:ok) + multi.delete(easy) + end + + it "deletes easy from easy_handles" do + multi.delete(easy) + expect(multi.easy_handles).to_not include(easy) + end + end + + context "when easy is not in easy_handles" do + it "does nothing" do + expect(Ethon::Curl).to receive(:multi_add_handle).and_return(:ok) + multi.add(easy) + end + + it "adds easy to easy_handles" do + multi.add(easy) + expect(multi.easy_handles).to include(easy) + end + end + + context "when multi_remove_handle fails" do + before { multi.add(easy) } + + it "raises multi remove error" do + expect(Ethon::Curl).to receive(:multi_remove_handle).and_return(:bad_easy_handle) + expect{ multi.delete(easy) }.to raise_error(Ethon::Errors::MultiRemove) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi_spec.rb new file mode 100644 index 000000000000..7cc3b913c207 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/ethon/multi_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' + +describe Ethon::Multi do + describe ".new" do + it "inits curl" do + expect(Ethon::Curl).to receive(:init) + Ethon::Multi.new + end + + context "when options not empty" do + context "when pipelining is set" do + let(:options) { { :pipelining => true } } + + it "sets pipelining" do + expect_any_instance_of(Ethon::Multi).to receive(:pipelining=).with(true) + Ethon::Multi.new(options) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/spec_helper.rb new file mode 100644 index 000000000000..e3ab9dc67708 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/spec_helper.rb @@ -0,0 +1,27 @@ +$LOAD_PATH.unshift(File.dirname(__FILE__)) +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require 'bundler' +Bundler.setup +require "ethon" +require 'rspec' + +if defined? require_relative + require_relative 'support/localhost_server' + require_relative 'support/server' +else + require 'support/localhost_server' + require 'support/server' +end + +# Ethon.logger = Logger.new($stdout).tap do |log| +# log.level = Logger::DEBUG +# end + +RSpec.configure do |config| + # config.order = :rand + + config.before(:suite) do + LocalhostServer.new(TESTSERVER.new, 3001) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/support/localhost_server.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/support/localhost_server.rb new file mode 100644 index 000000000000..c5a7508bccb5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/support/localhost_server.rb @@ -0,0 +1,94 @@ +require 'rack' +require 'rack/handler/webrick' +require 'net/http' + +# The code for this is inspired by Capybara's server: +# http://github.com/jnicklas/capybara/blob/0.3.9/lib/capybara/server.rb +class LocalhostServer + READY_MESSAGE = "Server ready" + + class Identify + def initialize(app) + @app = app + end + + def call(env) + if env["PATH_INFO"] == "/__identify__" + [200, {}, [LocalhostServer::READY_MESSAGE]] + else + @app.call(env) + end + end + end + + attr_reader :port + + def initialize(rack_app, port = nil) + @port = port || find_available_port + @rack_app = rack_app + concurrently { boot } + wait_until(10, "Boot failed.") { booted? } + end + + private + + def find_available_port + server = TCPServer.new('127.0.0.1', 0) + server.addr[1] + ensure + server.close if server + end + + def boot + # Use WEBrick since it's part of the ruby standard library and is available on all ruby interpreters. + options = { :Port => port } + options.merge!(:AccessLog => [], :Logger => WEBrick::BasicLog.new(StringIO.new)) unless ENV['VERBOSE_SERVER'] + Rack::Handler::WEBrick.run(Identify.new(@rack_app), options) + end + + def booted? + res = ::Net::HTTP.get_response("localhost", '/__identify__', port) + if res.is_a?(::Net::HTTPSuccess) or res.is_a?(::Net::HTTPRedirection) + return res.body == READY_MESSAGE + end + rescue Errno::ECONNREFUSED, Errno::EBADF + return false + end + + def concurrently + if should_use_subprocess? + pid = Process.fork do + trap(:INT) { ::Rack::Handler::WEBrick.shutdown } + yield + exit # manually exit; otherwise this sub-process will re-run the specs that haven't run yet. + end + + at_exit do + Process.kill('INT', pid) + begin + Process.wait(pid) + rescue Errno::ECHILD + # ignore this error...I think it means the child process has already exited. + end + end + else + Thread.new { yield } + end + end + + def should_use_subprocess? + # !ENV['THREADED'] + false + end + + def wait_until(timeout, error_message, &block) + start_time = Time.now + + while true + return if yield + raise TimeoutError.new(error_message) if (Time.now - start_time) > timeout + sleep(0.05) + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/support/server.rb b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/support/server.rb new file mode 100644 index 000000000000..ca5ab9be8dd9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ethon-0.12.0/spec/support/server.rb @@ -0,0 +1,114 @@ +#!/usr/bin/env ruby +require 'json' +require 'zlib' +require 'sinatra/base' + +TESTSERVER = Sinatra.new do + set :logging, nil + + fail_count = 0 + + post '/file' do + { + 'content-type' => params[:file][:type], + 'filename' => params[:file][:filename], + 'content' => params[:file][:tempfile].read, + 'request-content-type' => request.env['CONTENT_TYPE'] + }.to_json + end + + get '/multiple-headers' do + [200, { 'Set-Cookie' => %w[ foo bar ], 'Content-Type' => 'text/plain' }, ['']] + end + + get '/fail/:number' do + if fail_count >= params[:number].to_i + "ok" + else + fail_count += 1 + error 500, "oh noes!" + end + end + + get '/fail_forever' do + error 500, "oh noes!" + end + + get '/redirect' do + redirect '/' + end + + post '/redirect' do + redirect '/' + end + + get '/bad_redirect' do + redirect '/bad_redirect' + end + + get '/auth_basic/:username/:password' do + @auth ||= Rack::Auth::Basic::Request.new(request.env) + # Check that we've got a basic auth, and that it's credentials match the ones + # provided in the request + if @auth.provided? && @auth.basic? && @auth.credentials == [ params[:username], params[:password] ] + # auth is valid - confirm it + true + else + # invalid auth - request the authentication + response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth") + throw(:halt, [401, "Not authorized\n"]) + end + end + + get '/auth_ntlm' do + # we're just checking for the existence if NTLM auth header here. It's validation + # is too troublesome and really doesn't bother is much, it's up to libcurl to make + # it valid + response['WWW-Authenticate'] = 'NTLM' + is_ntlm_auth = /^NTLM/ =~ request.env['HTTP_AUTHORIZATION'] + true if is_ntlm_auth + throw(:halt, [401, "Not authorized\n"]) if !is_ntlm_auth + end + + get '/gzipped' do + req_env = request.env.to_json + z = Zlib::Deflate.new + gzipped_env = z.deflate(req_env, Zlib::FINISH) + z.close + response['Content-Encoding'] = 'gzip' + gzipped_env + end + + get '/**' do + sleep params["delay"].to_i if params.has_key?("delay") + request.env.merge!(:body => request.body.read).to_json + end + + head '/**' do + sleep params["delay"].to_i if params.has_key?("delay") + end + + put '/**' do + request.env.merge!(:body => request.body.read).to_json + end + + post '/**' do + request.env.merge!(:body => request.body.read).to_json + end + + delete '/**' do + request.env.merge!(:body => request.body.read).to_json + end + + patch '/**' do + request.env.merge!(:body => request.body.read).to_json + end + + options '/**' do + request.env.merge!(:body => request.body.read).to_json + end + + route 'PURGE', '/**' do + request.env.merge!(:body => request.body.read).to_json + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/CHANGELOG.md new file mode 100644 index 000000000000..cd42c39fd7c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/CHANGELOG.md @@ -0,0 +1,179 @@ +# Changelog + +## 1.2.7 (May 12, 2018) +* Fix segfault on large numbers of connections [#843] + +## 1.2.6 (April 30, 2018) +* *Fix segfault when an Exception is raised from unbind callback (for real this time!)* +* Fix race condition while initializing the machine [#756] +* Fix for newer compilers where bind() and std::bind() conflict [#830, #831] +* Be verbose about SSL connection errors [#807] +* Avoid explicitly calling class methods when in class scope +* Java: Add EM_PROTO_SSL/TLS definitions [#773, #791] +* Java: return zero when sending data to a closed connection [#475, #804] +* Pure Ruby: Connection::error? calls report_connection_error_status [#801] + +## 1.2.5 (July 27, 2017) +* Java: Use long for larger values in oneshot timer intervals [#784, #794] + +## 1.2.4 (July 27, 2017) +* Java: Add EM_PROTO_SSL/TLS definitions [#773, #791] +* Fix IPv6 UDP get_peername [#788] +* Allow for larger values in oneshot timer intervals [#784, #793] +* Update extconf.rb to allow MinGW builds with OpenSSL 1.1.0 [#785] + +## 1.2.3 (February 22, 2017) +* Pure Ruby: Add get_sockname [#308, #772] +* Fix segfault when an Exception is raised from unbind callback [#765, #766] +* Allow destructors to throw when compiling in >= C++11 [#767] + +## 1.2.2 (January 23, 2017) +* Java: Fix Fixnum deprecated warning in Ruby 2.4+ [#759] +* Fix uncaught C++ exception in file watcher and raise InvalidSignature [#512, #757] +* Fix connection count off-by-one for epoll and kqueue [#750] +* Fix uninitialized variable warning in EM::P::HttpClient [#749] +* Fix missing initial value for EventableDescriptor NextHeartbeat [#748] +* Fix hostname resolution on Solaris, Ilumos, SmartOS, et al [#745, #746] +* Improve reliability of tests, reduce public Internet accesses in tests [#656, #666, #749] + +## 1.2.1 (November 15, 2016) +* Throw strerror(errno) when getsockname or getpeername fail [#683] +* Use a single concrete implementation of getpeername/getsockname, the rest pure virtuals [#683] +* Use gai_strerror to get the failure string from getaddrinfo [#744] +* Fix deregistering descriptor when using KQUEUE [#728] +* Fix to enable to work an example code in EM::Pool [#731] +* LineText2: Add regular expression delimiter support [#706] +* Pure Ruby: EM rescue ECONNREFUSED on initial TCP connect [#741] +* Pure Ruby: EM SSL (working start_tls) [#712] +* Pure Ruby: EM fixes [#707] +* Java: Use Acceptors to get peer and sock names if not present in Connections [#743] + +## 1.2.0.1 (March 15, 2016) +* Fix crash when accepting IPv6 connections due to struct sockaddr_in [#698, #699] + +## 1.2.0 (March 15, 2016) +* Integrate work from the EventMachine-LE 1.1.x versions [#570] +* Add start_tls options :ecdh_curve, :dhparam, :fail_if_no_peer_cert [#195, #275, #399, #665] +* Add start_tls option :ssl_version for choosing SSL/TLS versions and ciphers [#359, #348, #603, #654] +* Add start_tls option :sni_hostname to be passed to TLS params [#593] +* Add method EM::Channel#num_subscribers to get the number of subscribers to a channel [#640] +* Add support for proc-sources in EM::Iterator [#639] +* Factor out method cleanup_machine to cleanup code from EM.run [#650] +* Replace Exception class with StandardError [#637] +* Close socket on close_connection even after close_connection_after_writing [#694] +* Allow reusing of datagram socket/setting bind device [#662] +* Handle deferred exceptions in reactor thread [#486] +* Reimplement Queue to avoid shift/push performance problem [#311] +* Windows: Switch from gethostbyname to getaddrinfo, support IPv6 addresses [#303, #630] +* Windows: Use rake-compiler-dock to cross-compile gems [#627] +* Windows: Add AppVeyor configuration for Windows CI testing [#578] +* Windows: Bump rake-compiler to version 0.9.x [#542] +* Fix compilation on AIX (w/ XLC) [#693] +* Fix build on OpenBSD [#690] +* Fix OpenSSL compile issue on AIX 7.1 [#678] +* Fix EventMachine.fork_reactor keeps the threadpool of the original process [#425] +* Fix to prevent event machine from stopping when a raise is done in an unbind [#327] + +## 1.0.9.1 (January 14, 2016) +* Fix EPROTO not defined on Windows [#676] +* Fix missing cast to struct sockaddr * [#671] +* Fix bug in OpenSSL path detection [#675] + +## 1.0.9 (January 13, 2016) +* Try more ways to detect OpenSSL [#602, #643, #661, #663, #668, #669] +* Use WSAGetLastError in pipe.cpp same as ed.cpp [#659] +* Test compiler flags with the C++ compiler and add them to CXXFLAGS [#634, #651] +* Restore silent-fail on unsupported EM.epoll and EM.kqueue [#638, #649] +* getDescriptorByFileno deprecated in JRuby 1.7.x, removed in JRuby 9000 [#642, #648] +* Add -Wno-address always-true because on Windows rb_fd_select [#578] +* Remove the WITHOUT_SSL constant [#578] +* Fix SSL error when the server replies a TLS Alert to our ClientHello [#544, #653] +* Use WSAStringToAddress in lieu of inet_pton for IPv6 address detection on Windows [#595, #632] +* Fix nasty TCP/IPv6 bug [#595, #632] +* Use select_large_fdset on Solaris [#611, #625] +* Detect the Solaris Studio compiler [#611, #625] +* Throw a message with strerror included [#136, #621] + +## 1.0.8 (August 6, 2015) +* fix kqueue assertion failed, postpone ArmKqueueWriter until all events are processed [#51, #176, #372, #401, #619] +* fix Rubinius GC, crank the machine from Ruby space when running Rubinius [#201, #202, #617] +* test to show that LineText2 preserves whitespace and newlines [#32, #622] +* bump up compiler warnings and resolve them [#616] +* fix Windows x64 use uintptr_t instead of unsigned long for binding pointers [#612, #615] +* fix linetext2 unroll tail recursion to avoid stack level too deep [#609] +* fix for compilation with SSL on windows [#601] +* open file descriptors and sockets with O_CLOEXEC where possible [#298, #488, #591] +* fix SmtpClient: send second EHLO after STARTTLS. [#589] +* fix nul-terminated strings in C, use StringValueCStr instead of StringValuePtr + +## 1.0.7 (February 10, 2015) +* fix delay in kqueue/epoll reactor shutdown when timers exist [#587] +* fix memory leak introduced in v1.0.5 [#586] +* expose EM.set_simultaneous_accept_count [#420] +* fix busy loop when EM.run and EM.next_tick are invoked from exception handler [#452] + +## 1.0.6 (February 3, 2015) +* add support for Rubinius Process::Status [#568] +* small bugfixes for SmtpServer [#449] +* update buftok.rb [#547] +* fix assertion on Write() [#525] +* work around mkmf.rb bug preventing gem installation [#574] +* add pause/resume support to jruby reactor [#556] +* fix pure ruby reactor to use 127.0.0.1 instead of localhost [#439] +* fix compilation under macruby [#243] +* add chunked encoding to http client [#111] +* fix errors on win32 when dealing with pipes [1ea45498] [#105] + +## 1.0.5 (February 2, 2015) +* use monotonic clocks on Linux, OS X, Solaris, and Windows [#563] +* use the rb_fd_* API to get autosized fd_sets [#502] +* add basic tests that the DNS resolver isn't leaking timers [#571] +* update to test-unit 2.x and improve various unit tests [#551] +* remove EventMachine_t::Popen code marked by ifdef OBSOLETE [#551] +* ruby 2.0 may fail at Queue.pop, so rescue and complain to $stderr [#551] +* set file handle to INVALID_HANDLE_VALUE after closing the file [#565] +* use `defined?` instead of rescuing NameError for flow control [#535] +* fix closing files and sockets on Windows [#564] +* fix file uploads in Windows [#562] +* catch failure to fork [#539] +* use chunks for SSL write [#545] + +## 1.0.4 (December 19, 2014) +* add starttls_options to smtp server [#552] +* fix closesocket on windows [#497] +* fix build on ruby 2.2 [#503] +* fix build error on ruby 1.9 [#508] +* fix timer leak during dns resolution [#489] +* add concurrency validation to EM::Iterator [#468] +* add get_file_descriptor to get fd for a signature [#467] +* add EM.attach_server and EM.attach_socket_server [#465, #466] +* calling pause from receive_data takes effect immediately [#464] +* reactor_running? returns false after fork [#455] +* fix infinite loop on double close [edc4d0e6, #441, #445] +* fix compilation issue on llvm [#433] +* fix socket error codes on win32 [ff811a81] +* fix EM.stop latency when timers exist [8b613d05, #426] +* fix infinite loop when system time changes [1427a2c80, #428] +* fix crash when callin attach/detach in the same tick [#427] +* fix compilation issue on solaris [#416] + +## 1.0.3 (March 8, 2013) +* EM.system was broken in 1.0.2 release [#413] + +## 1.0.2 (March 8, 2013) +* binary win32 gems now include fastfilereader shim [#222] +* fix long-standing connection timeout issues [27fdd5b, igrigorik/em-http-request#222] +* http and line protocol cleanups [#193, #151] +* reactor return value cleanup [#225] +* fix double require from gemspec [#284] +* fix smtp server reset behavior [#351] +* fix EM.system argument handling [#322] +* ruby 1.9 compat in smtp server and stomp protocols [#349, #315] +* fix pause from post_init [#380] + +## 1.0.1 (February 27, 2013) +* use rb_wait_for_single_fd() on ruby 2.0 to fix rb_thread_select() deprecation [#363] +* fix epoll/kqueue mode in ruby 2.0 by removing calls to rb_enable_interrupt() [#248, #389] +* fix memory leak when verifying ssl cerificates [#403] +* fix initial connection delay [#393, #374] +* fix build on windows [#371] diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/GNU b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/GNU new file mode 100644 index 000000000000..3b70c5be5ac9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/GNU @@ -0,0 +1,281 @@ +. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + License is intended to guarantee your freedom to share and change free + software--to make sure the software is free for all its users. This + General Public License applies to most of the Free Software + Foundation's software and to any other program whose authors commit to + using it. (Some other Free Software Foundation software is covered by + the GNU Lesser General Public License instead.) You can apply it to + your programs, too. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + this service if you wish), that you receive source code or can get it + if you want it, that you can change the software or use pieces of it + in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid + anyone to deny you these rights or to ask you to surrender the rights. + These restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether + gratis or for a fee, you must give the recipients all the rights that + you have. You must make sure that they, too, receive or can get the + source code. And you must show them these terms so they know their + rights. + + We protect your rights with two steps: (1) copyright the software, and + (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software + patents. We wish to avoid the danger that redistributors of a free + program will individually obtain patent licenses, in effect making the + program proprietary. To prevent this, we have made it clear that any + patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains + a notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", below, + refers to any such program or work, and a "work based on the Program" + means either the Program or any derivative work under copyright law: + that is to say, a work containing the Program or a portion of it, + either verbatim or with modifications and/or translated into another + language. (Hereinafter, translation is included without limitation in + the term "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of + running the Program is not restricted, and the output from the Program + is covered only if its contents constitute a work based on the + Program (independent of having been made by running the Program). + Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any warranty; + and give any other recipients of the Program a copy of this License + along with the Program. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Program, + and can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based + on the Program, the distribution of the whole must be on the terms of + this License, whose permissions for other licensees extend to the + entire whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Program. + + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of + a storage or distribution medium does not bring the other work under + the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete source + code means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to + control compilation and installation of the executable. However, as a + special exception, the source code distributed need not include + anything that is normally distributed (in either source or binary + form) with the major components (compiler, kernel, and so on) of the + operating system on which the executable runs, unless that component + itself accompanies the executable. + + If distribution of executable or object code is made by offering + access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this License. + However, parties who have received copies, or rights, from you under + this License will not have their licenses terminated so long as such + parties remain in full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Program or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Program (or any work based on the + Program), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + You are not responsible for enforcing compliance by third parties to + this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Program at all. For example, if a patent + license would not permit royalty-free redistribution of the Program by + all those who receive copies directly or indirectly through you, then + the only way you could satisfy both it and this License would be to + refrain entirely from distribution of the Program. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system, which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is willing + to distribute software through any other system and a licensee cannot + impose that choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Program under this License + may add an explicit geographical distribution limitation excluding + those countries, so that distribution is permitted only in or among + countries not thus excluded. In such case, this License incorporates + the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions + of the General Public License from time to time. Such new versions will + be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + + Each version is given a distinguishing version number. If the Program + specifies a version number of this License which applies to it and "any + later version", you have the option of following the terms and conditions + either of that version or of any later version published by the Free + Software Foundation. If the Program does not specify a version number of + this License, you may choose any version ever published by the Free Software + Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the author + to ask for permission. For software which is copyrighted by the Free + Software Foundation, write to the Free Software Foundation; we sometimes + make exceptions for this. Our decision will be guided by the two goals + of preserving the free status of all derivatives of our free software and + of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS + TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, + REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING + OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED + TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY + YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGES. + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/LICENSE b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/LICENSE new file mode 100644 index 000000000000..fbe8c83b88c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/LICENSE @@ -0,0 +1,60 @@ +EventMachine is copyrighted free software owned by Francis Cianfrocca +(blackhedd ... gmail.com). The Owner of this software permits you to +redistribute and/or modify the software under either the terms of the GPL +version 2 (see the file GPL), or the conditions below ("Ruby License"): + + 1. You may make and give away verbatim copies of the source form of this + software without restriction, provided that you retain ALL of the + original copyright notices and associated disclaimers. + + 2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. + + b) use the modified software only within your corporation or + organization. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the Owner. + + 3. You may distribute the software in object code or binary form, + provided that you do at least ONE of the following: + + a) distribute the binaries and library files of the software, + together with instructions (in a manual page or equivalent) + on where to get the original distribution. + + b) accompany the distribution with the machine-readable source of + the software. + + c) give non-standard binaries non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the Owner. + + 4. You may modify and include parts of the software into any other + software (possibly commercial), provided you comply with the terms in + Sections 1, 2, and 3 above. But some files in the distribution + are not written by the Owner, so they may be made available to you + under different terms. + + For the list of those files and their copying conditions, see the + file LEGAL. + + 5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whoever generated them, + and may be sold commercially, and may be aggregated with this + software. + + 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/README.md b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/README.md new file mode 100644 index 000000000000..4b17cb4aa156 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/README.md @@ -0,0 +1,110 @@ +# About EventMachine [![Build Status](https://travis-ci.org/eventmachine/eventmachine.svg?branch=master)](https://travis-ci.org/eventmachine/eventmachine) [![Code Climate Maintainability](https://api.codeclimate.com/v1/badges/e9b0603462905d5b9118/maintainability)](https://codeclimate.com/github/eventmachine/eventmachine/maintainability) + + +## What is EventMachine ## + +EventMachine is an event-driven I/O and lightweight concurrency library for Ruby. +It provides event-driven I/O using the [Reactor pattern](http://en.wikipedia.org/wiki/Reactor_pattern), +much like [JBoss Netty](http://www.jboss.org/netty), [Apache MINA](http://mina.apache.org/), +Python's [Twisted](http://twistedmatrix.com), [Node.js](http://nodejs.org), libevent and libev. + +EventMachine is designed to simultaneously meet two key needs: + + * Extremely high scalability, performance and stability for the most demanding production environments. + * An API that eliminates the complexities of high-performance threaded network programming, + allowing engineers to concentrate on their application logic. + +This unique combination makes EventMachine a premier choice for designers of critical networked +applications, including Web servers and proxies, email and IM production systems, authentication/authorization +processors, and many more. + +EventMachine has been around since the early 2000s and is a mature and battle-tested library. + + +## What EventMachine is good for? ## + + * Scalable event-driven servers. Examples: [Thin](http://code.macournoyer.com/thin/) or [Goliath](https://github.com/postrank-labs/goliath/). + * Scalable asynchronous clients for various protocols, RESTful APIs and so on. Examples: [em-http-request](https://github.com/igrigorik/em-http-request) or [amqp gem](https://github.com/ruby-amqp/amqp). + * Efficient network proxies with custom logic. Examples: [Proxymachine](https://github.com/mojombo/proxymachine/). + * File and network monitoring tools. Examples: [eventmachine-tail](https://github.com/jordansissel/eventmachine-tail) and [logstash](https://github.com/logstash/logstash). + + + +## What platforms are supported by EventMachine? ## + +EventMachine supports Ruby 1.8.7 through 2.6, REE, JRuby and **works well on Windows** as well +as many operating systems from the Unix family (Linux, Mac OS X, BSD flavors). + + + +## Install the gem ## + +Install it with [RubyGems](https://rubygems.org/) + + gem install eventmachine + +or add this to your Gemfile if you use [Bundler](http://gembundler.com/): + + gem "eventmachine" + + + +## Getting started ## + +For an introduction to EventMachine, check out: + + * [blog post about EventMachine by Ilya Grigorik](http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/). + * [EventMachine Introductions by Dan Sinclair](http://everburning.com/news/eventmachine-introductions.html). + + +### Server example: Echo server ### + +Here's a fully-functional echo server written with EventMachine: + +```ruby + require 'eventmachine' + + module EchoServer + def post_init + puts "-- someone connected to the echo server!" + end + + def receive_data data + send_data ">>>you sent: #{data}" + close_connection if data =~ /quit/i + end + + def unbind + puts "-- someone disconnected from the echo server!" + end +end + +# Note that this will block current thread. +EventMachine.run { + EventMachine.start_server "127.0.0.1", 8081, EchoServer +} +``` + + +## EventMachine documentation ## + +Currently we only have [reference documentation](http://rdoc.info/github/eventmachine/eventmachine/frames) and a [wiki](https://github.com/eventmachine/eventmachine/wiki). + + +## Community and where to get help ## + + * Join the [mailing list](http://groups.google.com/group/eventmachine) (Google Group) + * Join IRC channel #eventmachine on irc.freenode.net + + +## License and copyright ## + +EventMachine is copyrighted free software made available under the terms +of either the GPL or Ruby's License. + +Copyright: (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + + +## Alternatives ## + +If you are unhappy with EventMachine and want to use Ruby, check out [Celluloid](https://celluloid.io/). diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/DocumentationGuidesIndex.md b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/DocumentationGuidesIndex.md new file mode 100644 index 000000000000..b8ce5a2aeeac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/DocumentationGuidesIndex.md @@ -0,0 +1,27 @@ +# EventMachine documentation guides # + +Welcome to the documentation guides for [EventMachine](http://github.com/eventmachine/eventmachine), +a fast and simple event-processing library for Ruby programs (à la JBoss Netty, Twisted, Node.js +and so on). + +## Guide list ## + + * {file:docs/GettingStarted.md Getting started with EventMachine} + * {file:docs/EventDrivenServers.md Writing event-driven servers} + * {file:docs/EventDrivenClients.md Writing event-driven clients} + * {file:docs/ConnectionFailureAndRecovery.md Connection Failure and Recovery} + * {file:docs/TLS.md TLS (aka SSL)} + * {file:docs/Ecosystem.md EventMachine ecosystem}: Thin, Goliath, em-http-request, em-websockets, Proxymachine and beyond + * {file:docs/BlockingEventLoop.md On blocking the event loop: why it is harmful for performance and how to avoid it} + * {file:docs/LightweightConcurrency.md Lightweight concurrency with EventMachine} + * {file:docs/Deferrables.md Deferrables} + * {file:docs/ModernKernelInputOutputAPIs.md Brief introduction to epoll, kqueue, select} + * {file:docs/WorkingWithOtherIOSources.md Working with other IO sources such as the keyboard} + + +## Tell us what you think! ## + +Please take a moment and tell us what you think about this guide on the [EventMachine mailing list](http://bit.ly/jW3cR3) +or in the #eventmachine channel on irc.freenode.net: what was unclear? What wasn't covered? +Maybe you don't like the guide style or the grammar and spelling are incorrect? Reader feedback is +key to making documentation better. diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/GettingStarted.md b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/GettingStarted.md new file mode 100644 index 000000000000..63acbb78b322 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/GettingStarted.md @@ -0,0 +1,521 @@ +# @title Getting Started with Ruby EventMachine +# @markup markdown +# @author Michael S. Klishin, Dan Sinclair + +# Getting started with Ruby EventMachine # + + +## About this guide ## + +This guide is a quick tutorial that helps you to get started with EventMachine for writing event-driven +servers, clients and using it as a lightweight concurrency library. +It should take about 20 minutes to read and study the provided code examples. This guide covers + + * Installing EventMachine via [Rubygems](http://rubygems.org) and [Bundler](http://gembundler.com). + * Building an Echo server, the "Hello, world"-like code example of network servers. + * Building a simple chat, both server and client. + * Building a very small asynchronous Websockets client. + + +## Covered versions ## + +This guide covers EventMachine v0.12.10 and 1.0 (including betas). + + +## Level ## + +This guide assumes you are comfortable (but not necessary a guru) with the command line. On Microsoft Windows™, +we recommend you to use [JRuby](http://jruby.org) when running these examples. + + +## Installing EventMachine ## + +### Make sure you have Ruby installed ### + +This guide assumes you have one of the supported Ruby implementations installed: + + * Ruby 1.8.7 + * Ruby 1.9.2 + * [JRuby](http://jruby.org) (we recommend 1.6) + * [Rubinius](http://rubini.us) 1.2 or higher + * [Ruby Enterprise Edition](http://www.rubyenterpriseedition.com) + +EventMachine works on Microsoft Windows™. + + +### With Rubygems ### + +To install the EventMachine gem do + + gem install eventmachine + + +### With Bundler ### + + gem "eventmachine" + + +### Verifying your installation ### + +Lets verify your installation with this quick IRB session: + + irb -rubygems + + ruby-1.9.2-p180 :001 > require "eventmachine" + => true + ruby-1.9.2-p180 :002 > EventMachine::VERSION + => "1.0.0.beta.3" + + +## An Echo Server Example ## + +Lets begin with the classic "Hello, world"-like example, an echo server. The echo server responds clients with the +same data that was provided. First, here's the code: + +{include:file:examples/guides/getting\_started/01\_eventmachine\_echo_server.rb} + + +When run, the server binds to port 10000. We can connect using Telnet and verify it's working: + + telnet localhost 10000 + +On my machine the output looks like: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + +Let's send something to our server. Type in "Hello, EventMachine" and hit Enter. The server will respond with +the same string: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + Hello, EventMachine + # (here we hit Enter) + Hello, EventMachine + # (this ^^^ is our echo server reply) + +It works! Congratulations, you now can tell your Node.js-loving friends that you "have done some event-driven programming, too". +Oh, and to stop Telnet, hit Control + Shift + ] and then Control + C. + +Lets walk this example line by line and see what's going on. These lines + + require 'rubygems' # or use Bundler.setup + require 'eventmachine' + +probably look familiar: you use [RubyGems](http://rubygems.org) (or [Bundler](http://gembundler.com/)) for dependencies and then require EventMachine gem. Boring. + +Next: + + class EchoServer < EventMachine::Connection + def receive_data(data) + send_data(data) + end + end + +Is the implementation of our echo server. We define a class that inherits from {EventMachine::Connection} +and a handler (aka callback) for one event: when we receive data from a client. + +EventMachine handles the connection setup, receiving data and passing it to our handler, {EventMachine::Connection#receive_data}. + +Then we implement our protocol logic, which in the case of Echo is pretty trivial: we send back whatever we receive. +To do so, we're using {EventMachine::Connection#send_data}. + +Lets modify the example to recognize `exit` command: + +{include:file:examples/guides/getting\_started/02\_eventmachine\_echo_server\_that\_recognizes\_exit\_command.rb} + +Our `receive\_data` changed slightly and now looks like this: + + def receive_data(data) + if data.strip =~ /exit$/i + EventMachine.stop_event_loop + else + send_data(data) + end + end + +Because incoming data has trailing newline character, we strip it off before matching it against a simple regular +expression. If the data ends in `exit`, we stop EventMachine event loop with {EventMachine.stop_event_loop}. This unblocks +main thread and it finishes execution, and our little program exits as the result. + +To summarize this first example: + + * Subclass {EventMachine::Connection} and override {EventMachine::Connection#send_data} to handle incoming data. + * Use {EventMachine.run} to start EventMachine event loop and then bind echo server with {EventMachine.start_server}. + * To stop the event loop, use {EventMachine.stop_event_loop} (aliased as {EventMachine.stop}) + +Lets move on to a slightly more sophisticated example that will introduce several more features and methods +EventMachine has to offer. + + +## A Simple Chat Server Example ## + +Next we will write a simple chat. Initially clients will still use telnet to connect, but then we will add little +client application that will serve as a proxy between telnet and the chat server. This example is certainly longer +(~ 150 lines with whitespace and comments) so instead of looking at the final version and going through it line by line, +we will instead begin with a very simple version that only keeps track of connected clients and then add features +as we go. + +To set some expectations about our example: + + * It will keep track of connected clients + * It will support a couple of commands, à la IRC + * It will support direct messages using Twitter-like @usernames + * It won't use MongoDB, fibers or distributed map/reduce for anything but will be totally [Web Scale™](http://bit.ly/webscaletm) nonetheless. Maybe even [ROFLscale](http://bit.ly/roflscalevideo). + +### Step one: detecting connections and disconnectons ### + +First step looks like this: + +{include:file:examples/guides/getting\_started/04\_simple\_chat\_server\_step\_one.rb} + +We see familiar {EventMachine.run} and {EventMachine.start_server}, but also {EventMachine::Connection#post_init} and {EventMachine::Connection#unbind} we haven't +met yet. We don't use them in this code, so when are they run? Like {EventMachine::Connection#receive_data}, these methods are callbacks. EventMachine calls them +when certain events happen: + + * {EventMachine#post_init} is called by the event loop immediately after the network connection has been established. + In the chat server example case, this is when a new client connects. + * {EventMachine#unbind} is called when client disconnects, connection is closed or is lost (because of a network issue, for example). + +All our chat server does so far is logging connections or disconnections. What we want it to do next is to keep track of connected clients. + + +### Step two: keep track of connected clients ### + +Next iteration of the code looks like this: + +{include:file:examples/guides/getting\_started/05\_simple\_chat\_server\_step\_two.rb} + +While the code we added is very straightforward, we have to clarify one this first: subclasses of {EventMachine::Connection} are instantiated by +EventMachine for every new connected peer. So for 10 connected chat clients, there will be 10 separate `SimpleChatServer` instances in our +server process. Like any other objects, they can be stored in a collection, can provide public API other objects use, can instantiate or inject +dependencies and in general live a happy life all Ruby objects live until garbage collection happens. + +In the example above we use a @@class_variable to keep track of connected clients. In Ruby, @@class variables are accessible from instance +methods so we can add new connections to the list from `SimpleChatServer#post_init` and remove them in `SimpleChatServer#unbind`. We can also +filter connections by some criteria, as `SimpleChatServer#other_peers demonstrates`. + +So, we keep track of connections but how do we identify them? For a chat app, it's pretty common to use usernames for that. Lets ask our clients +to enter usernames when they connect. + + +### Step three: adding usernames ## + +To add usernames, we need to add a few things: + + * We need to invite newly connected clients to enter their username. + * A reader (getter) method on our {EventMachine::Connection} subclass. + * An idea of connection state (keeping track of whether a particular participant had entered username before). + +Here is one way to do it: + +{include:file:examples/guides/getting\_started/06\_simple\_chat\_server\_step\_three.rb} + +This is quite an update so lets take a look at each method individually. First, `SimpleChatServer#post_init`: + + def post_init + @username = nil + puts "A client has connected..." + ask_username + end + +To keep track of username we ask chat participants for, we add @username instance variable to our connection class. Connection +instances are just Ruby objects associated with a particular connected peer, so using @ivars is very natural. To make username +value accessible to other objects, we added a reader method that was not shown on the snippet above. + +Lets dig into `SimpleChatServer#ask_username`: + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + # ... + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) + +Nothing new here, we are using {EventMachine::Connection#send_data} which we have seen before. + + +In `SimpleChatServer#receive_data` we now have to check if the username was entered or we need +to ask for it: + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + # ... + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + +Finally, handler of chat messages is not yet implemented: + + def handle_chat_message(msg) + raise NotImplementedError + end + +Lets try this example out using Telnet: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + [info] Enter your username: + antares_ + [info] Ohai, antares_ + +and the server output: + + A client has connected... + antares_ has joined + +This version requires you to remember how to terminate your Telnet session (Ctrl + Shift + ], then Ctrl + C). +It is annoying, so why don't we add the same `exit` command to our chat server? + + +### Step four: adding exit command and delivering chat messages #### + +{include:file:examples/guides/getting\_started/07\_simple\_chat\_server\_step\_four.rb} + +TBD + +Lets test-drive this version. Client A: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + [info] Enter your username: + michael + [info] Ohai, michael + Hi everyone + michael: Hi everyone + joe has joined the room + # here ^^^ client B connects, lets greet him + hi joe + michael: hi joe + joe: hey michael + # ^^^ client B replies + exit + # ^^^ out command in action + Connection closed by foreign host. + +Client B: + + ~ telnet localhost 10000 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + [info] Enter your username: + joe + [info] Ohai, joe + michael: hi joe + # ^^^ client A greets us, lets reply + hey michael + joe: hey michael + exit + # ^^^ out command in action + Connection closed by foreign host. + +And finally, the server output: + + A client has connected... + michael has joined + A client has connected... + _antares has joined + [info] _antares has left + [info] michael has left + +Our little char server now supports usernames, sending messages and the `exit` command. Next up, private (aka direct) messages. + + +### Step five: adding direct messages and one more command ### + +To add direct messages, we come up with a simple convention: private messages begin with @username and may have optional colon before +message text, like this: + + @joe: hey, how do you like eventmachine? + +This convention makes parsing of messages simple so that we can concentrate on delivering them to a particular client connection. +Remember when we added `username` reader on our connection class? That tiny change makes this step possible: when a new direct +message comes in, we extract username and message text and then find then connection for @username in question: + + # + # Message handling + # + + def handle_chat_message(msg) + if command?(msg) + self.handle_command(msg) + else + if direct_message?(msg) + self.handle_direct_message(msg) + else + self.announce(msg, "#{@username}:") + end + end + end # handle_chat_message(msg) + + def direct_message?(input) + input =~ DM_REGEXP + end # direct_message?(input) + + def handle_direct_message(input) + username, message = parse_direct_message(input) + + if connection = @@connected_clients.find { |c| c.username == username } + puts "[dm] @#{@username} => @#{username}" + connection.send_line("[dm] @#{@username}: #{message}") + else + send_line "@#{username} is not in the room. Here's who is: #{usernames.join(', ')}" + end + end # handle_direct_message(input) + + def parse_direct_message(input) + return [$1, $2] if input =~ DM_REGEXP + end # parse_direct_message(input) + +This snippet demonstrates how one connection instance can obtain another connection instance and send data to it. +This is a very powerful feature, consider just a few use cases: + + * Peer-to-peer protocols + * Content-aware routing + * Efficient streaming with optional filtering + +Less common use cases include extending C++ core of EventMachine to provide access to hardware that streams events that +can be re-broadcasted to any interested parties connected via TCP, UDP or something like AMQP or WebSockets. With this, +sky is the limit. Actually, EventMachine has several features for efficient proxying data between connections. +We will not cover them in this guide. + +One last feature that we are going to add to our chat server is the `status` command that tells you current server time and how many people +are there in the chat room: + + # + # Commands handling + # + + def command?(input) + input =~ /(exit|status)$/i + end # command?(input) + + def handle_command(cmd) + case cmd + when /exit$/i then self.close_connection + when /status$/i then self.send_line("[chat server] It's #{Time.now.strftime('%H:%M')} and there are #{self.number_of_connected_clients} people in the room") + end + end # handle_command(cmd) + +Hopefully this piece of code is easy to follow. Try adding a few more commands, for example, the `whoishere` command that lists people +currently in the chat room. + +In the end, our chat server looks like this: + +{include:file:examples/guides/getting\_started/08\_simple\_chat\_server\_step\_five.rb} + +We are almost done with the server but there are some closing thoughts. + + +### Step six: final version ### + +Just in case, here is the final version of the chat server code we have built: + +{include:file:examples/guides/getting\_started/03\_simple\_chat\_server.rb} + + +### Step seven: future directions and some closing thoughts ### + +The chat server is just about 150 lines of Ruby including empty lines and comments, yet it has a few features most of chat server +examples never add. We did not, however, implement many other features that popular IRC clients like [Colloquy](http://colloquy.info) have: + + * Chat moderation + * Multiple rooms + * Connection timeout detection + +How would one go about implementing them? We thought it is worth discussing what else EventMachine has to offer and what ecosystem projects +one can use to build a really feature-rich Web-based IRC chat client. + +With multiple rooms it's more or less straightforward, just add one more hash and a bunch of commands and use the information about which rooms participant +is in when you are delivering messages. There is nothing in EventMachine itself that can make the job much easier for developer. + +To implement chat moderation feature you may want to do a few things: + + * Work with client IP addresses. Maybe we want to consider everyone who connects from certain IPs a moderator. + * Access persistent data about usernames of moderators and their credentials. + +Does EventMachine have anything to offer here? It does. To obtain peer IP address, take a look at {EventMachine::Connection#get_peername}. The name of this method is +a little bit misleading and originates from low-level socket programming APIs. + +#### A whirlwind tour of the EventMachine ecosystem #### + +To work with data stores you can use several database drivers that ship with EventMachine itself, however, quite often there are some 3rd party projects in +the EventMachine ecosystem that have more features, are faster or just better maintained. So we figured it will be helpful to provide a few pointers +to some of those projects: + + * For MySQL, check out [em-mysql](https://github.com/eventmachine/em-mysql) project. + * For PostgreSQL, have a look at Mike Perham's [EventMachine-based PostgreSQL driver](https://github.com/mperham/em_postgresql). + * For Redis, there is a young but already popular [em-hiredis](https://github.com/mloughran/em-hiredis) library that combines EventMachine's non-blocking I/O with + extreme performance of the official Redis C client, [hiredis](https://github.com/antirez/hiredis). + * For MongoDB, see [em-mongo](https://github.com/bcg/em-mongo) + * For Cassandra, Mike Perham [added transport agnosticism feature](http://www.mikeperham.com/2010/02/09/cassandra-and-eventmachine/) to the [cassandra gem](https://rubygems.org/gems/cassandra). + +[Riak](http://www.basho.com/products_riak_overview.php) and CouchDB talk HTTP so it's possible to use [em-http-request](https://github.com/igrigorik/em-http-request). +If you are aware of EventMachine-based non-blocking drivers for these databases, as well as for HBase, let us know on the [EventMachine mailing list](http://groups.google.com/group/eventmachine). +Also, EventMachine supports TLS (aka SSL) and works well on [JRuby](http://jruby.org) and Windows. + +Learn more in our {file:docs/Ecosystem.md EventMachine ecosystem} and {file:docs/TLS.md TLS (aka SSL)} guides. + + +#### Connection loss detection #### + +Finally, connection loss detection. When our chat participant closes her laptop lid, how do we know that she is no longer active? The answer is, when EventMachine +detects TCP connectin closure, it calls {EventMachine::Connection#unbind}. Version 1.0.beta3 and later also pass an optional argument to that method. The argument +indicates what error (if any) caused the connection to be closed. + +Learn more in our {file:docs/ConnectionFailureAndRecovery.md Connection Failure and Recovery} guide. + + +#### What the Chat Server Example doesn't demonstrate #### + +This chat server also leaves out something production quality clients and servers must take care of: buffering. We intentionally did not include any buffering in +our chat server example: it would only distract you from learning what you really came here to learn: how to use EventMachine to build blazing fast asynchronous +networking programs quickly. However, {EventMachine::Connection#receive_data} does not offer any guarantees that you will be receiving "whole messages" all the time, +largely because the underlying transport (UDP or TCP) does not offer such guarantees. Many protocols, for example, AMQP, mandate that large content chunks are +split into smaller _frames_ of certain size. This means that [amq-client](https://github.com/ruby-amqp/amq-client) library, for instance, that has EventMachine-based driver, +has to deal with figuring out when exactly we received "the whole message". To do so, it uses buffering and employs various checks to detect _frame boundaries_. +So **don't be deceived by the simplicity of this chat example**: it intentionally leaves framing out, but real world protocols usually require it. + + + +## A (Proxying) Chat Client Example ## + +TBD + + +## Wrapping up ## + +This tutorial ends here. Congratulations! You have learned quite a bit about EventMachine. + + +## What to read next ## + +The documentation is organized as a {file:docs/DocumentationGuidesIndex.md number of guides}, covering all kinds of +topics. TBD + + +## Tell us what you think! ## + +Please take a moment and tell us what you think about this guide on the [EventMachine mailing list](http://bit.ly/jW3cR3) +or in the #eventmachine channel on irc.freenode.net: what was unclear? What wasn't covered? +Maybe you don't like the guide style or the grammar and spelling are incorrect? Reader feedback is +key to making documentation better. diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/ChangeLog b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/ChangeLog new file mode 100644 index 000000000000..c7a6c48e4ea3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/ChangeLog @@ -0,0 +1,211 @@ +01Oct06: Replaced EventMachine#open_datagram_server with a version that can + take a Class or a Module, instead of just a Module. Thanks to Tobias + Gustafsson for pointing out the missing case. +04Oct06: Supported subsecond timer resolutions, per request by Jason Roelofs. +05Oct06: Added EventMachine#set_quantum, which sets the timer resolution. +15Nov06: Added Connection#set_comm_inactivity_timeout. +15Nov06: Checked in a Line-and-Text Protocol Handler. +18Nov06: Checked in a Header-and-Body Protocol Handler. +22Nov06: Changed EventMachine#reconnect: no longer excepts when called on an + already-connected handler. +28Nov06: Supported a binary-unix gem. +19Dec06: Added EventMachine#set_effective_user. +05Jan07: Upped max outstanding timers to 1000. +15May07: Applied Solaris patches from Brett Eisenberg +22May07: Cleaned up the license text in all the source files. +22May07: Released version 0.7.2 + +23May07: Per suggestion from Bill Kelly, fixed a bug with the initialization + of the network libraries under Windows. The goal is to enable EM to + be used without Ruby. +28May07: Applied patch from Bill Kelly, refactors the declarations of + event names to make EM easier to use from C programs without Ruby. +31May07: Added a preliminary implementation of EventMachine#popen. +01Jun07: Added EM, a "pseudo-alias" for EventMachine. +01Jun07: Added EM#next_tick. +01Jun07: Added EM::Connection#get_outbound_data_size +05Jun07: Removed the code which loads a pure-Ruby EM library in case the + compiled extension is unavailable. Suggested by Moshe Litvin. +06Jun07: Preliminary epoll implementation. +12Jun07: Added an evented popen implementation that, like Ruby's, is + full-duplex and makes the subprocess PID available to the caller. +06Jul07: Performance-tweaked the callback dispatcher in eventmachine.rb. +10Jul07: Released version 0.8.0. +12Jul07: Applied patches from Tim Pease to fix Solaris build problems. +15Jul07: Created a new provisional source branch, experiments/jruby-1. + This is a preliminary implementation of the EM reactor in Java, + suitable for use with JRuby. +17Jul07: Added EventMachine#stop_server, per request from Kirk Haines, + and associated unit tests. +22Jul07: Added EventMachine#stream_file_data. This is a very fast and scalable + way of sending data from static files over network connections. It + has separate implementations for small files and large file, and + has tunings to minimize memory consumption. +26Jul07: Added some patches by Kirk Haines to improve the behavior of + EM::Connection#send_file_data_to_connection. +26Jul07: Added a C++ module for directly integrating EM into C++ programs + with no Ruby dependencies. Needs example code. +29Jul07: Added EventMachine::Protocols::LineText2. +29Jul07: Added EventMachine::Protocols::Stomp. +30Jul07: Added sys/stat.h to project.h to fix compilation bug on Darwin. +13Aug07: Added EventMachine#reactor_running? +15Aug07: Added parameters for EventMachine::Connection:start_tls that can be + used to specify client-side private keys and certificates. +17Aug07: Added EventMachine#run_block, a sugaring for a common use case. +24Aug07: Added a preliminary keyboard handler. Needs docs and testing on + windows. +26Aug07: Created EventMachine::Spawnable, an implementation of Erlang-like + processes. +27Aug07: Silenced some -w warnings, requested by James Edward Gray II. +30Aug07: Added cookies to EM::HttpClient#request. +04Sep07: Added an initial implementation of an evented SMTP client. +04Sep07: Added an initial implementation of an evented SMTP server. +10Sep07: Changed EM#spawn to run spawned blocks in the context of the + SpawnedProcess object, not of whatever was the active object at the + time of the spawn. +14Sep07: Heartbeats weren't working with EPOLL. Noticed by Brian Candler. +15Sep07: Added some features, tests and documents to Deferrable. +16Sep07: Added [:content] parameter to EM::Protocols::SmtpClient#send. +16Sep07: Bumped version to 0.9.0 in anticipation of a release. +18Sep07: Released version 0.9.0. +19Sep07: Added #receive_reset to EM::Protocols::SmtpServer. +19Sep07: User overrides of EM::Protocols::SmtpServer#receive_recipient can now + return a Deferrable. Also fixed bug: SmtpClient now raises a protocol + error if none of its RCPT TO: commands are accepted by the server. +26Sep07: Fixed missing keyboard support for Windows. +03Oct07: Added a default handler for RuntimeErrors emitted from user-written + code. Suggested by Brian Candler. +19Oct07: Set the SO_BROADCAST option automatically on all UDP sockets. +10Nov07: Forced integer conversion of send_datagram's port parameter. +Suggested by Matthieu Riou. +12Nov07: Added saslauth.rb, a protocol module to replace the Cyrus SASL +daemons saslauthd and pwcheck. +15Nov07: Fixed bug reported by Mark Zvillius. We were failing to dispatch + zero-length datagrams under certain conditions. +19Nov07: Added EventMachine#set_max_timers. Requested by Matthieu Riou and + others. +19Nov07: Fixed bug with EM::Connection#start_tls. Was not working with server + connections. Reported by Michael S. Fischer. +26Nov07: Supported a hack for EventMachine#popen so it can return an exit + status from subprocesses. Requested by Michael S. Fischer. +30Nov07: Changed Pipe descriptors so that the child-side of the socketpair is + NOT set nonblocking. Suggested by Duane Johnson. +05Dec07: Re-enabled the pure-Ruby implementation. +06Dec07: Released Version 0.10.0. +13Dec07: Added EM::DeferrableChildProcess +24Dec07: Added a SASL client for simple password authentication. +27Dec07: Removed the hookable error handler. No one was using it and it significantly + degraded performance. +30Dec07: Implemented Kqueue support for OSX and BSD. +04Jan08: Fixed bug in epoll ("Bad file descriptor"), patch supplied by Chris + Heath. +04Jan08: Fixed bug reported by Michael S. Fischer. We were terminating + SSL connections that sent data before the handshake was complete. +08Jan08: Added an OpenBSD branch for extconf.rb, contributed by Guillaume + Sellier. +19Jan08: Added EM::Connection::get_sockname per request by Michael Fischer. +19Jan08: Supported IPv6 addresses. +30Apr08: Set the NODELAY option on sockets that we connect to other servers. + Omission noted by Roger Pack. +14May08: Generated a 0.12 release. +15May08: Supported EM#get_sockname for acceptors (TCP server sockets). + Requested by Roger Pack. +15May08; Accepted a patch from Dan Aquino that allows the interval of a + PeriodicTimer to be changed on the fly. +15Jun08: Supported nested calls to EM#run. Many people contributed ideas to + this, notably raggi and tmm1. +20Jul08: Accepted patch from tmm1 for EM#fork_reactor. +28Jul08: Added a Postgres3 implementation, written by FCianfrocca. +14Aug08: Added a patch by Mike Murphy to support basic auth in the http +client. +28Aug08: Added a patch by tmm1 to fix a longstanding problem with Java +data-sends. +13Sep08: Added LineText2#set_binary_mode, a back-compatibility alias. +13Sep08: Modified the load order of protocol libraries in eventmachine.rb + to permit a modification of HeaderAndContentProtocol. +13Sep08: Modified HeaderAndContent to use LineText2, which is less buggy + than LineAndTextProtocol. This change may be reversed if we can fix + the bugs in buftok. +13Sep08: Improved the password handling in the Postgres protocol handler. +15Sep08: Added attach/detach, contributed by Aman Gupta (tmm1) and Riham Aldakkak, + to support working with file descriptors not created in the reactor. +16Sep08: Added an optional version string to the HTTP client. This is a hack + that allows a client to specify a version 1.0 request, which + keeps the server from sending a chunked response. The right way to + solve this, of course, is to support chunked responses. +23Sep08: ChangeLog Summary for Merge of branches/raggi +Most notable work and patches by Aman Gupta, Roger Pack, and James Tucker. +Patches / Tickets also submitted by: Jeremy Evans, aanand, darix, mmmurf, +danielaquino, macournoyer. + - Moved docs into docs/ dir + - Major refactor of rakefile, added generic rakefile helpers in tasks + - Added example CPP build rakefile in tasks/cpp.rake + - Moved rake tests out to tasks/tests.rake + - Added svn ignores where appropriate + - Fixed jruby build on older java platforms + - Gem now builds from Rakefile rather than directly via extconf + - Gem unified for jruby, C++ and pure ruby. + - Correction for pure C++ build, removing ruby dependency + - Fix for CYGWIN builds on ipv6 + - Major refactor for extconf.rb + - Working mingw builds + - extconf optionally uses pkg_config over manual configuration + - extconf builds for 1.9 on any system that has 1.9 + - extconf no longer links pthread explicitly + - looks for kqueue on all *nix systems + - better error output on std::runtime_error, now says where it came from + - Fixed some tests on jruby + - Added test for general send_data flaw, required for a bugfix in jruby build + - Added timeout to epoll tests + - Added fixes for java reactor ruby api + - Small addition of some docs in httpclient.rb and httpcli2.rb + - Some refactor and fixes in smtpserver.rb + - Added parenthesis where possible to avoid excess ruby warnings + - Refactor of $eventmachine_library logic for accuracy and maintenance, jruby + - EM::start_server now supports unix sockets + - EM::connect now supports unix sockets + - EM::defer @threadqueue now handled more gracefully + - Added better messages on exceptions raised + - Fix edge case in timer fires + - Explicitly require buftok.rb + - Add protocols to autoload, rather than require them all immediately + - Fix a bug in pr_eventmachine for outbound_q + - Refactors to take some of the use of defer out of tests. + - Fixes in EM.defer under start/stop conditions. Reduced scope of threads. +23Sep08: Added patch from tmm1 to avoid popen errors on exit. +30Sep08: Added File.exists? checks in the args for start_tls, as suggested by + Brian Lopez (brianmario). +10Nov08: ruby 1.9 compatibility enhancements +28Nov08: Allow for older ruby builds where RARRAY_LEN is not defined +03Dec08: allow passing arguments to popen handlers +13Jan09: SSL support for httpclient2 (David Smalley) +22Jan09: Fixed errors on OSX with the kqueue reactor, fixed errors in the pure + ruby reactor. Added EM.current_time. Added EM.epoll? and EM.kqueue? +27Jan09: Reactor errors are now raised as ruby RuntimeErrors. +28Jan09: Documentation patch from alloy +29Jan09: (Late sign-off) Use a longer timeout for connect_server (Ilya + Grigorik) +07Feb09: Fix signal handling issues with threads+epoll +07Feb09: Use rb_thread_schedule in the epoll reactor +07Feb09: Use TRAP_BEG/END and rb_thread_schedule in kqueue reactor +08Feb09: Added fastfilereader from swiftiply +08Feb09: 1.9 fix for rb_trap_immediate +08Feb09: Enable rb_thread_blocking_region for 1.9.0 and 1.9.1 +10Feb09: Support win32 builds for fastfilereader +10Feb09: Added a new event to indicate completion of SSL handshake on TCP + connections +10Feb09: Working get_peer_cert method. Returns the certificate as a Ruby + String in PEM format. (Jake Douglas) +10Feb09: Added EM.get_max_timers +11Feb09: Fix compile options for sun compiler (Alasdairrr) +11Feb09: get_status returns a Process::Status object +12Feb09: Add EM::Protocols::Memcache with simple get/set functionality +19Feb09: Add catch-all EM.error_handler +20Feb09: Support miniunit (1.9) +20Feb09: Return success on content-length = 0 instead of start waiting forever + (Ugo Riboni) +25Feb09: Allow next_tick to be used to pre-schedule reactor operations before + EM.run +26Feb09: Added EM.get_connection_count +01Mar09: Switch back to extconf for compiling gem extensions +01Mar09: fixed a small bug with basic auth (mmmurf) diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/DEFERRABLES b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/DEFERRABLES new file mode 100644 index 000000000000..6e8856cc5799 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/DEFERRABLES @@ -0,0 +1,246 @@ +EventMachine (EM) adds two different formalisms for lightweight concurrency +to the Ruby programmer's toolbox: spawned processes and deferrables. This +note will show you how to use deferrables. For more information, see the +separate document LIGHTWEIGHT_CONCURRENCY. + +=== What are Deferrables? + +EventMachine's Deferrable borrows heavily from the "deferred" object in +Python's "Twisted" event-handling framework. Here's a minimal example that +illustrates Deferrable: + + require 'eventmachine' + + class MyClass + include EM::Deferrable + + def print_value x + puts "MyClass instance received #{x}" + end + end + + EM.run { + df = MyClass.new + df.callback {|x| + df.print_value(x) + EM.stop + } + + EM::Timer.new(2) { + df.set_deferred_status :succeeded, 100 + } + } + + +This program will spin for two seconds, print out the string "MyClass +instance received 100" and then exit. The Deferrable pattern relies on +an unusual metaphor that may be unfamiliar to you, unless you've used +Python's Twisted. You may need to read the following material through +more than once before you get the idea. + +EventMachine::Deferrable is simply a Ruby Module that you can include +in your own classes. (There also is a class named +EventMachine::DefaultDeferrable for when you want to create one without +including it in code of your own.) + +An object that includes EventMachine::Deferrable is like any other Ruby +object: it can be created whenever you want, returned from your functions, +or passed as an argument to other functions. + +The Deferrable pattern allows you to specify any number of Ruby code +blocks (callbacks or errbacks) that will be executed at some future time +when the status of the Deferrable object changes. + +How might that be useful? Well, imagine that you're implementing an HTTP +server, but you need to make a call to some other server in order to fulfill +a client request. + +When you receive a request from one of your clients, you can create and +return a Deferrable object. Some other section of your program can add a +callback to the Deferrable that will cause the client's request to be +fulfilled. Simultaneously, you initiate an event-driven or threaded client +request to some different server. And then your EM program will continue to +process other events and service other client requests. + +When your client request to the other server completes some time later, you +will call the #set_deferred_status method on the Deferrable object, passing +either a success or failure status, and an arbitrary number of parameters +(which might include the data you received from the other server). + +At that point, the status of the Deferrable object becomes known, and its +callback or errback methods are immediately executed. Callbacks and errbacks +are code blocks that are attached to Deferrable objects at any time through +the methods #callback and #errback. + +The deep beauty of this pattern is that it decouples the disposition of one +operation (such as a client request to an outboard server) from the +subsequent operations that depend on that disposition (which may include +responding to a different client or any other operation). + +The code which invokes the deferred operation (that will eventually result +in a success or failure status together with associated data) is completely +separate from the code which depends on that status and data. This achieves +one of the primary goals for which threading is typically used in +sophisticated applications, with none of the nondeterminacy or debugging +difficulties of threads. + +As soon as the deferred status of a Deferrable becomes known by way of a call +to #set_deferred_status, the Deferrable will IMMEDIATELY execute all of its +callbacks or errbacks in the order in which they were added to the Deferrable. + +Callbacks and errbacks can be added to a Deferrable object at any time, not +just when the object is created. They can even be added after the status of +the object has been determined! (In this case, they will be executed +immediately when they are added.) + +A call to Deferrable#set_deferred_status takes :succeeded or :failed as its +first argument. (This determines whether the object will call its callbacks +or its errbacks.) #set_deferred_status also takes zero or more additional +parameters, that will in turn be passed as parameters to the callbacks or +errbacks. + +In general, you can only call #set_deferred_status ONCE on a Deferrable +object. A call to #set_deferred_status will not return until all of the +associated callbacks or errbacks have been called. If you add callbacks or +errbacks AFTER making a call to #set_deferred_status, those additional +callbacks or errbacks will execute IMMEDIATELY. Any given callback or +errback will be executed AT MOST once. + +It's possible to call #set_deferred_status AGAIN, during the execution a +callback or errback. This makes it possible to change the parameters which +will be sent to the callbacks or errbacks farther down the chain, enabling +some extremely elegant use-cases. You can transform the data returned from +a deferred operation in arbitrary ways as needed by subsequent users, without +changing any of the code that generated the original data. + +A call to #set_deferred_status will not return until all of the associated +callbacks or errbacks have been called. If you add callbacks or errbacks +AFTER making a call to #set_deferred_status, those additional callbacks or +errbacks will execute IMMEDIATELY. + +Let's look at some more sample code. It turns out that many of the internal +protocol implementations in the EventMachine package rely on Deferrable. One +of these is EM::Protocols::HttpClient. + +To make an evented HTTP request, use the module function +EM::Protocols::HttpClient#request, which returns a Deferrable object. +Here's how: + + require 'eventmachine' + + EM.run { + df = EM::Protocols::HttpClient.request( :host=>"www.example.com", + :request=>"/index.html" ) + + df.callback {|response| + puts "Succeeded: #{response[:content]}" + EM.stop + } + + df.errback {|response| + puts "ERROR: #{response[:status]}" + EM.stop + } + } + +(See the documentation of EventMachine::Protocols::HttpClient for information +on the object returned by #request.) + +In this code, we make a call to HttpClient#request, which immediately returns +a Deferrable object. In the background, an HTTP client request is being made +to www.example.com, although your code will continue to run concurrently. + +At some future point, the HTTP client request will complete, and the code in +EM::Protocols::HttpClient will process either a valid HTTP response (including +returned content), or an error. + +At that point, EM::Protocols::HttpClient will call +EM::Deferrable#set_deferred_status on the Deferrable object that was returned +to your program, as the return value from EM::Protocols::HttpClient.request. +You don't have to do anything to make this happen. All you have to do is tell +the Deferrable what to do in case of either success, failure, or both. + +In our code sample, we set one callback and one errback. The former will be +called if the HTTP call succeeds, and the latter if it fails. (For +simplicity, we have both of them calling EM#stop to end the program, although +real programs would be very unlikely to do this.) + +Setting callbacks and errbacks is optional. They are handlers to defined +events in the lifecycle of the Deferrable event. It's not an error if you +fail to set either a callback, an errback, or both. But of course your +program will then fail to receive those notifications. + +If through some bug it turns out that #set_deferred_status is never called +on a Deferrable object, then that object's callbacks or errbacks will NEVER +be called. It's also possible to set a timeout on a Deferrable. If the +timeout elapses before any other call to #set_deferred_status, the Deferrable +object will behave as is you had called set_deferred_status(:failed) on it. + + +Now let's modify the example to illustrate some additional points: + + require 'eventmachine' + + EM.run { + df = EM::Protocols::HttpClient.request( :host=>"www.example.com", + :request=>"/index.html" ) + + df.callback {|response| + df.set_deferred_status :succeeded, response[:content] + } + + df.callback {|string| + puts "Succeeded: #{string}" + EM.stop + } + + df.errback {|response| + puts "ERROR: #{response[:status]}" + EM.stop + } + } + + +Just for the sake of illustration, we've now set two callbacks instead of +one. If the deferrable operation (the HTTP client-request) succeeds, then +both of the callbacks will be executed in order. + +But notice that we've also made our own call to #set_deferred_status in the +first callback. This isn't required, because the HttpClient implementation +already made a call to #set_deferred_status. (Otherwise, of course, the +callback would not be executing.) + +But we used #set_deferred_status in the first callback in order to change the +parameters that will be sent to subsequent callbacks in the chain. In this +way, you can construct powerful sequences of layered functionality. If you +want, you can even change the status of the Deferrable from :succeeded to +:failed, which would abort the chain of callback calls, and invoke the chain +of errbacks instead. + +Now of course it's somewhat trivial to define two callbacks in the same +method, even with the parameter-changing effect we just described. It would +be much more interesting to pass the Deferrable to some other function (for +example, a function defined in another module or a different gem), that would +in turn add callbacks and/or errbacks of its own. That would illustrate the +true power of the Deferrable pattern: to isolate the HTTP client-request +from other functions that use the data that it returns without caring where +those data came from. + +Remember that you can add a callback or an errback to a Deferrable at any +point in time, regardless of whether the status of the deferred operation is +known (more precisely, regardless of when #set_deferred_status is called on +the object). Even hours or days later. + +When you add a callback or errback to a Deferrable object on which +#set_deferred_status has not yet been called, the callback/errback is queued +up for future execution, inside the Deferrable object. When you add a +callback or errback to a Deferrable on which #set_deferred_status has +already been called, the callback/errback will be executed immediately. +Your code doesn't have to worry about the ordering, and there are no timing +issues, as there would be with a threaded approach. + +For more information on Deferrables and their typical usage patterns, look +in the EM unit tests. There are also quite a few sugarings (including +EM::Deferrable#future) that make typical Deferrable usages syntactically +easier to work with. + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/EPOLL b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/EPOLL new file mode 100644 index 000000000000..13cea8f41a39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/EPOLL @@ -0,0 +1,141 @@ +EventMachine now supports epoll, bringing large increases in performance and scalability to Ruby programs. + +Epoll(7) is a alternative mechanism for multiplexed I/O that is available in Linux 2.6 kernels. +It features significantly greater performance than the standard select(2) mechanism, when used in +applications that require very large numbers of open I/O descriptors. + +EventMachine has always used select(2) because its behavior is well standardized and broadly supported. +But select becomes unreasonably slow when a program has a +very large number of file descriptors or sockets. Ruby's version of select hardcodes a limit +of 1024 descriptors per process, but heavily loaded processes will start to show performance +degradation even after only a few hundred descriptors are in use. + +Epoll is an extended version of the poll(2) call, and it solves the problems with select. Programs +based on epoll can easily scale past Ruby's 1024-descriptor limit, potentially to tens of thousands +of connectors, with no significant impact on performance. + +(Another alternative which is very similar to epoll in principle is kqueue, supplied on BSD and its +variants.) + + + +This note shows you how to use epoll in your programs. + +=== Compiling EventMachine to use epoll. + +You don't have to do anything to get epoll support in EventMachine. +When you compile EventMachine on a platform that supports epoll, EM will +automatically generate a Makefile that includes epoll. (At this writing, this will only work +on Linux 2.6 kernels.) If you compile EM on a platform without epoll, then epoll support will +be omitted from the Makefile, and EM will work just as it always has. + +=== Using epoll in your programs. + +First, you need to tell EventMachine to use epoll instead of select (but see below, as this requirement +will be removed in a future EventMachine version). Second, you need to prepare your program to use +more than 1024 descriptors, an operation that generally requires superuser privileges. Third, you will probably +want your process to drop the superuser privileges after you increase your process's descriptor limit. + +=== Using EventMachine#epoll + +Call the method EventMachine#epoll anytime before you call EventMachine#run, and your program will +automatically use epoll, if available. It's safe to call EventMachine#epoll on any platform because +it compiles to a no-op on platforms that don't support epoll. + + require 'rubygems' + require 'eventmachine' + + EM.epoll + EM.run { + ... + } + + +EventMachine#epoll was included in this initial release only to avoid changing the behavior of existing +programs. However, it's expected that a future release of EM will convert EventMachine#epoll to a no-op, +and run epoll by default on platforms that support it. + +=== Using EventMachine#set_descriptor_table_size + +In Linux (as in every Unix-like platform), every process has a internal table that determines the maximum +number of file and socket descriptors you may have open at any given time. The size of this table is +generally fixed at 1024, although it may be increased within certain system-defined hard and soft limits. + +If you want your EventMachine program to support more than 1024 total descriptors, you must use +EventMachine#set_descriptor_table_size, as follows: + + require 'rubygems' + require 'eventmachine' + + new_size = EM.set_descriptor_table_size( 60000 ) + $>.puts "New descriptor-table size is #{new_size}" + + EM.run { + ... + } + +If successful, this example will increase the maximum number of descriptors that epoll can use to 60,000. +Call EventMachine#set_descriptor_table_size without an argument at any time to find out the current +size of the descriptor table. + +Using EventMachine#set_descriptor_table_size ONLY affects the number of descriptors that can be used +by epoll. It has no useful effect on platforms that don't support epoll, and it does NOT increase the +number of descriptors that Ruby's own I/O functions can use. + +#set_descriptor_table_size can fail if your process is not running as superuser, or if you try to set a +table size that exceeds the hard limits imposed by your system. In the latter case, try a smaller number. + + +=== Using EventMachine#set_effective_user + +In general, you must run your program with elevated or superuser privileges if you want to increase +your descriptor-table size beyond 1024 descriptors. This is easy enough to verify. Try running the +sample program given above, that increases the descriptor limit to 60,000. You will probably find that +the table size will not be increased if you don't run your program as root or with elevated privileges. + +But of course network servers, especially long-running ones, should not run with elevated privileges. +You will want to drop superuser privileges as soon as possible after initialization. To do this, +use EventMachine#set_effective_user: + + require 'rubygems' + require 'eventmachine' + + # (Here, program is running as superuser) + + EM.set_descriptor_table_size( 60000 ) + EM.set_effective_user( "nobody" ) + # (Here, program is running as nobody) + + EM.run { + ... + } + +Of course, you will need to replace "nobody" in the example with the name of an unprivileged user +that is valid on your system. What if you want to drop privileges after opening a server socket +on a privileged (low-numbered) port? Easy, just call #set_effective_user after opening your sockets: + + require 'rubygems' + require 'eventmachine' + + # (Here, program is running as superuser) + + EM.set_descriptor_table_size( 60000 ) + + EM.run { + EM.start_server( "0.0.0.0", 80, MyHttpServer ) + EM.start_server( "0.0.0.0", 443, MyEncryptedHttpServer ) + + EM.set_effective_user( "nobody" ) + # (Here, program is running as nobody) + + ... + } + + +Because EventMachine#set_effective_user is used to enforce security +requirements, it has no nonfatal errors. If you try to set a nonexistent or invalid effective user, +#set_effective_user will abort your program, rather than continue to run with elevated privileges. + +EventMachine#set_effective_user is a silent no-op on platforms that don't support it, such as Windows. + + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/INSTALL b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/INSTALL new file mode 100644 index 000000000000..dee2e4294cdb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/INSTALL @@ -0,0 +1,13 @@ +If you have obtained an EventMachine source-tarball (.tar.gz): +unzip and untar the tarball, and enter the directory that is +created. In that directory, say: +ruby setup.rb +(You may need to be root to execute this command.) + +To create documentation for EventMachine, simply type: +rake rdoc +in the distro directory. Rdocs will be created in subdirectory rdoc. + +If you have obtained a gem version of EventMachine, install it in the +usual way (gem install eventmachine). You may need superuser privileges +to execute this command. diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/KEYBOARD b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/KEYBOARD new file mode 100644 index 000000000000..6c699e498f8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/KEYBOARD @@ -0,0 +1,42 @@ +EventMachine (EM) can respond to keyboard events. This gives your event-driven +programs the ability to respond to input from local users. + +Programming EM to handle keyboard input in Ruby is simplicity itself. Just use +EventMachine#open_keyboard, and supply the name of a Ruby module or class that +will receive the input: + + require 'rubygems' + require 'eventmachine' + + module MyKeyboardHandler + def receive_data keystrokes + puts "I received the following data from the keyboard: #{keystrokes}" + end + end + + EM.run { + EM.open_keyboard(MyKeyboardHandler) + } + +If you want EM to send line-buffered keyboard input to your program, just +include the LineText2 protocol module in your handler class or module: + + require 'rubygems' + require 'eventmachine' + + module MyKeyboardHandler + include EM::Protocols::LineText2 + def receive_line data + puts "I received the following line from the keyboard: #{data}" + end + end + + EM.run { + EM.open_keyboard(MyKeyboardHandler) + } + +As we said, simplicity itself. You can call EventMachine#open_keyboard at any +time while the EM reactor loop is running. In other words, the method +invocation may appear anywhere in an EventMachine#run block, or in any code +invoked in the #run block. + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/LEGAL b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/LEGAL new file mode 100644 index 000000000000..ee018255d78b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/LEGAL @@ -0,0 +1,25 @@ +LEGAL NOTICE INFORMATION +------------------------ + +EventMachine is Copyright (C) 2006-07 by Francis Cianfrocca. + +EventMachine is copyrighted software owned by Francis Cianfrocca +(blackhedd ... gmail.com). You may redistribute and/or modify this +software as long as you comply with either the terms of the GPL +(see the file GPL), or Ruby's license (see the file COPYING). + +Your use of all the files in this distribution is controlled by these +license terms, except for those files specifically mentioned below: + + + +setup.rb + This file is Copyright (C) 2000-2005 by Minero Aoki + You can distribute/modify this file under the terms of + the GNU LGPL, Lesser General Public License version 2.1. + + +lib/em/buftok.rb + This file is Copyright (C) 2007 by Tony Arcieri. This file is + covered by the terms of Ruby's License (see the file COPYING). + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/LIGHTWEIGHT_CONCURRENCY b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/LIGHTWEIGHT_CONCURRENCY new file mode 100644 index 000000000000..3c2cfa03954b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/LIGHTWEIGHT_CONCURRENCY @@ -0,0 +1,130 @@ +EventMachine (EM) adds two different formalisms for lightweight concurrency to +the Ruby programmer's toolbox: spawned processes and deferrables. This note +will show you how to use them. + + +=== What is Lightweight Concurrency? + +We use the term "Lightweight Concurrency" (LC) to refer to concurrency +mechanisms that are lighter than Ruby threads. By "lighter," we mean: less +resource-intensive in one or more dimensions, usually including memory and +CPU usage. In general, you turn to LC in the hope of improving the +performance and scalability of your programs. + +In addition to the two EventMachine mechanisms we will discuss here, Ruby +has at least one other LC construct: Fibers, which are currently under +development in Ruby 1.9. + +The technical feature that makes all of these LC mechanisms different from +standard Ruby threads is that they are not scheduled automatically. + +When you create and run Ruby threads, you can assume (within certain +constraints) that your threads will all be scheduled fairly by Ruby's runtime. +Ruby itself is responsible for giving each of your threads its own share of +the total runtime. + +But with LC, your program is responsible for causing different execution +paths to run. In effect, your program has to act as a "thread scheduler." +Scheduled entities in LC run to completion and are never preempted. The +runtime system has far less work to do since it has no need to interrupt +threads or to schedule them fairly. This is what makes LC lighter and faster. + +You'll learn exactly how LC scheduling works in practice as we work through +specific examples. + + +=== EventMachine Lightweight Concurrency + +Recall that EM provides a reactor loop that must be running in order for +your programs to perform event-driven logic. An EM program typically has a +structure like this: + + require 'eventmachine' + + # your initializations + + EM.run { + # perform event-driven I/O here, including network clients, + # servers, timers, and thread-pool operations. + } + + # your cleanup + # end of the program + + +EventMachine#run executes the reactor loop, which causes your code to be +called as events of interest to your program occur. The block you pass to +EventMachine#run is executed right after the reactor loop starts, and is +the right place to start socket acceptors, etc. + +Because the reactor loop runs constantly in an EM program (until it is +stopped by a call to EventMachine#stop), it has the ability to schedule +blocks of code for asynchronous execution. Unlike a pre-emptive thread +scheduler, it's NOT able to interrupt code blocks while they execute. But +the scheduling capability it does have is enough to enable lightweight +concurrency. + + +For information on Spawned Processes, see the separate document +SPAWNED_PROCESSES. + +For information on Deferrables, see the separate document DEFERRABLES. + + +=== [SIDEBAR]: I Heard That EventMachine Doesn't Work With Ruby Threads. + +This is incorrect. EM is fully interoperable with all versions of Ruby +threads, and has been since its earliest releases. + +It's very true that EM encourages an "evented" (non-threaded) programming +style. The specific benefits of event-driven programming are far better +performance and scalability for well-written programs, and far easier +debugging. + +The benefit of using threads for similar applications is a possibly more +intuitive programming model, as well as the fact that threads are already +familiar to most programmers. Also, bugs in threaded programs often fail +to show up until programs go into production. These factors create the +illusion that threaded programs are easier to write. + +However, some operations that occur frequently in professional-caliber +applications simply can't be done without threads. (The classic example +is making calls to database client-libraries that block on network I/O +until they complete.) + +EventMachine not only allows the use of Ruby threads in these cases, but +it even provides a built-in thread-pool object to make them easier to +work with. + +You may have heard a persistent criticism that evented I/O is fundamentally +incompatible with Ruby threads. It is true that some well-publicized attempts +to incorporate event-handling libraries into Ruby were not successful. But +EventMachine was designed from the ground up with Ruby compatibility in mind, +so EM never suffered from the problems that defeated the earlier attempts. + + +=== [SIDEBAR]: I Heard That EventMachine Doesn't Work Very Well On Windows. + +This too is incorrect. EventMachine is an extension written in C++ and Java, +and therefore it requires compilation. Many Windows computers (and some Unix +computers, especially in production environments) don't have a build stack. +Attempting to install EventMachine on a machine without a compiler usually +produces a confusing error. + +In addition, Ruby has a much-debated issue with Windows compiler versions. +Ruby on Windows works best with Visual Studio 6, a compiler version that is +long out-of-print, no longer supported by Microsoft, and difficult to obtain. +(This problem is not specific to EventMachine.) + +Shortly after EventMachine was first released, the compiler issues led to +criticism that EM was incompatible with Windows. Since that time, every +EventMachine release has been supplied in a precompiled binary form for +Windows users, that does not require you to compile the code yourself. EM +binary Gems for Windows are compiled using Visual Studio 6. + +EventMachine does supply some advanced features (such as Linux EPOLL support, +reduced-privilege operation, UNIX-domain sockets, etc.) that have no +meaningful implementation on Windows. Apart from these special cases, all EM +functionality (including lightweight concurrency) works perfectly well on +Windows. + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/PURE_RUBY b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/PURE_RUBY new file mode 100644 index 000000000000..157d59ebb0f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/PURE_RUBY @@ -0,0 +1,75 @@ +EventMachine is supplied in three alternative versions. + +1) A version that includes a Ruby extension written in C++. This version requires compilation; +2) A version for JRuby that contains a precompiled JAR file written in Java; +3) A pure Ruby version that has no external dependencies and can run in any Ruby environment. + +The Java version of EventMachine is packaged in a distinct manner and must be installed using a +special procedure. This version is described fully in a different document, and not considered +further here. + +The C++ and pure-Ruby versions, however, are shipped in the same distribution. You use the same +files (either tarball or Ruby gem) to install both of these versions. + +If you intend to use the C++ version, you must successfully compile EventMachine after you install it. +(The gem installation attempts to perform this step automatically.) + +If you choose not to compile the EventMachine C++ extension, or if your compilation fails for any +reason, you still have a fully-functional installation of the pure-Ruby version of EM. + +However, for technical reasons, a default EM installation (whether or not the compilation succeeds) +will always assume that the compiled ("extension") implementation should be used. + +If you want your EM program to use the pure Ruby version, you must specifically request it. There +are two ways to do this: by setting either a Ruby global variable, or an environment string. + +The following code will invoke the pure-Ruby implementation of EM: + + $eventmachine_library = :pure_ruby + require 'eventmachine' + + EM.library_type #=> "pure_ruby" + +Notice that this requires a code change and is not the preferred way to select pure Ruby, unless +for some reason you are absolutely sure you will never want the compiled implementation. + +Setting the following environment string has the same effect: + + export EVENTMACHINE_LIBRARY="pure_ruby" + +This technique gives you the flexibility to select either version at runtime with no code changes. + +Support + +The EventMachine development team has committed to support precisely the same APIs for all the +various implementations of EM. + +This means that you can expect any EM program to behave identically, whether you use pure Ruby, +the compiled C++ extension, or JRuby. Deviations from this behavior are to be considered bugs +and should be reported as such. + +There is a small number of exceptions to this rule, which arise from underlying platform +distinctions. Notably, EM#epoll is a silent no-op in the pure Ruby implementation. + + +When Should You Use the Pure-Ruby Implementation of EM? + + +Use the pure Ruby implementation of EM when you must support a platform for which no C++ compiler +is available, or on which the standard EM C++ code can't be compiled. + +Keep in mind that you don't need a C++ compiler in order to deploy EM applications that rely on +the compiled version, so long as appropriate C++ runtime libraries are available on the target platform. + +In extreme cases, you may find that you can develop software with the compiled EM version, but are +not allowed to install required runtime libraries on the deployment system(s). This would be another +case in which the pure Ruby implementation can be useful. + +In general you should avoid the pure Ruby version of EM when performance and scalability are important. +EM in pure Ruby will necessarily run slower than the compiled version. Depending on your application +this may or may not be a key issue. + +Also, since EPOLL is not supported in pure Ruby, your applications will be affected by Ruby's built-in +limit of 1024 file and socket descriptors that may be open in a single process. For maximum scalability +and performance, always use EPOLL if possible. + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/RELEASE_NOTES b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/RELEASE_NOTES new file mode 100644 index 000000000000..6110820ac384 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/RELEASE_NOTES @@ -0,0 +1,94 @@ +RUBY/EventMachine RELEASE NOTES + +-------------------------------------------------- +Version: 0.9.0, released xxXXX07 +Added Erlang-like distributed-computing features + +-------------------------------------------------- +Version: 0.8.0, released 23Jun07 +Added an epoll implementation for Linux 2.6 kernels. +Added evented #popen. + +-------------------------------------------------- +Version: 0.7.3, released 22May07 +Added a large variety of small features. See the ChangeLog. + +-------------------------------------------------- +Version: 0.7.1, released xxNov06 +Added protocol handlers for line-oriented protocols. +Various bug fixes. + +-------------------------------------------------- +Version: 0.7.0, released 20Nov06 +Added a fix in em.cpp/ConnectToServer to fix a fatal exception that +occurred in FreeBSD when connecting successfully to a remote server. + +-------------------------------------------------- +Version: 0.6.0, released xxJul06 +Added deferred operations, suggested by Don Stocks, amillionhitpoints@yahoo.com. + +-------------------------------------------------- +Version: 0.5.4, released xxJun06 +Added get_peername support for streams and datagrams. + +-------------------------------------------------- +Version: 0.5.3, released 17May06 +Fixed bugs in extconf.rb, thanks to Daniel Harple, dharple@generalconsumption.org. +Added proper setup.rb and rake tasks, thanks to Austin Ziegler. +Fixed a handful of reported problems with builds on various platforms. + +-------------------------------------------------- +Version: 0.5.2, released 05May06 +Made several nonvisible improvements to the Windows +implementation. +Added an exception-handling patch contributed by Jeff Rose, jeff@rosejn.net. +Added a dir-config patch contributed anonymously. +Supported builds on Solaris. + +-------------------------------------------------- +Version: 0.5.1, released 05May06 +Made it possible to pass a Class rather than a Module +to a protocol handler. +Added Windows port. + +-------------------------------------------------- +Version: 0.5.0, released 30Apr06 +Added a preliminary SSL/TLS extension. This will probably +change over the next few releases. + +-------------------------------------------------- +Version: 0.4.5, released 29Apr06 +Changed ext files so the ruby.h is installed after unistd.h +otherwise it doesn't compile on gcc 4.1 + +-------------------------------------------------- +Version: 0.4.2, released 19Apr06 +Changed the Ruby-glue so the extension will play nicer +in the sandbox with Ruby threads. +Added an EventMachine::run_without_threads API to +switch off the thread-awareness for better performance +in programs that do not spin any Ruby threads. + +-------------------------------------------------- +Version: 0.4.1, released 15Apr06 +Reworked the shared-object interface to make it easier to +use EventMachine from languages other than Ruby. + +-------------------------------------------------- +Version: 0.3.2, released 12Apr06 +Added support for a user-supplied block in EventMachine#connect. + +-------------------------------------------------- +Version: 0.3.1, released 11Apr06 +Fixed bug that prevented EventMachine from being run multiple +times in a single process. + +-------------------------------------------------- +Version: 0.3.0, released 10Apr06 +Added method EventHandler::Connection::post_init + +-------------------------------------------------- +Version: 0.2.0, released 10Apr06 +Added method EventHandler::stop + + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/SMTP b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/SMTP new file mode 100644 index 000000000000..92bf3110e43d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/SMTP @@ -0,0 +1,4 @@ +This note details the usage of EventMachine's built-in support for SMTP. EM +supports both client and server connections, which will be described in +separate sections. + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/SPAWNED_PROCESSES b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/SPAWNED_PROCESSES new file mode 100644 index 000000000000..ee68e3e85db7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/SPAWNED_PROCESSES @@ -0,0 +1,148 @@ +EventMachine (EM) adds two different formalisms for lightweight concurrency +to the Ruby programmer's toolbox: spawned processes and deferrables. This +note will show you how to use spawned processes. For more information, see +the separate document LIGHTWEIGHT_CONCURRENCY. + + +=== What are Spawned Processes? + +Spawned Processes in EventMachine are inspired directly by the "processes" +found in the Erlang programming language. EM deliberately borrows much (but +not all) of Erlang's terminology. However, EM's spawned processes differ from +Erlang's in ways that reflect not only Ruby style, but also the fact that +Ruby is not a functional language like Erlang. + +Let's proceed with a complete, working code sample that we will analyze line +by line. Here's an EM implementation of the "ping-pong" program that also +appears in the Erlang tutorial: + + + require 'eventmachine' + + EM.run { + pong = EM.spawn {|x, ping| + puts "Pong received #{x}" + ping.notify( x-1 ) + } + + ping = EM.spawn {|x| + if x > 0 + puts "Pinging #{x}" + pong.notify x, self + else + EM.stop + end + } + + ping.notify 3 + } + +If you run this program, you'll see the following output: + + Pinging 3 + Pong received 3 + Pinging 2 + Pong received 2 + Pinging 1 + Pong received 1 + +Let's take it step by step. + +EventMachine#spawn works very much like the built-in function spawn in +Erlang. It returns a reference to a Ruby object of class +EventMachine::SpawnedProcess, which is actually a schedulable entity. In +Erlang, the value returned from spawn is called a "process identifier" or +"pid." But we'll refer to the Ruby object returned from EM#spawn simply as a +"spawned process." + +You pass a Ruby block with zero or more parameters to EventMachine#spawn. +Like all Ruby blocks, this one is a closure, so it can refer to variables +defined in the local context when you call EM#spawn. + +However, the code block passed to EM#spawn does NOT execute immediately by +default. Rather, it will execute only when the Spawned Object is "notified." +In Erlang, this process is called "message passing," and is done with the +operator !, but in Ruby it's done simply by calling the #notify method of a +spawned-process object. The parameters you pass to #notify must match those +defined in the block that was originally passed to EM#spawn. + +When you call the #notify method of a spawned-process object, EM's reactor +core will execute the code block originally passed to EM#spawn, at some point +in the future. (#notify itself merely adds a notification to the object's +message queue and ALWAYS returns immediately.) + +When a SpawnedProcess object executes a notification, it does so in the +context of the SpawnedProcess object itself. The notified code block can see +local context from the point at which EM#spawn was called. However, the value +of "self" inside the notified code block is a reference to the SpawnedProcesss +object itself. + +An EM spawned process is nothing more than a Ruby object with a message +queue attached to it. You can have any number of spawned processes in your +program without compromising scalability. You can notify a spawned process +any number of times, and each notification will cause a "message" to be +placed in the queue of the spawned process. Spawned processes with non-empty +message queues are scheduled for execution automatically by the EM reactor. +Spawned processes with no visible references are garbage-collected like any +other Ruby object. + +Back to our code sample: + + pong = EM.spawn {|x, ping| + puts "Pong received #{x}" + ping.notify( x-1 ) + } + +This simply creates a spawned process and assigns it to the local variable +pong. You can see that the spawned code block takes a numeric parameter and a +reference to another spawned process. When pong is notified, it expects to +receive arguments corresponding to these two parameters. It simply prints out +the number it receives as the first argument. Then it notifies the spawned +process referenced by the second argument, passing it the first argument +minus 1. + +And then the block ends, which is crucial because otherwise nothing else +can run. (Remember that in LC, scheduled entities run to completion and are +never preempted.) + +On to the next bit of the code sample: + + ping = EM.spawn {|x| + if x > 0 + puts "Pinging #{x}" + pong.notify x, self + else + EM.stop + end + } + +Here, we're spawning a process that takes a single (numeric) parameter. If +the parameter is greater than zero, the block writes it to the console. It +then notifies the spawned process referenced by the pong local variable, +passing as arguments its number argument, and a reference to itself. The +latter reference, as you saw above, is used by pong to send a return +notification. + +If the ping process receives a zero value, it will stop the reactor loop and +end the program. + +Now we've created a pair of spawned processes, but nothing else has happened. +If we stop now, the program will spin in the EM reactor loop, doing nothing +at all. Our spawned processes will never be scheduled for execution. + +But look at the next line in the code sample: + + ping.notify 3 + +This line gets the ping-pong ball rolling. We call ping's #notify method, +passing the argument 3. This causes a message to be sent to the ping spawned +process. The message contains the single argument, and it causes the EM +reactor to schedule the ping process. And this in turn results in the +execution of the Ruby code block passed to EM#spawn when ping was created. +Everything else proceeds as a result of the messages that are subsequently +passed to each other by the spawned processes. + +[TODO, present the outbound network i/o use case, and clarify that spawned +processes are interleaved with normal i/o operations and don't interfere +with them at all. Also, blame Erlang for the confusing term "process"] + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/TODO b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/TODO new file mode 100644 index 000000000000..686a0d53dce9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/docs/old/TODO @@ -0,0 +1,8 @@ +TODO List: + +12Aug06: Noticed by Don Stocks. A TCP connect-request that results +in a failed DNS resolution fires a fatal error back to user code. +Uuuuuugly. We should probably cause an unbind event to get fired +instead, and add some parameterization so the caller can detect +the nature of the failure. + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/01_eventmachine_echo_server.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/01_eventmachine_echo_server.rb new file mode 100644 index 000000000000..51c5c7db1324 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/01_eventmachine_echo_server.rb @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class EchoServer < EM::Connection + def receive_data(data) + send_data(data) + end +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, EchoServer) +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb new file mode 100644 index 000000000000..4cfff19b4174 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class EchoServer < EM::Connection + def receive_data(data) + if data.strip =~ /exit$/i + EventMachine.stop + else + send_data(data) + end + end +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, EchoServer) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/03_simple_chat_server.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/03_simple_chat_server.rb new file mode 100644 index 000000000000..3352551e0560 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/03_simple_chat_server.rb @@ -0,0 +1,149 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + DM_REGEXP = /^@([a-zA-Z0-9]+)\s*:?\s*(.+)/.freeze + + attr_reader :username + + + # + # EventMachine handlers + # + + def post_init + @username = nil + + puts "A client has connected..." + ask_username + end + + def unbind + @@connected_clients.delete(self) + puts "[info] #{@username} has left" if entered_username? + end + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + + # + # Username handling + # + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + + def handle_username(input) + if input.empty? + send_line("Blank usernames are not allowed. Try again.") + ask_username + else + @username = input + @@connected_clients.push(self) + self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") } + puts "#{@username} has joined" + + self.send_line("[info] Ohai, #{@username}") + end + end # handle_username(input) + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + + # + # Message handling + # + + def handle_chat_message(msg) + if command?(msg) + self.handle_command(msg) + else + if direct_message?(msg) + self.handle_direct_message(msg) + else + self.announce(msg, "#{@username}:") + end + end + end # handle_chat_message(msg) + + def direct_message?(input) + input =~ DM_REGEXP + end # direct_message?(input) + + def handle_direct_message(input) + username, message = parse_direct_message(input) + + if connection = @@connected_clients.find { |c| c.username == username } + puts "[dm] @#{@username} => @#{username}" + connection.send_line("[dm] @#{@username}: #{message}") + else + send_line "@#{username} is not in the room. Here's who is: #{usernames.join(', ')}" + end + end # handle_direct_message(input) + + def parse_direct_message(input) + return [$1, $2] if input =~ DM_REGEXP + end # parse_direct_message(input) + + + # + # Commands handling + # + + def command?(input) + input =~ /(exit|status)$/i + end # command?(input) + + def handle_command(cmd) + case cmd + when /exit$/i then self.close_connection + when /status$/i then self.send_line("[chat server] It's #{Time.now.strftime('%H:%M')} and there are #{self.number_of_connected_clients} people in the room") + end + end # handle_command(cmd) + + + # + # Helpers + # + + def announce(msg = nil, prefix = "[chat server]") + @@connected_clients.each { |c| c.send_line("#{prefix} #{msg}") } unless msg.empty? + end # announce(msg) + + def number_of_connected_clients + @@connected_clients.size + end # number_of_connected_clients + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) + + def usernames + @@connected_clients.map { |c| c.username } + end # usernames +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/04_simple_chat_server_step_one.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/04_simple_chat_server_step_one.rb new file mode 100644 index 000000000000..bb283a7a29f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/04_simple_chat_server_step_one.rb @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + # + # EventMachine handlers + # + + def post_init + puts "A client has connected..." + end + + def unbind + puts "A client has left..." + end +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/05_simple_chat_server_step_two.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/05_simple_chat_server_step_two.rb new file mode 100644 index 000000000000..1361c5da5d2e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/05_simple_chat_server_step_two.rb @@ -0,0 +1,43 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + + + # + # EventMachine handlers + # + + def post_init + @@connected_clients.push(self) + puts "A client has connected..." + end + + def unbind + @@connected_clients.delete(self) + puts "A client has left..." + end + + + + + # + # Helpers + # + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/06_simple_chat_server_step_three.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/06_simple_chat_server_step_three.rb new file mode 100644 index 000000000000..d9b85e215d81 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/06_simple_chat_server_step_three.rb @@ -0,0 +1,98 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + + + attr_reader :username + + + # + # EventMachine handlers + # + + def post_init + @username = nil + + puts "A client has connected..." + ask_username + end + + def unbind + @@connected_clients.delete(self) + puts "A client has left..." + end + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + + + + # + # Username handling + # + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + + def handle_username(input) + if input.empty? + send_line("Blank usernames are not allowed. Try again.") + ask_username + else + @username = input + @@connected_clients.push(self) + self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") } + puts "#{@username} has joined" + + self.send_line("[info] Ohai, #{@username}") + end + end # handle_username(input) + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + + + # + # Message handling + # + + def handle_chat_message(msg) + raise NotImplementedError + end + + + + # + # Helpers + # + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/07_simple_chat_server_step_four.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/07_simple_chat_server_step_four.rb new file mode 100644 index 000000000000..d4948af8d3d2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/07_simple_chat_server_step_four.rb @@ -0,0 +1,121 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + + + attr_reader :username + + + # + # EventMachine handlers + # + + def post_init + @username = nil + + puts "A client has connected..." + ask_username + end + + def unbind + @@connected_clients.delete(self) + puts "[info] #{@username} has left" if entered_username? + end + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + + + + # + # Username handling + # + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + + def handle_username(input) + if input.empty? + send_line("Blank usernames are not allowed. Try again.") + ask_username + else + @username = input + @@connected_clients.push(self) + self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") } + puts "#{@username} has joined" + + self.send_line("[info] Ohai, #{@username}") + end + end # handle_username(input) + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + + + # + # Message handling + # + + def handle_chat_message(msg) + if command?(msg) + self.handle_command(msg) + else + self.announce(msg, "#{@username}:") + end + end + + + # + # Commands handling + # + + def command?(input) + input =~ /exit$/i + end # command?(input) + + def handle_command(cmd) + case cmd + when /exit$/i then self.close_connection + end + end # handle_command(cmd) + + + + # + # Helpers + # + + def announce(msg = nil, prefix = "[chat server]") + @@connected_clients.each { |c| c.send_line("#{prefix} #{msg}") } unless msg.empty? + end # announce(msg) + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/08_simple_chat_server_step_five.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/08_simple_chat_server_step_five.rb new file mode 100644 index 000000000000..03da66bf7b08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/guides/getting_started/08_simple_chat_server_step_five.rb @@ -0,0 +1,141 @@ +#!/usr/bin/env ruby + +require 'rubygems' # or use Bundler.setup +require 'eventmachine' + +class SimpleChatServer < EM::Connection + + @@connected_clients = Array.new + DM_REGEXP = /^@([a-zA-Z0-9]+)\s*:?\s+(.+)/.freeze + + attr_reader :username + + + # + # EventMachine handlers + # + + def post_init + @username = nil + + puts "A client has connected..." + ask_username + end + + def unbind + @@connected_clients.delete(self) + puts "[info] #{@username} has left" if entered_username? + end + + def receive_data(data) + if entered_username? + handle_chat_message(data.strip) + else + handle_username(data.strip) + end + end + + + # + # Username handling + # + + def entered_username? + !@username.nil? && !@username.empty? + end # entered_username? + + def handle_username(input) + if input.empty? + send_line("Blank usernames are not allowed. Try again.") + ask_username + else + @username = input + @@connected_clients.push(self) + self.other_peers.each { |c| c.send_data("#{@username} has joined the room\n") } + puts "#{@username} has joined" + + self.send_line("[info] Ohai, #{@username}") + end + end # handle_username(input) + + def ask_username + self.send_line("[info] Enter your username:") + end # ask_username + + + # + # Message handling + # + + def handle_chat_message(msg) + if command?(msg) + self.handle_command(msg) + else + if direct_message?(msg) + self.handle_direct_message(msg) + else + self.announce(msg, "#{@username}:") + end + end + end # handle_chat_message(msg) + + def direct_message?(input) + input =~ DM_REGEXP + end # direct_message?(input) + + def handle_direct_message(input) + username, message = parse_direct_message(input) + + if connection = @@connected_clients.find { |c| c.username == username } + puts "[dm] @#{@username} => @#{username}" + connection.send_line("[dm] @#{@username}: #{message}") + else + send_line "@#{username} is not in the room. Here's who is: #{usernames.join(', ')}" + end + end # handle_direct_message(input) + + def parse_direct_message(input) + return [$1, $2] if input =~ DM_REGEXP + end # parse_direct_message(input) + + + # + # Commands handling + # + + def command?(input) + input =~ /(exit|status)$/i + end # command?(input) + + def handle_command(cmd) + case cmd + when /exit$/i then self.close_connection + when /status$/i then self.send_line("[chat server] It's #{Time.now.strftime('%H:%M')} and there are #{self.number_of_connected_clients} people in the room") + end + end # handle_command(cmd) + + + # + # Helpers + # + + def announce(msg = nil, prefix = "[chat server]") + @@connected_clients.each { |c| c.send_line("#{prefix} #{msg}") } unless msg.empty? + end # announce(msg) + + def other_peers + @@connected_clients.reject { |c| self == c } + end # other_peers + + def send_line(line) + self.send_data("#{line}\n") + end # send_line(line) +end + +EventMachine.run do + # hit Control + C to stop + Signal.trap("INT") { EventMachine.stop } + Signal.trap("TERM") { EventMachine.stop } + + EventMachine.start_server("0.0.0.0", 10000, SimpleChatServer) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_channel.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_channel.rb new file mode 100644 index 000000000000..16e8d083d75f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_channel.rb @@ -0,0 +1,43 @@ +require File.dirname(__FILE__) + '/helper' + +EM.run do + + # Create a channel to push data to, this could be stocks... + RandChannel = EM::Channel.new + + # The server simply subscribes client connections to the channel on connect, + # and unsubscribes them on disconnect. + class Server < EM::Connection + def self.start(host = '127.0.0.1', port = 8000) + EM.start_server(host, port, self) + end + + def post_init + @sid = RandChannel.subscribe { |m| send_data "#{m.inspect}\n" } + end + + def unbind + RandChannel.unsubscribe @sid + end + end + Server.start + + # Two client connections, that just print what they receive. + 2.times do + EM.connect('127.0.0.1', 8000) do |c| + c.extend EM::P::LineText2 + def c.receive_line(line) + puts "Subscriber: #{signature} got #{line}" + end + EM.add_timer(2) { c.close_connection } + end + end + + # This part of the example is more fake, but imagine sleep was in fact a + # long running calculation to achieve the value. + 40.times do + EM.defer lambda { v = sleep(rand * 2); RandChannel << [Time.now, v] } + end + + EM.add_timer(5) { EM.stop } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_queue.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_queue.rb new file mode 100644 index 000000000000..761ea76436b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_queue.rb @@ -0,0 +1,2 @@ +require File.dirname(__FILE__) + '/helper' + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_tick_loop_array.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_tick_loop_array.rb new file mode 100644 index 000000000000..81b0ae3e8d7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_tick_loop_array.rb @@ -0,0 +1,15 @@ +require File.dirname(__FILE__) + '/helper' + +EM.run do + array = (1..100).to_a + + tickloop = EM.tick_loop do + if array.empty? + :stop + else + puts array.shift + end + end + + tickloop.on_stop { EM.stop } +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_tick_loop_counter.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_tick_loop_counter.rb new file mode 100644 index 000000000000..58e51ffd637d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/ex_tick_loop_counter.rb @@ -0,0 +1,32 @@ +require File.dirname(__FILE__) + '/helper' + +class TickCounter + attr_reader :start_time, :count + + def initialize + reset + @tick_loop = EM.tick_loop(method(:tick)) + end + + def reset + @count = 0 + @start_time = EM.current_time + end + + def tick + @count += 1 + end + + def rate + @count / (EM.current_time - @start_time) + end +end + +period = 5 +EM.run do + counter = TickCounter.new + EM.add_periodic_timer(period) do + puts "Ticks per second: #{counter.rate} (mean of last #{period}s)" + counter.reset + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/helper.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/helper.rb new file mode 100644 index 000000000000..835ded27daf1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/examples/old/helper.rb @@ -0,0 +1,2 @@ +$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib') +require 'eventmachine' \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/.sitearchdir.time b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/.sitearchdir.time new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/Makefile b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/Makefile new file mode 100644 index 000000000000..ef8f8affa66a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/Makefile @@ -0,0 +1,263 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 +hdrdir = $(topdir) +arch_hdrdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/home/app/.rbenv/versions/2.5.1 +rubysitearchprefix = $(rubylibprefix)/$(sitearch) +rubyarchprefix = $(rubylibprefix)/$(arch) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) +sitearchhdrdir = $(sitehdrdir)/$(sitearch) +rubyarchhdrdir = $(rubyhdrdir)/$(arch) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(vendorlibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)./.gem.20211005-8-pof3oc +sitelibdir = $(DESTDIR)./.gem.20211005-8-pof3oc +sitedir = $(rubylibprefix)/site_ruby +rubyarchdir = $(rubylibdir)/$(arch) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +localstatedir = $(prefix)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(prefix)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC = gcc +CXX = g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = $(optflags) $(debugflags) $(warnflags) +optflags = -O3 +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) $(cflags) -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DHAVE_OPENSSL_SSL_H -DHAVE_OPENSSL_ERR_H -DWITH_SSL -DBUILD_FOR_RUBY -DHAVE_RB_THREAD_CALL_WITHOUT_GVL -DHAVE_RB_THREAD_FD_SELECT -DHAVE_TYPE_RB_FDSET_T -DHAVE_RB_WAIT_FOR_SINGLE_FD -DHAVE_RB_TIME_NEW -DHAVE_INOTIFY_INIT -DHAVE_INOTIFY -DHAVE_WRITEV -DHAVE_PIPE2 -DHAVE_ACCEPT4 -DHAVE_CONST_SOCK_CLOEXEC -DOS_UNIX -DHAVE_EPOLL_CREATE -DHAVE_EPOLL -DHAVE_CLOCK_GETTIME -DHAVE_CONST_CLOCK_MONOTONIC_RAW -DHAVE_CONST_CLOCK_MONOTONIC -DHAVE_MAKE_PAIR -I/home/app/.rbenv/versions/2.5.1/include $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) $(cxxflags) $(ARCH_FLAG) +ldflags = -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic +dldflags = -L/home/app/.rbenv/versions/2.5.1/lib -Wl,--compress-debug-sections=zlib +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CXX) -shared +LDSHAREDXX = $(CXX) -shared +AR = ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) +RUBY_SO_NAME = ruby +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux +sitearch = $(arch) +ruby_version = 2.5.0 +ruby = $(bindir)/$(RUBY_BASE_NAME) +RUBY = $(ruby) +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /usr/bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(libdir) +LIBPATH = -L. -L$(libdir) -Wl,-rpath,$(libdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lcrypto -lssl -lpthread -ldl -lcrypt -lm -lc +ORIG_SRCS = binder.cpp cmain.cpp ed.cpp em.cpp kb.cpp page.cpp pipe.cpp rubymain.cpp ssl.cpp +SRCS = $(ORIG_SRCS) +OBJS = binder.o cmain.o ed.o em.o kb.o page.o pipe.o rubymain.o ssl.o +HDRS = $(srcdir)/em.h $(srcdir)/ed.h $(srcdir)/binder.h $(srcdir)/ssl.h $(srcdir)/page.h $(srcdir)/project.h $(srcdir)/eventmachine.h +LOCAL_HDRS = +TARGET = rubyeventmachine +TARGET_NAME = rubyeventmachine +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) +ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) +CLEANOBJS = *.o *.bak + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.time + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TIMESTAMP_DIR)/.sitearchdir.time: + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHAREDXX) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/binder.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/binder.cpp new file mode 100644 index 000000000000..5b90876e58a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/binder.cpp @@ -0,0 +1,124 @@ +/***************************************************************************** + +$Id$ + +File: binder.cpp +Date: 07Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" + +#define DEV_URANDOM "/dev/urandom" + + +std::map<uintptr_t, Bindable_t*> Bindable_t::BindingBag; + + +/******************************** +STATIC Bindable_t::CreateBinding +********************************/ + +uintptr_t Bindable_t::CreateBinding() +{ + static uintptr_t num = 0; + while(BindingBag[++num]) {} + return num; +} + +#if 0 +string Bindable_t::CreateBinding() +{ + static int index = 0; + static string seed; + + if ((index >= 1000000) || (seed.length() == 0)) { + #ifdef OS_UNIX + int fd = open (DEV_URANDOM, O_RDONLY); + if (fd < 0) + throw std::runtime_error ("No entropy device"); + + unsigned char u[16]; + size_t r = read (fd, u, sizeof(u)); + if (r < sizeof(u)) + throw std::runtime_error ("Unable to read entropy device"); + + unsigned char *u1 = (unsigned char*)u; + char u2 [sizeof(u) * 2 + 1]; + + for (size_t i=0; i < sizeof(u); i++) + sprintf (u2 + (i * 2), "%02x", u1[i]); + + seed = string (u2); + #endif + + + #ifdef OS_WIN32 + UUID uuid; + UuidCreate (&uuid); + unsigned char *uuidstring = NULL; + UuidToString (&uuid, &uuidstring); + if (!uuidstring) + throw std::runtime_error ("Unable to read uuid"); + seed = string ((const char*)uuidstring); + + RpcStringFree (&uuidstring); + #endif + + index = 0; + + + } + + stringstream ss; + ss << seed << (++index); + return ss.str(); +} +#endif + +/***************************** +STATIC: Bindable_t::GetObject +*****************************/ + +Bindable_t *Bindable_t::GetObject (const uintptr_t binding) +{ + std::map<uintptr_t, Bindable_t*>::const_iterator i = BindingBag.find (binding); + if (i != BindingBag.end()) + return i->second; + else + return NULL; +} + + +/********************** +Bindable_t::Bindable_t +**********************/ + +Bindable_t::Bindable_t() +{ + Binding = Bindable_t::CreateBinding(); + BindingBag [Binding] = this; +} + + + +/*********************** +Bindable_t::~Bindable_t +***********************/ + +Bindable_t::~Bindable_t() NO_EXCEPT_FALSE +{ + BindingBag.erase (Binding); +} + + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/binder.h b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/binder.h new file mode 100644 index 000000000000..dd32c8d4a9ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/binder.h @@ -0,0 +1,52 @@ +/***************************************************************************** + +$Id$ + +File: binder.h +Date: 07Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#ifndef __ObjectBindings__H_ +#define __ObjectBindings__H_ + + +#if __cplusplus >= 201103L +#define NO_EXCEPT_FALSE noexcept(false) +#else +#define NO_EXCEPT_FALSE +#endif + +class Bindable_t +{ + public: + static uintptr_t CreateBinding(); + static Bindable_t *GetObject (const uintptr_t); + static std::map<uintptr_t, Bindable_t*> BindingBag; + + public: + Bindable_t(); + virtual ~Bindable_t() NO_EXCEPT_FALSE; + + const uintptr_t GetBinding() {return Binding;} + + private: + uintptr_t Binding; +}; + + + + + +#endif // __ObjectBindings__H_ + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/binder.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/binder.o new file mode 100644 index 000000000000..93c389f4382b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/binder.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/cmain.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/cmain.cpp new file mode 100644 index 000000000000..f58c2cde4122 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/cmain.cpp @@ -0,0 +1,988 @@ +/***************************************************************************** + +$Id$ + +File: cmain.cpp +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" + +/* 21Sep09: ruby 1.9 defines macros for common i/o functions that point to rb_w32_* implementations. + We need to undef the stat to fix a build failure in evma_send_file_data_to_connection. + See http://groups.google.com/group/eventmachine/browse_thread/thread/fc60d9bb738ffc71 +*/ +#if defined(BUILD_FOR_RUBY) && defined(OS_WIN32) +#undef stat +#undef fstat +#endif + +static EventMachine_t *EventMachine; +static Poller_t Poller = Poller_Default; + +extern "C" void ensure_eventmachine (const char *caller = "unknown caller") +{ + if (!EventMachine) { + const int err_size = 128; + char err_string[err_size]; + snprintf (err_string, err_size, "eventmachine not initialized: %s", caller); + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "%s", err_string); + #else + throw std::runtime_error (err_string); + #endif + } +} + +/*********************** +evma_initialize_library +***********************/ + +extern "C" void evma_initialize_library (EMCallback cb) +{ + if (EventMachine) + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "eventmachine already initialized: evma_initialize_library"); + #else + throw std::runtime_error ("eventmachine already initialized: evma_initialize_library"); + #endif + + EventMachine = new EventMachine_t (cb, Poller); +} + + +/******************** +evma_release_library +********************/ + +extern "C" void evma_release_library() +{ + ensure_eventmachine("evma_release_library"); + delete EventMachine; + EventMachine = NULL; +} + + +/********************* +evma_run_machine_once +*********************/ + +extern "C" bool evma_run_machine_once() +{ + ensure_eventmachine("evma_run_machine_once"); + return EventMachine->RunOnce(); +} + + +/**************** +evma_run_machine +****************/ + +extern "C" void evma_run_machine() +{ + ensure_eventmachine("evma_run_machine"); + EventMachine->Run(); +} + + +/************************** +evma_install_oneshot_timer +**************************/ + +extern "C" const uintptr_t evma_install_oneshot_timer (uint64_t milliseconds) +{ + ensure_eventmachine("evma_install_oneshot_timer"); + return EventMachine->InstallOneshotTimer (milliseconds); +} + + +/********************** +evma_connect_to_server +**********************/ + +extern "C" const uintptr_t evma_connect_to_server (const char *bind_addr, int bind_port, const char *server, int port) +{ + ensure_eventmachine("evma_connect_to_server"); + return EventMachine->ConnectToServer (bind_addr, bind_port, server, port); +} + +/*************************** +evma_connect_to_unix_server +***************************/ + +extern "C" const uintptr_t evma_connect_to_unix_server (const char *server) +{ + ensure_eventmachine("evma_connect_to_unix_server"); + return EventMachine->ConnectToUnixServer (server); +} + +/************** +evma_attach_fd +**************/ + +extern "C" const uintptr_t evma_attach_fd (int file_descriptor, int watch_mode) +{ + ensure_eventmachine("evma_attach_fd"); + return EventMachine->AttachFD (file_descriptor, watch_mode ? true : false); +} + +/************** +evma_detach_fd +**************/ + +extern "C" int evma_detach_fd (const uintptr_t binding) +{ + ensure_eventmachine("evma_detach_fd"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + return EventMachine->DetachFD (ed); + else + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "invalid binding to detach"); + #else + throw std::runtime_error ("invalid binding to detach"); + #endif + return -1; +} + +/************************ +evma_get_file_descriptor +************************/ + +extern "C" int evma_get_file_descriptor (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_file_descriptor"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetSocket(); + else + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "invalid binding to get_fd"); + #else + throw std::runtime_error ("invalid binding to get_fd"); + #endif + return -1; +} + +/*********************** +evma_is_notify_readable +***********************/ + +extern "C" int evma_is_notify_readable (const uintptr_t binding) +{ + ConnectionDescriptor *cd = dynamic_cast <ConnectionDescriptor*> (Bindable_t::GetObject (binding)); + if (cd) + return cd->IsNotifyReadable() ? 1 : 0; + return -1; +} + +/************************ +evma_set_notify_readable +************************/ + +extern "C" void evma_set_notify_readable (const uintptr_t binding, int mode) +{ + ConnectionDescriptor *cd = dynamic_cast <ConnectionDescriptor*> (Bindable_t::GetObject (binding)); + if (cd) + cd->SetNotifyReadable (mode ? true : false); +} + +/*********************** +evma_is_notify_writable +***********************/ + +extern "C" int evma_is_notify_writable (const uintptr_t binding) +{ + ConnectionDescriptor *cd = dynamic_cast <ConnectionDescriptor*> (Bindable_t::GetObject (binding)); + if (cd) + return cd->IsNotifyWritable() ? 1 : 0; + return -1; +} + +/************************ +evma_set_notify_writable +************************/ + +extern "C" void evma_set_notify_writable (const uintptr_t binding, int mode) +{ + ConnectionDescriptor *cd = dynamic_cast <ConnectionDescriptor*> (Bindable_t::GetObject (binding)); + if (cd) + cd->SetNotifyWritable (mode ? true : false); +} + +/********** +evma_pause +**********/ + +extern "C" int evma_pause (const uintptr_t binding) +{ + EventableDescriptor *cd = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (cd) + return cd->Pause() ? 1 : 0; + + return 0; +} + +/*********** +evma_resume +***********/ + +extern "C" int evma_resume (const uintptr_t binding) +{ + EventableDescriptor *cd = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (cd) + return cd->Resume() ? 1 : 0; + + return 0; +} + +/************** +evma_is_paused +**************/ + +extern "C" int evma_is_paused (const uintptr_t binding) +{ + EventableDescriptor *cd = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (cd) + return cd->IsPaused() ? 1 : 0; + + return 0; +} + +/************************ +evma_num_close_scheduled +************************/ + +extern "C" int evma_num_close_scheduled () +{ + ensure_eventmachine("evma_num_close_scheduled"); + return EventMachine->NumCloseScheduled; +} + +/********************** +evma_create_tcp_server +**********************/ + +extern "C" const uintptr_t evma_create_tcp_server (const char *address, int port) +{ + ensure_eventmachine("evma_create_tcp_server"); + return EventMachine->CreateTcpServer (address, port); +} + +/****************************** +evma_create_unix_domain_server +******************************/ + +extern "C" const uintptr_t evma_create_unix_domain_server (const char *filename) +{ + ensure_eventmachine("evma_create_unix_domain_server"); + return EventMachine->CreateUnixDomainServer (filename); +} + +/*********************** +evma_attach_sd +************************/ + +extern "C" const uintptr_t evma_attach_sd (int sd) +{ + ensure_eventmachine("evma_attach_sd"); + return EventMachine->AttachSD (sd); +} + +/************************* +evma_open_datagram_socket +*************************/ + +extern "C" const uintptr_t evma_open_datagram_socket (const char *address, int port) +{ + ensure_eventmachine("evma_open_datagram_socket"); + return EventMachine->OpenDatagramSocket (address, port); +} + +/****************** +evma_open_keyboard +******************/ + +extern "C" const uintptr_t evma_open_keyboard() +{ + ensure_eventmachine("evma_open_keyboard"); + return EventMachine->OpenKeyboard(); +} + +/******************* +evma_watch_filename +*******************/ + +extern "C" const uintptr_t evma_watch_filename (const char *fname) +{ + ensure_eventmachine("evma_watch_filename"); + return EventMachine->WatchFile(fname); +} + +/********************* +evma_unwatch_filename +*********************/ + +extern "C" void evma_unwatch_filename (const uintptr_t sig) +{ + ensure_eventmachine("evma_unwatch_file"); + EventMachine->UnwatchFile(sig); +} + +/************** +evma_watch_pid +**************/ + +extern "C" const uintptr_t evma_watch_pid (int pid) +{ + ensure_eventmachine("evma_watch_pid"); + return EventMachine->WatchPid(pid); +} + +/**************** +evma_unwatch_pid +****************/ + +extern "C" void evma_unwatch_pid (const uintptr_t sig) +{ + ensure_eventmachine("evma_unwatch_pid"); + EventMachine->UnwatchPid(sig); +} + +/**************************** +evma_send_data_to_connection +****************************/ + +extern "C" int evma_send_data_to_connection (const uintptr_t binding, const char *data, int data_length) +{ + ensure_eventmachine("evma_send_data_to_connection"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + return ed->SendOutboundData(data, data_length); + return -1; +} + +/****************** +evma_send_datagram +******************/ + +extern "C" int evma_send_datagram (const uintptr_t binding, const char *data, int data_length, const char *address, int port) +{ + ensure_eventmachine("evma_send_datagram"); + DatagramDescriptor *dd = dynamic_cast <DatagramDescriptor*> (Bindable_t::GetObject (binding)); + if (dd) + return dd->SendOutboundDatagram(data, data_length, address, port); + return -1; +} + + +/********************* +evma_close_connection +*********************/ + +extern "C" void evma_close_connection (const uintptr_t binding, int after_writing) +{ + ensure_eventmachine("evma_close_connection"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + ed->ScheduleClose (after_writing ? true : false); +} + +/*********************************** +evma_report_connection_error_status +***********************************/ + +extern "C" int evma_report_connection_error_status (const uintptr_t binding) +{ + ensure_eventmachine("evma_report_connection_error_status"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + return ed->ReportErrorStatus(); + return -1; +} + +/******************** +evma_stop_tcp_server +********************/ + +extern "C" void evma_stop_tcp_server (const uintptr_t binding) +{ + ensure_eventmachine("evma_stop_tcp_server"); + AcceptorDescriptor::StopAcceptor (binding); +} + + +/***************** +evma_stop_machine +*****************/ + +extern "C" void evma_stop_machine() +{ + ensure_eventmachine("evma_stop_machine"); + EventMachine->ScheduleHalt(); +} + +/***************** +evma_stopping +*****************/ + +extern "C" bool evma_stopping() +{ + ensure_eventmachine("evma_stopping"); + return EventMachine->Stopping(); +} + +/************** +evma_start_tls +**************/ + +extern "C" void evma_start_tls (const uintptr_t binding) +{ + ensure_eventmachine("evma_start_tls"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + ed->StartTls(); +} + +/****************** +evma_set_tls_parms +******************/ + +extern "C" void evma_set_tls_parms (const uintptr_t binding, const char *privatekey_filename, const char *certchain_filename, int verify_peer, int fail_if_no_peer_cert, const char *sni_hostname, const char *cipherlist, const char *ecdh_curve, const char *dhparam, int ssl_version) +{ + ensure_eventmachine("evma_set_tls_parms"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + ed->SetTlsParms (privatekey_filename, certchain_filename, (verify_peer == 1 ? true : false), (fail_if_no_peer_cert == 1 ? true : false), sni_hostname, cipherlist, ecdh_curve, dhparam, ssl_version); +} + +/****************** +evma_get_peer_cert +******************/ + +#ifdef WITH_SSL +extern "C" X509 *evma_get_peer_cert (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_peer_cert"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetPeerCert(); + return NULL; +} +#endif + +/****************** +evma_get_cipher_bits +******************/ + +#ifdef WITH_SSL +extern "C" int evma_get_cipher_bits (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_cipher_bits"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetCipherBits(); + return -1; +} +#endif + +/****************** +evma_get_cipher_name +******************/ + +#ifdef WITH_SSL +extern "C" const char *evma_get_cipher_name (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_cipher_name"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetCipherName(); + return NULL; +} +#endif + +/****************** +evma_get_cipher_protocol +******************/ + +#ifdef WITH_SSL +extern "C" const char *evma_get_cipher_protocol (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_cipher_protocol"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetCipherProtocol(); + return NULL; +} +#endif + +/****************** +evma_get_sni_hostname +******************/ + +#ifdef WITH_SSL +extern "C" const char *evma_get_sni_hostname (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_sni_hostname"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) + return ed->GetSNIHostname(); + return NULL; +} +#endif + +/******************** +evma_accept_ssl_peer +********************/ + +#ifdef WITH_SSL +extern "C" void evma_accept_ssl_peer (const uintptr_t binding) +{ + ensure_eventmachine("evma_accept_ssl_peer"); + ConnectionDescriptor *cd = dynamic_cast <ConnectionDescriptor*> (Bindable_t::GetObject (binding)); + if (cd) + cd->AcceptSslPeer(); +} +#endif + +/***************** +evma_get_peername +*****************/ + +extern "C" int evma_get_peername (const uintptr_t binding, struct sockaddr *sa, socklen_t *len) +{ + ensure_eventmachine("evma_get_peername"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) { + return ed->GetPeername (sa, len) ? 1 : 0; + } + else + return 0; +} + +/***************** +evma_get_sockname +*****************/ + +extern "C" int evma_get_sockname (const uintptr_t binding, struct sockaddr *sa, socklen_t *len) +{ + ensure_eventmachine("evma_get_sockname"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) { + return ed->GetSockname (sa, len) ? 1 : 0; + } + else + return 0; +} + +/*********************** +evma_get_subprocess_pid +***********************/ + +#ifdef OS_UNIX +extern "C" int evma_get_subprocess_pid (const uintptr_t binding, pid_t *pid) +{ + ensure_eventmachine("evma_get_subprocess_pid"); + PipeDescriptor *pd = dynamic_cast <PipeDescriptor*> (Bindable_t::GetObject (binding)); + if (pd) { + return pd->GetSubprocessPid (pid) ? 1 : 0; + } + else if (pid && EventMachine->SubprocessPid) { + *pid = EventMachine->SubprocessPid; + return 1; + } + else + return 0; +} +#else +extern "C" int evma_get_subprocess_pid (const uintptr_t binding UNUSED, pid_t *pid UNUSED) +{ + return 0; +} +#endif + +/************************** +evma_get_subprocess_status +**************************/ + +extern "C" int evma_get_subprocess_status (const uintptr_t binding UNUSED, int *status) +{ + ensure_eventmachine("evma_get_subprocess_status"); + if (status) { + *status = EventMachine->SubprocessExitStatus; + return 1; + } + else + return 0; +} + +/************************* +evma_get_connection_count +*************************/ + +extern "C" int evma_get_connection_count() +{ + ensure_eventmachine("evma_get_connection_count"); + return EventMachine->GetConnectionCount(); +} + +/********************* +evma_signal_loopbreak +*********************/ + +extern "C" void evma_signal_loopbreak() +{ + ensure_eventmachine("evma_signal_loopbreak"); + EventMachine->SignalLoopBreaker(); +} + + + +/******************************** +evma_get_comm_inactivity_timeout +********************************/ + +extern "C" float evma_get_comm_inactivity_timeout (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_comm_inactivity_timeout"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) { + return ((float)ed->GetCommInactivityTimeout() / 1000); + } + else + return 0.0; //Perhaps this should be an exception. Access to an unknown binding. +} + +/******************************** +evma_set_comm_inactivity_timeout +********************************/ + +extern "C" int evma_set_comm_inactivity_timeout (const uintptr_t binding, float value) +{ + ensure_eventmachine("evma_set_comm_inactivity_timeout"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) { + return ed->SetCommInactivityTimeout ((uint64_t)(value * 1000)); + } + else + return 0; //Perhaps this should be an exception. Access to an unknown binding. +} + + +/******************************** +evma_get_pending_connect_timeout +********************************/ + +extern "C" float evma_get_pending_connect_timeout (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_pending_connect_timeout"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) { + return ((float)ed->GetPendingConnectTimeout() / 1000); + } + else + return 0.0; +} + + +/******************************** +evma_set_pending_connect_timeout +********************************/ + +extern "C" int evma_set_pending_connect_timeout (const uintptr_t binding, float value) +{ + ensure_eventmachine("evma_set_pending_connect_timeout"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + if (ed) { + return ed->SetPendingConnectTimeout ((uint64_t)(value * 1000)); + } + else + return 0; +} + + +/********************** +evma_set_timer_quantum +**********************/ + +extern "C" void evma_set_timer_quantum (int interval) +{ + ensure_eventmachine("evma_set_timer_quantum"); + EventMachine->SetTimerQuantum (interval); +} + + +/************************ +evma_get_max_timer_count +************************/ + +extern "C" int evma_get_max_timer_count() +{ + return EventMachine_t::GetMaxTimerCount(); +} + +/************************ +evma_set_max_timer_count +************************/ + +extern "C" void evma_set_max_timer_count (int ct) +{ + // This may only be called if the reactor is not running. + + if (EventMachine) + #ifdef BUILD_FOR_RUBY + rb_raise(rb_eRuntimeError, "eventmachine already initialized: evma_set_max_timer_count"); + #else + throw std::runtime_error ("eventmachine already initialized: evma_set_max_timer_count"); + #endif + EventMachine_t::SetMaxTimerCount (ct); +} + +/****************** +evma_get/set_simultaneous_accept_count +******************/ + +extern "C" void evma_set_simultaneous_accept_count (int count) +{ + EventMachine_t::SetSimultaneousAcceptCount(count); +} + +extern "C" int evma_get_simultaneous_accept_count() +{ + return EventMachine_t::GetSimultaneousAcceptCount(); +} + + +/****************** +evma_setuid_string +******************/ + +extern "C" void evma_setuid_string (const char *username) +{ + // We do NOT need to be running an EM instance because this method is static. + EventMachine_t::SetuidString (username); +} + + +/********** +evma_popen +**********/ + +extern "C" const uintptr_t evma_popen (char * const*cmd_strings) +{ + ensure_eventmachine("evma_popen"); + return EventMachine->Socketpair (cmd_strings); +} + + +/*************************** +evma_get_outbound_data_size +***************************/ + +extern "C" int evma_get_outbound_data_size (const uintptr_t binding) +{ + ensure_eventmachine("evma_get_outbound_data_size"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); + return ed ? ed->GetOutboundDataSize() : 0; +} + + +/************** +evma_set_epoll +**************/ + +extern "C" void evma_set_epoll (int use) +{ + if (use) + Poller = Poller_Epoll; + else + Poller = Poller_Default; +} + +/*************** +evma_set_kqueue +***************/ + +extern "C" void evma_set_kqueue (int use) +{ + if (use) + Poller = Poller_Kqueue; + else + Poller = Poller_Default; +} + + +/********************** +evma_set_rlimit_nofile +**********************/ + +extern "C" int evma_set_rlimit_nofile (int nofiles) +{ + return EventMachine_t::SetRlimitNofile (nofiles); +} + + +/********************************* +evma_send_file_data_to_connection +*********************************/ + +extern "C" int evma_send_file_data_to_connection (const uintptr_t binding, const char *filename) +{ + /* This is a sugaring over send_data_to_connection that reads a file into a + * locally-allocated buffer, and sends the file data to the remote peer. + * Return the number of bytes written to the caller. + * TODO, needs to impose a limit on the file size. This is intended only for + * small files. (I don't know, maybe 8K or less.) For larger files, use interleaved + * I/O to avoid slowing the rest of the system down. + * TODO: we should return a code rather than barf, in case of file-not-found. + * TODO, does this compile on Windows? + * TODO, given that we want this to work only with small files, how about allocating + * the buffer on the stack rather than the heap? + * + * Modified 25Jul07. This now returns -1 on file-too-large; 0 for success, and a positive + * errno in case of other errors. + * + * Contributed by Kirk Haines. + */ + + char data[32*1024]; + int r; + + ensure_eventmachine("evma_send_file_data_to_connection"); + +#if defined(OS_WIN32) + int Fd = open (filename, O_RDONLY|O_BINARY); +#else + int Fd = open (filename, O_RDONLY); +#endif + if (Fd < 0) + return errno; + // From here on, all early returns MUST close Fd. + + struct stat st; + if (fstat (Fd, &st)) { + int e = errno; + close (Fd); + return e; + } + + off_t filesize = st.st_size; + if (filesize <= 0) { + close (Fd); + return 0; + } + else if (filesize > (off_t) sizeof(data)) { + close (Fd); + return -1; + } + + r = read (Fd, data, filesize); + if (r != filesize) { + int e = errno; + close (Fd); + return e; + } + evma_send_data_to_connection (binding, data, r); + close (Fd); + + return 0; +} + + +/**************** +evma_start_proxy +*****************/ + +extern "C" void evma_start_proxy (const uintptr_t from, const uintptr_t to, const unsigned long bufsize, const unsigned long length) +{ + ensure_eventmachine("evma_start_proxy"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (from)); + if (ed) + ed->StartProxy(to, bufsize, length); +} + + +/*************** +evma_stop_proxy +****************/ + +extern "C" void evma_stop_proxy (const uintptr_t from) +{ + ensure_eventmachine("evma_stop_proxy"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (from)); + if (ed) + ed->StopProxy(); +} + +/****************** +evma_proxied_bytes +*******************/ + +extern "C" unsigned long evma_proxied_bytes (const uintptr_t from) +{ + ensure_eventmachine("evma_proxied_bytes"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (from)); + if (ed) + return ed->GetProxiedBytes(); + else + return 0; +} + + +/*************************** +evma_get_last_activity_time +****************************/ + +extern "C" uint64_t evma_get_last_activity_time(const uintptr_t from) +{ + ensure_eventmachine("evma_get_last_activity_time"); + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (from)); + if (ed) + return ed->GetLastActivity(); + else + return 0; +} + + +/*************************** +evma_get_heartbeat_interval +****************************/ + +extern "C" float evma_get_heartbeat_interval() +{ + ensure_eventmachine("evma_get_heartbeat_interval"); + return EventMachine->GetHeartbeatInterval(); +} + + +/*************************** +evma_set_heartbeat_interval +****************************/ + +extern "C" int evma_set_heartbeat_interval(float interval) +{ + ensure_eventmachine("evma_set_heartbeat_interval"); + return EventMachine->SetHeartbeatInterval(interval); +} + + +/************************** +evma_get_current_loop_time +***************************/ + +extern "C" uint64_t evma_get_current_loop_time() +{ + ensure_eventmachine("evma_get_current_loop_time"); + return EventMachine->GetCurrentLoopTime(); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/cmain.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/cmain.o new file mode 100644 index 000000000000..ef73fdcebf03 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/cmain.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ed.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ed.cpp new file mode 100644 index 000000000000..a469dff045ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ed.cpp @@ -0,0 +1,2096 @@ +/***************************************************************************** + +$Id$ + +File: ed.cpp +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" + + + +/******************** +SetSocketNonblocking +********************/ + +bool SetSocketNonblocking (SOCKET sd) +{ + #ifdef OS_UNIX + int val = fcntl (sd, F_GETFL, 0); + return (fcntl (sd, F_SETFL, val | O_NONBLOCK) != SOCKET_ERROR) ? true : false; + #endif + + #ifdef OS_WIN32 + #ifdef BUILD_FOR_RUBY + // 14Jun09 Ruby provides its own wrappers for ioctlsocket. On 1.8 this is a simple wrapper, + // however, 1.9 keeps its own state about the socket. + // NOTE: F_GETFL is not supported + return (fcntl (sd, F_SETFL, O_NONBLOCK) == 0) ? true : false; + #else + unsigned long one = 1; + return (ioctlsocket (sd, FIONBIO, &one) == 0) ? true : false; + #endif + #endif +} + +/************ +SetFdCloexec +************/ + +#ifdef OS_UNIX +bool SetFdCloexec (int fd) +{ + int flags = fcntl(fd, F_GETFD, 0); + assert (flags >= 0); + flags |= FD_CLOEXEC; + return (fcntl(fd, F_SETFD, FD_CLOEXEC) == 0) ? true : false; +} +#else +bool SetFdCloexec (int fd UNUSED) +{ + return true; +} +#endif + +/**************************************** +EventableDescriptor::EventableDescriptor +****************************************/ + +EventableDescriptor::EventableDescriptor (SOCKET sd, EventMachine_t *em): + bCloseNow (false), + bCloseAfterWriting (false), + MySocket (sd), + bAttached (false), + bWatchOnly (false), + EventCallback (NULL), + bCallbackUnbind (true), + UnbindReasonCode (0), + ProxyTarget(NULL), + ProxiedFrom(NULL), + ProxiedBytes(0), + MaxOutboundBufSize(0), + MyEventMachine (em), + PendingConnectTimeout(20000000), + InactivityTimeout (0), + NextHeartbeat (0), + bPaused (false) +{ + /* There are three ways to close a socket, all of which should + * automatically signal to the event machine that this object + * should be removed from the polling scheduler. + * First is a hard close, intended for bad errors or possible + * security violations. It immediately closes the connection + * and puts this object into an error state. + * Second is to set bCloseNow, which will cause the event machine + * to delete this object (and thus close the connection in our + * destructor) the next chance it gets. bCloseNow also inhibits + * the writing of new data on the socket (but not necessarily + * the reading of new data). + * The third way is to set bCloseAfterWriting, which inhibits + * the writing of new data and converts to bCloseNow as soon + * as everything in the outbound queue has been written. + * bCloseAfterWriting is really for use only by protocol handlers + * (for example, HTTP writes an HTML page and then closes the + * connection). All of the error states we generate internally + * cause an immediate close to be scheduled, which may have the + * effect of discarding outbound data. + */ + + if (sd == INVALID_SOCKET) + throw std::runtime_error ("bad eventable descriptor"); + if (MyEventMachine == NULL) + throw std::runtime_error ("bad em in eventable descriptor"); + CreatedAt = MyEventMachine->GetCurrentLoopTime(); + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + #ifdef HAVE_EPOLL + EpollEvent.events = 0; + EpollEvent.data.ptr = this; + #endif +} + + +/***************************************** +EventableDescriptor::~EventableDescriptor +*****************************************/ + +EventableDescriptor::~EventableDescriptor() NO_EXCEPT_FALSE +{ + if (NextHeartbeat) + MyEventMachine->ClearHeartbeat(NextHeartbeat, this); + if (EventCallback && bCallbackUnbind) + (*EventCallback)(GetBinding(), EM_CONNECTION_UNBOUND, NULL, UnbindReasonCode); + if (ProxiedFrom) { + (*EventCallback)(ProxiedFrom->GetBinding(), EM_PROXY_TARGET_UNBOUND, NULL, 0); + ProxiedFrom->StopProxy(); + } + MyEventMachine->NumCloseScheduled--; + StopProxy(); + Close(); +} + + +/************************************* +EventableDescriptor::SetEventCallback +*************************************/ + +void EventableDescriptor::SetEventCallback (EMCallback cb) +{ + EventCallback = cb; +} + + +/************************** +EventableDescriptor::Close +**************************/ + +void EventableDescriptor::Close() +{ + /* EventMachine relies on the fact that when close(fd) + * is called that the fd is removed from any + * epoll event queues. + * + * However, this is not *always* the behavior of close(fd) + * + * See man 4 epoll Q6/A6 and then consider what happens + * when using pipes with eventmachine. + * (As is often done when communicating with a subprocess) + * + * The pipes end up looking like: + * + * ls -l /proc/<pid>/fd + * ... + * lr-x------ 1 root root 64 2011-08-19 21:31 3 -> pipe:[940970] + * l-wx------ 1 root root 64 2011-08-19 21:31 4 -> pipe:[940970] + * + * This meets the critera from man 4 epoll Q6/A4 for not + * removing fds from epoll event queues until all fds + * that reference the underlying file have been removed. + * + * If the EventableDescriptor associated with fd 3 is deleted, + * its dtor will call EventableDescriptor::Close(), + * which will call ::close(int fd). + * + * However, unless the EventableDescriptor associated with fd 4 is + * also deleted before the next call to epoll_wait, events may fire + * for fd 3 that were registered with an already deleted + * EventableDescriptor. + * + * Therefore, it is necessary to notify EventMachine that + * the fd associated with this EventableDescriptor is + * closing. + * + * EventMachine also never closes fds for STDIN, STDOUT and + * STDERR (0, 1 & 2) + */ + + // Close the socket right now. Intended for emergencies. + if (MySocket != INVALID_SOCKET) { + MyEventMachine->Deregister (this); + + // Do not close STDIN, STDOUT, STDERR + if (MySocket > 2 && !bAttached) { + shutdown (MySocket, 1); + close (MySocket); + } + + MySocket = INVALID_SOCKET; + } +} + + +/********************************* +EventableDescriptor::ShouldDelete +*********************************/ + +bool EventableDescriptor::ShouldDelete() +{ + /* For use by a socket manager, which needs to know if this object + * should be removed from scheduling events and deleted. + * Has an immediate close been scheduled, or are we already closed? + * If either of these are the case, return true. In theory, the manager will + * then delete us, which in turn will make sure the socket is closed. + * Note, if bCloseAfterWriting is true, we check a virtual method to see + * if there is outbound data to write, and only request a close if there is none. + */ + + return ((MySocket == INVALID_SOCKET) || bCloseNow || (bCloseAfterWriting && (GetOutboundDataSize() <= 0))); +} + + +/********************************** +EventableDescriptor::ScheduleClose +**********************************/ + +void EventableDescriptor::ScheduleClose (bool after_writing) +{ + if (IsCloseScheduled()) { + if (!after_writing) { + // If closing has become more urgent, then upgrade the scheduled + // after_writing close to one NOW. + bCloseNow = true; + } + return; + } + MyEventMachine->NumCloseScheduled++; + // KEEP THIS SYNCHRONIZED WITH ::IsCloseScheduled. + if (after_writing) + bCloseAfterWriting = true; + else + bCloseNow = true; +} + + +/************************************* +EventableDescriptor::IsCloseScheduled +*************************************/ + +bool EventableDescriptor::IsCloseScheduled() +{ + // KEEP THIS SYNCHRONIZED WITH ::ScheduleClose. + return (bCloseNow || bCloseAfterWriting); +} + + +/******************************* +EventableDescriptor::StartProxy +*******************************/ + +void EventableDescriptor::StartProxy(const uintptr_t to, const unsigned long bufsize, const unsigned long length) +{ + EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (to)); + if (ed) { + StopProxy(); + ProxyTarget = ed; + BytesToProxy = length; + ProxiedBytes = 0; + ed->SetProxiedFrom(this, bufsize); + return; + } + throw std::runtime_error ("Tried to proxy to an invalid descriptor"); +} + + +/****************************** +EventableDescriptor::StopProxy +******************************/ + +void EventableDescriptor::StopProxy() +{ + if (ProxyTarget) { + ProxyTarget->SetProxiedFrom(NULL, 0); + ProxyTarget = NULL; + } +} + + +/*********************************** +EventableDescriptor::SetProxiedFrom +***********************************/ + +void EventableDescriptor::SetProxiedFrom(EventableDescriptor *from, const unsigned long bufsize) +{ + if (from != NULL && ProxiedFrom != NULL) + throw std::runtime_error ("Tried to proxy to a busy target"); + + ProxiedFrom = from; + MaxOutboundBufSize = bufsize; +} + + +/******************************************** +EventableDescriptor::_GenericInboundDispatch +********************************************/ + +void EventableDescriptor::_GenericInboundDispatch(const char *buf, unsigned long size) +{ + assert(EventCallback); + + if (ProxyTarget) { + if (BytesToProxy > 0) { + unsigned long proxied = std::min(BytesToProxy, size); + ProxyTarget->SendOutboundData(buf, proxied); + ProxiedBytes += (unsigned long) proxied; + BytesToProxy -= proxied; + if (BytesToProxy == 0) { + StopProxy(); + (*EventCallback)(GetBinding(), EM_PROXY_COMPLETED, NULL, 0); + if (proxied < size) { + (*EventCallback)(GetBinding(), EM_CONNECTION_READ, buf + proxied, size - proxied); + } + } + } else { + ProxyTarget->SendOutboundData(buf, size); + ProxiedBytes += size; + } + } else { + (*EventCallback)(GetBinding(), EM_CONNECTION_READ, buf, size); + } +} + + +/********************************* +EventableDescriptor::_GenericGetPeername +*********************************/ + +bool EventableDescriptor::_GenericGetPeername (struct sockaddr *s, socklen_t *len) +{ + if (!s) + return false; + + int gp = getpeername (GetSocket(), s, len); + if (gp == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to get peer name: %s", strerror(errno)); + throw std::runtime_error (buf); + } + + return true; +} + +/********************************* +EventableDescriptor::_GenericGetSockname +*********************************/ + +bool EventableDescriptor::_GenericGetSockname (struct sockaddr *s, socklen_t *len) +{ + if (!s) + return false; + + int gp = getsockname (GetSocket(), s, len); + if (gp == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to get sock name: %s", strerror(errno)); + throw std::runtime_error (buf); + } + + return true; +} + + +/********************************************* +EventableDescriptor::GetPendingConnectTimeout +*********************************************/ + +uint64_t EventableDescriptor::GetPendingConnectTimeout() +{ + return PendingConnectTimeout / 1000; +} + + +/********************************************* +EventableDescriptor::SetPendingConnectTimeout +*********************************************/ + +int EventableDescriptor::SetPendingConnectTimeout (uint64_t value) +{ + if (value > 0) { + PendingConnectTimeout = value * 1000; + MyEventMachine->QueueHeartbeat(this); + return 1; + } + return 0; +} + + +/************************************* +EventableDescriptor::GetNextHeartbeat +*************************************/ + +uint64_t EventableDescriptor::GetNextHeartbeat() +{ + if (NextHeartbeat) + MyEventMachine->ClearHeartbeat(NextHeartbeat, this); + + NextHeartbeat = 0; + + if (!ShouldDelete()) { + uint64_t time_til_next = InactivityTimeout; + if (IsConnectPending()) { + if (time_til_next == 0 || PendingConnectTimeout < time_til_next) + time_til_next = PendingConnectTimeout; + } + if (time_til_next == 0) + return 0; + NextHeartbeat = time_til_next + MyEventMachine->GetRealTime(); + } + + return NextHeartbeat; +} + + +/****************************************** +ConnectionDescriptor::ConnectionDescriptor +******************************************/ + +ConnectionDescriptor::ConnectionDescriptor (SOCKET sd, EventMachine_t *em): + EventableDescriptor (sd, em), + bConnectPending (false), + bNotifyReadable (false), + bNotifyWritable (false), + bReadAttemptedAfterClose (false), + bWriteAttemptedAfterClose (false), + OutboundDataSize (0), + #ifdef WITH_SSL + SslBox (NULL), + bHandshakeSignaled (false), + bSslVerifyPeer (false), + bSslPeerAccepted(false), + #endif + #ifdef HAVE_KQUEUE + bGotExtraKqueueEvent(false), + #endif + bIsServer (false) +{ + // 22Jan09: Moved ArmKqueueWriter into SetConnectPending() to fix assertion failure in _WriteOutboundData() + // 5May09: Moved EPOLLOUT into SetConnectPending() so it doesn't happen for attached read pipes +} + + +/******************************************* +ConnectionDescriptor::~ConnectionDescriptor +*******************************************/ + +ConnectionDescriptor::~ConnectionDescriptor() +{ + // Run down any stranded outbound data. + for (size_t i=0; i < OutboundPages.size(); i++) + OutboundPages[i].Free(); + + #ifdef WITH_SSL + if (SslBox) + delete SslBox; + #endif +} + + +/*********************************** +ConnectionDescriptor::_UpdateEvents +************************************/ + +void ConnectionDescriptor::_UpdateEvents() +{ + _UpdateEvents(true, true); +} + +void ConnectionDescriptor::_UpdateEvents(bool read, bool write) +{ + if (MySocket == INVALID_SOCKET) + return; + + if (!read && !write) + return; + + #ifdef HAVE_EPOLL + unsigned int old = EpollEvent.events; + + if (read) { + if (SelectForRead()) + EpollEvent.events |= EPOLLIN; + else + EpollEvent.events &= ~EPOLLIN; + } + + if (write) { + if (SelectForWrite()) + EpollEvent.events |= EPOLLOUT; + else + EpollEvent.events &= ~EPOLLOUT; + } + + if (old != EpollEvent.events) + MyEventMachine->Modify (this); + #endif + + #ifdef HAVE_KQUEUE + if (read && SelectForRead()) + MyEventMachine->ArmKqueueReader (this); + bKqueueArmWrite = SelectForWrite(); + if (write && bKqueueArmWrite) + MyEventMachine->Modify (this); + #endif +} + +/*************************************** +ConnectionDescriptor::SetConnectPending +****************************************/ + +void ConnectionDescriptor::SetConnectPending(bool f) +{ + bConnectPending = f; + MyEventMachine->QueueHeartbeat(this); + _UpdateEvents(); +} + + +/********************************** +ConnectionDescriptor::SetAttached +***********************************/ + +void ConnectionDescriptor::SetAttached(bool state) +{ + bAttached = state; +} + + +/********************************** +ConnectionDescriptor::SetWatchOnly +***********************************/ + +void ConnectionDescriptor::SetWatchOnly(bool watching) +{ + bWatchOnly = watching; + _UpdateEvents(); +} + + +/********************************* +ConnectionDescriptor::HandleError +*********************************/ + +void ConnectionDescriptor::HandleError() +{ + if (bWatchOnly) { + // An EPOLLHUP | EPOLLIN condition will call Read() before HandleError(), in which case the + // socket is already detached and invalid, so we don't need to do anything. + if (MySocket == INVALID_SOCKET) return; + + // HandleError() is called on WatchOnly descriptors by the epoll reactor + // when it gets a EPOLLERR | EPOLLHUP. Usually this would show up as a readable and + // writable event on other reactors, so we have to fire those events ourselves. + if (bNotifyReadable) Read(); + if (bNotifyWritable) Write(); + } else { + ScheduleClose (false); + } +} + + +/*********************************** +ConnectionDescriptor::ScheduleClose +***********************************/ + +void ConnectionDescriptor::ScheduleClose (bool after_writing) +{ + if (bWatchOnly) + throw std::runtime_error ("cannot close 'watch only' connections"); + + EventableDescriptor::ScheduleClose(after_writing); +} + + +/*************************************** +ConnectionDescriptor::SetNotifyReadable +****************************************/ + +void ConnectionDescriptor::SetNotifyReadable(bool readable) +{ + if (!bWatchOnly) + throw std::runtime_error ("notify_readable must be on 'watch only' connections"); + + bNotifyReadable = readable; + _UpdateEvents(true, false); +} + + +/*************************************** +ConnectionDescriptor::SetNotifyWritable +****************************************/ + +void ConnectionDescriptor::SetNotifyWritable(bool writable) +{ + if (!bWatchOnly) + throw std::runtime_error ("notify_writable must be on 'watch only' connections"); + + bNotifyWritable = writable; + _UpdateEvents(false, true); +} + + +/************************************** +ConnectionDescriptor::SendOutboundData +**************************************/ + +int ConnectionDescriptor::SendOutboundData (const char *data, unsigned long length) +{ + if (bWatchOnly) + throw std::runtime_error ("cannot send data on a 'watch only' connection"); + + if (ProxiedFrom && MaxOutboundBufSize && (unsigned int)(GetOutboundDataSize() + length) > MaxOutboundBufSize) + ProxiedFrom->Pause(); + + #ifdef WITH_SSL + if (SslBox) { + if (length > 0) { + unsigned long writed = 0; + char *p = (char*)data; + + while (writed < length) { + int to_write = SSLBOX_INPUT_CHUNKSIZE; + int remaining = length - writed; + + if (remaining < SSLBOX_INPUT_CHUNKSIZE) + to_write = remaining; + + int w = SslBox->PutPlaintext (p, to_write); + if (w < 0) { + ScheduleClose (false); + }else + _DispatchCiphertext(); + + p += to_write; + writed += to_write; + } + } + // TODO: What's the correct return value? + return 1; // That's a wild guess, almost certainly wrong. + } + else + #endif + return _SendRawOutboundData (data, length); +} + + + +/****************************************** +ConnectionDescriptor::_SendRawOutboundData +******************************************/ + +int ConnectionDescriptor::_SendRawOutboundData (const char *data, unsigned long length) +{ + /* This internal method is called to schedule bytes that + * will be sent out to the remote peer. + * It's not directly accessed by the caller, who hits ::SendOutboundData, + * which may or may not filter or encrypt the caller's data before + * sending it here. + */ + + // Highly naive and incomplete implementation. + // There's no throttle for runaways (which should abort only this connection + // and not the whole process), and no coalescing of small pages. + // (Well, not so bad, small pages are coalesced in ::Write) + + if (IsCloseScheduled()) + return 0; + // 25Mar10: Ignore 0 length packets as they are not meaningful in TCP (as opposed to UDP) + // and can cause the assert(nbytes>0) to fail when OutboundPages has a bunch of 0 length pages. + if (length == 0) + return 0; + + if (!data && (length > 0)) + throw std::runtime_error ("bad outbound data"); + char *buffer = (char *) malloc (length + 1); + if (!buffer) + throw std::runtime_error ("no allocation for outbound data"); + + memcpy (buffer, data, length); + buffer [length] = 0; + OutboundPages.push_back (OutboundPage (buffer, length)); + OutboundDataSize += length; + + _UpdateEvents(false, true); + + return length; +} + + + +/*********************************** +ConnectionDescriptor::SelectForRead +***********************************/ + +bool ConnectionDescriptor::SelectForRead() +{ + /* A connection descriptor is always scheduled for read, + * UNLESS it's in a pending-connect state. + * On Linux, unlike Unix, a nonblocking socket on which + * connect has been called, does NOT necessarily select + * both readable and writable in case of error. + * The socket will select writable when the disposition + * of the connect is known. On the other hand, a socket + * which successfully connects and selects writable may + * indeed have some data available on it, so it will + * select readable in that case, violating expectations! + * So we will not poll for readability until the socket + * is known to be in a connected state. + */ + + if (bPaused) + return false; + else if (bConnectPending) + return false; + else if (bWatchOnly) + return bNotifyReadable ? true : false; + else + return true; +} + + +/************************************ +ConnectionDescriptor::SelectForWrite +************************************/ + +bool ConnectionDescriptor::SelectForWrite() +{ + /* Cf the notes under SelectForRead. + * In a pending-connect state, we ALWAYS select for writable. + * In a normal state, we only select for writable when we + * have outgoing data to send. + */ + + if (bPaused) + return false; + else if (bConnectPending) + return true; + else if (bWatchOnly) + return bNotifyWritable ? true : false; + else + return (GetOutboundDataSize() > 0); +} + +/*************************** +ConnectionDescriptor::Pause +***************************/ + +bool ConnectionDescriptor::Pause() +{ + if (bWatchOnly) + throw std::runtime_error ("cannot pause/resume 'watch only' connections, set notify readable/writable instead"); + + bool old = bPaused; + bPaused = true; + _UpdateEvents(); + return old == false; +} + +/**************************** +ConnectionDescriptor::Resume +****************************/ + +bool ConnectionDescriptor::Resume() +{ + if (bWatchOnly) + throw std::runtime_error ("cannot pause/resume 'watch only' connections, set notify readable/writable instead"); + + bool old = bPaused; + bPaused = false; + _UpdateEvents(); + return old == true; +} + +/************************** +ConnectionDescriptor::Read +**************************/ + +void ConnectionDescriptor::Read() +{ + /* Read and dispatch data on a socket that has selected readable. + * It's theoretically possible to get and dispatch incoming data on + * a socket that has already been scheduled for closing or close-after-writing. + * In those cases, we'll leave it up the to protocol handler to "do the + * right thing" (which probably means to ignore the incoming data). + * + * 22Aug06: Chris Ochs reports that on FreeBSD, it's possible to come + * here with the socket already closed, after the process receives + * a ctrl-C signal (not sure if that's TERM or INT on BSD). The application + * was one in which network connections were doing a lot of interleaved reads + * and writes. + * Since we always write before reading (in order to keep the outbound queues + * as light as possible), I think what happened is that an interrupt caused + * the socket to be closed in ConnectionDescriptor::Write. We'll then + * come here in the same pass through the main event loop, and won't get + * cleaned up until immediately after. + * We originally asserted that the socket was valid when we got here. + * To deal properly with the possibility that we are closed when we get here, + * I removed the assert. HOWEVER, the potential for an infinite loop scares me, + * so even though this is really clunky, I added a flag to assert that we never + * come here more than once after being closed. (FCianfrocca) + */ + + SOCKET sd = GetSocket(); + //assert (sd != INVALID_SOCKET); (original, removed 22Aug06) + if (sd == INVALID_SOCKET) { + assert (!bReadAttemptedAfterClose); + bReadAttemptedAfterClose = true; + return; + } + + if (bWatchOnly) { + if (bNotifyReadable && EventCallback) + (*EventCallback)(GetBinding(), EM_CONNECTION_NOTIFY_READABLE, NULL, 0); + return; + } + + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + int total_bytes_read = 0; + char readbuffer [16 * 1024 + 1]; + + for (int i=0; i < 10; i++) { + // Don't read just one buffer and then move on. This is faster + // if there is a lot of incoming. + // But don't read indefinitely. Give other sockets a chance to run. + // NOTICE, we're reading one less than the buffer size. + // That's so we can put a guard byte at the end of what we send + // to user code. + + + int r = read (sd, readbuffer, sizeof(readbuffer) - 1); +#ifdef OS_WIN32 + int e = WSAGetLastError(); +#else + int e = errno; +#endif + //cerr << "<R:" << r << ">"; + + if (r > 0) { + total_bytes_read += r; + + // Add a null-terminator at the the end of the buffer + // that we will send to the callback. + // DO NOT EVER CHANGE THIS. We want to explicitly allow users + // to be able to depend on this behavior, so they will have + // the option to do some things faster. Additionally it's + // a security guard against buffer overflows. + readbuffer [r] = 0; + _DispatchInboundData (readbuffer, r); + if (bPaused) + break; + } + else if (r == 0) { + break; + } + else { + #ifdef OS_UNIX + if ((e != EINPROGRESS) && (e != EWOULDBLOCK) && (e != EAGAIN) && (e != EINTR)) { + #endif + #ifdef OS_WIN32 + if ((e != WSAEINPROGRESS) && (e != WSAEWOULDBLOCK)) { + #endif + // 26Mar11: Previously, all read errors were assumed to be EWOULDBLOCK and ignored. + // Now, instead, we call Close() on errors like ECONNRESET and ENOTCONN. + UnbindReasonCode = e; + Close(); + break; + } else { + // Basically a would-block, meaning we've read everything there is to read. + break; + } + } + + } + + + if (total_bytes_read == 0) { + // If we read no data on a socket that selected readable, + // it generally means the other end closed the connection gracefully. + ScheduleClose (false); + //bCloseNow = true; + } + +} + + + +/****************************************** +ConnectionDescriptor::_DispatchInboundData +******************************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::_DispatchInboundData (const char *buffer, unsigned long size) +{ + if (SslBox) { + SslBox->PutCiphertext (buffer, size); + + int s; + char B [2048]; + while ((s = SslBox->GetPlaintext (B, sizeof(B) - 1)) > 0) { + _CheckHandshakeStatus(); + B [s] = 0; + _GenericInboundDispatch(B, s); + } + + // If our SSL handshake had a problem, shut down the connection. + if (s == -2) { + #ifndef EPROTO // OpenBSD does not have EPROTO + #define EPROTO EINTR + #endif + #ifdef OS_UNIX + UnbindReasonCode = EPROTO; + #endif + #ifdef OS_WIN32 + UnbindReasonCode = WSAECONNABORTED; + #endif + ScheduleClose(false); + return; + } + + _CheckHandshakeStatus(); + _DispatchCiphertext(); + } + else { + _GenericInboundDispatch(buffer, size); + } +} +#else +void ConnectionDescriptor::_DispatchInboundData (const char *buffer, unsigned long size) +{ + _GenericInboundDispatch(buffer, size); +} +#endif + + + +/******************************************* +ConnectionDescriptor::_CheckHandshakeStatus +*******************************************/ + +void ConnectionDescriptor::_CheckHandshakeStatus() +{ + #ifdef WITH_SSL + if (SslBox && (!bHandshakeSignaled) && SslBox->IsHandshakeCompleted()) { + bHandshakeSignaled = true; + if (EventCallback) + (*EventCallback)(GetBinding(), EM_SSL_HANDSHAKE_COMPLETED, NULL, 0); + } + #endif +} + + + +/*************************** +ConnectionDescriptor::Write +***************************/ + +void ConnectionDescriptor::Write() +{ + /* A socket which is in a pending-connect state will select + * writable when the disposition of the connect is known. + * At that point, check to be sure there are no errors, + * and if none, then promote the socket out of the pending + * state. + * TODO: I haven't figured out how Windows signals errors on + * unconnected sockets. Maybe it does the untraditional but + * logical thing and makes the socket selectable for error. + * If so, it's unsupported here for the time being, and connect + * errors will have to be caught by the timeout mechanism. + */ + + if (bConnectPending) { + int error; + socklen_t len; + len = sizeof(error); + #ifdef OS_UNIX + int o = getsockopt (GetSocket(), SOL_SOCKET, SO_ERROR, &error, &len); + #endif + #ifdef OS_WIN32 + int o = getsockopt (GetSocket(), SOL_SOCKET, SO_ERROR, (char*)&error, &len); + #endif + if ((o == 0) && (error == 0)) { + if (EventCallback) + (*EventCallback)(GetBinding(), EM_CONNECTION_COMPLETED, "", 0); + + // 5May09: Moved epoll/kqueue read/write arming into SetConnectPending, so it can be called + // from EventMachine_t::AttachFD as well. + SetConnectPending (false); + } + else { + if (o == 0) + UnbindReasonCode = error; + ScheduleClose (false); + //bCloseNow = true; + } + } + else { + + if (bNotifyWritable) { + if (EventCallback) + (*EventCallback)(GetBinding(), EM_CONNECTION_NOTIFY_WRITABLE, NULL, 0); + + _UpdateEvents(false, true); + return; + } + + assert(!bWatchOnly); + + /* 5May09: Kqueue bugs on OSX cause one extra writable event to fire even though we're using + EV_ONESHOT. We ignore this extra event once, but only the first time. If it happens again, + we should fall through to the assert(nbytes>0) failure to catch any EM bugs which might cause + ::Write to be called in a busy-loop. + */ + #ifdef HAVE_KQUEUE + if (MyEventMachine->GetPoller() == Poller_Kqueue) { + if (OutboundDataSize == 0 && !bGotExtraKqueueEvent) { + bGotExtraKqueueEvent = true; + return; + } else if (OutboundDataSize > 0) { + bGotExtraKqueueEvent = false; + } + } + #endif + + _WriteOutboundData(); + } +} + + +/**************************************** +ConnectionDescriptor::_WriteOutboundData +****************************************/ + +void ConnectionDescriptor::_WriteOutboundData() +{ + /* This is a helper function called by ::Write. + * It's possible for a socket to select writable and then no longer + * be writable by the time we get around to writing. The kernel might + * have used up its available output buffers between the select call + * and when we get here. So this condition is not an error. + * + * 20Jul07, added the same kind of protection against an invalid socket + * that is at the top of ::Read. Not entirely how this could happen in + * real life (connection-reset from the remote peer, perhaps?), but I'm + * doing it to address some reports of crashing under heavy loads. + */ + + SOCKET sd = GetSocket(); + //assert (sd != INVALID_SOCKET); + if (sd == INVALID_SOCKET) { + assert (!bWriteAttemptedAfterClose); + bWriteAttemptedAfterClose = true; + return; + } + + LastActivity = MyEventMachine->GetCurrentLoopTime(); + size_t nbytes = 0; + + #ifdef HAVE_WRITEV + int iovcnt = OutboundPages.size(); + // Max of 16 outbound pages at a time + if (iovcnt > 16) iovcnt = 16; + + iovec iov[16]; + + for(int i = 0; i < iovcnt; i++){ + OutboundPage *op = &(OutboundPages[i]); + #ifdef CC_SUNWspro + // TODO: The void * cast works fine on Solaris 11, but + // I don't know at what point that changed from older Solaris. + iov[i].iov_base = (char *)(op->Buffer + op->Offset); + #else + iov[i].iov_base = (void *)(op->Buffer + op->Offset); + #endif + iov[i].iov_len = op->Length - op->Offset; + + nbytes += iov[i].iov_len; + } + #else + char output_buffer [16 * 1024]; + + while ((OutboundPages.size() > 0) && (nbytes < sizeof(output_buffer))) { + OutboundPage *op = &(OutboundPages[0]); + if ((nbytes + op->Length - op->Offset) < sizeof (output_buffer)) { + memcpy (output_buffer + nbytes, op->Buffer + op->Offset, op->Length - op->Offset); + nbytes += (op->Length - op->Offset); + op->Free(); + OutboundPages.pop_front(); + } + else { + int len = sizeof(output_buffer) - nbytes; + memcpy (output_buffer + nbytes, op->Buffer + op->Offset, len); + op->Offset += len; + nbytes += len; + } + } + #endif + + // We should never have gotten here if there were no data to write, + // so assert that as a sanity check. + // Don't bother to make sure nbytes is less than output_buffer because + // if it were we probably would have crashed already. + assert (nbytes > 0); + + assert (GetSocket() != INVALID_SOCKET); + #ifdef HAVE_WRITEV + int bytes_written = writev (GetSocket(), iov, iovcnt); + #else + int bytes_written = write (GetSocket(), output_buffer, nbytes); + #endif + + bool err = false; +#ifdef OS_WIN32 + int e = WSAGetLastError(); +#else + int e = errno; +#endif + if (bytes_written < 0) { + err = true; + bytes_written = 0; + } + + assert (bytes_written >= 0); + OutboundDataSize -= bytes_written; + + if (ProxiedFrom && MaxOutboundBufSize && (unsigned int)GetOutboundDataSize() < MaxOutboundBufSize && ProxiedFrom->IsPaused()) + ProxiedFrom->Resume(); + + #ifdef HAVE_WRITEV + if (!err) { + unsigned int sent = bytes_written; + std::deque<OutboundPage>::iterator op = OutboundPages.begin(); + + for (int i = 0; i < iovcnt; i++) { + if (iov[i].iov_len <= sent) { + // Sent this page in full, free it. + op->Free(); + OutboundPages.pop_front(); + + sent -= iov[i].iov_len; + } else { + // Sent part (or none) of this page, increment offset to send the remainder + op->Offset += sent; + break; + } + + // Shouldn't be possible run out of pages before the loop ends + assert(op != OutboundPages.end()); + *op++; + } + } + #else + if ((size_t)bytes_written < nbytes) { + int len = nbytes - bytes_written; + char *buffer = (char*) malloc (len + 1); + if (!buffer) + throw std::runtime_error ("bad alloc throwing back data"); + memcpy (buffer, output_buffer + bytes_written, len); + buffer [len] = 0; + OutboundPages.push_front (OutboundPage (buffer, len)); + } + #endif + + _UpdateEvents(false, true); + + if (err) { + #ifdef OS_UNIX + if ((e != EINPROGRESS) && (e != EWOULDBLOCK) && (e != EINTR)) { + #endif + #ifdef OS_WIN32 + if ((e != WSAEINPROGRESS) && (e != WSAEWOULDBLOCK)) { + #endif + UnbindReasonCode = e; + Close(); + } + } +} + + +/*************************************** +ConnectionDescriptor::ReportErrorStatus +***************************************/ + +int ConnectionDescriptor::ReportErrorStatus() +{ + if (MySocket == INVALID_SOCKET) { + return -1; + } + + int error; + socklen_t len; + len = sizeof(error); + #ifdef OS_UNIX + int o = getsockopt (GetSocket(), SOL_SOCKET, SO_ERROR, &error, &len); + #endif + #ifdef OS_WIN32 + int o = getsockopt (GetSocket(), SOL_SOCKET, SO_ERROR, (char*)&error, &len); + #endif + if ((o == 0) && (error == 0)) + return 0; + else if (o == 0) + return error; + else + return -1; +} + + +/****************************** +ConnectionDescriptor::StartTls +******************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::StartTls() +{ + if (SslBox) + throw std::runtime_error ("SSL/TLS already running on connection"); + + SslBox = new SslBox_t (bIsServer, PrivateKeyFilename, CertChainFilename, bSslVerifyPeer, bSslFailIfNoPeerCert, SniHostName, CipherList, EcdhCurve, DhParam, Protocols, GetBinding()); + _DispatchCiphertext(); + +} +#else +void ConnectionDescriptor::StartTls() +{ + throw std::runtime_error ("Encryption not available on this event-machine"); +} +#endif + + +/********************************* +ConnectionDescriptor::SetTlsParms +*********************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer, bool fail_if_no_peer_cert, const char *sni_hostname, const char *cipherlist, const char *ecdh_curve, const char *dhparam, int protocols) +{ + if (SslBox) + throw std::runtime_error ("call SetTlsParms before calling StartTls"); + if (privkey_filename && *privkey_filename) + PrivateKeyFilename = privkey_filename; + if (certchain_filename && *certchain_filename) + CertChainFilename = certchain_filename; + bSslVerifyPeer = verify_peer; + bSslFailIfNoPeerCert = fail_if_no_peer_cert; + + if (sni_hostname && *sni_hostname) + SniHostName = sni_hostname; + if (cipherlist && *cipherlist) + CipherList = cipherlist; + if (ecdh_curve && *ecdh_curve) + EcdhCurve = ecdh_curve; + if (dhparam && *dhparam) + DhParam = dhparam; + + Protocols = protocols; +} +#else +void ConnectionDescriptor::SetTlsParms (const char *privkey_filename UNUSED, const char *certchain_filename UNUSED, bool verify_peer UNUSED, bool fail_if_no_peer_cert UNUSED, const char *sni_hostname UNUSED, const char *cipherlist UNUSED, const char *ecdh_curve UNUSED, const char *dhparam UNUSED, int protocols UNUSED) +{ + throw std::runtime_error ("Encryption not available on this event-machine"); +} +#endif + + +/********************************* +ConnectionDescriptor::GetPeerCert +*********************************/ + +#ifdef WITH_SSL +X509 *ConnectionDescriptor::GetPeerCert() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetPeerCert(); +} +#endif + + +/********************************* +ConnectionDescriptor::GetCipherBits +*********************************/ + +#ifdef WITH_SSL +int ConnectionDescriptor::GetCipherBits() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetCipherBits(); +} +#endif + + +/********************************* +ConnectionDescriptor::GetCipherName +*********************************/ + +#ifdef WITH_SSL +const char *ConnectionDescriptor::GetCipherName() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetCipherName(); +} +#endif + + +/********************************* +ConnectionDescriptor::GetCipherProtocol +*********************************/ + +#ifdef WITH_SSL +const char *ConnectionDescriptor::GetCipherProtocol() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetCipherProtocol(); +} +#endif + + +/********************************* +ConnectionDescriptor::GetSNIHostname +*********************************/ + +#ifdef WITH_SSL +const char *ConnectionDescriptor::GetSNIHostname() +{ + if (!SslBox) + throw std::runtime_error ("SSL/TLS not running on this connection"); + return SslBox->GetSNIHostname(); +} +#endif + + +/*********************************** +ConnectionDescriptor::VerifySslPeer +***********************************/ + +#ifdef WITH_SSL +bool ConnectionDescriptor::VerifySslPeer(const char *cert) +{ + bSslPeerAccepted = false; + + if (EventCallback) + (*EventCallback)(GetBinding(), EM_SSL_VERIFY, cert, strlen(cert)); + + return bSslPeerAccepted; +} +#endif + + +/*********************************** +ConnectionDescriptor::AcceptSslPeer +***********************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::AcceptSslPeer() +{ + bSslPeerAccepted = true; +} +#endif + + +/***************************************** +ConnectionDescriptor::_DispatchCiphertext +*****************************************/ + +#ifdef WITH_SSL +void ConnectionDescriptor::_DispatchCiphertext() +{ + assert (SslBox); + + + char BigBuf [SSLBOX_OUTPUT_CHUNKSIZE]; + bool did_work; + + do { + did_work = false; + + // try to drain ciphertext + while (SslBox->CanGetCiphertext()) { + int r = SslBox->GetCiphertext (BigBuf, sizeof(BigBuf)); + assert (r > 0); + _SendRawOutboundData (BigBuf, r); + did_work = true; + } + + // Pump the SslBox, in case it has queued outgoing plaintext + // This will return >0 if data was written, + // 0 if no data was written, and <0 if there was a fatal error. + bool pump; + do { + pump = false; + int w = SslBox->PutPlaintext (NULL, 0); + if (w > 0) { + did_work = true; + pump = true; + } + else if (w < 0) + ScheduleClose (false); + } while (pump); + + // try to put plaintext. INCOMPLETE, doesn't belong here? + // In SendOutboundData, we're spooling plaintext directly + // into SslBox. That may be wrong, we may need to buffer it + // up here! + /* + const char *ptr; + int ptr_length; + while (OutboundPlaintext.GetPage (&ptr, &ptr_length)) { + assert (ptr && (ptr_length > 0)); + int w = SslMachine.PutPlaintext (ptr, ptr_length); + if (w > 0) { + OutboundPlaintext.DiscardBytes (w); + did_work = true; + } + else + break; + } + */ + + } while (did_work); + +} +#endif + + + +/******************************* +ConnectionDescriptor::Heartbeat +*******************************/ + +void ConnectionDescriptor::Heartbeat() +{ + /* Only allow a certain amount of time to go by while waiting + * for a pending connect. If it expires, then kill the socket. + * For a connected socket, close it if its inactivity timer + * has expired. + */ + + if (bConnectPending) { + if ((MyEventMachine->GetCurrentLoopTime() - CreatedAt) >= PendingConnectTimeout) { + UnbindReasonCode = ETIMEDOUT; + ScheduleClose (false); + //bCloseNow = true; + } + } + else { + if (InactivityTimeout && ((MyEventMachine->GetCurrentLoopTime() - LastActivity) >= InactivityTimeout)) { + UnbindReasonCode = ETIMEDOUT; + ScheduleClose (false); + //bCloseNow = true; + } + } +} + + +/**************************************** +LoopbreakDescriptor::LoopbreakDescriptor +****************************************/ + +LoopbreakDescriptor::LoopbreakDescriptor (SOCKET sd, EventMachine_t *parent_em): + EventableDescriptor (sd, parent_em) +{ + /* This is really bad and ugly. Change someday if possible. + * We have to know about an event-machine (probably the one that owns us), + * so we can pass newly-created connections to it. + */ + + bCallbackUnbind = false; + + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + #ifdef HAVE_KQUEUE + MyEventMachine->ArmKqueueReader (this); + #endif +} + + + + +/************************* +LoopbreakDescriptor::Read +*************************/ + +void LoopbreakDescriptor::Read() +{ + // TODO, refactor, this code is probably in the wrong place. + assert (MyEventMachine); + MyEventMachine->_ReadLoopBreaker(); +} + + +/************************** +LoopbreakDescriptor::Write +**************************/ + +void LoopbreakDescriptor::Write() +{ + // Why are we here? + throw std::runtime_error ("bad code path in loopbreak"); +} + +/************************************** +AcceptorDescriptor::AcceptorDescriptor +**************************************/ + +AcceptorDescriptor::AcceptorDescriptor (SOCKET sd, EventMachine_t *parent_em): + EventableDescriptor (sd, parent_em) +{ + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + #ifdef HAVE_KQUEUE + MyEventMachine->ArmKqueueReader (this); + #endif +} + + +/*************************************** +AcceptorDescriptor::~AcceptorDescriptor +***************************************/ + +AcceptorDescriptor::~AcceptorDescriptor() +{ +} + +/**************************************** +STATIC: AcceptorDescriptor::StopAcceptor +****************************************/ + +void AcceptorDescriptor::StopAcceptor (const uintptr_t binding) +{ + // TODO: This is something of a hack, or at least it's a static method of the wrong class. + AcceptorDescriptor *ad = dynamic_cast <AcceptorDescriptor*> (Bindable_t::GetObject (binding)); + if (ad) + ad->ScheduleClose (false); + else + throw std::runtime_error ("failed to close nonexistent acceptor"); +} + + +/************************ +AcceptorDescriptor::Read +************************/ + +void AcceptorDescriptor::Read() +{ + /* Accept up to a certain number of sockets on the listening connection. + * Don't try to accept all that are present, because this would allow a DoS attack + * in which no data were ever read or written. We should accept more than one, + * if available, to keep the partially accepted sockets from backing up in the kernel. + */ + + /* Make sure we use non-blocking i/o on the acceptor socket, since we're selecting it + * for readability. According to Stevens UNP, it's possible for an acceptor to select readable + * and then block when we call accept. For example, the other end resets the connection after + * the socket selects readable and before we call accept. The kernel will remove the dead + * socket from the accept queue. If the accept queue is now empty, accept will block. + */ + + + struct sockaddr_in6 pin; + socklen_t addrlen = sizeof (pin); + int accept_count = EventMachine_t::GetSimultaneousAcceptCount(); + + for (int i=0; i < accept_count; i++) { +#if defined(HAVE_CONST_SOCK_CLOEXEC) && defined(HAVE_ACCEPT4) + SOCKET sd = accept4 (GetSocket(), (struct sockaddr*)&pin, &addrlen, SOCK_CLOEXEC); + if (sd == INVALID_SOCKET) { + // We may be running in a kernel where + // SOCK_CLOEXEC is not supported - fall back: + sd = accept (GetSocket(), (struct sockaddr*)&pin, &addrlen); + } +#else + SOCKET sd = accept (GetSocket(), (struct sockaddr*)&pin, &addrlen); +#endif + if (sd == INVALID_SOCKET) { + // This breaks the loop when we've accepted everything on the kernel queue, + // up to 10 new connections. But what if the *first* accept fails? + // Does that mean anything serious is happening, beyond the situation + // described in the note above? + break; + } + + // Set the newly-accepted socket non-blocking and to close on exec. + // On Windows, this may fail because, weirdly, Windows inherits the non-blocking + // attribute that we applied to the acceptor socket into the accepted one. + if (!SetFdCloexec(sd) || !SetSocketNonblocking (sd)) { + //int val = fcntl (sd, F_GETFL, 0); + //if (fcntl (sd, F_SETFL, val | O_NONBLOCK) == -1) { + shutdown (sd, 1); + close (sd); + continue; + } + + // Disable slow-start (Nagle algorithm). Eventually make this configurable. + int one = 1; + setsockopt (sd, IPPROTO_TCP, TCP_NODELAY, (char*) &one, sizeof(one)); + + + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, MyEventMachine); + if (!cd) + throw std::runtime_error ("no newly accepted connection"); + cd->SetServerMode(); + if (EventCallback) { + (*EventCallback) (GetBinding(), EM_CONNECTION_ACCEPTED, NULL, cd->GetBinding()); + } + #ifdef HAVE_EPOLL + cd->GetEpollEvent()->events = 0; + if (cd->SelectForRead()) + cd->GetEpollEvent()->events |= EPOLLIN; + if (cd->SelectForWrite()) + cd->GetEpollEvent()->events |= EPOLLOUT; + #endif + assert (MyEventMachine); + MyEventMachine->Add (cd); + #ifdef HAVE_KQUEUE + bKqueueArmWrite = cd->SelectForWrite(); + if (bKqueueArmWrite) + MyEventMachine->Modify (cd); + if (cd->SelectForRead()) + MyEventMachine->ArmKqueueReader (cd); + #endif + } + +} + + +/************************* +AcceptorDescriptor::Write +*************************/ + +void AcceptorDescriptor::Write() +{ + // Why are we here? + throw std::runtime_error ("bad code path in acceptor"); +} + + +/***************************** +AcceptorDescriptor::Heartbeat +*****************************/ + +void AcceptorDescriptor::Heartbeat() +{ + // No-op +} + + +/************************************** +DatagramDescriptor::DatagramDescriptor +**************************************/ + +DatagramDescriptor::DatagramDescriptor (SOCKET sd, EventMachine_t *parent_em): + EventableDescriptor (sd, parent_em), + OutboundDataSize (0) +{ + memset (&ReturnAddress, 0, sizeof(ReturnAddress)); + + /* Provisionally added 19Oct07. All datagram sockets support broadcasting. + * Until now, sending to a broadcast address would give EACCES (permission denied) + * on systems like Linux and BSD that require the SO_BROADCAST socket-option in order + * to accept a packet to a broadcast address. Solaris doesn't require it. I think + * Windows DOES require it but I'm not sure. + * + * Ruby does NOT do what we're doing here. In Ruby, you have to explicitly set SO_BROADCAST + * on a UDP socket in order to enable broadcasting. The reason for requiring the option + * in the first place is so that applications don't send broadcast datagrams by mistake. + * I imagine that could happen if a user of an application typed in an address that happened + * to be a broadcast address on that particular subnet. + * + * This is provisional because someone may eventually come up with a good reason not to + * do it for all UDP sockets. If that happens, then we'll need to add a usercode-level API + * to set the socket option, just like Ruby does. AND WE'LL ALSO BREAK CODE THAT DOESN'T + * EXPLICITLY SET THE OPTION. + */ + + int oval = 1; + setsockopt (GetSocket(), SOL_SOCKET, SO_BROADCAST, (char*)&oval, sizeof(oval)); + + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + #ifdef HAVE_KQUEUE + MyEventMachine->ArmKqueueReader (this); + #endif +} + + +/*************************************** +DatagramDescriptor::~DatagramDescriptor +***************************************/ + +DatagramDescriptor::~DatagramDescriptor() +{ + // Run down any stranded outbound data. + for (size_t i=0; i < OutboundPages.size(); i++) + OutboundPages[i].Free(); +} + + +/***************************** +DatagramDescriptor::Heartbeat +*****************************/ + +void DatagramDescriptor::Heartbeat() +{ + // Close it if its inactivity timer has expired. + + if (InactivityTimeout && ((MyEventMachine->GetCurrentLoopTime() - LastActivity) >= InactivityTimeout)) + ScheduleClose (false); + //bCloseNow = true; +} + + +/************************ +DatagramDescriptor::Read +************************/ + +void DatagramDescriptor::Read() +{ + SOCKET sd = GetSocket(); + assert (sd != INVALID_SOCKET); + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + // This is an extremely large read buffer. + // In many cases you wouldn't expect to get any more than 4K. + char readbuffer [16 * 1024]; + + for (int i=0; i < 10; i++) { + // Don't read just one buffer and then move on. This is faster + // if there is a lot of incoming. + // But don't read indefinitely. Give other sockets a chance to run. + // NOTICE, we're reading one less than the buffer size. + // That's so we can put a guard byte at the end of what we send + // to user code. + + struct sockaddr_in6 sin; + socklen_t slen = sizeof (sin); + memset (&sin, 0, slen); + + int r = recvfrom (sd, readbuffer, sizeof(readbuffer) - 1, 0, (struct sockaddr*)&sin, &slen); + //cerr << "<R:" << r << ">"; + + // In UDP, a zero-length packet is perfectly legal. + if (r >= 0) { + + // Add a null-terminator at the the end of the buffer + // that we will send to the callback. + // DO NOT EVER CHANGE THIS. We want to explicitly allow users + // to be able to depend on this behavior, so they will have + // the option to do some things faster. Additionally it's + // a security guard against buffer overflows. + readbuffer [r] = 0; + + + // Set up a "temporary" return address so that callers can "reply" to us + // from within the callback we are about to invoke. That means that ordinary + // calls to "send_data_to_connection" (which is of course misnamed in this + // case) will result in packets being sent back to the same place that sent + // us this one. + // There is a different call (evma_send_datagram) for cases where the caller + // actually wants to send a packet somewhere else. + + memset (&ReturnAddress, 0, sizeof(ReturnAddress)); + memcpy (&ReturnAddress, &sin, slen); + + _GenericInboundDispatch(readbuffer, r); + + } + else { + // Basically a would-block, meaning we've read everything there is to read. + break; + } + + } + + +} + + +/************************* +DatagramDescriptor::Write +*************************/ + +void DatagramDescriptor::Write() +{ + /* It's possible for a socket to select writable and then no longer + * be writable by the time we get around to writing. The kernel might + * have used up its available output buffers between the select call + * and when we get here. So this condition is not an error. + * This code is very reminiscent of ConnectionDescriptor::_WriteOutboundData, + * but differs in the that the outbound data pages (received from the + * user) are _message-structured._ That is, we send each of them out + * one message at a time. + * TODO, we are currently suppressing the EMSGSIZE error!!! + */ + + SOCKET sd = GetSocket(); + assert (sd != INVALID_SOCKET); + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + assert (OutboundPages.size() > 0); + + // Send out up to 10 packets, then cycle the machine. + for (int i = 0; i < 10; i++) { + if (OutboundPages.size() <= 0) + break; + OutboundPage *op = &(OutboundPages[0]); + + // The nasty cast to (char*) is needed because Windows is brain-dead. + int s = sendto (sd, (char*)op->Buffer, op->Length, 0, (struct sockaddr*)&(op->From), + (op->From.sin6_family == AF_INET6 ? sizeof (struct sockaddr_in6) : sizeof (struct sockaddr_in))); +#ifdef OS_WIN32 + int e = WSAGetLastError(); +#else + int e = errno; +#endif + + OutboundDataSize -= op->Length; + op->Free(); + OutboundPages.pop_front(); + + if (s == SOCKET_ERROR) { + #ifdef OS_UNIX + if ((e != EINPROGRESS) && (e != EWOULDBLOCK) && (e != EINTR)) { + #endif + #ifdef OS_WIN32 + if ((e != WSAEINPROGRESS) && (e != WSAEWOULDBLOCK)) { + #endif + UnbindReasonCode = e; + Close(); + break; + } + } + } + + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + if (SelectForWrite()) + EpollEvent.events |= EPOLLOUT; + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + #ifdef HAVE_KQUEUE + bKqueueArmWrite = SelectForWrite(); + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif +} + + +/********************************** +DatagramDescriptor::SelectForWrite +**********************************/ + +bool DatagramDescriptor::SelectForWrite() +{ + /* Changed 15Nov07, per bug report by Mark Zvillius. + * The outbound data size will be zero if there are zero-length outbound packets, + * so we now select writable in case the outbound page buffer is not empty. + * Note that the superclass ShouldDelete method still checks for outbound data size, + * which may be wrong. + */ + //return (GetOutboundDataSize() > 0); (Original) + return (OutboundPages.size() > 0); +} + + +/************************************ +DatagramDescriptor::SendOutboundData +************************************/ + +int DatagramDescriptor::SendOutboundData (const char *data, unsigned long length) +{ + // This is almost an exact clone of ConnectionDescriptor::_SendRawOutboundData. + // That means most of it could be factored to a common ancestor. Note that + // empty datagrams are meaningful, which isn't the case for TCP streams. + + if (IsCloseScheduled()) + return 0; + + if (!data && (length > 0)) + throw std::runtime_error ("bad outbound data"); + char *buffer = (char *) malloc (length + 1); + if (!buffer) + throw std::runtime_error ("no allocation for outbound data"); + memcpy (buffer, data, length); + buffer [length] = 0; + OutboundPages.push_back (OutboundPage (buffer, length, ReturnAddress)); + OutboundDataSize += length; + + #ifdef HAVE_EPOLL + EpollEvent.events = (EPOLLIN | EPOLLOUT); + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + #ifdef HAVE_KQUEUE + bKqueueArmWrite = true; + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + + return length; +} + + +/**************************************** +DatagramDescriptor::SendOutboundDatagram +****************************************/ + +int DatagramDescriptor::SendOutboundDatagram (const char *data, unsigned long length, const char *address, int port) +{ + // This is an exact clone of ConnectionDescriptor::SendOutboundData. + // That means it needs to move to a common ancestor. + // TODO: Refactor this so there's no overlap with SendOutboundData. + + if (IsCloseScheduled()) + //if (bCloseNow || bCloseAfterWriting) + return 0; + + if (!address || !*address || !port) + return 0; + + struct sockaddr_in6 addr_here; + size_t addr_here_len = sizeof addr_here; + if (0 != EventMachine_t::name2address (address, port, SOCK_DGRAM, (struct sockaddr *)&addr_here, &addr_here_len)) + return -1; + + if (!data && (length > 0)) + throw std::runtime_error ("bad outbound data"); + char *buffer = (char *) malloc (length + 1); + if (!buffer) + throw std::runtime_error ("no allocation for outbound data"); + memcpy (buffer, data, length); + buffer [length] = 0; + OutboundPages.push_back (OutboundPage (buffer, length, addr_here)); + OutboundDataSize += length; + + #ifdef HAVE_EPOLL + EpollEvent.events = (EPOLLIN | EPOLLOUT); + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + #ifdef HAVE_KQUEUE + bKqueueArmWrite = true; + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + + return length; +} + + +/********************************************** +ConnectionDescriptor::GetCommInactivityTimeout +**********************************************/ + +uint64_t ConnectionDescriptor::GetCommInactivityTimeout() +{ + return InactivityTimeout / 1000; +} + + +/********************************************** +ConnectionDescriptor::SetCommInactivityTimeout +**********************************************/ + +int ConnectionDescriptor::SetCommInactivityTimeout (uint64_t value) +{ + InactivityTimeout = value * 1000; + MyEventMachine->QueueHeartbeat(this); + return 1; +} + +/******************************* +DatagramDescriptor::GetPeername +*******************************/ + +bool DatagramDescriptor::GetPeername (struct sockaddr *s, socklen_t *len) +{ + bool ok = false; + if (s) { + *len = sizeof(ReturnAddress); + memset (s, 0, sizeof(ReturnAddress)); + memcpy (s, &ReturnAddress, sizeof(ReturnAddress)); + ok = true; + } + return ok; +} + + +/******************************************** +DatagramDescriptor::GetCommInactivityTimeout +********************************************/ + +uint64_t DatagramDescriptor::GetCommInactivityTimeout() +{ + return InactivityTimeout / 1000; +} + +/******************************************** +DatagramDescriptor::SetCommInactivityTimeout +********************************************/ + +int DatagramDescriptor::SetCommInactivityTimeout (uint64_t value) +{ + if (value > 0) { + InactivityTimeout = value * 1000; + MyEventMachine->QueueHeartbeat(this); + return 1; + } + return 0; +} + + +/************************************ +InotifyDescriptor::InotifyDescriptor +*************************************/ + +InotifyDescriptor::InotifyDescriptor (EventMachine_t *em): + EventableDescriptor(0, em) +{ + bCallbackUnbind = false; + + #ifndef HAVE_INOTIFY + throw std::runtime_error("no inotify support on this system"); + #else + + int fd = inotify_init(); + if (fd == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to create inotify descriptor: %s", strerror(errno)); + throw std::runtime_error (buf); + } + + MySocket = fd; + SetSocketNonblocking(MySocket); + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + + #endif +} + + +/************************************* +InotifyDescriptor::~InotifyDescriptor +**************************************/ + +InotifyDescriptor::~InotifyDescriptor() +{ + close(MySocket); + MySocket = INVALID_SOCKET; +} + +/*********************** +InotifyDescriptor::Read +************************/ + +void InotifyDescriptor::Read() +{ + assert (MyEventMachine); + MyEventMachine->_ReadInotifyEvents(); +} + + +/************************ +InotifyDescriptor::Write +*************************/ + +void InotifyDescriptor::Write() +{ + throw std::runtime_error("bad code path in inotify"); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ed.h b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ed.h new file mode 100644 index 000000000000..4d7f7d4e3096 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ed.h @@ -0,0 +1,457 @@ +/***************************************************************************** + +$Id$ + +File: ed.h +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#ifndef __EventableDescriptor__H_ +#define __EventableDescriptor__H_ + + +class EventMachine_t; // forward reference +#ifdef WITH_SSL +class SslBox_t; // forward reference +#endif + +bool SetSocketNonblocking (SOCKET); +bool SetFdCloexec (int); + +/************************* +class EventableDescriptor +*************************/ + +class EventableDescriptor: public Bindable_t +{ + public: + EventableDescriptor (SOCKET, EventMachine_t*); + virtual ~EventableDescriptor() NO_EXCEPT_FALSE; + + SOCKET GetSocket() {return MySocket;} + void SetSocketInvalid() { MySocket = INVALID_SOCKET; } + void Close(); + + virtual void Read() = 0; + virtual void Write() = 0; + virtual void Heartbeat() = 0; + + // These methods tell us whether the descriptor + // should be selected or polled for read/write. + virtual bool SelectForRead() = 0; + virtual bool SelectForWrite() = 0; + + // are we scheduled for a close, or in an error state, or already closed? + bool ShouldDelete(); + // Do we have any data to write? This is used by ShouldDelete. + virtual int GetOutboundDataSize() {return 0;} + virtual bool IsWatchOnly(){ return bWatchOnly; } + + virtual void ScheduleClose (bool after_writing); + bool IsCloseScheduled(); + virtual void HandleError(){ ScheduleClose (false); } + + void SetEventCallback (EMCallback); + + virtual bool GetPeername (struct sockaddr*, socklen_t*) = 0; + virtual bool GetSockname (struct sockaddr*, socklen_t*) = 0; + virtual bool GetSubprocessPid (pid_t*) {return false;} + + virtual void StartTls() {} + virtual void SetTlsParms (const char *, const char *, bool, bool, const char *, const char *, const char *, const char *, int) {} + + #ifdef WITH_SSL + virtual X509 *GetPeerCert() {return NULL;} + virtual int GetCipherBits() {return -1;} + virtual const char *GetCipherName() {return NULL;} + virtual const char *GetCipherProtocol() {return NULL;} + virtual const char *GetSNIHostname() {return NULL;} + #endif + + virtual uint64_t GetCommInactivityTimeout() {return 0;} + virtual int SetCommInactivityTimeout (uint64_t) {return 0;} + uint64_t GetPendingConnectTimeout(); + int SetPendingConnectTimeout (uint64_t value); + uint64_t GetLastActivity() { return LastActivity; } + + #ifdef HAVE_EPOLL + struct epoll_event *GetEpollEvent() { return &EpollEvent; } + #endif + + #ifdef HAVE_KQUEUE + bool GetKqueueArmWrite() { return bKqueueArmWrite; } + #endif + + virtual void StartProxy(const uintptr_t, const unsigned long, const unsigned long); + virtual void StopProxy(); + virtual unsigned long GetProxiedBytes(){ return ProxiedBytes; }; + virtual void SetProxiedFrom(EventableDescriptor*, const unsigned long); + virtual int SendOutboundData(const char*,unsigned long){ return -1; } + virtual bool IsPaused(){ return bPaused; } + virtual bool Pause(){ bPaused = true; return bPaused; } + virtual bool Resume(){ bPaused = false; return bPaused; } + + void SetUnbindReasonCode(int code){ UnbindReasonCode = code; } + virtual int ReportErrorStatus(){ return 0; } + virtual bool IsConnectPending(){ return false; } + virtual uint64_t GetNextHeartbeat(); + + private: + bool bCloseNow; + bool bCloseAfterWriting; + + protected: + SOCKET MySocket; + bool bAttached; + bool bWatchOnly; + + EMCallback EventCallback; + void _GenericInboundDispatch (const char *buffer, unsigned long size); + bool _GenericGetPeername (struct sockaddr*, socklen_t*); + bool _GenericGetSockname (struct sockaddr*, socklen_t*); + + uint64_t CreatedAt; + bool bCallbackUnbind; + int UnbindReasonCode; + + unsigned long BytesToProxy; + EventableDescriptor *ProxyTarget; + EventableDescriptor *ProxiedFrom; + unsigned long ProxiedBytes; + + unsigned long MaxOutboundBufSize; + + #ifdef HAVE_EPOLL + struct epoll_event EpollEvent; + #endif + + #ifdef HAVE_KQUEUE + bool bKqueueArmWrite; + #endif + + EventMachine_t *MyEventMachine; + uint64_t PendingConnectTimeout; + uint64_t InactivityTimeout; + uint64_t LastActivity; + uint64_t NextHeartbeat; + bool bPaused; +}; + + + +/************************* +class LoopbreakDescriptor +*************************/ + +class LoopbreakDescriptor: public EventableDescriptor +{ + public: + LoopbreakDescriptor (SOCKET, EventMachine_t*); + virtual ~LoopbreakDescriptor() {} + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat() {} + + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite() {return false;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); } +}; + + +/************************** +class ConnectionDescriptor +**************************/ + +class ConnectionDescriptor: public EventableDescriptor +{ + public: + ConnectionDescriptor (SOCKET, EventMachine_t*); + virtual ~ConnectionDescriptor(); + + int SendOutboundData (const char*, unsigned long); + + void SetConnectPending (bool f); + virtual void ScheduleClose (bool after_writing); + virtual void HandleError(); + + void SetNotifyReadable (bool); + void SetNotifyWritable (bool); + void SetAttached (bool); + void SetWatchOnly (bool); + + bool Pause(); + bool Resume(); + + bool IsNotifyReadable(){ return bNotifyReadable; } + bool IsNotifyWritable(){ return bNotifyWritable; } + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead(); + virtual bool SelectForWrite(); + + // Do we have any data to write? This is used by ShouldDelete. + virtual int GetOutboundDataSize() {return OutboundDataSize;} + + virtual void StartTls(); + virtual void SetTlsParms (const char *, const char *, bool, bool, const char *, const char *, const char *, const char *, int); + + #ifdef WITH_SSL + virtual X509 *GetPeerCert(); + virtual int GetCipherBits(); + virtual const char *GetCipherName(); + virtual const char *GetCipherProtocol(); + virtual const char *GetSNIHostname(); + virtual bool VerifySslPeer(const char*); + virtual void AcceptSslPeer(); + #endif + + void SetServerMode() {bIsServer = true;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); } + + virtual uint64_t GetCommInactivityTimeout(); + virtual int SetCommInactivityTimeout (uint64_t value); + + virtual int ReportErrorStatus(); + virtual bool IsConnectPending(){ return bConnectPending; } + + protected: + struct OutboundPage { + OutboundPage (const char *b, int l, int o=0): Buffer(b), Length(l), Offset(o) {} + void Free() {if (Buffer) free (const_cast<char*>(Buffer)); } + const char *Buffer; + int Length; + int Offset; + }; + + protected: + bool bConnectPending; + + bool bNotifyReadable; + bool bNotifyWritable; + + bool bReadAttemptedAfterClose; + bool bWriteAttemptedAfterClose; + + std::deque<OutboundPage> OutboundPages; + int OutboundDataSize; + + #ifdef WITH_SSL + SslBox_t *SslBox; + std::string CertChainFilename; + std::string PrivateKeyFilename; + std::string CipherList; + std::string EcdhCurve; + std::string DhParam; + int Protocols; + bool bHandshakeSignaled; + bool bSslVerifyPeer; + bool bSslFailIfNoPeerCert; + std::string SniHostName; + bool bSslPeerAccepted; + #endif + + #ifdef HAVE_KQUEUE + bool bGotExtraKqueueEvent; + #endif + + bool bIsServer; + + private: + void _UpdateEvents(); + void _UpdateEvents(bool, bool); + void _WriteOutboundData(); + void _DispatchInboundData (const char *buffer, unsigned long size); + void _DispatchCiphertext(); + int _SendRawOutboundData (const char *buffer, unsigned long size); + void _CheckHandshakeStatus(); + +}; + + +/************************ +class DatagramDescriptor +************************/ + +class DatagramDescriptor: public EventableDescriptor +{ + public: + DatagramDescriptor (SOCKET, EventMachine_t*); + virtual ~DatagramDescriptor(); + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite(); + + int SendOutboundData (const char*, unsigned long); + int SendOutboundDatagram (const char*, unsigned long, const char*, int); + + // Do we have any data to write? This is used by ShouldDelete. + virtual int GetOutboundDataSize() {return OutboundDataSize;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len); + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); }; + + virtual uint64_t GetCommInactivityTimeout(); + virtual int SetCommInactivityTimeout (uint64_t value); + + protected: + struct OutboundPage { + OutboundPage (const char *b, int l, struct sockaddr_in6 f, int o=0): Buffer(b), Length(l), Offset(o), From(f) {} + void Free() {if (Buffer) free (const_cast<char*>(Buffer)); } + const char *Buffer; + int Length; + int Offset; + struct sockaddr_in6 From; + }; + + std::deque<OutboundPage> OutboundPages; + int OutboundDataSize; + + struct sockaddr_in6 ReturnAddress; +}; + + +/************************ +class AcceptorDescriptor +************************/ + +class AcceptorDescriptor: public EventableDescriptor +{ + public: + AcceptorDescriptor (SOCKET, EventMachine_t*); + virtual ~AcceptorDescriptor(); + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite() {return false;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); }; + + static void StopAcceptor (const uintptr_t binding); +}; + +/******************** +class PipeDescriptor +********************/ + +#ifdef OS_UNIX +class PipeDescriptor: public EventableDescriptor +{ + public: + PipeDescriptor (SOCKET, pid_t, EventMachine_t*); + virtual ~PipeDescriptor() NO_EXCEPT_FALSE; + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead(); + virtual bool SelectForWrite(); + + int SendOutboundData (const char*, unsigned long); + virtual int GetOutboundDataSize() {return OutboundDataSize;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); } + + virtual bool GetSubprocessPid (pid_t*); + + protected: + struct OutboundPage { + OutboundPage (const char *b, int l, int o=0): Buffer(b), Length(l), Offset(o) {} + void Free() {if (Buffer) free (const_cast<char*>(Buffer)); } + const char *Buffer; + int Length; + int Offset; + }; + + protected: + bool bReadAttemptedAfterClose; + + std::deque<OutboundPage> OutboundPages; + int OutboundDataSize; + + pid_t SubprocessPid; + + private: + void _DispatchInboundData (const char *buffer, int size); +}; +#endif // OS_UNIX + + +/************************ +class KeyboardDescriptor +************************/ + +class KeyboardDescriptor: public EventableDescriptor +{ + public: + KeyboardDescriptor (EventMachine_t*); + virtual ~KeyboardDescriptor(); + + virtual void Read(); + virtual void Write(); + virtual void Heartbeat(); + + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite() {return false;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return _GenericGetPeername (s, len); } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return _GenericGetSockname (s, len); } + + protected: + bool bReadAttemptedAfterClose; + + private: + void _DispatchInboundData (const char *buffer, int size); +}; + + +/*********************** +class InotifyDescriptor +************************/ + +class InotifyDescriptor: public EventableDescriptor +{ + public: + InotifyDescriptor (EventMachine_t*); + virtual ~InotifyDescriptor(); + + void Read(); + void Write(); + + virtual void Heartbeat() {} + virtual bool SelectForRead() {return true;} + virtual bool SelectForWrite() {return false;} + + virtual bool GetPeername (struct sockaddr* s, socklen_t* len) { return false; } + virtual bool GetSockname (struct sockaddr* s, socklen_t* len) { return false; } +}; + +#endif // __EventableDescriptor__H_ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ed.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ed.o new file mode 100644 index 000000000000..304eddeb88a1 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ed.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/em.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/em.cpp new file mode 100644 index 000000000000..29074850b65d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/em.cpp @@ -0,0 +1,2396 @@ +/***************************************************************************** + +$Id$ + +File: em.cpp +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +// THIS ENTIRE FILE WILL EVENTUALLY BE FOR UNIX BUILDS ONLY. +//#ifdef OS_UNIX + +#include "project.h" + +/* The numer of max outstanding timers was once a const enum defined in em.h. + * Now we define it here so that users can change its value if necessary. + */ +static unsigned int MaxOutstandingTimers = 100000; + +/* The number of accept() done at once in a single tick when the acceptor + * socket becomes readable. + */ +static unsigned int SimultaneousAcceptCount = 10; + +/* Internal helper to create a socket with SOCK_CLOEXEC set, and fall + * back to fcntl'ing it if the headers/runtime don't support it. + */ +SOCKET EmSocket (int domain, int type, int protocol) +{ + SOCKET sd; +#ifdef HAVE_SOCKET_CLOEXEC + sd = socket (domain, type | SOCK_CLOEXEC, protocol); + if (sd == INVALID_SOCKET) { + sd = socket (domain, type, protocol); + if (sd < 0) { + return sd; + } + SetFdCloexec(sd); + } +#else + sd = socket (domain, type, protocol); + if (sd == INVALID_SOCKET) { + return sd; + } + SetFdCloexec(sd); +#endif + return sd; +} + + +/*************************************** +STATIC EventMachine_t::GetMaxTimerCount +***************************************/ + +int EventMachine_t::GetMaxTimerCount() +{ + return MaxOutstandingTimers; +} + + +/*************************************** +STATIC EventMachine_t::SetMaxTimerCount +***************************************/ + +void EventMachine_t::SetMaxTimerCount (int count) +{ + /* Allow a user to increase the maximum number of outstanding timers. + * If this gets "too high" (a metric that is of course platform dependent), + * bad things will happen like performance problems and possible overuse + * of memory. + * The actual timer mechanism is very efficient so it's hard to know what + * the practical max, but 100,000 shouldn't be too problematical. + */ + if (count < 100) + count = 100; + MaxOutstandingTimers = count; +} + +int EventMachine_t::GetSimultaneousAcceptCount() +{ + return SimultaneousAcceptCount; +} + +void EventMachine_t::SetSimultaneousAcceptCount (int count) +{ + if (count < 1) + count = 1; + SimultaneousAcceptCount = count; +} + + +/****************************** +EventMachine_t::EventMachine_t +******************************/ + +EventMachine_t::EventMachine_t (EMCallback event_callback, Poller_t poller): + NumCloseScheduled (0), + HeartbeatInterval(2000000), + EventCallback (event_callback), + LoopBreakerReader (INVALID_SOCKET), + LoopBreakerWriter (INVALID_SOCKET), + bTerminateSignalReceived (false), + Poller (poller), + epfd (-1), + kqfd (-1) + #ifdef HAVE_INOTIFY + , inotify (NULL) + #endif +{ + // Default time-slice is just smaller than one hundred mills. + Quantum.tv_sec = 0; + Quantum.tv_usec = 90000; + + // Override the requested poller back to default if needed. + #if !defined(HAVE_EPOLL) && !defined(HAVE_KQUEUE) + Poller = Poller_Default; + #endif + + /* Initialize monotonic timekeeping on OS X before the first call to GetRealTime */ + #ifdef OS_DARWIN + (void) mach_timebase_info(&mach_timebase); + #endif + + #ifdef OS_WIN32 + TickCountTickover = 0; + LastTickCount = 0; + #endif + + // Make sure the current loop time is sane, in case we do any initializations of + // objects before we start running. + _UpdateTime(); + + /* We initialize the network library here (only on Windows of course) + * and initialize "loop breakers." Our destructor also does some network-level + * cleanup. There's thus an implicit assumption that any given instance of EventMachine_t + * will only call ::Run once. Is that a good assumption? Should we move some of these + * inits and de-inits into ::Run? + */ + #ifdef OS_WIN32 + WSADATA w; + WSAStartup (MAKEWORD (1, 1), &w); + #endif + + _InitializeLoopBreaker(); + SelectData = new SelectData_t(); +} + + +/******************************* +EventMachine_t::~EventMachine_t +*******************************/ + +EventMachine_t::~EventMachine_t() +{ + // Run down descriptors + size_t i; + for (i = 0; i < NewDescriptors.size(); i++) + delete NewDescriptors[i]; + for (i = 0; i < Descriptors.size(); i++) + delete Descriptors[i]; + + close (LoopBreakerReader); + close (LoopBreakerWriter); + + // Remove any file watch descriptors + while(!Files.empty()) { + std::map<int, Bindable_t*>::iterator f = Files.begin(); + UnwatchFile (f->first); + } + + if (epfd != -1) + close (epfd); + if (kqfd != -1) + close (kqfd); + + delete SelectData; +} + + +/**************************** +EventMachine_t::ScheduleHalt +****************************/ + +void EventMachine_t::ScheduleHalt() +{ + /* This is how we stop the machine. + * This can be called by clients. Signal handlers will probably + * set the global flag. + * For now this means there can only be one EventMachine ever running at a time. + * + * IMPORTANT: keep this light, fast, and async-safe. Don't do anything frisky in here, + * because it may be called from signal handlers invoked from code that we don't + * control. At this writing (20Sep06), EM does NOT install any signal handlers of + * its own. + * + * We need a FAQ. And one of the questions is: how do I stop EM when Ctrl-C happens? + * The answer is to call evma_stop_machine, which calls here, from a SIGINT handler. + */ + bTerminateSignalReceived = true; + + /* Signal the loopbreaker so we break out of long-running select/epoll/kqueue and + * notice the halt boolean is set. Signalling the loopbreaker also uses a single + * signal-safe syscall. + */ + SignalLoopBreaker(); +} + +bool EventMachine_t::Stopping() +{ + return bTerminateSignalReceived; +} + +/******************************* +EventMachine_t::SetTimerQuantum +*******************************/ + +void EventMachine_t::SetTimerQuantum (int interval) +{ + /* We get a timer-quantum expressed in milliseconds. + */ + + if ((interval < 5) || (interval > 5*60*1000)) + throw std::runtime_error ("invalid timer-quantum"); + + Quantum.tv_sec = interval / 1000; + Quantum.tv_usec = (interval % 1000) * 1000; +} + + +/************************************* +(STATIC) EventMachine_t::SetuidString +*************************************/ + +#ifdef OS_UNIX +void EventMachine_t::SetuidString (const char *username) +{ + /* This method takes a caller-supplied username and tries to setuid + * to that user. There is no meaningful implementation (and no error) + * on Windows. On Unix, a failure to setuid the caller-supplied string + * causes a fatal abort, because presumably the program is calling here + * in order to fulfill a security requirement. If we fail silently, + * the user may continue to run with too much privilege. + * + * TODO, we need to decide on and document a way of generating C++ level errors + * that can be wrapped in documented Ruby exceptions, so users can catch + * and handle them. And distinguish it from errors that we WON'T let the Ruby + * user catch (like security-violations and resource-overallocation). + * A setuid failure here would be in the latter category. + */ + + if (!username || !*username) + throw std::runtime_error ("setuid_string failed: no username specified"); + + errno = 0; + struct passwd *p = getpwnam (username); + if (!p) { + if (errno) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "setuid_string failed: %s", strerror(errno)); + throw std::runtime_error (buf); + } else { + throw std::runtime_error ("setuid_string failed: unknown username"); + } + } + + if (setuid (p->pw_uid) != 0) + throw std::runtime_error ("setuid_string failed: no setuid"); + + // Success. +} +#else +void EventMachine_t::SetuidString (const char *username UNUSED) { } +#endif + +/**************************************** +(STATIC) EventMachine_t::SetRlimitNofile +****************************************/ + +#ifdef OS_UNIX +int EventMachine_t::SetRlimitNofile (int nofiles) +{ + struct rlimit rlim; + getrlimit (RLIMIT_NOFILE, &rlim); + if (nofiles >= 0) { + rlim.rlim_cur = nofiles; + if ((unsigned int)nofiles > rlim.rlim_max) + rlim.rlim_max = nofiles; + setrlimit (RLIMIT_NOFILE, &rlim); + // ignore the error return, for now at least. + // TODO, emit an error message someday when we have proper debug levels. + } + getrlimit (RLIMIT_NOFILE, &rlim); + return rlim.rlim_cur; +} +#else +int EventMachine_t::SetRlimitNofile (int nofiles UNUSED) { return 0; } +#endif + +/********************************* +EventMachine_t::SignalLoopBreaker +*********************************/ + +void EventMachine_t::SignalLoopBreaker() +{ + #ifdef OS_UNIX + (void)write (LoopBreakerWriter, "", 1); + #endif + #ifdef OS_WIN32 + sendto (LoopBreakerReader, "", 0, 0, (struct sockaddr*)&(LoopBreakerTarget), sizeof(LoopBreakerTarget)); + #endif +} + + +/************************************** +EventMachine_t::_InitializeLoopBreaker +**************************************/ + +void EventMachine_t::_InitializeLoopBreaker() +{ + /* A "loop-breaker" is a socket-descriptor that we can write to in order + * to break the main select loop. Primarily useful for things running on + * threads other than the main EM thread, so they can trigger processing + * of events that arise exogenously to the EM. + * Keep the loop-breaker pipe out of the main descriptor set, otherwise + * its events will get passed on to user code. + */ + + #ifdef OS_UNIX + int fd[2]; +#if defined (HAVE_CLOEXEC) && defined (HAVE_PIPE2) + int pipestatus = pipe2(fd, O_CLOEXEC); + if (pipestatus < 0) { + if (pipe(fd)) + throw std::runtime_error (strerror(errno)); + } +#else + if (pipe (fd)) + throw std::runtime_error (strerror(errno)); +#endif + if (!SetFdCloexec(fd[0]) || !SetFdCloexec(fd[1])) + throw std::runtime_error (strerror(errno)); + + LoopBreakerWriter = fd[1]; + LoopBreakerReader = fd[0]; + + /* 16Jan11: Make sure the pipe is non-blocking, so more than 65k loopbreaks + * in one tick do not fill up the pipe and block the process on write() */ + SetSocketNonblocking (LoopBreakerWriter); + #endif + + #ifdef OS_WIN32 + SOCKET sd = EmSocket (AF_INET, SOCK_DGRAM, 0); + if (sd == INVALID_SOCKET) + throw std::runtime_error ("no loop breaker socket"); + SetSocketNonblocking (sd); + + memset (&LoopBreakerTarget, 0, sizeof(LoopBreakerTarget)); + LoopBreakerTarget.sin_family = AF_INET; + LoopBreakerTarget.sin_addr.s_addr = inet_addr ("127.0.0.1"); + + srand ((int)time(NULL)); + int i; + for (i=0; i < 100; i++) { + int r = (rand() % 10000) + 20000; + LoopBreakerTarget.sin_port = htons (r); + if (bind (sd, (struct sockaddr*)&LoopBreakerTarget, sizeof(LoopBreakerTarget)) == 0) + break; + } + + if (i == 100) + throw std::runtime_error ("no loop breaker"); + LoopBreakerReader = sd; + #endif + + #ifdef HAVE_EPOLL + if (Poller == Poller_Epoll) { + epfd = epoll_create (MaxEpollDescriptors); + if (epfd == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to create epoll descriptor: %s", strerror(errno)); + throw std::runtime_error (buf); + } + int cloexec = fcntl (epfd, F_GETFD, 0); + assert (cloexec >= 0); + cloexec |= FD_CLOEXEC; + fcntl (epfd, F_SETFD, cloexec); + + assert (LoopBreakerReader >= 0); + LoopbreakDescriptor *ld = new LoopbreakDescriptor (LoopBreakerReader, this); + assert (ld); + Add (ld); + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller == Poller_Kqueue) { + kqfd = kqueue(); + if (kqfd == -1) { + char buf[200]; + snprintf (buf, sizeof(buf)-1, "unable to create kqueue descriptor: %s", strerror(errno)); + throw std::runtime_error (buf); + } + // cloexec not needed. By definition, kqueues are not carried across forks. + + assert (LoopBreakerReader >= 0); + LoopbreakDescriptor *ld = new LoopbreakDescriptor (LoopBreakerReader, this); + assert (ld); + Add (ld); + } + #endif +} + +/*************************** +EventMachine_t::_UpdateTime +***************************/ + +void EventMachine_t::_UpdateTime() +{ + MyCurrentLoopTime = GetRealTime(); +} + +/*************************** +EventMachine_t::GetRealTime +***************************/ + +// Two great writeups of cross-platform monotonic time are at: +// http://www.python.org/dev/peps/pep-0418 +// http://nadeausoftware.com/articles/2012/04/c_c_tip_how_measure_elapsed_real_time_benchmarking +// Uncomment the #pragma messages to confirm which compile-time option was used +uint64_t EventMachine_t::GetRealTime() +{ + uint64_t current_time; + + #if defined(HAVE_CONST_CLOCK_MONOTONIC_RAW) + // #pragma message "GetRealTime: clock_gettime CLOCK_MONOTONIC_RAW" + // Linux 2.6.28 and above + struct timespec tv; + clock_gettime (CLOCK_MONOTONIC_RAW, &tv); + current_time = (((uint64_t)(tv.tv_sec)) * 1000000LL) + ((uint64_t)((tv.tv_nsec)/1000)); + + #elif defined(HAVE_CONST_CLOCK_MONOTONIC) + // #pragma message "GetRealTime: clock_gettime CLOCK_MONOTONIC" + // Linux, FreeBSD 5.0 and above, Solaris 8 and above, OpenBSD, NetBSD, DragonflyBSD + struct timespec tv; + clock_gettime (CLOCK_MONOTONIC, &tv); + current_time = (((uint64_t)(tv.tv_sec)) * 1000000LL) + ((uint64_t)((tv.tv_nsec)/1000)); + + #elif defined(HAVE_GETHRTIME) + // #pragma message "GetRealTime: gethrtime" + // Solaris and HP-UX + current_time = (uint64_t)gethrtime() / 1000; + + #elif defined(OS_DARWIN) + // #pragma message "GetRealTime: mach_absolute_time" + // Mac OS X + // https://developer.apple.com/library/mac/qa/qa1398/_index.html + current_time = mach_absolute_time() * mach_timebase.numer / mach_timebase.denom / 1000; + + #elif defined(OS_UNIX) + // #pragma message "GetRealTime: gettimeofday" + // Unix fallback + struct timeval tv; + gettimeofday (&tv, NULL); + current_time = (((uint64_t)(tv.tv_sec)) * 1000000LL) + ((uint64_t)(tv.tv_usec)); + + #elif defined(OS_WIN32) + // #pragma message "GetRealTime: GetTickCount" + // Future improvement: use GetTickCount64 in Windows Vista / Server 2008 + unsigned tick = GetTickCount(); + if (tick < LastTickCount) + TickCountTickover += 1; + LastTickCount = tick; + current_time = ((uint64_t)TickCountTickover << 32) + (uint64_t)tick; + current_time *= 1000; // convert to microseconds + + #else + // #pragma message "GetRealTime: time" + // Universal fallback + current_time = (uint64_t)time(NULL) * 1000000LL; + #endif + + return current_time; +} + +/*********************************** +EventMachine_t::_DispatchHeartbeats +***********************************/ + +void EventMachine_t::_DispatchHeartbeats() +{ + // Store the first processed heartbeat descriptor and bail out if + // we see it again. This fixes an infinite loop in case the system time + // is changed out from underneath MyCurrentLoopTime. + const EventableDescriptor *head = NULL; + + while (true) { + std::multimap<uint64_t,EventableDescriptor*>::iterator i = Heartbeats.begin(); + if (i == Heartbeats.end()) + break; + if (i->first > MyCurrentLoopTime) + break; + + EventableDescriptor *ed = i->second; + if (ed == head) + break; + + ed->Heartbeat(); + QueueHeartbeat(ed); + + if (head == NULL) + head = ed; + } +} + +/****************************** +EventMachine_t::QueueHeartbeat +******************************/ + +void EventMachine_t::QueueHeartbeat(EventableDescriptor *ed) +{ + uint64_t heartbeat = ed->GetNextHeartbeat(); + + if (heartbeat) { + #ifndef HAVE_MAKE_PAIR + Heartbeats.insert (std::multimap<uint64_t,EventableDescriptor*>::value_type (heartbeat, ed)); + #else + Heartbeats.insert (std::make_pair (heartbeat, ed)); + #endif + } +} + +/****************************** +EventMachine_t::ClearHeartbeat +******************************/ + +void EventMachine_t::ClearHeartbeat(uint64_t key, EventableDescriptor* ed) +{ + std::multimap<uint64_t,EventableDescriptor*>::iterator it; + std::pair<std::multimap<uint64_t,EventableDescriptor*>::iterator,std::multimap<uint64_t,EventableDescriptor*>::iterator> ret; + ret = Heartbeats.equal_range (key); + for (it = ret.first; it != ret.second; ++it) { + if (it->second == ed) { + Heartbeats.erase (it); + break; + } + } +} + +/******************* +EventMachine_t::Run +*******************/ + +void EventMachine_t::Run() +{ + while (RunOnce()) ; +} + +/*********************** +EventMachine_t::RunOnce +***********************/ + +bool EventMachine_t::RunOnce() +{ + _UpdateTime(); + _RunTimers(); + + /* _Add must precede _Modify because the same descriptor might + * be on both lists during the same pass through the machine, + * and to modify a descriptor before adding it would fail. + */ + _AddNewDescriptors(); + _ModifyDescriptors(); + + switch (Poller) { + case Poller_Epoll: + _RunEpollOnce(); + break; + case Poller_Kqueue: + _RunKqueueOnce(); + break; + case Poller_Default: + _RunSelectOnce(); + break; + } + + _DispatchHeartbeats(); + _CleanupSockets(); + + if (bTerminateSignalReceived) + return false; + + return true; +} + + +/***************************** +EventMachine_t::_RunEpollOnce +*****************************/ + +void EventMachine_t::_RunEpollOnce() +{ + #ifdef HAVE_EPOLL + assert (epfd != -1); + int s; + + timeval tv = _TimeTilNextEvent(); + + #ifdef BUILD_FOR_RUBY + int ret = 0; + + #ifdef HAVE_RB_WAIT_FOR_SINGLE_FD + if ((ret = rb_wait_for_single_fd(epfd, RB_WAITFD_IN|RB_WAITFD_PRI, &tv)) < 1) { + #else + fd_set fdreads; + + FD_ZERO(&fdreads); + FD_SET(epfd, &fdreads); + + if ((ret = rb_thread_select(epfd + 1, &fdreads, NULL, NULL, &tv)) < 1) { + #endif + if (ret == -1) { + assert(errno != EINVAL); + assert(errno != EBADF); + } + return; + } + + TRAP_BEG; + s = epoll_wait (epfd, epoll_events, MaxEvents, 0); + TRAP_END; + #else + int duration = 0; + duration = duration + (tv.tv_sec * 1000); + duration = duration + (tv.tv_usec / 1000); + s = epoll_wait (epfd, epoll_events, MaxEvents, duration); + #endif + + if (s > 0) { + for (int i=0; i < s; i++) { + EventableDescriptor *ed = (EventableDescriptor*) epoll_events[i].data.ptr; + + if (ed->IsWatchOnly() && ed->GetSocket() == INVALID_SOCKET) + continue; + + assert(ed->GetSocket() != INVALID_SOCKET); + + if (epoll_events[i].events & EPOLLIN) + ed->Read(); + if (epoll_events[i].events & EPOLLOUT) + ed->Write(); + if (epoll_events[i].events & (EPOLLERR | EPOLLHUP)) + ed->HandleError(); + } + } + else if (s < 0) { + // epoll_wait can fail on error in a handful of ways. + // If this happens, then wait for a little while to avoid busy-looping. + // If the error was EINTR, we probably caught SIGCHLD or something, + // so keep the wait short. + timeval tv = {0, ((errno == EINTR) ? 5 : 50) * 1000}; + EmSelect (0, NULL, NULL, NULL, &tv); + } + #else + throw std::runtime_error ("epoll is not implemented on this platform"); + #endif +} + + +/****************************** +EventMachine_t::_RunKqueueOnce +******************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::_RunKqueueOnce() +{ + assert (kqfd != -1); + int k; + + timeval tv = _TimeTilNextEvent(); + + struct timespec ts; + ts.tv_sec = tv.tv_sec; + ts.tv_nsec = tv.tv_usec * 1000; + + #ifdef BUILD_FOR_RUBY + int ret = 0; + + #ifdef HAVE_RB_WAIT_FOR_SINGLE_FD + if ((ret = rb_wait_for_single_fd(kqfd, RB_WAITFD_IN|RB_WAITFD_PRI, &tv)) < 1) { + #else + fd_set fdreads; + + FD_ZERO(&fdreads); + FD_SET(kqfd, &fdreads); + + if ((ret = rb_thread_select(kqfd + 1, &fdreads, NULL, NULL, &tv)) < 1) { + #endif + if (ret == -1) { + assert(errno != EINVAL); + assert(errno != EBADF); + } + return; + } + + TRAP_BEG; + ts.tv_sec = ts.tv_nsec = 0; + k = kevent (kqfd, NULL, 0, Karray, MaxEvents, &ts); + TRAP_END; + #else + k = kevent (kqfd, NULL, 0, Karray, MaxEvents, &ts); + #endif + + struct kevent *ke = Karray; + while (k > 0) { + switch (ke->filter) + { + case EVFILT_VNODE: + _HandleKqueueFileEvent (ke); + break; + + case EVFILT_PROC: + _HandleKqueuePidEvent (ke); + break; + + case EVFILT_READ: + case EVFILT_WRITE: + EventableDescriptor *ed = (EventableDescriptor*) (ke->udata); + assert (ed); + + if (ed->IsWatchOnly() && ed->GetSocket() == INVALID_SOCKET) + break; + + if (ke->filter == EVFILT_READ) + ed->Read(); + else if (ke->filter == EVFILT_WRITE) + ed->Write(); + else + std::cerr << "Discarding unknown kqueue event " << ke->filter << std::endl; + + break; + } + + --k; + ++ke; + } + + // TODO, replace this with rb_thread_blocking_region for 1.9 builds. + #ifdef BUILD_FOR_RUBY + if (!rb_thread_alone()) { + rb_thread_schedule(); + } + #endif +} +#else +void EventMachine_t::_RunKqueueOnce() +{ + throw std::runtime_error ("kqueue is not implemented on this platform"); +} +#endif + + +/********************************* +EventMachine_t::_TimeTilNextEvent +*********************************/ + +timeval EventMachine_t::_TimeTilNextEvent() +{ + // 29jul11: Changed calculation base from MyCurrentLoopTime to the + // real time. As MyCurrentLoopTime is set at the beginning of an + // iteration and this calculation is done at the end, evenmachine + // will potentially oversleep by the amount of time the iteration + // took to execute. + uint64_t next_event = 0; + uint64_t current_time = GetRealTime(); + + if (!Heartbeats.empty()) { + std::multimap<uint64_t,EventableDescriptor*>::iterator heartbeats = Heartbeats.begin(); + next_event = heartbeats->first; + } + + if (!Timers.empty()) { + std::multimap<uint64_t,Timer_t>::iterator timers = Timers.begin(); + if (next_event == 0 || timers->first < next_event) + next_event = timers->first; + } + + if (!NewDescriptors.empty() || !ModifiedDescriptors.empty()) { + next_event = current_time; + } + + timeval tv; + + if (NumCloseScheduled > 0 || bTerminateSignalReceived) { + tv.tv_sec = tv.tv_usec = 0; + } else if (next_event == 0) { + tv = Quantum; + } else { + if (next_event > current_time) { + uint64_t duration = next_event - current_time; + tv.tv_sec = duration / 1000000; + tv.tv_usec = duration % 1000000; + } else { + tv.tv_sec = tv.tv_usec = 0; + } + } + + return tv; +} + +/******************************* +EventMachine_t::_CleanupSockets +*******************************/ + +void EventMachine_t::_CleanupSockets() +{ + // TODO, rip this out and only delete the descriptors we know have died, + // rather than traversing the whole list. + // Modified 05Jan08 per suggestions by Chris Heath. It's possible that + // an EventableDescriptor will have a descriptor value of -1. That will + // happen if EventableDescriptor::Close was called on it. In that case, + // don't call epoll_ctl to remove the socket's filters from the epoll set. + // According to the epoll docs, this happens automatically when the + // descriptor is closed anyway. This is different from the case where + // the socket has already been closed but the descriptor in the ED object + // hasn't yet been set to INVALID_SOCKET. + // In kqueue, closing a descriptor automatically removes its event filters. + int i, j; + int nSockets = Descriptors.size(); + for (i=0, j=0; i < nSockets; i++) { + EventableDescriptor *ed = Descriptors[i]; + assert (ed); + if (ed->ShouldDelete()) { + #ifdef HAVE_EPOLL + if (Poller == Poller_Epoll) { + assert (epfd != -1); + if (ed->GetSocket() != INVALID_SOCKET) { + int e = epoll_ctl (epfd, EPOLL_CTL_DEL, ed->GetSocket(), ed->GetEpollEvent()); + // ENOENT or EBADF are not errors because the socket may be already closed when we get here. + if (e && (errno != ENOENT) && (errno != EBADF) && (errno != EPERM)) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to delete epoll event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } + ModifiedDescriptors.erase(ed); + } + #endif + delete ed; + } + else + Descriptors [j++] = ed; + } + while ((size_t)j < Descriptors.size()) + Descriptors.pop_back(); +} + +/********************************* +EventMachine_t::_ModifyEpollEvent +*********************************/ + +#ifdef HAVE_EPOLL +void EventMachine_t::_ModifyEpollEvent (EventableDescriptor *ed) +{ + if (Poller == Poller_Epoll) { + assert (epfd != -1); + assert (ed); + assert (ed->GetSocket() != INVALID_SOCKET); + int e = epoll_ctl (epfd, EPOLL_CTL_MOD, ed->GetSocket(), ed->GetEpollEvent()); + if (e) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to modify epoll event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } +} +#else +void EventMachine_t::_ModifyEpollEvent (EventableDescriptor *ed UNUSED) { } +#endif + + +/************************** +SelectData_t::SelectData_t +**************************/ + +SelectData_t::SelectData_t() +{ + maxsocket = 0; + rb_fd_init (&fdreads); + rb_fd_init (&fdwrites); + rb_fd_init (&fderrors); +} + +SelectData_t::~SelectData_t() +{ + rb_fd_term (&fdreads); + rb_fd_term (&fdwrites); + rb_fd_term (&fderrors); +} + +#ifdef BUILD_FOR_RUBY +/***************** +_SelectDataSelect +*****************/ + +#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) +static VALUE _SelectDataSelect (void *v) +{ + SelectData_t *sd = (SelectData_t*)v; + sd->nSockets = rb_fd_select (sd->maxsocket+1, &(sd->fdreads), &(sd->fdwrites), &(sd->fderrors), &(sd->tv)); + return Qnil; +} +#endif + +/********************* +SelectData_t::_Select +*********************/ + +int SelectData_t::_Select() +{ + #if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) + // added in ruby 1.9.3 + rb_thread_call_without_gvl ((void *(*)(void *))_SelectDataSelect, (void*)this, RUBY_UBF_IO, 0); + return nSockets; + #elif defined(HAVE_TBR) + // added in ruby 1.9.1, deprecated in ruby 2.0.0 + rb_thread_blocking_region (_SelectDataSelect, (void*)this, RUBY_UBF_IO, 0); + return nSockets; + #else + return EmSelect (maxsocket+1, &fdreads, &fdwrites, &fderrors, &tv); + #endif +} +#endif + +void SelectData_t::_Clear() +{ + maxsocket = 0; + rb_fd_zero (&fdreads); + rb_fd_zero (&fdwrites); + rb_fd_zero (&fderrors); +} + +/****************************** +EventMachine_t::_RunSelectOnce +******************************/ + +void EventMachine_t::_RunSelectOnce() +{ + // Crank the event machine once. + // If there are no descriptors to process, then sleep + // for a few hundred mills to avoid busy-looping. + // This is based on a select loop. Alternately provide epoll + // if we know we're running on a 2.6 kernel. + // epoll will be effective if we provide it as an alternative, + // however it has the same problem interoperating with Ruby + // threads that select does. + + // Get ready for select() + SelectData->_Clear(); + + // Always read the loop-breaker reader. + // Changed 23Aug06, provisionally implemented for Windows with a UDP socket + // running on localhost with a randomly-chosen port. (*Puke*) + // Windows has a version of the Unix pipe() library function, but it doesn't + // give you back descriptors that are selectable. + rb_fd_set (LoopBreakerReader, &(SelectData->fdreads)); + if (SelectData->maxsocket < LoopBreakerReader) + SelectData->maxsocket = LoopBreakerReader; + + // prepare the sockets for reading and writing + size_t i; + for (i = 0; i < Descriptors.size(); i++) { + EventableDescriptor *ed = Descriptors[i]; + assert (ed); + SOCKET sd = ed->GetSocket(); + if (ed->IsWatchOnly() && sd == INVALID_SOCKET) + continue; + assert (sd != INVALID_SOCKET); + + if (ed->SelectForRead()) + rb_fd_set (sd, &(SelectData->fdreads)); + if (ed->SelectForWrite()) + rb_fd_set (sd, &(SelectData->fdwrites)); + + #ifdef OS_WIN32 + /* 21Sep09: on windows, a non-blocking connect() that fails does not come up as writable. + Instead, it is added to the error set. See http://www.mail-archive.com/openssl-users@openssl.org/msg58500.html + */ + if (ed->IsConnectPending()) + rb_fd_set (sd, &(SelectData->fderrors)); + #endif + + if (SelectData->maxsocket < sd) + SelectData->maxsocket = sd; + } + + + { // read and write the sockets + //timeval tv = {1, 0}; // Solaris fails if the microseconds member is >= 1000000. + //timeval tv = Quantum; + SelectData->tv = _TimeTilNextEvent(); + int s = SelectData->_Select(); + //rb_thread_blocking_region(xxx,(void*)&SelectData,RUBY_UBF_IO,0); + //int s = EmSelect (SelectData.maxsocket+1, &(SelectData.fdreads), &(SelectData.fdwrites), NULL, &(SelectData.tv)); + //int s = SelectData.nSockets; + if (s > 0) { + /* Changed 01Jun07. We used to handle the Loop-breaker right here. + * Now we do it AFTER all the regular descriptors. There's an + * incredibly important and subtle reason for this. Code on + * loop breakers is sometimes used to cause the reactor core to + * cycle (for example, to allow outbound network buffers to drain). + * If a loop-breaker handler reschedules itself (say, after determining + * that the write buffers are still too full), then it will execute + * IMMEDIATELY if _ReadLoopBreaker is done here instead of after + * the other descriptors are processed. That defeats the whole purpose. + */ + for (i=0; i < Descriptors.size(); i++) { + EventableDescriptor *ed = Descriptors[i]; + assert (ed); + SOCKET sd = ed->GetSocket(); + if (ed->IsWatchOnly() && sd == INVALID_SOCKET) + continue; + assert (sd != INVALID_SOCKET); + + if (rb_fd_isset (sd, &(SelectData->fdwrites))) { + // Double-check SelectForWrite() still returns true. If not, one of the callbacks must have + // modified some value since we checked SelectForWrite() earlier in this method. + if (ed->SelectForWrite()) + ed->Write(); + } + if (rb_fd_isset (sd, &(SelectData->fdreads))) + ed->Read(); + if (rb_fd_isset (sd, &(SelectData->fderrors))) + ed->HandleError(); + } + + if (rb_fd_isset (LoopBreakerReader, &(SelectData->fdreads))) + _ReadLoopBreaker(); + } + else if (s < 0) { + switch (errno) { + case EBADF: + _CleanBadDescriptors(); + break; + case EINVAL: + throw std::runtime_error ("Somehow EM passed an invalid nfds or invalid timeout to select(2), please report this!"); + break; + default: + // select can fail on error in a handful of ways. + // If this happens, then wait for a little while to avoid busy-looping. + // If the error was EINTR, we probably caught SIGCHLD or something, + // so keep the wait short. + timeval tv = {0, ((errno == EINTR) ? 5 : 50) * 1000}; + EmSelect (0, NULL, NULL, NULL, &tv); + } + } + } +} + +void EventMachine_t::_CleanBadDescriptors() +{ + size_t i; + + for (i = 0; i < Descriptors.size(); i++) { + EventableDescriptor *ed = Descriptors[i]; + if (ed->ShouldDelete()) + continue; + + SOCKET sd = ed->GetSocket(); + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + + rb_fdset_t fds; + rb_fd_init(&fds); + rb_fd_set(sd, &fds); + + int ret = rb_fd_select(sd + 1, &fds, NULL, NULL, &tv); + rb_fd_term(&fds); + + if (ret == -1) { + if (errno == EBADF) + ed->ScheduleClose(false); + } + } +} + +/******************************** +EventMachine_t::_ReadLoopBreaker +********************************/ + +void EventMachine_t::_ReadLoopBreaker() +{ + /* The loop breaker has selected readable. + * Read it ONCE (it may block if we try to read it twice) + * and send a loop-break event back to user code. + */ + char buffer [1024]; + (void)read (LoopBreakerReader, buffer, sizeof(buffer)); + if (EventCallback) + (*EventCallback)(0, EM_LOOPBREAK_SIGNAL, "", 0); +} + + +/************************** +EventMachine_t::_RunTimers +**************************/ + +void EventMachine_t::_RunTimers() +{ + // These are caller-defined timer handlers. + // We rely on the fact that multimaps sort by their keys to avoid + // inspecting the whole list every time we come here. + // Just keep inspecting and processing the list head until we hit + // one that hasn't expired yet. + + while (true) { + std::multimap<uint64_t,Timer_t>::iterator i = Timers.begin(); + if (i == Timers.end()) + break; + if (i->first > MyCurrentLoopTime) + break; + if (EventCallback) + (*EventCallback) (0, EM_TIMER_FIRED, NULL, i->second.GetBinding()); + Timers.erase (i); + } +} + + + +/*********************************** +EventMachine_t::InstallOneshotTimer +***********************************/ + +const uintptr_t EventMachine_t::InstallOneshotTimer (uint64_t milliseconds) +{ + if (Timers.size() > MaxOutstandingTimers) + return false; + + uint64_t fire_at = GetRealTime(); + fire_at += ((uint64_t)milliseconds) * 1000LL; + + Timer_t t; + #ifndef HAVE_MAKE_PAIR + std::multimap<uint64_t,Timer_t>::iterator i = Timers.insert (std::multimap<uint64_t,Timer_t>::value_type (fire_at, t)); + #else + std::multimap<uint64_t,Timer_t>::iterator i = Timers.insert (std::make_pair (fire_at, t)); + #endif + return i->second.GetBinding(); +} + + +/******************************* +EventMachine_t::ConnectToServer +*******************************/ + +const uintptr_t EventMachine_t::ConnectToServer (const char *bind_addr, int bind_port, const char *server, int port) +{ + /* We want to spend no more than a few seconds waiting for a connection + * to a remote host. So we use a nonblocking connect. + * Linux disobeys the usual rules for nonblocking connects. + * Per Stevens (UNP p.410), you expect a nonblocking connect to select + * both readable and writable on error, and not to return EINPROGRESS + * if the connect can be fulfilled immediately. Linux violates both + * of these expectations. + * Any kind of nonblocking connect on Linux returns EINPROGRESS. + * The socket will then return writable when the disposition of the + * connect is known, but it will not also be readable in case of + * error! Weirdly, it will be readable in case there is data to read!!! + * (Which can happen with protocols like SSH and SMTP.) + * I suppose if you were so inclined you could consider this logical, + * but it's not the way Unix has historically done it. + * So we ignore the readable flag and read getsockopt to see if there + * was an error connecting. A select timeout works as expected. + * In regard to getsockopt: Linux does the Berkeley-style thing, + * not the Solaris-style, and returns zero with the error code in + * the error parameter. + * Return the binding-text of the newly-created pending connection, + * or NULL if there was a problem. + */ + + if (!server || !*server || !port) + throw std::runtime_error ("invalid server or port"); + + struct sockaddr_storage bind_as; + size_t bind_as_len = sizeof bind_as; + int gai = name2address (server, port, SOCK_STREAM, (struct sockaddr *)&bind_as, &bind_as_len); + if (gai != 0) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to resolve address: %s", gai_strerror(gai)); + throw std::runtime_error (buf); + } + + SOCKET sd = EmSocket (bind_as.ss_family, SOCK_STREAM, 0); + if (sd == INVALID_SOCKET) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to create new socket: %s", strerror(errno)); + throw std::runtime_error (buf); + } + + // From here on, ALL error returns must close the socket. + // Set the new socket nonblocking. + if (!SetSocketNonblocking (sd)) { + close (sd); + throw std::runtime_error ("unable to set socket as non-blocking"); + } + // Disable slow-start (Nagle algorithm). + int one = 1; + setsockopt (sd, IPPROTO_TCP, TCP_NODELAY, (char*) &one, sizeof(one)); + // Set reuseaddr to improve performance on restarts + setsockopt (sd, SOL_SOCKET, SO_REUSEADDR, (char*) &one, sizeof(one)); + + if (bind_addr) { + struct sockaddr_storage bind_to; + size_t bind_to_len = sizeof bind_to; + gai = name2address (bind_addr, bind_port, SOCK_STREAM, (struct sockaddr *)&bind_to, &bind_to_len); + if (gai != 0) { + close (sd); + char buf [200]; + snprintf (buf, sizeof(buf)-1, "invalid bind address: %s", gai_strerror(gai)); + throw std::runtime_error (buf); + } + if (bind (sd, (struct sockaddr *)&bind_to, bind_to_len) < 0) { + close (sd); + throw std::runtime_error ("couldn't bind to address"); + } + } + + uintptr_t out = 0; + + #ifdef OS_UNIX + int e_reason = 0; + if (connect (sd, (struct sockaddr *)&bind_as, bind_as_len) == 0) { + // This is a connect success, which Linux appears + // never to give when the socket is nonblocking, + // even if the connection is intramachine or to + // localhost. + + /* Changed this branch 08Aug06. Evidently some kernels + * (FreeBSD for example) will actually return success from + * a nonblocking connect. This is a pretty simple case, + * just set up the new connection and clear the pending flag. + * Thanks to Chris Ochs for helping track this down. + * This branch never gets taken on Linux or (oddly) OSX. + * The original behavior was to throw an unimplemented, + * which the user saw as a fatal exception. Very unfriendly. + * + * Tweaked 10Aug06. Even though the connect disposition is + * known, we still set the connect-pending flag. That way + * some needed initialization will happen in the ConnectionDescriptor. + * (To wit, the ConnectionCompleted event gets sent to the client.) + */ + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetConnectPending (true); + Add (cd); + out = cd->GetBinding(); + } + else if (errno == EINPROGRESS) { + // Errno will generally always be EINPROGRESS, but on Linux + // we have to look at getsockopt to be sure what really happened. + int error = 0; + socklen_t len; + len = sizeof(error); + int o = getsockopt (sd, SOL_SOCKET, SO_ERROR, &error, &len); + if ((o == 0) && (error == 0)) { + // Here, there's no disposition. + // Put the connection on the stack and wait for it to complete + // or time out. + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetConnectPending (true); + Add (cd); + out = cd->GetBinding(); + } else { + // Fall through to the !out case below. + e_reason = error; + } + } + else { + // The error from connect was something other then EINPROGRESS (EHOSTDOWN, etc). + // Fall through to the !out case below + e_reason = errno; + } + + if (!out) { + /* This could be connection refused or some such thing. + * We will come here on Linux if a localhost connection fails. + * Changed 16Jul06: Originally this branch was a no-op, and + * we'd drop down to the end of the method, close the socket, + * and return NULL, which would cause the caller to GET A + * FATAL EXCEPTION. Now we keep the socket around but schedule an + * immediate close on it, so the caller will get a close-event + * scheduled on it. This was only an issue for localhost connections + * to non-listening ports. We may eventually need to revise this + * revised behavior, in case it causes problems like making it hard + * for people to know that a failure occurred. + */ + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetUnbindReasonCode (e_reason); + cd->ScheduleClose (false); + Add (cd); + out = cd->GetBinding(); + } + #endif + + #ifdef OS_WIN32 + if (connect (sd, (struct sockaddr *)&bind_as, bind_as_len) == 0) { + // This is a connect success, which Windows appears + // never to give when the socket is nonblocking, + // even if the connection is intramachine or to + // localhost. + throw std::runtime_error ("unimplemented"); + } + else if (WSAGetLastError() == WSAEWOULDBLOCK) { + // Here, there's no disposition. + // Windows appears not to surface refused connections or + // such stuff at this point. + // Put the connection on the stack and wait for it to complete + // or time out. + ConnectionDescriptor *cd = new ConnectionDescriptor (sd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetConnectPending (true); + Add (cd); + out = cd->GetBinding(); + } + else { + // The error from connect was something other then WSAEWOULDBLOCK. + } + + #endif + + if (!out) + close (sd); + return out; +} + +/*********************************** +EventMachine_t::ConnectToUnixServer +***********************************/ + +#ifdef OS_UNIX +const uintptr_t EventMachine_t::ConnectToUnixServer (const char *server) +{ + /* Connect to a Unix-domain server, which by definition is running + * on the same host. + * There is no meaningful implementation on Windows. + * There's no need to do a nonblocking connect, since the connection + * is always local and can always be fulfilled immediately. + */ + + uintptr_t out = 0; + + if (!server || !*server) + return 0; + + sockaddr_un pun; + memset (&pun, 0, sizeof(pun)); + pun.sun_family = AF_LOCAL; + + // You ordinarily expect the server name field to be at least 1024 bytes long, + // but on Linux it can be MUCH shorter. + if (strlen(server) >= sizeof(pun.sun_path)) + throw std::runtime_error ("unix-domain server name is too long"); + + + strcpy (pun.sun_path, server); + + SOCKET fd = EmSocket (AF_LOCAL, SOCK_STREAM, 0); + if (fd == INVALID_SOCKET) + return 0; + + // From here on, ALL error returns must close the socket. + // NOTE: At this point, the socket is still a blocking socket. + if (connect (fd, (struct sockaddr*)&pun, sizeof(pun)) != 0) { + close (fd); + return 0; + } + + // Set the newly-connected socket nonblocking. + if (!SetSocketNonblocking (fd)) { + close (fd); + return 0; + } + + // Set up a connection descriptor and add it to the event-machine. + // Observe, even though we know the connection status is connect-success, + // we still set the "pending" flag, so some needed initializations take + // place. + ConnectionDescriptor *cd = new ConnectionDescriptor (fd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + cd->SetConnectPending (true); + Add (cd); + out = cd->GetBinding(); + + if (!out) + close (fd); + + return out; +} +#else +const uintptr_t EventMachine_t::ConnectToUnixServer (const char *server UNUSED) +{ + throw std::runtime_error ("unix-domain connection unavailable on this platform"); +} +#endif + +/************************ +EventMachine_t::AttachFD +************************/ + +const uintptr_t EventMachine_t::AttachFD (SOCKET fd, bool watch_mode) +{ + #ifdef OS_UNIX + if (fcntl(fd, F_GETFL, 0) < 0) { + if (errno) { + throw std::runtime_error (strerror(errno)); + } else { + throw std::runtime_error ("invalid file descriptor"); + } + } + #endif + + #ifdef OS_WIN32 + // TODO: add better check for invalid file descriptors (see ioctlsocket or getsockopt) + if (fd == INVALID_SOCKET) + throw std::runtime_error ("invalid file descriptor"); + #endif + + {// Check for duplicate descriptors + size_t i; + for (i = 0; i < Descriptors.size(); i++) { + EventableDescriptor *ed = Descriptors[i]; + assert (ed); + if (ed->GetSocket() == fd) + throw std::runtime_error ("adding existing descriptor"); + } + + for (i = 0; i < NewDescriptors.size(); i++) { + EventableDescriptor *ed = NewDescriptors[i]; + assert (ed); + if (ed->GetSocket() == fd) + throw std::runtime_error ("adding existing new descriptor"); + } + } + + if (!watch_mode) + SetSocketNonblocking(fd); + + ConnectionDescriptor *cd = new ConnectionDescriptor (fd, this); + if (!cd) + throw std::runtime_error ("no connection allocated"); + + cd->SetAttached(true); + cd->SetWatchOnly(watch_mode); + cd->SetConnectPending (false); + + Add (cd); + + const uintptr_t out = cd->GetBinding(); + return out; +} + +/************************ +EventMachine_t::DetachFD +************************/ + +int EventMachine_t::DetachFD (EventableDescriptor *ed) +{ + if (!ed) + throw std::runtime_error ("detaching bad descriptor"); + + SOCKET fd = ed->GetSocket(); + + #ifdef HAVE_EPOLL + if (Poller == Poller_Epoll) { + if (ed->GetSocket() != INVALID_SOCKET) { + assert (epfd != -1); + int e = epoll_ctl (epfd, EPOLL_CTL_DEL, ed->GetSocket(), ed->GetEpollEvent()); + // ENOENT or EBADF are not errors because the socket may be already closed when we get here. + if (e && (errno != ENOENT) && (errno != EBADF)) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to delete epoll event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller == Poller_Kqueue) { + // remove any read/write events for this fd + struct kevent k; +#ifdef __NetBSD__ + EV_SET (&k, ed->GetSocket(), EVFILT_READ | EVFILT_WRITE, EV_DELETE, 0, 0, (intptr_t)ed); +#else + EV_SET (&k, ed->GetSocket(), EVFILT_READ | EVFILT_WRITE, EV_DELETE, 0, 0, ed); +#endif + int t = kevent (kqfd, &k, 1, NULL, 0, NULL); + if (t < 0 && (errno != ENOENT) && (errno != EBADF)) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to delete kqueue event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } + #endif + + // Prevent the descriptor from being modified, in case DetachFD was called from a timer or next_tick + ModifiedDescriptors.erase (ed); + + // Prevent the descriptor from being added, in case DetachFD was called in the same tick as AttachFD + for (size_t i = 0; i < NewDescriptors.size(); i++) { + if (ed == NewDescriptors[i]) { + NewDescriptors.erase(NewDescriptors.begin() + i); + break; + } + } + + // Set MySocket = INVALID_SOCKET so ShouldDelete() is true (and the descriptor gets deleted and removed), + // and also to prevent anyone from calling close() on the detached fd + ed->SetSocketInvalid(); + + return fd; +} + +/************ +name2address +************/ + +int EventMachine_t::name2address (const char *server, int port, int socktype, struct sockaddr *addr, size_t *addr_len) +{ + if (!server || !*server) + server = "0.0.0.0"; + + struct addrinfo *ai; + struct addrinfo hints; + memset (&hints, 0, sizeof(hints)); + hints.ai_socktype = socktype; + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_NUMERICSERV | AI_ADDRCONFIG; + + char portstr[12]; + snprintf(portstr, sizeof(portstr), "%u", port); + + int gai = getaddrinfo (server, portstr, &hints, &ai); + if (gai == 0) { + assert (ai->ai_addrlen <= *addr_len); + memcpy (addr, ai->ai_addr, ai->ai_addrlen); + *addr_len = ai->ai_addrlen; + freeaddrinfo(ai); + } + + return gai; +} + + +/******************************* +EventMachine_t::CreateTcpServer +*******************************/ + +const uintptr_t EventMachine_t::CreateTcpServer (const char *server, int port) +{ + /* Create a TCP-acceptor (server) socket and add it to the event machine. + * Return the binding of the new acceptor to the caller. + * This binding will be referenced when the new acceptor sends events + * to indicate accepted connections. + */ + + + struct sockaddr_storage bind_here; + size_t bind_here_len = sizeof bind_here; + if (0 != name2address (server, port, SOCK_STREAM, (struct sockaddr *)&bind_here, &bind_here_len)) + return 0; + + SOCKET sd_accept = EmSocket (bind_here.ss_family, SOCK_STREAM, 0); + if (sd_accept == INVALID_SOCKET) { + goto fail; + } + + { // set reuseaddr to improve performance on restarts. + int oval = 1; + if (setsockopt (sd_accept, SOL_SOCKET, SO_REUSEADDR, (char*)&oval, sizeof(oval)) < 0) { + //__warning ("setsockopt failed while creating listener",""); + goto fail; + } + } + + { // set CLOEXEC. Only makes sense on Unix + #ifdef OS_UNIX + int cloexec = fcntl (sd_accept, F_GETFD, 0); + assert (cloexec >= 0); + cloexec |= FD_CLOEXEC; + fcntl (sd_accept, F_SETFD, cloexec); + #endif + } + + + if (bind (sd_accept, (struct sockaddr *)&bind_here, bind_here_len)) { + //__warning ("binding failed"); + goto fail; + } + + if (listen (sd_accept, 100)) { + //__warning ("listen failed"); + goto fail; + } + + return AttachSD(sd_accept); + + fail: + if (sd_accept != INVALID_SOCKET) + close (sd_accept); + return 0; +} + + +/********************************** +EventMachine_t::OpenDatagramSocket +**********************************/ + +const uintptr_t EventMachine_t::OpenDatagramSocket (const char *address, int port) +{ + uintptr_t output_binding = 0; + + struct sockaddr_storage bind_here; + size_t bind_here_len = sizeof bind_here; + if (0 != name2address (address, port, SOCK_DGRAM, (struct sockaddr *)&bind_here, &bind_here_len)) + return 0; + + // from here on, early returns must close the socket! + SOCKET sd = EmSocket (bind_here.ss_family, SOCK_DGRAM, 0); + if (sd == INVALID_SOCKET) + goto fail; + + { // set the SO_REUSEADDR on the socket before we bind, otherwise it won't work for a second one + int oval = 1; + if (setsockopt (sd, SOL_SOCKET, SO_REUSEADDR, (char*)&oval, sizeof(oval)) < 0) + goto fail; + } + + // Set the new socket nonblocking. + if (!SetSocketNonblocking (sd)) + goto fail; + + if (bind (sd, (struct sockaddr *)&bind_here, bind_here_len) != 0) + goto fail; + + { // Looking good. + DatagramDescriptor *ds = new DatagramDescriptor (sd, this); + if (!ds) + throw std::runtime_error ("unable to allocate datagram-socket"); + Add (ds); + output_binding = ds->GetBinding(); + } + + return output_binding; + + fail: + if (sd != INVALID_SOCKET) + close (sd); + return 0; +} + + + +/******************* +EventMachine_t::Add +*******************/ + +void EventMachine_t::Add (EventableDescriptor *ed) +{ + if (!ed) + throw std::runtime_error ("added bad descriptor"); + ed->SetEventCallback (EventCallback); + NewDescriptors.push_back (ed); +} + + +/******************************* +EventMachine_t::ArmKqueueWriter +*******************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::ArmKqueueWriter (EventableDescriptor *ed) +{ + if (Poller == Poller_Kqueue) { + if (!ed) + throw std::runtime_error ("added bad descriptor"); + struct kevent k; +#ifdef __NetBSD__ + EV_SET (&k, ed->GetSocket(), EVFILT_WRITE, EV_ADD | EV_ONESHOT, 0, 0, (intptr_t)ed); +#else + EV_SET (&k, ed->GetSocket(), EVFILT_WRITE, EV_ADD | EV_ONESHOT, 0, 0, ed); +#endif + int t = kevent (kqfd, &k, 1, NULL, 0, NULL); + if (t < 0) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "arm kqueue writer failed on %d: %s", ed->GetSocket(), strerror(errno)); + throw std::runtime_error (buf); + } + } +} +#else +void EventMachine_t::ArmKqueueWriter (EventableDescriptor *ed UNUSED) { } +#endif + +/******************************* +EventMachine_t::ArmKqueueReader +*******************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::ArmKqueueReader (EventableDescriptor *ed) +{ + if (Poller == Poller_Kqueue) { + if (!ed) + throw std::runtime_error ("added bad descriptor"); + struct kevent k; +#ifdef __NetBSD__ + EV_SET (&k, ed->GetSocket(), EVFILT_READ, EV_ADD, 0, 0, (intptr_t)ed); +#else + EV_SET (&k, ed->GetSocket(), EVFILT_READ, EV_ADD, 0, 0, ed); +#endif + int t = kevent (kqfd, &k, 1, NULL, 0, NULL); + if (t < 0) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "arm kqueue reader failed on %d: %s", ed->GetSocket(), strerror(errno)); + throw std::runtime_error (buf); + } + } +} +#else +void EventMachine_t::ArmKqueueReader (EventableDescriptor *ed UNUSED) { } +#endif + +/********************************** +EventMachine_t::_AddNewDescriptors +**********************************/ + +void EventMachine_t::_AddNewDescriptors() +{ + /* Avoid adding descriptors to the main descriptor list + * while we're actually traversing the list. + * Any descriptors that are added as a result of processing timers + * or acceptors should go on a temporary queue and then added + * while we're not traversing the main list. + * Also, it (rarely) happens that a newly-created descriptor + * is immediately scheduled to close. It might be a good + * idea not to bother scheduling these for I/O but if + * we do that, we might bypass some important processing. + */ + + for (size_t i = 0; i < NewDescriptors.size(); i++) { + EventableDescriptor *ed = NewDescriptors[i]; + if (ed == NULL) + throw std::runtime_error ("adding bad descriptor"); + + #if HAVE_EPOLL + if (Poller == Poller_Epoll) { + assert (epfd != -1); + int e = epoll_ctl (epfd, EPOLL_CTL_ADD, ed->GetSocket(), ed->GetEpollEvent()); + if (e) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to add new descriptor: %s", strerror(errno)); + throw std::runtime_error (buf); + } + } + #endif + + #if HAVE_KQUEUE + /* + if (Poller == Poller_Kqueue) { + // INCOMPLETE. Some descriptors don't want to be readable. + assert (kqfd != -1); + struct kevent k; +#ifdef __NetBSD__ + EV_SET (&k, ed->GetSocket(), EVFILT_READ, EV_ADD, 0, 0, (intptr_t)ed); +#else + EV_SET (&k, ed->GetSocket(), EVFILT_READ, EV_ADD, 0, 0, ed); +#endif + int t = kevent (kqfd, &k, 1, NULL, 0, NULL); + assert (t == 0); + } + */ + #endif + + QueueHeartbeat(ed); + Descriptors.push_back (ed); + } + NewDescriptors.clear(); +} + + +/********************************** +EventMachine_t::_ModifyDescriptors +**********************************/ + +void EventMachine_t::_ModifyDescriptors() +{ + /* For implementations which don't level check every descriptor on + * every pass through the machine, as select does. + * If we're not selecting, then descriptors need a way to signal to the + * machine that their readable or writable status has changed. + * That's what the ::Modify call is for. We do it this way to avoid + * modifying descriptors during the loop traversal, where it can easily + * happen that an object (like a UDP socket) gets data written on it by + * the application during #post_init. That would take place BEFORE the + * descriptor even gets added to the epoll descriptor, so the modify + * operation will crash messily. + * Another really messy possibility is for a descriptor to put itself + * on the Modified list, and then get deleted before we get here. + * Remember, deletes happen after the I/O traversal and before the + * next pass through here. So we have to make sure when we delete a + * descriptor to remove it from the Modified list. + */ + + #ifdef HAVE_EPOLL + if (Poller == Poller_Epoll) { + std::set<EventableDescriptor*>::iterator i = ModifiedDescriptors.begin(); + while (i != ModifiedDescriptors.end()) { + assert (*i); + _ModifyEpollEvent (*i); + ++i; + } + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller == Poller_Kqueue) { + std::set<EventableDescriptor*>::iterator i = ModifiedDescriptors.begin(); + while (i != ModifiedDescriptors.end()) { + assert (*i); + if ((*i)->GetKqueueArmWrite()) + ArmKqueueWriter (*i); + ++i; + } + } + #endif + + ModifiedDescriptors.clear(); +} + + +/********************** +EventMachine_t::Modify +**********************/ + +void EventMachine_t::Modify (EventableDescriptor *ed) +{ + if (!ed) + throw std::runtime_error ("modified bad descriptor"); + ModifiedDescriptors.insert (ed); +} + + +/*********************** +EventMachine_t::Deregister +***********************/ + +void EventMachine_t::Deregister (EventableDescriptor *ed) +{ + if (!ed) + throw std::runtime_error ("modified bad descriptor"); + #ifdef HAVE_EPOLL + // cut/paste from _CleanupSockets(). The error handling could be + // refactored out of there, but it is cut/paste all over the + // file already. + if (Poller == Poller_Epoll) { + assert (epfd != -1); + assert (ed->GetSocket() != INVALID_SOCKET); + int e = epoll_ctl (epfd, EPOLL_CTL_DEL, ed->GetSocket(), ed->GetEpollEvent()); + // ENOENT or EBADF are not errors because the socket may be already closed when we get here. + if (e && (errno != ENOENT) && (errno != EBADF) && (errno != EPERM)) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "unable to delete epoll event: %s", strerror(errno)); + throw std::runtime_error (buf); + } + ModifiedDescriptors.erase(ed); + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller == Poller_Kqueue) { + assert (ed->GetSocket() != INVALID_SOCKET); + + ModifiedDescriptors.erase(ed); + } + #endif +} + + +/************************************** +EventMachine_t::CreateUnixDomainServer +**************************************/ + +#ifdef OS_UNIX +const uintptr_t EventMachine_t::CreateUnixDomainServer (const char *filename) +{ + /* Create a UNIX-domain acceptor (server) socket and add it to the event machine. + * Return the binding of the new acceptor to the caller. + * This binding will be referenced when the new acceptor sends events + * to indicate accepted connections. + * THERE IS NO MEANINGFUL IMPLEMENTATION ON WINDOWS. + */ + + struct sockaddr_un s_sun; + + SOCKET sd_accept = EmSocket (AF_LOCAL, SOCK_STREAM, 0); + if (sd_accept == INVALID_SOCKET) { + goto fail; + } + + if (!filename || !*filename) + goto fail; + unlink (filename); + + bzero (&s_sun, sizeof(s_sun)); + s_sun.sun_family = AF_LOCAL; + strncpy (s_sun.sun_path, filename, sizeof(s_sun.sun_path)-1); + + // don't bother with reuseaddr for a local socket. + + { // set CLOEXEC. Only makes sense on Unix + #ifdef OS_UNIX + int cloexec = fcntl (sd_accept, F_GETFD, 0); + assert (cloexec >= 0); + cloexec |= FD_CLOEXEC; + fcntl (sd_accept, F_SETFD, cloexec); + #endif + } + + if (bind (sd_accept, (struct sockaddr*)&s_sun, sizeof(s_sun))) { + //__warning ("binding failed"); + goto fail; + } + + if (listen (sd_accept, 100)) { + //__warning ("listen failed"); + goto fail; + } + + return AttachSD(sd_accept); + + fail: + if (sd_accept != INVALID_SOCKET) + close (sd_accept); + return 0; +} +#else +const uintptr_t EventMachine_t::CreateUnixDomainServer (const char *filename UNUSED) +{ + throw std::runtime_error ("unix-domain server unavailable on this platform"); +} +#endif + + +/************************************** +EventMachine_t::AttachSD +**************************************/ + +const uintptr_t EventMachine_t::AttachSD (SOCKET sd_accept) +{ + uintptr_t output_binding = 0; + + { + // Set the acceptor non-blocking. + // THIS IS CRUCIALLY IMPORTANT because we read it in a select loop. + if (!SetSocketNonblocking (sd_accept)) { + //int val = fcntl (sd_accept, F_GETFL, 0); + //if (fcntl (sd_accept, F_SETFL, val | O_NONBLOCK) == -1) { + goto fail; + } + } + + { // Looking good. + AcceptorDescriptor *ad = new AcceptorDescriptor (sd_accept, this); + if (!ad) + throw std::runtime_error ("unable to allocate acceptor"); + Add (ad); + output_binding = ad->GetBinding(); + } + + return output_binding; + + fail: + if (sd_accept != INVALID_SOCKET) + close (sd_accept); + return 0; +} + + +/************************** +EventMachine_t::Socketpair +**************************/ + +#ifdef OS_UNIX +const uintptr_t EventMachine_t::Socketpair (char * const * cmd_strings) +{ + // Make sure the incoming array of command strings is sane. + if (!cmd_strings) + return 0; + int j; + for (j=0; j < 2048 && cmd_strings[j]; j++) + ; + if ((j==0) || (j==2048)) + return 0; + + uintptr_t output_binding = 0; + + int sv[2]; + if (socketpair (AF_LOCAL, SOCK_STREAM, 0, sv) < 0) + return 0; + // from here, all early returns must close the pair of sockets. + + // Set the parent side of the socketpair nonblocking. + // We don't care about the child side, and most child processes will expect their + // stdout to be blocking. Thanks to Duane Johnson and Bill Kelly for pointing this out. + // Obviously DON'T set CLOEXEC. + if (!SetSocketNonblocking (sv[0])) { + close (sv[0]); + close (sv[1]); + return 0; + } + + pid_t f = fork(); + if (f > 0) { + close (sv[1]); + PipeDescriptor *pd = new PipeDescriptor (sv[0], f, this); + if (!pd) + throw std::runtime_error ("unable to allocate pipe"); + Add (pd); + output_binding = pd->GetBinding(); + } + else if (f == 0) { + close (sv[0]); + dup2 (sv[1], STDIN_FILENO); + close (sv[1]); + dup2 (STDIN_FILENO, STDOUT_FILENO); + execvp (cmd_strings[0], cmd_strings+1); + exit (-1); // end the child process if the exec doesn't work. + } + else + throw std::runtime_error ("no fork"); + + return output_binding; +} +#else +const uintptr_t EventMachine_t::Socketpair (char * const * cmd_strings UNUSED) +{ + throw std::runtime_error ("socketpair is currently unavailable on this platform"); +} +#endif + + + +/**************************** +EventMachine_t::OpenKeyboard +****************************/ + +const uintptr_t EventMachine_t::OpenKeyboard() +{ + KeyboardDescriptor *kd = new KeyboardDescriptor (this); + if (!kd) + throw std::runtime_error ("no keyboard-object allocated"); + Add (kd); + return kd->GetBinding(); +} + + +/********************************** +EventMachine_t::GetConnectionCount +**********************************/ + +int EventMachine_t::GetConnectionCount () +{ + int i = 0; + // Subtract one for epoll or kqueue because of the LoopbreakDescriptor + if (Poller == Poller_Epoll || Poller == Poller_Kqueue) + i = 1; + + return Descriptors.size() + NewDescriptors.size() - i; +} + + +/************************ +EventMachine_t::WatchPid +************************/ + +#ifdef HAVE_KQUEUE +const uintptr_t EventMachine_t::WatchPid (int pid) +{ + if (Poller != Poller_Kqueue) + throw std::runtime_error("must enable kqueue (EM.kqueue=true) for pid watching support"); + + struct kevent event; + int kqres; + + EV_SET(&event, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT | NOTE_FORK, 0, 0); + + // Attempt to register the event + kqres = kevent(kqfd, &event, 1, NULL, 0, NULL); + if (kqres == -1) { + char errbuf[200]; + sprintf(errbuf, "failed to register file watch descriptor with kqueue: %s", strerror(errno)); + throw std::runtime_error(errbuf); + } + Bindable_t* b = new Bindable_t(); + Pids.insert(std::make_pair (pid, b)); + + return b->GetBinding(); +} +#else +const uintptr_t EventMachine_t::WatchPid (int pid UNUSED) +{ + throw std::runtime_error("no pid watching support on this system"); +} +#endif + +/************************** +EventMachine_t::UnwatchPid +**************************/ + +void EventMachine_t::UnwatchPid (int pid) +{ + Bindable_t *b = Pids[pid]; + assert(b); + Pids.erase(pid); + + #ifdef HAVE_KQUEUE + struct kevent k; + + EV_SET(&k, pid, EVFILT_PROC, EV_DELETE, 0, 0, 0); + /*int t =*/ kevent (kqfd, &k, 1, NULL, 0, NULL); + // t==-1 if the process already exited; ignore this for now + #endif + + if (EventCallback) + (*EventCallback)(b->GetBinding(), EM_CONNECTION_UNBOUND, NULL, 0); + + delete b; +} + +void EventMachine_t::UnwatchPid (const uintptr_t sig) +{ + for(std::map<int, Bindable_t*>::iterator i=Pids.begin(); i != Pids.end(); i++) + { + if (i->second->GetBinding() == sig) { + UnwatchPid (i->first); + return; + } + } + + throw std::runtime_error("attempted to remove invalid pid signature"); +} + + +/************************* +EventMachine_t::WatchFile +*************************/ + +const uintptr_t EventMachine_t::WatchFile (const char *fpath) +{ + struct stat sb; + int sres; + int wd = -1; + + sres = stat(fpath, &sb); + + if (sres == -1) { + char errbuf[300]; + sprintf(errbuf, "error registering file %s for watching: %s", fpath, strerror(errno)); + throw std::runtime_error(errbuf); + } + + #ifdef HAVE_INOTIFY + if (!inotify) { + inotify = new InotifyDescriptor(this); + assert (inotify); + Add(inotify); + } + + wd = inotify_add_watch(inotify->GetSocket(), fpath, + IN_MODIFY | IN_DELETE_SELF | IN_MOVE_SELF | IN_CREATE | IN_DELETE | IN_MOVE) ; + if (wd == -1) { + char errbuf[300]; + sprintf(errbuf, "failed to open file %s for registering with inotify: %s", fpath, strerror(errno)); + throw std::runtime_error(errbuf); + } + #endif + + #ifdef HAVE_KQUEUE + if (Poller != Poller_Kqueue) + throw std::runtime_error("must enable kqueue (EM.kqueue=true) for file watching support"); + + // With kqueue we have to open the file first and use the resulting fd to register for events + wd = open(fpath, O_RDONLY); + if (wd == -1) { + char errbuf[300]; + sprintf(errbuf, "failed to open file %s for registering with kqueue: %s", fpath, strerror(errno)); + throw std::runtime_error(errbuf); + } + _RegisterKqueueFileEvent(wd); + #endif + + if (wd != -1) { + Bindable_t* b = new Bindable_t(); + Files.insert(std::make_pair (wd, b)); + + return b->GetBinding(); + } + + throw std::runtime_error("no file watching support on this system"); // is this the right thing to do? +} + + +/*************************** +EventMachine_t::UnwatchFile +***************************/ + +void EventMachine_t::UnwatchFile (int wd) +{ + Bindable_t *b = Files[wd]; + assert(b); + Files.erase(wd); + + #ifdef HAVE_INOTIFY + inotify_rm_watch(inotify->GetSocket(), wd); + #elif HAVE_KQUEUE + // With kqueue, closing the monitored fd automatically clears all registered events for it + close(wd); + #endif + + if (EventCallback) + (*EventCallback)(b->GetBinding(), EM_CONNECTION_UNBOUND, NULL, 0); + + delete b; +} + +void EventMachine_t::UnwatchFile (const uintptr_t sig) +{ + for(std::map<int, Bindable_t*>::iterator i=Files.begin(); i != Files.end(); i++) + { + if (i->second->GetBinding() == sig) { + UnwatchFile (i->first); + return; + } + } + throw std::runtime_error("attempted to remove invalid watch signature"); +} + + +/*********************************** +EventMachine_t::_ReadInotify_Events +************************************/ + +void EventMachine_t::_ReadInotifyEvents() +{ + #ifdef HAVE_INOTIFY + char buffer[1024]; + + assert(EventCallback); + + for (;;) { + int returned = read(inotify->GetSocket(), buffer, sizeof(buffer)); + assert(!(returned == 0 || (returned == -1 && errno == EINVAL))); + if (returned <= 0) { + break; + } + int current = 0; + while (current < returned) { + struct inotify_event* event = (struct inotify_event*)(buffer+current); + std::map<int, Bindable_t*>::const_iterator bindable = Files.find(event->wd); + if (bindable != Files.end()) { + if (event->mask & (IN_MODIFY | IN_CREATE | IN_DELETE | IN_MOVE)){ + (*EventCallback)(bindable->second->GetBinding(), EM_CONNECTION_READ, "modified", 8); + } + if (event->mask & IN_MOVE_SELF){ + (*EventCallback)(bindable->second->GetBinding(), EM_CONNECTION_READ, "moved", 5); + } + if (event->mask & IN_DELETE_SELF) { + (*EventCallback)(bindable->second->GetBinding(), EM_CONNECTION_READ, "deleted", 7); + UnwatchFile ((int)event->wd); + } + } + current += sizeof(struct inotify_event) + event->len; + } + } + #endif +} + + +/************************************* +EventMachine_t::_HandleKqueuePidEvent +*************************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::_HandleKqueuePidEvent(struct kevent *event) +{ + assert(EventCallback); + + if (event->fflags & NOTE_FORK) + (*EventCallback)(Pids [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "fork", 4); + if (event->fflags & NOTE_EXIT) { + (*EventCallback)(Pids [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "exit", 4); + // stop watching the pid if it died + UnwatchPid ((int)event->ident); + } +} +#endif + + +/************************************** +EventMachine_t::_HandleKqueueFileEvent +***************************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::_HandleKqueueFileEvent(struct kevent *event) +{ + assert(EventCallback); + + if (event->fflags & NOTE_WRITE) + (*EventCallback)(Files [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "modified", 8); + if (event->fflags & NOTE_RENAME) + (*EventCallback)(Files [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "moved", 5); + if (event->fflags & NOTE_DELETE) { + (*EventCallback)(Files [(int) event->ident]->GetBinding(), EM_CONNECTION_READ, "deleted", 7); + UnwatchFile ((int)event->ident); + } +} +#endif + + +/**************************************** +EventMachine_t::_RegisterKqueueFileEvent +*****************************************/ + +#ifdef HAVE_KQUEUE +void EventMachine_t::_RegisterKqueueFileEvent(int fd) +{ + struct kevent newevent; + int kqres; + + // Setup the event with our fd and proper flags + EV_SET(&newevent, fd, EVFILT_VNODE, EV_ADD | EV_CLEAR, NOTE_DELETE | NOTE_RENAME | NOTE_WRITE, 0, 0); + + // Attempt to register the event + kqres = kevent(kqfd, &newevent, 1, NULL, 0, NULL); + if (kqres == -1) { + char errbuf[200]; + sprintf(errbuf, "failed to register file watch descriptor with kqueue: %s", strerror(errno)); + close(fd); + throw std::runtime_error(errbuf); + } +} +#endif + + +/************************************ +EventMachine_t::GetHeartbeatInterval +*************************************/ + +float EventMachine_t::GetHeartbeatInterval() +{ + return ((float)HeartbeatInterval / 1000000); +} + + +/************************************ +EventMachine_t::SetHeartbeatInterval +*************************************/ + +int EventMachine_t::SetHeartbeatInterval(float interval) +{ + int iv = (int)(interval * 1000000); + if (iv > 0) { + HeartbeatInterval = iv; + return 1; + } + return 0; +} +//#endif // OS_UNIX diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/em.h b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/em.h new file mode 100644 index 000000000000..874a1278d69c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/em.h @@ -0,0 +1,308 @@ +/***************************************************************************** + +$Id$ + +File: em.h +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#ifndef __EventMachine__H_ +#define __EventMachine__H_ + +#ifdef BUILD_FOR_RUBY + #include <ruby.h> + #ifdef HAVE_RB_THREAD_FD_SELECT + #define EmSelect rb_thread_fd_select + #else + // ruby 1.9.1 and below + #define EmSelect rb_thread_select + #endif + + #ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL + #include <ruby/thread.h> + #endif + + #ifdef HAVE_RB_WAIT_FOR_SINGLE_FD + #include <ruby/io.h> + #endif + + #if defined(HAVE_RB_TRAP_IMMEDIATE) + #include <rubysig.h> + #elif defined(HAVE_RB_ENABLE_INTERRUPT) + extern "C" { + void rb_enable_interrupt(void); + void rb_disable_interrupt(void); + } + + #define TRAP_BEG rb_enable_interrupt() + #define TRAP_END do { rb_disable_interrupt(); rb_thread_check_ints(); } while(0) + #else + #define TRAP_BEG + #define TRAP_END + #endif + + // 1.9.0 compat + #ifndef RUBY_UBF_IO + #define RUBY_UBF_IO RB_UBF_DFL + #endif + #ifndef RSTRING_PTR + #define RSTRING_PTR(str) RSTRING(str)->ptr + #endif + #ifndef RSTRING_LEN + #define RSTRING_LEN(str) RSTRING(str)->len + #endif + #ifndef RSTRING_LENINT + #define RSTRING_LENINT(str) RSTRING_LEN(str) + #endif +#else + #define EmSelect select +#endif + +#if !defined(HAVE_TYPE_RB_FDSET_T) +#define fd_check(n) (((n) < FD_SETSIZE) ? 1 : 0*fprintf(stderr, "fd %d too large for select\n", (n))) +// These definitions are cribbed from include/ruby/intern.h in Ruby 1.9.3, +// with this change: any macros that read or write the nth element of an +// fdset first call fd_check to make sure n is in bounds. +typedef fd_set rb_fdset_t; +#define rb_fd_zero(f) FD_ZERO(f) +#define rb_fd_set(n, f) do { if (fd_check(n)) FD_SET((n), (f)); } while(0) +#define rb_fd_clr(n, f) do { if (fd_check(n)) FD_CLR((n), (f)); } while(0) +#define rb_fd_isset(n, f) (fd_check(n) ? FD_ISSET((n), (f)) : 0) +#define rb_fd_copy(d, s, n) (*(d) = *(s)) +#define rb_fd_dup(d, s) (*(d) = *(s)) +#define rb_fd_resize(n, f) ((void)(f)) +#define rb_fd_ptr(f) (f) +#define rb_fd_init(f) FD_ZERO(f) +#define rb_fd_init_copy(d, s) (*(d) = *(s)) +#define rb_fd_term(f) ((void)(f)) +#define rb_fd_max(f) FD_SETSIZE +#define rb_fd_select(n, rfds, wfds, efds, timeout) \ + select(fd_check((n)-1) ? (n) : FD_SETSIZE, (rfds), (wfds), (efds), (timeout)) +#define rb_thread_fd_select(n, rfds, wfds, efds, timeout) \ + rb_thread_select(fd_check((n)-1) ? (n) : FD_SETSIZE, (rfds), (wfds), (efds), (timeout)) +#endif + + +// This Solaris fix is adapted from eval_intern.h in Ruby 1.9.3: +// Solaris sys/select.h switches select to select_large_fdset to support larger +// file descriptors if FD_SETSIZE is larger than 1024 on 32bit environment. +// But Ruby doesn't change FD_SETSIZE because fd_set is allocated dynamically. +// So following definition is required to use select_large_fdset. +#ifdef HAVE_SELECT_LARGE_FDSET +#define select(n, r, w, e, t) select_large_fdset((n), (r), (w), (e), (t)) +extern "C" { + int select_large_fdset(int, fd_set *, fd_set *, fd_set *, struct timeval *); +} +#endif + +class EventableDescriptor; +class InotifyDescriptor; +struct SelectData_t; + +/************* +enum Poller_t +*************/ +enum Poller_t { + Poller_Default, // typically Select + Poller_Epoll, + Poller_Kqueue +}; + + +/******************** +class EventMachine_t +********************/ + +class EventMachine_t +{ + public: + static int GetMaxTimerCount(); + static void SetMaxTimerCount (int); + + static int GetSimultaneousAcceptCount(); + static void SetSimultaneousAcceptCount (int); + + public: + EventMachine_t (EMCallback, Poller_t); + virtual ~EventMachine_t(); + + bool RunOnce(); + void Run(); + void ScheduleHalt(); + bool Stopping(); + void SignalLoopBreaker(); + const uintptr_t InstallOneshotTimer (uint64_t); + const uintptr_t ConnectToServer (const char *, int, const char *, int); + const uintptr_t ConnectToUnixServer (const char *); + + const uintptr_t CreateTcpServer (const char *, int); + const uintptr_t OpenDatagramSocket (const char *, int); + const uintptr_t CreateUnixDomainServer (const char*); + const uintptr_t AttachSD (SOCKET); + const uintptr_t OpenKeyboard(); + //const char *Popen (const char*, const char*); + const uintptr_t Socketpair (char* const*); + + void Add (EventableDescriptor*); + void Modify (EventableDescriptor*); + void Deregister (EventableDescriptor*); + + const uintptr_t AttachFD (SOCKET, bool); + int DetachFD (EventableDescriptor*); + + void ArmKqueueWriter (EventableDescriptor*); + void ArmKqueueReader (EventableDescriptor*); + + void SetTimerQuantum (int); + static void SetuidString (const char*); + static int SetRlimitNofile (int); + + pid_t SubprocessPid; + int SubprocessExitStatus; + + int GetConnectionCount(); + float GetHeartbeatInterval(); + int SetHeartbeatInterval(float); + + const uintptr_t WatchFile (const char*); + void UnwatchFile (int); + void UnwatchFile (const uintptr_t); + + #ifdef HAVE_KQUEUE + void _HandleKqueueFileEvent (struct kevent*); + void _RegisterKqueueFileEvent(int); + #endif + + const uintptr_t WatchPid (int); + void UnwatchPid (int); + void UnwatchPid (const uintptr_t); + + #ifdef HAVE_KQUEUE + void _HandleKqueuePidEvent (struct kevent*); + #endif + + uint64_t GetCurrentLoopTime() { return MyCurrentLoopTime; } + + void QueueHeartbeat(EventableDescriptor*); + void ClearHeartbeat(uint64_t, EventableDescriptor*); + + uint64_t GetRealTime(); + + Poller_t GetPoller() { return Poller; } + + static int name2address (const char *server, int port, int socktype, struct sockaddr *addr, size_t *addr_len); + + private: + void _RunTimers(); + void _UpdateTime(); + void _AddNewDescriptors(); + void _ModifyDescriptors(); + void _InitializeLoopBreaker(); + void _CleanupSockets(); + + void _RunSelectOnce(); + void _RunEpollOnce(); + void _RunKqueueOnce(); + + void _ModifyEpollEvent (EventableDescriptor*); + void _DispatchHeartbeats(); + timeval _TimeTilNextEvent(); + void _CleanBadDescriptors(); + + public: + void _ReadLoopBreaker(); + void _ReadInotifyEvents(); + int NumCloseScheduled; + + private: + enum { + MaxEpollDescriptors = 64*1024, + MaxEvents = 4096 + }; + int HeartbeatInterval; + EMCallback EventCallback; + + class Timer_t: public Bindable_t { + }; + + std::multimap<uint64_t, Timer_t> Timers; + std::multimap<uint64_t, EventableDescriptor*> Heartbeats; + std::map<int, Bindable_t*> Files; + std::map<int, Bindable_t*> Pids; + std::vector<EventableDescriptor*> Descriptors; + std::vector<EventableDescriptor*> NewDescriptors; + std::set<EventableDescriptor*> ModifiedDescriptors; + + SOCKET LoopBreakerReader; + SOCKET LoopBreakerWriter; + #ifdef OS_WIN32 + struct sockaddr_in LoopBreakerTarget; + #endif + + timeval Quantum; + + uint64_t MyCurrentLoopTime; + + #ifdef OS_WIN32 + unsigned TickCountTickover; + unsigned LastTickCount; + #endif + + #ifdef OS_DARWIN + mach_timebase_info_data_t mach_timebase; + #endif + + private: + bool bTerminateSignalReceived; + SelectData_t *SelectData; + + Poller_t Poller; + + int epfd; // Epoll file-descriptor + #ifdef HAVE_EPOLL + struct epoll_event epoll_events [MaxEvents]; + #endif + + int kqfd; // Kqueue file-descriptor + #ifdef HAVE_KQUEUE + struct kevent Karray [MaxEvents]; + #endif + + #ifdef HAVE_INOTIFY + InotifyDescriptor *inotify; // pollable descriptor for our inotify instance + #endif +}; + + +/******************* +struct SelectData_t +*******************/ + +struct SelectData_t +{ + SelectData_t(); + ~SelectData_t(); + + int _Select(); + void _Clear(); + + SOCKET maxsocket; + rb_fdset_t fdreads; + rb_fdset_t fdwrites; + rb_fdset_t fderrors; + timeval tv; + int nSockets; +}; + +#endif // __EventMachine__H_ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/em.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/em.o new file mode 100644 index 000000000000..59c54acbb55b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/em.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/eventmachine.h b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/eventmachine.h new file mode 100644 index 000000000000..5100e20d7e55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/eventmachine.h @@ -0,0 +1,143 @@ +/***************************************************************************** + +$Id$ + +File: eventmachine.h +Date: 15Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#ifndef __EVMA_EventMachine__H_ +#define __EVMA_EventMachine__H_ + +#if __cplusplus +extern "C" { +#endif + + enum { // Event names + EM_TIMER_FIRED = 100, + EM_CONNECTION_READ = 101, + EM_CONNECTION_UNBOUND = 102, + EM_CONNECTION_ACCEPTED = 103, + EM_CONNECTION_COMPLETED = 104, + EM_LOOPBREAK_SIGNAL = 105, + EM_CONNECTION_NOTIFY_READABLE = 106, + EM_CONNECTION_NOTIFY_WRITABLE = 107, + EM_SSL_HANDSHAKE_COMPLETED = 108, + EM_SSL_VERIFY = 109, + EM_PROXY_TARGET_UNBOUND = 110, + EM_PROXY_COMPLETED = 111 + }; + + enum { // SSL/TLS Protocols + EM_PROTO_SSLv2 = 2, + EM_PROTO_SSLv3 = 4, + EM_PROTO_TLSv1 = 8, + EM_PROTO_TLSv1_1 = 16, + EM_PROTO_TLSv1_2 = 32 + }; + + void evma_initialize_library (EMCallback); + bool evma_run_machine_once(); + void evma_run_machine(); + void evma_release_library(); + const uintptr_t evma_install_oneshot_timer (uint64_t milliseconds); + const uintptr_t evma_connect_to_server (const char *bind_addr, int bind_port, const char *server, int port); + const uintptr_t evma_connect_to_unix_server (const char *server); + + const uintptr_t evma_attach_fd (int file_descriptor, int watch_mode); + int evma_detach_fd (const uintptr_t binding); + int evma_get_file_descriptor (const uintptr_t binding); + int evma_is_notify_readable (const uintptr_t binding); + void evma_set_notify_readable (const uintptr_t binding, int mode); + int evma_is_notify_writable (const uintptr_t binding); + void evma_set_notify_writable (const uintptr_t binding, int mode); + + int evma_pause(const uintptr_t binding); + int evma_is_paused(const uintptr_t binding); + int evma_resume(const uintptr_t binding); + + int evma_num_close_scheduled(); + + void evma_stop_tcp_server (const uintptr_t binding); + const uintptr_t evma_create_tcp_server (const char *address, int port); + const uintptr_t evma_create_unix_domain_server (const char *filename); + const uintptr_t evma_attach_sd (int sd); + const uintptr_t evma_open_datagram_socket (const char *server, int port); + const uintptr_t evma_open_keyboard(); + void evma_set_tls_parms (const uintptr_t binding, const char *privatekey_filename, const char *certchain_filenane, int verify_peer, int fail_if_no_peer_cert, const char *sni_hostname, const char *cipherlist, const char *ecdh_curve, const char *dhparam, int protocols); + void evma_start_tls (const uintptr_t binding); + + #ifdef WITH_SSL + X509 *evma_get_peer_cert (const uintptr_t binding); + int evma_get_cipher_bits (const uintptr_t binding); + const char *evma_get_cipher_name (const uintptr_t binding); + const char *evma_get_cipher_protocol (const uintptr_t binding); + const char *evma_get_sni_hostname (const uintptr_t binding); + void evma_accept_ssl_peer (const uintptr_t binding); + #endif + + int evma_get_peername (const uintptr_t binding, struct sockaddr*, socklen_t*); + int evma_get_sockname (const uintptr_t binding, struct sockaddr*, socklen_t*); + int evma_get_subprocess_pid (const uintptr_t binding, pid_t*); + int evma_get_subprocess_status (const uintptr_t binding, int*); + int evma_get_connection_count(); + int evma_send_data_to_connection (const uintptr_t binding, const char *data, int data_length); + int evma_send_datagram (const uintptr_t binding, const char *data, int data_length, const char *address, int port); + float evma_get_comm_inactivity_timeout (const uintptr_t binding); + int evma_set_comm_inactivity_timeout (const uintptr_t binding, float value); + float evma_get_pending_connect_timeout (const uintptr_t binding); + int evma_set_pending_connect_timeout (const uintptr_t binding, float value); + int evma_get_outbound_data_size (const uintptr_t binding); + uint64_t evma_get_last_activity_time (const uintptr_t binding); + int evma_send_file_data_to_connection (const uintptr_t binding, const char *filename); + + void evma_close_connection (const uintptr_t binding, int after_writing); + int evma_report_connection_error_status (const uintptr_t binding); + void evma_signal_loopbreak(); + void evma_set_timer_quantum (int); + int evma_get_max_timer_count(); + void evma_set_max_timer_count (int); + int evma_get_simultaneous_accept_count(); + void evma_set_simultaneous_accept_count (int); + void evma_setuid_string (const char *username); + void evma_stop_machine(); + bool evma_stopping(); + float evma_get_heartbeat_interval(); + int evma_set_heartbeat_interval(float); + + const uintptr_t evma_popen (char * const*cmd_strings); + + const uintptr_t evma_watch_filename (const char *fname); + void evma_unwatch_filename (const uintptr_t binding); + + const uintptr_t evma_watch_pid (int); + void evma_unwatch_pid (const uintptr_t binding); + + void evma_start_proxy(const uintptr_t from, const uintptr_t to, const unsigned long bufsize, const unsigned long length); + void evma_stop_proxy(const uintptr_t from); + unsigned long evma_proxied_bytes(const uintptr_t from); + + int evma_set_rlimit_nofile (int n_files); + + void evma_set_epoll (int use); + void evma_set_kqueue (int use); + + uint64_t evma_get_current_loop_time(); +#if __cplusplus +} +#endif + + +#endif // __EventMachine__H_ + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/extconf.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/extconf.rb new file mode 100644 index 000000000000..676b4c4262bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/extconf.rb @@ -0,0 +1,270 @@ +require 'fileutils' +require 'mkmf' + +# Eager check devs tools +have_devel? if respond_to?(:have_devel?) + +def check_libs libs = [], fatal = false + libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) } +end + +def check_heads heads = [], fatal = false + heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)} +end + +def add_define(name) + $defs.push("-D#{name}") +end + +## +# OpenSSL: + +# override append_library, so it actually appends (instead of prepending) +# this fixes issues with linking ssl, since libcrypto depends on symbols in libssl +def append_library(libs, lib) + libs + " " + format(LIBARG, lib) +end + +SSL_HEADS = %w(openssl/ssl.h openssl/err.h) +SSL_LIBS = %w(crypto ssl) +# OpenSSL 1.1.0 and above for Windows use the Unix library names +# OpenSSL 0.9.8 and 1.0.x for Windows use the *eay32 library names +SSL_LIBS_WIN = RUBY_PLATFORM =~ /mswin|mingw|bccwin/ ? %w(ssleay32 libeay32) : [] + +def dir_config_wrapper(pretty_name, name, idefault=nil, ldefault=nil) + inc, lib = dir_config(name, idefault, ldefault) + if inc && lib + # TODO: Remove when 2.0.0 is the minimum supported version + # Ruby versions not incorporating the mkmf fix at + # https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/39717 + # do not properly search for lib directories, and must be corrected + unless lib && lib[-3, 3] == 'lib' + @libdir_basename = 'lib' + inc, lib = dir_config(name, idefault, ldefault) + end + unless idefault && ldefault + abort "-----\nCannot find #{pretty_name} include path #{inc}\n-----" unless inc && inc.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) } + abort "-----\nCannot find #{pretty_name} library path #{lib}\n-----" unless lib && lib.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) } + warn "-----\nUsing #{pretty_name} in path #{File.dirname inc}\n-----" + end + true + end +end + +def dir_config_search(pretty_name, name, paths, &b) + paths.each do |p| + if dir_config_wrapper('OpenSSL', 'ssl', p + '/include', p + '/lib') && yield + warn "-----\nFound #{pretty_name} in path #{p}\n-----" + return true + end + end + false +end + +def pkg_config_wrapper(pretty_name, name) + cflags, ldflags, libs = pkg_config(name) + unless [cflags, ldflags, libs].any?(&:nil?) || [cflags, ldflags, libs].any?(&:empty?) + warn "-----\nUsing #{pretty_name} from pkg-config #{cflags} && #{ldflags} && #{libs}\n-----" + true + end +end + +if ENV['CROSS_COMPILING'] + openssl_version = ENV.fetch("OPENSSL_VERSION", "1.0.2e") + openssl_dir = File.expand_path("~/.rake-compiler/builds/openssl-#{openssl_version}/") + if File.exist?(openssl_dir) + FileUtils.mkdir_p Dir.pwd+"/openssl/" + FileUtils.cp Dir[openssl_dir+"/include/openssl/*.h"], Dir.pwd+"/openssl/", :verbose => true + FileUtils.cp Dir[openssl_dir+"/lib*.a"], Dir.pwd, :verbose => true + $INCFLAGS << " -I#{Dir.pwd}" # for the openssl headers + add_define "WITH_SSL" + else + STDERR.puts + STDERR.puts "**************************************************************************************" + STDERR.puts "**** Cross-compiled OpenSSL not found" + STDERR.puts "**** Run: hg clone http://bitbucket.org/ged/ruby-pg && cd ruby-pg && rake openssl_libs" + STDERR.puts "**************************************************************************************" + STDERR.puts + end +elsif dir_config_wrapper('OpenSSL', 'ssl') + # If the user has provided a --with-ssl-dir argument, we must respect it or fail. + add_define 'WITH_SSL' if (check_libs(SSL_LIBS) || check_libs(SSL_LIBS_WIN)) && check_heads(SSL_HEADS) +elsif pkg_config_wrapper('OpenSSL', 'openssl') + # If we can detect OpenSSL by pkg-config, use it as the next-best option + add_define 'WITH_SSL' if (check_libs(SSL_LIBS) || check_libs(SSL_LIBS_WIN)) && check_heads(SSL_HEADS) +elsif (check_libs(SSL_LIBS) || check_libs(SSL_LIBS_WIN)) && check_heads(SSL_HEADS) + # If we don't even need any options to find a usable OpenSSL, go with it + add_define 'WITH_SSL' +elsif dir_config_search('OpenSSL', 'ssl', ['/usr/local', '/opt/local', '/usr/local/opt/openssl']) do + (check_libs(SSL_LIBS) || check_libs(SSL_LIBS_WIN)) && check_heads(SSL_HEADS) + end + # Finally, look for OpenSSL in alternate locations including MacPorts and HomeBrew + add_define 'WITH_SSL' +end + +add_define 'BUILD_FOR_RUBY' + +# Ruby features: + +have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h']) +have_func('rb_thread_blocking_region') +have_func('rb_thread_call_without_gvl', 'ruby/thread.h') +have_func('rb_thread_fd_select') +have_type('rb_fdset_t', 'ruby/intern.h') +have_func('rb_wait_for_single_fd') +have_func('rb_enable_interrupt') +have_func('rb_time_new') + +# System features: + +add_define('HAVE_INOTIFY') if inotify = have_func('inotify_init', 'sys/inotify.h') +add_define('HAVE_OLD_INOTIFY') if !inotify && have_macro('__NR_inotify_init', 'sys/syscall.h') +have_func('writev', 'sys/uio.h') +have_func('pipe2', 'unistd.h') +have_func('accept4', 'sys/socket.h') +have_const('SOCK_CLOEXEC', 'sys/socket.h') + +# Minor platform details between *nix and Windows: + +if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/ + GNU_CHAIN = ENV['CROSS_COMPILING'] || $1 == 'mingw' + OS_WIN32 = true + add_define "OS_WIN32" +else + GNU_CHAIN = true + OS_UNIX = true + add_define 'OS_UNIX' + + add_define "HAVE_KQUEUE" if have_header("sys/event.h") && have_header("sys/queue.h") +end + +# Adjust number of file descriptors (FD) on Windows + +if RbConfig::CONFIG["host_os"] =~ /mingw/ + found = RbConfig::CONFIG.values_at("CFLAGS", "CPPFLAGS"). + any? { |v| v.include?("FD_SETSIZE") } + + add_define "FD_SETSIZE=32767" unless found +end + +# Main platform invariances: + +case RUBY_PLATFORM +when /mswin32/, /mingw32/, /bccwin32/ + check_heads(%w[windows.h winsock.h], true) + check_libs(%w[kernel32 rpcrt4 gdi32], true) + + if GNU_CHAIN + CONFIG['LDSHAREDXX'] = "$(CXX) -shared -static-libgcc -static-libstdc++" + else + $defs.push "-EHs" + $defs.push "-GR" + end + + # Newer versions of Ruby already define _WIN32_WINNT, which is needed + # to get access to newer POSIX networking functions (e.g. getaddrinfo) + add_define '_WIN32_WINNT=0x0501' unless have_func('getaddrinfo') + +when /solaris/ + add_define 'OS_SOLARIS8' + check_libs(%w[nsl socket], true) + + # If Ruby was compiled for 32-bits, then select() can only handle 1024 fds + # There is an alternate function, select_large_fdset, that supports more. + have_func('select_large_fdset', 'sys/select.h') + + if CONFIG['CC'] == 'cc' && ( + `cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler + `cc -V 2>&1` =~ /Sun/ # detect Solaris Studio compiler + ) + # SUN CHAIN + add_define 'CC_SUNWspro' + $preload = ["\nCXX = CC"] # hack a CXX= line into the makefile + $CFLAGS = CONFIG['CFLAGS'] = "-KPIC" + CONFIG['CCDLFLAGS'] = "-KPIC" + CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd" + CONFIG['LDSHAREDXX'] = "$(CXX) -G -KPIC -lCstd" + else + # GNU CHAIN + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + end + +when /openbsd/ + # OpenBSD branch contributed by Guillaume Sellier. + + # on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs + CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++ -fPIC" + CONFIG['LDSHAREDXX'] = "$(CXX) -shared -lstdc++ -fPIC" + +when /darwin/ + add_define 'OS_DARWIN' + + # on Unix we need a g++ link, not gcc. + # Ff line contributed by Daniel Harple. + CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ') + +when /linux/ + add_define 'HAVE_EPOLL' if have_func('epoll_create', 'sys/epoll.h') + + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + +when /aix/ + CONFIG['LDSHARED'] = "$(CXX) -Wl,-bstatic -Wl,-bdynamic -Wl,-G -Wl,-brtl" + +when /cygwin/ + # For rubies built with Cygwin, CXX may be set to CC, which is just + # a wrapper for gcc. + # This will compile, but it will not link to the C++ std library. + # Explicitly set CXX to use g++. + CONFIG['CXX'] = "g++" + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + +else + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" +end + +# Platform-specific time functions +if have_func('clock_gettime') + # clock_gettime is POSIX, but the monotonic clocks are not + have_const('CLOCK_MONOTONIC_RAW', 'time.h') # Linux + have_const('CLOCK_MONOTONIC', 'time.h') # Linux, Solaris, BSDs +else + have_func('gethrtime') # Older Solaris and HP-UX +end + +# Hack so that try_link will test with a C++ compiler instead of a C compiler +TRY_LINK.sub!('$(CC)', '$(CXX)') + +# This is our wishlist. We use whichever flags work on the host. +# In the future, add -Werror to make sure all warnings are resolved. +# deprecated-declarations are used in OS X OpenSSL +# ignored-qualifiers are used by the Bindings (would-be void *) +# unused-result because GCC 4.6 no longer silences (void) ignore_this(function) +# address because on Windows, rb_fd_select checks if &fds is non-NULL, which it cannot be +%w( + -Wall + -Wextra + -Wno-deprecated-declarations + -Wno-ignored-qualifiers + -Wno-unused-result + -Wno-address +).select do |flag| + try_link('int main() {return 0;}', flag) +end.each do |flag| + CONFIG['CXXFLAGS'] << ' ' << flag +end +puts "CXXFLAGS=#{CONFIG['CXXFLAGS']}" + +# Solaris C++ compiler doesn't have make_pair() +add_define 'HAVE_MAKE_PAIR' if try_link(<<SRC, '-lstdc++') + #include <utility> + using namespace std; + int main(){ pair<const int,int> tuple = make_pair(1,2); } +SRC +TRY_LINK.sub!('$(CXX)', '$(CC)') + +create_makefile "rubyeventmachine" diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/.sitearchdir.time b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/.sitearchdir.time new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/Makefile b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/Makefile new file mode 100644 index 000000000000..7340ab1d7d12 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/Makefile @@ -0,0 +1,263 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 +hdrdir = $(topdir) +arch_hdrdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/home/app/.rbenv/versions/2.5.1 +rubysitearchprefix = $(rubylibprefix)/$(sitearch) +rubyarchprefix = $(rubylibprefix)/$(arch) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) +sitearchhdrdir = $(sitehdrdir)/$(sitearch) +rubyarchhdrdir = $(rubyhdrdir)/$(arch) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(vendorlibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)./.gem.20211005-8-29tmdc +sitelibdir = $(DESTDIR)./.gem.20211005-8-29tmdc +sitedir = $(rubylibprefix)/site_ruby +rubyarchdir = $(rubylibdir)/$(arch) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +localstatedir = $(prefix)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(prefix)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC = gcc +CXX = g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = $(optflags) $(debugflags) $(warnflags) +optflags = -O3 +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) $(cflags) -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DBUILD_FOR_RUBY -DOS_UNIX -I/home/app/.rbenv/versions/2.5.1/include $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) $(cxxflags) $(ARCH_FLAG) +ldflags = -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic +dldflags = -L/home/app/.rbenv/versions/2.5.1/lib -Wl,--compress-debug-sections=zlib +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CXX) -shared +LDSHAREDXX = $(CXX) -shared +AR = ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) +RUBY_SO_NAME = ruby +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux +sitearch = $(arch) +ruby_version = 2.5.0 +ruby = $(bindir)/$(RUBY_BASE_NAME) +RUBY = $(ruby) +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /usr/bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(libdir) +LIBPATH = -L. -L$(libdir) -Wl,-rpath,$(libdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc +ORIG_SRCS = mapper.cpp rubymain.cpp +SRCS = $(ORIG_SRCS) +OBJS = mapper.o rubymain.o +HDRS = $(srcdir)/mapper.h +LOCAL_HDRS = +TARGET = fastfilereaderext +TARGET_NAME = fastfilereaderext +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) +ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) +CLEANOBJS = *.o *.bak + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.time + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TIMESTAMP_DIR)/.sitearchdir.time: + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHAREDXX) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/extconf.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/extconf.rb new file mode 100644 index 000000000000..e4d64e4a298b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/extconf.rb @@ -0,0 +1,109 @@ +require 'mkmf' + +def check_libs libs = [], fatal = false + libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) } +end + +def check_heads heads = [], fatal = false + heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)} +end + +def add_define(name) + $defs.push("-D#{name}") +end + +# Eager check devs tools +have_devel? if respond_to?(:have_devel?) + +add_define 'BUILD_FOR_RUBY' + +# Minor platform details between *nix and Windows: + +if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/ + GNU_CHAIN = ENV['CROSS_COMPILING'] || $1 == 'mingw' + OS_WIN32 = true + add_define "OS_WIN32" +else + GNU_CHAIN = true + OS_UNIX = true + add_define 'OS_UNIX' +end + +# Adjust number of file descriptors (FD) on Windows + +if RbConfig::CONFIG["host_os"] =~ /mingw/ + found = RbConfig::CONFIG.values_at("CFLAGS", "CPPFLAGS"). + any? { |v| v.include?("FD_SETSIZE") } + + add_define "FD_SETSIZE=32767" unless found +end + +# Main platform invariances: + +case RUBY_PLATFORM +when /mswin32/, /mingw32/, /bccwin32/ + check_heads(%w[windows.h winsock.h], true) + check_libs(%w[kernel32 rpcrt4 gdi32], true) + + if GNU_CHAIN + CONFIG['LDSHAREDXX'] = "$(CXX) -shared -static-libgcc -static-libstdc++" + else + $defs.push "-EHs" + $defs.push "-GR" + end + +when /solaris/ + add_define 'OS_SOLARIS8' + check_libs(%w[nsl socket], true) + + if CONFIG['CC'] == 'cc' && ( + `cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler + `cc -V 2>&1` =~ /Sun/ # detect Solaris Studio compiler + ) + # SUN CHAIN + add_define 'CC_SUNWspro' + $preload = ["\nCXX = CC"] # hack a CXX= line into the makefile + $CFLAGS = CONFIG['CFLAGS'] = "-KPIC" + CONFIG['CCDLFLAGS'] = "-KPIC" + CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd" + CONFIG['LDSHAREDXX'] = "$(CXX) -G -KPIC -lCstd" + else + # GNU CHAIN + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + end + +when /openbsd/ + # OpenBSD branch contributed by Guillaume Sellier. + + # on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs + CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++ -fPIC" + CONFIG['LDSHAREDXX'] = "$(CXX) -shared -lstdc++ -fPIC" + +when /darwin/ + # on Unix we need a g++ link, not gcc. + # Ff line contributed by Daniel Harple. + CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ') + +when /linux/ + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + +when /aix/ + CONFIG['LDSHARED'] = "$(CXX) -Wl,-bstatic -Wl,-bdynamic -Wl,-G -Wl,-brtl" + +when /cygwin/ + # For rubies built with Cygwin, CXX may be set to CC, which is just + # a wrapper for gcc. + # This will compile, but it will not link to the C++ std library. + # Explicitly set CXX to use g++. + CONFIG['CXX'] = "g++" + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" + +else + # on Unix we need a g++ link, not gcc. + CONFIG['LDSHARED'] = "$(CXX) -shared" +end + +create_makefile "fastfilereaderext" diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/fastfilereaderext.so b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/fastfilereaderext.so new file mode 100644 index 000000000000..04a1e2f7da2b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/fastfilereaderext.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/mapper.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/mapper.cpp new file mode 100644 index 000000000000..f226f2d5e394 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/mapper.cpp @@ -0,0 +1,214 @@ +/***************************************************************************** + +$Id: mapper.cpp 4527 2007-07-04 10:21:34Z francis $ + +File: mapper.cpp +Date: 02Jul07 + +Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved. +Gmail: garbagecat10 + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +////////////////////////////////////////////////////////////////////// +// UNIX implementation +////////////////////////////////////////////////////////////////////// + + +#ifdef OS_UNIX + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/mman.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> + +#include <iostream> +#include <string> +#include <cstring> +#include <stdexcept> + +#include "mapper.h" + +/****************** +Mapper_t::Mapper_t +******************/ + +Mapper_t::Mapper_t (const std::string &filename) +{ + /* We ASSUME we can open the file. + * (More precisely, we assume someone else checked before we got here.) + */ + + Fd = open (filename.c_str(), O_RDONLY); + if (Fd < 0) + throw std::runtime_error (strerror (errno)); + + struct stat st; + if (fstat (Fd, &st)) + throw std::runtime_error (strerror (errno)); + FileSize = st.st_size; + + #ifdef OS_WIN32 + MapPoint = (char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0); + #else + MapPoint = (const char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0); + #endif + if (MapPoint == MAP_FAILED) + throw std::runtime_error (strerror (errno)); +} + + +/******************* +Mapper_t::~Mapper_t +*******************/ + +Mapper_t::~Mapper_t() +{ + Close(); +} + + +/*************** +Mapper_t::Close +***************/ + +void Mapper_t::Close() +{ + // Can be called multiple times. + // Calls to GetChunk are invalid after a call to Close. + if (MapPoint) { + #ifdef CC_SUNWspro + // TODO: The void * cast works fine on Solaris 11, but + // I don't know at what point that changed from older Solaris. + munmap ((char*)MapPoint, FileSize); + #else + munmap ((void*)MapPoint, FileSize); + #endif + MapPoint = NULL; + } + if (Fd >= 0) { + close (Fd); + Fd = -1; + } +} + +/****************** +Mapper_t::GetChunk +******************/ + +const char *Mapper_t::GetChunk (unsigned start) +{ + return MapPoint + start; +} + + + +#endif // OS_UNIX + + +////////////////////////////////////////////////////////////////////// +// WINDOWS implementation +////////////////////////////////////////////////////////////////////// + +#ifdef OS_WIN32 + +#include <windows.h> + +#include <iostream> +#include <string> +#include <stdexcept> + +#include "mapper.h" + +/****************** +Mapper_t::Mapper_t +******************/ + +Mapper_t::Mapper_t (const std::string &filename) +{ + /* We ASSUME we can open the file. + * (More precisely, we assume someone else checked before we got here.) + */ + + hFile = INVALID_HANDLE_VALUE; + hMapping = NULL; + MapPoint = NULL; + FileSize = 0; + + hFile = CreateFile (filename.c_str(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + throw std::runtime_error ("File not found"); + + BY_HANDLE_FILE_INFORMATION i; + if (GetFileInformationByHandle (hFile, &i)) + FileSize = i.nFileSizeLow; + + hMapping = CreateFileMapping (hFile, NULL, PAGE_READWRITE, 0, 0, NULL); + if (!hMapping) + throw std::runtime_error ("File not mapped"); + + #ifdef OS_WIN32 + MapPoint = (char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0); + #else + MapPoint = (const char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0); + #endif + if (!MapPoint) + throw std::runtime_error ("Mappoint not read"); +} + + +/******************* +Mapper_t::~Mapper_t +*******************/ + +Mapper_t::~Mapper_t() +{ + Close(); +} + +/*************** +Mapper_t::Close +***************/ + +void Mapper_t::Close() +{ + // Can be called multiple times. + // Calls to GetChunk are invalid after a call to Close. + if (MapPoint) { + UnmapViewOfFile (MapPoint); + MapPoint = NULL; + } + if (hMapping != NULL) { + CloseHandle (hMapping); + hMapping = NULL; + } + if (hFile != INVALID_HANDLE_VALUE) { + CloseHandle (hFile); + hFile = INVALID_HANDLE_VALUE; + } +} + + +/****************** +Mapper_t::GetChunk +******************/ + +const char *Mapper_t::GetChunk (unsigned start) +{ + return MapPoint + start; +} + + + +#endif // OS_WINDOWS diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/mapper.h b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/mapper.h new file mode 100644 index 000000000000..3db0eeade4c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/mapper.h @@ -0,0 +1,59 @@ +/***************************************************************************** + +$Id: mapper.h 4529 2007-07-04 11:32:22Z francis $ + +File: mapper.h +Date: 02Jul07 + +Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved. +Gmail: garbagecat10 + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifndef __Mapper__H_ +#define __Mapper__H_ + + +/************** +class Mapper_t +**************/ + +class Mapper_t +{ + public: + Mapper_t (const std::string&); + virtual ~Mapper_t(); + + const char *GetChunk (unsigned); + void Close(); + size_t GetFileSize() {return FileSize;} + + private: + size_t FileSize; + + #ifdef OS_UNIX + private: + int Fd; + const char *MapPoint; + #endif // OS_UNIX + + #ifdef OS_WIN32 + private: + HANDLE hFile; + HANDLE hMapping; + char *MapPoint; + #endif // OS_WIN32 + +}; + + +#endif // __Mapper__H_ + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/mapper.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/mapper.o new file mode 100644 index 000000000000..f221d3ebbeeb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/mapper.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/rubymain.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/rubymain.cpp new file mode 100644 index 000000000000..b962bf023497 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/rubymain.cpp @@ -0,0 +1,126 @@ +/***************************************************************************** + +$Id: rubymain.cpp 4529 2007-07-04 11:32:22Z francis $ + +File: rubymain.cpp +Date: 02Jul07 + +Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved. +Gmail: garbagecat10 + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + + +#include <iostream> +#include <stdexcept> + +#include <ruby.h> +#include "mapper.h" + +static VALUE EmModule; +static VALUE FastFileReader; +static VALUE Mapper; + + + +/********* +mapper_dt +*********/ + +static void mapper_dt (void *ptr) +{ + if (ptr) + delete (Mapper_t*) ptr; +} + +/********** +mapper_new +**********/ + +static VALUE mapper_new (VALUE self, VALUE filename) +{ + Mapper_t *m = new Mapper_t (StringValueCStr (filename)); + if (!m) + rb_raise (rb_eStandardError, "No Mapper Object"); + VALUE v = Data_Wrap_Struct (Mapper, 0, mapper_dt, (void*)m); + return v; +} + + +/**************** +mapper_get_chunk +****************/ + +static VALUE mapper_get_chunk (VALUE self, VALUE start, VALUE length) +{ + Mapper_t *m = NULL; + Data_Get_Struct (self, Mapper_t, m); + if (!m) + rb_raise (rb_eStandardError, "No Mapper Object"); + + // TODO, what if some moron sends us a negative start value? + unsigned _start = NUM2INT (start); + unsigned _length = NUM2INT (length); + if ((_start + _length) > m->GetFileSize()) + rb_raise (rb_eStandardError, "Mapper Range Error"); + + const char *chunk = m->GetChunk (_start); + if (!chunk) + rb_raise (rb_eStandardError, "No Mapper Chunk"); + return rb_str_new (chunk, _length); +} + +/************ +mapper_close +************/ + +static VALUE mapper_close (VALUE self) +{ + Mapper_t *m = NULL; + Data_Get_Struct (self, Mapper_t, m); + if (!m) + rb_raise (rb_eStandardError, "No Mapper Object"); + m->Close(); + return Qnil; +} + +/*********** +mapper_size +***********/ + +static VALUE mapper_size (VALUE self) +{ + Mapper_t *m = NULL; + Data_Get_Struct (self, Mapper_t, m); + if (!m) + rb_raise (rb_eStandardError, "No Mapper Object"); + return INT2NUM (m->GetFileSize()); +} + + +/********************** +Init_fastfilereaderext +**********************/ + +extern "C" void Init_fastfilereaderext() +{ + EmModule = rb_define_module ("EventMachine"); + FastFileReader = rb_define_class_under (EmModule, "FastFileReader", rb_cObject); + Mapper = rb_define_class_under (FastFileReader, "Mapper", rb_cObject); + + rb_define_module_function (Mapper, "new", (VALUE(*)(...))mapper_new, 1); + rb_define_method (Mapper, "size", (VALUE(*)(...))mapper_size, 0); + rb_define_method (Mapper, "close", (VALUE(*)(...))mapper_close, 0); + rb_define_method (Mapper, "get_chunk", (VALUE(*)(...))mapper_get_chunk, 2); +} + + + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/rubymain.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/rubymain.o new file mode 100644 index 000000000000..33ca835771df Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/fastfilereader/rubymain.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/kb.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/kb.cpp new file mode 100644 index 000000000000..2187ae228937 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/kb.cpp @@ -0,0 +1,79 @@ +/***************************************************************************** + +$Id$ + +File: kb.cpp +Date: 24Aug07 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" + + +/************************************** +KeyboardDescriptor::KeyboardDescriptor +**************************************/ + +KeyboardDescriptor::KeyboardDescriptor (EventMachine_t *parent_em): + EventableDescriptor (0, parent_em), + bReadAttemptedAfterClose (false) +{ + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + #ifdef HAVE_KQUEUE + MyEventMachine->ArmKqueueReader (this); + #endif +} + + +/*************************************** +KeyboardDescriptor::~KeyboardDescriptor +***************************************/ + +KeyboardDescriptor::~KeyboardDescriptor() +{ +} + + +/************************* +KeyboardDescriptor::Write +*************************/ + +void KeyboardDescriptor::Write() +{ + // Why are we here? + throw std::runtime_error ("bad code path in keyboard handler"); +} + + +/***************************** +KeyboardDescriptor::Heartbeat +*****************************/ + +void KeyboardDescriptor::Heartbeat() +{ + // no-op +} + + +/************************ +KeyboardDescriptor::Read +************************/ + +void KeyboardDescriptor::Read() +{ + char c; + (void)read (GetSocket(), &c, 1); + _GenericInboundDispatch(&c, 1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/kb.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/kb.o new file mode 100644 index 000000000000..bdbbc5c58947 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/kb.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/page.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/page.cpp new file mode 100644 index 000000000000..a3a234006d90 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/page.cpp @@ -0,0 +1,107 @@ +/***************************************************************************** + +$Id$ + +File: page.cpp +Date: 30Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#include "project.h" + + +/****************** +PageList::PageList +******************/ + +PageList::PageList() +{ +} + + +/******************* +PageList::~PageList +*******************/ + +PageList::~PageList() +{ + while (HasPages()) + PopFront(); +} + + +/*************** +PageList::Front +***************/ + +void PageList::Front (const char **page, int *length) +{ + assert (page && length); + + if (HasPages()) { + Page p = Pages.front(); + *page = p.Buffer; + *length = p.Size; + } + else { + *page = NULL; + *length = 0; + } +} + + +/****************** +PageList::PopFront +******************/ + +void PageList::PopFront() +{ + if (HasPages()) { + Page p = Pages.front(); + Pages.pop_front(); + if (p.Buffer) + free ((void*)p.Buffer); + } +} + + +/****************** +PageList::HasPages +******************/ + +bool PageList::HasPages() +{ + return (Pages.size() > 0) ? true : false; +} + + +/************** +PageList::Push +**************/ + +void PageList::Push (const char *buf, int size) +{ + if (buf && (size > 0)) { + char *copy = (char*) malloc (size); + if (!copy) + throw std::runtime_error ("no memory in pagelist"); + memcpy (copy, buf, size); + Pages.push_back (Page (copy, size)); + } +} + + + + + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/page.h b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/page.h new file mode 100644 index 000000000000..969fc9169090 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/page.h @@ -0,0 +1,51 @@ +/***************************************************************************** + +$Id$ + +File: page.h +Date: 30Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifndef __PageManager__H_ +#define __PageManager__H_ + + +/************** +class PageList +**************/ + +class PageList +{ + struct Page { + Page (const char *b, size_t s): Buffer(b), Size(s) {} + const char *Buffer; + size_t Size; + }; + + public: + PageList(); + virtual ~PageList(); + + void Push (const char*, int); + bool HasPages(); + void Front (const char**, int*); + void PopFront(); + + private: + std::deque<Page> Pages; +}; + + +#endif // __PageManager__H_ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/page.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/page.o new file mode 100644 index 000000000000..d9241cdc16be Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/page.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/pipe.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/pipe.cpp new file mode 100644 index 000000000000..a5f0d9f14217 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/pipe.cpp @@ -0,0 +1,354 @@ +/***************************************************************************** + +$Id$ + +File: pipe.cpp +Date: 30May07 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" + + +#ifdef OS_UNIX +// THIS ENTIRE FILE IS ONLY COMPILED ON UNIX-LIKE SYSTEMS. + +/****************************** +PipeDescriptor::PipeDescriptor +******************************/ + +PipeDescriptor::PipeDescriptor (int fd, pid_t subpid, EventMachine_t *parent_em): + EventableDescriptor (fd, parent_em), + bReadAttemptedAfterClose (false), + OutboundDataSize (0), + SubprocessPid (subpid) +{ + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + #endif + #ifdef HAVE_KQUEUE + MyEventMachine->ArmKqueueReader (this); + #endif +} + + +/******************************* +PipeDescriptor::~PipeDescriptor +*******************************/ + +PipeDescriptor::~PipeDescriptor() NO_EXCEPT_FALSE +{ + // Run down any stranded outbound data. + for (size_t i=0; i < OutboundPages.size(); i++) + OutboundPages[i].Free(); + + /* As a virtual destructor, we come here before the base-class + * destructor that closes our file-descriptor. + * We have to make sure the subprocess goes down (if it's not + * already down) and we have to reap the zombie. + * + * This implementation is PROVISIONAL and will surely be improved. + * The intention here is that we never block, hence the highly + * undesirable sleeps. But if we can't reap the subprocess even + * after sending it SIGKILL, then something is wrong and we + * throw a fatal exception, which is also not something we should + * be doing. + * + * Eventually the right thing to do will be to have the reactor + * core respond to SIGCHLD by chaining a handler on top of the + * one Ruby may have installed, and dealing with a list of dead + * children that are pending cleanup. + * + * Since we want to have a signal processor integrated into the + * client-visible API, let's wait until that is done before cleaning + * this up. + * + * Added a very ugly hack to support passing the subprocess's exit + * status to the user. It only makes logical sense for user code to access + * the subprocess exit status in the unbind callback. But unbind is called + * back during the EventableDescriptor destructor. So by that time there's + * no way to call back this object through an object binding, because it's + * already been cleaned up. We might have added a parameter to the unbind + * callback, but that would probably break a huge amount of existing code. + * So the hack-solution is to define an instance variable in the EventMachine + * object and stick the exit status in there, where it can easily be accessed + * with an accessor visible to user code. + * User code should ONLY access the exit status from within the unbind callback. + * Otherwise there's no guarantee it'll be valid. + * This hack won't make it impossible to run multiple EventMachines in a single + * process, but it will make it impossible to reliably nest unbind calls + * within other unbind calls. (Not sure if that's even possible.) + */ + + assert (MyEventMachine); + + /* Another hack to make the SubprocessPid available to get_subprocess_status */ + MyEventMachine->SubprocessPid = SubprocessPid; + + /* 01Mar09: Updated to use a small nanosleep in a loop. When nanosleep is interrupted by SIGCHLD, + * it resumes the system call after processing the signal (resulting in unnecessary latency). + * Calling nanosleep in a loop avoids this problem. + */ + struct timespec req = {0, 50000000}; // 0.05s + int n; + + // wait 0.5s for the process to die + for (n=0; n<10; n++) { + if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return; + nanosleep (&req, NULL); + } + + // send SIGTERM and wait another 1s + kill (SubprocessPid, SIGTERM); + for (n=0; n<20; n++) { + nanosleep (&req, NULL); + if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return; + } + + // send SIGKILL and wait another 5s + kill (SubprocessPid, SIGKILL); + for (n=0; n<100; n++) { + nanosleep (&req, NULL); + if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return; + } + + // still not dead, give up! + throw std::runtime_error ("unable to reap subprocess"); +} + + + +/******************** +PipeDescriptor::Read +********************/ + +void PipeDescriptor::Read() +{ + int sd = GetSocket(); + if (sd == INVALID_SOCKET) { + assert (!bReadAttemptedAfterClose); + bReadAttemptedAfterClose = true; + return; + } + + LastActivity = MyEventMachine->GetCurrentLoopTime(); + + int total_bytes_read = 0; + char readbuffer [16 * 1024]; + + for (int i=0; i < 10; i++) { + // Don't read just one buffer and then move on. This is faster + // if there is a lot of incoming. + // But don't read indefinitely. Give other sockets a chance to run. + // NOTICE, we're reading one less than the buffer size. + // That's so we can put a guard byte at the end of what we send + // to user code. + // Use read instead of recv, which on Linux gives a "socket operation + // on nonsocket" error. + + + int r = read (sd, readbuffer, sizeof(readbuffer) - 1); + //cerr << "<R:" << r << ">"; + + if (r > 0) { + total_bytes_read += r; + + // Add a null-terminator at the the end of the buffer + // that we will send to the callback. + // DO NOT EVER CHANGE THIS. We want to explicitly allow users + // to be able to depend on this behavior, so they will have + // the option to do some things faster. Additionally it's + // a security guard against buffer overflows. + readbuffer [r] = 0; + _GenericInboundDispatch(readbuffer, r); + } + else if (r == 0) { + break; + } + else { + // Basically a would-block, meaning we've read everything there is to read. + break; + } + + } + + + if (total_bytes_read == 0) { + // If we read no data on a socket that selected readable, + // it generally means the other end closed the connection gracefully. + ScheduleClose (false); + //bCloseNow = true; + } + +} + +/********************* +PipeDescriptor::Write +*********************/ + +void PipeDescriptor::Write() +{ + int sd = GetSocket(); + assert (sd != INVALID_SOCKET); + + LastActivity = MyEventMachine->GetCurrentLoopTime(); + char output_buffer [16 * 1024]; + size_t nbytes = 0; + + while ((OutboundPages.size() > 0) && (nbytes < sizeof(output_buffer))) { + OutboundPage *op = &(OutboundPages[0]); + if ((nbytes + op->Length - op->Offset) < sizeof (output_buffer)) { + memcpy (output_buffer + nbytes, op->Buffer + op->Offset, op->Length - op->Offset); + nbytes += (op->Length - op->Offset); + op->Free(); + OutboundPages.pop_front(); + } + else { + int len = sizeof(output_buffer) - nbytes; + memcpy (output_buffer + nbytes, op->Buffer + op->Offset, len); + op->Offset += len; + nbytes += len; + } + } + + // We should never have gotten here if there were no data to write, + // so assert that as a sanity check. + // Don't bother to make sure nbytes is less than output_buffer because + // if it were we probably would have crashed already. + assert (nbytes > 0); + + assert (GetSocket() != INVALID_SOCKET); + int bytes_written = write (GetSocket(), output_buffer, nbytes); +#ifdef OS_WIN32 + int e = WSAGetLastError(); +#else + int e = errno; +#endif + + if (bytes_written > 0) { + OutboundDataSize -= bytes_written; + if ((size_t)bytes_written < nbytes) { + int len = nbytes - bytes_written; + char *buffer = (char*) malloc (len + 1); + if (!buffer) + throw std::runtime_error ("bad alloc throwing back data"); + memcpy (buffer, output_buffer + bytes_written, len); + buffer [len] = 0; + OutboundPages.push_front (OutboundPage (buffer, len)); + } + #ifdef HAVE_EPOLL + EpollEvent.events = EPOLLIN; + if (SelectForWrite()) + EpollEvent.events |= EPOLLOUT; + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + } + else { + #ifdef OS_UNIX + if ((e != EINPROGRESS) && (e != EWOULDBLOCK) && (e != EINTR)) + #endif + #ifdef OS_WIN32 + if ((e != WSAEINPROGRESS) && (e != WSAEWOULDBLOCK)) + #endif + Close(); + } +} + + +/************************* +PipeDescriptor::Heartbeat +*************************/ + +void PipeDescriptor::Heartbeat() +{ + // If an inactivity timeout is defined, then check for it. + if (InactivityTimeout && ((MyEventMachine->GetCurrentLoopTime() - LastActivity) >= InactivityTimeout)) + ScheduleClose (false); + //bCloseNow = true; +} + + +/***************************** +PipeDescriptor::SelectForRead +*****************************/ + +bool PipeDescriptor::SelectForRead() +{ + /* Pipe descriptors, being local by definition, don't have + * a pending state, so this is simpler than for the + * ConnectionDescriptor object. + */ + return bPaused ? false : true; +} + +/****************************** +PipeDescriptor::SelectForWrite +******************************/ + +bool PipeDescriptor::SelectForWrite() +{ + /* Pipe descriptors, being local by definition, don't have + * a pending state, so this is simpler than for the + * ConnectionDescriptor object. + */ + return (GetOutboundDataSize() > 0) && !bPaused ? true : false; +} + + + + +/******************************** +PipeDescriptor::SendOutboundData +********************************/ + +int PipeDescriptor::SendOutboundData (const char *data, unsigned long length) +{ + //if (bCloseNow || bCloseAfterWriting) + if (IsCloseScheduled()) + return 0; + + if (!data && (length > 0)) + throw std::runtime_error ("bad outbound data"); + char *buffer = (char *) malloc (length + 1); + if (!buffer) + throw std::runtime_error ("no allocation for outbound data"); + memcpy (buffer, data, length); + buffer [length] = 0; + OutboundPages.push_back (OutboundPage (buffer, length)); + OutboundDataSize += length; + #ifdef HAVE_EPOLL + EpollEvent.events = (EPOLLIN | EPOLLOUT); + assert (MyEventMachine); + MyEventMachine->Modify (this); + #endif + return length; +} + +/******************************** +PipeDescriptor::GetSubprocessPid +********************************/ + +bool PipeDescriptor::GetSubprocessPid (pid_t *pid) +{ + bool ok = false; + if (pid && (SubprocessPid > 0)) { + *pid = SubprocessPid; + ok = true; + } + return ok; +} + + +#endif // OS_UNIX + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/pipe.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/pipe.o new file mode 100644 index 000000000000..5b6cb07498fd Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/pipe.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/project.h b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/project.h new file mode 100644 index 000000000000..757f7011e493 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/project.h @@ -0,0 +1,174 @@ +/***************************************************************************** + +$Id$ + +File: project.h +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifndef __Project__H_ +#define __Project__H_ + + +#include <iostream> +#include <map> +#include <set> +#include <vector> +#include <deque> +#include <string> +#include <sstream> +#include <stdexcept> + + +#ifdef OS_UNIX +#include <signal.h> +#include <netdb.h> +#include <time.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <sys/resource.h> +#include <sys/wait.h> +#include <assert.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <arpa/inet.h> +#include <pwd.h> +#include <string.h> +typedef int SOCKET; +#define INVALID_SOCKET -1 +#define SOCKET_ERROR -1 +#ifdef OS_SOLARIS8 +#include <strings.h> +#include <sys/un.h> +#ifndef AF_LOCAL +#define AF_LOCAL AF_UNIX +#endif +// INADDR_NONE is undefined on Solaris < 8. Thanks to Brett Eisenberg and Tim Pease. +#ifndef INADDR_NONE +#define INADDR_NONE ((unsigned long)-1) +#endif +#endif /* OS_SOLARIS8 */ + +#ifdef _AIX +#include <strings.h> +#ifndef AF_LOCAL +#define AF_LOCAL AF_UNIX +#endif +#endif /* _AIX */ + +#ifdef OS_DARWIN +#include <mach/mach.h> +#include <mach/mach_time.h> +#endif /* OS_DARWIN */ + +#endif /* OS_UNIX */ + +#ifdef OS_WIN32 +// 21Sep09: windows limits select() to 64 sockets by default, we increase it to 1024 here (before including winsock2.h) +// 18Jun12: fd_setsize must be changed in the ruby binary (not in this extension). redefining it also causes segvs, see eventmachine/eventmachine#333 +//#define FD_SETSIZE 1024 + +// WIN32_LEAN_AND_MEAN excludes APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets. +#define WIN32_LEAN_AND_MEAN + +#include <windows.h> +#include <winsock2.h> +#include <ws2tcpip.h> +#include <rpc.h> +#include <fcntl.h> +#include <assert.h> + +// Older versions of MinGW in the Ruby Dev Kit do not provide the getaddrinfo hint flags +#ifndef AI_ADDRCONFIG +#define AI_ADDRCONFIG 0x0400 +#endif + +#ifndef AI_NUMERICSERV +#define AI_NUMERICSERV 0x0008 +#endif + +// Use the Win32 wrapper library that Ruby owns to be able to close sockets with the close() function +#define RUBY_EXPORT +#include <ruby/defines.h> +#include <ruby/win32.h> +#endif /* OS_WIN32 */ + +#if !defined(_MSC_VER) || _MSC_VER > 1500 +#include <stdint.h> +#endif + +#ifdef WITH_SSL +#include <openssl/ssl.h> +#include <openssl/err.h> +#endif + +#ifdef HAVE_EPOLL +#include <sys/epoll.h> +#endif + +#ifdef HAVE_KQUEUE +#include <sys/event.h> +#include <sys/queue.h> +#endif + +#ifdef HAVE_INOTIFY +#include <sys/inotify.h> +#endif + +#ifdef HAVE_OLD_INOTIFY +#include <sys/syscall.h> +#include <linux/inotify.h> +static inline int inotify_init (void) { return syscall (__NR_inotify_init); } +static inline int inotify_add_watch (int fd, const char *name, __u32 mask) { return syscall (__NR_inotify_add_watch, fd, name, mask); } +static inline int inotify_rm_watch (int fd, __u32 wd) { return syscall (__NR_inotify_rm_watch, fd, wd); } +#define HAVE_INOTIFY 1 +#endif + +#ifdef HAVE_INOTIFY +#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event)) +#endif + +#ifdef HAVE_WRITEV +#include <sys/uio.h> +#endif + +#if __cplusplus +extern "C" { +#endif + typedef void (*EMCallback)(const unsigned long, int, const char*, const unsigned long); +#if __cplusplus +} +#endif + +#if defined(__GNUC__) && (__GNUC__ >= 3) +#define UNUSED __attribute__ ((unused)) +#else +#define UNUSED +#endif + +#include "binder.h" +#include "em.h" +#include "ed.h" +#include "page.h" +#include "ssl.h" +#include "eventmachine.h" + +#endif // __Project__H_ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/rubyeventmachine.so b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/rubyeventmachine.so new file mode 100644 index 000000000000..b5db129b8105 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/rubyeventmachine.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/rubymain.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/rubymain.cpp new file mode 100644 index 000000000000..305f9cbd6079 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/rubymain.cpp @@ -0,0 +1,1515 @@ +/***************************************************************************** + +$Id$ + +File: rubymain.cpp +Date: 06Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + +#include "project.h" +#include "eventmachine.h" +#include <ruby.h> + +#ifndef RFLOAT_VALUE +#define RFLOAT_VALUE(arg) RFLOAT(arg)->value +#endif + +/* Adapted from NUM2BSIG / BSIG2NUM in ext/fiddle/conversions.h, + * we'll call it a BSIG for Binding Signature here. */ +#if SIZEOF_VOIDP == SIZEOF_LONG +# define BSIG2NUM(x) (ULONG2NUM((unsigned long)(x))) +# define NUM2BSIG(x) (NUM2ULONG(x)) +# ifdef OS_WIN32 +# define PRIFBSIG "I32u" +# else +# define PRIFBSIG "lu" +# endif +#else +# define BSIG2NUM(x) (ULL2NUM((unsigned long long)(x))) +# define NUM2BSIG(x) (NUM2ULL(x)) +# ifdef OS_WIN32 +# define PRIFBSIG "I64u" +# else +# define PRIFBSIG "llu" +# endif +#endif + +/******* +Statics +*******/ + +static VALUE EmModule; +static VALUE EmConnection; +static VALUE EmConnsHash; +static VALUE EmTimersHash; + +static VALUE EM_eConnectionError; +static VALUE EM_eUnknownTimerFired; +static VALUE EM_eConnectionNotBound; +static VALUE EM_eUnsupported; +static VALUE EM_eInvalidSignature; + +static VALUE Intern_at_signature; +static VALUE Intern_at_timers; +static VALUE Intern_at_conns; +static VALUE Intern_at_error_handler; +static VALUE Intern_event_callback; +static VALUE Intern_run_deferred_callbacks; +static VALUE Intern_delete; +static VALUE Intern_call; +static VALUE Intern_at; +static VALUE Intern_receive_data; +static VALUE Intern_ssl_handshake_completed; +static VALUE Intern_ssl_verify_peer; +static VALUE Intern_notify_readable; +static VALUE Intern_notify_writable; +static VALUE Intern_proxy_target_unbound; +static VALUE Intern_proxy_completed; +static VALUE Intern_connection_completed; + +static VALUE rb_cProcStatus; + +struct em_event { + uintptr_t signature; + int event; + const char *data_str; + unsigned long data_num; +}; + +static inline VALUE ensure_conn(const uintptr_t signature) +{ + VALUE conn = rb_hash_aref (EmConnsHash, BSIG2NUM (signature)); + if (conn == Qnil) + rb_raise (EM_eConnectionNotBound, "unknown connection: %" PRIFBSIG, signature); + return conn; +} + + +/**************** +t_event_callback +****************/ + +static inline void event_callback (struct em_event* e) +{ + const uintptr_t signature = e->signature; + int event = e->event; + const char *data_str = e->data_str; + const unsigned long data_num = e->data_num; + + switch (event) { + case EM_CONNECTION_READ: + { + VALUE conn = rb_hash_aref (EmConnsHash, BSIG2NUM (signature)); + if (conn == Qnil) + rb_raise (EM_eConnectionNotBound, "received %lu bytes of data for unknown signature: %" PRIFBSIG, data_num, signature); + rb_funcall (conn, Intern_receive_data, 1, rb_str_new (data_str, data_num)); + return; + } + case EM_CONNECTION_ACCEPTED: + { + rb_funcall (EmModule, Intern_event_callback, 3, BSIG2NUM(signature), INT2FIX(event), ULONG2NUM(data_num)); + return; + } + case EM_CONNECTION_UNBOUND: + { + rb_funcall (EmModule, Intern_event_callback, 3, BSIG2NUM(signature), INT2FIX(event), ULONG2NUM(data_num)); + return; + } + case EM_CONNECTION_COMPLETED: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_connection_completed, 0); + return; + } + case EM_CONNECTION_NOTIFY_READABLE: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_notify_readable, 0); + return; + } + case EM_CONNECTION_NOTIFY_WRITABLE: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_notify_writable, 0); + return; + } + case EM_LOOPBREAK_SIGNAL: + { + rb_funcall (EmModule, Intern_run_deferred_callbacks, 0); + return; + } + case EM_TIMER_FIRED: + { + VALUE timer = rb_funcall (EmTimersHash, Intern_delete, 1, ULONG2NUM (data_num)); + if (timer == Qnil) { + rb_raise (EM_eUnknownTimerFired, "no such timer: %lu", data_num); + } else if (timer == Qfalse) { + /* Timer Canceled */ + } else { + rb_funcall (timer, Intern_call, 0); + } + return; + } + #ifdef WITH_SSL + case EM_SSL_HANDSHAKE_COMPLETED: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_ssl_handshake_completed, 0); + return; + } + case EM_SSL_VERIFY: + { + VALUE conn = ensure_conn(signature); + VALUE should_accept = rb_funcall (conn, Intern_ssl_verify_peer, 1, rb_str_new(data_str, data_num)); + if (RTEST(should_accept)) + evma_accept_ssl_peer (signature); + return; + } + #endif + case EM_PROXY_TARGET_UNBOUND: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_proxy_target_unbound, 0); + return; + } + case EM_PROXY_COMPLETED: + { + VALUE conn = ensure_conn(signature); + rb_funcall (conn, Intern_proxy_completed, 0); + return; + } + } +} + +/******************* +event_error_handler +*******************/ + +static void event_error_handler(VALUE self UNUSED, VALUE err) +{ + VALUE error_handler = rb_ivar_get(EmModule, Intern_at_error_handler); + rb_funcall (error_handler, Intern_call, 1, err); +} + +/********************** +event_callback_wrapper +**********************/ + +static void event_callback_wrapper (const uintptr_t signature, int event, const char *data_str, const unsigned long data_num) +{ + struct em_event e; + e.signature = signature; + e.event = event; + e.data_str = data_str; + e.data_num = data_num; + + if (!rb_ivar_defined(EmModule, Intern_at_error_handler)) + event_callback(&e); + else + rb_rescue((VALUE (*)(ANYARGS))event_callback, (VALUE)&e, (VALUE (*)(ANYARGS))event_error_handler, Qnil); +} + +/************************** +t_initialize_event_machine +**************************/ + +static VALUE t_initialize_event_machine (VALUE self UNUSED) +{ + EmConnsHash = rb_ivar_get (EmModule, Intern_at_conns); + EmTimersHash = rb_ivar_get (EmModule, Intern_at_timers); + assert(EmConnsHash != Qnil); + assert(EmTimersHash != Qnil); + evma_initialize_library ((EMCallback)event_callback_wrapper); + return Qnil; +} + + +/****************** +t_run_machine_once +******************/ + +static VALUE t_run_machine_once (VALUE self UNUSED) +{ + return evma_run_machine_once () ? Qtrue : Qfalse; +} + + +/************* +t_run_machine +*************/ + +static VALUE t_run_machine (VALUE self UNUSED) +{ + evma_run_machine(); + return Qnil; +} + + +/******************* +t_add_oneshot_timer +*******************/ + +static VALUE t_add_oneshot_timer (VALUE self UNUSED, VALUE interval) +{ + const uintptr_t f = evma_install_oneshot_timer (FIX2LONG (interval)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "ran out of timers; use #set_max_timers to increase limit"); + return BSIG2NUM (f); +} + + +/************** +t_start_server +**************/ + +static VALUE t_start_server (VALUE self UNUSED, VALUE server, VALUE port) +{ + const uintptr_t f = evma_create_tcp_server (StringValueCStr(server), FIX2INT(port)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no acceptor (port is in use or requires root privileges)"); + return BSIG2NUM (f); +} + +/************* +t_stop_server +*************/ + +static VALUE t_stop_server (VALUE self UNUSED, VALUE signature) +{ + evma_stop_tcp_server (NUM2BSIG (signature)); + return Qnil; +} + + +/******************* +t_start_unix_server +*******************/ + +static VALUE t_start_unix_server (VALUE self UNUSED, VALUE filename) +{ + const uintptr_t f = evma_create_unix_domain_server (StringValueCStr(filename)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no unix-domain acceptor"); + return BSIG2NUM (f); +} + +/******************** +t_attach_sd +********************/ + +static VALUE t_attach_sd(VALUE self UNUSED, VALUE sd) +{ + const uintptr_t f = evma_attach_sd(FIX2INT(sd)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no socket descriptor acceptor"); + return BSIG2NUM (f); +} + + +/*********** +t_send_data +***********/ + +static VALUE t_send_data (VALUE self UNUSED, VALUE signature, VALUE data, VALUE data_length) +{ + int b = evma_send_data_to_connection (NUM2BSIG (signature), StringValuePtr (data), FIX2INT (data_length)); + return INT2NUM (b); +} + + +/*********** +t_start_tls +***********/ + +static VALUE t_start_tls (VALUE self UNUSED, VALUE signature) +{ + evma_start_tls (NUM2BSIG (signature)); + return Qnil; +} + +/*************** +t_set_tls_parms +***************/ + +static VALUE t_set_tls_parms (VALUE self UNUSED, VALUE signature, VALUE privkeyfile, VALUE certchainfile, VALUE verify_peer, VALUE fail_if_no_peer_cert, VALUE snihostname, VALUE cipherlist, VALUE ecdh_curve, VALUE dhparam, VALUE ssl_version) +{ + /* set_tls_parms takes a series of positional arguments for specifying such things + * as private keys and certificate chains. + * It's expected that the parameter list will grow as we add more supported features. + * ALL of these parameters are optional, and can be specified as empty or NULL strings. + */ + evma_set_tls_parms (NUM2BSIG (signature), StringValueCStr (privkeyfile), StringValueCStr (certchainfile), (verify_peer == Qtrue ? 1 : 0), (fail_if_no_peer_cert == Qtrue ? 1 : 0), StringValueCStr (snihostname), StringValueCStr (cipherlist), StringValueCStr (ecdh_curve), StringValueCStr (dhparam), NUM2INT (ssl_version)); + return Qnil; +} + +/*************** +t_get_peer_cert +***************/ + +#ifdef WITH_SSL +static VALUE t_get_peer_cert (VALUE self UNUSED, VALUE signature) +{ + VALUE ret = Qnil; + + X509 *cert = NULL; + BUF_MEM *buf; + BIO *out; + + cert = evma_get_peer_cert (NUM2BSIG (signature)); + + if (cert != NULL) { + out = BIO_new(BIO_s_mem()); + PEM_write_bio_X509(out, cert); + BIO_get_mem_ptr(out, &buf); + ret = rb_str_new(buf->data, buf->length); + X509_free(cert); + BIO_free(out); + } + + return ret; +} +#else +static VALUE t_get_peer_cert (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/*************** +t_get_cipher_bits +***************/ + +#ifdef WITH_SSL +static VALUE t_get_cipher_bits (VALUE self UNUSED, VALUE signature) +{ + int bits = evma_get_cipher_bits (NUM2BSIG (signature)); + if (bits == -1) + return Qnil; + return INT2NUM (bits); +} +#else +static VALUE t_get_cipher_bits (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/*************** +t_get_cipher_name +***************/ + +#ifdef WITH_SSL +static VALUE t_get_cipher_name (VALUE self UNUSED, VALUE signature) +{ + const char *protocol = evma_get_cipher_name (NUM2BSIG (signature)); + if (protocol) + return rb_str_new2 (protocol); + + return Qnil; +} +#else +static VALUE t_get_cipher_name (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/*************** +t_get_cipher_protocol +***************/ + +#ifdef WITH_SSL +static VALUE t_get_cipher_protocol (VALUE self UNUSED, VALUE signature) +{ + const char *cipher = evma_get_cipher_protocol (NUM2BSIG (signature)); + if (cipher) + return rb_str_new2 (cipher); + + return Qnil; +} +#else +static VALUE t_get_cipher_protocol (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/*************** +t_get_sni_hostname +***************/ + +#ifdef WITH_SSL +static VALUE t_get_sni_hostname (VALUE self UNUSED, VALUE signature) +{ + const char *sni_hostname = evma_get_sni_hostname (NUM2BSIG (signature)); + if (sni_hostname) + return rb_str_new2 (sni_hostname); + + return Qnil; +} +#else +static VALUE t_get_sni_hostname (VALUE self UNUSED, VALUE signature UNUSED) +{ + return Qnil; +} +#endif + +/************** +t_get_peername +**************/ + +static VALUE t_get_peername (VALUE self UNUSED, VALUE signature) +{ + char buf[1024]; + socklen_t len = sizeof buf; + try { + if (evma_get_peername (NUM2BSIG (signature), (struct sockaddr*)buf, &len)) { + return rb_str_new (buf, len); + } + } catch (std::runtime_error e) { + rb_raise (rb_eRuntimeError, "%s", e.what()); + } + + return Qnil; +} + +/************** +t_get_sockname +**************/ + +static VALUE t_get_sockname (VALUE self UNUSED, VALUE signature) +{ + char buf[1024]; + socklen_t len = sizeof buf; + try { + if (evma_get_sockname (NUM2BSIG (signature), (struct sockaddr*)buf, &len)) { + return rb_str_new (buf, len); + } + } catch (std::runtime_error e) { + rb_raise (rb_eRuntimeError, "%s", e.what()); + } + + return Qnil; +} + +/******************** +t_get_subprocess_pid +********************/ + +static VALUE t_get_subprocess_pid (VALUE self UNUSED, VALUE signature) +{ + pid_t pid; + if (evma_get_subprocess_pid (NUM2BSIG (signature), &pid)) { + return INT2NUM (pid); + } + + return Qnil; +} + +/*********************** +t_get_subprocess_status +***********************/ + +static VALUE t_get_subprocess_status (VALUE self UNUSED, VALUE signature) +{ + VALUE proc_status = Qnil; + + int status; + pid_t pid; + + if (evma_get_subprocess_status (NUM2BSIG (signature), &status)) { + if (evma_get_subprocess_pid (NUM2BSIG (signature), &pid)) { + proc_status = rb_obj_alloc(rb_cProcStatus); + + /* MRI Ruby uses hidden instance vars */ + rb_iv_set(proc_status, "status", INT2FIX(status)); + rb_iv_set(proc_status, "pid", INT2FIX(pid)); + +#ifdef RUBINIUS + /* Rubinius uses standard instance vars */ + rb_iv_set(proc_status, "@pid", INT2FIX(pid)); + if (WIFEXITED(status)) { + rb_iv_set(proc_status, "@status", INT2FIX(WEXITSTATUS(status))); + } else if (WIFSIGNALED(status)) { + rb_iv_set(proc_status, "@termsig", INT2FIX(WTERMSIG(status))); + } else if (WIFSTOPPED(status)) { + rb_iv_set(proc_status, "@stopsig", INT2FIX(WSTOPSIG(status))); + } +#endif + } + } + + return proc_status; +} + +/********************** +t_get_connection_count +**********************/ + +static VALUE t_get_connection_count (VALUE self UNUSED) +{ + return INT2NUM(evma_get_connection_count()); +} + +/***************************** +t_get_comm_inactivity_timeout +*****************************/ + +static VALUE t_get_comm_inactivity_timeout (VALUE self UNUSED, VALUE signature) +{ + return rb_float_new(evma_get_comm_inactivity_timeout(NUM2BSIG (signature))); +} + +/***************************** +t_set_comm_inactivity_timeout +*****************************/ + +static VALUE t_set_comm_inactivity_timeout (VALUE self UNUSED, VALUE signature, VALUE timeout) +{ + float ti = RFLOAT_VALUE(timeout); + if (evma_set_comm_inactivity_timeout(NUM2BSIG(signature), ti)) { + return Qtrue; + } + return Qfalse; +} + +/***************************** +t_get_pending_connect_timeout +*****************************/ + +static VALUE t_get_pending_connect_timeout (VALUE self UNUSED, VALUE signature) +{ + return rb_float_new(evma_get_pending_connect_timeout(NUM2BSIG (signature))); +} + +/***************************** +t_set_pending_connect_timeout +*****************************/ + +static VALUE t_set_pending_connect_timeout (VALUE self UNUSED, VALUE signature, VALUE timeout) +{ + float ti = RFLOAT_VALUE(timeout); + if (evma_set_pending_connect_timeout(NUM2BSIG(signature), ti)) { + return Qtrue; + } + return Qfalse; +} + +/*************** +t_send_datagram +***************/ + +static VALUE t_send_datagram (VALUE self UNUSED, VALUE signature, VALUE data, VALUE data_length, VALUE address, VALUE port) +{ + int b = evma_send_datagram (NUM2BSIG (signature), StringValuePtr (data), FIX2INT (data_length), StringValueCStr(address), FIX2INT(port)); + if (b < 0) + rb_raise (EM_eConnectionError, "%s", "error in sending datagram"); // FIXME: this could be more specific. + return INT2NUM (b); +} + + +/****************** +t_close_connection +******************/ + +static VALUE t_close_connection (VALUE self UNUSED, VALUE signature, VALUE after_writing) +{ + evma_close_connection (NUM2BSIG (signature), ((after_writing == Qtrue) ? 1 : 0)); + return Qnil; +} + +/******************************** +t_report_connection_error_status +********************************/ + +static VALUE t_report_connection_error_status (VALUE self UNUSED, VALUE signature) +{ + int b = evma_report_connection_error_status (NUM2BSIG (signature)); + return INT2NUM (b); +} + + + +/**************** +t_connect_server +****************/ + +static VALUE t_connect_server (VALUE self UNUSED, VALUE server, VALUE port) +{ + // Avoid FIX2INT in this case, because it doesn't deal with type errors properly. + // Specifically, if the value of port comes in as a string rather than an integer, + // NUM2INT will throw a type error, but FIX2INT will generate garbage. + + try { + const uintptr_t f = evma_connect_to_server (NULL, 0, StringValueCStr(server), NUM2INT(port)); + if (!f) + rb_raise (EM_eConnectionError, "%s", "no connection"); + return BSIG2NUM (f); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/********************* +t_bind_connect_server +*********************/ + +static VALUE t_bind_connect_server (VALUE self UNUSED, VALUE bind_addr, VALUE bind_port, VALUE server, VALUE port) +{ + // Avoid FIX2INT in this case, because it doesn't deal with type errors properly. + // Specifically, if the value of port comes in as a string rather than an integer, + // NUM2INT will throw a type error, but FIX2INT will generate garbage. + + try { + const uintptr_t f = evma_connect_to_server (StringValueCStr(bind_addr), NUM2INT(bind_port), StringValueCStr(server), NUM2INT(port)); + if (!f) + rb_raise (EM_eConnectionError, "%s", "no connection"); + return BSIG2NUM (f); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/********************* +t_connect_unix_server +*********************/ + +static VALUE t_connect_unix_server (VALUE self UNUSED, VALUE serversocket) +{ + const uintptr_t f = evma_connect_to_unix_server (StringValueCStr(serversocket)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no connection"); + return BSIG2NUM (f); +} + +/*********** +t_attach_fd +***********/ + +static VALUE t_attach_fd (VALUE self UNUSED, VALUE file_descriptor, VALUE watch_mode) +{ + const uintptr_t f = evma_attach_fd (NUM2INT(file_descriptor), watch_mode == Qtrue); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no connection"); + return BSIG2NUM (f); +} + +/*********** +t_detach_fd +***********/ + +static VALUE t_detach_fd (VALUE self UNUSED, VALUE signature) +{ + return INT2NUM(evma_detach_fd (NUM2BSIG (signature))); +} + +/********************* +t_get_file_descriptor +*********************/ +static VALUE t_get_file_descriptor (VALUE self UNUSED, VALUE signature) +{ + return INT2NUM(evma_get_file_descriptor (NUM2BSIG (signature))); +} + +/************** +t_get_sock_opt +**************/ + +static VALUE t_get_sock_opt (VALUE self UNUSED, VALUE signature, VALUE lev, VALUE optname) +{ + int fd = evma_get_file_descriptor (NUM2BSIG (signature)); + int level = NUM2INT(lev), option = NUM2INT(optname); + socklen_t len = 128; + char buf[128]; + + if (getsockopt(fd, level, option, buf, &len) < 0) + rb_sys_fail("getsockopt"); + + return rb_str_new(buf, len); +} + +/************** +t_set_sock_opt +**************/ + +static VALUE t_set_sock_opt (VALUE self UNUSED, VALUE signature, VALUE lev, VALUE optname, VALUE optval) +{ + int fd = evma_get_file_descriptor (NUM2BSIG (signature)); + int level = NUM2INT(lev), option = NUM2INT(optname); + int i; + const void *v; + socklen_t len; + + switch (TYPE(optval)) { + case T_FIXNUM: + i = FIX2INT(optval); + goto numval; + case T_FALSE: + i = 0; + goto numval; + case T_TRUE: + i = 1; + numval: + v = (void*)&i; len = sizeof(i); + break; + default: + StringValue(optval); + v = RSTRING_PTR(optval); + len = RSTRING_LENINT(optval); + break; + } + + + if (setsockopt(fd, level, option, (char *)v, len) < 0) + rb_sys_fail("setsockopt"); + + return INT2FIX(0); +} + +/******************** +t_is_notify_readable +********************/ + +static VALUE t_is_notify_readable (VALUE self UNUSED, VALUE signature) +{ + return evma_is_notify_readable(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/********************* +t_set_notify_readable +*********************/ + +static VALUE t_set_notify_readable (VALUE self UNUSED, VALUE signature, VALUE mode) +{ + evma_set_notify_readable(NUM2BSIG(signature), mode == Qtrue); + return Qnil; +} + +/******************** +t_is_notify_readable +********************/ + +static VALUE t_is_notify_writable (VALUE self UNUSED, VALUE signature) +{ + return evma_is_notify_writable(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/********************* +t_set_notify_writable +*********************/ + +static VALUE t_set_notify_writable (VALUE self UNUSED, VALUE signature, VALUE mode) +{ + evma_set_notify_writable(NUM2BSIG (signature), mode == Qtrue); + return Qnil; +} + +/******* +t_pause +*******/ + +static VALUE t_pause (VALUE self UNUSED, VALUE signature) +{ + return evma_pause(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/******** +t_resume +********/ + +static VALUE t_resume (VALUE self UNUSED, VALUE signature) +{ + return evma_resume(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/********** +t_paused_p +**********/ + +static VALUE t_paused_p (VALUE self UNUSED, VALUE signature) +{ + return evma_is_paused(NUM2BSIG (signature)) ? Qtrue : Qfalse; +} + +/********************* +t_num_close_scheduled +*********************/ + +static VALUE t_num_close_scheduled (VALUE self UNUSED) +{ + return INT2FIX(evma_num_close_scheduled()); +} + +/***************** +t_open_udp_socket +*****************/ + +static VALUE t_open_udp_socket (VALUE self UNUSED, VALUE server, VALUE port) +{ + const uintptr_t f = evma_open_datagram_socket (StringValueCStr(server), FIX2INT(port)); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no datagram socket"); + return BSIG2NUM(f); +} + + + +/***************** +t_release_machine +*****************/ + +static VALUE t_release_machine (VALUE self UNUSED) +{ + evma_release_library(); + return Qnil; +} + + +/****** +t_stop +******/ + +static VALUE t_stop (VALUE self UNUSED) +{ + evma_stop_machine(); + return Qnil; +} + +/****************** +t_signal_loopbreak +******************/ + +static VALUE t_signal_loopbreak (VALUE self UNUSED) +{ + evma_signal_loopbreak(); + return Qnil; +} + +/************** +t_library_type +**************/ + +static VALUE t_library_type (VALUE self UNUSED) +{ + return rb_eval_string (":extension"); +} + + + +/******************* +t_set_timer_quantum +*******************/ + +static VALUE t_set_timer_quantum (VALUE self UNUSED, VALUE interval) +{ + evma_set_timer_quantum (FIX2INT (interval)); + return Qnil; +} + +/******************** +t_get_max_timer_count +********************/ + +static VALUE t_get_max_timer_count (VALUE self UNUSED) +{ + return INT2FIX (evma_get_max_timer_count()); +} + +/******************** +t_set_max_timer_count +********************/ + +static VALUE t_set_max_timer_count (VALUE self UNUSED, VALUE ct) +{ + evma_set_max_timer_count (FIX2INT (ct)); + return Qnil; +} + +/******************** +t_get/set_simultaneous_accept_count +********************/ + +static VALUE t_get_simultaneous_accept_count (VALUE self UNUSED) +{ + return INT2FIX (evma_get_simultaneous_accept_count()); +} + +static VALUE t_set_simultaneous_accept_count (VALUE self UNUSED, VALUE ct) +{ + evma_set_simultaneous_accept_count (FIX2INT (ct)); + return Qnil; +} + +/*************** +t_setuid_string +***************/ + +static VALUE t_setuid_string (VALUE self UNUSED, VALUE username) +{ + evma_setuid_string (StringValueCStr (username)); + return Qnil; +} + + + +/************** +t_invoke_popen +**************/ + +static VALUE t_invoke_popen (VALUE self UNUSED, VALUE cmd) +{ + #ifdef OS_WIN32 + rb_raise (EM_eUnsupported, "popen is not available on this platform"); + #endif + + int len = RARRAY_LEN(cmd); + if (len >= 2048) + rb_raise (rb_eRuntimeError, "%s", "too many arguments to popen"); + char *strings [2048]; + for (int i=0; i < len; i++) { + VALUE ix = INT2FIX (i); + VALUE s = rb_ary_aref (1, &ix, cmd); + strings[i] = StringValueCStr (s); + } + strings[len] = NULL; + + uintptr_t f = 0; + try { + f = evma_popen (strings); + } catch (std::runtime_error e) { + rb_raise (rb_eRuntimeError, "%s", e.what()); + } + if (!f) { + char *err = strerror (errno); + char buf[100]; + memset (buf, 0, sizeof(buf)); + snprintf (buf, sizeof(buf)-1, "no popen: %s", (err?err:"???")); + rb_raise (rb_eRuntimeError, "%s", buf); + } + return BSIG2NUM (f); +} + + +/*************** +t_read_keyboard +***************/ + +static VALUE t_read_keyboard (VALUE self UNUSED) +{ + const uintptr_t f = evma_open_keyboard(); + if (!f) + rb_raise (rb_eRuntimeError, "%s", "no keyboard reader"); + return BSIG2NUM (f); +} + + +/**************** +t_watch_filename +****************/ + +static VALUE t_watch_filename (VALUE self UNUSED, VALUE fname) +{ + try { + return BSIG2NUM(evma_watch_filename(StringValueCStr(fname))); + } catch (std::runtime_error e) { + rb_raise (EM_eUnsupported, "%s", e.what()); + } + return Qnil; +} + + +/****************** +t_unwatch_filename +******************/ + +static VALUE t_unwatch_filename (VALUE self UNUSED, VALUE sig) +{ + try { + evma_unwatch_filename(NUM2BSIG (sig)); + } catch (std::runtime_error e) { + rb_raise (EM_eInvalidSignature, "%s", e.what()); + } + + return Qnil; +} + + +/*********** +t_watch_pid +***********/ + +static VALUE t_watch_pid (VALUE self UNUSED, VALUE pid) +{ + try { + return BSIG2NUM(evma_watch_pid(NUM2INT(pid))); + } catch (std::runtime_error e) { + rb_raise (EM_eUnsupported, "%s", e.what()); + } + return Qnil; +} + + +/************* +t_unwatch_pid +*************/ + +static VALUE t_unwatch_pid (VALUE self UNUSED, VALUE sig) +{ + evma_unwatch_pid(NUM2BSIG (sig)); + return Qnil; +} + + +/********** +t__epoll_p +**********/ + +static VALUE t__epoll_p (VALUE self UNUSED) +{ + #ifdef HAVE_EPOLL + return Qtrue; + #else + return Qfalse; + #endif +} + +/******** +t__epoll +********/ + +static VALUE t__epoll (VALUE self UNUSED) +{ + if (t__epoll_p(self) == Qfalse) + return Qfalse; + + evma_set_epoll (1); + return Qtrue; +} + +/*********** +t__epoll_set +***********/ + +static VALUE t__epoll_set (VALUE self, VALUE val) +{ + if (t__epoll_p(self) == Qfalse && val == Qtrue) + rb_raise (EM_eUnsupported, "%s", "epoll is not supported on this platform"); + + evma_set_epoll (val == Qtrue ? 1 : 0); + return val; +} + + +/*********** +t__kqueue_p +***********/ + +static VALUE t__kqueue_p (VALUE self UNUSED) +{ + #ifdef HAVE_KQUEUE + return Qtrue; + #else + return Qfalse; + #endif +} + +/********* +t__kqueue +*********/ + +static VALUE t__kqueue (VALUE self UNUSED) +{ + if (t__kqueue_p(self) == Qfalse) + return Qfalse; + + evma_set_kqueue (1); + return Qtrue; +} + +/************* +t__kqueue_set +*************/ + +static VALUE t__kqueue_set (VALUE self, VALUE val) +{ + if (t__kqueue_p(self) == Qfalse && val == Qtrue) + rb_raise (EM_eUnsupported, "%s", "kqueue is not supported on this platform"); + + evma_set_kqueue (val == Qtrue ? 1 : 0); + return val; +} + + +/******** +t__ssl_p +********/ + +static VALUE t__ssl_p (VALUE self UNUSED) +{ + #ifdef WITH_SSL + return Qtrue; + #else + return Qfalse; + #endif +} + +/******** +t_stopping +********/ + +static VALUE t_stopping () +{ + if (evma_stopping()) { + return Qtrue; + } else { + return Qfalse; + } +} + + +/**************** +t_send_file_data +****************/ + +static VALUE t_send_file_data (VALUE self UNUSED, VALUE signature, VALUE filename) +{ + + /* The current implementation of evma_send_file_data_to_connection enforces a strict + * upper limit on the file size it will transmit (currently 32K). The function returns + * zero on success, -1 if the requested file exceeds its size limit, and a positive + * number for other errors. + * TODO: Positive return values are actually errno's, which is probably the wrong way to + * do this. For one thing it's ugly. For another, we can't be sure zero is never a real errno. + */ + + int b = evma_send_file_data_to_connection (NUM2BSIG (signature), StringValueCStr(filename)); + if (b == -1) + rb_raise(rb_eRuntimeError, "%s", "File too large. send_file_data() supports files under 32k."); + if (b > 0) { + char *err = strerror (b); + char buf[1024]; + memset (buf, 0, sizeof(buf)); + snprintf (buf, sizeof(buf)-1, ": %s %s", StringValueCStr(filename),(err?err:"???")); + + rb_raise (rb_eIOError, "%s", buf); + } + + return INT2NUM (0); +} + + +/******************* +t_set_rlimit_nofile +*******************/ + +static VALUE t_set_rlimit_nofile (VALUE self UNUSED, VALUE arg) +{ + arg = (NIL_P(arg)) ? -1 : NUM2INT (arg); + return INT2NUM (evma_set_rlimit_nofile (arg)); +} + +/*************************** +conn_get_outbound_data_size +***************************/ + +static VALUE conn_get_outbound_data_size (VALUE self) +{ + VALUE sig = rb_ivar_get (self, Intern_at_signature); + return INT2NUM (evma_get_outbound_data_size (NUM2BSIG (sig))); +} + + +/****************************** +conn_associate_callback_target +******************************/ + +static VALUE conn_associate_callback_target (VALUE self UNUSED, VALUE sig UNUSED) +{ + // No-op for the time being. + return Qnil; +} + + +/*************** +t_get_loop_time +****************/ + +static VALUE t_get_loop_time (VALUE self UNUSED) +{ + uint64_t current_time = evma_get_current_loop_time(); + if (current_time == 0) { + return Qnil; + } + + // Generally the industry has moved to 64-bit time_t, this is just in case we're 32-bit time_t. + if (sizeof(time_t) < 8 && current_time > INT_MAX) { + return rb_funcall(rb_cTime, Intern_at, 2, INT2NUM(current_time / 1000000), INT2NUM(current_time % 1000000)); + } else { + return rb_time_new(current_time / 1000000, current_time % 1000000); + } +} + + +/************* +t_start_proxy +**************/ + +static VALUE t_start_proxy (VALUE self UNUSED, VALUE from, VALUE to, VALUE bufsize, VALUE length) +{ + try { + evma_start_proxy(NUM2BSIG (from), NUM2BSIG (to), NUM2ULONG(bufsize), NUM2ULONG(length)); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + + +/************ +t_stop_proxy +*************/ + +static VALUE t_stop_proxy (VALUE self UNUSED, VALUE from) +{ + try{ + evma_stop_proxy(NUM2BSIG (from)); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/*************** +t_proxied_bytes +****************/ + +static VALUE t_proxied_bytes (VALUE self UNUSED, VALUE from) +{ + try{ + return BSIG2NUM(evma_proxied_bytes(NUM2BSIG (from))); + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/*************** +t_get_idle_time +****************/ + +static VALUE t_get_idle_time (VALUE self UNUSED, VALUE from) +{ + try{ + uint64_t current_time = evma_get_current_loop_time(); + uint64_t time = evma_get_last_activity_time(NUM2BSIG (from)); + if (current_time != 0 && time != 0) { + if (time >= current_time) + return BSIG2NUM(0); + else { + uint64_t diff = current_time - time; + float seconds = diff / (1000.0*1000.0); + return rb_float_new(seconds); + } + return Qnil; + } + } catch (std::runtime_error e) { + rb_raise (EM_eConnectionError, "%s", e.what()); + } + return Qnil; +} + +/************************ +t_get_heartbeat_interval +*************************/ + +static VALUE t_get_heartbeat_interval (VALUE self UNUSED) +{ + return rb_float_new(evma_get_heartbeat_interval()); +} + + +/************************ +t_set_heartbeat_interval +*************************/ + +static VALUE t_set_heartbeat_interval (VALUE self UNUSED, VALUE interval) +{ + float iv = RFLOAT_VALUE(interval); + if (evma_set_heartbeat_interval(iv)) + return Qtrue; + return Qfalse; +} + + +/********************* +Init_rubyeventmachine +*********************/ + +extern "C" void Init_rubyeventmachine() +{ + // Lookup Process::Status for get_subprocess_status + VALUE rb_mProcess = rb_const_get(rb_cObject, rb_intern("Process")); + rb_cProcStatus = rb_const_get(rb_mProcess, rb_intern("Status")); + + // Tuck away some symbol values so we don't have to look 'em up every time we need 'em. + Intern_at_signature = rb_intern ("@signature"); + Intern_at_timers = rb_intern ("@timers"); + Intern_at_conns = rb_intern ("@conns"); + Intern_at_error_handler = rb_intern("@error_handler"); + + Intern_event_callback = rb_intern ("event_callback"); + Intern_run_deferred_callbacks = rb_intern ("run_deferred_callbacks"); + Intern_delete = rb_intern ("delete"); + Intern_call = rb_intern ("call"); + Intern_at = rb_intern("at"); + Intern_receive_data = rb_intern ("receive_data"); + Intern_ssl_handshake_completed = rb_intern ("ssl_handshake_completed"); + Intern_ssl_verify_peer = rb_intern ("ssl_verify_peer"); + Intern_notify_readable = rb_intern ("notify_readable"); + Intern_notify_writable = rb_intern ("notify_writable"); + Intern_proxy_target_unbound = rb_intern ("proxy_target_unbound"); + Intern_proxy_completed = rb_intern ("proxy_completed"); + Intern_connection_completed = rb_intern ("connection_completed"); + + // INCOMPLETE, we need to define class Connections inside module EventMachine + // run_machine and run_machine_without_threads are now identical. + // Must deprecate the without_threads variant. + EmModule = rb_define_module ("EventMachine"); + EmConnection = rb_define_class_under (EmModule, "Connection", rb_cObject); + + rb_define_class_under (EmModule, "NoHandlerForAcceptedConnection", rb_eRuntimeError); + EM_eConnectionError = rb_define_class_under (EmModule, "ConnectionError", rb_eRuntimeError); + EM_eConnectionNotBound = rb_define_class_under (EmModule, "ConnectionNotBound", rb_eRuntimeError); + EM_eUnknownTimerFired = rb_define_class_under (EmModule, "UnknownTimerFired", rb_eRuntimeError); + EM_eUnsupported = rb_define_class_under (EmModule, "Unsupported", rb_eRuntimeError); + EM_eInvalidSignature = rb_define_class_under (EmModule, "InvalidSignature", rb_eRuntimeError); + + rb_define_module_function (EmModule, "initialize_event_machine", (VALUE(*)(...))t_initialize_event_machine, 0); + rb_define_module_function (EmModule, "run_machine_once", (VALUE(*)(...))t_run_machine_once, 0); + rb_define_module_function (EmModule, "run_machine", (VALUE(*)(...))t_run_machine, 0); + rb_define_module_function (EmModule, "run_machine_without_threads", (VALUE(*)(...))t_run_machine, 0); + rb_define_module_function (EmModule, "add_oneshot_timer", (VALUE(*)(...))t_add_oneshot_timer, 1); + rb_define_module_function (EmModule, "start_tcp_server", (VALUE(*)(...))t_start_server, 2); + rb_define_module_function (EmModule, "stop_tcp_server", (VALUE(*)(...))t_stop_server, 1); + rb_define_module_function (EmModule, "start_unix_server", (VALUE(*)(...))t_start_unix_server, 1); + rb_define_module_function (EmModule, "attach_sd", (VALUE(*)(...))t_attach_sd, 1); + rb_define_module_function (EmModule, "set_tls_parms", (VALUE(*)(...))t_set_tls_parms, 10); + rb_define_module_function (EmModule, "start_tls", (VALUE(*)(...))t_start_tls, 1); + rb_define_module_function (EmModule, "get_peer_cert", (VALUE(*)(...))t_get_peer_cert, 1); + rb_define_module_function (EmModule, "get_cipher_bits", (VALUE(*)(...))t_get_cipher_bits, 1); + rb_define_module_function (EmModule, "get_cipher_name", (VALUE(*)(...))t_get_cipher_name, 1); + rb_define_module_function (EmModule, "get_cipher_protocol", (VALUE(*)(...))t_get_cipher_protocol, 1); + rb_define_module_function (EmModule, "get_sni_hostname", (VALUE(*)(...))t_get_sni_hostname, 1); + rb_define_module_function (EmModule, "send_data", (VALUE(*)(...))t_send_data, 3); + rb_define_module_function (EmModule, "send_datagram", (VALUE(*)(...))t_send_datagram, 5); + rb_define_module_function (EmModule, "close_connection", (VALUE(*)(...))t_close_connection, 2); + rb_define_module_function (EmModule, "report_connection_error_status", (VALUE(*)(...))t_report_connection_error_status, 1); + rb_define_module_function (EmModule, "connect_server", (VALUE(*)(...))t_connect_server, 2); + rb_define_module_function (EmModule, "bind_connect_server", (VALUE(*)(...))t_bind_connect_server, 4); + rb_define_module_function (EmModule, "connect_unix_server", (VALUE(*)(...))t_connect_unix_server, 1); + + rb_define_module_function (EmModule, "attach_fd", (VALUE (*)(...))t_attach_fd, 2); + rb_define_module_function (EmModule, "detach_fd", (VALUE (*)(...))t_detach_fd, 1); + rb_define_module_function (EmModule, "get_file_descriptor", (VALUE (*)(...))t_get_file_descriptor, 1); + rb_define_module_function (EmModule, "get_sock_opt", (VALUE (*)(...))t_get_sock_opt, 3); + rb_define_module_function (EmModule, "set_sock_opt", (VALUE (*)(...))t_set_sock_opt, 4); + rb_define_module_function (EmModule, "set_notify_readable", (VALUE (*)(...))t_set_notify_readable, 2); + rb_define_module_function (EmModule, "set_notify_writable", (VALUE (*)(...))t_set_notify_writable, 2); + rb_define_module_function (EmModule, "is_notify_readable", (VALUE (*)(...))t_is_notify_readable, 1); + rb_define_module_function (EmModule, "is_notify_writable", (VALUE (*)(...))t_is_notify_writable, 1); + + rb_define_module_function (EmModule, "pause_connection", (VALUE (*)(...))t_pause, 1); + rb_define_module_function (EmModule, "resume_connection", (VALUE (*)(...))t_resume, 1); + rb_define_module_function (EmModule, "connection_paused?", (VALUE (*)(...))t_paused_p, 1); + rb_define_module_function (EmModule, "num_close_scheduled", (VALUE (*)(...))t_num_close_scheduled, 0); + + rb_define_module_function (EmModule, "start_proxy", (VALUE (*)(...))t_start_proxy, 4); + rb_define_module_function (EmModule, "stop_proxy", (VALUE (*)(...))t_stop_proxy, 1); + rb_define_module_function (EmModule, "get_proxied_bytes", (VALUE (*)(...))t_proxied_bytes, 1); + + rb_define_module_function (EmModule, "watch_filename", (VALUE (*)(...))t_watch_filename, 1); + rb_define_module_function (EmModule, "unwatch_filename", (VALUE (*)(...))t_unwatch_filename, 1); + + rb_define_module_function (EmModule, "watch_pid", (VALUE (*)(...))t_watch_pid, 1); + rb_define_module_function (EmModule, "unwatch_pid", (VALUE (*)(...))t_unwatch_pid, 1); + + rb_define_module_function (EmModule, "current_time", (VALUE(*)(...))t_get_loop_time, 0); + + rb_define_module_function (EmModule, "open_udp_socket", (VALUE(*)(...))t_open_udp_socket, 2); + rb_define_module_function (EmModule, "read_keyboard", (VALUE(*)(...))t_read_keyboard, 0); + rb_define_module_function (EmModule, "release_machine", (VALUE(*)(...))t_release_machine, 0); + rb_define_module_function (EmModule, "stop", (VALUE(*)(...))t_stop, 0); + rb_define_module_function (EmModule, "signal_loopbreak", (VALUE(*)(...))t_signal_loopbreak, 0); + rb_define_module_function (EmModule, "library_type", (VALUE(*)(...))t_library_type, 0); + rb_define_module_function (EmModule, "set_timer_quantum", (VALUE(*)(...))t_set_timer_quantum, 1); + rb_define_module_function (EmModule, "get_max_timer_count", (VALUE(*)(...))t_get_max_timer_count, 0); + rb_define_module_function (EmModule, "set_max_timer_count", (VALUE(*)(...))t_set_max_timer_count, 1); + rb_define_module_function (EmModule, "get_simultaneous_accept_count", (VALUE(*)(...))t_get_simultaneous_accept_count, 0); + rb_define_module_function (EmModule, "set_simultaneous_accept_count", (VALUE(*)(...))t_set_simultaneous_accept_count, 1); + rb_define_module_function (EmModule, "setuid_string", (VALUE(*)(...))t_setuid_string, 1); + rb_define_module_function (EmModule, "invoke_popen", (VALUE(*)(...))t_invoke_popen, 1); + rb_define_module_function (EmModule, "send_file_data", (VALUE(*)(...))t_send_file_data, 2); + rb_define_module_function (EmModule, "get_heartbeat_interval", (VALUE(*)(...))t_get_heartbeat_interval, 0); + rb_define_module_function (EmModule, "set_heartbeat_interval", (VALUE(*)(...))t_set_heartbeat_interval, 1); + rb_define_module_function (EmModule, "get_idle_time", (VALUE(*)(...))t_get_idle_time, 1); + + rb_define_module_function (EmModule, "get_peername", (VALUE(*)(...))t_get_peername, 1); + rb_define_module_function (EmModule, "get_sockname", (VALUE(*)(...))t_get_sockname, 1); + rb_define_module_function (EmModule, "get_subprocess_pid", (VALUE(*)(...))t_get_subprocess_pid, 1); + rb_define_module_function (EmModule, "get_subprocess_status", (VALUE(*)(...))t_get_subprocess_status, 1); + rb_define_module_function (EmModule, "get_comm_inactivity_timeout", (VALUE(*)(...))t_get_comm_inactivity_timeout, 1); + rb_define_module_function (EmModule, "set_comm_inactivity_timeout", (VALUE(*)(...))t_set_comm_inactivity_timeout, 2); + rb_define_module_function (EmModule, "get_pending_connect_timeout", (VALUE(*)(...))t_get_pending_connect_timeout, 1); + rb_define_module_function (EmModule, "set_pending_connect_timeout", (VALUE(*)(...))t_set_pending_connect_timeout, 2); + rb_define_module_function (EmModule, "set_rlimit_nofile", (VALUE(*)(...))t_set_rlimit_nofile, 1); + rb_define_module_function (EmModule, "get_connection_count", (VALUE(*)(...))t_get_connection_count, 0); + + rb_define_module_function (EmModule, "epoll", (VALUE(*)(...))t__epoll, 0); + rb_define_module_function (EmModule, "epoll=", (VALUE(*)(...))t__epoll_set, 1); + rb_define_module_function (EmModule, "epoll?", (VALUE(*)(...))t__epoll_p, 0); + + rb_define_module_function (EmModule, "kqueue", (VALUE(*)(...))t__kqueue, 0); + rb_define_module_function (EmModule, "kqueue=", (VALUE(*)(...))t__kqueue_set, 1); + rb_define_module_function (EmModule, "kqueue?", (VALUE(*)(...))t__kqueue_p, 0); + + rb_define_module_function (EmModule, "ssl?", (VALUE(*)(...))t__ssl_p, 0); + rb_define_module_function(EmModule, "stopping?",(VALUE(*)(...))t_stopping, 0); + + rb_define_method (EmConnection, "get_outbound_data_size", (VALUE(*)(...))conn_get_outbound_data_size, 0); + rb_define_method (EmConnection, "associate_callback_target", (VALUE(*)(...))conn_associate_callback_target, 1); + + // Connection states + rb_define_const (EmModule, "TimerFired", INT2NUM(EM_TIMER_FIRED )); + rb_define_const (EmModule, "ConnectionData", INT2NUM(EM_CONNECTION_READ )); + rb_define_const (EmModule, "ConnectionUnbound", INT2NUM(EM_CONNECTION_UNBOUND )); + rb_define_const (EmModule, "ConnectionAccepted", INT2NUM(EM_CONNECTION_ACCEPTED )); + rb_define_const (EmModule, "ConnectionCompleted", INT2NUM(EM_CONNECTION_COMPLETED )); + rb_define_const (EmModule, "LoopbreakSignalled", INT2NUM(EM_LOOPBREAK_SIGNAL )); + rb_define_const (EmModule, "ConnectionNotifyReadable", INT2NUM(EM_CONNECTION_NOTIFY_READABLE)); + rb_define_const (EmModule, "ConnectionNotifyWritable", INT2NUM(EM_CONNECTION_NOTIFY_WRITABLE)); + rb_define_const (EmModule, "SslHandshakeCompleted", INT2NUM(EM_SSL_HANDSHAKE_COMPLETED )); + rb_define_const (EmModule, "SslVerify", INT2NUM(EM_SSL_VERIFY )); + // EM_PROXY_TARGET_UNBOUND = 110, + // EM_PROXY_COMPLETED = 111 + + // SSL Protocols + rb_define_const (EmModule, "EM_PROTO_SSLv2", INT2NUM(EM_PROTO_SSLv2 )); + rb_define_const (EmModule, "EM_PROTO_SSLv3", INT2NUM(EM_PROTO_SSLv3 )); + rb_define_const (EmModule, "EM_PROTO_TLSv1", INT2NUM(EM_PROTO_TLSv1 )); + rb_define_const (EmModule, "EM_PROTO_TLSv1_1", INT2NUM(EM_PROTO_TLSv1_1)); + rb_define_const (EmModule, "EM_PROTO_TLSv1_2", INT2NUM(EM_PROTO_TLSv1_2)); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/rubymain.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/rubymain.o new file mode 100644 index 000000000000..0d7d93e82ab3 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/rubymain.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ssl.cpp b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ssl.cpp new file mode 100644 index 000000000000..8d5e038a9bd1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ssl.cpp @@ -0,0 +1,619 @@ +/***************************************************************************** + +$Id$ + +File: ssl.cpp +Date: 30Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifdef WITH_SSL + +#include "project.h" + + +bool SslContext_t::bLibraryInitialized = false; + + + +static void InitializeDefaultCredentials(); +static EVP_PKEY *DefaultPrivateKey = NULL; +static X509 *DefaultCertificate = NULL; + +static char PrivateMaterials[] = { +"-----BEGIN RSA PRIVATE KEY-----\n" +"MIICXAIBAAKBgQDCYYhcw6cGRbhBVShKmbWm7UVsEoBnUf0cCh8AX+MKhMxwVDWV\n" +"Igdskntn3cSJjRtmgVJHIK0lpb/FYHQB93Ohpd9/Z18pDmovfFF9nDbFF0t39hJ/\n" +"AqSzFB3GiVPoFFZJEE1vJqh+3jzsSF5K56bZ6azz38VlZgXeSozNW5bXkQIDAQAB\n" +"AoGALA89gIFcr6BIBo8N5fL3aNHpZXjAICtGav+kTUpuxSiaym9cAeTHuAVv8Xgk\n" +"H2Wbq11uz+6JMLpkQJH/WZ7EV59DPOicXrp0Imr73F3EXBfR7t2EQDYHPMthOA1D\n" +"I9EtCzvV608Ze90hiJ7E3guGrGppZfJ+eUWCPgy8CZH1vRECQQDv67rwV/oU1aDo\n" +"6/+d5nqjeW6mWkGqTnUU96jXap8EIw6B+0cUKskwx6mHJv+tEMM2748ZY7b0yBlg\n" +"w4KDghbFAkEAz2h8PjSJG55LwqmXih1RONSgdN9hjB12LwXL1CaDh7/lkEhq0PlK\n" +"PCAUwQSdM17Sl0Xxm2CZiekTSlwmHrtqXQJAF3+8QJwtV2sRJp8u2zVe37IeH1cJ\n" +"xXeHyjTzqZ2803fnjN2iuZvzNr7noOA1/Kp+pFvUZUU5/0G2Ep8zolPUjQJAFA7k\n" +"xRdLkzIx3XeNQjwnmLlncyYPRv+qaE3FMpUu7zftuZBnVCJnvXzUxP3vPgKTlzGa\n" +"dg5XivDRfsV+okY5uQJBAMV4FesUuLQVEKb6lMs7rzZwpeGQhFDRfywJzfom2TLn\n" +"2RdJQQ3dcgnhdVDgt5o1qkmsqQh8uJrJ9SdyLIaZQIc=\n" +"-----END RSA PRIVATE KEY-----\n" +"-----BEGIN CERTIFICATE-----\n" +"MIID6TCCA1KgAwIBAgIJANm4W/Tzs+s+MA0GCSqGSIb3DQEBBQUAMIGqMQswCQYD\n" +"VQQGEwJVUzERMA8GA1UECBMITmV3IFlvcmsxETAPBgNVBAcTCE5ldyBZb3JrMRYw\n" +"FAYDVQQKEw1TdGVhbWhlYXQubmV0MRQwEgYDVQQLEwtFbmdpbmVlcmluZzEdMBsG\n" +"A1UEAxMUb3BlbmNhLnN0ZWFtaGVhdC5uZXQxKDAmBgkqhkiG9w0BCQEWGWVuZ2lu\n" +"ZWVyaW5nQHN0ZWFtaGVhdC5uZXQwHhcNMDYwNTA1MTcwNjAzWhcNMjQwMjIwMTcw\n" +"NjAzWjCBqjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQH\n" +"EwhOZXcgWW9yazEWMBQGA1UEChMNU3RlYW1oZWF0Lm5ldDEUMBIGA1UECxMLRW5n\n" +"aW5lZXJpbmcxHTAbBgNVBAMTFG9wZW5jYS5zdGVhbWhlYXQubmV0MSgwJgYJKoZI\n" +"hvcNAQkBFhllbmdpbmVlcmluZ0BzdGVhbWhlYXQubmV0MIGfMA0GCSqGSIb3DQEB\n" +"AQUAA4GNADCBiQKBgQDCYYhcw6cGRbhBVShKmbWm7UVsEoBnUf0cCh8AX+MKhMxw\n" +"VDWVIgdskntn3cSJjRtmgVJHIK0lpb/FYHQB93Ohpd9/Z18pDmovfFF9nDbFF0t3\n" +"9hJ/AqSzFB3GiVPoFFZJEE1vJqh+3jzsSF5K56bZ6azz38VlZgXeSozNW5bXkQID\n" +"AQABo4IBEzCCAQ8wHQYDVR0OBBYEFPJvPd1Fcmd8o/Tm88r+NjYPICCkMIHfBgNV\n" +"HSMEgdcwgdSAFPJvPd1Fcmd8o/Tm88r+NjYPICCkoYGwpIGtMIGqMQswCQYDVQQG\n" +"EwJVUzERMA8GA1UECBMITmV3IFlvcmsxETAPBgNVBAcTCE5ldyBZb3JrMRYwFAYD\n" +"VQQKEw1TdGVhbWhlYXQubmV0MRQwEgYDVQQLEwtFbmdpbmVlcmluZzEdMBsGA1UE\n" +"AxMUb3BlbmNhLnN0ZWFtaGVhdC5uZXQxKDAmBgkqhkiG9w0BCQEWGWVuZ2luZWVy\n" +"aW5nQHN0ZWFtaGVhdC5uZXSCCQDZuFv087PrPjAMBgNVHRMEBTADAQH/MA0GCSqG\n" +"SIb3DQEBBQUAA4GBAC1CXey/4UoLgJiwcEMDxOvW74plks23090iziFIlGgcIhk0\n" +"Df6hTAs7H3MWww62ddvR8l07AWfSzSP5L6mDsbvq7EmQsmPODwb6C+i2aF3EDL8j\n" +"uw73m4YIGI0Zw2XdBpiOGkx2H56Kya6mJJe/5XORZedh1wpI7zki01tHYbcy\n" +"-----END CERTIFICATE-----\n"}; + +/* These private materials were made with: + * openssl req -new -x509 -keyout cakey.pem -out cacert.pem -nodes -days 6500 + * TODO: We need a full-blown capability to work with user-supplied + * keypairs and properly-signed certificates. + */ + + +/***************** +builtin_passwd_cb +*****************/ + +extern "C" int builtin_passwd_cb (char *buf UNUSED, int bufsize UNUSED, int rwflag UNUSED, void *userdata UNUSED) +{ + strcpy (buf, "kittycat"); + return 8; +} + +/**************************** +InitializeDefaultCredentials +****************************/ + +static void InitializeDefaultCredentials() +{ + BIO *bio = BIO_new_mem_buf (PrivateMaterials, -1); + assert (bio); + + if (DefaultPrivateKey) { + // we may come here in a restart. + EVP_PKEY_free (DefaultPrivateKey); + DefaultPrivateKey = NULL; + } + PEM_read_bio_PrivateKey (bio, &DefaultPrivateKey, builtin_passwd_cb, 0); + + if (DefaultCertificate) { + // we may come here in a restart. + X509_free (DefaultCertificate); + DefaultCertificate = NULL; + } + PEM_read_bio_X509 (bio, &DefaultCertificate, NULL, 0); + + BIO_free (bio); +} + + + +/************************** +SslContext_t::SslContext_t +**************************/ + +SslContext_t::SslContext_t (bool is_server, const std::string &privkeyfile, const std::string &certchainfile, const std::string &cipherlist, const std::string &ecdh_curve, const std::string &dhparam, int ssl_version) : + bIsServer (is_server), + pCtx (NULL), + PrivateKey (NULL), + Certificate (NULL) +{ + /* TODO: the usage of the specified private-key and cert-chain filenames only applies to + * client-side connections at this point. Server connections currently use the default materials. + * That needs to be fixed asap. + * Also, in this implementation, server-side connections use statically defined X-509 defaults. + * One thing I'm really not clear on is whether or not you have to explicitly free X509 and EVP_PKEY + * objects when we call our destructor, or whether just calling SSL_CTX_free is enough. + */ + + if (!bLibraryInitialized) { + bLibraryInitialized = true; + SSL_library_init(); + OpenSSL_add_ssl_algorithms(); + OpenSSL_add_all_algorithms(); + SSL_load_error_strings(); + ERR_load_crypto_strings(); + + InitializeDefaultCredentials(); + } + + pCtx = SSL_CTX_new (bIsServer ? SSLv23_server_method() : SSLv23_client_method()); + if (!pCtx) + throw std::runtime_error ("no SSL context"); + + SSL_CTX_set_options (pCtx, SSL_OP_ALL); + + #ifdef SSL_CTRL_CLEAR_OPTIONS + SSL_CTX_clear_options (pCtx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1); + # ifdef SSL_OP_NO_TLSv1_1 + SSL_CTX_clear_options (pCtx, SSL_OP_NO_TLSv1_1); + # endif + # ifdef SSL_OP_NO_TLSv1_2 + SSL_CTX_clear_options (pCtx, SSL_OP_NO_TLSv1_2); + # endif + #endif + + if (!(ssl_version & EM_PROTO_SSLv2)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_SSLv2); + + if (!(ssl_version & EM_PROTO_SSLv3)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_SSLv3); + + if (!(ssl_version & EM_PROTO_TLSv1)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_TLSv1); + + #ifdef SSL_OP_NO_TLSv1_1 + if (!(ssl_version & EM_PROTO_TLSv1_1)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_TLSv1_1); + #endif + + #ifdef SSL_OP_NO_TLSv1_2 + if (!(ssl_version & EM_PROTO_TLSv1_2)) + SSL_CTX_set_options (pCtx, SSL_OP_NO_TLSv1_2); + #endif + + #ifdef SSL_MODE_RELEASE_BUFFERS + SSL_CTX_set_mode (pCtx, SSL_MODE_RELEASE_BUFFERS); + #endif + + if (bIsServer) { + + // The SSL_CTX calls here do NOT allocate memory. + int e; + if (privkeyfile.length() > 0) + e = SSL_CTX_use_PrivateKey_file (pCtx, privkeyfile.c_str(), SSL_FILETYPE_PEM); + else + e = SSL_CTX_use_PrivateKey (pCtx, DefaultPrivateKey); + if (e <= 0) ERR_print_errors_fp(stderr); + assert (e > 0); + + if (certchainfile.length() > 0) + e = SSL_CTX_use_certificate_chain_file (pCtx, certchainfile.c_str()); + else + e = SSL_CTX_use_certificate (pCtx, DefaultCertificate); + if (e <= 0) ERR_print_errors_fp(stderr); + assert (e > 0); + + if (dhparam.length() > 0) { + DH *dh; + BIO *bio; + + bio = BIO_new_file(dhparam.c_str(), "r"); + if (bio == NULL) { + char buf [500]; + snprintf (buf, sizeof(buf)-1, "dhparam: BIO_new_file(%s) failed", dhparam.c_str()); + throw std::runtime_error (buf); + } + + dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); + + if (dh == NULL) { + BIO_free(bio); + char buf [500]; + snprintf (buf, sizeof(buf)-1, "dhparam: PEM_read_bio_DHparams(%s) failed", dhparam.c_str()); + throw std::runtime_error (buf); + } + + SSL_CTX_set_tmp_dh(pCtx, dh); + + DH_free(dh); + BIO_free(bio); + } + + if (ecdh_curve.length() > 0) { + #if OPENSSL_VERSION_NUMBER >= 0x0090800fL && !defined(OPENSSL_NO_ECDH) + int nid; + EC_KEY *ecdh; + + nid = OBJ_sn2nid((const char *) ecdh_curve.c_str()); + if (nid == 0) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "ecdh_curve: Unknown curve name: %s", ecdh_curve.c_str()); + throw std::runtime_error (buf); + } + + ecdh = EC_KEY_new_by_curve_name(nid); + if (ecdh == NULL) { + char buf [200]; + snprintf (buf, sizeof(buf)-1, "ecdh_curve: Unable to create: %s", ecdh_curve.c_str()); + throw std::runtime_error (buf); + } + + SSL_CTX_set_options(pCtx, SSL_OP_SINGLE_ECDH_USE); + + SSL_CTX_set_tmp_ecdh(pCtx, ecdh); + + EC_KEY_free(ecdh); + #else + throw std::runtime_error ("No openssl ECDH support"); + #endif + } + } + + if (cipherlist.length() > 0) + SSL_CTX_set_cipher_list (pCtx, cipherlist.c_str()); + else + SSL_CTX_set_cipher_list (pCtx, "ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH"); + + if (bIsServer) { + SSL_CTX_sess_set_cache_size (pCtx, 128); + SSL_CTX_set_session_id_context (pCtx, (unsigned char*)"eventmachine", 12); + } + else { + int e; + if (privkeyfile.length() > 0) { + e = SSL_CTX_use_PrivateKey_file (pCtx, privkeyfile.c_str(), SSL_FILETYPE_PEM); + if (e <= 0) ERR_print_errors_fp(stderr); + assert (e > 0); + } + if (certchainfile.length() > 0) { + e = SSL_CTX_use_certificate_chain_file (pCtx, certchainfile.c_str()); + if (e <= 0) ERR_print_errors_fp(stderr); + assert (e > 0); + } + } +} + + + +/*************************** +SslContext_t::~SslContext_t +***************************/ + +SslContext_t::~SslContext_t() +{ + if (pCtx) + SSL_CTX_free (pCtx); + if (PrivateKey) + EVP_PKEY_free (PrivateKey); + if (Certificate) + X509_free (Certificate); +} + + + +/****************** +SslBox_t::SslBox_t +******************/ + +SslBox_t::SslBox_t (bool is_server, const std::string &privkeyfile, const std::string &certchainfile, bool verify_peer, bool fail_if_no_peer_cert, const std::string &snihostname, const std::string &cipherlist, const std::string &ecdh_curve, const std::string &dhparam, int ssl_version, const uintptr_t binding): + bIsServer (is_server), + bHandshakeCompleted (false), + bVerifyPeer (verify_peer), + bFailIfNoPeerCert (fail_if_no_peer_cert), + pSSL (NULL), + pbioRead (NULL), + pbioWrite (NULL) +{ + /* TODO someday: make it possible to re-use SSL contexts so we don't have to create + * a new one every time we come here. + */ + + Context = new SslContext_t (bIsServer, privkeyfile, certchainfile, cipherlist, ecdh_curve, dhparam, ssl_version); + assert (Context); + + pbioRead = BIO_new (BIO_s_mem()); + assert (pbioRead); + + pbioWrite = BIO_new (BIO_s_mem()); + assert (pbioWrite); + + pSSL = SSL_new (Context->pCtx); + assert (pSSL); + + if (snihostname.length() > 0) { + SSL_set_tlsext_host_name (pSSL, snihostname.c_str()); + } + + SSL_set_bio (pSSL, pbioRead, pbioWrite); + + // Store a pointer to the binding signature in the SSL object so we can retrieve it later + SSL_set_ex_data(pSSL, 0, (void*) binding); + + if (bVerifyPeer) { + int mode = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE; + if (bFailIfNoPeerCert) + mode = mode | SSL_VERIFY_FAIL_IF_NO_PEER_CERT; + SSL_set_verify(pSSL, mode, ssl_verify_wrapper); + } + + if (!bIsServer) { + int e = SSL_connect (pSSL); + if (e != 1) + ERR_print_errors_fp(stderr); + } +} + + + +/******************* +SslBox_t::~SslBox_t +*******************/ + +SslBox_t::~SslBox_t() +{ + // Freeing pSSL will also free the associated BIOs, so DON'T free them separately. + if (pSSL) { + if (SSL_get_shutdown (pSSL) & SSL_RECEIVED_SHUTDOWN) + SSL_shutdown (pSSL); + else + SSL_clear (pSSL); + SSL_free (pSSL); + } + + delete Context; +} + + + +/*********************** +SslBox_t::PutCiphertext +***********************/ + +bool SslBox_t::PutCiphertext (const char *buf, int bufsize) +{ + assert (buf && (bufsize > 0)); + + assert (pbioRead); + int n = BIO_write (pbioRead, buf, bufsize); + + return (n == bufsize) ? true : false; +} + + +/********************** +SslBox_t::GetPlaintext +**********************/ + +int SslBox_t::GetPlaintext (char *buf, int bufsize) +{ + if (!SSL_is_init_finished (pSSL)) { + int e = bIsServer ? SSL_accept (pSSL) : SSL_connect (pSSL); + if (e != 1) { + int er = SSL_get_error (pSSL, e); + if (er != SSL_ERROR_WANT_READ) { + ERR_print_errors_fp(stderr); + // Return -1 for a nonfatal error, -2 for an error that should force the connection down. + return (er == SSL_ERROR_SSL) ? (-2) : (-1); + } + else + return 0; + } + bHandshakeCompleted = true; + // If handshake finished, FALL THROUGH and return the available plaintext. + } + + if (!SSL_is_init_finished (pSSL)) { + // We can get here if a browser abandons a handshake. + // The user can see a warning dialog and abort the connection. + //cerr << "<SSL_incomp>"; + return 0; + } + + //cerr << "CIPH: " << SSL_get_cipher (pSSL) << endl; + + int n = SSL_read (pSSL, buf, bufsize); + if (n >= 0) { + return n; + } + else { + if (SSL_get_error (pSSL, n) == SSL_ERROR_WANT_READ) { + return 0; + } + else { + return -1; + } + } + + return 0; +} + + + +/************************** +SslBox_t::CanGetCiphertext +**************************/ + +bool SslBox_t::CanGetCiphertext() +{ + assert (pbioWrite); + return BIO_pending (pbioWrite) ? true : false; +} + + + +/*********************** +SslBox_t::GetCiphertext +***********************/ + +int SslBox_t::GetCiphertext (char *buf, int bufsize) +{ + assert (pbioWrite); + assert (buf && (bufsize > 0)); + + return BIO_read (pbioWrite, buf, bufsize); +} + + + +/********************** +SslBox_t::PutPlaintext +**********************/ + +int SslBox_t::PutPlaintext (const char *buf, int bufsize) +{ + // The caller will interpret the return value as the number of bytes written. + // WARNING WARNING WARNING, are there any situations in which a 0 or -1 return + // from SSL_write means we should immediately retry? The socket-machine loop + // will probably wait for a time-out cycle (perhaps a second) before re-trying. + // THIS WOULD CAUSE A PERCEPTIBLE DELAY! + + /* We internally queue any outbound plaintext that can't be dispatched + * because we're in the middle of a handshake or something. + * When we get called, try to send any queued data first, and then + * send the caller's data (or queue it). We may get called with no outbound + * data, which means we try to send the outbound queue and that's all. + * + * Return >0 if we wrote any data, 0 if we didn't, and <0 for a fatal error. + * Note that if we return 0, the connection is still considered live + * and we are signalling that we have accepted the outbound data (if any). + */ + + OutboundQ.Push (buf, bufsize); + + if (!SSL_is_init_finished (pSSL)) + return 0; + + bool fatal = false; + bool did_work = false; + int pending = BIO_pending(pbioWrite); + + while (OutboundQ.HasPages() && pending < SSLBOX_WRITE_BUFFER_SIZE) { + const char *page; + int length; + OutboundQ.Front (&page, &length); + assert (page && (length > 0)); + int n = SSL_write (pSSL, page, length); + pending = BIO_pending(pbioWrite); + + if (n > 0) { + did_work = true; + OutboundQ.PopFront(); + } + else { + int er = SSL_get_error (pSSL, n); + if ((er != SSL_ERROR_WANT_READ) && (er != SSL_ERROR_WANT_WRITE)) + fatal = true; + break; + } + } + + + if (did_work) + return 1; + else if (fatal) + return -1; + else + return 0; +} + +/********************** +SslBox_t::GetPeerCert +**********************/ + +X509 *SslBox_t::GetPeerCert() +{ + X509 *cert = NULL; + + if (pSSL) + cert = SSL_get_peer_certificate(pSSL); + + return cert; +} + +/********************** +SslBox_t::GetCipherBits +**********************/ + +int SslBox_t::GetCipherBits() +{ + int bits = -1; + if (pSSL) + SSL_get_cipher_bits(pSSL, &bits); + return bits; +} + +/********************** +SslBox_t::GetCipherName +**********************/ + +const char *SslBox_t::GetCipherName() +{ + if (pSSL) + return SSL_get_cipher_name(pSSL); + return NULL; +} + +/********************** +SslBox_t::GetCipherProtocol +**********************/ + +const char *SslBox_t::GetCipherProtocol() +{ + if (pSSL) + return SSL_get_cipher_version(pSSL); + return NULL; +} + +/********************** +SslBox_t::GetSNIHostname +**********************/ + +const char *SslBox_t::GetSNIHostname() +{ + #ifdef TLSEXT_NAMETYPE_host_name + if (pSSL) + return SSL_get_servername (pSSL, TLSEXT_NAMETYPE_host_name); + #endif + return NULL; +} + +/****************** +ssl_verify_wrapper +*******************/ + +extern "C" int ssl_verify_wrapper(int preverify_ok UNUSED, X509_STORE_CTX *ctx) +{ + uintptr_t binding; + X509 *cert; + SSL *ssl; + BUF_MEM *buf; + BIO *out; + int result; + + cert = X509_STORE_CTX_get_current_cert(ctx); + ssl = (SSL*) X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); + binding = (uintptr_t) SSL_get_ex_data(ssl, 0); + + out = BIO_new(BIO_s_mem()); + PEM_write_bio_X509(out, cert); + BIO_write(out, "\0", 1); + BIO_get_mem_ptr(out, &buf); + + ConnectionDescriptor *cd = dynamic_cast <ConnectionDescriptor*> (Bindable_t::GetObject(binding)); + result = (cd->VerifySslPeer(buf->data) == true ? 1 : 0); + BIO_free(out); + + return result; +} + +#endif // WITH_SSL + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ssl.h b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ssl.h new file mode 100644 index 000000000000..64ff6e18c0d0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ssl.h @@ -0,0 +1,103 @@ +/***************************************************************************** + +$Id$ + +File: ssl.h +Date: 30Apr06 + +Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +Gmail: blackhedd + +This program is free software; you can redistribute it and/or modify +it under the terms of either: 1) the GNU General Public License +as published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version; or 2) Ruby's License. + +See the file COPYING for complete licensing information. + +*****************************************************************************/ + + +#ifndef __SslBox__H_ +#define __SslBox__H_ + + + + +#ifdef WITH_SSL + +/****************** +class SslContext_t +******************/ + +class SslContext_t +{ + public: + SslContext_t (bool is_server, const std::string &privkeyfile, const std::string &certchainfile, const std::string &cipherlist, const std::string &ecdh_curve, const std::string &dhparam, int ssl_version); + virtual ~SslContext_t(); + + private: + static bool bLibraryInitialized; + + private: + bool bIsServer; + SSL_CTX *pCtx; + + EVP_PKEY *PrivateKey; + X509 *Certificate; + + friend class SslBox_t; +}; + + +/************** +class SslBox_t +**************/ + +#define SSLBOX_INPUT_CHUNKSIZE 2019 +#define SSLBOX_OUTPUT_CHUNKSIZE 2048 +#define SSLBOX_WRITE_BUFFER_SIZE 8192 // (SSLBOX_OUTPUT_CHUNKSIZE * 4) + +class SslBox_t +{ + public: + SslBox_t (bool is_server, const std::string &privkeyfile, const std::string &certchainfile, bool verify_peer, bool fail_if_no_peer_cert, const std::string &snihostname, const std::string &cipherlist, const std::string &ecdh_curve, const std::string &dhparam, int ssl_version, const uintptr_t binding); + virtual ~SslBox_t(); + + int PutPlaintext (const char*, int); + int GetPlaintext (char*, int); + + bool PutCiphertext (const char*, int); + bool CanGetCiphertext(); + int GetCiphertext (char*, int); + bool IsHandshakeCompleted() {return bHandshakeCompleted;} + + X509 *GetPeerCert(); + int GetCipherBits(); + const char *GetCipherName(); + const char *GetCipherProtocol(); + const char *GetSNIHostname(); + + void Shutdown(); + + protected: + SslContext_t *Context; + + bool bIsServer; + bool bHandshakeCompleted; + bool bVerifyPeer; + bool bFailIfNoPeerCert; + SSL *pSSL; + BIO *pbioRead; + BIO *pbioWrite; + + PageList OutboundQ; +}; + +extern "C" int ssl_verify_wrapper(int, X509_STORE_CTX*); + +#endif // WITH_SSL + + +#endif // __SslBox__H_ + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ssl.o b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ssl.o new file mode 100644 index 000000000000..6980f1ac1031 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/ext/ssl.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/.classpath b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/.classpath new file mode 100644 index 000000000000..11672dddbae1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/.classpath @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry excluding="src/" kind="src" path=""/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> + <classpathentry kind="output" path="src"/> +</classpath> diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/.project b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/.project new file mode 100644 index 000000000000..c7766db5ac60 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>em_reactor</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EmReactor.java b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EmReactor.java new file mode 100644 index 000000000000..31642f3f119a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EmReactor.java @@ -0,0 +1,613 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + +package com.rubyeventmachine; + +import java.io.*; +import java.nio.channels.*; +import java.util.*; +import java.nio.*; +import java.net.*; +import java.util.concurrent.atomic.*; +import java.security.*; + +public class EmReactor { + public final int EM_TIMER_FIRED = 100; + public final int EM_CONNECTION_READ = 101; + public final int EM_CONNECTION_UNBOUND = 102; + public final int EM_CONNECTION_ACCEPTED = 103; + public final int EM_CONNECTION_COMPLETED = 104; + public final int EM_LOOPBREAK_SIGNAL = 105; + public final int EM_CONNECTION_NOTIFY_READABLE = 106; + public final int EM_CONNECTION_NOTIFY_WRITABLE = 107; + public final int EM_SSL_HANDSHAKE_COMPLETED = 108; + public final int EM_SSL_VERIFY = 109; + public final int EM_PROXY_TARGET_UNBOUND = 110; + public final int EM_PROXY_COMPLETED = 111; + + public final int EM_PROTO_SSLv2 = 2; + public final int EM_PROTO_SSLv3 = 4; + public final int EM_PROTO_TLSv1 = 8; + public final int EM_PROTO_TLSv1_1 = 16; + public final int EM_PROTO_TLSv1_2 = 32; + + private Selector mySelector; + private TreeMap<Long, ArrayList<Long>> Timers; + private HashMap<Long, EventableChannel> Connections; + private HashMap<Long, ServerSocketChannel> Acceptors; + private ArrayList<Long> NewConnections; + private ArrayList<Long> UnboundConnections; + private ArrayList<EventableSocketChannel> DetachedConnections; + + private boolean bRunReactor; + private long BindingIndex; + private AtomicBoolean loopBreaker; + private ByteBuffer myReadBuffer; + private int timerQuantum; + + public EmReactor() { + Timers = new TreeMap<Long, ArrayList<Long>>(); + Connections = new HashMap<Long, EventableChannel>(); + Acceptors = new HashMap<Long, ServerSocketChannel>(); + NewConnections = new ArrayList<Long>(); + UnboundConnections = new ArrayList<Long>(); + DetachedConnections = new ArrayList<EventableSocketChannel>(); + + BindingIndex = 0; + loopBreaker = new AtomicBoolean(); + loopBreaker.set(false); + myReadBuffer = ByteBuffer.allocate(32*1024); // don't use a direct buffer. Ruby doesn't seem to like them. + timerQuantum = 98; + } + + /** + * This is a no-op stub, intended to be overridden in user code. + */ + public void eventCallback (long sig, int eventType, ByteBuffer data, long data2) { + System.out.println ("Default callback: "+sig+" "+eventType+" "+data+" "+data2); + } + public void eventCallback (long sig, int eventType, ByteBuffer data) { + eventCallback (sig, eventType, data, 0); + } + + + public void run() { + try { + mySelector = Selector.open(); + bRunReactor = true; + } catch (IOException e) { + throw new RuntimeException ("Could not open selector", e); + } + + while (bRunReactor) { + runLoopbreaks(); + if (!bRunReactor) break; + + runTimers(); + if (!bRunReactor) break; + + removeUnboundConnections(); + checkIO(); + addNewConnections(); + processIO(); + } + + close(); + } + + void addNewConnections() { + ListIterator<EventableSocketChannel> iter = DetachedConnections.listIterator(0); + while (iter.hasNext()) { + EventableSocketChannel ec = iter.next(); + ec.cleanup(); + } + DetachedConnections.clear(); + + ListIterator<Long> iter2 = NewConnections.listIterator(0); + while (iter2.hasNext()) { + long b = iter2.next(); + + EventableChannel ec = Connections.get(b); + if (ec != null) { + try { + ec.register(); + } catch (ClosedChannelException e) { + UnboundConnections.add (ec.getBinding()); + } + } + } + NewConnections.clear(); + } + + void removeUnboundConnections() { + ListIterator<Long> iter = UnboundConnections.listIterator(0); + while (iter.hasNext()) { + long b = iter.next(); + + EventableChannel ec = Connections.remove(b); + if (ec != null) { + eventCallback (b, EM_CONNECTION_UNBOUND, null); + ec.close(); + + EventableSocketChannel sc = (EventableSocketChannel) ec; + if (sc != null && sc.isAttached()) + DetachedConnections.add (sc); + } + } + UnboundConnections.clear(); + } + + void checkIO() { + long timeout; + + if (NewConnections.size() > 0) { + timeout = -1; + } else if (!Timers.isEmpty()) { + long now = new Date().getTime(); + long k = Timers.firstKey(); + long diff = k-now; + + if (diff <= 0) + timeout = -1; // don't wait, just poll once + else + timeout = diff; + } else { + timeout = 0; // wait indefinitely + } + + try { + if (timeout == -1) + mySelector.selectNow(); + else + mySelector.select(timeout); + } catch (IOException e) { + e.printStackTrace(); + } + } + + void processIO() { + Iterator<SelectionKey> it = mySelector.selectedKeys().iterator(); + while (it.hasNext()) { + SelectionKey k = it.next(); + it.remove(); + + if (k.isConnectable()) + isConnectable(k); + + else if (k.isAcceptable()) + isAcceptable(k); + + else { + if (k.isWritable()) + isWritable(k); + + if (k.isReadable()) + isReadable(k); + } + } + } + + void isAcceptable (SelectionKey k) { + ServerSocketChannel ss = (ServerSocketChannel) k.channel(); + SocketChannel sn; + long b; + + for (int n = 0; n < 10; n++) { + try { + sn = ss.accept(); + if (sn == null) + break; + } catch (IOException e) { + e.printStackTrace(); + k.cancel(); + + ServerSocketChannel server = Acceptors.remove(k.attachment()); + if (server != null) + try{ server.close(); } catch (IOException ex) {}; + break; + } + + try { + sn.configureBlocking(false); + } catch (IOException e) { + e.printStackTrace(); + continue; + } + + b = createBinding(); + EventableSocketChannel ec = new EventableSocketChannel (sn, b, mySelector); + Connections.put (b, ec); + NewConnections.add (b); + + eventCallback (((Long)k.attachment()).longValue(), EM_CONNECTION_ACCEPTED, null, b); + } + } + + void isReadable (SelectionKey k) { + EventableChannel ec = (EventableChannel) k.attachment(); + long b = ec.getBinding(); + + if (ec.isWatchOnly()) { + if (ec.isNotifyReadable()) + eventCallback (b, EM_CONNECTION_NOTIFY_READABLE, null); + } else { + myReadBuffer.clear(); + + try { + ec.readInboundData (myReadBuffer); + myReadBuffer.flip(); + if (myReadBuffer.limit() > 0) + eventCallback (b, EM_CONNECTION_READ, myReadBuffer); + } catch (IOException e) { + UnboundConnections.add (b); + } + } + } + + void isWritable (SelectionKey k) { + EventableChannel ec = (EventableChannel) k.attachment(); + long b = ec.getBinding(); + + if (ec.isWatchOnly()) { + if (ec.isNotifyWritable()) + eventCallback (b, EM_CONNECTION_NOTIFY_WRITABLE, null); + } + else { + try { + if (!ec.writeOutboundData()) + UnboundConnections.add (b); + } catch (IOException e) { + UnboundConnections.add (b); + } + } + } + + void isConnectable (SelectionKey k) { + EventableSocketChannel ec = (EventableSocketChannel) k.attachment(); + long b = ec.getBinding(); + + try { + if (ec.finishConnecting()) + eventCallback (b, EM_CONNECTION_COMPLETED, null); + else + UnboundConnections.add (b); + } catch (IOException e) { + UnboundConnections.add (b); + } + } + + void close() { + try { + if (mySelector != null) + mySelector.close(); + } catch (IOException e) {} + mySelector = null; + + // run down open connections and sockets. + Iterator<ServerSocketChannel> i = Acceptors.values().iterator(); + while (i.hasNext()) { + try { + i.next().close(); + } catch (IOException e) {} + } + + // 29Sep09: We create an ArrayList of the existing connections, then iterate over + // that to call unbind on them. This is because an unbind can trigger a reconnect, + // which will add to the Connections HashMap, causing a ConcurrentModificationException. + // XXX: The correct behavior here would be to latch the various reactor methods to return + // immediately if the reactor is shutting down. + ArrayList<EventableChannel> conns = new ArrayList<EventableChannel>(); + Iterator<EventableChannel> i2 = Connections.values().iterator(); + while (i2.hasNext()) { + EventableChannel ec = i2.next(); + if (ec != null) { + conns.add (ec); + } + } + Connections.clear(); + + ListIterator<EventableChannel> i3 = conns.listIterator(0); + while (i3.hasNext()) { + EventableChannel ec = i3.next(); + eventCallback (ec.getBinding(), EM_CONNECTION_UNBOUND, null); + ec.close(); + + EventableSocketChannel sc = (EventableSocketChannel) ec; + if (sc != null && sc.isAttached()) + DetachedConnections.add (sc); + } + + ListIterator<EventableSocketChannel> i4 = DetachedConnections.listIterator(0); + while (i4.hasNext()) { + EventableSocketChannel ec = i4.next(); + ec.cleanup(); + } + DetachedConnections.clear(); + } + + void runLoopbreaks() { + if (loopBreaker.getAndSet(false)) { + eventCallback (0, EM_LOOPBREAK_SIGNAL, null); + } + } + + public void stop() { + bRunReactor = false; + signalLoopbreak(); + } + + void runTimers() { + long now = new Date().getTime(); + while (!Timers.isEmpty()) { + long k = Timers.firstKey(); + if (k > now) + break; + + ArrayList<Long> callbacks = Timers.get(k); + Timers.remove(k); + + // Fire all timers at this timestamp + ListIterator<Long> iter = callbacks.listIterator(0); + while (iter.hasNext()) { + eventCallback (0, EM_TIMER_FIRED, null, iter.next().longValue()); + } + } + } + + public long installOneshotTimer (long milliseconds) { + long s = createBinding(); + long deadline = new Date().getTime() + milliseconds; + + if (Timers.containsKey(deadline)) { + Timers.get(deadline).add(s); + } else { + ArrayList<Long> callbacks = new ArrayList<Long>(); + callbacks.add(s); + Timers.put(deadline, callbacks); + } + + return s; + } + + public long startTcpServer (SocketAddress sa) throws EmReactorException { + try { + ServerSocketChannel server = ServerSocketChannel.open(); + server.configureBlocking(false); + server.socket().bind (sa); + long s = createBinding(); + Acceptors.put(s, server); + server.register(mySelector, SelectionKey.OP_ACCEPT, s); + return s; + } catch (IOException e) { + throw new EmReactorException ("unable to open socket acceptor: " + e.toString()); + } + } + + public long startTcpServer (String address, int port) throws EmReactorException { + return startTcpServer (new InetSocketAddress (address, port)); + } + + public void stopTcpServer (long signature) throws IOException { + ServerSocketChannel server = Acceptors.remove(signature); + if (server != null) + server.close(); + else + throw new RuntimeException ("failed to close unknown acceptor"); + } + + public long openUdpSocket (InetSocketAddress address) throws IOException { + // TODO, don't throw an exception out of here. + DatagramChannel dg = DatagramChannel.open(); + dg.configureBlocking(false); + dg.socket().bind(address); + long b = createBinding(); + EventableChannel ec = new EventableDatagramChannel (dg, b, mySelector); + dg.register(mySelector, SelectionKey.OP_READ, ec); + Connections.put(b, ec); + return b; + } + + public long openUdpSocket (String address, int port) throws IOException { + return openUdpSocket (new InetSocketAddress (address, port)); + } + + public void sendData (long sig, ByteBuffer bb) throws IOException { + Connections.get(sig).scheduleOutboundData( bb ); + } + + public void sendData (long sig, byte[] data) throws IOException { + sendData (sig, ByteBuffer.wrap(data)); + } + + public void setCommInactivityTimeout (long sig, long mills) { + Connections.get(sig).setCommInactivityTimeout (mills); + } + + public void sendDatagram (long sig, byte[] data, int length, String recipAddress, int recipPort) { + sendDatagram (sig, ByteBuffer.wrap(data), recipAddress, recipPort); + } + + public void sendDatagram (long sig, ByteBuffer bb, String recipAddress, int recipPort) { + (Connections.get(sig)).scheduleOutboundDatagram( bb, recipAddress, recipPort); + } + + public long connectTcpServer (String address, int port) { + return connectTcpServer(null, 0, address, port); + } + + public long connectTcpServer (String bindAddr, int bindPort, String address, int port) { + long b = createBinding(); + + try { + SocketChannel sc = SocketChannel.open(); + sc.configureBlocking(false); + if (bindAddr != null) + sc.socket().bind(new InetSocketAddress (bindAddr, bindPort)); + + EventableSocketChannel ec = new EventableSocketChannel (sc, b, mySelector); + + if (sc.connect (new InetSocketAddress (address, port))) { + // Connection returned immediately. Can happen with localhost connections. + // WARNING, this code is untested due to lack of available test conditions. + // Ought to be be able to come here from a localhost connection, but that + // doesn't happen on Linux. (Maybe on FreeBSD?) + // The reason for not handling this until we can test it is that we + // really need to return from this function WITHOUT triggering any EM events. + // That's because until the user code has seen the signature we generated here, + // it won't be able to properly dispatch them. The C++ EM deals with this + // by setting pending mode as a flag in ALL eventable descriptors and making + // the descriptor select for writable. Then, it can send UNBOUND and + // CONNECTION_COMPLETED on the next pass through the loop, because writable will + // fire. + throw new RuntimeException ("immediate-connect unimplemented"); + } + else { + ec.setConnectPending(); + Connections.put (b, ec); + NewConnections.add (b); + } + } catch (IOException e) { + // Can theoretically come here if a connect failure can be determined immediately. + // I don't know how to make that happen for testing purposes. + throw new RuntimeException ("immediate-connect unimplemented: " + e.toString()); + } + return b; + } + + public void closeConnection (long sig, boolean afterWriting) { + EventableChannel ec = Connections.get(sig); + if (ec != null) + if (ec.scheduleClose (afterWriting)) + UnboundConnections.add (sig); + } + + long createBinding() { + return ++BindingIndex; + } + + public void signalLoopbreak() { + loopBreaker.set(true); + if (mySelector != null) + mySelector.wakeup(); + } + + public void startTls (long sig) throws NoSuchAlgorithmException, KeyManagementException { + Connections.get(sig).startTls(); + } + + public void setTimerQuantum (int mills) { + if (mills < 5 || mills > 2500) + throw new RuntimeException ("attempt to set invalid timer-quantum value: "+mills); + timerQuantum = mills; + } + + public Object[] getPeerName (long sig) { + EventableChannel channel = Connections.get(sig); + if (channel != null) { + return Connections.get(sig).getPeerName(); + } + else { + ServerSocketChannel acceptor = Acceptors.get(sig); + return new Object[] { acceptor.socket().getLocalPort(), + acceptor.socket().getInetAddress().getHostAddress() }; + } + } + + public Object[] getSockName (long sig) { + EventableChannel channel = Connections.get(sig); + if (channel != null) { + return Connections.get(sig).getSockName(); + } + else { + ServerSocketChannel acceptor = Acceptors.get(sig); + return new Object[] { acceptor.socket().getLocalPort(), + acceptor.socket().getInetAddress().getHostAddress() }; + } + } + + public long attachChannel (SocketChannel sc, boolean watch_mode) { + long b = createBinding(); + + EventableSocketChannel ec = new EventableSocketChannel (sc, b, mySelector); + + ec.setAttached(); + if (watch_mode) + ec.setWatchOnly(); + + Connections.put (b, ec); + NewConnections.add (b); + + return b; + } + + public SocketChannel detachChannel (long sig) { + EventableSocketChannel ec = (EventableSocketChannel) Connections.get (sig); + if (ec != null) { + UnboundConnections.add (sig); + return ec.getChannel(); + } else { + return null; + } + } + + public void setNotifyReadable (long sig, boolean mode) { + ((EventableSocketChannel) Connections.get(sig)).setNotifyReadable(mode); + } + + public void setNotifyWritable (long sig, boolean mode) { + ((EventableSocketChannel) Connections.get(sig)).setNotifyWritable(mode); + } + + public boolean isNotifyReadable (long sig) { + return Connections.get(sig).isNotifyReadable(); + } + + public boolean isNotifyWritable (long sig) { + return Connections.get(sig).isNotifyWritable(); + } + + public boolean pauseConnection (long sig) { + return ((EventableSocketChannel) Connections.get(sig)).pause(); + } + + public boolean resumeConnection (long sig) { + return ((EventableSocketChannel) Connections.get(sig)).resume(); + } + + public boolean isConnectionPaused (long sig) { + return ((EventableSocketChannel) Connections.get(sig)).isPaused(); + } + + public long getOutboundDataSize (long sig) { + return Connections.get(sig).getOutboundDataSize(); + } + + public int getConnectionCount() { + return Connections.size() + Acceptors.size(); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EmReactorException.java b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EmReactorException.java new file mode 100644 index 000000000000..69efaa3ac497 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EmReactorException.java @@ -0,0 +1,40 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + +package com.rubyeventmachine; + +/** + * @author francis + * + */ +public class EmReactorException extends Exception { + static final long serialVersionUID = 0; + public EmReactorException (String msg) { + super (msg); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EventableChannel.java b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EventableChannel.java new file mode 100644 index 000000000000..3d4f5fd02264 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EventableChannel.java @@ -0,0 +1,72 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + + +package com.rubyeventmachine; + +import java.nio.ByteBuffer; +import java.io.IOException; +import java.nio.channels.ClosedChannelException; + +public interface EventableChannel { + + public void scheduleOutboundData (ByteBuffer bb); + + public void scheduleOutboundDatagram (ByteBuffer bb, String recipAddress, int recipPort); + + public boolean scheduleClose (boolean afterWriting); + + public void startTls(); + + public long getBinding(); + + public void readInboundData (ByteBuffer dst) throws IOException; + + public void register() throws ClosedChannelException; + + /** + * This is called by the reactor after it finishes running. + * The idea is to free network resources. + */ + public void close(); + + public boolean writeOutboundData() throws IOException; + + public long getOutboundDataSize(); + + public void setCommInactivityTimeout (long seconds); + + public Object[] getPeerName(); + public Object[] getSockName(); + + public boolean isWatchOnly(); + + public boolean isNotifyReadable(); + public boolean isNotifyWritable(); + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EventableDatagramChannel.java b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EventableDatagramChannel.java new file mode 100644 index 000000000000..df1c9fd26bb7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EventableDatagramChannel.java @@ -0,0 +1,201 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + + +package com.rubyeventmachine; + +import java.nio.ByteBuffer; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.DatagramChannel; +import java.util.LinkedList; +import java.io.*; +import java.net.*; + +public class EventableDatagramChannel implements EventableChannel { + + class Packet { + public ByteBuffer bb; + public SocketAddress recipient; + public Packet (ByteBuffer _bb, SocketAddress _recipient) { + bb = _bb; + recipient = _recipient; + } + } + + DatagramChannel channel; + long binding; + Selector selector; + boolean bCloseScheduled; + LinkedList<Packet> outboundQ; + long outboundS; + SocketAddress returnAddress; + + + public EventableDatagramChannel (DatagramChannel dc, long _binding, Selector sel) throws ClosedChannelException { + channel = dc; + binding = _binding; + selector = sel; + bCloseScheduled = false; + outboundQ = new LinkedList<Packet>(); + outboundS = 0; + + dc.register(selector, SelectionKey.OP_READ, this); + } + + public void scheduleOutboundData (ByteBuffer bb) { + try { + if ((!bCloseScheduled) && (bb.remaining() > 0)) { + outboundQ.addLast(new Packet(bb, returnAddress)); + outboundS += bb.remaining(); + channel.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ, this); + } + } catch (ClosedChannelException e) { + throw new RuntimeException ("no outbound data"); + } + } + + public void scheduleOutboundDatagram (ByteBuffer bb, String recipAddress, int recipPort) { + try { + if ((!bCloseScheduled) && (bb.remaining() > 0)) { + outboundQ.addLast(new Packet (bb, new InetSocketAddress (recipAddress, recipPort))); + outboundS += bb.remaining(); + channel.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ, this); + } + } catch (ClosedChannelException e) { + throw new RuntimeException ("no outbound data"); + } + } + + public boolean scheduleClose (boolean afterWriting) { + System.out.println ("NOT SCHEDULING CLOSE ON DATAGRAM"); + return false; + } + + public void startTls() { + throw new RuntimeException ("TLS is unimplemented on this Channel"); + } + + public long getBinding() { + return binding; + } + + public void register() throws ClosedChannelException { + // TODO + } + + /** + * Terminate with extreme prejudice. Don't assume there will be another pass through + * the reactor core. + */ + public void close() { + try { + channel.close(); + } catch (IOException e) { + } + } + + public void readInboundData (ByteBuffer dst) { + returnAddress = null; + try { + // If there is no datagram available (we're nonblocking after all), + // then channel.receive returns null. + returnAddress = channel.receive(dst); + } catch (IOException e) { + // probably a no-op. The caller will see the empty (or even partial) buffer + // and presumably do the right thing. + } + } + + public boolean writeOutboundData() { + while (!outboundQ.isEmpty()) { + Packet p = outboundQ.getFirst(); + int written = 0; + try { + // With a datagram socket, it's ok to send an empty buffer. + written = channel.send(p.bb, p.recipient); + outboundS -= written; + } + catch (IOException e) { + return false; + } + + /* Did we consume the whole outbound buffer? If yes, pop it off and + * keep looping. If no, the outbound network buffers are full, so break + * out of here. There's a flaw that affects outbound buffers that are intentionally + * empty. We can tell whether they got sent or not. So we assume they were. + * TODO: As implemented, this ALWAYS discards packets if they were at least + * partially written. This matches the behavior of the C++ EM. My judgment + * is that this is less surprising than fragmenting the data and sending multiple + * packets would be. I could be wrong, so this is subject to change. + */ + + if ((written > 0) || (p.bb.remaining() == 0)) + outboundQ.removeFirst(); + else + break; + } + + if (outboundQ.isEmpty()) { + try { + channel.register(selector, SelectionKey.OP_READ, this); + } catch (ClosedChannelException e) {} + } + + // ALWAYS drain the outbound queue before triggering a connection close. + // If anyone wants to close immediately, they're responsible for clearing + // the outbound queue. + return (bCloseScheduled && outboundQ.isEmpty()) ? false : true; + } + + public void setCommInactivityTimeout (long seconds) { + // TODO + System.out.println ("DATAGRAM: SET COMM INACTIVITY UNIMPLEMENTED " + seconds); + } + + public Object[] getPeerName () { + if (returnAddress != null) { + InetSocketAddress inetAddr = (InetSocketAddress) returnAddress; + return new Object[]{ inetAddr.getPort(), inetAddr.getHostName() }; + } else { + return null; + } + } + + public Object[] getSockName () { + DatagramSocket socket = channel.socket(); + return new Object[]{ socket.getLocalPort(), + socket.getLocalAddress().getHostAddress() }; + } + + public boolean isWatchOnly() { return false; } + public boolean isNotifyReadable() { return false; } + public boolean isNotifyWritable() { return false; } + public long getOutboundDataSize() { return outboundS; } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EventableSocketChannel.java b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EventableSocketChannel.java new file mode 100644 index 000000000000..2905ec6cfed5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/java/src/com/rubyeventmachine/EventableSocketChannel.java @@ -0,0 +1,415 @@ +/** + * $Id$ + * + * Author:: Francis Cianfrocca (gmail: blackhedd) + * Homepage:: http://rubyeventmachine.com + * Date:: 15 Jul 2007 + * + * See EventMachine and EventMachine::Connection for documentation and + * usage examples. + * + * + *---------------------------------------------------------------------------- + * + * Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. + * Gmail: blackhedd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of either: 1) the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version; or 2) Ruby's License. + * + * See the file COPYING for complete licensing information. + * + *--------------------------------------------------------------------------- + * + * + */ + +/** + * + */ +package com.rubyeventmachine; + +/** + * @author francis + * + */ + +import java.nio.channels.*; +import java.nio.*; +import java.util.*; +import java.io.*; +import java.net.Socket; +import javax.net.ssl.*; +import javax.net.ssl.SSLEngineResult.*; +import java.lang.reflect.Field; + +import java.security.*; + +public class EventableSocketChannel implements EventableChannel { + Selector selector; + SelectionKey channelKey; + SocketChannel channel; + + long binding; + LinkedList<ByteBuffer> outboundQ; + long outboundS; + + boolean bCloseScheduled; + boolean bConnectPending; + boolean bWatchOnly; + boolean bAttached; + boolean bNotifyReadable; + boolean bNotifyWritable; + boolean bPaused; + + SSLEngine sslEngine; + SSLContext sslContext; + + public EventableSocketChannel (SocketChannel sc, long _binding, Selector sel) { + channel = sc; + binding = _binding; + selector = sel; + bCloseScheduled = false; + bConnectPending = false; + bWatchOnly = false; + bAttached = false; + bNotifyReadable = false; + bNotifyWritable = false; + outboundQ = new LinkedList<ByteBuffer>(); + outboundS = 0; + } + + public long getBinding() { + return binding; + } + + public SocketChannel getChannel() { + return channel; + } + + public void register() throws ClosedChannelException { + if (channelKey == null) { + int events = currentEvents(); + channelKey = channel.register(selector, events, this); + } + } + + /** + * Terminate with extreme prejudice. Don't assume there will be another pass through + * the reactor core. + */ + public void close() { + if (channelKey != null) { + channelKey.cancel(); + channelKey = null; + } + + if (bAttached) { + // attached channels are copies, so reset the file descriptor to prevent java from close()ing it + Field f; + FileDescriptor fd; + + try { + /* do _NOT_ clobber fdVal here, it will break epoll/kqueue on jdk6! + * channelKey.cancel() above does not occur until the next call to select + * and if fdVal is gone, we will continue to get events for this fd. + * + * instead, remove fdVal in cleanup(), which is processed via DetachedConnections, + * after UnboundConnections but before NewConnections. + */ + + f = channel.getClass().getDeclaredField("fd"); + f.setAccessible(true); + fd = (FileDescriptor) f.get(channel); + + f = fd.getClass().getDeclaredField("fd"); + f.setAccessible(true); + f.set(fd, -1); + } catch (java.lang.NoSuchFieldException e) { + e.printStackTrace(); + } catch (java.lang.IllegalAccessException e) { + e.printStackTrace(); + } + + return; + } + + try { + channel.close(); + } catch (IOException e) { + } + } + + public void cleanup() { + if (bAttached) { + Field f; + try { + f = channel.getClass().getDeclaredField("fdVal"); + f.setAccessible(true); + f.set(channel, -1); + } catch (java.lang.NoSuchFieldException e) { + e.printStackTrace(); + } catch (java.lang.IllegalAccessException e) { + e.printStackTrace(); + } + } + + channel = null; + } + + public void scheduleOutboundData (ByteBuffer bb) { + if (!bCloseScheduled && bb.remaining() > 0) { + if (sslEngine != null) { + try { + ByteBuffer b = ByteBuffer.allocate(32*1024); // TODO, preallocate this buffer. + sslEngine.wrap(bb, b); + b.flip(); + outboundQ.addLast(b); + outboundS += b.remaining(); + } catch (SSLException e) { + throw new RuntimeException ("ssl error"); + } + } + else { + outboundQ.addLast(bb); + outboundS += bb.remaining(); + } + + updateEvents(); + } + } + + public void scheduleOutboundDatagram (ByteBuffer bb, String recipAddress, int recipPort) { + throw new RuntimeException ("datagram sends not supported on this channel"); + } + + /** + * Called by the reactor when we have selected readable. + */ + public void readInboundData (ByteBuffer bb) throws IOException { + if (channel.read(bb) == -1) + throw new IOException ("eof"); + } + + public long getOutboundDataSize() { return outboundS; } + + /** + * Called by the reactor when we have selected writable. + * Return false to indicate an error that should cause the connection to close. + * TODO, VERY IMPORTANT: we're here because we selected writable, but it's always + * possible to become unwritable between the poll and when we get here. The way + * this code is written, we're depending on a nonblocking write NOT TO CONSUME + * the whole outbound buffer in this case, rather than firing an exception. + * We should somehow verify that this is indeed Java's defined behavior. + * @return + */ + public boolean writeOutboundData() throws IOException { + ByteBuffer[] bufs = new ByteBuffer[64]; + int i; + long written, toWrite; + while (!outboundQ.isEmpty()) { + i = 0; + toWrite = 0; + written = 0; + while (i < 64 && !outboundQ.isEmpty()) { + bufs[i] = outboundQ.removeFirst(); + toWrite += bufs[i].remaining(); + i++; + } + if (toWrite > 0) + written = channel.write(bufs, 0, i); + + outboundS -= written; + // Did we consume the whole outbound buffer? If yes, + // pop it off and keep looping. If no, the outbound network + // buffers are full, so break out of here. + if (written < toWrite) { + while (i > 0 && bufs[i-1].remaining() > 0) { + outboundQ.addFirst(bufs[i-1]); + i--; + } + break; + } + } + + if (outboundQ.isEmpty() && !bCloseScheduled) { + updateEvents(); + } + + // ALWAYS drain the outbound queue before triggering a connection close. + // If anyone wants to close immediately, they're responsible for clearing + // the outbound queue. + return (bCloseScheduled && outboundQ.isEmpty()) ? false : true; + } + + public void setConnectPending() { + bConnectPending = true; + updateEvents(); + } + + /** + * Called by the reactor when we have selected connectable. + * Return false to indicate an error that should cause the connection to close. + */ + public boolean finishConnecting() throws IOException { + channel.finishConnect(); + + bConnectPending = false; + updateEvents(); + return true; + } + + public boolean scheduleClose (boolean afterWriting) { + // TODO: What the hell happens here if bConnectPending is set? + if (!afterWriting) { + outboundQ.clear(); + outboundS = 0; + } + + if (outboundQ.isEmpty()) + return true; + else { + updateEvents(); + bCloseScheduled = true; + return false; + } + } + + public void startTls() { + if (sslEngine == null) { + try { + sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, null, null); // TODO, fill in the parameters. + sslEngine = sslContext.createSSLEngine(); // TODO, should use the parameterized version, to get Kerb stuff and session re-use. + sslEngine.setUseClientMode(false); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException ("unable to start TLS"); // TODO, get rid of this. + } catch (KeyManagementException e) { + throw new RuntimeException ("unable to start TLS"); // TODO, get rid of this. + } + } + System.out.println ("Starting TLS"); + } + + public ByteBuffer dispatchInboundData (ByteBuffer bb) throws SSLException { + if (sslEngine != null) { + if (true) throw new RuntimeException ("TLS currently unimplemented"); + System.setProperty("javax.net.debug", "all"); + ByteBuffer w = ByteBuffer.allocate(32*1024); // TODO, WRONG, preallocate this buffer. + SSLEngineResult res = sslEngine.unwrap(bb, w); + if (res.getHandshakeStatus() == HandshakeStatus.NEED_TASK) { + Runnable r; + while ((r = sslEngine.getDelegatedTask()) != null) { + r.run(); + } + } + System.out.println (bb); + w.flip(); + return w; + } + else + return bb; + } + + public void setCommInactivityTimeout (long seconds) { + // TODO + System.out.println ("SOCKET: SET COMM INACTIVITY UNIMPLEMENTED " + seconds); + } + + public Object[] getPeerName () { + Socket sock = channel.socket(); + return new Object[]{ sock.getPort(), sock.getInetAddress().getHostAddress() }; + } + + public Object[] getSockName () { + Socket sock = channel.socket(); + return new Object[]{ sock.getLocalPort(), + sock.getLocalAddress().getHostAddress() }; + } + + public void setWatchOnly() { + bWatchOnly = true; + updateEvents(); + } + public boolean isWatchOnly() { return bWatchOnly; } + + public void setAttached() { + bAttached = true; + } + public boolean isAttached() { return bAttached; } + + public void setNotifyReadable (boolean mode) { + bNotifyReadable = mode; + updateEvents(); + } + public boolean isNotifyReadable() { return bNotifyReadable; } + + public void setNotifyWritable (boolean mode) { + bNotifyWritable = mode; + updateEvents(); + } + public boolean isNotifyWritable() { return bNotifyWritable; } + + public boolean pause() { + if (bWatchOnly) { + throw new RuntimeException ("cannot pause/resume 'watch only' connections, set notify readable/writable instead"); + } + boolean old = bPaused; + bPaused = true; + updateEvents(); + return !old; + } + + public boolean resume() { + if (bWatchOnly) { + throw new RuntimeException ("cannot pause/resume 'watch only' connections, set notify readable/writable instead"); + } + boolean old = bPaused; + bPaused = false; + updateEvents(); + return old; + } + + public boolean isPaused() { + return bPaused; + } + + private void updateEvents() { + if (channelKey == null) + return; + + int events = currentEvents(); + + if (channelKey.interestOps() != events) { + channelKey.interestOps(events); + } + } + + private int currentEvents() { + int events = 0; + + if (bWatchOnly) + { + if (bNotifyReadable) + events |= SelectionKey.OP_READ; + + if (bNotifyWritable) + events |= SelectionKey.OP_WRITE; + } + else if (!bPaused) + { + if (bConnectPending) + events |= SelectionKey.OP_CONNECT; + else { + events |= SelectionKey.OP_READ; + + if (!outboundQ.isEmpty()) + events |= SelectionKey.OP_WRITE; + } + } + + return events; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/buftok.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/buftok.rb new file mode 100644 index 000000000000..caf4f770567c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/buftok.rb @@ -0,0 +1,59 @@ +# BufferedTokenizer takes a delimiter upon instantiation, or acts line-based +# by default. It allows input to be spoon-fed from some outside source which +# receives arbitrary length datagrams which may-or-may-not contain the token +# by which entities are delimited. In this respect it's ideally paired with +# something like EventMachine (http://rubyeventmachine.com/). +class BufferedTokenizer + # New BufferedTokenizers will operate on lines delimited by a delimiter, + # which is by default the global input delimiter $/ ("\n"). + # + # The input buffer is stored as an array. This is by far the most efficient + # approach given language constraints (in C a linked list would be a more + # appropriate data structure). Segments of input data are stored in a list + # which is only joined when a token is reached, substantially reducing the + # number of objects required for the operation. + def initialize(delimiter = $/) + @delimiter = delimiter + @input = [] + @tail = '' + @trim = @delimiter.length - 1 + end + + # Extract takes an arbitrary string of input data and returns an array of + # tokenized entities, provided there were any available to extract. This + # makes for easy processing of datagrams using a pattern like: + # + # tokenizer.extract(data).map { |entity| Decode(entity) }.each do ... + # + # Using -1 makes split to return "" if the token is at the end of + # the string, meaning the last element is the start of the next chunk. + def extract(data) + if @trim > 0 + tail_end = @tail.slice!(-@trim, @trim) # returns nil if string is too short + data = tail_end + data if tail_end + end + + @input << @tail + entities = data.split(@delimiter, -1) + @tail = entities.shift + + unless entities.empty? + @input << @tail + entities.unshift @input.join + @input.clear + @tail = entities.pop + end + + entities + end + + # Flush the contents of the input buffer, i.e. return the input buffer even though + # a token has not yet been encountered + def flush + @input << @tail + buffer = @input.join + @input.clear + @tail = "" # @tail.clear is slightly faster, but not supported on 1.8.7 + buffer + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/callback.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/callback.rb new file mode 100644 index 000000000000..4928febc82b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/callback.rb @@ -0,0 +1,58 @@ +module EventMachine + # Utility method for coercing arguments to an object that responds to :call. + # Accepts an object and a method name to send to, or a block, or an object + # that responds to :call. + # + # @example EventMachine.Callback used with a block. Returns that block. + # + # cb = EventMachine.Callback do |msg| + # puts(msg) + # end + # # returned object is a callable + # cb.call('hello world') + # + # + # @example EventMachine.Callback used with an object (to be more specific, class object) and a method name, returns an object that responds to #call + # + # cb = EventMachine.Callback(Object, :puts) + # # returned object is a callable that delegates to Kernel#puts (in this case Object.puts) + # cb.call('hello world') + # + # + # @example EventMachine.Callback used with an object that responds to #call. Returns the argument. + # + # cb = EventMachine.Callback(proc{ |msg| puts(msg) }) + # # returned object is a callable + # cb.call('hello world') + # + # + # @overload Callback(object, method) + # Wraps `method` invocation on `object` into an object that responds to #call that proxies all the arguments to that method + # @param [Object] Object to invoke method on + # @param [Symbol] Method name + # @return [<#call>] An object that responds to #call that takes any number of arguments and invokes method on object with those arguments + # + # @overload Callback(object) + # Returns callable object as is, without any coercion + # @param [<#call>] An object that responds to #call + # @return [<#call>] Its argument + # + # @overload Callback(&block) + # Returns block passed to it without any coercion + # @return [<#call>] Block passed to this method + # + # @raise [ArgumentError] When argument doesn't respond to #call, method name is missing or when invoked without arguments and block isn't given + # + # @return [<#call>] + def self.Callback(object = nil, method = nil, &blk) + if object && method + lambda { |*args| object.__send__ method, *args } + else + if object.respond_to? :call + object + else + blk || raise(ArgumentError) + end # if + end # if + end # self.Callback +end # EventMachine diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/channel.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/channel.rb new file mode 100644 index 000000000000..a919adff43a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/channel.rb @@ -0,0 +1,69 @@ +module EventMachine + # Provides a simple thread-safe way to transfer data between (typically) long running + # tasks in {EventMachine.defer} and event loop thread. + # + # @example + # + # channel = EventMachine::Channel.new + # sid = channel.subscribe { |msg| p [:got, msg] } + # + # channel.push('hello world') + # channel.unsubscribe(sid) + # + # + class Channel + def initialize + @subs = {} + @uid = 0 + end + + # Return the number of current subscribers. + def num_subscribers + return @subs.size + end + + # Takes any arguments suitable for EM::Callback() and returns a subscriber + # id for use when unsubscribing. + # + # @return [Integer] Subscribe identifier + # @see #unsubscribe + def subscribe(*a, &b) + name = gen_id + EM.schedule { @subs[name] = EM::Callback(*a, &b) } + + name + end + + # Removes subscriber from the list. + # + # @param [Integer] Subscriber identifier + # @see #subscribe + def unsubscribe(name) + EM.schedule { @subs.delete name } + end + + # Add items to the channel, which are pushed out to all subscribers. + def push(*items) + items = items.dup + EM.schedule { items.each { |i| @subs.values.each { |s| s.call i } } } + end + alias << push + + # Fetches one message from the channel. + def pop(*a, &b) + EM.schedule { + name = subscribe do |*args| + unsubscribe(name) + EM::Callback(*a, &b).call(*args) + end + } + end + + private + + # @private + def gen_id + @uid += 1 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/completion.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/completion.rb new file mode 100644 index 000000000000..926535fd296c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/completion.rb @@ -0,0 +1,304 @@ +# = EM::Completion +# +# A completion is a callback container for various states of completion. In +# its most basic form it has a start state and a finish state. +# +# This implementation includes some hold-back from the EM::Deferrable +# interface in order to be compatible - but it has a much cleaner +# implementation. +# +# In general it is preferred that this implementation be used as a state +# callback container than EM::DefaultDeferrable or other classes including +# EM::Deferrable. This is because it is generally more sane to keep this level +# of state in a dedicated state-back container. This generally leads to more +# malleable interfaces and software designs, as well as eradicating nasty bugs +# that result from abstraction leakage. +# +# == Basic Usage +# +# As already mentioned, the basic usage of a Completion is simply for its two +# final states, :succeeded and :failed. +# +# An asynchronous operation will complete at some future point in time, and +# users often want to react to this event. API authors will want to expose +# some common interface to react to these events. +# +# In the following example, the user wants to know when a short lived +# connection has completed its exchange with the remote server. The simple +# protocol just waits for an ack to its message. +# +# class Protocol < EM::Connection +# include EM::P::LineText2 +# +# def initialize(message, completion) +# @message, @completion = message, completion +# @completion.completion { close_connection } +# @completion.timeout(1, :timeout) +# end +# +# def post_init +# send_data(@message) +# end +# +# def receive_line(line) +# case line +# when /ACK/i +# @completion.succeed line +# when /ERR/i +# @completion.fail :error, line +# else +# @completion.fail :unknown, line +# end +# end +# +# def unbind +# @completion.fail :disconnected unless @completion.completed? +# end +# end +# +# class API +# attr_reader :host, :port +# +# def initialize(host = 'example.org', port = 8000) +# @host, @port = host, port +# end +# +# def request(message) +# completion = EM::Deferrable::Completion.new +# EM.connect(host, port, Protocol, message, completion) +# completion +# end +# end +# +# api = API.new +# completion = api.request('stuff') +# completion.callback do |line| +# puts "API responded with: #{line}" +# end +# completion.errback do |type, line| +# case type +# when :error +# puts "API error: #{line}" +# when :unknown +# puts "API returned unknown response: #{line}" +# when :disconnected +# puts "API server disconnected prematurely" +# when :timeout +# puts "API server did not respond in a timely fashion" +# end +# end +# +# == Advanced Usage +# +# This completion implementation also supports more state callbacks and +# arbitrary states (unlike the original Deferrable API). This allows for basic +# stateful process encapsulation. One might use this to setup state callbacks +# for various states in an exchange like in the basic usage example, except +# where the applicaiton could be made to react to "connected" and +# "disconnected" states additionally. +# +# class Protocol < EM::Connection +# def initialize(completion) +# @response = [] +# @completion = completion +# @completion.stateback(:disconnected) do +# @completion.succeed @response.join +# end +# end +# +# def connection_completed +# @host, @port = Socket.unpack_sockaddr_in get_peername +# @completion.change_state(:connected, @host, @port) +# send_data("GET http://example.org/ HTTP/1.0\r\n\r\n") +# end +# +# def receive_data(data) +# @response << data +# end +# +# def unbind +# @completion.change_state(:disconnected, @host, @port) +# end +# end +# +# completion = EM::Deferrable::Completion.new +# completion.stateback(:connected) do |host, port| +# puts "Connected to #{host}:#{port}" +# end +# completion.stateback(:disconnected) do |host, port| +# puts "Disconnected from #{host}:#{port}" +# end +# completion.callback do |response| +# puts response +# end +# +# EM.connect('example.org', 80, Protocol, completion) +# +# == Timeout +# +# The Completion also has a timeout. The timeout is global and is not aware of +# states apart from completion states. The timeout is only engaged if #timeout +# is called, and it will call fail if it is reached. +# +# == Completion states +# +# By default there are two completion states, :succeeded and :failed. These +# states can be modified by subclassing and overrding the #completion_states +# method. Completion states are special, in that callbacks for all completion +# states are explcitly cleared when a completion state is entered. This +# prevents errors that could arise from accidental unterminated timeouts, and +# other such user errors. +# +# == Other notes +# +# Several APIs have been carried over from EM::Deferrable for compatibility +# reasons during a transitionary period. Specifically cancel_errback and +# cancel_callback are implemented, but their usage is to be strongly +# discouraged. Due to the already complex nature of reaction systems, dynamic +# callback deletion only makes the problem much worse. It is always better to +# add correct conditionals to the callback code, or use more states, than to +# address such implementaiton issues with conditional callbacks. + +module EventMachine + + class Completion + # This is totally not used (re-implemented), it's here in case people check + # for kind_of? + include EventMachine::Deferrable + + attr_reader :state, :value + + def initialize + @state = :unknown + @callbacks = Hash.new { |h,k| h[k] = [] } + @value = [] + @timeout_timer = nil + end + + # Enter the :succeeded state, setting the result value if given. + def succeed(*args) + change_state(:succeeded, *args) + end + # The old EM method: + alias set_deferred_success succeed + + # Enter the :failed state, setting the result value if given. + def fail(*args) + change_state(:failed, *args) + end + # The old EM method: + alias set_deferred_failure fail + + # Statebacks are called when you enter (or are in) the named state. + def stateback(state, *a, &b) + # The following is quite unfortunate special casing for :completed + # statebacks, but it's a necessary evil for latent completion + # definitions. + + if :completed == state || !completed? || @state == state + @callbacks[state] << EM::Callback(*a, &b) + end + execute_callbacks + self + end + + # Callbacks are called when you enter (or are in) a :succeeded state. + def callback(*a, &b) + stateback(:succeeded, *a, &b) + end + + # Errbacks are called when you enter (or are in) a :failed state. + def errback(*a, &b) + stateback(:failed, *a, &b) + end + + # Completions are called when you enter (or are in) either a :failed or a + # :succeeded state. They are stored as a special (reserved) state called + # :completed. + def completion(*a, &b) + stateback(:completed, *a, &b) + end + + # Enter a new state, setting the result value if given. If the state is one + # of :succeeded or :failed, then :completed callbacks will also be called. + def change_state(state, *args) + @value = args + @state = state + + EM.schedule { execute_callbacks } + end + + # The old EM method: + alias set_deferred_status change_state + + # Indicates that we've reached some kind of completion state, by default + # this is :succeeded or :failed. Due to these semantics, the :completed + # state is reserved for internal use. + def completed? + completion_states.any? { |s| state == s } + end + + # Completion states simply returns a list of completion states, by default + # this is :succeeded and :failed. + def completion_states + [:succeeded, :failed] + end + + # Schedule a time which if passes before we enter a completion state, this + # deferrable will be failed with the given arguments. + def timeout(time, *args) + cancel_timeout + @timeout_timer = EM::Timer.new(time) do + fail(*args) unless completed? + end + end + + # Disable the timeout + def cancel_timeout + if @timeout_timer + @timeout_timer.cancel + @timeout_timer = nil + end + end + + # Remove an errback. N.B. Some errbacks cannot be deleted. Usage is NOT + # recommended, this is an anti-pattern. + def cancel_errback(*a, &b) + @callbacks[:failed].delete(EM::Callback(*a, &b)) + end + + # Remove a callback. N.B. Some callbacks cannot be deleted. Usage is NOT + # recommended, this is an anti-pattern. + def cancel_callback(*a, &b) + @callbacks[:succeeded].delete(EM::Callback(*a, &b)) + end + + private + # Execute all callbacks for the current state. If in a completed state, then + # call any statebacks associated with the completed state. + def execute_callbacks + execute_state_callbacks(state) + if completed? + execute_state_callbacks(:completed) + clear_dead_callbacks + cancel_timeout + end + end + + # Iterate all callbacks for a given state, and remove then call them. + def execute_state_callbacks(state) + while callback = @callbacks[state].shift + callback.call(*value) + end + end + + # If we enter a completion state, clear other completion states after all + # callback chains are completed. This means that operation specific + # callbacks can't be dual-called, which is most common user error. + def clear_dead_callbacks + completion_states.each do |state| + @callbacks[state].clear + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/connection.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/connection.rb new file mode 100644 index 000000000000..267aec2d0fc4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/connection.rb @@ -0,0 +1,770 @@ +module EventMachine + class FileNotFoundException < Exception + end + + # EventMachine::Connection is a class that is instantiated + # by EventMachine's processing loop whenever a new connection + # is created. (New connections can be either initiated locally + # to a remote server or accepted locally from a remote client.) + # When a Connection object is instantiated, it <i>mixes in</i> + # the functionality contained in the user-defined module + # specified in calls to {EventMachine.connect} or {EventMachine.start_server}. + # User-defined handler modules may redefine any or all of the standard + # methods defined here, as well as add arbitrary additional code + # that will also be mixed in. + # + # EventMachine manages one object inherited from EventMachine::Connection + # (and containing the mixed-in user code) for every network connection + # that is active at any given time. + # The event loop will automatically call methods on EventMachine::Connection + # objects whenever specific events occur on the corresponding connections, + # as described below. + # + # This class is never instantiated by user code, and does not publish an + # initialize method. The instance methods of EventMachine::Connection + # which may be called by the event loop are: + # + # * {#post_init} + # * {#connection_completed} + # * {#receive_data} + # * {#unbind} + # * {#ssl_verify_peer} (if TLS is used) + # * {#ssl_handshake_completed} + # + # All of the other instance methods defined here are called only by user code. + # + # @see file:docs/GettingStarted.md EventMachine tutorial + class Connection + # @private + attr_accessor :signature + + # @private + alias original_method method + + # Override .new so subclasses don't have to call super and can ignore + # connection-specific arguments + # + # @private + def self.new(sig, *args) + allocate.instance_eval do + # Store signature + @signature = sig + # associate_callback_target sig + + # Call a superclass's #initialize if it has one + initialize(*args) + + # post initialize callback + post_init + + self + end + end + + # Stubbed initialize so legacy superclasses can safely call super + # + # @private + def initialize(*args) + end + + # Called by the event loop immediately after the network connection has been established, + # and before resumption of the network loop. + # This method is generally not called by user code, but is called automatically + # by the event loop. The base-class implementation is a no-op. + # This is a very good place to initialize instance variables that will + # be used throughout the lifetime of the network connection. + # + # @see #connection_completed + # @see #unbind + # @see #send_data + # @see #receive_data + def post_init + end + + # Called by the event loop whenever data has been received by the network connection. + # It is never called by user code. {#receive_data} is called with a single parameter, a String containing + # the network protocol data, which may of course be binary. You will + # generally redefine this method to perform your own processing of the incoming data. + # + # Here's a key point which is essential to understanding the event-driven + # programming model: <i>EventMachine knows absolutely nothing about the protocol + # which your code implements.</i> You must not make any assumptions about + # the size of the incoming data packets, or about their alignment on any + # particular intra-message or PDU boundaries (such as line breaks). + # receive_data can and will send you arbitrary chunks of data, with the + # only guarantee being that the data is presented to your code in the order + # it was collected from the network. Don't even assume that the chunks of + # data will correspond to network packets, as EventMachine can and will coalesce + # several incoming packets into one, to improve performance. The implication for your + # code is that you generally will need to implement some kind of a state machine + # in your redefined implementation of receive_data. For a better understanding + # of this, read through the examples of specific protocol handlers in EventMachine::Protocols + # + # The base-class implementation (which will be invoked only if you didn't override it in your protocol handler) + # simply prints incoming data packet size to stdout. + # + # @param [String] data Opaque incoming data. + # @note Depending on the protocol, buffer sizes and OS networking stack configuration, incoming data may or may not be "a complete message". + # It is up to this handler to detect content boundaries to determine whether all the content (for example, full HTTP request) + # has been received and can be processed. + # + # @see #post_init + # @see #connection_completed + # @see #unbind + # @see #send_data + # @see file:docs/GettingStarted.md EventMachine tutorial + def receive_data data + puts "............>>>#{data.length}" + end + + # Called by EventMachine when the SSL/TLS handshake has + # been completed, as a result of calling #start_tls to initiate SSL/TLS on the connection. + # + # This callback exists because {#post_init} and {#connection_completed} are **not** reliable + # for indicating when an SSL/TLS connection is ready to have its certificate queried for. + # + # @see #get_peer_cert + def ssl_handshake_completed + end + + # Called by EventMachine when :verify_peer => true has been passed to {#start_tls}. + # It will be called with each certificate in the certificate chain provided by the remote peer. + # + # The cert will be passed as a String in PEM format, the same as in {#get_peer_cert}. It is up to user defined + # code to perform a check on the certificates. The return value from this callback is used to accept or deny the peer. + # A return value that is not nil or false triggers acceptance. If the peer is not accepted, the connection + # will be subsequently closed. + # + # @example This server always accepts all peers + # + # module AcceptServer + # def post_init + # start_tls(:verify_peer => true) + # end + # + # def ssl_verify_peer(cert) + # true + # end + # + # def ssl_handshake_completed + # $server_handshake_completed = true + # end + # end + # + # + # @example This server never accepts any peers + # + # module DenyServer + # def post_init + # start_tls(:verify_peer => true) + # end + # + # def ssl_verify_peer(cert) + # # Do not accept the peer. This should now cause the connection to shut down + # # without the SSL handshake being completed. + # false + # end + # + # def ssl_handshake_completed + # $server_handshake_completed = true + # end + # end + # + # @see #start_tls + def ssl_verify_peer(cert) + end + + # called by the framework whenever a connection (either a server or client connection) is closed. + # The close can occur because your code intentionally closes it (using {#close_connection} and {#close_connection_after_writing}), + # because the remote peer closed the connection, or because of a network error. + # You may not assume that the network connection is still open and able to send or + # receive data when the callback to unbind is made. This is intended only to give + # you a chance to clean up associations your code may have made to the connection + # object while it was open. + # + # If you want to detect which peer has closed the connection, you can override {#close_connection} in your protocol handler + # and set an @ivar. + # + # @example Overriding Connection#close_connection to distinguish connections closed on our side + # + # class MyProtocolHandler < EventMachine::Connection + # + # # ... + # + # def close_connection(*args) + # @intentionally_closed_connection = true + # super(*args) + # end + # + # def unbind + # if @intentionally_closed_connection + # # ... + # end + # end + # + # # ... + # + # end + # + # @see #post_init + # @see #connection_completed + # @see file:docs/GettingStarted.md EventMachine tutorial + def unbind + end + + # Called by the reactor after attempting to relay incoming data to a descriptor (set as a proxy target descriptor with + # {EventMachine.enable_proxy}) that has already been closed. + # + # @see EventMachine.enable_proxy + def proxy_target_unbound + end + + # called when the reactor finished proxying all + # of the requested bytes. + def proxy_completed + end + + # EventMachine::Connection#proxy_incoming_to is called only by user code. It sets up + # a low-level proxy relay for all data inbound for this connection, to the connection given + # as the argument. This is essentially just a helper method for enable_proxy. + # + # @see EventMachine.enable_proxy + def proxy_incoming_to(conn,bufsize=0) + EventMachine::enable_proxy(self, conn, bufsize) + end + + # A helper method for {EventMachine.disable_proxy} + def stop_proxying + EventMachine::disable_proxy(self) + end + + # The number of bytes proxied to another connection. Reset to zero when + # EventMachine::Connection#proxy_incoming_to is called, and incremented whenever data is proxied. + def get_proxied_bytes + EventMachine::get_proxied_bytes(@signature) + end + + # EventMachine::Connection#close_connection is called only by user code, and never + # by the event loop. You may call this method against a connection object in any + # callback handler, whether or not the callback was made against the connection + # you want to close. close_connection <i>schedules</i> the connection to be closed + # at the next available opportunity within the event loop. You may not assume that + # the connection is closed when close_connection returns. In particular, the framework + # will callback the unbind method for the particular connection at a point shortly + # after you call close_connection. You may assume that the unbind callback will + # take place sometime after your call to close_connection completes. In other words, + # the unbind callback will not re-enter your code "inside" of your call to close_connection. + # However, it's not guaranteed that a future version of EventMachine will not change + # this behavior. + # + # {#close_connection} will *silently discard* any outbound data which you have + # sent to the connection using {EventMachine::Connection#send_data} but which has not + # yet been sent across the network. If you want to avoid this behavior, use + # {EventMachine::Connection#close_connection_after_writing}. + # + def close_connection after_writing = false + EventMachine::close_connection @signature, after_writing + end + + # Removes given connection from the event loop. + # The connection's socket remains open and its file descriptor number is returned. + def detach + EventMachine::detach_fd @signature + end + + def get_sock_opt level, option + EventMachine::get_sock_opt @signature, level, option + end + + def set_sock_opt level, optname, optval + EventMachine::set_sock_opt @signature, level, optname, optval + end + + # A variant of {#close_connection}. + # All of the descriptive comments given for close_connection also apply to + # close_connection_after_writing, *with one exception*: if the connection has + # outbound data sent using send_dat but which has not yet been sent across the network, + # close_connection_after_writing will schedule the connection to be closed *after* + # all of the outbound data has been safely written to the remote peer. + # + # Depending on the amount of outgoing data and the speed of the network, + # considerable time may elapse between your call to close_connection_after_writing + # and the actual closing of the socket (at which time the unbind callback will be called + # by the event loop). During this time, you *may not* call send_data to transmit + # additional data (that is, the connection is closed for further writes). In very + # rare cases, you may experience a receive_data callback after your call to {#close_connection_after_writing}, + # depending on whether incoming data was in the process of being received on the connection + # at the moment when you called {#close_connection_after_writing}. Your protocol handler must + # be prepared to properly deal with such data (probably by ignoring it). + # + # @see #close_connection + # @see #send_data + def close_connection_after_writing + close_connection true + end + + # Call this method to send data to the remote end of the network connection. It takes a single String argument, + # which may contain binary data. Data is buffered to be sent at the end of this event loop tick (cycle). + # + # When used in a method that is event handler (for example, {#post_init} or {#connection_completed}, it will send + # data to the other end of the connection that generated the event. + # You can also call {#send_data} to write to other connections. For more information see The Chat Server Example in the + # {file:docs/GettingStarted.md EventMachine tutorial}. + # + # If you want to send some data and then immediately close the connection, make sure to use {#close_connection_after_writing} + # instead of {#close_connection}. + # + # + # @param [String] data Data to send asynchronously + # + # @see file:docs/GettingStarted.md EventMachine tutorial + # @see Connection#receive_data + # @see Connection#post_init + # @see Connection#unbind + def send_data data + data = data.to_s + size = data.bytesize if data.respond_to?(:bytesize) + size ||= data.size + EventMachine::send_data @signature, data, size + end + + # Returns true if the connection is in an error state, false otherwise. + # + # In general, you can detect the occurrence of communication errors or unexpected + # disconnection by the remote peer by handing the {#unbind} method. In some cases, however, + # it's useful to check the status of the connection using {#error?} before attempting to send data. + # This function is synchronous but it will return immediately without blocking. + # + # @return [Boolean] true if the connection is in an error state, false otherwise + def error? + errno = EventMachine::report_connection_error_status(@signature) + case errno + when 0 + false + when -1 + true + else + EventMachine::ERRNOS[errno] + end + end + + # Called by the event loop when a remote TCP connection attempt completes successfully. + # You can expect to get this notification after calls to {EventMachine.connect}. Remember that EventMachine makes remote connections + # asynchronously, just as with any other kind of network event. This method + # is intended primarily to assist with network diagnostics. For normal protocol + # handling, use #post_init to perform initial work on a new connection (such as sending initial set of data). + # {Connection#post_init} will always be called. This method will only be called in case of a successful completion. + # A connection attempt which fails will result a call to {Connection#unbind} after the failure. + # + # @see Connection#post_init + # @see Connection#unbind + # @see file:docs/GettingStarted.md EventMachine tutorial + def connection_completed + end + + # Call {#start_tls} at any point to initiate TLS encryption on connected streams. + # The method is smart enough to know whether it should perform a server-side + # or a client-side handshake. An appropriate place to call {#start_tls} is in + # your redefined {#post_init} method, or in the {#connection_completed} handler for + # an outbound connection. + # + # + # @option args [String] :cert_chain_file (nil) local path of a readable file that contants a chain of X509 certificates in + # the [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail), + # with the most-resolved certificate at the top of the file, successive intermediate + # certs in the middle, and the root (or CA) cert at the bottom. + # + # @option args [String] :private_key_file (nil) local path of a readable file that must contain a private key in the [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail). + # + # @option args [Boolean] :verify_peer (false) indicates whether a server should request a certificate from a peer, to be verified by user code. + # If true, the {#ssl_verify_peer} callback on the {EventMachine::Connection} object is called with each certificate + # in the certificate chain provided by the peer. See documentation on {#ssl_verify_peer} for how to use this. + # + # @option args [Boolean] :fail_if_no_peer_cert (false) Used in conjunction with verify_peer. If set the SSL handshake will be terminated if the peer does not provide a certificate. + # + # + # @option args [String] :cipher_list ("ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH") indicates the available SSL cipher values. Default value is "ALL:!ADH:!LOW:!EXP:!DES-CBC3-SHA:@STRENGTH". Check the format of the OpenSSL cipher string at http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT. + # + # @option args [String] :ecdh_curve (nil) The curve for ECDHE ciphers. See available ciphers with 'openssl ecparam -list_curves' + # + # @option args [String] :dhparam (nil) The local path of a file containing DH parameters for EDH ciphers in [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail) See: 'openssl dhparam' + # + # @option args [Array] :ssl_version (TLSv1 TLSv1_1 TLSv1_2) indicates the allowed SSL/TLS versions. Possible values are: {SSLv2}, {SSLv3}, {TLSv1}, {TLSv1_1}, {TLSv1_2}. + # + # @example Using TLS with EventMachine + # + # require 'rubygems' + # require 'eventmachine' + # + # module Handler + # def post_init + # start_tls(:private_key_file => '/tmp/server.key', :cert_chain_file => '/tmp/server.crt', :verify_peer => false) + # end + # end + # + # EventMachine.run do + # EventMachine.start_server("127.0.0.1", 9999, Handler) + # end + # + # @param [Hash] args + # + # @todo support passing an encryption parameter, which can be string or Proc, to get a passphrase + # for encrypted private keys. + # @todo support passing key material via raw strings or Procs that return strings instead of + # just filenames. + # + # @see #ssl_verify_peer + def start_tls args={} + priv_key = args[:private_key_file] + cert_chain = args[:cert_chain_file] + verify_peer = args[:verify_peer] + sni_hostname = args[:sni_hostname] + cipher_list = args[:cipher_list] + ssl_version = args[:ssl_version] + ecdh_curve = args[:ecdh_curve] + dhparam = args[:dhparam] + fail_if_no_peer_cert = args[:fail_if_no_peer_cert] + + [priv_key, cert_chain].each do |file| + next if file.nil? or file.empty? + raise FileNotFoundException, + "Could not find #{file} for start_tls" unless File.exist? file + end + + protocols_bitmask = 0 + if ssl_version.nil? + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1 + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1_1 + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1_2 + else + [ssl_version].flatten.each do |p| + case p.to_s.downcase + when 'sslv2' + protocols_bitmask |= EventMachine::EM_PROTO_SSLv2 + when 'sslv3' + protocols_bitmask |= EventMachine::EM_PROTO_SSLv3 + when 'tlsv1' + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1 + when 'tlsv1_1' + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1_1 + when 'tlsv1_2' + protocols_bitmask |= EventMachine::EM_PROTO_TLSv1_2 + else + raise("Unrecognized SSL/TLS Protocol: #{p}") + end + end + end + + EventMachine::set_tls_parms(@signature, priv_key || '', cert_chain || '', verify_peer, fail_if_no_peer_cert, sni_hostname || '', cipher_list || '', ecdh_curve || '', dhparam || '', protocols_bitmask) + EventMachine::start_tls @signature + end + + # If [TLS](http://en.wikipedia.org/wiki/Transport_Layer_Security) is active on the connection, returns the remote [X509 certificate](http://en.wikipedia.org/wiki/X.509) + # as a string, in the popular [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail). This can then be used for arbitrary validation + # of a peer's certificate in your code. + # + # This should be called in/after the {#ssl_handshake_completed} callback, which indicates + # that SSL/TLS is active. Using this callback is important, because the certificate may not + # be available until the time it is executed. Using #post_init or #connection_completed is + # not adequate, because the SSL handshake may still be taking place. + # + # This method will return `nil` if: + # + # * EventMachine is not built with [OpenSSL](http://www.openssl.org) support + # * [TLS](http://en.wikipedia.org/wiki/Transport_Layer_Security) is not active on the connection + # * TLS handshake is not yet complete + # * Remote peer for any other reason has not presented a certificate + # + # + # @example Getting peer TLS certificate information in EventMachine + # + # module Handler + # def post_init + # puts "Starting TLS" + # start_tls + # end + # + # def ssl_handshake_completed + # puts get_peer_cert + # close_connection + # end + # + # def unbind + # EventMachine::stop_event_loop + # end + # end + # + # EventMachine.run do + # EventMachine.connect "mail.google.com", 443, Handler + # end + # + # # Will output: + # # -----BEGIN CERTIFICATE----- + # # MIIDIjCCAougAwIBAgIQbldpChBPqv+BdPg4iwgN8TANBgkqhkiG9w0BAQUFADBM + # # MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg + # # THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wODA1MDIxNjMyNTRaFw0w + # # OTA1MDIxNjMyNTRaMGkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh + # # MRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRgw + # # FgYDVQQDEw9tYWlsLmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ + # # AoGBALlkxdh2QXegdElukCSOV2+8PKiONIS+8Tu9K7MQsYpqtLNC860zwOPQ2NLI + # # 3Zp4jwuXVTrtzGuiqf5Jioh35Ig3CqDXtLyZoypjZUQcq4mlLzHlhIQ4EhSjDmA7 + # # Ffw9y3ckSOQgdBQWNLbquHh9AbEUjmhkrYxIqKXeCnRKhv6nAgMBAAGjgecwgeQw + # # KAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUFBwMCBglghkgBhvhCBAEwNgYDVR0f + # # BC8wLTAroCmgJ4YlaHR0cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVNHQ0NBLmNy + # # bDByBggrBgEFBQcBAQRmMGQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnRoYXd0 + # # ZS5jb20wPgYIKwYBBQUHMAKGMmh0dHA6Ly93d3cudGhhd3RlLmNvbS9yZXBvc2l0 + # # b3J5L1RoYXd0ZV9TR0NfQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEF + # # BQADgYEAsRwpLg1dgCR1gYDK185MFGukXMeQFUvhGqF8eT/CjpdvezyKVuz84gSu + # # 6ccMXgcPQZGQN/F4Xug+Q01eccJjRSVfdvR5qwpqCj+6BFl5oiKDBsveSkrmL5dz + # # s2bn7TdTSYKcLeBkjXxDLHGBqLJ6TNCJ3c4/cbbG5JhGvoema94= + # # -----END CERTIFICATE----- + # + # You can do whatever you want with the certificate String, such as load it + # as a certificate object using the OpenSSL library, and check its fields. + # + # @return [String] the remote [X509 certificate](http://en.wikipedia.org/wiki/X.509), in the popular [PEM format](http://en.wikipedia.org/wiki/Privacy_Enhanced_Mail), + # if TLS is active on the connection + # + # @see Connection#start_tls + # @see Connection#ssl_handshake_completed + def get_peer_cert + EventMachine::get_peer_cert @signature + end + + def get_cipher_bits + EventMachine::get_cipher_bits @signature + end + + def get_cipher_name + EventMachine::get_cipher_name @signature + end + + def get_cipher_protocol + EventMachine::get_cipher_protocol @signature + end + + def get_sni_hostname + EventMachine::get_sni_hostname @signature + end + + # Sends UDP messages. + # + # This method may be called from any Connection object that refers + # to an open datagram socket (see EventMachine#open_datagram_socket). + # The method sends a UDP (datagram) packet containing the data you specify, + # to a remote peer specified by the IP address and port that you give + # as parameters to the method. + # Observe that you may send a zero-length packet (empty string). + # However, you may not send an arbitrarily-large data packet because + # your operating system will enforce a platform-specific limit on + # the size of the outbound packet. (Your kernel + # will respond in a platform-specific way if you send an overlarge + # packet: some will send a truncated packet, some will complain, and + # some will silently drop your request). + # On LANs, it's usually OK to send datagrams up to about 4000 bytes in length, + # but to be really safe, send messages smaller than the Ethernet-packet + # size (typically about 1400 bytes). Some very restrictive WANs + # will either drop or truncate packets larger than about 500 bytes. + # + # @param [String] data Data to send asynchronously + # @param [String] recipient_address IP address of the recipient + # @param [String] recipient_port Port of the recipient + def send_datagram data, recipient_address, recipient_port + data = data.to_s + size = data.bytesize if data.respond_to?(:bytesize) + size ||= data.size + EventMachine::send_datagram @signature, data, size, recipient_address, Integer(recipient_port) + end + + + # This method is used with stream-connections to obtain the identity + # of the remotely-connected peer. If a peername is available, this method + # returns a sockaddr structure. The method returns nil if no peername is available. + # You can use Socket.unpack_sockaddr_in and its variants to obtain the + # values contained in the peername structure returned from #get_peername. + # + # @example How to get peer IP address and port with EventMachine + # + # require 'socket' + # + # module Handler + # def receive_data data + # port, ip = Socket.unpack_sockaddr_in(get_peername) + # puts "got #{data.inspect} from #{ip}:#{port}" + # end + # end + def get_peername + EventMachine::get_peername @signature + end + + # Used with stream-connections to obtain the identity + # of the local side of the connection. If a local name is available, this method + # returns a sockaddr structure. The method returns nil if no local name is available. + # You can use {Socket.unpack_sockaddr_in} and its variants to obtain the + # values contained in the local-name structure returned from this method. + # + # @example + # + # require 'socket' + # + # module Handler + # def receive_data data + # port, ip = Socket.unpack_sockaddr_in(get_sockname) + # puts "got #{data.inspect}" + # end + # end + def get_sockname + EventMachine::get_sockname @signature + end + + # Returns the PID (kernel process identifier) of a subprocess + # associated with this Connection object. For use with {EventMachine.popen} + # and similar methods. Returns nil when there is no meaningful subprocess. + # + # @return [Integer] + def get_pid + EventMachine::get_subprocess_pid @signature + end + + # Returns a subprocess exit status. Only useful for {EventMachine.popen}. Call it in your + # {#unbind} handler. + # + # @return [Integer] + def get_status + EventMachine::get_subprocess_status @signature + end + + # The number of seconds since the last send/receive activity on this connection. + def get_idle_time + EventMachine::get_idle_time @signature + end + + # comm_inactivity_timeout returns the current value (float in seconds) of the inactivity-timeout + # property of network-connection and datagram-socket objects. A nonzero value + # indicates that the connection or socket will automatically be closed if no read or write + # activity takes place for at least that number of seconds. + # A zero value (the default) specifies that no automatic timeout will take place. + def comm_inactivity_timeout + EventMachine::get_comm_inactivity_timeout @signature + end + + # Allows you to set the inactivity-timeout property for + # a network connection or datagram socket. Specify a non-negative float value in seconds. + # If the value is greater than zero, the connection or socket will automatically be closed + # if no read or write activity takes place for at least that number of seconds. + # Specify a value of zero to indicate that no automatic timeout should take place. + # Zero is the default value. + def comm_inactivity_timeout= value + EventMachine::set_comm_inactivity_timeout @signature, value.to_f + end + alias set_comm_inactivity_timeout comm_inactivity_timeout= + + # The duration after which a TCP connection in the connecting state will fail. + # It is important to distinguish this value from {EventMachine::Connection#comm_inactivity_timeout}, + # which looks at how long since data was passed on an already established connection. + # The value is a float in seconds. + # + # @return [Float] The duration after which a TCP connection in the connecting state will fail, in seconds. + def pending_connect_timeout + EventMachine::get_pending_connect_timeout @signature + end + + # Sets the duration after which a TCP connection in a + # connecting state will fail. + # + # @param [Float, #to_f] value Connection timeout in seconds + def pending_connect_timeout= value + EventMachine::set_pending_connect_timeout @signature, value.to_f + end + alias set_pending_connect_timeout pending_connect_timeout= + + # Reconnect to a given host/port with the current instance + # + # @param [String] server Hostname or IP address + # @param [Integer] port Port to reconnect to + def reconnect server, port + EventMachine::reconnect server, port, self + end + + + # Like {EventMachine::Connection#send_data}, this sends data to the remote end of + # the network connection. {EventMachine::Connection#send_file_data} takes a + # filename as an argument, though, and sends the contents of the file, in one + # chunk. + # + # @param [String] filename Local path of the file to send + # + # @see #send_data + # @author Kirk Haines + def send_file_data filename + EventMachine::send_file_data @signature, filename + end + + # Open a file on the filesystem and send it to the remote peer. This returns an + # object of type {EventMachine::Deferrable}. The object's callbacks will be executed + # on the reactor main thread when the file has been completely scheduled for + # transmission to the remote peer. Its errbacks will be called in case of an error (such as file-not-found). + # This method employs various strategies to achieve the fastest possible performance, + # balanced against minimum consumption of memory. + # + # Warning: this feature has an implicit dependency on an outboard extension, + # evma_fastfilereader. You must install this extension in order to use {#stream_file_data} + # with files larger than a certain size (currently 8192 bytes). + # + # @option args [Boolean] :http_chunks (false) If true, this method will stream the file data in a format + # compatible with the HTTP chunked-transfer encoding + # + # @param [String] filename Local path of the file to stream + # @param [Hash] args Options + # + # @return [EventMachine::Deferrable] + def stream_file_data filename, args={} + EventMachine::FileStreamer.new( self, filename, args ) + end + + # Watches connection for readability. Only possible if the connection was created + # using {EventMachine.attach} and had {EventMachine.notify_readable}/{EventMachine.notify_writable} defined on the handler. + # + # @see #notify_readable? + def notify_readable= mode + EventMachine::set_notify_readable @signature, mode + end + + # @return [Boolean] true if the connection is being watched for readability. + def notify_readable? + EventMachine::is_notify_readable @signature + end + + # Watches connection for writeability. Only possible if the connection was created + # using {EventMachine.attach} and had {EventMachine.notify_readable}/{EventMachine.notify_writable} defined on the handler. + # + # @see #notify_writable? + def notify_writable= mode + EventMachine::set_notify_writable @signature, mode + end + + # Returns true if the connection is being watched for writability. + def notify_writable? + EventMachine::is_notify_writable @signature + end + + # Pause a connection so that {#send_data} and {#receive_data} events are not fired until {#resume} is called. + # @see #resume + def pause + EventMachine::pause_connection @signature + end + + # Resume a connection's {#send_data} and {#receive_data} events. + # @see #pause + def resume + EventMachine::resume_connection @signature + end + + # @return [Boolean] true if the connect was paused using {EventMachine::Connection#pause}. + # @see #pause + # @see #resume + def paused? + EventMachine::connection_paused? @signature + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/deferrable.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/deferrable.rb new file mode 100644 index 000000000000..18a6d316baca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/deferrable.rb @@ -0,0 +1,210 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 Jul 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Deferrable + autoload :Pool, 'em/deferrable/pool' + + # Specify a block to be executed if and when the Deferrable object receives + # a status of :succeeded. See #set_deferred_status for more information. + # + # Calling this method on a Deferrable object whose status is not yet known + # will cause the callback block to be stored on an internal list. + # If you call this method on a Deferrable whose status is :succeeded, the + # block will be executed immediately, receiving the parameters given to the + # prior #set_deferred_status call. + # + #-- + # If there is no status, add a callback to an internal list. + # If status is succeeded, execute the callback immediately. + # If status is failed, do nothing. + # + def callback &block + return unless block + @deferred_status ||= :unknown + if @deferred_status == :succeeded + block.call(*@deferred_args) + elsif @deferred_status != :failed + @callbacks ||= [] + @callbacks.unshift block # << block + end + self + end + + # Cancels an outstanding callback to &block if any. Undoes the action of #callback. + # + def cancel_callback block + @callbacks ||= [] + @callbacks.delete block + end + + # Specify a block to be executed if and when the Deferrable object receives + # a status of :failed. See #set_deferred_status for more information. + #-- + # If there is no status, add an errback to an internal list. + # If status is failed, execute the errback immediately. + # If status is succeeded, do nothing. + # + def errback &block + return unless block + @deferred_status ||= :unknown + if @deferred_status == :failed + block.call(*@deferred_args) + elsif @deferred_status != :succeeded + @errbacks ||= [] + @errbacks.unshift block # << block + end + self + end + + # Cancels an outstanding errback to &block if any. Undoes the action of #errback. + # + def cancel_errback block + @errbacks ||= [] + @errbacks.delete block + end + + # Sets the "disposition" (status) of the Deferrable object. See also the large set of + # sugarings for this method. + # Note that if you call this method without arguments, + # no arguments will be passed to the callback/errback. + # If the user has coded these with arguments, then the + # user code will throw an argument exception. + # Implementors of deferrable classes <b>must</b> + # document the arguments they will supply to user callbacks. + # + # OBSERVE SOMETHING VERY SPECIAL here: you may call this method even + # on the INSIDE of a callback. This is very useful when a previously-registered + # callback wants to change the parameters that will be passed to subsequently-registered + # ones. + # + # You may give either :succeeded or :failed as the status argument. + # + # If you pass :succeeded, then all of the blocks passed to the object using the #callback + # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks + # passed to the object using #errback will be discarded. + # + # If you pass :failed, then all of the blocks passed to the object using the #errback + # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks + # passed to the object using # callback will be discarded. + # + # If you pass any arguments to #set_deferred_status in addition to the status argument, + # they will be passed as arguments to any callbacks or errbacks that are executed. + # It's your responsibility to ensure that the argument lists specified in your callbacks and + # errbacks match the arguments given in calls to #set_deferred_status, otherwise Ruby will raise + # an ArgumentError. + # + #-- + # We're shifting callbacks off and discarding them as we execute them. + # This is valid because by definition callbacks are executed no more than + # once. It also has the magic effect of permitting recursive calls, which + # means that a callback can call #set_deferred_status and change the parameters + # that will be sent to subsequent callbacks down the chain. + # + # Changed @callbacks and @errbacks from push/shift to unshift/pop, per suggestion + # by Kirk Haines, to work around the memory leak bug that still exists in many Ruby + # versions. + # + # Changed 15Sep07: after processing callbacks or errbacks, CLEAR the other set of + # handlers. This gets us a little closer to the behavior of Twisted's "deferred," + # which only allows status to be set once. Prior to making this change, it was possible + # to "succeed" a Deferrable (triggering its callbacks), and then immediately "fail" it, + # triggering its errbacks! That is clearly undesirable, but it's just as undesirable + # to raise an exception is status is set more than once on a Deferrable. The latter + # behavior would invalidate the idiom of resetting arguments by setting status from + # within a callback or errback, but more seriously it would cause spurious errors + # if a Deferrable was timed out and then an attempt was made to succeed it. See the + # comments under the new method #timeout. + # + def set_deferred_status status, *args + cancel_timeout + @errbacks ||= nil + @callbacks ||= nil + @deferred_status = status + @deferred_args = args + case @deferred_status + when :succeeded + if @callbacks + while cb = @callbacks.pop + cb.call(*@deferred_args) + end + end + @errbacks.clear if @errbacks + when :failed + if @errbacks + while eb = @errbacks.pop + eb.call(*@deferred_args) + end + end + @callbacks.clear if @callbacks + end + end + + + # Setting a timeout on a Deferrable causes it to go into the failed state after + # the Timeout expires (passing no arguments to the object's errbacks). + # Setting the status at any time prior to a call to the expiration of the timeout + # will cause the timer to be cancelled. + def timeout seconds, *args + cancel_timeout + me = self + @deferred_timeout = EventMachine::Timer.new(seconds) {me.fail(*args)} + self + end + + # Cancels an outstanding timeout if any. Undoes the action of #timeout. + # + def cancel_timeout + @deferred_timeout ||= nil + if @deferred_timeout + @deferred_timeout.cancel + @deferred_timeout = nil + end + end + + + # Sugar for set_deferred_status(:succeeded, ...) + # + def succeed *args + set_deferred_status :succeeded, *args + end + alias set_deferred_success succeed + + # Sugar for set_deferred_status(:failed, ...) + # + def fail *args + set_deferred_status :failed, *args + end + alias set_deferred_failure fail + end + + + # DefaultDeferrable is an otherwise empty class that includes Deferrable. + # This is very useful when you just need to return a Deferrable object + # as a way of communicating deferred status to some other part of a program. + class DefaultDeferrable + include Deferrable + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/deferrable/pool.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/deferrable/pool.rb new file mode 100644 index 000000000000..3c278eeb9690 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/deferrable/pool.rb @@ -0,0 +1,2 @@ +warn "EM::Deferrable::Pool is deprecated, please use EM::Pool" +EM::Deferrable::Pool = EM::Pool \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/file_watch.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/file_watch.rb new file mode 100644 index 000000000000..074ffedc06d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/file_watch.rb @@ -0,0 +1,73 @@ +module EventMachine + # Utility class that is useful for file monitoring. Supported events are + # + # * File is modified + # * File is deleted + # * File is moved + # + # @note On Mac OS X, file watching only works when kqueue is enabled + # + # @see EventMachine.watch_file + class FileWatch < Connection + # @private + Cmodified = 'modified'.freeze + # @private + Cdeleted = 'deleted'.freeze + # @private + Cmoved = 'moved'.freeze + + + # @private + def receive_data(data) + case data + when Cmodified + file_modified + when Cdeleted + file_deleted + when Cmoved + file_moved + end + end + + # Returns the path that is being monitored. + # + # @note Current implementation does not pick up on the new filename after a rename occurs. + # + # @return [String] + # @see EventMachine.watch_file + def path + @path + end + + # Will be called when the file is modified. Supposed to be redefined by subclasses. + # + # @abstract + def file_modified + end + + # Will be called when the file is deleted. Supposed to be redefined by subclasses. + # When the file is deleted, stop_watching will be called after this to make sure everything is + # cleaned up correctly. + # + # @note On Linux (with {http://en.wikipedia.org/wiki/Inotify inotify}), this method will not be called until *all* open file descriptors to + # the file have been closed. + # + # @abstract + def file_deleted + end + + # Will be called when the file is moved or renamed. Supposed to be redefined by subclasses. + # + # @abstract + def file_moved + end + + # Discontinue monitoring of the file. + # + # This involves cleaning up the underlying monitoring details with kqueue/inotify, and in turn firing {EventMachine::Connection#unbind}. + # This will be called automatically when a file is deleted. User code may call it as well. + def stop_watching + EventMachine::unwatch_filename(@signature) + end # stop_watching + end # FileWatch +end # EventMachine diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/future.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/future.rb new file mode 100644 index 000000000000..4affbf518a12 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/future.rb @@ -0,0 +1,61 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 Jul 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +#-- +# This defines EventMachine::Deferrable#future, which requires +# that the rest of EventMachine::Deferrable has already been seen. +# (It's in deferrable.rb.) + +module EventMachine + module Deferrable + + # A future is a sugaring of a typical deferrable usage. + #-- + # Evaluate arg (which may be an expression or a block). + # What's the class of arg? + # If arg is an ordinary expression, then return it. + # If arg is deferrable (responds to :set_deferred_status), + # then look at the arguments. If either callback or errback + # are defined, then use them. If neither are defined, then + # use the supplied block (if any) as the callback. + # Then return arg. + def self.future arg, cb=nil, eb=nil, &blk + arg = arg.call if arg.respond_to?(:call) + + if arg.respond_to?(:set_deferred_status) + if cb || eb + arg.callback(&cb) if cb + arg.errback(&eb) if eb + else + arg.callback(&blk) if blk + end + end + + arg + end + + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/iterator.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/iterator.rb new file mode 100644 index 000000000000..a30b9dd7f799 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/iterator.rb @@ -0,0 +1,252 @@ +module EventMachine + # A simple iterator for concurrent asynchronous work. + # + # Unlike ruby's built-in iterators, the end of the current iteration cycle is signaled manually, + # instead of happening automatically after the yielded block finishes executing. For example: + # + # (0..10).each{ |num| } + # + # becomes: + # + # EM::Iterator.new(0..10).each{ |num,iter| iter.next } + # + # This is especially useful when doing asynchronous work via reactor libraries and + # functions. For example, given a sync and async http api: + # + # response = sync_http_get(url); ... + # async_http_get(url){ |response| ... } + # + # a synchronous iterator such as: + # + # responses = urls.map{ |url| sync_http_get(url) } + # ... + # puts 'all done!' + # + # could be written as: + # + # EM::Iterator.new(urls).map(proc{ |url,iter| + # async_http_get(url){ |res| + # iter.return(res) + # } + # }, proc{ |responses| + # ... + # puts 'all done!' + # }) + # + # Now, you can take advantage of the asynchronous api to issue requests in parallel. For example, + # to fetch 10 urls at a time, simply pass in a concurrency of 10: + # + # EM::Iterator.new(urls, 10).each do |url,iter| + # async_http_get(url){ iter.next } + # end + # + class Iterator + Stop = "EM::Stop" + # Create a new parallel async iterator with specified concurrency. + # + # i = EM::Iterator.new(1..100, 10) + # + # will create an iterator over the range that processes 10 items at a time. Iteration + # is started via #each, #map or #inject + # + # The list may either be an array-like object, or a proc that returns a new object + # to be processed each time it is called. If a proc is used, it must return + # EventMachine::Iterator::Stop to signal the end of the iterations. + # + def initialize(list, concurrency = 1) + raise ArgumentError, 'concurrency must be bigger than zero' unless (concurrency > 0) + if list.respond_to?(:call) + @list = nil + @list_proc = list + elsif list.respond_to?(:to_a) + @list = list.to_a.dup + @list_proc = nil + else + raise ArgumentError, 'argument must be a proc or an array' + end + @concurrency = concurrency + + @started = false + @ended = false + end + + # Change the concurrency of this iterator. Workers will automatically be spawned or destroyed + # to accomodate the new concurrency level. + # + def concurrency=(val) + old = @concurrency + @concurrency = val + + spawn_workers if val > old and @started and !@ended + end + attr_reader :concurrency + + # Iterate over a set of items using the specified block or proc. + # + # EM::Iterator.new(1..100).each do |num, iter| + # puts num + # iter.next + # end + # + # An optional second proc is invoked after the iteration is complete. + # + # EM::Iterator.new(1..100).each( + # proc{ |num,iter| iter.next }, + # proc{ puts 'all done' } + # ) + # + def each(foreach=nil, after=nil, &blk) + raise ArgumentError, 'proc or block required for iteration' unless foreach ||= blk + raise RuntimeError, 'cannot iterate over an iterator more than once' if @started or @ended + + @started = true + @pending = 0 + @workers = 0 + + all_done = proc{ + after.call if after and @ended and @pending == 0 + } + + @process_next = proc{ + # p [:process_next, :pending=, @pending, :workers=, @workers, :ended=, @ended, :concurrency=, @concurrency, :list=, @list] + unless @ended or @workers > @concurrency + item = next_item() + if item.equal?(Stop) + @ended = true + @workers -= 1 + all_done.call + else + @pending += 1 + + is_done = false + on_done = proc{ + raise RuntimeError, 'already completed this iteration' if is_done + is_done = true + + @pending -= 1 + + if @ended + all_done.call + else + EM.next_tick(@process_next) + end + } + class << on_done + alias :next :call + end + + foreach.call(item, on_done) + end + else + @workers -= 1 + end + } + + spawn_workers + + self + end + + # Collect the results of an asynchronous iteration into an array. + # + # EM::Iterator.new(%w[ pwd uptime uname date ], 2).map(proc{ |cmd,iter| + # EM.system(cmd){ |output,status| + # iter.return(output) + # } + # }, proc{ |results| + # p results + # }) + # + def map(foreach, after) + index = 0 + + inject([], proc{ |results,item,iter| + i = index + index += 1 + + is_done = false + on_done = proc{ |res| + raise RuntimeError, 'already returned a value for this iteration' if is_done + is_done = true + + results[i] = res + iter.return(results) + } + class << on_done + alias :return :call + def next + raise NoMethodError, 'must call #return on a map iterator' + end + end + + foreach.call(item, on_done) + }, proc{ |results| + after.call(results) + }) + end + + # Inject the results of an asynchronous iteration onto a given object. + # + # EM::Iterator.new(%w[ pwd uptime uname date ], 2).inject({}, proc{ |hash,cmd,iter| + # EM.system(cmd){ |output,status| + # hash[cmd] = status.exitstatus == 0 ? output.strip : nil + # iter.return(hash) + # } + # }, proc{ |results| + # p results + # }) + # + def inject(obj, foreach, after) + each(proc{ |item,iter| + is_done = false + on_done = proc{ |res| + raise RuntimeError, 'already returned a value for this iteration' if is_done + is_done = true + + obj = res + iter.next + } + class << on_done + alias :return :call + def next + raise NoMethodError, 'must call #return on an inject iterator' + end + end + + foreach.call(obj, item, on_done) + }, proc{ + after.call(obj) + }) + end + + private + + # Spawn workers to consume items from the iterator's enumerator based on the current concurrency level. + # + def spawn_workers + EM.next_tick(start_worker = proc{ + if @workers < @concurrency and !@ended + # p [:spawning_worker, :workers=, @workers, :concurrency=, @concurrency, :ended=, @ended] + @workers += 1 + @process_next.call + EM.next_tick(start_worker) + end + }) + nil + end + + # Return the next item from @list or @list_proc. + # Once items have run out, will return EM::Iterator::Stop. Procs must supply this themselves + def next_item + if @list_proc + @list_proc.call + else + @list.empty? ? Stop : @list.shift + end + end + end +end + +# TODO: pass in one object instead of two? .each{ |iter| puts iter.current; iter.next } +# TODO: support iter.pause/resume/stop/break/continue? +# TODO: create some exceptions instead of using RuntimeError diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/messages.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/messages.rb new file mode 100644 index 000000000000..9a51c390fe80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/messages.rb @@ -0,0 +1,66 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 Jul 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +=begin + +Message Routing in EventMachine. + +The goal here is to enable "routing points," objects that can send and receive +"messages," which are delimited streams of bytes. The boundaries of a message +are preserved as it passes through the reactor system. + +There will be several module methods defined in EventMachine to create route-point +objects (which will probably have a base class of EventMachine::MessageRouter +until someone suggests a better name). + +As with I/O objects, routing objects will receive events by having the router +core call methods on them. And of course user code can and will define handlers +to deal with events of interest. + +The message router base class only really needs a receive_message method. There will +be an EM module-method to send messages, in addition to the module methods to create +the various kinds of message receivers. + +The simplest kind of message receiver object can receive messages by being named +explicitly in a parameter to EM#send_message. More sophisticated receivers can define +pub-sub selectors and message-queue names. And they can also define channels for +route-points in other processes or even on other machines. + +A message is NOT a marshallable entity. Rather, it's a chunk of flat content more like +an Erlang message. Initially, all content submitted for transmission as a message will +have the to_s method called on it. Eventually, we'll be able to transmit certain structured +data types (XML and YAML documents, Structs within limits) and have them reconstructed +on the other end. + +A fundamental goal of the message-routing capability is to interoperate seamlessly with +external systems, including non-Ruby systems like ActiveMQ. We will define various protocol +handlers for things like Stomp and possibly AMQP, but these will be wrapped up and hidden +from the users of the basic routing capability. + +As with Erlang, a critical goal is for programs that are built to use message-passing to work +WITHOUT CHANGE when the code is re-based on a multi-process system. + +=end + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/pool.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/pool.rb new file mode 100644 index 000000000000..2cb3662d0812 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/pool.rb @@ -0,0 +1,151 @@ +module EventMachine + # A simple async resource pool based on a resource and work queue. Resources + # are enqueued and work waits for resources to become available. + # + # @example + # require 'em-http-request' + # + # EM.run do + # pool = EM::Pool.new + # spawn = lambda { pool.add EM::HttpRequest.new('http://example.org') } + # 10.times { spawn[] } + # done, scheduled = 0, 0 + # + # check = lambda do + # done += 1 + # if done >= scheduled + # EM.stop + # end + # end + # + # pool.on_error { |conn| spawn[] } + # + # 100.times do |i| + # scheduled += 1 + # pool.perform do |conn| + # req = conn.get :path => '/', :keepalive => true + # + # req.callback do + # p [:success, conn.object_id, i, req.response.size] + # check[] + # end + # + # req.errback { check[] } + # + # req + # end + # end + # end + # + # Resources are expected to be controlled by an object responding to a + # deferrable/completion style API with callback and errback blocks. + # + class Pool + + def initialize + @resources = EM::Queue.new + @removed = [] + @contents = [] + @on_error = nil + end + + def add resource + @contents << resource + requeue resource + end + + def remove resource + @contents.delete resource + @removed << resource + end + + # Returns a list for introspection purposes only. You should *NEVER* call + # modification or work oriented methods on objects in this list. A good + # example use case is periodic statistics collection against a set of + # connection resources. + # + # @example + # pool.contents.inject(0) { |sum, connection| connection.num_bytes } + def contents + @contents.dup + end + + # Define a default catch-all for when the deferrables returned by work + # blocks enter a failed state. By default all that happens is that the + # resource is returned to the pool. If on_error is defined, this block is + # responsible for re-adding the resource to the pool if it is still usable. + # In other words, it is generally assumed that on_error blocks explicitly + # handle the rest of the lifetime of the resource. + def on_error *a, &b + @on_error = EM::Callback(*a, &b) + end + + # Perform a given #call-able object or block. The callable object will be + # called with a resource from the pool as soon as one is available, and is + # expected to return a deferrable. + # + # The deferrable will have callback and errback added such that when the + # deferrable enters a finished state, the object is returned to the pool. + # + # If on_error is defined, then objects are not automatically returned to the + # pool. + def perform(*a, &b) + work = EM::Callback(*a, &b) + + @resources.pop do |resource| + if removed? resource + @removed.delete resource + reschedule work + else + process work, resource + end + end + end + alias reschedule perform + + # A peek at the number of enqueued jobs waiting for resources + def num_waiting + @resources.num_waiting + end + + # Removed will show resources in a partial pruned state. Resources in the + # removed list may not appear in the contents list if they are currently in + # use. + def removed? resource + @removed.include? resource + end + + protected + def requeue resource + @resources.push resource + end + + def failure resource + if @on_error + @contents.delete resource + @on_error.call resource + # Prevent users from calling a leak. + @removed.delete resource + else + requeue resource + end + end + + def completion deferrable, resource + deferrable.callback { requeue resource } + deferrable.errback { failure resource } + end + + def process work, resource + deferrable = work.call resource + if deferrable.kind_of?(EM::Deferrable) + completion deferrable, resource + else + raise ArgumentError, "deferrable expected from work" + end + rescue + failure resource + raise + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/process_watch.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/process_watch.rb new file mode 100644 index 000000000000..66e894383b33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/process_watch.rb @@ -0,0 +1,45 @@ +module EventMachine + + # This is subclassed from EventMachine::Connection for use with the process monitoring API. Read the + # documentation on the instance methods of this class, and for a full explanation see EventMachine.watch_process. + class ProcessWatch < Connection + # @private + Cfork = 'fork'.freeze + # @private + Cexit = 'exit'.freeze + + # @private + def receive_data(data) + case data + when Cfork + process_forked + when Cexit + process_exited + end + end + + # Returns the pid that EventMachine::watch_process was originally called with. + def pid + @pid + end + + # Should be redefined with the user's custom callback that will be fired when the prcess is forked. + # + # There is currently not an easy way to get the pid of the forked child. + def process_forked + end + + # Should be redefined with the user's custom callback that will be fired when the process exits. + # + # stop_watching is called automatically after this callback + def process_exited + end + + # Discontinue monitoring of the process. + # This will be called automatically when a process dies. User code may call it as well. + def stop_watching + EventMachine::unwatch_pid(@signature) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/processes.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/processes.rb new file mode 100644 index 000000000000..4bbc14f6e84f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/processes.rb @@ -0,0 +1,123 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 13 Dec 07 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-08 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + + +module EventMachine + + # EM::DeferrableChildProcess is a sugaring of a common use-case + # involving EM::popen. + # Call the #open method on EM::DeferrableChildProcess, passing + # a command-string. #open immediately returns an EM::Deferrable + # object. It also schedules the forking of a child process, which + # will execute the command passed to #open. + # When the forked child terminates, the Deferrable will be signalled + # and execute its callbacks, passing the data that the child process + # wrote to stdout. + # + class DeferrableChildProcess < EventMachine::Connection + include EventMachine::Deferrable + + # @private + def initialize + super + @data = [] + end + + # Sugars a common use-case involving forked child processes. + # #open takes a String argument containing an shell command + # string (including arguments if desired). #open immediately + # returns an EventMachine::Deferrable object, without blocking. + # + # It also invokes EventMachine#popen to run the passed-in + # command in a forked child process. + # + # When the forked child terminates, the Deferrable that + # #open calls its callbacks, passing the data returned + # from the child process. + # + def self.open cmd + EventMachine.popen( cmd, DeferrableChildProcess ) + end + + # @private + def receive_data data + @data << data + end + + # @private + def unbind + succeed( @data.join ) + end + end + + # @private + class SystemCmd < EventMachine::Connection + def initialize cb + @cb = cb + @output = [] + end + def receive_data data + @output << data + end + def unbind + @cb.call @output.join(''), get_status if @cb + end + end + + # EM::system is a simple wrapper for EM::popen. It is similar to Kernel::system, but requires a + # single string argument for the command and performs no shell expansion. + # + # The block or proc passed to EM::system is called with two arguments: the output generated by the command, + # and a Process::Status that contains information about the command's execution. + # + # EM.run{ + # EM.system('ls'){ |output,status| puts output if status.exitstatus == 0 } + # } + # + # You can also supply an additional proc to send some data to the process: + # + # EM.run{ + # EM.system('sh', proc{ |process| + # process.send_data("echo hello\n") + # process.send_data("exit\n") + # }, proc{ |out,status| + # puts(out) + # }) + # } + # + # Like EventMachine.popen, EventMachine.system currently does not work on windows. + # It returns the pid of the spawned process. + def EventMachine::system cmd, *args, &cb + cb ||= args.pop if args.last.is_a? Proc + init = args.pop if args.last.is_a? Proc + + # merge remaining arguments into the command + cmd = [cmd, *args] if args.any? + + EM.get_subprocess_pid(EM.popen(cmd, SystemCmd, cb) do |c| + init[c] if init + end.signature) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols.rb new file mode 100644 index 000000000000..0c1790641c28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols.rb @@ -0,0 +1,37 @@ +module EventMachine + # This module contains various protocol implementations, including: + # - HttpClient and HttpClient2 + # - Stomp + # - Memcache + # - SmtpClient and SmtpServer + # - SASLauth and SASLauthclient + # - LineProtocol, LineAndTextProtocol and LineText2 + # - HeaderAndContentProtocol + # - Postgres3 + # - ObjectProtocol + # + # The protocol implementations live in separate files in the protocols/ subdirectory, + # but are auto-loaded when they are first referenced in your application. + # + # EventMachine::Protocols is also aliased to EM::P for easier usage. + # + module Protocols + # TODO : various autotools are completely useless with the lack of naming + # convention, we need to correct that! + autoload :TcpConnectTester, 'em/protocols/tcptest' + autoload :HttpClient, 'em/protocols/httpclient' + autoload :HttpClient2, 'em/protocols/httpclient2' + autoload :LineAndTextProtocol, 'em/protocols/line_and_text' + autoload :HeaderAndContentProtocol, 'em/protocols/header_and_content' + autoload :LineText2, 'em/protocols/linetext2' + autoload :Stomp, 'em/protocols/stomp' + autoload :SmtpClient, 'em/protocols/smtpclient' + autoload :SmtpServer, 'em/protocols/smtpserver' + autoload :SASLauth, 'em/protocols/saslauth' + autoload :Memcache, 'em/protocols/memcache' + autoload :Postgres3, 'em/protocols/postgres3' + autoload :ObjectProtocol, 'em/protocols/object_protocol' + autoload :Socks4, 'em/protocols/socks4' + autoload :LineProtocol, 'em/protocols/line_protocol' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/header_and_content.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/header_and_content.rb new file mode 100644 index 000000000000..b5a465aaf170 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/header_and_content.rb @@ -0,0 +1,138 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 Nov 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + + # === Usage + # + # class RequestHandler < EM::P::HeaderAndContentProtocol + # def receive_request headers, content + # p [:request, headers, content] + # end + # end + # + # EM.run{ + # EM.start_server 'localhost', 80, RequestHandler + # } + # + #-- + # Originally, this subclassed LineAndTextProtocol, which in + # turn relies on BufferedTokenizer, which doesn't gracefully + # handle the transitions between lines and binary text. + # Changed 13Sep08 by FCianfrocca. + class HeaderAndContentProtocol < Connection + include LineText2 + + ContentLengthPattern = /Content-length:\s*(\d+)/i + + def initialize *args + super + init_for_request + end + + def receive_line line + case @hc_mode + when :discard_blanks + unless line == "" + @hc_mode = :headers + receive_line line + end + when :headers + if line == "" + raise "unrecognized state" unless @hc_headers.length > 0 + if respond_to?(:receive_headers) + receive_headers @hc_headers + end + # @hc_content_length will be nil, not 0, if there was no content-length header. + if @hc_content_length.to_i > 0 + set_binary_mode @hc_content_length + else + dispatch_request + end + else + @hc_headers << line + if ContentLengthPattern =~ line + # There are some attacks that rely on sending multiple content-length + # headers. This is a crude protection, but needs to become tunable. + raise "extraneous content-length header" if @hc_content_length + @hc_content_length = $1.to_i + end + if @hc_headers.length == 1 and respond_to?(:receive_first_header_line) + receive_first_header_line line + end + end + else + raise "internal error, unsupported mode" + end + end + + def receive_binary_data text + @hc_content = text + dispatch_request + end + + def dispatch_request + if respond_to?(:receive_request) + receive_request @hc_headers, @hc_content + end + init_for_request + end + private :dispatch_request + + def init_for_request + @hc_mode = :discard_blanks + @hc_headers = [] + # originally was @hc_headers ||= []; @hc_headers.clear to get a performance + # boost, but it's counterproductive because a subclassed handler will have to + # call dup to use the header array we pass in receive_headers. + + @hc_content_length = nil + @hc_content = "" + end + private :init_for_request + + # Basically a convenience method. We might create a subclass that does this + # automatically. But it's such a performance killer. + def headers_2_hash hdrs + self.class.headers_2_hash hdrs + end + + class << self + def headers_2_hash hdrs + hash = {} + hdrs.each {|h| + if /\A([^\s:]+)\s*:\s*/ =~ h + tail = $'.dup + hash[ $1.downcase.gsub(/-/,"_").intern ] = tail + end + } + hash + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/httpclient.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/httpclient.rb new file mode 100644 index 000000000000..38b175ce2552 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/httpclient.rb @@ -0,0 +1,300 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + + # <b>Note:</b> This class is deprecated and will be removed. Please use EM-HTTP-Request instead. + # + # @example + # EventMachine.run { + # http = EventMachine::Protocols::HttpClient.request( + # :host => server, + # :port => 80, + # :request => "/index.html", + # :query_string => "parm1=value1&parm2=value2" + # ) + # http.callback {|response| + # puts response[:status] + # puts response[:headers] + # puts response[:content] + # } + # } + #-- + # TODO: + # Add streaming so we can support enormous POSTs. Current max is 20meg. + # Timeout for connections that run too long or hang somewhere in the middle. + # Persistent connections (HTTP/1.1), may need a associated delegate object. + # DNS: Some way to cache DNS lookups for hostnames we connect to. Ruby's + # DNS lookups are unbelievably slow. + # HEAD requests. + # Convenience methods for requests. get, post, url, etc. + # SSL. + # Handle status codes like 304, 100, etc. + # Refactor this code so that protocol errors all get handled one way (an exception?), + # instead of sprinkling set_deferred_status :failed calls everywhere. + class HttpClient < Connection + include EventMachine::Deferrable + + MaxPostContentLength = 20 * 1024 * 1024 + + def initialize + warn "HttpClient is deprecated and will be removed. EM-Http-Request should be used instead." + @connected = false + end + + # @param args [Hash] The request arguments + # @option args [String] :host The host IP/DNS name + # @option args [Integer] :port The port to connect too + # @option args [String] :verb The request type [GET | POST | DELETE | PUT] + # @option args [String] :request The request path + # @option args [Hash] :basic_auth The basic auth credentials (:username and :password) + # @option args [String] :content The request content + # @option args [String] :contenttype The content type (e.g. text/plain) + # @option args [String] :query_string The query string + # @option args [String] :host_header The host header to set + # @option args [String] :cookie Cookies to set + def self.request( args = {} ) + args[:port] ||= 80 + EventMachine.connect( args[:host], args[:port], self ) {|c| + # According to the docs, we will get here AFTER post_init is called. + c.instance_eval {@args = args} + } + end + + def post_init + @start_time = Time.now + @data = "" + @read_state = :base + end + + # We send the request when we get a connection. + # AND, we set an instance variable to indicate we passed through here. + # That allows #unbind to know whether there was a successful connection. + # NB: This naive technique won't work when we have to support multiple + # requests on a single connection. + def connection_completed + @connected = true + send_request @args + end + + def send_request args + args[:verb] ||= args[:method] # Support :method as an alternative to :verb. + args[:verb] ||= :get # IS THIS A GOOD IDEA, to default to GET if nothing was specified? + + verb = args[:verb].to_s.upcase + unless ["GET", "POST", "PUT", "DELETE", "HEAD"].include?(verb) + set_deferred_status :failed, {:status => 0} # TODO, not signalling the error type + return # NOTE THE EARLY RETURN, we're not sending any data. + end + + request = args[:request] || "/" + unless request[0,1] == "/" + request = "/" + request + end + + qs = args[:query_string] || "" + if qs.length > 0 and qs[0,1] != '?' + qs = "?" + qs + end + + version = args[:version] || "1.1" + + # Allow an override for the host header if it's not the connect-string. + host = args[:host_header] || args[:host] || "_" + # For now, ALWAYS tuck in the port string, although we may want to omit it if it's the default. + port = args[:port].to_i != 80 ? ":#{args[:port]}" : "" + + # POST items. + postcontenttype = args[:contenttype] || "application/octet-stream" + postcontent = args[:content] || "" + raise "oversized content in HTTP POST" if postcontent.length > MaxPostContentLength + + # ESSENTIAL for the request's line-endings to be CRLF, not LF. Some servers misbehave otherwise. + # TODO: We ASSUME the caller wants to send a 1.1 request. May not be a good assumption. + req = [ + "#{verb} #{request}#{qs} HTTP/#{version}", + "Host: #{host}#{port}", + "User-agent: Ruby EventMachine", + ] + + if verb == "POST" || verb == "PUT" + req << "Content-type: #{postcontenttype}" + req << "Content-length: #{postcontent.length}" + end + + # TODO, this cookie handler assumes it's getting a single, semicolon-delimited string. + # Eventually we will want to deal intelligently with arrays and hashes. + if args[:cookie] + req << "Cookie: #{args[:cookie]}" + end + + # Allow custom HTTP headers, e.g. SOAPAction + args[:custom_headers].each do |k,v| + req << "#{k}: #{v}" + end if args[:custom_headers] + + # Basic-auth stanza contributed by Matt Murphy. + if args[:basic_auth] + basic_auth_string = ["#{args[:basic_auth][:username]}:#{args[:basic_auth][:password]}"].pack('m').strip.gsub(/\n/,'') + req << "Authorization: Basic #{basic_auth_string}" + end + + req << "" + reqstring = req.map {|l| "#{l}\r\n"}.join + send_data reqstring + + if verb == "POST" || verb == "PUT" + send_data postcontent + end + end + + + def receive_data data + while data and data.length > 0 + case @read_state + when :base + # Perform any per-request initialization here and don't consume any data. + @data = "" + @headers = [] + @content_length = nil # not zero + @content = "" + @status = nil + @chunked = false + @chunk_length = nil + @read_state = :header + @connection_close = nil + when :header + ary = data.split( /\r?\n/m, 2 ) + if ary.length == 2 + data = ary.last + if ary.first == "" + if (@content_length and @content_length > 0) || @chunked || @connection_close + @read_state = :content + else + dispatch_response + @read_state = :base + end + else + @headers << ary.first + if @headers.length == 1 + parse_response_line + elsif ary.first =~ /\Acontent-length:\s*/i + # Only take the FIRST content-length header that appears, + # which we can distinguish because @content_length is nil. + # TODO, it's actually a fatal error if there is more than one + # content-length header, because the caller is presumptively + # a bad guy. (There is an exploit that depends on multiple + # content-length headers.) + @content_length ||= $'.to_i + elsif ary.first =~ /\Aconnection:\s*close/i + @connection_close = true + elsif ary.first =~ /\Atransfer-encoding:\s*chunked/i + @chunked = true + end + end + else + @data << data + data = "" + end + when :content + if @chunked && @chunk_length + bytes_needed = @chunk_length - @chunk_read + new_data = data[0, bytes_needed] + @chunk_read += new_data.length + @content += new_data + data = data[bytes_needed..-1] || "" + if @chunk_length == @chunk_read && data[0,2] == "\r\n" + @chunk_length = nil + data = data[2..-1] + end + elsif @chunked + if (m = data.match(/\A(\S*)\r\n/m)) + data = data[m[0].length..-1] + @chunk_length = m[1].to_i(16) + @chunk_read = 0 + if @chunk_length == 0 + dispatch_response + @read_state = :base + end + end + elsif @content_length + # If there was no content-length header, we have to wait until the connection + # closes. Everything we get until that point is content. + # TODO: Must impose a content-size limit, and also must implement chunking. + # Also, must support either temporary files for large content, or calling + # a content-consumer block supplied by the user. + bytes_needed = @content_length - @content.length + @content += data[0, bytes_needed] + data = data[bytes_needed..-1] || "" + if @content_length == @content.length + dispatch_response + @read_state = :base + end + else + @content << data + data = "" + end + end + end + end + + + # We get called here when we have received an HTTP response line. + # It's an opportunity to throw an exception or trigger other exceptional + # handling. + def parse_response_line + if @headers.first =~ /\AHTTP\/1\.[01] ([\d]{3})/ + @status = $1.to_i + else + set_deferred_status :failed, { + :status => 0 # crappy way of signifying an unrecognized response. TODO, find a better way to do this. + } + close_connection + end + end + private :parse_response_line + + def dispatch_response + @read_state = :base + set_deferred_status :succeeded, { + :content => @content, + :headers => @headers, + :status => @status + } + # TODO, we close the connection for now, but this is wrong for persistent clients. + close_connection + end + + def unbind + if !@connected + set_deferred_status :failed, {:status => 0} # YECCCCH. Find a better way to signal no-connect/network error. + elsif (@read_state == :content and @content_length == nil) + dispatch_response + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/httpclient2.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/httpclient2.rb new file mode 100644 index 000000000000..0fb64e80435c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/httpclient2.rb @@ -0,0 +1,600 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + + # <b>Note:</b> This class is deprecated and will be removed. Please use EM-HTTP-Request instead. + # + # === Usage + # + # EM.run{ + # conn = EM::Protocols::HttpClient2.connect 'google.com', 80 + # + # req = conn.get('/') + # req.callback{ |response| + # p(response.status) + # p(response.headers) + # p(response.content) + # } + # } + class HttpClient2 < Connection + include LineText2 + + def initialize + warn "HttpClient2 is deprecated and will be removed. EM-Http-Request should be used instead." + + @authorization = nil + @closed = nil + @requests = nil + end + + # @private + class Request + include Deferrable + + attr_reader :version + attr_reader :status + attr_reader :header_lines + attr_reader :headers + attr_reader :content + attr_reader :internal_error + + def initialize conn, args + @conn = conn + @args = args + @header_lines = [] + @headers = {} + @blanks = 0 + @chunk_trailer = nil + @chunking = nil + end + + def send_request + az = @args[:authorization] and az = "Authorization: #{az}\r\n" + + r = [ + "#{@args[:verb]} #{@args[:uri]} HTTP/#{@args[:version] || "1.1"}\r\n", + "Host: #{@args[:host_header] || "_"}\r\n", + az || "", + "\r\n" + ] + @conn.send_data r.join + end + + + #-- + # + def receive_line ln + if @chunk_trailer + receive_chunk_trailer(ln) + elsif @chunking + receive_chunk_header(ln) + else + receive_header_line(ln) + end + end + + #-- + # + def receive_chunk_trailer ln + if ln.length == 0 + @conn.pop_request + succeed(self) + else + p "Received chunk trailer line" + end + end + + #-- + # Allow up to ten blank lines before we get a real response line. + # Allow no more than 100 lines in the header. + # + def receive_header_line ln + if ln.length == 0 + if @header_lines.length > 0 + process_header + else + @blanks += 1 + if @blanks > 10 + @conn.close_connection + end + end + else + @header_lines << ln + if @header_lines.length > 100 + @internal_error = :bad_header + @conn.close_connection + end + end + end + + #-- + # Cf RFC 2616 pgh 3.6.1 for the format of HTTP chunks. + # + def receive_chunk_header ln + if ln.length > 0 + chunksize = ln.to_i(16) + if chunksize > 0 + @conn.set_text_mode(ln.to_i(16)) + else + @content = @content ? @content.join : '' + @chunk_trailer = true + end + else + # We correctly come here after each chunk gets read. + # p "Got A BLANK chunk line" + end + + end + + + #-- + # We get a single chunk. Append it to the incoming content and switch back to line mode. + # + def receive_chunked_text text + # p "RECEIVED #{text.length} CHUNK" + (@content ||= []) << text + end + + + #-- + # TODO, inefficient how we're handling this. Part of it is done so as to + # make sure we don't have problems in detecting chunked-encoding, content-length, + # etc. + # + HttpResponseRE = /\AHTTP\/(1.[01]) ([\d]{3})/i + ClenRE = /\AContent-length:\s*(\d+)/i + ChunkedRE = /\ATransfer-encoding:\s*chunked/i + ColonRE = /\:\s*/ + + def process_header + unless @header_lines.first =~ HttpResponseRE + @conn.close_connection + @internal_error = :bad_request + end + @version = $1.dup + @status = $2.dup.to_i + + clen = nil + chunks = nil + @header_lines.each_with_index do |e,ix| + if ix > 0 + hdr,val = e.split(ColonRE,2) + (@headers[hdr.downcase] ||= []) << val + end + + if clen == nil and e =~ ClenRE + clen = $1.dup.to_i + end + if e =~ ChunkedRE + chunks = true + end + end + + if clen + # If the content length is zero we should not call set_text_mode, + # because a value of zero will make it wait forever, hanging the + # connection. Just return success instead, with empty content. + if clen == 0 then + @content = "" + @conn.pop_request + succeed(self) + else + @conn.set_text_mode clen + end + elsif chunks + @chunking = true + else + # Chunked transfer, multipart, or end-of-connection. + # For end-of-connection, we need to go the unbind + # method and suppress its desire to fail us. + p "NO CLEN" + p @args[:uri] + p @header_lines + @internal_error = :unsupported_clen + @conn.close_connection + end + end + private :process_header + + + def receive_text text + @chunking ? receive_chunked_text(text) : receive_sized_text(text) + end + + #-- + # At the present time, we only handle contents that have a length + # specified by the content-length header. + # + def receive_sized_text text + @content = text + @conn.pop_request + succeed(self) + end + end + + # Make a connection to a remote HTTP server. + # Can take either a pair of arguments (which will be interpreted as + # a hostname/ip-address and a port), or a hash. + # If the arguments are a hash, then supported values include: + # :host => a hostname or ip-address + # :port => a port number + # :ssl => true to enable ssl + def self.connect *args + if args.length == 2 + args = {:host=>args[0], :port=>args[1]} + else + args = args.first + end + + h,prt,ssl = args[:host], Integer(args[:port]), (args[:tls] || args[:ssl]) + conn = EM.connect( h, prt, self ) + conn.start_tls if ssl + conn.set_default_host_header( h, prt, ssl ) + conn + end + + # Get a url + # + # req = conn.get(:uri => '/') + # req.callback{|response| puts response.content } + # + def get args + if args.is_a?(String) + args = {:uri=>args} + end + args[:verb] = "GET" + request args + end + + # Post to a url + # + # req = conn.post('/data') + # req.callback{|response| puts response.content } + #-- + # XXX there's no way to supply a POST body.. wtf? + def post args + if args.is_a?(String) + args = {:uri=>args} + end + args[:verb] = "POST" + request args + end + + + #-- + # Compute and remember a string to be used as the host header in HTTP requests + # unless the user overrides it with an argument to #request. + # + # @private + def set_default_host_header host, port, ssl + if (ssl and port != 443) or (!ssl and port != 80) + @host_header = "#{host}:#{port}" + else + @host_header = host + end + end + + + # @private + def post_init + super + @connected = EM::DefaultDeferrable.new + end + + # @private + def connection_completed + super + @connected.succeed + end + + #-- + # All pending requests, if any, must fail. + # We might come here without ever passing through connection_completed + # in case we can't connect to the server. We'll also get here when the + # connection closes (either because the server closes it, or we close it + # due to detecting an internal error or security violation). + # In either case, run down all pending requests, if any, and signal failure + # on them. + # + # Set and remember a flag (@closed) so we can immediately fail any + # subsequent requests. + # + # @private + def unbind + super + @closed = true + (@requests || []).each {|r| r.fail} + end + + # @private + def request args + args[:host_header] = @host_header unless args.has_key?(:host_header) + args[:authorization] = @authorization unless args.has_key?(:authorization) + r = Request.new self, args + if @closed + r.fail + else + (@requests ||= []).unshift r + @connected.callback {r.send_request} + end + r + end + + # @private + def receive_line ln + if req = @requests.last + req.receive_line ln + else + p "??????????" + p ln + end + end + + # @private + def receive_binary_data text + @requests.last.receive_text text + end + + #-- + # Called by a Request object when it completes. + # + # @private + def pop_request + @requests.pop + end + end + + +=begin + class HttpClient2x < Connection + include LineText2 + + # TODO: Make this behave appropriate in case a #connect fails. + # Currently, this produces no errors. + + # Make a connection to a remote HTTP server. + # Can take either a pair of arguments (which will be interpreted as + # a hostname/ip-address and a port), or a hash. + # If the arguments are a hash, then supported values include: + # :host => a hostname or ip-address; + # :port => a port number + #-- + # TODO, support optional encryption arguments like :ssl + def self.connect *args + if args.length == 2 + args = {:host=>args[0], :port=>args[1]} + else + args = args.first + end + + h,prt = args[:host],Integer(args[:port]) + EM.connect( h, prt, self, h, prt ) + end + + + #-- + # Sugars a connection that makes a single request and then + # closes the connection. Matches the behavior and the arguments + # of the original implementation of class HttpClient. + # + # Intended primarily for back compatibility, but the idiom + # is probably useful so it's not deprecated. + # We return a Deferrable, as did the original implementation. + # + # Because we're improving the way we deal with errors and exceptions + # (specifically, HTTP response codes other than 2xx will trigger the + # errback rather than the callback), this may break some existing code. + # + def self.request args + c = connect args + end + + #-- + # Requests can be pipelined. When we get a request, add it to the + # front of a queue as an array. The last element of the @requests + # array is always the oldest request received. Each element of the + # @requests array is a two-element array consisting of a hash with + # the original caller's arguments, and an initially-empty Ostruct + # containing the data we retrieve from the server's response. + # Maintain the instance variable @current_response, which is the response + # of the oldest pending request. That's just to make other code a little + # easier. If the variable doesn't exist when we come here, we're + # obviously the first request being made on the connection. + # + # The reason for keeping this method private (and requiring use of the + # convenience methods #get, #post, #head, etc) is to avoid the small + # performance penalty of canonicalizing the verb. + # + def request args + d = EventMachine::DefaultDeferrable.new + + if @closed + d.fail + return d + end + + o = OpenStruct.new + o.deferrable = d + (@requests ||= []).unshift [args, o] + @current_response ||= @requests.last.last + @connected.callback { + az = args[:authorization] and az = "Authorization: #{az}\r\n" + + r = [ + "#{args[:verb]} #{args[:uri]} HTTP/#{args[:version] || "1.1"}\r\n", + "Host: #{args[:host_header] || @host_header}\r\n", + az || "", + "\r\n" + ] + p r + send_data r.join + } + o.deferrable + end + private :request + + def get args + if args.is_a?(String) + args = {:uri=>args} + end + args[:verb] = "GET" + request args + end + + def initialize host, port + super + @host_header = "#{host}:#{port}" + end + def post_init + super + @connected = EM::DefaultDeferrable.new + end + + + def connection_completed + super + @connected.succeed + end + + #-- + # Make sure to throw away any leftover incoming data if we've + # been closed due to recognizing an error. + # + # Generate an internal error if we get an unreasonable number of + # header lines. It could be malicious. + # + def receive_line ln + p ln + return if @closed + + if ln.length > 0 + (@current_response.headers ||= []).push ln + abort_connection if @current_response.headers.length > 100 + else + process_received_headers + end + end + + #-- + # We come here when we've seen all the headers for a particular request. + # What we do next depends on the response line (which should be the + # first line in the header set), and whether there is content to read. + # We may transition into a text-reading state to read content, or + # we may abort the connection, or we may go right back into parsing + # responses for the next response in the chain. + # + # We make an ASSUMPTION that the first line is an HTTP response. + # Anything else produces an error that aborts the connection. + # This may not be enough, because it may be that responses to pipelined + # requests will come with a blank-line delimiter. + # + # Any non-2xx response will be treated as a fatal error, and abort the + # connection. We will set up the status and other response parameters. + # TODO: we will want to properly support 1xx responses, which some versions + # of IIS copiously generate. + # TODO: We need to give the option of not aborting the connection with certain + # non-200 responses, in order to work with NTLM and other authentication + # schemes that work at the level of individual connections. + # + # Some error responses will get sugarings. For example, we'll return the + # Location header in the response in case of a 301/302 response. + # + # Possible dispositions here: + # 1) No content to read (either content-length is zero or it's a HEAD request); + # 2) Switch to text mode to read a specific number of bytes; + # 3) Read a chunked or multipart response; + # 4) Read till the server closes the connection. + # + # Our reponse to the client can be either to wait till all the content + # has been read and then to signal caller's deferrable, or else to signal + # it when we finish the processing the headers and then expect the caller + # to have given us a block to call as the content comes in. And of course + # the latter gets stickier with chunks and multiparts. + # + HttpResponseRE = /\AHTTP\/(1.[01]) ([\d]{3})/i + ClenRE = /\AContent-length:\s*(\d+)/i + def process_received_headers + abort_connection unless @current_response.headers.first =~ HttpResponseRE + @current_response.version = $1.dup + st = $2.dup + @current_response.status = st.to_i + abort_connection unless st[0,1] == "2" + + clen = nil + @current_response.headers.each do |e| + if clen == nil and e =~ ClenRE + clen = $1.dup.to_i + end + end + + if clen + set_text_mode clen + end + end + private :process_received_headers + + + def receive_binary_data text + @current_response.content = text + @current_response.deferrable.succeed @current_response + @requests.pop + @current_response = (@requests.last || []).last + set_line_mode + end + + + + # We've received either a server error or an internal error. + # Close the connection and abort any pending requests. + #-- + # When should we call close_connection? It will cause #unbind + # to be fired. Should the user expect to see #unbind before + # we call #receive_http_error, or the other way around? + # + # Set instance variable @closed. That's used to inhibit further + # processing of any inbound data after an error has been recognized. + # + # We shouldn't have to worry about any leftover outbound data, + # because we call close_connection (not close_connection_after_writing). + # That ensures that any pipelined requests received after an error + # DO NOT get streamed out to the server on this connection. + # Very important. TODO, write a unit-test to establish that behavior. + # + def abort_connection + close_connection + @closed = true + @current_response.deferrable.fail( @current_response ) + end + + + #------------------------ + # Below here are user-overridable methods. + + end +=end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/line_and_text.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/line_and_text.rb new file mode 100644 index 000000000000..784daf2fa32d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/line_and_text.rb @@ -0,0 +1,125 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +module EventMachine + module Protocols + # A protocol that handles line-oriented data with interspersed binary text. + # + # This version is optimized for performance. See EventMachine::Protocols::LineText2 + # for a version which is optimized for correctness with regard to binary text blocks + # that can switch back to line mode. + class LineAndTextProtocol < Connection + MaxBinaryLength = 32*1024*1024 + + def initialize *args + super + lbp_init_line_state + end + + def receive_data data + if @lbp_mode == :lines + begin + @lpb_buffer.extract(data).each do |line| + receive_line(line.chomp) if respond_to?(:receive_line) + end + rescue + receive_error('overlength line') if respond_to?(:receive_error) + close_connection + return + end + else + if @lbp_binary_limit > 0 + wanted = @lbp_binary_limit - @lbp_binary_bytes_received + chunk = nil + if data.length > wanted + chunk = data.slice!(0...wanted) + else + chunk = data + data = "" + end + @lbp_binary_buffer[@lbp_binary_bytes_received...(@lbp_binary_bytes_received+chunk.length)] = chunk + @lbp_binary_bytes_received += chunk.length + if @lbp_binary_bytes_received == @lbp_binary_limit + receive_binary_data(@lbp_binary_buffer) if respond_to?(:receive_binary_data) + lbp_init_line_state + end + receive_data(data) if data.length > 0 + else + receive_binary_data(data) if respond_to?(:receive_binary_data) + data = "" + end + end + end + + def unbind + if @lbp_mode == :binary and @lbp_binary_limit > 0 + if respond_to?(:receive_binary_data) + receive_binary_data( @lbp_binary_buffer[0...@lbp_binary_bytes_received] ) + end + end + end + + # Set up to read the supplied number of binary bytes. + # This recycles all the data currently waiting in the line buffer, if any. + # If the limit is nil, then ALL subsequent data will be treated as binary + # data and passed to the upstream protocol handler as we receive it. + # If a limit is given, we'll hold the incoming binary data and not + # pass it upstream until we've seen it all, or until there is an unbind + # (in which case we'll pass up a partial). + # Specifying nil for the limit (the default) means there is no limit. + # Specifiyng zero for the limit will cause an immediate transition back to line mode. + # + def set_binary_mode size = nil + if @lbp_mode == :lines + if size == 0 + receive_binary_data("") if respond_to?(:receive_binary_data) + # Do no more work here. Stay in line mode and keep consuming data. + else + @lbp_binary_limit = size.to_i # (nil will be stored as zero) + if @lbp_binary_limit > 0 + raise "Overlength" if @lbp_binary_limit > MaxBinaryLength # arbitrary sanity check + @lbp_binary_buffer = "\0" * @lbp_binary_limit + @lbp_binary_bytes_received = 0 + end + + @lbp_mode = :binary + receive_data @lpb_buffer.flush + end + else + raise "invalid operation" + end + end + + #-- + # For internal use, establish protocol baseline for handling lines. + def lbp_init_line_state + @lpb_buffer = BufferedTokenizer.new("\n") + @lbp_mode = :lines + end + private :lbp_init_line_state + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/line_protocol.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/line_protocol.rb new file mode 100644 index 000000000000..dfddae8c040e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/line_protocol.rb @@ -0,0 +1,29 @@ +module EventMachine + module Protocols + # LineProtocol will parse out newline terminated strings from a receive_data stream + # + # module Server + # include EM::P::LineProtocol + # + # def receive_line(line) + # send_data("you said: #{line}") + # end + # end + # + module LineProtocol + # @private + def receive_data data + (@buf ||= '') << data + + while @buf.slice!(/(.*?)\r?\n/) + receive_line($1) + end + end + + # Invoked with lines received over the network + def receive_line(line) + # stub + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/linetext2.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/linetext2.rb new file mode 100644 index 000000000000..9fdf28bd3110 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/linetext2.rb @@ -0,0 +1,179 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + # In the grand, time-honored tradition of re-inventing the wheel, we offer + # here YET ANOTHER protocol that handles line-oriented data with interspersed + # binary text. This one trades away some of the performance optimizations of + # EventMachine::Protocols::LineAndTextProtocol in order to get better correctness + # with regard to binary text blocks that can switch back to line mode. It also + # permits the line-delimiter to change in midstream. + # This was originally written to support Stomp. + module LineText2 + # TODO! We're not enforcing the limits on header lengths and text-lengths. + # When we get around to that, call #receive_error if the user defined it, otherwise + # throw exceptions. + + MaxBinaryLength = 32*1024*1024 + + #-- + # Will loop internally until there's no data left to read. + # That way the user-defined handlers we call can modify the + # handling characteristics on a per-token basis. + # + def receive_data data + return unless (data and data.length > 0) + + # Do this stuff in lieu of a constructor. + @lt2_mode ||= :lines + @lt2_delimiter ||= "\n" + @lt2_linebuffer ||= [] + + remaining_data = data + + while remaining_data.length > 0 + if @lt2_mode == :lines + delimiter_string = case @lt2_delimiter + when Regexp + remaining_data.slice(@lt2_delimiter) + else + @lt2_delimiter + end + ix = remaining_data.index(delimiter_string) if delimiter_string + if ix + @lt2_linebuffer << remaining_data[0...ix] + ln = @lt2_linebuffer.join + @lt2_linebuffer.clear + if @lt2_delimiter == "\n" + ln.chomp! + end + receive_line ln + remaining_data = remaining_data[(ix+delimiter_string.length)..-1] + else + @lt2_linebuffer << remaining_data + remaining_data = "" + end + elsif @lt2_mode == :text + if @lt2_textsize + needed = @lt2_textsize - @lt2_textpos + will_take = if remaining_data.length > needed + needed + else + remaining_data.length + end + + @lt2_textbuffer << remaining_data[0...will_take] + tail = remaining_data[will_take..-1] + + @lt2_textpos += will_take + if @lt2_textpos >= @lt2_textsize + # Reset line mode (the default behavior) BEFORE calling the + # receive_binary_data. This makes it possible for user code + # to call set_text_mode, enabling chains of text blocks + # (which can possibly be of different sizes). + set_line_mode + receive_binary_data @lt2_textbuffer.join + receive_end_of_binary_data + end + + remaining_data = tail + else + receive_binary_data remaining_data + remaining_data = "" + end + end + end + end + + # The line delimiter may be a regular expression or a string. Anything + # passed to set_delimiter other than a regular expression will be + # converted to a string. + def set_delimiter delim + @lt2_delimiter = case delim + when Regexp + delim + else + delim.to_s + end + end + + # Called internally but also exposed to user code, for the case in which + # processing of binary data creates a need to transition back to line mode. + # We support an optional parameter to "throw back" some data, which might + # be an umprocessed chunk of the transmitted binary data, or something else + # entirely. + def set_line_mode data="" + @lt2_mode = :lines + (@lt2_linebuffer ||= []).clear + receive_data data.to_s + end + + def set_text_mode size=nil + if size == 0 + set_line_mode + else + @lt2_mode = :text + (@lt2_textbuffer ||= []).clear + @lt2_textsize = size # which can be nil, signifying no limit + @lt2_textpos = 0 + end + end + + # Alias for #set_text_mode, added for back-compatibility with LineAndTextProtocol. + def set_binary_mode size=nil + set_text_mode size + end + + # In case of a dropped connection, we'll send a partial buffer to user code + # when in sized text mode. User overrides of #receive_binary_data need to + # be aware that they may get a short buffer. + def unbind + @lt2_mode ||= nil + if @lt2_mode == :text and @lt2_textpos > 0 + receive_binary_data @lt2_textbuffer.join + end + end + + # Stub. Should be subclassed by user code. + def receive_line ln + # no-op + end + + # Stub. Should be subclassed by user code. + def receive_binary_data data + # no-op + end + + # Stub. Should be subclassed by user code. + # This is called when transitioning internally from text mode + # back to line mode. Useful when client code doesn't want + # to keep track of how much data it's received. + def receive_end_of_binary_data + # no-op + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/memcache.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/memcache.rb new file mode 100644 index 000000000000..1f81aaf9d029 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/memcache.rb @@ -0,0 +1,331 @@ +module EventMachine + module Protocols + # Implements the Memcache protocol (http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt). + # Requires memcached >= 1.2.4 w/ noreply support + # + # == Usage example + # + # EM.run{ + # cache = EM::P::Memcache.connect 'localhost', 11211 + # + # cache.set :a, 'hello' + # cache.set :b, 'hi' + # cache.set :c, 'how are you?' + # cache.set :d, '' + # + # cache.get(:a){ |v| p v } + # cache.get_hash(:a, :b, :c, :d){ |v| p v } + # cache.get(:a,:b,:c,:d){ |a,b,c,d| p [a,b,c,d] } + # + # cache.get(:a,:z,:b,:y,:d){ |a,z,b,y,d| p [a,z,b,y,d] } + # + # cache.get(:missing){ |m| p [:missing=, m] } + # cache.set(:missing, 'abc'){ p :stored } + # cache.get(:missing){ |m| p [:missing=, m] } + # cache.del(:missing){ p :deleted } + # cache.get(:missing){ |m| p [:missing=, m] } + # } + # + module Memcache + include EM::Deferrable + + ## + # constants + + unless defined? Cempty + # @private + Cstored = 'STORED'.freeze + # @private + Cend = 'END'.freeze + # @private + Cdeleted = 'DELETED'.freeze + # @private + Cunknown = 'NOT_FOUND'.freeze + # @private + Cerror = 'ERROR'.freeze + + # @private + Cempty = ''.freeze + # @private + Cdelimiter = "\r\n".freeze + end + + ## + # commands + + # Get the value associated with one or multiple keys + # + # cache.get(:a){ |v| p v } + # cache.get(:a,:b,:c,:d){ |a,b,c,d| p [a,b,c,d] } + # + def get *keys + raise ArgumentError unless block_given? + + callback{ + keys = keys.map{|k| k.to_s.gsub(/\s/,'_') } + send_data "get #{keys.join(' ')}\r\n" + @get_cbs << [keys, proc{ |values| + yield *keys.map{ |k| values[k] } + }] + } + end + + # Set the value for a given key + # + # cache.set :a, 'hello' + # cache.set(:missing, 'abc'){ puts "stored the value!" } + # + def set key, val, exptime = 0, &cb + callback{ + val = val.to_s + send_cmd :set, key, 0, exptime, val.respond_to?(:bytesize) ? val.bytesize : val.size, !block_given? + send_data val + send_data Cdelimiter + @set_cbs << cb if cb + } + end + + # Gets multiple values as a hash + # + # cache.get_hash(:a, :b, :c, :d){ |h| puts h[:a] } + # + def get_hash *keys + raise ArgumentError unless block_given? + + get *keys do |*values| + yield keys.inject({}){ |hash, k| hash.update k => values[keys.index(k)] } + end + end + + # Delete the value associated with a key + # + # cache.del :a + # cache.del(:b){ puts "deleted the value!" } + # + def delete key, expires = 0, &cb + callback{ + send_data "delete #{key} #{expires}#{cb ? '' : ' noreply'}\r\n" + @del_cbs << cb if cb + } + end + alias del delete + + # Connect to a memcached server (must support NOREPLY, memcached >= 1.2.4) + def self.connect host = 'localhost', port = 11211 + EM.connect host, port, self, host, port + end + + def send_cmd cmd, key, flags = 0, exptime = 0, bytes = 0, noreply = false + send_data "#{cmd} #{key} #{flags} #{exptime} #{bytes}#{noreply ? ' noreply' : ''}\r\n" + end + private :send_cmd + + ## + # errors + + # @private + class ParserError < StandardError + end + + ## + # em hooks + + # @private + def initialize host, port = 11211 + @host, @port = host, port + end + + # @private + def connection_completed + @get_cbs = [] + @set_cbs = [] + @del_cbs = [] + + @values = {} + + @reconnecting = false + @connected = true + succeed + # set_delimiter "\r\n" + # set_line_mode + end + + #-- + # 19Feb09 Switched to a custom parser, LineText2 is recursive and can cause + # stack overflows when there is too much data. + # include EM::P::LineText2 + # @private + def receive_data data + (@buffer||='') << data + + while index = @buffer.index(Cdelimiter) + begin + line = @buffer.slice!(0,index+2) + process_cmd line + rescue ParserError + @buffer[0...0] = line + break + end + end + end + + #-- + # def receive_line line + # @private + def process_cmd line + case line.strip + when /^VALUE\s+(.+?)\s+(\d+)\s+(\d+)/ # VALUE <key> <flags> <bytes> + bytes = Integer($3) + # set_binary_mode bytes+2 + # @cur_key = $1 + if @buffer.size >= bytes + 2 + @values[$1] = @buffer.slice!(0,bytes) + @buffer.slice!(0,2) # \r\n + else + raise ParserError + end + + when Cend # END + if entry = @get_cbs.shift + keys, cb = entry + cb.call(@values) + end + @values = {} + + when Cstored # STORED + if cb = @set_cbs.shift + cb.call(true) + end + + when Cdeleted # DELETED + if cb = @del_cbs.shift + cb.call(true) + end + + when Cunknown # NOT_FOUND + if cb = @del_cbs.shift + cb.call(false) + end + + else + p [:MEMCACHE_UNKNOWN, line] + end + end + + #-- + # def receive_binary_data data + # @values[@cur_key] = data[0..-3] + # end + + # @private + def unbind + if @connected or @reconnecting + EM.add_timer(1){ reconnect @host, @port } + @connected = false + @reconnecting = true + @deferred_status = nil + else + raise 'Unable to connect to memcached server' + end + end + end + end +end + +if __FILE__ == $0 + # ruby -I ext:lib -r eventmachine -rubygems lib/protocols/memcache.rb + require 'em/spec' + + # @private + class TestConnection + include EM::P::Memcache + def send_data data + sent_data << data + end + def sent_data + @sent_data ||= '' + end + + def initialize + connection_completed + end + end + + EM.describe EM::Protocols::Memcache do + + before{ + @c = TestConnection.new + } + + should 'send get requests' do + @c.get('a'){} + @c.sent_data.should == "get a\r\n" + done + end + + should 'send set requests' do + @c.set('a', 1){} + @c.sent_data.should == "set a 0 0 1\r\n1\r\n" + done + end + + should 'use noreply on set without block' do + @c.set('a', 1) + @c.sent_data.should == "set a 0 0 1 noreply\r\n1\r\n" + done + end + + should 'send delete requests' do + @c.del('a') + @c.sent_data.should == "delete a 0 noreply\r\n" + done + end + + should 'work when get returns no values' do + @c.get('a'){ |a| + a.should.be.nil + done + } + + @c.receive_data "END\r\n" + end + + should 'invoke block on set' do + @c.set('a', 1){ + done + } + + @c.receive_data "STORED\r\n" + end + + should 'invoke block on delete' do + @c.delete('a'){ |found| + found.should.be.false + } + @c.delete('b'){ |found| + found.should.be.true + done + } + + @c.receive_data "NOT_FOUND\r\n" + @c.receive_data "DELETED\r\n" + end + + should 'parse split responses' do + @c.get('a'){ |a| + a.should == 'abc' + done + } + + @c.receive_data "VAL" + @c.receive_data "UE a 0 " + @c.receive_data "3\r\n" + @c.receive_data "ab" + @c.receive_data "c" + @c.receive_data "\r\n" + @c.receive_data "EN" + @c.receive_data "D\r\n" + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/object_protocol.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/object_protocol.rb new file mode 100644 index 000000000000..ec79cb4a6643 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/object_protocol.rb @@ -0,0 +1,46 @@ +module EventMachine + module Protocols + # ObjectProtocol allows for easy communication using marshaled ruby objects + # + # module RubyServer + # include EM::P::ObjectProtocol + # + # def receive_object obj + # send_object({'you said' => obj}) + # end + # end + # + module ObjectProtocol + # By default returns Marshal, override to return JSON or YAML, or any + # other serializer/deserializer responding to #dump and #load. + def serializer + Marshal + end + + # @private + def receive_data data + (@buf ||= '') << data + + while @buf.size >= 4 + if @buf.size >= 4+(size=@buf.unpack('N').first) + @buf.slice!(0,4) + receive_object serializer.load(@buf.slice!(0,size)) + else + break + end + end + end + + # Invoked with ruby objects received over the network + def receive_object obj + # stub + end + + # Sends a ruby object over the network + def send_object obj + data = serializer.dump(obj) + send_data [data.respond_to?(:bytesize) ? data.bytesize : data.size, data].pack('Na*') + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/postgres3.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/postgres3.rb new file mode 100644 index 000000000000..7d87505c6d9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/postgres3.rb @@ -0,0 +1,246 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-08 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +require 'postgres-pr/message' +require 'postgres-pr/connection' +require 'stringio' + +# @private +class StringIO + # Reads exactly +n+ bytes. + # + # If the data read is nil an EOFError is raised. + # + # If the data read is too short an IOError is raised + def readbytes(n) + str = read(n) + if str == nil + raise EOFError, "End of file reached" + end + if str.size < n + raise IOError, "data truncated" + end + str + end + alias read_exactly_n_bytes readbytes +end + + +module EventMachine + module Protocols + # PROVISIONAL IMPLEMENTATION of an evented Postgres client. + # This implements version 3 of the Postgres wire protocol, which will work + # with any Postgres version from roughly 7.4 onward. + # + # Objective: we want to access Postgres databases without requiring threads. + # Until now this has been a problem because the Postgres client implementations + # have all made use of blocking I/O calls, which is incompatible with a + # thread-free evented model. + # + # But rather than re-implement the Postgres Wire3 protocol, we're taking advantage + # of the existing postgres-pr library, which was originally written by Michael + # Neumann but (at this writing) appears to be no longer maintained. Still, it's + # in basically a production-ready state, and the wire protocol isn't that complicated + # anyway. + # + # We're tucking in a bunch of require statements that may not be present in garden-variety + # EM installations. Until we find a good way to only require these if a program + # requires postgres, this file will need to be required explicitly. + # + # We need to monkeypatch StringIO because it lacks the #readbytes method needed + # by postgres-pr. + # The StringIO monkeypatch is lifted from the standard library readbytes.rb, + # which adds method #readbytes directly to class IO. But StringIO is not a subclass of IO. + # It is modified to raise an IOError instead of TruncatedDataException since the exception is unused. + # + # We cloned the handling of postgres messages from lib/postgres-pr/connection.rb + # in the postgres-pr library, and modified it for event-handling. + # + # TODO: The password handling in dispatch_conn_message is totally incomplete. + # + # + # We return Deferrables from the user-level operations surfaced by this interface. + # Experimentally, we're using the pattern of always returning a boolean value as the + # first argument of a deferrable callback to indicate success or failure. This is + # instead of the traditional pattern of calling Deferrable#succeed or #fail, and + # requiring the user to define both a callback and an errback function. + # + # === Usage + # EM.run { + # db = EM.connect_unix_domain( "/tmp/.s.PGSQL.5432", EM::P::Postgres3 ) + # db.connect( dbname, username, psw ).callback do |status| + # if status + # db.query( "select * from some_table" ).callback do |status, result, errors| + # if status + # result.rows.each do |row| + # p row + # end + # end + # end + # end + # end + # } + class Postgres3 < EventMachine::Connection + include PostgresPR + + def initialize + @data = "" + @params = {} + end + + def connect db, user, psw=nil + d = EM::DefaultDeferrable.new + d.timeout 15 + + if @pending_query || @pending_conn + d.succeed false, "Operation already in progress" + else + @pending_conn = d + prms = {"user"=>user, "database"=>db} + @user = user + if psw + @password = psw + #prms["password"] = psw + end + send_data PostgresPR::StartupMessage.new( 3 << 16, prms ).dump + end + + d + end + + def query sql + d = EM::DefaultDeferrable.new + d.timeout 15 + + if @pending_query || @pending_conn + d.succeed false, "Operation already in progress" + else + @r = PostgresPR::Connection::Result.new + @e = [] + @pending_query = d + send_data PostgresPR::Query.dump(sql) + end + + d + end + + + def receive_data data + @data << data + while @data.length >= 5 + pktlen = @data[1...5].unpack("N").first + if @data.length >= (1 + pktlen) + pkt = @data.slice!(0...(1+pktlen)) + m = StringIO.open( pkt, "r" ) {|io| PostgresPR::Message.read( io ) } + if @pending_conn + dispatch_conn_message m + elsif @pending_query + dispatch_query_message m + else + raise "Unexpected message from database" + end + else + break # very important, break out of the while + end + end + end + + + def unbind + if o = (@pending_query || @pending_conn) + o.succeed false, "lost connection" + end + end + + # Cloned and modified from the postgres-pr. + def dispatch_conn_message msg + case msg + when AuthentificationClearTextPassword + raise ArgumentError, "no password specified" if @password.nil? + send_data PasswordMessage.new(@password).dump + + when AuthentificationCryptPassword + raise ArgumentError, "no password specified" if @password.nil? + send_data PasswordMessage.new(@password.crypt(msg.salt)).dump + + when AuthentificationMD5Password + raise ArgumentError, "no password specified" if @password.nil? + require 'digest/md5' + + m = Digest::MD5.hexdigest(@password + @user) + m = Digest::MD5.hexdigest(m + msg.salt) + m = 'md5' + m + send_data PasswordMessage.new(m).dump + + when AuthentificationKerberosV4, AuthentificationKerberosV5, AuthentificationSCMCredential + raise "unsupported authentification" + + when AuthentificationOk + when ErrorResponse + raise msg.field_values.join("\t") + when NoticeResponse + @notice_processor.call(msg) if @notice_processor + when ParameterStatus + @params[msg.key] = msg.value + when BackendKeyData + # TODO + #p msg + when ReadyForQuery + # TODO: use transaction status + pc,@pending_conn = @pending_conn,nil + pc.succeed true + else + raise "unhandled message type" + end + end + + # Cloned and modified from the postgres-pr. + def dispatch_query_message msg + case msg + when DataRow + @r.rows << msg.columns + when CommandComplete + @r.cmd_tag = msg.cmd_tag + when ReadyForQuery + pq,@pending_query = @pending_query,nil + pq.succeed true, @r, @e + when RowDescription + @r.fields = msg.fields + when CopyInResponse + when CopyOutResponse + when EmptyQueryResponse + when ErrorResponse + # TODO + @e << msg + when NoticeResponse + @notice_processor.call(msg) if @notice_processor + else + # TODO + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/saslauth.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/saslauth.rb new file mode 100644 index 000000000000..9cabc518e6e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/saslauth.rb @@ -0,0 +1,175 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +module EventMachine + module Protocols + + # Implements SASL authd. + # This is a very, very simple protocol that mimics the one used + # by saslauthd and pwcheck, two outboard daemons included in the + # standard SASL library distro. + # The only thing this is really suitable for is SASL PLAIN + # (user+password) authentication, but the SASL libs that are + # linked into standard servers (like imapd and sendmail) implement + # the other ones. + # + # SASL-auth is intended for reasonably fast operation inside a + # single machine, so it has no transport-security (although there + # have been multi-machine extensions incorporating transport-layer + # encryption). + # + # The standard saslauthd module generally runs privileged and does + # its work by referring to the system-account files. + # + # This feature was added to EventMachine to enable the development + # of custom authentication/authorization engines for standard servers. + # + # To use SASLauth, include it in a class that subclasses EM::Connection, + # and reimplement the validate method. + # + # The typical way to incorporate this module into an authentication + # daemon would be to set it as the handler for a UNIX-domain socket. + # The code might look like this: + # + # EM.start_unix_domain_server( "/var/run/saslauthd/mux", MyHandler ) + # File.chmod( 0777, "/var/run/saslauthd/mux") + # + # The chmod is probably needed to ensure that unprivileged clients can + # access the UNIX-domain socket. + # + # It's also a very good idea to drop superuser privileges (if any), after + # the UNIX-domain socket has been opened. + #-- + # Implementation details: assume the client can send us pipelined requests, + # and that the client will close the connection. + # + # The client sends us four values, each encoded as a two-byte length field in + # network order followed by the specified number of octets. + # The fields specify the username, password, service name (such as imap), + # and the "realm" name. We send back the barest minimum reply, a single + # field also encoded as a two-octet length in network order, followed by + # either "NO" or "OK" - simplicity itself. + # + # We enforce a maximum field size just as a sanity check. + # We do NOT automatically time out the connection. + # + # The code we use to parse out the values is ugly and probably slow. + # Improvements welcome. + # + module SASLauth + + MaxFieldSize = 128*1024 + def post_init + super + @sasl_data = "" + @sasl_values = [] + end + + def receive_data data + @sasl_data << data + while @sasl_data.length >= 2 + len = (@sasl_data[0,2].unpack("n")).first + raise "SASL Max Field Length exceeded" if len > MaxFieldSize + if @sasl_data.length >= (len + 2) + @sasl_values << @sasl_data[2,len] + @sasl_data.slice!(0...(2+len)) + if @sasl_values.length == 4 + send_data( validate(*@sasl_values) ? "\0\002OK" : "\0\002NO" ) + @sasl_values.clear + end + else + break + end + end + end + + def validate username, psw, sysname, realm + p username + p psw + p sysname + p realm + true + end + end + + # Implements the SASL authd client protocol. + # This is a very, very simple protocol that mimics the one used + # by saslauthd and pwcheck, two outboard daemons included in the + # standard SASL library distro. + # The only thing this is really suitable for is SASL PLAIN + # (user+password) authentication, but the SASL libs that are + # linked into standard servers (like imapd and sendmail) implement + # the other ones. + # + # You can use this module directly as a handler for EM Connections, + # or include it in a module or handler class of your own. + # + # First connect to a SASL server (it's probably a TCP server, or more + # likely a Unix-domain socket). Then call the #validate? method, + # passing at least a username and a password. #validate? returns + # a Deferrable which will either succeed or fail, depending + # on the status of the authentication operation. + # + module SASLauthclient + MaxFieldSize = 128*1024 + + def validate? username, psw, sysname=nil, realm=nil + + str = [username, psw, sysname, realm].map {|m| + [(m || "").length, (m || "")] + }.flatten.pack( "nA*" * 4 ) + send_data str + + d = EM::DefaultDeferrable.new + @queries.unshift d + d + end + + def post_init + @sasl_data = "" + @queries = [] + end + + def receive_data data + @sasl_data << data + + while @sasl_data.length > 2 + len = (@sasl_data[0,2].unpack("n")).first + raise "SASL Max Field Length exceeded" if len > MaxFieldSize + if @sasl_data.length >= (len + 2) + val = @sasl_data[2,len] + @sasl_data.slice!(0...(2+len)) + q = @queries.pop + (val == "NO") ? q.fail : q.succeed + else + break + end + end + end + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/smtpclient.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/smtpclient.rb new file mode 100644 index 000000000000..25ad17a547b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/smtpclient.rb @@ -0,0 +1,394 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +require 'ostruct' + +module EventMachine + module Protocols + + # Simple SMTP client + # + # @example + # email = EM::Protocols::SmtpClient.send( + # :domain=>"example.com", + # :host=>'localhost', + # :port=>25, # optional, defaults 25 + # :starttls=>true, # use ssl + # :from=>"sender@example.com", + # :to=> ["to_1@example.com", "to_2@example.com"], + # :header=> {"Subject" => "This is a subject line"}, + # :body=> "This is the body of the email" + # ) + # email.callback{ + # puts 'Email sent!' + # } + # email.errback{ |e| + # puts 'Email failed!' + # } + # + # Sending generated emails (using Mail) + # + # mail = Mail.new do + # from 'alice@example.com' + # to 'bob@example.com' + # subject 'This is a test email' + # body 'Hello, world!' + # end + # + # email = EM::P::SmtpClient.send( + # :domain=>'example.com', + # :from=>mail.from.first, + # :to=>mail.to, + # :message=>mail.to_s + # ) + # + class SmtpClient < Connection + include EventMachine::Deferrable + include EventMachine::Protocols::LineText2 + + def initialize + @succeeded = nil + @responder = nil + @code = nil + @msg = nil + end + + # :host => required String + # a string containing the IP address or host name of the SMTP server to connect to. + # :port => optional + # defaults to 25. + # :domain => required String + # This is passed as the argument to the EHLO command. + # :starttls => optional Boolean + # If it evaluates true, then the client will initiate STARTTLS with + # the server, and abort the connection if the negotiation doesn't succeed. + # TODO, need to be able to pass certificate parameters with this option. + # :auth => optional Hash of auth parameters + # If not given, then no auth will be attempted. + # (In that case, the connection will be aborted if the server requires auth.) + # Specify the hash value :type to determine the auth type, along with additional parameters + # depending on the type. + # Currently only :type => :plain is supported. Pass additional parameters :username (String), + # and :password (either a String or a Proc that will be called at auth-time). + # + # @example + # :auth => {:type=>:plain, :username=>"mickey@disney.com", :password=>"mouse"} + # + # :from => required String + # Specifies the sender of the message. Will be passed as the argument + # to the MAIL FROM. Do NOT enclose the argument in angle-bracket (<>) characters. + # The connection will abort if the server rejects the value. + # :to => required String or Array of Strings + # The recipient(s) of the message. Do NOT enclose + # any of the values in angle-brackets (<>) characters. It's NOT a fatal error if one or more + # recipients are rejected by the server. (Of course, if ALL of them are, the server will most + # likely trigger an error when we try to send data.) An array of codes containing the status + # of each requested recipient is available after the call completes. TODO, we should define + # an overridable stub that will be called on rejection of a recipient or a sender, giving + # user code the chance to try again or abort the connection. + # + # One of either :message, :content, or :header and :body is required: + # + # :message => String + # A valid RFC2822 Internet Message. + # :content => String + # Raw data which MUST be in correct SMTP body format, with escaped leading dots and a trailing + # dot line. + # :header => String or Hash of values to be transmitted in the header of the message. + # The hash keys are the names of the headers (do NOT append a trailing colon), and the values + # are strings containing the header values. TODO, support Arrays of header values, which would + # cause us to send that specific header line more than once. + # + # @example + # :header => {"Subject" => "Bogus", "CC" => "myboss@example.com"} + # + # :body => Optional String or Array of Strings, defaults blank. + # This will be passed as the body of the email message. + # TODO, this needs to be significantly beefed up. As currently written, this requires the caller + # to properly format the input into CRLF-delimited lines of 7-bit characters in the standard + # SMTP transmission format. We need to be able to automatically convert binary data, and add + # correct line-breaks to text data. + # + # :verbose => Optional. + # If true, will cause a lot of information (including the server-side of the + # conversation) to be dumped to $>. + # + def self.send args={} + args[:port] ||= 25 + args[:body] ||= "" + +=begin + (I don't think it's possible for EM#connect to throw an exception under normal + circumstances, so this original code is stubbed out. A connect-failure will result + in the #unbind method being called without calling #connection_completed.) + begin + EventMachine.connect( args[:host], args[:port], self) {|c| + # According to the EM docs, we will get here AFTER post_init is called. + c.args = args + c.set_comm_inactivity_timeout 60 + } + rescue + # We'll get here on a connect error. This code mimics the effect + # of a call to invoke_internal_error. Would be great to DRY this up. + # (Actually, it may be that we never get here, if EM#connect catches + # its errors internally.) + d = EM::DefaultDeferrable.new + d.set_deferred_status(:failed, {:error=>[:connect, 500, "unable to connect to server"]}) + d + end +=end + EventMachine.connect( args[:host], args[:port], self) {|c| + # According to the EM docs, we will get here AFTER post_init is called. + c.args = args + c.set_comm_inactivity_timeout 60 + } + end + + attr_writer :args + + # @private + def post_init + @return_values = OpenStruct.new + @return_values.start_time = Time.now + end + + # @private + def connection_completed + @responder = :receive_signon + @msg = [] + end + + # We can get here in a variety of ways, all of them being failures unless + # the @succeeded flag is set. If a protocol success was recorded, then don't + # set a deferred success because the caller will already have done it + # (no need to wait until the connection closes to invoke the callbacks). + # + # @private + def unbind + unless @succeeded + @return_values.elapsed_time = Time.now - @return_values.start_time + @return_values.responder = @responder + @return_values.code = @code + @return_values.message = @msg + set_deferred_status(:failed, @return_values) + end + end + + # @private + def receive_line ln + $>.puts ln if @args[:verbose] + @range = ln[0...1].to_i + @code = ln[0...3].to_i + @msg << ln[4..-1] + unless ln[3...4] == '-' + $>.puts @responder if @args[:verbose] + send @responder + @msg.clear + end + end + + private + + # We encountered an error from the server and will close the connection. + # Use the error and message the server returned. + # + def invoke_error + @return_values.elapsed_time = Time.now - @return_values.start_time + @return_values.responder = @responder + @return_values.code = @code + @return_values.message = @msg + set_deferred_status :failed, @return_values + send_data "QUIT\r\n" + close_connection_after_writing + end + + # We encountered an error on our side of the protocol and will close the connection. + # Use an extra-protocol error code (900) and use the message from the caller. + # + def invoke_internal_error msg = "???" + @return_values.elapsed_time = Time.now - @return_values.start_time + @return_values.responder = @responder + @return_values.code = 900 + @return_values.message = msg + set_deferred_status :failed, @return_values + send_data "QUIT\r\n" + close_connection_after_writing + end + + def send_ehlo + send_data "EHLO #{@args[:domain]}\r\n" + end + + def receive_signon + return invoke_error unless @range == 2 + send_ehlo + @responder = :receive_ehlo_response + end + def receive_ehlo_response + return invoke_error unless @range == 2 + @server_caps = @msg + invoke_starttls + end + + def invoke_starttls + if @args[:starttls] + # It would be more sociable to first ask if @server_caps contains + # the string "STARTTLS" before we invoke it, but hey, life's too short. + send_data "STARTTLS\r\n" + @responder = :receive_starttls_response + else + invoke_auth + end + end + def receive_starttls_response + return invoke_error unless @range == 2 + start_tls + invoke_ehlo_over_tls + end + + def invoke_ehlo_over_tls + send_ehlo + @responder = :receive_ehlo_over_tls_response + end + def receive_ehlo_over_tls_response + return invoke_error unless @range == 2 + invoke_auth + end + + # Perform an authentication. If the caller didn't request one, then fall through + # to the mail-from state. + def invoke_auth + if @args[:auth] + if @args[:auth][:type] == :plain + psw = @args[:auth][:password] + if psw.respond_to?(:call) + psw = psw.call + end + #str = Base64::encode64("\0#{@args[:auth][:username]}\0#{psw}").chomp + str = ["\0#{@args[:auth][:username]}\0#{psw}"].pack("m").gsub(/\n/, '') + send_data "AUTH PLAIN #{str}\r\n" + @responder = :receive_auth_response + else + return invoke_internal_error("unsupported auth type") + end + else + invoke_mail_from + end + end + def receive_auth_response + return invoke_error unless @range == 2 + invoke_mail_from + end + + def invoke_mail_from + send_data "MAIL FROM: <#{@args[:from]}>\r\n" + @responder = :receive_mail_from_response + end + def receive_mail_from_response + return invoke_error unless @range == 2 + invoke_rcpt_to + end + + def invoke_rcpt_to + @rcpt_responses ||= [] + l = @rcpt_responses.length + to = @args[:to].is_a?(Array) ? @args[:to] : [@args[:to].to_s] + if l < to.length + send_data "RCPT TO: <#{to[l]}>\r\n" + @responder = :receive_rcpt_to_response + else + e = @rcpt_responses.select {|rr| rr.last == 2} + if e and e.length > 0 + invoke_data + else + invoke_error + end + end + end + def receive_rcpt_to_response + @rcpt_responses << [@code, @msg, @range] + invoke_rcpt_to + end + + def escape_leading_dots(s) + s.gsub(/^\./, '..') + end + + def invoke_data + send_data "DATA\r\n" + @responder = :receive_data_response + end + def receive_data_response + return invoke_error unless @range == 3 + + # The data to send can be given in either @args[:message], @args[:content], or the + # combination of @args[:header] and @args[:body]. + # + # - @args[:message] (String) MUST be a valid RFC2822 Internet Message + # + # - @args[:content] (String) MUST be in correct SMTP body format, with escaped + # leading dots and a trailing dot line + # + # - @args[:header] (Hash or String) + # - @args[:body] (Array or String) + if @args[:message] + send_data escape_leading_dots(@args[:message].to_s) + send_data "\r\n.\r\n" + elsif @args[:content] + send_data @args[:content].to_s + else + # The header can be a hash or an array. + if @args[:header].is_a?(Hash) + (@args[:header] || {}).each {|k,v| send_data escape_leading_dots("#{k}: #{v}\r\n") } + else + send_data escape_leading_dots(@args[:header].to_s) + end + send_data "\r\n" + + if @args[:body].is_a?(Array) + @args[:body].each {|e| send_data escape_leading_dots(e)} + else + send_data escape_leading_dots(@args[:body].to_s) + end + + send_data "\r\n.\r\n" + end + + @responder = :receive_message_response + end + def receive_message_response + return invoke_error unless @range == 2 + send_data "QUIT\r\n" + close_connection_after_writing + @succeeded = true + @return_values.elapsed_time = Time.now - @return_values.start_time + @return_values.responder = @responder + @return_values.code = @code + @return_values.message = @msg + set_deferred_status :succeeded, @return_values + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/smtpserver.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/smtpserver.rb new file mode 100644 index 000000000000..e0f1f05d944f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/smtpserver.rb @@ -0,0 +1,666 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + module Protocols + + # This is a protocol handler for the server side of SMTP. + # It's NOT a complete SMTP server obeying all the semantics of servers conforming to + # RFC2821. Rather, it uses overridable method stubs to communicate protocol states + # and data to user code. User code is responsible for doing the right things with the + # data in order to get complete and correct SMTP server behavior. + # + # Simple SMTP server example: + # + # class EmailServer < EM::P::SmtpServer + # def receive_plain_auth(user, pass) + # true + # end + # + # def get_server_domain + # "mock.smtp.server.local" + # end + # + # def get_server_greeting + # "mock smtp server greets you with impunity" + # end + # + # def receive_sender(sender) + # current.sender = sender + # true + # end + # + # def receive_recipient(recipient) + # current.recipient = recipient + # true + # end + # + # def receive_message + # current.received = true + # current.completed_at = Time.now + # + # p [:received_email, current] + # @current = OpenStruct.new + # true + # end + # + # def receive_ehlo_domain(domain) + # @ehlo_domain = domain + # true + # end + # + # def receive_data_command + # current.data = "" + # true + # end + # + # def receive_data_chunk(data) + # current.data << data.join("\n") + # true + # end + # + # def receive_transaction + # if @ehlo_domain + # current.ehlo_domain = @ehlo_domain + # @ehlo_domain = nil + # end + # true + # end + # + # def current + # @current ||= OpenStruct.new + # end + # + # def self.start(host = 'localhost', port = 1025) + # require 'ostruct' + # @server = EM.start_server host, port, self + # end + # + # def self.stop + # if @server + # EM.stop_server @server + # @server = nil + # end + # end + # + # def self.running? + # !!@server + # end + # end + # + # EM.run{ EmailServer.start } + # + #-- + # Useful paragraphs in RFC-2821: + # 4.3.2: Concise list of command-reply sequences, in essence a text representation + # of the command state-machine. + # + # STARTTLS is defined in RFC2487. + # Observe that there are important rules governing whether a publicly-referenced server + # (meaning one whose Internet address appears in public MX records) may require the + # non-optional use of TLS. + # Non-optional TLS does not apply to EHLO, NOOP, QUIT or STARTTLS. + class SmtpServer < EventMachine::Connection + include Protocols::LineText2 + + HeloRegex = /\AHELO\s*/i + EhloRegex = /\AEHLO\s*/i + QuitRegex = /\AQUIT/i + MailFromRegex = /\AMAIL FROM:\s*/i + RcptToRegex = /\ARCPT TO:\s*/i + DataRegex = /\ADATA/i + NoopRegex = /\ANOOP/i + RsetRegex = /\ARSET/i + VrfyRegex = /\AVRFY\s+/i + ExpnRegex = /\AEXPN\s+/i + HelpRegex = /\AHELP/i + StarttlsRegex = /\ASTARTTLS/i + AuthRegex = /\AAUTH\s+/i + + + # Class variable containing default parameters that can be overridden + # in application code. + # Individual objects of this class will make an instance-local copy of + # the class variable, so that they can be reconfigured on a per-instance + # basis. + # + # Chunksize is the number of data lines we'll buffer before + # sending them to the application. TODO, make this user-configurable. + # + @@parms = { + :chunksize => 4000, + :verbose => false + } + def self.parms= parms={} + @@parms.merge!(parms) + end + + + + def initialize *args + super + @parms = @@parms + init_protocol_state + end + + def parms= parms={} + @parms.merge!(parms) + end + + # In SMTP, the server talks first. But by a (perhaps flawed) axiom in EM, + # #post_init will execute BEFORE the block passed to #start_server, for any + # given accepted connection. Since in this class we'll probably be getting + # a lot of initialization parameters, we want the guts of post_init to + # run AFTER the application has initialized the connection object. So we + # use a spawn to schedule the post_init to run later. + # It's a little weird, I admit. A reasonable alternative would be to set + # parameters as a class variable and to do that before accepting any connections. + # + # OBSOLETE, now we have @@parms. But the spawn is nice to keep as an illustration. + # + def post_init + #send_data "220 #{get_server_greeting}\r\n" (ORIGINAL) + #(EM.spawn {|x| x.send_data "220 #{x.get_server_greeting}\r\n"}).notify(self) + (EM.spawn {|x| x.send_server_greeting}).notify(self) + end + + def send_server_greeting + send_data "220 #{get_server_greeting}\r\n" + end + + def receive_line ln + @@parms[:verbose] and $>.puts ">>> #{ln}" + + return process_data_line(ln) if @state.include?(:data) + return process_auth_line(ln) if @state.include?(:auth_incomplete) + + case ln + when EhloRegex + process_ehlo $'.dup + when HeloRegex + process_helo $'.dup + when MailFromRegex + process_mail_from $'.dup + when RcptToRegex + process_rcpt_to $'.dup + when DataRegex + process_data + when RsetRegex + process_rset + when VrfyRegex + process_vrfy + when ExpnRegex + process_expn + when HelpRegex + process_help + when NoopRegex + process_noop + when QuitRegex + process_quit + when StarttlsRegex + process_starttls + when AuthRegex + process_auth $'.dup + else + process_unknown + end + end + + # TODO - implement this properly, the implementation is a stub! + def process_help + send_data "250 Ok, but unimplemented\r\n" + end + + # RFC2821, 3.5.3 Meaning of VRFY or EXPN Success Response: + # A server MUST NOT return a 250 code in response to a VRFY or EXPN + # command unless it has actually verified the address. In particular, + # a server MUST NOT return 250 if all it has done is to verify that the + # syntax given is valid. In that case, 502 (Command not implemented) + # or 500 (Syntax error, command unrecognized) SHOULD be returned. + # + # TODO - implement this properly, the implementation is a stub! + def process_vrfy + send_data "502 Command not implemented\r\n" + end + # TODO - implement this properly, the implementation is a stub! + def process_expn + send_data "502 Command not implemented\r\n" + end + + #-- + # This is called at several points to restore the protocol state + # to a pre-transaction state. In essence, we "forget" having seen + # any valid command except EHLO and STARTTLS. + # We also have to callback user code, in case they're keeping track + # of senders, recipients, and whatnot. + # + # We try to follow the convention of avoiding the verb "receive" for + # internal method names except receive_line (which we inherit), and + # using only receive_xxx for user-overridable stubs. + # + # init_protocol_state is called when we initialize the connection as + # well as during reset_protocol_state. It does NOT call the user + # override method. This enables us to promise the users that they + # won't see the overridable fire except after EHLO and RSET, and + # after a message has been received. Although the latter may be wrong. + # The standard may allow multiple DATA segments with the same set of + # senders and recipients. + # + def reset_protocol_state + init_protocol_state + s,@state = @state,[] + @state << :starttls if s.include?(:starttls) + @state << :ehlo if s.include?(:ehlo) + receive_transaction + end + def init_protocol_state + @state ||= [] + end + + + #-- + # EHLO/HELO is always legal, per the standard. On success + # it always clears buffers and initiates a mail "transaction." + # Which means that a MAIL FROM must follow. + # + # Per the standard, an EHLO/HELO or a RSET "initiates" an email + # transaction. Thereafter, MAIL FROM must be received before + # RCPT TO, before DATA. Not sure what this specific ordering + # achieves semantically, but it does make it easier to + # implement. We also support user-specified requirements for + # STARTTLS and AUTH. We make it impossible to proceed to MAIL FROM + # without fulfilling tls and/or auth, if the user specified either + # or both as required. We need to check the extension standard + # for auth to see if a credential is discarded after a RSET along + # with all the rest of the state. We'll behave as if it is. + # Now clearly, we can't discard tls after its been negotiated + # without dropping the connection, so that flag doesn't get cleared. + # + def process_ehlo domain + if receive_ehlo_domain domain + send_data "250-#{get_server_domain}\r\n" + if @@parms[:starttls] + send_data "250-STARTTLS\r\n" + end + if @@parms[:auth] + send_data "250-AUTH PLAIN\r\n" + end + send_data "250-NO-SOLICITING\r\n" + # TODO, size needs to be configurable. + send_data "250 SIZE 20000000\r\n" + reset_protocol_state + @state << :ehlo + else + send_data "550 Requested action not taken\r\n" + end + end + + def process_helo domain + if receive_ehlo_domain domain.dup + send_data "250 #{get_server_domain}\r\n" + reset_protocol_state + @state << :ehlo + else + send_data "550 Requested action not taken\r\n" + end + end + + def process_quit + send_data "221 Ok\r\n" + close_connection_after_writing + end + + def process_noop + send_data "250 Ok\r\n" + end + + def process_unknown + send_data "500 Unknown command\r\n" + end + + #-- + # So far, only AUTH PLAIN is supported but we should do at least LOGIN as well. + # TODO, support clients that send AUTH PLAIN with no parameter, expecting a 3xx + # response and a continuation of the auth conversation. + # + def process_auth str + if @state.include?(:auth) + send_data "503 auth already issued\r\n" + elsif str =~ /\APLAIN\s?/i + if $'.length == 0 + # we got a partial response, so let the client know to send the rest + @state << :auth_incomplete + send_data("334 \r\n") + else + # we got the initial response, so go ahead & process it + process_auth_line($') + end + #elsif str =~ /\ALOGIN\s+/i + else + send_data "504 auth mechanism not available\r\n" + end + end + + def process_auth_line(line) + plain = line.unpack("m").first + _,user,psw = plain.split("\000") + + succeeded = proc { + send_data "235 authentication ok\r\n" + @state << :auth + } + failed = proc { + send_data "535 invalid authentication\r\n" + } + auth = receive_plain_auth user,psw + + if auth.respond_to?(:callback) + auth.callback(&succeeded) + auth.errback(&failed) + else + (auth ? succeeded : failed).call + end + + @state.delete :auth_incomplete + end + + #-- + # Unusually, we can deal with a Deferrable returned from the user application. + # This was added to deal with a special case in a particular application, but + # it would be a nice idea to add it to the other user-code callbacks. + # + def process_data + unless @state.include?(:rcpt) + send_data "503 Operation sequence error\r\n" + else + succeeded = proc { + send_data "354 Send it\r\n" + @state << :data + @databuffer = [] + } + failed = proc { + send_data "550 Operation failed\r\n" + } + + d = receive_data_command + + if d.respond_to?(:callback) + d.callback(&succeeded) + d.errback(&failed) + else + (d ? succeeded : failed).call + end + end + end + + def process_rset + reset_protocol_state + receive_reset + send_data "250 Ok\r\n" + end + + def unbind + connection_ended + end + + #-- + # STARTTLS may not be issued before EHLO, or unless the user has chosen + # to support it. + # + # If :starttls_options is present and :starttls is set in the parms + # pass the options in :starttls_options to start_tls. Do this if you want to use + # your own certificate + # e.g. {:cert_chain_file => "/etc/ssl/cert.pem", :private_key_file => "/etc/ssl/private/cert.key"} + + def process_starttls + if @@parms[:starttls] + if @state.include?(:starttls) + send_data "503 TLS Already negotiated\r\n" + elsif ! @state.include?(:ehlo) + send_data "503 EHLO required before STARTTLS\r\n" + else + send_data "220 Start TLS negotiation\r\n" + start_tls(@@parms[:starttls_options] || {}) + @state << :starttls + end + else + process_unknown + end + end + + + #-- + # Requiring TLS is touchy, cf RFC2784. + # Requiring AUTH seems to be much more reasonable. + # We don't currently support any notion of deriving an authentication from the TLS + # negotiation, although that would certainly be reasonable. + # We DON'T allow MAIL FROM to be given twice. + # We DON'T enforce all the various rules for validating the sender or + # the reverse-path (like whether it should be null), and notifying the reverse + # path in case of delivery problems. All of that is left to the calling application. + # + def process_mail_from sender + if (@@parms[:starttls]==:required and !@state.include?(:starttls)) + send_data "550 This server requires STARTTLS before MAIL FROM\r\n" + elsif (@@parms[:auth]==:required and !@state.include?(:auth)) + send_data "550 This server requires authentication before MAIL FROM\r\n" + elsif @state.include?(:mail_from) + send_data "503 MAIL already given\r\n" + else + unless receive_sender sender + send_data "550 sender is unacceptable\r\n" + else + send_data "250 Ok\r\n" + @state << :mail_from + end + end + end + + #-- + # Since we require :mail_from to have been seen before we process RCPT TO, + # we don't need to repeat the tests for TLS and AUTH. + # Note that we don't remember or do anything else with the recipients. + # All of that is on the user code. + # TODO: we should enforce user-definable limits on the total number of + # recipients per transaction. + # We might want to make sure that a given recipient is only seen once, but + # for now we'll let that be the user's problem. + # + # User-written code can return a deferrable from receive_recipient. + # + def process_rcpt_to rcpt + unless @state.include?(:mail_from) + send_data "503 MAIL is required before RCPT\r\n" + else + succeeded = proc { + send_data "250 Ok\r\n" + @state << :rcpt unless @state.include?(:rcpt) + } + failed = proc { + send_data "550 recipient is unacceptable\r\n" + } + + d = receive_recipient rcpt + + if d.respond_to?(:set_deferred_status) + d.callback(&succeeded) + d.errback(&failed) + else + (d ? succeeded : failed).call + end + +=begin + unless receive_recipient rcpt + send_data "550 recipient is unacceptable\r\n" + else + send_data "250 Ok\r\n" + @state << :rcpt unless @state.include?(:rcpt) + end +=end + end + end + + + # Send the incoming data to the application one chunk at a time, rather than + # one line at a time. That lets the application be a little more flexible about + # storing to disk, etc. + # Since we clear the chunk array every time we submit it, the caller needs to be + # aware to do things like dup it if he wants to keep it around across calls. + # + # Resets the transaction upon disposition of the incoming message. + # RFC5321 says this about the MAIL FROM command: + # "This command tells the SMTP-receiver that a new mail transaction is + # starting and to reset all its state tables and buffers, including any + # recipients or mail data." + # + # Equivalent behaviour is implemented by resetting after a completed transaction. + # + # User-written code can return a Deferrable as a response from receive_message. + # + def process_data_line ln + if ln == "." + if @databuffer.length > 0 + receive_data_chunk @databuffer + @databuffer.clear + end + + + succeeded = proc { + send_data "250 Message accepted\r\n" + reset_protocol_state + } + failed = proc { + send_data "550 Message rejected\r\n" + reset_protocol_state + } + d = receive_message + + if d.respond_to?(:set_deferred_status) + d.callback(&succeeded) + d.errback(&failed) + else + (d ? succeeded : failed).call + end + + @state.delete :data + else + # slice off leading . if any + ln.slice!(0...1) if ln[0] == ?. + @databuffer << ln + if @databuffer.length > @@parms[:chunksize] + receive_data_chunk @databuffer + @databuffer.clear + end + end + end + + + #------------------------------------------ + # Everything from here on can be overridden in user code. + + # The greeting returned in the initial connection message to the client. + def get_server_greeting + "EventMachine SMTP Server" + end + # The domain name returned in the first line of the response to a + # successful EHLO or HELO command. + def get_server_domain + "Ok EventMachine SMTP Server" + end + + # A false response from this user-overridable method will cause a + # 550 error to be returned to the remote client. + # + def receive_ehlo_domain domain + true + end + + # Return true or false to indicate that the authentication is acceptable. + def receive_plain_auth user, password + true + end + + # Receives the argument of the MAIL FROM command. Return false to + # indicate to the remote client that the sender is not accepted. + # This can only be successfully called once per transaction. + # + def receive_sender sender + true + end + + # Receives the argument of a RCPT TO command. Can be given multiple + # times per transaction. Return false to reject the recipient. + # + def receive_recipient rcpt + true + end + + # Sent when the remote peer issues the RSET command. + # Since RSET is not allowed to fail (according to the protocol), + # we ignore any return value from user overrides of this method. + # + def receive_reset + end + + # Sent when the remote peer has ended the connection. + # + def connection_ended + end + + # Called when the remote peer sends the DATA command. + # Returning false will cause us to send a 550 error to the peer. + # This can be useful for dealing with problems that arise from processing + # the whole set of sender and recipients. + # + def receive_data_command + true + end + + # Sent when data from the remote peer is available. The size can be controlled + # by setting the :chunksize parameter. This call can be made multiple times. + # The goal is to strike a balance between sending the data to the application one + # line at a time, and holding all of a very large message in memory. + # + def receive_data_chunk data + @smtps_msg_size ||= 0 + @smtps_msg_size += data.join.length + STDERR.write "<#{@smtps_msg_size}>" + end + + # Sent after a message has been completely received. User code + # must return true or false to indicate whether the message has + # been accepted for delivery. + def receive_message + @@parms[:verbose] and $>.puts "Received complete message" + true + end + + # This is called when the protocol state is reset. It happens + # when the remote client calls EHLO/HELO or RSET. + def receive_transaction + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/socks4.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/socks4.rb new file mode 100644 index 000000000000..132f32099e25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/socks4.rb @@ -0,0 +1,66 @@ +module EventMachine + module Protocols + # Basic SOCKS v4 client implementation + # + # Use as you would any regular connection: + # + # class MyConn < EM::P::Socks4 + # def post_init + # send_data("sup") + # end + # + # def receive_data(data) + # send_data("you said: #{data}") + # end + # end + # + # EM.connect socks_host, socks_port, MyConn, host, port + # + class Socks4 < Connection + def initialize(host, port) + @host = Socket.gethostbyname(host).last + @port = port + @socks_error_code = nil + @buffer = '' + setup_methods + end + + def setup_methods + class << self + def post_init; socks_post_init; end + def receive_data(*a); socks_receive_data(*a); end + end + end + + def restore_methods + class << self + remove_method :post_init + remove_method :receive_data + end + end + + def socks_post_init + header = [4, 1, @port, @host, 0].flatten.pack("CCnA4C") + send_data(header) + end + + def socks_receive_data(data) + @buffer << data + return if @buffer.size < 8 + + header_resp = @buffer.slice! 0, 8 + _, r = header_resp.unpack("cc") + if r != 90 + @socks_error_code = r + close_connection + return + end + + restore_methods + + post_init + receive_data(@buffer) unless @buffer.empty? + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/stomp.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/stomp.rb new file mode 100644 index 000000000000..ca6f078edfc1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/stomp.rb @@ -0,0 +1,205 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 15 November 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +module EventMachine + module Protocols + + # Implements Stomp (http://docs.codehaus.org/display/STOMP/Protocol). + # + # == Usage example + # + # module StompClient + # include EM::Protocols::Stomp + # + # def connection_completed + # connect :login => 'guest', :passcode => 'guest' + # end + # + # def receive_msg msg + # if msg.command == "CONNECTED" + # subscribe '/some/topic' + # else + # p ['got a message', msg] + # puts msg.body + # end + # end + # end + # + # EM.run{ + # EM.connect 'localhost', 61613, StompClient + # } + # + module Stomp + include LineText2 + + class Message + # The command associated with the message, usually 'CONNECTED' or 'MESSAGE' + attr_accessor :command + # Hash containing headers such as destination and message-id + attr_accessor :header + alias :headers :header + # Body of the message + attr_accessor :body + + # @private + def initialize + @header = {} + @state = :precommand + @content_length = nil + end + # @private + def consume_line line + if @state == :precommand + unless line =~ /\A\s*\Z/ + @command = line + @state = :headers + end + elsif @state == :headers + if line == "" + if @content_length + yield( [:sized_text, @content_length+1] ) + else + @state = :body + yield( [:unsized_text] ) + end + elsif line =~ /\A([^:]+):(.+)\Z/ + k = $1.dup.strip + v = $2.dup.strip + @header[k] = v + if k == "content-length" + @content_length = v.to_i + end + else + # This is a protocol error. How to signal it? + end + elsif @state == :body + @body = line + yield( [:dispatch] ) + end + end + end + + # @private + def send_frame verb, headers={}, body="" + body = body.to_s + ary = [verb, "\n"] + body_bytesize = body.bytesize if body.respond_to? :bytesize + body_bytesize ||= body.size + headers.each {|k,v| ary << "#{k}:#{v}\n" } + ary << "content-length: #{body_bytesize}\n" + ary << "content-type: text/plain; charset=UTF-8\n" unless headers.has_key? 'content-type' + ary << "\n" + ary << body + ary << "\0" + send_data ary.join + end + + # @private + def receive_line line + @stomp_initialized || init_message_reader + @stomp_message.consume_line(line) {|outcome| + if outcome.first == :sized_text + set_text_mode outcome[1] + elsif outcome.first == :unsized_text + set_delimiter "\0" + elsif outcome.first == :dispatch + receive_msg(@stomp_message) if respond_to?(:receive_msg) + init_message_reader + end + } + end + + # @private + def receive_binary_data data + @stomp_message.body = data[0..-2] + receive_msg(@stomp_message) if respond_to?(:receive_msg) + init_message_reader + end + + # @private + def init_message_reader + @stomp_initialized = true + set_delimiter "\n" + set_line_mode + @stomp_message = Message.new + end + + # Invoked with an incoming Stomp::Message received from the STOMP server + def receive_msg msg + # stub, overwrite this in your handler + end + + # CONNECT command, for authentication + # + # connect :login => 'guest', :passcode => 'guest' + # + def connect parms={} + send_frame "CONNECT", parms + end + + # SEND command, for publishing messages to a topic + # + # send '/topic/name', 'some message here' + # + def send destination, body, parms={} + send_frame "SEND", parms.merge( :destination=>destination ), body.to_s + end + + # SUBSCRIBE command, for subscribing to topics + # + # subscribe '/topic/name', false + # + def subscribe dest, ack=false + send_frame "SUBSCRIBE", {:destination=>dest, :ack=>(ack ? "client" : "auto")} + end + + # ACK command, for acknowledging receipt of messages + # + # module StompClient + # include EM::P::Stomp + # + # def connection_completed + # connect :login => 'guest', :passcode => 'guest' + # # subscribe with ack mode + # subscribe '/some/topic', true + # end + # + # def receive_msg msg + # if msg.command == "MESSAGE" + # ack msg.headers['message-id'] + # puts msg.body + # end + # end + # end + # + def ack msgid + send_frame "ACK", 'message-id'=> msgid + end + + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/tcptest.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/tcptest.rb new file mode 100644 index 000000000000..318789303ec8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/protocols/tcptest.rb @@ -0,0 +1,54 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 16 July 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# +# + +module EventMachine + module Protocols + + # @private + class TcpConnectTester < Connection + include EventMachine::Deferrable + + def self.test( host, port ) + EventMachine.connect( host, port, self ) + end + + def post_init + @start_time = Time.now + end + + def connection_completed + @completed = true + set_deferred_status :succeeded, (Time.now - @start_time) + close_connection + end + + def unbind + set_deferred_status :failed, (Time.now - @start_time) unless @completed + end + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/pure_ruby.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/pure_ruby.rb new file mode 100644 index 000000000000..94fd17548f52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/pure_ruby.rb @@ -0,0 +1,1284 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 8 Apr 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#------------------------------------------------------------------- +# +# + +# TODO List: +# TCP-connects currently assume non-blocking connect is available- need to +# degrade automatically on versions of Ruby prior to June 2006. +# + +require 'singleton' +require 'forwardable' +require 'socket' +require 'fcntl' +require 'set' +require 'openssl' + +module EventMachine + # @private + class Error < Exception; end + # @private + class UnknownTimerFired < RuntimeError; end + # @private + class Unsupported < RuntimeError; end + # @private + class ConnectionError < RuntimeError; end + # @private + class ConnectionNotBound < RuntimeError; end + + # Older versions of Ruby may not provide the SSLErrorWaitReadable + # OpenSSL class. Create an error class to act as a "proxy". + if defined?(OpenSSL::SSL::SSLErrorWaitReadable) + SSLConnectionWaitReadable = OpenSSL::SSL::SSLErrorWaitReadable + else + SSLConnectionWaitReadable = IO::WaitReadable + end + + # Older versions of Ruby may not provide the SSLErrorWaitWritable + # OpenSSL class. Create an error class to act as a "proxy". + if defined?(OpenSSL::SSL::SSLErrorWaitWritable) + SSLConnectionWaitWritable = OpenSSL::SSL::SSLErrorWaitWritable + else + SSLConnectionWaitWritable = IO::WaitWritable + end +end + +module EventMachine + class CertificateCreator + attr_reader :cert, :key + + def initialize + @key = OpenSSL::PKey::RSA.new(1024) + public_key = @key.public_key + subject = "/C=EventMachine/O=EventMachine/OU=EventMachine/CN=EventMachine" + @cert = OpenSSL::X509::Certificate.new + @cert.subject = @cert.issuer = OpenSSL::X509::Name.parse(subject) + @cert.not_before = Time.now + @cert.not_after = Time.now + 365 * 24 * 60 * 60 + @cert.public_key = public_key + @cert.serial = 0x0 + @cert.version = 2 + factory = OpenSSL::X509::ExtensionFactory.new + factory.subject_certificate = @cert + factory.issuer_certificate = @cert + @cert.extensions = [ + factory.create_extension("basicConstraints","CA:TRUE", true), + factory.create_extension("subjectKeyIdentifier", "hash") + ] + @cert.add_extension factory.create_extension("authorityKeyIdentifier", "keyid:always,issuer:always") + @cert.sign(@key, OpenSSL::Digest::SHA1.new) + end + end + + # @private + DefaultCertificate = CertificateCreator.new + + # @private + DefaultDHKey1024 = OpenSSL::PKey::DH.new <<-_end_of_pem_ +-----BEGIN DH PARAMETERS----- +MIGHAoGBAJ0lOVy0VIr/JebWn0zDwY2h+rqITFOpdNr6ugsgvkDXuucdcChhYExJ +AV/ZD2AWPbrTqV76mGRgJg4EddgT1zG0jq3rnFdMj2XzkBYx3BVvfR0Arnby0RHR +T4h7KZ/2zmjvV+eF8kBUHBJAojUlzxKj4QeO2x20FP9X5xmNUXeDAgEC +-----END DH PARAMETERS----- + _end_of_pem_ + + # @private + DefaultDHKey2048 = OpenSSL::PKey::DH.new <<-_end_of_pem_ +-----BEGIN DH PARAMETERS----- +MIIBCAKCAQEA7E6kBrYiyvmKAMzQ7i8WvwVk9Y/+f8S7sCTN712KkK3cqd1jhJDY +JbrYeNV3kUIKhPxWHhObHKpD1R84UpL+s2b55+iMd6GmL7OYmNIT/FccKhTcveab +VBmZT86BZKYyf45hUF9FOuUM9xPzuK3Vd8oJQvfYMCd7LPC0taAEljQLR4Edf8E6 +YoaOffgTf5qxiwkjnlVZQc3whgnEt9FpVMvQ9eknyeGB5KHfayAc3+hUAvI3/Cr3 +1bNveX5wInh5GDx1FGhKBZ+s1H+aedudCm7sCgRwv8lKWYGiHzObSma8A86KG+MD +7Lo5JquQ3DlBodj3IDyPrxIv96lvRPFtAwIBAg== +-----END DH PARAMETERS----- + _end_of_pem_ +end + +# @private +module EventMachine + class << self + # This is mostly useful for automated tests. + # Return a distinctive symbol so the caller knows whether he's dealing + # with an extension or with a pure-Ruby library. + # @private + def library_type + :pure_ruby + end + + # @private + def initialize_event_machine + Reactor.instance.initialize_for_run + end + + # Changed 04Oct06: intervals from the caller are now in milliseconds, but our native-ruby + # processor still wants them in seconds. + # @private + def add_oneshot_timer interval + Reactor.instance.install_oneshot_timer(interval / 1000) + end + + # @private + def run_machine + Reactor.instance.run + end + + # @private + def release_machine + end + + + def stopping? + return Reactor.instance.stop_scheduled + end + + # @private + def stop + Reactor.instance.stop + end + + # @private + def connect_server host, port + bind_connect_server nil, nil, host, port + end + + # @private + def bind_connect_server bind_addr, bind_port, host, port + EvmaTCPClient.connect(bind_addr, bind_port, host, port).uuid + end + + # @private + def send_data target, data, datalength + selectable = Reactor.instance.get_selectable( target ) or raise "unknown send_data target" + selectable.send_data data + end + + # @private + def close_connection target, after_writing + selectable = Reactor.instance.get_selectable( target ) + selectable.schedule_close after_writing if selectable + end + + # @private + def start_tcp_server host, port + (s = EvmaTCPServer.start_server host, port) or raise "no acceptor" + s.uuid + end + + # @private + def stop_tcp_server sig + s = Reactor.instance.get_selectable(sig) + s.schedule_close + end + + # @private + def start_unix_server chain + (s = EvmaUNIXServer.start_server chain) or raise "no acceptor" + s.uuid + end + + # @private + def connect_unix_server chain + EvmaUNIXClient.connect(chain).uuid + end + + # @private + def signal_loopbreak + Reactor.instance.signal_loopbreak + end + + # @private + def get_peername sig + selectable = Reactor.instance.get_selectable( sig ) or raise "unknown get_peername target" + selectable.get_peername + end + + # @private + def get_sockname sig + selectable = Reactor.instance.get_selectable( sig ) or raise "unknown get_sockname target" + selectable.get_sockname + end + + # @private + def open_udp_socket host, port + EvmaUDPSocket.create(host, port).uuid + end + + # This is currently only for UDP! + # We need to make it work with unix-domain sockets as well. + # @private + def send_datagram target, data, datalength, host, port + selectable = Reactor.instance.get_selectable( target ) or raise "unknown send_data target" + selectable.send_datagram data, Socket::pack_sockaddr_in(port, host) + end + + + # Sets reactor quantum in milliseconds. The underlying Reactor function wants a (possibly + # fractional) number of seconds. + # @private + def set_timer_quantum interval + Reactor.instance.set_timer_quantum(( 1.0 * interval) / 1000.0) + end + + # This method is a harmless no-op in the pure-Ruby implementation. This is intended to ensure + # that user code behaves properly across different EM implementations. + # @private + def epoll + end + + # @private + def ssl? + true + end + + def tls_parm_set?(parm) + !(parm.nil? || parm.empty?) + end + + # This method takes a series of positional arguments for specifying such + # things as private keys and certificate chains. It's expected that the + # parameter list will grow as we add more supported features. ALL of these + # parameters are optional, and can be specified as empty or nil strings. + # @private + def set_tls_parms signature, priv_key, cert_chain, verify_peer, fail_if_no_peer_cert, sni_hostname, cipher_list, ecdh_curve, dhparam, protocols_bitmask + bitmask = protocols_bitmask + ssl_options = OpenSSL::SSL::OP_ALL + ssl_options |= OpenSSL::SSL::OP_NO_SSLv2 if defined?(OpenSSL::SSL::OP_NO_SSLv2) && EM_PROTO_SSLv2 & bitmask == 0 + ssl_options |= OpenSSL::SSL::OP_NO_SSLv3 if defined?(OpenSSL::SSL::OP_NO_SSLv3) && EM_PROTO_SSLv3 & bitmask == 0 + ssl_options |= OpenSSL::SSL::OP_NO_TLSv1 if defined?(OpenSSL::SSL::OP_NO_TLSv1) && EM_PROTO_TLSv1 & bitmask == 0 + ssl_options |= OpenSSL::SSL::OP_NO_TLSv1_1 if defined?(OpenSSL::SSL::OP_NO_TLSv1_1) && EM_PROTO_TLSv1_1 & bitmask == 0 + ssl_options |= OpenSSL::SSL::OP_NO_TLSv1_2 if defined?(OpenSSL::SSL::OP_NO_TLSv1_2) && EM_PROTO_TLSv1_2 & bitmask == 0 + @tls_parms ||= {} + @tls_parms[signature] = { + :verify_peer => verify_peer, + :fail_if_no_peer_cert => fail_if_no_peer_cert, + :ssl_options => ssl_options + } + @tls_parms[signature][:priv_key] = File.read(priv_key) if tls_parm_set?(priv_key) + @tls_parms[signature][:cert_chain] = File.read(cert_chain) if tls_parm_set?(cert_chain) + @tls_parms[signature][:sni_hostname] = sni_hostname if tls_parm_set?(sni_hostname) + @tls_parms[signature][:cipher_list] = cipher_list.gsub(/,\s*/, ':') if tls_parm_set?(cipher_list) + @tls_parms[signature][:dhparam] = File.read(dhparam) if tls_parm_set?(dhparam) + @tls_parms[signature][:ecdh_curve] = ecdh_curve if tls_parm_set?(ecdh_curve) + end + + def start_tls signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown io selectable for start_tls" + tls_parms = @tls_parms[signature] + ctx = OpenSSL::SSL::SSLContext.new + ctx.options = tls_parms[:ssl_options] + ctx.cert = DefaultCertificate.cert + ctx.key = DefaultCertificate.key + ctx.cert_store = OpenSSL::X509::Store.new + ctx.cert_store.set_default_paths + ctx.cert = OpenSSL::X509::Certificate.new(tls_parms[:cert_chain]) if tls_parms[:cert_chain] + ctx.key = OpenSSL::PKey::RSA.new(tls_parms[:priv_key]) if tls_parms[:priv_key] + verify_mode = OpenSSL::SSL::VERIFY_NONE + if tls_parms[:verify_peer] + verify_mode |= OpenSSL::SSL::VERIFY_PEER + end + if tls_parms[:fail_if_no_peer_cert] + verify_mode |= OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT + end + ctx.verify_mode = verify_mode + ctx.servername_cb = Proc.new do |_, server_name| + tls_parms[:server_name] = server_name + nil + end + ctx.ciphers = tls_parms[:cipher_list] if tls_parms[:cipher_list] + if selectable.is_server + ctx.tmp_dh_callback = Proc.new do |_, _, key_length| + if tls_parms[:dhparam] + OpenSSL::PKey::DH.new(tls_parms[:dhparam]) + else + case key_length + when 1024 then DefaultDHKey1024 + when 2048 then DefaultDHKey2048 + else + nil + end + end + end + if tls_parms[:ecdh_curve] && ctx.respond_to?(:tmp_ecdh_callback) + ctx.tmp_ecdh_callback = Proc.new do + OpenSSL::PKey::EC.new(tls_parms[:ecdh_curve]) + end + end + end + ssl_io = OpenSSL::SSL::SSLSocket.new(selectable, ctx) + ssl_io.sync_close = true + if tls_parms[:sni_hostname] + ssl_io.hostname = tls_parms[:sni_hostname] if ssl_io.respond_to?(:hostname=) + end + begin + selectable.is_server ? ssl_io.accept_nonblock : ssl_io.connect_nonblock + rescue; end + selectable.io = ssl_io + end + + def get_peer_cert signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown get_peer_cert target" + if selectable.io.respond_to?(:peer_cert) && selectable.io.peer_cert + selectable.io.peer_cert.to_pem + else + nil + end + end + + def get_cipher_name signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown get_cipher_name target" + selectable.io.respond_to?(:cipher) ? selectable.io.cipher[0] : nil + end + + def get_cipher_protocol signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown get_cipher_protocol target" + selectable.io.respond_to?(:cipher) ? selectable.io.cipher[1] : nil + end + + def get_cipher_bits signature + selectable = Reactor.instance.get_selectable(signature) or raise "unknown get_cipher_bits target" + selectable.io.respond_to?(:cipher) ? selectable.io.cipher[2] : nil + end + + def get_sni_hostname signature + @tls_parms ||= {} + if @tls_parms[signature] + @tls_parms[signature][:server_name] + else + nil + end + end + + # This method is a no-op in the pure-Ruby implementation. We simply return Ruby's built-in + # per-process file-descriptor limit. + # @private + def set_rlimit_nofile n + 1024 + end + + # This method is a harmless no-op in pure Ruby, which doesn't have a built-in limit + # on the number of available timers. + # @private + def set_max_timer_count n + end + + # @private + def get_sock_opt signature, level, optname + selectable = Reactor.instance.get_selectable( signature ) or raise "unknown get_sock_opt target" + selectable.getsockopt level, optname + end + + # @private + def set_sock_opt signature, level, optname, optval + selectable = Reactor.instance.get_selectable( signature ) or raise "unknown set_sock_opt target" + selectable.setsockopt level, optname, optval + end + + # @private + def send_file_data sig, filename + sz = File.size(filename) + raise "file too large" if sz > 32*1024 + data = + begin + File.read filename + rescue + "" + end + send_data sig, data, data.length + end + + # @private + def get_outbound_data_size sig + r = Reactor.instance.get_selectable( sig ) or raise "unknown get_outbound_data_size target" + r.get_outbound_data_size + end + + # @private + def read_keyboard + EvmaKeyboard.open.uuid + end + + # @private + def set_comm_inactivity_timeout sig, tm + r = Reactor.instance.get_selectable( sig ) or raise "unknown set_comm_inactivity_timeout target" + r.set_inactivity_timeout tm + end + + # @private + def set_pending_connect_timeout sig, tm + # Needs to be implemented. Currently a no-op stub to allow + # certain software to operate with the EM pure-ruby. + end + + # @private + def report_connection_error_status signature + get_sock_opt(signature, Socket::SOL_SOCKET, Socket::SO_ERROR).int + end + end +end + +module EventMachine + # @private + class Connection + # @private + def get_outbound_data_size + EventMachine::get_outbound_data_size @signature + end + end +end + +module EventMachine + + # Factored out so we can substitute other implementations + # here if desired, such as the one in ActiveRBAC. + # @private + module UuidGenerator + def self.generate + @ix ||= 0 + @ix += 1 + end + end +end + + +module EventMachine + # @private + TimerFired = 100 + # @private + ConnectionData = 101 + # @private + ConnectionUnbound = 102 + # @private + ConnectionAccepted = 103 + # @private + ConnectionCompleted = 104 + # @private + LoopbreakSignalled = 105 + # @private + ConnectionNotifyReadable = 106 + # @private + ConnectionNotifyWritable = 107 + # @private + SslHandshakeCompleted = 108 + # @private + SslVerify = 109 + # @private + EM_PROTO_SSLv2 = 2 + # @private + EM_PROTO_SSLv3 = 4 + # @private + EM_PROTO_TLSv1 = 8 + # @private + EM_PROTO_TLSv1_1 = 16 + # @private + EM_PROTO_TLSv1_2 = 32 +end + +module EventMachine + # @private + class Reactor + include Singleton + + HeartbeatInterval = 2 + + attr_reader :current_loop_time, :stop_scheduled + + def initialize + initialize_for_run + end + + def install_oneshot_timer interval + uuid = UuidGenerator::generate + #@timers << [Time.now + interval, uuid] + #@timers.sort! {|a,b| a.first <=> b.first} + @timers.add([Time.now + interval, uuid]) + uuid + end + + # Called before run, this is a good place to clear out arrays + # with cruft that may be left over from a previous run. + # @private + def initialize_for_run + @running = false + @stop_scheduled = false + @selectables ||= {}; @selectables.clear + @timers = SortedSet.new # [] + set_timer_quantum(0.1) + @current_loop_time = Time.now + @next_heartbeat = @current_loop_time + HeartbeatInterval + end + + def add_selectable io + @selectables[io.uuid] = io + end + + def get_selectable uuid + @selectables[uuid] + end + + def run + raise Error.new( "already running" ) if @running + @running = true + + begin + open_loopbreaker + + loop { + @current_loop_time = Time.now + + break if @stop_scheduled + run_timers + break if @stop_scheduled + crank_selectables + break if @stop_scheduled + run_heartbeats + } + ensure + close_loopbreaker + @selectables.each {|k, io| io.close} + @selectables.clear + + @running = false + end + + end + + def run_timers + @timers.each {|t| + if t.first <= @current_loop_time + @timers.delete t + EventMachine::event_callback "", TimerFired, t.last + else + break + end + } + #while @timers.length > 0 and @timers.first.first <= now + # t = @timers.shift + # EventMachine::event_callback "", TimerFired, t.last + #end + end + + def run_heartbeats + if @next_heartbeat <= @current_loop_time + @next_heartbeat = @current_loop_time + HeartbeatInterval + @selectables.each {|k,io| io.heartbeat} + end + end + + def crank_selectables + #$stderr.write 'R' + + readers = @selectables.values.select {|io| io.select_for_reading?} + writers = @selectables.values.select {|io| io.select_for_writing?} + + s = select( readers, writers, nil, @timer_quantum) + + s and s[1] and s[1].each {|w| w.eventable_write } + s and s[0] and s[0].each {|r| r.eventable_read } + + @selectables.delete_if {|k,io| + if io.close_scheduled? + io.close + begin + EventMachine::event_callback io.uuid, ConnectionUnbound, nil + rescue ConnectionNotBound; end + true + end + } + end + + # #stop + def stop + raise Error.new( "not running") unless @running + @stop_scheduled = true + end + + def open_loopbreaker + # Can't use an IO.pipe because they can't be set nonselectable in Windows. + # Pick a random localhost UDP port. + #@loopbreak_writer.close if @loopbreak_writer + #rd,@loopbreak_writer = IO.pipe + @loopbreak_reader = UDPSocket.new + @loopbreak_writer = UDPSocket.new + bound = false + 100.times { + @loopbreak_port = rand(10000) + 40000 + begin + @loopbreak_reader.bind "127.0.0.1", @loopbreak_port + bound = true + break + rescue + end + } + raise "Unable to bind Loopbreaker" unless bound + LoopbreakReader.new(@loopbreak_reader) + end + + def close_loopbreaker + @loopbreak_writer.close + @loopbreak_writer = nil + end + + def signal_loopbreak + begin + @loopbreak_writer.send('+',0,"127.0.0.1",@loopbreak_port) if @loopbreak_writer + rescue IOError; end + end + + def set_timer_quantum interval_in_seconds + @timer_quantum = interval_in_seconds + end + + end + +end + +# @private +class IO + extend Forwardable + def_delegator :@my_selectable, :close_scheduled? + def_delegator :@my_selectable, :select_for_reading? + def_delegator :@my_selectable, :select_for_writing? + def_delegator :@my_selectable, :eventable_read + def_delegator :@my_selectable, :eventable_write + def_delegator :@my_selectable, :uuid + def_delegator :@my_selectable, :is_server + def_delegator :@my_selectable, :is_server= + def_delegator :@my_selectable, :send_data + def_delegator :@my_selectable, :schedule_close + def_delegator :@my_selectable, :get_peername + def_delegator :@my_selectable, :get_sockname + def_delegator :@my_selectable, :send_datagram + def_delegator :@my_selectable, :get_outbound_data_size + def_delegator :@my_selectable, :set_inactivity_timeout + def_delegator :@my_selectable, :heartbeat + def_delegator :@my_selectable, :io + def_delegator :@my_selectable, :io= +end + +module EventMachine + # @private + class Selectable + + attr_accessor :io, :is_server + attr_reader :uuid + + def initialize io + @io = io + @uuid = UuidGenerator.generate + @is_server = false + @last_activity = Reactor.instance.current_loop_time + + if defined?(Fcntl::F_GETFL) + m = @io.fcntl(Fcntl::F_GETFL, 0) + @io.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | m) + else + # Windows doesn't define F_GETFL. + # It's not very reliable about setting descriptors nonblocking either. + begin + s = Socket.for_fd(@io.fileno) + s.fcntl( Fcntl::F_SETFL, Fcntl::O_NONBLOCK ) + rescue Errno::EINVAL, Errno::EBADF + warn "Serious error: unable to set descriptor non-blocking" + end + end + # TODO, should set CLOEXEC on Unix? + + @close_scheduled = false + @close_requested = false + + se = self; @io.instance_eval { @my_selectable = se } + Reactor.instance.add_selectable @io + end + + def close_scheduled? + @close_scheduled + end + + def select_for_reading? + false + end + + def select_for_writing? + false + end + + def get_peername + nil + end + + def get_sockname + nil + end + + def set_inactivity_timeout tm + @inactivity_timeout = tm + end + + def heartbeat + end + + def schedule_close(after_writing=false) + if after_writing + @close_requested = true + else + @close_scheduled = true + end + end + end + +end + +module EventMachine + # @private + class StreamObject < Selectable + def initialize io + super io + @outbound_q = [] + end + + # If we have to close, or a close-after-writing has been requested, + # then don't read any more data. + def select_for_reading? + true unless (@close_scheduled || @close_requested) + end + + # If we have to close, don't select for writing. + # Otherwise, see if the protocol is ready to close. + # If not, see if he has data to send. + # If a close-after-writing has been requested and the outbound queue + # is empty, convert the status to close_scheduled. + def select_for_writing? + unless @close_scheduled + if @outbound_q.empty? + @close_scheduled = true if @close_requested + false + else + true + end + end + end + + # Proper nonblocking I/O was added to Ruby 1.8.4 in May 2006. + # If we have it, then we can read multiple times safely to improve + # performance. + # The last-activity clock ASSUMES that we only come here when we + # have selected readable. + # TODO, coalesce multiple reads into a single event. + # TODO, do the function check somewhere else and cache it. + def eventable_read + @last_activity = Reactor.instance.current_loop_time + begin + if io.respond_to?(:read_nonblock) + 10.times { + data = io.read_nonblock(4096) + EventMachine::event_callback uuid, ConnectionData, data + } + else + data = io.sysread(4096) + EventMachine::event_callback uuid, ConnectionData, data + end + rescue Errno::EAGAIN, Errno::EWOULDBLOCK, SSLConnectionWaitReadable + # no-op + rescue Errno::ECONNRESET, Errno::ECONNREFUSED, EOFError, Errno::EPIPE, OpenSSL::SSL::SSLError + @close_scheduled = true + EventMachine::event_callback uuid, ConnectionUnbound, nil + end + + end + + # Provisional implementation. Will be re-implemented in subclasses. + # TODO: Complete this implementation. As it stands, this only writes + # a single packet per cycle. Highly inefficient, but required unless + # we're running on a Ruby with proper nonblocking I/O (Ruby 1.8.4 + # built from sources from May 25, 2006 or newer). + # We need to improve the loop so it writes multiple times, however + # not more than a certain number of bytes per cycle, otherwise + # one busy connection could hog output buffers and slow down other + # connections. Also we should coalesce small writes. + # URGENT TODO: Coalesce small writes. They are a performance killer. + # The last-activity recorder ASSUMES we'll only come here if we've + # selected writable. + def eventable_write + # coalesce the outbound array here, perhaps + @last_activity = Reactor.instance.current_loop_time + while data = @outbound_q.shift do + begin + data = data.to_s + w = if io.respond_to?(:write_nonblock) + io.write_nonblock data + else + io.syswrite data + end + + if w < data.length + @outbound_q.unshift data[w..-1] + break + end + rescue Errno::EAGAIN, SSLConnectionWaitReadable, SSLConnectionWaitWritable + @outbound_q.unshift data + break + rescue EOFError, Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EPIPE, OpenSSL::SSL::SSLError + @close_scheduled = true + @outbound_q.clear + end + end + + end + + # #send_data + def send_data data + # TODO, coalesce here perhaps by being smarter about appending to @outbound_q.last? + unless @close_scheduled or @close_requested or !data or data.length <= 0 + @outbound_q << data.to_s + end + end + + # #get_peername + # This is defined in the normal way on connected stream objects. + # Return an object that is suitable for passing to Socket#unpack_sockaddr_in or variants. + # We could also use a convenience method that did the unpacking automatically. + def get_peername + io.getpeername + end + + # #get_sockname + # This is defined in the normal way on connected stream objects. + # Return an object that is suitable for passing to Socket#unpack_sockaddr_in or variants. + # We could also use a convenience method that did the unpacking automatically. + def get_sockname + io.getsockname + end + + # #get_outbound_data_size + def get_outbound_data_size + @outbound_q.inject(0) {|memo,obj| memo += (obj || "").length} + end + + def heartbeat + if @inactivity_timeout and @inactivity_timeout > 0 and (@last_activity + @inactivity_timeout) < Reactor.instance.current_loop_time + schedule_close true + end + end + end + + +end + + +#-------------------------------------------------------------- + + + +module EventMachine + # @private + class EvmaTCPClient < StreamObject + + def self.connect bind_addr, bind_port, host, port + sd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 ) + sd.bind( Socket.pack_sockaddr_in( bind_port, bind_addr )) if bind_addr + + begin + # TODO, this assumes a current Ruby snapshot. + # We need to degrade to a nonblocking connect otherwise. + sd.connect_nonblock( Socket.pack_sockaddr_in( port, host )) + rescue Errno::ECONNREFUSED, Errno::EINPROGRESS + end + EvmaTCPClient.new sd + end + + def initialize io + super + @pending = true + @handshake_complete = false + end + + def ready? + if RUBY_PLATFORM =~ /linux/ + io.getsockopt(Socket::SOL_TCP, Socket::TCP_INFO).unpack("i").first == 1 # TCP_ESTABLISHED + else + io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first == 0 # NO ERROR + end + end + + def handshake_complete? + if !@handshake_complete && io.respond_to?(:state) + if io.state =~ /^SSLOK/ + @handshake_complete = true + EventMachine::event_callback uuid, SslHandshakeCompleted, "" + EventMachine::event_callback uuid, SslVerify, io.peer_cert.to_pem if io.peer_cert + end + else + @handshake_complete = true + end + @handshake_complete + end + + def pending? + handshake_complete? + if @pending + if ready? + @pending = false + EventMachine::event_callback uuid, ConnectionCompleted, "" + end + end + @pending + end + + def select_for_writing? + pending? + super + end + + def select_for_reading? + pending? + super + end + end +end + + + +module EventMachine + # @private + class EvmaKeyboard < StreamObject + + def self.open + EvmaKeyboard.new STDIN + end + + + def initialize io + super + end + + + def select_for_writing? + false + end + + def select_for_reading? + true + end + + + end +end + + + +module EventMachine + # @private + class EvmaUNIXClient < StreamObject + + def self.connect chain + sd = Socket.new( Socket::AF_LOCAL, Socket::SOCK_STREAM, 0 ) + begin + # TODO, this assumes a current Ruby snapshot. + # We need to degrade to a nonblocking connect otherwise. + sd.connect_nonblock( Socket.pack_sockaddr_un( chain )) + rescue Errno::EINPROGRESS + end + EvmaUNIXClient.new sd + end + + + def initialize io + super + @pending = true + end + + + def select_for_writing? + @pending ? true : super + end + + def select_for_reading? + @pending ? false : super + end + + def eventable_write + if @pending + @pending = false + if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first + EventMachine::event_callback uuid, ConnectionCompleted, "" + end + else + super + end + end + + + + end +end + + +#-------------------------------------------------------------- + +module EventMachine + # @private + class EvmaTCPServer < Selectable + + # TODO, refactor and unify with EvmaUNIXServer. + + class << self + # Versions of ruby 1.8.4 later than May 26 2006 will work properly + # with an object of type TCPServer. Prior versions won't so we + # play it safe and just build a socket. + # + def start_server host, port + sd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 ) + sd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true ) + sd.bind( Socket.pack_sockaddr_in( port, host )) + sd.listen( 50 ) # 5 is what you see in all the books. Ain't enough. + EvmaTCPServer.new sd + end + end + + def initialize io + super io + end + + + def select_for_reading? + true + end + + #-- + # accept_nonblock returns an array consisting of the accepted + # socket and a sockaddr_in which names the peer. + # Don't accept more than 10 at a time. + def eventable_read + begin + 10.times { + descriptor,peername = io.accept_nonblock + sd = EvmaTCPClient.new descriptor + sd.is_server = true + EventMachine::event_callback uuid, ConnectionAccepted, sd.uuid + } + rescue Errno::EWOULDBLOCK, Errno::EAGAIN + end + end + + #-- + # + def schedule_close + @close_scheduled = true + end + + end +end + + +#-------------------------------------------------------------- + +module EventMachine + # @private + class EvmaUNIXServer < Selectable + + # TODO, refactor and unify with EvmaTCPServer. + + class << self + # Versions of ruby 1.8.4 later than May 26 2006 will work properly + # with an object of type TCPServer. Prior versions won't so we + # play it safe and just build a socket. + # + def start_server chain + sd = Socket.new( Socket::AF_LOCAL, Socket::SOCK_STREAM, 0 ) + sd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true ) + sd.bind( Socket.pack_sockaddr_un( chain )) + sd.listen( 50 ) # 5 is what you see in all the books. Ain't enough. + EvmaUNIXServer.new sd + end + end + + def initialize io + super io + end + + + def select_for_reading? + true + end + + #-- + # accept_nonblock returns an array consisting of the accepted + # socket and a sockaddr_in which names the peer. + # Don't accept more than 10 at a time. + def eventable_read + begin + 10.times { + descriptor,peername = io.accept_nonblock + sd = StreamObject.new descriptor + EventMachine::event_callback uuid, ConnectionAccepted, sd.uuid + } + rescue Errno::EWOULDBLOCK, Errno::EAGAIN + end + end + + #-- + # + def schedule_close + @close_scheduled = true + end + + end +end + + + +#-------------------------------------------------------------- + +module EventMachine + # @private + class LoopbreakReader < Selectable + + def select_for_reading? + true + end + + def eventable_read + io.sysread(128) + EventMachine::event_callback "", LoopbreakSignalled, "" + end + + end +end + + + +# @private +module EventMachine + # @private + class DatagramObject < Selectable + def initialize io + super io + @outbound_q = [] + end + + # #send_datagram + def send_datagram data, target + # TODO, coalesce here perhaps by being smarter about appending to @outbound_q.last? + unless @close_scheduled or @close_requested + @outbound_q << [data.to_s, target] + end + end + + # #select_for_writing? + def select_for_writing? + unless @close_scheduled + if @outbound_q.empty? + @close_scheduled = true if @close_requested + false + else + true + end + end + end + + # #select_for_reading? + def select_for_reading? + true + end + + # #get_outbound_data_size + def get_outbound_data_size + @outbound_q.inject(0) {|memo,obj| memo += (obj || "").length} + end + + + end + + +end + + +module EventMachine + # @private + class EvmaUDPSocket < DatagramObject + + class << self + def create host, port + sd = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 ) + sd.bind Socket::pack_sockaddr_in( port, host ) + EvmaUDPSocket.new sd + end + end + + # #eventable_write + # This really belongs in DatagramObject, but there is some UDP-specific stuff. + def eventable_write + 40.times { + break if @outbound_q.empty? + begin + data,target = @outbound_q.first + + # This damn better be nonblocking. + io.send data.to_s, 0, target + + @outbound_q.shift + rescue Errno::EAGAIN + # It's not been observed in testing that we ever get here. + # True to the definition, packets will be accepted and quietly dropped + # if the system is under pressure. + break + rescue EOFError, Errno::ECONNRESET + @close_scheduled = true + @outbound_q.clear + end + } + end + + # Proper nonblocking I/O was added to Ruby 1.8.4 in May 2006. + # If we have it, then we can read multiple times safely to improve + # performance. + def eventable_read + begin + if io.respond_to?(:recvfrom_nonblock) + 40.times { + data,@return_address = io.recvfrom_nonblock(16384) + EventMachine::event_callback uuid, ConnectionData, data + @return_address = nil + } + else + raise "unimplemented datagram-read operation on this Ruby" + end + rescue Errno::EAGAIN + # no-op + rescue Errno::ECONNRESET, EOFError + @close_scheduled = true + EventMachine::event_callback uuid, ConnectionUnbound, nil + end + end + + def send_data data + send_datagram data, @return_address + end + end +end + +# load base EM api on top, now that we have the underlying pure ruby +# implementation defined +require 'eventmachine' diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/queue.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/queue.rb new file mode 100644 index 000000000000..9096ed029bd0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/queue.rb @@ -0,0 +1,80 @@ +module EventMachine + # A cross thread, reactor scheduled, linear queue. + # + # This class provides a simple queue abstraction on top of the reactor + # scheduler. It services two primary purposes: + # + # * API sugar for stateful protocols + # * Pushing processing onto the reactor thread + # + # @example + # + # q = EM::Queue.new + # q.push('one', 'two', 'three') + # 3.times do + # q.pop { |msg| puts(msg) } + # end + # + class Queue + def initialize + @sink = [] + @drain = [] + @popq = [] + end + + # Pop items off the queue, running the block on the reactor thread. The pop + # will not happen immediately, but at some point in the future, either in + # the next tick, if the queue has data, or when the queue is populated. + # + # @return [NilClass] nil + def pop(*a, &b) + cb = EM::Callback(*a, &b) + EM.schedule do + if @drain.empty? + @drain = @sink + @sink = [] + end + if @drain.empty? + @popq << cb + else + cb.call @drain.shift + end + end + nil # Always returns nil + end + + # Push items onto the queue in the reactor thread. The items will not appear + # in the queue immediately, but will be scheduled for addition during the + # next reactor tick. + def push(*items) + EM.schedule do + @sink.push(*items) + unless @popq.empty? + @drain = @sink + @sink = [] + @popq.shift.call @drain.shift until @drain.empty? || @popq.empty? + end + end + end + alias :<< :push + + # @return [Boolean] + # @note This is a peek, it's not thread safe, and may only tend toward accuracy. + def empty? + @drain.empty? && @sink.empty? + end + + # @return [Integer] Queue size + # @note This is a peek, it's not thread safe, and may only tend toward accuracy. + def size + @drain.size + @sink.size + end + + # @return [Integer] Waiting size + # @note This is a peek at the number of jobs that are currently waiting on the Queue + def num_waiting + @popq.size + end + + end # Queue +end # EventMachine diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/resolver.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/resolver.rb new file mode 100644 index 000000000000..1d2d7aa0278d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/resolver.rb @@ -0,0 +1,232 @@ +module EventMachine + module DNS + class Resolver + + def self.windows? + if RUBY_PLATFORM =~ /mswin32|cygwin|mingw|bccwin/ + require 'win32/resolv' + true + else + false + end + end + + HOSTS_FILE = windows? ? Win32::Resolv.get_hosts_path : '/etc/hosts' + + @hosts = nil + @nameservers = nil + @socket = nil + + def self.resolve(hostname) + Request.new(socket, hostname) + end + + def self.socket + if @socket && @socket.error? + @socket = Socket.open + else + @socket ||= Socket.open + end + end + + def self.nameservers=(ns) + @nameservers = ns + end + + def self.nameservers + return @nameservers if @nameservers + + if windows? + _, ns = Win32::Resolv.get_resolv_info + return @nameservers = ns || [] + end + + @nameservers = [] + IO.readlines('/etc/resolv.conf').each do |line| + if line =~ /^nameserver (.+)$/ + @nameservers << $1.split(/\s+/).first + end + end + + @nameservers + rescue + @nameservers = [] + end + + def self.nameserver + nameservers.shuffle.first + end + + def self.hosts + return @hosts if @hosts + + @hosts = {} + IO.readlines(HOSTS_FILE).each do |line| + next if line =~ /^#/ + addr, host = line.split(/\s+/) + + next unless addr && host + @hosts[host] ||= [] + @hosts[host] << addr + end + + @hosts + rescue + @hosts = {} + end + end + + class RequestIdAlreadyUsed < RuntimeError; end + + class Socket < EventMachine::Connection + def self.open + EventMachine::open_datagram_socket('0.0.0.0', 0, self) + end + + def initialize + @nameserver = nil + end + + def post_init + @requests = {} + end + + def start_timer + @timer ||= EM.add_periodic_timer(0.1, &method(:tick)) + end + + def stop_timer + EM.cancel_timer(@timer) + @timer = nil + end + + def unbind + end + + def tick + @requests.each do |id,req| + req.tick + end + end + + def register_request(id, req) + if @requests.has_key?(id) + raise RequestIdAlreadyUsed + else + @requests[id] = req + end + + start_timer + end + + def deregister_request(id, req) + @requests.delete(id) + stop_timer if @requests.length == 0 + end + + def send_packet(pkt) + send_datagram(pkt, nameserver, 53) + end + + def nameserver=(ns) + @nameserver = ns + end + + def nameserver + @nameserver || Resolver.nameserver + end + + # Decodes the packet, looks for the request and passes the + # response over to the requester + def receive_data(data) + msg = nil + begin + msg = Resolv::DNS::Message.decode data + rescue + else + req = @requests[msg.id] + if req + @requests.delete(msg.id) + stop_timer if @requests.length == 0 + req.receive_answer(msg) + end + end + end + end + + class Request + include Deferrable + attr_accessor :retry_interval, :max_tries + + def initialize(socket, hostname) + @socket = socket + @hostname = hostname + @tries = 0 + @last_send = Time.at(0) + @retry_interval = 3 + @max_tries = 5 + + if addrs = Resolver.hosts[hostname] + succeed addrs + else + EM.next_tick { tick } + end + end + + def tick + # Break early if nothing to do + return if @last_send + @retry_interval > Time.now + if @tries < @max_tries + send + else + @socket.deregister_request(@id, self) + fail 'retries exceeded' + end + end + + def receive_answer(msg) + addrs = [] + msg.each_answer do |name,ttl,data| + if data.kind_of?(Resolv::DNS::Resource::IN::A) || + data.kind_of?(Resolv::DNS::Resource::IN::AAAA) + addrs << data.address.to_s + end + end + + if addrs.empty? + fail "rcode=#{msg.rcode}" + else + succeed addrs + end + end + + private + + def send + @tries += 1 + @last_send = Time.now + @socket.send_packet(packet.encode) + end + + def id + begin + @id = rand(65535) + @socket.register_request(@id, self) + rescue RequestIdAlreadyUsed + retry + end unless defined?(@id) + + @id + end + + def packet + msg = Resolv::DNS::Message.new + msg.id = id + msg.rd = 1 + msg.add_question @hostname, Resolv::DNS::Resource::IN::A + msg + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/spawnable.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/spawnable.rb new file mode 100644 index 000000000000..35c087d0684d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/spawnable.rb @@ -0,0 +1,84 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 25 Aug 2007 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +module EventMachine + # Support for Erlang-style processes. + # + class SpawnedProcess + # Send a message to the spawned process + def notify *x + me = self + EM.next_tick { + # A notification executes in the context of this + # SpawnedProcess object. That makes self and notify + # work as one would expect. + # + y = me.call(*x) + if y and y.respond_to?(:pull_out_yield_block) + a,b = y.pull_out_yield_block + set_receiver a + self.notify if b + end + } + end + alias_method :resume, :notify + alias_method :run, :notify # for formulations like (EM.spawn {xxx}).run + + def set_receiver blk + (class << self ; self ; end).class_eval do + remove_method :call if method_defined? :call + define_method :call, blk + end + end + + end + + # @private + class YieldBlockFromSpawnedProcess + def initialize block, notify + @block = [block,notify] + end + def pull_out_yield_block + @block + end + end + + # Spawn an erlang-style process + def self.spawn &block + s = SpawnedProcess.new + s.set_receiver block + s + end + + # @private + def self.yield &block + return YieldBlockFromSpawnedProcess.new( block, false ) + end + + # @private + def self.yield_and_notify &block + return YieldBlockFromSpawnedProcess.new( block, true ) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/streamer.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/streamer.rb new file mode 100644 index 000000000000..cf49c8836768 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/streamer.rb @@ -0,0 +1,118 @@ +module EventMachine + # Streams a file over a given connection. Streaming begins once the object is + # instantiated. Typically FileStreamer instances are not reused. + # + # Streaming uses buffering for files larger than 16K and uses so-called fast file reader (a C++ extension) + # if available (it is part of eventmachine gem itself). + # + # @example + # + # module FileSender + # def post_init + # streamer = EventMachine::FileStreamer.new(self, '/tmp/bigfile.tar') + # streamer.callback{ + # # file was sent successfully + # close_connection_after_writing + # } + # end + # end + # + # + # @author Francis Cianfrocca + class FileStreamer + include Deferrable + + # Use mapped streamer for files bigger than 16k + MappingThreshold = 16384 + # Wait until next tick to send more data when 50k is still in the outgoing buffer + BackpressureLevel = 50000 + # Send 16k chunks at a time + ChunkSize = 16384 + + # @param [EventMachine::Connection] connection + # @param [String] filename File path + # + # @option args [Boolean] :http_chunks (false) Use HTTP 1.1 style chunked-encoding semantics. + def initialize connection, filename, args = {} + @connection = connection + @http_chunks = args[:http_chunks] + + if File.exist?(filename) + @size = File.size(filename) + if @size <= MappingThreshold + stream_without_mapping filename + else + stream_with_mapping filename + end + else + fail "file not found" + end + end + + # @private + def stream_without_mapping filename + if @http_chunks + @connection.send_data "#{@size.to_s(16)}\r\n" + @connection.send_file_data filename + @connection.send_data "\r\n0\r\n\r\n" + else + @connection.send_file_data filename + end + succeed + end + private :stream_without_mapping + + # @private + def stream_with_mapping filename + ensure_mapping_extension_is_present + + @position = 0 + @mapping = EventMachine::FastFileReader::Mapper.new filename + stream_one_chunk + end + private :stream_with_mapping + + # Used internally to stream one chunk at a time over multiple reactor ticks + # @private + def stream_one_chunk + loop { + if @position < @size + if @connection.get_outbound_data_size > BackpressureLevel + EventMachine::next_tick {stream_one_chunk} + break + else + len = @size - @position + len = ChunkSize if (len > ChunkSize) + + @connection.send_data( "#{len.to_s(16)}\r\n" ) if @http_chunks + @connection.send_data( @mapping.get_chunk( @position, len )) + @connection.send_data("\r\n") if @http_chunks + + @position += len + end + else + @connection.send_data "0\r\n\r\n" if @http_chunks + @mapping.close + succeed + break + end + } + end + + # + # We use an outboard extension class to get memory-mapped files. + # It's outboard to avoid polluting the core distro, but that means + # there's a "hidden" dependency on it. The first time we get here in + # any run, try to load up the dependency extension. User code will see + # a LoadError if it's not available, but code that doesn't require + # mapped files will work fine without it. This is a somewhat difficult + # compromise between usability and proper modularization. + # + # @private + def ensure_mapping_extension_is_present + @@fastfilereader ||= (require 'fastfilereaderext') + end + private :ensure_mapping_extension_is_present + + end # FileStreamer +end # EventMachine diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/threaded_resource.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/threaded_resource.rb new file mode 100644 index 000000000000..87704d5f59d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/threaded_resource.rb @@ -0,0 +1,90 @@ +module EventMachine + # = EventMachine::ThreadedResource + # + # A threaded resource is a "quick and dirty" wrapper around the concept of + # wiring up synchronous code into a standard EM::Pool. This is useful to keep + # interfaces coherent and provide a simple approach at "making an interface + # async-ish". + # + # General usage is to wrap libraries that do not support EventMachine, or to + # have a specific number of dedicated high-cpu worker resources. + # + # == Basic Usage example + # + # This example requires the cassandra gem. The cassandra gem contains an + # EventMachine interface, but it's sadly Fiber based and thus only works on + # 1.9. It also requires (potentially) complex stack switching logic to reach + # completion of nested operations. By contrast this approach provides a block + # in which normal synchronous code can occur, but makes no attempt to wire the + # IO into EventMachines C++ IO implementations, instead relying on the reactor + # pattern in rb_thread_select. + # + # cassandra_dispatcher = ThreadedResource.new do + # Cassandra.new('allthethings', '127.0.0.1:9160') + # end + # + # pool = EM::Pool.new + # + # pool.add cassandra_dispatcher + # + # # If we don't care about the result: + # pool.perform do |dispatcher| + # # The following block executes inside a dedicated thread, and should not + # # access EventMachine things: + # dispatcher.dispatch do |cassandra| + # cassandra.insert(:Things, '10', 'stuff' => 'things') + # end + # end + # + # # Example where we care about the result: + # pool.perform do |dispatcher| + # # The dispatch block is executed in the resources thread. + # completion = dispatcher.dispatch do |cassandra| + # cassandra.get(:Things, '10', 'stuff') + # end + # + # # This block will be yielded on the EM thread: + # completion.callback do |result| + # EM.do_something_with(result) + # end + # + # completion + # end + class ThreadedResource + + # The block should return the resource that will be yielded in a dispatch. + def initialize + @resource = yield + + @running = true + @queue = ::Queue.new + @thread = Thread.new do + @queue.pop.call while @running + end + end + + # Called on the EM thread, generally in a perform block to return a + # completion for the work. + def dispatch + completion = EM::Completion.new + @queue << lambda do + begin + result = yield @resource + completion.succeed result + rescue => e + completion.fail e + end + end + completion + end + + # Kill the internal thread. should only be used to cleanup - generally + # only required for tests. + def shutdown + @running = false + @queue << lambda {} + @thread.join + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/tick_loop.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/tick_loop.rb new file mode 100644 index 000000000000..a95d51614d33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/tick_loop.rb @@ -0,0 +1,85 @@ +module EventMachine + # Creates and immediately starts an EventMachine::TickLoop + def self.tick_loop(*a, &b) + TickLoop.new(*a, &b).start + end + + # A TickLoop is useful when one needs to distribute amounts of work + # throughout ticks in order to maintain response times. It is also useful for + # simple repeated checks and metrics. + # @example + # # Here we run through an array one item per tick until it is empty, + # # printing each element. + # # When the array is empty, we return :stop from the callback, and the + # # loop will terminate. + # # When the loop terminates, the on_stop callbacks will be called. + # EM.run do + # array = (1..100).to_a + # + # tickloop = EM.tick_loop do + # if array.empty? + # :stop + # else + # puts array.shift + # end + # end + # + # tickloop.on_stop { EM.stop } + # end + # + class TickLoop + + # Arguments: A callback (EM::Callback) to call each tick. If the call + # returns +:stop+ then the loop will be stopped. Any other value is + # ignored. + def initialize(*a, &b) + @work = EM::Callback(*a, &b) + @stops = [] + @stopped = true + end + + # Arguments: A callback (EM::Callback) to call once on the next stop (or + # immediately if already stopped). + def on_stop(*a, &b) + if @stopped + EM::Callback(*a, &b).call + else + @stops << EM::Callback(*a, &b) + end + end + + # Stop the tick loop immediately, and call it's on_stop callbacks. + def stop + @stopped = true + until @stops.empty? + @stops.shift.call + end + end + + # Query if the loop is stopped. + def stopped? + @stopped + end + + # Start the tick loop, will raise argument error if the loop is already + # running. + def start + raise ArgumentError, "double start" unless @stopped + @stopped = false + schedule + end + + private + def schedule + EM.next_tick do + next if @stopped + if @work.call == :stop + stop + else + schedule + end + end + self + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/timers.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/timers.rb new file mode 100644 index 000000000000..41cd9595b89e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/timers.rb @@ -0,0 +1,61 @@ +module EventMachine + # Creates a one-time timer + # + # timer = EventMachine::Timer.new(5) do + # # this will never fire because we cancel it + # end + # timer.cancel + # + class Timer + # Create a new timer that fires after a given number of seconds + def initialize interval, callback=nil, &block + @signature = EventMachine::add_timer(interval, callback || block) + end + + # Cancel the timer + def cancel + EventMachine.send :cancel_timer, @signature + end + end + + # Creates a periodic timer + # + # @example + # n = 0 + # timer = EventMachine::PeriodicTimer.new(5) do + # puts "the time is #{Time.now}" + # timer.cancel if (n+=1) > 5 + # end + # + class PeriodicTimer + # Create a new periodic timer that executes every interval seconds + def initialize interval, callback=nil, &block + @interval = interval + @code = callback || block + @cancelled = false + @work = method(:fire) + schedule + end + + # Cancel the periodic timer + def cancel + @cancelled = true + end + + # Fire the timer every interval seconds + attr_accessor :interval + + # @private + def schedule + EventMachine::add_timer @interval, @work + end + + # @private + def fire + unless @cancelled + @code.call + schedule + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/version.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/version.rb new file mode 100644 index 000000000000..ffc431033421 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/em/version.rb @@ -0,0 +1,3 @@ +module EventMachine + VERSION = "1.2.7" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/eventmachine.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/eventmachine.rb new file mode 100644 index 000000000000..087374769083 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/eventmachine.rb @@ -0,0 +1,1601 @@ +if defined?(EventMachine.library_type) and EventMachine.library_type == :pure_ruby + # assume 'em/pure_ruby' was loaded already +elsif RUBY_PLATFORM =~ /java/ + require 'java' + require 'jeventmachine' +else + begin + require 'rubyeventmachine' + rescue LoadError + warn "Unable to load the EventMachine C extension; To use the pure-ruby reactor, require 'em/pure_ruby'" + raise + end +end + +require 'em/version' +require 'em/pool' +require 'em/deferrable' +require 'em/future' +require 'em/streamer' +require 'em/spawnable' +require 'em/processes' +require 'em/iterator' +require 'em/buftok' +require 'em/timers' +require 'em/protocols' +require 'em/connection' +require 'em/callback' +require 'em/queue' +require 'em/channel' +require 'em/file_watch' +require 'em/process_watch' +require 'em/tick_loop' +require 'em/resolver' +require 'em/completion' +require 'em/threaded_resource' + +require 'shellwords' +require 'thread' +require 'resolv' + +# Top-level EventMachine namespace. If you are looking for EventMachine examples, see {file:docs/GettingStarted.md EventMachine tutorial}. +# +# ## Key methods ## +# ### Starting and stopping the event loop ### +# +# * {EventMachine.run} +# * {EventMachine.stop_event_loop} +# +# ### Implementing clients ### +# +# * {EventMachine.connect} +# +# ### Implementing servers ### +# +# * {EventMachine.start_server} +# +# ### Working with timers ### +# +# * {EventMachine.add_timer} +# * {EventMachine.add_periodic_timer} +# * {EventMachine.cancel_timer} +# +# ### Working with blocking tasks ### +# +# * {EventMachine.defer} +# * {EventMachine.next_tick} +# +# ### Efficient proxying ### +# +# * {EventMachine.enable_proxy} +# * {EventMachine.disable_proxy} +module EventMachine + class << self + # Exposed to allow joining on the thread, when run in a multithreaded + # environment. Performing other actions on the thread has undefined + # semantics (read: a dangerous endevor). + # + # @return [Thread] + attr_reader :reactor_thread + end + @next_tick_mutex = Mutex.new + @reactor_running = false + @next_tick_queue = [] + @tails = [] + @threadpool = @threadqueue = @resultqueue = nil + @all_threads_spawned = false + + # System errnos + # @private + ERRNOS = Errno::constants.grep(/^E/).inject(Hash.new(:unknown)) { |hash, name| + errno = Errno.__send__(:const_get, name) + hash[errno::Errno] = errno + hash + } + + # Initializes and runs an event loop. This method only returns if code inside the block passed to this method + # calls {EventMachine.stop_event_loop}. The block is executed after initializing its internal event loop but *before* running the loop, + # therefore this block is the right place to call any code that needs event loop to run, for example, {EventMachine.start_server}, + # {EventMachine.connect} or similar methods of libraries that use EventMachine under the hood + # (like `EventMachine::HttpRequest.new` or `AMQP.start`). + # + # Programs that are run for long periods of time (e.g. servers) usually start event loop by calling {EventMachine.run}, and let it + # run "forever". It's also possible to use {EventMachine.run} to make a single client-connection to a remote server, + # process the data flow from that single connection, and then call {EventMachine.stop_event_loop} to stop, in other words, + # to run event loop for a short period of time (necessary to complete some operation) and then shut it down. + # + # Once event loop is running, it is perfectly possible to start multiple servers and clients simultaneously: content-aware + # proxies like [Proxymachine](https://github.com/mojombo/proxymachine) do just that. + # + # ## Using EventMachine with Ruby on Rails and other Web application frameworks ## + # + # Standalone applications often run event loop on the main thread, thus blocking for their entire lifespan. In case of Web applications, + # if you are running an EventMachine-based app server such as [Thin](http://code.macournoyer.com/thin/) or [Goliath](https://github.com/postrank-labs/goliath/), + # they start event loop for you. Servers like Unicorn, Apache Passenger or Mongrel occupy main Ruby thread to serve HTTP(S) requests. This means + # that calling {EventMachine.run} on the same thread is not an option (it will result in Web server never binding to the socket). + # In that case, start event loop in a separate thread as demonstrated below. + # + # + # @example Starting EventMachine event loop in the current thread to run the "Hello, world"-like Echo server example + # + # #!/usr/bin/env ruby + # + # require 'rubygems' # or use Bundler.setup + # require 'eventmachine' + # + # class EchoServer < EM::Connection + # def receive_data(data) + # send_data(data) + # end + # end + # + # EventMachine.run do + # EventMachine.start_server("0.0.0.0", 10000, EchoServer) + # end + # + # + # @example Starting EventMachine event loop in a separate thread + # + # # doesn't block current thread, can be used with Ruby on Rails, Sinatra, Merb, Rack + # # and any other application server that occupies main Ruby thread. + # Thread.new { EventMachine.run } + # + # + # @note This method blocks calling thread. If you need to start EventMachine event loop from a Web app + # running on a non event-driven server (Unicorn, Apache Passenger, Mongrel), do it in a separate thread like demonstrated + # in one of the examples. + # @see file:docs/GettingStarted.md Getting started with EventMachine + # @see EventMachine.stop_event_loop + def self.run blk=nil, tail=nil, &block + # Obsoleted the use_threads mechanism. + # 25Nov06: Added the begin/ensure block. We need to be sure that release_machine + # gets called even if an exception gets thrown within any of the user code + # that the event loop runs. The best way to see this is to run a unit + # test with two functions, each of which calls {EventMachine.run} and each of + # which throws something inside of #run. Without the ensure, the second test + # will start without release_machine being called and will immediately throw + + # + if @reactor_running and @reactor_pid != Process.pid + # Reactor was started in a different parent, meaning we have forked. + # Clean up reactor state so a new reactor boots up in this child. + stop_event_loop + release_machine + cleanup_machine + @reactor_running = false + end + + tail and @tails.unshift(tail) + + if reactor_running? + (b = blk || block) and b.call # next_tick(b) + else + @conns = {} + @acceptors = {} + @timers = {} + @wrapped_exception = nil + @next_tick_queue ||= [] + @tails ||= [] + begin + initialize_event_machine + @reactor_pid = Process.pid + @reactor_thread = Thread.current + @reactor_running = true + + (b = blk || block) and add_timer(0, b) + if @next_tick_queue && !@next_tick_queue.empty? + add_timer(0) { signal_loopbreak } + end + + # Rubinius needs to come back into "Ruby space" for GC to work, + # so we'll crank the machine here. + if defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx" + while run_machine_once; end + else + run_machine + end + + ensure + until @tails.empty? + @tails.pop.call + end + + release_machine + cleanup_machine + @reactor_running = false + @reactor_thread = nil + end + + raise @wrapped_exception if @wrapped_exception + end + end + + # Sugars a common use case. Will pass the given block to #run, but will terminate + # the reactor loop and exit the function as soon as the code in the block completes. + # (Normally, {EventMachine.run} keeps running indefinitely, even after the block supplied to it + # finishes running, until user code calls {EventMachine.stop}) + # + def self.run_block &block + pr = proc { + block.call + EventMachine::stop + } + run(&pr) + end + + # @return [Boolean] true if the calling thread is the same thread as the reactor. + def self.reactor_thread? + Thread.current == @reactor_thread + end + + # Runs the given callback on the reactor thread, or immediately if called + # from the reactor thread. Accepts the same arguments as {EventMachine::Callback} + def self.schedule(*a, &b) + cb = Callback(*a, &b) + if reactor_running? && reactor_thread? + cb.call + else + next_tick { cb.call } + end + end + + # Forks a new process, properly stops the reactor and then calls {EventMachine.run} inside of it again, passing your block. + def self.fork_reactor &block + # This implementation is subject to change, especially if we clean up the relationship + # of EM#run to @reactor_running. + # Original patch by Aman Gupta. + # + Kernel.fork do + if reactor_running? + stop_event_loop + release_machine + cleanup_machine + @reactor_running = false + @reactor_thread = nil + end + run block + end + end + + # Clean up Ruby space following a release_machine + def self.cleanup_machine + if @threadpool && !@threadpool.empty? + # Tell the threads to stop + @threadpool.each { |t| t.exit } + # Join the threads or bump the stragglers one more time + @threadpool.each { |t| t.join 0.01 || t.exit } + end + @threadpool = nil + @threadqueue = nil + @resultqueue = nil + @all_threads_spawned = false + @next_tick_queue = [] + end + + # Adds a block to call as the reactor is shutting down. + # + # These callbacks are called in the _reverse_ order to which they are added. + # + # @example Scheduling operations to be run when EventMachine event loop is stopped + # + # EventMachine.run do + # EventMachine.add_shutdown_hook { puts "b" } + # EventMachine.add_shutdown_hook { puts "a" } + # EventMachine.stop + # end + # + # # Outputs: + # # a + # # b + # + def self.add_shutdown_hook &block + @tails << block + end + + # Adds a one-shot timer to the event loop. + # Call it with one or two parameters. The first parameters is a delay-time + # expressed in *seconds* (not milliseconds). The second parameter, if + # present, must be an object that responds to :call. If 2nd parameter is not given, then you + # can also simply pass a block to the method call. + # + # This method may be called from the block passed to {EventMachine.run} + # or from any callback method. It schedules execution of the proc or block + # passed to it, after the passage of an interval of time equal to + # *at least* the number of seconds specified in the first parameter to + # the call. + # + # {EventMachine.add_timer} is a non-blocking method. Callbacks can and will + # be called during the interval of time that the timer is in effect. + # There is no built-in limit to the number of timers that can be outstanding at + # any given time. + # + # @example Setting a one-shot timer with EventMachine + # + # EventMachine.run { + # puts "Starting the run now: #{Time.now}" + # EventMachine.add_timer 5, proc { puts "Executing timer event: #{Time.now}" } + # EventMachine.add_timer(10) { puts "Executing timer event: #{Time.now}" } + # } + # + # @param [Integer] delay Delay in seconds + # @see EventMachine::Timer + # @see EventMachine.add_periodic_timer + def self.add_timer *args, &block + interval = args.shift + code = args.shift || block + if code + # check too many timers! + s = add_oneshot_timer((interval.to_f * 1000).to_i) + @timers[s] = code + s + end + end + + # Adds a periodic timer to the event loop. + # It takes the same parameters as the one-shot timer method, {EventMachine.add_timer}. + # This method schedules execution of the given block repeatedly, at intervals + # of time *at least* as great as the number of seconds given in the first + # parameter to the call. + # + # @example Write a dollar-sign to stderr every five seconds, without blocking + # + # EventMachine.run { + # EventMachine.add_periodic_timer( 5 ) { $stderr.write "$" } + # } + # + # @param [Integer] delay Delay in seconds + # + # @see EventMachine::PeriodicTimer + # @see EventMachine.add_timer + # + def self.add_periodic_timer *args, &block + interval = args.shift + code = args.shift || block + + EventMachine::PeriodicTimer.new(interval, code) + end + + + # Cancel a timer (can be a callback or an {EventMachine::Timer} instance). + # + # @param [#cancel, #call] timer_or_sig A timer to cancel + # @see EventMachine::Timer#cancel + def self.cancel_timer timer_or_sig + if timer_or_sig.respond_to? :cancel + timer_or_sig.cancel + else + @timers[timer_or_sig] = false if @timers.has_key?(timer_or_sig) + end + end + + + # Causes the processing loop to stop executing, which will cause all open connections and accepting servers + # to be run down and closed. Connection termination callbacks added using {EventMachine.add_shutdown_hook} + # will be called as part of running this method. + # + # When all of this processing is complete, the call to {EventMachine.run} which started the processing loop + # will return and program flow will resume from the statement following {EventMachine.run} call. + # + # @example Stopping a running EventMachine event loop + # + # require 'rubygems' + # require 'eventmachine' + # + # module Redmond + # def post_init + # puts "We're sending a dumb HTTP request to the remote peer." + # send_data "GET / HTTP/1.1\r\nHost: www.microsoft.com\r\n\r\n" + # end + # + # def receive_data data + # puts "We received #{data.length} bytes from the remote peer." + # puts "We're going to stop the event loop now." + # EventMachine::stop_event_loop + # end + # + # def unbind + # puts "A connection has terminated." + # end + # end + # + # puts "We're starting the event loop now." + # EventMachine.run { + # EventMachine.connect "www.microsoft.com", 80, Redmond + # } + # puts "The event loop has stopped." + # + # # This program will produce approximately the following output: + # # + # # We're starting the event loop now. + # # We're sending a dumb HTTP request to the remote peer. + # # We received 1440 bytes from the remote peer. + # # We're going to stop the event loop now. + # # A connection has terminated. + # # The event loop has stopped. + # + # + def self.stop_event_loop + EventMachine::stop + end + + # Initiates a TCP server (socket acceptor) on the specified IP address and port. + # + # The IP address must be valid on the machine where the program + # runs, and the process must be privileged enough to listen + # on the specified port (on Unix-like systems, superuser privileges + # are usually required to listen on any port lower than 1024). + # Only one listener may be running on any given address/port + # combination. start_server will fail if the given address and port + # are already listening on the machine, either because of a prior call + # to {.start_server} or some unrelated process running on the machine. + # If {.start_server} succeeds, the new network listener becomes active + # immediately and starts accepting connections from remote peers, + # and these connections generate callback events that are processed + # by the code specified in the handler parameter to {.start_server}. + # + # The optional handler which is passed to this method is the key + # to EventMachine's ability to handle particular network protocols. + # The handler parameter passed to start_server must be a Ruby Module + # that you must define. When the network server that is started by + # start_server accepts a new connection, it instantiates a new + # object of an anonymous class that is inherited from {EventMachine::Connection}, + # *into which your handler module have been included*. Arguments passed into start_server + # after the class name are passed into the constructor during the instantiation. + # + # Your handler module may override any of the methods in {EventMachine::Connection}, + # such as {EventMachine::Connection#receive_data}, in order to implement the specific behavior + # of the network protocol. + # + # Callbacks invoked in response to network events *always* take place + # within the execution context of the object derived from {EventMachine::Connection} + # extended by your handler module. There is one object per connection, and + # all of the callbacks invoked for a particular connection take the form + # of instance methods called against the corresponding {EventMachine::Connection} + # object. Therefore, you are free to define whatever instance variables you + # wish, in order to contain the per-connection state required by the network protocol you are + # implementing. + # + # {EventMachine.start_server} is usually called inside the block passed to {EventMachine.run}, + # but it can be called from any EventMachine callback. {EventMachine.start_server} will fail + # unless the EventMachine event loop is currently running (which is why + # it's often called in the block suppled to {EventMachine.run}). + # + # You may call start_server any number of times to start up network + # listeners on different address/port combinations. The servers will + # all run simultaneously. More interestingly, each individual call to start_server + # can specify a different handler module and thus implement a different + # network protocol from all the others. + # + # @example + # + # require 'rubygems' + # require 'eventmachine' + # + # # Here is an example of a server that counts lines of input from the remote + # # peer and sends back the total number of lines received, after each line. + # # Try the example with more than one client connection opened via telnet, + # # and you will see that the line count increments independently on each + # # of the client connections. Also very important to note, is that the + # # handler for the receive_data function, which our handler redefines, may + # # not assume that the data it receives observes any kind of message boundaries. + # # Also, to use this example, be sure to change the server and port parameters + # # to the start_server call to values appropriate for your environment. + # module LineCounter + # MaxLinesPerConnection = 10 + # + # def post_init + # puts "Received a new connection" + # @data_received = "" + # @line_count = 0 + # end + # + # def receive_data data + # @data_received << data + # while @data_received.slice!( /^[^\n]*[\n]/m ) + # @line_count += 1 + # send_data "received #{@line_count} lines so far\r\n" + # @line_count == MaxLinesPerConnection and close_connection_after_writing + # end + # end + # end + # + # EventMachine.run { + # host, port = "192.168.0.100", 8090 + # EventMachine.start_server host, port, LineCounter + # puts "Now accepting connections on address #{host}, port #{port}..." + # EventMachine.add_periodic_timer(10) { $stderr.write "*" } + # } + # + # @param [String] server Host to bind to. + # @param [Integer] port Port to bind to. + # @param [Module, Class] handler A module or class that implements connection callbacks + # + # @note Don't forget that in order to bind to ports < 1024 on Linux, *BSD and Mac OS X your process must have superuser privileges. + # + # @see file:docs/GettingStarted.md EventMachine tutorial + # @see EventMachine.stop_server + def self.start_server server, port=nil, handler=nil, *args, &block + begin + port = Integer(port) + rescue ArgumentError, TypeError + # there was no port, so server must be a unix domain socket + # the port argument is actually the handler, and the handler is one of the args + args.unshift handler if handler + handler = port + port = nil + end if port + + klass = klass_from_handler(Connection, handler, *args) + + s = if port + start_tcp_server server, port + else + start_unix_server server + end + @acceptors[s] = [klass,args,block] + s + end + + # Attach to an existing socket's file descriptor. The socket may have been + # started with {EventMachine.start_server}. + def self.attach_server sock, handler=nil, *args, &block + klass = klass_from_handler(Connection, handler, *args) + sd = sock.respond_to?(:fileno) ? sock.fileno : sock + s = attach_sd(sd) + @acceptors[s] = [klass,args,block,sock] + s + end + + # Stop a TCP server socket that was started with {EventMachine.start_server}. + # @see EventMachine.start_server + def self.stop_server signature + EventMachine::stop_tcp_server signature + end + + # Start a Unix-domain server. + # + # Note that this is an alias for {EventMachine.start_server}, which can be used to start both + # TCP and Unix-domain servers. + # + # @see EventMachine.start_server + def self.start_unix_domain_server filename, *args, &block + start_server filename, *args, &block + end + + # Initiates a TCP connection to a remote server and sets up event handling for the connection. + # {EventMachine.connect} requires event loop to be running (see {EventMachine.run}). + # + # {EventMachine.connect} takes the IP address (or hostname) and + # port of the remote server you want to connect to. + # It also takes an optional handler (a module or a subclass of {EventMachine::Connection}) which you must define, that + # contains the callbacks that will be invoked by the event loop on behalf of the connection. + # + # Learn more about connection lifecycle callbacks in the {file:docs/GettingStarted.md EventMachine tutorial} and + # {file:docs/ConnectionLifecycleCallbacks.md Connection lifecycle guide}. + # + # + # @example + # + # # Here's a program which connects to a web server, sends a naive + # # request, parses the HTTP header of the response, and then + # # (antisocially) ends the event loop, which automatically drops the connection + # # (and incidentally calls the connection's unbind method). + # module DumbHttpClient + # def post_init + # send_data "GET / HTTP/1.1\r\nHost: _\r\n\r\n" + # @data = "" + # @parsed = false + # end + # + # def receive_data data + # @data << data + # if !@parsed and @data =~ /[\n][\r]*[\n]/m + # @parsed = true + # puts "RECEIVED HTTP HEADER:" + # $`.each {|line| puts ">>> #{line}" } + # + # puts "Now we'll terminate the loop, which will also close the connection" + # EventMachine::stop_event_loop + # end + # end + # + # def unbind + # puts "A connection has terminated" + # end + # end + # + # EventMachine.run { + # EventMachine.connect "www.bayshorenetworks.com", 80, DumbHttpClient + # } + # puts "The event loop has ended" + # + # + # @example Defining protocol handler as a class + # + # class MyProtocolHandler < EventMachine::Connection + # def initialize *args + # super + # # whatever else you want to do here + # end + # + # # ... + # end + # + # + # @param [String] server Host to connect to + # @param [Integer] port Port to connect to + # @param [Module, Class] handler A module or class that implements connection lifecycle callbacks + # + # @see EventMachine.start_server + # @see file:docs/GettingStarted.md EventMachine tutorial + def self.connect server, port=nil, handler=nil, *args, &blk + # EventMachine::connect initiates a TCP connection to a remote + # server and sets up event-handling for the connection. + # It internally creates an object that should not be handled + # by the caller. HOWEVER, it's often convenient to get the + # object to set up interfacing to other objects in the system. + # We return the newly-created anonymous-class object to the caller. + # It's expected that a considerable amount of code will depend + # on this behavior, so don't change it. + # + # Ok, added support for a user-defined block, 13Apr06. + # This leads us to an interesting choice because of the + # presence of the post_init call, which happens in the + # initialize method of the new object. We call the user's + # block and pass the new object to it. This is a great + # way to do protocol-specific initiation. It happens + # AFTER post_init has been called on the object, which I + # certainly hope is the right choice. + # Don't change this lightly, because accepted connections + # are different from connected ones and we don't want + # to have them behave differently with respect to post_init + # if at all possible. + + bind_connect nil, nil, server, port, handler, *args, &blk + end + + # This method is like {EventMachine.connect}, but allows for a local address/port + # to bind the connection to. + # + # @see EventMachine.connect + def self.bind_connect bind_addr, bind_port, server, port=nil, handler=nil, *args + begin + port = Integer(port) + rescue ArgumentError, TypeError + # there was no port, so server must be a unix domain socket + # the port argument is actually the handler, and the handler is one of the args + args.unshift handler if handler + handler = port + port = nil + end if port + + klass = klass_from_handler(Connection, handler, *args) + + s = if port + if bind_addr + bind_connect_server bind_addr, bind_port.to_i, server, port + else + connect_server server, port + end + else + connect_unix_server server + end + + c = klass.new s, *args + @conns[s] = c + block_given? and yield c + c + end + + # {EventMachine.watch} registers a given file descriptor or IO object with the eventloop. The + # file descriptor will not be modified (it will remain blocking or non-blocking). + # + # The eventloop can be used to process readable and writable events on the file descriptor, using + # {EventMachine::Connection#notify_readable=} and {EventMachine::Connection#notify_writable=} + # + # {EventMachine::Connection#notify_readable?} and {EventMachine::Connection#notify_writable?} can be used + # to check what events are enabled on the connection. + # + # To detach the file descriptor, use {EventMachine::Connection#detach} + # + # @example + # + # module SimpleHttpClient + # def notify_readable + # header = @io.readline + # + # if header == "\r\n" + # # detach returns the file descriptor number (fd == @io.fileno) + # fd = detach + # end + # rescue EOFError + # detach + # end + # + # def unbind + # EM.next_tick do + # # socket is detached from the eventloop, but still open + # data = @io.read + # end + # end + # end + # + # EventMachine.run { + # sock = TCPSocket.new('site.com', 80) + # sock.write("GET / HTTP/1.0\r\n\r\n") + # conn = EventMachine.watch(sock, SimpleHttpClient) + # conn.notify_readable = true + # } + # + # @author Riham Aldakkak (eSpace Technologies) + def EventMachine::watch io, handler=nil, *args, &blk + attach_io io, true, handler, *args, &blk + end + + # Attaches an IO object or file descriptor to the eventloop as a regular connection. + # The file descriptor will be set as non-blocking, and EventMachine will process + # receive_data and send_data events on it as it would for any other connection. + # + # To watch a fd instead, use {EventMachine.watch}, which will not alter the state of the socket + # and fire notify_readable and notify_writable events instead. + def EventMachine::attach io, handler=nil, *args, &blk + attach_io io, false, handler, *args, &blk + end + + # @private + def EventMachine::attach_io io, watch_mode, handler=nil, *args + klass = klass_from_handler(Connection, handler, *args) + + if !watch_mode and klass.public_instance_methods.any?{|m| [:notify_readable, :notify_writable].include? m.to_sym } + raise ArgumentError, "notify_readable/writable with EM.attach is not supported. Use EM.watch(io){ |c| c.notify_readable = true }" + end + + if io.respond_to?(:fileno) + # getDescriptorByFileno deprecated in JRuby 1.7.x, removed in JRuby 9000 + if defined?(JRuby) && JRuby.runtime.respond_to?(:getDescriptorByFileno) + fd = JRuby.runtime.getDescriptorByFileno(io.fileno).getChannel + else + fd = io.fileno + end + else + fd = io + end + + s = attach_fd fd, watch_mode + c = klass.new s, *args + + c.instance_variable_set(:@io, io) + c.instance_variable_set(:@watch_mode, watch_mode) + c.instance_variable_set(:@fd, fd) + + @conns[s] = c + block_given? and yield c + c + end + + + # Connect to a given host/port and re-use the provided {EventMachine::Connection} instance. + # Consider also {EventMachine::Connection#reconnect}. + # + # @see EventMachine::Connection#reconnect + def self.reconnect server, port, handler + # Observe, the test for already-connected FAILS if we call a reconnect inside post_init, + # because we haven't set up the connection in @conns by that point. + # RESIST THE TEMPTATION to "fix" this problem by redefining the behavior of post_init. + # + # Changed 22Nov06: if called on an already-connected handler, just return the + # handler and do nothing more. Originally this condition raised an exception. + # We may want to change it yet again and call the block, if any. + + raise "invalid handler" unless handler.respond_to?(:connection_completed) + #raise "still connected" if @conns.has_key?(handler.signature) + return handler if @conns.has_key?(handler.signature) + + s = if port + connect_server server, port + else + connect_unix_server server + end + handler.signature = s + @conns[s] = handler + block_given? and yield handler + handler + end + + + # Make a connection to a Unix-domain socket. This method is simply an alias for {.connect}, + # which can connect to both TCP and Unix-domain sockets. Make sure that your process has sufficient + # permissions to open the socket it is given. + # + # @param [String] socketname Unix domain socket (local fully-qualified path) you want to connect to. + # + # @note UNIX sockets, as the name suggests, are not available on Microsoft Windows. + def self.connect_unix_domain socketname, *args, &blk + connect socketname, *args, &blk + end + + + # Used for UDP-based protocols. Its usage is similar to that of {EventMachine.start_server}. + # + # This method will create a new UDP (datagram) socket and + # bind it to the address and port that you specify. + # The normal callbacks (see {EventMachine.start_server}) will + # be called as events of interest occur on the newly-created + # socket, but there are some differences in how they behave. + # + # {Connection#receive_data} will be called when a datagram packet + # is received on the socket, but unlike TCP sockets, the message + # boundaries of the received data will be respected. In other words, + # if the remote peer sent you a datagram of a particular size, + # you may rely on {Connection#receive_data} to give you the + # exact data in the packet, with the original data length. + # Also observe that Connection#receive_data may be called with a + # *zero-length* data payload, since empty datagrams are permitted in UDP. + # + # {Connection#send_data} is available with UDP packets as with TCP, + # but there is an important difference. Because UDP communications + # are *connectionless*, there is no implicit recipient for the packets you + # send. Ordinarily you must specify the recipient for each packet you send. + # However, EventMachine provides for the typical pattern of receiving a UDP datagram + # from a remote peer, performing some operation, and then sending + # one or more packets in response to the same remote peer. + # To support this model easily, just use {Connection#send_data} + # in the code that you supply for {Connection#receive_data}. + # + # EventMachine will provide an implicit return address for any messages sent to + # {Connection#send_data} within the context of a {Connection#receive_data} callback, + # and your response will automatically go to the correct remote peer. + # + # Observe that the port number that you supply to {EventMachine.open_datagram_socket} + # may be zero. In this case, EventMachine will create a UDP socket + # that is bound to an [ephemeral port](http://en.wikipedia.org/wiki/Ephemeral_port). + # This is not appropriate for servers that must publish a well-known + # port to which remote peers may send datagrams. But it can be useful + # for clients that send datagrams to other servers. + # If you do this, you will receive any responses from the remote + # servers through the normal {Connection#receive_data} callback. + # Observe that you will probably have issues with firewalls blocking + # the ephemeral port numbers, so this technique is most appropriate for LANs. + # + # If you wish to send datagrams to arbitrary remote peers (not + # necessarily ones that have sent data to which you are responding), + # then see {Connection#send_datagram}. + # + # DO NOT call send_data from a datagram socket outside of a {Connection#receive_data} method. Use {Connection#send_datagram}. + # If you do use {Connection#send_data} outside of a {Connection#receive_data} method, you'll get a confusing error + # because there is no "peer," as #send_data requires (inside of {EventMachine::Connection#receive_data}, + # {EventMachine::Connection#send_data} "fakes" the peer as described above). + # + # @param [String] address IP address + # @param [String] port Port + # @param [Class, Module] handler A class or a module that implements connection lifecycle callbacks. + def self.open_datagram_socket address, port, handler=nil, *args + # Replaced the implementation on 01Oct06. Thanks to Tobias Gustafsson for pointing + # out that this originally did not take a class but only a module. + + + klass = klass_from_handler(Connection, handler, *args) + s = open_udp_socket address, port.to_i + c = klass.new s, *args + @conns[s] = c + block_given? and yield c + c + end + + + # For advanced users. This function sets the default timer granularity, which by default is + # slightly smaller than 100 milliseconds. Call this function to set a higher or lower granularity. + # The function affects the behavior of {EventMachine.add_timer} and {EventMachine.add_periodic_timer}. + # Most applications will not need to call this function. + # + # Avoid setting the quantum to very low values because that may reduce performance under some extreme conditions. + # We recommend that you not use values lower than 10. + # + # This method only can be used if event loop is running. + # + # @param [Integer] mills New timer granularity, in milliseconds + # + # @see EventMachine.add_timer + # @see EventMachine.add_periodic_timer + # @see EventMachine::Timer + # @see EventMachine.run + def self.set_quantum mills + set_timer_quantum mills.to_i + end + + # Sets the maximum number of timers and periodic timers that may be outstanding at any + # given time. You only need to call {.set_max_timers} if you need more than the default + # number of timers, which on most platforms is 1000. + # + # @note This method has to be used *before* event loop is started. + # + # @param [Integer] ct Maximum number of timers that may be outstanding at any given time + # + # @see EventMachine.add_timer + # @see EventMachine.add_periodic_timer + # @see EventMachine::Timer + def self.set_max_timers ct + set_max_timer_count ct + end + + # Gets the current maximum number of allowed timers + # + # @return [Integer] Maximum number of timers that may be outstanding at any given time + def self.get_max_timers + get_max_timer_count + end + + # Returns the total number of connections (file descriptors) currently held by the reactor. + # Note that a tick must pass after the 'initiation' of a connection for this number to increment. + # It's usually accurate, but don't rely on the exact precision of this number unless you really know EM internals. + # + # @example + # + # EventMachine.run { + # EventMachine.connect("rubyeventmachine.com", 80) + # # count will be 0 in this case, because connection is not + # # established yet + # count = EventMachine.connection_count + # } + # + # + # @example + # + # EventMachine.run { + # EventMachine.connect("rubyeventmachine.com", 80) + # + # EventMachine.next_tick { + # # In this example, count will be 1 since the connection has been established in + # # the next loop of the reactor. + # count = EventMachine.connection_count + # } + # } + # + # @return [Integer] Number of connections currently held by the reactor. + def self.connection_count + self.get_connection_count + end + + # The is the responder for the loopback-signalled event. + # It can be fired either by code running on a separate thread ({EventMachine.defer}) or on + # the main thread ({EventMachine.next_tick}). + # It will often happen that a next_tick handler will reschedule itself. We + # consume a copy of the tick queue so that tick events scheduled by tick events + # have to wait for the next pass through the reactor core. + # + # @private + def self.run_deferred_callbacks + until (@resultqueue ||= []).empty? + result,cback = @resultqueue.pop + cback.call result if cback + end + + # Capture the size at the start of this tick... + size = @next_tick_mutex.synchronize { @next_tick_queue.size } + size.times do |i| + callback = @next_tick_mutex.synchronize { @next_tick_queue.shift } + begin + callback.call + rescue + exception_raised = true + raise + ensure + # This is a little nasty. The problem is, if an exception occurs during + # the callback, then we need to send a signal to the reactor to actually + # do some work during the next_tick. The only mechanism we have from the + # ruby side is next_tick itself, although ideally, we'd just drop a byte + # on the loopback descriptor. + next_tick {} if exception_raised + end + end + end + + + # EventMachine.defer is used for integrating blocking operations into EventMachine's control flow. + # The action of {.defer} is to take the block specified in the first parameter (the "operation") + # and schedule it for asynchronous execution on an internal thread pool maintained by EventMachine. + # When the operation completes, it will pass the result computed by the block (if any) back to the + # EventMachine reactor. Then, EventMachine calls the block specified in the second parameter to + # {.defer} (the "callback"), as part of its normal event handling loop. The result computed by the + # operation block is passed as a parameter to the callback. You may omit the callback parameter if + # you don't need to execute any code after the operation completes. If the operation raises an + # unhandled exception, the exception will be passed to the third parameter to {.defer} (the + # "errback"), as part of its normal event handling loop. If no errback is provided, the exception + # will be allowed to blow through to the main thread immediately. + # + # ## Caveats ## + # + # Note carefully that the code in your deferred operation will be executed on a separate + # thread from the main EventMachine processing and all other Ruby threads that may exist in + # your program. Also, multiple deferred operations may be running at once! Therefore, you + # are responsible for ensuring that your operation code is threadsafe. + # + # Don't write a deferred operation that will block forever. If so, the current implementation will + # not detect the problem, and the thread will never be returned to the pool. EventMachine limits + # the number of threads in its pool, so if you do this enough times, your subsequent deferred + # operations won't get a chance to run. + # + # The threads within the EventMachine's thread pool have abort_on_exception set to true. As a result, + # if an unhandled exception is raised by the deferred operation and an errback is not provided, it + # will blow through to the main thread immediately. If the main thread is within an indiscriminate + # rescue block at that time, the exception could be handled improperly by the main thread. + # + # @example + # + # operation = proc { + # # perform a long-running operation here, such as a database query. + # "result" # as usual, the last expression evaluated in the block will be the return value. + # } + # callback = proc {|result| + # # do something with result here, such as send it back to a network client. + # } + # errback = proc {|error| + # # do something with error here, such as re-raising or logging. + # } + # + # EventMachine.defer(operation, callback, errback) + # + # @param [#call] op An operation you want to offload to EventMachine thread pool + # @param [#call] callback A callback that will be run on the event loop thread after `operation` finishes. + # @param [#call] errback An errback that will be run on the event loop thread after `operation` raises an exception. + # + # @see EventMachine.threadpool_size + def self.defer op = nil, callback = nil, errback = nil, &blk + # OBSERVE that #next_tick hacks into this mechanism, so don't make any changes here + # without syncing there. + # + # Running with $VERBOSE set to true gives a warning unless all ivars are defined when + # they appear in rvalues. But we DON'T ever want to initialize @threadqueue unless we + # need it, because the Ruby threads are so heavyweight. We end up with this bizarre + # way of initializing @threadqueue because EventMachine is a Module, not a Class, and + # has no constructor. + + unless @threadpool + @threadpool = [] + @threadqueue = ::Queue.new + @resultqueue = ::Queue.new + spawn_threadpool + end + + @threadqueue << [op||blk,callback,errback] + end + + + # @private + def self.spawn_threadpool + until @threadpool.size == @threadpool_size.to_i + thread = Thread.new do + Thread.current.abort_on_exception = true + while true + begin + op, cback, eback = *@threadqueue.pop + rescue ThreadError + $stderr.puts $!.message + break # Ruby 2.0 may fail at Queue.pop + end + begin + result = op.call + @resultqueue << [result, cback] + rescue Exception => error + raise error unless eback + @resultqueue << [error, eback] + end + signal_loopbreak + end + end + @threadpool << thread + end + @all_threads_spawned = true + end + + ## + # Returns +true+ if all deferred actions are done executing and their + # callbacks have been fired. + # + def self.defers_finished? + return false if @threadpool and !@all_threads_spawned + return false if @threadqueue and not @threadqueue.empty? + return false if @resultqueue and not @resultqueue.empty? + return false if @threadpool and @threadqueue.num_waiting != @threadpool.size + return true + end + + class << self + # @private + attr_reader :threadpool + + # Size of the EventMachine.defer threadpool (defaults to 20) + # @return [Number] + attr_accessor :threadpool_size + EventMachine.threadpool_size = 20 + end + + # Schedules a proc for execution immediately after the next "turn" through the reactor + # core. An advanced technique, this can be useful for improving memory management and/or + # application responsiveness, especially when scheduling large amounts of data for + # writing to a network connection. + # + # This method takes either a single argument (which must be a callable object) or a block. + # + # @param [#call] pr A callable object to run + def self.next_tick pr=nil, &block + # This works by adding to the @resultqueue that's used for #defer. + # The general idea is that next_tick is used when we want to give the reactor a chance + # to let other operations run, either to balance the load out more evenly, or to let + # outbound network buffers drain, or both. So we probably do NOT want to block, and + # we probably do NOT want to be spinning any threads. A program that uses next_tick + # but not #defer shouldn't suffer the penalty of having Ruby threads running. They're + # extremely expensive even if they're just sleeping. + + raise ArgumentError, "no proc or block given" unless ((pr && pr.respond_to?(:call)) or block) + @next_tick_mutex.synchronize do + @next_tick_queue << ( pr || block ) + end + signal_loopbreak if reactor_running? + end + + # A wrapper over the setuid system call. Particularly useful when opening a network + # server on a privileged port because you can use this call to drop privileges + # after opening the port. Also very useful after a call to {.set_descriptor_table_size}, + # which generally requires that you start your process with root privileges. + # + # This method is intended for use in enforcing security requirements, consequently + # it will throw a fatal error and end your program if it fails. + # + # @param [String] username The effective name of the user whose privilege-level your process should attain. + # + # @note This method has no effective implementation on Windows or in the pure-Ruby + # implementation of EventMachine + def self.set_effective_user username + EventMachine::setuid_string username + end + + + # Sets the maximum number of file or socket descriptors that your process may open. + # If you call this method with no arguments, it will simply return + # the current size of the descriptor table without attempting to change it. + # + # The new limit on open descriptors **only** applies to sockets and other descriptors + # that belong to EventMachine. It has **no effect** on the number of descriptors + # you can create in ordinary Ruby code. + # + # Not available on all platforms. Increasing the number of descriptors beyond its + # default limit usually requires superuser privileges. (See {.set_effective_user} + # for a way to drop superuser privileges while your program is running.) + # + # @param [Integer] n_descriptors The maximum number of file or socket descriptors that your process may open + # @return [Integer] The new descriptor table size. + def self.set_descriptor_table_size n_descriptors=nil + EventMachine::set_rlimit_nofile n_descriptors + end + + + + # Runs an external process. + # + # @example + # + # module RubyCounter + # def post_init + # # count up to 5 + # send_data "5\n" + # end + # def receive_data data + # puts "ruby sent me: #{data}" + # end + # def unbind + # puts "ruby died with exit status: #{get_status.exitstatus}" + # end + # end + # + # EventMachine.run { + # EventMachine.popen("ruby -e' $stdout.sync = true; gets.to_i.times{ |i| puts i+1; sleep 1 } '", RubyCounter) + # } + # + # @note This method is not supported on Microsoft Windows + # @see EventMachine::DeferrableChildProcess + # @see EventMachine.system + def self.popen cmd, handler=nil, *args + # At this moment, it's only available on Unix. + # Perhaps misnamed since the underlying function uses socketpair and is full-duplex. + + klass = klass_from_handler(Connection, handler, *args) + w = case cmd + when Array + cmd + when String + Shellwords::shellwords( cmd ) + end + w.unshift( w.first ) if w.first + s = invoke_popen( w ) + c = klass.new s, *args + @conns[s] = c + yield(c) if block_given? + c + end + + + # Tells you whether the EventMachine reactor loop is currently running. + # + # Useful when writing libraries that want to run event-driven code, but may + # be running in programs that are already event-driven. In such cases, if {EventMachine.reactor_running?} + # returns false, your code can invoke {EventMachine.run} and run your application code inside + # the block passed to that method. If this method returns true, just + # execute your event-aware code. + # + # @return [Boolean] true if the EventMachine reactor loop is currently running + def self.reactor_running? + @reactor_running && Process.pid == @reactor_pid + end + + + # (Experimental) + # + # @private + def self.open_keyboard handler=nil, *args + klass = klass_from_handler(Connection, handler, *args) + + s = read_keyboard + c = klass.new s, *args + @conns[s] = c + block_given? and yield c + c + end + + # EventMachine's file monitoring API. Currently supported are the following events + # on individual files, using inotify on Linux systems, and kqueue for *BSD and Mac OS X: + # + # * File modified (written to) + # * File moved/renamed + # * File deleted + # + # EventMachine::watch_file takes a filename and a handler Module containing your custom callback methods. + # This will setup the low level monitoring on the specified file, and create a new EventMachine::FileWatch + # object with your Module mixed in. FileWatch is a subclass of {EventMachine::Connection}, so callbacks on this object + # work in the familiar way. The callbacks that will be fired by EventMachine are: + # + # * file_modified + # * file_moved + # * file_deleted + # + # You can access the filename being monitored from within this object using {FileWatch#path}. + # + # When a file is deleted, {FileWatch#stop_watching} will be called after your file_deleted callback, + # to clean up the underlying monitoring and remove EventMachine's reference to the now-useless {FileWatch} instance. + # This will in turn call unbind, if you wish to use it. + # + # The corresponding system-level Errno will be raised when attempting to monitor non-existent files, + # files with wrong permissions, or if an error occurs dealing with inotify/kqueue. + # + # @example + # + # # Before running this example, make sure we have a file to monitor: + # # $ echo "bar" > /tmp/foo + # + # module Handler + # def file_modified + # puts "#{path} modified" + # end + # + # def file_moved + # puts "#{path} moved" + # end + # + # def file_deleted + # puts "#{path} deleted" + # end + # + # def unbind + # puts "#{path} monitoring ceased" + # end + # end + # + # # for efficient file watching, use kqueue on Mac OS X + # EventMachine.kqueue = true if EventMachine.kqueue? + # + # EventMachine.run { + # EventMachine.watch_file("/tmp/foo", Handler) + # } + # + # # $ echo "baz" >> /tmp/foo => "/tmp/foo modified" + # # $ mv /tmp/foo /tmp/oof => "/tmp/foo moved" + # # $ rm /tmp/oof => "/tmp/foo deleted" + # + # @note The ability to pick up on the new filename after a rename is not yet supported. + # Calling #path will always return the filename you originally used. + # + # @param [String] filename Local path to the file to watch. + # @param [Class, Module] handler A class or module that implements event handlers associated with the file. + def self.watch_file(filename, handler=nil, *args) + klass = klass_from_handler(FileWatch, handler, *args) + + s = EM::watch_filename(filename) + c = klass.new s, *args + # we have to set the path like this because of how Connection.new works + c.instance_variable_set("@path", filename) + @conns[s] = c + block_given? and yield c + c + end + + # EventMachine's process monitoring API. On Mac OS X and *BSD this method is implemented using kqueue. + # + # @example + # + # module ProcessWatcher + # def process_exited + # put 'the forked child died!' + # end + # end + # + # pid = fork{ sleep } + # + # EventMachine.run { + # EventMachine.watch_process(pid, ProcessWatcher) + # EventMachine.add_timer(1){ Process.kill('TERM', pid) } + # } + # + # @param [Integer] pid PID of the process to watch. + # @param [Class, Module] handler A class or module that implements event handlers associated with the file. + def self.watch_process(pid, handler=nil, *args) + pid = pid.to_i + + klass = klass_from_handler(ProcessWatch, handler, *args) + + s = EM::watch_pid(pid) + c = klass.new s, *args + # we have to set the path like this because of how Connection.new works + c.instance_variable_set("@pid", pid) + @conns[s] = c + block_given? and yield c + c + end + + # Catch-all for errors raised during event loop callbacks. + # + # @example + # + # EventMachine.error_handler{ |e| + # puts "Error raised during event loop: #{e.message}" + # } + # + # @param [#call] cb Global catch-all errback + def self.error_handler cb = nil, &blk + if cb or blk + @error_handler = cb || blk + elsif instance_variable_defined? :@error_handler + remove_instance_variable :@error_handler + end + end + + # This method allows for direct writing of incoming data back out to another descriptor, at the C++ level in the reactor. + # This is very efficient and especially useful for proxies where high performance is required. Propogating data from a server response + # all the way up to Ruby, and then back down to the reactor to be sent back to the client, is often unnecessary and + # incurs a significant performance decrease. + # + # The two arguments are instance of {EventMachine::Connection} subclasses, 'from' and 'to'. 'from' is the connection whose inbound data you want + # relayed back out. 'to' is the connection to write it to. + # + # Once you call this method, the 'from' connection will no longer get receive_data callbacks from the reactor, + # except in the case that 'to' connection has already closed when attempting to write to it. You can see + # in the example, that proxy_target_unbound will be called when this occurs. After that, further incoming + # data will be passed into receive_data as normal. + # + # Note also that this feature supports different types of descriptors: TCP, UDP, and pipes. You can relay + # data from one kind to another, for example, feed a pipe from a UDP stream. + # + # @example + # + # module ProxyConnection + # def initialize(client, request) + # @client, @request = client, request + # end + # + # def post_init + # EM::enable_proxy(self, @client) + # end + # + # def connection_completed + # send_data @request + # end + # + # def proxy_target_unbound + # close_connection + # end + # + # def unbind + # @client.close_connection_after_writing + # end + # end + # + # module ProxyServer + # def receive_data(data) + # (@buf ||= "") << data + # if @buf =~ /\r\n\r\n/ # all http headers received + # EventMachine.connect("10.0.0.15", 80, ProxyConnection, self, data) + # end + # end + # end + # + # EventMachine.run { + # EventMachine.start_server("127.0.0.1", 8080, ProxyServer) + # } + # + # @param [EventMachine::Connection] from Source of data to be proxies/streamed. + # @param [EventMachine::Connection] to Destination of data to be proxies/streamed. + # @param [Integer] bufsize Buffer size to use + # @param [Integer] length Maximum number of bytes to proxy. + # + # @see EventMachine.disable_proxy + def self.enable_proxy(from, to, bufsize=0, length=0) + EM::start_proxy(from.signature, to.signature, bufsize, length) + end + + # Takes just one argument, a {Connection} that has proxying enabled via {EventMachine.enable_proxy}. + # Calling this method will remove that functionality and your connection will begin receiving + # data via {Connection#receive_data} again. + # + # @param [EventMachine::Connection] from Source of data that is being proxied + # @see EventMachine.enable_proxy + def self.disable_proxy(from) + EM::stop_proxy(from.signature) + end + + # Retrieve the heartbeat interval. This is how often EventMachine will check for dead connections + # that have had an inactivity timeout set via {Connection#set_comm_inactivity_timeout}. + # Default is 2 seconds. + # + # @return [Integer] Heartbeat interval, in seconds + def self.heartbeat_interval + EM::get_heartbeat_interval + end + + # Set the heartbeat interval. This is how often EventMachine will check for dead connections + # that have had an inactivity timeout set via {Connection#set_comm_inactivity_timeout}. + # Takes a Numeric number of seconds. Default is 2. + # + # @param [Integer] time Heartbeat interval, in seconds + def self.heartbeat_interval=(time) + EM::set_heartbeat_interval time.to_f + end + + # @private + def self.event_callback conn_binding, opcode, data + # + # Changed 27Dec07: Eliminated the hookable error handling. + # No one was using it, and it degraded performance significantly. + # It's in original_event_callback, which is dead code. + # + # Changed 25Jul08: Added a partial solution to the problem of exceptions + # raised in user-written event-handlers. If such exceptions are not caught, + # we must cause the reactor to stop, and then re-raise the exception. + # Otherwise, the reactor doesn't stop and it's left on the call stack. + # This is partial because we only added it to #unbind, where it's critical + # (to keep unbind handlers from being re-entered when a stopping reactor + # runs down open connections). It should go on the other calls to user + # code, but the performance impact may be too large. + # + if opcode == ConnectionUnbound + if c = @conns.delete( conn_binding ) + begin + if c.original_method(:unbind).arity != 0 + c.unbind(data == 0 ? nil : EventMachine::ERRNOS[data]) + else + c.unbind + end + # If this is an attached (but not watched) connection, close the underlying io object. + if c.instance_variable_defined?(:@io) and !c.instance_variable_get(:@watch_mode) + io = c.instance_variable_get(:@io) + begin + io.close + rescue Errno::EBADF, IOError + end + end + # As noted above, unbind absolutely must not raise an exception or the reactor will crash. + # If there is no EM.error_handler, or if the error_handler retrows, then stop the reactor, + # stash the exception in $wrapped_exception, and the exception will be raised after the + # reactor is cleaned up (see the last line of self.run). + rescue Exception => error + if instance_variable_defined? :@error_handler + begin + @error_handler.call error + # No need to stop unless error_handler rethrows + rescue Exception => error + @wrapped_exception = error + stop + end + else + @wrapped_exception = error + stop + end + end + elsif c = @acceptors.delete( conn_binding ) + # no-op + else + if $! # Bubble user generated errors. + @wrapped_exception = $! + stop + else + raise ConnectionNotBound, "received ConnectionUnbound for an unknown signature: #{conn_binding}" + end + end + elsif opcode == ConnectionAccepted + accep,args,blk = @acceptors[conn_binding] + raise NoHandlerForAcceptedConnection unless accep + c = accep.new data, *args + @conns[data] = c + blk and blk.call(c) + c # (needed?) + ## + # The remaining code is a fallback for the pure ruby and java reactors. + # In the C++ reactor, these events are handled in the C event_callback() in rubymain.cpp + elsif opcode == ConnectionCompleted + c = @conns[conn_binding] or raise ConnectionNotBound, "received ConnectionCompleted for unknown signature: #{conn_binding}" + c.connection_completed + elsif opcode == SslHandshakeCompleted + c = @conns[conn_binding] or raise ConnectionNotBound, "received SslHandshakeCompleted for unknown signature: #{conn_binding}" + c.ssl_handshake_completed + elsif opcode == SslVerify + c = @conns[conn_binding] or raise ConnectionNotBound, "received SslVerify for unknown signature: #{conn_binding}" + c.close_connection if c.ssl_verify_peer(data) == false + elsif opcode == TimerFired + t = @timers.delete( data ) + return if t == false # timer cancelled + t or raise UnknownTimerFired, "timer data: #{data}" + t.call + elsif opcode == ConnectionData + c = @conns[conn_binding] or raise ConnectionNotBound, "received data #{data} for unknown signature: #{conn_binding}" + c.receive_data data + elsif opcode == LoopbreakSignalled + run_deferred_callbacks + elsif opcode == ConnectionNotifyReadable + c = @conns[conn_binding] or raise ConnectionNotBound + c.notify_readable + elsif opcode == ConnectionNotifyWritable + c = @conns[conn_binding] or raise ConnectionNotBound + c.notify_writable + end + end + + # + # + # @private + def self._open_file_for_writing filename, handler=nil + klass = klass_from_handler(Connection, handler) + + s = _write_file filename + c = klass.new s + @conns[s] = c + block_given? and yield c + c + end + + # @private + def self.klass_from_handler(klass = Connection, handler = nil, *args) + klass = if handler and handler.is_a?(Class) + raise ArgumentError, "must provide module or subclass of #{klass.name}" unless klass >= handler + handler + elsif handler + if defined?(handler::EM_CONNECTION_CLASS) + handler::EM_CONNECTION_CLASS + else + handler::const_set(:EM_CONNECTION_CLASS, Class.new(klass) {include handler}) + end + else + klass + end + + arity = klass.instance_method(:initialize).arity + expected = arity >= 0 ? arity : -(arity + 1) + if (arity >= 0 and args.size != expected) or (arity < 0 and args.size < expected) + raise ArgumentError, "wrong number of arguments for #{klass}#initialize (#{args.size} for #{expected})" + end + + klass + end +end # module EventMachine + +# Alias for {EventMachine} +EM = EventMachine +# Alias for {EventMachine::Protocols} +EM::P = EventMachine::Protocols diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/fastfilereaderext.so b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/fastfilereaderext.so new file mode 100644 index 000000000000..04a1e2f7da2b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/fastfilereaderext.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/jeventmachine.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/jeventmachine.rb new file mode 100644 index 000000000000..21a267d70f28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/jeventmachine.rb @@ -0,0 +1,316 @@ +#-- +# +# Author:: Francis Cianfrocca (gmail: blackhedd) +# Homepage:: http://rubyeventmachine.com +# Date:: 8 Apr 2006 +# +# See EventMachine and EventMachine::Connection for documentation and +# usage examples. +# +#---------------------------------------------------------------------------- +# +# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved. +# Gmail: blackhedd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of either: 1) the GNU General Public License +# as published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version; or 2) Ruby's License. +# +# See the file COPYING for complete licensing information. +# +#--------------------------------------------------------------------------- +# +# + +# This module provides "glue" for the Java version of the EventMachine reactor core. +# For C++ EventMachines, the analogous functionality is found in ext/rubymain.cpp, +# which is a garden-variety Ruby-extension glue module. + +require 'java' +require 'rubyeventmachine' +require 'socket' + +java_import java.io.FileDescriptor +java_import java.nio.channels.SocketChannel +java_import java.lang.reflect.Field + +module JavaFields + def set_field(key, value) + field = getClass.getDeclaredField(key) + field.setAccessible(true) + if field.getType.toString == 'int' + field.setInt(self, value) + else + field.set(self, value) + end + end + + def get_field(key) + field = getClass.getDeclaredField(key) + field.setAccessible(true) + field.get(self) + end +end + +FileDescriptor.send :include, JavaFields +SocketChannel.send :include, JavaFields + +module EventMachine + # TODO: These event numbers are defined in way too many places. + # DRY them up. + # @private + TimerFired = 100 + # @private + ConnectionData = 101 + # @private + ConnectionUnbound = 102 + # @private + ConnectionAccepted = 103 + # @private + ConnectionCompleted = 104 + # @private + LoopbreakSignalled = 105 + # @private + ConnectionNotifyReadable = 106 + # @private + ConnectionNotifyWritable = 107 + # @private + SslHandshakeCompleted = 108 + # @private + SslVerify = 109 + + # @private + EM_PROTO_SSLv2 = 2 + # @private + EM_PROTO_SSLv3 = 4 + # @private + EM_PROTO_TLSv1 = 8 + # @private + EM_PROTO_TLSv1_1 = 16 + # @private + EM_PROTO_TLSv1_2 = 32 + + # Exceptions that are defined in rubymain.cpp + class ConnectionError < RuntimeError; end + class ConnectionNotBound < RuntimeError; end + class UnknownTimerFired < RuntimeError; end + class Unsupported < RuntimeError; end + + # This thunk class used to be called EM, but that caused conflicts with + # the alias "EM" for module EventMachine. (FC, 20Jun08) + class JEM < com.rubyeventmachine.EmReactor + def eventCallback a1, a2, a3, a4 + s = String.from_java_bytes(a3.array[a3.position...a3.limit]) if a3 + EventMachine::event_callback a1, a2, s || a4 + nil + end + end + # class Connection < com.rubyeventmachine.Connection + # def associate_callback_target sig + # # No-op for the time being. + # end + # end + def self.initialize_event_machine + @em = JEM.new + end + def self.release_machine + @em = nil + end + def self.add_oneshot_timer interval + @em.installOneshotTimer interval + end + def self.run_machine + @em.run + end + def self.stop + @em.stop + end + def self.start_tcp_server server, port + @em.startTcpServer server, port + end + def self.stop_tcp_server sig + @em.stopTcpServer sig + end + def self.start_unix_server filename + # TEMPORARILY unsupported until someone figures out how to do it. + raise "unsupported on this platform" + end + def self.send_data sig, data, length + @em.sendData sig, data.to_java_bytes + rescue java.lang.NullPointerException + 0 + end + def self.send_datagram sig, data, length, address, port + @em.sendDatagram sig, data.to_java_bytes, length, address, port + end + def self.connect_server server, port + bind_connect_server nil, nil, server, port + end + def self.bind_connect_server bind_addr, bind_port, server, port + @em.connectTcpServer bind_addr, bind_port.to_i, server, port + end + def self.close_connection sig, after_writing + @em.closeConnection sig, after_writing + end + def self.set_comm_inactivity_timeout sig, interval + @em.setCommInactivityTimeout sig, interval + end + def self.set_pending_connect_timeout sig, val + end + def self.set_heartbeat_interval val + end + def self.start_tls sig + @em.startTls sig + end + def self.ssl? + false + end + def self.signal_loopbreak + @em.signalLoopbreak + end + def self.set_timer_quantum q + @em.setTimerQuantum q + end + def self.epoll + # Epoll is a no-op for Java. + # The latest Java versions run epoll when possible in NIO. + end + def self.epoll= val + end + def self.kqueue + end + def self.kqueue= val + end + def self.epoll? + false + end + def self.kqueue? + false + end + def self.set_rlimit_nofile n_descriptors + # Currently a no-op for Java. + end + def self.open_udp_socket server, port + @em.openUdpSocket server, port + end + def self.invoke_popen cmd + # TEMPORARILY unsupported until someone figures out how to do it. + raise "unsupported on this platform" + end + def self.read_keyboard + # TEMPORARILY unsupported until someone figures out how to do it. + raise "temporarily unsupported on this platform" + end + def self.set_max_timer_count num + # harmless no-op in Java. There's no built-in timer limit. + @max_timer_count = num + end + def self.get_max_timer_count + # harmless no-op in Java. There's no built-in timer limit. + @max_timer_count || 100_000 + end + def self.library_type + :java + end + def self.get_peername sig + if peer = @em.getPeerName(sig) + Socket.pack_sockaddr_in(*peer) + end + end + def self.get_sockname sig + if sockName = @em.getSockName(sig) + Socket.pack_sockaddr_in(*sockName) + end + end + # @private + def self.attach_fd fileno, watch_mode + # 3Aug09: We could pass in the actual SocketChannel, but then it would be modified (set as non-blocking), and + # we would need some logic to make sure detach_fd below didn't clobber it. For now, we just always make a new + # SocketChannel for the underlying file descriptor + # if fileno.java_kind_of? SocketChannel + # ch = fileno + # ch.configureBlocking(false) + # fileno = nil + # elsif fileno.java_kind_of? java.nio.channels.Channel + + if fileno.java_kind_of? java.nio.channels.Channel + field = fileno.getClass.getDeclaredField('fdVal') + field.setAccessible(true) + fileno = field.get(fileno) + else + raise ArgumentError, 'attach_fd requires Java Channel or POSIX fileno' unless fileno.is_a? Integer + end + + if fileno == 0 + raise "can't open STDIN as selectable in Java =(" + elsif fileno.is_a? Integer + # 8Aug09: The following code is specific to the sun jvm's SocketChannelImpl. Is there a cross-platform + # way of implementing this? If so, also remember to update EventableSocketChannel#close and #cleanup + fd = FileDescriptor.new + fd.set_field 'fd', fileno + + ch = SocketChannel.open + ch.configureBlocking(false) + ch.kill + ch.set_field 'fd', fd + ch.set_field 'fdVal', fileno + ch.set_field 'state', ch.get_field('ST_CONNECTED') + end + + @em.attachChannel(ch,watch_mode) + end + def self.detach_fd sig + if ch = @em.detachChannel(sig) + ch.get_field 'fdVal' + end + end + + def self.set_notify_readable sig, mode + @em.setNotifyReadable(sig, mode) + end + def self.set_notify_writable sig, mode + @em.setNotifyWritable(sig, mode) + end + + def self.is_notify_readable sig + @em.isNotifyReadable(sig) + end + def self.is_notify_writable sig + @em.isNotifyWritable(sig) + end + def self.get_connection_count + @em.getConnectionCount + end + + def self.pause_connection(sig) + @em.pauseConnection(sig) + end + def self.resume_connection(sig) + @em.resumeConnection(sig) + end + def self.connection_paused?(sig) + @em.isConnectionPaused(sig) + end + def self._get_outbound_data_size(sig) + @em.getOutboundDataSize(sig) + end + + + def self.set_tls_parms(sig, params) + end + def self.start_tls(sig) + end + def self.send_file_data(sig, filename) + end + + class Connection + def associate_callback_target sig + # No-op for the time being + end + def get_outbound_data_size + EM._get_outbound_data_size @signature + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/rubyeventmachine.so b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/rubyeventmachine.so new file mode 100644 index 000000000000..b5db129b8105 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/lib/rubyeventmachine.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/rakelib/package.rake b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/rakelib/package.rake new file mode 100644 index 000000000000..00419d0bdb91 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/rakelib/package.rake @@ -0,0 +1,120 @@ +require 'rubygems' +require 'rubygems/package_task' + +begin + require 'rake/extensiontask' + require 'rake/javaextensiontask' +rescue LoadError => e + puts <<-MSG +rake-compiler gem seems to be missing. Please install it with + + gem install rake-compiler + +(add sudo if necessary). + MSG +end + +Gem::PackageTask.new(GEMSPEC) do |pkg| +end + +if RUBY_PLATFORM =~ /java/ + Rake::JavaExtensionTask.new("rubyeventmachine", GEMSPEC) do |ext| + ext.ext_dir = 'java/src' + end +else + def setup_cross_compilation(ext) + unless RUBY_PLATFORM =~ /mswin|mingw/ + ext.cross_compile = true + ext.cross_platform = ['x86-mingw32', 'x64-mingw32'] + end + end + def hack_cross_compilation(ext) + # inject 1.8/1.9 pure-ruby entry point + # HACK: add these dependencies to the task instead of using cross_compiling + if ext.cross_platform.is_a?(Array) + ext.cross_platform.each do |platform| + task = "native:#{GEMSPEC.name}:#{platform}" + if Rake::Task.task_defined?(task) + Rake::Task[task].prerequisites.unshift "lib/#{ext.name}.rb" + end + end + end + end + + em = Rake::ExtensionTask.new("rubyeventmachine", GEMSPEC) do |ext| + ext.ext_dir = 'ext' + ext.source_pattern = '*.{h,c,cpp}' + setup_cross_compilation(ext) + end + hack_cross_compilation em + + ff = Rake::ExtensionTask.new("fastfilereaderext", GEMSPEC) do |ext| + ext.ext_dir = 'ext/fastfilereader' + ext.source_pattern = '*.{h,c,cpp}' + setup_cross_compilation(ext) + end + hack_cross_compilation ff +end + +# Setup shim files that require 1.8 vs 1.9 extensions in win32 bin gems +%w[ rubyeventmachine fastfilereaderext ].each do |filename| + file("lib/#{filename}.rb") do |t| + File.open(t.name, 'wb') do |f| + f.write <<-eoruby + RUBY_VERSION =~ /(\\d+.\\d+)/ + require "\#{$1}/#{File.basename(t.name, '.rb')}" + eoruby + end + at_exit{ FileUtils.rm t.name if File.exist?(t.name) } + end +end + +task :cross_cxx do + ENV['CROSS_COMPILING'] = 'yes' + require 'rake/extensioncompiler' + ENV['CXX'] = "#{Rake::ExtensionCompiler.mingw_host}-g++" +end + +if Rake::Task.task_defined?(:cross) + task :cross => 'lib/rubyeventmachine.rb' + task :cross => 'lib/fastfilereaderext.rb' + task :cross => :cross_cxx +end + +def windows?; RUBY_PLATFORM =~ /mswin|mingw/; end +def sudo(cmd) + if windows? || (require 'etc'; Etc.getpwuid.uid == 0) + sh cmd + else + sh "sudo #{cmd}" + end +end +def gem_cmd(action, name, *args) + rb = Gem.ruby rescue nil + rb ||= (require 'rbconfig'; File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])) + sudo "#{rb} -r rubygems -e 'require %{rubygems/gem_runner}; Gem::GemRunner.new.run(%w{#{action} #{name} #{args.join(' ')}})'" +end + +Rake::Task[:clean].enhance [:clobber_package] + +# DevKit task following the example of Luis Lavena's test-ruby-c-extension +task :devkit do + begin + require "devkit" + rescue LoadError => e + abort "Failed to activate RubyInstaller's DevKit required for compilation." + end +end + +if RUBY_PLATFORM =~ /mingw|mswin/ + Rake::Task['compile'].prerequisites.unshift 'devkit' +end + +desc "Build binary gems for Windows with rake-compiler-dock" +task 'gem:windows' do + require 'rake_compiler_dock' + RakeCompilerDock.sh <<-EOT + RUBY_CC_VERSION="${RUBY_CC_VERSION//1.8.7/}" + bundle && rake cross native gem + EOT +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/rakelib/test.rake b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/rakelib/test.rake new file mode 100644 index 000000000000..1185ac70c856 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/rakelib/test.rake @@ -0,0 +1,8 @@ +require 'rake/testtask' + +Rake::TestTask.new(:test) do |t| + t.libs << "tests" + t.libs << "lib" + t.pattern = 'tests/**/test_*.rb' + t.warning = true +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/rakelib/test_pure.rake b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/rakelib/test_pure.rake new file mode 100644 index 000000000000..5a84ded20713 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/rakelib/test_pure.rake @@ -0,0 +1,13 @@ +require 'rake/testtask' + +Rake::TestTask.new(:test_pure) do |t| + t.libs << 'tests' + t.libs << 'lib' + t.test_files = Dir.glob('tests/**/test_pure*.rb') + Dir.glob('tests/**/test_ssl*.rb') + t.warning = true +end + +task :test_em_pure_ruby do + ENV['EM_PURE_RUBY'] = 'true' + Rake::Task['test_pure'].execute +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/client.crt b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/client.crt new file mode 100644 index 000000000000..1919d976c6a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/client.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFRDCCAywCAQEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCRU0xFTATBgNV +BAgTDEV2ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQL +EwtEZXZlbG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMB4XDTA5MDMyOTAy +MzE0NloXDTEwMDMyOTAyMzE0NlowaDELMAkGA1UEBhMCRU0xFTATBgNVBAgTDEV2 +ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQLEwtEZXZl +bG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEAv1FSOIX1z7CQtVBFlrB0A3/V29T+22STKKmiRWYkKL5b ++hkrp9IZ5J4phZHgUVM2VDPOO2Oc2PU6dlGGZISg+UPERunTogxQKezCV0vcE9cK +OwzxCFDRvv5rK8aKMscfBLbNKocAXywuRRQmdxPiVRzbyPrl+qCr/EDLXAX3D77l +S8n2AwDg19VyI+IgFUE+Dy5e1eLoY6nV+Mq+vNXdn3ttF3t+ngac5pj5Q9h+pD5p +67baDHSnf/7cy2fa/LKrLolVHQR9G2K6cEfeM99NtcsMbkoPs4iI3FA05OVTQHXg +C8C8cRxrb9APl95I/ep65OIaCJgcdYxJ3QD3qOtQo6/NQsGnjbyiUxaEpjfqyT1N +uzWD81Q8uXGNS8yD6dDynt/lseBjyp2nfC3uQ5fY18VdIcu0MJ9pezBUKrNuhlsy +XXEZ2DXj4sY8QOvIcBqSB/zmS1nGEK55xrtkaiaNrY8fe8wRVpcPLxy+P225NFw+ +B69FJRA0Lj6Jt9BM4hV/3MSIEWwTVhuw4E02ywDYTzz1wq3ITf0tsbIPn0hXQMxD +ohhAoKioM6u+yHtqsxD0eYaAWmHTVn5oDvOSGpvCpBfWHyA7FP5UQak0fKABEAgK +iQYEnb294AXwXymJttfGTIV/Ne4tLN5dIpNma8UO8rlThlcr6xnTQDbR3gkTDRsC +AwEAATANBgkqhkiG9w0BAQUFAAOCAgEAj7J8fy1LUWoVWnrXDAC9jwJ1nI/YjoSU +6ywke3o04+nZC5S+dPnuVy+HAwsU940CoNvP6RStI/bH6JL+NIqEFmwM3M8xIEWV +MYVPkfvQUxxGvDnaY7vv93u+6Q77HV3qlhAQBHChyuXyO7TG3+WzsiT9AnBNtAP0 +4jClt5kCAQXLO/p0SFEZQ8Ru9SM8d1i73Z0VDVzs8jYWlBhiherSgbw1xK4wBOpJ +43XmjZsBSrDpiAXd07Ak3UL2GjfT7eStgebL3UIe39ThE/s/+l43bh0M6WbOBvyQ +i/rZ50kd1GvN0xnZhtv07hIJWO85FGWi7Oet8AzdUZJ17v1Md/f2vdhPVTFN9q+w +mQ6LxjackqCvaJaQfBEbqsn2Tklxk4tZuDioiQbOElT2e6vljQVJWIfNx38Ny2LM +aiXQPQu+4CI7meAh5gXM5nyJGbZvRPsxj89CqYzyHCYs5HBP3AsviBvn26ziOF+c +544VmHd9HkIv8UTC29hh+R64RlgMQQQdaXFaUrFPTs/do0k8n/c2bPc0iTdfi5Q2 +gq6Vi8q6Ay5wGgTtRRbn/mWKuCFjEh94z6pF9Xr06NX0PuEOdf+Ls9vI5vz6G0w6 +0Li7devEN7EKBY+7Mcjg918yq9i5tEiMkUgT68788t3fTC+4iUQ5fDtdrHsaOlIR +8bs/XQVNE/s= +-----END CERTIFICATE----- diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/client.key b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/client.key new file mode 100644 index 000000000000..87a25311c7d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/client.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIJKAIBAAKCAgEAv1FSOIX1z7CQtVBFlrB0A3/V29T+22STKKmiRWYkKL5b+hkr +p9IZ5J4phZHgUVM2VDPOO2Oc2PU6dlGGZISg+UPERunTogxQKezCV0vcE9cKOwzx +CFDRvv5rK8aKMscfBLbNKocAXywuRRQmdxPiVRzbyPrl+qCr/EDLXAX3D77lS8n2 +AwDg19VyI+IgFUE+Dy5e1eLoY6nV+Mq+vNXdn3ttF3t+ngac5pj5Q9h+pD5p67ba +DHSnf/7cy2fa/LKrLolVHQR9G2K6cEfeM99NtcsMbkoPs4iI3FA05OVTQHXgC8C8 +cRxrb9APl95I/ep65OIaCJgcdYxJ3QD3qOtQo6/NQsGnjbyiUxaEpjfqyT1NuzWD +81Q8uXGNS8yD6dDynt/lseBjyp2nfC3uQ5fY18VdIcu0MJ9pezBUKrNuhlsyXXEZ +2DXj4sY8QOvIcBqSB/zmS1nGEK55xrtkaiaNrY8fe8wRVpcPLxy+P225NFw+B69F +JRA0Lj6Jt9BM4hV/3MSIEWwTVhuw4E02ywDYTzz1wq3ITf0tsbIPn0hXQMxDohhA +oKioM6u+yHtqsxD0eYaAWmHTVn5oDvOSGpvCpBfWHyA7FP5UQak0fKABEAgKiQYE +nb294AXwXymJttfGTIV/Ne4tLN5dIpNma8UO8rlThlcr6xnTQDbR3gkTDRsCAwEA +AQKCAgB495RDRQB9x6hX3F+DviI8rDGug+h5FAiwJ0IBG2o1kNdbNVsTC5dvpEmg +uPHaugCaEP+PMZbU34mNklKlb+7QbPbH18UGqz5so9TlmYOXz9oaKD6nAWL9nqRo +02pCXQDR3DuxbhbgFnFTIECJ/jqXkl2toGaVp83W+6kZkHP8srkMyLASihWgosc+ +xRWAGvaAZtNz7br+eT5fxuH/SEKPOl1qAZ23kXrXm1XQfizk8MnMTptkUMYv+hfl +TM98BASUsiTs6g+opy43HFn09naOQcqkWZO/8s6Gbvhi2lVfZqi5Ba6g3lVYJ3gU +kGoako4N9qB7WqJz+LYjVR9C4TbkkJ9OD6ArwGAx5IIzC3XKSxCyY/pUn4YumPhY +fjvY/km54TBtx/isS1TAgjSgDUxbzrfbkh7afOXSOniy9bWJMgNqHF61dqxWxmUg +F5Tch9zH3qFFVkXpYzDU/R8ZV+CRouCvhn0eZYDh8IqIAwjH0VjkxjPyQtrdrMd3 +gDKMVKoY31EOMLZzv8a0prjpr15A+uw30tT336qb3fofks4pZKUJw8ru9jJVir2p ++RML6iUHCmIeceF7/N1meooSMLPJe0xgKeMb9M4Wtd/et2UNVtP8nCDG622rf2a0 +F/EudXuFgc3FB8nXRw9TCkw9xKQff38edG5xPFUEgqObbVl5YQKCAQEA5DDKGOmp +EO5Zuf/kZfG6/AMMYwAuv1HrYTV2w/HnI3tyQ34Xkeqo+I/OqmRk68Ztxw4Kx1So +SRavkotrlWhhDpl2+Yn1BjkHktSoOdf9gJ9z9llkLmbOkBjmupig1NUB7fq/4y2k +MdqJXDy3uVKHJ97gxdIheMTyHiKuMJPnuT5lZtlT210Ig82P7sLQb/sgCfKVFTr0 +Z3haQ5/tBNKjq+igT4nMBWupOTD1q2GeZLIZACnmnUIhvu+3/bm0l+wiCB0DqF0T +Wy9tlL3fqQSCqzevL7/k5Lg6tJTaP/XYePB73TsOtAXgIaoltXgRBsBUeE1eaODx +kMT6E1PPtn7EqQKCAQEA1qImmTWGqhKICrwje40awPufFtZ/qXKVCN/V+zYsrJV1 +EnZpUDM+zfitlQCugnrQVHSpgfekI6mmVkmogO3fkNjUFTq+neg7IHOUHnqotx+3 +NMqIsyFInGstu9mfPd26fzZjUtx5wKF38LDTIJJAEJ83U3UpPBfpwKmiOGDXOa54 +2i4em/bb/hrQR6JySruZYLi0fXnGI5ZOfpkHgC/KOFkKNKAg2oh4B9qo7ACyiSNk +yojb2mmn6g1OLPxi7wGUSrkS1HQq4an6RZ+eUO0HXVWag0QStdQ91M9IrIHgSBBG +0e86Ar6jtD579gqsbz4ySpI/FqEI9obTC+E1/b0aIwKCAQAGz334qGCnZLXA22ZR +tJlEFEM2YTcD9snzqMjWqE2hvXl3kjfZ3wsUABbG9yAb+VwlaMHhmSE8rTSoRwj6 ++JaM/P+UCw4JFYKoWzh6IXwrbpbjb1+SEvdvTY71WsDSGVlpZOZ9PUt9QWyAGD/T +hCcMhZZn0RG2rQoc5CQWxxNPcBFOtIXQMkKizGvTUHUwImqeYWMZsxzASdNH2WoV +jsPbyaGfPhmcv83ZKyDp8IvtrXMZkiaT4vlm3Xi8VeKR9jY9z7/gMob1XcEDg3c9 +cCkGOy87WZrXSLhX02mAJzJCycqom66gqNw7pPxjIiY/8VWUEZsTvkL3cymTkhjM +9ZOhAoIBAGUaNqJe01NTrV+ZJgGyAxM6s8LXQYV5IvjuL2bJKxwUvvP2cT9FFGWD +qYiRrKJr5ayS07IUC+58oIzu33/0DSa27JgfduD9HrT3nKMK1mSEfRFSAjiXChQc +bIubRGapBoub/AdxMazqoovvT1R9b84kobQfcVAMV6DYh0CVZWyXYfgsV2DSVOiK +iufjfoDzg5lLCEI+1XW3/LunrB/W4yPN1X/amf8234ublYyt+2ucD4NUGnP05xLa +N6P7M0MwdEEKkvMe0YBBSFH5kWK/dIOjqkgBDes20fVnuuz/tL1dZW7IiIP4dzaV +ZGEOwBEatCfqYetv6b/u3IUxDfS7Wg8CggEBALoOwkn5LGdQg+bpdZAKJspGnJWL +Kyr9Al2tvgc69rxfpZqS5eDLkYYCzWPpspSt0Axm1O7xOUDQDt42luaLNGJzHZ2Q +Hn0ZNMhyHpe8d8mIQngRjD+nuLI/uFUglPzabDOCOln2aycjg1mA6ecXP1XMEVbu +0RB/0IE36XTMfZ+u9+TRjkBLpmUaX1FdIQQWfwUou/LfaXotoQlhSGAcprLrncuJ +T44UATYEgO/q9pMM33bdE3eBYZHoT9mSvqoLCN4s0LuwOYItIxLKUj0GulL0VQOI +SZi+0A1c8cVDXgApkBrWPDQIR9JS4de0gW4hnDoUvHtUc2TYPRnz6N9MtFY= +-----END RSA PRIVATE KEY----- diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/dhparam.pem b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/dhparam.pem new file mode 100644 index 000000000000..b6464ab837e0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/dhparam.pem @@ -0,0 +1,13 @@ +-----BEGIN DH PARAMETERS----- +MIICCAKCAgEAikiatXa5aAteOtd6hOO33npjCvJByD3dwuM8rWzz0DFZdUH9nFJi +b0VvTVweVECb6XZBsrDNLqGQykCrm43swSk5D9XQCGJLxFERD6yk3b90xaeCm3/a +b0Ek5ZVvV73Cc/YbVmpBiOHoTFpUFJLZ7pLMQUSn8y3qUlNcY9/88HuwFi1s1lRM +ovihSRyZMYAuYWOD4yuOuIcroKVjD6gWFrsW9XrALWny6vUXQrhk8Q3rj+wM6ZtE +5afcB0b6ZJtphrDfk3dFjOVG/zVT37VWgrY8GABrpo2ey0W0WIQJ7rDKLaPaI4kc +voOgC2K8Z3kSARZK+jULnwmBeYECz4EH/FF6FEp3GOKtkL4mqEkvh1n5EAesDOGl +iiX+RZXcUrZliSeifSXBTMJWWFVC0fkGIMb9PTZfZHyAC54lpuxzVki0HIyQG9Fs +41zBJ5e8eEoXXlfUYtduUC35YGy2IxSzYLAJE76rctAZSWghha9xLOCDFoLjMr8h +FosKeHKJcBQ0bc8ymOpRIfrYLWhc0Pz2zkpJ/4eYw9t7NYg7S+jP19IE0gUnuM9v +SpoYMtS28tP9nEdokdwuBKD0D3bJEBBefDlHgfXoMgvy9Hivc9PBGGNTNpyFPpwF +sWVAkfhoNMJMC5V7LZsze+lftiDtzVoLSPDa9bO4BK7b/MgwCxfOhGsCAQI= +-----END DH PARAMETERS----- diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/em_test_helper.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/em_test_helper.rb new file mode 100644 index 000000000000..20a3e59a6586 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/em_test_helper.rb @@ -0,0 +1,154 @@ +require 'em/pure_ruby' if ENV['EM_PURE_RUBY'] +require 'eventmachine' +require 'test/unit' +require 'rbconfig' +require 'socket' + +puts "EM Library Type: #{EM.library_type}" + +class Test::Unit::TestCase + class EMTestTimeout < StandardError ; end + + def setup_timeout(timeout = TIMEOUT_INTERVAL) + EM.schedule { + EM.add_timer(timeout) { + raise EMTestTimeout, "Test was cancelled after #{timeout} seconds." + } + } + end + + def port_in_use?(port, host="127.0.0.1") + s = TCPSocket.new(host, port) + s.close + s + rescue Errno::ECONNREFUSED + false + end + + def next_port + @@port ||= 9000 + begin + @@port += 1 + end while port_in_use?(@@port) + + @@port + end + + # Returns true if the host have a localhost 127.0.0.1 IPv4. + def self.local_ipv4? + return @@has_local_ipv4 if defined?(@@has_local_ipv4) + begin + get_my_ipv4_address "127.0.0.1" + @@has_local_ipv4 = true + rescue + @@has_local_ipv4 = false + end + end + + # Returns true if the host have a public IPv4 and stores it in + # @@public_ipv4. + def self.public_ipv4? + return @@has_public_ipv4 if defined?(@@has_public_ipv4) + begin + @@public_ipv4 = get_my_ipv4_address "1.2.3.4" + @@has_public_ipv4 = true + rescue + @@has_public_ipv4 = false + end + end + + # Returns true if the host have a localhost ::1 IPv6. + def self.local_ipv6? + return @@has_local_ipv6 if defined?(@@has_local_ipv6) + begin + get_my_ipv6_address "::1" + @@has_local_ipv6 = true + rescue + @@has_local_ipv6 = false + end + end + + # Returns true if the host have a public IPv6 and stores it in + # @@public_ipv6. + def self.public_ipv6? + return @@has_public_ipv6 if defined?(@@has_public_ipv6) + begin + @@public_ipv6 = get_my_ipv6_address "2001::1" + @@has_public_ipv6 = true + rescue + @@has_public_ipv6 = false + end + end + + # Returns an array with the localhost addresses (IPv4 and/or IPv6). + def local_ips + return @@local_ips if defined?(@@local_ips) + @@local_ips = [] + @@local_ips << "127.0.0.1" if self.class.local_ipv4? + @@local_ips << "::1" if self.class.local_ipv6? + @@local_ips + end + + def exception_class + jruby? ? NativeException : RuntimeError + end + + module PlatformHelper + # http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/ + def windows? + RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ + end + + def solaris? + RUBY_PLATFORM =~ /solaris/ + end + + # http://stackoverflow.com/questions/1342535/how-can-i-tell-if-im-running-from-jruby-vs-ruby/1685970#1685970 + def jruby? + defined? JRUBY_VERSION + end + + def rbx? + defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx' + end + end + + include PlatformHelper + extend PlatformHelper + + # Tests run significantly slower on windows. YMMV + TIMEOUT_INTERVAL = windows? ? 1 : 0.25 + + def silent + backup, $VERBOSE = $VERBOSE, nil + begin + yield + ensure + $VERBOSE = backup + end + end + + + private + + def self.get_my_ipv4_address ip + orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily + UDPSocket.open(Socket::AF_INET) do |s| + s.connect ip, 1 + s.addr.last + end + ensure + Socket.do_not_reverse_lookup = orig + end + + def self.get_my_ipv6_address ip + orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily + UDPSocket.open(Socket::AF_INET6) do |s| + s.connect ip, 1 + s.addr.last + end + ensure + Socket.do_not_reverse_lookup = orig + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_attach.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_attach.rb new file mode 100644 index 000000000000..4a55017c95aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_attach.rb @@ -0,0 +1,151 @@ +require 'em_test_helper' +require 'socket' + +class TestAttach < Test::Unit::TestCase + class EchoServer < EM::Connection + def receive_data data + $received_data << data + send_data data + end + end + + class EchoClient < EM::Connection + def initialize socket + self.notify_readable = true + @socket = socket + @socket.write("abc\n") + end + + def notify_readable + $read = @socket.readline + $fd = detach + end + + def unbind + EM.next_tick do + @socket.write("def\n") + EM.add_timer(0.1) { EM.stop } + end + end + end + + def setup + @port = next_port + $read, $r, $w, $fd = nil + $received_data = "" + end + + def teardown + [$r, $w].each do |io| + io.close rescue nil + end + $received_data = nil + end + + def test_attach + socket = nil + + EM.run { + EM.start_server "127.0.0.1", @port, EchoServer + socket = TCPSocket.new "127.0.0.1", @port + EM.watch socket, EchoClient, socket + } + + assert_equal $read, "abc\n" + unless jruby? # jruby filenos are not real + assert_equal $fd, socket.fileno + end + assert_equal false, socket.closed? + assert_equal socket.readline, "def\n" + end + + module PipeWatch + def notify_readable + $read = $r.readline + EM.stop + end + end + + def test_attach_server + omit_if(jruby?) + $before = TCPServer.new("127.0.0.1", @port) + sig = nil + EM.run { + sig = EM.attach_server $before, EchoServer + + handler = Class.new(EM::Connection) do + def initialize + send_data "hello world" + close_connection_after_writing + EM.add_timer(0.1) { EM.stop } + end + end + EM.connect("127.0.0.1", @port, handler) + } + + assert_equal false, $before.closed? + assert_equal "hello world", $received_data + assert sig.is_a?(Integer) + end + + def test_attach_pipe + EM.run{ + $r, $w = IO.pipe + EM.watch $r, PipeWatch do |c| + c.notify_readable = true + end + $w.write("ghi\n") + } + + assert_equal $read, "ghi\n" + end + + def test_set_readable + before, after = nil + + EM.run{ + $r, $w = IO.pipe + c = EM.watch $r, PipeWatch do |con| + con.notify_readable = false + end + + EM.next_tick{ + before = c.notify_readable? + c.notify_readable = true + after = c.notify_readable? + } + + $w.write("jkl\n") + } + + assert !before + assert after + assert_equal $read, "jkl\n" + end + + def test_read_write_pipe + result = nil + + pipe_reader = Module.new do + define_method :receive_data do |data| + result = data + EM.stop + end + end + + r,w = IO.pipe + + EM.run { + EM.attach r, pipe_reader + writer = EM.attach(w) + writer.send_data 'ghi' + + # XXX: Process will hang in Windows without this line + writer.close_connection_after_writing + } + + assert_equal "ghi", result + ensure + [r,w].each {|io| io.close rescue nil } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_basic.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_basic.rb new file mode 100644 index 000000000000..4d7252400ec5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_basic.rb @@ -0,0 +1,321 @@ +require 'em_test_helper' +require 'socket' + +class TestBasic < Test::Unit::TestCase + def setup + @port = next_port + end + + def test_connection_class_cache + mod = Module.new + a, b = nil, nil + EM.run { + EM.start_server '127.0.0.1', @port, mod + a = EM.connect '127.0.0.1', @port, mod + b = EM.connect '127.0.0.1', @port, mod + EM.stop + } + assert_equal a.class, b.class + assert_kind_of EM::Connection, a + end + + #------------------------------------- + + + def test_em + assert_nothing_raised do + EM.run { + setup_timeout + EM.add_timer 0 do + EM.stop + end + } + end + end + + #------------------------------------- + + def test_timer + assert_nothing_raised do + EM.run { + setup_timeout + n = 0 + EM.add_periodic_timer(0.1) { + n += 1 + EM.stop if n == 2 + } + } + end + end + + #------------------------------------- + + # This test once threw an already-running exception. + module Trivial + def post_init + EM.stop + end + end + + def test_server + assert_nothing_raised do + EM.run { + setup_timeout + EM.start_server "127.0.0.1", @port, Trivial + EM.connect "127.0.0.1", @port + } + end + end + + #-------------------------------------- + + # EM#run_block starts the reactor loop, runs the supplied block, and then STOPS + # the loop automatically. Contrast with EM#run, which keeps running the reactor + # even after the supplied block completes. + def test_run_block + assert !EM.reactor_running? + a = nil + EM.run_block { a = "Worked" } + assert a + assert !EM.reactor_running? + end + + class UnbindError < EM::Connection + ERR = Class.new(StandardError) + def initialize *args + super + end + def connection_completed + close_connection_after_writing + end + def unbind + raise ERR + end + end + + def test_unbind_error_during_stop + assert_raises( UnbindError::ERR ) { + EM.run { + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, UnbindError do + EM.stop + end + } + } + end + + def test_unbind_error + EM.run { + EM.error_handler do |e| + assert(e.is_a?(UnbindError::ERR)) + EM.stop + end + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, UnbindError + } + + # Remove the error handler before the next test + EM.error_handler(nil) + end + + module BrsTestSrv + def receive_data data + $received << data + end + def unbind + EM.stop + end + end + module BrsTestCli + def post_init + send_data $sent + close_connection_after_writing + end + end + + # From ticket #50 + def test_byte_range_send + $received = '' + $sent = (0..255).to_a.pack('C*') + EM::run { + EM::start_server "127.0.0.1", @port, BrsTestSrv + EM::connect "127.0.0.1", @port, BrsTestCli + + setup_timeout + } + assert_equal($sent, $received) + end + + def test_bind_connect + pend('FIXME: this test is broken on Windows') if windows? + + local_ip = UDPSocket.open {|s| s.connect('localhost', 80); s.addr.last } + + bind_port = next_port + + port, ip = nil + bound_server = Module.new do + define_method :post_init do + begin + port, ip = Socket.unpack_sockaddr_in(get_peername) + ensure + EM.stop + end + end + end + + EM.run do + setup_timeout + EM.start_server "127.0.0.1", @port, bound_server + EM.bind_connect local_ip, bind_port, "127.0.0.1", @port + end + + assert_equal bind_port, port + assert_equal local_ip, ip + end + + def test_invalid_address_bind_connect_dst + e = nil + EM.run do + begin + EM.bind_connect('localhost', nil, 'invalid.invalid', 80) + rescue Exception => e + # capture the exception + ensure + EM.stop + end + end + + assert_kind_of(EventMachine::ConnectionError, e) + assert_match(/unable to resolve address:.*not known/, e.message) + end + + def test_invalid_address_bind_connect_src + e = nil + EM.run do + begin + EM.bind_connect('invalid.invalid', nil, 'localhost', 80) + rescue Exception => e + # capture the exception + ensure + EM.stop + end + end + + assert_kind_of(EventMachine::ConnectionError, e) + assert_match(/invalid bind address:.*not known/, e.message) + end + + def test_reactor_thread? + assert !EM.reactor_thread? + EM.run { assert EM.reactor_thread?; EM.stop } + assert !EM.reactor_thread? + end + + def test_schedule_on_reactor_thread + x = false + EM.run do + EM.schedule { x = true } + EM.stop + end + assert x + end + + def test_schedule_from_thread + x = false + EM.run do + Thread.new { EM.schedule { x = true; EM.stop } }.join + end + assert x + end + + def test_set_heartbeat_interval + omit_if(jruby?) + interval = 0.5 + EM.run { + EM.set_heartbeat_interval interval + $interval = EM.get_heartbeat_interval + EM.stop + } + assert_equal(interval, $interval) + end + + module PostInitRaiser + ERR = Class.new(StandardError) + def post_init + raise ERR + end + end + + def test_bubble_errors_from_post_init + assert_raises(PostInitRaiser::ERR) do + EM.run do + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, PostInitRaiser + end + end + end + + module InitializeRaiser + ERR = Class.new(StandardError) + def initialize + raise ERR + end + end + + def test_bubble_errors_from_initialize + assert_raises(InitializeRaiser::ERR) do + EM.run do + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, InitializeRaiser + end + end + end + + def test_schedule_close + omit_if(jruby?) + localhost, port = '127.0.0.1', 9000 + timer_ran = false + num_close_scheduled = nil + EM.run do + assert_equal 0, EM.num_close_scheduled + EM.add_timer(1) { timer_ran = true; EM.stop } + EM.start_server localhost, port do |s| + s.close_connection + num_close_scheduled = EM.num_close_scheduled + end + EM.connect localhost, port do |c| + def c.unbind + EM.stop + end + end + end + assert !timer_ran + assert_equal 1, num_close_scheduled + end + + def test_error_handler_idempotent # issue 185 + errors = [] + ticks = [] + EM.error_handler do |e| + errors << e + end + + EM.run do + EM.next_tick do + ticks << :first + raise + end + EM.next_tick do + ticks << :second + end + EM.add_timer(0.001) { EM.stop } + end + + # Remove the error handler before the next test + EM.error_handler(nil) + + assert_equal 1, errors.size + assert_equal [:first, :second], ticks + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_channel.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_channel.rb new file mode 100644 index 000000000000..c54bf1da7e88 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_channel.rb @@ -0,0 +1,75 @@ +require 'em_test_helper' + +class TestEMChannel < Test::Unit::TestCase + def test_channel_subscribe + s = 0 + EM.run do + c = EM::Channel.new + c.subscribe { |v| s = v; EM.stop } + c << 1 + end + assert_equal 1, s + end + + def test_channel_unsubscribe + s = 0 + EM.run do + c = EM::Channel.new + subscription = c.subscribe { |v| s = v } + c.unsubscribe(subscription) + c << 1 + EM.next_tick { EM.stop } + end + assert_not_equal 1, s + end + + def test_channel_pop + s = 0 + EM.run do + c = EM::Channel.new + c.pop{ |v| s = v } + c.push(1,2,3) + c << 4 + c << 5 + EM.next_tick { EM.stop } + end + assert_equal 1, s + end + + def test_channel_reactor_thread_push + out = [] + c = EM::Channel.new + c.subscribe { |v| out << v } + Thread.new { c.push(1,2,3) }.join + assert out.empty? + + EM.run { EM.next_tick { EM.stop } } + + assert_equal [1,2,3], out + end + + def test_channel_reactor_thread_callback + out = [] + c = EM::Channel.new + Thread.new { c.subscribe { |v| out << v } }.join + c.push(1,2,3) + assert out.empty? + + EM.run { EM.next_tick { EM.stop } } + + assert_equal [1,2,3], out + end + + def test_channel_num_subscribers + subs = 0 + EM.run do + c = EM::Channel.new + c.subscribe { |v| s = v } + c.subscribe { |v| s = v } + EM.next_tick { EM.stop } + subs = c.num_subscribers + end + + assert_equal subs, 2 + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_completion.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_completion.rb new file mode 100644 index 000000000000..1bd9a8f4e650 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_completion.rb @@ -0,0 +1,178 @@ +require 'em_test_helper' +require 'em/completion' + +class TestCompletion < Test::Unit::TestCase + def completion + @completion ||= EM::Completion.new + end + + def crank + # This is a slow solution, but this just executes the next tick queue + # once. It's the easiest way for now. + EM.run { EM.stop } + end + + def results + @results ||= [] + end + + def test_state + assert_equal :unknown, completion.state + end + + def test_succeed + completion.callback { |val| results << val } + completion.succeed :object + crank + assert_equal :succeeded, completion.state + assert_equal [:object], results + end + + def test_fail + completion.errback { |val| results << val } + completion.fail :object + crank + assert_equal :failed, completion.state + assert_equal [:object], results + end + + def test_callback + completion.callback { results << :callback } + completion.errback { results << :errback } + completion.succeed + crank + assert_equal [:callback], results + end + + def test_errback + completion.callback { results << :callback } + completion.errback { results << :errback } + completion.fail + crank + assert_equal [:errback], results + end + + def test_stateback + completion.stateback(:magic) { results << :stateback } + completion.change_state(:magic) + crank + assert_equal [:stateback], results + end + + def test_does_not_enqueue_when_completed + completion.callback { results << :callback } + completion.succeed + completion.errback { results << :errback } + completion.fail + crank + assert_equal [:callback], results + end + + def test_completed + assert_equal false, completion.completed? + completion.succeed + assert_equal true, completion.completed? + completion.fail + assert_equal true, completion.completed? + completion.change_state :magic + assert_equal false, completion.completed? + end + + def test_recursive_callbacks + completion.callback do |val| + results << val + completion.succeed :two + end + completion.callback do |val| + results << val + completion.succeed :three + end + completion.callback do |val| + results << val + end + completion.succeed :one + crank + assert_equal [:one, :two, :three], results + end + + def test_late_defined_callbacks + completion.callback { results << :one } + completion.succeed + crank + assert_equal [:one], results + completion.callback { results << :two } + crank + assert_equal [:one, :two], results + end + + def test_cleared_completions + completion.callback { results << :callback } + completion.errback { results << :errback } + + completion.succeed + crank + completion.fail + crank + completion.succeed + crank + + assert_equal [:callback], results + end + + def test_skip_completed_callbacks + completion.callback { results << :callback } + completion.succeed + crank + + completion.errback { results << :errback } + completion.fail + crank + + assert_equal [:callback], results + end + + def test_completions + completion.completion { results << :completion } + completion.succeed + crank + assert_equal [:completion], results + + completion.change_state(:unknown) + results.clear + + completion.completion { results << :completion } + completion.fail + crank + assert_equal [:completion], results + end + + def test_latent_completion + completion.completion { results << :completion } + completion.succeed + crank + completion.completion { results << :completion } + crank + assert_equal [:completion, :completion], results + end + + def test_timeout + args = [1, 2, 3] + EM.run do + completion.timeout(0.0001, *args) + completion.errback { |*errargs| results << errargs } + completion.completion { EM.stop } + EM.add_timer(0.1) { flunk 'test timed out' } + end + assert_equal [[1,2,3]], results + end + + def test_timeout_gets_cancelled + EM.run do + completion.timeout(0.0001, :timeout) + completion.errback { results << :errback } + completion.succeed + EM.add_timer(0.0002) { EM.stop } + end + assert_equal [], results + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_connection_count.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_connection_count.rb new file mode 100644 index 000000000000..350c41774aa2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_connection_count.rb @@ -0,0 +1,83 @@ +require 'em_test_helper' + +class TestConnectionCount < Test::Unit::TestCase + def teardown + EM.epoll = false + EM.kqueue = false + end + + def test_idle_connection_count + count = nil + EM.run { + count = EM.connection_count + EM.stop_event_loop + } + assert_equal(0, count) + end + + # Run this again with epoll enabled (if available) + def test_idle_connection_count_epoll + EM.epoll if EM.epoll? + + count = nil + EM.run { + count = EM.connection_count + EM.stop_event_loop + } + assert_equal(0, count) + end + + # Run this again with kqueue enabled (if available) + def test_idle_connection_count_kqueue + EM.kqueue if EM.kqueue? + + count = nil + EM.run { + count = EM.connection_count + EM.stop_event_loop + } + assert_equal(0, count) + end + + module Client + def connection_completed + $client_conns += 1 + EM.stop if $client_conns == 3 + end + end + + def test_with_some_connections + EM.run { + $client_conns = 0 + $initial_conns = EM.connection_count + EM.start_server("127.0.0.1", 9999) + $server_conns = EM.connection_count + 3.times { EM.connect("127.0.0.1", 9999, Client) } + } + + assert_equal(0, $initial_conns) + assert_equal(1, $server_conns) + assert_equal(4, $client_conns + $server_conns) + end + + module DoubleCloseClient + def unbind + close_connection + $num_close_scheduled_1 = EM.num_close_scheduled + EM.next_tick do + $num_close_scheduled_2 = EM.num_close_scheduled + EM.stop + end + end + end + + def test_num_close_scheduled + omit_if(jruby?) + EM.run { + assert_equal(0, EM.num_close_scheduled) + EM.connect("127.0.0.1", 9999, DoubleCloseClient) # nothing listening on 9999 + } + assert_equal(1, $num_close_scheduled_1) + assert_equal(0, $num_close_scheduled_2) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_connection_write.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_connection_write.rb new file mode 100644 index 000000000000..35533b526e70 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_connection_write.rb @@ -0,0 +1,35 @@ +require 'em_test_helper' + +class TestConnectionWrite < Test::Unit::TestCase + + # This test takes advantage of the fact that EM::_RunSelectOnce iterates over the connections twice: + # - once to determine which ones to call Write() on + # - and once to call Write() on each of them. + # + # But state may change in the meantime before Write() is finally called. + # And that is what we try to exploit to get Write() to be called when bWatchOnly is true, and bNotifyWritable is false, + # to cause an assertion failure. + + module SimpleClient + def notify_writable + $conn2.notify_writable = false # Being naughty in callback + # If this doesn't crash anything, the test passed! + end + end + + def test_with_naughty_callback + EM.run do + r1, _ = IO.pipe + r2, _ = IO.pipe + + # Adding EM.watches + $conn1 = EM.watch(r1, SimpleClient) + $conn2 = EM.watch(r2, SimpleClient) + + $conn1.notify_writable = true + $conn2.notify_writable = true + + EM.stop + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_defer.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_defer.rb new file mode 100644 index 000000000000..aeca127d89ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_defer.rb @@ -0,0 +1,35 @@ +require 'em_test_helper' + +class TestDefer < Test::Unit::TestCase + + def test_defers + n = 0 + n_times = 20 + EM.run { + n_times.times { + work_proc = proc { n += 1 } + callback = proc { EM.stop if n == n_times } + EM.defer work_proc, callback + } + } + assert_equal( n, n_times ) + end + + def test_errbacks + iterations = 20 + callback_parameter = rand(100) + callback_parameters = [] + callback_op = proc { callback_parameter } + callback = proc { |result| callback_parameters << result } + errback_parameter = Exception.new + errback_parameters = [] + errback_op = proc { raise errback_parameter } + errback = proc { |error| errback_parameters << error } + EventMachine.run do + (1..iterations).each { |index| EventMachine.defer(index.even? ? callback_op : errback_op, callback, errback) } + EventMachine.add_periodic_timer(0.1) { EventMachine.stop if EventMachine.defers_finished? } + end + assert_equal(callback_parameters.select { |parameter| parameter == callback_parameter }.length, iterations * 0.5) + assert_equal(errback_parameters.select{ |parameter| parameter == errback_parameter }.length, iterations * 0.5) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_deferrable.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_deferrable.rb new file mode 100644 index 000000000000..5f286a77e450 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_deferrable.rb @@ -0,0 +1,35 @@ +require 'em_test_helper' + +class TestDeferrable < Test::Unit::TestCase + class Later + include EM::Deferrable + end + + def test_timeout_without_args + assert_nothing_raised do + EM.run { + df = Later.new + df.timeout(0) + df.errback { EM.stop } + EM.add_timer(0.01) { flunk "Deferrable was not timed out." } + } + end + end + + def test_timeout_with_args + args = nil + + EM.run { + df = Later.new + df.timeout(0, :timeout, :foo) + df.errback do |type, name| + args = [type, name] + EM.stop + end + + EM.add_timer(0.01) { flunk "Deferrable was not timed out." } + } + + assert_equal [:timeout, :foo], args + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_epoll.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_epoll.rb new file mode 100644 index 000000000000..36f5609ab00a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_epoll.rb @@ -0,0 +1,142 @@ +require 'em_test_helper' + + +class TestEpoll < Test::Unit::TestCase + + module TestEchoServer + def receive_data data + send_data data + close_connection_after_writing + end + end + + module TestEchoClient + def connection_completed + send_data "ABCDE" + $max += 1 + end + def receive_data data + raise "bad response" unless data == "ABCDE" + end + def unbind + $n -= 1 + EM.stop if $n == 0 + end + end + + + # We can set the rlimit/nofile of a process but we can only set it + # higher if we're running as root. + # On most systems, the default value is 1024. + def test_rlimit + omit_if(windows? || jruby?) + unless EM.set_descriptor_table_size >= 1024 + a = EM.set_descriptor_table_size + assert( a <= 1024 ) + a = EM.set_descriptor_table_size( 1024 ) + assert( a == 1024 ) + end + end + + # Run a high-volume version of this test by kicking the number of connections + # up past 512. (Each connection uses two sockets, a client and a server.) + # (Will require running the test as root) + # This test exercises TCP clients and servers. + # + # XXX this test causes all sort of weird issues on OSX (when run as part of the suite) + def _test_descriptors + EM.epoll + EM.set_descriptor_table_size 60000 + EM.run { + EM.start_server "127.0.0.1", 9800, TestEchoServer + $n = 0 + $max = 0 + 100.times { + EM.connect("127.0.0.1", 9800, TestEchoClient) {$n += 1} + } + } + assert_equal(0, $n) + assert_equal(100, $max) + end + + def setup + @port = next_port + end + + module TestDatagramServer + def receive_data dgm + $in = dgm + send_data "abcdefghij" + end + end + module TestDatagramClient + def initialize port + @port = port + end + + def post_init + send_datagram "1234567890", "127.0.0.1", @port + end + + def receive_data dgm + $out = dgm + EM.stop + end + end + + def test_datagrams + $in = $out = "" + EM.run { + EM.open_datagram_socket "127.0.0.1", @port, TestDatagramServer + EM.open_datagram_socket "127.0.0.1", 0, TestDatagramClient, @port + } + assert_equal( "1234567890", $in ) + assert_equal( "abcdefghij", $out ) + end + + # XXX this test fails randomly... + def _test_unix_domain + fn = "/tmp/xxx.chain" + EM.epoll + EM.set_descriptor_table_size 60000 + EM.run { + # The pure-Ruby version won't let us open the socket if the node already exists. + # Not sure, that actually may be correct and the compiled version is wrong. + # Pure Ruby also oddly won't let us make that many connections. This test used + # to run 100 times. Not sure where that lower connection-limit is coming from in + # pure Ruby. + # Let's not sweat the Unix-ness of the filename, since this test can't possibly + # work on Windows anyway. + # + File.unlink(fn) if File.exist?(fn) + EM.start_unix_domain_server fn, TestEchoServer + $n = 0 + $max = 0 + 50.times { + EM.connect_unix_domain(fn, TestEchoClient) {$n += 1} + } + EM::add_timer(1) { $stderr.puts("test_unix_domain timed out!"); EM::stop } + } + assert_equal(0, $n) + assert_equal(50, $max) + ensure + File.unlink(fn) if File.exist?(fn) + end + + def test_attach_detach + EM.epoll + EM.run { + EM.add_timer(0.01) { EM.stop } + + r, _ = IO.pipe + + # This tests a regression where detach in the same tick as attach crashes EM + EM.watch(r) do |connection| + connection.detach + end + } + + assert true + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_error_handler.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_error_handler.rb new file mode 100644 index 000000000000..23c23f74bbe8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_error_handler.rb @@ -0,0 +1,38 @@ +require 'em_test_helper' + +class TestErrorHandler < Test::Unit::TestCase + def setup + @exception = Class.new(StandardError) + end + + def test_error_handler + error = nil + + EM.error_handler{ |e| + error = e + EM.error_handler(nil) + EM.stop + } + + assert_nothing_raised do + EM.run{ + EM.add_timer(0){ + raise @exception, 'test' + } + } + end + + assert_equal error.class, @exception + assert_equal error.message, 'test' + end + + def test_without_error_handler + assert_raise @exception do + EM.run{ + EM.add_timer(0){ + raise @exception, 'test' + } + } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_exc.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_exc.rb new file mode 100644 index 000000000000..d9c860aed8ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_exc.rb @@ -0,0 +1,43 @@ +require 'em_test_helper' + +class TestSomeExceptions < Test::Unit::TestCase + class DoomedConnectionError < StandardError + end + class DoomedConnection < EventMachine::Connection + def unbind + raise DoomedConnectionError + end + end + + # Read the commentary in EM#run. + # This test exercises the ensure block in #run that makes sure + # EM#release_machine gets called even if an exception is + # thrown within the user code. Without the ensured call to release_machine, + # the second call to EM#run will fail with a C++ exception + # because the machine wasn't cleaned up properly. + + def test_a + assert_raises(RuntimeError) { + EM.run { + raise "some exception" + } + } + end + + def test_b + assert_raises(RuntimeError) { + EM.run { + raise "some exception" + } + } + end + + def test_exception_on_unbind + assert_raises(DoomedConnectionError) { + EM.run { + EM.connect("localhost", 8888, DoomedConnection) + } + } + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_file_watch.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_file_watch.rb new file mode 100644 index 000000000000..560207174f3d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_file_watch.rb @@ -0,0 +1,85 @@ +require 'em_test_helper' +require 'tempfile' + +class TestFileWatch < Test::Unit::TestCase + if windows? + def test_watch_file_raises_unsupported_error + assert_raises(EM::Unsupported) do + EM.run do + file = Tempfile.new("fake_file") + EM.watch_file(file.path) + end + end + end + elsif EM.respond_to? :watch_filename + module FileWatcher + def file_modified + $modified = true + end + def file_deleted + $deleted = true + end + def unbind + $unbind = true + EM.stop + end + end + + def setup + EM.kqueue = true if EM.kqueue? + end + + def teardown + EM.kqueue = false if EM.kqueue? + end + + def test_events + omit_if(solaris?) + EM.run{ + file = Tempfile.new('em-watch') + $tmp_path = file.path + + # watch it + watch = EM.watch_file(file.path, FileWatcher) + $path = watch.path + + # modify it + File.open(file.path, 'w'){ |f| f.puts 'hi' } + + # delete it + EM.add_timer(0.01){ file.close; file.delete } + } + + assert_equal($path, $tmp_path) + assert($modified) + assert($deleted) + assert($unbind) + end + + # Refer: https://github.com/eventmachine/eventmachine/issues/512 + def test_invalid_signature + # This works fine with kqueue, only fails with linux inotify. + omit_if(EM.kqueue?) + + EM.run { + file = Tempfile.new('foo') + + w1 = EventMachine.watch_file(file.path) + w2 = EventMachine.watch_file(file.path) + + assert_raise EventMachine::InvalidSignature do + w2.stop_watching + end + + EM.stop + } + end + else + warn "EM.watch_file not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_watch_file_unsupported + assert true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_fork.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_fork.rb new file mode 100644 index 000000000000..8b15bb5861ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_fork.rb @@ -0,0 +1,75 @@ +require 'em_test_helper' + +class TestFork < Test::Unit::TestCase + + def test_fork_safe + omit_if(jruby?) + omit_if(windows?) + + fork_pid = nil + read, write = IO.pipe + EM.run do + fork_pid = fork do + write.puts "forked" + EM.run do + EM.next_tick do + write.puts "EM ran" + EM.stop + end + end + end + EM.stop + end + + sleep 0.1 + begin + Timeout::timeout 1 do + assert_equal "forked\n", read.readline + assert_equal "EM ran\n", read.readline + end + rescue Timeout::Error + Process.kill 'TERM', fork_pid + flunk "Timeout waiting for next_tick in new fork reactor" + end + ensure + read.close rescue nil + write.close rescue nil + end + + def test_fork_reactor + omit_if(jruby?) + omit_if(windows?) + + fork_pid = nil + read, write = IO.pipe + EM.run do + EM.defer do + write.puts Process.pid + EM.defer do + EM.stop + end + end + fork_pid = EM.fork_reactor do + EM.defer do + write.puts Process.pid + EM.stop + end + end + end + + sleep 0.1 + begin + Timeout::timeout 1 do + assert_equal Process.pid.to_s, read.readline.chomp + assert_equal fork_pid.to_s, read.readline.chomp + end + rescue Timeout::Error + Process.kill 'TERM', fork_pid + flunk "Timeout waiting for deferred block in fork_reactor" + end + ensure + read.close rescue nil + write.close rescue nil + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_futures.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_futures.rb new file mode 100644 index 000000000000..b4948567dccb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_futures.rb @@ -0,0 +1,170 @@ +require 'em_test_helper' + +class TestFutures < Test::Unit::TestCase + + def setup + end + + def teardown + end + + def test_future + assert_equal(100, EM::Deferrable.future(100) ) + + p1 = proc { 100 + 1 } + assert_equal(101, EM::Deferrable.future(p1) ) + end + + class MyFuture + include EM::Deferrable + def initialize *args + super + set_deferred_status :succeeded, 40 + end + end + + class MyErrorFuture + include EM::Deferrable + def initialize *args + super + set_deferred_status :failed, 41 + end + end + + + def test_future_1 + # Call future with one additional argument and it will be treated as a callback. + def my_future + MyFuture.new + end + + value = nil + EM::Deferrable.future my_future, proc {|v| value=v} + assert_equal( 40, value ) + end + + + def test_future_2 + # Call future with two additional arguments and they will be treated as a callback + # and an errback. + value = nil + EM::Deferrable.future MyErrorFuture.new, nil, proc {|v| value=v} + assert_equal( 41, value ) + end + + + def test_future_3 + # Call future with no additional arguments but with a block, and the block will be + # treated as a callback. + value = nil + EM::Deferrable.future MyFuture.new do |v| + value=v + end + assert_equal( 40, value ) + end + + + class RecursiveCallback + include EM::Deferrable + end + + # A Deferrable callback can call #set_deferred_status to change the values + # passed to subsequent callbacks. + # + def test_recursive_callbacks + n = 0 # counter assures that all the tests actually run. + rc = RecursiveCallback.new + rc.callback {|a| + assert_equal(100, a) + n += 1 + rc.set_deferred_status :succeeded, 101, 101 + } + rc.callback {|a,b| + assert_equal(101, a) + assert_equal(101, b) + n += 1 + rc.set_deferred_status :succeeded, 102, 102, 102 + } + rc.callback {|a,b,c| + assert_equal(102, a) + assert_equal(102, b) + assert_equal(102, c) + n += 1 + } + rc.set_deferred_status :succeeded, 100 + assert_equal(3, n) + end + + def test_syntactic_sugar + rc = RecursiveCallback.new + rc.set_deferred_success 100 + rc.set_deferred_failure 200 + end + + # It doesn't raise an error to set deferred status more than once. + # In fact, this is a desired and useful idiom when it happens INSIDE + # a callback or errback. + # However, it's less useful otherwise, and in fact would generally be + # indicative of a programming error. However, we would like to be resistant + # to such errors. So whenever we set deferred status, we also clear BOTH + # stacks of handlers. + # + def test_double_calls + s = 0 + e = 0 + + d = EM::DefaultDeferrable.new + d.callback {s += 1} + d.errback {e += 1} + + d.succeed # We expect the callback to be called, and the errback to be DISCARDED. + d.fail # Presumably an error. We expect the errback NOT to be called. + d.succeed # We expect the callback to have been discarded and NOT to be called again. + + assert_equal(1, s) + assert_equal(0, e) + end + + # Adding a callback to a Deferrable that is already in a success state executes the callback + # immediately. The same applies to a an errback added to an already-failed Deferrable. + # HOWEVER, we expect NOT to be able to add errbacks to succeeded Deferrables, or callbacks + # to failed ones. + # + # We illustrate this with a rather contrived test. The test calls #fail after #succeed, + # which ordinarily would not happen in a real program. + # + # What we're NOT attempting to specify is what happens if a Deferrable is succeeded and then + # failed (or vice-versa). Should we then be able to add callbacks/errbacks of the appropriate + # type for immediate execution? For now at least, the official answer is "don't do that." + # + def test_delayed_callbacks + s1 = 0 + s2 = 0 + e = 0 + + d = EM::DefaultDeferrable.new + d.callback {s1 += 1} + + d.succeed # Triggers and discards the callback. + + d.callback {s2 += 1} # This callback is executed immediately and discarded. + + d.errback {e += 1} # This errback should be DISCARDED and never execute. + d.fail # To prove it, fail and assert e is 0 + + assert_equal( [1,1], [s1,s2] ) + assert_equal( 0, e ) + end + + def test_timeout + n = 0 + EM.run { + d = EM::DefaultDeferrable.new + d.callback {n = 1; EM.stop} + d.errback {n = 2; EM.stop} + d.timeout(0.01) + } + assert_equal( 2, n ) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_handler_check.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_handler_check.rb new file mode 100644 index 000000000000..c4176941bbfd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_handler_check.rb @@ -0,0 +1,35 @@ +require 'em_test_helper' + +class TestHandlerCheck < Test::Unit::TestCase + + class Foo < EM::Connection; end; + module TestModule; end; + + def test_with_correct_class + assert_nothing_raised do + EM.run { + EM.connect("127.0.0.1", 80, Foo) + EM.stop_event_loop + } + end + end + + def test_with_incorrect_class + assert_raise(ArgumentError) do + EM.run { + EM.connect("127.0.0.1", 80, String) + EM.stop_event_loop + } + end + end + + def test_with_module + assert_nothing_raised do + EM.run { + EM.connect("127.0.0.1", 80, TestModule) + EM.stop_event_loop + } + end + end + +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_hc.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_hc.rb new file mode 100644 index 000000000000..28e32c9ced8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_hc.rb @@ -0,0 +1,155 @@ +require 'em_test_helper' + +class TestHeaderAndContentProtocol < Test::Unit::TestCase + + class SimpleTest < EM::P::HeaderAndContentProtocol + attr_reader :first_header, :my_headers, :request + + def receive_first_header_line hdr + @first_header ||= [] + @first_header << hdr + end + def receive_headers hdrs + @my_headers ||= [] + @my_headers << hdrs + end + def receive_request hdrs, content + @request ||= [] + @request << [hdrs, content] + end + end + + class StopOnUnbind < EM::Connection + def unbind + EM.add_timer(0.01) { EM.stop } + end + end + + def setup + @port = next_port + end + + def test_no_content + the_connection = nil + EM.run { + EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + the_connection = conn + end + setup_timeout + + EM.connect "127.0.0.1", @port, StopOnUnbind do |c| + c.send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join + c.close_connection_after_writing + end + } + assert_equal( ["aaa"], the_connection.first_header ) + assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers ) + assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request ) + end + + def test_content + the_connection = nil + content = "A" * 50 + headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"] + EM.run { + EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + the_connection = conn + end + setup_timeout + + EM.connect "127.0.0.1", @port, StopOnUnbind do |c| + headers.each { |h| c.send_data "#{h}\r\n" } + c.send_data "\n" + c.send_data content + c.close_connection_after_writing + end + } + assert_equal( ["aaa"], the_connection.first_header ) + assert_equal( [headers], the_connection.my_headers ) + assert_equal( [[headers, content]], the_connection.request ) + end + + def test_several_requests + the_connection = nil + content = "A" * 50 + headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"] + EM.run { + EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + the_connection = conn + end + setup_timeout + + EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c| + 5.times do + headers.each { |h| c.send_data "#{h}\r\n" } + c.send_data "\n" + c.send_data content + end + c.close_connection_after_writing + end + } + assert_equal( ["aaa"] * 5, the_connection.first_header ) + assert_equal( [headers] * 5, the_connection.my_headers ) + assert_equal( [[headers, content]] * 5, the_connection.request ) + end + + + # def x_test_multiple_content_length_headers + # # This is supposed to throw a RuntimeError but it throws a C++ exception instead. + # the_connection = nil + # content = "A" * 50 + # headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten + # EM.run { + # EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + # the_connection = conn + # end + # EM.add_timer(4) {raise "test timed out"} + # test_proc = proc { + # t = TCPSocket.new "127.0.0.1", @port + # headers.each {|h| t.write "#{h}\r\n" } + # t.write "\n" + # t.write content + # t.close + # } + # EM.defer test_proc, proc { + # EM.stop + # } + # } + # end + + def test_interpret_headers + the_connection = nil + content = "A" * 50 + headers = [ + "GET / HTTP/1.0", + "Accept: aaa", + "User-Agent: bbb", + "Host: ccc", + "x-tempest-header:ddd" + ] + + EM.run { + EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| + the_connection = conn + end + setup_timeout + + EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c| + headers.each { |h| c.send_data "#{h}\r\n" } + c.send_data "\n" + c.send_data content + c.close_connection_after_writing + end + } + + hsh = the_connection.headers_2_hash( the_connection.my_headers.shift ) + expect = { + :accept => "aaa", + :user_agent => "bbb", + :host => "ccc", + :x_tempest_header => "ddd" + } + assert_equal(expect, hsh) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_httpclient.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_httpclient.rb new file mode 100644 index 000000000000..572a8022b661 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_httpclient.rb @@ -0,0 +1,238 @@ +require 'em_test_helper' + +class TestHttpClient < Test::Unit::TestCase + + def setup + @port = next_port + end + + #------------------------------------- + + def test_http_client + ok = false + EM.run { + c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 } + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} # necessary, otherwise a failure blocks the test suite forever. + } + assert ok + end + + #------------------------------------- + + def test_http_client_1 + ok = false + EM.run { + c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 } + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} + } + assert ok + end + + #------------------------------------- + + def test_http_client_2 + ok = false + EM.run { + c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 } + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} + } + assert ok + end + + + #----------------------------------------- + + # Test a server that returns a page with a zero content-length. + # This caused an early version of the HTTP client not to generate a response, + # causing this test to hang. Observe, there was no problem with responses + # lacking a content-length, just when the content-length was zero. + # + class EmptyContent < EM::Connection + def initialize *args + super + end + def receive_data data + send_data "HTTP/1.0 404 ...\r\nContent-length: 0\r\n\r\n" + close_connection_after_writing + end + end + + def test_http_empty_content + ok = false + EM.run { + EM.start_server "127.0.0.1", @port, EmptyContent + c = silent { EM::P::HttpClient.send :request, :host => "127.0.0.1", :port => @port } + c.callback { + ok = true + c.close_connection + EM.stop + } + } + assert ok + end + + + #--------------------------------------- + + class PostContent < EM::P::LineAndTextProtocol + def initialize *args + super + @lines = [] + end + def receive_line line + if line.length > 0 + @lines << line + else + process_headers + end + end + def receive_binary_data data + @post_content = data + send_response + end + def process_headers + if @lines.first =~ /\APOST ([^\s]+) HTTP\/1.1\Z/ + @uri = $1.dup + else + raise "bad request" + end + + @lines.each {|line| + if line =~ /\AContent-length:\s*(\d+)\Z/i + @content_length = $1.dup.to_i + elsif line =~ /\AContent-type:\s*(\d+)\Z/i + @content_type = $1.dup + end + } + + raise "invalid content length" unless @content_length + set_binary_mode @content_length + end + def send_response + send_data "HTTP/1.1 200 ...\r\nConnection: close\r\nContent-length: 10\r\nContent-type: text/html\r\n\r\n0123456789" + close_connection_after_writing + end + end + + # TODO, this is WRONG. The handler is asserting an HTTP 1.1 request, but the client + # is sending a 1.0 request. Gotta fix the client + def test_post + response = nil + EM.run { + EM.start_server '127.0.0.1', @port, PostContent + setup_timeout(2) + c = silent { EM::P::HttpClient.request( + :host => '127.0.0.1', + :port => @port, + :method => :post, + :request => "/aaa", + :content => "XYZ", + :content_type => "text/plain" + )} + c.callback {|r| + response = r + EM.stop + } + } + + assert_equal( 200, response[:status] ) + assert_equal( "0123456789", response[:content] ) + end + + + # TODO, need a more intelligent cookie tester. + # In fact, this whole test-harness needs a beefier server implementation. + def test_cookie + ok = false + EM.run { + c = silent { EM::Protocols::HttpClient.send :request, :host => "www.google.com", :port => 80, :cookie=>"aaa=bbb" } + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} + } + assert ok + end + + # We can tell the client to send an HTTP/1.0 request (default is 1.1). + # This is useful for suppressing chunked responses until those are working. + def test_version_1_0 + ok = false + EM.run { + c = silent { EM::P::HttpClient.request( + :host => "www.google.com", + :port => 80, + :version => "1.0" + )} + c.callback { + ok = true + c.close_connection + EM.stop + } + c.errback {EM.stop} + } + assert ok + end + + #----------------------------------------- + + # Test a server that returns chunked encoding + # + class ChunkedEncodingContent < EventMachine::Connection + def initialize *args + super + end + def receive_data data + send_data ["HTTP/1.1 200 OK", + "Server: nginx/0.7.67", + "Date: Sat, 23 Oct 2010 16:41:32 GMT", + "Content-Type: application/json", + "Transfer-Encoding: chunked", + "Connection: keep-alive", + "", + "1800", + "chunk1" * 1024, + "5a", + "chunk2" * 15, + "0", + ""].join("\r\n") + close_connection_after_writing + end + end + + def test_http_chunked_encoding_content + ok = false + EM.run { + EM.start_server "127.0.0.1", @port, ChunkedEncodingContent + c = silent { EM::P::HttpClient.send :request, :host => "127.0.0.1", :port => @port } + c.callback { |result| + if result[:content] == "chunk1" * 1024 + "chunk2" * 15 + ok = true + end + c.close_connection + EM.stop + } + } + assert ok + end + +end + + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_httpclient2.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_httpclient2.rb new file mode 100644 index 000000000000..a00fcbcb4a14 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_httpclient2.rb @@ -0,0 +1,128 @@ +require 'em_test_helper' + +class TestHttpClient2 < Test::Unit::TestCase + class TestServer < EM::Connection + end + + def setup + @port = next_port + end + + # #connect returns an object which has made a connection to an HTTP server + # and exposes methods for making HTTP requests on that connection. + # #connect can take either a pair of parameters (a host and a port), + # or a single parameter which is a Hash. + # + def test_connect + EM.run { + setup_timeout(1) + EM.start_server '127.0.0.1', @port, TestServer + silent do + EM::P::HttpClient2.connect '127.0.0.1', @port + EM::P::HttpClient2.connect( :host=>'127.0.0.1', :port=>@port ) + end + EM.stop + } + end + + def test_bad_port + EM.run { + setup_timeout(1) + EM.start_server '127.0.0.1', @port, TestServer + assert_raises( ArgumentError ) { + silent { EM::P::HttpClient2.connect '127.0.0.1', "xxx" } + } + EM.stop + } + end + + def test_bad_server + err = nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect '127.0.0.1', 9999 } + d = http.get "/" + d.errback { err = true; d.internal_error; EM.stop } + } + assert(err) + end + + def test_get + content = nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect :host => "google.com", :port => 80, :version => '1.0' } + d = http.get "/" + d.callback { + content = d.content + EM.stop + } + } + assert(content) + end + + # Not a pipelined request because we wait for one response before we request the next. + # XXX this test is broken because it sends the second request to the first connection + # XXX right before the connection closes + def _test_get_multiple + content = nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect "google.com", :version => '1.0' } + d = http.get "/" + d.callback { + e = http.get "/" + e.callback { + content = e.content + EM.stop + } + } + } + assert(content) + end + + def test_get_pipeline + headers, headers2 = nil, nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect "google.com", 80 } + d = http.get("/") + d.callback { + headers = d.headers + } + e = http.get("/") + e.callback { + headers2 = e.headers + } + EM.tick_loop { EM.stop if headers && headers2 } + EM.add_timer(1) { EM.stop } + } + assert(headers) + assert(headers2) + end + + def test_authheader + EM.run { + setup_timeout(1) + EM.start_server '127.0.0.1', @port, TestServer + http = silent { EM::P::HttpClient2.connect '127.0.0.1', 18842 } + d = http.get :url=>"/", :authorization=>"Basic xxx" + d.callback {EM.stop} + d.errback {EM.stop} + } + end + + def test_https_get + omit_unless(EM.ssl?) + d = nil + EM.run { + setup_timeout(1) + http = silent { EM::P::HttpClient2.connect :host => 'www.google.com', :port => 443, :ssl => true, :version => '1.0' } + d = http.get "/" + d.callback {EM.stop} + d.errback {EM.stop} + } + assert_equal(200, d.status) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_idle_connection.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_idle_connection.rb new file mode 100644 index 000000000000..bfc57cd99fb1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_idle_connection.rb @@ -0,0 +1,31 @@ +require 'em_test_helper' + +class TestIdleConnection < Test::Unit::TestCase + def setup + @port = next_port + end + + def test_idle_time + omit_if(!EM.respond_to?(:get_idle_time)) + + a, b = nil, nil + EM.run do + EM.start_server '127.0.0.1', @port, Module.new + conn = EM.connect '127.0.0.1', @port + EM.add_timer(0.3) do + a = conn.get_idle_time + conn.send_data 'a' + EM.next_tick do + EM.next_tick do + b = conn.get_idle_time + conn.close_connection + EM.stop + end + end + end + end + + assert_in_delta 0.3, a, 0.1 + assert_in_delta 0, b, 0.1 + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_inactivity_timeout.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_inactivity_timeout.rb new file mode 100644 index 000000000000..15e39a2f734c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_inactivity_timeout.rb @@ -0,0 +1,54 @@ +require 'em_test_helper' + +class TestInactivityTimeout < Test::Unit::TestCase + + if EM.respond_to? :get_comm_inactivity_timeout + def test_default + EM.run { + c = EM.connect("127.0.0.1", 54321) + assert_equal 0.0, c.comm_inactivity_timeout + EM.stop + } + end + + def test_set_and_get + EM.run { + c = EM.connect("127.0.0.1", 54321) + c.comm_inactivity_timeout = 2.5 + assert_equal 2.5, c.comm_inactivity_timeout + EM.stop + } + end + + def test_for_real + start, finish = nil + + timeout_handler = Module.new do + define_method :unbind do + finish = Time.now + EM.stop + end + end + + EM.run { + setup_timeout + EM.heartbeat_interval = 0.01 + EM.start_server("127.0.0.1", 12345) + EM.add_timer(0.01) { + start = Time.now + c = EM.connect("127.0.0.1", 12345, timeout_handler) + c.comm_inactivity_timeout = 0.02 + } + } + + assert_in_delta(0.02, (finish - start), 0.02) + end + else + warn "EM.comm_inactivity_timeout not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_comm_inactivity_timeout_not_implemented + assert true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ipv4.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ipv4.rb new file mode 100644 index 000000000000..bd11bbfe3911 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ipv4.rb @@ -0,0 +1,95 @@ +require 'em_test_helper' + +class TestIPv4 < Test::Unit::TestCase + # Runs a TCP server in the local IPv4 address, connects to it and sends a specific data. + # Timeout in 2 seconds. + def test_ipv4_tcp_local_server + omit_if(!Test::Unit::TestCase.public_ipv4?) + + @@received_data = nil + @local_port = next_port + setup_timeout(2) + + EM.run do + EM::start_server(@@public_ipv4, @local_port) do |s| + def s.receive_data data + @@received_data = data + EM.stop + end + end + + EM::connect(@@public_ipv4, @local_port) do |c| + c.send_data "ipv4/tcp" + end + end + + assert_equal "ipv4/tcp", @@received_data + end + + # Runs a UDP server in the local IPv4 address, connects to it and sends a specific data. + # Timeout in 2 seconds. + def test_ipv4_udp_local_server + omit_if(!Test::Unit::TestCase.public_ipv4?) + + @@received_data = nil + @local_port = next_port + setup_timeout(2) + + EM.run do + EM::open_datagram_socket(@@public_ipv4, @local_port) do |s| + def s.receive_data data + @@received_data = data + EM.stop + end + end + + EM::open_datagram_socket(@@public_ipv4, next_port) do |c| + c.send_datagram "ipv4/udp", @@public_ipv4, @local_port + end + end + + assert_equal "ipv4/udp", @@received_data + end + + # Try to connect via TCP to an invalid IPv4. EM.connect should raise + # EM::ConnectionError. + def test_tcp_connect_to_invalid_ipv4 + omit_if(!Test::Unit::TestCase.public_ipv4?) + + invalid_ipv4 = "9.9:9" + + EM.run do + begin + error = nil + EM.connect(invalid_ipv4, 1234) + rescue => e + error = e + ensure + EM.stop + assert_equal EM::ConnectionError, (error && error.class) + end + end + end + + # Try to send a UDP datagram to an invalid IPv4. EM.send_datagram should raise + # EM::ConnectionError. + def test_udp_send_datagram_to_invalid_ipv4 + omit_if(!Test::Unit::TestCase.public_ipv4?) + + invalid_ipv4 = "9.9:9" + + EM.run do + begin + error = nil + EM.open_datagram_socket(@@public_ipv4, next_port) do |c| + c.send_datagram "hello", invalid_ipv4, 1234 + end + rescue => e + error = e + ensure + EM.stop + assert_equal EM::ConnectionError, (error && error.class) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ipv6.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ipv6.rb new file mode 100644 index 000000000000..b52fef1f87e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ipv6.rb @@ -0,0 +1,107 @@ +require 'em_test_helper' + +class TestIPv6 < Test::Unit::TestCase + + if Test::Unit::TestCase.public_ipv6? + + # Runs a TCP server in the local IPv6 address, connects to it and sends a specific data. + # Timeout in 2 seconds. + def test_ipv6_tcp_local_server + @@received_data = nil + @local_port = next_port + setup_timeout(2) + + EM.run do + EM.start_server(@@public_ipv6, @local_port) do |s| + def s.receive_data data + @@received_data = data + EM.stop + end + end + + EM::connect(@@public_ipv6, @local_port) do |c| + def c.unbind(reason) + warn "unbind: #{reason.inspect}" if reason # XXX at least find out why it failed + end + c.send_data "ipv6/tcp" + end + end + + assert_equal "ipv6/tcp", @@received_data + end + + # Runs a UDP server in the local IPv6 address, connects to it and sends a specific data. + # Timeout in 2 seconds. + def test_ipv6_udp_local_server + @@received_data = nil + @local_port = next_port + @@remote_ip = nil + setup_timeout(2) + + EM.run do + EM.open_datagram_socket(@@public_ipv6, @local_port) do |s| + def s.receive_data data + _port, @@remote_ip = Socket.unpack_sockaddr_in(get_peername) + @@received_data = data + EM.stop + end + end + + EM.open_datagram_socket(@@public_ipv6, next_port) do |c| + c.send_datagram "ipv6/udp", @@public_ipv6, @local_port + end + end + assert_equal @@remote_ip, @@public_ipv6 + assert_equal "ipv6/udp", @@received_data + end + + # Try to connect via TCP to an invalid IPv6. EM.connect should raise + # EM::ConnectionError. + def test_tcp_connect_to_invalid_ipv6 + invalid_ipv6 = "1:A" + + EM.run do + begin + error = nil + EM.connect(invalid_ipv6, 1234) + rescue => e + error = e + ensure + EM.stop + assert_equal EM::ConnectionError, (error && error.class) + end + end + end + + # Try to send a UDP datagram to an invalid IPv6. EM.send_datagram should raise + # EM::ConnectionError. + def test_udp_send_datagram_to_invalid_ipv6 + invalid_ipv6 = "1:A" + + EM.run do + begin + error = nil + EM.open_datagram_socket(@@public_ipv6, next_port) do |c| + c.send_datagram "hello", invalid_ipv6, 1234 + end + rescue => e + error = e + ensure + EM.stop + assert_equal EM::ConnectionError, (error && error.class) + end + end + end + + + else + warn "no IPv6 in this host, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests. + def test_ipv6_unavailable + assert true + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_iterator.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_iterator.rb new file mode 100644 index 000000000000..6ec4e4642e19 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_iterator.rb @@ -0,0 +1,118 @@ +require 'em_test_helper' + +class TestIterator < Test::Unit::TestCase + + # By default, format the time with tenths-of-seconds. + # Some tests should ask for extra decimal places to ensure + # that delays between iterations will receive a changed time. + def get_time(n=1) + time = EM.current_time + time.strftime('%H:%M:%S.') + time.tv_usec.to_s[0, n] + end + + def test_default_concurrency + items = {} + list = 1..10 + EM.run { + EM::Iterator.new(list).each( proc {|num,iter| + time = get_time(3) + items[time] ||= [] + items[time] << num + EM::Timer.new(0.02) {iter.next} + }, proc {EM.stop}) + } + assert_equal(10, items.keys.size) + assert_equal(list.to_a.sort, items.values.flatten.sort) + end + + def test_default_concurrency_with_a_proc + items = {} + list = (1..10).to_a + original_list = list.dup + EM.run { + EM::Iterator.new(proc{list.pop || EM::Iterator::Stop}).each( proc {|num,iter| + time = get_time(3) + items[time] ||= [] + items[time] << num + EM::Timer.new(0.02) {iter.next} + }, proc {EM.stop}) + } + assert_equal(10, items.keys.size) + assert_equal(original_list.to_a.sort, items.values.flatten.sort) + end + + def test_concurrency_bigger_than_list_size + items = {} + list = [1,2,3] + EM.run { + EM::Iterator.new(list,10).each(proc {|num,iter| + time = get_time + items[time] ||= [] + items[time] << num + EM::Timer.new(1) {iter.next} + }, proc {EM.stop}) + } + assert_equal(1, items.keys.size) + assert_equal(list.to_a.sort, items.values.flatten.sort) + end + + def test_changing_concurrency_affects_active_iteration + items = {} + list = 1..25 + seen = 0 + EM.run { + i = EM::Iterator.new(list,1) + i.each(proc {|num,iter| + time = get_time + items[time] ||= [] + items[time] << num + if (seen += 1) == 5 + # The first 5 items will be distinct times + # The next 20 items will happen in 2 bursts + i.concurrency = 10 + end + EM::Timer.new(0.2) {iter.next} + }, proc {EM.stop}) + } + assert_in_delta(7, items.keys.size, 1) + assert_equal(list.to_a.sort, items.values.flatten.sort) + end + + def test_map + list = 100..150 + EM.run { + EM::Iterator.new(list).map(proc{ |num,iter| + EM.add_timer(0.01){ iter.return(num) } + }, proc{ |results| + assert_equal(list.to_a.size, results.size) + EM.stop + }) + } + end + + def test_inject + omit_if(windows?) + + list = %w[ pwd uptime uname date ] + EM.run { + EM::Iterator.new(list, 2).inject({}, proc{ |hash,cmd,iter| + EM.system(cmd){ |output,status| + hash[cmd] = status.exitstatus == 0 ? output.strip : nil + iter.return(hash) + } + }, proc{ |results| + assert_equal(results.keys.sort, list.sort) + EM.stop + }) + } + end + + def test_concurrency_is_0 + EM.run { + assert_raise ArgumentError do + EM::Iterator.new(1..5,0) + end + EM.stop + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_kb.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_kb.rb new file mode 100644 index 000000000000..9c31f5fbcc10 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_kb.rb @@ -0,0 +1,28 @@ +require 'em_test_helper' + +class TestKeyboardEvents < Test::Unit::TestCase + + module KbHandler + include EM::Protocols::LineText2 + def receive_line d + EM::stop if d == "STOP" + end + end + + # This test doesn't actually do anything useful but is here to + # illustrate the usage. If you removed the timer and ran this test + # by itself on a console, and then typed into the console, it would + # work. + # I don't know how to get the test harness to simulate actual keystrokes. + # When someone figures that out, then we can make this a real test. + # + def test_kb + omit_if(jruby?) + omit_if(!$stdout.tty?) # don't run the test unless it stands a chance of validity. + EM.run do + EM.open_keyboard KbHandler + EM::Timer.new(1) { EM.stop } + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_line_protocol.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_line_protocol.rb new file mode 100644 index 000000000000..2067a72e6ab4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_line_protocol.rb @@ -0,0 +1,33 @@ +require 'em_test_helper' + +class TestLineProtocol < Test::Unit::TestCase + class LineProtocolTestClass + include EM::Protocols::LineProtocol + + def lines + @lines ||= [] + end + + def receive_line(line) + lines << line + end + end + + def setup + @proto = LineProtocolTestClass.new + end + + def test_simple_split_line + @proto.receive_data("this is") + assert_equal([], @proto.lines) + + @proto.receive_data(" a test\n") + assert_equal(["this is a test"], @proto.lines) + end + + def test_simple_lines + @proto.receive_data("aaa\nbbb\r\nccc\nddd") + assert_equal(%w(aaa bbb ccc), @proto.lines) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ltp.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ltp.rb new file mode 100644 index 000000000000..06c268514520 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ltp.rb @@ -0,0 +1,155 @@ +require 'em_test_helper' + +class TestLineAndTextProtocol < Test::Unit::TestCase + + class TLP_LineBuffer < EM::P::LineAndTextProtocol + attr_reader :line_buffer + + def initialize + super + @line_buffer = [] + end + + def receive_line line + @line_buffer << line + end + end + + module StopClient + def set_receive_data(&blk) + @rdb = blk + end + + def receive_data data + @rdb.call(data) if @rdb + end + + def unbind + EM.add_timer(0.1) { EM.stop } + end + end + + def setup + @port = next_port + end + + def test_simple_lines + conn = nil + EM.run { + EM.start_server( "127.0.0.1", @port, TLP_LineBuffer ) do |c| + conn = c + end + setup_timeout + + EM.connect "127.0.0.1", @port, StopClient do |c| + c.send_data "aaa\nbbb\r\nccc\n" + c.close_connection_after_writing + end + } + assert_equal( %w(aaa bbb ccc), conn.line_buffer) + end + + #-------------------------------------------------------------------- + + class TLP_ErrorMessage < EM::P::LineAndTextProtocol + attr_reader :error_message + + def initialize + super + @error_message = [] + end + + def receive_line text + raise + end + + def receive_error text + @error_message << text + end + end + + def test_overlength_lines + conn = nil + EM.run { + EM.start_server( "127.0.0.1", @port, TLP_ErrorMessage ) do |c| + conn = c + end + setup_timeout + EM.connect "127.0.0.1", @port, StopClient do |c| + c.send_data "a" * (16*1024 + 1) + c.send_data "\n" + c.close_connection_after_writing + end + + } + assert_equal( ["overlength line"], conn.error_message ) + end + + + #-------------------------------------------------------------------- + + class LineAndTextTest < EM::P::LineAndTextProtocol + def receive_line line + if line =~ /content-length:\s*(\d+)/i + @content_length = $1.to_i + elsif line.length == 0 + set_binary_mode @content_length + end + end + def receive_binary_data text + send_data "received #{text.length} bytes" + close_connection_after_writing + end + end + + def test_lines_and_text + output = '' + EM.run { + EM.start_server( "127.0.0.1", @port, LineAndTextTest ) + setup_timeout + + EM.connect "127.0.0.1", @port, StopClient do |c| + c.set_receive_data { |data| output << data } + c.send_data "Content-length: 400\n" + c.send_data "\n" + c.send_data "A" * 400 + EM.add_timer(0.1) { c.close_connection_after_writing } + end + } + assert_equal( "received 400 bytes", output ) + end + + #-------------------------------------------------------------------- + + + class BinaryTextTest < EM::P::LineAndTextProtocol + def receive_line line + if line =~ /content-length:\s*(\d+)/i + set_binary_mode $1.to_i + else + raise "protocol error" + end + end + def receive_binary_data text + send_data "received #{text.length} bytes" + close_connection_after_writing + end + end + + def test_binary_text + output = '' + EM.run { + EM.start_server( "127.0.0.1", @port, BinaryTextTest ) + setup_timeout + + EM.connect "127.0.0.1", @port, StopClient do |c| + c.set_receive_data { |data| output << data } + c.send_data "Content-length: 10000\n" + c.send_data "A" * 10000 + EM.add_timer(0.1) { c.close_connection_after_writing } + end + } + assert_equal( "received 10000 bytes", output ) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ltp2.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ltp2.rb new file mode 100644 index 000000000000..220fcbe1cd7c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ltp2.rb @@ -0,0 +1,332 @@ +require 'em_test_helper' + +# TODO!!! Need tests for overlength headers and text bodies. + +class TestLineText2 < Test::Unit::TestCase + + # Run each of these tests two ways: passing in the whole test-dataset in one chunk, + # and passing it in one character at a time. + + class Basic + include EM::Protocols::LineText2 + attr_reader :lines + def receive_line line + (@lines ||= []) << line + end + end + def test_basic + testdata = "Line 1\nLine 2\r\nLine 3\n" + + a = Basic.new + a.receive_data testdata + assert_equal( ["Line 1", "Line 2", "Line 3"], a.lines ) + + a = Basic.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Line 1", "Line 2", "Line 3"], a.lines ) + end + + # The basic test above shows that extra newlines are chomped + # This test shows that newlines are preserved if the delimiter isn't \n + class PreserveNewlines + include EM::Protocols::LineText2 + attr_reader :lines + def initialize *args + super + @delim = "|" + set_delimiter @delim + end + def receive_line line + (@lines ||= []) << line + end + end + def test_preserve_newlines + a = PreserveNewlines.new + a.receive_data "aaa|bbb|ccc|\n|\r\n| \t ||" + assert_equal( ["aaa", "bbb", "ccc", "\n", "\r\n", " \t ", ""], a.lines ) + end + + class ChangeDelimiter + include EM::Protocols::LineText2 + attr_reader :lines + def initialize *args + super + @delim = "A" + set_delimiter @delim + end + def receive_line line + (@lines ||= []) << line + set_delimiter( @delim.succ! ) + end + end + + def test_change_delimiter + testdata = %Q(LineaALinebBLinecCLinedD) + + a = ChangeDelimiter.new + a.receive_data testdata + assert_equal( ["Linea", "Lineb", "Linec", "Lined"], a.lines ) + + a = ChangeDelimiter.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Linea", "Lineb", "Linec", "Lined"], a.lines ) + end + + class RegexDelimiter + include EM::Protocols::LineText2 + attr_reader :lines + def initialize *args + super + @delim = /[A-D]/ + set_delimiter @delim + end + def receive_line line + (@lines ||= []) << line + end + end + + def test_regex_delimiter + testdata = %Q(LineaALinebBLinecCLinedD) + + a = RegexDelimiter.new + a.receive_data testdata + assert_equal( ["Linea", "Lineb", "Linec", "Lined"], a.lines ) + + a = RegexDelimiter.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Linea", "Lineb", "Linec", "Lined"], a.lines ) + end + + #-- + # Test two lines followed by an empty line, ten bytes of binary data, then + # two more lines. + + class Binary + include EM::Protocols::LineText2 + attr_reader :lines, :body + def initialize *args + super + @lines = [] + @body = nil + end + def receive_line ln + if ln == "" + set_text_mode 10 + else + @lines << ln + end + end + def receive_binary_data data + @body = data + end + end + + def test_binary + testdata = %Q(Line 1 +Line 2 + +0000000000Line 3 +Line 4 +) + + a = Binary.new + a.receive_data testdata + assert_equal( ["Line 1", "Line 2", "Line 3", "Line 4"], a.lines) + assert_equal( "0000000000", a.body ) + + a = Binary.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Line 1", "Line 2", "Line 3", "Line 4"], a.lines) + assert_equal( "0000000000", a.body ) + end + + + # Test unsized binary data. The expectation is that each chunk of it + # will be passed to us as it it received. + class UnsizedBinary + include EM::Protocols::LineText2 + attr_reader :n_calls, :body + def initialize *args + super + set_text_mode + end + def receive_binary_data data + @n_calls ||= 0 + @n_calls += 1 + (@body ||= "") << data + end + end + + def test_unsized_binary + testdata = "X\0" * 1000 + + a = UnsizedBinary.new + a.receive_data testdata + assert_equal( 1, a.n_calls ) + assert_equal( testdata, a.body ) + + a = UnsizedBinary.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( 2000, a.n_calls ) + assert_equal( testdata, a.body ) + end + + + # Test binary data with a "throw back" into line-mode. + class ThrowBack + include EM::Protocols::LineText2 + attr_reader :headers + def initialize *args + super + @headers = [] + @n_bytes = 0 + set_text_mode + end + def receive_binary_data data + wanted = 25 - @n_bytes + will_take = if data.length > wanted + data.length - wanted + else + data.length + end + @n_bytes += will_take + + if @n_bytes == 25 + set_line_mode( data[will_take..-1] ) + end + end + def receive_line ln + @headers << ln + end + end + def test_throw_back + testdata = "Line\n" * 10 + + a = ThrowBack.new + a.receive_data testdata + assert_equal( ["Line"] * 5, a.headers ) + + a = ThrowBack.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( ["Line"] * 5, a.headers ) + end + + # Test multi-character line delimiters. + # Also note that the test data has a "tail" with no delimiter, that will be + # discarded, but cf. the BinaryTail test. + # TODO!!! This test doesn't work in the byte-by-byte case. + class Multichar + include EM::Protocols::LineText2 + attr_reader :lines + def initialize *args + super + @lines = [] + set_delimiter "012" + end + def receive_line ln + @lines << ln + end + end + def test_multichar + testdata = "Line012Line012Line012Line" + + a = Multichar.new + a.receive_data testdata + assert_equal( ["Line"]*3, a.lines ) + + a = Multichar.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + # DOESN'T WORK in this case. Multi-character delimiters are broken. + #assert_equal( ["Line"]*3, a.lines ) + end + + # Test a binary "tail," when a sized binary transfer doesn't complete because + # of an unbind. We get a partial result. + class BinaryTail + include EM::Protocols::LineText2 + attr_reader :data + def initialize *args + super + @data = "" + set_text_mode 1000 + end + def receive_binary_data data + # we expect to get all the data in one chunk, even in the byte-by-byte case, + # because sized transfers by definition give us exactly one call to + # #receive_binary_data. + @data = data + end + end + def test_binary_tail + testdata = "0" * 500 + + a = BinaryTail.new + a.receive_data testdata + a.unbind + assert_equal( "0" * 500, a.data ) + + a = BinaryTail.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + a.unbind + assert_equal( "0" * 500, a.data ) + end + + + # Test an end-of-binary call. Arrange to receive binary data but don't bother counting it + # as it comes. Rely on getting receive_end_of_binary_data to signal the transition back to + # line mode. + # At the present time, this isn't strictly necessary with sized binary chunks because by + # definition we accumulate them and make exactly one call to receive_binary_data, but + # we may want to support a mode in the future that would break up large chunks into multiple + # calls. + class LazyBinary + include EM::Protocols::LineText2 + attr_reader :data, :end + def initialize *args + super + @data = "" + set_text_mode 1000 + end + def receive_binary_data data + # we expect to get all the data in one chunk, even in the byte-by-byte case, + # because sized transfers by definition give us exactly one call to + # #receive_binary_data. + @data = data + end + def receive_end_of_binary_data + @end = true + end + end + def test_receive_end_of_binary_data + testdata = "_" * 1000 + a = LazyBinary.new + testdata.length.times {|i| a.receive_data( testdata[i...i+1] ) } + assert_equal( "_" * 1000, a.data ) + assert( a.end ) + end + + + # This tests a bug fix in which calling set_text_mode failed when called + # inside receive_binary_data. + # + class BinaryPair + include EM::Protocols::LineText2 + attr_reader :sizes + def initialize *args + super + set_text_mode 1 + @sizes = [] + end + def receive_binary_data dt + @sizes << dt.length + set_text_mode( (dt.length == 1) ? 2 : 1 ) + end + end + def test_binary_pairs + test_data = "123" * 5 + a = BinaryPair.new + a.receive_data test_data + assert_equal( [1,2,1,2,1,2,1,2,1,2], a.sizes ) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_many_fds.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_many_fds.rb new file mode 100644 index 000000000000..7c126dcc72ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_many_fds.rb @@ -0,0 +1,22 @@ +require 'em_test_helper' +require 'socket' + +class TestManyFDs < Test::Unit::TestCase + def setup + @port = next_port + end + + def test_connection_class_cache + mod = Module.new + a = nil + Process.setrlimit(Process::RLIMIT_NOFILE, 4096) rescue nil + EM.run { + EM.start_server '127.0.0.1', @port, mod + 1100.times do + a = EM.connect '127.0.0.1', @port, mod + assert_kind_of EM::Connection, a + end + EM.stop + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_next_tick.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_next_tick.rb new file mode 100644 index 000000000000..9b60359c3dd4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_next_tick.rb @@ -0,0 +1,104 @@ +require 'em_test_helper' + +class TestNextTick < Test::Unit::TestCase + + def test_tick_arg + pr = proc {EM.stop} + EM.run { + EM.next_tick pr + } + assert true + end + + def test_tick_block + EM.run { + EM.next_tick {EM.stop} + } + assert true + end + + # This illustrates the solution to a long-standing problem. + # It's now possible to correctly nest calls to EM#run. + # See the source code commentary for EM#run for more info. + # + def test_run_run + EM.run { + EM.run { + EM.next_tick {EM.stop} + } + } + end + + def test_pre_run_queue + x = false + EM.next_tick { EM.stop; x = true } + EM.run { EM.add_timer(0.01) { EM.stop } } + assert x + end + + def test_cleanup_after_stop + x = true + EM.run{ + EM.next_tick{ + EM.stop + EM.next_tick{ x=false } + } + } + EM.run{ + EM.next_tick{ EM.stop } + } + assert x + end + + # We now support an additional parameter for EM#run. + # You can pass two procs to EM#run now. The first is executed as the normal + # run block. The second (if given) is scheduled for execution after the + # reactor loop completes. + # The reason for supporting this is subtle. There has always been an expectation + # that EM#run doesn't return until after the reactor loop ends. But now it's + # possible to nest calls to EM#run, which means that a nested call WILL + # RETURN. In order to write code that will run correctly either way, it's + # recommended to put any code which must execute after the reactor completes + # in the second parameter. + # + def test_run_run_2 + a = proc {EM.stop} + b = proc {assert true} + EM.run a, b + end + + + # This illustrates that EM#run returns when it's called nested. + # This isn't a feature, rather it's something to be wary of when writing code + # that must run correctly even if EM#run is called while a reactor is already + # running. + def test_run_run_3 + a = [] + EM.run { + EM.run proc {EM.stop}, proc {a << 2} + a << 1 + } + assert_equal( [1,2], a ) + end + + + def test_schedule_on_reactor_thread + x = false + EM.run do + EM.schedule { x = true } + EM.stop + end + assert x + end + + def test_schedule_from_thread + x = false + EM.run do + Thread.new { EM.schedule { x = true } }.join + assert !x + EM.next_tick { EM.stop } + end + assert x + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_object_protocol.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_object_protocol.rb new file mode 100644 index 000000000000..b1287ea81e67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_object_protocol.rb @@ -0,0 +1,36 @@ +require 'em_test_helper' + +class TestObjectProtocol < Test::Unit::TestCase + module Server + include EM::P::ObjectProtocol + def post_init + send_object :hello=>'world' + end + def receive_object obj + $server = obj + EM.stop + end + end + + module Client + include EM::P::ObjectProtocol + def receive_object obj + $client = obj + send_object 'you_said'=>obj + end + end + + def setup + @port = next_port + end + + def test_send_receive + EM.run{ + EM.start_server "127.0.0.1", @port, Server + EM.connect "127.0.0.1", @port, Client + } + + assert($client == {:hello=>'world'}) + assert($server == {'you_said'=>{:hello=>'world'}}) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pause.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pause.rb new file mode 100644 index 000000000000..d078a77faa66 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pause.rb @@ -0,0 +1,107 @@ +require 'em_test_helper' + +class TestPause < Test::Unit::TestCase + if EM.respond_to? :pause_connection + def setup + @port = next_port + end + + def teardown + assert(!EM.reactor_running?) + end + + def test_pause_resume + server = nil + + s_rx = c_rx = 0 + + test_server = Module.new do + define_method :post_init do + server = self + end + + define_method :receive_data do |data| + s_rx += 1 + + EM.add_periodic_timer(0.01) { send_data 'hi' } + send_data 'hi' + + # pause server, now no outgoing data will actually + # be sent and no more incoming data will be received + pause + end + end + + test_client = Module.new do + def post_init + EM.add_periodic_timer(0.01) do + send_data 'hello' + end + end + + define_method :receive_data do |data| + c_rx += 1 + end + end + + EM.run do + EM.start_server "127.0.0.1", @port, test_server + EM.connect "127.0.0.1", @port, test_client + + EM.add_timer(0.05) do + assert_equal 1, s_rx + assert_equal 0, c_rx + assert server.paused? + + # resume server, queued outgoing and incoming data will be flushed + server.resume + + assert !server.paused? + + EM.add_timer(0.05) do + assert server.paused? + assert s_rx > 1 + assert c_rx > 0 + EM.stop + end + end + end + end + + def test_pause_in_receive_data + incoming = [] + + test_server = Module.new do + define_method(:receive_data) do |data| + incoming << data + pause + EM.add_timer(0.5){ close_connection } + end + define_method(:unbind) do + EM.stop + end + end + + buf = 'a' * 1024 + + EM.run do + EM.start_server "127.0.0.1", @port, test_server + cli = EM.connect "127.0.0.1", @port + 128.times do + cli.send_data buf + end + end + + assert_equal 1, incoming.size + assert incoming[0].bytesize > buf.bytesize + assert incoming[0].bytesize < buf.bytesize * 128 + end + else + warn "EM.pause_connection not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_pause_connection_not_implemented + assert true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pending_connect_timeout.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pending_connect_timeout.rb new file mode 100644 index 000000000000..a3f7fa4d8750 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pending_connect_timeout.rb @@ -0,0 +1,52 @@ +require 'em_test_helper' + +class TestPendingConnectTimeout < Test::Unit::TestCase + + if EM.respond_to? :get_pending_connect_timeout + def test_default + EM.run { + c = EM.connect("127.0.0.1", 54321) + assert_equal 20.0, c.pending_connect_timeout + EM.stop + } + end + + def test_set_and_get + EM.run { + c = EM.connect("127.0.0.1", 54321) + c.pending_connect_timeout = 2.5 + assert_equal 2.5, c.pending_connect_timeout + EM.stop + } + end + + def test_for_real + start, finish = nil + + timeout_handler = Module.new do + define_method :unbind do + finish = EM.current_time + EM.stop + end + end + + EM.run { + setup_timeout + EM.heartbeat_interval = 0.1 + start = EM.current_time + c = EM.connect('192.0.2.0', 54321, timeout_handler) + c.pending_connect_timeout = 0.2 + } + + assert_in_delta(0.2, (finish - start), 0.1) + end + else + warn "EM.pending_connect_timeout not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_pending_connect_timeout_not_implemented + assert true + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pool.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pool.rb new file mode 100644 index 000000000000..f859a9d101ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pool.rb @@ -0,0 +1,196 @@ +require 'em_test_helper' + +class TestPool < Test::Unit::TestCase + def pool + @pool ||= EM::Pool.new + end + + def go + EM.run { yield } + end + + def stop + EM.stop + end + + def deferrable + @deferrable ||= EM::DefaultDeferrable.new + end + + def test_supports_more_work_than_resources + ran = false + go do + pool.perform do + ran = true + deferrable + end + stop + end + assert_equal false, ran + go do + pool.add :resource + stop + end + assert_equal true, ran + end + + def test_reques_resources_on_error + pooled_res, pooled_res2 = nil + pool.add :res + go do + pool.perform do |res| + pooled_res = res + deferrable + end + stop + end + deferrable.fail + go do + pool.perform do |res| + pooled_res2 = res + deferrable + end + stop + end + assert_equal :res, pooled_res + assert_equal pooled_res, pooled_res2 + end + + def test_supports_custom_on_error + eres = nil + pool.on_error do |res| + eres = res + end + performs = [] + pool.add :res + go do + pool.perform do |res| + performs << res + deferrable + end + pool.perform do |res| + performs << res + deferrable + end + deferrable.fail + stop + end + assert_equal :res, eres + # manual requeues required when error handler is installed: + assert_equal 1, performs.size + assert_equal :res, performs.first + end + + def test_catches_successful_deferrables + performs = [] + pool.add :res + go do + pool.perform { |res| performs << res; deferrable } + pool.perform { |res| performs << res; deferrable } + stop + end + assert_equal [:res], performs + deferrable.succeed + go { stop } + assert_equal [:res, :res], performs + end + + def test_prunes_locked_and_removed_resources + performs = [] + pool.add :res + deferrable.succeed + go do + pool.perform { |res| performs << res; pool.remove res; deferrable } + pool.perform { |res| performs << res; pool.remove res; deferrable } + stop + end + assert_equal [:res], performs + end + + # Contents is only to be used for inspection of the pool! + def test_contents + pool.add :res + assert_equal [:res], pool.contents + # Assert that modifying the contents list does not affect the pools + # contents. + pool.contents.delete(:res) + assert_equal [:res], pool.contents + end + + def test_contents_when_perform_errors_and_on_error_is_not_set + pool.add :res + assert_equal [:res], pool.contents + + pool.perform do |r| + d = EM::DefaultDeferrable.new + d.fail + d + end + + EM.run { EM.next_tick { EM.stop } } + + assert_equal [:res], pool.contents + end + + def test_contents_when_perform_errors_and_on_error_is_set + pool.add :res + res = nil + pool.on_error do |r| + res = r + end + assert_equal [:res], pool.contents + + pool.perform do |r| + d = EM::DefaultDeferrable.new + d.fail 'foo' + d + end + + EM.run { EM.next_tick { EM.stop } } + + assert_equal :res, res + assert_equal [], pool.contents + end + + def test_num_waiting + pool.add :res + assert_equal 0, pool.num_waiting + pool.perform { |r| EM::DefaultDeferrable.new } + assert_equal 0, pool.num_waiting + 10.times { pool.perform { |r| EM::DefaultDeferrable.new } } + EM.run { EM.next_tick { EM.stop } } + assert_equal 10, pool.num_waiting + end + + def test_exceptions_in_the_work_block_bubble_up_raise_and_fail_the_resource + pool.add :res + + res = nil + pool.on_error { |r| res = r } + pool.perform { raise 'boom' } + + assert_raises(RuntimeError) do + EM.run { EM.next_tick { EM.stop } } + end + + assert_equal [], pool.contents + assert_equal :res, res + end + + def test_removed_list_does_not_leak_on_errors + pool.add :res + + pool.on_error do |r| + # This is actually the wrong thing to do, and not required, but some users + # might do it. When they do, they would find that @removed would cause a + # slow leak. + pool.remove r + end + + pool.perform { d = EM::DefaultDeferrable.new; d.fail; d } + + EM.run { EM.next_tick { EM.stop } } + assert_equal [], pool.instance_variable_get(:@removed) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_process_watch.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_process_watch.rb new file mode 100644 index 000000000000..6e0c49a75e80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_process_watch.rb @@ -0,0 +1,50 @@ +require 'em_test_helper' + +if EM.kqueue? + class TestProcessWatch < Test::Unit::TestCase + module ParentProcessWatcher + def process_forked + $forked = true + end + end + + module ChildProcessWatcher + def process_exited + $exited = true + end + def unbind + $unbind = true + EM.stop + end + end + + def setup + EM.kqueue = true + end + + def teardown + EM.kqueue = false + end + + def test_events + omit_if(rbx?) + omit_if(jruby?) + EM.run{ + # watch ourselves for a fork notification + EM.watch_process(Process.pid, ParentProcessWatcher) + $fork_pid = fork{ sleep } + child = EM.watch_process($fork_pid, ChildProcessWatcher) + $pid = child.pid + + EM.add_timer(0.2){ + Process.kill('TERM', $fork_pid) + } + } + + assert_equal($pid, $fork_pid) + assert($forked) + assert($exited) + assert($unbind) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_processes.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_processes.rb new file mode 100644 index 000000000000..dd03cf02daab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_processes.rb @@ -0,0 +1,128 @@ +require 'em_test_helper' + +class TestProcesses < Test::Unit::TestCase + + if !windows? && !jruby? + + # EM::DeferrableChildProcess is a sugaring of a common use-case + # involving EM::popen. + # Call the #open method on EM::DeferrableChildProcess, passing + # a command-string. #open immediately returns an EM::Deferrable + # object. It also schedules the forking of a child process, which + # will execute the command passed to #open. + # When the forked child terminates, the Deferrable will be signalled + # and execute its callbacks, passing the data that the child process + # wrote to stdout. + # + def test_deferrable_child_process + ls = "" + EM.run { + d = EM::DeferrableChildProcess.open( "ls -ltr" ) + d.callback {|data_from_child| + ls = data_from_child + EM.stop + } + } + assert( ls.length > 0) + end + + def setup + $out = nil + $status = nil + end + + def test_em_system + EM.run{ + EM.system('ls'){ |out,status| $out, $status = out, status; EM.stop } + } + + assert( $out.length > 0 ) + assert_equal(0, $status.exitstatus) + assert_kind_of(Process::Status, $status) + end + + def test_em_system_pid + $pids = [] + + EM.run{ + $pids << EM.system('echo hi', proc{ |out,status|$pids << status.pid; EM.stop }) + } + + assert_equal $pids[0], $pids[1] + end + + def test_em_system_with_proc + EM.run{ + EM.system('ls', proc{ |out,status| $out, $status = out, status; EM.stop }) + } + + assert( $out.length > 0 ) + assert_equal(0, $status.exitstatus) + assert_kind_of(Process::Status, $status) + end + + def test_em_system_with_two_procs + EM.run{ + EM.system('sh', proc{ |process| + process.send_data("echo hello\n") + process.send_data("exit\n") + }, proc{ |out,status| + $out = out + $status = status + EM.stop + }) + } + + assert_equal("hello\n", $out) + end + + def test_em_system_cmd_arguments + EM.run{ + EM.system('echo', '1', '2', 'version', proc{ |process| + }, proc{ |out,status| + $out = out + $status = status + EM.stop + }) + } + + assert_match(/1 2 version/i, $out) + end + + def test_em_system_spaced_arguments + EM.run{ + EM.system('ruby', '-e', 'puts "hello"', proc{ |out,status| + $out = out + EM.stop + }) + } + + assert_equal("hello\n", $out) + end + + def test_em_popen_pause_resume + c_rx = 0 + + test_client = Module.new do + define_method :receive_data do |data| + c_rx += 1 + pause + EM.add_timer(0.5) { EM.stop } + end + end + + EM.run do + EM.popen('echo 1', test_client) + end + + assert_equal 1, c_rx + end + else + warn "EM.popen not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_popen_unsupported + assert true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_proxy_connection.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_proxy_connection.rb new file mode 100644 index 000000000000..11c0fb410072 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_proxy_connection.rb @@ -0,0 +1,180 @@ +require 'em_test_helper' + +class TestProxyConnection < Test::Unit::TestCase + + if EM.respond_to?(:start_proxy) + module ProxyConnection + def initialize(client, request) + @client, @request = client, request + end + + def post_init + EM::enable_proxy(self, @client) + end + + def connection_completed + EM.next_tick { + send_data @request + } + end + + def proxy_target_unbound + $unbound_early = true + EM.stop + end + + def unbind + $proxied_bytes = self.get_proxied_bytes + @client.close_connection_after_writing + end + end + + module PartialProxyConnection + def initialize(client, request, length) + @client, @request, @length = client, request, length + end + + def post_init + EM::enable_proxy(self, @client, 0, @length) + end + + def receive_data(data) + $unproxied_data = data + @client.send_data(data) + end + + def connection_completed + EM.next_tick { + send_data @request + } + end + + def proxy_target_unbound + $unbound_early = true + EM.stop + end + + def proxy_completed + $proxy_completed = true + end + + def unbind + @client.close_connection_after_writing + end + end + + module Client + def connection_completed + send_data "EM rocks!" + end + + def receive_data(data) + $client_data = data + end + + def unbind + EM.stop + end + end + + module Client2 + include Client + def unbind; end + end + + module Server + def receive_data(data) + send_data "I know!" if data == "EM rocks!" + close_connection_after_writing + end + end + + module ProxyServer + def initialize port + @port = port + end + + def receive_data(data) + @proxy = EM.connect("127.0.0.1", @port, ProxyConnection, self, data) + end + end + + module PartialProxyServer + def initialize port + @port = port + end + + def receive_data(data) + EM.connect("127.0.0.1", @port, PartialProxyConnection, self, data, 1) + end + end + + module EarlyClosingProxy + def initialize port + @port = port + end + + def receive_data(data) + EM.connect("127.0.0.1", @port, ProxyConnection, self, data) + close_connection + end + end + + def setup + @port = next_port + @proxy_port = next_port + end + + def test_proxy_connection + EM.run { + EM.start_server("127.0.0.1", @port, Server) + EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port) + EM.connect("127.0.0.1", @proxy_port, Client) + } + + assert_equal("I know!", $client_data) + end + + def test_proxied_bytes + EM.run { + EM.start_server("127.0.0.1", @port, Server) + EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port) + EM.connect("127.0.0.1", @proxy_port, Client) + } + + assert_equal("I know!", $client_data) + assert_equal("I know!".bytesize, $proxied_bytes) + end + + def test_partial_proxy_connection + EM.run { + EM.start_server("127.0.0.1", @port, Server) + EM.start_server("127.0.0.1", @proxy_port, PartialProxyServer, @port) + EM.connect("127.0.0.1", @proxy_port, Client) + } + + assert_equal("I know!", $client_data) + assert_equal(" know!", $unproxied_data) + assert($proxy_completed) + end + + def test_early_close + $client_data = nil + EM.run { + EM.start_server("127.0.0.1", @port, Server) + EM.start_server("127.0.0.1", @proxy_port, EarlyClosingProxy, @port) + EM.connect("127.0.0.1", @proxy_port, Client2) + } + + assert($unbound_early) + end + else + warn "EM.start_proxy not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_start_proxy_not_implemented + assert !EM.respond_to?(:start_proxy) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pure.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pure.rb new file mode 100644 index 000000000000..8863a8d10934 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_pure.rb @@ -0,0 +1,139 @@ +require 'em_test_helper' + +class TestPure < Test::Unit::TestCase + + def setup + @port = next_port + end + + # These tests are intended to exercise problems that come up in the + # pure-Ruby implementation. However, we DON'T constrain them such that + # they only run in pure-Ruby. These tests need to work identically in + # any implementation. + + #------------------------------------- + + # The EM reactor needs to run down open connections and release other resources + # when it stops running. Make sure this happens even if user code throws a Ruby + # exception. + # If exception handling is incorrect, the second test will fail with a no-bind error + # because the TCP server opened in the first test will not have been closed. + + def test_exception_handling_releases_resources + exception = Class.new(StandardError) + + 2.times do + assert_raises(exception) do + EM.run do + EM.start_server "127.0.0.1", @port + raise exception + end + end + end + end + + # Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED + # exception on certain kinds of TCP connect-errors. + # It's always been something of an open question whether EM should throw an exception + # in these cases but the defined answer has always been to catch it the unbind method. + # With a connect failure, the latter will always fire, but connection_completed will + # never fire. So even though the point is arguable, it's incorrect for the pure Ruby + # version to throw an exception. + module TestConnrefused + def unbind + EM.stop + end + def connection_completed + raise "should never get here" + end + end + + def test_connrefused + assert_nothing_raised do + EM.run { + setup_timeout(2) + EM.connect "127.0.0.1", @port, TestConnrefused + } + end + end + + # Make sure connection_completed gets called as expected with TCP clients. This is the + # opposite of test_connrefused. + # If the test fails, it will hang because EM.stop never gets called. + # + module TestConnaccepted + def connection_completed + EM.stop + end + end + def test_connaccepted + assert_nothing_raised do + EM.run { + EM.start_server "127.0.0.1", @port + EM.connect "127.0.0.1", @port, TestConnaccepted + setup_timeout(1) + } + end + end + + def test_reactor_running + a = false + EM.run { + a = EM.reactor_running? + EM.next_tick {EM.stop} + } + assert a + end + + module TLSServer + def post_init + start_tls + end + + def ssl_handshake_completed + $server_handshake_completed = true + end + + def receive_data(data) + $server_received_data = data + send_data(data) + end + end + + module TLSClient + def post_init + start_tls + end + + def ssl_handshake_completed + $client_handshake_completed = true + end + + def connection_completed + send_data('Hello World!') + end + + def receive_data(data) + $client_received_data = data + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + def test_start_tls + $client_handshake_completed, $server_handshake_completed = false, false + $client_received_data, $server_received_data = nil, nil + EM.run do + EM.start_server("127.0.0.1", 16789, TLSServer) + EM.connect("127.0.0.1", 16789, TLSClient) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + assert($client_received_data == "Hello World!") + assert($server_received_data == "Hello World!") + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_queue.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_queue.rb new file mode 100644 index 000000000000..34278c05b533 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_queue.rb @@ -0,0 +1,64 @@ +require 'em_test_helper' + +class TestEMQueue < Test::Unit::TestCase + def test_queue_push + s = 0 + EM.run do + q = EM::Queue.new + q.push(1) + EM.next_tick { s = q.size; EM.stop } + end + assert_equal 1, s + end + + def test_queue_pop + x,y,z = nil + EM.run do + q = EM::Queue.new + q.push(1,2,3) + q.pop { |v| x = v } + q.pop { |v| y = v } + q.pop { |v| z = v; EM.stop } + end + assert_equal 1, x + assert_equal 2, y + assert_equal 3, z + end + + def test_queue_reactor_thread + q = EM::Queue.new + + Thread.new { q.push(1,2,3) }.join + assert q.empty? + EM.run { EM.next_tick { EM.stop } } + assert_equal 3, q.size + + x = nil + Thread.new { q.pop { |v| x = v } }.join + assert_equal nil, x + EM.run { EM.next_tick { EM.stop } } + assert_equal 1, x + end + + def test_num_waiting + q = EM::Queue.new + many = 3 + many.times { q.pop {} } + EM.run { EM.next_tick { EM.stop } } + assert_equal many, q.num_waiting + end + + def test_big_queue + EM.run do + q = EM::Queue.new + 2000.times do |i| + q.push(*0..1000) + q.pop { |v| assert_equal v, i % 1001 } + end + q.pop do + assert_equal 1_999_999, q.size + EM.stop + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_resolver.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_resolver.rb new file mode 100644 index 000000000000..58ed5f574ed3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_resolver.rb @@ -0,0 +1,105 @@ +require 'em_test_helper' + +class TestResolver < Test::Unit::TestCase + def test_nameserver + assert_kind_of(String, EM::DNS::Resolver.nameserver) + end + + def test_nameservers + assert_kind_of(Array, EM::DNS::Resolver.nameservers) + end + + def test_hosts + assert_kind_of(Hash, EM::DNS::Resolver.hosts) + + # Make sure that blank or comment lines are skipped + refute(EM::DNS::Resolver.hosts.include? nil) + end + + def test_a + pend('FIXME: this test is broken on Windows') if windows? + + EM.run { + d = EM::DNS::Resolver.resolve "example.com" + d.errback { assert false } + d.callback { |r| + assert r + EM.stop + } + } + end + + def test_bad_host + EM.run { + d = EM::DNS::Resolver.resolve "asdfasasdf" + d.callback { assert false } + d.errback { assert true; EM.stop } + } + end + + def test_garbage + assert_raises( ArgumentError ) { + EM.run { + EM::DNS::Resolver.resolve 123 + } + } + end + + # There isn't a public DNS entry like 'example.com' with an A rrset + def test_a_pair + pend('FIXME: this test is broken on Windows') if windows? + + EM.run { + d = EM::DNS::Resolver.resolve "yahoo.com" + d.errback { |err| assert false, "failed to resolve yahoo.com: #{err}" } + d.callback { |r| + assert_kind_of(Array, r) + assert r.size > 1, "returned #{r.size} results: #{r.inspect}" + EM.stop + } + } + end + + def test_localhost + pend('FIXME: this test is broken on Windows') if windows? + + EM.run { + d = EM::DNS::Resolver.resolve "localhost" + d.errback { assert false } + d.callback { |r| + assert_include(["127.0.0.1", "::1"], r.first) + assert_kind_of(Array, r) + + EM.stop + } + } + end + + def test_timer_cleanup + pend('FIXME: this test is broken on Windows') if windows? + + EM.run { + d = EM::DNS::Resolver.resolve "example.com" + d.errback { |err| assert false, "failed to resolve example.com: #{err}" } + d.callback { |r| + # This isn't a great test, but it's hard to get more canonical + # confirmation that the timer is cancelled + assert_nil(EM::DNS::Resolver.socket.instance_variable_get(:@timer)) + + EM.stop + } + } + end + + def test_failure_timer_cleanup + EM.run { + d = EM::DNS::Resolver.resolve "asdfasdf" + d.callback { assert false } + d.errback { + assert_nil(EM::DNS::Resolver.socket.instance_variable_get(:@timer)) + + EM.stop + } + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_running.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_running.rb new file mode 100644 index 000000000000..693b3901ad4c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_running.rb @@ -0,0 +1,14 @@ +require 'em_test_helper' + +class TestRunning < Test::Unit::TestCase + def test_running + assert_equal( false, EM::reactor_running? ) + r = false + EM.run { + r = EM::reactor_running? + EM.stop + } + assert_equal( true, r ) + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_sasl.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_sasl.rb new file mode 100644 index 000000000000..e80f6571ae7b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_sasl.rb @@ -0,0 +1,47 @@ +require 'em_test_helper' + + +class TestSASL < Test::Unit::TestCase + + # SASL authentication is usually done with UNIX-domain sockets, but + # we'll use TCP so this test will work on Windows. As far as the + # protocol handlers are concerned, there's no difference. + + TestUser,TestPsw = "someone", "password" + + class SaslServer < EM::Connection + include EM::Protocols::SASLauth + def validate usr, psw, sys, realm + usr == TestUser and psw == TestPsw + end + end + + class SaslClient < EM::Connection + include EM::Protocols::SASLauthclient + end + + def setup + @port = next_port + end + + def test_sasl + resp = nil + EM.run { + EM.start_server( "127.0.0.1", @port, SaslServer ) + + c = EM.connect( "127.0.0.1", @port, SaslClient ) + d = c.validate?( TestUser, TestPsw ) + d.timeout 1 + d.callback { + resp = true + EM.stop + } + d.errback { + resp = false + EM.stop + } + } + assert_equal( true, resp ) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_send_file.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_send_file.rb new file mode 100644 index 000000000000..a784b505dcc5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_send_file.rb @@ -0,0 +1,217 @@ +require 'em_test_helper' +require 'tempfile' + +class TestSendFile < Test::Unit::TestCase + + if EM.respond_to?(:send_file_data) + module TestModule + def initialize filename + @filename = filename + end + + def post_init + send_file_data @filename + close_connection_after_writing + end + end + + module TestClient + def data_to(&blk) + @data_to = blk + end + + def receive_data(data) + @data_to.call(data) if @data_to + end + + def unbind + EM.stop + end + end + + def setup + @file = Tempfile.new("em_test_file") + @filename = @file.path + @port = next_port + end + + def test_send_file + File.open( @filename, "w" ) {|f| + f << ("A" * 5000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, TestModule, @filename + setup_timeout + + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "A" * 5000, data ) + end + + # EM::Connection#send_file_data has a strict upper limit on the filesize it will work with. + def test_send_large_file + File.open( @filename, "w" ) {|f| + f << ("A" * 1000000) + } + + data = '' + + assert_raises(RuntimeError) { + EM.run { + EM.start_server "127.0.0.1", @port, TestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + } + end + + module StreamTestModule + def initialize filename + @filename = filename + end + + def post_init + EM::Deferrable.future( stream_file_data(@filename)) { + close_connection_after_writing + } + end + end + + module ChunkStreamTestModule + def initialize filename + @filename = filename + end + + def post_init + EM::Deferrable.future( stream_file_data(@filename, :http_chunks=>true)) { + close_connection_after_writing + } + end + end + + def test_stream_file_data + File.open( @filename, "w" ) {|f| + f << ("A" * 1000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, StreamTestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "A" * 1000, data ) + end + + def test_stream_chunked_file_data + File.open( @filename, "w" ) {|f| + f << ("A" * 1000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "3e8\r\n#{"A" * 1000}\r\n0\r\n\r\n", data ) + end + + module BadFileTestModule + def initialize filename + @filename = filename + end + + def post_init + de = stream_file_data( @filename+".wrong" ) + de.errback {|msg| + send_data msg + close_connection_after_writing + } + end + end + def test_stream_bad_file + data = '' + EM.run { + EM.start_server "127.0.0.1", @port, BadFileTestModule, @filename + setup_timeout(5) + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "file not found", data ) + end + else + warn "EM.send_file_data not implemented, skipping tests in #{__FILE__}" + + # Because some rubies will complain if a TestCase class has no tests + def test_em_send_file_data_not_implemented + assert !EM.respond_to?(:send_file_data) + end + end + + begin + require 'fastfilereaderext' + + def test_stream_large_file_data + File.open( @filename, "w" ) {|f| + f << ("A" * 10000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, StreamTestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + assert_equal( "A" * 10000, data ) + end + + def test_stream_large_chunked_file_data + File.open( @filename, "w" ) {|f| + f << ("A" * 100000) + } + + data = '' + + EM.run { + EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename + setup_timeout + EM.connect "127.0.0.1", @port, TestClient do |c| + c.data_to { |d| data << d } + end + } + + expected = [ + "4000\r\n#{"A" * 16384}\r\n" * 6, + "6a0\r\n#{"A" * 0x6a0}\r\n", + "0\r\n\r\n" + ].join + assert_equal( expected, data ) + end + rescue LoadError + warn "require 'fastfilereaderext' failed, skipping tests in #{__FILE__}" + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_servers.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_servers.rb new file mode 100644 index 000000000000..2a170504da83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_servers.rb @@ -0,0 +1,33 @@ +require 'em_test_helper' +require 'socket' + +class TestServers < Test::Unit::TestCase + + def setup + @port = next_port + end + + def server_alive? + port_in_use?(@port) + end + + def run_test_stop_server + EM.run { + sig = EM.start_server("127.0.0.1", @port) + assert server_alive?, "Server didn't start" + EM.stop_server sig + # Give the server some time to shutdown. + EM.add_timer(0.1) { + assert !server_alive?, "Server didn't stop" + EM.stop + } + } + end + + def test_stop_server + assert !server_alive?, "Port already in use" + 2.times { run_test_stop_server } + assert !server_alive?, "Servers didn't stop" + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_shutdown_hooks.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_shutdown_hooks.rb new file mode 100644 index 000000000000..b0e0c5cc5645 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_shutdown_hooks.rb @@ -0,0 +1,23 @@ +require 'em_test_helper' + +class TestShutdownHooks < Test::Unit::TestCase + def test_shutdown_hooks + r = false + EM.run { + EM.add_shutdown_hook { r = true } + EM.stop + } + assert_equal( true, r ) + end + + def test_hook_order + r = [] + EM.run { + EM.add_shutdown_hook { r << 2 } + EM.add_shutdown_hook { r << 1 } + EM.stop + } + assert_equal( [1, 2], r ) + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_smtpclient.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_smtpclient.rb new file mode 100644 index 000000000000..71ed5844a78e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_smtpclient.rb @@ -0,0 +1,75 @@ +require 'em_test_helper' + +class TestSmtpClient < Test::Unit::TestCase + + Localhost = "127.0.0.1" + Localport = 9801 + + def setup + end + + def teardown + end + + def test_a + # No real tests until we have a server implementation to test against. + # This is what the call looks like, though: + err = nil + EM.run { + d = EM::Protocols::SmtpClient.send :domain=>"example.com", + :host=>Localhost, + :port=>Localport, # optional, defaults 25 + :starttls=>true, + :from=>"sender@example.com", + :to=> ["to_1@example.com", "to_2@example.com"], + :header=> {"Subject" => "This is a subject line"}, + :body=> "This is the body of the email", + :verbose=>true + d.errback {|e| + err = e + EM.stop + } + } + assert(err) + end + + def test_content + err = nil + EM.run { + d = EM::Protocols::SmtpClient.send :domain=>"example.com", + :host=>Localhost, + :port=>Localport, # optional, defaults 25 + :starttls=>true, + :from=>"sender@example.com", + :to=> ["to_1@example.com", "to_2@example.com"], + :content => ["Subject: xxx\r\n\r\ndata\r\n.\r\n"], + :verbose=>true + d.errback {|e| + err = e + EM.stop + } + } + assert(err) + end + + + EM::Protocols::SmtpClient.__send__(:public, :escape_leading_dots) + + def test_escaping + smtp = EM::Protocols::SmtpClient.new :domain => "example.com" + + expectations = { + "Hello\r\n" => "Hello\r\n", + "\r\n.whatever\r\n" => "\r\n..whatever\r\n", + "\r\n.\r\n" => "\r\n..\r\n", + "\r\n.\r\n." => "\r\n..\r\n..", + ".\r\n.\r\n" => "..\r\n..\r\n", + "..\r\n" => "...\r\n" + } + + expectations.each do |input, output| + assert_equal output, smtp.escape_leading_dots(input) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_smtpserver.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_smtpserver.rb new file mode 100644 index 000000000000..18c50febd87e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_smtpserver.rb @@ -0,0 +1,57 @@ +require 'em_test_helper' + +class TestSmtpServer < Test::Unit::TestCase + + # Don't test on port 25. It requires superuser and there's probably + # a mail server already running there anyway. + Localhost = "127.0.0.1" + Localport = 25001 + + # This class is an example of what you need to write in order + # to implement a mail server. You override the methods you are + # interested in. Some, but not all, of these are illustrated here. + # + class Mailserver < EM::Protocols::SmtpServer + + attr_reader :my_msg_body, :my_sender, :my_recipients + + def initialize *args + super + end + def receive_sender sender + @my_sender = sender + #p sender + true + end + def receive_recipient rcpt + @my_recipients ||= [] + @my_recipients << rcpt + true + end + def receive_data_chunk c + @my_msg_body = c.last + end + def connection_ended + EM.stop + end + end + + def test_mail + c = nil + EM.run { + EM.start_server( Localhost, Localport, Mailserver ) {|conn| c = conn} + EM::Timer.new(2) {EM.stop} # prevent hanging the test suite in case of error + EM::Protocols::SmtpClient.send :host=>Localhost, + :port=>Localport, + :domain=>"bogus", + :from=>"me@example.com", + :to=>"you@example.com", + :header=> {"Subject"=>"Email subject line", "Reply-to"=>"me@example.com"}, + :body=>"Not much of interest here." + + } + assert_equal( "Not much of interest here.", c.my_msg_body ) + assert_equal( "<me@example.com>", c.my_sender ) + assert_equal( ["<you@example.com>"], c.my_recipients ) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_sock_opt.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_sock_opt.rb new file mode 100644 index 000000000000..60fba351e44a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_sock_opt.rb @@ -0,0 +1,54 @@ +require 'em_test_helper' +require 'socket' + +class TestSockOpt < Test::Unit::TestCase + def setup + assert(!EM.reactor_running?) + @port = next_port + end + + def teardown + assert(!EM.reactor_running?) + end + + def test_set_sock_opt + omit_if(windows?) + omit_if(!EM.respond_to?(:set_sock_opt)) + + val = nil + test_module = Module.new do + define_method :post_init do + val = set_sock_opt Socket::SOL_SOCKET, Socket::SO_BROADCAST, true + EM.stop + end + end + + EM.run do + EM.start_server '127.0.0.1', @port + EM.connect '127.0.0.1', @port, test_module + end + + assert_equal 0, val + end + + def test_get_sock_opt + omit_if(windows?) + omit_if(!EM.respond_to?(:set_sock_opt)) + + val = nil + test_module = Module.new do + define_method :connection_completed do + val = get_sock_opt Socket::SOL_SOCKET, Socket::SO_ERROR + EM.stop + end + end + + EM.run do + EM.start_server '127.0.0.1', @port + EM.connect '127.0.0.1', @port, test_module + end + + assert_equal "\0\0\0\0", val + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_spawn.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_spawn.rb new file mode 100644 index 000000000000..ab0a92f771f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_spawn.rb @@ -0,0 +1,293 @@ + +require 'em_test_helper' + + + +class TestSpawn < Test::Unit::TestCase + + # Spawn a process that simply stops the reactor. + # Assert that the notification runs after the block that calls it. + # + def test_stop + x = nil + EM.run { + s = EM.spawn {EM.stop} + s.notify + x = true + } + assert x + end + + + # Pass a parameter to a spawned process. + # + def test_parms + val = 5 + EM.run { + s = EM.spawn {|v| val *= v; EM.stop} + s.notify 3 + } + assert_equal( 15, val ) + end + + # Pass multiple parameters to a spawned process. + # + def test_multiparms + val = 5 + EM.run { + s = EM.spawn {|v1,v2| val *= (v1 + v2); EM.stop} + s.notify 3,4 + } + assert_equal( 35, val ) + end + + + # This test demonstrates that a notification does not happen immediately, + # but rather is scheduled sometime after the current code path completes. + # + def test_race + x = 0 + EM.run { + s = EM.spawn {x *= 2; EM.stop} + s.notify + x = 2 + } + assert_equal( 4, x) + end + + + # Spawn a process and notify it 25 times to run fibonacci + # on a pair of global variables. + # + def test_fibonacci + x = 1 + y = 1 + EM.run { + s = EM.spawn {x,y = y,x+y} + 25.times {s.notify} + + t = EM.spawn {EM.stop} + t.notify + } + assert_equal( 121393, x) + assert_equal( 196418, y) + end + + # This one spawns 25 distinct processes, and notifies each one once, + # rather than notifying a single process 25 times. + # + def test_another_fibonacci + x = 1 + y = 1 + EM.run { + 25.times { + s = EM.spawn {x,y = y,x+y} + s.notify + } + + t = EM.spawn {EM.stop} + t.notify + } + assert_equal( 121393, x) + assert_equal( 196418, y) + end + + + # Make a chain of processes that notify each other in turn + # with intermediate fibonacci results. The final process in + # the chain stops the loop and returns the result. + # + def test_fibonacci_chain + a,b = nil + + EM.run { + nextpid = EM.spawn {|x,y| + a,b = x,y + EM.stop + } + + 25.times { + n = nextpid + nextpid = EM.spawn {|x,y| n.notify( y, x+y )} + } + + nextpid.notify( 1, 1 ) + } + + assert_equal( 121393, a) + assert_equal( 196418, b) + end + + + # EM#yield gives a spawed process to yield control to other processes + # (in other words, to stop running), and to specify a different code block + # that will run on its next notification. + # + def test_yield + a = 0 + EM.run { + n = EM.spawn { + a += 10 + EM.yield { + a += 20 + EM.yield { + a += 30 + EM.stop + } + } + } + n.notify + n.notify + n.notify + } + assert_equal( 60, a ) + end + + # EM#yield_and_notify behaves like EM#yield, except that it also notifies the + # yielding process. This may sound trivial, since the yield block will run very + # shortly after with no action by the program, but this actually can be very useful, + # because it causes the reactor core to execute once before the yielding process + # gets control back. So it can be used to allow heavily-used network connections + # to clear buffers, or allow other processes to process their notifications. + # + # Notice in this test code that only a simple notify is needed at the bottom + # of the initial block. Even so, all of the yielded blocks will execute. + # + def test_yield_and_notify + a = 0 + EM.run { + n = EM.spawn { + a += 10 + EM.yield_and_notify { + a += 20 + EM.yield_and_notify { + a += 30 + EM.stop + } + } + } + n.notify + } + assert_equal( 60, a ) + end + + # resume is an alias for notify. + # + def test_resume + EM.run { + n = EM.spawn {EM.stop} + n.resume + } + assert true + end + + # run is an idiomatic alias for notify. + # + def test_run + EM.run { + (EM.spawn {EM.stop}).run + } + assert true + end + + + # Clones the ping-pong example from the Erlang tutorial, in much less code. + # Illustrates that a spawned block executes in the context of a SpawnableObject. + # (Meaning, we can pass self as a parameter to another process that can then + # notify us.) + # + def test_ping_pong + n_pongs = 0 + EM.run { + pong = EM.spawn {|x, ping| + n_pongs += 1 + ping.notify( x-1 ) + } + ping = EM.spawn {|x| + if x > 0 + pong.notify x, self + else + EM.stop + end + } + ping.notify 3 + } + assert_equal( 3, n_pongs ) + end + + # Illustrates that you can call notify inside a notification, and it will cause + # the currently-executing process to be re-notified. Of course, the new notification + # won't run until sometime after the current one completes. + # + def test_self_notify + n = 0 + EM.run { + pid = EM.spawn {|x| + if x > 0 + n += x + notify( x-1 ) + else + EM.stop + end + } + pid.notify 3 + } + assert_equal( 6, n ) + end + + + # Illustrates that the block passed to #spawn executes in the context of a + # SpawnedProcess object, NOT in the local context. This can often be deceptive. + # + class BlockScopeTest + attr_reader :var + def run + # The following line correctly raises a NameError. + # The problem is that the programmer expected the spawned block to + # execute in the local context, but it doesn't. + # + # (EM.spawn { do_something }).notify ### NO! BAD! + + + + # The following line correctly passes self as a parameter to the + # notified process. + # + (EM.spawn {|obj| obj.do_something }).notify(self) + + + + # Here's another way to do it. This works because "myself" is bound + # in the local scope, unlike "self," so the spawned block sees it. + # + myself = self + (EM.spawn { myself.do_something }).notify + + + + # And we end the loop. + # This is a tangential point, but observe that #notify never blocks. + # It merely appends a message to the internal queue of a spawned process + # and returns. As it turns out, the reactor processes notifications for ALL + # spawned processes in the order that #notify is called. So there is a + # reasonable expectation that the process which stops the reactor will + # execute after the previous ones in this method. HOWEVER, this is NOT + # a documented behavior and is subject to change. + # + (EM.spawn {EM.stop}).notify + end + def do_something + @var ||= 0 + @var += 100 + end + end + + def test_block_scope + bs = BlockScopeTest.new + EM.run { + bs.run + } + assert_equal( 200, bs.var ) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_args.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_args.rb new file mode 100644 index 000000000000..d337628c7ac7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_args.rb @@ -0,0 +1,78 @@ +require "test/unit" +require 'tempfile' + +require 'em_test_helper' + +module EM + def self._set_mocks + class <<self + alias set_tls_parms_old set_tls_parms + alias start_tls_old start_tls + begin + old, $VERBOSE = $VERBOSE, nil + def set_tls_parms *args; end + def start_tls *args; end + ensure + $VERBOSE = old + end + end + end + + def self._clear_mocks + class <<self + begin + old, $VERBOSE = $VERBOSE, nil + alias set_tls_parms set_tls_parms_old + alias start_tls start_tls_old + ensure + $VERBOSE = old + end + end + end +end + + + +class TestSslArgs < Test::Unit::TestCase + def setup + EM._set_mocks + end + + def teardown + EM._clear_mocks + end + + def test_tls_params_file_doesnt_exist + priv_file, cert_file = 'foo_priv_key', 'bar_cert_file' + [priv_file, cert_file].all? do |f| + assert(!File.exist?(f), "Cert file #{f} seems to exist, and should not for the tests") + end + + # associate_callback_target is a pain! (build!) + conn = EM::Connection.new('foo') + + assert_raises(EM::FileNotFoundException) do + conn.start_tls(:private_key_file => priv_file) + end + assert_raises(EM::FileNotFoundException) do + conn.start_tls(:cert_chain_file => cert_file) + end + assert_raises(EM::FileNotFoundException) do + conn.start_tls(:private_key_file => priv_file, :cert_chain_file => cert_file) + end + end + + def test_tls_params_file_does_exist + priv_file = Tempfile.new('em_test') + cert_file = Tempfile.new('em_test') + priv_file_path = priv_file.path + cert_file_path = cert_file.path + conn = EM::Connection.new('foo') + params = {:private_key_file => priv_file_path, :cert_chain_file => cert_file_path} + begin + conn.start_tls params + rescue Object + assert(false, 'should not have raised an exception') + end + end +end if EM.ssl? diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_dhparam.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_dhparam.rb new file mode 100644 index 000000000000..85f52d2f1967 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_dhparam.rb @@ -0,0 +1,84 @@ +require 'em_test_helper' + +class TestSslDhParam < Test::Unit::TestCase + def setup + $dir = File.dirname(File.expand_path(__FILE__)) + '/' + $dhparam_file = File.join($dir, 'dhparam.pem') + end + + module Client + def post_init + start_tls + end + + def ssl_handshake_completed + $client_handshake_completed = true + $client_cipher_name = get_cipher_name + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module Server + def post_init + start_tls(:dhparam => $dhparam_file, :cipher_list => "DHE,EDH") + end + + def ssl_handshake_completed + $server_handshake_completed = true + $server_cipher_name = get_cipher_name + end + end + + module NoDhServer + def post_init + start_tls(:cipher_list => "DHE,EDH") + end + + def ssl_handshake_completed + $server_handshake_completed = true + $server_cipher_name = get_cipher_name + end + end + + def test_no_dhparam + omit_unless(EM.ssl?) + omit_if(EM.library_type == :pure_ruby) # DH will work with defaults + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + $server_cipher_name, $client_cipher_name = nil, nil + + EM.run { + EM.start_server("127.0.0.1", 16784, NoDhServer) + EM.connect("127.0.0.1", 16784, Client) + } + + assert(!$client_handshake_completed) + assert(!$server_handshake_completed) + end + + def test_dhparam + omit_unless(EM.ssl?) + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + $server_cipher_name, $client_cipher_name = nil, nil + + EM.run { + EM.start_server("127.0.0.1", 16784, Server) + EM.connect("127.0.0.1", 16784, Client) + } + + assert($client_handshake_completed) + assert($server_handshake_completed) + + assert($client_cipher_name.length > 0) + assert_equal($client_cipher_name, $server_cipher_name) + + assert_match(/^(DHE|EDH)/, $client_cipher_name) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_ecdh_curve.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_ecdh_curve.rb new file mode 100644 index 000000000000..8dc167b67ff6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_ecdh_curve.rb @@ -0,0 +1,80 @@ +require 'em_test_helper' + +class TestSslEcdhCurve < Test::Unit::TestCase + module Client + def post_init + start_tls + end + + def ssl_handshake_completed + $client_handshake_completed = true + $client_cipher_name = get_cipher_name + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module Server + def post_init + start_tls(:ecdh_curve => "prime256v1", :cipher_list => "ECDH") + end + + def ssl_handshake_completed + $server_handshake_completed = true + $server_cipher_name = get_cipher_name + end + end + + module NoCurveServer + def post_init + start_tls(:cipher_list => "ECDH") + end + + def ssl_handshake_completed + $server_handshake_completed = true + $server_cipher_name = get_cipher_name + end + end + + def test_no_ecdh_curve + omit_unless(EM.ssl?) + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + + EM.run { + EM.start_server("127.0.0.1", 16784, NoCurveServer) + EM.connect("127.0.0.1", 16784, Client) + } + + assert(!$client_handshake_completed) + assert(!$server_handshake_completed) + end + + def test_ecdh_curve + omit_unless(EM.ssl?) + omit_if(EM.library_type == :pure_ruby && RUBY_VERSION < "2.3.0") + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + $server_cipher_name, $client_cipher_name = nil, nil + + EM.run { + EM.start_server("127.0.0.1", 16784, Server) + EM.connect("127.0.0.1", 16784, Client) + } + + assert($client_handshake_completed) + assert($server_handshake_completed) + + assert($client_cipher_name.length > 0) + assert_equal($client_cipher_name, $server_cipher_name) + + assert_match(/^(AECDH|ECDHE)/, $client_cipher_name) + end + + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_extensions.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_extensions.rb new file mode 100644 index 000000000000..0610ba88f48d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_extensions.rb @@ -0,0 +1,49 @@ +require 'em_test_helper' + +require 'socket' +require 'openssl' + +if EM.ssl? + class TestSslExtensions < Test::Unit::TestCase + + module Client + def ssl_handshake_completed + $client_handshake_completed = true + close_connection + end + + def unbind + EM.stop_event_loop + end + + def post_init + start_tls(:ssl_version => :tlsv1, :sni_hostname => 'example.com') + end + end + + module Server + def ssl_handshake_completed + $server_handshake_completed = true + $server_sni_hostname = get_sni_hostname + end + + def post_init + start_tls(:ssl_version => :TLSv1) + end + end + + def test_tlsext_sni_hostname + $server_handshake_completed = false + + EM.run do + EM.start_server("127.0.0.1", 16784, Server) + EM.connect("127.0.0.1", 16784, Client) + end + + assert($server_handshake_completed) + assert_equal('example.com', $server_sni_hostname) + end + end +else + warn "EM built without SSL support, skipping tests in #{__FILE__}" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_methods.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_methods.rb new file mode 100644 index 000000000000..c2e5744d90a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_methods.rb @@ -0,0 +1,65 @@ +require 'em_test_helper' + +class TestSSLMethods < Test::Unit::TestCase + + module ServerHandler + def post_init + start_tls + end + + def ssl_handshake_completed + $server_called_back = true + $server_cert_value = get_peer_cert + $server_cipher_bits = get_cipher_bits + $server_cipher_name = get_cipher_name + $server_cipher_protocol = get_cipher_protocol + end + end + + module ClientHandler + def post_init + start_tls + end + + def ssl_handshake_completed + $client_called_back = true + $client_cert_value = get_peer_cert + $client_cipher_bits = get_cipher_bits + $client_cipher_name = get_cipher_name + $client_cipher_protocol = get_cipher_protocol + EM.stop_event_loop + end + end + + def test_ssl_methods + omit_unless(EM.ssl?) + omit_if(rbx?) + $server_called_back, $client_called_back = false, false + $server_cert_value, $client_cert_value = nil, nil + $server_cipher_bits, $client_cipher_bits = nil, nil + $server_cipher_name, $client_cipher_name = nil, nil + $server_cipher_protocol, $client_cipher_protocol = nil, nil + + EM.run { + EM.start_server("127.0.0.1", 9999, ServerHandler) + EM.connect("127.0.0.1", 9999, ClientHandler) + } + + assert($server_called_back) + assert($client_called_back) + + assert($server_cert_value.is_a?(NilClass)) + assert($client_cert_value.is_a?(String)) + + assert($client_cipher_bits > 0) + assert_equal($client_cipher_bits, $server_cipher_bits) + + assert($client_cipher_name.length > 0) + assert_match(/AES/, $client_cipher_name) + assert_equal($client_cipher_name, $server_cipher_name) + + assert_match(/TLS/, $client_cipher_protocol) + assert_equal($client_cipher_protocol, $server_cipher_protocol) + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_protocols.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_protocols.rb new file mode 100644 index 000000000000..bcb68246178d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_protocols.rb @@ -0,0 +1,246 @@ +require 'em_test_helper' + +require 'socket' +require 'openssl' + +if EM.ssl? + class TestSslProtocols < Test::Unit::TestCase + + module Client + def ssl_handshake_completed + $client_handshake_completed = true + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module Server + def ssl_handshake_completed + $server_handshake_completed = true + end + end + + module ClientAny + include Client + def post_init + start_tls(:ssl_version => %w(sslv2 sslv3 tlsv1 tlsv1_1 tlsv1_2)) + end + end + + module ClientDefault + include Client + def post_init + start_tls + end + end + + module ClientSSLv3 + include Client + def post_init + start_tls(:ssl_version => %w(SSLv3)) + end + end + + module ServerSSLv3 + include Server + def post_init + start_tls(:ssl_version => %w(SSLv3)) + end + end + + module ServerTLSv1CaseInsensitive + include Server + def post_init + start_tls(:ssl_version => %w(tlsv1)) + end + end + + module ServerAny + include Server + def post_init + start_tls(:ssl_version => %w(sslv2 sslv3 tlsv1 tlsv1_1 tlsv1_2)) + end + end + + module ServerDefault + include Server + def post_init + start_tls + end + end + + module InvalidProtocol + include Client + def post_init + start_tls(:ssl_version => %w(tlsv1 badinput)) + end + end + + def test_invalid_ssl_version + assert_raises(RuntimeError, "Unrecognized SSL/TLS Version: badinput") do + EM.run do + EM.start_server("127.0.0.1", 16784, InvalidProtocol) + EM.connect("127.0.0.1", 16784, InvalidProtocol) + end + end + end + + def test_any_to_v3 + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerSSLv3) + EM.connect("127.0.0.1", 16784, ClientAny) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_case_insensitivity + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerTLSv1CaseInsensitive) + EM.connect("127.0.0.1", 16784, ClientAny) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_v3_to_any + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerAny) + EM.connect("127.0.0.1", 16784, ClientSSLv3) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_v3_to_v3 + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerSSLv3) + EM.connect("127.0.0.1", 16784, ClientSSLv3) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_any_to_any + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerAny) + EM.connect("127.0.0.1", 16784, ClientAny) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_default_to_default + $client_handshake_completed, $server_handshake_completed = false, false + EM.run do + EM.start_server("127.0.0.1", 16784, ServerDefault) + EM.connect("127.0.0.1", 16784, ClientDefault) + end + + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + module ServerV3StopAfterHandshake + def post_init + start_tls(:ssl_version => %w(SSLv3)) + end + + def ssl_handshake_completed + $server_handshake_completed = true + EM.stop_event_loop + end + end + + module ServerTLSv1StopAfterHandshake + def post_init + start_tls(:ssl_version => %w(TLSv1)) + end + + def ssl_handshake_completed + $server_handshake_completed = true + EM.stop_event_loop + end + end + + def test_v3_with_external_client + $server_handshake_completed = false + EM.run do + setup_timeout(2) + EM.start_server("127.0.0.1", 16784, ServerV3StopAfterHandshake) + EM.defer do + sock = TCPSocket.new("127.0.0.1", 16784) + ctx = OpenSSL::SSL::SSLContext.new + ctx.ssl_version = :SSLv3_client + ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx) + ssl.connect + ssl.close rescue nil + sock.close rescue nil + end + end + + assert($server_handshake_completed) + end + + def test_tlsv1_with_external_client + $server_handshake_completed = false + EM.run do + setup_timeout(2) + EM.start_server("127.0.0.1", 16784, ServerTLSv1StopAfterHandshake) + EM.defer do + sock = TCPSocket.new("127.0.0.1", 16784) + ctx = OpenSSL::SSL::SSLContext.new + ctx.ssl_version = :TLSv1_client + ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx) + ssl.connect + ssl.close rescue nil + sock.close rescue nil + end + end + + assert($server_handshake_completed) + end + + def test_tlsv1_required_with_external_client + $server_handshake_completed = false + + EM.run do + n = 0 + EM.add_periodic_timer(0.5) do + n += 1 + (EM.stop rescue nil) if n == 2 + end + EM.start_server("127.0.0.1", 16784, ServerTLSv1StopAfterHandshake) + EM.defer do + sock = TCPSocket.new("127.0.0.1", 16784) + ctx = OpenSSL::SSL::SSLContext.new + ctx.ssl_version = :SSLv3_client + ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx) + assert_raise OpenSSL::SSL::SSLError do + ssl.connect + end + ssl.close rescue nil + sock.close rescue nil + EM.stop rescue nil + end + end + + assert(!$server_handshake_completed) + end + end +else + warn "EM built without SSL support, skipping tests in #{__FILE__}" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_verify.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_verify.rb new file mode 100644 index 000000000000..a6d8fca77e0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ssl_verify.rb @@ -0,0 +1,128 @@ +require 'em_test_helper' + +class TestSslVerify < Test::Unit::TestCase + def setup + $dir = File.dirname(File.expand_path(__FILE__)) + '/' + $cert_from_file = File.read($dir+'client.crt') + end + + module ClientNoCert + def connection_completed + start_tls() + end + + def ssl_handshake_completed + $client_handshake_completed = true + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module Client + def connection_completed + start_tls(:private_key_file => $dir+'client.key', :cert_chain_file => $dir+'client.crt') + end + + def ssl_handshake_completed + $client_handshake_completed = true + close_connection + end + + def unbind + EM.stop_event_loop + end + end + + module AcceptServer + def post_init + start_tls(:verify_peer => true) + end + + def ssl_verify_peer(cert) + $cert_from_server = cert + true + end + + def ssl_handshake_completed + $server_handshake_completed = true + end + end + + module DenyServer + def post_init + start_tls(:verify_peer => true) + end + + def ssl_verify_peer(cert) + $cert_from_server = cert + # Do not accept the peer. This should now cause the connection to shut down without the SSL handshake being completed. + false + end + + def ssl_handshake_completed + $server_handshake_completed = true + end + end + + module FailServerNoPeerCert + def post_init + start_tls(:verify_peer => true, :fail_if_no_peer_cert => true) + end + + def ssl_verify_peer(cert) + raise "Verify peer should not get called for a client without a certificate" + end + + def ssl_handshake_completed + $server_handshake_completed = true + end + end + + def test_fail_no_peer_cert + omit_unless(EM.ssl?) + omit_if(rbx?) + + $client_handshake_completed, $server_handshake_completed = false, false + + EM.run { + EM.start_server("127.0.0.1", 16784, FailServerNoPeerCert) + EM.connect("127.0.0.1", 16784, ClientNoCert) + } + + assert(!$client_handshake_completed) + assert(!$server_handshake_completed) + end + + def test_accept_server + omit_unless(EM.ssl?) + omit_if(EM.library_type == :pure_ruby) # Server has a default cert chain + omit_if(rbx?) + $client_handshake_completed, $server_handshake_completed = false, false + EM.run { + EM.start_server("127.0.0.1", 16784, AcceptServer) + EM.connect("127.0.0.1", 16784, Client).instance_variable_get("@signature") + } + + assert_equal($cert_from_file, $cert_from_server) + assert($client_handshake_completed) + assert($server_handshake_completed) + end + + def test_deny_server + omit_unless(EM.ssl?) + omit_if(EM.library_type == :pure_ruby) # Server has a default cert chain + omit_if(rbx?) + $client_handshake_completed, $server_handshake_completed = false, false + EM.run { + EM.start_server("127.0.0.1", 16784, DenyServer) + EM.connect("127.0.0.1", 16784, Client) + } + + assert_equal($cert_from_file, $cert_from_server) + assert(!$client_handshake_completed) + assert(!$server_handshake_completed) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_stomp.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_stomp.rb new file mode 100644 index 000000000000..53c0502ab29c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_stomp.rb @@ -0,0 +1,38 @@ +require 'em_test_helper' + +class TestStomp < Test::Unit::TestCase + CONTENT_LENGTH_REGEX = /^content-length: (\d+)$/ + + def bytesize(str) + str = str.to_s + size = str.bytesize if str.respond_to?(:bytesize) # bytesize added in 1.9 + size || str.size + end + + class TStomp + include EM::P::Stomp + + def last_sent_content_length + @sent && Integer(@sent[CONTENT_LENGTH_REGEX, 1]) + end + + def send_data(string) + @sent = string + end + end + + def test_content_length_in_bytes + connection = TStomp.new + + queue = "queue" + failure_message = "header content-length is not the byte size of last sent body" + + body = "test" + connection.send queue, body + assert_equal bytesize(body), connection.last_sent_content_length, failure_message + + body = "test\u221A" + connection.send queue, body + assert_equal bytesize(body), connection.last_sent_content_length, failure_message + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_system.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_system.rb new file mode 100644 index 000000000000..fbbe2c9e84f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_system.rb @@ -0,0 +1,46 @@ +# coding: utf-8 +require 'em_test_helper' + +class TestSystem < Test::Unit::TestCase + def setup + @filename = File.expand_path("../я манал dump.txt", __FILE__) + @test_data = 'a' * 100 + File.open(@filename, 'w'){|f| f.write(@test_data)} + end + + def test_system + omit_if(windows?) + + result = nil + status = nil + EM.run { + EM.system('cat', @filename){|out, state| + result = out + status = state.exitstatus + EM.stop + } + } + assert_equal(0, status) + assert_equal(@test_data, result) + end + + def test_system_with_string + omit_if(windows?) + + result = nil + status = nil + EM.run { + EM.system("cat '#@filename'"){|out, state| + result = out + status = state.exitstatus + EM.stop + } + } + assert_equal(0, status) + assert_equal(@test_data, result) + end + + def teardown + File.unlink(@filename) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_threaded_resource.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_threaded_resource.rb new file mode 100644 index 000000000000..9bb39c6e0ae3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_threaded_resource.rb @@ -0,0 +1,63 @@ +require 'em_test_helper' + +class TestThreadedResource < Test::Unit::TestCase + def object + @object ||= {} + end + + def resource + @resource = EM::ThreadedResource.new do + object + end + end + + def teardown + resource.shutdown + end + + def test_dispatch_completion + EM.run do + EM.add_timer(3) do + EM.stop + fail 'Resource dispatch timed out' + end + completion = resource.dispatch do |o| + o[:foo] = :bar + :foo + end + completion.callback do |result| + assert_equal :foo, result + EM.stop + end + completion.errback do |error| + EM.stop + fail "Unexpected error: #{error.message}" + end + end + assert_equal :bar, object[:foo] + end + + def test_dispatch_failure + completion = resource.dispatch do |o| + raise 'boom' + end + completion.errback do |error| + assert_kind_of RuntimeError, error + assert_equal 'boom', error.message + end + end + + def test_dispatch_threading + main = Thread.current + resource.dispatch do |o| + o[:dispatch_thread] = Thread.current + end + assert_not_equal main, object[:dispatch_thread] + end + + def test_shutdown + # This test should get improved sometime. The method returning thread is + # NOT an api that will be maintained. + assert !resource.shutdown.alive? + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_tick_loop.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_tick_loop.rb new file mode 100644 index 000000000000..39d86b54d864 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_tick_loop.rb @@ -0,0 +1,59 @@ +require "test/unit" +require 'em_test_helper' + +class TestEmTickLoop < Test::Unit::TestCase + def test_em_tick_loop + i = 0 + EM.tick_loop { i += 1; EM.stop if i == 10 } + EM.run { EM.add_timer(1) { EM.stop } } + assert_equal i, 10 + end + + def test_tick_loop_on_stop + t = nil + tick_loop = EM.tick_loop { :stop } + tick_loop.on_stop { t = true } + EM.run { EM.next_tick { EM.stop } } + assert t + end + + def test_start_twice + i = 0 + s = 0 + tick_loop = EM.tick_loop { i += 1; :stop } + tick_loop.on_stop { s += 1; EM.stop } + EM.run { EM.next_tick { EM.stop } } + assert_equal 1, i + assert_equal 1, s + tick_loop.start + EM.run { EM.next_tick { EM.stop } } + assert_equal 2, i + assert_equal 1, s # stop callbacks are only called once + end + + def test_stop + i, s = 0, 0 + tick_loop = EM.tick_loop { i += 1 } + tick_loop.on_stop { s += 1 } + EM.run { EM.next_tick { tick_loop.stop; EM.next_tick { EM.stop } } } + assert tick_loop.stopped? + assert_equal 1, i + assert_equal 1, s + end + + def test_immediate_stops + s = 0 + tick_loop = EM::TickLoop.new { } + tick_loop.on_stop { s += 1 } + tick_loop.on_stop { s += 1 } + assert_equal 2, s + end + + def test_stopped + tick_loop = EM::TickLoop.new { } + assert tick_loop.stopped? + tick_loop.start + assert !tick_loop.stopped? + end + +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_timers.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_timers.rb new file mode 100644 index 000000000000..88b3b781d3e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_timers.rb @@ -0,0 +1,130 @@ +require 'em_test_helper' + +class TestTimers < Test::Unit::TestCase + + def test_timer_with_block + x = false + EM.run { + EM::Timer.new(0) { + x = true + EM.stop + } + } + assert x + end + + def test_timer_with_proc + x = false + EM.run { + EM::Timer.new(0, proc { + x = true + EM.stop + }) + } + assert x + end + + def test_timer_cancel + assert_nothing_raised do + EM.run { + timer = EM::Timer.new(0.01) { flunk "Timer was not cancelled." } + timer.cancel + + EM.add_timer(0.02) { EM.stop } + } + end + end + + def test_periodic_timer + x = 0 + EM.run { + EM::PeriodicTimer.new(0.01) do + x += 1 + EM.stop if x == 4 + end + } + + assert_equal 4, x + end + + def test_add_periodic_timer + x = 0 + EM.run { + t = EM.add_periodic_timer(0.01) do + x += 1 + EM.stop if x == 4 + end + assert t.respond_to?(:cancel) + } + assert_equal 4, x + end + + def test_periodic_timer_cancel + x = 0 + EM.run { + pt = EM::PeriodicTimer.new(0.01) { x += 1 } + pt.cancel + EM::Timer.new(0.02) { EM.stop } + } + assert_equal 0, x + end + + def test_add_periodic_timer_cancel + x = 0 + EM.run { + pt = EM.add_periodic_timer(0.01) { x += 1 } + EM.cancel_timer(pt) + EM.add_timer(0.02) { EM.stop } + } + assert_equal 0, x + end + + def test_periodic_timer_self_cancel + x = 0 + EM.run { + pt = EM::PeriodicTimer.new(0) { + x += 1 + if x == 4 + pt.cancel + EM.stop + end + } + } + assert_equal 4, x + end + + def test_oneshot_timer_large_future_value + large_value = 11948602000 + EM.run { + EM.add_timer(large_value) { EM.stop } + EM.add_timer(0.02) { EM.stop } + } + end + + # This test is only applicable to compiled versions of the reactor. + # Pure ruby and java versions have no built-in limit on the number of outstanding timers. + unless [:pure_ruby, :java].include? EM.library_type + def test_timer_change_max_outstanding + defaults = EM.get_max_timers + EM.set_max_timers(100) + + one_hundred_one_timers = lambda do + 101.times { EM.add_timer(0.01) {} } + EM.stop + end + + assert_raises(RuntimeError) do + EM.run( &one_hundred_one_timers ) + end + + EM.set_max_timers( 101 ) + + assert_nothing_raised do + EM.run( &one_hundred_one_timers ) + end + ensure + EM.set_max_timers(defaults) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ud.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ud.rb new file mode 100644 index 000000000000..3559756e239e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_ud.rb @@ -0,0 +1,8 @@ +require 'em_test_helper' + +class TestUserDefinedEvents < Test::Unit::TestCase + + def test_a + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_unbind_reason.rb b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_unbind_reason.rb new file mode 100644 index 000000000000..ff9193e01a42 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/eventmachine-1.2.7/tests/test_unbind_reason.rb @@ -0,0 +1,40 @@ +require 'em_test_helper' + +class TestUnbindReason < Test::Unit::TestCase + + class StubConnection < EM::Connection + attr_reader :error + def unbind(reason = nil) + @error = reason + EM.stop + end + end + + # RFC 5737 Address Blocks Reserved for Documentation + def test_connect_timeout + conn = nil + EM.run do + conn = EM.connect '192.0.2.0', 80, StubConnection + conn.pending_connect_timeout = 1 + end + assert_equal Errno::ETIMEDOUT, conn.error + end + + def test_connect_refused + pend('FIXME: this test is broken on Windows') if windows? + conn = nil + EM.run do + conn = EM.connect '127.0.0.1', 12388, StubConnection + end + assert_equal Errno::ECONNREFUSED, conn.error + end + + def test_optional_argument + pend('FIXME: this test is broken on Windows') if windows? + conn = nil + EM.run do + conn = EM.connect '127.0.0.1', 12388, StubConnection + end + assert_equal Errno::ECONNREFUSED, conn.error + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/MIT-LICENSE b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/MIT-LICENSE new file mode 100644 index 000000000000..02ba9c5388c5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/MIT-LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2015-2016 Sam Stephenson +Copyright (c) 2015-2016 Josh Peek + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/README.md b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/README.md new file mode 100644 index 000000000000..df43eb90991c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/README.md @@ -0,0 +1,85 @@ +ExecJS +====== + +ExecJS lets you run JavaScript code from Ruby. It automatically picks +the best runtime available to evaluate your JavaScript program, then +returns the result to you as a Ruby object. + +ExecJS supports these runtimes: + +* [therubyracer](https://github.com/cowboyd/therubyracer) - Google V8 + embedded within Ruby +* [therubyrhino](https://github.com/cowboyd/therubyrhino) - Mozilla + Rhino embedded within JRuby +* [Duktape.rb](https://github.com/judofyr/duktape.rb) - Duktape JavaScript interpreter +* [Node.js](http://nodejs.org/) +* Apple JavaScriptCore - Included with Mac OS X +* [Microsoft Windows Script Host](http://msdn.microsoft.com/en-us/library/9bbdkx3k.aspx) (JScript) +* [Google V8](http://code.google.com/p/v8/) +* [mini_racer](https://github.com/discourse/mini_racer) - Google V8 + embedded within Ruby + +A short example: + +``` ruby +require "execjs" +ExecJS.eval "'red yellow blue'.split(' ')" +# => ["red", "yellow", "blue"] +``` + +A longer example, demonstrating how to invoke the CoffeeScript compiler: + +``` ruby +require "execjs" +require "open-uri" +source = open("http://coffeescript.org/extras/coffee-script.js").read + +context = ExecJS.compile(source) +context.call("CoffeeScript.compile", "square = (x) -> x * x", bare: true) +# => "var square;\nsquare = function(x) {\n return x * x;\n};" +``` + +# Installation + +``` +$ gem install execjs +``` + +# FAQ + +**Why can't I use CommonJS `require()` inside ExecJS?** + +ExecJS provides a lowest common denominator interface to any JavaScript runtime. +Use ExecJS when it doesn't matter which JavaScript interpreter your code runs +in. If you want to access the Node API, you should check another library like +[commonjs.rb](https://github.com/cowboyd/commonjs.rb) designed to provide a +consistent interface. + +**Why can't I use `setTimeout`?** + +For similar reasons as modules, not all runtimes guarantee a full JavaScript +event loop. So `setTimeout`, `setInterval` and other timers are not defined. + +**Why can't I use ES5 features?** + +Some runtimes like Node will implement many of the latest ES5 features. However +older stock runtimes like JSC on OSX and JScript on Windows may not. You should +only count on ES3 features being available. Prefer feature checking these APIs +rather than hard coding support for specific runtimes. + +**Can ExecJS be used to sandbox scripts?** + +No, ExecJS shouldn't be used for any security related sandboxing. Since runtimes +are automatically detected, each runtime has different sandboxing properties. +You shouldn't use `ExecJS.eval` on any inputs you wouldn't feel comfortable Ruby +`eval()`ing. + +## Contributing to ExecJS + +ExecJS is work of hundreds of contributors. You're encouraged to submit pull requests, propose +features and discuss issues. + +See [CONTRIBUTING](CONTRIBUTING.md). + +## License +ExecJS is released under the [MIT License](MIT-LICENSE). diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs.rb new file mode 100644 index 000000000000..e6a3d0956061 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs.rb @@ -0,0 +1,6 @@ +require "execjs/module" +require "execjs/runtimes" + +module ExecJS + self.runtime ||= Runtimes.autodetect +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/disabled_runtime.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/disabled_runtime.rb new file mode 100644 index 000000000000..86e6a6cb8642 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/disabled_runtime.rb @@ -0,0 +1,29 @@ +require "execjs/runtime" + +module ExecJS + class DisabledRuntime < Runtime + def name + "Disabled" + end + + def exec(source, options = {}) + raise Error, "ExecJS disabled" + end + + def eval(source, options = {}) + raise Error, "ExecJS disabled" + end + + def compile(source, options = {}) + raise Error, "ExecJS disabled" + end + + def deprecated? + true + end + + def available? + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/duktape_runtime.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/duktape_runtime.rb new file mode 100644 index 000000000000..8ae42a58e518 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/duktape_runtime.rb @@ -0,0 +1,68 @@ +require "execjs/runtime" +require "json" + +module ExecJS + class DuktapeRuntime < Runtime + class Context < Runtime::Context + def initialize(runtime, source = "", options = {}) + @ctx = Duktape::Context.new(complex_object: nil) + @ctx.exec_string(encode(source), '(execjs)') + rescue Exception => e + raise wrap_error(e) + end + + def exec(source, options = {}) + return unless /\S/ =~ source + @ctx.eval_string("(function(){#{encode(source)}})()", '(execjs)') + rescue Exception => e + raise wrap_error(e) + end + + def eval(source, options = {}) + return unless /\S/ =~ source + @ctx.eval_string("(#{encode(source)})", '(execjs)') + rescue Exception => e + raise wrap_error(e) + end + + def call(identifier, *args) + @ctx.call_prop(identifier.split("."), *args) + rescue Exception => e + raise wrap_error(e) + end + + private + def wrap_error(e) + klass = case e + when Duktape::SyntaxError + RuntimeError + when Duktape::Error + ProgramError + when Duktape::InternalError + RuntimeError + end + + if klass + re = / \(line (\d+)\)$/ + lineno = e.message[re, 1] || 1 + error = klass.new(e.message.sub(re, "")) + error.set_backtrace(["(execjs):#{lineno}"] + e.backtrace) + error + else + e + end + end + end + + def name + "Duktape" + end + + def available? + require "duktape" + true + rescue LoadError + false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/encoding.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/encoding.rb new file mode 100644 index 000000000000..406fb0d919a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/encoding.rb @@ -0,0 +1,26 @@ +module ExecJS + # Encodes strings as UTF-8 + module Encoding + if RUBY_ENGINE == 'jruby' || RUBY_ENGINE == 'rbx' + # workaround for jruby bug http://jira.codehaus.org/browse/JRUBY-6588 + # workaround for rbx bug https://github.com/rubinius/rubinius/issues/1729 + def encode(string) + if string.encoding.name == 'ASCII-8BIT' + data = string.dup + data.force_encoding('UTF-8') + + unless data.valid_encoding? + raise ::Encoding::UndefinedConversionError, "Could not encode ASCII-8BIT data #{string.dump} as UTF-8" + end + else + data = string.encode('UTF-8') + end + data + end + else + def encode(string) + string.encode('UTF-8') + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/external_runtime.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/external_runtime.rb new file mode 100644 index 000000000000..9a4b4939c5a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/external_runtime.rb @@ -0,0 +1,246 @@ +require "tmpdir" +require "execjs/runtime" + +module ExecJS + class ExternalRuntime < Runtime + class Context < Runtime::Context + def initialize(runtime, source = "", options = {}) + source = encode(source) + + @runtime = runtime + @source = source + + # Test compile context source + exec("") + end + + def eval(source, options = {}) + source = encode(source) + + if /\S/ =~ source + exec("return eval(#{::JSON.generate("(#{source})", quirks_mode: true)})") + end + end + + def exec(source, options = {}) + source = encode(source) + source = "#{@source}\n#{source}" if @source != "" + source = @runtime.compile_source(source) + + tmpfile = write_to_tempfile(source) + + if ExecJS.cygwin? + filepath = `cygpath -m #{tmpfile.path}`.rstrip + else + filepath = tmpfile.path + end + + begin + extract_result(@runtime.exec_runtime(filepath), filepath) + ensure + File.unlink(tmpfile) + end + end + + def call(identifier, *args) + eval "#{identifier}.apply(this, #{::JSON.generate(args)})" + end + + protected + # See Tempfile.create on Ruby 2.1 + def create_tempfile(basename) + tmpfile = nil + Dir::Tmpname.create(basename) do |tmpname| + mode = File::WRONLY | File::CREAT | File::EXCL + tmpfile = File.open(tmpname, mode, 0600) + end + tmpfile + end + + def write_to_tempfile(contents) + tmpfile = create_tempfile(['execjs', 'js']) + tmpfile.write(contents) + tmpfile.close + tmpfile + end + + def extract_result(output, filename) + status, value, stack = output.empty? ? [] : ::JSON.parse(output, create_additions: false) + if status == "ok" + value + else + stack ||= "" + real_filename = File.realpath(filename) + stack = stack.split("\n").map do |line| + line.sub(" at ", "") + .sub(real_filename, "(execjs)") + .sub(filename, "(execjs)") + .strip + end + stack.reject! { |line| ["eval code", "eval@[native code]"].include?(line) } + stack.shift unless stack[0].to_s.include?("(execjs)") + error_class = value =~ /SyntaxError:/ ? RuntimeError : ProgramError + error = error_class.new(value) + error.set_backtrace(stack + caller) + raise error + end + end + end + + attr_reader :name + + def initialize(options) + @name = options[:name] + @command = options[:command] + @runner_path = options[:runner_path] + @encoding = options[:encoding] + @deprecated = !!options[:deprecated] + @binary = nil + + @popen_options = {} + @popen_options[:external_encoding] = @encoding if @encoding + @popen_options[:internal_encoding] = ::Encoding.default_internal || 'UTF-8' + + if @runner_path + instance_eval generate_compile_method(@runner_path) + end + end + + def available? + require 'json' + binary ? true : false + end + + def deprecated? + @deprecated + end + + private + def binary + @binary ||= which(@command) + end + + def locate_executable(command) + commands = Array(command) + if ExecJS.windows? && File.extname(command) == "" + ENV['PATHEXT'].split(File::PATH_SEPARATOR).each { |p| + commands << (command + p) + } + end + + commands.find { |cmd| + if File.executable? cmd + cmd + else + path = ENV['PATH'].split(File::PATH_SEPARATOR).find { |p| + full_path = File.join(p, cmd) + File.executable?(full_path) && File.file?(full_path) + } + path && File.expand_path(cmd, path) + end + } + end + + protected + def generate_compile_method(path) + <<-RUBY + def compile_source(source) + <<-RUNNER + #{IO.read(path)} + RUNNER + end + RUBY + end + + def json2_source + @json2_source ||= IO.read(ExecJS.root + "/support/json2.js") + end + + def encode_source(source) + encoded_source = encode_unicode_codepoints(source) + ::JSON.generate("(function(){ #{encoded_source} })()", quirks_mode: true) + end + + def encode_unicode_codepoints(str) + str.gsub(/[\u0080-\uffff]/) do |ch| + "\\u%04x" % ch.codepoints.to_a + end + end + + if ExecJS.windows? + def exec_runtime(filename) + path = Dir::Tmpname.create(['execjs', 'json']) {} + begin + command = binary.split(" ") << filename + `#{shell_escape(*command)} 2>&1 > #{path}` + output = File.open(path, 'rb', @popen_options) { |f| f.read } + ensure + File.unlink(path) if path + end + + if $?.success? + output + else + raise exec_runtime_error(output) + end + end + + def shell_escape(*args) + # see http://technet.microsoft.com/en-us/library/cc723564.aspx#XSLTsection123121120120 + args.map { |arg| + arg = %Q("#{arg.gsub('"','""')}") if arg.match(/[&|()<>^ "]/) + arg + }.join(" ") + end + elsif RUBY_ENGINE == 'jruby' + require 'shellwords' + + def exec_runtime(filename) + command = "#{Shellwords.join(binary.split(' ') << filename)} 2>&1" + io = IO.popen(command, @popen_options) + output = io.read + io.close + + if $?.success? + output + else + raise exec_runtime_error(output) + end + end + else + def exec_runtime(filename) + io = IO.popen(binary.split(' ') << filename, @popen_options.merge({err: [:child, :out]})) + output = io.read + io.close + + if $?.success? + output + else + raise exec_runtime_error(output) + end + end + end + # Internally exposed for Context. + public :exec_runtime + + def exec_runtime_error(output) + error = RuntimeError.new(output) + lines = output.split("\n") + lineno = lines[0][/:(\d+)$/, 1] if lines[0] + lineno ||= 1 + error.set_backtrace(["(execjs):#{lineno}"] + caller) + error + end + + def which(command) + Array(command).find do |name| + name, args = name.split(/\s+/, 2) + path = locate_executable(name) + + next unless path + + args ? "#{path} #{args}" : path + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/mini_racer_runtime.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/mini_racer_runtime.rb new file mode 100644 index 000000000000..b8a3bca99dd7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/mini_racer_runtime.rb @@ -0,0 +1,102 @@ +require "execjs/runtime" + +module ExecJS + class MiniRacerRuntime < Runtime + class Context < Runtime::Context + def initialize(runtime, source = "", options={}) + source = encode(source) + @context = ::MiniRacer::Context.new + translate do + @context.eval(source) + end + end + + def exec(source, options = {}) + source = encode(source) + + if /\S/ =~ source + eval "(function(){#{source}})()" + end + end + + def eval(source, options = {}) + source = encode(source) + + if /\S/ =~ source + translate do + @context.eval("(#{source})") + end + end + end + + def call(identifier, *args) + # TODO optimise generate + eval "#{identifier}.apply(this, #{::JSON.generate(args)})" + end + + private + + def strip_functions!(value) + if Array === value + value.map! do |v| + if MiniRacer::JavaScriptFunction === value + nil + else + strip_functions!(v) + end + end + elsif Hash === value + value.each do |k,v| + if MiniRacer::JavaScriptFunction === v + value.delete k + else + value[k] = strip_functions!(v) + end + end + value + elsif MiniRacer::JavaScriptFunction === value + nil + else + value + end + end + + def translate + begin + strip_functions! yield + rescue MiniRacer::RuntimeError => e + ex = ProgramError.new e.message + if backtrace = e.backtrace + backtrace = backtrace.map { |line| + if line =~ /JavaScript at/ + line.sub("JavaScript at ", "") + .sub("<anonymous>", "(execjs)") + .strip + else + line + end + } + ex.set_backtrace backtrace + end + raise ex + rescue MiniRacer::ParseError => e + ex = RuntimeError.new e.message + ex.set_backtrace(["(execjs):1"] + e.backtrace) + raise ex + end + end + + end + + def name + "mini_racer (V8)" + end + + def available? + require "mini_racer" + true + rescue LoadError + false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/module.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/module.rb new file mode 100644 index 000000000000..b89dc222f0b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/module.rb @@ -0,0 +1,42 @@ +require "execjs/version" +require "rbconfig" + +module ExecJS + class Error < ::StandardError; end + class RuntimeError < Error; end + class ProgramError < Error; end + class RuntimeUnavailable < RuntimeError; end + + class << self + attr_reader :runtime + + def runtime=(runtime) + raise RuntimeUnavailable, "#{runtime.name} is unavailable on this system" unless runtime.available? + @runtime = runtime + end + + def exec(source, options = {}) + runtime.exec(source, options) + end + + def eval(source, options = {}) + runtime.eval(source, options) + end + + def compile(source, options = {}) + runtime.compile(source, options) + end + + def root + @root ||= File.expand_path("..", __FILE__) + end + + def windows? + @windows ||= RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ + end + + def cygwin? + @cygwin ||= RbConfig::CONFIG["host_os"] =~ /cygwin/ + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/ruby_racer_runtime.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/ruby_racer_runtime.rb new file mode 100644 index 000000000000..cf8e1a28552b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/ruby_racer_runtime.rb @@ -0,0 +1,114 @@ +require "execjs/runtime" + +module ExecJS + class RubyRacerRuntime < Runtime + class Context < Runtime::Context + def initialize(runtime, source = "", options = {}) + source = encode(source) + + lock do + @v8_context = ::V8::Context.new + + begin + @v8_context.eval(source) + rescue ::V8::JSError => e + raise wrap_error(e) + end + end + end + + def exec(source, options = {}) + source = encode(source) + + if /\S/ =~ source + eval "(function(){#{source}})()", options + end + end + + def eval(source, options = {}) + source = encode(source) + + if /\S/ =~ source + lock do + begin + unbox @v8_context.eval("(#{source})") + rescue ::V8::JSError => e + raise wrap_error(e) + end + end + end + end + + def call(properties, *args) + lock do + begin + unbox @v8_context.eval(properties).call(*args) + rescue ::V8::JSError => e + raise wrap_error(e) + end + end + end + + def unbox(value) + case value + when ::V8::Function + nil + when ::V8::Array + value.map { |v| unbox(v) } + when ::V8::Object + value.inject({}) do |vs, (k, v)| + vs[k] = unbox(v) unless v.is_a?(::V8::Function) + vs + end + when String + value.force_encoding('UTF-8') + else + value + end + end + + private + def lock + result, exception = nil, nil + V8::C::Locker() do + begin + result = yield + rescue Exception => e + exception = e + end + end + + if exception + raise exception + else + result + end + end + + def wrap_error(e) + error_class = e.value["name"] == "SyntaxError" ? RuntimeError : ProgramError + + stack = e.value["stack"] || "" + stack = stack.split("\n") + stack.shift + stack = [e.message[/<eval>:\d+:\d+/, 0]].compact if stack.empty? + stack = stack.map { |line| line.sub(" at ", "").sub("<eval>", "(execjs)").strip } + + error = error_class.new(e.value.to_s) + error.set_backtrace(stack + caller) + error + end + end + + def name + "therubyracer (V8)" + end + + def available? + require "v8" + true + rescue LoadError + false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/ruby_rhino_runtime.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/ruby_rhino_runtime.rb new file mode 100644 index 000000000000..684d6cc7b86a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/ruby_rhino_runtime.rb @@ -0,0 +1,97 @@ +require "execjs/runtime" + +module ExecJS + class RubyRhinoRuntime < Runtime + class Context < Runtime::Context + def initialize(runtime, source = "", options = {}) + source = encode(source) + + @rhino_context = ::Rhino::Context.new + fix_memory_limit! @rhino_context + @rhino_context.eval(source) + rescue Exception => e + raise wrap_error(e) + end + + def exec(source, options = {}) + source = encode(source) + + if /\S/ =~ source + eval "(function(){#{source}})()", options + end + end + + def eval(source, options = {}) + source = encode(source) + + if /\S/ =~ source + unbox @rhino_context.eval("(#{source})") + end + rescue Exception => e + raise wrap_error(e) + end + + def call(properties, *args) + unbox @rhino_context.eval(properties).call(*args) + rescue Exception => e + raise wrap_error(e) + end + + def unbox(value) + case value = ::Rhino::to_ruby(value) + when Java::OrgMozillaJavascript::NativeFunction + nil + when Java::OrgMozillaJavascript::NativeObject + value.inject({}) do |vs, (k, v)| + case v + when Java::OrgMozillaJavascript::NativeFunction, ::Rhino::JS::Function + nil + else + vs[k] = unbox(v) + end + vs + end + when Array + value.map { |v| unbox(v) } + else + value + end + end + + def wrap_error(e) + return e unless e.is_a?(::Rhino::JSError) + + error_class = e.message == "syntax error" ? RuntimeError : ProgramError + + stack = e.backtrace + stack = stack.map { |line| line.sub(" at ", "").sub("<eval>", "(execjs)").strip } + stack.unshift("(execjs):1") if e.javascript_backtrace.empty? + + error = error_class.new(e.value.to_s) + error.set_backtrace(stack) + error + end + + private + # Disables bytecode compiling which limits you to 64K scripts + def fix_memory_limit!(context) + if context.respond_to?(:optimization_level=) + context.optimization_level = -1 + else + context.instance_eval { @native.setOptimizationLevel(-1) } + end + end + end + + def name + "therubyrhino (Rhino)" + end + + def available? + require "rhino" + true + rescue LoadError + false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/runtime.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/runtime.rb new file mode 100644 index 000000000000..eba424ca7c4a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/runtime.rb @@ -0,0 +1,69 @@ +require "execjs/encoding" + +module ExecJS + # Abstract base class for runtimes + class Runtime + class Context + include Encoding + + def initialize(runtime, source = "", options = {}) + end + + def exec(source, options = {}) + raise NotImplementedError + end + + def eval(source, options = {}) + raise NotImplementedError + end + + def call(properties, *args) + raise NotImplementedError + end + end + + def name + raise NotImplementedError + end + + def context_class + self.class::Context + end + + def exec(source, options = {}) + context = compile("", options) + + if context.method(:exec).arity == 1 + context.exec(source) + else + context.exec(source, options) + end + end + + def eval(source, options = {}) + context = compile("", options) + + if context.method(:eval).arity == 1 + context.eval(source) + else + context.eval(source, options) + end + end + + def compile(source, options = {}) + if context_class.instance_method(:initialize).arity == 2 + context_class.new(self, source) + else + context_class.new(self, source, options) + end + end + + def deprecated? + false + end + + def available? + raise NotImplementedError + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/runtimes.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/runtimes.rb new file mode 100644 index 000000000000..52dc3c99332f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/runtimes.rb @@ -0,0 +1,98 @@ +require "execjs/module" +require "execjs/disabled_runtime" +require "execjs/duktape_runtime" +require "execjs/external_runtime" +require "execjs/ruby_racer_runtime" +require "execjs/ruby_rhino_runtime" +require "execjs/mini_racer_runtime" + +module ExecJS + module Runtimes + Disabled = DisabledRuntime.new + + Duktape = DuktapeRuntime.new + + RubyRacer = RubyRacerRuntime.new + + RubyRhino = RubyRhinoRuntime.new + + MiniRacer = MiniRacerRuntime.new + + Node = ExternalRuntime.new( + name: "Node.js (V8)", + command: ["nodejs", "node"], + runner_path: ExecJS.root + "/support/node_runner.js", + encoding: 'UTF-8' + ) + + JavaScriptCore = ExternalRuntime.new( + name: "JavaScriptCore", + command: "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc", + runner_path: ExecJS.root + "/support/jsc_runner.js" + ) + + SpiderMonkey = Spidermonkey = ExternalRuntime.new( + name: "SpiderMonkey", + command: "js", + runner_path: ExecJS.root + "/support/spidermonkey_runner.js", + deprecated: true + ) + + JScript = ExternalRuntime.new( + name: "JScript", + command: "cscript //E:jscript //Nologo //U", + runner_path: ExecJS.root + "/support/jscript_runner.js", + encoding: 'UTF-16LE' # CScript with //U returns UTF-16LE + ) + + V8 = ExternalRuntime.new( + name: "V8", + command: "d8", + runner_path: ExecJS.root + "/support/v8_runner.js", + encoding: 'UTF-8' + ) + + + def self.autodetect + from_environment || best_available || + raise(RuntimeUnavailable, "Could not find a JavaScript runtime. " + + "See https://github.com/rails/execjs for a list of available runtimes.") + end + + def self.best_available + runtimes.reject(&:deprecated?).find(&:available?) + end + + def self.from_environment + if name = ENV["EXECJS_RUNTIME"] + raise RuntimeUnavailable, "#{name} runtime is not defined" unless const_defined?(name) + runtime = const_get(name) + + raise RuntimeUnavailable, "#{runtime.name} runtime is not available on this system" unless runtime.available? + runtime + end + end + + def self.names + @names ||= constants.inject({}) { |h, name| h.merge(const_get(name) => name) }.values + end + + def self.runtimes + @runtimes ||= [ + RubyRacer, + RubyRhino, + Duktape, + MiniRacer, + Node, + JavaScriptCore, + SpiderMonkey, + JScript, + V8 + ] + end + end + + def self.runtimes + Runtimes.runtimes + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/jsc_runner.js b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/jsc_runner.js new file mode 100644 index 000000000000..c57a9445fd39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/jsc_runner.js @@ -0,0 +1,18 @@ +(function(program, execJS) { execJS(program) })(function() { #{source} +}, function(program) { + var output; + try { + result = program(); + if (typeof result == 'undefined' && result !== null) { + print('["ok"]'); + } else { + try { + print(JSON.stringify(['ok', result])); + } catch (err) { + print(JSON.stringify(['err', '' + err, err.stack])); + } + } + } catch (err) { + print(JSON.stringify(['err', '' + err, err.stack])); + } +}); diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/jscript_runner.js b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/jscript_runner.js new file mode 100644 index 000000000000..fc92b4a60b4e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/jscript_runner.js @@ -0,0 +1,22 @@ +(function(program, execJS) { execJS(program) })(function() { + return eval(#{encode_source(source)}); +}, function(program) { + #{json2_source} + var output, print = function(string) { + WScript.Echo(string); + }; + try { + result = program(); + if (typeof result == 'undefined' && result !== null) { + print('["ok"]'); + } else { + try { + print(JSON.stringify(['ok', result])); + } catch (err) { + print(JSON.stringify(['err', err.name + ': ' + err.message, err.stack])); + } + } + } catch (err) { + print(JSON.stringify(['err', err.name + ': ' + err.message, err.stack])); + } +}); diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/json2.js b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/json2.js new file mode 100644 index 000000000000..fb8fe0a9ec2f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/json2.js @@ -0,0 +1,481 @@ +/* + http://www.JSON.org/json2.js + 2011-01-18 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or '&nbsp;'), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the value + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. +*/ + +/*jslint evil: true, strict: false, regexp: false */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +(function (global) { + if (!global.JSON) { + global.JSON = {}; + } + + var JSON = global.JSON; + + "use strict"; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function (key) { + + return isFinite(this.valueOf()) ? + this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' : null; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function (key) { + return this.valueOf(); + }; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + k = rep[i]; + if (typeof k === 'string') { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } +}(this)); diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/node_runner.js b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/node_runner.js new file mode 100644 index 000000000000..ab0c6ec5d019 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/node_runner.js @@ -0,0 +1,20 @@ +(function(program, execJS) { execJS(program) })(function(global, module, exports, require, console, setTimeout, setInterval, clearTimeout, clearInterval, setImmediate, clearImmediate) { #{source} +}, function(program) { + var output, print = function(string) { + process.stdout.write('' + string); + }; + try { + result = program(); + if (typeof result == 'undefined' && result !== null) { + print('["ok"]'); + } else { + try { + print(JSON.stringify(['ok', result])); + } catch (err) { + print(JSON.stringify(['err', '' + err, err.stack])); + } + } + } catch (err) { + print(JSON.stringify(['err', '' + err, err.stack])); + } +}); diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/spidermonkey_runner.js b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/spidermonkey_runner.js new file mode 100644 index 000000000000..c57a9445fd39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/spidermonkey_runner.js @@ -0,0 +1,18 @@ +(function(program, execJS) { execJS(program) })(function() { #{source} +}, function(program) { + var output; + try { + result = program(); + if (typeof result == 'undefined' && result !== null) { + print('["ok"]'); + } else { + try { + print(JSON.stringify(['ok', result])); + } catch (err) { + print(JSON.stringify(['err', '' + err, err.stack])); + } + } + } catch (err) { + print(JSON.stringify(['err', '' + err, err.stack])); + } +}); diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/v8_runner.js b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/v8_runner.js new file mode 100644 index 000000000000..c57a9445fd39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/support/v8_runner.js @@ -0,0 +1,18 @@ +(function(program, execJS) { execJS(program) })(function() { #{source} +}, function(program) { + var output; + try { + result = program(); + if (typeof result == 'undefined' && result !== null) { + print('["ok"]'); + } else { + try { + print(JSON.stringify(['ok', result])); + } catch (err) { + print(JSON.stringify(['err', '' + err, err.stack])); + } + } + } catch (err) { + print(JSON.stringify(['err', '' + err, err.stack])); + } +}); diff --git a/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/version.rb b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/version.rb new file mode 100644 index 000000000000..d64c72acd478 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/execjs-2.7.0/lib/execjs/version.rb @@ -0,0 +1,3 @@ +module ExecJS + VERSION = "2.7.0" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/CHANGELOG.md new file mode 100644 index 000000000000..500c5cdbcd33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/CHANGELOG.md @@ -0,0 +1,350 @@ +# Faraday Changelog + +## [v1.2.0](https://github.com/lostisland/faraday/releases/tag/v1.2.0) (2020-12-23) + +### Features + +* Introduces `on_request` and `on_complete` methods in `Faraday::Middleware`. (#1194, @iMacTia) + +### Fixes + +* Require 'date' to avoid retry exception (#1206, @rustygeldmacher) +* Fix rdebug recursion issue (#1205, @native-api) +* Update call to `em_http_ssl_patch` (#1202, @kylekeesling) +* `EmHttp` adapter: drop superfluous loaded? check (#1213, @olleolleolle) +* Avoid 1 use of keyword hackery (#1211, @grosser) +* Fix #1219 `Net::HTTP` still uses env proxy (#1221, @iMacTia) + +### Documentation + +* Add comment in gemspec to explain exposure of `examples` and `spec` folders. (#1192, @iMacTia) +* Adapters, how to create them (#1193, @olleolleolle) +* Update documentation on using the logger (#1196, @tijmenb) +* Adjust the retry documentation and spec to align with implementation (#1198, @nbeyer) + +### Misc + +* Test against ruby head (#1208, @grosser) + +## [v1.1.0](https://github.com/lostisland/faraday/releases/tag/v1.1.0) (2020-10-17) + +### Features + +* Makes parameters sorting configurable (#1162 @wishdev) +* Introduces `flat_encode` option for multipart adapter. (#1163 @iMacTia) +* Include request info in exceptions raised by RaiseError Middleware (#1181 @SandroDamilano) + +### Fixes + +* Avoid `last arg as keyword param` warning when building user middleware on Ruby 2.7 (#1153 @dgholz) +* Limits net-http-persistent version to < 4.0 (#1156 @iMacTia) +* Update `typhoeus` to new stable version (`1.4`) (#1159 @AlexWayfer) +* Properly fix test failure with Rack 2.1+. (#1171 @voxik) + +### Documentation + +* Improves documentation on how to contribute to the site by using Docker. (#1175 @iMacTia) +* Remove retry_change_requests from documentation (#1185 @stim371) + +### Misc + +* Link from GitHub Actions badge to CI workflow (#1141 @olleolleolle) +* Return tests of `Test` adapter (#1147 @AlexWayfer) +* Add 1.0 release to wording in CONTRIBUTING (#1155 @olleolleolle) +* Fix linting bumping Rubocop to 0.90.0 (#1182 @iMacTia) +* Drop `git ls-files` in gemspec (#1183 @utkarsh2102) +* Upgrade CI to ruby/setup-ruby (#1187 @gogainda) + +## [v1.0.1](https://github.com/lostisland/faraday/releases/tag/v1.0.1) (2020-03-29) + +### Fixes + +* Use Net::HTTP#start(&block) to ensure closed TCP connections (#1117) +* Fully qualify constants to be checked (#1122) +* Allows `parse` method to be private/protected in response middleware (#1123) +* Encode Spaces in Query Strings as '%20' Instead of '+' (#1125) +* Limits rack to v2.0.x (#1127) +* Adapter Registry reads also use mutex (#1136) + +### Documentation + +* Retry middleware documentation fix (#1109) +* Docs(retry): precise usage of retry-after (#1111) +* README: Link the logo to the website (#1112) +* Website: add search bar (#1116) +* Fix request/response mix-up in docs text (#1132) + +## v1.0 + +Features: + +* Add #trace support to Faraday::Connection #861 (@technoweenie) +* Add the log formatter that is easy to override and safe to inherit #889 (@prikha) +* Support standalone adapters #941 (@iMacTia) +* Introduce Faraday::ConflictError for 409 response code #979 (@lucasmoreno) +* Add support for setting `read_timeout` option separately #1003 (@springerigor) +* Refactor and cleanup timeout settings across adapters #1022 (@technoweenie) +* Create ParamPart class to allow multipart posts with JSON content and file upload at the same time #1017 (@jeremy-israel) +* Copy UploadIO const -> FilePart for consistency with ParamPart #1018, #1021 (@technoweenie) +* Implement streaming responses in the Excon adapter #1026 (@technoweenie) +* Add default implementation of `Middleware#close`. #1069 (@ioquatix) +* Add `Adapter#close` so that derived classes can call super. #1091 (@ioquatix) +* Add log_level option to logger default formatter #1079 (@amrrbakry) +* Fix empty array for FlatParamsEncoder `{key: []} -> "key="` #1084 (@mrexox) + +Bugs: + +* Explicitly require date for DateTime library in Retry middleware #844 (@nickpresta) +* Refactor Adapter as final endpoints #846 (@iMacTia) +* Separate Request and Response bodies in Faraday::Env #847 (@iMacTia) +* Implement Faraday::Connection#options to make HTTP requests with the OPTIONS verb. #857 (@technoweenie) +* Multipart: Drop Ruby 1.8 String behavior compat #892 (@olleolleolle) +* Fix Ruby warnings in Faraday::Options.memoized #962 (@technoweenie) +* Allow setting min/max SSL version for a Net::HTTP::Persistent connection #972, #973 (@bdewater, @olleolleolle) +* Fix instances of frozen empty string literals #1040 (@BobbyMcWho) +* remove temp_proxy and improve proxy tests #1063 (@technoweenie) +* improve error initializer consistency #1095 (@technoweenie) + +Misc: + +* Convert minitest suite to RSpec #832 (@iMacTia, with help from @gaynetdinov, @Insti, @technoweenie) +* Major effort to update code to RuboCop standards. #854 (@olleolleolle, @iMacTia, @technoweenie, @htwroclau, @jherdman, @Drenmi, @Insti) +* Rubocop #1044, #1047 (@BobbyMcWho, @olleolleolle) +* Documentation tweaks (@adsteel, @Hubro, @iMacTia, @olleolleolle, @technoweenie) +* Update license year #981 (@Kevin-Kawai) +* Configure Jekyll plugin jekyll-remote-theme to support Docker usage #999 (@Lewiscowles1986) +* Fix Ruby 2.7 warnings #1009 (@tenderlove) +* Cleanup adapter connections #1023 (@technoweenie) +* Describe clearing cached stubs #1045 (@viraptor) +* Add project metadata to the gemspec #1046 (@orien) + +## v0.17.3 + +Fixes: + +* Reverts changes in error classes hierarchy. #1092 (@iMacTia) +* Fix Ruby 1.9 syntax errors and improve Error class testing #1094 (@BanzaiMan, + @mrexox, @technoweenie) + +Misc: + +* Stops using `&Proc.new` for block forwarding. #1083 (@olleolleolle) +* Update CI to test against ruby 2.0-2.7 #1087, #1099 (@iMacTia, @olleolleolle, + @technoweenie) +* require FARADAY_DEPRECATE=warn to show Faraday v1.0 deprecation warnings + #1098 (@technoweenie) + +## v0.17.1 + +Final release before Faraday v1.0, with important fixes for Ruby 2.7. + +Fixes: + +* RaiseError response middleware raises exception if HTTP client returns a nil + status. #1042 (@jonnyom, @BobbyMcWho) + +Misc: + +* Fix Ruby 2.7 warnings (#1009) +* Add `Faraday::Deprecate` to warn about upcoming v1.0 changes. (#1054, #1059, + #1076, #1077) +* Add release notes up to current in CHANGELOG.md (#1066) +* Port minimal rspec suite from main branch to run backported tests. (#1058) + +## v0.17.0 + +This release is the same as v0.15.4. It was pushed to cover up releases +v0.16.0-v0.16.2. + +## v0.15.4 + +* Expose `pool_size` as a option for the NetHttpPersistent adapter (#834) + +## v0.15.3 + +* Make Faraday::Request serialisable with Marshal. (#803) +* Add DEFAULT_EXCEPTIONS constant to Request::Retry (#814) +* Add support for Ruby 2.6 Net::HTTP write_timeout (#824) + +## v0.15.2 + +* Prevents `Net::HTTP` adapters to retry request internally by setting `max_retries` to 0 if available (Ruby 2.5+). (#799) +* Fixes `NestedParamsEncoder` handling of empty array values (#801) + +## v0.15.1 + +* NetHttpPersistent adapter better reuse of SSL connections (#793) +* Refactor: inline cached_connection (#797) +* Logger middleware: use $stdout instead of STDOUT (#794) +* Fix: do not memoize/reuse Patron session (#796) + +Also in this release: + +* Allow setting min/max ssl version for Net::HTTP (#792) +* Allow setting min/max ssl version for Excon (#795) + +## v0.15.0 + +Features: + +* Added retry block option to retry middleware. (#770) +* Retry middleware improvements (honour Retry-After header, retry statuses) (#773) +* Improve response logger middleware output (#784) + +Fixes: + +* Remove unused class error (#767) +* Fix minor typo in README (#760) +* Reuse persistent connections when using net-http-persistent (#778) +* Fix Retry middleware documentation (#781) +* Returns the http response when giving up on retrying by status (#783) + +## v0.14.0 + +Features: + +* Allow overriding env proxy #754 (@iMacTia) +* Remove legacy Typhoeus adapter #715 (@olleolleolle) +* External Typhoeus Adapter Compatibility #748 (@iMacTia) +* Warn about missing adapter when making a request #743 (@antstorm) +* Faraday::Adapter::Test stubs now support entire urls (with host) #741 (@erik-escobedo) + +Fixes: + +* If proxy is manually provided, this takes priority over `find_proxy` #724 (@iMacTia) +* Fixes the behaviour for Excon's open_timeout (not setting write_timeout anymore) #731 (@apachelogger) +* Handle all connection timeout messages in Patron #687 (@stayhero) + +## v0.13.1 + +* Fixes an incompatibility with Addressable::URI being used as uri_parser + +## v0.13.0 + +Features: + +* Dynamically reloads the proxy when performing a request on an absolute domain (#701) +* Adapter support for Net::HTTP::Persistent v3.0.0 (#619) + +Fixes: + +* Prefer #hostname over #host. (#714) +* Fixes an edge-case issue with response headers parsing (missing HTTP header) (#719) + +## v0.12.2 + +* Parse headers from aggregated proxy requests/responses (#681) +* Guard against invalid middleware configuration with warning (#685) +* Do not use :insecure option by default in Patron (#691) +* Fixes an issue with HTTPClient not raising a `Faraday::ConnectionFailed` (#702) +* Fixes YAML serialization/deserialization for `Faraday::Utils::Headers` (#690) +* Fixes an issue with Options having a nil value (#694) +* Fixes an issue with Faraday.default_connection not using Faraday.default_connection_options (#698) +* Fixes an issue with Options.merge! and Faraday instrumentation middleware (#710) + +## v0.12.1 + +* Fix an issue with Patron tests failing on jruby +* Fix an issue with new `rewind_files` feature that was causing an exception when the body was not an Hash +* Expose wrapped_exception in all client errors +* Add Authentication Section to the ReadMe + +## v0.12.0.1 + +* Hotfix release to address an issue with TravisCI deploy on Rubygems + +## v0.12.0 + +Features: + +* Proxy feature now relies on Ruby `URI::Generic#find_proxy` and can use `no_proxy` ENV variable (not compatible with ruby < 2.0) +* Adds support for `context` request option to pass arbitrary information to middlewares + +Fixes: + +* Fix an issue with options that was causing new options to override defaults ones unexpectedly +* Rewind `UploadIO`s on retry to fix a compatibility issue +* Make multipart boundary unique +* Improvements in `README.md` + +## v0.11.0 + +Features: + +* Add `filter` method to Logger middleware +* Add support for Ruby2.4 and Minitest 6 +* Introduce block syntax to customise the adapter + +Fixes: + +* Fix an issue that was allowing to override `default_connection_options` from a connection instance +* Fix a bug that was causing newline escape characters ("\n") to be used when building the Authorization header + +## v0.10.1 + +- Fix an issue with HTTPClient adapter that was causing the SSL to be reset on every request +- Rescue `IOError` instead of specific subclass +- `Faraday::Utils::Headers` can now be successfully serialised in YAML +- Handle `default_connection_options` set with hash + +## v0.10.0 + +Breaking changes: +- Drop support for Ruby 1.8 + +Features: +- Include wrapped exception/reponse in ClientErrors +- Add `response.reason_phrase` +- Provide option to selectively skip logging request/response headers +- Add regex support for pattern matching in `test` adapter + +Fixes: +- Add `Faraday.respond_to?` to find methods managed by `method_missing` +- em-http: `request.host` instead of `connection.host` should be taken for SSL validations +- Allow `default_connection_options` to be merged when options are passed as url parameter +- Improve splitting key-value pairs in raw HTTP headers + +## v0.9.2 + +Adapters: +- Enable gzip compression for httpclient +- Fixes default certificate store for httpclient not having default paths. +- Make excon adapter compatible with 0.44 excon version +- Add compatibility with Patron 0.4.20 +- Determine default port numbers in Net::HTTP adapters (Addressable compatibility) +- em-http: wrap "connection closed by server" as ConnectionFailed type +- Wrap Errno::ETIMEDOUT in Faraday::Error::TimeoutError + +Utils: +- Add Rack-compatible support for parsing `a[][b]=c` nested queries +- Encode nil values in queries different than empty strings. Before: `a=`; now: `a`. +- Have `Faraday::Utils::Headers#replace` clear internal key cache +- Dup the internal key cache when a Headers hash is copied + +Env and middleware: +- Ensure `env` stored on middleware response has reference to the response +- Ensure that Response properties are initialized during `on_complete` (VCR compatibility) +- Copy request options in Faraday::Connection#dup +- Env custom members should be copied by Env.from(env) +- Honour per-request `request.options.params_encoder` +- Fix `interval_randomness` data type for Retry middleware +- Add maximum interval option for Retry middleware + +## v0.9.1 + +* Refactor Net:HTTP adapter so that with_net_http_connection can be overridden to allow pooled connections. (@Ben-M) +* Add configurable methods that bypass `retry_if` in the Retry request middleware. (@mike-bourgeous) + +## v0.9.0 + +* Add HTTPClient adapter (@hakanensari) +* Improve Retry handler (@mislav) +* Remove autoloading by default (@technoweenie) +* Improve internal docs (@technoweenie, @mislav) +* Respect user/password in http proxy string (@mislav) +* Adapter options are structs. Reinforces consistent options across adapters + (@technoweenie) +* Stop stripping trailing / off base URLs in a Faraday::Connection. (@technoweenie) +* Add a configurable URI parser. (@technoweenie) +* Remove need to manually autoload when using the authorization header helpers on `Faraday::Connection`. (@technoweenie) +* `Faraday::Adapter::Test` respects the `Faraday::RequestOptions#params_encoder` option. (@technoweenie) diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/LICENSE.md new file mode 100644 index 000000000000..faa68e6bed95 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/LICENSE.md @@ -0,0 +1,20 @@ +Copyright (c) 2009-2020 Rick Olson, Zack Hobson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/README.md b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/README.md new file mode 100644 index 000000000000..38f67bbe8c3b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/README.md @@ -0,0 +1,54 @@ +# [![Faraday](./docs/assets/img/repo-card-slim.png)][website] + +[![Gem Version](https://badge.fury.io/rb/faraday.svg)](https://rubygems.org/gems/faraday) +[![GitHub Actions CI](https://github.com/lostisland/faraday/workflows/CI/badge.svg)](https://github.com/lostisland/faraday/actions?query=workflow%3ACI) +[![Maintainability](https://api.codeclimate.com/v1/badges/f869daab091ceef1da73/maintainability)](https://codeclimate.com/github/lostisland/faraday/maintainability) +[![Gitter](https://badges.gitter.im/lostisland/faraday.svg)](https://gitter.im/lostisland/faraday?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + + +Faraday is an HTTP client library that provides a common interface over many +adapters (such as Net::HTTP) and embraces the concept of Rack middleware when +processing the request/response cycle. + +## Getting Started + +The best starting point is the [Faraday Website][website], with its introduction and explanation. +Need more details? See the [Faraday API Documentation][apidoc] to see how it works internally. + +## Supported Ruby versions + +This library aims to support and is [tested against][actions] the following Ruby +implementations: + +* Ruby 2.4+ + +If something doesn't work on one of these Ruby versions, it's a bug. + +This library may inadvertently work (or seem to work) on other Ruby +implementations and versions, however support will only be provided for the versions listed +above. + +If you would like this library to support another Ruby version, you may +volunteer to be a maintainer. Being a maintainer entails making sure all tests +run and pass on that implementation. When something breaks on your +implementation, you will be responsible for providing patches in a timely +fashion. If critical issues for a particular implementation exist at the time +of a major release, support for that Ruby version may be dropped. + +## Contribute + +Do you want to contribute to Faraday? +Open the issues page and check for the `help wanted` label! +But before you start coding, please read our [Contributing Guide][contributing] + +## Copyright +&copy; 2009 - 2020, the [Faraday Team][faraday_team]. Website and branding design by [Elena Lo Piccolo](https://elelopic.design). + +[website]: https://lostisland.github.io/faraday +[faraday_team]: https://lostisland.github.io/faraday/team +[contributing]: https://github.com/lostisland/faraday/blob/master/.github/CONTRIBUTING.md +[apidoc]: http://www.rubydoc.info/gems/faraday +[actions]: https://github.com/lostisland/faraday/actions +[jruby]: http://jruby.org/ +[rubinius]: http://rubini.us/ +[license]: LICENSE.md diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/Rakefile new file mode 100644 index 000000000000..cffdd09be3bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/Rakefile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) + +task default: :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/examples/client_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/examples/client_spec.rb new file mode 100644 index 000000000000..f13a2cafeaf3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/examples/client_spec.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +# Requires Ruby with rspec and faraday gems. +# rspec client_spec.rb + +require 'faraday' +require 'json' + +# Example API client +class Client + def initialize(conn) + @conn = conn + end + + def sushi(jname) + res = @conn.get("/#{jname}") + data = JSON.parse(res.body) + data['name'] + end +end + +RSpec.describe Client do + let(:stubs) { Faraday::Adapter::Test::Stubs.new } + let(:conn) { Faraday.new { |b| b.adapter(:test, stubs) } } + let(:client) { Client.new(conn) } + + it 'parses name' do + stubs.get('/ebi') do |env| + # optional: you can inspect the Faraday::Env + expect(env.url.path).to eq('/ebi') + [ + 200, + { 'Content-Type': 'application/javascript' }, + '{"name": "shrimp"}' + ] + end + + # uncomment to trigger stubs.verify_stubbed_calls failure + # stubs.get('/unused') { [404, {}, ''] } + + expect(client.sushi('ebi')).to eq('shrimp') + stubs.verify_stubbed_calls + end + + it 'handles 404' do + stubs.get('/ebi') do + [ + 404, + { 'Content-Type': 'application/javascript' }, + '{}' + ] + end + expect(client.sushi('ebi')).to be_nil + stubs.verify_stubbed_calls + end + + it 'handles exception' do + stubs.get('/ebi') do + raise Faraday::ConnectionFailed, nil + end + + expect { client.sushi('ebi') }.to raise_error(Faraday::ConnectionFailed) + stubs.verify_stubbed_calls + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/examples/client_test.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/examples/client_test.rb new file mode 100644 index 000000000000..148f5fccf74b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/examples/client_test.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: true + +# Requires Ruby with test-unit and faraday gems. +# ruby client_test.rb + +require 'faraday' +require 'json' +require 'test/unit' + +# Example API client +class Client + def initialize(conn) + @conn = conn + end + + def sushi(jname) + res = @conn.get("/#{jname}") + data = JSON.parse(res.body) + data['name'] + end +end + +# Example API client test +class ClientTest < Test::Unit::TestCase + def test_sushi_name + stubs = Faraday::Adapter::Test::Stubs.new + stubs.get('/ebi') do |env| + # optional: you can inspect the Faraday::Env + assert_equal '/ebi', env.url.path + [ + 200, + { 'Content-Type': 'application/javascript' }, + '{"name": "shrimp"}' + ] + end + + # uncomment to trigger stubs.verify_stubbed_calls failure + # stubs.get('/unused') { [404, {}, ''] } + + cli = client(stubs) + assert_equal 'shrimp', cli.sushi('ebi') + stubs.verify_stubbed_calls + end + + def test_sushi_404 + stubs = Faraday::Adapter::Test::Stubs.new + stubs.get('/ebi') do + [ + 404, + { 'Content-Type': 'application/javascript' }, + '{}' + ] + end + + cli = client(stubs) + assert_nil cli.sushi('ebi') + stubs.verify_stubbed_calls + end + + def test_sushi_exception + stubs = Faraday::Adapter::Test::Stubs.new + stubs.get('/ebi') do + raise Faraday::ConnectionFailed, nil + end + + cli = client(stubs) + assert_raise Faraday::ConnectionFailed do + cli.sushi('ebi') + end + stubs.verify_stubbed_calls + end + + def client(stubs) + conn = Faraday.new do |builder| + builder.adapter :test, stubs + end + Client.new(conn) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday.rb new file mode 100644 index 000000000000..8a6b7750a703 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday.rb @@ -0,0 +1,176 @@ +# frozen_string_literal: true + +require 'cgi' +require 'date' +require 'set' +require 'forwardable' +require 'faraday/middleware_registry' +require 'faraday/dependency_loader' + +unless defined?(::Faraday::Timer) + require 'timeout' + ::Faraday::Timer = Timeout +end + +require 'faraday/version' +require 'faraday/methods' +require 'faraday/utils' +require 'faraday/options' +require 'faraday/connection' +require 'faraday/rack_builder' +require 'faraday/parameters' +require 'faraday/middleware' +require 'faraday/adapter' +require 'faraday/request' +require 'faraday/response' +require 'faraday/error' +require 'faraday/file_part' +require 'faraday/param_part' + +require 'faraday/net_http' + +# This is the main namespace for Faraday. +# +# It provides methods to create {Connection} objects, and HTTP-related +# methods to use directly. +# +# @example Helpful class methods for easy usage +# Faraday.get "http://faraday.com" +# +# @example Helpful class method `.new` to create {Connection} objects. +# conn = Faraday.new "http://faraday.com" +# conn.get '/' +# +module Faraday + class << self + # The root path that Faraday is being loaded from. + # + # This is the root from where the libraries are auto-loaded. + # + # @return [String] + attr_accessor :root_path + + # Gets or sets the path that the Faraday libs are loaded from. + # @return [String] + attr_accessor :lib_path + + # @overload default_adapter + # Gets the Symbol key identifying a default Adapter to use + # for the default {Faraday::Connection}. Defaults to `:net_http`. + # @return [Symbol] the default adapter + # @overload default_adapter=(adapter) + # Updates default adapter while resetting {.default_connection}. + # @return [Symbol] the new default_adapter. + attr_reader :default_adapter + + # Documented below, see default_connection + attr_writer :default_connection + + # Tells Faraday to ignore the environment proxy (http_proxy). + # Defaults to `false`. + # @return [Boolean] + attr_accessor :ignore_env_proxy + + # Initializes a new {Connection}. + # + # @param url [String,Hash] The optional String base URL to use as a prefix + # for all requests. Can also be the options Hash. Any of these + # values will be set on every request made, unless overridden + # for a specific request. + # @param options [Hash] + # @option options [String] :url Base URL + # @option options [Hash] :params Hash of unencoded URI query params. + # @option options [Hash] :headers Hash of unencoded HTTP headers. + # @option options [Hash] :request Hash of request options. + # @option options [Hash] :ssl Hash of SSL options. + # @option options [Hash] :proxy Hash of Proxy options. + # @return [Faraday::Connection] + # + # @example With an URL argument + # Faraday.new 'http://faraday.com' + # # => Faraday::Connection to http://faraday.com + # + # @example With an URL argument and an options hash + # Faraday.new 'http://faraday.com', params: { page: 1 } + # # => Faraday::Connection to http://faraday.com?page=1 + # + # @example With everything in an options hash + # Faraday.new url: 'http://faraday.com', + # params: { page: 1 } + # # => Faraday::Connection to http://faraday.com?page=1 + def new(url = nil, options = {}, &block) + options = default_connection_options.merge(options) + Faraday::Connection.new(url, options, &block) + end + + # @private + # Internal: Requires internal Faraday libraries. + # + # @param libs [Array] one or more relative String names to Faraday classes. + # @return [void] + def require_libs(*libs) + libs.each do |lib| + require "#{lib_path}/#{lib}" + end + end + + alias require_lib require_libs + + # Documented elsewhere, see default_adapter reader + def default_adapter=(adapter) + @default_connection = nil + @default_adapter = adapter + end + + def respond_to_missing?(symbol, include_private = false) + default_connection.respond_to?(symbol, include_private) || super + end + + # @overload default_connection + # Gets the default connection used for simple scripts. + # @return [Faraday::Connection] a connection configured with + # the default_adapter. + # @overload default_connection=(connection) + # @param connection [Faraday::Connection] + # Sets the default {Faraday::Connection} for simple scripts that + # access the Faraday constant directly, such as + # <code>Faraday.get "https://faraday.com"</code>. + def default_connection + @default_connection ||= Connection.new(default_connection_options) + end + + # Gets the default connection options used when calling {Faraday#new}. + # + # @return [Faraday::ConnectionOptions] + def default_connection_options + @default_connection_options ||= ConnectionOptions.new + end + + # Sets the default options used when calling {Faraday#new}. + # + # @param options [Hash, Faraday::ConnectionOptions] + def default_connection_options=(options) + @default_connection = nil + @default_connection_options = ConnectionOptions.from(options) + end + + private + + # Internal: Proxies method calls on the Faraday constant to + # .default_connection. + def method_missing(name, *args, &block) + if default_connection.respond_to?(name) + default_connection.send(name, *args, &block) + else + super + end + end + end + + self.ignore_env_proxy = false + self.root_path = File.expand_path __dir__ + self.lib_path = File.expand_path 'faraday', __dir__ + self.default_adapter = :net_http + + require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD'] +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter.rb new file mode 100644 index 000000000000..39578669135a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter.rb @@ -0,0 +1,115 @@ +# frozen_string_literal: true + +module Faraday + # Base class for all Faraday adapters. Adapters are + # responsible for fulfilling a Faraday request. + class Adapter + extend MiddlewareRegistry + extend DependencyLoader + + CONTENT_LENGTH = 'Content-Length' + + register_middleware File.expand_path('adapter', __dir__), + test: [:Test, 'test'], + net_http_persistent: [ + :NetHttpPersistent, + 'net_http_persistent' + ], + typhoeus: [:Typhoeus, 'typhoeus'], + patron: [:Patron, 'patron'], + em_synchrony: [:EMSynchrony, 'em_synchrony'], + em_http: [:EMHttp, 'em_http'], + excon: [:Excon, 'excon'], + rack: [:Rack, 'rack'], + httpclient: [:HTTPClient, 'httpclient'] + + # This module marks an Adapter as supporting parallel requests. + module Parallelism + attr_writer :supports_parallel + + def supports_parallel? + @supports_parallel + end + + def inherited(subclass) + super + subclass.supports_parallel = supports_parallel? + end + end + + extend Parallelism + self.supports_parallel = false + + def initialize(_app = nil, opts = {}, &block) + @app = ->(env) { env.response } + @connection_options = opts + @config_block = block + end + + # Yields or returns an adapter's configured connection. Depends on + # #build_connection being defined on this adapter. + # + # @param env [Faraday::Env, Hash] The env object for a faraday request. + # + # @return The return value of the given block, or the HTTP connection object + # if no block is given. + def connection(env) + conn = build_connection(env) + return conn unless block_given? + + yield conn + end + + # Close any persistent connections. The adapter should still be usable + # after calling close. + def close + # Possible implementation: + # @app.close if @app.respond_to?(:close) + end + + def call(env) + env.clear_body if env.needs_body? + env.response = Response.new + end + + private + + def save_response(env, status, body, headers = nil, reason_phrase = nil) + env.status = status + env.body = body + env.reason_phrase = reason_phrase&.to_s&.strip + env.response_headers = Utils::Headers.new.tap do |response_headers| + response_headers.update headers unless headers.nil? + yield(response_headers) if block_given? + end + + env.response.finish(env) unless env.parallel? + env.response + end + + # Fetches either a read, write, or open timeout setting. Defaults to the + # :timeout value if a more specific one is not given. + # + # @param type [Symbol] Describes which timeout setting to get: :read, + # :write, or :open. + # @param options [Hash] Hash containing Symbol keys like :timeout, + # :read_timeout, :write_timeout, :open_timeout, or + # :timeout + # + # @return [Integer, nil] Timeout duration in seconds, or nil if no timeout + # has been set. + def request_timeout(type, options) + key = TIMEOUT_KEYS.fetch(type) do + msg = "Expected :read, :write, :open. Got #{type.inspect} :(" + raise ArgumentError, msg + end + options[key] || options[:timeout] + end + + TIMEOUT_KEYS = { + read: :read_timeout, + open: :open_timeout, + write: :write_timeout + }.freeze + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_http.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_http.rb new file mode 100644 index 000000000000..4d30b375c47a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_http.rb @@ -0,0 +1,289 @@ +# frozen_string_literal: true + +module Faraday + class Adapter + # EventMachine adapter. This adapter is useful for either asynchronous + # requests when in an EM reactor loop, or for making parallel requests in + # synchronous code. + class EMHttp < Faraday::Adapter + # Options is a module containing helpers to convert the Faraday env object + # into options hashes for EMHTTP method calls. + module Options + # @return [Hash] + def connection_config(env) + options = {} + configure_proxy(options, env) + configure_timeout(options, env) + configure_socket(options, env) + configure_ssl(options, env) + options + end + + def request_config(env) + options = { + body: read_body(env), + head: env[:request_headers] + # keepalive: true, + # file: 'path/to/file', # stream data off disk + } + configure_compression(options, env) + options + end + + def read_body(env) + body = env[:body] + body.respond_to?(:read) ? body.read : body + end + + # Reads out proxy settings from env into options + def configure_proxy(options, env) + proxy = request_options(env)[:proxy] + return unless proxy + + options[:proxy] = { + host: proxy[:uri].host, + port: proxy[:uri].port, + authorization: [proxy[:user], proxy[:password]] + } + end + + # Reads out host and port settings from env into options + def configure_socket(options, env) + bind = request_options(env)[:bind] + return unless bind + + options[:bind] = { + host: bind[:host], + port: bind[:port] + } + end + + # Reads out SSL certificate settings from env into options + def configure_ssl(options, env) + return unless env[:url].scheme == 'https' && env[:ssl] + + options[:ssl] = { + cert_chain_file: env[:ssl][:ca_file], + verify_peer: env[:ssl].fetch(:verify, true) + } + end + + # Reads out timeout settings from env into options + def configure_timeout(options, env) + req = request_options(env) + options[:inactivity_timeout] = request_timeout(:read, req) + options[:connect_timeout] = request_timeout(:open, req) + end + + # Reads out compression header settings from env into options + def configure_compression(options, env) + return unless (env[:method] == :get) && + !options[:head].key?('accept-encoding') + + options[:head]['accept-encoding'] = 'gzip, compressed' + end + + def request_options(env) + env[:request] + end + end + + include Options + + dependency do + require 'em-http' + + begin + require 'openssl' + rescue LoadError + warn 'Warning: no such file to load -- openssl. ' \ + 'Make sure it is installed if you want HTTPS support' + else + require 'em-http/version' + if EventMachine::HttpRequest::VERSION < '1.1.6' + require 'faraday/adapter/em_http_ssl_patch' + end + end + end + + self.supports_parallel = true + + # @return [Manager] + def self.setup_parallel_manager(_options = nil) + Manager.new + end + + def call(env) + super + perform_request env + @app.call env + end + + def perform_request(env) + if parallel?(env) + manager = env[:parallel_manager] + manager.add do + perform_single_request(env) + .callback { env[:response].finish(env) } + end + elsif EventMachine.reactor_running? + # EM is running: instruct upstream that this is an async request + env[:parallel_manager] = true + perform_single_request(env) + .callback { env[:response].finish(env) } + .errback do + # TODO: no way to communicate the error in async mode + raise NotImplementedError + end + else + error = nil + # start EM, block until request is completed + EventMachine.run do + perform_single_request(env) + .callback { EventMachine.stop } + .errback do |client| + error = error_message(client) + EventMachine.stop + end + end + raise_error(error) if error + end + rescue EventMachine::Connectify::CONNECTError => e + if e.message.include?('Proxy Authentication Required') + raise Faraday::ConnectionFailed, + %(407 "Proxy Authentication Required ") + end + + raise Faraday::ConnectionFailed, e + rescue StandardError => e + if defined?(::OpenSSL::SSL::SSLError) && \ + e.is_a?(::OpenSSL::SSL::SSLError) + raise Faraday::SSLError, e + end + + raise + end + + # TODO: reuse the connection to support pipelining + def perform_single_request(env) + req = create_request(env) + req = req.setup_request(env[:method], request_config(env)) + req.callback do |client| + if env[:request].stream_response? + warn "Streaming downloads for #{self.class.name} " \ + 'are not yet implemented.' + env[:request].on_data.call( + client.response, + client.response.bytesize + ) + end + status = client.response_header.status + reason = client.response_header.http_reason + save_response(env, status, client.response, nil, reason) do |headers| + client.response_header.each do |name, value| + headers[name.to_sym] = value + end + end + end + end + + def create_request(env) + EventMachine::HttpRequest.new( + env[:url], connection_config(env).merge(@connection_options) + ) + end + + def error_message(client) + client.error || 'request failed' + end + + def raise_error(msg) + error_class = Faraday::ClientError + if timeout_message?(msg) + error_class = Faraday::TimeoutError + msg = 'request timed out' + elsif msg == Errno::ECONNREFUSED + error_class = Faraday::ConnectionFailed + msg = 'connection refused' + elsif msg == 'connection closed by server' + error_class = Faraday::ConnectionFailed + end + raise error_class, msg + end + + def timeout_message?(msg) + msg == Errno::ETIMEDOUT || + (msg.is_a?(String) && msg.include?('timeout error')) + end + + # @return [Boolean] + def parallel?(env) + !!env[:parallel_manager] + end + + # This parallel manager is designed to start an EventMachine loop + # and block until all registered requests have been completed. + class Manager + # @see reset + def initialize + reset + end + + # Re-initializes instance variables + def reset + @registered_procs = [] + @num_registered = 0 + @num_succeeded = 0 + @errors = [] + @running = false + end + + # @return [Boolean] + def running? + @running + end + + def add(&block) + if running? + perform_request(&block) + else + @registered_procs << block + end + @num_registered += 1 + end + + def run + if @num_registered.positive? + @running = true + EventMachine.run do + @registered_procs.each do |proc| + perform_request(&proc) + end + end + unless @errors.empty? + raise Faraday::ClientError, @errors.first || 'connection failed' + end + end + ensure + reset + end + + def perform_request + client = yield + client.callback do + @num_succeeded += 1 + check_finished + end + client.errback do + @errors << client.error + check_finished + end + end + + def check_finished + EventMachine.stop if @num_succeeded + @errors.size == @num_registered + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_http_ssl_patch.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_http_ssl_patch.rb new file mode 100644 index 000000000000..d33a9c4cfc6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_http_ssl_patch.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require 'openssl' +require 'em-http' + +# EventMachine patch to make SSL work. +module EmHttpSslPatch + def ssl_verify_peer(cert_string) + begin + @last_seen_cert = OpenSSL::X509::Certificate.new(cert_string) + rescue OpenSSL::X509::CertificateError + return false + end + + unless certificate_store.verify(@last_seen_cert) + raise OpenSSL::SSL::SSLError, + %(unable to verify the server certificate for "#{host}") + end + + begin + certificate_store.add_cert(@last_seen_cert) + rescue OpenSSL::X509::StoreError => e + raise e unless e.message == 'cert already in hash table' + end + true + end + + def ssl_handshake_completed + return true unless verify_peer? + + unless verified_cert_identity? + raise OpenSSL::SSL::SSLError, + %(host "#{host}" does not match the server certificate) + end + + true + end + + def verify_peer? + parent.connopts.tls[:verify_peer] + end + + def verified_cert_identity? + OpenSSL::SSL.verify_certificate_identity(@last_seen_cert, host) + end + + def host + parent.uri.host + end + + def certificate_store + @certificate_store ||= begin + store = OpenSSL::X509::Store.new + store.set_default_paths + ca_file = parent.connopts.tls[:cert_chain_file] + store.add_file(ca_file) if ca_file + store + end + end +end + +EventMachine::HttpStubConnection.include(EmHttpSslPatch) diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_synchrony.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_synchrony.rb new file mode 100644 index 000000000000..94331bad3cd8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_synchrony.rb @@ -0,0 +1,153 @@ +# frozen_string_literal: true + +require 'uri' + +module Faraday + class Adapter + # EventMachine Synchrony adapter. + class EMSynchrony < Faraday::Adapter + include EMHttp::Options + + dependency do + require 'em-synchrony/em-http' + require 'em-synchrony/em-multi' + require 'fiber' + + require 'faraday/adapter/em_synchrony/parallel_manager' + + if Faraday::Adapter::EMSynchrony.loaded? + begin + require 'openssl' + rescue LoadError + warn 'Warning: no such file to load -- openssl. ' \ + 'Make sure it is installed if you want HTTPS support' + else + require 'em-http/version' + if EventMachine::HttpRequest::VERSION < '1.1.6' + require 'faraday/adapter/em_http_ssl_patch' + end + end + end + end + + self.supports_parallel = true + + # @return [ParallelManager] + def self.setup_parallel_manager(_options = nil) + ParallelManager.new + end + + def call(env) + super + request = create_request(env) + + http_method = env[:method].to_s.downcase.to_sym + + if env[:parallel_manager] + # Queue requests for parallel execution. + execute_parallel_request(env, request, http_method) + else + # Execute single request. + execute_single_request(env, request, http_method) + end + + @app.call env + rescue Errno::ECONNREFUSED + raise Faraday::ConnectionFailed, $ERROR_INFO + rescue EventMachine::Connectify::CONNECTError => e + if e.message.include?('Proxy Authentication Required') + raise Faraday::ConnectionFailed, + %(407 "Proxy Authentication Required") + end + + raise Faraday::ConnectionFailed, e + rescue Errno::ETIMEDOUT => e + raise Faraday::TimeoutError, e + rescue RuntimeError => e + if e.message == 'connection closed by server' + raise Faraday::ConnectionFailed, e + end + + raise Faraday::TimeoutError, e if e.message.include?('timeout error') + + raise + rescue StandardError => e + if defined?(OpenSSL) && e.is_a?(OpenSSL::SSL::SSLError) + raise Faraday::SSLError, e + end + + raise + end + + def create_request(env) + EventMachine::HttpRequest.new( + Utils::URI(env[:url].to_s), + connection_config(env).merge(@connection_options) + ) + end + + private + + def execute_parallel_request(env, request, http_method) + env[:parallel_manager].add(request, http_method, + request_config(env)) do |resp| + if (req = env[:request]).stream_response? + warn "Streaming downloads for #{self.class.name} " \ + 'are not yet implemented.' + req.on_data.call(resp.response, resp.response.bytesize) + end + + save_response(env, resp.response_header.status, + resp.response) do |resp_headers| + resp.response_header.each do |name, value| + resp_headers[name.to_sym] = value + end + end + + # Finalize the response object with values from `env`. + env[:response].finish(env) + end + end + + def execute_single_request(env, request, http_method) + block = -> { request.send(http_method, request_config(env)) } + client = call_block(block) + + raise client.error if client&.error + + if env[:request].stream_response? + warn "Streaming downloads for #{self.class.name} " \ + 'are not yet implemented.' + env[:request].on_data.call( + client.response, + client.response.bytesize + ) + end + status = client.response_header.status + reason = client.response_header.http_reason + save_response(env, status, client.response, nil, reason) do |headers| + client.response_header.each do |name, value| + headers[name.to_sym] = value + end + end + end + + def call_block(block) + client = nil + + if EM.reactor_running? + client = block.call + else + EM.run do + Fiber.new do + client = block.call + EM.stop + end.resume + end + end + + client + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_synchrony/parallel_manager.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_synchrony/parallel_manager.rb new file mode 100644 index 000000000000..1701ae82d037 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/em_synchrony/parallel_manager.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +module Faraday + class Adapter + class EMSynchrony < Faraday::Adapter + # A parallel manager for EMSynchrony. + class ParallelManager + # Add requests to queue. + # + # @param request [EM::HttpRequest] + # @param method [Symbol, String] HTTP method + # @param args [Array] the rest of the positional arguments + def add(request, method, *args, &block) + queue << { + request: request, + method: method, + args: args, + block: block + } + end + + # Run all requests on queue with `EM::Synchrony::Multi`, wrapping + # it in a reactor and fiber if needed. + def run + result = nil + if !EM.reactor_running? + EM.run do + Fiber.new do + result = perform + EM.stop + end.resume + end + else + result = perform + end + result + end + + private + + # The request queue. + def queue + @queue ||= [] + end + + # Main `EM::Synchrony::Multi` performer. + def perform + multi = ::EM::Synchrony::Multi.new + + queue.each do |item| + method = "a#{item[:method]}".to_sym + + req = item[:request].send(method, *item[:args]) + req.callback(&item[:block]) + + req_name = "req_#{multi.requests.size}".to_sym + multi.add(req_name, req) + end + + # Clear the queue, so parallel manager objects can be reused. + @queue = [] + + # Block fiber until all requests have returned. + multi.perform + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/excon.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/excon.rb new file mode 100644 index 000000000000..7febdf9270d1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/excon.rb @@ -0,0 +1,124 @@ +# frozen_string_literal: true + +module Faraday + class Adapter + # Excon adapter. + class Excon < Faraday::Adapter + dependency 'excon' + + def build_connection(env) + opts = opts_from_env(env) + ::Excon.new(env[:url].to_s, opts.merge(@connection_options)) + end + + def call(env) + super + + req_opts = { + method: env[:method].to_s.upcase, + headers: env[:request_headers], + body: read_body(env) + } + + req = env[:request] + if req&.stream_response? + total = 0 + req_opts[:response_block] = lambda do |chunk, _remain, _total| + req.on_data.call(chunk, total += chunk.size) + end + end + + resp = connection(env) { |http| http.request(req_opts) } + save_response(env, resp.status.to_i, resp.body, resp.headers, + resp.reason_phrase) + + @app.call(env) + rescue ::Excon::Errors::SocketError => e + raise Faraday::TimeoutError, e if e.message.match?(/\btimeout\b/) + + raise Faraday::SSLError, e if e.message.match?(/\bcertificate\b/) + + raise Faraday::ConnectionFailed, e + rescue ::Excon::Errors::Timeout => e + raise Faraday::TimeoutError, e + end + + # TODO: support streaming requests + def read_body(env) + env[:body].respond_to?(:read) ? env[:body].read : env[:body] + end + + private + + def opts_from_env(env) + opts = {} + amend_opts_with_ssl!(opts, env[:ssl]) if needs_ssl_settings?(env) + + if (req = env[:request]) + amend_opts_with_timeouts!(opts, req) + amend_opts_with_proxy_settings!(opts, req) + end + + opts + end + + def needs_ssl_settings?(env) + env[:url].scheme == 'https' && env[:ssl] + end + + OPTS_KEYS = [ + %i[client_cert client_cert], + %i[client_key client_key], + %i[certificate certificate], + %i[private_key private_key], + %i[ssl_ca_path ca_path], + %i[ssl_ca_file ca_file], + %i[ssl_version version], + %i[ssl_min_version min_version], + %i[ssl_max_version max_version] + ].freeze + + def amend_opts_with_ssl!(opts, ssl) + opts[:ssl_verify_peer] = !!ssl.fetch(:verify, true) + # https://github.com/geemus/excon/issues/106 + # https://github.com/jruby/jruby-ossl/issues/19 + opts[:nonblock] = false + + OPTS_KEYS.each do |(key_in_opts, key_in_ssl)| + next unless ssl[key_in_ssl] + + opts[key_in_opts] = ssl[key_in_ssl] + end + end + + def amend_opts_with_timeouts!(opts, req) + if (sec = request_timeout(:read, req)) + opts[:read_timeout] = sec + end + + if (sec = request_timeout(:write, req)) + opts[:write_timeout] = sec + end + + return unless (sec = request_timeout(:open, req)) + + opts[:connect_timeout] = sec + end + + def amend_opts_with_proxy_settings!(opts, req) + opts[:proxy] = proxy_settings_for_opts(req[:proxy]) if req[:proxy] + end + + def proxy_settings_for_opts(proxy) + { + host: proxy[:uri].host, + hostname: proxy[:uri].hostname, + port: proxy[:uri].port, + scheme: proxy[:uri].scheme, + user: proxy[:user], + password: proxy[:password] + } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/httpclient.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/httpclient.rb new file mode 100644 index 000000000000..cc563f13edff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/httpclient.rb @@ -0,0 +1,152 @@ +# frozen_string_literal: true + +module Faraday + class Adapter + # HTTPClient adapter. + class HTTPClient < Faraday::Adapter + dependency 'httpclient' + + def build_connection(env) + @client ||= ::HTTPClient.new.tap do |cli| + # enable compression + cli.transparent_gzip_decompression = true + end + + if (req = env[:request]) + if (proxy = req[:proxy]) + configure_proxy @client, proxy + end + + if (bind = req[:bind]) + configure_socket @client, bind + end + + configure_timeouts @client, req + end + + if env[:url].scheme == 'https' && (ssl = env[:ssl]) + configure_ssl @client, ssl + end + + configure_client @client + + @client + end + + def call(env) + super + + # TODO: Don't stream yet. + # https://github.com/nahi/httpclient/pull/90 + env[:body] = env[:body].read if env[:body].respond_to? :read + + connection(env) do |http| + resp = http.request env[:method], env[:url], + body: env[:body], + header: env[:request_headers] + + if (req = env[:request]).stream_response? + warn "Streaming downloads for #{self.class.name} " \ + 'are not yet implemented.' + req.on_data.call(resp.body, resp.body.bytesize) + end + save_response env, resp.status, resp.body, resp.headers, resp.reason + + @app.call env + end + rescue ::HTTPClient::TimeoutError, Errno::ETIMEDOUT + raise Faraday::TimeoutError, $ERROR_INFO + rescue ::HTTPClient::BadResponseError => e + if e.message.include?('status 407') + raise Faraday::ConnectionFailed, + %(407 "Proxy Authentication Required ") + end + + raise Faraday::ClientError, $ERROR_INFO + rescue Errno::EADDRNOTAVAIL, Errno::ECONNREFUSED, IOError, SocketError + raise Faraday::ConnectionFailed, $ERROR_INFO + rescue StandardError => e + if defined?(::OpenSSL::SSL::SSLError) && \ + e.is_a?(::OpenSSL::SSL::SSLError) + raise Faraday::SSLError, e + end + + raise + end + + # @param bind [Hash] + def configure_socket(client, bind) + client.socket_local.host = bind[:host] + client.socket_local.port = bind[:port] + end + + # Configure proxy URI and any user credentials. + # + # @param proxy [Hash] + def configure_proxy(client, proxy) + client.proxy = proxy[:uri] + return unless proxy[:user] && proxy[:password] + + client.set_proxy_auth(proxy[:user], proxy[:password]) + end + + # @param ssl [Hash] + def configure_ssl(client, ssl) + ssl_config = client.ssl_config + ssl_config.verify_mode = ssl_verify_mode(ssl) + ssl_config.cert_store = ssl_cert_store(ssl) + + ssl_config.add_trust_ca ssl[:ca_file] if ssl[:ca_file] + ssl_config.add_trust_ca ssl[:ca_path] if ssl[:ca_path] + ssl_config.client_cert = ssl[:client_cert] if ssl[:client_cert] + ssl_config.client_key = ssl[:client_key] if ssl[:client_key] + ssl_config.verify_depth = ssl[:verify_depth] if ssl[:verify_depth] + end + + # @param req [Hash] + def configure_timeouts(client, req) + if (sec = request_timeout(:open, req)) + client.connect_timeout = sec + end + + if (sec = request_timeout(:write, req)) + client.send_timeout = sec + end + + return unless (sec = request_timeout(:read, req)) + + client.receive_timeout = sec + end + + def configure_client(client) + @config_block&.call(client) + end + + # @param ssl [Hash] + # @return [OpenSSL::X509::Store] + def ssl_cert_store(ssl) + return ssl[:cert_store] if ssl[:cert_store] + + # Memoize the cert store so that the same one is passed to + # HTTPClient each time, to avoid resyncing SSL sessions when + # it's changed + @ssl_cert_store ||= begin + # Use the default cert store by default, i.e. system ca certs + OpenSSL::X509::Store.new.tap(&:set_default_paths) + end + end + + # @param ssl [Hash] + def ssl_verify_mode(ssl) + ssl[:verify_mode] || begin + if ssl.fetch(:verify, true) + OpenSSL::SSL::VERIFY_PEER | + OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT + else + OpenSSL::SSL::VERIFY_NONE + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/net_http_persistent.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/net_http_persistent.rb new file mode 100644 index 000000000000..26bcc2ce5a0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/net_http_persistent.rb @@ -0,0 +1,91 @@ +# frozen_string_literal: true + +module Faraday + class Adapter + # Net::HTTP::Persistent adapter. + class NetHttpPersistent < NetHttp + dependency 'net/http/persistent' + + private + + def net_http_connection(env) + @cached_connection ||= + if Net::HTTP::Persistent.instance_method(:initialize) + .parameters.first == %i[key name] + options = { name: 'Faraday' } + if @connection_options.key?(:pool_size) + options[:pool_size] = @connection_options[:pool_size] + end + Net::HTTP::Persistent.new(**options) + else + Net::HTTP::Persistent.new('Faraday') + end + + proxy_uri = proxy_uri(env) + if @cached_connection.proxy_uri != proxy_uri + @cached_connection.proxy = proxy_uri + end + @cached_connection + end + + def proxy_uri(env) + proxy_uri = nil + if (proxy = env[:request][:proxy]) + proxy_uri = if proxy[:uri].is_a?(::URI::HTTP) + proxy[:uri].dup + else + ::URI.parse(proxy[:uri].to_s) + end + proxy_uri.user = proxy_uri.password = nil + # awful patch for net-http-persistent 2.8 + # not unescaping user/password + if proxy[:user] + (class << proxy_uri; self; end).class_eval do + define_method(:user) { proxy[:user] } + define_method(:password) { proxy[:password] } + end + end + end + proxy_uri + end + + def perform_request(http, env) + http.request env[:url], create_request(env) + rescue Errno::ETIMEDOUT, Net::OpenTimeout => e + raise Faraday::TimeoutError, e + rescue Net::HTTP::Persistent::Error => e + raise Faraday::TimeoutError, e if e.message.include? 'Timeout' + + if e.message.include? 'connection refused' + raise Faraday::ConnectionFailed, e + end + + raise + end + + SSL_CONFIGURATIONS = { + certificate: :client_cert, + private_key: :client_key, + ca_file: :ca_file, + ssl_version: :version, + min_version: :min_version, + max_version: :max_version + }.freeze + + def configure_ssl(http, ssl) + return unless ssl + + http_set(http, :verify_mode, ssl_verify_mode(ssl)) + http_set(http, :cert_store, ssl_cert_store(ssl)) + + SSL_CONFIGURATIONS + .select { |_, key| ssl[key] } + .each { |target, key| http_set(http, target, ssl[key]) } + end + + def http_set(http, attr, value) + http.send("#{attr}=", value) if http.send(attr) != value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/patron.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/patron.rb new file mode 100644 index 000000000000..c6e2935fbacd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/patron.rb @@ -0,0 +1,132 @@ +# frozen_string_literal: true + +module Faraday + class Adapter + # Patron adapter. + class Patron < Faraday::Adapter + dependency 'patron' + + def build_connection(env) + session = ::Patron::Session.new + @config_block&.call(session) + if (env[:url].scheme == 'https') && env[:ssl] + configure_ssl(session, env[:ssl]) + end + + if (req = env[:request]) + configure_timeouts(session, req) + configure_proxy(session, req[:proxy]) + end + + session + end + + def call(env) + super + # TODO: support streaming requests + env[:body] = env[:body].read if env[:body].respond_to? :read + + response = connection(env) do |session| + begin + data = env[:body] ? env[:body].to_s : nil + session.request(env[:method], env[:url].to_s, + env[:request_headers], data: data) + rescue Errno::ECONNREFUSED, ::Patron::ConnectionFailed + raise Faraday::ConnectionFailed, $ERROR_INFO + end + end + + if (req = env[:request]).stream_response? + warn "Streaming downloads for #{self.class.name} " \ + 'are not yet implemented.' + req.on_data.call(response.body, response.body.bytesize) + end + # Remove the "HTTP/1.1 200", leaving just the reason phrase + reason_phrase = response.status_line.gsub(/^.* \d{3} /, '') + + save_response(env, response.status, response.body, + response.headers, reason_phrase) + + @app.call env + rescue ::Patron::TimeoutError => e + if connection_timed_out_message?(e.message) + raise Faraday::ConnectionFailed, e + end + + raise Faraday::TimeoutError, e + rescue ::Patron::Error => e + if e.message.include?('code 407') + raise Faraday::ConnectionFailed, + %(407 "Proxy Authentication Required ") + end + + raise Faraday::ConnectionFailed, e + end + + if loaded? && defined?(::Patron::Request::VALID_ACTIONS) + # HAX: helps but doesn't work completely + # https://github.com/toland/patron/issues/34 + ::Patron::Request::VALID_ACTIONS.tap do |actions| + if actions[0].is_a?(Symbol) + actions << :patch unless actions.include? :patch + actions << :options unless actions.include? :options + else + # Patron 0.4.20 and up + actions << 'PATCH' unless actions.include? 'PATCH' + actions << 'OPTIONS' unless actions.include? 'OPTIONS' + end + end + end + + def configure_ssl(session, ssl) + if ssl.fetch(:verify, true) + session.cacert = ssl[:ca_file] + else + session.insecure = true + end + end + + def configure_timeouts(session, req) + return unless req + + if (sec = request_timeout(:read, req)) + session.timeout = sec + end + + return unless (sec = request_timeout(:open, req)) + + session.connect_timeout = sec + end + + def configure_proxy(session, proxy) + return unless proxy + + proxy_uri = proxy[:uri].dup + proxy_uri.user = proxy[:user] && + Utils.escape(proxy[:user]).gsub('+', '%20') + proxy_uri.password = proxy[:password] && + Utils.escape(proxy[:password]).gsub('+', '%20') + session.proxy = proxy_uri.to_s + end + + private + + CURL_TIMEOUT_MESSAGES = [ + 'Connection time-out', + 'Connection timed out', + 'Timed out before name resolve', + 'server connect has timed out', + 'Resolving timed out', + 'name lookup timed out', + 'timed out before SSL', + 'connect() timed out' + ].freeze + + def connection_timed_out_message?(message) + CURL_TIMEOUT_MESSAGES.any? do |curl_message| + message.include?(curl_message) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/rack.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/rack.rb new file mode 100644 index 000000000000..6a237ee1362e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/rack.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +module Faraday + class Adapter + # Sends requests to a Rack app. + # + # @example + # + # class MyRackApp + # def call(env) + # [200, {'Content-Type' => 'text/html'}, ["hello world"]] + # end + # end + # + # Faraday.new do |conn| + # conn.adapter :rack, MyRackApp.new + # end + class Rack < Faraday::Adapter + dependency 'rack/test' + + # not prefixed with "HTTP_" + SPECIAL_HEADERS = %w[CONTENT_LENGTH CONTENT_TYPE].freeze + + def initialize(faraday_app, rack_app) + super(faraday_app) + mock_session = ::Rack::MockSession.new(rack_app) + @session = ::Rack::Test::Session.new(mock_session) + end + + def call(env) + super + rack_env = build_rack_env(env) + + env[:request_headers]&.each do |name, value| + name = name.upcase.tr('-', '_') + name = "HTTP_#{name}" unless SPECIAL_HEADERS.include? name + rack_env[name] = value + end + + timeout = request_timeout(:open, env[:request]) + timeout ||= request_timeout(:read, env[:request]) + response = if timeout + Timer.timeout(timeout, Faraday::TimeoutError) do + execute_request(env, rack_env) + end + else + execute_request(env, rack_env) + end + + if (req = env[:request]).stream_response? + warn "Streaming downloads for #{self.class.name} " \ + 'are not yet implemented.' + req.on_data.call(response.body, response.body.bytesize) + end + + save_response(env, response.status, response.body, response.headers) + @app.call env + end + + private + + def execute_request(env, rack_env) + @session.request(env[:url].to_s, rack_env) + end + + def build_rack_env(env) + { + method: env[:method], + input: env[:body].respond_to?(:read) ? env[:body].read : env[:body], + 'rack.url_scheme' => env[:url].scheme + } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/test.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/test.rb new file mode 100644 index 000000000000..0230b853f6ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/test.rb @@ -0,0 +1,246 @@ +# frozen_string_literal: true + +module Faraday + class Adapter + # @example + # test = Faraday::Connection.new do + # use Faraday::Adapter::Test do |stub| + # # Define matcher to match the request + # stub.get '/resource.json' do + # # return static content + # [200, {'Content-Type' => 'application/json'}, 'hi world'] + # end + # + # # response with content generated based on request + # stub.get '/showget' do |env| + # [200, {'Content-Type' => 'text/plain'}, env[:method].to_s] + # end + # + # # A regular expression can be used as matching filter + # stub.get /\A\/items\/(\d+)\z/ do |env, meta| + # # in case regular expression is used, an instance of MatchData + # # can be received + # [200, + # {'Content-Type' => 'text/plain'}, + # "showing item: #{meta[:match_data][1]}" + # ] + # end + # end + # end + # + # resp = test.get '/resource.json' + # resp.body # => 'hi world' + # + # resp = test.get '/showget' + # resp.body # => 'get' + # + # resp = test.get '/items/1' + # resp.body # => 'showing item: 1' + # + # resp = test.get '/items/2' + # resp.body # => 'showing item: 2' + class Test < Faraday::Adapter + attr_accessor :stubs + + # A stack of Stubs + class Stubs + class NotFound < StandardError + end + + def initialize + # { get: [Stub, Stub] } + @stack = {} + @consumed = {} + yield(self) if block_given? + end + + def empty? + @stack.empty? + end + + def match(request_method, host, path, headers, body) + return false unless @stack.key?(request_method) + + stack = @stack[request_method] + consumed = (@consumed[request_method] ||= []) + + stub, meta = matches?(stack, host, path, headers, body) + if stub + consumed << stack.delete(stub) + return stub, meta + end + matches?(consumed, host, path, headers, body) + end + + def get(path, headers = {}, &block) + new_stub(:get, path, headers, &block) + end + + def head(path, headers = {}, &block) + new_stub(:head, path, headers, &block) + end + + def post(path, body = nil, headers = {}, &block) + new_stub(:post, path, headers, body, &block) + end + + def put(path, body = nil, headers = {}, &block) + new_stub(:put, path, headers, body, &block) + end + + def patch(path, body = nil, headers = {}, &block) + new_stub(:patch, path, headers, body, &block) + end + + def delete(path, headers = {}, &block) + new_stub(:delete, path, headers, &block) + end + + def options(path, headers = {}, &block) + new_stub(:options, path, headers, &block) + end + + # Raises an error if any of the stubbed calls have not been made. + def verify_stubbed_calls + failed_stubs = [] + @stack.each do |method, stubs| + next if stubs.empty? + + failed_stubs.concat( + stubs.map do |stub| + "Expected #{method} #{stub}." + end + ) + end + raise failed_stubs.join(' ') unless failed_stubs.empty? + end + + protected + + def new_stub(request_method, path, headers = {}, body = nil, &block) + normalized_path, host = + if path.is_a?(Regexp) + path + else + [ + Faraday::Utils.normalize_path(path), + Faraday::Utils.URI(path).host + ] + end + + stub = Stub.new(host, normalized_path, headers, body, block) + (@stack[request_method] ||= []) << stub + end + + def matches?(stack, host, path, headers, body) + stack.each do |stub| + match_result, meta = stub.matches?(host, path, headers, body) + return stub, meta if match_result + end + nil + end + end + + # Stub request + # rubocop:disable Style/StructInheritance + class Stub < Struct.new(:host, :path, :params, :headers, :body, :block) + # rubocop:enable Style/StructInheritance + def initialize(host, full, headers, body, block) + path, query = full.respond_to?(:split) ? full.split('?') : full + params = + if query + Faraday::Utils.parse_nested_query(query) + else + {} + end + + super(host, path, params, headers, body, block) + end + + def matches?(request_host, request_uri, request_headers, request_body) + request_path, request_query = request_uri.split('?') + request_params = + if request_query + Faraday::Utils.parse_nested_query(request_query) + else + {} + end + # meta is a hash used as carrier + # that will be yielded to consumer block + meta = {} + [(host.nil? || host == request_host) && + path_match?(request_path, meta) && + params_match?(request_params) && + (body.to_s.size.zero? || request_body == body) && + headers_match?(request_headers), meta] + end + + def path_match?(request_path, meta) + if path.is_a?(Regexp) + !!(meta[:match_data] = path.match(request_path)) + else + path == request_path + end + end + + def params_match?(request_params) + params.keys.all? do |key| + request_params[key] == params[key] + end + end + + def headers_match?(request_headers) + headers.keys.all? do |key| + request_headers[key] == headers[key] + end + end + + def to_s + "#{path} #{body}" + end + end + + def initialize(app, stubs = nil, &block) + super(app) + @stubs = stubs || Stubs.new + configure(&block) if block + end + + def configure + yield(stubs) + end + + def call(env) + super + host = env[:url].host + normalized_path = Faraday::Utils.normalize_path(env[:url]) + params_encoder = env.request.params_encoder || + Faraday::Utils.default_params_encoder + + stub, meta = stubs.match(env[:method], host, normalized_path, + env.request_headers, env[:body]) + + unless stub + raise Stubs::NotFound, "no stubbed request for #{env[:method]} "\ + "#{normalized_path} #{env[:body]}" + end + + env[:params] = if (query = env[:url].query) + params_encoder.decode(query) + else + {} + end + block_arity = stub.block.arity + status, headers, body = + if block_arity >= 0 + stub.block.call(*[env, meta].take(block_arity)) + else + stub.block.call(env, meta) + end + save_response(env, status, body, headers) + + @app.call(env) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/typhoeus.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/typhoeus.rb new file mode 100644 index 000000000000..2f6ed6880f03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter/typhoeus.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Faraday + class Adapter + # Typhoeus adapter. This class is just a stub, the real adapter is in + # https://github.com/typhoeus/typhoeus/blob/master/lib/typhoeus/adapters/faraday.rb + class Typhoeus < Faraday::Adapter + # Needs to define this method in order to support Typhoeus <= 1.3.0 + def call; end + + dependency 'typhoeus' + dependency 'typhoeus/adapters/faraday' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter_registry.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter_registry.rb new file mode 100644 index 000000000000..1cd1e7e17300 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/adapter_registry.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require 'monitor' + +module Faraday + # AdapterRegistry registers adapter class names so they can be looked up by a + # String or Symbol name. + class AdapterRegistry + def initialize + @lock = Monitor.new + @constants = {} + end + + def get(name) + klass = @lock.synchronize do + @constants[name] + end + return klass if klass + + Object.const_get(name).tap { |c| set(c, name) } + end + + def set(klass, name = nil) + name ||= klass.to_s + @lock.synchronize do + @constants[name] = klass + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/autoload.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/autoload.rb new file mode 100644 index 000000000000..61b93ac13eb1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/autoload.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +module Faraday + # Adds the ability for other modules to manage autoloadable + # constants. + # + # @api private + module AutoloadHelper + # Registers the constants to be auto loaded. + # + # @param prefix [String] The require prefix. If the path is inside Faraday, + # then it will be prefixed with the root path of this loaded + # Faraday version. + # @param options [{ Symbol => String }] library names. + # + # @example + # + # Faraday.autoload_all 'faraday/foo', + # Bar: 'bar' + # + # # requires faraday/foo/bar to load Faraday::Bar. + # Faraday::Bar + # + # @return [void] + def autoload_all(prefix, options) + if prefix.match? %r{^faraday(/|$)}i + prefix = File.join(Faraday.root_path, prefix) + end + + options.each do |const_name, path| + autoload const_name, File.join(prefix, path) + end + end + + # Loads each autoloaded constant. If thread safety is a concern, + # wrap this in a Mutex. + # + # @return [void] + def load_autoloaded_constants + constants.each do |const| + const_get(const) if autoload?(const) + end + end + + # Filters the module's contents with those that have been already + # autoloaded. + # + # @return [Array<Class, Module>] + def all_loaded_constants + constants + .map { |c| const_get(c) } + .select { |a| a.respond_to?(:loaded?) && a.loaded? } + end + end + + # Adapter is the base class for all Faraday adapters. + # @see lib/faraday/adapter.rb Original class location + class Adapter + extend AutoloadHelper + autoload_all 'faraday/adapter', + NetHttpPersistent: 'net_http_persistent', + EMSynchrony: 'em_synchrony', + EMHttp: 'em_http', + Typhoeus: 'typhoeus', + Patron: 'patron', + Excon: 'excon', + Test: 'test', + Rack: 'rack', + HTTPClient: 'httpclient' + end + + # Request represents a single HTTP request for a Faraday adapter to make. + # @see lib/faraday/request.rb Original class location + class Request + extend AutoloadHelper + autoload_all 'faraday/request', + UrlEncoded: 'url_encoded', + Multipart: 'multipart', + Retry: 'retry', + Authorization: 'authorization', + BasicAuthentication: 'basic_authentication', + TokenAuthentication: 'token_authentication', + Instrumentation: 'instrumentation' + end + + # Response represents the returned value of a sent Faraday request. + # @see lib/faraday/response.rb Original class location + class Response + extend AutoloadHelper + autoload_all 'faraday/response', + RaiseError: 'raise_error', + Logger: 'logger' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/connection.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/connection.rb new file mode 100644 index 000000000000..3776253eed74 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/connection.rb @@ -0,0 +1,614 @@ +# frozen_string_literal: true + +module Faraday + # Connection objects manage the default properties and the middleware + # stack for fulfilling an HTTP request. + # + # @example + # + # conn = Faraday::Connection.new 'http://sushi.com' + # + # # GET http://sushi.com/nigiri + # conn.get 'nigiri' + # # => #<Faraday::Response> + # + class Connection + # A Set of allowed HTTP verbs. + METHODS = Set.new %i[get post put delete head patch options trace] + + # @return [Hash] URI query unencoded key/value pairs. + attr_reader :params + + # @return [Hash] unencoded HTTP header key/value pairs. + attr_reader :headers + + # @return [String] a URI with the prefix used for all requests from this + # Connection. This includes a default host name, scheme, port, and path. + attr_reader :url_prefix + + # @return [Faraday::Builder] Builder for this Connection. + attr_reader :builder + + # @return [Hash] SSL options. + attr_reader :ssl + + # @return [Object] the parallel manager for this Connection. + attr_reader :parallel_manager + + # Sets the default parallel manager for this connection. + attr_writer :default_parallel_manager + + # @return [Hash] proxy options. + attr_reader :proxy + + # Initializes a new Faraday::Connection. + # + # @param url [URI, String] URI or String base URL to use as a prefix for all + # requests (optional). + # @param options [Hash, Faraday::ConnectionOptions] + # @option options [URI, String] :url ('http:/') URI or String base URL + # @option options [Hash<String => String>] :params URI query unencoded + # key/value pairs. + # @option options [Hash<String => String>] :headers Hash of unencoded HTTP + # header key/value pairs. + # @option options [Hash] :request Hash of request options. + # @option options [Hash] :ssl Hash of SSL options. + # @option options [Hash, URI, String] :proxy proxy options, either as a URL + # or as a Hash + # @option options [URI, String] :proxy[:uri] + # @option options [String] :proxy[:user] + # @option options [String] :proxy[:password] + # @yield [self] after all setup has been done + def initialize(url = nil, options = nil) + options = ConnectionOptions.from(options) + + if url.is_a?(Hash) || url.is_a?(ConnectionOptions) + options = options.merge(url) + url = options.url + end + + @parallel_manager = nil + @headers = Utils::Headers.new + @params = Utils::ParamsHash.new + @options = options.request + @ssl = options.ssl + @default_parallel_manager = options.parallel_manager + + @builder = options.builder || begin + # pass an empty block to Builder so it doesn't assume default middleware + options.new_builder(block_given? ? proc { |b| } : nil) + end + + self.url_prefix = url || 'http:/' + + @params.update(options.params) if options.params + @headers.update(options.headers) if options.headers + + initialize_proxy(url, options) + + yield(self) if block_given? + + @headers[:user_agent] ||= "Faraday v#{VERSION}" + end + + def initialize_proxy(url, options) + @manual_proxy = !!options.proxy + @proxy = + if options.proxy + ProxyOptions.from(options.proxy) + else + proxy_from_env(url) + end + end + + # Sets the Hash of URI query unencoded key/value pairs. + # @param hash [Hash] + def params=(hash) + @params.replace hash + end + + # Sets the Hash of unencoded HTTP header key/value pairs. + # @param hash [Hash] + def headers=(hash) + @headers.replace hash + end + + extend Forwardable + + def_delegators :builder, :build, :use, :request, :response, :adapter, :app + + # Closes the underlying resources and/or connections. In the case of + # persistent connections, this closes all currently open connections + # but does not prevent new connections from being made. + def close + app.close + end + + # @!method get(url = nil, params = nil, headers = nil) + # Makes a GET HTTP request without a body. + # @!scope class + # + # @param url [String] The optional String base URL to use as a prefix for + # all requests. Can also be the options Hash. + # @param params [Hash] Hash of URI query unencoded key/value pairs. + # @param headers [Hash] unencoded HTTP header key/value pairs. + # + # @example + # conn.get '/items', { page: 1 }, :accept => 'application/json' + # + # # ElasticSearch example sending a body with GET. + # conn.get '/twitter/tweet/_search' do |req| + # req.headers[:content_type] = 'application/json' + # req.params[:routing] = 'kimchy' + # req.body = JSON.generate(query: {...}) + # end + # + # @yield [Faraday::Request] for further request customizations + # @return [Faraday::Response] + + # @!method head(url = nil, params = nil, headers = nil) + # Makes a HEAD HTTP request without a body. + # @!scope class + # + # @param url [String] The optional String base URL to use as a prefix for + # all requests. Can also be the options Hash. + # @param params [Hash] Hash of URI query unencoded key/value pairs. + # @param headers [Hash] unencoded HTTP header key/value pairs. + # + # @example + # conn.head '/items/1' + # + # @yield [Faraday::Request] for further request customizations + # @return [Faraday::Response] + + # @!method delete(url = nil, params = nil, headers = nil) + # Makes a DELETE HTTP request without a body. + # @!scope class + # + # @param url [String] The optional String base URL to use as a prefix for + # all requests. Can also be the options Hash. + # @param params [Hash] Hash of URI query unencoded key/value pairs. + # @param headers [Hash] unencoded HTTP header key/value pairs. + # + # @example + # conn.delete '/items/1' + # + # @yield [Faraday::Request] for further request customizations + # @return [Faraday::Response] + + # @!method trace(url = nil, params = nil, headers = nil) + # Makes a TRACE HTTP request without a body. + # @!scope class + # + # @param url [String] The optional String base URL to use as a prefix for + # all requests. Can also be the options Hash. + # @param params [Hash] Hash of URI query unencoded key/value pairs. + # @param headers [Hash] unencoded HTTP header key/value pairs. + # + # @example + # conn.connect '/items/1' + # + # @yield [Faraday::Request] for further request customizations + # @return [Faraday::Response] + + # @!visibility private + METHODS_WITH_QUERY.each do |method| + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(url = nil, params = nil, headers = nil) + run_request(:#{method}, url, nil, headers) do |request| + request.params.update(params) if params + yield request if block_given? + end + end + RUBY + end + + # @overload options() + # Returns current Connection options. + # + # @overload options(url, params = nil, headers = nil) + # Makes an OPTIONS HTTP request to the given URL. + # @param url [String] String base URL to sue as a prefix for all requests. + # @param params [Hash] Hash of URI query unencoded key/value pairs. + # @param headers [Hash] unencoded HTTP header key/value pairs. + # + # @example + # conn.options '/items/1' + # + # @yield [Faraday::Request] for further request customizations + # @return [Faraday::Response] + def options(*args) + return @options if args.size.zero? + + url, params, headers = *args + run_request(:options, url, nil, headers) do |request| + request.params.update(params) if params + yield request if block_given? + end + end + + # @!method post(url = nil, body = nil, headers = nil) + # Makes a POST HTTP request with a body. + # @!scope class + # + # @param url [String] The optional String base URL to use as a prefix for + # all requests. Can also be the options Hash. + # @param body [String] body for the request. + # @param headers [Hash] unencoded HTTP header key/value pairs. + # + # @example + # conn.post '/items', data, content_type: 'application/json' + # + # # Simple ElasticSearch indexing sample. + # conn.post '/twitter/tweet' do |req| + # req.headers[:content_type] = 'application/json' + # req.params[:routing] = 'kimchy' + # req.body = JSON.generate(user: 'kimchy', ...) + # end + # + # @yield [Faraday::Request] for further request customizations + # @return [Faraday::Response] + + # @!method put(url = nil, body = nil, headers = nil) + # Makes a PUT HTTP request with a body. + # @!scope class + # + # @param url [String] The optional String base URL to use as a prefix for + # all requests. Can also be the options Hash. + # @param body [String] body for the request. + # @param headers [Hash] unencoded HTTP header key/value pairs. + # + # @example + # # TODO: Make it a PUT example + # conn.post '/items', data, content_type: 'application/json' + # + # # Simple ElasticSearch indexing sample. + # conn.post '/twitter/tweet' do |req| + # req.headers[:content_type] = 'application/json' + # req.params[:routing] = 'kimchy' + # req.body = JSON.generate(user: 'kimchy', ...) + # end + # + # @yield [Faraday::Request] for further request customizations + # @return [Faraday::Response] + + # @!visibility private + METHODS_WITH_BODY.each do |method| + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(url = nil, body = nil, headers = nil, &block) + run_request(:#{method}, url, body, headers, &block) + end + RUBY + end + + # Sets up the Authorization header with these credentials, encoded + # with base64. + # + # @param login [String] The authentication login. + # @param pass [String] The authentication password. + # + # @example + # + # conn.basic_auth 'Aladdin', 'open sesame' + # conn.headers['Authorization'] + # # => "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" + # + # @return [void] + def basic_auth(login, pass) + set_authorization_header(:basic_auth, login, pass) + end + + # Sets up the Authorization header with the given token. + # + # @param token [String] + # @param options [Hash] extra token options. + # + # @example + # + # conn.token_auth 'abcdef', foo: 'bar' + # conn.headers['Authorization'] + # # => "Token token=\"abcdef\", + # foo=\"bar\"" + # + # @return [void] + def token_auth(token, options = nil) + set_authorization_header(:token_auth, token, options) + end + + # Sets up a custom Authorization header. + # + # @param type [String] authorization type + # @param token [String, Hash] token. A String value is taken literally, and + # a Hash is encoded into comma-separated key/value pairs. + # + # @example + # + # conn.authorization :Bearer, 'mF_9.B5f-4.1JqM' + # conn.headers['Authorization'] + # # => "Bearer mF_9.B5f-4.1JqM" + # + # conn.authorization :Token, token: 'abcdef', foo: 'bar' + # conn.headers['Authorization'] + # # => "Token token=\"abcdef\", + # foo=\"bar\"" + # + # @return [void] + def authorization(type, token) + set_authorization_header(:authorization, type, token) + end + + # Check if the adapter is parallel-capable. + # + # @yield if the adapter isn't parallel-capable, or if no adapter is set yet. + # + # @return [Object, nil] a parallel manager or nil if yielded + # @api private + def default_parallel_manager + @default_parallel_manager ||= begin + adapter = @builder.adapter.klass if @builder.adapter + + if support_parallel?(adapter) + adapter.setup_parallel_manager + elsif block_given? + yield + end + end + end + + # Determine if this Faraday::Connection can make parallel requests. + # + # @return [Boolean] + def in_parallel? + !!@parallel_manager + end + + # Sets up the parallel manager to make a set of requests. + # + # @param manager [Object] The parallel manager that this Connection's + # Adapter uses. + # + # @yield a block to execute multiple requests. + # @return [void] + def in_parallel(manager = nil) + @parallel_manager = manager || default_parallel_manager do + warn 'Warning: `in_parallel` called but no parallel-capable adapter ' \ + 'on Faraday stack' + warn caller[2, 10].join("\n") + nil + end + yield + @parallel_manager&.run + ensure + @parallel_manager = nil + end + + # Sets the Hash proxy options. + # + # @param new_value [Object] + def proxy=(new_value) + @manual_proxy = true + @proxy = new_value ? ProxyOptions.from(new_value) : nil + end + + def_delegators :url_prefix, :scheme, :scheme=, :host, :host=, :port, :port= + def_delegator :url_prefix, :path, :path_prefix + + # Parses the given URL with URI and stores the individual + # components in this connection. These components serve as defaults for + # requests made by this connection. + # + # @param url [String, URI] + # @param encoder [Object] + # + # @example + # + # conn = Faraday::Connection.new { ... } + # conn.url_prefix = "https://sushi.com/api" + # conn.scheme # => https + # conn.path_prefix # => "/api" + # + # conn.get("nigiri?page=2") # accesses https://sushi.com/api/nigiri + def url_prefix=(url, encoder = nil) + uri = @url_prefix = Utils.URI(url) + self.path_prefix = uri.path + + params.merge_query(uri.query, encoder) + uri.query = nil + + with_uri_credentials(uri) do |user, password| + basic_auth user, password + uri.user = uri.password = nil + end + end + + # Sets the path prefix and ensures that it always has a leading + # slash. + # + # @param value [String] + # + # @return [String] the new path prefix + def path_prefix=(value) + url_prefix.path = if value + value = "/#{value}" unless value[0, 1] == '/' + value + end + end + + # Takes a relative url for a request and combines it with the defaults + # set on the connection instance. + # + # @param url [String] + # @param extra_params [Hash] + # + # @example + # conn = Faraday::Connection.new { ... } + # conn.url_prefix = "https://sushi.com/api?token=abc" + # conn.scheme # => https + # conn.path_prefix # => "/api" + # + # conn.build_url("nigiri?page=2") + # # => https://sushi.com/api/nigiri?token=abc&page=2 + # + # conn.build_url("nigiri", page: 2) + # # => https://sushi.com/api/nigiri?token=abc&page=2 + # + def build_url(url = nil, extra_params = nil) + uri = build_exclusive_url(url) + + query_values = params.dup.merge_query(uri.query, options.params_encoder) + query_values.update(extra_params) if extra_params + uri.query = + if query_values.empty? + nil + else + query_values.to_query(options.params_encoder) + end + + uri + end + + # Builds and runs the Faraday::Request. + # + # @param method [Symbol] HTTP method. + # @param url [String, URI] String or URI to access. + # @param body [Object] The request body that will eventually be converted to + # a string. + # @param headers [Hash] unencoded HTTP header key/value pairs. + # + # @return [Faraday::Response] + def run_request(method, url, body, headers) + unless METHODS.include?(method) + raise ArgumentError, "unknown http method: #{method}" + end + + request = build_request(method) do |req| + req.options.proxy = proxy_for_request(url) + req.url(url) if url + req.headers.update(headers) if headers + req.body = body if body + yield(req) if block_given? + end + + builder.build_response(self, request) + end + + # Creates and configures the request object. + # + # @param method [Symbol] + # + # @yield [Faraday::Request] if block given + # @return [Faraday::Request] + def build_request(method) + Request.create(method) do |req| + req.params = params.dup + req.headers = headers.dup + req.options = options.dup + yield(req) if block_given? + end + end + + # Build an absolute URL based on url_prefix. + # + # @param url [String, URI] + # @param params [Faraday::Utils::ParamsHash] A Faraday::Utils::ParamsHash to + # replace the query values + # of the resulting url (default: nil). + # + # @return [URI] + def build_exclusive_url(url = nil, params = nil, params_encoder = nil) + url = nil if url.respond_to?(:empty?) && url.empty? + base = url_prefix + if url && base.path && base.path !~ %r{/$} + base = base.dup + base.path = "#{base.path}/" # ensure trailing slash + end + uri = url ? base + url : base + if params + uri.query = params.to_query(params_encoder || options.params_encoder) + end + # rubocop:disable Style/SafeNavigation + uri.query = nil if uri.query && uri.query.empty? + # rubocop:enable Style/SafeNavigation + uri + end + + # Creates a duplicate of this Faraday::Connection. + # + # @api private + # + # @return [Faraday::Connection] + def dup + self.class.new(build_exclusive_url, + headers: headers.dup, + params: params.dup, + builder: builder.dup, + ssl: ssl.dup, + request: options.dup) + end + + # Yields username and password extracted from a URI if they both exist. + # + # @param uri [URI] + # @yield [username, password] any username and password + # @yieldparam username [String] any username from URI + # @yieldparam password [String] any password from URI + # @return [void] + # @api private + def with_uri_credentials(uri) + return unless uri.user && uri.password + + yield(Utils.unescape(uri.user), Utils.unescape(uri.password)) + end + + def set_authorization_header(header_type, *args) + header = Faraday::Request + .lookup_middleware(header_type) + .header(*args) + + headers[Faraday::Request::Authorization::KEY] = header + end + + def proxy_from_env(url) + return if Faraday.ignore_env_proxy + + uri = nil + if URI.parse('').respond_to?(:find_proxy) + case url + when String + uri = Utils.URI(url) + uri = URI.parse("#{uri.scheme}://#{uri.hostname}").find_proxy + when URI + uri = url.find_proxy + when nil + uri = find_default_proxy + end + else + warn 'no_proxy is unsupported' if ENV['no_proxy'] || ENV['NO_PROXY'] + uri = find_default_proxy + end + ProxyOptions.from(uri) if uri + end + + def find_default_proxy + uri = ENV['http_proxy'] + return unless uri && !uri.empty? + + uri = "http://#{uri}" unless uri.match?(/^http/i) + uri + end + + def proxy_for_request(url) + return proxy if @manual_proxy + + if url && Utils.URI(url).absolute? + proxy_from_env(url) + else + proxy + end + end + + def support_parallel?(adapter) + adapter&.respond_to?(:supports_parallel?) && adapter&.supports_parallel? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/dependency_loader.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/dependency_loader.rb new file mode 100644 index 000000000000..57345646d4a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/dependency_loader.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module Faraday + # DependencyLoader helps Faraday adapters and middleware load dependencies. + module DependencyLoader + attr_reader :load_error + + # Executes a block which should try to require and reference dependent + # libraries + def dependency(lib = nil) + lib ? require(lib) : yield + rescue LoadError, NameError => e + self.load_error = e + end + + def new(*) + unless loaded? + raise "missing dependency for #{self}: #{load_error.message}" + end + + super + end + + def loaded? + load_error.nil? + end + + def inherited(subclass) + super + subclass.send(:load_error=, load_error) + end + + private + + attr_writer :load_error + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/encoders/flat_params_encoder.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/encoders/flat_params_encoder.rb new file mode 100644 index 000000000000..bc10c8b9a5b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/encoders/flat_params_encoder.rb @@ -0,0 +1,105 @@ +# frozen_string_literal: true + +module Faraday + # FlatParamsEncoder manages URI params as a flat hash. Any Array values repeat + # the parameter multiple times. + module FlatParamsEncoder + class << self + extend Forwardable + def_delegators :'Faraday::Utils', :escape, :unescape + end + + # Encode converts the given param into a URI querystring. Keys and values + # will converted to strings and appropriately escaped for the URI. + # + # @param params [Hash] query arguments to convert. + # + # @example + # + # encode({a: %w[one two three], b: true, c: "C"}) + # # => 'a=one&a=two&a=three&b=true&c=C' + # + # @return [String] the URI querystring (without the leading '?') + def self.encode(params) + return nil if params.nil? + + unless params.is_a?(Array) + unless params.respond_to?(:to_hash) + raise TypeError, + "Can't convert #{params.class} into Hash." + end + params = params.to_hash + params = params.map do |key, value| + key = key.to_s if key.is_a?(Symbol) + [key, value] + end + + # Only to be used for non-Array inputs. Arrays should preserve order. + params.sort! if @sort_params + end + + # The params have form [['key1', 'value1'], ['key2', 'value2']]. + buffer = +'' + params.each do |key, value| + encoded_key = escape(key) + if value.nil? + buffer << "#{encoded_key}&" + elsif value.is_a?(Array) + if value.empty? + buffer << "#{encoded_key}=&" + else + value.each do |sub_value| + encoded_value = escape(sub_value) + buffer << "#{encoded_key}=#{encoded_value}&" + end + end + else + encoded_value = escape(value) + buffer << "#{encoded_key}=#{encoded_value}&" + end + end + buffer.chop + end + + # Decode converts the given URI querystring into a hash. + # + # @param query [String] query arguments to parse. + # + # @example + # + # decode('a=one&a=two&a=three&b=true&c=C') + # # => {"a"=>["one", "two", "three"], "b"=>"true", "c"=>"C"} + # + # @return [Hash] parsed keys and value strings from the querystring. + def self.decode(query) + return nil if query.nil? + + empty_accumulator = {} + + split_query = (query.split('&').map do |pair| + pair.split('=', 2) if pair && !pair.empty? + end).compact + split_query.each_with_object(empty_accumulator.dup) do |pair, accu| + pair[0] = unescape(pair[0]) + pair[1] = true if pair[1].nil? + if pair[1].respond_to?(:to_str) + pair[1] = unescape(pair[1].to_str.tr('+', ' ')) + end + if accu[pair[0]].is_a?(Array) + accu[pair[0]] << pair[1] + elsif accu[pair[0]] + accu[pair[0]] = [accu[pair[0]], pair[1]] + else + accu[pair[0]] = pair[1] + end + end + end + + class << self + attr_accessor :sort_params + end + + # Useful default for OAuth and caching. + @sort_params = true + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/encoders/nested_params_encoder.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/encoders/nested_params_encoder.rb new file mode 100644 index 000000000000..705cd3e507c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/encoders/nested_params_encoder.rb @@ -0,0 +1,176 @@ +# frozen_string_literal: true + +module Faraday + # Sub-module for encoding parameters into query-string. + module EncodeMethods + # @param params [nil, Array, #to_hash] parameters to be encoded + # + # @return [String] the encoded params + # + # @raise [TypeError] if params can not be converted to a Hash + def encode(params) + return nil if params.nil? + + unless params.is_a?(Array) + unless params.respond_to?(:to_hash) + raise TypeError, "Can't convert #{params.class} into Hash." + end + + params = params.to_hash + params = params.map do |key, value| + key = key.to_s if key.is_a?(Symbol) + [key, value] + end + + # Only to be used for non-Array inputs. Arrays should preserve order. + params.sort! if @sort_params + end + + # The params have form [['key1', 'value1'], ['key2', 'value2']]. + buffer = +'' + params.each do |parent, value| + encoded_parent = escape(parent) + buffer << "#{encode_pair(encoded_parent, value)}&" + end + buffer.chop + end + + protected + + def encode_pair(parent, value) + if value.is_a?(Hash) + encode_hash(parent, value) + elsif value.is_a?(Array) + encode_array(parent, value) + elsif value.nil? + parent + else + encoded_value = escape(value) + "#{parent}=#{encoded_value}" + end + end + + def encode_hash(parent, value) + value = value.map { |key, val| [escape(key), val] }.sort + + buffer = +'' + value.each do |key, val| + new_parent = "#{parent}%5B#{key}%5D" + buffer << "#{encode_pair(new_parent, val)}&" + end + buffer.chop + end + + def encode_array(parent, value) + new_parent = "#{parent}%5B%5D" + return new_parent if value.empty? + + buffer = +'' + value.each { |val| buffer << "#{encode_pair(new_parent, val)}&" } + buffer.chop + end + end + + # Sub-module for decoding query-string into parameters. + module DecodeMethods + # @param query [nil, String] + # + # @return [Array<Array, String>] the decoded params + # + # @raise [TypeError] if the nesting is incorrect + def decode(query) + return nil if query.nil? + + params = {} + query.split('&').each do |pair| + next if pair.empty? + + key, value = pair.split('=', 2) + key = unescape(key) + value = unescape(value.tr('+', ' ')) if value + decode_pair(key, value, params) + end + + dehash(params, 0) + end + + protected + + SUBKEYS_REGEX = /[^\[\]]+(?:\]?\[\])?/.freeze + + def decode_pair(key, value, context) + subkeys = key.scan(SUBKEYS_REGEX) + subkeys.each_with_index do |subkey, i| + is_array = subkey =~ /[\[\]]+\Z/ + subkey = $` if is_array + last_subkey = i == subkeys.length - 1 + + context = prepare_context(context, subkey, is_array, last_subkey) + add_to_context(is_array, context, value, subkey) if last_subkey + end + end + + def prepare_context(context, subkey, is_array, last_subkey) + if !last_subkey || is_array + context = new_context(subkey, is_array, context) + end + if context.is_a?(Array) && !is_array + context = match_context(context, subkey) + end + context + end + + def new_context(subkey, is_array, context) + value_type = is_array ? Array : Hash + if context[subkey] && !context[subkey].is_a?(value_type) + raise TypeError, "expected #{value_type.name} " \ + "(got #{context[subkey].class.name}) for param `#{subkey}'" + end + + context[subkey] ||= value_type.new + end + + def match_context(context, subkey) + context << {} if !context.last.is_a?(Hash) || context.last.key?(subkey) + context.last + end + + def add_to_context(is_array, context, value, subkey) + is_array ? context << value : context[subkey] = value + end + + # Internal: convert a nested hash with purely numeric keys into an array. + # FIXME: this is not compatible with Rack::Utils.parse_nested_query + # @!visibility private + def dehash(hash, depth) + hash.each do |key, value| + hash[key] = dehash(value, depth + 1) if value.is_a?(Hash) + end + + if depth.positive? && !hash.empty? && hash.keys.all? { |k| k =~ /^\d+$/ } + hash.sort.map(&:last) + else + hash + end + end + end + + # This is the default encoder for Faraday requests. + # Using this encoder, parameters will be encoded respecting their structure, + # so you can send objects such as Arrays or Hashes as parameters + # for your requests. + module NestedParamsEncoder + class << self + attr_accessor :sort_params + + extend Forwardable + def_delegators :'Faraday::Utils', :escape, :unescape + end + + # Useful default for OAuth and caching. + @sort_params = true + + extend EncodeMethods + extend DecodeMethods + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/error.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/error.rb new file mode 100644 index 000000000000..a201abcf75b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/error.rb @@ -0,0 +1,152 @@ +# frozen_string_literal: true + +# Faraday namespace. +module Faraday + # Faraday error base class. + class Error < StandardError + attr_reader :response, :wrapped_exception + + def initialize(exc, response = nil) + @wrapped_exception = nil unless defined?(@wrapped_exception) + @response = nil unless defined?(@response) + super(exc_msg_and_response!(exc, response)) + end + + def backtrace + if @wrapped_exception + @wrapped_exception.backtrace + else + super + end + end + + def inspect + inner = +'' + inner << " wrapped=#{@wrapped_exception.inspect}" if @wrapped_exception + inner << " response=#{@response.inspect}" if @response + inner << " #{super}" if inner.empty? + %(#<#{self.class}#{inner}>) + end + + def response_status + @response[:status] if @response + end + + def response_headers + @response[:headers] if @response + end + + def response_body + @response[:body] if @response + end + + protected + + # Pulls out potential parent exception and response hash, storing them in + # instance variables. + # exc - Either an Exception, a string message, or a response hash. + # response - Hash + # :status - Optional integer HTTP response status + # :headers - String key/value hash of HTTP response header + # values. + # :body - Optional string HTTP response body. + # :request - Hash + # :method - Symbol with the request HTTP method. + # :url_path - String with the url path requested. + # :params - String key/value hash of query params + # present in the request. + # :headers - String key/value hash of HTTP request + # header values. + # :body - String HTTP request body. + # + # If a subclass has to call this, then it should pass a string message + # to `super`. See NilStatusError. + def exc_msg_and_response!(exc, response = nil) + if @response.nil? && @wrapped_exception.nil? + @wrapped_exception, msg, @response = exc_msg_and_response(exc, response) + return msg + end + + exc.to_s + end + + # Pulls out potential parent exception and response hash. + def exc_msg_and_response(exc, response = nil) + return [exc, exc.message, response] if exc.respond_to?(:backtrace) + + return [nil, "the server responded with status #{exc[:status]}", exc] \ + if exc.respond_to?(:each_key) + + [nil, exc.to_s, response] + end + end + + # Faraday client error class. Represents 4xx status responses. + class ClientError < Error + end + + # Raised by Faraday::Response::RaiseError in case of a 400 response. + class BadRequestError < ClientError + end + + # Raised by Faraday::Response::RaiseError in case of a 401 response. + class UnauthorizedError < ClientError + end + + # Raised by Faraday::Response::RaiseError in case of a 403 response. + class ForbiddenError < ClientError + end + + # Raised by Faraday::Response::RaiseError in case of a 404 response. + class ResourceNotFound < ClientError + end + + # Raised by Faraday::Response::RaiseError in case of a 407 response. + class ProxyAuthError < ClientError + end + + # Raised by Faraday::Response::RaiseError in case of a 409 response. + class ConflictError < ClientError + end + + # Raised by Faraday::Response::RaiseError in case of a 422 response. + class UnprocessableEntityError < ClientError + end + + # Faraday server error class. Represents 5xx status responses. + class ServerError < Error + end + + # A unified client error for timeouts. + class TimeoutError < ServerError + def initialize(exc = 'timeout', response = nil) + super(exc, response) + end + end + + # Raised by Faraday::Response::RaiseError in case of a nil status in response. + class NilStatusError < ServerError + def initialize(exc, response = nil) + exc_msg_and_response!(exc, response) + super('http status could not be derived from the server response') + end + end + + # A unified error for failed connections. + class ConnectionFailed < Error + end + + # A unified client error for SSL errors. + class SSLError < Error + end + + # Raised by FaradayMiddleware::ResponseMiddleware + class ParsingError < Error + end + + # Exception used to control the Retry middleware. + # + # @see Faraday::Request::Retry + class RetriableResponse < Error + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/file_part.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/file_part.rb new file mode 100644 index 000000000000..d7c2c270b6dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/file_part.rb @@ -0,0 +1,128 @@ +# frozen_string_literal: true + +require 'stringio' + +# multipart-post gem +require 'composite_io' +require 'parts' + +module Faraday + # Multipart value used to POST a binary data from a file or + # + # @example + # payload = { file: Faraday::FilePart.new("file_name.ext", "content/type") } + # http.post("/upload", payload) + # + + # @!method initialize(filename_or_io, content_type, filename = nil, opts = {}) + # + # @param filename_or_io [String, IO] Either a String filename to a local + # file or an open IO object. + # @param content_type [String] String content type of the file data. + # @param filename [String] Optional String filename, usually to add context + # to a given IO object. + # @param opts [Hash] Optional Hash of String key/value pairs to describethis + # this uploaded file. Expected Header keys include: + # * Content-Transfer-Encoding - Defaults to "binary" + # * Content-Disposition - Defaults to "form-data" + # * Content-Type - Defaults to the content_type argument. + # * Content-ID - Optional. + # + # @return [Faraday::FilePart] + # + # @!attribute [r] content_type + # The uploaded binary data's content type. + # + # @return [String] + # + # @!attribute [r] original_filename + # The base filename, taken either from the filename_or_io or filename + # arguments in #initialize. + # + # @return [String] + # + # @!attribute [r] opts + # Extra String key/value pairs to make up the header for this uploaded file. + # + # @return [Hash] + # + # @!attribute [r] io + # The open IO object for the uploaded file. + # + # @return [IO] + FilePart = ::UploadIO + + # Multipart value used to POST a file. + # + # @deprecated Use FilePart instead of this class. It behaves identically, with + # a matching name to ParamPart. + UploadIO = ::UploadIO + + Parts = ::Parts + + # Similar to, but not compatible with CompositeReadIO provided by the + # multipart-post gem. + # https://github.com/nicksieger/multipart-post/blob/master/lib/composite_io.rb + class CompositeReadIO + def initialize(*parts) + @parts = parts.flatten + @ios = @parts.map(&:to_io) + @index = 0 + end + + # @return [Integer] sum of the lengths of all the parts + def length + @parts.inject(0) { |sum, part| sum + part.length } + end + + # Rewind each of the IOs and reset the index to 0. + # + # @return [void] + def rewind + @ios.each(&:rewind) + @index = 0 + end + + # Read from IOs in order until `length` bytes have been received. + # + # @param length [Integer, nil] + # @param outbuf [String, nil] + def read(length = nil, outbuf = nil) + got_result = false + outbuf = outbuf ? (+outbuf).replace('') : +'' + + while (io = current_io) + if (result = io.read(length)) + got_result ||= !result.nil? + result.force_encoding('BINARY') if result.respond_to?(:force_encoding) + outbuf << result + length -= result.length if length + break if length&.zero? + end + advance_io + end + !got_result && length ? nil : outbuf + end + + # Close each of the IOs. + # + # @return [void] + def close + @ios.each(&:close) + end + + def ensure_open_and_readable + # Rubinius compatibility + end + + private + + def current_io + @ios[@index] + end + + def advance_io + @index += 1 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/logging/formatter.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/logging/formatter.rb new file mode 100644 index 000000000000..ba3e497651de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/logging/formatter.rb @@ -0,0 +1,105 @@ +# frozen_string_literal: true + +require 'pp' +module Faraday + module Logging + # Serves as an integration point to customize logging + class Formatter + extend Forwardable + + DEFAULT_OPTIONS = { headers: true, bodies: false, + log_level: :info }.freeze + + def initialize(logger:, options:) + @logger = logger + @filter = [] + @options = DEFAULT_OPTIONS.merge(options) + end + + def_delegators :@logger, :debug, :info, :warn, :error, :fatal + + def request(env) + request_log = proc do + "#{env.method.upcase} #{apply_filters(env.url.to_s)}" + end + public_send(log_level, 'request', &request_log) + + log_headers('request', env.request_headers) if log_headers?(:request) + log_body('request', env[:body]) if env[:body] && log_body?(:request) + end + + def response(env) + status = proc { "Status #{env.status}" } + public_send(log_level, 'response', &status) + + log_headers('response', env.response_headers) if log_headers?(:response) + log_body('response', env[:body]) if env[:body] && log_body?(:response) + end + + def filter(filter_word, filter_replacement) + @filter.push([filter_word, filter_replacement]) + end + + private + + def dump_headers(headers) + headers.map { |k, v| "#{k}: #{v.inspect}" }.join("\n") + end + + def dump_body(body) + if body.respond_to?(:to_str) + body.to_str + else + pretty_inspect(body) + end + end + + def pretty_inspect(body) + body.pretty_inspect + end + + def log_headers?(type) + case @options[:headers] + when Hash + @options[:headers][type] + else + @options[:headers] + end + end + + def log_body?(type) + case @options[:bodies] + when Hash + @options[:bodies][type] + else + @options[:bodies] + end + end + + def apply_filters(output) + @filter.each do |pattern, replacement| + output = output.to_s.gsub(pattern, replacement) + end + output + end + + def log_level + unless %i[debug info warn error fatal].include?(@options[:log_level]) + return :info + end + + @options[:log_level] + end + + def log_headers(type, headers) + headers_log = proc { apply_filters(dump_headers(headers)) } + public_send(log_level, type, &headers_log) + end + + def log_body(type, body) + body_log = proc { apply_filters(dump_body(body)) } + public_send(log_level, type, &body_log) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/methods.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/methods.rb new file mode 100644 index 000000000000..53e39037938f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/methods.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +module Faraday + METHODS_WITH_QUERY = %w[get head delete trace].freeze + METHODS_WITH_BODY = %w[post put patch].freeze +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/middleware.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/middleware.rb new file mode 100644 index 000000000000..fcf9f4fa0324 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/middleware.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Faraday + # Middleware is the basic base class of any Faraday middleware. + class Middleware + extend MiddlewareRegistry + extend DependencyLoader + + attr_reader :app, :options + + def initialize(app = nil, options = {}) + @app = app + @options = options + end + + def call(env) + on_request(env) if respond_to?(:on_request) + app.call(env).on_complete do |environment| + on_complete(environment) if respond_to?(:on_complete) + end + end + + def close + if app.respond_to?(:close) + app.close + else + warn "#{app} does not implement \#close!" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/middleware_registry.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/middleware_registry.rb new file mode 100644 index 000000000000..021038fec4a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/middleware_registry.rb @@ -0,0 +1,129 @@ +# frozen_string_literal: true + +require 'monitor' + +module Faraday + # Adds the ability for other modules to register and lookup + # middleware classes. + module MiddlewareRegistry + # Register middleware class(es) on the current module. + # + # @param autoload_path [String] Middleware autoload path + # @param mapping [Hash{ + # Symbol => Module, + # Symbol => Array<Module, Symbol, String>, + # }] Middleware mapping from a lookup symbol to a reference to the + # middleware. + # Classes can be expressed as: + # - a fully qualified constant + # - a Symbol + # - a Proc that will be lazily called to return the former + # - an array is given, its first element is the constant or symbol, + # and its second is a file to `require`. + # @return [void] + # + # @example Lookup by a constant + # + # module Faraday + # class Whatever + # # Middleware looked up by :foo returns Faraday::Whatever::Foo. + # register_middleware foo: Foo + # end + # end + # + # @example Lookup by a symbol + # + # module Faraday + # class Whatever + # # Middleware looked up by :bar returns + # # Faraday::Whatever.const_get(:Bar) + # register_middleware bar: :Bar + # end + # end + # + # @example Lookup by a symbol and string in an array + # + # module Faraday + # class Whatever + # # Middleware looked up by :baz requires 'baz' and returns + # # Faraday::Whatever.const_get(:Baz) + # register_middleware baz: [:Baz, 'baz'] + # end + # end + # + def register_middleware(autoload_path = nil, mapping = nil) + if mapping.nil? + mapping = autoload_path + autoload_path = nil + end + middleware_mutex do + @middleware_autoload_path = autoload_path if autoload_path + (@registered_middleware ||= {}).update(mapping) + end + end + + # Unregister a previously registered middleware class. + # + # @param key [Symbol] key for the registered middleware. + def unregister_middleware(key) + @registered_middleware.delete(key) + end + + # Lookup middleware class with a registered Symbol shortcut. + # + # @param key [Symbol] key for the registered middleware. + # @return [Class] a middleware Class. + # @raise [Faraday::Error] if given key is not registered + # + # @example + # + # module Faraday + # class Whatever + # register_middleware foo: Foo + # end + # end + # + # Faraday::Whatever.lookup_middleware(:foo) + # # => Faraday::Whatever::Foo + # + def lookup_middleware(key) + load_middleware(key) || + raise(Faraday::Error, "#{key.inspect} is not registered on #{self}") + end + + def middleware_mutex(&block) + @middleware_mutex ||= Monitor.new + @middleware_mutex.synchronize(&block) + end + + def fetch_middleware(key) + defined?(@registered_middleware) && @registered_middleware[key] + end + + def load_middleware(key) + value = fetch_middleware(key) + case value + when Module + value + when Symbol, String + middleware_mutex do + @registered_middleware[key] = const_get(value) + end + when Proc + middleware_mutex do + @registered_middleware[key] = value.call + end + when Array + middleware_mutex do + const, path = value + if (root = @middleware_autoload_path) + path = "#{root}/#{path}" + end + require(path) + @registered_middleware[key] = const + end + load_middleware(key) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options.rb new file mode 100644 index 000000000000..ee198d8df70e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options.rb @@ -0,0 +1,218 @@ +# frozen_string_literal: true + +module Faraday + # Subclasses Struct with some special helpers for converting from a Hash to + # a Struct. + class Options < Struct + # Public + def self.from(value) + value ? new.update(value) : new + end + + # Public + def each + return to_enum(:each) unless block_given? + + members.each do |key| + yield(key.to_sym, send(key)) + end + end + + # Public + def update(obj) + obj.each do |key, value| + sub_options = self.class.options_for(key) + if sub_options + new_value = sub_options.from(value) if value + elsif value.is_a?(Hash) + new_value = value.dup + else + new_value = value + end + + send("#{key}=", new_value) unless new_value.nil? + end + self + end + + # Public + def delete(key) + value = send(key) + send("#{key}=", nil) + value + end + + # Public + def clear + members.each { |member| delete(member) } + end + + # Public + def merge!(other) + other.each do |key, other_value| + self_value = send(key) + sub_options = self.class.options_for(key) + new_value = if self_value && sub_options && other_value + self_value.merge(other_value) + else + other_value + end + send("#{key}=", new_value) unless new_value.nil? + end + self + end + + # Public + def merge(other) + dup.merge!(other) + end + + # Public + def deep_dup + self.class.from(self) + end + + # Public + def fetch(key, *args) + unless symbolized_key_set.include?(key.to_sym) + key_setter = "#{key}=" + if !args.empty? + send(key_setter, args.first) + elsif block_given? + send(key_setter, yield(key)) + else + raise self.class.fetch_error_class, "key not found: #{key.inspect}" + end + end + send(key) + end + + # Public + def values_at(*keys) + keys.map { |key| send(key) } + end + + # Public + def keys + members.reject { |member| send(member).nil? } + end + + # Public + def empty? + keys.empty? + end + + # Public + def each_key(&block) + return to_enum(:each_key) unless block_given? + + keys.each(&block) + end + + # Public + def key?(key) + keys.include?(key) + end + + alias has_key? key? + + # Public + def each_value(&block) + return to_enum(:each_value) unless block_given? + + values.each(&block) + end + + # Public + def value?(value) + values.include?(value) + end + + alias has_value? value? + + # Public + def to_hash + hash = {} + members.each do |key| + value = send(key) + hash[key.to_sym] = value unless value.nil? + end + hash + end + + # Internal + def inspect + values = [] + members.each do |member| + value = send(member) + values << "#{member}=#{value.inspect}" if value + end + values = values.empty? ? '(empty)' : values.join(', ') + + %(#<#{self.class} #{values}>) + end + + # Internal + def self.options(mapping) + attribute_options.update(mapping) + end + + # Internal + def self.options_for(key) + attribute_options[key] + end + + # Internal + def self.attribute_options + @attribute_options ||= {} + end + + def self.memoized(key, &block) + unless block_given? + raise ArgumentError, '#memoized must be called with a block' + end + + memoized_attributes[key.to_sym] = block + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{key}() self[:#{key}]; end + RUBY + end + + def self.memoized_attributes + @memoized_attributes ||= {} + end + + def [](key) + key = key.to_sym + if (method = self.class.memoized_attributes[key]) + super(key) || (self[key] = instance_eval(&method)) + else + super + end + end + + def symbolized_key_set + @symbolized_key_set ||= Set.new(keys.map(&:to_sym)) + end + + def self.inherited(subclass) + super + subclass.attribute_options.update(attribute_options) + subclass.memoized_attributes.update(memoized_attributes) + end + + def self.fetch_error_class + @fetch_error_class ||= if Object.const_defined?(:KeyError) + ::KeyError + else + ::IndexError + end + end + end +end + +require 'faraday/options/request_options' +require 'faraday/options/ssl_options' +require 'faraday/options/proxy_options' +require 'faraday/options/connection_options' +require 'faraday/options/env' diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/connection_options.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/connection_options.rb new file mode 100644 index 000000000000..5a729406c110 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/connection_options.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Faraday + # ConnectionOptions contains the configurable properties for a Faraday + # connection object. + class ConnectionOptions < Options.new(:request, :proxy, :ssl, :builder, :url, + :parallel_manager, :params, :headers, + :builder_class) + + options request: RequestOptions, ssl: SSLOptions + + memoized(:request) { self.class.options_for(:request).new } + + memoized(:ssl) { self.class.options_for(:ssl).new } + + memoized(:builder_class) { RackBuilder } + + def new_builder(block) + builder_class.new(&block) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/env.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/env.rb new file mode 100644 index 000000000000..d7dac7178eea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/env.rb @@ -0,0 +1,181 @@ +# frozen_string_literal: true + +module Faraday + # @!attribute method + # @return [Symbol] HTTP method (`:get`, `:post`) + # + # @!attribute body + # @return [String] The request body that will eventually be converted to a + # string. + # + # @!attribute url + # @return [URI] URI instance for the current request. + # + # @!attribute request + # @return [Hash] options for configuring the request. + # Options for configuring the request. + # + # - `:timeout` open/read timeout Integer in seconds + # - `:open_timeout` - read timeout Integer in seconds + # - `:on_data` - Proc for streaming + # - `:proxy` - Hash of proxy options + # - `:uri` - Proxy Server URI + # - `:user` - Proxy server username + # - `:password` - Proxy server password + # + # @!attribute request_headers + # @return [Hash] HTTP Headers to be sent to the server. + # + # @!attribute ssl + # @return [Hash] options for configuring SSL requests + # + # @!attribute parallel_manager + # @return [Object] sent if the connection is in parallel mode + # + # @!attribute params + # @return [Hash] + # + # @!attribute response + # @return [Response] + # + # @!attribute response_headers + # @return [Hash] HTTP headers from the server + # + # @!attribute status + # @return [Integer] HTTP response status code + # + # @!attribute reason_phrase + # @return [String] + class Env < Options.new(:method, :request_body, :url, :request, + :request_headers, :ssl, :parallel_manager, :params, + :response, :response_headers, :status, + :reason_phrase, :response_body) + + # rubocop:disable Naming/ConstantName + ContentLength = 'Content-Length' + StatusesWithoutBody = Set.new [204, 304] + SuccessfulStatuses = (200..299).freeze + # rubocop:enable Naming/ConstantName + + # A Set of HTTP verbs that typically send a body. If no body is set for + # these requests, the Content-Length header is set to 0. + MethodsWithBodies = Set.new(Faraday::METHODS_WITH_BODY.map(&:to_sym)) + + options request: RequestOptions, + request_headers: Utils::Headers, response_headers: Utils::Headers + + extend Forwardable + + def_delegators :request, :params_encoder + + # Build a new Env from given value. Respects and updates `custom_members`. + # + # @param value [Object] a value fitting Option.from(v). + # @return [Env] from given value + def self.from(value) + env = super(value) + if value.respond_to?(:custom_members) + env.custom_members.update(value.custom_members) + end + env + end + + # @param key [Object] + def [](key) + return self[current_body] if key == :body + + if in_member_set?(key) + super(key) + else + custom_members[key] + end + end + + # @param key [Object] + # @param value [Object] + def []=(key, value) + if key == :body + super(current_body, value) + return + end + + if in_member_set?(key) + super(key, value) + else + custom_members[key] = value + end + end + + def current_body + !!status ? :response_body : :request_body + end + + def body + self[:body] + end + + def body=(value) + self[:body] = value + end + + # @return [Boolean] true if status is in the set of {SuccessfulStatuses}. + def success? + SuccessfulStatuses.include?(status) + end + + # @return [Boolean] true if there's no body yet, and the method is in the + # set of {MethodsWithBodies}. + def needs_body? + !body && MethodsWithBodies.include?(method) + end + + # Sets content length to zero and the body to the empty string. + def clear_body + request_headers[ContentLength] = '0' + self.body = +'' + end + + # @return [Boolean] true if the status isn't in the set of + # {StatusesWithoutBody}. + def parse_body? + !StatusesWithoutBody.include?(status) + end + + # @return [Boolean] true if there is a parallel_manager + def parallel? + !!parallel_manager + end + + def inspect + attrs = [nil] + members.each do |mem| + if (value = send(mem)) + attrs << "@#{mem}=#{value.inspect}" + end + end + attrs << "@custom=#{custom_members.inspect}" unless custom_members.empty? + %(#<#{self.class}#{attrs.join(' ')}>) + end + + # @private + def custom_members + @custom_members ||= {} + end + + # @private + if members.first.is_a?(Symbol) + def in_member_set?(key) + self.class.member_set.include?(key.to_sym) + end + else + def in_member_set?(key) + self.class.member_set.include?(key.to_s) + end + end + + # @private + def self.member_set + @member_set ||= Set.new(members) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/proxy_options.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/proxy_options.rb new file mode 100644 index 000000000000..c91dfc8d291a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/proxy_options.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module Faraday + # ProxyOptions contains the configurable properties for the proxy + # configuration used when making an HTTP request. + class ProxyOptions < Options.new(:uri, :user, :password) + extend Forwardable + def_delegators :uri, :scheme, :scheme=, :host, :host=, :port, :port=, + :path, :path= + + def self.from(value) + case value + when String + value = { uri: Utils.URI(value) } + when URI + value = { uri: value } + when Hash, Options + if (uri = value.delete(:uri)) + value[:uri] = Utils.URI(uri) + end + end + super(value) + end + + memoized(:user) { uri&.user && Utils.unescape(uri.user) } + memoized(:password) { uri&.password && Utils.unescape(uri.password) } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/request_options.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/request_options.rb new file mode 100644 index 000000000000..1a96fb8f9301 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/request_options.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Faraday + # RequestOptions contains the configurable properties for a Faraday request. + class RequestOptions < Options.new(:params_encoder, :proxy, :bind, + :timeout, :open_timeout, :read_timeout, + :write_timeout, :boundary, :oauth, + :context, :on_data) + + def []=(key, value) + if key && key.to_sym == :proxy + super(key, value ? ProxyOptions.from(value) : nil) + else + super(key, value) + end + end + + def stream_response? + on_data.is_a?(Proc) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/ssl_options.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/ssl_options.rb new file mode 100644 index 000000000000..1fa5811a91ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/options/ssl_options.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +module Faraday + # SSL-related options. + # + # @!attribute verify + # @return [Boolean] whether to verify SSL certificates or not + # + # @!attribute ca_file + # @return [String] CA file + # + # @!attribute ca_path + # @return [String] CA path + # + # @!attribute verify_mode + # @return [Integer] Any `OpenSSL::SSL::` constant (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL.html) + # + # @!attribute cert_store + # @return [OpenSSL::X509::Store] certificate store + # + # @!attribute client_cert + # @return [String, OpenSSL::X509::Certificate] client certificate + # + # @!attribute client_key + # @return [String, OpenSSL::PKey::RSA, OpenSSL::PKey::DSA] client key + # + # @!attribute certificate + # @return [OpenSSL::X509::Certificate] certificate (Excon only) + # + # @!attribute private_key + # @return [OpenSSL::PKey::RSA, OpenSSL::PKey::DSA] private key (Excon only) + # + # @!attribute verify_depth + # @return [Integer] maximum depth for the certificate chain verification + # + # @!attribute version + # @return [String, Symbol] SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-ssl_version-3D) + # + # @!attribute min_version + # @return [String, Symbol] minimum SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-min_version-3D) + # + # @!attribute max_version + # @return [String, Symbol] maximum SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-max_version-3D) + class SSLOptions < Options.new(:verify, :ca_file, :ca_path, :verify_mode, + :cert_store, :client_cert, :client_key, + :certificate, :private_key, :verify_depth, + :version, :min_version, :max_version) + + # @return [Boolean] true if should verify + def verify? + verify != false + end + + # @return [Boolean] true if should not verify + def disable? + !verify? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/param_part.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/param_part.rb new file mode 100644 index 000000000000..c1279c3596b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/param_part.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +module Faraday + # Multipart value used to POST data with a content type. + class ParamPart + # @param value [String] Uploaded content as a String. + # @param content_type [String] String content type of the value. + # @param content_id [String] Optional String of this value's Content-ID. + # + # @return [Faraday::ParamPart] + def initialize(value, content_type, content_id = nil) + @value = value + @content_type = content_type + @content_id = content_id + end + + # Converts this value to a form part. + # + # @param boundary [String] String multipart boundary that must not exist in + # the content exactly. + # @param key [String] String key name for this value. + # + # @return [Faraday::Parts::Part] + def to_part(boundary, key) + Faraday::Parts::Part.new(boundary, key, value, headers) + end + + # Returns a Hash of String key/value pairs. + # + # @return [Hash] + def headers + { + 'Content-Type' => content_type, + 'Content-ID' => content_id + } + end + + # The content to upload. + # + # @return [String] + attr_reader :value + + # The value's content type. + # + # @return [String] + attr_reader :content_type + + # The value's content ID, if given. + # + # @return [String, nil] + attr_reader :content_id + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/parameters.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/parameters.rb new file mode 100644 index 000000000000..cfb35d0858ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/parameters.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require 'forwardable' +require 'faraday/encoders/nested_params_encoder' +require 'faraday/encoders/flat_params_encoder' diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/rack_builder.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/rack_builder.rb new file mode 100644 index 000000000000..42da6347844b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/rack_builder.rb @@ -0,0 +1,249 @@ +# frozen_string_literal: true + +require 'ruby2_keywords' +require 'faraday/adapter_registry' + +module Faraday + # A Builder that processes requests into responses by passing through an inner + # middleware stack (heavily inspired by Rack). + # + # @example + # Faraday::Connection.new(url: 'http://sushi.com') do |builder| + # builder.request :url_encoded # Faraday::Request::UrlEncoded + # builder.adapter :net_http # Faraday::Adapter::NetHttp + # end + class RackBuilder + # Used to detect missing arguments + NO_ARGUMENT = Object.new + + attr_accessor :handlers + + # Error raised when trying to modify the stack after calling `lock!` + class StackLocked < RuntimeError; end + + # borrowed from ActiveSupport::Dependencies::Reference & + # ActionDispatch::MiddlewareStack::Middleware + class Handler + REGISTRY = Faraday::AdapterRegistry.new + + attr_reader :name + + ruby2_keywords def initialize(klass, *args, &block) + @name = klass.to_s + REGISTRY.set(klass) if klass.respond_to?(:name) + @args = args + @block = block + end + + def klass + REGISTRY.get(@name) + end + + def inspect + @name + end + + def ==(other) + if other.is_a? Handler + name == other.name + elsif other.respond_to? :name + klass == other + else + @name == other.to_s + end + end + + def build(app = nil) + klass.new(app, *@args, &@block) + end + end + + def initialize(handlers = [], adapter = nil, &block) + @adapter = adapter + @handlers = handlers + if block_given? + build(&block) + elsif @handlers.empty? + # default stack, if nothing else is configured + request :url_encoded + self.adapter Faraday.default_adapter + end + end + + def build(options = {}) + raise_if_locked + @handlers.clear unless options[:keep] + yield(self) if block_given? + adapter(Faraday.default_adapter) unless @adapter + end + + def [](idx) + @handlers[idx] + end + + # Locks the middleware stack to ensure no further modifications are made. + def lock! + @handlers.freeze + end + + def locked? + @handlers.frozen? + end + + ruby2_keywords def use(klass, *args, &block) + if klass.is_a? Symbol + use_symbol(Faraday::Middleware, klass, *args, &block) + else + raise_if_locked + raise_if_adapter(klass) + @handlers << self.class::Handler.new(klass, *args, &block) + end + end + + ruby2_keywords def request(key, *args, &block) + use_symbol(Faraday::Request, key, *args, &block) + end + + ruby2_keywords def response(key, *args, &block) + use_symbol(Faraday::Response, key, *args, &block) + end + + ruby2_keywords def adapter(klass = NO_ARGUMENT, *args, &block) + return @adapter if klass == NO_ARGUMENT + + klass = Faraday::Adapter.lookup_middleware(klass) if klass.is_a?(Symbol) + @adapter = self.class::Handler.new(klass, *args, &block) + end + + ## methods to push onto the various positions in the stack: + + ruby2_keywords def insert(index, *args, &block) + raise_if_locked + index = assert_index(index) + handler = self.class::Handler.new(*args, &block) + @handlers.insert(index, handler) + end + + alias insert_before insert + + ruby2_keywords def insert_after(index, *args, &block) + index = assert_index(index) + insert(index + 1, *args, &block) + end + + ruby2_keywords def swap(index, *args, &block) + raise_if_locked + index = assert_index(index) + @handlers.delete_at(index) + insert(index, *args, &block) + end + + def delete(handler) + raise_if_locked + @handlers.delete(handler) + end + + # Processes a Request into a Response by passing it through this Builder's + # middleware stack. + # + # @param connection [Faraday::Connection] + # @param request [Faraday::Request] + # + # @return [Faraday::Response] + def build_response(connection, request) + app.call(build_env(connection, request)) + end + + # The "rack app" wrapped in middleware. All requests are sent here. + # + # The builder is responsible for creating the app object. After this, + # the builder gets locked to ensure no further modifications are made + # to the middleware stack. + # + # Returns an object that responds to `call` and returns a Response. + def app + @app ||= begin + lock! + to_app + end + end + + def to_app + # last added handler is the deepest and thus closest to the inner app + # adapter is always the last one + @handlers.reverse.inject(@adapter.build) do |app, handler| + handler.build(app) + end + end + + def ==(other) + other.is_a?(self.class) && + @handlers == other.handlers && + @adapter == other.adapter + end + + def dup + self.class.new(@handlers.dup, @adapter.dup) + end + + # ENV Keys + # :http_method - a symbolized request HTTP method (:get, :post) + # :body - the request body that will eventually be converted to a string. + # :url - URI instance for the current request. + # :status - HTTP response status code + # :request_headers - hash of HTTP Headers to be sent to the server + # :response_headers - Hash of HTTP headers from the server + # :parallel_manager - sent if the connection is in parallel mode + # :request - Hash of options for configuring the request. + # :timeout - open/read timeout Integer in seconds + # :open_timeout - read timeout Integer in seconds + # :proxy - Hash of proxy options + # :uri - Proxy Server URI + # :user - Proxy server username + # :password - Proxy server password + # :ssl - Hash of options for configuring SSL requests. + def build_env(connection, request) + exclusive_url = connection.build_exclusive_url( + request.path, request.params, + request.options.params_encoder + ) + + Env.new(request.http_method, request.body, exclusive_url, + request.options, request.headers, connection.ssl, + connection.parallel_manager) + end + + private + + LOCK_ERR = "can't modify middleware stack after making a request" + + def raise_if_locked + raise StackLocked, LOCK_ERR if locked? + end + + def raise_if_adapter(klass) + return unless is_adapter?(klass) + + raise 'Adapter should be set using the `adapter` method, not `use`' + end + + def adapter_set? + !@adapter.nil? + end + + def is_adapter?(klass) # rubocop:disable Naming/PredicateName + klass <= Faraday::Adapter + end + + ruby2_keywords def use_symbol(mod, key, *args, &block) + use(mod.lookup_middleware(key), *args, &block) + end + + def assert_index(index) + idx = index.is_a?(Integer) ? index : @handlers.index(index) + raise "No such handler: #{index.inspect}" unless idx + + idx + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request.rb new file mode 100644 index 000000000000..2ee8d628f92c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request.rb @@ -0,0 +1,156 @@ +# frozen_string_literal: true + +module Faraday + # Used to setup URLs, params, headers, and the request body in a sane manner. + # + # @example + # @connection.post do |req| + # req.url 'http://localhost', 'a' => '1' # 'http://localhost?a=1' + # req.headers['b'] = '2' # Header + # req.params['c'] = '3' # GET Param + # req['b'] = '2' # also Header + # req.body = 'abc' + # end + # + # @!attribute http_method + # @return [Symbol] the HTTP method of the Request + # @!attribute path + # @return [URI, String] the path + # @!attribute params + # @return [Hash] query parameters + # @!attribute headers + # @return [Faraday::Utils::Headers] headers + # @!attribute body + # @return [Hash] body + # @!attribute options + # @return [RequestOptions] options + # + # rubocop:disable Style/StructInheritance + class Request < Struct.new( + :http_method, :path, :params, :headers, :body, :options + ) + # rubocop:enable Style/StructInheritance + + extend MiddlewareRegistry + + register_middleware File.expand_path('request', __dir__), + url_encoded: [:UrlEncoded, 'url_encoded'], + multipart: [:Multipart, 'multipart'], + retry: [:Retry, 'retry'], + authorization: [:Authorization, 'authorization'], + basic_auth: [ + :BasicAuthentication, + 'basic_authentication' + ], + token_auth: [ + :TokenAuthentication, + 'token_authentication' + ], + instrumentation: [:Instrumentation, 'instrumentation'] + + # @param request_method [String] + # @yield [request] for block customization, if block given + # @yieldparam request [Request] + # @return [Request] + def self.create(request_method) + new(request_method).tap do |request| + yield(request) if block_given? + end + end + + def method + warn <<~TEXT + WARNING: `Faraday::Request##{__method__}` is deprecated; use `#http_method` instead. It will be removed in or after version 2.0. + `Faraday::Request##{__method__}` called from #{caller_locations(1..1).first} + TEXT + http_method + end + + # Replace params, preserving the existing hash type. + # + # @param hash [Hash] new params + def params=(hash) + if params + params.replace hash + else + super + end + end + + # Replace request headers, preserving the existing hash type. + # + # @param hash [Hash] new headers + def headers=(hash) + if headers + headers.replace hash + else + super + end + end + + # Update path and params. + # + # @param path [URI, String] + # @param params [Hash, nil] + # @return [void] + def url(path, params = nil) + if path.respond_to? :query + if (query = path.query) + path = path.dup + path.query = nil + end + else + anchor_index = path.index('#') + path = path.slice(0, anchor_index) unless anchor_index.nil? + path, query = path.split('?', 2) + end + self.path = path + self.params.merge_query query, options.params_encoder + self.params.update(params) if params + end + + # @param key [Object] key to look up in headers + # @return [Object] value of the given header name + def [](key) + headers[key] + end + + # @param key [Object] key of header to write + # @param value [Object] value of header + def []=(key, value) + headers[key] = value + end + + # Marshal serialization support. + # + # @return [Hash] the hash ready to be serialized in Marshal. + def marshal_dump + { + http_method: http_method, + body: body, + headers: headers, + path: path, + params: params, + options: options + } + end + + # Marshal serialization support. + # Restores the instance variables according to the +serialised+. + # @param serialised [Hash] the serialised object. + def marshal_load(serialised) + self.http_method = serialised[:http_method] + self.body = serialised[:body] + self.headers = serialised[:headers] + self.path = serialised[:path] + self.params = serialised[:params] + self.options = serialised[:options] + end + + # @return [Env] the Env for this Request + def to_env(connection) + Env.new(http_method, body, connection.build_exclusive_url(path, params), + options, headers, connection.ssl, connection.parallel_manager) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/authorization.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/authorization.rb new file mode 100644 index 000000000000..f9b56c87140b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/authorization.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module Faraday + class Request + # Request middleware for the Authorization HTTP header + class Authorization < Faraday::Middleware + unless defined?(::Faraday::Request::Authorization::KEY) + KEY = 'Authorization' + end + + # @param type [String, Symbol] + # @param token [String, Symbol, Hash] + # @return [String] a header value + def self.header(type, token) + case token + when String, Symbol + "#{type} #{token}" + when Hash + build_hash(type.to_s, token) + else + raise ArgumentError, + "Can't build an Authorization #{type}" \ + "header from #{token.inspect}" + end + end + + # @param type [String] + # @param hash [Hash] + # @return [String] type followed by comma-separated key=value pairs + # @api private + def self.build_hash(type, hash) + comma = ', ' + values = [] + hash.each do |key, value| + values << "#{key}=#{value.to_s.inspect}" + end + "#{type} #{values * comma}" + end + + # @param app [#call] + # @param type [String, Symbol] Type of Authorization + # @param token [String, Symbol, Hash] Token value for the Authorization + def initialize(app, type, token) + @header_value = self.class.header(type, token) + super(app) + end + + # @param env [Faraday::Env] + def call(env) + env.request_headers[KEY] = @header_value unless env.request_headers[KEY] + @app.call(env) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/basic_authentication.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/basic_authentication.rb new file mode 100644 index 000000000000..61c9a5bc38c2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/basic_authentication.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require 'base64' + +module Faraday + class Request + # Authorization middleware for Basic Authentication. + class BasicAuthentication < load_middleware(:authorization) + # @param login [String] + # @param pass [String] + # + # @return [String] a Basic Authentication header line + def self.header(login, pass) + value = Base64.encode64([login, pass].join(':')) + value.delete!("\n") + super(:Basic, value) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/instrumentation.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/instrumentation.rb new file mode 100644 index 000000000000..a24442f3a41c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/instrumentation.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +module Faraday + class Request + # Middleware for instrumenting Requests. + class Instrumentation < Faraday::Middleware + # Options class used in Request::Instrumentation class. + class Options < Faraday::Options.new(:name, :instrumenter) + # @return [String] + def name + self[:name] ||= 'request.faraday' + end + + # @return [Class] + def instrumenter + self[:instrumenter] ||= ActiveSupport::Notifications + end + end + + # Instruments requests using Active Support. + # + # Measures time spent only for synchronous requests. + # + # @example Using ActiveSupport::Notifications to measure time spent + # for Faraday requests. + # ActiveSupport::Notifications + # .subscribe('request.faraday') do |name, starts, ends, _, env| + # url = env[:url] + # http_method = env[:method].to_s.upcase + # duration = ends - starts + # $stderr.puts '[%s] %s %s (%.3f s)' % + # [url.host, http_method, url.request_uri, duration] + # end + # @param app [#call] + # @param options [nil, Hash] Options hash + # @option options [String] :name ('request.faraday') + # Name of the instrumenter + # @option options [Class] :instrumenter (ActiveSupport::Notifications) + # Active Support instrumenter class. + def initialize(app, options = nil) + super(app) + @name, @instrumenter = Options.from(options) + .values_at(:name, :instrumenter) + end + + # @param env [Faraday::Env] + def call(env) + @instrumenter.instrument(@name, env) do + @app.call(env) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/multipart.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/multipart.rb new file mode 100644 index 000000000000..1f96c8d96cee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/multipart.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +require File.expand_path('url_encoded', __dir__) +require 'securerandom' + +module Faraday + class Request + # Middleware for supporting multi-part requests. + class Multipart < UrlEncoded + self.mime_type = 'multipart/form-data' + unless defined?(::Faraday::Request::Multipart::DEFAULT_BOUNDARY_PREFIX) + DEFAULT_BOUNDARY_PREFIX = '-----------RubyMultipartPost' + end + + def initialize(app = nil, options = {}) + super(app) + @options = options + end + + # Checks for files in the payload, otherwise leaves everything untouched. + # + # @param env [Faraday::Env] + def call(env) + match_content_type(env) do |params| + env.request.boundary ||= unique_boundary + env.request_headers[CONTENT_TYPE] += + "; boundary=#{env.request.boundary}" + env.body = create_multipart(env, params) + end + @app.call env + end + + # @param env [Faraday::Env] + def process_request?(env) + type = request_type(env) + env.body.respond_to?(:each_key) && !env.body.empty? && ( + (type.empty? && has_multipart?(env.body)) || + (type == self.class.mime_type) + ) + end + + # Returns true if obj is an enumerable with values that are multipart. + # + # @param obj [Object] + # @return [Boolean] + def has_multipart?(obj) # rubocop:disable Naming/PredicateName + if obj.respond_to?(:each) + (obj.respond_to?(:values) ? obj.values : obj).each do |val| + return true if val.respond_to?(:content_type) || has_multipart?(val) + end + end + false + end + + # @param env [Faraday::Env] + # @param params [Hash] + def create_multipart(env, params) + boundary = env.request.boundary + parts = process_params(params) do |key, value| + part(boundary, key, value) + end + parts << Faraday::Parts::EpiloguePart.new(boundary) + + body = Faraday::CompositeReadIO.new(parts) + env.request_headers[Faraday::Env::ContentLength] = body.length.to_s + body + end + + def part(boundary, key, value) + if value.respond_to?(:to_part) + value.to_part(boundary, key) + else + Faraday::Parts::Part.new(boundary, key, value) + end + end + + # @return [String] + def unique_boundary + "#{DEFAULT_BOUNDARY_PREFIX}-#{SecureRandom.hex}" + end + + # @param params [Hash] + # @param prefix [String] + # @param pieces [Array] + def process_params(params, prefix = nil, pieces = nil, &block) + params.inject(pieces || []) do |all, (key, value)| + if prefix + key = @options[:flat_encode] ? prefix.to_s : "#{prefix}[#{key}]" + end + + case value + when Array + values = value.inject([]) { |a, v| a << [nil, v] } + process_params(values, key, all, &block) + when Hash + process_params(value, key, all, &block) + else + # rubocop:disable Performance/RedundantBlockCall + all << block.call(key, value) + # rubocop:enable Performance/RedundantBlockCall + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/retry.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/retry.rb new file mode 100644 index 000000000000..312af1c8dbda --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/retry.rb @@ -0,0 +1,239 @@ +# frozen_string_literal: true + +module Faraday + class Request + # Catches exceptions and retries each request a limited number of times. + # + # By default, it retries 2 times and handles only timeout exceptions. It can + # be configured with an arbitrary number of retries, a list of exceptions to + # handle, a retry interval, a percentage of randomness to add to the retry + # interval, and a backoff factor. + # + # @example Configure Retry middleware using intervals + # Faraday.new do |conn| + # conn.request(:retry, max: 2, + # interval: 0.05, + # interval_randomness: 0.5, + # backoff_factor: 2, + # exceptions: [CustomException, 'Timeout::Error']) + # + # conn.adapter(:net_http) # NB: Last middleware must be the adapter + # end + # + # This example will result in a first interval that is random between 0.05 + # and 0.075 and a second interval that is random between 0.1 and 0.125. + class Retry < Faraday::Middleware + DEFAULT_EXCEPTIONS = [ + Errno::ETIMEDOUT, 'Timeout::Error', + Faraday::TimeoutError, Faraday::RetriableResponse + ].freeze + IDEMPOTENT_METHODS = %i[delete get head options put].freeze + + # Options contains the configurable parameters for the Retry middleware. + class Options < Faraday::Options.new(:max, :interval, :max_interval, + :interval_randomness, + :backoff_factor, :exceptions, + :methods, :retry_if, :retry_block, + :retry_statuses) + + DEFAULT_CHECK = ->(_env, _exception) { false } + + def self.from(value) + if value.is_a?(Integer) + new(value) + else + super(value) + end + end + + def max + (self[:max] ||= 2).to_i + end + + def interval + (self[:interval] ||= 0).to_f + end + + def max_interval + (self[:max_interval] ||= Float::MAX).to_f + end + + def interval_randomness + (self[:interval_randomness] ||= 0).to_f + end + + def backoff_factor + (self[:backoff_factor] ||= 1).to_f + end + + def exceptions + Array(self[:exceptions] ||= DEFAULT_EXCEPTIONS) + end + + def methods + Array(self[:methods] ||= IDEMPOTENT_METHODS) + end + + def retry_if + self[:retry_if] ||= DEFAULT_CHECK + end + + def retry_block + self[:retry_block] ||= proc {} + end + + def retry_statuses + Array(self[:retry_statuses] ||= []) + end + end + + # @param app [#call] + # @param options [Hash] + # @option options [Integer] :max (2) Maximum number of retries + # @option options [Integer] :interval (0) Pause in seconds between retries + # @option options [Integer] :interval_randomness (0) The maximum random + # interval amount expressed as a float between + # 0 and 1 to use in addition to the interval. + # @option options [Integer] :max_interval (Float::MAX) An upper limit + # for the interval + # @option options [Integer] :backoff_factor (1) The amount to multiply + # each successive retry's interval amount by in order to provide backoff + # @option options [Array] :exceptions ([ Errno::ETIMEDOUT, + # 'Timeout::Error', Faraday::TimeoutError, Faraday::RetriableResponse]) + # The list of exceptions to handle. Exceptions can be given as + # Class, Module, or String. + # @option options [Array] :methods (the idempotent HTTP methods + # in IDEMPOTENT_METHODS) A list of HTTP methods to retry without + # calling retry_if. Pass an empty Array to call retry_if + # for all exceptions. + # @option options [Block] :retry_if (false) block that will receive + # the env object and the exception raised + # and should decide if the code should retry still the action or + # not independent of the retry count. This would be useful + # if the exception produced is non-recoverable or if the + # the HTTP method called is not idempotent. + # @option options [Block] :retry_block block that is executed before + # every retry. Request environment, middleware options, current number + # of retries and the exception is passed to the block as parameters. + # @option options [Array] :retry_statuses Array of Integer HTTP status + # codes or a single Integer value that determines whether to raise + # a Faraday::RetriableResponse exception based on the HTTP status code + # of an HTTP response. + def initialize(app, options = nil) + super(app) + @options = Options.from(options) + @errmatch = build_exception_matcher(@options.exceptions) + end + + def calculate_sleep_amount(retries, env) + retry_after = calculate_retry_after(env) + retry_interval = calculate_retry_interval(retries) + + return if retry_after && retry_after > @options.max_interval + + if retry_after && retry_after >= retry_interval + retry_after + else + retry_interval + end + end + + # @param env [Faraday::Env] + def call(env) + retries = @options.max + request_body = env[:body] + begin + # after failure env[:body] is set to the response body + env[:body] = request_body + @app.call(env).tap do |resp| + if @options.retry_statuses.include?(resp.status) + raise Faraday::RetriableResponse.new(nil, resp) + end + end + rescue @errmatch => e + if retries.positive? && retry_request?(env, e) + retries -= 1 + rewind_files(request_body) + @options.retry_block.call(env, @options, retries, e) + if (sleep_amount = calculate_sleep_amount(retries + 1, env)) + sleep sleep_amount + retry + end + end + + raise unless e.is_a?(Faraday::RetriableResponse) + + e.response + end + end + + # An exception matcher for the rescue clause can usually be any object + # that responds to `===`, but for Ruby 1.8 it has to be a Class or Module. + # + # @param exceptions [Array] + # @api private + # @return [Module] an exception matcher + def build_exception_matcher(exceptions) + matcher = Module.new + ( + class << matcher + self + end).class_eval do + define_method(:===) do |error| + exceptions.any? do |ex| + if ex.is_a? Module + error.is_a? ex + else + error.class.to_s == ex.to_s + end + end + end + end + matcher + end + + private + + def retry_request?(env, exception) + @options.methods.include?(env[:method]) || + @options.retry_if.call(env, exception) + end + + def rewind_files(body) + return unless body.is_a?(Hash) + + body.each do |_, value| + value.rewind if value.is_a?(UploadIO) + end + end + + # MDN spec for Retry-After header: + # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After + def calculate_retry_after(env) + response_headers = env[:response_headers] + return unless response_headers + + retry_after_value = env[:response_headers]['Retry-After'] + + # Try to parse date from the header value + begin + datetime = DateTime.rfc2822(retry_after_value) + datetime.to_time - Time.now.utc + rescue ArgumentError + retry_after_value.to_f + end + end + + def calculate_retry_interval(retries) + retry_index = @options.max - retries + current_interval = @options.interval * + (@options.backoff_factor**retry_index) + current_interval = [current_interval, @options.max_interval].min + random_interval = rand * @options.interval_randomness.to_f * + @options.interval + + current_interval + random_interval + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/token_authentication.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/token_authentication.rb new file mode 100644 index 000000000000..f28264b1c7f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/token_authentication.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Faraday + class Request + # TokenAuthentication is a middleware that adds a 'Token' header to a + # Faraday request. + class TokenAuthentication < load_middleware(:authorization) + # Public + def self.header(token, options = nil) + options ||= {} + options[:token] = token + super(:Token, options) + end + + def initialize(app, token, options = nil) + super(app, token, options) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/url_encoded.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/url_encoded.rb new file mode 100644 index 000000000000..00cc973dd0d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/request/url_encoded.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module Faraday + class Request + # Middleware for supporting urlencoded requests. + class UrlEncoded < Faraday::Middleware + unless defined?(::Faraday::Request::UrlEncoded::CONTENT_TYPE) + CONTENT_TYPE = 'Content-Type' + end + + class << self + attr_accessor :mime_type + end + self.mime_type = 'application/x-www-form-urlencoded' + + # Encodes as "application/x-www-form-urlencoded" if not already encoded or + # of another type. + # + # @param env [Faraday::Env] + def call(env) + match_content_type(env) do |data| + params = Faraday::Utils::ParamsHash[data] + env.body = params.to_query(env.params_encoder) + end + @app.call env + end + + # @param env [Faraday::Env] + # @yield [request_body] Body of the request + def match_content_type(env) + return unless process_request?(env) + + env.request_headers[CONTENT_TYPE] ||= self.class.mime_type + yield(env.body) unless env.body.respond_to?(:to_str) + end + + # @param env [Faraday::Env] + # + # @return [Boolean] True if the request has a body and its Content-Type is + # urlencoded. + def process_request?(env) + type = request_type(env) + env.body && (type.empty? || (type == self.class.mime_type)) + end + + # @param env [Faraday::Env] + # + # @return [String] + def request_type(env) + type = env.request_headers[CONTENT_TYPE].to_s + type = type.split(';', 2).first if type.index(';') + type + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/response.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/response.rb new file mode 100644 index 000000000000..3fd17d03d0ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/response.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +require 'forwardable' + +module Faraday + # Response represents an HTTP response from making an HTTP request. + class Response + # Used for simple response middleware. + class Middleware < Faraday::Middleware + # Override this to modify the environment after the response has finished. + # Calls the `parse` method if defined + # `parse` method can be defined as private, public and protected + def on_complete(env) + return unless respond_to?(:parse, true) && env.parse_body? + + env.body = parse(env.body) + end + end + + extend Forwardable + extend MiddlewareRegistry + + register_middleware File.expand_path('response', __dir__), + raise_error: [:RaiseError, 'raise_error'], + logger: [:Logger, 'logger'] + + def initialize(env = nil) + @env = Env.from(env) if env + @on_complete_callbacks = [] + end + + attr_reader :env + + def status + finished? ? env.status : nil + end + + def reason_phrase + finished? ? env.reason_phrase : nil + end + + def headers + finished? ? env.response_headers : {} + end + def_delegator :headers, :[] + + def body + finished? ? env.body : nil + end + + def finished? + !!env + end + + def on_complete(&block) + if !finished? + @on_complete_callbacks << block + else + yield(env) + end + self + end + + def finish(env) + raise 'response already finished' if finished? + + @env = env.is_a?(Env) ? env : Env.from(env) + @on_complete_callbacks.each { |callback| callback.call(@env) } + self + end + + def success? + finished? && env.success? + end + + def to_hash + { + status: env.status, body: env.body, + response_headers: env.response_headers + } + end + + # because @on_complete_callbacks cannot be marshalled + def marshal_dump + finished? ? to_hash : nil + end + + def marshal_load(env) + @env = Env.from(env) + end + + # Expand the env with more properties, without overriding existing ones. + # Useful for applying request params after restoring a marshalled Response. + def apply_request(request_env) + raise "response didn't finish yet" unless finished? + + @env = Env.from(request_env).update(@env) + self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/response/logger.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/response/logger.rb new file mode 100644 index 000000000000..35aefb8606c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/response/logger.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'forwardable' +require 'faraday/logging/formatter' + +module Faraday + class Response + # Logger is a middleware that logs internal events in the HTTP request + # lifecycle to a given Logger object. By default, this logs to STDOUT. See + # Faraday::Logging::Formatter to see specifically what is logged. + class Logger < Middleware + def initialize(app, logger = nil, options = {}) + super(app) + logger ||= begin + require 'logger' + ::Logger.new($stdout) + end + formatter_class = options.delete(:formatter) || Logging::Formatter + @formatter = formatter_class.new(logger: logger, options: options) + yield @formatter if block_given? + end + + def call(env) + @formatter.request(env) + super + end + + def on_complete(env) + @formatter.response(env) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/response/raise_error.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/response/raise_error.rb new file mode 100644 index 000000000000..467f3cd18bd2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/response/raise_error.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module Faraday + class Response + # RaiseError is a Faraday middleware that raises exceptions on common HTTP + # client or server error responses. + class RaiseError < Middleware + # rubocop:disable Naming/ConstantName + ClientErrorStatuses = (400...500).freeze + ServerErrorStatuses = (500...600).freeze + # rubocop:enable Naming/ConstantName + + def on_complete(env) + case env[:status] + when 400 + raise Faraday::BadRequestError, response_values(env) + when 401 + raise Faraday::UnauthorizedError, response_values(env) + when 403 + raise Faraday::ForbiddenError, response_values(env) + when 404 + raise Faraday::ResourceNotFound, response_values(env) + when 407 + # mimic the behavior that we get with proxy requests with HTTPS + msg = %(407 "Proxy Authentication Required") + raise Faraday::ProxyAuthError.new(msg, response_values(env)) + when 409 + raise Faraday::ConflictError, response_values(env) + when 422 + raise Faraday::UnprocessableEntityError, response_values(env) + when ClientErrorStatuses + raise Faraday::ClientError, response_values(env) + when ServerErrorStatuses + raise Faraday::ServerError, response_values(env) + when nil + raise Faraday::NilStatusError, response_values(env) + end + end + + def response_values(env) + { + status: env.status, + headers: env.response_headers, + body: env.body, + request: { + method: env.method, + url_path: env.url.path, + params: env.params, + headers: env.request_headers, + body: env.request_body + } + } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/utils.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/utils.rb new file mode 100644 index 000000000000..b052f9b2f652 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/utils.rb @@ -0,0 +1,117 @@ +# frozen_string_literal: true + +require 'faraday/utils/headers' +require 'faraday/utils/params_hash' + +module Faraday + # Utils contains various static helper methods. + module Utils + module_function + + def build_query(params) + FlatParamsEncoder.encode(params) + end + + def build_nested_query(params) + NestedParamsEncoder.encode(params) + end + + def default_space_encoding + @default_space_encoding ||= '+' + end + + class << self + attr_writer :default_space_encoding + end + + ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/.freeze + + def escape(str) + str.to_s.gsub(ESCAPE_RE) do |match| + "%#{match.unpack('H2' * match.bytesize).join('%').upcase}" + end.gsub(' ', default_space_encoding) + end + + def unescape(str) + CGI.unescape str.to_s + end + + DEFAULT_SEP = /[&;] */n.freeze + + # Adapted from Rack + def parse_query(query) + FlatParamsEncoder.decode(query) + end + + def parse_nested_query(query) + NestedParamsEncoder.decode(query) + end + + def default_params_encoder + @default_params_encoder ||= NestedParamsEncoder + end + + class << self + attr_writer :default_params_encoder + end + + # Normalize URI() behavior across Ruby versions + # + # url - A String or URI. + # + # Returns a parsed URI. + def URI(url) # rubocop:disable Naming/MethodName + if url.respond_to?(:host) + url + elsif url.respond_to?(:to_str) + default_uri_parser.call(url) + else + raise ArgumentError, 'bad argument (expected URI object or URI string)' + end + end + + def default_uri_parser + @default_uri_parser ||= begin + require 'uri' + Kernel.method(:URI) + end + end + + def default_uri_parser=(parser) + @default_uri_parser = if parser.respond_to?(:call) || parser.nil? + parser + else + parser.method(:parse) + end + end + + # Receives a String or URI and returns just + # the path with the query string sorted. + def normalize_path(url) + url = URI(url) + (url.path.start_with?('/') ? url.path : "/#{url.path}") + + (url.query ? "?#{sort_query_params(url.query)}" : '') + end + + # Recursive hash update + def deep_merge!(target, hash) + hash.each do |key, value| + target[key] = if value.is_a?(Hash) && target[key].is_a?(Hash) + deep_merge(target[key], value) + else + value + end + end + target + end + + # Recursive hash merge + def deep_merge(source, hash) + deep_merge!(source.dup, hash) + end + + def sort_query_params(query) + query.split('&').sort.join('&') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/utils/headers.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/utils/headers.rb new file mode 100644 index 000000000000..9883dc24ce6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/utils/headers.rb @@ -0,0 +1,139 @@ +# frozen_string_literal: true + +module Faraday + module Utils + # A case-insensitive Hash that preserves the original case of a header + # when set. + # + # Adapted from Rack::Utils::HeaderHash + class Headers < ::Hash + def self.from(value) + new(value) + end + + def self.allocate + new_self = super + new_self.initialize_names + new_self + end + + def initialize(hash = nil) + super() + @names = {} + update(hash || {}) + end + + def initialize_names + @names = {} + end + + # on dup/clone, we need to duplicate @names hash + def initialize_copy(other) + super + @names = other.names.dup + end + + # need to synchronize concurrent writes to the shared KeyMap + keymap_mutex = Mutex.new + + # symbol -> string mapper + cache + KeyMap = Hash.new do |map, key| + value = if key.respond_to?(:to_str) + key + else + key.to_s.split('_') # user_agent: %w(user agent) + .each(&:capitalize!) # => %w(User Agent) + .join('-') # => "User-Agent" + end + keymap_mutex.synchronize { map[key] = value } + end + KeyMap[:etag] = 'ETag' + + def [](key) + key = KeyMap[key] + super(key) || super(@names[key.downcase]) + end + + def []=(key, val) + key = KeyMap[key] + key = (@names[key.downcase] ||= key) + # join multiple values with a comma + val = val.to_ary.join(', ') if val.respond_to?(:to_ary) + super(key, val) + end + + def fetch(key, *args, &block) + key = KeyMap[key] + key = @names.fetch(key.downcase, key) + super(key, *args, &block) + end + + def delete(key) + key = KeyMap[key] + key = @names[key.downcase] + return unless key + + @names.delete key.downcase + super(key) + end + + def include?(key) + @names.include? key.downcase + end + + alias has_key? include? + alias member? include? + alias key? include? + + def merge!(other) + other.each { |k, v| self[k] = v } + self + end + + alias update merge! + + def merge(other) + hash = dup + hash.merge! other + end + + def replace(other) + clear + @names.clear + update other + self + end + + def to_hash + {}.update(self) + end + + def parse(header_string) + return unless header_string && !header_string.empty? + + headers = header_string.split(/\r\n/) + + # Find the last set of response headers. + start_index = headers.rindex { |x| x.start_with?('HTTP/') } || 0 + last_response = headers.slice(start_index, headers.size) + + last_response + .tap { |a| a.shift if a.first.start_with?('HTTP/') } + .map { |h| h.split(/:\s*/, 2) } # split key and value + .reject { |p| p[0].nil? } # ignore blank lines + .each { |key, value| add_parsed(key, value) } + end + + protected + + attr_reader :names + + private + + # Join multiple values with a comma. + def add_parsed(key, value) + self[key] ? self[key] << ', ' << value : self[key] = value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/utils/params_hash.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/utils/params_hash.rb new file mode 100644 index 000000000000..0e16d93505a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/utils/params_hash.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +module Faraday + module Utils + # A hash with stringified keys. + class ParamsHash < Hash + def [](key) + super(convert_key(key)) + end + + def []=(key, value) + super(convert_key(key), value) + end + + def delete(key) + super(convert_key(key)) + end + + def include?(key) + super(convert_key(key)) + end + + alias has_key? include? + alias member? include? + alias key? include? + + def update(params) + params.each do |key, value| + self[key] = value + end + self + end + alias merge! update + + def merge(params) + dup.update(params) + end + + def replace(other) + clear + update(other) + end + + def merge_query(query, encoder = nil) + return self unless query && !query.empty? + + update((encoder || Utils.default_params_encoder).decode(query)) + end + + def to_query(encoder = nil) + (encoder || Utils.default_params_encoder).encode(self) + end + + private + + def convert_key(key) + key.to_s + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/version.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/version.rb new file mode 100644 index 000000000000..b9c03a00219f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/lib/faraday/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Faraday + VERSION = '1.3.0' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/external_adapters/faraday_specs_setup.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/external_adapters/faraday_specs_setup.rb new file mode 100644 index 000000000000..ac7f7b64391c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/external_adapters/faraday_specs_setup.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require 'webmock/rspec' +WebMock.disable_net_connect!(allow_localhost: true) + +require_relative '../support/helper_methods' +require_relative '../support/disabling_stub' +require_relative '../support/streaming_response_checker' +require_relative '../support/shared_examples/adapter' +require_relative '../support/shared_examples/request_method' + +RSpec.configure do |config| + config.include Faraday::HelperMethods +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/em_http_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/em_http_spec.rb new file mode 100644 index 000000000000..c417e2345209 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/em_http_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::EMHttp, unless: defined?(JRUBY_VERSION) do + features :request_body_on_query_methods, :reason_phrase_parse, :trace_method, + :skip_response_body_on_head, :parallel, :local_socket_binding + + it_behaves_like 'an adapter' + + it 'allows to provide adapter specific configs' do + url = URI('https://example.com:1234') + adapter = described_class.new nil, inactivity_timeout: 20 + req = adapter.create_request(url: url, request: {}) + + expect(req.connopts.inactivity_timeout).to eq(20) + end + + context 'Options' do + let(:request) { Faraday::RequestOptions.new } + let(:env) { { request: request } } + let(:options) { {} } + let(:adapter) { Faraday::Adapter::EMHttp.new } + + it 'configures timeout' do + request.timeout = 5 + adapter.configure_timeout(options, env) + expect(options[:inactivity_timeout]).to eq(5) + expect(options[:connect_timeout]).to eq(5) + end + + it 'configures timeout and open_timeout' do + request.timeout = 5 + request.open_timeout = 1 + adapter.configure_timeout(options, env) + expect(options[:inactivity_timeout]).to eq(5) + expect(options[:connect_timeout]).to eq(1) + end + + it 'configures all timeout settings' do + request.timeout = 5 + request.read_timeout = 3 + request.open_timeout = 1 + adapter.configure_timeout(options, env) + expect(options[:inactivity_timeout]).to eq(3) + expect(options[:connect_timeout]).to eq(1) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/em_synchrony_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/em_synchrony_spec.rb new file mode 100644 index 000000000000..872955c8c7be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/em_synchrony_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::EMSynchrony, unless: defined?(JRUBY_VERSION) do + features :request_body_on_query_methods, :reason_phrase_parse, + :skip_response_body_on_head, :parallel, :local_socket_binding + + it_behaves_like 'an adapter' + + it 'allows to provide adapter specific configs' do + url = URI('https://example.com:1234') + adapter = described_class.new nil, inactivity_timeout: 20 + req = adapter.create_request(url: url, request: {}) + + expect(req.connopts.inactivity_timeout).to eq(20) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/excon_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/excon_spec.rb new file mode 100644 index 000000000000..d80abc376e32 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/excon_spec.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::Excon do + features :request_body_on_query_methods, :reason_phrase_parse, :trace_method + + it_behaves_like 'an adapter' + + it 'allows to provide adapter specific configs' do + url = URI('https://example.com:1234') + + adapter = described_class.new(nil, debug_request: true) + + conn = adapter.build_connection(url: url) + + expect(conn.data[:debug_request]).to be_truthy + end + + context 'config' do + let(:adapter) { Faraday::Adapter::Excon.new } + let(:request) { Faraday::RequestOptions.new } + let(:uri) { URI.parse('https://example.com') } + let(:env) { { request: request, url: uri } } + + it 'sets timeout' do + request.timeout = 5 + options = adapter.send(:opts_from_env, env) + expect(options[:read_timeout]).to eq(5) + expect(options[:write_timeout]).to eq(5) + expect(options[:connect_timeout]).to eq(5) + end + + it 'sets timeout and open_timeout' do + request.timeout = 5 + request.open_timeout = 3 + options = adapter.send(:opts_from_env, env) + expect(options[:read_timeout]).to eq(5) + expect(options[:write_timeout]).to eq(5) + expect(options[:connect_timeout]).to eq(3) + end + + it 'sets open_timeout' do + request.open_timeout = 3 + options = adapter.send(:opts_from_env, env) + expect(options[:read_timeout]).to eq(nil) + expect(options[:write_timeout]).to eq(nil) + expect(options[:connect_timeout]).to eq(3) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/httpclient_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/httpclient_spec.rb new file mode 100644 index 000000000000..3cbf2c6243f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/httpclient_spec.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::HTTPClient do + # ruby gem defaults for testing purposes + HTTPCLIENT_OPEN = 60 + HTTPCLIENT_READ = 60 + HTTPCLIENT_WRITE = 120 + + features :request_body_on_query_methods, :reason_phrase_parse, :compression, + :trace_method, :local_socket_binding + + it_behaves_like 'an adapter' + + it 'allows to provide adapter specific configs' do + adapter = described_class.new do |client| + client.keep_alive_timeout = 20 + client.ssl_config.timeout = 25 + end + + client = adapter.build_connection(url: URI.parse('https://example.com')) + expect(client.keep_alive_timeout).to eq(20) + expect(client.ssl_config.timeout).to eq(25) + end + + context 'Options' do + let(:request) { Faraday::RequestOptions.new } + let(:env) { { request: request } } + let(:options) { {} } + let(:adapter) { Faraday::Adapter::HTTPClient.new } + let(:client) { adapter.connection(url: URI.parse('https://example.com')) } + + it 'configures timeout' do + assert_default_timeouts! + + request.timeout = 5 + adapter.configure_timeouts(client, request) + + expect(client.connect_timeout).to eq(5) + expect(client.send_timeout).to eq(5) + expect(client.receive_timeout).to eq(5) + end + + it 'configures open timeout' do + assert_default_timeouts! + + request.open_timeout = 1 + adapter.configure_timeouts(client, request) + + expect(client.connect_timeout).to eq(1) + expect(client.send_timeout).to eq(HTTPCLIENT_WRITE) + expect(client.receive_timeout).to eq(HTTPCLIENT_READ) + end + + it 'configures multiple timeouts' do + assert_default_timeouts! + + request.open_timeout = 1 + request.write_timeout = 10 + request.read_timeout = 5 + adapter.configure_timeouts(client, request) + + expect(client.connect_timeout).to eq(1) + expect(client.send_timeout).to eq(10) + expect(client.receive_timeout).to eq(5) + end + + def assert_default_timeouts! + expect(client.connect_timeout).to eq(HTTPCLIENT_OPEN) + expect(client.send_timeout).to eq(HTTPCLIENT_WRITE) + expect(client.receive_timeout).to eq(HTTPCLIENT_READ) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/net_http_persistent_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/net_http_persistent_spec.rb new file mode 100644 index 000000000000..3a35e0a5606c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/net_http_persistent_spec.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::NetHttpPersistent do + features :request_body_on_query_methods, :reason_phrase_parse, :compression, :trace_method + + it_behaves_like 'an adapter' + + it 'allows to provide adapter specific configs' do + url = URI('https://example.com') + + adapter = described_class.new do |http| + http.idle_timeout = 123 + end + + http = adapter.send(:connection, url: url, request: {}) + adapter.send(:configure_request, http, {}) + + expect(http.idle_timeout).to eq(123) + end + + it 'sets max_retries to 0' do + url = URI('http://example.com') + + adapter = described_class.new + + http = adapter.send(:connection, url: url, request: {}) + adapter.send(:configure_request, http, {}) + + # `max_retries=` is only present in Ruby 2.5 + expect(http.max_retries).to eq(0) if http.respond_to?(:max_retries=) + end + + it 'allows to set pool_size on initialize' do + url = URI('https://example.com') + + adapter = described_class.new(nil, pool_size: 5) + + http = adapter.send(:connection, url: url, request: {}) + + # `pool` is only present in net_http_persistent >= 3.0 + expect(http.pool.size).to eq(5) if http.respond_to?(:pool) + end + + context 'min_version' do + it 'allows to set min_version in SSL settings' do + url = URI('https://example.com') + + adapter = described_class.new(nil) + + http = adapter.send(:connection, url: url, request: {}) + adapter.send(:configure_ssl, http, min_version: :TLS1_2) + + # `min_version` is only present in net_http_persistent >= 3.1 (UNRELEASED) + expect(http.min_version).to eq(:TLS1_2) if http.respond_to?(:min_version) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/net_http_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/net_http_spec.rb new file mode 100644 index 000000000000..fda9b64d541f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/net_http_spec.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::NetHttp do + features :request_body_on_query_methods, :reason_phrase_parse, :compression, :streaming, :trace_method + + it_behaves_like 'an adapter' + + context 'checking http' do + let(:url) { URI('http://example.com') } + let(:adapter) { described_class.new } + let(:http) { adapter.send(:connection, url: url, request: {}) } + + it { expect(http.port).to eq(80) } + + it 'sets max_retries to 0' do + adapter.send(:configure_request, http, {}) + + expect(http.max_retries).to eq(0) if http.respond_to?(:max_retries=) + end + + it 'supports write_timeout' do + adapter.send(:configure_request, http, write_timeout: 10) + + expect(http.write_timeout).to eq(10) if http.respond_to?(:write_timeout=) + end + + it 'supports open_timeout' do + adapter.send(:configure_request, http, open_timeout: 10) + + expect(http.open_timeout).to eq(10) + end + + it 'supports read_timeout' do + adapter.send(:configure_request, http, read_timeout: 10) + + expect(http.read_timeout).to eq(10) + end + + context 'with https url' do + let(:url) { URI('https://example.com') } + + it { expect(http.port).to eq(443) } + end + + context 'with http url including port' do + let(:url) { URI('https://example.com:1234') } + + it { expect(http.port).to eq(1234) } + end + + context 'with custom adapter config' do + let(:adapter) do + described_class.new do |http| + http.continue_timeout = 123 + end + end + + it do + adapter.send(:configure_request, http, {}) + expect(http.continue_timeout).to eq(123) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/patron_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/patron_spec.rb new file mode 100644 index 000000000000..2408ab044ad4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/patron_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::Patron, unless: defined?(JRUBY_VERSION) do + features :reason_phrase_parse + + it_behaves_like 'an adapter' + + it 'allows to provide adapter specific configs' do + conn = Faraday.new do |f| + f.adapter :patron do |session| + session.max_redirects = 10 + raise 'Configuration block called' + end + end + + expect { conn.get('/') }.to raise_error(RuntimeError, 'Configuration block called') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/rack_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/rack_spec.rb new file mode 100644 index 000000000000..4fe6cba28075 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/rack_spec.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::Rack do + features :request_body_on_query_methods, :trace_method, + :skip_response_body_on_head + + it_behaves_like 'an adapter', adapter_options: WebmockRackApp.new +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/test_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/test_spec.rb new file mode 100644 index 000000000000..53a8ebbb73ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/test_spec.rb @@ -0,0 +1,260 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::Test do + let(:stubs) do + described_class::Stubs.new do |stub| + stub.get('http://domain.test/hello') do + [200, { 'Content-Type' => 'text/html' }, 'domain: hello'] + end + + stub.get('http://wrong.test/hello') do + [200, { 'Content-Type' => 'text/html' }, 'wrong: hello'] + end + + stub.get('http://wrong.test/bait') do + [404, { 'Content-Type' => 'text/html' }] + end + + stub.get('/hello') do + [200, { 'Content-Type' => 'text/html' }, 'hello'] + end + + stub.get('/method-echo') do |env| + [200, { 'Content-Type' => 'text/html' }, env[:method].to_s] + end + + stub.get(%r{\A/resources/\d+(?:\?|\z)}) do + [200, { 'Content-Type' => 'text/html' }, 'show'] + end + + stub.get(%r{\A/resources/(specified)\z}) do |_env, meta| + [200, { 'Content-Type' => 'text/html' }, "show #{meta[:match_data][1]}"] + end + end + end + + let(:connection) do + Faraday.new do |builder| + builder.adapter :test, stubs + end + end + + let(:response) { connection.get('/hello') } + + context 'with simple path sets status' do + subject { response.status } + + it { is_expected.to eq 200 } + end + + context 'with simple path sets headers' do + subject { response.headers['Content-Type'] } + + it { is_expected.to eq 'text/html' } + end + + context 'with simple path sets body' do + subject { response.body } + + it { is_expected.to eq 'hello' } + end + + context 'with host points to the right stub' do + subject { connection.get('http://domain.test/hello').body } + + it { is_expected.to eq 'domain: hello' } + end + + describe 'can be called several times' do + subject { connection.get('/hello').body } + + it { is_expected.to eq 'hello' } + end + + describe 'can handle regular expression path' do + subject { connection.get('/resources/1').body } + + it { is_expected.to eq 'show' } + end + + describe 'can handle single parameter block' do + subject { connection.get('/method-echo').body } + + it { is_expected.to eq 'get' } + end + + describe 'can handle regular expression path with captured result' do + subject { connection.get('/resources/specified').body } + + it { is_expected.to eq 'show specified' } + end + + context 'with get params' do + subject { connection.get('/param?a=1').body } + + before do + stubs.get('/param?a=1') { [200, {}, 'a'] } + end + + it { is_expected.to eq 'a' } + end + + describe 'ignoring unspecified get params' do + before do + stubs.get('/optional?a=1') { [200, {}, 'a'] } + end + + context 'with multiple params' do + subject { connection.get('/optional?a=1&b=1').body } + + it { is_expected.to eq 'a' } + end + + context 'with single param' do + subject { connection.get('/optional?a=1').body } + + it { is_expected.to eq 'a' } + end + + context 'without params' do + subject(:request) { connection.get('/optional') } + + it do + expect { request }.to raise_error( + Faraday::Adapter::Test::Stubs::NotFound + ) + end + end + end + + context 'with http headers' do + before do + stubs.get('/yo', 'X-HELLO' => 'hello') { [200, {}, 'a'] } + stubs.get('/yo') { [200, {}, 'b'] } + end + + context 'with header' do + subject do + connection.get('/yo') { |env| env.headers['X-HELLO'] = 'hello' }.body + end + + it { is_expected.to eq 'a' } + end + + context 'without header' do + subject do + connection.get('/yo').body + end + + it { is_expected.to eq 'b' } + end + end + + describe 'different outcomes for the same request' do + def make_request + connection.get('/foo') + end + + subject(:request) { make_request.body } + + before do + stubs.get('/foo') { [200, { 'Content-Type' => 'text/html' }, 'hello'] } + stubs.get('/foo') { [200, { 'Content-Type' => 'text/html' }, 'world'] } + end + + context 'the first request' do + it { is_expected.to eq 'hello' } + end + + context 'the second request' do + before do + make_request + end + + it { is_expected.to eq 'world' } + end + end + + describe 'yielding env to stubs' do + subject { connection.get('http://foo.com/foo?a=1').body } + + before do + stubs.get '/foo' do |env| + expect(env[:url].path).to eq '/foo' + expect(env[:url].host).to eq 'foo.com' + expect(env[:params]['a']).to eq '1' + expect(env[:request_headers]['Accept']).to eq 'text/plain' + [200, {}, 'a'] + end + + connection.headers['Accept'] = 'text/plain' + end + + it { is_expected.to eq 'a' } + end + + describe 'params parsing' do + subject { connection.get('http://foo.com/foo?a[b]=1').body } + + context 'with default encoder' do + before do + stubs.get '/foo' do |env| + expect(env[:params]['a']['b']).to eq '1' + [200, {}, 'a'] + end + end + + it { is_expected.to eq 'a' } + end + + context 'with nested encoder' do + before do + stubs.get '/foo' do |env| + expect(env[:params]['a']['b']).to eq '1' + [200, {}, 'a'] + end + + connection.options.params_encoder = Faraday::NestedParamsEncoder + end + + it { is_expected.to eq 'a' } + end + + context 'with flat encoder' do + before do + stubs.get '/foo' do |env| + expect(env[:params]['a[b]']).to eq '1' + [200, {}, 'a'] + end + + connection.options.params_encoder = Faraday::FlatParamsEncoder + end + + it { is_expected.to eq 'a' } + end + end + + describe 'raising an error if no stub was found' do + describe 'for request' do + subject(:request) { connection.get('/invalid') { [200, {}, []] } } + + it { expect { request }.to raise_error described_class::Stubs::NotFound } + end + + describe 'for specified host' do + subject(:request) { connection.get('http://domain.test/bait') } + + it { expect { request }.to raise_error described_class::Stubs::NotFound } + end + + describe 'for request without specified header' do + subject(:request) { connection.get('/yo') } + + before do + stubs.get('/yo', 'X-HELLO' => 'hello') { [200, {}, 'a'] } + end + + it { expect { request }.to raise_error described_class::Stubs::NotFound } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/typhoeus_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/typhoeus_spec.rb new file mode 100644 index 000000000000..7f63f9700be7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter/typhoeus_spec.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter::Typhoeus do + features :request_body_on_query_methods, :parallel, :trace_method + + it_behaves_like 'an adapter' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter_registry_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter_registry_spec.rb new file mode 100644 index 000000000000..222e65ef55f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter_registry_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::AdapterRegistry do + describe '#initialize' do + subject(:registry) { described_class.new } + + it { expect { registry.get(:FinFangFoom) }.to raise_error(NameError) } + it { expect { registry.get('FinFangFoom') }.to raise_error(NameError) } + + it 'looks up class by string name' do + expect(registry.get('Faraday::Connection')).to eq(Faraday::Connection) + end + + it 'looks up class by symbol name' do + expect(registry.get(:Faraday)).to eq(Faraday) + end + + it 'caches lookups with implicit name' do + registry.set :symbol + expect(registry.get('symbol')).to eq(:symbol) + end + + it 'caches lookups with explicit name' do + registry.set 'string', :name + expect(registry.get(:name)).to eq('string') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter_spec.rb new file mode 100644 index 000000000000..22ef1d1497ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/adapter_spec.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Adapter do + let(:adapter) { Faraday::Adapter.new } + let(:request) { {} } + + context '#request_timeout' do + it 'gets :read timeout' do + expect(timeout(:read)).to eq(nil) + + request[:timeout] = 5 + request[:write_timeout] = 1 + + expect(timeout(:read)).to eq(5) + + request[:read_timeout] = 2 + + expect(timeout(:read)).to eq(2) + end + + it 'gets :open timeout' do + expect(timeout(:open)).to eq(nil) + + request[:timeout] = 5 + request[:write_timeout] = 1 + + expect(timeout(:open)).to eq(5) + + request[:open_timeout] = 2 + + expect(timeout(:open)).to eq(2) + end + + it 'gets :write timeout' do + expect(timeout(:write)).to eq(nil) + + request[:timeout] = 5 + request[:read_timeout] = 1 + + expect(timeout(:write)).to eq(5) + + request[:write_timeout] = 2 + + expect(timeout(:write)).to eq(2) + end + + it 'attempts unknown timeout type' do + expect { timeout(:unknown) }.to raise_error(ArgumentError) + end + + def timeout(type) + adapter.send(:request_timeout, type, request) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/composite_read_io_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/composite_read_io_spec.rb new file mode 100644 index 000000000000..ccba34f3d29c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/composite_read_io_spec.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require 'stringio' + +RSpec.describe Faraday::CompositeReadIO do + Part = Struct.new(:to_io) do + def length + to_io.string.length + end + end + + def part(str) + Part.new StringIO.new(str) + end + + def composite_io(*parts) + Faraday::CompositeReadIO.new(*parts) + end + + context 'with empty composite_io' do + subject { composite_io } + + it { expect(subject.length).to eq(0) } + it { expect(subject.read).to eq('') } + it { expect(subject.read(1)).to be_nil } + end + + context 'with empty parts' do + subject { composite_io(part(''), part('')) } + + it { expect(subject.length).to eq(0) } + it { expect(subject.read).to eq('') } + it { expect(subject.read(1)).to be_nil } + end + + context 'with 2 parts' do + subject { composite_io(part('abcd'), part('1234')) } + + it { expect(subject.length).to eq(8) } + it { expect(subject.read).to eq('abcd1234') } + it 'allows to read in chunks' do + expect(subject.read(3)).to eq('abc') + expect(subject.read(3)).to eq('d12') + expect(subject.read(3)).to eq('34') + expect(subject.read(3)).to be_nil + end + it 'allows to rewind while reading in chunks' do + expect(subject.read(3)).to eq('abc') + expect(subject.read(3)).to eq('d12') + subject.rewind + expect(subject.read(3)).to eq('abc') + expect(subject.read(5)).to eq('d1234') + expect(subject.read(3)).to be_nil + subject.rewind + expect(subject.read(2)).to eq('ab') + end + end + + context 'with mix of empty and non-empty parts' do + subject { composite_io(part(''), part('abcd'), part(''), part('1234'), part('')) } + + it 'allows to read in chunks' do + expect(subject.read(6)).to eq('abcd12') + expect(subject.read(6)).to eq('34') + expect(subject.read(6)).to be_nil + end + end + + context 'with utf8 multibyte part' do + subject { composite_io(part("\x86"), part('ファイル')) } + + it { expect(subject.read).to eq(String.new("\x86\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB", encoding: 'BINARY')) } + it 'allows to read in chunks' do + expect(subject.read(3)).to eq(String.new("\x86\xE3\x83", encoding: 'BINARY')) + expect(subject.read(3)).to eq(String.new("\x95\xE3\x82", encoding: 'BINARY')) + expect(subject.read(8)).to eq(String.new("\xA1\xE3\x82\xA4\xE3\x83\xAB", encoding: 'BINARY')) + expect(subject.read(3)).to be_nil + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/connection_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/connection_spec.rb new file mode 100644 index 000000000000..4f51f5682ef3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/connection_spec.rb @@ -0,0 +1,691 @@ +# frozen_string_literal: true + +shared_examples 'initializer with url' do + context 'with simple url' do + let(:address) { 'http://sushi.com' } + + it { expect(subject.host).to eq('sushi.com') } + it { expect(subject.port).to eq(80) } + it { expect(subject.scheme).to eq('http') } + it { expect(subject.path_prefix).to eq('/') } + it { expect(subject.params).to eq({}) } + end + + context 'with complex url' do + let(:address) { 'http://sushi.com:815/fish?a=1' } + + it { expect(subject.port).to eq(815) } + it { expect(subject.path_prefix).to eq('/fish') } + it { expect(subject.params).to eq('a' => '1') } + end +end + +shared_examples 'default connection options' do + after { Faraday.default_connection_options = nil } + + it 'works with implicit url' do + conn = Faraday.new 'http://sushi.com/foo' + expect(conn.options.timeout).to eq(10) + end + + it 'works with option url' do + conn = Faraday.new url: 'http://sushi.com/foo' + expect(conn.options.timeout).to eq(10) + end + + it 'works with instance connection options' do + conn = Faraday.new 'http://sushi.com/foo', request: { open_timeout: 1 } + expect(conn.options.timeout).to eq(10) + expect(conn.options.open_timeout).to eq(1) + end + + it 'default connection options persist with an instance overriding' do + conn = Faraday.new 'http://nigiri.com/bar' + conn.options.timeout = 1 + expect(Faraday.default_connection_options.request.timeout).to eq(10) + + other = Faraday.new url: 'https://sushi.com/foo' + other.options.timeout = 1 + + expect(Faraday.default_connection_options.request.timeout).to eq(10) + end + + it 'default connection uses default connection options' do + expect(Faraday.default_connection.options.timeout).to eq(10) + end +end + +RSpec.describe Faraday::Connection do + let(:conn) { Faraday::Connection.new(url, options) } + let(:url) { nil } + let(:options) { nil } + + describe '.new' do + subject { conn } + + context 'with implicit url param' do + # Faraday::Connection.new('http://sushi.com') + let(:url) { address } + + it_behaves_like 'initializer with url' + end + + context 'with explicit url param' do + # Faraday::Connection.new(url: 'http://sushi.com') + let(:url) { { url: address } } + + it_behaves_like 'initializer with url' + end + + context 'with custom builder' do + let(:custom_builder) { Faraday::RackBuilder.new } + let(:options) { { builder: custom_builder } } + + it { expect(subject.builder).to eq(custom_builder) } + end + + context 'with custom params' do + let(:options) { { params: { a: 1 } } } + + it { expect(subject.params).to eq('a' => 1) } + end + + context 'with custom params and params in url' do + let(:url) { 'http://sushi.com/fish?a=1&b=2' } + let(:options) { { params: { a: 3 } } } + it { expect(subject.params).to eq('a' => 3, 'b' => '2') } + end + + context 'with custom headers' do + let(:options) { { headers: { user_agent: 'Faraday' } } } + + it { expect(subject.headers['User-agent']).to eq('Faraday') } + end + + context 'with ssl false' do + let(:options) { { ssl: { verify: false } } } + + it { expect(subject.ssl.verify?).to be_falsey } + end + + context 'with empty block' do + let(:conn) { Faraday::Connection.new {} } + + it { expect(conn.builder.handlers.size).to eq(0) } + end + + context 'with block' do + let(:conn) do + Faraday::Connection.new(params: { 'a' => '1' }) do |faraday| + faraday.adapter :net_http + faraday.url_prefix = 'http://sushi.com/omnom' + end + end + + it { expect(conn.builder.handlers.size).to eq(0) } + it { expect(conn.path_prefix).to eq('/omnom') } + end + end + + describe '#close' do + it 'can close underlying app' do + expect(conn.app).to receive(:close) + conn.close + end + end + + describe 'basic_auth' do + subject { conn } + + context 'calling the #basic_auth method' do + before { subject.basic_auth 'Aladdin', 'open sesame' } + + it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') } + end + + context 'adding basic auth info to url' do + let(:url) { 'http://Aladdin:open%20sesame@sushi.com/fish' } + + it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') } + end + end + + describe '#token_auth' do + before { subject.token_auth('abcdef', nonce: 'abc') } + + it { expect(subject.headers['Authorization']).to eq('Token nonce="abc", token="abcdef"') } + end + + describe '#build_exclusive_url' do + context 'with relative path' do + subject { conn.build_exclusive_url('sake.html') } + + it 'uses connection host as default host' do + conn.host = 'sushi.com' + expect(subject.host).to eq('sushi.com') + expect(subject.scheme).to eq('http') + end + + it do + conn.path_prefix = '/fish' + expect(subject.path).to eq('/fish/sake.html') + end + + it do + conn.path_prefix = '/' + expect(subject.path).to eq('/sake.html') + end + + it do + conn.path_prefix = 'fish' + expect(subject.path).to eq('/fish/sake.html') + end + + it do + conn.path_prefix = '/fish/' + expect(subject.path).to eq('/fish/sake.html') + end + end + + context 'with absolute path' do + subject { conn.build_exclusive_url('/sake.html') } + + after { expect(subject.path).to eq('/sake.html') } + + it { conn.path_prefix = '/fish' } + it { conn.path_prefix = '/' } + it { conn.path_prefix = 'fish' } + it { conn.path_prefix = '/fish/' } + end + + context 'with complete url' do + subject { conn.build_exclusive_url('http://sushi.com/sake.html?a=1') } + + it { expect(subject.scheme).to eq('http') } + it { expect(subject.host).to eq('sushi.com') } + it { expect(subject.port).to eq(80) } + it { expect(subject.path).to eq('/sake.html') } + it { expect(subject.query).to eq('a=1') } + end + + it 'overrides connection port for absolute url' do + conn.port = 23 + uri = conn.build_exclusive_url('http://sushi.com') + expect(uri.port).to eq(80) + end + + it 'does not add ending slash given nil url' do + conn.url_prefix = 'http://sushi.com/nigiri' + uri = conn.build_exclusive_url + expect(uri.path).to eq('/nigiri') + end + + it 'does not add ending slash given empty url' do + conn.url_prefix = 'http://sushi.com/nigiri' + uri = conn.build_exclusive_url('') + expect(uri.path).to eq('/nigiri') + end + + it 'does not use connection params' do + conn.url_prefix = 'http://sushi.com/nigiri' + conn.params = { a: 1 } + expect(conn.build_exclusive_url.to_s).to eq('http://sushi.com/nigiri') + end + + it 'allows to provide params argument' do + conn.url_prefix = 'http://sushi.com/nigiri' + conn.params = { a: 1 } + params = Faraday::Utils::ParamsHash.new + params[:a] = 2 + uri = conn.build_exclusive_url(nil, params) + expect(uri.to_s).to eq('http://sushi.com/nigiri?a=2') + end + + it 'handles uri instances' do + uri = conn.build_exclusive_url(URI('/sake.html')) + expect(uri.path).to eq('/sake.html') + end + + context 'with url_prefixed connection' do + let(:url) { 'http://sushi.com/sushi/' } + + it 'parses url and changes scheme' do + conn.scheme = 'https' + uri = conn.build_exclusive_url('sake.html') + expect(uri.to_s).to eq('https://sushi.com/sushi/sake.html') + end + + it 'joins url to base with ending slash' do + uri = conn.build_exclusive_url('sake.html') + expect(uri.to_s).to eq('http://sushi.com/sushi/sake.html') + end + + it 'used default base with ending slash' do + uri = conn.build_exclusive_url + expect(uri.to_s).to eq('http://sushi.com/sushi/') + end + + it 'overrides base' do + uri = conn.build_exclusive_url('/sake/') + expect(uri.to_s).to eq('http://sushi.com/sake/') + end + end + end + + describe '#build_url' do + let(:url) { 'http://sushi.com/nigiri' } + + it 'uses params' do + conn.params = { a: 1, b: 1 } + expect(conn.build_url.to_s).to eq('http://sushi.com/nigiri?a=1&b=1') + end + + it 'merges params' do + conn.params = { a: 1, b: 1 } + url = conn.build_url(nil, b: 2, c: 3) + expect(url.to_s).to eq('http://sushi.com/nigiri?a=1&b=2&c=3') + end + end + + describe '#build_request' do + let(:url) { 'https://asushi.com/sake.html' } + let(:request) { conn.build_request(:get) } + + before do + conn.headers = { 'Authorization' => 'token abc123' } + request.headers.delete('Authorization') + end + + it { expect(conn.headers.keys).to eq(['Authorization']) } + it { expect(conn.headers.include?('Authorization')).to be_truthy } + it { expect(request.headers.keys).to be_empty } + it { expect(request.headers.include?('Authorization')).to be_falsey } + end + + describe '#to_env' do + subject { conn.build_request(:get).to_env(conn).url } + + let(:url) { 'http://sushi.com/sake.html' } + let(:options) { { params: @params } } + + it 'parses url params into query' do + @params = { 'a[b]' => '1 + 2' } + expect(subject.query).to eq('a%5Bb%5D=1+%2B+2') + end + + it 'escapes per spec' do + @params = { 'a' => '1+2 foo~bar.-baz' } + expect(subject.query).to eq('a=1%2B2+foo~bar.-baz') + end + + it 'bracketizes nested params in query' do + @params = { 'a' => { 'b' => 'c' } } + expect(subject.query).to eq('a%5Bb%5D=c') + end + + it 'bracketizes repeated params in query' do + @params = { 'a' => [1, 2] } + expect(subject.query).to eq('a%5B%5D=1&a%5B%5D=2') + end + + it 'without braketizing repeated params in query' do + @params = { 'a' => [1, 2] } + conn.options.params_encoder = Faraday::FlatParamsEncoder + expect(subject.query).to eq('a=1&a=2') + end + end + + describe 'proxy support' do + it 'accepts string' do + with_env 'http_proxy' => 'http://env-proxy.com:80' do + conn.proxy = 'http://proxy.com' + expect(conn.proxy.host).to eq('proxy.com') + end + end + + it 'accepts uri' do + with_env 'http_proxy' => 'http://env-proxy.com:80' do + conn.proxy = URI.parse('http://proxy.com') + expect(conn.proxy.host).to eq('proxy.com') + end + end + + it 'accepts hash with string uri' do + with_env 'http_proxy' => 'http://env-proxy.com:80' do + conn.proxy = { uri: 'http://proxy.com', user: 'rick' } + expect(conn.proxy.host).to eq('proxy.com') + expect(conn.proxy.user).to eq('rick') + end + end + + it 'accepts hash' do + with_env 'http_proxy' => 'http://env-proxy.com:80' do + conn.proxy = { uri: URI.parse('http://proxy.com'), user: 'rick' } + expect(conn.proxy.host).to eq('proxy.com') + expect(conn.proxy.user).to eq('rick') + end + end + + it 'accepts http env' do + with_env 'http_proxy' => 'http://env-proxy.com:80' do + expect(conn.proxy.host).to eq('env-proxy.com') + end + end + + it 'accepts http env with auth' do + with_env 'http_proxy' => 'http://a%40b:my%20pass@proxy.com:80' do + expect(conn.proxy.user).to eq('a@b') + expect(conn.proxy.password).to eq('my pass') + end + end + + it 'accepts env without scheme' do + with_env 'http_proxy' => 'localhost:8888' do + uri = conn.proxy[:uri] + expect(uri.host).to eq('localhost') + expect(uri.port).to eq(8888) + end + end + + it 'fetches no proxy from nil env' do + with_env 'http_proxy' => nil do + expect(conn.proxy).to be_nil + end + end + + it 'fetches no proxy from blank env' do + with_env 'http_proxy' => '' do + expect(conn.proxy).to be_nil + end + end + + it 'does not accept uppercase env' do + with_env 'HTTP_PROXY' => 'http://localhost:8888/' do + expect(conn.proxy).to be_nil + end + end + + it 'allows when url in no proxy list' do + with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do + conn = Faraday::Connection.new('http://example.com') + expect(conn.proxy).to be_nil + end + end + + it 'allows when prefixed url is not in no proxy list' do + with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do + conn = Faraday::Connection.new('http://prefixedexample.com') + expect(conn.proxy.host).to eq('proxy.com') + end + end + + it 'allows when subdomain url is in no proxy list' do + with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do + conn = Faraday::Connection.new('http://subdomain.example.com') + expect(conn.proxy).to be_nil + end + end + + it 'allows when url not in no proxy list' do + with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example2.com' do + conn = Faraday::Connection.new('http://example.com') + expect(conn.proxy.host).to eq('proxy.com') + end + end + + it 'allows when ip address is not in no proxy list but url is' do + with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'localhost' do + conn = Faraday::Connection.new('http://127.0.0.1') + expect(conn.proxy).to be_nil + end + end + + it 'allows when url is not in no proxy list but ip address is' do + with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => '127.0.0.1' do + conn = Faraday::Connection.new('http://localhost') + expect(conn.proxy).to be_nil + end + end + + it 'allows in multi element no proxy list' do + with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example0.com,example.com,example1.com' do + expect(Faraday::Connection.new('http://example0.com').proxy).to be_nil + expect(Faraday::Connection.new('http://example.com').proxy).to be_nil + expect(Faraday::Connection.new('http://example1.com').proxy).to be_nil + expect(Faraday::Connection.new('http://example2.com').proxy.host).to eq('proxy.com') + end + end + + it 'test proxy requires uri' do + expect { conn.proxy = { uri: :bad_uri, user: 'rick' } }.to raise_error(ArgumentError) + end + + it 'uses env http_proxy' do + with_env 'http_proxy' => 'http://proxy.com' do + conn = Faraday.new + expect(conn.instance_variable_get('@manual_proxy')).to be_falsey + expect(conn.proxy_for_request('http://google.co.uk').host).to eq('proxy.com') + end + end + + it 'uses processes no_proxy before http_proxy' do + with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'google.co.uk' do + conn = Faraday.new + expect(conn.instance_variable_get('@manual_proxy')).to be_falsey + expect(conn.proxy_for_request('http://google.co.uk')).to be_nil + end + end + + it 'uses env https_proxy' do + with_env 'https_proxy' => 'https://proxy.com' do + conn = Faraday.new + expect(conn.instance_variable_get('@manual_proxy')).to be_falsey + expect(conn.proxy_for_request('https://google.co.uk').host).to eq('proxy.com') + end + end + + it 'uses processes no_proxy before https_proxy' do + with_env 'https_proxy' => 'https://proxy.com', 'no_proxy' => 'google.co.uk' do + conn = Faraday.new + expect(conn.instance_variable_get('@manual_proxy')).to be_falsey + expect(conn.proxy_for_request('https://google.co.uk')).to be_nil + end + end + + it 'gives priority to manually set proxy' do + with_env 'https_proxy' => 'https://proxy.com', 'no_proxy' => 'google.co.uk' do + conn = Faraday.new + conn.proxy = 'http://proxy2.com' + + expect(conn.instance_variable_get('@manual_proxy')).to be_truthy + expect(conn.proxy_for_request('https://google.co.uk').host).to eq('proxy2.com') + end + end + + it 'ignores env proxy if set that way' do + with_env_proxy_disabled do + with_env 'http_proxy' => 'http://duncan.proxy.com:80' do + expect(conn.proxy).to be_nil + end + end + end + + context 'performing a request' do + before { stub_request(:get, 'http://example.com') } + + it 'dynamically checks proxy' do + with_env 'http_proxy' => 'http://proxy.com:80' do + conn = Faraday.new + expect(conn.proxy.uri.host).to eq('proxy.com') + + conn.get('http://example.com') do |req| + expect(req.options.proxy.uri.host).to eq('proxy.com') + end + end + + conn.get('http://example.com') + expect(conn.instance_variable_get('@temp_proxy')).to be_nil + end + + it 'dynamically check no proxy' do + with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do + conn = Faraday.new + + expect(conn.proxy.uri.host).to eq('proxy.com') + + conn.get('http://example.com') do |req| + expect(req.options.proxy).to be_nil + end + end + end + end + end + + describe '#dup' do + subject { conn.dup } + + let(:url) { 'http://sushi.com/foo' } + let(:options) do + { + ssl: { verify: :none }, + headers: { 'content-type' => 'text/plain' }, + params: { 'a' => '1' }, + request: { timeout: 5 } + } + end + + it { expect(subject.build_exclusive_url).to eq(conn.build_exclusive_url) } + it { expect(subject.headers['content-type']).to eq('text/plain') } + it { expect(subject.params['a']).to eq('1') } + + context 'after manual changes' do + before do + subject.basic_auth('', '') + subject.headers['content-length'] = 12 + subject.params['b'] = '2' + subject.options[:open_timeout] = 10 + end + + it { expect(subject.builder.handlers.size).to eq(1) } + it { expect(conn.builder.handlers.size).to eq(1) } + it { expect(conn.headers.key?('content-length')).to be_falsey } + it { expect(conn.params.key?('b')).to be_falsey } + it { expect(subject.options[:timeout]).to eq(5) } + it { expect(conn.options[:open_timeout]).to be_nil } + end + end + + describe '#respond_to?' do + it { expect(Faraday.respond_to?(:get)).to be_truthy } + it { expect(Faraday.respond_to?(:post)).to be_truthy } + end + + describe 'default_connection_options' do + context 'assigning a default value' do + before do + Faraday.default_connection_options = nil + Faraday.default_connection_options.request.timeout = 10 + end + + it_behaves_like 'default connection options' + end + + context 'assigning a hash' do + before { Faraday.default_connection_options = { request: { timeout: 10 } } } + + it_behaves_like 'default connection options' + end + end + + describe 'request params' do + context 'with simple url' do + let(:url) { 'http://example.com' } + let!(:stubbed) { stub_request(:get, 'http://example.com?a=a&p=3') } + + after { expect(stubbed).to have_been_made.once } + + it 'test_overrides_request_params' do + conn.get('?p=2&a=a', p: 3) + end + + it 'test_overrides_request_params_block' do + conn.get('?p=1&a=a', p: 2) do |req| + req.params[:p] = 3 + end + end + + it 'test_overrides_request_params_block_url' do + conn.get(nil, p: 2) do |req| + req.url('?p=1&a=a', 'p' => 3) + end + end + end + + context 'with url and extra params' do + let(:url) { 'http://example.com?a=1&b=2' } + let(:options) { { params: { c: 3 } } } + + it 'merges connection and request params' do + stubbed = stub_request(:get, 'http://example.com?a=1&b=2&c=3&limit=5&page=1') + conn.get('?page=1', limit: 5) + expect(stubbed).to have_been_made.once + end + + it 'allows to override all params' do + stubbed = stub_request(:get, 'http://example.com?b=b') + conn.get('?p=1&a=a', p: 2) do |req| + expect(req.params[:a]).to eq('a') + expect(req.params['c']).to eq(3) + expect(req.params['p']).to eq(2) + req.params = { b: 'b' } + expect(req.params['b']).to eq('b') + end + expect(stubbed).to have_been_made.once + end + + it 'allows to set params_encoder for single request' do + encoder = Object.new + def encoder.encode(params) + params.map { |k, v| "#{k.upcase}-#{v.to_s.upcase}" }.join(',') + end + stubbed = stub_request(:get, 'http://example.com/?A-1,B-2,C-3,FEELING-BLUE') + + conn.get('/', feeling: 'blue') do |req| + req.options.params_encoder = encoder + end + expect(stubbed).to have_been_made.once + end + end + + context 'with default params encoder' do + let!(:stubbed) { stub_request(:get, 'http://example.com?color%5B%5D=red&color%5B%5D=blue') } + after { expect(stubbed).to have_been_made.once } + + it 'supports array params in url' do + conn.get('http://example.com?color[]=red&color[]=blue') + end + + it 'supports array params in params' do + conn.get('http://example.com', color: %w[red blue]) + end + end + + context 'with flat params encoder' do + let(:options) { { request: { params_encoder: Faraday::FlatParamsEncoder } } } + let!(:stubbed) { stub_request(:get, 'http://example.com?color=blue') } + after { expect(stubbed).to have_been_made.once } + + it 'supports array params in params' do + conn.get('http://example.com', color: %w[red blue]) + end + + context 'with array param in url' do + let(:url) { 'http://example.com?color[]=red&color[]=blue' } + + it do + conn.get('/') + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/error_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/error_spec.rb new file mode 100644 index 000000000000..bea9f0c34a14 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/error_spec.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::ClientError do + describe '.initialize' do + subject { described_class.new(exception, response) } + let(:response) { nil } + + context 'with exception only' do + let(:exception) { RuntimeError.new('test') } + + it { expect(subject.wrapped_exception).to eq(exception) } + it { expect(subject.response).to be_nil } + it { expect(subject.message).to eq(exception.message) } + it { expect(subject.backtrace).to eq(exception.backtrace) } + it { expect(subject.inspect).to eq('#<Faraday::ClientError wrapped=#<RuntimeError: test>>') } + it { expect(subject.response_status).to be_nil } + end + + context 'with response hash' do + let(:exception) { { status: 400 } } + + it { expect(subject.wrapped_exception).to be_nil } + it { expect(subject.response).to eq(exception) } + it { expect(subject.message).to eq('the server responded with status 400') } + it { expect(subject.inspect).to eq('#<Faraday::ClientError response={:status=>400}>') } + it { expect(subject.response_status).to eq(400) } + end + + context 'with string' do + let(:exception) { 'custom message' } + + it { expect(subject.wrapped_exception).to be_nil } + it { expect(subject.response).to be_nil } + it { expect(subject.message).to eq('custom message') } + it { expect(subject.inspect).to eq('#<Faraday::ClientError #<Faraday::ClientError: custom message>>') } + it { expect(subject.response_status).to be_nil } + end + + context 'with anything else #to_s' do + let(:exception) { %w[error1 error2] } + + it { expect(subject.wrapped_exception).to be_nil } + it { expect(subject.response).to be_nil } + it { expect(subject.message).to eq('["error1", "error2"]') } + it { expect(subject.inspect).to eq('#<Faraday::ClientError #<Faraday::ClientError: ["error1", "error2"]>>') } + it { expect(subject.response_status).to be_nil } + end + + context 'with exception string and response hash' do + let(:exception) { 'custom message' } + let(:response) { { status: 400 } } + + it { expect(subject.wrapped_exception).to be_nil } + it { expect(subject.response).to eq(response) } + it { expect(subject.message).to eq('custom message') } + it { expect(subject.inspect).to eq('#<Faraday::ClientError response={:status=>400}>') } + it { expect(subject.response_status).to eq(400) } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/middleware_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/middleware_spec.rb new file mode 100644 index 000000000000..50b8ee1102ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/middleware_spec.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Middleware do + subject { described_class.new(app) } + let(:app) { double } + + describe 'options' do + context 'when options are passed to the middleware' do + subject { described_class.new(app, options) } + let(:options) { { field: 'value' } } + + it 'accepts options when initialized' do + expect(subject.options[:field]).to eq('value') + end + end + end + + describe '#on_request' do + subject do + Class.new(described_class) do + def on_request(env) + # do nothing + end + end.new(app) + end + + it 'is called by #call' do + expect(app).to receive(:call).and_return(app) + expect(app).to receive(:on_complete) + is_expected.to receive(:call).and_call_original + is_expected.to receive(:on_request) + subject.call(double) + end + end + + describe '#close' do + context "with app that doesn't support \#close" do + it 'should issue warning' do + is_expected.to receive(:warn) + subject.close + end + end + + context "with app that supports \#close" do + it 'should issue warning' do + expect(app).to receive(:close) + is_expected.to_not receive(:warn) + subject.close + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/env_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/env_spec.rb new file mode 100644 index 000000000000..04a4b5e88e84 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/env_spec.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Env do + subject(:env) { described_class.new } + + it 'allows to access members' do + expect(env.method).to be_nil + env.method = :get + expect(env.method).to eq(:get) + end + + it 'allows to access symbol non members' do + expect(env[:custom]).to be_nil + env[:custom] = :boom + expect(env[:custom]).to eq(:boom) + end + + it 'allows to access string non members' do + expect(env['custom']).to be_nil + env['custom'] = :boom + expect(env['custom']).to eq(:boom) + end + + it 'ignores false when fetching' do + ssl = Faraday::SSLOptions.new + ssl.verify = false + expect(ssl.fetch(:verify, true)).to be_falsey + end + + it 'retains custom members' do + env[:foo] = 'custom 1' + env[:bar] = :custom_2 + env2 = Faraday::Env.from(env) + env2[:baz] = 'custom 3' + + expect(env2[:foo]).to eq('custom 1') + expect(env2[:bar]).to eq(:custom_2) + expect(env[:baz]).to be_nil + end + + describe '#body' do + subject(:env) { described_class.from(body: { foo: 'bar' }) } + + context 'when response is not finished yet' do + it 'returns the request body' do + expect(env.body).to eq(foo: 'bar') + end + end + + context 'when response is finished' do + before do + env.status = 200 + env.body = { bar: 'foo' } + env.response = Faraday::Response.new(env) + end + + it 'returns the response body' do + expect(env.body).to eq(bar: 'foo') + end + + it 'allows to access request_body' do + expect(env.request_body).to eq(foo: 'bar') + end + + it 'allows to access response_body' do + expect(env.response_body).to eq(bar: 'foo') + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/options_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/options_spec.rb new file mode 100644 index 000000000000..9758eccf5806 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/options_spec.rb @@ -0,0 +1,297 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Options do + SubOptions = Class.new(Faraday::Options.new(:sub_a, :sub_b)) + class ParentOptions < Faraday::Options.new(:a, :b, :c) + options c: SubOptions + end + + describe '#merge' do + it 'merges options with hashes' do + options = ParentOptions.new(1) + expect(options.a).to eq(1) + expect(options.b).to be_nil + + dup = options.merge a: 2, b: 3 + expect(dup.a).to eq(2) + expect(dup.b).to eq(3) + expect(options.a).to eq(1) + expect(options.b).to be_nil + end + + it 'deeply merges two options' do + sub_opts1 = SubOptions.from(sub_a: 3) + sub_opts2 = SubOptions.from(sub_b: 4) + opt1 = ParentOptions.from(a: 1, c: sub_opts1) + opt2 = ParentOptions.from(b: 2, c: sub_opts2) + + merged = opt1.merge(opt2) + + expected_sub_opts = SubOptions.from(sub_a: 3, sub_b: 4) + expected = ParentOptions.from(a: 1, b: 2, c: expected_sub_opts) + expect(merged).to eq(expected) + end + + it 'deeply merges options with hashes' do + sub_opts1 = SubOptions.from(sub_a: 3) + sub_opts2 = { sub_b: 4 } + opt1 = ParentOptions.from(a: 1, c: sub_opts1) + opt2 = { b: 2, c: sub_opts2 } + + merged = opt1.merge(opt2) + + expected_sub_opts = SubOptions.from(sub_a: 3, sub_b: 4) + expected = ParentOptions.from(a: 1, b: 2, c: expected_sub_opts) + expect(merged).to eq(expected) + end + + it 'deeply merges options with nil' do + sub_opts = SubOptions.new(3, 4) + options = ParentOptions.new(1, 2, sub_opts) + expect(options.a).to eq(1) + expect(options.b).to eq(2) + expect(options.c.sub_a).to eq(3) + expect(options.c.sub_b).to eq(4) + + options2 = ParentOptions.from(b: 5, c: nil) + + merged = options.merge(options2) + + expect(merged.b).to eq(5) + expect(merged.c).to eq(sub_opts) + end + + it 'deeply merges options with options having nil sub-options' do + options = ParentOptions.from(a: 1) + + sub_opts = SubOptions.new(3, 4) + options2 = ParentOptions.from(b: 2, c: sub_opts) + + expect(options.a).to eq(1) + expect(options2.b).to eq(2) + expect(options2.c.sub_a).to eq(3) + expect(options2.c.sub_b).to eq(4) + + merged = options.merge(options2) + + expect(merged.c).to eq(sub_opts) + end + + describe '#dup' do + it 'duplicate options but not sub-options' do + sub_opts = SubOptions.from(sub_a: 3) + opts = ParentOptions.from(b: 1, c: sub_opts) + + duped = opts.dup + duped.b = 2 + duped.c.sub_a = 4 + + expect(opts.b).to eq(1) + expect(opts.c.sub_a).to eq(4) + end + end + + describe '#deep_dup' do + it 'duplicate options and also suboptions' do + sub_opts = SubOptions.from(sub_a: 3) + opts = ParentOptions.from(b: 1, c: sub_opts) + + duped = opts.deep_dup + duped.b = 2 + duped.c.sub_a = 4 + + expect(opts.b).to eq(1) + expect(opts.c.sub_a).to eq(3) + end + end + + describe '#clear' do + it 'clears the options' do + options = SubOptions.new(1) + expect(options.empty?).not_to be_truthy + options.clear + expect(options.empty?).to be_truthy + end + end + + describe '#empty?' do + it 'returns true only if all options are nil' do + options = SubOptions.new + expect(options.empty?).to be_truthy + options.sub_a = 1 + expect(options.empty?).not_to be_truthy + options.delete(:sub_a) + expect(options.empty?).to be_truthy + end + end + + describe '#each_key' do + it 'allows to iterate through keys' do + options = ParentOptions.new(1, 2, 3) + enum = options.each_key + expect(enum.next.to_sym).to eq(:a) + expect(enum.next.to_sym).to eq(:b) + expect(enum.next.to_sym).to eq(:c) + end + end + + describe '#key?' do + it 'returns true if the key exists and is not nil' do + options = SubOptions.new + expect(options.key?(:sub_a)).not_to be_truthy + options.sub_a = 1 + expect(options.key?(:sub_a)).to be_truthy + end + end + + describe '#each_value' do + it 'allows to iterate through values' do + options = ParentOptions.new(1, 2, 3) + enum = options.each_value + expect(enum.next).to eq(1) + expect(enum.next).to eq(2) + expect(enum.next).to eq(3) + end + end + + describe '#value?' do + it 'returns true if any key has that value' do + options = SubOptions.new + expect(options.value?(1)).not_to be_truthy + options.sub_a = 1 + expect(options.value?(1)).to be_truthy + end + end + + describe '#update' do + it 'updates options from hashes' do + options = ParentOptions.new(1) + expect(options.a).to eq(1) + expect(options.b).to be_nil + + updated = options.update a: 2, b: 3 + expect(options.a).to eq(2) + expect(options.b).to eq(3) + expect(updated).to eq(options) + end + end + + describe '#delete' do + it 'allows to remove value for key' do + options = ParentOptions.new(1) + expect(options.a).to eq(1) + expect(options.delete(:a)).to eq(1) + expect(options.a).to be_nil + end + end + + describe '#from' do + it { expect { ParentOptions.from invalid: 1 }.to raise_error(NoMethodError) } + + it 'works with options' do + options = ParentOptions.new(1) + + value = ParentOptions.from(options) + expect(value.a).to eq(1) + expect(value.b).to be_nil + end + + it 'works with options with sub object' do + sub = SubOptions.new(1) + options = ParentOptions.from a: 1, c: sub + expect(options).to be_a_kind_of(ParentOptions) + expect(options.a).to eq(1) + expect(options.b).to be_nil + expect(options.c).to be_a_kind_of(SubOptions) + expect(options.c.sub_a).to eq(1) + end + + it 'works with hash' do + options = ParentOptions.from a: 1 + expect(options).to be_a_kind_of(ParentOptions) + expect(options.a).to eq(1) + expect(options.b).to be_nil + end + + it 'works with hash with sub object' do + options = ParentOptions.from a: 1, c: { sub_a: 1 } + expect(options).to be_a_kind_of(ParentOptions) + expect(options.a).to eq(1) + expect(options.b).to be_nil + expect(options.c).to be_a_kind_of(SubOptions) + expect(options.c.sub_a).to eq(1) + end + + it 'works with deep hash' do + hash = { b: 1 } + options = ParentOptions.from a: hash + expect(options.a[:b]).to eq(1) + + hash[:b] = 2 + expect(options.a[:b]).to eq(1) + + options.a[:b] = 3 + expect(hash[:b]).to eq(2) + expect(options.a[:b]).to eq(3) + end + + it 'works with nil' do + options = ParentOptions.from(nil) + expect(options).to be_a_kind_of(ParentOptions) + expect(options.a).to be_nil + expect(options.b).to be_nil + end + + it 'respects inheritance' do + subclass = Class.new(ParentOptions) + options = subclass.from(c: { sub_a: 'hello' }) + expect(options.c).to be_a_kind_of(SubOptions) + expect(options.c.sub_a).to eq('hello') + end + end + + describe '#memoized' do + subject(:options_class) { Class.new(ParentOptions) } + it 'requires block' do + expect { options_class.memoized(:a) }.to raise_error(ArgumentError) + end + + it 'accepts block' do + options_class.memoized(:a) { :foo } + expect(options_class.new.a).to eql(:foo) + end + end + + describe '#fetch' do + subject { SubOptions.new } + + context 'when the fetched key has no value' do + it 'uses falsey default' do + expect(subject.fetch(:sub_a, false) { |_| :blah }).to be_falsey + end + + it 'accepts block' do + expect(subject.fetch(:sub_a) { |k| "yo #{k.inspect}" }).to eq('yo :sub_a') + end + + it 'needs a default if key is missing' do + expect { subject.fetch(:sub_a) }.to raise_error(Faraday::Options.fetch_error_class) + end + end + + context 'when the fetched key has a value' do + before do + subject.sub_a = 1 + end + + it 'grabs value' do + expect(subject.fetch(:sub_a, false) { |_| :blah }).to eq(1) + end + + it 'works with key' do + expect(subject.fetch(:sub_a)).to eq(1) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/proxy_options_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/proxy_options_spec.rb new file mode 100644 index 000000000000..a64ef0e27bc7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/proxy_options_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::ProxyOptions do + describe '#from' do + it 'works with string' do + options = Faraday::ProxyOptions.from 'http://user:pass@example.org' + expect(options.user).to eq('user') + expect(options.password).to eq('pass') + expect(options.uri).to be_a_kind_of(URI) + expect(options.path).to eq('') + expect(options.port).to eq(80) + expect(options.host).to eq('example.org') + expect(options.scheme).to eq('http') + expect(options.inspect).to match('#<Faraday::ProxyOptions uri=') + end + + it 'works with nil' do + options = Faraday::ProxyOptions.from nil + expect(options).to be_a_kind_of(Faraday::ProxyOptions) + expect(options.inspect).to eq('#<Faraday::ProxyOptions (empty)>') + end + + it 'works with no auth' do + proxy = Faraday::ProxyOptions.from 'http://example.org' + expect(proxy.user).to be_nil + expect(proxy.password).to be_nil + end + end + + it 'allows hash access' do + proxy = Faraday::ProxyOptions.from 'http://a%40b:pw%20d@example.org' + expect(proxy.user).to eq('a@b') + expect(proxy[:user]).to eq('a@b') + expect(proxy.password).to eq('pw d') + expect(proxy[:password]).to eq('pw d') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/request_options_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/request_options_spec.rb new file mode 100644 index 000000000000..8c1bb9921abd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/options/request_options_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::RequestOptions do + subject(:options) { Faraday::RequestOptions.new } + + it 'allows to set the request proxy' do + expect(options.proxy).to be_nil + + expect { options[:proxy] = { booya: 1 } }.to raise_error(NoMethodError) + + options[:proxy] = { user: 'user' } + expect(options.proxy).to be_a_kind_of(Faraday::ProxyOptions) + expect(options.proxy.user).to eq('user') + + options.proxy = nil + expect(options.proxy).to be_nil + expect(options.inspect).to eq('#<Faraday::RequestOptions (empty)>') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/params_encoders/flat_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/params_encoders/flat_spec.rb new file mode 100644 index 000000000000..115342e53239 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/params_encoders/flat_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require 'rack/utils' + +RSpec.describe Faraday::FlatParamsEncoder do + it_behaves_like 'a params encoder' + + it 'decodes arrays' do + query = 'a=one&a=two&a=three' + expected = { 'a' => %w[one two three] } + expect(subject.decode(query)).to eq(expected) + end + + it 'decodes boolean values' do + query = 'a=true&b=false' + expected = { 'a' => 'true', 'b' => 'false' } + expect(subject.decode(query)).to eq(expected) + end + + it 'encodes boolean values' do + params = { a: true, b: false } + expect(subject.encode(params)).to eq('a=true&b=false') + end + + it 'encodes boolean values in array' do + params = { a: [true, false] } + expect(subject.encode(params)).to eq('a=true&a=false') + end + + it 'encodes empty array in hash' do + params = { a: [] } + expect(subject.encode(params)).to eq('a=') + end + + it 'encodes unsorted when asked' do + params = { b: false, a: true } + expect(subject.encode(params)).to eq('a=true&b=false') + Faraday::FlatParamsEncoder.sort_params = false + expect(subject.encode(params)).to eq('b=false&a=true') + Faraday::FlatParamsEncoder.sort_params = true + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/params_encoders/nested_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/params_encoders/nested_spec.rb new file mode 100644 index 000000000000..98c372ef682f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/params_encoders/nested_spec.rb @@ -0,0 +1,142 @@ +# frozen_string_literal: true + +require 'rack/utils' + +RSpec.describe Faraday::NestedParamsEncoder do + it_behaves_like 'a params encoder' + + it 'decodes arrays' do + query = 'a[1]=one&a[2]=two&a[3]=three' + expected = { 'a' => %w[one two three] } + expect(subject.decode(query)).to eq(expected) + end + + it 'decodes hashes' do + query = 'a[b1]=one&a[b2]=two&a[b][c]=foo' + expected = { 'a' => { 'b1' => 'one', 'b2' => 'two', 'b' => { 'c' => 'foo' } } } + expect(subject.decode(query)).to eq(expected) + end + + it 'decodes nested arrays rack compat' do + query = 'a[][one]=1&a[][two]=2&a[][one]=3&a[][two]=4' + expected = Rack::Utils.parse_nested_query(query) + expect(subject.decode(query)).to eq(expected) + end + + it 'decodes nested array mixed types' do + query = 'a[][one]=1&a[]=2&a[]=&a[]' + expected = Rack::Utils.parse_nested_query(query) + expect(subject.decode(query)).to eq(expected) + end + + it 'decodes nested ignores invalid array' do + query = '[][a]=1&b=2' + expected = { 'a' => '1', 'b' => '2' } + expect(subject.decode(query)).to eq(expected) + end + + it 'decodes nested ignores repeated array notation' do + query = 'a[][][]=1' + expected = { 'a' => ['1'] } + expect(subject.decode(query)).to eq(expected) + end + + it 'decodes nested ignores malformed keys' do + query = '=1&[]=2' + expected = {} + expect(subject.decode(query)).to eq(expected) + end + + it 'decodes nested subkeys dont have to be in brackets' do + query = 'a[b]c[d]e=1' + expected = { 'a' => { 'b' => { 'c' => { 'd' => { 'e' => '1' } } } } } + expect(subject.decode(query)).to eq(expected) + end + + it 'decodes nested final value overrides any type' do + query = 'a[b][c]=1&a[b]=2' + expected = { 'a' => { 'b' => '2' } } + expect(subject.decode(query)).to eq(expected) + end + + it 'encodes rack compat' do + params = { a: [{ one: '1', two: '2' }, '3', ''] } + result = Faraday::Utils.unescape(Faraday::NestedParamsEncoder.encode(params)).split('&') + expected = Rack::Utils.build_nested_query(params).split('&') + expect(result).to match_array(expected) + end + + it 'encodes empty string array value' do + expected = 'baz=&foo%5Bbar%5D=' + result = Faraday::NestedParamsEncoder.encode(foo: { bar: '' }, baz: '') + expect(result).to eq(expected) + end + + it 'encodes nil array value' do + expected = 'baz&foo%5Bbar%5D' + result = Faraday::NestedParamsEncoder.encode(foo: { bar: nil }, baz: nil) + expect(result).to eq(expected) + end + + it 'encodes empty array value' do + expected = 'baz%5B%5D&foo%5Bbar%5D%5B%5D' + result = Faraday::NestedParamsEncoder.encode(foo: { bar: [] }, baz: []) + expect(result).to eq(expected) + end + + it 'encodes boolean values' do + params = { a: true, b: false } + expect(subject.encode(params)).to eq('a=true&b=false') + end + + it 'encodes boolean values in array' do + params = { a: [true, false] } + expect(subject.encode(params)).to eq('a%5B%5D=true&a%5B%5D=false') + end + + it 'encodes unsorted when asked' do + params = { b: false, a: true } + expect(subject.encode(params)).to eq('a=true&b=false') + Faraday::NestedParamsEncoder.sort_params = false + expect(subject.encode(params)).to eq('b=false&a=true') + Faraday::NestedParamsEncoder.sort_params = true + end + + shared_examples 'a wrong decoding' do + it do + expect { subject.decode(query) }.to raise_error(TypeError) do |e| + expect(e.message).to eq(error_message) + end + end + end + + context 'when expecting hash but getting string' do + let(:query) { 'a=1&a[b]=2' } + let(:error_message) { "expected Hash (got String) for param `a'" } + it_behaves_like 'a wrong decoding' + end + + context 'when expecting hash but getting array' do + let(:query) { 'a[]=1&a[b]=2' } + let(:error_message) { "expected Hash (got Array) for param `a'" } + it_behaves_like 'a wrong decoding' + end + + context 'when expecting nested hash but getting non nested' do + let(:query) { 'a[b]=1&a[b][c]=2' } + let(:error_message) { "expected Hash (got String) for param `b'" } + it_behaves_like 'a wrong decoding' + end + + context 'when expecting array but getting hash' do + let(:query) { 'a[b]=1&a[]=2' } + let(:error_message) { "expected Array (got Hash) for param `a'" } + it_behaves_like 'a wrong decoding' + end + + context 'when expecting array but getting string' do + let(:query) { 'a=1&a[]=2' } + let(:error_message) { "expected Array (got String) for param `a'" } + it_behaves_like 'a wrong decoding' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/rack_builder_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/rack_builder_spec.rb new file mode 100644 index 000000000000..aa28564c58ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/rack_builder_spec.rb @@ -0,0 +1,345 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::RackBuilder do + # mock handler classes + (Handler = Struct.new(:app)).class_eval do + def call(env) + env[:request_headers]['X-Middleware'] ||= '' + env[:request_headers]['X-Middleware'] += ":#{self.class.name.split('::').last}" + app.call(env) + end + end + + class Apple < Handler + end + class Orange < Handler + end + class Banana < Handler + end + + class Broken < Faraday::Middleware + dependency 'zomg/i_dont/exist' + end + + subject { conn.builder } + + context 'with default stack' do + let(:conn) { Faraday::Connection.new } + + it { expect(subject[0]).to eq(Faraday::Request.lookup_middleware(:url_encoded)) } + it { expect(subject.adapter).to eq(Faraday::Adapter.lookup_middleware(Faraday.default_adapter)) } + end + + context 'with custom empty block' do + let(:conn) { Faraday::Connection.new {} } + + it { expect(subject[0]).to be_nil } + it { expect(subject.adapter).to eq(Faraday::Adapter.lookup_middleware(Faraday.default_adapter)) } + end + + context 'with custom adapter only' do + let(:conn) do + Faraday::Connection.new do |builder| + builder.adapter :test do |stub| + stub.get('/') { |_| [200, {}, ''] } + end + end + end + + it { expect(subject[0]).to be_nil } + it { expect(subject.adapter).to eq(Faraday::Adapter.lookup_middleware(:test)) } + end + + context 'with custom handler and adapter' do + let(:conn) do + Faraday::Connection.new do |builder| + builder.use Apple + builder.adapter :test do |stub| + stub.get('/') { |_| [200, {}, ''] } + end + end + end + + it 'locks the stack after making a request' do + expect(subject.locked?).to be_falsey + conn.get('/') + expect(subject.locked?).to be_truthy + expect { subject.use(Orange) }.to raise_error(Faraday::RackBuilder::StackLocked) + end + + it 'dup stack is unlocked' do + expect(subject.locked?).to be_falsey + subject.lock! + expect(subject.locked?).to be_truthy + dup = subject.dup + expect(dup).to eq(subject) + expect(dup.locked?).to be_falsey + end + + it 'allows to compare handlers' do + expect(subject.handlers.first).to eq(Faraday::RackBuilder::Handler.new(Apple)) + end + end + + context 'when having a single handler' do + let(:conn) { Faraday::Connection.new {} } + + before { subject.use(Apple) } + + it { expect(subject.handlers).to eq([Apple]) } + + it 'allows rebuilding' do + subject.build do |builder| + builder.use(Orange) + end + expect(subject.handlers).to eq([Orange]) + end + + it 'allows use' do + subject.use(Orange) + expect(subject.handlers).to eq([Apple, Orange]) + end + + it 'allows insert_before' do + subject.insert_before(Apple, Orange) + expect(subject.handlers).to eq([Orange, Apple]) + end + + it 'allows insert_after' do + subject.insert_after(Apple, Orange) + expect(subject.handlers).to eq([Apple, Orange]) + end + + it 'raises an error trying to use an unregistered symbol' do + expect { subject.use(:apple) }.to raise_error(Faraday::Error) do |err| + expect(err.message).to eq(':apple is not registered on Faraday::Middleware') + end + end + end + + context 'with custom registered middleware' do + let(:conn) { Faraday::Connection.new {} } + + after { Faraday::Middleware.unregister_middleware(:apple) } + + it 'allows to register with constant' do + Faraday::Middleware.register_middleware(apple: Apple) + subject.use(:apple) + expect(subject.handlers).to eq([Apple]) + end + + it 'allows to register with symbol' do + Faraday::Middleware.register_middleware(apple: :Apple) + subject.use(:apple) + expect(subject.handlers).to eq([Apple]) + end + + it 'allows to register with string' do + Faraday::Middleware.register_middleware(apple: 'Apple') + subject.use(:apple) + expect(subject.handlers).to eq([Apple]) + end + + it 'allows to register with Proc' do + Faraday::Middleware.register_middleware(apple: -> { Apple }) + subject.use(:apple) + expect(subject.handlers).to eq([Apple]) + end + end + + context 'when having two handlers' do + let(:conn) { Faraday::Connection.new {} } + + before do + subject.use(Apple) + subject.use(Orange) + end + + it 'allows insert_before' do + subject.insert_before(Orange, Banana) + expect(subject.handlers).to eq([Apple, Banana, Orange]) + end + + it 'allows insert_after' do + subject.insert_after(Apple, Banana) + expect(subject.handlers).to eq([Apple, Banana, Orange]) + end + + it 'allows to swap handlers' do + subject.swap(Apple, Banana) + expect(subject.handlers).to eq([Banana, Orange]) + end + + it 'allows to delete a handler' do + subject.delete(Apple) + expect(subject.handlers).to eq([Orange]) + end + end + + context 'when having a handler with broken dependency' do + let(:conn) do + Faraday::Connection.new do |builder| + builder.adapter :test do |stub| + stub.get('/') { |_| [200, {}, ''] } + end + end + end + + before { subject.use(Broken) } + + it 'raises an error while making a request' do + expect { conn.get('/') }.to raise_error(RuntimeError) do |err| + expect(err.message).to match(%r{missing dependency for Broken: .+ -- zomg/i_dont/exist}) + end + end + end + + context 'when middleware is added with named arguments' do + let(:conn) { Faraday::Connection.new {} } + + let(:dog_middleware) do + Class.new(Faraday::Middleware) do + attr_accessor :name + + def initialize(app, name:) + super(app) + @name = name + end + end + end + let(:dog) do + subject.handlers.find { |handler| handler == dog_middleware }.build + end + + it 'adds a handler to construct middleware with options passed to use' do + subject.use dog_middleware, name: 'Rex' + expect { dog }.to_not output( + /warning: Using the last argument as keyword parameters is deprecated/ + ).to_stderr + expect(dog.name).to eq('Rex') + end + end + + context 'when a request adapter is added with named arguments' do + let(:conn) { Faraday::Connection.new {} } + + let(:cat_request) do + Class.new(Faraday::Middleware) do + attr_accessor :name + + def initialize(app, name:) + super(app) + @name = name + end + end + end + let(:cat) do + subject.handlers.find { |handler| handler == cat_request }.build + end + + it 'adds a handler to construct request adapter with options passed to request' do + Faraday::Request.register_middleware cat_request: cat_request + subject.request :cat_request, name: 'Felix' + expect { cat }.to_not output( + /warning: Using the last argument as keyword parameters is deprecated/ + ).to_stderr + expect(cat.name).to eq('Felix') + end + end + + context 'when a response adapter is added with named arguments' do + let(:conn) { Faraday::Connection.new {} } + + let(:fish_response) do + Class.new(Faraday::Response::Middleware) do + attr_accessor :name + + def initialize(app, name:) + super(app) + @name = name + end + end + end + let(:fish) do + subject.handlers.find { |handler| handler == fish_response }.build + end + + it 'adds a handler to construct response adapter with options passed to response' do + Faraday::Response.register_middleware fish_response: fish_response + subject.response :fish_response, name: 'Bubbles' + expect { fish }.to_not output( + /warning: Using the last argument as keyword parameters is deprecated/ + ).to_stderr + expect(fish.name).to eq('Bubbles') + end + end + + context 'when a plain adapter is added with named arguments' do + let(:conn) { Faraday::Connection.new {} } + + let(:rabbit_adapter) do + Class.new(Faraday::Adapter) do + attr_accessor :name + + def initialize(app, name:) + super(app) + @name = name + end + end + end + let(:rabbit) do + subject.adapter.build + end + + it 'adds a handler to construct adapter with options passed to adapter' do + Faraday::Adapter.register_middleware rabbit_adapter: rabbit_adapter + subject.adapter :rabbit_adapter, name: 'Thumper' + expect { rabbit }.to_not output( + /warning: Using the last argument as keyword parameters is deprecated/ + ).to_stderr + expect(rabbit.name).to eq('Thumper') + end + end + + context 'when handlers are directly added or updated' do + let(:conn) { Faraday::Connection.new {} } + + let(:rock_handler) do + Class.new do + attr_accessor :name + + def initialize(_app, name:) + @name = name + end + end + end + let(:rock) do + subject.handlers.find { |handler| handler == rock_handler }.build + end + + it 'adds a handler to construct adapter with options passed to insert' do + subject.insert 0, rock_handler, name: 'Stony' + expect { rock }.to_not output( + /warning: Using the last argument as keyword parameters is deprecated/ + ).to_stderr + expect(rock.name).to eq('Stony') + end + + it 'adds a handler with options passed to insert_after' do + subject.insert_after 0, rock_handler, name: 'Rocky' + expect { rock }.to_not output( + /warning: Using the last argument as keyword parameters is deprecated/ + ).to_stderr + expect(rock.name).to eq('Rocky') + end + + it 'adds a handler with options passed to swap' do + subject.insert 0, rock_handler, name: 'Flint' + subject.swap 0, rock_handler, name: 'Chert' + expect { rock }.to_not output( + /warning: Using the last argument as keyword parameters is deprecated/ + ).to_stderr + expect(rock.name).to eq('Chert') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/authorization_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/authorization_spec.rb new file mode 100644 index 000000000000..3f13392e6817 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/authorization_spec.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Request::Authorization do + let(:conn) do + Faraday.new do |b| + b.request auth_type, *auth_config + b.adapter :test do |stub| + stub.get('/auth-echo') do |env| + [200, {}, env[:request_headers]['Authorization']] + end + end + end + end + + shared_examples 'does not interfere with existing authentication' do + context 'and request already has an authentication header' do + let(:response) { conn.get('/auth-echo', nil, authorization: 'Token token="bar"') } + + it 'does not interfere with existing authorization' do + expect(response.body).to eq('Token token="bar"') + end + end + end + + let(:response) { conn.get('/auth-echo') } + + describe 'basic_auth' do + let(:auth_type) { :basic_auth } + + context 'when passed correct params' do + let(:auth_config) { %w[aladdin opensesame] } + + it { expect(response.body).to eq('Basic YWxhZGRpbjpvcGVuc2VzYW1l') } + + include_examples 'does not interfere with existing authentication' + end + + context 'when passed very long values' do + let(:auth_config) { ['A' * 255, ''] } + + it { expect(response.body).to eq("Basic #{'QUFB' * 85}Og==") } + + include_examples 'does not interfere with existing authentication' + end + end + + describe 'token_auth' do + let(:auth_type) { :token_auth } + + context 'when passed correct params' do + let(:auth_config) { 'quux' } + + it { expect(response.body).to eq('Token token="quux"') } + + include_examples 'does not interfere with existing authentication' + end + + context 'when other values are provided' do + let(:auth_config) { ['baz', { foo: 42 }] } + + it { expect(response.body).to match(/^Token /) } + it { expect(response.body).to match(/token="baz"/) } + it { expect(response.body).to match(/foo="42"/) } + + include_examples 'does not interfere with existing authentication' + end + end + + describe 'authorization' do + let(:auth_type) { :authorization } + + context 'when passed two strings' do + let(:auth_config) { ['custom', 'abc def'] } + + it { expect(response.body).to eq('custom abc def') } + + include_examples 'does not interfere with existing authentication' + end + + context 'when passed a string and a hash' do + let(:auth_config) { ['baz', { foo: 42 }] } + + it { expect(response.body).to eq('baz foo="42"') } + + include_examples 'does not interfere with existing authentication' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/instrumentation_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/instrumentation_spec.rb new file mode 100644 index 000000000000..f8af4c4f5ab9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/instrumentation_spec.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Request::Instrumentation do + class FakeInstrumenter + attr_reader :instrumentations + + def initialize + @instrumentations = [] + end + + def instrument(name, env) + @instrumentations << [name, env] + yield + end + end + + let(:config) { {} } + let(:options) { Faraday::Request::Instrumentation::Options.from config } + let(:instrumenter) { FakeInstrumenter.new } + let(:conn) do + Faraday.new do |f| + f.request :instrumentation, config.merge(instrumenter: instrumenter) + f.adapter :test do |stub| + stub.get '/' do + [200, {}, 'ok'] + end + end + end + end + + it { expect(options.name).to eq('request.faraday') } + it 'defaults to ActiveSupport::Notifications' do + begin + res = options.instrumenter + rescue NameError => e + expect(e.to_s).to match('ActiveSupport') + else + expect(res).to eq(ActiveSupport::Notifications) + end + end + + it 'instruments with default name' do + expect(instrumenter.instrumentations.size).to eq(0) + + res = conn.get '/' + expect(res.body).to eq('ok') + expect(instrumenter.instrumentations.size).to eq(1) + + name, env = instrumenter.instrumentations.first + expect(name).to eq('request.faraday') + expect(env[:url].path).to eq('/') + end + + context 'with custom name' do + let(:config) { { name: 'custom' } } + + it { expect(options.name).to eq('custom') } + it 'instruments with custom name' do + expect(instrumenter.instrumentations.size).to eq(0) + + res = conn.get '/' + expect(res.body).to eq('ok') + expect(instrumenter.instrumentations.size).to eq(1) + + name, env = instrumenter.instrumentations.first + expect(name).to eq('custom') + expect(env[:url].path).to eq('/') + end + end + + context 'with custom instrumenter' do + let(:config) { { instrumenter: :custom } } + + it { expect(options.instrumenter).to eq(:custom) } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/multipart_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/multipart_spec.rb new file mode 100644 index 000000000000..258de2b26a9b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/multipart_spec.rb @@ -0,0 +1,302 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Request::Multipart do + let(:options) { {} } + let(:conn) do + Faraday.new do |b| + b.request :multipart, options + b.request :url_encoded + b.adapter :test do |stub| + stub.post('/echo') do |env| + posted_as = env[:request_headers]['Content-Type'] + expect(env[:body]).to be_a_kind_of(Faraday::CompositeReadIO) + [200, { 'Content-Type' => posted_as }, env[:body].read] + end + end + end + end + + shared_examples 'a multipart request' do + it 'generates a unique boundary for each request' do + response1 = conn.post('/echo', payload) + response2 = conn.post('/echo', payload) + + b1 = parse_multipart_boundary(response1.headers['Content-Type']) + b2 = parse_multipart_boundary(response2.headers['Content-Type']) + expect(b1).to_not eq(b2) + end + end + + context 'FilePart: when multipart objects in param' do + let(:payload) do + { + a: 1, + b: { + c: Faraday::FilePart.new(__FILE__, 'text/x-ruby', nil, + 'Content-Disposition' => 'form-data; foo=1'), + d: 2 + } + } + end + it_behaves_like 'a multipart request' + + it 'forms a multipart request' do + response = conn.post('/echo', payload) + + boundary = parse_multipart_boundary(response.headers['Content-Type']) + result = parse_multipart(boundary, response.body) + expect(result[:errors]).to be_empty + + part_a, body_a = result.part('a') + expect(part_a).to_not be_nil + expect(part_a.filename).to be_nil + expect(body_a).to eq('1') + + part_bc, body_bc = result.part('b[c]') + expect(part_bc).to_not be_nil + expect(part_bc.filename).to eq('multipart_spec.rb') + expect(part_bc.headers['content-disposition']) + .to eq( + 'form-data; foo=1; name="b[c]"; filename="multipart_spec.rb"' + ) + expect(part_bc.headers['content-type']).to eq('text/x-ruby') + expect(part_bc.headers['content-transfer-encoding']).to eq('binary') + expect(body_bc).to eq(File.read(__FILE__)) + + part_bd, body_bd = result.part('b[d]') + expect(part_bd).to_not be_nil + expect(part_bd.filename).to be_nil + expect(body_bd).to eq('2') + end + end + + context 'FilePart: when providing json and IO content in the same payload' do + let(:io) { StringIO.new('io-content') } + let(:json) do + { + b: 1, + c: 2 + }.to_json + end + + let(:payload) do + { + json: Faraday::ParamPart.new(json, 'application/json'), + io: Faraday::FilePart.new(io, 'application/pdf') + } + end + + it_behaves_like 'a multipart request' + + it 'forms a multipart request' do + response = conn.post('/echo', payload) + + boundary = parse_multipart_boundary(response.headers['Content-Type']) + result = parse_multipart(boundary, response.body) + expect(result[:errors]).to be_empty + + part_json, body_json = result.part('json') + expect(part_json).to_not be_nil + expect(part_json.mime).to eq('application/json') + expect(part_json.filename).to be_nil + expect(body_json).to eq(json) + + part_io, body_io = result.part('io') + expect(part_io).to_not be_nil + expect(part_io.mime).to eq('application/pdf') + expect(part_io.filename).to eq('local.path') + expect(body_io).to eq(io.string) + end + end + + context 'FilePart: when multipart objects in array param' do + let(:payload) do + { + a: 1, + b: [{ + c: Faraday::FilePart.new(__FILE__, 'text/x-ruby'), + d: 2 + }] + } + end + + it_behaves_like 'a multipart request' + + it 'forms a multipart request' do + response = conn.post('/echo', payload) + + boundary = parse_multipart_boundary(response.headers['Content-Type']) + result = parse_multipart(boundary, response.body) + expect(result[:errors]).to be_empty + + part_a, body_a = result.part('a') + expect(part_a).to_not be_nil + expect(part_a.filename).to be_nil + expect(body_a).to eq('1') + + part_bc, body_bc = result.part('b[][c]') + expect(part_bc).to_not be_nil + expect(part_bc.filename).to eq('multipart_spec.rb') + expect(part_bc.headers['content-disposition']) + .to eq( + 'form-data; name="b[][c]"; filename="multipart_spec.rb"' + ) + expect(part_bc.headers['content-type']).to eq('text/x-ruby') + expect(part_bc.headers['content-transfer-encoding']).to eq('binary') + expect(body_bc).to eq(File.read(__FILE__)) + + part_bd, body_bd = result.part('b[][d]') + expect(part_bd).to_not be_nil + expect(part_bd.filename).to be_nil + expect(body_bd).to eq('2') + end + end + + context 'UploadIO: when multipart objects in param' do + let(:payload) do + { + a: 1, + b: { + c: Faraday::UploadIO.new(__FILE__, 'text/x-ruby', nil, + 'Content-Disposition' => 'form-data; foo=1'), + d: 2 + } + } + end + it_behaves_like 'a multipart request' + + it 'forms a multipart request' do + response = conn.post('/echo', payload) + + boundary = parse_multipart_boundary(response.headers['Content-Type']) + result = parse_multipart(boundary, response.body) + expect(result[:errors]).to be_empty + + part_a, body_a = result.part('a') + expect(part_a).to_not be_nil + expect(part_a.filename).to be_nil + expect(body_a).to eq('1') + + part_bc, body_bc = result.part('b[c]') + expect(part_bc).to_not be_nil + expect(part_bc.filename).to eq('multipart_spec.rb') + expect(part_bc.headers['content-disposition']) + .to eq( + 'form-data; foo=1; name="b[c]"; filename="multipart_spec.rb"' + ) + expect(part_bc.headers['content-type']).to eq('text/x-ruby') + expect(part_bc.headers['content-transfer-encoding']).to eq('binary') + expect(body_bc).to eq(File.read(__FILE__)) + + part_bd, body_bd = result.part('b[d]') + expect(part_bd).to_not be_nil + expect(part_bd.filename).to be_nil + expect(body_bd).to eq('2') + end + end + + context 'UploadIO: when providing json and IO content in the same payload' do + let(:io) { StringIO.new('io-content') } + let(:json) do + { + b: 1, + c: 2 + }.to_json + end + + let(:payload) do + { + json: Faraday::ParamPart.new(json, 'application/json'), + io: Faraday::UploadIO.new(io, 'application/pdf') + } + end + + it_behaves_like 'a multipart request' + + it 'forms a multipart request' do + response = conn.post('/echo', payload) + + boundary = parse_multipart_boundary(response.headers['Content-Type']) + result = parse_multipart(boundary, response.body) + expect(result[:errors]).to be_empty + + part_json, body_json = result.part('json') + expect(part_json).to_not be_nil + expect(part_json.mime).to eq('application/json') + expect(part_json.filename).to be_nil + expect(body_json).to eq(json) + + part_io, body_io = result.part('io') + expect(part_io).to_not be_nil + expect(part_io.mime).to eq('application/pdf') + expect(part_io.filename).to eq('local.path') + expect(body_io).to eq(io.string) + end + end + + context 'UploadIO: when multipart objects in array param' do + let(:payload) do + { + a: 1, + b: [{ + c: Faraday::UploadIO.new(__FILE__, 'text/x-ruby'), + d: 2 + }] + } + end + + it_behaves_like 'a multipart request' + + it 'forms a multipart request' do + response = conn.post('/echo', payload) + + boundary = parse_multipart_boundary(response.headers['Content-Type']) + result = parse_multipart(boundary, response.body) + expect(result[:errors]).to be_empty + + part_a, body_a = result.part('a') + expect(part_a).to_not be_nil + expect(part_a.filename).to be_nil + expect(body_a).to eq('1') + + part_bc, body_bc = result.part('b[][c]') + expect(part_bc).to_not be_nil + expect(part_bc.filename).to eq('multipart_spec.rb') + expect(part_bc.headers['content-disposition']) + .to eq( + 'form-data; name="b[][c]"; filename="multipart_spec.rb"' + ) + expect(part_bc.headers['content-type']).to eq('text/x-ruby') + expect(part_bc.headers['content-transfer-encoding']).to eq('binary') + expect(body_bc).to eq(File.read(__FILE__)) + + part_bd, body_bd = result.part('b[][d]') + expect(part_bd).to_not be_nil + expect(part_bd.filename).to be_nil + expect(body_bd).to eq('2') + end + end + + context 'when passing flat_encode=true option' do + let(:options) { { flat_encode: true } } + let(:io) { StringIO.new('io-content') } + let(:payload) do + { + a: 1, + b: [ + Faraday::UploadIO.new(io, 'application/pdf'), + Faraday::UploadIO.new(io, 'application/pdf') + ] + } + end + + it_behaves_like 'a multipart request' + + it 'encode params using flat encoder' do + response = conn.post('/echo', payload) + + expect(response.body).to include('name="b"') + expect(response.body).not_to include('name="b[]"') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/retry_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/retry_spec.rb new file mode 100644 index 000000000000..1f0208581151 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/retry_spec.rb @@ -0,0 +1,242 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Request::Retry do + let(:calls) { [] } + let(:times_called) { calls.size } + let(:options) { [] } + let(:conn) do + Faraday.new do |b| + b.request :retry, *options + + b.adapter :test do |stub| + %w[get post].each do |method| + stub.send(method, '/unstable') do |env| + calls << env.dup + env[:body] = nil # simulate blanking out response body + callback.call + end + end + end + end + end + + context 'when an unexpected error happens' do + let(:callback) { -> { raise 'boom!' } } + + before { expect { conn.get('/unstable') }.to raise_error(RuntimeError) } + + it { expect(times_called).to eq(1) } + + context 'and this is passed as a custom exception' do + let(:options) { [{ exceptions: StandardError }] } + + it { expect(times_called).to eq(3) } + end + end + + context 'when an expected error happens' do + let(:callback) { -> { raise Errno::ETIMEDOUT } } + + before do + @started = Time.now + expect { conn.get('/unstable') }.to raise_error(Errno::ETIMEDOUT) + end + + it { expect(times_called).to eq(3) } + + context 'and legacy max_retry set to 1' do + let(:options) { [1] } + + it { expect(times_called).to eq(2) } + end + + context 'and legacy max_retry set to -9' do + let(:options) { [-9] } + + it { expect(times_called).to eq(1) } + end + + context 'and new max_retry set to 3' do + let(:options) { [{ max: 3 }] } + + it { expect(times_called).to eq(4) } + end + + context 'and new max_retry set to -9' do + let(:options) { [{ max: -9 }] } + + it { expect(times_called).to eq(1) } + end + + context 'and both max_retry and interval are set' do + let(:options) { [{ max: 2, interval: 0.1 }] } + + it { expect(Time.now - @started).to be_within(0.04).of(0.2) } + end + end + + context 'when no exception raised' do + let(:options) { [{ max: 1, retry_statuses: 429 }] } + + before { conn.get('/unstable') } + + context 'and response code is in retry_statuses' do + let(:callback) { -> { [429, {}, ''] } } + + it { expect(times_called).to eq(2) } + end + + context 'and response code is not in retry_statuses' do + let(:callback) { -> { [503, {}, ''] } } + + it { expect(times_called).to eq(1) } + end + end + + describe '#calculate_retry_interval' do + context 'with exponential backoff' do + let(:options) { { max: 5, interval: 0.1, backoff_factor: 2 } } + let(:middleware) { Faraday::Request::Retry.new(nil, options) } + + it { expect(middleware.send(:calculate_retry_interval, 5)).to eq(0.1) } + it { expect(middleware.send(:calculate_retry_interval, 4)).to eq(0.2) } + it { expect(middleware.send(:calculate_retry_interval, 3)).to eq(0.4) } + end + + context 'with exponential backoff and max_interval' do + let(:options) { { max: 5, interval: 0.1, backoff_factor: 2, max_interval: 0.3 } } + let(:middleware) { Faraday::Request::Retry.new(nil, options) } + + it { expect(middleware.send(:calculate_retry_interval, 5)).to eq(0.1) } + it { expect(middleware.send(:calculate_retry_interval, 4)).to eq(0.2) } + it { expect(middleware.send(:calculate_retry_interval, 3)).to eq(0.3) } + it { expect(middleware.send(:calculate_retry_interval, 2)).to eq(0.3) } + end + + context 'with exponential backoff and interval_randomness' do + let(:options) { { max: 2, interval: 0.1, interval_randomness: 0.05 } } + let(:middleware) { Faraday::Request::Retry.new(nil, options) } + + it { expect(middleware.send(:calculate_retry_interval, 2)).to be_between(0.1, 0.105) } + end + end + + context 'when method is not idempotent' do + let(:callback) { -> { raise Errno::ETIMEDOUT } } + + before { expect { conn.post('/unstable') }.to raise_error(Errno::ETIMEDOUT) } + + it { expect(times_called).to eq(1) } + end + + describe 'retry_if option' do + let(:callback) { -> { raise Errno::ETIMEDOUT } } + let(:options) { [{ retry_if: @check }] } + + it 'retries if retry_if block always returns true' do + body = { foo: :bar } + @check = ->(_, _) { true } + expect { conn.post('/unstable', body) }.to raise_error(Errno::ETIMEDOUT) + expect(times_called).to eq(3) + expect(calls.all? { |env| env[:body] == body }).to be_truthy + end + + it 'does not retry if retry_if block returns false checking env' do + @check = ->(env, _) { env[:method] != :post } + expect { conn.post('/unstable') }.to raise_error(Errno::ETIMEDOUT) + expect(times_called).to eq(1) + end + + it 'does not retry if retry_if block returns false checking exception' do + @check = ->(_, exception) { !exception.is_a?(Errno::ETIMEDOUT) } + expect { conn.post('/unstable') }.to raise_error(Errno::ETIMEDOUT) + expect(times_called).to eq(1) + end + + it 'FilePart: should rewind files on retry' do + io = StringIO.new('Test data') + filepart = Faraday::FilePart.new(io, 'application/octet/stream') + + rewound = 0 + rewind = -> { rewound += 1 } + + @check = ->(_, _) { true } + allow(filepart).to receive(:rewind, &rewind) + expect { conn.post('/unstable', file: filepart) }.to raise_error(Errno::ETIMEDOUT) + expect(times_called).to eq(3) + expect(rewound).to eq(2) + end + + it 'UploadIO: should rewind files on retry' do + io = StringIO.new('Test data') + upload_io = Faraday::UploadIO.new(io, 'application/octet/stream') + + rewound = 0 + rewind = -> { rewound += 1 } + + @check = ->(_, _) { true } + allow(upload_io).to receive(:rewind, &rewind) + expect { conn.post('/unstable', file: upload_io) }.to raise_error(Errno::ETIMEDOUT) + expect(times_called).to eq(3) + expect(rewound).to eq(2) + end + + context 'when explicitly specifying methods to retry' do + let(:options) { [{ retry_if: @check, methods: [:post] }] } + + it 'does not call retry_if for specified methods' do + @check = ->(_, _) { raise 'this should have never been called' } + expect { conn.post('/unstable') }.to raise_error(Errno::ETIMEDOUT) + expect(times_called).to eq(3) + end + end + + context 'with empty list of methods to retry' do + let(:options) { [{ retry_if: @check, methods: [] }] } + + it 'calls retry_if for all methods' do + @check = ->(_, _) { calls.size < 2 } + expect { conn.get('/unstable') }.to raise_error(Errno::ETIMEDOUT) + expect(times_called).to eq(2) + end + end + end + + describe 'retry_after header support' do + let(:callback) { -> { [504, headers, ''] } } + let(:elapsed) { Time.now - @started } + + before do + @started = Time.now + conn.get('/unstable') + end + + context 'when retry_after bigger than interval' do + let(:headers) { { 'Retry-After' => '0.5' } } + let(:options) { [{ max: 1, interval: 0.1, retry_statuses: 504 }] } + + it { expect(elapsed).to be > 0.5 } + end + + context 'when retry_after smaller than interval' do + let(:headers) { { 'Retry-After' => '0.1' } } + let(:options) { [{ max: 1, interval: 0.2, retry_statuses: 504 }] } + + it { expect(elapsed).to be > 0.2 } + end + + context 'when retry_after is a timestamp' do + let(:headers) { { 'Retry-After' => (Time.now.utc + 2).strftime('%a, %d %b %Y %H:%M:%S GMT') } } + let(:options) { [{ max: 1, interval: 0.1, retry_statuses: 504 }] } + + it { expect(elapsed).to be > 1 } + end + + context 'when retry_after is bigger than max_interval' do + let(:headers) { { 'Retry-After' => (Time.now.utc + 20).strftime('%a, %d %b %Y %H:%M:%S GMT') } } + let(:options) { [{ max: 2, interval: 0.1, max_interval: 5, retry_statuses: 504 }] } + + it { expect(times_called).to eq(1) } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/url_encoded_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/url_encoded_spec.rb new file mode 100644 index 000000000000..9f89a5615efa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request/url_encoded_spec.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Request::UrlEncoded do + let(:conn) do + Faraday.new do |b| + b.request :multipart + b.request :url_encoded + b.adapter :test do |stub| + stub.post('/echo') do |env| + posted_as = env[:request_headers]['Content-Type'] + [200, { 'Content-Type' => posted_as }, env[:body]] + end + end + end + end + + it 'does nothing without payload' do + response = conn.post('/echo') + expect(response.headers['Content-Type']).to be_nil + expect(response.body.empty?).to be_truthy + end + + it 'ignores custom content type' do + response = conn.post('/echo', { some: 'data' }, 'content-type' => 'application/x-foo') + expect(response.headers['Content-Type']).to eq('application/x-foo') + expect(response.body).to eq(some: 'data') + end + + it 'works with no headers' do + response = conn.post('/echo', fruit: %w[apples oranges]) + expect(response.headers['Content-Type']).to eq('application/x-www-form-urlencoded') + expect(response.body).to eq('fruit%5B%5D=apples&fruit%5B%5D=oranges') + end + + it 'works with with headers' do + response = conn.post('/echo', { 'a' => 123 }, 'content-type' => 'application/x-www-form-urlencoded') + expect(response.headers['Content-Type']).to eq('application/x-www-form-urlencoded') + expect(response.body).to eq('a=123') + end + + it 'works with nested params' do + response = conn.post('/echo', user: { name: 'Mislav', web: 'mislav.net' }) + expect(response.headers['Content-Type']).to eq('application/x-www-form-urlencoded') + expected = { 'user' => { 'name' => 'Mislav', 'web' => 'mislav.net' } } + expect(Faraday::Utils.parse_nested_query(response.body)).to eq(expected) + end + + it 'works with non nested params' do + response = conn.post('/echo', dimensions: %w[date location]) do |req| + req.options.params_encoder = Faraday::FlatParamsEncoder + end + expect(response.headers['Content-Type']).to eq('application/x-www-form-urlencoded') + expected = { 'dimensions' => %w[date location] } + expect(Faraday::Utils.parse_query(response.body)).to eq(expected) + expect(response.body).to eq('dimensions=date&dimensions=location') + end + + it 'works with unicode' do + err = capture_warnings do + response = conn.post('/echo', str: 'eé cç aã aâ') + expect(response.body).to eq('str=e%C3%A9+c%C3%A7+a%C3%A3+a%C3%A2') + end + expect(err.empty?).to be_truthy + end + + it 'works with nested keys' do + response = conn.post('/echo', 'a' => { 'b' => { 'c' => ['d'] } }) + expect(response.body).to eq('a%5Bb%5D%5Bc%5D%5B%5D=d') + end + + context 'customising default_space_encoding' do + around do |example| + Faraday::Utils.default_space_encoding = '%20' + example.run + Faraday::Utils.default_space_encoding = nil + end + + it 'uses the custom character to encode spaces' do + response = conn.post('/echo', str: 'apple banana') + expect(response.body).to eq('str=apple%20banana') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request_spec.rb new file mode 100644 index 000000000000..018c770c7737 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/request_spec.rb @@ -0,0 +1,120 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Request do + let(:conn) do + Faraday.new(url: 'http://sushi.com/api', + headers: { 'Mime-Version' => '1.0' }, + request: { oauth: { consumer_key: 'anonymous' } }) + end + let(:http_method) { :get } + let(:block) { nil } + + subject { conn.build_request(http_method, &block) } + + context 'when nothing particular is configured' do + it { expect(subject.http_method).to eq(:get) } + it { expect(subject.to_env(conn).ssl.verify).to be_falsey } + end + + context 'when HTTP method is post' do + let(:http_method) { :post } + + it { expect(subject.http_method).to eq(:post) } + end + + describe 'deprecate method for HTTP method' do + let(:http_method) { :post } + let(:expected_warning) do + %r{WARNING: `Faraday::Request#method` is deprecated; use `#http_method` instead. It will be removed in or after version 2.0.\n`Faraday::Request#method` called from .+/spec/faraday/request_spec.rb:\d+.} + end + + it { expect(subject.method).to eq(:post) } + + it { expect { subject.method }.to output(expected_warning).to_stderr } + end + + context 'when setting the url on setup with a URI' do + let(:block) { proc { |req| req.url URI.parse('foo.json?a=1') } } + + it { expect(subject.path).to eq(URI.parse('foo.json')) } + it { expect(subject.params).to eq('a' => '1') } + it { expect(subject.to_env(conn).url.to_s).to eq('http://sushi.com/api/foo.json?a=1') } + end + + context 'when setting the url on setup with a string path and params' do + let(:block) { proc { |req| req.url 'foo.json', 'a' => 1 } } + + it { expect(subject.path).to eq('foo.json') } + it { expect(subject.params).to eq('a' => 1) } + it { expect(subject.to_env(conn).url.to_s).to eq('http://sushi.com/api/foo.json?a=1') } + end + + context 'when setting the url on setup with a path including params' do + let(:block) { proc { |req| req.url 'foo.json?b=2&a=1#qqq' } } + + it { expect(subject.path).to eq('foo.json') } + it { expect(subject.params).to eq('a' => '1', 'b' => '2') } + it { expect(subject.to_env(conn).url.to_s).to eq('http://sushi.com/api/foo.json?a=1&b=2') } + end + + context 'when setting a header on setup with []= syntax' do + let(:block) { proc { |req| req['Server'] = 'Faraday' } } + let(:headers) { subject.to_env(conn).request_headers } + + it { expect(subject.headers['Server']).to eq('Faraday') } + it { expect(headers['mime-version']).to eq('1.0') } + it { expect(headers['server']).to eq('Faraday') } + end + + context 'when setting the body on setup' do + let(:block) { proc { |req| req.body = 'hi' } } + + it { expect(subject.body).to eq('hi') } + it { expect(subject.to_env(conn).body).to eq('hi') } + end + + context 'with global request options set' do + let(:env_request) { subject.to_env(conn).request } + + before do + conn.options.timeout = 3 + conn.options.open_timeout = 5 + conn.ssl.verify = false + conn.proxy = 'http://proxy.com' + end + + it { expect(subject.options.timeout).to eq(3) } + it { expect(subject.options.open_timeout).to eq(5) } + it { expect(env_request.timeout).to eq(3) } + it { expect(env_request.open_timeout).to eq(5) } + + context 'and per-request options set' do + let(:block) do + proc do |req| + req.options.timeout = 10 + req.options.boundary = 'boo' + req.options.oauth[:consumer_secret] = 'xyz' + req.options.context = { + foo: 'foo', + bar: 'bar' + } + end + end + + it { expect(subject.options.timeout).to eq(10) } + it { expect(subject.options.open_timeout).to eq(5) } + it { expect(env_request.timeout).to eq(10) } + it { expect(env_request.open_timeout).to eq(5) } + it { expect(env_request.boundary).to eq('boo') } + it { expect(env_request.context).to eq(foo: 'foo', bar: 'bar') } + it do + oauth_expected = { consumer_secret: 'xyz', consumer_key: 'anonymous' } + expect(env_request.oauth).to eq(oauth_expected) + end + end + end + + it 'supports marshal serialization' do + expect(Marshal.load(Marshal.dump(subject))).to eq(subject) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response/logger_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response/logger_spec.rb new file mode 100644 index 000000000000..10eeff5f4091 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response/logger_spec.rb @@ -0,0 +1,220 @@ +# frozen_string_literal: true + +require 'stringio' +require 'logger' + +RSpec.describe Faraday::Response::Logger do + let(:string_io) { StringIO.new } + let(:logger) { Logger.new(string_io) } + let(:logger_options) { {} } + let(:conn) do + rubbles = ['Barney', 'Betty', 'Bam Bam'] + + Faraday.new do |b| + b.response :logger, logger, logger_options do |logger| + logger.filter(/(soylent green is) (.+)/, '\1 tasty') + logger.filter(/(api_key:).*"(.+)."/, '\1[API_KEY]') + logger.filter(/(password)=(.+)/, '\1=[HIDDEN]') + end + b.adapter :test do |stubs| + stubs.get('/hello') { [200, { 'Content-Type' => 'text/html' }, 'hello'] } + stubs.post('/ohai') { [200, { 'Content-Type' => 'text/html' }, 'fred'] } + stubs.post('/ohyes') { [200, { 'Content-Type' => 'text/html' }, 'pebbles'] } + stubs.get('/rubbles') { [200, { 'Content-Type' => 'application/json' }, rubbles] } + stubs.get('/filtered_body') { [200, { 'Content-Type' => 'text/html' }, 'soylent green is people'] } + stubs.get('/filtered_headers') { [200, { 'Content-Type' => 'text/html' }, 'headers response'] } + stubs.get('/filtered_params') { [200, { 'Content-Type' => 'text/html' }, 'params response'] } + stubs.get('/filtered_url') { [200, { 'Content-Type' => 'text/html' }, 'url response'] } + end + end + end + + before do + logger.level = Logger::DEBUG + end + + it 'still returns output' do + resp = conn.get '/hello', nil, accept: 'text/html' + expect(resp.body).to eq('hello') + end + + context 'without configuration' do + let(:conn) do + Faraday.new do |b| + b.response :logger + b.adapter :test do |stubs| + stubs.get('/hello') { [200, { 'Content-Type' => 'text/html' }, 'hello'] } + end + end + end + + it 'defaults to stdout' do + expect(Logger).to receive(:new).with($stdout).and_return(Logger.new(nil)) + conn.get('/hello') + end + end + + context 'with default formatter' do + let(:formatter) { instance_double(Faraday::Logging::Formatter, request: true, response: true, filter: []) } + + before { allow(Faraday::Logging::Formatter).to receive(:new).and_return(formatter) } + + it 'delegates logging to the formatter' do + expect(formatter).to receive(:request).with(an_instance_of(Faraday::Env)) + expect(formatter).to receive(:response).with(an_instance_of(Faraday::Env)) + conn.get '/hello' + end + end + + context 'with custom formatter' do + let(:formatter_class) do + Class.new(Faraday::Logging::Formatter) do + def request(_env) + info 'Custom log formatter request' + end + + def response(_env) + info 'Custom log formatter response' + end + end + end + + let(:logger_options) { { formatter: formatter_class } } + + it 'logs with custom formatter' do + conn.get '/hello' + + expect(string_io.string).to match('Custom log formatter request') + expect(string_io.string).to match('Custom log formatter response') + end + end + + it 'logs method and url' do + conn.get '/hello', nil, accept: 'text/html' + expect(string_io.string).to match('GET http:/hello') + end + + it 'logs request headers by default' do + conn.get '/hello', nil, accept: 'text/html' + expect(string_io.string).to match(%(Accept: "text/html)) + end + + it 'logs response headers by default' do + conn.get '/hello', nil, accept: 'text/html' + expect(string_io.string).to match(%(Content-Type: "text/html)) + end + + it 'does not log request body by default' do + conn.post '/ohai', 'name=Unagi', accept: 'text/html' + expect(string_io.string).not_to match(%(name=Unagi)) + end + + it 'does not log response body by default' do + conn.post '/ohai', 'name=Toro', accept: 'text/html' + expect(string_io.string).not_to match(%(fred)) + end + + it 'logs filter headers' do + conn.headers = { 'api_key' => 'ABC123' } + conn.get '/filtered_headers', nil, accept: 'text/html' + expect(string_io.string).to match(%(api_key:)) + expect(string_io.string).to match(%([API_KEY])) + expect(string_io.string).not_to match(%(ABC123)) + end + + it 'logs filter url' do + conn.get '/filtered_url?password=hunter2', nil, accept: 'text/html' + expect(string_io.string).to match(%([HIDDEN])) + expect(string_io.string).not_to match(%(hunter2)) + end + + context 'when not logging request headers' do + let(:logger_options) { { headers: { request: false } } } + + it 'does not log request headers if option is false' do + conn.get '/hello', nil, accept: 'text/html' + expect(string_io.string).not_to match(%(Accept: "text/html)) + end + end + + context 'when not logging response headers' do + let(:logger_options) { { headers: { response: false } } } + + it 'does not log response headers if option is false' do + conn.get '/hello', nil, accept: 'text/html' + expect(string_io.string).not_to match(%(Content-Type: "text/html)) + end + end + + context 'when logging request body' do + let(:logger_options) { { bodies: { request: true } } } + + it 'log only request body' do + conn.post '/ohyes', 'name=Tamago', accept: 'text/html' + expect(string_io.string).to match(%(name=Tamago)) + expect(string_io.string).not_to match(%(pebbles)) + end + end + + context 'when logging response body' do + let(:logger_options) { { bodies: { response: true } } } + + it 'log only response body' do + conn.post '/ohyes', 'name=Hamachi', accept: 'text/html' + expect(string_io.string).to match(%(pebbles)) + expect(string_io.string).not_to match(%(name=Hamachi)) + end + end + + context 'when logging request and response bodies' do + let(:logger_options) { { bodies: true } } + + it 'log request and response body' do + conn.post '/ohyes', 'name=Ebi', accept: 'text/html' + expect(string_io.string).to match(%(name=Ebi)) + expect(string_io.string).to match(%(pebbles)) + end + + it 'log response body object' do + conn.get '/rubbles', nil, accept: 'text/html' + expect(string_io.string).to match(%([\"Barney\", \"Betty\", \"Bam Bam\"]\n)) + end + + it 'logs filter body' do + conn.get '/filtered_body', nil, accept: 'text/html' + expect(string_io.string).to match(%(soylent green is)) + expect(string_io.string).to match(%(tasty)) + expect(string_io.string).not_to match(%(people)) + end + end + + context 'when using log_level' do + let(:logger_options) { { bodies: true, log_level: :debug } } + + it 'logs request/request body on the specified level (debug)' do + logger.level = Logger::DEBUG + conn.post '/ohyes', 'name=Ebi', accept: 'text/html' + expect(string_io.string).to match(%(name=Ebi)) + expect(string_io.string).to match(%(pebbles)) + end + + it 'logs headers on the debug level' do + logger.level = Logger::DEBUG + conn.get '/hello', nil, accept: 'text/html' + expect(string_io.string).to match(%(Content-Type: "text/html)) + end + + it 'does not log request/response body on the info level' do + logger.level = Logger::INFO + conn.post '/ohyes', 'name=Ebi', accept: 'text/html' + expect(string_io.string).not_to match(%(name=Ebi)) + expect(string_io.string).not_to match(%(pebbles)) + end + + it 'does not log headers on the info level' do + logger.level = Logger::INFO + conn.get '/hello', nil, accept: 'text/html' + expect(string_io.string).not_to match(%(Content-Type: "text/html)) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response/middleware_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response/middleware_spec.rb new file mode 100644 index 000000000000..a79208c4b4b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response/middleware_spec.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Response::Middleware do + let(:conn) do + Faraday.new do |b| + b.use custom_middleware + b.adapter :test do |stub| + stub.get('ok') { [200, { 'Content-Type' => 'text/html' }, '<body></body>'] } + stub.get('not_modified') { [304, nil, nil] } + stub.get('no_content') { [204, nil, nil] } + end + end + end + + context 'with a custom ResponseMiddleware' do + let(:custom_middleware) do + Class.new(Faraday::Response::Middleware) do + def parse(body) + body.upcase + end + end + end + + it 'parses the response' do + expect(conn.get('ok').body).to eq('<BODY></BODY>') + end + end + + context 'with a custom ResponseMiddleware and private parse' do + let(:custom_middleware) do + Class.new(Faraday::Response::Middleware) do + private + + def parse(body) + body.upcase + end + end + end + + it 'parses the response' do + expect(conn.get('ok').body).to eq('<BODY></BODY>') + end + end + + context 'with a custom ResponseMiddleware but empty response' do + let(:custom_middleware) do + Class.new(Faraday::Response::Middleware) do + def parse(_body) + raise 'this should not be called' + end + end + end + + it 'raises exception for 200 responses' do + expect { conn.get('ok') }.to raise_error(StandardError) + end + + it 'doesn\'t call the middleware for 204 responses' do + expect_any_instance_of(custom_middleware).not_to receive(:parse) + expect(conn.get('no_content').body).to be_nil + end + + it 'doesn\'t call the middleware for 304 responses' do + expect_any_instance_of(custom_middleware).not_to receive(:parse) + expect(conn.get('not_modified').body).to be_nil + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response/raise_error_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response/raise_error_spec.rb new file mode 100644 index 000000000000..a80472dc00ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response/raise_error_spec.rb @@ -0,0 +1,169 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Response::RaiseError do + let(:conn) do + Faraday.new do |b| + b.response :raise_error + b.adapter :test do |stub| + stub.get('ok') { [200, { 'Content-Type' => 'text/html' }, '<body></body>'] } + stub.get('bad-request') { [400, { 'X-Reason' => 'because' }, 'keep looking'] } + stub.get('unauthorized') { [401, { 'X-Reason' => 'because' }, 'keep looking'] } + stub.get('forbidden') { [403, { 'X-Reason' => 'because' }, 'keep looking'] } + stub.get('not-found') { [404, { 'X-Reason' => 'because' }, 'keep looking'] } + stub.get('proxy-error') { [407, { 'X-Reason' => 'because' }, 'keep looking'] } + stub.get('conflict') { [409, { 'X-Reason' => 'because' }, 'keep looking'] } + stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] } + stub.get('4xx') { [499, { 'X-Reason' => 'because' }, 'keep looking'] } + stub.get('nil-status') { [nil, { 'X-Reason' => 'nil' }, 'fail'] } + stub.get('server-error') { [500, { 'X-Error' => 'bailout' }, 'fail'] } + end + end + end + + it 'raises no exception for 200 responses' do + expect { conn.get('ok') }.not_to raise_error + end + + it 'raises Faraday::BadRequestError for 400 responses' do + expect { conn.get('bad-request') }.to raise_error(Faraday::BadRequestError) do |ex| + expect(ex.message).to eq('the server responded with status 400') + expect(ex.response[:headers]['X-Reason']).to eq('because') + expect(ex.response[:status]).to eq(400) + expect(ex.response_status).to eq(400) + expect(ex.response_body).to eq('keep looking') + expect(ex.response_headers['X-Reason']).to eq('because') + end + end + + it 'raises Faraday::UnauthorizedError for 401 responses' do + expect { conn.get('unauthorized') }.to raise_error(Faraday::UnauthorizedError) do |ex| + expect(ex.message).to eq('the server responded with status 401') + expect(ex.response[:headers]['X-Reason']).to eq('because') + expect(ex.response[:status]).to eq(401) + expect(ex.response_status).to eq(401) + expect(ex.response_body).to eq('keep looking') + expect(ex.response_headers['X-Reason']).to eq('because') + end + end + + it 'raises Faraday::ForbiddenError for 403 responses' do + expect { conn.get('forbidden') }.to raise_error(Faraday::ForbiddenError) do |ex| + expect(ex.message).to eq('the server responded with status 403') + expect(ex.response[:headers]['X-Reason']).to eq('because') + expect(ex.response[:status]).to eq(403) + expect(ex.response_status).to eq(403) + expect(ex.response_body).to eq('keep looking') + expect(ex.response_headers['X-Reason']).to eq('because') + end + end + + it 'raises Faraday::ResourceNotFound for 404 responses' do + expect { conn.get('not-found') }.to raise_error(Faraday::ResourceNotFound) do |ex| + expect(ex.message).to eq('the server responded with status 404') + expect(ex.response[:headers]['X-Reason']).to eq('because') + expect(ex.response[:status]).to eq(404) + expect(ex.response_status).to eq(404) + expect(ex.response_body).to eq('keep looking') + expect(ex.response_headers['X-Reason']).to eq('because') + end + end + + it 'raises Faraday::ProxyAuthError for 407 responses' do + expect { conn.get('proxy-error') }.to raise_error(Faraday::ProxyAuthError) do |ex| + expect(ex.message).to eq('407 "Proxy Authentication Required"') + expect(ex.response[:headers]['X-Reason']).to eq('because') + expect(ex.response[:status]).to eq(407) + expect(ex.response_status).to eq(407) + expect(ex.response_body).to eq('keep looking') + expect(ex.response_headers['X-Reason']).to eq('because') + end + end + + it 'raises Faraday::ConflictError for 409 responses' do + expect { conn.get('conflict') }.to raise_error(Faraday::ConflictError) do |ex| + expect(ex.message).to eq('the server responded with status 409') + expect(ex.response[:headers]['X-Reason']).to eq('because') + expect(ex.response[:status]).to eq(409) + expect(ex.response_status).to eq(409) + expect(ex.response_body).to eq('keep looking') + expect(ex.response_headers['X-Reason']).to eq('because') + end + end + + it 'raises Faraday::UnprocessableEntityError for 422 responses' do + expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex| + expect(ex.message).to eq('the server responded with status 422') + expect(ex.response[:headers]['X-Reason']).to eq('because') + expect(ex.response[:status]).to eq(422) + expect(ex.response_status).to eq(422) + expect(ex.response_body).to eq('keep looking') + expect(ex.response_headers['X-Reason']).to eq('because') + end + end + + it 'raises Faraday::NilStatusError for nil status in response' do + expect { conn.get('nil-status') }.to raise_error(Faraday::NilStatusError) do |ex| + expect(ex.message).to eq('http status could not be derived from the server response') + expect(ex.response[:headers]['X-Reason']).to eq('nil') + expect(ex.response[:status]).to be_nil + expect(ex.response_status).to be_nil + expect(ex.response_body).to eq('fail') + expect(ex.response_headers['X-Reason']).to eq('nil') + end + end + + it 'raises Faraday::ClientError for other 4xx responses' do + expect { conn.get('4xx') }.to raise_error(Faraday::ClientError) do |ex| + expect(ex.message).to eq('the server responded with status 499') + expect(ex.response[:headers]['X-Reason']).to eq('because') + expect(ex.response[:status]).to eq(499) + expect(ex.response_status).to eq(499) + expect(ex.response_body).to eq('keep looking') + expect(ex.response_headers['X-Reason']).to eq('because') + end + end + + it 'raises Faraday::ServerError for 500 responses' do + expect { conn.get('server-error') }.to raise_error(Faraday::ServerError) do |ex| + expect(ex.message).to eq('the server responded with status 500') + expect(ex.response[:headers]['X-Error']).to eq('bailout') + expect(ex.response[:status]).to eq(500) + expect(ex.response_status).to eq(500) + expect(ex.response_body).to eq('fail') + expect(ex.response_headers['X-Error']).to eq('bailout') + end + end + + describe 'request info' do + let(:conn) do + Faraday.new do |b| + b.response :raise_error + b.adapter :test do |stub| + stub.post('request?full=true', request_body, request_headers) do + [400, { 'X-Reason' => 'because' }, 'keep looking'] + end + end + end + end + let(:request_body) { JSON.generate({ 'item' => 'sth' }) } + let(:request_headers) { { 'Authorization' => 'Basic 123' } } + + subject(:perform_request) do + conn.post 'request' do |req| + req.headers['Authorization'] = 'Basic 123' + req.params[:full] = true + req.body = request_body + end + end + + it 'returns the request info in the exception' do + expect { perform_request }.to raise_error(Faraday::BadRequestError) do |ex| + expect(ex.response[:request][:method]).to eq(:post) + expect(ex.response[:request][:url_path]).to eq('/request') + expect(ex.response[:request][:params]).to eq({ 'full' => 'true' }) + expect(ex.response[:request][:headers]).to match(a_hash_including(request_headers)) + expect(ex.response[:request][:body]).to eq(request_body) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response_spec.rb new file mode 100644 index 000000000000..171594701010 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/response_spec.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Response do + subject { Faraday::Response.new(env) } + + let(:env) do + Faraday::Env.from(status: 404, body: 'yikes', + response_headers: { 'Content-Type' => 'text/plain' }) + end + + it { expect(subject.finished?).to be_truthy } + it { expect { subject.finish({}) }.to raise_error(RuntimeError) } + it { expect(subject.success?).to be_falsey } + it { expect(subject.status).to eq(404) } + it { expect(subject.body).to eq('yikes') } + it { expect(subject.headers['Content-Type']).to eq('text/plain') } + it { expect(subject['content-type']).to eq('text/plain') } + + describe '#apply_request' do + before { subject.apply_request(body: 'a=b', method: :post) } + + it { expect(subject.body).to eq('yikes') } + it { expect(subject.env[:method]).to eq(:post) } + end + + describe '#to_hash' do + let(:hash) { subject.to_hash } + + it { expect(hash).to be_a(Hash) } + it { expect(hash[:status]).to eq(subject.status) } + it { expect(hash[:response_headers]).to eq(subject.headers) } + it { expect(hash[:body]).to eq(subject.body) } + end + + describe 'marshal serialization support' do + subject { Faraday::Response.new } + let(:loaded) { Marshal.load(Marshal.dump(subject)) } + + before do + subject.on_complete {} + subject.finish(env.merge(params: 'moo')) + end + + it { expect(loaded.env[:params]).to be_nil } + it { expect(loaded.env[:body]).to eq(env[:body]) } + it { expect(loaded.env[:response_headers]).to eq(env[:response_headers]) } + it { expect(loaded.env[:status]).to eq(env[:status]) } + end + + describe '#on_complete' do + subject { Faraday::Response.new } + + it 'parse body on finish' do + subject.on_complete { |env| env[:body] = env[:body].upcase } + subject.finish(env) + + expect(subject.body).to eq('YIKES') + end + + it 'can access response body in on_complete callback' do + subject.on_complete { |env| env[:body] = subject.body.upcase } + subject.finish(env) + + expect(subject.body).to eq('YIKES') + end + + it 'can access response body in on_complete callback' do + callback_env = nil + subject.on_complete { |env| callback_env = env } + subject.finish({}) + + expect(subject.env).to eq(callback_env) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/utils/headers_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/utils/headers_spec.rb new file mode 100644 index 000000000000..ffe0c3313994 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/utils/headers_spec.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Utils::Headers do + subject { Faraday::Utils::Headers.new } + + context 'when Content-Type is set to application/json' do + before { subject['Content-Type'] = 'application/json' } + + it { expect(subject.keys).to eq(['Content-Type']) } + it { expect(subject['Content-Type']).to eq('application/json') } + it { expect(subject['CONTENT-TYPE']).to eq('application/json') } + it { expect(subject['content-type']).to eq('application/json') } + it { is_expected.to include('content-type') } + end + + context 'when Content-Type is set to application/xml' do + before { subject['Content-Type'] = 'application/xml' } + + it { expect(subject.keys).to eq(['Content-Type']) } + it { expect(subject['Content-Type']).to eq('application/xml') } + it { expect(subject['CONTENT-TYPE']).to eq('application/xml') } + it { expect(subject['content-type']).to eq('application/xml') } + it { is_expected.to include('content-type') } + end + + describe '#fetch' do + before { subject['Content-Type'] = 'application/json' } + + it { expect(subject.fetch('Content-Type')).to eq('application/json') } + it { expect(subject.fetch('CONTENT-TYPE')).to eq('application/json') } + it { expect(subject.fetch(:content_type)).to eq('application/json') } + it { expect(subject.fetch('invalid', 'default')).to eq('default') } + it { expect(subject.fetch('invalid', false)).to eq(false) } + it { expect(subject.fetch('invalid', nil)).to be_nil } + it { expect(subject.fetch('Invalid') { |key| "#{key} key" }).to eq('Invalid key') } + it 'calls a block when provided' do + block_called = false + expect(subject.fetch('content-type') { block_called = true }).to eq('application/json') + expect(block_called).to be_falsey + end + it 'raises an error if key not found' do + expected_error = defined?(KeyError) ? KeyError : IndexError + expect { subject.fetch('invalid') }.to raise_error(expected_error) + end + end + + describe '#delete' do + before do + subject['Content-Type'] = 'application/json' + @deleted = subject.delete('content-type') + end + + it { expect(@deleted).to eq('application/json') } + it { expect(subject.size).to eq(0) } + it { is_expected.not_to include('content-type') } + it { expect(subject.delete('content-type')).to be_nil } + end + + describe '#parse' do + before { subject.parse(headers) } + + context 'when response headers leave http status line out' do + let(:headers) { "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n" } + + it { expect(subject.keys).to eq(%w[Content-Type]) } + it { expect(subject['Content-Type']).to eq('text/html') } + it { expect(subject['content-type']).to eq('text/html') } + end + + context 'when response headers values include a colon' do + let(:headers) { "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nLocation: http://sushi.com/\r\n\r\n" } + + it { expect(subject['location']).to eq('http://sushi.com/') } + end + + context 'when response headers include a blank line' do + let(:headers) { "HTTP/1.1 200 OK\r\n\r\nContent-Type: text/html\r\n\r\n" } + + it { expect(subject['content-type']).to eq('text/html') } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/utils_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/utils_spec.rb new file mode 100644 index 000000000000..c3da7462c0d1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday/utils_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::Utils do + describe 'headers parsing' do + let(:multi_response_headers) do + "HTTP/1.x 500 OK\r\nContent-Type: text/html; charset=UTF-8\r\n" \ + "HTTP/1.x 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n" + end + + it 'parse headers for aggregated responses' do + headers = Faraday::Utils::Headers.new + headers.parse(multi_response_headers) + + result = headers.to_hash + + expect(result['Content-Type']).to eq('application/json; charset=UTF-8') + end + end + + describe 'URI parsing' do + let(:url) { 'http://example.com/abc' } + + it 'escapes safe buffer' do + str = FakeSafeBuffer.new('$32,000.00') + expect(Faraday::Utils.escape(str)).to eq('%2432%2C000.00') + end + + it 'parses with default parser' do + with_default_uri_parser(nil) do + uri = normalize(url) + expect(uri.host).to eq('example.com') + end + end + + it 'parses with URI' do + with_default_uri_parser(::URI) do + uri = normalize(url) + expect(uri.host).to eq('example.com') + end + end + + it 'parses with block' do + with_default_uri_parser(->(u) { "booya#{'!' * u.size}" }) do + expect(normalize(url)).to eq('booya!!!!!!!!!!!!!!!!!!!!!!') + end + end + + it 'replaces headers hash' do + headers = Faraday::Utils::Headers.new('authorization' => 't0ps3cr3t!') + expect(headers).to have_key('authorization') + + headers.replace('content-type' => 'text/plain') + expect(headers).not_to have_key('authorization') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday_spec.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday_spec.rb new file mode 100644 index 000000000000..8b603ebbdeed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/faraday_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +RSpec.describe Faraday do + it 'has a version number' do + expect(Faraday::VERSION).not_to be nil + end + + context 'proxies to default_connection' do + let(:mock_connection) { double('Connection') } + before do + Faraday.default_connection = mock_connection + end + + it 'proxies methods that exist on the default_connection' do + expect(mock_connection).to receive(:this_should_be_proxied) + + Faraday.this_should_be_proxied + end + + it 'uses method_missing on Faraday if there is no proxyable method' do + expect { Faraday.this_method_does_not_exist }.to raise_error( + NoMethodError, + "undefined method `this_method_does_not_exist' for Faraday:Module" + ) + end + + it 'proxied methods can be accessed' do + allow(mock_connection).to receive(:this_should_be_proxied) + + expect(Faraday.method(:this_should_be_proxied)).to be_a(Method) + end + + after do + Faraday.default_connection = nil + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/spec_helper.rb new file mode 100644 index 000000000000..5fcddd5b078d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/spec_helper.rb @@ -0,0 +1,132 @@ +# frozen_string_literal: true + +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration + +require 'simplecov' +require 'coveralls' +require 'webmock/rspec' +WebMock.disable_net_connect!(allow_localhost: true) + +SimpleCov.formatters = [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter] + +SimpleCov.start do + add_filter '/spec/' + minimum_coverage 84 + minimum_coverage_by_file 26 +end + +# Ensure all /lib files are loaded +# so they will be included in the test coverage report. +Dir['./lib/**/*.rb'].sort.each { |file| require file } + +require 'faraday' +require 'pry' + +Dir['./spec/support/**/*.rb'].sort.each { |f| require f } + +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + # config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + # config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + # config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + # config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + # if config.files_to_run.one? + # # Use the documentation formatter for detailed output, + # # unless a formatter has already been configured + # # (e.g. via a command-line flag). + # config.default_formatter = "doc" + # end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + # config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed + + config.include Faraday::HelperMethods +end + +# Extends RSpec DocumentationFormatter to hide skipped tests. +module FormatterOverrides + def example_pending(_arg); end + + def dump_pending(_arg); end + + RSpec::Core::Formatters::DocumentationFormatter.prepend self +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/disabling_stub.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/disabling_stub.rb new file mode 100644 index 000000000000..3df2f21b6804 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/disabling_stub.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +# Allows to disable WebMock stubs +module DisablingStub + def disable + @disabled = true + end + + def disabled? + @disabled + end + + WebMock::RequestStub.prepend self +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/fake_safe_buffer.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/fake_safe_buffer.rb new file mode 100644 index 000000000000..62a56aa58f16 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/fake_safe_buffer.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +# emulates ActiveSupport::SafeBuffer#gsub +FakeSafeBuffer = Struct.new(:string) do + def to_s + self + end + + def gsub(regex) + string.gsub(regex) do + match, = $&, '' =~ /a/ + yield(match) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/helper_methods.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/helper_methods.rb new file mode 100644 index 000000000000..d63bd59f9b52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/helper_methods.rb @@ -0,0 +1,133 @@ +# frozen_string_literal: true + +require 'multipart_parser/reader' + +module Faraday + module HelperMethods + def self.included(base) + base.extend ClassMethods + end + + module ClassMethods + def features(*features) + @features = features + end + + def on_feature(name) + yield if block_given? && feature?(name) + end + + def feature?(name) + if @features.nil? + superclass.feature?(name) if superclass.respond_to?(:feature?) + elsif @features.include?(name) + true + end + end + + def method_with_body?(method) + METHODS_WITH_BODY.include?(method.to_s) + end + end + + def ssl_mode? + ENV['SSL'] == 'yes' + end + + def normalize(url) + Faraday::Utils::URI(url) + end + + def with_default_uri_parser(parser) + old_parser = Faraday::Utils.default_uri_parser + begin + Faraday::Utils.default_uri_parser = parser + yield + ensure + Faraday::Utils.default_uri_parser = old_parser + end + end + + def with_env(new_env) + old_env = {} + + new_env.each do |key, value| + old_env[key] = ENV.fetch(key, false) + ENV[key] = value + end + + begin + yield + ensure + old_env.each do |key, value| + value == false ? ENV.delete(key) : ENV[key] = value + end + end + end + + def with_env_proxy_disabled + Faraday.ignore_env_proxy = true + + begin + yield + ensure + Faraday.ignore_env_proxy = false + end + end + + def capture_warnings + old = $stderr + $stderr = StringIO.new + begin + yield + $stderr.string + ensure + $stderr = old + end + end + + def multipart_file + Faraday::FilePart.new(__FILE__, 'text/x-ruby') + end + + # parse boundary out of a Content-Type header like: + # Content-Type: multipart/form-data; boundary=gc0p4Jq0M2Yt08jU534c0p + def parse_multipart_boundary(ctype) + MultipartParser::Reader.extract_boundary_value(ctype) + end + + # parse a multipart MIME message, returning a hash of any multipart errors + def parse_multipart(boundary, body) + reader = MultipartParser::Reader.new(boundary) + result = { errors: [], parts: [] } + def result.part(name) + hash = self[:parts].detect { |h| h[:part].name == name } + [hash[:part], hash[:body].join] + end + + reader.on_part do |part| + result[:parts] << thispart = { + part: part, + body: [] + } + part.on_data do |chunk| + thispart[:body] << chunk + end + end + reader.on_error do |msg| + result[:errors] << msg + end + reader.write(body) + result + end + + def method_with_body?(method) + self.class.method_with_body?(method) + end + + def big_string + kb = 1024 + (32..126).map(&:chr).cycle.take(50 * kb).join + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/shared_examples/adapter.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/shared_examples/adapter.rb new file mode 100644 index 000000000000..47c0d243293a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/shared_examples/adapter.rb @@ -0,0 +1,105 @@ +# frozen_string_literal: true + +shared_examples 'an adapter' do |**options| + before { skip } if options[:skip] + + context 'with SSL enabled' do + before { ENV['SSL'] = 'yes' } + include_examples 'adapter examples', options + end + + context 'with SSL disabled' do + before { ENV['SSL'] = 'no' } + include_examples 'adapter examples', options + end +end + +shared_examples 'adapter examples' do |**options| + include Faraday::StreamingResponseChecker + + let(:adapter) { described_class.name.split('::').last } + + let(:conn_options) { { headers: { 'X-Faraday-Adapter' => adapter } }.merge(options[:conn_options] || {}) } + + let(:adapter_options) do + return [] unless options[:adapter_options] + + if options[:adapter_options].is_a?(Array) + options[:adapter_options] + else + [options[:adapter_options]] + end + end + + let(:protocol) { ssl_mode? ? 'https' : 'http' } + let(:remote) { "#{protocol}://example.com" } + let(:stub_remote) { remote } + + let(:conn) do + conn_options[:ssl] ||= {} + conn_options[:ssl][:ca_file] ||= ENV['SSL_FILE'] + + Faraday.new(remote, conn_options) do |conn| + conn.request :multipart + conn.request :url_encoded + conn.response :raise_error + conn.adapter described_class, *adapter_options + end + end + + let!(:request_stub) { stub_request(http_method, stub_remote) } + + after do + expect(request_stub).to have_been_requested unless request_stub.disabled? + end + + describe '#delete' do + let(:http_method) { :delete } + + it_behaves_like 'a request method', :delete + end + + describe '#get' do + let(:http_method) { :get } + + it_behaves_like 'a request method', :get + end + + describe '#head' do + let(:http_method) { :head } + + it_behaves_like 'a request method', :head + end + + describe '#options' do + let(:http_method) { :options } + + it_behaves_like 'a request method', :options + end + + describe '#patch' do + let(:http_method) { :patch } + + it_behaves_like 'a request method', :patch + end + + describe '#post' do + let(:http_method) { :post } + + it_behaves_like 'a request method', :post + end + + describe '#put' do + let(:http_method) { :put } + + it_behaves_like 'a request method', :put + end + + on_feature :trace_method do + describe '#trace' do + let(:http_method) { :trace } + + it_behaves_like 'a request method', :trace + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/shared_examples/params_encoder.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/shared_examples/params_encoder.rb new file mode 100644 index 000000000000..38c8567992b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/shared_examples/params_encoder.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +shared_examples 'a params encoder' do + it 'escapes safe buffer' do + monies = FakeSafeBuffer.new('$32,000.00') + expect(subject.encode('a' => monies)).to eq('a=%2432%2C000.00') + end + + it 'raises type error for empty string' do + expect { subject.encode('') }.to raise_error(TypeError) do |error| + expect(error.message).to eq("Can't convert String into Hash.") + end + end + + it 'encodes nil' do + expect(subject.encode('a' => nil)).to eq('a') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/shared_examples/request_method.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/shared_examples/request_method.rb new file mode 100644 index 000000000000..cb7125106eb4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/shared_examples/request_method.rb @@ -0,0 +1,262 @@ +# frozen_string_literal: true + +shared_examples 'proxy examples' do + it 'handles requests with proxy' do + res = conn.public_send(http_method, '/') + + expect(res.status).to eq(200) + end + + it 'handles proxy failures' do + request_stub.to_return(status: 407) + + expect { conn.public_send(http_method, '/') }.to raise_error(Faraday::ProxyAuthError) + end +end + +shared_examples 'a request method' do |http_method| + let(:query_or_body) { method_with_body?(http_method) ? :body : :query } + let(:response) { conn.public_send(http_method, '/') } + + unless http_method == :head && feature?(:skip_response_body_on_head) + it 'retrieves the response body' do + res_body = 'test' + request_stub.to_return(body: res_body) + expect(conn.public_send(http_method, '/').body).to eq(res_body) + end + end + + it 'handles headers with multiple values' do + request_stub.to_return(headers: { 'Set-Cookie' => 'name=value' }) + expect(response.headers['set-cookie']).to eq('name=value') + end + + it 'retrieves the response headers' do + request_stub.to_return(headers: { 'Content-Type' => 'text/plain' }) + expect(response.headers['Content-Type']).to match(%r{text/plain}) + expect(response.headers['content-type']).to match(%r{text/plain}) + end + + it 'sends user agent' do + request_stub.with(headers: { 'User-Agent' => 'Agent Faraday' }) + conn.public_send(http_method, '/', nil, user_agent: 'Agent Faraday') + end + + it 'represents empty body response as blank string' do + expect(response.body).to eq('') + end + + it 'handles connection error' do + request_stub.disable + expect { conn.public_send(http_method, 'http://localhost:4') }.to raise_error(Faraday::ConnectionFailed) + end + + on_feature :local_socket_binding do + it 'binds local socket' do + stub_request(http_method, 'http://example.com') + + host = '1.2.3.4' + port = 1234 + conn_options[:request] = { bind: { host: host, port: port } } + + conn.public_send(http_method, '/') + + expect(conn.options[:bind][:host]).to eq(host) + expect(conn.options[:bind][:port]).to eq(port) + end + end + + # context 'when wrong ssl certificate is provided' do + # let(:ca_file_path) { 'tmp/faraday-different-ca-cert.crt' } + # before { conn_options.merge!(ssl: { ca_file: ca_file_path }) } + # + # it do + # expect { conn.public_send(http_method, '/') }.to raise_error(Faraday::SSLError) # do |ex| + # expect(ex.message).to include?('certificate') + # end + # end + # end + + on_feature :request_body_on_query_methods do + it 'sends request body' do + request_stub.with(Hash[:body, 'test']) + res = if query_or_body == :body + conn.public_send(http_method, '/', 'test') + else + conn.public_send(http_method, '/') do |req| + req.body = 'test' + end + end + expect(res.env.request_body).to eq('test') + end + end + + it 'sends url encoded parameters' do + payload = { name: 'zack' } + request_stub.with(Hash[query_or_body, payload]) + res = conn.public_send(http_method, '/', payload) + if query_or_body == :query + expect(res.env.request_body).to be_nil + else + expect(res.env.request_body).to eq('name=zack') + end + end + + it 'sends url encoded nested parameters' do + payload = { name: { first: 'zack' } } + request_stub.with(Hash[query_or_body, payload]) + conn.public_send(http_method, '/', payload) + end + + # TODO: This needs reimplementation: see https://github.com/lostisland/faraday/issues/718 + # Should raise Faraday::TimeoutError + it 'supports timeout option' do + conn_options[:request] = { timeout: 1 } + request_stub.to_timeout + exc = adapter == 'NetHttp' ? Faraday::ConnectionFailed : Faraday::TimeoutError + expect { conn.public_send(http_method, '/') }.to raise_error(exc) + end + + # TODO: This needs reimplementation: see https://github.com/lostisland/faraday/issues/718 + # Should raise Faraday::ConnectionFailed + it 'supports open_timeout option' do + conn_options[:request] = { open_timeout: 1 } + request_stub.to_timeout + exc = adapter == 'NetHttp' ? Faraday::ConnectionFailed : Faraday::TimeoutError + expect { conn.public_send(http_method, '/') }.to raise_error(exc) + end + + # Can't send files on get, head and delete methods + if method_with_body?(http_method) + it 'sends files' do + payload = { uploaded_file: multipart_file } + request_stub.with(headers: { 'Content-Type' => %r{\Amultipart/form-data} }) do |request| + # WebMock does not support matching body for multipart/form-data requests yet :( + # https://github.com/bblimke/webmock/issues/623 + request.body.include?('RubyMultipartPost') + end + conn.public_send(http_method, '/', payload) + end + end + + on_feature :reason_phrase_parse do + it 'parses the reason phrase' do + request_stub.to_return(status: [200, 'OK']) + expect(response.reason_phrase).to eq('OK') + end + end + + on_feature :compression do + # Accept-Encoding header not sent for HEAD requests as body is not expected in the response. + unless http_method == :head + it 'handles gzip compression' do + request_stub.with(headers: { 'Accept-Encoding' => /\bgzip\b/ }) + conn.public_send(http_method, '/') + end + + it 'handles deflate compression' do + request_stub.with(headers: { 'Accept-Encoding' => /\bdeflate\b/ }) + conn.public_send(http_method, '/') + end + end + end + + on_feature :streaming do + describe 'streaming' do + let(:streamed) { [] } + + context 'when response is empty' do + it do + conn.public_send(http_method, '/') do |req| + req.options.on_data = proc { |*args| streamed << args } + end + + expect(streamed).to eq([['', 0]]) + end + end + + context 'when response contains big data' do + before { request_stub.to_return(body: big_string) } + + it 'handles streaming' do + response = conn.public_send(http_method, '/') do |req| + req.options.on_data = proc { |*args| streamed << args } + end + + expect(response.body).to eq('') + check_streaming_response(streamed, chunk_size: 16 * 1024) + end + end + end + end + + on_feature :parallel do + context 'with parallel setup' do + before do + @resp1 = nil + @resp2 = nil + @payload1 = { a: '1' } + @payload2 = { b: '2' } + + request_stub + .with(Hash[query_or_body, @payload1]) + .to_return(body: @payload1.to_json) + + stub_request(http_method, remote) + .with(Hash[query_or_body, @payload2]) + .to_return(body: @payload2.to_json) + + conn.in_parallel do + @resp1 = conn.public_send(http_method, '/', @payload1) + @resp2 = conn.public_send(http_method, '/', @payload2) + + expect(conn.in_parallel?).to be_truthy + expect(@resp1.body).to be_nil + expect(@resp2.body).to be_nil + end + + expect(conn.in_parallel?).to be_falsey + end + + it 'handles parallel requests status' do + expect(@resp1&.status).to eq(200) + expect(@resp2&.status).to eq(200) + end + + unless http_method == :head && feature?(:skip_response_body_on_head) + it 'handles parallel requests body' do + expect(@resp1&.body).to eq(@payload1.to_json) + expect(@resp2&.body).to eq(@payload2.to_json) + end + end + end + end + + context 'when a proxy is provided as option' do + before do + conn_options[:proxy] = 'http://env-proxy.com:80' + end + + include_examples 'proxy examples' + end + + context 'when http_proxy env variable is set' do + let(:proxy_url) { 'http://env-proxy.com:80' } + + around do |example| + with_env 'http_proxy' => proxy_url do + example.run + end + end + + include_examples 'proxy examples' + + context 'when the env proxy is ignored' do + around do |example| + with_env_proxy_disabled(&example) + end + + include_examples 'proxy examples' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/streaming_response_checker.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/streaming_response_checker.rb new file mode 100644 index 000000000000..8ef25999597e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/streaming_response_checker.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Faraday + module StreamingResponseChecker + def check_streaming_response(streamed, options = {}) + opts = { + prefix: '', + streaming?: true + }.merge(options) + + expected_response = opts[:prefix] + big_string + + chunks, sizes = streamed.transpose + + # Check that the total size of the chunks (via the last size returned) + # is the same size as the expected_response + expect(sizes.last).to eq(expected_response.bytesize) + + start_index = 0 + expected_chunks = [] + chunks.each do |actual_chunk| + expected_chunk = expected_response[start_index..((start_index + actual_chunk.bytesize) - 1)] + expected_chunks << expected_chunk + start_index += expected_chunk.bytesize + end + + # it's easier to read a smaller portion, so we check that first + expect(expected_chunks[0][0..255]).to eq(chunks[0][0..255]) + + [expected_chunks, chunks].transpose.each do |expected, actual| + expect(actual).to eq(expected) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/webmock_rack_app.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/webmock_rack_app.rb new file mode 100644 index 000000000000..a3212c71cb8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-1.3.0/spec/support/webmock_rack_app.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +# Rack app used to test the Rack adapter. +# Uses Webmock to check if requests are registered, in which case it returns +# the registered response. +class WebmockRackApp + def call(env) + req_signature = WebMock::RequestSignature.new( + req_method(env), + req_uri(env), + body: req_body(env), + headers: req_headers(env) + ) + + WebMock::RequestRegistry + .instance + .requested_signatures + .put(req_signature) + + process_response(req_signature) + end + + def req_method(env) + env['REQUEST_METHOD'].downcase.to_sym + end + + def req_uri(env) + scheme = env['rack.url_scheme'] + host = env['SERVER_NAME'] + port = env['SERVER_PORT'] + path = env['PATH_INFO'] + query = env['QUERY_STRING'] + + url = +"#{scheme}://#{host}:#{port}#{path}" + url += "?#{query}" if query + + uri = WebMock::Util::URI.heuristic_parse(url) + uri.path = uri.normalized_path.gsub('[^:]//', '/') + uri + end + + def req_headers(env) + http_headers = env.select { |k, _| k.start_with?('HTTP_') } + .map { |k, v| [k[5..-1], v] } + .to_h + + special_headers = Faraday::Adapter::Rack::SPECIAL_HEADERS + http_headers.merge(env.select { |k, _| special_headers.include?(k) }) + end + + def req_body(env) + env['rack.input'].read + end + + def process_response(req_signature) + res = WebMock::StubRegistry.instance.response_for_request(req_signature) + + if res.nil? && req_signature.uri.host == 'localhost' + raise Faraday::ConnectionFailed, 'Trying to connect to localhost' + end + + raise WebMock::NetConnectNotAllowedError, req_signature unless res + + raise Faraday::TimeoutError if res.should_timeout + + [res.status[0], res.headers || {}, [res.body || '']] + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/LICENSE.md new file mode 100644 index 000000000000..b7aabc564833 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020 Jan van der Pas + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/README.md b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/README.md new file mode 100644 index 000000000000..01068b2e35c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/README.md @@ -0,0 +1,57 @@ +# Faraday Net::HTTP adapter + +This gem is a [Faraday][faraday] adapter for the [Net::HTTP][net-http] library. Faraday is an HTTP client library that provides a common interface over many adapters. Every adapter is defined into it's own gem. This gem defines the adapter for `Net::HTTP` the HTTP library that's included into the standard library of Ruby. + +## Installation + +Add this line to your application's Gemfile: + +```ruby +gem 'faraday-net_http' +``` + +And then execute: + + $ bundle install + +Or install it yourself as: + + $ gem install faraday-net_http + +## Usage + +Configure your Faraday connection to use this adapter like this: + +```ruby +connection = Faraday.new(url, conn_options) do |conn| + conn.adapter(:net_http) +end +``` + +For more information on how to setup your Faraday connection and adapters usage, please refer to the [Faraday Website][faraday-website]. + +## Development + +After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. + +To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](rubygems). + +## Contributing + +Bug reports and pull requests are welcome on [GitHub][repo]. + +## License + +The gem is available as open source under the terms of the [license][license]. + +## Code of Conduct + +Everyone interacting in the Faraday Net::HTTP adapter project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct][code-of-conduct]. + +[faraday]: https://github.com/lostisland/faraday +[faraday-website]: https://lostisland.github.io/faraday +[net-http]: https://ruby-doc.org/stdlib-2.7.0/libdoc/net/http/rdoc/Net/HTTP.html +[rubygems]: https://rubygems.org +[repo]: https://github.com/lostisland/faraday-net_http +[license]: https://github.com/lostisland/faraday-net_http/blob/main/LICENSE.md +[code-of-conduct]: https://github.com/lostisland/faraday-net_http/blob/main/CODE_OF_CONDUCT.md \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/lib/faraday/adapter/net_http.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/lib/faraday/adapter/net_http.rb new file mode 100644 index 000000000000..23b33a78bc0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/lib/faraday/adapter/net_http.rb @@ -0,0 +1,213 @@ +# frozen_string_literal: true + +begin + require 'net/https' +rescue LoadError + warn 'Warning: no such file to load -- net/https. ' \ + 'Make sure openssl is installed if you want ssl support' + require 'net/http' +end +require 'zlib' + +module Faraday + class Adapter + class NetHttp < Faraday::Adapter + exceptions = [ + IOError, + Errno::EADDRNOTAVAIL, + Errno::ECONNABORTED, + Errno::ECONNREFUSED, + Errno::ECONNRESET, + Errno::EHOSTUNREACH, + Errno::EINVAL, + Errno::ENETUNREACH, + Errno::EPIPE, + Net::HTTPBadResponse, + Net::HTTPHeaderSyntaxError, + Net::ProtocolError, + SocketError, + Zlib::GzipFile::Error + ] + + exceptions << ::OpenSSL::SSL::SSLError if defined?(::OpenSSL::SSL::SSLError) + exceptions << ::Net::OpenTimeout if defined?(::Net::OpenTimeout) + + NET_HTTP_EXCEPTIONS = exceptions.freeze + + def initialize(app = nil, opts = {}, &block) + @ssl_cert_store = nil + super(app, opts, &block) + end + + def build_connection(env) + net_http_connection(env).tap do |http| + http.use_ssl = env[:url].scheme == 'https' if http.respond_to?(:use_ssl=) + configure_ssl(http, env[:ssl]) + configure_request(http, env[:request]) + end + end + + def net_http_connection(env) + proxy = env[:request][:proxy] + port = env[:url].port || (env[:url].scheme == 'https' ? 443 : 80) + if proxy + Net::HTTP.new(env[:url].hostname, port, + proxy[:uri].hostname, proxy[:uri].port, + proxy[:user], proxy[:password]) + else + Net::HTTP.new(env[:url].hostname, port, nil) + end + end + + def call(env) + super + http_response = connection(env) do |http| + begin + perform_request(http, env) + rescue *NET_HTTP_EXCEPTIONS => e + raise Faraday::SSLError, e if defined?(OpenSSL) && e.is_a?(OpenSSL::SSL::SSLError) + + raise Faraday::ConnectionFailed, e + end + end + + save_response(env, http_response.code.to_i, + http_response.body || +'', nil, + http_response.message) do |response_headers| + http_response.each_header do |key, value| + response_headers[key] = value + end + end + + @app.call env + rescue Timeout::Error, Errno::ETIMEDOUT => e + raise Faraday::TimeoutError, e + end + + private + + def create_request(env) + request = Net::HTTPGenericRequest.new \ + env[:method].to_s.upcase, # request method + !!env[:body], # is there request body + env[:method] != :head, # is there response body + env[:url].request_uri, # request uri path + env[:request_headers] # request headers + + if env[:body].respond_to?(:read) + request.body_stream = env[:body] + else + request.body = env[:body] + end + request + end + + def perform_request(http, env) + if env[:request].stream_response? + size = 0 + yielded = false + http_response = request_with_wrapped_block(http, env) do |chunk| + if chunk.bytesize.positive? || size.positive? + yielded = true + size += chunk.bytesize + env[:request].on_data.call(chunk, size) + end + end + env[:request].on_data.call(+'', 0) unless yielded + # Net::HTTP returns something, + # but it's not meaningful according to the docs. + http_response.body = nil + http_response + else + request_with_wrapped_block(http, env) + end + end + + def request_with_wrapped_block(http, env, &block) + if (env[:method] == :get) && !env[:body] + # prefer `get` to `request` because the former handles gzip (ruby 1.9) + request_via_get_method(http, env, &block) + else + request_via_request_method(http, env, &block) + end + end + + def request_via_get_method(http, env, &block) + # Must use Net::HTTP#start and pass it a block otherwise the server's + # TCP socket does not close correctly. + http.start do |opened_http| + opened_http.get env[:url].request_uri, env[:request_headers], &block + end + end + + def request_via_request_method(http, env, &block) + # Must use Net::HTTP#start and pass it a block otherwise the server's + # TCP socket does not close correctly. + http.start do |opened_http| + if block_given? + opened_http.request create_request(env) do |response| + response.read_body(&block) + end + else + opened_http.request create_request(env) + end + end + end + + def configure_ssl(http, ssl) + return unless ssl + + http.verify_mode = ssl_verify_mode(ssl) + http.cert_store = ssl_cert_store(ssl) + + http.cert = ssl[:client_cert] if ssl[:client_cert] + http.key = ssl[:client_key] if ssl[:client_key] + http.ca_file = ssl[:ca_file] if ssl[:ca_file] + http.ca_path = ssl[:ca_path] if ssl[:ca_path] + http.verify_depth = ssl[:verify_depth] if ssl[:verify_depth] + http.ssl_version = ssl[:version] if ssl[:version] + http.min_version = ssl[:min_version] if ssl[:min_version] + http.max_version = ssl[:max_version] if ssl[:max_version] + end + + def configure_request(http, req) + if (sec = request_timeout(:read, req)) + http.read_timeout = sec + end + + if (sec = http.respond_to?(:write_timeout=) && + request_timeout(:write, req)) + http.write_timeout = sec + end + + if (sec = request_timeout(:open, req)) + http.open_timeout = sec + end + + # Only set if Net::Http supports it, since Ruby 2.5. + http.max_retries = 0 if http.respond_to?(:max_retries=) + + @config_block&.call(http) + end + + def ssl_cert_store(ssl) + return ssl[:cert_store] if ssl[:cert_store] + + @ssl_cert_store ||= begin + # Use the default cert store by default, i.e. system ca certs + OpenSSL::X509::Store.new.tap(&:set_default_paths) + end + end + + def ssl_verify_mode(ssl) + ssl[:verify_mode] || begin + if ssl.fetch(:verify, true) + OpenSSL::SSL::VERIFY_PEER + else + OpenSSL::SSL::VERIFY_NONE + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/lib/faraday/net_http.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/lib/faraday/net_http.rb new file mode 100644 index 000000000000..1416e07b6297 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/lib/faraday/net_http.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require_relative 'adapter/net_http' +require_relative 'net_http/version' + +module Faraday + module NetHttp + Faraday::Adapter.register_middleware(net_http: Faraday::Adapter::NetHttp) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/lib/faraday/net_http/version.rb b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/lib/faraday/net_http/version.rb new file mode 100644 index 000000000000..9eb6a77a0e9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/faraday-net_http-1.0.1/lib/faraday/net_http/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Faraday + module NetHttp + VERSION = '1.0.1' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/CHANGELOG.md new file mode 100644 index 000000000000..237a20b250ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/CHANGELOG.md @@ -0,0 +1,286 @@ +1.15.0 / 2021-03-05 +------------------- + +Fixed: +* Fix MSVC build +* Fix async callbacks in conjunction with fork(). #884 + +Added: +* Allow to pass callbacks in varargs. #885 +* Name the threads for FFI callback dispatcher and async thread calls for easier debugging. #883 + The name can be retrieved by Thread.name and is shown by Thread.list.inspect etc. + Even gdb shows the thread name on supported operating systems. +* Add types.conf for powerpc64le-linux +* Add types.conf for riscv64-linux +* More release automation of ffi gems + +Changed: +* Switch from rubygems-tasks to bundler/gem_helper + +Removed: +* Remove unused VariadicInvoker#init + + +1.14.2 / 2020-12-21 +------------------- + +Fixed: +* Fix builtin libffi on newer Ubuntu caused by an outdated Makefile.in . #863 + + +1.14.1 / 2020-12-19 +------------------- + +Changed: +* Revert changes to FFI::Pointer#write_string made in ffi-1.14.0. + It breaks compatibilty in a way that can cause hard to find errors. #857 + + +1.14.0 / 2020-12-18 +------------------- + +Added: +* Add types.conf for x86_64-msys, x86_64-haiku, aarch64-openbsd and aarch64-darwin (alias arm64-darwin) +* Add method AbstractMemory#size_limit? . #829 +* Add new extconf option --enable-libffi-alloc which is enabled per default on Apple M1 (arm64-darwin). + +Changed: +* Do NULL pointer check only when array length > 0 . #305 +* Raise an error on an unknown order argument. #830 +* Change FFI::Pointer#write_string to terminate with a NUL byte like other string methods. #805 +* Update bundled libffi to latest master. + +Removed: +* Remove win32/stdint.h and stdbool.h because of copyright issue. #693 + +Fixed: +* Fix possible UTF-8 load error in loader script interpretation. #792 +* Fix segfault on non-array argument to #write_array_of_* +* Fix memory leak in MethodHandle . #815 +* Fix possible segfault in combination with fiddle or other libffi using gems . #835 +* Fix possibility to use ffi ruby gem with JRuby-9.3 . #763 +* Fix a GC issue, when a callback Proc is used on more than 2 callback signatures. #820 + + +1.13.1 / 2020-06-09 +------------------- + +Changed: +* Revert use of `ucrtbase.dll` as default C library on Windows-MINGW. + `ucrtbase.dll` is still used on MSWIN target. #790 +* Test for `ffi_prep_closure_loc()` to make sure we can use this function. + This fixes incorrect use of system libffi on MacOS Mojave (10.14). #787 +* Update types.conf on x86_64-dragonflybsd + + +1.13.0 / 2020-06-01 +------------------- + +Added: +* Add TruffleRuby support. Almost all specs are running on TruffleRuby and succeed. #768 +* Add ruby source files to the java gem. This allows to ship the Ruby library code per platform java gem and add it as a default gem to JRuby. #763 +* Add FFI::Platform::LONG_DOUBLE_SIZE +* Add bounds checks for writing to an inline char[] . #756 +* Add long double as callback return value. #771 +* Update type definitions and add types from stdint.h and stddef.h on i386-windows, x86_64-windows, x86_64-darwin, x86_64-linux, arm-linux, powerpc-linux. #749 +* Add new type definitions for powerpc-openbsd and sparcv9-openbsd. #775, #778 + +Changed: +* Raise required ruby version to >= 2.3. +* Lots of cleanups and improvements in library, specs and benchmarks. +* Fix a lot of compiler warnings at the C-extension +* Fix several install issues on MacOS: + * Look for libffi in SDK paths, since recent versions of macOS removed it from `/usr/include` . #757 + * Fix error `ld: library not found for -lgcc_s.10.4` + * Don't built for i386 architecture as it is deprecated +* Several fixes for MSVC build on Windows. #779 +* Use `ucrtbase.dll` as default C library on Windows instead of old `msvcrt.dll`. #779 +* Update builtin libffi to fix a Powerpc issue with parameters of type long +* Allow unmodified sourcing of (the ruby code of) this gem in JRuby and TruffleRuby as a default gem. #747 +* Improve check to detect if a module has a #find_type method suitable for FFI. This fixes compatibility with stdlib `mkmf` . #776 + +Removed: +* Reject callback with `:string` return type at definition, because it didn't work so far and is not save to use. #751, #782 + + +1.12.2 / 2020-02-01 +------------------- + +* Fix possible segfault at FFI::Struct#[] and []= after GC.compact . #742 + + +1.12.1 / 2020-01-14 +------------------- + +Added: +* Add binary gem support for ruby-2.7 on Windows + + +1.12.0 / 2020-01-14 +------------------- + +Added: +* FFI::VERSION is defined as part of `require 'ffi'` now. + It is no longer necessary to `require 'ffi/version'` . + +Changed: +* Update libffi to latest master. + +Deprecated: +* Overwriting struct layouts is now warned and will be disallowed in ffi-2.0. #734, #735 + + +1.11.3 / 2019-11-25 +------------------- + +Removed: +* Remove support for tainted objects which cause deprecation warnings in ruby-2.7. #730 + + +1.11.2 / 2019-11-11 +------------------- + +Added: +* Add DragonFlyBSD as a platform. #724 + +Changed: +* Sort all types.conf files, so that files and changes are easier to compare. +* Regenerated type conf for freebsd12 and x86_64-linux targets. #722 +* Remove MACOSX_DEPLOYMENT_TARGET that was targeting very old version 10.4. #647 +* Fix library name mangling for non glibc Linux/UNIX. #727 +* Fix compiler warnings raised by ruby-2.7 +* Update libffi to latest master. + + +1.11.1 / 2019-05-20 +------------------- + +Changed: +* Raise required ruby version to >=2.0. #699, #700 +* Fix a possible linker error on ruby < 2.3 on Linux. + + +1.11.0 / 2019-05-17 +------------------- +This version was yanked on 2019-05-20 to fix an install issue on ruby-1.9.3. #700 + +Added: +* Add ability to disable or force use of system libffi. #669 + Use like `gem inst ffi -- --enable-system-libffi` . +* Add ability to call FFI callbacks from outside of FFI call frame. #584 +* Add proper documentation to FFI::Generator and ::Task +* Add gemspec metadata. #696, #698 + +Changed: +* Fix stdcall on Win32. #649, #669 +* Fix load paths for FFI::Generator::Task +* Fix FFI::Pointer#read_string(0) to return a binary String. #692 +* Fix benchmark suite so that it runs on ruby-2.x +* Move FFI::Platform::CPU from C to Ruby. #663 +* Move FFI::StructByReference to Ruby. #681 +* Move FFI::DataConverter to Ruby (#661) +* Various cleanups and improvements of specs and benchmarks + +Removed: +* Remove ruby-1.8 and 1.9 compatibility code. #683 +* Remove unused spec files. #684 + + +1.10.0 / 2019-01-06 +------------------- + +Added: +* Add /opt/local/lib/ to ffi's fallback library search path. #638 +* Add binary gem support for ruby-2.6 on Windows +* Add FreeBSD on AArch64 and ARM support. #644 +* Add FFI::LastError.winapi_error on Windows native or Cygwin. #633 + +Changed: +* Update to rake-compiler-dock-0.7.0 +* Use 64-bit inodes on FreeBSD >= 12. #644 +* Switch time_t and suseconds_t types to long on FreeBSD. #627 +* Make register_t long_long on 64-bit FreeBSD. #644 +* Fix Pointer#write_array_of_type #637 + +Removed: +* Drop binary gem support for ruby-2.0 and 2.1 on Windows + + +1.9.25 / 2018-06-03 +------------------- + +Changed: +* Revert closures via libffi. + This re-adds ClosurePool and fixes compat with SELinux enabled systems. #621 + + +1.9.24 / 2018-06-02 +------------------- + +Security Note: + +This update addresses vulnerability CVE-2018-1000201: DLL loading issue which can be hijacked on Windows OS, when a Symbol is used as DLL name instead of a String. Found by Matthew Bush. + +Added: +* Added a CHANGELOG file +* Add mips64(eb) support, and mips r6 support. (#601) + +Changed: +* Update libffi to latest changes on master. +* Don't search in hardcoded /usr paths on Windows. +* Don't treat Symbol args different to Strings in ffi_lib. +* Make sure size_t is defined in Thread.c. Fixes #609 + + +1.9.23 / 2018-02-25 +------------------- + +Changed: +* Fix unnecessary rebuild of configure in darwin multi arch. Fixes #605 + + +1.9.22 / 2018-02-22 +------------------- + +Changed: +* Update libffi to latest changes on master. +* Update detection of system libffi to match new requirements. Fixes #617 +* Prefer bundled libffi over system libffi on Mac OS. +* Do closures via libffi. This removes ClosurePool and fixes compat with PaX. #540 +* Use a more deterministic gem packaging. +* Fix unnecessary update of autoconf files at gem install. + + +1.9.21 / 2018-02-06 +------------------- + +Added: +* Ruby-2.5 support by Windows binary gems. Fixes #598 +* Add missing win64 types. +* Added support for Bitmask. (#573) +* Add support for MSYS2 (#572) and Sparc64 Linux. (#574) + +Changed: +* Fix read_string to not throw an error on length 0. +* Don't use absolute paths for sh and env. Fixes usage on Adroid #528 +* Use Ruby implementation for `which` for better compat with Windows. Fixes #315 +* Fix compatibility with PPC64LE platform. (#577) +* Normalize sparc64 to sparcv9. (#575) + +Removed: +* Drop Ruby 1.8.7 support (#480) + + +1.9.18 / 2017-03-03 +------------------- + +Added: +* Add compatibility with Ruby-2.4. + +Changed: +* Add missing shlwapi.h include to fix Windows build. +* Avoid undefined behaviour of LoadLibrary() on Windows. #553 + + +1.9.17 / 2017-01-13 +------------------- diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/COPYING b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/COPYING new file mode 100644 index 000000000000..76223189f706 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/COPYING @@ -0,0 +1,49 @@ +Copyright (c) 2008-2013, Ruby FFI project contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Ruby FFI project nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +libffi, used by this project, is licensed under the MIT license: + +libffi - Copyright (c) 1996-2011 Anthony Green, Red Hat, Inc and others. +See source files for details. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/Gemfile new file mode 100644 index 000000000000..40bd4fe79631 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/Gemfile @@ -0,0 +1,14 @@ +source 'https://rubygems.org' + +group :development do + gem 'rake', '~> 13.0' + gem 'rake-compiler', '~> 1.0.3' + gem 'rake-compiler-dock', '~> 1.0' + gem 'rspec', '~> 3.0' + gem 'bundler', '~> 2.0' +end + +group :doc do + gem 'kramdown' + gem 'yard', '~> 0.9' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/LICENSE b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/LICENSE new file mode 100644 index 000000000000..20185fd4f5d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2008-2016, Ruby FFI project contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Ruby FFI project nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/LICENSE.SPECS b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/LICENSE.SPECS new file mode 100644 index 000000000000..5c9ffcee31b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/LICENSE.SPECS @@ -0,0 +1,22 @@ +Copyright (c) 2008-2012 Ruby-FFI contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/README.md b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/README.md new file mode 100644 index 000000000000..ac84466e7a06 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/README.md @@ -0,0 +1,132 @@ +# Ruby-FFI https://github.com/ffi/ffi/wiki [![Build Status](https://travis-ci.com/ffi/ffi.svg?branch=master)](https://travis-ci.com/ffi/ffi) [![Build status Windows](https://ci.appveyor.com/api/projects/status/r8wxn1sd4s794gg1/branch/master?svg=true)](https://ci.appveyor.com/project/larskanis/ffi-aofqa/branch/master) + +## Description + +Ruby-FFI is a gem for programmatically loading dynamically-linked native +libraries, binding functions within them, and calling those functions +from Ruby code. Moreover, a Ruby-FFI extension works without changes +on CRuby (MRI), JRuby, Rubinius and TruffleRuby. [Discover why you should write your next extension +using Ruby-FFI](https://github.com/ffi/ffi/wiki/why-use-ffi). + +## Features + +* Intuitive DSL +* Supports all C native types +* C structs (also nested), enums and global variables +* Callbacks from C to Ruby +* Automatic garbage collection of native memory + +## Synopsis + +```ruby +require 'ffi' + +module MyLib + extend FFI::Library + ffi_lib 'c' + attach_function :puts, [ :string ], :int +end + +MyLib.puts 'Hello, World using libc!' +``` + +For less minimalistic and more examples you may look at: + +* the `samples/` folder +* the examples on the [wiki](https://github.com/ffi/ffi/wiki) +* the projects using FFI listed on the wiki: https://github.com/ffi/ffi/wiki/projects-using-ffi + +## Requirements + +When installing the gem on CRuby (MRI), you will need: +* A C compiler (e.g., Xcode on macOS, `gcc` or `clang` on everything else) +Optionally (speeds up installation): +* The `libffi` library and development headers - this is commonly in the `libffi-dev` or `libffi-devel` packages + +The ffi gem comes with a builtin libffi version, which is used, when the system libffi library is not available or too old. +Use of the system libffi can be enforced by: +``` +gem install ffi -- --enable-system-libffi # to install the gem manually +bundle config build.ffi --enable-system-libffi # for bundle install +``` +or prevented by `--disable-system-libffi`. + +On Linux systems running with [PaX](https://en.wikipedia.org/wiki/PaX) (Gentoo, Alpine, etc.), FFI may trigger `mprotect` errors. You may need to disable [mprotect](https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Restrict_mprotect.28.29) for ruby (`paxctl -m [/path/to/ruby]`) for the time being until a solution is found. + +On FreeBSD systems pkgconf must be installed for the gem to be able to compile using clang. Install either via packages `pkg install pkgconf` or from ports via `devel/pkgconf`. + +On JRuby and TruffleRuby, there are no requirements to install the FFI gem, and `require 'ffi'` works even without installing the gem (i.e., the gem is preinstalled on these implementations). + +## Installation + +From rubygems: + + [sudo] gem install ffi + +or from the git repository on github: + + git clone git://github.com/ffi/ffi.git + cd ffi + git submodule update --init --recursive + bundle install + rake install + +### Install options: + +* `--enable-system-libffi` : Force usage of system libffi +* `--disable-system-libffi` : Force usage of builtin libffi +* `--enable-libffi-alloc` : Force closure allocation by libffi +* `--disable-libffi-alloc` : Force closure allocation by builtin method + +## License + +The ffi library is covered by the BSD license, also see the LICENSE file. +The specs are covered by the same license as [ruby/spec](https://github.com/ruby/spec), the MIT license. + +## Credits + +The following people have submitted code, bug reports, or otherwise contributed to the success of this project: + +* Alban Peignier <alban.peignier@free.fr> +* Aman Gupta <aman@tmm1.net> +* Andrea Fazzi <andrea.fazzi@alcacoop.it> +* Andreas Niederl <rico32@gmx.net> +* Andrew Cholakian <andrew@andrewvc.com> +* Antonio Terceiro <terceiro@softwarelivre.org> +* Benoit Daloze <eregontp@gmail.com> +* Brian Candler <B.Candler@pobox.com> +* Brian D. Burns <burns180@gmail.com> +* Bryan Kearney <bkearney@redhat.com> +* Charlie Savage <cfis@zerista.com> +* Chikanaga Tomoyuki <nagachika00@gmail.com> +* Hongli Lai <hongli@phusion.nl> +* Ian MacLeod <ian@nevir.net> +* Jake Douglas <jake@shiftedlabs.com> +* Jean-Dominique Morani <jdmorani@mac.com> +* Jeremy Hinegardner <jeremy@hinegardner.org> +* Jesús García Sáez <blaxter@gmail.com> +* Joe Khoobyar <joe@ankhcraft.com> +* Jurij Smakov <jurij@wooyd.org> +* KISHIMOTO, Makoto <ksmakoto@dd.iij4u.or.jp> +* Kim Burgestrand <kim@burgestrand.se> +* Lars Kanis <kanis@comcard.de> +* Luc Heinrich <luc@honk-honk.com> +* Luis Lavena <luislavena@gmail.com> +* Matijs van Zuijlen <matijs@matijs.net> +* Matthew King <automatthew@gmail.com> +* Mike Dalessio <mike.dalessio@gmail.com> +* NARUSE, Yui <naruse@airemix.jp> +* Park Heesob <phasis@gmail.com> +* Shin Yee <shinyee@speedgocomputing.com> +* Stephen Bannasch <stephen.bannasch@gmail.com> +* Suraj N. Kurapati <sunaku@gmail.com> +* Sylvain Daubert <sylvain.daubert@laposte.net> +* Victor Costan +* beoran@gmail.com +* ctide <christide@christide.com> +* emboss <Martin.Bosslet@googlemail.com> +* hobophobe <unusualtears@gmail.com> +* meh <meh@paranoici.org> +* postmodern <postmodern.mod3@gmail.com> +* wycats@gmail.com <wycats@gmail.com> +* Wayne Meissner <wmeissner@gmail.com> diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/Rakefile new file mode 100644 index 000000000000..07ce574e1b2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/Rakefile @@ -0,0 +1,177 @@ +require 'rbconfig' +require 'date' +require 'fileutils' +require 'rbconfig' +require 'rspec/core/rake_task' +require 'rubygems/package_task' +require 'rake/extensiontask' +require_relative "lib/ffi/version" +require_relative "rakelib/ffi_gem_helper" + +BUILD_DIR = "build" +BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION) + +gem_spec = Bundler.load_gemspec('ffi.gemspec') + +RSpec::Core::RakeTask.new(:spec => :compile) do |config| + config.rspec_opts = YAML.load_file 'spec/spec.opts' +end + +desc "Build all packages" +task :package => %w[ gem:java gem:windows ] + +CLOBBER.include 'lib/ffi/types.conf' +CLOBBER.include 'pkg' +CLOBBER.include 'log' + +CLEAN.include 'build' +CLEAN.include 'conftest.dSYM' +CLEAN.include 'spec/ffi/fixtures/libtest.{dylib,so,dll}' +CLEAN.include 'spec/ffi/fixtures/*.o' +CLEAN.include 'spec/ffi/embed-test/ext/*.{o,def}' +CLEAN.include 'spec/ffi/embed-test/ext/Makefile' +CLEAN.include "pkg/ffi-*-{mingw32,java}" +CLEAN.include 'lib/1.*' +CLEAN.include 'lib/2.*' + +# clean all shipped files, that are not in git +CLEAN.include( + gem_spec.files - + `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0").map { |f| File.join("ext/ffi_c/libffi", f) } - + `git ls-files -z`.split("\x0") +) + +task :distclean => :clobber + +desc "Test the extension" +task :test => [ :spec ] + + +namespace :bench do + ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000 + bench_files = Dir["bench/bench_*.rb"].sort.reject { |f| f == "bench/bench_helper.rb" } + bench_files.each do |bench| + task File.basename(bench, ".rb")[6..-1] => :compile do + sh %{#{Gem.ruby} #{bench} #{ITER}} + end + end + task :all => :compile do + bench_files.each do |bench| + sh %{#{Gem.ruby} #{bench}} + end + end +end + +task 'spec:run' => :compile +task 'spec:specdoc' => :compile + +task :default => :spec + +namespace 'java' do + + java_gem_spec = gem_spec.dup.tap do |s| + s.files.reject! { |f| File.fnmatch?("ext/*", f) } + s.extensions = [] + s.platform = 'java' + end + + Gem::PackageTask.new(java_gem_spec) do |pkg| + pkg.need_zip = true + pkg.need_tar = true + pkg.package_dir = 'pkg' + end +end + +task 'gem:java' => 'java:gem' + +FfiGemHelper.install_tasks +# Register windows gems to be pushed to rubygems.org +Bundler::GemHelper.instance.cross_platforms = %w[x86-mingw32 x64-mingw32] + +if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx' + require 'rake/extensiontask' + Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext| + ext.name = 'ffi_c' # indicate the name of the extension. + # ext.lib_dir = BUILD_DIR # put binaries into this folder. + ext.tmp_dir = BUILD_DIR # temporary folder used during compilation. + ext.cross_compile = true # enable cross compilation (requires cross compile toolchain) + ext.cross_platform = Bundler::GemHelper.instance.cross_platforms + ext.cross_compiling do |spec| + spec.files.reject! { |path| File.fnmatch?('ext/*', path) } + end + + end +else + task :compile do + STDERR.puts "Nothing to compile on #{RUBY_ENGINE}" + end +end + + +desc "build a windows gem without all the ceremony" +task "gem:windows" do + require "rake_compiler_dock" + sh "bundle package" + RakeCompilerDock.sh "sudo apt-get update && sudo apt-get install -y libltdl-dev && bundle --local && rake cross native gem MAKE='nice make -j`nproc`' RUBY_CC_VERSION=${RUBY_CC_VERSION/:2.2.2/}" +end + +directory "ext/ffi_c/libffi" +file "ext/ffi_c/libffi/autogen.sh" => "ext/ffi_c/libffi" do + warn "Downloading libffi ..." + sh "git submodule update --init --recursive" +end +task :libffi => "ext/ffi_c/libffi/autogen.sh" + +LIBFFI_GIT_FILES = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0") + +# Generate files which are in the gemspec but not in libffi's git repo by running autogen.sh +gem_spec.files.select do |f| + f =~ /ext\/ffi_c\/libffi\/(.*)/ && !LIBFFI_GIT_FILES.include?($1) +end.each do |f| + file f => "ext/ffi_c/libffi/autogen.sh" do + chdir "ext/ffi_c/libffi" do + sh "sh ./autogen.sh" + end + touch f + if gem_spec.files != Gem::Specification.load('./ffi.gemspec').files + warn "gemspec files have changed -> Please restart rake!" + exit 1 + end + end +end + +# Make sure we have all gemspec files before packaging +task :build => gem_spec.files +task :gem => :build + + +require_relative "lib/ffi/platform" +types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf')) +logfile = File.join(File.dirname(__FILE__), 'types_log') + +task types_conf do |task| + require 'fileutils' + require_relative "lib/ffi/tools/types_generator" + options = {} + FileUtils.mkdir_p(File.dirname(task.name), mode: 0755 ) + File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f| + f.puts FFI::TypesGenerator.generate(options) + end + File.open(logfile, 'w') do |log| + log.puts(types_conf) + end +end + +desc "Create or update type information for platform #{FFI::Platform::NAME}" +task :types_conf => types_conf + +begin + require 'yard' + + namespace :doc do + YARD::Rake::YardocTask.new do |yard| + end + end +rescue LoadError + warn "[warn] YARD unavailable" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/.sitearchdir.time b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/.sitearchdir.time new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/AbstractMemory.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/AbstractMemory.c new file mode 100644 index 000000000000..1a7fcde4d833 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/AbstractMemory.c @@ -0,0 +1,1104 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (C) 2009 Jake Douglas <jake@shiftedlabs.com> + * Copyright (C) 2008 Luc Heinrich <luc@honk-honk.com> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#ifndef _MSC_VER +# include <sys/param.h> +#endif +#include <stdint.h> +#include <stdbool.h> + +#include <limits.h> +#include <ruby.h> + +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "Function.h" +#include "LongDouble.h" + +#ifdef PRIsVALUE +# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj) +# define RB_OBJ_STRING(obj) (obj) +#else +# define PRIsVALUE "s" +# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj) +# define RB_OBJ_STRING(obj) StringValueCStr(obj) +#endif + +static inline char* memory_address(VALUE self); +VALUE rbffi_AbstractMemoryClass = Qnil; +static VALUE NullPointerErrorClass = Qnil; +static ID id_to_ptr = 0, id_plus = 0, id_call = 0; + +static VALUE +memory_allocate(VALUE klass) +{ + AbstractMemory* memory; + VALUE obj; + obj = Data_Make_Struct(klass, AbstractMemory, NULL, -1, memory); + memory->flags = MEM_RD | MEM_WR; + + return obj; +} +#define VAL(x, swap) (unlikely(((memory->flags & MEM_SWAP) != 0)) ? swap((x)) : (x)) + +#define NUM_OP(name, type, toNative, fromNative, swap) \ +static void memory_op_put_##name(AbstractMemory* memory, long off, VALUE value); \ +static void \ +memory_op_put_##name(AbstractMemory* memory, long off, VALUE value) \ +{ \ + type tmp = (type) VAL(toNative(value), swap); \ + checkWrite(memory); \ + checkBounds(memory, off, sizeof(type)); \ + memcpy(memory->address + off, &tmp, sizeof(tmp)); \ +} \ +static VALUE memory_put_##name(VALUE self, VALUE offset, VALUE value); \ +static VALUE \ +memory_put_##name(VALUE self, VALUE offset, VALUE value) \ +{ \ + AbstractMemory* memory; \ + Data_Get_Struct(self, AbstractMemory, memory); \ + memory_op_put_##name(memory, NUM2LONG(offset), value); \ + return self; \ +} \ +static VALUE memory_write_##name(VALUE self, VALUE value); \ +static VALUE \ +memory_write_##name(VALUE self, VALUE value) \ +{ \ + AbstractMemory* memory; \ + Data_Get_Struct(self, AbstractMemory, memory); \ + memory_op_put_##name(memory, 0, value); \ + return self; \ +} \ +static VALUE memory_op_get_##name(AbstractMemory* memory, long off); \ +static VALUE \ +memory_op_get_##name(AbstractMemory* memory, long off) \ +{ \ + type tmp; \ + checkRead(memory); \ + checkBounds(memory, off, sizeof(type)); \ + memcpy(&tmp, memory->address + off, sizeof(tmp)); \ + return fromNative(VAL(tmp, swap)); \ +} \ +static VALUE memory_get_##name(VALUE self, VALUE offset); \ +static VALUE \ +memory_get_##name(VALUE self, VALUE offset) \ +{ \ + AbstractMemory* memory; \ + Data_Get_Struct(self, AbstractMemory, memory); \ + return memory_op_get_##name(memory, NUM2LONG(offset)); \ +} \ +static VALUE memory_read_##name(VALUE self); \ +static VALUE \ +memory_read_##name(VALUE self) \ +{ \ + AbstractMemory* memory; \ + Data_Get_Struct(self, AbstractMemory, memory); \ + return memory_op_get_##name(memory, 0); \ +} \ +static MemoryOp memory_op_##name = { memory_op_get_##name, memory_op_put_##name }; \ +\ +static VALUE memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary); \ +static VALUE \ +memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary) \ +{ \ + long count; \ + long off = NUM2LONG(offset); \ + AbstractMemory* memory = MEMORY(self); \ + long i; \ + Check_Type(ary, T_ARRAY); \ + count = RARRAY_LEN(ary); \ + if (likely(count > 0)) checkWrite(memory); \ + checkBounds(memory, off, count * sizeof(type)); \ + for (i = 0; i < count; i++) { \ + type tmp = (type) VAL(toNative(RARRAY_PTR(ary)[i]), swap); \ + memcpy(memory->address + off + (i * sizeof(type)), &tmp, sizeof(tmp)); \ + } \ + return self; \ +} \ +static VALUE memory_write_array_of_##name(VALUE self, VALUE ary); \ +static VALUE \ +memory_write_array_of_##name(VALUE self, VALUE ary) \ +{ \ + return memory_put_array_of_##name(self, INT2FIX(0), ary); \ +} \ +static VALUE memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length); \ +static VALUE \ +memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \ +{ \ + long count = NUM2LONG(length); \ + long off = NUM2LONG(offset); \ + AbstractMemory* memory = MEMORY(self); \ + VALUE retVal = rb_ary_new2(count); \ + long i; \ + if (likely(count > 0)) checkRead(memory); \ + checkBounds(memory, off, count * sizeof(type)); \ + for (i = 0; i < count; ++i) { \ + type tmp; \ + memcpy(&tmp, memory->address + off + (i * sizeof(type)), sizeof(tmp)); \ + rb_ary_push(retVal, fromNative(VAL(tmp, swap))); \ + } \ + return retVal; \ +} \ +static VALUE memory_read_array_of_##name(VALUE self, VALUE length); \ +static VALUE \ +memory_read_array_of_##name(VALUE self, VALUE length) \ +{ \ + return memory_get_array_of_##name(self, INT2FIX(0), length); \ +} + +#define NOSWAP(x) (x) +#define bswap16(x) (((x) >> 8) & 0xff) | (((x) << 8) & 0xff00); +static inline int16_t +SWAPS16(int16_t x) +{ + return bswap16(x); +} + +static inline uint16_t +SWAPU16(uint16_t x) +{ + return bswap16(x); +} + +#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) +#define bswap32(x) \ + (((x << 24) & 0xff000000) | \ + ((x << 8) & 0x00ff0000) | \ + ((x >> 8) & 0x0000ff00) | \ + ((x >> 24) & 0x000000ff)) + +#define bswap64(x) \ + (((x << 56) & 0xff00000000000000ULL) | \ + ((x << 40) & 0x00ff000000000000ULL) | \ + ((x << 24) & 0x0000ff0000000000ULL) | \ + ((x << 8) & 0x000000ff00000000ULL) | \ + ((x >> 8) & 0x00000000ff000000ULL) | \ + ((x >> 24) & 0x0000000000ff0000ULL) | \ + ((x >> 40) & 0x000000000000ff00ULL) | \ + ((x >> 56) & 0x00000000000000ffULL)) + +static inline int32_t +SWAPS32(int32_t x) +{ + return bswap32(x); +} + +static inline uint32_t +SWAPU32(uint32_t x) +{ + return bswap32(x); +} + +static inline int64_t +SWAPS64(int64_t x) +{ + return bswap64(x); +} + +static inline uint64_t +SWAPU64(uint64_t x) +{ + return bswap64(x); +} + +#else +# define SWAPS32(x) ((int32_t) __builtin_bswap32(x)) +# define SWAPU32(x) ((uint32_t) __builtin_bswap32(x)) +# define SWAPS64(x) ((int64_t) __builtin_bswap64(x)) +# define SWAPU64(x) ((uint64_t) __builtin_bswap64(x)) +#endif + +#if LONG_MAX > INT_MAX +# define SWAPSLONG SWAPS64 +# define SWAPULONG SWAPU64 +#else +# define SWAPSLONG SWAPS32 +# define SWAPULONG SWAPU32 +#endif + +NUM_OP(int8, int8_t, NUM2INT, INT2NUM, NOSWAP); +NUM_OP(uint8, uint8_t, NUM2UINT, UINT2NUM, NOSWAP); +NUM_OP(int16, int16_t, NUM2INT, INT2NUM, SWAPS16); +NUM_OP(uint16, uint16_t, NUM2UINT, UINT2NUM, SWAPU16); +NUM_OP(int32, int32_t, NUM2INT, INT2NUM, SWAPS32); +NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM, SWAPU32); +NUM_OP(int64, int64_t, NUM2LL, LL2NUM, SWAPS64); +NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM, SWAPU64); +NUM_OP(long, long, NUM2LONG, LONG2NUM, SWAPSLONG); +NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM, SWAPULONG); +NUM_OP(float32, float, NUM2DBL, rb_float_new, NOSWAP); +NUM_OP(float64, double, NUM2DBL, rb_float_new, NOSWAP); +NUM_OP(longdouble, long double, rbffi_num2longdouble, rbffi_longdouble_new, NOSWAP); + +static inline void* +get_pointer_value(VALUE value) +{ + const int type = TYPE(value); + if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_PointerClass)) { + return memory_address(value); + } else if (type == T_NIL) { + return NULL; + } else if (type == T_FIXNUM) { + return (void *) (uintptr_t) FIX2ULONG(value); + } else if (type == T_BIGNUM) { + return (void *) (uintptr_t) NUM2ULL(value); + } else if (rb_respond_to(value, id_to_ptr)) { + return MEMORY_PTR(rb_funcall2(value, id_to_ptr, 0, NULL)); + } else { + rb_raise(rb_eArgError, "value is not a pointer"); + return NULL; + } +} + +NUM_OP(pointer, void *, get_pointer_value, rbffi_Pointer_NewInstance, NOSWAP); + +static inline uint8_t +rbffi_bool_value(VALUE value) +{ + return RTEST(value); +} + +static inline VALUE +rbffi_bool_new(uint8_t value) +{ + return (value & 1) != 0 ? Qtrue : Qfalse; +} + +NUM_OP(bool, unsigned char, rbffi_bool_value, rbffi_bool_new, NOSWAP); + + +/* + * call-seq: memory.clear + * Set the memory to all-zero. + * @return [self] + */ +static VALUE +memory_clear(VALUE self) +{ + AbstractMemory* ptr = MEMORY(self); + memset(ptr->address, 0, ptr->size); + return self; +} + +/* + * call-seq: memory.size + * Return memory size in bytes (alias: #total) + * @return [Numeric] + */ +static VALUE +memory_size(VALUE self) +{ + AbstractMemory* ptr; + + Data_Get_Struct(self, AbstractMemory, ptr); + + return LONG2NUM(ptr->size); +} + +/* + * call-seq: memory.get(type, offset) + * Return data of given type contained in memory. + * @param [Symbol, Type] type_name type of data to get + * @param [Numeric] offset point in buffer to start from + * @return [Object] + * @raise {ArgumentError} if type is not supported + */ +static VALUE +memory_get(VALUE self, VALUE type_name, VALUE offset) +{ + AbstractMemory* ptr; + VALUE nType; + Type *type; + + nType = rbffi_Type_Lookup(type_name); + if(NIL_P(nType)) goto undefined_type; + + Data_Get_Struct(self, AbstractMemory, ptr); + Data_Get_Struct(nType, Type, type); + + MemoryOp *op = get_memory_op(type); + if(op == NULL) goto undefined_type; + + return op->get(ptr, NUM2LONG(offset)); + +undefined_type: { + VALUE msg = rb_sprintf("undefined type '%" PRIsVALUE "'", type_name); + rb_exc_raise(rb_exc_new3(rb_eArgError, msg)); + return Qnil; + } +} + +/* + * call-seq: memory.put(type, offset, value) + * @param [Symbol, Type] type_name type of data to put + * @param [Numeric] offset point in buffer to start from + * @return [nil] + * @raise {ArgumentError} if type is not supported + */ +static VALUE +memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value) +{ + AbstractMemory* ptr; + VALUE nType; + Type *type; + + nType = rbffi_Type_Lookup(type_name); + if(NIL_P(nType)) goto undefined_type; + + Data_Get_Struct(self, AbstractMemory, ptr); + Data_Get_Struct(nType, Type, type); + + MemoryOp *op = get_memory_op(type); + if(op == NULL) goto undefined_type; + + op->put(ptr, NUM2LONG(offset), value); + return Qnil; + +undefined_type: { + VALUE msg = rb_sprintf("unsupported type '%" PRIsVALUE "'", type_name); + rb_exc_raise(rb_exc_new3(rb_eArgError, msg)); + return Qnil; + } +} + +/* + * call-seq: memory.get_string(offset, length=nil) + * Return string contained in memory. + * @param [Numeric] offset point in buffer to start from + * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). + * @return [String] + * @raise {IndexError} if +length+ is too great + * @raise {NullPointerError} if memory not initialized + */ +static VALUE +memory_get_string(int argc, VALUE* argv, VALUE self) +{ + VALUE length = Qnil, offset = Qnil; + AbstractMemory* ptr = MEMORY(self); + long off, len; + char* end; + int nargs = rb_scan_args(argc, argv, "11", &offset, &length); + + off = NUM2LONG(offset); + len = nargs > 1 && length != Qnil ? NUM2LONG(length) : (ptr->size - off); + checkRead(ptr); + checkBounds(ptr, off, len); + + end = memchr(ptr->address + off, 0, len); + return rb_str_new((char *) ptr->address + off, + (end != NULL ? end - ptr->address - off : len)); +} + +/* + * call-seq: memory.get_array_of_string(offset, count=nil) + * Return an array of strings contained in memory. + * @param [Numeric] offset point in memory to start from + * @param [Numeric] count number of strings to get. If nil, return all strings + * @return [Array<String>] + * @raise {IndexError} if +offset+ is too great + * @raise {NullPointerError} if memory not initialized + */ +static VALUE +memory_get_array_of_string(int argc, VALUE* argv, VALUE self) +{ + VALUE offset = Qnil, countnum = Qnil, retVal = Qnil; + AbstractMemory* ptr; + long off; + int count; + + rb_scan_args(argc, argv, "11", &offset, &countnum); + off = NUM2LONG(offset); + count = (countnum == Qnil ? 0 : NUM2INT(countnum)); + retVal = rb_ary_new2(count); + + Data_Get_Struct(self, AbstractMemory, ptr); + checkRead(ptr); + + if (countnum != Qnil) { + int i; + + checkBounds(ptr, off, count * sizeof (char*)); + + for (i = 0; i < count; ++i) { + const char* strptr = *((const char**) (ptr->address + off) + i); + rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_str_new2(strptr))); + } + + } else { + checkBounds(ptr, off, sizeof (char*)); + for ( ; off < ptr->size - (long) sizeof (void *); off += (long) sizeof (void *)) { + const char* strptr = *(const char**) (ptr->address + off); + if (strptr == NULL) { + break; + } + rb_ary_push(retVal, rb_str_new2(strptr)); + } + } + + return retVal; +} + +/* + * call-seq: memory.read_array_of_string(count=nil) + * Return an array of strings contained in memory. Same as: + * memory.get_array_of_string(0, count) + * @param [Numeric] count number of strings to get. If nil, return all strings + * @return [Array<String>] + */ +static VALUE +memory_read_array_of_string(int argc, VALUE* argv, VALUE self) +{ + VALUE* rargv = ALLOCA_N(VALUE, argc + 1); + int i; + + rargv[0] = INT2FIX(0); + for (i = 0; i < argc; i++) { + rargv[i + 1] = argv[i]; + } + + return memory_get_array_of_string(argc + 1, rargv, self); +} + + +/* + * call-seq: memory.put_string(offset, str) + * @param [Numeric] offset + * @param [String] str + * @return [self] + * @raise {SecurityError} when writing unsafe string to memory + * @raise {IndexError} if +offset+ is too great + * @raise {NullPointerError} if memory not initialized + * Put a string in memory. + */ +static VALUE +memory_put_string(VALUE self, VALUE offset, VALUE str) +{ + AbstractMemory* ptr = MEMORY(self); + long off, len; + + Check_Type(str, T_STRING); + off = NUM2LONG(offset); + len = RSTRING_LEN(str); + + checkWrite(ptr); + checkBounds(ptr, off, len + 1); + + memcpy(ptr->address + off, RSTRING_PTR(str), len); + *((char *) ptr->address + off + len) = '\0'; + + return self; +} + +/* + * call-seq: memory.get_bytes(offset, length) + * Return string contained in memory. + * @param [Numeric] offset point in buffer to start from + * @param [Numeric] length string's length in bytes. + * @return [String] + * @raise {IndexError} if +length+ is too great + * @raise {NullPointerError} if memory not initialized + */ +static VALUE +memory_get_bytes(VALUE self, VALUE offset, VALUE length) +{ + AbstractMemory* ptr = MEMORY(self); + long off, len; + + off = NUM2LONG(offset); + len = NUM2LONG(length); + + checkRead(ptr); + checkBounds(ptr, off, len); + + return rb_str_new((char *) ptr->address + off, len); +} + +/* + * call-seq: memory.put_bytes(offset, str, index=0, length=nil) + * Put a string in memory. + * @param [Numeric] offset point in buffer to start from + * @param [String] str string to put to memory + * @param [Numeric] index + * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). + * @return [self] + * @raise {IndexError} if +length+ is too great + * @raise {NullPointerError} if memory not initialized + * @raise {RangeError} if +index+ is negative, or if index+length is greater than size of string + * @raise {SecurityError} when writing unsafe string to memory + */ +static VALUE +memory_put_bytes(int argc, VALUE* argv, VALUE self) +{ + AbstractMemory* ptr = MEMORY(self); + VALUE offset = Qnil, str = Qnil, rbIndex = Qnil, rbLength = Qnil; + long off, len, idx; + int nargs = rb_scan_args(argc, argv, "22", &offset, &str, &rbIndex, &rbLength); + + Check_Type(str, T_STRING); + + off = NUM2LONG(offset); + idx = nargs > 2 ? NUM2LONG(rbIndex) : 0; + if (idx < 0) { + rb_raise(rb_eRangeError, "index cannot be less than zero"); + return Qnil; + } + len = nargs > 3 ? NUM2LONG(rbLength) : (RSTRING_LEN(str) - idx); + if ((idx + len) > RSTRING_LEN(str)) { + rb_raise(rb_eRangeError, "index+length is greater than size of string"); + return Qnil; + } + + checkWrite(ptr); + checkBounds(ptr, off, len); + + memcpy(ptr->address + off, RSTRING_PTR(str) + idx, len); + + return self; +} + +/* + * call-seq: memory.read_bytes(length) + * @param [Numeric] length of string to return + * @return [String] + * equivalent to : + * memory.get_bytes(0, length) + */ +static VALUE +memory_read_bytes(VALUE self, VALUE length) +{ + return memory_get_bytes(self, INT2FIX(0), length); +} + +/* + * call-seq: memory.write_bytes(str, index=0, length=nil) + * @param [String] str string to put to memory + * @param [Numeric] index + * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned). + * @return [self] + * equivalent to : + * memory.put_bytes(0, str, index, length) + */ +static VALUE +memory_write_bytes(int argc, VALUE* argv, VALUE self) +{ + VALUE* wargv = ALLOCA_N(VALUE, argc + 1); + int i; + + wargv[0] = INT2FIX(0); + for (i = 0; i < argc; i++) { + wargv[i + 1] = argv[i]; + } + + return memory_put_bytes(argc + 1, wargv, self); +} + +/* + * call-seq: memory.type_size + * @return [Numeric] type size in bytes + * Get the memory's type size. + */ +static VALUE +memory_type_size(VALUE self) +{ + AbstractMemory* ptr; + + Data_Get_Struct(self, AbstractMemory, ptr); + + return INT2NUM(ptr->typeSize); +} + +/* + * Document-method: [] + * call-seq: memory[idx] + * @param [Numeric] idx index to access in memory + * @return + * Memory read accessor. + */ +static VALUE +memory_aref(VALUE self, VALUE idx) +{ + AbstractMemory* ptr; + VALUE rbOffset = Qnil; + + Data_Get_Struct(self, AbstractMemory, ptr); + + rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize); + + return rb_funcall2(self, id_plus, 1, &rbOffset); +} + +static inline char* +memory_address(VALUE obj) +{ + return ((AbstractMemory *) DATA_PTR(obj))->address; +} + +static VALUE +memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen) +{ + AbstractMemory* dst; + + Data_Get_Struct(self, AbstractMemory, dst); + + memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, rbffi_AbstractMemoryClass)->address, NUM2INT(rblen)); + + return self; +} + +AbstractMemory* +rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass) +{ + if (rb_obj_is_kind_of(obj, klass)) { + AbstractMemory* memory; + Data_Get_Struct(obj, AbstractMemory, memory); + return memory; + } + + rb_raise(rb_eArgError, "Invalid Memory object"); + return NULL; +} + +void +rbffi_AbstractMemory_Error(AbstractMemory *mem, int op) +{ + VALUE rbErrorClass = mem->address == NULL ? NullPointerErrorClass : rb_eRuntimeError; + if (op == MEM_RD) { + rb_raise(rbErrorClass, "invalid memory read at address=%p", mem->address); + } else if (op == MEM_WR) { + rb_raise(rbErrorClass, "invalid memory write at address=%p", mem->address); + } else { + rb_raise(rbErrorClass, "invalid memory access at address=%p", mem->address); + } +} + +static VALUE +memory_op_get_strptr(AbstractMemory* ptr, long offset) +{ + void* tmp = NULL; + + if (ptr != NULL && ptr->address != NULL) { + checkRead(ptr); + checkBounds(ptr, offset, sizeof(tmp)); + memcpy(&tmp, ptr->address + offset, sizeof(tmp)); + } + + return tmp != NULL ? rb_str_new2(tmp) : Qnil; +} + +static void +memory_op_put_strptr(AbstractMemory* ptr, long offset, VALUE value) +{ + rb_raise(rb_eArgError, "Cannot set :string fields"); +} + +static MemoryOp memory_op_strptr = { memory_op_get_strptr, memory_op_put_strptr }; + + +MemoryOps rbffi_AbstractMemoryOps = { + &memory_op_int8, /*.int8 */ + &memory_op_uint8, /* .uint8 */ + &memory_op_int16, /* .int16 */ + &memory_op_uint16, /* .uint16 */ + &memory_op_int32, /* .int32 */ + &memory_op_uint32, /* .uint32 */ + &memory_op_int64, /* .int64 */ + &memory_op_uint64, /* .uint64 */ + &memory_op_long, /* .slong */ + &memory_op_ulong, /* .uslong */ + &memory_op_float32, /* .float32 */ + &memory_op_float64, /* .float64 */ + &memory_op_longdouble, /* .longdouble */ + &memory_op_pointer, /* .pointer */ + &memory_op_strptr, /* .strptr */ + &memory_op_bool /* .boolOp */ +}; + +void +rbffi_AbstractMemory_Init(VALUE moduleFFI) +{ + /* + * Document-class: FFI::AbstractMemory + * + * {AbstractMemory} is the base class for many memory management classes such as {Buffer}. + * + * This class has a lot of methods to work with integers : + * * put_int<i>size</i>(offset, value) + * * get_int<i>size</i>(offset) + * * put_uint<i>size</i>(offset, value) + * * get_uint<i>size</i>(offset) + * * writeuint<i>size</i>(value) + * * read_int<i>size</i> + * * write_uint<i>size</i>(value) + * * read_uint<i>size</i> + * * put_array_of_int<i>size</i>(offset, ary) + * * get_array_of_int<i>size</i>(offset, length) + * * put_array_of_uint<i>size</i>(offset, ary) + * * get_array_of_uint<i>size</i>(offset, length) + * * write_array_of_int<i>size</i>(ary) + * * read_array_of_int<i>size</i>(length) + * * write_array_of_uint<i>size</i>(ary) + * * read_array_of_uint<i>size</i>(length) + * where _size_ is 8, 16, 32 or 64. Same methods exist for long type. + * + * Aliases exist : _char_ for _int8_, _short_ for _int16_, _int_ for _int32_ and <i>long_long</i> for _int64_. + * + * Others methods are listed below. + */ + VALUE classMemory = rb_define_class_under(moduleFFI, "AbstractMemory", rb_cObject); + rbffi_AbstractMemoryClass = classMemory; + /* + * Document-variable: FFI::AbstractMemory + */ + rb_global_variable(&rbffi_AbstractMemoryClass); + rb_define_alloc_func(classMemory, memory_allocate); + + NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError); + /* Document-variable: NullPointerError */ + rb_global_variable(&NullPointerErrorClass); + + +#undef INT +#define INT(type) \ + rb_define_method(classMemory, "put_" #type, memory_put_##type, 2); \ + rb_define_method(classMemory, "get_" #type, memory_get_##type, 1); \ + rb_define_method(classMemory, "put_u" #type, memory_put_u##type, 2); \ + rb_define_method(classMemory, "get_u" #type, memory_get_u##type, 1); \ + rb_define_method(classMemory, "write_" #type, memory_write_##type, 1); \ + rb_define_method(classMemory, "read_" #type, memory_read_##type, 0); \ + rb_define_method(classMemory, "write_u" #type, memory_write_u##type, 1); \ + rb_define_method(classMemory, "read_u" #type, memory_read_u##type, 0); \ + rb_define_method(classMemory, "put_array_of_" #type, memory_put_array_of_##type, 2); \ + rb_define_method(classMemory, "get_array_of_" #type, memory_get_array_of_##type, 2); \ + rb_define_method(classMemory, "put_array_of_u" #type, memory_put_array_of_u##type, 2); \ + rb_define_method(classMemory, "get_array_of_u" #type, memory_get_array_of_u##type, 2); \ + rb_define_method(classMemory, "write_array_of_" #type, memory_write_array_of_##type, 1); \ + rb_define_method(classMemory, "read_array_of_" #type, memory_read_array_of_##type, 1); \ + rb_define_method(classMemory, "write_array_of_u" #type, memory_write_array_of_u##type, 1); \ + rb_define_method(classMemory, "read_array_of_u" #type, memory_read_array_of_u##type, 1); + + INT(int8); + INT(int16); + INT(int32); + INT(int64); + INT(long); + +#define ALIAS(name, old) \ + rb_define_alias(classMemory, "put_" #name, "put_" #old); \ + rb_define_alias(classMemory, "get_" #name, "get_" #old); \ + rb_define_alias(classMemory, "put_u" #name, "put_u" #old); \ + rb_define_alias(classMemory, "get_u" #name, "get_u" #old); \ + rb_define_alias(classMemory, "write_" #name, "write_" #old); \ + rb_define_alias(classMemory, "read_" #name, "read_" #old); \ + rb_define_alias(classMemory, "write_u" #name, "write_u" #old); \ + rb_define_alias(classMemory, "read_u" #name, "read_u" #old); \ + rb_define_alias(classMemory, "put_array_of_" #name, "put_array_of_" #old); \ + rb_define_alias(classMemory, "get_array_of_" #name, "get_array_of_" #old); \ + rb_define_alias(classMemory, "put_array_of_u" #name, "put_array_of_u" #old); \ + rb_define_alias(classMemory, "get_array_of_u" #name, "get_array_of_u" #old); \ + rb_define_alias(classMemory, "write_array_of_" #name, "write_array_of_" #old); \ + rb_define_alias(classMemory, "read_array_of_" #name, "read_array_of_" #old); \ + rb_define_alias(classMemory, "write_array_of_u" #name, "write_array_of_u" #old); \ + rb_define_alias(classMemory, "read_array_of_u" #name, "read_array_of_u" #old); + + ALIAS(char, int8); + ALIAS(short, int16); + ALIAS(int, int32); + ALIAS(long_long, int64); + + /* + * Document-method: put_float32 + * call-seq: memory.put_float32offset, value) + * @param [Numeric] offset + * @param [Numeric] value + * @return [self] + * Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float). + */ + rb_define_method(classMemory, "put_float32", memory_put_float32, 2); + /* + * Document-method: get_float32 + * call-seq: memory.get_float32(offset) + * @param [Numeric] offset + * @return [Float] + * Get a 32-bit float from memory at offset +offset+ (alias: #get_float). + */ + rb_define_method(classMemory, "get_float32", memory_get_float32, 1); + rb_define_alias(classMemory, "put_float", "put_float32"); + rb_define_alias(classMemory, "get_float", "get_float32"); + /* + * Document-method: write_float + * call-seq: memory.write_float(value) + * @param [Numeric] value + * @return [self] + * Write +value+ as a 32-bit float in memory. + * + * Same as: + * memory.put_float(0, value) + */ + rb_define_method(classMemory, "write_float", memory_write_float32, 1); + /* + * Document-method: read_float + * call-seq: memory.read_float + * @return [Float] + * Read a 32-bit float from memory. + * + * Same as: + * memory.get_float(0) + */ + rb_define_method(classMemory, "read_float", memory_read_float32, 0); + /* + * Document-method: put_array_of_float32 + * call-seq: memory.put_array_of_float32(offset, ary) + * @param [Numeric] offset + * @param [Array<Numeric>] ary + * @return [self] + * Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float). + */ + rb_define_method(classMemory, "put_array_of_float32", memory_put_array_of_float32, 2); + /* + * Document-method: get_array_of_float32 + * call-seq: memory.get_array_of_float32(offset, length) + * @param [Numeric] offset + * @param [Numeric] length number of Float to get + * @return [Array<Float>] + * Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float). + */ + rb_define_method(classMemory, "get_array_of_float32", memory_get_array_of_float32, 2); + /* + * Document-method: write_array_of_float + * call-seq: memory.write_array_of_float(ary) + * @param [Array<Numeric>] ary + * @return [self] + * Write values from +ary+ as 32-bit floats in memory. + * + * Same as: + * memory.put_array_of_float(0, ary) + */ + rb_define_method(classMemory, "write_array_of_float", memory_write_array_of_float32, 1); + /* + * Document-method: read_array_of_float + * call-seq: memory.read_array_of_float(length) + * @param [Numeric] length number of Float to read + * @return [Array<Float>] + * Read 32-bit floats from memory. + * + * Same as: + * memory.get_array_of_float(0, ary) + */ + rb_define_method(classMemory, "read_array_of_float", memory_read_array_of_float32, 1); + rb_define_alias(classMemory, "put_array_of_float", "put_array_of_float32"); + rb_define_alias(classMemory, "get_array_of_float", "get_array_of_float32"); + /* + * Document-method: put_float64 + * call-seq: memory.put_float64(offset, value) + * @param [Numeric] offset + * @param [Numeric] value + * @return [self] + * Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double). + */ + rb_define_method(classMemory, "put_float64", memory_put_float64, 2); + /* + * Document-method: get_float64 + * call-seq: memory.get_float64(offset) + * @param [Numeric] offset + * @return [Float] + * Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double). + */ + rb_define_method(classMemory, "get_float64", memory_get_float64, 1); + rb_define_alias(classMemory, "put_double", "put_float64"); + rb_define_alias(classMemory, "get_double", "get_float64"); + /* + * Document-method: write_double + * call-seq: memory.write_double(value) + * @param [Numeric] value + * @return [self] + * Write +value+ as a 64-bit float (double) in memory. + * + * Same as: + * memory.put_double(0, value) + */ + rb_define_method(classMemory, "write_double", memory_write_float64, 1); + /* + * Document-method: read_double + * call-seq: memory.read_double + * @return [Float] + * Read a 64-bit float (double) from memory. + * + * Same as: + * memory.get_double(0) + */ + rb_define_method(classMemory, "read_double", memory_read_float64, 0); + /* + * Document-method: put_array_of_float64 + * call-seq: memory.put_array_of_float64(offset, ary) + * @param [Numeric] offset + * @param [Array<Numeric>] ary + * @return [self] + * Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double). + */ + rb_define_method(classMemory, "put_array_of_float64", memory_put_array_of_float64, 2); + /* + * Document-method: get_array_of_float64 + * call-seq: memory.get_array_of_float64(offset, length) + * @param [Numeric] offset + * @param [Numeric] length number of Float to get + * @return [Array<Float>] + * Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double). + */ + rb_define_method(classMemory, "get_array_of_float64", memory_get_array_of_float64, 2); + /* + * Document-method: write_array_of_double + * call-seq: memory.write_array_of_double(ary) + * @param [Array<Numeric>] ary + * @return [self] + * Write values from +ary+ as 64-bit floats (doubles) in memory. + * + * Same as: + * memory.put_array_of_double(0, ary) + */ + rb_define_method(classMemory, "write_array_of_double", memory_write_array_of_float64, 1); + /* + * Document-method: read_array_of_double + * call-seq: memory.read_array_of_double(length) + * @param [Numeric] length number of Float to read + * @return [Array<Float>] + * Read 64-bit floats (doubles) from memory. + * + * Same as: + * memory.get_array_of_double(0, ary) + */ + rb_define_method(classMemory, "read_array_of_double", memory_read_array_of_float64, 1); + rb_define_alias(classMemory, "put_array_of_double", "put_array_of_float64"); + rb_define_alias(classMemory, "get_array_of_double", "get_array_of_float64"); + /* + * Document-method: put_pointer + * call-seq: memory.put_pointer(offset, value) + * @param [Numeric] offset + * @param [nil,Pointer, Integer, #to_ptr] value + * @return [self] + * Put +value+ in memory from +offset+.. + */ + rb_define_method(classMemory, "put_pointer", memory_put_pointer, 2); + /* + * Document-method: get_pointer + * call-seq: memory.get_pointer(offset) + * @param [Numeric] offset + * @return [Pointer] + * Get a {Pointer} to the memory from +offset+. + */ + rb_define_method(classMemory, "get_pointer", memory_get_pointer, 1); + /* + * Document-method: write_pointer + * call-seq: memory.write_pointer(value) + * @param [nil,Pointer, Integer, #to_ptr] value + * @return [self] + * Write +value+ in memory. + * + * Equivalent to: + * memory.put_pointer(0, value) + */ + rb_define_method(classMemory, "write_pointer", memory_write_pointer, 1); + /* + * Document-method: read_pointer + * call-seq: memory.read_pointer + * @return [Pointer] + * Get a {Pointer} to the memory from base address. + * + * Equivalent to: + * memory.get_pointer(0) + */ + rb_define_method(classMemory, "read_pointer", memory_read_pointer, 0); + /* + * Document-method: put_array_of_pointer + * call-seq: memory.put_array_of_pointer(offset, ary) + * @param [Numeric] offset + * @param [Array<#to_ptr>] ary + * @return [self] + * Put an array of {Pointer} into memory from +offset+. + */ + rb_define_method(classMemory, "put_array_of_pointer", memory_put_array_of_pointer, 2); + /* + * Document-method: get_array_of_pointer + * call-seq: memory.get_array_of_pointer(offset, length) + * @param [Numeric] offset + * @param [Numeric] length + * @return [Array<Pointer>] + * Get an array of {Pointer} of length +length+ from +offset+. + */ + rb_define_method(classMemory, "get_array_of_pointer", memory_get_array_of_pointer, 2); + /* + * Document-method: write_array_of_pointer + * call-seq: memory.write_array_of_pointer(ary) + * @param [Array<#to_ptr>] ary + * @return [self] + * Write an array of {Pointer} into memory from +offset+. + * + * Same as : + * memory.put_array_of_pointer(0, ary) + */ + rb_define_method(classMemory, "write_array_of_pointer", memory_write_array_of_pointer, 1); + /* + * Document-method: read_array_of_pointer + * call-seq: memory.read_array_of_pointer(length) + * @param [Numeric] length + * @return [Array<Pointer>] + * Read an array of {Pointer} of length +length+. + * + * Same as: + * memory.get_array_of_pointer(0, length) + */ + rb_define_method(classMemory, "read_array_of_pointer", memory_read_array_of_pointer, 1); + + rb_define_method(classMemory, "get_string", memory_get_string, -1); + rb_define_method(classMemory, "put_string", memory_put_string, 2); + rb_define_method(classMemory, "get_bytes", memory_get_bytes, 2); + rb_define_method(classMemory, "put_bytes", memory_put_bytes, -1); + rb_define_method(classMemory, "read_bytes", memory_read_bytes, 1); + rb_define_method(classMemory, "write_bytes", memory_write_bytes, -1); + rb_define_method(classMemory, "get_array_of_string", memory_get_array_of_string, -1); + + rb_define_method(classMemory, "get", memory_get, 2); + rb_define_method(classMemory, "put", memory_put, 3); + + rb_define_method(classMemory, "clear", memory_clear, 0); + rb_define_method(classMemory, "total", memory_size, 0); + rb_define_alias(classMemory, "size", "total"); + rb_define_method(classMemory, "type_size", memory_type_size, 0); + rb_define_method(classMemory, "[]", memory_aref, 1); + rb_define_method(classMemory, "__copy_from__", memory_copy_from, 2); + + id_to_ptr = rb_intern("to_ptr"); + id_call = rb_intern("call"); + id_plus = rb_intern("+"); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/AbstractMemory.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/AbstractMemory.h new file mode 100644 index 000000000000..11192885ac5a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/AbstractMemory.h @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_ABSTRACTMEMORY_H +#define RBFFI_ABSTRACTMEMORY_H + +#ifndef _MSC_VER +#include <sys/param.h> +#endif +#include <sys/types.h> +#ifndef _MSC_VER +#include <stdint.h> +#endif + +#include "compat.h" +#include "Types.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#define MEM_RD 0x01 +#define MEM_WR 0x02 +#define MEM_CODE 0x04 +#define MEM_SWAP 0x08 +#define MEM_EMBED 0x10 + +typedef struct AbstractMemory_ AbstractMemory; + +typedef struct { + VALUE (*get)(AbstractMemory* ptr, long offset); + void (*put)(AbstractMemory* ptr, long offset, VALUE value); +} MemoryOp; + +typedef struct { + MemoryOp* int8; + MemoryOp* uint8; + MemoryOp* int16; + MemoryOp* uint16; + MemoryOp* int32; + MemoryOp* uint32; + MemoryOp* int64; + MemoryOp* uint64; + MemoryOp* slong; + MemoryOp* uslong; + MemoryOp* float32; + MemoryOp* float64; + MemoryOp* longdouble; + MemoryOp* pointer; + MemoryOp* strptr; + MemoryOp* boolOp; +} MemoryOps; + +struct AbstractMemory_ { + char* address; /* Use char* instead of void* to ensure adding to it works correctly */ + long size; + int flags; + int typeSize; +}; + + +extern VALUE rbffi_AbstractMemoryClass; +extern MemoryOps rbffi_AbstractMemoryOps; + +extern void rbffi_AbstractMemory_Init(VALUE ffiModule); + +extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass); + +extern void rbffi_AbstractMemory_Error(AbstractMemory *, int op); + +static inline void +checkBounds(AbstractMemory* mem, long off, long len) +{ + if (unlikely((off | len | (off + len) | (mem->size - (off + len))) < 0)) { + rb_raise(rb_eIndexError, "Memory access offset=%ld size=%ld is out of bounds", + off, len); + } +} + +static inline void +checkRead(AbstractMemory* mem) +{ + if (unlikely((mem->flags & MEM_RD) == 0)) { + rbffi_AbstractMemory_Error(mem, MEM_RD); + } +} + +static inline void +checkWrite(AbstractMemory* mem) +{ + if (unlikely((mem->flags & MEM_WR) == 0)) { + rbffi_AbstractMemory_Error(mem, MEM_WR); + } +} + +static inline MemoryOp* +get_memory_op(Type* type) +{ + switch (type->nativeType) { + case NATIVE_INT8: + return rbffi_AbstractMemoryOps.int8; + case NATIVE_UINT8: + return rbffi_AbstractMemoryOps.uint8; + case NATIVE_INT16: + return rbffi_AbstractMemoryOps.int16; + case NATIVE_UINT16: + return rbffi_AbstractMemoryOps.uint16; + case NATIVE_INT32: + return rbffi_AbstractMemoryOps.int32; + case NATIVE_UINT32: + return rbffi_AbstractMemoryOps.uint32; + case NATIVE_INT64: + return rbffi_AbstractMemoryOps.int64; + case NATIVE_UINT64: + return rbffi_AbstractMemoryOps.uint64; + case NATIVE_LONG: + return rbffi_AbstractMemoryOps.slong; + case NATIVE_ULONG: + return rbffi_AbstractMemoryOps.uslong; + case NATIVE_FLOAT32: + return rbffi_AbstractMemoryOps.float32; + case NATIVE_FLOAT64: + return rbffi_AbstractMemoryOps.float64; + case NATIVE_LONGDOUBLE: + return rbffi_AbstractMemoryOps.longdouble; + case NATIVE_POINTER: + return rbffi_AbstractMemoryOps.pointer; + case NATIVE_STRING: + return rbffi_AbstractMemoryOps.strptr; + case NATIVE_BOOL: + return rbffi_AbstractMemoryOps.boolOp; + default: + return NULL; + } +} + +#define MEMORY(obj) rbffi_AbstractMemory_Cast((obj), rbffi_AbstractMemoryClass) +#define MEMORY_PTR(obj) MEMORY((obj))->address +#define MEMORY_LEN(obj) MEMORY((obj))->size + + + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_ABSTRACTMEMORY_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/AbstractMemory.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/AbstractMemory.o new file mode 100644 index 000000000000..99a296df461b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/AbstractMemory.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ArrayType.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ArrayType.c new file mode 100644 index 000000000000..bfd666a7e677 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ArrayType.c @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <ruby.h> +#include <ffi.h> +#include "ArrayType.h" + +static VALUE array_type_s_allocate(VALUE klass); +static VALUE array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength); +static void array_type_mark(ArrayType *); +static void array_type_free(ArrayType *); + +VALUE rbffi_ArrayTypeClass = Qnil; + +static VALUE +array_type_s_allocate(VALUE klass) +{ + ArrayType* array; + VALUE obj; + + obj = Data_Make_Struct(klass, ArrayType, array_type_mark, array_type_free, array); + + array->base.nativeType = NATIVE_ARRAY; + array->base.ffiType = xcalloc(1, sizeof(*array->base.ffiType)); + array->base.ffiType->type = FFI_TYPE_STRUCT; + array->base.ffiType->size = 0; + array->base.ffiType->alignment = 0; + array->rbComponentType = Qnil; + + return obj; +} + +static void +array_type_mark(ArrayType *array) +{ + rb_gc_mark(array->rbComponentType); +} + +static void +array_type_free(ArrayType *array) +{ + xfree(array->base.ffiType); + xfree(array->ffiTypes); + xfree(array); +} + + +/* + * call-seq: initialize(component_type, length) + * @param [Type] component_type + * @param [Numeric] length + * @return [self] + * A new instance of ArrayType. + */ +static VALUE +array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength) +{ + ArrayType* array; + int i; + + Data_Get_Struct(self, ArrayType, array); + + array->length = NUM2UINT(rbLength); + array->rbComponentType = rbComponentType; + Data_Get_Struct(rbComponentType, Type, array->componentType); + + array->ffiTypes = xcalloc(array->length + 1, sizeof(*array->ffiTypes)); + array->base.ffiType->elements = array->ffiTypes; + array->base.ffiType->size = array->componentType->ffiType->size * array->length; + array->base.ffiType->alignment = array->componentType->ffiType->alignment; + + for (i = 0; i < array->length; ++i) { + array->ffiTypes[i] = array->componentType->ffiType; + } + + return self; +} + +/* + * call-seq: length + * @return [Numeric] + * Get array's length + */ +static VALUE +array_type_length(VALUE self) +{ + ArrayType* array; + + Data_Get_Struct(self, ArrayType, array); + + return UINT2NUM(array->length); +} + +/* + * call-seq: element_type + * @return [Type] + * Get element type. + */ +static VALUE +array_type_element_type(VALUE self) +{ + ArrayType* array; + + Data_Get_Struct(self, ArrayType, array); + + return array->rbComponentType; +} + +void +rbffi_ArrayType_Init(VALUE moduleFFI) +{ + VALUE ffi_Type; + + ffi_Type = rbffi_TypeClass; + + /* + * Document-class: FFI::ArrayType < FFI::Type + * + * This is a typed array. The type is a {NativeType native type}. + */ + rbffi_ArrayTypeClass = rb_define_class_under(moduleFFI, "ArrayType", ffi_Type); + /* + * Document-variable: FFI::ArrayType + */ + rb_global_variable(&rbffi_ArrayTypeClass); + /* + * Document-constant: FFI::Type::Array + */ + rb_define_const(ffi_Type, "Array", rbffi_ArrayTypeClass); + + rb_define_alloc_func(rbffi_ArrayTypeClass, array_type_s_allocate); + rb_define_method(rbffi_ArrayTypeClass, "initialize", array_type_initialize, 2); + rb_define_method(rbffi_ArrayTypeClass, "length", array_type_length, 0); + rb_define_method(rbffi_ArrayTypeClass, "elem_type", array_type_element_type, 0); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ArrayType.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ArrayType.h new file mode 100644 index 000000000000..356ffb1c2826 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ArrayType.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_ARRAYTYPE_H +#define RBFFI_ARRAYTYPE_H + +#include <ruby.h> +#include <ffi.h> +#include "Type.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct ArrayType_ { + Type base; + int length; + ffi_type** ffiTypes; + Type* componentType; + VALUE rbComponentType; +} ArrayType; + +extern void rbffi_ArrayType_Init(VALUE moduleFFI); +extern VALUE rbffi_ArrayTypeClass; + + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_ARRAYTYPE_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ArrayType.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ArrayType.o new file mode 100644 index 000000000000..b9030db2d4b6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ArrayType.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Buffer.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Buffer.c new file mode 100644 index 000000000000..b5f39a488c8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Buffer.c @@ -0,0 +1,360 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * Copyright (C) 2009 Aman Gupta <aman@tmm1.net> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdint.h> +#include <stdbool.h> +#include <limits.h> +#include <ruby.h> +#include "rbffi.h" +#include "rbffi_endian.h" +#include "AbstractMemory.h" + +#define BUFFER_EMBED_MAXLEN (8) +typedef struct Buffer { + AbstractMemory memory; + + union { + VALUE rbParent; /* link to parent buffer */ + char* storage; /* start of malloc area */ + long embed[BUFFER_EMBED_MAXLEN / sizeof(long)]; /* storage for tiny allocations */ + } data; +} Buffer; + +static VALUE buffer_allocate(VALUE klass); +static VALUE buffer_initialize(int argc, VALUE* argv, VALUE self); +static void buffer_release(Buffer* ptr); +static void buffer_mark(Buffer* ptr); +static VALUE buffer_free(VALUE self); + +static VALUE BufferClass = Qnil; + +static VALUE +buffer_allocate(VALUE klass) +{ + Buffer* buffer; + VALUE obj; + + obj = Data_Make_Struct(klass, Buffer, NULL, buffer_release, buffer); + buffer->data.rbParent = Qnil; + buffer->memory.flags = MEM_RD | MEM_WR; + + return obj; +} + +static void +buffer_release(Buffer* ptr) +{ + if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) { + xfree(ptr->data.storage); + ptr->data.storage = NULL; + } + + xfree(ptr); +} + +/* + * call-seq: initialize(size, count=1, clear=false) + * @param [Integer, Symbol, #size] Type or size in bytes of a buffer cell + * @param [Fixnum] count number of cell in the Buffer + * @param [Boolean] clear if true, set the buffer to all-zero + * @return [self] + * @raise {NoMemoryError} if failed to allocate memory for Buffer + * A new instance of Buffer. + */ +static VALUE +buffer_initialize(int argc, VALUE* argv, VALUE self) +{ + VALUE rbSize = Qnil, rbCount = Qnil, rbClear = Qnil; + Buffer* p; + int nargs; + + Data_Get_Struct(self, Buffer, p); + + nargs = rb_scan_args(argc, argv, "12", &rbSize, &rbCount, &rbClear); + p->memory.typeSize = rbffi_type_size(rbSize); + p->memory.size = p->memory.typeSize * (nargs > 1 ? NUM2LONG(rbCount) : 1); + + if (p->memory.size > BUFFER_EMBED_MAXLEN) { + p->data.storage = xmalloc(p->memory.size + 7); + if (p->data.storage == NULL) { + rb_raise(rb_eNoMemError, "Failed to allocate memory size=%lu bytes", p->memory.size); + return Qnil; + } + + /* ensure the memory is aligned on at least a 8 byte boundary */ + p->memory.address = (void *) (((uintptr_t) p->data.storage + 0x7) & (uintptr_t) ~0x7ULL); + + if (p->memory.size > 0 && (nargs < 3 || RTEST(rbClear))) { + memset(p->memory.address, 0, p->memory.size); + } + + } else { + p->memory.flags |= MEM_EMBED; + p->memory.address = (void *) &p->data.embed[0]; + } + + if (rb_block_given_p()) { + return rb_ensure(rb_yield, self, buffer_free, self); + } + + return self; +} + +/* + * call-seq: initialize_copy(other) + * @return [self] + * DO NOT CALL THIS METHOD. + */ +static VALUE +buffer_initialize_copy(VALUE self, VALUE other) +{ + AbstractMemory* src; + Buffer* dst; + + Data_Get_Struct(self, Buffer, dst); + src = rbffi_AbstractMemory_Cast(other, BufferClass); + if ((dst->memory.flags & MEM_EMBED) == 0 && dst->data.storage != NULL) { + xfree(dst->data.storage); + } + dst->data.storage = xmalloc(src->size + 7); + if (dst->data.storage == NULL) { + rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size); + return Qnil; + } + + dst->memory.address = (void *) (((uintptr_t) dst->data.storage + 0x7) & (uintptr_t) ~0x7ULL); + dst->memory.size = src->size; + dst->memory.typeSize = src->typeSize; + + /* finally, copy the actual buffer contents */ + memcpy(dst->memory.address, src->address, src->size); + + return self; +} + +static VALUE +buffer_alloc_inout(int argc, VALUE* argv, VALUE klass) +{ + return buffer_initialize(argc, argv, buffer_allocate(klass)); +} + +static VALUE +slice(VALUE self, long offset, long len) +{ + Buffer* ptr; + Buffer* result; + VALUE obj = Qnil; + + Data_Get_Struct(self, Buffer, ptr); + checkBounds(&ptr->memory, offset, len); + + obj = Data_Make_Struct(BufferClass, Buffer, buffer_mark, -1, result); + result->memory.address = ptr->memory.address + offset; + result->memory.size = len; + result->memory.flags = ptr->memory.flags; + result->memory.typeSize = ptr->memory.typeSize; + result->data.rbParent = self; + + return obj; +} + +/* + * call-seq: + offset + * @param [Numeric] offset + * @return [Buffer] a new instance of Buffer pointing from offset until end of previous buffer. + * Add a Buffer with an offset + */ +static VALUE +buffer_plus(VALUE self, VALUE rbOffset) +{ + Buffer* ptr; + long offset = NUM2LONG(rbOffset); + + Data_Get_Struct(self, Buffer, ptr); + + return slice(self, offset, ptr->memory.size - offset); +} + +/* + * call-seq: slice(offset, length) + * @param [Numeric] offset + * @param [Numeric] length + * @return [Buffer] a new instance of Buffer + * Slice an existing Buffer. + */ +static VALUE +buffer_slice(VALUE self, VALUE rbOffset, VALUE rbLength) +{ + return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength)); +} + +/* + * call-seq: inspect + * @return [String] + * Inspect a Buffer. + */ +static VALUE +buffer_inspect(VALUE self) +{ + char tmp[100]; + Buffer* ptr; + + Data_Get_Struct(self, Buffer, ptr); + + snprintf(tmp, sizeof(tmp), "#<FFI:Buffer:%p address=%p size=%ld>", ptr, ptr->memory.address, ptr->memory.size); + + return rb_str_new2(tmp); +} + + +#if BYTE_ORDER == LITTLE_ENDIAN +# define SWAPPED_ORDER BIG_ENDIAN +#else +# define SWAPPED_ORDER LITTLE_ENDIAN +#endif + +/* + * Set or get endianness of Buffer. + * @overload order + * @return [:big, :little] + * Get endianness of Buffer. + * @overload order(order) + * @param [:big, :little, :network] order + * @return [self] + * Set endianness of Buffer (+:network+ is an alias for +:big+). + */ +static VALUE +buffer_order(int argc, VALUE* argv, VALUE self) +{ + Buffer* ptr; + + Data_Get_Struct(self, Buffer, ptr); + if (argc == 0) { + int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER; + return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little")); + } else { + VALUE rbOrder = Qnil; + int order = BYTE_ORDER; + + if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) { + rb_raise(rb_eArgError, "need byte order"); + } + if (SYMBOL_P(rbOrder)) { + ID id = SYM2ID(rbOrder); + if (id == rb_intern("little")) { + order = LITTLE_ENDIAN; + + } else if (id == rb_intern("big") || id == rb_intern("network")) { + order = BIG_ENDIAN; + } + } + if (order != BYTE_ORDER) { + Buffer* p2; + VALUE retval = slice(self, 0, ptr->memory.size); + + Data_Get_Struct(retval, Buffer, p2); + p2->memory.flags |= MEM_SWAP; + return retval; + } + + return self; + } +} + +/* Only used to free the buffer if the yield in the initializer throws an exception */ +static VALUE +buffer_free(VALUE self) +{ + Buffer* ptr; + + Data_Get_Struct(self, Buffer, ptr); + if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) { + xfree(ptr->data.storage); + ptr->data.storage = NULL; + } + + return self; +} + +static void +buffer_mark(Buffer* ptr) +{ + rb_gc_mark(ptr->data.rbParent); +} + +void +rbffi_Buffer_Init(VALUE moduleFFI) +{ + VALUE ffi_AbstractMemory = rbffi_AbstractMemoryClass; + + /* + * Document-class: FFI::Buffer < FFI::AbstractMemory + * + * A Buffer is a function argument type. It should be use with functions playing with C arrays. + */ + BufferClass = rb_define_class_under(moduleFFI, "Buffer", ffi_AbstractMemory); + + /* + * Document-variable: FFI::Buffer + */ + rb_global_variable(&BufferClass); + rb_define_alloc_func(BufferClass, buffer_allocate); + + /* + * Document-method: alloc_inout + * call-seq: alloc_inout(*args) + * Create a new Buffer for in and out arguments (alias : <i>new_inout</i>). + */ + rb_define_singleton_method(BufferClass, "alloc_inout", buffer_alloc_inout, -1); + /* + * Document-method: alloc_out + * call-seq: alloc_out(*args) + * Create a new Buffer for out arguments (alias : <i>new_out</i>). + */ + rb_define_singleton_method(BufferClass, "alloc_out", buffer_alloc_inout, -1); + /* + * Document-method: alloc_in + * call-seq: alloc_in(*args) + * Create a new Buffer for in arguments (alias : <i>new_in</i>). + */ + rb_define_singleton_method(BufferClass, "alloc_in", buffer_alloc_inout, -1); + rb_define_alias(rb_singleton_class(BufferClass), "new_in", "alloc_in"); + rb_define_alias(rb_singleton_class(BufferClass), "new_out", "alloc_out"); + rb_define_alias(rb_singleton_class(BufferClass), "new_inout", "alloc_inout"); + + rb_define_method(BufferClass, "initialize", buffer_initialize, -1); + rb_define_method(BufferClass, "initialize_copy", buffer_initialize_copy, 1); + rb_define_method(BufferClass, "order", buffer_order, -1); + rb_define_method(BufferClass, "inspect", buffer_inspect, 0); + rb_define_alias(BufferClass, "length", "total"); + rb_define_method(BufferClass, "+", buffer_plus, 1); + rb_define_method(BufferClass, "slice", buffer_slice, 2); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Buffer.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Buffer.o new file mode 100644 index 000000000000..80a4bfbbb5c2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Buffer.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Call.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Call.c new file mode 100644 index 000000000000..86ce3b9a39ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Call.c @@ -0,0 +1,487 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com> + * Copyright (c) 2009, Mike Dalessio <mike.dalessio@gmail.com> + * Copyright (c) 2009, Aman Gupta. + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +#include <sys/param.h> +#endif +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#include <errno.h> +#include <ruby.h> +#include <ruby/thread.h> +#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) +# include <signal.h> +# include <pthread.h> +#endif +#include <ffi.h> +#include "extconf.h" +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "Struct.h" +#include "Function.h" +#include "Type.h" +#include "LastError.h" +#include "Call.h" +#include "MappedType.h" +#include "Thread.h" +#include "LongDouble.h" + +#ifdef USE_RAW +# ifndef __i386__ +# error "RAW argument packing only supported on i386" +# endif + +#define INT8_ADJ (4) +#define INT16_ADJ (4) +#define INT32_ADJ (4) +#define INT64_ADJ (8) +#define LONG_ADJ (sizeof(long)) +#define FLOAT32_ADJ (4) +#define FLOAT64_ADJ (8) +#define ADDRESS_ADJ (sizeof(void *)) +#define LONGDOUBLE_ADJ (ffi_type_longdouble.alignment) + +#endif /* USE_RAW */ + +#ifdef USE_RAW +# define ADJ(p, a) ((p) = (FFIStorage*) (((char *) p) + a##_ADJ)) +#else +# define ADJ(p, a) (++(p)) +#endif + +static void* callback_param(VALUE proc, VALUE cbinfo); +static inline void* getPointer(VALUE value, int type); + +static ID id_to_ptr, id_map_symbol, id_to_native; + +void +rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, + FFIStorage* paramStorage, void** ffiValues, + VALUE* callbackParameters, int callbackCount, VALUE enums) +{ + VALUE callbackProc = Qnil; + FFIStorage* param = &paramStorage[0]; + int i, argidx, cbidx, argCount; + + if (unlikely(paramCount != -1 && paramCount != argc)) { + if (argc == (paramCount - 1) && callbackCount == 1 && rb_block_given_p()) { + callbackProc = rb_block_proc(); + } else { + rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, paramCount); + } + } + + argCount = paramCount != -1 ? paramCount : argc; + + for (i = 0, argidx = 0, cbidx = 0; i < argCount; ++i) { + Type* paramType = paramTypes[i]; + int type; + + + if (unlikely(paramType->nativeType == NATIVE_MAPPED)) { + VALUE values[] = { argv[argidx], Qnil }; + argv[argidx] = rb_funcall2(((MappedType *) paramType)->rbConverter, id_to_native, 2, values); + paramType = ((MappedType *) paramType)->type; + } + + type = argidx < argc ? TYPE(argv[argidx]) : T_NONE; + ffiValues[i] = param; + + switch (paramType->nativeType) { + + case NATIVE_INT8: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->s8 = NUM2INT(value); + } else { + param->s8 = NUM2INT(argv[argidx]); + } + + ++argidx; + ADJ(param, INT8); + break; + + case NATIVE_INT16: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->s16 = NUM2INT(value); + + } else { + param->s16 = NUM2INT(argv[argidx]); + } + + ++argidx; + ADJ(param, INT16); + break; + + case NATIVE_INT32: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->s32 = NUM2INT(value); + + } else { + param->s32 = NUM2INT(argv[argidx]); + } + + ++argidx; + ADJ(param, INT32); + break; + + case NATIVE_BOOL: + if (type != T_TRUE && type != T_FALSE) { + rb_raise(rb_eTypeError, "wrong argument type (expected a boolean parameter)"); + } + param->s8 = argv[argidx++] == Qtrue; + ADJ(param, INT8); + break; + + case NATIVE_UINT8: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u8 = NUM2UINT(value); + } else { + param->u8 = NUM2UINT(argv[argidx]); + } + + ADJ(param, INT8); + ++argidx; + break; + + case NATIVE_UINT16: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u16 = NUM2UINT(value); + } else { + param->u16 = NUM2UINT(argv[argidx]); + } + + ADJ(param, INT16); + ++argidx; + break; + + case NATIVE_UINT32: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u32 = NUM2UINT(value); + } else { + param->u32 = NUM2UINT(argv[argidx]); + } + + ADJ(param, INT32); + ++argidx; + break; + + case NATIVE_INT64: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->i64 = NUM2LL(value); + } else { + param->i64 = NUM2LL(argv[argidx]); + } + + ADJ(param, INT64); + ++argidx; + break; + + case NATIVE_UINT64: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u64 = NUM2ULL(value); + } else { + param->u64 = NUM2ULL(argv[argidx]); + } + + ADJ(param, INT64); + ++argidx; + break; + + case NATIVE_LONG: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + *(ffi_sarg *) param = NUM2LONG(value); + } else { + *(ffi_sarg *) param = NUM2LONG(argv[argidx]); + } + + ADJ(param, LONG); + ++argidx; + break; + + case NATIVE_ULONG: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + *(ffi_arg *) param = NUM2ULONG(value); + } else { + *(ffi_arg *) param = NUM2ULONG(argv[argidx]); + } + + ADJ(param, LONG); + ++argidx; + break; + + case NATIVE_FLOAT32: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->f32 = (float) NUM2DBL(value); + } else { + param->f32 = (float) NUM2DBL(argv[argidx]); + } + + ADJ(param, FLOAT32); + ++argidx; + break; + + case NATIVE_FLOAT64: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->f64 = NUM2DBL(value); + } else { + param->f64 = NUM2DBL(argv[argidx]); + } + + ADJ(param, FLOAT64); + ++argidx; + break; + + case NATIVE_LONGDOUBLE: + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->ld = rbffi_num2longdouble(value); + } else { + param->ld = rbffi_num2longdouble(argv[argidx]); + } + + ADJ(param, LONGDOUBLE); + ++argidx; + break; + + + case NATIVE_STRING: + if (type == T_NIL) { + param->ptr = NULL; + + } else { + param->ptr = StringValueCStr(argv[argidx]); + } + + ADJ(param, ADDRESS); + ++argidx; + break; + + case NATIVE_POINTER: + case NATIVE_BUFFER_IN: + case NATIVE_BUFFER_OUT: + case NATIVE_BUFFER_INOUT: + param->ptr = getPointer(argv[argidx++], type); + ADJ(param, ADDRESS); + break; + + + case NATIVE_FUNCTION: + if (callbackProc != Qnil) { + param->ptr = callback_param(callbackProc, callbackParameters[cbidx++]); + } else { + param->ptr = callback_param(argv[argidx], callbackParameters[cbidx++]); + ++argidx; + } + ADJ(param, ADDRESS); + break; + + case NATIVE_STRUCT: + ffiValues[i] = getPointer(argv[argidx++], type); + break; + + default: + rb_raise(rb_eArgError, "Invalid parameter type: %d", paramType->nativeType); + } + } +} + +static void * +call_blocking_function(void* data) +{ + rbffi_blocking_call_t* b = (rbffi_blocking_call_t *) data; + ffi_call(&b->cif, FFI_FN(b->function), b->retval, b->ffiValues); + + return NULL; +} + +VALUE +rbffi_do_blocking_call(VALUE data) +{ + rb_thread_call_without_gvl(call_blocking_function, (void*)data, (rb_unblock_function_t *) -1, NULL); + + return Qnil; +} + +VALUE +rbffi_save_frame_exception(VALUE data, VALUE exc) +{ + rbffi_frame_t* frame = (rbffi_frame_t *) data; + frame->exc = exc; + return Qnil; +} + +VALUE +rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo) +{ + void* retval; + void** ffiValues; + FFIStorage* params; + VALUE rbReturnValue; + rbffi_frame_t frame = { 0 }; + + retval = alloca(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG)); + + if (unlikely(fnInfo->blocking)) { + rbffi_blocking_call_t* bc; + + /* allocate information passed to the blocking function on the stack */ + ffiValues = ALLOCA_N(void *, fnInfo->parameterCount); + params = ALLOCA_N(FFIStorage, fnInfo->parameterCount); + bc = ALLOCA_N(rbffi_blocking_call_t, 1); + bc->retval = retval; + bc->cif = fnInfo->ffi_cif; + bc->function = function; + bc->ffiValues = ffiValues; + bc->params = params; + bc->frame = &frame; + + rbffi_SetupCallParams(argc, argv, + fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues, + fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); + + rbffi_frame_push(&frame); + rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0); + rbffi_frame_pop(&frame); + + } else { + + ffiValues = ALLOCA_N(void *, fnInfo->parameterCount); + params = ALLOCA_N(FFIStorage, fnInfo->parameterCount); + + rbffi_SetupCallParams(argc, argv, + fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues, + fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); + + rbffi_frame_push(&frame); + ffi_call(&fnInfo->ffi_cif, FFI_FN(function), retval, ffiValues); + rbffi_frame_pop(&frame); + } + + if (unlikely(!fnInfo->ignoreErrno)) { + rbffi_save_errno(); + } + + if (RTEST(frame.exc) && frame.exc != Qnil) { + rb_exc_raise(frame.exc); + } + + RB_GC_GUARD(rbReturnValue) = rbffi_NativeValue_ToRuby(fnInfo->returnType, fnInfo->rbReturnType, retval); + RB_GC_GUARD(fnInfo->rbReturnType); + + return rbReturnValue; +} + +static inline void* +getPointer(VALUE value, int type) +{ + if (likely(type == T_DATA && rb_obj_is_kind_of(value, rbffi_AbstractMemoryClass))) { + + return ((AbstractMemory *) DATA_PTR(value))->address; + + } else if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_StructClass)) { + + AbstractMemory* memory = ((Struct *) DATA_PTR(value))->pointer; + return memory != NULL ? memory->address : NULL; + + } else if (type == T_STRING) { + + return StringValuePtr(value); + + } else if (type == T_NIL) { + + return NULL; + + } else if (rb_respond_to(value, id_to_ptr)) { + + VALUE ptr = rb_funcall2(value, id_to_ptr, 0, NULL); + if (rb_obj_is_kind_of(ptr, rbffi_AbstractMemoryClass) && TYPE(ptr) == T_DATA) { + return ((AbstractMemory *) DATA_PTR(ptr))->address; + } + rb_raise(rb_eArgError, "to_ptr returned an invalid pointer"); + } + + rb_raise(rb_eArgError, ":pointer argument is not a valid pointer"); + return NULL; +} + +Invoker +rbffi_GetInvoker(FunctionType *fnInfo) +{ + return rbffi_CallFunction; +} + + +static void* +callback_param(VALUE proc, VALUE cbInfo) +{ + VALUE callback ; + if (unlikely(proc == Qnil)) { + return NULL ; + } + + /* Handle Function pointers here */ + if (rb_obj_is_kind_of(proc, rbffi_FunctionClass)) { + AbstractMemory* ptr; + Data_Get_Struct(proc, AbstractMemory, ptr); + return ptr->address; + } + + callback = rbffi_Function_ForProc(cbInfo, proc); + RB_GC_GUARD(callback); + + return ((AbstractMemory *) DATA_PTR(callback))->address; +} + + +void +rbffi_Call_Init(VALUE moduleFFI) +{ + id_to_ptr = rb_intern("to_ptr"); + id_to_native = rb_intern("to_native"); + id_map_symbol = rb_intern("__map_symbol"); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Call.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Call.h new file mode 100644 index 000000000000..b892d85871b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Call.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com> + * Copyright (c) 2009, Mike Dalessio <mike.dalessio@gmail.com> + * Copyright (c) 2009, Aman Gupta. + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_CALL_H +#define RBFFI_CALL_H + +#include "Thread.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__i386__) && \ + (defined(HAVE_RAW_API) || defined(USE_INTERNAL_LIBFFI)) && \ + !defined(_WIN32) && !defined(__WIN32__) +# define USE_RAW +#endif + +#if (defined(__i386__) || defined(__x86_64__)) && !(defined(_WIN32) || defined(__WIN32__)) +# define BYPASS_FFI 1 +#endif + +typedef union { +#ifdef USE_RAW + signed int s8, s16, s32; + unsigned int u8, u16, u32; +#else + signed char s8; + unsigned char u8; + signed short s16; + unsigned short u16; + signed int s32; + unsigned int u32; +#endif + signed long long i64; + unsigned long long u64; + signed long sl; + unsigned long ul; + void* ptr; + float f32; + double f64; + long double ld; +} FFIStorage; + +extern void rbffi_Call_Init(VALUE moduleFFI); + +extern void rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, + FFIStorage* paramStorage, void** ffiValues, + VALUE* callbackParameters, int callbackCount, VALUE enums); + +struct FunctionType_; +extern VALUE rbffi_CallFunction(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo); + +typedef VALUE (*Invoker)(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo); + +Invoker rbffi_GetInvoker(struct FunctionType_* fnInfo); + +extern VALUE rbffi_GetEnumValue(VALUE enums, VALUE value); +extern int rbffi_GetSignedIntValue(VALUE value, int type, int minValue, int maxValue, const char* typeName, VALUE enums); + +typedef struct rbffi_blocking_call { + rbffi_frame_t* frame; + void* function; + ffi_cif cif; + void **ffiValues; + void* retval; + void* params; +} rbffi_blocking_call_t; + +VALUE rbffi_do_blocking_call(VALUE data); +VALUE rbffi_save_frame_exception(VALUE data, VALUE exc); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_CALL_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Call.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Call.o new file mode 100644 index 000000000000..a51f902cf8fe Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Call.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ClosurePool.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ClosurePool.c new file mode 100644 index 000000000000..cfdcf6c19b35 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ClosurePool.c @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2009, 2010 Wayne Meissner + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +#include <sys/param.h> +#endif +#include <sys/types.h> +#if defined(__CYGWIN__) || !defined(_WIN32) +# include <sys/mman.h> +#endif +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#if defined(__CYGWIN__) || !defined(_WIN32) +# include <unistd.h> +#else +# include <winsock2.h> +# define _WINSOCKAPI_ +# include <windows.h> +#endif +#include <errno.h> +#include <ruby.h> + +#include <ffi.h> +#include "rbffi.h" +#include "compat.h" + +#include "Function.h" +#include "Types.h" +#include "Type.h" +#include "LastError.h" +#include "Call.h" + +#include "ClosurePool.h" + +#ifndef roundup +# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#endif + +typedef struct Memory { + void* code; + void* data; + struct Memory* next; +} Memory; + +struct ClosurePool_ { + void* ctx; + int closureSize; + bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize); + struct Memory* blocks; /* Keeps track of all the allocated memory for this pool */ + Closure* list; + long refcnt; +}; + +static long pageSize; + +static void* allocatePage(void); +static bool freePage(void *); +static bool protectPage(void *); + +ClosurePool* +rbffi_ClosurePool_New(int closureSize, + bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize), + void* ctx) +{ + ClosurePool* pool; + + pool = xcalloc(1, sizeof(*pool)); + pool->closureSize = closureSize; + pool->ctx = ctx; + pool->prep = prep; + pool->refcnt = 1; + + return pool; +} + +void +cleanup_closure_pool(ClosurePool* pool) +{ + Memory* memory; + + for (memory = pool->blocks; memory != NULL; ) { + Memory* next = memory->next; +#if !USE_FFI_ALLOC + freePage(memory->code); +#else + ffi_closure_free(memory->code); +#endif + free(memory->data); + free(memory); + memory = next; + } + xfree(pool); +} + +void +rbffi_ClosurePool_Free(ClosurePool* pool) +{ + if (pool != NULL) { + long refcnt = --(pool->refcnt); + if (refcnt == 0) { + cleanup_closure_pool(pool); + } + } +} + +#if !USE_FFI_ALLOC + +Closure* +rbffi_Closure_Alloc(ClosurePool* pool) +{ + Closure *list = NULL; + Memory* block = NULL; + void *code = NULL; + char errmsg[256]; + int nclosures; + long trampolineSize; + int i; + + if (pool->list != NULL) { + Closure* closure = pool->list; + pool->list = pool->list->next; + pool->refcnt++; + + return closure; + } + + trampolineSize = roundup(pool->closureSize, 8); + nclosures = (int) (pageSize / trampolineSize); + block = calloc(1, sizeof(*block)); + list = calloc(nclosures, sizeof(*list)); + code = allocatePage(); + + if (block == NULL || list == NULL || code == NULL) { + snprintf(errmsg, sizeof(errmsg), "failed to allocate a page. errno=%d (%s)", errno, strerror(errno)); + goto error; + } + + for (i = 0; i < nclosures; ++i) { + Closure* closure = &list[i]; + closure->next = &list[i + 1]; + closure->pool = pool; + closure->code = ((char *)code + (i * trampolineSize)); + closure->pcl = closure->code; + + if (!(*pool->prep)(pool->ctx, closure->code, closure, errmsg, sizeof(errmsg))) { + goto error; + } + } + + if (!protectPage(code)) { + goto error; + } + + /* Track the allocated page + Closure memory area */ + block->data = list; + block->code = code; + block->next = pool->blocks; + pool->blocks = block; + + /* Thread the new block onto the free list, apart from the first one. */ + list[nclosures - 1].next = pool->list; + pool->list = list->next; + pool->refcnt++; + + /* Use the first one as the new handle */ + return list; + +error: + free(block); + free(list); + if (code != NULL) { + freePage(code); + } + + + rb_raise(rb_eRuntimeError, "%s", errmsg); + return NULL; +} + +#else + +Closure* +rbffi_Closure_Alloc(ClosurePool* pool) +{ + Closure *closure = NULL; + Memory* block = NULL; + void *code = NULL; + void *pcl = NULL; + char errmsg[256]; + + block = calloc(1, sizeof(*block)); + closure = calloc(1, sizeof(*closure)); + pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + + if (block == NULL || closure == NULL || pcl == NULL) { + snprintf(errmsg, sizeof(errmsg), "failed to allocate a page. errno=%d (%s)", errno, strerror(errno)); + goto error; + } + + closure->pool = pool; + closure->code = code; + closure->pcl = pcl; + + if (!(*pool->prep)(pool->ctx, closure->code, closure, errmsg, sizeof(errmsg))) { + goto error; + } + + /* Track the allocated page + Closure memory area */ + block->data = closure; + block->code = pcl; + pool->blocks = block; + + /* Thread the new block onto the free list, apart from the first one. */ + pool->refcnt++; + + return closure; + +error: + free(block); + free(closure); + if (pcl != NULL) { + ffi_closure_free(pcl); + } + + rb_raise(rb_eRuntimeError, "%s", errmsg); + return NULL; +} + +#endif /* !USE_FFI_ALLOC */ + +void +rbffi_Closure_Free(Closure* closure) +{ + if (closure != NULL) { + ClosurePool* pool = closure->pool; + long refcnt; + /* Just push it on the front of the free list */ + closure->next = pool->list; + pool->list = closure; + refcnt = --(pool->refcnt); + if (refcnt == 0) { + cleanup_closure_pool(pool); + } + } +} + +void* +rbffi_Closure_CodeAddress(Closure* handle) +{ + return handle->code; +} + + +static long +getPageSize() +{ +#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) + SYSTEM_INFO si; + GetSystemInfo(&si); + return si.dwPageSize; +#else + return sysconf(_SC_PAGESIZE); +#endif +} + +#if !USE_FFI_ALLOC + +static void* +allocatePage(void) +{ +#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) + return VirtualAlloc(NULL, pageSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); +#else + void *page = mmap(NULL, pageSize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + return (page != (void *) -1) ? page : NULL; +#endif +} + +static bool +freePage(void *addr) +{ +#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) + return VirtualFree(addr, 0, MEM_RELEASE); +#else + return munmap(addr, pageSize) == 0; +#endif +} + +static bool +protectPage(void* page) +{ +#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__)) + DWORD oldProtect; + return VirtualProtect(page, pageSize, PAGE_EXECUTE_READ, &oldProtect); +#else + return mprotect(page, pageSize, PROT_READ | PROT_EXEC) == 0; +#endif +} + +#endif /* !USE_FFI_ALLOC */ + +void +rbffi_ClosurePool_Init(VALUE module) +{ + pageSize = getPageSize(); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ClosurePool.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ClosurePool.h new file mode 100644 index 000000000000..99e3a47396c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ClosurePool.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2009, 2010 Wayne Meissner + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RUBYFFI_CLOSUREPOOL_H +#define RUBYFFI_CLOSUREPOOL_H + +typedef struct ClosurePool_ ClosurePool; +typedef struct Closure_ Closure; + +struct Closure_ { + void* info; /* opaque handle for storing closure-instance specific data */ + void* function; /* closure-instance specific function, called by custom trampoline */ + void* code; /* Executable address for the native trampoline code location */ + void* pcl; /* Writeable address for the native trampoline code location */ + + struct ClosurePool_* pool; + Closure* next; +}; + +void rbffi_ClosurePool_Init(VALUE module); + +ClosurePool* rbffi_ClosurePool_New(int closureSize, + bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize), + void* ctx); + +void rbffi_ClosurePool_Free(ClosurePool *); + +Closure* rbffi_Closure_Alloc(ClosurePool *); +void rbffi_Closure_Free(Closure *); + +void* rbffi_Closure_GetCodeAddress(Closure *); + +#endif /* RUBYFFI_CLOSUREPOOL_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ClosurePool.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ClosurePool.o new file mode 100644 index 000000000000..8a6a9fe052ce Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ClosurePool.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/DynamicLibrary.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/DynamicLibrary.c new file mode 100644 index 000000000000..78b3de60ebf6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/DynamicLibrary.c @@ -0,0 +1,334 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) +# include <winsock2.h> +# define _WINSOCKAPI_ +# include <windows.h> +# include <shlwapi.h> +#else +# include <dlfcn.h> +#endif +#include <ruby.h> + +#include <ffi.h> + +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "DynamicLibrary.h" + +typedef struct LibrarySymbol_ { + Pointer base; + VALUE library; + VALUE name; +} LibrarySymbol; + +static VALUE library_initialize(VALUE self, VALUE libname, VALUE libflags); +static void library_free(Library* lib); + + +static VALUE symbol_allocate(VALUE klass); +static VALUE symbol_new(VALUE library, void* address, VALUE name); +static void symbol_mark(LibrarySymbol* sym); + +static VALUE LibraryClass = Qnil, SymbolClass = Qnil; + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) +static void* dl_open(const char* name, int flags); +static void dl_error(char* buf, int size); +#define dl_sym(handle, name) GetProcAddress(handle, name) +#define dl_close(handle) FreeLibrary(handle) +#else +# define dl_open(name, flags) dlopen(name, flags != 0 ? flags : RTLD_LAZY) +# define dl_error(buf, size) do { snprintf(buf, size, "%s", dlerror()); } while(0) +# define dl_sym(handle, name) dlsym(handle, name) +# define dl_close(handle) dlclose(handle) +#endif + +static VALUE +library_allocate(VALUE klass) +{ + Library* library; + return Data_Make_Struct(klass, Library, NULL, library_free, library); +} + +/* + * call-seq: DynamicLibrary.open(libname, libflags) + * @param libname (see #initialize) + * @param libflags (see #initialize) + * @return [FFI::DynamicLibrary] + * @raise {LoadError} if +libname+ cannot be opened + * Open a library. + */ +static VALUE +library_open(VALUE klass, VALUE libname, VALUE libflags) +{ + return library_initialize(library_allocate(klass), libname, libflags); +} + +/* + * call-seq: initialize(libname, libflags) + * @param [String] libname name of library to open + * @param [Fixnum] libflags flags for library to open + * @return [FFI::DynamicLibrary] + * @raise {LoadError} if +libname+ cannot be opened + * A new DynamicLibrary instance. + */ +static VALUE +library_initialize(VALUE self, VALUE libname, VALUE libflags) +{ + Library* library; + int flags; + + Check_Type(libflags, T_FIXNUM); + + Data_Get_Struct(self, Library, library); + flags = libflags != Qnil ? NUM2UINT(libflags) : 0; + + library->handle = dl_open(libname != Qnil ? StringValueCStr(libname) : NULL, flags); + if (library->handle == NULL) { + char errmsg[1024]; + dl_error(errmsg, sizeof(errmsg)); + rb_raise(rb_eLoadError, "Could not open library '%s': %s", + libname != Qnil ? StringValueCStr(libname) : "[current process]", + errmsg); + } +#ifdef __CYGWIN__ + // On Cygwin 1.7.17 "dlsym(dlopen(0,0), 'getpid')" fails. (dlerror: "No such process") + // As a workaround we can use "dlsym(RTLD_DEFAULT, 'getpid')" instead. + // Since 0 == RTLD_DEFAULT we won't call dl_close later. + if (libname == Qnil) { + dl_close(library->handle); + library->handle = RTLD_DEFAULT; + } +#endif + rb_iv_set(self, "@name", libname != Qnil ? libname : rb_str_new2("[current process]")); + return self; +} + +static VALUE +library_dlsym(VALUE self, VALUE name) +{ + Library* library; + void* address = NULL; + Check_Type(name, T_STRING); + + Data_Get_Struct(self, Library, library); + address = dl_sym(library->handle, StringValueCStr(name)); + + return address != NULL ? symbol_new(self, address, name) : Qnil; +} + +/* + * call-seq: last_error + * @return [String] library's last error string + */ +static VALUE +library_dlerror(VALUE self) +{ + char errmsg[1024]; + dl_error(errmsg, sizeof(errmsg)); + return rb_str_new2(errmsg); +} + +static void +library_free(Library* library) +{ + /* dlclose() on MacOS tends to segfault - avoid it */ +#ifndef __APPLE__ + if (library->handle != NULL) { + dl_close(library->handle); + } +#endif + xfree(library); +} + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__) +static void* +dl_open(const char* name, int flags) +{ + if (name == NULL) { + return GetModuleHandle(NULL); + } else { + DWORD dwFlags = PathIsRelativeA(name) ? 0 : LOAD_WITH_ALTERED_SEARCH_PATH; + return LoadLibraryExA(name, NULL, dwFlags); + } +} + +static void +dl_error(char* buf, int size) +{ + FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), + 0, buf, size, NULL); +} +#endif + +static VALUE +symbol_allocate(VALUE klass) +{ + LibrarySymbol* sym; + VALUE obj = Data_Make_Struct(klass, LibrarySymbol, NULL, -1, sym); + sym->name = Qnil; + sym->library = Qnil; + sym->base.rbParent = Qnil; + + return obj; +} + + +/* + * call-seq: initialize_copy(other) + * @param [Object] other + * @return [nil] + * DO NOT CALL THIS METHOD + */ +static VALUE +symbol_initialize_copy(VALUE self, VALUE other) +{ + rb_raise(rb_eRuntimeError, "cannot duplicate symbol"); + return Qnil; +} + +static VALUE +symbol_new(VALUE library, void* address, VALUE name) +{ + LibrarySymbol* sym; + VALUE obj = Data_Make_Struct(SymbolClass, LibrarySymbol, symbol_mark, -1, sym); + + sym->base.memory.address = address; + sym->base.memory.size = LONG_MAX; + sym->base.memory.typeSize = 1; + sym->base.memory.flags = MEM_RD | MEM_WR; + sym->library = library; + sym->name = name; + + return obj; +} + +static void +symbol_mark(LibrarySymbol* sym) +{ + rb_gc_mark(sym->library); + rb_gc_mark(sym->name); +} + +/* + * call-seq: inspect + * @return [String] + * Inspect. + */ +static VALUE +symbol_inspect(VALUE self) +{ + LibrarySymbol* sym; + char buf[256]; + + Data_Get_Struct(self, LibrarySymbol, sym); + snprintf(buf, sizeof(buf), "#<FFI::Library::Symbol name=%s address=%p>", + StringValueCStr(sym->name), sym->base.memory.address); + return rb_str_new2(buf); +} + +void +rbffi_DynamicLibrary_Init(VALUE moduleFFI) +{ + /* + * Document-class: FFI::DynamicLibrary + */ + LibraryClass = rb_define_class_under(moduleFFI, "DynamicLibrary", rb_cObject); + rb_global_variable(&LibraryClass); + /* + * Document-class: FFI::DynamicLibrary::Symbol < FFI::Pointer + * + * An instance of this class represents a library symbol. It may be a {Pointer pointer} to + * a function or to a variable. + */ + SymbolClass = rb_define_class_under(LibraryClass, "Symbol", rbffi_PointerClass); + rb_global_variable(&SymbolClass); + + /* + * Document-const: FFI::NativeLibrary + * Backward compatibility for FFI::DynamicLibrary + */ + rb_define_const(moduleFFI, "NativeLibrary", LibraryClass); /* backwards compat library */ + rb_define_alloc_func(LibraryClass, library_allocate); + rb_define_singleton_method(LibraryClass, "open", library_open, 2); + rb_define_singleton_method(LibraryClass, "last_error", library_dlerror, 0); + rb_define_method(LibraryClass, "initialize", library_initialize, 2); + /* + * Document-method: find_symbol + * call-seq: find_symbol(name) + * @param [String] name library symbol's name + * @return [FFI::DynamicLibrary::Symbol] library symbol + */ + rb_define_method(LibraryClass, "find_symbol", library_dlsym, 1); + /* + * Document-method: find_function + * call-seq: find_function(name) + * @param [String] name library function's name + * @return [FFI::DynamicLibrary::Symbol] library function symbol + */ + rb_define_method(LibraryClass, "find_function", library_dlsym, 1); + /* + * Document-method: find_variable + * call-seq: find_variable(name) + * @param [String] name library variable's name + * @return [FFI::DynamicLibrary::Symbol] library variable symbol + */ + rb_define_method(LibraryClass, "find_variable", library_dlsym, 1); + rb_define_method(LibraryClass, "last_error", library_dlerror, 0); + rb_define_attr(LibraryClass, "name", 1, 0); + + rb_define_alloc_func(SymbolClass, symbol_allocate); + rb_undef_method(SymbolClass, "new"); + rb_define_method(SymbolClass, "inspect", symbol_inspect, 0); + rb_define_method(SymbolClass, "initialize_copy", symbol_initialize_copy, 1); + +#define DEF(x) rb_define_const(LibraryClass, "RTLD_" #x, UINT2NUM(RTLD_##x)) + DEF(LAZY); + DEF(NOW); + DEF(GLOBAL); + DEF(LOCAL); + DEF(NOLOAD); + DEF(NODELETE); + DEF(FIRST); + DEF(DEEPBIND); + DEF(MEMBER); + DEF(BINDING_MASK); + DEF(LOCATION_MASK); + DEF(ALL_MASK); +#undef DEF + +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/DynamicLibrary.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/DynamicLibrary.h new file mode 100644 index 000000000000..97bf7bce6813 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/DynamicLibrary.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LIBRARY_H +#define _LIBRARY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* if these aren't defined (eg. windows), we need sensible defaults */ +#ifndef RTLD_LAZY +#define RTLD_LAZY 1 +#endif + +#ifndef RTLD_NOW +#define RTLD_NOW 2 +#endif + +#ifndef RTLD_LOCAL +#define RTLD_LOCAL 4 +#endif + +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 8 +#endif + +/* If these aren't defined, they're not supported so define as 0 */ +#ifndef RTLD_NOLOAD +#define RTLD_NOLOAD 0 +#endif + +#ifndef RTLD_NODELETE +#define RTLD_NODELETE 0 +#endif + +#ifndef RTLD_FIRST +#define RTLD_FIRST 0 +#endif + +#ifndef RTLD_DEEPBIND +#define RTLD_DEEPBIND 0 +#endif + +#ifndef RTLD_MEMBER +#define RTLD_MEMBER 0 +#endif + +/* convenience */ +#ifndef RTLD_BINDING_MASK +#define RTLD_BINDING_MASK (RTLD_LAZY | RTLD_NOW) +#endif + +#ifndef RTLD_LOCATION_MASK +#define RTLD_LOCATION_MASK (RTLD_LOCAL | RTLD_GLOBAL) +#endif + +#ifndef RTLD_ALL_MASK +#define RTLD_ALL_MASK (RTLD_BINDING_MASK | RTLD_LOCATION_MASK | RTLD_NOLOAD | RTLD_NODELETE | RTLD_FIRST | RTLD_DEEPBIND | RTLD_MEMBER) +#endif + +typedef struct Library { + void* handle; +} Library; + +extern void rbffi_DynamicLibrary_Init(VALUE ffiModule); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBRARY_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/DynamicLibrary.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/DynamicLibrary.o new file mode 100644 index 000000000000..c29ddb0a41c0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/DynamicLibrary.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Function.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Function.c new file mode 100644 index 000000000000..1a575911c4c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Function.c @@ -0,0 +1,917 @@ +/* + * Copyright (c) 2009-2011 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +#include <sys/param.h> +#endif +#include <sys/types.h> +#ifndef _WIN32 +# include <sys/mman.h> +# include <unistd.h> +#endif + +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#include <ruby.h> +#include <ruby/thread.h> + +#include <ffi.h> +#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) +#include <pthread.h> +#endif +#include <fcntl.h> + +#include "rbffi.h" +#include "compat.h" + +#include "AbstractMemory.h" +#include "Pointer.h" +#include "Struct.h" +#include "Platform.h" +#include "Type.h" +#include "LastError.h" +#include "Call.h" +#include "ClosurePool.h" +#include "MappedType.h" +#include "Thread.h" +#include "LongDouble.h" +#include "MethodHandle.h" +#include "Function.h" + +typedef struct Function_ { + Pointer base; + FunctionType* info; + MethodHandle* methodHandle; + bool autorelease; + Closure* closure; + VALUE rbProc; + VALUE rbFunctionInfo; +} Function; + +static void function_mark(Function *); +static void function_free(Function *); +static VALUE function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc); +static void callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data); +static bool callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize); +static void* callback_with_gvl(void* data); +static VALUE invoke_callback(VALUE data); +static VALUE save_callback_exception(VALUE data, VALUE exc); + +#define DEFER_ASYNC_CALLBACK 1 + + +#if defined(DEFER_ASYNC_CALLBACK) +static VALUE async_cb_event(void *); +static VALUE async_cb_call(void *); +#endif + +extern int ruby_thread_has_gvl_p(void); +extern int ruby_native_thread_p(void); + +VALUE rbffi_FunctionClass = Qnil; + +#if defined(DEFER_ASYNC_CALLBACK) +static VALUE async_cb_thread = Qnil; +#endif + +static ID id_call = 0, id_to_native = 0, id_from_native = 0, id_cbtable = 0, id_cb_ref = 0; + +struct gvl_callback { + Closure* closure; + void* retval; + void** parameters; + bool done; + rbffi_frame_t *frame; +#if defined(DEFER_ASYNC_CALLBACK) + struct gvl_callback* next; +# ifndef _WIN32 + pthread_cond_t async_cond; + pthread_mutex_t async_mutex; +# else + HANDLE async_event; +# endif +#endif +}; + + +#if defined(DEFER_ASYNC_CALLBACK) +static struct gvl_callback* async_cb_list = NULL; +# ifndef _WIN32 + static pthread_mutex_t async_cb_mutex = PTHREAD_MUTEX_INITIALIZER; + static pthread_cond_t async_cb_cond = PTHREAD_COND_INITIALIZER; +# else + static HANDLE async_cb_cond; + static CRITICAL_SECTION async_cb_lock; +# endif +#endif + + +static VALUE +function_allocate(VALUE klass) +{ + Function *fn; + VALUE obj; + + obj = Data_Make_Struct(klass, Function, function_mark, function_free, fn); + + fn->base.memory.flags = MEM_RD; + fn->base.rbParent = Qnil; + fn->rbProc = Qnil; + fn->rbFunctionInfo = Qnil; + fn->autorelease = true; + + return obj; +} + +static void +function_mark(Function *fn) +{ + rb_gc_mark(fn->base.rbParent); + rb_gc_mark(fn->rbProc); + rb_gc_mark(fn->rbFunctionInfo); +} + +static void +function_free(Function *fn) +{ + if (fn->methodHandle != NULL) { + rbffi_MethodHandle_Free(fn->methodHandle); + } + + if (fn->closure != NULL && fn->autorelease) { + rbffi_Closure_Free(fn->closure); + } + + xfree(fn); +} + +/* + * @param [Type, Symbol] return_type return type for the function + * @param [Array<Type, Symbol>] param_types array of parameters types + * @param [Hash] options see {FFI::FunctionType} for available options + * @return [self] + * A new Function instance. + * + * Define a function from a Proc or a block. + * + * @overload initialize(return_type, param_types, options = {}) { |i| ... } + * @yieldparam i parameters for the function + * @overload initialize(return_type, param_types, proc, options = {}) + * @param [Proc] proc + */ +static VALUE +function_initialize(int argc, VALUE* argv, VALUE self) +{ + + VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbProc = Qnil, rbOptions = Qnil; + VALUE rbFunctionInfo = Qnil; + VALUE infoArgv[3]; + int nargs; + + nargs = rb_scan_args(argc, argv, "22", &rbReturnType, &rbParamTypes, &rbProc, &rbOptions); + + /* + * Callback with block, + * e.g. Function.new(:int, [ :int ]) { |i| blah } + * or Function.new(:int, [ :int ], { :convention => :stdcall }) { |i| blah } + */ + if (rb_block_given_p()) { + if (nargs > 3) { + rb_raise(rb_eArgError, "cannot create function with both proc/address and block"); + } + rbOptions = rbProc; + rbProc = rb_block_proc(); + } else { + /* Callback with proc, or Function with address + * e.g. Function.new(:int, [ :int ], Proc.new { |i| }) + * Function.new(:int, [ :int ], Proc.new { |i| }, { :convention => :stdcall }) + * Function.new(:int, [ :int ], addr) + * Function.new(:int, [ :int ], addr, { :convention => :stdcall }) + */ + } + + infoArgv[0] = rbReturnType; + infoArgv[1] = rbParamTypes; + infoArgv[2] = rbOptions; + rbFunctionInfo = rb_class_new_instance(rbOptions != Qnil ? 3 : 2, infoArgv, rbffi_FunctionTypeClass); + + function_init(self, rbFunctionInfo, rbProc); + + return self; +} + +/* + * call-seq: initialize_copy(other) + * @return [nil] + * DO NOT CALL THIS METHOD + */ +static VALUE +function_initialize_copy(VALUE self, VALUE other) +{ + rb_raise(rb_eRuntimeError, "cannot duplicate function instances"); + return Qnil; +} + +VALUE +rbffi_Function_NewInstance(VALUE rbFunctionInfo, VALUE rbProc) +{ + return function_init(function_allocate(rbffi_FunctionClass), rbFunctionInfo, rbProc); +} + +VALUE +rbffi_Function_ForProc(VALUE rbFunctionInfo, VALUE proc) +{ + VALUE callback, cbref, cbTable; + + cbref = RTEST(rb_ivar_defined(proc, id_cb_ref)) ? rb_ivar_get(proc, id_cb_ref) : Qnil; + /* If the first callback reference has the same function function signature, use it */ + if (cbref != Qnil && CLASS_OF(cbref) == rbffi_FunctionClass) { + Function* fp; + Data_Get_Struct(cbref, Function, fp); + if (fp->rbFunctionInfo == rbFunctionInfo) { + return cbref; + } + } + + cbTable = RTEST(rb_ivar_defined(proc, id_cbtable)) ? rb_ivar_get(proc, id_cbtable) : Qnil; + if (cbTable != Qnil && (callback = rb_hash_aref(cbTable, rbFunctionInfo)) != Qnil) { + return callback; + } + + /* No existing function for the proc with that signature, create a new one and cache it */ + callback = rbffi_Function_NewInstance(rbFunctionInfo, proc); + if (cbref == Qnil) { + /* If there is no other cb already cached for this proc, we can use the ivar slot */ + rb_ivar_set(proc, id_cb_ref, callback); + } else { + /* The proc instance has been used as more than one type of callback, store extras in a hash */ + if(cbTable == Qnil) { + cbTable = rb_hash_new(); + rb_ivar_set(proc, id_cbtable, cbTable); + } + rb_hash_aset(cbTable, rbFunctionInfo, callback); + } + + return callback; +} + +#if !defined(_WIN32) && defined(DEFER_ASYNC_CALLBACK) +static void +after_fork_callback(void) +{ + /* Ensure that a new dispatcher thread is started in a forked process */ + async_cb_thread = Qnil; + pthread_mutex_init(&async_cb_mutex, NULL); + pthread_cond_init(&async_cb_cond, NULL); +} +#endif + +static VALUE +function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc) +{ + Function* fn = NULL; + + Data_Get_Struct(self, Function, fn); + + fn->rbFunctionInfo = rbFunctionInfo; + + Data_Get_Struct(fn->rbFunctionInfo, FunctionType, fn->info); + + if (rb_obj_is_kind_of(rbProc, rbffi_PointerClass)) { + Pointer* orig; + Data_Get_Struct(rbProc, Pointer, orig); + fn->base.memory = orig->memory; + fn->base.rbParent = rbProc; + + } else if (rb_obj_is_kind_of(rbProc, rb_cProc) || rb_respond_to(rbProc, id_call)) { + if (fn->info->closurePool == NULL) { + fn->info->closurePool = rbffi_ClosurePool_New(sizeof(ffi_closure), callback_prep, fn->info); + if (fn->info->closurePool == NULL) { + rb_raise(rb_eNoMemError, "failed to create closure pool"); + } + } + +#if defined(DEFER_ASYNC_CALLBACK) + if (async_cb_thread == Qnil) { + +#if !defined(_WIN32) + if( pthread_atfork(NULL, NULL, after_fork_callback) ){ + rb_warn("FFI: unable to register fork callback"); + } +#endif + + async_cb_thread = rb_thread_create(async_cb_event, NULL); + /* Name thread, for better debugging */ + rb_funcall(async_cb_thread, rb_intern("name="), 1, rb_str_new2("FFI Callback Dispatcher")); + } +#endif + + fn->closure = rbffi_Closure_Alloc(fn->info->closurePool); + fn->closure->info = fn; + fn->base.memory.address = fn->closure->code; + fn->base.memory.size = sizeof(*fn->closure); + fn->autorelease = true; + + } else { + rb_raise(rb_eTypeError, "wrong argument type %s, expected pointer or proc", + rb_obj_classname(rbProc)); + } + + fn->rbProc = rbProc; + + return self; +} + +/* + * call-seq: call(*args) + * @param [Array] args function arguments + * @return [FFI::Type] + * Call the function + */ +static VALUE +function_call(int argc, VALUE* argv, VALUE self) +{ + Function* fn; + + Data_Get_Struct(self, Function, fn); + + return (*fn->info->invoke)(argc, argv, fn->base.memory.address, fn->info); +} + +/* + * call-seq: attach(m, name) + * @param [Module] m + * @param [String] name + * @return [self] + * Attach a Function to the Module +m+ as +name+. + */ +static VALUE +function_attach(VALUE self, VALUE module, VALUE name) +{ + Function* fn; + char var[1024]; + + Data_Get_Struct(self, Function, fn); + + if (fn->info->parameterCount == -1) { + rb_raise(rb_eRuntimeError, "cannot attach variadic functions"); + return Qnil; + } + + if (!rb_obj_is_kind_of(module, rb_cModule)) { + rb_raise(rb_eRuntimeError, "trying to attach function to non-module"); + return Qnil; + } + + if (fn->methodHandle == NULL) { + fn->methodHandle = rbffi_MethodHandle_Alloc(fn->info, fn->base.memory.address); + } + + /* + * Stash the Function in a module variable so it does not get garbage collected + */ + snprintf(var, sizeof(var), "@@%s", StringValueCStr(name)); + rb_cv_set(module, var, self); + + rb_define_singleton_method(module, StringValueCStr(name), + rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1); + + + rb_define_method(module, StringValueCStr(name), + rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1); + + return self; +} + +/* + * call-seq: autorelease = autorelease + * @param [Boolean] autorelease + * @return [self] + * Set +autorelease+ attribute (See {Pointer}). + */ +static VALUE +function_set_autorelease(VALUE self, VALUE autorelease) +{ + Function* fn; + + Data_Get_Struct(self, Function, fn); + + fn->autorelease = RTEST(autorelease); + + return self; +} + +static VALUE +function_autorelease_p(VALUE self) +{ + Function* fn; + + Data_Get_Struct(self, Function, fn); + + return fn->autorelease ? Qtrue : Qfalse; +} + +/* + * call-seq: free + * @return [self] + * Free memory allocated by Function. + */ +static VALUE +function_release(VALUE self) +{ + Function* fn; + + Data_Get_Struct(self, Function, fn); + + if (fn->closure == NULL) { + rb_raise(rb_eRuntimeError, "cannot free function which was not allocated"); + } + + rbffi_Closure_Free(fn->closure); + fn->closure = NULL; + + return self; +} + +static void +callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data) +{ + struct gvl_callback cb = { 0 }; + + cb.closure = (Closure *) user_data; + cb.retval = retval; + cb.parameters = parameters; + cb.done = false; + cb.frame = rbffi_frame_current(); + + if (cb.frame != NULL) cb.frame->exc = Qnil; + + if (ruby_native_thread_p()) { + if(ruby_thread_has_gvl_p()) { + callback_with_gvl(&cb); + } else { + rb_thread_call_with_gvl(callback_with_gvl, &cb); + } +#if defined(DEFER_ASYNC_CALLBACK) && !defined(_WIN32) + } else { + bool empty = false; + + pthread_mutex_init(&cb.async_mutex, NULL); + pthread_cond_init(&cb.async_cond, NULL); + + /* Now signal the async callback thread */ + pthread_mutex_lock(&async_cb_mutex); + empty = async_cb_list == NULL; + cb.next = async_cb_list; + async_cb_list = &cb; + + pthread_cond_signal(&async_cb_cond); + pthread_mutex_unlock(&async_cb_mutex); + + /* Wait for the thread executing the ruby callback to signal it is done */ + pthread_mutex_lock(&cb.async_mutex); + while (!cb.done) { + pthread_cond_wait(&cb.async_cond, &cb.async_mutex); + } + pthread_mutex_unlock(&cb.async_mutex); + pthread_cond_destroy(&cb.async_cond); + pthread_mutex_destroy(&cb.async_mutex); + +#elif defined(DEFER_ASYNC_CALLBACK) && defined(_WIN32) + } else { + bool empty = false; + + cb.async_event = CreateEvent(NULL, FALSE, FALSE, NULL); + + /* Now signal the async callback thread */ + EnterCriticalSection(&async_cb_lock); + empty = async_cb_list == NULL; + cb.next = async_cb_list; + async_cb_list = &cb; + LeaveCriticalSection(&async_cb_lock); + + SetEvent(async_cb_cond); + + /* Wait for the thread executing the ruby callback to signal it is done */ + WaitForSingleObject(cb.async_event, INFINITE); + CloseHandle(cb.async_event); +#endif + } +} + +#if defined(DEFER_ASYNC_CALLBACK) +struct async_wait { + void* cb; + bool stop; +}; + +static void * async_cb_wait(void *); +static void async_cb_stop(void *); + +static VALUE +async_cb_event(void* unused) +{ + struct async_wait w = { 0 }; + + w.stop = false; + while (!w.stop) { + rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w); + if (w.cb != NULL) { + /* Start up a new ruby thread to run the ruby callback */ + VALUE new_thread = rb_thread_create(async_cb_call, w.cb); + /* Name thread, for better debugging */ + rb_funcall(new_thread, rb_intern("name="), 1, rb_str_new2("FFI Callback Runner")); + } + } + + return Qnil; +} + +#ifdef _WIN32 +static void * +async_cb_wait(void *data) +{ + struct async_wait* w = (struct async_wait *) data; + + w->cb = NULL; + + EnterCriticalSection(&async_cb_lock); + + while (!w->stop && async_cb_list == NULL) { + LeaveCriticalSection(&async_cb_lock); + WaitForSingleObject(async_cb_cond, INFINITE); + EnterCriticalSection(&async_cb_lock); + } + + if (async_cb_list != NULL) { + w->cb = async_cb_list; + async_cb_list = async_cb_list->next; + } + + LeaveCriticalSection(&async_cb_lock); + + return NULL; +} + +static void +async_cb_stop(void *data) +{ + struct async_wait* w = (struct async_wait *) data; + + EnterCriticalSection(&async_cb_lock); + w->stop = true; + LeaveCriticalSection(&async_cb_lock); + SetEvent(async_cb_cond); +} + +#else +static void * +async_cb_wait(void *data) +{ + struct async_wait* w = (struct async_wait *) data; + + w->cb = NULL; + + pthread_mutex_lock(&async_cb_mutex); + + while (!w->stop && async_cb_list == NULL) { + pthread_cond_wait(&async_cb_cond, &async_cb_mutex); + } + + if (async_cb_list != NULL) { + w->cb = async_cb_list; + async_cb_list = async_cb_list->next; + } + + pthread_mutex_unlock(&async_cb_mutex); + + return NULL; +} + +static void +async_cb_stop(void *data) +{ + struct async_wait* w = (struct async_wait *) data; + + pthread_mutex_lock(&async_cb_mutex); + w->stop = true; + pthread_cond_signal(&async_cb_cond); + pthread_mutex_unlock(&async_cb_mutex); +} +#endif + +static VALUE +async_cb_call(void *data) +{ + struct gvl_callback* cb = (struct gvl_callback *) data; + + callback_with_gvl(data); + + /* Signal the original native thread that the ruby code has completed */ +#ifdef _WIN32 + SetEvent(cb->async_event); +#else + pthread_mutex_lock(&cb->async_mutex); + cb->done = true; + pthread_cond_signal(&cb->async_cond); + pthread_mutex_unlock(&cb->async_mutex); +#endif + + return Qnil; +} + +#endif + +static void * +callback_with_gvl(void* data) +{ + rb_rescue2(invoke_callback, (VALUE) data, save_callback_exception, (VALUE) data, rb_eException, (VALUE) 0); + return NULL; +} + +static VALUE +invoke_callback(VALUE data) +{ + struct gvl_callback* cb = (struct gvl_callback *) data; + + Function* fn = (Function *) cb->closure->info; + FunctionType *cbInfo = fn->info; + Type* returnType = cbInfo->returnType; + void* retval = cb->retval; + void** parameters = cb->parameters; + VALUE* rbParams; + VALUE rbReturnType = cbInfo->rbReturnType; + VALUE rbReturnValue; + int i; + + rbParams = ALLOCA_N(VALUE, cbInfo->parameterCount); + for (i = 0; i < cbInfo->parameterCount; ++i) { + VALUE param; + Type* paramType = cbInfo->parameterTypes[i]; + VALUE rbParamType = rb_ary_entry(cbInfo->rbParameterTypes, i); + + if (unlikely(paramType->nativeType == NATIVE_MAPPED)) { + rbParamType = ((MappedType *) paramType)->rbType; + paramType = ((MappedType *) paramType)->type; + } + + switch (paramType->nativeType) { + case NATIVE_INT8: + param = INT2NUM(*(int8_t *) parameters[i]); + break; + case NATIVE_UINT8: + param = UINT2NUM(*(uint8_t *) parameters[i]); + break; + case NATIVE_INT16: + param = INT2NUM(*(int16_t *) parameters[i]); + break; + case NATIVE_UINT16: + param = UINT2NUM(*(uint16_t *) parameters[i]); + break; + case NATIVE_INT32: + param = INT2NUM(*(int32_t *) parameters[i]); + break; + case NATIVE_UINT32: + param = UINT2NUM(*(uint32_t *) parameters[i]); + break; + case NATIVE_INT64: + param = LL2NUM(*(int64_t *) parameters[i]); + break; + case NATIVE_UINT64: + param = ULL2NUM(*(uint64_t *) parameters[i]); + break; + case NATIVE_LONG: + param = LONG2NUM(*(long *) parameters[i]); + break; + case NATIVE_ULONG: + param = ULONG2NUM(*(unsigned long *) parameters[i]); + break; + case NATIVE_FLOAT32: + param = rb_float_new(*(float *) parameters[i]); + break; + case NATIVE_FLOAT64: + param = rb_float_new(*(double *) parameters[i]); + break; + case NATIVE_LONGDOUBLE: + param = rbffi_longdouble_new(*(long double *) parameters[i]); + break; + case NATIVE_STRING: + param = (*(void **) parameters[i] != NULL) ? rb_str_new2(*(char **) parameters[i]) : Qnil; + break; + case NATIVE_POINTER: + param = rbffi_Pointer_NewInstance(*(void **) parameters[i]); + break; + case NATIVE_BOOL: + param = (*(uint8_t *) parameters[i]) ? Qtrue : Qfalse; + break; + + case NATIVE_FUNCTION: + case NATIVE_STRUCT: + param = rbffi_NativeValue_ToRuby(paramType, rbParamType, parameters[i]); + break; + + default: + param = Qnil; + break; + } + + /* Convert the native value into a custom ruby value */ + if (unlikely(cbInfo->parameterTypes[i]->nativeType == NATIVE_MAPPED)) { + VALUE values[] = { param, Qnil }; + param = rb_funcall2(((MappedType *) cbInfo->parameterTypes[i])->rbConverter, id_from_native, 2, values); + } + + rbParams[i] = param; + } + + rbReturnValue = rb_funcall2(fn->rbProc, id_call, cbInfo->parameterCount, rbParams); + + if (unlikely(returnType->nativeType == NATIVE_MAPPED)) { + VALUE values[] = { rbReturnValue, Qnil }; + rbReturnValue = rb_funcall2(((MappedType *) returnType)->rbConverter, id_to_native, 2, values); + rbReturnType = ((MappedType *) returnType)->rbType; + returnType = ((MappedType* ) returnType)->type; + } + + if (rbReturnValue == Qnil || TYPE(rbReturnValue) == T_NIL) { + memset(retval, 0, returnType->ffiType->size); + } else switch (returnType->nativeType) { + case NATIVE_INT8: + case NATIVE_INT16: + case NATIVE_INT32: + *((ffi_sarg *) retval) = NUM2INT(rbReturnValue); + break; + case NATIVE_UINT8: + case NATIVE_UINT16: + case NATIVE_UINT32: + *((ffi_arg *) retval) = NUM2UINT(rbReturnValue); + break; + case NATIVE_INT64: + *((int64_t *) retval) = NUM2LL(rbReturnValue); + break; + case NATIVE_UINT64: + *((uint64_t *) retval) = NUM2ULL(rbReturnValue); + break; + case NATIVE_LONG: + *((ffi_sarg *) retval) = NUM2LONG(rbReturnValue); + break; + case NATIVE_ULONG: + *((ffi_arg *) retval) = NUM2ULONG(rbReturnValue); + break; + case NATIVE_FLOAT32: + *((float *) retval) = (float) NUM2DBL(rbReturnValue); + break; + case NATIVE_FLOAT64: + *((double *) retval) = NUM2DBL(rbReturnValue); + break; + case NATIVE_LONGDOUBLE: + *((long double *) retval) = rbffi_num2longdouble(rbReturnValue); + break; + case NATIVE_POINTER: + if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) { + *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address; + } else { + /* Default to returning NULL if not a value pointer object. handles nil case as well */ + *((void **) retval) = NULL; + } + break; + + case NATIVE_BOOL: + *((ffi_arg *) retval) = rbReturnValue == Qtrue; + break; + + case NATIVE_FUNCTION: + if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) { + + *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address; + + } else if (rb_obj_is_kind_of(rbReturnValue, rb_cProc) || rb_respond_to(rbReturnValue, id_call)) { + VALUE function; + + function = rbffi_Function_ForProc(rbReturnType, rbReturnValue); + + *((void **) retval) = ((AbstractMemory *) DATA_PTR(function))->address; + } else { + *((void **) retval) = NULL; + } + break; + + case NATIVE_STRUCT: + if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_StructClass)) { + AbstractMemory* memory = ((Struct *) DATA_PTR(rbReturnValue))->pointer; + + if (memory->address != NULL) { + memcpy(retval, memory->address, returnType->ffiType->size); + + } else { + memset(retval, 0, returnType->ffiType->size); + } + + } else { + memset(retval, 0, returnType->ffiType->size); + } + break; + + default: + *((ffi_arg *) retval) = 0; + break; + } + + return Qnil; +} + +static VALUE +save_callback_exception(VALUE data, VALUE exc) +{ + struct gvl_callback* cb = (struct gvl_callback *) data; + + memset(cb->retval, 0, ((Function *) cb->closure->info)->info->returnType->ffiType->size); + if (cb->frame != NULL) cb->frame->exc = exc; + + return Qnil; +} + +static bool +callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) +{ + FunctionType* fnInfo = (FunctionType *) ctx; + ffi_status ffiStatus; + + ffiStatus = ffi_prep_closure_loc(closure->pcl, &fnInfo->ffi_cif, callback_invoke, closure, code); + if (ffiStatus != FFI_OK) { + snprintf(errmsg, errmsgsize, "ffi_prep_closure_loc failed. status=%#x", ffiStatus); + return false; + } + + return true; +} + +void +rbffi_Function_Init(VALUE moduleFFI) +{ + rbffi_FunctionInfo_Init(moduleFFI); + /* + * Document-class: FFI::Function < FFI::Pointer + */ + rbffi_FunctionClass = rb_define_class_under(moduleFFI, "Function", rbffi_PointerClass); + + rb_global_variable(&rbffi_FunctionClass); + rb_define_alloc_func(rbffi_FunctionClass, function_allocate); + + rb_define_method(rbffi_FunctionClass, "initialize", function_initialize, -1); + rb_define_method(rbffi_FunctionClass, "initialize_copy", function_initialize_copy, 1); + rb_define_method(rbffi_FunctionClass, "call", function_call, -1); + rb_define_method(rbffi_FunctionClass, "attach", function_attach, 2); + rb_define_method(rbffi_FunctionClass, "free", function_release, 0); + rb_define_method(rbffi_FunctionClass, "autorelease=", function_set_autorelease, 1); + /* + * call-seq: autorelease + * @return [Boolean] + * Get +autorelease+ attribute. + * Synonymous for {#autorelease?}. + */ + rb_define_method(rbffi_FunctionClass, "autorelease", function_autorelease_p, 0); + /* + * call-seq: autorelease? + * @return [Boolean] +autorelease+ attribute + * Get +autorelease+ attribute. + */ + rb_define_method(rbffi_FunctionClass, "autorelease?", function_autorelease_p, 0); + + id_call = rb_intern("call"); + id_cbtable = rb_intern("@__ffi_callback_table__"); + id_cb_ref = rb_intern("@__ffi_callback__"); + id_to_native = rb_intern("to_native"); + id_from_native = rb_intern("from_native"); +#if defined(_WIN32) + InitializeCriticalSection(&async_cb_lock); + async_cb_cond = CreateEvent(NULL, FALSE, FALSE, NULL); +#endif +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Function.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Function.h new file mode 100644 index 000000000000..406b4d828f5f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Function.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_FUNCTION_H +#define RBFFI_FUNCTION_H + +#ifdef __cplusplus +extern "C" { +#endif + +# include <stdbool.h> + +#include <ffi.h> + +typedef struct FunctionType_ FunctionType; + +#include "Type.h" +#include "Call.h" +#include "ClosurePool.h" + +struct FunctionType_ { + Type type; /* The native type of a FunctionInfo object */ + VALUE rbReturnType; + VALUE rbParameterTypes; + + Type* returnType; + Type** parameterTypes; + NativeType* nativeParameterTypes; + ffi_type* ffiReturnType; + ffi_type** ffiParameterTypes; + ffi_cif ffi_cif; + Invoker invoke; + ClosurePool* closurePool; + int parameterCount; + int flags; + ffi_abi abi; + int callbackCount; + VALUE* callbackParameters; + VALUE rbEnums; + bool ignoreErrno; + bool blocking; + bool hasStruct; +}; + +extern VALUE rbffi_FunctionTypeClass, rbffi_FunctionClass; + +void rbffi_Function_Init(VALUE moduleFFI); +VALUE rbffi_Function_NewInstance(VALUE functionInfo, VALUE proc); +VALUE rbffi_Function_ForProc(VALUE cbInfo, VALUE proc); +void rbffi_FunctionInfo_Init(VALUE moduleFFI); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_FUNCTION_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Function.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Function.o new file mode 100644 index 000000000000..18ed29d29dc8 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Function.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/FunctionInfo.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/FunctionInfo.c new file mode 100644 index 000000000000..64e9874924c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/FunctionInfo.c @@ -0,0 +1,266 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * Copyright (C) 2009 Andrea Fazzi <andrea.fazzi@alcacoop.it> + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +# include <sys/param.h> +#endif +#include <sys/types.h> +#include <stdio.h> + +#include <stdint.h> +#include <stdbool.h> + +#include <errno.h> +#include <ruby.h> + +#include <ffi.h> +#include "rbffi.h" +#include "compat.h" + +#include "AbstractMemory.h" +#include "Types.h" +#include "Type.h" +#include "StructByValue.h" +#include "Function.h" + +static VALUE fntype_allocate(VALUE klass); +static VALUE fntype_initialize(int argc, VALUE* argv, VALUE self); +static void fntype_mark(FunctionType*); +static void fntype_free(FunctionType *); + +VALUE rbffi_FunctionTypeClass = Qnil; + +static VALUE +fntype_allocate(VALUE klass) +{ + FunctionType* fnInfo; + VALUE obj = Data_Make_Struct(klass, FunctionType, fntype_mark, fntype_free, fnInfo); + + fnInfo->type.ffiType = &ffi_type_pointer; + fnInfo->type.nativeType = NATIVE_FUNCTION; + fnInfo->rbReturnType = Qnil; + fnInfo->rbParameterTypes = Qnil; + fnInfo->rbEnums = Qnil; + fnInfo->invoke = rbffi_CallFunction; + fnInfo->closurePool = NULL; + + return obj; +} + +static void +fntype_mark(FunctionType* fnInfo) +{ + rb_gc_mark(fnInfo->rbReturnType); + rb_gc_mark(fnInfo->rbParameterTypes); + rb_gc_mark(fnInfo->rbEnums); + if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) { + rb_gc_mark_locations(&fnInfo->callbackParameters[0], &fnInfo->callbackParameters[fnInfo->callbackCount]); + } +} + +static void +fntype_free(FunctionType* fnInfo) +{ + xfree(fnInfo->parameterTypes); + xfree(fnInfo->ffiParameterTypes); + xfree(fnInfo->nativeParameterTypes); + xfree(fnInfo->callbackParameters); + if (fnInfo->closurePool != NULL) { + rbffi_ClosurePool_Free(fnInfo->closurePool); + } + xfree(fnInfo); +} + +/* + * call-seq: initialize(return_type, param_types, options={}) + * @param [Type, Symbol] return_type return type for the function + * @param [Array<Type, Symbol>] param_types array of parameters types + * @param [Hash] options + * @option options [Boolean] :blocking set to true if the C function is a blocking call + * @option options [Symbol] :convention calling convention see {FFI::Library#calling_convention} + * @option options [FFI::Enums] :enums + * @return [self] + * A new FunctionType instance. + */ +static VALUE +fntype_initialize(int argc, VALUE* argv, VALUE self) +{ + FunctionType *fnInfo; + ffi_status status; + VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbOptions = Qnil; + VALUE rbEnums = Qnil, rbConvention = Qnil, rbBlocking = Qnil; +#if defined(X86_WIN32) + VALUE rbConventionStr; +#endif + int i, nargs; + + nargs = rb_scan_args(argc, argv, "21", &rbReturnType, &rbParamTypes, &rbOptions); + if (nargs >= 3 && rbOptions != Qnil) { + rbConvention = rb_hash_aref(rbOptions, ID2SYM(rb_intern("convention"))); + rbEnums = rb_hash_aref(rbOptions, ID2SYM(rb_intern("enums"))); + rbBlocking = rb_hash_aref(rbOptions, ID2SYM(rb_intern("blocking"))); + } + + Check_Type(rbParamTypes, T_ARRAY); + + Data_Get_Struct(self, FunctionType, fnInfo); + fnInfo->parameterCount = (int) RARRAY_LEN(rbParamTypes); + fnInfo->parameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->parameterTypes)); + fnInfo->ffiParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(ffi_type *)); + fnInfo->nativeParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->nativeParameterTypes)); + fnInfo->rbParameterTypes = rb_ary_new2(fnInfo->parameterCount); + fnInfo->rbEnums = rbEnums; + fnInfo->blocking = RTEST(rbBlocking); + fnInfo->hasStruct = false; + + for (i = 0; i < fnInfo->parameterCount; ++i) { + VALUE entry = rb_ary_entry(rbParamTypes, i); + VALUE type = rbffi_Type_Lookup(entry); + + if (!RTEST(type)) { + VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL); + rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName)); + } + + if (rb_obj_is_kind_of(type, rbffi_FunctionTypeClass)) { + REALLOC_N(fnInfo->callbackParameters, VALUE, fnInfo->callbackCount + 1); + fnInfo->callbackParameters[fnInfo->callbackCount++] = type; + } + + if (rb_obj_is_kind_of(type, rbffi_StructByValueClass)) { + fnInfo->hasStruct = true; + } + + rb_ary_push(fnInfo->rbParameterTypes, type); + Data_Get_Struct(type, Type, fnInfo->parameterTypes[i]); + fnInfo->ffiParameterTypes[i] = fnInfo->parameterTypes[i]->ffiType; + fnInfo->nativeParameterTypes[i] = fnInfo->parameterTypes[i]->nativeType; + } + + fnInfo->rbReturnType = rbffi_Type_Lookup(rbReturnType); + if (!RTEST(fnInfo->rbReturnType)) { + VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL); + rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName)); + } + + if (rb_obj_is_kind_of(fnInfo->rbReturnType, rbffi_StructByValueClass)) { + fnInfo->hasStruct = true; + } + + Data_Get_Struct(fnInfo->rbReturnType, Type, fnInfo->returnType); + fnInfo->ffiReturnType = fnInfo->returnType->ffiType; + +#if defined(X86_WIN32) + rbConventionStr = (rbConvention != Qnil) ? rb_funcall2(rbConvention, rb_intern("to_s"), 0, NULL) : Qnil; + fnInfo->abi = (rbConventionStr != Qnil && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0) + ? FFI_STDCALL : FFI_DEFAULT_ABI; +#else + fnInfo->abi = FFI_DEFAULT_ABI; +#endif + + status = ffi_prep_cif(&fnInfo->ffi_cif, fnInfo->abi, fnInfo->parameterCount, + fnInfo->ffiReturnType, fnInfo->ffiParameterTypes); + switch (status) { + case FFI_BAD_ABI: + rb_raise(rb_eArgError, "Invalid ABI specified"); + case FFI_BAD_TYPEDEF: + rb_raise(rb_eArgError, "Invalid argument type specified"); + case FFI_OK: + break; + default: + rb_raise(rb_eArgError, "Unknown FFI error"); + } + + fnInfo->invoke = rbffi_GetInvoker(fnInfo); + + return self; +} + +/* + * call-seq: result_type + * @return [Type] + * Get the return type of the function type + */ +static VALUE +fntype_result_type(VALUE self) +{ + FunctionType* ft; + + Data_Get_Struct(self, FunctionType, ft); + + return ft->rbReturnType; +} + +/* + * call-seq: param_types + * @return [Array<Type>] + * Get parameters types. + */ +static VALUE +fntype_param_types(VALUE self) +{ + FunctionType* ft; + + Data_Get_Struct(self, FunctionType, ft); + + return rb_ary_dup(ft->rbParameterTypes); +} + +void +rbffi_FunctionInfo_Init(VALUE moduleFFI) +{ + VALUE ffi_Type; + + ffi_Type = rbffi_TypeClass; + + /* + * Document-class: FFI::FunctionType < FFI::Type + */ + rbffi_FunctionTypeClass = rb_define_class_under(moduleFFI, "FunctionType",ffi_Type); + rb_global_variable(&rbffi_FunctionTypeClass); + /* + * Document-const: FFI::CallbackInfo = FFI::FunctionType + */ + rb_define_const(moduleFFI, "CallbackInfo", rbffi_FunctionTypeClass); + /* + * Document-const: FFI::FunctionInfo = FFI::FunctionType + */ + rb_define_const(moduleFFI, "FunctionInfo", rbffi_FunctionTypeClass); + /* + * Document-const: FFI::Type::Function = FFI::FunctionType + */ + rb_define_const(ffi_Type, "Function", rbffi_FunctionTypeClass); + + rb_define_alloc_func(rbffi_FunctionTypeClass, fntype_allocate); + rb_define_method(rbffi_FunctionTypeClass, "initialize", fntype_initialize, -1); + rb_define_method(rbffi_FunctionTypeClass, "result_type", fntype_result_type, 0); + rb_define_method(rbffi_FunctionTypeClass, "param_types", fntype_param_types, 0); + +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/FunctionInfo.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/FunctionInfo.o new file mode 100644 index 000000000000..35baac5d961d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/FunctionInfo.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LastError.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LastError.c new file mode 100644 index 000000000000..6beeceff1797 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LastError.c @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (C) 2009 Aman Gupta <aman@tmm1.net> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +# include <sys/param.h> +#endif +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#include <errno.h> +#include <ruby.h> + +#include "LastError.h" + +#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__) +# include <pthread.h> +# define USE_PTHREAD_LOCAL +#endif + +#if defined(__CYGWIN__) +typedef uint32_t DWORD; +DWORD __stdcall GetLastError(void); +void __stdcall SetLastError(DWORD); +#endif + +typedef struct ThreadData { + int td_errno; +#if defined(_WIN32) || defined(__CYGWIN__) + DWORD td_winapi_errno; +#endif +} ThreadData; + +#if defined(USE_PTHREAD_LOCAL) +static pthread_key_t threadDataKey; +#endif + +static inline ThreadData* thread_data_get(void); + +#if defined(USE_PTHREAD_LOCAL) + +static ThreadData* +thread_data_init(void) +{ + ThreadData* td = xcalloc(1, sizeof(ThreadData)); + + pthread_setspecific(threadDataKey, td); + + return td; +} + + +static inline ThreadData* +thread_data_get(void) +{ + ThreadData* td = pthread_getspecific(threadDataKey); + return td != NULL ? td : thread_data_init(); +} + +static void +thread_data_free(void *ptr) +{ + xfree(ptr); +} + +#else +static ID id_thread_data; + +static ThreadData* +thread_data_init(void) +{ + ThreadData* td; + VALUE obj; + + obj = Data_Make_Struct(rb_cObject, ThreadData, NULL, -1, td); + rb_thread_local_aset(rb_thread_current(), id_thread_data, obj); + + return td; +} + +static inline ThreadData* +thread_data_get() +{ + VALUE obj = rb_thread_local_aref(rb_thread_current(), id_thread_data); + + if (obj != Qnil && TYPE(obj) == T_DATA) { + return (ThreadData *) DATA_PTR(obj); + } + + return thread_data_init(); +} + +#endif + + +/* + * call-seq: error + * @return [Numeric] + * Get +errno+ value. + */ +static VALUE +get_last_error(VALUE self) +{ + return INT2NUM(thread_data_get()->td_errno); +} + +#if defined(_WIN32) || defined(__CYGWIN__) +/* + * call-seq: winapi_error + * @return [Numeric] + * Get +GetLastError()+ value. Only Windows or Cygwin. + */ +static VALUE +get_last_winapi_error(VALUE self) +{ + return INT2NUM(thread_data_get()->td_winapi_errno); +} +#endif + + +/* + * call-seq: error(error) + * @param [Numeric] error + * @return [nil] + * Set +errno+ value. + */ +static VALUE +set_last_error(VALUE self, VALUE error) +{ + +#ifdef _WIN32 + SetLastError(NUM2INT(error)); +#else + errno = NUM2INT(error); +#endif + + return Qnil; +} + +#if defined(_WIN32) || defined(__CYGWIN__) +/* + * call-seq: error(error) + * @param [Numeric] error + * @return [nil] + * Set +GetLastError()+ value. Only on Windows and Cygwin. + */ +static VALUE +set_last_winapi_error(VALUE self, VALUE error) +{ + SetLastError(NUM2INT(error)); + return Qnil; +} +#endif + + +void +rbffi_save_errno(void) +{ + int error = 0; +#ifdef _WIN32 + error = GetLastError(); +#else + error = errno; +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) + DWORD winapi_error = GetLastError(); + thread_data_get()->td_winapi_errno = winapi_error; +#endif + + thread_data_get()->td_errno = error; +} + +void +rbffi_LastError_Init(VALUE moduleFFI) +{ + /* + * Document-module: FFI::LastError + * This module defines a couple of method to set and get +errno+ + * for current thread. + */ + VALUE moduleError = rb_define_module_under(moduleFFI, "LastError"); + + rb_define_module_function(moduleError, "error", get_last_error, 0); + rb_define_module_function(moduleError, "error=", set_last_error, 1); + +#if defined(_WIN32) || defined(__CYGWIN__) + rb_define_module_function(moduleError, "winapi_error", get_last_winapi_error, 0); + rb_define_module_function(moduleError, "winapi_error=", set_last_winapi_error, 1); +#endif + +#if defined(USE_PTHREAD_LOCAL) + pthread_key_create(&threadDataKey, thread_data_free); +#else + id_thread_data = rb_intern("ffi_thread_local_data"); +#endif /* USE_PTHREAD_LOCAL */ +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LastError.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LastError.h new file mode 100644 index 000000000000..ee1dfbb2d9a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LastError.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_LASTERROR_H +#define RBFFI_LASTERROR_H + +#ifdef __cplusplus +extern "C" { +#endif + + +void rbffi_LastError_Init(VALUE moduleFFI); + +void rbffi_save_errno(void); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_LASTERROR_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LastError.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LastError.o new file mode 100644 index 000000000000..e22aa6d91002 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LastError.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LongDouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LongDouble.c new file mode 100644 index 000000000000..c95f2fd13a50 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LongDouble.c @@ -0,0 +1,65 @@ +#include "LongDouble.h" +#include <stdio.h> +#include <stdarg.h> +#include <float.h> + +#if defined (__CYGWIN__) || defined(__INTERIX) || defined(_MSC_VER) +# define strtold(str, endptr) ((long double) strtod((str), (endptr))) +#endif /* defined (__CYGWIN__) */ + +static VALUE rb_cBigDecimal = Qnil; +static VALUE bigdecimal_load(VALUE unused); +static VALUE bigdecimal_failed(VALUE value, VALUE exc); + +VALUE +rbffi_longdouble_new(long double ld) +{ + if (!RTEST(rb_cBigDecimal)) { + /* allow fallback if the bigdecimal library is unavailable in future ruby versions */ + rb_cBigDecimal = rb_rescue(bigdecimal_load, Qnil, bigdecimal_failed, rb_cObject); + } + + if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject) { + char buf[128]; + return rb_funcall(rb_mKernel, rb_intern("BigDecimal"), 1, rb_str_new(buf, sprintf(buf, "%.35Le", ld))); + } + + /* Fall through to handling as a float */ + return rb_float_new(ld); +} + +long double +rbffi_num2longdouble(VALUE value) +{ + if (TYPE(value) == T_FLOAT) { + return rb_num2dbl(value); + } + + if (!RTEST(rb_cBigDecimal) && rb_const_defined(rb_cObject, rb_intern("BigDecimal"))) { + rb_cBigDecimal = rb_const_get(rb_cObject, rb_intern("BigDecimal")); + } + + if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject && RTEST(rb_obj_is_kind_of(value, rb_cBigDecimal))) { + VALUE s = rb_funcall(value, rb_intern("to_s"), 1, rb_str_new2("E")); + long double ret = strtold(RSTRING_PTR(s), NULL); + RB_GC_GUARD(s); + return ret; + } + + /* Fall through to handling as a float */ + return rb_num2dbl(value); +} + + +static VALUE +bigdecimal_load(VALUE unused) +{ + rb_require("bigdecimal"); + return rb_const_get(rb_cObject, rb_intern("BigDecimal")); +} + +static VALUE +bigdecimal_failed(VALUE value, VALUE exc) +{ + return value; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LongDouble.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LongDouble.h new file mode 100644 index 000000000000..079e890449b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LongDouble.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2012, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_LONGDOUBLE_H +#define RBFFI_LONGDOUBLE_H + +#include <ruby.h> + +#ifdef __cplusplus +extern "C" { +#endif + +extern VALUE rbffi_longdouble_new(long double ld); +extern long double rbffi_num2longdouble(VALUE value); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_LONGDOUBLE_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LongDouble.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LongDouble.o new file mode 100644 index 000000000000..42710a0c4026 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/LongDouble.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Makefile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Makefile new file mode 100644 index 000000000000..7bc1da570c2a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Makefile @@ -0,0 +1,265 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 +hdrdir = $(topdir) +arch_hdrdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/home/app/.rbenv/versions/2.5.1 +rubysitearchprefix = $(rubylibprefix)/$(sitearch) +rubyarchprefix = $(rubylibprefix)/$(arch) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) +sitearchhdrdir = $(sitehdrdir)/$(sitearch) +rubyarchhdrdir = $(rubyhdrdir)/$(arch) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(vendorlibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)./.gem.20211005-8-aaauki +sitelibdir = $(DESTDIR)./.gem.20211005-8-aaauki +sitedir = $(rubylibprefix)/site_ruby +rubyarchdir = $(rubylibdir)/$(arch) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +localstatedir = $(prefix)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(prefix)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC = gcc +CXX = g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = extconf.h +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = $(optflags) $(debugflags) $(warnflags) +optflags = -O3 +debugflags = -ggdb3 +warnflags = +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) $(cflags) -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\" -I/home/app/.rbenv/versions/2.5.1/include $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) $(cxxflags) $(ARCH_FLAG) +ldflags = -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,--exclude-libs,ALL +dldflags = -L/home/app/.rbenv/versions/2.5.1/lib -Wl,--compress-debug-sections=zlib +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) +RUBY_SO_NAME = ruby +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux +sitearch = $(arch) +ruby_version = 2.5.0 +ruby = $(bindir)/$(RUBY_BASE_NAME) +RUBY = $(ruby) +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h $(RUBY_EXTCONF_H) + +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /usr/bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(libdir) +LIBPATH = -L. -L$(libdir) -Wl,-rpath,$(libdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc +ORIG_SRCS = AbstractMemory.c ArrayType.c Buffer.c Call.c ClosurePool.c DynamicLibrary.c Function.c FunctionInfo.c LastError.c LongDouble.c MappedType.c MemoryPointer.c MethodHandle.c Platform.c Pointer.c Struct.c StructByValue.c StructLayout.c Thread.c Type.c Types.c Variadic.c ffi.c +SRCS = $(ORIG_SRCS) +OBJS = AbstractMemory.o ArrayType.o Buffer.o Call.o ClosurePool.o DynamicLibrary.o Function.o FunctionInfo.o LastError.o LongDouble.o MappedType.o MemoryPointer.o MethodHandle.o Platform.o Pointer.o Struct.o StructByValue.o StructLayout.o Thread.o Type.o Types.o Variadic.o ffi.o +HDRS = $(srcdir)/extconf.h $(srcdir)/compat.h $(srcdir)/StructByValue.h $(srcdir)/Platform.h $(srcdir)/AbstractMemory.h $(srcdir)/MappedType.h $(srcdir)/Thread.h $(srcdir)/rbffi.h $(srcdir)/rbffi_endian.h $(srcdir)/Function.h $(srcdir)/MemoryPointer.h $(srcdir)/DynamicLibrary.h $(srcdir)/Struct.h $(srcdir)/Type.h $(srcdir)/ArrayType.h $(srcdir)/Types.h $(srcdir)/Pointer.h $(srcdir)/LastError.h $(srcdir)/LongDouble.h $(srcdir)/ClosurePool.h $(srcdir)/MethodHandle.h $(srcdir)/Call.h +LOCAL_HDRS = +TARGET = ffi_c +TARGET_NAME = ffi_c +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) +ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) +CLEANOBJS = *.o *.bak + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.time + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TIMESTAMP_DIR)/.sitearchdir.time: + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object $(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) +LIBFFI_HOST=--host= +include ${srcdir}/libffi.mk diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MappedType.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MappedType.c new file mode 100644 index 000000000000..d1a41894b692 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MappedType.c @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2010, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <ruby.h> + +#include <ffi.h> +#include "rbffi.h" + +#include "Type.h" +#include "MappedType.h" + + +static VALUE mapped_allocate(VALUE); +static VALUE mapped_initialize(VALUE, VALUE); +static void mapped_mark(MappedType *); +static ID id_native_type, id_to_native, id_from_native; + +VALUE rbffi_MappedTypeClass = Qnil; + +static VALUE +mapped_allocate(VALUE klass) +{ + MappedType* m; + + VALUE obj = Data_Make_Struct(klass, MappedType, mapped_mark, -1, m); + + m->rbConverter = Qnil; + m->rbType = Qnil; + m->type = NULL; + m->base.nativeType = NATIVE_MAPPED; + m->base.ffiType = &ffi_type_void; + + return obj; +} + +/* + * call-seq: initialize(converter) + * @param [#native_type, #to_native, #from_native] converter +converter+ must respond to + * all these methods + * @return [self] + */ +static VALUE +mapped_initialize(VALUE self, VALUE rbConverter) +{ + MappedType* m = NULL; + + if (!rb_respond_to(rbConverter, id_native_type)) { + rb_raise(rb_eNoMethodError, "native_type method not implemented"); + } + + if (!rb_respond_to(rbConverter, id_to_native)) { + rb_raise(rb_eNoMethodError, "to_native method not implemented"); + } + + if (!rb_respond_to(rbConverter, id_from_native)) { + rb_raise(rb_eNoMethodError, "from_native method not implemented"); + } + + Data_Get_Struct(self, MappedType, m); + m->rbType = rb_funcall2(rbConverter, id_native_type, 0, NULL); + if (!(rb_obj_is_kind_of(m->rbType, rbffi_TypeClass))) { + rb_raise(rb_eTypeError, "native_type did not return instance of FFI::Type"); + } + + m->rbConverter = rbConverter; + Data_Get_Struct(m->rbType, Type, m->type); + m->base.ffiType = m->type->ffiType; + + return self; +} + +static void +mapped_mark(MappedType* m) +{ + rb_gc_mark(m->rbType); + rb_gc_mark(m->rbConverter); +} + +/* + * call-seq: mapped_type.native_type + * @return [Type] + * Get native type of mapped type. + */ +static VALUE +mapped_native_type(VALUE self) +{ + MappedType*m = NULL; + Data_Get_Struct(self, MappedType, m); + + return m->rbType; +} + +/* + * call-seq: mapped_type.to_native(*args) + * @param args depends on {FFI::DataConverter} used to initialize +self+ + */ +static VALUE +mapped_to_native(int argc, VALUE* argv, VALUE self) +{ + MappedType*m = NULL; + + Data_Get_Struct(self, MappedType, m); + + return rb_funcall2(m->rbConverter, id_to_native, argc, argv); +} + +/* + * call-seq: mapped_type.from_native(*args) + * @param args depends on {FFI::DataConverter} used to initialize +self+ + */ +static VALUE +mapped_from_native(int argc, VALUE* argv, VALUE self) +{ + MappedType*m = NULL; + + Data_Get_Struct(self, MappedType, m); + + return rb_funcall2(m->rbConverter, id_from_native, argc, argv); +} + +void +rbffi_MappedType_Init(VALUE moduleFFI) +{ + /* + * Document-class: FFI::Type::Mapped < FFI::Type + */ + rbffi_MappedTypeClass = rb_define_class_under(rbffi_TypeClass, "Mapped", rbffi_TypeClass); + + rb_global_variable(&rbffi_MappedTypeClass); + + id_native_type = rb_intern("native_type"); + id_to_native = rb_intern("to_native"); + id_from_native = rb_intern("from_native"); + + rb_define_alloc_func(rbffi_MappedTypeClass, mapped_allocate); + rb_define_method(rbffi_MappedTypeClass, "initialize", mapped_initialize, 1); + rb_define_method(rbffi_MappedTypeClass, "type", mapped_native_type, 0); + rb_define_method(rbffi_MappedTypeClass, "native_type", mapped_native_type, 0); + rb_define_method(rbffi_MappedTypeClass, "to_native", mapped_to_native, -1); + rb_define_method(rbffi_MappedTypeClass, "from_native", mapped_from_native, -1); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MappedType.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MappedType.h new file mode 100644 index 000000000000..4b26cc1c6240 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MappedType.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2010, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_MAPPEDTYPE_H +#define RBFFI_MAPPEDTYPE_H + + +#include <ruby.h> + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct MappedType_ { + Type base; + Type* type; + VALUE rbConverter; + VALUE rbType; + +} MappedType; + +void rbffi_MappedType_Init(VALUE moduleFFI); + +extern VALUE rbffi_MappedTypeClass; + + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_MAPPEDTYPE_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MappedType.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MappedType.o new file mode 100644 index 000000000000..4b6b2f3814b0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MappedType.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MemoryPointer.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MemoryPointer.c new file mode 100644 index 000000000000..1a64f2e42771 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MemoryPointer.c @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdbool.h> +#include <stdint.h> +#include <limits.h> +#include <ruby.h> +#include "rbffi.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "MemoryPointer.h" + + +static VALUE memptr_allocate(VALUE klass); +static void memptr_release(Pointer* ptr); +static VALUE memptr_malloc(VALUE self, long size, long count, bool clear); +static VALUE memptr_free(VALUE self); + +VALUE rbffi_MemoryPointerClass; + +#define MEMPTR(obj) ((MemoryPointer *) rbffi_AbstractMemory_Cast(obj, rbffi_MemoryPointerClass)) + +VALUE +rbffi_MemoryPointer_NewInstance(long size, long count, bool clear) +{ + return memptr_malloc(memptr_allocate(rbffi_MemoryPointerClass), size, count, clear); +} + +static VALUE +memptr_allocate(VALUE klass) +{ + Pointer* p; + VALUE obj = Data_Make_Struct(klass, Pointer, NULL, memptr_release, p); + p->rbParent = Qnil; + p->memory.flags = MEM_RD | MEM_WR; + + return obj; +} + +/* + * call-seq: initialize(size, count=1, clear=true) + * @param [Fixnum, Bignum, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used) + * @param [Numeric] count number of cells in memory + * @param [Boolean] clear set memory to all-zero if +true+ + * @return [self] + * A new instance of FFI::MemoryPointer. + */ +static VALUE +memptr_initialize(int argc, VALUE* argv, VALUE self) +{ + VALUE size = Qnil, count = Qnil, clear = Qnil; + int nargs = rb_scan_args(argc, argv, "12", &size, &count, &clear); + + memptr_malloc(self, rbffi_type_size(size), nargs > 1 ? NUM2LONG(count) : 1, + RTEST(clear) || clear == Qnil); + + if (rb_block_given_p()) { + return rb_ensure(rb_yield, self, memptr_free, self); + } + + return self; +} + +static VALUE +memptr_malloc(VALUE self, long size, long count, bool clear) +{ + Pointer* p; + unsigned long msize; + + Data_Get_Struct(self, Pointer, p); + + msize = size * count; + + p->storage = xmalloc(msize + 7); + if (p->storage == NULL) { + rb_raise(rb_eNoMemError, "Failed to allocate memory size=%ld bytes", msize); + return Qnil; + } + p->autorelease = true; + p->memory.typeSize = (int) size; + p->memory.size = msize; + /* ensure the memory is aligned on at least a 8 byte boundary */ + p->memory.address = (char *) (((uintptr_t) p->storage + 0x7) & (uintptr_t) ~0x7ULL); + p->allocated = true; + + if (clear && p->memory.size > 0) { + memset(p->memory.address, 0, p->memory.size); + } + + return self; +} + +static VALUE +memptr_free(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + if (ptr->allocated) { + if (ptr->storage != NULL) { + xfree(ptr->storage); + ptr->storage = NULL; + } + ptr->allocated = false; + } + + return self; +} + +static void +memptr_release(Pointer* ptr) +{ + if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) { + xfree(ptr->storage); + ptr->storage = NULL; + } + xfree(ptr); +} + +/* + * call-seq: from_string(s) + * @param [String] s string + * @return [MemoryPointer] + * Create a {MemoryPointer} with +s+ inside. + */ +static VALUE +memptr_s_from_string(VALUE klass, VALUE to_str) +{ + VALUE s = StringValue(to_str); + VALUE args[] = { INT2FIX(1), LONG2NUM(RSTRING_LEN(s) + 1), Qfalse }; + VALUE obj = rb_class_new_instance(3, args, klass); + rb_funcall(obj, rb_intern("put_string"), 2, INT2FIX(0), s); + + return obj; +} + +void +rbffi_MemoryPointer_Init(VALUE moduleFFI) +{ + VALUE ffi_Pointer; + + ffi_Pointer = rbffi_PointerClass; + + /* + * Document-class: FFI::MemoryPointer < FFI::Pointer + * A MemoryPointer is a specific {Pointer}. It points to a memory composed of cells. All cells have the + * same size. + * + * @example Create a new MemoryPointer + * mp = FFI::MemoryPointer.new(:long, 16) # Create a pointer on a memory of 16 long ints. + * @example Create a new MemoryPointer from a String + * mp1 = FFI::MemoryPointer.from_string("this is a string") + * # same as: + * mp2 = FFI::MemoryPointer.new(:char,16) + * mp2.put_string("this is a string") + */ + rbffi_MemoryPointerClass = rb_define_class_under(moduleFFI, "MemoryPointer", ffi_Pointer); + rb_global_variable(&rbffi_MemoryPointerClass); + + rb_define_alloc_func(rbffi_MemoryPointerClass, memptr_allocate); + rb_define_method(rbffi_MemoryPointerClass, "initialize", memptr_initialize, -1); + rb_define_singleton_method(rbffi_MemoryPointerClass, "from_string", memptr_s_from_string, 1); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MemoryPointer.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MemoryPointer.h new file mode 100644 index 000000000000..8106030a7516 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MemoryPointer.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (c) 2008, Luc Heinrich <luc@honk-honk.com> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_MEMORYPOINTER_H +#define RBFFI_MEMORYPOINTER_H + +# include <stdbool.h> +#include <ruby.h> + +#ifdef __cplusplus +extern "C" { +#endif + + extern void rbffi_MemoryPointer_Init(VALUE moduleFFI); + extern VALUE rbffi_MemoryPointerClass; + extern VALUE rbffi_MemoryPointer_NewInstance(long size, long count, bool clear); +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_MEMORYPOINTER_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MemoryPointer.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MemoryPointer.o new file mode 100644 index 000000000000..a73d1b99db25 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MemoryPointer.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MethodHandle.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MethodHandle.c new file mode 100644 index 000000000000..d047e102dc6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MethodHandle.c @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2009, 2010 Wayne Meissner + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +#include <sys/param.h> +#endif +#include <sys/types.h> +#ifndef _WIN32 +# include <sys/mman.h> +#endif +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#ifndef _WIN32 +# include <unistd.h> +#endif +#include <errno.h> +#include <ruby.h> +#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__) +# include <pthread.h> +#endif + +#include <ffi.h> +#include "rbffi.h" +#include "compat.h" + +#include "Function.h" +#include "Types.h" +#include "Type.h" +#include "LastError.h" +#include "Call.h" +#include "ClosurePool.h" +#include "MethodHandle.h" + + +#define MAX_METHOD_FIXED_ARITY (6) + +#ifndef roundup +# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#endif + +#ifdef USE_RAW +# define METHOD_CLOSURE ffi_raw_closure +# define METHOD_PARAMS ffi_raw* +#else +# define METHOD_CLOSURE ffi_closure +# define METHOD_PARAMS void** +#endif + + + +static bool prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize); +static long trampoline_size(void); + +#if defined(__x86_64__) && (defined(__linux__) || defined(__APPLE__)) +# define CUSTOM_TRAMPOLINE 1 +#endif + + +struct MethodHandle { + Closure* closure; +}; + +static ClosurePool* defaultClosurePool; + + +MethodHandle* +rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function) +{ + MethodHandle* handle; + Closure* closure = rbffi_Closure_Alloc(defaultClosurePool); + if (closure == NULL) { + rb_raise(rb_eNoMemError, "failed to allocate closure from pool"); + return NULL; + } + + handle = xcalloc(1, sizeof(*handle)); + handle->closure = closure; + closure->info = fnInfo; + closure->function = function; + + return handle; +} + +void +rbffi_MethodHandle_Free(MethodHandle* handle) +{ + if (handle != NULL) { + rbffi_Closure_Free(handle->closure); + xfree(handle); + } +} + +rbffi_function_anyargs rbffi_MethodHandle_CodeAddress(MethodHandle* handle) +{ + return (rbffi_function_anyargs) handle->closure->code; +} + +#ifndef CUSTOM_TRAMPOLINE +static void attached_method_invoke(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data); + +static ffi_type* methodHandleParamTypes[3]; + +static ffi_cif mh_cif; + +static bool +prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) +{ + ffi_status ffiStatus; + +#if defined(USE_RAW) + ffiStatus = ffi_prep_raw_closure(code, &mh_cif, attached_method_invoke, closure); +#else + ffiStatus = ffi_prep_closure_loc(closure->pcl, &mh_cif, attached_method_invoke, closure, code); +#endif + if (ffiStatus != FFI_OK) { + snprintf(errmsg, errmsgsize, "ffi_prep_closure_loc failed. status=%#x", ffiStatus); + return false; + } + + return true; +} + + +static long +trampoline_size(void) +{ + return sizeof(METHOD_CLOSURE); +} + +/* + * attached_method_invoke is used functions with more than 6 parameters, or + * with struct param or return values + */ +static void +attached_method_invoke(ffi_cif* cif, void* mretval, METHOD_PARAMS parameters, void* user_data) +{ + Closure* handle = (Closure *) user_data; + FunctionType* fnInfo = (FunctionType *) handle->info; + +#ifdef USE_RAW + int argc = parameters[0].sint; + VALUE* argv = *(VALUE **) &parameters[1]; +#else + int argc = *(int *) parameters[0]; + VALUE* argv = *(VALUE **) parameters[1]; +#endif + + *(VALUE *) mretval = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo); +} + +#endif + + + +#if defined(CUSTOM_TRAMPOLINE) +#if defined(__x86_64__) + +static VALUE custom_trampoline(int argc, VALUE* argv, VALUE self, Closure*); + +#define TRAMPOLINE_CTX_MAGIC (0xfee1deadcafebabe) +#define TRAMPOLINE_FUN_MAGIC (0xfeedfacebeeff00d) + +/* + * This is a hand-coded trampoline to speedup entry from ruby to the FFI translation + * layer for x86_64 arches. + * + * Since a ruby function has exactly 3 arguments, and the first 6 arguments are + * passed in registers for x86_64, we can tack on a context pointer by simply + * putting a value in %rcx, then jumping to the C trampoline code. + * + * This results in approx a 30% speedup for x86_64 FFI dispatch + */ +__asm__( + ".text\n\t" + ".globl ffi_trampoline\n\t" + ".globl _ffi_trampoline\n\t" + "ffi_trampoline:\n\t" + "_ffi_trampoline:\n\t" + "movabsq $0xfee1deadcafebabe, %rcx\n\t" + "movabsq $0xfeedfacebeeff00d, %r11\n\t" + "jmpq *%r11\n\t" + ".globl ffi_trampoline_end\n\t" + "ffi_trampoline_end:\n\t" + ".globl _ffi_trampoline_end\n\t" + "_ffi_trampoline_end:\n\t" +); + +static VALUE +custom_trampoline(int argc, VALUE* argv, VALUE self, Closure* handle) +{ + FunctionType* fnInfo = (FunctionType *) handle->info; + VALUE rbReturnValue; + + RB_GC_GUARD(rbReturnValue) = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo); + RB_GC_GUARD(self); + + return rbReturnValue; +} + +#elif defined(__i386__) && 0 + +static VALUE custom_trampoline(void *args, Closure*); +#define TRAMPOLINE_CTX_MAGIC (0xfee1dead) +#define TRAMPOLINE_FUN_MAGIC (0xbeefcafe) + +/* + * This is a hand-coded trampoline to speed-up entry from ruby to the FFI translation + * layer for i386 arches. + * + * This does not make a discernible difference vs a raw closure, so for now, + * it is not enabled. + */ +__asm__( + ".text\n\t" + ".globl ffi_trampoline\n\t" + ".globl _ffi_trampoline\n\t" + "ffi_trampoline:\n\t" + "_ffi_trampoline:\n\t" + "subl $12, %esp\n\t" + "leal 16(%esp), %eax\n\t" + "movl %eax, (%esp)\n\t" + "movl $0xfee1dead, 4(%esp)\n\t" + "movl $0xbeefcafe, %eax\n\t" + "call *%eax\n\t" + "addl $12, %esp\n\t" + "ret\n\t" + ".globl ffi_trampoline_end\n\t" + "ffi_trampoline_end:\n\t" + ".globl _ffi_trampoline_end\n\t" + "_ffi_trampoline_end:\n\t" +); + +static VALUE +custom_trampoline(void *args, Closure* handle) +{ + FunctionType* fnInfo = (FunctionType *) handle->info; + return (*fnInfo->invoke)(*(int *) args, *(VALUE **) (args + 4), handle->function, fnInfo); +} + +#endif /* __x86_64__ else __i386__ */ + +extern void ffi_trampoline(int argc, VALUE* argv, VALUE self); +extern void ffi_trampoline_end(void); +static int trampoline_offsets(long *, long *); + +static long trampoline_ctx_offset, trampoline_func_offset; + +static long +trampoline_offset(int off, const long value) +{ + char *ptr; + for (ptr = (char *) &ffi_trampoline + off; ptr < (char *) &ffi_trampoline_end; ++ptr) { + if (*(long *) ptr == value) { + return ptr - (char *) &ffi_trampoline; + } + } + + return -1; +} + +static int +trampoline_offsets(long* ctxOffset, long* fnOffset) +{ + *ctxOffset = trampoline_offset(0, TRAMPOLINE_CTX_MAGIC); + if (*ctxOffset == -1) { + return -1; + } + + *fnOffset = trampoline_offset(0, TRAMPOLINE_FUN_MAGIC); + if (*fnOffset == -1) { + return -1; + } + + return 0; +} + +static bool +prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize) +{ + memcpy(code, (void*) &ffi_trampoline, trampoline_size()); + /* Patch the context and function addresses into the stub code */ + *(intptr_t *)((char*)code + trampoline_ctx_offset) = (intptr_t) closure; + *(intptr_t *)((char*)code + trampoline_func_offset) = (intptr_t) custom_trampoline; + + return true; +} + +static long +trampoline_size(void) +{ + return (char *) &ffi_trampoline_end - (char *) &ffi_trampoline; +} + +#endif /* CUSTOM_TRAMPOLINE */ + + +void +rbffi_MethodHandle_Init(VALUE module) +{ +#ifndef CUSTOM_TRAMPOLINE + ffi_status ffiStatus; +#endif + + defaultClosurePool = rbffi_ClosurePool_New((int) trampoline_size(), prep_trampoline, NULL); + +#if defined(CUSTOM_TRAMPOLINE) + if (trampoline_offsets(&trampoline_ctx_offset, &trampoline_func_offset) != 0) { + rb_raise(rb_eFatal, "Could not locate offsets in trampoline code"); + } +#else + methodHandleParamTypes[0] = &ffi_type_sint; + methodHandleParamTypes[1] = &ffi_type_pointer; + methodHandleParamTypes[2] = &ffi_type_ulong; + + ffiStatus = ffi_prep_cif(&mh_cif, FFI_DEFAULT_ABI, 3, &ffi_type_ulong, + methodHandleParamTypes); + if (ffiStatus != FFI_OK) { + rb_raise(rb_eFatal, "ffi_prep_cif failed. status=%#x", ffiStatus); + } + +#endif +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MethodHandle.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MethodHandle.h new file mode 100644 index 000000000000..0dcc0582efaf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MethodHandle.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_METHODHANDLE_H +#define RBFFI_METHODHANDLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <ruby.h> +#include "Function.h" + + +typedef struct MethodHandlePool MethodHandlePool; +typedef struct MethodHandle MethodHandle; +typedef VALUE (*rbffi_function_anyargs)(int argc, VALUE* argv, VALUE self); + + +MethodHandle* rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function); +void rbffi_MethodHandle_Free(MethodHandle* handle); +rbffi_function_anyargs rbffi_MethodHandle_CodeAddress(MethodHandle* handle); +void rbffi_MethodHandle_Init(VALUE module); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_METHODHANDLE_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MethodHandle.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MethodHandle.o new file mode 100644 index 000000000000..453332fe307b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/MethodHandle.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Platform.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Platform.c new file mode 100644 index 000000000000..28e1c3571e80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Platform.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +# include <sys/param.h> +#endif +# include <sys/types.h> +#include <stdint.h> +#include <stdbool.h> +#include <ruby.h> +#include <ctype.h> +#include "rbffi_endian.h" +#include "Platform.h" + +#if defined(__GNU__) || defined(__GLIBC__) +# include <gnu/lib-names.h> +#endif + +static VALUE PlatformModule = Qnil; + +static void +export_primitive_types(VALUE module) +{ +#define S(name, T) do { \ + typedef struct { char c; T v; } s; \ + rb_define_const(module, #name "_ALIGN", INT2NUM((sizeof(s) - sizeof(T)) * 8)); \ + rb_define_const(module, #name "_SIZE", INT2NUM(sizeof(T)* 8)); \ +} while(0) + S(INT8, char); + S(INT16, short); + S(INT32, int); + S(INT64, long long); + S(LONG, long); + S(FLOAT, float); + S(DOUBLE, double); + S(LONG_DOUBLE, long double); + S(ADDRESS, void*); +#undef S +} + +void +rbffi_Platform_Init(VALUE moduleFFI) +{ + PlatformModule = rb_define_module_under(moduleFFI, "Platform"); + rb_define_const(PlatformModule, "BYTE_ORDER", INT2FIX(BYTE_ORDER)); + rb_define_const(PlatformModule, "LITTLE_ENDIAN", INT2FIX(LITTLE_ENDIAN)); + rb_define_const(PlatformModule, "BIG_ENDIAN", INT2FIX(BIG_ENDIAN)); +#if defined(__GNU__) || defined(__GLIBC__) + rb_define_const(PlatformModule, "GNU_LIBC", rb_str_new2(LIBC_SO)); +#endif + export_primitive_types(PlatformModule); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Platform.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Platform.h new file mode 100644 index 000000000000..5575e34ab957 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Platform.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_PLATFORM_H +#define RBFFI_PLATFORM_H + +#ifdef __cplusplus +extern "C" { +#endif + + extern void rbffi_Platform_Init(VALUE moduleFFI); + + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_PLATFORM_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Platform.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Platform.o new file mode 100644 index 000000000000..bfcc7f5a98e1 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Platform.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Pointer.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Pointer.c new file mode 100644 index 000000000000..153fff10187e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Pointer.c @@ -0,0 +1,507 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdint.h> +#include <stdbool.h> +#include <limits.h> +#include <ruby.h> +#include "rbffi.h" +#include "rbffi_endian.h" +#include "AbstractMemory.h" +#include "Pointer.h" + +#define POINTER(obj) rbffi_AbstractMemory_Cast((obj), rbffi_PointerClass) + +VALUE rbffi_PointerClass = Qnil; +VALUE rbffi_NullPointerSingleton = Qnil; + +static void ptr_release(Pointer* ptr); +static void ptr_mark(Pointer* ptr); + +VALUE +rbffi_Pointer_NewInstance(void* addr) +{ + Pointer* p; + VALUE obj; + + if (addr == NULL) { + return rbffi_NullPointerSingleton; + } + + obj = Data_Make_Struct(rbffi_PointerClass, Pointer, NULL, -1, p); + p->memory.address = addr; + p->memory.size = LONG_MAX; + p->memory.flags = (addr == NULL) ? 0 : (MEM_RD | MEM_WR); + p->memory.typeSize = 1; + p->rbParent = Qnil; + + return obj; +} + +static VALUE +ptr_allocate(VALUE klass) +{ + Pointer* p; + VALUE obj; + + obj = Data_Make_Struct(klass, Pointer, ptr_mark, ptr_release, p); + p->rbParent = Qnil; + p->memory.flags = MEM_RD | MEM_WR; + + return obj; +} + +/* + * @overload initialize(pointer) + * @param [Pointer] pointer another pointer to initialize from + * Create a new pointer from another {Pointer}. + * @overload initialize(type, address) + * @param [Type] type type for pointer + * @param [Integer] address base address for pointer + * Create a new pointer from a {Type} and a base address + * @return [self] + * A new instance of Pointer. + */ +static VALUE +ptr_initialize(int argc, VALUE* argv, VALUE self) +{ + Pointer* p; + VALUE rbType = Qnil, rbAddress = Qnil; + int typeSize = 1; + + Data_Get_Struct(self, Pointer, p); + + switch (rb_scan_args(argc, argv, "11", &rbType, &rbAddress)) { + case 1: + rbAddress = rbType; + typeSize = 1; + break; + case 2: + typeSize = rbffi_type_size(rbType); + break; + default: + rb_raise(rb_eArgError, "Invalid arguments"); + } + + switch (TYPE(rbAddress)) { + case T_FIXNUM: + case T_BIGNUM: + p->memory.address = (void*) (uintptr_t) NUM2LL(rbAddress); + p->memory.size = LONG_MAX; + if (p->memory.address == NULL) { + p->memory.flags = 0; + } + break; + + default: + if (rb_obj_is_kind_of(rbAddress, rbffi_PointerClass)) { + Pointer* orig; + + p->rbParent = rbAddress; + Data_Get_Struct(rbAddress, Pointer, orig); + p->memory = orig->memory; + } else { + rb_raise(rb_eTypeError, "wrong argument type, expected Integer or FFI::Pointer"); + } + break; + } + + p->memory.typeSize = typeSize; + + return self; +} + +/* + * call-seq: ptr.initialize_copy(other) + * @param [Pointer] other source for cloning or dupping + * @return [self] + * @raise {RuntimeError} if +other+ is an unbounded memory area, or is unreadable/unwritable + * @raise {NoMemError} if failed to allocate memory for new object + * DO NOT CALL THIS METHOD. + * + * This method is internally used by #dup and #clone. Memory content is copied from +other+. + */ +static VALUE +ptr_initialize_copy(VALUE self, VALUE other) +{ + AbstractMemory* src; + Pointer* dst; + + Data_Get_Struct(self, Pointer, dst); + src = POINTER(other); + if (src->size == LONG_MAX) { + rb_raise(rb_eRuntimeError, "cannot duplicate unbounded memory area"); + return Qnil; + } + + if ((dst->memory.flags & (MEM_RD | MEM_WR)) != (MEM_RD | MEM_WR)) { + rb_raise(rb_eRuntimeError, "cannot duplicate unreadable/unwritable memory area"); + return Qnil; + } + + if (dst->storage != NULL) { + xfree(dst->storage); + dst->storage = NULL; + } + + dst->storage = xmalloc(src->size + 7); + if (dst->storage == NULL) { + rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size); + return Qnil; + } + + dst->allocated = true; + dst->autorelease = true; + dst->memory.address = (void *) (((uintptr_t) dst->storage + 0x7) & (uintptr_t) ~0x7ULL); + dst->memory.size = src->size; + dst->memory.typeSize = src->typeSize; + + /* finally, copy the actual memory contents */ + memcpy(dst->memory.address, src->address, src->size); + + return self; +} + +static VALUE +slice(VALUE self, long offset, long size) +{ + AbstractMemory* ptr; + Pointer* p; + VALUE retval; + + Data_Get_Struct(self, AbstractMemory, ptr); + checkBounds(ptr, offset, size == LONG_MAX ? 1 : size); + + retval = Data_Make_Struct(rbffi_PointerClass, Pointer, ptr_mark, -1, p); + + p->memory.address = ptr->address + offset; + p->memory.size = size; + p->memory.flags = ptr->flags; + p->memory.typeSize = ptr->typeSize; + p->rbParent = self; + + return retval; +} + +/* + * Document-method: + + * call-seq: ptr + offset + * @param [Numeric] offset + * @return [Pointer] + * Return a new {Pointer} from an existing pointer and an +offset+. + */ +static VALUE +ptr_plus(VALUE self, VALUE offset) +{ + AbstractMemory* ptr; + long off = NUM2LONG(offset); + + Data_Get_Struct(self, AbstractMemory, ptr); + + return slice(self, off, ptr->size == LONG_MAX ? LONG_MAX : ptr->size - off); +} + +/* + * call-seq: ptr.slice(offset, length) + * @param [Numeric] offset + * @param [Numeric] length + * @return [Pointer] + * Return a new {Pointer} from an existing one. This pointer points on same contents + * from +offset+ for a length +length+. + */ +static VALUE +ptr_slice(VALUE self, VALUE rbOffset, VALUE rbLength) +{ + return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength)); +} + +/* + * call-seq: ptr.inspect + * @return [String] + * Inspect pointer object. + */ +static VALUE +ptr_inspect(VALUE self) +{ + char buf[100]; + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + if (ptr->memory.size != LONG_MAX) { + snprintf(buf, sizeof(buf), "#<%s address=%p size=%lu>", + rb_obj_classname(self), ptr->memory.address, ptr->memory.size); + } else { + snprintf(buf, sizeof(buf), "#<%s address=%p>", rb_obj_classname(self), ptr->memory.address); + } + + return rb_str_new2(buf); +} + +/* + * Document-method: null? + * call-seq: ptr.null? + * @return [Boolean] + * Return +true+ if +self+ is a {NULL} pointer. + */ +static VALUE +ptr_null_p(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + return ptr->memory.address == NULL ? Qtrue : Qfalse; +} + +/* + * Document-method: == + * call-seq: ptr == other + * @param [Pointer] other + * Check equality between +self+ and +other+. Equality is tested on {#address}. + */ +static VALUE +ptr_equals(VALUE self, VALUE other) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + if (NIL_P(other)) { + return ptr->memory.address == NULL ? Qtrue : Qfalse; + } + + return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse; +} + +/* + * call-seq: ptr.address + * @return [Numeric] pointer's base address + * Return +self+'s base address (alias: #to_i). + */ +static VALUE +ptr_address(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + return ULL2NUM((uintptr_t) ptr->memory.address); +} + +#if BYTE_ORDER == LITTLE_ENDIAN +# define SWAPPED_ORDER BIG_ENDIAN +#else +# define SWAPPED_ORDER LITTLE_ENDIAN +#endif + +/* + * Get or set +self+'s endianness + * @overload order + * @return [:big, :little] endianness of +self+ + * @overload order(order) + * @param [Symbol] order endianness to set (+:little+, +:big+ or +:network+). +:big+ and +:network+ + * are synonymous. + * @return a new pointer with the new order + */ +static VALUE +ptr_order(int argc, VALUE* argv, VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + if (argc == 0) { + int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER; + return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little")); + } else { + VALUE rbOrder = Qnil; + int order = BYTE_ORDER; + + if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) { + rb_raise(rb_eArgError, "need byte order"); + } + if (SYMBOL_P(rbOrder)) { + ID id = SYM2ID(rbOrder); + if (id == rb_intern("little")) { + order = LITTLE_ENDIAN; + + } else if (id == rb_intern("big") || id == rb_intern("network")) { + order = BIG_ENDIAN; + } else { + rb_raise(rb_eArgError, "unknown byte order"); + } + } + if (order != BYTE_ORDER) { + Pointer* p2; + VALUE retval = slice(self, 0, ptr->memory.size); + + Data_Get_Struct(retval, Pointer, p2); + p2->memory.flags |= MEM_SWAP; + return retval; + } + + return self; + } +} + + +/* + * call-seq: ptr.free + * @return [self] + * Free memory pointed by +self+. + */ +static VALUE +ptr_free(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + if (ptr->allocated) { + if (ptr->storage != NULL) { + xfree(ptr->storage); + ptr->storage = NULL; + } + ptr->allocated = false; + + } else { + VALUE caller = rb_funcall(rb_funcall(Qnil, rb_intern("caller"), 0), rb_intern("first"), 0); + + rb_warn("calling free on non allocated pointer %s from %s", RSTRING_PTR(ptr_inspect(self)), RSTRING_PTR(rb_str_to_str(caller))); + } + + return self; +} + +static VALUE +ptr_type_size(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + return INT2NUM(ptr->memory.typeSize); +} + +/* + * call-seq: ptr.autorelease = autorelease + * @param [Boolean] autorelease + * @return [Boolean] +autorelease+ + * Set +autorelease+ attribute. See also Autorelease section. + */ +static VALUE +ptr_autorelease(VALUE self, VALUE autorelease) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + ptr->autorelease = autorelease == Qtrue; + + return autorelease; +} + +/* + * call-seq: ptr.autorelease? + * @return [Boolean] + * Get +autorelease+ attribute. See also Autorelease section. + */ +static VALUE +ptr_autorelease_p(VALUE self) +{ + Pointer* ptr; + + Data_Get_Struct(self, Pointer, ptr); + + return ptr->autorelease ? Qtrue : Qfalse; +} + + +static void +ptr_release(Pointer* ptr) +{ + if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) { + xfree(ptr->storage); + ptr->storage = NULL; + } + xfree(ptr); +} + +static void +ptr_mark(Pointer* ptr) +{ + rb_gc_mark(ptr->rbParent); +} + +void +rbffi_Pointer_Init(VALUE moduleFFI) +{ + VALUE rbNullAddress = ULL2NUM(0); + VALUE ffi_AbstractMemory = rbffi_AbstractMemoryClass; + + /* + * Document-class: FFI::Pointer < FFI::AbstractMemory + * Pointer class is used to manage C pointers with ease. A {Pointer} object is defined by his + * {#address} (as a C pointer). It permits additions with an integer for pointer arithmetic. + * + * == Autorelease + * By default a pointer object frees its content when it's garbage collected. + * Therefore it's usually not necessary to call {#free} explicit. + * This behaviour may be changed with {#autorelease=} method. + * If it's set to +false+, the memory isn't freed by the garbage collector, but stays valid until +free()+ is called on C level or when the process terminates. + */ + rbffi_PointerClass = rb_define_class_under(moduleFFI, "Pointer", ffi_AbstractMemory); + /* + * Document-variable: Pointer + */ + rb_global_variable(&rbffi_PointerClass); + + rb_define_alloc_func(rbffi_PointerClass, ptr_allocate); + rb_define_method(rbffi_PointerClass, "initialize", ptr_initialize, -1); + rb_define_method(rbffi_PointerClass, "initialize_copy", ptr_initialize_copy, 1); + rb_define_method(rbffi_PointerClass, "inspect", ptr_inspect, 0); + rb_define_method(rbffi_PointerClass, "to_s", ptr_inspect, 0); + rb_define_method(rbffi_PointerClass, "+", ptr_plus, 1); + rb_define_method(rbffi_PointerClass, "slice", ptr_slice, 2); + rb_define_method(rbffi_PointerClass, "null?", ptr_null_p, 0); + rb_define_method(rbffi_PointerClass, "address", ptr_address, 0); + rb_define_alias(rbffi_PointerClass, "to_i", "address"); + rb_define_method(rbffi_PointerClass, "==", ptr_equals, 1); + rb_define_method(rbffi_PointerClass, "order", ptr_order, -1); + rb_define_method(rbffi_PointerClass, "autorelease=", ptr_autorelease, 1); + rb_define_method(rbffi_PointerClass, "autorelease?", ptr_autorelease_p, 0); + rb_define_method(rbffi_PointerClass, "free", ptr_free, 0); + rb_define_method(rbffi_PointerClass, "type_size", ptr_type_size, 0); + + rbffi_NullPointerSingleton = rb_class_new_instance(1, &rbNullAddress, rbffi_PointerClass); + /* + * NULL pointer + */ + rb_define_const(rbffi_PointerClass, "NULL", rbffi_NullPointerSingleton); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Pointer.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Pointer.h new file mode 100644 index 000000000000..b3d6c85f14a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Pointer.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_POINTER_H +#define RBFFI_POINTER_H + +# include <stdbool.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#include "AbstractMemory.h" + +extern void rbffi_Pointer_Init(VALUE moduleFFI); +extern VALUE rbffi_Pointer_NewInstance(void* addr); +extern VALUE rbffi_PointerClass; +extern VALUE rbffi_NullPointerSingleton; + +typedef struct Pointer { + AbstractMemory memory; + VALUE rbParent; + char* storage; /* start of malloc area */ + bool autorelease; + bool allocated; +} Pointer; + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_POINTER_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Pointer.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Pointer.o new file mode 100644 index 000000000000..c727529a6b0c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Pointer.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Struct.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Struct.c new file mode 100644 index 000000000000..92731c813b4e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Struct.c @@ -0,0 +1,822 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#ifndef _MSC_VER +# include <sys/param.h> +#endif +#include <stdint.h> +#include <stdbool.h> +#include <ruby.h> +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "MemoryPointer.h" +#include "Function.h" +#include "Types.h" +#include "Function.h" +#include "StructByValue.h" +#include "ArrayType.h" +#include "MappedType.h" +#include "Struct.h" + +typedef struct InlineArray_ { + VALUE rbMemory; + VALUE rbField; + + AbstractMemory* memory; + StructField* field; + MemoryOp *op; + Type* componentType; + ArrayType* arrayType; + int length; +} InlineArray; + + +static void struct_mark(Struct *); +static void struct_free(Struct *); +static VALUE struct_class_layout(VALUE klass); +static void struct_malloc(Struct* s); +static void inline_array_mark(InlineArray *); +static void store_reference_value(StructField* f, Struct* s, VALUE value); + +VALUE rbffi_StructClass = Qnil; + +VALUE rbffi_StructInlineArrayClass = Qnil; +VALUE rbffi_StructLayoutCharArrayClass = Qnil; + +static ID id_pointer_ivar = 0, id_layout_ivar = 0; +static ID id_get = 0, id_put = 0, id_to_ptr = 0, id_to_s = 0, id_layout = 0; + +static inline char* +memory_address(VALUE self) +{ + return ((AbstractMemory *)DATA_PTR((self)))->address; +} + +static VALUE +struct_allocate(VALUE klass) +{ + Struct* s; + VALUE obj = Data_Make_Struct(klass, Struct, struct_mark, struct_free, s); + + s->rbPointer = Qnil; + s->rbLayout = Qnil; + + return obj; +} + +/* + * call-seq: initialize + * @overload initialize(pointer, *args) + * @param [AbstractMemory] pointer + * @param [Array] args + * @return [self] + */ +static VALUE +struct_initialize(int argc, VALUE* argv, VALUE self) +{ + Struct* s; + VALUE rbPointer = Qnil, rest = Qnil, klass = CLASS_OF(self); + int nargs; + + Data_Get_Struct(self, Struct, s); + + nargs = rb_scan_args(argc, argv, "01*", &rbPointer, &rest); + + /* Call up into ruby code to adjust the layout */ + if (nargs > 1) { + s->rbLayout = rb_funcall2(CLASS_OF(self), id_layout, (int) RARRAY_LEN(rest), RARRAY_PTR(rest)); + } else { + s->rbLayout = struct_class_layout(klass); + } + + if (!rb_obj_is_kind_of(s->rbLayout, rbffi_StructLayoutClass)) { + rb_raise(rb_eRuntimeError, "Invalid Struct layout"); + } + + Data_Get_Struct(s->rbLayout, StructLayout, s->layout); + + if (rbPointer != Qnil) { + s->pointer = MEMORY(rbPointer); + s->rbPointer = rbPointer; + } else { + struct_malloc(s); + } + + return self; +} + +/* + * call-seq: initialize_copy(other) + * @return [nil] + * DO NOT CALL THIS METHOD + */ +static VALUE +struct_initialize_copy(VALUE self, VALUE other) +{ + Struct* src; + Struct* dst; + + Data_Get_Struct(self, Struct, dst); + Data_Get_Struct(other, Struct, src); + if (dst == src) { + return self; + } + + dst->rbLayout = src->rbLayout; + dst->layout = src->layout; + + /* + * A new MemoryPointer instance is allocated here instead of just calling + * #dup on rbPointer, since the Pointer may not know its length, or may + * be longer than just this struct. + */ + if (src->pointer->address != NULL) { + dst->rbPointer = rbffi_MemoryPointer_NewInstance(1, src->layout->size, false); + dst->pointer = MEMORY(dst->rbPointer); + memcpy(dst->pointer->address, src->pointer->address, src->layout->size); + } else { + dst->rbPointer = src->rbPointer; + dst->pointer = src->pointer; + } + + if (src->layout->referenceFieldCount > 0) { + dst->rbReferences = ALLOC_N(VALUE, dst->layout->referenceFieldCount); + memcpy(dst->rbReferences, src->rbReferences, dst->layout->referenceFieldCount * sizeof(VALUE)); + } + + return self; +} + +static VALUE +struct_class_layout(VALUE klass) +{ + VALUE layout; + if (!rb_ivar_defined(klass, id_layout_ivar)) { + rb_raise(rb_eRuntimeError, "no Struct layout configured for %s", rb_class2name(klass)); + } + + layout = rb_ivar_get(klass, id_layout_ivar); + if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) { + rb_raise(rb_eRuntimeError, "invalid Struct layout for %s", rb_class2name(klass)); + } + + return layout; +} + +static StructLayout* +struct_layout(VALUE self) +{ + Struct* s = (Struct *) DATA_PTR(self); + if (s->layout != NULL) { + return s->layout; + } + + if (s->layout == NULL) { + s->rbLayout = struct_class_layout(CLASS_OF(self)); + Data_Get_Struct(s->rbLayout, StructLayout, s->layout); + } + + return s->layout; +} + +static Struct* +struct_validate(VALUE self) +{ + Struct* s; + Data_Get_Struct(self, Struct, s); + + if (struct_layout(self) == NULL) { + rb_raise(rb_eRuntimeError, "struct layout == null"); + } + + if (s->pointer == NULL) { + struct_malloc(s); + } + + return s; +} + +static void +struct_malloc(Struct* s) +{ + if (s->rbPointer == Qnil) { + s->rbPointer = rbffi_MemoryPointer_NewInstance(s->layout->size, 1, true); + + } else if (!rb_obj_is_kind_of(s->rbPointer, rbffi_AbstractMemoryClass)) { + rb_raise(rb_eRuntimeError, "invalid pointer in struct"); + } + + s->pointer = (AbstractMemory *) DATA_PTR(s->rbPointer); +} + +static void +struct_mark(Struct *s) +{ + rb_gc_mark(s->rbPointer); + rb_gc_mark(s->rbLayout); + if (s->rbReferences != NULL) { + rb_gc_mark_locations(&s->rbReferences[0], &s->rbReferences[s->layout->referenceFieldCount]); + } +} + +static void +struct_free(Struct* s) +{ + xfree(s->rbReferences); + xfree(s); +} + + +static void +store_reference_value(StructField* f, Struct* s, VALUE value) +{ + if (unlikely(f->referenceIndex == -1)) { + rb_raise(rb_eRuntimeError, "put_reference_value called for non-reference type"); + return; + } + if (s->rbReferences == NULL) { + int i; + s->rbReferences = ALLOC_N(VALUE, s->layout->referenceFieldCount); + for (i = 0; i < s->layout->referenceFieldCount; ++i) { + s->rbReferences[i] = Qnil; + } + } + + s->rbReferences[f->referenceIndex] = value; +} + + +static StructField * +struct_field(Struct* s, VALUE fieldName) +{ + StructLayout* layout = s->layout; + struct field_cache_entry *p_ce = FIELD_CACHE_LOOKUP(layout, fieldName); + + /* Do a hash lookup only if cache entry is empty or fieldName is unexpected? */ + if (unlikely(!SYMBOL_P(fieldName) || !p_ce->fieldName || p_ce->fieldName != fieldName)) { + VALUE rbField = rb_hash_aref(layout->rbFieldMap, fieldName); + if (unlikely(NIL_P(rbField))) { + VALUE str = rb_funcall2(fieldName, id_to_s, 0, NULL); + rb_raise(rb_eArgError, "No such field '%s'", StringValueCStr(str)); + } + /* Write the retrieved coder to the cache */ + p_ce->fieldName = fieldName; + p_ce->field = (StructField *) DATA_PTR(rbField); + } + + return p_ce->field; +} + +/* + * call-seq: struct[field_name] + * @param field_name field to access + * Acces to a Struct field. + */ +static VALUE +struct_aref(VALUE self, VALUE fieldName) +{ + Struct* s; + StructField* f; + + s = struct_validate(self); + + f = struct_field(s, fieldName); + if (f->get != NULL) { + return (*f->get)(f, s); + + } else if (f->memoryOp != NULL) { + return (*f->memoryOp->get)(s->pointer, f->offset); + + } else { + VALUE rbField = rb_hash_aref(s->layout->rbFieldMap, fieldName); + /* call up to the ruby code to fetch the value */ + return rb_funcall2(rbField, id_get, 1, &s->rbPointer); + } +} + +/* + * call-seq: []=(field_name, value) + * @param field_name field to access + * @param value value to set to +field_name+ + * @return [value] + * Set a field in Struct. + */ +static VALUE +struct_aset(VALUE self, VALUE fieldName, VALUE value) +{ + Struct* s; + StructField* f; + + s = struct_validate(self); + + f = struct_field(s, fieldName); + if (f->put != NULL) { + (*f->put)(f, s, value); + + } else if (f->memoryOp != NULL) { + + (*f->memoryOp->put)(s->pointer, f->offset, value); + + } else { + VALUE rbField = rb_hash_aref(s->layout->rbFieldMap, fieldName); + /* call up to the ruby code to set the value */ + VALUE argv[2]; + argv[0] = s->rbPointer; + argv[1] = value; + rb_funcall2(rbField, id_put, 2, argv); + } + + if (f->referenceRequired) { + store_reference_value(f, s, value); + } + + return value; +} + +/* + * call-seq: pointer= pointer + * @param [AbstractMemory] pointer + * @return [self] + * Make Struct point to +pointer+. + */ +static VALUE +struct_set_pointer(VALUE self, VALUE pointer) +{ + Struct* s; + StructLayout* layout; + AbstractMemory* memory; + + if (!rb_obj_is_kind_of(pointer, rbffi_AbstractMemoryClass)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Pointer or Buffer)", + rb_obj_classname(pointer)); + return Qnil; + } + + + Data_Get_Struct(self, Struct, s); + Data_Get_Struct(pointer, AbstractMemory, memory); + layout = struct_layout(self); + + if ((int) layout->base.ffiType->size > memory->size) { + rb_raise(rb_eArgError, "memory of %ld bytes too small for struct %s (expected at least %ld)", + memory->size, rb_obj_classname(self), (long) layout->base.ffiType->size); + } + + s->pointer = MEMORY(pointer); + s->rbPointer = pointer; + rb_ivar_set(self, id_pointer_ivar, pointer); + + return self; +} + +/* + * call-seq: pointer + * @return [AbstractMemory] + * Get pointer to Struct contents. + */ +static VALUE +struct_get_pointer(VALUE self) +{ + Struct* s; + + Data_Get_Struct(self, Struct, s); + + return s->rbPointer; +} + +/* + * call-seq: layout= layout + * @param [StructLayout] layout + * @return [self] + * Set the Struct's layout. + */ +static VALUE +struct_set_layout(VALUE self, VALUE layout) +{ + Struct* s; + Data_Get_Struct(self, Struct, s); + + if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", + rb_obj_classname(layout), rb_class2name(rbffi_StructLayoutClass)); + return Qnil; + } + + Data_Get_Struct(layout, StructLayout, s->layout); + rb_ivar_set(self, id_layout_ivar, layout); + + return self; +} + +/* + * call-seq: layout + * @return [StructLayout] + * Get the Struct's layout. + */ +static VALUE +struct_get_layout(VALUE self) +{ + Struct* s; + + Data_Get_Struct(self, Struct, s); + + return s->rbLayout; +} + +/* + * call-seq: null? + * @return [Boolean] + * Test if Struct's pointer is NULL + */ +static VALUE +struct_null_p(VALUE self) +{ + Struct* s; + + Data_Get_Struct(self, Struct, s); + + return s->pointer->address == NULL ? Qtrue : Qfalse; +} + +/* + * (see Pointer#order) + */ +static VALUE +struct_order(int argc, VALUE* argv, VALUE self) +{ + Struct* s; + + Data_Get_Struct(self, Struct, s); + if (argc == 0) { + return rb_funcall(s->rbPointer, rb_intern("order"), 0); + + } else { + VALUE retval = rb_obj_dup(self); + VALUE rbPointer = rb_funcall2(s->rbPointer, rb_intern("order"), argc, argv); + struct_set_pointer(retval, rbPointer); + + return retval; + } +} + +static VALUE +inline_array_allocate(VALUE klass) +{ + InlineArray* array; + VALUE obj; + + obj = Data_Make_Struct(klass, InlineArray, inline_array_mark, -1, array); + array->rbField = Qnil; + array->rbMemory = Qnil; + + return obj; +} + +static void +inline_array_mark(InlineArray* array) +{ + rb_gc_mark(array->rbField); + rb_gc_mark(array->rbMemory); +} + +/* + * Document-method: FFI::Struct::InlineArray#initialize + * call-seq: initialize(memory, field) + * @param [AbstractMemory] memory + * @param [StructField] field + * @return [self] + */ +static VALUE +inline_array_initialize(VALUE self, VALUE rbMemory, VALUE rbField) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + array->rbMemory = rbMemory; + array->rbField = rbField; + + Data_Get_Struct(rbMemory, AbstractMemory, array->memory); + Data_Get_Struct(rbField, StructField, array->field); + Data_Get_Struct(array->field->rbType, ArrayType, array->arrayType); + Data_Get_Struct(array->arrayType->rbComponentType, Type, array->componentType); + + array->op = get_memory_op(array->componentType); + if (array->op == NULL && array->componentType->nativeType == NATIVE_MAPPED) { + array->op = get_memory_op(((MappedType *) array->componentType)->type); + } + + array->length = array->arrayType->length; + + return self; +} + +/* + * call-seq: size + * @return [Numeric] + * Get size + */ +static VALUE +inline_array_size(VALUE self) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + + return UINT2NUM(((ArrayType *) array->field->type)->length); +} + +static int +inline_array_offset(InlineArray* array, int index) +{ + if (index < 0 || (index >= array->length && array->length > 0)) { + rb_raise(rb_eIndexError, "index %d out of bounds", index); + } + + return (int) array->field->offset + (index * (int) array->componentType->ffiType->size); +} + +/* + * call-seq: [](index) + * @param [Numeric] index + * @return [Type, Struct] + */ +static VALUE +inline_array_aref(VALUE self, VALUE rbIndex) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + + if (array->op != NULL) { + VALUE rbNativeValue = array->op->get(array->memory, + inline_array_offset(array, NUM2INT(rbIndex))); + if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) { + return rb_funcall(((MappedType *) array->componentType)->rbConverter, + rb_intern("from_native"), 2, rbNativeValue, Qnil); + } else { + return rbNativeValue; + } + + } else if (array->componentType->nativeType == NATIVE_STRUCT) { + VALUE rbOffset = INT2NUM(inline_array_offset(array, NUM2INT(rbIndex))); + VALUE rbLength = INT2NUM(array->componentType->ffiType->size); + VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength); + + return rb_class_new_instance(1, &rbPointer, ((StructByValue *) array->componentType)->rbStructClass); + } else { + + rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(array->arrayType->rbComponentType)); + return Qnil; + } +} + +/* + * call-seq: []=(index, value) + * @param [Numeric] index + * @param [Type, Struct] + * @return [value] + */ +static VALUE +inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + + if (array->op != NULL) { + if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) { + rbValue = rb_funcall(((MappedType *) array->componentType)->rbConverter, + rb_intern("to_native"), 2, rbValue, Qnil); + } + array->op->put(array->memory, inline_array_offset(array, NUM2INT(rbIndex)), + rbValue); + + } else if (array->componentType->nativeType == NATIVE_STRUCT) { + int offset = inline_array_offset(array, NUM2INT(rbIndex)); + Struct* s; + + if (!rb_obj_is_kind_of(rbValue, rbffi_StructClass)) { + rb_raise(rb_eTypeError, "argument not an instance of struct"); + return Qnil; + } + + checkWrite(array->memory); + checkBounds(array->memory, offset, array->componentType->ffiType->size); + + Data_Get_Struct(rbValue, Struct, s); + checkRead(s->pointer); + checkBounds(s->pointer, 0, array->componentType->ffiType->size); + + memcpy(array->memory->address + offset, s->pointer->address, array->componentType->ffiType->size); + + } else { + ArrayType* arrayType; + Data_Get_Struct(array->field->rbType, ArrayType, arrayType); + + rb_raise(rb_eArgError, "set not supported for %s", rb_obj_classname(arrayType->rbComponentType)); + return Qnil; + } + + return rbValue; +} + +/* + * call-seq: each + * Yield block for each element of +self+. + */ +static VALUE +inline_array_each(VALUE self) +{ + InlineArray* array; + + int i; + + Data_Get_Struct(self, InlineArray, array); + + for (i = 0; i < array->length; ++i) { + rb_yield(inline_array_aref(self, INT2FIX(i))); + } + + return self; +} + +/* + * call-seq: to_a + * @return [Array] + * Convert +self+ to an array. + */ +static VALUE +inline_array_to_a(VALUE self) +{ + InlineArray* array; + VALUE obj; + int i; + + Data_Get_Struct(self, InlineArray, array); + obj = rb_ary_new2(array->length); + + + for (i = 0; i < array->length; ++i) { + rb_ary_push(obj, inline_array_aref(self, INT2FIX(i))); + } + + return obj; +} + +/* + * Document-method: FFI::StructLayout::CharArray#to_s + * call-seq: to_s + * @return [String] + * Convert +self+ to a string. + */ +static VALUE +inline_array_to_s(VALUE self) +{ + InlineArray* array; + VALUE argv[2]; + + Data_Get_Struct(self, InlineArray, array); + + if (array->componentType->nativeType != NATIVE_INT8 && array->componentType->nativeType != NATIVE_UINT8) { + VALUE dummy = Qnil; + return rb_call_super(0, &dummy); + } + + argv[0] = UINT2NUM(array->field->offset); + argv[1] = UINT2NUM(array->length); + + return rb_funcall2(array->rbMemory, rb_intern("get_string"), 2, argv); +} + +/* + * call-seq: to_ptr + * @return [AbstractMemory] + * Get pointer to +self+ content. + */ +static VALUE +inline_array_to_ptr(VALUE self) +{ + InlineArray* array; + + Data_Get_Struct(self, InlineArray, array); + + return rb_funcall(array->rbMemory, rb_intern("slice"), 2, + UINT2NUM(array->field->offset), UINT2NUM(array->arrayType->base.ffiType->size)); +} + + +void +rbffi_Struct_Init(VALUE moduleFFI) +{ + VALUE StructClass; + + rbffi_StructLayout_Init(moduleFFI); + + /* + * Document-class: FFI::Struct + * + * A FFI::Struct means to mirror a C struct. + * + * A Struct is defined as: + * class MyStruct < FFI::Struct + * layout :value1, :int, + * :value2, :double + * end + * and is used as: + * my_struct = MyStruct.new + * my_struct[:value1] = 12 + * + * For more information, see http://github.com/ffi/ffi/wiki/Structs + */ + rbffi_StructClass = rb_define_class_under(moduleFFI, "Struct", rb_cObject); + StructClass = rbffi_StructClass; // put on a line alone to help RDoc + rb_global_variable(&rbffi_StructClass); + + /* + * Document-class: FFI::Struct::InlineArray + */ + rbffi_StructInlineArrayClass = rb_define_class_under(rbffi_StructClass, "InlineArray", rb_cObject); + rb_global_variable(&rbffi_StructInlineArrayClass); + + /* + * Document-class: FFI::StructLayout::CharArray < FFI::Struct::InlineArray + */ + rbffi_StructLayoutCharArrayClass = rb_define_class_under(rbffi_StructLayoutClass, "CharArray", + rbffi_StructInlineArrayClass); + rb_global_variable(&rbffi_StructLayoutCharArrayClass); + + + rb_define_alloc_func(StructClass, struct_allocate); + rb_define_method(StructClass, "initialize", struct_initialize, -1); + rb_define_method(StructClass, "initialize_copy", struct_initialize_copy, 1); + rb_define_method(StructClass, "order", struct_order, -1); + + rb_define_alias(rb_singleton_class(StructClass), "alloc_in", "new"); + rb_define_alias(rb_singleton_class(StructClass), "alloc_out", "new"); + rb_define_alias(rb_singleton_class(StructClass), "alloc_inout", "new"); + rb_define_alias(rb_singleton_class(StructClass), "new_in", "new"); + rb_define_alias(rb_singleton_class(StructClass), "new_out", "new"); + rb_define_alias(rb_singleton_class(StructClass), "new_inout", "new"); + + rb_define_method(StructClass, "pointer", struct_get_pointer, 0); + rb_define_private_method(StructClass, "pointer=", struct_set_pointer, 1); + + rb_define_method(StructClass, "layout", struct_get_layout, 0); + rb_define_private_method(StructClass, "layout=", struct_set_layout, 1); + + rb_define_method(StructClass, "[]", struct_aref, 1); + rb_define_method(StructClass, "[]=", struct_aset, 2); + rb_define_method(StructClass, "null?", struct_null_p, 0); + + rb_include_module(rbffi_StructInlineArrayClass, rb_mEnumerable); + rb_define_alloc_func(rbffi_StructInlineArrayClass, inline_array_allocate); + rb_define_method(rbffi_StructInlineArrayClass, "initialize", inline_array_initialize, 2); + rb_define_method(rbffi_StructInlineArrayClass, "[]", inline_array_aref, 1); + rb_define_method(rbffi_StructInlineArrayClass, "[]=", inline_array_aset, 2); + rb_define_method(rbffi_StructInlineArrayClass, "each", inline_array_each, 0); + rb_define_method(rbffi_StructInlineArrayClass, "size", inline_array_size, 0); + rb_define_method(rbffi_StructInlineArrayClass, "to_a", inline_array_to_a, 0); + rb_define_method(rbffi_StructInlineArrayClass, "to_ptr", inline_array_to_ptr, 0); + + rb_define_method(rbffi_StructLayoutCharArrayClass, "to_s", inline_array_to_s, 0); + rb_define_alias(rbffi_StructLayoutCharArrayClass, "to_str", "to_s"); + + id_pointer_ivar = rb_intern("@pointer"); + id_layout_ivar = rb_intern("@layout"); + id_layout = rb_intern("layout"); + id_get = rb_intern("get"); + id_put = rb_intern("put"); + id_to_ptr = rb_intern("to_ptr"); + id_to_s = rb_intern("to_s"); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Struct.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Struct.h new file mode 100644 index 000000000000..eb6edf282870 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Struct.h @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_STRUCT_H +#define RBFFI_STRUCT_H + +#include "extconf.h" +#include "AbstractMemory.h" +#include "Type.h" +#include <ruby/st.h> + +#ifdef __cplusplus +extern "C" { +#endif + + extern void rbffi_Struct_Init(VALUE ffiModule); + extern void rbffi_StructLayout_Init(VALUE ffiModule); + typedef struct StructField_ StructField; + typedef struct StructLayout_ StructLayout; + typedef struct Struct_ Struct; + + struct StructField_ { + Type* type; + unsigned int offset; + + int referenceIndex; + + bool referenceRequired; + VALUE rbType; + VALUE rbName; + + VALUE (*get)(StructField* field, Struct* s); + void (*put)(StructField* field, Struct* s, VALUE value); + + MemoryOp* memoryOp; + }; + + struct StructLayout_ { + Type base; + StructField** fields; + int fieldCount; + int size; + int align; + ffi_type** ffiTypes; + + /* + * We use the fieldName's minor 8 Bits as index to a 256 entry cache. + * This avoids full ruby hash lookups for repeated lookups. + */ + #define FIELD_CACHE_LOOKUP(this, sym) ( &(this)->cache_row[((sym) >> 8) & 0xff] ) + + struct field_cache_entry { + VALUE fieldName; + StructField *field; + } cache_row[0x100]; + + /** The number of reference tracking fields in this struct */ + int referenceFieldCount; + + VALUE rbFieldNames; + VALUE rbFieldMap; + VALUE rbFields; + }; + + struct Struct_ { + StructLayout* layout; + AbstractMemory* pointer; + VALUE* rbReferences; + + VALUE rbLayout; + VALUE rbPointer; + }; + + extern VALUE rbffi_StructClass, rbffi_StructLayoutClass; + extern VALUE rbffi_StructLayoutFieldClass, rbffi_StructLayoutFunctionFieldClass; + extern VALUE rbffi_StructLayoutArrayFieldClass; + extern VALUE rbffi_StructInlineArrayClass; + extern VALUE rbffi_StructLayoutCharArrayClass; + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_STRUCT_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Struct.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Struct.o new file mode 100644 index 000000000000..a298a8d49f07 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Struct.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructByValue.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructByValue.c new file mode 100644 index 000000000000..a3255f49f2f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructByValue.c @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +#include <sys/param.h> +#endif +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#include <errno.h> +#include <ruby.h> + +#include <ffi.h> +#include "rbffi.h" +#include "compat.h" + +#include "Type.h" +#include "StructByValue.h" +#include "Struct.h" + +#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) + +static VALUE sbv_allocate(VALUE); +static VALUE sbv_initialize(VALUE, VALUE); +static void sbv_mark(StructByValue *); +static void sbv_free(StructByValue *); + +VALUE rbffi_StructByValueClass = Qnil; + +static VALUE +sbv_allocate(VALUE klass) +{ + StructByValue* sbv; + + VALUE obj = Data_Make_Struct(klass, StructByValue, sbv_mark, sbv_free, sbv); + + sbv->rbStructClass = Qnil; + sbv->rbStructLayout = Qnil; + sbv->base.nativeType = NATIVE_STRUCT; + + sbv->base.ffiType = xcalloc(1, sizeof(*sbv->base.ffiType)); + sbv->base.ffiType->size = 0; + sbv->base.ffiType->alignment = 1; + sbv->base.ffiType->type = FFI_TYPE_STRUCT; + + return obj; +} + +static VALUE +sbv_initialize(VALUE self, VALUE rbStructClass) +{ + StructByValue* sbv = NULL; + StructLayout* layout = NULL; + VALUE rbLayout = Qnil; + + rbLayout = rb_ivar_get(rbStructClass, rb_intern("@layout")); + if (!rb_obj_is_instance_of(rbLayout, rbffi_StructLayoutClass)) { + rb_raise(rb_eTypeError, "wrong type in @layout ivar (expected FFI::StructLayout)"); + } + + Data_Get_Struct(rbLayout, StructLayout, layout); + Data_Get_Struct(self, StructByValue, sbv); + sbv->rbStructClass = rbStructClass; + sbv->rbStructLayout = rbLayout; + + /* We can just use everything from the ffi_type directly */ + *sbv->base.ffiType = *layout->base.ffiType; + + return self; +} + +static void +sbv_mark(StructByValue *sbv) +{ + rb_gc_mark(sbv->rbStructClass); + rb_gc_mark(sbv->rbStructLayout); +} + +static void +sbv_free(StructByValue *sbv) +{ + xfree(sbv->base.ffiType); + xfree(sbv); +} + + +static VALUE +sbv_layout(VALUE self) +{ + StructByValue* sbv; + + Data_Get_Struct(self, StructByValue, sbv); + return sbv->rbStructLayout; +} + +static VALUE +sbv_struct_class(VALUE self) +{ + StructByValue* sbv; + + Data_Get_Struct(self, StructByValue, sbv); + + return sbv->rbStructClass; +} + +void +rbffi_StructByValue_Init(VALUE moduleFFI) +{ + rbffi_StructByValueClass = rb_define_class_under(moduleFFI, "StructByValue", rbffi_TypeClass); + rb_global_variable(&rbffi_StructByValueClass); + rb_define_const(rbffi_TypeClass, "Struct", rbffi_StructByValueClass); + + rb_define_alloc_func(rbffi_StructByValueClass, sbv_allocate); + rb_define_method(rbffi_StructByValueClass, "initialize", sbv_initialize, 1); + rb_define_method(rbffi_StructByValueClass, "layout", sbv_layout, 0); + rb_define_method(rbffi_StructByValueClass, "struct_class", sbv_struct_class, 0); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructByValue.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructByValue.h new file mode 100644 index 000000000000..07b27639d1e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructByValue.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_STRUCTBYVALUE_H +#define RBFFI_STRUCTBYVALUE_H + +#include <ruby.h> +#include "Type.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct StructByValue_ { + Type base; + VALUE rbStructClass; + VALUE rbStructLayout; +} StructByValue; + +void rbffi_StructByValue_Init(VALUE moduleFFI); + +extern VALUE rbffi_StructByValueClass; + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_STRUCTBYVALUE_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructByValue.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructByValue.o new file mode 100644 index 000000000000..dc9a5ee77994 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructByValue.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructLayout.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructLayout.c new file mode 100644 index 000000000000..d318b8c3514e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructLayout.c @@ -0,0 +1,700 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> + +#ifndef _MSC_VER +# include <sys/param.h> +#endif +#include <stdint.h> +#include <stdbool.h> +#include <ruby.h> +#include "rbffi.h" +#include "compat.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "MemoryPointer.h" +#include "Function.h" +#include "Types.h" +#include "StructByValue.h" +#include "ArrayType.h" +#include "Function.h" +#include "MappedType.h" +#include "Struct.h" + +#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) + +static void struct_layout_mark(StructLayout *); +static void struct_layout_free(StructLayout *); +static void struct_field_mark(StructField* ); + +VALUE rbffi_StructLayoutFieldClass = Qnil; +VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil; +VALUE rbffi_StructLayoutStringFieldClass = Qnil; +VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldClass = Qnil; + +VALUE rbffi_StructLayoutClass = Qnil; + + +static VALUE +struct_field_allocate(VALUE klass) +{ + StructField* field; + VALUE obj; + + obj = Data_Make_Struct(klass, StructField, struct_field_mark, -1, field); + field->rbType = Qnil; + field->rbName = Qnil; + + return obj; +} + +static void +struct_field_mark(StructField* f) +{ + rb_gc_mark(f->rbType); + rb_gc_mark(f->rbName); +} + +/* + * call-seq: initialize(name, offset, type) + * @param [String,Symbol] name + * @param [Fixnum] offset + * @param [FFI::Type] type + * @return [self] + * A new FFI::StructLayout::Field instance. + */ +static VALUE +struct_field_initialize(int argc, VALUE* argv, VALUE self) +{ + VALUE rbOffset = Qnil, rbName = Qnil, rbType = Qnil; + StructField* field; + int nargs; + + Data_Get_Struct(self, StructField, field); + + nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType); + + if (TYPE(rbName) != T_SYMBOL && TYPE(rbName) != T_STRING) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Symbol/String)", + rb_obj_classname(rbName)); + } + + Check_Type(rbOffset, T_FIXNUM); + + if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected FFI::Type)", + rb_obj_classname(rbType)); + } + + field->offset = NUM2UINT(rbOffset); + field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName); + field->rbType = rbType; + Data_Get_Struct(field->rbType, Type, field->type); + field->memoryOp = get_memory_op(field->type); + field->referenceIndex = -1; + + switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) { + case NATIVE_FUNCTION: + case NATIVE_POINTER: + field->referenceRequired = true; + break; + + default: + field->referenceRequired = (rb_respond_to(self, rb_intern("reference_required?")) + && RTEST(rb_funcall2(self, rb_intern("reference_required?"), 0, NULL))) + || (rb_respond_to(rbType, rb_intern("reference_required?")) + && RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL))); + break; + } + + return self; +} + +/* + * call-seq: offset + * @return [Numeric] + * Get the field offset. + */ +static VALUE +struct_field_offset(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + return UINT2NUM(field->offset); +} + +/* + * call-seq: size + * @return [Numeric] + * Get the field size. + */ +static VALUE +struct_field_size(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + return UINT2NUM(field->type->ffiType->size); +} + +/* + * call-seq: alignment + * @return [Numeric] + * Get the field alignment. + */ +static VALUE +struct_field_alignment(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + return UINT2NUM(field->type->ffiType->alignment); +} + +/* + * call-seq: type + * @return [Type] + * Get the field type. + */ +static VALUE +struct_field_type(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + + return field->rbType; +} + +/* + * call-seq: name + * @return [Symbol] + * Get the field name. + */ +static VALUE +struct_field_name(VALUE self) +{ + StructField* field; + Data_Get_Struct(self, StructField, field); + return field->rbName; +} + +/* + * call-seq: get(pointer) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @return [Object] + * Get an object of type {#type} from memory pointed by +pointer+. + */ +static VALUE +struct_field_get(VALUE self, VALUE pointer) +{ + StructField* f; + + Data_Get_Struct(self, StructField, f); + if (f->memoryOp == NULL) { + rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType)); + return Qnil; + } + + return (*f->memoryOp->get)(MEMORY(pointer), f->offset); +} + +/* + * call-seq: put(pointer, value) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @param [Object] value this object must be a kind of {#type} + * @return [self] + * Put an object to memory pointed by +pointer+. + */ +static VALUE +struct_field_put(VALUE self, VALUE pointer, VALUE value) +{ + StructField* f; + + Data_Get_Struct(self, StructField, f); + if (f->memoryOp == NULL) { + rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType)); + return self; + } + + (*f->memoryOp->put)(MEMORY(pointer), f->offset, value); + + return self; +} + +/* + * call-seq: get(pointer) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @return [Function] + * Get a {Function} from memory pointed by +pointer+. + */ +static VALUE +function_field_get(VALUE self, VALUE pointer) +{ + StructField* f; + + Data_Get_Struct(self, StructField, f); + + return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset)); +} + +/* + * call-seq: put(pointer, proc) + * @param [AbstractMemory] pointer pointer to a {Struct} + * @param [Function, Proc] proc + * @return [Function] + * Set a {Function} to memory pointed by +pointer+ as a function. + * + * If a Proc is submitted as +proc+, it is automatically transformed to a {Function}. + */ +static VALUE +function_field_put(VALUE self, VALUE pointer, VALUE proc) +{ + StructField* f; + VALUE value = Qnil; + + Data_Get_Struct(self, StructField, f); + + if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) { + value = proc; + } else if (rb_obj_is_kind_of(proc, rb_cProc) || rb_respond_to(proc, rb_intern("call"))) { + value = rbffi_Function_ForProc(f->rbType, proc); + } else { + rb_raise(rb_eTypeError, "wrong type (expected Proc or Function)"); + } + + (*rbffi_AbstractMemoryOps.pointer->put)(MEMORY(pointer), f->offset, value); + + return self; +} + +static inline bool +isCharArray(ArrayType* arrayType) +{ + return arrayType->componentType->nativeType == NATIVE_INT8 + || arrayType->componentType->nativeType == NATIVE_UINT8; +} + +/* + * call-seq: get(pointer) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @return [FFI::StructLayout::CharArray, FFI::Struct::InlineArray] + * Get an array from a {Struct}. + */ +static VALUE +array_field_get(VALUE self, VALUE pointer) +{ + StructField* f; + ArrayType* array; + VALUE argv[2]; + + Data_Get_Struct(self, StructField, f); + Data_Get_Struct(f->rbType, ArrayType, array); + + argv[0] = pointer; + argv[1] = self; + + return rb_class_new_instance(2, argv, isCharArray(array) + ? rbffi_StructLayoutCharArrayClass : rbffi_StructInlineArrayClass); +} + +/* + * call-seq: put(pointer, value) + * @param [AbstractMemory] pointer pointer on a {Struct} + * @param [String, Array] value +value+ may be a String only if array's type is a kind of +int8+ + * @return [value] + * Set an array in a {Struct}. + */ +static VALUE +array_field_put(VALUE self, VALUE pointer, VALUE value) +{ + StructField* f; + ArrayType* array; + + + Data_Get_Struct(self, StructField, f); + Data_Get_Struct(f->rbType, ArrayType, array); + + if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) { + VALUE argv[2]; + + argv[0] = INT2FIX(f->offset); + argv[1] = value; + + if (RSTRING_LEN(value) < array->length) { + rb_funcall2(pointer, rb_intern("put_string"), 2, argv); + } else if (RSTRING_LEN(value) == array->length) { + rb_funcall2(pointer, rb_intern("put_bytes"), 2, argv); + } else { + rb_raise(rb_eIndexError, "String is longer (%ld bytes) than the char array (%d bytes)", RSTRING_LEN(value), array->length); + } + } else { +#ifdef notyet + MemoryOp* op; + int count = RARRAY_LEN(value); + int i; + AbstractMemory* memory = MEMORY(pointer); + + if (count > array->length) { + rb_raise(rb_eIndexError, "array too large"); + } + + /* clear the contents in case of a short write */ + checkWrite(memory); + checkBounds(memory, f->offset, f->type->ffiType->size); + if (count < array->length) { + memset(memory->address + f->offset + (count * array->componentType->ffiType->size), + 0, (array->length - count) * array->componentType->ffiType->size); + } + + /* now copy each element in */ + if ((op = get_memory_op(array->componentType)) != NULL) { + + for (i = 0; i < count; ++i) { + (*op->put)(memory, f->offset + (i * array->componentType->ffiType->size), rb_ary_entry(value, i)); + } + + } else if (array->componentType->nativeType == NATIVE_STRUCT) { + + for (i = 0; i < count; ++i) { + VALUE entry = rb_ary_entry(value, i); + Struct* s; + + if (!rb_obj_is_kind_of(entry, rbffi_StructClass)) { + rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct"); + break; + } + + Data_Get_Struct(entry, Struct, s); + checkRead(s->pointer); + checkBounds(s->pointer, 0, array->componentType->ffiType->size); + + memcpy(memory->address + f->offset + (i * array->componentType->ffiType->size), + s->pointer->address, array->componentType->ffiType->size); + } + + } else { + rb_raise(rb_eNotImpError, "put not supported for arrays of type %s", rb_obj_classname(array->rbComponentType)); + } +#else + rb_raise(rb_eNotImpError, "cannot set array field"); +#endif + } + + return value; +} + + +static VALUE +struct_layout_allocate(VALUE klass) +{ + StructLayout* layout; + VALUE obj; + + obj = Data_Make_Struct(klass, StructLayout, struct_layout_mark, struct_layout_free, layout); + layout->rbFieldMap = Qnil; + layout->rbFieldNames = Qnil; + layout->rbFields = Qnil; + layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType)); + layout->base.ffiType->size = 0; + layout->base.ffiType->alignment = 0; + layout->base.ffiType->type = FFI_TYPE_STRUCT; + + return obj; +} + +/* + * call-seq: initialize(fields, size, align) + * @param [Array<StructLayout::Field>] fields + * @param [Numeric] size + * @param [Numeric] align + * @return [self] + * A new StructLayout instance. + */ +static VALUE +struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align) +{ + StructLayout* layout; + ffi_type* ltype; + int i; + + Data_Get_Struct(self, StructLayout, layout); + layout->fieldCount = (int) RARRAY_LEN(fields); + layout->rbFieldMap = rb_hash_new(); + layout->rbFieldNames = rb_ary_new2(layout->fieldCount); + layout->size = (int) FFI_ALIGN(NUM2INT(size), NUM2INT(align)); + layout->align = NUM2INT(align); + layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *)); + layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *)); + layout->rbFields = rb_ary_new2(layout->fieldCount); + layout->referenceFieldCount = 0; + layout->base.ffiType->elements = layout->ffiTypes; + layout->base.ffiType->size = layout->size; + layout->base.ffiType->alignment = layout->align; + + ltype = layout->base.ffiType; + for (i = 0; i < (int) layout->fieldCount; ++i) { + VALUE rbField = rb_ary_entry(fields, i); + VALUE rbName; + StructField* field; + ffi_type* ftype; + + + if (!rb_obj_is_kind_of(rbField, rbffi_StructLayoutFieldClass)) { + rb_raise(rb_eTypeError, "wrong type for field %d.", i); + } + rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL); + + Data_Get_Struct(rbField, StructField, field); + layout->fields[i] = field; + + if (field->type == NULL || field->type->ffiType == NULL) { + rb_raise(rb_eRuntimeError, "type of field %d not supported", i); + } + + ftype = field->type->ffiType; + if (ftype->size == 0 && i < ((int) layout->fieldCount - 1)) { + rb_raise(rb_eTypeError, "type of field %d has zero size", i); + } + + if (field->referenceRequired) { + field->referenceIndex = layout->referenceFieldCount++; + } + + + layout->ffiTypes[i] = ftype->size > 0 ? ftype : NULL; + rb_hash_aset(layout->rbFieldMap, rbName, rbField); + rb_ary_push(layout->rbFields, rbField); + rb_ary_push(layout->rbFieldNames, rbName); + } + + if (ltype->size == 0) { + rb_raise(rb_eRuntimeError, "Struct size is zero"); + } + + return self; +} + +/* + * call-seq: [](field) + * @param [Symbol] field + * @return [StructLayout::Field] + * Get a field from the layout. + */ +static VALUE +struct_layout_union_bang(VALUE self) +{ + const ffi_type *alignment_types[] = { &ffi_type_sint8, &ffi_type_sint16, &ffi_type_sint32, &ffi_type_sint64, + &ffi_type_float, &ffi_type_double, &ffi_type_longdouble, NULL }; + StructLayout* layout; + ffi_type *t = NULL; + int count, i; + + Data_Get_Struct(self, StructLayout, layout); + + for (i = 0; alignment_types[i] != NULL; ++i) { + if (alignment_types[i]->alignment == layout->align) { + t = (ffi_type *) alignment_types[i]; + break; + } + } + if (t == NULL) { + rb_raise(rb_eRuntimeError, "cannot create libffi union representation for alignment %d", layout->align); + return Qnil; + } + + count = (int) layout->size / (int) t->size; + xfree(layout->ffiTypes); + layout->ffiTypes = xcalloc(count + 1, sizeof(ffi_type *)); + layout->base.ffiType->elements = layout->ffiTypes; + + for (i = 0; i < count; ++i) { + layout->ffiTypes[i] = t; + } + + return self; +} + +static VALUE +struct_layout_aref(VALUE self, VALUE field) +{ + StructLayout* layout; + + Data_Get_Struct(self, StructLayout, layout); + + return rb_hash_aref(layout->rbFieldMap, field); +} + +/* + * call-seq: fields + * @return [Array<StructLayout::Field>] + * Get fields list. + */ +static VALUE +struct_layout_fields(VALUE self) +{ + StructLayout* layout; + + Data_Get_Struct(self, StructLayout, layout); + + return rb_ary_dup(layout->rbFields); +} + +/* + * call-seq: members + * @return [Array<Symbol>] + * Get list of field names. + */ +static VALUE +struct_layout_members(VALUE self) +{ + StructLayout* layout; + + Data_Get_Struct(self, StructLayout, layout); + + return rb_ary_dup(layout->rbFieldNames); +} + +/* + * call-seq: to_a + * @return [Array<StructLayout::Field>] + * Get an array of fields. + */ +static VALUE +struct_layout_to_a(VALUE self) +{ + StructLayout* layout; + + Data_Get_Struct(self, StructLayout, layout); + + return rb_ary_dup(layout->rbFields); +} + +static void +struct_layout_mark(StructLayout *layout) +{ + rb_gc_mark(layout->rbFieldMap); + rb_gc_mark(layout->rbFieldNames); + rb_gc_mark(layout->rbFields); + /* Clear the cache, to be safe from changes of fieldName VALUE by GC.compact. + * TODO: Move cache clearing to compactation callback provided by Ruby-2.7+. + */ + memset(&layout->cache_row, 0, sizeof(layout->cache_row)); +} + +static void +struct_layout_free(StructLayout *layout) +{ + xfree(layout->ffiTypes); + xfree(layout->base.ffiType); + xfree(layout->fields); + xfree(layout); +} + + +void +rbffi_StructLayout_Init(VALUE moduleFFI) +{ + VALUE ffi_Type = rbffi_TypeClass; + + /* + * Document-class: FFI::StructLayout < FFI::Type + * + * This class aims at defining a struct layout. + */ + rbffi_StructLayoutClass = rb_define_class_under(moduleFFI, "StructLayout", ffi_Type); + rb_global_variable(&rbffi_StructLayoutClass); + + /* + * Document-class: FFI::StructLayout::Field + * A field in a {StructLayout}. + */ + rbffi_StructLayoutFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Field", rb_cObject); + rb_global_variable(&rbffi_StructLayoutFieldClass); + + /* + * Document-class: FFI::StructLayout::Number + * A numeric {Field} in a {StructLayout}. + */ + rbffi_StructLayoutNumberFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Number", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutNumberFieldClass); + + /* + * Document-class: FFI::StructLayout::String + * A string {Field} in a {StructLayout}. + */ + rbffi_StructLayoutStringFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "String", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutStringFieldClass); + + /* + * Document-class: FFI::StructLayout::Pointer + * A pointer {Field} in a {StructLayout}. + */ + rbffi_StructLayoutPointerFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Pointer", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutPointerFieldClass); + + /* + * Document-class: FFI::StructLayout::Function + * A function pointer {Field} in a {StructLayout}. + */ + rbffi_StructLayoutFunctionFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Function", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutFunctionFieldClass); + + /* + * Document-class: FFI::StructLayout::Array + * An array {Field} in a {StructLayout}. + */ + rbffi_StructLayoutArrayFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Array", rbffi_StructLayoutFieldClass); + rb_global_variable(&rbffi_StructLayoutArrayFieldClass); + + rb_define_alloc_func(rbffi_StructLayoutFieldClass, struct_field_allocate); + rb_define_method(rbffi_StructLayoutFieldClass, "initialize", struct_field_initialize, -1); + rb_define_method(rbffi_StructLayoutFieldClass, "offset", struct_field_offset, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "size", struct_field_size, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "alignment", struct_field_alignment, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "name", struct_field_name, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "type", struct_field_type, 0); + rb_define_method(rbffi_StructLayoutFieldClass, "put", struct_field_put, 2); + rb_define_method(rbffi_StructLayoutFieldClass, "get", struct_field_get, 1); + + rb_define_method(rbffi_StructLayoutFunctionFieldClass, "put", function_field_put, 2); + rb_define_method(rbffi_StructLayoutFunctionFieldClass, "get", function_field_get, 1); + + rb_define_method(rbffi_StructLayoutArrayFieldClass, "get", array_field_get, 1); + rb_define_method(rbffi_StructLayoutArrayFieldClass, "put", array_field_put, 2); + + rb_define_alloc_func(rbffi_StructLayoutClass, struct_layout_allocate); + rb_define_method(rbffi_StructLayoutClass, "initialize", struct_layout_initialize, 3); + rb_define_method(rbffi_StructLayoutClass, "[]", struct_layout_aref, 1); + rb_define_method(rbffi_StructLayoutClass, "fields", struct_layout_fields, 0); + rb_define_method(rbffi_StructLayoutClass, "members", struct_layout_members, 0); + rb_define_method(rbffi_StructLayoutClass, "to_a", struct_layout_to_a, 0); + rb_define_method(rbffi_StructLayoutClass, "__union!", struct_layout_union_bang, 0); + +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructLayout.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructLayout.o new file mode 100644 index 000000000000..a83c669fc85e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/StructLayout.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Thread.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Thread.c new file mode 100644 index 000000000000..f6a83873e928 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Thread.c @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stddef.h> +#include <stdbool.h> + +#if defined(__CYGWIN__) || !defined(_WIN32) +# include <pthread.h> +# include <errno.h> +# include <signal.h> +# include <unistd.h> +#else +# include <winsock2.h> +# define _WINSOCKAPI_ +# include <windows.h> +#endif +#include <fcntl.h> +#include "Thread.h" + +#ifdef _WIN32 +static volatile DWORD frame_thread_key = TLS_OUT_OF_INDEXES; +#else +static pthread_key_t thread_data_key; +struct thread_data { + rbffi_frame_t* frame; +}; +static inline struct thread_data* thread_data_get(void); + +#endif + +rbffi_frame_t* +rbffi_frame_current(void) +{ +#ifdef _WIN32 + return (rbffi_frame_t *) TlsGetValue(frame_thread_key); +#else + struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key); + return td != NULL ? td->frame : NULL; +#endif +} + +void +rbffi_frame_push(rbffi_frame_t* frame) +{ + memset(frame, 0, sizeof(*frame)); + frame->exc = Qnil; + +#ifdef _WIN32 + frame->prev = TlsGetValue(frame_thread_key); + TlsSetValue(frame_thread_key, frame); +#else + frame->td = thread_data_get(); + frame->prev = frame->td->frame; + frame->td->frame = frame; +#endif +} + +void +rbffi_frame_pop(rbffi_frame_t* frame) +{ +#ifdef _WIN32 + TlsSetValue(frame_thread_key, frame->prev); +#else + frame->td->frame = frame->prev; +#endif +} + +#ifndef _WIN32 +static struct thread_data* thread_data_init(void); + +static inline struct thread_data* +thread_data_get(void) +{ + struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key); + return td != NULL ? td : thread_data_init(); +} + +static struct thread_data* +thread_data_init(void) +{ + struct thread_data* td = calloc(1, sizeof(struct thread_data)); + + pthread_setspecific(thread_data_key, td); + + return td; +} + +static void +thread_data_free(void *ptr) +{ + free(ptr); +} +#endif + +void +rbffi_Thread_Init(VALUE moduleFFI) +{ +#ifdef _WIN32 + frame_thread_key = TlsAlloc(); +#else + pthread_key_create(&thread_data_key, thread_data_free); +#endif +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Thread.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Thread.h new file mode 100644 index 000000000000..8c335e4ffa17 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Thread.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2010 Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_THREAD_H +#define RBFFI_THREAD_H + +#include <stdbool.h> +#include <ruby.h> +#include "extconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef _WIN32 +# include <windows.h> +#else +# include <pthread.h> +#endif + +typedef struct { +#ifdef _WIN32 + DWORD id; +#else + pthread_t id; +#endif + bool valid; + bool has_gvl; + VALUE exc; +} rbffi_thread_t; + +typedef struct rbffi_frame { +#ifndef _WIN32 + struct thread_data* td; +#endif + struct rbffi_frame* prev; + VALUE exc; +} rbffi_frame_t; + +rbffi_frame_t* rbffi_frame_current(void); +void rbffi_frame_push(rbffi_frame_t* frame); +void rbffi_frame_pop(rbffi_frame_t* frame); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_THREAD_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Thread.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Thread.o new file mode 100644 index 000000000000..b7539fd6c88c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Thread.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Type.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Type.c new file mode 100644 index 000000000000..7776bb04774f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Type.c @@ -0,0 +1,379 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +# include <sys/param.h> +#endif + +#include <sys/types.h> +#include <ruby.h> +#include <ffi.h> +#include "rbffi.h" +#include "compat.h" +#include "Types.h" +#include "Type.h" + + +typedef struct BuiltinType_ { + Type type; + char* name; +} BuiltinType; + +static void builtin_type_free(BuiltinType *); + +VALUE rbffi_TypeClass = Qnil; + +static VALUE classBuiltinType = Qnil; +static VALUE moduleNativeType = Qnil; +static VALUE typeMap = Qnil, sizeMap = Qnil; +static ID id_find_type = 0, id_type_size = 0, id_size = 0; + +static VALUE +type_allocate(VALUE klass) +{ + Type* type; + VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type); + + type->nativeType = -1; + type->ffiType = &ffi_type_void; + + return obj; +} + +/* + * Document-method: initialize + * call-seq: initialize(value) + * @param [Fixnum,Type] value + * @return [self] + */ +static VALUE +type_initialize(VALUE self, VALUE value) +{ + Type* type; + Type* other; + + Data_Get_Struct(self, Type, type); + + if (FIXNUM_P(value)) { + type->nativeType = FIX2INT(value); + } else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) { + Data_Get_Struct(value, Type, other); + type->nativeType = other->nativeType; + type->ffiType = other->ffiType; + } else { + rb_raise(rb_eArgError, "wrong type"); + } + + return self; +} + +/* + * call-seq: type.size + * @return [Fixnum] + * Return type's size, in bytes. + */ +static VALUE +type_size(VALUE self) +{ + Type *type; + + Data_Get_Struct(self, Type, type); + + return INT2FIX(type->ffiType->size); +} + +/* + * call-seq: type.alignment + * @return [Fixnum] + * Get Type alignment. + */ +static VALUE +type_alignment(VALUE self) +{ + Type *type; + + Data_Get_Struct(self, Type, type); + + return INT2FIX(type->ffiType->alignment); +} + +/* + * call-seq: type.inspect + * @return [String] + * Inspect {Type} object. + */ +static VALUE +type_inspect(VALUE self) +{ + char buf[100]; + Type *type; + + Data_Get_Struct(self, Type, type); + + snprintf(buf, sizeof(buf), "#<%s:%p size=%d alignment=%d>", + rb_obj_classname(self), type, (int) type->ffiType->size, (int) type->ffiType->alignment); + + return rb_str_new2(buf); +} + +static VALUE +builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name) +{ + BuiltinType* type; + VALUE obj = Qnil; + + obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type); + + type->name = strdup(name); + type->type.nativeType = nativeType; + type->type.ffiType = ffiType; + + return obj; +} + +static void +builtin_type_free(BuiltinType *type) +{ + free(type->name); + xfree(type); +} + +/* + * call-seq: type.inspect + * @return [String] + * Inspect {Type::Builtin} object. + */ +static VALUE +builtin_type_inspect(VALUE self) +{ + char buf[100]; + BuiltinType *type; + + Data_Get_Struct(self, BuiltinType, type); + snprintf(buf, sizeof(buf), "#<%s:%s size=%d alignment=%d>", + rb_obj_classname(self), type->name, (int) type->type.ffiType->size, type->type.ffiType->alignment); + + return rb_str_new2(buf); +} + +int +rbffi_type_size(VALUE type) +{ + int t = TYPE(type); + + if (t == T_FIXNUM || t == T_BIGNUM) { + return NUM2INT(type); + + } else if (t == T_SYMBOL) { + /* + * Try looking up directly in the type and size maps + */ + VALUE nType; + if ((nType = rb_hash_lookup(typeMap, type)) != Qnil) { + if (rb_obj_is_kind_of(nType, rbffi_TypeClass)) { + Type* type; + Data_Get_Struct(nType, Type, type); + return (int) type->ffiType->size; + + } else if (rb_respond_to(nType, id_size)) { + return NUM2INT(rb_funcall2(nType, id_size, 0, NULL)); + } + } + + /* Not found - call up to the ruby version to resolve */ + return NUM2INT(rb_funcall2(rbffi_FFIModule, id_type_size, 1, &type)); + + } else { + return NUM2INT(rb_funcall2(type, id_size, 0, NULL)); + } +} + +VALUE +rbffi_Type_Lookup(VALUE name) +{ + int t = TYPE(name); + if (t == T_SYMBOL || t == T_STRING) { + /* + * Try looking up directly in the type Map + */ + VALUE nType; + if ((nType = rb_hash_lookup(typeMap, name)) != Qnil && rb_obj_is_kind_of(nType, rbffi_TypeClass)) { + return nType; + } + } else if (rb_obj_is_kind_of(name, rbffi_TypeClass)) { + + return name; + } + + /* Nothing found - let caller handle raising exceptions */ + return Qnil; +} + +void +rbffi_Type_Init(VALUE moduleFFI) +{ + /* + * Document-class: FFI::Type + * This class manages C types. + * + * It embbed {FFI::Type::Builtin} objects as constants (for names, + * see {FFI::NativeType}). + */ + rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject); + + /* + * Document-constant: FFI::TypeDefs + */ + rb_define_const(moduleFFI, "TypeDefs", typeMap = rb_hash_new()); + rb_define_const(moduleFFI, "SizeTypes", sizeMap = rb_hash_new()); + rb_global_variable(&typeMap); + rb_global_variable(&sizeMap); + id_find_type = rb_intern("find_type"); + id_type_size = rb_intern("type_size"); + id_size = rb_intern("size"); + + /* + * Document-class: FFI::Type::Builtin + * Class for Built-in types. + */ + classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass); + /* + * Document-module: FFI::NativeType + * This module defines constants for native (C) types. + * + * ==Native type constants + * Native types are defined by constants : + * * INT8, SCHAR, CHAR + * * UINT8, UCHAR + * * INT16, SHORT, SSHORT + * * UINT16, USHORT + * * INT32,, INT, SINT + * * UINT32, UINT + * * INT64, LONG_LONG, SLONG_LONG + * * UINT64, ULONG_LONG + * * LONG, SLONG + * * ULONG + * * FLOAT32, FLOAT + * * FLOAT64, DOUBLE + * * POINTER + * * CALLBACK + * * FUNCTION + * * CHAR_ARRAY + * * BOOL + * * STRING (immutable string, nul terminated) + * * STRUCT (struct-b-value param or result) + * * ARRAY (array type definition) + * * MAPPED (custom native type) + * For function return type only : + * * VOID + * For function argument type only : + * * BUFFER_IN + * * BUFFER_OUT + * * VARARGS (function takes a variable number of arguments) + * + * All these constants are exported to {FFI} module prefixed with "TYPE_". + * They are objets from {FFI::Type::Builtin} class. + */ + moduleNativeType = rb_define_module_under(moduleFFI, "NativeType"); + + /* + * Document-global: FFI::Type + */ + rb_global_variable(&rbffi_TypeClass); + rb_global_variable(&classBuiltinType); + rb_global_variable(&moduleNativeType); + + rb_define_alloc_func(rbffi_TypeClass, type_allocate); + rb_define_method(rbffi_TypeClass, "initialize", type_initialize, 1); + rb_define_method(rbffi_TypeClass, "size", type_size, 0); + rb_define_method(rbffi_TypeClass, "alignment", type_alignment, 0); + rb_define_method(rbffi_TypeClass, "inspect", type_inspect, 0); + + /* Make Type::Builtin non-allocatable */ + rb_undef_method(CLASS_OF(classBuiltinType), "new"); + rb_define_method(classBuiltinType, "inspect", builtin_type_inspect, 0); + + rb_global_variable(&rbffi_TypeClass); + rb_global_variable(&classBuiltinType); + + /* Define all the builtin types */ + #define T(x, ffiType) do { \ + VALUE t = Qnil; \ + rb_define_const(rbffi_TypeClass, #x, t = builtin_type_new(classBuiltinType, NATIVE_##x, ffiType, #x)); \ + rb_define_const(moduleNativeType, #x, t); \ + rb_define_const(moduleFFI, "TYPE_" #x, t); \ + } while(0) + + #define A(old_type, new_type) do { \ + VALUE t = rb_const_get(rbffi_TypeClass, rb_intern(#old_type)); \ + rb_const_set(rbffi_TypeClass, rb_intern(#new_type), t); \ + } while(0) + + /* + * Document-constant: FFI::Type::Builtin::VOID + */ + T(VOID, &ffi_type_void); + T(INT8, &ffi_type_sint8); + A(INT8, SCHAR); + A(INT8, CHAR); + T(UINT8, &ffi_type_uint8); + A(UINT8, UCHAR); + + T(INT16, &ffi_type_sint16); + A(INT16, SHORT); + A(INT16, SSHORT); + T(UINT16, &ffi_type_uint16); + A(UINT16, USHORT); + T(INT32, &ffi_type_sint32); + A(INT32, INT); + A(INT32, SINT); + T(UINT32, &ffi_type_uint32); + A(UINT32, UINT); + T(INT64, &ffi_type_sint64); + A(INT64, LONG_LONG); + A(INT64, SLONG_LONG); + T(UINT64, &ffi_type_uint64); + A(UINT64, ULONG_LONG); + T(LONG, &ffi_type_slong); + A(LONG, SLONG); + T(ULONG, &ffi_type_ulong); + T(FLOAT32, &ffi_type_float); + A(FLOAT32, FLOAT); + T(FLOAT64, &ffi_type_double); + A(FLOAT64, DOUBLE); + T(LONGDOUBLE, &ffi_type_longdouble); + T(POINTER, &ffi_type_pointer); + T(STRING, &ffi_type_pointer); + T(BUFFER_IN, &ffi_type_pointer); + T(BUFFER_OUT, &ffi_type_pointer); + T(BUFFER_INOUT, &ffi_type_pointer); + T(BOOL, &ffi_type_uchar); + T(VARARGS, &ffi_type_void); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Type.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Type.h new file mode 100644 index 000000000000..b81995acf269 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Type.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com> + * + * This file is part of ruby-ffi. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the Evan Phoenix nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef RBFFI_TYPE_H +#define RBFFI_TYPE_H + +#include <ruby.h> +#include <ffi.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct Type_ Type; + +#include "Types.h" + +struct Type_ { + NativeType nativeType; + ffi_type* ffiType; +}; + +extern VALUE rbffi_TypeClass; +extern VALUE rbffi_Type_Lookup(VALUE type); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_TYPE_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Type.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Type.o new file mode 100644 index 000000000000..4676b4032b0c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Type.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Types.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Types.c new file mode 100644 index 000000000000..77741e034d02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Types.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich + * Copyright (c) 2009, Aman Gupta. + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <ruby.h> +#include "Pointer.h" +#include "rbffi.h" +#include "Function.h" +#include "StructByValue.h" +#include "Types.h" +#include "Struct.h" +#include "MappedType.h" +#include "MemoryPointer.h" +#include "LongDouble.h" + +static ID id_from_native = 0; + + +VALUE +rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr) +{ + switch (type->nativeType) { + case NATIVE_VOID: + return Qnil; + case NATIVE_INT8: + return INT2NUM((signed char) *(ffi_sarg *) ptr); + case NATIVE_INT16: + return INT2NUM((signed short) *(ffi_sarg *) ptr); + case NATIVE_INT32: + return INT2NUM((signed int) *(ffi_sarg *) ptr); + case NATIVE_LONG: + return LONG2NUM((signed long) *(ffi_sarg *) ptr); + case NATIVE_INT64: + return LL2NUM(*(signed long long *) ptr); + + case NATIVE_UINT8: + return UINT2NUM((unsigned char) *(ffi_arg *) ptr); + case NATIVE_UINT16: + return UINT2NUM((unsigned short) *(ffi_arg *) ptr); + case NATIVE_UINT32: + return UINT2NUM((unsigned int) *(ffi_arg *) ptr); + case NATIVE_ULONG: + return ULONG2NUM((unsigned long) *(ffi_arg *) ptr); + case NATIVE_UINT64: + return ULL2NUM(*(unsigned long long *) ptr); + + case NATIVE_FLOAT32: + return rb_float_new(*(float *) ptr); + case NATIVE_FLOAT64: + return rb_float_new(*(double *) ptr); + + case NATIVE_LONGDOUBLE: + return rbffi_longdouble_new(*(long double *) ptr); + + case NATIVE_STRING: + return (*(void **) ptr != NULL) ? rb_str_new2(*(char **) ptr) : Qnil; + case NATIVE_POINTER: + return rbffi_Pointer_NewInstance(*(void **) ptr); + case NATIVE_BOOL: + return ((unsigned char) *(ffi_arg *) ptr) ? Qtrue : Qfalse; + + case NATIVE_FUNCTION: { + return *(void **) ptr != NULL + ? rbffi_Function_NewInstance(rbType, rbffi_Pointer_NewInstance(*(void **) ptr)) + : Qnil; + } + + case NATIVE_STRUCT: { + StructByValue* sbv = (StructByValue *)type; + AbstractMemory* mem; + VALUE rbMemory = rbffi_MemoryPointer_NewInstance(1, sbv->base.ffiType->size, false); + + Data_Get_Struct(rbMemory, AbstractMemory, mem); + memcpy(mem->address, ptr, sbv->base.ffiType->size); + RB_GC_GUARD(rbMemory); + RB_GC_GUARD(rbType); + + return rb_class_new_instance(1, &rbMemory, sbv->rbStructClass); + } + + case NATIVE_MAPPED: { + /* + * For mapped types, first convert to the real native type, then upcall to + * ruby to convert to the expected return type + */ + MappedType* m = (MappedType *) type; + VALUE values[2], rbReturnValue; + + values[0] = rbffi_NativeValue_ToRuby(m->type, m->rbType, ptr); + values[1] = Qnil; + + + rbReturnValue = rb_funcall2(m->rbConverter, id_from_native, 2, values); + RB_GC_GUARD(values[0]); + RB_GC_GUARD(rbType); + + return rbReturnValue; + } + + default: + rb_raise(rb_eRuntimeError, "Unknown type: %d", type->nativeType); + return Qnil; + } +} + +void +rbffi_Types_Init(VALUE moduleFFI) +{ + id_from_native = rb_intern("from_native"); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Types.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Types.h new file mode 100644 index 000000000000..4b72320859ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Types.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_TYPES_H +#define RBFFI_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + NATIVE_VOID, + NATIVE_INT8, + NATIVE_UINT8, + NATIVE_INT16, + NATIVE_UINT16, + NATIVE_INT32, + NATIVE_UINT32, + NATIVE_INT64, + NATIVE_UINT64, + NATIVE_LONG, + NATIVE_ULONG, + NATIVE_FLOAT32, + NATIVE_FLOAT64, + NATIVE_LONGDOUBLE, + NATIVE_POINTER, + NATIVE_FUNCTION, + NATIVE_BUFFER_IN, + NATIVE_BUFFER_OUT, + NATIVE_BUFFER_INOUT, + NATIVE_CHAR_ARRAY, + NATIVE_BOOL, + + /** An immutable string. Nul terminated, but only copies in to the native function */ + NATIVE_STRING, + + /** The function takes a variable number of arguments */ + NATIVE_VARARGS, + + /** Struct-by-value param or result */ + NATIVE_STRUCT, + + /** An array type definition */ + NATIVE_ARRAY, + + /** Custom native type */ + NATIVE_MAPPED, +} NativeType; + +#include <ffi.h> +#include "Type.h" + +VALUE rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr); +void rbffi_Types_Init(VALUE moduleFFI); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_TYPES_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Types.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Types.o new file mode 100644 index 000000000000..1409cea7001a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Types.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Variadic.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Variadic.c new file mode 100644 index 000000000000..8ad38b18836d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Variadic.c @@ -0,0 +1,303 @@ +/* + * Copyright (c) 2008-2010 Wayne Meissner + * Copyright (C) 2009 Andrea Fazzi <andrea.fazzi@alcacoop.it> + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MSC_VER +#include <sys/param.h> +#endif +#include <sys/types.h> + +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#include <ruby.h> + +#include <ffi.h> +#include "rbffi.h" +#include "compat.h" + +#include "AbstractMemory.h" +#include "Pointer.h" +#include "Types.h" +#include "Type.h" +#include "LastError.h" +#include "MethodHandle.h" +#include "Call.h" +#include "Thread.h" + +typedef struct VariadicInvoker_ { + VALUE rbAddress; + VALUE rbReturnType; + VALUE rbEnums; + + Type* returnType; + ffi_abi abi; + void* function; + int paramCount; + bool blocking; +} VariadicInvoker; + + +static VALUE variadic_allocate(VALUE klass); +static VALUE variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, + VALUE rbReturnType, VALUE options); +static void variadic_mark(VariadicInvoker *); + +static VALUE classVariadicInvoker = Qnil; + + +static VALUE +variadic_allocate(VALUE klass) +{ + VariadicInvoker *invoker; + VALUE obj = Data_Make_Struct(klass, VariadicInvoker, variadic_mark, -1, invoker); + + invoker->rbAddress = Qnil; + invoker->rbEnums = Qnil; + invoker->rbReturnType = Qnil; + invoker->blocking = false; + + return obj; +} + +static void +variadic_mark(VariadicInvoker *invoker) +{ + rb_gc_mark(invoker->rbEnums); + rb_gc_mark(invoker->rbAddress); + rb_gc_mark(invoker->rbReturnType); +} + +static VALUE +variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, VALUE rbReturnType, VALUE options) +{ + VariadicInvoker* invoker = NULL; + VALUE retval = Qnil; + VALUE convention = Qnil; + VALUE fixed = Qnil; +#if defined(X86_WIN32) + VALUE rbConventionStr; +#endif + int i; + + Check_Type(options, T_HASH); + convention = rb_hash_aref(options, ID2SYM(rb_intern("convention"))); + + Data_Get_Struct(self, VariadicInvoker, invoker); + invoker->rbEnums = rb_hash_aref(options, ID2SYM(rb_intern("enums"))); + invoker->rbAddress = rbFunction; + invoker->function = rbffi_AbstractMemory_Cast(rbFunction, rbffi_PointerClass)->address; + invoker->blocking = RTEST(rb_hash_aref(options, ID2SYM(rb_intern("blocking")))); + +#if defined(X86_WIN32) + rbConventionStr = rb_funcall2(convention, rb_intern("to_s"), 0, NULL); + invoker->abi = (RTEST(convention) && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0) + ? FFI_STDCALL : FFI_DEFAULT_ABI; +#else + invoker->abi = FFI_DEFAULT_ABI; +#endif + + invoker->rbReturnType = rbffi_Type_Lookup(rbReturnType); + if (!RTEST(invoker->rbReturnType)) { + VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL); + rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName)); + } + + Data_Get_Struct(rbReturnType, Type, invoker->returnType); + + invoker->paramCount = -1; + + fixed = rb_ary_new2(RARRAY_LEN(rbParameterTypes) - 1); + for (i = 0; i < RARRAY_LEN(rbParameterTypes); ++i) { + VALUE entry = rb_ary_entry(rbParameterTypes, i); + VALUE rbType = rbffi_Type_Lookup(entry); + Type* type; + + if (!RTEST(rbType)) { + VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL); + rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName)); + } + Data_Get_Struct(rbType, Type, type); + if (type->nativeType != NATIVE_VARARGS) { + rb_ary_push(fixed, entry); + } + } + /* + * @fixed and @type_map are used by the parameter mangling ruby code + */ + rb_iv_set(self, "@fixed", fixed); + rb_iv_set(self, "@type_map", rb_hash_aref(options, ID2SYM(rb_intern("type_map")))); + + return retval; +} + +static VALUE +variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues) +{ + VariadicInvoker* invoker; + FFIStorage* params; + void* retval; + ffi_cif cif; + void** ffiValues; + ffi_type** ffiParamTypes; + ffi_type* ffiReturnType; + Type** paramTypes; + VALUE* argv; + VALUE* callbackParameters; + int paramCount = 0, fixedCount = 0, callbackCount = 0, i; + ffi_status ffiStatus; + rbffi_frame_t frame = { 0 }; + + Check_Type(parameterTypes, T_ARRAY); + Check_Type(parameterValues, T_ARRAY); + + Data_Get_Struct(self, VariadicInvoker, invoker); + paramCount = (int) RARRAY_LEN(parameterTypes); + paramTypes = ALLOCA_N(Type *, paramCount); + ffiParamTypes = ALLOCA_N(ffi_type *, paramCount); + params = ALLOCA_N(FFIStorage, paramCount); + ffiValues = ALLOCA_N(void*, paramCount); + argv = ALLOCA_N(VALUE, paramCount); + callbackParameters = ALLOCA_N(VALUE, paramCount); + retval = alloca(MAX(invoker->returnType->ffiType->size, FFI_SIZEOF_ARG)); + + for (i = 0; i < paramCount; ++i) { + VALUE rbType = rb_ary_entry(parameterTypes, i); + + if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) { + rb_raise(rb_eTypeError, "wrong type. Expected (FFI::Type)"); + } + Data_Get_Struct(rbType, Type, paramTypes[i]); + + switch (paramTypes[i]->nativeType) { + case NATIVE_INT8: + case NATIVE_INT16: + case NATIVE_INT32: + rbType = rb_const_get(rbffi_TypeClass, rb_intern("INT32")); + Data_Get_Struct(rbType, Type, paramTypes[i]); + break; + case NATIVE_UINT8: + case NATIVE_UINT16: + case NATIVE_UINT32: + rbType = rb_const_get(rbffi_TypeClass, rb_intern("UINT32")); + Data_Get_Struct(rbType, Type, paramTypes[i]); + break; + + case NATIVE_FLOAT32: + rbType = rb_const_get(rbffi_TypeClass, rb_intern("DOUBLE")); + Data_Get_Struct(rbType, Type, paramTypes[i]); + break; + + case NATIVE_FUNCTION: + if (!rb_obj_is_kind_of(rbType, rbffi_FunctionTypeClass)) { + VALUE typeName = rb_funcall2(rbType, rb_intern("inspect"), 0, NULL); + rb_raise(rb_eTypeError, "Incorrect parameter type (%s)", RSTRING_PTR(typeName)); + } + callbackParameters[callbackCount++] = rbType; + break; + + default: + break; + } + + + ffiParamTypes[i] = paramTypes[i]->ffiType; + if (ffiParamTypes[i] == NULL) { + rb_raise(rb_eArgError, "Invalid parameter type #%x", paramTypes[i]->nativeType); + } + argv[i] = rb_ary_entry(parameterValues, i); + } + + ffiReturnType = invoker->returnType->ffiType; + if (ffiReturnType == NULL) { + rb_raise(rb_eArgError, "Invalid return type"); + } + + /*Get the number of fixed args from @fixed array*/ + fixedCount = RARRAY_LEN(rb_iv_get(self, "@fixed")); + +#ifdef HAVE_FFI_PREP_CIF_VAR + ffiStatus = ffi_prep_cif_var(&cif, invoker->abi, fixedCount, paramCount, ffiReturnType, ffiParamTypes); +#else + ffiStatus = ffi_prep_cif(&cif, invoker->abi, paramCount, ffiReturnType, ffiParamTypes); +#endif + switch (ffiStatus) { + case FFI_BAD_ABI: + rb_raise(rb_eArgError, "Invalid ABI specified"); + case FFI_BAD_TYPEDEF: + rb_raise(rb_eArgError, "Invalid argument type specified"); + case FFI_OK: + break; + default: + rb_raise(rb_eArgError, "Unknown FFI error"); + } + + rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params, + ffiValues, callbackParameters, callbackCount, invoker->rbEnums); + + rbffi_frame_push(&frame); + + if(unlikely(invoker->blocking)) { + rbffi_blocking_call_t* bc; + bc = ALLOCA_N(rbffi_blocking_call_t, 1); + bc->retval = retval; + bc->function = invoker->function; + bc->ffiValues = ffiValues; + bc->params = params; + bc->frame = &frame; + bc->cif = cif; + + rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0); + } else { + ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues); + } + + rbffi_frame_pop(&frame); + + rbffi_save_errno(); + + if (RTEST(frame.exc) && frame.exc != Qnil) { + rb_exc_raise(frame.exc); + } + + return rbffi_NativeValue_ToRuby(invoker->returnType, invoker->rbReturnType, retval); +} + + +void +rbffi_Variadic_Init(VALUE moduleFFI) +{ + classVariadicInvoker = rb_define_class_under(moduleFFI, "VariadicInvoker", rb_cObject); + rb_global_variable(&classVariadicInvoker); + + rb_define_alloc_func(classVariadicInvoker, variadic_allocate); + + rb_define_method(classVariadicInvoker, "initialize", variadic_initialize, 4); + rb_define_method(classVariadicInvoker, "invoke", variadic_invoke, 2); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Variadic.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Variadic.o new file mode 100644 index 000000000000..bc5dd49b05ff Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/Variadic.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/compat.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/compat.h new file mode 100644 index 000000000000..3f7bbaed186d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/compat.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_COMPAT_H +#define RBFFI_COMPAT_H + +#include <ruby.h> + +#ifndef RARRAY_LEN +# define RARRAY_LEN(ary) RARRAY(ary)->len +#endif + +#ifndef RARRAY_PTR +# define RARRAY_PTR(ary) RARRAY(ary)->ptr +#endif + +#ifndef RSTRING_LEN +# define RSTRING_LEN(s) RSTRING(s)->len +#endif + +#ifndef RSTRING_PTR +# define RSTRING_PTR(s) RSTRING(s)->ptr +#endif + +#ifndef NUM2ULL +# define NUM2ULL(x) rb_num2ull((VALUE)x) +#endif + +#ifndef roundup +# define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#endif + +#ifdef __GNUC__ +# define likely(x) __builtin_expect((x), 1) +# define unlikely(x) __builtin_expect((x), 0) +#else +# define likely(x) (x) +# define unlikely(x) (x) +#endif + +#ifdef _MSC_VER +#define ffi_type_longdouble ffi_type_double +#endif + +#ifndef MAX +# define MAX(a, b) ((a) < (b) ? (b) : (a)) +#endif +#ifndef MIN +# define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef RB_GC_GUARD +# define RB_GC_GUARD(x) (x) +#endif + +#endif /* RBFFI_COMPAT_H */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/extconf.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/extconf.h new file mode 100644 index 000000000000..6f70c69aae7d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/extconf.h @@ -0,0 +1,5 @@ +#ifndef EXTCONF_H +#define EXTCONF_H +#define HAVE_FFI_PREP_CIF_VAR 1 +#define USE_INTERNAL_LIBFFI 1 +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/extconf.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/extconf.rb new file mode 100644 index 000000000000..cdeaa9bd8905 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/extconf.rb @@ -0,0 +1,95 @@ +#!/usr/bin/env ruby + +if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx' + require 'mkmf' + require 'rbconfig' + + def system_libffi_usable? + # We need pkg_config or ffi.h + libffi_ok = pkg_config("libffi") || + have_header("ffi.h") || + find_header("ffi.h", "/usr/local/include", "/usr/include/ffi", + "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/ffi", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/ffi") || + (find_header("ffi.h", `xcrun --sdk macosx --show-sdk-path`.strip + "/usr/include/ffi") rescue false) + + # Ensure we can link to ffi_prep_closure_loc + libffi_ok &&= have_library("ffi", "ffi_prep_closure_loc", [ "ffi.h" ]) || + have_library("libffi", "ffi_prep_closure_loc", [ "ffi.h" ]) || + have_library("libffi-8", "ffi_prep_closure_loc", [ "ffi.h" ]) + + if RbConfig::CONFIG['host_os'] =~ /mswin/ + have_library('libffi_convenience') + have_library('shlwapi') + end + + libffi_ok + end + + dir_config("ffi_c") + + # recent versions of ruby add restrictive ansi and warning flags on a whim - kill them all + $warnflags = '' + $CFLAGS.gsub!(/[\s+]-ansi/, '') + $CFLAGS.gsub!(/[\s+]-std=[^\s]+/, '') + # solaris 10 needs -c99 for <stdbool.h> + $CFLAGS << " -std=c99" if RbConfig::CONFIG['host_os'] =~ /solaris(!?2\.11)/ + + # Check whether we use system libffi + system_libffi = enable_config('system-libffi', :try) + + if system_libffi == :try + system_libffi = ENV['RUBY_CC_VERSION'].nil? && system_libffi_usable? + elsif system_libffi + abort "system libffi is not usable" unless system_libffi_usable? + end + + if system_libffi + have_func('ffi_prep_cif_var') + $defs << "-DHAVE_RAW_API" if have_func("ffi_raw_call") && have_func("ffi_prep_raw_closure") + else + $defs << "-DHAVE_FFI_PREP_CIF_VAR" + $defs << "-DUSE_INTERNAL_LIBFFI" + + # Ensure libffi symbols aren't exported when using static libffi. + # This is to avoid interference with other gems like fiddle. + # See https://github.com/ffi/ffi/issues/835 + append_ldflags "-Wl,--exclude-libs,ALL" + end + + ffi_alloc_default = RbConfig::CONFIG['host_os'] =~ /darwin/i && RbConfig::CONFIG['host'] =~ /arm/i + if enable_config('libffi-alloc', ffi_alloc_default) + $defs << "-DUSE_FFI_ALLOC" + end + + $defs << "-DHAVE_EXTCONF_H" if $defs.empty? # needed so create_header works + + create_header + create_makefile("ffi_c") + + unless system_libffi + File.open("Makefile", "a") do |mf| + mf.puts "LIBFFI_HOST=--host=#{RbConfig::CONFIG['host_alias']}" if RbConfig::CONFIG.has_key?("host_alias") + if RbConfig::CONFIG['host_os'] =~ /darwin/i + if RbConfig::CONFIG['host'] =~ /arm/i + mf.puts "LIBFFI_HOST=--host=aarch64-apple-#{RbConfig::CONFIG['host_os']}" + end + mf.puts "include ${srcdir}/libffi.darwin.mk" + elsif RbConfig::CONFIG['host_os'] =~ /bsd/i + mf.puts '.include "${srcdir}/libffi.bsd.mk"' + elsif RbConfig::CONFIG['host_os'] =~ /mswin64/i + mf.puts '!include $(srcdir)/libffi.vc64.mk' + elsif RbConfig::CONFIG['host_os'] =~ /mswin32/i + mf.puts '!include $(srcdir)/libffi.vc.mk' + else + mf.puts "include ${srcdir}/libffi.mk" + end + end + end + +else + File.open("Makefile", "w") do |mf| + mf.puts "# Dummy makefile for non-mri rubies" + mf.puts "all install::\n" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ffi.c new file mode 100644 index 000000000000..22ea3bf7b211 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ffi.c @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com> + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <ruby.h> + +#include <ffi.h> + +#include "rbffi.h" +#include "AbstractMemory.h" +#include "Pointer.h" +#include "MemoryPointer.h" +#include "Struct.h" +#include "StructByValue.h" +#include "DynamicLibrary.h" +#include "Platform.h" +#include "Types.h" +#include "LastError.h" +#include "Function.h" +#include "ClosurePool.h" +#include "MethodHandle.h" +#include "Call.h" +#include "ArrayType.h" +#include "MappedType.h" + +void Init_ffi_c(void); + +VALUE rbffi_FFIModule = Qnil; + +static VALUE moduleFFI = Qnil; + +void +Init_ffi_c(void) +{ + /* + * Document-module: FFI + * + * This module embbed type constants from {FFI::NativeType}. + */ + rbffi_FFIModule = moduleFFI = rb_define_module("FFI"); + rb_global_variable(&rbffi_FFIModule); + + rbffi_Thread_Init(rbffi_FFIModule); + + /* FFI::Type needs to be initialized before most other classes */ + rbffi_Type_Init(moduleFFI); + + rbffi_ArrayType_Init(moduleFFI); + rbffi_LastError_Init(moduleFFI); + rbffi_Call_Init(moduleFFI); + rbffi_ClosurePool_Init(moduleFFI); + rbffi_MethodHandle_Init(moduleFFI); + rbffi_Platform_Init(moduleFFI); + rbffi_AbstractMemory_Init(moduleFFI); + rbffi_Pointer_Init(moduleFFI); + rbffi_Function_Init(moduleFFI); + rbffi_MemoryPointer_Init(moduleFFI); + rbffi_Buffer_Init(moduleFFI); + rbffi_StructByValue_Init(moduleFFI); + rbffi_Struct_Init(moduleFFI); + rbffi_DynamicLibrary_Init(moduleFFI); + rbffi_Variadic_Init(moduleFFI); + rbffi_Types_Init(moduleFFI); + rbffi_MappedType_Init(moduleFFI); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ffi.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ffi.o new file mode 100644 index 000000000000..08dcfaac133e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ffi.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ffi_c.so b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ffi_c.so new file mode 100644 index 000000000000..5708a8ee3700 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/ffi_c.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.la b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.la new file mode 120000 index 000000000000..004dbb5d10a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.la @@ -0,0 +1 @@ +../libffi.la \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.lai b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.lai new file mode 100644 index 000000000000..0bb3f73fc357 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.lai @@ -0,0 +1,41 @@ +# libffi.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libffi.so.8' + +# Names of this library. +library_names='libffi.so.8.1.0 libffi.so.8 libffi.so' + +# The name of the static archive. +old_library='' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libffi. +current=9 +age=1 +revision=0 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib/../lib' diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.so b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.so new file mode 120000 index 000000000000..8cc7c5497b12 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.so @@ -0,0 +1 @@ +libffi.so.8.1.0 \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.so.8 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.so.8 new file mode 120000 index 000000000000..8cc7c5497b12 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.so.8 @@ -0,0 +1 @@ +libffi.so.8.1.0 \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.so.8.1.0 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.so.8.1.0 new file mode 100644 index 000000000000..10d22ff67281 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi.so.8.1.0 differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi_convenience.a b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi_convenience.a new file mode 100644 index 000000000000..73e22196ba64 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi_convenience.a differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi_convenience.la b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi_convenience.la new file mode 120000 index 000000000000..0727452facd9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/.libs/libffi_convenience.la @@ -0,0 +1 @@ +../libffi_convenience.la \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/Makefile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/Makefile new file mode 100644 index 000000000000..67bfde2fcb85 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/Makefile @@ -0,0 +1,2060 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + + + +VPATH = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +target_triplet = x86_64-pc-linux-gnu +#am__append_1 = doc +#am__append_2 = src/debug.c +# Build debug. Define FFI_DEBUG on the commandline so that, when building with +# MSVC, it can link against the debug CRT. +#am__append_3 = -DFFI_DEBUG +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(noinst_HEADERS) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = fficonfig.h +CONFIG_CLEAN_FILES = libffi.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(toolexeclibdir)" \ + "$(DESTDIR)$(pkgconfigdir)" +LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) +am__DEPENDENCIES_1 = +am__libffi_la_SOURCES_DIST = src/prep_cif.c src/types.c src/raw_api.c \ + src/java_raw_api.c src/closures.c src/debug.c +am__dirstamp = $(am__leading_dot)dirstamp +#am__objects_1 = src/debug.lo +am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \ + src/java_raw_api.lo src/closures.lo $(am__objects_1) +libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__v_lt_1 = +libffi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ +am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +am__libffi_convenience_la_SOURCES_DIST = src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c src/closures.c src/debug.c +am__objects_2 = src/prep_cif.lo src/types.lo src/raw_api.lo \ + src/java_raw_api.lo src/closures.lo $(am__objects_1) +am_libffi_convenience_la_OBJECTS = $(am__objects_2) +nodist_libffi_convenience_la_OBJECTS = +libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ + $(nodist_libffi_convenience_la_OBJECTS) +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I. -I$(srcdir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = src/$(DEPDIR)/closures.Plo \ + src/$(DEPDIR)/debug.Plo src/$(DEPDIR)/java_raw_api.Plo \ + src/$(DEPDIR)/prep_cif.Plo src/$(DEPDIR)/raw_api.Plo \ + src/$(DEPDIR)/types.Plo src/aarch64/$(DEPDIR)/ffi.Plo \ + src/aarch64/$(DEPDIR)/sysv.Plo \ + src/aarch64/$(DEPDIR)/win64_armasm.Plo \ + src/alpha/$(DEPDIR)/ffi.Plo src/alpha/$(DEPDIR)/osf.Plo \ + src/arc/$(DEPDIR)/arcompact.Plo src/arc/$(DEPDIR)/ffi.Plo \ + src/arm/$(DEPDIR)/ffi.Plo src/arm/$(DEPDIR)/sysv.Plo \ + src/arm/$(DEPDIR)/sysv_msvc_arm32.Plo \ + src/avr32/$(DEPDIR)/ffi.Plo src/avr32/$(DEPDIR)/sysv.Plo \ + src/bfin/$(DEPDIR)/ffi.Plo src/bfin/$(DEPDIR)/sysv.Plo \ + src/cris/$(DEPDIR)/ffi.Plo src/cris/$(DEPDIR)/sysv.Plo \ + src/csky/$(DEPDIR)/ffi.Plo src/csky/$(DEPDIR)/sysv.Plo \ + src/frv/$(DEPDIR)/eabi.Plo src/frv/$(DEPDIR)/ffi.Plo \ + src/ia64/$(DEPDIR)/ffi.Plo src/ia64/$(DEPDIR)/unix.Plo \ + src/kvx/$(DEPDIR)/ffi.Plo src/kvx/$(DEPDIR)/sysv.Plo \ + src/m32r/$(DEPDIR)/ffi.Plo src/m32r/$(DEPDIR)/sysv.Plo \ + src/m68k/$(DEPDIR)/ffi.Plo src/m68k/$(DEPDIR)/sysv.Plo \ + src/m88k/$(DEPDIR)/ffi.Plo src/m88k/$(DEPDIR)/obsd.Plo \ + src/metag/$(DEPDIR)/ffi.Plo src/metag/$(DEPDIR)/sysv.Plo \ + src/microblaze/$(DEPDIR)/ffi.Plo \ + src/microblaze/$(DEPDIR)/sysv.Plo src/mips/$(DEPDIR)/ffi.Plo \ + src/mips/$(DEPDIR)/n32.Plo src/mips/$(DEPDIR)/o32.Plo \ + src/moxie/$(DEPDIR)/eabi.Plo src/moxie/$(DEPDIR)/ffi.Plo \ + src/nios2/$(DEPDIR)/ffi.Plo src/nios2/$(DEPDIR)/sysv.Plo \ + src/or1k/$(DEPDIR)/ffi.Plo src/or1k/$(DEPDIR)/sysv.Plo \ + src/pa/$(DEPDIR)/ffi.Plo src/pa/$(DEPDIR)/hpux32.Plo \ + src/pa/$(DEPDIR)/linux.Plo src/powerpc/$(DEPDIR)/aix.Plo \ + src/powerpc/$(DEPDIR)/aix_closure.Plo \ + src/powerpc/$(DEPDIR)/darwin.Plo \ + src/powerpc/$(DEPDIR)/darwin_closure.Plo \ + src/powerpc/$(DEPDIR)/ffi.Plo \ + src/powerpc/$(DEPDIR)/ffi_darwin.Plo \ + src/powerpc/$(DEPDIR)/ffi_linux64.Plo \ + src/powerpc/$(DEPDIR)/ffi_sysv.Plo \ + src/powerpc/$(DEPDIR)/linux64.Plo \ + src/powerpc/$(DEPDIR)/linux64_closure.Plo \ + src/powerpc/$(DEPDIR)/ppc_closure.Plo \ + src/powerpc/$(DEPDIR)/sysv.Plo src/riscv/$(DEPDIR)/ffi.Plo \ + src/riscv/$(DEPDIR)/sysv.Plo src/s390/$(DEPDIR)/ffi.Plo \ + src/s390/$(DEPDIR)/sysv.Plo src/sh/$(DEPDIR)/ffi.Plo \ + src/sh/$(DEPDIR)/sysv.Plo src/sh64/$(DEPDIR)/ffi.Plo \ + src/sh64/$(DEPDIR)/sysv.Plo src/sparc/$(DEPDIR)/ffi.Plo \ + src/sparc/$(DEPDIR)/ffi64.Plo src/sparc/$(DEPDIR)/v8.Plo \ + src/sparc/$(DEPDIR)/v9.Plo src/tile/$(DEPDIR)/ffi.Plo \ + src/tile/$(DEPDIR)/tile.Plo src/vax/$(DEPDIR)/elfbsd.Plo \ + src/vax/$(DEPDIR)/ffi.Plo src/x86/$(DEPDIR)/ffi.Plo \ + src/x86/$(DEPDIR)/ffi64.Plo src/x86/$(DEPDIR)/ffiw64.Plo \ + src/x86/$(DEPDIR)/sysv.Plo src/x86/$(DEPDIR)/sysv_intel.Plo \ + src/x86/$(DEPDIR)/unix64.Plo src/x86/$(DEPDIR)/win64.Plo \ + src/x86/$(DEPDIR)/win64_intel.Plo src/xtensa/$(DEPDIR)/ffi.Plo \ + src/xtensa/$(DEPDIR)/sysv.Plo +am__mv = mv -f +CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +LTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CCASFLAGS) $(CCASFLAGS) +AM_V_CPPAS = $(am__v_CPPAS_$(V)) +am__v_CPPAS_ = $(am__v_CPPAS_$(AM_DEFAULT_VERBOSITY)) +am__v_CPPAS_0 = @echo " CPPAS " $@; +am__v_CPPAS_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libffi_la_SOURCES) $(EXTRA_libffi_la_SOURCES) \ + $(libffi_convenience_la_SOURCES) \ + $(EXTRA_libffi_convenience_la_SOURCES) \ + $(nodist_libffi_convenience_la_SOURCES) +DIST_SOURCES = $(am__libffi_la_SOURCES_DIST) \ + $(EXTRA_libffi_la_SOURCES) \ + $(am__libffi_convenience_la_SOURCES_DIST) \ + $(EXTRA_libffi_convenience_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(pkgconfig_DATA) +HEADERS = $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir distdir-am dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)fficonfig.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +DIST_SUBDIRS = include testsuite man doc +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/fficonfig.h.in \ + $(srcdir)/libffi.pc.in compile config.guess config.sub depcomp \ + install-sh ltmain.sh missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing aclocal-1.16 +ALLOCA = +AMTAR = $${TAR-tar} +AM_DEFAULT_VERBOSITY = 1 +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoconf +AUTOHEADER = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoheader +AUTOMAKE = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing automake-1.16 +AWK = mawk +CC = gcc +CCAS = gcc +CCASDEPMODE = depmode=none +CCASFLAGS = +CCDEPMODE = depmode=none +CFLAGS = -Wall -fexceptions +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXCPP = g++ -E +CXXDEPMODE = depmode=none +CXXFLAGS = -g -O2 +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +HAVE_LONG_DOUBLE_VARIANT = 0 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld +LDFLAGS = +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +MAINT = # +MAKEINFO = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OPT_LDFLAGS = -Wl,-O1 +OTOOL = +OTOOL64 = +PACKAGE = libffi +PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.3 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.3 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SECTION_LDFLAGS = +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_64 +TARGETDIR = x86 +TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo +VERSION = 3.3 +abs_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux +abs_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +abs_top_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux +abs_top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_CXX = g++ +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +sys_symbol_underscore = no +sysconfdir = ${prefix}/etc +target = x86_64-pc-linux-gnu +target_alias = +target_cpu = x86_64 +target_os = linux-gnu +target_vendor = pc +toolexecdir = ${libdir}/gcc-lib/$(target_alias) +toolexeclibdir = ${libdir}/../lib +top_build_prefix = +top_builddir = . +top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign subdir-objects +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = include testsuite man $(am__append_1) +EXTRA_DIST = LICENSE ChangeLog.old \ + m4/libtool.m4 m4/lt~obsolete.m4 \ + m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ + m4/ltversion.m4 src/debug.c msvcc.sh \ + generate-darwin-source-and-headers.py \ + libffi.xcodeproj/project.pbxproj \ + libtool-ldflags libtool-version configure.host README.md \ + libffi.map.in LICENSE-BUILDTOOLS msvc_build make_sunver.pl + + +# local.exp is generated by configure +DISTCLEANFILES = local.exp + +# Subdir rules rely on $(FLAGS_TO_PASS) +FLAGS_TO_PASS = $(AM_MAKEFLAGS) +MAKEOVERRIDES = +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libffi.pc +toolexeclib_LTLIBRARIES = libffi.la +noinst_LTLIBRARIES = libffi_convenience.la +libffi_la_SOURCES = src/prep_cif.c src/types.c src/raw_api.c \ + src/java_raw_api.c src/closures.c $(am__append_2) +noinst_HEADERS = src/aarch64/ffitarget.h src/aarch64/internal.h \ + src/alpha/ffitarget.h src/alpha/internal.h \ + src/arc/ffitarget.h src/arm/ffitarget.h src/arm/internal.h \ + src/avr32/ffitarget.h src/bfin/ffitarget.h \ + src/cris/ffitarget.h src/csky/ffitarget.h src/frv/ffitarget.h \ + src/ia64/ffitarget.h src/ia64/ia64_flags.h \ + src/m32r/ffitarget.h src/m68k/ffitarget.h \ + src/m88k/ffitarget.h src/metag/ffitarget.h \ + src/microblaze/ffitarget.h src/mips/ffitarget.h \ + src/moxie/ffitarget.h src/nios2/ffitarget.h \ + src/or1k/ffitarget.h src/pa/ffitarget.h \ + src/powerpc/ffitarget.h src/powerpc/asm.h \ + src/powerpc/ffi_powerpc.h src/riscv/ffitarget.h \ + src/s390/ffitarget.h src/s390/internal.h src/sh/ffitarget.h \ + src/sh64/ffitarget.h src/sparc/ffitarget.h \ + src/sparc/internal.h src/tile/ffitarget.h src/vax/ffitarget.h \ + src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h \ + src/x86/asmnames.h src/xtensa/ffitarget.h src/dlmalloc.c \ + src/kvx/ffitarget.h + +EXTRA_libffi_la_SOURCES = src/aarch64/ffi.c src/aarch64/sysv.S \ + src/aarch64/win64_armasm.S src/alpha/ffi.c src/alpha/osf.S \ + src/arc/ffi.c src/arc/arcompact.S src/arm/ffi.c \ + src/arm/sysv.S src/arm/ffi.c src/arm/sysv_msvc_arm32.S \ + src/avr32/ffi.c src/avr32/sysv.S src/bfin/ffi.c \ + src/bfin/sysv.S src/cris/ffi.c src/cris/sysv.S src/frv/ffi.c \ + src/csky/ffi.c src/csky/sysv.S src/frv/eabi.S src/ia64/ffi.c \ + src/ia64/unix.S src/m32r/ffi.c src/m32r/sysv.S src/m68k/ffi.c \ + src/m68k/sysv.S src/m88k/ffi.c src/m88k/obsd.S \ + src/metag/ffi.c src/metag/sysv.S src/microblaze/ffi.c \ + src/microblaze/sysv.S src/mips/ffi.c src/mips/o32.S \ + src/mips/n32.S src/moxie/ffi.c src/moxie/eabi.S \ + src/nios2/ffi.c src/nios2/sysv.S src/or1k/ffi.c \ + src/or1k/sysv.S src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \ + src/powerpc/ffi.c src/powerpc/ffi_sysv.c \ + src/powerpc/ffi_linux64.c src/powerpc/sysv.S \ + src/powerpc/linux64.S src/powerpc/linux64_closure.S \ + src/powerpc/ppc_closure.S src/powerpc/aix.S \ + src/powerpc/darwin.S src/powerpc/aix_closure.S \ + src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \ + src/riscv/ffi.c src/riscv/sysv.S src/s390/ffi.c \ + src/s390/sysv.S src/sh/ffi.c src/sh/sysv.S src/sh64/ffi.c \ + src/sh64/sysv.S src/sparc/ffi.c src/sparc/ffi64.c \ + src/sparc/v8.S src/sparc/v9.S src/tile/ffi.c src/tile/tile.S \ + src/vax/ffi.c src/vax/elfbsd.S src/x86/ffi.c src/x86/sysv.S \ + src/x86/ffiw64.c src/x86/win64.S src/x86/ffi64.c \ + src/x86/unix64.S src/x86/sysv_intel.S src/x86/win64_intel.S \ + src/xtensa/ffi.c src/xtensa/sysv.S src/kvx/ffi.c \ + src/kvx/sysv.S + +libffi_la_LIBADD = $(TARGET_OBJ) +libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) +EXTRA_libffi_convenience_la_SOURCES = $(EXTRA_libffi_la_SOURCES) +libffi_convenience_la_LIBADD = $(libffi_la_LIBADD) +libffi_convenience_la_DEPENDENCIES = $(libffi_la_DEPENDENCIES) +nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) +LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) +AM_CFLAGS = $(am__append_3) +#libffi_version_script = +libffi_version_script = -Wl,--version-script,libffi.map +#libffi_version_script = -Wl,-M,libffi.map-sun +#libffi_version_dep = +libffi_version_dep = libffi.map +#libffi_version_dep = libffi.map-sun +libffi_version_info = -version-info `grep -v '^\#' $(srcdir)/libtool-version` +libffi_la_LDFLAGS = -no-undefined $(libffi_version_info) $(libffi_version_script) $(LTLDFLAGS) $(AM_LTLDFLAGS) +libffi_la_DEPENDENCIES = $(libffi_la_LIBADD) $(libffi_version_dep) +AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src +AM_CCASFLAGS = $(AM_CPPFLAGS) +all: fficonfig.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .S .c .lo .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: # $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +fficonfig.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h +$(srcdir)/fficonfig.h.in: # $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f fficonfig.h stamp-h1 +libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \ + } + +uninstall-toolexeclibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$f"; \ + done + +clean-toolexeclibLTLIBRARIES: + -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) + @list='$(toolexeclib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/aarch64/$(am__dirstamp): + @$(MKDIR_P) src/aarch64 + @: > src/aarch64/$(am__dirstamp) +src/aarch64/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/aarch64/$(DEPDIR) + @: > src/aarch64/$(DEPDIR)/$(am__dirstamp) +src/aarch64/ffi.lo: src/aarch64/$(am__dirstamp) \ + src/aarch64/$(DEPDIR)/$(am__dirstamp) +src/aarch64/sysv.lo: src/aarch64/$(am__dirstamp) \ + src/aarch64/$(DEPDIR)/$(am__dirstamp) +src/aarch64/win64_armasm.lo: src/aarch64/$(am__dirstamp) \ + src/aarch64/$(DEPDIR)/$(am__dirstamp) +src/alpha/$(am__dirstamp): + @$(MKDIR_P) src/alpha + @: > src/alpha/$(am__dirstamp) +src/alpha/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/alpha/$(DEPDIR) + @: > src/alpha/$(DEPDIR)/$(am__dirstamp) +src/alpha/ffi.lo: src/alpha/$(am__dirstamp) \ + src/alpha/$(DEPDIR)/$(am__dirstamp) +src/alpha/osf.lo: src/alpha/$(am__dirstamp) \ + src/alpha/$(DEPDIR)/$(am__dirstamp) +src/arc/$(am__dirstamp): + @$(MKDIR_P) src/arc + @: > src/arc/$(am__dirstamp) +src/arc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/arc/$(DEPDIR) + @: > src/arc/$(DEPDIR)/$(am__dirstamp) +src/arc/ffi.lo: src/arc/$(am__dirstamp) \ + src/arc/$(DEPDIR)/$(am__dirstamp) +src/arc/arcompact.lo: src/arc/$(am__dirstamp) \ + src/arc/$(DEPDIR)/$(am__dirstamp) +src/arm/$(am__dirstamp): + @$(MKDIR_P) src/arm + @: > src/arm/$(am__dirstamp) +src/arm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/arm/$(DEPDIR) + @: > src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/ffi.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/sysv.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/arm/sysv_msvc_arm32.lo: src/arm/$(am__dirstamp) \ + src/arm/$(DEPDIR)/$(am__dirstamp) +src/avr32/$(am__dirstamp): + @$(MKDIR_P) src/avr32 + @: > src/avr32/$(am__dirstamp) +src/avr32/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/avr32/$(DEPDIR) + @: > src/avr32/$(DEPDIR)/$(am__dirstamp) +src/avr32/ffi.lo: src/avr32/$(am__dirstamp) \ + src/avr32/$(DEPDIR)/$(am__dirstamp) +src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \ + src/avr32/$(DEPDIR)/$(am__dirstamp) +src/bfin/$(am__dirstamp): + @$(MKDIR_P) src/bfin + @: > src/bfin/$(am__dirstamp) +src/bfin/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/bfin/$(DEPDIR) + @: > src/bfin/$(DEPDIR)/$(am__dirstamp) +src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \ + src/bfin/$(DEPDIR)/$(am__dirstamp) +src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \ + src/bfin/$(DEPDIR)/$(am__dirstamp) +src/cris/$(am__dirstamp): + @$(MKDIR_P) src/cris + @: > src/cris/$(am__dirstamp) +src/cris/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/cris/$(DEPDIR) + @: > src/cris/$(DEPDIR)/$(am__dirstamp) +src/cris/ffi.lo: src/cris/$(am__dirstamp) \ + src/cris/$(DEPDIR)/$(am__dirstamp) +src/cris/sysv.lo: src/cris/$(am__dirstamp) \ + src/cris/$(DEPDIR)/$(am__dirstamp) +src/frv/$(am__dirstamp): + @$(MKDIR_P) src/frv + @: > src/frv/$(am__dirstamp) +src/frv/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/frv/$(DEPDIR) + @: > src/frv/$(DEPDIR)/$(am__dirstamp) +src/frv/ffi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) +src/csky/$(am__dirstamp): + @$(MKDIR_P) src/csky + @: > src/csky/$(am__dirstamp) +src/csky/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/csky/$(DEPDIR) + @: > src/csky/$(DEPDIR)/$(am__dirstamp) +src/csky/ffi.lo: src/csky/$(am__dirstamp) \ + src/csky/$(DEPDIR)/$(am__dirstamp) +src/csky/sysv.lo: src/csky/$(am__dirstamp) \ + src/csky/$(DEPDIR)/$(am__dirstamp) +src/frv/eabi.lo: src/frv/$(am__dirstamp) \ + src/frv/$(DEPDIR)/$(am__dirstamp) +src/ia64/$(am__dirstamp): + @$(MKDIR_P) src/ia64 + @: > src/ia64/$(am__dirstamp) +src/ia64/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/ia64/$(DEPDIR) + @: > src/ia64/$(DEPDIR)/$(am__dirstamp) +src/ia64/ffi.lo: src/ia64/$(am__dirstamp) \ + src/ia64/$(DEPDIR)/$(am__dirstamp) +src/ia64/unix.lo: src/ia64/$(am__dirstamp) \ + src/ia64/$(DEPDIR)/$(am__dirstamp) +src/m32r/$(am__dirstamp): + @$(MKDIR_P) src/m32r + @: > src/m32r/$(am__dirstamp) +src/m32r/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m32r/$(DEPDIR) + @: > src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m32r/ffi.lo: src/m32r/$(am__dirstamp) \ + src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m32r/sysv.lo: src/m32r/$(am__dirstamp) \ + src/m32r/$(DEPDIR)/$(am__dirstamp) +src/m68k/$(am__dirstamp): + @$(MKDIR_P) src/m68k + @: > src/m68k/$(am__dirstamp) +src/m68k/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m68k/$(DEPDIR) + @: > src/m68k/$(DEPDIR)/$(am__dirstamp) +src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) +src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \ + src/m68k/$(DEPDIR)/$(am__dirstamp) +src/m88k/$(am__dirstamp): + @$(MKDIR_P) src/m88k + @: > src/m88k/$(am__dirstamp) +src/m88k/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/m88k/$(DEPDIR) + @: > src/m88k/$(DEPDIR)/$(am__dirstamp) +src/m88k/ffi.lo: src/m88k/$(am__dirstamp) \ + src/m88k/$(DEPDIR)/$(am__dirstamp) +src/m88k/obsd.lo: src/m88k/$(am__dirstamp) \ + src/m88k/$(DEPDIR)/$(am__dirstamp) +src/metag/$(am__dirstamp): + @$(MKDIR_P) src/metag + @: > src/metag/$(am__dirstamp) +src/metag/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/metag/$(DEPDIR) + @: > src/metag/$(DEPDIR)/$(am__dirstamp) +src/metag/ffi.lo: src/metag/$(am__dirstamp) \ + src/metag/$(DEPDIR)/$(am__dirstamp) +src/metag/sysv.lo: src/metag/$(am__dirstamp) \ + src/metag/$(DEPDIR)/$(am__dirstamp) +src/microblaze/$(am__dirstamp): + @$(MKDIR_P) src/microblaze + @: > src/microblaze/$(am__dirstamp) +src/microblaze/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/microblaze/$(DEPDIR) + @: > src/microblaze/$(DEPDIR)/$(am__dirstamp) +src/microblaze/ffi.lo: src/microblaze/$(am__dirstamp) \ + src/microblaze/$(DEPDIR)/$(am__dirstamp) +src/microblaze/sysv.lo: src/microblaze/$(am__dirstamp) \ + src/microblaze/$(DEPDIR)/$(am__dirstamp) +src/mips/$(am__dirstamp): + @$(MKDIR_P) src/mips + @: > src/mips/$(am__dirstamp) +src/mips/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/mips/$(DEPDIR) + @: > src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/ffi.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/o32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/mips/n32.lo: src/mips/$(am__dirstamp) \ + src/mips/$(DEPDIR)/$(am__dirstamp) +src/moxie/$(am__dirstamp): + @$(MKDIR_P) src/moxie + @: > src/moxie/$(am__dirstamp) +src/moxie/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/moxie/$(DEPDIR) + @: > src/moxie/$(DEPDIR)/$(am__dirstamp) +src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \ + src/moxie/$(DEPDIR)/$(am__dirstamp) +src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \ + src/moxie/$(DEPDIR)/$(am__dirstamp) +src/nios2/$(am__dirstamp): + @$(MKDIR_P) src/nios2 + @: > src/nios2/$(am__dirstamp) +src/nios2/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/nios2/$(DEPDIR) + @: > src/nios2/$(DEPDIR)/$(am__dirstamp) +src/nios2/ffi.lo: src/nios2/$(am__dirstamp) \ + src/nios2/$(DEPDIR)/$(am__dirstamp) +src/nios2/sysv.lo: src/nios2/$(am__dirstamp) \ + src/nios2/$(DEPDIR)/$(am__dirstamp) +src/or1k/$(am__dirstamp): + @$(MKDIR_P) src/or1k + @: > src/or1k/$(am__dirstamp) +src/or1k/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/or1k/$(DEPDIR) + @: > src/or1k/$(DEPDIR)/$(am__dirstamp) +src/or1k/ffi.lo: src/or1k/$(am__dirstamp) \ + src/or1k/$(DEPDIR)/$(am__dirstamp) +src/or1k/sysv.lo: src/or1k/$(am__dirstamp) \ + src/or1k/$(DEPDIR)/$(am__dirstamp) +src/pa/$(am__dirstamp): + @$(MKDIR_P) src/pa + @: > src/pa/$(am__dirstamp) +src/pa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/pa/$(DEPDIR) + @: > src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/linux.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) +src/pa/hpux32.lo: src/pa/$(am__dirstamp) \ + src/pa/$(DEPDIR)/$(am__dirstamp) +src/powerpc/$(am__dirstamp): + @$(MKDIR_P) src/powerpc + @: > src/powerpc/$(am__dirstamp) +src/powerpc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/powerpc/$(DEPDIR) + @: > src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi_sysv.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi_linux64.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/powerpc/ffi_darwin.lo: src/powerpc/$(am__dirstamp) \ + src/powerpc/$(DEPDIR)/$(am__dirstamp) +src/riscv/$(am__dirstamp): + @$(MKDIR_P) src/riscv + @: > src/riscv/$(am__dirstamp) +src/riscv/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/riscv/$(DEPDIR) + @: > src/riscv/$(DEPDIR)/$(am__dirstamp) +src/riscv/ffi.lo: src/riscv/$(am__dirstamp) \ + src/riscv/$(DEPDIR)/$(am__dirstamp) +src/riscv/sysv.lo: src/riscv/$(am__dirstamp) \ + src/riscv/$(DEPDIR)/$(am__dirstamp) +src/s390/$(am__dirstamp): + @$(MKDIR_P) src/s390 + @: > src/s390/$(am__dirstamp) +src/s390/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/s390/$(DEPDIR) + @: > src/s390/$(DEPDIR)/$(am__dirstamp) +src/s390/ffi.lo: src/s390/$(am__dirstamp) \ + src/s390/$(DEPDIR)/$(am__dirstamp) +src/s390/sysv.lo: src/s390/$(am__dirstamp) \ + src/s390/$(DEPDIR)/$(am__dirstamp) +src/sh/$(am__dirstamp): + @$(MKDIR_P) src/sh + @: > src/sh/$(am__dirstamp) +src/sh/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sh/$(DEPDIR) + @: > src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh/sysv.lo: src/sh/$(am__dirstamp) \ + src/sh/$(DEPDIR)/$(am__dirstamp) +src/sh64/$(am__dirstamp): + @$(MKDIR_P) src/sh64 + @: > src/sh64/$(am__dirstamp) +src/sh64/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sh64/$(DEPDIR) + @: > src/sh64/$(DEPDIR)/$(am__dirstamp) +src/sh64/ffi.lo: src/sh64/$(am__dirstamp) \ + src/sh64/$(DEPDIR)/$(am__dirstamp) +src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \ + src/sh64/$(DEPDIR)/$(am__dirstamp) +src/sparc/$(am__dirstamp): + @$(MKDIR_P) src/sparc + @: > src/sparc/$(am__dirstamp) +src/sparc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sparc/$(DEPDIR) + @: > src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/ffi.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/ffi64.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/v8.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/sparc/v9.lo: src/sparc/$(am__dirstamp) \ + src/sparc/$(DEPDIR)/$(am__dirstamp) +src/tile/$(am__dirstamp): + @$(MKDIR_P) src/tile + @: > src/tile/$(am__dirstamp) +src/tile/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/tile/$(DEPDIR) + @: > src/tile/$(DEPDIR)/$(am__dirstamp) +src/tile/ffi.lo: src/tile/$(am__dirstamp) \ + src/tile/$(DEPDIR)/$(am__dirstamp) +src/tile/tile.lo: src/tile/$(am__dirstamp) \ + src/tile/$(DEPDIR)/$(am__dirstamp) +src/vax/$(am__dirstamp): + @$(MKDIR_P) src/vax + @: > src/vax/$(am__dirstamp) +src/vax/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/vax/$(DEPDIR) + @: > src/vax/$(DEPDIR)/$(am__dirstamp) +src/vax/ffi.lo: src/vax/$(am__dirstamp) \ + src/vax/$(DEPDIR)/$(am__dirstamp) +src/vax/elfbsd.lo: src/vax/$(am__dirstamp) \ + src/vax/$(DEPDIR)/$(am__dirstamp) +src/x86/$(am__dirstamp): + @$(MKDIR_P) src/x86 + @: > src/x86/$(am__dirstamp) +src/x86/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/x86/$(DEPDIR) + @: > src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/ffi.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/sysv.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/ffiw64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/win64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/ffi64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/unix64.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/sysv_intel.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/x86/win64_intel.lo: src/x86/$(am__dirstamp) \ + src/x86/$(DEPDIR)/$(am__dirstamp) +src/xtensa/$(am__dirstamp): + @$(MKDIR_P) src/xtensa + @: > src/xtensa/$(am__dirstamp) +src/xtensa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/xtensa/$(DEPDIR) + @: > src/xtensa/$(DEPDIR)/$(am__dirstamp) +src/xtensa/ffi.lo: src/xtensa/$(am__dirstamp) \ + src/xtensa/$(DEPDIR)/$(am__dirstamp) +src/xtensa/sysv.lo: src/xtensa/$(am__dirstamp) \ + src/xtensa/$(DEPDIR)/$(am__dirstamp) +src/kvx/$(am__dirstamp): + @$(MKDIR_P) src/kvx + @: > src/kvx/$(am__dirstamp) +src/kvx/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/kvx/$(DEPDIR) + @: > src/kvx/$(DEPDIR)/$(am__dirstamp) +src/kvx/ffi.lo: src/kvx/$(am__dirstamp) \ + src/kvx/$(DEPDIR)/$(am__dirstamp) +src/kvx/sysv.lo: src/kvx/$(am__dirstamp) \ + src/kvx/$(DEPDIR)/$(am__dirstamp) + +libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) $(EXTRA_libffi_la_DEPENDENCIES) + $(AM_V_CCLD)$(libffi_la_LINK) -rpath $(toolexeclibdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) + +libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) $(EXTRA_libffi_convenience_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f src/*.$(OBJEXT) + -rm -f src/*.lo + -rm -f src/aarch64/*.$(OBJEXT) + -rm -f src/aarch64/*.lo + -rm -f src/alpha/*.$(OBJEXT) + -rm -f src/alpha/*.lo + -rm -f src/arc/*.$(OBJEXT) + -rm -f src/arc/*.lo + -rm -f src/arm/*.$(OBJEXT) + -rm -f src/arm/*.lo + -rm -f src/avr32/*.$(OBJEXT) + -rm -f src/avr32/*.lo + -rm -f src/bfin/*.$(OBJEXT) + -rm -f src/bfin/*.lo + -rm -f src/cris/*.$(OBJEXT) + -rm -f src/cris/*.lo + -rm -f src/csky/*.$(OBJEXT) + -rm -f src/csky/*.lo + -rm -f src/frv/*.$(OBJEXT) + -rm -f src/frv/*.lo + -rm -f src/ia64/*.$(OBJEXT) + -rm -f src/ia64/*.lo + -rm -f src/kvx/*.$(OBJEXT) + -rm -f src/kvx/*.lo + -rm -f src/m32r/*.$(OBJEXT) + -rm -f src/m32r/*.lo + -rm -f src/m68k/*.$(OBJEXT) + -rm -f src/m68k/*.lo + -rm -f src/m88k/*.$(OBJEXT) + -rm -f src/m88k/*.lo + -rm -f src/metag/*.$(OBJEXT) + -rm -f src/metag/*.lo + -rm -f src/microblaze/*.$(OBJEXT) + -rm -f src/microblaze/*.lo + -rm -f src/mips/*.$(OBJEXT) + -rm -f src/mips/*.lo + -rm -f src/moxie/*.$(OBJEXT) + -rm -f src/moxie/*.lo + -rm -f src/nios2/*.$(OBJEXT) + -rm -f src/nios2/*.lo + -rm -f src/or1k/*.$(OBJEXT) + -rm -f src/or1k/*.lo + -rm -f src/pa/*.$(OBJEXT) + -rm -f src/pa/*.lo + -rm -f src/powerpc/*.$(OBJEXT) + -rm -f src/powerpc/*.lo + -rm -f src/riscv/*.$(OBJEXT) + -rm -f src/riscv/*.lo + -rm -f src/s390/*.$(OBJEXT) + -rm -f src/s390/*.lo + -rm -f src/sh/*.$(OBJEXT) + -rm -f src/sh/*.lo + -rm -f src/sh64/*.$(OBJEXT) + -rm -f src/sh64/*.lo + -rm -f src/sparc/*.$(OBJEXT) + -rm -f src/sparc/*.lo + -rm -f src/tile/*.$(OBJEXT) + -rm -f src/tile/*.lo + -rm -f src/vax/*.$(OBJEXT) + -rm -f src/vax/*.lo + -rm -f src/x86/*.$(OBJEXT) + -rm -f src/x86/*.lo + -rm -f src/xtensa/*.$(OBJEXT) + -rm -f src/xtensa/*.lo + +distclean-compile: + -rm -f *.tab.c + +#include src/$(DEPDIR)/closures.Plo # am--include-marker +#include src/$(DEPDIR)/debug.Plo # am--include-marker +#include src/$(DEPDIR)/java_raw_api.Plo # am--include-marker +#include src/$(DEPDIR)/prep_cif.Plo # am--include-marker +#include src/$(DEPDIR)/raw_api.Plo # am--include-marker +#include src/$(DEPDIR)/types.Plo # am--include-marker +#include src/aarch64/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/aarch64/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/aarch64/$(DEPDIR)/win64_armasm.Plo # am--include-marker +#include src/alpha/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/alpha/$(DEPDIR)/osf.Plo # am--include-marker +#include src/arc/$(DEPDIR)/arcompact.Plo # am--include-marker +#include src/arc/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/arm/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/arm/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/arm/$(DEPDIR)/sysv_msvc_arm32.Plo # am--include-marker +#include src/avr32/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/avr32/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/bfin/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/bfin/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/cris/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/cris/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/csky/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/csky/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/frv/$(DEPDIR)/eabi.Plo # am--include-marker +#include src/frv/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/ia64/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/ia64/$(DEPDIR)/unix.Plo # am--include-marker +#include src/kvx/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/kvx/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/m32r/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/m32r/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/m68k/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/m68k/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/m88k/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/m88k/$(DEPDIR)/obsd.Plo # am--include-marker +#include src/metag/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/metag/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/microblaze/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/microblaze/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/mips/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/mips/$(DEPDIR)/n32.Plo # am--include-marker +#include src/mips/$(DEPDIR)/o32.Plo # am--include-marker +#include src/moxie/$(DEPDIR)/eabi.Plo # am--include-marker +#include src/moxie/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/nios2/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/nios2/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/or1k/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/or1k/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/pa/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/pa/$(DEPDIR)/hpux32.Plo # am--include-marker +#include src/pa/$(DEPDIR)/linux.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/aix.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/aix_closure.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/darwin.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/darwin_closure.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/ffi_darwin.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/ffi_linux64.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/ffi_sysv.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/linux64.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/linux64_closure.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/ppc_closure.Plo # am--include-marker +#include src/powerpc/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/riscv/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/riscv/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/s390/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/s390/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/sh/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/sh/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/sh64/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/sh64/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/sparc/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/sparc/$(DEPDIR)/ffi64.Plo # am--include-marker +#include src/sparc/$(DEPDIR)/v8.Plo # am--include-marker +#include src/sparc/$(DEPDIR)/v9.Plo # am--include-marker +#include src/tile/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/tile/$(DEPDIR)/tile.Plo # am--include-marker +#include src/vax/$(DEPDIR)/elfbsd.Plo # am--include-marker +#include src/vax/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/x86/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/x86/$(DEPDIR)/ffi64.Plo # am--include-marker +#include src/x86/$(DEPDIR)/ffiw64.Plo # am--include-marker +#include src/x86/$(DEPDIR)/sysv.Plo # am--include-marker +#include src/x86/$(DEPDIR)/sysv_intel.Plo # am--include-marker +#include src/x86/$(DEPDIR)/unix64.Plo # am--include-marker +#include src/x86/$(DEPDIR)/win64.Plo # am--include-marker +#include src/x86/$(DEPDIR)/win64_intel.Plo # am--include-marker +#include src/xtensa/$(DEPDIR)/ffi.Plo # am--include-marker +#include src/xtensa/$(DEPDIR)/sysv.Plo # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.S.o: +# $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# $(AM_V_CPPAS)source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) + $(AM_V_CPPAS)$(CPPASCOMPILE) -c -o $@ $< + +.S.obj: +# $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# $(AM_V_CPPAS)source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) + $(AM_V_CPPAS)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.S.lo: +# $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +# $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Plo +# $(AM_V_CPPAS)source='$<' object='$@' libtool=yes +# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) + $(AM_V_CPPAS)$(LTCPPASCOMPILE) -c -o $@ $< + +.c.o: +# $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) + $(AM_V_CC)$(COMPILE) -c -o $@ $< + +.c.obj: +# $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Po +# $(AM_V_CC)source='$<' object='$@' libtool=no +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) + $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +# $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +# $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +# $(am__mv) $$depbase.Tpo $$depbase.Plo +# $(AM_V_CC)source='$<' object='$@' libtool=yes +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) + $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf src/.libs src/_libs + -rm -rf src/aarch64/.libs src/aarch64/_libs + -rm -rf src/alpha/.libs src/alpha/_libs + -rm -rf src/arc/.libs src/arc/_libs + -rm -rf src/arm/.libs src/arm/_libs + -rm -rf src/avr32/.libs src/avr32/_libs + -rm -rf src/bfin/.libs src/bfin/_libs + -rm -rf src/cris/.libs src/cris/_libs + -rm -rf src/csky/.libs src/csky/_libs + -rm -rf src/frv/.libs src/frv/_libs + -rm -rf src/ia64/.libs src/ia64/_libs + -rm -rf src/kvx/.libs src/kvx/_libs + -rm -rf src/m32r/.libs src/m32r/_libs + -rm -rf src/m68k/.libs src/m68k/_libs + -rm -rf src/m88k/.libs src/m88k/_libs + -rm -rf src/metag/.libs src/metag/_libs + -rm -rf src/microblaze/.libs src/microblaze/_libs + -rm -rf src/mips/.libs src/mips/_libs + -rm -rf src/moxie/.libs src/moxie/_libs + -rm -rf src/nios2/.libs src/nios2/_libs + -rm -rf src/or1k/.libs src/or1k/_libs + -rm -rf src/pa/.libs src/pa/_libs + -rm -rf src/powerpc/.libs src/powerpc/_libs + -rm -rf src/riscv/.libs src/riscv/_libs + -rm -rf src/s390/.libs src/s390/_libs + -rm -rf src/sh/.libs src/sh/_libs + -rm -rf src/sh64/.libs src/sh64/_libs + -rm -rf src/sparc/.libs src/sparc/_libs + -rm -rf src/tile/.libs src/tile/_libs + -rm -rf src/vax/.libs src/vax/_libs + -rm -rf src/x86/.libs src/x86/_libs + -rm -rf src/xtensa/.libs src/xtensa/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) fficonfig.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) + -rm -f src/aarch64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/aarch64/$(am__dirstamp) + -rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) + -rm -f src/alpha/$(am__dirstamp) + -rm -f src/arc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/arc/$(am__dirstamp) + -rm -f src/arm/$(DEPDIR)/$(am__dirstamp) + -rm -f src/arm/$(am__dirstamp) + -rm -f src/avr32/$(DEPDIR)/$(am__dirstamp) + -rm -f src/avr32/$(am__dirstamp) + -rm -f src/bfin/$(DEPDIR)/$(am__dirstamp) + -rm -f src/bfin/$(am__dirstamp) + -rm -f src/cris/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cris/$(am__dirstamp) + -rm -f src/csky/$(DEPDIR)/$(am__dirstamp) + -rm -f src/csky/$(am__dirstamp) + -rm -f src/frv/$(DEPDIR)/$(am__dirstamp) + -rm -f src/frv/$(am__dirstamp) + -rm -f src/ia64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/ia64/$(am__dirstamp) + -rm -f src/kvx/$(DEPDIR)/$(am__dirstamp) + -rm -f src/kvx/$(am__dirstamp) + -rm -f src/m32r/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m32r/$(am__dirstamp) + -rm -f src/m68k/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m68k/$(am__dirstamp) + -rm -f src/m88k/$(DEPDIR)/$(am__dirstamp) + -rm -f src/m88k/$(am__dirstamp) + -rm -f src/metag/$(DEPDIR)/$(am__dirstamp) + -rm -f src/metag/$(am__dirstamp) + -rm -f src/microblaze/$(DEPDIR)/$(am__dirstamp) + -rm -f src/microblaze/$(am__dirstamp) + -rm -f src/mips/$(DEPDIR)/$(am__dirstamp) + -rm -f src/mips/$(am__dirstamp) + -rm -f src/moxie/$(DEPDIR)/$(am__dirstamp) + -rm -f src/moxie/$(am__dirstamp) + -rm -f src/nios2/$(DEPDIR)/$(am__dirstamp) + -rm -f src/nios2/$(am__dirstamp) + -rm -f src/or1k/$(DEPDIR)/$(am__dirstamp) + -rm -f src/or1k/$(am__dirstamp) + -rm -f src/pa/$(DEPDIR)/$(am__dirstamp) + -rm -f src/pa/$(am__dirstamp) + -rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/powerpc/$(am__dirstamp) + -rm -f src/riscv/$(DEPDIR)/$(am__dirstamp) + -rm -f src/riscv/$(am__dirstamp) + -rm -f src/s390/$(DEPDIR)/$(am__dirstamp) + -rm -f src/s390/$(am__dirstamp) + -rm -f src/sh/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh/$(am__dirstamp) + -rm -f src/sh64/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sh64/$(am__dirstamp) + -rm -f src/sparc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sparc/$(am__dirstamp) + -rm -f src/tile/$(DEPDIR)/$(am__dirstamp) + -rm -f src/tile/$(am__dirstamp) + -rm -f src/vax/$(DEPDIR)/$(am__dirstamp) + -rm -f src/vax/$(am__dirstamp) + -rm -f src/x86/$(DEPDIR)/$(am__dirstamp) + -rm -f src/x86/$(am__dirstamp) + -rm -f src/xtensa/$(DEPDIR)/$(am__dirstamp) + -rm -f src/xtensa/$(am__dirstamp) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + clean-toolexeclibLTLIBRARIES mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f src/$(DEPDIR)/closures.Plo + -rm -f src/$(DEPDIR)/debug.Plo + -rm -f src/$(DEPDIR)/java_raw_api.Plo + -rm -f src/$(DEPDIR)/prep_cif.Plo + -rm -f src/$(DEPDIR)/raw_api.Plo + -rm -f src/$(DEPDIR)/types.Plo + -rm -f src/aarch64/$(DEPDIR)/ffi.Plo + -rm -f src/aarch64/$(DEPDIR)/sysv.Plo + -rm -f src/aarch64/$(DEPDIR)/win64_armasm.Plo + -rm -f src/alpha/$(DEPDIR)/ffi.Plo + -rm -f src/alpha/$(DEPDIR)/osf.Plo + -rm -f src/arc/$(DEPDIR)/arcompact.Plo + -rm -f src/arc/$(DEPDIR)/ffi.Plo + -rm -f src/arm/$(DEPDIR)/ffi.Plo + -rm -f src/arm/$(DEPDIR)/sysv.Plo + -rm -f src/arm/$(DEPDIR)/sysv_msvc_arm32.Plo + -rm -f src/avr32/$(DEPDIR)/ffi.Plo + -rm -f src/avr32/$(DEPDIR)/sysv.Plo + -rm -f src/bfin/$(DEPDIR)/ffi.Plo + -rm -f src/bfin/$(DEPDIR)/sysv.Plo + -rm -f src/cris/$(DEPDIR)/ffi.Plo + -rm -f src/cris/$(DEPDIR)/sysv.Plo + -rm -f src/csky/$(DEPDIR)/ffi.Plo + -rm -f src/csky/$(DEPDIR)/sysv.Plo + -rm -f src/frv/$(DEPDIR)/eabi.Plo + -rm -f src/frv/$(DEPDIR)/ffi.Plo + -rm -f src/ia64/$(DEPDIR)/ffi.Plo + -rm -f src/ia64/$(DEPDIR)/unix.Plo + -rm -f src/kvx/$(DEPDIR)/ffi.Plo + -rm -f src/kvx/$(DEPDIR)/sysv.Plo + -rm -f src/m32r/$(DEPDIR)/ffi.Plo + -rm -f src/m32r/$(DEPDIR)/sysv.Plo + -rm -f src/m68k/$(DEPDIR)/ffi.Plo + -rm -f src/m68k/$(DEPDIR)/sysv.Plo + -rm -f src/m88k/$(DEPDIR)/ffi.Plo + -rm -f src/m88k/$(DEPDIR)/obsd.Plo + -rm -f src/metag/$(DEPDIR)/ffi.Plo + -rm -f src/metag/$(DEPDIR)/sysv.Plo + -rm -f src/microblaze/$(DEPDIR)/ffi.Plo + -rm -f src/microblaze/$(DEPDIR)/sysv.Plo + -rm -f src/mips/$(DEPDIR)/ffi.Plo + -rm -f src/mips/$(DEPDIR)/n32.Plo + -rm -f src/mips/$(DEPDIR)/o32.Plo + -rm -f src/moxie/$(DEPDIR)/eabi.Plo + -rm -f src/moxie/$(DEPDIR)/ffi.Plo + -rm -f src/nios2/$(DEPDIR)/ffi.Plo + -rm -f src/nios2/$(DEPDIR)/sysv.Plo + -rm -f src/or1k/$(DEPDIR)/ffi.Plo + -rm -f src/or1k/$(DEPDIR)/sysv.Plo + -rm -f src/pa/$(DEPDIR)/ffi.Plo + -rm -f src/pa/$(DEPDIR)/hpux32.Plo + -rm -f src/pa/$(DEPDIR)/linux.Plo + -rm -f src/powerpc/$(DEPDIR)/aix.Plo + -rm -f src/powerpc/$(DEPDIR)/aix_closure.Plo + -rm -f src/powerpc/$(DEPDIR)/darwin.Plo + -rm -f src/powerpc/$(DEPDIR)/darwin_closure.Plo + -rm -f src/powerpc/$(DEPDIR)/ffi.Plo + -rm -f src/powerpc/$(DEPDIR)/ffi_darwin.Plo + -rm -f src/powerpc/$(DEPDIR)/ffi_linux64.Plo + -rm -f src/powerpc/$(DEPDIR)/ffi_sysv.Plo + -rm -f src/powerpc/$(DEPDIR)/linux64.Plo + -rm -f src/powerpc/$(DEPDIR)/linux64_closure.Plo + -rm -f src/powerpc/$(DEPDIR)/ppc_closure.Plo + -rm -f src/powerpc/$(DEPDIR)/sysv.Plo + -rm -f src/riscv/$(DEPDIR)/ffi.Plo + -rm -f src/riscv/$(DEPDIR)/sysv.Plo + -rm -f src/s390/$(DEPDIR)/ffi.Plo + -rm -f src/s390/$(DEPDIR)/sysv.Plo + -rm -f src/sh/$(DEPDIR)/ffi.Plo + -rm -f src/sh/$(DEPDIR)/sysv.Plo + -rm -f src/sh64/$(DEPDIR)/ffi.Plo + -rm -f src/sh64/$(DEPDIR)/sysv.Plo + -rm -f src/sparc/$(DEPDIR)/ffi.Plo + -rm -f src/sparc/$(DEPDIR)/ffi64.Plo + -rm -f src/sparc/$(DEPDIR)/v8.Plo + -rm -f src/sparc/$(DEPDIR)/v9.Plo + -rm -f src/tile/$(DEPDIR)/ffi.Plo + -rm -f src/tile/$(DEPDIR)/tile.Plo + -rm -f src/vax/$(DEPDIR)/elfbsd.Plo + -rm -f src/vax/$(DEPDIR)/ffi.Plo + -rm -f src/x86/$(DEPDIR)/ffi.Plo + -rm -f src/x86/$(DEPDIR)/ffi64.Plo + -rm -f src/x86/$(DEPDIR)/ffiw64.Plo + -rm -f src/x86/$(DEPDIR)/sysv.Plo + -rm -f src/x86/$(DEPDIR)/sysv_intel.Plo + -rm -f src/x86/$(DEPDIR)/unix64.Plo + -rm -f src/x86/$(DEPDIR)/win64.Plo + -rm -f src/x86/$(DEPDIR)/win64_intel.Plo + -rm -f src/xtensa/$(DEPDIR)/ffi.Plo + -rm -f src/xtensa/$(DEPDIR)/sysv.Plo + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-toolexeclibLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f src/$(DEPDIR)/closures.Plo + -rm -f src/$(DEPDIR)/debug.Plo + -rm -f src/$(DEPDIR)/java_raw_api.Plo + -rm -f src/$(DEPDIR)/prep_cif.Plo + -rm -f src/$(DEPDIR)/raw_api.Plo + -rm -f src/$(DEPDIR)/types.Plo + -rm -f src/aarch64/$(DEPDIR)/ffi.Plo + -rm -f src/aarch64/$(DEPDIR)/sysv.Plo + -rm -f src/aarch64/$(DEPDIR)/win64_armasm.Plo + -rm -f src/alpha/$(DEPDIR)/ffi.Plo + -rm -f src/alpha/$(DEPDIR)/osf.Plo + -rm -f src/arc/$(DEPDIR)/arcompact.Plo + -rm -f src/arc/$(DEPDIR)/ffi.Plo + -rm -f src/arm/$(DEPDIR)/ffi.Plo + -rm -f src/arm/$(DEPDIR)/sysv.Plo + -rm -f src/arm/$(DEPDIR)/sysv_msvc_arm32.Plo + -rm -f src/avr32/$(DEPDIR)/ffi.Plo + -rm -f src/avr32/$(DEPDIR)/sysv.Plo + -rm -f src/bfin/$(DEPDIR)/ffi.Plo + -rm -f src/bfin/$(DEPDIR)/sysv.Plo + -rm -f src/cris/$(DEPDIR)/ffi.Plo + -rm -f src/cris/$(DEPDIR)/sysv.Plo + -rm -f src/csky/$(DEPDIR)/ffi.Plo + -rm -f src/csky/$(DEPDIR)/sysv.Plo + -rm -f src/frv/$(DEPDIR)/eabi.Plo + -rm -f src/frv/$(DEPDIR)/ffi.Plo + -rm -f src/ia64/$(DEPDIR)/ffi.Plo + -rm -f src/ia64/$(DEPDIR)/unix.Plo + -rm -f src/kvx/$(DEPDIR)/ffi.Plo + -rm -f src/kvx/$(DEPDIR)/sysv.Plo + -rm -f src/m32r/$(DEPDIR)/ffi.Plo + -rm -f src/m32r/$(DEPDIR)/sysv.Plo + -rm -f src/m68k/$(DEPDIR)/ffi.Plo + -rm -f src/m68k/$(DEPDIR)/sysv.Plo + -rm -f src/m88k/$(DEPDIR)/ffi.Plo + -rm -f src/m88k/$(DEPDIR)/obsd.Plo + -rm -f src/metag/$(DEPDIR)/ffi.Plo + -rm -f src/metag/$(DEPDIR)/sysv.Plo + -rm -f src/microblaze/$(DEPDIR)/ffi.Plo + -rm -f src/microblaze/$(DEPDIR)/sysv.Plo + -rm -f src/mips/$(DEPDIR)/ffi.Plo + -rm -f src/mips/$(DEPDIR)/n32.Plo + -rm -f src/mips/$(DEPDIR)/o32.Plo + -rm -f src/moxie/$(DEPDIR)/eabi.Plo + -rm -f src/moxie/$(DEPDIR)/ffi.Plo + -rm -f src/nios2/$(DEPDIR)/ffi.Plo + -rm -f src/nios2/$(DEPDIR)/sysv.Plo + -rm -f src/or1k/$(DEPDIR)/ffi.Plo + -rm -f src/or1k/$(DEPDIR)/sysv.Plo + -rm -f src/pa/$(DEPDIR)/ffi.Plo + -rm -f src/pa/$(DEPDIR)/hpux32.Plo + -rm -f src/pa/$(DEPDIR)/linux.Plo + -rm -f src/powerpc/$(DEPDIR)/aix.Plo + -rm -f src/powerpc/$(DEPDIR)/aix_closure.Plo + -rm -f src/powerpc/$(DEPDIR)/darwin.Plo + -rm -f src/powerpc/$(DEPDIR)/darwin_closure.Plo + -rm -f src/powerpc/$(DEPDIR)/ffi.Plo + -rm -f src/powerpc/$(DEPDIR)/ffi_darwin.Plo + -rm -f src/powerpc/$(DEPDIR)/ffi_linux64.Plo + -rm -f src/powerpc/$(DEPDIR)/ffi_sysv.Plo + -rm -f src/powerpc/$(DEPDIR)/linux64.Plo + -rm -f src/powerpc/$(DEPDIR)/linux64_closure.Plo + -rm -f src/powerpc/$(DEPDIR)/ppc_closure.Plo + -rm -f src/powerpc/$(DEPDIR)/sysv.Plo + -rm -f src/riscv/$(DEPDIR)/ffi.Plo + -rm -f src/riscv/$(DEPDIR)/sysv.Plo + -rm -f src/s390/$(DEPDIR)/ffi.Plo + -rm -f src/s390/$(DEPDIR)/sysv.Plo + -rm -f src/sh/$(DEPDIR)/ffi.Plo + -rm -f src/sh/$(DEPDIR)/sysv.Plo + -rm -f src/sh64/$(DEPDIR)/ffi.Plo + -rm -f src/sh64/$(DEPDIR)/sysv.Plo + -rm -f src/sparc/$(DEPDIR)/ffi.Plo + -rm -f src/sparc/$(DEPDIR)/ffi64.Plo + -rm -f src/sparc/$(DEPDIR)/v8.Plo + -rm -f src/sparc/$(DEPDIR)/v9.Plo + -rm -f src/tile/$(DEPDIR)/ffi.Plo + -rm -f src/tile/$(DEPDIR)/tile.Plo + -rm -f src/vax/$(DEPDIR)/elfbsd.Plo + -rm -f src/vax/$(DEPDIR)/ffi.Plo + -rm -f src/x86/$(DEPDIR)/ffi.Plo + -rm -f src/x86/$(DEPDIR)/ffi64.Plo + -rm -f src/x86/$(DEPDIR)/ffiw64.Plo + -rm -f src/x86/$(DEPDIR)/sysv.Plo + -rm -f src/x86/$(DEPDIR)/sysv_intel.Plo + -rm -f src/x86/$(DEPDIR)/unix64.Plo + -rm -f src/x86/$(DEPDIR)/win64.Plo + -rm -f src/x86/$(DEPDIR)/win64_intel.Plo + -rm -f src/xtensa/$(DEPDIR)/ffi.Plo + -rm -f src/xtensa/$(DEPDIR)/sysv.Plo + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-pkgconfigDATA uninstall-toolexeclibLTLIBRARIES + +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--depfiles am--refresh check check-am clean clean-cscope \ + clean-generic clean-libtool clean-noinstLTLIBRARIES \ + clean-toolexeclibLTLIBRARIES cscope cscopelist-am ctags \ + ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \ + dist-lzip dist-shar dist-tarZ dist-xz dist-zip distcheck \ + distclean distclean-compile distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pkgconfigDATA install-ps \ + install-ps-am install-strip install-toolexeclibLTLIBRARIES \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-pkgconfigDATA uninstall-toolexeclibLTLIBRARIES + +.PRECIOUS: Makefile + +#libffi.map-sun : libffi.map $(top_srcdir)/make_sunver.pl \ +# $(libffi_la_OBJECTS) $(libffi_la_LIBADD) +# perl $(top_srcdir)/make_sunver.pl libffi.map \ +# `echo $(libffi_la_OBJECTS) $(libffi_la_LIBADD) | \ +# sed 's,\([^/ ]*\)\.l\([ao]\),.libs/\1.\2,g'` \ +# > $@ || (rm -f $@ ; exit 1) + +libffi.map: $(top_srcdir)/libffi.map.in + $(COMPILE) -D$(TARGET) -DGENERATE_LIBFFI_MAP \ + -E -x assembler-with-cpp -o $@ $(top_srcdir)/libffi.map.in + +dist-hook: + d=`(cd $(distdir); pwd)`; (cd doc; make pdf; cp *.pdf $$d/doc) + if [ -d $(top_srcdir)/.git ] ; then (cd $(top_srcdir); git log --no-decorate) ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog + s=`awk '/was released on/{ print NR; exit}' $(top_srcdir)/README.md`; tail -n +$$(($$s-1)) $(top_srcdir)/README.md > $(distdir)/README.md + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/a.out b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/a.out new file mode 100644 index 000000000000..f506701a5350 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/a.out differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/config.log b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/config.log new file mode 100644 index 000000000000..8430bb949ac7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/config.log @@ -0,0 +1,1765 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libffi configure 3.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure --disable-static --with-pic=yes --disable-dependency-tracking --disable-docs --host= + +## --------- ## +## Platform. ## +## --------- ## + +hostname = 034409368e4d +uname -m = x86_64 +uname -r = 5.11.0-37-generic +uname -s = Linux +uname -v = #41~20.04.2-Ubuntu SMP Fri Sep 24 09:06:38 UTC 2021 + +/usr/bin/uname -p = x86_64 +/bin/uname -X = unknown + +/bin/arch = x86_64 +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /home/app/.rbenv/versions/2.5.1/bin +PATH: /home/app/.rbenv/libexec +PATH: /home/app/.rbenv/plugins/ruby-build/bin +PATH: /home/app/.rbenv/shims +PATH: /home/app/.rbenv/bin +PATH: /home/app/.rbenv/plugins/ruby-build/bin +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2700: checking build system type +configure:2714: result: x86_64-pc-linux-gnu +configure:2734: checking host system type +configure:2747: result: x86_64-pc-linux-gnu +configure:2767: checking target system type +configure:2780: result: x86_64-pc-linux-gnu +configure:2877: checking for gsed +configure:2908: result: sed +configure:2936: checking for a BSD-compatible install +configure:3004: result: /usr/bin/install -c +configure:3015: checking whether build environment is sane +configure:3070: result: yes +configure:3216: checking for a thread-safe mkdir -p +configure:3255: result: /usr/bin/mkdir -p +configure:3262: checking for gawk +configure:3292: result: no +configure:3262: checking for mawk +configure:3278: found /usr/bin/mawk +configure:3289: result: mawk +configure:3300: checking whether make sets $(MAKE) +configure:3322: result: yes +configure:3351: checking whether make supports nested variables +configure:3368: result: yes +configure:3553: checking for gcc +configure:3569: found /usr/bin/gcc +configure:3580: result: gcc +configure:3809: checking for C compiler version +configure:3818: gcc --version >&5 +gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 +Copyright (C) 2019 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +configure:3829: $? = 0 +configure:3818: gcc -v >&5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper +OFFLOAD_TARGET_NAMES=nvptx-none:hsa +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) +configure:3829: $? = 0 +configure:3818: gcc -V >&5 +gcc: error: unrecognized command line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:3829: $? = 1 +configure:3818: gcc -qversion >&5 +gcc: error: unrecognized command line option '-qversion'; did you mean '--version'? +gcc: fatal error: no input files +compilation terminated. +configure:3829: $? = 1 +configure:3849: checking whether the C compiler works +configure:3871: gcc conftest.c >&5 +configure:3875: $? = 0 +configure:3923: result: yes +configure:3926: checking for C compiler default output file name +configure:3928: result: a.out +configure:3934: checking for suffix of executables +configure:3941: gcc -o conftest conftest.c >&5 +configure:3945: $? = 0 +configure:3967: result: +configure:3989: checking whether we are cross compiling +configure:3997: gcc -o conftest conftest.c >&5 +configure:4001: $? = 0 +configure:4008: ./conftest +configure:4012: $? = 0 +configure:4000: result: no +configure:4005: checking for suffix of object files +configure:4027: gcc -c conftest.c >&5 +configure:4031: $? = 0 +configure:4052: result: o +configure:4056: checking whether we are using the GNU C compiler +configure:4075: gcc -c conftest.c >&5 +configure:4075: $? = 0 +configure:4084: result: yes +configure:4093: checking whether gcc accepts -g +configure:4113: gcc -c -g conftest.c >&5 +configure:4113: $? = 0 +configure:4154: result: yes +configure:4171: checking for gcc option to accept ISO C89 +configure:4234: gcc -c conftest.c >&5 +configure:4234: $? = 0 +configure:4247: result: none needed +configure:4272: checking whether gcc understands -c and -o together +configure:4294: gcc -c conftest.c -o conftest2.o +configure:4297: $? = 0 +configure:4294: gcc -c conftest.c -o conftest2.o +configure:4297: $? = 0 +configure:4309: result: yes +configure:4329: checking whether make supports the include directive +configure:4344: make -f confmf.GNU && cat confinc.out +make[2]: Entering directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +make[2]: Leaving directory '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +this is the am__doit target +configure:4347: $? = 0 +configure:4366: result: yes (GNU style) +configure:4391: checking dependency style of gcc +configure:4502: result: none +configure:4575: checking for g++ +configure:4591: found /usr/bin/g++ +configure:4602: result: g++ +configure:4629: checking for C++ compiler version +configure:4638: g++ --version >&5 +g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 +Copyright (C) 2019 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +configure:4649: $? = 0 +configure:4638: g++ -v >&5 +Using built-in specs. +COLLECT_GCC=g++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper +OFFLOAD_TARGET_NAMES=nvptx-none:hsa +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) +configure:4649: $? = 0 +configure:4638: g++ -V >&5 +g++: error: unrecognized command line option '-V' +g++: fatal error: no input files +compilation terminated. +configure:4649: $? = 1 +configure:4638: g++ -qversion >&5 +g++: error: unrecognized command line option '-qversion'; did you mean '--version'? +g++: fatal error: no input files +compilation terminated. +configure:4649: $? = 1 +configure:4653: checking whether we are using the GNU C++ compiler +configure:4672: g++ -c conftest.cpp >&5 +configure:4672: $? = 0 +configure:4681: result: yes +configure:4690: checking whether g++ accepts -g +configure:4710: g++ -c -g conftest.cpp >&5 +configure:4710: $? = 0 +configure:4751: result: yes +configure:4776: checking dependency style of g++ +configure:4887: result: none +configure:4917: checking dependency style of gcc +configure:5026: result: none +configure:5088: checking how to print strings +configure:5115: result: printf +configure:5136: checking for a sed that does not truncate output +configure:5200: result: /usr/bin/sed +configure:5218: checking for grep that handles long lines and -e +configure:5276: result: /usr/bin/grep +configure:5281: checking for egrep +configure:5343: result: /usr/bin/grep -E +configure:5348: checking for fgrep +configure:5410: result: /usr/bin/grep -F +configure:5445: checking for ld used by gcc +configure:5512: result: /usr/bin/ld +configure:5519: checking if the linker (/usr/bin/ld) is GNU ld +configure:5534: result: yes +configure:5546: checking for BSD- or MS-compatible name lister (nm) +configure:5600: result: /usr/bin/nm -B +configure:5730: checking the name lister (/usr/bin/nm -B) interface +configure:5737: gcc -c conftest.c >&5 +configure:5740: /usr/bin/nm -B "conftest.o" +configure:5743: output +0000000000000000 B some_variable +configure:5744: result: BSD nm +configure:5747: checking whether ln -s works +configure:5751: result: yes +configure:5759: checking the maximum length of command line arguments +configure:5890: result: 1572864 +configure:5938: checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format +configure:5978: result: func_convert_file_noop +configure:5985: checking how to convert x86_64-pc-linux-gnu file names to toolchain format +configure:6005: result: func_convert_file_noop +configure:6012: checking for /usr/bin/ld option to reload object files +configure:6019: result: -r +configure:6093: checking for objdump +configure:6109: found /usr/bin/objdump +configure:6120: result: objdump +configure:6152: checking how to recognize dependent libraries +configure:6352: result: pass_all +configure:6437: checking for dlltool +configure:6467: result: no +configure:6497: checking how to associate runtime and link libraries +configure:6524: result: printf %s\n +configure:6585: checking for ar +configure:6601: found /usr/bin/ar +configure:6612: result: ar +configure:6649: checking for archiver @FILE support +configure:6666: gcc -c conftest.c >&5 +configure:6666: $? = 0 +configure:6669: ar cru libconftest.a @conftest.lst >&5 +ar: `u' modifier ignored since `D' is the default (see `U') +configure:6672: $? = 0 +configure:6677: ar cru libconftest.a @conftest.lst >&5 +ar: `u' modifier ignored since `D' is the default (see `U') +ar: conftest.o: No such file or directory +configure:6680: $? = 1 +configure:6679: result: @ +configure:6737: checking for strip +configure:6753: found /usr/bin/strip +configure:6764: result: strip +configure:6836: checking for ranlib +configure:6852: found /usr/bin/ranlib +configure:6863: result: ranlib +configure:6965: checking command to parse /usr/bin/nm -B output from gcc object +configure:7118: gcc -c conftest.c >&5 +configure:7121: $? = 0 +configure:7125: /usr/bin/nm -B conftest.o \| sed -n -e 's/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | sed '/ __gnu_lto/d' \> conftest.nm +configure:7128: $? = 0 +configure:7194: gcc -o conftest conftest.c conftstm.o >&5 +configure:7197: $? = 0 +configure:7235: result: ok +configure:7282: checking for sysroot +configure:7312: result: no +configure:7319: checking for a working dd +configure:7357: result: /usr/bin/dd +configure:7361: checking how to truncate binary pipes +configure:7376: result: /usr/bin/dd bs=4096 count=1 +configure:7512: gcc -c conftest.c >&5 +configure:7515: $? = 0 +configure:7705: checking for mt +configure:7735: result: no +configure:7755: checking if : is a manifest tool +configure:7761: : '-?' +configure:7769: result: no +configure:8446: checking how to run the C preprocessor +configure:8477: gcc -E conftest.c +configure:8477: $? = 0 +configure:8491: gcc -E conftest.c +conftest.c:11:10: fatal error: ac_nonexistent.h: No such file or directory + 11 | #include <ac_nonexistent.h> + | ^~~~~~~~~~~~~~~~~~ +compilation terminated. +configure:8491: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| /* end confdefs.h. */ +| #include <ac_nonexistent.h> +configure:8516: result: gcc -E +configure:8536: gcc -E conftest.c +configure:8536: $? = 0 +configure:8550: gcc -E conftest.c +conftest.c:11:10: fatal error: ac_nonexistent.h: No such file or directory + 11 | #include <ac_nonexistent.h> + | ^~~~~~~~~~~~~~~~~~ +compilation terminated. +configure:8550: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| /* end confdefs.h. */ +| #include <ac_nonexistent.h> +configure:8579: checking for ANSI C header files +configure:8599: gcc -c conftest.c >&5 +configure:8599: $? = 0 +configure:8672: gcc -o conftest conftest.c >&5 +configure:8672: $? = 0 +configure:8672: ./conftest +configure:8672: $? = 0 +configure:8683: result: yes +configure:8696: checking for sys/types.h +configure:8696: gcc -c conftest.c >&5 +configure:8696: $? = 0 +configure:8696: result: yes +configure:8696: checking for sys/stat.h +configure:8696: gcc -c conftest.c >&5 +configure:8696: $? = 0 +configure:8696: result: yes +configure:8696: checking for stdlib.h +configure:8696: gcc -c conftest.c >&5 +configure:8696: $? = 0 +configure:8696: result: yes +configure:8696: checking for string.h +configure:8696: gcc -c conftest.c >&5 +configure:8696: $? = 0 +configure:8696: result: yes +configure:8696: checking for memory.h +configure:8696: gcc -c conftest.c >&5 +configure:8696: $? = 0 +configure:8696: result: yes +configure:8696: checking for strings.h +configure:8696: gcc -c conftest.c >&5 +configure:8696: $? = 0 +configure:8696: result: yes +configure:8696: checking for inttypes.h +configure:8696: gcc -c conftest.c >&5 +configure:8696: $? = 0 +configure:8696: result: yes +configure:8696: checking for stdint.h +configure:8696: gcc -c conftest.c >&5 +configure:8696: $? = 0 +configure:8696: result: yes +configure:8696: checking for unistd.h +configure:8696: gcc -c conftest.c >&5 +configure:8696: $? = 0 +configure:8696: result: yes +configure:8710: checking for dlfcn.h +configure:8710: gcc -c conftest.c >&5 +configure:8710: $? = 0 +configure:8710: result: yes +configure:8977: checking for objdir +configure:8992: result: .libs +configure:9256: checking if gcc supports -fno-rtti -fno-exceptions +configure:9274: gcc -c -fno-rtti -fno-exceptions conftest.c >&5 +cc1: warning: command line option '-fno-rtti' is valid for C++/D/ObjC++ but not for C +configure:9278: $? = 0 +configure:9291: result: no +configure:9649: checking for gcc option to produce PIC +configure:9656: result: -fPIC -DPIC +configure:9664: checking if gcc PIC flag -fPIC -DPIC works +configure:9682: gcc -c -fPIC -DPIC -DPIC conftest.c >&5 +configure:9686: $? = 0 +configure:9699: result: yes +configure:9728: checking if gcc static flag -static works +configure:9756: result: yes +configure:9771: checking if gcc supports -c -o file.o +configure:9792: gcc -c -o out/conftest2.o conftest.c >&5 +configure:9796: $? = 0 +configure:9818: result: yes +configure:9826: checking if gcc supports -c -o file.o +configure:9873: result: yes +configure:9906: checking whether the gcc linker (/usr/bin/ld) supports shared libraries +configure:11169: result: yes +configure:11206: checking whether -lc should be explicitly linked in +configure:11214: gcc -c conftest.c >&5 +configure:11217: $? = 0 +configure:11232: gcc -shared -fPIC -DPIC conftest.o -v -Wl,-soname -Wl,conftest -o conftest 2\>\&1 \| /usr/bin/grep -lc \>/dev/null 2\>\&1 +configure:11235: $? = 0 +configure:11249: result: no +configure:11409: checking dynamic linker characteristics +configure:11990: gcc -o conftest -Wl,-rpath -Wl,/foo conftest.c >&5 +configure:11990: $? = 0 +configure:12239: result: GNU/Linux ld.so +configure:12361: checking how to hardcode library paths into programs +configure:12386: result: immediate +configure:12934: checking whether stripping libraries is possible +configure:12939: result: yes +configure:12974: checking if libtool supports shared libraries +configure:12976: result: yes +configure:12979: checking whether to build shared libraries +configure:13004: result: yes +configure:13007: checking whether to build static libraries +configure:13011: result: no +configure:9810: checking how to run the C++ preprocessor +configure:9837: g++ -E conftest.cpp +configure:9837: $? = 0 +configure:9851: g++ -E conftest.cpp +conftest.cpp:23:10: fatal error: ac_nonexistent.h: No such file or directory + 23 | #include <ac_nonexistent.h> + | ^~~~~~~~~~~~~~~~~~ +compilation terminated. +configure:9851: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| /* end confdefs.h. */ +| #include <ac_nonexistent.h> +configure:9876: result: g++ -E +configure:9896: g++ -E conftest.cpp +configure:9896: $? = 0 +configure:9910: g++ -E conftest.cpp +conftest.cpp:23:10: fatal error: ac_nonexistent.h: No such file or directory + 23 | #include <ac_nonexistent.h> + | ^~~~~~~~~~~~~~~~~~ +compilation terminated. +configure:9910: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| /* end confdefs.h. */ +| #include <ac_nonexistent.h> +configure:10072: checking for ld used by g++ +configure:10139: result: /usr/bin/ld +configure:10146: checking if the linker (/usr/bin/ld) is GNU ld +configure:10161: result: yes +configure:10216: checking whether the g++ linker (/usr/bin/ld) supports shared libraries +configure:11289: result: yes +configure:11325: g++ -c -g -O2 conftest.cpp >&5 +configure:11328: $? = 0 +configure:11809: checking for g++ option to produce PIC +configure:11816: result: -fPIC -DPIC +configure:11824: checking if g++ PIC flag -fPIC -DPIC works +configure:11842: g++ -c -g -O2 -fPIC -DPIC -DPIC conftest.cpp >&5 +configure:11846: $? = 0 +configure:11859: result: yes +configure:11882: checking if g++ static flag -static works +configure:11910: result: yes +configure:11922: checking if g++ supports -c -o file.o +configure:11943: g++ -c -g -O2 -o out/conftest2.o conftest.cpp >&5 +configure:11947: $? = 0 +configure:11969: result: yes +configure:11974: checking if g++ supports -c -o file.o +configure:12021: result: yes +configure:12051: checking whether the g++ linker (/usr/bin/ld) supports shared libraries +configure:12094: result: yes +configure:12235: checking dynamic linker characteristics +configure:12992: result: GNU/Linux ld.so +configure:13057: checking how to hardcode library paths into programs +configure:13082: result: immediate +configure:11981: checking size of size_t +configure:11986: gcc -o conftest conftest.c >&5 +configure:11986: $? = 0 +configure:11986: ./conftest +configure:11986: $? = 0 +configure:12000: result: 8 +configure:12011: checking for C compiler vendor +configure:12059: gcc -c conftest.c >&5 +conftest.c: In function 'main': +conftest.c:30:9: error: 'thisisanerror' undeclared (first use in this function) + 30 | thisisanerror; + | ^~~~~~~~~~~~~ +conftest.c:30:9: note: each undeclared identifier is reported only once for each function it appears in +configure:12059: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__ICC) || defined(__ECC) || defined(__INTEL_COMPILER)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:12059: gcc -c conftest.c >&5 +conftest.c: In function 'main': +conftest.c:30:9: error: 'thisisanerror' undeclared (first use in this function) + 30 | thisisanerror; + | ^~~~~~~~~~~~~ +conftest.c:30:9: note: each undeclared identifier is reported only once for each function it appears in +configure:12059: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__xlc__) || defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:12059: gcc -c conftest.c >&5 +conftest.c: In function 'main': +conftest.c:30:9: error: 'thisisanerror' undeclared (first use in this function) + 30 | thisisanerror; + | ^~~~~~~~~~~~~ +conftest.c:30:9: note: each undeclared identifier is reported only once for each function it appears in +configure:12059: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__PATHCC__) || defined(__PATHSCALE__)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:12059: gcc -c conftest.c >&5 +conftest.c: In function 'main': +conftest.c:30:9: error: 'thisisanerror' undeclared (first use in this function) + 30 | thisisanerror; + | ^~~~~~~~~~~~~ +conftest.c:30:9: note: each undeclared identifier is reported only once for each function it appears in +configure:12059: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__clang__)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:12059: gcc -c conftest.c >&5 +conftest.c: In function 'main': +conftest.c:30:9: error: 'thisisanerror' undeclared (first use in this function) + 30 | thisisanerror; + | ^~~~~~~~~~~~~ +conftest.c:30:9: note: each undeclared identifier is reported only once for each function it appears in +configure:12059: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(_CRAYC)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:12059: gcc -c conftest.c >&5 +conftest.c: In function 'main': +conftest.c:30:9: error: 'thisisanerror' undeclared (first use in this function) + 30 | thisisanerror; + | ^~~~~~~~~~~~~ +conftest.c:30:9: note: each undeclared identifier is reported only once for each function it appears in +configure:12059: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__FUJITSU)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:12059: gcc -c conftest.c >&5 +conftest.c: In function 'main': +conftest.c:29:38: error: operator "defined" requires an identifier + 29 | #if !(defined(SDCC) || defined()) + | ^ +conftest.c:30:9: error: 'thisisanerror' undeclared (first use in this function) + 30 | thisisanerror; + | ^~~~~~~~~~~~~ +conftest.c:30:9: note: each undeclared identifier is reported only once for each function it appears in +configure:12059: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(SDCC) || defined()) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:12059: gcc -c conftest.c >&5 +conftest.c: In function 'main': +conftest.c:30:9: error: 'thisisanerror' undeclared (first use in this function) + 30 | thisisanerror; + | ^~~~~~~~~~~~~ +conftest.c:30:9: note: each undeclared identifier is reported only once for each function it appears in +configure:12059: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #if !(defined(__SDCC)) +| thisisanerror; +| #endif +| +| ; +| return 0; +| } +configure:12059: gcc -c conftest.c >&5 +configure:12059: $? = 0 +configure:12067: result: gnu +configure:12912: checking CFLAGS for maximum warnings +configure:12932: gcc -c -warn all -warn all conftest.c >&5 +gcc: error: all: No such file or directory +gcc: error: all: No such file or directory +gcc: error: unrecognized command line option '-warn'; did you mean '--warn-'? +gcc: error: unrecognized command line option '-warn'; did you mean '--warn-'? +configure:12932: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| ; +| return 0; +| } +configure:12932: gcc -c -pedantic -Wall conftest.c >&5 +configure:12932: $? = 0 +configure:12940: result: -Wall +configure:12960: : CFLAGS="$CFLAGS" +configure:12963: $? = 0 +configure:13000: checking whether to enable maintainer-specific portions of Makefiles +configure:13009: result: no +configure:13025: checking sys/memfd.h usability +configure:13025: gcc -c -Wall -fexceptions conftest.c >&5 +conftest.c:57:10: fatal error: sys/memfd.h: No such file or directory + 57 | #include <sys/memfd.h> + | ^~~~~~~~~~~~~ +compilation terminated. +configure:13025: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| #include <stdio.h> +| #ifdef HAVE_SYS_TYPES_H +| # include <sys/types.h> +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include <sys/stat.h> +| #endif +| #ifdef STDC_HEADERS +| # include <stdlib.h> +| # include <stddef.h> +| #else +| # ifdef HAVE_STDLIB_H +| # include <stdlib.h> +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include <memory.h> +| # endif +| # include <string.h> +| #endif +| #ifdef HAVE_STRINGS_H +| # include <strings.h> +| #endif +| #ifdef HAVE_INTTYPES_H +| # include <inttypes.h> +| #endif +| #ifdef HAVE_STDINT_H +| # include <stdint.h> +| #endif +| #ifdef HAVE_UNISTD_H +| # include <unistd.h> +| #endif +| #include <sys/memfd.h> +configure:13025: result: no +configure:13025: checking sys/memfd.h presence +configure:13025: gcc -E conftest.c +conftest.c:24:10: fatal error: sys/memfd.h: No such file or directory + 24 | #include <sys/memfd.h> + | ^~~~~~~~~~~~~ +compilation terminated. +configure:13025: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| /* end confdefs.h. */ +| #include <sys/memfd.h> +configure:13025: result: no +configure:13025: checking for sys/memfd.h +configure:13025: result: no +configure:13037: checking for memfd_create +configure:13037: gcc -o conftest -Wall -fexceptions conftest.c >&5 +configure:13037: $? = 0 +configure:13037: result: yes +configure:13049: checking sys/mman.h usability +configure:13049: gcc -c -Wall -fexceptions conftest.c >&5 +configure:13049: $? = 0 +configure:13049: result: yes +configure:13049: checking sys/mman.h presence +configure:13049: gcc -E conftest.c +configure:13049: $? = 0 +configure:13049: result: yes +configure:13049: checking for sys/mman.h +configure:13049: result: yes +configure:13062: checking for mmap +configure:13062: gcc -o conftest -Wall -fexceptions conftest.c >&5 +configure:13062: $? = 0 +configure:13062: result: yes +configure:13062: checking for mkostemp +configure:13062: gcc -o conftest -Wall -fexceptions conftest.c >&5 +configure:13062: $? = 0 +configure:13062: result: yes +configure:13072: checking for sys/mman.h +configure:13072: result: yes +configure:13080: checking for mmap +configure:13080: result: yes +configure:13093: checking whether read-only mmap of a plain file works +configure:13110: result: yes +configure:13112: checking whether mmap from /dev/zero works +configure:13134: result: yes +configure:13138: checking for MAP_ANON(YMOUS) +configure:13161: gcc -c -Wall -fexceptions conftest.c >&5 +conftest.c: In function 'main': +conftest.c:39:5: warning: unused variable 'n' [-Wunused-variable] + 39 | int n = MAP_ANONYMOUS; + | ^ +configure:13161: $? = 0 +configure:13168: result: yes +configure:13174: checking whether mmap with MAP_ANON(YMOUS) works +configure:13191: result: yes +configure:13234: checking for ANSI C header files +configure:13338: result: yes +configure:13348: checking for memcpy +configure:13348: gcc -o conftest -Wall -fexceptions conftest.c >&5 +conftest.c:55:6: warning: conflicting types for built-in function 'memcpy'; expected 'void *(void *, const void *, long unsigned int)' [-Wbuiltin-declaration-mismatch] + 55 | char memcpy (); + | ^~~~~~ +conftest.c:43:1: note: 'memcpy' is declared in header '<string.h>' + 42 | # include <limits.h> + 43 | #else +configure:13348: $? = 0 +configure:13348: result: yes +configure:13357: checking for size_t +configure:13357: gcc -c -Wall -fexceptions conftest.c >&5 +configure:13357: $? = 0 +configure:13357: gcc -c -Wall -fexceptions conftest.c >&5 +conftest.c: In function 'main': +conftest.c:69:21: error: expected expression before ')' token + 69 | if (sizeof ((size_t))) + | ^ +configure:13357: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| #define HAVE_MEMFD_CREATE 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MKOSTEMP 1 +| #define HAVE_MMAP_FILE 1 +| #define HAVE_MMAP_DEV_ZERO 1 +| #define HAVE_MMAP_ANON 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMCPY 1 +| /* end confdefs.h. */ +| #include <stdio.h> +| #ifdef HAVE_SYS_TYPES_H +| # include <sys/types.h> +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include <sys/stat.h> +| #endif +| #ifdef STDC_HEADERS +| # include <stdlib.h> +| # include <stddef.h> +| #else +| # ifdef HAVE_STDLIB_H +| # include <stdlib.h> +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include <memory.h> +| # endif +| # include <string.h> +| #endif +| #ifdef HAVE_STRINGS_H +| # include <strings.h> +| #endif +| #ifdef HAVE_INTTYPES_H +| # include <inttypes.h> +| #endif +| #ifdef HAVE_STDINT_H +| # include <stdint.h> +| #endif +| #ifdef HAVE_UNISTD_H +| # include <unistd.h> +| #endif +| int +| main () +| { +| if (sizeof ((size_t))) +| return 0; +| ; +| return 0; +| } +configure:13357: result: yes +configure:13370: checking for working alloca.h +configure:13387: gcc -o conftest -Wall -fexceptions conftest.c >&5 +configure:13387: $? = 0 +configure:13395: result: yes +configure:13403: checking for alloca +configure:13440: gcc -o conftest -Wall -fexceptions conftest.c >&5 +configure:13440: $? = 0 +configure:13448: result: yes +configure:13559: checking size of double +configure:13564: gcc -o conftest -Wall -fexceptions conftest.c >&5 +configure:13564: $? = 0 +configure:13564: ./conftest +configure:13564: $? = 0 +configure:13578: result: 8 +configure:13592: checking size of long double +configure:13597: gcc -o conftest -Wall -fexceptions conftest.c >&5 +configure:13597: $? = 0 +configure:13597: ./conftest +configure:13597: $? = 0 +configure:13611: result: 16 +configure:13644: checking whether byte ordering is bigendian +configure:13659: gcc -c -Wall -fexceptions conftest.c >&5 +conftest.c:39:9: error: unknown type name 'not' + 39 | not a universal capable compiler + | ^~~ +conftest.c:39:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'universal' + 39 | not a universal capable compiler + | ^~~~~~~~~ +conftest.c:39:15: error: unknown type name 'universal' +configure:13659: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| #define HAVE_MEMFD_CREATE 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MKOSTEMP 1 +| #define HAVE_MMAP_FILE 1 +| #define HAVE_MMAP_DEV_ZERO 1 +| #define HAVE_MMAP_ANON 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMCPY 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_ALLOCA 1 +| #define SIZEOF_DOUBLE 8 +| #define SIZEOF_LONG_DOUBLE 16 +| #define HAVE_LONG_DOUBLE 1 +| /* end confdefs.h. */ +| #ifndef __APPLE_CC__ +| not a universal capable compiler +| #endif +| typedef int dummy; +| +configure:13704: gcc -c -Wall -fexceptions conftest.c >&5 +configure:13704: $? = 0 +configure:13722: gcc -c -Wall -fexceptions conftest.c >&5 +conftest.c: In function 'main': +conftest.c:45:4: error: unknown type name 'not'; did you mean 'ino_t'? + 45 | not big endian + | ^~~ + | ino_t +conftest.c:45:12: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'endian' + 45 | not big endian + | ^~~~~~ +configure:13722: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| #define HAVE_MEMFD_CREATE 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MKOSTEMP 1 +| #define HAVE_MMAP_FILE 1 +| #define HAVE_MMAP_DEV_ZERO 1 +| #define HAVE_MMAP_ANON 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMCPY 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_ALLOCA 1 +| #define SIZEOF_DOUBLE 8 +| #define SIZEOF_LONG_DOUBLE 16 +| #define HAVE_LONG_DOUBLE 1 +| /* end confdefs.h. */ +| #include <sys/types.h> +| #include <sys/param.h> +| +| int +| main () +| { +| #if BYTE_ORDER != BIG_ENDIAN +| not big endian +| #endif +| +| ; +| return 0; +| } +configure:13850: result: no +configure:13869: checking assembler .cfi pseudo-op support +configure:13887: gcc -c -Wall -fexceptions conftest.c >&5 +configure:13887: $? = 0 +configure:13895: result: yes +configure:13982: checking assembler supports pc related relocs +configure:13995: result: yes +configure:14030: checking whether compiler supports pointer authentication +configure:14058: gcc -c -Wall -fexceptions conftest.c >&5 +conftest.c: In function 'main': +conftest.c:52:3: error: #error Pointer authentication not supported + 52 | # error Pointer authentication not supported + | ^~~~~ +configure:14058: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "libffi" +| #define PACKAGE_TARNAME "libffi" +| #define PACKAGE_VERSION "3.3" +| #define PACKAGE_STRING "libffi 3.3" +| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +| #define PACKAGE_URL "" +| #define PACKAGE "libffi" +| #define VERSION "3.3" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define LT_OBJDIR ".libs/" +| #define SIZEOF_SIZE_T 8 +| #define HAVE_MEMFD_CREATE 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MKOSTEMP 1 +| #define HAVE_MMAP_FILE 1 +| #define HAVE_MMAP_DEV_ZERO 1 +| #define HAVE_MMAP_ANON 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMCPY 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_ALLOCA 1 +| #define SIZEOF_DOUBLE 8 +| #define SIZEOF_LONG_DOUBLE 16 +| #define HAVE_LONG_DOUBLE 1 +| #define HAVE_AS_CFI_PSEUDO_OP 1 +| #define HAVE_AS_X86_PCREL 1 +| /* end confdefs.h. */ +| +| int +| main () +| { +| +| #ifdef __clang__ +| # if __has_feature(ptrauth_calls) +| # define HAVE_PTRAUTH 1 +| # endif +| #endif +| +| #ifndef HAVE_PTRAUTH +| # error Pointer authentication not supported +| #endif +| +| ; +| return 0; +| } +configure:14066: result: no +configure:14085: checking for _ prefix in compiled symbols +configure:14095: gcc -c -Wall -fexceptions conftest.c >&5 +conftest.c: In function 'main': +conftest.c:2:12: warning: statement with no effect [-Wunused-value] + 2 | int main(){nm_test_func;return 0;} + | ^~~~~~~~~~~~ +configure:14098: $? = 0 +configure:14102: /usr/bin/nm -B conftest.o \| sed -n -e 's/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | sed '/ __gnu_lto/d' \> conftest.nm +configure:14105: $? = 0 +configure:14127: result: no +configure:14163: checking toolchain supports unwind section type +configure:14192: result: yes +configure:14202: checking whether C compiler accepts -fno-lto +configure:14221: gcc -c -Wall -fexceptions -fno-lto conftest.c >&5 +configure:14221: $? = 0 +configure:14229: result: yes +configure:14238: checking whether .eh_frame section should be read-only +configure:14254: result: yes +configure:14269: checking for __attribute__((visibility("hidden"))) +configure:14278: gcc -Werror -S conftest.c -o conftest.s 1>&5 +configure:14281: $? = 0 +configure:14290: result: yes +configure:14429: checking for ld used by gcc +configure:14496: result: /usr/bin/ld +configure:14503: checking if the linker (/usr/bin/ld) is GNU ld +configure:14518: result: yes +configure:14692: checking for shared libgcc +configure:14707: gcc -o conftest -lgcc_s conftest.c >&5 +configure:14707: $? = 0 +configure:14745: result: yes +configure:14831: versioning on shared library symbols is gnu +configure:14944: checking that generated files are newer than configure +configure:14950: result: done +configure:15018: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by libffi config.status 3.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on 034409368e4d + +config.status:1225: creating include/Makefile +config.status:1225: creating include/ffi.h +config.status:1225: creating Makefile +config.status:1225: creating testsuite/Makefile +config.status:1225: creating man/Makefile +config.status:1225: creating doc/Makefile +config.status:1225: creating libffi.pc +config.status:1225: creating fficonfig.h +config.status:1439: executing buildir commands +config.status:1452: skipping top_srcdir/Makefile - not created +config.status:1439: executing depfiles commands +config.status:1439: executing libtool commands +config.status:1439: executing include commands +config.status:1439: executing src commands + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-pc-linux-gnu +ac_cv_c_bigendian=no +ac_cv_c_compiler_gnu=yes +ac_cv_cflags_warn_all=-Wall +ac_cv_cxx_compiler_gnu=yes +ac_cv_decl_map_anon=yes +ac_cv_env_CCASFLAGS_set= +ac_cv_env_CCASFLAGS_value= +ac_cv_env_CCAS_set= +ac_cv_env_CCAS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_CXXCPP_set= +ac_cv_env_CXXCPP_value= +ac_cv_env_LT_SYS_LIBRARY_PATH_set= +ac_cv_env_LT_SYS_LIBRARY_PATH_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set=set +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_func_alloca_works=yes +ac_cv_func_memcpy=yes +ac_cv_func_memfd_create=yes +ac_cv_func_mkostemp=yes +ac_cv_func_mmap=yes +ac_cv_func_mmap_anon=yes +ac_cv_func_mmap_dev_zero=yes +ac_cv_func_mmap_file=yes +ac_cv_header_dlfcn_h=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_memfd_h=no +ac_cv_header_sys_mman_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_unistd_h=yes +ac_cv_host=x86_64-pc-linux-gnu +ac_cv_objext=o +ac_cv_path_EGREP='/usr/bin/grep -E' +ac_cv_path_FGREP='/usr/bin/grep -F' +ac_cv_path_GREP=/usr/bin/grep +ac_cv_path_SED=/usr/bin/sed +ac_cv_path_ax_enable_builddir_sed=sed +ac_cv_path_install='/usr/bin/install -c' +ac_cv_path_lt_DD=/usr/bin/dd +ac_cv_path_mkdir=/usr/bin/mkdir +ac_cv_prog_AWK=mawk +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_CXXCPP='g++ -E' +ac_cv_prog_ac_ct_AR=ar +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_ac_ct_CXX=g++ +ac_cv_prog_ac_ct_OBJDUMP=objdump +ac_cv_prog_ac_ct_RANLIB=ranlib +ac_cv_prog_ac_ct_STRIP=strip +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_prog_cxx_g=yes +ac_cv_prog_make_make_set=yes +ac_cv_sizeof_double=8 +ac_cv_sizeof_long_double=16 +ac_cv_sizeof_size_t=8 +ac_cv_target=x86_64-pc-linux-gnu +ac_cv_type_size_t=yes +ac_cv_working_alloca_h=yes +am_cv_CCAS_dependencies_compiler_type=none +am_cv_CC_dependencies_compiler_type=none +am_cv_CXX_dependencies_compiler_type=none +am_cv_make_support_nested_variables=yes +am_cv_prog_cc_c_o=yes +ax_cv_c_compiler_vendor=gnu +ax_cv_check_cflags___fno_lto=yes +gcc_cv_as_cfi_pseudo_op=yes +libffi_cv_as_ptrauth=no +libffi_cv_as_x86_64_unwind_section_type=yes +libffi_cv_as_x86_pcrel=yes +libffi_cv_hidden_visibility_attribute=yes +libffi_cv_no_lto=-fno-lto +libffi_cv_ro_eh_frame=yes +lt_cv_ar_at_file=@ +lt_cv_archive_cmds_need_lc=no +lt_cv_deplibs_check_method=pass_all +lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_ld_reload_flag=-r +lt_cv_nm_interface='BSD nm' +lt_cv_objdir=.libs +lt_cv_path_LD=/usr/bin/ld +lt_cv_path_LDCXX=/usr/bin/ld +lt_cv_path_NM='/usr/bin/nm -B' +lt_cv_path_mainfest_tool=no +lt_cv_prog_compiler_c_o=yes +lt_cv_prog_compiler_c_o_CXX=yes +lt_cv_prog_compiler_pic='-fPIC -DPIC' +lt_cv_prog_compiler_pic_CXX='-fPIC -DPIC' +lt_cv_prog_compiler_pic_works=yes +lt_cv_prog_compiler_pic_works_CXX=yes +lt_cv_prog_compiler_rtti_exceptions=no +lt_cv_prog_compiler_static_works=yes +lt_cv_prog_compiler_static_works_CXX=yes +lt_cv_prog_gnu_ld=yes +lt_cv_prog_gnu_ldcxx=yes +lt_cv_sharedlib_from_linklib_cmd='printf %s\n' +lt_cv_shlibpath_overrides_runpath=yes +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p'\'' | sed '\''/ __gnu_lto/d'\''' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \(.*\) .*$/ {"\1", (void *) 0},/p'\'' -e '\''s/^[ABCDGIRSTW][ABCDGIRSTW]* .* \(.*\)$/ {"\1", (void *) \&\1},/p'\''' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \(.*\) .*$/ {"\1", (void *) 0},/p'\'' -e '\''s/^[ABCDGIRSTW][ABCDGIRSTW]* .* \(lib.*\)$/ {"\1", (void *) \&\1},/p'\'' -e '\''s/^[ABCDGIRSTW][ABCDGIRSTW]* .* \(.*\)$/ {"lib\1", (void *) \&\1},/p'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^T .* \(.*\)$/extern int \1();/p'\'' -e '\''s/^[ABCDGIRSTW][ABCDGIRSTW]* .* \(.*\)$/extern char \1;/p'\''' +lt_cv_sys_global_symbol_to_import= +lt_cv_sys_max_cmd_len=1572864 +lt_cv_sys_symbol_underscore=no +lt_cv_to_host_file_cmd=func_convert_file_noop +lt_cv_to_tool_file_cmd=func_convert_file_noop +lt_cv_truncate_bin='/usr/bin/dd bs=4096 count=1' + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +ACLOCAL='${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing aclocal-1.16' +ALLOCA='' +AMDEPBACKSLASH='' +AMDEP_FALSE='' +AMDEP_TRUE='#' +AMTAR='$${TAR-tar}' +AM_BACKSLASH='\' +AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +AM_DEFAULT_VERBOSITY='1' +AM_LTLDFLAGS='' +AM_RUNTESTFLAGS='' +AM_V='$(V)' +AR='ar' +AUTOCONF='${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoconf' +AUTOHEADER='${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoheader' +AUTOMAKE='${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing automake-1.16' +AWK='mawk' +BUILD_DOCS_FALSE='' +BUILD_DOCS_TRUE='#' +CC='gcc' +CCAS='gcc' +CCASDEPMODE='depmode=none' +CCASFLAGS='' +CCDEPMODE='depmode=none' +CFLAGS=' -Wall -fexceptions' +CPP='gcc -E' +CPPFLAGS='' +CXX='g++' +CXXCPP='g++ -E' +CXXDEPMODE='depmode=none' +CXXFLAGS='-g -O2' +CYGPATH_W='echo' +DEFS='-DHAVE_CONFIG_H' +DEPDIR='.deps' +DLLTOOL='false' +DSYMUTIL='' +DUMPBIN='' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='/usr/bin/grep -E' +EXEEXT='' +FFI_DEBUG_FALSE='' +FFI_DEBUG_TRUE='#' +FFI_EXEC_TRAMPOLINE_TABLE='0' +FFI_EXEC_TRAMPOLINE_TABLE_FALSE='' +FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#' +FGREP='/usr/bin/grep -F' +GREP='/usr/bin/grep' +HAVE_LONG_DOUBLE='1' +HAVE_LONG_DOUBLE_VARIANT='0' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_SCRIPT='${INSTALL}' +INSTALL_STRIP_PROGRAM='$(install_sh) -c -s' +LD='/usr/bin/ld' +LDFLAGS='' +LIBFFI_BUILD_VERSIONED_SHLIB_FALSE='#' +LIBFFI_BUILD_VERSIONED_SHLIB_GNU_FALSE='#' +LIBFFI_BUILD_VERSIONED_SHLIB_GNU_TRUE='' +LIBFFI_BUILD_VERSIONED_SHLIB_SUN_FALSE='' +LIBFFI_BUILD_VERSIONED_SHLIB_SUN_TRUE='#' +LIBFFI_BUILD_VERSIONED_SHLIB_TRUE='' +LIBOBJS='' +LIBS='' +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +LIPO='' +LN_S='ln -s' +LTLIBOBJS='' +LT_SYS_LIBRARY_PATH='' +MAINT='#' +MAINTAINER_MODE_FALSE='' +MAINTAINER_MODE_TRUE='#' +MAKEINFO='${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing makeinfo' +MANIFEST_TOOL=':' +MKDIR_P='/usr/bin/mkdir -p' +NM='/usr/bin/nm -B' +NMEDIT='' +OBJDUMP='objdump' +OBJEXT='o' +OPT_LDFLAGS='-Wl,-O1 ' +OTOOL64='' +OTOOL='' +PACKAGE='libffi' +PACKAGE_BUGREPORT='http://github.com/libffi/libffi/issues' +PACKAGE_NAME='libffi' +PACKAGE_STRING='libffi 3.3' +PACKAGE_TARNAME='libffi' +PACKAGE_URL='' +PACKAGE_VERSION='3.3' +PATH_SEPARATOR=':' +PRTDIAG='' +RANLIB='ranlib' +SECTION_LDFLAGS='' +SED='/usr/bin/sed' +SET_MAKE='' +SHELL='/bin/sh' +STRIP='strip' +TARGET='X86_64' +TARGETDIR='x86' +TARGET_OBJ=' src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo' +TESTSUBDIR_FALSE='#' +TESTSUBDIR_TRUE='' +VERSION='3.3' +ac_ct_AR='ar' +ac_ct_CC='gcc' +ac_ct_CXX='g++' +ac_ct_DUMPBIN='' +am__EXEEXT_FALSE='' +am__EXEEXT_TRUE='#' +am__fastdepCCAS_FALSE='' +am__fastdepCCAS_TRUE='#' +am__fastdepCC_FALSE='' +am__fastdepCC_TRUE='#' +am__fastdepCXX_FALSE='' +am__fastdepCXX_TRUE='#' +am__include='include' +am__isrc=' -I$(srcdir)' +am__leading_dot='.' +am__nodep='' +am__quote='' +am__tar='$${TAR-tar} chof - "$$tardir"' +am__untar='$${TAR-tar} xf -' +ax_enable_builddir_sed='sed' +bindir='${exec_prefix}/bin' +build='x86_64-pc-linux-gnu' +build_alias='' +build_cpu='x86_64' +build_os='linux-gnu' +build_vendor='pc' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +dvidir='${docdir}' +exec_prefix='${prefix}' +host='x86_64-pc-linux-gnu' +host_alias='' +host_cpu='x86_64' +host_os='linux-gnu' +host_vendor='pc' +htmldir='${docdir}' +includedir='${prefix}/include' +infodir='${datarootdir}/info' +install_sh='${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/install-sh' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${datarootdir}/man' +mkdir_p='$(MKDIR_P)' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/usr/local' +program_transform_name='s,x,x,' +psdir='${docdir}' +runstatedir='${localstatedir}/run' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sys_symbol_underscore='no' +sysconfdir='${prefix}/etc' +target='x86_64-pc-linux-gnu' +target_alias='' +target_cpu='x86_64' +target_os='linux-gnu' +target_vendor='pc' +toolexecdir='${libdir}/gcc-lib/$(target_alias)' +toolexeclibdir='${libdir}/../lib' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +/* confdefs.h */ +#define PACKAGE_NAME "libffi" +#define PACKAGE_TARNAME "libffi" +#define PACKAGE_VERSION "3.3" +#define PACKAGE_STRING "libffi 3.3" +#define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" +#define PACKAGE_URL "" +#define PACKAGE "libffi" +#define VERSION "3.3" +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_DLFCN_H 1 +#define LT_OBJDIR ".libs/" +#define SIZEOF_SIZE_T 8 +#define HAVE_MEMFD_CREATE 1 +#define HAVE_SYS_MMAN_H 1 +#define HAVE_MMAP 1 +#define HAVE_MKOSTEMP 1 +#define HAVE_MMAP_FILE 1 +#define HAVE_MMAP_DEV_ZERO 1 +#define HAVE_MMAP_ANON 1 +#define STDC_HEADERS 1 +#define HAVE_MEMCPY 1 +#define HAVE_ALLOCA_H 1 +#define HAVE_ALLOCA 1 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_LONG_DOUBLE 16 +#define HAVE_LONG_DOUBLE 1 +#define HAVE_AS_CFI_PSEUDO_OP 1 +#define HAVE_AS_X86_PCREL 1 +#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1 +#define HAVE_RO_EH_FRAME 1 +#define EH_FRAME_FLAGS "a" +#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1 +#define LIBFFI_GNU_SYMBOL_VERSIONING 1 + +configure: exit 0 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/config.status b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/config.status new file mode 100644 index 000000000000..7c7ff760d5c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/config.status @@ -0,0 +1,2407 @@ +#! /bin/sh +# Generated by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by libffi $as_me 3.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +# Files that config.status was made for. +config_files=" include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile doc/Makefile libffi.pc" +config_headers=" fficonfig.h" +config_commands=" buildir depfiles libtool include src" + +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to <http://github.com/libffi/libffi/issues>." + +ac_cs_config="'--disable-static' '--with-pic=yes' '--disable-dependency-tracking' '--disable-docs' '--host=' 'host_alias='" +ac_cs_version="\ +libffi config.status 3.3 +configured by /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure, generated by GNU Autoconf 2.69, + with options \"$ac_cs_config\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux' +srcdir='/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi' +INSTALL='/usr/bin/install -c' +MKDIR_P='/usr/bin/mkdir -p' +AWK='mawk' +test -n "$AWK" || AWK=awk +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +if $ac_cs_recheck; then + set X /bin/sh '/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure' '--disable-static' '--with-pic=yes' '--disable-dependency-tracking' '--disable-docs' '--host=' 'host_alias=' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/sh $*" >&6 + CONFIG_SHELL='/bin/sh' + export CONFIG_SHELL + exec "$@" +fi + +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +# +# INIT-COMMANDS +# +ax_enable_builddir_srcdir="/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi" # /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +ax_enable_builddir_host="" # / x86_64-pc-linux-gnu +ax_enable_builddir_version="3.3" # 3.3 +ax_enable_builddir_package="libffi" # libffi +ax_enable_builddir_auxdir="/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi" # +ax_enable_builddir_sed="sed" # /usr/bin/sed +ax_enable_builddir="." # + +AMDEP_TRUE="#" MAKE="make" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +double_quote_subst='s/\(["`\\]\)/\\\1/g' +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +macro_version='2.4.6' +macro_revision='2.4.6' +enable_shared='yes' +enable_static='no' +pic_mode='yes' +enable_fast_install='needless' +shared_archive_member_spec='' +SHELL='/bin/sh' +ECHO='printf %s\n' +PATH_SEPARATOR=':' +host_alias='' +host='x86_64-pc-linux-gnu' +host_os='linux-gnu' +build_alias='' +build='x86_64-pc-linux-gnu' +build_os='linux-gnu' +SED='/usr/bin/sed' +Xsed='/usr/bin/sed -e 1s/^X//' +GREP='/usr/bin/grep' +EGREP='/usr/bin/grep -E' +FGREP='/usr/bin/grep -F' +LD='/usr/bin/ld' +NM='/usr/bin/nm -B' +LN_S='ln -s' +max_cmd_len='1572864' +ac_objext='o' +exeext='' +lt_unset='unset' +lt_SP2NL='tr \040 \012' +lt_NL2SP='tr \015\012 \040\040' +lt_cv_to_host_file_cmd='func_convert_file_noop' +lt_cv_to_tool_file_cmd='func_convert_file_noop' +reload_flag=' -r' +reload_cmds='$LD$reload_flag -o $output$reload_objs' +OBJDUMP='objdump' +deplibs_check_method='pass_all' +file_magic_cmd='$MAGIC_CMD' +file_magic_glob='' +want_nocaseglob='no' +DLLTOOL='false' +sharedlib_from_linklib_cmd='printf %s\n' +AR='ar' +AR_FLAGS='cru' +archiver_list_spec='@' +STRIP='strip' +RANLIB='ranlib' +old_postinstall_cmds='chmod 644 $oldlib~$RANLIB $tool_oldlib' +old_postuninstall_cmds='' +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs~$RANLIB $tool_oldlib' +lock_old_archive_extraction='no' +CC='gcc' +CFLAGS=' -Wall -fexceptions' +compiler='g++' +GCC='yes' +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p'\'' | sed '\''/ __gnu_lto/d'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^T .* \(.*\)$/extern int \1();/p'\'' -e '\''s/^[ABCDGIRSTW][ABCDGIRSTW]* .* \(.*\)$/extern char \1;/p'\''' +lt_cv_sys_global_symbol_to_import='' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \(.*\) .*$/ {"\1", (void *) 0},/p'\'' -e '\''s/^[ABCDGIRSTW][ABCDGIRSTW]* .* \(.*\)$/ {"\1", (void *) \&\1},/p'\''' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \(.*\) .*$/ {"\1", (void *) 0},/p'\'' -e '\''s/^[ABCDGIRSTW][ABCDGIRSTW]* .* \(lib.*\)$/ {"\1", (void *) \&\1},/p'\'' -e '\''s/^[ABCDGIRSTW][ABCDGIRSTW]* .* \(.*\)$/ {"lib\1", (void *) \&\1},/p'\''' +lt_cv_nm_interface='BSD nm' +nm_file_list_spec='@' +lt_sysroot='' +lt_cv_truncate_bin='/usr/bin/dd bs=4096 count=1' +objdir='.libs' +MAGIC_CMD='file' +lt_prog_compiler_no_builtin_flag=' -fno-builtin' +lt_prog_compiler_pic=' -fPIC -DPIC' +lt_prog_compiler_wl='-Wl,' +lt_prog_compiler_static='-static' +lt_cv_prog_compiler_c_o='yes' +need_locks='no' +MANIFEST_TOOL=':' +DSYMUTIL='' +NMEDIT='' +LIPO='' +OTOOL='' +OTOOL64='' +libext='a' +shrext_cmds='.so' +extract_expsyms_cmds='' +archive_cmds_need_lc='no' +enable_shared_with_static_runtimes='no' +export_dynamic_flag_spec='$wl--export-dynamic' +whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' +compiler_needs_object='no' +old_archive_from_new_cmds='' +old_archive_from_expsyms_cmds='' +archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' +archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' +module_cmds='' +module_expsym_cmds='' +with_gnu_ld='yes' +allow_undefined_flag='' +no_undefined_flag='' +hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' +hardcode_libdir_separator='' +hardcode_direct='no' +hardcode_direct_absolute='no' +hardcode_minus_L='no' +hardcode_shlibpath_var='unsupported' +hardcode_automatic='no' +inherit_rpath='no' +link_all_deplibs='no' +always_export_symbols='no' +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' +include_expsyms='' +prelink_cmds='' +postlink_cmds='' +file_list_spec='' +variables_saved_for_relink='PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH' +need_lib_prefix='no' +need_version='no' +version_type='linux' +runpath_var='LD_RUN_PATH' +shlibpath_var='LD_LIBRARY_PATH' +shlibpath_overrides_runpath='yes' +libname_spec='lib$name' +library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' +soname_spec='$libname$release$shared_ext$major' +install_override_mode='' +postinstall_cmds='' +postuninstall_cmds='' +finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +finish_eval='' +hardcode_into_libs='yes' +sys_lib_search_path_spec='/usr/lib/gcc/x86_64-linux-gnu/9 /usr/lib/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib ' +configure_time_dlsearch_path='/lib /usr/lib /usr/lib/x86_64-linux-gnu/libfakeroot /usr/local/lib /usr/local/lib/x86_64-linux-gnu /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu ' +configure_time_lt_sys_library_path='' +hardcode_action='immediate' +enable_dlopen='unknown' +enable_dlopen_self='unknown' +enable_dlopen_self_static='unknown' +old_striplib='strip --strip-debug' +striplib='strip --strip-unneeded' +compiler_lib_search_dirs='' +predep_objects='' +postdep_objects='' +predeps='' +postdeps='' +compiler_lib_search_path='' +LD_CXX='/usr/bin/ld' +reload_flag_CXX=' -r' +reload_cmds_CXX='$LD$reload_flag -o $output$reload_objs' +old_archive_cmds_CXX='$AR $AR_FLAGS $oldlib$oldobjs~$RANLIB $tool_oldlib' +compiler_CXX='g++' +GCC_CXX='yes' +lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +lt_prog_compiler_pic_CXX=' -fPIC -DPIC' +lt_prog_compiler_wl_CXX='-Wl,' +lt_prog_compiler_static_CXX='-static' +lt_cv_prog_compiler_c_o_CXX='yes' +archive_cmds_need_lc_CXX='no' +enable_shared_with_static_runtimes_CXX='no' +export_dynamic_flag_spec_CXX='$wl--export-dynamic' +whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' +compiler_needs_object_CXX='no' +old_archive_from_new_cmds_CXX='' +old_archive_from_expsyms_cmds_CXX='' +archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' +archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' +module_cmds_CXX='' +module_expsym_cmds_CXX='' +with_gnu_ld_CXX='yes' +allow_undefined_flag_CXX='' +no_undefined_flag_CXX='' +hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' +hardcode_libdir_separator_CXX='' +hardcode_direct_CXX='no' +hardcode_direct_absolute_CXX='no' +hardcode_minus_L_CXX='no' +hardcode_shlibpath_var_CXX='unsupported' +hardcode_automatic_CXX='no' +inherit_rpath_CXX='no' +link_all_deplibs_CXX='no' +always_export_symbols_CXX='no' +export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' +include_expsyms_CXX='' +prelink_cmds_CXX='' +postlink_cmds_CXX='' +file_list_spec_CXX='' +hardcode_action_CXX='immediate' +compiler_lib_search_dirs_CXX='/usr/lib/gcc/x86_64-linux-gnu/9 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /usr/lib/gcc/x86_64-linux-gnu/9/../../..' +predep_objects_CXX='/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o' +postdep_objects_CXX='/usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o' +predeps_CXX='' +postdeps_CXX='-lstdc++ -lm -lgcc_s -lc -lgcc_s' +compiler_lib_search_path_CXX='-L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../..' + +LTCC='gcc' +LTCFLAGS='' +compiler='gcc' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL ECHO PATH_SEPARATOR SED GREP EGREP FGREP LD NM LN_S lt_SP2NL lt_NL2SP reload_flag OBJDUMP deplibs_check_method file_magic_cmd file_magic_glob want_nocaseglob DLLTOOL sharedlib_from_linklib_cmd AR AR_FLAGS archiver_list_spec STRIP RANLIB CC CFLAGS compiler lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl lt_cv_sys_global_symbol_to_import lt_cv_sys_global_symbol_to_c_name_address lt_cv_sys_global_symbol_to_c_name_address_lib_prefix lt_cv_nm_interface nm_file_list_spec lt_cv_truncate_bin lt_prog_compiler_no_builtin_flag lt_prog_compiler_pic lt_prog_compiler_wl lt_prog_compiler_static lt_cv_prog_compiler_c_o need_locks MANIFEST_TOOL DSYMUTIL NMEDIT LIPO OTOOL OTOOL64 shrext_cmds export_dynamic_flag_spec whole_archive_flag_spec compiler_needs_object with_gnu_ld allow_undefined_flag no_undefined_flag hardcode_libdir_flag_spec hardcode_libdir_separator exclude_expsyms include_expsyms file_list_spec variables_saved_for_relink libname_spec library_names_spec soname_spec install_override_mode finish_eval old_striplib striplib compiler_lib_search_dirs predep_objects postdep_objects predeps postdeps compiler_lib_search_path LD_CXX reload_flag_CXX compiler_CXX lt_prog_compiler_no_builtin_flag_CXX lt_prog_compiler_pic_CXX lt_prog_compiler_wl_CXX lt_prog_compiler_static_CXX lt_cv_prog_compiler_c_o_CXX export_dynamic_flag_spec_CXX whole_archive_flag_spec_CXX compiler_needs_object_CXX with_gnu_ld_CXX allow_undefined_flag_CXX no_undefined_flag_CXX hardcode_libdir_flag_spec_CXX hardcode_libdir_separator_CXX exclude_expsyms_CXX include_expsyms_CXX file_list_spec_CXX compiler_lib_search_dirs_CXX predep_objects_CXX postdep_objects_CXX predeps_CXX postdeps_CXX compiler_lib_search_path_CXX; do + case `eval \\$ECHO \\""\\$$var"\\"` in + *[\\\`\"\$]*) + eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED \"\$sed_quote_subst\"\`\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_$var=\\\"\$$var\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds old_postinstall_cmds old_postuninstall_cmds old_archive_cmds extract_expsyms_cmds old_archive_from_new_cmds old_archive_from_expsyms_cmds archive_cmds archive_expsym_cmds module_cmds module_expsym_cmds export_symbols_cmds prelink_cmds postlink_cmds postinstall_cmds postuninstall_cmds finish_cmds sys_lib_search_path_spec configure_time_dlsearch_path configure_time_lt_sys_library_path reload_cmds_CXX old_archive_cmds_CXX old_archive_from_new_cmds_CXX old_archive_from_expsyms_cmds_CXX archive_cmds_CXX archive_expsym_cmds_CXX module_cmds_CXX module_expsym_cmds_CXX export_symbols_cmds_CXX prelink_cmds_CXX postlink_cmds_CXX; do + case `eval \\$ECHO \\""\\$$var"\\"` in + *[\\\`\"\$]*) + eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_$var=\\\"\$$var\\\"" + ;; + esac +done + +ac_aux_dir='/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='libffi' + VERSION='3.3' + RM='rm -f' + ofile='libtool' + + + + + +TARGETDIR="x86" + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;; + "buildir") CONFIG_COMMANDS="$CONFIG_COMMANDS buildir" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;; + "src") CONFIG_COMMANDS="$CONFIG_COMMANDS src" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "include/ffi.h") CONFIG_FILES="$CONFIG_FILES include/ffi.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; + "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && +S["am__EXEEXT_FALSE"]="" +S["am__EXEEXT_TRUE"]="#" +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["LIBFFI_BUILD_VERSIONED_SHLIB_SUN_FALSE"]="" +S["LIBFFI_BUILD_VERSIONED_SHLIB_SUN_TRUE"]="#" +S["LIBFFI_BUILD_VERSIONED_SHLIB_GNU_FALSE"]="#" +S["LIBFFI_BUILD_VERSIONED_SHLIB_GNU_TRUE"]="" +S["LIBFFI_BUILD_VERSIONED_SHLIB_FALSE"]="#" +S["LIBFFI_BUILD_VERSIONED_SHLIB_TRUE"]="" +S["OPT_LDFLAGS"]="-Wl,-O1 " +S["SECTION_LDFLAGS"]="" +S["toolexeclibdir"]="${libdir}/../lib" +S["toolexecdir"]="${libdir}/gcc-lib/$(target_alias)" +S["FFI_DEBUG_FALSE"]="" +S["FFI_DEBUG_TRUE"]="#" +S["TARGET_OBJ"]=" src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo" +S["TARGETDIR"]="x86" +S["TARGET"]="X86_64" +S["BUILD_DOCS_FALSE"]="" +S["BUILD_DOCS_TRUE"]="#" +S["FFI_EXEC_TRAMPOLINE_TABLE"]="0" +S["FFI_EXEC_TRAMPOLINE_TABLE_FALSE"]="" +S["FFI_EXEC_TRAMPOLINE_TABLE_TRUE"]="#" +S["sys_symbol_underscore"]="no" +S["HAVE_LONG_DOUBLE_VARIANT"]="0" +S["HAVE_LONG_DOUBLE"]="1" +S["ALLOCA"]="" +S["AM_LTLDFLAGS"]="" +S["AM_RUNTESTFLAGS"]="" +S["TESTSUBDIR_FALSE"]="#" +S["TESTSUBDIR_TRUE"]="" +S["MAINT"]="#" +S["MAINTAINER_MODE_FALSE"]="" +S["MAINTAINER_MODE_TRUE"]="#" +S["PRTDIAG"]="" +S["CXXCPP"]="g++ -E" +S["CPP"]="gcc -E" +S["LT_SYS_LIBRARY_PATH"]="" +S["OTOOL64"]="" +S["OTOOL"]="" +S["LIPO"]="" +S["NMEDIT"]="" +S["DSYMUTIL"]="" +S["MANIFEST_TOOL"]=":" +S["RANLIB"]="ranlib" +S["ac_ct_AR"]="ar" +S["AR"]="ar" +S["DLLTOOL"]="false" +S["OBJDUMP"]="objdump" +S["LN_S"]="ln -s" +S["NM"]="/usr/bin/nm -B" +S["ac_ct_DUMPBIN"]="" +S["DUMPBIN"]="" +S["LD"]="/usr/bin/ld" +S["FGREP"]="/usr/bin/grep -F" +S["EGREP"]="/usr/bin/grep -E" +S["GREP"]="/usr/bin/grep" +S["SED"]="/usr/bin/sed" +S["LIBTOOL"]="$(SHELL) $(top_builddir)/libtool" +S["am__fastdepCCAS_FALSE"]="" +S["am__fastdepCCAS_TRUE"]="#" +S["CCASDEPMODE"]="depmode=none" +S["CCASFLAGS"]="" +S["CCAS"]="gcc" +S["am__fastdepCXX_FALSE"]="" +S["am__fastdepCXX_TRUE"]="#" +S["CXXDEPMODE"]="depmode=none" +S["ac_ct_CXX"]="g++" +S["CXXFLAGS"]="-g -O2" +S["CXX"]="g++" +S["am__fastdepCC_FALSE"]="" +S["am__fastdepCC_TRUE"]="#" +S["CCDEPMODE"]="depmode=none" +S["am__nodep"]="" +S["AMDEPBACKSLASH"]="" +S["AMDEP_FALSE"]="" +S["AMDEP_TRUE"]="#" +S["am__include"]="include" +S["DEPDIR"]=".deps" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="gcc" +S["CPPFLAGS"]="" +S["LDFLAGS"]="" +S["CFLAGS"]=" -Wall -fexceptions" +S["CC"]="gcc" +S["AM_BACKSLASH"]="\\" +S["AM_DEFAULT_VERBOSITY"]="1" +S["AM_DEFAULT_V"]="$(AM_DEFAULT_VERBOSITY)" +S["AM_V"]="$(V)" +S["am__untar"]="$${TAR-tar} xf -" +S["am__tar"]="$${TAR-tar} chof - \"$$tardir\"" +S["AMTAR"]="$${TAR-tar}" +S["am__leading_dot"]="." +S["SET_MAKE"]="" +S["AWK"]="mawk" +S["mkdir_p"]="$(MKDIR_P)" +S["MKDIR_P"]="/usr/bin/mkdir -p" +S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s" +S["STRIP"]="strip" +S["install_sh"]="${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/install-sh" +S["MAKEINFO"]="${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing makeinfo" +S["AUTOHEADER"]="${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoheader" +S["AUTOMAKE"]="${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing automake-1.16" +S["AUTOCONF"]="${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoconf" +S["ACLOCAL"]="${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing aclocal-1.16" +S["VERSION"]="3.3" +S["PACKAGE"]="libffi" +S["CYGPATH_W"]="echo" +S["am__isrc"]=" -I$(srcdir)" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["ax_enable_builddir_sed"]="sed" +S["target_os"]="linux-gnu" +S["target_vendor"]="pc" +S["target_cpu"]="x86_64" +S["target"]="x86_64-pc-linux-gnu" +S["host_os"]="linux-gnu" +S["host_vendor"]="pc" +S["host_cpu"]="x86_64" +S["host"]="x86_64-pc-linux-gnu" +S["build_os"]="linux-gnu" +S["build_vendor"]="pc" +S["build_cpu"]="x86_64" +S["build"]="x86_64-pc-linux-gnu" +S["target_alias"]="" +S["host_alias"]="" +S["build_alias"]="" +S["LIBS"]="" +S["ECHO_T"]="" +S["ECHO_N"]="-n" +S["ECHO_C"]="" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${datarootdir}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${exec_prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}" +S["oldincludedir"]="/usr/include" +S["includedir"]="${prefix}/include" +S["runstatedir"]="${localstatedir}/run" +S["localstatedir"]="${prefix}/var" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/etc" +S["datadir"]="${datarootdir}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/libexec" +S["sbindir"]="${exec_prefix}/sbin" +S["bindir"]="${exec_prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/usr/local" +S["exec_prefix"]="${prefix}" +S["PACKAGE_URL"]="" +S["PACKAGE_BUGREPORT"]="http://github.com/libffi/libffi/issues" +S["PACKAGE_STRING"]="libffi 3.3" +S["PACKAGE_VERSION"]="3.3" +S["PACKAGE_TARNAME"]="libffi" +S["PACKAGE_NAME"]="libffi" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/sh" +S["am__quote"]="" +_ACAWK +cat >>"$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"libffi\"" +D["PACKAGE_TARNAME"]=" \"libffi\"" +D["PACKAGE_VERSION"]=" \"3.3\"" +D["PACKAGE_STRING"]=" \"libffi 3.3\"" +D["PACKAGE_BUGREPORT"]=" \"http://github.com/libffi/libffi/issues\"" +D["PACKAGE_URL"]=" \"\"" +D["PACKAGE"]=" \"libffi\"" +D["VERSION"]=" \"3.3\"" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_DLFCN_H"]=" 1" +D["LT_OBJDIR"]=" \".libs/\"" +D["SIZEOF_SIZE_T"]=" 8" +D["HAVE_MEMFD_CREATE"]=" 1" +D["HAVE_SYS_MMAN_H"]=" 1" +D["HAVE_MMAP"]=" 1" +D["HAVE_MKOSTEMP"]=" 1" +D["HAVE_MMAP_FILE"]=" 1" +D["HAVE_MMAP_DEV_ZERO"]=" 1" +D["HAVE_MMAP_ANON"]=" 1" +D["STDC_HEADERS"]=" 1" +D["HAVE_MEMCPY"]=" 1" +D["HAVE_ALLOCA_H"]=" 1" +D["HAVE_ALLOCA"]=" 1" +D["SIZEOF_DOUBLE"]=" 8" +D["SIZEOF_LONG_DOUBLE"]=" 16" +D["HAVE_LONG_DOUBLE"]=" 1" +D["HAVE_AS_CFI_PSEUDO_OP"]=" 1" +D["HAVE_AS_X86_PCREL"]=" 1" +D["HAVE_AS_X86_64_UNWIND_SECTION_TYPE"]=" 1" +D["HAVE_RO_EH_FRAME"]=" 1" +D["EH_FRAME_FLAGS"]=" \"a\"" +D["HAVE_HIDDEN_VISIBILITY_ATTRIBUTE"]=" 1" +D["LIBFFI_GNU_SYMBOL_VERSIONING"]=" 1" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ { + line = $ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + ac_datarootdir_hack=' + s&@datadir@&${datarootdir}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${datarootdir}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra=" + +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "buildir":C) ac_top_srcdir="$ax_enable_builddir_srcdir" + if test ".$ax_enable_builddir" = ".." ; then + if test -f "$top_srcdir/Makefile" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - left untouched" >&5 +$as_echo "$as_me: skipping top_srcdir/Makefile - left untouched" >&6;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - not created" >&5 +$as_echo "$as_me: skipping top_srcdir/Makefile - not created" >&6;} + fi + else + if test -f "$ac_top_srcdir/Makefile" ; then + a=`grep "^VERSION " "$ac_top_srcdir/Makefile"` ; b=`grep "^VERSION " Makefile` + test "$a" != "$b" && rm "$ac_top_srcdir/Makefile" + fi + if test -f "$ac_top_srcdir/Makefile" ; then + echo "$ac_top_srcdir/Makefile : $ac_top_srcdir/Makefile.in" > $tmp/conftemp.mk + echo " @ echo 'REMOVED,,,' >\$@" >> $tmp/conftemp.mk + eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" + if grep '^REMOVED,,,' "$ac_top_srcdir/Makefile" >/dev/null + then rm $ac_top_srcdir/Makefile ; fi + cp $tmp/conftemp.mk $ac_top_srcdir/makefiles.mk~ ## DEBUGGING + fi + if test ! -f "$ac_top_srcdir/Makefile" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: create top_srcdir/Makefile guessed from local Makefile" >&5 +$as_echo "$as_me: create top_srcdir/Makefile guessed from local Makefile" >&6;} + x='`' ; cat >$tmp/conftemp.sed <<_EOF +/^\$/n +x +/^\$/bS +x +/\\\\\$/{H;d;} +{H;s/.*//;x;} +bM +:S +x +/\\\\\$/{h;d;} +{h;s/.*//;x;} +:M +s/\\(\\n\\) /\\1 /g +/^ /d +/^[ ]*[\\#]/d +/^VPATH *=/d +s/^srcdir *=.*/srcdir = ./ +s/^top_srcdir *=.*/top_srcdir = ./ +/[:=]/!d +/^\\./d +/ = /b +/ .= /b +/:/!b +s/:.*/:/ +s/ / /g +s/ \\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/ \\1 \\1-all\\2/g +s/^\\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/\\1 \\1-all\\2/ +s/ / /g +/^all all-all[ :]/i\\ +all-configured : all-all +s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-all//g +/-all-all/d +a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\ + ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done +/dist-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ + ; if test "\$\$found" -eq "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +/dist-[a-zA-Z0-9]*-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ + ; if test "\$\$found" -eq "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +/distclean-all *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ + ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ + ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile +_EOF + cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefile.sed~" ## DEBUGGING + $ax_enable_builddir_sed -f $tmp/conftemp.sed Makefile >$ac_top_srcdir/Makefile + if test -f "$ac_top_srcdir/Makefile.mk" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&5 +$as_echo "$as_me: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&6;} + cat $ac_top_srcdir/Makefile.mk >>$ac_top_srcdir/Makefile + fi ; xxxx="####" + echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$ac_top_srcdir/Makefile + # sanity check + if grep '^; echo "MAKE ' $ac_top_srcdir/Makefile >/dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: buggy sed found - it deletes tab in \"a\" text parts" >&5 +$as_echo "$as_me: buggy sed found - it deletes tab in \"a\" text parts" >&6;} + $ax_enable_builddir_sed -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $ac_top_srcdir/Makefile \ + >$ac_top_srcdir/Makefile~ + (test -s $ac_top_srcdir/Makefile~ && mv $ac_top_srcdir/Makefile~ $ac_top_srcdir/Makefile) 2>/dev/null + fi + else + xxxx="\\#\\#\\#\\#" + # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed + echo "s!^$xxxx [^|]* | *$ax_enable_builddir *\$!$xxxx ...... $ax_enable_builddir!" >$tmp/conftemp.sed + $ax_enable_builddir_sed -f "$tmp/conftemp.sed" "$ac_top_srcdir/Makefile" >$tmp/mkfile.tmp + cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefiles.sed~" ## DEBUGGING + cp "$tmp/mkfile.tmp" "$ac_top_srcdir/makefiles.out~" ## DEBUGGING + if cmp -s "$ac_top_srcdir/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: keeping top_srcdir/Makefile from earlier configure" >&5 +$as_echo "$as_me: keeping top_srcdir/Makefile from earlier configure" >&6;} + rm "$tmp/mkfile.tmp" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: reusing top_srcdir/Makefile from earlier configure" >&5 +$as_echo "$as_me: reusing top_srcdir/Makefile from earlier configure" >&6;} + mv "$tmp/mkfile.tmp" "$ac_top_srcdir/Makefile" + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&5 +$as_echo "$as_me: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&6;} + xxxx="####" + echo "$xxxx" "$ax_enable_builddir_host" "|$ax_enable_builddir" >>$ac_top_srcdir/Makefile + fi + ;; + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + "include":C) test -d include || mkdir include ;; + "src":C) +test -d src || mkdir src +test -d src/$TARGETDIR || mkdir src/$TARGETDIR + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/doc/Makefile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/doc/Makefile new file mode 100644 index 000000000000..dd3c5da99721 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/doc/Makefile @@ -0,0 +1,815 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# doc/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +target_triplet = x86_64-pc-linux-gnu +subdir = doc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/version.texi \ + $(srcdir)/stamp-vti $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +AM_V_DVIPS = $(am__v_DVIPS_$(V)) +am__v_DVIPS_ = $(am__v_DVIPS_$(AM_DEFAULT_VERBOSITY)) +am__v_DVIPS_0 = @echo " DVIPS " $@; +am__v_DVIPS_1 = +AM_V_MAKEINFO = $(am__v_MAKEINFO_$(V)) +am__v_MAKEINFO_ = $(am__v_MAKEINFO_$(AM_DEFAULT_VERBOSITY)) +am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; +am__v_MAKEINFO_1 = +AM_V_INFOHTML = $(am__v_INFOHTML_$(V)) +am__v_INFOHTML_ = $(am__v_INFOHTML_$(AM_DEFAULT_VERBOSITY)) +am__v_INFOHTML_0 = @echo " INFOHTML" $@; +am__v_INFOHTML_1 = +AM_V_TEXI2DVI = $(am__v_TEXI2DVI_$(V)) +am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_$(AM_DEFAULT_VERBOSITY)) +am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; +am__v_TEXI2DVI_1 = +AM_V_TEXI2PDF = $(am__v_TEXI2PDF_$(V)) +am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_$(AM_DEFAULT_VERBOSITY)) +am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; +am__v_TEXI2PDF_1 = +AM_V_texinfo = $(am__v_texinfo_$(V)) +am__v_texinfo_ = $(am__v_texinfo_$(AM_DEFAULT_VERBOSITY)) +am__v_texinfo_0 = -q +am__v_texinfo_1 = +AM_V_texidevnull = $(am__v_texidevnull_$(V)) +am__v_texidevnull_ = $(am__v_texidevnull_$(AM_DEFAULT_VERBOSITY)) +am__v_texidevnull_0 = > /dev/null +am__v_texidevnull_1 = +INFO_DEPS = $(srcdir)/libffi.info +am__TEXINFO_TEX_DIR = $(srcdir) +DVIS = libffi.dvi +PDFS = libffi.pdf +PSS = libffi.ps +HTMLS = libffi.html +TEXINFOS = libffi.texi +TEXI2DVI = texi2dvi +TEXI2PDF = $(TEXI2DVI) --pdf --batch +MAKEINFOHTML = $(MAKEINFO) --html +AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) +DVIPS = dvips +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__installdirs = "$(DESTDIR)$(infodir)" +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in mdate-sh texinfo.tex +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing aclocal-1.16 +ALLOCA = +AMTAR = $${TAR-tar} +AM_DEFAULT_VERBOSITY = 1 +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoconf +AUTOHEADER = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoheader +AUTOMAKE = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing automake-1.16 +AWK = mawk +CC = gcc +CCAS = gcc +CCASDEPMODE = depmode=none +CCASFLAGS = +CCDEPMODE = depmode=none +CFLAGS = -Wall -fexceptions +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXCPP = g++ -E +CXXDEPMODE = depmode=none +CXXFLAGS = -g -O2 +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +HAVE_LONG_DOUBLE_VARIANT = 0 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld +LDFLAGS = +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +MAINT = # +MAKEINFO = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OPT_LDFLAGS = -Wl,-O1 +OTOOL = +OTOOL64 = +PACKAGE = libffi +PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.3 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.3 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SECTION_LDFLAGS = +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_64 +TARGETDIR = x86 +TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo +VERSION = 3.3 +abs_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/doc +abs_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc +abs_top_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux +abs_top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_CXX = g++ +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc +sys_symbol_underscore = no +sysconfdir = ${prefix}/etc +target = x86_64-pc-linux-gnu +target_alias = +target_cpu = x86_64 +target_os = linux-gnu +target_vendor = pc +toolexecdir = ${libdir}/gcc-lib/$(target_alias) +toolexeclibdir = ${libdir}/../lib +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +info_TEXINFOS = libffi.texi +all: all-am + +.SUFFIXES: +.SUFFIXES: .dvi .html .info .pdf .ps .texi +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +.texi.info: + $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && $(am__cd) $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $@ $<; \ + then \ + rc=0; \ + $(am__cd) $(srcdir); \ + else \ + rc=$$?; \ + $(am__cd) $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + +.texi.dvi: + $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ + $< + +.texi.pdf: + $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ + $< + +.texi.html: + $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) + $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $(@:.html=.htp) $<; \ + then \ + rm -rf $@ && mv $(@:.html=.htp) $@; \ + else \ + rm -rf $(@:.html=.htp); exit 1; \ + fi +$(srcdir)/libffi.info: libffi.texi $(srcdir)/version.texi +libffi.dvi: libffi.texi $(srcdir)/version.texi +libffi.pdf: libffi.texi $(srcdir)/version.texi +libffi.html: libffi.texi $(srcdir)/version.texi +$(srcdir)/version.texi: # $(srcdir)/stamp-vti +$(srcdir)/stamp-vti: libffi.texi $(top_srcdir)/configure + @(dir=.; test -f ./libffi.texi || dir=$(srcdir); \ + set `$(SHELL) $(srcdir)/mdate-sh $$dir/libffi.texi`; \ + echo "@set UPDATED $$1 $$2 $$3"; \ + echo "@set UPDATED-MONTH $$2 $$3"; \ + echo "@set EDITION $(VERSION)"; \ + echo "@set VERSION $(VERSION)") > vti.tmp$$$$ && \ + (cmp -s vti.tmp$$$$ $(srcdir)/version.texi \ + || (echo "Updating $(srcdir)/version.texi" && \ + cp vti.tmp$$$$ $(srcdir)/version.texi.tmp$$$$ && \ + mv $(srcdir)/version.texi.tmp$$$$ $(srcdir)/version.texi)) && \ + rm -f vti.tmp$$$$ $(srcdir)/version.texi.$$$$ + @cp $(srcdir)/version.texi $@ + +mostlyclean-vti: + -rm -f vti.tmp* $(srcdir)/version.texi.tmp* + +maintainer-clean-vti: +# -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi +.dvi.ps: + $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) $(AM_V_texinfo) -o $@ $< + +uninstall-dvi-am: + @$(NORMAL_UNINSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ + rm -f "$(DESTDIR)$(dvidir)/$$f"; \ + done + +uninstall-html-am: + @$(NORMAL_UNINSTALL) + @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ + done + +uninstall-info-am: + @$(PRE_UNINSTALL) + @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ + (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ + echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ + rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ + else :; fi); \ + done + +uninstall-pdf-am: + @$(NORMAL_UNINSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ + done + +uninstall-ps-am: + @$(NORMAL_UNINSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ + rm -f "$(DESTDIR)$(psdir)/$$f"; \ + done + +dist-info: $(INFO_DEPS) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + case $$base in \ + $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ + for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ + if test -f $$file; then \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f "$(distdir)/$$relfile" || \ + cp -p $$file "$(distdir)/$$relfile"; \ + else :; fi; \ + done; \ + done + +mostlyclean-aminfo: + -rm -rf libffi.t2d libffi.t2p + +clean-aminfo: + -test -z "libffi.dvi libffi.pdf libffi.ps libffi.html" \ + || rm -rf libffi.dvi libffi.pdf libffi.ps libffi.html + +maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-info +check-am: all-am +check: check-am +all-am: Makefile $(INFO_DEPS) +installdirs: + for dir in "$(DESTDIR)$(infodir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: $(DVIS) + +html: html-am + +html-am: $(HTMLS) + +info: info-am + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am + +install-dvi: install-dvi-am + +install-dvi-am: $(DVIS) + @$(NORMAL_INSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ + done +install-exec-am: + +install-html: install-html-am + +install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) + @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__strip_dir) \ + d2=$$d$$p; \ + if test -d "$$d2"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ + echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + else \ + list2="$$list2 $$d2"; \ + fi; \ + done; \ + test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done; } +install-info: install-info-am + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ + fi; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ + if test -f $$ifile; then \ + echo "$$ifile"; \ + else : ; fi; \ + done; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done + @$(POST_INSTALL) + @if $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: $(PDFS) + @$(NORMAL_INSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done +install-ps: install-ps-am + +install-ps-am: $(PSS) + @$(NORMAL_INSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \ + mostlyclean-libtool mostlyclean-vti + +pdf: pdf-am + +pdf-am: $(PDFS) + +ps: ps-am + +ps-am: $(PSS) + +uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-pdf-am uninstall-ps-am + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-aminfo clean-generic \ + clean-libtool cscopelist-am ctags-am dist-info distclean \ + distclean-generic distclean-libtool distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-aminfo maintainer-clean-generic \ + maintainer-clean-vti mostlyclean mostlyclean-aminfo \ + mostlyclean-generic mostlyclean-libtool mostlyclean-vti pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am \ + uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-pdf-am uninstall-ps-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/fficonfig.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/fficonfig.h new file mode 100644 index 000000000000..064434a65bd9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/fficonfig.h @@ -0,0 +1,224 @@ +/* fficonfig.h. Generated from fficonfig.h.in by configure. */ +/* fficonfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "a" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ +/* #undef FFI_EXEC_TRAMPOLINE_TABLE */ + +/* Define this if you want to enable pax emulated trampolines */ +/* #undef FFI_MMAP_EXEC_EMUTRAMP_PAX */ + +/* Cannot use malloc on this target, so, we revert to alternative means */ +/* #undef FFI_MMAP_EXEC_WRIT */ + +/* Define this if you do not want support for the raw API. */ +/* #undef FFI_NO_RAW_API */ + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .cfi_* directives. */ +#define HAVE_AS_CFI_PSEUDO_OP 1 + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if the compiler uses zarch features. */ +/* #undef HAVE_AS_S390_ZARCH */ + +/* Define if your assembler and linker support unaligned PC relative relocs. + */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define if your assembler supports unwind section type. */ +#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1 + +/* Define if your assembler supports PC relative relocs. */ +#define HAVE_AS_X86_PCREL 1 + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if __attribute__((visibility("hidden"))) is supported. */ +#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if you have the long double type and it is bigger than a double */ +#define HAVE_LONG_DOUBLE 1 + +/* Define if you support more than one size of the long double type */ +/* #undef HAVE_LONG_DOUBLE_VARIANT */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the `memfd_create' function. */ +#define HAVE_MEMFD_CREATE 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkostemp' function. */ +#define HAVE_MKOSTEMP 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +#define HAVE_MMAP_DEV_ZERO 1 + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if your compiler supports pointer authentication. */ +/* #undef HAVE_PTRAUTH */ + +/* Define if .eh_frame sections should be read-only. */ +#define HAVE_RO_EH_FRAME 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the <sys/memfd.h> header file. */ +/* #undef HAVE_SYS_MEMFD_H */ + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if GNU symbol versioning is used for libatomic. */ +#define LIBFFI_GNU_SYMBOL_VERSIONING 1 + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 3.3" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.3" + +/* The size of `double', as computed by sizeof. */ +#define SIZEOF_DOUBLE 8 + +/* The size of `long double', as computed by sizeof. */ +#define SIZEOF_LONG_DOUBLE 16 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 8 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if symbols are underscored. */ +/* #undef SYMBOL_UNDERSCORE */ + +/* Define this if you are using Purify and want to suppress spurious messages. + */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "3.3" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef size_t */ + + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#ifdef __APPLE__ +#define FFI_HIDDEN(name) .private_extern name +#else +#define FFI_HIDDEN(name) .hidden name +#endif +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include/Makefile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include/Makefile new file mode 100644 index 000000000000..4f4c0ee81b54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include/Makefile @@ -0,0 +1,608 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# include/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +VPATH = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +target_triplet = x86_64-pc-linux-gnu +subdir = include +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = ffi.h +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(includedir)" +HEADERS = $(nodist_include_HEADERS) $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/ffi.h.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing aclocal-1.16 +ALLOCA = +AMTAR = $${TAR-tar} +AM_DEFAULT_VERBOSITY = 1 +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoconf +AUTOHEADER = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoheader +AUTOMAKE = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing automake-1.16 +AWK = mawk +CC = gcc +CCAS = gcc +CCASDEPMODE = depmode=none +CCASFLAGS = +CCDEPMODE = depmode=none +CFLAGS = -Wall -fexceptions +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXCPP = g++ -E +CXXDEPMODE = depmode=none +CXXFLAGS = -g -O2 +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +HAVE_LONG_DOUBLE_VARIANT = 0 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld +LDFLAGS = +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +MAINT = # +MAKEINFO = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OPT_LDFLAGS = -Wl,-O1 +OTOOL = +OTOOL64 = +PACKAGE = libffi +PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.3 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.3 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SECTION_LDFLAGS = +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_64 +TARGETDIR = x86 +TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo +VERSION = 3.3 +abs_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include +abs_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include +abs_top_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux +abs_top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_CXX = g++ +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include +sys_symbol_underscore = no +sysconfdir = ${prefix}/etc +target = x86_64-pc-linux-gnu +target_alias = +target_cpu = x86_64 +target_os = linux-gnu +target_vendor = pc +toolexecdir = ${libdir}/gcc-lib/$(target_alias) +toolexeclibdir = ${libdir}/../lib +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign +DISTCLEANFILES = ffitarget.h +noinst_HEADERS = ffi_common.h ffi_cfi.h +EXTRA_DIST = ffi.h.in +nodist_include_HEADERS = ffi.h ffitarget.h +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +ffi.h: $(top_builddir)/config.status $(srcdir)/ffi.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nodist_includeHEADERS: $(nodist_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-nodist_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-nodist_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-nodist_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-nodist_includeHEADERS install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-nodist_includeHEADERS + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include/ffi.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include/ffi.h new file mode 100644 index 000000000000..01bfbd17019d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include/ffi.h @@ -0,0 +1,523 @@ +/* -----------------------------------------------------------------*-C-*- + libffi 3.3 - Copyright (c) 2011, 2014, 2019 Anthony Green + - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the ``Software''), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + Most of the API is documented in doc/libffi.texi. + + The raw API is designed to bypass some of the argument packing and + unpacking on architectures for which it can be avoided. Routines + are provided to emulate the raw API if the underlying platform + doesn't allow faster implementation. + + More details on the raw API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifndef X86_64 +#define X86_64 +#endif + +/* ---- System configuration information --------------------------------- */ + +#include <ffitarget.h> + +#ifndef LIBFFI_ASM + +#if defined(_MSC_VER) && !defined(__clang__) +#define __attribute__(X) +#endif + +#include <stddef.h> +#include <limits.h> + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ + +#define FFI_64_BIT_MAX 9223372036854775807 + +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif /* _AIX52 or newer */ +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ +# ifndef __PPC64__ +# if defined (__IBMC__) || defined (__IBMCPP__) +# define FFI_LONG_LONG_MAX LONGLONG_MAX +# endif +# endif /* __PPC64__ */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif +# endif +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type +{ + size_t size; + unsigned short alignment; + unsigned short type; + struct _ffi_type **elements; +} ffi_type; + +/* Need minimal decorations for DLLs to work on Windows. GCC has + autoimport and autoexport. Always mark externally visible symbols + as dllimport for MSVC clients, even if it means an extra indirection + when using the static version of the library. + Besides, as a workaround, they can define FFI_BUILDING if they + *know* they are going to link with the static library. */ +#if defined _MSC_VER +# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ +# define FFI_API __declspec(dllexport) +# elif !defined FFI_BUILDING /* Importing libffi.DLL */ +# define FFI_API __declspec(dllimport) +# else /* Building/linking static library */ +# define FFI_API +# endif +#else +# define FFI_API +#endif + +/* The externally visible type declarations also need the MSVC DLL + decorations, or they will not be exported from the object file. */ +#if defined LIBFFI_HIDE_BASIC_TYPES +# define FFI_EXTERN FFI_API +#else +# define FFI_EXTERN extern FFI_API +#endif + +#ifndef LIBFFI_HIDE_BASIC_TYPES +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else + #error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else + #error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else + #error "int size not supported" +#endif + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX + #error "no 64-bit data type supported" +# endif +#elif LONG_MAX != FFI_64_BIT_MAX + #error "long size not supported" +#endif + +#if LONG_MAX == 2147483647 +# define ffi_type_ulong ffi_type_uint32 +# define ffi_type_slong ffi_type_sint32 +#elif LONG_MAX == FFI_64_BIT_MAX +# define ffi_type_ulong ffi_type_uint64 +# define ffi_type_slong ffi_type_sint64 +#else + #error "long size not supported" +#endif + +/* These are defined in types.c. */ +FFI_EXTERN ffi_type ffi_type_void; +FFI_EXTERN ffi_type ffi_type_uint8; +FFI_EXTERN ffi_type ffi_type_sint8; +FFI_EXTERN ffi_type ffi_type_uint16; +FFI_EXTERN ffi_type ffi_type_sint16; +FFI_EXTERN ffi_type ffi_type_uint32; +FFI_EXTERN ffi_type ffi_type_sint32; +FFI_EXTERN ffi_type ffi_type_uint64; +FFI_EXTERN ffi_type ffi_type_sint64; +FFI_EXTERN ffi_type ffi_type_float; +FFI_EXTERN ffi_type ffi_type_double; +FFI_EXTERN ffi_type ffi_type_pointer; + +#if 1 +FFI_EXTERN ffi_type ffi_type_longdouble; +#else +#define ffi_type_longdouble ffi_type_double +#endif + +#ifdef FFI_TARGET_HAS_COMPLEX_TYPE +FFI_EXTERN ffi_type ffi_type_complex_float; +FFI_EXTERN ffi_type ffi_type_complex_double; +#if 1 +FFI_EXTERN ffi_type ffi_type_complex_longdouble; +#else +#define ffi_type_complex_longdouble ffi_type_complex_double +#endif +#endif +#endif /* LIBFFI_HIDE_BASIC_TYPES */ + +typedef enum { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef struct { + ffi_abi abi; + unsigned nargs; + ffi_type **arg_types; + ffi_type *rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == FFI_64_BIT_MAX +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +#ifndef FFI_SIZEOF_JAVA_RAW +# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 +/* This is a special case for mips64/n32 ABI (and perhaps others) where + sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ +typedef union { + signed int sint; + unsigned int uint; + float flt; + char data[FFI_SIZEOF_JAVA_RAW]; + void* ptr; +} ffi_java_raw; +#else +typedef ffi_raw ffi_java_raw; +#endif + + +FFI_API +void ffi_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_raw *avalue); + +FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +FFI_API size_t ffi_raw_size (ffi_cif *cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines longs + and doubles are followed by an empty 64-bit word. */ + +#if !FFI_NATIVE_RAW_API +FFI_API +void ffi_java_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_java_raw *avalue) __attribute__((deprecated)); +#endif + +FFI_API +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) __attribute__((deprecated)); +FFI_API +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) __attribute__((deprecated)); +FFI_API +size_t ffi_java_raw_size (ffi_cif *cif) __attribute__((deprecated)); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +#ifdef _MSC_VER +__declspec(align(8)) +#endif +typedef struct { +#if 0 + void *trampoline_table; + void *trampoline_table_entry; +#else + char tramp[FFI_TRAMPOLINE_SIZE]; +#endif + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; +} ffi_closure +#ifdef __GNUC__ + __attribute__((aligned (8))) +#endif + ; + +#ifndef __GNUC__ +# ifdef __sgi +# pragma pack 0 +# endif +#endif + +FFI_API void *ffi_closure_alloc (size_t size, void **code); +FFI_API void ffi_closure_free (void *); + +#if defined(PA_LINUX) || defined(PA_HPUX) +#define FFI_CLOSURE_PTR(X) ((void *)((unsigned int)(X) | 2)) +#define FFI_RESTORE_PTR(X) ((void *)((unsigned int)(X) & ~3)) +#else +#define FFI_CLOSURE_PTR(X) (X) +#define FFI_RESTORE_PTR(X) (X) +#endif + +FFI_API ffi_status +ffi_prep_closure (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) + __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) +#elif defined(__GNUC__) && __GNUC__ >= 3 + __attribute__((deprecated)) +#endif + ; + +FFI_API ffi_status +ffi_prep_closure_loc (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void*codeloc); + +#ifdef __sgi +# pragma pack 8 +#endif +typedef struct { +#if 0 + void *trampoline_table; + void *trampoline_table_entry; +#else + char tramp[FFI_TRAMPOLINE_SIZE]; +#endif + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* If this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + +} ffi_raw_closure; + +typedef struct { +#if 0 + void *trampoline_table; + void *trampoline_table_entry; +#else + char tramp[FFI_TRAMPOLINE_SIZE]; +#endif + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* If this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the translation, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); + void *user_data; + +} ffi_java_raw_closure; + +FFI_API ffi_status +ffi_prep_raw_closure (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data); + +FFI_API ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc); + +#if !FFI_NATIVE_RAW_API +FFI_API ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data) __attribute__((deprecated)); + +FFI_API ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc) __attribute__((deprecated)); +#endif + +#endif /* FFI_CLOSURES */ + +#if FFI_GO_CLOSURES + +typedef struct { + void *tramp; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); +} ffi_go_closure; + +FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*)); + +FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure); + +#endif /* FFI_GO_CLOSURES */ + +/* ---- Public interface definition -------------------------------------- */ + +FFI_API +ffi_status ffi_prep_cif(ffi_cif *cif, + ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, + ffi_type **atypes); + +FFI_API +ffi_status ffi_prep_cif_var(ffi_cif *cif, + ffi_abi abi, + unsigned int nfixedargs, + unsigned int ntotalargs, + ffi_type *rtype, + ffi_type **atypes); + +FFI_API +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue); + +FFI_API +ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, + size_t *offsets); + +/* Useful for eliminating compiler warnings. */ +#define FFI_FN(f) ((void (*)(void))f) + +/* ---- Definitions shared with assembly code ---------------------------- */ + +#endif + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 +#if 1 +#define FFI_TYPE_LONGDOUBLE 4 +#else +#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 +#define FFI_TYPE_COMPLEX 15 + +/* This should always refer to the last type code (for sanity checks). */ +#define FFI_TYPE_LAST FFI_TYPE_COMPLEX + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include/ffitarget.h new file mode 100644 index 000000000000..a34f3e5b702b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/include/ffitarget.h @@ -0,0 +1,160 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012, 2014, 2018 Anthony Green + Copyright (c) 1996-2003, 2010 Red Hat, Inc. + Copyright (C) 2008 Free Software Foundation, Inc. + + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- System specific configurations ----------------------------------- */ + +/* For code common to all platforms on x86 and x86_64. */ +#define X86_ANY + +#if defined (X86_64) && defined (__i386__) +#undef X86_64 +#define X86 +#endif + +#ifdef X86_WIN64 +#define FFI_SIZEOF_ARG 8 +#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */ +#endif + +#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION +#ifndef _MSC_VER +#define FFI_TARGET_HAS_COMPLEX_TYPE +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +#ifdef X86_WIN64 +#ifdef _MSC_VER +typedef unsigned __int64 ffi_arg; +typedef __int64 ffi_sarg; +#else +typedef unsigned long long ffi_arg; +typedef long long ffi_sarg; +#endif +#else +#if defined __x86_64__ && defined __ILP32__ +#define FFI_SIZEOF_ARG 8 +#define FFI_SIZEOF_JAVA_RAW 4 +typedef unsigned long long ffi_arg; +typedef long long ffi_sarg; +#else +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; +#endif +#endif + +typedef enum ffi_abi { +#if defined(X86_WIN64) + FFI_FIRST_ABI = 0, + FFI_WIN64, /* sizeof(long double) == 8 - microsoft compilers */ + FFI_GNUW64, /* sizeof(long double) == 16 - GNU compilers */ + FFI_LAST_ABI, +#ifdef __GNUC__ + FFI_DEFAULT_ABI = FFI_GNUW64 +#else + FFI_DEFAULT_ABI = FFI_WIN64 +#endif + +#elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) + FFI_FIRST_ABI = 1, + FFI_UNIX64, + FFI_WIN64, + FFI_EFI64 = FFI_WIN64, + FFI_GNUW64, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_UNIX64 + +#elif defined(X86_WIN32) + FFI_FIRST_ABI = 0, + FFI_SYSV = 1, + FFI_STDCALL = 2, + FFI_THISCALL = 3, + FFI_FASTCALL = 4, + FFI_MS_CDECL = 5, + FFI_PASCAL = 6, + FFI_REGISTER = 7, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_MS_CDECL +#else + FFI_FIRST_ABI = 0, + FFI_SYSV = 1, + FFI_THISCALL = 3, + FFI_FASTCALL = 4, + FFI_STDCALL = 5, + FFI_PASCAL = 6, + FFI_REGISTER = 7, + FFI_MS_CDECL = 8, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +#endif +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_GO_CLOSURES 1 + +#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) +#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) +#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) +#define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) + +#if defined (X86_64) || defined(X86_WIN64) \ + || (defined (__x86_64__) && defined (X86_DARWIN)) +/* 4 bytes of ENDBR64 + 7 bytes of LEA + 6 bytes of JMP + 7 bytes of NOP + + 8 bytes of pointer. */ +# define FFI_TRAMPOLINE_SIZE 32 +# define FFI_NATIVE_RAW_API 0 +#else +/* 4 bytes of ENDBR32 + 5 bytes of MOV + 5 bytes of JMP + 2 unused + bytes. */ +# define FFI_TRAMPOLINE_SIZE 16 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif + +#if !defined(GENERATE_LIBFFI_MAP) && defined(__ASSEMBLER__) \ + && defined(__CET__) +# include <cet.h> +# define _CET_NOTRACK notrack +#else +# define _CET_ENDBR +# define _CET_NOTRACK +#endif + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi.la b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi.la new file mode 100644 index 000000000000..20e8cb18d322 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi.la @@ -0,0 +1,41 @@ +# libffi.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libffi.so.8' + +# Names of this library. +library_names='libffi.so.8.1.0 libffi.so.8 libffi.so' + +# The name of the static archive. +old_library='' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libffi. +current=9 +age=1 +revision=0 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib/../lib' diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi.map b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi.map new file mode 100644 index 000000000000..1155a9741b08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi.map @@ -0,0 +1,83 @@ +# 1 "/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.map.in" +# 1 "<built-in>" +# 1 "<command-line>" +# 1 "/usr/include/stdc-predef.h" 1 3 4 +# 1 "<command-line>" 2 +# 1 "/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.map.in" + + +# 1 "./fficonfig.h" 1 +# 4 "/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.map.in" 2 +# 1 "include/ffitarget.h" 1 +# 5 "/src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.map.in" 2 + + + + +LIBFFI_BASE_8.0 { + global: + + ffi_type_void; + ffi_type_uint8; + ffi_type_sint8; + ffi_type_uint16; + ffi_type_sint16; + ffi_type_uint32; + ffi_type_sint32; + ffi_type_uint64; + ffi_type_sint64; + ffi_type_float; + ffi_type_double; + ffi_type_longdouble; + ffi_type_pointer; + + + ffi_call; + ffi_prep_cif; + ffi_prep_cif_var; + + ffi_raw_call; + ffi_ptrarray_to_raw; + ffi_raw_to_ptrarray; + ffi_raw_size; + + ffi_java_raw_call; + ffi_java_ptrarray_to_raw; + ffi_java_raw_to_ptrarray; + ffi_java_raw_size; + + ffi_get_struct_offsets; + local: + *; +}; + + +LIBFFI_COMPLEX_8.0 { + global: + + ffi_type_complex_float; + ffi_type_complex_double; + ffi_type_complex_longdouble; +} LIBFFI_BASE_8.0; + + + +LIBFFI_CLOSURE_8.0 { + global: + ffi_closure_alloc; + ffi_closure_free; + ffi_prep_closure; + ffi_prep_closure_loc; + ffi_prep_raw_closure; + ffi_prep_raw_closure_loc; + ffi_prep_java_raw_closure; + ffi_prep_java_raw_closure_loc; +} LIBFFI_BASE_8.0; + + + +LIBFFI_GO_CLOSURE_8.0 { + global: + ffi_call_go; + ffi_prep_go_closure; +} LIBFFI_CLOSURE_8.0; diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi.pc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi.pc new file mode 100644 index 000000000000..e51488c27bba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi.pc @@ -0,0 +1,11 @@ +prefix=/usr/local +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +toolexeclibdir=${libdir}/../lib +includedir=${prefix}/include + +Name: libffi +Description: Library supporting Foreign Function Interfaces +Version: 3.3 +Libs: -L${toolexeclibdir} -lffi +Cflags: -I${includedir} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi_convenience.la b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi_convenience.la new file mode 100644 index 000000000000..bfd15ab9f01e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libffi_convenience.la @@ -0,0 +1,41 @@ +# libffi_convenience.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libffi_convenience.a' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libffi_convenience. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libtool b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libtool new file mode 100644 index 000000000000..a6fd2eb241e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/libtool @@ -0,0 +1,11911 @@ +#! /bin/sh +# Generated automatically by config.status (libffi) 3.3 +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: ${LT_SYS_LIBRARY_PATH=""} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=2.4.6 +macro_revision=2.4.6 + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=no + +# What type of objects to build. +pic_mode=yes + +# Whether or not to optimize for fast installation. +fast_install=needless + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec= + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# An echo program that protects backslashes. +ECHO="printf %s\\n" + +# The PATH separator for the build system. +PATH_SEPARATOR=":" + +# The host system. +host_alias= +host=x86_64-pc-linux-gnu +host_os=linux-gnu + +# The build system. +build_alias= +build=x86_64-pc-linux-gnu +build_os=linux-gnu + +# A sed program that does not truncate output. +SED="/usr/bin/sed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP="/usr/bin/grep" + +# An ERE matcher. +EGREP="/usr/bin/grep -E" + +# A literal string matcher. +FGREP="/usr/bin/grep -F" + +# A BSD- or MS-compatible name lister. +NM="/usr/bin/nm -B" + +# Whether we need soft or hard links. +LN_S="ln -s" + +# What is the maximum length of a command? +max_cmd_len=1572864 + +# Object file suffix (normally "o"). +objext=o + +# Executable file suffix (normally ""). +exeext= + +# whether the shell understands "unset". +lt_unset=unset + +# turn spaces into newlines. +SP2NL="tr \\040 \\012" + +# turn newlines into spaces. +NL2SP="tr \\015\\012 \\040\\040" + +# convert $build file names to $host format. +to_host_file_cmd=func_convert_file_noop + +# convert $build files to toolchain format. +to_tool_file_cmd=func_convert_file_noop + +# An object symbol dumper. +OBJDUMP="objdump" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd="\$MAGIC_CMD" + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob="" + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob="no" + +# DLL creation program. +DLLTOOL="false" + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd="printf %s\\n" + +# The archiver. +AR="ar" + +# Flags to create an archive. +AR_FLAGS="cru" + +# How to feed a file listing to the archiver. +archiver_list_spec="@" + +# A symbol stripping program. +STRIP="strip" + +# Commands used to install an old-style archive. +RANLIB="ranlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$tool_oldlib" +old_postuninstall_cmds="" + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=no + +# A C compiler. +LTCC="gcc" + +# LTCC compiler flags. +LTCFLAGS=" -Wall -fexceptions" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p' | sed '/ __gnu_lto/d'" + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[ABCDGIRSTW][ABCDGIRSTW]* .* \\(.*\\)\$/extern char \\1;/p'" + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import="" + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address="sed -n -e 's/^: \\(.*\\) .*\$/ {\"\\1\", (void *) 0},/p' -e 's/^[ABCDGIRSTW][ABCDGIRSTW]* .* \\(.*\\)\$/ {\"\\1\", (void *) \\&\\1},/p'" + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \\(.*\\) .*\$/ {\"\\1\", (void *) 0},/p' -e 's/^[ABCDGIRSTW][ABCDGIRSTW]* .* \\(lib.*\\)\$/ {\"\\1\", (void *) \\&\\1},/p' -e 's/^[ABCDGIRSTW][ABCDGIRSTW]* .* \\(.*\\)\$/ {\"lib\\1\", (void *) \\&\\1},/p'" + +# The name lister interface. +nm_interface="BSD nm" + +# Specify filename containing input files for $NM. +nm_file_list_spec="@" + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot= + +# Command to truncate a binary pipe. +lt_truncate_bin="/usr/bin/dd bs=4096 count=1" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=file + +# Must we lock files when doing compilation? +need_locks="no" + +# Manifest tool. +MANIFEST_TOOL=":" + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL="" + +# Tool to change global to local symbols on Mac OS X. +NMEDIT="" + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO="" + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL="" + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64="" + +# Old archive suffix (normally "a"). +libext=a + +# Shared library suffix (normally ".so"). +shrext_cmds=".so" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Do we need the "lib" prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Library versioning type. +version_type=linux + +# Shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# Shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=yes + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec="\$libname\$release\$shared_ext\$versuffix \$libname\$release\$shared_ext\$major \$libname\$shared_ext" + +# The coded name of the library, if different from the real name. +soname_spec="\$libname\$release\$shared_ext\$major" + +# Permission mode override for installation of shared libraries. +install_override_mode="" + +# Command to use after installation of a shared archive. +postinstall_cmds="" + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval="" + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Compile-time system search path for libraries. +sys_lib_search_path_spec="/usr/lib/gcc/x86_64-linux-gnu/9 /usr/lib/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib " + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/x86_64-linux-gnu/libfakeroot /usr/local/lib /usr/local/lib/x86_64-linux-gnu /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path="" + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + + +# The linker used to build libraries. +LD="/usr/bin/ld" + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# Commands used to build an old-style archive. +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$tool_oldlib" + +# A language specific compiler. +CC="gcc" + +# Is the compiler the GNU compiler? +with_gcc=yes + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=no + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\$wl--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\$wl--whole-archive\$convenience \$wl--no-whole-archive" + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object="no" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build a shared archive. +archive_cmds="\$CC -shared \$pic_flag \$libobjs \$deplibs \$compiler_flags \$wl-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ + cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ + echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$pic_flag \$libobjs \$deplibs \$compiler_flags \$wl-soname \$wl\$soname \$wl-version-script \$wl\$output_objdir/\$libname.ver -o \$lib" + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds="" +module_expsym_cmds="" + +# Whether we are building with GNU ld or not. +with_gnu_ld="yes" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that enforces no undefined symbols. +no_undefined_flag="" + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist +hardcode_libdir_flag_spec="\$wl-rpath \$wl\$libdir" + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator="" + +# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=no + +# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting $shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=no + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=no + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=no + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=no + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=no + +# Set to "yes" if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds="" + +# Commands necessary for finishing linking programs. +postlink_cmds="" + +# Specify filename containing input files. +file_list_spec="" + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs="" + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects="" +postdep_objects="" +predeps="" +postdeps="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# ### END LIBTOOL CONFIG + + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.6 Debian-2.4.6-14" +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2015-10-07.11; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + _G_rc_run_hooks=false + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + if eval $_G_hook '"$@"'; then + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + _G_rc_run_hooks=: + fi + done + + $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, you may remove/edit +# any options that you action, and then pass back the remaining unprocessed +# options in '<hooked_function_name>_result', escaped suitably for +# 'eval'. In this case you also must return $EXIT_SUCCESS to let the +# hook's caller know that it should pay attention to +# '<hooked_function_name>_result'. Returning $EXIT_FAILURE signalizes that +# arguments are left untouched by the hook and therefore caller will ignore the +# result variable. +# +# Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# # No change in '$@' (ignored completely by this hook). There is +# # no need to do the equivalent (but slower) action: +# # func_quote_for_eval ${1+"$@"} +# # my_options_prep_result=$func_quote_for_eval_result +# false +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# args_changed=false +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: +# args_changed=: +# ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# args_changed=: +# ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@", we could need that later +# # if $args_changed is true. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; +# esac +# done +# +# if $args_changed; then +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# fi +# +# $args_changed +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# false +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll also need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + _G_func_options_finish_exit=false + if func_run_hooks func_options ${1+"$@"}; then + func_options_finish_result=$func_run_hooks_result + _G_func_options_finish_exit=: + fi + + $_G_func_options_finish_exit +} + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + _G_rc_options=false + + for my_func in options_prep parse_options validate_options options_finish + do + if eval func_$my_func '${1+"$@"}'; then + eval _G_res_var='$'"func_${my_func}_result" + eval set dummy "$_G_res_var" ; shift + _G_rc_options=: + fi + done + + # Save modified positional parameters for caller. As a top-level + # options-parser function we always need to set the 'func_options_result' + # variable (regardless the $_G_rc_options value). + if $_G_rc_options; then + func_options_result=$_G_res_var + else + func_quote_for_eval ${1+"$@"} + func_options_result=$func_quote_for_eval_result + fi + + $_G_rc_options +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propagate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned). +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + _G_rc_options_prep=false + if func_run_hooks func_options_prep ${1+"$@"}; then + _G_rc_options_prep=: + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result + fi + + $_G_rc_options_prep +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + _G_rc_parse_options=false + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + if func_run_hooks func_parse_options ${1+"$@"}; then + eval set dummy "$func_run_hooks_result"; shift + _G_rc_parse_options=: + fi + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_match_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + if test $# = 0 && func_missing_arg $_G_opt; then + _G_rc_parse_options=: + break + fi + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) _G_rc_parse_options=: ; break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; + esac + + $_G_match_parse_options && _G_rc_parse_options=: + done + + + if $_G_rc_parse_options; then + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result + fi + + $_G_rc_parse_options +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + _G_rc_validate_options=false + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + if func_run_hooks func_validate_options ${1+"$@"}; then + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result + _G_rc_validate_options=: + fi + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + $_G_rc_validate_options +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname $scriptversion Debian-2.4.6-14 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to <bug-libtool@gnu.org>. +GNU libtool home page: <http://www.gnu.org/s/libtool/>. +General help using GNU software: <http://www.gnu.org/gethelp/>." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + _G_rc_lt_options_prep=: + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + *) + _G_rc_lt_options_prep=false + ;; + esac + + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result + fi + + $_G_rc_lt_options_prep +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + _G_rc_lt_parse_options=false + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_match_lt_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; + esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: + done + + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result + fi + + $_G_rc_lt_parse_options +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T <<EOF +# $write_libobj - a libtool object file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object=$write_lobj + +# Name of the non-PIC object +non_pic_object=$write_oldobj + +EOF + $MV "${write_libobj}T" "$write_libobj" + } +} + + +################################################## +# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # +################################################## + +# func_convert_core_file_wine_to_w32 ARG +# Helper function used by file name conversion functions when $build is *nix, +# and $host is mingw, cygwin, or some other w32 environment. Relies on a +# correctly configured wine environment available, with the winepath program +# in $build's $PATH. +# +# ARG is the $build file name to be converted to w32 format. +# Result is available in $func_convert_core_file_wine_to_w32_result, and will +# be empty on error (or when ARG is empty) +func_convert_core_file_wine_to_w32 () +{ + $debug_cmd + + func_convert_core_file_wine_to_w32_result=$1 + if test -n "$1"; then + # Unfortunately, winepath does not exit with a non-zero error code, so we + # are forced to check the contents of stdout. On the other hand, if the + # command is not found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both error code of + # zero AND non-empty stdout, which explains the odd construction: + func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen <import library>. + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 </dev/null >/dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) &lt_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat <<EOF + +/* $cwrappersource - temporary wrapper executable for $objdir/$outputname + Generated by $PROGRAM (GNU $PACKAGE) $VERSION + + The $output program cannot be directly executed until all the libtool + libraries that it depends on are installed. + + This wrapper executable should never be moved out of the build directory. + If it is, it will not operate correctly. +*/ +EOF + cat <<"EOF" +#ifdef _MSC_VER +# define _CRT_SECURE_NO_DEPRECATE 1 +#endif +#include <stdio.h> +#include <stdlib.h> +#ifdef _MSC_VER +# include <direct.h> +# include <process.h> +# include <io.h> +#else +# include <unistd.h> +# include <stdint.h> +# ifdef __CYGWIN__ +# include <io.h> +# endif +#endif +#include <malloc.h> +#include <stdarg.h> +#include <assert.h> +#include <string.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/stat.h> + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <<EOF +#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) +# define externally_visible volatile +#else +# define externally_visible __attribute__((externally_visible)) volatile +#endif +externally_visible const char * MAGIC_EXE = "$magic_exe"; +const char * LIB_PATH_VARNAME = "$shlibpath_var"; +EOF + + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + func_to_host_path "$temp_rpath" + cat <<EOF +const char * LIB_PATH_VALUE = "$func_to_host_path_result"; +EOF + else + cat <<"EOF" +const char * LIB_PATH_VALUE = ""; +EOF + fi + + if test -n "$dllsearchpath"; then + func_to_host_path "$dllsearchpath:" + cat <<EOF +const char * EXE_PATH_VARNAME = "PATH"; +const char * EXE_PATH_VALUE = "$func_to_host_path_result"; +EOF + else + cat <<"EOF" +const char * EXE_PATH_VARNAME = ""; +const char * EXE_PATH_VALUE = ""; +EOF + fi + + if test yes = "$fast_install"; then + cat <<EOF +const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ +EOF + else + cat <<EOF +const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ +EOF + fi + + + cat <<"EOF" + +#define LTWRAPPER_OPTION_PREFIX "--lt-" + +static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; +static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; +static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; + +int +main (int argc, char *argv[]) +{ + char **newargz; + int newargc; + char *tmp_pathspec; + char *actual_cwrapper_path; + char *actual_cwrapper_name; + char *target_name; + char *lt_argv_zero; + int rval = 127; + + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + newargz = XMALLOC (char *, (size_t) argc + 1); + + /* very simple arg parsing; don't want to rely on getopt + * also, copy all non cwrapper options to newargz, except + * argz[0], which is handled differently + */ + newargc=0; + for (i = 1; i < argc; i++) + { + if (STREQ (argv[i], dumpscript_opt)) + { +EOF + case $host in + *mingw* | *cygwin* ) + # make stdout use "unix" line endings + echo " setmode(1,_O_BINARY);" + ;; + esac + + cat <<"EOF" + lt_dump_script (stdout); + return 0; + } + if (STREQ (argv[i], debug_opt)) + { + lt_debug = 1; + continue; + } + if (STREQ (argv[i], ltwrapper_option_prefix)) + { + /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX + namespace, but it is not one of the ones we know about and + have already dealt with, above (inluding dump-script), then + report an error. Otherwise, targets might begin to believe + they are allowed to use options in the LTWRAPPER_OPTION_PREFIX + namespace. The first time any user complains about this, we'll + need to make LTWRAPPER_OPTION_PREFIX a configure-time option + or a configure.ac-settable value. + */ + lt_fatal (__FILE__, __LINE__, + "unrecognized %s option: '%s'", + ltwrapper_option_prefix, argv[i]); + } + /* otherwise ... */ + newargz[++newargc] = xstrdup (argv[i]); + } + newargz[++newargc] = NULL; + +EOF + cat <<EOF + /* The GNU banner must be the first non-error debug message */ + lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n"); +EOF + cat <<"EOF" + lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); + lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); + + tmp_pathspec = find_executable (argv[0]); + if (tmp_pathspec == NULL) + lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]); + lt_debugprintf (__FILE__, __LINE__, + "(main) found exe (before symlink chase) at: %s\n", + tmp_pathspec); + + actual_cwrapper_path = chase_symlinks (tmp_pathspec); + lt_debugprintf (__FILE__, __LINE__, + "(main) found exe (after symlink chase) at: %s\n", + actual_cwrapper_path); + XFREE (tmp_pathspec); + + actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path)); + strendzap (actual_cwrapper_path, actual_cwrapper_name); + + /* wrapper name transforms */ + strendzap (actual_cwrapper_name, ".exe"); + tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); + XFREE (actual_cwrapper_name); + actual_cwrapper_name = tmp_pathspec; + tmp_pathspec = 0; + + /* target_name transforms -- use actual target program name; might have lt- prefix */ + target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); + strendzap (target_name, ".exe"); + tmp_pathspec = lt_extend_str (target_name, ".exe", 1); + XFREE (target_name); + target_name = tmp_pathspec; + tmp_pathspec = 0; + + lt_debugprintf (__FILE__, __LINE__, + "(main) libtool target name: %s\n", + target_name); +EOF + + cat <<EOF + newargz[0] = + XMALLOC (char, (strlen (actual_cwrapper_path) + + strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); + strcpy (newargz[0], actual_cwrapper_path); + strcat (newargz[0], "$objdir"); + strcat (newargz[0], "/"); +EOF + + cat <<"EOF" + /* stop here, and copy so we don't have to do this twice */ + tmp_pathspec = xstrdup (newargz[0]); + + /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ + strcat (newargz[0], actual_cwrapper_name); + + /* DO want the lt- prefix here if it exists, so use target_name */ + lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); + XFREE (tmp_pathspec); + tmp_pathspec = NULL; +EOF + + case $host_os in + mingw*) + cat <<"EOF" + { + char* p; + while ((p = strchr (newargz[0], '\\')) != NULL) + { + *p = '/'; + } + while ((p = strchr (lt_argv_zero, '\\')) != NULL) + { + *p = '/'; + } + } +EOF + ;; + esac + + cat <<"EOF" + XFREE (target_name); + XFREE (actual_cwrapper_path); + XFREE (actual_cwrapper_name); + + lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ + lt_setenv ("DUALCASE", "1"); /* for MSK sh */ + /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must + be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath) + because on Windows, both *_VARNAMEs are PATH but uninstalled + libraries must come first. */ + lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); + lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); + + lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", + nonnull (lt_argv_zero)); + for (i = 0; i < newargc; i++) + { + lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", + i, nonnull (newargz[i])); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + newargz = prepare_spawn (newargz); + rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + lt_debugprintf (__FILE__, __LINE__, + "(main) failed to launch target \"%s\": %s\n", + lt_argv_zero, nonnull (strerror (errno))); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal (__FILE__, __LINE__, "memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined HAVE_DOS_BASED_FILE_SYSTEM + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + # -fuse-ld=* Linker select flags for GCC + # -static-* direct GCC to link specific libraries statically + # -fcilkplus Cilk Plus language extension features for C/C++ + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type '$version_type'" + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c <<EOF + int main() { return 0; } +EOF + $opt_dry_run || $RM conftest + if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then + ldd_output=`ldd conftest` + for i in $deplibs; do + case $i in + -l*) + func_stripname -l '' "$i" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $i "*) + func_append newdeplibs " $i" + i= + ;; + esac + fi + if test -n "$i"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then + func_append newdeplibs " $i" + else + droppeddeps=yes + echo + $ECHO "*** Warning: dynamic linker does not accept needed library $i." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which I believe you do not have" + echo "*** because a test_compile did reveal that the linker did not use it for" + echo "*** its dynamic dependency list that programs get resolved with at runtime." + fi + fi + ;; + *) + func_append newdeplibs " $i" + ;; + esac + done + else + # Error occurred in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. + for i in $deplibs; do + case $i in + -l*) + func_stripname -l '' "$i" + name=$func_stripname_result + $opt_dry_run || $RM conftest + if $LTCC $LTCFLAGS -o conftest conftest.c $i; then + ldd_output=`ldd conftest` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $i "*) + func_append newdeplibs " $i" + i= + ;; + esac + fi + if test -n "$i"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then + func_append newdeplibs " $i" + else + droppeddeps=yes + echo + $ECHO "*** Warning: dynamic linker does not accept needed library $i." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because a test_compile did reveal that the linker did not use this one" + echo "*** as a dynamic dependency that programs can get resolved with at runtime." + fi + fi + else + droppeddeps=yes + echo + $ECHO "*** Warning! Library $i is needed by this library but I was not able to" + echo "*** make it link in! You will probably need to install it or some" + echo "*** library that it depends on before this library will be fully" + echo "*** functional. Installing it before continuing would be even better." + fi + ;; + *) + func_append newdeplibs " $i" + ;; + esac + done + fi + ;; + file_magic*) + set dummy $deplibs_check_method; shift + file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + if test -n "$file_magic_glob"; then + libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` + else + libnameglob=$libname + fi + test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + if test yes = "$want_nocaseglob"; then + shopt -s nocaseglob + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD="/usr/bin/ld" + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# Commands used to build an old-style archive. +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$tool_oldlib" + +# A language specific compiler. +CC="g++" + +# Is the compiler the GNU compiler? +with_gcc=yes + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=no + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\$wl--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\$wl--whole-archive\$convenience \$wl--no-whole-archive" + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object="no" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build a shared archive. +archive_cmds="\$CC \$pic_flag -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \$wl-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$CC \$pic_flag -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \$wl-soname \$wl\$soname \$wl-retain-symbols-file \$wl\$export_symbols -o \$lib" + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds="" +module_expsym_cmds="" + +# Whether we are building with GNU ld or not. +with_gnu_ld="yes" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that enforces no undefined symbols. +no_undefined_flag="" + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist +hardcode_libdir_flag_spec="\$wl-rpath \$wl\$libdir" + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator="" + +# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=no + +# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting $shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=no + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=no + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=no + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=no + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=no + +# Set to "yes" if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds="" + +# Commands necessary for finishing linking programs. +postlink_cmds="" + +# Specify filename containing input files. +file_list_spec="" + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs="/usr/lib/gcc/x86_64-linux-gnu/9 /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /usr/lib/gcc/x86_64-linux-gnu/9/../../.." + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects="/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o" +postdep_objects="/usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o" +predeps="" +postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="-L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.." + +# ### END LIBTOOL TAG CONFIG: CXX diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/local.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/local.exp new file mode 100644 index 000000000000..4397bc48664a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/local.exp @@ -0,0 +1,2 @@ +set CC_FOR_TARGET "gcc" +set CXX_FOR_TARGET "g++" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/man/Makefile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/man/Makefile new file mode 100644 index 000000000000..85fb0826cf69 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/man/Makefile @@ -0,0 +1,562 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# man/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +target_triplet = x86_64-pc-linux-gnu +subdir = man +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man3dir = $(mandir)/man3 +am__installdirs = "$(DESTDIR)$(man3dir)" +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing aclocal-1.16 +ALLOCA = +AMTAR = $${TAR-tar} +AM_DEFAULT_VERBOSITY = 1 +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoconf +AUTOHEADER = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoheader +AUTOMAKE = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing automake-1.16 +AWK = mawk +CC = gcc +CCAS = gcc +CCASDEPMODE = depmode=none +CCASFLAGS = +CCDEPMODE = depmode=none +CFLAGS = -Wall -fexceptions +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXCPP = g++ -E +CXXDEPMODE = depmode=none +CXXFLAGS = -g -O2 +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +HAVE_LONG_DOUBLE_VARIANT = 0 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld +LDFLAGS = +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +MAINT = # +MAKEINFO = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OPT_LDFLAGS = -Wl,-O1 +OTOOL = +OTOOL64 = +PACKAGE = libffi +PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.3 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.3 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SECTION_LDFLAGS = +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_64 +TARGETDIR = x86 +TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo +VERSION = 3.3 +abs_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/man +abs_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man +abs_top_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux +abs_top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_CXX = g++ +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man +sys_symbol_underscore = no +sysconfdir = ${prefix}/etc +target = x86_64-pc-linux-gnu +target_alias = +target_cpu = x86_64 +target_os = linux-gnu +target_vendor = pc +toolexecdir = ${libdir}/gcc-lib/$(target_alias) +toolexeclibdir = ${libdir}/../lib +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign +EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 +man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign man/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man3: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man3dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.3[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ + done; } + +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man3dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man3 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-man + +uninstall-man: uninstall-man3 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man3 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-man \ + uninstall-man3 + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.deps/.dirstamp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.deps/.dirstamp new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.dirstamp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.dirstamp new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/closures.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/closures.o new file mode 100644 index 000000000000..8d7343f926d6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/closures.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/java_raw_api.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/java_raw_api.o new file mode 100644 index 000000000000..8551c74f9071 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/java_raw_api.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/prep_cif.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/prep_cif.o new file mode 100644 index 000000000000..cc618b1c9cfb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/prep_cif.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/raw_api.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/raw_api.o new file mode 100644 index 000000000000..640cb35dee13 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/raw_api.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/types.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/types.o new file mode 100644 index 000000000000..4cd4ea115c96 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/.libs/types.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/closures.lo b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/closures.lo new file mode 100644 index 000000000000..b0b3791b33e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/closures.lo @@ -0,0 +1,12 @@ +# src/closures.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/closures.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/java_raw_api.lo b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/java_raw_api.lo new file mode 100644 index 000000000000..2e586c353fe5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/java_raw_api.lo @@ -0,0 +1,12 @@ +# src/java_raw_api.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/java_raw_api.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/prep_cif.lo b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/prep_cif.lo new file mode 100644 index 000000000000..63b28afbfef6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/prep_cif.lo @@ -0,0 +1,12 @@ +# src/prep_cif.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/prep_cif.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/raw_api.lo b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/raw_api.lo new file mode 100644 index 000000000000..87ad90e61330 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/raw_api.lo @@ -0,0 +1,12 @@ +# src/raw_api.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/raw_api.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/types.lo b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/types.lo new file mode 100644 index 000000000000..a250ea419295 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/types.lo @@ -0,0 +1,12 @@ +# src/types.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/types.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.deps/.dirstamp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.deps/.dirstamp new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.dirstamp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.dirstamp new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/ffi64.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/ffi64.o new file mode 100644 index 000000000000..b3048706e1be Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/ffi64.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/ffiw64.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/ffiw64.o new file mode 100644 index 000000000000..04541c543696 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/ffiw64.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/unix64.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/unix64.o new file mode 100644 index 000000000000..1d78c2c3e0e7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/unix64.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/win64.o b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/win64.o new file mode 100644 index 000000000000..90502751f1ad Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/.libs/win64.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/ffi64.lo b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/ffi64.lo new file mode 100644 index 000000000000..ee74f81be674 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/ffi64.lo @@ -0,0 +1,12 @@ +# src/x86/ffi64.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/ffi64.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/ffiw64.lo b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/ffiw64.lo new file mode 100644 index 000000000000..fcf7290d629f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/ffiw64.lo @@ -0,0 +1,12 @@ +# src/x86/ffiw64.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/ffiw64.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/unix64.lo b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/unix64.lo new file mode 100644 index 000000000000..a19b90e0fb2e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/unix64.lo @@ -0,0 +1,12 @@ +# src/x86/unix64.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/unix64.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/win64.lo b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/win64.lo new file mode 100644 index 000000000000..b399a75a23b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/src/x86/win64.lo @@ -0,0 +1,12 @@ +# src/x86/win64.lo - a libtool object file +# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-14 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/win64.o' + +# Name of the non-PIC object +non_pic_object=none + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/stamp-h1 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/stamp-h1 new file mode 100644 index 000000000000..e43c201d6364 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/stamp-h1 @@ -0,0 +1 @@ +timestamp for fficonfig.h diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/testsuite/Makefile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/testsuite/Makefile new file mode 100644 index 000000000000..c2009f11a2e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/testsuite/Makefile @@ -0,0 +1,648 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# testsuite/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +VPATH = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/libffi +pkgincludedir = $(includedir)/libffi +pkglibdir = $(libdir)/libffi +pkglibexecdir = $(libexecdir)/libffi +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = x86_64-pc-linux-gnu +host_triplet = x86_64-pc-linux-gnu +target_triplet = x86_64-pc-linux-gnu +subdir = testsuite +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_configure_args.m4 \ + $(top_srcdir)/m4/ax_enable_builddir.m4 \ + $(top_srcdir)/m4/ax_gcc_archflag.m4 \ + $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/fficonfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +DEJATOOL = $(PACKAGE) +RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir +EXPECT = expect +RUNTEST = runtest +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing aclocal-1.16 +ALLOCA = +AMTAR = $${TAR-tar} +AM_DEFAULT_VERBOSITY = 1 +AM_LTLDFLAGS = +AM_RUNTESTFLAGS = +AR = ar +AUTOCONF = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoconf +AUTOHEADER = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing autoheader +AUTOMAKE = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing automake-1.16 +AWK = mawk +CC = gcc +CCAS = gcc +CCASDEPMODE = depmode=none +CCASFLAGS = +CCDEPMODE = depmode=none +CFLAGS = -Wall -fexceptions +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXCPP = g++ -E +CXXDEPMODE = depmode=none +CXXFLAGS = -g -O2 +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DLLTOOL = false +DSYMUTIL = +DUMPBIN = +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +FFI_EXEC_TRAMPOLINE_TABLE = 0 +FGREP = /usr/bin/grep -F +GREP = /usr/bin/grep +HAVE_LONG_DOUBLE = 1 +HAVE_LONG_DOUBLE_VARIANT = 0 +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LD = /usr/bin/ld +LDFLAGS = +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIPO = +LN_S = ln -s +LTLIBOBJS = +LT_SYS_LIBRARY_PATH = +MAINT = # +MAKEINFO = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/missing makeinfo +MANIFEST_TOOL = : +MKDIR_P = /usr/bin/mkdir -p +NM = /usr/bin/nm -B +NMEDIT = +OBJDUMP = objdump +OBJEXT = o +OPT_LDFLAGS = -Wl,-O1 +OTOOL = +OTOOL64 = +PACKAGE = libffi +PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues +PACKAGE_NAME = libffi +PACKAGE_STRING = libffi 3.3 +PACKAGE_TARNAME = libffi +PACKAGE_URL = +PACKAGE_VERSION = 3.3 +PATH_SEPARATOR = : +PRTDIAG = +RANLIB = ranlib +SECTION_LDFLAGS = +SED = /usr/bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +TARGET = X86_64 +TARGETDIR = x86 +TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo +VERSION = 3.3 +abs_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux/testsuite +abs_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite +abs_top_builddir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi-x86_64-linux +abs_top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +ac_ct_AR = ar +ac_ct_CC = gcc +ac_ct_CXX = g++ +ac_ct_DUMPBIN = +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +ax_enable_builddir_sed = sed +bindir = ${exec_prefix}/bin +build = x86_64-pc-linux-gnu +build_alias = +build_cpu = x86_64 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = x86_64-pc-linux-gnu +host_alias = +host_cpu = x86_64 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +runstatedir = ${localstatedir}/run +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite +sys_symbol_underscore = no +sysconfdir = ${prefix}/etc +target = x86_64-pc-linux-gnu +target_alias = +target_cpu = x86_64 +target_os = linux-gnu +target_vendor = pc +toolexecdir = ${libdir}/gcc-lib/$(target_alias) +toolexeclibdir = ${libdir}/../lib +top_build_prefix = ../ +top_builddir = .. +top_srcdir = /src/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi +AUTOMAKE_OPTIONS = foreign dejagnu +EXTRA_DEJAGNU_SITE_CONFIG = ../local.exp +CLEANFILES = *.exe core* *.log *.sum +EXTRA_DIST = lib/target-libpath.exp lib/libffi.exp lib/wrapper.exp \ +libffi.call/strlen4.c libffi.call/struct10.c libffi.call/many_mixed.c \ +libffi.call/float.c libffi.call/struct5.c libffi.call/return_fl3.c \ +libffi.call/return_fl1.c libffi.call/call.exp libffi.call/pyobjc-tc.c \ +libffi.call/float_va.c libffi.call/struct8.c libffi.call/pr1172638.c \ +libffi.call/return_sc.c libffi.call/va_struct1.c \ +libffi.call/align_stdcall.c libffi.call/struct9.c libffi.call/va_1.c \ +libffi.call/va_struct2.c libffi.call/return_fl2.c \ +libffi.call/align_mixed.c libffi.call/ffitest.h libffi.call/struct4.c \ +libffi.call/return_ldl.c libffi.call/float3.c libffi.call/return_sl.c \ +libffi.call/return_dbl1.c libffi.call/err_bad_typedef.c \ +libffi.call/return_ll1.c libffi.call/return_dbl2.c \ +libffi.call/negint.c libffi.closures/nested_struct3.c \ +libffi.call/struct2.c libffi.call/struct3.c libffi.call/return_fl.c \ +libffi.call/offsets.c libffi.call/struct7.c libffi.call/va_struct3.c \ +libffi.call/float1.c libffi.call/uninitialized.c libffi.call/many2.c \ +libffi.call/struct6.c libffi.call/strlen2.c libffi.call/float2.c \ +libffi.call/return_ul.c libffi.call/struct1.c libffi.call/strlen3.c \ +libffi.call/return_dbl.c libffi.call/float4.c libffi.call/many.c \ +libffi.call/strlen.c libffi.call/return_uc.c libffi.call/many_double.c \ +libffi.call/return_ll.c libffi.call/promotion.c \ +libffi.complex/complex_defs_longdouble.inc \ +libffi.complex/cls_align_complex_float.c \ +libffi.complex/cls_complex_va_float.c \ +libffi.complex/cls_complex_struct_float.c \ +libffi.complex/return_complex2_longdouble.c \ +libffi.complex/cls_complex_float.c \ +libffi.complex/return_complex_longdouble.c \ +libffi.complex/return_complex2_float.c libffi.complex/cls_complex.inc \ +libffi.complex/cls_complex_va_longdouble.c \ +libffi.complex/return_complex_double.c \ +libffi.complex/return_complex.inc libffi.complex/many_complex.inc \ +libffi.complex/complex_float.c libffi.complex/cls_align_complex.inc \ +libffi.complex/return_complex2_double.c \ +libffi.complex/many_complex_float.c libffi.complex/ffitest.h \ +libffi.complex/return_complex1_double.c \ +libffi.complex/cls_complex_struct_longdouble.c \ +libffi.complex/complex_defs_double.inc \ +libffi.complex/cls_complex_va_double.c \ +libffi.complex/many_complex_double.c \ +libffi.complex/return_complex2.inc \ +libffi.complex/return_complex1_float.c \ +libffi.complex/complex_longdouble.c \ +libffi.complex/complex_defs_float.inc \ +libffi.complex/cls_complex_double.c \ +libffi.complex/cls_align_complex_double.c \ +libffi.complex/cls_align_complex_longdouble.c \ +libffi.complex/complex_double.c libffi.complex/cls_complex_va.inc \ +libffi.complex/many_complex_longdouble.c libffi.complex/complex.inc \ +libffi.complex/return_complex1_longdouble.c \ +libffi.complex/complex_int.c libffi.complex/cls_complex_longdouble.c \ +libffi.complex/cls_complex_struct_double.c \ +libffi.complex/return_complex1.inc libffi.complex/complex.exp \ +libffi.complex/cls_complex_struct.inc \ +libffi.complex/return_complex_float.c libffi.go/closure1.c \ +libffi.go/aa-direct.c libffi.go/ffitest.h libffi.go/go.exp \ +libffi.go/static-chain.h libffi.bhaible/bhaible.exp \ +libffi.bhaible/test-call.c libffi.bhaible/alignof.h \ +libffi.bhaible/testcases.c libffi.bhaible/test-callback.c \ +libffi.bhaible/Makefile libffi.bhaible/README config/default.exp \ +libffi.closures/cls_multi_sshort.c \ +libffi.closures/cls_align_longdouble_split2.c \ +libffi.closures/cls_1_1byte.c libffi.closures/cls_uint_va.c \ +libffi.closures/cls_3_1byte.c libffi.closures/cls_many_mixed_args.c \ +libffi.closures/cls_20byte1.c libffi.closures/cls_pointer_stack.c \ +libffi.closures/cls_align_float.c libffi.closures/cls_5_1_byte.c \ +libffi.closures/cls_9byte1.c libffi.closures/cls_align_uint32.c \ +libffi.closures/stret_medium.c libffi.closures/cls_3byte1.c \ +libffi.closures/cls_align_uint64.c libffi.closures/cls_longdouble_va.c \ +libffi.closures/cls_align_pointer.c libffi.closures/cls_19byte.c \ +libffi.closures/cls_ushort.c libffi.closures/cls_align_sint32.c \ +libffi.closures/cls_ulonglong.c libffi.closures/cls_struct_va1.c \ +libffi.closures/cls_9byte2.c libffi.closures/closure_fn5.c \ +libffi.closures/cls_5byte.c libffi.closures/cls_3float.c \ +libffi.closures/closure.exp libffi.closures/cls_schar.c \ +libffi.closures/closure_fn4.c libffi.closures/cls_uchar_va.c \ +libffi.closures/closure_fn0.c libffi.closures/huge_struct.c \ +libffi.closures/cls_ushort_va.c \ +libffi.closures/cls_64byte.c libffi.closures/cls_longdouble.c \ +libffi.closures/cls_ulong_va.c libffi.closures/cls_6_1_byte.c \ +libffi.closures/cls_align_uint16.c libffi.closures/closure_fn2.c \ +libffi.closures/unwindtest_ffi_call.cc \ +libffi.closures/cls_multi_ushortchar.c libffi.closures/cls_8byte.c \ +libffi.closures/ffitest.h libffi.closures/nested_struct8.c \ +libffi.closures/cls_pointer.c libffi.closures/nested_struct2.c \ +libffi.closures/nested_struct.c libffi.closures/cls_multi_schar.c \ +libffi.closures/cls_align_longdouble_split.c \ +libffi.closures/cls_uchar.c libffi.closures/nested_struct9.c \ +libffi.closures/cls_float.c libffi.closures/stret_medium2.c \ +libffi.closures/closure_loc_fn0.c libffi.closures/cls_6byte.c \ +libffi.closures/closure_simple.c libffi.closures/cls_align_double.c \ +libffi.closures/cls_multi_uchar.c libffi.closures/cls_4_1byte.c \ +libffi.closures/closure_fn3.c libffi.closures/cls_align_sint64.c \ +libffi.closures/nested_struct1.c libffi.closures/unwindtest.cc \ +libffi.closures/nested_struct5.c libffi.closures/cls_multi_ushort.c \ +libffi.closures/nested_struct11.c \ +libffi.closures/cls_multi_sshortchar.c \ +libffi.closures/cls_align_longdouble.c \ +libffi.closures/cls_dbls_struct.c \ +libffi.closures/cls_many_mixed_float_double.c \ +libffi.closures/stret_large.c libffi.closures/stret_large2.c \ +libffi.closures/cls_align_sint16.c libffi.closures/cls_2byte.c \ +libffi.closures/nested_struct4.c libffi.closures/problem1.c \ +libffi.closures/testclosure.c libffi.closures/nested_struct6.c \ +libffi.closures/cls_4byte.c libffi.closures/cls_24byte.c \ +libffi.closures/nested_struct10.c libffi.closures/cls_uint.c \ +libffi.closures/cls_12byte.c libffi.closures/cls_sint.c \ +libffi.closures/cls_7_1_byte.c libffi.closures/cls_sshort.c \ +libffi.closures/cls_16byte.c libffi.closures/nested_struct7.c \ +libffi.closures/cls_double_va.c libffi.closures/cls_3byte2.c \ +libffi.closures/cls_double.c libffi.closures/cls_7byte.c \ +libffi.closures/closure_fn6.c libffi.closures/closure_fn1.c \ +libffi.closures/cls_20byte.c libffi.closures/cls_18byte.c \ +libffi.closures/err_bad_abi.c + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign testsuite/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: # $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): # $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +check-DEJAGNU: site.exp + srcdir='$(srcdir)'; export srcdir; \ + EXPECT=$(EXPECT); export EXPECT; \ + if $(SHELL) -c "$(RUNTEST) --version" > /dev/null 2>&1; then \ + exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \ + if $(RUNTEST) $(RUNTESTDEFAULTFLAGS) $(AM_RUNTESTFLAGS) $(RUNTESTFLAGS); \ + then :; else exit_status=1; fi; \ + done; \ + else echo "WARNING: could not find '$(RUNTEST)'" 1>&2; :;\ + fi; \ + exit $$exit_status +site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG) + @echo 'Making a new site.exp file ...' + @echo '## these variables are automatically generated by make ##' >site.tmp + @echo '# Do not edit here. If you wish to override these values' >>site.tmp + @echo '# edit the last section' >>site.tmp + @echo 'set srcdir "$(srcdir)"' >>site.tmp + @echo "set objdir `pwd`" >>site.tmp + @echo 'set build_alias "$(build_alias)"' >>site.tmp + @echo 'set build_triplet $(build_triplet)' >>site.tmp + @echo 'set host_alias "$(host_alias)"' >>site.tmp + @echo 'set host_triplet $(host_triplet)' >>site.tmp + @echo 'set target_alias "$(target_alias)"' >>site.tmp + @echo 'set target_triplet $(target_triplet)' >>site.tmp + @list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \ + echo "## Begin content included from file $$f. Do not modify. ##" \ + && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \ + && echo "## End content included from file $$f. ##" \ + || exit 1; \ + done >> site.tmp + @echo "## End of auto-generated content; you can edit from here. ##" >> site.tmp + @if test -f site.exp; then \ + sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> site.tmp; \ + fi + @-rm -f site.bak + @test ! -f site.exp || mv site.exp site.bak + @mv site.tmp site.exp + +distclean-DEJAGNU: + -rm -f site.exp site.bak + -l='$(DEJATOOL)'; for tool in $$l; do \ + rm -f $$tool.sum $$tool.log; \ + done + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-DEJAGNU distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \ + clean-libtool cscopelist-am ctags-am distclean \ + distclean-DEJAGNU distclean-generic distclean-libtool distdir \ + dvi dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.bsd.mk b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.bsd.mk new file mode 100644 index 000000000000..ab66256ef090 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.bsd.mk @@ -0,0 +1,40 @@ +# -*- makefile -*- +# +# Makefile for BSD systems +# + +LOCAL_LIBS += ${LIBFFI} -lpthread + +LIBFFI_CFLAGS = ${FFI_MMAP_EXEC} -pthread +LIBFFI_BUILD_DIR = ${.CURDIR}/libffi-${arch} +INCFLAGS := -I${LIBFFI_BUILD_DIR}/include -I${INCFLAGS} + +.if ${srcdir} == "." + LIBFFI_SRC_DIR := ${.CURDIR}/libffi +.else + LIBFFI_SRC_DIR := ${srcdir}/libffi +.endif + + +LIBFFI = ${LIBFFI_BUILD_DIR}/.libs/libffi_convenience.a +LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh +LIBFFI_CONFIGURE = ${LIBFFI_SRC_DIR}/configure --disable-static \ + --with-pic=yes --disable-dependency-tracking --disable-docs + +$(OBJS): ${LIBFFI} + +$(LIBFFI): + @mkdir -p ${LIBFFI_BUILD_DIR} + @if [ ! -f $(LIBFFI_SRC_DIR)/configure ]; then \ + echo "Running autoreconf for libffi"; \ + cd "$(LIBFFI_SRC_DIR)" && \ + /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ + fi + @if [ ! -f ${LIBFFI_BUILD_DIR}/Makefile ]; then \ + echo "Configuring libffi"; \ + cd ${LIBFFI_BUILD_DIR} && \ + /usr/bin/env CC="${CC}" LD="${LD}" CFLAGS="${LIBFFI_CFLAGS}" GREP_OPTIONS="" \ + /bin/sh ${LIBFFI_CONFIGURE} ${LIBFFI_HOST} > /dev/null; \ + fi + @cd ${LIBFFI_BUILD_DIR} && ${MAKE} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.darwin.mk b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.darwin.mk new file mode 100644 index 000000000000..893a8e17aef9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.darwin.mk @@ -0,0 +1,105 @@ +# -*- makefile -*- + +include ${srcdir}/libffi.gnu.mk + +CCACHE := $(shell type -p ccache) +BUILD_DIR := $(shell pwd) + +INCFLAGS += -I"$(BUILD_DIR)" + +# Work out which arches we need to compile the lib for +ARCHES := +ARCHFLAGS ?= $(filter -arch %, $(CFLAGS)) + +ifneq ($(findstring -arch ppc,$(ARCHFLAGS)),) + ARCHES += ppc +endif + +ifneq ($(findstring -arch i386,$(ARCHFLAGS)),) + ARCHES += i386 +endif + +ifneq ($(findstring -arch x86_64,$(ARCHFLAGS)),) + ARCHES += x86_64 +endif + +ifeq ($(strip $(ARCHES)),) +LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch) +# Just build the one (default) architecture +$(LIBFFI): + @mkdir -p "$(LIBFFI_BUILD_DIR)" "$(@D)" + @if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \ + echo "Running autoreconf for libffi"; \ + cd "$(LIBFFI_SRC_DIR)" && \ + /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ + fi + @if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \ + echo "Configuring libffi"; \ + cd "$(LIBFFI_BUILD_DIR)" && \ + /usr/bin/env CC="$(CC)" LD="$(LD)" CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \ + /bin/sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \ + fi + cd "$(LIBFFI_BUILD_DIR)" && $(MAKE) + +else +LIBTARGETS = $(foreach arch,$(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a) + +# Build a fat binary and assemble +build_ffi = \ + mkdir -p "$(BUILD_DIR)"/libffi-$(1); \ + (if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \ + echo "Running autoreconf for libffi"; \ + cd "$(LIBFFI_SRC_DIR)" && \ + /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ + fi); \ + (if [ ! -f "$(BUILD_DIR)"/libffi-$(1)/Makefile ]; then \ + echo "Configuring libffi for $(1)"; \ + cd "$(BUILD_DIR)"/libffi-$(1) && \ + env CC="$(CCACHE) $(CC)" CFLAGS="-arch $(1) $(LIBFFI_CFLAGS)" LDFLAGS="-arch $(1)" \ + $(LIBFFI_CONFIGURE) --host=$(1)-apple-darwin > /dev/null; \ + fi); \ + $(MAKE) -C "$(BUILD_DIR)"/libffi-$(1) + +target_ffi = "$(BUILD_DIR)"/libffi-$(1)/.libs/libffi_convenience.a:; $(call build_ffi,$(1)) + +# Work out which arches we need to compile the lib for +ifneq ($(findstring ppc,$(ARCHES)),) + $(call target_ffi,ppc) +endif + +ifneq ($(findstring i386,$(ARCHES)),) + $(call target_ffi,i386) +endif + +ifneq ($(findstring x86_64,$(ARCHES)),) + $(call target_ffi,x86_64) +endif + + +$(LIBFFI): $(LIBTARGETS) + # Assemble into a FAT (x86_64, i386, ppc) library + @mkdir -p "$(@D)" + /usr/bin/libtool -static -o $@ \ + $(foreach arch, $(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a) + @mkdir -p "$(LIBFFI_BUILD_DIR)"/include + $(RM) "$(LIBFFI_BUILD_DIR)"/include/ffi.h + @( \ + printf "#if defined(__i386__)\n"; \ + printf "#include \"libffi-i386/include/ffi.h\"\n"; \ + printf "#elif defined(__x86_64__)\n"; \ + printf "#include \"libffi-x86_64/include/ffi.h\"\n";\ + printf "#elif defined(__ppc__)\n"; \ + printf "#include \"libffi-ppc/include/ffi.h\"\n";\ + printf "#endif\n";\ + ) > "$(LIBFFI_BUILD_DIR)"/include/ffi.h + @( \ + printf "#if defined(__i386__)\n"; \ + printf "#include \"libffi-i386/include/ffitarget.h\"\n"; \ + printf "#elif defined(__x86_64__)\n"; \ + printf "#include \"libffi-x86_64/include/ffitarget.h\"\n";\ + printf "#elif defined(__ppc__)\n"; \ + printf "#include \"libffi-ppc/include/ffitarget.h\"\n";\ + printf "#endif\n";\ + ) > "$(LIBFFI_BUILD_DIR)"/include/ffitarget.h + +endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.gnu.mk b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.gnu.mk new file mode 100644 index 000000000000..473b8fb9d6ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.gnu.mk @@ -0,0 +1,32 @@ +# -*- makefile -*- +# +# Common definitions for all systems that use GNU make +# + + +# Tack the extra deps onto the autogenerated variables +LOCAL_LIBS += $(LIBFFI) +BUILD_DIR = $(shell pwd) +LIBFFI_CFLAGS = $(FFI_MMAP_EXEC) +LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch) +INCFLAGS := -I"$(LIBFFI_BUILD_DIR)"/include $(INCFLAGS) + +ifeq ($(srcdir),.) + LIBFFI_SRC_DIR := $(shell pwd)/libffi +else ifeq ($(srcdir),..) + LIBFFI_SRC_DIR := $(shell pwd)/../libffi +else + LIBFFI_SRC_DIR := $(realpath $(srcdir)/libffi) +endif + +LIBFFI = "$(LIBFFI_BUILD_DIR)"/.libs/libffi_convenience.a +LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh +LIBFFI_CONFIGURE = "$(LIBFFI_SRC_DIR)"/configure --disable-static \ + --with-pic=yes --disable-dependency-tracking --disable-docs + +$(OBJS): $(LIBFFI) + +# +# libffi.mk or libffi.darwin.mk contains rules for building the actual library +# + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.mk b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.mk new file mode 100644 index 000000000000..3b58227b567a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.mk @@ -0,0 +1,18 @@ +# -*- makefile -*- + +include ${srcdir}/libffi.gnu.mk + +$(LIBFFI): + @mkdir -p "$(LIBFFI_BUILD_DIR)" "$@(D)" + @if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \ + echo "Running autoreconf for libffi"; \ + cd "$(LIBFFI_SRC_DIR)" && \ + /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ + fi + @if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \ + echo "Configuring libffi"; \ + cd "$(LIBFFI_BUILD_DIR)" && \ + env CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \ + sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \ + fi + $(MAKE) -C "$(LIBFFI_BUILD_DIR)" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.vc.mk b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.vc.mk new file mode 100644 index 000000000000..8cd460351787 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.vc.mk @@ -0,0 +1,26 @@ +# -*- makefile -*- +# +# Makefile for msvc +# + +# Tack the extra deps onto the autogenerated variables +INCFLAGS = -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 $(INCFLAGS) +LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI) +BUILD_DIR = $(MAKEDIR) +LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi + +!IF "$(srcdir)" == "." +LIBFFI_SRC_DIR = $(MAKEDIR)/libffi +!ELSE +LIBFFI_SRC_DIR = $(srcdir)/libffi +!ENDIF + +LIBFFI = $(LIBFFI_BUILD_DIR)/.libs/libffi_convenience.lib + +$(OBJS): $(LIBFFI) + +$(LIBFFI): + @$(MAKEDIRS) $(LIBFFI_BUILD_DIR) + @cd $(LIBFFI_BUILD_DIR) && $(MAKE) -f Makefile.vc + + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.vc64.mk b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.vc64.mk new file mode 100644 index 000000000000..6f3dbbc8493f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi.vc64.mk @@ -0,0 +1,26 @@ +# -*- makefile -*- +# +# Makefile for msvc +# + +# Tack the extra deps onto the autogenerated variables +INCFLAGS = -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 $(INCFLAGS) +LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI) +BUILD_DIR = $(MAKEDIR) +LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi + +!IF "$(srcdir)" == "." +LIBFFI_SRC_DIR = $(MAKEDIR)/libffi +!ELSE +LIBFFI_SRC_DIR = $(srcdir)/libffi +!ENDIF + +LIBFFI = $(LIBFFI_BUILD_DIR)/.libs/libffi_convenience.lib + +$(OBJS): $(LIBFFI) + +$(LIBFFI): + @$(MAKEDIRS) $(LIBFFI_BUILD_DIR) + @cd $(LIBFFI_BUILD_DIR) && $(MAKE) -f Makefile.vc64 + + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.appveyor.yml b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.appveyor.yml new file mode 100644 index 000000000000..ece8a948c9c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.appveyor.yml @@ -0,0 +1,66 @@ +shallow_clone: true + +# We're currently only testing libffi built with Microsoft's +# tools. +# This matrix should be expanded to include at least: +# 32- and 64-bit gcc/cygwin +# 32- and 64-bit gcc/mingw +# 32- and 64-bit clang/mingw +# and perhaps more. + +image: Visual Studio 2017 +platform: + - x64 + - x86 + - arm + - arm64 + +environment: + global: + CYG_ROOT: C:/cygwin + CYG_CACHE: C:/cygwin/var/cache/setup + CYG_MIRROR: http://mirrors.kernel.org/sourceware/cygwin/ + matrix: + - VSVER: 15 + +install: + - ps: >- + If ($env:Platform -Match "x86") { + $env:VCVARS_PLATFORM="x86" + $env:BUILD="i686-pc-cygwin" + $env:HOST="i686-pc-cygwin" + $env:MSVCC="/cygdrive/c/projects/libffi/msvcc.sh" + $env:SRC_ARCHITECTURE="x86" + } ElseIf ($env:Platform -Match "arm64") { + $env:VCVARS_PLATFORM="x86_arm64" + $env:BUILD="i686-pc-cygwin" + $env:HOST="aarch64-w64-cygwin" + $env:MSVCC="/cygdrive/c/projects/libffi/msvcc.sh -marm64" + $env:SRC_ARCHITECTURE="aarch64" + } ElseIf ($env:Platform -Match "arm") { + $env:VCVARS_PLATFORM="x86_arm" + $env:BUILD="i686-pc-cygwin" + $env:HOST="arm-w32-cygwin" + $env:MSVCC="/cygdrive/c/projects/libffi/msvcc.sh -marm" + $env:SRC_ARCHITECTURE="arm" + } Else { + $env:VCVARS_PLATFORM="amd64" + $env:BUILD="x86_64-w64-cygwin" + $env:HOST="x86_64-w64-cygwin" + $env:MSVCC="/cygdrive/c/projects/libffi/msvcc.sh -m64" + $env:SRC_ARCHITECTURE="x86" + } + - 'appveyor DownloadFile https://cygwin.com/setup-x86.exe -FileName setup.exe' + - 'setup.exe -qnNdO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_CACHE%" -P dejagnu >NUL' + - '%CYG_ROOT%/bin/bash -lc "cygcheck -dc cygwin"' + - echo call VsDevCmd to set VS150COMNTOOLS + - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat" + - ps: $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:VSVER" + "0COMNTOOLS")) + - echo "Using Visual Studio %VSVER%.0 at %VSCOMNTOOLS%" + - call "%VSCOMNTOOLS%..\..\vc\Auxiliary\Build\vcvarsall.bat" %VCVARS_PLATFORM% + +build_script: + - c:\cygwin\bin\sh -lc "(cd $OLDPWD; ./autogen.sh;)" + - c:\cygwin\bin\sh -lc "(cd $OLDPWD; ./configure CC='%MSVCC%' CXX='%MSVCC%' LD='link' CPP='cl -nologo -EP' CXXCPP='cl -nologo -EP' CPPFLAGS='-DFFI_BUILDING_DLL' AR='/cygdrive/c/projects/libffi/.travis/ar-lib lib' NM='dumpbin -symbols' STRIP=':' --build=$BUILD --host=$HOST;)" + - c:\cygwin\bin\sh -lc "(cd $OLDPWD; cp src/%SRC_ARCHITECTURE%/ffitarget.h include; make; find .;)" + - c:\cygwin\bin\sh -lc "(cd $OLDPWD; cp `find . -name 'libffi-?.dll'` $HOST/testsuite/; make check; cat `find ./ -name libffi.log`)" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.gitattributes b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.gitattributes new file mode 100644 index 000000000000..f7d3833e7867 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.gitattributes @@ -0,0 +1,4 @@ +* text=auto + +*.sln text eol=crlf +*.vcxproj* text eol=crlf diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.github/issue_template.md b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.github/issue_template.md new file mode 100644 index 000000000000..e197e2cea7bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.github/issue_template.md @@ -0,0 +1,10 @@ +## System Details + +<!--- What platform are you working with? eg. the output of config.guess --> +<!--- Provide any toolchain details here. eg. compiler version --> + +## Problems Description + +<!--- Provide a description of the problem here --> +<!--- If this is a configure-time problem, attach config.log --> +<!--- If this is a testsuite problem, attach the relevant log output --> diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.gitignore b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.gitignore new file mode 100644 index 000000000000..5d3968946eaf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.gitignore @@ -0,0 +1,38 @@ +.libs +.deps +*.o +*.lo +.dirstamp +*.la +Makefile +!testsuite/libffi.bhaible/Makefile +Makefile.in +aclocal.m4 +compile +!.travis/compile +configure +depcomp +doc/libffi.info +*~ +fficonfig.h.in +fficonfig.h +include/ffi.h +include/ffitarget.h +install-sh +libffi.pc +libtool +libtool-ldflags +ltmain.sh +m4/libtool.m4 +m4/lt*.m4 +mdate-sh +missing +stamp-h1 +libffi*gz +autom4te.cache +libffi.xcodeproj/xcuserdata +libffi.xcodeproj/project.xcworkspace +build_*/ +darwin_*/ +src/arm/trampoline.S +**/texinfo.tex diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis.yml new file mode 100644 index 000000000000..8db2ddfb24d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis.yml @@ -0,0 +1,83 @@ +--- +sudo: required + +language: cpp + +# For qemu-powered targets, get the list of supported processors from +# travis by setting QEMU_CPU=help, then set -mcpu= for the compilers +# accordingly. + +matrix: + include: + - os: linux + env: HOST=powerpc-eabisim RUNTESTFLAGS="--target_board powerpc-eabisim" DEJAGNU="/opt/.travis/site.exp" + - os: linux + env: HOST=or1k-elf RUNTESTFLAGS="--target_board or1k-sim" DEJAGNU="/opt/.travis/site.exp" + - os: linux + env: HOST=m32r-elf RUNTESTFLAGS="--target_board m32r-sim" DEJAGNU="/opt/.travis/site.exp" + - os: linux + env: HOST=bfin-elf RUNTESTFLAGS="--target_board bfin-sim" DEJAGNU="/opt/.travis/site.exp" +# This configuration is still using the native x86 toolchain? +# - os: osx +# env: HOST=aarch64-apple-darwin13 + - os: osx + env: HOST=x86_64-apple-darwin10 + - os: linux + env: HOST=x86_64-w64-mingw32 MEVAL='export CC="x86_64-w64-mingw32-gcc" && CXX="x86_64-w64-mingw32-g++" RUNTESTFLAGS="--target_board wine-sim" DEJAGNU="$TRAVIS_BUILD_DIR/.travis/site.exp" CONFIGURE_OPTIONS=--disable-shared LIBFFI_TEST_OPTIMIZATION="-O2" + - os: linux + env: HOST=sh4-linux-gnu CONFIGURE_OPTIONS=--disable-shared QEMU_LD_PREFIX=/usr/sh4-linux-gnu + - os: linux + env: HOST=alpha-linux-gnu CONFIGURE_OPTIONS=--disable-shared QEMU_LD_PREFIX=/usr/alpha-linux-gnu + - os: linux + env: HOST=m68k-linux-gnu MEVAL='export CC="m68k-linux-gnu-gcc-8 -mcpu=547x" && CXX="m68k-linux-gnu-g++-8 -mcpu=547x"' CONFIGURE_OPTIONS=--disable-shared QEMU_LD_PREFIX=/usr/m68k-linux-gnu QEMU_CPU=cfv4e + - os: linux + arch: s390x + env: HOST=s390x-linux-gnu + - os: linux + arch: ppc64le + env: HOST=ppc64le-linux-gnu + - os: linux + arch: arm64 + env: HOST=aarch64-linux-gnu + - os: linux + arch: arm64 + env: HOST=aarch64-linux-gnu + compiler: clang + - os: linux + env: HOST=arm32v7-linux-gnu LIBFFI_TEST_OPTIMIZATION="-O0" + - os: linux + env: HOST=arm32v7-linux-gnu LIBFFI_TEST_OPTIMIZATION="-O2" + - os: linux + env: HOST=arm32v7-linux-gnu LIBFFI_TEST_OPTIMIZATION="-O2 -fomit-frame-pointer" +# The sparc64 linux system in the GCC compile farm is non-responsive. +# - os: linux +# env: HOST=sparc64-linux-gnu +# The mips64 linux system in the GCC compile farm is not allowing logins +# - os: linux +# env: HOST=mips64el-linux-gnu + - os: linux + compiler: gcc + env: HOST=i386-pc-linux-gnu MEVAL='export CC="$CC -m32" && CXX="$CXX -m32"' + - os: linux + compiler: gcc + - os: linux + compiler: gcc + env: CONFIGURE_OPTIONS=--disable-shared + - os: linux + compiler: clang + - os: linux + compiler: clang + env: CONFIGURE_OPTIONS=--disable-shared + - os: linux + env: HOST=moxie-elf MEVAL='export PATH=/opt/moxielogic/bin:$PATH && CC=moxie-elf-gcc && CXX=moxie-elf-g++' LDFLAGS=-Tsim.ld RUNTESTFLAGS="--target_board moxie-sim" DEJAGNU="$TRAVIS_BUILD_DIR/.travis/site.exp" + +before_install: + - if test x"$MEVAL" != x; then eval ${MEVAL}; fi + +install: + - travis_wait 30 ./.travis/install.sh + +script: + - if ! test x"$MEVAL" = x; then eval ${MEVAL}; fi + - travis_wait 115 sleep infinity & + - ./.travis/build.sh diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/ar-lib b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/ar-lib new file mode 100644 index 000000000000..0baa4f607608 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2018 Free Software Foundation, Inc. +# Written by Peter Rosin <peda@lysator.liu.se>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <<EOF +Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...] + +Members may be specified in a file named with @FILE. +EOF + exit $? + ;; + -v | --v*) + echo "$me, version $scriptversion" + exit $? + ;; +esac + +if test $# -lt 3; then + func_error "you must specify a program, an action and an archive" +fi + +AR=$1 +shift +while : +do + if test $# -lt 2; then + func_error "you must specify a program, an action and an archive" + fi + case $1 in + -lib | -LIB \ + | -ltcg | -LTCG \ + | -machine* | -MACHINE* \ + | -subsystem* | -SUBSYSTEM* \ + | -verbose | -VERBOSE \ + | -wx* | -WX* ) + AR="$AR $1" + shift + ;; + *) + action=$1 + shift + break + ;; + esac +done +orig_archive=$1 +shift +func_file_conv "$orig_archive" +archive=$file + +# strip leading dash in $action +action=${action#-} + +delete= +extract= +list= +quick= +replace= +index= +create= + +while test -n "$action" +do + case $action in + d*) delete=yes ;; + x*) extract=yes ;; + t*) list=yes ;; + q*) quick=yes ;; + r*) replace=yes ;; + s*) index=yes ;; + S*) ;; # the index is always updated implicitly + c*) create=yes ;; + u*) ;; # TODO: don't ignore the update modifier + v*) ;; # TODO: don't ignore the verbose modifier + *) + func_error "unknown action specified" + ;; + esac + action=${action#?} +done + +case $delete$extract$list$quick$replace,$index in + yes,* | ,yes) + ;; + yesyes*) + func_error "more than one action specified" + ;; + *) + func_error "no action specified" + ;; +esac + +if test -n "$delete"; then + if test ! -f "$orig_archive"; then + func_error "archive not found" + fi + for member + do + case $1 in + @*) + func_at_file "${1#@}" -REMOVE "$archive" + ;; + *) + func_file_conv "$1" + $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $? + ;; + esac + done + +elif test -n "$extract"; then + if test ! -f "$orig_archive"; then + func_error "archive not found" + fi + if test $# -gt 0; then + for member + do + case $1 in + @*) + func_at_file "${1#@}" -EXTRACT "$archive" + ;; + *) + func_file_conv "$1" + $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $? + ;; + esac + done + else + $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member + do + $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $? + done + fi + +elif test -n "$quick$replace"; then + if test ! -f "$orig_archive"; then + if test -z "$create"; then + echo "$me: creating $orig_archive" + fi + orig_archive= + else + orig_archive=$archive + fi + + for member + do + case $1 in + @*) + func_file_conv "${1#@}" + set x "$@" "@$file" + ;; + *) + func_file_conv "$1" + set x "$@" "$file" + ;; + esac + shift + shift + done + + if test -n "$orig_archive"; then + $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $? + else + $AR -NOLOGO -OUT:"$archive" "$@" || exit $? + fi + +elif test -n "$list"; then + if test ! -f "$orig_archive"; then + func_error "archive not found" + fi + $AR -NOLOGO -LIST "$archive" || exit $? +fi diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/bfin-sim.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/bfin-sim.exp new file mode 100644 index 000000000000..b36d9f0a81c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/bfin-sim.exp @@ -0,0 +1,58 @@ +# Copyright (C) 2010, 2019 Free Software Foundation, Inc. +# +# This file is part of DejaGnu. +# +# DejaGnu is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# DejaGnu is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with DejaGnu; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. + +# This is a list of toolchains that are supported on this board. +set_board_info target_install {bfin-elf} + +# Load the generic configuration for this board. This will define a basic set +# of routines needed by the tool to communicate with the board. +load_generic_config "sim" + +# basic-sim.exp is a basic description for the standard Cygnus simulator. +load_base_board_description "basic-sim" + +# "bfin" is the name of the sim subdir in devo/sim. +setup_sim bfin + +# No multilib options needed by default. +process_multilib_options "" + +# We only support newlib on this target. We assume that all multilib +# options have been specified before we get here. + +set_board_info compiler "[find_gcc]" +set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" +set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" + +# Configuration settings for testsuites +set_board_info noargs 1 +set_board_info gdb,nosignals 1 +set_board_info gdb,noresults 1 +set_board_info gdb,cannot_call_functions 1 +set_board_info gdb,skip_float_tests 1 +set_board_info gdb,can_reverse 1 +set_board_info gdb,use_precord 1 + +# More time is needed +set_board_info gcc,timeout 800 +set_board_info gdb,timeout 60 + +# Used by a few gcc.c-torture testcases to delimit how large the stack can +# be. +set_board_info gcc,stack_size 5000 + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/build-cross-in-container.sh b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/build-cross-in-container.sh new file mode 100644 index 000000000000..7e2252ce1a19 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/build-cross-in-container.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +cd /opt + +echo $PATH +export PATH=/usr/local/bin:$PATH +echo $PATH + +./configure --host=${HOST} || cat */config.log +make +make dist +make check RUNTESTFLAGS="-a $RUNTESTFLAGS" || true + + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/build-in-container.sh b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/build-in-container.sh new file mode 100644 index 000000000000..1a7fa76b8e24 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/build-in-container.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +cd /opt + +export QEMU_LD_PREFIX=/usr/${HOST} + +./configure ${HOST+--host=$HOST --disable-shared} +make +make dist +make check RUNTESTFLAGS="-a $RUNTESTFLAGS" || true + + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/build.sh b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/build.sh new file mode 100644 index 000000000000..5f9a86e998e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/build.sh @@ -0,0 +1,142 @@ +#!/bin/bash + +set -x + +# This is a policy bound API key. It can only be used with +# https://github.com/libffi/rlgl-policy.git. +RLGL_KEY=0LIBFFI-0LIBFFI-0LIBFFI-0LIBFFI + +if [ -z ${QEMU_CPU+x} ]; then + export SET_QEMU_CPU= +else + export SET_QEMU_CPU="-e QEMU_CPU=${QEMU_CPU}" +fi + +export DOCKER=docker + +function build_cfarm() +{ + curl -u ${CFARM_AUTH} https://cfarm-test-libffi-libffi.apps.home.labdroid.net/test?host=${HOST}\&commit=${TRAVIS_COMMIT} | tee build.log + echo ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + echo $(tail build.log | grep '^==LOGFILE==') + echo $(tail build.log | grep '^==LOGFILE==' | cut -b13-) + echo ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + curl -u ${CFARM_AUTH} "$(tail build.log | grep '^==LOGFILE==' | cut -b13-)" > libffi.log + + ./rlgl l --key=${RLGL_KEY} https://rl.gl + ID=$(./rlgl start) + ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git libffi.log + exit $? +} + +function build_linux() +{ + ./autogen.sh + ./configure ${HOST+--host=$HOST} ${CONFIGURE_OPTIONS} || cat */config.log + make + make dist + make check RUNTESTFLAGS="-a $RUNTESTFLAGS" + + ./rlgl l --key=${RLGL_KEY} https://rl.gl + ID=$(./rlgl start) + ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git */testsuite/libffi.log + exit $? +} + +function build_foreign_linux() +{ + ${DOCKER} run --rm -t -i -v $(pwd):/opt ${SET_QEMU_CPU} -e LIBFFI_TEST_OPTIMIZATION="${LIBFFI_TEST_OPTIMIZATION}" $2 bash -c /opt/.travis/build-in-container.sh + + ./rlgl l --key=${RLGL_KEY} https://rl.gl + ID=$(./rlgl start) + ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git */testsuite/libffi.log + exit $? +} + +function build_cross_linux() +{ + ${DOCKER} run --rm -t -i -v $(pwd):/opt ${SET_QEMU_CPU} -e HOST="${HOST}" -e CC="${HOST}-gcc-8 ${GCC_OPTIONS}" -e CXX="${HOST}-g++-8 ${GCC_OPTIONS}" -e LIBFFI_TEST_OPTIMIZATION="${LIBFFI_TEST_OPTIMIZATION}" moxielogic/cross-ci-build-container:latest bash -c /opt/.travis/build-in-container.sh + + ./rlgl l --key=${RLGL_KEY} https://rl.gl + ID=$(./rlgl start) + ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git */testsuite/libffi.log + exit $? +} + +function build_cross() +{ + ${DOCKER} pull quay.io/moxielogic/libffi-ci-${HOST} + ${DOCKER} run --rm -t -i -v $(pwd):/opt -e HOST="${HOST}" -e CC="${HOST}-gcc ${GCC_OPTIONS}" -e CXX="${HOST}-g++ ${GCC_OPTIONS}" -e TRAVIS_BUILD_DIR=/opt -e DEJAGNU="${DEJAGNU}" -e RUNTESTFLAGS="${RUNTESTFLAGS}" -e LIBFFI_TEST_OPTIMIZATION="${LIBFFI_TEST_OPTIMIZATION}" quay.io/moxielogic/libffi-ci-${HOST} bash -c /opt/.travis/build-cross-in-container.sh + + ./rlgl l --key=${RLGL_KEY} https://rl.gl + ID=$(./rlgl start) + ./rlgl e --id=$ID --policy=https://github.com/libffi/rlgl-policy.git */testsuite/libffi.log + exit $? +} + +function build_ios() +{ + which python +# export PYTHON_BIN=/usr/local/bin/python + ./generate-darwin-source-and-headers.py --only-ios + xcodebuild -showsdks + xcodebuild -project libffi.xcodeproj -target "libffi-iOS" -configuration Release -sdk iphoneos11.4 + exit $? +} + +function build_macosx() +{ + which python +# export PYTHON_BIN=/usr/local/bin/python + ./generate-darwin-source-and-headers.py --only-osx + xcodebuild -showsdks + xcodebuild -project libffi.xcodeproj -target "libffi-Mac" -configuration Release -sdk macosx10.13 + echo "Finished build" + exit $? +} + +case "$HOST" in + arm-apple-darwin*) + ./autogen.sh + build_ios + ;; + x86_64-apple-darwin*) + ./autogen.sh + build_macosx + ;; + arm32v7-linux-gnu) + ./autogen.sh + build_foreign_linux arm moxielogic/arm32v7-ci-build-container:latest + ;; + mips64el-linux-gnu | sparc64-linux-gnu) + build_cfarm + ;; + bfin-elf ) + ./autogen.sh + GCC_OPTIONS=-msim build_cross + ;; + m32r-elf ) + ./autogen.sh + build_cross + ;; + or1k-elf ) + ./autogen.sh + build_cross + ;; + powerpc-eabisim ) + ./autogen.sh + build_cross + ;; + m68k-linux-gnu ) + ./autogen.sh + GCC_OPTIONS=-mcpu=547x build_cross_linux + ;; + alpha-linux-gnu | sh4-linux-gnu ) + ./autogen.sh + build_cross_linux + ;; + *) + ./autogen.sh + build_linux + ;; +esac diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/compile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/compile new file mode 100644 index 000000000000..655932a22449 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/compile @@ -0,0 +1,351 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-27.18; # UTC + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Written by Tom Tromey <tromey@cygnus.com>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -warn) + eat=1 + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/install.sh b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/install.sh new file mode 100644 index 000000000000..242024571037 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/install.sh @@ -0,0 +1,71 @@ +#!/bin/bash +set -x + +if [[ $TRAVIS_OS_NAME != 'linux' ]]; then + brew update > brew-update.log 2>&1 + # fix an issue with libtool on travis by reinstalling it + brew uninstall libtool; + brew install libtool dejagnu; + + # Download and extract the rlgl client + wget -qO - https://rl.gl/cli/rlgl-darwin-amd64.tgz | \ + tar --strip-components=2 -xvzf - ./rlgl/rlgl; + +else + # Download and extract the rlgl client + case $HOST in + aarch64-linux-gnu) + wget -qO - https://rl.gl/cli/rlgl-linux-arm.tgz | \ + tar --strip-components=2 -xvzf - ./rlgl/rlgl; + ;; + ppc64le-linux-gnu) + wget -qO - https://rl.gl/cli/rlgl-linux-ppc64le.tgz | \ + tar --strip-components=2 -xvzf - ./rlgl/rlgl; + ;; + s390x-linux-gnu) + wget -qO - https://rl.gl/cli/rlgl-linux-s390x.tgz | \ + tar --strip-components=2 -xvzf - ./rlgl/rlgl; + ;; + *) + wget -qO - https://rl.gl/cli/rlgl-linux-amd64.tgz | \ + tar --strip-components=2 -xvzf - ./rlgl/rlgl; + ;; + esac + + sudo apt-get clean # clear the cache + sudo apt-get update + case $HOST in + mips64el-linux-gnu | sparc64-linux-gnu) + ;; + alpha-linux-gnu | arm32v7-linux-gnu | m68k-linux-gnu | sh4-linux-gnu) + sudo apt-get install qemu-user-static + ;; + hppa-linux-gnu ) + sudo apt-get install -y qemu-user-static g++-5-hppa-linux-gnu + ;; + i386-pc-linux-gnu) + sudo apt-get install gcc-multilib g++-multilib; + ;; + moxie-elf) + echo 'deb https://repos.moxielogic.org:7114/MoxieLogic moxiedev main' | sudo tee -a /etc/apt/sources.list + sudo apt-get clean # clear the cache + sudo apt-get update ## -qq + sudo apt-get update + sudo apt-get install -y --allow-unauthenticated moxielogic-moxie-elf-gcc moxielogic-moxie-elf-gcc-c++ moxielogic-moxie-elf-gcc-libstdc++ moxielogic-moxie-elf-gdb-sim + ;; + x86_64-w64-mingw32) + sudo apt-get install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 wine; + ;; + i686-w32-mingw32) + sudo apt-get install gcc-mingw-w64-i686 g++-mingw-w64-i686 wine; + ;; + esac + case $HOST in + arm32v7-linux-gnu) + # don't install host tools + ;; + *) + sudo apt-get install dejagnu texinfo sharutils + ;; + esac +fi diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/m32r-sim.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/m32r-sim.exp new file mode 100644 index 000000000000..c18123f28fb1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/m32r-sim.exp @@ -0,0 +1,58 @@ +# Copyright (C) 2010, 2019 Free Software Foundation, Inc. +# +# This file is part of DejaGnu. +# +# DejaGnu is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# DejaGnu is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with DejaGnu; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. + +# This is a list of toolchains that are supported on this board. +set_board_info target_install {m32r-elf} + +# Load the generic configuration for this board. This will define a basic set +# of routines needed by the tool to communicate with the board. +load_generic_config "sim" + +# basic-sim.exp is a basic description for the standard Cygnus simulator. +load_base_board_description "basic-sim" + +# "m32r" is the name of the sim subdir in devo/sim. +setup_sim m32r + +# No multilib options needed by default. +process_multilib_options "" + +# We only support newlib on this target. We assume that all multilib +# options have been specified before we get here. + +set_board_info compiler "[find_gcc]" +set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" +set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" + +# Configuration settings for testsuites +set_board_info noargs 1 +set_board_info gdb,nosignals 1 +set_board_info gdb,noresults 1 +set_board_info gdb,cannot_call_functions 1 +set_board_info gdb,skip_float_tests 1 +set_board_info gdb,can_reverse 1 +set_board_info gdb,use_precord 1 + +# More time is needed +set_board_info gcc,timeout 800 +set_board_info gdb,timeout 60 + +# Used by a few gcc.c-torture testcases to delimit how large the stack can +# be. +set_board_info gcc,stack_size 5000 + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/moxie-sim.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/moxie-sim.exp new file mode 100644 index 000000000000..32979ea6be36 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/moxie-sim.exp @@ -0,0 +1,60 @@ +# Copyright (C) 2010 Free Software Foundation, Inc. +# +# This file is part of DejaGnu. +# +# DejaGnu is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# DejaGnu is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with DejaGnu; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. + +# This is a list of toolchains that are supported on this board. +set_board_info target_install {moxie-elf} + +# Load the generic configuration for this board. This will define a basic set +# of routines needed by the tool to communicate with the board. +load_generic_config "sim" + +# basic-sim.exp is a basic description for the standard Cygnus simulator. +load_base_board_description "basic-sim" + +# "moxie" is the name of the sim subdir in devo/sim. +setup_sim moxie + +# No multilib options needed by default. +process_multilib_options "" + +# We only support newlib on this target. We assume that all multilib +# options have been specified before we get here. + +set_board_info compiler "[find_gcc]" +set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" +set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" +# No linker script needed. +set_board_info ldscript "-Tsim.ld" + +# Configuration settings for testsuites +set_board_info noargs 1 +set_board_info gdb,nosignals 1 +set_board_info gdb,noresults 1 +set_board_info gdb,cannot_call_functions 1 +set_board_info gdb,skip_float_tests 1 +set_board_info gdb,can_reverse 1 +set_board_info gdb,use_precord 1 + +# More time is needed +set_board_info gcc,timeout 800 +set_board_info gdb,timeout 60 + +# Used by a few gcc.c-torture testcases to delimit how large the stack can +# be. +set_board_info gcc,stack_size 5000 + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/or1k-sim.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/or1k-sim.exp new file mode 100644 index 000000000000..3920413ee1b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/or1k-sim.exp @@ -0,0 +1,58 @@ +# Copyright (C) 2010, 2019 Free Software Foundation, Inc. +# +# This file is part of DejaGnu. +# +# DejaGnu is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# DejaGnu is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with DejaGnu; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. + +# This is a list of toolchains that are supported on this board. +set_board_info target_install {or1k-elf} + +# Load the generic configuration for this board. This will define a basic set +# of routines needed by the tool to communicate with the board. +load_generic_config "sim" + +# basic-sim.exp is a basic description for the standard Cygnus simulator. +load_base_board_description "basic-sim" + +# "or1k" is the name of the sim subdir in devo/sim. +setup_sim or1k + +# No multilib options needed by default. +process_multilib_options "" + +# We only support newlib on this target. We assume that all multilib +# options have been specified before we get here. + +set_board_info compiler "[find_gcc]" +set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" +set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" + +# Configuration settings for testsuites +set_board_info noargs 1 +set_board_info gdb,nosignals 1 +set_board_info gdb,noresults 1 +set_board_info gdb,cannot_call_functions 1 +set_board_info gdb,skip_float_tests 1 +set_board_info gdb,can_reverse 1 +set_board_info gdb,use_precord 1 + +# More time is needed +set_board_info gcc,timeout 800 +set_board_info gdb,timeout 60 + +# Used by a few gcc.c-torture testcases to delimit how large the stack can +# be. +set_board_info gcc,stack_size 5000 + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp new file mode 100644 index 000000000000..285fd4f6fe47 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp @@ -0,0 +1,58 @@ +# Copyright (C) 2010, 2019 Free Software Foundation, Inc. +# +# This file is part of DejaGnu. +# +# DejaGnu is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# DejaGnu is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with DejaGnu; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. + +# This is a list of toolchains that are supported on this board. +set_board_info target_install {powerpc-eabisim} + +# Load the generic configuration for this board. This will define a basic set +# of routines needed by the tool to communicate with the board. +load_generic_config "sim" + +# basic-sim.exp is a basic description for the standard Cygnus simulator. +load_base_board_description "basic-sim" + +# "powerpc" is the name of the sim subdir in devo/sim. +setup_sim powerpc + +# No multilib options needed by default. +process_multilib_options "" + +# We only support newlib on this target. We assume that all multilib +# options have been specified before we get here. + +set_board_info compiler "[find_gcc]" +set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" +set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" + +# Configuration settings for testsuites +set_board_info noargs 1 +set_board_info gdb,nosignals 1 +set_board_info gdb,noresults 1 +set_board_info gdb,cannot_call_functions 1 +set_board_info gdb,skip_float_tests 1 +set_board_info gdb,can_reverse 1 +set_board_info gdb,use_precord 1 + +# More time is needed +set_board_info gcc,timeout 800 +set_board_info gdb,timeout 60 + +# Used by a few gcc.c-torture testcases to delimit how large the stack can +# be. +set_board_info gcc,stack_size 5000 + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/site.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/site.exp new file mode 100644 index 000000000000..644ec6318533 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/site.exp @@ -0,0 +1,27 @@ +# Copyright (C) 2008, 2010, 2018, 2019 Anthony Green + +# Make sure we look in the right place for the board description files. +if ![info exists boards_dir] { + set boards_dir {} +} + +lappend boards_dir $::env(TRAVIS_BUILD_DIR)/.travis + +verbose "Global Config File: target_triplet is $target_triplet" 2 +global target_list + +case "$target_triplet" in { + { "bfin-elf" } { + set target_list "bfin-sim" + } + { "m32r-elf" } { + set target_list "m32r-sim" + } + { "moxie-elf" } { + set target_list "moxie-sim" + } + { "or1k-elf" } { + set target_list "or1k-sim" + } +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/wine-sim.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/wine-sim.exp new file mode 100644 index 000000000000..1ad603817a0e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/.travis/wine-sim.exp @@ -0,0 +1,55 @@ +# Copyright (C) 2010, 2019 Free Software Foundation, Inc. +# +# This file is part of DejaGnu. +# +# DejaGnu is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# DejaGnu is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with DejaGnu; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, MA 02110, USA. + +# This is a list of toolchains that are supported on this board. +set_board_info target_install {i686-w64-mingw32} + +# Load the generic configuration for this board. This will define a basic set +# of routines needed by the tool to communicate with the board. +load_generic_config "sim" + +set_board_info sim "wineconsole --backend=curses" +set_board_info is_simulator 1 + +# No multilib options needed by default. +process_multilib_options "" + +# We only support newlib on this target. We assume that all multilib +# options have been specified before we get here. + +set_board_info compiler "[find_gcc]" +set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" +set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" + +# Configuration settings for testsuites +set_board_info noargs 1 +set_board_info gdb,nosignals 1 +set_board_info gdb,noresults 1 +set_board_info gdb,cannot_call_functions 1 +set_board_info gdb,skip_float_tests 1 +set_board_info gdb,can_reverse 1 +set_board_info gdb,use_precord 1 + +# More time is needed +set_board_info gcc,timeout 800 +set_board_info gdb,timeout 60 + +# Used by a few gcc.c-torture testcases to delimit how large the stack can +# be. +set_board_info gcc,stack_size 5000 + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/ChangeLog.old b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/ChangeLog.old new file mode 100644 index 000000000000..8de1ca75f1b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/ChangeLog.old @@ -0,0 +1,7407 @@ +Libffi change logs used to be maintained in separate ChangeLog files. +These days we generate them directly from the git commit messages. +The old ChangeLog files are saved here in order to maintain the historical +record. + +============================================================================= +From the old ChangeLog.libffi-3.1 file... + +2014-03-16 Josh Triplett <josh@joshtriplett.org> + + * ChangeLog: Archive to ChangeLog.libffi-3.1 and delete. Future + changelogs will come from git, with autogenerated snapshots shipped in + distributed tarballs. + +2014-03-16 Josh Triplett <josh@joshtriplett.org> + + Add support for stdcall, thiscall, and fastcall on non-Windows + x86-32. + + Linux supports the stdcall calling convention, either via + functions explicitly declared with the stdcall attribute, or via + code compiled with -mrtd which effectively makes stdcall the + default. + + This introduces FFI_STDCALL, FFI_THISCALL, and FFI_FASTCALL on + non-Windows x86-32 platforms, as non-default calling conventions. + + * Makefile.am: Compile in src/x86/win32.S on non-Windows x86-32. + * src/x86/ffitarget.h: Add FFI_STDCALL, FFI_THISCALL, and + FFI_FASTCALL on non-Windows x86-32. Increase trampoline size to + accomodate these calling conventions, and unify some ifdeffery. + * src/x86/ffi.c: Add support for FFI_STDCALL, FFI_THISCALL, and + FFI_FASTCALL on non-Windows x86-32 platforms; update ifdeffery. + * src/x86/win32.S: Support compiling on non-Windows x86-32 + platforms. On those platforms, avoid redefining the SYSV symbols + already provided by src/x86/sysv.S. + * testsuite/libffi.call/closure_stdcall.c: Run on non-Windows. + #define __stdcall if needed. + * testsuite/libffi.call/closure_thiscall.c: Run on non-Windows. + #define __fastcall if needed. + * testsuite/libffi.call/fastthis1_win32.c: Run on non-Windows. + * testsuite/libffi.call/fastthis2_win32.c: Ditto. + * testsuite/libffi.call/fastthis3_win32.c: Ditto. + * testsuite/libffi.call/many2_win32.c: Ditto. + * testsuite/libffi.call/many_win32.c: Ditto. + * testsuite/libffi.call/strlen2_win32.c: Ditto. + * testsuite/libffi.call/strlen_win32.c: Ditto. + * testsuite/libffi.call/struct1_win32.c: Ditto. + * testsuite/libffi.call/struct2_win32.c: Ditto. + +2014-03-16 Josh Triplett <josh@joshtriplett.org> + + * prep_cif.c: Remove unnecessary ifdef for X86_WIN32. + ffi_prep_cif_core had a special case for X86_WIN32, checking for + FFI_THISCALL in addition to the FFI_FIRST_ABI-to-FFI_LAST_ABI + range before returning FFI_BAD_ABI. However, on X86_WIN32, + FFI_THISCALL already falls in that range, making the special case + unnecessary. Remove it. + +2014-03-16 Josh Triplett <josh@joshtriplett.org> + + * testsuite/libffi.call/closure_stdcall.c, + testsuite/libffi.call/closure_thiscall.c: Remove fragile stack + pointer checks. These files included inline assembly to save the + stack pointer before and after the call, and compare the values. + However, compilers can and do leave the stack in different states + for these two pieces of inline assembly, such as by saving a + temporary value on the stack across the call; observed with gcc + -Os, and verified as spurious through careful inspection of + disassembly. + +2014-03-16 Josh Triplett <josh@joshtriplett.org> + + * testsuite/libffi.call/many.c: Avoid spurious failure due to + excess floating-point precision. + * testsuite/libffi.call/many_win32.c: Ditto. + +2014-03-16 Josh Triplett <josh@joshtriplett.org> + + * libtool-ldflags: Re-add. + +2014-03-16 Josh Triplett <josh@joshtriplett.org> + + * Makefile.in, aclocal.m4, compile, config.guess, config.sub, + configure, depcomp, include/Makefile.in, install-sh, + libtool-ldflags, ltmain.sh, m4/libtool.m4, m4/ltoptions.m4, + m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4, + man/Makefile.in, mdate-sh, missing, testsuite/Makefile.in: Delete + autogenerated files from version control. + * .gitignore: Add autogenerated files. + * autogen.sh: New script to generate the autogenerated files. + * README: Document requirement to run autogen.sh when building + directly from version control. + * .travis.yml: Run autogen.sh + +2014-03-14 Anthony Green <green@moxielogic.com> + + * configure, Makefile.in: Rebuilt. + +2014-03-10 Mike Hommey <mh+mozilla@glandium.org> + + * configure.ac: Allow building for mipsel with Android NDK r8. + * Makefile.am (AM_MAKEFLAGS): Replace double quotes with single + quotes. + +2014-03-10 Landry Breuil <landry@openbsd.org> + + * configure.ac: Ensure the linker supports @unwind sections in libffi. + +2014-03-01 Anthony Green <green@moxielogic.com> + + * Makefile.am (EXTRA_DIST): Replace old scripts with + generate-darwin-source-and-headers.py. + * Makefile.in: Rebuilt. + +2014-02-28 Anthony Green <green@moxielogic.com> + + * Makefile.am (AM_CFLAGS): Reintroduce missing -DFFI_DEBUG for + --enable-debug builds. + * Makefile.in: Rebuilt. + +2014-02-28 Makoto Kato <m_kato@ga2.so-net.ne.jp> + + * src/closures.c: Fix build failure when using clang for Android. + +2014-02-28 Marcin Wojdyr <wojdyr@gmail.com> + + * libffi.pc.in (toolexeclibdir): use -L${toolexeclibdir} instead + of -L${libdir}. + +2014-02-28 Paulo Pizarro <paulo.pizarro@gmail.com> + + * src/bfin/sysv.S: Calling functions in shared libraries requires + considering the GOT. + +2014-02-28 Josh Triplett <josh@joshtriplett.org> + + * src/x86/ffi64.c (classify_argument): Handle case where + FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE. + +2014-02-28 Anthony Green <green@moxielogic.com> + + * ltmain.sh: Generate with libtool-2.4.2.418. + * m4/libtool.m4, m4/ltoptions.m4, m4/ltversion.m4: Ditto. + * configure: Rebuilt. + +2014-02-28 Dominik Vogt <vogt@linux.vnet.ibm.com> + + * configure.ac (AC_ARG_ENABLE struct): Fix typo in help + message. + (AC_ARG_ENABLE raw_api): Ditto. + * configure, fficonfig.h.in: Rebuilt. + +2014-02-28 Will Newton <will.newton@linaro.org> + + * src/arm/sysv.S: Initialize IP register with FP. + +2014-02-28 Yufeng Zhang <yufeng.zhang@arm.com> + + * src/aarch64/sysv.S (ffi_closure_SYSV): Use x29 as the + main CFA reg; update cfi_rel_offset. + +2014-02-15 Marcus Comstedt <marcus@mc.pp.se> + + * src/powerpc/ffi_linux64.c, src/powerpc/linux64_closure.S: Remove + assumption on contents of r11 in closure. + +2014-02-09 Heiher <r@hev.cc> + + * src/mips/n32.S: Fix call floating point va function. + +2014-01-21 Zachary Waldowski <zach@waldowski.me> + + * src/aarch64/ffi.c: Fix missing semicolons on assertions under + debug mode. + +2013-12-30 Zachary Waldowski <zach@waldowski.me> + + * .gitignore: Exclude darwin_* generated source and build_* trees. + * src/aarch64/ffi.c, src/arm/ffi.c, src/x86/ffi.c: Inhibit Clang + previous prototype warnings. + * src/arm/ffi.c: Prevent NULL dereference, fix short type warning + * src/dlmalloc.c: Fix warnings from set_segment_flags return type, + and the native use of size_t for malloc on platforms + * src/arm/sysv.S: Use unified syntax. Clang clean-ups for + ARM_FUNC_START. + * generate-osx-source-and-headers.py: Remove. + * build-ios.sh: Remove. + * libffi.xcodeproj/project.pbxproj: Rebuild targets. Include + x86_64+aarch64 pieces in library. Export headers properly. + * src/x86/ffi64.c: More Clang warning clean-ups. + * src/closures.c (open_temp_exec_file_dir): Use size_t. + * src/prep_cif.c (ffi_prep_cif_core): Cast ALIGN result. + * src/aarch64/sysv.S: Use CNAME for global symbols. Only use + .size for ELF targets. + * src/aarch64/ffi.c: Clean up for double == long double. Clean up + from Clang warnings. Use Clang cache invalidation builtin. Use + size_t in place of unsigned in many places. Accommodate for + differences in Apple AArch64 ABI. + +2013-12-02 Daniel Rodríguez Troitiño <drodrigueztroitino@yahoo.es> + + * generate-darwin-source-and-headers.py: Clean up, modernize, + merged version of previous scripts. + +2013-11-21 Anthony Green <green@moxielogic.com> + + * configure, Makefile.in, include/Makefile.in, include/ffi.h.in, + man/Makefile.in, testsuite/Makefile.in, fficonfig.h.in: Rebuilt. + +2013-11-21 Alan Modra <amodra@gmail.com> + + * Makefile.am (EXTRA_DIST): Add new src/powerpc files. + (nodist_libffi_la_SOURCES <POWERPC, POWERPC_FREEBSD>): Likewise. + * configure.ac (HAVE_LONG_DOUBLE_VARIANT): Define for powerpc. + * include/ffi.h.in (ffi_prep_types): Declare. + * src/prep_cif.c (ffi_prep_cif_core): Call ffi_prep_types. + * src/types.c (FFI_NONCONST_TYPEDEF): Define and use for + HAVE_LONG_DOUBLE_VARIANT. + * src/powerpc/ffi_powerpc.h: New file. + * src/powerpc/ffi.c: Split into.. + * src/powerpc/ffi_sysv.c: ..new file, and.. + * src/powerpc/ffi_linux64.c: ..new file, rewriting parts. + * src/powerpc/ffitarget.h (enum ffi_abi): Rewrite powerpc ABI + selection as bits controlling features. + * src/powerpc/linux64.S: For consistency, use POWERPC64 rather + than __powerpc64__. + * src/powerpc/linux64_closure.S: Likewise. + * src/powerpc/ppc_closure.S: Likewise. Move .note.FNU-stack + inside guard. + * src/powerpc/sysv.S: Likewise. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * Makefile.in: Regenerate. + +2013-11-20 Alan Modra <amodra@gmail.com> + + * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use + NUM_FPR_ARG_REGISTERS64 and NUM_GPR_ARG_REGISTERS64 not their + 32-bit versions for 64-bit code. + * src/powerpc/linux64_closure.S: Don't use the return value area + as a parameter save area on ELFv2. + +2013-11-18 Iain Sandoe <iain@codesourcery.com> + + * src/powerpc/darwin.S (EH): Correct use of pcrel FDE encoding. + * src/powerpc/darwin_closure.S (EH): Likewise. Modernise picbase + labels. + +2013-11-18 Anthony Green <green@moxielogic.com> + + * src/arm/ffi.c (ffi_call): Hoist declaration of temp to top of + function. + * src/arm/ffi.c (ffi_closure_inner): Moderize function declaration + to appease compiler. + Thanks for Gregory P. Smith <greg@krypto.org>. + +2013-11-18 Anthony Green <green@moxielogic.com> + + * README (tested): Mention PowerPC ELFv2. + +2013-11-16 Alan Modra <amodra@gmail.com> + + * src/powerpc/ppc_closure.S: Move errant #endif to where it belongs. + Don't bl .Luint128. + +2013-11-16 Alan Modra <amodra@gmail.com> + + * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use #if _CALL_ELF + test to select parameter save sizing for ELFv2 vs. ELFv1. + * src/powerpc/ffitarget.h (FFI_V2_TYPE_FLOAT_HOMOG, + FFI_V2_TYPE_DOUBLE_HOMOG, FFI_V2_TYPE_SMALL_STRUCT): Define. + (FFI_TRAMPOLINE_SIZE): Define variant for ELFv2. + * src/powerpc/ffi.c (FLAG_ARG_NEEDS_PSAVE): Define. + (discover_homogeneous_aggregate): New function. + (ffi_prep_args64): Adjust start of param save area for ELFv2. + Handle homogenous floating point struct parms. + (ffi_prep_cif_machdep_core): Adjust space calculation for ELFv2. + Handle ELFv2 return values. Set FLAG_ARG_NEEDS_PSAVE. Handle + homogenous floating point structs. + (ffi_call): Increase size of smst_buffer for ELFv2. Handle ELFv2. + (flush_icache): Compile for ELFv2. + (ffi_prep_closure_loc): Set up ELFv2 trampoline. + (ffi_closure_helper_LINUX64): Don't return all structs directly + to caller. Handle homogenous floating point structs. Handle + ELFv2 struct return values. + * src/powerpc/linux64.S (ffi_call_LINUX64): Set up r2 for + ELFv2. Adjust toc save location. Call function pointer using + r12. Handle FLAG_RETURNS_SMST. Don't predict branches. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Set up r2 + for ELFv2. Define ELFv2 versions of STACKFRAME, PARMSAVE, and + RETVAL. Handle possibly missing parameter save area. Handle + ELFv2 return values. + (.note.GNU-stack): Move inside outer #ifdef. + +2013-11-16 Alan Modra <amodra@gmail.com> + + * src/powerpc/ffi.c (ffi_prep_cif_machdep): Revert 2013-02-08 + change. Do not consume an int arg when returning a small struct + for FFI_SYSV ABI. + (ffi_call): Only use bounce buffer when FLAG_RETURNS_SMST. + Properly copy bounce buffer to destination. + * src/powerpc/sysv.S: Revert 2013-02-08 change. + * src/powerpc/ppc_closure.S: Remove stray '+'. + +2013-11-16 Alan Modra <amodra@gmail.com> + + * src/powerpc/ffi.c (ffi_prep_args64): Align struct parameters + according to __STRUCT_PARM_ALIGN__. + (ffi_prep_cif_machdep_core): Likewise. + (ffi_closure_helper_LINUX64): Likewise. + +2013-11-16 Alan Modra <amodra@gmail.com> + + * src/powerpc/linux64.S (ffi_call_LINUX64): Tweak restore of r28. + (.note.GNU-stack): Move inside outer #ifdef. + * src/powerpc/linux64_closure.S (STACKFRAME, PARMSAVE, + RETVAL): Define and use throughout. + (ffi_closure_LINUX64): Save fprs before buying stack. + (.note.GNU-stack): Move inside outer #ifdef. + +2013-11-16 Alan Modra <amodra@gmail.com> + + * src/powerpc/ffitarget.h (FFI_TARGET_SPECIFIC_VARIADIC): Define. + (FFI_EXTRA_CIF_FIELDS): Define. + * src/powerpc/ffi.c (ffi_prep_args64): Save fprs as per the + ABI, not to both fpr and param save area. + (ffi_prep_cif_machdep_core): Renamed from ffi_prep_cif_machdep. + Keep initial flags. Formatting. Remove dead FFI_LINUX_SOFT_FLOAT + code. + (ffi_prep_cif_machdep, ffi_prep_cif_machdep_var): New functions. + (ffi_closure_helper_LINUX64): Pass floating point as per ABI, + not to both fpr and parameter save areas. + + * libffi/testsuite/libffi.call/cls_double_va.c (main): Correct + function cast and don't call ffi_prep_cif. + * libffi/testsuite/libffi.call/cls_longdouble_va.c (main): Likewise. + +2013-11-15 Andrew Haley <aph@redhat.com> + + * doc/libffi.texi (Closure Example): Fix the sample code. + * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. + +2013-11-15 Andrew Haley <aph@redhat.com> + + * testsuite/libffi.call/va_struct1.c (main): Fix broken test. + * testsuite/libffi.call/cls_uint_va.c (cls_ret_T_fn): Likewise + * testsuite/libffi.call/cls_struct_va1.c (test_fn): Likewise. + * testsuite/libffi.call/va_1.c (main): Likewise. + +2013-11-14 David Schneider <david.schneider@bivab.de> + + * src/arm/ffi.c: Fix register allocation for mixed float and + doubles. + * testsuite/libffi.call/cls_many_mixed_float_double.c: Testcase + for many mixed float and double arguments. + +2013-11-13 Alan Modra <amodra@gmail.com> + + * doc/libffi.texi (Simple Example): Correct example code. + * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. + +2013-11-13 Anthony Green <green@moxielogic.com> + + * include/ffi_common.h: Respect HAVE_ALLOCA_H for GNU compiler + based build. (Thanks to tmr111116 on github) + +2013-11-09 Anthony Green <green@moxielogic.com> + + * m4/libtool.m4: Refresh. + * configure, Makefile.in: Rebuilt. + * README: Add more notes about next release. + +2013-11-09 Shigeharu TAKENO <shige@iee.niit.ac.jp> + + * m4/ax_gcc_archflag.m4 (ax_gcc_arch): Don't recognize + UltraSPARC-IIi as ultrasparc3. + +2013-11-06 Mark Kettenis <kettenis@gnu.org> + + * src/x86/freebsd.S (ffi_call_SYSV): Align the stack pointer to + 16-bytes. + +2013-11-06 Konstantin Belousov <kib@freebsd.org> + + * src/x86/freebsd.S (ffi_closure_raw_SYSV): Mark the assembler + source as not requiring executable stack. + +2013-11-02 Anthony Green <green@moxielogic.com> + + * doc/libffi.texi (The Basics): Clarify return value buffer size + requirements. Also, NULL result buffer pointers are no longer + supported. + * doc/libffi.info: Rebuilt. + +2013-11-02 Mischa Jonker <mjonker@synopsys.com> + + * Makefile.am (nodist_libffi_la_SOURCES): Fix build error. + * Makefile.in: Rebuilt. + +2013-11-02 David Schneider <david.schneider@bivab.de> + + * src/arm/ffi.c: more robust argument handling for closures on arm hardfloat + * testsuite/libffi.call/many_mixed.c: New file. + * testsuite/libffi.call/cls_many_mixed_args.c: More tests. + +2013-11-02 Vitaly Budovski + + * src/x86/ffi.c (ffi_prep_cif_machdep): Don't align stack for win32. + +2013-10-23 Mark H Weaver <mhw@netris.org> + + * src/mips/ffi.c: Fix handling of uint32_t arguments on the + MIPS N32 ABI. + +2013-10-13 Sandra Loosemore <sandra@codesourcery.com> + + * README: Add Nios II to table of supported platforms. + * Makefile.am (EXTRA_DIST): Add nios2 files. + (nodist_libffi_la_SOURCES): Likewise. + * Makefile.in: Regenerated. + * configure.ac (nios2*-linux*): New host. + (NIOS2): Add AM_CONDITIONAL. + * configure: Regenerated. + * src/nios2/ffi.c: New. + * src/nios2/ffitarget.h: New. + * src/nios2/sysv.S: New. + * src/prep_cif.c (initialize_aggregate): Handle extra structure + alignment via FFI_AGGREGATE_ALIGNMENT. + (ffi_prep_cif_core): Conditionalize structure return for NIOS2. + +2013-10-10 Sandra Loosemore <sandra@codesourcery.com> + + * testsuite/libffi.call/cls_many_mixed_args.c (cls_ret_double_fn): + Fix uninitialized variable. + +2013-10-11 Marcus Shawcroft <marcus.shawcroft@arm.com> + + * testsuite/libffi.call/many.c (many): Replace * with +. + +2013-10-08 Ondřej Bílka <neleai@seznam.cz> + + * src/aarch64/ffi.c, src/aarch64/sysv.S, src/arm/ffi.c, + src/arm/gentramp.sh, src/bfin/sysv.S, src/closures.c, + src/dlmalloc.c, src/ia64/ffi.c, src/microblaze/ffi.c, + src/microblaze/sysv.S, src/powerpc/darwin_closure.S, + src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/sh/ffi.c, + src/tile/tile.S, testsuite/libffi.call/nested_struct11.c: Fix + spelling errors. + +2013-10-08 Anthony Green <green@moxielogic.com> + + * aclocal.m4, compile, config.guess, config.sub, depcomp, + install-sh, mdate-sh, missing, texinfo.tex: Update from upstream. + * configure.ac: Update version to 3.0.14-rc0. + * Makefile.in, configure, Makefile.in, include/Makefile.in, + man/Makefile.in, testsuite/Makefile.in: Rebuilt. + * README: Mention M88K and VAX. + +2013-07-15 Miod Vallat <miod@openbsd.org> + + * Makefile.am, + configure.ac, + src/m88k/ffi.c, + src/m88k/ffitarget.h, + src/m88k/obsd.S, + src/vax/elfbsd.S, + src/vax/ffi.c, + src/vax/ffitarget.h: Add m88k and vax support. + +2013-06-24 Alan Modra <amodra@gmail.com> + + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Move var declaration + before statements. + (ffi_prep_args64): Support little-endian. + (ffi_closure_helper_SYSV, ffi_closure_helper_LINUX64): Likewise. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Likewise. + * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Likewise. + +2013-06-12 Mischa Jonker <mjonker@synopsys.com> + + * configure.ac: Add support for ARC. + * Makefile.am: Likewise. + * README: Add ARC details. + * src/arc/arcompact.S: New. + * src/arc/ffi.c: Likewise. + * src/arc/ffitarget.h: Likewise. + +2013-03-28 David Schneider <david.schneider@bivab.de> + + * src/arm/ffi.c: Fix support for ARM hard-float calling convention. + * src/arm/sysv.S: call different methods for SYSV and VFP ABIs. + * testsuite/libffi.call/cls_many_mixed_args.c: testcase for a closure with + mixed arguments, many doubles. + * testsuite/libffi.call/many_double.c: testcase for calling a function using + more than 8 doubles. + * testcase/libffi.call/many.c: use absolute value to check result against an + epsilon + +2013-03-17 Anthony Green <green@moxielogic.com> + + * README: Update for 3.0.13. + * configure.ac: Ditto. + * configure: Rebuilt. + * doc/*: Update version. + +2013-03-17 Dave Korn <dave.korn.cygwin@gmail.com> + + * src/closures.c (is_emutramp_enabled + [!FFI_MMAP_EXEC_EMUTRAMP_PAX]): Move default definition outside + enclosing #if scope. + +2013-03-17 Anthony Green <green@moxielogic.com> + + * configure.ac: Only modify toolexecdir in certain cases. + * configure: Rebuilt. + +2013-03-16 Gilles Talis <gilles.talis@gmail.com> + + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Don't use + fparg_count,etc on __NO_FPRS__ targets. + +2013-03-16 Alan Hourihane <alanh@fairlite.co.uk> + + * src/m68k/sysv.S (epilogue): Don't use extb instruction on + m680000 machines. + +2013-03-16 Alex Gaynor <alex.gaynor@gmail.com> + + * src/x86/ffi.c (ffi_prep_cif_machdep): Always align stack. + +2013-03-13 Markos Chandras <markos.chandras@imgtec.com> + + * configure.ac: Add support for Imagination Technologies Meta. + * Makefile.am: Likewise. + * README: Add Imagination Technologies Meta details. + * src/metag/ffi.c: New. + * src/metag/ffitarget.h: Likewise. + * src/metag/sysv.S: Likewise. + +2013-02-24 Andreas Schwab <schwab@linux-m68k.org> + + * doc/libffi.texi (Structures): Fix missing category argument of + @deftp. + +2013-02-11 Anthony Green <green@moxielogic.com> + + * configure.ac: Update release number to 3.0.12. + * configure: Rebuilt. + * README: Update release info. + +2013-02-10 Anthony Green <green@moxielogic.com> + + * README: Add Moxie. + * src/moxie/ffi.c: Created. + * src/moxie/eabi.S: Created. + * src/moxie/ffitarget.h: Created. + * Makefile.am (nodist_libffi_la_SOURCES): Add Moxie. + * Makefile.in: Rebuilt. + * configure.ac: Add Moxie. + * configure: Rebuilt. + * testsuite/libffi.call/huge_struct.c: Disable format string + warnings for moxie*-*-elf tests. + +2013-02-10 Anthony Green <green@moxielogic.com> + + * Makefile.am (LTLDFLAGS): Fix reference. + * Makefile.in: Rebuilt. + +2013-02-10 Anthony Green <green@moxielogic.com> + + * README: Update supported platforms. Update test results link. + +2013-02-09 Anthony Green <green@moxielogic.com> + + * testsuite/libffi.call/negint.c: Remove forced -O2. + * testsuite/libffi.call/many2.c (foo): Remove GCCism. + * testsuite/libffi.call/ffitest.h: Add default PRIuPTR definition. + + * src/sparc/v8.S (ffi_closure_v8): Import ancient ulonglong + closure return type fix developed by Martin v. Löwis for cpython + fork. + +2013-02-08 Andreas Tobler <andreast@fgznet.ch> + + * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix small struct + support. + * src/powerpc/sysv.S: Ditto. + +2013-02-08 Anthony Green <green@moxielogic.com> + + * testsuite/libffi.call/cls_longdouble.c: Remove xfail for + arm*-*-*. + +2013-02-08 Anthony Green <green@moxielogic.com> + + * src/sparc/ffi.c (ffi_prep_closure_loc): Fix cache flushing for GCC. + +2013-02-08 Matthias Klose <doko@ubuntu.com> + + * man/ffi_prep_cif.3: Clean up for debian linter. + +2013-02-08 Peter Bergner <bergner@vnet.ibm.com> + + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Account for FP args pushed + on the stack. + +2013-02-08 Anthony Green <green@moxielogic.com> + + * Makefile.am (EXTRA_DIST): Add missing files. + * testsuite/Makefile.am (EXTRA_DIST): Ditto. + * Makefile.in: Rebuilt. + +2013-02-08 Anthony Green <green@moxielogic.com> + + * configure.ac: Move sparc asm config checks to within functions + for compatibility with sun tools. + * configure: Rebuilt. + * src/sparc/ffi.c (ffi_prep_closure_loc): Flush cache on v9 + systems. + * src/sparc/v8.S (ffi_flush_icache): Implement a sparc v9 cache + flusher. + +2013-02-08 Nathan Rossi <nathan.rossi@xilinx.com> + + * src/microblaze/ffi.c (ffi_closure_call_SYSV): Fix handling of + small big-endian structures. + (ffi_prep_args): Ditto. + +2013-02-07 Anthony Green <green@moxielogic.com> + + * src/sparc/v8.S (ffi_call_v8): Fix typo from last patch + (effectively hiding ffi_call_v8). + +2013-02-07 Anthony Green <green@moxielogic.com> + + * configure.ac: Update bug reporting address. + * configure.in: Rebuild. + + * src/sparc/v8.S (ffi_flush_icache): Out-of-line cache flusher for + Sun compiler. + * src/sparc/ffi.c (ffi_call): Remove warning. + Call ffi_flush_icache for non-GCC builds. + (ffi_prep_closure_loc): Use ffi_flush_icache. + + * Makefile.am (EXTRA_DIST): Add libtool-ldflags. + * Makefile.in: Rebuilt. + * libtool-ldflags: New file. + +2013-02-07 Daniel Schepler <dschepler@gmail.com> + + * configure.ac: Correctly identify x32 systems as 64-bit. + * m4/libtool.m4: Remove libtool expr error. + * aclocal.m4, configure: Rebuilt. + +2013-02-07 Anthony Green <green@moxielogic.com> + + * configure.ac: Fix GCC usage test. + * configure: Rebuilt. + * README: Mention LLVM/GCC x86_64 issue. + * testsuite/Makefile.in: Rebuilt. + +2013-02-07 Anthony Green <green@moxielogic.com> + + * testsuite/libffi.call/cls_double_va.c (main): Replace // style + comments with /* */ for xlc compiler. + * testsuite/libffi.call/stret_large.c (main): Ditto. + * testsuite/libffi.call/stret_large2.c (main): Ditto. + * testsuite/libffi.call/nested_struct1.c (main): Ditto. + * testsuite/libffi.call/huge_struct.c (main): Ditto. + * testsuite/libffi.call/float_va.c (main): Ditto. + * testsuite/libffi.call/cls_struct_va1.c (main): Ditto. + * testsuite/libffi.call/cls_pointer_stack.c (main): Ditto. + * testsuite/libffi.call/cls_pointer.c (main): Ditto. + * testsuite/libffi.call/cls_longdouble_va.c (main): Ditto. + +2013-02-06 Anthony Green <green@moxielogic.com> + + * man/ffi_prep_cif.3: Clean up for debian lintian checker. + +2013-02-06 Anthony Green <green@moxielogic.com> + + * Makefile.am (pkgconfigdir): Add missing pkgconfig install bits. + * Makefile.in: Rebuild. + +2013-02-02 Mark H Weaver <mhw@netris.org> + + * src/x86/ffi64.c (ffi_call): Sign-extend integer arguments passed + via general purpose registers. + +2013-01-21 Nathan Rossi <nathan.rossi@xilinx.com> + + * README: Add MicroBlaze details. + * Makefile.am: Add MicroBlaze support. + * configure.ac: Likewise. + * src/microblaze/ffi.c: New. + * src/microblaze/ffitarget.h: Likewise. + * src/microblaze/sysv.S: Likewise. + +2013-01-21 Nathan Rossi <nathan.rossi@xilinx.com> + * testsuite/libffi.call/return_uc.c: Fixed issue. + +2013-01-21 Chris Zankel <chris@zankel.net> + + * README: Add Xtensa support. + * Makefile.am: Likewise. + * configure.ac: Likewise. + * Makefile.in Regenerate. + * configure: Likewise. + * src/prep_cif.c: Handle Xtensa. + * src/xtensa: New directory. + * src/xtensa/ffi.c: New file. + * src/xtensa/ffitarget.h: Ditto. + * src/xtensa/sysv.S: Ditto. + +2013-01-11 Anthony Green <green@moxielogic.com> + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Replace // style + comments with /* */ for xlc compiler. + * src/powerpc/aix.S (ffi_call_AIX): Ditto. + * testsuite/libffi.call/ffitest.h (allocate_mmap): Delete + deprecated inline function. + * testsuite/libffi.special/ffitestcxx.h: Ditto. + * README: Add update for AIX support. + +2013-01-11 Anthony Green <green@moxielogic.com> + + * configure.ac: Robustify pc relative reloc check. + * m4/ax_cc_maxopt.m4: Don't -malign-double. This is an ABI + changing option for 32-bit x86. + * aclocal.m4, configure: Rebuilt. + * README: Update supported target list. + +2013-01-10 Anthony Green <green@moxielogic.com> + + * README (tested): Add Compiler column to table. + +2013-01-10 Anthony Green <green@moxielogic.com> + + * src/x86/ffi64.c (struct register_args): Make sse array and array + of unions for sunpro compiler compatibility. + +2013-01-10 Anthony Green <green@moxielogic.com> + + * configure.ac: Test target platform size_t size. Handle both 32 + and 64-bit builds for x86_64-* and i?86-* targets (allowing for + CFLAG option to change default settings). + * configure, aclocal.m4: Rebuilt. + +2013-01-10 Anthony Green <green@moxielogic.com> + + * testsuite/libffi.special/special.exp: Only run exception + handling tests when using GNU compiler. + + * m4/ax_compiler_vendor.m4: New file. + * configure.ac: Test for compiler vendor and don't use + AX_CFLAGS_WARN_ALL with the sun compiler. + * aclocal.m4, configure: Rebuilt. + +2013-01-10 Anthony Green <green@moxielogic.com> + + * include/ffi_common.h: Don't use GCCisms to define types when + building with the SUNPRO compiler. + +2013-01-10 Anthony Green <green@moxielogic.com> + + * configure.ac: Put local.exp in the right place. + * configure: Rebuilt. + + * src/x86/ffi.c: Update comment about regparm function attributes. + * src/x86/sysv.S (ffi_closure_SYSV): The SUNPRO compiler requires + that all function arguments be passed on the stack (no regparm + support). + +2013-01-08 Anthony Green <green@moxielogic.com> + + * configure.ac: Generate local.exp. This sets CC_FOR_TARGET + when we are using the vendor compiler. + * testsuite/Makefile.am (EXTRA_DEJAGNU_SITE_CONFIG): Point to + ../local.exp. + * configure, testsuite/Makefile.in: Rebuilt. + + * testsuite/libffi.call/call.exp: Run tests with different + options, depending on whether or not we are using gcc or the + vendor compiler. + * testsuite/lib/libffi.exp (libffi-init): Set using_gcc based on + whether or not we are building/testing with gcc. + +2013-01-08 Anthony Green <green@moxielogic.com> + + * configure.ac: Switch x86 solaris target to X86 by default. + * configure: Rebuilt. + +2013-01-08 Anthony Green <green@moxielogic.com> + + * configure.ac: Fix test for read-only eh_frame. + * configure: Rebuilt. + +2013-01-08 Anthony Green <green@moxielogic.com> + + * src/x86/sysv.S, src/x86/unix64.S: Only emit DWARF unwind info + when building with the GNU toolchain. + * testsuite/libffi.call/ffitest.h (CHECK): Fix for Solaris vendor + compiler. + +2013-01-07 Thorsten Glaser <tg@mirbsd.org> + + * testsuite/libffi.call/cls_uchar_va.c, + testsuite/libffi.call/cls_ushort_va.c, + testsuite/libffi.call/va_1.c: Testsuite fixes. + +2013-01-07 Thorsten Glaser <tg@mirbsd.org> + + * src/m68k/ffi.c (CIF_FLAGS_SINT8, CIF_FLAGS_SINT16): Define. + (ffi_prep_cif_machdep): Fix 8-bit and 16-bit signed calls. + * src/m68k/sysv.S (ffi_call_SYSV, ffi_closure_SYSV): Ditto. + +2013-01-04 Anthony Green <green@moxielogic.com> + + * Makefile.am (AM_CFLAGS): Don't automatically add -fexceptions + and -Wall. This is set in the configure script after testing for + GCC. + * Makefile.in: Rebuilt. + +2013-01-02 rofl0r <https://github.com/rofl0r> + + * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix build error on ppc + when long double == double. + +2013-01-02 Reini Urban <rurban@x-ray.at> + + * Makefile.am (libffi_la_LDFLAGS): Add -no-undefined to LDFLAGS + (required for shared libs on cygwin/mingw). + * Makefile.in: Rebuilt. + +2012-10-31 Alan Modra <amodra@gmail.co> + + * src/powerpc/linux64_closure.S: Add new ABI support. + * src/powerpc/linux64.S: Likewise. + +2012-10-30 Magnus Granberg <zorry@gentoo.org> + Pavel Labushev <pavel.labushev@runbox.ru> + + * configure.ac: New options pax_emutramp + * configure, fficonfig.h.in: Regenerated + * src/closures.c: New function emutramp_enabled_check() and + checks. + +2012-10-30 Frederick Cheung <frederick.cheung@gmail.com> + + * configure.ac: Enable FFI_MAP_EXEC_WRIT for Darwin 12 (mountain + lion) and future version. + * configure: Rebuild. + +2012-10-30 James Greenhalgh <james.greenhalgh at arm.com> + Marcus Shawcroft <marcus.shawcroft at arm.com> + + * README: Add details of aarch64 port. + * src/aarch64/ffi.c: New. + * src/aarch64/ffitarget.h: Likewise. + * src/aarch64/sysv.S: Likewise. + * Makefile.am: Support aarch64. + * configure.ac: Support aarch64. + * Makefile.in, configure: Rebuilt. + +2012-10-30 James Greenhalgh <james.greenhalgh at arm.com> + Marcus Shawcroft <marcus.shawcroft at arm.com> + + * testsuite/lib/libffi.exp: Add support for aarch64. + * testsuite/libffi.call/cls_struct_va1.c: New. + * testsuite/libffi.call/cls_uchar_va.c: Likewise. + * testsuite/libffi.call/cls_uint_va.c: Likewise. + * testsuite/libffi.call/cls_ulong_va.c: Likewise. + * testsuite/libffi.call/cls_ushort_va.c: Likewise. + * testsuite/libffi.call/nested_struct11.c: Likewise. + * testsuite/libffi.call/uninitialized.c: Likewise. + * testsuite/libffi.call/va_1.c: Likewise. + * testsuite/libffi.call/va_struct1.c: Likewise. + * testsuite/libffi.call/va_struct2.c: Likewise. + * testsuite/libffi.call/va_struct3.c: Likewise. + +2012-10-12 Walter Lee <walt@tilera.com> + + * Makefile.am: Add TILE-Gx/TILEPro support. + * configure.ac: Likewise. + * Makefile.in: Regenerate. + * configure: Likewise. + * src/prep_cif.c (ffi_prep_cif_core): Handle TILE-Gx/TILEPro. + * src/tile: New directory. + * src/tile/ffi.c: New file. + * src/tile/ffitarget.h: Ditto. + * src/tile/tile.S: Ditto. + +2012-10-12 Matthias Klose <doko@ubuntu.com> + + * generate-osx-source-and-headers.py: Normalize whitespace. + +2012-09-14 David Edelsohn <dje.gcc@gmail.com> + + * configure: Regenerated. + +2012-08-26 Andrew Pinski <apinski@cavium.com> + + PR libffi/53014 + * src/mips/ffi.c (ffi_prep_closure_loc): Allow n32 with soft-float and n64 with + soft-float. + +2012-08-08 Uros Bizjak <ubizjak@gmail.com> + + * src/s390/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, + just return FFI_BAD_ABI when things are wrong. + +2012-07-18 H.J. Lu <hongjiu.lu@intel.com> + + PR libffi/53982 + PR libffi/53973 + * src/x86/ffitarget.h: Check __ILP32__ instead of __LP64__ for x32. + (FFI_SIZEOF_JAVA_RAW): Defined to 4 for x32. + +2012-05-16 H.J. Lu <hongjiu.lu@intel.com> + + * configure: Regenerated. + +2012-05-05 Nicolas Lelong + + * libffi.xcodeproj/project.pbxproj: Fixes. + * README: Update for iOS builds. + +2012-04-23 Alexandre Keunecke I. de Mendonca <alexandre.keunecke@gmail.com> + + * configure.ac: Add Blackfin/sysv support + * Makefile.am: Add Blackfin/sysv support + * src/bfin/ffi.c: Add Blackfin/sysv support + * src/bfin/ffitarget.h: Add Blackfin/sysv support + +2012-04-11 Anthony Green <green@moxielogic.com> + + * Makefile.am (EXTRA_DIST): Add new script. + * Makefile.in: Rebuilt. + +2012-04-11 Zachary Waldowski <zwaldowski@gmail.com> + + * generate-ios-source-and-headers.py, + libffi.xcodeproj/project.pbxproj: Support a Mac static library via + Xcode. Set iOS compatibility to 4.0. Move iOS trampoline + generation into an Xcode "run script" phase. Include both as + Xcode build scripts. Don't always regenerate config files. + +2012-04-10 Anthony Green <green@moxielogic.com> + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Add missing semicolon. + +2012-04-06 Anthony Green <green@moxielogic.com> + + * Makefile.am (EXTRA_DIST): Add new iOS/xcode files. + * Makefile.in: Rebuilt. + +2012-04-06 Mike Lewis <mikelikespie@gmail.com> + + * generate-ios-source-and-headers.py: New file. + * libffi.xcodeproj/project.pbxproj: New file. + * README: Update instructions on building iOS binary. + * build-ios.sh: Delete. + +2012-04-06 Anthony Green <green@moxielogic.com> + + * src/x86/ffi64.c (UINT128): Define differently for Intel and GNU + compilers, then use it. + +2012-04-06 H.J. Lu <hongjiu.lu@intel.com> + + * m4/libtool.m4 (_LT_ENABLE_LOCK): Support x32. + +2012-04-06 Anthony Green <green@moxielogic.com> + + * testsuite/Makefile.am (EXTRA_DIST): Add missing test cases. + * testsuite/Makefile.in: Rebuilt. + +2012-04-05 Zachary Waldowski <zwaldowski@gmail.com> + + * include/ffi.h.in: Add missing trampoline table fields. + * src/arm/sysv.S: Fix ENTRY definition, and wrap symbol references + in CNAME. + * src/x86/ffi.c: Wrap Windows specific code in ifdefs. + +2012-04-02 Peter Bergner <bergner@vnet.ibm.com> + + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp. + Silence casting pointer to integer of different size warning. + Delete goto to previously deleted label. + (ffi_call): Silence possibly undefined warning. + (ffi_closure_helper_SYSV): Declare variable type. + +2012-04-02 Peter Rosin <peda@lysator.liu.se> + + * src/x86/win32.S (ffi_call_win32): Sign/zero extend the return + value in the Intel version as is already done for the AT&T version. + (ffi_closure_SYSV): Likewise. + (ffi_closure_raw_SYSV): Likewise. + (ffi_closure_STDCALL): Likewise. + +2012-03-29 Peter Rosin <peda@lysator.liu.se> + + * src/x86/win32.S (ffi_closure_raw_THISCALL): Unify the frame + generation, fix the ENDP label and remove the surplus third arg + from the 'lea' insn. + +2012-03-29 Peter Rosin <peda@lysator.liu.se> + + * src/x86/win32.S (ffi_closure_raw_SYSV): Make the 'stubraw' label + visible outside the PROC, so that ffi_closure_raw_THISCALL can see + it. Also instruct the assembler to add a frame to the function. + +2012-03-23 Peter Rosin <peda@lysator.liu.se> + + * Makefile.am (AM_CPPFLAGS): Add -DFFI_BUILDING. + * Makefile.in: Rebuilt. + * include/ffi.h.in [MSVC]: Add __declspec(dllimport) decorations + to all data exports, when compiling libffi clients using MSVC. + +2012-03-29 Peter Rosin <peda@lysator.liu.se> + + * src/x86/ffitarget.h (ffi_abi): Add new ABI FFI_MS_CDECL and + make it the default for MSVC. + (FFI_TYPE_MS_STRUCT): New structure return convention. + * src/x86/ffi.c (ffi_prep_cif_machdep): Tweak the structure + return convention for FFI_MS_CDECL to be FFI_TYPE_MS_STRUCT + instead of an ordinary FFI_TYPE_STRUCT. + (ffi_prep_args): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. + (ffi_call): Likewise. + (ffi_prep_incoming_args_SYSV): Likewise. + (ffi_raw_call): Likewise. + (ffi_prep_closure_loc): Treat FFI_MS_CDECL as FFI_SYSV. + * src/x86/win32.S (ffi_closure_SYSV): For FFI_TYPE_MS_STRUCT, + return a pointer to the result structure in eax and don't pop + that pointer from the stack, the caller takes care of it. + (ffi_call_win32): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. + (ffi_closure_raw_SYSV): Likewise. + +2012-03-22 Peter Rosin <peda@lysator.liu.se> + + * testsuite/libffi.call/closure_stdcall.c [MSVC]: Add inline + assembly version with Intel syntax. + * testsuite/libffi.call/closure_thiscall.c [MSVC]: Likewise. + +2012-03-23 Peter Rosin <peda@lysator.liu.se> + + * testsuite/libffi.call/ffitest.h: Provide abstration of + __attribute__((fastcall)) in the form of a __FASTCALL__ + define. Define it to __fastcall for MSVC. + * testsuite/libffi.call/fastthis1_win32.c: Use the above. + * testsuite/libffi.call/fastthis2_win32.c: Likewise. + * testsuite/libffi.call/fastthis3_win32.c: Likewise. + * testsuite/libffi.call/strlen2_win32.c: Likewise. + * testsuite/libffi.call/struct1_win32.c: Likewise. + * testsuite/libffi.call/struct2_win32.c: Likewise. + +2012-03-22 Peter Rosin <peda@lysator.liu.se> + + * src/x86/win32.S [MSVC] (ffi_closure_THISCALL): Remove the manual + frame on function entry, MASM adds one automatically. + +2012-03-22 Peter Rosin <peda@lysator.liu.se> + + * testsuite/libffi.call/ffitest.h [MSVC]: Add kludge for missing + bits in the MSVC headers. + +2012-03-22 Peter Rosin <peda@lysator.liu.se> + + * testsuite/libffi.call/cls_12byte.c: Adjust to the C89 style + with no declarations after statements. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_18byte.c: Likewise. + * testsuite/libffi.call/cls_19byte.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_20byte1.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_5_1_byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + * testsuite/libffi.call/cls_64byte.c: Likewise. + * testsuite/libffi.call/cls_6_1_byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7_1_byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_9byte1.c: Likewise. + * testsuite/libffi.call/cls_9byte2.c: Likewise. + * testsuite/libffi.call/cls_align_double.c: Likewise. + * testsuite/libffi.call/cls_align_float.c: Likewise. + * testsuite/libffi.call/cls_align_longdouble.c: Likewise. + * testsuite/libffi.call/cls_align_longdouble_split.c: Likewise. + * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. + * testsuite/libffi.call/cls_align_pointer.c: Likewise. + * testsuite/libffi.call/cls_align_sint16.c: Likewise. + * testsuite/libffi.call/cls_align_sint32.c: Likewise. + * testsuite/libffi.call/cls_align_sint64.c: Likewise. + * testsuite/libffi.call/cls_align_uint16.c: Likewise. + * testsuite/libffi.call/cls_align_uint32.c: Likewise. + * testsuite/libffi.call/cls_align_uint64.c: Likewise. + * testsuite/libffi.call/cls_dbls_struct.c: Likewise. + * testsuite/libffi.call/cls_pointer_stack.c: Likewise. + * testsuite/libffi.call/err_bad_typedef.c: Likewise. + * testsuite/libffi.call/huge_struct.c: Likewise. + * testsuite/libffi.call/nested_struct.c: Likewise. + * testsuite/libffi.call/nested_struct1.c: Likewise. + * testsuite/libffi.call/nested_struct10.c: Likewise. + * testsuite/libffi.call/nested_struct2.c: Likewise. + * testsuite/libffi.call/nested_struct3.c: Likewise. + * testsuite/libffi.call/nested_struct4.c: Likewise. + * testsuite/libffi.call/nested_struct5.c: Likewise. + * testsuite/libffi.call/nested_struct6.c: Likewise. + * testsuite/libffi.call/nested_struct7.c: Likewise. + * testsuite/libffi.call/nested_struct8.c: Likewise. + * testsuite/libffi.call/nested_struct9.c: Likewise. + * testsuite/libffi.call/stret_large.c: Likewise. + * testsuite/libffi.call/stret_large2.c: Likewise. + * testsuite/libffi.call/stret_medium.c: Likewise. + * testsuite/libffi.call/stret_medium2.c: Likewise. + * testsuite/libffi.call/struct1.c: Likewise. + * testsuite/libffi.call/struct1_win32.c: Likewise. + * testsuite/libffi.call/struct2.c: Likewise. + * testsuite/libffi.call/struct2_win32.c: Likewise. + * testsuite/libffi.call/struct3.c: Likewise. + * testsuite/libffi.call/struct4.c: Likewise. + * testsuite/libffi.call/struct5.c: Likewise. + * testsuite/libffi.call/struct6.c: Likewise. + * testsuite/libffi.call/struct7.c: Likewise. + * testsuite/libffi.call/struct8.c: Likewise. + * testsuite/libffi.call/struct9.c: Likewise. + * testsuite/libffi.call/testclosure.c: Likewise. + +2012-03-21 Peter Rosin <peda@lysator.liu.se> + + * testsuite/libffi.call/float_va.c (float_va_fn): Use %f when + printing doubles (%lf is for long doubles). + (main): Likewise. + +2012-03-21 Peter Rosin <peda@lysator.liu.se> + + * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] + (set_ld_library_path_env_vars): Add the library search dir to PATH + (and save PATH for later). + (restore_ld_library_path_env_vars): Restore PATH. + +2012-03-21 Peter Rosin <peda@lysator.liu.se> + + * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] + (set_ld_library_path_env_vars): Add the library search dir to PATH + (and save PATH for later). + (restore_ld_library_path_env_vars): Restore PATH. + +2012-03-20 Peter Rosin <peda@lysator.liu.se> + + * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. + * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label + visible outside the PROC, so that ffi_closure_THISCALL can see it. + +2012-03-20 Peter Rosin <peda@lysator.liu.se> + + * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. + * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label + visible outside the PROC, so that ffi_closure_THISCALL can see it. + +2012-03-19 Alan Hourihane <alanh@fairlite.co.uk> + + * src/m68k/ffi.c: Add MINT support. + * src/m68k/sysv.S: Ditto. + +2012-03-06 Chung-Lin Tang <cltang@codesourcery.com> + + * src/arm/ffi.c (ffi_call): Add __ARM_EABI__ guard around call to + ffi_call_VFP(). + (ffi_prep_closure_loc): Add __ARM_EABI__ guard around use of + ffi_closure_VFP. + * src/arm/sysv.S: Add __ARM_EABI__ guard around VFP code. + +2012-03-19 chennam <csit@axway.com> + + * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure + support. + +2012-03-13 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, + just return FFI_BAD_ABI when things are wrong. + * src/sh64/ffi.c (ffi_prep_closure_loc): Ditto. + +2012-03-09 David Edelsohn <dje.gcc@gmail.com> + + * src/powerpc/aix_closure.S (ffi_closure_ASM): Adjust for Darwin64 + change to return value of ffi_closure_helper_DARWIN and load type + from return type. + +2012-03-03 H.J. Lu <hongjiu.lu@intel.com> + + * src/x86/ffi64.c (ffi_call): Cast the return value to unsigned + long. + (ffi_prep_closure_loc): Cast to 64bit address in trampoline. + (ffi_closure_unix64_inner): Cast return pointer to unsigned long + first. + + * src/x86/ffitarget.h (FFI_SIZEOF_ARG): Defined to 8 for x32. + (ffi_arg): Set to unsigned long long for x32. + (ffi_sarg): Set to long long for x32. + +2012-03-03 H.J. Lu <hongjiu.lu@intel.com> + + * src/prep_cif.c (ffi_prep_cif_core): Properly check bad ABI. + +2012-03-03 Andoni Morales Alastruey <ylatuya@gmail.com> + + * configure.ac: Add -no-undefined for both 32- and 64-bit x86 + windows-like hosts. + * configure: Rebuilt. + +2012-02-27 Mikael Pettersson <mikpe@it.uu.se> + + PR libffi/52223 + * Makefile.am (FLAGS_TO_PASS): Define. + * Makefile.in: Regenerate. + +2012-02-23 Anthony Green <green@moxielogic.com> + + * src/*/ffitarget.h: Ensure that users never include ffitarget.h + directly. + +2012-02-23 Kai Tietz <ktietz@redhat.com> + + PR libffi/52221 + * src/x86/ffi.c (ffi_closure_raw_THISCALL): New + prototype. + (ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for + thiscall-convention. + (ffi_raw_call): Use ffi_prep_args_raw. + * src/x86/win32.S (ffi_closure_raw_THISCALL): Add + implementation for stub. + +2012-02-10 Kai Tietz <ktietz@redhat.com> + + * configure.ac (AM_LTLDFLAGS): Add -no-undefine for x64 + windows target. + * configure: Regenerated. + +2012-02-08 Kai Tietz <ktietz@redhat.com> + + * src/prep_cif.c (ffi_prep_cif): Allow for X86_WIN32 + also FFI_THISCALL. + * src/x86/ffi.c (ffi_closure_THISCALL): Add prototype. + (FFI_INIT_TRAMPOLINE_THISCALL): New trampoline code. + (ffi_prep_closure_loc): Add FFI_THISCALL support. + * src/x86/ffitarget.h (FFI_TRAMPOLINE_SIZE): Adjust size. + * src/x86/win32.S (ffi_closure_THISCALL): New closure code + for thiscall-calling convention. + * testsuite/libffi.call/closure_thiscall.c: New test. + +2012-01-28 Kai Tietz <ktietz@redhat.com> + + * src/libffi/src/x86/ffi.c (ffi_call_win32): Add new + argument to prototype for specify calling-convention. + (ffi_call): Add support for stdcall/thiscall convention. + (ffi_prep_args): Likewise. + (ffi_raw_call): Likewise. + * src/x86/ffitarget.h (ffi_abi): Add FFI_THISCALL and + FFI_FASTCALL. + * src/x86/win32.S (_ffi_call_win32): Add support for + fastcall/thiscall calling-convention calls. + * testsuite/libffi.call/fastthis1_win32.c: New test. + * testsuite/libffi.call/fastthis2_win32.c: New test. + * testsuite/libffi.call/fastthis3_win32.c: New test. + * testsuite/libffi.call/strlen2_win32.c: New test. + * testsuite/libffi.call/many2_win32.c: New test. + * testsuite/libffi.call/struct1_win32.c: New test. + * testsuite/libffi.call/struct2_win32.c: New test. + +2012-01-23 Uros Bizjak <ubizjak@gmail.com> + + * src/alpha/ffi.c (ffi_prep_closure_loc): Check for bad ABI. + +2012-01-23 Anthony Green <green@moxielogic.com> + Chris Young <cdyoung@ntlworld.com> + + * configure.ac: Add Amiga support. + * configure: Rebuilt. + +2012-01-23 Dmitry Nadezhin <dmitry.nadezhin@gmail.com> + + * include/ffi_common.h (LIKELY, UNLIKELY): Fix definitions. + +2012-01-23 Andreas Schwab <schwab@linux-m68k.org> + + * src/m68k/sysv.S (ffi_call_SYSV): Properly test for plain + mc68000. Test for __HAVE_68881__ in addition to __MC68881__. + +2012-01-19 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/48496 + * src/ia64/ffi.c (ffi_call): Fix up aliasing violations. + +2012-01-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * configure.ac (i?86-*-*): Set TARGET to X86_64. + * configure: Regenerate. + +2011-12-07 Andrew Pinski <apinski@cavium.com> + + PR libffi/50051 + * src/mips/n32.S: Add ".set mips4". + +2011-11-21 Andreas Tobler <andreast@fgznet.ch> + + * configure: Regenerate. + +2011-11-12 David Gilbert <david.gilbert@linaro.org> + + * doc/libffi.texi, include/ffi.h.in, include/ffi_common.h, + man/Makefile.am, man/ffi.3, man/ffi_prep_cif.3, + man/ffi_prep_cif_var.3, src/arm/ffi.c, src/arm/ffitarget.h, + src/cris/ffi.c, src/prep_cif.c, + testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/float_va.c: Many changes to support variadic + function calls. + +2011-11-12 Kyle Moffett <Kyle.D.Moffett@boeing.com> + + * src/powerpc/ffi.c, src/powerpc/ffitarget.h, + src/powerpc/ppc_closure.S, src/powerpc/sysv.S: Many changes for + softfloat powerpc variants. + +2011-11-12 Petr Salinger <Petr.Salinger@seznam.cz> + + * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Fix kfreebsd support. + * configure: Rebuilt. + +2011-11-12 Timothy Wall <twall@users.sf.net> + + * src/arm/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): Max + alignment of 4 for wince on ARM. + +2011-11-12 Kyle Moffett <Kyle.D.Moffett@boeing.com> + Anthony Green <green@moxielogic.com> + + * src/ppc/sysv.S, src/ppc/ffi.c: Remove use of ppc string + instructions (not available on some cores, like the PPC440). + +2011-11-12 Kimura Wataru <kimuraw@i.nifty.jp> + + * m4/ax_enable_builddir: Change from string comparison to numeric + comparison for wc output. + * configure.ac: Enable FFI_MMAP_EXEC_WRIT for darwin11 aka Mac OS + X 10.7. + * configure: Rebuilt. + +2011-11-12 Anthony Green <green@moxielogic.com> + + * Makefile.am (AM_CCASFLAGS): Add -g option to build assembly + files with debug info. + * Makefile.in: Rebuilt. + +2011-11-12 Jasper Lievisse Adriaanse <jasper@openbsd.org> + + * README: Update list of supported OpenBSD systems. + +2011-11-12 Anthony Green <green@moxielogic.com> + + * libtool-version: Update. + * Makefile.am (nodist_libffi_la_SOURCES): Add src/debug.c if + FFI_DEBUG. + (libffi_la_SOURCES): Remove src/debug.c + (EXTRA_DIST): Add src/debug.c + * Makefile.in: Rebuilt. + * README: Update for 3.0.11. + +2011-11-10 Richard Henderson <rth@redhat.com> + + * configure.ac (GCC_AS_CFI_PSEUDO_OP): Use it instead of inline check. + * configure, aclocal.m4: Rebuild. + +2011-09-04 Iain Sandoe <iains@gcc.gnu.org> + + PR libffi/49594 + * src/powerpc/darwin_closure.S (stubs): Make the stub binding + helper reference track the architecture pointer size. + +2011-08-25 Andrew Haley <aph@redhat.com> + + * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Remove hard-coded assembly + instructions. + * src/arm/sysv.S (ffi_arm_trampoline): Put them here instead. + +2011-07-11 Andrew Haley <aph@redhat.com> + + * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Clear icache. + +2011-06-29 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * testsuite/libffi.call/cls_double_va.c: Move PR number to comment. + * testsuite/libffi.call/cls_longdouble_va.c: Likewise. + +2011-06-29 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + PR libffi/46660 + * testsuite/libffi.call/cls_double_va.c: xfail dg-output on + mips-sgi-irix6*. + * testsuite/libffi.call/cls_longdouble_va.c: Likewise. + +2011-06-14 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * testsuite/libffi.call/huge_struct.c (test_large_fn): Use PRIu8, + PRId8 instead of %hhu, %hhd. + * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRId8, + PRIu8): Define. + [__sgi__] (PRId8, PRIu8): Define. + +2011-04-29 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * src/alpha/osf.S (UA_SI, FDE_ENCODING, FDE_ENCODE, FDE_ARANGE): + Define. + Use them to handle ELF vs. ECOFF differences. + [__osf__] (_GLOBAL__F_ffi_call_osf): Define. + +2011-03-30 Timothy Wall <twall@users.sf.net> + + * src/powerpc/darwin.S: Fix unknown FDE encoding. + * src/powerpc/darwin_closure.S: ditto. + +2011-02-25 Anthony Green <green@moxielogic.com> + + * src/powerpc/ffi.c (ffi_prep_closure_loc): Allow for more + 32-bit ABIs. + +2011-02-15 Anthony Green <green@moxielogic.com> + + * m4/ax_cc_maxopt.m4: Don't -malign-double or use -ffast-math. + * configure: Rebuilt. + +2011-02-13 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * configure: Regenerate. + +2011-02-13 Anthony Green <green@moxielogic.com> + + * include/ffi_common.h (UNLIKELY, LIKELY): Define. + * src/x86/ffi64.c (UNLIKELY, LIKELY): Remove definition. + * src/prep_cif.c (UNLIKELY, LIKELY): Remove definition. + + * src/prep_cif.c (initialize_aggregate): Convert assertion into + FFI_BAD_TYPEDEF return. Initialize arg size and alignment to 0. + + * src/pa/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, + just return FFI_BAD_ABI when things are wrong. + * src/arm/ffi.c (ffi_prep_closure_loc): Ditto. + * src/powerpc/ffi.c (ffi_prep_closure_loc): Ditto. + * src/mips/ffi.c (ffi_prep_closure_loc): Ditto. + * src/ia64/ffi.c (ffi_prep_closure_loc): Ditto. + * src/avr32/ffi.c (ffi_prep_closure_loc): Ditto. + +2011-02-11 Anthony Green <green@moxielogic.com> + + * src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, + just return FFI_BAD_ABI when things are wrong. + +2012-02-11 Eric Botcazou <ebotcazou@adacore.com> + + * src/sparc/v9.S (STACKFRAME): Bump to 176. + +2011-02-09 Stuart Shelton <srcshelton@gmail.com> + + http://bugs.gentoo.org/show_bug.cgi?id=286911 + * src/mips/ffitarget.h: Clean up error messages. + * src/java_raw_api.c (ffi_java_translate_args): Cast raw arg to + ffi_raw*. + * include/ffi.h.in: Add pragma for SGI compiler. + +2011-02-09 Anthony Green <green@moxielogic.com> + + * configure.ac: Add powerpc64-*-darwin* support. + +2011-02-09 Anthony Green <green@moxielogic.com> + + * README: Mention Interix. + +2011-02-09 Jonathan Callen <abcd@gentoo.org> + + * configure.ac: Add Interix to win32/cygwin/mingw case. + * configure: Ditto. + * src/closures.c: Treat Interix like Cygwin, instead of as a + generic win32. + +2011-02-09 Anthony Green <green@moxielogic.com> + + * testsuite/libffi.call/err_bad_typedef.c: Remove xfail. + * testsuite/libffi.call/err_bad_abi.c: Remove xfail. + * src/x86/ffi64.c (UNLIKELY, LIKELY): Define. + (ffi_prep_closure_loc): Check for bad ABI. + * src/prep_cif.c (UNLIKELY, LIKELY): Define. + (initialize_aggregate): Check for bad types. + +2011-02-09 Landon Fuller <landonf@plausible.coop> + + * Makefile.am (EXTRA_DIST): Add build-ios.sh, src/arm/gentramp.sh, + src/arm/trampoline.S. + (nodist_libffi_la_SOURCES): Add src/arc/trampoline.S. + * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Define. + * src/arm/ffi.c (ffi_trampoline_table) + (ffi_closure_trampoline_table_page, ffi_trampoline_table_entry) + (FFI_TRAMPOLINE_CODELOC_CONFIG, FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) + (FFI_TRAMPOLINE_COUNT, ffi_trampoline_lock, ffi_trampoline_tables) + (ffi_trampoline_table_alloc, ffi_closure_alloc, ffi_closure_free): + Define for FFI_EXEC_TRAMPOLINE_TABLE case (iOS). + (ffi_prep_closure_loc): Handl FFI_EXEC_TRAMPOLINE_TABLE case + separately. + * src/arm/sysv.S: Handle Apple iOS host. + * src/closures.c: Handle FFI_EXEC_TRAMPOLINE_TABLE case. + * build-ios.sh: New file. + * fficonfig.h.in, configure, Makefile.in: Rebuilt. + * README: Mention ARM iOS. + +2011-02-08 Oren Held <orenhe@il.ibm.com> + + * src/dlmalloc.c (_STRUCT_MALLINFO): Define in order to avoid + redefinition of mallinfo on HP-UX. + +2011-02-08 Ginn Chen <ginn.chen@oracle.com> + + * src/sparc/ffi.c (ffi_call): Make compatible with Solaris Studio + aggregate return ABI. Flush cache. + (ffi_prep_closure_loc): Flush cache. + +2011-02-11 Anthony Green <green@moxielogic.com> + + From Tom Honermann <tom.honermann@oracle.com>: + * src/powerpc/aix.S (ffi_call_AIX): Support for xlc toolchain on + AIX. Declare .ffi_prep_args. Insert nops after branch + instructions so that the AIX linker can insert TOC reload + instructions. + * src/powerpc/aix_closure.S: Declare .ffi_closure_helper_DARWIN. + +2011-02-08 Ed <ed@kdtc.net> + + * src/powerpc/asm.h: Fix grammar nit in comment. + +2011-02-08 Uli Link <ul.mcamafia@linkitup.de> + + * include/ffi.h.in (FFI_64_BIT_MAX): Define and use. + +2011-02-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + PR libffi/46661 + * testsuite/libffi.call/cls_pointer.c (main): Cast void * to + uintptr_t first. + * testsuite/libffi.call/cls_pointer_stack.c (main): Likewise. + +2011-02-08 Rafael Avila de Espindola <respindola@mozilla.com> + + * configure.ac: Fix x86 test for pc related relocs. + * configure: Rebuilt. + +2011-02-07 Joel Sherrill <joel.sherrill@oarcorp.com> + + * libffi/src/m68k/ffi.c: Add RTEMS support for cache flushing. + Handle case when CPU variant does not have long double support. + * libffi/src/m68k/sysv.S: Add support for mc68000, Coldfire, + and cores with soft floating point. + +2011-02-07 Joel Sherrill <joel.sherrill@oarcorp.com> + + * configure.ac: Add mips*-*-rtems* support. + * configure: Regenerate. + * src/mips/ffitarget.h: Ensure needed constants are available + for targets which do not have sgidefs.h. + +2011-01-26 Dave Korn <dave.korn.cygwin@gmail.com> + + PR target/40125 + * configure.ac (AM_LTLDFLAGS): Add -bindir option for windows DLLs. + * configure: Regenerate. + +2010-12-18 Iain Sandoe <iains@gcc.gnu.org> + + PR libffi/29152 + PR libffi/42378 + * src/powerpc/darwin_closure.S: Provide Darwin64 implementation, + update comments. + * src/powerpc/ffitarget.h (POWERPC_DARWIN64): New, + (FFI_TRAMPOLINE_SIZE): Update for Darwin64. + * src/powerpc/darwin.S: Provide Darwin64 implementation, + update comments. + * src/powerpc/ffi_darwin.c: Likewise. + +2010-12-06 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * configure.ac (libffi_cv_as_ascii_pseudo_op): Use double + backslashes. + (libffi_cv_as_string_pseudo_op): Likewise. + * configure: Regenerate. + +2010-12-03 Chung-Lin Tang <cltang@codesourcery.com> + + * src/arm/sysv.S (ffi_closure_SYSV): Add UNWIND to .pad directive. + (ffi_closure_VFP): Same. + (ffi_call_VFP): Move down to before ffi_closure_VFP. Add '.fpu vfp' + directive. + +2010-12-01 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * testsuite/libffi.call/ffitest.h [__sgi] (PRId64, PRIu64): Define. + (PRIuPTR): Define. + +2010-11-29 Richard Henderson <rth@redhat.com> + Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * src/x86/sysv.S (FDE_ENCODING, FDE_ENCODE): Define. + (.eh_frame): Use FDE_ENCODING. + (.LASFDE1, .LASFDE2, LASFDE3): Simplify with FDE_ENCODE. + +2010-11-22 Jacek Caban <jacek@codeweavers.com> + + * configure.ac: Check for symbol underscores on mingw-w64. + * configure: Rebuilt. + * src/x86/win64.S: Correctly access extern symbols in respect to + underscores. + +2010-11-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * testsuite/lib/libffi-dg.exp: Rename ... + * testsuite/lib/libffi.exp: ... to this. + * libffi/testsuite/libffi.call/call.exp: Don't load libffi-dg.exp. + * libffi/testsuite/libffi.special/special.exp: Likewise. + +2010-10-28 Chung-Lin Tang <cltang@codesourcery.com> + + * src/arm/ffi.c (ffi_prep_args): Add VFP register argument handling + code, new parameter, and return value. Update comments. + (ffi_prep_cif_machdep): Add case for VFP struct return values. Add + call to layout_vfp_args(). + (ffi_call_SYSV): Update declaration. + (ffi_call_VFP): New declaration. + (ffi_call): Add VFP struct return conditions. Call ffi_call_VFP() + when ABI is FFI_VFP. + (ffi_closure_VFP): New declaration. + (ffi_closure_SYSV_inner): Add new vfp_args parameter, update call to + ffi_prep_incoming_args_SYSV(). + (ffi_prep_incoming_args_SYSV): Update parameters. Add VFP argument + case handling. + (ffi_prep_closure_loc): Pass ffi_closure_VFP to trampoline + construction under VFP hard-float. + (rec_vfp_type_p): New function. + (vfp_type_p): Same. + (place_vfp_arg): Same. + (layout_vfp_args): Same. + * src/arm/ffitarget.h (ffi_abi): Add FFI_VFP. Define FFI_DEFAULT_ABI + based on __ARM_PCS_VFP. + (FFI_EXTRA_CIF_FIELDS): Define for adding VFP hard-float specific + fields. + (FFI_TYPE_STRUCT_VFP_FLOAT): Define internally used type code. + (FFI_TYPE_STRUCT_VFP_DOUBLE): Same. + * src/arm/sysv.S (ffi_call_SYSV): Change call of ffi_prep_args() to + direct call. Move function pointer load upwards. + (ffi_call_VFP): New function. + (ffi_closure_VFP): Same. + + * testsuite/lib/libffi-dg.exp (check-flags): New function. + (dg-skip-if): New function. + * testsuite/libffi.call/cls_double_va.c: Skip if target is arm*-*-* + and compiler options include -mfloat-abi=hard. + * testsuite/libffi.call/cls_longdouble_va.c: Same. + +2010-10-01 Jakub Jelinek <jakub@redhat.com> + + PR libffi/45677 + * src/x86/ffi64.c (ffi_prep_cif_machdep): Ensure cif->bytes is + a multiple of 8. + * testsuite/libffi.call/many2.c: New test. + +2010-08-20 Mark Wielaard <mjw@redhat.com> + + * src/closures.c (open_temp_exec_file_mnt): Check if getmntent_r + returns NULL. + +2010-08-09 Andreas Tobler <andreast@fgznet.ch> + + * configure.ac: Add target powerpc64-*-freebsd*. + * configure: Regenerate. + * testsuite/libffi.call/cls_align_longdouble_split.c: Pass + -mlong-double-128 only to linux targets. + * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. + * testsuite/libffi.call/cls_longdouble.c: Likewise. + * testsuite/libffi.call/huge_struct.c: Likewise. + +2010-08-05 Dan Witte <dwitte@mozilla.com> + + * Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the + debug CRT when --enable-debug is given. + * configure.ac: Define it. + * msvcc.sh: Translate -g and -DFFI_DEBUG appropriately. + +2010-08-04 Dan Witte <dwitte@mozilla.com> + + * src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64 + platforms. + * src/x86/ffi.c: Remove redundant ifdef checks. + * src/prep_cif.c: Push stack space computation into src/x86/ffi.c + for X86_ANY so return value space doesn't get added twice. + +2010-08-03 Neil Rashbrooke <neil@parkwaycc.co.uk> + + * msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy. + +2010-07-22 Dan Witte <dwitte@mozilla.com> + + * src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI. + * src/prep_cif.c: Fix ABI assertion. + * src/cris/ffi.c: Ditto. + +2010-07-10 Evan Phoenix <evan@fallingsnow.net> + + * src/closures.c (selinux_enabled_check): Fix strncmp usage bug. + +2010-07-07 Dan Horák <dan@danny.cz> + + * include/ffi.h.in: Protect #define with #ifndef. + * src/powerpc/ffitarget.h: Ditto. + * src/s390/ffitarget.h: Ditto. + * src/sparc/ffitarget.h: Ditto. + +2010-07-07 Neil Roberts <neil@linux.intel.com> + + * src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to + 16-bytes. + +2010-07-02 Jakub Jelinek <jakub@redhat.com> + + * Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes. + * Makefile.in: Regenerated. + +2010-05-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as + output, too. + (libffi_cv_as_ascii_pseudo_op): Check for .ascii. + (libffi_cv_as_string_pseudo_op): Check for .string. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * src/x86/sysv.S (.eh_frame): Use .ascii, .string or error. + +2010-05-11 Dan Witte <dwitte@mozilla.com> + + * doc/libffi.tex: Document previous change. + +2010-05-11 Makoto Kato <m_kato@ga2.so-net.ne.jp> + + * src/x86/ffi.c (ffi_call): Don't copy structs passed by value. + +2010-05-05 Michael Kohler <michaelkohler@live.com> + + * src/dlmalloc.c (dlfree): Fix spelling. + * src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto. + * configure.ac: Ditto. + * configure: Rebuilt. + +2010-04-13 Dan Witte <dwitte@mozilla.com> + + * msvcc.sh: Build with -W3 instead of -Wall. + * src/powerpc/ffi_darwin.c: Remove build warnings. + * src/x86/ffi.c: Ditto. + * src/x86/ffitarget.h: Ditto. + +2010-04-12 Dan Witte <dwitte@mozilla.com> + Walter Meinl <wuno@lsvw.de> + + * configure.ac: Add OS/2 support. + * configure: Rebuilt. + * src/closures.c: Ditto. + * src/dlmalloc.c: Ditto. + * src/x86/win32.S: Ditto. + +2010-04-07 Jakub Jelinek <jakub@redhat.com> + + * testsuite/libffi.call/err_bad_abi.c: Remove unused args variable. + +2010-04-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * Makefile.in: Regenerate. + * aclocal.m4: Regenerate. + * include/Makefile.in: Regenerate. + * man/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2010-03-30 Dan Witte <dwitte@mozilla.com> + + * msvcc.sh: Disable build warnings. + * README (tested): Clarify windows build procedure. + +2010-03-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * libffi/src/x86/unix64.S (.eh_frame) + [HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type. + +2010-03-14 Matthias Klose <doko@ubuntu.com> + + * src/x86/ffi64.c: Fix typo in comment. + * src/x86/ffi.c: Use /* ... */ comment style. + +2010-02-24 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * doc/libffi.texi (The Closure API): Fix typo. + * doc/libffi.info: Remove. + +2010-02-15 Matthias Klose <doko@ubuntu.com> + + * src/arm/sysv.S (__ARM_ARCH__): Define for processor + __ARM_ARCH_7EM__. + +2010-01-15 Anthony Green <green@redhat.com> + + * README: Add notes on building with Microsoft Visual C++. + +2010-01-15 Daniel Witte <dwitte@mozilla.com> + + * msvcc.sh: New file. + + * src/x86/win32.S: Port assembly routines to MSVC and #ifdef. + * src/x86/ffi.c: Tweak function declaration and remove excess + parens. + * include/ffi.h.in: Add __declspec(align(8)) to typedef struct + ffi_closure. + + * src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new + function ffi_call_win32 on X86_WIN32. + * src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32. + (ffi_call_STDCALL): Remove. + + * src/prep_cif.c (ffi_prep_cif): Move stack space allocation code + to ffi_prep_cif_machdep for x86. + * src/x86/ffi.c (ffi_prep_cif_machdep): To here. + +2010-01-15 Oliver Kiddle <okiddle@yahoo.co.uk> + + * src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for + Sun Studio compiler compatibility. + +2010-01-12 Conrad Irwin <conrad.irwin@gmail.com> + + * doc/libffi.texi: Add closure example. + +2010-01-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + PR libffi/40701 + * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRIdLL, + PRIuLL, PRId64, PRIu64, PRIuPTR): Define. + * testsuite/libffi.call/cls_align_sint64.c: Add -Wno-format on + alpha*-dec-osf*. + * testsuite/libffi.call/cls_align_uint64.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/return_ll1.c: Likewise. + * testsuite/libffi.call/stret_medium2.c: Likewise. + * testsuite/libffi.special/ffitestcxx.h (allocate_mmap): Cast + MAP_FAILED to char *. + +2010-01-06 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + * src/mips/n32.S: Use .abicalls and .eh_frame with __GNUC__. + +2009-12-31 Anthony Green <green@redhat.com> + + * README: Update for libffi 3.0.9. + +2009-12-27 Matthias Klose <doko@ubuntu.com> + + * configure.ac (HAVE_LONG_DOUBLE): Define for mips when + appropriate. + * configure: Rebuilt. + +2009-12-26 Anthony Green <green@redhat.com> + + * testsuite/libffi.call/cls_longdouble_va.c: Mark as xfail for + avr32*-*-*. + * testsuite/libffi.call/cls_double_va.c: Ditto. + +2009-12-26 Andreas Tobler <a.tobler@schweiz.org> + + * testsuite/libffi.call/ffitest.h: Conditionally include stdint.h + and inttypes.h. + * testsuite/libffi.special/unwindtest.cc: Ditto. + +2009-12-26 Andreas Tobler <a.tobler@schweiz.org> + + * configure.ac: Add amd64-*-openbsd*. + * configure: Rebuilt. + * testsuite/lib/libffi-dg.exp (libffi_target_compile): Link + openbsd programs with -lpthread. + +2009-12-26 Anthony Green <green@redhat.com> + + * testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c: Remove xfail for + mips*-*-* and arm*-*-*. + * testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c, + testsuite/libffi.call/stret_medium2.c, + testsuite/libffi.call/stret_medium.c, + testsuite/libffi.call/stret_large.c, + testsuite/libffi.call/stret_large2.c: Remove xfail for arm*-*-*. + +2009-12-31 Kay Tietz <ktietz70@googlemail.com> + + * testsuite/libffi.call/ffitest.h, + testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRuLL): Fix + definitions. + +2009-12-31 Carlo Bramini <carlo.bramix@libero.it> + + * configure.ac (AM_LTLDFLAGS): Define for windows hosts. + * Makefile.am (libffi_la_LDFLAGS): Add AM_LTLDFLAGS. + * configure: Rebuilt. + * Makefile.in: Rebuilt. + +2009-12-31 Anthony Green <green@redhat.com> + Blake Chaffin. + + * testsuite/libffi.call/huge_struct.c: New test case from Blake + Chaffin @ Apple. + +2009-12-28 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Copy abi and nargs to + local variables. + (aix_adjust_aggregate_sizes): New function. + (ffi_prep_cif_machdep): Call it. + +2009-12-26 Andreas Tobler <a.tobler@schweiz.org> + + * configure.ac: Define FFI_MMAP_EXEC_WRIT for the given targets. + * configure: Regenerate. + * fficonfig.h.in: Likewise. + * src/closures.c: Remove the FFI_MMAP_EXEC_WRIT definition for + Solaris/x86. + +2009-12-26 Andreas Schwab <schwab@linux-m68k.org> + + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Advance intarg_count + when a float arguments is passed in memory. + (ffi_closure_helper_SYSV): Mark general registers as used up when + a 64bit or soft-float long double argument is passed in memory. + +2009-12-25 Matthias Klose <doko@ubuntu.com> + + * man/ffi_call.3: Fix #include in examples. + * doc/libffi.texi: Add dircategory. + +2009-12-25 Frank Everdij <f.p.x.everdij@tudelft.nl> + + * include/ffi.h.in: Placed '__GNUC__' ifdef around + '__attribute__((aligned(8)))' in ffi_closure, fixes compile for + IRIX MIPSPro c99. + * include/ffi_common.h: Added '__sgi' define to non + '__attribute__((__mode__()))' integer typedefs. + * src/mips/ffi.c (ffi_call, ffi_closure_mips_inner_O32, + ffi_closure_mips_inner_N32): Added 'defined(_MIPSEB)' to BE check. + (ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added + FFI_LONGDOUBLE support and alignment(N32 only). + * src/mips/ffitarget.h: Corrected '#include <sgidefs.h>' for IRIX and + fixed non '__attribute__((__mode__()))' integer typedefs. + * src/mips/n32.S: Put '#ifdef linux' around '.abicalls' and '.eh_frame' + since they are Linux/GNU Assembler specific. + +2009-12-25 Bradley Smith <brad@brad-smith.co.uk> + + * configure.ac, Makefile.am, src/avr32/ffi.c, + src/avr32/ffitarget.h, + src/avr32/sysv.S: Add AVR32 port. + * configure, Makefile.in: Rebuilt. + +2009-12-21 Andreas Tobler <a.tobler@schweiz.org> + + * configure.ac: Make i?86 build on FreeBSD and OpenBSD. + * configure: Regenerate. + +2009-12-15 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> + + * testsuite/libffi.call/ffitest.h: Define PRIuPTR on PA HP-UX. + +2009-12-13 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> + + * src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE + type on HP-UX. + +2012-02-13 Kai Tietz <ktietz@redhat.com> + + PR libffi/52221 + * src/x86/ffi.c (ffi_prep_raw_closure_loc): Add thiscall + support for X86_WIN32. + (FFI_INIT_TRAMPOLINE_THISCALL): Fix displacement. + +2009-12-11 Eric Botcazou <ebotcazou@adacore.com> + + * src/sparc/ffi.c (ffi_closure_sparc_inner_v9): Properly align 'long + double' arguments. + +2009-12-11 Eric Botcazou <ebotcazou@adacore.com> + + * testsuite/libffi.call/ffitest.h: Define PRIuPTR on Solaris < 10. + +2009-12-10 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> + + PR libffi/40700 + * src/closures.c [X86_64 && __sun__ && __svr4__] + (FFI_MMAP_EXEC_WRIT): Define. + +2009-12-08 David Daney <ddaney@caviumnetworks.com> + + * testsuite/libffi.call/stret_medium.c: Remove xfail for mips*-*-* + * testsuite/libffi.call/cls_align_longdouble_split2.c: Same. + * testsuite/libffi.call/stret_large.c: Same. + * testsuite/libffi.call/cls_align_longdouble_split.c: Same. + * testsuite/libffi.call/stret_large2.c: Same. + * testsuite/libffi.call/stret_medium2.c: Same. + +2009-12-07 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/aix_closure.S (libffi_closure_ASM): Fix tablejump + typo. + +2009-12-05 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/aix.S: Update AIX32 code to be consistent with AIX64 + code. + * src/powerpc/aix_closure.S: Same. + +2009-12-05 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * Makefile.in: Regenerate. + * configure: Regenerate. + * include/Makefile.in: Regenerate. + * man/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2009-12-04 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/aix_closure.S: Reorganize 64-bit code to match + linux64_closure.S. + +2009-12-04 Uros Bizjak <ubizjak@gmail.com> + + PR libffi/41908 + * src/x86/ffi64.c (classify_argument): Update from + gcc/config/i386/i386.c. + (ffi_closure_unix64_inner): Do not use the address of two consecutive + SSE registers directly. + * testsuite/libffi.call/cls_dbls_struct.c (main): Remove xfail + for x86_64 linux targets. + +2009-12-04 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/ffi_darwin.c (ffi_closure_helper_DARWIN): Increment + pfr for long double split between fpr13 and stack. + +2009-12-03 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Increment next_arg and + fparg_count twice for long double. + +2009-12-03 David Edelsohn <edelsohn@gnu.org> + + PR libffi/42243 + * src/powerpc/ffi_darwin.c (ffi_prep_args): Remove extra parentheses. + +2009-12-03 Uros Bizjak <ubizjak@gmail.com> + + * testsuite/libffi.call/cls_longdouble_va.c (main): Fix format string. + Remove xfails for x86 linux targets. + +2009-12-02 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Fix typo in INT64 + case. + +2009-12-01 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/aix.S (ffi_call_AIX): Convert to more standard + register usage. Call ffi_prep_args directly. Add long double + return value support. + * src/powerpc/ffi_darwin.c (ffi_prep_args): Double arg increment + applies to FFI_TYPE_DOUBLE. Correct fpr_base increment typo. + Separate FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases. + (ffi_prep_cif_machdep): Only 16 byte stack alignment in 64 bit + mode. + (ffi_closure_helper_DARWIN): Remove nf and ng counters. Move temp + into case. + * src/powerpc/aix_closure.S: Maintain 16 byte stack alignment. + Allocate result area between params and FPRs. + +2009-11-30 David Edelsohn <edelsohn@gnu.org> + + PR target/35484 + * src/powerpc/ffitarget.h (POWERPC64): Define for PPC64 Linux and + AIX64. + * src/powerpc/aix.S: Implement AIX64 version. + * src/powerpc/aix_closure.S: Implement AIX64 version. + (ffi_closure_ASM): Use extsb, lha and displament addresses. + * src/powerpc/ffi_darwin.c (ffi_prep_args): Implement AIX64 + support. + (ffi_prep_cif_machdep): Same. + (ffi_call): Same. + (ffi_closure_helper_DARWIN): Same. + +2009-11-02 Andreas Tobler <a.tobler@schweiz.org> + + PR libffi/41908 + * testsuite/libffi.call/testclosure.c: New test. + +2009-09-28 Kai Tietz <kai.tietz@onevision.com> + + * src/x86/win64.S (_ffi_call_win64 stack): Remove for gnu + assembly version use of ___chkstk. + +2009-09-23 Matthias Klose <doko@ubuntu.com> + + PR libffi/40242, PR libffi/41443 + * src/arm/sysv.S (__ARM_ARCH__): Define for processors + __ARM_ARCH_6T2__, __ARM_ARCH_6M__, __ARM_ARCH_7__, + __ARM_ARCH_7A__, __ARM_ARCH_7R__, __ARM_ARCH_7M__. + Change the conditionals to __SOFTFP__ || __ARM_EABI__ + for -mfloat-abi=softfp to work. + +2009-09-17 Loren J. Rittle <ljrittle@acm.org> + + PR testsuite/32843 (strikes again) + * src/x86/ffi.c (ffi_prep_cif_machdep): Add X86_FREEBSD to + enable proper extension on char and short. + +2009-09-15 David Daney <ddaney@caviumnetworks.com> + + * src/java_raw_api.c (ffi_java_raw_to_rvalue): Remove special + handling for FFI_TYPE_POINTER. + * src/mips/ffitarget.h (FFI_TYPE_STRUCT_D_SOFT, + FFI_TYPE_STRUCT_F_SOFT, FFI_TYPE_STRUCT_DD_SOFT, + FFI_TYPE_STRUCT_FF_SOFT, FFI_TYPE_STRUCT_FD_SOFT, + FFI_TYPE_STRUCT_DF_SOFT, FFI_TYPE_STRUCT_SOFT): New defines. + (FFI_N32_SOFT_FLOAT, FFI_N64_SOFT_FLOAT): New ffi_abi enumerations. + (enum ffi_abi): Set FFI_DEFAULT_ABI for soft-float. + * src/mips/n32.S (ffi_call_N32): Add handling for soft-float + structure and pointer returns. + (ffi_closure_N32): Add handling for pointer returns. + * src/mips/ffi.c (ffi_prep_args, calc_n32_struct_flags, + calc_n32_return_struct_flags): Handle soft-float. + (ffi_prep_cif_machdep): Handle soft-float, fix pointer handling. + (ffi_call_N32): Declare proper argument types. + (ffi_call, copy_struct_N32, ffi_closure_mips_inner_N32): Handle + soft-float. + +2009-08-24 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * configure.ac (AC_PREREQ): Bump to 2.64. + +2009-08-22 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * Makefile.am (install-html, install-pdf): Remove. + * Makefile.in: Regenerate. + + * Makefile.in: Regenerate. + * aclocal.m4: Regenerate. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * include/Makefile.in: Regenerate. + * man/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2011-08-22 Jasper Lievisse Adriaanse <jasper@openbsd.org> + + * configure.ac: Add OpenBSD/hppa and OpenBSD/powerpc support. + * configure: Rebuilt. + +2009-07-30 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force. + +2009-07-24 Dave Korn <dave.korn.cygwin@gmail.com> + + PR libffi/40807 + * src/x86/ffi.c (ffi_prep_cif_machdep): Also use sign/zero-extending + return types for X86_WIN32. + * src/x86/win32.S (_ffi_call_SYSV): Handle omitted return types. + (_ffi_call_STDCALL, _ffi_closure_SYSV, _ffi_closure_raw_SYSV, + _ffi_closure_STDCALL): Likewise. + + * src/closures.c (is_selinux_enabled): Define to const 0 for Cygwin. + (dlmmap, dlmunmap): Also use these functions on Cygwin. + +2009-07-11 Richard Sandiford <rdsandiford@googlemail.com> + + PR testsuite/40699 + PR testsuite/40707 + PR testsuite/40709 + * testsuite/lib/libffi-dg.exp: Revert 2009-07-02, 2009-07-01 and + 2009-06-30 commits. + +2009-07-01 Richard Sandiford <r.sandiford@uk.ibm.com> + + * testsuite/lib/libffi-dg.exp (libffi-init): Set ld_library_path + to "" before adding paths. (This reinstates an assignment that + was removed by my 2009-06-30 commit, but changes the initial + value from "." to "".) + +2009-07-01 H.J. Lu <hongjiu.lu@intel.com> + + PR testsuite/40601 + * testsuite/lib/libffi-dg.exp (libffi-init): Properly set + gccdir. Adjust ld_library_path for gcc only if gccdir isn't + empty. + +2009-06-30 Richard Sandiford <r.sandiford@uk.ibm.com> + + * testsuite/lib/libffi-dg.exp (libffi-init): Don't add "." + to ld_library_path. Use add_path. Add just find_libgcc_s + to ld_library_path, not every libgcc multilib directory. + +2009-06-16 Wim Lewis <wiml@hhhh.org> + + * src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are + supposed to be callee-saved. + * src/powerpc/sysv.S (small_struct_return_value): Fix overrun of + return buffer for odd-size structs. + +2009-06-16 Andreas Tobler <a.tobler@schweiz.org> + + PR libffi/40444 + * testsuite/lib/libffi-dg.exp (libffi_target_compile): Add + allow_stack_execute for Darwin. + +2009-06-16 Andrew Haley <aph@redhat.com> + + * configure.ac (TARGETDIR): Add missing blank lines. + * configure: Regenerate. + +2009-06-16 Andrew Haley <aph@redhat.com> + + * testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_medium2.c: Fix printf format + specifiers. + * testsuite/libffi.call/ffitest.h, + testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. + +2009-06-15 Andrew Haley <aph@redhat.com> + + * testsuite/libffi.call/err_bad_typedef.c: xfail everywhere. + * testsuite/libffi.call/err_bad_abi.c: Likewise. + +2009-06-12 Andrew Haley <aph@redhat.com> + + * Makefile.am: Remove info_TEXINFOS. + +2009-06-12 Andrew Haley <aph@redhat.com> + + * ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_medium2.c: Fix printf format + specifiers. + testsuite/libffi.special/unwindtest.cc: include stdint.h. + +2009-06-11 Timothy Wall <twall@users.sf.net> + + * Makefile.am, + configure.ac, + include/ffi.h.in, + include/ffi_common.h, + src/closures.c, + src/dlmalloc.c, + src/x86/ffi.c, + src/x86/ffitarget.h, + src/x86/win64.S (new), + README: Added win64 support (mingw or MSVC) + * Makefile.in, + include/Makefile.in, + man/Makefile.in, + testsuite/Makefile.in, + configure, + aclocal.m4: Regenerated + * ltcf-c.sh: properly escape cygwin/w32 path + * man/ffi_call.3: Clarify size requirements for return value. + * src/x86/ffi64.c: Fix filename in comment. + * src/x86/win32.S: Remove unused extern. + + * testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/closure_stdcall.c, + testsuite/libffi.call/cls_12byte.c, + testsuite/libffi.call/cls_16byte.c, + testsuite/libffi.call/cls_18byte.c, + testsuite/libffi.call/cls_19byte.c, + testsuite/libffi.call/cls_1_1byte.c, + testsuite/libffi.call/cls_20byte.c, + testsuite/libffi.call/cls_20byte1.c, + testsuite/libffi.call/cls_24byte.c, + testsuite/libffi.call/cls_2byte.c, + testsuite/libffi.call/cls_3_1byte.c, + testsuite/libffi.call/cls_3byte1.c, + testsuite/libffi.call/cls_3byte2.c, + testsuite/libffi.call/cls_4_1byte.c, + testsuite/libffi.call/cls_4byte.c, + testsuite/libffi.call/cls_5_1_byte.c, + testsuite/libffi.call/cls_5byte.c, + testsuite/libffi.call/cls_64byte.c, + testsuite/libffi.call/cls_6_1_byte.c, + testsuite/libffi.call/cls_6byte.c, + testsuite/libffi.call/cls_7_1_byte.c, + testsuite/libffi.call/cls_7byte.c, + testsuite/libffi.call/cls_8byte.c, + testsuite/libffi.call/cls_9byte1.c, + testsuite/libffi.call/cls_9byte2.c, + testsuite/libffi.call/cls_align_double.c, + testsuite/libffi.call/cls_align_float.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_align_sint16.c, + testsuite/libffi.call/cls_align_sint32.c, + testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint16.c, + testsuite/libffi.call/cls_align_uint32.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_dbls_struct.c, + testsuite/libffi.call/cls_double.c, + testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_float.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_multi_schar.c, + testsuite/libffi.call/cls_multi_sshort.c, + testsuite/libffi.call/cls_multi_sshortchar.c, + testsuite/libffi.call/cls_multi_uchar.c, + testsuite/libffi.call/cls_multi_ushort.c, + testsuite/libffi.call/cls_multi_ushortchar.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c, + testsuite/libffi.call/cls_schar.c, + testsuite/libffi.call/cls_sint.c, + testsuite/libffi.call/cls_sshort.c, + testsuite/libffi.call/cls_uchar.c, + testsuite/libffi.call/cls_uint.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/cls_ushort.c, + testsuite/libffi.call/err_bad_abi.c, + testsuite/libffi.call/err_bad_typedef.c, + testsuite/libffi.call/float2.c, + testsuite/libffi.call/huge_struct.c, + testsuite/libffi.call/nested_struct.c, + testsuite/libffi.call/nested_struct1.c, + testsuite/libffi.call/nested_struct10.c, + testsuite/libffi.call/nested_struct2.c, + testsuite/libffi.call/nested_struct3.c, + testsuite/libffi.call/nested_struct4.c, + testsuite/libffi.call/nested_struct5.c, + testsuite/libffi.call/nested_struct6.c, + testsuite/libffi.call/nested_struct7.c, + testsuite/libffi.call/nested_struct8.c, + testsuite/libffi.call/nested_struct9.c, + testsuite/libffi.call/problem1.c, + testsuite/libffi.call/return_ldl.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_large.c, + testsuite/libffi.call/stret_large2.c, + testsuite/libffi.call/stret_medium.c, + testsuite/libffi.call/stret_medium2.c, + testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead + of checking for MMAP. Use intptr_t instead of long casts. + +2009-06-11 Kaz Kojima <kkojima@gcc.gnu.org> + + * testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*. + * testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*. + * testsuite/libffi.call/err_bad_typedef.c: Likewise. + +2009-06-09 Andrew Haley <aph@redhat.com> + + * src/x86/freebsd.S: Add missing file. + +2009-06-08 Andrew Haley <aph@redhat.com> + + Import from libffi 3.0.8: + + * doc/libffi.texi: New file. + * doc/libffi.info: Likewise. + * doc/stamp-vti: Likewise. + * man/Makefile.am: New file. + * man/ffi_call.3: New file. + + * Makefile.am (EXTRA_DIST): Add src/x86/darwin64.S, + src/dlmalloc.c. + (nodist_libffi_la_SOURCES): Add X86_FREEBSD. + + * configure.ac: Bump version to 3.0.8. + parisc*-*-linux*: Add. + i386-*-freebsd* | i386-*-openbsd*: Add. + powerpc-*-beos*: Add. + AM_CONDITIONAL X86_FREEBSD: Add. + AC_CONFIG_FILES: Add man/Makefile. + + * include/ffi.h.in (FFI_FN): Change void (*)() to void (*)(void). + +2009-06-08 Andrew Haley <aph@redhat.com> + + * README: Import from libffi 3.0.8. + +2009-06-08 Andrew Haley <aph@redhat.com> + + * testsuite/libffi.call/err_bad_abi.c: Add xfails. + * testsuite/libffi.call/cls_longdouble_va.c: Add xfails. + * testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*. + * testsuite/libffi.call/err_bad_typedef.c: Add xfails. + + * testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args. + * testsuite/libffi.call/stret_medium.c: Likewise. + * testsuite/libffi.call/stret_large2.c: Likewise. + * testsuite/libffi.call/stret_large.c: Likewise. + +2008-12-26 Timothy Wall <twall@users.sf.net> + + * testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected + failures on x86_64 cygwin/mingw. + +2008-12-22 Timothy Wall <twall@users.sf.net> + + * testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/closure_loc_fn0.c, + testsuite/libffi.call/closure_stdcall.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c: use portable cast from + pointer to integer (intptr_t). + * testsuite/libffi.call/cls_longdouble.c: disable for win64. + +2008-07-24 Anthony Green <green@redhat.com> + + * testsuite/libffi.call/cls_dbls_struct.c, + testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c, + testsuite/libffi.call/err_bad_abi.c: Clean up failures from + compiler warnings. + +2008-03-04 Anthony Green <green@redhat.com> + Blake Chaffin + hos@tamanegi.org + + * testsuite/libffi.call/cls_align_longdouble_split2.c + testsuite/libffi.call/cls_align_longdouble_split.c + testsuite/libffi.call/cls_dbls_struct.c + testsuite/libffi.call/cls_double_va.c + testsuite/libffi.call/cls_longdouble.c + testsuite/libffi.call/cls_longdouble_va.c + testsuite/libffi.call/cls_pointer.c + testsuite/libffi.call/cls_pointer_stack.c + testsuite/libffi.call/err_bad_abi.c + testsuite/libffi.call/err_bad_typedef.c + testsuite/libffi.call/stret_large2.c + testsuite/libffi.call/stret_large.c + testsuite/libffi.call/stret_medium2.c + testsuite/libffi.call/stret_medium.c: New tests from Apple. + +2009-06-05 Andrew Haley <aph@redhat.com> + + * src/x86/ffitarget.h, src/x86/ffi.c: Merge stdcall changes from + libffi. + +2009-06-04 Andrew Haley <aph@redhat.com> + + * src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out + stdcall changes. + +2008-02-26 Anthony Green <green@redhat.com> + Thomas Heller <theller@ctypes.org> + + * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C + comment. + +2008-02-03 Timothy Wall <twall@users.sf.net> + + * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return + offset based on code pointer, not data pointer. + +2008-01-31 Timothy Wall <twall@users.sf.net> + + * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall + closures. + * src/x86/ffitarget.h: Increase size of trampoline for stdcall + closures. + * src/x86/win32.S: Add assembly for stdcall closure. + * src/x86/ffi.c: Initialize stdcall closure trampoline. + +2009-06-04 Andrew Haley <aph@redhat.com> + + * include/ffi.h.in: Change void (*)() to void (*)(void). + * src/x86/ffi.c: Likewise. + +2009-06-04 Andrew Haley <aph@redhat.com> + + * src/powerpc/ppc_closure.S: Insert licence header. + * src/powerpc/linux64_closure.S: Likewise. + * src/m68k/sysv.S: Likewise. + + * src/sh64/ffi.c: Change void (*)() to void (*)(void). + * src/powerpc/ffi.c: Likewise. + * src/powerpc/ffi_darwin.c: Likewise. + * src/m32r/ffi.c: Likewise. + * src/sh64/ffi.c: Likewise. + * src/x86/ffi64.c: Likewise. + * src/alpha/ffi.c: Likewise. + * src/alpha/osf.S: Likewise. + * src/frv/ffi.c: Likewise. + * src/s390/ffi.c: Likewise. + * src/pa/ffi.c: Likewise. + * src/pa/hpux32.S: Likewise. + * src/ia64/unix.S: Likewise. + * src/ia64/ffi.c: Likewise. + * src/sparc/ffi.c: Likewise. + * src/mips/ffi.c: Likewise. + * src/sh/ffi.c: Likewise. + +2008-02-15 David Daney <ddaney@avtrex.com> + + * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): + Define (conditionally), and use it to include cachectl.h. + (ffi_prep_closure_loc): Fix cache flushing. + * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. + +2009-06-04 Andrew Haley <aph@redhat.com> + + include/ffi.h.in, + src/arm/ffitarget.h, + src/arm/ffi.c, + src/arm/sysv.S, + src/powerpc/ffitarget.h, + src/closures.c, + src/sh64/ffitarget.h, + src/sh64/ffi.c, + src/sh64/sysv.S, + src/types.c, + src/x86/ffi64.c, + src/x86/ffitarget.h, + src/x86/win32.S, + src/x86/darwin.S, + src/x86/ffi.c, + src/x86/sysv.S, + src/x86/unix64.S, + src/alpha/ffitarget.h, + src/alpha/ffi.c, + src/alpha/osf.S, + src/m68k/ffitarget.h, + src/frv/ffitarget.h, + src/frv/ffi.c, + src/s390/ffitarget.h, + src/s390/sysv.S, + src/cris/ffitarget.h, + src/pa/linux.S, + src/pa/ffitarget.h, + src/pa/ffi.c, + src/raw_api.c, + src/ia64/ffitarget.h, + src/ia64/unix.S, + src/ia64/ffi.c, + src/ia64/ia64_flags.h, + src/java_raw_api.c, + src/debug.c, + src/sparc/v9.S, + src/sparc/ffitarget.h, + src/sparc/ffi.c, + src/sparc/v8.S, + src/mips/ffitarget.h, + src/mips/n32.S, + src/mips/o32.S, + src/mips/ffi.c, + src/prep_cif.c, + src/sh/ffitarget.h, + src/sh/ffi.c, + src/sh/sysv.S: Update license text. + +2009-05-22 Dave Korn <dave.korn.cygwin@gmail.com> + + * src/x86/win32.S (_ffi_closure_STDCALL): New function. + (.eh_frame): Add FDE for it. + +2009-05-22 Dave Korn <dave.korn.cygwin@gmail.com> + + * configure.ac: Also check if assembler supports pc-relative + relocs on X86_WIN32 targets. + * configure: Regenerate. + * src/x86/win32.S (ffi_prep_args): Declare extern, not global. + (_ffi_call_SYSV): Add missing function type symbol .def and + add EH markup labels. + (_ffi_call_STDCALL): Likewise. + (_ffi_closure_SYSV): Likewise. + (_ffi_closure_raw_SYSV): Likewise. + (.eh_frame): Add hand-crafted EH data. + +2009-04-09 Jakub Jelinek <jakub@redhat.com> + + * testsuite/lib/libffi-dg.exp: Change copyright header to refer to + version 3 of the GNU General Public License and to point readers + at the COPYING3 file and the FSF's license web page. + * testsuite/libffi.call/call.exp: Likewise. + * testsuite/libffi.special/special.exp: Likewise. + +2009-03-01 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * configure: Regenerate. + +2008-12-18 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + PR libffi/26048 + * configure.ac (HAVE_AS_X86_PCREL): New test. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * src/x86/sysv.S [!FFI_NO_RAW_API]: Precalculate + RAW_CLOSURE_CIF_OFFSET, RAW_CLOSURE_FUN_OFFSET, + RAW_CLOSURE_USER_DATA_OFFSET for the Solaris 10/x86 assembler. + (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. + * src/x86/unix64.S (.Lstore_table): Move to .text section. + (.Lload_table): Likewise. + (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. + +2008-12-18 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * configure: Regenerate. + +2008-11-21 Eric Botcazou <ebotcazou@adacore.com> + + * src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for + signed/unsigned int8/16 return values. + * src/sparc/v8.S (ffi_call_v8): Likewise. + (ffi_closure_v8): Likewise. + +2008-09-26 Peter O'Gorman <pogma@thewrittenword.com> + Steve Ellcey <sje@cup.hp.com> + + * configure: Regenerate for new libtool. + * Makefile.in: Ditto. + * include/Makefile.in: Ditto. + * aclocal.m4: Ditto. + +2008-08-25 Andreas Tobler <a.tobler@schweiz.org> + + * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and + FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. + Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. + Adjust copyright notice. + * src/powerpc/ffi.c: Add two new flags to indicate if we have one + register or two register to use for FFI_SYSV structs. + (ffi_prep_cif_machdep): Pass the right register flag introduced above. + (ffi_closure_helper_SYSV): Fix the return type for + FFI_SYSV_TYPE_SMALL_STRUCT. Comment. + Adjust copyright notice. + +2008-07-16 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned + int. + +2008-06-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * configure: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2008-06-07 Joseph Myers <joseph@codesourcery.com> + + * configure.ac (parisc*-*-linux*, powerpc-*-sysv*, + powerpc-*-beos*): Remove. + * configure: Regenerate. + +2008-05-09 Julian Brown <julian@codesourcery.com> + + * Makefile.am (LTLDFLAGS): New. + (libffi_la_LDFLAGS): Use above. + * Makefile.in: Regenerate. + +2008-04-18 Paolo Bonzini <bonzini@gnu.org> + + PR bootstrap/35457 + * aclocal.m4: Regenerate. + * configure: Regenerate. + +2008-03-26 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/sysv.S: Add .note.GNU-stack on Linux. + * src/sh64/sysv.S: Likewise. + +2008-03-26 Daniel Jacobowitz <dan@debian.org> + + * src/arm/sysv.S: Fix ARM comment marker. + +2008-03-26 Jakub Jelinek <jakub@redhat.com> + + * src/alpha/osf.S: Add .note.GNU-stack on Linux. + * src/s390/sysv.S: Likewise. + * src/powerpc/ppc_closure.S: Likewise. + * src/powerpc/sysv.S: Likewise. + * src/x86/unix64.S: Likewise. + * src/x86/sysv.S: Likewise. + * src/sparc/v8.S: Likewise. + * src/sparc/v9.S: Likewise. + * src/m68k/sysv.S: Likewise. + * src/arm/sysv.S: Likewise. + +2008-03-16 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + + * aclocal.m4: Regenerate. + * configure: Likewise. + * Makefile.in: Likewise. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + +2008-02-12 Bjoern Koenig <bkoenig@alpha-tierchen.de> + Andreas Tobler <a.tobler@schweiz.org> + + * configure.ac: Add amd64-*-freebsd* target. + * configure: Regenerate. + +2008-01-30 H.J. Lu <hongjiu.lu@intel.com> + + PR libffi/34612 + * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when + returning struct. + + * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" + tests. + +2008-01-24 David Edelsohn <edelsohn@gnu.org> + + * configure: Regenerate. + +2008-01-06 Andreas Tobler <a.tobler@schweiz.org> + + * src/x86/ffi.c (ffi_prep_cif_machdep): Fix thinko. + +2008-01-05 Andreas Tobler <a.tobler@schweiz.org> + + PR testsuite/32843 + * src/x86/ffi.c (ffi_prep_cif_machdep): Add code for + signed/unsigned int8/16 for X86_DARWIN. + Updated copyright info. + Handle one and two byte structs with special cif->flags. + * src/x86/ffitarget.h: Add special types for one and two byte structs. + Updated copyright info. + * src/x86/darwin.S (ffi_call_SYSV): Rewrite to use a jump table like + sysv.S + Remove code to pop args from the stack after call. + Special-case signed/unsigned for int8/16, one and two byte structs. + (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, + FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, + FFI_TYPE_SINT32. + Updated copyright info. + +2007-12-08 David Daney <ddaney@avtrex.com> + + * src/mips/n32.S (ffi_call_N32): Replace dadd with ADDU, dsub with + SUBU, add with ADDU and use smaller code sequences. + +2007-12-07 David Daney <ddaney@avtrex.com> + + * src/mips/ffi.c (ffi_prep_cif_machdep): Handle long double return + type. + +2007-12-06 David Daney <ddaney@avtrex.com> + + * include/ffi.h.in (FFI_SIZEOF_JAVA_RAW): Define if not already + defined. + (ffi_java_raw): New typedef. + (ffi_java_raw_call, ffi_java_ptrarray_to_raw, + ffi_java_raw_to_ptrarray): Change parameter types from ffi_raw to + ffi_java_raw. + (ffi_java_raw_closure) : Same. + (ffi_prep_java_raw_closure, ffi_prep_java_raw_closure_loc): Change + parameter types. + * src/java_raw_api.c (ffi_java_raw_size): Replace FFI_SIZEOF_ARG with + FFI_SIZEOF_JAVA_RAW. + (ffi_java_raw_to_ptrarray): Change type of raw to ffi_java_raw. + Replace FFI_SIZEOF_ARG with FFI_SIZEOF_JAVA_RAW. Use + sizeof(ffi_java_raw) for alignment calculations. + (ffi_java_ptrarray_to_raw): Same. + (ffi_java_rvalue_to_raw): Add special handling for FFI_TYPE_POINTER + if FFI_SIZEOF_JAVA_RAW == 4. + (ffi_java_raw_to_rvalue): Same. + (ffi_java_raw_call): Change type of raw to ffi_java_raw. + (ffi_java_translate_args): Same. + (ffi_prep_java_raw_closure_loc, ffi_prep_java_raw_closure): Change + parameter types. + * src/mips/ffitarget.h (FFI_SIZEOF_JAVA_RAW): Define for N32 ABI. + +2007-12-06 David Daney <ddaney@avtrex.com> + + * src/mips/n32.S (ffi_closure_N32): Use 64-bit add instruction on + pointer values. + +2007-12-01 Andreas Tobler <a.tobler@schweiz.org> + + PR libffi/31937 + * src/powerpc/ffitarget.h: Introduce new ABI FFI_LINUX_SOFT_FLOAT. + Add local FFI_TYPE_UINT128 to handle soft-float long-double-128. + * src/powerpc/ffi.c: Distinguish between __NO_FPRS__ and not and + set the NUM_FPR_ARG_REGISTERS according to. + Add support for potential soft-float support under hard-float + architecture. + (ffi_prep_args_SYSV): Set NUM_FPR_ARG_REGISTERS to 0 in case of + FFI_LINUX_SOFT_FLOAT, handle float, doubles and long-doubles according + to the FFI_LINUX_SOFT_FLOAT ABI. + (ffi_prep_cif_machdep): Likewise. + (ffi_closure_helper_SYSV): Likewise. + * src/powerpc/ppc_closure.S: Make sure not to store float/double + on archs where __NO_FPRS__ is true. + Add FFI_TYPE_UINT128 support. + * src/powerpc/sysv.S: Add support for soft-float long-double-128. + Adjust copyright notice. + +2007-11-25 Andreas Tobler <a.tobler@schweiz.org> + + * src/closures.c: Move defintion of MAYBE_UNUSED from here to ... + * include/ffi_common.h: ... here. + Update copyright. + +2007-11-17 Andreas Tobler <a.tobler@schweiz.org> + + * src/powerpc/sysv.S: Load correct cr to compare if we have long double. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/ffi.c: Add a comment to show which part goes into cr6. + * testsuite/libffi.call/return_ldl.c: New test. + +2007-09-04 <aph@redhat.com> + + * src/arm/sysv.S (UNWIND): New. + (Whole file): Conditionally compile unwinder directives. + * src/arm/sysv.S: Add unwinder directives. + + * src/arm/ffi.c (ffi_prep_args): Align structs by at least 4 bytes. + Only treat r0 as a struct address if we're actually returning a + struct by address. + Only copy the bytes that are actually within a struct. + (ffi_prep_cif_machdep): A Composite Type not larger than 4 bytes + is returned in r0, not passed by address. + (ffi_call): Allocate a word-sized temporary for the case where + a composite is returned in r0. + (ffi_prep_incoming_args_SYSV): Align as necessary. + +2007-08-05 Steven Newbury <s_j_newbury@yahoo.co.uk> + + * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Use __clear_cache instead of + directly using the sys_cacheflush syscall. + +2007-07-27 Andrew Haley <aph@redhat.com> + + * src/arm/sysv.S (ffi_closure_SYSV): Add soft-float. + +2007-09-03 Maciej W. Rozycki <macro@linux-mips.org> + + * Makefile.am: Unify MIPS_IRIX and MIPS_LINUX into MIPS. + * configure.ac: Likewise. + * Makefile.in: Regenerate. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + * configure: Likewise. + +2007-08-24 David Daney <ddaney@avtrex.com> + + * testsuite/libffi.call/return_sl.c: New test. + +2007-08-10 David Daney <ddaney@avtrex.com> + + * testsuite/libffi.call/cls_multi_ushort.c, + testsuite/libffi.call/cls_align_uint16.c, + testsuite/libffi.call/nested_struct1.c, + testsuite/libffi.call/nested_struct3.c, + testsuite/libffi.call/cls_7_1_byte.c, + testsuite/libffi.call/nested_struct5.c, + testsuite/libffi.call/cls_double.c, + testsuite/libffi.call/nested_struct7.c, + testsuite/libffi.call/cls_sint.c, + testsuite/libffi.call/nested_struct9.c, + testsuite/libffi.call/cls_20byte1.c, + testsuite/libffi.call/cls_multi_sshortchar.c, + testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_3byte2.c, + testsuite/libffi.call/cls_multi_schar.c, + testsuite/libffi.call/cls_multi_uchar.c, + testsuite/libffi.call/cls_19byte.c, + testsuite/libffi.call/cls_9byte1.c, + testsuite/libffi.call/cls_align_float.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/problem1.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/cls_sshort.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/cls_align_double.c, + testsuite/libffi.call/nested_struct.c, + testsuite/libffi.call/cls_2byte.c, + testsuite/libffi.call/nested_struct10.c, + testsuite/libffi.call/cls_4byte.c, + testsuite/libffi.call/cls_6byte.c, + testsuite/libffi.call/cls_8byte.c, + testsuite/libffi.call/cls_multi_sshort.c, + testsuite/libffi.call/cls_align_sint16.c, + testsuite/libffi.call/cls_align_uint32.c, + testsuite/libffi.call/cls_20byte.c, + testsuite/libffi.call/cls_float.c, + testsuite/libffi.call/nested_struct2.c, + testsuite/libffi.call/cls_5_1_byte.c, + testsuite/libffi.call/nested_struct4.c, + testsuite/libffi.call/cls_24byte.c, + testsuite/libffi.call/nested_struct6.c, + testsuite/libffi.call/cls_64byte.c, + testsuite/libffi.call/nested_struct8.c, + testsuite/libffi.call/cls_uint.c, + testsuite/libffi.call/cls_multi_ushortchar.c, + testsuite/libffi.call/cls_schar.c, + testsuite/libffi.call/cls_uchar.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_1_1byte.c, + testsuite/libffi.call/cls_12byte.c, + testsuite/libffi.call/cls_3_1byte.c, + testsuite/libffi.call/cls_3byte1.c, + testsuite/libffi.call/cls_4_1byte.c, + testsuite/libffi.call/cls_6_1_byte.c, + testsuite/libffi.call/cls_16byte.c, + testsuite/libffi.call/cls_18byte.c, + testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/cls_9byte2.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/cls_ushort.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/cls_5byte.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_7byte.c, + testsuite/libffi.call/cls_align_sint32.c, + testsuite/libffi.special/unwindtest_ffi_call.cc, + testsuite/libffi.special/unwindtest.cc: Remove xfail for mips64*-*-*. + +2007-08-10 David Daney <ddaney@avtrex.com> + + PR libffi/28313 + * configure.ac: Don't treat mips64 as a special case. + * Makefile.am (nodist_libffi_la_SOURCES): Add n32.S. + * configure: Regenerate + * Makefile.in: Ditto. + * fficonfig.h.in: Ditto. + * src/mips/ffitarget.h (REG_L, REG_S, SUBU, ADDU, SRL, LI): Indent. + (LA, EH_FRAME_ALIGN, FDE_ADDR_BYTES): New preprocessor macros. + (FFI_DEFAULT_ABI): Set for n64 case. + (FFI_CLOSURES, FFI_TRAMPOLINE_SIZE): Define for n32 and n64 cases. + * src/mips/n32.S (ffi_call_N32): Add debug macros and labels for FDE. + (ffi_closure_N32): New function. + (.eh_frame): New section + * src/mips/o32.S: Clean up comments. + (ffi_closure_O32): Pass ffi_closure parameter in $12. + * src/mips/ffi.c: Use FFI_MIPS_N32 instead of + _MIPS_SIM == _ABIN32 throughout. + (FFI_MIPS_STOP_HERE): New, use in place of + ffi_stop_here. + (ffi_prep_args): Use unsigned long to hold pointer values. Rewrite + to support n32/n64 ABIs. + (calc_n32_struct_flags): Rewrite. + (calc_n32_return_struct_flags): Remove unused variable. Reverse + position of flag bits. + (ffi_prep_cif_machdep): Rewrite n32 portion. + (ffi_call): Enable for n64. Add special handling for small structure + return values. + (ffi_prep_closure_loc): Add n32 and n64 support. + (ffi_closure_mips_inner_O32): Add cast to silence warning. + (copy_struct_N32, ffi_closure_mips_inner_N32): New functions. + +2007-08-08 David Daney <ddaney@avtrex.com> + + * testsuite/libffi.call/ffitest.h (ffi_type_mylong): Remove definition. + * testsuite/libffi.call/cls_align_uint16.c (main): Use correct type + specifiers. + * testsuite/libffi.call/nested_struct1.c (main): Ditto. + * testsuite/libffi.call/cls_sint.c (main): Ditto. + * testsuite/libffi.call/nested_struct9.c (main): Ditto. + * testsuite/libffi.call/cls_20byte1.c (main): Ditto. + * testsuite/libffi.call/cls_9byte1.c (main): Ditto. + * testsuite/libffi.call/closure_fn1.c (main): Ditto. + * testsuite/libffi.call/closure_fn3.c (main): Ditto. + * testsuite/libffi.call/return_dbl2.c (main): Ditto. + * testsuite/libffi.call/cls_sshort.c (main): Ditto. + * testsuite/libffi.call/return_fl3.c (main): Ditto. + * testsuite/libffi.call/closure_fn5.c (main): Ditto. + * testsuite/libffi.call/nested_struct.c (main): Ditto. + * testsuite/libffi.call/nested_struct10.c (main): Ditto. + * testsuite/libffi.call/return_ll1.c (main): Ditto. + * testsuite/libffi.call/cls_8byte.c (main): Ditto. + * testsuite/libffi.call/cls_align_uint32.c (main): Ditto. + * testsuite/libffi.call/cls_align_sint16.c (main): Ditto. + * testsuite/libffi.call/cls_20byte.c (main): Ditto. + * testsuite/libffi.call/nested_struct2.c (main): Ditto. + * testsuite/libffi.call/cls_24byte.c (main): Ditto. + * testsuite/libffi.call/nested_struct6.c (main): Ditto. + * testsuite/libffi.call/cls_uint.c (main): Ditto. + * testsuite/libffi.call/cls_12byte.c (main): Ditto. + * testsuite/libffi.call/cls_16byte.c (main): Ditto. + * testsuite/libffi.call/closure_fn0.c (main): Ditto. + * testsuite/libffi.call/cls_9byte2.c (main): Ditto. + * testsuite/libffi.call/closure_fn2.c (main): Ditto. + * testsuite/libffi.call/return_dbl1.c (main): Ditto. + * testsuite/libffi.call/closure_fn4.c (main): Ditto. + * testsuite/libffi.call/closure_fn6.c (main): Ditto. + * testsuite/libffi.call/cls_align_sint32.c (main): Ditto. + +2007-08-07 Andrew Haley <aph@redhat.com> + + * src/x86/sysv.S (ffi_closure_raw_SYSV): Fix typo in previous + checkin. + +2007-08-06 Andrew Haley <aph@redhat.com> + + PR testsuite/32843 + * src/x86/sysv.S (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, + FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, + FFI_TYPE_SINT32. + +2007-08-02 David Daney <ddaney@avtrex.com> + + * testsuite/libffi.call/return_ul.c (main): Define return type as + ffi_arg. Use proper printf conversion specifier. + +2007-07-30 Andrew Haley <aph@redhat.com> + + PR testsuite/32843 + * src/x86/ffi.c (ffi_prep_cif_machdep): in x86 case, add code for + signed/unsigned int8/16. + * src/x86/sysv.S (ffi_call_SYSV): Rewrite to: + Use a jump table. + Remove code to pop args from the stack after call. + Special-case signed/unsigned int8/16. + * testsuite/libffi.call/return_sc.c (main): Revert. + +2007-07-26 Richard Guenther <rguenther@suse.de> + + PR testsuite/32843 + * testsuite/libffi.call/return_sc.c (main): Verify call + result as signed char, not ffi_arg. + +2007-07-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * configure.ac (i?86-*-solaris2.1[0-9]): Set TARGET to X86_64. + * configure: Regenerate. + +2007-07-11 David Daney <ddaney@avtrex.com> + + * src/mips/ffi.c: Don't include sys/cachectl.h. + (ffi_prep_closure_loc): Use __builtin___clear_cache() instead of + cacheflush(). + +2007-05-18 Aurelien Jarno <aurelien@aurel32.net> + + * src/arm/ffi.c (ffi_prep_closure_loc): Renamed and ajusted + from (ffi_prep_closure): ... this. + (FFI_INIT_TRAMPOLINE): Adjust. + +2005-12-31 Phil Blundell <pb@reciva.com> + + * src/arm/ffi.c (ffi_prep_incoming_args_SYSV, + ffi_closure_SYSV_inner, ffi_prep_closure): New, add closure support. + * src/arm/sysv.S(ffi_closure_SYSV): Likewise. + * src/arm/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. + (FFI_CLOSURES): Enable closure support. + +2007-07-03 Andrew Haley <aph@hedges.billgatliff.com> + + * testsuite/libffi.call/cls_multi_ushort.c, + testsuite/libffi.call/cls_align_uint16.c, + testsuite/libffi.call/nested_struct1.c, + testsuite/libffi.call/nested_struct3.c, + testsuite/libffi.call/cls_7_1_byte.c, + testsuite/libffi.call/cls_double.c, + testsuite/libffi.call/nested_struct5.c, + testsuite/libffi.call/nested_struct7.c, + testsuite/libffi.call/cls_sint.c, + testsuite/libffi.call/nested_struct9.c, + testsuite/libffi.call/cls_20byte1.c, + testsuite/libffi.call/cls_multi_sshortchar.c, + testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_3byte2.c, + testsuite/libffi.call/cls_multi_schar.c, + testsuite/libffi.call/cls_multi_uchar.c, + testsuite/libffi.call/cls_19byte.c, + testsuite/libffi.call/cls_9byte1.c, + testsuite/libffi.call/cls_align_float.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/problem1.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/cls_sshort.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/cls_align_double.c, + testsuite/libffi.call/cls_2byte.c, + testsuite/libffi.call/nested_struct.c, + testsuite/libffi.call/nested_struct10.c, + testsuite/libffi.call/cls_4byte.c, + testsuite/libffi.call/cls_6byte.c, + testsuite/libffi.call/cls_8byte.c, + testsuite/libffi.call/cls_multi_sshort.c, + testsuite/libffi.call/cls_align_uint32.c, + testsuite/libffi.call/cls_align_sint16.c, + testsuite/libffi.call/cls_float.c, + testsuite/libffi.call/cls_20byte.c, + testsuite/libffi.call/cls_5_1_byte.c, + testsuite/libffi.call/nested_struct2.c, + testsuite/libffi.call/cls_24byte.c, + testsuite/libffi.call/nested_struct4.c, + testsuite/libffi.call/nested_struct6.c, + testsuite/libffi.call/cls_64byte.c, + testsuite/libffi.call/nested_struct8.c, + testsuite/libffi.call/cls_uint.c, + testsuite/libffi.call/cls_multi_ushortchar.c, + testsuite/libffi.call/cls_schar.c, + testsuite/libffi.call/cls_uchar.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_1_1byte.c, + testsuite/libffi.call/cls_12byte.c, + testsuite/libffi.call/cls_3_1byte.c, + testsuite/libffi.call/cls_3byte1.c, + testsuite/libffi.call/cls_4_1byte.c, + testsuite/libffi.call/cls_6_1_byte.c, + testsuite/libffi.call/cls_16byte.c, + testsuite/libffi.call/cls_18byte.c, + testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/cls_9byte2.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/cls_ushort.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/cls_5byte.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_7byte.c, + testsuite/libffi.call/cls_align_sint32.c, + testsuite/libffi.special/unwindtest_ffi_call.cc, + testsuite/libffi.special/unwindtest.cc: Enable for ARM. + +2007-07-05 H.J. Lu <hongjiu.lu@intel.com> + + * aclocal.m4: Regenerated. + +2007-06-02 Paolo Bonzini <bonzini@gnu.org> + + * configure: Regenerate. + +2007-05-23 Steve Ellcey <sje@cup.hp.com> + + * Makefile.in: Regenerate. + * configure: Regenerate. + * aclocal.m4: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2007-05-10 Roman Zippel <zippel@linux-m68k.org> + + * src/m68k/ffi.c (ffi_prep_incoming_args_SYSV, + ffi_closure_SYSV_inner,ffi_prep_closure): New, add closure support. + * src/m68k/sysv.S(ffi_closure_SYSV,ffi_closure_struct_SYSV): Likewise. + * src/m68k/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. + (FFI_CLOSURES): Enable closure support. + +2007-05-10 Roman Zippel <zippel@linux-m68k.org> + + * configure.ac (HAVE_AS_CFI_PSEUDO_OP): New test. + * configure: Regenerate. + * fficonfig.h.in: Regenerate. + * src/m68k/sysv.S (CFI_STARTPROC,CFI_ENDPROC, + CFI_OFFSET,CFI_DEF_CFA): New macros. + (ffi_call_SYSV): Add callframe annotation. + +2007-05-10 Roman Zippel <zippel@linux-m68k.org> + + * src/m68k/ffi.c (ffi_prep_args,ffi_prep_cif_machdep): Fix + numerous test suite failures. + * src/m68k/sysv.S (ffi_call_SYSV): Likewise. + +2007-04-11 Paolo Bonzini <bonzini@gnu.org> + + * Makefile.am (EXTRA_DIST): Bring up to date. + * Makefile.in: Regenerate. + * src/frv/eabi.S: Remove RCS keyword. + +2007-04-06 Richard Henderson <rth@redhat.com> + + * configure.ac: Tidy target case. + (HAVE_LONG_DOUBLE): Allow the target to override. + * configure: Regenerate. + * include/ffi.h.in: Don't define ffi_type_foo if + LIBFFI_HIDE_BASIC_TYPES is defined. + (ffi_type_longdouble): If not HAVE_LONG_DOUBLE, define + to ffi_type_double. + * types.c (LIBFFI_HIDE_BASIC_TYPES): Define. + (FFI_TYPEDEF, ffi_type_void): Mark the data const. + (ffi_type_longdouble): Special case for Alpha. Don't define + if long double == double. + + * src/alpha/ffi.c (FFI_TYPE_LONGDOUBLE): Assert unique value. + (ffi_prep_cif_machdep): Handle it as the 128-bit type. + (ffi_call, ffi_closure_osf_inner): Likewise. + (ffi_closure_osf_inner): Likewise. Mark hidden. + (ffi_call_osf, ffi_closure_osf): Mark hidden. + * src/alpha/ffitarget.h (FFI_LAST_ABI): Tidy definition. + * src/alpha/osf.S (ffi_call_osf, ffi_closure_osf): Mark hidden. + (load_table): Handle 128-bit long double. + + * testsuite/libffi.call/float4.c: Add -mieee for alpha. + +2007-04-06 Tom Tromey <tromey@redhat.com> + + PR libffi/31491: + * README: Fixed bug in example. + +2007-04-03 Jakub Jelinek <jakub@redhat.com> + + * src/closures.c: Include sys/statfs.h. + (_GNU_SOURCE): Define on Linux. + (FFI_MMAP_EXEC_SELINUX): Define. + (selinux_enabled): New variable. + (selinux_enabled_check): New function. + (is_selinux_enabled): Define. + (dlmmap): Use it. + +2007-03-24 Uros Bizjak <ubizjak@gmail.com> + + * testsuite/libffi.call/return_fl2.c (return_fl): Mark as static. + Use 'volatile float sum' to create sum of floats to avoid false + negative due to excess precision on ix86 targets. + (main): Ditto. + +2007-03-08 Alexandre Oliva <aoliva@redhat.com> + + * src/powerpc/ffi.c (flush_icache): Fix left-over from previous + patch. + (ffi_prep_closure_loc): Remove unneeded casts. Add needed ones. + +2007-03-07 Alexandre Oliva <aoliva@redhat.com> + + * include/ffi.h.in (ffi_closure_alloc, ffi_closure_free): New. + (ffi_prep_closure_loc): New. + (ffi_prep_raw_closure_loc): New. + (ffi_prep_java_raw_closure_loc): New. + * src/closures.c: New file. + * src/dlmalloc.c [FFI_MMAP_EXEC_WRIT] (struct malloc_segment): + Replace sflags with exec_offset. + [FFI_MMAP_EXEC_WRIT] (mmap_exec_offset, add_segment_exec_offset, + sub_segment_exec_offset): New macros. + (get_segment_flags, set_segment_flags, check_segment_merge): New + macros. + (is_mmapped_segment, is_extern_segment): Use get_segment_flags. + (add_segment, sys_alloc, create_mspace, create_mspace_with_base, + destroy_mspace): Use new macros. + (sys_alloc): Silence warning. + * Makefile.am (libffi_la_SOURCES): Add src/closures.c. + * Makefile.in: Rebuilt. + * src/prep_cif [FFI_CLOSURES] (ffi_prep_closure): Implement in + terms of ffi_prep_closure_loc. + * src/raw_api.c (ffi_prep_raw_closure_loc): Renamed and adjusted + from... + (ffi_prep_raw_closure): ... this. Re-implement in terms of the + renamed version. + * src/java_raw_api (ffi_prep_java_raw_closure_loc): Renamed and + adjusted from... + (ffi_prep_java_raw_closure): ... this. Re-implement in terms of + the renamed version. + * src/alpha/ffi.c (ffi_prep_closure_loc): Renamed from + (ffi_prep_closure): ... this. + * src/pa/ffi.c: Likewise. + * src/cris/ffi.c: Likewise. Adjust. + * src/frv/ffi.c: Likewise. + * src/ia64/ffi.c: Likewise. + * src/mips/ffi.c: Likewise. + * src/powerpc/ffi_darwin.c: Likewise. + * src/s390/ffi.c: Likewise. + * src/sh/ffi.c: Likewise. + * src/sh64/ffi.c: Likewise. + * src/sparc/ffi.c: Likewise. + * src/x86/ffi64.c: Likewise. + * src/x86/ffi.c: Likewise. + (FFI_INIT_TRAMPOLINE): Adjust. + (ffi_prep_raw_closure_loc): Renamed and adjusted from... + (ffi_prep_raw_closure): ... this. + * src/powerpc/ffi.c (ffi_prep_closure_loc): Renamed from + (ffi_prep_closure): ... this. + (flush_icache): Adjust. + +2007-03-07 Alexandre Oliva <aoliva@redhat.com> + + * src/dlmalloc.c: New file, imported version 2.8.3 of Doug + Lea's malloc. + +2007-03-01 Brooks Moses <brooks.moses@codesourcery.com> + + * Makefile.am: Add dummy install-pdf target. + * Makefile.in: Regenerate + +2007-02-13 Andreas Krebbel <krebbel1@de.ibm.com> + + * src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep, + ffi_closure_helper_SYSV): Add long double handling. + +2007-02-02 Jakub Jelinek <jakub@redhat.com> + + * src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2 + immediately after bctrl instruction. + +2007-01-18 Alexandre Oliva <aoliva@redhat.com> + + * Makefile.am (all-recursive, install-recursive, + mostlyclean-recursive, clean-recursive, distclean-recursive, + maintainer-clean-recursive): Add missing targets. + * Makefile.in: Rebuilt. + +2006-12-14 Andreas Tobler <a.tobler@schweiz.org> + + * configure.ac: Add TARGET for x86_64-*-darwin*. + * Makefile.am (nodist_libffi_la_SOURCES): Add rules for 64-bit sources + for X86_DARWIN. + * src/x86/ffitarget.h: Set trampoline size for x86_64-*-darwin*. + * src/x86/darwin64.S: New file for x86_64-*-darwin* support. + * configure: Regenerate. + * Makefile.in: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + * testsuite/libffi.special/unwindtest_ffi_call.cc: New test case for + ffi_call only. + +2006-12-13 Andreas Tobler <a.tobler@schweiz.org> + + * aclocal.m4: Regenerate with aclocal -I .. as written in the + Makefile.am. + +2006-10-31 Geoffrey Keating <geoffk@apple.com> + + * src/powerpc/ffi_darwin.c (darwin_adjust_aggregate_sizes): New. + (ffi_prep_cif_machdep): Call darwin_adjust_aggregate_sizes for + Darwin. + * testsuite/libffi.call/nested_struct4.c: Remove Darwin XFAIL. + * testsuite/libffi.call/nested_struct6.c: Remove Darwin XFAIL. + +2006-10-10 Paolo Bonzini <bonzini@gnu.org> + Sandro Tolaini <tolaini@libero.it> + + * configure.ac [i*86-*-darwin*]: Set X86_DARWIN symbol and + conditional. + * configure: Regenerated. + * Makefile.am (nodist_libffi_la_SOURCES) [X86_DARWIN]: New case. + (EXTRA_DIST): Add src/x86/darwin.S. + * Makefile.in: Regenerated. + * include/Makefile.in: Regenerated. + * testsuite/Makefile.in: Regenerated. + + * src/x86/ffi.c (ffi_prep_cif_machdep) [X86_DARWIN]: Treat like + X86_WIN32, and additionally align stack to 16 bytes. + * src/x86/darwin.S: New, based on sysv.S. + * src/prep_cif.c (ffi_prep_cif) [X86_DARWIN]: Align > 8-byte structs. + +2006-09-12 David Daney <ddaney@avtrex.com> + + PR libffi/23935 + * include/Makefile.am: Install both ffi.h and ffitarget.h in + $(libdir)/gcc/$(target_alias)/$(gcc_version)/include. + * aclocal.m4: Regenerated for automake 1.9.6. + * Makefile.in: Regenerated. + * include/Makefile.in: Regenerated. + * testsuite/Makefile.in: Regenerated. + +2006-08-17 Andreas Tobler <a.tobler@schweiz.ch> + + * include/ffi_common.h (struct): Revert accidental commit. + +2006-08-15 Andreas Tobler <a.tobler@schweiz.ch> + + * include/ffi_common.h: Remove lint directives. + * include/ffi.h.in: Likewise. + +2006-07-25 Torsten Schoenfeld <kaffeetisch@gmx.de> + + * include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly + for 32-bit architectures. + * testsuite/libffi.call/return_ul.c: New test case. + +2006-07-19 David Daney <ddaney@avtrex.com> + + * testsuite/libffi.call/closure_fn6.c: Remove xfail for mips, + xfail remains for mips64. + +2006-05-23 Carlos O'Donell <carlos@codesourcery.com> + + * Makefile.am: Add install-html target. Add install-html to .PHONY + * Makefile.in: Regenerate. + * aclocal.m4: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2006-05-18 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> + + * pa/ffi.c (ffi_prep_args_pa32): Load floating point arguments from + stack slot. + +2006-04-22 Andreas Tobler <a.tobler@schweiz.ch> + + * README: Remove notice about 'Crazy Comments'. + * src/debug.c: Remove lint directives. Cleanup white spaces. + * src/java_raw_api.c: Likewise. + * src/prep_cif.c: Likewise. + * src/raw_api.c: Likewise. + * src/ffitest.c: Delete. No longer needed, all test cases migrated + to the testsuite. + * src/arm/ffi.c: Remove lint directives. + * src/m32r/ffi.c: Likewise. + * src/pa/ffi.c: Likewise. + * src/powerpc/ffi.c: Likewise. + * src/powerpc/ffi_darwin.c: Likewise. + * src/sh/ffi.c: Likewise. + * src/sh64/ffi.c: Likewise. + * src/x86/ffi.c: Likewise. + * testsuite/libffi.call/float2.c: Likewise. + * testsuite/libffi.call/promotion.c: Likewise. + * testsuite/libffi.call/struct1.c: Likewise. + +2006-04-13 Andreas Tobler <a.tobler@schweiz.ch> + + * src/pa/hpux32.S: Correct unwind offset calculation for + ffi_closure_pa32. + * src/pa/linux.S: Likewise. + +2006-04-12 James E Wilson <wilson@specifix.com> + + PR libgcj/26483 + * src/ia64/ffi.c (stf_spill, ldf_fill): Rewrite as macros. + (hfa_type_load): Call stf_spill. + (hfa_type_store): Call ldf_fill. + (ffi_call): Adjust calls to above routines. Add local temps for + macro result. + +2006-04-10 Matthias Klose <doko@debian.org> + + * testsuite/lib/libffi-dg.exp (libffi-init): Recognize multilib + directory names containing underscores. + +2006-04-07 James E Wilson <wilson@specifix.com> + + * testsuite/libffi.call/float4.c: New testcase. + +2006-04-05 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> + Andreas Tobler <a.tobler@schweiz.ch> + + * Makefile.am: Add PA_HPUX port. + * Makefile.in: Regenerate. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + * configure.ac: Add PA_HPUX rules. + * configure: Regenerate. + * src/pa/ffitarget.h: Rename linux target to PA_LINUX. + Add PA_HPUX and PA64_HPUX. + Rename FFI_LINUX ABI to FFI_PA32 ABI. + (FFI_TRAMPOLINE_SIZE): Define for 32-bit HP-UX targets. + (FFI_TYPE_SMALL_STRUCT2): Define. + (FFI_TYPE_SMALL_STRUCT4): Likewise. + (FFI_TYPE_SMALL_STRUCT8): Likewise. + (FFI_TYPE_SMALL_STRUCT3): Redefine. + (FFI_TYPE_SMALL_STRUCT5): Likewise. + (FFI_TYPE_SMALL_STRUCT6): Likewise. + (FFI_TYPE_SMALL_STRUCT7): Likewise. + * src/pa/ffi.c (ROUND_DOWN): Delete. + (fldw, fstw, fldd, fstd): Use '__asm__'. + (ffi_struct_type): Add support for FFI_TYPE_SMALL_STRUCT2, + FFI_TYPE_SMALL_STRUCT4 and FFI_TYPE_SMALL_STRUCT8. + (ffi_prep_args_LINUX): Rename to ffi_prep_args_pa32. Update comment. + Simplify incrementing of stack slot variable. Change type of local + 'n' to unsigned int. + (ffi_size_stack_LINUX): Rename to ffi_size_stack_pa32. Handle long + double on PA_HPUX. + (ffi_prep_cif_machdep): Likewise. + (ffi_call): Likewise. + (ffi_closure_inner_LINUX): Rename to ffi_closure_inner_pa32. Change + return type to ffi_status. Simplify incrementing of stack slot + variable. Only copy floating point argument registers when PA_LINUX + is true. Reformat debug statement. + Add support for FFI_TYPE_SMALL_STRUCT2, FFI_TYPE_SMALL_STRUCT4 and + FFI_TYPE_SMALL_STRUCT8. + (ffi_closure_LINUX): Rename to ffi_closure_pa32. Add 'extern' to + declaration. + (ffi_prep_closure): Make linux trampoline conditional on PA_LINUX. + Add nops to cache flush. Add trampoline for PA_HPUX. + * src/pa/hpux32.S: New file. + * src/pa/linux.S (ffi_call_LINUX): Rename to ffi_call_pa32. Rename + ffi_prep_args_LINUX to ffi_prep_args_pa32. + Localize labels. Add support for 2, 4 and 8-byte small structs. Handle + unaligned destinations in 3, 5, 6 and 7-byte small structs. Order + argument type checks so that common argument types appear first. + (ffi_closure_LINUX): Rename to ffi_closure_pa32. Rename + ffi_closure_inner_LINUX to ffi_closure_inner_pa32. + +2006-03-24 Alan Modra <amodra@bigpond.net.au> + + * src/powerpc/ffitarget.h (enum ffi_abi): Add FFI_LINUX. Default + for 32-bit using IBM extended double format. Fix FFI_LAST_ABI. + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Handle linux variant of + FFI_TYPE_LONGDOUBLE. + (ffi_prep_args64): Assert using IBM extended double. + (ffi_prep_cif_machdep): Don't munge FFI_TYPE_LONGDOUBLE type. + Handle FFI_LINUX FFI_TYPE_LONGDOUBLE return and args. + (ffi_call): Handle FFI_LINUX. + (ffi_closure_helper_SYSV): Non FFI_LINUX long double return needs + gpr3 return pointer as for struct return. Handle FFI_LINUX + FFI_TYPE_LONGDOUBLE return and args. Don't increment "nf" + unnecessarily. + * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Load both f1 and f2 + for FFI_TYPE_LONGDOUBLE. Move epilogue insns into case table. + Don't use r6 as pointer to results, instead use sp offset. Don't + make a special call to load lr with case table address, instead + use offset from previous call. + * src/powerpc/sysv.S (ffi_call_SYSV): Save long double return. + * src/powerpc/linux64.S (ffi_call_LINUX64): Simplify long double + return. + +2006-03-15 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh64/ffi.c (ffi_prep_cif_machdep): Handle float arguments + passed with FP registers correctly. + (ffi_closure_helper_SYSV): Likewise. + * src/sh64/sysv.S: Likewise. + +2006-03-01 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.special/unwindtest.cc (closure_test_fn): Mark cif, + args and userdata unused. + (closure_test_fn1): Mark cif and userdata unused. + (main): Remove unused res. + +2006-02-28 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/call.exp: Adjust FSF address. Add test runs for + -O2, -O3, -Os and the warning flags -W -Wall. + * testsuite/libffi.special/special.exp: Likewise. + * testsuite/libffi.call/ffitest.h: Add an __UNUSED__ macro to mark + unused parameter unused for gcc or else do nothing. + * testsuite/libffi.special/ffitestcxx.h: Likewise. + * testsuite/libffi.call/cls_12byte.c (cls_struct_12byte_gn): Mark cif + and userdata unused. + * testsuite/libffi.call/cls_16byte.c (cls_struct_16byte_gn): Likewise. + * testsuite/libffi.call/cls_18byte.c (cls_struct_18byte_gn): Likewise. + * testsuite/libffi.call/cls_19byte.c (cls_struct_19byte_gn): Likewise. + * testsuite/libffi.call/cls_1_1byte.c (cls_struct_1_1byte_gn): Likewise. + * testsuite/libffi.call/cls_20byte.c (cls_struct_20byte_gn): Likewise. + * testsuite/libffi.call/cls_20byte1.c (cls_struct_20byte_gn): Likewise. + * testsuite/libffi.call/cls_24byte.c (cls_struct_24byte_gn): Likewise. + * testsuite/libffi.call/cls_2byte.c (cls_struct_2byte_gn): Likewise. + * testsuite/libffi.call/cls_3_1byte.c (cls_struct_3_1byte_gn): Likewise. + * testsuite/libffi.call/cls_3byte1.c (cls_struct_3byte_gn): Likewise. + * testsuite/libffi.call/cls_3byte2.c (cls_struct_3byte_gn1): Likewise. + * testsuite/libffi.call/cls_4_1byte.c (cls_struct_4_1byte_gn): Likewise. + * testsuite/libffi.call/cls_4byte.c (cls_struct_4byte_gn): Likewise. + * testsuite/libffi.call/cls_5_1_byte.c (cls_struct_5byte_gn): Likewise. + * testsuite/libffi.call/cls_5byte.c (cls_struct_5byte_gn): Likewise. + * testsuite/libffi.call/cls_64byte.c (cls_struct_64byte_gn): Likewise. + * testsuite/libffi.call/cls_6_1_byte.c (cls_struct_6byte_gn): Likewise. + * testsuite/libffi.call/cls_6byte.c (cls_struct_6byte_gn): Likewise. + * testsuite/libffi.call/cls_7_1_byte.c (cls_struct_7byte_gn): Likewise. + * testsuite/libffi.call/cls_7byte.c (cls_struct_7byte_gn): Likewise. + * testsuite/libffi.call/cls_8byte.c (cls_struct_8byte_gn): Likewise. + * testsuite/libffi.call/cls_9byte1.c (cls_struct_9byte_gn): Likewise. + * testsuite/libffi.call/cls_9byte2.c (cls_struct_9byte_gn): Likewise. + * testsuite/libffi.call/cls_align_double.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_float.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_longdouble.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_pointer.c (cls_struct_align_fn): Cast + void* to avoid compiler warning. + (main): Likewise. + (cls_struct_align_gn): Mark cif and userdata unused. + * testsuite/libffi.call/cls_align_sint16.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_sint32.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_sint64.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_uint16.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_align_uint32.c (cls_struct_align_gn): + Likewise. + * testsuite/libffi.call/cls_double.c (cls_ret_double_fn): Likewise. + * testsuite/libffi.call/cls_float.c (cls_ret_float_fn): Likewise. + * testsuite/libffi.call/cls_multi_schar.c (test_func_gn): Mark cif and + data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_sshort.c (test_func_gn): Mark cif and + data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_sshortchar.c (test_func_gn): Mark cif + and data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_uchar.c (test_func_gn): Mark cif and + data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_ushort.c (test_func_gn): Mark cif and + data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_multi_ushortchar.c (test_func_gn): Mark cif + and data unused. + (main): Cast res_call to silence gcc. + * testsuite/libffi.call/cls_schar.c (cls_ret_schar_fn): Mark cif and + userdata unused. + (cls_ret_schar_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_sint.c (cls_ret_sint_fn): Mark cif and + userdata unused. + (cls_ret_sint_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_sshort.c (cls_ret_sshort_fn): Mark cif and + userdata unused. + (cls_ret_sshort_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_uchar.c (cls_ret_uchar_fn): Mark cif and + userdata unused. + (cls_ret_uchar_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Mark cif and + userdata unused. + (cls_ret_uint_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/cls_ulonglong.c (cls_ret_ulonglong_fn): Mark cif + and userdata unused. + * testsuite/libffi.call/cls_ushort.c (cls_ret_ushort_fn): Mark cif and + userdata unused. + (cls_ret_ushort_fn): Cast printf parameter to silence gcc. + * testsuite/libffi.call/float.c (floating): Remove unused parameter e. + * testsuite/libffi.call/float1.c (main): Remove unused variable i. + Cleanup white spaces. + * testsuite/libffi.call/negint.c (checking): Remove unused variable i. + * testsuite/libffi.call/nested_struct.c (cls_struct_combined_gn): Mark + cif and userdata unused. + * testsuite/libffi.call/nested_struct1.c (cls_struct_combined_gn): + Likewise. + * testsuite/libffi.call/nested_struct10.c (B_gn): Likewise. + * testsuite/libffi.call/nested_struct2.c (B_fn): Adjust printf + formatters to silence gcc. + (B_gn): Mark cif and userdata unused. + * testsuite/libffi.call/nested_struct3.c (B_gn): Mark cif and userdata + unused. + * testsuite/libffi.call/nested_struct4.c: Mention related PR. + (B_gn): Mark cif and userdata unused. + * testsuite/libffi.call/nested_struct5.c (B_gn): Mark cif and userdata + unused. + * testsuite/libffi.call/nested_struct6.c: Mention related PR. + (B_gn): Mark cif and userdata unused. + * testsuite/libffi.call/nested_struct7.c (B_gn): Mark cif and userdata + unused. + * testsuite/libffi.call/nested_struct8.c (B_gn): Likewise. + * testsuite/libffi.call/nested_struct9.c (B_gn): Likewise. + * testsuite/libffi.call/problem1.c (stub): Likewise. + * testsuite/libffi.call/pyobjc-tc.c (main): Cast the result to silence + gcc. + * testsuite/libffi.call/return_fl2.c (return_fl): Add the note mentioned + in the last commit for this test case in the test case itself. + * testsuite/libffi.call/closure_fn0.c (closure_test_fn0): Mark cif as + unused. + * testsuite/libffi.call/closure_fn1.c (closure_test_fn1): Likewise. + * testsuite/libffi.call/closure_fn2.c (closure_test_fn2): Likewise. + * testsuite/libffi.call/closure_fn3.c (closure_test_fn3): Likewise. + * testsuite/libffi.call/closure_fn4.c (closure_test_fn0): Likewise. + * testsuite/libffi.call/closure_fn5.c (closure_test_fn5): Likewise. + * testsuite/libffi.call/closure_fn6.c (closure_test_fn0): Likewise. + +2006-02-22 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/sysv.S: Fix register numbers in the FDE for + ffi_closure_SYSV. + +2006-02-20 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/return_fl2.c (return_fl): Remove static + declaration to avoid a false negative on ix86. See PR323. + +2006-02-18 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/ffi.c (ffi_closure_helper_SYSV): Remove unused variable + and cast integer to void * if needed. Update the pointer to + the FP register saved area correctly. + +2006-02-17 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/nested_struct6.c: XFAIL this test until PR25630 + is fixed. + * testsuite/libffi.call/nested_struct4.c: Likewise. + +2006-02-16 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/return_dbl.c: New test case. + * testsuite/libffi.call/return_dbl1.c: Likewise. + * testsuite/libffi.call/return_dbl2.c: Likewise. + * testsuite/libffi.call/return_fl.c: Likewise. + * testsuite/libffi.call/return_fl1.c: Likewise. + * testsuite/libffi.call/return_fl2.c: Likewise. + * testsuite/libffi.call/return_fl3.c: Likewise. + * testsuite/libffi.call/closure_fn6.c: Likewise. + + * testsuite/libffi.call/nested_struct2.c: Remove ffi_type_mylong + definition. + * testsuite/libffi.call/ffitest.h: Add ffi_type_mylong definition + here to be used by other test cases too. + + * testsuite/libffi.call/nested_struct10.c: New test case. + * testsuite/libffi.call/nested_struct9.c: Likewise. + * testsuite/libffi.call/nested_struct8.c: Likewise. + * testsuite/libffi.call/nested_struct7.c: Likewise. + * testsuite/libffi.call/nested_struct6.c: Likewise. + * testsuite/libffi.call/nested_struct5.c: Likewise. + * testsuite/libffi.call/nested_struct4.c: Likewise. + +2006-01-21 Andreas Tobler <a.tobler@schweiz.ch> + + * configure.ac: Enable libffi for sparc64-*-freebsd*. + * configure: Rebuilt. + +2006-01-18 Jakub Jelinek <jakub@redhat.com> + + * src/powerpc/sysv.S (smst_two_register): Don't call __ashldi3, + instead do the shifting inline. + * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't compute %r5 + shift count unconditionally. Simplify load sequences for 1, 2, 3, 4 + and 8 byte structs, for the remaining struct sizes don't call + __lshrdi3, instead do the shifting inline. + +2005-12-07 Thiemo Seufer <ths@networkno.de> + + * src/mips/ffitarget.h: Remove obsolete sgidefs.h include. Add + missing parentheses. + * src/mips/o32.S (ffi_call_O32): Code formatting. Define + and use A3_OFF, FP_OFF, RA_OFF. Micro-optimizations. + (ffi_closure_O32): Likewise, but with newly defined A3_OFF2, + A2_OFF2, A1_OFF2, A0_OFF2, RA_OFF2, FP_OFF2, S0_OFF2, GP_OFF2, + V1_OFF2, V0_OFF2, FA_1_1_OFF2, FA_1_0_OFF2, FA_0_1_OFF2, + FA_0_0_OFF2. + * src/mips/ffi.c (ffi_prep_args): Code formatting. Fix + endianness bugs. + (ffi_prep_closure): Improve trampoline instruction scheduling. + (ffi_closure_mips_inner_O32): Fix endianness bugs. + +2005-12-03 Alan Modra <amodra@bigpond.net.au> + + * src/powerpc/ffi.c: Formatting. + (ffi_prep_args_SYSV): Avoid possible aliasing problems by using unions. + (ffi_prep_args64): Likewise. + +2005-09-30 Geoffrey Keating <geoffk@apple.com> + + * testsuite/lib/libffi-dg.exp (libffi_target_compile): For + darwin, use -shared-libgcc not -lgcc_s, and explain why. + +2005-09-26 Tom Tromey <tromey@redhat.com> + + * testsuite/libffi.call/float1.c (value_type): New typedef. + (CANARY): New define. + (main): Check for result buffer overflow. + * src/powerpc/linux64.S: Handle linux64 long double returns. + * src/powerpc/ffi.c (FLAG_RETURNS_128BITS): New constant. + (ffi_prep_cif_machdep): Handle linux64 long double returns. + +2005-08-25 Alan Modra <amodra@bigpond.net.au> + + PR target/23404 + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack + homed fp args. + (ffi_status ffi_prep_cif_machdep): Correct stack sizing for same. + +2005-08-11 Jakub Jelinek <jakub@redhat.com> + + * configure.ac (HAVE_HIDDEN_VISIBILITY_ATTRIBUTE): New test. + (AH_BOTTOM): Add FFI_HIDDEN definition. + * configure: Rebuilt. + * fficonfig.h.in: Rebuilt. + * src/powerpc/ffi.c (hidden): Remove. + (ffi_closure_LINUX64, ffi_prep_args64, ffi_call_LINUX64, + ffi_closure_helper_LINUX64): Use FFI_HIDDEN instead of hidden. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64, + .ffi_closure_LINUX64): Use FFI_HIDDEN instead of .hidden. + * src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): Remove, + add FFI_HIDDEN to its prototype. + (ffi_closure_SYSV_inner): New. + * src/x86/sysv.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. + * src/x86/win32.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. + +2005-08-10 Alfred M. Szmidt <ams@gnu.org> + + PR libffi/21819: + * configure: Rebuilt. + * configure.ac: Handle i*86-*-gnu*. + +2005-08-09 Jakub Jelinek <jakub@redhat.com> + + * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Use + DW_CFA_offset_extended_sf rather than + DW_CFA_GNU_negative_offset_extended. + * src/powerpc/sysv.S (ffi_call_SYSV): Likewise. + +2005-07-22 SUGIOKA Toshinobu <sugioka@itonet.co.jp> + + * src/sh/sysv.S (ffi_call_SYSV): Stop argument popping correctly + on sh3. + (ffi_closure_SYSV): Change the stack layout for sh3 struct argument. + * src/sh/ffi.c (ffi_prep_args): Fix sh3 argument copy, when it is + partially on register. + (ffi_closure_helper_SYSV): Likewise. + (ffi_prep_cif_machdep): Don't set too many cif->flags. + +2005-07-20 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/ffi.c (ffi_call): Handle small structures correctly. + Remove empty line. + * src/sh64/ffi.c (simple_type): Remove. + (return_type): Handle small structures correctly. + (ffi_prep_args): Likewise. + (ffi_call): Likewise. + (ffi_closure_helper_SYSV): Likewise. + * src/sh64/sysv.S (ffi_call_SYSV): Handle 1, 2 and 4-byte return. + Emit position independent code if PIC and remove wrong datalabel + prefixes from EH data. + +2005-07-19 Andreas Tobler <a.tobler@schweiz.ch> + + * Makefile.am (nodist_libffi_la_SOURCES): Add POWERPC_FREEBSD. + * Makefile.in: Regenerate. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + * configure.ac: Add POWERPC_FREEBSD rules. + * configure: Regenerate. + * src/powerpc/ffitarget.h: Add POWERPC_FREEBSD rules. + (FFI_SYSV_TYPE_SMALL_STRUCT): Define. + * src/powerpc/ffi.c: Add flags to handle small structure returns + in ffi_call_SYSV. + (ffi_prep_cif_machdep): Handle small structures for SYSV 4 ABI. + Aka FFI_SYSV. + (ffi_closure_helper_SYSV): Likewise. + * src/powerpc/ppc_closure.S: Add return types for small structures. + * src/powerpc/sysv.S: Add bits to handle small structures for + final SYSV 4 ABI. + +2005-07-10 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/cls_5_1_byte.c: New test file. + * testsuite/libffi.call/cls_6_1_byte.c: Likewise. + * testsuite/libffi.call/cls_7_1_byte.c: Likewise. + +2005-07-05 Randolph Chung <tausq@debian.org> + + * src/pa/ffi.c (ffi_struct_type): Rename FFI_TYPE_SMALL_STRUCT1 + as FFI_TYPE_SMALL_STRUCT3. Break out handling for 5-7 byte + structures. Kill compilation warnings. + (ffi_closure_inner_LINUX): Print return values as hex in debug + message. Rename FFI_TYPE_SMALL_STRUCT1 as FFI_TYPE_SMALL_STRUCT3. + Properly handle 5-7 byte structure returns. + * src/pa/ffitarget.h (FFI_TYPE_SMALL_STRUCT1) + (FFI_TYPE_SMALL_STRUCT2): Remove. + (FFI_TYPE_SMALL_STRUCT3, FFI_TYPE_SMALL_STRUCT5) + (FFI_TYPE_SMALL_STRUCT6, FFI_TYPE_SMALL_STRUCT7): Define. + * src/pa/linux.S: Mark source file as using PA1.1 assembly. + (checksmst1, checksmst2): Remove. + (checksmst3): Optimize handling of 3-byte struct returns. + (checksmst567): Properly handle 5-7 byte struct returns. + +2005-06-15 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + PR libgcj/21943 + * src/mips/n32.S: Enforce PIC code. + * src/mips/o32.S: Likewise. + +2005-06-15 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * configure.ac: Treat i*86-*-solaris2.10 and up as X86_64. + * configure: Regenerate. + +2005-06-01 Alan Modra <amodra@bigpond.net.au> + + * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't use JUMPTARGET + to call ffi_closure_helper_SYSV. Append @local instead. + * src/powerpc/sysv.S (ffi_call_SYSV): Likewise for ffi_prep_args_SYSV. + +2005-05-17 Kelley Cook <kcook@gcc.gnu.org> + + * configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS. + Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF. + * Makefile.am (ACLOCAL_AMFLAGS): Remove -I ../config. + * aclocal.m4, configure, fficonfig.h.in, Makefile.in, + include/Makefile.in, testsuite/Makefile.in: Regenerate. + +2005-05-09 Mike Stump <mrs@apple.com> + + * configure: Regenerate. + +2005-05-08 Richard Henderson <rth@redhat.com> + + PR libffi/21285 + * src/alpha/osf.S: Update unwind into to match code. + +2005-05-04 Andreas Degert <ad@papyrus-gmbh.de> + Richard Henderson <rth@redhat.com> + + * src/x86/ffi64.c (ffi_prep_cif_machdep): Save sse-used flag in + bit 11 of flags. + (ffi_call): Mask return type field. Pass ssecount to ffi_call_unix64. + (ffi_prep_closure): Set carry bit if sse-used flag set. + * src/x86/unix64.S (ffi_call_unix64): Add ssecount argument. + Only load sse registers if ssecount non-zero. + (ffi_closure_unix64): Only save sse registers if carry set on entry. + +2005-04-29 Ralf Corsepius <ralf.corsepius@rtems.org> + + * configure.ac: Add i*86-*-rtems*, sparc*-*-rtems*, + powerpc-*rtems*, arm*-*-rtems*, sh-*-rtems*. + * configure: Regenerate. + +2005-04-20 Hans-Peter Nilsson <hp@axis.com> + + * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): In regsub use, + have Tcl8.3-compatible intermediate variable. + +2005-04-18 Simon Posnjak <simon.posnjak@siol.net> + Hans-Peter Nilsson <hp@axis.com> + + * Makefile.am: Add CRIS support. + * configure.ac: Likewise. + * Makefile.in, configure, testsuite/Makefile.in, + include/Makefile.in: Regenerate. + * src/cris: New directory. + * src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files. + * src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__. + + * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): Replace \n with + \r?\n in output tests. + +2005-04-12 Mike Stump <mrs@apple.com> + + * configure: Regenerate. + +2005-03-30 Hans Boehm <Hans.Boehm@hp.com> + + * src/ia64/ffitarget.h (ffi_arg): Use long long instead of DI. + +2005-03-30 Steve Ellcey <sje@cup.hp.com> + + * src/ia64/ffitarget.h (ffi_arg) ADD DI attribute. + (ffi_sarg) Ditto. + * src/ia64/unix.S (ffi_closure_unix): Extend gp + to 64 bits in ILP32 mode. + Load 64 bits even for short data. + +2005-03-23 Mike Stump <mrs@apple.com> + + * src/powerpc/darwin.S: Update for -m64 multilib. + * src/powerpc/darwin_closure.S: Likewise. + +2005-03-21 Zack Weinberg <zack@codesourcery.com> + + * configure.ac: Do not invoke TL_AC_GCC_VERSION. + Do not set tool_include_dir. + * aclocal.m4, configure, Makefile.in, testsuite/Makefile.in: + Regenerate. + * include/Makefile.am: Set gcc_version and toollibffidir. + * include/Makefile.in: Regenerate. + +2005-02-22 Andrew Haley <aph@redhat.com> + + * src/powerpc/ffi.c (ffi_prep_cif_machdep): Bump alignment to + odd-numbered register pairs for 64-bit integer types. + +2005-02-23 Andreas Tobler <a.tobler@schweiz.ch> + + PR libffi/20104 + * testsuite/libffi.call/return_ll1.c: New test case. + +2005-02-11 Janis Johnson <janis187@us.ibm.com> + + * testsuite/libffi.call/cls_align_longdouble.c: Remove dg-options. + * testsuite/libffi.call/float.c: Ditto. + * testsuite/libffi.call/float2.c: Ditto. + * testsuite/libffi.call/float3.c: Ditto. + +2005-02-08 Andreas Tobler <a.tobler@schweiz.ch> + + * src/frv/ffitarget.h: Remove PPC stuff which does not belong to frv. + +2005-01-12 Eric Botcazou <ebotcazou@libertysurf.fr> + + * testsuite/libffi.special/special.exp (cxx_options): Add + -shared-libgcc. + +2004-12-31 Richard Henderson <rth@redhat.com> + + * src/types.c (FFI_AGGREGATE_TYPEDEF): Remove. + (FFI_TYPEDEF): Rename from FFI_INTEGRAL_TYPEDEF. Replace size and + offset parameters with a type parameter; deduce size and structure + alignment. Update all users. + +2004-12-31 Richard Henderson <rth@redhat.com> + + * src/types.c (FFI_TYPE_POINTER): Define with sizeof. + (FFI_TYPE_LONGDOUBLE): Fix for ia64. + * src/ia64/ffitarget.h (struct ffi_ia64_trampoline_struct): Move + into ffi_prep_closure. + * src/ia64/ia64_flags.h, src/ia64/ffi.c, src/ia64/unix.S: Rewrite + from scratch. + +2004-12-27 Richard Henderson <rth@redhat.com> + + * src/x86/unix64.S: Fix typo in unwind info. + +2004-12-25 Richard Henderson <rth@redhat.com> + + * src/x86/ffi64.c (struct register_args): Rename from stackLayout. + (enum x86_64_reg_class): Add X86_64_COMPLEX_X87_CLASS. + (merge_classes): Check for it. + (SSE_CLASS_P): New. + (classify_argument): Pass byte_offset by value; perform all updates + inside struct case. + (examine_argument): Add classes argument; handle + X86_64_COMPLEX_X87_CLASS. + (ffi_prep_args): Merge into ... + (ffi_call): ... here. Share stack frame with ffi_call_unix64. + (ffi_prep_cif_machdep): Setup cif->flags for proper structure return. + (ffi_fill_return_value): Remove. + (ffi_prep_closure): Remove dead assert. + (ffi_closure_unix64_inner): Rename from ffi_closure_UNIX64_inner. + Rewrite to use struct register_args instead of va_list. Create + flags for handling structure returns. + * src/x86/unix64.S: Remove dead strings. + (ffi_call_unix64): Rename from ffi_call_UNIX64. Rewrite to share + stack frame with ffi_call. Handle structure returns properly. + (float2sse, floatfloat2sse, double2sse): Remove. + (sse2float, sse2double, sse2floatfloat): Remove. + (ffi_closure_unix64): Rename from ffi_closure_UNIX64. Rewrite + to handle structure returns properly. + +2004-12-08 David Edelsohn <edelsohn@gnu.org> + + * Makefile.am (AM_MAKEFLAGS): Remove duplicate LIBCFLAGS and + PICFLAG. + * Makefile.in: Regenerated. + +2004-12-02 Richard Sandiford <rsandifo@redhat.com> + + * configure.ac: Use TL_AC_GCC_VERSION to set gcc_version. + * configure, aclocal.m4, Makefile.in: Regenerate. + * include/Makefile.in, testsuite/Makefile.in: Regenerate. + +2004-11-29 Kelley Cook <kcook@gcc.gnu.org> + + * configure: Regenerate for libtool change. + +2004-11-25 Kelley Cook <kcook@gcc.gnu.org> + + * configure: Regenerate for libtool reversion. + +2004-11-24 Kelley Cook <kcook@gcc.gnu.org> + + * configure: Regenerate for libtool change. + +2004-11-23 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> + + * testsuite/lib/libffi-dg.exp: Use new procs in target-libpath.exp. + +2004-11-23 Richard Sandiford <rsandifo@redhat.com> + + * src/mips/o32.S (ffi_call_O32, ffi_closure_O32): Use jalr instead + of jal. Use an absolute encoding for the frame information. + +2004-11-23 Kelley Cook <kcook@gcc.gnu.org> + + * Makefile.am: Remove no-dependencies. Add ACLOCAL_AMFLAGS. + * acinclude.m4: Delete logic for sincludes. + * aclocal.m4, Makefile.in, configure: Regenerate. + * include/Makefile: Likewise. + * testsuite/Makefile: Likewise. + +2004-11-22 Eric Botcazou <ebotcazou@libertysurf.fr> + + * src/sparc/ffi.c (ffi_prep_closure): Align doubles and 64-bit integers + on a 8-byte boundary. + * src/sparc/v8.S (ffi_closure_v8): Reserve frame space for arguments. + +2004-10-27 Richard Earnshaw <rearnsha@arm.com> + + * src/arm/ffi.c (ffi_prep_cif_machdep): Handle functions that return + long long values. Round stack allocation to a multiple of 8 bytes + for ATPCS compatibility. + * src/arm/sysv.S (ffi_call_SYSV): Rework to avoid use of APCS register + names. Handle returning long long types. Add Thumb and interworking + support. Improve soft-float code. + +2004-10-27 Richard Earnshaw <rearnsha@arm.com> + + * testsuite/lib/libffi-db.exp (load_gcc_lib): New function. + (libffi_exit): New function. + (libffi_init): Build the testglue wrapper if needed. + +2004-10-25 Eric Botcazou <ebotcazou@libertysurf.fr> + + PR other/18138 + * testsuite/lib/libffi-dg.exp: Accept more than one multilib libgcc. + +2004-10-25 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com> + + * src/m32r/libffitarget.h (FFI_CLOSURES): Set to 0. + +2004-10-20 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/sysv.S (ffi_call_SYSV): Don't align for double data. + * testsuite/libffi.call/float3.c: New test case. + +2004-10-18 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/ffi.c (ffi_prep_closure): Set T bit in trampoline for + the function returning a structure pointed with R2. + * src/sh/sysv.S (ffi_closure_SYSV): Use R2 as the pointer to + the structure return value if T bit set. Emit position + independent code and EH data if PIC. + +2004-10-13 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com> + + * Makefile.am: Add m32r support. + * configure.ac: Likewise. + * Makefile.in: Regenerate. + * confiugre: Regenerate. + * src/types.c: Add m32r port to FFI_INTERNAL_TYPEDEF + (uint64, sint64, double, longdouble) + * src/m32r: New directory. + * src/m32r/ffi.c: New file. + * src/m32r/sysv.S: Likewise. + * src/m32r/ffitarget.h: Likewise. + +2004-10-02 Kaz Kojima <kkojima@gcc.gnu.org> + + * testsuite/libffi.call/negint.c: New test case. + +2004-09-14 H.J. Lu <hongjiu.lu@intel.com> + + PR libgcj/17465 + * testsuite/lib/libffi-dg.exp: Don't use global ld_library_path. + Set up LD_LIBRARY_PATH, SHLIB_PATH, LD_LIBRARYN32_PATH, + LD_LIBRARY64_PATH, LD_LIBRARY_PATH_32, LD_LIBRARY_PATH_64 and + DYLD_LIBRARY_PATH. + +2004-09-05 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/many_win32.c: Remove whitespaces. + * testsuite/libffi.call/promotion.c: Likewise. + * testsuite/libffi.call/return_ll.c: Remove unused var. Cleanup + whitespaces. + * testsuite/libffi.call/return_sc.c: Likewise. + * testsuite/libffi.call/return_uc.c: Likewise. + +2004-09-05 Andreas Tobler <a.tobler@schweiz.ch> + + * src/powerpc/darwin.S: Fix comments and identation. + * src/powerpc/darwin_closure.S: Likewise. + +2004-09-02 Andreas Tobler <a.tobler@schweiz.ch> + + * src/powerpc/ffi_darwin.c: Add flag for longdouble return values. + (ffi_prep_args): Handle longdouble arguments. + (ffi_prep_cif_machdep): Set flags for longdouble. Calculate space for + longdouble. + (ffi_closure_helper_DARWIN): Add closure handling for longdouble. + * src/powerpc/darwin.S (_ffi_call_DARWIN): Add handling of longdouble + values. + * src/powerpc/darwin_closure.S (_ffi_closure_ASM): Likewise. + * src/types.c: Defined longdouble size and alignment for darwin. + +2004-09-02 Andreas Tobler <a.tobler@schweiz.ch> + + * src/powerpc/aix.S: Remove whitespaces. + * src/powerpc/aix_closure.S: Likewise. + * src/powerpc/asm.h: Likewise. + * src/powerpc/ffi.c: Likewise. + * src/powerpc/ffitarget.h: Likewise. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/linux64_closure.S: Likewise. + * src/powerpc/ppc_closure.S: Likewise. + * src/powerpc/sysv.S: Likewise. + +2004-08-30 Anthony Green <green@redhat.com> + + * Makefile.am: Add frv support. + * Makefile.in, testsuite/Makefile.in: Rebuilt. + * configure.ac: Read configure.host. + * configure.in: Read configure.host. + * configure.host: New file. frv-elf needs libgloss. + * include/ffi.h.in: Force ffi_closure to have a nice big (8) + alignment. This is needed to frv and shouldn't harm the others. + * include/ffi_common.h (ALIGN_DOWN): New macro. + * src/frv/ffi.c, src/frv/ffitarget.h, src/frv/eabi.S: New files. + +2004-08-24 David Daney <daney@avtrex.com> + + * testsuite/libffi.call/closure_fn0.c: Xfail mips64* instead of mips*. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/closure_fn4.c: Likewise. + * testsuite/libffi.call/closure_fn5.c: Likewise. + * testsuite/libffi.call/cls_18byte.c: Likewise. + * testsuite/libffi.call/cls_19byte.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_20byte1.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_64byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_9byte1.c: Likewise. + * testsuite/libffi.call/cls_9byte2.c: Likewise. + * testsuite/libffi.call/cls_align_double.c: Likewise. + * testsuite/libffi.call/cls_align_float.c: Likewise. + * testsuite/libffi.call/cls_align_longdouble.c: Likewise. + * testsuite/libffi.call/cls_align_pointer.c: Likewise. + * testsuite/libffi.call/cls_align_sint16.c: Likewise. + * testsuite/libffi.call/cls_align_sint32.c: Likewise. + * testsuite/libffi.call/cls_align_sint64.c: Likewise. + * testsuite/libffi.call/cls_align_uint16.c: Likewise. + * testsuite/libffi.call/cls_align_uint32.c: Likewise. + * testsuite/libffi.call/cls_align_uint64.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_multi_schar.c: Likewise. + * testsuite/libffi.call/cls_multi_sshort.c: Likewise. + * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. + * testsuite/libffi.call/cls_multi_uchar.c: Likewise. + * testsuite/libffi.call/cls_multi_ushort.c: Likewise. + * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. + * testsuite/libffi.call/cls_schar.c: Likewise. + * testsuite/libffi.call/cls_sint.c: Likewise. + * testsuite/libffi.call/cls_sshort.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/nested_struct.c: Likewise. + * testsuite/libffi.call/nested_struct1.c: Likewise. + * testsuite/libffi.call/nested_struct2.c: Likewise. + * testsuite/libffi.call/nested_struct3.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + * testsuite/libffi.special/unwindtest.cc: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise and set return value + to zero. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + +2004-08-23 David Daney <daney@avtrex.com> + + PR libgcj/13141 + * src/mips/ffitarget.h (FFI_O32_SOFT_FLOAT): New ABI. + * src/mips/ffi.c (ffi_prep_args): Fix alignment calculation. + (ffi_prep_cif_machdep): Handle FFI_O32_SOFT_FLOAT floating point + parameters and return types. + (ffi_call): Handle FFI_O32_SOFT_FLOAT ABI. + (ffi_prep_closure): Ditto. + (ffi_closure_mips_inner_O32): Handle FFI_O32_SOFT_FLOAT ABI, fix + alignment calculations. + * src/mips/o32.S (ffi_closure_O32): Don't use floating point + instructions if FFI_O32_SOFT_FLOAT, make stack frame ABI compliant. + +2004-08-14 Casey Marshall <csm@gnu.org> + + * src/mips/ffi.c (ffi_pref_cif_machdep): set `cif->flags' to + contain `FFI_TYPE_UINT64' as return type for any 64-bit + integer (O32 ABI only). + (ffi_prep_closure): new function. + (ffi_closure_mips_inner_O32): new function. + * src/mips/ffitarget.h: Define `FFI_CLOSURES' and + `FFI_TRAMPOLINE_SIZE' appropriately if the ABI is o32. + * src/mips/o32.S (ffi_call_O32): add labels for .eh_frame. Return + 64 bit integers correctly. + (ffi_closure_O32): new function. + Added DWARF-2 unwind info for both functions. + +2004-08-10 Andrew Haley <aph@redhat.com> + + * src/x86/ffi64.c (ffi_prep_args ): 8-align all stack arguments. + +2004-08-01 Robert Millan <robertmh@gnu.org> + + * configure.ac: Detect knetbsd-gnu and kfreebsd-gnu. + * configure: Regenerate. + +2004-07-30 Maciej W. Rozycki <macro@linux-mips.org> + + * acinclude.m4 (AC_FUNC_MMAP_BLACKLIST): Check for <sys/mman.h> + and mmap() explicitly instead of relying on preset autoconf cache + variables. + * aclocal.m4: Regenerate. + * configure: Regenerate. + +2004-07-11 Ulrich Weigand <uweigand@de.ibm.com> + + * src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation. + (ffi_check_float_struct): Remove unused prototype. + +2004-06-30 Geoffrey Keating <geoffk@apple.com> + + * src/powerpc/ffi_darwin.c (flush_icache): ';' is a comment + character on Darwin, use '\n\t' instead. + +2004-06-26 Matthias Klose <doko@debian.org> + + * libtool-version: Fix typo in revision/age. + +2004-06-17 Matthias Klose <doko@debian.org> + + * libtool-version: New. + * Makefile.am (libffi_la_LDFLAGS): Use -version-info for soname. + * Makefile.in: Regenerate. + +2004-06-15 Paolo Bonzini <bonzini@gnu.org> + + * Makefile.am: Remove useless multilib rules. + * Makefile.in: Regenerate. + * aclocal.m4: Regenerate with automake 1.8.5. + * configure.ac: Remove useless multilib configury. + * configure: Regenerate. + +2004-06-15 Paolo Bonzini <bonzini@gnu.org> + + * .cvsignore: New file. + +2004-06-10 Jakub Jelinek <jakub@redhat.com> + + * src/ia64/unix.S (ffi_call_unix): Insert group barrier break + fp_done. + (ffi_closure_UNIX): Fix f14/f15 adjustment if FLOAT_SZ is ever + changed from 8. + +2004-06-06 Sean McNeil <sean@mcneil.com> + + * configure.ac: Add x86_64-*-freebsd* support. + * configure: Regenerate. + +2004-04-26 Joe Buck <jbuck@welsh-buck.org> + + Bug 15093 + * configure.ac: Test for existence of mmap and sys/mman.h before + checking blacklist. Fix suggested by Jim Wilson. + * configure: Regenerate. + +2004-04-26 Matt Austern <austern@apple.com> + + * src/powerpc/darwin.S: Go through a non-lazy pointer for initial + FDE location. + * src/powerpc/darwin_closure.S: Likewise. + +2004-04-24 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/cls_multi_schar.c (main): Fix initialization + error. Reported by Thomas Heller <theller@python.net>. + * testsuite/libffi.call/cls_multi_sshort.c (main): Likewise. + * testsuite/libffi.call/cls_multi_ushort.c (main): Likewise. + +2004-03-20 Matthias Klose <doko@debian.org> + + * src/pa/linux.S: Fix typo. + +2004-03-19 Matthias Klose <doko@debian.org> + + * Makefile.am: Update. + * Makefile.in: Regenerate. + * src/pa/ffi.h.in: Remove. + * src/pa/ffitarget.h: New file. + +2004-02-10 Randolph Chung <tausq@debian.org> + + * Makefile.am: Add PA support. + * Makefile.in: Regenerate. + * include/Makefile.in: Regenerate. + * configure.ac: Add PA target. + * configure: Regenerate. + * src/pa/ffi.c: New file. + * src/pa/ffi.h.in: Add PA support. + * src/pa/linux.S: New file. + * prep_cif.c: Add PA support. + +2004-03-16 Hosaka Yuji <hos@tamanegi.org> + + * src/types.c: Fix alignment size of X86_WIN32 case int64 and + double. + * src/x86/ffi.c (ffi_prep_args): Replace ecif->cif->rtype->type + with ecif->cif->flags. + (ffi_call, ffi_prep_incoming_args_SYSV): Replace cif->rtype->type + with cif->flags. + (ffi_prep_cif_machdep): Add X86_WIN32 struct case. + (ffi_closure_SYSV): Add 1 or 2-bytes struct case for X86_WIN32. + * src/x86/win32.S (retstruct1b, retstruct2b, sc_retstruct1b, + sc_retstruct2b): Add for 1 or 2-bytes struct case. + +2004-03-15 Kelley Cook <kcook@gcc.gnu.org> + + * configure.in: Rename file to ... + * configure.ac: ... this. + * fficonfig.h.in: Regenerate. + * Makefile.in: Regenerate. + * include/Makefile.in: Regenerate. + * testsuite/Makefile.in: Regenerate. + +2004-03-12 Matt Austern <austern@apple.com> + + * src/powerpc/darwin.S: Fix EH information so it corresponds to + changes in EH format resulting from addition of linkonce support. + * src/powerpc/darwin_closure.S: Likewise. + +2004-03-11 Andreas Tobler <a.tobler@schweiz.ch> + Paolo Bonzini <bonzini@gnu.org> + + * Makefile.am (AUTOMAKE_OPTIONS): Set them. + Remove VPATH. Remove rules for object files. Remove multilib support. + (AM_CCASFLAGS): Add. + * configure.in (AC_CONFIG_HEADERS): Relace AM_CONFIG_HEADER. + (AC_PREREQ): Bump version to 2.59. + (AC_INIT): Fill with version info and bug address. + (ORIGINAL_LD_FOR_MULTILIBS): Remove. + (AM_ENABLE_MULTILIB): Use this instead of AC_ARG_ENABLE. + De-precious CC so that the right flags are passed down to multilibs. + (AC_MSG_ERROR): Replace obsolete macro AC_ERROR. + (AC_CONFIG_FILES): Replace obsolete macro AC_LINK_FILES. + (AC_OUTPUT): Reorganize the output with AC_CONFIG_COMMANDS. + * configure: Rebuilt. + * aclocal.m4: Likewise. + * Makefile.in, include/Makefile.in, testsuite/Makefile.in: Likewise. + * fficonfig.h.in: Likewise. + +2004-03-11 Andreas Schwab <schwab@suse.de> + + * src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point + arguments from fp registers only for the first 8 parameter slots. + Don't convert a float parameter when passed in memory. + +2004-03-09 Hans-Peter Nilsson <hp@axis.com> + + * configure: Regenerate for config/accross.m4 correction. + +2004-02-25 Matt Kraai <kraai@alumni.cmu.edu> + + * src/powerpc/ffi.c (ffi_prep_args_SYSV): Change + ecif->cif->bytes to bytes. + (ffi_prep_cif_machdep): Add braces around nested if statement. + +2004-02-09 Alan Modra <amodra@bigpond.net.au> + + * src/types.c (pointer): POWERPC64 has 8 byte pointers. + + * src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling. + (ffi_closure_helper_LINUX64): Fix typo. + * testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128 + for powerpc64-*-*. + * testsuite/libffi.call/float.c: Likewise. + * testsuite/libffi.call/float2.c: Likewise. + +2004-02-08 Alan Modra <amodra@bigpond.net.au> + + * src/powerpc/ffi.c (ffi_prep_cif_machdep <FFI_LINUX64>): Correct + long double function return and long double arg handling. + (ffi_closure_helper_LINUX64): Formatting. Delete unused "ng" var. + Use "end_pfr" instead of "nf". Correct long double handling. + Localise "temp". + * src/powerpc/linux64.S (ffi_call_LINUX64): Save f2 long double + return value. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Allocate + space for long double return value. Adjust stack frame and offsets. + Load f2 long double return. + +2004-02-07 Alan Modra <amodra@bigpond.net.au> + + * src/types.c: Use 16 byte long double for POWERPC64. + +2004-01-25 Eric Botcazou <ebotcazou@libertysurf.fr> + + * src/sparc/ffi.c (ffi_prep_args_v9): Shift the parameter array + when the structure return address is passed in %o0. + (ffi_V9_return_struct): Rename into ffi_v9_layout_struct. + (ffi_v9_layout_struct): Align the field following a nested structure + on a word boundary. Use memmove instead of memcpy. + (ffi_call): Update call to ffi_V9_return_struct. + (ffi_prep_closure): Define 'ctx' only for V8. + (ffi_closure_sparc_inner): Clone into ffi_closure_sparc_inner_v8 + and ffi_closure_sparc_inner_v9. + (ffi_closure_sparc_inner_v8): Return long doubles by reference. + Always skip the structure return address. For structures and long + doubles, copy the argument directly. + (ffi_closure_sparc_inner_v9): Skip the structure return address only + if required. Shift the maximum floating-point slot accordingly. For + big structures, copy the argument directly; otherwise, left-justify the + argument and call ffi_v9_layout_struct to lay out the structure on + the stack. + * src/sparc/v8.S: Undef STACKFRAME before defining it. + (ffi_closure_v8): Pass the structure return address. Update call to + ffi_closure_sparc_inner_v8. Short-circuit FFI_TYPE_INT handling. + Skip the 'unimp' insn when returning long doubles and structures. + * src/sparc/v9.S: Undef STACKFRAME before defining it. + (ffi_closure_v9): Increase the frame size by 2 words. Short-circuit + FFI_TYPE_INT handling. Load structures both in integers and + floating-point registers on return. + * README: Update status of the SPARC port. + +2004-01-24 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/pyobjc-tc.c (main): Treat result value + as of type ffi_arg. + * testsuite/libffi.call/struct3.c (main): Fix CHECK. + +2004-01-22 Ulrich Weigand <uweigand@de.ibm.com> + + * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Treat result + value as of type ffi_arg, not unsigned int. + +2004-01-21 Michael Ritzert <ritzert@t-online.de> + + * ffi64.c (ffi_prep_args): Cast the RHS of an assignment instead + of the LHS. + +2004-01-12 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_32 for + Solaris. + +2004-01-08 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * testsuite/libffi.call/ffitest.h (allocate_mmap): Cast MAP_FAILED + to void *. + +2003-12-10 Richard Henderson <rth@redhat.com> + + * testsuite/libffi.call/cls_align_pointer.c: Cast pointers to + size_t instead of int. + +2003-12-04 Hosaka Yuji <hos@tamanegi.org> + + * testsuite/libffi.call/many_win32.c: Include <float.h>. + * testsuite/libffi.call/many_win32.c (main): Replace variable + int i with unsigned long ul. + + * testsuite/libffi.call/cls_align_uint64.c: New test case. + * testsuite/libffi.call/cls_align_sint64.c: Likewise. + * testsuite/libffi.call/cls_align_uint32.c: Likewise. + * testsuite/libffi.call/cls_align_sint32.c: Likewise. + * testsuite/libffi.call/cls_align_uint16.c: Likewise. + * testsuite/libffi.call/cls_align_sint16.c: Likewise. + * testsuite/libffi.call/cls_align_float.c: Likewise. + * testsuite/libffi.call/cls_align_double.c: Likewise. + * testsuite/libffi.call/cls_align_longdouble.c: Likewise. + * testsuite/libffi.call/cls_align_pointer.c: Likewise. + +2003-12-02 Hosaka Yuji <hos@tamanegi.org> + + PR other/13221 + * src/x86/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): + Align arguments to 32 bits. + +2003-12-01 Andreas Tobler <a.tobler@schweiz.ch> + + PR other/13221 + * testsuite/libffi.call/cls_multi_sshort.c: New test case. + * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. + * testsuite/libffi.call/cls_multi_uchar.c: Likewise. + * testsuite/libffi.call/cls_multi_schar.c: Likewise. + * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. + * testsuite/libffi.call/cls_multi_ushort.c: Likewise. + + * testsuite/libffi.special/unwindtest.cc: Cosmetics. + +2003-11-26 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * testsuite/libffi.call/ffitest.h: Include <fcntl.h>. + * testsuite/libffi.special/ffitestcxx.h: Likewise. + +2003-11-22 Andreas Tobler <a.tobler@schweiz.ch> + + * Makefile.in: Rebuilt. + * configure: Likewise. + * testsuite/libffi.special/unwindtest.cc: Convert the mmap to + the right type. + +2003-11-21 Andreas Jaeger <aj@suse.de> + Andreas Tobler <a.tobler@schweiz.ch> + + * acinclude.m4: Add AC_FUNC_MMAP_BLACKLIST. + * configure.in: Call AC_FUNC_MMAP_BLACKLIST. + * Makefile.in: Rebuilt. + * aclocal.m4: Likewise. + * configure: Likewise. + * fficonfig.h.in: Likewise. + * testsuite/lib/libffi-dg.exp: Add include dir. + * testsuite/libffi.call/ffitest.h: Add MMAP definitions. + * testsuite/libffi.special/ffitestcxx.h: Likewise. + * testsuite/libffi.call/closure_fn0.c: Use MMAP functionality + for ffi_closure if available. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c: Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/closure_fn4.c: Likewise. + * testsuite/libffi.call/closure_fn5.c: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_18byte.c: Likewise. + * testsuite/libffi.call/cls_19byte.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_20byte1.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + * testsuite/libffi.call/cls_64byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_9byte1.c: Likewise. + * testsuite/libffi.call/cls_9byte2.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_schar.c: Likewise. + * testsuite/libffi.call/cls_sint.c: Likewise. + * testsuite/libffi.call/cls_sshort.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/nested_struct.c: Likewise. + * testsuite/libffi.call/nested_struct1.c: Likewise. + * testsuite/libffi.call/nested_struct2.c: Likewise. + * testsuite/libffi.call/nested_struct3.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + * testsuite/libffi.special/unwindtest.cc: Likewise. + +2003-11-20 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/lib/libffi-dg.exp: Make the -lgcc_s conditional. + +2003-11-19 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/lib/libffi-dg.exp: Add DYLD_LIBRARY_PATH for darwin. + Add -lgcc_s to additional flags. + +2003-11-12 Andreas Tobler <a.tobler@schweiz.ch> + + * configure.in, include/Makefile.am: PR libgcj/11147, install + the ffitarget.h header file in a gcc versioned and target + dependent place. + * configure: Regenerated. + * Makefile.in, include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + +2003-11-09 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/closure_fn0.c: Print result and check + with dg-output to make debugging easier. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c: Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/closure_fn4.c: Likewise. + * testsuite/libffi.call/closure_fn5.c: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_18byte.c: Likewise. + * testsuite/libffi.call/cls_19byte.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_20byte1.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + * testsuite/libffi.call/cls_64byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_9byte1.c: Likewise. + * testsuite/libffi.call/cls_9byte2.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_schar.c: Likewise. + * testsuite/libffi.call/cls_sint.c: Likewise. + * testsuite/libffi.call/cls_sshort.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + + * testsuite/libffi.special/unwindtest.cc: Make ffi_closure + static. + +2003-11-08 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/cls_9byte2.c: New test case. + * testsuite/libffi.call/cls_9byte1.c: Likewise. + * testsuite/libffi.call/cls_64byte.c: Likewise. + * testsuite/libffi.call/cls_20byte1.c: Likewise. + * testsuite/libffi.call/cls_19byte.c: Likewise. + * testsuite/libffi.call/cls_18byte.c: Likewise. + * testsuite/libffi.call/closure_fn4.c: Likewise. + * testsuite/libffi.call/closure_fn5.c: Likewise. + * testsuite/libffi.call/cls_schar.c: Likewise. + * testsuite/libffi.call/cls_sint.c: Likewise. + * testsuite/libffi.call/cls_sshort.c: Likewise. + * testsuite/libffi.call/nested_struct2.c: Likewise. + * testsuite/libffi.call/nested_struct3.c: Likewise. + +2003-11-08 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/cls_double.c: Do a check on the result. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/return_sc.c: Cleanup whitespaces. + +2003-11-06 Andreas Tobler <a.tobler@schweiz.ch> + + * src/prep_cif.c (ffi_prep_cif): Move the validity check after + the initialization. + +2003-10-23 Andreas Tobler <a.tobler@schweiz.ch> + + * src/java_raw_api.c (ffi_java_ptrarray_to_raw): Replace + FFI_ASSERT(FALSE) with FFI_ASSERT(0). + +2003-10-22 David Daney <ddaney@avtrex.com> + + * src/mips/ffitarget.h: Replace undefined UINT32 and friends with + __attribute__((__mode__(__SI__))) and friends. + +2003-10-22 Andreas Schwab <schwab@suse.de> + + * src/ia64/ffi.c: Replace FALSE/TRUE with false/true. + +2003-10-21 Andreas Tobler <a.tobler@schweiz.ch> + + * configure.in: AC_LINK_FILES(ffitarget.h). + * configure: Regenerate. + * Makefile.in: Likewise. + * include/Makefile.in: Likewise. + * testsuite/Makefile.in: Likewise. + * fficonfig.h.in: Likewise. + +2003-10-21 Paolo Bonzini <bonzini@gnu.org> + Richard Henderson <rth@redhat.com> + + Avoid that ffi.h includes fficonfig.h. + + * Makefile.am (EXTRA_DIST): Include ffitarget.h files + (TARGET_SRC_MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. + (TARGET_SRC_MIPS_SGI): Removed. + (MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. + (MIPS_SGI): Removed. + (CLEANFILES): Removed. + (mostlyclean-am, clean-am, mostlyclean-sub, clean-sub): New + targets. + * acconfig.h: Removed. + * configure.in: Compute sizeofs only for double and long double. + Use them to define and subst HAVE_LONG_DOUBLE. Include comments + into AC_DEFINE instead of using acconfig.h. Create + include/ffitarget.h instead of include/fficonfig.h. Rename + MIPS_GCC to MIPS_IRIX, drop MIPS_SGI since we are in gcc's tree. + AC_DEFINE EH_FRAME_FLAGS. + * include/Makefile.am (DISTCLEANFILES): New automake macro. + (hack_DATA): Add ffitarget.h. + * include/ffi.h.in: Remove all system specific definitions. + Declare raw API even if it is not installed, why bother? + Use limits.h instead of SIZEOF_* to define ffi_type_*. Do + not define EH_FRAME_FLAGS, it is in fficonfig.h now. Include + ffitarget.h instead of fficonfig.h. Remove ALIGN macro. + (UINT_ARG, INT_ARG): Removed, use ffi_arg and ffi_sarg instead. + * include/ffi_common.h (bool): Do not define. + (ffi_assert): Accept failed assertion. + (ffi_type_test): Return void and accept file/line. + (FFI_ASSERT): Pass stringized failed assertion. + (FFI_ASSERT_AT): New macro. + (FFI_ASSERT_VALID_TYPE): New macro. + (UINT8, SINT8, UINT16, SINT16, UINT32, SINT32, + UINT64, SINT64): Define here with gcc's __attribute__ macro + instead of in ffi.h + (FLOAT32, ALIGN): Define here instead of in ffi.h + * include/ffi-mips.h: Removed. Its content moved to + src/mips/ffitarget.h after separating assembly and C sections. + * src/alpha/ffi.c, src/alpha/ffi.c, src/java_raw_api.c + src/prep_cif.c, src/raw_api.c, src/ia64/ffi.c, + src/mips/ffi.c, src/mips/n32.S, src/mips/o32.S, + src/mips/ffitarget.h, src/sparc/ffi.c, src/x86/ffi64.c: + SIZEOF_ARG -> FFI_SIZEOF_ARG. + * src/ia64/ffi.c: Include stdbool.h (provided by GCC 2.95+). + * src/debug.c (ffi_assert): Accept stringized failed assertion. + (ffi_type_test): Rewritten. + * src/prep-cif.c (initialize_aggregate, ffi_prep_cif): Call + FFI_ASSERT_VALID_TYPE. + * src/alpha/ffitarget.h, src/arm/ffitarget.h, + src/ia64/ffitarget.h, src/m68k/ffitarget.h, + src/mips/ffitarget.h, src/powerpc/ffitarget.h, + src/s390/ffitarget.h, src/sh/ffitarget.h, + src/sh64/ffitarget.h, src/sparc/ffitarget.h, + src/x86/ffitarget.h: New files. + * src/alpha/osf.S, src/arm/sysv.S, src/ia64/unix.S, + src/m68k/sysv.S, src/mips/n32.S, src/mips/o32.S, + src/powerpc/aix.S, src/powerpc/darwin.S, + src/powerpc/ffi_darwin.c, src/powerpc/linux64.S, + src/powerpc/linux64_closure.S, src/powerpc/ppc_closure.S, + src/powerpc/sysv.S, src/s390/sysv.S, src/sh/sysv.S, + src/sh64/sysv.S, src/sparc/v8.S, src/sparc/v9.S, + src/x86/sysv.S, src/x86/unix64.S, src/x86/win32.S: + include fficonfig.h + +2003-10-20 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * src/mips/ffi.c: Use _ABIN32, _ABIO32 instead of external + _MIPS_SIM_NABI32, _MIPS_SIM_ABI32. + +2003-10-19 Andreas Tobler <a.tobler@schweiz.ch> + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Declare bytes again. + Used when FFI_DEBUG = 1. + +2003-10-14 Alan Modra <amodra@bigpond.net.au> + + * src/types.c (double, longdouble): Default POWERPC64 to 8 byte size + and align. + +2003-10-06 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * include/ffi_mips.h: Define FFI_MIPS_N32 for N32/N64 ABIs, + FFI_MIPS_O32 for O32 ABI. + +2003-10-01 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_64 for + SPARC64. Cleanup whitespaces. + +2003-09-19 Andreas Tobler <a.tobler@schweiz.ch> + + * testsuite/libffi.call/closure_fn0.c: Xfail mips, arm, + strongarm, xscale. Cleanup whitespaces. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c: Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/nested_struct.c: Likewise. + * testsuite/libffi.call/nested_struct1.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + * testsuite/libffi.special/unwindtest.cc: Likewise. + * testsuite/libffi.call/pyobjc-tc.c: Cleanup whitespaces. + +2003-09-18 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/aix.S: Cleanup whitespaces. + * src/powerpc/aix_closure.S: Likewise. + +2003-09-18 Andreas Tobler <a.tobler@schweiz.ch> + + * src/powerpc/darwin.S: Cleanup whitespaces, comment formatting. + * src/powerpc/darwin_closure.S: Likewise. + * src/powerpc/ffi_darwin.c: Likewise. + +2003-09-18 Andreas Tobler <a.tobler@schweiz.ch> + David Edelsohn <edelsohn@gnu.org> + + * src/types.c (double): Add AIX and Darwin to the right TYPEDEF. + * src/powerpc/aix_closure.S: Remove the pointer to the outgoing + parameter stack. + * src/powerpc/darwin_closure.S: Likewise. + * src/powerpc/ffi_darwin.c (ffi_prep_args): Handle structures + according to the Darwin/AIX ABI. + (ffi_prep_cif_machdep): Likewise. + (ffi_closure_helper_DARWIN): Likewise. + Remove the outgoing parameter stack logic. Simplify the evaluation + of the different CASE types. + (ffi_prep_clousure): Avoid the casts on lvalues. Change the branch + statement in the trampoline code. + +2003-09-18 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/ffi.c (ffi_prep_args): Take account into the alignement + for the register size. + (ffi_closure_helper_SYSV): Handle the structure return value + address correctly. + (ffi_closure_helper_SYSV): Return the appropriate type when + the registers are used for the structure return value. + * src/sh/sysv.S (ffi_closure_SYSV): Fix the stack layout for + the 64-bit return value. Update copyright years. + +2003-09-17 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * testsuite/lib/libffi-dg.exp (libffi_target_compile): Search in + srcdir for ffi_mips.h. + +2003-09-12 Alan Modra <amodra@bigpond.net.au> + + * src/prep_cif.c (initialize_aggregate): Include tail padding in + structure size. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct + placement of float result. + * testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct + cast of "resp" for big-endian 64 bit machines. + +2003-09-11 Alan Modra <amodra@bigpond.net.au> + + * src/types.c (double, longdouble): Merge identical SH and ARM + typedefs, and add POWERPC64. + * src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for + struct split over gpr and rest. + (ffi_prep_cif_machdep): Correct intarg_count for structures. + * src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets. + +2003-09-09 Andreas Tobler <a.tobler@schweiz.ch> + + * src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct + passing correctly. + +2003-09-09 Alan Modra <amodra@bigpond.net.au> + + * configure: Regenerate. + +2003-09-04 Andreas Tobler <a.tobler@schweiz.ch> + + * Makefile.am: Remove build rules for ffitest. + * Makefile.in: Rebuilt. + +2003-09-04 Andreas Tobler <a.tobler@schweiz.ch> + + * src/java_raw_api.c: Include <stdlib.h> to fix compiler warning + about implicit declaration of abort(). + +2003-09-04 Andreas Tobler <a.tobler@schweiz.ch> + + * Makefile.am: Add dejagnu test framework. Fixes PR other/11411. + * Makefile.in: Rebuilt. + * configure.in: Add dejagnu test framework. + * configure: Rebuilt. + + * testsuite/Makefile.am: New file. + * testsuite/Makefile.in: Built + * testsuite/lib/libffi-dg.exp: New file. + * testsuite/config/default.exp: Likewise. + * testsuite/libffi.call/call.exp: Likewise. + * testsuite/libffi.call/ffitest.h: Likewise. + * testsuite/libffi.call/closure_fn0.c: Likewise. + * testsuite/libffi.call/closure_fn1.c: Likewise. + * testsuite/libffi.call/closure_fn2.c: Likewise. + * testsuite/libffi.call/closure_fn3.c: Likewise. + * testsuite/libffi.call/cls_1_1byte.c: Likewise. + * testsuite/libffi.call/cls_3_1byte.c: Likewise. + * testsuite/libffi.call/cls_4_1byte.c: Likewise. + * testsuite/libffi.call/cls_2byte.c: Likewise. + * testsuite/libffi.call/cls_3byte1.c: Likewise. + * testsuite/libffi.call/cls_3byte2.c: Likewise. + * testsuite/libffi.call/cls_4byte.c: Likewise. + * testsuite/libffi.call/cls_5byte.c: Likewise. + * testsuite/libffi.call/cls_6byte.c: Likewise. + * testsuite/libffi.call/cls_7byte.c: Likewise. + * testsuite/libffi.call/cls_8byte.c: Likewise. + * testsuite/libffi.call/cls_12byte.c: Likewise. + * testsuite/libffi.call/cls_16byte.c: Likewise. + * testsuite/libffi.call/cls_20byte.c: Likewise. + * testsuite/libffi.call/cls_24byte.c: Likewise. + * testsuite/libffi.call/cls_double.c: Likewise. + * testsuite/libffi.call/cls_float.c: Likewise. + * testsuite/libffi.call/cls_uchar.c: Likewise. + * testsuite/libffi.call/cls_uint.c: Likewise. + * testsuite/libffi.call/cls_ulonglong.c: Likewise. + * testsuite/libffi.call/cls_ushort.c: Likewise. + * testsuite/libffi.call/float.c: Likewise. + * testsuite/libffi.call/float1.c: Likewise. + * testsuite/libffi.call/float2.c: Likewise. + * testsuite/libffi.call/many.c: Likewise. + * testsuite/libffi.call/many_win32.c: Likewise. + * testsuite/libffi.call/nested_struct.c: Likewise. + * testsuite/libffi.call/nested_struct1.c: Likewise. + * testsuite/libffi.call/pyobjc-tc.c: Likewise. + * testsuite/libffi.call/problem1.c: Likewise. + * testsuite/libffi.call/promotion.c: Likewise. + * testsuite/libffi.call/return_ll.c: Likewise. + * testsuite/libffi.call/return_sc.c: Likewise. + * testsuite/libffi.call/return_uc.c: Likewise. + * testsuite/libffi.call/strlen.c: Likewise. + * testsuite/libffi.call/strlen_win32.c: Likewise. + * testsuite/libffi.call/struct1.c: Likewise. + * testsuite/libffi.call/struct2.c: Likewise. + * testsuite/libffi.call/struct3.c: Likewise. + * testsuite/libffi.call/struct4.c: Likewise. + * testsuite/libffi.call/struct5.c: Likewise. + * testsuite/libffi.call/struct6.c: Likewise. + * testsuite/libffi.call/struct7.c: Likewise. + * testsuite/libffi.call/struct8.c: Likewise. + * testsuite/libffi.call/struct9.c: Likewise. + * testsuite/libffi.special/special.exp: New file. + * testsuite/libffi.special/ffitestcxx.h: Likewise. + * testsuite/libffi.special/unwindtest.cc: Likewise. + + +2003-08-13 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/ffi.c (OFS_INT16): Set 0 for little endian case. Update + copyright years. + +2003-08-02 Alan Modra <amodra@bigpond.net.au> + + * src/powerpc/ffi.c (ffi_prep_args64): Modify for changed gcc + structure passing. + (ffi_closure_helper_LINUX64): Likewise. + * src/powerpc/linux64.S: Remove code writing to parm save area. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Use return + address in lr from ffi_closure_helper_LINUX64 call to calculate + table address. Optimize function tail. + +2003-07-28 Andreas Tobler <a.tobler@schweiz.ch> + + * src/sparc/ffi.c: Handle all floating point registers. + * src/sparc/v9.S: Likewise. Fixes second part of PR target/11410. + +2003-07-11 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at> + + * README: Note that libffi is not part of GCC. Update the project + URL and status. + +2003-06-19 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> + + * src/powerpc/ppc_closure.S: Include ffi.h. + +2003-06-13 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * src/x86/sysv.S: Avoid gas-only .uleb128/.sleb128 directives. + Use C style comments. + +2003-06-13 Kaz Kojima <kkojima@rr.iij4u.or.jp> + + * Makefile.am: Add SHmedia support. Fix a typo of SH support. + * Makefile.in: Regenerate. + * configure.in (sh64-*-linux*, sh5*-*-linux*): Add target. + * configure: Regenerate. + * include/ffi.h.in: Add SHmedia support. + * src/sh64/ffi.c: New file. + * src/sh64/sysv.S: New file. + +2003-05-16 Jakub Jelinek <jakub@redhat.com> + + * configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section + should be read-only. + * configure: Rebuilt. + * fficonfig.h.in: Rebuilt. + * include/ffi.h.in (EH_FRAME_FLAGS): Define. + * src/alpha/osf.S: Use EH_FRAME_FLAGS. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/linux64_closure.S: Likewise. Include ffi.h. + * src/powerpc/sysv.S: Use EH_FRAME_FLAGS. Use pcrel encoding + if -fpic/-fPIC/-mrelocatable. + * src/powerpc/powerpc_closure.S: Likewise. + * src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include + #write in .eh_frame flags. + * src/sparc/v9.S: Likewise. + * src/x86/unix64.S: Use EH_FRAME_FLAGS. + * src/x86/sysv.S: Likewise. Use pcrel encoding if -fpic/-fPIC. + * src/s390/sysv.S: Use EH_FRAME_FLAGS. Include ffi.h. + +2003-05-07 Jeff Sturm <jsturm@one-point.com> + + Fixes PR bootstrap/10656 + * configure.in (HAVE_AS_REGISTER_PSEUDO_OP): Test assembler + support for .register pseudo-op. + * src/sparc/v8.S: Use it. + * fficonfig.h.in: Rebuilt. + * configure: Rebuilt. + +2003-04-18 Jakub Jelinek <jakub@redhat.com> + + * include/ffi.h.in (POWERPC64): Define if 64-bit. + (enum ffi_abi): Add FFI_LINUX64 on POWERPC. + Make it the default on POWERPC64. + (FFI_TRAMPOLINE_SIZE): Define to 24 on POWERPC64. + * configure.in: Change powerpc-*-linux* into powerpc*-*-linux*. + * configure: Rebuilt. + * src/powerpc/ffi.c (hidden): Define. + (ffi_prep_args_SYSV): Renamed from + ffi_prep_args. Cast pointers to unsigned long to shut up warnings. + (NUM_GPR_ARG_REGISTERS64, NUM_FPR_ARG_REGISTERS64, + ASM_NEEDS_REGISTERS64): New. + (ffi_prep_args64): New function. + (ffi_prep_cif_machdep): Handle FFI_LINUX64 ABI. + (ffi_call): Likewise. + (ffi_prep_closure): Likewise. + (flush_icache): Surround by #ifndef POWERPC64. + (ffi_dblfl): New union type. + (ffi_closure_helper_SYSV): Use it to avoid aliasing problems. + (ffi_closure_helper_LINUX64): New function. + * src/powerpc/ppc_closure.S: Surround whole file by #ifndef + __powerpc64__. + * src/powerpc/sysv.S: Likewise. + (ffi_call_SYSV): Rename ffi_prep_args to ffi_prep_args_SYSV. + * src/powerpc/linux64.S: New file. + * src/powerpc/linux64_closure.S: New file. + * Makefile.am (EXTRA_DIST): Add src/powerpc/linux64.S and + src/powerpc/linux64_closure.S. + (TARGET_SRC_POWERPC): Likewise. + + * src/ffitest.c (closure_test_fn, closure_test_fn1, closure_test_fn2, + closure_test_fn3): Fix result printing on big-endian 64-bit + machines. + (main): Print tst2_arg instead of uninitialized tst2_result. + + * src/ffitest.c (main): Hide what closure pointer really points to + from the compiler. + +2003-04-16 Richard Earnshaw <rearnsha@arm.com> + + * configure.in (arm-*-netbsdelf*): Add configuration. + (configure): Regenerated. + +2003-04-04 Loren J. Rittle <ljrittle@acm.org> + + * include/Makefile.in: Regenerate. + +2003-03-21 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> + + * libffi/include/ffi.h.in: Define X86 instead of X86_64 in 32 + bit mode. + * libffi/src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): + Receive closure pointer through parameter, read args using + __builtin_dwarf_cfa. + (FFI_INIT_TRAMPOLINE): Send closure reference through eax. + +2003-03-12 Andreas Schwab <schwab@suse.de> + + * configure.in: Avoid trailing /. in toolexeclibdir. + * configure: Rebuilt. + +2003-03-03 Andreas Tobler <a.tobler@schweiz.ch> + + * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. + +2003-02-06 Andreas Tobler <a.tobler@schweiz.ch> + + * libffi/src/powerpc/darwin_closure.S: + Fix alignement bug, allocate 8 bytes for the result. + * libffi/src/powerpc/aix_closure.S: + Likewise. + * libffi/src/powerpc/ffi_darwin.c: + Update stackframe description for aix/darwin_closure.S. + +2003-02-06 Jakub Jelinek <jakub@redhat.com> + + * src/s390/ffi.c (ffi_closure_helper_SYSV): Add hidden visibility + attribute. + +2003-01-31 Christian Cornelssen <ccorn@cs.tu-berlin.de>, + Andreas Schwab <schwab@suse.de> + + * configure.in: Adjust command to source config-ml.in to account + for changes to the libffi_basedir definition. + (libffi_basedir): Remove ${srcdir} from value and include trailing + slash if nonempty. + + * configure: Regenerate. + +2003-01-29 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> + + * src/powerpc/ppc_closure.S: Recode to fit shared libs. + +2003-01-28 Andrew Haley <aph@redhat.com> + + * include/ffi.h.in: Enable FFI_CLOSURES for x86_64. + * src/x86/ffi64.c (ffi_prep_closure): New. + (ffi_closure_UNIX64_inner): New. + * src/x86/unix64.S (ffi_closure_UNIX64): New. + +2003-01-27 Alexandre Oliva <aoliva@redhat.com> + + * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. + Remove USE_LIBDIR conditional. + * Makefile.am (toolexecdir, toolexeclibdir): Don't override. + * Makefile.in, configure: Rebuilt. + +2003-01027 David Edelsohn <edelsohn@gnu.org> + + * Makefile.am (TARGET_SRC_POWERPC_AIX): Fix typo. + * Makefile.in: Regenerate. + +2003-01-22 Andrew Haley <aph@redhat.com> + + * src/powerpc/darwin.S (_ffi_call_AIX): Add Augmentation size to + unwind info. + +2003-01-21 Andreas Tobler <a.tobler@schweiz.ch> + + * src/powerpc/darwin.S: Add unwind info. + * src/powerpc/darwin_closure.S: Likewise. + +2003-01-14 Andrew Haley <aph@redhat.com> + + * src/x86/ffi64.c (ffi_prep_args): Check for void retval. + (ffi_prep_cif_machdep): Likewise. + * src/x86/unix64.S: Add unwind info. + +2003-01-14 Andreas Jaeger <aj@suse.de> + + * src/ffitest.c (main): Only use ffi_closures if those are + supported. + +2003-01-13 Andreas Tobler <a.tobler@schweiz.ch> + + * libffi/src/ffitest.c + add closure testcases + +2003-01-13 Kevin B. Hendricks <khendricks@ivey.uwo.ca> + + * libffi/src/powerpc/ffi.c + fix alignment bug for float (4 byte aligned iso 8 byte) + +2003-01-09 Geoffrey Keating <geoffk@apple.com> + + * src/powerpc/ffi_darwin.c: Remove RCS version string. + * src/powerpc/darwin.S: Remove RCS version string. + +2003-01-03 Jeff Sturm <jsturm@one-point.com> + + * include/ffi.h.in: Add closure defines for SPARC, SPARC64. + * src/ffitest.c (main): Use static storage for closure. + * src/sparc/ffi.c (ffi_prep_closure, ffi_closure_sparc_inner): New. + * src/sparc/v8.S (ffi_closure_v8): New. + * src/sparc/v9.S (ffi_closure_v9): New. + +2002-11-10 Ranjit Mathew <rmathew@hotmail.com> + + * include/ffi.h.in: Added FFI_STDCALL ffi_type + enumeration for X86_WIN32. + * src/x86/win32.S: Added ffi_call_STDCALL function + definition. + * src/x86/ffi.c (ffi_call/ffi_raw_call): Added + switch cases for recognising FFI_STDCALL and + calling ffi_call_STDCALL if target is X86_WIN32. + * src/ffitest.c (my_stdcall_strlen/stdcall_many): + stdcall versions of the "my_strlen" and "many" + test functions (for X86_WIN32). + Added test cases to test stdcall invocation using + these functions. + +2002-12-02 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/sysv.S: Add DWARF2 unwind info. + +2002-11-27 Ulrich Weigand <uweigand@de.ibm.com> + + * src/s390/sysv.S (.eh_frame section): Make section read-only. + +2002-11-26 Jim Wilson <wilson@redhat.com> + + * src/types.c (FFI_TYPE_POINTER): Has size 8 on IA64. + +2002-11-23 H.J. Lu <hjl@gnu.org> + + * acinclude.m4: Add dummy AM_PROG_LIBTOOL. + Include ../config/accross.m4. + * aclocal.m4; Rebuild. + * configure: Likewise. + +2002-11-15 Ulrich Weigand <uweigand@de.ibm.com> + + * src/s390/sysv.S (.eh_frame section): Adapt to pcrel FDE encoding. + +2002-11-11 DJ Delorie <dj@redhat.com> + + * configure.in: Look for common files in the right place. + +2002-10-08 Ulrich Weigand <uweigand@de.ibm.com> + + * src/java_raw_api.c (ffi_java_raw_to_ptrarray): Interpret + raw data as _Jv_word values, not ffi_raw. + (ffi_java_ptrarray_to_raw): Likewise. + (ffi_java_rvalue_to_raw): New function. + (ffi_java_raw_call): Call it. + (ffi_java_raw_to_rvalue): New function. + (ffi_java_translate_args): Call it. + * src/ffitest.c (closure_test_fn): Interpret return value + as ffi_arg, not int. + * src/s390/ffi.c (ffi_prep_cif_machdep): Add missing + FFI_TYPE_POINTER case. + (ffi_closure_helper_SYSV): Likewise. Also, assume return + values extended to word size. + +2002-10-02 Andreas Jaeger <aj@suse.de> + + * src/x86/ffi64.c (ffi_prep_cif_machdep): Remove debug output. + +2002-10-01 Bo Thorsen <bo@smetana.suse.de> + + * include/ffi.h.in: Fix i386 win32 compilation. + +2002-09-30 Ulrich Weigand <uweigand@de.ibm.com> + + * configure.in: Add s390x-*-linux-* target. + * configure: Regenerate. + * include/ffi.h.in: Define S390X for s390x targets. + (FFI_CLOSURES): Define for s390/s390x. + (FFI_TRAMPOLINE_SIZE): Likewise. + (FFI_NATIVE_RAW_API): Likewise. + * src/prep_cif.c (ffi_prep_cif): Do not compute stack space for s390. + * src/types.c (FFI_TYPE_POINTER): Use 8-byte pointers on s390x. + * src/s390/ffi.c: Major rework of existing code. Add support for + s390x targets. Add closure support. + * src/s390/sysv.S: Likewise. + +2002-09-29 Richard Earnshaw <rearnsha@arm.com> + + * src/arm/sysv.S: Fix typo. + +2002-09-28 Richard Earnshaw <rearnsha@arm.com> + + * src/arm/sysv.S: If we don't have machine/asm.h and the pre-processor + has defined __USER_LABEL_PREFIX__, then use it in CNAME. + (ffi_call_SYSV): Handle soft-float. + +2002-09-27 Bo Thorsen <bo@suse.de> + + * include/ffi.h.in: Fix multilib x86-64 support. + +2002-09-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * Makefile.am (all-multi): Fix multilib parallel build. + +2002-07-19 Kaz Kojima <kkojima@gcc.gnu.org> + + * configure.in (sh[34]*-*-linux*): Add brackets. + * configure: Regenerate. + +2002-07-18 Kaz Kojima <kkojima@gcc.gnu.org> + + * Makefile.am: Add SH support. + * Makefile.in: Regenerate. + * configure.in (sh-*-linux*, sh[34]*-*-linux*): Add target. + * configure: Regenerate. + * include/ffi.h.in: Add SH support. + * src/sh/ffi.c: New file. + * src/sh/sysv.S: New file. + * src/types.c: Add SH support. + +2002-07-16 Bo Thorsen <bo@suse.de> + + * src/x86/ffi64.c: New file that adds x86-64 support. + * src/x86/unix64.S: New file that handles argument setup for + x86-64. + * src/x86/sysv.S: Don't use this on x86-64. + * src/x86/ffi.c: Don't use this on x86-64. + Remove unused vars. + * src/prep_cif.c (ffi_prep_cif): Don't do stack size calculation + for x86-64. + * src/ffitest.c (struct6): New test that tests a special case in + the x86-64 ABI. + (struct7): Likewise. + (struct8): Likewise. + (struct9): Likewise. + (closure_test_fn): Silence warning about this when it's not used. + (main): Add the new tests. + (main): Fix a couple of wrong casts and silence some compiler warnings. + * include/ffi.h.in: Add x86-64 ABI definition. + * fficonfig.h.in: Regenerate. + * Makefile.am: Add x86-64 support. + * configure.in: Likewise. + * Makefile.in: Regenerate. + * configure: Likewise. + +2002-06-24 Bo Thorsen <bo@suse.de> + + * src/types.c: Merge settings for similar architectures. + Add x86-64 sizes and alignments. + +2002-06-23 Bo Thorsen <bo@suse.de> + + * src/arm/ffi.c (ffi_prep_args): Remove unused vars. + * src/sparc/ffi.c (ffi_prep_args_v8): Likewise. + * src/mips/ffi.c (ffi_prep_args): Likewise. + * src/m68k/ffi.c (ffi_prep_args): Likewise. + +2002-07-18 H.J. Lu (hjl@gnu.org) + + * Makefile.am (TARGET_SRC_MIPS_LINUX): New. + (libffi_la_SOURCES): Support MIPS_LINUX. + (libffi_convenience_la_SOURCES): Likewise. + * Makefile.in: Regenerated. + + * configure.in (mips64*-*): Skip. + (mips*-*-linux*): New. + * configure: Regenerated. + + * src/mips/ffi.c: Include <sgidefs.h>. + +2002-06-06 Ulrich Weigand <uweigand@de.ibm.com> + + * src/s390/sysv.S: Save/restore %r6. Add DWARF-2 unwind info. + +2002-05-27 Roger Sayle <roger@eyesopen.com> + + * src/x86/ffi.c (ffi_prep_args): Remove reference to avn. + +2002-05-27 Bo Thorsen <bo@suse.de> + + * src/x86/ffi.c (ffi_prep_args): Remove unused variable and + fix formatting. + +2002-05-13 Andreas Tobler <a.tobler@schweiz.ch> + + * src/powerpc/ffi_darwin.c (ffi_prep_closure): Declare fd at + beginning of function (for older apple cc). + +2002-05-08 Alexandre Oliva <aoliva@redhat.com> + + * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at + script entry, and set LD to it when configuring multilibs. + * configure: Rebuilt. + +2002-05-05 Jason Thorpe <thorpej@wasabisystems.com> + + * configure.in (sparc64-*-netbsd*): Add target. + (sparc-*-netbsdelf*): Likewise. + * configure: Regenerate. + +2002-04-28 David S. Miller <davem@redhat.com> + + * configure.in, configure: Fix SPARC test in previous change. + +2002-04-29 Gerhard Tonn <GerhardTonn@swol.de> + + * Makefile.am: Add Linux for S/390 support. + * Makefile.in: Regenerate. + * configure.in: Add Linux for S/390 support. + * configure: Regenerate. + * include/ffi.h.in: Add Linux for S/390 support. + * src/s390/ffi.c: New file from libffi CVS tree. + * src/s390/sysv.S: New file from libffi CVS tree. + +2002-04-28 Jakub Jelinek <jakub@redhat.com> + + * configure.in (HAVE_AS_SPARC_UA_PCREL): Check for working + %r_disp32(). + * src/sparc/v8.S: Use it. + * src/sparc/v9.S: Likewise. + * fficonfig.h.in: Rebuilt. + * configure: Rebuilt. + +2002-04-08 Hans Boehm <Hans_Boehm@hp.com> + + * src/java_raw_api.c (ffi_java_raw_size): Handle FFI_TYPE_DOUBLE + correctly. + * src/ia64/unix.S: Add unwind information. Fix comments. + Save sp in a way that's compatible with unwind info. + (ffi_call_unix): Correctly restore sp in all cases. + * src/ia64/ffi.c: Add, fix comments. + +2002-04-08 Jakub Jelinek <jakub@redhat.com> + + * src/sparc/v8.S: Make .eh_frame dependent on target word size. + +2002-04-06 Jason Thorpe <thorpej@wasabisystems.com> + + * configure.in (alpha*-*-netbsd*): Add target. + * configure: Regenerate. + +2002-04-04 Jeff Sturm <jsturm@one-point.com> + + * src/sparc/v8.S: Add unwind info. + * src/sparc/v9.S: Likewise. + +2002-03-30 Krister Walfridsson <cato@df.lth.se> + + * configure.in: Enable i*86-*-netbsdelf*. + * configure: Rebuilt. + +2002-03-29 David Billinghurst <David.Billinghurst@riotinto.com> + + PR other/2620 + * src/mips/n32.s: Delete + * src/mips/o32.s: Delete + +2002-03-21 Loren J. Rittle <ljrittle@acm.org> + + * configure.in: Enable alpha*-*-freebsd*. + * configure: Rebuilt. + +2002-03-17 Bryce McKinlay <bryce@waitaki.otago.ac.nz> + + * Makefile.am: libfficonvenience -> libffi_convenience. + * Makefile.in: Rebuilt. + + * Makefile.am: Define ffitest_OBJECTS. + * Makefile.in: Rebuilt. + +2002-03-07 Andreas Tobler <toa@pop.agri.ch> + David Edelsohn <edelsohn@gnu.org> + + * Makefile.am (EXTRA_DIST): Add Darwin and AIX closure files. + (TARGET_SRC_POWERPC_AIX): Add aix_closure.S. + (TARGET_SRC_POWERPC_DARWIN): Add darwin_closure.S. + * Makefile.in: Regenerate. + * include/ffi.h.in: Add AIX and Darwin closure definitions. + * src/powerpc/ffi_darwin.c (ffi_prep_closure): New function. + (flush_icache, flush_range): New functions. + (ffi_closure_helper_DARWIN): New function. + * src/powerpc/aix_closure.S: New file. + * src/powerpc/darwin_closure.S: New file. + +2002-02-24 Jeff Sturm <jsturm@one-point.com> + + * include/ffi.h.in: Add typedef for ffi_arg. + * src/ffitest.c (main): Declare rint with ffi_arg. + +2002-02-21 Andreas Tobler <toa@pop.agri.ch> + + * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate + number of GPRs for floating-point arguments. + +2002-01-31 Anthony Green <green@redhat.com> + + * configure: Rebuilt. + * configure.in: Replace CHECK_SIZEOF and endian tests with + cross-compiler friendly macros. + * aclocal.m4 (AC_COMPILE_CHECK_SIZEOF, AC_C_BIGENDIAN_CROSS): New + macros. + +2002-01-18 David Edelsohn <edelsohn@gnu.org> + + * src/powerpc/darwin.S (_ffi_call_AIX): New. + * src/powerpc/aix.S (ffi_call_DARWIN): New. + +2002-01-17 David Edelsohn <edelsohn@gnu.org> + + * Makefile.am (EXTRA_DIST): Add Darwin and AIX files. + (TARGET_SRC_POWERPC_AIX): New. + (POWERPC_AIX): New stanza. + * Makefile.in: Regenerate. + * configure.in: Add AIX case. + * configure: Regenerate. + * include/ffi.h.in (ffi_abi): Add FFI_AIX. + * src/powerpc/ffi_darwin.c (ffi_status): Use "long" to scale frame + size. Fix "long double" support. + (ffi_call): Add FFI_AIX case. + * src/powerpc/aix.S: New. + +2001-10-09 John Hornkvist <john@toastedmarshmallow.com> + + Implement Darwin PowerPC ABI. + * configure.in: Handle powerpc-*-darwin*. + * Makefile.am: Set source files for POWERPC_DARWIN. + * configure: Rebuilt. + * Makefile.in: Rebuilt. + * include/ffi.h.in: Define FFI_DARWIN and FFI_DEFAULT_ABI for + POWERPC_DARWIN. + * src/powerpc/darwin.S: New file. + * src/powerpc/ffi_darwin.c: New file. + +2001-10-07 Joseph S. Myers <jsm28@cam.ac.uk> + + * src/x86/ffi.c: Fix spelling error of "separate" as "seperate". + +2001-07-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * src/x86/sysv.S: Avoid gas-only .balign directive. + Use C style comments. + +2001-07-16 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * src/alpha/ffi.c (ffi_prep_closure): Avoid gas-only mnemonic. + Fixes PR bootstrap/3563. + +2001-06-26 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * src/alpha/osf.S (ffi_closure_osf): Use .rdata for ECOFF. + +2001-06-25 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * configure.in: Recognize sparc*-sun-* host. + * configure: Regenerate. + +2001-06-06 Andrew Haley <aph@redhat.com> + + * src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF. + +2001-06-03 Andrew Haley <aph@redhat.com> + + * src/alpha/osf.S: Add unwind info. + * src/powerpc/sysv.S: Add unwind info. + * src/powerpc/ppc_closure.S: Likewise. + +2000-05-31 Jeff Sturm <jsturm@one-point.com> + + * configure.in: Fix AC_ARG_ENABLE usage. + * configure: Rebuilt. + +2001-05-06 Bryce McKinlay <bryce@waitaki.otago.ac.nz> + + * configure.in: Remove warning about beta code. + * configure: Rebuilt. + +2001-04-25 Hans Boehm <Hans_Boehm@hp.com> + + * src/ia64/unix.S: Restore stack pointer when returning from + ffi_closure_UNIX. + * src/ia64/ffi.c: Fix typo in comment. + +2001-04-18 Jim Wilson <wilson@redhat.com> + + * src/ia64/unix.S: Delete unnecessary increment and decrement of loc2 + to eliminate RAW DV. + +2001-04-12 Bryce McKinlay <bryce@albatross.co.nz> + + * Makefile.am: Make a libtool convenience library. + * Makefile.in: Rebuilt. + +2001-03-29 Bryce McKinlay <bryce@albatross.co.nz> + + * configure.in: Use different syntax for subdirectory creation. + * configure: Rebuilt. + +2001-03-27 Jon Beniston <jon@beniston.com> + + * configure.in: Added X86_WIN32 target (Win32, CygWin, MingW). + * configure: Rebuilt. + * Makefile.am: Added X86_WIN32 target support. + * Makefile.in: Rebuilt. + + * include/ffi.h.in: Added X86_WIN32 target support. + + * src/ffitest.c: Doesn't run structure tests for X86_WIN32 targets. + * src/types.c: Added X86_WIN32 target support. + + * src/x86/win32.S: New file. Based on sysv.S, but with EH + stuff removed and made to work with CygWin's gas. + +2001-03-26 Bryce McKinlay <bryce@albatross.co.nz> + + * configure.in: Make target subdirectory in build dir. + * Makefile.am: Override suffix based rules to specify correct output + subdirectory. + * Makefile.in: Rebuilt. + * configure: Rebuilt. + +2001-03-23 Kevin B Hendricks <khendricks@ivey.uwo.ca> + + * src/powerpc/ppc_closure.S: New file. + * src/powerpc/ffi.c (ffi_prep_args): Fixed ABI compatibility bug + involving long long and register pairs. + (ffi_prep_closure): New function. + (flush_icache): Likewise. + (ffi_closure_helper_SYSV): Likewise. + * include/ffi.h.in (FFI_CLOSURES): Define on PPC. + (FFI_TRAMPOLINE_SIZE): Likewise. + (FFI_NATIVE_RAW_API): Likewise. + * Makefile.in: Rebuilt. + * Makefile.am (EXTRA_DIST): Added src/powerpc/ppc_closure.S. + (TARGET_SRC_POWERPC): Likewise. + +2001-03-19 Tom Tromey <tromey@redhat.com> + + * Makefile.in: Rebuilt. + * Makefile.am (ffitest_LDFLAGS): New macro. + +2001-03-02 Nick Clifton <nickc@redhat.com> + + * include/ffi.h.in: Remove RCS ident string. + * include/ffi_mips.h: Remove RCS ident string. + * src/debug.c: Remove RCS ident string. + * src/ffitest.c: Remove RCS ident string. + * src/prep_cif.c: Remove RCS ident string. + * src/types.c: Remove RCS ident string. + * src/alpha/ffi.c: Remove RCS ident string. + * src/alpha/osf.S: Remove RCS ident string. + * src/arm/ffi.c: Remove RCS ident string. + * src/arm/sysv.S: Remove RCS ident string. + * src/mips/ffi.c: Remove RCS ident string. + * src/mips/n32.S: Remove RCS ident string. + * src/mips/o32.S: Remove RCS ident string. + * src/sparc/ffi.c: Remove RCS ident string. + * src/sparc/v8.S: Remove RCS ident string. + * src/sparc/v9.S: Remove RCS ident string. + * src/x86/ffi.c: Remove RCS ident string. + * src/x86/sysv.S: Remove RCS ident string. + +2001-02-08 Joseph S. Myers <jsm28@cam.ac.uk> + + * include/ffi.h.in: Change sourceware.cygnus.com references to + gcc.gnu.org. + +2000-12-09 Richard Henderson <rth@redhat.com> + + * src/alpha/ffi.c (ffi_call): Simplify struct return test. + (ffi_closure_osf_inner): Index rather than increment avalue + and arg_types. Give ffi_closure_osf the raw return value type. + * src/alpha/osf.S (ffi_closure_osf): Handle return value type + promotion. + +2000-12-07 Richard Henderson <rth@redhat.com> + + * src/raw_api.c (ffi_translate_args): Fix typo. + (ffi_prep_closure): Likewise. + + * include/ffi.h.in [ALPHA]: Define FFI_CLOSURES and + FFI_TRAMPOLINE_SIZE. + * src/alpha/ffi.c (ffi_prep_cif_machdep): Adjust minimal + cif->bytes for new ffi_call_osf implementation. + (ffi_prep_args): Absorb into ... + (ffi_call): ... here. Do all stack allocation here and + avoid a callback function. + (ffi_prep_closure, ffi_closure_osf_inner): New. + * src/alpha/osf.S (ffi_call_osf): Reimplement with no callback. + (ffi_closure_osf): New. + +2000-09-10 Alexandre Oliva <aoliva@redhat.com> + + * config.guess, config.sub, install-sh: Removed. + * ltconfig, ltmain.sh, missing, mkinstalldirs: Likewise. + * Makefile.in: Rebuilt. + + * acinclude.m4: Include libtool macros from the top level. + * aclocal.m4, configure: Rebuilt. + +2000-08-22 Alexandre Oliva <aoliva@redhat.com> + + * configure.in [i*86-*-freebsd*] (TARGET, TARGETDIR): Set. + * configure: Rebuilt. + +2000-05-11 Scott Bambrough <scottb@netwinder.org> + + * libffi/src/arm/sysv.S (ffi_call_SYSV): Doubles are not saved to + memory correctly. Use conditional instructions, not branches where + possible. + +2000-05-04 Tom Tromey <tromey@cygnus.com> + + * configure: Rebuilt. + * configure.in: Match `arm*-*-linux-*'. + From Chris Dornan <cdornan@arm.com>. + +2000-04-28 Jakub Jelinek <jakub@redhat.com> + + * Makefile.am (SUBDIRS): Define. + (AM_MAKEFLAGS): Likewise. + (Multilib support.): Add section. + * Makefile.in: Rebuilt. + * ltconfig (extra_compiler_flags, extra_compiler_flags_value): + New variables. Set for gcc using -print-multi-lib. Export them + to libtool. + (sparc64-*-linux-gnu*): Use libsuff 64 for search paths. + * ltmain.sh (B|b|V): Don't throw away gcc's -B, -b and -V options + for -shared links. + (extra_compiler_flags_value, extra_compiler_flags): Check these + for extra compiler options which need to be passed down in + compiler_flags. + +2000-04-16 Anthony Green <green@redhat.com> + + * configure: Rebuilt. + * configure.in: Change i*86-pc-linux* to i*86-*-linux*. + +2000-04-14 Jakub Jelinek <jakub@redhat.com> + + * include/ffi.h.in (SPARC64): Define for 64bit SPARC builds. + Set SPARC FFI_DEFAULT_ABI based on SPARC64 define. + * src/sparc/ffi.c (ffi_prep_args_v8): Renamed from ffi_prep_args. + Replace all void * sizeofs with sizeof(int). + Only compare type with FFI_TYPE_LONGDOUBLE if LONGDOUBLE is + different than DOUBLE. + Remove FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases (handled elsewhere). + (ffi_prep_args_v9): New function. + (ffi_prep_cif_machdep): Handle V9 ABI and long long on V8. + (ffi_V9_return_struct): New function. + (ffi_call): Handle FFI_V9 ABI from 64bit code and FFI_V8 ABI from + 32bit code (not yet cross-arch calls). + * src/sparc/v8.S: Add struct return delay nop. + Handle long long. + * src/sparc/v9.S: New file. + * src/prep_cif.c (ffi_prep_cif): Return structure pointer + is used on sparc64 only for structures larger than 32 bytes. + Pass by reference for structures is done for structure arguments + larger than 16 bytes. + * src/ffitest.c (main): Use 64bit rint on sparc64. + Run long long tests on sparc. + * src/types.c (FFI_TYPE_POINTER): Pointer is 64bit on alpha and + sparc64. + (FFI_TYPE_LONGDOUBLE): long double is 128 bit aligned to 128 bits + on sparc64. + * configure.in (sparc-*-linux*): New supported target. + (sparc64-*-linux*): Likewise. + * configure: Rebuilt. + * Makefile.am: Add v9.S to SPARC files. + * Makefile.in: Likewise. + (LINK): Surround $(CCLD) into double quotes, so that multilib + compiles work correctly. + +2000-04-04 Alexandre Petit-Bianco <apbianco@cygnus.com> + + * configure: Rebuilt. + * configure.in: (i*86-*-solaris*): New libffi target. Patch + proposed by Bryce McKinlay. + +2000-03-20 Tom Tromey <tromey@cygnus.com> + + * Makefile.in: Hand edit for java_raw_api.lo. + +2000-03-08 Bryce McKinlay <bryce@albatross.co.nz> + + * config.guess, config.sub: Update from the gcc tree. + Fix for PR libgcj/168. + +2000-03-03 Tom Tromey <tromey@cygnus.com> + + * Makefile.in: Fixed ia64 by hand. + + * configure: Rebuilt. + * configure.in (--enable-multilib): New option. + (libffi_basedir): New subst. + (AC_OUTPUT): Added multilib code. + +2000-03-02 Tom Tromey <tromey@cygnus.com> + + * Makefile.in: Rebuilt. + * Makefile.am (TARGET_SRC_IA64): Use `ia64', not `alpha', as + directory name. + +2000-02-25 Hans Boehm <boehm@acm.org> + + * src/ia64/ffi.c, src/ia64/ia64_flags.h, src/ia64/unix.S: New + files. + * src/raw_api.c (ffi_translate_args): Fixed typo in argument + list. + (ffi_prep_raw_closure): Use ffi_translate_args, not + ffi_closure_translate. + * src/java_raw_api.c: New file. + * src/ffitest.c (closure_test_fn): New function. + (main): Define `rint' as long long on IA64. Added new test when + FFI_CLOSURES is defined. + * include/ffi.h.in (ALIGN): Use size_t, not unsigned. + (ffi_abi): Recognize IA64. + (ffi_raw): Added `flt' field. + Added "Java raw API" code. + * configure.in: Recognize ia64. + * Makefile.am (TARGET_SRC_IA64): New macro. + (libffi_la_common_SOURCES): Added java_raw_api.c. + (libffi_la_SOURCES): Define in IA64 case. + +2000-01-04 Tom Tromey <tromey@cygnus.com> + + * Makefile.in: Rebuilt with newer automake. + +1999-12-31 Tom Tromey <tromey@cygnus.com> + + * Makefile.am (INCLUDES): Added -I$(top_srcdir)/src. + +1999-09-01 Tom Tromey <tromey@cygnus.com> + + * include/ffi.h.in: Removed PACKAGE and VERSION defines and + undefs. + * fficonfig.h.in: Rebuilt. + * configure: Rebuilt. + * configure.in: Pass 3rd argument to AM_INIT_AUTOMAKE. + Use AM_PROG_LIBTOOL (automake 1.4 compatibility). + * acconfig.h: Don't #undef PACKAGE or VERSION. + +1999-08-09 Anthony Green <green@cygnus.com> + + * include/ffi.h.in: Try to work around messy header problem + with PACKAGE and VERSION. + + * configure: Rebuilt. + * configure.in: Change version to 2.00-beta. + + * fficonfig.h.in: Rebuilt. + * acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define. + + * src/x86/ffi.c (ffi_raw_call): Rename. + +1999-08-02 Kresten Krab Thorup <krab@dominiq.is.s.u-tokyo.ac.jp> + + * src/x86/ffi.c (ffi_closure_SYSV): New function. + (ffi_prep_incoming_args_SYSV): Ditto. + (ffi_prep_closure): Ditto. + (ffi_closure_raw_SYSV): Ditto. + (ffi_prep_raw_closure): More ditto. + (ffi_call_raw): Final ditto. + + * include/ffi.h.in: Add definitions for closure and raw API. + + * src/x86/ffi.c (ffi_prep_cif_machdep): Added case for + FFI_TYPE_UINT64. + + * Makefile.am (libffi_la_common_SOURCES): Added raw_api.c + + * src/raw_api.c: New file. + + * include/ffi.h.in (ffi_raw): New type. + (UINT_ARG, SINT_ARG): New defines. + (ffi_closure, ffi_raw_closure): New types. + (ffi_prep_closure, ffi_prep_raw_closure): New declarations. + + * configure.in: Add check for endianness and sizeof void*. + + * src/x86/sysv.S (ffi_call_SYSV): Call fixup routine via argument, + instead of directly. + + * configure: Rebuilt. + +Thu Jul 8 14:28:42 1999 Anthony Green <green@cygnus.com> + + * configure.in: Add x86 and powerpc BeOS configurations. + From Makoto Kato <m_kato@ga2.so-net.ne.jp>. + +1999-05-09 Anthony Green <green@cygnus.com> + + * configure.in: Add warning about this being beta code. + Remove src/Makefile.am from the picture. + * configure: Rebuilt. + + * Makefile.am: Move logic from src/Makefile.am. Add changes + to support libffi as a target library. + * Makefile.in: Rebuilt. + + * aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh: + Upgraded to new autoconf, automake, libtool. + + * README: Tweaks. + + * LICENSE: Update copyright date. + + * src/Makefile.am, src/Makefile.in: Removed. + +1998-11-29 Anthony Green <green@cygnus.com> + + * include/ChangeLog: Removed. + * src/ChangeLog: Removed. + * src/mips/ChangeLog: Removed. + * src/sparc/ChangeLog: Remboved. + * src/x86/ChangeLog: Removed. + + * ChangeLog.v1: Created. + +============================================================================= +From the old ChangeLog.libffi file.... + +2011-02-08 Andreas Tobler <andreast@fgznet.ch> + + * testsuite/lib/libffi.exp: Tweak for stand-alone mode. + +2009-12-25 Samuli Suominen <ssuominen@gentoo.org> + + * configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64. + * configure: Rebuilt. + * fficonfig.h.in: Rebuilt. + +2009-06-16 Andrew Haley <aph@redhat.com> + + * testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_medium2.c: Fix printf format + specifiers. + * testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs. + * testsuite/libffi.call/float2.c: Fix dg-excess-errors. + * testsuite/libffi.call/ffitest.h, + testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. + +2009-06-12 Andrew Haley <aph@redhat.com> + + * testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_medium2.c: Fix printf format + specifiers. + testsuite/libffi.special/unwindtest.cc: include stdint.h. + +2009-06-11 Timothy Wall <twall@users.sf.net> + + * Makefile.am, + configure.ac, + include/ffi.h.in, + include/ffi_common.h, + src/closures.c, + src/dlmalloc.c, + src/x86/ffi.c, + src/x86/ffitarget.h, + src/x86/win64.S (new), + README: Added win64 support (mingw or MSVC) + * Makefile.in, + include/Makefile.in, + man/Makefile.in, + testsuite/Makefile.in, + configure, + aclocal.m4: Regenerated + * ltcf-c.sh: properly escape cygwin/w32 path + * man/ffi_call.3: Clarify size requirements for return value. + * src/x86/ffi64.c: Fix filename in comment. + * src/x86/win32.S: Remove unused extern. + + * testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/closure_stdcall.c, + testsuite/libffi.call/cls_12byte.c, + testsuite/libffi.call/cls_16byte.c, + testsuite/libffi.call/cls_18byte.c, + testsuite/libffi.call/cls_19byte.c, + testsuite/libffi.call/cls_1_1byte.c, + testsuite/libffi.call/cls_20byte.c, + testsuite/libffi.call/cls_20byte1.c, + testsuite/libffi.call/cls_24byte.c, + testsuite/libffi.call/cls_2byte.c, + testsuite/libffi.call/cls_3_1byte.c, + testsuite/libffi.call/cls_3byte1.c, + testsuite/libffi.call/cls_3byte2.c, + testsuite/libffi.call/cls_4_1byte.c, + testsuite/libffi.call/cls_4byte.c, + testsuite/libffi.call/cls_5_1_byte.c, + testsuite/libffi.call/cls_5byte.c, + testsuite/libffi.call/cls_64byte.c, + testsuite/libffi.call/cls_6_1_byte.c, + testsuite/libffi.call/cls_6byte.c, + testsuite/libffi.call/cls_7_1_byte.c, + testsuite/libffi.call/cls_7byte.c, + testsuite/libffi.call/cls_8byte.c, + testsuite/libffi.call/cls_9byte1.c, + testsuite/libffi.call/cls_9byte2.c, + testsuite/libffi.call/cls_align_double.c, + testsuite/libffi.call/cls_align_float.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_align_sint16.c, + testsuite/libffi.call/cls_align_sint32.c, + testsuite/libffi.call/cls_align_sint64.c, + testsuite/libffi.call/cls_align_uint16.c, + testsuite/libffi.call/cls_align_uint32.c, + testsuite/libffi.call/cls_align_uint64.c, + testsuite/libffi.call/cls_dbls_struct.c, + testsuite/libffi.call/cls_double.c, + testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_float.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_multi_schar.c, + testsuite/libffi.call/cls_multi_sshort.c, + testsuite/libffi.call/cls_multi_sshortchar.c, + testsuite/libffi.call/cls_multi_uchar.c, + testsuite/libffi.call/cls_multi_ushort.c, + testsuite/libffi.call/cls_multi_ushortchar.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c, + testsuite/libffi.call/cls_schar.c, + testsuite/libffi.call/cls_sint.c, + testsuite/libffi.call/cls_sshort.c, + testsuite/libffi.call/cls_uchar.c, + testsuite/libffi.call/cls_uint.c, + testsuite/libffi.call/cls_ulonglong.c, + testsuite/libffi.call/cls_ushort.c, + testsuite/libffi.call/err_bad_abi.c, + testsuite/libffi.call/err_bad_typedef.c, + testsuite/libffi.call/float2.c, + testsuite/libffi.call/huge_struct.c, + testsuite/libffi.call/nested_struct.c, + testsuite/libffi.call/nested_struct1.c, + testsuite/libffi.call/nested_struct10.c, + testsuite/libffi.call/nested_struct2.c, + testsuite/libffi.call/nested_struct3.c, + testsuite/libffi.call/nested_struct4.c, + testsuite/libffi.call/nested_struct5.c, + testsuite/libffi.call/nested_struct6.c, + testsuite/libffi.call/nested_struct7.c, + testsuite/libffi.call/nested_struct8.c, + testsuite/libffi.call/nested_struct9.c, + testsuite/libffi.call/problem1.c, + testsuite/libffi.call/return_ldl.c, + testsuite/libffi.call/return_ll1.c, + testsuite/libffi.call/stret_large.c, + testsuite/libffi.call/stret_large2.c, + testsuite/libffi.call/stret_medium.c, + testsuite/libffi.call/stret_medium2.c, + testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead + of checking for MMAP. Use intptr_t instead of long casts. + +2009-06-04 Andrew Haley <aph@redhat.com> + + * src/powerpc/ffitarget.h: Fix misapplied merge from gcc. + +2009-06-04 Andrew Haley <aph@redhat.com> + + * src/mips/o32.S, + src/mips/n32.S: Fix licence formatting. + +2009-06-04 Andrew Haley <aph@redhat.com> + + * src/x86/darwin.S: Fix licence formatting. + src/x86/win32.S: Likewise. + src/sh64/sysv.S: Likewise. + src/sh/sysv.S: Likewise. + +2009-06-04 Andrew Haley <aph@redhat.com> + + * src/sh64/ffi.c: Remove lint directives. Was missing from merge + of Andreas Tobler's patch from 2006-04-22. + +2009-06-04 Andrew Haley <aph@redhat.com> + + * src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of + 2007-03-07. + +2008-12-26 Timothy Wall <twall@users.sf.net> + + * testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_align_longdouble.c, + testsuite/libffi.call/cls_align_longdouble_split.c, + testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected + failures on x86_64 cygwin/mingw. + +2008-12-22 Timothy Wall <twall@users.sf.net> + + * testsuite/libffi.call/closure_fn0.c, + testsuite/libffi.call/closure_fn1.c, + testsuite/libffi.call/closure_fn2.c, + testsuite/libffi.call/closure_fn3.c, + testsuite/libffi.call/closure_fn4.c, + testsuite/libffi.call/closure_fn5.c, + testsuite/libffi.call/closure_fn6.c, + testsuite/libffi.call/closure_loc_fn0.c, + testsuite/libffi.call/closure_stdcall.c, + testsuite/libffi.call/cls_align_pointer.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c: use portable cast from + pointer to integer (intptr_t). + * testsuite/libffi.call/cls_longdouble.c: disable for win64. + +2008-12-19 Anthony Green <green@redhat.com> + + * configure.ac: Bump version to 3.0.8. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-11-11 Anthony Green <green@redhat.com> + + * configure.ac: Bump version to 3.0.7. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-08-25 Andreas Tobler <a.tobler@schweiz.org> + + * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and + FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. + Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. + Adjust copyright notice. + * src/powerpc/ffi.c: Add two new flags to indicate if we have one + register or two register to use for FFI_SYSV structs. + (ffi_prep_cif_machdep): Pass the right register flag introduced above. + (ffi_closure_helper_SYSV): Fix the return type for + FFI_SYSV_TYPE_SMALL_STRUCT. Comment. + Adjust copyright notice. + +2008-07-24 Anthony Green <green@redhat.com> + + * testsuite/libffi.call/cls_dbls_struct.c, + testsuite/libffi.call/cls_double_va.c, + testsuite/libffi.call/cls_longdouble.c, + testsuite/libffi.call/cls_longdouble_va.c, + testsuite/libffi.call/cls_pointer.c, + testsuite/libffi.call/cls_pointer_stack.c, + testsuite/libffi.call/err_bad_abi.c: Clean up failures from + compiler warnings. + +2008-07-17 Anthony Green <green@redhat.com> + + * configure.ac: Bump version to 3.0.6. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. Add documentation. + * README: Update for new release. + +2008-07-16 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned + int. + +2008-07-16 Kaz Kojima <kkojima@gcc.gnu.org> + + * src/sh/sysv.S: Add .note.GNU-stack on Linux. + * src/sh64/sysv.S: Likewise. + +2008-04-03 Anthony Green <green@redhat.com> + + * libffi.pc.in (Libs): Add -L${libdir}. + * configure.ac: Bump version to 3.0.5. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-04-03 Anthony Green <green@redhat.com> + Xerces Ranby <xerxes@zafena.se> + + * include/ffi.h.in: Wrap definition of target architecture to + protect from double definitions. + +2008-03-22 Moriyoshi Koizumi <moriyoshi@gmail.com> + + * src/x86/ffi.c (ffi_prep_closure_loc): Fix for bug revealed in + closure_loc_fn0.c. + * testsuite/libffi.call/closure_loc_fn0.c (closure_loc_test_fn0): + New test. + +2008-03-04 Anthony Green <green@redhat.com> + Blake Chaffin + hos@tamanegi.org + + * testsuite/libffi.call/cls_align_longdouble_split2.c + testsuite/libffi.call/cls_align_longdouble_split.c + testsuite/libffi.call/cls_dbls_struct.c + testsuite/libffi.call/cls_double_va.c + testsuite/libffi.call/cls_longdouble.c + testsuite/libffi.call/cls_longdouble_va.c + testsuite/libffi.call/cls_pointer.c + testsuite/libffi.call/cls_pointer_stack.c + testsuite/libffi.call/err_bad_abi.c + testsuite/libffi.call/err_bad_typedef.c + testsuite/libffi.call/huge_struct.c + testsuite/libffi.call/stret_large2.c + testsuite/libffi.call/stret_large.c + testsuite/libffi.call/stret_medium2.c + testsuite/libffi.call/stret_medium.c: New tests from Apple. + +2008-02-26 Jakub Jelinek <jakub@redhat.com> + Anthony Green <green@redhat.com> + + * src/alpha/osf.S: Add .note.GNU-stack on Linux. + * src/s390/sysv.S: Likewise. + * src/powerpc/linux64.S: Likewise. + * src/powerpc/linux64_closure.S: Likewise. + * src/powerpc/ppc_closure.S: Likewise. + * src/powerpc/sysv.S: Likewise. + * src/x86/unix64.S: Likewise. + * src/x86/sysv.S: Likewise. + * src/sparc/v8.S: Likewise. + * src/sparc/v9.S: Likewise. + * src/m68k/sysv.S: Likewise. + * src/ia64/unix.S: Likewise. + * src/arm/sysv.S: Likewise. + +2008-02-26 Anthony Green <green@redhat.com> + Thomas Heller <theller@ctypes.org> + + * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C + comment. + +2008-02-26 Anthony Green <green@redhat.org> + Thomas Heller <theller@ctypes.org> + + * include/ffi.h.in: Change void (*)() to void (*)(void). + +2008-02-26 Anthony Green <green@redhat.org> + Thomas Heller <theller@ctypes.org> + + * src/alpha/ffi.c: Change void (*)() to void (*)(void). + src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c, + src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c, + src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S, + src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c, + src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c, + src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S, + src/x86/ffi64.c: Ditto. + +2008-02-24 Anthony Green <green@redhat.org> + + * configure.ac: Accept openbsd*, not just openbsd. + Bump version to 3.0.4. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-02-22 Anthony Green <green@redhat.com> + + * README: Clean up list of tested platforms. + +2008-02-22 Anthony Green <green@redhat.com> + + * configure.ac: Bump version to 3.0.3. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. Clean up test docs. + +2008-02-22 Bjoern Koenig <bkoenig@alpha-tierchen.de> + Andreas Tobler <a.tobler@schweiz.org> + + * configure.ac: Add amd64-*-freebsd* target. + * configure: Regenerate. + +2008-02-22 Thomas Heller <theller@ctypes.org> + + * configure.ac: Add x86 OpenBSD support. + * configure: Rebuilt. + +2008-02-21 Thomas Heller <theller@ctypes.org> + + * README: Change "make test" to "make check". + +2008-02-21 Anthony Green <green@redhat.com> + + * configure.ac: Bump version to 3.0.2. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-02-21 Björn König <bkoenig@alpha-tierchen.de> + + * src/x86/freebsd.S: New file. + * configure.ac: Add x86 FreeBSD support. + * Makefile.am: Ditto. + +2008-02-15 Anthony Green <green@redhat.com> + + * configure.ac: Bump version to 3.0.1. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * libtool-version: Increment revision. + * README: Update for new release. + +2008-02-15 David Daney <ddaney@avtrex.com> + + * src/mips/ffi.c: Remove extra '>' from include directive. + (ffi_prep_closure_loc): Use clear_location instead of tramp. + +2008-02-15 Anthony Green <green@redhat.com> + + * configure.ac: Bump version to 3.0.0. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + +2008-02-15 David Daney <ddaney@avtrex.com> + + * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): + Define (conditionally), and use it to include cachectl.h. + (ffi_prep_closure_loc): Fix cache flushing. + * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. + +2008-02-15 Anthony Green <green@redhat.com> + + * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3: + Update dates and remove all references to ffi_prep_closure. + * configure.ac: Bump version to 2.99.9. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + +2008-02-15 Anthony Green <green@redhat.com> + + * man/ffi_prep_closure.3: Delete. + * man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3. + (man_MANS): Ditto. + * man/Makefile.in: Rebuilt. + * configure.ac: Bump version to 2.99.8. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + +2008-02-14 Anthony Green <green@redhat.com> + + * configure.ac: Bump version to 2.99.7. + * configure, doc/stamp-vti, doc/version.texi: Rebuilt. + * include/ffi.h.in LICENSE src/debug.c src/closures.c + src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h + src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c + src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S + src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c + src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c + src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S + src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h + src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c + src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S + src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h + src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h + src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S + src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h + src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S + src/arm/ffitarget.h src/prep_cif.c: Update license text. + +2008-02-14 Anthony Green <green@redhat.com> + + * README: Update tested platforms. + * configure.ac: Bump version to 2.99.6. + * configure: Rebuilt. + +2008-02-14 Anthony Green <green@redhat.com> + + * configure.ac: Bump version to 2.99.5. + * configure: Rebuilt. + * Makefile.am (EXTRA_DIST): Add darwin64.S + * Makefile.in: Rebuilt. + * testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree. + * LICENSE: Update WARRANTY. + +2008-02-14 Anthony Green <green@redhat.com> + + * libffi.pc.in (libdir): Fix libdir definition. + * configure.ac: Bump version to 2.99.4. + * configure: Rebuilt. + +2008-02-14 Anthony Green <green@redhat.com> + + * README: Update. + * libffi.info: New file. + * doc/stamp-vti: New file. + * configure.ac: Bump version to 2.99.3. + * configure: Rebuilt. + +2008-02-14 Anthony Green <green@redhat.com> + + * Makefile.am (SUBDIRS): Add man dir. + * Makefile.in: Rebuilt. + * configure.ac: Create Makefile. + * configure: Rebuilt. + * man/ffi_call.3 man/ffi_prep_cif.3 man/ffi_prep_closure.3 + man/Makefile.am man/Makefile.in: New files. + +2008-02-14 Tom Tromey <tromey@redhat.com> + + * aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt. + * mdate-sh, texinfo.tex: New files. + * Makefile.am (info_TEXINFOS): New variable. + * doc/libffi.texi: New file. + * doc/version.texi: Likewise. + +2008-02-14 Anthony Green <green@redhat.com> + + * Makefile.am (AM_CFLAGS): Don't compile with -D$(TARGET). + (lib_LTLIBRARIES): Define. + (toolexeclib_LIBRARIES): Undefine. + * Makefile.in: Rebuilt. + * configure.ac: Reset version to 2.99.1. + * configure.in: Rebuilt. + +2008-02-14 Anthony Green <green@redhat.com> + + * libffi.pc.in: Use @PACKAGE_NAME@ and @PACKAGE_VERSION@. + * configure.ac: Reset version to 2.99.1. + * configure.in: Rebuilt. + * Makefile.am (EXTRA_DIST): Add ChangeLog.libffi. + * Makefile.in: Rebuilt. + * LICENSE: Update copyright notice. + +2008-02-14 Anthony Green <green@redhat.com> + + * include/Makefile.am (nodist_includes_HEADERS): Define. Don't + distribute ffitarget.h or ffi.h from the build include dir. + * Makefile.in: Rebuilt. + +2008-02-14 Anthony Green <green@redhat.com> + + * include/Makefile.am (includesdir): Install headers under libdir. + (pkgconfigdir): Define. Install libffi.pc. + * include/Makefile.in: Rebuilt. + * libffi.pc.in: Create. + * libtool-version: Increment CURRENT + * configure.ac: Add libffi.pc.in + * configure: Rebuilt. + +2008-02-03 Anthony Green <green@redhat.com> + + * include/Makefile.am (includesdir): Fix header install with + DESTDIR. + * include/Makefile.in: Rebuilt. + +2008-02-03 Timothy Wall <twall@users.sf.net> + + * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return + offset based on code pointer, not data pointer. + +2008-02-01 Anthony Green <green@redhat.com> + + * include/Makefile.am: Fix header installs. + * Makefile.am: Ditto. + * include/Makefile.in: Rebuilt. + * Makefile.in: Ditto. + +2008-02-01 Anthony Green <green@redhat.com> + + * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL, + FFI_INIT_TRAMPOLINE): Revert my broken changes to twall's last + patch. + +2008-01-31 Anthony Green <green@redhat.com> + + * Makefile.am (EXTRA_DIST): Add missing files. + * testsuite/Makefile.am: Ditto. + * Makefile.in, testsuite/Makefile.in: Rebuilt. + +2008-01-31 Timothy Wall <twall@users.sf.net> + + * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall + closures. + * src/x86/ffitarget.h: Increase size of trampoline for stdcall + closures. + * src/x86/win32.S: Add assembly for stdcall closure. + * src/x86/ffi.c: Initialize stdcall closure trampoline. + +2008-01-30 H.J. Lu <hongjiu.lu@intel.com> + + PR libffi/34612 + * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when + returning struct. + + * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" + tests. + +2008-01-30 Anthony Green <green@redhat.com> + + * Makefile.am, include/Makefile.am: Move headers to + libffi_la_SOURCES for new automake. + * Makefile.in, include/Makefile.in: Rebuilt. + + * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for + execution outside of gcc tree. + * testsuite/lib/target-libpath.exp: Ditto. + + * testsuite/lib/libffi-dg.exp: Many changes to allow for execution + outside of gcc tree. + + +============================================================================= +From the old ChangeLog.libgcj file.... + +2004-01-14 Kelley Cook <kcook@gcc.gnu.org> + + * configure.in: Add in AC_PREREQ(2.13) + +2003-02-20 Alexandre Oliva <aoliva@redhat.com> + + * configure.in: Propagate ORIGINAL_LD_FOR_MULTILIBS to + config.status. + * configure: Rebuilt. + +2002-01-27 Alexandre Oliva <aoliva@redhat.com> + + * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. + Remove USE_LIBDIR conditional. + * Makefile.am (toolexecdir, toolexeclibdir): Don't override. + * Makefile.in, configure: Rebuilt. + +Mon Aug 9 18:33:38 1999 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * include/Makefile.in: Rebuilt. + * Makefile.in: Rebuilt + * Makefile.am (toolexeclibdir): Add $(MULTISUBDIR) even for native + builds. + Use USE_LIBDIR. + + * configure: Rebuilt. + * configure.in (USE_LIBDIR): Define for native builds. + Use lowercase in configure --help explanations. + +1999-08-08 Anthony Green <green@cygnus.com> + + * include/ffi.h.in (FFI_FN): Remove `...'. + +1999-08-08 Anthony Green <green@cygnus.com> + + * Makefile.in: Rebuilt. + * Makefile.am (AM_CFLAGS): Compile with -fexceptions. + + * src/x86/sysv.S: Add exception handling metadata. + + +============================================================================= + +The libffi version 1 ChangeLog archive. + +Version 1 of libffi had per-directory ChangeLogs. Current and future +versions have a single ChangeLog file in the root directory. The +version 1 ChangeLogs have all been concatenated into this file for +future reference only. + +--- libffi ---------------------------------------------------------------- + +Mon Oct 5 02:17:50 1998 Anthony Green <green@cygnus.com> + + * configure.in: Boosted rev. + * configure, Makefile.in, aclocal.m4: Rebuilt. + * README: Boosted rev and updated release notes. + +Mon Oct 5 01:03:03 1998 Anthony Green <green@cygnus.com> + + * configure.in: Boosted rev. + * configure, Makefile.in, aclocal.m4: Rebuilt. + * README: Boosted rev and updated release notes. + +1998-07-25 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * m68k/ffi.c (ffi_prep_cif_machdep): Use bitmask for cif->flags. + Correctly handle small structures. + (ffi_prep_args): Also handle small structures. + (ffi_call): Pass size of return type to ffi_call_SYSV. + * m68k/sysv.S: Adjust for above changes. Correctly align small + structures in the return value. + + * types.c (uint64, sint64) [M68K]: Change alignment to 4. + +Fri Apr 17 17:26:58 1998 Anthony Green <green@hoser.cygnus.com> + + * configure.in: Boosted rev. + * configure,Makefile.in,aclocal.m4: Rebuilt. + * README: Boosted rev and added release notes. + +Sun Feb 22 00:50:41 1998 Geoff Keating <geoffk@ozemail.com.au> + + * configure.in: Add PowerPC config bits. + +1998-02-14 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * configure.in: Add m68k config bits. Change AC_CANONICAL_SYSTEM + to AC_CANONICAL_HOST, this is not a compiler. Use $host instead + of $target. Remove AC_CHECK_SIZEOF(char), we already know the + result. Fix argument of AC_ARG_ENABLE. + * configure, fficonfig.h.in: Rebuilt. + +Tue Feb 10 20:53:40 1998 Richard Henderson <rth@cygnus.com> + + * configure.in: Add Alpha config bits. + +Tue May 13 13:39:20 1997 Anthony Green <green@hoser.cygnus.com> + + * README: Updated dates and reworded Irix comments. + + * configure.in: Removed AC_PROG_RANLIB. + + * Makefile.in, aclocal.m4, config.guess, config.sub, configure, + ltmain.sh, */Makefile.in: libtoolized again and rebuilt with + automake and autoconf. + +Sat May 10 18:44:50 1997 Tom Tromey <tromey@cygnus.com> + + * configure, aclocal.m4: Rebuilt. + * configure.in: Don't compute EXTRADIST; now handled in + src/Makefile.in. Removed macros implied by AM_INIT_AUTOMAKE. + Don't run AM_MAINTAINER_MODE. + +Thu May 8 14:34:05 1997 Anthony Green <green@hoser.cygnus.com> + + * missing, ltmain.sh, ltconfig.sh: Created. These are new files + required by automake and libtool. + + * README: Boosted rev to 1.14. Added notes. + + * acconfig.h: Moved PACKAGE and VERSION for new automake. + + * configure.in: Changes for libtool. + + * Makefile.am (check): make test now make check. Uses libtool now. + + * Makefile.in, configure.in, aclocal.h, fficonfig.h.in: Rebuilt. + +Thu May 1 16:27:07 1997 Anthony Green <green@hoser.cygnus.com> + + * missing: Added file required by new automake. + +Tue Nov 26 14:10:42 1996 Anthony Green <green@csk3.cygnus.com> + + * acconfig.h: Added USING_PURIFY flag. This is defined when + --enable-purify-safety was used at configure time. + + * configure.in (allsources): Added --enable-purify-safety switch. + (VERSION): Boosted rev to 1.13. + * configure: Rebuilt. + +Fri Nov 22 06:46:12 1996 Anthony Green <green@rtl.cygnus.com> + + * configure.in (VERSION): Boosted rev to 1.12. + Removed special CFLAGS hack for gcc. + * configure: Rebuilt. + + * README: Boosted rev to 1.12. Added notes. + + * Many files: Cygnus Support changed to Cygnus Solutions. + +Wed Oct 30 11:15:25 1996 Anthony Green <green@rtl.cygnus.com> + + * configure.in (VERSION): Boosted rev to 1.11. + * configure: Rebuilt. + + * README: Boosted rev to 1.11. Added notes about GNU make. + +Tue Oct 29 12:25:12 1996 Anthony Green <green@rtl.cygnus.com> + + * configure.in: Fixed -Wall trick. + (VERSION): Boosted rev. + * configure: Rebuilt + + * acconfig.h: Needed for --enable-debug configure switch. + + * README: Boosted rev to 1.09. Added more notes on building + libffi, and LCLint. + + * configure.in: Added --enable-debug switch. Boosted rev to + 1.09. + * configure: Rebuilt + +Tue Oct 15 13:11:28 1996 Anthony Green <green@hoser.cygnus.com> + + * configure.in (VERSION): Boosted rev to 1.08 + * configure: Rebuilt. + + * README: Added n32 bug fix notes. + + * Makefile.am: Added "make lint" production. + * Makefile.in: Rebuilt. + +Mon Oct 14 10:54:46 1996 Anthony Green <green@rtl.cygnus.com> + + * README: Added web page reference. + + * configure.in, README: Boosted rev to 1.05 + * configure: Rebuilt. + + * README: Fixed n32 sample code. + +Fri Oct 11 17:09:28 1996 Anthony Green <green@rtl.cygnus.com> + + * README: Added sparc notes. + + * configure.in, README: Boosted rev to 1.04. + * configure: Rebuilt. + +Thu Oct 10 10:31:03 1996 Anthony Green <green@rtl.cygnus.com> + + * configure.in, README: Boosted rev to 1.03. + * configure: Rebuilt. + + * README: Added struct notes. + + * Makefile.am (EXTRA_DIST): Added LICENSE to distribution. + * Makefile.in: Rebuilt. + + * README: Removed Linux section. No special notes now + because aggregates arg/return types work. + +Wed Oct 9 16:16:42 1996 Anthony Green <green@rtl.cygnus.com> + + * README, configure.in (VERSION): Boosted rev to 1.02 + * configure: Rebuilt. + +Tue Oct 8 11:56:33 1996 Anthony Green <green@rtl.cygnus.com> + + * README (NOTE): Added n32 notes. + + * Makefile.am: Added test production. + * Makefile: Rebuilt + + * README: spell checked! + + * configure.in (VERSION): Boosted rev to 1.01 + * configure: Rebuilt. + +Mon Oct 7 15:50:22 1996 Anthony Green <green@rtl.cygnus.com> + + * configure.in: Added nasty bit to support SGI tools. + * configure: Rebuilt. + + * README: Added SGI notes. Added note about automake bug. + +Mon Oct 7 11:00:28 1996 Anthony Green <green@hoser.cygnus.com> + + * README: Rewrote intro, and fixed examples. + +Fri Oct 4 10:19:55 1996 Anthony Green <green@hoser.cygnus.com> + + * configure.in: -D$TARGET is no longer used as a compiler switch. + It is now inserted into ffi.h at configure time. + * configure: Rebuilt. + + * FFI_ABI and FFI_STATUS are now ffi_abi and ffi_status. + +Thu Oct 3 13:47:34 1996 Anthony Green <green@hoser.cygnus.com> + + * README, LICENSE: Created. Wrote some docs. + + * configure.in: Don't barf on i586-unknown-linuxaout. + Added EXTRADIST code for "make dist". + * configure: Rebuilt. + + * */Makefile.in: Rebuilt with patched automake. + +Tue Oct 1 17:12:25 1996 Anthony Green <green@rtl.cygnus.com> + + * Makefile.am, aclocal.m4, config.guess, config.sub, + configure.in, fficonfig.h.in, install-sh, mkinstalldirs, + stamp-h.in: Created + * Makefile.in, configure: Generated + +--- libffi/include -------------------------------------------------------- + +Tue Feb 24 13:09:36 1998 Anthony Green <green@gerbil.cygnus.com> + + * ffi_mips.h: Updated FFI_TYPE_STRUCT_* values based on + ffi.h.in changes. This is a work-around for SGI's "simple" + assembler. + +Sun Feb 22 00:51:55 1998 Geoff Keating <geoffk@ozemail.com.au> + + * ffi.h.in: PowerPC support. + +1998-02-14 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * ffi.h.in: Add m68k support. + (FFI_TYPE_LONGDOUBLE): Make it a separate value. + +Tue Feb 10 20:55:16 1998 Richard Henderson <rth@cygnus.com> + + * ffi.h.in (SIZEOF_ARG): Use a pointer type by default. + + * ffi.h.in: Alpha support. + +Fri Nov 22 06:48:45 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.h.in, ffi_common.h: Cygnus Support -> Cygnus Solutions. + +Wed Nov 20 22:31:01 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.h.in: Added ffi_type_void definition. + +Tue Oct 29 12:22:40 1996 Anthony Green <green@rtl.cygnus.com> + + * Makefile.am (hack_DATA): Always install ffi_mips.h. + + * ffi.h.in: Removed FFI_DEBUG. It's now in the correct + place (acconfig.h). + Added #include <stddef.h> for size_t definition. + +Tue Oct 15 17:23:35 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.h.in, ffi_common.h, ffi_mips.h: More clean up. + Commented out #define of FFI_DEBUG. + +Tue Oct 15 13:01:06 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi_common.h: Added bool definition. + + * ffi.h.in, ffi_common.h: Clean up based on LCLint output. + Added funny /*@...@*/ comments to annotate source. + +Mon Oct 14 12:29:23 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.h.in: Interface changes based on feedback from Jim + Blandy. + +Fri Oct 11 16:49:35 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.h.in: Small change for sparc support. + +Thu Oct 10 14:53:37 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi_mips.h: Added FFI_TYPE_STRUCT_* definitions for + special structure return types. + +Wed Oct 9 13:55:57 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.h.in: Added SIZEOF_ARG definition for X86 + +Tue Oct 8 11:40:36 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.h.in (FFI_FN): Added macro for eliminating compiler warnings. + Use it to case your function pointers to the proper type. + + * ffi_mips.h (SIZEOF_ARG): Added magic to fix type promotion bug. + + * Makefile.am (EXTRA_DIST): Added ffi_mips.h to EXTRA_DIST. + * Makefile: Rebuilt. + + * ffi_mips.h: Created. Moved all common mips definitions here. + +Mon Oct 7 10:58:12 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.h.in: The SGI assember is very picky about parens. Redefined + some macros to avoid problems. + + * ffi.h.in: Added FFI_DEFAULT_ABI definitions. Also added + externs for pointer, and 64bit integral ffi_types. + +Fri Oct 4 09:51:37 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.h.in: Added FFI_ABI member to ffi_cif and changed + function prototypes accordingly. + Added #define @TARGET@. Now programs including ffi.h don't + have to specify this themselves. + +Thu Oct 3 15:36:44 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.h.in: Changed ffi_prep_cif's values from void* to void** + + * Makefile.am (EXTRA_DIST): Added EXTRA_DIST for "make dist" + to work. + * Makefile.in: Regenerated. + +Wed Oct 2 10:16:59 1996 Anthony Green <green@hoser.cygnus.com> + + * Makefile.am: Created + * Makefile.in: Generated + + * ffi_common.h: Added rcsid comment + +Tue Oct 1 17:13:51 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.h.in, ffi_common.h: Created + +--- libffi/src ------------------------------------------------------------ + +Mon Oct 5 02:17:50 1998 Anthony Green <green@cygnus.com> + + * arm/ffi.c, arm/sysv.S: Created. + + * Makefile.am: Added arm files. + * Makefile.in: Rebuilt. + +Mon Oct 5 01:41:38 1998 Anthony Green <green@rtl.cygnus.com> + + * Makefile.am (libffi_la_LDFLAGS): Incremented revision. + +Sun Oct 4 16:27:17 1998 Anthony Green <green@cygnus.com> + + * alpha/osf.S (ffi_call_osf): Patch for DU assembler. + + * ffitest.c (main): long long and long double return values work + for x86. + +Fri Apr 17 11:50:58 1998 Anthony Green <green@hoser.cygnus.com> + + * Makefile.in: Rebuilt. + + * ffitest.c (main): Floating point tests not executed for systems + with broken lond double (SunOS 4 w/ GCC). + + * types.c: Fixed x86 alignment info for long long types. + +Thu Apr 16 07:15:28 1998 Anthony Green <green@ada.cygnus.com> + + * ffitest.c: Added more notes about GCC bugs under Irix 6. + +Wed Apr 15 08:42:22 1998 Anthony Green <green@hoser.cygnus.com> + + * ffitest.c (struct5): New test function. + (main): New test with struct5. + +Thu Mar 5 10:48:11 1998 Anthony Green <green@tootie.to.cygnus.com> + + * prep_cif.c (initialize_aggregate): Fix assertion for + nested structures. + +Tue Feb 24 16:33:41 1998 Anthony Green <green@hoser.cygnus.com> + + * prep_cif.c (ffi_prep_cif): Added long double support for sparc. + +Sun Feb 22 00:52:18 1998 Geoff Keating <geoffk@ozemail.com.au> + + * powerpc/asm.h: New file. + * powerpc/ffi.c: New file. + * powerpc/sysv.S: New file. + * Makefile.am: PowerPC port. + * ffitest.c (main): Allow all tests to run even in presence of gcc + bug on PowerPC. + +1998-02-17 Anthony Green <green@hoser.cygnus.com> + + * mips/ffi.c: Fixed comment typo. + + * x86/ffi.c (ffi_prep_cif_machdep), x86/sysv.S (retfloat): + Fixed x86 long double return handling. + + * types.c: Fixed x86 long double alignment info. + +1998-02-14 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * types.c: Add m68k support. + + * ffitest.c (floating): Add long double parameter. + (return_ll, ldblit): New functions to test long long and long + double return value. + (main): Fix type error in assignment of ts[1-4]_type.elements. + Add tests for long long and long double arguments and return + values. + + * prep_cif.c (ffi_prep_cif) [M68K]: Don't allocate argument for + struct value pointer. + + * m68k/ffi.c, m68k/sysv.S: New files. + * Makefile.am: Add bits for m68k port. Add kludge to work around + automake deficiency. + (test): Don't require "." in $PATH. + * Makefile.in: Rebuilt. + +Wed Feb 11 07:36:50 1998 Anthony Green <green@hoser.cygnus.com> + + * Makefile.in: Rebuilt. + +Tue Feb 10 20:56:00 1998 Richard Henderson <rth@cygnus.com> + + * alpha/ffi.c, alpha/osf.S: New files. + * Makefile.am: Alpha port. + +Tue Nov 18 14:12:07 1997 Anthony Green <green@hoser.cygnus.com> + + * mips/ffi.c (ffi_prep_cif_machdep): Initialize rstruct_flag + for n32. + +Tue Jun 3 17:18:20 1997 Anthony Green <green@hoser.cygnus.com> + + * ffitest.c (main): Added hack to get structure tests working + correctly. + +Sat May 10 19:06:42 1997 Tom Tromey <tromey@cygnus.com> + + * Makefile.in: Rebuilt. + * Makefile.am (EXTRA_DIST): Explicitly list all distributable + files in subdirs. + (VERSION, CC): Removed. + +Thu May 8 17:19:01 1997 Anthony Green <green@hoser.cygnus.com> + + * Makefile.am: Many changes for new automake and libtool. + * Makefile.in: Rebuilt. + +Fri Nov 22 06:57:56 1996 Anthony Green <green@rtl.cygnus.com> + + * ffitest.c (main): Fixed test case for non mips machines. + +Wed Nov 20 22:31:59 1996 Anthony Green <green@hoser.cygnus.com> + + * types.c: Added ffi_type_void declaration. + +Tue Oct 29 13:07:19 1996 Anthony Green <green@rtl.cygnus.com> + + * ffitest.c (main): Fixed character constants. + (main): Emit warning for structure test 3 failure on Sun. + + * Makefile.am (VPATH): Fixed VPATH def'n so automake won't + strip it out. + Moved distdir hack from libffi to automake. + (ffitest): Added missing -c for $(COMPILE) (change in automake). + * Makefile.in: Rebuilt. + +Tue Oct 15 13:08:20 1996 Anthony Green <green@hoser.cygnus.com> + + * Makefile.am: Added "make lint" production. + * Makefile.in: Rebuilt. + + * prep_cif.c (STACK_ARG_SIZE): Improved STACK_ARG_SIZE macro. + Clean up based on LCLint output. Added funny /*@...@*/ comments to + annotate source. + + * ffitest.c, debug.c: Cleaned up code. + +Mon Oct 14 12:26:56 1996 Anthony Green <green@rtl.cygnus.com> + + * ffitest.c: Changes based on interface changes. + + * prep_cif.c (ffi_prep_cif): Cleaned up interface based on + feedback from Jim Blandy. + +Fri Oct 11 15:53:18 1996 Anthony Green <green@rtl.cygnus.com> + + * ffitest.c: Reordered tests while porting to sparc. + Made changes to handle lame structure passing for sparc. + Removed calls to fflush(). + + * prep_cif.c (ffi_prep_cif): Added special case for sparc + aggregate type arguments. + +Thu Oct 10 09:56:51 1996 Anthony Green <green@rtl.cygnus.com> + + * ffitest.c (main): Added structure passing/returning tests. + + * prep_cif.c (ffi_prep_cif): Perform proper initialization + of structure return types if needed. + (initialize_aggregate): Bug fix + +Wed Oct 9 16:04:20 1996 Anthony Green <green@rtl.cygnus.com> + + * types.c: Added special definitions for x86 (double doesn't + need double word alignment). + + * ffitest.c: Added many tests + +Tue Oct 8 09:19:22 1996 Anthony Green <green@rtl.cygnus.com> + + * prep_cif.c (ffi_prep_cif): Fixed assertion. + + * debug.c (ffi_assert): Must return a non void now. + + * Makefile.am: Added test production. + * Makefile: Rebuilt. + + * ffitest.c (main): Created. + + * types.c: Created. Stripped common code out of */ffi.c. + + * prep_cif.c: Added missing stdlib.h include. + + * debug.c (ffi_type_test): Used "a" to eliminate compiler + warnings in non-debug builds. Included ffi_common.h. + +Mon Oct 7 15:36:42 1996 Anthony Green <green@rtl.cygnus.com> + + * Makefile.am: Added a rule for .s -> .o + This is required by the SGI compiler. + * Makefile: Rebuilt. + +Fri Oct 4 09:51:08 1996 Anthony Green <green@hoser.cygnus.com> + + * prep_cif.c (initialize_aggregate): Moved abi specification + to ffi_prep_cif(). + +Thu Oct 3 15:37:37 1996 Anthony Green <green@hoser.cygnus.com> + + * prep_cif.c (ffi_prep_cif): Changed values from void* to void**. + (initialize_aggregate): Fixed aggregate type initialization. + + * Makefile.am (EXTRA_DIST): Added support code for "make dist". + * Makefile.in: Regenerated. + +Wed Oct 2 11:41:57 1996 Anthony Green <green@hoser.cygnus.com> + + * debug.c, prep_cif: Created. + + * Makefile.am: Added debug.o and prep_cif.o to OBJ. + * Makefile.in: Regenerated. + + * Makefile.am (INCLUDES): Added missing -I../include + * Makefile.in: Regenerated. + +Tue Oct 1 17:11:51 1996 Anthony Green <green@rtl.cygnus.com> + + * error.c, Makefile.am: Created. + * Makefile.in: Generated. + +--- libffi/src/x86 -------------------------------------------------------- + +Sun Oct 4 16:27:17 1998 Anthony Green <green@cygnus.com> + + * sysv.S (retlongdouble): Fixed long long return value support. + * ffi.c (ffi_prep_cif_machdep): Ditto. + +Wed May 13 04:30:33 1998 Anthony Green <green@raft.ppp.tsoft.net> + + * ffi.c (ffi_prep_cif_machdep): Fixed long double return value + support. + +Wed Apr 15 08:43:20 1998 Anthony Green <green@hoser.cygnus.com> + + * ffi.c (ffi_prep_args): small struct support was missing. + +Thu May 8 16:53:58 1997 Anthony Green <green@hoser.cygnus.com> + + * objects.mak: Removed. + +Mon Dec 2 15:12:58 1996 Tom Tromey <tromey@cygnus.com> + + * sysv.S: Use .balign, for a.out Linux boxes. + +Tue Oct 15 13:06:50 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.c: Clean up based on LCLint output. + Added funny /*@...@*/ comments to annotate source. + +Fri Oct 11 16:43:38 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.c (ffi_call): Added assertion for bad ABIs. + +Wed Oct 9 13:57:27 1996 Anthony Green <green@rtl.cygnus.com> + + * sysv.S (retdouble): Fixed double return problems. + + * ffi.c (ffi_call): Corrected fn arg definition. + (ffi_prep_cif_machdep): Fixed double return problems + +Tue Oct 8 12:12:49 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.c: Moved ffi_type definitions to types.c. + (ffi_prep_args): Fixed type promotion bug. + +Mon Oct 7 15:53:06 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' + +Fri Oct 4 09:54:53 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped + remaining args. + +Wed Oct 2 10:07:05 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.c, sysv.S, objects.mak: Created. + (ffi_prep_cif): cif->rvalue no longer initialized to NULL. + (ffi_prep_cif_machdep): Moved machine independent cif processing + to src/prep_cif.c. Introduced ffi_prep_cif_machdep(). + +--- libffi/src/mips ------------------------------------------------------- + +Tue Feb 17 17:18:07 1998 Anthony Green <green@hoser.cygnus.com> + + * o32.S: Fixed typo in comment. + + * ffi.c (ffi_prep_cif_machdep): Fixed argument processing. + +Thu May 8 16:53:58 1997 Anthony Green <green@hoser.cygnus.com> + + * o32.s, n32.s: Wrappers for SGI tool support. + + * objects.mak: Removed. + +Tue Oct 29 14:37:45 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.c (ffi_prep_args): Changed int z to size_t z. + +Tue Oct 15 13:17:25 1996 Anthony Green <green@hoser.cygnus.com> + + * n32.S: Fixed bad stack munging. + + * ffi.c: Moved prototypes for ffi_call_?32() to here from + ffi_mips.h because extended_cif is not defined in ffi_mips.h. + +Mon Oct 14 12:42:02 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.c: Interface changes based on feedback from Jim Blandy. + +Thu Oct 10 11:22:16 1996 Anthony Green <green@rtl.cygnus.com> + + * n32.S, ffi.c: Lots of changes to support passing and + returning structures with the n32 calling convention. + + * n32.S: Fixed fn pointer bug. + + * ffi.c (ffi_prep_cif_machdep): Fix for o32 structure + return values. + (ffi_prep_args): Fixed n32 structure passing when structures + partially fit in registers. + +Wed Oct 9 13:49:25 1996 Anthony Green <green@rtl.cygnus.com> + + * objects.mak: Added n32.o. + + * n32.S: Created. + + * ffi.c (ffi_prep_args): Added magic to support proper + n32 processing. + +Tue Oct 8 10:37:35 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.c: Moved ffi_type definitions to types.c. + (ffi_prep_args): Fixed type promotion bug. + + * o32.S: This code is only built for o32 compiles. + A lot of the #define cruft has moved to ffi_mips.h. + + * ffi.c (ffi_prep_cif_machdep): Fixed arg flags. Second arg + is only processed if the first is either a float or double. + +Mon Oct 7 15:33:59 1996 Anthony Green <green@rtl.cygnus.com> + + * o32.S: Modified to compile under each of o32, n32 and n64. + + * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' + +Fri Oct 4 09:53:25 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped + remaining args. + +Wed Oct 2 17:41:22 1996 Anthony Green <green@rtl.cygnus.com> + + * o32.S: Removed crufty definitions. + +Wed Oct 2 12:53:42 1996 Anthony Green <green@hoser.cygnus.com> + + * ffi.c (ffi_prep_cif): cif->rvalue no longer initialized to NULL. + (ffi_prep_cif_machdep): Moved all machine independent cif processing + to src/prep_cif.c. Introduced ffi_prep_cif_machdep. Return types + of FFI_TYPE_STRUCT are no different than FFI_TYPE_INT. + +Tue Oct 1 17:11:02 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.c, o32.S, object.mak: Created + +--- libffi/src/sparc ------------------------------------------------------ + +Tue Feb 24 16:33:18 1998 Anthony Green <green@hoser.cygnus.com> + + * ffi.c (ffi_prep_args): Added long double support. + +Thu May 8 16:53:58 1997 Anthony Green <green@hoser.cygnus.com> + + * objects.mak: Removed. + +Thu May 1 16:07:56 1997 Anthony Green <green@hoser.cygnus.com> + + * v8.S: Fixed minor portability problem reported by + Russ McManus <mcmanr@eq.gs.com>. + +Tue Nov 26 14:12:43 1996 Anthony Green <green@csk3.cygnus.com> + + * v8.S: Used STACKFRAME define elsewhere. + + * ffi.c (ffi_prep_args): Zero out space when USING_PURIFY + is set. + (ffi_prep_cif_machdep): Allocate the correct stack frame + space for functions with < 6 args. + +Tue Oct 29 15:08:55 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.c (ffi_prep_args): int z is now size_t z. + +Mon Oct 14 13:31:24 1996 Anthony Green <green@rtl.cygnus.com> + + * v8.S (ffi_call_V8): Gordon rewrites this again. It looks + great now. + + * ffi.c (ffi_call): The comment about hijacked registers + is no longer valid after gordoni hacked v8.S. + + * v8.S (ffi_call_V8): Rewrote with gordoni. Much simpler. + + * v8.S, ffi.c: ffi_call() had changed to accept more than + two args, so v8.S had to change (because it hijacks incoming + arg registers). + + * ffi.c: Interface changes based on feedback from Jim Blandy. + +Thu Oct 10 17:48:16 1996 Anthony Green <green@rtl.cygnus.com> + + * ffi.c, v8.S, objects.mak: Created. + + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/LICENSE b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/LICENSE new file mode 100644 index 000000000000..4f0b76251485 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/LICENSE @@ -0,0 +1,21 @@ +libffi - Copyright (c) 1996-2020 Anthony Green, Red Hat, Inc and others. +See source files for details. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/LICENSE-BUILDTOOLS b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/LICENSE-BUILDTOOLS new file mode 100644 index 000000000000..d1d626e00859 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/LICENSE-BUILDTOOLS @@ -0,0 +1,353 @@ +The libffi source distribution contains certain code that is not part +of libffi, and is only used as tooling to assist with the building and +testing of libffi. This includes the msvcc.sh script used to wrap the +Microsoft compiler with GNU compatible command-line options, +make_sunver.pl, and the libffi test code distributed in the +testsuite/libffi.bhaible directory. This code is distributed with +libffi for the purpose of convenience only, and libffi is in no way +derived from this code. + +msvcc.sh an testsuite/libffi.bhaible are both distributed under the +terms of the GNU GPL version 2, as below. + + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/Makefile.am b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/Makefile.am new file mode 100644 index 000000000000..7654bf5ac575 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/Makefile.am @@ -0,0 +1,150 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS = foreign subdir-objects + +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = include testsuite man +if BUILD_DOCS +## This hack is needed because it doesn't seem possible to make a +## conditional info_TEXINFOS in Automake. At least Automake 1.14 +## either gives errors -- if this attempted in the most +## straightforward way -- or simply unconditionally tries to build the +## info file. +SUBDIRS += doc +endif + +EXTRA_DIST = LICENSE ChangeLog.old \ + m4/libtool.m4 m4/lt~obsolete.m4 \ + m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ + m4/ltversion.m4 src/debug.c msvcc.sh \ + generate-darwin-source-and-headers.py \ + libffi.xcodeproj/project.pbxproj \ + libtool-ldflags libtool-version configure.host README.md \ + libffi.map.in LICENSE-BUILDTOOLS msvc_build make_sunver.pl + +# local.exp is generated by configure +DISTCLEANFILES = local.exp + +# Subdir rules rely on $(FLAGS_TO_PASS) +FLAGS_TO_PASS = $(AM_MAKEFLAGS) + +MAKEOVERRIDES= + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libffi.pc + +toolexeclib_LTLIBRARIES = libffi.la +noinst_LTLIBRARIES = libffi_convenience.la + +libffi_la_SOURCES = src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c src/closures.c + +if FFI_DEBUG +libffi_la_SOURCES += src/debug.c +endif + +noinst_HEADERS = src/aarch64/ffitarget.h src/aarch64/internal.h \ + src/alpha/ffitarget.h src/alpha/internal.h \ + src/arc/ffitarget.h src/arm/ffitarget.h src/arm/internal.h \ + src/avr32/ffitarget.h src/bfin/ffitarget.h \ + src/cris/ffitarget.h src/csky/ffitarget.h src/frv/ffitarget.h \ + src/ia64/ffitarget.h src/ia64/ia64_flags.h \ + src/m32r/ffitarget.h src/m68k/ffitarget.h \ + src/m88k/ffitarget.h src/metag/ffitarget.h \ + src/microblaze/ffitarget.h src/mips/ffitarget.h \ + src/moxie/ffitarget.h src/nios2/ffitarget.h \ + src/or1k/ffitarget.h src/pa/ffitarget.h \ + src/powerpc/ffitarget.h src/powerpc/asm.h \ + src/powerpc/ffi_powerpc.h src/riscv/ffitarget.h \ + src/s390/ffitarget.h src/s390/internal.h src/sh/ffitarget.h \ + src/sh64/ffitarget.h src/sparc/ffitarget.h \ + src/sparc/internal.h src/tile/ffitarget.h src/vax/ffitarget.h \ + src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h \ + src/x86/asmnames.h src/xtensa/ffitarget.h src/dlmalloc.c \ + src/kvx/ffitarget.h + +EXTRA_libffi_la_SOURCES = src/aarch64/ffi.c src/aarch64/sysv.S \ + src/aarch64/win64_armasm.S src/alpha/ffi.c src/alpha/osf.S \ + src/arc/ffi.c src/arc/arcompact.S src/arm/ffi.c \ + src/arm/sysv.S src/arm/ffi.c src/arm/sysv_msvc_arm32.S \ + src/avr32/ffi.c src/avr32/sysv.S src/bfin/ffi.c \ + src/bfin/sysv.S src/cris/ffi.c src/cris/sysv.S src/frv/ffi.c \ + src/csky/ffi.c src/csky/sysv.S src/frv/eabi.S src/ia64/ffi.c \ + src/ia64/unix.S src/m32r/ffi.c src/m32r/sysv.S src/m68k/ffi.c \ + src/m68k/sysv.S src/m88k/ffi.c src/m88k/obsd.S \ + src/metag/ffi.c src/metag/sysv.S src/microblaze/ffi.c \ + src/microblaze/sysv.S src/mips/ffi.c src/mips/o32.S \ + src/mips/n32.S src/moxie/ffi.c src/moxie/eabi.S \ + src/nios2/ffi.c src/nios2/sysv.S src/or1k/ffi.c \ + src/or1k/sysv.S src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \ + src/powerpc/ffi.c src/powerpc/ffi_sysv.c \ + src/powerpc/ffi_linux64.c src/powerpc/sysv.S \ + src/powerpc/linux64.S src/powerpc/linux64_closure.S \ + src/powerpc/ppc_closure.S src/powerpc/aix.S \ + src/powerpc/darwin.S src/powerpc/aix_closure.S \ + src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \ + src/riscv/ffi.c src/riscv/sysv.S src/s390/ffi.c \ + src/s390/sysv.S src/sh/ffi.c src/sh/sysv.S src/sh64/ffi.c \ + src/sh64/sysv.S src/sparc/ffi.c src/sparc/ffi64.c \ + src/sparc/v8.S src/sparc/v9.S src/tile/ffi.c src/tile/tile.S \ + src/vax/ffi.c src/vax/elfbsd.S src/x86/ffi.c src/x86/sysv.S \ + src/x86/ffiw64.c src/x86/win64.S src/x86/ffi64.c \ + src/x86/unix64.S src/x86/sysv_intel.S src/x86/win64_intel.S \ + src/xtensa/ffi.c src/xtensa/sysv.S src/kvx/ffi.c \ + src/kvx/sysv.S + +TARGET_OBJ = @TARGET_OBJ@ +libffi_la_LIBADD = $(TARGET_OBJ) + +libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) +EXTRA_libffi_convenience_la_SOURCES = $(EXTRA_libffi_la_SOURCES) +libffi_convenience_la_LIBADD = $(libffi_la_LIBADD) +libffi_convenience_la_DEPENDENCIES = $(libffi_la_DEPENDENCIES) +nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) + +LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) + +AM_CFLAGS = +if FFI_DEBUG +# Build debug. Define FFI_DEBUG on the commandline so that, when building with +# MSVC, it can link against the debug CRT. +AM_CFLAGS += -DFFI_DEBUG +endif + +if LIBFFI_BUILD_VERSIONED_SHLIB +if LIBFFI_BUILD_VERSIONED_SHLIB_GNU +libffi_version_script = -Wl,--version-script,libffi.map +libffi_version_dep = libffi.map +endif +if LIBFFI_BUILD_VERSIONED_SHLIB_SUN +libffi_version_script = -Wl,-M,libffi.map-sun +libffi_version_dep = libffi.map-sun +libffi.map-sun : libffi.map $(top_srcdir)/make_sunver.pl \ + $(libffi_la_OBJECTS) $(libffi_la_LIBADD) + perl $(top_srcdir)/make_sunver.pl libffi.map \ + `echo $(libffi_la_OBJECTS) $(libffi_la_LIBADD) | \ + sed 's,\([^/ ]*\)\.l\([ao]\),.libs/\1.\2,g'` \ + > $@ || (rm -f $@ ; exit 1) +endif +else +libffi_version_script = +libffi_version_dep = +endif +libffi_version_info = -version-info `grep -v '^\#' $(srcdir)/libtool-version` + +libffi.map: $(top_srcdir)/libffi.map.in + $(COMPILE) -D$(TARGET) -DGENERATE_LIBFFI_MAP \ + -E -x assembler-with-cpp -o $@ $(top_srcdir)/libffi.map.in + +libffi_la_LDFLAGS = -no-undefined $(libffi_version_info) $(libffi_version_script) $(LTLDFLAGS) $(AM_LTLDFLAGS) +libffi_la_DEPENDENCIES = $(libffi_la_LIBADD) $(libffi_version_dep) + +AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src +AM_CCASFLAGS = $(AM_CPPFLAGS) + +dist-hook: + d=`(cd $(distdir); pwd)`; (cd doc; make pdf; cp *.pdf $$d/doc) + if [ -d $(top_srcdir)/.git ] ; then (cd $(top_srcdir); git log --no-decorate) ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog + s=`awk '/was released on/{ print NR; exit}' $(top_srcdir)/README.md`; tail -n +$$(($$s-1)) $(top_srcdir)/README.md > $(distdir)/README.md + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/README.md b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/README.md new file mode 100644 index 000000000000..4225d8534582 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/README.md @@ -0,0 +1,486 @@ +Status +====== + +[![Build Status](https://travis-ci.org/libffi/libffi.svg?branch=master)](https://travis-ci.org/libffi/libffi) +[![Build status](https://ci.appveyor.com/api/projects/status/8lko9vagbx4w2kxq?svg=true)](https://ci.appveyor.com/project/atgreen/libffi) + +libffi-3.4 was released on TBD. Check the libffi web +page for updates: <URL:http://sourceware.org/libffi/>. + + +What is libffi? +=============== + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the "calling +convention". The "calling convention" is essentially a set of +assumptions made by the compiler about where function arguments will +be found on entry to a function. A "calling convention" also specifies +where the return value for a function is found. + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. Libffi can be used in such programs to provide a +bridge from the interpreter program to compiled code. + +The libffi library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +FFI stands for Foreign Function Interface. A foreign function +interface is the popular name for the interface that allows code +written in one language to call code written in another language. The +libffi library really only provides the lowest, machine dependent +layer of a fully featured foreign function interface. A layer must +exist above libffi that handles type conversions for values passed +between the two languages. + + +Supported Platforms +=================== + +Libffi has been ported to many different platforms. + +At the time of release, the following basic configurations have been +tested: + +| Architecture | Operating System | Compiler | +| --------------- | ---------------- | ----------------------- | +| AArch64 (ARM64) | iOS | Clang | +| AArch64 | Linux | GCC | +| AArch64 | Windows | MSVC | +| Alpha | Linux | GCC | +| Alpha | Tru64 | GCC | +| ARC | Linux | GCC | +| ARM | Linux | GCC | +| ARM | iOS | GCC | +| ARM | Windows | MSVC | +| AVR32 | Linux | GCC | +| Blackfin | uClinux | GCC | +| CSKY | Linux | GCC | +| HPPA | HPUX | GCC | +| KVX | Linux | GCC | +| IA-64 | Linux | GCC | +| M68K | FreeMiNT | GCC | +| M68K | Linux | GCC | +| M68K | RTEMS | GCC | +| M88K | OpenBSD/mvme88k | GCC | +| Meta | Linux | GCC | +| MicroBlaze | Linux | GCC | +| MIPS | IRIX | GCC | +| MIPS | Linux | GCC | +| MIPS | RTEMS | GCC | +| MIPS64 | Linux | GCC | +| Moxie | Bare metal | GCC | +| Nios II | Linux | GCC | +| OpenRISC | Linux | GCC | +| PowerPC 32-bit | AIX | IBM XL C | +| PowerPC 64-bit | AIX | IBM XL C | +| PowerPC | AMIGA | GCC | +| PowerPC | Linux | GCC | +| PowerPC | Mac OSX | GCC | +| PowerPC | FreeBSD | GCC | +| PowerPC 64-bit | FreeBSD | GCC | +| PowerPC 64-bit | Linux ELFv1 | GCC | +| PowerPC 64-bit | Linux ELFv2 | GCC | +| RISC-V 32-bit | Linux | GCC | +| RISC-V 64-bit | Linux | GCC | +| S390 | Linux | GCC | +| S390X | Linux | GCC | +| SPARC | Linux | GCC | +| SPARC | Solaris | GCC | +| SPARC | Solaris | Oracle Solaris Studio C | +| SPARC64 | Linux | GCC | +| SPARC64 | FreeBSD | GCC | +| SPARC64 | Solaris | Oracle Solaris Studio C | +| TILE-Gx/TILEPro | Linux | GCC | +| VAX | OpenBSD/vax | GCC | +| X86 | FreeBSD | GCC | +| X86 | GNU HURD | GCC | +| X86 | Interix | GCC | +| X86 | kFreeBSD | GCC | +| X86 | Linux | GCC | +| X86 | OpenBSD | GCC | +| X86 | OS/2 | GCC | +| X86 | Solaris | GCC | +| X86 | Solaris | Oracle Solaris Studio C | +| X86 | Windows/Cygwin | GCC | +| X86 | Windows/MingW | GCC | +| X86-64 | FreeBSD | GCC | +| X86-64 | Linux | GCC | +| X86-64 | Linux/x32 | GCC | +| X86-64 | OpenBSD | GCC | +| X86-64 | Solaris | Oracle Solaris Studio C | +| X86-64 | Windows/Cygwin | GCC | +| X86-64 | Windows/MingW | GCC | +| X86-64 | Mac OSX | GCC | +| Xtensa | Linux | GCC | + +Please send additional platform test results to +libffi-discuss@sourceware.org. + +Installing libffi +================= + +First you must configure the distribution for your particular +system. Go to the directory you wish to build libffi in and run the +"configure" program found in the root directory of the libffi source +distribution. Note that building libffi requires a C99 compatible +compiler. + +If you're building libffi directly from git hosted sources, configure +won't exist yet; run ./autogen.sh first. This will require that you +install autoconf, automake and libtool. + +You may want to tell configure where to install the libffi library and +header files. To do that, use the ``--prefix`` configure switch. Libffi +will install under /usr/local by default. + +If you want to enable extra run-time debugging checks use the the +``--enable-debug`` configure switch. This is useful when your program dies +mysteriously while using libffi. + +Another useful configure switch is ``--enable-purify-safety``. Using this +will add some extra code which will suppress certain warnings when you +are using Purify with libffi. Only use this switch when using +Purify, as it will slow down the library. + +If you don't want to build documentation, use the ``--disable-docs`` +configure switch. + +It's also possible to build libffi on Windows platforms with +Microsoft's Visual C++ compiler. In this case, use the msvcc.sh +wrapper script during configuration like so: + + path/to/configure CC=path/to/msvcc.sh CXX=path/to/msvcc.sh LD=link CPP="cl -nologo -EP" CPPFLAGS="-DFFI_BUILDING_DLL" + +For 64-bit Windows builds, use ``CC="path/to/msvcc.sh -m64"`` and +``CXX="path/to/msvcc.sh -m64"``. You may also need to specify +``--build`` appropriately. + +It is also possible to build libffi on Windows platforms with the LLVM +project's clang-cl compiler, like below: + + path/to/configure CC="path/to/msvcc.sh -clang-cl" CXX="path/to/msvcc.sh -clang-cl" LD=link CPP="clang-cl -EP" + +When building with MSVC under a MingW environment, you may need to +remove the line in configure that sets 'fix_srcfile_path' to a 'cygpath' +command. ('cygpath' is not present in MingW, and is not required when +using MingW-style paths.) + +To build static library for ARM64 with MSVC using visual studio solution, msvc_build folder have + aarch64/Ffi_staticLib.sln + required header files in aarch64/aarch64_include/ + + +SPARC Solaris builds require the use of the GNU assembler and linker. +Point ``AS`` and ``LD`` environment variables at those tool prior to +configuration. + +For iOS builds, the ``libffi.xcodeproj`` Xcode project is available. + +Configure has many other options. Use ``configure --help`` to see them all. + +Once configure has finished, type "make". Note that you must be using +GNU make. You can ftp GNU make from ftp.gnu.org:/pub/gnu/make . + +To ensure that libffi is working as advertised, type "make check". +This will require that you have DejaGNU installed. + +To install the library and header files, type ``make install``. + + +History +======= + +See the git log for details at http://github.com/libffi/libffi. + + 3.4 TBD + Add support for Alibaba's CSKY architecture. + Add support for Intel Control-flow Enforcement Technology (CET). + Add support for ARM Pointer Authentication (PA). + Fix 32-bit PPC regression. + Fix MIPS soft-float problem. + + 3.3 Nov-23-19 + Add RISC-V support. + New API in support of GO closures. + Add IEEE754 binary128 long double support for 64-bit Power + Default to Microsoft's 64 bit long double ABI with Visual C++. + GNU compiler uses 80 bits (128 in memory) FFI_GNUW64 ABI. + Add Windows on ARM64 (WOA) support. + Add Windows 32-bit ARM support. + Raw java (gcj) API deprecated. + Add pre-built PDF documentation to source distribution. + Many new test cases and bug fixes. + + 3.2.1 Nov-12-14 + Build fix for non-iOS AArch64 targets. + + 3.2 Nov-11-14 + Add C99 Complex Type support (currently only supported on + s390). + Add support for PASCAL and REGISTER calling conventions on x86 + Windows/Linux. + Add OpenRISC and Cygwin-64 support. + Bug fixes. + + 3.1 May-19-14 + Add AArch64 (ARM64) iOS support. + Add Nios II support. + Add m88k and DEC VAX support. + Add support for stdcall, thiscall, and fastcall on non-Windows + 32-bit x86 targets such as Linux. + Various Android, MIPS N32, x86, FreeBSD and UltraSPARC IIi + fixes. + Make the testsuite more robust: eliminate several spurious + failures, and respect the $CC and $CXX environment variables. + Archive off the manually maintained ChangeLog in favor of git + log. + + 3.0.13 Mar-17-13 + Add Meta support. + Add missing Moxie bits. + Fix stack alignment bug on 32-bit x86. + Build fix for m68000 targets. + Build fix for soft-float Power targets. + Fix the install dir location for some platforms when building + with GCC (OS X, Solaris). + Fix Cygwin regression. + + 3.0.12 Feb-11-13 + Add Moxie support. + Add AArch64 support. + Add Blackfin support. + Add TILE-Gx/TILEPro support. + Add MicroBlaze support. + Add Xtensa support. + Add support for PaX enabled kernels with MPROTECT. + Add support for native vendor compilers on + Solaris and AIX. + Work around LLVM/GCC interoperability issue on x86_64. + + 3.0.11 Apr-11-12 + Lots of build fixes. + Add support for variadic functions (ffi_prep_cif_var). + Add Linux/x32 support. + Add thiscall, fastcall and MSVC cdecl support on Windows. + Add Amiga and newer MacOS support. + Add m68k FreeMiNT support. + Integration with iOS' xcode build tools. + Fix Octeon and MC68881 support. + Fix code pessimizations. + + 3.0.10 Aug-23-11 + Add support for Apple's iOS. + Add support for ARM VFP ABI. + Add RTEMS support for MIPS and M68K. + Fix instruction cache clearing problems on + ARM and SPARC. + Fix the N64 build on mips-sgi-irix6.5. + Enable builds with Microsoft's compiler. + Enable x86 builds with Oracle's Solaris compiler. + Fix support for calling code compiled with Oracle's Sparc + Solaris compiler. + Testsuite fixes for Tru64 Unix. + Additional platform support. + + 3.0.9 Dec-31-09 + Add AVR32 and win64 ports. Add ARM softfp support. + Many fixes for AIX, Solaris, HP-UX, *BSD. + Several PowerPC and x86-64 bug fixes. + Build DLL for windows. + + 3.0.8 Dec-19-08 + Add *BSD, BeOS, and PA-Linux support. + + 3.0.7 Nov-11-08 + Fix for ppc FreeBSD. + (thanks to Andreas Tobler) + + 3.0.6 Jul-17-08 + Fix for closures on sh. + Mark the sh/sh64 stack as non-executable. + (both thanks to Kaz Kojima) + + 3.0.5 Apr-3-08 + Fix libffi.pc file. + Fix #define ARM for IcedTea users. + Fix x86 closure bug. + + 3.0.4 Feb-24-08 + Fix x86 OpenBSD configury. + + 3.0.3 Feb-22-08 + Enable x86 OpenBSD thanks to Thomas Heller, and + x86-64 FreeBSD thanks to Björn König and Andreas Tobler. + Clean up test instruction in README. + + 3.0.2 Feb-21-08 + Improved x86 FreeBSD support. + Thanks to Björn König. + + 3.0.1 Feb-15-08 + Fix instruction cache flushing bug on MIPS. + Thanks to David Daney. + + 3.0.0 Feb-15-08 + Many changes, mostly thanks to the GCC project. + Cygnus Solutions is now Red Hat. + + [10 years go by...] + + 1.20 Oct-5-98 + Raffaele Sena produces ARM port. + + 1.19 Oct-5-98 + Fixed x86 long double and long long return support. + m68k bug fixes from Andreas Schwab. + Patch for DU assembler compatibility for the Alpha from Richard + Henderson. + + 1.18 Apr-17-98 + Bug fixes and MIPS configuration changes. + + 1.17 Feb-24-98 + Bug fixes and m68k port from Andreas Schwab. PowerPC port from + Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. + + 1.16 Feb-11-98 + Richard Henderson produces Alpha port. + + 1.15 Dec-4-97 + Fixed an n32 ABI bug. New libtool, auto* support. + + 1.14 May-13-97 + libtool is now used to generate shared and static libraries. + Fixed a minor portability problem reported by Russ McManus + <mcmanr@eq.gs.com>. + + 1.13 Dec-2-96 + Added --enable-purify-safety to keep Purify from complaining + about certain low level code. + Sparc fix for calling functions with < 6 args. + Linux x86 a.out fix. + + 1.12 Nov-22-96 + Added missing ffi_type_void, needed for supporting void return + types. Fixed test case for non MIPS machines. Cygnus Support + is now Cygnus Solutions. + + 1.11 Oct-30-96 + Added notes about GNU make. + + 1.10 Oct-29-96 + Added configuration fix for non GNU compilers. + + 1.09 Oct-29-96 + Added --enable-debug configure switch. Clean-ups based on LCLint + feedback. ffi_mips.h is always installed. Many configuration + fixes. Fixed ffitest.c for sparc builds. + + 1.08 Oct-15-96 + Fixed n32 problem. Many clean-ups. + + 1.07 Oct-14-96 + Gordon Irlam rewrites v8.S again. Bug fixes. + + 1.06 Oct-14-96 + Gordon Irlam improved the sparc port. + + 1.05 Oct-14-96 + Interface changes based on feedback. + + 1.04 Oct-11-96 + Sparc port complete (modulo struct passing bug). + + 1.03 Oct-10-96 + Passing struct args, and returning struct values works for + all architectures/calling conventions. Expanded tests. + + 1.02 Oct-9-96 + Added SGI n32 support. Fixed bugs in both o32 and Linux support. + Added "make test". + + 1.01 Oct-8-96 + Fixed float passing bug in mips version. Restructured some + of the code. Builds cleanly with SGI tools. + + 1.00 Oct-7-96 + First release. No public announcement. + +Authors & Credits +================= + +libffi was originally written by Anthony Green <green@moxielogic.com>. + +The developers of the GNU Compiler Collection project have made +innumerable valuable contributions. See the ChangeLog file for +details. + +Some of the ideas behind libffi were inspired by Gianni Mariani's free +gencall library for Silicon Graphics machines. + +The closure mechanism was designed and implemented by Kresten Krab +Thorup. + +Major processor architecture ports were contributed by the following +developers: + + aarch64 Marcus Shawcroft, James Greenhalgh + alpha Richard Henderson + arc Hackers at Synopsis + arm Raffaele Sena + avr32 Bradley Smith + blackfin Alexandre Keunecke I. de Mendonca + cris Simon Posnjak, Hans-Peter Nilsson + csky Ma Jun, Zhang Wenmeng + frv Anthony Green + ia64 Hans Boehm + m32r Kazuhiro Inaoka + m68k Andreas Schwab + m88k Miod Vallat + metag Hackers at Imagination Technologies + microblaze Nathan Rossi + mips Anthony Green, Casey Marshall + mips64 David Daney + moxie Anthony Green + nios ii Sandra Loosemore + openrisc Sebastian Macke + pa Randolph Chung, Dave Anglin, Andreas Tobler + powerpc Geoffrey Keating, Andreas Tobler, + David Edelsohn, John Hornkvist + powerpc64 Jakub Jelinek + riscv Michael Knyszek, Andrew Waterman, Stef O'Rear + s390 Gerhard Tonn, Ulrich Weigand + sh Kaz Kojima + sh64 Kaz Kojima + sparc Anthony Green, Gordon Irlam + tile-gx/tilepro Walter Lee + vax Miod Vallat + x86 Anthony Green, Jon Beniston + x86-64 Bo Thorsen + xtensa Chris Zankel + +Jesper Skov and Andrew Haley both did more than their fair share of +stepping through the code and tracking down bugs. + +Thanks also to Tom Tromey for bug fixes, documentation and +configuration help. + +Thanks to Jim Blandy, who provided some useful feedback on the libffi +interface. + +Andreas Tobler has done a tremendous amount of work on the testsuite. + +Alex Oliva solved the executable page problem for SElinux. + +The list above is almost certainly incomplete and inaccurate. I'm +happy to make corrections or additions upon request. + +If you have a problem, or have found a bug, please send a note to the +author at green@moxielogic.com, or the project mailing list at +libffi-discuss@sourceware.org. diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/acinclude.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/acinclude.m4 new file mode 100644 index 000000000000..1a70efb010dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/acinclude.m4 @@ -0,0 +1,479 @@ +# mmap(2) blacklisting. Some platforms provide the mmap library routine +# but don't support all of the features we need from it. +AC_DEFUN([AC_FUNC_MMAP_BLACKLIST], +[ +AC_CHECK_HEADER([sys/mman.h], + [libffi_header_sys_mman_h=yes], [libffi_header_sys_mman_h=no]) +AC_CHECK_FUNC([mmap], [libffi_func_mmap=yes], [libffi_func_mmap=no]) +if test "$libffi_header_sys_mman_h" != yes \ + || test "$libffi_func_mmap" != yes; then + ac_cv_func_mmap_file=no + ac_cv_func_mmap_dev_zero=no + ac_cv_func_mmap_anon=no +else + AC_CACHE_CHECK([whether read-only mmap of a plain file works], + ac_cv_func_mmap_file, + [# Add a system to this blacklist if + # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a + # memory area containing the same data that you'd get if you applied + # read() to the same fd. The only system known to have a problem here + # is VMS, where text files have record structure. + case "$host_os" in + vms* | ultrix*) + ac_cv_func_mmap_file=no ;; + *) + ac_cv_func_mmap_file=yes;; + esac]) + AC_CACHE_CHECK([whether mmap from /dev/zero works], + ac_cv_func_mmap_dev_zero, + [# Add a system to this blacklist if it has mmap() but /dev/zero + # does not exist, or if mmapping /dev/zero does not give anonymous + # zeroed pages with both the following properties: + # 1. If you map N consecutive pages in with one call, and then + # unmap any subset of those pages, the pages that were not + # explicitly unmapped remain accessible. + # 2. If you map two adjacent blocks of memory and then unmap them + # both at once, they must both go away. + # Systems known to be in this category are Windows (all variants), + # VMS, and Darwin. + case "$host_os" in + vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00) + ac_cv_func_mmap_dev_zero=no ;; + *) + ac_cv_func_mmap_dev_zero=yes;; + esac]) + + # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. + AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon, + [AC_TRY_COMPILE( +[#include <sys/types.h> +#include <sys/mman.h> +#include <unistd.h> + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif +], +[int n = MAP_ANONYMOUS;], + ac_cv_decl_map_anon=yes, + ac_cv_decl_map_anon=no)]) + + if test $ac_cv_decl_map_anon = no; then + ac_cv_func_mmap_anon=no + else + AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works], + ac_cv_func_mmap_anon, + [# Add a system to this blacklist if it has mmap() and MAP_ANON or + # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) + # doesn't give anonymous zeroed pages with the same properties listed + # above for use of /dev/zero. + # Systems known to be in this category are Windows, VMS, and SCO Unix. + case "$host_os" in + vms* | cygwin* | pe | mingw* | sco* | udk* ) + ac_cv_func_mmap_anon=no ;; + *) + ac_cv_func_mmap_anon=yes;; + esac]) + fi +fi + +if test $ac_cv_func_mmap_file = yes; then + AC_DEFINE(HAVE_MMAP_FILE, 1, + [Define if read-only mmap of a plain file works.]) +fi +if test $ac_cv_func_mmap_dev_zero = yes; then + AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1, + [Define if mmap of /dev/zero works.]) +fi +if test $ac_cv_func_mmap_anon = yes; then + AC_DEFINE(HAVE_MMAP_ANON, 1, + [Define if mmap with MAP_ANON(YMOUS) works.]) +fi +]) + +dnl ---------------------------------------------------------------------- +dnl This whole bit snagged from libstdc++-v3, via libatomic. + +dnl +dnl LIBFFI_ENABLE +dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING) +dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c) +dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER) +dnl +dnl See docs/html/17_intro/configury.html#enable for documentation. +dnl +m4_define([LIBFFI_ENABLE],[dnl +m4_define([_g_switch],[--enable-$1])dnl +m4_define([_g_help],[AC_HELP_STRING(_g_switch$3,[$4 @<:@default=$2@:>@])])dnl + AC_ARG_ENABLE($1,_g_help, + m4_bmatch([$5], + [^permit ], + [[ + case "$enableval" in + m4_bpatsubst([$5],[permit ])) ;; + *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;; + dnl Idea for future: generate a URL pointing to + dnl "onlinedocs/configopts.html#whatever" + esac + ]], + [^$], + [[ + case "$enableval" in + yes|no) ;; + *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;; + esac + ]], + [[$5]]), + [enable_]m4_bpatsubst([$1],-,_)[=][$2]) +m4_undefine([_g_switch])dnl +m4_undefine([_g_help])dnl +]) + +dnl +dnl If GNU ld is in use, check to see if tricky linker opts can be used. If +dnl the native linker is in use, all variables will be defined to something +dnl safe (like an empty string). +dnl +dnl Defines: +dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible +dnl OPT_LDFLAGS='-Wl,-O1' if possible +dnl LD (as a side effect of testing) +dnl Sets: +dnl with_gnu_ld +dnl libat_ld_is_gold (possibly) +dnl libat_gnu_ld_version (possibly) +dnl +dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will +dnl set libat_gnu_ld_version to 12345. Zeros cause problems. +dnl +AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES], [ + # If we're not using GNU ld, then there's no point in even trying these + # tests. Check for that first. We should have already tested for gld + # by now (in libtool), but require it now just to be safe... + test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' + test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' + AC_REQUIRE([AC_PROG_LD]) + AC_REQUIRE([AC_PROG_AWK]) + + # The name set by libtool depends on the version of libtool. Shame on us + # for depending on an impl detail, but c'est la vie. Older versions used + # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on + # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually + # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't + # set (hence we're using an older libtool), then set it. + if test x${with_gnu_ld+set} != xset; then + if test x${ac_cv_prog_gnu_ld+set} != xset; then + # We got through "ac_require(ac_prog_ld)" and still not set? Huh? + with_gnu_ld=no + else + with_gnu_ld=$ac_cv_prog_gnu_ld + fi + fi + + # Start by getting the version number. I think the libtool test already + # does some of this, but throws away the result. + libat_ld_is_gold=no + if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then + libat_ld_is_gold=yes + fi + changequote(,) + ldver=`$LD --version 2>/dev/null | + sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` + changequote([,]) + libat_gnu_ld_version=`echo $ldver | \ + $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'` + + # Set --gc-sections. + if test "$with_gnu_ld" = "notbroken"; then + # GNU ld it is! Joy and bunny rabbits! + + # All these tests are for C++; save the language and the compiler flags. + # Need to do this so that g++ won't try to link in libstdc++ + ac_test_CFLAGS="${CFLAGS+set}" + ac_save_CFLAGS="$CFLAGS" + CFLAGS='-x c++ -Wl,--gc-sections' + + # Check for -Wl,--gc-sections + # XXX This test is broken at the moment, as symbols required for linking + # are now in libsupc++ (not built yet). In addition, this test has + # cored on solaris in the past. In addition, --gc-sections doesn't + # really work at the moment (keeps on discarding used sections, first + # .eh_frame and now some of the glibc sections for iconv). + # Bzzzzt. Thanks for playing, maybe next time. + AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections]) + AC_TRY_RUN([ + int main(void) + { + try { throw 1; } + catch (...) { }; + return 0; + } + ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes]) + if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" + else + # this is the suspicious part + CFLAGS='' + fi + if test "$ac_sectionLDflags" = "yes"; then + SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" + fi + AC_MSG_RESULT($ac_sectionLDflags) + fi + + # Set linker optimization flags. + if test x"$with_gnu_ld" = x"yes"; then + OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" + fi + + AC_SUBST(SECTION_LDFLAGS) + AC_SUBST(OPT_LDFLAGS) +]) + + +dnl +dnl If GNU ld is in use, check to see if tricky linker opts can be used. If +dnl the native linker is in use, all variables will be defined to something +dnl safe (like an empty string). +dnl +dnl Defines: +dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible +dnl OPT_LDFLAGS='-Wl,-O1' if possible +dnl LD (as a side effect of testing) +dnl Sets: +dnl with_gnu_ld +dnl libat_ld_is_gold (possibly) +dnl libat_gnu_ld_version (possibly) +dnl +dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will +dnl set libat_gnu_ld_version to 12345. Zeros cause problems. +dnl +AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES], [ + # If we're not using GNU ld, then there's no point in even trying these + # tests. Check for that first. We should have already tested for gld + # by now (in libtool), but require it now just to be safe... + test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' + test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' + AC_REQUIRE([AC_PROG_LD]) + AC_REQUIRE([AC_PROG_AWK]) + + # The name set by libtool depends on the version of libtool. Shame on us + # for depending on an impl detail, but c'est la vie. Older versions used + # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on + # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually + # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't + # set (hence we're using an older libtool), then set it. + if test x${with_gnu_ld+set} != xset; then + if test x${ac_cv_prog_gnu_ld+set} != xset; then + # We got through "ac_require(ac_prog_ld)" and still not set? Huh? + with_gnu_ld=no + else + with_gnu_ld=$ac_cv_prog_gnu_ld + fi + fi + + # Start by getting the version number. I think the libtool test already + # does some of this, but throws away the result. + libat_ld_is_gold=no + if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then + libat_ld_is_gold=yes + fi + libat_ld_is_lld=no + if $LD --version 2>/dev/null | grep 'LLD '> /dev/null 2>&1; then + libat_ld_is_lld=yes + fi + changequote(,) + ldver=`$LD --version 2>/dev/null | + sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` + changequote([,]) + libat_gnu_ld_version=`echo $ldver | \ + $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'` + + # Set --gc-sections. + if test "$with_gnu_ld" = "notbroken"; then + # GNU ld it is! Joy and bunny rabbits! + + # All these tests are for C++; save the language and the compiler flags. + # Need to do this so that g++ won't try to link in libstdc++ + ac_test_CFLAGS="${CFLAGS+set}" + ac_save_CFLAGS="$CFLAGS" + CFLAGS='-x c++ -Wl,--gc-sections' + + # Check for -Wl,--gc-sections + # XXX This test is broken at the moment, as symbols required for linking + # are now in libsupc++ (not built yet). In addition, this test has + # cored on solaris in the past. In addition, --gc-sections doesn't + # really work at the moment (keeps on discarding used sections, first + # .eh_frame and now some of the glibc sections for iconv). + # Bzzzzt. Thanks for playing, maybe next time. + AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections]) + AC_TRY_RUN([ + int main(void) + { + try { throw 1; } + catch (...) { }; + return 0; + } + ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes]) + if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" + else + # this is the suspicious part + CFLAGS='' + fi + if test "$ac_sectionLDflags" = "yes"; then + SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" + fi + AC_MSG_RESULT($ac_sectionLDflags) + fi + + # Set linker optimization flags. + if test x"$with_gnu_ld" = x"yes"; then + OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" + fi + + AC_SUBST(SECTION_LDFLAGS) + AC_SUBST(OPT_LDFLAGS) +]) + + +dnl +dnl Add version tags to symbols in shared library (or not), additionally +dnl marking other symbols as private/local (or not). +dnl +dnl --enable-symvers=style adds a version script to the linker call when +dnl creating the shared library. The choice of version script is +dnl controlled by 'style'. +dnl --disable-symvers does not. +dnl + Usage: LIBFFI_ENABLE_SYMVERS[(DEFAULT)] +dnl Where DEFAULT is either 'yes' or 'no'. Passing `yes' tries to +dnl choose a default style based on linker characteristics. Passing +dnl 'no' disables versioning. +dnl +AC_DEFUN([LIBFFI_ENABLE_SYMVERS], [ + +LIBFFI_ENABLE(symvers,yes,[=STYLE], + [enables symbol versioning of the shared library], + [permit yes|no|gnu*|sun]) + +# If we never went through the LIBFFI_CHECK_LINKER_FEATURES macro, then we +# don't know enough about $LD to do tricks... +AC_REQUIRE([LIBFFI_CHECK_LINKER_FEATURES]) + +# Turn a 'yes' into a suitable default. +if test x$enable_symvers = xyes ; then + # FIXME The following test is too strict, in theory. + if test $enable_shared = no || test "x$LD" = x; then + enable_symvers=no + else + if test $with_gnu_ld = yes ; then + enable_symvers=gnu + else + case ${target_os} in + # Sun symbol versioning exists since Solaris 2.5. + solaris2.[[5-9]]* | solaris2.1[[0-9]]*) + enable_symvers=sun ;; + *) + enable_symvers=no ;; + esac + fi + fi +fi + +# Check if 'sun' was requested on non-Solaris 2 platforms. +if test x$enable_symvers = xsun ; then + case ${target_os} in + solaris2*) + # All fine. + ;; + *) + # Unlikely to work. + AC_MSG_WARN([=== You have requested Sun symbol versioning, but]) + AC_MSG_WARN([=== you are not targetting Solaris 2.]) + AC_MSG_WARN([=== Symbol versioning will be disabled.]) + enable_symvers=no + ;; + esac +fi + +# Check to see if libgcc_s exists, indicating that shared libgcc is possible. +if test $enable_symvers != no; then + AC_MSG_CHECKING([for shared libgcc]) + ac_save_CFLAGS="$CFLAGS" + CFLAGS=' -lgcc_s' + AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes, libat_shared_libgcc=no) + CFLAGS="$ac_save_CFLAGS" + if test $libat_shared_libgcc = no; then + cat > conftest.c <<EOF +int main (void) { return 0; } +EOF +changequote(,)dnl + libat_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \ + -shared -shared-libgcc -o conftest.so \ + conftest.c -v 2>&1 >/dev/null \ + | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'` +changequote([,])dnl + rm -f conftest.c conftest.so + if test x${libat_libgcc_s_suffix+set} = xset; then + CFLAGS=" -lgcc_s$libat_libgcc_s_suffix" + AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes) + CFLAGS="$ac_save_CFLAGS" + fi + fi + AC_MSG_RESULT($libat_shared_libgcc) +fi + +# For GNU ld, we need at least this version. The format is described in +# LIBFFI_CHECK_LINKER_FEATURES above. +libat_min_gnu_ld_version=21400 +# XXXXXXXXXXX libat_gnu_ld_version=21390 + +# Check to see if unspecified "yes" value can win, given results above. +# Change "yes" into either "no" or a style name. +if test $enable_symvers != no && test $libat_shared_libgcc = yes; then + if test $with_gnu_ld = yes; then + if test $libat_gnu_ld_version -ge $libat_min_gnu_ld_version ; then + enable_symvers=gnu + elif test $libat_ld_is_gold = yes ; then + enable_symvers=gnu + elif test $libat_ld_is_lld = yes ; then + enable_symvers=gnu + else + # The right tools, the right setup, but too old. Fallbacks? + AC_MSG_WARN(=== Linker version $libat_gnu_ld_version is too old for) + AC_MSG_WARN(=== full symbol versioning support in this release of GCC.) + AC_MSG_WARN(=== You would need to upgrade your binutils to version) + AC_MSG_WARN(=== $libat_min_gnu_ld_version or later and rebuild GCC.) + if test $libat_gnu_ld_version -ge 21200 ; then + # Globbing fix is present, proper block support is not. + dnl AC_MSG_WARN([=== Dude, you are soooo close. Maybe we can fake it.]) + dnl enable_symvers=??? + AC_MSG_WARN([=== Symbol versioning will be disabled.]) + enable_symvers=no + else + # 2.11 or older. + AC_MSG_WARN([=== Symbol versioning will be disabled.]) + enable_symvers=no + fi + fi + elif test $enable_symvers = sun; then + : All interesting versions of Sun ld support sun style symbol versioning. + else + # just fail for now + AC_MSG_WARN([=== You have requested some kind of symbol versioning, but]) + AC_MSG_WARN([=== either you are not using a supported linker, or you are]) + AC_MSG_WARN([=== not building a shared libgcc_s (which is required).]) + AC_MSG_WARN([=== Symbol versioning will be disabled.]) + enable_symvers=no + fi +fi +if test $enable_symvers = gnu; then + AC_DEFINE(LIBFFI_GNU_SYMBOL_VERSIONING, 1, + [Define to 1 if GNU symbol versioning is used for libatomic.]) +fi + +AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB, test $enable_symvers != no) +AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB_GNU, test $enable_symvers = gnu) +AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB_SUN, test $enable_symvers = sun) +AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers) +]) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/autogen.sh b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/autogen.sh new file mode 100644 index 000000000000..fb014a33ea3b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/autogen.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec autoreconf -v -i diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/config.guess b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/config.guess new file mode 100644 index 000000000000..e94095c5fbe8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/config.guess @@ -0,0 +1,1687 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-07-12' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <https://www.gnu.org/licenses/>. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to <config-patches@gnu.org>. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include <features.h> + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include <stdio.h> /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include <sys/systemcfg.h> + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include <stdlib.h> + #include <unistd.h> + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-pc-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + set_cc_for_build + LIBCABI=$LIBC + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI="$LIBC"x32 + fi + fi + echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` + echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL" + elif /bin/uname -X 2>/dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + arm64:Darwin:*:*) + echo aarch64-apple-darwin"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; +esac + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" <<EOF +#ifdef _SEQUENT_ +#include <sys/types.h> +#include <sys/utsname.h> +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include <signal.h> +#if defined(_SIZE_T_) || defined(SIGLOST) +#include <sys/utsname.h> +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include <sys/param.h> + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include <sys/param.h> +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <<EOF + +NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize +the system type. Please install a C compiler and try again. +EOF + ;; +esac + +cat >&2 <<EOF + +This script (version $timestamp), has failed to recognize the +operating system you are using. If your script is old, overwrite *all* +copies of config.guess and config.sub with the latest versions from: + + https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +and + https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub +EOF + +year=`echo $timestamp | sed 's,-.*,,'` +# shellcheck disable=SC2003 +if test "`expr "\`date +%Y\`" - "$year"`" -lt 3 ; then + cat >&2 <<EOF + +If $0 has already been updated, send the following data and any +information you think might be pertinent to config-patches@gnu.org to +provide the necessary information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/config.sub b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/config.sub new file mode 100644 index 000000000000..14b5150c42a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/config.sub @@ -0,0 +1,1851 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-08-05' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <https://www.gnu.org/licenses/>. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to <config-patches@gnu.org>. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <<EOF +$1 +EOF + +# Separate into logical components for further validation +case $1 in + *-*-*-*-*) + echo Invalid configuration \`"$1"\': more than four components >&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <<EOF +$basic_machine +EOF + ;; + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + cpu=$basic_machine + vendor=pc + ;; + # These rules are duplicated from below for sake of the special case above; + # i.e. things that normalized to x86 arches should also default to "pc" + pc98) + cpu=i386 + vendor=pc + ;; + x64 | amd64) + cpu=x86_64 + vendor=pc + ;; + # Recognize the basic CPU types without company name. + *) + cpu=$basic_machine + vendor=unknown + ;; +esac + +unset -v basic_machine + +# Decode basic machines in the full and proper CPU-Company form. +case $cpu-$vendor in + # Here we handle the default manufacturer of certain CPU types in canonical form. It is in + # some cases the only manufacturer, in others, it is the most popular. + craynv-unknown) + vendor=cray + basic_os=${basic_os:-unicosmp} + ;; + c90-unknown | c90-cray) + vendor=cray + basic_os=${Basic_os:-unicos} + ;; + fx80-unknown) + vendor=alliant + ;; + romp-unknown) + vendor=ibm + ;; + mmix-unknown) + vendor=knuth + ;; + microblaze-unknown | microblazeel-unknown) + vendor=xilinx + ;; + rs6000-unknown) + vendor=ibm + ;; + vax-unknown) + vendor=dec + ;; + pdp11-unknown) + vendor=dec + ;; + we32k-unknown) + vendor=att + ;; + cydra-unknown) + vendor=cydrome + ;; + i370-ibm*) + vendor=ibm + ;; + orion-unknown) + vendor=highlevel + ;; + xps-unknown | xps100-unknown) + cpu=xps100 + vendor=honeywell + ;; + + # Here we normalize CPU types with a missing or matching vendor + dpx20-unknown | dpx20-bull) + cpu=rs6000 + vendor=bull + basic_os=${basic_os:-bosx} + ;; + + # Here we normalize CPU types irrespective of the vendor + amd64-*) + cpu=x86_64 + ;; + blackfin-*) + cpu=bfin + basic_os=linux + ;; + c54x-*) + cpu=tic54x + ;; + c55x-*) + cpu=tic55x + ;; + c6x-*) + cpu=tic6x + ;; + e500v[12]-*) + cpu=powerpc + basic_os=${basic_os}"spe" + ;; + mips3*-*) + cpu=mips64 + ;; + ms1-*) + cpu=mt + ;; + m68knommu-*) + cpu=m68k + basic_os=linux + ;; + m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*) + cpu=s12z + ;; + openrisc-*) + cpu=or32 + ;; + parisc-*) + cpu=hppa + basic_os=linux + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + cpu=i586 + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) + cpu=i686 + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + cpu=i686 + ;; + pentium4-*) + cpu=i786 + ;; + pc98-*) + cpu=i386 + ;; + ppc-* | ppcbe-*) + cpu=powerpc + ;; + ppcle-* | powerpclittle-*) + cpu=powerpcle + ;; + ppc64-*) + cpu=powerpc64 + ;; + ppc64le-* | powerpc64little-*) + cpu=powerpc64le + ;; + sb1-*) + cpu=mipsisa64sb1 + ;; + sb1el-*) + cpu=mipsisa64sb1el + ;; + sh5e[lb]-*) + cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'` + ;; + spur-*) + cpu=spur + ;; + strongarm-* | thumb-*) + cpu=arm + ;; + tx39-*) + cpu=mipstx39 + ;; + tx39el-*) + cpu=mipstx39el + ;; + x64-*) + cpu=x86_64 + ;; + xscale-* | xscalee[bl]-*) + cpu=`echo "$cpu" | sed 's/^xscale/arm/'` + ;; + arm64-*) + cpu=aarch64 + ;; + + # Recognize the canonical CPU Types that limit and/or modify the + # company names they are paired with. + cr16-*) + basic_os=${basic_os:-elf} + ;; + crisv32-* | etraxfs*-*) + cpu=crisv32 + vendor=axis + ;; + cris-* | etrax*-*) + cpu=cris + vendor=axis + ;; + crx-*) + basic_os=${basic_os:-elf} + ;; + neo-tandem) + cpu=neo + vendor=tandem + ;; + nse-tandem) + cpu=nse + vendor=tandem + ;; + nsr-tandem) + cpu=nsr + vendor=tandem + ;; + nsv-tandem) + cpu=nsv + vendor=tandem + ;; + nsx-tandem) + cpu=nsx + vendor=tandem + ;; + mipsallegrexel-sony) + cpu=mipsallegrexel + vendor=sony + ;; + tile*-*) + basic_os=${basic_os:-linux-gnu} + ;; + + *) + # Recognize the canonical CPU types that are allowed with any + # company name. + case $cpu in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | abacus \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ + | alphapca5[67] | alpha64pca5[67] \ + | am33_2.0 \ + | amdgcn \ + | arc | arceb \ + | arm | arm[lb]e | arme[lb] | armv* \ + | avr | avr32 \ + | asmjs \ + | ba \ + | be32 | be64 \ + | bfin | bpf | bs2000 \ + | c[123]* | c30 | [cjt]90 | c4x \ + | c8051 | clipper | craynv | csky | cydra \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | elxsi | epiphany \ + | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | h8300 | h8500 \ + | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i*86 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle \ + | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ + | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ + | m88110 | m88k | maxq | mb | mcore | mep | metag \ + | microblaze | microblazeel \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64eb | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mmix \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ + | none | np1 | ns16k | ns32k | nvptx \ + | open8 \ + | or1k* \ + | or32 \ + | orion \ + | picochip \ + | pdp10 | pdp11 | pj | pjl | pn | power \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pru \ + | pyramid \ + | riscv | riscv32 | riscv64 \ + | rl78 | romp | rs6000 | rx \ + | s390 | s390x \ + | score \ + | sh | shl \ + | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ + | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ + | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ + | spu \ + | tahoe \ + | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ + | tron \ + | ubicom32 \ + | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ + | vax \ + | visium \ + | w65 \ + | wasm32 | wasm64 \ + | we32k \ + | x86 | x86_64 | xc16x | xgate | xps100 \ + | xstormy16 | xtensa* \ + | ymp \ + | z8k | z80) + ;; + + *) + echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x$basic_os != x ] +then + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo $basic_os | sed -e 's|gnu/linux|gnu|'` + ;; + nto-qnx*) + kernel=nto + os=`echo $basic_os | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + IFS="-" read kernel os <<EOF +$basic_os +EOF + ;; + # Default OS when just kernel was specified + nto*) + kernel=nto + os=`echo $basic_os | sed -e 's|nto|qnx|'` + ;; + linux*) + kernel=linux + os=`echo $basic_os | sed -e 's|linux|gnu|'` + ;; + *) + kernel= + os=$basic_os + ;; +esac + +# Now, normalize the OS (knowing we just have one component, it's not a kernel, +# etc.) +case $os in + # First match some system type aliases that might get confused + # with valid system types. + # solaris* is a basic system type, with this one exception. + auroraux) + os=auroraux + ;; + bluegene*) + os=cnk + ;; + solaris1 | solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + solaris) + os=solaris2 + ;; + unixware*) + os=sysv4.2uw + ;; + # es1800 is here to avoid being matched by es* (a different OS) + es1800*) + os=ose + ;; + # Some version numbers need modification + chorusos*) + os=chorusos + ;; + isc) + os=isc2.2 + ;; + sco6) + os=sco5v6 + ;; + sco5) + os=sco3.2v5 + ;; + sco4) + os=sco3.2v4 + ;; + sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + ;; + sco*v* | scout) + # Don't match below + ;; + sco*) + os=sco3.2v2 + ;; + psos*) + os=psos + ;; + qnx*) + case $cpu in + x86 | i*86) + ;; + *) + os=nto-$os + ;; + esac + ;; + hiux*) + os=hiuxwe2 + ;; + lynx*178) + os=lynxos178 + ;; + lynx*5) + os=lynxos5 + ;; + lynxos*) + # don't get caught up in next wildcard + ;; + lynx*) + os=lynxos + ;; + mac[0-9]*) + os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + opened*) + os=openedition + ;; + os400*) + os=os400 + ;; + sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + wince*) + os=wince + ;; + utek*) + os=bsd + ;; + dynix*) + os=bsd + ;; + acis*) + os=aos + ;; + atheos*) + os=atheos + ;; + syllable*) + os=syllable + ;; + 386bsd) + os=bsd + ;; + ctix* | uts*) + os=sysv + ;; + nova*) + os=rtmk-nova + ;; + ns2) + os=nextstep2 + ;; + # Preserve the version number of sinix5. + sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + sinix*) + os=sysv4 + ;; + tpf*) + os=tpf + ;; + triton*) + os=sysv3 + ;; + oss*) + os=sysv3 + ;; + svr4*) + os=sysv4 + ;; + svr3) + os=sysv3 + ;; + sysvr4) + os=sysv4 + ;; + ose*) + os=ose + ;; + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + os=mint + ;; + dicos*) + os=dicos + ;; + pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $cpu in + arm*) + os=eabi + ;; + *) + os=elf + ;; + esac + ;; + *) + # No normalization, but not necessarily accepted, that comes below. + ;; +esac + +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +kernel= +case $cpu-$vendor in + score-*) + os=elf + ;; + spu-*) + os=elf + ;; + *-acorn) + os=riscix1.2 + ;; + arm*-rebel) + kernel=linux + os=gnu + ;; + arm*-semi) + os=aout + ;; + c4x-* | tic4x-*) + os=coff + ;; + c8051-*) + os=elf + ;; + clipper-intergraph) + os=clix + ;; + hexagon-*) + os=elf + ;; + tic54x-*) + os=coff + ;; + tic55x-*) + os=coff + ;; + tic6x-*) + os=coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=tops20 + ;; + pdp11-*) + os=none + ;; + *-dec | vax-*) + os=ultrix4.2 + ;; + m68*-apollo) + os=domain + ;; + i386-sun) + os=sunos4.0.2 + ;; + m68000-sun) + os=sunos3 + ;; + m68*-cisco) + os=aout + ;; + mep-*) + os=elf + ;; + mips*-cisco) + os=elf + ;; + mips*-*) + os=elf + ;; + or32-*) + os=coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=sysv3 + ;; + sparc-* | *-sun) + os=sunos4.1.1 + ;; + pru-*) + os=elf + ;; + *-be) + os=beos + ;; + *-ibm) + os=aix + ;; + *-knuth) + os=mmixware + ;; + *-wec) + os=proelf + ;; + *-winbond) + os=proelf + ;; + *-oki) + os=proelf + ;; + *-hp) + os=hpux + ;; + *-hitachi) + os=hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=sysv + ;; + *-cbm) + os=amigaos + ;; + *-dg) + os=dgux + ;; + *-dolphin) + os=sysv3 + ;; + m68k-ccur) + os=rtu + ;; + m88k-omron*) + os=luna + ;; + *-next) + os=nextstep + ;; + *-sequent) + os=ptx + ;; + *-crds) + os=unos + ;; + *-ns) + os=genix + ;; + i370-*) + os=mvs + ;; + *-gould) + os=sysv + ;; + *-highlevel) + os=bsd + ;; + *-encore) + os=bsd + ;; + *-sgi) + os=irix + ;; + *-siemens) + os=sysv4 + ;; + *-masscomp) + os=rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=uxpv + ;; + *-rom68k) + os=coff + ;; + *-*bug) + os=coff + ;; + *-apple) + os=macos + ;; + *-atari*) + os=mint + ;; + *-wrs) + os=vxworks + ;; + *) + os=none + ;; +esac + +fi + +# Now, validate our (potentially fixed-up) OS. +case $os in + # Sometimes we do "kernel-abi", so those need to count as OSes. + musl* | newlib* | uclibc*) + ;; + # Likewise for "kernel-libc" + eabi | eabisim | eabihf | gnueabi | gnueabihf) + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ + | os9* | macos* | osx* | ios* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | mint* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ + | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + none) + ;; + *) + echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + nto-qnx*) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure.ac b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure.ac new file mode 100644 index 000000000000..093b87d4f7e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure.ac @@ -0,0 +1,415 @@ +dnl Process this with autoconf to create configure + +AC_PREREQ(2.68) + +AC_INIT([libffi], [3.3], [http://github.com/libffi/libffi/issues]) +AC_CONFIG_HEADERS([fficonfig.h]) + +AC_CANONICAL_SYSTEM +target_alias=${target_alias-$host_alias} + +case "${host}" in + frv*-elf) + LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ + ;; +esac + +AX_ENABLE_BUILDDIR + +AM_INIT_AUTOMAKE + +# The same as in boehm-gc and libstdc++. Have to borrow it from there. +# We must force CC to /not/ be precious variables; otherwise +# the wrong, non-multilib-adjusted value will be used in multilibs. +# As a side effect, we have to subst CFLAGS ourselves. +# Also save and restore CFLAGS, since AC_PROG_CC will come up with +# defaults of its own if none are provided. + +m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS]) +m4_define([_AC_ARG_VAR_PRECIOUS],[]) +save_CFLAGS=$CFLAGS +AC_PROG_CC +AC_PROG_CXX +CFLAGS=$save_CFLAGS +m4_undefine([_AC_ARG_VAR_PRECIOUS]) +m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) + +AC_SUBST(CFLAGS) + +AM_PROG_AS +AM_PROG_CC_C_O +AC_PROG_LIBTOOL +AC_CONFIG_MACRO_DIR([m4]) + +# Test for 64-bit build. +AC_CHECK_SIZEOF([size_t]) + +AX_COMPILER_VENDOR +AX_CC_MAXOPT +# The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro +# compiler. +if test "$ax_cv_c_compiler_vendor" != "sun"; then + AX_CFLAGS_WARN_ALL +fi + +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -fexceptions" +fi + +cat > local.exp <<EOF +set CC_FOR_TARGET "$CC" +set CXX_FOR_TARGET "$CXX" +EOF + +AM_MAINTAINER_MODE + +AC_CHECK_HEADERS(sys/memfd.h) +AC_CHECK_FUNCS([memfd_create]) + +AC_CHECK_HEADERS(sys/mman.h) +AC_CHECK_FUNCS([mmap mkostemp]) +AC_FUNC_MMAP_BLACKLIST + +dnl The -no-testsuite modules omit the test subdir. +AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite) + +TARGETDIR="unknown" +HAVE_LONG_DOUBLE_VARIANT=0 + +. ${srcdir}/configure.host + +if test -n "${UNSUPPORTED}"; then + AC_MSG_ERROR(["libffi has not been ported to $host."]) +fi + +AC_SUBST(AM_RUNTESTFLAGS) +AC_SUBST(AM_LTLDFLAGS) + +AC_HEADER_STDC +AC_CHECK_FUNCS(memcpy) +AC_FUNC_ALLOCA + +AC_CHECK_SIZEOF(double) +AC_CHECK_SIZEOF(long double) + +# Also AC_SUBST this variable for ffi.h. +if test -z "$HAVE_LONG_DOUBLE"; then + HAVE_LONG_DOUBLE=0 + if test $ac_cv_sizeof_long_double != 0; then + if test $HAVE_LONG_DOUBLE_VARIANT != 0; then + AC_DEFINE(HAVE_LONG_DOUBLE_VARIANT, 1, [Define if you support more than one size of the long double type]) + HAVE_LONG_DOUBLE=1 + else + if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then + HAVE_LONG_DOUBLE=1 + AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the long double type and it is bigger than a double]) + fi + fi + fi +fi +AC_SUBST(HAVE_LONG_DOUBLE) +AC_SUBST(HAVE_LONG_DOUBLE_VARIANT) + +AC_C_BIGENDIAN + +GCC_AS_CFI_PSEUDO_OP + +case "$TARGET" in + SPARC) + AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs], + libffi_cv_as_sparc_ua_pcrel, [ + save_CFLAGS="$CFLAGS" + save_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS -fpic" + LDFLAGS="$LDFLAGS -shared" + AC_TRY_LINK([asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");],, + [libffi_cv_as_sparc_ua_pcrel=yes], + [libffi_cv_as_sparc_ua_pcrel=no]) + CFLAGS="$save_CFLAGS" + LDFLAGS="$save_LDFLAGS"]) + if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then + AC_DEFINE(HAVE_AS_SPARC_UA_PCREL, 1, + [Define if your assembler and linker support unaligned PC relative relocs.]) + fi + + AC_CACHE_CHECK([assembler .register pseudo-op support], + libffi_cv_as_register_pseudo_op, [ + libffi_cv_as_register_pseudo_op=unknown + # Check if we have .register + AC_TRY_COMPILE(,[asm (".register %g2, #scratch");], + [libffi_cv_as_register_pseudo_op=yes], + [libffi_cv_as_register_pseudo_op=no]) + ]) + if test "x$libffi_cv_as_register_pseudo_op" = xyes; then + AC_DEFINE(HAVE_AS_REGISTER_PSEUDO_OP, 1, + [Define if your assembler supports .register.]) + fi + ;; + + X86*) + AC_CACHE_CHECK([assembler supports pc related relocs], + libffi_cv_as_x86_pcrel, [ + libffi_cv_as_x86_pcrel=no + echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s + if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then + libffi_cv_as_x86_pcrel=yes + fi + ]) + if test "x$libffi_cv_as_x86_pcrel" = xyes; then + AC_DEFINE(HAVE_AS_X86_PCREL, 1, + [Define if your assembler supports PC relative relocs.]) + fi + ;; + + S390) + AC_CACHE_CHECK([compiler uses zarch features], + libffi_cv_as_s390_zarch, [ + libffi_cv_as_s390_zarch=no + echo 'void foo(void) { bar(); bar(); }' > conftest.c + if $CC $CFLAGS -S conftest.c > /dev/null 2>&1; then + if grep -q brasl conftest.s; then + libffi_cv_as_s390_zarch=yes + fi + fi + ]) + if test "x$libffi_cv_as_s390_zarch" = xyes; then + AC_DEFINE(HAVE_AS_S390_ZARCH, 1, + [Define if the compiler uses zarch features.]) + fi + ;; +esac + +AC_CACHE_CHECK([whether compiler supports pointer authentication], + libffi_cv_as_ptrauth, [ + libffi_cv_as_ptrauth=unknown + AC_TRY_COMPILE(,[ +#ifdef __clang__ +# if __has_feature(ptrauth_calls) +# define HAVE_PTRAUTH 1 +# endif +#endif + +#ifndef HAVE_PTRAUTH +# error Pointer authentication not supported +#endif + ], + [libffi_cv_as_ptrauth=yes], + [libffi_cv_as_ptrauth=no]) +]) +if test "x$libffi_cv_as_ptrauth" = xyes; then + AC_DEFINE(HAVE_PTRAUTH, 1, + [Define if your compiler supports pointer authentication.]) +fi + +# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. +AC_ARG_ENABLE(pax_emutramp, + [ --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC], + if test "$enable_pax_emutramp" = "yes"; then + AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1, + [Define this if you want to enable pax emulated trampolines]) + fi) + +LT_SYS_SYMBOL_USCORE +if test "x$sys_symbol_underscore" = xyes; then + AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.]) +fi + +FFI_EXEC_TRAMPOLINE_TABLE=0 +case "$target" in + *arm*-apple-* | aarch64-apple-*) + FFI_EXEC_TRAMPOLINE_TABLE=1 + AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1, + [Cannot use PROT_EXEC on this target, so, we revert to + alternative means]) + ;; + *-apple-* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris* | *-linux-android*) + AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, + [Cannot use malloc on this target, so, we revert to + alternative means]) + ;; +esac +AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1) +AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE) + +if test x$TARGET = xX86_64; then + AC_CACHE_CHECK([toolchain supports unwind section type], + libffi_cv_as_x86_64_unwind_section_type, [ + cat > conftest1.s << EOF +.text +.globl foo +foo: +jmp bar +.section .eh_frame,"a",@unwind +bar: +EOF + + cat > conftest2.c << EOF +extern void foo(); +int main(){foo();} +EOF + + libffi_cv_as_x86_64_unwind_section_type=no + # we ensure that we can compile _and_ link an assembly file containing an @unwind section + # since the compiler can support it and not the linker (ie old binutils) + if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \ + $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then + libffi_cv_as_x86_64_unwind_section_type=yes + fi + ]) + if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then + AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1, + [Define if your assembler supports unwind section type.]) + fi +fi + +if test "x$GCC" = "xyes"; then + AX_CHECK_COMPILE_FLAG(-fno-lto, libffi_cv_no_lto=-fno-lto) + + AC_CACHE_CHECK([whether .eh_frame section should be read-only], + libffi_cv_ro_eh_frame, [ + libffi_cv_ro_eh_frame=yes + echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c + if $CC $CFLAGS -c -fpic -fexceptions $libffi_cv_no_lto -o conftest.o conftest.c > /dev/null 2>&1; then + if readelf -WS conftest.o | grep -q -n 'eh_frame .* WA'; then + libffi_cv_ro_eh_frame=no + fi + fi + rm -f conftest.* + ]) + if test "x$libffi_cv_ro_eh_frame" = xyes; then + AC_DEFINE(HAVE_RO_EH_FRAME, 1, + [Define if .eh_frame sections should be read-only.]) + AC_DEFINE(EH_FRAME_FLAGS, "a", + [Define to the flags needed for the .section .eh_frame directive. ]) + else + AC_DEFINE(EH_FRAME_FLAGS, "aw", + [Define to the flags needed for the .section .eh_frame directive. ]) + fi + + AC_CACHE_CHECK([for __attribute__((visibility("hidden")))], + libffi_cv_hidden_visibility_attribute, [ + echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c + libffi_cv_hidden_visibility_attribute=no + if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then + if egrep '(\.hidden|\.private_extern).*foo' conftest.s >/dev/null; then + libffi_cv_hidden_visibility_attribute=yes + fi + fi + rm -f conftest.* + ]) + if test $libffi_cv_hidden_visibility_attribute = yes; then + AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1, + [Define if __attribute__((visibility("hidden"))) is supported.]) + fi +fi + +AC_ARG_ENABLE(docs, + AC_HELP_STRING([--disable-docs], + [Disable building of docs (default: no)]), + [enable_docs=no], + [enable_docs=yes]) +AM_CONDITIONAL(BUILD_DOCS, [test x$enable_docs = xyes]) + +AH_BOTTOM([ +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#ifdef __APPLE__ +#define FFI_HIDDEN(name) .private_extern name +#else +#define FFI_HIDDEN(name) .hidden name +#endif +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif +]) + +AC_SUBST(TARGET) +AC_SUBST(TARGETDIR) + +changequote(<,>) +TARGET_OBJ= +for i in $SOURCES; do + TARGET_OBJ="${TARGET_OBJ} src/${TARGETDIR}/"`echo $i | sed 's/[cS]$/lo/'` +done +changequote([,]) +AC_SUBST(TARGET_OBJ) + +AC_SUBST(SHELL) + +AC_ARG_ENABLE(debug, +[ --enable-debug debugging mode], + if test "$enable_debug" = "yes"; then + AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.]) + fi) +AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") + +AC_ARG_ENABLE(structs, +[ --disable-structs omit code for struct support], + if test "$enable_structs" = "no"; then + AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this if you do not want support for aggregate types.]) + fi) +AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") + +AC_ARG_ENABLE(raw-api, +[ --disable-raw-api make the raw api unavailable], + if test "$enable_raw_api" = "no"; then + AC_DEFINE(FFI_NO_RAW_API, 1, [Define this if you do not want support for the raw API.]) + fi) + +AC_ARG_ENABLE(purify-safety, +[ --enable-purify-safety purify-safe mode], + if test "$enable_purify_safety" = "yes"; then + AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.]) + fi) + +AC_ARG_ENABLE(multi-os-directory, +[ --disable-multi-os-directory + disable use of gcc --print-multi-os-directory to change the library installation directory]) + +# These variables are only ever used when we cross-build to X86_WIN32. +# And we only support this with GCC, so... +if test "x$GCC" = "xyes"; then + if test -n "$with_cross_host" && + test x"$with_cross_host" != x"no"; then + toolexecdir='${exec_prefix}'/'$(target_alias)' + toolexeclibdir='${toolexecdir}'/lib + else + toolexecdir='${libdir}'/gcc-lib/'$(target_alias)' + toolexeclibdir='${libdir}' + fi + if test x"$enable_multi_os_directory" != x"no"; then + multi_os_directory=`$CC $CFLAGS -print-multi-os-directory` + case $multi_os_directory in + .) ;; # Avoid trailing /. + ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; + esac + fi + AC_SUBST(toolexecdir) +else + toolexeclibdir='${libdir}' +fi +AC_SUBST(toolexeclibdir) + +# Check linker support. +LIBFFI_ENABLE_SYMVERS + +AC_CONFIG_COMMANDS(include, [test -d include || mkdir include]) +AC_CONFIG_COMMANDS(src, [ +test -d src || mkdir src +test -d src/$TARGETDIR || mkdir src/$TARGETDIR +], [TARGETDIR="$TARGETDIR"]) + +AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile doc/Makefile libffi.pc) + +AC_OUTPUT + +# Copy this file instead of using AC_CONFIG_LINK in order to support +# compiling with MSVC, which won't understand cygwin style symlinks. +cp ${srcdir}/src/$TARGETDIR/ffitarget.h include/ffitarget.h diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure.host b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure.host new file mode 100644 index 000000000000..257b7848725c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/configure.host @@ -0,0 +1,318 @@ +# configure.host +# +# This shell script handles all host based configuration for libffi. +# + +# THIS TABLE IS SORTED. KEEP IT THAT WAY. +# Most of the time we can define all the variables all at once... +case "${host}" in + aarch64*-*-cygwin* | aarch64*-*-mingw* | aarch64*-*-win* ) + TARGET=ARM_WIN64; TARGETDIR=aarch64 + if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then + MSVC=1 + fi + ;; + + aarch64*-*-*) + TARGET=AARCH64; TARGETDIR=aarch64 + SOURCES="ffi.c sysv.S" + ;; + + alpha*-*-*) + TARGET=ALPHA; TARGETDIR=alpha; + # Support 128-bit long double, changeable via command-line switch. + HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)' + SOURCES="ffi.c osf.S" + ;; + + arc*-*-*) + TARGET=ARC; TARGETDIR=arc + SOURCES="ffi.c arcompact.S" + ;; + + arm*-*-cygwin* | arm*-*-mingw* | arm*-*-win* ) + TARGET=ARM_WIN32; TARGETDIR=arm + MSVC=1 + ;; + + arm*-*-*) + TARGET=ARM; TARGETDIR=arm + SOURCES="ffi.c sysv.S" + ;; + + avr32*-*-*) + TARGET=AVR32; TARGETDIR=avr32 + SOURCES="ffi.c sysv.S" + ;; + + bfin*) + TARGET=BFIN; TARGETDIR=bfin + SOURCES="ffi.c sysv.S" + ;; + + cris-*-*) + TARGET=LIBFFI_CRIS; TARGETDIR=cris + SOURCES="ffi.c sysv.S" + ;; + + csky-*-*) + TARGET=CSKY; TARGETDIR=csky + SOURCES="ffi.c sysv.S" + ;; + + frv-*-*) + TARGET=FRV; TARGETDIR=frv + SOURCES="ffi.c eabi.S" + ;; + + hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*) + TARGET=PA_LINUX; TARGETDIR=pa + SOURCES="ffi.c linux.S" + ;; + hppa*64-*-hpux*) + TARGET=PA64_HPUX; TARGETDIR=pa + ;; + hppa*-*-hpux*) + TARGET=PA_HPUX; TARGETDIR=pa + SOURCES="ffi.c hpux32.S" + ;; + + i?86-*-freebsd* | i?86-*-openbsd*) + TARGET=X86_FREEBSD; TARGETDIR=x86 + ;; + + i?86-*-cygwin* | i?86-*-mingw* | i?86-*-win* | i?86-*-os2* | i?86-*-interix* \ + | x86_64-*-cygwin* | x86_64-*-mingw* | x86_64-*-win* ) + TARGETDIR=x86 + if test $ac_cv_sizeof_size_t = 4; then + TARGET=X86_WIN32 + else + TARGET=X86_WIN64 + fi + if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then + MSVC=1 + fi + # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. + # We must also check with_cross_host to decide if this is a native + # or cross-build and select where to install dlls appropriately. + if test -n "$with_cross_host" && + test x"$with_cross_host" != x"no"; then + AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; + else + AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; + fi + ;; + + i?86-*-darwin* | x86_64-*-darwin* | i?86-*-ios | x86_64-*-ios) + TARGETDIR=x86 + if test $ac_cv_sizeof_size_t = 4; then + TARGET=X86_DARWIN + else + TARGET=X86_64 + fi + ;; + + i?86-*-* | x86_64-*-* | amd64-*) + TARGETDIR=x86 + if test $ac_cv_sizeof_size_t = 4; then + echo 'int foo (void) { return __x86_64__; }' > conftest.c + if $CC $CFLAGS -Werror -S conftest.c -o conftest.s > /dev/null 2>&1; then + TARGET_X32=yes + TARGET=X86_64 + else + TARGET=X86; + fi + rm -f conftest.* + else + TARGET=X86_64; + fi + ;; + + ia64*-*-*) + TARGET=IA64; TARGETDIR=ia64 + SOURCES="ffi.c unix.S" + ;; + + kvx-*-*) + TARGET=KVX; TARGETDIR=kvx + SOURCES="ffi.c sysv.S" + ;; + + m32r*-*-*) + TARGET=M32R; TARGETDIR=m32r + SOURCES="ffi.c sysv.S" + ;; + + m68k-*-*) + TARGET=M68K; TARGETDIR=m68k + SOURCES="ffi.c sysv.S" + ;; + + m88k-*-*) + TARGET=M88K; TARGETDIR=m88k + SOURCES="ffi.c obsd.S" + ;; + + microblaze*-*-*) + TARGET=MICROBLAZE; TARGETDIR=microblaze + SOURCES="ffi.c sysv.S" + ;; + + moxie-*-*) + TARGET=MOXIE; TARGETDIR=moxie + SOURCES="ffi.c eabi.S" + ;; + + metag-*-*) + TARGET=METAG; TARGETDIR=metag + SOURCES="ffi.c sysv.S" + ;; + + mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*) + TARGET=MIPS; TARGETDIR=mips + ;; + mips*-*linux* | mips*-*-openbsd* | mips*-*-freebsd*) + # Support 128-bit long double for NewABI. + HAVE_LONG_DOUBLE='defined(__mips64)' + TARGET=MIPS; TARGETDIR=mips + ;; + + nios2*-linux*) + TARGET=NIOS2; TARGETDIR=nios2 + SOURCES="ffi.c sysv.S" + ;; + + or1k*-*-*) + TARGET=OR1K; TARGETDIR=or1k + SOURCES="ffi.c sysv.S" + ;; + + powerpc*-*-linux* | powerpc-*-sysv*) + TARGET=POWERPC; TARGETDIR=powerpc + HAVE_LONG_DOUBLE_VARIANT=1 + ;; + powerpc-*-amigaos*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc-*-eabi*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc-*-beos*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc-*-darwin* | powerpc64-*-darwin*) + TARGET=POWERPC_DARWIN; TARGETDIR=powerpc + ;; + powerpc-*-aix* | rs6000-*-aix*) + TARGET=POWERPC_AIX; TARGETDIR=powerpc + ;; + powerpc-*-freebsd* | powerpc-*-openbsd* | powerpc-*-netbsd*) + TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc + HAVE_LONG_DOUBLE_VARIANT=1 + ;; + powerpcspe-*-freebsd*) + TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc + CFLAGS="$CFLAGS -D__NO_FPRS__" + ;; + powerpc64-*-freebsd* | powerpc64le-*-freebsd*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + powerpc*-*-rtems*) + TARGET=POWERPC; TARGETDIR=powerpc + ;; + + riscv*-*) + TARGET=RISCV; TARGETDIR=riscv + SOURCES="ffi.c sysv.S" + ;; + + s390-*-* | s390x-*-*) + TARGET=S390; TARGETDIR=s390 + SOURCES="ffi.c sysv.S" + ;; + + sh-*-* | sh[34]*-*-*) + TARGET=SH; TARGETDIR=sh + SOURCES="ffi.c sysv.S" + ;; + sh64-*-* | sh5*-*-*) + TARGET=SH64; TARGETDIR=sh64 + SOURCES="ffi.c sysv.S" + ;; + + sparc*-*-*) + TARGET=SPARC; TARGETDIR=sparc + SOURCES="ffi.c ffi64.c v8.S v9.S" + ;; + + tile*-*) + TARGET=TILE; TARGETDIR=tile + SOURCES="ffi.c tile.S" + ;; + + vax-*-*) + TARGET=VAX; TARGETDIR=vax + SOURCES="ffi.c elfbsd.S" + ;; + + xtensa*-*) + TARGET=XTENSA; TARGETDIR=xtensa + SOURCES="ffi.c sysv.S" + ;; +esac + +# ... but some of the cases above share configury. +case "${TARGET}" in + ARM_WIN32) + SOURCES="ffi.c sysv_msvc_arm32.S" + ;; + ARM_WIN64) + if test "$MSVC" = 1; then + SOURCES="ffi.c win64_armasm.S" + else + SOURCES="ffi.c sysv.S" + fi + ;; + MIPS) + SOURCES="ffi.c o32.S n32.S" + ;; + POWERPC) + SOURCES="ffi.c ffi_sysv.c ffi_linux64.c sysv.S ppc_closure.S" + SOURCES="${SOURCES} linux64.S linux64_closure.S" + ;; + POWERPC_AIX) + SOURCES="ffi_darwin.c aix.S aix_closure.S" + ;; + POWERPC_DARWIN) + SOURCES="ffi_darwin.c darwin.S darwin_closure.S" + ;; + POWERPC_FREEBSD) + SOURCES="ffi.c ffi_sysv.c sysv.S ppc_closure.S" + ;; + X86 | X86_DARWIN | X86_FREEBSD | X86_WIN32) + if test "$MSVC" = 1; then + SOURCES="ffi.c sysv_intel.S" + else + SOURCES="ffi.c sysv.S" + fi + ;; + X86_64) + if test x"$TARGET_X32" = xyes; then + SOURCES="ffi64.c unix64.S" + else + SOURCES="ffi64.c unix64.S ffiw64.c win64.S" + fi + ;; + X86_WIN64) + if test "$MSVC" = 1; then + SOURCES="ffiw64.c win64_intel.S" + else + SOURCES="ffiw64.c win64.S" + fi + ;; +esac + +# If we failed to configure SOURCES, we can't do anything. +if test -z "${SOURCES}"; then + UNSUPPORTED=1 +fi diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc/Makefile.am b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc/Makefile.am new file mode 100644 index 000000000000..43b650aea7a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc/Makefile.am @@ -0,0 +1,3 @@ +## Process this with automake to create Makefile.in + +info_TEXINFOS = libffi.texi diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc/libffi.texi b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc/libffi.texi new file mode 100644 index 000000000000..bd305936c2dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc/libffi.texi @@ -0,0 +1,997 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename libffi.info +@include version.texi +@settitle libffi: the portable foreign function interface library +@setchapternewpage off +@c %**end of header + +@c Merge the standard indexes into a single one. +@syncodeindex fn cp +@syncodeindex vr cp +@syncodeindex ky cp +@syncodeindex pg cp +@syncodeindex tp cp + +@copying + +This manual is for libffi, a portable foreign function interface +library. + +Copyright @copyright{} 2008--2019 Anthony Green and Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +@end copying + +@dircategory Development +@direntry +* libffi: (libffi). Portable foreign function interface library. +@end direntry + +@titlepage +@title libffi: a foreign function interface library +@subtitle For Version @value{VERSION} of libffi +@author Anthony Green +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + + +@ifnottex +@node Top +@top libffi + +@insertcopying + +@menu +* Introduction:: What is libffi? +* Using libffi:: How to use libffi. +* Missing Features:: Things libffi can't do. +* Index:: Index. +@end menu + +@end ifnottex + + +@node Introduction +@chapter What is libffi? + +Compilers for high level languages generate code that follow certain +conventions. These conventions are necessary, in part, for separate +compilation to work. One such convention is the @dfn{calling +convention}. The calling convention is a set of assumptions made by +the compiler about where function arguments will be found on entry to +a function. A calling convention also specifies where the return +value for a function is found. The calling convention is also +sometimes called the @dfn{ABI} or @dfn{Application Binary Interface}. +@cindex calling convention +@cindex ABI +@cindex Application Binary Interface + +Some programs may not know at the time of compilation what arguments +are to be passed to a function. For instance, an interpreter may be +told at run-time about the number and types of arguments used to call +a given function. @samp{Libffi} can be used in such programs to +provide a bridge from the interpreter program to compiled code. + +The @samp{libffi} library provides a portable, high level programming +interface to various calling conventions. This allows a programmer to +call any function specified by a call interface description at run +time. + +@acronym{FFI} stands for Foreign Function Interface. A foreign +function interface is the popular name for the interface that allows +code written in one language to call code written in another language. +The @samp{libffi} library really only provides the lowest, machine +dependent layer of a fully featured foreign function interface. A +layer must exist above @samp{libffi} that handles type conversions for +values passed between the two languages. +@cindex FFI +@cindex Foreign Function Interface + + +@node Using libffi +@chapter Using libffi + +@menu +* The Basics:: The basic libffi API. +* Simple Example:: A simple example. +* Types:: libffi type descriptions. +* Multiple ABIs:: Different passing styles on one platform. +* The Closure API:: Writing a generic function. +* Closure Example:: A closure example. +* Thread Safety:: Thread safety. +@end menu + + +@node The Basics +@section The Basics + +@samp{Libffi} assumes that you have a pointer to the function you wish +to call and that you know the number and types of arguments to pass +it, as well as the return type of the function. + +The first thing you must do is create an @code{ffi_cif} object that +matches the signature of the function you wish to call. This is a +separate step because it is common to make multiple calls using a +single @code{ffi_cif}. The @dfn{cif} in @code{ffi_cif} stands for +Call InterFace. To prepare a call interface object, use the function +@code{ffi_prep_cif}. +@cindex cif + +@findex ffi_prep_cif +@defun ffi_status ffi_prep_cif (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes}) +This initializes @var{cif} according to the given parameters. + +@var{abi} is the ABI to use; normally @code{FFI_DEFAULT_ABI} is what +you want. @ref{Multiple ABIs} for more information. + +@var{nargs} is the number of arguments that this function accepts. + +@var{rtype} is a pointer to an @code{ffi_type} structure that +describes the return type of the function. @xref{Types}. + +@var{argtypes} is a vector of @code{ffi_type} pointers. +@var{argtypes} must have @var{nargs} elements. If @var{nargs} is 0, +this argument is ignored. + +@code{ffi_prep_cif} returns a @code{libffi} status code, of type +@code{ffi_status}. This will be either @code{FFI_OK} if everything +worked properly; @code{FFI_BAD_TYPEDEF} if one of the @code{ffi_type} +objects is incorrect; or @code{FFI_BAD_ABI} if the @var{abi} parameter +is invalid. +@end defun + +If the function being called is variadic (varargs) then +@code{ffi_prep_cif_var} must be used instead of @code{ffi_prep_cif}. + +@findex ffi_prep_cif_var +@defun ffi_status ffi_prep_cif_var (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nfixedargs}, unsigned int @var{ntotalargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes}) +This initializes @var{cif} according to the given parameters for +a call to a variadic function. In general its operation is the +same as for @code{ffi_prep_cif} except that: + +@var{nfixedargs} is the number of fixed arguments, prior to any +variadic arguments. It must be greater than zero. + +@var{ntotalargs} the total number of arguments, including variadic +and fixed arguments. @var{argtypes} must have this many elements. + +Note that, different cif's must be prepped for calls to the same +function when different numbers of arguments are passed. + +Also note that a call to @code{ffi_prep_cif_var} with +@var{nfixedargs}=@var{nototalargs} is NOT equivalent to a call to +@code{ffi_prep_cif}. + +@end defun + +Note that the resulting @code{ffi_cif} holds pointers to all the +@code{ffi_type} objects that were used during initialization. You +must ensure that these type objects have a lifetime at least as long +as that of the @code{ffi_cif}. + +To call a function using an initialized @code{ffi_cif}, use the +@code{ffi_call} function: + +@findex ffi_call +@defun void ffi_call (ffi_cif *@var{cif}, void *@var{fn}, void *@var{rvalue}, void **@var{avalues}) +This calls the function @var{fn} according to the description given in +@var{cif}. @var{cif} must have already been prepared using +@code{ffi_prep_cif}. + +@var{rvalue} is a pointer to a chunk of memory that will hold the +result of the function call. This must be large enough to hold the +result, no smaller than the system register size (generally 32 or 64 +bits), and must be suitably aligned; it is the caller's responsibility +to ensure this. If @var{cif} declares that the function returns +@code{void} (using @code{ffi_type_void}), then @var{rvalue} is +ignored. + +In most situations, @samp{libffi} will handle promotion according to +the ABI. However, for historical reasons, there is a special case +with return values that must be handled by your code. In particular, +for integral (not @code{struct}) types that are narrower than the +system register size, the return value will be widened by +@samp{libffi}. @samp{libffi} provides a type, @code{ffi_arg}, that +can be used as the return type. For example, if the CIF was defined +with a return type of @code{char}, @samp{libffi} will try to store a +full @code{ffi_arg} into the return value. + +@var{avalues} is a vector of @code{void *} pointers that point to the +memory locations holding the argument values for a call. If @var{cif} +declares that the function has no arguments (i.e., @var{nargs} was 0), +then @var{avalues} is ignored. Note that argument values may be +modified by the callee (for instance, structs passed by value); the +burden of copying pass-by-value arguments is placed on the caller. + +Note that while the return value must be register-sized, arguments +should exactly match their declared type. For example, if an argument +is a @code{short}, then the entry in @var{avalues} should point to an +object declared as @code{short}; but if the return type is +@code{short}, then @var{rvalue} should point to an object declared as +a larger type -- usually @code{ffi_arg}. +@end defun + + +@node Simple Example +@section Simple Example + +Here is a trivial example that calls @code{puts} a few times. + +@example +#include <stdio.h> +#include <ffi.h> + +int main() +@{ + ffi_cif cif; + ffi_type *args[1]; + void *values[1]; + char *s; + ffi_arg rc; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_pointer; + values[0] = &s; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_sint, args) == FFI_OK) + @{ + s = "Hello World!"; + ffi_call(&cif, puts, &rc, values); + /* rc now holds the result of the call to puts */ + + /* values holds a pointer to the function's arg, so to + call puts() again all we need to do is change the + value of s */ + s = "This is cool!"; + ffi_call(&cif, puts, &rc, values); + @} + + return 0; +@} +@end example + + +@node Types +@section Types + +@menu +* Primitive Types:: Built-in types. +* Structures:: Structure types. +* Size and Alignment:: Size and alignment of types. +* Arrays Unions Enums:: Arrays, unions, and enumerations. +* Type Example:: Structure type example. +* Complex:: Complex types. +* Complex Type Example:: Complex type example. +@end menu + +@node Primitive Types +@subsection Primitive Types + +@code{Libffi} provides a number of built-in type descriptors that can +be used to describe argument and return types: + +@table @code +@item ffi_type_void +@tindex ffi_type_void +The type @code{void}. This cannot be used for argument types, only +for return values. + +@item ffi_type_uint8 +@tindex ffi_type_uint8 +An unsigned, 8-bit integer type. + +@item ffi_type_sint8 +@tindex ffi_type_sint8 +A signed, 8-bit integer type. + +@item ffi_type_uint16 +@tindex ffi_type_uint16 +An unsigned, 16-bit integer type. + +@item ffi_type_sint16 +@tindex ffi_type_sint16 +A signed, 16-bit integer type. + +@item ffi_type_uint32 +@tindex ffi_type_uint32 +An unsigned, 32-bit integer type. + +@item ffi_type_sint32 +@tindex ffi_type_sint32 +A signed, 32-bit integer type. + +@item ffi_type_uint64 +@tindex ffi_type_uint64 +An unsigned, 64-bit integer type. + +@item ffi_type_sint64 +@tindex ffi_type_sint64 +A signed, 64-bit integer type. + +@item ffi_type_float +@tindex ffi_type_float +The C @code{float} type. + +@item ffi_type_double +@tindex ffi_type_double +The C @code{double} type. + +@item ffi_type_uchar +@tindex ffi_type_uchar +The C @code{unsigned char} type. + +@item ffi_type_schar +@tindex ffi_type_schar +The C @code{signed char} type. (Note that there is not an exact +equivalent to the C @code{char} type in @code{libffi}; ordinarily you +should either use @code{ffi_type_schar} or @code{ffi_type_uchar} +depending on whether @code{char} is signed.) + +@item ffi_type_ushort +@tindex ffi_type_ushort +The C @code{unsigned short} type. + +@item ffi_type_sshort +@tindex ffi_type_sshort +The C @code{short} type. + +@item ffi_type_uint +@tindex ffi_type_uint +The C @code{unsigned int} type. + +@item ffi_type_sint +@tindex ffi_type_sint +The C @code{int} type. + +@item ffi_type_ulong +@tindex ffi_type_ulong +The C @code{unsigned long} type. + +@item ffi_type_slong +@tindex ffi_type_slong +The C @code{long} type. + +@item ffi_type_longdouble +@tindex ffi_type_longdouble +On platforms that have a C @code{long double} type, this is defined. +On other platforms, it is not. + +@item ffi_type_pointer +@tindex ffi_type_pointer +A generic @code{void *} pointer. You should use this for all +pointers, regardless of their real type. + +@item ffi_type_complex_float +@tindex ffi_type_complex_float +The C @code{_Complex float} type. + +@item ffi_type_complex_double +@tindex ffi_type_complex_double +The C @code{_Complex double} type. + +@item ffi_type_complex_longdouble +@tindex ffi_type_complex_longdouble +The C @code{_Complex long double} type. +On platforms that have a C @code{long double} type, this is defined. +On other platforms, it is not. +@end table + +Each of these is of type @code{ffi_type}, so you must take the address +when passing to @code{ffi_prep_cif}. + + +@node Structures +@subsection Structures + +@samp{libffi} is perfectly happy passing structures back and forth. +You must first describe the structure to @samp{libffi} by creating a +new @code{ffi_type} object for it. + +@tindex ffi_type +@deftp {Data type} ffi_type +The @code{ffi_type} has the following members: +@table @code +@item size_t size +This is set by @code{libffi}; you should initialize it to zero. + +@item unsigned short alignment +This is set by @code{libffi}; you should initialize it to zero. + +@item unsigned short type +For a structure, this should be set to @code{FFI_TYPE_STRUCT}. + +@item ffi_type **elements +This is a @samp{NULL}-terminated array of pointers to @code{ffi_type} +objects. There is one element per field of the struct. + +Note that @samp{libffi} has no special support for bit-fields. You +must manage these manually. +@end table +@end deftp + +The @code{size} and @code{alignment} fields will be filled in by +@code{ffi_prep_cif} or @code{ffi_prep_cif_var}, as needed. + +@node Size and Alignment +@subsection Size and Alignment + +@code{libffi} will set the @code{size} and @code{alignment} fields of +an @code{ffi_type} object for you. It does so using its knowledge of +the ABI. + +You might expect that you can simply read these fields for a type that +has been laid out by @code{libffi}. However, there are some caveats. + +@itemize @bullet +@item +The size or alignment of some of the built-in types may vary depending +on the chosen ABI. + +@item +The size and alignment of a new structure type will not be set by +@code{libffi} until it has been passed to @code{ffi_prep_cif} or +@code{ffi_get_struct_offsets}. + +@item +A structure type cannot be shared across ABIs. Instead each ABI needs +its own copy of the structure type. +@end itemize + +So, before examining these fields, it is safest to pass the +@code{ffi_type} object to @code{ffi_prep_cif} or +@code{ffi_get_struct_offsets} first. This function will do all the +needed setup. + +@example +ffi_type *desired_type; +ffi_abi desired_abi; +@dots{} +ffi_cif cif; +if (ffi_prep_cif (&cif, desired_abi, 0, desired_type, NULL) == FFI_OK) + @{ + size_t size = desired_type->size; + unsigned short alignment = desired_type->alignment; + @} +@end example + +@code{libffi} also provides a way to get the offsets of the members of +a structure. + +@findex ffi_get_struct_offsets +@defun ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets) +Compute the offset of each element of the given structure type. +@var{abi} is the ABI to use; this is needed because in some cases the +layout depends on the ABI. + +@var{offsets} is an out parameter. The caller is responsible for +providing enough space for all the results to be written -- one +element per element type in @var{struct_type}. If @var{offsets} is +@code{NULL}, then the type will be laid out but not otherwise +modified. This can be useful for accessing the type's size or layout, +as mentioned above. + +This function returns @code{FFI_OK} on success; @code{FFI_BAD_ABI} if +@var{abi} is invalid; or @code{FFI_BAD_TYPEDEF} if @var{struct_type} +is invalid in some way. Note that only @code{FFI_STRUCT} types are +valid here. +@end defun + +@node Arrays Unions Enums +@subsection Arrays, Unions, and Enumerations + +@subsubsection Arrays + +@samp{libffi} does not have direct support for arrays or unions. +However, they can be emulated using structures. + +To emulate an array, simply create an @code{ffi_type} using +@code{FFI_TYPE_STRUCT} with as many members as there are elements in +the array. + +@example +ffi_type array_type; +ffi_type **elements +int i; + +elements = malloc ((n + 1) * sizeof (ffi_type *)); +for (i = 0; i < n; ++i) + elements[i] = array_element_type; +elements[n] = NULL; + +array_type.size = array_type.alignment = 0; +array_type.type = FFI_TYPE_STRUCT; +array_type.elements = elements; +@end example + +Note that arrays cannot be passed or returned by value in C -- +structure types created like this should only be used to refer to +members of real @code{FFI_TYPE_STRUCT} objects. + +However, a phony array type like this will not cause any errors from +@samp{libffi} if you use it as an argument or return type. This may +be confusing. + +@subsubsection Unions + +A union can also be emulated using @code{FFI_TYPE_STRUCT}. In this +case, however, you must make sure that the size and alignment match +the real requirements of the union. + +One simple way to do this is to ensue that each element type is laid +out. Then, give the new structure type a single element; the size of +the largest element; and the largest alignment seen as well. + +This example uses the @code{ffi_prep_cif} trick to ensure that each +element type is laid out. + +@example +ffi_abi desired_abi; +ffi_type union_type; +ffi_type **union_elements; + +int i; +ffi_type element_types[2]; + +element_types[1] = NULL; + +union_type.size = union_type.alignment = 0; +union_type.type = FFI_TYPE_STRUCT; +union_type.elements = element_types; + +for (i = 0; union_elements[i]; ++i) + @{ + ffi_cif cif; + if (ffi_prep_cif (&cif, desired_abi, 0, union_elements[i], NULL) == FFI_OK) + @{ + if (union_elements[i]->size > union_type.size) + @{ + union_type.size = union_elements[i]; + size = union_elements[i]->size; + @} + if (union_elements[i]->alignment > union_type.alignment) + union_type.alignment = union_elements[i]->alignment; + @} + @} +@end example + +@subsubsection Enumerations + +@code{libffi} does not have any special support for C @code{enum}s. +Although any given @code{enum} is implemented using a specific +underlying integral type, exactly which type will be used cannot be +determined by @code{libffi} -- it may depend on the values in the +enumeration or on compiler flags such as @option{-fshort-enums}. +@xref{Structures unions enumerations and bit-fields implementation, , , gcc}, +for more information about how GCC handles enumerations. + +@node Type Example +@subsection Type Example + +The following example initializes a @code{ffi_type} object +representing the @code{tm} struct from Linux's @file{time.h}. + +Here is how the struct is defined: + +@example +struct tm @{ + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + /* Those are for future use. */ + long int __tm_gmtoff__; + __const char *__tm_zone__; +@}; +@end example + +Here is the corresponding code to describe this struct to +@code{libffi}: + +@example + @{ + ffi_type tm_type; + ffi_type *tm_type_elements[12]; + int i; + + tm_type.size = tm_type.alignment = 0; + tm_type.type = FFI_TYPE_STRUCT; + tm_type.elements = &tm_type_elements; + + for (i = 0; i < 9; i++) + tm_type_elements[i] = &ffi_type_sint; + + tm_type_elements[9] = &ffi_type_slong; + tm_type_elements[10] = &ffi_type_pointer; + tm_type_elements[11] = NULL; + + /* tm_type can now be used to represent tm argument types and + return types for ffi_prep_cif() */ + @} +@end example + +@node Complex +@subsection Complex Types + +@samp{libffi} supports the complex types defined by the C99 +standard (@code{_Complex float}, @code{_Complex double} and +@code{_Complex long double} with the built-in type descriptors +@code{ffi_type_complex_float}, @code{ffi_type_complex_double} and +@code{ffi_type_complex_longdouble}. + +Custom complex types like @code{_Complex int} can also be used. +An @code{ffi_type} object has to be defined to describe the +complex type to @samp{libffi}. + +@tindex ffi_type +@deftp {Data type} ffi_type +@table @code +@item size_t size +This must be manually set to the size of the complex type. + +@item unsigned short alignment +This must be manually set to the alignment of the complex type. + +@item unsigned short type +For a complex type, this must be set to @code{FFI_TYPE_COMPLEX}. + +@item ffi_type **elements + +This is a @samp{NULL}-terminated array of pointers to +@code{ffi_type} objects. The first element is set to the +@code{ffi_type} of the complex's base type. The second element +must be set to @code{NULL}. +@end table +@end deftp + +The section @ref{Complex Type Example} shows a way to determine +the @code{size} and @code{alignment} members in a platform +independent way. + +For platforms that have no complex support in @code{libffi} yet, +the functions @code{ffi_prep_cif} and @code{ffi_prep_args} abort +the program if they encounter a complex type. + +@node Complex Type Example +@subsection Complex Type Example + +This example demonstrates how to use complex types: + +@example +#include <stdio.h> +#include <ffi.h> +#include <complex.h> + +void complex_fn(_Complex float cf, + _Complex double cd, + _Complex long double cld) +@{ + printf("cf=%f+%fi\ncd=%f+%fi\ncld=%f+%fi\n", + (float)creal (cf), (float)cimag (cf), + (float)creal (cd), (float)cimag (cd), + (float)creal (cld), (float)cimag (cld)); +@} + +int main() +@{ + ffi_cif cif; + ffi_type *args[3]; + void *values[3]; + _Complex float cf; + _Complex double cd; + _Complex long double cld; + + /* Initialize the argument info vectors */ + args[0] = &ffi_type_complex_float; + args[1] = &ffi_type_complex_double; + args[2] = &ffi_type_complex_longdouble; + values[0] = &cf; + values[1] = &cd; + values[2] = &cld; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_void, args) == FFI_OK) + @{ + cf = 1.0 + 20.0 * I; + cd = 300.0 + 4000.0 * I; + cld = 50000.0 + 600000.0 * I; + /* Call the function */ + ffi_call(&cif, (void (*)(void))complex_fn, 0, values); + @} + + return 0; +@} +@end example + +This is an example for defining a custom complex type descriptor +for compilers that support them: + +@example +/* + * This macro can be used to define new complex type descriptors + * in a platform independent way. + * + * name: Name of the new descriptor is ffi_type_complex_<name>. + * type: The C base type of the complex type. + */ +#define FFI_COMPLEX_TYPEDEF(name, type, ffitype) \ + static ffi_type *ffi_elements_complex_##name [2] = @{ \ + (ffi_type *)(&ffitype), NULL \ + @}; \ + struct struct_align_complex_##name @{ \ + char c; \ + _Complex type x; \ + @}; \ + ffi_type ffi_type_complex_##name = @{ \ + sizeof(_Complex type), \ + offsetof(struct struct_align_complex_##name, x), \ + FFI_TYPE_COMPLEX, \ + (ffi_type **)ffi_elements_complex_##name \ + @} + +/* Define new complex type descriptors using the macro: */ +/* ffi_type_complex_sint */ +FFI_COMPLEX_TYPEDEF(sint, int, ffi_type_sint); +/* ffi_type_complex_uchar */ +FFI_COMPLEX_TYPEDEF(uchar, unsigned char, ffi_type_uint8); +@end example + +The new type descriptors can then be used like one of the built-in +type descriptors in the previous example. + +@node Multiple ABIs +@section Multiple ABIs + +A given platform may provide multiple different ABIs at once. For +instance, the x86 platform has both @samp{stdcall} and @samp{fastcall} +functions. + +@code{libffi} provides some support for this. However, this is +necessarily platform-specific. + +@c FIXME: document the platforms + +@node The Closure API +@section The Closure API + +@code{libffi} also provides a way to write a generic function -- a +function that can accept and decode any combination of arguments. +This can be useful when writing an interpreter, or to provide wrappers +for arbitrary functions. + +This facility is called the @dfn{closure API}. Closures are not +supported on all platforms; you can check the @code{FFI_CLOSURES} +define to determine whether they are supported on the current +platform. +@cindex closures +@cindex closure API +@findex FFI_CLOSURES + +Because closures work by assembling a tiny function at runtime, they +require special allocation on platforms that have a non-executable +heap. Memory management for closures is handled by a pair of +functions: + +@findex ffi_closure_alloc +@defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code}) +Allocate a chunk of memory holding @var{size} bytes. This returns a +pointer to the writable address, and sets *@var{code} to the +corresponding executable address. + +@var{size} should be sufficient to hold a @code{ffi_closure} object. +@end defun + +@findex ffi_closure_free +@defun void ffi_closure_free (void *@var{writable}) +Free memory allocated using @code{ffi_closure_alloc}. The argument is +the writable address that was returned. +@end defun + + +Once you have allocated the memory for a closure, you must construct a +@code{ffi_cif} describing the function call. Finally you can prepare +the closure function: + +@findex ffi_prep_closure_loc +@defun ffi_status ffi_prep_closure_loc (ffi_closure *@var{closure}, ffi_cif *@var{cif}, void (*@var{fun}) (ffi_cif *@var{cif}, void *@var{ret}, void **@var{args}, void *@var{user_data}), void *@var{user_data}, void *@var{codeloc}) +Prepare a closure function. The arguments to +@code{ffi_prep_closure_loc} are: + +@table @var +@item closure +The address of a @code{ffi_closure} object; this is the writable +address returned by @code{ffi_closure_alloc}. + +@item cif +The @code{ffi_cif} describing the function parameters. Note that this +object, and the types to which it refers, must be kept alive until the +closure itself is freed. + +@item user_data +An arbitrary datum that is passed, uninterpreted, to your closure +function. + +@item codeloc +The executable address returned by @code{ffi_closure_alloc}. + +@item fun +The function which will be called when the closure is invoked. It is +called with the arguments: + +@table @var +@item cif +The @code{ffi_cif} passed to @code{ffi_prep_closure_loc}. + +@item ret +A pointer to the memory used for the function's return value. + +If the function is declared as returning @code{void}, then this value +is garbage and should not be used. + +Otherwise, @var{fun} must fill the object to which this points, +following the same special promotion behavior as @code{ffi_call}. +That is, in most cases, @var{ret} points to an object of exactly the +size of the type specified when @var{cif} was constructed. However, +integral types narrower than the system register size are widened. In +these cases your program may assume that @var{ret} points to an +@code{ffi_arg} object. + +@item args +A vector of pointers to memory holding the arguments to the function. + +@item user_data +The same @var{user_data} that was passed to +@code{ffi_prep_closure_loc}. +@end table +@end table + +@code{ffi_prep_closure_loc} will return @code{FFI_OK} if everything +went ok, and one of the other @code{ffi_status} values on error. + +After calling @code{ffi_prep_closure_loc}, you can cast @var{codeloc} +to the appropriate pointer-to-function type. +@end defun + +You may see old code referring to @code{ffi_prep_closure}. This +function is deprecated, as it cannot handle the need for separate +writable and executable addresses. + +@node Closure Example +@section Closure Example + +A trivial example that creates a new @code{puts} by binding +@code{fputs} with @code{stdout}. + +@example +#include <stdio.h> +#include <ffi.h> + +/* Acts like puts with the file given at time of enclosure. */ +void puts_binding(ffi_cif *cif, void *ret, void* args[], + void *stream) +@{ + *(ffi_arg *)ret = fputs(*(char **)args[0], (FILE *)stream); +@} + +typedef int (*puts_t)(char *); + +int main() +@{ + ffi_cif cif; + ffi_type *args[1]; + ffi_closure *closure; + + void *bound_puts; + int rc; + + /* Allocate closure and bound_puts */ + closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts); + + if (closure) + @{ + /* Initialize the argument info vectors */ + args[0] = &ffi_type_pointer; + + /* Initialize the cif */ + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_sint, args) == FFI_OK) + @{ + /* Initialize the closure, setting stream to stdout */ + if (ffi_prep_closure_loc(closure, &cif, puts_binding, + stdout, bound_puts) == FFI_OK) + @{ + rc = ((puts_t)bound_puts)("Hello World!"); + /* rc now holds the result of the call to fputs */ + @} + @} + @} + + /* Deallocate both closure, and bound_puts */ + ffi_closure_free(closure); + + return 0; +@} + +@end example + +@node Thread Safety +@section Thread Safety + +@code{libffi} is not completely thread-safe. However, many parts are, +and if you follow some simple rules, you can use it safely in a +multi-threaded program. + +@itemize @bullet +@item +@code{ffi_prep_cif} may modify the @code{ffi_type} objects passed to +it. It is best to ensure that only a single thread prepares a given +@code{ffi_cif} at a time. + +@item +On some platforms, @code{ffi_prep_cif} may modify the size and +alignment of some types, depending on the chosen ABI. On these +platforms, if you switch between ABIs, you must ensure that there is +only one call to @code{ffi_prep_cif} at a time. + +Currently the only affected platform is PowerPC and the only affected +type is @code{long double}. +@end itemize + +@node Missing Features +@chapter Missing Features + +@code{libffi} is missing a few features. We welcome patches to add +support for these. + +@itemize @bullet +@item +Variadic closures. + +@item +There is no support for bit fields in structures. + +@item +The ``raw'' API is undocumented. +@c anything else? + +@item +The Go API is undocumented. +@end itemize + +Note that variadic support is very new and tested on a relatively +small number of platforms. + +@node Index +@unnumbered Index + +@printindex cp + +@bye diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc/version.texi b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc/version.texi new file mode 100644 index 000000000000..d9d509492c08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/doc/version.texi @@ -0,0 +1,4 @@ +@set UPDATED 22 November 2019 +@set UPDATED-MONTH November 2019 +@set EDITION 3.3 +@set VERSION 3.3 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/generate-darwin-source-and-headers.py b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/generate-darwin-source-and-headers.py new file mode 100644 index 000000000000..516464f524f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/generate-darwin-source-and-headers.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python +import subprocess +import os +import errno +import collections +import glob +import argparse + +class Platform(object): + pass + +class simulator_platform(Platform): + directory = 'darwin_ios' + sdk = 'iphonesimulator' + arch = 'i386' + triple = 'i386-apple-darwin11' + version_min = '-miphoneos-version-min=7.0' + + prefix = "#ifdef __i386__\n\n" + suffix = "\n\n#endif" + src_dir = 'x86' + src_files = ['sysv.S', 'ffi.c', 'internal.h'] + + +class simulator64_platform(Platform): + directory = 'darwin_ios' + sdk = 'iphonesimulator' + arch = 'x86_64' + triple = 'x86_64-apple-darwin13' + version_min = '-miphoneos-version-min=7.0' + + prefix = "#ifdef __x86_64__\n\n" + suffix = "\n\n#endif" + src_dir = 'x86' + src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h'] + + +class device_platform(Platform): + directory = 'darwin_ios' + sdk = 'iphoneos' + arch = 'armv7' + triple = 'arm-apple-darwin11' + version_min = '-miphoneos-version-min=7.0' + + prefix = "#ifdef __arm__\n\n" + suffix = "\n\n#endif" + src_dir = 'arm' + src_files = ['sysv.S', 'ffi.c', 'internal.h'] + + +class device64_platform(Platform): + directory = 'darwin_ios' + sdk = 'iphoneos' + arch = 'arm64' + triple = 'aarch64-apple-darwin13' + version_min = '-miphoneos-version-min=7.0' + + prefix = "#ifdef __arm64__\n\n" + suffix = "\n\n#endif" + src_dir = 'aarch64' + src_files = ['sysv.S', 'ffi.c', 'internal.h'] + + +class desktop32_platform(Platform): + directory = 'darwin_osx' + sdk = 'macosx' + arch = 'i386' + triple = 'i386-apple-darwin10' + version_min = '-mmacosx-version-min=10.6' + src_dir = 'x86' + src_files = ['sysv.S', 'ffi.c', 'internal.h'] + + prefix = "#ifdef __i386__\n\n" + suffix = "\n\n#endif" + + +class desktop64_platform(Platform): + directory = 'darwin_osx' + sdk = 'macosx' + arch = 'x86_64' + triple = 'x86_64-apple-darwin10' + version_min = '-mmacosx-version-min=10.6' + + prefix = "#ifdef __x86_64__\n\n" + suffix = "\n\n#endif" + src_dir = 'x86' + src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h'] + + +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno != errno.EEXIST: + raise + + +def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''): + mkdir_p(dst_dir) + out_filename = filename + + if file_suffix: + if filename in ['internal64.h', 'asmnames.h', 'internal.h']: + out_filename = filename + else: + split_name = os.path.splitext(filename) + out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1]) + + with open(os.path.join(src_dir, filename)) as in_file: + with open(os.path.join(dst_dir, out_filename), 'w') as out_file: + if prefix: + out_file.write(prefix) + + out_file.write(in_file.read()) + + if suffix: + out_file.write(suffix) + + +def list_files(src_dir, pattern=None, filelist=None): + if pattern: filelist = glob.iglob(os.path.join(src_dir, pattern)) + for file in filelist: + yield os.path.basename(file) + + +def copy_files(src_dir, dst_dir, pattern=None, filelist=None, file_suffix=None, prefix=None, suffix=None): + for filename in list_files(src_dir, pattern=pattern, filelist=filelist): + move_file(src_dir, dst_dir, filename, file_suffix=file_suffix, prefix=prefix, suffix=suffix) + + +def copy_src_platform_files(platform): + src_dir = os.path.join('src', platform.src_dir) + dst_dir = os.path.join(platform.directory, 'src', platform.src_dir) + copy_files(src_dir, dst_dir, filelist=platform.src_files, file_suffix=platform.arch, prefix=platform.prefix, suffix=platform.suffix) + + +def build_target(platform, platform_headers): + def xcrun_cmd(cmd): + return 'xcrun -sdk %s %s -arch %s' % (platform.sdk, cmd, platform.arch) + + tag='%s-%s' % (platform.sdk, platform.arch) + build_dir = 'build_%s' % tag + mkdir_p(build_dir) + env = dict(CC=xcrun_cmd('clang'), + LD=xcrun_cmd('ld'), + CFLAGS='%s -fembed-bitcode' % (platform.version_min)) + working_dir = os.getcwd() + try: + os.chdir(build_dir) + subprocess.check_call(['../configure', '-host', platform.triple], env=env) + finally: + os.chdir(working_dir) + + for src_dir in [build_dir, os.path.join(build_dir, 'include')]: + copy_files(src_dir, + os.path.join(platform.directory, 'include'), + pattern='*.h', + file_suffix=platform.arch, + prefix=platform.prefix, + suffix=platform.suffix) + + for filename in list_files(src_dir, pattern='*.h'): + platform_headers[filename].add((platform.prefix, platform.arch, platform.suffix)) + + +def generate_source_and_headers(generate_osx=True, generate_ios=True): + copy_files('src', 'darwin_common/src', pattern='*.c') + copy_files('include', 'darwin_common/include', pattern='*.h') + + if generate_ios: + copy_src_platform_files(simulator_platform) + copy_src_platform_files(simulator64_platform) + copy_src_platform_files(device_platform) + copy_src_platform_files(device64_platform) + if generate_osx: + copy_src_platform_files(desktop64_platform) + + platform_headers = collections.defaultdict(set) + + if generate_ios: + build_target(simulator_platform, platform_headers) + build_target(simulator64_platform, platform_headers) + build_target(device_platform, platform_headers) + build_target(device64_platform, platform_headers) + if generate_osx: + build_target(desktop64_platform, platform_headers) + + mkdir_p('darwin_common/include') + for header_name, tag_tuples in platform_headers.items(): + basename, suffix = os.path.splitext(header_name) + with open(os.path.join('darwin_common/include', header_name), 'w') as header: + for tag_tuple in tag_tuples: + header.write('%s#include <%s_%s%s>\n%s\n' % (tag_tuple[0], basename, tag_tuple[1], suffix, tag_tuple[2])) + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--only-ios', action='store_true', default=False) + parser.add_argument('--only-osx', action='store_true', default=False) + args = parser.parse_args() + + generate_source_and_headers(generate_osx=not args.only_ios, generate_ios=not args.only_osx) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/Makefile.am b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/Makefile.am new file mode 100644 index 000000000000..c59df9fb3cd3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/Makefile.am @@ -0,0 +1,9 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS=foreign + +DISTCLEANFILES=ffitarget.h +noinst_HEADERS=ffi_common.h ffi_cfi.h +EXTRA_DIST=ffi.h.in + +nodist_include_HEADERS = ffi.h ffitarget.h diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/ffi.h.in b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/ffi.h.in new file mode 100644 index 000000000000..38885b0ab857 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/ffi.h.in @@ -0,0 +1,523 @@ +/* -----------------------------------------------------------------*-C-*- + libffi @VERSION@ - Copyright (c) 2011, 2014, 2019 Anthony Green + - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the ``Software''), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + Most of the API is documented in doc/libffi.texi. + + The raw API is designed to bypass some of the argument packing and + unpacking on architectures for which it can be avoided. Routines + are provided to emulate the raw API if the underlying platform + doesn't allow faster implementation. + + More details on the raw API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifndef @TARGET@ +#define @TARGET@ +#endif + +/* ---- System configuration information --------------------------------- */ + +#include <ffitarget.h> + +#ifndef LIBFFI_ASM + +#if defined(_MSC_VER) && !defined(__clang__) +#define __attribute__(X) +#endif + +#include <stddef.h> +#include <limits.h> + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ + +#define FFI_64_BIT_MAX 9223372036854775807 + +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif /* _AIX52 or newer */ +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ +# ifndef __PPC64__ +# if defined (__IBMC__) || defined (__IBMCPP__) +# define FFI_LONG_LONG_MAX LONGLONG_MAX +# endif +# endif /* __PPC64__ */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif +# endif +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type +{ + size_t size; + unsigned short alignment; + unsigned short type; + struct _ffi_type **elements; +} ffi_type; + +/* Need minimal decorations for DLLs to work on Windows. GCC has + autoimport and autoexport. Always mark externally visible symbols + as dllimport for MSVC clients, even if it means an extra indirection + when using the static version of the library. + Besides, as a workaround, they can define FFI_BUILDING if they + *know* they are going to link with the static library. */ +#if defined _MSC_VER +# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ +# define FFI_API __declspec(dllexport) +# elif !defined FFI_BUILDING /* Importing libffi.DLL */ +# define FFI_API __declspec(dllimport) +# else /* Building/linking static library */ +# define FFI_API +# endif +#else +# define FFI_API +#endif + +/* The externally visible type declarations also need the MSVC DLL + decorations, or they will not be exported from the object file. */ +#if defined LIBFFI_HIDE_BASIC_TYPES +# define FFI_EXTERN FFI_API +#else +# define FFI_EXTERN extern FFI_API +#endif + +#ifndef LIBFFI_HIDE_BASIC_TYPES +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else + #error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else + #error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else + #error "int size not supported" +#endif + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX + #error "no 64-bit data type supported" +# endif +#elif LONG_MAX != FFI_64_BIT_MAX + #error "long size not supported" +#endif + +#if LONG_MAX == 2147483647 +# define ffi_type_ulong ffi_type_uint32 +# define ffi_type_slong ffi_type_sint32 +#elif LONG_MAX == FFI_64_BIT_MAX +# define ffi_type_ulong ffi_type_uint64 +# define ffi_type_slong ffi_type_sint64 +#else + #error "long size not supported" +#endif + +/* These are defined in types.c. */ +FFI_EXTERN ffi_type ffi_type_void; +FFI_EXTERN ffi_type ffi_type_uint8; +FFI_EXTERN ffi_type ffi_type_sint8; +FFI_EXTERN ffi_type ffi_type_uint16; +FFI_EXTERN ffi_type ffi_type_sint16; +FFI_EXTERN ffi_type ffi_type_uint32; +FFI_EXTERN ffi_type ffi_type_sint32; +FFI_EXTERN ffi_type ffi_type_uint64; +FFI_EXTERN ffi_type ffi_type_sint64; +FFI_EXTERN ffi_type ffi_type_float; +FFI_EXTERN ffi_type ffi_type_double; +FFI_EXTERN ffi_type ffi_type_pointer; + +#if @HAVE_LONG_DOUBLE@ +FFI_EXTERN ffi_type ffi_type_longdouble; +#else +#define ffi_type_longdouble ffi_type_double +#endif + +#ifdef FFI_TARGET_HAS_COMPLEX_TYPE +FFI_EXTERN ffi_type ffi_type_complex_float; +FFI_EXTERN ffi_type ffi_type_complex_double; +#if @HAVE_LONG_DOUBLE@ +FFI_EXTERN ffi_type ffi_type_complex_longdouble; +#else +#define ffi_type_complex_longdouble ffi_type_complex_double +#endif +#endif +#endif /* LIBFFI_HIDE_BASIC_TYPES */ + +typedef enum { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef struct { + ffi_abi abi; + unsigned nargs; + ffi_type **arg_types; + ffi_type *rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == FFI_64_BIT_MAX +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +#ifndef FFI_SIZEOF_JAVA_RAW +# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 +/* This is a special case for mips64/n32 ABI (and perhaps others) where + sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ +typedef union { + signed int sint; + unsigned int uint; + float flt; + char data[FFI_SIZEOF_JAVA_RAW]; + void* ptr; +} ffi_java_raw; +#else +typedef ffi_raw ffi_java_raw; +#endif + + +FFI_API +void ffi_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_raw *avalue); + +FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +FFI_API size_t ffi_raw_size (ffi_cif *cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines longs + and doubles are followed by an empty 64-bit word. */ + +#if !FFI_NATIVE_RAW_API +FFI_API +void ffi_java_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_java_raw *avalue) __attribute__((deprecated)); +#endif + +FFI_API +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) __attribute__((deprecated)); +FFI_API +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) __attribute__((deprecated)); +FFI_API +size_t ffi_java_raw_size (ffi_cif *cif) __attribute__((deprecated)); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +#ifdef _MSC_VER +__declspec(align(8)) +#endif +typedef struct { +#if @FFI_EXEC_TRAMPOLINE_TABLE@ + void *trampoline_table; + void *trampoline_table_entry; +#else + char tramp[FFI_TRAMPOLINE_SIZE]; +#endif + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; +} ffi_closure +#ifdef __GNUC__ + __attribute__((aligned (8))) +#endif + ; + +#ifndef __GNUC__ +# ifdef __sgi +# pragma pack 0 +# endif +#endif + +FFI_API void *ffi_closure_alloc (size_t size, void **code); +FFI_API void ffi_closure_free (void *); + +#if defined(PA_LINUX) || defined(PA_HPUX) +#define FFI_CLOSURE_PTR(X) ((void *)((unsigned int)(X) | 2)) +#define FFI_RESTORE_PTR(X) ((void *)((unsigned int)(X) & ~3)) +#else +#define FFI_CLOSURE_PTR(X) (X) +#define FFI_RESTORE_PTR(X) (X) +#endif + +FFI_API ffi_status +ffi_prep_closure (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) + __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) +#elif defined(__GNUC__) && __GNUC__ >= 3 + __attribute__((deprecated)) +#endif + ; + +FFI_API ffi_status +ffi_prep_closure_loc (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void*codeloc); + +#ifdef __sgi +# pragma pack 8 +#endif +typedef struct { +#if @FFI_EXEC_TRAMPOLINE_TABLE@ + void *trampoline_table; + void *trampoline_table_entry; +#else + char tramp[FFI_TRAMPOLINE_SIZE]; +#endif + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* If this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + +} ffi_raw_closure; + +typedef struct { +#if @FFI_EXEC_TRAMPOLINE_TABLE@ + void *trampoline_table; + void *trampoline_table_entry; +#else + char tramp[FFI_TRAMPOLINE_SIZE]; +#endif + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* If this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the translation, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); + void *user_data; + +} ffi_java_raw_closure; + +FFI_API ffi_status +ffi_prep_raw_closure (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data); + +FFI_API ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc); + +#if !FFI_NATIVE_RAW_API +FFI_API ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data) __attribute__((deprecated)); + +FFI_API ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc) __attribute__((deprecated)); +#endif + +#endif /* FFI_CLOSURES */ + +#if FFI_GO_CLOSURES + +typedef struct { + void *tramp; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); +} ffi_go_closure; + +FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*)); + +FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure); + +#endif /* FFI_GO_CLOSURES */ + +/* ---- Public interface definition -------------------------------------- */ + +FFI_API +ffi_status ffi_prep_cif(ffi_cif *cif, + ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, + ffi_type **atypes); + +FFI_API +ffi_status ffi_prep_cif_var(ffi_cif *cif, + ffi_abi abi, + unsigned int nfixedargs, + unsigned int ntotalargs, + ffi_type *rtype, + ffi_type **atypes); + +FFI_API +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue); + +FFI_API +ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, + size_t *offsets); + +/* Useful for eliminating compiler warnings. */ +#define FFI_FN(f) ((void (*)(void))f) + +/* ---- Definitions shared with assembly code ---------------------------- */ + +#endif + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 +#if @HAVE_LONG_DOUBLE@ +#define FFI_TYPE_LONGDOUBLE 4 +#else +#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 +#define FFI_TYPE_COMPLEX 15 + +/* This should always refer to the last type code (for sanity checks). */ +#define FFI_TYPE_LAST FFI_TYPE_COMPLEX + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/ffi_cfi.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/ffi_cfi.h new file mode 100644 index 000000000000..244ce572be74 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/ffi_cfi.h @@ -0,0 +1,55 @@ +/* ----------------------------------------------------------------------- + ffi_cfi.h - Copyright (c) 2014 Red Hat, Inc. + + Conditionally assemble cfi directives. Only necessary for building libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_CFI_H +#define FFI_CFI_H + +#ifdef HAVE_AS_CFI_PSEUDO_OP + +# define cfi_startproc .cfi_startproc +# define cfi_endproc .cfi_endproc +# define cfi_def_cfa(reg, off) .cfi_def_cfa reg, off +# define cfi_def_cfa_register(reg) .cfi_def_cfa_register reg +# define cfi_def_cfa_offset(off) .cfi_def_cfa_offset off +# define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off +# define cfi_offset(reg, off) .cfi_offset reg, off +# define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off +# define cfi_register(r1, r2) .cfi_register r1, r2 +# define cfi_return_column(reg) .cfi_return_column reg +# define cfi_restore(reg) .cfi_restore reg +# define cfi_same_value(reg) .cfi_same_value reg +# define cfi_undefined(reg) .cfi_undefined reg +# define cfi_remember_state .cfi_remember_state +# define cfi_restore_state .cfi_restore_state +# define cfi_window_save .cfi_window_save +# define cfi_personality(enc, exp) .cfi_personality enc, exp +# define cfi_lsda(enc, exp) .cfi_lsda enc, exp +# define cfi_escape(...) .cfi_escape __VA_ARGS__ + +#else + +# define cfi_startproc +# define cfi_endproc +# define cfi_def_cfa(reg, off) +# define cfi_def_cfa_register(reg) +# define cfi_def_cfa_offset(off) +# define cfi_adjust_cfa_offset(off) +# define cfi_offset(reg, off) +# define cfi_rel_offset(reg, off) +# define cfi_register(r1, r2) +# define cfi_return_column(reg) +# define cfi_restore(reg) +# define cfi_same_value(reg) +# define cfi_undefined(reg) +# define cfi_remember_state +# define cfi_restore_state +# define cfi_window_save +# define cfi_personality(enc, exp) +# define cfi_lsda(enc, exp) +# define cfi_escape(...) + +#endif /* HAVE_AS_CFI_PSEUDO_OP */ +#endif /* FFI_CFI_H */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/ffi_common.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/ffi_common.h new file mode 100644 index 000000000000..76b9dd6fafe5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/include/ffi_common.h @@ -0,0 +1,153 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (C) 2011, 2012, 2013 Anthony Green + Copyright (C) 2007 Free Software Foundation, Inc + Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <fficonfig.h> + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +# if HAVE_ALLOCA_H +# include <alloca.h> +# else + /* mingw64 defines this already in malloc.h. */ +# ifndef alloca +# define alloca __builtin_alloca +# endif +# endif +# define MAYBE_UNUSED __attribute__((__unused__)) +#else +# define MAYBE_UNUSED +# if HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef _AIX +# pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +# ifdef _MSC_VER +# define alloca _alloca +# else +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include <string.h> +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#if defined(FFI_DEBUG) +#include <stdio.h> +#endif + +#ifdef FFI_DEBUG +void ffi_assert(char *expr, char *file, int line); +void ffi_stop_here(void); +void ffi_type_test(ffi_type *a, char *file, int line); + +#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) +#else +#define FFI_ASSERT(x) +#define FFI_ASSERT_AT(x, f, l) +#define FFI_ASSERT_VALID_TYPE(x) +#endif + +/* v cast to size_t and aligned up to a multiple of a */ +#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) +/* v cast to size_t and aligned down to a multiple of a */ +#define FFI_ALIGN_DOWN(v, a) (((size_t) (v)) & -a) + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif); +ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, + unsigned int nfixedargs, unsigned int ntotalargs); + + +#if HAVE_LONG_DOUBLE_VARIANT +/* Used to adjust size/alignment of ffi types. */ +void ffi_prep_types (ffi_abi abi); +#endif + +/* Used internally, but overridden by some architectures */ +ffi_status ffi_prep_cif_core(ffi_cif *cif, + ffi_abi abi, + unsigned int isvariadic, + unsigned int nfixedargs, + unsigned int ntotalargs, + ffi_type *rtype, + ffi_type **atypes); + +/* Translate a data pointer to a code pointer. Needed for closures on + some targets. */ +void *ffi_data_to_code_pointer (void *data) FFI_HIDDEN; + +/* Extended cif, used in callback from assembly routine */ +typedef struct +{ + ffi_cif *cif; + void *rvalue; + void **avalue; +} extended_cif; + +/* Terse sized type definitions. */ +#if defined(_MSC_VER) || defined(__sgi) || defined(__SUNPRO_C) +typedef unsigned char UINT8; +typedef signed char SINT8; +typedef unsigned short UINT16; +typedef signed short SINT16; +typedef unsigned int UINT32; +typedef signed int SINT32; +# ifdef _MSC_VER +typedef unsigned __int64 UINT64; +typedef signed __int64 SINT64; +# else +# include <inttypes.h> +typedef uint64_t UINT64; +typedef int64_t SINT64; +# endif +#else +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +#endif + +typedef float FLOAT32; + +#ifndef __GNUC__ +#define __builtin_expect(x, expected_value) (x) +#endif +#define LIKELY(x) __builtin_expect(!!(x),1) +#define UNLIKELY(x) __builtin_expect((x)!=0,0) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.map.in b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.map.in new file mode 100644 index 000000000000..de8778ae40fb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.map.in @@ -0,0 +1,76 @@ +#define LIBFFI_ASM +#define LIBFFI_H +#include <fficonfig.h> +#include <ffitarget.h> + +/* These version numbers correspond to the libtool-version abi numbers, + not to the libffi release numbers. */ + +LIBFFI_BASE_8.0 { + global: + /* Exported data variables. */ + ffi_type_void; + ffi_type_uint8; + ffi_type_sint8; + ffi_type_uint16; + ffi_type_sint16; + ffi_type_uint32; + ffi_type_sint32; + ffi_type_uint64; + ffi_type_sint64; + ffi_type_float; + ffi_type_double; + ffi_type_longdouble; + ffi_type_pointer; + + /* Exported functions. */ + ffi_call; + ffi_prep_cif; + ffi_prep_cif_var; + + ffi_raw_call; + ffi_ptrarray_to_raw; + ffi_raw_to_ptrarray; + ffi_raw_size; + + ffi_java_raw_call; + ffi_java_ptrarray_to_raw; + ffi_java_raw_to_ptrarray; + ffi_java_raw_size; + + ffi_get_struct_offsets; + local: + *; +}; + +#ifdef FFI_TARGET_HAS_COMPLEX_TYPE +LIBFFI_COMPLEX_8.0 { + global: + /* Exported data variables. */ + ffi_type_complex_float; + ffi_type_complex_double; + ffi_type_complex_longdouble; +} LIBFFI_BASE_8.0; +#endif + +#if FFI_CLOSURES +LIBFFI_CLOSURE_8.0 { + global: + ffi_closure_alloc; + ffi_closure_free; + ffi_prep_closure; + ffi_prep_closure_loc; + ffi_prep_raw_closure; + ffi_prep_raw_closure_loc; + ffi_prep_java_raw_closure; + ffi_prep_java_raw_closure_loc; +} LIBFFI_BASE_8.0; +#endif + +#if FFI_GO_CLOSURES +LIBFFI_GO_CLOSURE_8.0 { + global: + ffi_call_go; + ffi_prep_go_closure; +} LIBFFI_CLOSURE_8.0; +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.pc.in b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.pc.in new file mode 100644 index 000000000000..6fad83b4951c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +toolexeclibdir=@toolexeclibdir@ +includedir=@includedir@ + +Name: @PACKAGE_NAME@ +Description: Library supporting Foreign Function Interfaces +Version: @PACKAGE_VERSION@ +Libs: -L${toolexeclibdir} -lffi +Cflags: -I${includedir} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj new file mode 100644 index 000000000000..480c4a4e4456 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj @@ -0,0 +1,997 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 43B5D3F81D35473200D1E1FD /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */; }; + 43B5D3FA1D3547CE00D1E1FD /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */; }; + 43E9A5C81D352C1500926A8F /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */; }; + DBFA714A187F1D8600A76262 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; + DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713F187F1D8600A76262 /* ffi_common.h */; }; + DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7140187F1D8600A76262 /* fficonfig.h */; }; + DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; + DBFA714E187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; + DBFA714F187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; + DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; + DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; + DBFA7158187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; + DBFA7159187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; + DBFA715A187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; + DBFA715B187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; + DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716C187F1D9B00A76262 /* ffi_arm64.c */; }; + DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716D187F1D9B00A76262 /* sysv_arm64.S */; }; + DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716F187F1D9B00A76262 /* ffi_armv7.c */; }; + DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7170187F1D9B00A76262 /* sysv_armv7.S */; }; + DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */; }; + DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7183187F1DA100A76262 /* ffi_x86_64.h */; }; + DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */; }; + DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */; }; + DBFA7194187F1DA100A76262 /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718A187F1DA100A76262 /* unix64_x86_64.S */; }; + DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */; }; + FDB52FB31F6144FA00AA92E6 /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */; }; + FDB52FB51F6144FA00AA92E6 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */; }; + FDB52FB61F6144FA00AA92E6 /* ffi_armv7.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716F187F1D9B00A76262 /* ffi_armv7.c */; }; + FDB52FB71F6144FA00AA92E6 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; + FDB52FB81F6144FA00AA92E6 /* sysv_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7170187F1D9B00A76262 /* sysv_armv7.S */; }; + FDB52FB91F6144FA00AA92E6 /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */; }; + FDB52FBA1F6144FA00AA92E6 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; + FDB52FBC1F6144FA00AA92E6 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; + FDB52FBD1F6144FA00AA92E6 /* sysv_arm64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716D187F1D9B00A76262 /* sysv_arm64.S */; }; + FDB52FBE1F6144FA00AA92E6 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; + FDB52FBF1F6144FA00AA92E6 /* ffi_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716C187F1D9B00A76262 /* ffi_arm64.c */; }; + FDB52FC01F6144FA00AA92E6 /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */; }; + FDB52FD01F614A8B00AA92E6 /* ffi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; + FDB52FD11F614AA700AA92E6 /* ffi_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA715E187F1D9B00A76262 /* ffi_arm64.h */; }; + FDB52FD21F614AAB00AA92E6 /* ffi_armv7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA715F187F1D9B00A76262 /* ffi_armv7.h */; }; + FDB52FD41F614AB500AA92E6 /* ffi_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */; }; + FDB52FD51F614AE200AA92E6 /* ffi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; + FDB52FD61F614AEA00AA92E6 /* ffi_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA715E187F1D9B00A76262 /* ffi_arm64.h */; }; + FDB52FD71F614AED00AA92E6 /* ffi_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */; }; + FDB52FD81F614B8700AA92E6 /* ffitarget.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; + FDB52FD91F614B8E00AA92E6 /* ffitarget_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */; }; + FDB52FDA1F614B9300AA92E6 /* ffitarget_armv7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */; }; + FDB52FDD1F614BA900AA92E6 /* ffitarget_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */; }; + FDB52FDE1F6155E300AA92E6 /* ffitarget.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; + FDB52FDF1F6155EA00AA92E6 /* ffitarget_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */; }; + FDB52FE01F6155EF00AA92E6 /* ffitarget_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */; }; + FDB52FE21F6156FA00AA92E6 /* ffi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; + FDB52FE31F61571A00AA92E6 /* ffi_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7183187F1DA100A76262 /* ffi_x86_64.h */; }; + FDB52FE41F61571D00AA92E6 /* ffitarget.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; + FDB52FE61F61573100AA92E6 /* ffitarget_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */; }; + FDDB2F411F5D66E200EF414E /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */; }; + FDDB2F461F5D691E00EF414E /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F441F5D68C900EF414E /* win64_x86_64.S */; }; + FDDB2F4A1F5D846400EF414E /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */; }; + FDDB2F4C1F5D846400EF414E /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; + FDDB2F4E1F5D846400EF414E /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */; }; + FDDB2F4F1F5D846400EF414E /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; + FDDB2F501F5D846400EF414E /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; + FDDB2F511F5D846400EF414E /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; + FDDB2F521F5D846400EF414E /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718A187F1DA100A76262 /* unix64_x86_64.S */; }; + FDDB2F531F5D846400EF414E /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F441F5D68C900EF414E /* win64_x86_64.S */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + DB13B1641849DF1E0010F42D /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + FDB52FD01F614A8B00AA92E6 /* ffi.h in CopyFiles */, + FDB52FD11F614AA700AA92E6 /* ffi_arm64.h in CopyFiles */, + FDB52FD21F614AAB00AA92E6 /* ffi_armv7.h in CopyFiles */, + FDB52FD41F614AB500AA92E6 /* ffi_x86_64.h in CopyFiles */, + FDB52FD81F614B8700AA92E6 /* ffitarget.h in CopyFiles */, + FDB52FD91F614B8E00AA92E6 /* ffitarget_arm64.h in CopyFiles */, + FDB52FDA1F614B9300AA92E6 /* ffitarget_armv7.h in CopyFiles */, + FDB52FDD1F614BA900AA92E6 /* ffitarget_x86_64.h in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FDB52FC11F6144FA00AA92E6 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + FDB52FD51F614AE200AA92E6 /* ffi.h in CopyFiles */, + FDB52FD61F614AEA00AA92E6 /* ffi_arm64.h in CopyFiles */, + FDB52FD71F614AED00AA92E6 /* ffi_x86_64.h in CopyFiles */, + FDB52FDE1F6155E300AA92E6 /* ffitarget.h in CopyFiles */, + FDB52FDF1F6155EA00AA92E6 /* ffitarget_arm64.h in CopyFiles */, + FDB52FE01F6155EF00AA92E6 /* ffitarget_x86_64.h in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FDB52FE11F6156E000AA92E6 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + FDB52FE21F6156FA00AA92E6 /* ffi.h in CopyFiles */, + FDB52FE31F61571A00AA92E6 /* ffi_x86_64.h in CopyFiles */, + FDB52FE41F61571D00AA92E6 /* ffitarget.h in CopyFiles */, + FDB52FE61F61573100AA92E6 /* ffitarget_x86_64.h in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffiw64_x86_64.c; sourceTree = "<group>"; }; + 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = win64_x86_64.S; sourceTree = "<group>"; }; + 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = unix64_x86_64.S; sourceTree = "<group>"; }; + 43E9A5DA1D35373600926A8F /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = "<group>"; }; + 43E9A5DB1D35374400926A8F /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = "<group>"; }; + 43E9A5DC1D35375400926A8F /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = "<group>"; }; + 43E9A5DD1D35375400926A8F /* internal64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal64.h; sourceTree = "<group>"; }; + DB13B1661849DF1E0010F42D /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; + DB13B1911849DF510010F42D /* ffi.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = ffi.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + DBFA713E187F1D8600A76262 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = "<group>"; }; + DBFA713F187F1D8600A76262 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = "<group>"; }; + DBFA7140187F1D8600A76262 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = "<group>"; }; + DBFA7141187F1D8600A76262 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = "<group>"; }; + DBFA7143187F1D8600A76262 /* closures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = closures.c; sourceTree = "<group>"; }; + DBFA7145187F1D8600A76262 /* dlmalloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dlmalloc.c; sourceTree = "<group>"; }; + DBFA7147187F1D8600A76262 /* prep_cif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prep_cif.c; sourceTree = "<group>"; }; + DBFA7148187F1D8600A76262 /* raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_api.c; sourceTree = "<group>"; }; + DBFA7149187F1D8600A76262 /* types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = types.c; sourceTree = "<group>"; }; + DBFA715E187F1D9B00A76262 /* ffi_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_arm64.h; sourceTree = "<group>"; }; + DBFA715F187F1D9B00A76262 /* ffi_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_armv7.h; sourceTree = "<group>"; }; + DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = "<group>"; }; + DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_arm64.h; sourceTree = "<group>"; }; + DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_armv7.h; sourceTree = "<group>"; }; + DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = "<group>"; }; + DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm64.h; sourceTree = "<group>"; }; + DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_armv7.h; sourceTree = "<group>"; }; + DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = "<group>"; }; + DBFA716C187F1D9B00A76262 /* ffi_arm64.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.c; path = ffi_arm64.c; sourceTree = "<group>"; }; + DBFA716D187F1D9B00A76262 /* sysv_arm64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_arm64.S; sourceTree = "<group>"; }; + DBFA716F187F1D9B00A76262 /* ffi_armv7.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.c; path = ffi_armv7.c; sourceTree = "<group>"; }; + DBFA7170187F1D9B00A76262 /* sysv_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_armv7.S; sourceTree = "<group>"; }; + DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = "<group>"; }; + DBFA7183187F1DA100A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = "<group>"; }; + DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = "<group>"; }; + DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = "<group>"; }; + DBFA718A187F1DA100A76262 /* unix64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = unix64_x86_64.S; sourceTree = "<group>"; }; + DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = "<group>"; }; + FDB52FC51F6144FA00AA92E6 /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; + FDDB2F3E1F5D61BC00EF414E /* asmnames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asmnames.h; sourceTree = "<group>"; }; + FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffiw64_x86_64.c; sourceTree = "<group>"; }; + FDDB2F421F5D68C900EF414E /* internal64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal64.h; sourceTree = "<group>"; }; + FDDB2F431F5D68C900EF414E /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = "<group>"; }; + FDDB2F441F5D68C900EF414E /* win64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = win64_x86_64.S; sourceTree = "<group>"; }; + FDDB2F621F5D846400EF414E /* libffi.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + DB13B15B1849DEB70010F42D = { + isa = PBXGroup; + children = ( + DBFA713C187F1D8600A76262 /* darwin_common */, + DBFA715C187F1D9B00A76262 /* darwin_ios */, + DBFA7180187F1DA100A76262 /* darwin_osx */, + DB13B1671849DF1E0010F42D /* Products */, + ); + sourceTree = "<group>"; + }; + DB13B1671849DF1E0010F42D /* Products */ = { + isa = PBXGroup; + children = ( + DB13B1661849DF1E0010F42D /* libffi.a */, + DB13B1911849DF510010F42D /* ffi.dylib */, + FDDB2F621F5D846400EF414E /* libffi.a */, + FDB52FC51F6144FA00AA92E6 /* libffi.a */, + ); + name = Products; + sourceTree = "<group>"; + }; + DBFA713C187F1D8600A76262 /* darwin_common */ = { + isa = PBXGroup; + children = ( + DBFA713D187F1D8600A76262 /* include */, + DBFA7142187F1D8600A76262 /* src */, + ); + path = darwin_common; + sourceTree = "<group>"; + }; + DBFA713D187F1D8600A76262 /* include */ = { + isa = PBXGroup; + children = ( + DBFA713E187F1D8600A76262 /* ffi.h */, + DBFA713F187F1D8600A76262 /* ffi_common.h */, + DBFA7140187F1D8600A76262 /* fficonfig.h */, + DBFA7141187F1D8600A76262 /* ffitarget.h */, + ); + path = include; + sourceTree = "<group>"; + }; + DBFA7142187F1D8600A76262 /* src */ = { + isa = PBXGroup; + children = ( + DBFA7143187F1D8600A76262 /* closures.c */, + DBFA7145187F1D8600A76262 /* dlmalloc.c */, + DBFA7147187F1D8600A76262 /* prep_cif.c */, + DBFA7148187F1D8600A76262 /* raw_api.c */, + DBFA7149187F1D8600A76262 /* types.c */, + ); + path = src; + sourceTree = "<group>"; + }; + DBFA715C187F1D9B00A76262 /* darwin_ios */ = { + isa = PBXGroup; + children = ( + DBFA715D187F1D9B00A76262 /* include */, + DBFA716A187F1D9B00A76262 /* src */, + ); + path = darwin_ios; + sourceTree = "<group>"; + }; + DBFA715D187F1D9B00A76262 /* include */ = { + isa = PBXGroup; + children = ( + DBFA715E187F1D9B00A76262 /* ffi_arm64.h */, + DBFA715F187F1D9B00A76262 /* ffi_armv7.h */, + DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */, + DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */, + DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */, + DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */, + DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */, + DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */, + DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */, + ); + path = include; + sourceTree = "<group>"; + }; + DBFA716A187F1D9B00A76262 /* src */ = { + isa = PBXGroup; + children = ( + DBFA716B187F1D9B00A76262 /* aarch64 */, + DBFA716E187F1D9B00A76262 /* arm */, + DBFA7172187F1D9B00A76262 /* x86 */, + ); + path = src; + sourceTree = "<group>"; + }; + DBFA716B187F1D9B00A76262 /* aarch64 */ = { + isa = PBXGroup; + children = ( + 43E9A5DA1D35373600926A8F /* internal.h */, + DBFA716C187F1D9B00A76262 /* ffi_arm64.c */, + DBFA716D187F1D9B00A76262 /* sysv_arm64.S */, + ); + path = aarch64; + sourceTree = "<group>"; + }; + DBFA716E187F1D9B00A76262 /* arm */ = { + isa = PBXGroup; + children = ( + 43E9A5DB1D35374400926A8F /* internal.h */, + DBFA716F187F1D9B00A76262 /* ffi_armv7.c */, + DBFA7170187F1D9B00A76262 /* sysv_armv7.S */, + ); + path = arm; + sourceTree = "<group>"; + }; + DBFA7172187F1D9B00A76262 /* x86 */ = { + isa = PBXGroup; + children = ( + 43E9A5DC1D35375400926A8F /* internal.h */, + 43E9A5DD1D35375400926A8F /* internal64.h */, + DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */, + 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */, + 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */, + 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */, + ); + path = x86; + sourceTree = "<group>"; + }; + DBFA7180187F1DA100A76262 /* darwin_osx */ = { + isa = PBXGroup; + children = ( + DBFA7181187F1DA100A76262 /* include */, + DBFA7188187F1DA100A76262 /* src */, + ); + path = darwin_osx; + sourceTree = "<group>"; + }; + DBFA7181187F1DA100A76262 /* include */ = { + isa = PBXGroup; + children = ( + DBFA7183187F1DA100A76262 /* ffi_x86_64.h */, + DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */, + DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */, + ); + path = include; + sourceTree = "<group>"; + }; + DBFA7188187F1DA100A76262 /* src */ = { + isa = PBXGroup; + children = ( + DBFA7189187F1DA100A76262 /* x86 */, + ); + path = src; + sourceTree = "<group>"; + }; + DBFA7189187F1DA100A76262 /* x86 */ = { + isa = PBXGroup; + children = ( + FDDB2F431F5D68C900EF414E /* internal.h */, + FDDB2F421F5D68C900EF414E /* internal64.h */, + FDDB2F3E1F5D61BC00EF414E /* asmnames.h */, + DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */, + FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */, + DBFA718A187F1DA100A76262 /* unix64_x86_64.S */, + FDDB2F441F5D68C900EF414E /* win64_x86_64.S */, + ); + path = x86; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + DB13B18F1849DF510010F42D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */, + DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */, + DBFA714A187F1D8600A76262 /* ffi.h in Headers */, + DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */, + DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */, + DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */, + DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + DB13B1651849DF1E0010F42D /* libffi-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */; + buildPhases = ( + 43B5D3FB1D35480D00D1E1FD /* Run Script */, + DB13B1621849DF1E0010F42D /* Sources */, + DB13B1641849DF1E0010F42D /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libffi-iOS"; + productName = ffi; + productReference = DB13B1661849DF1E0010F42D /* libffi.a */; + productType = "com.apple.product-type.library.static"; + }; + DB13B1901849DF510010F42D /* libffi-Mac */ = { + isa = PBXNativeTarget; + buildConfigurationList = DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */; + buildPhases = ( + DB13B3061849E0490010F42D /* ShellScript */, + DB13B18D1849DF510010F42D /* Sources */, + DB13B18F1849DF510010F42D /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libffi-Mac"; + productName = ffi; + productReference = DB13B1911849DF510010F42D /* ffi.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; + FDB52FB01F6144FA00AA92E6 /* libffi-tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = FDB52FC21F6144FA00AA92E6 /* Build configuration list for PBXNativeTarget "libffi-tvOS" */; + buildPhases = ( + FDB52FB11F6144FA00AA92E6 /* Run Script */, + FDB52FB21F6144FA00AA92E6 /* Sources */, + FDB52FC11F6144FA00AA92E6 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libffi-tvOS"; + productName = ffi; + productReference = FDB52FC51F6144FA00AA92E6 /* libffi.a */; + productType = "com.apple.product-type.library.static"; + }; + FDDB2F471F5D846400EF414E /* libffi-static-Mac */ = { + isa = PBXNativeTarget; + buildConfigurationList = FDDB2F5F1F5D846400EF414E /* Build configuration list for PBXNativeTarget "libffi-static-Mac" */; + buildPhases = ( + FDDB2F481F5D846400EF414E /* ShellScript */, + FDDB2F491F5D846400EF414E /* Sources */, + FDB52FE11F6156E000AA92E6 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libffi-static-Mac"; + productName = ffi; + productReference = FDDB2F621F5D846400EF414E /* libffi.a */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + DB13B15C1849DEB70010F42D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + }; + buildConfigurationList = DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = DB13B15B1849DEB70010F42D; + productRefGroup = DB13B1671849DF1E0010F42D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + DB13B1651849DF1E0010F42D /* libffi-iOS */, + FDB52FB01F6144FA00AA92E6 /* libffi-tvOS */, + DB13B1901849DF510010F42D /* libffi-Mac */, + FDDB2F471F5D846400EF414E /* libffi-static-Mac */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 43B5D3FB1D35480D00D1E1FD /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-ios\nfi"; + }; + DB13B3061849E0490010F42D /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-osx\nfi"; + }; + FDB52FB11F6144FA00AA92E6 /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-ios\nfi"; + }; + FDDB2F481F5D846400EF414E /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-osx\nfi"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + DB13B1621849DF1E0010F42D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 43E9A5C81D352C1500926A8F /* unix64_x86_64.S in Sources */, + DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */, + DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */, + DBFA714E187F1D8600A76262 /* closures.c in Sources */, + DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */, + 43B5D3F81D35473200D1E1FD /* ffiw64_x86_64.c in Sources */, + DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */, + DBFA7158187F1D8600A76262 /* raw_api.c in Sources */, + DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */, + DBFA715A187F1D8600A76262 /* types.c in Sources */, + DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */, + 43B5D3FA1D3547CE00D1E1FD /* win64_x86_64.S in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DB13B18D1849DF510010F42D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */, + DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */, + FDDB2F411F5D66E200EF414E /* ffiw64_x86_64.c in Sources */, + DBFA715B187F1D8600A76262 /* types.c in Sources */, + DBFA7159187F1D8600A76262 /* raw_api.c in Sources */, + DBFA714F187F1D8600A76262 /* closures.c in Sources */, + DBFA7194187F1DA100A76262 /* unix64_x86_64.S in Sources */, + FDDB2F461F5D691E00EF414E /* win64_x86_64.S in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FDB52FB21F6144FA00AA92E6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FDB52FB31F6144FA00AA92E6 /* unix64_x86_64.S in Sources */, + FDB52FB51F6144FA00AA92E6 /* ffi64_x86_64.c in Sources */, + FDB52FB61F6144FA00AA92E6 /* ffi_armv7.c in Sources */, + FDB52FB71F6144FA00AA92E6 /* closures.c in Sources */, + FDB52FB81F6144FA00AA92E6 /* sysv_armv7.S in Sources */, + FDB52FB91F6144FA00AA92E6 /* ffiw64_x86_64.c in Sources */, + FDB52FBA1F6144FA00AA92E6 /* prep_cif.c in Sources */, + FDB52FBC1F6144FA00AA92E6 /* raw_api.c in Sources */, + FDB52FBD1F6144FA00AA92E6 /* sysv_arm64.S in Sources */, + FDB52FBE1F6144FA00AA92E6 /* types.c in Sources */, + FDB52FBF1F6144FA00AA92E6 /* ffi_arm64.c in Sources */, + FDB52FC01F6144FA00AA92E6 /* win64_x86_64.S in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FDDB2F491F5D846400EF414E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FDDB2F4A1F5D846400EF414E /* ffi64_x86_64.c in Sources */, + FDDB2F4C1F5D846400EF414E /* prep_cif.c in Sources */, + FDDB2F4E1F5D846400EF414E /* ffiw64_x86_64.c in Sources */, + FDDB2F4F1F5D846400EF414E /* types.c in Sources */, + FDDB2F501F5D846400EF414E /* raw_api.c in Sources */, + FDDB2F511F5D846400EF414E /* closures.c in Sources */, + FDDB2F521F5D846400EF414E /* unix64_x86_64.S in Sources */, + FDDB2F531F5D846400EF414E /* win64_x86_64.S in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + DB13B1601849DEB70010F42D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_common/include, + ); + ONLY_ACTIVE_ARCH = YES; + }; + name = Debug; + }; + DB13B1611849DEB70010F42D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_common/include, + ); + }; + name = Release; + }; + DB13B1871849DF1E0010F42D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DSTROOT = /tmp/ffi.dst; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_ios/include, + ); + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_NAME = ffi; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + VALID_ARCHS = "arm64 armv7 armv7s x86_64"; + }; + name = Debug; + }; + DB13B1881849DF1E0010F42D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DSTROOT = /tmp/ffi.dst; + ENABLE_NS_ASSERTIONS = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_ios/include, + ); + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_NAME = ffi; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + VALIDATE_PRODUCT = YES; + VALID_ARCHS = "arm64 armv7 armv7s x86_64"; + }; + name = Release; + }; + DB13B1B11849DF520010F42D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_osx/include, + ); + MACOSX_DEPLOYMENT_TARGET = 10.6; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; + PRODUCT_NAME = ffi; + SDKROOT = macosx; + }; + name = Debug; + }; + DB13B1B21849DF520010F42D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_osx/include, + ); + MACOSX_DEPLOYMENT_TARGET = 10.6; + OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; + PRODUCT_NAME = ffi; + SDKROOT = macosx; + }; + name = Release; + }; + FDB52FC31F6144FA00AA92E6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_ios/include, + ); + PRODUCT_NAME = ffi; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Debug; + }; + FDB52FC41F6144FA00AA92E6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_ios/include, + ); + PRODUCT_NAME = ffi; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + FDDB2F601F5D846400EF414E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + EXECUTABLE_EXTENSION = a; + EXECUTABLE_PREFIX = lib; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_osx/include, + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.6; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = ffi; + SDKROOT = macosx; + }; + name = Debug; + }; + FDDB2F611F5D846400EF414E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + EXECUTABLE_EXTENSION = a; + EXECUTABLE_PREFIX = lib; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + darwin_osx/include, + ); + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.6; + PRODUCT_NAME = ffi; + SDKROOT = macosx; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DB13B1601849DEB70010F42D /* Debug */, + DB13B1611849DEB70010F42D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DB13B1871849DF1E0010F42D /* Debug */, + DB13B1881849DF1E0010F42D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DB13B1B11849DF520010F42D /* Debug */, + DB13B1B21849DF520010F42D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FDB52FC21F6144FA00AA92E6 /* Build configuration list for PBXNativeTarget "libffi-tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FDB52FC31F6144FA00AA92E6 /* Debug */, + FDB52FC41F6144FA00AA92E6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FDDB2F5F1F5D846400EF414E /* Build configuration list for PBXNativeTarget "libffi-static-Mac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FDDB2F601F5D846400EF414E /* Debug */, + FDDB2F611F5D846400EF414E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = DB13B15C1849DEB70010F42D /* Project object */; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libtool-version b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libtool-version new file mode 100644 index 000000000000..607fee5585d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/libtool-version @@ -0,0 +1,29 @@ +# This file is used to maintain libtool version info for libffi. See +# the libtool manual to understand the meaning of the fields. This is +# a separate file so that version updates don't involve re-running +# automake. +# +# Here are a set of rules to help you update your library version +# information: +# +# 1. Start with version information of `0:0:0' for each libtool library. +# +# 2. Update the version information only immediately before a public +# release of your software. More frequent updates are unnecessary, +# and only guarantee that the current interface number gets larger +# faster. +# +# 3. If the library source code has changed at all since the last +# update, then increment revision (`c:r:a' becomes `c:r+1:a'). +# +# 4. If any interfaces have been added, removed, or changed since the +# last update, increment current, and set revision to 0. +# +# 5. If any interfaces have been added since the last public release, +# then increment age. +# +# 6. If any interfaces have been removed since the last public +# release, then set age to 0. +# +# CURRENT:REVISION:AGE +9:0:1 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/asmcfi.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/asmcfi.m4 new file mode 100644 index 000000000000..3e28602274d7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/asmcfi.m4 @@ -0,0 +1,13 @@ +AC_DEFUN([GCC_AS_CFI_PSEUDO_OP], +[AC_CACHE_CHECK([assembler .cfi pseudo-op support], + gcc_cv_as_cfi_pseudo_op, [ + gcc_cv_as_cfi_pseudo_op=unknown + AC_TRY_COMPILE([asm (".cfi_sections\n\t.cfi_startproc\n\t.cfi_endproc");],, + [gcc_cv_as_cfi_pseudo_op=yes], + [gcc_cv_as_cfi_pseudo_op=no]) + ]) + if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then + AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1, + [Define if your assembler supports .cfi_* directives.]) + fi +]) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_append_flag.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_append_flag.m4 new file mode 100644 index 000000000000..dd6d8b61406c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_append_flag.m4 @@ -0,0 +1,50 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space +# added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> +# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 8 + +AC_DEFUN([AX_APPEND_FLAG], +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + AS_VAR_APPEND(FLAGS,[" $1"]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_APPEND_FLAG diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 new file mode 100644 index 000000000000..9e7f1ee4a1dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 @@ -0,0 +1,194 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_cc_maxopt.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CC_MAXOPT +# +# DESCRIPTION +# +# Try to turn on "good" C optimization flags for various compilers and +# architectures, for some definition of "good". (In our case, good for +# FFTW and hopefully for other scientific codes. Modify as needed.) +# +# The user can override the flags by setting the CFLAGS environment +# variable. The user can also specify --enable-portable-binary in order to +# disable any optimization flags that might result in a binary that only +# runs on the host architecture. +# +# Note also that the flags assume that ANSI C aliasing rules are followed +# by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point +# computations can be re-ordered as needed. +# +# Requires macros: AX_CHECK_COMPILE_FLAG, AX_COMPILER_VENDOR, +# AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu> +# Copyright (c) 2008 Matteo Frigo +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <https://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 17 + +AC_DEFUN([AX_CC_MAXOPT], +[ +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AX_COMPILER_VENDOR]) +AC_REQUIRE([AC_CANONICAL_HOST]) + +AC_ARG_ENABLE(portable-binary, [AS_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])], + acx_maxopt_portable=$enableval, acx_maxopt_portable=no) + +# Try to determine "good" native compiler flags if none specified via CFLAGS +if test "$ac_test_CFLAGS" != "set"; then + CFLAGS="" + case $ax_cv_c_compiler_vendor in + dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" + if test "x$acx_maxopt_portable" = xno; then + CFLAGS="$CFLAGS -arch host" + fi;; + + sun) CFLAGS="-native -fast -xO5 -dalign" + if test "x$acx_maxopt_portable" = xyes; then + CFLAGS="$CFLAGS -xarch=generic" + fi;; + + hp) CFLAGS="+Oall +Optrs_ansi +DSnative" + if test "x$acx_maxopt_portable" = xyes; then + CFLAGS="$CFLAGS +DAportable" + fi;; + + ibm) if test "x$acx_maxopt_portable" = xno; then + xlc_opt="-qarch=auto -qtune=auto" + else + xlc_opt="-qtune=auto" + fi + AX_CHECK_COMPILE_FLAG($xlc_opt, + CFLAGS="-O3 -qansialias -w $xlc_opt", + [CFLAGS="-O3 -qansialias -w" + echo "******************************************************" + echo "* You seem to have the IBM C compiler. It is *" + echo "* recommended for best performance that you use: *" + echo "* *" + echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" + echo "* ^^^ ^^^ *" + echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" + echo "* CPU you have. (Set the CFLAGS environment var. *" + echo "* and re-run configure.) For more info, man cc. *" + echo "******************************************************"]) + ;; + + intel) CFLAGS="-O3 -ansi_alias" + if test "x$acx_maxopt_portable" = xno; then + icc_archflag=unknown + icc_flags="" + case $host_cpu in + i686*|x86_64*) + # icc accepts gcc assembly syntax, so these should work: + AX_GCC_X86_CPUID(0) + AX_GCC_X86_CPUID(1) + case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG + *:756e6547:6c65746e:49656e69) # Intel + case $ax_cv_gcc_x86_cpuid_1 in + *0?6[[78ab]]?:*:*:*|?6[[78ab]]?:*:*:*|6[[78ab]]?:*:*:*) icc_flags="-xK" ;; + *0?6[[9d]]?:*:*:*|?6[[9d]]?:*:*:*|6[[9d]]?:*:*:*|*1?65?:*:*:*) icc_flags="-xSSE2 -xB -xK" ;; + *0?6e?:*:*:*|?6e?:*:*:*|6e?:*:*:*) icc_flags="-xSSE3 -xP -xO -xB -xK" ;; + *0?6f?:*:*:*|?6f?:*:*:*|6f?:*:*:*|*1?66?:*:*:*) icc_flags="-xSSSE3 -xT -xB -xK" ;; + *1?6[[7d]]?:*:*:*) icc_flags="-xSSE4.1 -xS -xT -xB -xK" ;; + *1?6[[aef]]?:*:*:*|*2?6[[5cef]]?:*:*:*) icc_flags="-xSSE4.2 -xS -xT -xB -xK" ;; + *2?6[[ad]]?:*:*:*) icc_flags="-xAVX -SSE4.2 -xS -xT -xB -xK" ;; + *3?6[[ae]]?:*:*:*) icc_flags="-xCORE-AVX-I -xAVX -SSE4.2 -xS -xT -xB -xK" ;; + *3?6[[cf]]?:*:*:*|*4?6[[56]]?:*:*:*) icc_flags="-xCORE-AVX2 -xCORE-AVX-I -xAVX -SSE4.2 -xS -xT -xB -xK" ;; + *000?f[[346]]?:*:*:*|?f[[346]]?:*:*:*|f[[346]]?:*:*:*) icc_flags="-xSSE3 -xP -xO -xN -xW -xK" ;; + *00??f??:*:*:*|??f??:*:*:*|?f??:*:*:*|f??:*:*:*) icc_flags="-xSSE2 -xN -xW -xK" ;; + esac ;; + esac ;; + esac + if test "x$icc_flags" != x; then + for flag in $icc_flags; do + AX_CHECK_COMPILE_FLAG($flag, [icc_archflag=$flag; break]) + done + fi + AC_MSG_CHECKING([for icc architecture flag]) + AC_MSG_RESULT($icc_archflag) + if test "x$icc_archflag" != xunknown; then + CFLAGS="$CFLAGS $icc_archflag" + fi + fi + ;; + + gnu) + # default optimization flags for gcc on all systems + CFLAGS="-O3 -fomit-frame-pointer" + + # -malign-double for x86 systems + # libffi local change -- don't align double, as it changes the ABI + # AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double") + + # -fstrict-aliasing for gcc-2.95+ + AX_CHECK_COMPILE_FLAG(-fstrict-aliasing, + CFLAGS="$CFLAGS -fstrict-aliasing") + + # note that we enable "unsafe" fp optimization with other compilers, too + AX_CHECK_COMPILE_FLAG(-ffast-math, CFLAGS="$CFLAGS -ffast-math") + + AX_GCC_ARCHFLAG($acx_maxopt_portable) + ;; + + microsoft) + # default optimization flags for MSVC opt builds + CFLAGS="-O2" + ;; + esac + + if test -z "$CFLAGS"; then + echo "" + echo "********************************************************" + echo "* WARNING: Don't know the best CFLAGS for this system *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" + echo "********************************************************" + echo "" + CFLAGS="-O3" + fi + + AX_CHECK_COMPILE_FLAG($CFLAGS, [], [ + echo "" + echo "********************************************************" + echo "* WARNING: The guessed CFLAGS don't seem to work with *" + echo "* your compiler. *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "********************************************************" + echo "" + CFLAGS="" + ]) + +fi +]) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 new file mode 100644 index 000000000000..094577e45891 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 @@ -0,0 +1,122 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] +# AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] +# AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] +# +# DESCRIPTION +# +# Try to find a compiler option that enables most reasonable warnings. +# +# For the GNU compiler it will be -Wall (and -ansi -pedantic) The result +# is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default. +# +# Currently this macro knows about the GCC, Solaris, Digital Unix, AIX, +# HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and +# Intel compilers. For a given compiler, the Fortran flags are much more +# experimental than their C equivalents. +# +# - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS +# - $2 add-value-if-not-found : nothing +# - $3 action-if-found : add value to shellvariable +# - $4 action-if-not-found : nothing +# +# NOTE: These macros depend on AX_APPEND_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> +# Copyright (c) 2010 Rhys Ulerich <rhys.ulerich@gmail.com> +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <https://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 16 + +AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl +AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], +VAR,[VAR="no, unknown" +ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-warn all % -warn all" dnl Intel + "-pedantic % -Wall" dnl GCC + "-xstrconst % -v" dnl Solaris C + "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix + "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX + "-ansi -ansiE % -fullwarn" dnl IRIX + "+ESlit % +w1" dnl HP-UX C + "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) + "-h conform % -h msglevel 2" dnl Cray C (Unicos) + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done +FLAGS="$ac_save_[]FLAGS" +]) +AS_VAR_POPDEF([FLAGS])dnl +AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; + *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +])dnl AX_FLAGS_WARN_ALL +dnl implementation tactics: +dnl the for-argument contains a list of options. The first part of +dnl these does only exist to detect the compiler - usually it is +dnl a global option to enable -ansi or -extrawarnings. All other +dnl compilers will fail about it. That was needed since a lot of +dnl compilers will give false positives for some option-syntax +dnl like -Woption or -Xoption as they think of it is a pass-through +dnl to later compile stages or something. The "%" is used as a +dnl delimiter. A non-option comment can be given after "%%" marks +dnl which will be shown but not added to the respective C/CXXFLAGS. + +AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl +AC_LANG_PUSH([C]) +AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) +AC_LANG_POP([C]) +]) + +AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl +AC_LANG_PUSH([C++]) +AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) +AC_LANG_POP([C++]) +]) + +AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl +AC_LANG_PUSH([Fortran]) +AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) +AC_LANG_POP([Fortran]) +]) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 new file mode 100644 index 000000000000..bd753b34d7dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 @@ -0,0 +1,53 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> +# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 new file mode 100644 index 000000000000..73efdb005546 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 @@ -0,0 +1,88 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_COMPILER_VENDOR +# +# DESCRIPTION +# +# Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun, +# hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, +# watcom, etc. The vendor is returned in the cache variable +# $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu> +# Copyright (c) 2008 Matteo Frigo +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <https://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 17 + +AC_DEFUN([AX_COMPILER_VENDOR], +[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, + dnl Please add if possible support to ax_compiler_version.m4 + [# note: don't check for gcc first since some other compilers define __GNUC__ + vendors="intel: __ICC,__ECC,__INTEL_COMPILER + ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ + pathscale: __PATHCC__,__PATHSCALE__ + clang: __clang__ + cray: _CRAYC + fujitsu: __FUJITSU + sdcc: SDCC, __SDCC + gnu: __GNUC__ + sun: __SUNPRO_C,__SUNPRO_CC + hp: __HP_cc,__HP_aCC + dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER + borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ + comeau: __COMO__ + kai: __KCC + lcc: __LCC__ + sgi: __sgi,sgi + microsoft: _MSC_VER + metrowerks: __MWERKS__ + watcom: __WATCOMC__ + portland: __PGI + tcc: __TINYC__ + unknown: UNKNOWN" + for ventest in $vendors; do + case $ventest in + *:) vendor=$ventest; continue ;; + *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; + esac + AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ + #if !($vencpp) + thisisanerror; + #endif + ])], [break]) + done + ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` + ]) +]) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_configure_args.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_configure_args.m4 new file mode 100644 index 000000000000..9237efea7a7f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_configure_args.m4 @@ -0,0 +1,49 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_configure_args.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CONFIGURE_ARGS +# +# DESCRIPTION +# +# Helper macro for AX_ENABLE_BUILDDIR. +# +# The traditional way of starting a subdir-configure is running the script +# with ${1+"$@"} but since autoconf 2.60 this is broken. Instead we have +# to rely on eval'ing $ac_configure_args however some old autoconf +# versions do not provide that. To ensure maximum portability of autoconf +# extension macros this helper can be AC_REQUIRE'd so that +# $ac_configure_args will always be present. +# +# Sadly, the traditional "exec $SHELL" of the enable_builddir macros is +# spoiled now and must be replaced by "eval + exit $?". +# +# Example: +# +# AC_DEFUN([AX_ENABLE_SUBDIR],[dnl +# AC_REQUIRE([AX_CONFIGURE_ARGS])dnl +# eval $SHELL $ac_configure_args || exit $? +# ...]) +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 14 + +AC_DEFUN([AX_CONFIGURE_ARGS],[ + # [$]@ is unusable in 2.60+ but earlier autoconf had no ac_configure_args + if test "${ac_configure_args+set}" != "set" ; then + ac_configure_args= + for ac_arg in ${1+"[$]@"}; do + ac_configure_args="$ac_configure_args '$ac_arg'" + done + fi +]) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 new file mode 100644 index 000000000000..710384da545f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 @@ -0,0 +1,302 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_enable_builddir.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_ENABLE_BUILDDIR [(dirstring-or-command [,Makefile.mk [,-all]])] +# +# DESCRIPTION +# +# If the current configure was run within the srcdir then we move all +# configure-files into a subdir and let the configure steps continue +# there. We provide an option --disable-builddir to suppress the move into +# a separate builddir. +# +# Defaults: +# +# $1 = $host (overridden with $HOST) +# $2 = Makefile.mk +# $3 = -all +# +# This macro must be called before AM_INIT_AUTOMAKE. It creates a default +# toplevel srcdir Makefile from the information found in the created +# toplevel builddir Makefile. It just copies the variables and +# rule-targets, each extended with a default rule-execution that recurses +# into the build directory of the current "HOST". You can override the +# auto-detection through `config.guess` and build-time of course, as in +# +# make HOST=i386-mingw-cross +# +# which can of course set at configure time as well using +# +# configure --host=i386-mingw-cross +# +# After the default has been created, additional rules can be appended +# that will not just recurse into the subdirectories and only ever exist +# in the srcdir toplevel makefile - these parts are read from the $2 = +# Makefile.mk file +# +# The automatic rules are usually scanning the toplevel Makefile for lines +# like '#### $host |$builddir' to recognize the place where to recurse +# into. Usually, the last one is the only one used. However, almost all +# targets have an additional "*-all" rule which makes the script to +# recurse into _all_ variants of the current HOST (!!) setting. The "-all" +# suffix can be overridden for the macro as well. +# +# a special rule is only given for things like "dist" that will copy the +# tarball from the builddir to the sourcedir (or $(PUB)) for reason of +# convenience. +# +# LICENSE +# +# Copyright (c) 2009 Guido U. Draheim <guidod@gmx.de> +# Copyright (c) 2009 Alan Jenkins <alan-jenkins@tuffmail.co.uk> +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <https://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 30 + +AC_DEFUN([AX_ENABLE_BUILDDIR],[ +AC_REQUIRE([AC_CANONICAL_HOST])[]dnl +AC_REQUIRE([AC_CANONICAL_TARGET])[]dnl +AC_REQUIRE([AX_CONFIGURE_ARGS])[]dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])[]dnl +AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl +AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl +AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl +AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl +SUB="." +AC_ARG_ENABLE([builddir], AS_HELP_STRING( + [--disable-builddir],[disable automatic build in subdir of sources]) + ,[SUB="$enableval"], [SUB="auto"]) +if test ".$ac_srcdir_defaulted" != ".no" ; then +if test ".$srcdir" = ".." ; then + if test -f config.status ; then + AC_MSG_NOTICE(toplevel srcdir already configured... skipping subdir build) + else + test ".$SUB" = "." && SUB="." + test ".$SUB" = ".no" && SUB="." + test ".$TARGET" = "." && TARGET="$target" + test ".$SUB" = ".auto" && SUB="m4_ifval([$1], [$1],[$TARGET])" + if test ".$SUB" != ".." ; then # we know where to go and + AS_MKDIR_P([$SUB]) + echo __.$SUB.__ > $SUB/conftest.tmp + cd $SUB + if grep __.$SUB.__ conftest.tmp >/dev/null 2>/dev/null ; then + rm conftest.tmp + AC_MSG_RESULT([continue configure in default builddir "./$SUB"]) + else + AC_MSG_ERROR([could not change to default builddir "./$SUB"]) + fi + srcdir=`echo "$SUB" | + sed -e 's,^\./,,;s,[[^/]]$,&/,;s,[[^/]]*/,../,g;s,[[/]]$,,;'` + # going to restart from subdirectory location + test -f $srcdir/config.log && mv $srcdir/config.log . + test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . + test -f $srcdir/conftest.log && mv $srcdir/conftest.log . + test -f $srcdir/$cache_file && mv $srcdir/$cache_file . + AC_MSG_RESULT(....exec $SHELL $srcdir/[$]0 "--srcdir=$srcdir" "--enable-builddir=$SUB" ${1+"[$]@"}) + case "[$]0" in # restart + [[\\/]]* | ?:[[\\/]]*) # Absolute name + eval $SHELL "'[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; + *) eval $SHELL "'$srcdir/[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; + esac ; exit $? + fi + fi +fi fi +test ".$SUB" = ".auto" && SUB="." +dnl ac_path_prog uses "set dummy" to override $@ which would defeat the "exec" +AC_PATH_PROG(SED,gsed sed, sed) +AUX="$am_aux_dir" +AS_VAR_POPDEF([SED])dnl +AS_VAR_POPDEF([AUX])dnl +AS_VAR_POPDEF([SUB])dnl +AC_CONFIG_COMMANDS([buildir],[dnl .............. config.status .............. +AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl +AS_VAR_PUSHDEF([TOP],[top_srcdir])dnl +AS_VAR_PUSHDEF([SRC],[ac_top_srcdir])dnl +AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl +AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl +pushdef([END],[Makefile.mk])dnl +pushdef([_ALL],[ifelse([$3],,[-all],[$3])])dnl + SRC="$ax_enable_builddir_srcdir" + if test ".$SUB" = ".." ; then + if test -f "$TOP/Makefile" ; then + AC_MSG_NOTICE([skipping TOP/Makefile - left untouched]) + else + AC_MSG_NOTICE([skipping TOP/Makefile - not created]) + fi + else + if test -f "$SRC/Makefile" ; then + a=`grep "^VERSION " "$SRC/Makefile"` ; b=`grep "^VERSION " Makefile` + test "$a" != "$b" && rm "$SRC/Makefile" + fi + if test -f "$SRC/Makefile" ; then + echo "$SRC/Makefile : $SRC/Makefile.in" > $tmp/conftemp.mk + echo " []@ echo 'REMOVED,,,' >\$[]@" >> $tmp/conftemp.mk + eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" + if grep '^REMOVED,,,' "$SRC/Makefile" >/dev/null + then rm $SRC/Makefile ; fi + cp $tmp/conftemp.mk $SRC/makefiles.mk~ ## DEBUGGING + fi + if test ! -f "$SRC/Makefile" ; then + AC_MSG_NOTICE([create TOP/Makefile guessed from local Makefile]) + x='`' ; cat >$tmp/conftemp.sed <<_EOF +/^\$/n +x +/^\$/bS +x +/\\\\\$/{H;d;} +{H;s/.*//;x;} +bM +:S +x +/\\\\\$/{h;d;} +{h;s/.*//;x;} +:M +s/\\(\\n\\) /\\1 /g +/^ /d +/^[[ ]]*[[\\#]]/d +/^VPATH *=/d +s/^srcdir *=.*/srcdir = ./ +s/^top_srcdir *=.*/top_srcdir = ./ +/[[:=]]/!d +/^\\./d +dnl Now handle rules (i.e. lines containing ":" but not " = "). +/ = /b +/ .= /b +/:/!b +s/:.*/:/ +s/ / /g +s/ \\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/ \\1 \\1[]_ALL\\2/g +s/^\\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/\\1 \\1[]_ALL\\2/ +s/ / /g +/^all all[]_ALL[[ :]]/i\\ +all-configured : all[]_ALL +dnl dist-all exists... and would make for dist-all-all +s/ [[a-zA-Z0-9-]]*[]_ALL [[a-zA-Z0-9-]]*[]_ALL[]_ALL//g +/[]_ALL[]_ALL/d +a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\ + ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done +dnl special rule add-on: "dist" copies the tarball to $(PUB). (source tree) +/dist[]_ALL *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ + ; if test "\$\$found" -eq "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +dnl special rule add-on: "dist-foo" copies all the archives to $(PUB). (source tree) +/dist-[[a-zA-Z0-9]]*[]_ALL *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ + ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ + ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ + ; if test "\$\$found" -eq "0" ; then : \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ + ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ + ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done +dnl special rule add-on: "distclean" removes all local builddirs completely +/distclean[]_ALL *:/a\\ + @ HOST="\$(HOST)\" \\\\\\ + ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ + ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ + ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ + ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ + ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ + ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ + ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ + ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ + ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile +_EOF + cp "$tmp/conftemp.sed" "$SRC/makefile.sed~" ## DEBUGGING + $SED -f $tmp/conftemp.sed Makefile >$SRC/Makefile + if test -f "$SRC/m4_ifval([$2],[$2],[END])" ; then + AC_MSG_NOTICE([extend TOP/Makefile with TOP/m4_ifval([$2],[$2],[END])]) + cat $SRC/END >>$SRC/Makefile + fi ; xxxx="####" + echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$SRC/Makefile + # sanity check + if grep '^; echo "MAKE ' $SRC/Makefile >/dev/null ; then + AC_MSG_NOTICE([buggy sed found - it deletes tab in "a" text parts]) + $SED -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $SRC/Makefile \ + >$SRC/Makefile~ + (test -s $SRC/Makefile~ && mv $SRC/Makefile~ $SRC/Makefile) 2>/dev/null + fi + else + xxxx="\\#\\#\\#\\#" + # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed + echo "s!^$xxxx [[^|]]* | *$SUB *\$!$xxxx ...... $SUB!" >$tmp/conftemp.sed + $SED -f "$tmp/conftemp.sed" "$SRC/Makefile" >$tmp/mkfile.tmp + cp "$tmp/conftemp.sed" "$SRC/makefiles.sed~" ## DEBUGGING + cp "$tmp/mkfile.tmp" "$SRC/makefiles.out~" ## DEBUGGING + if cmp -s "$SRC/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then + AC_MSG_NOTICE([keeping TOP/Makefile from earlier configure]) + rm "$tmp/mkfile.tmp" + else + AC_MSG_NOTICE([reusing TOP/Makefile from earlier configure]) + mv "$tmp/mkfile.tmp" "$SRC/Makefile" + fi + fi + AC_MSG_NOTICE([build in $SUB (HOST=$ax_enable_builddir_host)]) + xxxx="####" + echo "$xxxx" "$ax_enable_builddir_host" "|$SUB" >>$SRC/Makefile + fi +popdef([END])dnl +AS_VAR_POPDEF([SED])dnl +AS_VAR_POPDEF([AUX])dnl +AS_VAR_POPDEF([SRC])dnl +AS_VAR_POPDEF([TOP])dnl +AS_VAR_POPDEF([SUB])dnl +],[dnl +ax_enable_builddir_srcdir="$srcdir" # $srcdir +ax_enable_builddir_host="$HOST" # $HOST / $host +ax_enable_builddir_version="$VERSION" # $VERSION +ax_enable_builddir_package="$PACKAGE" # $PACKAGE +ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX +ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED +ax_enable_builddir="$ax_enable_builddir" # $SUB +])dnl +]) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 new file mode 100644 index 000000000000..c52b9b296e9f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 @@ -0,0 +1,267 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_gcc_archflag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE]) +# +# DESCRIPTION +# +# This macro tries to guess the "native" arch corresponding to the target +# architecture for use with gcc's -march=arch or -mtune=arch flags. If +# found, the cache variable $ax_cv_gcc_archflag is set to this flag and +# ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is set to +# "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is +# to add $ax_cv_gcc_archflag to the end of $CFLAGS. +# +# PORTABLE? should be either [yes] (default) or [no]. In the former case, +# the flag is set to -mtune (or equivalent) so that the architecture is +# only used for tuning, but the instruction set used is still portable. In +# the latter case, the flag is set to -march (or equivalent) so that +# architecture-specific instructions are enabled. +# +# The user can specify --with-gcc-arch=<arch> in order to override the +# macro's choice of architecture, or --without-gcc-arch to disable this. +# +# When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is +# called unless the user specified --with-gcc-arch manually. +# +# Requires macros: AX_CHECK_COMPILE_FLAG, AX_GCC_X86_CPUID +# +# (The main emphasis here is on recent CPUs, on the principle that doing +# high-performance computing on old hardware is uncommon.) +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu> +# Copyright (c) 2008 Matteo Frigo +# Copyright (c) 2014 Tsukasa Oi +# Copyright (c) 2017-2018 Alexey Kopytov +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <https://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 22 + +AC_DEFUN([AX_GCC_ARCHFLAG], +[AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_SED]) +AC_REQUIRE([AX_COMPILER_VENDOR]) + +AC_ARG_WITH(gcc-arch, [AS_HELP_STRING([--with-gcc-arch=<arch>], [use architecture <arch> for gcc -march/-mtune, instead of guessing])], + ax_gcc_arch=$withval, ax_gcc_arch=yes) + +AC_MSG_CHECKING([for gcc architecture flag]) +AC_MSG_RESULT([]) +AC_CACHE_VAL(ax_cv_gcc_archflag, +[ +ax_cv_gcc_archflag="unknown" + +if test "$GCC" = yes; then + +if test "x$ax_gcc_arch" = xyes; then +ax_gcc_arch="" +if test "$cross_compiling" = no; then +case $host_cpu in + i[[3456]]86*|x86_64*|amd64*) # use cpuid codes + AX_GCC_X86_CPUID(0) + AX_GCC_X86_CPUID(1) + case $ax_cv_gcc_x86_cpuid_0 in + *:756e6547:6c65746e:49656e69) # Intel + case $ax_cv_gcc_x86_cpuid_1 in + *5[[4578]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; + *5[[123]]?:*:*:*) ax_gcc_arch=pentium ;; + *0?61?:*:*:*|?61?:*:*:*|61?:*:*:*) ax_gcc_arch=pentiumpro ;; + *0?6[[356]]?:*:*:*|?6[[356]]?:*:*:*|6[[356]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; + *0?6[[78ab]]?:*:*:*|?6[[78ab]]?:*:*:*|6[[78ab]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; + *0?6[[9d]]?:*:*:*|?6[[9d]]?:*:*:*|6[[9d]]?:*:*:*|*1?65?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; + *0?6e?:*:*:*|?6e?:*:*:*|6e?:*:*:*) ax_gcc_arch="yonah pentium-m pentium3 pentiumpro" ;; + *0?6f?:*:*:*|?6f?:*:*:*|6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; + *1?6[[7d]]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; + *1?6[[aef]]?:*:*:*|*2?6e?:*:*:*) ax_gcc_arch="nehalem corei7 core2 pentium-m pentium3 pentiumpro" ;; + *2?6[[5cf]]?:*:*:*) ax_gcc_arch="westmere corei7 core2 pentium-m pentium3 pentiumpro" ;; + *2?6[[ad]]?:*:*:*) ax_gcc_arch="sandybridge corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *3?6[[ae]]?:*:*:*) ax_gcc_arch="ivybridge core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *3?6[[cf]]?:*:*:*|*4?6[[56]]?:*:*:*) ax_gcc_arch="haswell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *3?6d?:*:*:*|*4?6[[7f]]?:*:*:*|*5?66?:*:*:*) ax_gcc_arch="broadwell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; + *1?6c?:*:*:*|*2?6[[67]]?:*:*:*|*3?6[[56]]?:*:*:*) ax_gcc_arch="bonnell atom core2 pentium-m pentium3 pentiumpro" ;; + *3?67?:*:*:*|*[[45]]?6[[ad]]?:*:*:*) ax_gcc_arch="silvermont atom core2 pentium-m pentium3 pentiumpro" ;; + *000?f[[012]]?:*:*:*|?f[[012]]?:*:*:*|f[[012]]?:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; + *000?f[[346]]?:*:*:*|?f[[346]]?:*:*:*|f[[346]]?:*:*:*) ax_gcc_arch="nocona prescott pentium4 pentiumpro" ;; + # fallback + *5??:*:*:*) ax_gcc_arch=pentium ;; + *??6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; + *6??:*:*:*) ax_gcc_arch=pentiumpro ;; + *00??f??:*:*:*|??f??:*:*:*|?f??:*:*:*|f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; + esac ;; + *:68747541:444d4163:69746e65) # AMD + case $ax_cv_gcc_x86_cpuid_1 in + *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;; + *5[[8]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; + *5[[9d]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; + *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;; + *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; + *6[[678a]]?:*:*:*) ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; + *000?f[[4578bcef]]?:*:*:*|?f[[4578bcef]]?:*:*:*|f[[4578bcef]]?:*:*:*|*001?f[[4578bcf]]?:*:*:*|1?f[[4578bcf]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; + *002?f[[13457bcf]]?:*:*:*|2?f[[13457bcf]]?:*:*:*|*004?f[[138bcf]]?:*:*:*|4?f[[138bcf]]?:*:*:*|*005?f[[df]]?:*:*:*|5?f[[df]]?:*:*:*|*006?f[[8bcf]]?:*:*:*|6?f[[8bcf]]?:*:*:*|*007?f[[cf]]?:*:*:*|7?f[[cf]]?:*:*:*|*00c?f1?:*:*:*|c?f1?:*:*:*|*020?f3?:*:*:*|20?f3?:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; + *010?f[[245689a]]?:*:*:*|10?f[[245689a]]?:*:*:*|*030?f1?:*:*:*|30?f1?:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; + *050?f[[12]]?:*:*:*|50?f[[12]]?:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; + *060?f1?:*:*:*|60?f1?:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; + *060?f2?:*:*:*|60?f2?:*:*:*|*061?f[[03]]?:*:*:*|61?f[[03]]?:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; + *063?f0?:*:*:*|63?f0?:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; + *07[[03]]?f0?:*:*:*|7[[03]]?f0?:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; + # fallback + *0[[13]]??f??:*:*:*|[[13]]??f??:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; + *020?f??:*:*:*|20?f??:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; + *05??f??:*:*:*|5??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; + *060?f??:*:*:*|60?f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; + *061?f??:*:*:*|61?f??:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; + *06??f??:*:*:*|6??f??:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; + *070?f??:*:*:*|70?f??:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; + *???f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; + esac ;; + *:746e6543:736c7561:48727561) # IDT / VIA (Centaur) + case $ax_cv_gcc_x86_cpuid_1 in + *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; + *5[[89]]?:*:*:*) ax_gcc_arch=winchip2 ;; + *66?:*:*:*) ax_gcc_arch=winchip2 ;; + *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;; + *6[[9adf]]?:*:*:*) ax_gcc_arch="c3-2 c3" ;; + esac ;; + esac + if test x"$ax_gcc_arch" = x; then # fallback + case $host_cpu in + i586*) ax_gcc_arch=pentium ;; + i686*) ax_gcc_arch=pentiumpro ;; + esac + fi + ;; + + sparc*) + AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/]) + cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` + cputype=`echo "$cputype" | tr -d ' -' | $SED 's/SPARCIIi/SPARCII/' |tr $as_cr_LETTERS $as_cr_letters` + case $cputype in + *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; + *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; + *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; + *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;; + *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;; + *cypress*) ax_gcc_arch=cypress ;; + esac ;; + + alphaev5) ax_gcc_arch=ev5 ;; + alphaev56) ax_gcc_arch=ev56 ;; + alphapca56) ax_gcc_arch="pca56 ev56" ;; + alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; + alphaev6) ax_gcc_arch=ev6 ;; + alphaev67) ax_gcc_arch=ev67 ;; + alphaev68) ax_gcc_arch="ev68 ev67" ;; + alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; + alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; + alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; + + powerpc*) + cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | $SED 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` + cputype=`echo $cputype | $SED -e 's/ppc//g;s/ *//g'` + case $cputype in + *750*) ax_gcc_arch="750 G3" ;; + *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;; + *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;; + *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;; + *970*) ax_gcc_arch="970 G5 power4";; + *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; + *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; + 603ev|8240) ax_gcc_arch="$cputype 603e 603";; + *POWER7*) ax_gcc_arch="power7";; + *POWER8*) ax_gcc_arch="power8";; + *POWER9*) ax_gcc_arch="power9";; + *POWER10*) ax_gcc_arch="power10";; + *) ax_gcc_arch=$cputype ;; + esac + ax_gcc_arch="$ax_gcc_arch powerpc" + ;; + aarch64) + cpuimpl=`grep 'CPU implementer' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` + cpuarch=`grep 'CPU architecture' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` + cpuvar=`grep 'CPU variant' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` + case $cpuimpl in + 0x42) case $cpuarch in + 8) case $cpuvar in + 0x0) ax_gcc_arch="thunderx2t99 vulcan armv8.1-a armv8-a+lse armv8-a native" ;; + esac + ;; + esac + ;; + 0x43) case $cpuarch in + 8) case $cpuvar in + 0x0) ax_gcc_arch="thunderx armv8-a native" ;; + 0x1) ax_gcc_arch="thunderx+lse armv8.1-a armv8-a+lse armv8-a native" ;; + esac + ;; + esac + ;; + esac + ;; +esac +fi # not cross-compiling +fi # guess arch + +if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then +if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code + flag_prefixes="-mtune=" + if test "x$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor" = xclang; then flag_prefixes="-march="; fi + # -mcpu=$arch and m$arch generate nonportable code on every arch except + # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. + case $host_cpu in i*86|x86_64*|amd64*) flag_prefixes="$flag_prefixes -mcpu= -m";; esac +else + flag_prefixes="-march= -mcpu= -m" +fi +for flag_prefix in $flag_prefixes; do + for arch in $ax_gcc_arch; do + flag="$flag_prefix$arch" + AX_CHECK_COMPILE_FLAG($flag, [if test "x$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor" = xclang; then + if test "x[]m4_default([$1],yes)" = xyes; then + if test "x$flag" = "x-march=$arch"; then flag=-mtune=$arch; fi + fi + fi; ax_cv_gcc_archflag=$flag; break]) + done + test "x$ax_cv_gcc_archflag" = xunknown || break +done +fi + +fi # $GCC=yes +]) +AC_MSG_CHECKING([for gcc architecture flag]) +AC_MSG_RESULT($ax_cv_gcc_archflag) +if test "x$ax_cv_gcc_archflag" = xunknown; then + m4_default([$3],:) +else + m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"]) +fi +]) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 new file mode 100644 index 000000000000..df954658ee1b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 @@ -0,0 +1,89 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_X86_CPUID(OP) +# AX_GCC_X86_CPUID_COUNT(OP, COUNT) +# +# DESCRIPTION +# +# On Pentium and later x86 processors, with gcc or a compiler that has a +# compatible syntax for inline assembly instructions, run a small program +# that executes the cpuid instruction with input OP. This can be used to +# detect the CPU type. AX_GCC_X86_CPUID_COUNT takes an additional COUNT +# parameter that gets passed into register ECX before calling cpuid. +# +# On output, the values of the eax, ebx, ecx, and edx registers are stored +# as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable +# ax_cv_gcc_x86_cpuid_OP. +# +# If the cpuid instruction fails (because you are running a +# cross-compiler, or because you are not using gcc, or because you are on +# a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP +# is set to the string "unknown". +# +# This macro mainly exists to be used in AX_GCC_ARCHFLAG. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu> +# Copyright (c) 2008 Matteo Frigo +# Copyright (c) 2015 Michael Petch <mpetch@capp-sysware.com> +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <https://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 10 + +AC_DEFUN([AX_GCC_X86_CPUID], +[AX_GCC_X86_CPUID_COUNT($1, 0) +]) + +AC_DEFUN([AX_GCC_X86_CPUID_COUNT], +[AC_REQUIRE([AC_PROG_CC]) +AC_LANG_PUSH([C]) +AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1, + [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [ + int op = $1, level = $2, eax, ebx, ecx, edx; + FILE *f; + __asm__ __volatile__ ("xchg %%ebx, %1\n" + "cpuid\n" + "xchg %%ebx, %1\n" + : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) + : "a" (op), "2" (level)); + + f = fopen("conftest_cpuid", "w"); if (!f) return 1; + fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); + fclose(f); + return 0; +])], + [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid], + [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid], + [ax_cv_gcc_x86_cpuid_$1=unknown])]) +AC_LANG_POP([C]) +]) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_require_defined.m4 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_require_defined.m4 new file mode 100644 index 000000000000..17c3eab7dafd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/m4/ax_require_defined.m4 @@ -0,0 +1,37 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_require_defined.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_REQUIRE_DEFINED(MACRO) +# +# DESCRIPTION +# +# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have +# been defined and thus are available for use. This avoids random issues +# where a macro isn't expanded. Instead the configure script emits a +# non-fatal: +# +# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found +# +# It's like AC_REQUIRE except it doesn't expand the required macro. +# +# Here's an example: +# +# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +# +# LICENSE +# +# Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org> +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 2 + +AC_DEFUN([AX_REQUIRE_DEFINED], [dnl + m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) +])dnl AX_REQUIRE_DEFINED diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/make_sunver.pl b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/make_sunver.pl new file mode 100644 index 000000000000..8a90b1fea0d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/make_sunver.pl @@ -0,0 +1,333 @@ +#!/usr/bin/perl -w + +# make_sunver.pl +# +# This script takes at least two arguments, a GNU style version script and +# a list of object and archive files, and generates a corresponding Sun +# style version script as follows: +# +# Each glob pattern, C++ mangled pattern or literal in the input script is +# matched against all global symbols in the input objects, emitting those +# that matched (or nothing if no match was found). +# A comment with the original pattern and its type is left in the output +# file to make it easy to understand the matches. +# +# It uses elfdump when present (native), GNU readelf otherwise. +# It depends on the GNU version of c++filt, since it must understand the +# GNU mangling style. + +use FileHandle; +use IPC::Open2; + +# Enforce C locale. +$ENV{'LC_ALL'} = "C"; +$ENV{'LANG'} = "C"; + +# Input version script, GNU style. +my $symvers = shift; + +########## +# Get all the symbols from the library, match them, and add them to a hash. + +my %sym_hash = (); + +# List of objects and archives to process. +my @OBJECTS = (); + +# List of shared objects to omit from processing. +my @SHAREDOBJS = (); + +# Filter out those input archives that have corresponding shared objects to +# avoid adding all symbols matched in the archive to the output map. +foreach $file (@ARGV) { + if (($so = $file) =~ s/\.a$/.so/ && -e $so) { + printf STDERR "omitted $file -> $so\n"; + push (@SHAREDOBJS, $so); + } else { + push (@OBJECTS, $file); + } +} + +# We need to detect and ignore hidden symbols. Solaris nm can only detect +# this in the harder to parse default output format, and GNU nm not at all, +# so use elfdump -s in the native case and GNU readelf -s otherwise. +# GNU objdump -t cannot be used since it produces a variable number of +# columns. + +# The path to elfdump. +my $elfdump = "/usr/ccs/bin/elfdump"; + +if (-f $elfdump) { + open ELFDUMP,$elfdump.' -s '.(join ' ',@OBJECTS).'|' or die $!; + my $skip_arsym = 0; + + while (<ELFDUMP>) { + chomp; + + # Ignore empty lines. + if (/^$/) { + # End of archive symbol table, stop skipping. + $skip_arsym = 0 if $skip_arsym; + next; + } + + # Keep skipping until end of archive symbol table. + next if ($skip_arsym); + + # Ignore object name header for individual objects and archives. + next if (/:$/); + + # Ignore table header lines. + next if (/^Symbol Table Section:/); + next if (/index.*value.*size/); + + # Start of archive symbol table: start skipping. + if (/^Symbol Table: \(archive/) { + $skip_arsym = 1; + next; + } + + # Split table. + (undef, undef, undef, undef, $bind, $oth, undef, $shndx, $name) = split; + + # Error out for unknown input. + die "unknown input line:\n$_" unless defined($bind); + + # Ignore local symbols. + next if ($bind eq "LOCL"); + # Ignore hidden symbols. + next if ($oth eq "H"); + # Ignore undefined symbols. + next if ($shndx eq "UNDEF"); + # Error out for unhandled cases. + if ($bind !~ /^(GLOB|WEAK)/ or $oth ne "D") { + die "unhandled symbol:\n$_"; + } + + # Remember symbol. + $sym_hash{$name}++; + } + close ELFDUMP or die "$elfdump error"; +} else { + open READELF, 'readelf -s -W '.(join ' ',@OBJECTS).'|' or die $!; + # Process each symbol. + while (<READELF>) { + chomp; + + # Ignore empty lines. + next if (/^$/); + + # Ignore object name header. + next if (/^File: .*$/); + + # Ignore table header lines. + next if (/^Symbol table.*contains.*:/); + next if (/Num:.*Value.*Size/); + + # Split table. + (undef, undef, undef, undef, $bind, $vis, $ndx, $name) = split; + + # Error out for unknown input. + die "unknown input line:\n$_" unless defined($bind); + + # Ignore local symbols. + next if ($bind eq "LOCAL"); + # Ignore hidden symbols. + next if ($vis eq "HIDDEN"); + # Ignore undefined symbols. + next if ($ndx eq "UND"); + # Error out for unhandled cases. + if ($bind !~ /^(GLOBAL|WEAK)/ or $vis ne "DEFAULT") { + die "unhandled symbol:\n$_"; + } + + # Remember symbol. + $sym_hash{$name}++; + } + close READELF or die "readelf error"; +} + +########## +# The various types of glob patterns. +# +# A glob pattern that is to be applied to the demangled name: 'cxx'. +# A glob patterns that applies directly to the name in the .o files: 'glob'. +# This pattern is ignored; used for local variables (usually just '*'): 'ign'. + +# The type of the current pattern. +my $glob = 'glob'; + +# We're currently inside `extern "C++"', which Sun ld doesn't understand. +my $in_extern = 0; + +# The c++filt command to use. This *must* be GNU c++filt; the Sun Studio +# c++filt doesn't handle the GNU mangling style. +my $cxxfilt = $ENV{'CXXFILT'} || "c++filt"; + +# The current version name. +my $current_version = ""; + +# Was there any attempt to match a symbol to this version? +my $matches_attempted; + +# The number of versions which matched this symbol. +my $matched_symbols; + +open F,$symvers or die $!; + +# Print information about generating this file +print "# This file was generated by make_sunver.pl. DO NOT EDIT!\n"; +print "# It was generated by:\n"; +printf "# %s %s %s\n", $0, $symvers, (join ' ',@ARGV); +printf "# Omitted archives with corresponding shared libraries: %s\n", + (join ' ', @SHAREDOBJS) if $#SHAREDOBJS >= 0; +print "#\n\n"; + +while (<F>) { + # Lines of the form '};' + if (/^([ \t]*)(\}[ \t]*;[ \t]*)$/) { + $glob = 'glob'; + if ($in_extern) { + $in_extern--; + print "$1##$2\n"; + } else { + print; + } + next; + } + + # Lines of the form '} SOME_VERSION_NAME_1.0;' + if (/^[ \t]*\}[ \tA-Z0-9_.a-z]+;[ \t]*$/) { + $glob = 'glob'; + # We tried to match symbols agains this version, but none matched. + # Emit dummy hidden symbol to avoid marking this version WEAK. + if ($matches_attempted && $matched_symbols == 0) { + print " hidden:\n"; + print " .force_WEAK_off_$current_version = DATA S0x0 V0x0;\n"; + } + print; next; + } + + # Comment and blank lines + if (/^[ \t]*\#/) { print; next; } + if (/^[ \t]*$/) { print; next; } + + # Lines of the form '{' + if (/^([ \t]*){$/) { + if ($in_extern) { + print "$1##{\n"; + } else { + print; + } + next; + } + + # Lines of the form 'SOME_VERSION_NAME_1.1 {' + if (/^([A-Z0-9_.]+)[ \t]+{$/) { + # Record version name. + $current_version = $1; + # Reset match attempts, #matched symbols for this version. + $matches_attempted = 0; + $matched_symbols = 0; + print; + next; + } + + # Ignore 'global:' + if (/^[ \t]*global:$/) { print; next; } + + # After 'local:', globs should be ignored, they won't be exported. + if (/^[ \t]*local:$/) { + $glob = 'ign'; + print; + next; + } + + # After 'extern "C++"', globs are C++ patterns + if (/^([ \t]*)(extern \"C\+\+\"[ \t]*)$/) { + $in_extern++; + $glob = 'cxx'; + # Need to comment, Sun ld cannot handle this. + print "$1##$2\n"; next; + } + + # Chomp newline now we're done with passing through the input file. + chomp; + + # Catch globs. Note that '{}' is not allowed in globs by this script, + # so only '*' and '[]' are available. + if (/^([ \t]*)([^ \t;{}#]+);?[ \t]*$/) { + my $ws = $1; + my $ptn = $2; + # Turn the glob into a regex by replacing '*' with '.*', '?' with '.'. + # Keep $ptn so we can still print the original form. + ($pattern = $ptn) =~ s/\*/\.\*/g; + $pattern =~ s/\?/\./g; + + if ($glob eq 'ign') { + # We're in a local: * section; just continue. + print "$_\n"; + next; + } + + # Print the glob commented for human readers. + print "$ws##$ptn ($glob)\n"; + # We tried to match a symbol to this version. + $matches_attempted++; + + if ($glob eq 'glob') { + my %ptn_syms = (); + + # Match ptn against symbols in %sym_hash. + foreach my $sym (keys %sym_hash) { + # Maybe it matches one of the patterns based on the symbol in + # the .o file. + $ptn_syms{$sym}++ if ($sym =~ /^$pattern$/); + } + + foreach my $sym (sort keys(%ptn_syms)) { + $matched_symbols++; + print "$ws$sym;\n"; + } + } elsif ($glob eq 'cxx') { + my %dem_syms = (); + + # Verify that we're actually using GNU c++filt. Other versions + # most likely cannot handle GNU style symbol mangling. + my $cxxout = `$cxxfilt --version 2>&1`; + $cxxout =~ m/GNU/ or die "$0 requires GNU c++filt to function"; + + # Talk to c++filt through a pair of file descriptors. + # Need to start a fresh instance per pattern, otherwise the + # process grows to 500+ MB. + my $pid = open2(*FILTIN, *FILTOUT, $cxxfilt) or die $!; + + # Match ptn against symbols in %sym_hash. + foreach my $sym (keys %sym_hash) { + # No? Well, maybe its demangled form matches one of those + # patterns. + printf FILTOUT "%s\n",$sym; + my $dem = <FILTIN>; + chomp $dem; + $dem_syms{$sym}++ if ($dem =~ /^$pattern$/); + } + + close FILTOUT or die "c++filt error"; + close FILTIN or die "c++filt error"; + # Need to wait for the c++filt process to avoid lots of zombies. + waitpid $pid, 0; + + foreach my $sym (sort keys(%dem_syms)) { + $matched_symbols++; + print "$ws$sym;\n"; + } + } else { + # No? Well, then ignore it. + } + next; + } + # Important sanity check. This script can't handle lots of formats + # that GNU ld can, so be sure to error out if one is seen! + die "strange line `$_'"; +} +close F; diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/Makefile.am b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/Makefile.am new file mode 100644 index 000000000000..afcbfb69f1d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/Makefile.am @@ -0,0 +1,8 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS=foreign + +EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 + +man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi.3 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi.3 new file mode 100644 index 000000000000..1f1d3031c997 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi.3 @@ -0,0 +1,41 @@ +.Dd February 15, 2008 +.Dt FFI 3 +.Sh NAME +.Nm FFI +.Nd Foreign Function Interface +.Sh LIBRARY +libffi, -lffi +.Sh SYNOPSIS +.In ffi.h +.Ft ffi_status +.Fo ffi_prep_cif +.Fa "ffi_cif *cif" +.Fa "ffi_abi abi" +.Fa "unsigned int nargs" +.Fa "ffi_type *rtype" +.Fa "ffi_type **atypes" +.Fc +.Ft void +.Fo ffi_prep_cif_var +.Fa "ffi_cif *cif" +.Fa "ffi_abi abi" +.Fa "unsigned int nfixedargs" +.Fa "unsigned int ntotalargs" +.Fa "ffi_type *rtype" +.Fa "ffi_type **atypes" +.Fc +.Ft void +.Fo ffi_call +.Fa "ffi_cif *cif" +.Fa "void (*fn)(void)" +.Fa "void *rvalue" +.Fa "void **avalue" +.Fc +.Sh DESCRIPTION +The foreign function interface provides a mechanism by which a function can +generate a call to another function at runtime without requiring knowledge of +the called function's interface at compile time. +.Sh SEE ALSO +.Xr ffi_prep_cif 3 , +.Xr ffi_prep_cif_var 3 , +.Xr ffi_call 3 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi_call.3 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi_call.3 new file mode 100644 index 000000000000..5351513f90d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi_call.3 @@ -0,0 +1,103 @@ +.Dd February 15, 2008 +.Dt ffi_call 3 +.Sh NAME +.Nm ffi_call +.Nd Invoke a foreign function. +.Sh SYNOPSIS +.In ffi.h +.Ft void +.Fo ffi_call +.Fa "ffi_cif *cif" +.Fa "void (*fn)(void)" +.Fa "void *rvalue" +.Fa "void **avalue" +.Fc +.Sh DESCRIPTION +The +.Nm ffi_call +function provides a simple mechanism for invoking a function without +requiring knowledge of the function's interface at compile time. +.Fa fn +is called with the values retrieved from the pointers in the +.Fa avalue +array. The return value from +.Fa fn +is placed in storage pointed to by +.Fa rvalue . +.Fa cif +contains information describing the data types, sizes and alignments of the +arguments to and return value from +.Fa fn , +and must be initialized with +.Nm ffi_prep_cif +before it is used with +.Nm ffi_call . +.Pp +.Fa rvalue +must point to storage that is sizeof(ffi_arg) or larger for non-floating point +types. For smaller-sized return value types, the +.Nm ffi_arg +or +.Nm ffi_sarg +integral type must be used to hold +the return value. +.Sh EXAMPLES +.Bd -literal +#include <ffi.h> +#include <stdio.h> + +unsigned char +foo(unsigned int, float); + +int +main(int argc, const char **argv) +{ + ffi_cif cif; + ffi_type *arg_types[2]; + void *arg_values[2]; + ffi_status status; + + // Because the return value from foo() is smaller than sizeof(long), it + // must be passed as ffi_arg or ffi_sarg. + ffi_arg result; + + // Specify the data type of each argument. Available types are defined + // in <ffi/ffi.h>. + arg_types[0] = &ffi_type_uint; + arg_types[1] = &ffi_type_float; + + // Prepare the ffi_cif structure. + if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, + 2, &ffi_type_uint8, arg_types)) != FFI_OK) + { + // Handle the ffi_status error. + } + + // Specify the values of each argument. + unsigned int arg1 = 42; + float arg2 = 5.1; + + arg_values[0] = &arg1; + arg_values[1] = &arg2; + + // Invoke the function. + ffi_call(&cif, FFI_FN(foo), &result, arg_values); + + // The ffi_arg 'result' now contains the unsigned char returned from foo(), + // which can be accessed by a typecast. + printf("result is %hhu", (unsigned char)result); + + return 0; +} + +// The target function. +unsigned char +foo(unsigned int x, float y) +{ + unsigned char result = x - y; + return result; +} +.Ed +.Sh SEE ALSO +.Xr ffi 3 , +.Xr ffi_prep_cif 3 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi_prep_cif.3 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi_prep_cif.3 new file mode 100644 index 000000000000..ab2be8adc17a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi_prep_cif.3 @@ -0,0 +1,68 @@ +.Dd February 15, 2008 +.Dt ffi_prep_cif 3 +.Sh NAME +.Nm ffi_prep_cif +.Nd Prepare a +.Nm ffi_cif +structure for use with +.Nm ffi_call +. +.Sh SYNOPSIS +.In ffi.h +.Ft ffi_status +.Fo ffi_prep_cif +.Fa "ffi_cif *cif" +.Fa "ffi_abi abi" +.Fa "unsigned int nargs" +.Fa "ffi_type *rtype" +.Fa "ffi_type **atypes" +.Fc +.Sh DESCRIPTION +The +.Nm ffi_prep_cif +function prepares a +.Nm ffi_cif +structure for use with +.Nm ffi_call +. +.Fa abi +specifies a set of calling conventions to use. +.Fa atypes +is an array of +.Fa nargs +pointers to +.Nm ffi_type +structs that describe the data type, size and alignment of each argument. +.Fa rtype +points to an +.Nm ffi_type +that describes the data type, size and alignment of the +return value. Note that to call a variadic function +.Nm ffi_prep_cif_var +must be used instead. +.Sh RETURN VALUES +Upon successful completion, +.Nm ffi_prep_cif +returns +.Nm FFI_OK . +It will return +.Nm FFI_BAD_TYPEDEF +if +.Fa cif +is +.Nm NULL +or +.Fa atypes +or +.Fa rtype +is malformed. If +.Fa abi +does not refer to a valid ABI, +.Nm FFI_BAD_ABI +will be returned. Available ABIs are +defined in +.Nm <ffitarget.h> . +.Sh SEE ALSO +.Xr ffi 3 , +.Xr ffi_call 3 , +.Xr ffi_prep_cif_var 3 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 new file mode 100644 index 000000000000..7e19d0b070f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 @@ -0,0 +1,73 @@ +.Dd January 25, 2011 +.Dt ffi_prep_cif_var 3 +.Sh NAME +.Nm ffi_prep_cif_var +.Nd Prepare a +.Nm ffi_cif +structure for use with +.Nm ffi_call +for variadic functions. +.Sh SYNOPSIS +.In ffi.h +.Ft ffi_status +.Fo ffi_prep_cif_var +.Fa "ffi_cif *cif" +.Fa "ffi_abi abi" +.Fa "unsigned int nfixedargs" +.Fa "unsigned int ntotalargs" +.Fa "ffi_type *rtype" +.Fa "ffi_type **atypes" +.Fc +.Sh DESCRIPTION +The +.Nm ffi_prep_cif_var +function prepares a +.Nm ffi_cif +structure for use with +.Nm ffi_call +for variadic functions. +.Fa abi +specifies a set of calling conventions to use. +.Fa atypes +is an array of +.Fa ntotalargs +pointers to +.Nm ffi_type +structs that describe the data type, size and alignment of each argument. +.Fa rtype +points to an +.Nm ffi_type +that describes the data type, size and alignment of the +return value. +.Fa nfixedargs +must contain the number of fixed (non-variadic) arguments. +Note that to call a non-variadic function +.Nm ffi_prep_cif +must be used. +.Sh RETURN VALUES +Upon successful completion, +.Nm ffi_prep_cif_var +returns +.Nm FFI_OK . +It will return +.Nm FFI_BAD_TYPEDEF +if +.Fa cif +is +.Nm NULL +or +.Fa atypes +or +.Fa rtype +is malformed. If +.Fa abi +does not refer to a valid ABI, +.Nm FFI_BAD_ABI +will be returned. Available ABIs are +defined in +.Nm <ffitarget.h> +. +.Sh SEE ALSO +.Xr ffi 3 , +.Xr ffi_call 3 , +.Xr ffi_prep_cif 3 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln new file mode 100644 index 000000000000..d9119dfac297 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.sln @@ -0,0 +1,33 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28302.56 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ffi_staticLib_arm64", "Ffi_staticLib.vcxproj", "{115502C0-BE05-4767-BF19-5C87D805FAD6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|ARM64.Build.0 = Debug|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|x64.ActiveCfg = Debug|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|x86.ActiveCfg = Debug|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|ARM64.ActiveCfg = Release|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|ARM64.Build.0 = Release|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|x64.ActiveCfg = Release|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|x86.ActiveCfg = Release|ARM64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {241C54C7-20DD-4897-9376-E6B6D1B43BD5} + EndGlobalSection +EndGlobal diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj new file mode 100644 index 000000000000..3187699ca178 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <VCProjectVersion>15.0</VCProjectVersion> + <ProjectGuid>{115502C0-BE05-4767-BF19-5C87D805FAD6}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>FfistaticLib</RootNamespace> + <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion> + <ProjectName>Ffi_staticLib_arm64</ProjectName> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="Shared"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <LinkIncremental>true</LinkIncremental> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <LinkIncremental>false</LinkIncremental> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>FFI_BUILDING_DLL;_DEBUG;_LIB;USE_DL_PREFIX;ARM64;_M_ARM64;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>..\..\include;.\aarch64_include;..\..\src\aarch64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <IgnoreStandardIncludePath>false</IgnoreStandardIncludePath> + <BrowseInformation>true</BrowseInformation> + <OmitFramePointers> + </OmitFramePointers> + <WholeProgramOptimization>false</WholeProgramOptimization> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>FFI_BUILDING_DLL;USE_DL_PREFIX;ARM64;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>..\..\include;.\aarch64_include;..\..\src\aarch64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <OmitFramePointers>true</OmitFramePointers> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations> + <AdditionalUsingDirectories>..\..\src;..\..\src\aarch64;%(AdditionalUsingDirectories)</AdditionalUsingDirectories> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <ProjectReference> + <LinkLibraryDependencies>true</LinkLibraryDependencies> + </ProjectReference> + </ItemDefinitionGroup> + <ItemGroup> + <ClInclude Include=".\aarch64_include\ffi.h" /> + <ClInclude Include=".\aarch64_include\fficonfig.h" /> + <ClInclude Include="..\..\src\aarch64\ffitarget.h" /> + <ClInclude Include="..\include\ffi_cfi.h" /> + <ClInclude Include="..\include\ffi_common.h" /> + <ClInclude Include="..\..\src\aarch64\internal.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\src\closures.c" /> + <ClCompile Include="..\..\src\dlmalloc.c" /> + <ClCompile Include="..\..\src\aarch64\ffi.c" /> + <ClCompile Include="..\..\src\prep_cif.c" /> + <ClCompile Include="..\..\src\types.c" /> + </ItemGroup> + <!--ItemGroup> + <Object Include="..\..\..\..\Downloads\libffi-master-win64\src\aarch64\win64_armasm.obj" /> + </ItemGroup--> + <ItemGroup> + <CustomBuild Include="..\..\src\aarch64\win64_armasm.S"> + <!--ExcludedFromBuild Condition="'$(Platform)'!='ARM64'">true</ExcludedFromBuild --> + <Command> + cl /FA /EP /nologo /I"..\..\include" /I".\aarch64_include" /I"..\..\src\aarch64" "%(FullPath)" &gt; $(IntDir)win64_armasm.i + armasm64 $(IntDir)win64_armasm.i /I"src\" /I"..\..\include" /I"..\..\src\aarch64" -o "$(IntDir)win64_armasm.obj" + </Command> + <Outputs>win64_armasm.obj;%(Outputs)</Outputs> + </CustomBuild> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters new file mode 100644 index 000000000000..1f8c6e13ef59 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\include\ffi.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\ffi_cfi.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\ffi_common.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\fficonfig.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\ffitarget.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\internal.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <ClCompile Include="src\closures.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="src\dlmalloc.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="src\ffi.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="src\prep_cif.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="src\types.c"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <CustomBuild Include="src\win64_armasm.S" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user new file mode 100644 index 000000000000..be2507870701 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/Ffi_staticLib.vcxproj.user @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup /> +</Project> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h new file mode 100644 index 000000000000..02f26a2f0f84 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h @@ -0,0 +1,511 @@ +/* -----------------------------------------------------------------*-C-*- + libffi 3.3-rc0 - Copyright (c) 2011, 2014 Anthony Green + - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the ``Software''), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------- + Most of the API is documented in doc/libffi.texi. + + The raw API is designed to bypass some of the argument packing and + unpacking on architectures for which it can be avoided. Routines + are provided to emulate the raw API if the underlying platform + doesn't allow faster implementation. + + More details on the raw API can be found in: + + http://gcc.gnu.org/ml/java/1999-q3/msg00138.html + + and + + http://gcc.gnu.org/ml/java/1999-q3/msg00174.html + -------------------------------------------------------------------- */ + +#ifndef LIBFFI_H +#define LIBFFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Specify which architecture libffi is configured for. */ +#ifndef AARCH64 +#define AARCH64 +#endif + +/* ---- System configuration information --------------------------------- */ + +#include <ffitarget.h> + +#ifndef LIBFFI_ASM + +#if defined(_MSC_VER) && !defined(__clang__) +#define __attribute__(X) +#endif + +#include <stddef.h> +#include <limits.h> + +/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). + But we can find it either under the correct ANSI name, or under GNU + C's internal name. */ + +#define FFI_64_BIT_MAX 9223372036854775807 + +#ifdef LONG_LONG_MAX +# define FFI_LONG_LONG_MAX LONG_LONG_MAX +#else +# ifdef LLONG_MAX +# define FFI_LONG_LONG_MAX LLONG_MAX +# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif /* _AIX52 or newer */ +# else +# ifdef __GNUC__ +# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ +# endif +# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ +# ifndef __PPC64__ +# if defined (__IBMC__) || defined (__IBMCPP__) +# define FFI_LONG_LONG_MAX LONGLONG_MAX +# endif +# endif /* __PPC64__ */ +# undef FFI_64_BIT_MAX +# define FFI_64_BIT_MAX 9223372036854775807LL +# endif +# endif +#endif + +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ + +typedef struct _ffi_type +{ + size_t size; + unsigned short alignment; + unsigned short type; + struct _ffi_type **elements; +} ffi_type; + +/* Need minimal decorations for DLLs to work on Windows. GCC has + autoimport and autoexport. Always mark externally visible symbols + as dllimport for MSVC clients, even if it means an extra indirection + when using the static version of the library. + Besides, as a workaround, they can define FFI_BUILDING if they + *know* they are going to link with the static library. */ +#if defined _MSC_VER +# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ +# define FFI_API __declspec(dllexport) +# elif !defined FFI_BUILDING /* Importing libffi.DLL */ +# define FFI_API __declspec(dllimport) +# else /* Building/linking static library */ +# define FFI_API +# endif +#else +# define FFI_API +#endif + +/* The externally visible type declarations also need the MSVC DLL + decorations, or they will not be exported from the object file. */ +#if defined LIBFFI_HIDE_BASIC_TYPES +# define FFI_EXTERN FFI_API +#else +# define FFI_EXTERN extern FFI_API +#endif + +#ifndef LIBFFI_HIDE_BASIC_TYPES +#if SCHAR_MAX == 127 +# define ffi_type_uchar ffi_type_uint8 +# define ffi_type_schar ffi_type_sint8 +#else + #error "char size not supported" +#endif + +#if SHRT_MAX == 32767 +# define ffi_type_ushort ffi_type_uint16 +# define ffi_type_sshort ffi_type_sint16 +#elif SHRT_MAX == 2147483647 +# define ffi_type_ushort ffi_type_uint32 +# define ffi_type_sshort ffi_type_sint32 +#else + #error "short size not supported" +#endif + +#if INT_MAX == 32767 +# define ffi_type_uint ffi_type_uint16 +# define ffi_type_sint ffi_type_sint16 +#elif INT_MAX == 2147483647 +# define ffi_type_uint ffi_type_uint32 +# define ffi_type_sint ffi_type_sint32 +#elif INT_MAX == 9223372036854775807 +# define ffi_type_uint ffi_type_uint64 +# define ffi_type_sint ffi_type_sint64 +#else + #error "int size not supported" +#endif + +#if LONG_MAX == 2147483647 +# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX + #error "no 64-bit data type supported" +# endif +#elif LONG_MAX != FFI_64_BIT_MAX + #error "long size not supported" +#endif + +#if LONG_MAX == 2147483647 +# define ffi_type_ulong ffi_type_uint32 +# define ffi_type_slong ffi_type_sint32 +#elif LONG_MAX == FFI_64_BIT_MAX +# define ffi_type_ulong ffi_type_uint64 +# define ffi_type_slong ffi_type_sint64 +#else + #error "long size not supported" +#endif + +/* These are defined in types.c. */ +FFI_EXTERN ffi_type ffi_type_void; +FFI_EXTERN ffi_type ffi_type_uint8; +FFI_EXTERN ffi_type ffi_type_sint8; +FFI_EXTERN ffi_type ffi_type_uint16; +FFI_EXTERN ffi_type ffi_type_sint16; +FFI_EXTERN ffi_type ffi_type_uint32; +FFI_EXTERN ffi_type ffi_type_sint32; +FFI_EXTERN ffi_type ffi_type_uint64; +FFI_EXTERN ffi_type ffi_type_sint64; +FFI_EXTERN ffi_type ffi_type_float; +FFI_EXTERN ffi_type ffi_type_double; +FFI_EXTERN ffi_type ffi_type_pointer; + +#ifndef _M_ARM64 +FFI_EXTERN ffi_type ffi_type_longdouble; +#else +#define ffi_type_longdouble ffi_type_double +#endif + +#ifdef FFI_TARGET_HAS_COMPLEX_TYPE +FFI_EXTERN ffi_type ffi_type_complex_float; +FFI_EXTERN ffi_type ffi_type_complex_double; +#if 1 +FFI_EXTERN ffi_type ffi_type_complex_longdouble; +#else +#define ffi_type_complex_longdouble ffi_type_complex_double +#endif +#endif +#endif /* LIBFFI_HIDE_BASIC_TYPES */ + +typedef enum { + FFI_OK = 0, + FFI_BAD_TYPEDEF, + FFI_BAD_ABI +} ffi_status; + +typedef struct { + ffi_abi abi; + unsigned nargs; + ffi_type **arg_types; + ffi_type *rtype; + unsigned bytes; + unsigned flags; +#ifdef FFI_EXTRA_CIF_FIELDS + FFI_EXTRA_CIF_FIELDS; +#endif +} ffi_cif; + +/* ---- Definitions for the raw API -------------------------------------- */ + +#ifndef FFI_SIZEOF_ARG +# if LONG_MAX == 2147483647 +# define FFI_SIZEOF_ARG 4 +# elif LONG_MAX == FFI_64_BIT_MAX +# define FFI_SIZEOF_ARG 8 +# endif +#endif + +#ifndef FFI_SIZEOF_JAVA_RAW +# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG +#endif + +typedef union { + ffi_sarg sint; + ffi_arg uint; + float flt; + char data[FFI_SIZEOF_ARG]; + void* ptr; +} ffi_raw; + +#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 +/* This is a special case for mips64/n32 ABI (and perhaps others) where + sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ +typedef union { + signed int sint; + unsigned int uint; + float flt; + char data[FFI_SIZEOF_JAVA_RAW]; + void* ptr; +} ffi_java_raw; +#else +typedef ffi_raw ffi_java_raw; +#endif + + +FFI_API +void ffi_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_raw *avalue); + +FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +FFI_API size_t ffi_raw_size (ffi_cif *cif); + +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines longs + and doubles are followed by an empty 64-bit word. */ + +FFI_API +void ffi_java_raw_call (ffi_cif *cif, + void (*fn)(void), + void *rvalue, + ffi_java_raw *avalue); + +FFI_API +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); +FFI_API +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); +FFI_API +size_t ffi_java_raw_size (ffi_cif *cif); + +/* ---- Definitions for closures ----------------------------------------- */ + +#if FFI_CLOSURES + +#ifdef _MSC_VER +__declspec(align(8)) +#endif +typedef struct { +#if 0 + void *trampoline_table; + void *trampoline_table_entry; +#else + char tramp[FFI_TRAMPOLINE_SIZE]; +#endif + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); + void *user_data; +} ffi_closure +#ifdef __GNUC__ + __attribute__((aligned (8))) +#endif + ; + +#ifndef __GNUC__ +# ifdef __sgi +# pragma pack 0 +# endif +#endif + +FFI_API void *ffi_closure_alloc (size_t size, void **code); +FFI_API void ffi_closure_free (void *); + +FFI_API ffi_status +ffi_prep_closure (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) + __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) +#elif defined(__GNUC__) && __GNUC__ >= 3 + __attribute__((deprecated)) +#endif + ; + +FFI_API ffi_status +ffi_prep_closure_loc (ffi_closure*, + ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void*codeloc); + +#ifdef __sgi +# pragma pack 8 +#endif +typedef struct { +#if 0 + void *trampoline_table; + void *trampoline_table_entry; +#else + char tramp[FFI_TRAMPOLINE_SIZE]; +#endif + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* If this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the transaltion, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_raw*,void*); + void *user_data; + +} ffi_raw_closure; + +typedef struct { +#if 0 + void *trampoline_table; + void *trampoline_table_entry; +#else + char tramp[FFI_TRAMPOLINE_SIZE]; +#endif + + ffi_cif *cif; + +#if !FFI_NATIVE_RAW_API + + /* If this is enabled, then a raw closure has the same layout + as a regular closure. We use this to install an intermediate + handler to do the translation, void** -> ffi_raw*. */ + + void (*translate_args)(ffi_cif*,void*,void**,void*); + void *this_closure; + +#endif + + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); + void *user_data; + +} ffi_java_raw_closure; + +FFI_API ffi_status +ffi_prep_raw_closure (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data); + +FFI_API ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc); + +FFI_API ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data); + +FFI_API ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc); + +#endif /* FFI_CLOSURES */ + +#if FFI_GO_CLOSURES + +typedef struct { + void *tramp; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); +} ffi_go_closure; + +FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*)); + +FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure); + +#endif /* FFI_GO_CLOSURES */ + +/* ---- Public interface definition -------------------------------------- */ + +FFI_API +ffi_status ffi_prep_cif(ffi_cif *cif, + ffi_abi abi, + unsigned int nargs, + ffi_type *rtype, + ffi_type **atypes); + +FFI_API +ffi_status ffi_prep_cif_var(ffi_cif *cif, + ffi_abi abi, + unsigned int nfixedargs, + unsigned int ntotalargs, + ffi_type *rtype, + ffi_type **atypes); + +FFI_API +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue); + +FFI_API +ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, + size_t *offsets); + +/* Useful for eliminating compiler warnings. */ +#define FFI_FN(f) ((void (*)(void))f) + +/* ---- Definitions shared with assembly code ---------------------------- */ + +#endif + +/* If these change, update src/mips/ffitarget.h. */ +#define FFI_TYPE_VOID 0 +#define FFI_TYPE_INT 1 +#define FFI_TYPE_FLOAT 2 +#define FFI_TYPE_DOUBLE 3 +#ifndef _M_ARM64 +#define FFI_TYPE_LONGDOUBLE 4 +#else +#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE +#endif +#define FFI_TYPE_UINT8 5 +#define FFI_TYPE_SINT8 6 +#define FFI_TYPE_UINT16 7 +#define FFI_TYPE_SINT16 8 +#define FFI_TYPE_UINT32 9 +#define FFI_TYPE_SINT32 10 +#define FFI_TYPE_UINT64 11 +#define FFI_TYPE_SINT64 12 +#define FFI_TYPE_STRUCT 13 +#define FFI_TYPE_POINTER 14 +#define FFI_TYPE_COMPLEX 15 +/* This should always refer to the last type code (for sanity checks). */ +#define FFI_TYPE_LAST FFI_TYPE_COMPLEX + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvcc.sh b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvcc.sh new file mode 100644 index 000000000000..7cfc5097fe73 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/msvcc.sh @@ -0,0 +1,353 @@ +#!/bin/sh + +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the MSVC wrappificator. +# +# The Initial Developer of the Original Code is +# Timothy Wall <twalljava@dev.java.net>. +# Portions created by the Initial Developer are Copyright (C) 2009 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Daniel Witte <dwitte@mozilla.com> +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +# +# GCC-compatible wrapper for cl.exe and ml.exe. Arguments are given in GCC +# format and translated into something sensible for cl or ml. +# + +args_orig=$@ +args="-nologo -W3" +linkargs= +static_crt= +debug_crt= +cl="cl" +ml="ml" +safeseh="-safeseh" +output= +libpaths= +libversion=7 +verbose= + +while [ $# -gt 0 ] +do + case $1 + in + --verbose) + verbose=1 + shift 1 + ;; + --version) + args="-help" + shift 1 + ;; + -fexceptions) + # Don't enable exceptions for now. + #args="$args -EHac" + shift 1 + ;; + -m32) + shift 1 + ;; + -m64) + ml="ml64" # "$MSVC/x86_amd64/ml64" + safeseh= + shift 1 + ;; + -marm) + ml='armasm' + safeseh= + shift 1 + ;; + -marm64) + ml='armasm64' + safeseh= + shift 1 + ;; + -clang-cl) + cl="clang-cl" + shift 1 + ;; + -O0) + args="$args -Od" + shift 1 + ;; + -O*) + # Runtime error checks (enabled by setting -RTC1 in the -DFFI_DEBUG + # case below) are not compatible with optimization flags and will + # cause the build to fail. Therefore, drop the optimization flag if + # -DFFI_DEBUG is also set. + case $args_orig in + *-DFFI_DEBUG*) + args="$args" + ;; + *) + # The ax_cc_maxopt.m4 macro from the upstream autoconf-archive + # project doesn't support MSVC and therefore ends up trying to + # use -O3. Use the equivalent "max optimization" flag for MSVC + # instead of erroring out. + case $1 in + -O3) + args="$args -O2" + ;; + *) + args="$args $1" + ;; + esac + opt="true" + ;; + esac + shift 1 + ;; + -g) + # Enable debug symbol generation. + args="$args -Zi" + shift 1 + ;; + -DFFI_DEBUG) + # Enable runtime error checks. + args="$args -RTC1" + defines="$defines $1" + shift 1 + ;; + -DUSE_STATIC_RTL) + # Link against static CRT. + static_crt=1 + shift 1 + ;; + -DUSE_DEBUG_RTL) + # Link against debug CRT. + debug_crt=1 + shift 1 + ;; + -c) + args="$args -c" + args="$(echo $args | sed 's%/Fe%/Fo%g')" + single="-c" + shift 1 + ;; + -D*=*) + name="$(echo $1|sed 's/-D\([^=][^=]*\)=.*/\1/g')" + value="$(echo $1|sed 's/-D[^=][^=]*=//g')" + args="$args -D${name}='$value'" + defines="$defines -D${name}='$value'" + shift 1 + ;; + -D*) + args="$args $1" + defines="$defines $1" + shift 1 + ;; + -I) + p=$(cygpath -ma "$2") + args="$args -I\"$p\"" + includes="$includes -I\"$p\"" + shift 2 + ;; + -I*) + p=$(cygpath -ma "${1#-I}") + args="$args -I\"$p\"" + includes="$includes -I\"$p\"" + shift 1 + ;; + -L) + p=$(cygpath -ma $2) + linkargs="$linkargs -LIBPATH:$p" + shift 2 + ;; + -L*) + p=$(cygpath -ma ${1#-L}) + linkargs="$linkargs -LIBPATH:$p" + shift 1 + ;; + -link) + # add next argument verbatim to linker args + linkargs="$linkargs $2" + shift 2 + ;; + -l*) + case $1 + in + -lffi) + linkargs="$linkargs lib${1#-l}-${libversion}.lib" + ;; + *) + # ignore other libraries like -lm, hope they are + # covered by MSVCRT + # linkargs="$linkargs ${1#-l}.lib" + ;; + esac + shift 1 + ;; + -W|-Wextra) + # TODO map extra warnings + shift 1 + ;; + -Wall) + # -Wall on MSVC is overzealous, and we already build with -W3. Nothing + # to do here. + shift 1 + ;; + -pedantic) + # libffi tests -pedantic with -Wall, so drop it also. + shift 1 + ;; + -warn) + # ignore -warn all from libtool as well. + if test "$2" = "all"; then + shift 2 + else + args="$args -warn" + shift 1 + fi + ;; + -Werror) + args="$args -WX" + shift 1 + ;; + -W*) + # TODO map specific warnings + shift 1 + ;; + -S) + args="$args -FAs" + shift 1 + ;; + -o) + outdir="$(dirname $2)" + base="$(basename $2|sed 's/\.[^.]*//g')" + if [ -n "$single" ]; then + output="-Fo$2" + else + output="-Fe$2" + fi + armasm_output="-o $2" + if [ -n "$assembly" ]; then + args="$args $output" + else + args="$args $output -Fd$outdir/$base -Fp$outdir/$base -Fa$outdir/$base" + fi + shift 2 + ;; + *.S) + src="$(cygpath -ma $1)" + assembly="true" + shift 1 + ;; + *.c) + args="$args $(cygpath -ma $1)" + shift 1 + ;; + *) + # Assume it's an MSVC argument, and pass it through. + args="$args $1" + shift 1 + ;; + esac +done + +if [ -n "$linkargs" ]; then + + # If -Zi is specified, certain optimizations are implicitly disabled + # by MSVC. Add back those optimizations if this is an optimized build. + # NOTE: These arguments must come after all others. + if [ -n "$opt" ]; then + linkargs="$linkargs -OPT:REF -OPT:ICF -INCREMENTAL:NO" + fi + + args="$args -link $linkargs" +fi + +if [ -n "$static_crt" ]; then + md=-MT +else + md=-MD +fi + +if [ -n "$debug_crt" ]; then + md="${md}d" +fi + +if [ -n "$assembly" ]; then + if [ -z "$outdir" ]; then + outdir="." + fi + ppsrc="$outdir/$(basename $src|sed 's/.S$/.asm/g')" + + if [ $ml = "armasm" ]; then + defines="$defines -D_M_ARM" + fi + + if [ $ml = "armasm64" ]; then + defines="$defines -D_M_ARM64" + fi + + if test -n "$verbose"; then + echo "$cl -nologo -EP $includes $defines $src > $ppsrc" + fi + + eval "\"$cl\" -nologo -EP $includes $defines $src" > $ppsrc || exit $? + output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')" + if [ $ml = "armasm" ]; then + args="-nologo -g -oldit $armasm_output $ppsrc -errorReport:prompt" + elif [ $ml = "armasm64" ]; then + args="-nologo -g $armasm_output $ppsrc -errorReport:prompt" + else + args="-nologo $safeseh $single $output $ppsrc" + fi + + if test -n "$verbose"; then + echo "$ml $args" + fi + + eval "\"$ml\" $args" + result=$? + + # required to fix ml64 broken output? + #mv *.obj $outdir +else + args="$md $args" + + if test -n "$verbose"; then + echo "$cl $args" + fi + # Return an error code of 1 if an invalid command line parameter is passed + # instead of just ignoring it. Any output that is not a warning or an + # error is filtered so this command behaves more like gcc. cl.exe prints + # the name of the compiled file otherwise, which breaks the dejagnu checks + # for excess warnings and errors. + eval "(\"$cl\" $args 2>&1 1>&3 | \ + awk '{print \$0} /D9002/ {error=1} END{exit error}' >&2) 3>&1 | \ + awk '/warning|error/'" + result=$? +fi + +exit $result + +# vim: noai:ts=4:sw=4 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/ffi.c new file mode 100644 index 000000000000..ef09f4d0609a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/ffi.c @@ -0,0 +1,1025 @@ +/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#if defined(__aarch64__) || defined(__arm64__)|| defined (_M_ARM64) +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_common.h> +#include "internal.h" +#ifdef _WIN32 +#include <windows.h> /* FlushInstructionCache */ +#endif + +/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; + all further uses in this file will refer to the 128-bit type. */ +#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE +# if FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +#else +# undef FFI_TYPE_LONGDOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#endif + +union _d +{ + UINT64 d; + UINT32 s[2]; +}; + +struct _v +{ + union _d d[2] __attribute__((aligned(16))); +}; + +struct call_context +{ + struct _v v[N_V_ARG_REG]; + UINT64 x[N_X_ARG_REG]; +}; + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#ifdef HAVE_PTRAUTH +#include <ptrauth.h> +#endif +#include <mach/vm_param.h> +#endif + +#else + +#if defined (__clang__) && defined (__APPLE__) +extern void sys_icache_invalidate (void *start, size_t len); +#endif + +static inline void +ffi_clear_cache (void *start, void *end) +{ +#if defined (__clang__) && defined (__APPLE__) + sys_icache_invalidate (start, (char *)end - (char *)start); +#elif defined (__GNUC__) + __builtin___clear_cache (start, end); +#elif defined (_WIN32) + FlushInstructionCache(GetCurrentProcess(), start, (char*)end - (char*)start); +#else +#error "Missing builtin to flush instruction cache" +#endif +} + +#endif + +/* A subroutine of is_vfp_type. Given a structure type, return the type code + of the first non-structure element. Recurse for structure elements. + Return -1 if the structure is in fact empty, i.e. no nested elements. */ + +static int +is_hfa0 (const ffi_type *ty) +{ + ffi_type **elements = ty->elements; + int i, ret = -1; + + if (elements != NULL) + for (i = 0; elements[i]; ++i) + { + ret = elements[i]->type; + if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX) + { + ret = is_hfa0 (elements[i]); + if (ret < 0) + continue; + } + break; + } + + return ret; +} + +/* A subroutine of is_vfp_type. Given a structure type, return true if all + of the non-structure elements are the same as CANDIDATE. */ + +static int +is_hfa1 (const ffi_type *ty, int candidate) +{ + ffi_type **elements = ty->elements; + int i; + + if (elements != NULL) + for (i = 0; elements[i]; ++i) + { + int t = elements[i]->type; + if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) + { + if (!is_hfa1 (elements[i], candidate)) + return 0; + } + else if (t != candidate) + return 0; + } + + return 1; +} + +/* Determine if TY may be allocated to the FP registers. This is both an + fp scalar type as well as an homogenous floating point aggregate (HFA). + That is, a structure consisting of 1 to 4 members of all the same type, + where that type is an fp scalar. + + Returns non-zero iff TY is an HFA. The result is the AARCH64_RET_* + constant for the type. */ + +static int +is_vfp_type (const ffi_type *ty) +{ + ffi_type **elements; + int candidate, i; + size_t size, ele_count; + + /* Quickest tests first. */ + candidate = ty->type; + switch (candidate) + { + default: + return 0; + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + ele_count = 1; + goto done; + case FFI_TYPE_COMPLEX: + candidate = ty->elements[0]->type; + switch (candidate) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + ele_count = 2; + goto done; + } + return 0; + case FFI_TYPE_STRUCT: + break; + } + + /* No HFA types are smaller than 4 bytes, or larger than 64 bytes. */ + size = ty->size; + if (size < 4 || size > 64) + return 0; + + /* Find the type of the first non-structure member. */ + elements = ty->elements; + candidate = elements[0]->type; + if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX) + { + for (i = 0; ; ++i) + { + candidate = is_hfa0 (elements[i]); + if (candidate >= 0) + break; + } + } + + /* If the first member is not a floating point type, it's not an HFA. + Also quickly re-check the size of the structure. */ + switch (candidate) + { + case FFI_TYPE_FLOAT: + ele_count = size / sizeof(float); + if (size != ele_count * sizeof(float)) + return 0; + break; + case FFI_TYPE_DOUBLE: + ele_count = size / sizeof(double); + if (size != ele_count * sizeof(double)) + return 0; + break; + case FFI_TYPE_LONGDOUBLE: + ele_count = size / sizeof(long double); + if (size != ele_count * sizeof(long double)) + return 0; + break; + default: + return 0; + } + if (ele_count > 4) + return 0; + + /* Finally, make sure that all scalar elements are the same type. */ + for (i = 0; elements[i]; ++i) + { + int t = elements[i]->type; + if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) + { + if (!is_hfa1 (elements[i], candidate)) + return 0; + } + else if (t != candidate) + return 0; + } + + /* All tests succeeded. Encode the result. */ + done: + return candidate * 4 + (4 - (int)ele_count); +} + +/* Representation of the procedure call argument marshalling + state. + + The terse state variable names match the names used in the AARCH64 + PCS. */ + +struct arg_state +{ + unsigned ngrn; /* Next general-purpose register number. */ + unsigned nsrn; /* Next vector register number. */ + size_t nsaa; /* Next stack offset. */ + +#if defined (__APPLE__) + unsigned allocating_variadic; +#endif +}; + +/* Initialize a procedure call argument marshalling state. */ +static void +arg_init (struct arg_state *state) +{ + state->ngrn = 0; + state->nsrn = 0; + state->nsaa = 0; +#if defined (__APPLE__) + state->allocating_variadic = 0; +#endif +} + +/* Allocate an aligned slot on the stack and return a pointer to it. */ +static void * +allocate_to_stack (struct arg_state *state, void *stack, + size_t alignment, size_t size) +{ + size_t nsaa = state->nsaa; + + /* Round up the NSAA to the larger of 8 or the natural + alignment of the argument's type. */ +#if defined (__APPLE__) + if (state->allocating_variadic && alignment < 8) + alignment = 8; +#else + if (alignment < 8) + alignment = 8; +#endif + + nsaa = FFI_ALIGN (nsaa, alignment); + state->nsaa = nsaa + size; + + return (char *)stack + nsaa; +} + +static ffi_arg +extend_integer_type (void *source, int type) +{ + switch (type) + { + case FFI_TYPE_UINT8: + return *(UINT8 *) source; + case FFI_TYPE_SINT8: + return *(SINT8 *) source; + case FFI_TYPE_UINT16: + return *(UINT16 *) source; + case FFI_TYPE_SINT16: + return *(SINT16 *) source; + case FFI_TYPE_UINT32: + return *(UINT32 *) source; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + return *(SINT32 *) source; + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + return *(UINT64 *) source; + break; + case FFI_TYPE_POINTER: + return *(uintptr_t *) source; + default: + abort(); + } +} + +#if defined(_MSC_VER) +void extend_hfa_type (void *dest, void *src, int h); +#else +static void +extend_hfa_type (void *dest, void *src, int h) +{ + ssize_t f = h - AARCH64_RET_S4; + void *x0; + + asm volatile ( + "adr %0, 0f\n" +" add %0, %0, %1\n" +" br %0\n" +"0: ldp s16, s17, [%3]\n" /* S4 */ +" ldp s18, s19, [%3, #8]\n" +" b 4f\n" +" ldp s16, s17, [%3]\n" /* S3 */ +" ldr s18, [%3, #8]\n" +" b 3f\n" +" ldp s16, s17, [%3]\n" /* S2 */ +" b 2f\n" +" nop\n" +" ldr s16, [%3]\n" /* S1 */ +" b 1f\n" +" nop\n" +" ldp d16, d17, [%3]\n" /* D4 */ +" ldp d18, d19, [%3, #16]\n" +" b 4f\n" +" ldp d16, d17, [%3]\n" /* D3 */ +" ldr d18, [%3, #16]\n" +" b 3f\n" +" ldp d16, d17, [%3]\n" /* D2 */ +" b 2f\n" +" nop\n" +" ldr d16, [%3]\n" /* D1 */ +" b 1f\n" +" nop\n" +" ldp q16, q17, [%3]\n" /* Q4 */ +" ldp q18, q19, [%3, #32]\n" +" b 4f\n" +" ldp q16, q17, [%3]\n" /* Q3 */ +" ldr q18, [%3, #32]\n" +" b 3f\n" +" ldp q16, q17, [%3]\n" /* Q2 */ +" b 2f\n" +" nop\n" +" ldr q16, [%3]\n" /* Q1 */ +" b 1f\n" +"4: str q19, [%2, #48]\n" +"3: str q18, [%2, #32]\n" +"2: str q17, [%2, #16]\n" +"1: str q16, [%2]" + : "=&r"(x0) + : "r"(f * 12), "r"(dest), "r"(src) + : "memory", "v16", "v17", "v18", "v19"); +} +#endif + +#if defined(_MSC_VER) +void* compress_hfa_type (void *dest, void *src, int h); +#else +static void * +compress_hfa_type (void *dest, void *reg, int h) +{ + switch (h) + { + case AARCH64_RET_S1: + if (dest == reg) + { +#ifdef __AARCH64EB__ + dest += 12; +#endif + } + else + *(float *)dest = *(float *)reg; + break; + case AARCH64_RET_S2: + asm ("ldp q16, q17, [%1]\n\t" + "st2 { v16.s, v17.s }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17"); + break; + case AARCH64_RET_S3: + asm ("ldp q16, q17, [%1]\n\t" + "ldr q18, [%1, #32]\n\t" + "st3 { v16.s, v17.s, v18.s }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18"); + break; + case AARCH64_RET_S4: + asm ("ldp q16, q17, [%1]\n\t" + "ldp q18, q19, [%1, #32]\n\t" + "st4 { v16.s, v17.s, v18.s, v19.s }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19"); + break; + + case AARCH64_RET_D1: + if (dest == reg) + { +#ifdef __AARCH64EB__ + dest += 8; +#endif + } + else + *(double *)dest = *(double *)reg; + break; + case AARCH64_RET_D2: + asm ("ldp q16, q17, [%1]\n\t" + "st2 { v16.d, v17.d }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17"); + break; + case AARCH64_RET_D3: + asm ("ldp q16, q17, [%1]\n\t" + "ldr q18, [%1, #32]\n\t" + "st3 { v16.d, v17.d, v18.d }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18"); + break; + case AARCH64_RET_D4: + asm ("ldp q16, q17, [%1]\n\t" + "ldp q18, q19, [%1, #32]\n\t" + "st4 { v16.d, v17.d, v18.d, v19.d }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19"); + break; + + default: + if (dest != reg) + return memcpy (dest, reg, 16 * (4 - (h & 3))); + break; + } + return dest; +} +#endif + +/* Either allocate an appropriate register for the argument type, or if + none are available, allocate a stack slot and return a pointer + to the allocated space. */ + +static void * +allocate_int_to_reg_or_stack (struct call_context *context, + struct arg_state *state, + void *stack, size_t size) +{ + if (state->ngrn < N_X_ARG_REG) + return &context->x[state->ngrn++]; + + state->ngrn = N_X_ARG_REG; + return allocate_to_stack (state, stack, size, size); +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep (ffi_cif *cif) +{ + ffi_type *rtype = cif->rtype; + size_t bytes = cif->bytes; + int flags, i, n; + + switch (rtype->type) + { + case FFI_TYPE_VOID: + flags = AARCH64_RET_VOID; + break; + case FFI_TYPE_UINT8: + flags = AARCH64_RET_UINT8; + break; + case FFI_TYPE_UINT16: + flags = AARCH64_RET_UINT16; + break; + case FFI_TYPE_UINT32: + flags = AARCH64_RET_UINT32; + break; + case FFI_TYPE_SINT8: + flags = AARCH64_RET_SINT8; + break; + case FFI_TYPE_SINT16: + flags = AARCH64_RET_SINT16; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + flags = AARCH64_RET_SINT32; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + flags = AARCH64_RET_INT64; + break; + case FFI_TYPE_POINTER: + flags = (sizeof(void *) == 4 ? AARCH64_RET_UINT32 : AARCH64_RET_INT64); + break; + + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + flags = is_vfp_type (rtype); + if (flags == 0) + { + size_t s = rtype->size; + if (s > 16) + { + flags = AARCH64_RET_VOID | AARCH64_RET_IN_MEM; + bytes += 8; + } + else if (s == 16) + flags = AARCH64_RET_INT128; + else if (s == 8) + flags = AARCH64_RET_INT64; + else + flags = AARCH64_RET_INT128 | AARCH64_RET_NEED_COPY; + } + break; + + default: + abort(); + } + + for (i = 0, n = cif->nargs; i < n; i++) + if (is_vfp_type (cif->arg_types[i])) + { + flags |= AARCH64_FLAG_ARG_V; + break; + } + + /* Round the stack up to a multiple of the stack alignment requirement. */ + cif->bytes = (unsigned) FFI_ALIGN(bytes, 16); + cif->flags = flags; +#if defined (__APPLE__) + cif->aarch64_nfixedargs = 0; +#endif + + return FFI_OK; +} + +#if defined (__APPLE__) +/* Perform Apple-specific cif processing for variadic calls */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, + unsigned int ntotalargs) +{ + ffi_status status = ffi_prep_cif_machdep (cif); + cif->aarch64_nfixedargs = nfixedargs; + return status; +} +#else +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsigned int ntotalargs) +{ + ffi_status status = ffi_prep_cif_machdep (cif); + cif->flags |= AARCH64_FLAG_VARARG; + return status; +} +#endif /* __APPLE__ */ + +extern void ffi_call_SYSV (struct call_context *context, void *frame, + void (*fn)(void), void *rvalue, int flags, + void *closure) FFI_HIDDEN; + +/* Call a function with the provided arguments and capture the return + value. */ +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue, + void **avalue, void *closure) +{ + struct call_context *context; + void *stack, *frame, *rvalue; + struct arg_state state; + size_t stack_bytes, rtype_size, rsize; + int i, nargs, flags, isvariadic = 0; + ffi_type *rtype; + + flags = cif->flags; + rtype = cif->rtype; + rtype_size = rtype->size; + stack_bytes = cif->bytes; + + if (flags & AARCH64_FLAG_VARARG) + { + isvariadic = 1; + flags &= ~AARCH64_FLAG_VARARG; + } + + /* If the target function returns a structure via hidden pointer, + then we cannot allow a null rvalue. Otherwise, mash a null + rvalue to void return type. */ + rsize = 0; + if (flags & AARCH64_RET_IN_MEM) + { + if (orig_rvalue == NULL) + rsize = rtype_size; + } + else if (orig_rvalue == NULL) + flags &= AARCH64_FLAG_ARG_V; + else if (flags & AARCH64_RET_NEED_COPY) + rsize = 16; + + /* Allocate consectutive stack for everything we'll need. */ + context = alloca (sizeof(struct call_context) + stack_bytes + 32 + rsize); + stack = context + 1; + frame = (void*)((uintptr_t)stack + (uintptr_t)stack_bytes); + rvalue = (rsize ? (void*)((uintptr_t)frame + 32) : orig_rvalue); + + arg_init (&state); + for (i = 0, nargs = cif->nargs; i < nargs; i++) + { + ffi_type *ty = cif->arg_types[i]; + size_t s = ty->size; + void *a = avalue[i]; + int h, t; + + t = ty->type; + switch (t) + { + case FFI_TYPE_VOID: + FFI_ASSERT (0); + break; + + /* If the argument is a basic type the argument is allocated to an + appropriate register, or if none are available, to the stack. */ + case FFI_TYPE_INT: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + do_pointer: + { + ffi_arg ext = extend_integer_type (a, t); + if (state.ngrn < N_X_ARG_REG) + context->x[state.ngrn++] = ext; + else + { + void *d = allocate_to_stack (&state, stack, ty->alignment, s); + state.ngrn = N_X_ARG_REG; + /* Note that the default abi extends each argument + to a full 64-bit slot, while the iOS abi allocates + only enough space. */ +#ifdef __APPLE__ + memcpy(d, a, s); +#else + *(ffi_arg *)d = ext; +#endif + } + } + break; + + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + { + void *dest; + + h = is_vfp_type (ty); + if (h) + { + int elems = 4 - (h & 3); + if (cif->abi == FFI_WIN64 && isvariadic) + { + if (state.ngrn + elems <= N_X_ARG_REG) + { + dest = &context->x[state.ngrn]; + state.ngrn += elems; + extend_hfa_type(dest, a, h); + break; + } + state.nsrn = N_X_ARG_REG; + dest = allocate_to_stack(&state, stack, ty->alignment, s); + } + else + { + if (state.nsrn + elems <= N_V_ARG_REG) + { + dest = &context->v[state.nsrn]; + state.nsrn += elems; + extend_hfa_type (dest, a, h); + break; + } + state.nsrn = N_V_ARG_REG; + dest = allocate_to_stack (&state, stack, ty->alignment, s); + } + } + else if (s > 16) + { + /* If the argument is a composite type that is larger than 16 + bytes, then the argument has been copied to memory, and + the argument is replaced by a pointer to the copy. */ + a = &avalue[i]; + t = FFI_TYPE_POINTER; + s = sizeof (void *); + goto do_pointer; + } + else + { + size_t n = (s + 7) / 8; + if (state.ngrn + n <= N_X_ARG_REG) + { + /* If the argument is a composite type and the size in + double-words is not more than the number of available + X registers, then the argument is copied into + consecutive X registers. */ + dest = &context->x[state.ngrn]; + state.ngrn += (unsigned int)n; + } + else + { + /* Otherwise, there are insufficient X registers. Further + X register allocations are prevented, the NSAA is + adjusted and the argument is copied to memory at the + adjusted NSAA. */ + state.ngrn = N_X_ARG_REG; + dest = allocate_to_stack (&state, stack, ty->alignment, s); + } + } + memcpy (dest, a, s); + } + break; + + default: + abort(); + } + +#if defined (__APPLE__) + if (i + 1 == cif->aarch64_nfixedargs) + { + state.ngrn = N_X_ARG_REG; + state.nsrn = N_V_ARG_REG; + state.allocating_variadic = 1; + } +#endif + } + + ffi_call_SYSV (context, frame, fn, rvalue, flags, closure); + + if (flags & AARCH64_RET_NEED_COPY) + memcpy (orig_rvalue, rvalue, rtype_size); +} + +void +ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +#ifdef FFI_GO_CLOSURES +void +ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} +#endif /* FFI_GO_CLOSURES */ + +/* Build a trampoline. */ + +extern void ffi_closure_SYSV (void) FFI_HIDDEN; +extern void ffi_closure_SYSV_V (void) FFI_HIDDEN; + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + void (*start)(void); + + if (cif->flags & AARCH64_FLAG_ARG_V) + start = ffi_closure_SYSV_V; + else + start = ffi_closure_SYSV; + +#if FFI_EXEC_TRAMPOLINE_TABLE +#ifdef __MACH__ +#ifdef HAVE_PTRAUTH + codeloc = ptrauth_strip (codeloc, ptrauth_key_asia); +#endif + void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE); + config[0] = closure; + config[1] = start; +#endif +#else + static const unsigned char trampoline[16] = { + 0x90, 0x00, 0x00, 0x58, /* ldr x16, tramp+16 */ + 0xf1, 0xff, 0xff, 0x10, /* adr x17, tramp+0 */ + 0x00, 0x02, 0x1f, 0xd6 /* br x16 */ + }; + char *tramp = closure->tramp; + + memcpy (tramp, trampoline, sizeof(trampoline)); + + *(UINT64 *)(tramp + 16) = (uintptr_t)start; + + ffi_clear_cache(tramp, tramp + FFI_TRAMPOLINE_SIZE); + + /* Also flush the cache for code mapping. */ +#ifdef _WIN32 + // Not using dlmalloc.c for Windows ARM64 builds + // so calling ffi_data_to_code_pointer() isn't necessary + unsigned char *tramp_code = tramp; + #else + unsigned char *tramp_code = ffi_data_to_code_pointer (tramp); + #endif + ffi_clear_cache (tramp_code, tramp_code + FFI_TRAMPOLINE_SIZE); +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#ifdef FFI_GO_CLOSURES +extern void ffi_go_closure_SYSV (void) FFI_HIDDEN; +extern void ffi_go_closure_SYSV_V (void) FFI_HIDDEN; + +ffi_status +ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*)) +{ + void (*start)(void); + + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + if (cif->flags & AARCH64_FLAG_ARG_V) + start = ffi_go_closure_SYSV_V; + else + start = ffi_go_closure_SYSV; + + closure->tramp = start; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} +#endif /* FFI_GO_CLOSURES */ + +/* Primary handler to setup and invoke a function within a closure. + + A closure when invoked enters via the assembler wrapper + ffi_closure_SYSV(). The wrapper allocates a call context on the + stack, saves the interesting registers (from the perspective of + the calling convention) into the context then passes control to + ffi_closure_SYSV_inner() passing the saved context and a pointer to + the stack at the point ffi_closure_SYSV() was invoked. + + On the return path the assembler wrapper will reload call context + registers. + + ffi_closure_SYSV_inner() marshalls the call context into ffi value + descriptors, invokes the wrapped function, then marshalls the return + value back into the call context. */ + +int FFI_HIDDEN +ffi_closure_SYSV_inner (ffi_cif *cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + struct call_context *context, + void *stack, void *rvalue, void *struct_rvalue) +{ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + int i, h, nargs, flags; + struct arg_state state; + + arg_init (&state); + + for (i = 0, nargs = cif->nargs; i < nargs; i++) + { + ffi_type *ty = cif->arg_types[i]; + int t = ty->type; + size_t n, s = ty->size; + + switch (t) + { + case FFI_TYPE_VOID: + FFI_ASSERT (0); + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + avalue[i] = allocate_int_to_reg_or_stack (context, &state, stack, s); + break; + + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + h = is_vfp_type (ty); + if (h) + { + n = 4 - (h & 3); +#ifdef _WIN32 /* for handling armasm calling convention */ + if (cif->is_variadic) + { + if (state.ngrn + n <= N_X_ARG_REG) + { + void *reg = &context->x[state.ngrn]; + state.ngrn += (unsigned int)n; + + /* Eeek! We need a pointer to the structure, however the + homogeneous float elements are being passed in individual + registers, therefore for float and double the structure + is not represented as a contiguous sequence of bytes in + our saved register context. We don't need the original + contents of the register storage, so we reformat the + structure into the same memory. */ + avalue[i] = compress_hfa_type(reg, reg, h); + } + else + { + state.ngrn = N_X_ARG_REG; + state.nsrn = N_V_ARG_REG; + avalue[i] = allocate_to_stack(&state, stack, + ty->alignment, s); + } + } + else + { +#endif /* for handling armasm calling convention */ + if (state.nsrn + n <= N_V_ARG_REG) + { + void *reg = &context->v[state.nsrn]; + state.nsrn += (unsigned int)n; + avalue[i] = compress_hfa_type(reg, reg, h); + } + else + { + state.nsrn = N_V_ARG_REG; + avalue[i] = allocate_to_stack(&state, stack, + ty->alignment, s); + } +#ifdef _WIN32 /* for handling armasm calling convention */ + } +#endif /* for handling armasm calling convention */ + } + else if (s > 16) + { + /* Replace Composite type of size greater than 16 with a + pointer. */ + avalue[i] = *(void **) + allocate_int_to_reg_or_stack (context, &state, stack, + sizeof (void *)); + } + else + { + n = (s + 7) / 8; + if (state.ngrn + n <= N_X_ARG_REG) + { + avalue[i] = &context->x[state.ngrn]; + state.ngrn += (unsigned int)n; + } + else + { + state.ngrn = N_X_ARG_REG; + avalue[i] = allocate_to_stack(&state, stack, + ty->alignment, s); + } + } + break; + + default: + abort(); + } + +#if defined (__APPLE__) + if (i + 1 == cif->aarch64_nfixedargs) + { + state.ngrn = N_X_ARG_REG; + state.nsrn = N_V_ARG_REG; + state.allocating_variadic = 1; + } +#endif + } + + flags = cif->flags; + if (flags & AARCH64_RET_IN_MEM) + rvalue = struct_rvalue; + + fun (cif, rvalue, avalue, user_data); + + return flags; +} + +#endif /* (__aarch64__) || defined(__arm64__)|| defined (_M_ARM64)*/ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/ffitarget.h new file mode 100644 index 000000000000..d5622e133625 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/ffitarget.h @@ -0,0 +1,97 @@ +/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +#ifdef __ILP32__ +#define FFI_SIZEOF_ARG 8 +#define FFI_SIZEOF_JAVA_RAW 4 +typedef unsigned long long ffi_arg; +typedef signed long long ffi_sarg; +#elif defined(_WIN32) +#define FFI_SIZEOF_ARG 8 +typedef unsigned long long ffi_arg; +typedef signed long long ffi_sarg; +#else +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; +#endif + +typedef enum ffi_abi + { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_WIN64, + FFI_LAST_ABI, +#if defined(_WIN32) + FFI_DEFAULT_ABI = FFI_WIN64 +#else + FFI_DEFAULT_ABI = FFI_SYSV +#endif + } ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +#if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#define FFI_TRAMPOLINE_SIZE 16 +#define FFI_TRAMPOLINE_CLOSURE_OFFSET 16 +#else +#error "No trampoline table implementation" +#endif + +#else +#define FFI_TRAMPOLINE_SIZE 24 +#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE +#endif + +#ifdef _WIN32 +#define FFI_EXTRA_CIF_FIELDS unsigned is_variadic +#endif +#define FFI_TARGET_SPECIFIC_VARIADIC + +/* ---- Internal ---- */ + +#if defined (__APPLE__) +#define FFI_EXTRA_CIF_FIELDS unsigned aarch64_nfixedargs +#elif !defined(_WIN32) +/* iOS and Windows reserve x18 for the system. Disable Go closures until + a new static chain is chosen. */ +#define FFI_GO_CLOSURES 1 +#endif + +#ifndef _WIN32 +/* No complex type on Windows */ +#define FFI_TARGET_HAS_COMPLEX_TYPE +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/internal.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/internal.h new file mode 100644 index 000000000000..3d4d0355ba5f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/internal.h @@ -0,0 +1,68 @@ +/* +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#define AARCH64_RET_VOID 0 +#define AARCH64_RET_INT64 1 +#define AARCH64_RET_INT128 2 + +#define AARCH64_RET_UNUSED3 3 +#define AARCH64_RET_UNUSED4 4 +#define AARCH64_RET_UNUSED5 5 +#define AARCH64_RET_UNUSED6 6 +#define AARCH64_RET_UNUSED7 7 + +/* Note that FFI_TYPE_FLOAT == 2, _DOUBLE == 3, _LONGDOUBLE == 4, + so _S4 through _Q1 are layed out as (TYPE * 4) + (4 - COUNT). */ +#define AARCH64_RET_S4 8 +#define AARCH64_RET_S3 9 +#define AARCH64_RET_S2 10 +#define AARCH64_RET_S1 11 + +#define AARCH64_RET_D4 12 +#define AARCH64_RET_D3 13 +#define AARCH64_RET_D2 14 +#define AARCH64_RET_D1 15 + +#define AARCH64_RET_Q4 16 +#define AARCH64_RET_Q3 17 +#define AARCH64_RET_Q2 18 +#define AARCH64_RET_Q1 19 + +/* Note that each of the sub-64-bit integers gets two entries. */ +#define AARCH64_RET_UINT8 20 +#define AARCH64_RET_UINT16 22 +#define AARCH64_RET_UINT32 24 + +#define AARCH64_RET_SINT8 26 +#define AARCH64_RET_SINT16 28 +#define AARCH64_RET_SINT32 30 + +#define AARCH64_RET_MASK 31 + +#define AARCH64_RET_IN_MEM (1 << 5) +#define AARCH64_RET_NEED_COPY (1 << 6) + +#define AARCH64_FLAG_ARG_V_BIT 7 +#define AARCH64_FLAG_ARG_V (1 << AARCH64_FLAG_ARG_V_BIT) +#define AARCH64_FLAG_VARARG (1 << 8) + +#define N_X_ARG_REG 8 +#define N_V_ARG_REG 8 +#define CALL_CONTEXT_SIZE (N_V_ARG_REG * 16 + N_X_ARG_REG * 8) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/sysv.S new file mode 100644 index 000000000000..b720a92e168f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/sysv.S @@ -0,0 +1,451 @@ +/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#if defined(__aarch64__) || defined(__arm64__) +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "internal.h" + +#ifdef HAVE_MACHINE_ASM_H +#include <machine/asm.h> +#else +#ifdef __USER_LABEL_PREFIX__ +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +/* Use the right prefix for global labels. */ +#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) +#else +#define CNAME(x) x +#endif +#endif + +#ifdef __AARCH64EB__ +# define BE(X) X +#else +# define BE(X) 0 +#endif + +#ifdef __ILP32__ +#define PTR_REG(n) w##n +#else +#define PTR_REG(n) x##n +#endif + +#ifdef __ILP32__ +#define PTR_SIZE 4 +#else +#define PTR_SIZE 8 +#endif + +#if FFI_EXEC_TRAMPOLINE_TABLE && defined(__MACH__) && defined(HAVE_PTRAUTH) +# define BR(r) braaz r +# define BLR(r) blraaz r +#else +# define BR(r) br r +# define BLR(r) blr r +#endif + + .text + .align 4 + +/* ffi_call_SYSV + extern void ffi_call_SYSV (void *stack, void *frame, + void (*fn)(void), void *rvalue, + int flags, void *closure); + + Therefore on entry we have: + + x0 stack + x1 frame + x2 fn + x3 rvalue + x4 flags + x5 closure +*/ + + cfi_startproc +CNAME(ffi_call_SYSV): + /* Use a stack frame allocated by our caller. */ + cfi_def_cfa(x1, 32); + stp x29, x30, [x1] + mov x29, x1 + mov sp, x0 + cfi_def_cfa_register(x29) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) + + mov x9, x2 /* save fn */ + mov x8, x3 /* install structure return */ +#ifdef FFI_GO_CLOSURES + mov x18, x5 /* install static chain */ +#endif + stp x3, x4, [x29, #16] /* save rvalue and flags */ + + /* Load the vector argument passing registers, if necessary. */ + tbz w4, #AARCH64_FLAG_ARG_V_BIT, 1f + ldp q0, q1, [sp, #0] + ldp q2, q3, [sp, #32] + ldp q4, q5, [sp, #64] + ldp q6, q7, [sp, #96] +1: + /* Load the core argument passing registers, including + the structure return pointer. */ + ldp x0, x1, [sp, #16*N_V_ARG_REG + 0] + ldp x2, x3, [sp, #16*N_V_ARG_REG + 16] + ldp x4, x5, [sp, #16*N_V_ARG_REG + 32] + ldp x6, x7, [sp, #16*N_V_ARG_REG + 48] + + /* Deallocate the context, leaving the stacked arguments. */ + add sp, sp, #CALL_CONTEXT_SIZE + + BLR(x9) /* call fn */ + + ldp x3, x4, [x29, #16] /* reload rvalue and flags */ + + /* Partially deconstruct the stack frame. */ + mov sp, x29 + cfi_def_cfa_register (sp) + ldp x29, x30, [x29] + + /* Save the return value as directed. */ + adr x5, 0f + and w4, w4, #AARCH64_RET_MASK + add x5, x5, x4, lsl #3 + br x5 + + /* Note that each table entry is 2 insns, and thus 8 bytes. + For integer data, note that we're storing into ffi_arg + and therefore we want to extend to 64 bits; these types + have two consecutive entries allocated for them. */ + .align 4 +0: ret /* VOID */ + nop +1: str x0, [x3] /* INT64 */ + ret +2: stp x0, x1, [x3] /* INT128 */ + ret +3: brk #1000 /* UNUSED */ + ret +4: brk #1000 /* UNUSED */ + ret +5: brk #1000 /* UNUSED */ + ret +6: brk #1000 /* UNUSED */ + ret +7: brk #1000 /* UNUSED */ + ret +8: st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */ + ret +9: st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */ + ret +10: stp s0, s1, [x3] /* S2 */ + ret +11: str s0, [x3] /* S1 */ + ret +12: st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */ + ret +13: st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */ + ret +14: stp d0, d1, [x3] /* D2 */ + ret +15: str d0, [x3] /* D1 */ + ret +16: str q3, [x3, #48] /* Q4 */ + nop +17: str q2, [x3, #32] /* Q3 */ + nop +18: stp q0, q1, [x3] /* Q2 */ + ret +19: str q0, [x3] /* Q1 */ + ret +20: uxtb w0, w0 /* UINT8 */ + str x0, [x3] +21: ret /* reserved */ + nop +22: uxth w0, w0 /* UINT16 */ + str x0, [x3] +23: ret /* reserved */ + nop +24: mov w0, w0 /* UINT32 */ + str x0, [x3] +25: ret /* reserved */ + nop +26: sxtb x0, w0 /* SINT8 */ + str x0, [x3] +27: ret /* reserved */ + nop +28: sxth x0, w0 /* SINT16 */ + str x0, [x3] +29: ret /* reserved */ + nop +30: sxtw x0, w0 /* SINT32 */ + str x0, [x3] +31: ret /* reserved */ + nop + + cfi_endproc + + .globl CNAME(ffi_call_SYSV) + FFI_HIDDEN(CNAME(ffi_call_SYSV)) +#ifdef __ELF__ + .type CNAME(ffi_call_SYSV), #function + .size CNAME(ffi_call_SYSV), .-CNAME(ffi_call_SYSV) +#endif + +/* ffi_closure_SYSV + + Closure invocation glue. This is the low level code invoked directly by + the closure trampoline to setup and call a closure. + + On entry x17 points to a struct ffi_closure, x16 has been clobbered + all other registers are preserved. + + We allocate a call context and save the argument passing registers, + then invoked the generic C ffi_closure_SYSV_inner() function to do all + the real work, on return we load the result passing registers back from + the call context. +*/ + +#define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64) + + .align 4 +CNAME(ffi_closure_SYSV_V): + cfi_startproc + stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! + cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) + + /* Save the argument passing vector registers. */ + stp q0, q1, [sp, #16 + 0] + stp q2, q3, [sp, #16 + 32] + stp q4, q5, [sp, #16 + 64] + stp q6, q7, [sp, #16 + 96] + b 0f + cfi_endproc + + .globl CNAME(ffi_closure_SYSV_V) + FFI_HIDDEN(CNAME(ffi_closure_SYSV_V)) +#ifdef __ELF__ + .type CNAME(ffi_closure_SYSV_V), #function + .size CNAME(ffi_closure_SYSV_V), . - CNAME(ffi_closure_SYSV_V) +#endif + + .align 4 + cfi_startproc +CNAME(ffi_closure_SYSV): + stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! + cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) +0: + mov x29, sp + + /* Save the argument passing core registers. */ + stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] + stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] + stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] + stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] + + /* Load ffi_closure_inner arguments. */ + ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */ + ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */ +.Ldo_closure: + add x3, sp, #16 /* load context */ + add x4, sp, #ffi_closure_SYSV_FS /* load stack */ + add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */ + mov x6, x8 /* load struct_rval */ + bl CNAME(ffi_closure_SYSV_inner) + + /* Load the return value as directed. */ +#if FFI_EXEC_TRAMPOLINE_TABLE && defined(__MACH__) && defined(HAVE_PTRAUTH) + autiza x1 +#endif + adr x1, 0f + and w0, w0, #AARCH64_RET_MASK + add x1, x1, x0, lsl #3 + add x3, sp, #16+CALL_CONTEXT_SIZE + br x1 + + /* Note that each table entry is 2 insns, and thus 8 bytes. */ + .align 4 +0: b 99f /* VOID */ + nop +1: ldr x0, [x3] /* INT64 */ + b 99f +2: ldp x0, x1, [x3] /* INT128 */ + b 99f +3: brk #1000 /* UNUSED */ + nop +4: brk #1000 /* UNUSED */ + nop +5: brk #1000 /* UNUSED */ + nop +6: brk #1000 /* UNUSED */ + nop +7: brk #1000 /* UNUSED */ + nop +8: ldr s3, [x3, #12] /* S4 */ + nop +9: ldr s2, [x3, #8] /* S3 */ + nop +10: ldp s0, s1, [x3] /* S2 */ + b 99f +11: ldr s0, [x3] /* S1 */ + b 99f +12: ldr d3, [x3, #24] /* D4 */ + nop +13: ldr d2, [x3, #16] /* D3 */ + nop +14: ldp d0, d1, [x3] /* D2 */ + b 99f +15: ldr d0, [x3] /* D1 */ + b 99f +16: ldr q3, [x3, #48] /* Q4 */ + nop +17: ldr q2, [x3, #32] /* Q3 */ + nop +18: ldp q0, q1, [x3] /* Q2 */ + b 99f +19: ldr q0, [x3] /* Q1 */ + b 99f +20: ldrb w0, [x3, #BE(7)] /* UINT8 */ + b 99f +21: brk #1000 /* reserved */ + nop +22: ldrh w0, [x3, #BE(6)] /* UINT16 */ + b 99f +23: brk #1000 /* reserved */ + nop +24: ldr w0, [x3, #BE(4)] /* UINT32 */ + b 99f +25: brk #1000 /* reserved */ + nop +26: ldrsb x0, [x3, #BE(7)] /* SINT8 */ + b 99f +27: brk #1000 /* reserved */ + nop +28: ldrsh x0, [x3, #BE(6)] /* SINT16 */ + b 99f +29: brk #1000 /* reserved */ + nop +30: ldrsw x0, [x3, #BE(4)] /* SINT32 */ + nop +31: /* reserved */ +99: ldp x29, x30, [sp], #ffi_closure_SYSV_FS + cfi_adjust_cfa_offset (-ffi_closure_SYSV_FS) + cfi_restore (x29) + cfi_restore (x30) + ret + cfi_endproc + + .globl CNAME(ffi_closure_SYSV) + FFI_HIDDEN(CNAME(ffi_closure_SYSV)) +#ifdef __ELF__ + .type CNAME(ffi_closure_SYSV), #function + .size CNAME(ffi_closure_SYSV), . - CNAME(ffi_closure_SYSV) +#endif + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#include <mach/machine/vm_param.h> + .align PAGE_MAX_SHIFT +CNAME(ffi_closure_trampoline_table_page): + .rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE + adr x16, -PAGE_MAX_SIZE + ldp x17, x16, [x16] + BR(x16) + nop /* each entry in the trampoline config page is 2*sizeof(void*) so the trampoline itself cannot be smaller than 16 bytes */ + .endr + + .globl CNAME(ffi_closure_trampoline_table_page) + FFI_HIDDEN(CNAME(ffi_closure_trampoline_table_page)) + #ifdef __ELF__ + .type CNAME(ffi_closure_trampoline_table_page), #function + .size CNAME(ffi_closure_trampoline_table_page), . - CNAME(ffi_closure_trampoline_table_page) + #endif +#endif + +#endif /* FFI_EXEC_TRAMPOLINE_TABLE */ + +#ifdef FFI_GO_CLOSURES + .align 4 +CNAME(ffi_go_closure_SYSV_V): + cfi_startproc + stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! + cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) + + /* Save the argument passing vector registers. */ + stp q0, q1, [sp, #16 + 0] + stp q2, q3, [sp, #16 + 32] + stp q4, q5, [sp, #16 + 64] + stp q6, q7, [sp, #16 + 96] + b 0f + cfi_endproc + + .globl CNAME(ffi_go_closure_SYSV_V) + FFI_HIDDEN(CNAME(ffi_go_closure_SYSV_V)) +#ifdef __ELF__ + .type CNAME(ffi_go_closure_SYSV_V), #function + .size CNAME(ffi_go_closure_SYSV_V), . - CNAME(ffi_go_closure_SYSV_V) +#endif + + .align 4 + cfi_startproc +CNAME(ffi_go_closure_SYSV): + stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! + cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) +0: + mov x29, sp + + /* Save the argument passing core registers. */ + stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] + stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] + stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] + stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] + + /* Load ffi_closure_inner arguments. */ + ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */ + mov x2, x18 /* load user_data */ + b .Ldo_closure + cfi_endproc + + .globl CNAME(ffi_go_closure_SYSV) + FFI_HIDDEN(CNAME(ffi_go_closure_SYSV)) +#ifdef __ELF__ + .type CNAME(ffi_go_closure_SYSV), #function + .size CNAME(ffi_go_closure_SYSV), . - CNAME(ffi_go_closure_SYSV) +#endif +#endif /* FFI_GO_CLOSURES */ +#endif /* __arm64__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",%progbits +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/win64_armasm.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/win64_armasm.S new file mode 100644 index 000000000000..7fc185b3d8ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/aarch64/win64_armasm.S @@ -0,0 +1,506 @@ +/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "internal.h" + + OPT 2 /*disable listing */ +/* For some macros to add unwind information */ +#include "ksarm64.h" + OPT 1 /*re-enable listing */ + +#define BE(X) 0 +#define PTR_REG(n) x##n +#define PTR_SIZE 8 + + IMPORT ffi_closure_SYSV_inner + EXPORT ffi_call_SYSV + EXPORT ffi_closure_SYSV_V + EXPORT ffi_closure_SYSV + EXPORT extend_hfa_type + EXPORT compress_hfa_type +#ifdef FFI_GO_CLOSURES + EXPORT ffi_go_closure_SYSV_V + EXPORT ffi_go_closure_SYSV +#endif + + TEXTAREA, ALIGN=8 + +/* ffi_call_SYSV + extern void ffi_call_SYSV (void *stack, void *frame, + void (*fn)(void), void *rvalue, + int flags, void *closure); + Therefore on entry we have: + x0 stack + x1 frame + x2 fn + x3 rvalue + x4 flags + x5 closure +*/ + + NESTED_ENTRY ffi_call_SYSV_fake + + /* For unwind information, Windows has to store fp and lr */ + PROLOG_SAVE_REG_PAIR x29, x30, #-32! + + ALTERNATE_ENTRY ffi_call_SYSV + /* Use a stack frame allocated by our caller. */ + stp x29, x30, [x1] + mov x29, x1 + mov sp, x0 + + mov x9, x2 /* save fn */ + mov x8, x3 /* install structure return */ +#ifdef FFI_GO_CLOSURES + /*mov x18, x5 install static chain */ +#endif + stp x3, x4, [x29, #16] /* save rvalue and flags */ + + /* Load the vector argument passing registers, if necessary. */ + tbz x4, #AARCH64_FLAG_ARG_V_BIT, ffi_call_SYSV_L1 + ldp q0, q1, [sp, #0] + ldp q2, q3, [sp, #32] + ldp q4, q5, [sp, #64] + ldp q6, q7, [sp, #96] + +ffi_call_SYSV_L1 + /* Load the core argument passing registers, including + the structure return pointer. */ + ldp x0, x1, [sp, #16*N_V_ARG_REG + 0] + ldp x2, x3, [sp, #16*N_V_ARG_REG + 16] + ldp x4, x5, [sp, #16*N_V_ARG_REG + 32] + ldp x6, x7, [sp, #16*N_V_ARG_REG + 48] + + /* Deallocate the context, leaving the stacked arguments. */ + add sp, sp, #CALL_CONTEXT_SIZE + + blr x9 /* call fn */ + + ldp x3, x4, [x29, #16] /* reload rvalue and flags */ + + /* Partially deconstruct the stack frame. */ + mov sp, x29 + ldp x29, x30, [x29] + + /* Save the return value as directed. */ + adr x5, ffi_call_SYSV_return + and w4, w4, #AARCH64_RET_MASK + add x5, x5, x4, lsl #3 + br x5 + + /* Note that each table entry is 2 insns, and thus 8 bytes. + For integer data, note that we're storing into ffi_arg + and therefore we want to extend to 64 bits; these types + have two consecutive entries allocated for them. */ + ALIGN 4 +ffi_call_SYSV_return + ret /* VOID */ + nop + str x0, [x3] /* INT64 */ + ret + stp x0, x1, [x3] /* INT128 */ + ret + brk #1000 /* UNUSED */ + ret + brk #1000 /* UNUSED */ + ret + brk #1000 /* UNUSED */ + ret + brk #1000 /* UNUSED */ + ret + brk #1000 /* UNUSED */ + ret + st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */ + ret + st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */ + ret + stp s0, s1, [x3] /* S2 */ + ret + str s0, [x3] /* S1 */ + ret + st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */ + ret + st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */ + ret + stp d0, d1, [x3] /* D2 */ + ret + str d0, [x3] /* D1 */ + ret + str q3, [x3, #48] /* Q4 */ + nop + str q2, [x3, #32] /* Q3 */ + nop + stp q0, q1, [x3] /* Q2 */ + ret + str q0, [x3] /* Q1 */ + ret + uxtb w0, w0 /* UINT8 */ + str x0, [x3] + ret /* reserved */ + nop + uxth w0, w0 /* UINT16 */ + str x0, [x3] + ret /* reserved */ + nop + mov w0, w0 /* UINT32 */ + str x0, [x3] + ret /* reserved */ + nop + sxtb x0, w0 /* SINT8 */ + str x0, [x3] + ret /* reserved */ + nop + sxth x0, w0 /* SINT16 */ + str x0, [x3] + ret /* reserved */ + nop + sxtw x0, w0 /* SINT32 */ + str x0, [x3] + ret /* reserved */ + nop + + + NESTED_END ffi_call_SYSV_fake + + +/* ffi_closure_SYSV + Closure invocation glue. This is the low level code invoked directly by + the closure trampoline to setup and call a closure. + On entry x17 points to a struct ffi_closure, x16 has been clobbered + all other registers are preserved. + We allocate a call context and save the argument passing registers, + then invoked the generic C ffi_closure_SYSV_inner() function to do all + the real work, on return we load the result passing registers back from + the call context. +*/ + +#define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64) + + NESTED_ENTRY ffi_closure_SYSV_V + PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! + + /* Save the argument passing vector registers. */ + stp q0, q1, [sp, #16 + 0] + stp q2, q3, [sp, #16 + 32] + stp q4, q5, [sp, #16 + 64] + stp q6, q7, [sp, #16 + 96] + + b ffi_closure_SYSV_save_argument + NESTED_END ffi_closure_SYSV_V + + NESTED_ENTRY ffi_closure_SYSV + PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! + +ffi_closure_SYSV_save_argument + /* Save the argument passing core registers. */ + stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] + stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] + stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] + stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] + + /* Load ffi_closure_inner arguments. */ + ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */ + ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */ + +do_closure + add x3, sp, #16 /* load context */ + add x4, sp, #ffi_closure_SYSV_FS /* load stack */ + add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */ + mov x6, x8 /* load struct_rval */ + + bl ffi_closure_SYSV_inner + + /* Load the return value as directed. */ + adr x1, ffi_closure_SYSV_return_base + and w0, w0, #AARCH64_RET_MASK + add x1, x1, x0, lsl #3 + add x3, sp, #16+CALL_CONTEXT_SIZE + br x1 + + /* Note that each table entry is 2 insns, and thus 8 bytes. */ + ALIGN 8 +ffi_closure_SYSV_return_base + b ffi_closure_SYSV_epilog /* VOID */ + nop + ldr x0, [x3] /* INT64 */ + b ffi_closure_SYSV_epilog + ldp x0, x1, [x3] /* INT128 */ + b ffi_closure_SYSV_epilog + brk #1000 /* UNUSED */ + nop + brk #1000 /* UNUSED */ + nop + brk #1000 /* UNUSED */ + nop + brk #1000 /* UNUSED */ + nop + brk #1000 /* UNUSED */ + nop + ldr s3, [x3, #12] /* S4 */ + nop + ldr s2, [x3, #8] /* S3 */ + nop + ldp s0, s1, [x3] /* S2 */ + b ffi_closure_SYSV_epilog + ldr s0, [x3] /* S1 */ + b ffi_closure_SYSV_epilog + ldr d3, [x3, #24] /* D4 */ + nop + ldr d2, [x3, #16] /* D3 */ + nop + ldp d0, d1, [x3] /* D2 */ + b ffi_closure_SYSV_epilog + ldr d0, [x3] /* D1 */ + b ffi_closure_SYSV_epilog + ldr q3, [x3, #48] /* Q4 */ + nop + ldr q2, [x3, #32] /* Q3 */ + nop + ldp q0, q1, [x3] /* Q2 */ + b ffi_closure_SYSV_epilog + ldr q0, [x3] /* Q1 */ + b ffi_closure_SYSV_epilog + ldrb w0, [x3, #BE(7)] /* UINT8 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldrh w0, [x3, #BE(6)] /* UINT16 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldr w0, [x3, #BE(4)] /* UINT32 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldrsb x0, [x3, #BE(7)] /* SINT8 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldrsh x0, [x3, #BE(6)] /* SINT16 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldrsw x0, [x3, #BE(4)] /* SINT32 */ + nop + /* reserved */ + +ffi_closure_SYSV_epilog + EPILOG_RESTORE_REG_PAIR x29, x30, #ffi_closure_SYSV_FS! + EPILOG_RETURN + NESTED_END ffi_closure_SYSV + + +#ifdef FFI_GO_CLOSURES + NESTED_ENTRY ffi_go_closure_SYSV_V + PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! + + /* Save the argument passing vector registers. */ + stp q0, q1, [sp, #16 + 0] + stp q2, q3, [sp, #16 + 32] + stp q4, q5, [sp, #16 + 64] + stp q6, q7, [sp, #16 + 96] + b ffi_go_closure_SYSV_save_argument + NESTED_END ffi_go_closure_SYSV_V + + NESTED_ENTRY ffi_go_closure_SYSV + PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! + +ffi_go_closure_SYSV_save_argument + /* Save the argument passing core registers. */ + stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] + stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] + stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] + stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] + + /* Load ffi_closure_inner arguments. */ + ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */ + mov x2, x18 /* load user_data */ + b do_closure + NESTED_END ffi_go_closure_SYSV + +#endif /* FFI_GO_CLOSURES */ + + +/* void extend_hfa_type (void *dest, void *src, int h) */ + + LEAF_ENTRY extend_hfa_type + + adr x3, extend_hfa_type_jump_base + and w2, w2, #AARCH64_RET_MASK + sub x2, x2, #AARCH64_RET_S4 + add x3, x3, x2, lsl #4 + br x3 + + ALIGN 4 +extend_hfa_type_jump_base + ldp s16, s17, [x1] /* S4 */ + ldp s18, s19, [x1, #8] + b extend_hfa_type_store_4 + nop + + ldp s16, s17, [x1] /* S3 */ + ldr s18, [x1, #8] + b extend_hfa_type_store_3 + nop + + ldp s16, s17, [x1] /* S2 */ + b extend_hfa_type_store_2 + nop + nop + + ldr s16, [x1] /* S1 */ + b extend_hfa_type_store_1 + nop + nop + + ldp d16, d17, [x1] /* D4 */ + ldp d18, d19, [x1, #16] + b extend_hfa_type_store_4 + nop + + ldp d16, d17, [x1] /* D3 */ + ldr d18, [x1, #16] + b extend_hfa_type_store_3 + nop + + ldp d16, d17, [x1] /* D2 */ + b extend_hfa_type_store_2 + nop + nop + + ldr d16, [x1] /* D1 */ + b extend_hfa_type_store_1 + nop + nop + + ldp q16, q17, [x1] /* Q4 */ + ldp q18, q19, [x1, #16] + b extend_hfa_type_store_4 + nop + + ldp q16, q17, [x1] /* Q3 */ + ldr q18, [x1, #16] + b extend_hfa_type_store_3 + nop + + ldp q16, q17, [x1] /* Q2 */ + b extend_hfa_type_store_2 + nop + nop + + ldr q16, [x1] /* Q1 */ + b extend_hfa_type_store_1 + +extend_hfa_type_store_4 + str q19, [x0, #48] +extend_hfa_type_store_3 + str q18, [x0, #32] +extend_hfa_type_store_2 + str q17, [x0, #16] +extend_hfa_type_store_1 + str q16, [x0] + ret + + LEAF_END extend_hfa_type + + +/* void compress_hfa_type (void *dest, void *reg, int h) */ + + LEAF_ENTRY compress_hfa_type + + adr x3, compress_hfa_type_jump_base + and w2, w2, #AARCH64_RET_MASK + sub x2, x2, #AARCH64_RET_S4 + add x3, x3, x2, lsl #4 + br x3 + + ALIGN 4 +compress_hfa_type_jump_base + ldp q16, q17, [x1] /* S4 */ + ldp q18, q19, [x1, #32] + st4 { v16.s, v17.s, v18.s, v19.s }[0], [x0] + ret + + ldp q16, q17, [x1] /* S3 */ + ldr q18, [x1, #32] + st3 { v16.s, v17.s, v18.s }[0], [x0] + ret + + ldp q16, q17, [x1] /* S2 */ + st2 { v16.s, v17.s }[0], [x0] + ret + nop + + ldr q16, [x1] /* S1 */ + st1 { v16.s }[0], [x0] + ret + nop + + ldp q16, q17, [x1] /* D4 */ + ldp q18, q19, [x1, #32] + st4 { v16.d, v17.d, v18.d, v19.d }[0], [x0] + ret + + ldp q16, q17, [x1] /* D3 */ + ldr q18, [x1, #32] + st3 { v16.d, v17.d, v18.d }[0], [x0] + ret + + ldp q16, q17, [x1] /* D2 */ + st2 { v16.d, v17.d }[0], [x0] + ret + nop + + ldr q16, [x1] /* D1 */ + st1 { v16.d }[0], [x0] + ret + nop + + ldp q16, q17, [x1] /* Q4 */ + ldp q18, q19, [x1, #32] + b compress_hfa_type_store_q4 + nop + + ldp q16, q17, [x1] /* Q3 */ + ldr q18, [x1, #32] + b compress_hfa_type_store_q3 + nop + + ldp q16, q17, [x1] /* Q2 */ + stp q16, q17, [x0] + ret + nop + + ldr q16, [x1] /* Q1 */ + str q16, [x0] + ret + +compress_hfa_type_store_q4 + str q19, [x0, #48] +compress_hfa_type_store_q3 + str q18, [x0, #32] + stp q16, q17, [x0] + ret + + LEAF_END compress_hfa_type + + END \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/ffi.c new file mode 100644 index 000000000000..7a95e9707c3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/ffi.c @@ -0,0 +1,521 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2012 Anthony Green + Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc. + + Alpha Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> +#include <stdlib.h> +#include "internal.h" + +/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; + all further uses in this file will refer to the 128-bit type. */ +#if defined(__LONG_DOUBLE_128__) +# if FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +#else +# undef FFI_TYPE_LONGDOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#endif + +extern void ffi_call_osf(void *stack, void *frame, unsigned flags, + void *raddr, void (*fn)(void), void *closure) + FFI_HIDDEN; +extern void ffi_closure_osf(void) FFI_HIDDEN; +extern void ffi_go_closure_osf(void) FFI_HIDDEN; + +/* Promote a float value to its in-register double representation. + Unlike actually casting to double, this does not trap on NaN. */ +static inline UINT64 lds(void *ptr) +{ + UINT64 ret; + asm("lds %0,%1" : "=f"(ret) : "m"(*(UINT32 *)ptr)); + return ret; +} + +/* And the reverse. */ +static inline void sts(void *ptr, UINT64 val) +{ + asm("sts %1,%0" : "=m"(*(UINT32 *)ptr) : "f"(val)); +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep(ffi_cif *cif) +{ + size_t bytes = 0; + int flags, i, avn; + ffi_type *rtype, *itype; + + if (cif->abi != FFI_OSF) + return FFI_BAD_ABI; + + /* Compute the size of the argument area. */ + for (i = 0, avn = cif->nargs; i < avn; i++) + { + itype = cif->arg_types[i]; + switch (itype->type) + { + case FFI_TYPE_INT: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + /* All take one 8 byte slot. */ + bytes += 8; + break; + + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + /* Passed by value in N slots. */ + bytes += FFI_ALIGN(itype->size, FFI_SIZEOF_ARG); + break; + + case FFI_TYPE_COMPLEX: + /* _Complex long double passed by reference; others in 2 slots. */ + if (itype->elements[0]->type == FFI_TYPE_LONGDOUBLE) + bytes += 8; + else + bytes += 16; + break; + + default: + abort(); + } + } + + /* Set the return type flag */ + rtype = cif->rtype; + switch (rtype->type) + { + case FFI_TYPE_VOID: + flags = ALPHA_FLAGS(ALPHA_ST_VOID, ALPHA_LD_VOID); + break; + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT32); + break; + case FFI_TYPE_FLOAT: + flags = ALPHA_FLAGS(ALPHA_ST_FLOAT, ALPHA_LD_FLOAT); + break; + case FFI_TYPE_DOUBLE: + flags = ALPHA_FLAGS(ALPHA_ST_DOUBLE, ALPHA_LD_DOUBLE); + break; + case FFI_TYPE_UINT8: + flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT8); + break; + case FFI_TYPE_SINT8: + flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT8); + break; + case FFI_TYPE_UINT16: + flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT16); + break; + case FFI_TYPE_SINT16: + flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT16); + break; + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64); + break; + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_STRUCT: + /* Passed in memory, with a hidden pointer. */ + flags = ALPHA_RET_IN_MEM; + break; + case FFI_TYPE_COMPLEX: + itype = rtype->elements[0]; + switch (itype->type) + { + case FFI_TYPE_FLOAT: + flags = ALPHA_FLAGS(ALPHA_ST_CPLXF, ALPHA_LD_CPLXF); + break; + case FFI_TYPE_DOUBLE: + flags = ALPHA_FLAGS(ALPHA_ST_CPLXD, ALPHA_LD_CPLXD); + break; + default: + if (rtype->size <= 8) + flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64); + else + flags = ALPHA_RET_IN_MEM; + break; + } + break; + default: + abort(); + } + cif->flags = flags; + + /* Include the hidden structure pointer in args requirement. */ + if (flags == ALPHA_RET_IN_MEM) + bytes += 8; + /* Minimum size is 6 slots, so that ffi_call_osf can pop them. */ + if (bytes < 6*8) + bytes = 6*8; + cif->bytes = bytes; + + return FFI_OK; +} + +static unsigned long +extend_basic_type(void *valp, int type, int argn) +{ + switch (type) + { + case FFI_TYPE_SINT8: + return *(SINT8 *)valp; + case FFI_TYPE_UINT8: + return *(UINT8 *)valp; + case FFI_TYPE_SINT16: + return *(SINT16 *)valp; + case FFI_TYPE_UINT16: + return *(UINT16 *)valp; + + case FFI_TYPE_FLOAT: + if (argn < 6) + return lds(valp); + /* FALLTHRU */ + + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + /* Note that unsigned 32-bit quantities are sign extended. */ + return *(SINT32 *)valp; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + case FFI_TYPE_DOUBLE: + return *(UINT64 *)valp; + + default: + abort(); + } +} + +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + unsigned long *argp; + long i, avn, argn, flags = cif->flags; + ffi_type **arg_types; + void *frame; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + if (rvalue == NULL && flags == ALPHA_RET_IN_MEM) + rvalue = alloca(cif->rtype->size); + + /* Allocate the space for the arguments, plus 4 words of temp + space for ffi_call_osf. */ + argp = frame = alloca(cif->bytes + 4*FFI_SIZEOF_ARG); + frame += cif->bytes; + + argn = 0; + if (flags == ALPHA_RET_IN_MEM) + argp[argn++] = (unsigned long)rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0, avn = cif->nargs; i < avn; i++) + { + ffi_type *ty = arg_types[i]; + void *valp = avalue[i]; + int type = ty->type; + size_t size; + + switch (type) + { + case FFI_TYPE_INT: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + argp[argn] = extend_basic_type(valp, type, argn); + argn++; + break; + + case FFI_TYPE_LONGDOUBLE: + by_reference: + /* Note that 128-bit long double is passed by reference. */ + argp[argn++] = (unsigned long)valp; + break; + + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + size = ty->size; + memcpy(argp + argn, valp, size); + argn += FFI_ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + break; + + case FFI_TYPE_COMPLEX: + type = ty->elements[0]->type; + if (type == FFI_TYPE_LONGDOUBLE) + goto by_reference; + + /* Most complex types passed as two separate arguments. */ + size = ty->elements[0]->size; + argp[argn] = extend_basic_type(valp, type, argn); + argp[argn + 1] = extend_basic_type(valp + size, type, argn + 1); + argn += 2; + break; + + default: + abort(); + } + } + + flags = (flags >> ALPHA_ST_SHIFT) & 0xff; + ffi_call_osf(argp, frame, flags, rvalue, fn, closure); +} + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_call_int(cif, fn, rvalue, avalue, NULL); +} + +void +ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int(cif, fn, rvalue, avalue, closure); +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp; + + if (cif->abi != FFI_OSF) + return FFI_BAD_ABI; + + tramp = (unsigned int *) &closure->tramp[0]; + tramp[0] = 0x47fb0401; /* mov $27,$1 */ + tramp[1] = 0xa77b0010; /* ldq $27,16($27) */ + tramp[2] = 0x6bfb0000; /* jmp $31,($27),0 */ + tramp[3] = 0x47ff041f; /* nop */ + *(void **) &tramp[4] = ffi_closure_osf; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Flush the Icache. + + Tru64 UNIX as doesn't understand the imb mnemonic, so use call_pal + instead, since both Compaq as and gas can handle it. + + 0x86 is PAL_imb in Tru64 UNIX <alpha/pal.h>. */ + asm volatile ("call_pal 0x86" : : : "memory"); + + return FFI_OK; +} + +ffi_status +ffi_prep_go_closure (ffi_go_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*)) +{ + if (cif->abi != FFI_OSF) + return FFI_BAD_ABI; + + closure->tramp = (void *)ffi_go_closure_osf; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} + +long FFI_HIDDEN +ffi_closure_osf_inner (ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *rvalue, unsigned long *argp) +{ + void **avalue; + ffi_type **arg_types; + long i, avn, argn, flags; + + avalue = alloca(cif->nargs * sizeof(void *)); + flags = cif->flags; + argn = 0; + + /* Copy the caller's structure return address to that the closure + returns the data directly to the caller. */ + if (flags == ALPHA_RET_IN_MEM) + { + rvalue = (void *) argp[0]; + argn = 1; + } + + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0, avn = cif->nargs; i < avn; i++) + { + ffi_type *ty = arg_types[i]; + int type = ty->type; + void *valp = &argp[argn]; + size_t size; + + switch (type) + { + case FFI_TYPE_INT: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + argn += 1; + break; + + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + size = ty->size; + argn += FFI_ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + break; + + case FFI_TYPE_FLOAT: + /* Floats coming from registers need conversion from double + back to float format. */ + if (argn < 6) + { + valp = &argp[argn - 6]; + sts(valp, argp[argn - 6]); + } + argn += 1; + break; + + case FFI_TYPE_DOUBLE: + if (argn < 6) + valp = &argp[argn - 6]; + argn += 1; + break; + + case FFI_TYPE_LONGDOUBLE: + by_reference: + /* 128-bit long double is passed by reference. */ + valp = (void *)argp[argn]; + argn += 1; + break; + + case FFI_TYPE_COMPLEX: + type = ty->elements[0]->type; + switch (type) + { + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* Passed as separate arguments, but they wind up sequential. */ + break; + + case FFI_TYPE_INT: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + /* Passed as separate arguments. Disjoint, but there's room + enough in one slot to hold the pair. */ + size = ty->elements[0]->size; + memcpy(valp + size, valp + 8, size); + break; + + case FFI_TYPE_FLOAT: + /* Passed as separate arguments. Disjoint, and each piece + may need conversion back to float. */ + if (argn < 6) + { + valp = &argp[argn - 6]; + sts(valp, argp[argn - 6]); + } + if (argn + 1 < 6) + sts(valp + 4, argp[argn + 1 - 6]); + else + *(UINT32 *)(valp + 4) = argp[argn + 1]; + break; + + case FFI_TYPE_DOUBLE: + /* Passed as separate arguments. Only disjoint if one part + is in fp regs and the other is on the stack. */ + if (argn < 5) + valp = &argp[argn - 6]; + else if (argn == 5) + { + valp = alloca(16); + ((UINT64 *)valp)[0] = argp[5 - 6]; + ((UINT64 *)valp)[1] = argp[6]; + } + break; + + case FFI_TYPE_LONGDOUBLE: + goto by_reference; + + default: + abort(); + } + argn += 2; + break; + + default: + abort (); + } + + avalue[i] = valp; + } + + /* Invoke the closure. */ + fun (cif, rvalue, avalue, user_data); + + /* Tell ffi_closure_osf how to perform return type promotions. */ + return (flags >> ALPHA_LD_SHIFT) & 0xff; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/ffitarget.h new file mode 100644 index 000000000000..a02dbd04f6df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/ffitarget.h @@ -0,0 +1,57 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for Alpha. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_OSF, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_OSF +} ffi_abi; +#endif + +#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION +#define FFI_TARGET_HAS_COMPLEX_TYPE + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_GO_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 24 +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/internal.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/internal.h new file mode 100644 index 000000000000..44da1922bb9f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/internal.h @@ -0,0 +1,23 @@ +#define ALPHA_ST_VOID 0 +#define ALPHA_ST_INT 1 +#define ALPHA_ST_FLOAT 2 +#define ALPHA_ST_DOUBLE 3 +#define ALPHA_ST_CPLXF 4 +#define ALPHA_ST_CPLXD 5 + +#define ALPHA_LD_VOID 0 +#define ALPHA_LD_INT64 1 +#define ALPHA_LD_INT32 2 +#define ALPHA_LD_UINT16 3 +#define ALPHA_LD_SINT16 4 +#define ALPHA_LD_UINT8 5 +#define ALPHA_LD_SINT8 6 +#define ALPHA_LD_FLOAT 7 +#define ALPHA_LD_DOUBLE 8 +#define ALPHA_LD_CPLXF 9 +#define ALPHA_LD_CPLXD 10 + +#define ALPHA_ST_SHIFT 0 +#define ALPHA_LD_SHIFT 8 +#define ALPHA_RET_IN_MEM 0x10000 +#define ALPHA_FLAGS(S, L) (((L) << ALPHA_LD_SHIFT) | (S)) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/osf.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/osf.S new file mode 100644 index 000000000000..b0318282a015 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/alpha/osf.S @@ -0,0 +1,282 @@ +/* ----------------------------------------------------------------------- + osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011, 2014 Red Hat + + Alpha/OSF Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "internal.h" + + .arch ev6 + .text + +/* Aid in building a direct addressed jump table, 4 insns per entry. */ +.macro E index + .align 4 + .org 99b + \index * 16 +.endm + +/* ffi_call_osf (void *stack, void *frame, unsigned flags, + void *raddr, void (*fnaddr)(void), void *closure) + + Bit o trickiness here -- FRAME is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 4 + .globl ffi_call_osf + .ent ffi_call_osf + FFI_HIDDEN(ffi_call_osf) + +ffi_call_osf: + cfi_startproc + cfi_def_cfa($17, 32) + mov $16, $30 + stq $26, 0($17) + stq $15, 8($17) + mov $17, $15 + .prologue 0 + cfi_def_cfa_register($15) + cfi_rel_offset($26, 0) + cfi_rel_offset($15, 8) + + stq $18, 16($17) # save flags into frame + stq $19, 24($17) # save rvalue into frame + mov $20, $27 # fn into place for call + mov $21, $1 # closure into static chain + + # Load up all of the (potential) argument registers. + ldq $16, 0($30) + ldt $f16, 0($30) + ldt $f17, 8($30) + ldq $17, 8($30) + ldt $f18, 16($30) + ldq $18, 16($30) + ldt $f19, 24($30) + ldq $19, 24($30) + ldt $f20, 32($30) + ldq $20, 32($30) + ldt $f21, 40($30) + ldq $21, 40($30) + + # Deallocate the register argument area. + lda $30, 48($30) + + jsr $26, ($27), 0 +0: + ldah $29, 0($26) !gpdisp!1 + ldq $2, 24($15) # reload rvalue + lda $29, 0($29) !gpdisp!1 + ldq $3, 16($15) # reload flags + lda $1, 99f-0b($26) + ldq $26, 0($15) + ldq $15, 8($15) + cfi_restore($26) + cfi_restore($15) + cfi_def_cfa($sp, 0) + cmoveq $2, ALPHA_ST_VOID, $3 # mash null rvalue to void + addq $3, $3, $3 + s8addq $3, $1, $1 # 99f + stcode * 16 + jmp $31, ($1), $st_int + + .align 4 +99: +E ALPHA_ST_VOID + ret +E ALPHA_ST_INT +$st_int: + stq $0, 0($2) + ret +E ALPHA_ST_FLOAT + sts $f0, 0($2) + ret +E ALPHA_ST_DOUBLE + stt $f0, 0($2) + ret +E ALPHA_ST_CPLXF + sts $f0, 0($2) + sts $f1, 4($2) + ret +E ALPHA_ST_CPLXD + stt $f0, 0($2) + stt $f1, 8($2) + ret + + cfi_endproc + .end ffi_call_osf + +/* ffi_closure_osf(...) + + Receives the closure argument in $1. */ + +#define CLOSURE_FS (16*8) + + .align 4 + .globl ffi_go_closure_osf + .ent ffi_go_closure_osf + FFI_HIDDEN(ffi_go_closure_osf) + +ffi_go_closure_osf: + cfi_startproc + ldgp $29, 0($27) + subq $30, CLOSURE_FS, $30 + cfi_adjust_cfa_offset(CLOSURE_FS) + stq $26, 0($30) + .prologue 1 + cfi_rel_offset($26, 0) + + stq $16, 10*8($30) + stq $17, 11*8($30) + stq $18, 12*8($30) + + ldq $16, 8($1) # load cif + ldq $17, 16($1) # load fun + mov $1, $18 # closure is user_data + br $do_closure + + cfi_endproc + .end ffi_go_closure_osf + + .align 4 + .globl ffi_closure_osf + .ent ffi_closure_osf + FFI_HIDDEN(ffi_closure_osf) + +ffi_closure_osf: + cfi_startproc + ldgp $29, 0($27) + subq $30, CLOSURE_FS, $30 + cfi_adjust_cfa_offset(CLOSURE_FS) + stq $26, 0($30) + .prologue 1 + cfi_rel_offset($26, 0) + + # Store all of the potential argument registers in va_list format. + stq $16, 10*8($30) + stq $17, 11*8($30) + stq $18, 12*8($30) + + ldq $16, 24($1) # load cif + ldq $17, 32($1) # load fun + ldq $18, 40($1) # load user_data + +$do_closure: + stq $19, 13*8($30) + stq $20, 14*8($30) + stq $21, 15*8($30) + stt $f16, 4*8($30) + stt $f17, 5*8($30) + stt $f18, 6*8($30) + stt $f19, 7*8($30) + stt $f20, 8*8($30) + stt $f21, 9*8($30) + + # Call ffi_closure_osf_inner to do the bulk of the work. + lda $19, 2*8($30) + lda $20, 10*8($30) + jsr $26, ffi_closure_osf_inner +0: + ldah $29, 0($26) !gpdisp!2 + lda $2, 99f-0b($26) + s4addq $0, 0, $1 # ldcode * 4 + ldq $0, 16($30) # preload return value + s4addq $1, $2, $1 # 99f + ldcode * 16 + lda $29, 0($29) !gpdisp!2 + ldq $26, 0($30) + cfi_restore($26) + jmp $31, ($1), $load_32 + +.macro epilogue + addq $30, CLOSURE_FS, $30 + cfi_adjust_cfa_offset(-CLOSURE_FS) + ret + .align 4 + cfi_adjust_cfa_offset(CLOSURE_FS) +.endm + + .align 4 +99: +E ALPHA_LD_VOID + epilogue + +E ALPHA_LD_INT64 + epilogue + +E ALPHA_LD_INT32 +$load_32: + sextl $0, $0 + epilogue + +E ALPHA_LD_UINT16 + zapnot $0, 3, $0 + epilogue + +E ALPHA_LD_SINT16 +#ifdef __alpha_bwx__ + sextw $0, $0 +#else + sll $0, 48, $0 + sra $0, 48, $0 +#endif + epilogue + +E ALPHA_LD_UINT8 + and $0, 0xff, $0 + epilogue + +E ALPHA_LD_SINT8 +#ifdef __alpha_bwx__ + sextb $0, $0 +#else + sll $0, 56, $0 + sra $0, 56, $0 +#endif + epilogue + +E ALPHA_LD_FLOAT + lds $f0, 16($sp) + epilogue + +E ALPHA_LD_DOUBLE + ldt $f0, 16($sp) + epilogue + +E ALPHA_LD_CPLXF + lds $f0, 16($sp) + lds $f1, 20($sp) + epilogue + +E ALPHA_LD_CPLXD + ldt $f0, 16($sp) + ldt $f1, 24($sp) + epilogue + + cfi_endproc + .end ffi_closure_osf + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arc/arcompact.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arc/arcompact.S new file mode 100644 index 000000000000..03715fde49f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arc/arcompact.S @@ -0,0 +1,135 @@ +/* ----------------------------------------------------------------------- + arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com) + + ARCompact Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#ifdef HAVE_MACHINE_ASM_H +#include <machine/asm.h> +#else +#define CNAME(x) x +#define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x): +#endif + +.text + + /* R0: ffi_prep_args */ + /* R1: &ecif */ + /* R2: cif->bytes */ + /* R3: fig->flags */ + /* R4: ecif.rvalue */ + /* R5: fn */ +ENTRY(ffi_call_ARCompact) + /* Save registers. */ + st.a fp, [sp, -4] /* fp + 20, fp */ + push_s blink /* fp + 16, blink */ + st.a r4, [sp, -4] /* fp + 12, ecif.rvalue */ + push_s r3 /* fp + 8, fig->flags */ + st.a r5, [sp, -4] /* fp + 4, fn */ + push_s r2 /* fp + 0, cif->bytes */ + mov fp, sp + + /* Make room for all of the new args. */ + sub sp, sp, r2 + + /* Place all of the ffi_prep_args in position. */ + /* ffi_prep_args(char *stack, extended_cif *ecif) */ + /* R1 already set. */ + + /* And call. */ + jl_s.d [r0] + mov_s r0, sp + + ld.ab r12, [fp, 4] /* cif->bytes */ + ld.ab r11, [fp, 4] /* fn */ + + /* Move first 8 parameters in registers... */ + ld_s r0, [sp] + ld_s r1, [sp, 4] + ld_s r2, [sp, 8] + ld_s r3, [sp, 12] + ld r4, [sp, 16] + ld r5, [sp, 20] + ld r6, [sp, 24] + ld r7, [sp, 28] + + /* ...and adjust the stack. */ + min r12, r12, 32 + + /* Call the function. */ + jl.d [r11] + add sp, sp, r12 + + mov sp, fp + pop_s r3 /* fig->flags, return type */ + pop_s r2 /* ecif.rvalue, pointer for return value */ + + /* If the return value pointer is NULL, assume no return value. */ + breq.d r2, 0, epilogue + pop_s blink + + /* Return INT. */ + brne r3, FFI_TYPE_INT, return_double + b.d epilogue + st_s r0, [r2] + +return_double: + brne r3, FFI_TYPE_DOUBLE, epilogue + st_s r0, [r2] + st_s r1, [r2,4] + +epilogue: + j_s.d [blink] + ld.ab fp, [sp, 4] + +ENTRY(ffi_closure_ARCompact) + st.a r0, [sp, -32] + st_s r1, [sp, 4] + st_s r2, [sp, 8] + st_s r3, [sp, 12] + st r4, [sp, 16] + st r5, [sp, 20] + st r6, [sp, 24] + st r7, [sp, 28] + + /* pointer to arguments */ + mov_s r2, sp + + /* return value goes here */ + sub sp, sp, 8 + mov_s r1, sp + + push_s blink + + bl.d ffi_closure_inner_ARCompact + mov_s r0, r8 /* codeloc, set by trampoline */ + + pop_s blink + + /* set return value to r1:r0 */ + pop_s r0 + pop_s r1 + j_s.d [blink] + add_s sp, sp, 32 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arc/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arc/ffi.c new file mode 100644 index 000000000000..4d10b21a5d95 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arc/ffi.c @@ -0,0 +1,266 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) + + ARC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <stdint.h> + +#include <sys/cachectl.h> + +/* for little endian ARC, the code is in fact stored as mixed endian for + performance reasons */ +#if __BIG_ENDIAN__ +#define CODE_ENDIAN(x) (x) +#else +#define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16)) +#endif + +/* ffi_prep_args is called by the assembly routine once stack + space has been allocated for the function's arguments. */ + +void +ffi_prep_args (char *stack, extended_cif * ecif) +{ + unsigned int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + + argp = stack; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); i--, p_arg++) + { + size_t z; + int alignment; + + /* align alignment to 4 */ + alignment = (((*p_arg)->alignment - 1) | 3) + 1; + + /* Align if necessary. */ + if ((alignment - 1) & (unsigned) argp) + argp = (char *) FFI_ALIGN (argp, alignment); + + z = (*p_arg)->size; + if (z < sizeof (int)) + { + z = sizeof (int); + + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv); + break; + + case FFI_TYPE_STRUCT: + memcpy (argp, *p_argv, (*p_arg)->size); + break; + + default: + FFI_ASSERT (0); + } + } + else if (z == sizeof (int)) + { + *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv); + } + else + { + if ((*p_arg)->type == FFI_TYPE_STRUCT) + { + memcpy (argp, *p_argv, z); + } + else + { + /* Double or long long 64bit. */ + memcpy (argp, *p_argv, z); + } + } + p_argv++; + argp += z; + } + + return; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep (ffi_cif * cif) +{ + /* Set the return type flag. */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_STRUCT: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: + cif->flags = FFI_TYPE_DOUBLE; + break; + + case FFI_TYPE_FLOAT: + default: + cif->flags = FFI_TYPE_INT; + break; + } + + return FFI_OK; +} + +extern void ffi_call_ARCompact (void (*)(char *, extended_cif *), + extended_cif *, unsigned, unsigned, + unsigned *, void (*fn) (void)); + +void +ffi_call (ffi_cif * cif, void (*fn) (void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have + a return value address then we need to make one. */ + if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca (cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_ARCOMPACT: + ffi_call_ARCompact (ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + + default: + FFI_ASSERT (0); + break; + } +} + +int +ffi_closure_inner_ARCompact (ffi_closure * closure, void *rvalue, + ffi_arg * args) +{ + void **arg_area, **p_argv; + ffi_cif *cif = closure->cif; + char *argp = (char *) args; + ffi_type **p_argt; + int i; + + arg_area = (void **) alloca (cif->nargs * sizeof (void *)); + + /* handle hidden argument */ + if (cif->flags == FFI_TYPE_STRUCT) + { + rvalue = *(void **) argp; + argp += 4; + } + + p_argv = arg_area; + + for (i = 0, p_argt = cif->arg_types; i < cif->nargs; + i++, p_argt++, p_argv++) + { + size_t z; + int alignment; + + /* align alignment to 4 */ + alignment = (((*p_argt)->alignment - 1) | 3) + 1; + + /* Align if necessary. */ + if ((alignment - 1) & (unsigned) argp) + argp = (char *) FFI_ALIGN (argp, alignment); + + z = (*p_argt)->size; + *p_argv = (void *) argp; + argp += z; + } + + (closure->fun) (cif, rvalue, arg_area, closure->user_data); + + return cif->flags; +} + +extern void ffi_closure_ARCompact (void); + +ffi_status +ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, void *codeloc) +{ + uint32_t *tramp = (uint32_t *) & (closure->tramp[0]); + + switch (cif->abi) + { + case FFI_ARCOMPACT: + FFI_ASSERT (tramp == codeloc); + tramp[0] = CODE_ENDIAN (0x200a1fc0); /* mov r8, pcl */ + tramp[1] = CODE_ENDIAN (0x20200f80); /* j [long imm] */ + tramp[2] = CODE_ENDIAN (ffi_closure_ARCompact); + break; + + default: + return FFI_BAD_ABI; + } + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + cacheflush (codeloc, FFI_TRAMPOLINE_SIZE, BCACHE); + + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arc/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arc/ffitarget.h new file mode 100644 index 000000000000..bf8311bc832c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arc/ffitarget.h @@ -0,0 +1,53 @@ +/* ----------------------------------------------------------------------- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) + Target configuration macros for ARC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi +{ + FFI_FIRST_ABI = 0, + FFI_ARCOMPACT, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_ARCOMPACT +} ffi_abi; +#endif + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 12 +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/ffi.c new file mode 100644 index 000000000000..005839006d75 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/ffi.c @@ -0,0 +1,876 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011 Timothy Wall + Copyright (c) 2011 Plausible Labs Cooperative, Inc. + Copyright (c) 2011 Anthony Green + Copyright (c) 2011 Free Software Foundation + Copyright (c) 1998, 2008, 2011 Red Hat, Inc. + + ARM Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if defined(__arm__) || defined(_M_ARM) +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_common.h> +#include <stdint.h> +#include <stdlib.h> +#include "internal.h" + +#if defined(_MSC_VER) && defined(_M_ARM) +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#include <mach/machine/vm_param.h> +#endif + +#else +#ifndef _M_ARM +extern unsigned int ffi_arm_trampoline[2] FFI_HIDDEN; +#else +extern unsigned int ffi_arm_trampoline[3] FFI_HIDDEN; +#endif +#endif + +#if defined(__FreeBSD__) && defined(__arm__) +#include <sys/types.h> +#include <machine/sysarch.h> +#endif + +/* Forward declares. */ +static int vfp_type_p (const ffi_type *); +static void layout_vfp_args (ffi_cif *); + +static void * +ffi_align (ffi_type *ty, void *p) +{ + /* Align if necessary */ + size_t alignment; +#ifdef _WIN32_WCE + alignment = 4; +#else + alignment = ty->alignment; + if (alignment < 4) + alignment = 4; +#endif + return (void *) FFI_ALIGN (p, alignment); +} + +static size_t +ffi_put_arg (ffi_type *ty, void *src, void *dst) +{ + size_t z = ty->size; + + switch (ty->type) + { + case FFI_TYPE_SINT8: + *(UINT32 *)dst = *(SINT8 *)src; + break; + case FFI_TYPE_UINT8: + *(UINT32 *)dst = *(UINT8 *)src; + break; + case FFI_TYPE_SINT16: + *(UINT32 *)dst = *(SINT16 *)src; + break; + case FFI_TYPE_UINT16: + *(UINT32 *)dst = *(UINT16 *)src; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: +#ifndef _MSC_VER + case FFI_TYPE_FLOAT: +#endif + *(UINT32 *)dst = *(UINT32 *)src; + break; + +#ifdef _MSC_VER + // casting a float* to a UINT32* doesn't work on Windows + case FFI_TYPE_FLOAT: + *(uintptr_t *)dst = 0; + *(float *)dst = *(float *)src; + break; +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: + *(UINT64 *)dst = *(UINT64 *)src; + break; + + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + memcpy (dst, src, z); + break; + + default: + abort(); + } + + return FFI_ALIGN (z, 4); +} + +/* ffi_prep_args is called once stack space has been allocated + for the function's arguments. + + The vfp_space parameter is the load area for VFP regs, the return + value is cif->vfp_used (word bitset of VFP regs used for passing + arguments). These are only used for the VFP hard-float ABI. +*/ +static void +ffi_prep_args_SYSV (ffi_cif *cif, int flags, void *rvalue, + void **avalue, char *argp) +{ + ffi_type **arg_types = cif->arg_types; + int i, n; + + if (flags == ARM_TYPE_STRUCT) + { + *(void **) argp = rvalue; + argp += 4; + } + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + argp = ffi_align (ty, argp); + argp += ffi_put_arg (ty, avalue[i], argp); + } +} + +static void +ffi_prep_args_VFP (ffi_cif *cif, int flags, void *rvalue, + void **avalue, char *stack, char *vfp_space) +{ + ffi_type **arg_types = cif->arg_types; + int i, n, vi = 0; + char *argp, *regp, *eo_regp; + char stack_used = 0; + char done_with_regs = 0; + + /* The first 4 words on the stack are used for values + passed in core registers. */ + regp = stack; + eo_regp = argp = regp + 16; + + /* If the function returns an FFI_TYPE_STRUCT in memory, + that address is passed in r0 to the function. */ + if (flags == ARM_TYPE_STRUCT) + { + *(void **) regp = rvalue; + regp += 4; + } + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + void *a = avalue[i]; + int is_vfp_type = vfp_type_p (ty); + + /* Allocated in VFP registers. */ + if (vi < cif->vfp_nargs && is_vfp_type) + { + char *vfp_slot = vfp_space + cif->vfp_args[vi++] * 4; + ffi_put_arg (ty, a, vfp_slot); + continue; + } + /* Try allocating in core registers. */ + else if (!done_with_regs && !is_vfp_type) + { + char *tregp = ffi_align (ty, regp); + size_t size = ty->size; + size = (size < 4) ? 4 : size; // pad + /* Check if there is space left in the aligned register + area to place the argument. */ + if (tregp + size <= eo_regp) + { + regp = tregp + ffi_put_arg (ty, a, tregp); + done_with_regs = (regp == argp); + // ensure we did not write into the stack area + FFI_ASSERT (regp <= argp); + continue; + } + /* In case there are no arguments in the stack area yet, + the argument is passed in the remaining core registers + and on the stack. */ + else if (!stack_used) + { + stack_used = 1; + done_with_regs = 1; + argp = tregp + ffi_put_arg (ty, a, tregp); + FFI_ASSERT (eo_regp < argp); + continue; + } + } + /* Base case, arguments are passed on the stack */ + stack_used = 1; + argp = ffi_align (ty, argp); + argp += ffi_put_arg (ty, a, argp); + } +} + +/* Perform machine dependent cif processing */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep (ffi_cif *cif) +{ + int flags = 0, cabi = cif->abi; + size_t bytes = cif->bytes; + + /* Map out the register placements of VFP register args. The VFP + hard-float calling conventions are slightly more sophisticated + than the base calling conventions, so we do it here instead of + in ffi_prep_args(). */ + if (cabi == FFI_VFP) + layout_vfp_args (cif); + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + flags = ARM_TYPE_VOID; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + flags = ARM_TYPE_INT; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + flags = ARM_TYPE_INT64; + break; + + case FFI_TYPE_FLOAT: + flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_S : ARM_TYPE_INT); + break; + case FFI_TYPE_DOUBLE: + flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_D : ARM_TYPE_INT64); + break; + + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + if (cabi == FFI_VFP) + { + int h = vfp_type_p (cif->rtype); + + flags = ARM_TYPE_VFP_N; + if (h == 0x100 + FFI_TYPE_FLOAT) + flags = ARM_TYPE_VFP_S; + if (h == 0x100 + FFI_TYPE_DOUBLE) + flags = ARM_TYPE_VFP_D; + if (h != 0) + break; + } + + /* A Composite Type not larger than 4 bytes is returned in r0. + A Composite Type larger than 4 bytes, or whose size cannot + be determined statically ... is stored in memory at an + address passed [in r0]. */ + if (cif->rtype->size <= 4) + flags = ARM_TYPE_INT; + else + { + flags = ARM_TYPE_STRUCT; + bytes += 4; + } + break; + + default: + abort(); + } + + /* Round the stack up to a multiple of 8 bytes. This isn't needed + everywhere, but it is on some platforms, and it doesn't harm anything + when it isn't needed. */ + bytes = FFI_ALIGN (bytes, 8); + + /* Minimum stack space is the 4 register arguments that we pop. */ + if (bytes < 4*4) + bytes = 4*4; + + cif->bytes = bytes; + cif->flags = flags; + + return FFI_OK; +} + +/* Perform machine dependent cif processing for variadic calls */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep_var (ffi_cif * cif, + unsigned int nfixedargs, unsigned int ntotalargs) +{ + /* VFP variadic calls actually use the SYSV ABI */ + if (cif->abi == FFI_VFP) + cif->abi = FFI_SYSV; + + return ffi_prep_cif_machdep (cif); +} + +/* Prototypes for assembly functions, in sysv.S. */ + +struct call_frame +{ + void *fp; + void *lr; + void *rvalue; + int flags; + void *closure; +}; + +extern void ffi_call_SYSV (void *stack, struct call_frame *, + void (*fn) (void)) FFI_HIDDEN; +extern void ffi_call_VFP (void *vfp_space, struct call_frame *, + void (*fn) (void), unsigned vfp_used) FFI_HIDDEN; + +static void +ffi_call_int (ffi_cif * cif, void (*fn) (void), void *rvalue, + void **avalue, void *closure) +{ + int flags = cif->flags; + ffi_type *rtype = cif->rtype; + size_t bytes, rsize, vfp_size; + char *stack, *vfp_space, *new_rvalue; + struct call_frame *frame; + + rsize = 0; + if (rvalue == NULL) + { + /* If the return value is a struct and we don't have a return + value address then we need to make one. Otherwise the return + value is in registers and we can ignore them. */ + if (flags == ARM_TYPE_STRUCT) + rsize = rtype->size; + else + flags = ARM_TYPE_VOID; + } + else if (flags == ARM_TYPE_VFP_N) + { + /* Largest case is double x 4. */ + rsize = 32; + } + else if (flags == ARM_TYPE_INT && rtype->type == FFI_TYPE_STRUCT) + rsize = 4; + + /* Largest case. */ + vfp_size = (cif->abi == FFI_VFP && cif->vfp_used ? 8*8: 0); + + bytes = cif->bytes; + stack = alloca (vfp_size + bytes + sizeof(struct call_frame) + rsize); + + vfp_space = NULL; + if (vfp_size) + { + vfp_space = stack; + stack += vfp_size; + } + + frame = (struct call_frame *)(stack + bytes); + + new_rvalue = rvalue; + if (rsize) + new_rvalue = (void *)(frame + 1); + + frame->rvalue = new_rvalue; + frame->flags = flags; + frame->closure = closure; + + if (vfp_space) + { + ffi_prep_args_VFP (cif, flags, new_rvalue, avalue, stack, vfp_space); + ffi_call_VFP (vfp_space, frame, fn, cif->vfp_used); + } + else + { + ffi_prep_args_SYSV (cif, flags, new_rvalue, avalue, stack); + ffi_call_SYSV (stack, frame, fn); + } + + if (rvalue && rvalue != new_rvalue) + memcpy (rvalue, new_rvalue, rtype->size); +} + +void +ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +#ifdef FFI_GO_CLOSURES +void +ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} +#endif + +static void * +ffi_prep_incoming_args_SYSV (ffi_cif *cif, void *rvalue, + char *argp, void **avalue) +{ + ffi_type **arg_types = cif->arg_types; + int i, n; + + if (cif->flags == ARM_TYPE_STRUCT) + { + rvalue = *(void **) argp; + argp += 4; + } + else + { + if (cif->rtype->size && cif->rtype->size < 4) + *(uint32_t *) rvalue = 0; + } + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + size_t z = ty->size; + + argp = ffi_align (ty, argp); + avalue[i] = (void *) argp; + argp += z; + } + + return rvalue; +} + +static void * +ffi_prep_incoming_args_VFP (ffi_cif *cif, void *rvalue, char *stack, + char *vfp_space, void **avalue) +{ + ffi_type **arg_types = cif->arg_types; + int i, n, vi = 0; + char *argp, *regp, *eo_regp; + char done_with_regs = 0; + char stack_used = 0; + + regp = stack; + eo_regp = argp = regp + 16; + + if (cif->flags == ARM_TYPE_STRUCT) + { + rvalue = *(void **) regp; + regp += 4; + } + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + int is_vfp_type = vfp_type_p (ty); + size_t z = ty->size; + + if (vi < cif->vfp_nargs && is_vfp_type) + { + avalue[i] = vfp_space + cif->vfp_args[vi++] * 4; + continue; + } + else if (!done_with_regs && !is_vfp_type) + { + char *tregp = ffi_align (ty, regp); + + z = (z < 4) ? 4 : z; // pad + + /* If the arguments either fits into the registers or uses registers + and stack, while we haven't read other things from the stack */ + if (tregp + z <= eo_regp || !stack_used) + { + /* Because we're little endian, this is what it turns into. */ + avalue[i] = (void *) tregp; + regp = tregp + z; + + /* If we read past the last core register, make sure we + have not read from the stack before and continue + reading after regp. */ + if (regp > eo_regp) + { + FFI_ASSERT (!stack_used); + argp = regp; + } + if (regp >= eo_regp) + { + done_with_regs = 1; + stack_used = 1; + } + continue; + } + } + + stack_used = 1; + argp = ffi_align (ty, argp); + avalue[i] = (void *) argp; + argp += z; + } + + return rvalue; +} + +struct closure_frame +{ + char vfp_space[8*8] __attribute__((aligned(8))); + char result[8*4]; + char argp[]; +}; + +int FFI_HIDDEN +ffi_closure_inner_SYSV (ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + struct closure_frame *frame) +{ + void **avalue = (void **) alloca (cif->nargs * sizeof (void *)); + void *rvalue = ffi_prep_incoming_args_SYSV (cif, frame->result, + frame->argp, avalue); + fun (cif, rvalue, avalue, user_data); + return cif->flags; +} + +int FFI_HIDDEN +ffi_closure_inner_VFP (ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + struct closure_frame *frame) +{ + void **avalue = (void **) alloca (cif->nargs * sizeof (void *)); + void *rvalue = ffi_prep_incoming_args_VFP (cif, frame->result, frame->argp, + frame->vfp_space, avalue); + fun (cif, rvalue, avalue, user_data); + return cif->flags; +} + +void ffi_closure_SYSV (void) FFI_HIDDEN; +void ffi_closure_VFP (void) FFI_HIDDEN; + +#ifdef FFI_GO_CLOSURES +void ffi_go_closure_SYSV (void) FFI_HIDDEN; +void ffi_go_closure_VFP (void) FFI_HIDDEN; +#endif + +/* the cif must already be prep'ed */ + +#if defined(__FreeBSD__) && defined(__arm__) +#define __clear_cache(start, end) do { \ + struct arm_sync_icache_args ua; \ + \ + ua.addr = (uintptr_t)(start); \ + ua.len = (char *)(end) - (char *)start; \ + sysarch(ARM_SYNC_ICACHE, &ua); \ + } while (0); +#endif + +ffi_status +ffi_prep_closure_loc (ffi_closure * closure, + ffi_cif * cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, void *codeloc) +{ + void (*closure_func) (void) = ffi_closure_SYSV; + + if (cif->abi == FFI_VFP) + { + /* We only need take the vfp path if there are vfp arguments. */ + if (cif->vfp_used) + closure_func = ffi_closure_VFP; + } + else if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + +#if FFI_EXEC_TRAMPOLINE_TABLE + void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE); + config[0] = closure; + config[1] = closure_func; +#else + +#ifndef _M_ARM + memcpy(closure->tramp, ffi_arm_trampoline, 8); +#else + // cast away function type so MSVC doesn't set the lower bit of the function pointer + memcpy(closure->tramp, (void*)((uintptr_t)ffi_arm_trampoline & 0xFFFFFFFE), FFI_TRAMPOLINE_CLOSURE_OFFSET); +#endif + +#if defined (__QNX__) + msync(closure->tramp, 8, 0x1000000); /* clear data map */ + msync(codeloc, 8, 0x1000000); /* clear insn map */ +#elif defined(_MSC_VER) + FlushInstructionCache(GetCurrentProcess(), closure->tramp, FFI_TRAMPOLINE_SIZE); +#else + __clear_cache(closure->tramp, closure->tramp + 8); /* clear data map */ + __clear_cache(codeloc, codeloc + 8); /* clear insn map */ +#endif +#ifdef _M_ARM + *(void(**)(void))(closure->tramp + FFI_TRAMPOLINE_CLOSURE_FUNCTION) = closure_func; +#else + *(void (**)(void))(closure->tramp + 8) = closure_func; +#endif +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#ifdef FFI_GO_CLOSURES +ffi_status +ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *)) +{ + void (*closure_func) (void) = ffi_go_closure_SYSV; + + if (cif->abi == FFI_VFP) + { + /* We only need take the vfp path if there are vfp arguments. */ + if (cif->vfp_used) + closure_func = ffi_go_closure_VFP; + } + else if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + closure->tramp = closure_func; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} +#endif + +/* Below are routines for VFP hard-float support. */ + +/* A subroutine of vfp_type_p. Given a structure type, return the type code + of the first non-structure element. Recurse for structure elements. + Return -1 if the structure is in fact empty, i.e. no nested elements. */ + +static int +is_hfa0 (const ffi_type *ty) +{ + ffi_type **elements = ty->elements; + int i, ret = -1; + + if (elements != NULL) + for (i = 0; elements[i]; ++i) + { + ret = elements[i]->type; + if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX) + { + ret = is_hfa0 (elements[i]); + if (ret < 0) + continue; + } + break; + } + + return ret; +} + +/* A subroutine of vfp_type_p. Given a structure type, return true if all + of the non-structure elements are the same as CANDIDATE. */ + +static int +is_hfa1 (const ffi_type *ty, int candidate) +{ + ffi_type **elements = ty->elements; + int i; + + if (elements != NULL) + for (i = 0; elements[i]; ++i) + { + int t = elements[i]->type; + if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) + { + if (!is_hfa1 (elements[i], candidate)) + return 0; + } + else if (t != candidate) + return 0; + } + + return 1; +} + +/* Determine if TY is an homogenous floating point aggregate (HFA). + That is, a structure consisting of 1 to 4 members of all the same type, + where that type is a floating point scalar. + + Returns non-zero iff TY is an HFA. The result is an encoded value where + bits 0-7 contain the type code, and bits 8-10 contain the element count. */ + +static int +vfp_type_p (const ffi_type *ty) +{ + ffi_type **elements; + int candidate, i; + size_t size, ele_count; + + /* Quickest tests first. */ + candidate = ty->type; + switch (ty->type) + { + default: + return 0; + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + ele_count = 1; + goto done; + case FFI_TYPE_COMPLEX: + candidate = ty->elements[0]->type; + if (candidate != FFI_TYPE_FLOAT && candidate != FFI_TYPE_DOUBLE) + return 0; + ele_count = 2; + goto done; + case FFI_TYPE_STRUCT: + break; + } + + /* No HFA types are smaller than 4 bytes, or larger than 32 bytes. */ + size = ty->size; + if (size < 4 || size > 32) + return 0; + + /* Find the type of the first non-structure member. */ + elements = ty->elements; + candidate = elements[0]->type; + if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX) + { + for (i = 0; ; ++i) + { + candidate = is_hfa0 (elements[i]); + if (candidate >= 0) + break; + } + } + + /* If the first member is not a floating point type, it's not an HFA. + Also quickly re-check the size of the structure. */ + switch (candidate) + { + case FFI_TYPE_FLOAT: + ele_count = size / sizeof(float); + if (size != ele_count * sizeof(float)) + return 0; + break; + case FFI_TYPE_DOUBLE: + ele_count = size / sizeof(double); + if (size != ele_count * sizeof(double)) + return 0; + break; + default: + return 0; + } + if (ele_count > 4) + return 0; + + /* Finally, make sure that all scalar elements are the same type. */ + for (i = 0; elements[i]; ++i) + { + int t = elements[i]->type; + if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) + { + if (!is_hfa1 (elements[i], candidate)) + return 0; + } + else if (t != candidate) + return 0; + } + + /* All tests succeeded. Encode the result. */ + done: + return (ele_count << 8) | candidate; +} + +static int +place_vfp_arg (ffi_cif *cif, int h) +{ + unsigned short reg = cif->vfp_reg_free; + int align = 1, nregs = h >> 8; + + if ((h & 0xff) == FFI_TYPE_DOUBLE) + align = 2, nregs *= 2; + + /* Align register number. */ + if ((reg & 1) && align == 2) + reg++; + + while (reg + nregs <= 16) + { + int s, new_used = 0; + for (s = reg; s < reg + nregs; s++) + { + new_used |= (1 << s); + if (cif->vfp_used & (1 << s)) + { + reg += align; + goto next_reg; + } + } + /* Found regs to allocate. */ + cif->vfp_used |= new_used; + cif->vfp_args[cif->vfp_nargs++] = (signed char)reg; + + /* Update vfp_reg_free. */ + if (cif->vfp_used & (1 << cif->vfp_reg_free)) + { + reg += nregs; + while (cif->vfp_used & (1 << reg)) + reg += 1; + cif->vfp_reg_free = reg; + } + return 0; + next_reg:; + } + // done, mark all regs as used + cif->vfp_reg_free = 16; + cif->vfp_used = 0xFFFF; + return 1; +} + +static void +layout_vfp_args (ffi_cif * cif) +{ + unsigned int i; + /* Init VFP fields */ + cif->vfp_used = 0; + cif->vfp_nargs = 0; + cif->vfp_reg_free = 0; + memset (cif->vfp_args, -1, 16); /* Init to -1. */ + + for (i = 0; i < cif->nargs; i++) + { + int h = vfp_type_p (cif->arg_types[i]); + if (h && place_vfp_arg (cif, h) == 1) + break; + } +} + +#endif /* __arm__ or _M_ARM */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/ffitarget.h new file mode 100644 index 000000000000..cb57b84880ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/ffitarget.h @@ -0,0 +1,89 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 2010 CodeSourcery + Copyright (c) 1996-2003 Red Hat, Inc. + + Target configuration macros for ARM. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_VFP, + FFI_LAST_ABI, +#if defined(__ARM_PCS_VFP) || defined(_M_ARM) + FFI_DEFAULT_ABI = FFI_VFP, +#else + FFI_DEFAULT_ABI = FFI_SYSV, +#endif +} ffi_abi; +#endif + +#define FFI_EXTRA_CIF_FIELDS \ + int vfp_used; \ + unsigned short vfp_reg_free, vfp_nargs; \ + signed char vfp_args[16] \ + +#define FFI_TARGET_SPECIFIC_VARIADIC +#ifndef _M_ARM +#define FFI_TARGET_HAS_COMPLEX_TYPE +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_GO_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +#if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#define FFI_TRAMPOLINE_SIZE 12 +#define FFI_TRAMPOLINE_CLOSURE_OFFSET 8 +#else +#error "No trampoline table implementation" +#endif + +#else +#ifdef _MSC_VER +#define FFI_TRAMPOLINE_SIZE 16 +#define FFI_TRAMPOLINE_CLOSURE_FUNCTION 12 +#else +#define FFI_TRAMPOLINE_SIZE 12 +#endif +#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/internal.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/internal.h new file mode 100644 index 000000000000..6cf0b2ae5dab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/internal.h @@ -0,0 +1,7 @@ +#define ARM_TYPE_VFP_S 0 +#define ARM_TYPE_VFP_D 1 +#define ARM_TYPE_VFP_N 2 +#define ARM_TYPE_INT64 3 +#define ARM_TYPE_INT 4 +#define ARM_TYPE_VOID 5 +#define ARM_TYPE_STRUCT 6 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/sysv.S new file mode 100644 index 000000000000..74bc53fa28c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/sysv.S @@ -0,0 +1,385 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. + Copyright (c) 2011 Plausible Labs Cooperative, Inc. + + ARM Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __arm__ +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "internal.h" + +/* GCC 4.8 provides __ARM_ARCH; construct it otherwise. */ +#ifndef __ARM_ARCH +# if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ + || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ + || defined(__ARM_ARCH_7EM__) +# define __ARM_ARCH 7 +# elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ + || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ + || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ + || defined(__ARM_ARCH_6M__) +# define __ARM_ARCH 6 +# elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ + || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ + || defined(__ARM_ARCH_5TEJ__) +# define __ARM_ARCH 5 +# else +# define __ARM_ARCH 4 +# endif +#endif + +/* Conditionally compile unwinder directives. */ +#ifdef __ARM_EABI__ +# define UNWIND(...) __VA_ARGS__ +#else +# define UNWIND(...) +#endif + +#if defined(HAVE_AS_CFI_PSEUDO_OP) && defined(__ARM_EABI__) + .cfi_sections .debug_frame +#endif + +#define CONCAT(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +#ifdef __USER_LABEL_PREFIX__ +# define CNAME(X) CONCAT (__USER_LABEL_PREFIX__, X) +#else +# define CNAME(X) X +#endif +#ifdef __ELF__ +# define SIZE(X) .size CNAME(X), . - CNAME(X) +# define TYPE(X, Y) .type CNAME(X), Y +#else +# define SIZE(X) +# define TYPE(X, Y) +#endif + +#define ARM_FUNC_START_LOCAL(name) \ + .align 3; \ + TYPE(CNAME(name), %function); \ + CNAME(name): + +#define ARM_FUNC_START(name) \ + .globl CNAME(name); \ + FFI_HIDDEN(CNAME(name)); \ + ARM_FUNC_START_LOCAL(name) + +#define ARM_FUNC_END(name) \ + SIZE(name) + +/* Aid in defining a jump table with 8 bytes between entries. */ +/* ??? The clang assembler doesn't handle .if with symbolic expressions. */ +#ifdef __clang__ +# define E(index) +#else +# define E(index) \ + .if . - 0b - 8*index; \ + .error "type table out of sync"; \ + .endif +#endif + + .text + .syntax unified + .arm + +#ifndef __clang__ + /* We require interworking on LDM, which implies ARMv5T, + which implies the existance of BLX. */ + .arch armv5t +#endif + + /* Note that we use STC and LDC to encode VFP instructions, + so that we do not need ".fpu vfp", nor get that added to + the object file attributes. These will not be executed + unless the FFI_VFP abi is used. */ + + @ r0: stack + @ r1: frame + @ r2: fn + @ r3: vfp_used + +ARM_FUNC_START(ffi_call_VFP) + UNWIND(.fnstart) + cfi_startproc + + cmp r3, #3 @ load only d0 if possible +#ifdef __clang__ + vldrle d0, [r0] + vldmgt r0, {d0-d7} +#else + ldcle p11, cr0, [r0] @ vldrle d0, [r0] + ldcgt p11, cr0, [r0], {16} @ vldmgt r0, {d0-d7} +#endif + add r0, r0, #64 @ discard the vfp register args + /* FALLTHRU */ +ARM_FUNC_END(ffi_call_VFP) + +ARM_FUNC_START(ffi_call_SYSV) + stm r1, {fp, lr} + mov fp, r1 + + @ This is a bit of a lie wrt the origin of the unwind info, but + @ now we've got the usual frame pointer and two saved registers. + UNWIND(.save {fp,lr}) + UNWIND(.setfp fp, sp) + cfi_def_cfa(fp, 8) + cfi_rel_offset(fp, 0) + cfi_rel_offset(lr, 4) + + mov sp, r0 @ install the stack pointer + mov lr, r2 @ move the fn pointer out of the way + ldr ip, [fp, #16] @ install the static chain + ldmia sp!, {r0-r3} @ move first 4 parameters in registers. + blx lr @ call fn + + @ Load r2 with the pointer to storage for the return value + @ Load r3 with the return type code + ldr r2, [fp, #8] + ldr r3, [fp, #12] + + @ Deallocate the stack with the arguments. + mov sp, fp + cfi_def_cfa_register(sp) + + @ Store values stored in registers. + .align 3 + add pc, pc, r3, lsl #3 + nop +0: +E(ARM_TYPE_VFP_S) +#ifdef __clang__ + vstr s0, [r2] +#else + stc p10, cr0, [r2] @ vstr s0, [r2] +#endif + pop {fp,pc} +E(ARM_TYPE_VFP_D) +#ifdef __clang__ + vstr d0, [r2] +#else + stc p11, cr0, [r2] @ vstr d0, [r2] +#endif + pop {fp,pc} +E(ARM_TYPE_VFP_N) +#ifdef __clang__ + vstm r2, {d0-d3} +#else + stc p11, cr0, [r2], {8} @ vstm r2, {d0-d3} +#endif + pop {fp,pc} +E(ARM_TYPE_INT64) + str r1, [r2, #4] + nop +E(ARM_TYPE_INT) + str r0, [r2] + pop {fp,pc} +E(ARM_TYPE_VOID) + pop {fp,pc} + nop +E(ARM_TYPE_STRUCT) + pop {fp,pc} + + cfi_endproc + UNWIND(.fnend) +ARM_FUNC_END(ffi_call_SYSV) + + +/* + int ffi_closure_inner_* (cif, fun, user_data, frame) +*/ + +ARM_FUNC_START(ffi_go_closure_SYSV) + cfi_startproc + stmdb sp!, {r0-r3} @ save argument regs + cfi_adjust_cfa_offset(16) + ldr r0, [ip, #4] @ load cif + ldr r1, [ip, #8] @ load fun + mov r2, ip @ load user_data + b 0f + cfi_endproc +ARM_FUNC_END(ffi_go_closure_SYSV) + +ARM_FUNC_START(ffi_closure_SYSV) + UNWIND(.fnstart) + cfi_startproc + stmdb sp!, {r0-r3} @ save argument regs + cfi_adjust_cfa_offset(16) + +#if FFI_EXEC_TRAMPOLINE_TABLE + ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure* +#endif + ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif + ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun + ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data +0: + add ip, sp, #16 @ compute entry sp + sub sp, sp, #64+32 @ allocate frame + cfi_adjust_cfa_offset(64+32) + stmdb sp!, {ip,lr} + + /* Remember that EABI unwind info only applies at call sites. + We need do nothing except note the save of the stack pointer + and the link registers. */ + UNWIND(.save {sp,lr}) + cfi_adjust_cfa_offset(8) + cfi_rel_offset(lr, 4) + + add r3, sp, #8 @ load frame + bl CNAME(ffi_closure_inner_SYSV) + + @ Load values returned in registers. + add r2, sp, #8+64 @ load result + adr r3, CNAME(ffi_closure_ret) + add pc, r3, r0, lsl #3 + cfi_endproc + UNWIND(.fnend) +ARM_FUNC_END(ffi_closure_SYSV) + +ARM_FUNC_START(ffi_go_closure_VFP) + cfi_startproc + stmdb sp!, {r0-r3} @ save argument regs + cfi_adjust_cfa_offset(16) + ldr r0, [ip, #4] @ load cif + ldr r1, [ip, #8] @ load fun + mov r2, ip @ load user_data + b 0f + cfi_endproc +ARM_FUNC_END(ffi_go_closure_VFP) + +ARM_FUNC_START(ffi_closure_VFP) + UNWIND(.fnstart) + cfi_startproc + stmdb sp!, {r0-r3} @ save argument regs + cfi_adjust_cfa_offset(16) + +#if FFI_EXEC_TRAMPOLINE_TABLE + ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure* +#endif + ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif + ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun + ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data +0: + add ip, sp, #16 + sub sp, sp, #64+32 @ allocate frame + cfi_adjust_cfa_offset(64+32) +#ifdef __clang__ + vstm sp, {d0-d7} +#else + stc p11, cr0, [sp], {16} @ vstm sp, {d0-d7} +#endif + stmdb sp!, {ip,lr} + + /* See above. */ + UNWIND(.save {sp,lr}) + cfi_adjust_cfa_offset(8) + cfi_rel_offset(lr, 4) + + add r3, sp, #8 @ load frame + bl CNAME(ffi_closure_inner_VFP) + + @ Load values returned in registers. + add r2, sp, #8+64 @ load result + adr r3, CNAME(ffi_closure_ret) + add pc, r3, r0, lsl #3 + cfi_endproc + UNWIND(.fnend) +ARM_FUNC_END(ffi_closure_VFP) + +/* Load values returned in registers for both closure entry points. + Note that we use LDM with SP in the register set. This is deprecated + by ARM, but not yet unpredictable. */ + +ARM_FUNC_START_LOCAL(ffi_closure_ret) + cfi_startproc + cfi_rel_offset(sp, 0) + cfi_rel_offset(lr, 4) +0: +E(ARM_TYPE_VFP_S) +#ifdef __clang__ + vldr s0, [r2] +#else + ldc p10, cr0, [r2] @ vldr s0, [r2] +#endif + ldm sp, {sp,pc} +E(ARM_TYPE_VFP_D) +#ifdef __clang__ + vldr d0, [r2] +#else + ldc p11, cr0, [r2] @ vldr d0, [r2] +#endif + ldm sp, {sp,pc} +E(ARM_TYPE_VFP_N) +#ifdef __clang__ + vldm r2, {d0-d3} +#else + ldc p11, cr0, [r2], {8} @ vldm r2, {d0-d3} +#endif + ldm sp, {sp,pc} +E(ARM_TYPE_INT64) + ldr r1, [r2, #4] + nop +E(ARM_TYPE_INT) + ldr r0, [r2] + ldm sp, {sp,pc} +E(ARM_TYPE_VOID) + ldm sp, {sp,pc} + nop +E(ARM_TYPE_STRUCT) + ldm sp, {sp,pc} + cfi_endproc +ARM_FUNC_END(ffi_closure_ret) + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#include <mach/machine/vm_param.h> + +.align PAGE_MAX_SHIFT +ARM_FUNC_START(ffi_closure_trampoline_table_page) +.rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE + adr ip, #-PAGE_MAX_SIZE @ the config page is PAGE_MAX_SIZE behind the trampoline page + sub ip, #8 @ account for pc bias + ldr pc, [ip, #4] @ jump to ffi_closure_SYSV or ffi_closure_VFP +.endr +ARM_FUNC_END(ffi_closure_trampoline_table_page) +#endif + +#else + +ARM_FUNC_START(ffi_arm_trampoline) +0: adr ip, 0b + ldr pc, 1f +1: .long 0 +ARM_FUNC_END(ffi_arm_trampoline) + +#endif /* FFI_EXEC_TRAMPOLINE_TABLE */ +#endif /* __arm__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",%progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S new file mode 100644 index 000000000000..5c99d0207af3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/arm/sysv_msvc_arm32.S @@ -0,0 +1,311 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. + Copyright (c) 2011 Plausible Labs Cooperative, Inc. + Copyright (c) 2019 Microsoft Corporation. + + ARM Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "internal.h" +#include "ksarm.h" + + + ; 8 byte aligned AREA to support 8 byte aligned jump tables + MACRO + NESTED_ENTRY_FFI $FuncName, $AreaName, $ExceptHandler + + ; compute the function's labels + __DeriveFunctionLabels $FuncName + + ; determine the area we will put the function into +__FuncArea SETS "|.text|" + IF "$AreaName" != "" +__FuncArea SETS "$AreaName" + ENDIF + + ; set up the exception handler itself +__FuncExceptionHandler SETS "" + IF "$ExceptHandler" != "" +__FuncExceptionHandler SETS "|$ExceptHandler|" + ENDIF + + ; switch to the specified area, jump tables require 8 byte alignment + AREA $__FuncArea,CODE,CODEALIGN,ALIGN=3,READONLY + + ; export the function name + __ExportProc $FuncName + + ; flush any pending literal pool stuff + ROUT + + ; reset the state of the unwind code tracking + __ResetUnwindState + + MEND + +; MACRO +; TABLE_ENTRY $Type, $Table +;$Type_$Table +; MEND + +#define E(index,table) return_##index##_##table + + ; r0: stack + ; r1: frame + ; r2: fn + ; r3: vfp_used + + ; fake entry point exists only to generate exists only to + ; generate .pdata for exception unwinding + NESTED_ENTRY_FFI ffi_call_VFP_fake + PROLOG_PUSH {r11, lr} ; save fp and lr for unwind + + ALTERNATE_ENTRY ffi_call_VFP + cmp r3, #3 ; load only d0 if possible + vldrle d0, [r0] + vldmgt r0, {d0-d7} + add r0, r0, #64 ; discard the vfp register args + b ffi_call_SYSV + NESTED_END ffi_call_VFP_fake + + ; fake entry point exists only to generate exists only to + ; generate .pdata for exception unwinding + NESTED_ENTRY_FFI ffi_call_SYSV_fake + PROLOG_PUSH {r11, lr} ; save fp and lr for unwind + + ALTERNATE_ENTRY ffi_call_SYSV + stm r1, {fp, lr} + mov fp, r1 + + mov sp, r0 ; install the stack pointer + mov lr, r2 ; move the fn pointer out of the way + ldr ip, [fp, #16] ; install the static chain + ldmia sp!, {r0-r3} ; move first 4 parameters in registers. + blx lr ; call fn + + ; Load r2 with the pointer to storage for the return value + ; Load r3 with the return type code + ldr r2, [fp, #8] + ldr r3, [fp, #12] + + ; Deallocate the stack with the arguments. + mov sp, fp + + ; Store values stored in registers. + ALIGN 8 + lsl r3, #3 + add r3, r3, pc + add r3, #8 + mov pc, r3 + + +E(ARM_TYPE_VFP_S, ffi_call) + ALIGN 8 + vstr s0, [r2] + pop {fp,pc} +E(ARM_TYPE_VFP_D, ffi_call) + ALIGN 8 + vstr d0, [r2] + pop {fp,pc} +E(ARM_TYPE_VFP_N, ffi_call) + ALIGN 8 + vstm r2, {d0-d3} + pop {fp,pc} +E(ARM_TYPE_INT64, ffi_call) + ALIGN 8 + str r1, [r2, #4] + nop +E(ARM_TYPE_INT, ffi_call) + ALIGN 8 + str r0, [r2] + pop {fp,pc} +E(ARM_TYPE_VOID, ffi_call) + ALIGN 8 + pop {fp,pc} + nop +E(ARM_TYPE_STRUCT, ffi_call) + ALIGN 8 + cmp r3, #ARM_TYPE_STRUCT + pop {fp,pc} + NESTED_END ffi_call_SYSV_fake + + IMPORT |ffi_closure_inner_SYSV| + /* + int ffi_closure_inner_SYSV + ( + cif, ; r0 + fun, ; r1 + user_data, ; r2 + frame ; r3 + ) + */ + + NESTED_ENTRY_FFI ffi_go_closure_SYSV + stmdb sp!, {r0-r3} ; save argument regs + ldr r0, [ip, #4] ; load cif + ldr r1, [ip, #8] ; load fun + mov r2, ip ; load user_data + b ffi_go_closure_SYSV_0 + NESTED_END ffi_go_closure_SYSV + + ; r3: ffi_closure + + ; fake entry point exists only to generate exists only to + ; generate .pdata for exception unwinding + NESTED_ENTRY_FFI ffi_closure_SYSV_fake + PROLOG_PUSH {r11, lr} ; save fp and lr for unwind + ALTERNATE_ENTRY ffi_closure_SYSV + ldmfd sp!, {ip,r0} ; restore fp (r0 is used for stack alignment) + stmdb sp!, {r0-r3} ; save argument regs + + ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] ; ffi_closure->cif + ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] ; ffi_closure->fun + ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] ; ffi_closure->user_data + + ALTERNATE_ENTRY ffi_go_closure_SYSV_0 + add ip, sp, #16 ; compute entry sp + + sub sp, sp, #64+32 ; allocate frame parameter (sizeof(vfp_space) = 64, sizeof(result) = 32) + mov r3, sp ; set frame parameter + stmdb sp!, {ip,lr} + + bl ffi_closure_inner_SYSV ; call the Python closure + + ; Load values returned in registers. + add r2, sp, #64+8 ; address of closure_frame->result + bl ffi_closure_ret ; move result to correct register or memory for type + + ldmfd sp!, {ip,lr} + mov sp, ip ; restore stack pointer + mov pc, lr + NESTED_END ffi_closure_SYSV_fake + + IMPORT |ffi_closure_inner_VFP| + /* + int ffi_closure_inner_VFP + ( + cif, ; r0 + fun, ; r1 + user_data, ; r2 + frame ; r3 + ) + */ + + NESTED_ENTRY_FFI ffi_go_closure_VFP + stmdb sp!, {r0-r3} ; save argument regs + ldr r0, [ip, #4] ; load cif + ldr r1, [ip, #8] ; load fun + mov r2, ip ; load user_data + b ffi_go_closure_VFP_0 + NESTED_END ffi_go_closure_VFP + + ; fake entry point exists only to generate exists only to + ; generate .pdata for exception unwinding + ; r3: closure + NESTED_ENTRY_FFI ffi_closure_VFP_fake + PROLOG_PUSH {r11, lr} ; save fp and lr for unwind + + ALTERNATE_ENTRY ffi_closure_VFP + ldmfd sp!, {ip,r0} ; restore fp (r0 is used for stack alignment) + stmdb sp!, {r0-r3} ; save argument regs + + ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] ; load cif + ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] ; load fun + ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] ; load user_data + + ALTERNATE_ENTRY ffi_go_closure_VFP_0 + add ip, sp, #16 ; compute entry sp + sub sp, sp, #32 ; save space for closure_frame->result + vstmdb sp!, {d0-d7} ; push closure_frame->vfp_space + + mov r3, sp ; save closure_frame + stmdb sp!, {ip,lr} + + bl ffi_closure_inner_VFP + + ; Load values returned in registers. + add r2, sp, #64+8 ; load result + bl ffi_closure_ret + ldmfd sp!, {ip,lr} + mov sp, ip ; restore stack pointer + mov pc, lr + NESTED_END ffi_closure_VFP_fake + +/* Load values returned in registers for both closure entry points. + Note that we use LDM with SP in the register set. This is deprecated + by ARM, but not yet unpredictable. */ + + NESTED_ENTRY_FFI ffi_closure_ret + stmdb sp!, {fp,lr} + + ALIGN 8 + lsl r0, #3 + add r0, r0, pc + add r0, #8 + mov pc, r0 + +E(ARM_TYPE_VFP_S, ffi_closure) + ALIGN 8 + vldr s0, [r2] + b call_epilogue +E(ARM_TYPE_VFP_D, ffi_closure) + ALIGN 8 + vldr d0, [r2] + b call_epilogue +E(ARM_TYPE_VFP_N, ffi_closure) + ALIGN 8 + vldm r2, {d0-d3} + b call_epilogue +E(ARM_TYPE_INT64, ffi_closure) + ALIGN 8 + ldr r1, [r2, #4] + nop +E(ARM_TYPE_INT, ffi_closure) + ALIGN 8 + ldr r0, [r2] + b call_epilogue +E(ARM_TYPE_VOID, ffi_closure) + ALIGN 8 + b call_epilogue + nop +E(ARM_TYPE_STRUCT, ffi_closure) + ALIGN 8 + b call_epilogue +call_epilogue + ldmfd sp!, {fp,pc} + NESTED_END ffi_closure_ret + + AREA |.trampoline|, DATA, THUMB, READONLY + EXPORT |ffi_arm_trampoline| +|ffi_arm_trampoline| DATA +thisproc adr ip, thisproc + stmdb sp!, {ip, r0} + ldr pc, [pc, #0] + DCD 0 + ;ENDP + + END \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/avr32/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/avr32/ffi.c new file mode 100644 index 000000000000..3d43397b03ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/avr32/ffi.c @@ -0,0 +1,423 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011 Anthony Green + Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk> + + AVR32 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <asm/unistd.h> + +/* #define DEBUG */ + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned int, unsigned int, unsigned int*, unsigned int, + void (*fn)(void)); +extern void ffi_closure_SYSV (ffi_closure *); + +unsigned int pass_struct_on_stack(ffi_type *type) +{ + if(type->type != FFI_TYPE_STRUCT) + return 0; + + if(type->alignment < type->size && + !(type->size == 4 || type->size == 8) && + !(type->size == 8 && type->alignment >= 4)) + return 1; + + if(type->size == 3 || type->size == 5 || type->size == 6 || + type->size == 7) + return 1; + + return 0; +} + +/* ffi_prep_args is called by the assembly routine once stack space + * has been allocated for the function's arguments + * + * This is annoyingly complex since we need to keep track of used + * registers. + */ + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + unsigned int i; + void **p_argv; + ffi_type **p_arg; + char *reg_base = stack; + char *stack_base = stack + 20; + unsigned int stack_offset = 0; + unsigned int reg_mask = 0; + + p_argv = ecif->avalue; + + /* If cif->flags is struct then we know it's not passed in registers */ + if(ecif->cif->flags == FFI_TYPE_STRUCT) + { + *(void**)reg_base = ecif->rvalue; + reg_mask |= 1; + } + + for(i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; + i++, p_arg++) + { + size_t z = (*p_arg)->size; + int alignment = (*p_arg)->alignment; + int type = (*p_arg)->type; + char *addr = 0; + + if(z % 4 != 0) + z += (4 - z % 4); + + if(reg_mask != 0x1f) + { + if(pass_struct_on_stack(*p_arg)) + { + addr = stack_base + stack_offset; + stack_offset += z; + } + else if(z == sizeof(int)) + { + char index = 0; + + while((reg_mask >> index) & 1) + index++; + + addr = reg_base + (index * 4); + reg_mask |= (1 << index); + } + else if(z == 2 * sizeof(int)) + { + if(!((reg_mask >> 1) & 1)) + { + addr = reg_base + 4; + reg_mask |= (3 << 1); + } + else if(!((reg_mask >> 3) & 1)) + { + addr = reg_base + 12; + reg_mask |= (3 << 3); + } + } + } + + if(!addr) + { + addr = stack_base + stack_offset; + stack_offset += z; + } + + if(type == FFI_TYPE_STRUCT && (*p_arg)->elements[1] == NULL) + type = (*p_arg)->elements[0]->type; + + switch(type) + { + case FFI_TYPE_UINT8: + *(unsigned int *)addr = (unsigned int)*(UINT8 *)(*p_argv); + break; + case FFI_TYPE_SINT8: + *(signed int *)addr = (signed int)*(SINT8 *)(*p_argv); + break; + case FFI_TYPE_UINT16: + *(unsigned int *)addr = (unsigned int)*(UINT16 *)(*p_argv); + break; + case FFI_TYPE_SINT16: + *(signed int *)addr = (signed int)*(SINT16 *)(*p_argv); + break; + default: + memcpy(addr, *p_argv, z); + } + + p_argv++; + } + +#ifdef DEBUG + /* Debugging */ + for(i = 0; i < 5; i++) + { + if((reg_mask & (1 << i)) == 0) + printf("r%d: (unused)\n", 12 - i); + else + printf("r%d: 0x%08x\n", 12 - i, ((unsigned int*)reg_base)[i]); + } + + for(i = 0; i < stack_offset / 4; i++) + { + printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack_base)[i]); + } +#endif +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Round the stack up to a multiple of 8 bytes. This isn't needed + * everywhere, but it is on some platforms, and it doesn't harm + * anything when it isn't needed. */ + cif->bytes = (cif->bytes + 7) & ~7; + + /* Flag to indicate that he return value is in fact a struct */ + cif->rstruct_flag = 0; + + /* Set the return type flag */ + switch(cif->rtype->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + cif->flags = (unsigned)FFI_TYPE_UINT8; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + cif->flags = (unsigned)FFI_TYPE_UINT16; + break; + case FFI_TYPE_FLOAT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + cif->flags = (unsigned)FFI_TYPE_UINT32; + break; + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = (unsigned)FFI_TYPE_UINT64; + break; + case FFI_TYPE_STRUCT: + cif->rstruct_flag = 1; + if(!pass_struct_on_stack(cif->rtype)) + { + if(cif->rtype->size <= 1) + cif->flags = (unsigned)FFI_TYPE_UINT8; + else if(cif->rtype->size <= 2) + cif->flags = (unsigned)FFI_TYPE_UINT16; + else if(cif->rtype->size <= 4) + cif->flags = (unsigned)FFI_TYPE_UINT32; + else if(cif->rtype->size <= 8) + cif->flags = (unsigned)FFI_TYPE_UINT64; + else + cif->flags = (unsigned)cif->rtype->type; + } + else + cif->flags = (unsigned)cif->rtype->type; + break; + default: + cif->flags = (unsigned)cif->rtype->type; + break; + } + + return FFI_OK; +} + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + unsigned int size = 0, i = 0; + ffi_type **p_arg; + + ecif.cif = cif; + ecif.avalue = avalue; + + for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) + size += (*p_arg)->size + (4 - (*p_arg)->size % 4); + + /* If the return value is a struct and we don't have a return value + * address then we need to make one */ + + /* If cif->flags is struct then it's not suitable for registers */ + if((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT)) + ecif.rvalue = alloca(cif->rtype->size); + else + ecif.rvalue = rvalue; + + switch(cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, size, cif->flags, + ecif.rvalue, cif->rstruct_flag, fn); + break; + default: + FFI_ASSERT(0); + break; + } +} + +static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, + void **avalue, ffi_cif *cif) +{ + register unsigned int i, reg_mask = 0; + register void **p_argv; + register ffi_type **p_arg; + register char *reg_base = stack; + register char *stack_base = stack + 20; + register unsigned int stack_offset = 0; + +#ifdef DEBUG + /* Debugging */ + for(i = 0; i < cif->nargs + 7; i++) + { + printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack)[i]); + } +#endif + + /* If cif->flags is struct then we know it's not passed in registers */ + if(cif->flags == FFI_TYPE_STRUCT) + { + *rvalue = *(void **)reg_base; + reg_mask |= 1; + } + + p_argv = avalue; + + for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) + { + size_t z = (*p_arg)->size; + int alignment = (*p_arg)->alignment; + + *p_argv = 0; + + if(z % 4 != 0) + z += (4 - z % 4); + + if(reg_mask != 0x1f) + { + if(pass_struct_on_stack(*p_arg)) + { + *p_argv = (void*)stack_base + stack_offset; + stack_offset += z; + } + else if(z <= sizeof(int)) + { + char index = 0; + + while((reg_mask >> index) & 1) + index++; + + *p_argv = (void*)reg_base + (index * 4); + reg_mask |= (1 << index); + } + else if(z == 2 * sizeof(int)) + { + if(!((reg_mask >> 1) & 1)) + { + *p_argv = (void*)reg_base + 4; + reg_mask |= (3 << 1); + } + else if(!((reg_mask >> 3) & 1)) + { + *p_argv = (void*)reg_base + 12; + reg_mask |= (3 << 3); + } + } + } + + if(!*p_argv) + { + *p_argv = (void*)stack_base + stack_offset; + stack_offset += z; + } + + if((*p_arg)->type != FFI_TYPE_STRUCT || + (*p_arg)->elements[1] == NULL) + { + if(alignment == 1) + **(unsigned int**)p_argv <<= 24; + else if(alignment == 2) + **(unsigned int**)p_argv <<= 16; + } + + p_argv++; + } + +#ifdef DEBUG + /* Debugging */ + for(i = 0; i < cif->nargs; i++) + { + printf("sp+%d: 0x%08x\n", i*4, *(((unsigned int**)avalue)[i])); + } +#endif +} + +/* This function is jumped to by the trampoline */ + +unsigned int ffi_closure_SYSV_inner(ffi_closure *closure, void **respp, + void *args) +{ + ffi_cif *cif; + void **arg_area; + unsigned int i, size = 0; + ffi_type **p_arg; + + cif = closure->cif; + + for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) + size += (*p_arg)->size + (4 - (*p_arg)->size % 4); + + arg_area = (void **)alloca(size); + + /* this call will initialize ARG_AREA, such that each element in that + * array points to the corresponding value on the stack; and if the + * function returns a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun)(cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, + void *codeloc) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]); + unsigned int __fun = (unsigned int)(&ffi_closure_SYSV); + unsigned int __ctx = (unsigned int)(codeloc); + unsigned int __rstruct_flag = (unsigned int)(cif->rstruct_flag); + unsigned int __inner = (unsigned int)(&ffi_closure_SYSV_inner); + *(unsigned int*) &__tramp[0] = 0xebcd1f00; /* pushm r8-r12 */ + *(unsigned int*) &__tramp[4] = 0xfefc0010; /* ld.w r12, pc[16] */ + *(unsigned int*) &__tramp[8] = 0xfefb0010; /* ld.w r11, pc[16] */ + *(unsigned int*) &__tramp[12] = 0xfefa0010; /* ld.w r10, pc[16] */ + *(unsigned int*) &__tramp[16] = 0xfeff0010; /* ld.w pc, pc[16] */ + *(unsigned int*) &__tramp[20] = __ctx; + *(unsigned int*) &__tramp[24] = __rstruct_flag; + *(unsigned int*) &__tramp[28] = __inner; + *(unsigned int*) &__tramp[32] = __fun; + syscall(__NR_cacheflush, 0, (&__tramp[0]), 36); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/avr32/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/avr32/ffitarget.h new file mode 100644 index 000000000000..d0c7586f9a8b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/avr32/ffitarget.h @@ -0,0 +1,55 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk> + Target configuration macros for AVR32. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +#define FFI_EXTRA_CIF_FIELDS unsigned int rstruct_flag + +/* Definitions for closures */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 36 +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/avr32/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/avr32/sysv.S new file mode 100644 index 000000000000..a984b3c88a30 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/avr32/sysv.S @@ -0,0 +1,208 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2009 Bradley Smith <brad@brad-smith.co.uk> + + AVR32 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + --------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + /* r12: ffi_prep_args + * r11: &ecif + * r10: size + * r9: cif->flags + * r8: ecif.rvalue + * sp+0: cif->rstruct_flag + * sp+4: fn */ + + .text + .align 1 + .globl ffi_call_SYSV + .type ffi_call_SYSV, @function +ffi_call_SYSV: + stm --sp, r0,r1,lr + stm --sp, r8-r12 + mov r0, sp + + /* Make room for all of the new args. */ + sub sp, r10 + /* Pad to make way for potential skipped registers */ + sub sp, 20 + + /* Call ffi_prep_args(stack, &ecif). */ + /* r11 already set */ + mov r1, r12 + mov r12, sp + icall r1 + + /* Save new argument size */ + mov r1, r12 + + /* Move first 5 parameters in registers. */ + ldm sp++, r8-r12 + + /* call (fn) (...). */ + ld.w r1, r0[36] + icall r1 + + /* Remove the space we pushed for the args. */ + mov sp, r0 + + /* Load r1 with the rstruct flag. */ + ld.w r1, sp[32] + + /* Load r9 with the return type code. */ + ld.w r9, sp[12] + + /* Load r8 with the return value pointer. */ + ld.w r8, sp[16] + + /* If the return value pointer is NULL, assume no return value. */ + cp.w r8, 0 + breq .Lend + + /* Check if return type is actually a struct */ + cp.w r1, 0 + breq 1f + + /* Return 8bit */ + cp.w r9, FFI_TYPE_UINT8 + breq .Lstore8 + + /* Return 16bit */ + cp.w r9, FFI_TYPE_UINT16 + breq .Lstore16 + +1: + /* Return 32bit */ + cp.w r9, FFI_TYPE_UINT32 + breq .Lstore32 + cp.w r9, FFI_TYPE_UINT16 + breq .Lstore32 + cp.w r9, FFI_TYPE_UINT8 + breq .Lstore32 + + /* Return 64bit */ + cp.w r9, FFI_TYPE_UINT64 + breq .Lstore64 + + /* Didn't match anything */ + bral .Lend + +.Lstore64: + st.w r8[0], r11 + st.w r8[4], r10 + bral .Lend + +.Lstore32: + st.w r8[0], r12 + bral .Lend + +.Lstore16: + st.h r8[0], r12 + bral .Lend + +.Lstore8: + st.b r8[0], r12 + bral .Lend + +.Lend: + sub sp, -20 + ldm sp++, r0,r1,pc + + .size ffi_call_SYSV, . - ffi_call_SYSV + + + /* r12: __ctx + * r11: __rstruct_flag + * r10: __inner */ + + .align 1 + .globl ffi_closure_SYSV + .type ffi_closure_SYSV, @function +ffi_closure_SYSV: + stm --sp, r0,lr + mov r0, r11 + mov r8, r10 + sub r10, sp, -8 + sub sp, 12 + st.w sp[8], sp + sub r11, sp, -8 + icall r8 + + /* Check if return type is actually a struct */ + cp.w r0, 0 + breq 1f + + /* Return 8bit */ + cp.w r12, FFI_TYPE_UINT8 + breq .Lget8 + + /* Return 16bit */ + cp.w r12, FFI_TYPE_UINT16 + breq .Lget16 + +1: + /* Return 32bit */ + cp.w r12, FFI_TYPE_UINT32 + breq .Lget32 + cp.w r12, FFI_TYPE_UINT16 + breq .Lget32 + cp.w r12, FFI_TYPE_UINT8 + breq .Lget32 + + /* Return 64bit */ + cp.w r12, FFI_TYPE_UINT64 + breq .Lget64 + + /* Didn't match anything */ + bral .Lclend + +.Lget64: + ld.w r11, sp[0] + ld.w r10, sp[4] + bral .Lclend + +.Lget32: + ld.w r12, sp[0] + bral .Lclend + +.Lget16: + ld.uh r12, sp[0] + bral .Lclend + +.Lget8: + ld.ub r12, sp[0] + bral .Lclend + +.Lclend: + sub sp, -12 + ldm sp++, r0,lr + sub sp, -20 + mov pc, lr + + .size ffi_closure_SYSV, . - ffi_closure_SYSV + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/bfin/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/bfin/ffi.c new file mode 100644 index 000000000000..22a2acdac192 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/bfin/ffi.c @@ -0,0 +1,196 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2012 Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>, + Paulo Pizarro <paulo.pizarro@gmail.com> + + Blackfin Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <stdio.h> + +/* Maximum number of GPRs available for argument passing. */ +#define MAX_GPRARGS 3 + +/* + * Return types + */ +#define FFIBFIN_RET_VOID 0 +#define FFIBFIN_RET_BYTE 1 +#define FFIBFIN_RET_HALFWORD 2 +#define FFIBFIN_RET_INT64 3 +#define FFIBFIN_RET_INT32 4 + +/*====================================================================*/ +/* PROTOTYPE * + /*====================================================================*/ +void ffi_prep_args(unsigned char *, extended_cif *); + +/*====================================================================*/ +/* Externals */ +/* (Assembly) */ +/*====================================================================*/ + +extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void)); + +/*====================================================================*/ +/* Implementation */ +/* */ +/*====================================================================*/ + + +/* + * This function calculates the return type (size) based on type. + */ + +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* --------------------------------------* + * Return handling * + * --------------------------------------*/ + switch (cif->rtype->type) { + case FFI_TYPE_VOID: + cif->flags = FFIBFIN_RET_VOID; + break; + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + cif->flags = FFIBFIN_RET_HALFWORD; + break; + case FFI_TYPE_UINT8: + cif->flags = FFIBFIN_RET_BYTE; + break; + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_FLOAT: + case FFI_TYPE_POINTER: + case FFI_TYPE_SINT8: + cif->flags = FFIBFIN_RET_INT32; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: + cif->flags = FFIBFIN_RET_INT64; + break; + case FFI_TYPE_STRUCT: + if (cif->rtype->size <= 4){ + cif->flags = FFIBFIN_RET_INT32; + }else if (cif->rtype->size == 8){ + cif->flags = FFIBFIN_RET_INT64; + }else{ + //it will return via a hidden pointer in P0 + cif->flags = FFIBFIN_RET_VOID; + } + break; + default: + FFI_ASSERT(0); + break; + } + return FFI_OK; +} + +/* + * This will prepare the arguments and will call the assembly routine + * cif = the call interface + * fn = the function to be called + * rvalue = the return value + * avalue = the arguments + */ +void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue) +{ + int ret_type = cif->flags; + extended_cif ecif; + ecif.cif = cif; + ecif.avalue = avalue; + ecif.rvalue = rvalue; + + switch (cif->abi) { + case FFI_SYSV: + ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn); + break; + default: + FFI_ASSERT(0); + break; + } +} + + +/* +* This function prepares the parameters (copies them from the ecif to the stack) +* to call the function (ffi_prep_args is called by the assembly routine in file +* sysv.S, which also calls the actual function) +*/ +void ffi_prep_args(unsigned char *stack, extended_cif *ecif) +{ + register unsigned int i = 0; + void **p_argv; + unsigned char *argp; + ffi_type **p_arg; + argp = stack; + p_argv = ecif->avalue; + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); + i--, p_arg++) { + size_t z; + z = (*p_arg)->size; + if (z < sizeof(int)) { + z = sizeof(int); + switch ((*p_arg)->type) { + case FFI_TYPE_SINT8: { + signed char v = *(SINT8 *)(* p_argv); + signed int t = v; + *(signed int *) argp = t; + } + break; + case FFI_TYPE_UINT8: { + unsigned char v = *(UINT8 *)(* p_argv); + unsigned int t = v; + *(unsigned int *) argp = t; + } + break; + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int) * (SINT16 *)(* p_argv); + break; + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv); + break; + case FFI_TYPE_STRUCT: + memcpy(argp, *p_argv, (*p_arg)->size); + break; + default: + FFI_ASSERT(0); + break; + } + } else if (z == sizeof(int)) { + *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv); + } else { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } +} + + + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/bfin/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/bfin/ffitarget.h new file mode 100644 index 000000000000..2175c010162f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/bfin/ffitarget.h @@ -0,0 +1,43 @@ +/* ----------------------------------------------------------------------- + ffitarget.h - Copyright (c) 2012 Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com> + + Blackfin Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/bfin/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/bfin/sysv.S new file mode 100644 index 000000000000..f4278be2426d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/bfin/sysv.S @@ -0,0 +1,179 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2012 Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>, + Paulo Pizarro <paulo.pizarro@gmail.com> + + Blackfin Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +.text +.align 4 + + /* + There is a "feature" in the bfin toolchain that it puts a _ before function names + that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV + */ + .global _ffi_call_SYSV; + .type _ffi_call_SYSV, STT_FUNC; + .func ffi_call_SYSV + + /* + cif->bytes = R0 (fp+8) + &ecif = R1 (fp+12) + ffi_prep_args = R2 (fp+16) + ret_type = stack (fp+20) + ecif.rvalue = stack (fp+24) + fn = stack (fp+28) + got (fp+32) + + There is room for improvement here (we can use temporary registers + instead of saving the values in the memory) + REGS: + P5 => Stack pointer (function arguments) + R5 => cif->bytes + R4 => ret->type + + FP-20 = P3 + FP-16 = SP (parameters area) + FP-12 = SP (temp) + FP-08 = function return part 1 [R0] + FP-04 = function return part 2 [R1] + */ + +_ffi_call_SYSV: +.prologue: + LINK 20; + [FP-20] = P3; + [FP+8] = R0; + [FP+12] = R1; + [FP+16] = R2; + +.allocate_stack: + //alocate cif->bytes into the stack + R1 = [FP+8]; + R0 = SP; + R0 = R0 - R1; + R1 = 4; + R0 = R0 - R1; + [FP-12] = SP; + SP = R0; + [FP-16] = SP; + +.call_prep_args: + //get the addr of prep_args + P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4]; + P1 = [P0]; + P3 = [P0+4]; + R0 = [FP-16];//SP (parameter area) + R1 = [FP+12];//ecif + call (P1); + +.call_user_function: + //ajust SP so as to allow the user function access the parameters on the stack + SP = [FP-16]; //point to function parameters + R0 = [SP]; + R1 = [SP+4]; + R2 = [SP+8]; + //load user function address + P0 = FP; + P0 +=28; + P1 = [P0]; + P1 = [P1]; + P3 = [P0+4]; + /* + For functions returning aggregate values (struct) occupying more than 8 bytes, + the caller allocates the return value object on the stack and the address + of this object is passed to the callee as a hidden argument in register P0. + */ + P0 = [FP+24]; + + call (P1); + SP = [FP-12]; +.compute_return: + P2 = [FP-20]; + [FP-8] = R0; + [FP-4] = R1; + + R0 = [FP+20]; + R1 = R0 << 2; + + R0 = [P2+.rettable@GOT17M4]; + R0 = R1 + R0; + P2 = R0; + R1 = [P2]; + + P2 = [FP+-20]; + R0 = [P2+.rettable@GOT17M4]; + R0 = R1 + R0; + P2 = R0; + R0 = [FP-8]; + R1 = [FP-4]; + jump (P2); + +/* +#define FFIBFIN_RET_VOID 0 +#define FFIBFIN_RET_BYTE 1 +#define FFIBFIN_RET_HALFWORD 2 +#define FFIBFIN_RET_INT64 3 +#define FFIBFIN_RET_INT32 4 +*/ +.align 4 +.align 4 +.rettable: + .dd .epilogue - .rettable + .dd .rbyte - .rettable; + .dd .rhalfword - .rettable; + .dd .rint64 - .rettable; + .dd .rint32 - .rettable; + +.rbyte: + P0 = [FP+24]; + R0 = R0.B (Z); + [P0] = R0; + JUMP .epilogue +.rhalfword: + P0 = [FP+24]; + R0 = R0.L; + [P0] = R0; + JUMP .epilogue +.rint64: + P0 = [FP+24];// &rvalue + [P0] = R0; + [P0+4] = R1; + JUMP .epilogue +.rint32: + P0 = [FP+24]; + [P0] = R0; +.epilogue: + R0 = [FP+8]; + R1 = [FP+12]; + R2 = [FP+16]; + P3 = [FP-20]; + UNLINK; + RTS; + +.size _ffi_call_SYSV,.-_ffi_call_SYSV; +.endfunc diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/closures.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/closures.c new file mode 100644 index 000000000000..dfc2f68b237a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/closures.c @@ -0,0 +1,1021 @@ +/* ----------------------------------------------------------------------- + closures.c - Copyright (c) 2019 Anthony Green + Copyright (c) 2007, 2009, 2010 Red Hat, Inc. + Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc + Copyright (c) 2011 Plausible Labs Cooperative, Inc. + + Code to allocate and deallocate memory for closures. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if defined __linux__ && !defined _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_common.h> + +#ifdef __NetBSD__ +#include <sys/param.h> +#endif + +#if __NetBSD_Version__ - 0 >= 799007200 +/* NetBSD with PROT_MPROTECT */ +#include <sys/mman.h> + +#include <stddef.h> +#include <unistd.h> +#ifdef HAVE_SYS_MEMFD_H +#include <sys/memfd.h> +#endif + +static const size_t overhead = + (sizeof(max_align_t) > sizeof(void *) + sizeof(size_t)) ? + sizeof(max_align_t) + : sizeof(void *) + sizeof(size_t); + +#define ADD_TO_POINTER(p, d) ((void *)((uintptr_t)(p) + (d))) + +void * +ffi_closure_alloc (size_t size, void **code) +{ + static size_t page_size; + size_t rounded_size; + void *codeseg, *dataseg; + int prot; + + /* Expect that PAX mprotect is active and a separate code mapping is necessary. */ + if (!code) + return NULL; + + /* Obtain system page size. */ + if (!page_size) + page_size = sysconf(_SC_PAGESIZE); + + /* Round allocation size up to the next page, keeping in mind the size field and pointer to code map. */ + rounded_size = (size + overhead + page_size - 1) & ~(page_size - 1); + + /* Primary mapping is RW, but request permission to switch to PROT_EXEC later. */ + prot = PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC); + dataseg = mmap(NULL, rounded_size, prot, MAP_ANON | MAP_PRIVATE, -1, 0); + if (dataseg == MAP_FAILED) + return NULL; + + /* Create secondary mapping and switch it to RX. */ + codeseg = mremap(dataseg, rounded_size, NULL, rounded_size, MAP_REMAPDUP); + if (codeseg == MAP_FAILED) { + munmap(dataseg, rounded_size); + return NULL; + } + if (mprotect(codeseg, rounded_size, PROT_READ | PROT_EXEC) == -1) { + munmap(codeseg, rounded_size); + munmap(dataseg, rounded_size); + return NULL; + } + + /* Remember allocation size and location of the secondary mapping for ffi_closure_free. */ + memcpy(dataseg, &rounded_size, sizeof(rounded_size)); + memcpy(ADD_TO_POINTER(dataseg, sizeof(size_t)), &codeseg, sizeof(void *)); + *code = ADD_TO_POINTER(codeseg, overhead); + return ADD_TO_POINTER(dataseg, overhead); +} + +void +ffi_closure_free (void *ptr) +{ + void *codeseg, *dataseg; + size_t rounded_size; + + dataseg = ADD_TO_POINTER(ptr, -overhead); + memcpy(&rounded_size, dataseg, sizeof(rounded_size)); + memcpy(&codeseg, ADD_TO_POINTER(dataseg, sizeof(size_t)), sizeof(void *)); + munmap(dataseg, rounded_size); + munmap(codeseg, rounded_size); +} +#else /* !NetBSD with PROT_MPROTECT */ + +#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE +# if __linux__ && !defined(__ANDROID__) +/* This macro indicates it may be forbidden to map anonymous memory + with both write and execute permission. Code compiled when this + option is defined will attempt to map such pages once, but if it + fails, it falls back to creating a temporary file in a writable and + executable filesystem and mapping pages from it into separate + locations in the virtual memory space, one location writable and + another executable. */ +# define FFI_MMAP_EXEC_WRIT 1 +# define HAVE_MNTENT 1 +# endif +# if defined(_WIN32) || defined(__OS2__) +/* Windows systems may have Data Execution Protection (DEP) enabled, + which requires the use of VirtualMalloc/VirtualFree to alloc/free + executable memory. */ +# define FFI_MMAP_EXEC_WRIT 1 +# endif +#endif + +#if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX +# if defined(__linux__) && !defined(__ANDROID__) +/* When defined to 1 check for SELinux and if SELinux is active, + don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that + might cause audit messages. */ +# define FFI_MMAP_EXEC_SELINUX 1 +# endif +#endif + +#if FFI_CLOSURES + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ + +#include <mach/mach.h> +#include <pthread.h> +#ifdef HAVE_PTRAUTH +#include <ptrauth.h> +#endif +#include <stdio.h> +#include <stdlib.h> + +extern void *ffi_closure_trampoline_table_page; + +typedef struct ffi_trampoline_table ffi_trampoline_table; +typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry; + +struct ffi_trampoline_table +{ + /* contiguous writable and executable pages */ + vm_address_t config_page; + vm_address_t trampoline_page; + + /* free list tracking */ + uint16_t free_count; + ffi_trampoline_table_entry *free_list; + ffi_trampoline_table_entry *free_list_pool; + + ffi_trampoline_table *prev; + ffi_trampoline_table *next; +}; + +struct ffi_trampoline_table_entry +{ + void *(*trampoline) (void); + ffi_trampoline_table_entry *next; +}; + +/* Total number of trampolines that fit in one trampoline table */ +#define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE) + +static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER; +static ffi_trampoline_table *ffi_trampoline_tables = NULL; + +static ffi_trampoline_table * +ffi_trampoline_table_alloc (void) +{ + ffi_trampoline_table *table; + vm_address_t config_page; + vm_address_t trampoline_page; + vm_address_t trampoline_page_template; + vm_prot_t cur_prot; + vm_prot_t max_prot; + kern_return_t kt; + uint16_t i; + + /* Allocate two pages -- a config page and a placeholder page */ + config_page = 0x0; + kt = vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2, + VM_FLAGS_ANYWHERE); + if (kt != KERN_SUCCESS) + return NULL; + + /* Remap the trampoline table on top of the placeholder page */ + trampoline_page = config_page + PAGE_MAX_SIZE; + trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page; +#ifdef __arm__ + /* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */ + trampoline_page_template &= ~1UL; +#endif + kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0, + VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template, + FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); + if (kt != KERN_SUCCESS) + { + vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2); + return NULL; + } + + /* We have valid trampoline and config pages */ + table = calloc (1, sizeof (ffi_trampoline_table)); + table->free_count = FFI_TRAMPOLINE_COUNT; + table->config_page = config_page; + table->trampoline_page = trampoline_page; + + /* Create and initialize the free list */ + table->free_list_pool = + calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry)); + + for (i = 0; i < table->free_count; i++) + { + ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; + entry->trampoline = + (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); + + if (i < table->free_count - 1) + entry->next = &table->free_list_pool[i + 1]; + } + + table->free_list = table->free_list_pool; + + return table; +} + +static void +ffi_trampoline_table_free (ffi_trampoline_table *table) +{ + /* Remove from the list */ + if (table->prev != NULL) + table->prev->next = table->next; + + if (table->next != NULL) + table->next->prev = table->prev; + + /* Deallocate pages */ + vm_deallocate (mach_task_self (), table->config_page, PAGE_MAX_SIZE * 2); + + /* Deallocate free list */ + free (table->free_list_pool); + free (table); +} + +void * +ffi_closure_alloc (size_t size, void **code) +{ + /* Create the closure */ + ffi_closure *closure = malloc (size); + if (closure == NULL) + return NULL; + + pthread_mutex_lock (&ffi_trampoline_lock); + + /* Check for an active trampoline table with available entries. */ + ffi_trampoline_table *table = ffi_trampoline_tables; + if (table == NULL || table->free_list == NULL) + { + table = ffi_trampoline_table_alloc (); + if (table == NULL) + { + pthread_mutex_unlock (&ffi_trampoline_lock); + free (closure); + return NULL; + } + + /* Insert the new table at the top of the list */ + table->next = ffi_trampoline_tables; + if (table->next != NULL) + table->next->prev = table; + + ffi_trampoline_tables = table; + } + + /* Claim the free entry */ + ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list; + ffi_trampoline_tables->free_list = entry->next; + ffi_trampoline_tables->free_count--; + entry->next = NULL; + + pthread_mutex_unlock (&ffi_trampoline_lock); + + /* Initialize the return values */ + *code = entry->trampoline; +#ifdef HAVE_PTRAUTH + *code = ptrauth_sign_unauthenticated (*code, ptrauth_key_asia, 0); +#endif + closure->trampoline_table = table; + closure->trampoline_table_entry = entry; + + return closure; +} + +void +ffi_closure_free (void *ptr) +{ + ffi_closure *closure = ptr; + + pthread_mutex_lock (&ffi_trampoline_lock); + + /* Fetch the table and entry references */ + ffi_trampoline_table *table = closure->trampoline_table; + ffi_trampoline_table_entry *entry = closure->trampoline_table_entry; + + /* Return the entry to the free list */ + entry->next = table->free_list; + table->free_list = entry; + table->free_count++; + + /* If all trampolines within this table are free, and at least one other table exists, deallocate + * the table */ + if (table->free_count == FFI_TRAMPOLINE_COUNT + && ffi_trampoline_tables != table) + { + ffi_trampoline_table_free (table); + } + else if (ffi_trampoline_tables != table) + { + /* Otherwise, bump this table to the top of the list */ + table->prev = NULL; + table->next = ffi_trampoline_tables; + if (ffi_trampoline_tables != NULL) + ffi_trampoline_tables->prev = table; + + ffi_trampoline_tables = table; + } + + pthread_mutex_unlock (&ffi_trampoline_lock); + + /* Free the closure */ + free (closure); +} + +#endif + +// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations. + +#elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */ + +#define USE_LOCKS 1 +#define USE_DL_PREFIX 1 +#ifdef __GNUC__ +#ifndef USE_BUILTIN_FFS +#define USE_BUILTIN_FFS 1 +#endif +#endif + +/* We need to use mmap, not sbrk. */ +#define HAVE_MORECORE 0 + +/* We could, in theory, support mremap, but it wouldn't buy us anything. */ +#define HAVE_MREMAP 0 + +/* We have no use for this, so save some code and data. */ +#define NO_MALLINFO 1 + +/* We need all allocations to be in regular segments, otherwise we + lose track of the corresponding code address. */ +#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T + +/* Don't allocate more than a page unless needed. */ +#define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize) + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#ifndef _MSC_VER +#include <unistd.h> +#endif +#include <string.h> +#include <stdio.h> +#if !defined(_WIN32) +#ifdef HAVE_MNTENT +#include <mntent.h> +#endif /* HAVE_MNTENT */ +#include <sys/param.h> +#include <pthread.h> + +/* We don't want sys/mman.h to be included after we redefine mmap and + dlmunmap. */ +#include <sys/mman.h> +#define LACKS_SYS_MMAN_H 1 + +#if FFI_MMAP_EXEC_SELINUX +#include <sys/statfs.h> +#include <stdlib.h> + +static int selinux_enabled = -1; + +static int +selinux_enabled_check (void) +{ + struct statfs sfs; + FILE *f; + char *buf = NULL; + size_t len = 0; + + if (statfs ("/selinux", &sfs) >= 0 + && (unsigned int) sfs.f_type == 0xf97cff8cU) + return 1; + f = fopen ("/proc/mounts", "r"); + if (f == NULL) + return 0; + while (getline (&buf, &len, f) >= 0) + { + char *p = strchr (buf, ' '); + if (p == NULL) + break; + p = strchr (p + 1, ' '); + if (p == NULL) + break; + if (strncmp (p + 1, "selinuxfs ", 10) == 0) + { + free (buf); + fclose (f); + return 1; + } + } + free (buf); + fclose (f); + return 0; +} + +#define is_selinux_enabled() (selinux_enabled >= 0 ? selinux_enabled \ + : (selinux_enabled = selinux_enabled_check ())) + +#else + +#define is_selinux_enabled() 0 + +#endif /* !FFI_MMAP_EXEC_SELINUX */ + +/* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */ +#ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX +#include <stdlib.h> + +static int emutramp_enabled = -1; + +static int +emutramp_enabled_check (void) +{ + char *buf = NULL; + size_t len = 0; + FILE *f; + int ret; + f = fopen ("/proc/self/status", "r"); + if (f == NULL) + return 0; + ret = 0; + + while (getline (&buf, &len, f) != -1) + if (!strncmp (buf, "PaX:", 4)) + { + char emutramp; + if (sscanf (buf, "%*s %*c%c", &emutramp) == 1) + ret = (emutramp == 'E'); + break; + } + free (buf); + fclose (f); + return ret; +} + +#define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \ + : (emutramp_enabled = emutramp_enabled_check ())) +#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ + +#elif defined (__CYGWIN__) || defined(__INTERIX) + +#include <sys/mman.h> + +/* Cygwin is Linux-like, but not quite that Linux-like. */ +#define is_selinux_enabled() 0 + +#endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */ + +#ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX +#define is_emutramp_enabled() 0 +#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ + +/* Declare all functions defined in dlmalloc.c as static. */ +static void *dlmalloc(size_t); +static void dlfree(void*); +static void *dlcalloc(size_t, size_t) MAYBE_UNUSED; +static void *dlrealloc(void *, size_t) MAYBE_UNUSED; +static void *dlmemalign(size_t, size_t) MAYBE_UNUSED; +static void *dlvalloc(size_t) MAYBE_UNUSED; +static int dlmallopt(int, int) MAYBE_UNUSED; +static size_t dlmalloc_footprint(void) MAYBE_UNUSED; +static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED; +static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED; +static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED; +static void *dlpvalloc(size_t) MAYBE_UNUSED; +static int dlmalloc_trim(size_t) MAYBE_UNUSED; +static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED; +static void dlmalloc_stats(void) MAYBE_UNUSED; + +#if !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) +/* Use these for mmap and munmap within dlmalloc.c. */ +static void *dlmmap(void *, size_t, int, int, int, off_t); +static int dlmunmap(void *, size_t); +#endif /* !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ + +#define mmap dlmmap +#define munmap dlmunmap + +#include "dlmalloc.c" + +#undef mmap +#undef munmap + +#if !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) + +/* A mutex used to synchronize access to *exec* variables in this file. */ +static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER; + +/* A file descriptor of a temporary file from which we'll map + executable pages. */ +static int execfd = -1; + +/* The amount of space already allocated from the temporary file. */ +static size_t execsize = 0; + +#ifdef HAVE_MEMFD_CREATE +/* Open a temporary file name, and immediately unlink it. */ +static int +open_temp_exec_file_memfd (const char *name) +{ + int fd; + fd = memfd_create (name, MFD_CLOEXEC); + return fd; +} +#endif + +/* Open a temporary file name, and immediately unlink it. */ +static int +open_temp_exec_file_name (char *name, int flags) +{ + int fd; + +#ifdef HAVE_MKOSTEMP + fd = mkostemp (name, flags); +#else + fd = mkstemp (name); +#endif + + if (fd != -1) + unlink (name); + + return fd; +} + +/* Open a temporary file in the named directory. */ +static int +open_temp_exec_file_dir (const char *dir) +{ + static const char suffix[] = "/ffiXXXXXX"; + int lendir, flags; + char *tempname; +#ifdef O_TMPFILE + int fd; +#endif + +#ifdef O_CLOEXEC + flags = O_CLOEXEC; +#else + flags = 0; +#endif + +#ifdef O_TMPFILE + fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700); + /* If the running system does not support the O_TMPFILE flag then retry without it. */ + if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) { + return fd; + } else { + errno = 0; + } +#endif + + lendir = (int) strlen (dir); + tempname = __builtin_alloca (lendir + sizeof (suffix)); + + if (!tempname) + return -1; + + memcpy (tempname, dir, lendir); + memcpy (tempname + lendir, suffix, sizeof (suffix)); + + return open_temp_exec_file_name (tempname, flags); +} + +/* Open a temporary file in the directory in the named environment + variable. */ +static int +open_temp_exec_file_env (const char *envvar) +{ + const char *value = getenv (envvar); + + if (!value) + return -1; + + return open_temp_exec_file_dir (value); +} + +#ifdef HAVE_MNTENT +/* Open a temporary file in an executable and writable mount point + listed in the mounts file. Subsequent calls with the same mounts + keep searching for mount points in the same file. Providing NULL + as the mounts file closes the file. */ +static int +open_temp_exec_file_mnt (const char *mounts) +{ + static const char *last_mounts; + static FILE *last_mntent; + + if (mounts != last_mounts) + { + if (last_mntent) + endmntent (last_mntent); + + last_mounts = mounts; + + if (mounts) + last_mntent = setmntent (mounts, "r"); + else + last_mntent = NULL; + } + + if (!last_mntent) + return -1; + + for (;;) + { + int fd; + struct mntent mnt; + char buf[MAXPATHLEN * 3]; + + if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL) + return -1; + + if (hasmntopt (&mnt, "ro") + || hasmntopt (&mnt, "noexec") + || access (mnt.mnt_dir, W_OK)) + continue; + + fd = open_temp_exec_file_dir (mnt.mnt_dir); + + if (fd != -1) + return fd; + } +} +#endif /* HAVE_MNTENT */ + +/* Instructions to look for a location to hold a temporary file that + can be mapped in for execution. */ +static struct +{ + int (*func)(const char *); + const char *arg; + int repeat; +} open_temp_exec_file_opts[] = { +#ifdef HAVE_MEMFD_CREATE + { open_temp_exec_file_memfd, "libffi", 0 }, +#endif + { open_temp_exec_file_env, "TMPDIR", 0 }, + { open_temp_exec_file_dir, "/tmp", 0 }, + { open_temp_exec_file_dir, "/var/tmp", 0 }, + { open_temp_exec_file_dir, "/dev/shm", 0 }, + { open_temp_exec_file_env, "HOME", 0 }, +#ifdef HAVE_MNTENT + { open_temp_exec_file_mnt, "/etc/mtab", 1 }, + { open_temp_exec_file_mnt, "/proc/mounts", 1 }, +#endif /* HAVE_MNTENT */ +}; + +/* Current index into open_temp_exec_file_opts. */ +static int open_temp_exec_file_opts_idx = 0; + +/* Reset a current multi-call func, then advances to the next entry. + If we're at the last, go back to the first and return nonzero, + otherwise return zero. */ +static int +open_temp_exec_file_opts_next (void) +{ + if (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) + open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func (NULL); + + open_temp_exec_file_opts_idx++; + if (open_temp_exec_file_opts_idx + == (sizeof (open_temp_exec_file_opts) + / sizeof (*open_temp_exec_file_opts))) + { + open_temp_exec_file_opts_idx = 0; + return 1; + } + + return 0; +} + +/* Return a file descriptor of a temporary zero-sized file in a + writable and executable filesystem. */ +static int +open_temp_exec_file (void) +{ + int fd; + + do + { + fd = open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func + (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].arg); + + if (!open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat + || fd == -1) + { + if (open_temp_exec_file_opts_next ()) + break; + } + } + while (fd == -1); + + return fd; +} + +/* We need to allocate space in a file that will be backing a writable + mapping. Several problems exist with the usual approaches: + - fallocate() is Linux-only + - posix_fallocate() is not available on all platforms + - ftruncate() does not allocate space on filesystems with sparse files + Failure to allocate the space will cause SIGBUS to be thrown when + the mapping is subsequently written to. */ +static int +allocate_space (int fd, off_t offset, off_t len) +{ + static size_t page_size; + + /* Obtain system page size. */ + if (!page_size) + page_size = sysconf(_SC_PAGESIZE); + + unsigned char buf[page_size]; + memset (buf, 0, page_size); + + while (len > 0) + { + off_t to_write = (len < page_size) ? len : page_size; + if (write (fd, buf, to_write) < to_write) + return -1; + len -= to_write; + } + + return 0; +} + +/* Map in a chunk of memory from the temporary exec file into separate + locations in the virtual memory address space, one writable and one + executable. Returns the address of the writable portion, after + storing an offset to the corresponding executable portion at the + last word of the requested chunk. */ +static void * +dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset) +{ + void *ptr; + + if (execfd == -1) + { + open_temp_exec_file_opts_idx = 0; + retry_open: + execfd = open_temp_exec_file (); + if (execfd == -1) + return MFAIL; + } + + offset = execsize; + + if (allocate_space (execfd, offset, length)) + return MFAIL; + + flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS); + flags |= MAP_SHARED; + + ptr = mmap (NULL, length, (prot & ~PROT_WRITE) | PROT_EXEC, + flags, execfd, offset); + if (ptr == MFAIL) + { + if (!offset) + { + close (execfd); + goto retry_open; + } + if (ftruncate (execfd, offset) != 0) + { + /* Fixme : Error logs can be added here. Returning an error for + * ftruncte() will not add any advantage as it is being + * validating in the error case. */ + } + + return MFAIL; + } + else if (!offset + && open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) + open_temp_exec_file_opts_next (); + + start = mmap (start, length, prot, flags, execfd, offset); + + if (start == MFAIL) + { + munmap (ptr, length); + if (ftruncate (execfd, offset) != 0) + { + /* Fixme : Error logs can be added here. Returning an error for + * ftruncte() will not add any advantage as it is being + * validating in the error case. */ + } + return start; + } + + mmap_exec_offset ((char *)start, length) = (char*)ptr - (char*)start; + + execsize += length; + + return start; +} + +/* Map in a writable and executable chunk of memory if possible. + Failing that, fall back to dlmmap_locked. */ +static void * +dlmmap (void *start, size_t length, int prot, + int flags, int fd, off_t offset) +{ + void *ptr; + + assert (start == NULL && length % malloc_getpagesize == 0 + && prot == (PROT_READ | PROT_WRITE) + && flags == (MAP_PRIVATE | MAP_ANONYMOUS) + && fd == -1 && offset == 0); + + if (execfd == -1 && is_emutramp_enabled ()) + { + ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset); + return ptr; + } + + if (execfd == -1 && !is_selinux_enabled ()) + { + ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset); + + if (ptr != MFAIL || (errno != EPERM && errno != EACCES)) + /* Cool, no need to mess with separate segments. */ + return ptr; + + /* If MREMAP_DUP is ever introduced and implemented, try mmap + with ((prot & ~PROT_WRITE) | PROT_EXEC) and mremap with + MREMAP_DUP and prot at this point. */ + } + + if (execsize == 0 || execfd == -1) + { + pthread_mutex_lock (&open_temp_exec_file_mutex); + ptr = dlmmap_locked (start, length, prot, flags, offset); + pthread_mutex_unlock (&open_temp_exec_file_mutex); + + return ptr; + } + + return dlmmap_locked (start, length, prot, flags, offset); +} + +/* Release memory at the given address, as well as the corresponding + executable page if it's separate. */ +static int +dlmunmap (void *start, size_t length) +{ + /* We don't bother decreasing execsize or truncating the file, since + we can't quite tell whether we're unmapping the end of the file. + We don't expect frequent deallocation anyway. If we did, we + could locate pages in the file by writing to the pages being + deallocated and checking that the file contents change. + Yuck. */ + msegmentptr seg = segment_holding (gm, start); + void *code; + + if (seg && (code = add_segment_exec_offset (start, seg)) != start) + { + int ret = munmap (code, length); + if (ret) + return ret; + } + + return munmap (start, length); +} + +#if FFI_CLOSURE_FREE_CODE +/* Return segment holding given code address. */ +static msegmentptr +segment_holding_code (mstate m, char* addr) +{ + msegmentptr sp = &m->seg; + for (;;) { + if (addr >= add_segment_exec_offset (sp->base, sp) + && addr < add_segment_exec_offset (sp->base, sp) + sp->size) + return sp; + if ((sp = sp->next) == 0) + return 0; + } +} +#endif + +#endif /* !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ + +/* Allocate a chunk of memory with the given size. Returns a pointer + to the writable address, and sets *CODE to the executable + corresponding virtual address. */ +void * +ffi_closure_alloc (size_t size, void **code) +{ + void *ptr; + + if (!code) + return NULL; + + ptr = FFI_CLOSURE_PTR (dlmalloc (size)); + + if (ptr) + { + msegmentptr seg = segment_holding (gm, ptr); + + *code = add_segment_exec_offset (ptr, seg); + } + + return ptr; +} + +void * +ffi_data_to_code_pointer (void *data) +{ + msegmentptr seg = segment_holding (gm, data); + /* We expect closures to be allocated with ffi_closure_alloc(), in + which case seg will be non-NULL. However, some users take on the + burden of managing this memory themselves, in which case this + we'll just return data. */ + if (seg) + return add_segment_exec_offset (data, seg); + else + return data; +} + +/* Release a chunk of memory allocated with ffi_closure_alloc. If + FFI_CLOSURE_FREE_CODE is nonzero, the given address can be the + writable or the executable address given. Otherwise, only the + writable address can be provided here. */ +void +ffi_closure_free (void *ptr) +{ +#if FFI_CLOSURE_FREE_CODE + msegmentptr seg = segment_holding_code (gm, ptr); + + if (seg) + ptr = sub_segment_exec_offset (ptr, seg); +#endif + + dlfree (FFI_RESTORE_PTR (ptr)); +} + +# else /* ! FFI_MMAP_EXEC_WRIT */ + +/* On many systems, memory returned by malloc is writable and + executable, so just use it. */ + +#include <stdlib.h> + +void * +ffi_closure_alloc (size_t size, void **code) +{ + if (!code) + return NULL; + + return *code = FFI_CLOSURE_PTR (malloc (size)); +} + +void +ffi_closure_free (void *ptr) +{ + free (FFI_RESTORE_PTR (ptr)); +} + +void * +ffi_data_to_code_pointer (void *data) +{ + return data; +} + +# endif /* ! FFI_MMAP_EXEC_WRIT */ +#endif /* FFI_CLOSURES */ + +#endif /* NetBSD with PROT_MPROTECT */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/cris/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/cris/ffi.c new file mode 100644 index 000000000000..9011fdec03a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/cris/ffi.c @@ -0,0 +1,386 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Cygnus Solutions + Copyright (c) 2004 Simon Posnjak + Copyright (c) 2005 Axis Communications AB + Copyright (C) 2007 Free Software Foundation, Inc. + + CRIS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#define STACK_ARG_SIZE(x) FFI_ALIGN(x, FFI_SIZEOF_ARG) + +static ffi_status +initialize_aggregate_packed_struct (ffi_type * arg) +{ + ffi_type **ptr; + + FFI_ASSERT (arg != NULL); + + FFI_ASSERT (arg->elements != NULL); + FFI_ASSERT (arg->size == 0); + FFI_ASSERT (arg->alignment == 0); + + ptr = &(arg->elements[0]); + + while ((*ptr) != NULL) + { + if (((*ptr)->size == 0) + && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + FFI_ASSERT (ffi_type_test ((*ptr))); + + arg->size += (*ptr)->size; + + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; + + ptr++; + } + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + else + return FFI_OK; +} + +int +ffi_prep_args (char *stack, extended_cif * ecif) +{ + unsigned int i; + unsigned int struct_count = 0; + void **p_argv; + char *argp; + ffi_type **p_arg; + + argp = stack; + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); i--, p_arg++) + { + size_t z; + + switch ((*p_arg)->type) + { + case FFI_TYPE_STRUCT: + { + z = (*p_arg)->size; + if (z <= 4) + { + memcpy (argp, *p_argv, z); + z = 4; + } + else if (z <= 8) + { + memcpy (argp, *p_argv, z); + z = 8; + } + else + { + unsigned int uiLocOnStack; + z = sizeof (void *); + uiLocOnStack = 4 * ecif->cif->nargs + struct_count; + struct_count = struct_count + (*p_arg)->size; + *(unsigned int *) argp = + (unsigned int) (UINT32 *) (stack + uiLocOnStack); + memcpy ((stack + uiLocOnStack), *p_argv, (*p_arg)->size); + } + break; + } + default: + z = (*p_arg)->size; + if (z < sizeof (int)) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = + (unsigned int) *(UINT8 *) (*p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = + (unsigned int) *(UINT16 *) (*p_argv); + break; + + default: + FFI_ASSERT (0); + } + z = sizeof (int); + } + else if (z == sizeof (int)) + *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv); + else + memcpy (argp, *p_argv, z); + break; + } + p_argv++; + argp += z; + } + + return (struct_count); +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_core (ffi_cif * cif, + ffi_abi abi, unsigned int isvariadic, + unsigned int nfixedargs, unsigned int ntotalargs, + ffi_type * rtype, ffi_type ** atypes) +{ + unsigned bytes = 0; + unsigned int i; + ffi_type **ptr; + + FFI_ASSERT (cif != NULL); + FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); + FFI_ASSERT(nfixedargs <= ntotalargs); + FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI); + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = ntotalargs; + cif->rtype = rtype; + + cif->flags = 0; + + if ((cif->rtype->size == 0) + && (initialize_aggregate_packed_struct (cif->rtype) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + FFI_ASSERT_VALID_TYPE (cif->rtype); + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + if (((*ptr)->size == 0) + && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + + FFI_ASSERT_VALID_TYPE (*ptr); + + if (((*ptr)->alignment - 1) & bytes) + bytes = FFI_ALIGN (bytes, (*ptr)->alignment); + if ((*ptr)->type == FFI_TYPE_STRUCT) + { + if ((*ptr)->size > 8) + { + bytes += (*ptr)->size; + bytes += sizeof (void *); + } + else + { + if ((*ptr)->size > 4) + bytes += 8; + else + bytes += 4; + } + } + else + bytes += STACK_ARG_SIZE ((*ptr)->size); + } + + cif->bytes = bytes; + + return ffi_prep_cif_machdep (cif); +} + +ffi_status +ffi_prep_cif_machdep (ffi_cif * cif) +{ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = (unsigned) cif->rtype->type; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + + return FFI_OK; +} + +extern void ffi_call_SYSV (int (*)(char *, extended_cif *), + extended_cif *, + unsigned, unsigned, unsigned *, void (*fn) ()) + __attribute__ ((__visibility__ ("hidden"))); + +void +ffi_call (ffi_cif * cif, void (*fn) (), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca (cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV (ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + default: + FFI_ASSERT (0); + break; + } +} + +/* Because the following variables are not exported outside libffi, we + mark them hidden. */ + +/* Assembly code for the jump stub. */ +extern const char ffi_cris_trampoline_template[] + __attribute__ ((__visibility__ ("hidden"))); + +/* Offset into ffi_cris_trampoline_template of where to put the + ffi_prep_closure_inner function. */ +extern const int ffi_cris_trampoline_fn_offset + __attribute__ ((__visibility__ ("hidden"))); + +/* Offset into ffi_cris_trampoline_template of where to put the + closure data. */ +extern const int ffi_cris_trampoline_closure_offset + __attribute__ ((__visibility__ ("hidden"))); + +/* This function is sibling-called (jumped to) by the closure + trampoline. We get R10..R13 at PARAMS[0..3] and a copy of [SP] at + PARAMS[4] to simplify handling of a straddling parameter. A copy + of R9 is at PARAMS[5] and SP at PARAMS[6]. These parameters are + put at the appropriate place in CLOSURE which is then executed and + the return value is passed back to the caller. */ + +static unsigned long long +ffi_prep_closure_inner (void **params, ffi_closure* closure) +{ + char *register_args = (char *) params; + void *struct_ret = params[5]; + char *stack_args = params[6]; + char *ptr = register_args; + ffi_cif *cif = closure->cif; + ffi_type **arg_types = cif->arg_types; + + /* Max room needed is number of arguments as 64-bit values. */ + void **avalue = alloca (closure->cif->nargs * sizeof(void *)); + int i; + int doing_regs; + long long llret = 0; + + /* Find the address of each argument. */ + for (i = 0, doing_regs = 1; i < cif->nargs; i++) + { + /* Types up to and including 8 bytes go by-value. */ + if (arg_types[i]->size <= 4) + { + avalue[i] = ptr; + ptr += 4; + } + else if (arg_types[i]->size <= 8) + { + avalue[i] = ptr; + ptr += 8; + } + else + { + FFI_ASSERT (arg_types[i]->type == FFI_TYPE_STRUCT); + + /* Passed by-reference, so copy the pointer. */ + avalue[i] = *(void **) ptr; + ptr += 4; + } + + /* If we've handled more arguments than fit in registers, start + looking at the those passed on the stack. Step over the + first one if we had a straddling parameter. */ + if (doing_regs && ptr >= register_args + 4*4) + { + ptr = stack_args + ((ptr > register_args + 4*4) ? 4 : 0); + doing_regs = 0; + } + } + + /* Invoke the closure. */ + (closure->fun) (cif, + + cif->rtype->type == FFI_TYPE_STRUCT + /* The caller allocated space for the return + structure, and passed a pointer to this space in + R9. */ + ? struct_ret + + /* We take advantage of being able to ignore that + the high part isn't set if the return value is + not in R10:R11, but in R10 only. */ + : (void *) &llret, + + avalue, closure->user_data); + + return llret; +} + +/* API function: Prepare the trampoline. */ + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif *, void *, void **, void*), + void *user_data, + void *codeloc) +{ + void *innerfn = ffi_prep_closure_inner; + FFI_ASSERT (cif->abi == FFI_SYSV); + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + memcpy (closure->tramp, ffi_cris_trampoline_template, + FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE); + memcpy (closure->tramp + ffi_cris_trampoline_fn_offset, + &innerfn, sizeof (void *)); + memcpy (closure->tramp + ffi_cris_trampoline_closure_offset, + &codeloc, sizeof (void *)); + + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/cris/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/cris/ffitarget.h new file mode 100644 index 000000000000..b837e976e4e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/cris/ffitarget.h @@ -0,0 +1,56 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for CRIS. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE 36 +#define FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE (7*4) +#define FFI_TRAMPOLINE_SIZE \ + (FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE + FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE) +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/cris/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/cris/sysv.S new file mode 100644 index 000000000000..79abaee4d959 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/cris/sysv.S @@ -0,0 +1,215 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2004 Simon Posnjak + Copyright (c) 2005 Axis Communications AB + + CRIS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <ffi.h> +#define CONCAT(x,y) x ## y +#define XCONCAT(x,y) CONCAT (x, y) +#define L(x) XCONCAT (__USER_LABEL_PREFIX__, x) + + .text + + ;; OK, when we get called we should have this (according to + ;; AXIS ETRAX 100LX Programmer's Manual chapter 6.3). + ;; + ;; R10: ffi_prep_args (func. pointer) + ;; R11: &ecif + ;; R12: cif->bytes + ;; R13: fig->flags + ;; sp+0: ecif.rvalue + ;; sp+4: fn (function pointer to the function that we need to call) + + .globl L(ffi_call_SYSV) + .type L(ffi_call_SYSV),@function + .hidden L(ffi_call_SYSV) + +L(ffi_call_SYSV): + ;; Save the regs to the stack. + push $srp + ;; Used for stack pointer saving. + push $r6 + ;; Used for function address pointer. + push $r7 + ;; Used for stack pointer saving. + push $r8 + ;; We save fig->flags to stack we will need them after we + ;; call The Function. + push $r13 + + ;; Saving current stack pointer. + move.d $sp,$r8 + move.d $sp,$r6 + + ;; Move address of ffi_prep_args to r13. + move.d $r10,$r13 + + ;; Make room on the stack for the args of fn. + sub.d $r12,$sp + + ;; Function void ffi_prep_args(char *stack, extended_cif *ecif) parameters are: + ;; r10 <-- stack pointer + ;; r11 <-- &ecif (already there) + move.d $sp,$r10 + + ;; Call the function. + jsr $r13 + + ;; Save the size of the structures which are passed on stack. + move.d $r10,$r7 + + ;; Move first four args in to r10..r13. + move.d [$sp+0],$r10 + move.d [$sp+4],$r11 + move.d [$sp+8],$r12 + move.d [$sp+12],$r13 + + ;; Adjust the stack and check if any parameters are given on stack. + addq 16,$sp + sub.d $r7,$r6 + cmp.d $sp,$r6 + + bpl go_on + nop + +go_on_no_params_on_stack: + move.d $r6,$sp + +go_on: + ;; Discover if we need to put rval address in to r9. + move.d [$r8+0],$r7 + cmpq FFI_TYPE_STRUCT,$r7 + bne call_now + nop + + ;; Move rval address to $r9. + move.d [$r8+20],$r9 + +call_now: + ;; Move address of The Function in to r7. + move.d [$r8+24],$r7 + + ;; Call The Function. + jsr $r7 + + ;; Reset stack. + move.d $r8,$sp + + ;; Load rval type (fig->flags) in to r13. + pop $r13 + + ;; Detect rval type. + cmpq FFI_TYPE_VOID,$r13 + beq epilogue + + cmpq FFI_TYPE_STRUCT,$r13 + beq epilogue + + cmpq FFI_TYPE_DOUBLE,$r13 + beq return_double_or_longlong + + cmpq FFI_TYPE_UINT64,$r13 + beq return_double_or_longlong + + cmpq FFI_TYPE_SINT64,$r13 + beq return_double_or_longlong + nop + + ;; Just return the 32 bit value. + ba return + nop + +return_double_or_longlong: + ;; Load half of the rval to r10 and the other half to r11. + move.d [$sp+16],$r13 + move.d $r10,[$r13] + addq 4,$r13 + move.d $r11,[$r13] + ba epilogue + nop + +return: + ;; Load the rval to r10. + move.d [$sp+16],$r13 + move.d $r10,[$r13] + +epilogue: + pop $r8 + pop $r7 + pop $r6 + Jump [$sp+] + + .size ffi_call_SYSV,.-ffi_call_SYSV + +/* Save R10..R13 into an array, somewhat like varargs. Copy the next + argument too, to simplify handling of any straddling parameter. + Save R9 and SP after those. Jump to function handling the rest. + Since this is a template, copied and the main function filled in by + the user. */ + + .globl L(ffi_cris_trampoline_template) + .type L(ffi_cris_trampoline_template),@function + .hidden L(ffi_cris_trampoline_template) + +L(ffi_cris_trampoline_template): +0: + /* The value we get for "PC" is right after the prefix instruction, + two bytes from the beginning, i.e. 0b+2. */ + move.d $r10,[$pc+2f-(0b+2)] + move.d $pc,$r10 +1: + addq 2f-1b+4,$r10 + move.d $r11,[$r10+] + move.d $r12,[$r10+] + move.d $r13,[$r10+] + move.d [$sp],$r11 + move.d $r11,[$r10+] + move.d $r9,[$r10+] + move.d $sp,[$r10+] + subq FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE,$r10 + move.d 0,$r11 +3: + jump 0 +2: + .size ffi_cris_trampoline_template,.-0b + +/* This macro create a constant usable as "extern const int \name" in + C from within libffi, when \name has no prefix decoration. */ + + .macro const name,value + .globl \name + .type \name,@object + .hidden \name +\name: + .dword \value + .size \name,4 + .endm + +/* Constants for offsets within the trampoline. We could do this with + just symbols, avoiding memory contents and memory accesses, but the + C usage code would look a bit stranger. */ + + const L(ffi_cris_trampoline_fn_offset),2b-4-0b + const L(ffi_cris_trampoline_closure_offset),3b-4-0b diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/csky/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/csky/ffi.c new file mode 100644 index 000000000000..af50b7c648df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/csky/ffi.c @@ -0,0 +1,395 @@ +/* ----------------------------------------------------------------------- + ffi.c + + CSKY Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments +*/ +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); + i--, p_arg++) + { + size_t z; + size_t alignment; + + /* Align if necessary */ + alignment = (*p_arg)->alignment; +#ifdef __CSKYABIV1__ + /* + * Adapt ABIV1 bug. + * If struct's size is larger than 8 bytes, then it always alignment as 4 bytes. + */ + if (((*p_arg)->type == FFI_TYPE_STRUCT) && ((*p_arg)->size > 8) && (alignment == 8)) { + alignment = 4; + } +#endif + + if ((alignment - 1) & (unsigned) argp) { + argp = (char *) FFI_ALIGN(argp, alignment); + } + + if ((*p_arg)->type == FFI_TYPE_STRUCT) + argp = (char *) FFI_ALIGN(argp, 4); + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: +#ifdef __CSKYBE__ + memcpy((argp + 4 - (*p_arg)->size), *p_argv, (*p_arg)->size); +#else + memcpy(argp, *p_argv, (*p_arg)->size); +#endif + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof(int)) + { + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Round the stack up to a multiple of 8 bytes. This isn't needed + everywhere, but it is on some platforms, and it doesn't hcsky anything + when it isn't needed. */ + cif->bytes = (cif->bytes + 7) & ~7; + + /* Set the return type flag */ + switch (cif->rtype->type) + { + + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = (unsigned) FFI_TYPE_SINT64; + break; + + case FFI_TYPE_STRUCT: + if (cif->rtype->size <= 4) + /* A Composite Type not larger than 4 bytes is returned in r0. */ + cif->flags = (unsigned)FFI_TYPE_INT; + else if (cif->rtype->size <= 8) + /* A Composite Type not larger than 8 bytes is returned in r0, r1. */ + cif->flags = (unsigned)FFI_TYPE_SINT64; + else + /* A Composite Type larger than 8 bytes, or whose size cannot + be determined statically ... is stored in memory at an + address passed [in r0]. */ + cif->flags = (unsigned)FFI_TYPE_STRUCT; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + + return FFI_OK; +} + +/* Perform machine dependent cif processing for variadic calls */ +ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, + unsigned int nfixedargs, + unsigned int ntotalargs) +{ + return ffi_prep_cif_machdep(cif); +} + +/* Prototypes for assembly functions, in sysv.S */ +extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + int small_struct = (cif->flags == FFI_TYPE_INT + && cif->rtype->type == FFI_TYPE_STRUCT); + + ecif.cif = cif; + ecif.avalue = avalue; + + unsigned int temp; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->flags == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else if (small_struct) + ecif.rvalue = &temp; + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); + break; + + default: + FFI_ASSERT(0); + break; + } + if (small_struct) +#ifdef __CSKYBE__ + memcpy (rvalue, ((unsigned char *)&temp + (4 - cif->rtype->size)), cif->rtype->size); +#else + memcpy (rvalue, &temp, cif->rtype->size); +#endif +} + +/** private members **/ + +static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, + void** args, ffi_cif* cif); + +void ffi_closure_SYSV (ffi_closure *); + +/* This function is jumped to by the trampoline */ + +unsigned int +ffi_closure_SYSV_inner (closure, respp, args) + ffi_closure *closure; + void **respp; + void *args; +{ + // our various things... + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* this call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. */ + + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); + + (closure->fun) (cif, *respp, arg_area, closure->user_data); + +#ifdef __CSKYBE__ + if (cif->flags == FFI_TYPE_INT && cif->rtype->type == FFI_TYPE_STRUCT) { + unsigned int tmp = 0; + tmp = *(unsigned int *)(*respp); + *(unsigned int *)(*respp) = (tmp >> ((4 - cif->rtype->size) * 8)); + } +#endif + + return cif->flags; +} + + +static void +ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, + void **avalue, ffi_cif *cif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if ( cif->flags == FFI_TYPE_STRUCT ) { + *rvalue = *(void **) argp; + argp += 4; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + size_t alignment; + + alignment = (*p_arg)->alignment; + if (alignment < 4) + alignment = 4; + +#ifdef __CSKYABIV1__ + /* + * Adapt ABIV1 bug. + * If struct's size is larger than 8 bytes, then it always alignment as 4 bytes. + */ + if (((*p_arg)->type == FFI_TYPE_STRUCT) && ((*p_arg)->size > 8) && (alignment == 8)) { + alignment = 4; + } +#endif + + /* Align if necessary */ + if ((alignment - 1) & (unsigned) argp) { + argp = (char *) FFI_ALIGN(argp, alignment); + } + + z = (*p_arg)->size; + +#ifdef __CSKYBE__ + unsigned int tmp = 0; + if ((*p_arg)->size < 4) { + tmp = *(unsigned int *)argp; + memcpy(argp, ((unsigned char *)&tmp + (4 - (*p_arg)->size)), (*p_arg)->size); + } +#else + /* because we're little endian, this is what it turns into. */ +#endif + *p_argv = (void*) argp; + + p_argv++; + argp += z; + } + + return; +} + +/* How to make a trampoline. */ + +extern unsigned char ffi_csky_trampoline[TRAMPOLINE_SIZE]; + +/* + * Since there is no __clear_cache in libgcc in csky toolchain. + * define ffi_csky_cacheflush in sysv.S. + * void ffi_csky_cacheflush(uint32 start_addr, uint32 size, int cache) + */ +#define CACHEFLUSH_IN_FFI 1 +#if CACHEFLUSH_IN_FFI +extern void ffi_csky_cacheflush(unsigned char *__tramp, unsigned int k, + int i); +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ + unsigned int __fun = (unsigned int)(FUN); \ + unsigned int __ctx = (unsigned int)(CTX); \ + unsigned char *insns = (unsigned char *)(CTX); \ + memcpy (__tramp, ffi_csky_trampoline, TRAMPOLINE_SIZE); \ + *(unsigned int*) &__tramp[TRAMPOLINE_SIZE] = __ctx; \ + *(unsigned int*) &__tramp[TRAMPOLINE_SIZE + 4] = __fun; \ + ffi_csky_cacheflush(&__tramp[0], TRAMPOLINE_SIZE, 3); /* Clear data mapping. */ \ + ffi_csky_cacheflush(insns, TRAMPOLINE_SIZE, 3); \ + /* Clear instruction \ + mapping. */ \ + }) +#else +#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ +({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ + unsigned int __fun = (unsigned int)(FUN); \ + unsigned int __ctx = (unsigned int)(CTX); \ + unsigned char *insns = (unsigned char *)(CTX); \ + memcpy (__tramp, ffi_csky_trampoline, TRAMPOLINE_SIZE); \ + *(unsigned int*) &__tramp[TRAMPOLINE_SIZE] = __ctx; \ + *(unsigned int*) &__tramp[TRAMPOLINE_SIZE + 4] = __fun; \ + __clear_cache((&__tramp[0]), (&__tramp[TRAMPOLINE_SIZE-1])); /* Clear data mapping. */ \ + __clear_cache(insns, insns + TRAMPOLINE_SIZE); \ + /* Clear instruction \ + mapping. */ \ + }) +#endif + +/* the cif must already be prep'ed */ + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + void (*closure_func)(ffi_closure*) = NULL; + + if (cif->abi == FFI_SYSV) + closure_func = &ffi_closure_SYSV; + else + return FFI_BAD_ABI; + + FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ + closure_func, \ + codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/csky/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/csky/ffitarget.h new file mode 100644 index 000000000000..f770aac66f1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/csky/ffitarget.h @@ -0,0 +1,63 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 2010 CodeSourcery + Copyright (c) 1996-2003 Red Hat, Inc. + + Target configuration macros for CSKY. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV, +} ffi_abi; +#endif + +#ifdef __CSKYABIV2__ +#define FFI_ASM_ARGREG_SIZE 16 +#define TRAMPOLINE_SIZE 16 +#define FFI_TRAMPOLINE_SIZE 24 +#else +#define FFI_ASM_ARGREG_SIZE 24 +#define TRAMPOLINE_SIZE 20 +#define FFI_TRAMPOLINE_SIZE 28 +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/csky/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/csky/sysv.S new file mode 100644 index 000000000000..21670bfd3d03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/csky/sysv.S @@ -0,0 +1,371 @@ +/* ----------------------------------------------------------------------- + sysv.S + + CSKY Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +.macro CSKY_FUNC_START name + .text + .align 2 + .globl \name + .type \name, @function + \name: +.endm + +#ifdef __CSKYABIV2__ + + /* + * a0: fn + * a1: &ecif + * a2: cif->bytes + * a3: fig->flags + * sp+0: ecif.rvalue + */ +CSKY_FUNC_START ffi_call_SYSV + /* Save registers */ + .cfi_startproc + subi sp, 28 + .cfi_def_cfa_offset 28 + stw a0, (sp, 0x0) + .cfi_offset 0, -28 + stw a1, (sp, 0x4) + .cfi_offset 1, -24 + stw a2, (sp, 0x8) + .cfi_offset 2, -20 + stw a3, (sp, 0xC) + .cfi_offset 3, -16 + stw l0, (sp, 0x10) + .cfi_offset 4, -12 + stw l1, (sp, 0x14) + .cfi_offset 5, -8 + stw lr, (sp, 0x18) + .cfi_offset 15, -4 + + mov l0, sp + .cfi_def_cfa_register 4 + + /* Make room for all of the new args. */ + subu sp, sp, a2 + + /* Place all of the ffi_prep_args in position */ + mov a0, sp + /* a1 already set */ + + /* Call ffi_prep_args(stack, &ecif) */ + jsri ffi_prep_args + + /* move first 4 parameters in registers */ + ldw a0, (sp, 0x0) + ldw a1, (sp, 0x4) + ldw a2, (sp, 0x8) + ldw a3, (sp, 0xC) + + /* and adjust stack */ + subu lr, l0, sp /* cif->bytes == l0 - sp */ + cmphsi lr, 16 + movi l1, 16 + movt lr, l1 + addu sp, sp, lr + + ldw l1, (l0, 0) /* load fn() in advance */ + + /* call (fn) (...) */ + jsr l1 + + /* Remove the space we pushed for the args */ + mov sp, l0 + + /* Load r2 with the pointer to storage for the return value */ + ldw a2, (sp, 0x1C) + + /* Load r3 with the return type code */ + ldw a3, (sp, 0xC) + + /* If the return value pointer is NULL, assume no return value. */ + cmpnei a2, 0 + bf .Lepilogue + + cmpnei a3, FFI_TYPE_STRUCT + bf .Lepilogue + + /* return INT64 */ + cmpnei a3, FFI_TYPE_SINT64 + bt .Lretint + /* stw a0, (a2, 0x0) at .Lretint */ + stw a1, (a2, 0x4) + +.Lretint: + /* return INT */ + stw a0, (a2, 0x0) + +.Lepilogue: + ldw a0, (sp, 0x0) + ldw a1, (sp, 0x4) + ldw a2, (sp, 0x8) + ldw a3, (sp, 0xC) + ldw l0, (sp, 0x10) + ldw l1, (sp, 0x14) + ldw lr, (sp, 0x18) + addi sp, sp, 28 + rts + .cfi_endproc + .size ffi_call_SYSV, .-ffi_call_SYSV + + + /* + * unsigned int FFI_HIDDEN + * ffi_closure_SYSV_inner (closure, respp, args) + * ffi_closure *closure; + * void **respp; + * void *args; + */ +CSKY_FUNC_START ffi_closure_SYSV + .cfi_startproc + mov a2, sp + addi a1, sp, 16 + subi sp, sp, 24 + .cfi_def_cfa_offset 40 + stw a1, (sp, 0x10) + .cfi_offset 1, -24 + stw lr, (sp, 0x14) + .cfi_offset 15, -20 + stw sp, (sp, 0x8) + addi a1, sp, 8 + jsri ffi_closure_SYSV_inner + ldw a0, (sp, 0x0) + /* + * if FFI_TYPE_SINT64, need a1. + * if FFI_TYPE_INT, ignore a1. + */ + ldw a1, (sp, 0x4) + + ldw lr, (sp, 0x14) + addi sp, sp, 40 + rts + .cfi_endproc + .size ffi_closure_SYSV, .-ffi_closure_SYSV + +CSKY_FUNC_START ffi_csky_trampoline + subi sp, sp, 16 + stw a0, (sp, 0x0) + stw a1, (sp, 0x4) + stw a2, (sp, 0x8) + stw a3, (sp, 0xC) + lrw a0, [.Lctx] + lrw a1, [.Lfun] + jmp a1 +.Lctx: + mov a0, a0 + mov a0, a0 +.Lfun: + + .size ffi_csky_trampoline, .-ffi_csky_trampoline + +CSKY_FUNC_START ffi_csky_cacheflush + mov t0, r7 + movi r7, 123 + trap 0 + mov r7, t0 + rts + + .size ffi_csky_cacheflush, .-ffi_csky_cacheflush + +#else /* !__CSKYABIV2__ */ + + /* + * a0: fn + * a1: &ecif + * a2: cif->bytes + * a3: fig->flags + * a4: ecif.rvalue + */ +CSKY_FUNC_START ffi_call_SYSV + /* Save registers */ + .cfi_startproc + subi sp, 32 + subi sp, 8 + .cfi_def_cfa_offset 40 + stw a0, (sp, 0x0) + .cfi_offset 2, -40 + stw a1, (sp, 0x4) + .cfi_offset 3, -36 + stw a2, (sp, 0x8) + .cfi_offset 4, -32 + stw a3, (sp, 0xC) + .cfi_offset 5, -28 + stw a4, (sp, 0x10) + .cfi_offset 6, -24 + stw a5, (sp, 0x14) + .cfi_offset 7, -20 + stw l0, (sp, 0x18) + .cfi_offset 8, -16 + stw l1, (sp, 0x1C) + .cfi_offset 9, -12 + stw lr, (sp, 0x20) + .cfi_offset 15, -8 + + mov l0, sp + .cfi_def_cfa_register 8 + + /* Make room for all of the new args. */ + subu sp, sp, a2 + + /* Place all of the ffi_prep_args in position */ + mov a0, sp + /* a1 already set */ + + /* Call ffi_prep_args(stack, &ecif) */ + jsri ffi_prep_args + + /* move first 4 parameters in registers */ + ldw a0, (sp, 0x0) + ldw a1, (sp, 0x4) + ldw a2, (sp, 0x8) + ldw a3, (sp, 0xC) + ldw a4, (sp, 0x10) + ldw a5, (sp, 0x14) + + /* and adjust stack */ + mov lr, l0 + subu lr, sp /* cif->bytes == l0 - sp */ + movi l1, 24 + cmphs lr, l1 + movt lr, l1 + addu sp, sp, lr + + ldw l1, (l0, 0) /* load fn() in advance */ + + /* call (fn) (...) */ + jsr l1 + + /* Remove the space we pushed for the args */ + mov sp, l0 + + /* Load r2 with the pointer to storage for the return value */ + ldw a2, (sp, 0x10) + + /* Load r3 with the return type code */ + ldw a3, (sp, 0xC) + + /* If the return value pointer is NULL, assume no return value. */ + cmpnei a2, 0 + bf .Lepilogue + + cmpnei a3, FFI_TYPE_STRUCT + bf .Lepilogue + + /* return INT64 */ + cmpnei a3, FFI_TYPE_SINT64 + bt .Lretint + /* stw a0, (a2, 0x0) at .Lretint */ + stw a1, (a2, 0x4) + +.Lretint: + /* return INT */ + stw a0, (a2, 0x0) + +.Lepilogue: + ldw a0, (sp, 0x0) + ldw a1, (sp, 0x4) + ldw a2, (sp, 0x8) + ldw a3, (sp, 0xC) + ldw a4, (sp, 0x10) + ldw a5, (sp, 0x14) + ldw l0, (sp, 0x18) + ldw l1, (sp, 0x1C) + ldw lr, (sp, 0x20) + addi sp, sp, 32 + addi sp, sp, 8 + rts + .cfi_endproc + + .size ffi_call_SYSV, .-ffi_call_SYSV + + + /* + * unsigned int FFI_HIDDEN + * ffi_closure_SYSV_inner (closure, respp, args) + * ffi_closure *closure; + * void **respp; + * void *args; + */ +CSKY_FUNC_START ffi_closure_SYSV + .cfi_startproc + mov a2, sp + mov a1, sp + addi a1, 24 + subi sp, sp, 24 + .cfi_def_cfa_offset 48 + stw a1, (sp, 0x10) + .cfi_offset 3, -32 + stw lr, (sp, 0x14) + .cfi_offset 15, -28 + stw sp, (sp, 0x8) + mov a1, sp + addi a1, 8 + jsri ffi_closure_SYSV_inner + ldw a0, (sp, 0x0) + /* + * if FFI_TYPE_SINT64, need a1. + * if FFI_TYPE_INT, ignore a1. + */ + ldw a1, (sp, 0x4) + + ldw lr, (sp, 0x14) + addi sp, sp, 24 + addi sp, sp, 24 + rts + .cfi_endproc + + .size ffi_closure_SYSV, .-ffi_closure_SYSV + +CSKY_FUNC_START ffi_csky_trampoline + subi sp, 24 + stw a0, (sp, 0x0) + stw a1, (sp, 0x4) + stw a2, (sp, 0x8) + stw a3, (sp, 0xC) + stw a4, (sp, 0x10) + stw a5, (sp, 0x14) + lrw a0, [.Lctx] + lrw a1, [.Lfun] + jmp a1 +.Lctx: + mov a0, a0 + mov a0, a0 +.Lfun: + + .size ffi_csky_trampoline, .-ffi_csky_trampoline + +CSKY_FUNC_START ffi_csky_cacheflush + lrw r1, 123 + trap 0 + rts + + .size ffi_csky_cacheflush, .-ffi_csky_cacheflush + +#endif /* __CSKYABIV2__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/debug.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/debug.c new file mode 100644 index 000000000000..f3172b1ef6c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/debug.c @@ -0,0 +1,64 @@ +/* ----------------------------------------------------------------------- + debug.c - Copyright (c) 1996 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> +#include <stdlib.h> +#include <stdio.h> + +/* General debugging routines */ + +void ffi_stop_here(void) +{ + /* This function is only useful for debugging purposes. + Place a breakpoint on ffi_stop_here to be notified of + significant events. */ +} + +/* This function should only be called via the FFI_ASSERT() macro */ + +void ffi_assert(char *expr, char *file, int line) +{ + fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line); + ffi_stop_here(); + abort(); +} + +/* Perform a sanity check on an ffi_type structure */ + +void ffi_type_test(ffi_type *a, char *file, int line) +{ + FFI_ASSERT_AT(a != NULL, file, line); + + FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line); + FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line); + FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line); + FFI_ASSERT_AT((a->type != FFI_TYPE_STRUCT && a->type != FFI_TYPE_COMPLEX) + || a->elements != NULL, file, line); + FFI_ASSERT_AT(a->type != FFI_TYPE_COMPLEX + || (a->elements != NULL + && a->elements[0] != NULL && a->elements[1] == NULL), + file, line); + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/dlmalloc.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/dlmalloc.c new file mode 100644 index 000000000000..1aba657edb51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/dlmalloc.c @@ -0,0 +1,5166 @@ +/* + This is a version (aka dlmalloc) of malloc/free/realloc written by + Doug Lea and released to the public domain, as explained at + http://creativecommons.org/licenses/publicdomain. Send questions, + comments, complaints, performance data, etc to dl@cs.oswego.edu + +* Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) + + Note: There may be an updated version of this malloc obtainable at + ftp://gee.cs.oswego.edu/pub/misc/malloc.c + Check before installing! + +* Quickstart + + This library is all in one file to simplify the most common usage: + ftp it, compile it (-O3), and link it into another program. All of + the compile-time options default to reasonable values for use on + most platforms. You might later want to step through various + compile-time and dynamic tuning options. + + For convenience, an include file for code using this malloc is at: + ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h + You don't really need this .h file unless you call functions not + defined in your system include files. The .h file contains only the + excerpts from this file needed for using this malloc on ANSI C/C++ + systems, so long as you haven't changed compile-time options about + naming and tuning parameters. If you do, then you can create your + own malloc.h that does include all settings by cutting at the point + indicated below. Note that you may already by default be using a C + library containing a malloc that is based on some version of this + malloc (for example in linux). You might still want to use the one + in this file to customize settings or to avoid overheads associated + with library versions. + +* Vital statistics: + + Supported pointer/size_t representation: 4 or 8 bytes + size_t MUST be an unsigned type of the same width as + pointers. (If you are using an ancient system that declares + size_t as a signed type, or need it to be a different width + than pointers, you can use a previous release of this malloc + (e.g. 2.7.2) supporting these.) + + Alignment: 8 bytes (default) + This suffices for nearly all current machines and C compilers. + However, you can define MALLOC_ALIGNMENT to be wider than this + if necessary (up to 128bytes), at the expense of using more space. + + Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) + 8 or 16 bytes (if 8byte sizes) + Each malloced chunk has a hidden word of overhead holding size + and status information, and additional cross-check word + if FOOTERS is defined. + + Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) + 8-byte ptrs: 32 bytes (including overhead) + + Even a request for zero bytes (i.e., malloc(0)) returns a + pointer to something of the minimum allocatable size. + The maximum overhead wastage (i.e., number of extra bytes + allocated than were requested in malloc) is less than or equal + to the minimum size, except for requests >= mmap_threshold that + are serviced via mmap(), where the worst case wastage is about + 32 bytes plus the remainder from a system page (the minimal + mmap unit); typically 4096 or 8192 bytes. + + Security: static-safe; optionally more or less + The "security" of malloc refers to the ability of malicious + code to accentuate the effects of errors (for example, freeing + space that is not currently malloc'ed or overwriting past the + ends of chunks) in code that calls malloc. This malloc + guarantees not to modify any memory locations below the base of + heap, i.e., static variables, even in the presence of usage + errors. The routines additionally detect most improper frees + and reallocs. All this holds as long as the static bookkeeping + for malloc itself is not corrupted by some other means. This + is only one aspect of security -- these checks do not, and + cannot, detect all possible programming errors. + + If FOOTERS is defined nonzero, then each allocated chunk + carries an additional check word to verify that it was malloced + from its space. These check words are the same within each + execution of a program using malloc, but differ across + executions, so externally crafted fake chunks cannot be + freed. This improves security by rejecting frees/reallocs that + could corrupt heap memory, in addition to the checks preventing + writes to statics that are always on. This may further improve + security at the expense of time and space overhead. (Note that + FOOTERS may also be worth using with MSPACES.) + + By default detected errors cause the program to abort (calling + "abort()"). You can override this to instead proceed past + errors by defining PROCEED_ON_ERROR. In this case, a bad free + has no effect, and a malloc that encounters a bad address + caused by user overwrites will ignore the bad address by + dropping pointers and indices to all known memory. This may + be appropriate for programs that should continue if at all + possible in the face of programming errors, although they may + run out of memory because dropped memory is never reclaimed. + + If you don't like either of these options, you can define + CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything + else. And if if you are sure that your program using malloc has + no errors or vulnerabilities, you can define INSECURE to 1, + which might (or might not) provide a small performance improvement. + + Thread-safety: NOT thread-safe unless USE_LOCKS defined + When USE_LOCKS is defined, each public call to malloc, free, + etc is surrounded with either a pthread mutex or a win32 + spinlock (depending on WIN32). This is not especially fast, and + can be a major bottleneck. It is designed only to provide + minimal protection in concurrent environments, and to provide a + basis for extensions. If you are using malloc in a concurrent + program, consider instead using ptmalloc, which is derived from + a version of this malloc. (See http://www.malloc.de). + + System requirements: Any combination of MORECORE and/or MMAP/MUNMAP + This malloc can use unix sbrk or any emulation (invoked using + the CALL_MORECORE macro) and/or mmap/munmap or any emulation + (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system + memory. On most unix systems, it tends to work best if both + MORECORE and MMAP are enabled. On Win32, it uses emulations + based on VirtualAlloc. It also uses common C library functions + like memset. + + Compliance: I believe it is compliant with the Single Unix Specification + (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably + others as well. + +* Overview of algorithms + + This is not the fastest, most space-conserving, most portable, or + most tunable malloc ever written. However it is among the fastest + while also being among the most space-conserving, portable and + tunable. Consistent balance across these factors results in a good + general-purpose allocator for malloc-intensive programs. + + In most ways, this malloc is a best-fit allocator. Generally, it + chooses the best-fitting existing chunk for a request, with ties + broken in approximately least-recently-used order. (This strategy + normally maintains low fragmentation.) However, for requests less + than 256bytes, it deviates from best-fit when there is not an + exactly fitting available chunk by preferring to use space adjacent + to that used for the previous small request, as well as by breaking + ties in approximately most-recently-used order. (These enhance + locality of series of small allocations.) And for very large requests + (>= 256Kb by default), it relies on system memory mapping + facilities, if supported. (This helps avoid carrying around and + possibly fragmenting memory used only for large chunks.) + + All operations (except malloc_stats and mallinfo) have execution + times that are bounded by a constant factor of the number of bits in + a size_t, not counting any clearing in calloc or copying in realloc, + or actions surrounding MORECORE and MMAP that have times + proportional to the number of non-contiguous regions returned by + system allocation routines, which is often just 1. + + The implementation is not very modular and seriously overuses + macros. Perhaps someday all C compilers will do as good a job + inlining modular code as can now be done by brute-force expansion, + but now, enough of them seem not to. + + Some compilers issue a lot of warnings about code that is + dead/unreachable only on some platforms, and also about intentional + uses of negation on unsigned types. All known cases of each can be + ignored. + + For a longer but out of date high-level description, see + http://gee.cs.oswego.edu/dl/html/malloc.html + +* MSPACES + If MSPACES is defined, then in addition to malloc, free, etc., + this file also defines mspace_malloc, mspace_free, etc. These + are versions of malloc routines that take an "mspace" argument + obtained using create_mspace, to control all internal bookkeeping. + If ONLY_MSPACES is defined, only these versions are compiled. + So if you would like to use this allocator for only some allocations, + and your system malloc for others, you can compile with + ONLY_MSPACES and then do something like... + static mspace mymspace = create_mspace(0,0); // for example + #define mymalloc(bytes) mspace_malloc(mymspace, bytes) + + (Note: If you only need one instance of an mspace, you can instead + use "USE_DL_PREFIX" to relabel the global malloc.) + + You can similarly create thread-local allocators by storing + mspaces as thread-locals. For example: + static __thread mspace tlms = 0; + void* tlmalloc(size_t bytes) { + if (tlms == 0) tlms = create_mspace(0, 0); + return mspace_malloc(tlms, bytes); + } + void tlfree(void* mem) { mspace_free(tlms, mem); } + + Unless FOOTERS is defined, each mspace is completely independent. + You cannot allocate from one and free to another (although + conformance is only weakly checked, so usage errors are not always + caught). If FOOTERS is defined, then each chunk carries around a tag + indicating its originating mspace, and frees are directed to their + originating spaces. + + ------------------------- Compile-time options --------------------------- + +Be careful in setting #define values for numerical constants of type +size_t. On some systems, literal values are not automatically extended +to size_t precision unless they are explicitly casted. + +WIN32 default: defined if _WIN32 defined + Defining WIN32 sets up defaults for MS environment and compilers. + Otherwise defaults are for unix. + +MALLOC_ALIGNMENT default: (size_t)8 + Controls the minimum alignment for malloc'ed chunks. It must be a + power of two and at least 8, even on machines for which smaller + alignments would suffice. It may be defined as larger than this + though. Note however that code and data structures are optimized for + the case of 8-byte alignment. + +MSPACES default: 0 (false) + If true, compile in support for independent allocation spaces. + This is only supported if HAVE_MMAP is true. + +ONLY_MSPACES default: 0 (false) + If true, only compile in mspace versions, not regular versions. + +USE_LOCKS default: 0 (false) + Causes each call to each public routine to be surrounded with + pthread or WIN32 mutex lock/unlock. (If set true, this can be + overridden on a per-mspace basis for mspace versions.) + +FOOTERS default: 0 + If true, provide extra checking and dispatching by placing + information in the footers of allocated chunks. This adds + space and time overhead. + +INSECURE default: 0 + If true, omit checks for usage errors and heap space overwrites. + +USE_DL_PREFIX default: NOT defined + Causes compiler to prefix all public routines with the string 'dl'. + This can be useful when you only want to use this malloc in one part + of a program, using your regular system malloc elsewhere. + +ABORT default: defined as abort() + Defines how to abort on failed checks. On most systems, a failed + check cannot die with an "assert" or even print an informative + message, because the underlying print routines in turn call malloc, + which will fail again. Generally, the best policy is to simply call + abort(). It's not very useful to do more than this because many + errors due to overwriting will show up as address faults (null, odd + addresses etc) rather than malloc-triggered checks, so will also + abort. Also, most compilers know that abort() does not return, so + can better optimize code conditionally calling it. + +PROCEED_ON_ERROR default: defined as 0 (false) + Controls whether detected bad addresses cause them to bypassed + rather than aborting. If set, detected bad arguments to free and + realloc are ignored. And all bookkeeping information is zeroed out + upon a detected overwrite of freed heap space, thus losing the + ability to ever return it from malloc again, but enabling the + application to proceed. If PROCEED_ON_ERROR is defined, the + static variable malloc_corruption_error_count is compiled in + and can be examined to see if errors have occurred. This option + generates slower code than the default abort policy. + +DEBUG default: NOT defined + The DEBUG setting is mainly intended for people trying to modify + this code or diagnose problems when porting to new platforms. + However, it may also be able to better isolate user errors than just + using runtime checks. The assertions in the check routines spell + out in more detail the assumptions and invariants underlying the + algorithms. The checking is fairly extensive, and will slow down + execution noticeably. Calling malloc_stats or mallinfo with DEBUG + set will attempt to check every non-mmapped allocated and free chunk + in the course of computing the summaries. + +ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) + Debugging assertion failures can be nearly impossible if your + version of the assert macro causes malloc to be called, which will + lead to a cascade of further failures, blowing the runtime stack. + ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), + which will usually make debugging easier. + +MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 + The action to take before "return 0" when malloc fails to be able to + return memory because there is none available. + +HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES + True if this system supports sbrk or an emulation of it. + +MORECORE default: sbrk + The name of the sbrk-style system routine to call to obtain more + memory. See below for guidance on writing custom MORECORE + functions. The type of the argument to sbrk/MORECORE varies across + systems. It cannot be size_t, because it supports negative + arguments, so it is normally the signed type of the same width as + size_t (sometimes declared as "intptr_t"). It doesn't much matter + though. Internally, we only call it with arguments less than half + the max value of a size_t, which should work across all reasonable + possibilities, although sometimes generating compiler warnings. See + near the end of this file for guidelines for creating a custom + version of MORECORE. + +MORECORE_CONTIGUOUS default: 1 (true) + If true, take advantage of fact that consecutive calls to MORECORE + with positive arguments always return contiguous increasing + addresses. This is true of unix sbrk. It does not hurt too much to + set it true anyway, since malloc copes with non-contiguities. + Setting it false when definitely non-contiguous saves time + and possibly wasted space it would take to discover this though. + +MORECORE_CANNOT_TRIM default: NOT defined + True if MORECORE cannot release space back to the system when given + negative arguments. This is generally necessary only if you are + using a hand-crafted MORECORE function that cannot handle negative + arguments. + +HAVE_MMAP default: 1 (true) + True if this system supports mmap or an emulation of it. If so, and + HAVE_MORECORE is not true, MMAP is used for all system + allocation. If set and HAVE_MORECORE is true as well, MMAP is + primarily used to directly allocate very large blocks. It is also + used as a backup strategy in cases where MORECORE fails to provide + space from system. Note: A single call to MUNMAP is assumed to be + able to unmap memory that may have be allocated using multiple calls + to MMAP, so long as they are adjacent. + +HAVE_MREMAP default: 1 on linux, else 0 + If true realloc() uses mremap() to re-allocate large blocks and + extend or shrink allocation spaces. + +MMAP_CLEARS default: 1 on unix + True if mmap clears memory so calloc doesn't need to. This is true + for standard unix mmap using /dev/zero. + +USE_BUILTIN_FFS default: 0 (i.e., not used) + Causes malloc to use the builtin ffs() function to compute indices. + Some compilers may recognize and intrinsify ffs to be faster than the + supplied C version. Also, the case of x86 using gcc is special-cased + to an asm instruction, so is already as fast as it can be, and so + this setting has no effect. (On most x86s, the asm version is only + slightly faster than the C version.) + +malloc_getpagesize default: derive from system includes, or 4096. + The system page size. To the extent possible, this malloc manages + memory from the system in page-size units. This may be (and + usually is) a function rather than a constant. This is ignored + if WIN32, where page size is determined using getSystemInfo during + initialization. + +USE_DEV_RANDOM default: 0 (i.e., not used) + Causes malloc to use /dev/random to initialize secure magic seed for + stamping footers. Otherwise, the current time is used. + +NO_MALLINFO default: 0 + If defined, don't compile "mallinfo". This can be a simple way + of dealing with mismatches between system declarations and + those in this file. + +MALLINFO_FIELD_TYPE default: size_t + The type of the fields in the mallinfo struct. This was originally + defined as "int" in SVID etc, but is more usefully defined as + size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set + +REALLOC_ZERO_BYTES_FREES default: not defined + This should be set if a call to realloc with zero bytes should + be the same as a call to free. Some people think it should. Otherwise, + since this malloc returns a unique pointer for malloc(0), so does + realloc(p, 0). + +LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H +LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H +LACKS_STDLIB_H default: NOT defined unless on WIN32 + Define these if your system does not have these header files. + You might need to manually insert some of the declarations they provide. + +DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, + system_info.dwAllocationGranularity in WIN32, + otherwise 64K. + Also settable using mallopt(M_GRANULARITY, x) + The unit for allocating and deallocating memory from the system. On + most systems with contiguous MORECORE, there is no reason to + make this more than a page. However, systems with MMAP tend to + either require or encourage larger granularities. You can increase + this value to prevent system allocation functions to be called so + often, especially if they are slow. The value must be at least one + page and must be a power of two. Setting to 0 causes initialization + to either page size or win32 region size. (Note: In previous + versions of malloc, the equivalent of this option was called + "TOP_PAD") + +DEFAULT_TRIM_THRESHOLD default: 2MB + Also settable using mallopt(M_TRIM_THRESHOLD, x) + The maximum amount of unused top-most memory to keep before + releasing via malloc_trim in free(). Automatic trimming is mainly + useful in long-lived programs using contiguous MORECORE. Because + trimming via sbrk can be slow on some systems, and can sometimes be + wasteful (in cases where programs immediately afterward allocate + more large chunks) the value should be high enough so that your + overall system performance would improve by releasing this much + memory. As a rough guide, you might set to a value close to the + average size of a process (program) running on your system. + Releasing this much memory would allow such a process to run in + memory. Generally, it is worth tuning trim thresholds when a + program undergoes phases where several large chunks are allocated + and released in ways that can reuse each other's storage, perhaps + mixed with phases where there are no such chunks at all. The trim + value must be greater than page size to have any useful effect. To + disable trimming completely, you can set to MAX_SIZE_T. Note that the trick + some people use of mallocing a huge space and then freeing it at + program startup, in an attempt to reserve system memory, doesn't + have the intended effect under automatic trimming, since that memory + will immediately be returned to the system. + +DEFAULT_MMAP_THRESHOLD default: 256K + Also settable using mallopt(M_MMAP_THRESHOLD, x) + The request size threshold for using MMAP to directly service a + request. Requests of at least this size that cannot be allocated + using already-existing space will be serviced via mmap. (If enough + normal freed space already exists it is used instead.) Using mmap + segregates relatively large chunks of memory so that they can be + individually obtained and released from the host system. A request + serviced through mmap is never reused by any other request (at least + not directly; the system may just so happen to remap successive + requests to the same locations). Segregating space in this way has + the benefits that: Mmapped space can always be individually released + back to the system, which helps keep the system level memory demands + of a long-lived program low. Also, mapped memory doesn't become + `locked' between other chunks, as can happen with normally allocated + chunks, which means that even trimming via malloc_trim would not + release them. However, it has the disadvantage that the space + cannot be reclaimed, consolidated, and then used to service later + requests, as happens with normal chunks. The advantages of mmap + nearly always outweigh disadvantages for "large" chunks, but the + value of "large" may vary across systems. The default is an + empirically derived value that works well in most systems. You can + disable mmap by setting to MAX_SIZE_T. + +*/ + +#if defined __linux__ && !defined _GNU_SOURCE +/* mremap() on Linux requires this via sys/mman.h */ +#define _GNU_SOURCE 1 +#endif + +#ifndef WIN32 +#ifdef _WIN32 +#define WIN32 1 +#endif /* _WIN32 */ +#endif /* WIN32 */ +#ifdef WIN32 +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define LACKS_UNISTD_H +#define LACKS_SYS_PARAM_H +#define LACKS_SYS_MMAN_H +#define LACKS_STRING_H +#define LACKS_STRINGS_H +#define LACKS_SYS_TYPES_H +#define LACKS_ERRNO_H +#define MALLOC_FAILURE_ACTION +#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */ +#endif /* WIN32 */ + +#ifdef __OS2__ +#define INCL_DOS +#include <os2.h> +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define LACKS_SYS_MMAN_H +#endif /* __OS2__ */ + +#if defined(DARWIN) || defined(_DARWIN) +/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ +#ifndef HAVE_MORECORE +#define HAVE_MORECORE 0 +#define HAVE_MMAP 1 +#endif /* HAVE_MORECORE */ +#endif /* DARWIN */ + +#ifndef LACKS_SYS_TYPES_H +#include <sys/types.h> /* For size_t */ +#endif /* LACKS_SYS_TYPES_H */ + +/* The maximum possible size_t value has all bits set */ +#define MAX_SIZE_T (~(size_t)0) + +#ifndef ONLY_MSPACES +#define ONLY_MSPACES 0 +#endif /* ONLY_MSPACES */ +#ifndef MSPACES +#if ONLY_MSPACES +#define MSPACES 1 +#else /* ONLY_MSPACES */ +#define MSPACES 0 +#endif /* ONLY_MSPACES */ +#endif /* MSPACES */ +#ifndef MALLOC_ALIGNMENT +#define MALLOC_ALIGNMENT ((size_t)8U) +#endif /* MALLOC_ALIGNMENT */ +#ifndef FOOTERS +#define FOOTERS 0 +#endif /* FOOTERS */ +#ifndef ABORT +#define ABORT abort() +#endif /* ABORT */ +#ifndef ABORT_ON_ASSERT_FAILURE +#define ABORT_ON_ASSERT_FAILURE 1 +#endif /* ABORT_ON_ASSERT_FAILURE */ +#ifndef PROCEED_ON_ERROR +#define PROCEED_ON_ERROR 0 +#endif /* PROCEED_ON_ERROR */ +#ifndef USE_LOCKS +#define USE_LOCKS 0 +#endif /* USE_LOCKS */ +#ifndef INSECURE +#define INSECURE 0 +#endif /* INSECURE */ +#ifndef HAVE_MMAP +#define HAVE_MMAP 1 +#endif /* HAVE_MMAP */ +#ifndef MMAP_CLEARS +#define MMAP_CLEARS 1 +#endif /* MMAP_CLEARS */ +#ifndef HAVE_MREMAP +#ifdef linux +#define HAVE_MREMAP 1 +#else /* linux */ +#define HAVE_MREMAP 0 +#endif /* linux */ +#endif /* HAVE_MREMAP */ +#ifndef MALLOC_FAILURE_ACTION +#define MALLOC_FAILURE_ACTION errno = ENOMEM; +#endif /* MALLOC_FAILURE_ACTION */ +#ifndef HAVE_MORECORE +#if ONLY_MSPACES +#define HAVE_MORECORE 0 +#else /* ONLY_MSPACES */ +#define HAVE_MORECORE 1 +#endif /* ONLY_MSPACES */ +#endif /* HAVE_MORECORE */ +#if !HAVE_MORECORE +#define MORECORE_CONTIGUOUS 0 +#else /* !HAVE_MORECORE */ +#ifndef MORECORE +#define MORECORE sbrk +#endif /* MORECORE */ +#ifndef MORECORE_CONTIGUOUS +#define MORECORE_CONTIGUOUS 1 +#endif /* MORECORE_CONTIGUOUS */ +#endif /* HAVE_MORECORE */ +#ifndef DEFAULT_GRANULARITY +#if MORECORE_CONTIGUOUS +#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ +#else /* MORECORE_CONTIGUOUS */ +#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) +#endif /* MORECORE_CONTIGUOUS */ +#endif /* DEFAULT_GRANULARITY */ +#ifndef DEFAULT_TRIM_THRESHOLD +#ifndef MORECORE_CANNOT_TRIM +#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) +#else /* MORECORE_CANNOT_TRIM */ +#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T +#endif /* MORECORE_CANNOT_TRIM */ +#endif /* DEFAULT_TRIM_THRESHOLD */ +#ifndef DEFAULT_MMAP_THRESHOLD +#if HAVE_MMAP +#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) +#else /* HAVE_MMAP */ +#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T +#endif /* HAVE_MMAP */ +#endif /* DEFAULT_MMAP_THRESHOLD */ +#ifndef USE_BUILTIN_FFS +#define USE_BUILTIN_FFS 0 +#endif /* USE_BUILTIN_FFS */ +#ifndef USE_DEV_RANDOM +#define USE_DEV_RANDOM 0 +#endif /* USE_DEV_RANDOM */ +#ifndef NO_MALLINFO +#define NO_MALLINFO 0 +#endif /* NO_MALLINFO */ +#ifndef MALLINFO_FIELD_TYPE +#define MALLINFO_FIELD_TYPE size_t +#endif /* MALLINFO_FIELD_TYPE */ + +/* + mallopt tuning options. SVID/XPG defines four standard parameter + numbers for mallopt, normally defined in malloc.h. None of these + are used in this malloc, so setting them has no effect. But this + malloc does support the following options. +*/ + +#define M_TRIM_THRESHOLD (-1) +#define M_GRANULARITY (-2) +#define M_MMAP_THRESHOLD (-3) + +/* ------------------------ Mallinfo declarations ------------------------ */ + +#if !NO_MALLINFO +/* + This version of malloc supports the standard SVID/XPG mallinfo + routine that returns a struct containing usage properties and + statistics. It should work on any system that has a + /usr/include/malloc.h defining struct mallinfo. The main + declaration needed is the mallinfo struct that is returned (by-copy) + by mallinfo(). The malloinfo struct contains a bunch of fields that + are not even meaningful in this version of malloc. These fields are + are instead filled by mallinfo() with other numbers that might be of + interest. + + HAVE_USR_INCLUDE_MALLOC_H should be set if you have a + /usr/include/malloc.h file that includes a declaration of struct + mallinfo. If so, it is included; else a compliant version is + declared below. These must be precisely the same for mallinfo() to + work. The original SVID version of this struct, defined on most + systems with mallinfo, declares all fields as ints. But some others + define as unsigned long. If your system defines the fields using a + type of different width than listed here, you MUST #include your + system version and #define HAVE_USR_INCLUDE_MALLOC_H. +*/ + +/* #define HAVE_USR_INCLUDE_MALLOC_H */ + +#ifdef HAVE_USR_INCLUDE_MALLOC_H +#include "/usr/include/malloc.h" +#else /* HAVE_USR_INCLUDE_MALLOC_H */ + +/* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */ +#define _STRUCT_MALLINFO + +struct mallinfo { + MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ + MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ + MALLINFO_FIELD_TYPE smblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ + MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ + MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ + MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ + MALLINFO_FIELD_TYPE fordblks; /* total free space */ + MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ +}; + +#endif /* HAVE_USR_INCLUDE_MALLOC_H */ +#endif /* NO_MALLINFO */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if !ONLY_MSPACES + +/* ------------------- Declarations of public routines ------------------- */ + +#ifndef USE_DL_PREFIX +#define dlcalloc calloc +#define dlfree free +#define dlmalloc malloc +#define dlmemalign memalign +#define dlrealloc realloc +#define dlvalloc valloc +#define dlpvalloc pvalloc +#define dlmallinfo mallinfo +#define dlmallopt mallopt +#define dlmalloc_trim malloc_trim +#define dlmalloc_stats malloc_stats +#define dlmalloc_usable_size malloc_usable_size +#define dlmalloc_footprint malloc_footprint +#define dlmalloc_max_footprint malloc_max_footprint +#define dlindependent_calloc independent_calloc +#define dlindependent_comalloc independent_comalloc +#endif /* USE_DL_PREFIX */ + + +/* + malloc(size_t n) + Returns a pointer to a newly allocated chunk of at least n bytes, or + null if no space is available, in which case errno is set to ENOMEM + on ANSI C systems. + + If n is zero, malloc returns a minimum-sized chunk. (The minimum + size is 16 bytes on most 32bit systems, and 32 bytes on 64bit + systems.) Note that size_t is an unsigned type, so calls with + arguments that would be negative if signed are interpreted as + requests for huge amounts of space, which will often fail. The + maximum supported value of n differs across systems, but is in all + cases less than the maximum representable value of a size_t. +*/ +void* dlmalloc(size_t); + +/* + free(void* p) + Releases the chunk of memory pointed to by p, that had been previously + allocated using malloc or a related routine such as realloc. + It has no effect if p is null. If p was not malloced or already + freed, free(p) will by default cause the current program to abort. +*/ +void dlfree(void*); + +/* + calloc(size_t n_elements, size_t element_size); + Returns a pointer to n_elements * element_size bytes, with all locations + set to zero. +*/ +void* dlcalloc(size_t, size_t); + +/* + realloc(void* p, size_t n) + Returns a pointer to a chunk of size n that contains the same data + as does chunk p up to the minimum of (n, p's size) bytes, or null + if no space is available. + + The returned pointer may or may not be the same as p. The algorithm + prefers extending p in most cases when possible, otherwise it + employs the equivalent of a malloc-copy-free sequence. + + If p is null, realloc is equivalent to malloc. + + If space is not available, realloc returns null, errno is set (if on + ANSI) and p is NOT freed. + + if n is for fewer bytes than already held by p, the newly unused + space is lopped off and freed if possible. realloc with a size + argument of zero (re)allocates a minimum-sized chunk. + + The old unix realloc convention of allowing the last-free'd chunk + to be used as an argument to realloc is not supported. +*/ + +void* dlrealloc(void*, size_t); + +/* + memalign(size_t alignment, size_t n); + Returns a pointer to a newly allocated chunk of n bytes, aligned + in accord with the alignment argument. + + The alignment argument should be a power of two. If the argument is + not a power of two, the nearest greater power is used. + 8-byte alignment is guaranteed by normal malloc calls, so don't + bother calling memalign with an argument of 8 or less. + + Overreliance on memalign is a sure way to fragment space. +*/ +void* dlmemalign(size_t, size_t); + +/* + valloc(size_t n); + Equivalent to memalign(pagesize, n), where pagesize is the page + size of the system. If the pagesize is unknown, 4096 is used. +*/ +void* dlvalloc(size_t); + +/* + mallopt(int parameter_number, int parameter_value) + Sets tunable parameters The format is to provide a + (parameter-number, parameter-value) pair. mallopt then sets the + corresponding parameter to the argument value if it can (i.e., so + long as the value is meaningful), and returns 1 if successful else + 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, + normally defined in malloc.h. None of these are use in this malloc, + so setting them has no effect. But this malloc also supports other + options in mallopt. See below for details. Briefly, supported + parameters are as follows (listed defaults are for "typical" + configurations). + + Symbol param # default allowed param values + M_TRIM_THRESHOLD -1 2*1024*1024 any (MAX_SIZE_T disables) + M_GRANULARITY -2 page size any power of 2 >= page size + M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) +*/ +int dlmallopt(int, int); + +/* + malloc_footprint(); + Returns the number of bytes obtained from the system. The total + number of bytes allocated by malloc, realloc etc., is less than this + value. Unlike mallinfo, this function returns only a precomputed + result, so can be called frequently to monitor memory consumption. + Even if locks are otherwise defined, this function does not use them, + so results might not be up to date. +*/ +size_t dlmalloc_footprint(void); + +/* + malloc_max_footprint(); + Returns the maximum number of bytes obtained from the system. This + value will be greater than current footprint if deallocated space + has been reclaimed by the system. The peak number of bytes allocated + by malloc, realloc etc., is less than this value. Unlike mallinfo, + this function returns only a precomputed result, so can be called + frequently to monitor memory consumption. Even if locks are + otherwise defined, this function does not use them, so results might + not be up to date. +*/ +size_t dlmalloc_max_footprint(void); + +#if !NO_MALLINFO +/* + mallinfo() + Returns (by copy) a struct containing various summary statistics: + + arena: current total non-mmapped bytes allocated from system + ordblks: the number of free chunks + smblks: always zero. + hblks: current number of mmapped regions + hblkhd: total bytes held in mmapped regions + usmblks: the maximum total allocated space. This will be greater + than current total if trimming has occurred. + fsmblks: always zero + uordblks: current total allocated space (normal or mmapped) + fordblks: total free space + keepcost: the maximum number of bytes that could ideally be released + back to system via malloc_trim. ("ideally" means that + it ignores page restrictions etc.) + + Because these fields are ints, but internal bookkeeping may + be kept as longs, the reported values may wrap around zero and + thus be inaccurate. +*/ +struct mallinfo dlmallinfo(void); +#endif /* NO_MALLINFO */ + +/* + independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); + + independent_calloc is similar to calloc, but instead of returning a + single cleared space, it returns an array of pointers to n_elements + independent elements that can hold contents of size elem_size, each + of which starts out cleared, and can be independently freed, + realloc'ed etc. The elements are guaranteed to be adjacently + allocated (this is not guaranteed to occur with multiple callocs or + mallocs), which may also improve cache locality in some + applications. + + The "chunks" argument is optional (i.e., may be null, which is + probably the most typical usage). If it is null, the returned array + is itself dynamically allocated and should also be freed when it is + no longer needed. Otherwise, the chunks array must be of at least + n_elements in length. It is filled in with the pointers to the + chunks. + + In either case, independent_calloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and "chunks" + is null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use regular calloc and assign pointers into this + space to represent elements. (In this case though, you cannot + independently free elements.) + + independent_calloc simplifies and speeds up implementations of many + kinds of pools. It may also be useful when constructing large data + structures that initially have a fixed number of fixed-sized nodes, + but the number is not known at compile time, and some of the nodes + may later need to be freed. For example: + + struct Node { int item; struct Node* next; }; + + struct Node* build_list() { + struct Node** pool; + int n = read_number_of_nodes_needed(); + if (n <= 0) return 0; + pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); + if (pool == 0) die(); + // organize into a linked list... + struct Node* first = pool[0]; + for (i = 0; i < n-1; ++i) + pool[i]->next = pool[i+1]; + free(pool); // Can now free the array (or not, if it is needed later) + return first; + } +*/ +void** dlindependent_calloc(size_t, size_t, void**); + +/* + independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); + + independent_comalloc allocates, all at once, a set of n_elements + chunks with sizes indicated in the "sizes" array. It returns + an array of pointers to these elements, each of which can be + independently freed, realloc'ed etc. The elements are guaranteed to + be adjacently allocated (this is not guaranteed to occur with + multiple callocs or mallocs), which may also improve cache locality + in some applications. + + The "chunks" argument is optional (i.e., may be null). If it is null + the returned array is itself dynamically allocated and should also + be freed when it is no longer needed. Otherwise, the chunks array + must be of at least n_elements in length. It is filled in with the + pointers to the chunks. + + In either case, independent_comalloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and chunks is + null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use a single regular malloc, and assign pointers at + particular offsets in the aggregate space. (In this case though, you + cannot independently free elements.) + + independent_comallac differs from independent_calloc in that each + element may have a different size, and also that it does not + automatically clear elements. + + independent_comalloc can be used to speed up allocation in cases + where several structs or objects must always be allocated at the + same time. For example: + + struct Head { ... } + struct Foot { ... } + + void send_message(char* msg) { + int msglen = strlen(msg); + size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; + void* chunks[3]; + if (independent_comalloc(3, sizes, chunks) == 0) + die(); + struct Head* head = (struct Head*)(chunks[0]); + char* body = (char*)(chunks[1]); + struct Foot* foot = (struct Foot*)(chunks[2]); + // ... + } + + In general though, independent_comalloc is worth using only for + larger values of n_elements. For small values, you probably won't + detect enough difference from series of malloc calls to bother. + + Overuse of independent_comalloc can increase overall memory usage, + since it cannot reuse existing noncontiguous small chunks that + might be available for some of the elements. +*/ +void** dlindependent_comalloc(size_t, size_t*, void**); + + +/* + pvalloc(size_t n); + Equivalent to valloc(minimum-page-that-holds(n)), that is, + round up n to nearest pagesize. + */ +void* dlpvalloc(size_t); + +/* + malloc_trim(size_t pad); + + If possible, gives memory back to the system (via negative arguments + to sbrk) if there is unused memory at the `high' end of the malloc + pool or in unused MMAP segments. You can call this after freeing + large blocks of memory to potentially reduce the system-level memory + requirements of a program. However, it cannot guarantee to reduce + memory. Under some allocation patterns, some large free blocks of + memory will be locked between two used chunks, so they cannot be + given back to the system. + + The `pad' argument to malloc_trim represents the amount of free + trailing space to leave untrimmed. If this argument is zero, only + the minimum amount of memory to maintain internal data structures + will be left. Non-zero arguments can be supplied to maintain enough + trailing space to service future expected allocations without having + to re-obtain memory from the system. + + Malloc_trim returns 1 if it actually released any memory, else 0. +*/ +int dlmalloc_trim(size_t); + +/* + malloc_usable_size(void* p); + + Returns the number of bytes you can actually use in + an allocated chunk, which may be more than you requested (although + often not) due to alignment and minimum size constraints. + You can use this many bytes without worrying about + overwriting other allocated objects. This is not a particularly great + programming practice. malloc_usable_size can be more useful in + debugging and assertions, for example: + + p = malloc(n); + assert(malloc_usable_size(p) >= 256); +*/ +size_t dlmalloc_usable_size(void*); + +/* + malloc_stats(); + Prints on stderr the amount of space obtained from the system (both + via sbrk and mmap), the maximum amount (which may be more than + current if malloc_trim and/or munmap got called), and the current + number of bytes allocated via malloc (or realloc, etc) but not yet + freed. Note that this is the number of bytes allocated, not the + number requested. It will be larger than the number requested + because of alignment and bookkeeping overhead. Because it includes + alignment wastage as being in use, this figure may be greater than + zero even when no user-level chunks are allocated. + + The reported current and maximum system memory can be inaccurate if + a program makes other calls to system memory allocation functions + (normally sbrk) outside of malloc. + + malloc_stats prints only the most commonly interesting statistics. + More information can be obtained by calling mallinfo. +*/ +void dlmalloc_stats(void); + +#endif /* ONLY_MSPACES */ + +#if MSPACES + +/* + mspace is an opaque type representing an independent + region of space that supports mspace_malloc, etc. +*/ +typedef void* mspace; + +/* + create_mspace creates and returns a new independent space with the + given initial capacity, or, if 0, the default granularity size. It + returns null if there is no system memory available to create the + space. If argument locked is non-zero, the space uses a separate + lock to control access. The capacity of the space will grow + dynamically as needed to service mspace_malloc requests. You can + control the sizes of incremental increases of this space by + compiling with a different DEFAULT_GRANULARITY or dynamically + setting with mallopt(M_GRANULARITY, value). +*/ +mspace create_mspace(size_t capacity, int locked); + +/* + destroy_mspace destroys the given space, and attempts to return all + of its memory back to the system, returning the total number of + bytes freed. After destruction, the results of access to all memory + used by the space become undefined. +*/ +size_t destroy_mspace(mspace msp); + +/* + create_mspace_with_base uses the memory supplied as the initial base + of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this + space is used for bookkeeping, so the capacity must be at least this + large. (Otherwise 0 is returned.) When this initial space is + exhausted, additional memory will be obtained from the system. + Destroying this space will deallocate all additionally allocated + space (if possible) but not the initial base. +*/ +mspace create_mspace_with_base(void* base, size_t capacity, int locked); + +/* + mspace_malloc behaves as malloc, but operates within + the given space. +*/ +void* mspace_malloc(mspace msp, size_t bytes); + +/* + mspace_free behaves as free, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_free is not actually needed. + free may be called instead of mspace_free because freed chunks from + any space are handled by their originating spaces. +*/ +void mspace_free(mspace msp, void* mem); + +/* + mspace_realloc behaves as realloc, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_realloc is not actually + needed. realloc may be called instead of mspace_realloc because + realloced chunks from any space are handled by their originating + spaces. +*/ +void* mspace_realloc(mspace msp, void* mem, size_t newsize); + +/* + mspace_calloc behaves as calloc, but operates within + the given space. +*/ +void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); + +/* + mspace_memalign behaves as memalign, but operates within + the given space. +*/ +void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); + +/* + mspace_independent_calloc behaves as independent_calloc, but + operates within the given space. +*/ +void** mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]); + +/* + mspace_independent_comalloc behaves as independent_comalloc, but + operates within the given space. +*/ +void** mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]); + +/* + mspace_footprint() returns the number of bytes obtained from the + system for this space. +*/ +size_t mspace_footprint(mspace msp); + +/* + mspace_max_footprint() returns the peak number of bytes obtained from the + system for this space. +*/ +size_t mspace_max_footprint(mspace msp); + + +#if !NO_MALLINFO +/* + mspace_mallinfo behaves as mallinfo, but reports properties of + the given space. +*/ +struct mallinfo mspace_mallinfo(mspace msp); +#endif /* NO_MALLINFO */ + +/* + mspace_malloc_stats behaves as malloc_stats, but reports + properties of the given space. +*/ +void mspace_malloc_stats(mspace msp); + +/* + mspace_trim behaves as malloc_trim, but + operates within the given space. +*/ +int mspace_trim(mspace msp, size_t pad); + +/* + An alias for mallopt. +*/ +int mspace_mallopt(int, int); + +#endif /* MSPACES */ + +#ifdef __cplusplus +}; /* end of extern "C" */ +#endif /* __cplusplus */ + +/* + ======================================================================== + To make a fully customizable malloc.h header file, cut everything + above this line, put into file malloc.h, edit to suit, and #include it + on the next line, as well as in programs that use this malloc. + ======================================================================== +*/ + +/* #include "malloc.h" */ + +/*------------------------------ internal #includes ---------------------- */ + +#ifdef _MSC_VER +#pragma warning( disable : 4146 ) /* no "unsigned" warnings */ +#endif /* _MSC_VER */ + +#include <stdio.h> /* for printing in malloc_stats */ + +#ifndef LACKS_ERRNO_H +#include <errno.h> /* for MALLOC_FAILURE_ACTION */ +#endif /* LACKS_ERRNO_H */ +#if FOOTERS +#include <time.h> /* for magic initialization */ +#endif /* FOOTERS */ +#ifndef LACKS_STDLIB_H +#include <stdlib.h> /* for abort() */ +#endif /* LACKS_STDLIB_H */ +#ifdef DEBUG +#if ABORT_ON_ASSERT_FAILURE +#define assert(x) if(!(x)) ABORT +#else /* ABORT_ON_ASSERT_FAILURE */ +#include <assert.h> +#endif /* ABORT_ON_ASSERT_FAILURE */ +#else /* DEBUG */ +#define assert(x) +#endif /* DEBUG */ +#ifndef LACKS_STRING_H +#include <string.h> /* for memset etc */ +#endif /* LACKS_STRING_H */ +#if USE_BUILTIN_FFS +#ifndef LACKS_STRINGS_H +#include <strings.h> /* for ffs */ +#endif /* LACKS_STRINGS_H */ +#endif /* USE_BUILTIN_FFS */ +#if HAVE_MMAP +#ifndef LACKS_SYS_MMAN_H +#include <sys/mman.h> /* for mmap */ +#endif /* LACKS_SYS_MMAN_H */ +#ifndef LACKS_FCNTL_H +#include <fcntl.h> +#endif /* LACKS_FCNTL_H */ +#endif /* HAVE_MMAP */ +#if HAVE_MORECORE +#ifndef LACKS_UNISTD_H +#include <unistd.h> /* for sbrk */ +#else /* LACKS_UNISTD_H */ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) +extern void* sbrk(ptrdiff_t); +#endif /* FreeBSD etc */ +#endif /* LACKS_UNISTD_H */ +#endif /* HAVE_MMAP */ + +#ifndef WIN32 +#ifndef malloc_getpagesize +# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ +# ifndef _SC_PAGE_SIZE +# define _SC_PAGE_SIZE _SC_PAGESIZE +# endif +# endif +# ifdef _SC_PAGE_SIZE +# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) +# else +# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) + extern size_t getpagesize(); +# define malloc_getpagesize getpagesize() +# else +# ifdef WIN32 /* use supplied emulation of getpagesize */ +# define malloc_getpagesize getpagesize() +# else +# ifndef LACKS_SYS_PARAM_H +# include <sys/param.h> +# endif +# ifdef EXEC_PAGESIZE +# define malloc_getpagesize EXEC_PAGESIZE +# else +# ifdef NBPG +# ifndef CLSIZE +# define malloc_getpagesize NBPG +# else +# define malloc_getpagesize (NBPG * CLSIZE) +# endif +# else +# ifdef NBPC +# define malloc_getpagesize NBPC +# else +# ifdef PAGESIZE +# define malloc_getpagesize PAGESIZE +# else /* just guess */ +# define malloc_getpagesize ((size_t)4096U) +# endif +# endif +# endif +# endif +# endif +# endif +# endif +#endif +#endif + +/* ------------------- size_t and alignment properties -------------------- */ + +/* The byte and bit size of a size_t */ +#define SIZE_T_SIZE (sizeof(size_t)) +#define SIZE_T_BITSIZE (sizeof(size_t) << 3) + +/* Some constants coerced to size_t */ +/* Annoying but necessary to avoid errors on some platforms */ +#define SIZE_T_ZERO ((size_t)0) +#define SIZE_T_ONE ((size_t)1) +#define SIZE_T_TWO ((size_t)2) +#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) +#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) +#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) +#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) + +/* The bit mask value corresponding to MALLOC_ALIGNMENT */ +#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) + +/* True if address a has acceptable alignment */ +#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) + +/* the number of bytes to offset an address to align it */ +#define align_offset(A)\ + ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ + ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) + +/* -------------------------- MMAP preliminaries ------------------------- */ + +/* + If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and + checks to fail so compiler optimizer can delete code rather than + using so many "#if"s. +*/ + + +/* MORECORE and MMAP must return MFAIL on failure */ +#define MFAIL ((void*)(MAX_SIZE_T)) +#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ + +#if !HAVE_MMAP +#define IS_MMAPPED_BIT (SIZE_T_ZERO) +#define USE_MMAP_BIT (SIZE_T_ZERO) +#define CALL_MMAP(s) MFAIL +#define CALL_MUNMAP(a, s) (-1) +#define DIRECT_MMAP(s) MFAIL + +#else /* HAVE_MMAP */ +#define IS_MMAPPED_BIT (SIZE_T_ONE) +#define USE_MMAP_BIT (SIZE_T_ONE) + +#if !defined(WIN32) && !defined (__OS2__) +#define CALL_MUNMAP(a, s) munmap((a), (s)) +#define MMAP_PROT (PROT_READ|PROT_WRITE) +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#endif /* MAP_ANON */ +#ifdef MAP_ANONYMOUS +#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) +#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) +#else /* MAP_ANONYMOUS */ +/* + Nearly all versions of mmap support MAP_ANONYMOUS, so the following + is unlikely to be needed, but is supplied just in case. +*/ +#define MMAP_FLAGS (MAP_PRIVATE) +static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ +#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ + (dev_zero_fd = open("/dev/zero", O_RDWR), \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) +#endif /* MAP_ANONYMOUS */ + +#define DIRECT_MMAP(s) CALL_MMAP(s) + +#elif defined(__OS2__) + +/* OS/2 MMAP via DosAllocMem */ +static void* os2mmap(size_t size) { + void* ptr; + if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) && + DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE)) + return MFAIL; + return ptr; +} + +#define os2direct_mmap(n) os2mmap(n) + +/* This function supports releasing coalesed segments */ +static int os2munmap(void* ptr, size_t size) { + while (size) { + ULONG ulSize = size; + ULONG ulFlags = 0; + if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0) + return -1; + if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 || + ulSize > size) + return -1; + if (DosFreeMem(ptr) != 0) + return -1; + ptr = ( void * ) ( ( char * ) ptr + ulSize ); + size -= ulSize; + } + return 0; +} + +#define CALL_MMAP(s) os2mmap(s) +#define CALL_MUNMAP(a, s) os2munmap((a), (s)) +#define DIRECT_MMAP(s) os2direct_mmap(s) + +#else /* WIN32 */ + +/* Win32 MMAP via VirtualAlloc */ +static void* win32mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); + return (ptr != 0)? ptr: MFAIL; +} + +/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ +static void* win32direct_mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, + PAGE_EXECUTE_READWRITE); + return (ptr != 0)? ptr: MFAIL; +} + +/* This function supports releasing coalesed segments */ +static int win32munmap(void* ptr, size_t size) { + MEMORY_BASIC_INFORMATION minfo; + char* cptr = ptr; + while (size) { + if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) + return -1; + if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || + minfo.State != MEM_COMMIT || minfo.RegionSize > size) + return -1; + if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) + return -1; + cptr += minfo.RegionSize; + size -= minfo.RegionSize; + } + return 0; +} + +#define CALL_MMAP(s) win32mmap(s) +#define CALL_MUNMAP(a, s) win32munmap((a), (s)) +#define DIRECT_MMAP(s) win32direct_mmap(s) +#endif /* WIN32 */ +#endif /* HAVE_MMAP */ + +#if HAVE_MMAP && HAVE_MREMAP +#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) +#else /* HAVE_MMAP && HAVE_MREMAP */ +#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL +#endif /* HAVE_MMAP && HAVE_MREMAP */ + +#if HAVE_MORECORE +#define CALL_MORECORE(S) MORECORE(S) +#else /* HAVE_MORECORE */ +#define CALL_MORECORE(S) MFAIL +#endif /* HAVE_MORECORE */ + +/* mstate bit set if contiguous morecore disabled or failed */ +#define USE_NONCONTIGUOUS_BIT (4U) + +/* segment bit set in create_mspace_with_base */ +#define EXTERN_BIT (8U) + + +/* --------------------------- Lock preliminaries ------------------------ */ + +#if USE_LOCKS + +/* + When locks are defined, there are up to two global locks: + + * If HAVE_MORECORE, morecore_mutex protects sequences of calls to + MORECORE. In many cases sys_alloc requires two calls, that should + not be interleaved with calls by other threads. This does not + protect against direct calls to MORECORE by other threads not + using this lock, so there is still code to cope the best we can on + interference. + + * magic_init_mutex ensures that mparams.magic and other + unique mparams values are initialized only once. +*/ + +#if !defined(WIN32) && !defined(__OS2__) +/* By default use posix locks */ +#include <pthread.h> +#define MLOCK_T pthread_mutex_t +#define INITIAL_LOCK(l) pthread_mutex_init(l, NULL) +#define ACQUIRE_LOCK(l) pthread_mutex_lock(l) +#define RELEASE_LOCK(l) pthread_mutex_unlock(l) + +#if HAVE_MORECORE +static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif /* HAVE_MORECORE */ + +static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; + +#elif defined(__OS2__) +#define MLOCK_T HMTX +#define INITIAL_LOCK(l) DosCreateMutexSem(0, l, 0, FALSE) +#define ACQUIRE_LOCK(l) DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT) +#define RELEASE_LOCK(l) DosReleaseMutexSem(*l) +#if HAVE_MORECORE +static MLOCK_T morecore_mutex; +#endif /* HAVE_MORECORE */ +static MLOCK_T magic_init_mutex; + +#else /* WIN32 */ +/* + Because lock-protected regions have bounded times, and there + are no recursive lock calls, we can use simple spinlocks. +*/ + +#define MLOCK_T long +static int win32_acquire_lock (MLOCK_T *sl) { + for (;;) { +#ifdef InterlockedCompareExchangePointer + if (!InterlockedCompareExchange(sl, 1, 0)) + return 0; +#else /* Use older void* version */ + if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0)) + return 0; +#endif /* InterlockedCompareExchangePointer */ + Sleep (0); + } +} + +static void win32_release_lock (MLOCK_T *sl) { + InterlockedExchange (sl, 0); +} + +#define INITIAL_LOCK(l) *(l)=0 +#define ACQUIRE_LOCK(l) win32_acquire_lock(l) +#define RELEASE_LOCK(l) win32_release_lock(l) +#if HAVE_MORECORE +static MLOCK_T morecore_mutex; +#endif /* HAVE_MORECORE */ +static MLOCK_T magic_init_mutex; +#endif /* WIN32 */ + +#define USE_LOCK_BIT (2U) +#else /* USE_LOCKS */ +#define USE_LOCK_BIT (0U) +#define INITIAL_LOCK(l) +#endif /* USE_LOCKS */ + +#if USE_LOCKS && HAVE_MORECORE +#define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); +#define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); +#else /* USE_LOCKS && HAVE_MORECORE */ +#define ACQUIRE_MORECORE_LOCK() +#define RELEASE_MORECORE_LOCK() +#endif /* USE_LOCKS && HAVE_MORECORE */ + +#if USE_LOCKS +#define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); +#define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); +#else /* USE_LOCKS */ +#define ACQUIRE_MAGIC_INIT_LOCK() +#define RELEASE_MAGIC_INIT_LOCK() +#endif /* USE_LOCKS */ + + +/* ----------------------- Chunk representations ------------------------ */ + +/* + (The following includes lightly edited explanations by Colin Plumb.) + + The malloc_chunk declaration below is misleading (but accurate and + necessary). It declares a "view" into memory allowing access to + necessary fields at known offsets from a given base. + + Chunks of memory are maintained using a `boundary tag' method as + originally described by Knuth. (See the paper by Paul Wilson + ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such + techniques.) Sizes of free chunks are stored both in the front of + each chunk and at the end. This makes consolidating fragmented + chunks into bigger chunks fast. The head fields also hold bits + representing whether chunks are free or in use. + + Here are some pictures to make it clearer. They are "exploded" to + show that the state of a chunk can be thought of as extending from + the high 31 bits of the head field of its header through the + prev_foot and PINUSE_BIT bit of the following chunk header. + + A chunk that's in use looks like: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk (if P = 1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| + | Size of this chunk 1| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + +- -+ + | | + +- -+ + | : + +- size - sizeof(size_t) available payload bytes -+ + : | + chunk-> +- -+ + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| + | Size of next chunk (may or may not be in use) | +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + And if it's free, it looks like this: + + chunk-> +- -+ + | User payload (must be in use, or we would have merged!) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| + | Size of this chunk 0| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next pointer | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Prev pointer | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | : + +- size - sizeof(struct chunk) unused bytes -+ + : | + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of this chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| + | Size of next chunk (must be in use, or we would have merged)| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | : + +- User payload -+ + : | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0| + +-+ + Note that since we always merge adjacent free chunks, the chunks + adjacent to a free chunk must be in use. + + Given a pointer to a chunk (which can be derived trivially from the + payload pointer) we can, in O(1) time, find out whether the adjacent + chunks are free, and if so, unlink them from the lists that they + are on and merge them with the current chunk. + + Chunks always begin on even word boundaries, so the mem portion + (which is returned to the user) is also on an even word boundary, and + thus at least double-word aligned. + + The P (PINUSE_BIT) bit, stored in the unused low-order bit of the + chunk size (which is always a multiple of two words), is an in-use + bit for the *previous* chunk. If that bit is *clear*, then the + word before the current chunk size contains the previous chunk + size, and can be used to find the front of the previous chunk. + The very first chunk allocated always has this bit set, preventing + access to non-existent (or non-owned) memory. If pinuse is set for + any given chunk, then you CANNOT determine the size of the + previous chunk, and might even get a memory addressing fault when + trying to do so. + + The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of + the chunk size redundantly records whether the current chunk is + inuse. This redundancy enables usage checks within free and realloc, + and reduces indirection when freeing and consolidating chunks. + + Each freshly allocated chunk must have both cinuse and pinuse set. + That is, each allocated chunk borders either a previously allocated + and still in-use chunk, or the base of its memory arena. This is + ensured by making all allocations from the the `lowest' part of any + found chunk. Further, no free chunk physically borders another one, + so each free chunk is known to be preceded and followed by either + inuse chunks or the ends of memory. + + Note that the `foot' of the current chunk is actually represented + as the prev_foot of the NEXT chunk. This makes it easier to + deal with alignments etc but can be very confusing when trying + to extend or adapt this code. + + The exceptions to all this are + + 1. The special chunk `top' is the top-most available chunk (i.e., + the one bordering the end of available memory). It is treated + specially. Top is never included in any bin, is used only if + no other chunk is available, and is released back to the + system if it is very large (see M_TRIM_THRESHOLD). In effect, + the top chunk is treated as larger (and thus less well + fitting) than any other available chunk. The top chunk + doesn't update its trailing size field since there is no next + contiguous chunk that would have to index off it. However, + space is still allocated for it (TOP_FOOT_SIZE) to enable + separation or merging when space is extended. + + 3. Chunks allocated via mmap, which have the lowest-order bit + (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set + PINUSE_BIT in their head fields. Because they are allocated + one-by-one, each must carry its own prev_foot field, which is + also used to hold the offset this chunk has within its mmapped + region, which is needed to preserve alignment. Each mmapped + chunk is trailed by the first two fields of a fake next-chunk + for sake of usage checks. + +*/ + +struct malloc_chunk { + size_t prev_foot; /* Size of previous chunk (if free). */ + size_t head; /* Size and inuse bits. */ + struct malloc_chunk* fd; /* double links -- used only if free. */ + struct malloc_chunk* bk; +}; + +typedef struct malloc_chunk mchunk; +typedef struct malloc_chunk* mchunkptr; +typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ +typedef size_t bindex_t; /* Described below */ +typedef unsigned int binmap_t; /* Described below */ +typedef unsigned int flag_t; /* The type of various bit flag sets */ + +/* ------------------- Chunks sizes and alignments ----------------------- */ + +#define MCHUNK_SIZE (sizeof(mchunk)) + +#if FOOTERS +#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +#else /* FOOTERS */ +#define CHUNK_OVERHEAD (SIZE_T_SIZE) +#endif /* FOOTERS */ + +/* MMapped chunks need a second word of overhead ... */ +#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +/* ... and additional padding for fake next-chunk at foot */ +#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) + +/* The smallest size we can malloc is an aligned minimal chunk */ +#define MIN_CHUNK_SIZE\ + ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* conversion from malloc headers to user pointers, and back */ +#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) +#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) +/* chunk associated with aligned address A */ +#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) + +/* Bounds on request (not chunk) sizes. */ +#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) +#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) + +/* pad request bytes into a usable size */ +#define pad_request(req) \ + (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* pad request, checking for minimum (but not maximum) */ +#define request2size(req) \ + (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) + + +/* ------------------ Operations on head and foot fields ----------------- */ + +/* + The head field of a chunk is or'ed with PINUSE_BIT when previous + adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in + use. If the chunk was obtained with mmap, the prev_foot field has + IS_MMAPPED_BIT set, otherwise holding the offset of the base of the + mmapped region to the base of the chunk. +*/ + +#define PINUSE_BIT (SIZE_T_ONE) +#define CINUSE_BIT (SIZE_T_TWO) +#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) + +/* Head value for fenceposts */ +#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) + +/* extraction of fields from head words */ +#define cinuse(p) ((p)->head & CINUSE_BIT) +#define pinuse(p) ((p)->head & PINUSE_BIT) +#define chunksize(p) ((p)->head & ~(INUSE_BITS)) + +#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) +#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) + +/* Treat space at ptr +/- offset as a chunk */ +#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) +#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) + +/* Ptr to next or previous physical malloc_chunk. */ +#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) +#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) + +/* extract next chunk's pinuse bit */ +#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) + +/* Get/set size at footer */ +#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) +#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) + +/* Set size, pinuse bit, and foot */ +#define set_size_and_pinuse_of_free_chunk(p, s)\ + ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) + +/* Set size, pinuse bit, foot, and clear next pinuse */ +#define set_free_with_pinuse(p, s, n)\ + (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) + +#define is_mmapped(p)\ + (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) + +/* Get the internal overhead associated with chunk p */ +#define overhead_for(p)\ + (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) + +/* Return true if malloced space is not necessarily cleared */ +#if MMAP_CLEARS +#define calloc_must_clear(p) (!is_mmapped(p)) +#else /* MMAP_CLEARS */ +#define calloc_must_clear(p) (1) +#endif /* MMAP_CLEARS */ + +/* ---------------------- Overlaid data structures ----------------------- */ + +/* + When chunks are not in use, they are treated as nodes of either + lists or trees. + + "Small" chunks are stored in circular doubly-linked lists, and look + like this: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `head:' | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Forward pointer to next chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Back pointer to previous chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Unused space (may be 0 bytes long) . + . . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `foot:' | Size of chunk, in bytes | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Larger chunks are kept in a form of bitwise digital trees (aka + tries) keyed on chunksizes. Because malloc_tree_chunks are only for + free chunks greater than 256 bytes, their size doesn't impose any + constraints on user chunk sizes. Each node looks like: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `head:' | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Forward pointer to next chunk of same size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Back pointer to previous chunk of same size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to left child (child[0]) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to right child (child[1]) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to parent | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | bin index of this chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Unused space . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `foot:' | Size of chunk, in bytes | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Each tree holding treenodes is a tree of unique chunk sizes. Chunks + of the same size are arranged in a circularly-linked list, with only + the oldest chunk (the next to be used, in our FIFO ordering) + actually in the tree. (Tree members are distinguished by a non-null + parent pointer.) If a chunk with the same size an an existing node + is inserted, it is linked off the existing node using pointers that + work in the same way as fd/bk pointers of small chunks. + + Each tree contains a power of 2 sized range of chunk sizes (the + smallest is 0x100 <= x < 0x180), which is is divided in half at each + tree level, with the chunks in the smaller half of the range (0x100 + <= x < 0x140 for the top nose) in the left subtree and the larger + half (0x140 <= x < 0x180) in the right subtree. This is, of course, + done by inspecting individual bits. + + Using these rules, each node's left subtree contains all smaller + sizes than its right subtree. However, the node at the root of each + subtree has no particular ordering relationship to either. (The + dividing line between the subtree sizes is based on trie relation.) + If we remove the last chunk of a given size from the interior of the + tree, we need to replace it with a leaf node. The tree ordering + rules permit a node to be replaced by any leaf below it. + + The smallest chunk in a tree (a common operation in a best-fit + allocator) can be found by walking a path to the leftmost leaf in + the tree. Unlike a usual binary tree, where we follow left child + pointers until we reach a null, here we follow the right child + pointer any time the left one is null, until we reach a leaf with + both child pointers null. The smallest chunk in the tree will be + somewhere along that path. + + The worst case number of steps to add, find, or remove a node is + bounded by the number of bits differentiating chunks within + bins. Under current bin calculations, this ranges from 6 up to 21 + (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case + is of course much better. +*/ + +struct malloc_tree_chunk { + /* The first four fields must be compatible with malloc_chunk */ + size_t prev_foot; + size_t head; + struct malloc_tree_chunk* fd; + struct malloc_tree_chunk* bk; + + struct malloc_tree_chunk* child[2]; + struct malloc_tree_chunk* parent; + bindex_t index; +}; + +typedef struct malloc_tree_chunk tchunk; +typedef struct malloc_tree_chunk* tchunkptr; +typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ + +/* A little helper macro for trees */ +#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) + +/* ----------------------------- Segments -------------------------------- */ + +/* + Each malloc space may include non-contiguous segments, held in a + list headed by an embedded malloc_segment record representing the + top-most space. Segments also include flags holding properties of + the space. Large chunks that are directly allocated by mmap are not + included in this list. They are instead independently created and + destroyed without otherwise keeping track of them. + + Segment management mainly comes into play for spaces allocated by + MMAP. Any call to MMAP might or might not return memory that is + adjacent to an existing segment. MORECORE normally contiguously + extends the current space, so this space is almost always adjacent, + which is simpler and faster to deal with. (This is why MORECORE is + used preferentially to MMAP when both are available -- see + sys_alloc.) When allocating using MMAP, we don't use any of the + hinting mechanisms (inconsistently) supported in various + implementations of unix mmap, or distinguish reserving from + committing memory. Instead, we just ask for space, and exploit + contiguity when we get it. It is probably possible to do + better than this on some systems, but no general scheme seems + to be significantly better. + + Management entails a simpler variant of the consolidation scheme + used for chunks to reduce fragmentation -- new adjacent memory is + normally prepended or appended to an existing segment. However, + there are limitations compared to chunk consolidation that mostly + reflect the fact that segment processing is relatively infrequent + (occurring only when getting memory from system) and that we + don't expect to have huge numbers of segments: + + * Segments are not indexed, so traversal requires linear scans. (It + would be possible to index these, but is not worth the extra + overhead and complexity for most programs on most platforms.) + * New segments are only appended to old ones when holding top-most + memory; if they cannot be prepended to others, they are held in + different segments. + + Except for the top-most segment of an mstate, each segment record + is kept at the tail of its segment. Segments are added by pushing + segment records onto the list headed by &mstate.seg for the + containing mstate. + + Segment flags control allocation/merge/deallocation policies: + * If EXTERN_BIT set, then we did not allocate this segment, + and so should not try to deallocate or merge with others. + (This currently holds only for the initial segment passed + into create_mspace_with_base.) + * If IS_MMAPPED_BIT set, the segment may be merged with + other surrounding mmapped segments and trimmed/de-allocated + using munmap. + * If neither bit is set, then the segment was obtained using + MORECORE so can be merged with surrounding MORECORE'd segments + and deallocated/trimmed using MORECORE with negative arguments. +*/ + +struct malloc_segment { + char* base; /* base address */ + size_t size; /* allocated size */ + struct malloc_segment* next; /* ptr to next segment */ +#if FFI_MMAP_EXEC_WRIT + /* The mmap magic is supposed to store the address of the executable + segment at the very end of the requested block. */ + +# define mmap_exec_offset(b,s) (*(ptrdiff_t*)((b)+(s)-sizeof(ptrdiff_t))) + + /* We can only merge segments if their corresponding executable + segments are at identical offsets. */ +# define check_segment_merge(S,b,s) \ + (mmap_exec_offset((b),(s)) == (S)->exec_offset) + +# define add_segment_exec_offset(p,S) ((char*)(p) + (S)->exec_offset) +# define sub_segment_exec_offset(p,S) ((char*)(p) - (S)->exec_offset) + + /* The removal of sflags only works with HAVE_MORECORE == 0. */ + +# define get_segment_flags(S) (IS_MMAPPED_BIT) +# define set_segment_flags(S,v) \ + (((v) != IS_MMAPPED_BIT) ? (ABORT, (v)) : \ + (((S)->exec_offset = \ + mmap_exec_offset((S)->base, (S)->size)), \ + (mmap_exec_offset((S)->base + (S)->exec_offset, (S)->size) != \ + (S)->exec_offset) ? (ABORT, (v)) : \ + (mmap_exec_offset((S)->base, (S)->size) = 0), (v))) + + /* We use an offset here, instead of a pointer, because then, when + base changes, we don't have to modify this. On architectures + with segmented addresses, this might not work. */ + ptrdiff_t exec_offset; +#else + +# define get_segment_flags(S) ((S)->sflags) +# define set_segment_flags(S,v) ((S)->sflags = (v)) +# define check_segment_merge(S,b,s) (1) + + flag_t sflags; /* mmap and extern flag */ +#endif +}; + +#define is_mmapped_segment(S) (get_segment_flags(S) & IS_MMAPPED_BIT) +#define is_extern_segment(S) (get_segment_flags(S) & EXTERN_BIT) + +typedef struct malloc_segment msegment; +typedef struct malloc_segment* msegmentptr; + +/* ---------------------------- malloc_state ----------------------------- */ + +/* + A malloc_state holds all of the bookkeeping for a space. + The main fields are: + + Top + The topmost chunk of the currently active segment. Its size is + cached in topsize. The actual size of topmost space is + topsize+TOP_FOOT_SIZE, which includes space reserved for adding + fenceposts and segment records if necessary when getting more + space from the system. The size at which to autotrim top is + cached from mparams in trim_check, except that it is disabled if + an autotrim fails. + + Designated victim (dv) + This is the preferred chunk for servicing small requests that + don't have exact fits. It is normally the chunk split off most + recently to service another small request. Its size is cached in + dvsize. The link fields of this chunk are not maintained since it + is not kept in a bin. + + SmallBins + An array of bin headers for free chunks. These bins hold chunks + with sizes less than MIN_LARGE_SIZE bytes. Each bin contains + chunks of all the same size, spaced 8 bytes apart. To simplify + use in double-linked lists, each bin header acts as a malloc_chunk + pointing to the real first node, if it exists (else pointing to + itself). This avoids special-casing for headers. But to avoid + waste, we allocate only the fd/bk pointers of bins, and then use + repositioning tricks to treat these as the fields of a chunk. + + TreeBins + Treebins are pointers to the roots of trees holding a range of + sizes. There are 2 equally spaced treebins for each power of two + from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything + larger. + + Bin maps + There is one bit map for small bins ("smallmap") and one for + treebins ("treemap). Each bin sets its bit when non-empty, and + clears the bit when empty. Bit operations are then used to avoid + bin-by-bin searching -- nearly all "search" is done without ever + looking at bins that won't be selected. The bit maps + conservatively use 32 bits per map word, even if on 64bit system. + For a good description of some of the bit-based techniques used + here, see Henry S. Warren Jr's book "Hacker's Delight" (and + supplement at http://hackersdelight.org/). Many of these are + intended to reduce the branchiness of paths through malloc etc, as + well as to reduce the number of memory locations read or written. + + Segments + A list of segments headed by an embedded malloc_segment record + representing the initial space. + + Address check support + The least_addr field is the least address ever obtained from + MORECORE or MMAP. Attempted frees and reallocs of any address less + than this are trapped (unless INSECURE is defined). + + Magic tag + A cross-check field that should always hold same value as mparams.magic. + + Flags + Bits recording whether to use MMAP, locks, or contiguous MORECORE + + Statistics + Each space keeps track of current and maximum system memory + obtained via MORECORE or MMAP. + + Locking + If USE_LOCKS is defined, the "mutex" lock is acquired and released + around every public call using this mspace. +*/ + +/* Bin types, widths and sizes */ +#define NSMALLBINS (32U) +#define NTREEBINS (32U) +#define SMALLBIN_SHIFT (3U) +#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) +#define TREEBIN_SHIFT (8U) +#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) +#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) +#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) + +struct malloc_state { + binmap_t smallmap; + binmap_t treemap; + size_t dvsize; + size_t topsize; + char* least_addr; + mchunkptr dv; + mchunkptr top; + size_t trim_check; + size_t magic; + mchunkptr smallbins[(NSMALLBINS+1)*2]; + tbinptr treebins[NTREEBINS]; + size_t footprint; + size_t max_footprint; + flag_t mflags; +#if USE_LOCKS + MLOCK_T mutex; /* locate lock among fields that rarely change */ +#endif /* USE_LOCKS */ + msegment seg; +}; + +typedef struct malloc_state* mstate; + +/* ------------- Global malloc_state and malloc_params ------------------- */ + +/* + malloc_params holds global properties, including those that can be + dynamically set using mallopt. There is a single instance, mparams, + initialized in init_mparams. +*/ + +struct malloc_params { + size_t magic; + size_t page_size; + size_t granularity; + size_t mmap_threshold; + size_t trim_threshold; + flag_t default_mflags; +}; + +static struct malloc_params mparams; + +/* The global malloc_state used for all non-"mspace" calls */ +static struct malloc_state _gm_; +#define gm (&_gm_) +#define is_global(M) ((M) == &_gm_) +#define is_initialized(M) ((M)->top != 0) + +/* -------------------------- system alloc setup ------------------------- */ + +/* Operations on mflags */ + +#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) +#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) +#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) + +#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) +#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) +#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) + +#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) +#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) + +#define set_lock(M,L)\ + ((M)->mflags = (L)?\ + ((M)->mflags | USE_LOCK_BIT) :\ + ((M)->mflags & ~USE_LOCK_BIT)) + +/* page-align a size */ +#define page_align(S)\ + (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) + +/* granularity-align a size */ +#define granularity_align(S)\ + (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) + +#define is_page_aligned(S)\ + (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) +#define is_granularity_aligned(S)\ + (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) + +/* True if segment S holds address A */ +#define segment_holds(S, A)\ + ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) + +/* Return segment holding given address */ +static msegmentptr segment_holding(mstate m, char* addr) { + msegmentptr sp = &m->seg; + for (;;) { + if (addr >= sp->base && addr < sp->base + sp->size) + return sp; + if ((sp = sp->next) == 0) + return 0; + } +} + +/* Return true if segment contains a segment link */ +static int has_segment_link(mstate m, msegmentptr ss) { + msegmentptr sp = &m->seg; + for (;;) { + if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) + return 1; + if ((sp = sp->next) == 0) + return 0; + } +} + +#ifndef MORECORE_CANNOT_TRIM +#define should_trim(M,s) ((s) > (M)->trim_check) +#else /* MORECORE_CANNOT_TRIM */ +#define should_trim(M,s) (0) +#endif /* MORECORE_CANNOT_TRIM */ + +/* + TOP_FOOT_SIZE is padding at the end of a segment, including space + that may be needed to place segment records and fenceposts when new + noncontiguous segments are added. +*/ +#define TOP_FOOT_SIZE\ + (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) + + +/* ------------------------------- Hooks -------------------------------- */ + +/* + PREACTION should be defined to return 0 on success, and nonzero on + failure. If you are not using locking, you can redefine these to do + anything you like. +*/ + +#if USE_LOCKS + +/* Ensure locks are initialized */ +#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) + +#define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) +#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } +#else /* USE_LOCKS */ + +#ifndef PREACTION +#define PREACTION(M) (0) +#endif /* PREACTION */ + +#ifndef POSTACTION +#define POSTACTION(M) +#endif /* POSTACTION */ + +#endif /* USE_LOCKS */ + +/* + CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. + USAGE_ERROR_ACTION is triggered on detected bad frees and + reallocs. The argument p is an address that might have triggered the + fault. It is ignored by the two predefined actions, but might be + useful in custom actions that try to help diagnose errors. +*/ + +#if PROCEED_ON_ERROR + +/* A count of the number of corruption errors causing resets */ +int malloc_corruption_error_count; + +/* default corruption action */ +static void reset_on_error(mstate m); + +#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) +#define USAGE_ERROR_ACTION(m, p) + +#else /* PROCEED_ON_ERROR */ + +#ifndef CORRUPTION_ERROR_ACTION +#define CORRUPTION_ERROR_ACTION(m) ABORT +#endif /* CORRUPTION_ERROR_ACTION */ + +#ifndef USAGE_ERROR_ACTION +#define USAGE_ERROR_ACTION(m,p) ABORT +#endif /* USAGE_ERROR_ACTION */ + +#endif /* PROCEED_ON_ERROR */ + +/* -------------------------- Debugging setup ---------------------------- */ + +#if ! DEBUG + +#define check_free_chunk(M,P) +#define check_inuse_chunk(M,P) +#define check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) +#define check_malloc_state(M) +#define check_top_chunk(M,P) + +#else /* DEBUG */ +#define check_free_chunk(M,P) do_check_free_chunk(M,P) +#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) +#define check_top_chunk(M,P) do_check_top_chunk(M,P) +#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) +#define check_malloc_state(M) do_check_malloc_state(M) + +static void do_check_any_chunk(mstate m, mchunkptr p); +static void do_check_top_chunk(mstate m, mchunkptr p); +static void do_check_mmapped_chunk(mstate m, mchunkptr p); +static void do_check_inuse_chunk(mstate m, mchunkptr p); +static void do_check_free_chunk(mstate m, mchunkptr p); +static void do_check_malloced_chunk(mstate m, void* mem, size_t s); +static void do_check_tree(mstate m, tchunkptr t); +static void do_check_treebin(mstate m, bindex_t i); +static void do_check_smallbin(mstate m, bindex_t i); +static void do_check_malloc_state(mstate m); +static int bin_find(mstate m, mchunkptr x); +static size_t traverse_and_check(mstate m); +#endif /* DEBUG */ + +/* ---------------------------- Indexing Bins ---------------------------- */ + +#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) +#define small_index(s) ((s) >> SMALLBIN_SHIFT) +#define small_index2size(i) ((i) << SMALLBIN_SHIFT) +#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) + +/* addressing by index. See above about smallbin repositioning */ +#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) +#define treebin_at(M,i) (&((M)->treebins[i])) + +/* assign tree index for size S to variable I */ +#if defined(__GNUC__) && defined(__i386__) +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int K;\ + __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ + I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ + }\ +} +#else /* GNUC */ +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int Y = (unsigned int)X;\ + unsigned int N = ((Y - 0x100) >> 16) & 8;\ + unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ + N += K;\ + N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ + K = 14 - N + ((Y <<= K) >> 15);\ + I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ + }\ +} +#endif /* GNUC */ + +/* Bit representing maximum resolved size in a treebin at i */ +#define bit_for_tree_index(i) \ + (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) + +/* Shift placing maximum resolved bit in a treebin at i as sign bit */ +#define leftshift_for_tree_index(i) \ + ((i == NTREEBINS-1)? 0 : \ + ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) + +/* The size of the smallest chunk held in bin with index i */ +#define minsize_for_tree_index(i) \ + ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ + (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) + + +/* ------------------------ Operations on bin maps ----------------------- */ + +/* bit corresponding to given index */ +#define idx2bit(i) ((binmap_t)(1) << (i)) + +/* Mark/Clear bits with given index */ +#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) +#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) +#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) + +#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) +#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) +#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) + +/* index corresponding to given bit */ + +#if defined(__GNUC__) && defined(__i386__) +#define compute_bit2idx(X, I)\ +{\ + unsigned int J;\ + __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ + I = (bindex_t)J;\ +} + +#else /* GNUC */ +#if USE_BUILTIN_FFS +#define compute_bit2idx(X, I) I = __builtin_ffs(X)-1 + +#else /* USE_BUILTIN_FFS */ +#define compute_bit2idx(X, I)\ +{\ + unsigned int Y = X - 1;\ + unsigned int K = Y >> (16-4) & 16;\ + unsigned int N = K; Y >>= K;\ + N += K = Y >> (8-3) & 8; Y >>= K;\ + N += K = Y >> (4-2) & 4; Y >>= K;\ + N += K = Y >> (2-1) & 2; Y >>= K;\ + N += K = Y >> (1-0) & 1; Y >>= K;\ + I = (bindex_t)(N + Y);\ +} +#endif /* USE_BUILTIN_FFS */ +#endif /* GNUC */ + +/* isolate the least set bit of a bitmap */ +#define least_bit(x) ((x) & -(x)) + +/* mask with all bits to left of least bit of x on */ +#define left_bits(x) ((x<<1) | -(x<<1)) + +/* mask with all bits to left of or equal to least bit of x on */ +#define same_or_left_bits(x) ((x) | -(x)) + + +/* ----------------------- Runtime Check Support ------------------------- */ + +/* + For security, the main invariant is that malloc/free/etc never + writes to a static address other than malloc_state, unless static + malloc_state itself has been corrupted, which cannot occur via + malloc (because of these checks). In essence this means that we + believe all pointers, sizes, maps etc held in malloc_state, but + check all of those linked or offsetted from other embedded data + structures. These checks are interspersed with main code in a way + that tends to minimize their run-time cost. + + When FOOTERS is defined, in addition to range checking, we also + verify footer fields of inuse chunks, which can be used guarantee + that the mstate controlling malloc/free is intact. This is a + streamlined version of the approach described by William Robertson + et al in "Run-time Detection of Heap-based Overflows" LISA'03 + http://www.usenix.org/events/lisa03/tech/robertson.html The footer + of an inuse chunk holds the xor of its mstate and a random seed, + that is checked upon calls to free() and realloc(). This is + (probablistically) unguessable from outside the program, but can be + computed by any code successfully malloc'ing any chunk, so does not + itself provide protection against code that has already broken + security through some other means. Unlike Robertson et al, we + always dynamically check addresses of all offset chunks (previous, + next, etc). This turns out to be cheaper than relying on hashes. +*/ + +#if !INSECURE +/* Check if address a is at least as high as any from MORECORE or MMAP */ +#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) +/* Check if address of next chunk n is higher than base chunk p */ +#define ok_next(p, n) ((char*)(p) < (char*)(n)) +/* Check if p has its cinuse bit on */ +#define ok_cinuse(p) cinuse(p) +/* Check if p has its pinuse bit on */ +#define ok_pinuse(p) pinuse(p) + +#else /* !INSECURE */ +#define ok_address(M, a) (1) +#define ok_next(b, n) (1) +#define ok_cinuse(p) (1) +#define ok_pinuse(p) (1) +#endif /* !INSECURE */ + +#if (FOOTERS && !INSECURE) +/* Check if (alleged) mstate m has expected magic field */ +#define ok_magic(M) ((M)->magic == mparams.magic) +#else /* (FOOTERS && !INSECURE) */ +#define ok_magic(M) (1) +#endif /* (FOOTERS && !INSECURE) */ + + +/* In gcc, use __builtin_expect to minimize impact of checks */ +#if !INSECURE +#if defined(__GNUC__) && __GNUC__ >= 3 +#define RTCHECK(e) __builtin_expect(e, 1) +#else /* GNUC */ +#define RTCHECK(e) (e) +#endif /* GNUC */ +#else /* !INSECURE */ +#define RTCHECK(e) (1) +#endif /* !INSECURE */ + +/* macros to set up inuse chunks with or without footers */ + +#if !FOOTERS + +#define mark_inuse_foot(M,p,s) + +/* Set cinuse bit and pinuse bit of next chunk */ +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set size, cinuse and pinuse bit of this chunk */ +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) + +#else /* FOOTERS */ + +/* Set foot of inuse chunk to be xor of mstate and seed */ +#define mark_inuse_foot(M,p,s)\ + (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) + +#define get_mstate_for(p)\ + ((mstate)(((mchunkptr)((char*)(p) +\ + (chunksize(p))))->prev_foot ^ mparams.magic)) + +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ + mark_inuse_foot(M,p,s)) + +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ + mark_inuse_foot(M,p,s)) + +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + mark_inuse_foot(M, p, s)) + +#endif /* !FOOTERS */ + +/* ---------------------------- setting mparams -------------------------- */ + +/* Initialize mparams */ +static int init_mparams(void) { + if (mparams.page_size == 0) { + size_t s; + + mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; + mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; +#if MORECORE_CONTIGUOUS + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; +#else /* MORECORE_CONTIGUOUS */ + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; +#endif /* MORECORE_CONTIGUOUS */ + +#if (FOOTERS && !INSECURE) + { +#if USE_DEV_RANDOM + int fd; + unsigned char buf[sizeof(size_t)]; + /* Try to use /dev/urandom, else fall back on using time */ + if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && + read(fd, buf, sizeof(buf)) == sizeof(buf)) { + s = *((size_t *) buf); + close(fd); + } + else +#endif /* USE_DEV_RANDOM */ + s = (size_t)(time(0) ^ (size_t)0x55555555U); + + s |= (size_t)8U; /* ensure nonzero */ + s &= ~(size_t)7U; /* improve chances of fault for bad values */ + + } +#else /* (FOOTERS && !INSECURE) */ + s = (size_t)0x58585858U; +#endif /* (FOOTERS && !INSECURE) */ + ACQUIRE_MAGIC_INIT_LOCK(); + if (mparams.magic == 0) { + mparams.magic = s; + /* Set up lock for main malloc area */ + INITIAL_LOCK(&gm->mutex); + gm->mflags = mparams.default_mflags; + } + RELEASE_MAGIC_INIT_LOCK(); + +#if !defined(WIN32) && !defined(__OS2__) + mparams.page_size = malloc_getpagesize; + mparams.granularity = ((DEFAULT_GRANULARITY != 0)? + DEFAULT_GRANULARITY : mparams.page_size); +#elif defined (__OS2__) + /* if low-memory is used, os2munmap() would break + if it were anything other than 64k */ + mparams.page_size = 4096u; + mparams.granularity = 65536u; +#else /* WIN32 */ + { + SYSTEM_INFO system_info; + GetSystemInfo(&system_info); + mparams.page_size = system_info.dwPageSize; + mparams.granularity = system_info.dwAllocationGranularity; + } +#endif /* WIN32 */ + + /* Sanity-check configuration: + size_t must be unsigned and as wide as pointer type. + ints must be at least 4 bytes. + alignment must be at least 8. + Alignment, min chunk size, and page size must all be powers of 2. + */ + if ((sizeof(size_t) != sizeof(char*)) || + (MAX_SIZE_T < MIN_CHUNK_SIZE) || + (sizeof(int) < 4) || + (MALLOC_ALIGNMENT < (size_t)8U) || + ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || + ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || + ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || + ((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) + ABORT; + } + return 0; +} + +/* support for mallopt */ +static int change_mparam(int param_number, int value) { + size_t val = (size_t)value; + init_mparams(); + switch(param_number) { + case M_TRIM_THRESHOLD: + mparams.trim_threshold = val; + return 1; + case M_GRANULARITY: + if (val >= mparams.page_size && ((val & (val-1)) == 0)) { + mparams.granularity = val; + return 1; + } + else + return 0; + case M_MMAP_THRESHOLD: + mparams.mmap_threshold = val; + return 1; + default: + return 0; + } +} + +#if DEBUG +/* ------------------------- Debugging Support --------------------------- */ + +/* Check properties of any chunk, whether free, inuse, mmapped etc */ +static void do_check_any_chunk(mstate m, mchunkptr p) { + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); +} + +/* Check properties of top chunk */ +static void do_check_top_chunk(mstate m, mchunkptr p) { + msegmentptr sp = segment_holding(m, (char*)p); + size_t sz = chunksize(p); + assert(sp != 0); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(sz == m->topsize); + assert(sz > 0); + assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); + assert(pinuse(p)); + assert(!next_pinuse(p)); +} + +/* Check properties of (inuse) mmapped chunks */ +static void do_check_mmapped_chunk(mstate m, mchunkptr p) { + size_t sz = chunksize(p); + size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); + assert(is_mmapped(p)); + assert(use_mmap(m)); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(!is_small(sz)); + assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); + assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); + assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); +} + +/* Check properties of inuse chunks */ +static void do_check_inuse_chunk(mstate m, mchunkptr p) { + do_check_any_chunk(m, p); + assert(cinuse(p)); + assert(next_pinuse(p)); + /* If not pinuse and not mmapped, previous chunk has OK offset */ + assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); + if (is_mmapped(p)) + do_check_mmapped_chunk(m, p); +} + +/* Check properties of free chunks */ +static void do_check_free_chunk(mstate m, mchunkptr p) { + size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); + mchunkptr next = chunk_plus_offset(p, sz); + do_check_any_chunk(m, p); + assert(!cinuse(p)); + assert(!next_pinuse(p)); + assert (!is_mmapped(p)); + if (p != m->dv && p != m->top) { + if (sz >= MIN_CHUNK_SIZE) { + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(is_aligned(chunk2mem(p))); + assert(next->prev_foot == sz); + assert(pinuse(p)); + assert (next == m->top || cinuse(next)); + assert(p->fd->bk == p); + assert(p->bk->fd == p); + } + else /* markers are always of size SIZE_T_SIZE */ + assert(sz == SIZE_T_SIZE); + } +} + +/* Check properties of malloced chunks at the point they are malloced */ +static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); + do_check_inuse_chunk(m, p); + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(sz >= MIN_CHUNK_SIZE); + assert(sz >= s); + /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ + assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); + } +} + +/* Check a tree and its subtrees. */ +static void do_check_tree(mstate m, tchunkptr t) { + tchunkptr head = 0; + tchunkptr u = t; + bindex_t tindex = t->index; + size_t tsize = chunksize(t); + bindex_t idx; + compute_tree_index(tsize, idx); + assert(tindex == idx); + assert(tsize >= MIN_LARGE_SIZE); + assert(tsize >= minsize_for_tree_index(idx)); + assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); + + do { /* traverse through chain of same-sized nodes */ + do_check_any_chunk(m, ((mchunkptr)u)); + assert(u->index == tindex); + assert(chunksize(u) == tsize); + assert(!cinuse(u)); + assert(!next_pinuse(u)); + assert(u->fd->bk == u); + assert(u->bk->fd == u); + if (u->parent == 0) { + assert(u->child[0] == 0); + assert(u->child[1] == 0); + } + else { + assert(head == 0); /* only one node on chain has parent */ + head = u; + assert(u->parent != u); + assert (u->parent->child[0] == u || + u->parent->child[1] == u || + *((tbinptr*)(u->parent)) == u); + if (u->child[0] != 0) { + assert(u->child[0]->parent == u); + assert(u->child[0] != u); + do_check_tree(m, u->child[0]); + } + if (u->child[1] != 0) { + assert(u->child[1]->parent == u); + assert(u->child[1] != u); + do_check_tree(m, u->child[1]); + } + if (u->child[0] != 0 && u->child[1] != 0) { + assert(chunksize(u->child[0]) < chunksize(u->child[1])); + } + } + u = u->fd; + } while (u != t); + assert(head != 0); +} + +/* Check all the chunks in a treebin. */ +static void do_check_treebin(mstate m, bindex_t i) { + tbinptr* tb = treebin_at(m, i); + tchunkptr t = *tb; + int empty = (m->treemap & (1U << i)) == 0; + if (t == 0) + assert(empty); + if (!empty) + do_check_tree(m, t); +} + +/* Check all the chunks in a smallbin. */ +static void do_check_smallbin(mstate m, bindex_t i) { + sbinptr b = smallbin_at(m, i); + mchunkptr p = b->bk; + unsigned int empty = (m->smallmap & (1U << i)) == 0; + if (p == b) + assert(empty); + if (!empty) { + for (; p != b; p = p->bk) { + size_t size = chunksize(p); + mchunkptr q; + /* each chunk claims to be free */ + do_check_free_chunk(m, p); + /* chunk belongs in bin */ + assert(small_index(size) == i); + assert(p->bk == b || chunksize(p->bk) == chunksize(p)); + /* chunk is followed by an inuse chunk */ + q = next_chunk(p); + if (q->head != FENCEPOST_HEAD) + do_check_inuse_chunk(m, q); + } + } +} + +/* Find x in a bin. Used in other check functions. */ +static int bin_find(mstate m, mchunkptr x) { + size_t size = chunksize(x); + if (is_small(size)) { + bindex_t sidx = small_index(size); + sbinptr b = smallbin_at(m, sidx); + if (smallmap_is_marked(m, sidx)) { + mchunkptr p = b; + do { + if (p == x) + return 1; + } while ((p = p->fd) != b); + } + } + else { + bindex_t tidx; + compute_tree_index(size, tidx); + if (treemap_is_marked(m, tidx)) { + tchunkptr t = *treebin_at(m, tidx); + size_t sizebits = size << leftshift_for_tree_index(tidx); + while (t != 0 && chunksize(t) != size) { + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + sizebits <<= 1; + } + if (t != 0) { + tchunkptr u = t; + do { + if (u == (tchunkptr)x) + return 1; + } while ((u = u->fd) != t); + } + } + } + return 0; +} + +/* Traverse each chunk and check it; return total */ +static size_t traverse_and_check(mstate m) { + size_t sum = 0; + if (is_initialized(m)) { + msegmentptr s = &m->seg; + sum += m->topsize + TOP_FOOT_SIZE; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + mchunkptr lastq = 0; + assert(pinuse(q)); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + sum += chunksize(q); + if (cinuse(q)) { + assert(!bin_find(m, q)); + do_check_inuse_chunk(m, q); + } + else { + assert(q == m->dv || bin_find(m, q)); + assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ + do_check_free_chunk(m, q); + } + lastq = q; + q = next_chunk(q); + } + s = s->next; + } + } + return sum; +} + +/* Check all properties of malloc_state. */ +static void do_check_malloc_state(mstate m) { + bindex_t i; + size_t total; + /* check bins */ + for (i = 0; i < NSMALLBINS; ++i) + do_check_smallbin(m, i); + for (i = 0; i < NTREEBINS; ++i) + do_check_treebin(m, i); + + if (m->dvsize != 0) { /* check dv chunk */ + do_check_any_chunk(m, m->dv); + assert(m->dvsize == chunksize(m->dv)); + assert(m->dvsize >= MIN_CHUNK_SIZE); + assert(bin_find(m, m->dv) == 0); + } + + if (m->top != 0) { /* check top chunk */ + do_check_top_chunk(m, m->top); + assert(m->topsize == chunksize(m->top)); + assert(m->topsize > 0); + assert(bin_find(m, m->top) == 0); + } + + total = traverse_and_check(m); + assert(total <= m->footprint); + assert(m->footprint <= m->max_footprint); +} +#endif /* DEBUG */ + +/* ----------------------------- statistics ------------------------------ */ + +#if !NO_MALLINFO +static struct mallinfo internal_mallinfo(mstate m) { + struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + if (!PREACTION(m)) { + check_malloc_state(m); + if (is_initialized(m)) { + size_t nfree = SIZE_T_ONE; /* top always free */ + size_t mfree = m->topsize + TOP_FOOT_SIZE; + size_t sum = mfree; + msegmentptr s = &m->seg; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + size_t sz = chunksize(q); + sum += sz; + if (!cinuse(q)) { + mfree += sz; + ++nfree; + } + q = next_chunk(q); + } + s = s->next; + } + + nm.arena = sum; + nm.ordblks = nfree; + nm.hblkhd = m->footprint - sum; + nm.usmblks = m->max_footprint; + nm.uordblks = m->footprint - mfree; + nm.fordblks = mfree; + nm.keepcost = m->topsize; + } + + POSTACTION(m); + } + return nm; +} +#endif /* !NO_MALLINFO */ + +static void internal_malloc_stats(mstate m) { + if (!PREACTION(m)) { + size_t maxfp = 0; + size_t fp = 0; + size_t used = 0; + check_malloc_state(m); + if (is_initialized(m)) { + msegmentptr s = &m->seg; + maxfp = m->max_footprint; + fp = m->footprint; + used = fp - (m->topsize + TOP_FOOT_SIZE); + + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + if (!cinuse(q)) + used -= chunksize(q); + q = next_chunk(q); + } + s = s->next; + } + } + + fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); + fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); + fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); + + POSTACTION(m); + } +} + +/* ----------------------- Operations on smallbins ----------------------- */ + +/* + Various forms of linking and unlinking are defined as macros. Even + the ones for trees, which are very long but have very short typical + paths. This is ugly but reduces reliance on inlining support of + compilers. +*/ + +/* Link a free chunk into a smallbin */ +#define insert_small_chunk(M, P, S) {\ + bindex_t I = small_index(S);\ + mchunkptr B = smallbin_at(M, I);\ + mchunkptr F = B;\ + assert(S >= MIN_CHUNK_SIZE);\ + if (!smallmap_is_marked(M, I))\ + mark_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, B->fd)))\ + F = B->fd;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + B->fd = P;\ + F->bk = P;\ + P->fd = F;\ + P->bk = B;\ +} + +/* Unlink a chunk from a smallbin */ +#define unlink_small_chunk(M, P, S) {\ + mchunkptr F = P->fd;\ + mchunkptr B = P->bk;\ + bindex_t I = small_index(S);\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (F == B)\ + clear_smallmap(M, I);\ + else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ + (B == smallbin_at(M,I) || ok_address(M, B)))) {\ + F->bk = B;\ + B->fd = F;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ +} + +/* Unlink the first chunk from a smallbin */ +#define unlink_first_small_chunk(M, B, P, I) {\ + mchunkptr F = P->fd;\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (B == F)\ + clear_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, F))) {\ + B->fd = F;\ + F->bk = B;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ +} + +/* Replace dv node, binning the old one */ +/* Used only when dvsize known to be small */ +#define replace_dv(M, P, S) {\ + size_t DVS = M->dvsize;\ + if (DVS != 0) {\ + mchunkptr DV = M->dv;\ + assert(is_small(DVS));\ + insert_small_chunk(M, DV, DVS);\ + }\ + M->dvsize = S;\ + M->dv = P;\ +} + +/* ------------------------- Operations on trees ------------------------- */ + +/* Insert chunk into tree */ +#define insert_large_chunk(M, X, S) {\ + tbinptr* H;\ + bindex_t I;\ + compute_tree_index(S, I);\ + H = treebin_at(M, I);\ + X->index = I;\ + X->child[0] = X->child[1] = 0;\ + if (!treemap_is_marked(M, I)) {\ + mark_treemap(M, I);\ + *H = X;\ + X->parent = (tchunkptr)H;\ + X->fd = X->bk = X;\ + }\ + else {\ + tchunkptr T = *H;\ + size_t K = S << leftshift_for_tree_index(I);\ + for (;;) {\ + if (chunksize(T) != S) {\ + tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ + K <<= 1;\ + if (*C != 0)\ + T = *C;\ + else if (RTCHECK(ok_address(M, C))) {\ + *C = X;\ + X->parent = T;\ + X->fd = X->bk = X;\ + break;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ + }\ + }\ + else {\ + tchunkptr F = T->fd;\ + if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ + T->fd = F->bk = X;\ + X->fd = F;\ + X->bk = T;\ + X->parent = 0;\ + break;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ + }\ + }\ + }\ + }\ +} + +/* + Unlink steps: + + 1. If x is a chained node, unlink it from its same-sized fd/bk links + and choose its bk node as its replacement. + 2. If x was the last node of its size, but not a leaf node, it must + be replaced with a leaf node (not merely one with an open left or + right), to make sure that lefts and rights of descendants + correspond properly to bit masks. We use the rightmost descendant + of x. We could use any other leaf, but this is easy to locate and + tends to counteract removal of leftmosts elsewhere, and so keeps + paths shorter than minimally guaranteed. This doesn't loop much + because on average a node in a tree is near the bottom. + 3. If x is the base of a chain (i.e., has parent links) relink + x's parent and children to x's replacement (or null if none). +*/ + +#define unlink_large_chunk(M, X) {\ + tchunkptr XP = X->parent;\ + tchunkptr R;\ + if (X->bk != X) {\ + tchunkptr F = X->fd;\ + R = X->bk;\ + if (RTCHECK(ok_address(M, F))) {\ + F->bk = R;\ + R->fd = F;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + else {\ + tchunkptr* RP;\ + if (((R = *(RP = &(X->child[1]))) != 0) ||\ + ((R = *(RP = &(X->child[0]))) != 0)) {\ + tchunkptr* CP;\ + while ((*(CP = &(R->child[1])) != 0) ||\ + (*(CP = &(R->child[0])) != 0)) {\ + R = *(RP = CP);\ + }\ + if (RTCHECK(ok_address(M, RP)))\ + *RP = 0;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + }\ + if (XP != 0) {\ + tbinptr* H = treebin_at(M, X->index);\ + if (X == *H) {\ + if ((*H = R) == 0) \ + clear_treemap(M, X->index);\ + }\ + else if (RTCHECK(ok_address(M, XP))) {\ + if (XP->child[0] == X) \ + XP->child[0] = R;\ + else \ + XP->child[1] = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + if (R != 0) {\ + if (RTCHECK(ok_address(M, R))) {\ + tchunkptr C0, C1;\ + R->parent = XP;\ + if ((C0 = X->child[0]) != 0) {\ + if (RTCHECK(ok_address(M, C0))) {\ + R->child[0] = C0;\ + C0->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + if ((C1 = X->child[1]) != 0) {\ + if (RTCHECK(ok_address(M, C1))) {\ + R->child[1] = C1;\ + C1->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ +} + +/* Relays to large vs small bin operations */ + +#define insert_chunk(M, P, S)\ + if (is_small(S)) insert_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } + +#define unlink_chunk(M, P, S)\ + if (is_small(S)) unlink_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } + + +/* Relays to internal calls to malloc/free from realloc, memalign etc */ + +#if ONLY_MSPACES +#define internal_malloc(m, b) mspace_malloc(m, b) +#define internal_free(m, mem) mspace_free(m,mem); +#else /* ONLY_MSPACES */ +#if MSPACES +#define internal_malloc(m, b)\ + (m == gm)? dlmalloc(b) : mspace_malloc(m, b) +#define internal_free(m, mem)\ + if (m == gm) dlfree(mem); else mspace_free(m,mem); +#else /* MSPACES */ +#define internal_malloc(m, b) dlmalloc(b) +#define internal_free(m, mem) dlfree(mem) +#endif /* MSPACES */ +#endif /* ONLY_MSPACES */ + +/* ----------------------- Direct-mmapping chunks ----------------------- */ + +/* + Directly mmapped chunks are set up with an offset to the start of + the mmapped region stored in the prev_foot field of the chunk. This + allows reconstruction of the required argument to MUNMAP when freed, + and also allows adjustment of the returned chunk to meet alignment + requirements (especially in memalign). There is also enough space + allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain + the PINUSE bit so frees can be checked. +*/ + +/* Malloc using mmap */ +static void* mmap_alloc(mstate m, size_t nb) { + size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + if (mmsize > nb) { /* Check for wrap around 0 */ + char* mm = (char*)(DIRECT_MMAP(mmsize)); + if (mm != CMFAIL) { + size_t offset = align_offset(chunk2mem(mm)); + size_t psize = mmsize - offset - MMAP_FOOT_PAD; + mchunkptr p = (mchunkptr)(mm + offset); + p->prev_foot = offset | IS_MMAPPED_BIT; + (p)->head = (psize|CINUSE_BIT); + mark_inuse_foot(m, p, psize); + chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; + + if (mm < m->least_addr) + m->least_addr = mm; + if ((m->footprint += mmsize) > m->max_footprint) + m->max_footprint = m->footprint; + assert(is_aligned(chunk2mem(p))); + check_mmapped_chunk(m, p); + return chunk2mem(p); + } + } + return 0; +} + +/* Realloc using mmap */ +static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { + size_t oldsize = chunksize(oldp); + if (is_small(nb)) /* Can't shrink mmap regions below small size */ + return 0; + /* Keep old chunk if big enough but not too big */ + if (oldsize >= nb + SIZE_T_SIZE && + (oldsize - nb) <= (mparams.granularity << 1)) + return oldp; + else { + size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; + size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; + size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + + CHUNK_ALIGN_MASK); + char* cp = (char*)CALL_MREMAP((char*)oldp - offset, + oldmmsize, newmmsize, 1); + if (cp != CMFAIL) { + mchunkptr newp = (mchunkptr)(cp + offset); + size_t psize = newmmsize - offset - MMAP_FOOT_PAD; + newp->head = (psize|CINUSE_BIT); + mark_inuse_foot(m, newp, psize); + chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; + + if (cp < m->least_addr) + m->least_addr = cp; + if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) + m->max_footprint = m->footprint; + check_mmapped_chunk(m, newp); + return newp; + } + } + return 0; +} + +/* -------------------------- mspace management -------------------------- */ + +/* Initialize top chunk and its size */ +static void init_top(mstate m, mchunkptr p, size_t psize) { + /* Ensure alignment */ + size_t offset = align_offset(chunk2mem(p)); + p = (mchunkptr)((char*)p + offset); + psize -= offset; + + m->top = p; + m->topsize = psize; + p->head = psize | PINUSE_BIT; + /* set size of fake trailing chunk holding overhead space only once */ + chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; + m->trim_check = mparams.trim_threshold; /* reset on each update */ +} + +/* Initialize bins for a new mstate that is otherwise zeroed out */ +static void init_bins(mstate m) { + /* Establish circular links for smallbins */ + bindex_t i; + for (i = 0; i < NSMALLBINS; ++i) { + sbinptr bin = smallbin_at(m,i); + bin->fd = bin->bk = bin; + } +} + +#if PROCEED_ON_ERROR + +/* default corruption action */ +static void reset_on_error(mstate m) { + int i; + ++malloc_corruption_error_count; + /* Reinitialize fields to forget about all memory */ + m->smallbins = m->treebins = 0; + m->dvsize = m->topsize = 0; + m->seg.base = 0; + m->seg.size = 0; + m->seg.next = 0; + m->top = m->dv = 0; + for (i = 0; i < NTREEBINS; ++i) + *treebin_at(m, i) = 0; + init_bins(m); +} +#endif /* PROCEED_ON_ERROR */ + +/* Allocate chunk and prepend remainder with chunk in successor base. */ +static void* prepend_alloc(mstate m, char* newbase, char* oldbase, + size_t nb) { + mchunkptr p = align_as_chunk(newbase); + mchunkptr oldfirst = align_as_chunk(oldbase); + size_t psize = (char*)oldfirst - (char*)p; + mchunkptr q = chunk_plus_offset(p, nb); + size_t qsize = psize - nb; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + + assert((char*)oldfirst > (char*)q); + assert(pinuse(oldfirst)); + assert(qsize >= MIN_CHUNK_SIZE); + + /* consolidate remainder with first chunk of old base */ + if (oldfirst == m->top) { + size_t tsize = m->topsize += qsize; + m->top = q; + q->head = tsize | PINUSE_BIT; + check_top_chunk(m, q); + } + else if (oldfirst == m->dv) { + size_t dsize = m->dvsize += qsize; + m->dv = q; + set_size_and_pinuse_of_free_chunk(q, dsize); + } + else { + if (!cinuse(oldfirst)) { + size_t nsize = chunksize(oldfirst); + unlink_chunk(m, oldfirst, nsize); + oldfirst = chunk_plus_offset(oldfirst, nsize); + qsize += nsize; + } + set_free_with_pinuse(q, qsize, oldfirst); + insert_chunk(m, q, qsize); + check_free_chunk(m, q); + } + + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); +} + + +/* Add a segment to hold a new noncontiguous region */ +static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { + /* Determine locations and sizes of segment, fenceposts, old top */ + char* old_top = (char*)m->top; + msegmentptr oldsp = segment_holding(m, old_top); + char* old_end = oldsp->base + oldsp->size; + size_t ssize = pad_request(sizeof(struct malloc_segment)); + char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + size_t offset = align_offset(chunk2mem(rawsp)); + char* asp = rawsp + offset; + char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; + mchunkptr sp = (mchunkptr)csp; + msegmentptr ss = (msegmentptr)(chunk2mem(sp)); + mchunkptr tnext = chunk_plus_offset(sp, ssize); + mchunkptr p = tnext; + int nfences = 0; + + /* reset top to new space */ + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + + /* Set up segment record */ + assert(is_aligned(ss)); + set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); + *ss = m->seg; /* Push current record */ + m->seg.base = tbase; + m->seg.size = tsize; + (void)set_segment_flags(&m->seg, mmapped); + m->seg.next = ss; + + /* Insert trailing fenceposts */ + for (;;) { + mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); + p->head = FENCEPOST_HEAD; + ++nfences; + if ((char*)(&(nextp->head)) < old_end) + p = nextp; + else + break; + } + assert(nfences >= 2); + + /* Insert the rest of old top into a bin as an ordinary free chunk */ + if (csp != old_top) { + mchunkptr q = (mchunkptr)old_top; + size_t psize = csp - old_top; + mchunkptr tn = chunk_plus_offset(q, psize); + set_free_with_pinuse(q, psize, tn); + insert_chunk(m, q, psize); + } + + check_top_chunk(m, m->top); +} + +/* -------------------------- System allocation -------------------------- */ + +/* Get memory from system using MORECORE or MMAP */ +static void* sys_alloc(mstate m, size_t nb) { + char* tbase = CMFAIL; + size_t tsize = 0; + flag_t mmap_flag = 0; + + init_mparams(); + + /* Directly map large chunks */ + if (use_mmap(m) && nb >= mparams.mmap_threshold) { + void* mem = mmap_alloc(m, nb); + if (mem != 0) + return mem; + } + + /* + Try getting memory in any of three ways (in most-preferred to + least-preferred order): + 1. A call to MORECORE that can normally contiguously extend memory. + (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or + or main space is mmapped or a previous contiguous call failed) + 2. A call to MMAP new space (disabled if not HAVE_MMAP). + Note that under the default settings, if MORECORE is unable to + fulfill a request, and HAVE_MMAP is true, then mmap is + used as a noncontiguous system allocator. This is a useful backup + strategy for systems with holes in address spaces -- in this case + sbrk cannot contiguously expand the heap, but mmap may be able to + find space. + 3. A call to MORECORE that cannot usually contiguously extend memory. + (disabled if not HAVE_MORECORE) + */ + + if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { + char* br = CMFAIL; + msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); + size_t asize = 0; + ACQUIRE_MORECORE_LOCK(); + + if (ss == 0) { /* First time through or recovery */ + char* base = (char*)CALL_MORECORE(0); + if (base != CMFAIL) { + asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); + /* Adjust to end on a page boundary */ + if (!is_page_aligned(base)) + asize += (page_align((size_t)base) - (size_t)base); + /* Can't call MORECORE if size is negative when treated as signed */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == base) { + tbase = base; + tsize = asize; + } + } + } + else { + /* Subtract out existing available top space from MORECORE request. */ + asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); + /* Use mem here only if it did continuously extend old space */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { + tbase = br; + tsize = asize; + } + } + + if (tbase == CMFAIL) { /* Cope with partial failure */ + if (br != CMFAIL) { /* Try to use/extend the space we did get */ + if (asize < HALF_MAX_SIZE_T && + asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { + size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); + if (esize < HALF_MAX_SIZE_T) { + char* end = (char*)CALL_MORECORE(esize); + if (end != CMFAIL) + asize += esize; + else { /* Can't use; try to release */ + (void)CALL_MORECORE(-asize); + br = CMFAIL; + } + } + } + } + if (br != CMFAIL) { /* Use the space we did get */ + tbase = br; + tsize = asize; + } + else + disable_contiguous(m); /* Don't try contiguous path in the future */ + } + + RELEASE_MORECORE_LOCK(); + } + + if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ + size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; + size_t rsize = granularity_align(req); + if (rsize > nb) { /* Fail if wraps around zero */ + char* mp = (char*)(CALL_MMAP(rsize)); + if (mp != CMFAIL) { + tbase = mp; + tsize = rsize; + mmap_flag = IS_MMAPPED_BIT; + } + } + } + + if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ + size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); + if (asize < HALF_MAX_SIZE_T) { + char* br = CMFAIL; + char* end = CMFAIL; + ACQUIRE_MORECORE_LOCK(); + br = (char*)(CALL_MORECORE(asize)); + end = (char*)(CALL_MORECORE(0)); + RELEASE_MORECORE_LOCK(); + if (br != CMFAIL && end != CMFAIL && br < end) { + size_t ssize = end - br; + if (ssize > nb + TOP_FOOT_SIZE) { + tbase = br; + tsize = ssize; + } + } + } + } + + if (tbase != CMFAIL) { + + if ((m->footprint += tsize) > m->max_footprint) + m->max_footprint = m->footprint; + + if (!is_initialized(m)) { /* first-time initialization */ + m->seg.base = m->least_addr = tbase; + m->seg.size = tsize; + (void)set_segment_flags(&m->seg, mmap_flag); + m->magic = mparams.magic; + init_bins(m); + if (is_global(m)) + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + else { + /* Offset top by embedded malloc_state */ + mchunkptr mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); + } + } + + else { + /* Try to merge with an existing segment */ + msegmentptr sp = &m->seg; + while (sp != 0 && tbase != sp->base + sp->size) + sp = sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + check_segment_merge(sp, tbase, tsize) && + (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag && + segment_holds(sp, m->top)) { /* append */ + sp->size += tsize; + init_top(m, m->top, m->topsize + tsize); + } + else { + if (tbase < m->least_addr) + m->least_addr = tbase; + sp = &m->seg; + while (sp != 0 && sp->base != tbase + tsize) + sp = sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + check_segment_merge(sp, tbase, tsize) && + (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag) { + char* oldbase = sp->base; + sp->base = tbase; + sp->size += tsize; + return prepend_alloc(m, tbase, oldbase, nb); + } + else + add_segment(m, tbase, tsize, mmap_flag); + } + } + + if (nb < m->topsize) { /* Allocate from new or extended top space */ + size_t rsize = m->topsize -= nb; + mchunkptr p = m->top; + mchunkptr r = m->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + check_top_chunk(m, m->top); + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); + } + } + + MALLOC_FAILURE_ACTION; + return 0; +} + +/* ----------------------- system deallocation -------------------------- */ + +/* Unmap and unlink any mmapped segments that don't contain used chunks */ +static size_t release_unused_segments(mstate m) { + size_t released = 0; + msegmentptr pred = &m->seg; + msegmentptr sp = pred->next; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + msegmentptr next = sp->next; + if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { + mchunkptr p = align_as_chunk(base); + size_t psize = chunksize(p); + /* Can unmap if first chunk holds entire segment and not pinned */ + if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { + tchunkptr tp = (tchunkptr)p; + assert(segment_holds(sp, (char*)sp)); + if (p == m->dv) { + m->dv = 0; + m->dvsize = 0; + } + else { + unlink_large_chunk(m, tp); + } + if (CALL_MUNMAP(base, size) == 0) { + released += size; + m->footprint -= size; + /* unlink obsoleted record */ + sp = pred; + sp->next = next; + } + else { /* back out if cannot unmap */ + insert_large_chunk(m, tp, psize); + } + } + } + pred = sp; + sp = next; + } + return released; +} + +static int sys_trim(mstate m, size_t pad) { + size_t released = 0; + if (pad < MAX_REQUEST && is_initialized(m)) { + pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ + + if (m->topsize > pad) { + /* Shrink top space in granularity-size units, keeping at least one */ + size_t unit = mparams.granularity; + size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - + SIZE_T_ONE) * unit; + msegmentptr sp = segment_holding(m, (char*)m->top); + + if (!is_extern_segment(sp)) { + if (is_mmapped_segment(sp)) { + if (HAVE_MMAP && + sp->size >= extra && + !has_segment_link(m, sp)) { /* can't shrink if pinned */ + size_t newsize = sp->size - extra; + /* Prefer mremap, fall back to munmap */ + if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || + (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { + released = extra; + } + } + } + else if (HAVE_MORECORE) { + if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ + extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; + ACQUIRE_MORECORE_LOCK(); + { + /* Make sure end of memory is where we last set it. */ + char* old_br = (char*)(CALL_MORECORE(0)); + if (old_br == sp->base + sp->size) { + char* rel_br = (char*)(CALL_MORECORE(-extra)); + char* new_br = (char*)(CALL_MORECORE(0)); + if (rel_br != CMFAIL && new_br < old_br) + released = old_br - new_br; + } + } + RELEASE_MORECORE_LOCK(); + } + } + + if (released != 0) { + sp->size -= released; + m->footprint -= released; + init_top(m, m->top, m->topsize - released); + check_top_chunk(m, m->top); + } + } + + /* Unmap any unused mmapped segments */ + if (HAVE_MMAP) + released += release_unused_segments(m); + + /* On failure, disable autotrim to avoid repeated failed future calls */ + if (released == 0) + m->trim_check = MAX_SIZE_T; + } + + return (released != 0)? 1 : 0; +} + +/* ---------------------------- malloc support --------------------------- */ + +/* allocate a large request from the best fitting chunk in a treebin */ +static void* tmalloc_large(mstate m, size_t nb) { + tchunkptr v = 0; + size_t rsize = -nb; /* Unsigned negation */ + tchunkptr t; + bindex_t idx; + compute_tree_index(nb, idx); + + if ((t = *treebin_at(m, idx)) != 0) { + /* Traverse tree for this bin looking for node with size == nb */ + size_t sizebits = nb << leftshift_for_tree_index(idx); + tchunkptr rst = 0; /* The deepest untaken right subtree */ + for (;;) { + tchunkptr rt; + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + v = t; + if ((rsize = trem) == 0) + break; + } + rt = t->child[1]; + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + if (rt != 0 && rt != t) + rst = rt; + if (t == 0) { + t = rst; /* set t to least subtree holding sizes > nb */ + break; + } + sizebits <<= 1; + } + } + + if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ + binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; + if (leftbits != 0) { + bindex_t i; + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + t = *treebin_at(m, i); + } + } + + while (t != 0) { /* find smallest of tree or subtree */ + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + t = leftmost_child(t); + } + + /* If dv is a better fit, return 0 so malloc will use it */ + if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { + if (RTCHECK(ok_address(m, v))) { /* split */ + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + insert_chunk(m, r, rsize); + } + return chunk2mem(v); + } + } + CORRUPTION_ERROR_ACTION(m); + } + return 0; +} + +/* allocate a small request from the best fitting chunk in a treebin */ +static void* tmalloc_small(mstate m, size_t nb) { + tchunkptr t, v; + size_t rsize; + bindex_t i; + binmap_t leastbit = least_bit(m->treemap); + compute_bit2idx(leastbit, i); + + v = t = *treebin_at(m, i); + rsize = chunksize(t) - nb; + + while ((t = leftmost_child(t)) != 0) { + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + } + + if (RTCHECK(ok_address(m, v))) { + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(m, r, rsize); + } + return chunk2mem(v); + } + } + + CORRUPTION_ERROR_ACTION(m); + return 0; +} + +/* --------------------------- realloc support --------------------------- */ + +static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { + if (bytes >= MAX_REQUEST) { + MALLOC_FAILURE_ACTION; + return 0; + } + if (!PREACTION(m)) { + mchunkptr oldp = mem2chunk(oldmem); + size_t oldsize = chunksize(oldp); + mchunkptr next = chunk_plus_offset(oldp, oldsize); + mchunkptr newp = 0; + void* extra = 0; + + /* Try to either shrink or extend into top. Else malloc-copy-free */ + + if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && + ok_next(oldp, next) && ok_pinuse(next))) { + size_t nb = request2size(bytes); + if (is_mmapped(oldp)) + newp = mmap_resize(m, oldp, nb); + else if (oldsize >= nb) { /* already big enough */ + size_t rsize = oldsize - nb; + newp = oldp; + if (rsize >= MIN_CHUNK_SIZE) { + mchunkptr remainder = chunk_plus_offset(newp, nb); + set_inuse(m, newp, nb); + set_inuse(m, remainder, rsize); + extra = chunk2mem(remainder); + } + } + else if (next == m->top && oldsize + m->topsize > nb) { + /* Expand into top */ + size_t newsize = oldsize + m->topsize; + size_t newtopsize = newsize - nb; + mchunkptr newtop = chunk_plus_offset(oldp, nb); + set_inuse(m, oldp, nb); + newtop->head = newtopsize |PINUSE_BIT; + m->top = newtop; + m->topsize = newtopsize; + newp = oldp; + } + } + else { + USAGE_ERROR_ACTION(m, oldmem); + POSTACTION(m); + return 0; + } + + POSTACTION(m); + + if (newp != 0) { + if (extra != 0) { + internal_free(m, extra); + } + check_inuse_chunk(m, newp); + return chunk2mem(newp); + } + else { + void* newmem = internal_malloc(m, bytes); + if (newmem != 0) { + size_t oc = oldsize - overhead_for(oldp); + memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); + internal_free(m, oldmem); + } + return newmem; + } + } + return 0; +} + +/* --------------------------- memalign support -------------------------- */ + +static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { + if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ + return internal_malloc(m, bytes); + if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ + alignment = MIN_CHUNK_SIZE; + if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ + size_t a = MALLOC_ALIGNMENT << 1; + while (a < alignment) a <<= 1; + alignment = a; + } + + if (bytes >= MAX_REQUEST - alignment) { + if (m != 0) { /* Test isn't needed but avoids compiler warning */ + MALLOC_FAILURE_ACTION; + } + } + else { + size_t nb = request2size(bytes); + size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; + char* mem = (char*)internal_malloc(m, req); + if (mem != 0) { + void* leader = 0; + void* trailer = 0; + mchunkptr p = mem2chunk(mem); + + if (PREACTION(m)) return 0; + if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ + /* + Find an aligned spot inside chunk. Since we need to give + back leading space in a chunk of at least MIN_CHUNK_SIZE, if + the first calculation places us at a spot with less than + MIN_CHUNK_SIZE leader, we can move to the next aligned spot. + We've allocated enough total room so that this is always + possible. + */ + char* br = (char*)mem2chunk((size_t)(((size_t)(mem + + alignment - + SIZE_T_ONE)) & + -alignment)); + char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? + br : br+alignment; + mchunkptr newp = (mchunkptr)pos; + size_t leadsize = pos - (char*)(p); + size_t newsize = chunksize(p) - leadsize; + + if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ + newp->prev_foot = p->prev_foot + leadsize; + newp->head = (newsize|CINUSE_BIT); + } + else { /* Otherwise, give back leader, use the rest */ + set_inuse(m, newp, newsize); + set_inuse(m, p, leadsize); + leader = chunk2mem(p); + } + p = newp; + } + + /* Give back spare room at the end */ + if (!is_mmapped(p)) { + size_t size = chunksize(p); + if (size > nb + MIN_CHUNK_SIZE) { + size_t remainder_size = size - nb; + mchunkptr remainder = chunk_plus_offset(p, nb); + set_inuse(m, p, nb); + set_inuse(m, remainder, remainder_size); + trailer = chunk2mem(remainder); + } + } + + assert (chunksize(p) >= nb); + assert((((size_t)(chunk2mem(p))) % alignment) == 0); + check_inuse_chunk(m, p); + POSTACTION(m); + if (leader != 0) { + internal_free(m, leader); + } + if (trailer != 0) { + internal_free(m, trailer); + } + return chunk2mem(p); + } + } + return 0; +} + +/* ------------------------ comalloc/coalloc support --------------------- */ + +static void** ialloc(mstate m, + size_t n_elements, + size_t* sizes, + int opts, + void* chunks[]) { + /* + This provides common support for independent_X routines, handling + all of the combinations that can result. + + The opts arg has: + bit 0 set if all elements are same size (using sizes[0]) + bit 1 set if elements should be zeroed + */ + + size_t element_size; /* chunksize of each element, if all same */ + size_t contents_size; /* total size of elements */ + size_t array_size; /* request size of pointer array */ + void* mem; /* malloced aggregate space */ + mchunkptr p; /* corresponding chunk */ + size_t remainder_size; /* remaining bytes while splitting */ + void** marray; /* either "chunks" or malloced ptr array */ + mchunkptr array_chunk; /* chunk for malloced ptr array */ + flag_t was_enabled; /* to disable mmap */ + size_t size; + size_t i; + + /* compute array length, if needed */ + if (chunks != 0) { + if (n_elements == 0) + return chunks; /* nothing to do */ + marray = chunks; + array_size = 0; + } + else { + /* if empty req, must still return chunk representing empty array */ + if (n_elements == 0) + return (void**)internal_malloc(m, 0); + marray = 0; + array_size = request2size(n_elements * (sizeof(void*))); + } + + /* compute total element size */ + if (opts & 0x1) { /* all-same-size */ + element_size = request2size(*sizes); + contents_size = n_elements * element_size; + } + else { /* add up all the sizes */ + element_size = 0; + contents_size = 0; + for (i = 0; i != n_elements; ++i) + contents_size += request2size(sizes[i]); + } + + size = contents_size + array_size; + + /* + Allocate the aggregate chunk. First disable direct-mmapping so + malloc won't use it, since we would not be able to later + free/realloc space internal to a segregated mmap region. + */ + was_enabled = use_mmap(m); + disable_mmap(m); + mem = internal_malloc(m, size - CHUNK_OVERHEAD); + if (was_enabled) + enable_mmap(m); + if (mem == 0) + return 0; + + if (PREACTION(m)) return 0; + p = mem2chunk(mem); + remainder_size = chunksize(p); + + assert(!is_mmapped(p)); + + if (opts & 0x2) { /* optionally clear the elements */ + memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); + } + + /* If not provided, allocate the pointer array as final part of chunk */ + if (marray == 0) { + size_t array_chunk_size; + array_chunk = chunk_plus_offset(p, contents_size); + array_chunk_size = remainder_size - contents_size; + marray = (void**) (chunk2mem(array_chunk)); + set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); + remainder_size = contents_size; + } + + /* split out elements */ + for (i = 0; ; ++i) { + marray[i] = chunk2mem(p); + if (i != n_elements-1) { + if (element_size != 0) + size = element_size; + else + size = request2size(sizes[i]); + remainder_size -= size; + set_size_and_pinuse_of_inuse_chunk(m, p, size); + p = chunk_plus_offset(p, size); + } + else { /* the final element absorbs any overallocation slop */ + set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); + break; + } + } + +#if DEBUG + if (marray != chunks) { + /* final element must have exactly exhausted chunk */ + if (element_size != 0) { + assert(remainder_size == element_size); + } + else { + assert(remainder_size == request2size(sizes[i])); + } + check_inuse_chunk(m, mem2chunk(marray)); + } + for (i = 0; i != n_elements; ++i) + check_inuse_chunk(m, mem2chunk(marray[i])); + +#endif /* DEBUG */ + + POSTACTION(m); + return marray; +} + + +/* -------------------------- public routines ---------------------------- */ + +#if !ONLY_MSPACES + +void* dlmalloc(size_t bytes) { + /* + Basic algorithm: + If a small request (< 256 bytes minus per-chunk overhead): + 1. If one exists, use a remainderless chunk in associated smallbin. + (Remainderless means that there are too few excess bytes to + represent as a chunk.) + 2. If it is big enough, use the dv chunk, which is normally the + chunk adjacent to the one used for the most recent small request. + 3. If one exists, split the smallest available chunk in a bin, + saving remainder in dv. + 4. If it is big enough, use the top chunk. + 5. If available, get memory from system and use it + Otherwise, for a large request: + 1. Find the smallest available binned chunk that fits, and use it + if it is better fitting than dv chunk, splitting if necessary. + 2. If better fitting than any binned chunk, use the dv chunk. + 3. If it is big enough, use the top chunk. + 4. If request size >= mmap threshold, try to directly mmap this chunk. + 5. If available, get memory from system and use it + + The ugly goto's here ensure that postaction occurs along all paths. + */ + + if (!PREACTION(gm)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = gm->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(gm, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(gm, b, p, idx); + set_inuse_and_pinuse(gm, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb > gm->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(gm, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(gm, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(gm, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(gm, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + + if (nb <= gm->dvsize) { + size_t rsize = gm->dvsize - nb; + mchunkptr p = gm->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = gm->dv = chunk_plus_offset(p, nb); + gm->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + } + else { /* exhaust dv */ + size_t dvs = gm->dvsize; + gm->dvsize = 0; + gm->dv = 0; + set_inuse_and_pinuse(gm, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb < gm->topsize) { /* Split top */ + size_t rsize = gm->topsize -= nb; + mchunkptr p = gm->top; + mchunkptr r = gm->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + mem = chunk2mem(p); + check_top_chunk(gm, gm->top); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + mem = sys_alloc(gm, nb); + + postaction: + POSTACTION(gm); + return mem; + } + + return 0; +} + +void dlfree(void* mem) { + /* + Consolidate freed chunks with preceding or succeeding bordering + free chunks, if they exist, and then place in a bin. Intermixed + with special cases for top, dv, mmapped chunks, and usage errors. + */ + + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } +#else /* FOOTERS */ +#define fm gm +#endif /* FOOTERS */ + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if ((prevsize & IS_MMAPPED_BIT) != 0) { + prevsize &= ~IS_MMAPPED_BIT; + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + insert_chunk(fm, p, psize); + check_free_chunk(fm, p); + goto postaction; + } + } + erroraction: + USAGE_ERROR_ACTION(fm, p); + postaction: + POSTACTION(fm); + } + } +#if !FOOTERS +#undef fm +#endif /* FOOTERS */ +} + +void* dlcalloc(size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = dlmalloc(req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* dlrealloc(void* oldmem, size_t bytes) { + if (oldmem == 0) + return dlmalloc(bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + dlfree(oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if ! FOOTERS + mstate m = gm; +#else /* FOOTERS */ + mstate m = get_mstate_for(mem2chunk(oldmem)); + if (!ok_magic(m)) { + USAGE_ERROR_ACTION(m, oldmem); + return 0; + } +#endif /* FOOTERS */ + return internal_realloc(m, oldmem, bytes); + } +} + +void* dlmemalign(size_t alignment, size_t bytes) { + return internal_memalign(gm, alignment, bytes); +} + +void** dlindependent_calloc(size_t n_elements, size_t elem_size, + void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + return ialloc(gm, n_elements, &sz, 3, chunks); +} + +void** dlindependent_comalloc(size_t n_elements, size_t sizes[], + void* chunks[]) { + return ialloc(gm, n_elements, sizes, 0, chunks); +} + +void* dlvalloc(size_t bytes) { + size_t pagesz; + init_mparams(); + pagesz = mparams.page_size; + return dlmemalign(pagesz, bytes); +} + +void* dlpvalloc(size_t bytes) { + size_t pagesz; + init_mparams(); + pagesz = mparams.page_size; + return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); +} + +int dlmalloc_trim(size_t pad) { + int result = 0; + if (!PREACTION(gm)) { + result = sys_trim(gm, pad); + POSTACTION(gm); + } + return result; +} + +size_t dlmalloc_footprint(void) { + return gm->footprint; +} + +size_t dlmalloc_max_footprint(void) { + return gm->max_footprint; +} + +#if !NO_MALLINFO +struct mallinfo dlmallinfo(void) { + return internal_mallinfo(gm); +} +#endif /* NO_MALLINFO */ + +void dlmalloc_stats() { + internal_malloc_stats(gm); +} + +size_t dlmalloc_usable_size(void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + if (cinuse(p)) + return chunksize(p) - overhead_for(p); + } + return 0; +} + +int dlmallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* !ONLY_MSPACES */ + +/* ----------------------------- user mspaces ---------------------------- */ + +#if MSPACES + +static mstate init_user_mstate(char* tbase, size_t tsize) { + size_t msize = pad_request(sizeof(struct malloc_state)); + mchunkptr mn; + mchunkptr msp = align_as_chunk(tbase); + mstate m = (mstate)(chunk2mem(msp)); + memset(m, 0, msize); + INITIAL_LOCK(&m->mutex); + msp->head = (msize|PINUSE_BIT|CINUSE_BIT); + m->seg.base = m->least_addr = tbase; + m->seg.size = m->footprint = m->max_footprint = tsize; + m->magic = mparams.magic; + m->mflags = mparams.default_mflags; + disable_contiguous(m); + init_bins(m); + mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); + check_top_chunk(m, m->top); + return m; +} + +mspace create_mspace(size_t capacity, int locked) { + mstate m = 0; + size_t msize = pad_request(sizeof(struct malloc_state)); + init_mparams(); /* Ensure pagesize etc initialized */ + + if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + size_t rs = ((capacity == 0)? mparams.granularity : + (capacity + TOP_FOOT_SIZE + msize)); + size_t tsize = granularity_align(rs); + char* tbase = (char*)(CALL_MMAP(tsize)); + if (tbase != CMFAIL) { + m = init_user_mstate(tbase, tsize); + set_segment_flags(&m->seg, IS_MMAPPED_BIT); + set_lock(m, locked); + } + } + return (mspace)m; +} + +mspace create_mspace_with_base(void* base, size_t capacity, int locked) { + mstate m = 0; + size_t msize = pad_request(sizeof(struct malloc_state)); + init_mparams(); /* Ensure pagesize etc initialized */ + + if (capacity > msize + TOP_FOOT_SIZE && + capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + m = init_user_mstate((char*)base, capacity); + set_segment_flags(&m->seg, EXTERN_BIT); + set_lock(m, locked); + } + return (mspace)m; +} + +size_t destroy_mspace(mspace msp) { + size_t freed = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + msegmentptr sp = &ms->seg; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + flag_t flag = get_segment_flags(sp); + sp = sp->next; + if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && + CALL_MUNMAP(base, size) == 0) + freed += size; + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return freed; +} + +/* + mspace versions of routines are near-clones of the global + versions. This is not so nice but better than the alternatives. +*/ + + +void* mspace_malloc(mspace msp, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (!PREACTION(ms)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = ms->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(ms, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(ms, b, p, idx); + set_inuse_and_pinuse(ms, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb > ms->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(ms, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(ms, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(ms, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(ms, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + + if (nb <= ms->dvsize) { + size_t rsize = ms->dvsize - nb; + mchunkptr p = ms->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = ms->dv = chunk_plus_offset(p, nb); + ms->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + } + else { /* exhaust dv */ + size_t dvs = ms->dvsize; + ms->dvsize = 0; + ms->dv = 0; + set_inuse_and_pinuse(ms, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb < ms->topsize) { /* Split top */ + size_t rsize = ms->topsize -= nb; + mchunkptr p = ms->top; + mchunkptr r = ms->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + mem = chunk2mem(p); + check_top_chunk(ms, ms->top); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + mem = sys_alloc(ms, nb); + + postaction: + POSTACTION(ms); + return mem; + } + + return 0; +} + +void mspace_free(mspace msp, void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); +#else /* FOOTERS */ + mstate fm = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if ((prevsize & IS_MMAPPED_BIT) != 0) { + prevsize &= ~IS_MMAPPED_BIT; + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + insert_chunk(fm, p, psize); + check_free_chunk(fm, p); + goto postaction; + } + } + erroraction: + USAGE_ERROR_ACTION(fm, p); + postaction: + POSTACTION(fm); + } + } +} + +void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = internal_malloc(ms, req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { + if (oldmem == 0) + return mspace_malloc(msp, bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + mspace_free(msp, oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if FOOTERS + mchunkptr p = mem2chunk(oldmem); + mstate ms = get_mstate_for(p); +#else /* FOOTERS */ + mstate ms = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_realloc(ms, oldmem, bytes); + } +} + +void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_memalign(ms, alignment, bytes); +} + +void** mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, &sz, 3, chunks); +} + +void** mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, sizes, 0, chunks); +} + +int mspace_trim(mspace msp, size_t pad) { + int result = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + if (!PREACTION(ms)) { + result = sys_trim(ms, pad); + POSTACTION(ms); + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return result; +} + +void mspace_malloc_stats(mspace msp) { + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + internal_malloc_stats(ms); + } + else { + USAGE_ERROR_ACTION(ms,ms); + } +} + +size_t mspace_footprint(mspace msp) { + size_t result; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->footprint; + } + USAGE_ERROR_ACTION(ms,ms); + return result; +} + + +size_t mspace_max_footprint(mspace msp) { + size_t result; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->max_footprint; + } + USAGE_ERROR_ACTION(ms,ms); + return result; +} + + +#if !NO_MALLINFO +struct mallinfo mspace_mallinfo(mspace msp) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + } + return internal_mallinfo(ms); +} +#endif /* NO_MALLINFO */ + +int mspace_mallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* MSPACES */ + +/* -------------------- Alternative MORECORE functions ------------------- */ + +/* + Guidelines for creating a custom version of MORECORE: + + * For best performance, MORECORE should allocate in multiples of pagesize. + * MORECORE may allocate more memory than requested. (Or even less, + but this will usually result in a malloc failure.) + * MORECORE must not allocate memory when given argument zero, but + instead return one past the end address of memory from previous + nonzero call. + * For best performance, consecutive calls to MORECORE with positive + arguments should return increasing addresses, indicating that + space has been contiguously extended. + * Even though consecutive calls to MORECORE need not return contiguous + addresses, it must be OK for malloc'ed chunks to span multiple + regions in those cases where they do happen to be contiguous. + * MORECORE need not handle negative arguments -- it may instead + just return MFAIL when given negative arguments. + Negative arguments are always multiples of pagesize. MORECORE + must not misinterpret negative args as large positive unsigned + args. You can suppress all such calls from even occurring by defining + MORECORE_CANNOT_TRIM, + + As an example alternative MORECORE, here is a custom allocator + kindly contributed for pre-OSX macOS. It uses virtually but not + necessarily physically contiguous non-paged memory (locked in, + present and won't get swapped out). You can use it by uncommenting + this section, adding some #includes, and setting up the appropriate + defines above: + + #define MORECORE osMoreCore + + There is also a shutdown routine that should somehow be called for + cleanup upon program exit. + + #define MAX_POOL_ENTRIES 100 + #define MINIMUM_MORECORE_SIZE (64 * 1024U) + static int next_os_pool; + void *our_os_pools[MAX_POOL_ENTRIES]; + + void *osMoreCore(int size) + { + void *ptr = 0; + static void *sbrk_top = 0; + + if (size > 0) + { + if (size < MINIMUM_MORECORE_SIZE) + size = MINIMUM_MORECORE_SIZE; + if (CurrentExecutionLevel() == kTaskLevel) + ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); + if (ptr == 0) + { + return (void *) MFAIL; + } + // save ptrs so they can be freed during cleanup + our_os_pools[next_os_pool] = ptr; + next_os_pool++; + ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); + sbrk_top = (char *) ptr + size; + return ptr; + } + else if (size < 0) + { + // we don't currently support shrink behavior + return (void *) MFAIL; + } + else + { + return sbrk_top; + } + } + + // cleanup any allocated memory pools + // called as last thing before shutting down driver + + void osCleanupMem(void) + { + void **ptr; + + for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) + if (*ptr) + { + PoolDeallocate(*ptr); + *ptr = 0; + } + } + +*/ + + +/* ----------------------------------------------------------------------- +History: + V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) + * Add max_footprint functions + * Ensure all appropriate literals are size_t + * Fix conditional compilation problem for some #define settings + * Avoid concatenating segments with the one provided + in create_mspace_with_base + * Rename some variables to avoid compiler shadowing warnings + * Use explicit lock initialization. + * Better handling of sbrk interference. + * Simplify and fix segment insertion, trimming and mspace_destroy + * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x + * Thanks especially to Dennis Flanagan for help on these. + + V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) + * Fix memalign brace error. + + V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) + * Fix improper #endif nesting in C++ + * Add explicit casts needed for C++ + + V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) + * Use trees for large bins + * Support mspaces + * Use segments to unify sbrk-based and mmap-based system allocation, + removing need for emulation on most platforms without sbrk. + * Default safety checks + * Optional footer checks. Thanks to William Robertson for the idea. + * Internal code refactoring + * Incorporate suggestions and platform-specific changes. + Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, + Aaron Bachmann, Emery Berger, and others. + * Speed up non-fastbin processing enough to remove fastbins. + * Remove useless cfree() to avoid conflicts with other apps. + * Remove internal memcpy, memset. Compilers handle builtins better. + * Remove some options that no one ever used and rename others. + + V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) + * Fix malloc_state bitmap array misdeclaration + + V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) + * Allow tuning of FIRST_SORTED_BIN_SIZE + * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. + * Better detection and support for non-contiguousness of MORECORE. + Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger + * Bypass most of malloc if no frees. Thanks To Emery Berger. + * Fix freeing of old top non-contiguous chunk im sysmalloc. + * Raised default trim and map thresholds to 256K. + * Fix mmap-related #defines. Thanks to Lubos Lunak. + * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. + * Branch-free bin calculation + * Default trim and mmap thresholds now 256K. + + V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) + * Introduce independent_comalloc and independent_calloc. + Thanks to Michael Pachos for motivation and help. + * Make optional .h file available + * Allow > 2GB requests on 32bit systems. + * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>. + Thanks also to Andreas Mueller <a.mueller at paradatec.de>, + and Anonymous. + * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for + helping test this.) + * memalign: check alignment arg + * realloc: don't try to shift chunks backwards, since this + leads to more fragmentation in some programs and doesn't + seem to help in any others. + * Collect all cases in malloc requiring system memory into sysmalloc + * Use mmap as backup to sbrk + * Place all internal state in malloc_state + * Introduce fastbins (although similar to 2.5.1) + * Many minor tunings and cosmetic improvements + * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK + * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS + Thanks to Tony E. Bennett <tbennett@nvidia.com> and others. + * Include errno.h to support default failure action. + + V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) + * return null for negative arguments + * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com> + * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' + (e.g. WIN32 platforms) + * Cleanup header file inclusion for WIN32 platforms + * Cleanup code to avoid Microsoft Visual C++ compiler complaints + * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing + memory allocation routines + * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) + * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to + usage of 'assert' in non-WIN32 code + * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to + avoid infinite loop + * Always call 'fREe()' rather than 'free()' + + V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) + * Fixed ordering problem with boundary-stamping + + V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) + * Added pvalloc, as recommended by H.J. Liu + * Added 64bit pointer support mainly from Wolfram Gloger + * Added anonymously donated WIN32 sbrk emulation + * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen + * malloc_extend_top: fix mask error that caused wastage after + foreign sbrks + * Add linux mremap support code from HJ Liu + + V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) + * Integrated most documentation with the code. + * Add support for mmap, with help from + Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Use last_remainder in more cases. + * Pack bins using idea from colin@nyx10.cs.du.edu + * Use ordered bins instead of best-fit threshold + * Eliminate block-local decls to simplify tracing and debugging. + * Support another case of realloc via move into top + * Fix error occurring when initial sbrk_base not word-aligned. + * Rely on page size for units instead of SBRK_UNIT to + avoid surprises about sbrk alignment conventions. + * Add mallinfo, mallopt. Thanks to Raymond Nijssen + (raymond@es.ele.tue.nl) for the suggestion. + * Add `pad' argument to malloc_trim and top_pad mallopt parameter. + * More precautions for cases where other routines call sbrk, + courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Added macros etc., allowing use in linux libc from + H.J. Lu (hjl@gnu.ai.mit.edu) + * Inverted this history list + + V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) + * Re-tuned and fixed to behave more nicely with V2.6.0 changes. + * Removed all preallocation code since under current scheme + the work required to undo bad preallocations exceeds + the work saved in good cases for most test programs. + * No longer use return list or unconsolidated bins since + no scheme using them consistently outperforms those that don't + given above changes. + * Use best fit for very large chunks to prevent some worst-cases. + * Added some support for debugging + + V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) + * Removed footers when chunks are in use. Thanks to + Paul Wilson (wilson@cs.texas.edu) for the suggestion. + + V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) + * Added malloc_trim, with help from Wolfram Gloger + (wmglo@Dent.MED.Uni-Muenchen.DE). + + V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) + + V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) + * realloc: try to expand in both directions + * malloc: swap order of clean-bin strategy; + * realloc: only conditionally expand backwards + * Try not to scavenge used bins + * Use bin counts as a guide to preallocation + * Occasionally bin return list chunks in first scan + * Add a few optimizations from colin@nyx10.cs.du.edu + + V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) + * faster bin computation & slightly different binning + * merged all consolidations to one part of malloc proper + (eliminating old malloc_find_space & malloc_clean_bin) + * Scan 2 returns chunks (not just 1) + * Propagate failure in realloc if malloc returns 0 + * Add stuff to allow compilation on non-ANSI compilers + from kpv@research.att.com + + V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) + * removed potential for odd address access in prev_chunk + * removed dependency on getpagesize.h + * misc cosmetics and a bit more internal documentation + * anticosmetics: mangled names in macros to evade debugger strangeness + * tested on sparc, hp-700, dec-mips, rs6000 + with gcc & native cc (hp, dec only) allowing + Detlefs & Zorn comparison study (in SIGPLAN Notices.) + + Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) + * Based loosely on libg++-1.2X malloc. (It retains some of the overall + structure of old version, but most details differ.) + +*/ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/frv/eabi.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/frv/eabi.S new file mode 100644 index 000000000000..379ea4bb0a74 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/frv/eabi.S @@ -0,0 +1,128 @@ +/* ----------------------------------------------------------------------- + eabi.S - Copyright (c) 2004 Anthony Green + + FR-V Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + .globl ffi_prep_args_EABI + + .text + .p2align 4 + .globl ffi_call_EABI + .type ffi_call_EABI, @function + + # gr8 : ffi_prep_args + # gr9 : &ecif + # gr10: cif->bytes + # gr11: fig->flags + # gr12: ecif.rvalue + # gr13: fn + +ffi_call_EABI: + addi sp, #-80, sp + sti fp, @(sp, #24) + addi sp, #24, fp + movsg lr, gr5 + + /* Make room for the new arguments. */ + /* subi sp, fp, gr10 */ + + /* Store return address and incoming args on stack. */ + sti gr5, @(fp, #8) + sti gr8, @(fp, #-4) + sti gr9, @(fp, #-8) + sti gr10, @(fp, #-12) + sti gr11, @(fp, #-16) + sti gr12, @(fp, #-20) + sti gr13, @(fp, #-24) + + sub sp, gr10, sp + + /* Call ffi_prep_args. */ + ldi @(fp, #-4), gr4 + addi sp, #0, gr8 + ldi @(fp, #-8), gr9 +#ifdef __FRV_FDPIC__ + ldd @(gr4, gr0), gr14 + calll @(gr14, gr0) +#else + calll @(gr4, gr0) +#endif + + /* ffi_prep_args returns the new stack pointer. */ + mov gr8, gr4 + + ldi @(sp, #0), gr8 + ldi @(sp, #4), gr9 + ldi @(sp, #8), gr10 + ldi @(sp, #12), gr11 + ldi @(sp, #16), gr12 + ldi @(sp, #20), gr13 + + /* Always copy the return value pointer into the hidden + parameter register. This is only strictly necessary + when we're returning an aggregate type, but it doesn't + hurt to do this all the time, and it saves a branch. */ + ldi @(fp, #-20), gr3 + + /* Use the ffi_prep_args return value for the new sp. */ + mov gr4, sp + + /* Call the target function. */ + ldi @(fp, -24), gr4 +#ifdef __FRV_FDPIC__ + ldd @(gr4, gr0), gr14 + calll @(gr14, gr0) +#else + calll @(gr4, gr0) +#endif + + /* Store the result. */ + ldi @(fp, #-16), gr10 /* fig->flags */ + ldi @(fp, #-20), gr4 /* ecif.rvalue */ + + /* Is the return value stored in two registers? */ + cmpi gr10, #8, icc0 + bne icc0, 0, .L2 + /* Yes, save them. */ + sti gr8, @(gr4, #0) + sti gr9, @(gr4, #4) + bra .L3 +.L2: + /* Is the return value a structure? */ + cmpi gr10, #-1, icc0 + beq icc0, 0, .L3 + /* No, save a 4 byte return value. */ + sti gr8, @(gr4, #0) +.L3: + + /* Restore the stack, and return. */ + ldi @(fp, 8), gr5 + ld @(fp, gr0), fp + addi sp,#80,sp + jmpl @(gr5,gr0) + .size ffi_call_EABI, .-ffi_call_EABI + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/frv/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/frv/ffi.c new file mode 100644 index 000000000000..ed1c65a1a362 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/frv/ffi.c @@ -0,0 +1,292 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (C) 2004 Anthony Green + Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2008 Red Hat, Inc. + + FR-V Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void *ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + register int count = 0; + + p_argv = ecif->avalue; + argp = stack; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); + i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + + if ((*p_arg)->type == FFI_TYPE_STRUCT) + { + z = sizeof(void*); + *(void **) argp = *p_argv; + } + /* if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (count > 24) + { + // This is going on the stack. Turn it into a double. + *(double *) argp = (double) *(float*)(* p_argv); + z = sizeof(double); + } + else + *(void **) argp = *(void **)(* p_argv); + } */ + else if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof(int)) + { + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + count += z; + } + + return (stack + ((count > 24) ? 24 : FFI_ALIGN_DOWN(count, 8))); +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + if (cif->rtype->type == FFI_TYPE_STRUCT) + cif->flags = -1; + else + cif->flags = cif->rtype->size; + + cif->bytes = FFI_ALIGN (cif->bytes, 8); + + return FFI_OK; +} + +extern void ffi_call_EABI(void *(*)(char *, extended_cif *), + extended_cif *, + unsigned, unsigned, + unsigned *, + void (*fn)(void)); + +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_EABI: + ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + default: + FFI_ASSERT(0); + break; + } +} + +void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, + unsigned arg4, unsigned arg5, unsigned arg6) +{ + /* This function is called by a trampoline. The trampoline stows a + pointer to the ffi_closure object in gr7. We must save this + pointer in a place that will persist while we do our work. */ + register ffi_closure *creg __asm__ ("gr7"); + ffi_closure *closure = creg; + + /* Arguments that don't fit in registers are found on the stack + at a fixed offset above the current frame pointer. */ + register char *frame_pointer __asm__ ("fp"); + char *stack_args = frame_pointer + 16; + + /* Lay the register arguments down in a continuous chunk of memory. */ + unsigned register_args[6] = + { arg1, arg2, arg3, arg4, arg5, arg6 }; + + ffi_cif *cif = closure->cif; + ffi_type **arg_types = cif->arg_types; + void **avalue = alloca (cif->nargs * sizeof(void *)); + char *ptr = (char *) register_args; + int i; + + /* Find the address of each argument. */ + for (i = 0; i < cif->nargs; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = ptr + 3; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = ptr + 2; + break; + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + avalue[i] = ptr; + break; + case FFI_TYPE_STRUCT: + avalue[i] = *(void**)ptr; + break; + default: + /* This is an 8-byte value. */ + avalue[i] = ptr; + ptr += 4; + break; + } + ptr += 4; + + /* If we've handled more arguments than fit in registers, + start looking at the those passed on the stack. */ + if (ptr == ((char *)register_args + (6*4))) + ptr = stack_args; + } + + /* Invoke the closure. */ + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + /* The caller allocates space for the return structure, and + passes a pointer to this space in gr3. Use this value directly + as the return value. */ + register void *return_struct_ptr __asm__("gr3"); + (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data); + } + else + { + /* Allocate space for the return value and call the function. */ + long long rvalue; + (closure->fun) (cif, &rvalue, avalue, closure->user_data); + + /* Functions return 4-byte or smaller results in gr8. 8-byte + values also use gr9. We fill the both, even for small return + values, just to avoid a branch. */ + asm ("ldi @(%0, #0), gr8" : : "r" (&rvalue)); + asm ("ldi @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1])); + } +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + unsigned long fn = (long) ffi_closure_eabi; + unsigned long cls = (long) codeloc; +#ifdef __FRV_FDPIC__ + register void *got __asm__("gr15"); +#endif + int i; + + fn = (unsigned long) ffi_closure_eabi; + +#ifdef __FRV_FDPIC__ + tramp[0] = &((unsigned int *)codeloc)[2]; + tramp[1] = got; + tramp[2] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ + tramp[3] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ + tramp[4] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ + tramp[5] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ + tramp[6] = 0x9cc86000; /* ldi @(gr6, #0), gr14 */ + tramp[7] = 0x8030e000; /* jmpl @(gr14, gr0) */ +#else + tramp[0] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ + tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ + tramp[2] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ + tramp[3] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ + tramp[4] = 0x80300006; /* jmpl @(gr0, gr6) */ +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Cache flushing. */ + for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++) + __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i), + "r" (codeloc)); + + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/frv/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/frv/ffitarget.h new file mode 100644 index 000000000000..d42540e53d3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/frv/ffitarget.h @@ -0,0 +1,62 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2004 Red Hat, Inc. + Target configuration macros for FR-V + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- System specific configurations ----------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_EABI, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_EABI +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +#ifdef __FRV_FDPIC__ +/* Trampolines are 8 4-byte instructions long. */ +#define FFI_TRAMPOLINE_SIZE (8*4) +#else +/* Trampolines are 5 4-byte instructions long. */ +#define FFI_TRAMPOLINE_SIZE (5*4) +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/ffi.c new file mode 100644 index 000000000000..b1d04c3e749b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/ffi.c @@ -0,0 +1,604 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc. + Copyright (c) 2000 Hewlett Packard Company + Copyright (c) 2011 Anthony Green + + IA64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <stdbool.h> +#include <float.h> + +#include "ia64_flags.h" + +/* A 64-bit pointer value. In LP64 mode, this is effectively a plain + pointer. In ILP32 mode, it's a pointer that's been extended to + 64 bits by "addp4". */ +typedef void *PTR64 __attribute__((mode(DI))); + +/* Memory image of fp register contents. This is the implementation + specific format used by ldf.fill/stf.spill. All we care about is + that it wants a 16 byte aligned slot. */ +typedef struct +{ + UINT64 x[2] __attribute__((aligned(16))); +} fpreg; + + +/* The stack layout given to ffi_call_unix and ffi_closure_unix_inner. */ + +struct ia64_args +{ + fpreg fp_regs[8]; /* Contents of 8 fp arg registers. */ + UINT64 gp_regs[8]; /* Contents of 8 gp arg registers. */ + UINT64 other_args[]; /* Arguments passed on stack, variable size. */ +}; + + +/* Adjust ADDR, a pointer to an 8 byte slot, to point to the low LEN bytes. */ + +static inline void * +endian_adjust (void *addr, size_t len) +{ +#ifdef __BIG_ENDIAN__ + return addr + (8 - len); +#else + return addr; +#endif +} + +/* Store VALUE to ADDR in the current cpu implementation's fp spill format. + This is a macro instead of a function, so that it works for all 3 floating + point types without type conversions. Type conversion to long double breaks + the denorm support. */ + +#define stf_spill(addr, value) \ + asm ("stf.spill %0 = %1%P0" : "=m" (*addr) : "f"(value)); + +/* Load a value from ADDR, which is in the current cpu implementation's + fp spill format. As above, this must also be a macro. */ + +#define ldf_fill(result, addr) \ + asm ("ldf.fill %0 = %1%P1" : "=f"(result) : "m"(*addr)); + +/* Return the size of the C type associated with with TYPE. Which will + be one of the FFI_IA64_TYPE_HFA_* values. */ + +static size_t +hfa_type_size (int type) +{ + switch (type) + { + case FFI_IA64_TYPE_HFA_FLOAT: + return sizeof(float); + case FFI_IA64_TYPE_HFA_DOUBLE: + return sizeof(double); + case FFI_IA64_TYPE_HFA_LDOUBLE: + return sizeof(__float80); + default: + abort (); + } +} + +/* Load from ADDR a value indicated by TYPE. Which will be one of + the FFI_IA64_TYPE_HFA_* values. */ + +static void +hfa_type_load (fpreg *fpaddr, int type, void *addr) +{ + switch (type) + { + case FFI_IA64_TYPE_HFA_FLOAT: + stf_spill (fpaddr, *(float *) addr); + return; + case FFI_IA64_TYPE_HFA_DOUBLE: + stf_spill (fpaddr, *(double *) addr); + return; + case FFI_IA64_TYPE_HFA_LDOUBLE: + stf_spill (fpaddr, *(__float80 *) addr); + return; + default: + abort (); + } +} + +/* Load VALUE into ADDR as indicated by TYPE. Which will be one of + the FFI_IA64_TYPE_HFA_* values. */ + +static void +hfa_type_store (int type, void *addr, fpreg *fpaddr) +{ + switch (type) + { + case FFI_IA64_TYPE_HFA_FLOAT: + { + float result; + ldf_fill (result, fpaddr); + *(float *) addr = result; + break; + } + case FFI_IA64_TYPE_HFA_DOUBLE: + { + double result; + ldf_fill (result, fpaddr); + *(double *) addr = result; + break; + } + case FFI_IA64_TYPE_HFA_LDOUBLE: + { + __float80 result; + ldf_fill (result, fpaddr); + *(__float80 *) addr = result; + break; + } + default: + abort (); + } +} + +/* Is TYPE a struct containing floats, doubles, or extended doubles, + all of the same fp type? If so, return the element type. Return + FFI_TYPE_VOID if not. */ + +static int +hfa_element_type (ffi_type *type, int nested) +{ + int element = FFI_TYPE_VOID; + + switch (type->type) + { + case FFI_TYPE_FLOAT: + /* We want to return VOID for raw floating-point types, but the + synthetic HFA type if we're nested within an aggregate. */ + if (nested) + element = FFI_IA64_TYPE_HFA_FLOAT; + break; + + case FFI_TYPE_DOUBLE: + /* Similarly. */ + if (nested) + element = FFI_IA64_TYPE_HFA_DOUBLE; + break; + + case FFI_TYPE_LONGDOUBLE: + /* Similarly, except that that HFA is true for double extended, + but not quad precision. Both have sizeof == 16, so tell the + difference based on the precision. */ + if (LDBL_MANT_DIG == 64 && nested) + element = FFI_IA64_TYPE_HFA_LDOUBLE; + break; + + case FFI_TYPE_STRUCT: + { + ffi_type **ptr = &type->elements[0]; + + for (ptr = &type->elements[0]; *ptr ; ptr++) + { + int sub_element = hfa_element_type (*ptr, 1); + if (sub_element == FFI_TYPE_VOID) + return FFI_TYPE_VOID; + + if (element == FFI_TYPE_VOID) + element = sub_element; + else if (element != sub_element) + return FFI_TYPE_VOID; + } + } + break; + + default: + return FFI_TYPE_VOID; + } + + return element; +} + + +/* Perform machine dependent cif processing. */ + +static ffi_status +ffi_prep_cif_machdep_core(ffi_cif *cif) +{ + int flags; + + /* Adjust cif->bytes to include space for the bits of the ia64_args frame + that precedes the integer register portion. The estimate that the + generic bits did for the argument space required is good enough for the + integer component. */ + cif->bytes += offsetof(struct ia64_args, gp_regs[0]); + if (cif->bytes < sizeof(struct ia64_args)) + cif->bytes = sizeof(struct ia64_args); + + /* Set the return type flag. */ + flags = cif->rtype->type; + switch (cif->rtype->type) + { + case FFI_TYPE_LONGDOUBLE: + /* Leave FFI_TYPE_LONGDOUBLE as meaning double extended precision, + and encode quad precision as a two-word integer structure. */ + if (LDBL_MANT_DIG != 64) + flags = FFI_IA64_TYPE_SMALL_STRUCT | (16 << 8); + break; + + case FFI_TYPE_STRUCT: + { + size_t size = cif->rtype->size; + int hfa_type = hfa_element_type (cif->rtype, 0); + + if (hfa_type != FFI_TYPE_VOID) + { + size_t nelts = size / hfa_type_size (hfa_type); + if (nelts <= 8) + flags = hfa_type | (size << 8); + } + else + { + if (size <= 32) + flags = FFI_IA64_TYPE_SMALL_STRUCT | (size << 8); + } + } + break; + + default: + break; + } + cif->flags = flags; + + return FFI_OK; +} + +ffi_status +ffi_prep_cif_machdep(ffi_cif *cif) +{ + cif->nfixedargs = cif->nargs; + return ffi_prep_cif_machdep_core(cif); +} + +ffi_status +ffi_prep_cif_machdep_var(ffi_cif *cif, + unsigned int nfixedargs, + unsigned int ntotalargs MAYBE_UNUSED) +{ + cif->nfixedargs = nfixedargs; + return ffi_prep_cif_machdep_core(cif); +} + +extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(void), UINT64); + +void +ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + struct ia64_args *stack; + long i, avn, gpcount, fpcount; + ffi_type **p_arg; + + FFI_ASSERT (cif->abi == FFI_UNIX); + + /* If we have no spot for a return value, make one. */ + if (rvalue == NULL && cif->rtype->type != FFI_TYPE_VOID) + rvalue = alloca (cif->rtype->size); + + /* Allocate the stack frame. */ + stack = alloca (cif->bytes); + + gpcount = fpcount = 0; + avn = cif->nargs; + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + stack->gp_regs[gpcount++] = *(SINT8 *)avalue[i]; + break; + case FFI_TYPE_UINT8: + stack->gp_regs[gpcount++] = *(UINT8 *)avalue[i]; + break; + case FFI_TYPE_SINT16: + stack->gp_regs[gpcount++] = *(SINT16 *)avalue[i]; + break; + case FFI_TYPE_UINT16: + stack->gp_regs[gpcount++] = *(UINT16 *)avalue[i]; + break; + case FFI_TYPE_SINT32: + stack->gp_regs[gpcount++] = *(SINT32 *)avalue[i]; + break; + case FFI_TYPE_UINT32: + stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i]; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i]; + break; + + case FFI_TYPE_POINTER: + stack->gp_regs[gpcount++] = (UINT64)(PTR64) *(void **)avalue[i]; + break; + + case FFI_TYPE_FLOAT: + if (gpcount < 8 && fpcount < 8) + stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]); + { + UINT32 tmp; + memcpy (&tmp, avalue[i], sizeof (UINT32)); + stack->gp_regs[gpcount++] = tmp; + } + break; + + case FFI_TYPE_DOUBLE: + if (gpcount < 8 && fpcount < 8) + stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]); + memcpy (&stack->gp_regs[gpcount++], avalue[i], sizeof (UINT64)); + break; + + case FFI_TYPE_LONGDOUBLE: + if (gpcount & 1) + gpcount++; + if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8) + stf_spill (&stack->fp_regs[fpcount++], *(__float80 *)avalue[i]); + memcpy (&stack->gp_regs[gpcount], avalue[i], 16); + gpcount += 2; + break; + + case FFI_TYPE_STRUCT: + { + size_t size = (*p_arg)->size; + size_t align = (*p_arg)->alignment; + int hfa_type = hfa_element_type (*p_arg, 0); + + FFI_ASSERT (align <= 16); + if (align == 16 && (gpcount & 1)) + gpcount++; + + if (hfa_type != FFI_TYPE_VOID) + { + size_t hfa_size = hfa_type_size (hfa_type); + size_t offset = 0; + size_t gp_offset = gpcount * 8; + + while (fpcount < 8 + && offset < size + && gp_offset < 8 * 8) + { + hfa_type_load (&stack->fp_regs[fpcount], hfa_type, + avalue[i] + offset); + offset += hfa_size; + gp_offset += hfa_size; + fpcount += 1; + } + } + + memcpy (&stack->gp_regs[gpcount], avalue[i], size); + gpcount += (size + 7) / 8; + } + break; + + default: + abort (); + } + } + + ffi_call_unix (stack, rvalue, fn, cif->flags); +} + +/* Closures represent a pair consisting of a function pointer, and + some user data. A closure is invoked by reinterpreting the closure + as a function pointer, and branching to it. Thus we can make an + interpreted function callable as a C function: We turn the + interpreter itself, together with a pointer specifying the + interpreted procedure, into a closure. + + For IA64, function pointer are already pairs consisting of a code + pointer, and a gp pointer. The latter is needed to access global + variables. Here we set up such a pair as the first two words of + the closure (in the "trampoline" area), but we replace the gp + pointer with a pointer to the closure itself. We also add the real + gp pointer to the closure. This allows the function entry code to + both retrieve the user data, and to restore the correct gp pointer. */ + +extern void ffi_closure_unix (); + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + /* The layout of a function descriptor. A C function pointer really + points to one of these. */ + struct ia64_fd + { + UINT64 code_pointer; + UINT64 gp; + }; + + struct ffi_ia64_trampoline_struct + { + UINT64 code_pointer; /* Pointer to ffi_closure_unix. */ + UINT64 fake_gp; /* Pointer to closure, installed as gp. */ + UINT64 real_gp; /* Real gp value. */ + }; + + struct ffi_ia64_trampoline_struct *tramp; + struct ia64_fd *fd; + + if (cif->abi != FFI_UNIX) + return FFI_BAD_ABI; + + tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp; + fd = (struct ia64_fd *)(void *)ffi_closure_unix; + + tramp->code_pointer = fd->code_pointer; + tramp->real_gp = fd->gp; + tramp->fake_gp = (UINT64)(PTR64)codeloc; + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + + +UINT64 +ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack, + void *rvalue, void *r8) +{ + ffi_cif *cif; + void **avalue; + ffi_type **p_arg; + long i, avn, gpcount, fpcount, nfixedargs; + + cif = closure->cif; + avn = cif->nargs; + nfixedargs = cif->nfixedargs; + avalue = alloca (avn * sizeof (void *)); + + /* If the structure return value is passed in memory get that location + from r8 so as to pass the value directly back to the caller. */ + if (cif->flags == FFI_TYPE_STRUCT) + rvalue = r8; + + gpcount = fpcount = 0; + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + int named = i < nfixedargs; + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 1); + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 2); + break; + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 4); + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + avalue[i] = &stack->gp_regs[gpcount++]; + break; + case FFI_TYPE_POINTER: + avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], sizeof(void*)); + break; + + case FFI_TYPE_FLOAT: + if (named && gpcount < 8 && fpcount < 8) + { + fpreg *addr = &stack->fp_regs[fpcount++]; + float result; + avalue[i] = addr; + ldf_fill (result, addr); + *(float *)addr = result; + } + else + avalue[i] = endian_adjust(&stack->gp_regs[gpcount], 4); + gpcount++; + break; + + case FFI_TYPE_DOUBLE: + if (named && gpcount < 8 && fpcount < 8) + { + fpreg *addr = &stack->fp_regs[fpcount++]; + double result; + avalue[i] = addr; + ldf_fill (result, addr); + *(double *)addr = result; + } + else + avalue[i] = &stack->gp_regs[gpcount]; + gpcount++; + break; + + case FFI_TYPE_LONGDOUBLE: + if (gpcount & 1) + gpcount++; + if (LDBL_MANT_DIG == 64 && named && gpcount < 8 && fpcount < 8) + { + fpreg *addr = &stack->fp_regs[fpcount++]; + __float80 result; + avalue[i] = addr; + ldf_fill (result, addr); + *(__float80 *)addr = result; + } + else + avalue[i] = &stack->gp_regs[gpcount]; + gpcount += 2; + break; + + case FFI_TYPE_STRUCT: + { + size_t size = (*p_arg)->size; + size_t align = (*p_arg)->alignment; + int hfa_type = hfa_element_type (*p_arg, 0); + + FFI_ASSERT (align <= 16); + if (align == 16 && (gpcount & 1)) + gpcount++; + + if (hfa_type != FFI_TYPE_VOID) + { + size_t hfa_size = hfa_type_size (hfa_type); + size_t offset = 0; + size_t gp_offset = gpcount * 8; + void *addr = alloca (size); + + avalue[i] = addr; + + while (fpcount < 8 + && offset < size + && gp_offset < 8 * 8) + { + hfa_type_store (hfa_type, addr + offset, + &stack->fp_regs[fpcount]); + offset += hfa_size; + gp_offset += hfa_size; + fpcount += 1; + } + + if (offset < size) + memcpy (addr + offset, (char *)stack->gp_regs + gp_offset, + size - offset); + } + else + avalue[i] = &stack->gp_regs[gpcount]; + + gpcount += (size + 7) / 8; + } + break; + + default: + abort (); + } + } + + closure->fun (cif, rvalue, avalue, closure->user_data); + + return cif->flags; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/ffitarget.h new file mode 100644 index 000000000000..fd5b9a0ee1c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/ffitarget.h @@ -0,0 +1,56 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for IA-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long long ffi_arg; +typedef signed long long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_UNIX, /* Linux and all Unix variants use the same conventions */ + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_UNIX +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 24 /* Really the following struct, which */ + /* can be interpreted as a C function */ + /* descriptor: */ +#define FFI_TARGET_SPECIFIC_VARIADIC 1 +#define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/ia64_flags.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/ia64_flags.h new file mode 100644 index 000000000000..9d652cef14ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/ia64_flags.h @@ -0,0 +1,40 @@ +/* ----------------------------------------------------------------------- + ia64_flags.h - Copyright (c) 2000 Hewlett Packard Company + + IA64/unix Foreign Function Interface + + Original author: Hans Boehm, HP Labs + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* "Type" codes used between assembly and C. When used as a part of + a cfi->flags value, the low byte will be these extra type codes, + and bits 8-31 will be the actual size of the type. */ + +/* Small structures containing N words in integer registers. */ +#define FFI_IA64_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 1) + +/* Homogeneous Floating Point Aggregates (HFAs) which are returned + in FP registers. */ +#define FFI_IA64_TYPE_HFA_FLOAT (FFI_TYPE_LAST + 2) +#define FFI_IA64_TYPE_HFA_DOUBLE (FFI_TYPE_LAST + 3) +#define FFI_IA64_TYPE_HFA_LDOUBLE (FFI_TYPE_LAST + 4) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/unix.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/unix.S new file mode 100644 index 000000000000..e2547e02b3aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/ia64/unix.S @@ -0,0 +1,567 @@ +/* ----------------------------------------------------------------------- + unix.S - Copyright (c) 1998, 2008 Red Hat, Inc. + Copyright (c) 2000 Hewlett Packard Company + + IA64/unix Foreign Function Interface + + Primary author: Hans Boehm, HP Labs + + Loosely modeled on Cygnus code for other platforms. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include "ia64_flags.h" + + .pred.safe_across_calls p1-p5,p16-p63 +.text + +/* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue, + void (*fn)(void), int flags); + */ + + .align 16 + .global ffi_call_unix + .proc ffi_call_unix +ffi_call_unix: + .prologue + /* Bit o trickiness. We actually share a stack frame with ffi_call. + Rely on the fact that ffi_call uses a vframe and don't bother + tracking one here at all. */ + .fframe 0 + .save ar.pfs, r36 // loc0 + alloc loc0 = ar.pfs, 4, 3, 8, 0 + .save rp, loc1 + mov loc1 = b0 + .body + add r16 = 16, in0 + mov loc2 = gp + mov r8 = in1 + ;; + + /* Load up all of the argument registers. */ + ldf.fill f8 = [in0], 32 + ldf.fill f9 = [r16], 32 + ;; + ldf.fill f10 = [in0], 32 + ldf.fill f11 = [r16], 32 + ;; + ldf.fill f12 = [in0], 32 + ldf.fill f13 = [r16], 32 + ;; + ldf.fill f14 = [in0], 32 + ldf.fill f15 = [r16], 24 + ;; + ld8 out0 = [in0], 16 + ld8 out1 = [r16], 16 + ;; + ld8 out2 = [in0], 16 + ld8 out3 = [r16], 16 + ;; + ld8 out4 = [in0], 16 + ld8 out5 = [r16], 16 + ;; + ld8 out6 = [in0] + ld8 out7 = [r16] + ;; + + /* Deallocate the register save area from the stack frame. */ + mov sp = in0 + + /* Call the target function. */ + ld8 r16 = [in2], 8 + ;; + ld8 gp = [in2] + mov b6 = r16 + br.call.sptk.many b0 = b6 + ;; + + /* Dispatch to handle return value. */ + mov gp = loc2 + zxt1 r16 = in3 + ;; + mov ar.pfs = loc0 + addl r18 = @ltoffx(.Lst_table), gp + ;; + ld8.mov r18 = [r18], .Lst_table + mov b0 = loc1 + ;; + shladd r18 = r16, 3, r18 + ;; + ld8 r17 = [r18] + shr in3 = in3, 8 + ;; + add r17 = r17, r18 + ;; + mov b6 = r17 + br b6 + ;; + +.Lst_void: + br.ret.sptk.many b0 + ;; +.Lst_uint8: + zxt1 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_sint8: + sxt1 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_uint16: + zxt2 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_sint16: + sxt2 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_uint32: + zxt4 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_sint32: + sxt4 r8 = r8 + ;; + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_int64: + st8 [in1] = r8 + br.ret.sptk.many b0 + ;; +.Lst_float: + stfs [in1] = f8 + br.ret.sptk.many b0 + ;; +.Lst_double: + stfd [in1] = f8 + br.ret.sptk.many b0 + ;; +.Lst_ldouble: + stfe [in1] = f8 + br.ret.sptk.many b0 + ;; + +.Lst_small_struct: + cmp.lt p6, p0 = 8, in3 + cmp.lt p7, p0 = 16, in3 + cmp.lt p8, p0 = 24, in3 + ;; + add r16 = 8, sp + add r17 = 16, sp + add r18 = 24, sp + ;; + st8 [sp] = r8 +(p6) st8 [r16] = r9 + mov out0 = in1 +(p7) st8 [r17] = r10 +(p8) st8 [r18] = r11 + mov out1 = sp + mov out2 = in3 + ;; + // ia64 software calling convention requires + // top 16 bytes of stack to be scratch space + // PLT resolver uses that scratch space at + // 'memcpy' symbol reolution time + add sp = -16, sp + br.call.sptk.many b0 = memcpy# + ;; + mov ar.pfs = loc0 + mov b0 = loc1 + mov gp = loc2 + br.ret.sptk.many b0 + +.Lst_hfa_float: + add r16 = 4, in1 + cmp.lt p6, p0 = 4, in3 + ;; + stfs [in1] = f8, 8 +(p6) stfs [r16] = f9, 8 + cmp.lt p7, p0 = 8, in3 + cmp.lt p8, p0 = 12, in3 + ;; +(p7) stfs [in1] = f10, 8 +(p8) stfs [r16] = f11, 8 + cmp.lt p9, p0 = 16, in3 + cmp.lt p10, p0 = 20, in3 + ;; +(p9) stfs [in1] = f12, 8 +(p10) stfs [r16] = f13, 8 + cmp.lt p6, p0 = 24, in3 + cmp.lt p7, p0 = 28, in3 + ;; +(p6) stfs [in1] = f14 +(p7) stfs [r16] = f15 + br.ret.sptk.many b0 + ;; + +.Lst_hfa_double: + add r16 = 8, in1 + cmp.lt p6, p0 = 8, in3 + ;; + stfd [in1] = f8, 16 +(p6) stfd [r16] = f9, 16 + cmp.lt p7, p0 = 16, in3 + cmp.lt p8, p0 = 24, in3 + ;; +(p7) stfd [in1] = f10, 16 +(p8) stfd [r16] = f11, 16 + cmp.lt p9, p0 = 32, in3 + cmp.lt p10, p0 = 40, in3 + ;; +(p9) stfd [in1] = f12, 16 +(p10) stfd [r16] = f13, 16 + cmp.lt p6, p0 = 48, in3 + cmp.lt p7, p0 = 56, in3 + ;; +(p6) stfd [in1] = f14 +(p7) stfd [r16] = f15 + br.ret.sptk.many b0 + ;; + +.Lst_hfa_ldouble: + add r16 = 16, in1 + cmp.lt p6, p0 = 16, in3 + ;; + stfe [in1] = f8, 32 +(p6) stfe [r16] = f9, 32 + cmp.lt p7, p0 = 32, in3 + cmp.lt p8, p0 = 48, in3 + ;; +(p7) stfe [in1] = f10, 32 +(p8) stfe [r16] = f11, 32 + cmp.lt p9, p0 = 64, in3 + cmp.lt p10, p0 = 80, in3 + ;; +(p9) stfe [in1] = f12, 32 +(p10) stfe [r16] = f13, 32 + cmp.lt p6, p0 = 96, in3 + cmp.lt p7, p0 = 112, in3 + ;; +(p6) stfe [in1] = f14 +(p7) stfe [r16] = f15 + br.ret.sptk.many b0 + ;; + + .endp ffi_call_unix + + .align 16 + .global ffi_closure_unix + .proc ffi_closure_unix + +#define FRAME_SIZE (8*16 + 8*8 + 8*16) + +ffi_closure_unix: + .prologue + .save ar.pfs, r40 // loc0 + alloc loc0 = ar.pfs, 8, 4, 4, 0 + .fframe FRAME_SIZE + add r12 = -FRAME_SIZE, r12 + .save rp, loc1 + mov loc1 = b0 + .save ar.unat, loc2 + mov loc2 = ar.unat + .body + + /* Retrieve closure pointer and real gp. */ +#ifdef _ILP32 + addp4 out0 = 0, gp + addp4 gp = 16, gp +#else + mov out0 = gp + add gp = 16, gp +#endif + ;; + ld8 gp = [gp] + + /* Spill all of the possible argument registers. */ + add r16 = 16 + 8*16, sp + add r17 = 16 + 8*16 + 16, sp + ;; + stf.spill [r16] = f8, 32 + stf.spill [r17] = f9, 32 + mov loc3 = gp + ;; + stf.spill [r16] = f10, 32 + stf.spill [r17] = f11, 32 + ;; + stf.spill [r16] = f12, 32 + stf.spill [r17] = f13, 32 + ;; + stf.spill [r16] = f14, 32 + stf.spill [r17] = f15, 24 + ;; + .mem.offset 0, 0 + st8.spill [r16] = in0, 16 + .mem.offset 8, 0 + st8.spill [r17] = in1, 16 + add out1 = 16 + 8*16, sp + ;; + .mem.offset 0, 0 + st8.spill [r16] = in2, 16 + .mem.offset 8, 0 + st8.spill [r17] = in3, 16 + add out2 = 16, sp + ;; + .mem.offset 0, 0 + st8.spill [r16] = in4, 16 + .mem.offset 8, 0 + st8.spill [r17] = in5, 16 + mov out3 = r8 + ;; + .mem.offset 0, 0 + st8.spill [r16] = in6 + .mem.offset 8, 0 + st8.spill [r17] = in7 + + /* Invoke ffi_closure_unix_inner for the hard work. */ + br.call.sptk.many b0 = ffi_closure_unix_inner + ;; + + /* Dispatch to handle return value. */ + mov gp = loc3 + zxt1 r16 = r8 + ;; + addl r18 = @ltoffx(.Lld_table), gp + mov ar.pfs = loc0 + ;; + ld8.mov r18 = [r18], .Lld_table + mov b0 = loc1 + ;; + shladd r18 = r16, 3, r18 + mov ar.unat = loc2 + ;; + ld8 r17 = [r18] + shr r8 = r8, 8 + ;; + add r17 = r17, r18 + add r16 = 16, sp + ;; + mov b6 = r17 + br b6 + ;; + .label_state 1 + +.Lld_void: + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; +.Lld_int: + .body + .copy_state 1 + ld8 r8 = [r16] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; +.Lld_float: + .body + .copy_state 1 + ldfs f8 = [r16] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; +.Lld_double: + .body + .copy_state 1 + ldfd f8 = [r16] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; +.Lld_ldouble: + .body + .copy_state 1 + ldfe f8 = [r16] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + +.Lld_small_struct: + .body + .copy_state 1 + add r17 = 8, r16 + cmp.lt p6, p0 = 8, r8 + cmp.lt p7, p0 = 16, r8 + cmp.lt p8, p0 = 24, r8 + ;; + ld8 r8 = [r16], 16 +(p6) ld8 r9 = [r17], 16 + ;; +(p7) ld8 r10 = [r16] +(p8) ld8 r11 = [r17] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + +.Lld_hfa_float: + .body + .copy_state 1 + add r17 = 4, r16 + cmp.lt p6, p0 = 4, r8 + ;; + ldfs f8 = [r16], 8 +(p6) ldfs f9 = [r17], 8 + cmp.lt p7, p0 = 8, r8 + cmp.lt p8, p0 = 12, r8 + ;; +(p7) ldfs f10 = [r16], 8 +(p8) ldfs f11 = [r17], 8 + cmp.lt p9, p0 = 16, r8 + cmp.lt p10, p0 = 20, r8 + ;; +(p9) ldfs f12 = [r16], 8 +(p10) ldfs f13 = [r17], 8 + cmp.lt p6, p0 = 24, r8 + cmp.lt p7, p0 = 28, r8 + ;; +(p6) ldfs f14 = [r16] +(p7) ldfs f15 = [r17] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + +.Lld_hfa_double: + .body + .copy_state 1 + add r17 = 8, r16 + cmp.lt p6, p0 = 8, r8 + ;; + ldfd f8 = [r16], 16 +(p6) ldfd f9 = [r17], 16 + cmp.lt p7, p0 = 16, r8 + cmp.lt p8, p0 = 24, r8 + ;; +(p7) ldfd f10 = [r16], 16 +(p8) ldfd f11 = [r17], 16 + cmp.lt p9, p0 = 32, r8 + cmp.lt p10, p0 = 40, r8 + ;; +(p9) ldfd f12 = [r16], 16 +(p10) ldfd f13 = [r17], 16 + cmp.lt p6, p0 = 48, r8 + cmp.lt p7, p0 = 56, r8 + ;; +(p6) ldfd f14 = [r16] +(p7) ldfd f15 = [r17] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + +.Lld_hfa_ldouble: + .body + .copy_state 1 + add r17 = 16, r16 + cmp.lt p6, p0 = 16, r8 + ;; + ldfe f8 = [r16], 32 +(p6) ldfe f9 = [r17], 32 + cmp.lt p7, p0 = 32, r8 + cmp.lt p8, p0 = 48, r8 + ;; +(p7) ldfe f10 = [r16], 32 +(p8) ldfe f11 = [r17], 32 + cmp.lt p9, p0 = 64, r8 + cmp.lt p10, p0 = 80, r8 + ;; +(p9) ldfe f12 = [r16], 32 +(p10) ldfe f13 = [r17], 32 + cmp.lt p6, p0 = 96, r8 + cmp.lt p7, p0 = 112, r8 + ;; +(p6) ldfe f14 = [r16] +(p7) ldfe f15 = [r17] + .restore sp + add sp = FRAME_SIZE, sp + br.ret.sptk.many b0 + ;; + + .endp ffi_closure_unix + + .section .rodata + .align 8 +.Lst_table: + data8 @pcrel(.Lst_void) // FFI_TYPE_VOID + data8 @pcrel(.Lst_sint32) // FFI_TYPE_INT + data8 @pcrel(.Lst_float) // FFI_TYPE_FLOAT + data8 @pcrel(.Lst_double) // FFI_TYPE_DOUBLE + data8 @pcrel(.Lst_ldouble) // FFI_TYPE_LONGDOUBLE + data8 @pcrel(.Lst_uint8) // FFI_TYPE_UINT8 + data8 @pcrel(.Lst_sint8) // FFI_TYPE_SINT8 + data8 @pcrel(.Lst_uint16) // FFI_TYPE_UINT16 + data8 @pcrel(.Lst_sint16) // FFI_TYPE_SINT16 + data8 @pcrel(.Lst_uint32) // FFI_TYPE_UINT32 + data8 @pcrel(.Lst_sint32) // FFI_TYPE_SINT32 + data8 @pcrel(.Lst_int64) // FFI_TYPE_UINT64 + data8 @pcrel(.Lst_int64) // FFI_TYPE_SINT64 + data8 @pcrel(.Lst_void) // FFI_TYPE_STRUCT + data8 @pcrel(.Lst_int64) // FFI_TYPE_POINTER + data8 @pcrel(.Lst_void) // FFI_TYPE_COMPLEX (not implemented) + data8 @pcrel(.Lst_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT + data8 @pcrel(.Lst_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT + data8 @pcrel(.Lst_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE + data8 @pcrel(.Lst_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE + +.Lld_table: + data8 @pcrel(.Lld_void) // FFI_TYPE_VOID + data8 @pcrel(.Lld_int) // FFI_TYPE_INT + data8 @pcrel(.Lld_float) // FFI_TYPE_FLOAT + data8 @pcrel(.Lld_double) // FFI_TYPE_DOUBLE + data8 @pcrel(.Lld_ldouble) // FFI_TYPE_LONGDOUBLE + data8 @pcrel(.Lld_int) // FFI_TYPE_UINT8 + data8 @pcrel(.Lld_int) // FFI_TYPE_SINT8 + data8 @pcrel(.Lld_int) // FFI_TYPE_UINT16 + data8 @pcrel(.Lld_int) // FFI_TYPE_SINT16 + data8 @pcrel(.Lld_int) // FFI_TYPE_UINT32 + data8 @pcrel(.Lld_int) // FFI_TYPE_SINT32 + data8 @pcrel(.Lld_int) // FFI_TYPE_UINT64 + data8 @pcrel(.Lld_int) // FFI_TYPE_SINT64 + data8 @pcrel(.Lld_void) // FFI_TYPE_STRUCT + data8 @pcrel(.Lld_int) // FFI_TYPE_POINTER + data8 @pcrel(.Lld_void) // FFI_TYPE_COMPLEX (not implemented) + data8 @pcrel(.Lld_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT + data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT + data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE + data8 @pcrel(.Lld_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c new file mode 100644 index 000000000000..114d3e47fcde --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/java_raw_api.c @@ -0,0 +1,374 @@ +/* ----------------------------------------------------------------------- + java_raw_api.c - Copyright (c) 1999, 2007, 2008 Red Hat, Inc. + + Cloned from raw_api.c + + Raw_api.c author: Kresten Krab Thorup <krab@gnu.org> + Java_raw_api.c author: Hans-J. Boehm <hboehm@hpl.hp.com> + + $Id $ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* This defines a Java- and 64-bit specific variant of the raw API. */ +/* It assumes that "raw" argument blocks look like Java stacks on a */ +/* 64-bit machine. Arguments that can be stored in a single stack */ +/* stack slots (longs, doubles) occupy 128 bits, but only the first */ +/* 64 bits are actually used. */ + +#include <ffi.h> +#include <ffi_common.h> +#include <stdlib.h> + +#if !defined(NO_JAVA_RAW_API) + +size_t +ffi_java_raw_size (ffi_cif *cif) +{ + size_t result = 0; + int i; + + ffi_type **at = cif->arg_types; + + for (i = cif->nargs-1; i >= 0; i--, at++) + { + switch((*at) -> type) { + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + result += 2 * FFI_SIZEOF_JAVA_RAW; + break; + case FFI_TYPE_STRUCT: + /* No structure parameters in Java. */ + abort(); + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + default: + result += FFI_SIZEOF_JAVA_RAW; + } + } + + return result; +} + + +void +ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + +#if WORDS_BIGENDIAN + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + *args = (void*) ((char*)(raw++) + 3); + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + *args = (void*) ((char*)(raw++) + 2); + break; + +#if FFI_SIZEOF_JAVA_RAW == 8 + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + *args = (void *)raw; + raw += 2; + break; +#endif + + case FFI_TYPE_POINTER: + *args = (void*) &(raw++)->ptr; + break; + + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + + default: + *args = raw; + raw += + FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); + } + } + +#else /* WORDS_BIGENDIAN */ + +#if !PDP + + /* then assume little endian */ + for (i = 0; i < cif->nargs; i++, tp++, args++) + { +#if FFI_SIZEOF_JAVA_RAW == 8 + switch((*tp)->type) { + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + *args = (void*) raw; + raw += 2; + break; + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + default: + *args = (void*) raw++; + } +#else /* FFI_SIZEOF_JAVA_RAW != 8 */ + *args = (void*) raw; + raw += + FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); +#endif /* FFI_SIZEOF_JAVA_RAW == 8 */ + } + +#else +#error "pdp endian not supported" +#endif /* ! PDP */ + +#endif /* WORDS_BIGENDIAN */ +} + +void +ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: +#if WORDS_BIGENDIAN + *(UINT32*)(raw++) = *(UINT8*) (*args); +#else + (raw++)->uint = *(UINT8*) (*args); +#endif + break; + + case FFI_TYPE_SINT8: +#if WORDS_BIGENDIAN + *(SINT32*)(raw++) = *(SINT8*) (*args); +#else + (raw++)->sint = *(SINT8*) (*args); +#endif + break; + + case FFI_TYPE_UINT16: +#if WORDS_BIGENDIAN + *(UINT32*)(raw++) = *(UINT16*) (*args); +#else + (raw++)->uint = *(UINT16*) (*args); +#endif + break; + + case FFI_TYPE_SINT16: +#if WORDS_BIGENDIAN + *(SINT32*)(raw++) = *(SINT16*) (*args); +#else + (raw++)->sint = *(SINT16*) (*args); +#endif + break; + + case FFI_TYPE_UINT32: +#if WORDS_BIGENDIAN + *(UINT32*)(raw++) = *(UINT32*) (*args); +#else + (raw++)->uint = *(UINT32*) (*args); +#endif + break; + + case FFI_TYPE_SINT32: +#if WORDS_BIGENDIAN + *(SINT32*)(raw++) = *(SINT32*) (*args); +#else + (raw++)->sint = *(SINT32*) (*args); +#endif + break; + + case FFI_TYPE_FLOAT: + (raw++)->flt = *(FLOAT32*) (*args); + break; + +#if FFI_SIZEOF_JAVA_RAW == 8 + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + raw->uint = *(UINT64*) (*args); + raw += 2; + break; +#endif + + case FFI_TYPE_POINTER: + (raw++)->ptr = **(void***) args; + break; + + default: +#if FFI_SIZEOF_JAVA_RAW == 8 + FFI_ASSERT(0); /* Should have covered all cases */ +#else + memcpy ((void*) raw->data, (void*)*args, (*tp)->size); + raw += + FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); +#endif + } + } +} + +#if !FFI_NATIVE_RAW_API + +static void +ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue) +{ +#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 + switch (cif->rtype->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_UINT32: + *(UINT64 *)rvalue <<= 32; + break; + + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_INT: +#if FFI_SIZEOF_JAVA_RAW == 4 + case FFI_TYPE_POINTER: +#endif + *(SINT64 *)rvalue <<= 32; + break; + + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + + default: + break; + } +#endif +} + +static void +ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue) +{ +#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 + switch (cif->rtype->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_UINT32: + *(UINT64 *)rvalue >>= 32; + break; + + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_INT: + *(SINT64 *)rvalue >>= 32; + break; + + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + + default: + break; + } +#endif +} + +/* This is a generic definition of ffi_raw_call, to be used if the + * native system does not provide a machine-specific implementation. + * Having this, allows code to be written for the raw API, without + * the need for system-specific code to handle input in that format; + * these following couple of functions will handle the translation forth + * and back automatically. */ + +void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, + ffi_java_raw *raw) +{ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + ffi_java_raw_to_ptrarray (cif, raw, avalue); + ffi_call (cif, fn, rvalue, avalue); + ffi_java_rvalue_to_raw (cif, rvalue); +} + +#if FFI_CLOSURES /* base system provides closures */ + +static void +ffi_java_translate_args (ffi_cif *cif, void *rvalue, + void **avalue, void *user_data) +{ + ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif)); + ffi_raw_closure *cl = (ffi_raw_closure*)user_data; + + ffi_java_ptrarray_to_raw (cif, avalue, raw); + (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data); + ffi_java_raw_to_rvalue (cif, rvalue); +} + +ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc) +{ + ffi_status status; + + status = ffi_prep_closure_loc ((ffi_closure*) cl, + cif, + &ffi_java_translate_args, + codeloc, + codeloc); + if (status == FFI_OK) + { + cl->fun = fun; + cl->user_data = user_data; + } + + return status; +} + +/* Again, here is the generic version of ffi_prep_raw_closure, which + * will install an intermediate "hub" for translation of arguments from + * the pointer-array format, to the raw format */ + +ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data) +{ + return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl); +} + +#endif /* FFI_CLOSURES */ +#endif /* !FFI_NATIVE_RAW_API */ +#endif /* !NO_JAVA_RAW_API */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/asm.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/asm.h new file mode 100644 index 000000000000..4edba410d820 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/asm.h @@ -0,0 +1,5 @@ +/* args are passed on registers from r0 up to r11 => 12*8 bytes */ +#define REG_ARGS_SIZE (12*8) +#define KVX_REGISTER_SIZE (8) +#define KVX_ABI_SLOT_SIZE (KVX_REGISTER_SIZE) +#define KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE (4*KVX_ABI_SLOT_SIZE) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/ffi.c new file mode 100644 index 000000000000..58f6aef5ca47 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/ffi.c @@ -0,0 +1,273 @@ +/* Copyright (c) 2020 Kalray + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#if defined(__kvx__) +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <fficonfig.h> +#include <ffi.h> +#include "ffi_common.h" +#include "asm.h" + +#define ALIGN(x, a) ALIGN_MASK(x, (typeof(x))(a) - 1) +#define ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) +#define KVX_ABI_STACK_ALIGNMENT (32) +#define KVX_ABI_STACK_ARG_ALIGNMENT (8) +#define max(a,b) ((a) > (b) ? (a) : (b)) + +#ifdef FFI_DEBUG +#define DEBUG_PRINT(...) do{ fprintf( stderr, __VA_ARGS__ ); } while(0) +#else +#define DEBUG_PRINT(...) +#endif + +struct ret_value { + unsigned long int r0; + unsigned long int r1; + unsigned long int r2; + unsigned long int r3; +}; + +extern struct ret_value ffi_call_SYSV(unsigned total_size, + unsigned size, + extended_cif *ecif, + unsigned *rvalue_addr, + void *fn, + unsigned int_ext_method); + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + cif->flags = cif->rtype->size; + return FFI_OK; +} + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void *ffi_prep_args(char *stack, unsigned int arg_slots_size, extended_cif *ecif) +{ + char *stacktemp = stack; + char *current_arg_passed_by_value = stack + arg_slots_size; + int i, s; + ffi_type **arg; + int count = 0; + ffi_cif *cif = ecif->cif; + void **argv = ecif->avalue; + + arg = cif->arg_types; + + DEBUG_PRINT("stack: %p\n", stack); + DEBUG_PRINT("arg_slots_size: %u\n", arg_slots_size); + DEBUG_PRINT("current_arg_passed_by_value: %p\n", current_arg_passed_by_value); + DEBUG_PRINT("ecif: %p\n", ecif); + DEBUG_PRINT("ecif->avalue: %p\n", ecif->avalue); + + for (i = 0; i < cif->nargs; i++) { + + s = KVX_ABI_SLOT_SIZE; + switch((*arg)->type) { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + DEBUG_PRINT("INT64/32/16/8/FLOAT/DOUBLE or POINTER @%p\n", stack); + *(uint64_t *) stack = *(uint64_t *)(* argv); + break; + + case FFI_TYPE_COMPLEX: + if ((*arg)->size == 8) + *(_Complex float *) stack = *(_Complex float *)(* argv); + else if ((*arg)->size == 16) { + *(_Complex double *) stack = *(_Complex double *)(* argv); + s = 16; + } else + abort(); + break; + case FFI_TYPE_STRUCT: { + char *value; + unsigned int written_size = 0; + DEBUG_PRINT("struct by value @%p\n", stack); + if ((*arg)->size > KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE) { + DEBUG_PRINT("big struct\n"); + *(uint64_t *) stack = (uintptr_t)current_arg_passed_by_value; + value = current_arg_passed_by_value; + current_arg_passed_by_value += (*arg)->size; + written_size = KVX_ABI_SLOT_SIZE; + } else { + value = stack; + written_size = (*arg)->size; + } + memcpy(value, *argv, (*arg)->size); + s = ALIGN(written_size, KVX_ABI_STACK_ARG_ALIGNMENT); + break; + } + default: + printf("Error: unsupported arg type %d\n", (*arg)->type); + abort(); + break; + + } + stack += s; + count += s; + argv++; + arg++; + } +#ifdef FFI_DEBUG + FFI_ASSERT(((intptr_t)(stacktemp + REG_ARGS_SIZE) & (KVX_ABI_STACK_ALIGNMENT-1)) == 0); +#endif + return stacktemp + REG_ARGS_SIZE; +} + +/* Perform machine dependent cif processing when we have a variadic function */ + +ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, + unsigned int ntotalargs) +{ + cif->flags = cif->rtype->size; + return FFI_OK; +} + +static unsigned long handle_small_int_ext(kvx_intext_method *int_ext_method, + const ffi_type *rtype) +{ + switch (rtype->type) { + case FFI_TYPE_SINT8: + *int_ext_method = KVX_RET_SXBD; + return KVX_REGISTER_SIZE; + + case FFI_TYPE_SINT16: + *int_ext_method = KVX_RET_SXHD; + return KVX_REGISTER_SIZE; + + case FFI_TYPE_SINT32: + *int_ext_method = KVX_RET_SXWD; + return KVX_REGISTER_SIZE; + + case FFI_TYPE_UINT8: + *int_ext_method = KVX_RET_ZXBD; + return KVX_REGISTER_SIZE; + + case FFI_TYPE_UINT16: + *int_ext_method = KVX_RET_ZXHD; + return KVX_REGISTER_SIZE; + + case FFI_TYPE_UINT32: + *int_ext_method = KVX_RET_ZXWD; + return KVX_REGISTER_SIZE; + + default: + *int_ext_method = KVX_RET_NONE; + return rtype->size; + } +} + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + int i; + unsigned long int slot_fitting_args_size = 0; + unsigned long int total_size = 0; + unsigned long int big_struct_size = 0; + kvx_intext_method int_extension_method; + ffi_type **arg; + struct ret_value local_rvalue = {0}; + size_t wb_size; + + + /* Calculate size to allocate on stack */ + for (i = 0, arg = cif->arg_types; i < cif->nargs; i++, arg++) { + DEBUG_PRINT("argument %d, type %d, size %lu\n", i, (*arg)->type, (*arg)->size); + if (((*arg)->type == FFI_TYPE_STRUCT) || ((*arg)->type == FFI_TYPE_COMPLEX)) { + if ((*arg)->size <= KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE) { + slot_fitting_args_size += ALIGN((*arg)->size, KVX_ABI_SLOT_SIZE); + } else { + slot_fitting_args_size += KVX_ABI_SLOT_SIZE; /* aggregate passed by reference */ + big_struct_size += ALIGN((*arg)->size, KVX_ABI_SLOT_SIZE); + } + } else if ((*arg)->size <= KVX_ABI_SLOT_SIZE) { + slot_fitting_args_size += KVX_ABI_SLOT_SIZE; + } else { + printf("Error: unsupported arg size %ld arg type %d\n", (*arg)->size, (*arg)->type); + abort(); /* should never happen? */ + } + } + + extended_cif ecif; + ecif.cif = cif; + ecif.avalue = avalue; + ecif.rvalue = rvalue; + + /* This implementation allocates anyway for all register based args */ + slot_fitting_args_size = max(slot_fitting_args_size, REG_ARGS_SIZE); + total_size = slot_fitting_args_size + big_struct_size; + total_size = ALIGN(total_size, KVX_ABI_STACK_ALIGNMENT); + + /* wb_size: write back size, the size we will need to write back to user + * provided buffer. In theory it should always be cif->flags which is + * cif->rtype->size. But libffi API mandates that for integral types + * of size <= system register size, then we *MUST* write back + * the size of system register size. + * in our case, if size <= 8 bytes we must write back 8 bytes. + * floats, complex and structs are not affected, only integrals. + */ + wb_size = handle_small_int_ext(&int_extension_method, cif->rtype); + + switch (cif->abi) { + case FFI_SYSV: + DEBUG_PRINT("total_size: %lu\n", total_size); + DEBUG_PRINT("slot fitting args size: %lu\n", slot_fitting_args_size); + DEBUG_PRINT("rvalue: %p\n", rvalue); + DEBUG_PRINT("fn: %p\n", fn); + DEBUG_PRINT("rsize: %u\n", cif->flags); + DEBUG_PRINT("wb_size: %u\n", wb_size); + DEBUG_PRINT("int_extension_method: %u\n", int_extension_method); + local_rvalue = ffi_call_SYSV(total_size, slot_fitting_args_size, + &ecif, rvalue, fn, int_extension_method); + if ((cif->flags <= KVX_ABI_MAX_AGGREGATE_IN_REG_SIZE) + && (cif->rtype->type != FFI_TYPE_VOID)) + memcpy(rvalue, &local_rvalue, wb_size); + break; + default: + abort(); + break; + } +} + +/* Closures not supported yet */ +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + return FFI_BAD_ABI; +} + +#endif /* (__kvx__) */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/ffitarget.h new file mode 100644 index 000000000000..8df8735e3f2d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/ffitarget.h @@ -0,0 +1,75 @@ +/* ----------------------------------------------------------------------- + ffitarget.h - Copyright (c) 2020 Kalray + + KVX Target configuration macros + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- System specific configurations ----------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; + +/* Those values are set depending on return type + * they are used in the assembly code in sysv.S + */ +typedef enum kvx_intext_method { + KVX_RET_NONE = 0, + KVX_RET_SXBD = 1, + KVX_RET_SXHD = 2, + KVX_RET_SXWD = 3, + KVX_RET_ZXBD = 4, + KVX_RET_ZXHD = 5, + KVX_RET_ZXWD = 6 +} kvx_intext_method; + +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +/* This is only to allow Python to compile + * but closures are not supported yet + */ +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 0 + +#define FFI_NATIVE_RAW_API 0 +#define FFI_TARGET_SPECIFIC_VARIADIC 1 +#define FFI_TARGET_HAS_COMPLEX_TYPE + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/sysv.S new file mode 100644 index 000000000000..952afc7063bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/kvx/sysv.S @@ -0,0 +1,127 @@ +/* Copyright (c) 2020 Kalray + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#if defined(__kvx__) +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include <kvx/asm.h> + +.text +.global ffi_call_SYSV +.type ffi_call_SYSV, @function +.type ffi_prep_args, @function +.align 8 + +/* ffi_call_SYSV + + r0: total size to allocate on stack + r1: size of arg slots + r2: extended cif structure, DO NOT REMOVE: it is used by ffi_prep_args() + r3: return value address + r4: function to call + r5: integer sign extension method to be used +*/ +ffi_call_SYSV: + addd $r12 = $r12, -64 + so (-32)[$r12] = $r20r21r22r23 + ;; + sd (0)[$r12] = $r24 + ;; + get $r23 = $ra + copyd $r20 = $r12 + sbfd $r12 = $r0, $r12 + ;; + copyd $r0 = $r12 + copyd $r21 = $r3 + copyd $r22 = $r4 + copyd $r24 = $r5 + call ffi_prep_args + ;; + lo $r8r9r10r11 = (64)[$r12] + ;; + lo $r4r5r6r7 = (32)[$r12] + ;; + lo $r0r1r2r3 = (0)[$r12] + copyd $r12 = $r0 + /* $r15 is the register used by the ABI to return big (>32 bytes) + * structs by value. + * It is also referred to as the "struct register" in the ABI. + */ + copyd $r15 = $r21 + icall $r22 + ;; + pcrel $r4 = @pcrel(.Ltable) + cb.deqz $r24 ? .Lend + ;; + addx8d $r24 = $r24, $r4 + ;; + igoto $r24 + ;; +.Ltable: +0: /* we should never arrive here */ + goto .Lerror + nop + ;; +1: /* Sign extend byte to double */ + sxbd $r0 = $r0 + goto .Lend + ;; +2: /* Sign extend half to double */ + sxhd $r0 = $r0 + goto .Lend + ;; +3: /* Sign extend word to double */ + sxwd $r0 = $r0 + goto .Lend + ;; +4: /* Zero extend byte to double */ + zxbd $r0 = $r0 + goto .Lend + ;; +5: /* Zero extend half to double */ + zxhd $r0 = $r0 + goto .Lend + ;; +6: /* Zero extend word to double */ + zxwd $r0 = $r0 + /* Fallthrough to .Lend */ + ;; +.Lend: + ld $r24 = (0)[$r12] + ;; + set $ra = $r23 + lo $r20r21r22r23 = (32)[$r20] + addd $r12 = $r20, 64 + ;; + ret + ;; +.Lerror: + errop + ;; + +#endif /* __kvx__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",%progbits +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m32r/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m32r/ffi.c new file mode 100644 index 000000000000..ab8fc4e48a25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m32r/ffi.c @@ -0,0 +1,232 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2004 Renesas Technology + Copyright (c) 2008 Red Hat, Inc. + + M32R Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> + +/* ffi_prep_args is called by the assembly routine once stack + space has been allocated for the function's arguments. */ + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + unsigned int i; + int tmp; + unsigned int avn; + void **p_argv; + char *argp; + ffi_type **p_arg; + + tmp = 0; + argp = stack; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 8) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0) && (avn != 0); + i--, p_arg++) + { + size_t z; + + /* Align if necessary. */ + if (((*p_arg)->alignment - 1) & (unsigned) argp) + argp = (char *) FFI_ALIGN (argp, (*p_arg)->alignment); + + if (avn != 0) + { + avn--; + z = (*p_arg)->size; + if (z < sizeof (int)) + { + z = sizeof (int); + + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + z = (*p_arg)->size; + if ((*p_arg)->alignment != 1) + memcpy (argp, *p_argv, z); + else + memcpy (argp + 4 - z, *p_argv, z); + z = sizeof (int); + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof (int)) + { + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + } + else + { + if ((*p_arg)->type == FFI_TYPE_STRUCT) + { + if (z > 8) + { + *(unsigned int *) argp = (unsigned int)(void *)(* p_argv); + z = sizeof(void *); + } + else + { + memcpy(argp, *p_argv, z); + z = 8; + } + } + else + { + /* Double or long long 64bit. */ + memcpy (argp, *p_argv, z); + } + } + p_argv++; + argp += z; + } + } + + return; +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag. */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_STRUCT: + if (cif->rtype->size <= 4) + cif->flags = FFI_TYPE_INT; + + else if (cif->rtype->size <= 8) + cif->flags = FFI_TYPE_DOUBLE; + + else + cif->flags = (unsigned) cif->rtype->type; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: + cif->flags = FFI_TYPE_DOUBLE; + break; + + case FFI_TYPE_FLOAT: + default: + cif->flags = FFI_TYPE_INT; + break; + } + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)(void)); + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have + a return value address then we need to make one. */ + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca (cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + int size = cif->rtype->size; + int align = cif->rtype->alignment; + + if (size < 4) + { + if (align == 1) + *(unsigned long *)(ecif.rvalue) <<= (4 - size) * 8; + } + else if (4 < size && size < 8) + { + if (align == 1) + { + memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); + } + else if (align == 2) + { + if (size & 1) + size += 1; + + if (size != 8) + memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); + } + } + } + break; + + default: + FFI_ASSERT(0); + break; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m32r/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m32r/ffitarget.h new file mode 100644 index 000000000000..6c34801982f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m32r/ffitarget.h @@ -0,0 +1,53 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 2004 Renesas Technology. + Target configuration macros for M32R. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi + { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV + } ffi_abi; +#endif + +#define FFI_CLOSURES 0 +#define FFI_TRAMPOLINE_SIZE 24 +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m32r/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m32r/sysv.S new file mode 100644 index 000000000000..06b75c22634a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m32r/sysv.S @@ -0,0 +1,121 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2004 Renesas Technology + + M32R Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#ifdef HAVE_MACHINE_ASM_H +#include <machine/asm.h> +#else +/* XXX these lose for some platforms, I'm sure. */ +#define CNAME(x) x +#define ENTRY(x) .globl CNAME(x)! .type CNAME(x),%function! CNAME(x): +#endif + +.text + + /* R0: ffi_prep_args */ + /* R1: &ecif */ + /* R2: cif->bytes */ + /* R3: fig->flags */ + /* sp+0: ecif.rvalue */ + /* sp+4: fn */ + + /* This assumes we are using gas. */ +ENTRY(ffi_call_SYSV) + /* Save registers. */ + push fp + push lr + push r3 + push r2 + push r1 + push r0 + mv fp, sp + + /* Make room for all of the new args. */ + sub sp, r2 + + /* Place all of the ffi_prep_args in position. */ + mv lr, r0 + mv r0, sp + /* R1 already set. */ + + /* And call. */ + jl lr + + /* Move first 4 parameters in registers... */ + ld r0, @(0,sp) + ld r1, @(4,sp) + ld r2, @(8,sp) + ld r3, @(12,sp) + + /* ...and adjust the stack. */ + ld lr, @(8,fp) + cmpi lr, #16 + bc adjust_stack + ldi lr, #16 +adjust_stack: + add sp, lr + + /* Call the function. */ + ld lr, @(28,fp) + jl lr + + /* Remove the space we pushed for the args. */ + mv sp, fp + + /* Load R2 with the pointer to storage for the return value. */ + ld r2, @(24,sp) + + /* Load R3 with the return type code. */ + ld r3, @(12,sp) + + /* If the return value pointer is NULL, assume no return value. */ + beqz r2, epilogue + + /* Return INT. */ + ldi r4, #FFI_TYPE_INT + bne r3, r4, return_double + st r0, @r2 + bra epilogue + +return_double: + /* Return DOUBLE or LONGDOUBLE. */ + ldi r4, #FFI_TYPE_DOUBLE + bne r3, r4, epilogue + st r0, @r2 + st r1, @(4,r2) + +epilogue: + pop r0 + pop r1 + pop r2 + pop r3 + pop lr + pop fp + jmp lr + +.ffi_call_SYSV_end: + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m68k/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m68k/ffi.c new file mode 100644 index 000000000000..033018480ca9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m68k/ffi.c @@ -0,0 +1,362 @@ +/* ----------------------------------------------------------------------- + ffi.c + + m68k Foreign Function Interface + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <unistd.h> +#ifdef __rtems__ +void rtems_cache_flush_multiple_data_lines( const void *, size_t ); +#else +#include <sys/syscall.h> +#ifdef __MINT__ +#include <mint/mintbind.h> +#include <mint/ssystem.h> +#else +#include <asm/cachectl.h> +#endif +#endif + +void ffi_call_SYSV (extended_cif *, + unsigned, unsigned, + void *, void (*fn) ()); +void *ffi_prep_args (void *stack, extended_cif *ecif); +void ffi_closure_SYSV (ffi_closure *); +void ffi_closure_struct_SYSV (ffi_closure *); +unsigned int ffi_closure_SYSV_inner (ffi_closure *closure, + void *resp, void *args); + +/* ffi_prep_args is called by the assembly routine once stack space has + been allocated for the function's arguments. */ + +void * +ffi_prep_args (void *stack, extended_cif *ecif) +{ + unsigned int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + void *struct_value_ptr; + + argp = stack; + + if ( +#ifdef __MINT__ + (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) || +#endif + (((ecif->cif->rtype->type == FFI_TYPE_STRUCT) + && !ecif->cif->flags))) + struct_value_ptr = ecif->rvalue; + else + struct_value_ptr = NULL; + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z = (*p_arg)->size; + int type = (*p_arg)->type; + + if (z < sizeof (int)) + { + switch (type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; + break; + + case FFI_TYPE_STRUCT: +#ifdef __MINT__ + if (z == 1 || z == 2) + memcpy (argp + 2, *p_argv, z); + else + memcpy (argp, *p_argv, z); +#else + memcpy (argp + sizeof (int) - z, *p_argv, z); +#endif + break; + + default: + FFI_ASSERT (0); + } + z = sizeof (int); + } + else + { + memcpy (argp, *p_argv, z); + + /* Align if necessary. */ + if ((sizeof(int) - 1) & z) + z = FFI_ALIGN(z, sizeof(int)); + } + + p_argv++; + argp += z; + } + + return struct_value_ptr; +} + +#define CIF_FLAGS_INT 1 +#define CIF_FLAGS_DINT 2 +#define CIF_FLAGS_FLOAT 4 +#define CIF_FLAGS_DOUBLE 8 +#define CIF_FLAGS_LDOUBLE 16 +#define CIF_FLAGS_POINTER 32 +#define CIF_FLAGS_STRUCT1 64 +#define CIF_FLAGS_STRUCT2 128 +#define CIF_FLAGS_SINT8 256 +#define CIF_FLAGS_SINT16 512 + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep (ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + cif->flags = 0; + break; + + case FFI_TYPE_STRUCT: + if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && + cif->rtype->elements[1]) + { + cif->flags = 0; + break; + } + + switch (cif->rtype->size) + { + case 1: +#ifdef __MINT__ + cif->flags = CIF_FLAGS_STRUCT2; +#else + cif->flags = CIF_FLAGS_STRUCT1; +#endif + break; + case 2: + cif->flags = CIF_FLAGS_STRUCT2; + break; +#ifdef __MINT__ + case 3: +#endif + case 4: + cif->flags = CIF_FLAGS_INT; + break; +#ifdef __MINT__ + case 7: +#endif + case 8: + cif->flags = CIF_FLAGS_DINT; + break; + default: + cif->flags = 0; + break; + } + break; + + case FFI_TYPE_FLOAT: + cif->flags = CIF_FLAGS_FLOAT; + break; + + case FFI_TYPE_DOUBLE: + cif->flags = CIF_FLAGS_DOUBLE; + break; + +#if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE) + case FFI_TYPE_LONGDOUBLE: +#ifdef __MINT__ + cif->flags = 0; +#else + cif->flags = CIF_FLAGS_LDOUBLE; +#endif + break; +#endif + + case FFI_TYPE_POINTER: + cif->flags = CIF_FLAGS_POINTER; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = CIF_FLAGS_DINT; + break; + + case FFI_TYPE_SINT16: + cif->flags = CIF_FLAGS_SINT16; + break; + + case FFI_TYPE_SINT8: + cif->flags = CIF_FLAGS_SINT8; + break; + + default: + cif->flags = CIF_FLAGS_INT; + break; + } + + return FFI_OK; +} + +void +ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return value + address then we need to make one. */ + + if (rvalue == NULL + && cif->rtype->type == FFI_TYPE_STRUCT + && cif->rtype->size > 8) + ecif.rvalue = alloca (cif->rtype->size); + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV (&ecif, cif->bytes, cif->flags, + ecif.rvalue, fn); + break; + + default: + FFI_ASSERT (0); + break; + } +} + +static void +ffi_prep_incoming_args_SYSV (char *stack, void **avalue, ffi_cif *cif) +{ + unsigned int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + + argp = stack; + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; +#ifdef __MINT__ + if (cif->flags && + cif->rtype->type == FFI_TYPE_STRUCT && + (z == 1 || z == 2)) + { + *p_argv = (void *) (argp + 2); + + z = 4; + } + else + if (cif->flags && + cif->rtype->type == FFI_TYPE_STRUCT && + (z == 3 || z == 4)) + { + *p_argv = (void *) (argp); + + z = 4; + } + else +#endif + if (z <= 4) + { + *p_argv = (void *) (argp + 4 - z); + + z = 4; + } + else + { + *p_argv = (void *) argp; + + /* Align if necessary */ + if ((sizeof(int) - 1) & z) + z = FFI_ALIGN(z, sizeof(int)); + } + + p_argv++; + argp += z; + } +} + +unsigned int +ffi_closure_SYSV_inner (ffi_closure *closure, void *resp, void *args) +{ + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void *)); + + ffi_prep_incoming_args_SYSV(args, arg_area, cif); + + (closure->fun) (cif, resp, arg_area, closure->user_data); + + return cif->flags; +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + *(unsigned short *)closure->tramp = 0x207c; + *(void **)(closure->tramp + 2) = codeloc; + *(unsigned short *)(closure->tramp + 6) = 0x4ef9; + + if ( +#ifdef __MINT__ + (cif->rtype->type == FFI_TYPE_LONGDOUBLE) || +#endif + (((cif->rtype->type == FFI_TYPE_STRUCT) + && !cif->flags))) + *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV; + else + *(void **)(closure->tramp + 8) = ffi_closure_SYSV; + +#ifdef __rtems__ + rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE ); +#elif defined(__MINT__) + Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE); +#else + syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE, + FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE); +#endif + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m68k/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m68k/ffitarget.h new file mode 100644 index 000000000000..e81dde2b2eb4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m68k/ffitarget.h @@ -0,0 +1,54 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for Motorola 68K. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 16 +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m68k/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m68k/sysv.S new file mode 100644 index 000000000000..ea40f1100ba9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m68k/sysv.S @@ -0,0 +1,357 @@ +/* ----------------------------------------------------------------------- + + sysv.S - Copyright (c) 2012 Alan Hourihane + Copyright (c) 1998, 2012 Andreas Schwab + Copyright (c) 2008 Red Hat, Inc. + Copyright (c) 2012, 2016 Thorsten Glaser + + m68k Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +#ifdef HAVE_AS_CFI_PSEUDO_OP +#define CFI_STARTPROC() .cfi_startproc +#define CFI_OFFSET(reg,off) .cfi_offset reg,off +#define CFI_DEF_CFA(reg,off) .cfi_def_cfa reg,off +#define CFI_ENDPROC() .cfi_endproc +#else +#define CFI_STARTPROC() +#define CFI_OFFSET(reg,off) +#define CFI_DEF_CFA(reg,off) +#define CFI_ENDPROC() +#endif + +#ifdef __MINT__ +#define CALLFUNC(funcname) _ ## funcname +#else +#define CALLFUNC(funcname) funcname +#endif + + .text + + .globl CALLFUNC(ffi_call_SYSV) + .type CALLFUNC(ffi_call_SYSV),@function + .align 4 + +CALLFUNC(ffi_call_SYSV): + CFI_STARTPROC() + link %fp,#0 + CFI_OFFSET(14,-8) + CFI_DEF_CFA(14,8) + move.l %d2,-(%sp) + CFI_OFFSET(2,-12) + + | Make room for all of the new args. + sub.l 12(%fp),%sp + + | Call ffi_prep_args + move.l 8(%fp),-(%sp) + pea 4(%sp) +#if !defined __PIC__ + jsr CALLFUNC(ffi_prep_args) +#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) + move.l _current_shared_library_a5_offset_(%a5),%a0 + move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0 + jsr (%a0) +#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) + move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 + lea (-6,%pc,%a0),%a0 + move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0 + jsr (%a0) +#else + bsr.l CALLFUNC(ffi_prep_args@PLTPC) +#endif + addq.l #8,%sp + + | Pass pointer to struct value, if any +#ifdef __MINT__ + move.l %d0,%a1 +#else + move.l %a0,%a1 +#endif + + | Call the function + move.l 24(%fp),%a0 + jsr (%a0) + + | Remove the space we pushed for the args + add.l 12(%fp),%sp + + | Load the pointer to storage for the return value + move.l 20(%fp),%a1 + + | Load the return type code + move.l 16(%fp),%d2 + + | If the return value pointer is NULL, assume no return value. + | NOTE: On the mc68000, tst on an address register is not supported. +#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) + cmp.w #0, %a1 +#else + tst.l %a1 +#endif + jbeq noretval + + btst #0,%d2 + jbeq retlongint + move.l %d0,(%a1) + jbra epilogue + +retlongint: + btst #1,%d2 + jbeq retfloat + move.l %d0,(%a1) + move.l %d1,4(%a1) + jbra epilogue + +retfloat: + btst #2,%d2 + jbeq retdouble +#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.s %fp0,(%a1) +#else + move.l %d0,(%a1) +#endif + jbra epilogue + +retdouble: + btst #3,%d2 + jbeq retlongdouble +#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.d %fp0,(%a1) +#else + move.l %d0,(%a1)+ + move.l %d1,(%a1) +#endif + jbra epilogue + +retlongdouble: + btst #4,%d2 + jbeq retpointer +#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.x %fp0,(%a1) +#else + move.l %d0,(%a1)+ + move.l %d1,(%a1)+ + move.l %d2,(%a1) +#endif + jbra epilogue + +retpointer: + btst #5,%d2 + jbeq retstruct1 +#ifdef __MINT__ + move.l %d0,(%a1) +#else + move.l %a0,(%a1) +#endif + jbra epilogue + +retstruct1: + btst #6,%d2 + jbeq retstruct2 + move.b %d0,(%a1) + jbra epilogue + +retstruct2: + btst #7,%d2 + jbeq retsint8 + move.w %d0,(%a1) + jbra epilogue + +retsint8: + btst #8,%d2 + jbeq retsint16 + | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. +#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) + ext.w %d0 + ext.l %d0 +#else + extb.l %d0 +#endif + move.l %d0,(%a1) + jbra epilogue + +retsint16: + btst #9,%d2 + jbeq noretval + ext.l %d0 + move.l %d0,(%a1) + +noretval: +epilogue: + move.l (%sp)+,%d2 + unlk %fp + rts + CFI_ENDPROC() + .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV) + + .globl CALLFUNC(ffi_closure_SYSV) + .type CALLFUNC(ffi_closure_SYSV), @function + .align 4 + +CALLFUNC(ffi_closure_SYSV): + CFI_STARTPROC() + link %fp,#-12 + CFI_OFFSET(14,-8) + CFI_DEF_CFA(14,8) + move.l %sp,-12(%fp) + pea 8(%fp) + pea -12(%fp) + move.l %a0,-(%sp) +#if !defined __PIC__ + jsr CALLFUNC(ffi_closure_SYSV_inner) +#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) + move.l _current_shared_library_a5_offset_(%a5),%a0 + move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 + jsr (%a0) +#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) + move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 + lea (-6,%pc,%a0),%a0 + move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 + jsr (%a0) +#else + bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) +#endif + + lsr.l #1,%d0 + jne 1f + jcc .Lcls_epilogue + | CIF_FLAGS_INT + move.l -12(%fp),%d0 +.Lcls_epilogue: + | no CIF_FLAGS_* + unlk %fp + rts +1: + lea -12(%fp),%a0 + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_float + | CIF_FLAGS_DINT + move.l (%a0)+,%d0 + move.l (%a0),%d1 + jra .Lcls_epilogue +.Lcls_ret_float: +#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.s (%a0),%fp0 +#else + move.l (%a0),%d0 +#endif + jra .Lcls_epilogue +1: + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_ldouble + | CIF_FLAGS_DOUBLE +#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.d (%a0),%fp0 +#else + move.l (%a0)+,%d0 + move.l (%a0),%d1 +#endif + jra .Lcls_epilogue +.Lcls_ret_ldouble: +#if defined(__MC68881__) || defined(__HAVE_68881__) + fmove.x (%a0),%fp0 +#else + move.l (%a0)+,%d0 + move.l (%a0)+,%d1 + move.l (%a0),%d2 +#endif + jra .Lcls_epilogue +1: + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_struct1 + | CIF_FLAGS_POINTER + move.l (%a0),%a0 + move.l %a0,%d0 + jra .Lcls_epilogue +.Lcls_ret_struct1: + move.b (%a0),%d0 + jra .Lcls_epilogue +1: + lsr.l #2,%d0 + jne 1f + jcs .Lcls_ret_sint8 + | CIF_FLAGS_STRUCT2 + move.w (%a0),%d0 + jra .Lcls_epilogue +.Lcls_ret_sint8: + move.l (%a0),%d0 + | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. +#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) + ext.w %d0 + ext.l %d0 +#else + extb.l %d0 +#endif + jra .Lcls_epilogue +1: + | CIF_FLAGS_SINT16 + move.l (%a0),%d0 + ext.l %d0 + jra .Lcls_epilogue + CFI_ENDPROC() + + .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV) + + .globl CALLFUNC(ffi_closure_struct_SYSV) + .type CALLFUNC(ffi_closure_struct_SYSV), @function + .align 4 + +CALLFUNC(ffi_closure_struct_SYSV): + CFI_STARTPROC() + link %fp,#0 + CFI_OFFSET(14,-8) + CFI_DEF_CFA(14,8) + move.l %sp,-12(%fp) + pea 8(%fp) + move.l %a1,-(%sp) + move.l %a0,-(%sp) +#if !defined __PIC__ + jsr CALLFUNC(ffi_closure_SYSV_inner) +#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) + move.l _current_shared_library_a5_offset_(%a5),%a0 + move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 + jsr (%a0) +#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) + move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 + lea (-6,%pc,%a0),%a0 + move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 + jsr (%a0) +#else + bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) +#endif + unlk %fp + rts + CFI_ENDPROC() + .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV) + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m88k/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m88k/ffi.c new file mode 100644 index 000000000000..57b344f4b9a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m88k/ffi.c @@ -0,0 +1,400 @@ +/* + * Copyright (c) 2013 Miodrag Vallat. <miod@openbsd.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * ``Software''), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * m88k Foreign Function Interface + * + * This file attempts to provide all the FFI entry points which can reliably + * be implemented in C. + * + * Only OpenBSD/m88k is currently supported; other platforms (such as + * Motorola's SysV/m88k) could be supported with the following tweaks: + * + * - non-OpenBSD systems use an `outgoing parameter area' as part of the + * 88BCS calling convention, which is not supported under OpenBSD from + * release 3.6 onwards. Supporting it should be as easy as taking it + * into account when adjusting the stack, in the assembly code. + * + * - the logic deciding whether a function argument gets passed through + * registers, or on the stack, has changed several times in OpenBSD in + * edge cases (especially for structs larger than 32 bytes being passed + * by value). The code below attemps to match the logic used by the + * system compiler of OpenBSD 5.3, i.e. gcc 3.3.6 with many m88k backend + * fixes. + */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <unistd.h> + +void ffi_call_OBSD (unsigned int, extended_cif *, unsigned int, void *, + void (*fn) ()); +void *ffi_prep_args (void *, extended_cif *); +void ffi_closure_OBSD (ffi_closure *); +void ffi_closure_struct_OBSD (ffi_closure *); +unsigned int ffi_closure_OBSD_inner (ffi_closure *, void *, unsigned int *, + char *); +void ffi_cacheflush_OBSD (unsigned int, unsigned int); + +#define CIF_FLAGS_INT (1 << 0) +#define CIF_FLAGS_DINT (1 << 1) + +/* + * Foreign Function Interface API + */ + +/* ffi_prep_args is called by the assembly routine once stack space has + been allocated for the function's arguments. */ + +void * +ffi_prep_args (void *stack, extended_cif *ecif) +{ + unsigned int i; + void **p_argv; + char *argp, *stackp; + unsigned int *regp; + unsigned int regused; + ffi_type **p_arg; + void *struct_value_ptr; + + regp = (unsigned int *)stack; + stackp = (char *)(regp + 8); + regused = 0; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT + && !ecif->cif->flags) + struct_value_ptr = ecif->rvalue; + else + struct_value_ptr = NULL; + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++) + { + size_t z; + unsigned short t, a; + + z = (*p_arg)->size; + t = (*p_arg)->type; + a = (*p_arg)->alignment; + + /* + * Figure out whether the argument can be passed through registers + * or on the stack. + * The rule is that registers can only receive simple types not larger + * than 64 bits, or structs the exact size of a register and aligned to + * the size of a register. + */ + if (t == FFI_TYPE_STRUCT) + { + if (z == sizeof (int) && a == sizeof (int) && regused < 8) + argp = (char *)regp; + else + argp = stackp; + } + else + { + if (z > sizeof (int) && regused < 8 - 1) + { + /* align to an even register pair */ + if (regused & 1) + { + regp++; + regused++; + } + } + if (regused < 8) + argp = (char *)regp; + else + argp = stackp; + } + + /* Enforce proper stack alignment of 64-bit types */ + if (argp == stackp && a > sizeof (int)) + { + stackp = (char *) FFI_ALIGN(stackp, a); + argp = stackp; + } + + switch (t) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_FLOAT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + *(unsigned int *) argp = *(unsigned int *) *p_argv; + break; + + case FFI_TYPE_DOUBLE: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_STRUCT: + memcpy (argp, *p_argv, z); + break; + + default: + FFI_ASSERT (0); + } + + /* Align if necessary. */ + if ((sizeof (int) - 1) & z) + z = FFI_ALIGN(z, sizeof (int)); + + p_argv++; + + /* Be careful, once all registers are filled, and about to continue + on stack, regp == stackp. Therefore the check for regused as well. */ + if (argp == (char *)regp && regused < 8) + { + regp += z / sizeof (int); + regused += z / sizeof (int); + } + else + stackp += z; + } + + return struct_value_ptr; +} + +/* Perform machine dependent cif processing */ +ffi_status +ffi_prep_cif_machdep (ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + cif->flags = 0; + break; + + case FFI_TYPE_STRUCT: + if (cif->rtype->size == sizeof (int) && + cif->rtype->alignment == sizeof (int)) + cif->flags = CIF_FLAGS_INT; + else + cif->flags = 0; + break; + + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = CIF_FLAGS_DINT; + break; + + default: + cif->flags = CIF_FLAGS_INT; + break; + } + + return FFI_OK; +} + +void +ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return value + address then we need to make one. */ + + if (rvalue == NULL + && cif->rtype->type == FFI_TYPE_STRUCT + && (cif->rtype->size != sizeof (int) + || cif->rtype->alignment != sizeof (int))) + ecif.rvalue = alloca (cif->rtype->size); + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_OBSD: + ffi_call_OBSD (cif->bytes, &ecif, cif->flags, ecif.rvalue, fn); + break; + + default: + FFI_ASSERT (0); + break; + } +} + +/* + * Closure API + */ + +static void +ffi_prep_closure_args_OBSD (ffi_cif *cif, void **avalue, unsigned int *regp, + char *stackp) +{ + unsigned int i; + void **p_argv; + char *argp; + unsigned int regused; + ffi_type **p_arg; + + regused = 0; + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) + { + size_t z; + unsigned short t, a; + + z = (*p_arg)->size; + t = (*p_arg)->type; + a = (*p_arg)->alignment; + + /* + * Figure out whether the argument has been passed through registers + * or on the stack. + * The rule is that registers can only receive simple types not larger + * than 64 bits, or structs the exact size of a register and aligned to + * the size of a register. + */ + if (t == FFI_TYPE_STRUCT) + { + if (z == sizeof (int) && a == sizeof (int) && regused < 8) + argp = (char *)regp; + else + argp = stackp; + } + else + { + if (z > sizeof (int) && regused < 8 - 1) + { + /* align to an even register pair */ + if (regused & 1) + { + regp++; + regused++; + } + } + if (regused < 8) + argp = (char *)regp; + else + argp = stackp; + } + + /* Enforce proper stack alignment of 64-bit types */ + if (argp == stackp && a > sizeof (int)) + { + stackp = (char *) FFI_ALIGN(stackp, a); + argp = stackp; + } + + if (z < sizeof (int) && t != FFI_TYPE_STRUCT) + *p_argv = (void *) (argp + sizeof (int) - z); + else + *p_argv = (void *) argp; + + /* Align if necessary */ + if ((sizeof (int) - 1) & z) + z = FFI_ALIGN(z, sizeof (int)); + + p_argv++; + + /* Be careful, once all registers are exhausted, and about to fetch from + stack, regp == stackp. Therefore the check for regused as well. */ + if (argp == (char *)regp && regused < 8) + { + regp += z / sizeof (int); + regused += z / sizeof (int); + } + else + stackp += z; + } +} + +unsigned int +ffi_closure_OBSD_inner (ffi_closure *closure, void *resp, unsigned int *regp, + char *stackp) +{ + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void *)); + + ffi_prep_closure_args_OBSD(cif, arg_area, regp, stackp); + + (closure->fun) (cif, resp, arg_area, closure->user_data); + + return cif->flags; +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, void *codeloc) +{ + unsigned int *tramp = (unsigned int *) codeloc; + void *fn; + + FFI_ASSERT (cif->abi == FFI_OBSD); + + if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags) + fn = &ffi_closure_struct_OBSD; + else + fn = &ffi_closure_OBSD; + + /* or.u %r10, %r0, %hi16(fn) */ + tramp[0] = 0x5d400000 | (((unsigned int)fn) >> 16); + /* or.u %r13, %r0, %hi16(closure) */ + tramp[1] = 0x5da00000 | ((unsigned int)closure >> 16); + /* or %r10, %r10, %lo16(fn) */ + tramp[2] = 0x594a0000 | (((unsigned int)fn) & 0xffff); + /* jmp.n %r10 */ + tramp[3] = 0xf400c40a; + /* or %r13, %r13, %lo16(closure) */ + tramp[4] = 0x59ad0000 | ((unsigned int)closure & 0xffff); + + ffi_cacheflush_OBSD((unsigned int)codeloc, FFI_TRAMPOLINE_SIZE); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m88k/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m88k/ffitarget.h new file mode 100644 index 000000000000..e52bf9fa30a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m88k/ffitarget.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2013 Miodrag Vallat. <miod@openbsd.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * ``Software''), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * m88k Foreign Function Interface + */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_OBSD, + FFI_DEFAULT_ABI = FFI_OBSD, + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 0x14 +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m88k/obsd.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m88k/obsd.S new file mode 100644 index 000000000000..1944a23de424 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/m88k/obsd.S @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2013 Miodrag Vallat. <miod@openbsd.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * ``Software''), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * m88k Foreign Function Interface + */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + .text + +/* + * ffi_cacheflush_OBSD(unsigned int addr, %r2 + * unsigned int size); %r3 + */ + .align 4 + .globl ffi_cacheflush_OBSD + .type ffi_cacheflush_OBSD,@function +ffi_cacheflush_OBSD: + tb0 0, %r0, 451 + or %r0, %r0, %r0 + jmp %r1 + .size ffi_cacheflush_OBSD, . - ffi_cacheflush_OBSD + +/* + * ffi_call_OBSD(unsigned bytes, %r2 + * extended_cif *ecif, %r3 + * unsigned flags, %r4 + * void *rvalue, %r5 + * void (*fn)()); %r6 + */ + .align 4 + .globl ffi_call_OBSD + .type ffi_call_OBSD,@function +ffi_call_OBSD: + subu %r31, %r31, 32 + st %r30, %r31, 4 + st %r1, %r31, 0 + addu %r30, %r31, 32 + + | Save the few arguments we'll need after ffi_prep_args() + st.d %r4, %r31, 8 + st %r6, %r31, 16 + + | Allocate room for the image of r2-r9, and the stack space for + | the args (rounded to a 16-byte boundary) + addu %r2, %r2, (8 * 4) + 15 + clr %r2, %r2, 4<0> + subu %r31, %r31, %r2 + + | Fill register and stack image + or %r2, %r31, %r0 +#ifdef PIC + bsr ffi_prep_args#plt +#else + bsr ffi_prep_args +#endif + + | Save pointer to return struct address, if any + or %r12, %r2, %r0 + + | Get function pointer + subu %r4, %r30, 32 + ld %r1, %r4, 16 + + | Fetch the register arguments + ld.d %r2, %r31, (0 * 4) + ld.d %r4, %r31, (2 * 4) + ld.d %r6, %r31, (4 * 4) + ld.d %r8, %r31, (6 * 4) + addu %r31, %r31, (8 * 4) + + | Invoke the function + jsr %r1 + + | Restore stack now that we don't need the args anymore + subu %r31, %r30, 32 + + | Figure out what to return as the function's return value + ld %r5, %r31, 12 | rvalue + ld %r4, %r31, 8 | flags + + bcnd eq0, %r5, 9f + + bb0 0, %r4, 1f | CIF_FLAGS_INT + st %r2, %r5, 0 + br 9f + +1: + bb0 1, %r4, 1f | CIF_FLAGS_DINT + st.d %r2, %r5, 0 + br 9f + +1: +9: + ld %r1, %r31, 0 + ld %r30, %r31, 4 + jmp.n %r1 + addu %r31, %r31, 32 + .size ffi_call_OBSD, . - ffi_call_OBSD + +/* + * ffi_closure_OBSD(ffi_closure *closure); %r13 + */ + .align 4 + .globl ffi_closure_OBSD + .type ffi_closure_OBSD, @function +ffi_closure_OBSD: + subu %r31, %r31, 16 + st %r30, %r31, 4 + st %r1, %r31, 0 + addu %r30, %r31, 16 + + | Make room on the stack for saved register arguments and return + | value + subu %r31, %r31, (8 * 4) + (2 * 4) + st.d %r2, %r31, (0 * 4) + st.d %r4, %r31, (2 * 4) + st.d %r6, %r31, (4 * 4) + st.d %r8, %r31, (6 * 4) + + | Invoke the closure function + or %r5, %r30, 0 | calling stack + addu %r4, %r31, 0 | saved registers + addu %r3, %r31, (8 * 4) | return value + or %r2, %r13, %r0 | closure +#ifdef PIC + bsr ffi_closure_OBSD_inner#plt +#else + bsr ffi_closure_OBSD_inner +#endif + + | Figure out what to return as the function's return value + bb0 0, %r2, 1f | CIF_FLAGS_INT + ld %r2, %r31, (8 * 4) + br 9f + +1: + bb0 1, %r2, 1f | CIF_FLAGS_DINT + ld.d %r2, %r31, (8 * 4) + br 9f + +1: +9: + subu %r31, %r30, 16 + ld %r1, %r31, 0 + ld %r30, %r31, 4 + jmp.n %r1 + addu %r31, %r31, 16 + .size ffi_closure_OBSD,.-ffi_closure_OBSD + +/* + * ffi_closure_struct_OBSD(ffi_closure *closure); %r13 + */ + .align 4 + .globl ffi_closure_struct_OBSD + .type ffi_closure_struct_OBSD, @function +ffi_closure_struct_OBSD: + subu %r31, %r31, 16 + st %r30, %r31, 4 + st %r1, %r31, 0 + addu %r30, %r31, 16 + + | Make room on the stack for saved register arguments + subu %r31, %r31, (8 * 4) + st.d %r2, %r31, (0 * 4) + st.d %r4, %r31, (2 * 4) + st.d %r6, %r31, (4 * 4) + st.d %r8, %r31, (6 * 4) + + | Invoke the closure function + or %r5, %r30, 0 | calling stack + addu %r4, %r31, 0 | saved registers + or %r3, %r12, 0 | return value + or %r2, %r13, %r0 | closure +#ifdef PIC + bsr ffi_closure_OBSD_inner#plt +#else + bsr ffi_closure_OBSD_inner +#endif + + subu %r31, %r30, 16 + ld %r1, %r31, 0 + ld %r30, %r31, 4 + jmp.n %r1 + addu %r31, %r31, 16 + .size ffi_closure_struct_OBSD,.-ffi_closure_struct_OBSD diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/metag/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/metag/ffi.c new file mode 100644 index 000000000000..3aecb0b81156 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/metag/ffi.c @@ -0,0 +1,330 @@ +/* ---------------------------------------------------------------------- + ffi.c - Copyright (c) 2013 Imagination Technologies + + Meta Foreign Function Interface + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + `Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED `AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> + +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) + +/* + * ffi_prep_args is called by the assembly routine once stack space has been + * allocated for the function's arguments + */ + +unsigned int ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + /* Store return value */ + if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { + argp -= 4; + *(void **) argp = ecif->rvalue; + } + + p_argv = ecif->avalue; + + /* point to next location */ + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++, p_argv++) + { + size_t z; + + /* Move argp to address of argument */ + z = (*p_arg)->size; + argp -= z; + + /* Align if necessary */ + argp = (char *) FFI_ALIGN_DOWN(FFI_ALIGN_DOWN(argp, (*p_arg)->alignment), 4); + + if (z < sizeof(int)) { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + case FFI_TYPE_STRUCT: + memcpy(argp, *p_argv, (*p_arg)->size); + break; + default: + FFI_ASSERT(0); + } + } else if ( z == sizeof(int)) { + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + } else { + memcpy(argp, *p_argv, z); + } + } + + /* return the size of the arguments to be passed in registers, + padded to an 8 byte boundary to preserve stack alignment */ + return FFI_ALIGN(MIN(stack - argp, 6*4), 8); +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + ffi_type **ptr; + unsigned i, bytes = 0; + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { + if ((*ptr)->size == 0) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = FFI_ALIGN(bytes, (*ptr)->alignment); + + bytes += FFI_ALIGN((*ptr)->size, 4); + } + + /* Ensure arg space is aligned to an 8-byte boundary */ + bytes = FFI_ALIGN(bytes, 8); + + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT) { + bytes += sizeof(void*); + + /* Ensure stack is aligned to an 8-byte boundary */ + bytes = FFI_ALIGN(bytes, 8); + } + + cif->bytes = bytes; + + /* Set the return type flag */ + switch (cif->rtype->type) { + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = (unsigned) FFI_TYPE_SINT64; + break; + case FFI_TYPE_STRUCT: + /* Meta can store return values which are <= 64 bits */ + if (cif->rtype->size <= 4) + /* Returned to D0Re0 as 32-bit value */ + cif->flags = (unsigned)FFI_TYPE_INT; + else if ((cif->rtype->size > 4) && (cif->rtype->size <= 8)) + /* Returned valued is stored to D1Re0|R0Re0 */ + cif->flags = (unsigned)FFI_TYPE_DOUBLE; + else + /* value stored in memory */ + cif->flags = (unsigned)FFI_TYPE_STRUCT; + break; + default: + cif->flags = (unsigned)FFI_TYPE_INT; + break; + } + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*fn)(void), extended_cif *, unsigned, unsigned, double *); + +/* + * Exported in API. Entry point + * cif -> ffi_cif object + * fn -> function pointer + * rvalue -> pointer to return value + * avalue -> vector of void * pointers pointing to memory locations holding the + * arguments + */ +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + int small_struct = (((cif->flags == FFI_TYPE_INT) || (cif->flags == FFI_TYPE_DOUBLE)) && (cif->rtype->type == FFI_TYPE_STRUCT)); + ecif.cif = cif; + ecif.avalue = avalue; + + double temp; + + /* + * If the return value is a struct and we don't have a return value address + * then we need to make one + */ + + if ((rvalue == NULL ) && (cif->flags == FFI_TYPE_STRUCT)) + ecif.rvalue = alloca(cif->rtype->size); + else if (small_struct) + ecif.rvalue = &temp; + else + ecif.rvalue = rvalue; + + switch (cif->abi) { + case FFI_SYSV: + ffi_call_SYSV(fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); + break; + default: + FFI_ASSERT(0); + break; + } + + if (small_struct) + memcpy (rvalue, &temp, cif->rtype->size); +} + +/* private members */ + +static void ffi_prep_incoming_args_SYSV (char *, void **, void **, + ffi_cif*, float *); + +void ffi_closure_SYSV (ffi_closure *); + +/* Do NOT change that without changing the FFI_TRAMPOLINE_SIZE */ +extern unsigned int ffi_metag_trampoline[10]; /* 10 instructions */ + +/* end of private members */ + +/* + * __tramp: trampoline memory location + * __fun: assembly routine + * __ctx: memory location for wrapper + * + * At this point, tramp[0] == __ctx ! + */ +void ffi_init_trampoline(unsigned char *__tramp, unsigned int __fun, unsigned int __ctx) { + memcpy (__tramp, ffi_metag_trampoline, sizeof(ffi_metag_trampoline)); + *(unsigned int*) &__tramp[40] = __ctx; + *(unsigned int*) &__tramp[44] = __fun; + /* This will flush the instruction cache */ + __builtin_meta2_cachewd(&__tramp[0], 1); + __builtin_meta2_cachewd(&__tramp[47], 1); +} + + + +/* the cif must already be prepared */ + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + void (*closure_func)(ffi_closure*) = NULL; + + if (cif->abi == FFI_SYSV) + closure_func = &ffi_closure_SYSV; + else + return FFI_BAD_ABI; + + ffi_init_trampoline( + (unsigned char*)&closure->tramp[0], + (unsigned int)closure_func, + (unsigned int)codeloc); + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} + + +/* This function is jumped to by the trampoline */ +unsigned int ffi_closure_SYSV_inner (closure, respp, args, vfp_args) + ffi_closure *closure; + void **respp; + void *args; + void *vfp_args; +{ + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void**) alloca (cif->nargs * sizeof (void*)); + + /* + * This call will initialize ARG_AREA, such that each + * element in that array points to the corresponding + * value on the stack; and if the function returns + * a structure, it will re-set RESP to point to the + * structure return address. + */ + ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); + + (closure->fun) ( cif, *respp, arg_area, closure->user_data); + + return cif->flags; +} + +static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, + void **avalue, ffi_cif *cif, + float *vfp_stack) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + /* stack points to original arguments */ + argp = stack; + + /* Store return value */ + if ( cif->flags == FFI_TYPE_STRUCT ) { + argp -= 4; + *rvalue = *(void **) argp; + } + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) { + size_t z; + size_t alignment; + + alignment = (*p_arg)->alignment; + if (alignment < 4) + alignment = 4; + if ((alignment - 1) & (unsigned)argp) + argp = (char *) FFI_ALIGN(argp, alignment); + + z = (*p_arg)->size; + *p_argv = (void*) argp; + p_argv++; + argp -= z; + } + return; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/metag/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/metag/ffitarget.h new file mode 100644 index 000000000000..7b9dbebca869 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/metag/ffitarget.h @@ -0,0 +1,53 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2013 Imagination Technologies Ltd. + Target configuration macros for Meta + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_DEFAULT_ABI = FFI_SYSV, + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1, +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 48 +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/metag/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/metag/sysv.S new file mode 100644 index 000000000000..b4b2a3b26bbf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/metag/sysv.S @@ -0,0 +1,311 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2013 Imagination Technologies Ltd. + + Meta Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#ifdef HAVE_MACHINE_ASM_H +#include <machine/asm.h> +#else +#ifdef __USER_LABEL_PREFIX__ +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +/* Use the right prefix for global labels. */ +#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) +#else +#define CNAME(x) x +#endif +#define ENTRY(x) .globl CNAME(x); .type CNAME(x), %function; CNAME(x): +#endif + +#ifdef __ELF__ +#define LSYM(x) .x +#else +#define LSYM(x) x +#endif + +.macro call_reg x= + .text + .balign 4 + mov D1RtP, \x + swap D1RtP, PC +.endm + +! Save register arguments +.macro SAVE_ARGS + .text + .balign 4 + setl [A0StP++], D0Ar6, D1Ar5 + setl [A0StP++], D0Ar4, D1Ar3 + setl [A0StP++], D0Ar2, D1Ar1 +.endm + +! Save retrun, frame pointer and other regs +.macro SAVE_REGS regs= + .text + .balign 4 + setl [A0StP++], D0FrT, D1RtP + ! Needs to be a pair of regs + .ifnc "\regs","" + setl [A0StP++], \regs + .endif +.endm + +! Declare a global function +.macro METAG_FUNC_START name + .text + .balign 4 + ENTRY(\name) +.endm + +! Return registers from the stack. Reverse SAVE_REGS operation +.macro RET_REGS regs=, cond= + .ifnc "\regs", "" + getl \regs, [--A0StP] + .endif + getl D0FrT, D1RtP, [--A0StP] +.endm + +! Return arguments +.macro RET_ARGS + getl D0Ar2, D1Ar1, [--A0StP] + getl D0Ar4, D1Ar3, [--A0StP] + getl D0Ar6, D1Ar5, [--A0StP] +.endm + + + ! D1Ar1: fn + ! D0Ar2: &ecif + ! D1Ar3: cif->bytes + ! D0Ar4: fig->flags + ! D1Ar5: ecif.rvalue + + ! This assumes we are using GNU as +METAG_FUNC_START ffi_call_SYSV + ! Save argument registers + + SAVE_ARGS + + ! new frame + mov D0FrT, A0FrP + add A0FrP, A0StP, #0 + + ! Preserve the old frame pointer + SAVE_REGS "D1.5, D0.5" + + ! Make room for new args. cifs->bytes is the total space for input + ! and return arguments + + add A0StP, A0StP, D1Ar3 + + ! Preserve cifs->bytes & fn + mov D0.5, D1Ar3 + mov D1.5, D1Ar1 + + ! Place all of the ffi_prep_args in position + mov D1Ar1, A0StP + + ! Call ffi_prep_args(stack, &ecif) +#ifdef __PIC__ + callr D1RtP, CNAME(ffi_prep_args@PLT) +#else + callr D1RtP, CNAME(ffi_prep_args) +#endif + + ! Restore fn pointer + + ! The foreign stack should look like this + ! XXXXX XXXXXX <--- stack pointer + ! FnArgN rvalue + ! FnArgN+2 FnArgN+1 + ! FnArgN+4 FnArgN+3 + ! .... + ! + + ! A0StP now points to the first (or return) argument + 4 + + ! Preserve cif->bytes + getl D0Ar2, D1Ar1, [--A0StP] + getl D0Ar4, D1Ar3, [--A0StP] + getl D0Ar6, D1Ar5, [--A0StP] + + ! Place A0StP to the first argument again + add A0StP, A0StP, #24 ! That's because we loaded 6 regs x 4 byte each + + ! A0FrP points to the initial stack without the reserved space for the + ! cifs->bytes, whilst A0StP points to the stack after the space allocation + + ! fn was the first argument of ffi_call_SYSV. + ! The stack at this point looks like this: + ! + ! A0StP(on entry to _SYSV) -> Arg6 Arg5 | low + ! Arg4 Arg3 | + ! Arg2 Arg1 | + ! A0FrP ----> D0FrtP D1RtP | + ! D1.5 D0.5 | + ! A0StP(bf prep_args) -> FnArgn FnArgn-1 | + ! FnArgn-2FnArgn-3 | + ! ................ | <= cifs->bytes + ! FnArg4 FnArg3 | + ! A0StP (prv_A0StP+cifs->bytes) FnArg2 FnArg1 | high + ! + ! fn was in Arg1 so it's located in in A0FrP+#-0xC + ! + + ! D0Re0 contains the size of arguments stored in registers + sub A0StP, A0StP, D0Re0 + + ! Arg1 is the function pointer for the foreign call. This has been + ! preserved in D1.5 + + ! Time to call (fn). Arguments should be like this: + ! Arg1-Arg6 are loaded to regs + ! The rest of the arguments are stored in stack pointed by A0StP + + call_reg D1.5 + + ! Reset stack. + + mov A0StP, A0FrP + + ! Load Arg1 with the pointer to storage for the return type + ! This was stored in Arg5 + + getd D1Ar1, [A0FrP+#-20] + + ! Load D0Ar2 with the return type code. This was stored in Arg4 (flags) + + getd D0Ar2, [A0FrP+#-16] + + ! We are ready to start processing the return value + ! D0Re0 (and D1Re0) hold the return value + + ! If the return value is NULL, assume no return value + cmp D1Ar1, #0 + beq LSYM(Lepilogue) + + ! return INT + cmp D0Ar2, #FFI_TYPE_INT + ! Sadly, there is no setd{cc} instruction so we need to workaround that + bne .INT64 + setd [D1Ar1], D0Re0 + b LSYM(Lepilogue) + + ! return INT64 +.INT64: + cmp D0Ar2, #FFI_TYPE_SINT64 + setleq [D1Ar1], D0Re0, D1Re0 + + ! return DOUBLE + cmp D0Ar2, #FFI_TYPE_DOUBLE + setl [D1AR1++], D0Re0, D1Re0 + +LSYM(Lepilogue): + ! At this point, the stack pointer points right after the argument + ! saved area. We need to restore 4 regs, therefore we need to move + ! 16 bytes ahead. + add A0StP, A0StP, #16 + RET_REGS "D1.5, D0.5" + RET_ARGS + getd D0Re0, [A0StP] + mov A0FrP, D0FrT + swap D1RtP, PC + +.ffi_call_SYSV_end: + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) + + +/* + (called by ffi_metag_trampoline) + void ffi_closure_SYSV (ffi_closure*) + + (called by ffi_closure_SYSV) + unsigned int FFI_HIDDEN + ffi_closure_SYSV_inner (closure,respp, args) + ffi_closure *closure; + void **respp; + void *args; +*/ + +METAG_FUNC_START ffi_closure_SYSV + ! We assume that D1Ar1 holds the address of the + ! ffi_closure struct. We will use that to fetch the + ! arguments. The stack pointer points to an empty space + ! and it is ready to store more data. + + ! D1Ar1 is ready + ! Allocate stack space for return value + add A0StP, A0StP, #8 + ! Store it to D0Ar2 + sub D0Ar2, A0StP, #8 + + sub D1Ar3, A0FrP, #4 + + ! D1Ar3 contains the address of the original D1Ar1 argument + ! We need to subtract #4 later on + + ! Preverve D0Ar2 + mov D0.5, D0Ar2 + +#ifdef __PIC__ + callr D1RtP, CNAME(ffi_closure_SYSV_inner@PLT) +#else + callr D1RtP, CNAME(ffi_closure_SYSV_inner) +#endif + + ! Check the return value and store it to D0.5 + cmp D0Re0, #FFI_TYPE_INT + beq .Lretint + cmp D0Re0, #FFI_TYPE_DOUBLE + beq .Lretdouble +.Lclosure_epilogue: + sub A0StP, A0StP, #8 + RET_REGS "D1.5, D0.5" + RET_ARGS + swap D1RtP, PC + +.Lretint: + setd [D0.5], D0Re0 + b .Lclosure_epilogue +.Lretdouble: + setl [D0.5++], D0Re0, D1Re0 + b .Lclosure_epilogue +.ffi_closure_SYSV_end: +.size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) + + +ENTRY(ffi_metag_trampoline) + SAVE_ARGS + ! New frame + mov A0FrP, A0StP + SAVE_REGS "D1.5, D0.5" + mov D0.5, PC + ! Load D1Ar1 the value of ffi_metag_trampoline + getd D1Ar1, [D0.5 + #8] + ! Jump to ffi_closure_SYSV + getd PC, [D0.5 + #12] diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/microblaze/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/microblaze/ffi.c new file mode 100644 index 000000000000..df6e33c97d4c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/microblaze/ffi.c @@ -0,0 +1,321 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2012, 2013 Xilinx, Inc + + MicroBlaze Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +extern void ffi_call_SYSV(void (*)(void*, extended_cif*), extended_cif*, + unsigned int, unsigned int, unsigned int*, void (*fn)(void), + unsigned int, unsigned int); + +extern void ffi_closure_SYSV(void); + +#define WORD_SIZE sizeof(unsigned int) +#define ARGS_REGISTER_SIZE (WORD_SIZE * 6) +#define WORD_FFI_ALIGN(x) FFI_ALIGN(x, WORD_SIZE) + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ +void ffi_prep_args(void* stack, extended_cif* ecif) +{ + unsigned int i; + ffi_type** p_arg; + void** p_argv; + void* stack_args_p = stack; + + if (ecif == NULL || ecif->cif == NULL) { + return; /* no description to prepare */ + } + + p_argv = ecif->avalue; + + if ((ecif->cif->rtype != NULL) && + (ecif->cif->rtype->type == FFI_TYPE_STRUCT)) + { + /* if return type is a struct which is referenced on the stack/reg5, + * by a pointer. Stored the return value pointer in r5. + */ + char* addr = stack_args_p; + memcpy(addr, &(ecif->rvalue), WORD_SIZE); + stack_args_p += WORD_SIZE; + } + + if (ecif->avalue == NULL) { + return; /* no arguments to prepare */ + } + + for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; + i++, p_arg++) + { + size_t size = (*p_arg)->size; + int type = (*p_arg)->type; + void* value = p_argv[i]; + char* addr = stack_args_p; + int aligned_size = WORD_FFI_ALIGN(size); + + /* force word alignment on the stack */ + stack_args_p += aligned_size; + + switch (type) + { + case FFI_TYPE_UINT8: + *(unsigned int *)addr = (unsigned int)*(UINT8*)(value); + break; + case FFI_TYPE_SINT8: + *(signed int *)addr = (signed int)*(SINT8*)(value); + break; + case FFI_TYPE_UINT16: + *(unsigned int *)addr = (unsigned int)*(UINT16*)(value); + break; + case FFI_TYPE_SINT16: + *(signed int *)addr = (signed int)*(SINT16*)(value); + break; + case FFI_TYPE_STRUCT: +#if __BIG_ENDIAN__ + /* + * MicroBlaze toolchain appears to emit: + * bsrli r5, r5, 8 (caller) + * ... + * <branch to callee> + * ... + * bslli r5, r5, 8 (callee) + * + * For structs like "struct a { uint8_t a[3]; };", when passed + * by value. + * + * Structs like "struct b { uint16_t a; };" are also expected + * to be packed strangely in registers. + * + * This appears to be because the microblaze toolchain expects + * "struct b == uint16_t", which is only any issue for big + * endian. + * + * The following is a work around for big-endian only, for the + * above mentioned case, it will re-align the contents of a + * <= 3-byte struct value. + */ + if (size < WORD_SIZE) + { + memcpy (addr + (WORD_SIZE - size), value, size); + break; + } +#endif + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: + default: + memcpy(addr, value, aligned_size); + } + } +} + +ffi_status ffi_prep_cif_machdep(ffi_cif* cif) +{ + /* check ABI */ + switch (cif->abi) + { + case FFI_SYSV: + break; + default: + return FFI_BAD_ABI; + } + return FFI_OK; +} + +void ffi_call(ffi_cif* cif, void (*fn)(void), void* rvalue, void** avalue) +{ + extended_cif ecif; + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { + ecif.rvalue = alloca(cif->rtype->size); + } else { + ecif.rvalue = rvalue; + } + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, + ecif.rvalue, fn, cif->rtype->type, cif->rtype->size); + break; + default: + FFI_ASSERT(0); + break; + } +} + +void ffi_closure_call_SYSV(void* register_args, void* stack_args, + ffi_closure* closure, void* rvalue, + unsigned int* rtype, unsigned int* rsize) +{ + /* prepare arguments for closure call */ + ffi_cif* cif = closure->cif; + ffi_type** arg_types = cif->arg_types; + + /* re-allocate data for the args. This needs to be done in order to keep + * multi-word objects (e.g. structs) in contiguous memory. Callers are not + * required to store the value of args in the lower 6 words in the stack + * (although they are allocated in the stack). + */ + char* stackclone = alloca(cif->bytes); + void** avalue = alloca(cif->nargs * sizeof(void*)); + void* struct_rvalue = NULL; + char* ptr = stackclone; + int i; + + /* copy registers into stack clone */ + int registers_used = cif->bytes; + if (registers_used > ARGS_REGISTER_SIZE) { + registers_used = ARGS_REGISTER_SIZE; + } + memcpy(stackclone, register_args, registers_used); + + /* copy stack allocated args into stack clone */ + if (cif->bytes > ARGS_REGISTER_SIZE) { + int stack_used = cif->bytes - ARGS_REGISTER_SIZE; + memcpy(stackclone + ARGS_REGISTER_SIZE, stack_args, stack_used); + } + + /* preserve struct type return pointer passing */ + if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { + struct_rvalue = *((void**)ptr); + ptr += WORD_SIZE; + } + + /* populate arg pointer list */ + for (i = 0; i < cif->nargs; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: +#ifdef __BIG_ENDIAN__ + avalue[i] = ptr + 3; +#else + avalue[i] = ptr; +#endif + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: +#ifdef __BIG_ENDIAN__ + avalue[i] = ptr + 2; +#else + avalue[i] = ptr; +#endif + break; + case FFI_TYPE_STRUCT: +#if __BIG_ENDIAN__ + /* + * Work around strange ABI behaviour. + * (see info in ffi_prep_args) + */ + if (arg_types[i]->size < WORD_SIZE) + { + memcpy (ptr, ptr + (WORD_SIZE - arg_types[i]->size), arg_types[i]->size); + } +#endif + avalue[i] = (void*)ptr; + break; + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + avalue[i] = ptr; + break; + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + default: + /* default 4-byte argument */ + avalue[i] = ptr; + break; + } + ptr += WORD_FFI_ALIGN(arg_types[i]->size); + } + + /* set the return type info passed back to the wrapper */ + *rsize = cif->rtype->size; + *rtype = cif->rtype->type; + if (struct_rvalue != NULL) { + closure->fun(cif, struct_rvalue, avalue, closure->user_data); + /* copy struct return pointer value into function return value */ + *((void**)rvalue) = struct_rvalue; + } else { + closure->fun(cif, rvalue, avalue, closure->user_data); + } +} + +ffi_status ffi_prep_closure_loc( + ffi_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void* user_data, void* codeloc) +{ + unsigned long* tramp = (unsigned long*)&(closure->tramp[0]); + unsigned long cls = (unsigned long)codeloc; + unsigned long fn = 0; + unsigned long fn_closure_call_sysv = (unsigned long)ffi_closure_call_SYSV; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + switch (cif->abi) + { + case FFI_SYSV: + fn = (unsigned long)ffi_closure_SYSV; + + /* load r11 (temp) with fn */ + /* imm fn(upper) */ + tramp[0] = 0xb0000000 | ((fn >> 16) & 0xffff); + /* addik r11, r0, fn(lower) */ + tramp[1] = 0x31600000 | (fn & 0xffff); + + /* load r12 (temp) with cls */ + /* imm cls(upper) */ + tramp[2] = 0xb0000000 | ((cls >> 16) & 0xffff); + /* addik r12, r0, cls(lower) */ + tramp[3] = 0x31800000 | (cls & 0xffff); + + /* load r3 (temp) with ffi_closure_call_SYSV */ + /* imm fn_closure_call_sysv(upper) */ + tramp[4] = 0xb0000000 | ((fn_closure_call_sysv >> 16) & 0xffff); + /* addik r3, r0, fn_closure_call_sysv(lower) */ + tramp[5] = 0x30600000 | (fn_closure_call_sysv & 0xffff); + /* branch/jump to address stored in r11 (fn) */ + tramp[6] = 0x98085800; /* bra r11 */ + + break; + default: + return FFI_BAD_ABI; + } + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/microblaze/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/microblaze/ffitarget.h new file mode 100644 index 000000000000..c6fa5a4115d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/microblaze/ffitarget.h @@ -0,0 +1,53 @@ +/* ----------------------------------------------------------------------- + ffitarget.h - Copyright (c) 2012, 2013 Xilinx, Inc + + Target configuration macros for MicroBlaze. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +/* Definitions for closures */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +#define FFI_TRAMPOLINE_SIZE (4*8) + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/microblaze/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/microblaze/sysv.S new file mode 100644 index 000000000000..ea43e9d54539 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/microblaze/sysv.S @@ -0,0 +1,302 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2012, 2013 Xilinx, Inc + + MicroBlaze Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + /* + * arg[0] (r5) = ffi_prep_args, + * arg[1] (r6) = &ecif, + * arg[2] (r7) = cif->bytes, + * arg[3] (r8) = cif->flags, + * arg[4] (r9) = ecif.rvalue, + * arg[5] (r10) = fn + * arg[6] (sp[0]) = cif->rtype->type + * arg[7] (sp[4]) = cif->rtype->size + */ + .text + .globl ffi_call_SYSV + .type ffi_call_SYSV, @function +ffi_call_SYSV: + /* push callee saves */ + addik r1, r1, -20 + swi r19, r1, 0 /* Frame Pointer */ + swi r20, r1, 4 /* PIC register */ + swi r21, r1, 8 /* PIC register */ + swi r22, r1, 12 /* save for locals */ + swi r23, r1, 16 /* save for locals */ + + /* save the r5-r10 registers in the stack */ + addik r1, r1, -24 /* increment sp to store 6x 32-bit words */ + swi r5, r1, 0 + swi r6, r1, 4 + swi r7, r1, 8 + swi r8, r1, 12 + swi r9, r1, 16 + swi r10, r1, 20 + + /* save function pointer */ + addik r3, r5, 0 /* copy ffi_prep_args into r3 */ + addik r22, r1, 0 /* save sp for unallocated args into r22 (callee-saved) */ + addik r23, r10, 0 /* save function address into r23 (callee-saved) */ + + /* prepare stack with allocation for n (bytes = r7) args */ + rsub r1, r7, r1 /* subtract bytes from sp */ + + /* prep args for ffi_prep_args call */ + addik r5, r1, 0 /* store stack pointer into arg[0] */ + /* r6 still holds ecif for arg[1] */ + + /* Call ffi_prep_args(stack, &ecif). */ + addik r1, r1, -4 + swi r15, r1, 0 /* store the link register in the frame */ + brald r15, r3 + nop /* branch has delay slot */ + lwi r15, r1, 0 + addik r1, r1, 4 /* restore the link register from the frame */ + /* returns calling stack pointer location */ + + /* prepare args for fn call, prep_args populates them onto the stack */ + lwi r5, r1, 0 /* arg[0] */ + lwi r6, r1, 4 /* arg[1] */ + lwi r7, r1, 8 /* arg[2] */ + lwi r8, r1, 12 /* arg[3] */ + lwi r9, r1, 16 /* arg[4] */ + lwi r10, r1, 20 /* arg[5] */ + + /* call (fn) (...). */ + addik r1, r1, -4 + swi r15, r1, 0 /* store the link register in the frame */ + brald r15, r23 + nop /* branch has delay slot */ + lwi r15, r1, 0 + addik r1, r1, 4 /* restore the link register from the frame */ + + /* Remove the space we pushed for the args. */ + addik r1, r22, 0 /* restore old SP */ + + /* restore this functions parameters */ + lwi r5, r1, 0 /* arg[0] */ + lwi r6, r1, 4 /* arg[1] */ + lwi r7, r1, 8 /* arg[2] */ + lwi r8, r1, 12 /* arg[3] */ + lwi r9, r1, 16 /* arg[4] */ + lwi r10, r1, 20 /* arg[5] */ + addik r1, r1, 24 /* decrement sp to de-allocate 6x 32-bit words */ + + /* If the return value pointer is NULL, assume no return value. */ + beqi r9, ffi_call_SYSV_end + + lwi r22, r1, 48 /* get return type (20 for locals + 28 for arg[6]) */ + lwi r23, r1, 52 /* get return size (20 for locals + 32 for arg[7]) */ + + /* Check if return type is actually a struct, do nothing */ + rsubi r11, r22, FFI_TYPE_STRUCT + beqi r11, ffi_call_SYSV_end + + /* Return 8bit */ + rsubi r11, r23, 1 + beqi r11, ffi_call_SYSV_store8 + + /* Return 16bit */ + rsubi r11, r23, 2 + beqi r11, ffi_call_SYSV_store16 + + /* Return 32bit */ + rsubi r11, r23, 4 + beqi r11, ffi_call_SYSV_store32 + + /* Return 64bit */ + rsubi r11, r23, 8 + beqi r11, ffi_call_SYSV_store64 + + /* Didn't match anything */ + bri ffi_call_SYSV_end + +ffi_call_SYSV_store64: + swi r3, r9, 0 /* store word r3 into return value */ + swi r4, r9, 4 /* store word r4 into return value */ + bri ffi_call_SYSV_end + +ffi_call_SYSV_store32: + swi r3, r9, 0 /* store word r3 into return value */ + bri ffi_call_SYSV_end + +ffi_call_SYSV_store16: +#ifdef __BIG_ENDIAN__ + shi r3, r9, 2 /* store half-word r3 into return value */ +#else + shi r3, r9, 0 /* store half-word r3 into return value */ +#endif + bri ffi_call_SYSV_end + +ffi_call_SYSV_store8: +#ifdef __BIG_ENDIAN__ + sbi r3, r9, 3 /* store byte r3 into return value */ +#else + sbi r3, r9, 0 /* store byte r3 into return value */ +#endif + bri ffi_call_SYSV_end + +ffi_call_SYSV_end: + /* callee restores */ + lwi r19, r1, 0 /* frame pointer */ + lwi r20, r1, 4 /* PIC register */ + lwi r21, r1, 8 /* PIC register */ + lwi r22, r1, 12 + lwi r23, r1, 16 + addik r1, r1, 20 + + /* return from sub-routine (with delay slot) */ + rtsd r15, 8 + nop + + .size ffi_call_SYSV, . - ffi_call_SYSV + +/* ------------------------------------------------------------------------- */ + + /* + * args passed into this function, are passed down to the callee. + * this function is the target of the closure trampoline, as such r12 is + * a pointer to the closure object. + */ + .text + .globl ffi_closure_SYSV + .type ffi_closure_SYSV, @function +ffi_closure_SYSV: + /* push callee saves */ + addik r11, r1, 28 /* save stack args start location (excluding regs/link) */ + addik r1, r1, -12 + swi r19, r1, 0 /* Frame Pointer */ + swi r20, r1, 4 /* PIC register */ + swi r21, r1, 8 /* PIC register */ + + /* store register args on stack */ + addik r1, r1, -24 + swi r5, r1, 0 + swi r6, r1, 4 + swi r7, r1, 8 + swi r8, r1, 12 + swi r9, r1, 16 + swi r10, r1, 20 + + /* setup args */ + addik r5, r1, 0 /* register_args */ + addik r6, r11, 0 /* stack_args */ + addik r7, r12, 0 /* closure object */ + addik r1, r1, -8 /* allocate return value */ + addik r8, r1, 0 /* void* rvalue */ + addik r1, r1, -8 /* allocate for return type/size values */ + addik r9, r1, 0 /* void* rtype */ + addik r10, r1, 4 /* void* rsize */ + + /* call the wrap_call function */ + addik r1, r1, -28 /* allocate args + link reg */ + swi r15, r1, 0 /* store the link register in the frame */ + brald r15, r3 + nop /* branch has delay slot */ + lwi r15, r1, 0 + addik r1, r1, 28 /* restore the link register from the frame */ + +ffi_closure_SYSV_prepare_return: + lwi r9, r1, 0 /* rtype */ + lwi r10, r1, 4 /* rsize */ + addik r1, r1, 8 /* de-allocate return info values */ + + /* Check if return type is actually a struct, store 4 bytes */ + rsubi r11, r9, FFI_TYPE_STRUCT + beqi r11, ffi_closure_SYSV_store32 + + /* Return 8bit */ + rsubi r11, r10, 1 + beqi r11, ffi_closure_SYSV_store8 + + /* Return 16bit */ + rsubi r11, r10, 2 + beqi r11, ffi_closure_SYSV_store16 + + /* Return 32bit */ + rsubi r11, r10, 4 + beqi r11, ffi_closure_SYSV_store32 + + /* Return 64bit */ + rsubi r11, r10, 8 + beqi r11, ffi_closure_SYSV_store64 + + /* Didn't match anything */ + bri ffi_closure_SYSV_end + +ffi_closure_SYSV_store64: + lwi r3, r1, 0 /* store word r3 into return value */ + lwi r4, r1, 4 /* store word r4 into return value */ + /* 64 bits == 2 words, no sign extend occurs */ + bri ffi_closure_SYSV_end + +ffi_closure_SYSV_store32: + lwi r3, r1, 0 /* store word r3 into return value */ + /* 32 bits == 1 word, no sign extend occurs */ + bri ffi_closure_SYSV_end + +ffi_closure_SYSV_store16: +#ifdef __BIG_ENDIAN__ + lhui r3, r1, 2 /* store half-word r3 into return value */ +#else + lhui r3, r1, 0 /* store half-word r3 into return value */ +#endif + rsubi r11, r9, FFI_TYPE_SINT16 + bnei r11, ffi_closure_SYSV_end + sext16 r3, r3 /* fix sign extend of sint8 */ + bri ffi_closure_SYSV_end + +ffi_closure_SYSV_store8: +#ifdef __BIG_ENDIAN__ + lbui r3, r1, 3 /* store byte r3 into return value */ +#else + lbui r3, r1, 0 /* store byte r3 into return value */ +#endif + rsubi r11, r9, FFI_TYPE_SINT8 + bnei r11, ffi_closure_SYSV_end + sext8 r3, r3 /* fix sign extend of sint8 */ + bri ffi_closure_SYSV_end + +ffi_closure_SYSV_end: + addik r1, r1, 8 /* de-allocate return value */ + + /* de-allocate stored args */ + addik r1, r1, 24 + + /* callee restores */ + lwi r19, r1, 0 /* frame pointer */ + lwi r20, r1, 4 /* PIC register */ + lwi r21, r1, 8 /* PIC register */ + addik r1, r1, 12 + + /* return from sub-routine (with delay slot) */ + rtsd r15, 8 + nop + + .size ffi_closure_SYSV, . - ffi_closure_SYSV diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/ffi.c new file mode 100644 index 000000000000..979ca49f1bd6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/ffi.c @@ -0,0 +1,1134 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011 Anthony Green + Copyright (c) 2008 David Daney + Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc. + + MIPS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdint.h> +#include <stdlib.h> + +#ifdef __GNUC__ +# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) +# define USE__BUILTIN___CLEAR_CACHE 1 +# endif +#endif + +#ifndef USE__BUILTIN___CLEAR_CACHE +# if defined(__FreeBSD__) +# include <machine/sysarch.h> +# elif defined(__OpenBSD__) +# include <mips64/sysarch.h> +# else +# include <sys/cachectl.h> +# endif +#endif + +#ifdef FFI_DEBUG +# define FFI_MIPS_STOP_HERE() ffi_stop_here() +#else +# define FFI_MIPS_STOP_HERE() do {} while(0) +#endif + +#ifdef FFI_MIPS_N32 +#define FIX_ARGP \ +FFI_ASSERT(argp <= &stack[bytes]); \ +if (argp == &stack[bytes]) \ +{ \ + argp = stack; \ + FFI_MIPS_STOP_HERE(); \ +} +#else +#define FIX_ARGP +#endif + + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +static void ffi_prep_args(char *stack, + extended_cif *ecif, + int bytes, + int flags) +{ + int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + +#ifdef FFI_MIPS_N32 + /* If more than 8 double words are used, the remainder go + on the stack. We reorder stuff on the stack here to + support this easily. */ + if (bytes > 8 * sizeof(ffi_arg)) + argp = &stack[bytes - (8 * sizeof(ffi_arg))]; + else + argp = stack; +#else + argp = stack; +#endif + + memset(stack, 0, bytes); + +#ifdef FFI_MIPS_N32 + if ( ecif->cif->rstruct_flag != 0 ) +#else + if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) +#endif + { + *(ffi_arg *) argp = (ffi_arg) ecif->rvalue; + argp += sizeof(ffi_arg); + FIX_ARGP; + } + + p_argv = ecif->avalue; + + for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++) + { + size_t z; + unsigned int a; + + /* Align if necessary. */ + a = (*p_arg)->alignment; + if (a < sizeof(ffi_arg)) + a = sizeof(ffi_arg); + + if ((a - 1) & (unsigned long) argp) + { + argp = (char *) FFI_ALIGN(argp, a); + FIX_ARGP; + } + + z = (*p_arg)->size; + if (z <= sizeof(ffi_arg)) + { + int type = (*p_arg)->type; + z = sizeof(ffi_arg); + + /* The size of a pointer depends on the ABI */ + if (type == FFI_TYPE_POINTER) + type = (ecif->cif->abi == FFI_N64 + || ecif->cif->abi == FFI_N64_SOFT_FLOAT) + ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; + + if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT + || ecif->cif->abi == FFI_N64_SOFT_FLOAT)) + { + switch (type) + { + case FFI_TYPE_FLOAT: + type = FFI_TYPE_UINT32; + break; + case FFI_TYPE_DOUBLE: + type = FFI_TYPE_UINT64; + break; + default: + break; + } + } + switch (type) + { + case FFI_TYPE_SINT8: + *(ffi_arg *)argp = *(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(ffi_arg *)argp = *(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(ffi_arg *)argp = *(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(ffi_arg *)argp = *(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_SINT32: + *(ffi_arg *)argp = *(SINT32 *)(* p_argv); + break; + + case FFI_TYPE_UINT32: +#ifdef FFI_MIPS_N32 + /* The N32 ABI requires that 32-bit integers + be sign-extended to 64-bits, regardless of + whether they are signed or unsigned. */ + *(ffi_arg *)argp = *(SINT32 *)(* p_argv); +#else + *(ffi_arg *)argp = *(UINT32 *)(* p_argv); +#endif + break; + + /* This can only happen with 64bit slots. */ + case FFI_TYPE_FLOAT: + *(float *) argp = *(float *)(* p_argv); + break; + + /* Handle structures. */ + default: + memcpy(argp, *p_argv, (*p_arg)->size); + break; + } + } + else + { +#ifdef FFI_MIPS_O32 + memcpy(argp, *p_argv, z); +#else + { + unsigned long end = (unsigned long) argp + z; + unsigned long cap = (unsigned long) stack + bytes; + + /* Check if the data will fit within the register space. + Handle it if it doesn't. */ + + if (end <= cap) + memcpy(argp, *p_argv, z); + else + { + unsigned long portion = cap - (unsigned long)argp; + + memcpy(argp, *p_argv, portion); + argp = stack; + z -= portion; + memcpy(argp, (void*)((unsigned long)(*p_argv) + portion), + z); + } + } +#endif + } + p_argv++; + argp += z; + FIX_ARGP; + } +} + +#ifdef FFI_MIPS_N32 + +/* The n32 spec says that if "a chunk consists solely of a double + float field (but not a double, which is part of a union), it + is passed in a floating point register. Any other chunk is + passed in an integer register". This code traverses structure + definitions and generates the appropriate flags. */ + +static unsigned +calc_n32_struct_flags(int soft_float, ffi_type *arg, + unsigned *loc, unsigned *arg_reg) +{ + unsigned flags = 0; + unsigned index = 0; + + ffi_type *e; + + if (soft_float) + return 0; + + while ((e = arg->elements[index])) + { + /* Align this object. */ + *loc = FFI_ALIGN(*loc, e->alignment); + if (e->type == FFI_TYPE_DOUBLE) + { + /* Already aligned to FFI_SIZEOF_ARG. */ + *arg_reg = *loc / FFI_SIZEOF_ARG; + if (*arg_reg > 7) + break; + flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS)); + *loc += e->size; + } + else + *loc += e->size; + index++; + } + /* Next Argument register at alignment of FFI_SIZEOF_ARG. */ + *arg_reg = FFI_ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + + return flags; +} + +static unsigned +calc_n32_return_struct_flags(int soft_float, ffi_type *arg) +{ + unsigned flags = 0; + unsigned small = FFI_TYPE_SMALLSTRUCT; + ffi_type *e; + + /* Returning structures under n32 is a tricky thing. + A struct with only one or two floating point fields + is returned in $f0 (and $f2 if necessary). Any other + struct results at most 128 bits are returned in $2 + (the first 64 bits) and $3 (remainder, if necessary). + Larger structs are handled normally. */ + + if (arg->size > 16) + return 0; + + if (arg->size > 8) + small = FFI_TYPE_SMALLSTRUCT2; + + e = arg->elements[0]; + + if (e->type == FFI_TYPE_DOUBLE) + flags = FFI_TYPE_DOUBLE; + else if (e->type == FFI_TYPE_FLOAT) + flags = FFI_TYPE_FLOAT; + + if (flags && (e = arg->elements[1])) + { + if (e->type == FFI_TYPE_DOUBLE) + flags += FFI_TYPE_DOUBLE << FFI_FLAG_BITS; + else if (e->type == FFI_TYPE_FLOAT) + flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS; + else + return small; + + if (flags && (arg->elements[2])) + { + /* There are three arguments and the first two are + floats! This must be passed the old way. */ + return small; + } + if (soft_float) + flags += FFI_TYPE_STRUCT_SOFT; + } + else + if (!flags) + return small; + + return flags; +} + +#endif + +/* Perform machine dependent cif processing */ +static ffi_status ffi_prep_cif_machdep_int(ffi_cif *cif, unsigned nfixedargs) +{ + cif->flags = 0; + cif->mips_nfixedargs = nfixedargs; + +#ifdef FFI_MIPS_O32 + /* Set the flags necessary for O32 processing. FFI_O32_SOFT_FLOAT + * does not have special handling for floating point args. + */ + + if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32) + { + if (cif->nargs > 0 && cif->nargs == nfixedargs) + { + switch ((cif->arg_types)[0]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags += (cif->arg_types)[0]->type; + break; + + default: + break; + } + + if (cif->nargs > 1) + { + /* Only handle the second argument if the first + is a float or double. */ + if (cif->flags) + { + switch ((cif->arg_types)[1]->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags += (cif->arg_types)[1]->type << FFI_FLAG_BITS; + break; + + default: + break; + } + } + } + } + } + + /* Set the return type flag */ + + if (cif->abi == FFI_O32_SOFT_FLOAT) + { + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: + cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); + break; + + case FFI_TYPE_FLOAT: + default: + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); + break; + } + } + else + { + /* FFI_O32 */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); + break; + + default: + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); + break; + } + } +#endif + +#ifdef FFI_MIPS_N32 + /* Set the flags necessary for N32 processing */ + { + int type; + unsigned arg_reg = 0; + unsigned loc = 0; + unsigned count = (cif->nargs < 8) ? cif->nargs : 8; + unsigned index = 0; + + unsigned struct_flags = 0; + int soft_float = (cif->abi == FFI_N32_SOFT_FLOAT + || cif->abi == FFI_N64_SOFT_FLOAT); + + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + struct_flags = calc_n32_return_struct_flags(soft_float, cif->rtype); + + if (struct_flags == 0) + { + /* This means that the structure is being passed as + a hidden argument */ + + arg_reg = 1; + count = (cif->nargs < 7) ? cif->nargs : 7; + + cif->rstruct_flag = !0; + } + else + cif->rstruct_flag = 0; + } + else + cif->rstruct_flag = 0; + + while (count-- > 0 && arg_reg < 8) + { + type = (cif->arg_types)[index]->type; + + // Pass variadic arguments in integer registers even if they're floats + if (soft_float || index >= nfixedargs) + { + switch (type) + { + case FFI_TYPE_FLOAT: + type = FFI_TYPE_UINT32; + break; + case FFI_TYPE_DOUBLE: + type = FFI_TYPE_UINT64; + break; + default: + break; + } + } + switch (type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags += + ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS)); + arg_reg++; + break; + case FFI_TYPE_LONGDOUBLE: + /* Align it. */ + arg_reg = FFI_ALIGN(arg_reg, 2); + /* Treat it as two adjacent doubles. */ + if (soft_float || index >= nfixedargs) + { + arg_reg += 2; + } + else + { + cif->flags += + (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); + arg_reg++; + cif->flags += + (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); + arg_reg++; + } + break; + + case FFI_TYPE_STRUCT: + loc = arg_reg * FFI_SIZEOF_ARG; + cif->flags += calc_n32_struct_flags(soft_float || index >= nfixedargs, + (cif->arg_types)[index], + &loc, &arg_reg); + break; + + default: + arg_reg++; + break; + } + + index++; + } + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_STRUCT: + { + if (struct_flags == 0) + { + /* The structure is returned through a hidden + first argument. Do nothing, 'cause FFI_TYPE_VOID + is 0 */ + } + else + { + /* The structure is returned via some tricky + mechanism */ + cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); + cif->flags += struct_flags << (4 + (FFI_FLAG_BITS * 8)); + } + break; + } + + case FFI_TYPE_VOID: + /* Do nothing, 'cause FFI_TYPE_VOID is 0 */ + break; + + case FFI_TYPE_POINTER: + if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32) + cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); + else + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); + break; + + case FFI_TYPE_FLOAT: + if (soft_float) + { + cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); + break; + } + /* else fall through */ + case FFI_TYPE_DOUBLE: + if (soft_float) + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); + else + cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8); + break; + + case FFI_TYPE_LONGDOUBLE: + /* Long double is returned as if it were a struct containing + two doubles. */ + if (soft_float) + { + cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); + cif->flags += FFI_TYPE_SMALLSTRUCT2 << (4 + (FFI_FLAG_BITS * 8)); + } + else + { + cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); + cif->flags += (FFI_TYPE_DOUBLE + + (FFI_TYPE_DOUBLE << FFI_FLAG_BITS)) + << (4 + (FFI_FLAG_BITS * 8)); + } + break; + default: + cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); + break; + } + } +#endif + + return FFI_OK; +} + +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + return ffi_prep_cif_machdep_int(cif, cif->nargs); +} + +ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, + unsigned nfixedargs, + unsigned ntotalargs MAYBE_UNUSED) +{ + return ffi_prep_cif_machdep_int(cif, nfixedargs); +} + +/* Low level routine for calling O32 functions */ +extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int), + extended_cif *, unsigned, + unsigned, unsigned *, void (*)(void), void *closure); + +/* Low level routine for calling N32 functions */ +extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int), + extended_cif *, unsigned, + unsigned, void *, void (*)(void), void *closure); + +void ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + ecif.rvalue = alloca(cif->rtype->size); + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { +#ifdef FFI_MIPS_O32 + case FFI_O32: + case FFI_O32_SOFT_FLOAT: + ffi_call_O32(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn, closure); + break; +#endif + +#ifdef FFI_MIPS_N32 + case FFI_N32: + case FFI_N32_SOFT_FLOAT: + case FFI_N64: + case FFI_N64_SOFT_FLOAT: + { + int copy_rvalue = 0; + int copy_offset = 0; + char *rvalue_copy = ecif.rvalue; + if (cif->rtype->type == FFI_TYPE_STRUCT && cif->rtype->size < 16) + { + /* For structures smaller than 16 bytes we clobber memory + in 8 byte increments. Make a copy so we don't clobber + the callers memory outside of the struct bounds. */ + rvalue_copy = alloca(16); + copy_rvalue = 1; + } + else if (cif->rtype->type == FFI_TYPE_FLOAT + && (cif->abi == FFI_N64_SOFT_FLOAT + || cif->abi == FFI_N32_SOFT_FLOAT)) + { + rvalue_copy = alloca (8); + copy_rvalue = 1; +#if defined(__MIPSEB__) || defined(_MIPSEB) + copy_offset = 4; +#endif + } + ffi_call_N32(ffi_prep_args, &ecif, cif->bytes, + cif->flags, rvalue_copy, fn, closure); + if (copy_rvalue) + memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size); + } + break; +#endif + + default: + FFI_ASSERT(0); + break; + } +} + +void +ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +void +ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} + + +#if FFI_CLOSURES +#if defined(FFI_MIPS_O32) +extern void ffi_closure_O32(void); +extern void ffi_go_closure_O32(void); +#else +extern void ffi_closure_N32(void); +extern void ffi_go_closure_N32(void); +#endif /* FFI_MIPS_O32 */ + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + void * fn; + char *clear_location = (char *) codeloc; + +#if defined(FFI_MIPS_O32) + if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) + return FFI_BAD_ABI; + fn = ffi_closure_O32; +#else +#if _MIPS_SIM ==_ABIN32 + if (cif->abi != FFI_N32 + && cif->abi != FFI_N32_SOFT_FLOAT) + return FFI_BAD_ABI; +#else + if (cif->abi != FFI_N64 + && cif->abi != FFI_N64_SOFT_FLOAT) + return FFI_BAD_ABI; +#endif + fn = ffi_closure_N32; +#endif /* FFI_MIPS_O32 */ + +#if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) + /* lui $25,high(fn) */ + tramp[0] = 0x3c190000 | ((unsigned)fn >> 16); + /* ori $25,low(fn) */ + tramp[1] = 0x37390000 | ((unsigned)fn & 0xffff); + /* lui $12,high(codeloc) */ + tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16); + /* jr $25 */ +#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) + tramp[3] = 0x03200008; +#else + tramp[3] = 0x03200009; +#endif + /* ori $12,low(codeloc) */ + tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff); +#else + /* N64 has a somewhat larger trampoline. */ + /* lui $25,high(fn) */ + tramp[0] = 0x3c190000 | ((unsigned long)fn >> 48); + /* lui $12,high(codeloc) */ + tramp[1] = 0x3c0c0000 | ((unsigned long)codeloc >> 48); + /* ori $25,mid-high(fn) */ + tramp[2] = 0x37390000 | (((unsigned long)fn >> 32 ) & 0xffff); + /* ori $12,mid-high(codeloc) */ + tramp[3] = 0x358c0000 | (((unsigned long)codeloc >> 32) & 0xffff); + /* dsll $25,$25,16 */ + tramp[4] = 0x0019cc38; + /* dsll $12,$12,16 */ + tramp[5] = 0x000c6438; + /* ori $25,mid-low(fn) */ + tramp[6] = 0x37390000 | (((unsigned long)fn >> 16 ) & 0xffff); + /* ori $12,mid-low(codeloc) */ + tramp[7] = 0x358c0000 | (((unsigned long)codeloc >> 16) & 0xffff); + /* dsll $25,$25,16 */ + tramp[8] = 0x0019cc38; + /* dsll $12,$12,16 */ + tramp[9] = 0x000c6438; + /* ori $25,low(fn) */ + tramp[10] = 0x37390000 | ((unsigned long)fn & 0xffff); + /* jr $25 */ +#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) + tramp[11] = 0x03200008; +#else + tramp[11] = 0x03200009; +#endif + /* ori $12,low(codeloc) */ + tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff); + +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + +#if !defined(__FreeBSD__) +#ifdef USE__BUILTIN___CLEAR_CACHE + __builtin___clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE); +#else + cacheflush (clear_location, FFI_TRAMPOLINE_SIZE, ICACHE); +#endif +#endif /* ! __FreeBSD__ */ + return FFI_OK; +} + +/* + * Decodes the arguments to a function, which will be stored on the + * stack. AR is the pointer to the beginning of the integer arguments + * (and, depending upon the arguments, some floating-point arguments + * as well). FPR is a pointer to the area where floating point + * registers have been saved, if any. + * + * RVALUE is the location where the function return value will be + * stored. CLOSURE is the prepared closure to invoke. + * + * This function should only be called from assembly, which is in + * turn called from a trampoline. + * + * Returns the function return type. + * + * Based on the similar routine for sparc. + */ +int +ffi_closure_mips_inner_O32 (ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *rvalue, ffi_arg *ar, + double *fpr) +{ + void **avaluep; + ffi_arg *avalue; + ffi_type **arg_types; + int i, avn, argn, seen_int; + + avalue = alloca (cif->nargs * sizeof (ffi_arg)); + avaluep = alloca (cif->nargs * sizeof (ffi_arg)); + + seen_int = (cif->abi == FFI_O32_SOFT_FLOAT) || (cif->mips_nfixedargs != cif->nargs); + argn = 0; + + if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT) + { + rvalue = (void *)(uintptr_t)ar[0]; + argn = 1; + seen_int = 1; + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + while (i < avn) + { + if (arg_types[i]->alignment == 8 && (argn & 0x1)) + argn++; + if (i < 2 && !seen_int && + (arg_types[i]->type == FFI_TYPE_FLOAT || + arg_types[i]->type == FFI_TYPE_DOUBLE || + arg_types[i]->type == FFI_TYPE_LONGDOUBLE)) + { +#if defined(__MIPSEB__) || defined(_MIPSEB) + if (arg_types[i]->type == FFI_TYPE_FLOAT) + avaluep[i] = ((char *) &fpr[i]) + sizeof (float); + else +#endif + avaluep[i] = (char *) &fpr[i]; + } + else + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + avaluep[i] = &avalue[i]; + *(SINT8 *) &avalue[i] = (SINT8) ar[argn]; + break; + + case FFI_TYPE_UINT8: + avaluep[i] = &avalue[i]; + *(UINT8 *) &avalue[i] = (UINT8) ar[argn]; + break; + + case FFI_TYPE_SINT16: + avaluep[i] = &avalue[i]; + *(SINT16 *) &avalue[i] = (SINT16) ar[argn]; + break; + + case FFI_TYPE_UINT16: + avaluep[i] = &avalue[i]; + *(UINT16 *) &avalue[i] = (UINT16) ar[argn]; + break; + + default: + avaluep[i] = (char *) &ar[argn]; + break; + } + seen_int = 1; + } + argn += FFI_ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + i++; + } + + /* Invoke the closure. */ + fun(cif, rvalue, avaluep, user_data); + + if (cif->abi == FFI_O32_SOFT_FLOAT) + { + switch (cif->rtype->type) + { + case FFI_TYPE_FLOAT: + return FFI_TYPE_INT; + case FFI_TYPE_DOUBLE: + return FFI_TYPE_UINT64; + default: + return cif->rtype->type; + } + } + else + { + return cif->rtype->type; + } +} + +#if defined(FFI_MIPS_N32) + +static void +copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type, + int argn, unsigned arg_offset, ffi_arg *ar, + ffi_arg *fpr, int soft_float) +{ + ffi_type **elt_typep = type->elements; + while(*elt_typep) + { + ffi_type *elt_type = *elt_typep; + unsigned o; + char *tp; + char *argp; + char *fpp; + + o = FFI_ALIGN(offset, elt_type->alignment); + arg_offset += o - offset; + offset = o; + argn += arg_offset / sizeof(ffi_arg); + arg_offset = arg_offset % sizeof(ffi_arg); + + argp = (char *)(ar + argn); + fpp = (char *)(argn >= 8 ? ar + argn : fpr + argn); + + tp = target + offset; + + if (elt_type->type == FFI_TYPE_DOUBLE && !soft_float) + *(double *)tp = *(double *)fpp; + else + memcpy(tp, argp + arg_offset, elt_type->size); + + offset += elt_type->size; + arg_offset += elt_type->size; + elt_typep++; + argn += arg_offset / sizeof(ffi_arg); + arg_offset = arg_offset % sizeof(ffi_arg); + } +} + +/* + * Decodes the arguments to a function, which will be stored on the + * stack. AR is the pointer to the beginning of the integer + * arguments. FPR is a pointer to the area where floating point + * registers have been saved. + * + * RVALUE is the location where the function return value will be + * stored. CLOSURE is the prepared closure to invoke. + * + * This function should only be called from assembly, which is in + * turn called from a trampoline. + * + * Returns the function return flags. + * + */ +int +ffi_closure_mips_inner_N32 (ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *rvalue, ffi_arg *ar, + ffi_arg *fpr) +{ + void **avaluep; + ffi_arg *avalue; + ffi_type **arg_types; + int i, avn, argn; + int soft_float; + ffi_arg *argp; + + soft_float = cif->abi == FFI_N64_SOFT_FLOAT + || cif->abi == FFI_N32_SOFT_FLOAT; + avalue = alloca (cif->nargs * sizeof (ffi_arg)); + avaluep = alloca (cif->nargs * sizeof (ffi_arg)); + + argn = 0; + + if (cif->rstruct_flag) + { +#if _MIPS_SIM==_ABIN32 + rvalue = (void *)(UINT32)ar[0]; +#else /* N64 */ + rvalue = (void *)ar[0]; +#endif + argn = 1; + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + while (i < avn) + { + if (arg_types[i]->type == FFI_TYPE_FLOAT + || arg_types[i]->type == FFI_TYPE_DOUBLE + || arg_types[i]->type == FFI_TYPE_LONGDOUBLE) + { + argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn; + if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((uintptr_t)argp & (arg_types[i]->alignment-1))) + { + argp=(ffi_arg*)FFI_ALIGN(argp,arg_types[i]->alignment); + argn++; + } +#if defined(__MIPSEB__) || defined(_MIPSEB) + if (arg_types[i]->type == FFI_TYPE_FLOAT && argn < 8) + avaluep[i] = ((char *) argp) + sizeof (float); + else +#endif + avaluep[i] = (char *) argp; + } + else + { + unsigned type = arg_types[i]->type; + + if (arg_types[i]->alignment > sizeof(ffi_arg)) + argn = FFI_ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg)); + + argp = ar + argn; + + /* The size of a pointer depends on the ABI */ + if (type == FFI_TYPE_POINTER) + type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT) + ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; + + if (soft_float && type == FFI_TYPE_FLOAT) + type = FFI_TYPE_UINT32; + + switch (type) + { + case FFI_TYPE_SINT8: + avaluep[i] = &avalue[i]; + *(SINT8 *) &avalue[i] = (SINT8) *argp; + break; + + case FFI_TYPE_UINT8: + avaluep[i] = &avalue[i]; + *(UINT8 *) &avalue[i] = (UINT8) *argp; + break; + + case FFI_TYPE_SINT16: + avaluep[i] = &avalue[i]; + *(SINT16 *) &avalue[i] = (SINT16) *argp; + break; + + case FFI_TYPE_UINT16: + avaluep[i] = &avalue[i]; + *(UINT16 *) &avalue[i] = (UINT16) *argp; + break; + + case FFI_TYPE_SINT32: + avaluep[i] = &avalue[i]; + *(SINT32 *) &avalue[i] = (SINT32) *argp; + break; + + case FFI_TYPE_UINT32: + avaluep[i] = &avalue[i]; + *(UINT32 *) &avalue[i] = (UINT32) *argp; + break; + + case FFI_TYPE_STRUCT: + if (argn < 8) + { + /* Allocate space for the struct as at least part of + it was passed in registers. */ + avaluep[i] = alloca(arg_types[i]->size); + copy_struct_N32(avaluep[i], 0, cif->abi, arg_types[i], + argn, 0, ar, fpr, i >= cif->mips_nfixedargs || soft_float); + + break; + } + /* Else fall through. */ + default: + avaluep[i] = (char *) argp; + break; + } + } + argn += FFI_ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg); + i++; + } + + /* Invoke the closure. */ + fun (cif, rvalue, avaluep, user_data); + + return cif->flags >> (FFI_FLAG_BITS * 8); +} + +#endif /* FFI_MIPS_N32 */ + +#if defined(FFI_MIPS_O32) +extern void ffi_closure_O32(void); +extern void ffi_go_closure_O32(void); +#else +extern void ffi_closure_N32(void); +extern void ffi_go_closure_N32(void); +#endif /* FFI_MIPS_O32 */ + +ffi_status +ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*)) +{ + void * fn; + +#if defined(FFI_MIPS_O32) + if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) + return FFI_BAD_ABI; + fn = ffi_go_closure_O32; +#else +#if _MIPS_SIM ==_ABIN32 + if (cif->abi != FFI_N32 + && cif->abi != FFI_N32_SOFT_FLOAT) + return FFI_BAD_ABI; +#else + if (cif->abi != FFI_N64 + && cif->abi != FFI_N64_SOFT_FLOAT) + return FFI_BAD_ABI; +#endif + fn = ffi_go_closure_N32; +#endif /* FFI_MIPS_O32 */ + + closure->tramp = (void *)fn; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} + +#endif /* FFI_CLOSURES */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/ffitarget.h new file mode 100644 index 000000000000..fdd5ca90ac43 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/ffitarget.h @@ -0,0 +1,244 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for MIPS. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifdef __linux__ +# include <asm/sgidefs.h> +#elif defined(__rtems__) +/* + * Subprogram calling convention - copied from sgidefs.h + */ +#define _MIPS_SIM_ABI32 1 +#define _MIPS_SIM_NABI32 2 +#define _MIPS_SIM_ABI64 3 +#elif !defined(__OpenBSD__) && !defined(__FreeBSD__) +# include <sgidefs.h> +#endif + +# ifndef _ABIN32 +# define _ABIN32 _MIPS_SIM_NABI32 +# endif +# ifndef _ABI64 +# define _ABI64 _MIPS_SIM_ABI64 +# endif +# ifndef _ABIO32 +# define _ABIO32 _MIPS_SIM_ABI32 +# endif + +#if !defined(_MIPS_SIM) +# error -- something is very wrong -- +#else +# if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64)) +# define FFI_MIPS_N32 +# else +# if (_MIPS_SIM==_ABIO32 && defined(_ABIO32)) +# define FFI_MIPS_O32 +# else +# error -- this is an unsupported platform -- +# endif +# endif +#endif + +#ifdef FFI_MIPS_O32 +/* O32 stack frames have 32bit integer args */ +# define FFI_SIZEOF_ARG 4 +#else +/* N32 and N64 frames have 64bit integer args */ +# define FFI_SIZEOF_ARG 8 +# if _MIPS_SIM == _ABIN32 +# define FFI_SIZEOF_JAVA_RAW 4 +# endif +#endif + +#define FFI_FLAG_BITS 2 + +/* SGI's strange assembler requires that we multiply by 4 rather + than shift left by FFI_FLAG_BITS */ + +#define FFI_ARGS_D FFI_TYPE_DOUBLE +#define FFI_ARGS_F FFI_TYPE_FLOAT +#define FFI_ARGS_DD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE +#define FFI_ARGS_FF FFI_TYPE_FLOAT * 4 + FFI_TYPE_FLOAT +#define FFI_ARGS_FD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT +#define FFI_ARGS_DF FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE + +/* Needed for N32 structure returns */ +#define FFI_TYPE_SMALLSTRUCT FFI_TYPE_UINT8 +#define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8 + +#if 0 +/* The SGI assembler can't handle this.. */ +#define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT +/* (and so on) */ +#else +/* ...so we calculate these by hand! */ +#define FFI_TYPE_STRUCT_D 61 +#define FFI_TYPE_STRUCT_F 45 +#define FFI_TYPE_STRUCT_DD 253 +#define FFI_TYPE_STRUCT_FF 173 +#define FFI_TYPE_STRUCT_FD 237 +#define FFI_TYPE_STRUCT_DF 189 +#define FFI_TYPE_STRUCT_SMALL 93 +#define FFI_TYPE_STRUCT_SMALL2 109 + +/* and for n32 soft float, add 16 * 2^4 */ +#define FFI_TYPE_STRUCT_D_SOFT 317 +#define FFI_TYPE_STRUCT_F_SOFT 301 +#define FFI_TYPE_STRUCT_DD_SOFT 509 +#define FFI_TYPE_STRUCT_FF_SOFT 429 +#define FFI_TYPE_STRUCT_FD_SOFT 493 +#define FFI_TYPE_STRUCT_DF_SOFT 445 +#define FFI_TYPE_STRUCT_SOFT 16 +#endif + +#ifdef LIBFFI_ASM +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define a4 $8 +#define a5 $9 +#define a6 $10 +#define a7 $11 +#define t0 $8 +#define t1 $9 +#define t2 $10 +#define t3 $11 +#define t4 $12 +#define t5 $13 +#define t6 $14 +#define t7 $15 +#define t8 $24 +#define t9 $25 +#define ra $31 + +#ifdef FFI_MIPS_O32 +# define REG_L lw +# define REG_S sw +# define SUBU subu +# define ADDU addu +# define SRL srl +# define LI li +#else /* !FFI_MIPS_O32 */ +# define REG_L ld +# define REG_S sd +# define SUBU dsubu +# define ADDU daddu +# define SRL dsrl +# define LI dli +# if (_MIPS_SIM==_ABI64) +# define LA dla +# define EH_FRAME_ALIGN 3 +# define FDE_ADDR_BYTES .8byte +# else +# define LA la +# define EH_FRAME_ALIGN 2 +# define FDE_ADDR_BYTES .4byte +# endif /* _MIPS_SIM==_ABI64 */ +#endif /* !FFI_MIPS_O32 */ +#else /* !LIBFFI_ASM */ +# ifdef __GNUC__ +# ifdef FFI_MIPS_O32 +/* O32 stack frames have 32bit integer args */ +typedef unsigned int ffi_arg __attribute__((__mode__(__SI__))); +typedef signed int ffi_sarg __attribute__((__mode__(__SI__))); +#else +/* N32 and N64 frames have 64bit integer args */ +typedef unsigned int ffi_arg __attribute__((__mode__(__DI__))); +typedef signed int ffi_sarg __attribute__((__mode__(__DI__))); +# endif +# else +# ifdef FFI_MIPS_O32 +/* O32 stack frames have 32bit integer args */ +typedef __uint32_t ffi_arg; +typedef __int32_t ffi_sarg; +# else +/* N32 and N64 frames have 64bit integer args */ +typedef __uint64_t ffi_arg; +typedef __int64_t ffi_sarg; +# endif +# endif /* __GNUC__ */ + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_O32, + FFI_N32, + FFI_N64, + FFI_O32_SOFT_FLOAT, + FFI_N32_SOFT_FLOAT, + FFI_N64_SOFT_FLOAT, + FFI_LAST_ABI, + +#ifdef FFI_MIPS_O32 +#ifdef __mips_soft_float + FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT +#else + FFI_DEFAULT_ABI = FFI_O32 +#endif +#else +# if _MIPS_SIM==_ABI64 +# ifdef __mips_soft_float + FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT +# else + FFI_DEFAULT_ABI = FFI_N64 +# endif +# else +# ifdef __mips_soft_float + FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT +# else + FFI_DEFAULT_ABI = FFI_N32 +# endif +# endif +#endif +} ffi_abi; + +#define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag; unsigned mips_nfixedargs +#define FFI_TARGET_SPECIFIC_VARIADIC +#endif /* !LIBFFI_ASM */ + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_GO_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +#if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) +# define FFI_TRAMPOLINE_SIZE 20 +#else +# define FFI_TRAMPOLINE_SIZE 56 +#endif + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/n32.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/n32.S new file mode 100644 index 000000000000..1a940b6d2a89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/n32.S @@ -0,0 +1,663 @@ +/* ----------------------------------------------------------------------- + n32.S - Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc. + + MIPS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +/* Only build this code if we are compiling for n32 */ + +#if defined(FFI_MIPS_N32) + +#define callback a0 +#define bytes a2 +#define flags a3 +#define raddr a4 +#define fn a5 +#define closure a6 + +/* Note: to keep stack 16 byte aligned we need even number slots + used 9 slots here +*/ +#define SIZEOF_FRAME ( 10 * FFI_SIZEOF_ARG ) + +#ifdef __GNUC__ + .abicalls +#endif +#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) + .set mips4 +#endif + .text + .align 2 + .globl ffi_call_N32 + .ent ffi_call_N32 +ffi_call_N32: +.LFB0: + .frame $fp, SIZEOF_FRAME, ra + .mask 0xc0000000,-FFI_SIZEOF_ARG + .fmask 0x00000000,0 + + # Prologue + SUBU $sp, SIZEOF_FRAME # Frame size +.LCFI00: + REG_S $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Save frame pointer + REG_S ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Save return address +.LCFI01: + move $fp, $sp +.LCFI02: + move t9, callback # callback function pointer + REG_S bytes, 2*FFI_SIZEOF_ARG($fp) # bytes + REG_S flags, 3*FFI_SIZEOF_ARG($fp) # flags + REG_S raddr, 4*FFI_SIZEOF_ARG($fp) # raddr + REG_S fn, 5*FFI_SIZEOF_ARG($fp) # fn + REG_S closure, 6*FFI_SIZEOF_ARG($fp) # closure + + # Allocate at least 4 words in the argstack + move v0, bytes + bge bytes, 4 * FFI_SIZEOF_ARG, bigger + LI v0, 4 * FFI_SIZEOF_ARG + b sixteen + + bigger: + ADDU t4, v0, 2 * FFI_SIZEOF_ARG -1 # make sure it is aligned + and v0, t4, -2 * FFI_SIZEOF_ARG # to a proper boundry. + +sixteen: + SUBU $sp, $sp, v0 # move the stack pointer to reflect the + # arg space + + move a0, $sp # 4 * FFI_SIZEOF_ARG + ADDU a3, $fp, 3 * FFI_SIZEOF_ARG + + # Call ffi_prep_args + jal t9 + + # Copy the stack pointer to t9 + move t9, $sp + + # Fix the stack if there are more than 8 64bit slots worth + # of arguments. + + # Load the number of bytes + REG_L t6, 2*FFI_SIZEOF_ARG($fp) + + # Is it bigger than 8 * FFI_SIZEOF_ARG? + daddiu t8, t6, -(8 * FFI_SIZEOF_ARG) + bltz t8, loadregs + + ADDU t9, t9, t8 + +loadregs: + + REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6. + +#ifdef __mips_soft_float + REG_L a0, 0*FFI_SIZEOF_ARG(t9) + REG_L a1, 1*FFI_SIZEOF_ARG(t9) + REG_L a2, 2*FFI_SIZEOF_ARG(t9) + REG_L a3, 3*FFI_SIZEOF_ARG(t9) + REG_L a4, 4*FFI_SIZEOF_ARG(t9) + REG_L a5, 5*FFI_SIZEOF_ARG(t9) + REG_L a6, 6*FFI_SIZEOF_ARG(t9) + REG_L a7, 7*FFI_SIZEOF_ARG(t9) +#else + and t4, t6, ((1<<FFI_FLAG_BITS)-1) + REG_L a0, 0*FFI_SIZEOF_ARG(t9) + beqz t4, arg1_next + bne t4, FFI_TYPE_FLOAT, arg1_doublep + l.s $f12, 0*FFI_SIZEOF_ARG(t9) + b arg1_next +arg1_doublep: + l.d $f12, 0*FFI_SIZEOF_ARG(t9) +arg1_next: + + SRL t4, t6, 1*FFI_FLAG_BITS + and t4, ((1<<FFI_FLAG_BITS)-1) + REG_L a1, 1*FFI_SIZEOF_ARG(t9) + beqz t4, arg2_next + bne t4, FFI_TYPE_FLOAT, arg2_doublep + l.s $f13, 1*FFI_SIZEOF_ARG(t9) + b arg2_next +arg2_doublep: + l.d $f13, 1*FFI_SIZEOF_ARG(t9) +arg2_next: + + SRL t4, t6, 2*FFI_FLAG_BITS + and t4, ((1<<FFI_FLAG_BITS)-1) + REG_L a2, 2*FFI_SIZEOF_ARG(t9) + beqz t4, arg3_next + bne t4, FFI_TYPE_FLOAT, arg3_doublep + l.s $f14, 2*FFI_SIZEOF_ARG(t9) + b arg3_next +arg3_doublep: + l.d $f14, 2*FFI_SIZEOF_ARG(t9) +arg3_next: + + SRL t4, t6, 3*FFI_FLAG_BITS + and t4, ((1<<FFI_FLAG_BITS)-1) + REG_L a3, 3*FFI_SIZEOF_ARG(t9) + beqz t4, arg4_next + bne t4, FFI_TYPE_FLOAT, arg4_doublep + l.s $f15, 3*FFI_SIZEOF_ARG(t9) + b arg4_next +arg4_doublep: + l.d $f15, 3*FFI_SIZEOF_ARG(t9) +arg4_next: + + SRL t4, t6, 4*FFI_FLAG_BITS + and t4, ((1<<FFI_FLAG_BITS)-1) + REG_L a4, 4*FFI_SIZEOF_ARG(t9) + beqz t4, arg5_next + bne t4, FFI_TYPE_FLOAT, arg5_doublep + l.s $f16, 4*FFI_SIZEOF_ARG(t9) + b arg5_next +arg5_doublep: + l.d $f16, 4*FFI_SIZEOF_ARG(t9) +arg5_next: + + SRL t4, t6, 5*FFI_FLAG_BITS + and t4, ((1<<FFI_FLAG_BITS)-1) + REG_L a5, 5*FFI_SIZEOF_ARG(t9) + beqz t4, arg6_next + bne t4, FFI_TYPE_FLOAT, arg6_doublep + l.s $f17, 5*FFI_SIZEOF_ARG(t9) + b arg6_next +arg6_doublep: + l.d $f17, 5*FFI_SIZEOF_ARG(t9) +arg6_next: + + SRL t4, t6, 6*FFI_FLAG_BITS + and t4, ((1<<FFI_FLAG_BITS)-1) + REG_L a6, 6*FFI_SIZEOF_ARG(t9) + beqz t4, arg7_next + bne t4, FFI_TYPE_FLOAT, arg7_doublep + l.s $f18, 6*FFI_SIZEOF_ARG(t9) + b arg7_next +arg7_doublep: + l.d $f18, 6*FFI_SIZEOF_ARG(t9) +arg7_next: + + SRL t4, t6, 7*FFI_FLAG_BITS + and t4, ((1<<FFI_FLAG_BITS)-1) + REG_L a7, 7*FFI_SIZEOF_ARG(t9) + beqz t4, arg8_next + bne t4, FFI_TYPE_FLOAT, arg8_doublep + l.s $f19, 7*FFI_SIZEOF_ARG(t9) + b arg8_next +arg8_doublep: + l.d $f19, 7*FFI_SIZEOF_ARG(t9) +arg8_next: +#endif + +callit: + # Load the function pointer + REG_L t9, 5*FFI_SIZEOF_ARG($fp) + + # install the static chain(t7=$15) + REG_L t7, 6*FFI_SIZEOF_ARG($fp) + + # If the return value pointer is NULL, assume no return value. + REG_L t5, 4*FFI_SIZEOF_ARG($fp) + beqz t5, noretval + + # Shift the return type flag over + SRL t6, 8*FFI_FLAG_BITS + + beq t6, FFI_TYPE_SINT32, retint + bne t6, FFI_TYPE_INT, retfloat +retint: + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + REG_S v0, 0(t4) + b epilogue + +retfloat: +#ifndef __mips_soft_float + bne t6, FFI_TYPE_FLOAT, retdouble + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + s.s $f0, 0(t4) + b epilogue + +retdouble: + bne t6, FFI_TYPE_DOUBLE, retstruct_d + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + s.d $f0, 0(t4) + b epilogue + +retstruct_d: + bne t6, FFI_TYPE_STRUCT_D, retstruct_f + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + s.d $f0, 0(t4) + b epilogue + +retstruct_f: + bne t6, FFI_TYPE_STRUCT_F, retstruct_d_d + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + s.s $f0, 0(t4) + b epilogue + +retstruct_d_d: + bne t6, FFI_TYPE_STRUCT_DD, retstruct_f_f + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + s.d $f0, 0(t4) + s.d $f2, 8(t4) + b epilogue + +retstruct_f_f: + bne t6, FFI_TYPE_STRUCT_FF, retstruct_d_f + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + s.s $f0, 0(t4) + s.s $f2, 4(t4) + b epilogue + +retstruct_d_f: + bne t6, FFI_TYPE_STRUCT_DF, retstruct_f_d + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + s.d $f0, 0(t4) + s.s $f2, 8(t4) + b epilogue + +retstruct_f_d: + bne t6, FFI_TYPE_STRUCT_FD, retstruct_d_soft + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + s.s $f0, 0(t4) + s.d $f2, 8(t4) + b epilogue +#endif + +retstruct_d_soft: + bne t6, FFI_TYPE_STRUCT_D_SOFT, retstruct_f_soft + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + sd v0, 0(t4) + b epilogue + +retstruct_f_soft: + bne t6, FFI_TYPE_STRUCT_F_SOFT, retstruct_d_d_soft + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + sw v0, 0(t4) + b epilogue + +retstruct_d_d_soft: + bne t6, FFI_TYPE_STRUCT_DD_SOFT, retstruct_f_f_soft + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + sd v0, 0(t4) + sd v1, 8(t4) + b epilogue + +retstruct_f_f_soft: + bne t6, FFI_TYPE_STRUCT_FF_SOFT, retstruct_d_f_soft + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + sw v0, 0(t4) + sw v1, 4(t4) + b epilogue + +retstruct_d_f_soft: + bne t6, FFI_TYPE_STRUCT_DF_SOFT, retstruct_f_d_soft + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + sd v0, 0(t4) + sw v1, 8(t4) + b epilogue + +retstruct_f_d_soft: + bne t6, FFI_TYPE_STRUCT_FD_SOFT, retstruct_small + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + sw v0, 0(t4) + sd v1, 8(t4) + b epilogue + +retstruct_small: + bne t6, FFI_TYPE_STRUCT_SMALL, retstruct_small2 + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + REG_S v0, 0(t4) + b epilogue + +retstruct_small2: + bne t6, FFI_TYPE_STRUCT_SMALL2, retstruct + jal t9 + REG_L t4, 4*FFI_SIZEOF_ARG($fp) + REG_S v0, 0(t4) + REG_S v1, 8(t4) + b epilogue + +retstruct: +noretval: + jal t9 + + # Epilogue +epilogue: + move $sp, $fp + REG_L $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Restore frame pointer + REG_L ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Restore return address + ADDU $sp, SIZEOF_FRAME # Fix stack pointer + j ra + +.LFE0: + .end ffi_call_N32 + +/* ffi_closure_N32. Expects address of the passed-in ffi_closure in t0 + ($12). Stores any arguments passed in registers onto the stack, + then calls ffi_closure_mips_inner_N32, which then decodes + them. + + Stack layout: + + 20 - Start of parameters, original sp + 19 - Called function a7 save + 18 - Called function a6 save + 17 - Called function a5 save + 16 - Called function a4 save + 15 - Called function a3 save + 14 - Called function a2 save + 13 - Called function a1 save + 12 - Called function a0 save + 11 - Called function f19 + 10 - Called function f18 + 9 - Called function f17 + 8 - Called function f16 + 7 - Called function f15 + 6 - Called function f14 + 5 - Called function f13 + 4 - Called function f12 + 3 - return value high (v1 or $f2) + 2 - return value low (v0 or $f0) + 1 - ra save + 0 - gp save our sp points here + */ + +#define SIZEOF_FRAME2 (20 * FFI_SIZEOF_ARG) + +#define A7_OFF2 (19 * FFI_SIZEOF_ARG) +#define A6_OFF2 (18 * FFI_SIZEOF_ARG) +#define A5_OFF2 (17 * FFI_SIZEOF_ARG) +#define A4_OFF2 (16 * FFI_SIZEOF_ARG) +#define A3_OFF2 (15 * FFI_SIZEOF_ARG) +#define A2_OFF2 (14 * FFI_SIZEOF_ARG) +#define A1_OFF2 (13 * FFI_SIZEOF_ARG) +#define A0_OFF2 (12 * FFI_SIZEOF_ARG) + +#define F19_OFF2 (11 * FFI_SIZEOF_ARG) +#define F18_OFF2 (10 * FFI_SIZEOF_ARG) +#define F17_OFF2 (9 * FFI_SIZEOF_ARG) +#define F16_OFF2 (8 * FFI_SIZEOF_ARG) +#define F15_OFF2 (7 * FFI_SIZEOF_ARG) +#define F14_OFF2 (6 * FFI_SIZEOF_ARG) +#define F13_OFF2 (5 * FFI_SIZEOF_ARG) +#define F12_OFF2 (4 * FFI_SIZEOF_ARG) + +#define V1_OFF2 (3 * FFI_SIZEOF_ARG) +#define V0_OFF2 (2 * FFI_SIZEOF_ARG) + +#define RA_OFF2 (1 * FFI_SIZEOF_ARG) +#define GP_OFF2 (0 * FFI_SIZEOF_ARG) + + .align 2 + .globl ffi_go_closure_N32 + .ent ffi_go_closure_N32 +ffi_go_closure_N32: +.LFB1: + .frame $sp, SIZEOF_FRAME2, ra + .mask 0x90000000,-(SIZEOF_FRAME2 - RA_OFF2) + .fmask 0x00000000,0 + SUBU $sp, SIZEOF_FRAME2 +.LCFI10: + .cpsetup t9, GP_OFF2, ffi_go_closure_N32 + REG_S ra, RA_OFF2($sp) # Save return address +.LCFI11: + + REG_S a0, A0_OFF2($sp) + REG_S a1, A1_OFF2($sp) + REG_S a2, A2_OFF2($sp) + REG_S a3, A3_OFF2($sp) + REG_S a4, A4_OFF2($sp) + REG_S a5, A5_OFF2($sp) + + # Call ffi_closure_mips_inner_N32 to do the real work. + LA t9, ffi_closure_mips_inner_N32 + REG_L a0, 8($15) # cif + REG_L a1, 16($15) # fun + move a2, t7 # userdata=closure + ADDU a3, $sp, V0_OFF2 # rvalue + ADDU a4, $sp, A0_OFF2 # ar + ADDU a5, $sp, F12_OFF2 # fpr + + b $do_closure + +.LFE1: + .end ffi_go_closure_N32 + + .align 2 + .globl ffi_closure_N32 + .ent ffi_closure_N32 +ffi_closure_N32: +.LFB2: + .frame $sp, SIZEOF_FRAME2, ra + .mask 0x90000000,-(SIZEOF_FRAME2 - RA_OFF2) + .fmask 0x00000000,0 + SUBU $sp, SIZEOF_FRAME2 +.LCFI20: + .cpsetup t9, GP_OFF2, ffi_closure_N32 + REG_S ra, RA_OFF2($sp) # Save return address +.LCFI21: + REG_S a0, A0_OFF2($sp) + REG_S a1, A1_OFF2($sp) + REG_S a2, A2_OFF2($sp) + REG_S a3, A3_OFF2($sp) + REG_S a4, A4_OFF2($sp) + REG_S a5, A5_OFF2($sp) + + # Call ffi_closure_mips_inner_N32 to do the real work. + LA t9, ffi_closure_mips_inner_N32 + REG_L a0, 56($12) # cif + REG_L a1, 64($12) # fun + REG_L a2, 72($12) # user_data + ADDU a3, $sp, V0_OFF2 + ADDU a4, $sp, A0_OFF2 + ADDU a5, $sp, F12_OFF2 + +$do_closure: + # Store all possible argument registers. If there are more than + # fit in registers, then they were stored on the stack. + REG_S a6, A6_OFF2($sp) + REG_S a7, A7_OFF2($sp) + +#ifndef __mips_soft_float + # Store all possible float/double registers. + s.d $f12, F12_OFF2($sp) + s.d $f13, F13_OFF2($sp) + s.d $f14, F14_OFF2($sp) + s.d $f15, F15_OFF2($sp) + s.d $f16, F16_OFF2($sp) + s.d $f17, F17_OFF2($sp) + s.d $f18, F18_OFF2($sp) + s.d $f19, F19_OFF2($sp) +#endif + + jalr t9 + + # Return flags are in v0 + bne v0, FFI_TYPE_SINT32, cls_retint + lw v0, V0_OFF2($sp) + b cls_epilogue + +cls_retint: + bne v0, FFI_TYPE_INT, cls_retfloat + REG_L v0, V0_OFF2($sp) + b cls_epilogue + +cls_retfloat: +#ifndef __mips_soft_float + bne v0, FFI_TYPE_FLOAT, cls_retdouble + l.s $f0, V0_OFF2($sp) + b cls_epilogue + +cls_retdouble: + bne v0, FFI_TYPE_DOUBLE, cls_retstruct_d + l.d $f0, V0_OFF2($sp) + b cls_epilogue + +cls_retstruct_d: + bne v0, FFI_TYPE_STRUCT_D, cls_retstruct_f + l.d $f0, V0_OFF2($sp) + b cls_epilogue + +cls_retstruct_f: + bne v0, FFI_TYPE_STRUCT_F, cls_retstruct_d_d + l.s $f0, V0_OFF2($sp) + b cls_epilogue + +cls_retstruct_d_d: + bne v0, FFI_TYPE_STRUCT_DD, cls_retstruct_f_f + l.d $f0, V0_OFF2($sp) + l.d $f2, V1_OFF2($sp) + b cls_epilogue + +cls_retstruct_f_f: + bne v0, FFI_TYPE_STRUCT_FF, cls_retstruct_d_f + l.s $f0, V0_OFF2($sp) + l.s $f2, V1_OFF2($sp) + b cls_epilogue + +cls_retstruct_d_f: + bne v0, FFI_TYPE_STRUCT_DF, cls_retstruct_f_d + l.d $f0, V0_OFF2($sp) + l.s $f2, V1_OFF2($sp) + b cls_epilogue + +cls_retstruct_f_d: + bne v0, FFI_TYPE_STRUCT_FD, cls_retstruct_small2 + l.s $f0, V0_OFF2($sp) + l.d $f2, V1_OFF2($sp) + b cls_epilogue +#endif + +cls_retstruct_small2: + REG_L v0, V0_OFF2($sp) + REG_L v1, V1_OFF2($sp) + + # Epilogue +cls_epilogue: + REG_L ra, RA_OFF2($sp) # Restore return address + .cpreturn + ADDU $sp, SIZEOF_FRAME2 + j ra +.LFE2: + .end ffi_closure_N32 + +#ifdef __GNUC__ + .section .eh_frame,"aw",@progbits +.Lframe1: + .4byte .LECIE1-.LSCIE1 # length +.LSCIE1: + .4byte 0x0 # CIE + .byte 0x1 # Version 1 + .ascii "\000" # Augmentation + .uleb128 0x1 # Code alignment 1 + .sleb128 -4 # Data alignment -4 + .byte 0x1f # Return Address $31 + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1d # in $sp + .uleb128 0x0 # offset 0 + .align EH_FRAME_ALIGN +.LECIE1: + +.LSFDE0: + .4byte .LEFDE0-.LASFDE0 # length. +.LASFDE0: + .4byte .LASFDE0-.Lframe1 # CIE_pointer. + FDE_ADDR_BYTES .LFB0 # initial_location. + FDE_ADDR_BYTES .LFE0-.LFB0 # address_range. + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI00-.LFB0 # to .LCFI00 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 SIZEOF_FRAME # adjust stack.by SIZEOF_FRAME + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI01-.LCFI00 # to .LCFI01 + .byte 0x9e # DW_CFA_offset of $fp + .uleb128 2*FFI_SIZEOF_ARG/4 # + .byte 0x9f # DW_CFA_offset of ra + .uleb128 1*FFI_SIZEOF_ARG/4 # + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI02-.LCFI01 # to .LCFI02 + .byte 0xd # DW_CFA_def_cfa_register + .uleb128 0x1e # in $fp + .align EH_FRAME_ALIGN +.LEFDE0: + +.LSFDE1: + .4byte .LEFDE1-.LASFDE1 # length +.LASFDE1: + .4byte .LASFDE1-.Lframe1 # CIE_pointer. + FDE_ADDR_BYTES .LFB1 # initial_location. + FDE_ADDR_BYTES .LFE1-.LFB1 # address_range. + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI10-.LFB1 # to .LCFI10 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 SIZEOF_FRAME2 # adjust stack.by SIZEOF_FRAME + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI11-.LCFI10 # to .LCFI11 + .byte 0x9c # DW_CFA_offset of $gp ($28) + .uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4 + .byte 0x9f # DW_CFA_offset of ra ($31) + .uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4 + .align EH_FRAME_ALIGN +.LEFDE1: + +.LSFDE2: + .4byte .LEFDE2-.LASFDE2 # length +.LASFDE2: + .4byte .LASFDE2-.Lframe1 # CIE_pointer. + FDE_ADDR_BYTES .LFB2 # initial_location. + FDE_ADDR_BYTES .LFE2-.LFB2 # address_range. + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI20-.LFB2 # to .LCFI20 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 SIZEOF_FRAME2 # adjust stack.by SIZEOF_FRAME + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .LCFI21-.LCFI20 # to .LCFI21 + .byte 0x9c # DW_CFA_offset of $gp ($28) + .uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4 + .byte 0x9f # DW_CFA_offset of ra ($31) + .uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4 + .align EH_FRAME_ALIGN +.LEFDE2: +#endif /* __GNUC__ */ + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/o32.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/o32.S new file mode 100644 index 000000000000..799139b2968b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/mips/o32.S @@ -0,0 +1,504 @@ +/* ----------------------------------------------------------------------- + o32.S - Copyright (c) 1996, 1998, 2005 Red Hat, Inc. + + MIPS Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +/* Only build this code if we are compiling for o32 */ + +#if defined(FFI_MIPS_O32) + +#define callback a0 +#define bytes a2 +#define flags a3 + +#define SIZEOF_FRAME (4 * FFI_SIZEOF_ARG + 2 * FFI_SIZEOF_ARG) +#define A3_OFF (SIZEOF_FRAME + 3 * FFI_SIZEOF_ARG) +#define FP_OFF (SIZEOF_FRAME - 2 * FFI_SIZEOF_ARG) +#define RA_OFF (SIZEOF_FRAME - 1 * FFI_SIZEOF_ARG) + + .abicalls + .text + .align 2 + .globl ffi_call_O32 + .ent ffi_call_O32 +ffi_call_O32: +$LFB0: + # Prologue + SUBU $sp, SIZEOF_FRAME # Frame size +$LCFI00: + REG_S $fp, FP_OFF($sp) # Save frame pointer +$LCFI01: + REG_S ra, RA_OFF($sp) # Save return address +$LCFI02: + move $fp, $sp + +$LCFI03: + move t9, callback # callback function pointer + REG_S flags, A3_OFF($fp) # flags + + # Allocate at least 4 words in the argstack + LI v0, 4 * FFI_SIZEOF_ARG + blt bytes, v0, sixteen + + ADDU v0, bytes, 7 # make sure it is aligned + and v0, -8 # to an 8 byte boundry + +sixteen: + SUBU $sp, v0 # move the stack pointer to reflect the + # arg space + + ADDU a0, $sp, 4 * FFI_SIZEOF_ARG + + jalr t9 + + REG_L t0, A3_OFF($fp) # load the flags word + SRL t2, t0, 4 # shift our arg info + and t0, ((1<<4)-1) # mask out the return type + + ADDU $sp, 4 * FFI_SIZEOF_ARG # adjust $sp to new args + +#ifndef __mips_soft_float + bnez t0, pass_d # make it quick for int +#endif + REG_L a0, 0*FFI_SIZEOF_ARG($sp) # just go ahead and load the + REG_L a1, 1*FFI_SIZEOF_ARG($sp) # four regs. + REG_L a2, 2*FFI_SIZEOF_ARG($sp) + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +#ifndef __mips_soft_float +pass_d: + bne t0, FFI_ARGS_D, pass_f + l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + REG_L a2, 2*FFI_SIZEOF_ARG($sp) # passing a double + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +pass_f: + bne t0, FFI_ARGS_F, pass_d_d + l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + REG_L a1, 1*FFI_SIZEOF_ARG($sp) # passing a float + REG_L a2, 2*FFI_SIZEOF_ARG($sp) + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +pass_d_d: + bne t0, FFI_ARGS_DD, pass_f_f + l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing two doubles + b call_it + +pass_f_f: + bne t0, FFI_ARGS_FF, pass_d_f + l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + l.s $f14, 1*FFI_SIZEOF_ARG($sp) # passing two floats + REG_L a2, 2*FFI_SIZEOF_ARG($sp) + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +pass_d_f: + bne t0, FFI_ARGS_DF, pass_f_d + l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + l.s $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float + REG_L a3, 3*FFI_SIZEOF_ARG($sp) + b call_it + +pass_f_d: + # assume that the only other combination must be float then double + # bne t0, FFI_ARGS_F_D, call_it + l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args + l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float +#endif + +call_it: + # Load the static chain pointer + REG_L t7, SIZEOF_FRAME + 6*FFI_SIZEOF_ARG($fp) + + # Load the function pointer + REG_L t9, SIZEOF_FRAME + 5*FFI_SIZEOF_ARG($fp) + + # If the return value pointer is NULL, assume no return value. + REG_L t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) + beqz t1, noretval + + bne t2, FFI_TYPE_INT, retlonglong + jalr t9 + REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) + REG_S v0, 0(t0) + b epilogue + +retlonglong: + # Really any 64-bit int, signed or not. + bne t2, FFI_TYPE_UINT64, retfloat + jalr t9 + REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) + REG_S v1, 4(t0) + REG_S v0, 0(t0) + b epilogue + +retfloat: + bne t2, FFI_TYPE_FLOAT, retdouble + jalr t9 + REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) +#ifndef __mips_soft_float + s.s $f0, 0(t0) +#else + REG_S v0, 0(t0) +#endif + b epilogue + +retdouble: + bne t2, FFI_TYPE_DOUBLE, noretval + jalr t9 + REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) +#ifndef __mips_soft_float + s.d $f0, 0(t0) +#else + REG_S v1, 4(t0) + REG_S v0, 0(t0) +#endif + b epilogue + +noretval: + jalr t9 + + # Epilogue +epilogue: + move $sp, $fp + REG_L $fp, FP_OFF($sp) # Restore frame pointer + REG_L ra, RA_OFF($sp) # Restore return address + ADDU $sp, SIZEOF_FRAME # Fix stack pointer + j ra + +$LFE0: + .end ffi_call_O32 + + +/* ffi_closure_O32. Expects address of the passed-in ffi_closure + in t4 ($12). Stores any arguments passed in registers onto the + stack, then calls ffi_closure_mips_inner_O32, which + then decodes them. + + Stack layout: + + 3 - a3 save + 2 - a2 save + 1 - a1 save + 0 - a0 save, original sp + -1 - ra save + -2 - fp save + -3 - $16 (s0) save + -4 - cprestore + -5 - return value high (v1) + -6 - return value low (v0) + -7 - f14 (le high, be low) + -8 - f14 (le low, be high) + -9 - f12 (le high, be low) + -10 - f12 (le low, be high) + -11 - Called function a5 save + -12 - Called function a4 save + -13 - Called function a3 save + -14 - Called function a2 save + -15 - Called function a1 save + -16 - Called function a0 save, our sp and fp point here + */ + +#define SIZEOF_FRAME2 (16 * FFI_SIZEOF_ARG) +#define A3_OFF2 (SIZEOF_FRAME2 + 3 * FFI_SIZEOF_ARG) +#define A2_OFF2 (SIZEOF_FRAME2 + 2 * FFI_SIZEOF_ARG) +#define A1_OFF2 (SIZEOF_FRAME2 + 1 * FFI_SIZEOF_ARG) +#define A0_OFF2 (SIZEOF_FRAME2 + 0 * FFI_SIZEOF_ARG) +#define RA_OFF2 (SIZEOF_FRAME2 - 1 * FFI_SIZEOF_ARG) +#define FP_OFF2 (SIZEOF_FRAME2 - 2 * FFI_SIZEOF_ARG) +#define S0_OFF2 (SIZEOF_FRAME2 - 3 * FFI_SIZEOF_ARG) +#define GP_OFF2 (SIZEOF_FRAME2 - 4 * FFI_SIZEOF_ARG) +#define V1_OFF2 (SIZEOF_FRAME2 - 5 * FFI_SIZEOF_ARG) +#define V0_OFF2 (SIZEOF_FRAME2 - 6 * FFI_SIZEOF_ARG) +#define FA_1_1_OFF2 (SIZEOF_FRAME2 - 7 * FFI_SIZEOF_ARG) +#define FA_1_0_OFF2 (SIZEOF_FRAME2 - 8 * FFI_SIZEOF_ARG) +#define FA_0_1_OFF2 (SIZEOF_FRAME2 - 9 * FFI_SIZEOF_ARG) +#define FA_0_0_OFF2 (SIZEOF_FRAME2 - 10 * FFI_SIZEOF_ARG) +#define CALLED_A5_OFF2 (SIZEOF_FRAME2 - 11 * FFI_SIZEOF_ARG) +#define CALLED_A4_OFF2 (SIZEOF_FRAME2 - 12 * FFI_SIZEOF_ARG) + + .text + + .align 2 + .globl ffi_go_closure_O32 + .ent ffi_go_closure_O32 +ffi_go_closure_O32: +$LFB1: + # Prologue + .frame $fp, SIZEOF_FRAME2, ra + .set noreorder + .cpload t9 + .set reorder + SUBU $sp, SIZEOF_FRAME2 + .cprestore GP_OFF2 +$LCFI10: + + REG_S $16, S0_OFF2($sp) # Save s0 + REG_S $fp, FP_OFF2($sp) # Save frame pointer + REG_S ra, RA_OFF2($sp) # Save return address +$LCFI11: + + move $fp, $sp +$LCFI12: + + REG_S a0, A0_OFF2($fp) + REG_S a1, A1_OFF2($fp) + REG_S a2, A2_OFF2($fp) + REG_S a3, A3_OFF2($fp) + + # Load ABI enum to s0 + REG_L $16, 4($15) # cif + REG_L $16, 0($16) # abi is first member. + + li $13, 1 # FFI_O32 + bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT + +#ifndef __mips_soft_float + # Store all possible float/double registers. + s.d $f12, FA_0_0_OFF2($fp) + s.d $f14, FA_1_0_OFF2($fp) +#endif +1: + # prepare arguments for ffi_closure_mips_inner_O32 + REG_L a0, 4($15) # cif + REG_L a1, 8($15) # fun + move a2, $15 # user_data = go closure + addu a3, $fp, V0_OFF2 # rvalue + + addu t9, $fp, A0_OFF2 # ar + REG_S t9, CALLED_A4_OFF2($fp) + + addu t9, $fp, FA_0_0_OFF2 #fpr + REG_S t9, CALLED_A5_OFF2($fp) + + b $do_closure + +$LFE1: + .end ffi_go_closure_O32 + + .align 2 + .globl ffi_closure_O32 + .ent ffi_closure_O32 +ffi_closure_O32: +$LFB2: + # Prologue + .frame $fp, SIZEOF_FRAME2, ra + .set noreorder + .cpload t9 + .set reorder + SUBU $sp, SIZEOF_FRAME2 + .cprestore GP_OFF2 +$LCFI20: + REG_S $16, S0_OFF2($sp) # Save s0 + REG_S $fp, FP_OFF2($sp) # Save frame pointer + REG_S ra, RA_OFF2($sp) # Save return address +$LCFI21: + move $fp, $sp + +$LCFI22: + # Store all possible argument registers. If there are more than + # four arguments, then they are stored above where we put a3. + REG_S a0, A0_OFF2($fp) + REG_S a1, A1_OFF2($fp) + REG_S a2, A2_OFF2($fp) + REG_S a3, A3_OFF2($fp) + + # Load ABI enum to s0 + REG_L $16, 20($12) # cif pointer follows tramp. + REG_L $16, 0($16) # abi is first member. + + li $13, 1 # FFI_O32 + bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT + +#ifndef __mips_soft_float + # Store all possible float/double registers. + s.d $f12, FA_0_0_OFF2($fp) + s.d $f14, FA_1_0_OFF2($fp) +#endif +1: + # prepare arguments for ffi_closure_mips_inner_O32 + REG_L a0, 20($12) # cif pointer follows tramp. + REG_L a1, 24($12) # fun + REG_L a2, 28($12) # user_data + addu a3, $fp, V0_OFF2 # rvalue + + addu t9, $fp, A0_OFF2 # ar + REG_S t9, CALLED_A4_OFF2($fp) + + addu t9, $fp, FA_0_0_OFF2 #fpr + REG_S t9, CALLED_A5_OFF2($fp) + +$do_closure: + la t9, ffi_closure_mips_inner_O32 + # Call ffi_closure_mips_inner_O32 to do the work. + jalr t9 + + # Load the return value into the appropriate register. + move $8, $2 + li $9, FFI_TYPE_VOID + beq $8, $9, closure_done + + li $13, 1 # FFI_O32 + bne $16, $13, 1f # Skip fp restore if FFI_O32_SOFT_FLOAT + +#ifndef __mips_soft_float + li $9, FFI_TYPE_FLOAT + l.s $f0, V0_OFF2($fp) + beq $8, $9, closure_done + + li $9, FFI_TYPE_DOUBLE + l.d $f0, V0_OFF2($fp) + beq $8, $9, closure_done +#endif +1: + REG_L $3, V1_OFF2($fp) + REG_L $2, V0_OFF2($fp) + +closure_done: + # Epilogue + move $sp, $fp + REG_L $16, S0_OFF2($sp) # Restore s0 + REG_L $fp, FP_OFF2($sp) # Restore frame pointer + REG_L ra, RA_OFF2($sp) # Restore return address + ADDU $sp, SIZEOF_FRAME2 + j ra +$LFE2: + .end ffi_closure_O32 + +/* DWARF-2 unwind info. */ + + .section .eh_frame,"a",@progbits +$Lframe0: + .4byte $LECIE0-$LSCIE0 # Length of Common Information Entry +$LSCIE0: + .4byte 0x0 # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "zR\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 4 # CIE Data Alignment Factor + .byte 0x1f # CIE RA Column + .uleb128 0x1 # Augmentation size + .byte 0x00 # FDE Encoding (absptr) + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1d + .uleb128 0x0 + .align 2 +$LECIE0: + +$LSFDE0: + .4byte $LEFDE0-$LASFDE0 # FDE Length +$LASFDE0: + .4byte $LASFDE0-$Lframe0 # FDE CIE offset + .4byte $LFB0 # FDE initial location + .4byte $LFE0-$LFB0 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI00-$LFB0 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x18 + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI01-$LCFI00 + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1e # $fp + .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1f # $ra + .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI02-$LCFI01 + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1e + .uleb128 0x18 + .align 2 +$LEFDE0: + +$LSFDE1: + .4byte $LEFDE1-$LASFDE1 # FDE Length +$LASFDE1: + .4byte $LASFDE1-$Lframe0 # FDE CIE offset + .4byte $LFB1 # FDE initial location + .4byte $LFE1-$LFB1 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI10-$LFB1 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 SIZEOF_FRAME2 + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI11-$LCFI10 + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x10 # $16 + .sleb128 -3 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp) + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1e # $fp + .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1f # $ra + .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI12-$LCFI11 + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1e + .uleb128 SIZEOF_FRAME2 + .align 2 +$LEFDE1: + +$LSFDE2: + .4byte $LEFDE2-$LASFDE2 # FDE Length +$LASFDE2: + .4byte $LASFDE2-$Lframe0 # FDE CIE offset + .4byte $LFB2 # FDE initial location + .4byte $LFE2-$LFB2 # FDE address range + .uleb128 0x0 # Augmentation size + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI20-$LFB2 + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 SIZEOF_FRAME2 + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI21-$LCFI20 + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x10 # $16 + .sleb128 -3 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp) + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1e # $fp + .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) + .byte 0x11 # DW_CFA_offset_extended_sf + .uleb128 0x1f # $ra + .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) + .byte 0x4 # DW_CFA_advance_loc4 + .4byte $LCFI22-$LCFI21 + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x1e + .uleb128 SIZEOF_FRAME2 + .align 2 +$LEFDE2: + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/moxie/eabi.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/moxie/eabi.S new file mode 100644 index 000000000000..10cfb0448ea9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/moxie/eabi.S @@ -0,0 +1,101 @@ +/* ----------------------------------------------------------------------- + eabi.S - Copyright (c) 2012, 2013 Anthony Green + + Moxie Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + .globl ffi_prep_args_EABI + + .text + .p2align 4 + .globl ffi_call_EABI + .type ffi_call_EABI, @function + + # $r0 : ffi_prep_args + # $r1 : &ecif + # $r2 : cif->bytes + # $r3 : fig->flags + # $r4 : ecif.rvalue + # $r5 : fn + +ffi_call_EABI: + push $sp, $r6 + push $sp, $r7 + push $sp, $r8 + dec $sp, 24 + + /* Store incoming args on stack. */ + sto.l 0($sp), $r0 /* ffi_prep_args */ + sto.l 4($sp), $r1 /* ecif */ + sto.l 8($sp), $r2 /* bytes */ + sto.l 12($sp), $r3 /* flags */ + sto.l 16($sp), $r4 /* &rvalue */ + sto.l 20($sp), $r5 /* fn */ + + /* Call ffi_prep_args. */ + mov $r6, $r4 /* Save result buffer */ + mov $r7, $r5 /* Save the target fn */ + mov $r8, $r3 /* Save the flags */ + sub $sp, $r2 /* Allocate stack space */ + mov $r0, $sp /* We can stomp over $r0 */ + /* $r1 is already set up */ + jsra ffi_prep_args + + /* Load register arguments. */ + ldo.l $r0, 0($sp) + ldo.l $r1, 4($sp) + ldo.l $r2, 8($sp) + ldo.l $r3, 12($sp) + ldo.l $r4, 16($sp) + ldo.l $r5, 20($sp) + + /* Call the target function. */ + jsr $r7 + + ldi.l $r7, 0xffffffff + cmp $r8, $r7 + beq retstruct + + ldi.l $r7, 4 + cmp $r8, $r7 + bgt ret2reg + + st.l ($r6), $r0 + jmpa retdone + +ret2reg: + st.l ($r6), $r0 + sto.l 4($r6), $r1 + +retstruct: +retdone: + /* Return. */ + ldo.l $r6, -4($fp) + ldo.l $r7, -8($fp) + ldo.l $r8, -12($fp) + ret + .size ffi_call_EABI, .-ffi_call_EABI + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/moxie/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/moxie/ffi.c new file mode 100644 index 000000000000..16d2bb37c8ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/moxie/ffi.c @@ -0,0 +1,285 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (C) 2012, 2013, 2018 Anthony Green + + Moxie Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void *ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + register int count = 0; + + p_argv = ecif->avalue; + argp = stack; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + } + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + (i != 0); + i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + + if ((*p_arg)->type == FFI_TYPE_STRUCT) + { + z = sizeof(void*); + *(void **) argp = *p_argv; + } + else if (z < sizeof(int)) + { + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof(int)) + { + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + } + else + { + memcpy(argp, *p_argv, z); + } + p_argv++; + argp += z; + count += z; + } + + return (stack + ((count > 24) ? 24 : FFI_ALIGN_DOWN(count, 8))); +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + if (cif->rtype->type == FFI_TYPE_STRUCT) + cif->flags = -1; + else + cif->flags = cif->rtype->size; + + cif->bytes = FFI_ALIGN (cif->bytes, 8); + + return FFI_OK; +} + +extern void ffi_call_EABI(void *(*)(char *, extended_cif *), + extended_cif *, + unsigned, unsigned, + unsigned *, + void (*fn)(void)); + +void ffi_call(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_EABI: + ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + default: + FFI_ASSERT(0); + break; + } +} + +void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, + unsigned arg4, unsigned arg5, unsigned arg6) +{ + /* This function is called by a trampoline. The trampoline stows a + pointer to the ffi_closure object in $r12. We must save this + pointer in a place that will persist while we do our work. */ + register ffi_closure *creg __asm__ ("$r12"); + ffi_closure *closure = creg; + + /* Arguments that don't fit in registers are found on the stack + at a fixed offset above the current frame pointer. */ + register char *frame_pointer __asm__ ("$fp"); + + /* Pointer to a struct return value. */ + void *struct_rvalue = (void *) arg1; + + /* 6 words reserved for register args + 3 words from jsr */ + char *stack_args = frame_pointer + 9*4; + + /* Lay the register arguments down in a continuous chunk of memory. */ + unsigned register_args[6] = + { arg1, arg2, arg3, arg4, arg5, arg6 }; + char *register_args_ptr = (char *) register_args; + + ffi_cif *cif = closure->cif; + ffi_type **arg_types = cif->arg_types; + void **avalue = alloca (cif->nargs * sizeof(void *)); + char *ptr = (char *) register_args; + int i; + + /* preserve struct type return pointer passing */ + if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { + ptr += 4; + register_args_ptr = (char *)&register_args[1]; + } + + /* Find the address of each argument. */ + for (i = 0; i < cif->nargs; i++) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = ptr + 3; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = ptr + 2; + break; + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + case FFI_TYPE_POINTER: + avalue[i] = ptr; + break; + case FFI_TYPE_STRUCT: + avalue[i] = *(void**)ptr; + break; + default: + /* This is an 8-byte value. */ + if (ptr == (char *) &register_args[5]) + { + /* The value is split across two locations */ + unsigned *ip = alloca(8); + avalue[i] = ip; + ip[0] = *(unsigned *) ptr; + ip[1] = *(unsigned *) stack_args; + } + else + { + avalue[i] = ptr; + } + ptr += 4; + break; + } + ptr += 4; + + /* If we've handled more arguments than fit in registers, + start looking at the those passed on the stack. */ + if (ptr == (char *) &register_args[6]) + ptr = stack_args; + else if (ptr == (char *) &register_args[7]) + ptr = stack_args + 4; + } + + /* Invoke the closure. */ + if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT)) + { + (closure->fun) (cif, struct_rvalue, avalue, closure->user_data); + } + else + { + /* Allocate space for the return value and call the function. */ + long long rvalue; + (closure->fun) (cif, &rvalue, avalue, closure->user_data); + asm ("mov $r12, %0\n ld.l $r0, ($r12)\n ldo.l $r1, 4($r12)" : : "r" (&rvalue)); + } +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned short *tramp = (unsigned short *) &closure->tramp[0]; + unsigned long fn = (long) ffi_closure_eabi; + unsigned long cls = (long) codeloc; + + if (cif->abi != FFI_EABI) + return FFI_BAD_ABI; + + fn = (unsigned long) ffi_closure_eabi; + + tramp[0] = 0x01e0; /* ldi.l $r12, .... */ + tramp[1] = cls >> 16; + tramp[2] = cls & 0xffff; + tramp[3] = 0x1a00; /* jmpa .... */ + tramp[4] = fn >> 16; + tramp[5] = fn & 0xffff; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/moxie/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/moxie/ffitarget.h new file mode 100644 index 000000000000..623e3ece57d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/moxie/ffitarget.h @@ -0,0 +1,52 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012, 2013 Anthony Green + Target configuration macros for Moxie + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +/* ---- System specific configurations ----------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_EABI, + FFI_DEFAULT_ABI = FFI_EABI, + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +/* Trampolines are 12-bytes long. See ffi_prep_closure_loc. */ +#define FFI_TRAMPOLINE_SIZE (12) + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/nios2/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/nios2/ffi.c new file mode 100644 index 000000000000..721080d45ebe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/nios2/ffi.c @@ -0,0 +1,304 @@ +/* libffi support for Altera Nios II. + + Copyright (c) 2013 Mentor Graphics. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> + +/* The Nios II Processor Reference Handbook defines the procedure call + ABI as follows. + + Arguments are passed as if a structure containing the types of + the arguments were constructed. The first 16 bytes are passed in r4 + through r7, the remainder on the stack. The first 16 bytes of a function + taking variable arguments are passed in r4-r7 in the same way. + + Return values of types up to 8 bytes are returned in r2 and r3. For + return values greater than 8 bytes, the caller must allocate memory for + the result and pass the address as if it were argument 0. + + While this isn't specified explicitly in the ABI documentation, GCC + promotes integral arguments smaller than int size to 32 bits. + + Also of note, the ABI specifies that all structure objects are + aligned to 32 bits even if all their fields have a smaller natural + alignment. See FFI_AGGREGATE_ALIGNMENT. */ + + +/* Declare the assembly language hooks. */ + +extern UINT64 ffi_call_sysv (void (*) (char *, extended_cif *), + extended_cif *, + unsigned, + void (*fn) (void)); +extern void ffi_closure_sysv (void); + +/* Perform machine-dependent cif processing. */ + +ffi_status ffi_prep_cif_machdep (ffi_cif *cif) +{ + /* We always want at least 16 bytes in the parameter block since it + simplifies the low-level call function. Also round the parameter + block size up to a multiple of 4 bytes to preserve + 32-bit alignment of the stack pointer. */ + if (cif->bytes < 16) + cif->bytes = 16; + else + cif->bytes = (cif->bytes + 3) & ~3; + + return FFI_OK; +} + + +/* ffi_prep_args is called by the assembly routine to transfer arguments + to the stack using the pointers in the ecif array. + Note that the stack buffer is big enough to fit all the arguments, + but the first 16 bytes will be copied to registers for the actual + call. */ + +void ffi_prep_args (char *stack, extended_cif *ecif) +{ + char *argp = stack; + unsigned int i; + + /* The implicit return value pointer is passed as if it were a hidden + first argument. */ + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT + && ecif->cif->rtype->size > 8) + { + (*(void **) argp) = ecif->rvalue; + argp += 4; + } + + for (i = 0; i < ecif->cif->nargs; i++) + { + void *avalue = ecif->avalue[i]; + ffi_type *atype = ecif->cif->arg_types[i]; + size_t size = atype->size; + size_t alignment = atype->alignment; + + /* Align argp as appropriate for the argument type. */ + if ((alignment - 1) & (unsigned) argp) + argp = (char *) FFI_ALIGN (argp, alignment); + + /* Copy the argument, promoting integral types smaller than a + word to word size. */ + if (size < sizeof (int)) + { + size = sizeof (int); + switch (atype->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int) *(SINT8 *) avalue; + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int) *(UINT8 *) avalue; + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int) *(SINT16 *) avalue; + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int) *(UINT16 *) avalue; + break; + + case FFI_TYPE_STRUCT: + memcpy (argp, avalue, atype->size); + break; + + default: + FFI_ASSERT(0); + } + } + else if (size == sizeof (int)) + *(unsigned int *) argp = (unsigned int) *(UINT32 *) avalue; + else + memcpy (argp, avalue, size); + argp += size; + } +} + + +/* Call FN using the prepared CIF. RVALUE points to space allocated by + the caller for the return value, and AVALUE is an array of argument + pointers. */ + +void ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) +{ + + extended_cif ecif; + UINT64 result; + + /* If bigret is true, this is the case where a return value of larger + than 8 bytes is handled by being passed by reference as an implicit + argument. */ + int bigret = (cif->rtype->type == FFI_TYPE_STRUCT + && cif->rtype->size > 8); + + ecif.cif = cif; + ecif.avalue = avalue; + + /* Allocate space for return value if this is the pass-by-reference case + and the caller did not provide a buffer. */ + if (rvalue == NULL && bigret) + ecif.rvalue = alloca (cif->rtype->size); + else + ecif.rvalue = rvalue; + + result = ffi_call_sysv (ffi_prep_args, &ecif, cif->bytes, fn); + + /* Now result contains the 64 bit contents returned from fn in + r2 and r3. Copy the value of the appropriate size to the user-provided + rvalue buffer. */ + if (rvalue && !bigret) + switch (cif->rtype->size) + { + case 1: + *(UINT8 *)rvalue = (UINT8) result; + break; + case 2: + *(UINT16 *)rvalue = (UINT16) result; + break; + case 4: + *(UINT32 *)rvalue = (UINT32) result; + break; + case 8: + *(UINT64 *)rvalue = (UINT64) result; + break; + default: + memcpy (rvalue, (void *)&result, cif->rtype->size); + break; + } +} + +/* This function is invoked from the closure trampoline to invoke + CLOSURE with argument block ARGS. Parse ARGS according to + CLOSURE->cfi and invoke CLOSURE->fun. */ + +static UINT64 +ffi_closure_helper (unsigned char *args, + ffi_closure *closure) +{ + ffi_cif *cif = closure->cif; + unsigned char *argp = args; + void **parsed_args = alloca (cif->nargs * sizeof (void *)); + UINT64 result; + void *retptr; + unsigned int i; + + /* First figure out what to do about the return type. If this is the + big-structure-return case, the first arg is the hidden return buffer + allocated by the caller. */ + if (cif->rtype->type == FFI_TYPE_STRUCT + && cif->rtype->size > 8) + { + retptr = *((void **) argp); + argp += 4; + } + else + retptr = (void *) &result; + + /* Fill in the array of argument pointers. */ + for (i = 0; i < cif->nargs; i++) + { + size_t size = cif->arg_types[i]->size; + size_t alignment = cif->arg_types[i]->alignment; + + /* Align argp as appropriate for the argument type. */ + if ((alignment - 1) & (unsigned) argp) + argp = (char *) FFI_ALIGN (argp, alignment); + + /* Arguments smaller than an int are promoted to int. */ + if (size < sizeof (int)) + size = sizeof (int); + + /* Store the pointer. */ + parsed_args[i] = argp; + argp += size; + } + + /* Call the user-supplied function. */ + (closure->fun) (cif, retptr, parsed_args, closure->user_data); + return result; +} + + +/* Initialize CLOSURE with a trampoline to call FUN with + CIF and USER_DATA. */ +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun) (ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + int i; + + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + /* The trampoline looks like: + movhi r8, %hi(ffi_closure_sysv) + ori r8, r8, %lo(ffi_closure_sysv) + movhi r9, %hi(ffi_closure_helper) + ori r0, r9, %lo(ffi_closure_helper) + movhi r10, %hi(closure) + ori r10, r10, %lo(closure) + jmp r8 + and then ffi_closure_sysv retrieves the closure pointer out of r10 + in addition to the arguments passed in the normal way for the call, + and invokes ffi_closure_helper. We encode the pointer to + ffi_closure_helper in the trampoline because making a PIC call + to it in ffi_closure_sysv would be messy (it would have to indirect + through the GOT). */ + +#define HI(x) ((((unsigned int) (x)) >> 16) & 0xffff) +#define LO(x) (((unsigned int) (x)) & 0xffff) + tramp[0] = (0 << 27) | (8 << 22) | (HI (ffi_closure_sysv) << 6) | 0x34; + tramp[1] = (8 << 27) | (8 << 22) | (LO (ffi_closure_sysv) << 6) | 0x14; + tramp[2] = (0 << 27) | (9 << 22) | (HI (ffi_closure_helper) << 6) | 0x34; + tramp[3] = (9 << 27) | (9 << 22) | (LO (ffi_closure_helper) << 6) | 0x14; + tramp[4] = (0 << 27) | (10 << 22) | (HI (closure) << 6) | 0x34; + tramp[5] = (10 << 27) | (10 << 22) | (LO (closure) << 6) | 0x14; + tramp[6] = (8 << 27) | (0x0d << 11) | 0x3a; +#undef HI +#undef LO + + /* Flush the caches. + See Example 9-4 in the Nios II Software Developer's Handbook. */ + for (i = 0; i < 7; i++) + asm volatile ("flushd 0(%0); flushi %0" :: "r"(tramp + i) : "memory"); + asm volatile ("flushp" ::: "memory"); + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/nios2/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/nios2/ffitarget.h new file mode 100644 index 000000000000..134d118c12a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/nios2/ffitarget.h @@ -0,0 +1,52 @@ +/* libffi target includes for Altera Nios II. + + Copyright (c) 2013 Mentor Graphics. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +/* Structures have a 4-byte alignment even if all the fields have lesser + alignment requirements. */ +#define FFI_AGGREGATE_ALIGNMENT 4 + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 28 /* 7 instructions */ +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/nios2/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/nios2/sysv.S new file mode 100644 index 000000000000..75f442bbeeb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/nios2/sysv.S @@ -0,0 +1,136 @@ +/* Low-level libffi support for Altera Nios II. + + Copyright (c) 2013 Mentor Graphics. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +/* This function is declared on the C side as + + extern UINT64 ffi_call_sysv (void (*arghook) (char *, extended_cif *), + extended_cif *ecif, + unsigned nbytes, + void (*fn) (void)); + + On input, the arguments appear as + r4 = arghook + r5 = ecif + r6 = nbytes + r7 = fn +*/ + + .section .text + .align 2 + .global ffi_call_sysv + .type ffi_call_sysv, @function + +ffi_call_sysv: + .cfi_startproc + + /* Create the stack frame, saving r16 so we can use it locally. */ + addi sp, sp, -12 + .cfi_def_cfa_offset 12 + stw ra, 8(sp) + stw fp, 4(sp) + stw r16, 0(sp) + .cfi_offset 31, -4 + .cfi_offset 28, -8 + .cfi_offset 16, -12 + mov fp, sp + .cfi_def_cfa_register 28 + mov r16, r7 + + /* Adjust the stack pointer to create the argument buffer + nbytes long. */ + sub sp, sp, r6 + + /* Call the arghook function. */ + mov r2, r4 /* fn */ + mov r4, sp /* argbuffer */ + callr r2 /* r5 already contains ecif */ + + /* Pop off the first 16 bytes of the argument buffer on the stack, + transferring the contents to the argument registers. */ + ldw r4, 0(sp) + ldw r5, 4(sp) + ldw r6, 8(sp) + ldw r7, 12(sp) + addi sp, sp, 16 + + /* Call the user function, which leaves its result in r2 and r3. */ + callr r16 + + /* Pop off the stack frame. */ + mov sp, fp + ldw ra, 8(sp) + ldw fp, 4(sp) + ldw r16, 0(sp) + addi sp, sp, 12 + ret + .cfi_endproc + .size ffi_call_sysv, .-ffi_call_sysv + + +/* Closure trampolines jump here after putting the C helper address + in r9 and the closure pointer in r10. The user-supplied arguments + to the closure are in the normal places, in r4-r7 and on the + stack. Push the register arguments on the stack too and then call the + C helper function to deal with them. */ + + .section .text + .align 2 + .global ffi_closure_sysv + .type ffi_closure_sysv, @function + +ffi_closure_sysv: + .cfi_startproc + + /* Create the stack frame, pushing the register args on the stack + just below the stack args. This is the same trick illustrated + in Figure 7-3 in the Nios II Processor Reference Handbook, used + for variable arguments and structures passed by value. */ + addi sp, sp, -20 + .cfi_def_cfa_offset 20 + stw ra, 0(sp) + .cfi_offset 31, -20 + stw r4, 4(sp) + .cfi_offset 4, -16 + stw r5, 8(sp) + .cfi_offset 5, -12 + stw r6, 12(sp) + .cfi_offset 6, -8 + stw r7, 16(sp) + .cfi_offset 7, -4 + + /* Call the helper. + r4 = pointer to arguments on stack + r5 = closure pointer (loaded in r10 by the trampoline) + r9 = address of helper function (loaded by trampoline) */ + addi r4, sp, 4 + mov r5, r10 + callr r9 + + /* Pop the stack and return. */ + ldw ra, 0(sp) + addi sp, sp, 20 + .cfi_def_cfa_offset -20 + ret + .cfi_endproc + .size ffi_closure_sysv, .-ffi_closure_sysv + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/or1k/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/or1k/ffi.c new file mode 100644 index 000000000000..2bad938a29f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/or1k/ffi.c @@ -0,0 +1,328 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2014 Sebastian Macke <sebastian@macke.de> + + OpenRISC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include "ffi_common.h" + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void* ffi_prep_args(char *stack, extended_cif *ecif) +{ + char *stacktemp = stack; + int i, s; + ffi_type **arg; + int count = 0; + int nfixedargs; + + nfixedargs = ecif->cif->nfixedargs; + arg = ecif->cif->arg_types; + void **argv = ecif->avalue; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) + { + *(void **) stack = ecif->rvalue; + stack += 4; + count = 4; + } + for(i=0; i<ecif->cif->nargs; i++) + { + + /* variadic args are saved on stack */ + if ((nfixedargs == 0) && (count < 24)) + { + count = 24; + stack = stacktemp + 24; + } + nfixedargs--; + + s = 4; + switch((*arg)->type) + { + case FFI_TYPE_STRUCT: + *(void **)stack = *argv; + break; + + case FFI_TYPE_SINT8: + *(signed int *) stack = (signed int)*(SINT8 *)(* argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) stack = (unsigned int)*(UINT8 *)(* argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) stack = (signed int)*(SINT16 *)(* argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) stack = (unsigned int)*(UINT16 *)(* argv); + break; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + case FFI_TYPE_POINTER: + *(int *)stack = *(int*)(*argv); + break; + + default: /* 8 byte types */ + if (count == 20) /* never split arguments */ + { + stack += 4; + count += 4; + } + s = (*arg)->size; + memcpy(stack, *argv, s); + break; + } + + stack += s; + count += s; + argv++; + arg++; + } + return stacktemp + ((count>24)?24:0); +} + +extern void ffi_call_SYSV(unsigned, + extended_cif *, + void *(*)(int *, extended_cif *), + unsigned *, + void (*fn)(void), + unsigned); + + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + int i; + int size; + ffi_type **arg; + + /* Calculate size to allocate on stack */ + + for(i = 0, arg = cif->arg_types, size=0; i < cif->nargs; i++, arg++) + { + if ((*arg)->type == FFI_TYPE_STRUCT) + size += 4; + else + if ((*arg)->size <= 4) + size += 4; + else + size += 8; + } + + /* for variadic functions more space is needed on the stack */ + if (cif->nargs != cif->nfixedargs) + size += 24; + + if (cif->rtype->type == FFI_TYPE_STRUCT) + size += 4; + + + extended_cif ecif; + ecif.cif = cif; + ecif.avalue = avalue; + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(size, &ecif, ffi_prep_args, rvalue, fn, cif->flags); + break; + default: + FFI_ASSERT(0); + break; + } +} + + +void ffi_closure_SYSV(unsigned long r3, unsigned long r4, unsigned long r5, + unsigned long r6, unsigned long r7, unsigned long r8) +{ + register int *sp __asm__ ("r17"); + register int *r13 __asm__ ("r13"); + + ffi_closure* closure = (ffi_closure*) r13; + char *stack_args = sp; + + /* Lay the register arguments down in a continuous chunk of memory. */ + unsigned register_args[6] = + { r3, r4, r5, r6, r7, r8 }; + + /* Pointer to a struct return value. */ + void *struct_rvalue = (void *) r3; + + ffi_cif *cif = closure->cif; + ffi_type **arg_types = cif->arg_types; + void **avalue = alloca (cif->nargs * sizeof(void *)); + char *ptr = (char *) register_args; + int count = 0; + int nfixedargs = cif->nfixedargs; + int i; + + /* preserve struct type return pointer passing */ + + if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ptr += 4; + count = 4; + } + + /* Find the address of each argument. */ + for (i = 0; i < cif->nargs; i++) + { + + /* variadic args are saved on stack */ + if ((nfixedargs == 0) && (count < 24)) + { + ptr = stack_args; + count = 24; + } + nfixedargs--; + + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = ptr + 3; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = ptr + 2; + break; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + case FFI_TYPE_POINTER: + avalue[i] = ptr; + break; + + case FFI_TYPE_STRUCT: + avalue[i] = *(void**)ptr; + break; + + default: + /* 8-byte values */ + + /* arguments are never splitted */ + if (ptr == &register_args[5]) + ptr = stack_args; + avalue[i] = ptr; + ptr += 4; + count += 4; + break; + } + ptr += 4; + count += 4; + + /* If we've handled more arguments than fit in registers, + start looking at the those passed on the stack. */ + + if (count == 24) + ptr = stack_args; + } + + if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT)) + { + (closure->fun) (cif, struct_rvalue, avalue, closure->user_data); + } else + { + long long rvalue; + (closure->fun) (cif, &rvalue, avalue, closure->user_data); + if (cif->rtype) + asm ("l.ori r12, %0, 0x0\n l.lwz r11, 0(r12)\n l.lwz r12, 4(r12)" : : "r" (&rvalue)); + } +} + + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + unsigned short *tramp = (unsigned short *) closure->tramp; + unsigned long fn = (unsigned long) ffi_closure_SYSV; + unsigned long cls = (unsigned long) codeloc; + + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + /* write pointers to temporary registers */ + tramp[0] = (0x6 << 10) | (13 << 5); /* l.movhi r13, ... */ + tramp[1] = cls >> 16; + tramp[2] = (0x2a << 10) | (13 << 5) | 13; /* l.ori r13, r13, ... */ + tramp[3] = cls & 0xFFFF; + + tramp[4] = (0x6 << 10) | (15 << 5); /* l.movhi r15, ... */ + tramp[5] = fn >> 16; + tramp[6] = (0x2a << 10) | (15 << 5) | 15; /* l.ori r15, r15 ... */ + tramp[7] = fn & 0xFFFF; + + tramp[8] = (0x11 << 10); /* l.jr r15 */ + tramp[9] = 15 << 11; + + tramp[10] = (0x2a << 10) | (17 << 5) | 1; /* l.ori r17, r1, ... */ + tramp[11] = 0x0; + + return FFI_OK; +} + + +ffi_status ffi_prep_cif_machdep (ffi_cif *cif) +{ + cif->flags = 0; + + /* structures are returned as pointers */ + if (cif->rtype->type == FFI_TYPE_STRUCT) + cif->flags = FFI_TYPE_STRUCT; + else + if (cif->rtype->size > 4) + cif->flags = FFI_TYPE_UINT64; + + cif->nfixedargs = cif->nargs; + + return FFI_OK; +} + + +ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, + unsigned int nfixedargs, unsigned int ntotalargs) +{ + ffi_status status; + + status = ffi_prep_cif_machdep (cif); + cif->nfixedargs = nfixedargs; + return status; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/or1k/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/or1k/ffitarget.h new file mode 100644 index 000000000000..e55da286185a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/or1k/ffitarget.h @@ -0,0 +1,58 @@ +/* ----------------------------------------------------------------------- + ffitarget.h - Copyright (c) 2014 Sebastian Macke <sebastian@macke.de> + + OpenRISC Target configuration macros + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- System specific configurations ----------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 +#define FFI_TRAMPOLINE_SIZE (24) + +#define FFI_TARGET_SPECIFIC_VARIADIC 1 +#define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs; + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/or1k/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/or1k/sysv.S new file mode 100644 index 000000000000..df6570ba9d3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/or1k/sysv.S @@ -0,0 +1,107 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2014 Sebastian Macke <sebastian@macke.de> + + OpenRISC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +.text + .globl ffi_call_SYSV + .type ffi_call_SYSV, @function +/* + r3: size to allocate on stack + r4: extended cif structure + r5: function pointer ffi_prep_args + r6: ret address + r7: function to call + r8: flag for return type +*/ + +ffi_call_SYSV: + /* Store registers used on stack */ + l.sw -4(r1), r9 /* return address */ + l.sw -8(r1), r1 /* stack address */ + l.sw -12(r1), r14 /* callee saved registers */ + l.sw -16(r1), r16 + l.sw -20(r1), r18 + l.sw -24(r1), r20 + + l.ori r14, r1, 0x0 /* save stack pointer */ + l.addi r1, r1, -24 + + l.ori r16, r7, 0x0 /* save function address */ + l.ori r18, r6, 0x0 /* save ret address */ + l.ori r20, r8, 0x0 /* save flag */ + + l.sub r1, r1, r3 /* reserve space on stack */ + + /* Call ffi_prep_args */ + l.ori r3, r1, 0x0 /* first argument stack address, second already ecif */ + l.jalr r5 + l.nop + + /* Load register arguments and call*/ + + l.lwz r3, 0(r1) + l.lwz r4, 4(r1) + l.lwz r5, 8(r1) + l.lwz r6, 12(r1) + l.lwz r7, 16(r1) + l.lwz r8, 20(r1) + l.ori r1, r11, 0x0 /* new stack pointer */ + l.jalr r16 + l.nop + + /* handle return values */ + + l.sfeqi r20, FFI_TYPE_STRUCT + l.bf ret /* structs don't return an rvalue */ + l.nop + + /* copy ret address */ + + l.sfeqi r20, FFI_TYPE_UINT64 + l.bnf four_byte_ret /* 8 byte value is returned */ + l.nop + + l.sw 4(r18), r12 + +four_byte_ret: + l.sw 0(r18), r11 + +ret: + /* return */ + l.ori r1, r14, 0x0 /* reset stack pointer */ + l.lwz r9, -4(r1) + l.lwz r1, -8(r1) + l.lwz r14, -12(r1) + l.lwz r16, -16(r1) + l.lwz r18, -20(r1) + l.lwz r20, -24(r1) + l.jr r9 + l.nop + +.size ffi_call_SYSV, .-ffi_call_SYSV diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/ffi.c new file mode 100644 index 000000000000..95e669473e1e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/ffi.c @@ -0,0 +1,674 @@ +/* ----------------------------------------------------------------------- + ffi.c - (c) 2011 Anthony Green + (c) 2008 Red Hat, Inc. + (c) 2006 Free Software Foundation, Inc. + (c) 2003-2004 Randolph Chung <tausq@debian.org> + + HPPA Foreign Function Interface + HP-UX PA ABI support + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <stdio.h> + +#define ROUND_UP(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) + +#define MIN_STACK_SIZE 64 +#define FIRST_ARG_SLOT 9 +#define DEBUG_LEVEL 0 + +#define fldw(addr, fpreg) \ + __asm__ volatile ("fldw 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg) +#define fstw(fpreg, addr) \ + __asm__ volatile ("fstw %%" #fpreg "L, 0(%0)" : : "r"(addr)) +#define fldd(addr, fpreg) \ + __asm__ volatile ("fldd 0(%0), %%" #fpreg : : "r"(addr) : #fpreg) +#define fstd(fpreg, addr) \ + __asm__ volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr)) + +#define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0) + +static inline int ffi_struct_type(ffi_type *t) +{ + size_t sz = t->size; + + /* Small structure results are passed in registers, + larger ones are passed by pointer. Note that + small structures of size 2, 4 and 8 differ from + the corresponding integer types in that they have + different alignment requirements. */ + + if (sz <= 1) + return FFI_TYPE_UINT8; + else if (sz == 2) + return FFI_TYPE_SMALL_STRUCT2; + else if (sz == 3) + return FFI_TYPE_SMALL_STRUCT3; + else if (sz == 4) + return FFI_TYPE_SMALL_STRUCT4; + else if (sz == 5) + return FFI_TYPE_SMALL_STRUCT5; + else if (sz == 6) + return FFI_TYPE_SMALL_STRUCT6; + else if (sz == 7) + return FFI_TYPE_SMALL_STRUCT7; + else if (sz <= 8) + return FFI_TYPE_SMALL_STRUCT8; + else + return FFI_TYPE_STRUCT; /* else, we pass it by pointer. */ +} + +/* PA has a downward growing stack, which looks like this: + + Offset + [ Variable args ] + SP = (4*(n+9)) arg word N + ... + SP-52 arg word 4 + [ Fixed args ] + SP-48 arg word 3 + SP-44 arg word 2 + SP-40 arg word 1 + SP-36 arg word 0 + [ Frame marker ] + ... + SP-20 RP + SP-4 previous SP + + The first four argument words on the stack are reserved for use by + the callee. Instead, the general and floating registers replace + the first four argument slots. Non FP arguments are passed solely + in the general registers. FP arguments are passed in both general + and floating registers when using libffi. + + Non-FP 32-bit args are passed in gr26, gr25, gr24 and gr23. + Non-FP 64-bit args are passed in register pairs, starting + on an odd numbered register (i.e. r25+r26 and r23+r24). + FP 32-bit arguments are passed in fr4L, fr5L, fr6L and fr7L. + FP 64-bit arguments are passed in fr5 and fr7. + + The registers are allocated in the same manner as stack slots. + This allows the callee to save its arguments on the stack if + necessary: + + arg word 3 -> gr23 or fr7L + arg word 2 -> gr24 or fr6L or fr7R + arg word 1 -> gr25 or fr5L + arg word 0 -> gr26 or fr4L or fr5R + + Note that fr4R and fr6R are never used for arguments (i.e., + doubles are not passed in fr4 or fr6). + + The rest of the arguments are passed on the stack starting at SP-52, + but 64-bit arguments need to be aligned to an 8-byte boundary + + This means we can have holes either in the register allocation, + or in the stack. */ + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments + + The following code will put everything into the stack frame + (which was allocated by the asm routine), and on return + the asm routine will load the arguments that should be + passed by register into the appropriate registers + + NOTE: We load floating point args in this function... that means we + assume gcc will not mess with fp regs in here. */ + +void ffi_prep_args_pa32(UINT32 *stack, extended_cif *ecif, unsigned bytes) +{ + register unsigned int i; + register ffi_type **p_arg; + register void **p_argv; + unsigned int slot = FIRST_ARG_SLOT; + char *dest_cpy; + size_t len; + + debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack, + ecif, bytes); + + p_arg = ecif->cif->arg_types; + p_argv = ecif->avalue; + + for (i = 0; i < ecif->cif->nargs; i++) + { + int type = (*p_arg)->type; + + switch (type) + { + case FFI_TYPE_SINT8: + *(SINT32 *)(stack - slot) = *(SINT8 *)(*p_argv); + break; + + case FFI_TYPE_UINT8: + *(UINT32 *)(stack - slot) = *(UINT8 *)(*p_argv); + break; + + case FFI_TYPE_SINT16: + *(SINT32 *)(stack - slot) = *(SINT16 *)(*p_argv); + break; + + case FFI_TYPE_UINT16: + *(UINT32 *)(stack - slot) = *(UINT16 *)(*p_argv); + break; + + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + debug(3, "Storing UINT32 %u in slot %u\n", *(UINT32 *)(*p_argv), + slot); + *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* Align slot for 64-bit type. */ + slot += (slot & 1) ? 1 : 2; + *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); + break; + + case FFI_TYPE_FLOAT: + /* First 4 args go in fr4L - fr7L. */ + debug(3, "Storing UINT32(float) in slot %u\n", slot); + *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); + switch (slot - FIRST_ARG_SLOT) + { + /* First 4 args go in fr4L - fr7L. */ + case 0: fldw(stack - slot, fr4); break; + case 1: fldw(stack - slot, fr5); break; + case 2: fldw(stack - slot, fr6); break; + case 3: fldw(stack - slot, fr7); break; + } + break; + + case FFI_TYPE_DOUBLE: + /* Align slot for 64-bit type. */ + slot += (slot & 1) ? 1 : 2; + debug(3, "Storing UINT64(double) at slot %u\n", slot); + *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); + switch (slot - FIRST_ARG_SLOT) + { + /* First 2 args go in fr5, fr7. */ + case 1: fldd(stack - slot, fr5); break; + case 3: fldd(stack - slot, fr7); break; + } + break; + +#ifdef PA_HPUX + case FFI_TYPE_LONGDOUBLE: + /* Long doubles are passed in the same manner as structures + larger than 8 bytes. */ + *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); + break; +#endif + + case FFI_TYPE_STRUCT: + + /* Structs smaller or equal than 4 bytes are passed in one + register. Structs smaller or equal 8 bytes are passed in two + registers. Larger structures are passed by pointer. */ + + len = (*p_arg)->size; + if (len <= 4) + { + dest_cpy = (char *)(stack - slot) + 4 - len; + memcpy(dest_cpy, (char *)*p_argv, len); + } + else if (len <= 8) + { + slot += (slot & 1) ? 1 : 2; + dest_cpy = (char *)(stack - slot) + 8 - len; + memcpy(dest_cpy, (char *)*p_argv, len); + } + else + *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); + break; + + default: + FFI_ASSERT(0); + } + + slot++; + p_arg++; + p_argv++; + } + + /* Make sure we didn't mess up and scribble on the stack. */ + { + unsigned int n; + + debug(5, "Stack setup:\n"); + for (n = 0; n < (bytes + 3) / 4; n++) + { + if ((n%4) == 0) { debug(5, "\n%08x: ", (unsigned int)(stack - n)); } + debug(5, "%08x ", *(stack - n)); + } + debug(5, "\n"); + } + + FFI_ASSERT(slot * 4 <= bytes); + + return; +} + +static void ffi_size_stack_pa32(ffi_cif *cif) +{ + ffi_type **ptr; + int i; + int z = 0; /* # stack slots */ + + for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++) + { + int type = (*ptr)->type; + + switch (type) + { + case FFI_TYPE_DOUBLE: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + z += 2 + (z & 1); /* must start on even regs, so we may waste one */ + break; + +#ifdef PA_HPUX + case FFI_TYPE_LONGDOUBLE: +#endif + case FFI_TYPE_STRUCT: + z += 1; /* pass by ptr, callee will copy */ + break; + + default: /* <= 32-bit values */ + z++; + } + } + + /* We can fit up to 6 args in the default 64-byte stack frame, + if we need more, we need more stack. */ + if (z <= 6) + cif->bytes = MIN_STACK_SIZE; /* min stack size */ + else + cif->bytes = 64 + ROUND_UP((z - 6) * sizeof(UINT32), MIN_STACK_SIZE); + + debug(3, "Calculated stack size is %u bytes\n", cif->bytes); +} + +/* Perform machine dependent cif processing. */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + cif->flags = (unsigned) cif->rtype->type; + break; + +#ifdef PA_HPUX + case FFI_TYPE_LONGDOUBLE: + /* Long doubles are treated like a structure. */ + cif->flags = FFI_TYPE_STRUCT; + break; +#endif + + case FFI_TYPE_STRUCT: + /* For the return type we have to check the size of the structures. + If the size is smaller or equal 4 bytes, the result is given back + in one register. If the size is smaller or equal 8 bytes than we + return the result in two registers. But if the size is bigger than + 8 bytes, we work with pointers. */ + cif->flags = ffi_struct_type(cif->rtype); + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + cif->flags = FFI_TYPE_UINT64; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + + /* Lucky us, because of the unique PA ABI we get to do our + own stack sizing. */ + switch (cif->abi) + { + case FFI_PA32: + ffi_size_stack_pa32(cif); + break; + + default: + FFI_ASSERT(0); + break; + } + + return FFI_OK; +} + +extern void ffi_call_pa32(void (*)(UINT32 *, extended_cif *, unsigned), + extended_cif *, unsigned, unsigned, unsigned *, + void (*fn)(void)); + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + + if (rvalue == NULL +#ifdef PA_HPUX + && (cif->rtype->type == FFI_TYPE_STRUCT + || cif->rtype->type == FFI_TYPE_LONGDOUBLE)) +#else + && cif->rtype->type == FFI_TYPE_STRUCT) +#endif + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + + switch (cif->abi) + { + case FFI_PA32: + debug(3, "Calling ffi_call_pa32: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn); + ffi_call_pa32(ffi_prep_args_pa32, &ecif, cif->bytes, + cif->flags, ecif.rvalue, fn); + break; + + default: + FFI_ASSERT(0); + break; + } +} + +#if FFI_CLOSURES +/* This is more-or-less an inverse of ffi_call -- we have arguments on + the stack, and we need to fill them into a cif structure and invoke + the user function. This really ought to be in asm to make sure + the compiler doesn't do things we don't expect. */ +ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack) +{ + ffi_cif *cif; + void **avalue; + void *rvalue; + /* Functions can return up to 64-bits in registers. Return address + must be double word aligned. */ + union { double rd; UINT32 ret[2]; } u; + ffi_type **p_arg; + char *tmp; + int i, avn; + unsigned int slot = FIRST_ARG_SLOT; + register UINT32 r28 asm("r28"); + ffi_closure *c = (ffi_closure *)FFI_RESTORE_PTR (closure); + + cif = closure->cif; + + /* If returning via structure, callee will write to our pointer. */ + if (cif->flags == FFI_TYPE_STRUCT) + rvalue = (void *)r28; + else + rvalue = &u; + + avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG); + avn = cif->nargs; + p_arg = cif->arg_types; + + for (i = 0; i < avn; i++) + { + int type = (*p_arg)->type; + + switch (type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + avalue[i] = (char *)(stack - slot) + sizeof(UINT32) - (*p_arg)->size; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + slot += (slot & 1) ? 1 : 2; + avalue[i] = (void *)(stack - slot); + break; + + case FFI_TYPE_FLOAT: +#ifdef PA_LINUX + /* The closure call is indirect. In Linux, floating point + arguments in indirect calls with a prototype are passed + in the floating point registers instead of the general + registers. So, we need to replace what was previously + stored in the current slot with the value in the + corresponding floating point register. */ + switch (slot - FIRST_ARG_SLOT) + { + case 0: fstw(fr4, (void *)(stack - slot)); break; + case 1: fstw(fr5, (void *)(stack - slot)); break; + case 2: fstw(fr6, (void *)(stack - slot)); break; + case 3: fstw(fr7, (void *)(stack - slot)); break; + } +#endif + avalue[i] = (void *)(stack - slot); + break; + + case FFI_TYPE_DOUBLE: + slot += (slot & 1) ? 1 : 2; +#ifdef PA_LINUX + /* See previous comment for FFI_TYPE_FLOAT. */ + switch (slot - FIRST_ARG_SLOT) + { + case 1: fstd(fr5, (void *)(stack - slot)); break; + case 3: fstd(fr7, (void *)(stack - slot)); break; + } +#endif + avalue[i] = (void *)(stack - slot); + break; + +#ifdef PA_HPUX + case FFI_TYPE_LONGDOUBLE: + /* Long doubles are treated like a big structure. */ + avalue[i] = (void *) *(stack - slot); + break; +#endif + + case FFI_TYPE_STRUCT: + /* Structs smaller or equal than 4 bytes are passed in one + register. Structs smaller or equal 8 bytes are passed in two + registers. Larger structures are passed by pointer. */ + if((*p_arg)->size <= 4) + { + avalue[i] = (void *)(stack - slot) + sizeof(UINT32) - + (*p_arg)->size; + } + else if ((*p_arg)->size <= 8) + { + slot += (slot & 1) ? 1 : 2; + avalue[i] = (void *)(stack - slot) + sizeof(UINT64) - + (*p_arg)->size; + } + else + avalue[i] = (void *) *(stack - slot); + break; + + default: + FFI_ASSERT(0); + } + + slot++; + p_arg++; + } + + /* Invoke the closure. */ + (c->fun) (cif, rvalue, avalue, c->user_data); + + debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", u.ret[0], + u.ret[1]); + + /* Store the result using the lower 2 bytes of the flags. */ + switch (cif->flags) + { + case FFI_TYPE_UINT8: + *(stack - FIRST_ARG_SLOT) = (UINT8)(u.ret[0] >> 24); + break; + case FFI_TYPE_SINT8: + *(stack - FIRST_ARG_SLOT) = (SINT8)(u.ret[0] >> 24); + break; + case FFI_TYPE_UINT16: + *(stack - FIRST_ARG_SLOT) = (UINT16)(u.ret[0] >> 16); + break; + case FFI_TYPE_SINT16: + *(stack - FIRST_ARG_SLOT) = (SINT16)(u.ret[0] >> 16); + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + *(stack - FIRST_ARG_SLOT) = u.ret[0]; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + *(stack - FIRST_ARG_SLOT) = u.ret[0]; + *(stack - FIRST_ARG_SLOT - 1) = u.ret[1]; + break; + + case FFI_TYPE_DOUBLE: + fldd(rvalue, fr4); + break; + + case FFI_TYPE_FLOAT: + fldw(rvalue, fr4); + break; + + case FFI_TYPE_STRUCT: + /* Don't need a return value, done by caller. */ + break; + + case FFI_TYPE_SMALL_STRUCT2: + case FFI_TYPE_SMALL_STRUCT3: + case FFI_TYPE_SMALL_STRUCT4: + tmp = (void*)(stack - FIRST_ARG_SLOT); + tmp += 4 - cif->rtype->size; + memcpy((void*)tmp, &u, cif->rtype->size); + break; + + case FFI_TYPE_SMALL_STRUCT5: + case FFI_TYPE_SMALL_STRUCT6: + case FFI_TYPE_SMALL_STRUCT7: + case FFI_TYPE_SMALL_STRUCT8: + { + unsigned int ret2[2]; + int off; + + /* Right justify ret[0] and ret[1] */ + switch (cif->flags) + { + case FFI_TYPE_SMALL_STRUCT5: off = 3; break; + case FFI_TYPE_SMALL_STRUCT6: off = 2; break; + case FFI_TYPE_SMALL_STRUCT7: off = 1; break; + default: off = 0; break; + } + + memset (ret2, 0, sizeof (ret2)); + memcpy ((char *)ret2 + off, &u, 8 - off); + + *(stack - FIRST_ARG_SLOT) = ret2[0]; + *(stack - FIRST_ARG_SLOT - 1) = ret2[1]; + } + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_VOID: + break; + + default: + debug(0, "assert with cif->flags: %d\n",cif->flags); + FFI_ASSERT(0); + break; + } + return FFI_OK; +} + +/* Fill in a closure to refer to the specified fun and user_data. + cif specifies the argument and result types for fun. + The cif must already be prep'ed. */ + +extern void ffi_closure_pa32(void); + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + ffi_closure *c = (ffi_closure *)FFI_RESTORE_PTR (closure); + + /* The layout of a function descriptor. A function pointer with the PLABEL + bit set points to a function descriptor. */ + struct pa32_fd + { + UINT32 code_pointer; + UINT32 gp; + }; + + struct ffi_pa32_trampoline_struct + { + UINT32 code_pointer; /* Pointer to ffi_closure_unix. */ + UINT32 fake_gp; /* Pointer to closure, installed as gp. */ + UINT32 real_gp; /* Real gp value. */ + }; + + struct ffi_pa32_trampoline_struct *tramp; + struct pa32_fd *fd; + + if (cif->abi != FFI_PA32) + return FFI_BAD_ABI; + + /* Get function descriptor address for ffi_closure_pa32. */ + fd = (struct pa32_fd *)((UINT32)ffi_closure_pa32 & ~3); + + /* Setup trampoline. */ + tramp = (struct ffi_pa32_trampoline_struct *)c->tramp; + tramp->code_pointer = fd->code_pointer; + tramp->fake_gp = (UINT32)codeloc & ~3; + tramp->real_gp = fd->gp; + + c->cif = cif; + c->user_data = user_data; + c->fun = fun; + + return FFI_OK; +} +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/ffitarget.h new file mode 100644 index 000000000000..df1209eb1670 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/ffitarget.h @@ -0,0 +1,80 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for hppa. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- System specific configurations ----------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#ifdef PA_LINUX + FFI_PA32, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_PA32 +#endif + +#ifdef PA_HPUX + FFI_PA32, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_PA32 +#endif + +#ifdef PA64_HPUX +#error "PA64_HPUX FFI is not yet implemented" + FFI_PA64, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_PA64 +#endif +} ffi_abi; +#endif + +#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 +#define FFI_TRAMPOLINE_SIZE 12 + +#define FFI_TYPE_SMALL_STRUCT2 -1 +#define FFI_TYPE_SMALL_STRUCT3 -2 +#define FFI_TYPE_SMALL_STRUCT4 -3 +#define FFI_TYPE_SMALL_STRUCT5 -4 +#define FFI_TYPE_SMALL_STRUCT6 -5 +#define FFI_TYPE_SMALL_STRUCT7 -6 +#define FFI_TYPE_SMALL_STRUCT8 -7 +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/hpux32.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/hpux32.S new file mode 100644 index 000000000000..d0e5f695297b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/hpux32.S @@ -0,0 +1,370 @@ +/* ----------------------------------------------------------------------- + hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc. + (c) 2008 Red Hat, Inc. + based on src/pa/linux.S + + HP-UX PA Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + .LEVEL 1.1 + .SPACE $PRIVATE$ + .IMPORT $global$,DATA + .IMPORT $$dyncall,MILLICODE + .SUBSPA $DATA$ + .align 4 + + /* void ffi_call_pa32(void (*)(char *, extended_cif *), + extended_cif *ecif, + unsigned bytes, + unsigned flags, + unsigned *rvalue, + void (*fn)(void)); + */ + + .export ffi_call_pa32,ENTRY,PRIV_LEV=3 + .import ffi_prep_args_pa32,CODE + + .SPACE $TEXT$ + .SUBSPA $CODE$ + .align 4 + +L$FB1 +ffi_call_pa32 + .proc + .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 + .entry + stw %rp, -20(%sp) + copy %r3, %r1 +L$CFI11 + copy %sp, %r3 +L$CFI12 + + /* Setup the stack for calling prep_args... + We want the stack to look like this: + + [ Previous stack ] <- %r3 + + [ 64-bytes register save area ] <- %r4 + + [ Stack space for actual call, passed as ] <- %arg0 + [ arg0 to ffi_prep_args_pa32 ] + + [ Stack for calling prep_args ] <- %sp + */ + + stwm %r1, 64(%sp) + stw %r4, 12(%r3) +L$CFI13 + copy %sp, %r4 + + addl %arg2, %r4, %arg0 ; arg stack + stw %arg3, -48(%r3) ; save flags we need it later + + /* Call prep_args: + %arg0(stack) -- set up above + %arg1(ecif) -- same as incoming param + %arg2(bytes) -- same as incoming param */ + bl ffi_prep_args_pa32,%r2 + ldo 64(%arg0), %sp + ldo -64(%sp), %sp + + /* now %sp should point where %arg0 was pointing. */ + + /* Load the arguments that should be passed in registers + The fp args are loaded by the prep_args function. */ + ldw -36(%sp), %arg0 + ldw -40(%sp), %arg1 + ldw -44(%sp), %arg2 + ldw -48(%sp), %arg3 + + /* in case the function is going to return a structure + we need to give it a place to put the result. */ + ldw -52(%r3), %ret0 ; %ret0 <- rvalue + ldw -56(%r3), %r22 ; %r22 <- function to call + bl $$dyncall, %r31 ; Call the user function + copy %r31, %rp + + /* Prepare to store the result; we need to recover flags and rvalue. */ + ldw -48(%r3), %r21 ; r21 <- flags + ldw -52(%r3), %r20 ; r20 <- rvalue + + /* Store the result according to the return type. The most + likely types should come first. */ + +L$checkint + comib,<>,n FFI_TYPE_INT, %r21, L$checkint8 + b L$done + stw %ret0, 0(%r20) + +L$checkint8 + comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16 + b L$done + stb %ret0, 0(%r20) + +L$checkint16 + comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl + b L$done + sth %ret0, 0(%r20) + +L$checkdbl + comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat + b L$done + fstd %fr4,0(%r20) + +L$checkfloat + comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll + b L$done + fstw %fr4L,0(%r20) + +L$checkll + comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2 + stw %ret0, 0(%r20) + b L$done + stw %ret1, 4(%r20) + +L$checksmst2 + comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3 + /* 2-byte structs are returned in ret0 as ????xxyy. */ + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret0, 0(%r20) + +L$checksmst3 + comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4 + /* 3-byte structs are returned in ret0 as ??xxyyzz. */ + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret0, 0(%r20) + +L$checksmst4 + comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5 + /* 4-byte structs are returned in ret0 as wwxxyyzz. */ + extru %ret0, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret0, 0(%r20) + +L$checksmst5 + comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6 + /* 5 byte values are returned right justified: + ret0 ret1 + 5: ??????aa bbccddee */ + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret1, 0(%r20) + +L$checksmst6 + comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7 + /* 6 byte values are returned right justified: + ret0 ret1 + 6: ????aabb ccddeeff */ + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret1, 0(%r20) + +L$checksmst7 + comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8 + /* 7 byte values are returned right justified: + ret0 ret1 + 7: ??aabbcc ddeeffgg */ + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b L$done + stb %ret1, 0(%r20) + +L$checksmst8 + comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done + /* 8 byte values are returned right justified: + ret0 ret1 + 8: aabbccdd eeffgghh */ + extru %ret0, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stb %ret1, 0(%r20) + +L$done + /* all done, return */ + copy %r4, %sp ; pop arg stack + ldw 12(%r3), %r4 + ldwm -64(%sp), %r3 ; .. and pop stack + ldw -20(%sp), %rp + bv %r0(%rp) + nop + .exit + .procend +L$FE1 + + /* void ffi_closure_pa32(void); + Called with closure argument in %r19 */ + + .SPACE $TEXT$ + .SUBSPA $CODE$ + .export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR + .import ffi_closure_inner_pa32,CODE + .align 4 +L$FB2 +ffi_closure_pa32 + .proc + .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 + .entry + + stw %rp, -20(%sp) + copy %r3, %r1 +L$CFI21 + copy %sp, %r3 +L$CFI22 + stwm %r1, 64(%sp) + + /* Put arguments onto the stack and call ffi_closure_inner. */ + stw %arg0, -36(%r3) + stw %arg1, -40(%r3) + stw %arg2, -44(%r3) + stw %arg3, -48(%r3) + + /* Retrieve closure pointer and real gp. */ + copy %r19, %arg0 + ldw 8(%r19), %r19 + bl ffi_closure_inner_pa32, %r2 + copy %r3, %arg1 + ldwm -64(%sp), %r3 + ldw -20(%sp), %rp + ldw -36(%sp), %ret0 + bv %r0(%rp) + ldw -40(%sp), %ret1 + .exit + .procend +L$FE2: + + .SPACE $PRIVATE$ + .SUBSPA $DATA$ + + .align 4 + .EXPORT _GLOBAL__F_ffi_call_pa32,DATA +_GLOBAL__F_ffi_call_pa32 +L$frame1: + .word L$ECIE1-L$SCIE1 ;# Length of Common Information Entry +L$SCIE1: + .word 0x0 ;# CIE Identifier Tag + .byte 0x1 ;# CIE Version + .ascii "\0" ;# CIE Augmentation + .uleb128 0x1 ;# CIE Code Alignment Factor + .sleb128 4 ;# CIE Data Alignment Factor + .byte 0x2 ;# CIE RA Column + .byte 0xc ;# DW_CFA_def_cfa + .uleb128 0x1e + .uleb128 0x0 + .align 4 +L$ECIE1: +L$SFDE1: + .word L$EFDE1-L$ASFDE1 ;# FDE Length +L$ASFDE1: + .word L$ASFDE1-L$frame1 ;# FDE CIE offset + .word L$FB1 ;# FDE initial location + .word L$FE1-L$FB1 ;# FDE address range + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI11-L$FB1 + .byte 0x83 ;# DW_CFA_offset, column 0x3 + .uleb128 0x0 + .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] + .uleb128 0x2 + .sleb128 -5 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI12-L$CFI11 + .byte 0xd ;# DW_CFA_def_cfa_register = r3 + .uleb128 0x3 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI13-L$CFI12 + .byte 0x84 ;# DW_CFA_offset, column 0x4 + .uleb128 0x3 + + .align 4 +L$EFDE1: + +L$SFDE2: + .word L$EFDE2-L$ASFDE2 ;# FDE Length +L$ASFDE2: + .word L$ASFDE2-L$frame1 ;# FDE CIE offset + .word L$FB2 ;# FDE initial location + .word L$FE2-L$FB2 ;# FDE address range + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI21-L$FB2 + .byte 0x83 ;# DW_CFA_offset, column 0x3 + .uleb128 0x0 + .byte 0x11 ;# DW_CFA_offset_extended_sf + .uleb128 0x2 + .sleb128 -5 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word L$CFI22-L$CFI21 + .byte 0xd ;# DW_CFA_def_cfa_register = r3 + .uleb128 0x3 + + .align 4 +L$EFDE2: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/linux.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/linux.S new file mode 100644 index 000000000000..33ef0b137a41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/pa/linux.S @@ -0,0 +1,380 @@ +/* ----------------------------------------------------------------------- + linux.S - (c) 2003-2004 Randolph Chung <tausq@debian.org> + (c) 2008 Red Hat, Inc. + + HPPA Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + .text + .level 1.1 + .align 4 + + /* void ffi_call_pa32(void (*)(char *, extended_cif *), + extended_cif *ecif, + unsigned bytes, + unsigned flags, + unsigned *rvalue, + void (*fn)(void)); + */ + + .export ffi_call_pa32,code + .import ffi_prep_args_pa32,code + + .type ffi_call_pa32, @function +.LFB1: +ffi_call_pa32: + .proc + .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 + .entry + stw %rp, -20(%sp) + copy %r3, %r1 +.LCFI11: + + copy %sp, %r3 +.LCFI12: + + /* Setup the stack for calling prep_args... + We want the stack to look like this: + + [ Previous stack ] <- %r3 + + [ 64-bytes register save area ] <- %r4 + + [ Stack space for actual call, passed as ] <- %arg0 + [ arg0 to ffi_prep_args_pa32 ] + + [ Stack for calling prep_args ] <- %sp + */ + + stwm %r1, 64(%sp) + stw %r4, 12(%r3) +.LCFI13: + copy %sp, %r4 + + addl %arg2, %r4, %arg0 /* arg stack */ + stw %arg3, -48(%r3) /* save flags; we need it later */ + + /* Call prep_args: + %arg0(stack) -- set up above + %arg1(ecif) -- same as incoming param + %arg2(bytes) -- same as incoming param */ + bl ffi_prep_args_pa32,%r2 + ldo 64(%arg0), %sp + ldo -64(%sp), %sp + + /* now %sp should point where %arg0 was pointing. */ + + /* Load the arguments that should be passed in registers + The fp args were loaded by the prep_args function. */ + ldw -36(%sp), %arg0 + ldw -40(%sp), %arg1 + ldw -44(%sp), %arg2 + ldw -48(%sp), %arg3 + + /* in case the function is going to return a structure + we need to give it a place to put the result. */ + ldw -52(%r3), %ret0 /* %ret0 <- rvalue */ + ldw -56(%r3), %r22 /* %r22 <- function to call */ + bl $$dyncall, %r31 /* Call the user function */ + copy %r31, %rp + + /* Prepare to store the result; we need to recover flags and rvalue. */ + ldw -48(%r3), %r21 /* r21 <- flags */ + ldw -52(%r3), %r20 /* r20 <- rvalue */ + + /* Store the result according to the return type. */ + +.Lcheckint: + comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8 + b .Ldone + stw %ret0, 0(%r20) + +.Lcheckint8: + comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16 + b .Ldone + stb %ret0, 0(%r20) + +.Lcheckint16: + comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl + b .Ldone + sth %ret0, 0(%r20) + +.Lcheckdbl: + comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat + b .Ldone + fstd %fr4,0(%r20) + +.Lcheckfloat: + comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll + b .Ldone + fstw %fr4L,0(%r20) + +.Lcheckll: + comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2 + stw %ret0, 0(%r20) + b .Ldone + stw %ret1, 4(%r20) + +.Lchecksmst2: + comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3 + /* 2-byte structs are returned in ret0 as ????xxyy. */ + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret0, 0(%r20) + +.Lchecksmst3: + comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4 + /* 3-byte structs are returned in ret0 as ??xxyyzz. */ + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret0, 0(%r20) + +.Lchecksmst4: + comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5 + /* 4-byte structs are returned in ret0 as wwxxyyzz. */ + extru %ret0, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret0, 0(%r20) + +.Lchecksmst5: + comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6 + /* 5 byte values are returned right justified: + ret0 ret1 + 5: ??????aa bbccddee */ + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret1, 0(%r20) + +.Lchecksmst6: + comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7 + /* 6 byte values are returned right justified: + ret0 ret1 + 6: ????aabb ccddeeff */ + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret1, 0(%r20) + +.Lchecksmst7: + comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8 + /* 7 byte values are returned right justified: + ret0 ret1 + 7: ??aabbcc ddeeffgg */ + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + b .Ldone + stb %ret1, 0(%r20) + +.Lchecksmst8: + comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone + /* 8 byte values are returned right justified: + ret0 ret1 + 8: aabbccdd eeffgghh */ + extru %ret0, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret0, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stbs,ma %ret0, 1(%r20) + extru %ret1, 7, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 15, 8, %r22 + stbs,ma %r22, 1(%r20) + extru %ret1, 23, 8, %r22 + stbs,ma %r22, 1(%r20) + stb %ret1, 0(%r20) + +.Ldone: + /* all done, return */ + copy %r4, %sp /* pop arg stack */ + ldw 12(%r3), %r4 + ldwm -64(%sp), %r3 /* .. and pop stack */ + ldw -20(%sp), %rp + bv %r0(%rp) + nop + .exit + .procend +.LFE1: + + /* void ffi_closure_pa32(void); + Called with closure argument in %r19 */ + .export ffi_closure_pa32,code + .import ffi_closure_inner_pa32,code + + .type ffi_closure_pa32, @function +.LFB2: +ffi_closure_pa32: + .proc + .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 + .entry + + stw %rp, -20(%sp) +.LCFI20: + copy %r3, %r1 +.LCFI21: + copy %sp, %r3 +.LCFI22: + stwm %r1, 64(%sp) + + /* Put arguments onto the stack and call ffi_closure_inner. */ + stw %arg0, -36(%r3) + stw %arg1, -40(%r3) + stw %arg2, -44(%r3) + stw %arg3, -48(%r3) + + /* Retrieve closure pointer and real gp. */ + copy %r19, %arg0 + ldw 8(%r19), %r19 + bl ffi_closure_inner_pa32, %r2 + copy %r3, %arg1 + + ldwm -64(%sp), %r3 + ldw -20(%sp), %rp + ldw -36(%sp), %ret0 + bv %r0(%r2) + ldw -40(%sp), %ret1 + + .exit + .procend +.LFE2: + + .section ".eh_frame",EH_FRAME_FLAGS,@progbits +.Lframe1: + .word .LECIE1-.LSCIE1 ;# Length of Common Information Entry +.LSCIE1: + .word 0x0 ;# CIE Identifier Tag + .byte 0x1 ;# CIE Version +#ifdef __PIC__ + .ascii "zR\0" ;# CIE Augmentation: 'z' - data, 'R' - DW_EH_PE_... data +#else + .ascii "\0" ;# CIE Augmentation +#endif + .uleb128 0x1 ;# CIE Code Alignment Factor + .sleb128 4 ;# CIE Data Alignment Factor + .byte 0x2 ;# CIE RA Column +#ifdef __PIC__ + .uleb128 0x1 ;# Augmentation size + .byte 0x1b ;# FDE Encoding (DW_EH_PE_pcrel|DW_EH_PE_sdata4) +#endif + .byte 0xc ;# DW_CFA_def_cfa + .uleb128 0x1e + .uleb128 0x0 + .align 4 +.LECIE1: +.LSFDE1: + .word .LEFDE1-.LASFDE1 ;# FDE Length +.LASFDE1: + .word .LASFDE1-.Lframe1 ;# FDE CIE offset +#ifdef __PIC__ + .word .LFB1-. ;# FDE initial location +#else + .word .LFB1 ;# FDE initial location +#endif + .word .LFE1-.LFB1 ;# FDE address range +#ifdef __PIC__ + .uleb128 0x0 ;# Augmentation size: no data +#endif + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI11-.LFB1 + .byte 0x83 ;# DW_CFA_offset, column 0x3 + .uleb128 0x0 + .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] + .uleb128 0x2 + .sleb128 -5 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI12-.LCFI11 + .byte 0xd ;# DW_CFA_def_cfa_register = r3 + .uleb128 0x3 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI13-.LCFI12 + .byte 0x84 ;# DW_CFA_offset, column 0x4 + .uleb128 0x3 + + .align 4 +.LEFDE1: + +.LSFDE2: + .word .LEFDE2-.LASFDE2 ;# FDE Length +.LASFDE2: + .word .LASFDE2-.Lframe1 ;# FDE CIE offset +#ifdef __PIC__ + .word .LFB2-. ;# FDE initial location +#else + .word .LFB2 ;# FDE initial location +#endif + .word .LFE2-.LFB2 ;# FDE address range +#ifdef __PIC__ + .uleb128 0x0 ;# Augmentation size: no data +#endif + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI21-.LFB2 + .byte 0x83 ;# DW_CFA_offset, column 0x3 + .uleb128 0x0 + .byte 0x11 ;# DW_CFA_offset_extended_sf + .uleb128 0x2 + .sleb128 -5 + + .byte 0x4 ;# DW_CFA_advance_loc4 + .word .LCFI22-.LCFI21 + .byte 0xd ;# DW_CFA_def_cfa_register = r3 + .uleb128 0x3 + + .align 4 +.LEFDE2: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/aix.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/aix.S new file mode 100644 index 000000000000..7ba541595f23 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/aix.S @@ -0,0 +1,566 @@ +/* ----------------------------------------------------------------------- + aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc. + based on darwin.S by John Hornkvist + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + .set r0,0 + .set r1,1 + .set r2,2 + .set r3,3 + .set r4,4 + .set r5,5 + .set r6,6 + .set r7,7 + .set r8,8 + .set r9,9 + .set r10,10 + .set r11,11 + .set r12,12 + .set r13,13 + .set r14,14 + .set r15,15 + .set r16,16 + .set r17,17 + .set r18,18 + .set r19,19 + .set r20,20 + .set r21,21 + .set r22,22 + .set r23,23 + .set r24,24 + .set r25,25 + .set r26,26 + .set r27,27 + .set r28,28 + .set r29,29 + .set r30,30 + .set r31,31 + .set f0,0 + .set f1,1 + .set f2,2 + .set f3,3 + .set f4,4 + .set f5,5 + .set f6,6 + .set f7,7 + .set f8,8 + .set f9,9 + .set f10,10 + .set f11,11 + .set f12,12 + .set f13,13 + .set f14,14 + .set f15,15 + .set f16,16 + .set f17,17 + .set f18,18 + .set f19,19 + .set f20,20 + .set f21,21 + + .extern .ffi_prep_args + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#define JUMPTARGET(name) name +#define L(x) x + .file "aix.S" + .toc + + /* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes, + * unsigned int flags, unsigned int *rvalue, + * void (*fn)(), + * void (*prep_args)(extended_cif*, unsigned *const)); + * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args + */ + +.csect .text[PR] + .align 2 + .globl ffi_call_AIX + .globl .ffi_call_AIX +.csect ffi_call_AIX[DS] +ffi_call_AIX: +#ifdef __64BIT__ + .llong .ffi_call_AIX, TOC[tc0], 0 + .csect .text[PR] +.ffi_call_AIX: + .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0 + .bf __LINE__ + .line 1 +LFB..0: + /* Save registers we use. */ + mflr r0 + + std r28,-32(r1) + std r29,-24(r1) + std r30,-16(r1) + std r31, -8(r1) + + std r0, 16(r1) +LCFI..0: + mr r28, r1 /* our AP. */ + stdux r1, r1, r4 +LCFI..1: + + /* Save arguments over call... */ + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address. */ + std r2, 40(r1) + + /* Call ffi_prep_args. */ + mr r4, r1 + bl .ffi_prep_args + nop + + /* Now do the call. */ + ld r0, 0(r29) + ld r2, 8(r29) + ld r11, 16(r29) + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 + /* Load all those argument registers. */ + /* We have set up a nice stack frame, just load it into registers. */ + ld r3, 40+(1*8)(r1) + ld r4, 40+(2*8)(r1) + ld r5, 40+(3*8)(r1) + ld r6, 40+(4*8)(r1) + nop + ld r7, 40+(5*8)(r1) + ld r8, 40+(6*8)(r1) + ld r9, 40+(7*8)(r1) + ld r10,40+(8*8)(r1) + +L1: + /* Load all the FP registers. */ + bf 6,L2 /* 2f + 0x18 */ + lfd f1,-32-(13*8)(r28) + lfd f2,-32-(12*8)(r28) + lfd f3,-32-(11*8)(r28) + lfd f4,-32-(10*8)(r28) + nop + lfd f5,-32-(9*8)(r28) + lfd f6,-32-(8*8)(r28) + lfd f7,-32-(7*8)(r28) + lfd f8,-32-(6*8)(r28) + nop + lfd f9,-32-(5*8)(r28) + lfd f10,-32-(4*8)(r28) + lfd f11,-32-(3*8)(r28) + lfd f12,-32-(2*8)(r28) + nop + lfd f13,-32-(1*8)(r28) + +L2: + /* Make the call. */ + bctrl + ld r2, 40(r1) + + /* Now, deal with the return value. */ + mtcrf 0x01, r31 + + bt 30, L(done_return_value) + bt 29, L(fp_return_value) + std r3, 0(r30) + + /* Fall through... */ + +L(done_return_value): + /* Restore the registers we used and return. */ + mr r1, r28 + ld r0, 16(r28) + ld r28, -32(r1) + mtlr r0 + ld r29, -24(r1) + ld r30, -16(r1) + ld r31, -8(r1) + blr + +L(fp_return_value): + bf 28, L(float_return_value) + stfd f1, 0(r30) + bf 31, L(done_return_value) + stfd f2, 8(r30) + b L(done_return_value) +L(float_return_value): + stfs f1, 0(r30) + b L(done_return_value) +LFE..0: +#else /* ! __64BIT__ */ + + .long .ffi_call_AIX, TOC[tc0], 0 + .csect .text[PR] +.ffi_call_AIX: + .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0 + .bf __LINE__ + .line 1 +LFB..0: + /* Save registers we use. */ + mflr r0 + + stw r28,-16(r1) + stw r29,-12(r1) + stw r30, -8(r1) + stw r31, -4(r1) + + stw r0, 8(r1) +LCFI..0: + mr r28, r1 /* out AP. */ + stwux r1, r1, r4 +LCFI..1: + + /* Save arguments over call... */ + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address, */ + stw r2, 20(r1) + + /* Call ffi_prep_args. */ + mr r4, r1 + bl .ffi_prep_args + nop + + /* Now do the call. */ + lwz r0, 0(r29) + lwz r2, 4(r29) + lwz r11, 8(r29) + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 + /* Load all those argument registers. */ + /* We have set up a nice stack frame, just load it into registers. */ + lwz r3, 20+(1*4)(r1) + lwz r4, 20+(2*4)(r1) + lwz r5, 20+(3*4)(r1) + lwz r6, 20+(4*4)(r1) + nop + lwz r7, 20+(5*4)(r1) + lwz r8, 20+(6*4)(r1) + lwz r9, 20+(7*4)(r1) + lwz r10,20+(8*4)(r1) + +L1: + /* Load all the FP registers. */ + bf 6,L2 /* 2f + 0x18 */ + lfd f1,-16-(13*8)(r28) + lfd f2,-16-(12*8)(r28) + lfd f3,-16-(11*8)(r28) + lfd f4,-16-(10*8)(r28) + nop + lfd f5,-16-(9*8)(r28) + lfd f6,-16-(8*8)(r28) + lfd f7,-16-(7*8)(r28) + lfd f8,-16-(6*8)(r28) + nop + lfd f9,-16-(5*8)(r28) + lfd f10,-16-(4*8)(r28) + lfd f11,-16-(3*8)(r28) + lfd f12,-16-(2*8)(r28) + nop + lfd f13,-16-(1*8)(r28) + +L2: + /* Make the call. */ + bctrl + lwz r2, 20(r1) + + /* Now, deal with the return value. */ + mtcrf 0x01, r31 + + bt 30, L(done_return_value) + bt 29, L(fp_return_value) + stw r3, 0(r30) + bf 28, L(done_return_value) + stw r4, 4(r30) + + /* Fall through... */ + +L(done_return_value): + /* Restore the registers we used and return. */ + mr r1, r28 + lwz r0, 8(r28) + lwz r28,-16(r1) + mtlr r0 + lwz r29,-12(r1) + lwz r30, -8(r1) + lwz r31, -4(r1) + blr + +L(fp_return_value): + bf 28, L(float_return_value) + stfd f1, 0(r30) + b L(done_return_value) +L(float_return_value): + stfs f1, 0(r30) + b L(done_return_value) +LFE..0: +#endif + .ef __LINE__ + .long 0 + .byte 0,0,0,1,128,4,0,0 +/* END(ffi_call_AIX) */ + + /* void ffi_call_go_AIX(extended_cif *ecif, unsigned long bytes, + * unsigned int flags, unsigned int *rvalue, + * void (*fn)(), + * void (*prep_args)(extended_cif*, unsigned *const), + * void *closure); + * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args, r9=closure + */ + +.csect .text[PR] + .align 2 + .globl ffi_call_go_AIX + .globl .ffi_call_go_AIX +.csect ffi_call_go_AIX[DS] +ffi_call_go_AIX: +#ifdef __64BIT__ + .llong .ffi_call_go_AIX, TOC[tc0], 0 + .csect .text[PR] +.ffi_call_go_AIX: + .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1 + .bf __LINE__ + .line 1 +LFB..1: + /* Save registers we use. */ + mflr r0 + + std r28,-32(r1) + std r29,-24(r1) + std r30,-16(r1) + std r31, -8(r1) + + std r9, 8(r1) /* closure, saved in cr field. */ + std r0, 16(r1) +LCFI..2: + mr r28, r1 /* our AP. */ + stdux r1, r1, r4 +LCFI..3: + + /* Save arguments over call... */ + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address, */ + std r2, 40(r1) + + /* Call ffi_prep_args. */ + mr r4, r1 + bl .ffi_prep_args + nop + + /* Now do the call. */ + ld r0, 0(r29) + ld r2, 8(r29) + ld r11, 8(r28) /* closure */ + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 + /* Load all those argument registers. */ + /* We have set up a nice stack frame, just load it into registers. */ + ld r3, 40+(1*8)(r1) + ld r4, 40+(2*8)(r1) + ld r5, 40+(3*8)(r1) + ld r6, 40+(4*8)(r1) + nop + ld r7, 40+(5*8)(r1) + ld r8, 40+(6*8)(r1) + ld r9, 40+(7*8)(r1) + ld r10,40+(8*8)(r1) + + b L1 +LFE..1: +#else /* ! __64BIT__ */ + + .long .ffi_call_go_AIX, TOC[tc0], 0 + .csect .text[PR] +.ffi_call_go_AIX: + .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1 + .bf __LINE__ + .line 1 + /* Save registers we use. */ +LFB..1: + mflr r0 + + stw r28,-16(r1) + stw r29,-12(r1) + stw r30, -8(r1) + stw r31, -4(r1) + + stw r9, 4(r1) /* closure, saved in cr field. */ + stw r0, 8(r1) +LCFI..2: + mr r28, r1 /* out AP. */ + stwux r1, r1, r4 +LCFI..3: + + /* Save arguments over call... */ + mr r31, r5 /* flags, */ + mr r30, r6 /* rvalue, */ + mr r29, r7 /* function address, */ + stw r2, 20(r1) + + /* Call ffi_prep_args. */ + mr r4, r1 + bl .ffi_prep_args + nop + + /* Now do the call. */ + lwz r0, 0(r29) + lwz r2, 4(r29) + lwz r11, 4(r28) /* closure */ + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40, r31 + mtctr r0 + /* Load all those argument registers. */ + /* We have set up a nice stack frame, just load it into registers. */ + lwz r3, 20+(1*4)(r1) + lwz r4, 20+(2*4)(r1) + lwz r5, 20+(3*4)(r1) + lwz r6, 20+(4*4)(r1) + nop + lwz r7, 20+(5*4)(r1) + lwz r8, 20+(6*4)(r1) + lwz r9, 20+(7*4)(r1) + lwz r10,20+(8*4)(r1) + + b L1 +LFE..1: +#endif + .ef __LINE__ + .long 0 + .byte 0,0,0,1,128,4,0,0 +/* END(ffi_call_go_AIX) */ + +.csect .text[PR] + .align 2 + .globl ffi_call_DARWIN + .globl .ffi_call_DARWIN +.csect ffi_call_DARWIN[DS] +ffi_call_DARWIN: +#ifdef __64BIT__ + .llong .ffi_call_DARWIN, TOC[tc0], 0 +#else + .long .ffi_call_DARWIN, TOC[tc0], 0 +#endif + .csect .text[PR] +.ffi_call_DARWIN: + blr + .long 0 + .byte 0,0,0,0,0,0,0,0 +/* END(ffi_call_DARWIN) */ + +/* EH frame stuff. */ + +#define LR_REGNO 0x41 /* Link Register (65), see rs6000.md */ +#ifdef __64BIT__ +#define PTRSIZE 8 +#define LOG2_PTRSIZE 3 +#define FDE_ENCODING 0x1c /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */ +#define EH_DATA_ALIGN_FACT 0x78 /* LEB128 -8 */ +#else +#define PTRSIZE 4 +#define LOG2_PTRSIZE 2 +#define FDE_ENCODING 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */ +#define EH_DATA_ALIGN_FACT 0x7c /* LEB128 -4 */ +#endif + .csect _unwind.ro_[RO],4 + .align LOG2_PTRSIZE + .globl _GLOBAL__F_libffi_src_powerpc_aix +_GLOBAL__F_libffi_src_powerpc_aix: +Lframe..1: + .vbyte 4,LECIE..1-LSCIE..1 /* CIE Length */ +LSCIE..1: + .vbyte 4,0 /* CIE Identifier Tag */ + .byte 0x3 /* CIE Version */ + .byte "zR" /* CIE Augmentation */ + .byte 0 + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte EH_DATA_ALIGN_FACT /* leb128 -4/-8; CIE Data Alignment Factor */ + .byte 0x41 /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte FDE_ENCODING /* FDE Encoding (pcrel|sdata4/8) */ + .byte 0xc /* DW_CFA_def_cfa */ + .byte 0x1 /* uleb128 0x1; Register r1 */ + .byte 0 /* uleb128 0x0; Offset 0 */ + .align LOG2_PTRSIZE +LECIE..1: +LSFDE..1: + .vbyte 4,LEFDE..1-LASFDE..1 /* FDE Length */ +LASFDE..1: + .vbyte 4,LASFDE..1-Lframe..1 /* FDE CIE offset */ + .vbyte PTRSIZE,LFB..0-$ /* FDE initial location */ + .vbyte PTRSIZE,LFE..0-LFB..0 /* FDE address range */ + .byte 0 /* uleb128 0x0; Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .vbyte 4,LCFI..0-LFB..0 + .byte 0x11 /* DW_CFA_def_offset_extended_sf */ + .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ + .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ + .byte 0x9f /* DW_CFA_offset Register r31 */ + .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */ + .byte 0x9e /* DW_CFA_offset Register r30 */ + .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */ + .byte 0x9d /* DW_CFA_offset Register r29 */ + .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */ + .byte 0x9c /* DW_CFA_offset Register r28 */ + .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .vbyte 4,LCFI..1-LCFI..0 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0x1c /* uleb128 28; Register r28 */ + .align LOG2_PTRSIZE +LEFDE..1: +LSFDE..2: + .vbyte 4,LEFDE..2-LASFDE..2 /* FDE Length */ +LASFDE..2: + .vbyte 4,LASFDE..2-Lframe..1 /* FDE CIE offset */ + .vbyte PTRSIZE,LFB..1-$ /* FDE initial location */ + .vbyte PTRSIZE,LFE..1-LFB..1 /* FDE address range */ + .byte 0 /* uleb128 0x0; Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .vbyte 4,LCFI..2-LFB..1 + .byte 0x11 /* DW_CFA_def_offset_extended_sf */ + .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ + .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ + .byte 0x9f /* DW_CFA_offset Register r31 */ + .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */ + .byte 0x9e /* DW_CFA_offset Register r30 */ + .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */ + .byte 0x9d /* DW_CFA_offset Register r29 */ + .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */ + .byte 0x9c /* DW_CFA_offset Register r28 */ + .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .vbyte 4,LCFI..3-LCFI..2 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0x1c /* uleb128 28; Register r28 */ + .align LOG2_PTRSIZE +LEFDE..2: + .vbyte 4,0 /* End of FDEs */ + + .csect .text[PR] + .ref _GLOBAL__F_libffi_src_powerpc_aix /* Prevents garbage collection by AIX linker */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/aix_closure.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/aix_closure.S new file mode 100644 index 000000000000..132c785eddc8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/aix_closure.S @@ -0,0 +1,694 @@ +/* ----------------------------------------------------------------------- + aix_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc. + based on darwin_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + .set r0,0 + .set r1,1 + .set r2,2 + .set r3,3 + .set r4,4 + .set r5,5 + .set r6,6 + .set r7,7 + .set r8,8 + .set r9,9 + .set r10,10 + .set r11,11 + .set r12,12 + .set r13,13 + .set r14,14 + .set r15,15 + .set r16,16 + .set r17,17 + .set r18,18 + .set r19,19 + .set r20,20 + .set r21,21 + .set r22,22 + .set r23,23 + .set r24,24 + .set r25,25 + .set r26,26 + .set r27,27 + .set r28,28 + .set r29,29 + .set r30,30 + .set r31,31 + .set f0,0 + .set f1,1 + .set f2,2 + .set f3,3 + .set f4,4 + .set f5,5 + .set f6,6 + .set f7,7 + .set f8,8 + .set f9,9 + .set f10,10 + .set f11,11 + .set f12,12 + .set f13,13 + .set f14,14 + .set f15,15 + .set f16,16 + .set f17,17 + .set f18,18 + .set f19,19 + .set f20,20 + .set f21,21 + + .extern .ffi_closure_helper_DARWIN + .extern .ffi_go_closure_helper_DARWIN + +#define LIBFFI_ASM +#define JUMPTARGET(name) name +#define L(x) x + .file "aix_closure.S" + .toc +LC..60: + .tc L..60[TC],L..60 + .csect .text[PR] + .align 2 + +.csect .text[PR] + .align 2 + .globl ffi_closure_ASM + .globl .ffi_closure_ASM +.csect ffi_closure_ASM[DS] +ffi_closure_ASM: +#ifdef __64BIT__ + .llong .ffi_closure_ASM, TOC[tc0], 0 + .csect .text[PR] +.ffi_closure_ASM: + .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0 + .bf __LINE__ + .line 1 +LFB..0: +/* we want to build up an area for the parameters passed */ +/* in registers (both floating point and integer) */ + + /* we store gpr 3 to gpr 10 (aligned to 4) + in the parents outgoing area */ + std r3, 48+(0*8)(r1) + std r4, 48+(1*8)(r1) + std r5, 48+(2*8)(r1) + std r6, 48+(3*8)(r1) + mflr r0 + + std r7, 48+(4*8)(r1) + std r8, 48+(5*8)(r1) + std r9, 48+(6*8)(r1) + std r10, 48+(7*8)(r1) + std r0, 16(r1) /* save the return address */ +LCFI..0: + /* 48 Bytes (Linkage Area) */ + /* 64 Bytes (params) */ + /* 16 Bytes (result) */ + /* 104 Bytes (13*8 from FPR) */ + /* 8 Bytes (alignment) */ + /* 240 Bytes */ + + stdu r1, -240(r1) /* skip over caller save area + keep stack aligned to 16 */ +LCFI..1: + + /* next save fpr 1 to fpr 13 (aligned to 8) */ + stfd f1, 128+(0*8)(r1) + stfd f2, 128+(1*8)(r1) + stfd f3, 128+(2*8)(r1) + stfd f4, 128+(3*8)(r1) + stfd f5, 128+(4*8)(r1) + stfd f6, 128+(5*8)(r1) + stfd f7, 128+(6*8)(r1) + stfd f8, 128+(7*8)(r1) + stfd f9, 128+(8*8)(r1) + stfd f10, 128+(9*8)(r1) + stfd f11, 128+(10*8)(r1) + stfd f12, 128+(11*8)(r1) + stfd f13, 128+(12*8)(r1) + + /* set up registers for the routine that actually does the work */ + /* get the context pointer from the trampoline */ + mr r3, r11 + + /* now load up the pointer to the result storage */ + addi r4, r1, 112 + + /* now load up the pointer to the saved gpr registers */ + addi r5, r1, 288 + + /* now load up the pointer to the saved fpr registers */ + addi r6, r1, 128 + + /* make the call */ + bl .ffi_closure_helper_DARWIN + nop + +.Ldoneclosure: + + /* now r3 contains the return type */ + /* so use it to look up in a table */ + /* so we know how to deal with each type */ + + /* look up the proper starting point in table */ + /* by using return type as offset */ + lhz r3, 10(r3) /* load type from return type */ + ld r4, LC..60(2) /* get address of jump table */ + sldi r3, r3, 4 /* now multiply return type by 16 */ + ld r0, 240+16(r1) /* load return address */ + add r3, r3, r4 /* add contents of table to table address */ + mtctr r3 + bctr /* jump to it */ + +/* Each fragment must be exactly 16 bytes long (4 instructions). + Align to 16 byte boundary for cache and dispatch efficiency. */ + .align 4 + +L..60: +/* case FFI_TYPE_VOID */ + mtlr r0 + addi r1, r1, 240 + blr + nop + +/* case FFI_TYPE_INT */ + lwa r3, 112+4(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_FLOAT */ + lfs f1, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_DOUBLE */ + lfd f1, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_LONGDOUBLE */ + lfd f1, 112+0(r1) + mtlr r0 + lfd f2, 112+8(r1) + b L..finish + +/* case FFI_TYPE_UINT8 */ + lbz r3, 112+7(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_SINT8 */ + lbz r3, 112+7(r1) + mtlr r0 + extsb r3, r3 + b L..finish + +/* case FFI_TYPE_UINT16 */ + lhz r3, 112+6(r1) + mtlr r0 +L..finish: + addi r1, r1, 240 + blr + +/* case FFI_TYPE_SINT16 */ + lha r3, 112+6(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_UINT32 */ + lwz r3, 112+4(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_SINT32 */ + lwa r3, 112+4(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_UINT64 */ + ld r3, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_SINT64 */ + ld r3, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr + +/* case FFI_TYPE_STRUCT */ + mtlr r0 + addi r1, r1, 240 + blr + nop + +/* case FFI_TYPE_POINTER */ + ld r3, 112+0(r1) + mtlr r0 + addi r1, r1, 240 + blr +LFE..0: + +#else /* ! __64BIT__ */ + + .long .ffi_closure_ASM, TOC[tc0], 0 + .csect .text[PR] +.ffi_closure_ASM: + .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0 + .bf __LINE__ + .line 1 +LFB..0: +/* we want to build up an area for the parameters passed */ +/* in registers (both floating point and integer) */ + + /* we store gpr 3 to gpr 10 (aligned to 4) + in the parents outgoing area */ + stw r3, 24+(0*4)(r1) + stw r4, 24+(1*4)(r1) + stw r5, 24+(2*4)(r1) + stw r6, 24+(3*4)(r1) + mflr r0 + + stw r7, 24+(4*4)(r1) + stw r8, 24+(5*4)(r1) + stw r9, 24+(6*4)(r1) + stw r10, 24+(7*4)(r1) + stw r0, 8(r1) +LCFI..0: + /* 24 Bytes (Linkage Area) */ + /* 32 Bytes (params) */ + /* 16 Bytes (result) */ + /* 104 Bytes (13*8 from FPR) */ + /* 176 Bytes */ + + stwu r1, -176(r1) /* skip over caller save area + keep stack aligned to 16 */ +LCFI..1: + + /* next save fpr 1 to fpr 13 (aligned to 8) */ + stfd f1, 72+(0*8)(r1) + stfd f2, 72+(1*8)(r1) + stfd f3, 72+(2*8)(r1) + stfd f4, 72+(3*8)(r1) + stfd f5, 72+(4*8)(r1) + stfd f6, 72+(5*8)(r1) + stfd f7, 72+(6*8)(r1) + stfd f8, 72+(7*8)(r1) + stfd f9, 72+(8*8)(r1) + stfd f10, 72+(9*8)(r1) + stfd f11, 72+(10*8)(r1) + stfd f12, 72+(11*8)(r1) + stfd f13, 72+(12*8)(r1) + + /* set up registers for the routine that actually does the work */ + /* get the context pointer from the trampoline */ + mr r3, r11 + + /* now load up the pointer to the result storage */ + addi r4, r1, 56 + + /* now load up the pointer to the saved gpr registers */ + addi r5, r1, 200 + + /* now load up the pointer to the saved fpr registers */ + addi r6, r1, 72 + + /* make the call */ + bl .ffi_closure_helper_DARWIN + nop + +.Ldoneclosure: + + /* now r3 contains the return type */ + /* so use it to look up in a table */ + /* so we know how to deal with each type */ + + /* look up the proper starting point in table */ + /* by using return type as offset */ + lhz r3, 6(r3) /* load type from return type */ + lwz r4, LC..60(2) /* get address of jump table */ + slwi r3, r3, 4 /* now multiply return type by 16 */ + lwz r0, 176+8(r1) /* load return address */ + add r3, r3, r4 /* add contents of table to table address */ + mtctr r3 + bctr /* jump to it */ + +/* Each fragment must be exactly 16 bytes long (4 instructions). + Align to 16 byte boundary for cache and dispatch efficiency. */ + .align 4 + +L..60: +/* case FFI_TYPE_VOID */ + mtlr r0 + addi r1, r1, 176 + blr + nop + +/* case FFI_TYPE_INT */ + lwz r3, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_FLOAT */ + lfs f1, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_DOUBLE */ + lfd f1, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_LONGDOUBLE */ + lfd f1, 56+0(r1) + mtlr r0 + lfd f2, 56+8(r1) + b L..finish + +/* case FFI_TYPE_UINT8 */ + lbz r3, 56+3(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_SINT8 */ + lbz r3, 56+3(r1) + mtlr r0 + extsb r3, r3 + b L..finish + +/* case FFI_TYPE_UINT16 */ + lhz r3, 56+2(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_SINT16 */ + lha r3, 56+2(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_UINT32 */ + lwz r3, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_SINT32 */ + lwz r3, 56+0(r1) + mtlr r0 + addi r1, r1, 176 + blr + +/* case FFI_TYPE_UINT64 */ + lwz r3, 56+0(r1) + mtlr r0 + lwz r4, 56+4(r1) + b L..finish + +/* case FFI_TYPE_SINT64 */ + lwz r3, 56+0(r1) + mtlr r0 + lwz r4, 56+4(r1) + b L..finish + +/* case FFI_TYPE_STRUCT */ + mtlr r0 + addi r1, r1, 176 + blr + nop + +/* case FFI_TYPE_POINTER */ + lwz r3, 56+0(r1) + mtlr r0 +L..finish: + addi r1, r1, 176 + blr +LFE..0: +#endif + .ef __LINE__ +/* END(ffi_closure_ASM) */ + + +.csect .text[PR] + .align 2 + .globl ffi_go_closure_ASM + .globl .ffi_go_closure_ASM +.csect ffi_go_closure_ASM[DS] +ffi_go_closure_ASM: +#ifdef __64BIT__ + .llong .ffi_go_closure_ASM, TOC[tc0], 0 + .csect .text[PR] +.ffi_go_closure_ASM: + .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1 + .bf __LINE__ + .line 1 +LFB..1: +/* we want to build up an area for the parameters passed */ +/* in registers (both floating point and integer) */ + + /* we store gpr 3 to gpr 10 (aligned to 4) + in the parents outgoing area */ + std r3, 48+(0*8)(r1) + std r4, 48+(1*8)(r1) + std r5, 48+(2*8)(r1) + std r6, 48+(3*8)(r1) + mflr r0 + + std r7, 48+(4*8)(r1) + std r8, 48+(5*8)(r1) + std r9, 48+(6*8)(r1) + std r10, 48+(7*8)(r1) + std r0, 16(r1) /* save the return address */ +LCFI..2: + /* 48 Bytes (Linkage Area) */ + /* 64 Bytes (params) */ + /* 16 Bytes (result) */ + /* 104 Bytes (13*8 from FPR) */ + /* 8 Bytes (alignment) */ + /* 240 Bytes */ + + stdu r1, -240(r1) /* skip over caller save area + keep stack aligned to 16 */ +LCFI..3: + + /* next save fpr 1 to fpr 13 (aligned to 8) */ + stfd f1, 128+(0*8)(r1) + stfd f2, 128+(1*8)(r1) + stfd f3, 128+(2*8)(r1) + stfd f4, 128+(3*8)(r1) + stfd f5, 128+(4*8)(r1) + stfd f6, 128+(5*8)(r1) + stfd f7, 128+(6*8)(r1) + stfd f8, 128+(7*8)(r1) + stfd f9, 128+(8*8)(r1) + stfd f10, 128+(9*8)(r1) + stfd f11, 128+(10*8)(r1) + stfd f12, 128+(11*8)(r1) + stfd f13, 128+(12*8)(r1) + + /* set up registers for the routine that actually does the work */ + mr r3, r11 /* go closure */ + + /* now load up the pointer to the result storage */ + addi r4, r1, 112 + + /* now load up the pointer to the saved gpr registers */ + addi r5, r1, 288 + + /* now load up the pointer to the saved fpr registers */ + addi r6, r1, 128 + + /* make the call */ + bl .ffi_go_closure_helper_DARWIN + nop + + b .Ldoneclosure +LFE..1: + +#else /* ! __64BIT__ */ + + .long .ffi_go_closure_ASM, TOC[tc0], 0 + .csect .text[PR] +.ffi_go_closure_ASM: + .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1 + .bf __LINE__ + .line 1 +LFB..1: +/* we want to build up an area for the parameters passed */ +/* in registers (both floating point and integer) */ + + /* we store gpr 3 to gpr 10 (aligned to 4) + in the parents outgoing area */ + stw r3, 24+(0*4)(r1) + stw r4, 24+(1*4)(r1) + stw r5, 24+(2*4)(r1) + stw r6, 24+(3*4)(r1) + mflr r0 + + stw r7, 24+(4*4)(r1) + stw r8, 24+(5*4)(r1) + stw r9, 24+(6*4)(r1) + stw r10, 24+(7*4)(r1) + stw r0, 8(r1) +LCFI..2: + /* 24 Bytes (Linkage Area) */ + /* 32 Bytes (params) */ + /* 16 Bytes (result) */ + /* 104 Bytes (13*8 from FPR) */ + /* 176 Bytes */ + + stwu r1, -176(r1) /* skip over caller save area + keep stack aligned to 16 */ +LCFI..3: + + /* next save fpr 1 to fpr 13 (aligned to 8) */ + stfd f1, 72+(0*8)(r1) + stfd f2, 72+(1*8)(r1) + stfd f3, 72+(2*8)(r1) + stfd f4, 72+(3*8)(r1) + stfd f5, 72+(4*8)(r1) + stfd f6, 72+(5*8)(r1) + stfd f7, 72+(6*8)(r1) + stfd f8, 72+(7*8)(r1) + stfd f9, 72+(8*8)(r1) + stfd f10, 72+(9*8)(r1) + stfd f11, 72+(10*8)(r1) + stfd f12, 72+(11*8)(r1) + stfd f13, 72+(12*8)(r1) + + /* set up registers for the routine that actually does the work */ + mr r3, 11 /* go closure */ + + /* now load up the pointer to the result storage */ + addi r4, r1, 56 + + /* now load up the pointer to the saved gpr registers */ + addi r5, r1, 200 + + /* now load up the pointer to the saved fpr registers */ + addi r6, r1, 72 + + /* make the call */ + bl .ffi_go_closure_helper_DARWIN + nop + + b .Ldoneclosure +LFE..1: +#endif + .ef __LINE__ +/* END(ffi_go_closure_ASM) */ + +/* EH frame stuff. */ + +#define LR_REGNO 0x41 /* Link Register (65), see rs6000.md */ +#ifdef __64BIT__ +#define PTRSIZE 8 +#define LOG2_PTRSIZE 3 +#define CFA_OFFSET 0xf0,0x01 /* LEB128 240 */ +#define FDE_ENCODING 0x1c /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */ +#define EH_DATA_ALIGN_FACT 0x78 /* LEB128 -8 */ +#else +#define PTRSIZE 4 +#define LOG2_PTRSIZE 2 +#define CFA_OFFSET 0xb0,0x01 /* LEB128 176 */ +#define FDE_ENCODING 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */ +#define EH_DATA_ALIGN_FACT 0x7c /* LEB128 -4 */ +#endif + + .csect _unwind.ro_[RO],4 + .align LOG2_PTRSIZE + .globl _GLOBAL__F_libffi_src_powerpc_aix_closure +_GLOBAL__F_libffi_src_powerpc_aix_closure: +Lframe..1: + .vbyte 4,LECIE..1-LSCIE..1 /* CIE Length */ +LSCIE..1: + .vbyte 4,0 /* CIE Identifier Tag */ + .byte 0x3 /* CIE Version */ + .byte "zR" /* CIE Augmentation */ + .byte 0 + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte EH_DATA_ALIGN_FACT /* leb128 -4/-8; CIE Data Alignment Factor */ + .byte LR_REGNO /* CIE RA Column */ + .byte 0x1 /* uleb128 0x1; Augmentation size */ + .byte FDE_ENCODING /* FDE Encoding (pcrel|sdata4/8) */ + .byte 0xc /* DW_CFA_def_cfa */ + .byte 0x1 /* uleb128 0x1; Register r1 */ + .byte 0 /* uleb128 0x0; Offset 0 */ + .align LOG2_PTRSIZE +LECIE..1: +LSFDE..1: + .vbyte 4,LEFDE..1-LASFDE..1 /* FDE Length */ +LASFDE..1: + .vbyte 4,LASFDE..1-Lframe..1 /* FDE CIE offset */ + .vbyte PTRSIZE,LFB..0-$ /* FDE initial location */ + .vbyte PTRSIZE,LFE..0-LFB..0 /* FDE address range */ + .byte 0 /* uleb128 0x0; Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .vbyte 4,LCFI..1-LCFI..0 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte CFA_OFFSET /* uleb128 176/240 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .vbyte 4,LCFI..0-LFB..0 + .byte 0x11 /* DW_CFA_offset_extended_sf */ + .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ + .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ + .align LOG2_PTRSIZE +LEFDE..1: +LSFDE..2: + .vbyte 4,LEFDE..2-LASFDE..2 /* FDE Length */ +LASFDE..2: + .vbyte 4,LASFDE..2-Lframe..1 /* FDE CIE offset */ + .vbyte PTRSIZE,LFB..1-$ /* FDE initial location */ + .vbyte PTRSIZE,LFE..1-LFB..1 /* FDE address range */ + .byte 0 /* uleb128 0x0; Augmentation size */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .vbyte 4,LCFI..3-LCFI..2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte CFA_OFFSET /* uleb128 176/240 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .vbyte 4,LCFI..2-LFB..1 + .byte 0x11 /* DW_CFA_offset_extended_sf */ + .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ + .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ + .align LOG2_PTRSIZE +LEFDE..2: + .vbyte 4,0 /* End of FDEs */ + + .csect .text[PR] + .ref _GLOBAL__F_libffi_src_powerpc_aix_closure /* Prevents garbage collection by AIX linker */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/asm.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/asm.h new file mode 100644 index 000000000000..27b22f670a23 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/asm.h @@ -0,0 +1,125 @@ +/* ----------------------------------------------------------------------- + asm.h - Copyright (c) 1998 Geoffrey Keating + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define ASM_GLOBAL_DIRECTIVE .globl + + +#define C_SYMBOL_NAME(name) name +/* Macro for a label. */ +#ifdef __STDC__ +#define C_LABEL(name) name##: +#else +#define C_LABEL(name) name/**/: +#endif + +/* This seems to always be the case on PPC. */ +#define ALIGNARG(log2) log2 +/* For ELF we need the `.type' directive to make shared libs work right. */ +#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; +#define ASM_SIZE_DIRECTIVE(name) .size name,.-name + +/* If compiled for profiling, call `_mcount' at the start of each function. */ +#ifdef PROF +/* The mcount code relies on the return address being on the stack + to locate our caller and so it can restore it; so store one just + for its benefit. */ +#ifdef PIC +#define CALL_MCOUNT \ + .pushsection; \ + .section ".data"; \ + .align ALIGNARG(2); \ +0:.long 0; \ + .previous; \ + mflr %r0; \ + stw %r0,4(%r1); \ + bl _GLOBAL_OFFSET_TABLE_@local-4; \ + mflr %r11; \ + lwz %r0,0b@got(%r11); \ + bl JUMPTARGET(_mcount); +#else /* PIC */ +#define CALL_MCOUNT \ + .section ".data"; \ + .align ALIGNARG(2); \ +0:.long 0; \ + .previous; \ + mflr %r0; \ + lis %r11,0b@ha; \ + stw %r0,4(%r1); \ + addi %r0,%r11,0b@l; \ + bl JUMPTARGET(_mcount); +#endif /* PIC */ +#else /* PROF */ +#define CALL_MCOUNT /* Do nothing. */ +#endif /* PROF */ + +#define ENTRY(name) \ + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ + ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ + .align ALIGNARG(2); \ + C_LABEL(name) \ + CALL_MCOUNT + +#define EALIGN_W_0 /* No words to insert. */ +#define EALIGN_W_1 nop +#define EALIGN_W_2 nop;nop +#define EALIGN_W_3 nop;nop;nop +#define EALIGN_W_4 EALIGN_W_3;nop +#define EALIGN_W_5 EALIGN_W_4;nop +#define EALIGN_W_6 EALIGN_W_5;nop +#define EALIGN_W_7 EALIGN_W_6;nop + +/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes + past a 2^align boundary. */ +#ifdef PROF +#define EFFI_ALIGN(name, alignt, words) \ + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ + ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ + .align ALIGNARG(2); \ + C_LABEL(name) \ + CALL_MCOUNT \ + b 0f; \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ + 0: +#else /* PROF */ +#define EFFI_ALIGN(name, alignt, words) \ + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ + ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ + C_LABEL(name) +#endif + +#define END(name) \ + ASM_SIZE_DIRECTIVE(name) + +#ifdef PIC +#define JUMPTARGET(name) name##@plt +#else +#define JUMPTARGET(name) name +#endif + +/* Local labels stripped out by the linker. */ +#define L(x) .L##x diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/darwin.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/darwin.S new file mode 100644 index 000000000000..066eb82efe93 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/darwin.S @@ -0,0 +1,378 @@ +/* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 2000 John Hornkvist + Copyright (c) 2004, 2010 Free Software Foundation, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#if defined(__ppc64__) +#define MODE_CHOICE(x, y) y +#else +#define MODE_CHOICE(x, y) x +#endif + +#define machine_choice MODE_CHOICE(ppc7400,ppc64) + +; Define some pseudo-opcodes for size-independent load & store of GPRs ... +#define lgu MODE_CHOICE(lwzu, ldu) +#define lg MODE_CHOICE(lwz,ld) +#define sg MODE_CHOICE(stw,std) +#define sgu MODE_CHOICE(stwu,stdu) +#define sgux MODE_CHOICE(stwux,stdux) + +; ... and the size of GPRs and their storage indicator. +#define GPR_BYTES MODE_CHOICE(4,8) +#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ +#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ + +; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. +#define LINKAGE_SIZE MODE_CHOICE(24,48) +#define PARAM_AREA MODE_CHOICE(32,64) +#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ + +/* If there is any FP stuff we make space for all of the regs. */ +#define SAVED_FPR_COUNT 13 +#define FPR_SIZE 8 +#define RESULT_BYTES 16 + +/* This should be kept in step with the same value in ffi_darwin.c. */ +#define ASM_NEEDS_REGISTERS 4 +#define SAVE_REGS_SIZE (ASM_NEEDS_REGISTERS * GPR_BYTES) + +#include <fficonfig.h> +#include <ffi.h> + +#define JUMPTARGET(name) name +#define L(x) x + + .text + .align 2 + .globl _ffi_prep_args + + .align 2 + .globl _ffi_call_DARWIN + + /* We arrive here with: + r3 = ptr to extended cif. + r4 = -bytes. + r5 = cif flags. + r6 = ptr to return value. + r7 = fn pointer (user func). + r8 = fn pointer (ffi_prep_args). + r9 = ffi_type* for the ret val. */ + +_ffi_call_DARWIN: +Lstartcode: + mr r12,r8 /* We only need r12 until the call, + so it does not have to be saved. */ +LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 +LCFI0: + + /* Save the retval type in parents frame. */ + sg r9,(LINKAGE_SIZE+6*GPR_BYTES)(r8) + + /* Allocate the stack space we need. */ + sgux r1,r1,r4 + + /* Save registers we use. */ + mflr r9 + sg r9,SAVED_LR_OFFSET(r8) + + sg r28,-(4 * GPR_BYTES)(r8) + sg r29,-(3 * GPR_BYTES)(r8) + sg r30,-(2 * GPR_BYTES)(r8) + sg r31,-( GPR_BYTES)(r8) + +#if !defined(POWERPC_DARWIN) + /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ + sg r2,(5 * GPR_BYTES)(r1) +#endif + +LCFI1: + + /* Save arguments over call. */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ +LCFI2: + /* Call ffi_prep_args. r3 = extended cif, r4 = stack ptr copy. */ + mr r4,r1 + li r9,0 + + mtctr r12 /* r12 holds address of _ffi_prep_args. */ + bctrl + +#if !defined(POWERPC_DARWIN) + /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ + lg r2,(5 * GPR_BYTES)(r1) +#endif + /* Now do the call. + Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + /* Get the address to call into CTR. */ + mtctr r29 + /* Load all those argument registers. + We have set up a nice stack frame, just load it into registers. */ + lg r3, (LINKAGE_SIZE )(r1) + lg r4, (LINKAGE_SIZE + GPR_BYTES)(r1) + lg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r1) + lg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r1) + nop + lg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r1) + lg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r1) + lg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r1) + lg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r1) + +L1: + /* ... Load all the FP registers. */ + bf 6,L2 /* No floats to load. */ + lfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) + lfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) + lfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) + lfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) + nop + lfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) + lfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) + lfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) + lfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) + nop + lfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) + lfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) + lfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) + lfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) + nop + lfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) + +L2: + mr r12,r29 /* Put the target address in r12 as specified. */ + mtctr r12 + nop + nop + + /* Make the call. */ + bctrl + + /* Now, deal with the return value. */ + + /* m64 structure returns can occupy the same set of registers as + would be used to pass such a structure as arg0 - so take care + not to step on any possibly hot regs. */ + + /* Get the flags.. */ + mtcrf 0x03,r31 ; we need c6 & cr7 now. + ; FLAG_RETURNS_NOTHING also covers struct ret-by-ref. + bt 30,L(done_return_value) ; FLAG_RETURNS_NOTHING + bf 27,L(scalar_return_value) ; not FLAG_RETURNS_STRUCT + + /* OK, so we have a struct. */ +#if defined(__ppc64__) + bt 31,L(maybe_return_128) ; FLAG_RETURNS_128BITS, special case + + /* OK, we have to map the return back to a mem struct. + We are about to trample the parents param area, so recover the + return type. r29 is free, since the call is done. */ + lg r29,(LINKAGE_SIZE + 6 * GPR_BYTES)(r28) + + sg r3, (LINKAGE_SIZE )(r28) + sg r4, (LINKAGE_SIZE + GPR_BYTES)(r28) + sg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r28) + sg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r28) + nop + sg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r28) + sg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r28) + sg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r28) + sg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) + /* OK, so do the block move - we trust that memcpy will not trample + the fprs... */ + mr r3,r30 ; dest + addi r4,r28,LINKAGE_SIZE ; source + /* The size is a size_t, should be long. */ + lg r5,0(r29) + /* Figure out small structs */ + cmpi 0,r5,4 + bgt L3 ; 1, 2 and 4 bytes have special rules. + cmpi 0,r5,3 + beq L3 ; not 3 + addi r4,r4,8 + subf r4,r5,r4 +L3: + bl _memcpy + + /* ... do we need the FP registers? - recover the flags.. */ + mtcrf 0x03,r31 ; we need c6 & cr7 now. + bf 29,L(done_return_value) /* No floats in the struct. */ + stfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) + stfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) + stfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) + stfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) + nop + stfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) + stfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) + stfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) + stfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) + nop + stfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) + stfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) + stfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) + stfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) + nop + stfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) + + mr r3,r29 ; ffi_type * + mr r4,r30 ; dest + addi r5,r28,-SAVE_REGS_SIZE-(13*FPR_SIZE) ; fprs + xor r6,r6,r6 + sg r6,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) + addi r6,r28,(LINKAGE_SIZE + 7 * GPR_BYTES) ; point to a zeroed counter. + bl _darwin64_struct_floats_to_mem + + b L(done_return_value) +#else + stw r3,0(r30) ; m32 the only struct return in reg is 4 bytes. +#endif + b L(done_return_value) + +L(fp_return_value): + /* Do we have long double to store? */ + bf 31,L(fd_return_value) ; FLAG_RETURNS_128BITS + stfd f1,0(r30) + stfd f2,FPR_SIZE(r30) + b L(done_return_value) + +L(fd_return_value): + /* Do we have double to store? */ + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + +L(float_return_value): + /* We only have a float to store. */ + stfs f1,0(r30) + b L(done_return_value) + +L(scalar_return_value): + bt 29,L(fp_return_value) ; FLAG_RETURNS_FP + ; ffi_arg is defined as unsigned long. + sg r3,0(r30) ; Save the reg. + bf 28,L(done_return_value) ; not FLAG_RETURNS_64BITS + +#if defined(__ppc64__) +L(maybe_return_128): + std r3,0(r30) + bf 31,L(done_return_value) ; not FLAG_RETURNS_128BITS + std r4,8(r30) +#else + stw r4,4(r30) +#endif + + /* Fall through. */ + /* We want this at the end to simplify eh epilog computation. */ + +L(done_return_value): + /* Restore the registers we used and return. */ + lg r29,SAVED_LR_OFFSET(r28) + ; epilog + lg r31,-(1 * GPR_BYTES)(r28) + mtlr r29 + lg r30,-(2 * GPR_BYTES)(r28) + lg r29,-(3 * GPR_BYTES)(r28) + lg r28,-(4 * GPR_BYTES)(r28) + lg r1,0(r1) + blr +LFE1: + .align 1 +/* END(_ffi_call_DARWIN) */ + +/* Provide a null definition of _ffi_call_AIX. */ + .text + .globl _ffi_call_AIX + .align 2 +_ffi_call_AIX: + blr +/* END(_ffi_call_AIX) */ + +/* EH stuff. */ + +#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) + + .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: + + .globl _ffi_call_DARWIN.eh +_ffi_call_DARWIN.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long Lstartcode-. ; FDE initial location + .set L$set$3,LFE1-Lstartcode + .g_long L$set$3 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-Lstartcode + .long L$set$4 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x08 ; uleb128 0x08 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$5,LCFI1-LCFI0 + .long L$set$5 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .byte 0x9f ; DW_CFA_offset, column 0x1f + .byte 0x1 ; uleb128 0x1 + .byte 0x9e ; DW_CFA_offset, column 0x1e + .byte 0x2 ; uleb128 0x2 + .byte 0x9d ; DW_CFA_offset, column 0x1d + .byte 0x3 ; uleb128 0x3 + .byte 0x9c ; DW_CFA_offset, column 0x1c + .byte 0x4 ; uleb128 0x4 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$6,LCFI2-LCFI1 + .long L$set$6 + .byte 0xd ; DW_CFA_def_cfa_register + .byte 0x1c ; uleb128 0x1c + .align LOG2_GPR_BYTES +LEFDE1: + .align 1 + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/darwin_closure.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/darwin_closure.S new file mode 100644 index 000000000000..3121e6ac26d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/darwin_closure.S @@ -0,0 +1,571 @@ +/* ----------------------------------------------------------------------- + darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010, + Free Software Foundation, Inc. + based on ppc_closure.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#define L(x) x + +#if defined(__ppc64__) +#define MODE_CHOICE(x, y) y +#else +#define MODE_CHOICE(x, y) x +#endif + +#define machine_choice MODE_CHOICE(ppc7400,ppc64) + +; Define some pseudo-opcodes for size-independent load & store of GPRs ... +#define lgu MODE_CHOICE(lwzu, ldu) +#define lg MODE_CHOICE(lwz,ld) +#define sg MODE_CHOICE(stw,std) +#define sgu MODE_CHOICE(stwu,stdu) + +; ... and the size of GPRs and their storage indicator. +#define GPR_BYTES MODE_CHOICE(4,8) +#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ +#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ + +; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. +#define LINKAGE_SIZE MODE_CHOICE(24,48) +#define PARAM_AREA MODE_CHOICE(32,64) + +#define SAVED_CR_OFFSET MODE_CHOICE(4,8) /* save position for CR */ +#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ + +/* WARNING: if ffi_type is changed... here be monsters. + Offsets of items within the result type. */ +#define FFI_TYPE_TYPE MODE_CHOICE(6,10) +#define FFI_TYPE_ELEM MODE_CHOICE(8,16) + +#define SAVED_FPR_COUNT 13 +#define FPR_SIZE 8 +/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */ +#define RESULT_BYTES MODE_CHOICE(16,176) + +; The whole stack frame **MUST** be 16byte-aligned. +#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL) +#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)) + +#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE) +#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA) + +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 +; We no longer need the pic symbol stub for Darwin >= 9. +#define BLCLS_HELP _ffi_closure_helper_DARWIN +#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p +#define PASS_STR_FLOATS _darwin64_pass_struct_floats +#undef WANT_STUB +#else +#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub +#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub +#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub +#define WANT_STUB +#endif + +/* m32/m64 + + The stack layout looks like this: + + | Additional params... | | Higher address + ~ ~ ~ + | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | + | Reserved 2*4/8 | | + |--------------------------------------------| | + | Space for callee`s LR 4/8 | | + |--------------------------------------------| | + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | + | Current backchain pointer 4/8 |-/ Parent`s frame. + |--------------------------------------------| <+ <<< on entry to + | Result Bytes 16/176 | | + |--------------------------------------------| | + ~ padding to 16-byte alignment ~ ~ + |--------------------------------------------| | + | NUM_FPR_ARG_REGISTERS slots | | + | here fp13 .. fp1 13*8 | | + |--------------------------------------------| | + | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | stack | + | Reserved [compiler,binder] 2*4/8 | | grows | + |--------------------------------------------| | down V + | Space for callees LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 |-/ during + |--------------------------------------------| <<< call. + +*/ + + .file "darwin_closure.S" + + .machine machine_choice + + .text + .globl _ffi_closure_ASM + .align LOG2_GPR_BYTES +_ffi_closure_ASM: +LFB1: +Lstartcode: + mflr r0 /* extract return address */ + sg r0,SAVED_LR_OFFSET(r1) /* save the return address */ +LCFI0: + sgu r1,-SAVE_SIZE(r1) /* skip over caller save area + keep stack aligned to 16. */ +LCFI1: + /* We want to build up an area for the parameters passed + in registers. (both floating point and integer) */ + + /* Put gpr 3 to gpr 10 in the parents outgoing area... + ... the remainder of any params that overflowed the regs will + follow here. */ + sg r3, (PARENT_PARM_BASE )(r1) + sg r4, (PARENT_PARM_BASE + GPR_BYTES )(r1) + sg r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1) + sg r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1) + sg r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1) + sg r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1) + sg r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1) + sg r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1) + + /* We save fpr 1 to fpr 14 in our own save frame. */ + stfd f1, (FP_SAVE_BASE )(r1) + stfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) + stfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) + stfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) + stfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) + stfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) + stfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) + stfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) + stfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) + stfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) + stfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) + stfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) + stfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) + + /* Set up registers for the routine that actually does the work + get the context pointer from the trampoline. */ + mr r3,r11 + + /* Now load up the pointer to the result storage. */ + addi r4,r1,(SAVE_SIZE-RESULT_BYTES) + + /* Now load up the pointer to the saved gpr registers. */ + addi r5,r1,PARENT_PARM_BASE + + /* Now load up the pointer to the saved fpr registers. */ + addi r6,r1,FP_SAVE_BASE + + /* Make the call. */ + bl BLCLS_HELP + + /* r3 contains the rtype pointer... save it since we will need + it later. */ + sg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type + lg r0,0(r3) ; size => r0 + lhz r3,FFI_TYPE_TYPE(r3) ; type => r3 + + /* The helper will have intercepted structure returns and inserted + the caller`s destination address for structs returned by ref. */ + + /* r3 contains the return type so use it to look up in a table + so we know how to deal with each type. */ + + addi r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here. */ + bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */ + mflr r4 /* Move to r4. */ + slwi r3,r3,4 /* Now multiply return type by 16. */ + add r3,r3,r4 /* Add contents of table to table address. */ + mtctr r3 + bctr /* Jump to it. */ +LFE1: +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long + (4 instructions). For cache effectiveness we align to a 16 byte boundary + first. */ + + .align 4 + + nop + nop + nop +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lg r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + lfd f2,8(r5) + b Lfinish + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: +#if defined(__ppc64__) + lbz r3,7(r5) +#else + lbz r3,3(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: +#if defined(__ppc64__) + lbz r3,7(r5) +#else + lbz r3,3(r5) +#endif + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: +#if defined(__ppc64__) + lhz r3,6(r5) +#else + lhz r3,2(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: +#if defined(__ppc64__) + lha r3,6(r5) +#else + lha r3,2(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: +#if defined(__ppc64__) + lwz r3,4(r5) +#else + lwz r3,0(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: +#if defined(__ppc64__) + lwz r3,4(r5) +#else + lwz r3,0(r5) +#endif + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: +#if defined(__ppc64__) + lg r3,0(r5) + b Lfinish + nop +#else + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish +#endif + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: +#if defined(__ppc64__) + lg r3,0(r5) + b Lfinish + nop +#else + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish +#endif + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: +#if defined(__ppc64__) + lg r3,0(r5) ; we need at least this... + cmpi 0,r0,4 + bgt Lstructend ; not a special small case + b Lsmallstruct ; see if we need more. +#else + cmpwi 0,r0,4 + bgt Lfinish ; not by value + lg r3,0(r5) + b Lfinish +#endif +/* case FFI_TYPE_POINTER */ +Lret_type14: + lg r3,0(r5) + b Lfinish + nop + nop + +#if defined(__ppc64__) +Lsmallstruct: + beq Lfour ; continuation of Lret13. + cmpi 0,r0,3 + beq Lfinish ; don`t adjust this - can`t be any floats here... + srdi r3,r3,48 + cmpi 0,r0,2 + beq Lfinish ; .. or here .. + srdi r3,r3,8 + b Lfinish ; .. or here. + +Lfour: + lg r6,LINKAGE_SIZE(r1) ; get the result type + lg r6,FFI_TYPE_ELEM(r6) ; elements array pointer + lg r6,0(r6) ; first element + lhz r0,FFI_TYPE_TYPE(r6) ; OK go the type + cmpi 0,r0,2 ; FFI_TYPE_FLOAT + bne Lfourint + lfs f1,0(r5) ; just one float in the struct. + b Lfinish + +Lfourint: + srdi r3,r3,32 ; four bytes. + b Lfinish + +Lstructend: + lg r3,LINKAGE_SIZE(r1) ; get the result type + bl STRUCT_RETVALUE_P + cmpi 0,r3,0 + beq Lfinish ; nope. + /* Recover a pointer to the results. */ + addi r11,r1,(SAVE_SIZE-RESULT_BYTES) + lg r3,0(r11) ; we need at least this... + lg r4,8(r11) + cmpi 0,r0,16 + beq Lfinish ; special case 16 bytes we don't consider floats. + + /* OK, frustratingly, the process of saving the struct to mem might have + messed with the FPRs, so we have to re-load them :(. + We`ll use our FPRs space again - calling: + void darwin64_pass_struct_floats (ffi_type *s, char *src, + unsigned *nfpr, double **fprs) + We`ll temporarily pinch the first two slots of the param area for local + vars used by the routine. */ + xor r6,r6,r6 + addi r5,r1,PARENT_PARM_BASE ; some space + sg r6,0(r5) ; *nfpr zeroed. + addi r6,r5,8 ; **fprs + addi r3,r1,FP_SAVE_BASE ; pointer to FPRs space + sg r3,0(r6) + mr r4,r11 ; the struct is here... + lg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type. + bl PASS_STR_FLOATS ; get struct floats into FPR save space. + /* See if we used any floats */ + lwz r0,(SAVE_SIZE-RESULT_BYTES)(r1) + cmpi 0,r0,0 + beq Lstructints ; nope. + /* OK load `em up... */ + lfd f1, (FP_SAVE_BASE )(r1) + lfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) + lfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) + lfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) + lfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) + lfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) + lfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) + lfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) + lfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) + lfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) + lfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) + lfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) + lfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) + + /* point back at our saved struct. */ +Lstructints: + addi r11,r1,(SAVE_SIZE-RESULT_BYTES) + lg r3,0(r11) ; we end up picking the + lg r4,8(r11) ; first two again. + lg r5,16(r11) + lg r6,24(r11) + lg r7,32(r11) + lg r8,40(r11) + lg r9,48(r11) + lg r10,56(r11) +#endif + +/* case done */ +Lfinish: + addi r1,r1,SAVE_SIZE /* Restore stack pointer. */ + lg r0,SAVED_LR_OFFSET(r1) /* Get return address. */ + mtlr r0 /* Reset link register. */ + blr +Lendcode: + .align 1 + +/* END(ffi_closure_ASM) */ + +/* EH frame stuff. */ +#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) +/* 176, 400 */ +#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90) +#define EH_FRAME_OFFSETB MODE_CHOICE(1,3) + + .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EH_frame1: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 ; Length of Common Information Entry +LSCIE1: + .long 0x0 ; CIE Identifier Tag + .byte 0x1 ; CIE Version + .ascii "zR\0" ; CIE Augmentation + .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor + .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor + .byte 0x41 ; CIE RA Column + .byte 0x1 ; uleb128 0x1; Augmentation size + .byte 0x10 ; FDE Encoding (pcrel) + .byte 0xc ; DW_CFA_def_cfa + .byte 0x1 ; uleb128 0x1 + .byte 0x0 ; uleb128 0x0 + .align LOG2_GPR_BYTES +LECIE1: + .globl _ffi_closure_ASM.eh +_ffi_closure_ASM.eh: +LSFDE1: + .set L$set$1,LEFDE1-LASFDE1 + .long L$set$1 ; FDE Length + +LASFDE1: + .long LASFDE1-EH_frame1 ; FDE CIE offset + .g_long Lstartcode-. ; FDE initial location + .set L$set$2,LFE1-Lstartcode + .g_long L$set$2 ; FDE address range + .byte 0x0 ; uleb128 0x0; Augmentation size + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$3,LCFI1-LCFI0 + .long L$set$3 + .byte 0xe ; DW_CFA_def_cfa_offset + .byte EH_FRAME_OFFSETA,EH_FRAME_OFFSETB ; uleb128 176,1/190,3 + .byte 0x4 ; DW_CFA_advance_loc4 + .set L$set$4,LCFI0-Lstartcode + .long L$set$4 + .byte 0x11 ; DW_CFA_offset_extended_sf + .byte 0x41 ; uleb128 0x41 + .byte 0x7e ; sleb128 -2 + .align LOG2_GPR_BYTES +LEFDE1: + .align 1 + +#ifdef WANT_STUB + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_ffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,"L1$spb" +"L1$spb": + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb") + mtlr r0 + lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .g_long dyld_stub_binding_helper + +#if defined(__ppc64__) + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_darwin64_struct_ret_by_value_p$stub: + .indirect_symbol _darwin64_struct_ret_by_value_p + mflr r0 + bcl 20,31,"L2$spb" +"L2$spb": + mflr r11 + addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb") + mtlr r0 + lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb")(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_darwin64_struct_ret_by_value_p$lazy_ptr: + .indirect_symbol _darwin64_struct_ret_by_value_p + .g_long dyld_stub_binding_helper + + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_darwin64_pass_struct_floats$stub: + .indirect_symbol _darwin64_pass_struct_floats + mflr r0 + bcl 20,31,"L3$spb" +"L3$spb": + mflr r11 + addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb") + mtlr r0 + lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_darwin64_pass_struct_floats$lazy_ptr: + .indirect_symbol _darwin64_pass_struct_floats + .g_long dyld_stub_binding_helper +# endif +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi.c new file mode 100644 index 000000000000..a19bcbbfc52f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi.c @@ -0,0 +1,175 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (C) 2013 IBM + Copyright (C) 2011 Anthony Green + Copyright (C) 2011 Kyle Moffett + Copyright (C) 2008 Red Hat, Inc + Copyright (C) 2007, 2008 Free Software Foundation, Inc + Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include "ffi.h" +#include "ffi_common.h" +#include "ffi_powerpc.h" + +#if HAVE_LONG_DOUBLE_VARIANT +/* Adjust ffi_type_longdouble. */ +void FFI_HIDDEN +ffi_prep_types (ffi_abi abi) +{ +# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +# ifdef POWERPC64 + ffi_prep_types_linux64 (abi); +# else + ffi_prep_types_sysv (abi); +# endif +# endif +} +#endif + +/* Perform machine dependent cif processing */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep (ffi_cif *cif) +{ +#ifdef POWERPC64 + return ffi_prep_cif_linux64 (cif); +#else + return ffi_prep_cif_sysv (cif); +#endif +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep_var (ffi_cif *cif, + unsigned int nfixedargs MAYBE_UNUSED, + unsigned int ntotalargs MAYBE_UNUSED) +{ +#ifdef POWERPC64 + return ffi_prep_cif_linux64_var (cif, nfixedargs, ntotalargs); +#else + return ffi_prep_cif_sysv (cif); +#endif +} + +static void +ffi_call_int (ffi_cif *cif, + void (*fn) (void), + void *rvalue, + void **avalue, + void *closure) +{ + /* The final SYSV ABI says that structures smaller or equal 8 bytes + are returned in r3/r4. A draft ABI used by linux instead returns + them in memory. + + We bounce-buffer SYSV small struct return values so that sysv.S + can write r3 and r4 to memory without worrying about struct size. + + For ELFv2 ABI, use a bounce buffer for homogeneous structs too, + for similar reasons. This bounce buffer must be aligned to 16 + bytes for use with homogeneous structs of vectors (float128). */ + float128 smst_buffer[8]; + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + ecif.rvalue = rvalue; + if ((cif->flags & FLAG_RETURNS_SMST) != 0) + ecif.rvalue = smst_buffer; + /* Ensure that we have a valid struct return value. + FIXME: Isn't this just papering over a user problem? */ + else if (!rvalue && cif->rtype->type == FFI_TYPE_STRUCT) + ecif.rvalue = alloca (cif->rtype->size); + +#ifdef POWERPC64 + ffi_call_LINUX64 (&ecif, fn, ecif.rvalue, cif->flags, closure, + -(long) cif->bytes); +#else + ffi_call_SYSV (&ecif, fn, ecif.rvalue, cif->flags, closure, -cif->bytes); +#endif + + /* Check for a bounce-buffered return value */ + if (rvalue && ecif.rvalue == smst_buffer) + { + unsigned int rsize = cif->rtype->size; +#ifndef __LITTLE_ENDIAN__ + /* The SYSV ABI returns a structure of up to 4 bytes in size + left-padded in r3. */ +# ifndef POWERPC64 + if (rsize <= 4) + memcpy (rvalue, (char *) smst_buffer + 4 - rsize, rsize); + else +# endif + /* The SYSV ABI returns a structure of up to 8 bytes in size + left-padded in r3/r4, and the ELFv2 ABI similarly returns a + structure of up to 8 bytes in size left-padded in r3. But + note that a structure of a single float is not paddded. */ + if (rsize <= 8 && (cif->flags & FLAG_RETURNS_FP) == 0) + memcpy (rvalue, (char *) smst_buffer + 8 - rsize, rsize); + else +#endif + memcpy (rvalue, smst_buffer, rsize); + } +} + +void +ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +void +ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, + void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *codeloc) +{ +#ifdef POWERPC64 + return ffi_prep_closure_loc_linux64 (closure, cif, fun, user_data, codeloc); +#else + return ffi_prep_closure_loc_sysv (closure, cif, fun, user_data, codeloc); +#endif +} + +ffi_status +ffi_prep_go_closure (ffi_go_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *)) +{ +#ifdef POWERPC64 + closure->tramp = ffi_go_closure_linux64; +#else + closure->tramp = ffi_go_closure_sysv; +#endif + closure->cif = cif; + closure->fun = fun; + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c new file mode 100644 index 000000000000..64bb94dfae7e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c @@ -0,0 +1,1452 @@ +/* ----------------------------------------------------------------------- + ffi_darwin.c + + Copyright (C) 1998 Geoffrey Keating + Copyright (C) 2001 John Hornkvist + Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. + + FFI support for Darwin and AIX. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> + +extern void ffi_closure_ASM (void); + +#if defined (FFI_GO_CLOSURES) +extern void ffi_go_closure_ASM (void); +#endif + +enum { + /* The assembly depends on these exact flags. + For Darwin64 (when FLAG_RETURNS_STRUCT is set): + FLAG_RETURNS_FP indicates that the structure embeds FP data. + FLAG_RETURNS_128BITS signals a special struct size that is not + expanded for float content. */ + FLAG_RETURNS_128BITS = 1 << (31-31), /* These go in cr7 */ + FLAG_RETURNS_NOTHING = 1 << (31-30), + FLAG_RETURNS_FP = 1 << (31-29), + FLAG_RETURNS_64BITS = 1 << (31-28), + + FLAG_RETURNS_STRUCT = 1 << (31-27), /* This goes in cr6 */ + + FLAG_ARG_NEEDS_COPY = 1 << (31- 7), + FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ + FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), + FLAG_RETVAL_REFERENCE = 1 << (31- 4) +}; + +/* About the DARWIN ABI. */ +enum { + NUM_GPR_ARG_REGISTERS = 8, + NUM_FPR_ARG_REGISTERS = 13, + LINKAGE_AREA_GPRS = 6 +}; + +enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */ + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + m32/m64 + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4/8 | stack pointer here + |--------------------------------------------|<+ <<< on entry to + | ASM_NEEDS_REGISTERS=r28-r31 4*(4/8) | | ffi_call_DARWIN + |--------------------------------------------| | + | When we have any FP activity... the | | + | FPRs occupy NUM_FPR_ARG_REGISTERS slots | | + | here fp13 .. fp1 from high to low addr. | | + ~ ~ ~ + | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | stack | + | Reserved 2*4/8 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 |-/ during + |--------------------------------------------| <<< ffi_call_DARWIN + + */ + +#if defined(POWERPC_DARWIN64) +static void +darwin64_pass_struct_by_value + (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **); +#endif + +/* This depends on GPR_SIZE = sizeof (unsigned long) */ + +void +ffi_prep_args (extended_cif *ecif, unsigned long *const stack) +{ + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + const unsigned nargs = ecif->cif->nargs; +#if !defined(POWERPC_DARWIN64) + const ffi_abi abi = ecif->cif->abi; +#endif + + /* 'stacktop' points at the previous backchain pointer. */ + unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long)); + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS; + int gp_count = 0, fparg_count = 0; + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions. */ + + int i; + double double_tmp; + void **p_argv = ecif->avalue; + unsigned long gprvalue; + ffi_type** ptr = ecif->cif->arg_types; +#if !defined(POWERPC_DARWIN64) + char *dest_cpy; +#endif + unsigned size_al = 0; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0); + FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0); + FFI_ASSERT((bytes & 0xF) == 0); + + /* Deal with return values that are actually pass-by-reference. + Rule: + Return values are referenced by r3, so r4 is the first parameter. */ + + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned long) (char *) ecif->rvalue; + + /* Now for the arguments. */ + for (i = nargs; i > 0; i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are skipped. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float *) *p_argv; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; +#if defined(POWERPC_DARWIN) + *(float *)next_arg = *(float *) *p_argv; +#else + *(double *)next_arg = double_tmp; +#endif + next_arg++; + gp_count++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; + + case FFI_TYPE_DOUBLE: + double_tmp = *(double *) *p_argv; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + *(double *)next_arg = double_tmp; +#ifdef POWERPC64 + next_arg++; + gp_count++; +#else + next_arg += 2; + gp_count += 2; +#endif + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +# if defined(POWERPC64) && !defined(POWERPC_DARWIN64) + /* ??? This will exceed the regs count when the value starts at fp13 + and it will not put the extra bit on the stack. */ + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *(long double *) fpr_base++ = *(long double *) *p_argv; + else + *(long double *) next_arg = *(long double *) *p_argv; + next_arg += 2; + fparg_count += 2; +# else + double_tmp = ((double *) *p_argv)[0]; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + *(double *) next_arg = double_tmp; +# if defined(POWERPC_DARWIN64) + next_arg++; + gp_count++; +# else + next_arg += 2; + gp_count += 2; +# endif + fparg_count++; + double_tmp = ((double *) *p_argv)[1]; + if (fparg_count < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = double_tmp; + *(double *) next_arg = double_tmp; +# if defined(POWERPC_DARWIN64) + next_arg++; + gp_count++; +# else + next_arg += 2; + gp_count += 2; +# endif + fparg_count++; +# endif + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; +#endif + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef POWERPC64 + gprvalue = *(long long *) *p_argv; + goto putgpr; +#else + *(long long *) next_arg = *(long long *) *p_argv; + next_arg += 2; + gp_count += 2; +#endif + break; + case FFI_TYPE_POINTER: + gprvalue = *(unsigned long *) *p_argv; + goto putgpr; + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char *) *p_argv; + goto putgpr; + case FFI_TYPE_SINT8: + gprvalue = *(signed char *) *p_argv; + goto putgpr; + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short *) *p_argv; + goto putgpr; + case FFI_TYPE_SINT16: + gprvalue = *(signed short *) *p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; +#if defined(POWERPC_DARWIN64) + next_arg = (unsigned long *)FFI_ALIGN((char *)next_arg, (*ptr)->alignment); + darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, + (unsigned) size_al, + (unsigned int *) &fparg_count, + &fpr_base, &next_arg); +#else + dest_cpy = (char *) next_arg; + + /* If the first member of the struct is a double, then include enough + padding in the struct size to align it to double-word. */ + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = FFI_ALIGN((*ptr)->size, 8); + +# if defined(POWERPC64) + FFI_ASSERT (abi != FFI_DARWIN); + memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); + next_arg += (size_al + 7) / 8; +# else + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. + Structures with 3 byte in size are padded upwards. */ + if (size_al < 3 && abi == FFI_DARWIN) + dest_cpy += 4 - size_al; + + memcpy((char *) dest_cpy, (char *) *p_argv, size_al); + next_arg += (size_al + 3) / 4; +# endif +#endif + break; + + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + gprvalue = *(signed int *) *p_argv; + goto putgpr; + + case FFI_TYPE_UINT32: + gprvalue = *(unsigned int *) *p_argv; + putgpr: + *next_arg++ = gprvalue; + gp_count++; + break; + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + /* FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + FFI_ASSERT((unsigned *)fpr_base + <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); */ +} + +#if defined(POWERPC_DARWIN64) + +/* See if we can put some of the struct into fprs. + This should not be called for structures of size 16 bytes, since these are not + broken out this way. */ +static void +darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr) +{ + int i; + + FFI_ASSERT (s->type == FFI_TYPE_STRUCT) + + for (i = 0; s->elements[i] != NULL; i++) + { + ffi_type *p = s->elements[i]; + switch (p->type) + { + case FFI_TYPE_STRUCT: + darwin64_scan_struct_for_floats (p, nfpr); + break; + case FFI_TYPE_LONGDOUBLE: + (*nfpr) += 2; + break; + case FFI_TYPE_DOUBLE: + case FFI_TYPE_FLOAT: + (*nfpr) += 1; + break; + default: + break; + } + } +} + +static int +darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr) +{ + unsigned struct_offset=0, i; + + for (i = 0; s->elements[i] != NULL; i++) + { + char *item_base; + ffi_type *p = s->elements[i]; + /* Find the start of this item (0 for the first one). */ + if (i > 0) + struct_offset = FFI_ALIGN(struct_offset, p->alignment); + + item_base = src + struct_offset; + + switch (p->type) + { + case FFI_TYPE_STRUCT: + if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr)) + return 1; + break; + case FFI_TYPE_LONGDOUBLE: + if (*nfpr >= NUM_FPR_ARG_REGISTERS) + return 1; + (*nfpr) += 1; + item_base += 8; + /* FALL THROUGH */ + case FFI_TYPE_DOUBLE: + if (*nfpr >= NUM_FPR_ARG_REGISTERS) + return 1; + (*nfpr) += 1; + break; + case FFI_TYPE_FLOAT: + if (*nfpr >= NUM_FPR_ARG_REGISTERS) + return 1; + (*nfpr) += 1; + break; + default: + /* If we try and place any item, that is non-float, once we've + exceeded the 8 GPR mark, then we can't fit the struct. */ + if ((unsigned long)item_base >= 8*8) + return 1; + break; + } + /* now count the size of what we just used. */ + struct_offset += p->size; + } + return 0; +} + +/* Can this struct be returned by value? */ +int +darwin64_struct_ret_by_value_p (ffi_type *s) +{ + unsigned nfp = 0; + + FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT); + + /* The largest structure we can return is 8long + 13 doubles. */ + if (s->size > 168) + return 0; + + /* We can't pass more than 13 floats. */ + darwin64_scan_struct_for_floats (s, &nfp); + if (nfp > 13) + return 0; + + /* If there are not too many floats, and the struct is + small enough to accommodate in the GPRs, then it must be OK. */ + if (s->size <= 64) + return 1; + + /* Well, we have to look harder. */ + nfp = 0; + if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp)) + return 0; + + return 1; +} + +void +darwin64_pass_struct_floats (ffi_type *s, char *src, + unsigned *nfpr, double **fprs) +{ + int i; + double *fpr_base = *fprs; + unsigned struct_offset = 0; + + /* We don't assume anything about the alignment of the source. */ + for (i = 0; s->elements[i] != NULL; i++) + { + char *item_base; + ffi_type *p = s->elements[i]; + /* Find the start of this item (0 for the first one). */ + if (i > 0) + struct_offset = FFI_ALIGN(struct_offset, p->alignment); + item_base = src + struct_offset; + + switch (p->type) + { + case FFI_TYPE_STRUCT: + darwin64_pass_struct_floats (p, item_base, nfpr, + &fpr_base); + break; + case FFI_TYPE_LONGDOUBLE: + if (*nfpr < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = *(double *)item_base; + (*nfpr) += 1; + item_base += 8; + /* FALL THROUGH */ + case FFI_TYPE_DOUBLE: + if (*nfpr < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = *(double *)item_base; + (*nfpr) += 1; + break; + case FFI_TYPE_FLOAT: + if (*nfpr < NUM_FPR_ARG_REGISTERS) + *fpr_base++ = (double) *(float *)item_base; + (*nfpr) += 1; + break; + default: + break; + } + /* now count the size of what we just used. */ + struct_offset += p->size; + } + /* Update the scores. */ + *fprs = fpr_base; +} + +/* Darwin64 special rules. + Break out a struct into params and float registers. */ +static void +darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size, + unsigned *nfpr, double **fprs, unsigned long **arg) +{ + unsigned long *next_arg = *arg; + char *dest_cpy = (char *)next_arg; + + FFI_ASSERT (s->type == FFI_TYPE_STRUCT) + + if (!size) + return; + + /* First... special cases. */ + if (size < 3 + || (size == 4 + && s->elements[0] + && s->elements[0]->type != FFI_TYPE_FLOAT)) + { + /* Must be at least one GPR, padding is unspecified in value, + let's make it zero. */ + *next_arg = 0UL; + dest_cpy += 8 - size; + memcpy ((char *) dest_cpy, src, size); + next_arg++; + } + else if (size == 16) + { + memcpy ((char *) dest_cpy, src, size); + next_arg += 2; + } + else + { + /* now the general case, we consider embedded floats. */ + memcpy ((char *) dest_cpy, src, size); + darwin64_pass_struct_floats (s, src, nfpr, fprs); + next_arg += (size+7)/8; + } + + *arg = next_arg; +} + +double * +darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf) +{ + int i; + unsigned struct_offset = 0; + + /* We don't assume anything about the alignment of the source. */ + for (i = 0; s->elements[i] != NULL; i++) + { + char *item_base; + ffi_type *p = s->elements[i]; + /* Find the start of this item (0 for the first one). */ + if (i > 0) + struct_offset = FFI_ALIGN(struct_offset, p->alignment); + item_base = dest + struct_offset; + + switch (p->type) + { + case FFI_TYPE_STRUCT: + fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf); + break; + case FFI_TYPE_LONGDOUBLE: + if (*nf < NUM_FPR_ARG_REGISTERS) + { + *(double *)item_base = *fprs++ ; + (*nf) += 1; + } + item_base += 8; + /* FALL THROUGH */ + case FFI_TYPE_DOUBLE: + if (*nf < NUM_FPR_ARG_REGISTERS) + { + *(double *)item_base = *fprs++ ; + (*nf) += 1; + } + break; + case FFI_TYPE_FLOAT: + if (*nf < NUM_FPR_ARG_REGISTERS) + { + *(float *)item_base = (float) *fprs++ ; + (*nf) += 1; + } + break; + default: + break; + } + /* now count the size of what we just used. */ + struct_offset += p->size; + } + return fprs; +} + +#endif + +/* Adjust the size of S to be correct for Darwin. + On Darwin m32, the first field of a structure has natural alignment. + On Darwin m64, all fields have natural alignment. */ + +static void +darwin_adjust_aggregate_sizes (ffi_type *s) +{ + int i; + + if (s->type != FFI_TYPE_STRUCT) + return; + + s->size = 0; + for (i = 0; s->elements[i] != NULL; i++) + { + ffi_type *p; + int align; + + p = s->elements[i]; + if (p->type == FFI_TYPE_STRUCT) + darwin_adjust_aggregate_sizes (p); +#if defined(POWERPC_DARWIN64) + /* Natural alignment for all items. */ + align = p->alignment; +#else + /* Natural alignment for the first item... */ + if (i == 0) + align = p->alignment; + else if (p->alignment == 16 || p->alignment < 4) + /* .. subsequent items with vector or align < 4 have natural align. */ + align = p->alignment; + else + /* .. or align is 4. */ + align = 4; +#endif + /* Pad, if necessary, before adding the current item. */ + s->size = FFI_ALIGN(s->size, align) + p->size; + } + + s->size = FFI_ALIGN(s->size, s->alignment); + + /* This should not be necessary on m64, but harmless. */ + if (s->elements[0]->type == FFI_TYPE_UINT64 + || s->elements[0]->type == FFI_TYPE_SINT64 + || s->elements[0]->type == FFI_TYPE_DOUBLE + || s->elements[0]->alignment == 8) + s->alignment = s->alignment > 8 ? s->alignment : 8; + /* Do not add additional tail padding. */ +} + +/* Adjust the size of S to be correct for AIX. + Word-align double unless it is the first member of a structure. */ + +static void +aix_adjust_aggregate_sizes (ffi_type *s) +{ + int i; + + if (s->type != FFI_TYPE_STRUCT) + return; + + s->size = 0; + for (i = 0; s->elements[i] != NULL; i++) + { + ffi_type *p; + int align; + + p = s->elements[i]; + aix_adjust_aggregate_sizes (p); + align = p->alignment; + if (i != 0 && p->type == FFI_TYPE_DOUBLE) + align = 4; + s->size = FFI_ALIGN(s->size, align) + p->size; + } + + s->size = FFI_ALIGN(s->size, s->alignment); + + if (s->elements[0]->type == FFI_TYPE_UINT64 + || s->elements[0]->type == FFI_TYPE_SINT64 + || s->elements[0]->type == FFI_TYPE_DOUBLE + || s->elements[0]->alignment == 8) + s->alignment = s->alignment > 8 ? s->alignment : 8; + /* Do not add additional tail padding. */ +} + +/* Perform machine dependent cif processing. */ +ffi_status +ffi_prep_cif_machdep (ffi_cif *cif) +{ + /* All this is for the DARWIN ABI. */ + unsigned i; + ffi_type **ptr; + unsigned bytes; + unsigned fparg_count = 0, intarg_count = 0; + unsigned flags = 0; + unsigned size_al = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + All the calculation of structure sizes will also be wrong. + Redo the calculation for DARWIN. */ + + if (cif->abi == FFI_DARWIN) + { + darwin_adjust_aggregate_sizes (cif->rtype); + for (i = 0; i < cif->nargs; i++) + darwin_adjust_aggregate_sizes (cif->arg_types[i]); + } + + if (cif->abi == FFI_AIX) + { + aix_adjust_aggregate_sizes (cif->rtype); + for (i = 0; i < cif->nargs; i++) + aix_adjust_aggregate_sizes (cif->arg_types[i]); + } + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + + bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long); + + /* Return value handling. + The rules m32 are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values [??? and structures between 5 and 8 bytes] are + returned in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + m64: + - 64-bit or smaller integral values are returned in GPR3 + - Single/double FP values are returned in fpr1; + - Long double FP values are returned in fpr1 and fpr2; + m64 Structures: + - If the structure could be accommodated in registers were it to be the + first argument to a routine, then it is returned in those registers. + m32/m64 structures otherwise: + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + flags |= FLAG_RETURNS_FP; + break; +#endif + + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef POWERPC64 + case FFI_TYPE_POINTER: +#endif + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: +#if defined(POWERPC_DARWIN64) + { + /* Can we fit the struct into regs? */ + if (darwin64_struct_ret_by_value_p (cif->rtype)) + { + unsigned nfpr = 0; + flags |= FLAG_RETURNS_STRUCT; + if (cif->rtype->size != 16) + darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ; + else + flags |= FLAG_RETURNS_128BITS; + /* Will be 0 for 16byte struct. */ + if (nfpr) + flags |= FLAG_RETURNS_FP; + } + else /* By ref. */ + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } + } +#elif defined(DARWIN_PPC) + if (cif->rtype->size <= 4) + flags |= FLAG_RETURNS_STRUCT; + else /* else by reference. */ + { + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + } +#else /* assume we pass by ref. */ + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; +#endif + break; + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. + ??? Structures are passed as a pointer to a copy of the structure. + Stuff on the stack needs to keep proper alignment. + For m64 the count is effectively of half-GPRs. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + unsigned align_words; + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; +#if !defined(POWERPC_DARWIN64) + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && (intarg_count & 0x01) != 0) + intarg_count++; +#endif + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + fparg_count += 2; + /* If this FP arg is going on the stack, it must be + 16-byte-aligned. */ + if (fparg_count >= NUM_FPR_ARG_REGISTERS) +#if defined (POWERPC64) + intarg_count = FFI_ALIGN(intarg_count, 2); +#else + intarg_count = FFI_ALIGN(intarg_count, 4); +#endif + break; +#endif + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#if defined(POWERPC64) + intarg_count++; +#else + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS-1 + || (intarg_count >= NUM_GPR_ARG_REGISTERS + && (intarg_count & 0x01) != 0)) + intarg_count++; + intarg_count += 2; +#endif + break; + + case FFI_TYPE_STRUCT: + size_al = (*ptr)->size; +#if defined(POWERPC_DARWIN64) + align_words = (*ptr)->alignment >> 3; + if (align_words) + intarg_count = FFI_ALIGN(intarg_count, align_words); + /* Base size of the struct. */ + intarg_count += (size_al + 7) / 8; + /* If 16 bytes then don't worry about floats. */ + if (size_al != 16) + /* Scan through for floats to be placed in regs. */ + darwin64_scan_struct_for_floats (*ptr, &fparg_count) ; +#else + align_words = (*ptr)->alignment >> 2; + if (align_words) + intarg_count = FFI_ALIGN(intarg_count, align_words); + /* If the first member of the struct is a double, then align + the struct to double-word. + if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = FFI_ALIGN((*ptr)->size, 8); */ +# ifdef POWERPC64 + intarg_count += (size_al + 7) / 8; +# else + intarg_count += (size_al + 3) / 4; +# endif +#endif + break; + + default: + /* Everything else is passed as a 4-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + if (fparg_count != 0) + flags |= FLAG_FP_ARGUMENTS; + +#if defined(POWERPC_DARWIN64) + /* Space to image the FPR registers, if needed - which includes when they might be + used in a struct return. */ + if (fparg_count != 0 + || ((flags & FLAG_RETURNS_STRUCT) + && (flags & FLAG_RETURNS_FP))) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#else + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); +#endif + + /* Stack space. */ +#ifdef POWERPC64 + if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + fparg_count) * sizeof(long); +#else + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); +#endif + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16 bytes. */ + bytes = FFI_ALIGN(bytes, 16) ; + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *, + void (*fn)(void), void (*fn2)(void)); + +#if defined (FFI_GO_CLOSURES) +extern void ffi_call_go_AIX(extended_cif *, long, unsigned, unsigned *, + void (*fn)(void), void (*fn2)(void), void *closure); +#endif + +extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *, + void (*fn)(void), void (*fn2)(void), ffi_type*); + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca (cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, + FFI_FN(ffi_prep_args)); + break; + case FFI_DARWIN: + ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, + FFI_FN(ffi_prep_args), cif->rtype); + break; + default: + FFI_ASSERT(0); + break; + } +} + +#if defined (FFI_GO_CLOSURES) +void +ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, + void *closure) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return + value address then we need to make one. */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca (cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + ffi_call_go_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, + FFI_FN(ffi_prep_args), closure); + break; + default: + FFI_ASSERT(0); + break; + } +} +#endif + +static void flush_icache(char *); +static void flush_range(char *, int); + +/* The layout of a function descriptor. A C function pointer really + points to one of these. */ + +typedef struct aix_fd_struct { + void *code_pointer; + void *toc; +} aix_fd; + +/* here I'd like to add the stack frame layout we use in darwin_closure.S + and aix_closure.S + + m32/m64 + + The stack layout looks like this: + + | Additional params... | | Higher address + ~ ~ ~ + | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | + | Reserved 2*4/8 | | + |--------------------------------------------| | + | Space for callee's LR 4/8 | | + |--------------------------------------------| | + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | + | Current backchain pointer 4/8 |-/ Parent's frame. + |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM + | Result Bytes 16 | | + |--------------------------------------------| | + ~ padding to 16-byte alignment ~ ~ + |--------------------------------------------| | + | NUM_FPR_ARG_REGISTERS slots | | + | here fp13 .. fp1 13*8 | | + |--------------------------------------------| | + | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS + |--------------------------------------------| | + | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | + |--------------------------------------------| | stack | + | Reserved [compiler,binder] 2*4/8 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4/8 | | + |--------------------------------------------| | lower addresses + | Saved CR [low word for m64] 4/8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4/8 |-/ during + |--------------------------------------------| <<< ffi_closure_ASM. + +*/ + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp; + struct ffi_aix_trampoline_struct *tramp_aix; + aix_fd *fd; + + switch (cif->abi) + { + case FFI_DARWIN: + + FFI_ASSERT (cif->abi == FFI_DARWIN); + + tramp = (unsigned int *) &closure->tramp[0]; +#if defined(POWERPC_DARWIN64) + tramp[0] = 0x7c0802a6; /* mflr r0 */ + tramp[1] = 0x429f0015; /* bcl- 20,4*cr7+so, +0x18 (L1) */ + /* We put the addresses here. */ + tramp[6] = 0x7d6802a6; /*L1: mflr r11 */ + tramp[7] = 0xe98b0000; /* ld r12,0(r11) function address */ + tramp[8] = 0x7c0803a6; /* mtlr r0 */ + tramp[9] = 0x7d8903a6; /* mtctr r12 */ + tramp[10] = 0xe96b0008; /* lwz r11,8(r11) static chain */ + tramp[11] = 0x4e800420; /* bctr */ + + *((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function */ + *((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context */ +#else + tramp[0] = 0x7c0802a6; /* mflr r0 */ + tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */ + tramp[4] = 0x7d6802a6; /* mflr r11 */ + tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */ + tramp[6] = 0x7c0803a6; /* mtlr r0 */ + tramp[7] = 0x7d8903a6; /* mtctr r12 */ + tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */ + tramp[9] = 0x4e800420; /* bctr */ + tramp[2] = (unsigned long) ffi_closure_ASM; /* function */ + tramp[3] = (unsigned long) codeloc; /* context */ +#endif + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Flush the icache. Only necessary on Darwin. */ + flush_range(codeloc, FFI_TRAMPOLINE_SIZE); + + break; + + case FFI_AIX: + + tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp); + fd = (aix_fd *)(void *)ffi_closure_ASM; + + FFI_ASSERT (cif->abi == FFI_AIX); + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = codeloc; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + break; + + default: + return FFI_BAD_ABI; + break; + } + return FFI_OK; +} + +#if defined (FFI_GO_CLOSURES) +ffi_status +ffi_prep_go_closure (ffi_go_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*)) +{ + switch (cif->abi) + { + case FFI_AIX: + + FFI_ASSERT (cif->abi == FFI_AIX); + + closure->tramp = (void *)ffi_go_closure_ASM; + closure->cif = cif; + closure->fun = fun; + return FFI_OK; + + // For now, ffi_prep_go_closure is only implemented for AIX, not for Darwin + default: + return FFI_BAD_ABI; + break; + } + return FFI_OK; +} +#endif + +static void +flush_icache(char *addr) +{ +#ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0\n" + "\tsync\n" + "\ticbi 0,%0\n" + "\tsync\n" + "\tisync" + : : "r"(addr) : "memory"); +#endif +} + +static void +flush_range(char * addr1, int size) +{ +#define MIN_LINE_SIZE 32 + int i; + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr1+i); + flush_icache(addr1+size-1); +} + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +ffi_type * +ffi_closure_helper_DARWIN (ffi_closure *, void *, + unsigned long *, ffi_dblfl *); + +#if defined (FFI_GO_CLOSURES) +ffi_type * +ffi_go_closure_helper_DARWIN (ffi_go_closure*, void *, + unsigned long *, ffi_dblfl *); +#endif + +/* Basically the trampoline invokes ffi_closure_ASM, and on + entry, r11 holds the address of the closure. + After storing the registers that could possibly contain + parameters to be passed into the stack frame and setting + up space for a return value, ffi_closure_ASM invokes the + following helper function to do most of the work. */ + +static ffi_type * +ffi_closure_helper_common (ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, void *rvalue, + unsigned long *pgr, ffi_dblfl *pfr) +{ + /* rvalue is the pointer to space for return value in closure assembly + pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM + pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ + + typedef double ldbits[2]; + + union ldu + { + ldbits lb; + long double ld; + }; + + void ** avalue; + ffi_type ** arg_types; + long i, avn; + ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS; + unsigned size_al; +#if defined(POWERPC_DARWIN64) + unsigned fpsused = 0; +#endif + + avalue = alloca (cif->nargs * sizeof(void *)); + + if (cif->rtype->type == FFI_TYPE_STRUCT) + { +#if defined(POWERPC_DARWIN64) + if (!darwin64_struct_ret_by_value_p (cif->rtype)) + { + /* Won't fit into the regs - return by ref. */ + rvalue = (void *) *pgr; + pgr++; + } +#elif defined(DARWIN_PPC) + if (cif->rtype->size > 4) + { + rvalue = (void *) *pgr; + pgr++; + } +#else /* assume we return by ref. */ + rvalue = (void *) *pgr; + pgr++; +#endif + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: +#if defined(POWERPC64) + avalue[i] = (char *) pgr + 7; +#else + avalue[i] = (char *) pgr + 3; +#endif + pgr++; + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: +#if defined(POWERPC64) + avalue[i] = (char *) pgr + 6; +#else + avalue[i] = (char *) pgr + 2; +#endif + pgr++; + break; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: +#if defined(POWERPC64) + avalue[i] = (char *) pgr + 4; +#else + case FFI_TYPE_POINTER: + avalue[i] = pgr; +#endif + pgr++; + break; + + case FFI_TYPE_STRUCT: + size_al = arg_types[i]->size; +#if defined(POWERPC_DARWIN64) + pgr = (unsigned long *)FFI_ALIGN((char *)pgr, arg_types[i]->alignment); + if (size_al < 3 || size_al == 4) + { + avalue[i] = ((char *)pgr)+8-size_al; + if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT + && fpsused < NUM_FPR_ARG_REGISTERS) + { + *(float *)pgr = (float) *(double *)pfr; + pfr++; + fpsused++; + } + } + else + { + if (size_al != 16) + pfr = (ffi_dblfl *) + darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr, + (double *)pfr, &fpsused); + avalue[i] = pgr; + } + pgr += (size_al + 7) / 8; +#else + /* If the first member of the struct is a double, then align + the struct to double-word. */ + if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) + size_al = FFI_ALIGN(arg_types[i]->size, 8); +# if defined(POWERPC64) + FFI_ASSERT (cif->abi != FFI_DARWIN); + avalue[i] = pgr; + pgr += (size_al + 7) / 8; +# else + /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, + SI 4 bytes) are aligned as if they were those modes. */ + if (size_al < 3 && cif->abi == FFI_DARWIN) + avalue[i] = (char*) pgr + 4 - size_al; + else + avalue[i] = pgr; + pgr += (size_al + 3) / 4; +# endif +#endif + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: +#if defined(POWERPC64) + case FFI_TYPE_POINTER: + avalue[i] = pgr; + pgr++; + break; +#else + /* Long long ints are passed in two gpr's. */ + avalue[i] = pgr; + pgr += 2; + break; +#endif + + case FFI_TYPE_FLOAT: + /* A float value consumes a GPR. + There are 13 64bit floating point registers. */ + if (pfr < end_pfr) + { + double temp = pfr->d; + pfr->f = (float) temp; + avalue[i] = pfr; + pfr++; + } + else + { + avalue[i] = pgr; + } + pgr++; + break; + + case FFI_TYPE_DOUBLE: + /* A double value consumes two GPRs. + There are 13 64bit floating point registers. */ + if (pfr < end_pfr) + { + avalue[i] = pfr; + pfr++; + } + else + { + avalue[i] = pgr; + } +#ifdef POWERPC64 + pgr++; +#else + pgr += 2; +#endif + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + + case FFI_TYPE_LONGDOUBLE: +#ifdef POWERPC64 + if (pfr + 1 < end_pfr) + { + avalue[i] = pfr; + pfr += 2; + } + else + { + if (pfr < end_pfr) + { + *pgr = *(unsigned long *) pfr; + pfr++; + } + avalue[i] = pgr; + } + pgr += 2; +#else /* POWERPC64 */ + /* A long double value consumes four GPRs and two FPRs. + There are 13 64bit floating point registers. */ + if (pfr + 1 < end_pfr) + { + avalue[i] = pfr; + pfr += 2; + } + /* Here we have the situation where one part of the long double + is stored in fpr13 and the other part is already on the stack. + We use a union to pass the long double to avalue[i]. */ + else if (pfr + 1 == end_pfr) + { + union ldu temp_ld; + memcpy (&temp_ld.lb[0], pfr, sizeof(ldbits)); + memcpy (&temp_ld.lb[1], pgr + 2, sizeof(ldbits)); + avalue[i] = &temp_ld.ld; + pfr++; + } + else + { + avalue[i] = pgr; + } + pgr += 4; +#endif /* POWERPC64 */ + break; +#endif + default: + FFI_ASSERT(0); + } + i++; + } + + (fun) (cif, rvalue, avalue, user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype; +} + +ffi_type * +ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue, + unsigned long *pgr, ffi_dblfl *pfr) +{ + return ffi_closure_helper_common (closure->cif, closure->fun, + closure->user_data, rvalue, pgr, pfr); +} + +#if defined (FFI_GO_CLOSURES) +ffi_type * +ffi_go_closure_helper_DARWIN (ffi_go_closure *closure, void *rvalue, + unsigned long *pgr, ffi_dblfl *pfr) +{ + return ffi_closure_helper_common (closure->cif, closure->fun, + closure, rvalue, pgr, pfr); +} +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c new file mode 100644 index 000000000000..4d50878e402a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c @@ -0,0 +1,1153 @@ +/* ----------------------------------------------------------------------- + ffi_linux64.c - Copyright (C) 2013 IBM + Copyright (C) 2011 Anthony Green + Copyright (C) 2011 Kyle Moffett + Copyright (C) 2008 Red Hat, Inc + Copyright (C) 2007, 2008 Free Software Foundation, Inc + Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include "ffi.h" + +#ifdef POWERPC64 +#include "ffi_common.h" +#include "ffi_powerpc.h" + + +/* About the LINUX64 ABI. */ +enum { + NUM_GPR_ARG_REGISTERS64 = 8, + NUM_FPR_ARG_REGISTERS64 = 13, + NUM_VEC_ARG_REGISTERS64 = 12, +}; +enum { ASM_NEEDS_REGISTERS64 = 4 }; + + +#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +/* Adjust size of ffi_type_longdouble. */ +void FFI_HIDDEN +ffi_prep_types_linux64 (ffi_abi abi) +{ + if ((abi & (FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128)) == FFI_LINUX) + { + ffi_type_longdouble.size = 8; + ffi_type_longdouble.alignment = 8; + } + else + { + ffi_type_longdouble.size = 16; + ffi_type_longdouble.alignment = 16; + } +} +#endif + + +static unsigned int +discover_homogeneous_aggregate (ffi_abi abi, + const ffi_type *t, + unsigned int *elnum) +{ + switch (t->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + /* 64-bit long doubles are equivalent to doubles. */ + if ((abi & FFI_LINUX_LONG_DOUBLE_128) == 0) + { + *elnum = 1; + return FFI_TYPE_DOUBLE; + } + /* IBM extended precision values use unaligned pairs + of FPRs, but according to the ABI must be considered + distinct from doubles. They are also limited to a + maximum of four members in a homogeneous aggregate. */ + else if ((abi & FFI_LINUX_LONG_DOUBLE_IEEE128) == 0) + { + *elnum = 2; + return FFI_TYPE_LONGDOUBLE; + } + /* Fall through. */ +#endif + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + *elnum = 1; + return (int) t->type; + + case FFI_TYPE_STRUCT:; + { + unsigned int base_elt = 0, total_elnum = 0; + ffi_type **el = t->elements; + while (*el) + { + unsigned int el_elt, el_elnum = 0; + el_elt = discover_homogeneous_aggregate (abi, *el, &el_elnum); + if (el_elt == 0 + || (base_elt && base_elt != el_elt)) + return 0; + base_elt = el_elt; + total_elnum += el_elnum; +#if _CALL_ELF == 2 + if (total_elnum > 8) + return 0; +#else + if (total_elnum > 1) + return 0; +#endif + el++; + } + *elnum = total_elnum; + return base_elt; + } + + default: + return 0; + } +} + + +/* Perform machine dependent cif processing */ +static ffi_status +ffi_prep_cif_linux64_core (ffi_cif *cif) +{ + ffi_type **ptr; + unsigned bytes; + unsigned i, fparg_count = 0, intarg_count = 0, vecarg_count = 0; + unsigned flags = cif->flags; + unsigned elt, elnum, rtype; + +#if FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE + /* If compiled without long double support... */ + if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0 || + (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + return FFI_BAD_ABI; +#elif !defined(__VEC__) + /* If compiled without vector register support (used by assembly)... */ + if ((cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + return FFI_BAD_ABI; +#else + /* If the IEEE128 flag is set, but long double is only 64 bits wide... */ + if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) == 0 && + (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + return FFI_BAD_ABI; +#endif + + /* The machine-independent calculation of cif->bytes doesn't work + for us. Redo the calculation. */ +#if _CALL_ELF == 2 + /* Space for backchain, CR, LR, TOC and the asm's temp regs. */ + bytes = (4 + ASM_NEEDS_REGISTERS64) * sizeof (long); + + /* Space for the general registers. */ + bytes += NUM_GPR_ARG_REGISTERS64 * sizeof (long); +#else + /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp + regs. */ + bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long); + + /* Space for the mandatory parm save area and general registers. */ + bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long); +#endif + + /* Return value handling. */ + rtype = cif->rtype->type; +#if _CALL_ELF == 2 +homogeneous: +#endif + switch (rtype) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if ((cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + { + flags |= FLAG_RETURNS_VEC; + break; + } + if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) + flags |= FLAG_RETURNS_128BITS; + /* Fall through. */ +#endif + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + + case FFI_TYPE_UINT128: + flags |= FLAG_RETURNS_128BITS; + /* Fall through. */ + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: +#if _CALL_ELF == 2 + elt = discover_homogeneous_aggregate (cif->abi, cif->rtype, &elnum); + if (elt) + { + flags |= FLAG_RETURNS_SMST; + rtype = elt; + goto homogeneous; + } + if (cif->rtype->size <= 16) + { + flags |= FLAG_RETURNS_SMST; + break; + } +#endif + intarg_count++; + flags |= FLAG_RETVAL_REFERENCE; + /* Fall through. */ + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + unsigned int align; + + switch ((*ptr)->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if ((cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + { + vecarg_count++; + /* Align to 16 bytes, plus the 16-byte argument. */ + intarg_count = (intarg_count + 3) & ~0x1; + if (vecarg_count > NUM_VEC_ARG_REGISTERS64) + flags |= FLAG_ARG_NEEDS_PSAVE; + break; + } + if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) + { + fparg_count++; + intarg_count++; + } + /* Fall through. */ +#endif + case FFI_TYPE_DOUBLE: + case FFI_TYPE_FLOAT: + fparg_count++; + intarg_count++; + if (fparg_count > NUM_FPR_ARG_REGISTERS64) + flags |= FLAG_ARG_NEEDS_PSAVE; + break; + + case FFI_TYPE_STRUCT: + if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) + { + align = (*ptr)->alignment; + if (align > 16) + align = 16; + align = align / 8; + if (align > 1) + intarg_count = FFI_ALIGN (intarg_count, align); + } + intarg_count += ((*ptr)->size + 7) / 8; + elt = discover_homogeneous_aggregate (cif->abi, *ptr, &elnum); +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + if (elt == FFI_TYPE_LONGDOUBLE && + (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + { + vecarg_count += elnum; + if (vecarg_count > NUM_VEC_ARG_REGISTERS64) + flags |= FLAG_ARG_NEEDS_PSAVE; + break; + } + else +#endif + if (elt) + { + fparg_count += elnum; + if (fparg_count > NUM_FPR_ARG_REGISTERS64) + flags |= FLAG_ARG_NEEDS_PSAVE; + } + else + { + if (intarg_count > NUM_GPR_ARG_REGISTERS64) + flags |= FLAG_ARG_NEEDS_PSAVE; + } + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + /* Everything else is passed as a 8-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + if (intarg_count > NUM_GPR_ARG_REGISTERS64) + flags |= FLAG_ARG_NEEDS_PSAVE; + break; + default: + FFI_ASSERT (0); + } + } + + if (fparg_count != 0) + flags |= FLAG_FP_ARGUMENTS; + if (intarg_count > 4) + flags |= FLAG_4_GPR_ARGUMENTS; + if (vecarg_count != 0) + flags |= FLAG_VEC_ARGUMENTS; + + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double); + /* Space for the vector registers, if needed, aligned to 16 bytes. */ + if (vecarg_count != 0) { + bytes = (bytes + 15) & ~0xF; + bytes += NUM_VEC_ARG_REGISTERS64 * sizeof (float128); + } + + /* Stack space. */ +#if _CALL_ELF == 2 + if ((flags & FLAG_ARG_NEEDS_PSAVE) != 0) + bytes += intarg_count * sizeof (long); +#else + if (intarg_count > NUM_GPR_ARG_REGISTERS64) + bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long); +#endif + + /* The stack space allocated needs to be a multiple of 16 bytes. */ + bytes = (bytes + 15) & ~0xF; + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_linux64 (ffi_cif *cif) +{ + if ((cif->abi & FFI_LINUX) != 0) + cif->nfixedargs = cif->nargs; +#if _CALL_ELF != 2 + else if (cif->abi == FFI_COMPAT_LINUX64) + { + /* This call is from old code. Don't touch cif->nfixedargs + since old code will be using a smaller cif. */ + cif->flags |= FLAG_COMPAT; + /* Translate to new abi value. */ + cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; + } +#endif + else + return FFI_BAD_ABI; + return ffi_prep_cif_linux64_core (cif); +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_linux64_var (ffi_cif *cif, + unsigned int nfixedargs, + unsigned int ntotalargs MAYBE_UNUSED) +{ + if ((cif->abi & FFI_LINUX) != 0) + cif->nfixedargs = nfixedargs; +#if _CALL_ELF != 2 + else if (cif->abi == FFI_COMPAT_LINUX64) + { + /* This call is from old code. Don't touch cif->nfixedargs + since old code will be using a smaller cif. */ + cif->flags |= FLAG_COMPAT; + /* Translate to new abi value. */ + cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; + } +#endif + else + return FFI_BAD_ABI; +#if _CALL_ELF == 2 + cif->flags |= FLAG_ARG_NEEDS_PSAVE; +#endif + return ffi_prep_cif_linux64_core (cif); +} + + +/* ffi_prep_args64 is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Ret addr from ffi_call_LINUX64 8bytes | higher addresses + |--------------------------------------------| + | CR save area 8bytes | + |--------------------------------------------| + | Previous backchain pointer 8 | stack pointer here + |--------------------------------------------|<+ <<< on entry to + | Saved r28-r31 4*8 | | ffi_call_LINUX64 + |--------------------------------------------| | + | GPR registers r3-r10 8*8 | | + |--------------------------------------------| | + | FPR registers f1-f13 (optional) 13*8 | | + |--------------------------------------------| | + | VEC registers v2-v13 (optional) 12*16 | | + |--------------------------------------------| | + | Parameter save area | | + |--------------------------------------------| | + | TOC save area 8 | | + |--------------------------------------------| | stack | + | Linker doubleword 8 | | grows | + |--------------------------------------------| | down V + | Compiler doubleword 8 | | + |--------------------------------------------| | lower addresses + | Space for callee's LR 8 | | + |--------------------------------------------| | + | CR save area 8 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 8 |-/ during + |--------------------------------------------| <<< ffi_call_LINUX64 + +*/ + +void FFI_HIDDEN +ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack) +{ + const unsigned long bytes = ecif->cif->bytes; + const unsigned long flags = ecif->cif->flags; + + typedef union + { + char *c; + unsigned long *ul; + float *f; + double *d; + float128 *f128; + size_t p; + } valp; + + /* 'stacktop' points at the previous backchain pointer. */ + valp stacktop; + + /* 'next_arg' points at the space for gpr3, and grows upwards as + we use GPR registers, then continues at rest. */ + valp gpr_base; + valp gpr_end; + valp rest; + valp next_arg; + + /* 'fpr_base' points at the space for f1, and grows upwards as + we use FPR registers. */ + valp fpr_base; + unsigned int fparg_count; + + /* 'vec_base' points at the space for v2, and grows upwards as + we use vector registers. */ + valp vec_base; + unsigned int vecarg_count; + + unsigned int i, words, nargs, nfixedargs; + ffi_type **ptr; + double double_tmp; + union + { + void **v; + char **c; + signed char **sc; + unsigned char **uc; + signed short **ss; + unsigned short **us; + signed int **si; + unsigned int **ui; + unsigned long **ul; + float **f; + double **d; + float128 **f128; + } p_argv; + unsigned long gprvalue; + unsigned long align; + + stacktop.c = (char *) stack + bytes; + gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64; + gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64; +#if _CALL_ELF == 2 + rest.ul = stack + 4 + NUM_GPR_ARG_REGISTERS64; +#else + rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64; +#endif + fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64; + fparg_count = 0; + /* Place the vector args below the FPRs, if used, else the GPRs. */ + if (ecif->cif->flags & FLAG_FP_ARGUMENTS) + vec_base.p = fpr_base.p & ~0xF; + else + vec_base.p = gpr_base.p; + vec_base.f128 -= NUM_VEC_ARG_REGISTERS64; + vecarg_count = 0; + next_arg.ul = gpr_base.ul; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); + FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); + FFI_ASSERT (((unsigned long) gpr_base.c & 0xF) == 0); + FFI_ASSERT (((unsigned long) gpr_end.c & 0xF) == 0); + FFI_ASSERT (((unsigned long) vec_base.c & 0xF) == 0); + FFI_ASSERT ((bytes & 0xF) == 0); + + /* Deal with return values that are actually pass-by-reference. */ + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue; + + /* Now for the arguments. */ + p_argv.v = ecif->avalue; + nargs = ecif->cif->nargs; +#if _CALL_ELF != 2 + nfixedargs = (unsigned) -1; + if ((flags & FLAG_COMPAT) == 0) +#endif + nfixedargs = ecif->cif->nfixedargs; + for (ptr = ecif->cif->arg_types, i = 0; + i < nargs; + i++, ptr++, p_argv.v++) + { + unsigned int elt, elnum; + + switch ((*ptr)->type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if ((ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + { + next_arg.p = FFI_ALIGN (next_arg.p, 16); + if (next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + if (vecarg_count < NUM_VEC_ARG_REGISTERS64 && i < nfixedargs) + memcpy (vec_base.f128++, *p_argv.f128, sizeof (float128)); + else + memcpy (next_arg.f128, *p_argv.f128, sizeof (float128)); + if (++next_arg.f128 == gpr_end.f128) + next_arg.f128 = rest.f128; + vecarg_count++; + FFI_ASSERT (__LDBL_MANT_DIG__ == 113); + FFI_ASSERT (flags & FLAG_VEC_ARGUMENTS); + break; + } + if ((ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) + { + double_tmp = (*p_argv.d)[0]; + if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) + { + *fpr_base.d++ = double_tmp; +# if _CALL_ELF != 2 + if ((flags & FLAG_COMPAT) != 0) + *next_arg.d = double_tmp; +# endif + } + else + *next_arg.d = double_tmp; + if (++next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + fparg_count++; + double_tmp = (*p_argv.d)[1]; + if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) + { + *fpr_base.d++ = double_tmp; +# if _CALL_ELF != 2 + if ((flags & FLAG_COMPAT) != 0) + *next_arg.d = double_tmp; +# endif + } + else + *next_arg.d = double_tmp; + if (++next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + fparg_count++; + FFI_ASSERT (__LDBL_MANT_DIG__ == 106); + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; + } + /* Fall through. */ +#endif + case FFI_TYPE_DOUBLE: +#if _CALL_ELF != 2 + do_double: +#endif + double_tmp = **p_argv.d; + if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) + { + *fpr_base.d++ = double_tmp; +#if _CALL_ELF != 2 + if ((flags & FLAG_COMPAT) != 0) + *next_arg.d = double_tmp; +#endif + } + else + *next_arg.d = double_tmp; + if (++next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + fparg_count++; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; + + case FFI_TYPE_FLOAT: +#if _CALL_ELF != 2 + do_float: +#endif + double_tmp = **p_argv.f; + if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) + { + *fpr_base.d++ = double_tmp; +#if _CALL_ELF != 2 + if ((flags & FLAG_COMPAT) != 0) + { +# ifndef __LITTLE_ENDIAN__ + next_arg.f[1] = (float) double_tmp; +# else + next_arg.f[0] = (float) double_tmp; +# endif + } +#endif + } + else + { +# ifndef __LITTLE_ENDIAN__ + next_arg.f[1] = (float) double_tmp; +# else + next_arg.f[0] = (float) double_tmp; +# endif + } + if (++next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + fparg_count++; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; + + case FFI_TYPE_STRUCT: + if ((ecif->cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) + { + align = (*ptr)->alignment; + if (align > 16) + align = 16; + if (align > 1) + { + next_arg.p = FFI_ALIGN (next_arg.p, align); + if (next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + } + } + elt = discover_homogeneous_aggregate (ecif->cif->abi, *ptr, &elnum); + if (elt) + { +#if _CALL_ELF == 2 + union { + void *v; + float *f; + double *d; + float128 *f128; + } arg; + + arg.v = *p_argv.v; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + if (elt == FFI_TYPE_LONGDOUBLE && + (ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + { + do + { + if (vecarg_count < NUM_VEC_ARG_REGISTERS64 + && i < nfixedargs) + memcpy (vec_base.f128++, arg.f128, sizeof (float128)); + else + memcpy (next_arg.f128, arg.f128++, sizeof (float128)); + if (++next_arg.f128 == gpr_end.f128) + next_arg.f128 = rest.f128; + vecarg_count++; + } + while (--elnum != 0); + } + else +#endif + if (elt == FFI_TYPE_FLOAT) + { + do + { + double_tmp = *arg.f++; + if (fparg_count < NUM_FPR_ARG_REGISTERS64 + && i < nfixedargs) + *fpr_base.d++ = double_tmp; + else + *next_arg.f = (float) double_tmp; + if (++next_arg.f == gpr_end.f) + next_arg.f = rest.f; + fparg_count++; + } + while (--elnum != 0); + if ((next_arg.p & 7) != 0) + if (++next_arg.f == gpr_end.f) + next_arg.f = rest.f; + } + else + do + { + double_tmp = *arg.d++; + if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) + *fpr_base.d++ = double_tmp; + else + *next_arg.d = double_tmp; + if (++next_arg.d == gpr_end.d) + next_arg.d = rest.d; + fparg_count++; + } + while (--elnum != 0); +#else + if (elt == FFI_TYPE_FLOAT) + goto do_float; + else + goto do_double; +#endif + } + else + { + words = ((*ptr)->size + 7) / 8; + if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul) + { + size_t first = gpr_end.c - next_arg.c; + memcpy (next_arg.c, *p_argv.c, first); + memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first); + next_arg.c = rest.c + words * 8 - first; + } + else + { + char *where = next_arg.c; + +#ifndef __LITTLE_ENDIAN__ + /* Structures with size less than eight bytes are passed + left-padded. */ + if ((*ptr)->size < 8) + where += 8 - (*ptr)->size; +#endif + memcpy (where, *p_argv.c, (*ptr)->size); + next_arg.ul += words; + if (next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + } + } + break; + + case FFI_TYPE_UINT8: + gprvalue = **p_argv.uc; + goto putgpr; + case FFI_TYPE_SINT8: + gprvalue = **p_argv.sc; + goto putgpr; + case FFI_TYPE_UINT16: + gprvalue = **p_argv.us; + goto putgpr; + case FFI_TYPE_SINT16: + gprvalue = **p_argv.ss; + goto putgpr; + case FFI_TYPE_UINT32: + gprvalue = **p_argv.ui; + goto putgpr; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + gprvalue = **p_argv.si; + goto putgpr; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + gprvalue = **p_argv.ul; + putgpr: + *next_arg.ul++ = gprvalue; + if (next_arg.ul == gpr_end.ul) + next_arg.ul = rest.ul; + break; + } + } + + FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS + || (next_arg.ul >= gpr_base.ul + && next_arg.ul <= gpr_base.ul + 4)); +} + + +#if _CALL_ELF == 2 +#define MIN_CACHE_LINE_SIZE 8 + +static void +flush_icache (char *wraddr, char *xaddr, int size) +{ + int i; + for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) + __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" + : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); + __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" + : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) + : "memory"); +} +#endif + + +ffi_status FFI_HIDDEN +ffi_prep_closure_loc_linux64 (ffi_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *codeloc) +{ +#if _CALL_ELF == 2 + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + + if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) + return FFI_BAD_ABI; + + tramp[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */ + tramp[1] = 0xe98c0010; /* ld 12,1f-0b(12) */ + tramp[2] = 0x7d8903a6; /* mtctr 12 */ + tramp[3] = 0x4e800420; /* bctr */ + /* 1: .quad function_addr */ + /* 2: .quad context */ + *(void **) &tramp[4] = (void *) ffi_closure_LINUX64; + *(void **) &tramp[6] = codeloc; + flush_icache ((char *) tramp, (char *) codeloc, 4 * 4); +#else + void **tramp = (void **) &closure->tramp[0]; + + if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) + return FFI_BAD_ABI; + + /* Copy function address and TOC from ffi_closure_LINUX64 OPD. */ + memcpy (&tramp[0], (void **) ffi_closure_LINUX64, sizeof (void *)); + tramp[1] = codeloc; + memcpy (&tramp[2], (void **) ffi_closure_LINUX64 + 1, sizeof (void *)); +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + + +int FFI_HIDDEN +ffi_closure_helper_LINUX64 (ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *rvalue, + unsigned long *pst, + ffi_dblfl *pfr, + float128 *pvec) +{ + /* rvalue is the pointer to space for return value in closure assembly */ + /* pst is the pointer to parameter save area + (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */ + /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */ + /* pvec is the pointer to where v2-v13 are stored in ffi_closure_LINUX64 */ + + void **avalue; + ffi_type **arg_types; + unsigned long i, avn, nfixedargs; + ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64; + float128 *end_pvec = pvec + NUM_VEC_ARG_REGISTERS64; + unsigned long align; + + avalue = alloca (cif->nargs * sizeof (void *)); + + /* Copy the caller's structure return value address so that the + closure returns the data directly to the caller. */ + if (cif->rtype->type == FFI_TYPE_STRUCT + && (cif->flags & FLAG_RETURNS_SMST) == 0) + { + rvalue = (void *) *pst; + pst++; + } + + i = 0; + avn = cif->nargs; +#if _CALL_ELF != 2 + nfixedargs = (unsigned) -1; + if ((cif->flags & FLAG_COMPAT) == 0) +#endif + nfixedargs = cif->nfixedargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) + { + unsigned int elt, elnum; + + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: +#ifndef __LITTLE_ENDIAN__ + avalue[i] = (char *) pst + 7; + pst++; + break; +#endif + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: +#ifndef __LITTLE_ENDIAN__ + avalue[i] = (char *) pst + 6; + pst++; + break; +#endif + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: +#ifndef __LITTLE_ENDIAN__ + avalue[i] = (char *) pst + 4; + pst++; + break; +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + avalue[i] = pst; + pst++; + break; + + case FFI_TYPE_STRUCT: + if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) + { + align = arg_types[i]->alignment; + if (align > 16) + align = 16; + if (align > 1) + pst = (unsigned long *) FFI_ALIGN ((size_t) pst, align); + } + elt = discover_homogeneous_aggregate (cif->abi, arg_types[i], &elnum); + if (elt) + { +#if _CALL_ELF == 2 + union { + void *v; + unsigned long *ul; + float *f; + double *d; + float128 *f128; + size_t p; + } to, from; + + /* Repackage the aggregate from its parts. The + aggregate size is not greater than the space taken by + the registers so store back to the register/parameter + save arrays. */ +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + if (elt == FFI_TYPE_LONGDOUBLE && + (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + { + if (pvec + elnum <= end_pvec) + to.v = pvec; + else + to.v = pst; + } + else +#endif + if (pfr + elnum <= end_pfr) + to.v = pfr; + else + to.v = pst; + + avalue[i] = to.v; + from.ul = pst; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + if (elt == FFI_TYPE_LONGDOUBLE && + (cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + { + do + { + if (pvec < end_pvec && i < nfixedargs) + memcpy (to.f128, pvec++, sizeof (float128)); + else + memcpy (to.f128, from.f128, sizeof (float128)); + to.f128++; + from.f128++; + } + while (--elnum != 0); + } + else +#endif + if (elt == FFI_TYPE_FLOAT) + { + do + { + if (pfr < end_pfr && i < nfixedargs) + { + *to.f = (float) pfr->d; + pfr++; + } + else + *to.f = *from.f; + to.f++; + from.f++; + } + while (--elnum != 0); + } + else + { + do + { + if (pfr < end_pfr && i < nfixedargs) + { + *to.d = pfr->d; + pfr++; + } + else + *to.d = *from.d; + to.d++; + from.d++; + } + while (--elnum != 0); + } +#else + if (elt == FFI_TYPE_FLOAT) + goto do_float; + else + goto do_double; +#endif + } + else + { +#ifndef __LITTLE_ENDIAN__ + /* Structures with size less than eight bytes are passed + left-padded. */ + if (arg_types[i]->size < 8) + avalue[i] = (char *) pst + 8 - arg_types[i]->size; + else +#endif + avalue[i] = pst; + } + pst += (arg_types[i]->size + 7) / 8; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if ((cif->abi & FFI_LINUX_LONG_DOUBLE_IEEE128) != 0) + { + if (((unsigned long) pst & 0xF) != 0) + ++pst; + if (pvec < end_pvec && i < nfixedargs) + avalue[i] = pvec++; + else + avalue[i] = pst; + pst += 2; + break; + } + else if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) + { + if (pfr + 1 < end_pfr && i + 1 < nfixedargs) + { + avalue[i] = pfr; + pfr += 2; + } + else + { + if (pfr < end_pfr && i < nfixedargs) + { + /* Passed partly in f13 and partly on the stack. + Move it all to the stack. */ + *pst = *(unsigned long *) pfr; + pfr++; + } + avalue[i] = pst; + } + pst += 2; + break; + } + /* Fall through. */ +#endif + case FFI_TYPE_DOUBLE: +#if _CALL_ELF != 2 + do_double: +#endif + /* On the outgoing stack all values are aligned to 8 */ + /* there are 13 64bit floating point registers */ + + if (pfr < end_pfr && i < nfixedargs) + { + avalue[i] = pfr; + pfr++; + } + else + avalue[i] = pst; + pst++; + break; + + case FFI_TYPE_FLOAT: +#if _CALL_ELF != 2 + do_float: +#endif + if (pfr < end_pfr && i < nfixedargs) + { + /* Float values are stored as doubles in the + ffi_closure_LINUX64 code. Fix them here. */ + pfr->f = (float) pfr->d; + avalue[i] = pfr; + pfr++; + } + else + { +#ifndef __LITTLE_ENDIAN__ + avalue[i] = (char *) pst + 4; +#else + avalue[i] = pst; +#endif + } + pst++; + break; + + default: + FFI_ASSERT (0); + } + + i++; + } + + (*fun) (cif, rvalue, avalue, user_data); + + /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ + if ((cif->flags & FLAG_RETURNS_SMST) != 0) + { + if ((cif->flags & (FLAG_RETURNS_FP | FLAG_RETURNS_VEC)) == 0) + return FFI_V2_TYPE_SMALL_STRUCT + cif->rtype->size - 1; + else if ((cif->flags & FLAG_RETURNS_VEC) != 0) + return FFI_V2_TYPE_VECTOR_HOMOG; + else if ((cif->flags & FLAG_RETURNS_64BITS) != 0) + return FFI_V2_TYPE_DOUBLE_HOMOG; + else + return FFI_V2_TYPE_FLOAT_HOMOG; + } + if ((cif->flags & FLAG_RETURNS_VEC) != 0) + return FFI_V2_TYPE_VECTOR; + return cif->rtype->type; +} +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h new file mode 100644 index 000000000000..960a5c42213a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h @@ -0,0 +1,105 @@ +/* ----------------------------------------------------------------------- + ffi_powerpc.h - Copyright (C) 2013 IBM + Copyright (C) 2011 Anthony Green + Copyright (C) 2011 Kyle Moffett + Copyright (C) 2008 Red Hat, Inc + Copyright (C) 2007, 2008 Free Software Foundation, Inc + Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +enum { + /* The assembly depends on these exact flags. */ + /* These go in cr7 */ + FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */ + FLAG_RETURNS_NOTHING = 1 << (31-30), + FLAG_RETURNS_FP = 1 << (31-29), + FLAG_RETURNS_VEC = 1 << (31-28), + + /* These go in cr6 */ + FLAG_RETURNS_64BITS = 1 << (31-27), + FLAG_RETURNS_128BITS = 1 << (31-26), + + FLAG_COMPAT = 1 << (31- 8), /* Not used by assembly */ + + /* These go in cr1 */ + FLAG_ARG_NEEDS_COPY = 1 << (31- 7), /* Used by sysv code */ + FLAG_ARG_NEEDS_PSAVE = FLAG_ARG_NEEDS_COPY, /* Used by linux64 code */ + FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ + FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), + FLAG_RETVAL_REFERENCE = 1 << (31- 4), + FLAG_VEC_ARGUMENTS = 1 << (31- 3), +}; + +typedef union +{ + float f; + double d; +} ffi_dblfl; + +#if defined(__FLOAT128_TYPE__) && defined(__HAVE_FLOAT128) +typedef _Float128 float128; +#elif defined(__FLOAT128__) +typedef __float128 float128; +#else +typedef char float128[16] __attribute__((aligned(16))); +#endif + +void FFI_HIDDEN ffi_closure_SYSV (void); +void FFI_HIDDEN ffi_go_closure_sysv (void); +void FFI_HIDDEN ffi_call_SYSV(extended_cif *, void (*)(void), void *, + unsigned, void *, int); + +void FFI_HIDDEN ffi_prep_types_sysv (ffi_abi); +ffi_status FFI_HIDDEN ffi_prep_cif_sysv (ffi_cif *); +ffi_status FFI_HIDDEN ffi_prep_closure_loc_sysv (ffi_closure *, + ffi_cif *, + void (*) (ffi_cif *, void *, + void **, void *), + void *, void *); +int FFI_HIDDEN ffi_closure_helper_SYSV (ffi_cif *, + void (*) (ffi_cif *, void *, + void **, void *), + void *, void *, unsigned long *, + ffi_dblfl *, unsigned long *); + +void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, void (*) (void), void *, + unsigned long, void *, long); +void FFI_HIDDEN ffi_closure_LINUX64 (void); +void FFI_HIDDEN ffi_go_closure_linux64 (void); + +void FFI_HIDDEN ffi_prep_types_linux64 (ffi_abi); +ffi_status FFI_HIDDEN ffi_prep_cif_linux64 (ffi_cif *); +ffi_status FFI_HIDDEN ffi_prep_cif_linux64_var (ffi_cif *, unsigned int, + unsigned int); +void FFI_HIDDEN ffi_prep_args64 (extended_cif *, unsigned long *const); +ffi_status FFI_HIDDEN ffi_prep_closure_loc_linux64 (ffi_closure *, ffi_cif *, + void (*) (ffi_cif *, void *, + void **, void *), + void *, void *); +int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_cif *, + void (*) (ffi_cif *, void *, + void **, void *), + void *, void *, + unsigned long *, ffi_dblfl *, + float128 *); diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c new file mode 100644 index 000000000000..4078e7511629 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c @@ -0,0 +1,923 @@ +/* ----------------------------------------------------------------------- + ffi_sysv.c - Copyright (C) 2013 IBM + Copyright (C) 2011 Anthony Green + Copyright (C) 2011 Kyle Moffett + Copyright (C) 2008 Red Hat, Inc + Copyright (C) 2007, 2008 Free Software Foundation, Inc + Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include "ffi.h" + +#ifndef POWERPC64 +#include "ffi_common.h" +#include "ffi_powerpc.h" + + +/* About the SYSV ABI. */ +#define ASM_NEEDS_REGISTERS 6 +#define NUM_GPR_ARG_REGISTERS 8 +#define NUM_FPR_ARG_REGISTERS 8 + + +#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +/* Adjust size of ffi_type_longdouble. */ +void FFI_HIDDEN +ffi_prep_types_sysv (ffi_abi abi) +{ + if ((abi & (FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128)) == FFI_SYSV) + { + ffi_type_longdouble.size = 8; + ffi_type_longdouble.alignment = 8; + } + else + { + ffi_type_longdouble.size = 16; + ffi_type_longdouble.alignment = 16; + } +} +#endif + +/* Transform long double, double and float to other types as per abi. */ +static int +translate_float (int abi, int type) +{ +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + if (type == FFI_TYPE_LONGDOUBLE + && (abi & FFI_SYSV_LONG_DOUBLE_128) == 0) + type = FFI_TYPE_DOUBLE; +#endif + if ((abi & FFI_SYSV_SOFT_FLOAT) != 0) + { + if (type == FFI_TYPE_FLOAT) + type = FFI_TYPE_UINT32; + else if (type == FFI_TYPE_DOUBLE) + type = FFI_TYPE_UINT64; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + else if (type == FFI_TYPE_LONGDOUBLE) + type = FFI_TYPE_UINT128; + } + else if ((abi & FFI_SYSV_IBM_LONG_DOUBLE) == 0) + { + if (type == FFI_TYPE_LONGDOUBLE) + type = FFI_TYPE_STRUCT; +#endif + } + return type; +} + +/* Perform machine dependent cif processing */ +static ffi_status +ffi_prep_cif_sysv_core (ffi_cif *cif) +{ + ffi_type **ptr; + unsigned bytes; + unsigned i, fpr_count = 0, gpr_count = 0, stack_count = 0; + unsigned flags = cif->flags; + unsigned struct_copy_size = 0; + unsigned type = cif->rtype->type; + unsigned size = cif->rtype->size; + + /* The machine-independent calculation of cif->bytes doesn't work + for us. Redo the calculation. */ + + /* Space for the frame pointer, callee's LR, and the asm's temp regs. */ + bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int); + + /* Space for the GPR registers. */ + bytes += NUM_GPR_ARG_REGISTERS * sizeof (int); + + /* Return value handling. The rules for SYSV are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are returned + in gpr3 and gpr4; + - Larger structures are allocated space and a pointer is passed as + the first argument. + - Single/double FP values are returned in fpr1; + - long doubles (if not equivalent to double) are returned in + fpr1,fpr2 for Linux and as for large structs for SysV. */ + + type = translate_float (cif->abi, type); + + switch (type) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags |= FLAG_RETURNS_128BITS; + /* Fall through. */ +#endif + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; +#ifdef __NO_FPRS__ + return FFI_BAD_ABI; +#endif + break; + + case FFI_TYPE_UINT128: + flags |= FLAG_RETURNS_128BITS; + /* Fall through. */ + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + /* The final SYSV ABI says that structures smaller or equal 8 bytes + are returned in r3/r4. A draft ABI used by linux instead + returns them in memory. */ + if ((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) + { + flags |= FLAG_RETURNS_SMST; + break; + } + gpr_count++; + flags |= FLAG_RETVAL_REFERENCE; + /* Fall through. */ + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures and long doubles (if not equivalent + to double) are passed as a pointer to a copy of the structure. + Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + unsigned short typenum = (*ptr)->type; + + typenum = translate_float (cif->abi, typenum); + + switch (typenum) + { +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if (fpr_count >= NUM_FPR_ARG_REGISTERS - 1) + { + fpr_count = NUM_FPR_ARG_REGISTERS; + /* 8-byte align long doubles. */ + stack_count += stack_count & 1; + stack_count += 4; + } + else + fpr_count += 2; +#ifdef __NO_FPRS__ + return FFI_BAD_ABI; +#endif + break; +#endif + + case FFI_TYPE_DOUBLE: + if (fpr_count >= NUM_FPR_ARG_REGISTERS) + { + /* 8-byte align doubles. */ + stack_count += stack_count & 1; + stack_count += 2; + } + else + fpr_count += 1; +#ifdef __NO_FPRS__ + return FFI_BAD_ABI; +#endif + break; + + case FFI_TYPE_FLOAT: + if (fpr_count >= NUM_FPR_ARG_REGISTERS) + /* Yes, we don't follow the ABI, but neither does gcc. */ + stack_count += 1; + else + fpr_count += 1; +#ifdef __NO_FPRS__ + return FFI_BAD_ABI; +#endif + break; + + case FFI_TYPE_UINT128: + /* A long double in FFI_LINUX_SOFT_FLOAT can use only a set + of four consecutive gprs. If we do not have enough, we + have to adjust the gpr_count value. */ + if (gpr_count >= NUM_GPR_ARG_REGISTERS - 3) + gpr_count = NUM_GPR_ARG_REGISTERS; + if (gpr_count >= NUM_GPR_ARG_REGISTERS) + stack_count += 4; + else + gpr_count += 4; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. + + Also, only certain register pairs can be used for + passing long long int -- specifically (r3,r4), (r5,r6), + (r7,r8), (r9,r10). */ + gpr_count += gpr_count & 1; + if (gpr_count >= NUM_GPR_ARG_REGISTERS) + { + stack_count += stack_count & 1; + stack_count += 2; + } + else + gpr_count += 2; + break; + + case FFI_TYPE_STRUCT: + /* We must allocate space for a copy of these to enforce + pass-by-value. Pad the space up to a multiple of 16 + bytes (the maximum alignment required for anything under + the SYSV ABI). */ + struct_copy_size += ((*ptr)->size + 15) & ~0xF; + /* Fall through (allocate space for the pointer). */ + + case FFI_TYPE_POINTER: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + /* Everything else is passed as a 4-byte word in a GPR, either + the object itself or a pointer to it. */ + if (gpr_count >= NUM_GPR_ARG_REGISTERS) + stack_count += 1; + else + gpr_count += 1; + break; + + default: + FFI_ASSERT (0); + } + } + + if (fpr_count != 0) + flags |= FLAG_FP_ARGUMENTS; + if (gpr_count > 4) + flags |= FLAG_4_GPR_ARGUMENTS; + if (struct_copy_size != 0) + flags |= FLAG_ARG_NEEDS_COPY; + + /* Space for the FPR registers, if needed. */ + if (fpr_count != 0) + bytes += NUM_FPR_ARG_REGISTERS * sizeof (double); + + /* Stack space. */ + bytes += stack_count * sizeof (int); + + /* The stack space allocated needs to be a multiple of 16 bytes. */ + bytes = (bytes + 15) & ~0xF; + + /* Add in the space for the copied structures. */ + bytes += struct_copy_size; + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_sysv (ffi_cif *cif) +{ + if ((cif->abi & FFI_SYSV) == 0) + { + /* This call is from old code. Translate to new ABI values. */ + cif->flags |= FLAG_COMPAT; + switch (cif->abi) + { + default: + return FFI_BAD_ABI; + + case FFI_COMPAT_SYSV: + cif->abi = FFI_SYSV | FFI_SYSV_STRUCT_RET | FFI_SYSV_LONG_DOUBLE_128; + break; + + case FFI_COMPAT_GCC_SYSV: + cif->abi = FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128; + break; + + case FFI_COMPAT_LINUX: + cif->abi = (FFI_SYSV | FFI_SYSV_IBM_LONG_DOUBLE + | FFI_SYSV_LONG_DOUBLE_128); + break; + + case FFI_COMPAT_LINUX_SOFT_FLOAT: + cif->abi = (FFI_SYSV | FFI_SYSV_SOFT_FLOAT | FFI_SYSV_IBM_LONG_DOUBLE + | FFI_SYSV_LONG_DOUBLE_128); + break; + } + } + return ffi_prep_cif_sysv_core (cif); +} + +/* ffi_prep_args_SYSV is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_SYSV 4bytes | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4 | stack pointer here + |--------------------------------------------|<+ <<< on entry to + | Saved r28-r31 4*4 | | ffi_call_SYSV + |--------------------------------------------| | + | GPR registers r3-r10 8*4 | | ffi_call_SYSV + |--------------------------------------------| | + | FPR registers f1-f8 (optional) 8*8 | | + |--------------------------------------------| | stack | + | Space for copied structures | | grows | + |--------------------------------------------| | down V + | Parameters that didn't fit in registers | | + |--------------------------------------------| | lower addresses + | Space for callee's LR 4 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4 |-/ during + |--------------------------------------------| <<< ffi_call_SYSV + +*/ + +void FFI_HIDDEN +ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack) +{ + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + typedef union + { + char *c; + unsigned *u; + long long *ll; + float *f; + double *d; + } valp; + + /* 'stacktop' points at the previous backchain pointer. */ + valp stacktop; + + /* 'gpr_base' points at the space for gpr3, and grows upwards as + we use GPR registers. */ + valp gpr_base; + valp gpr_end; + +#ifndef __NO_FPRS__ + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + valp fpr_base; + valp fpr_end; +#endif + + /* 'copy_space' grows down as we put structures in it. It should + stay 16-byte aligned. */ + valp copy_space; + + /* 'next_arg' grows up as we put parameters in it. */ + valp next_arg; + + int i; + ffi_type **ptr; +#ifndef __NO_FPRS__ + double double_tmp; +#endif + union + { + void **v; + char **c; + signed char **sc; + unsigned char **uc; + signed short **ss; + unsigned short **us; + unsigned int **ui; + long long **ll; + float **f; + double **d; + } p_argv; + size_t struct_copy_size; + unsigned gprvalue; + + stacktop.c = (char *) stack + bytes; + gpr_end.u = stacktop.u - ASM_NEEDS_REGISTERS; + gpr_base.u = gpr_end.u - NUM_GPR_ARG_REGISTERS; +#ifndef __NO_FPRS__ + fpr_end.d = gpr_base.d; + fpr_base.d = fpr_end.d - NUM_FPR_ARG_REGISTERS; + copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c); +#else + copy_space.c = gpr_base.c; +#endif + next_arg.u = stack + 2; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); + FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0); + FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); + FFI_ASSERT ((bytes & 0xF) == 0); + FFI_ASSERT (copy_space.c >= next_arg.c); + + /* Deal with return values that are actually pass-by-reference. */ + if (flags & FLAG_RETVAL_REFERENCE) + *gpr_base.u++ = (unsigned) (char *) ecif->rvalue; + + /* Now for the arguments. */ + p_argv.v = ecif->avalue; + for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; + i > 0; + i--, ptr++, p_argv.v++) + { + unsigned int typenum = (*ptr)->type; + + typenum = translate_float (ecif->cif->abi, typenum); + + /* Now test the translated value */ + switch (typenum) + { +#ifndef __NO_FPRS__ +# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + double_tmp = (*p_argv.d)[0]; + + if (fpr_base.d >= fpr_end.d - 1) + { + fpr_base.d = fpr_end.d; + if (((next_arg.u - stack) & 1) != 0) + next_arg.u += 1; + *next_arg.d = double_tmp; + next_arg.u += 2; + double_tmp = (*p_argv.d)[1]; + *next_arg.d = double_tmp; + next_arg.u += 2; + } + else + { + *fpr_base.d++ = double_tmp; + double_tmp = (*p_argv.d)[1]; + *fpr_base.d++ = double_tmp; + } + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; +# endif + case FFI_TYPE_DOUBLE: + double_tmp = **p_argv.d; + + if (fpr_base.d >= fpr_end.d) + { + if (((next_arg.u - stack) & 1) != 0) + next_arg.u += 1; + *next_arg.d = double_tmp; + next_arg.u += 2; + } + else + *fpr_base.d++ = double_tmp; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; + + case FFI_TYPE_FLOAT: + double_tmp = **p_argv.f; + if (fpr_base.d >= fpr_end.d) + { + *next_arg.f = (float) double_tmp; + next_arg.u += 1; + } + else + *fpr_base.d++ = double_tmp; + FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); + break; +#endif /* have FPRs */ + + case FFI_TYPE_UINT128: + /* The soft float ABI for long doubles works like this, a long double + is passed in four consecutive GPRs if available. A maximum of 2 + long doubles can be passed in gprs. If we do not have 4 GPRs + left, the long double is passed on the stack, 4-byte aligned. */ + if (gpr_base.u >= gpr_end.u - 3) + { + unsigned int ii; + gpr_base.u = gpr_end.u; + for (ii = 0; ii < 4; ii++) + { + unsigned int int_tmp = (*p_argv.ui)[ii]; + *next_arg.u++ = int_tmp; + } + } + else + { + unsigned int ii; + for (ii = 0; ii < 4; ii++) + { + unsigned int int_tmp = (*p_argv.ui)[ii]; + *gpr_base.u++ = int_tmp; + } + } + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + if (gpr_base.u >= gpr_end.u - 1) + { + gpr_base.u = gpr_end.u; + if (((next_arg.u - stack) & 1) != 0) + next_arg.u++; + *next_arg.ll = **p_argv.ll; + next_arg.u += 2; + } + else + { + /* The abi states only certain register pairs can be + used for passing long long int specifically (r3,r4), + (r5,r6), (r7,r8), (r9,r10). If next arg is long long + but not correct starting register of pair then skip + until the proper starting register. */ + if (((gpr_end.u - gpr_base.u) & 1) != 0) + gpr_base.u++; + *gpr_base.ll++ = **p_argv.ll; + } + break; + + case FFI_TYPE_STRUCT: + struct_copy_size = ((*ptr)->size + 15) & ~0xF; + copy_space.c -= struct_copy_size; + memcpy (copy_space.c, *p_argv.c, (*ptr)->size); + + gprvalue = (unsigned long) copy_space.c; + + FFI_ASSERT (copy_space.c > next_arg.c); + FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY); + goto putgpr; + + case FFI_TYPE_UINT8: + gprvalue = **p_argv.uc; + goto putgpr; + case FFI_TYPE_SINT8: + gprvalue = **p_argv.sc; + goto putgpr; + case FFI_TYPE_UINT16: + gprvalue = **p_argv.us; + goto putgpr; + case FFI_TYPE_SINT16: + gprvalue = **p_argv.ss; + goto putgpr; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + + gprvalue = **p_argv.ui; + + putgpr: + if (gpr_base.u >= gpr_end.u) + *next_arg.u++ = gprvalue; + else + *gpr_base.u++ = gprvalue; + break; + } + } + + /* Check that we didn't overrun the stack... */ + FFI_ASSERT (copy_space.c >= next_arg.c); + FFI_ASSERT (gpr_base.u <= gpr_end.u); +#ifndef __NO_FPRS__ + FFI_ASSERT (fpr_base.u <= fpr_end.u); +#endif + FFI_ASSERT (((flags & FLAG_4_GPR_ARGUMENTS) != 0) + == (gpr_end.u - gpr_base.u < 4)); +} + +#define MIN_CACHE_LINE_SIZE 8 + +static void +flush_icache (char *wraddr, char *xaddr, int size) +{ + int i; + for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) + __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" + : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); + __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" + : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) + : "memory"); +} + +ffi_status FFI_HIDDEN +ffi_prep_closure_loc_sysv (ffi_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *codeloc) +{ + unsigned int *tramp; + + if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI) + return FFI_BAD_ABI; + + tramp = (unsigned int *) &closure->tramp[0]; + tramp[0] = 0x7c0802a6; /* mflr r0 */ + tramp[1] = 0x429f0005; /* bcl 20,31,.+4 */ + tramp[2] = 0x7d6802a6; /* mflr r11 */ + tramp[3] = 0x7c0803a6; /* mtlr r0 */ + tramp[4] = 0x800b0018; /* lwz r0,24(r11) */ + tramp[5] = 0x816b001c; /* lwz r11,28(r11) */ + tramp[6] = 0x7c0903a6; /* mtctr r0 */ + tramp[7] = 0x4e800420; /* bctr */ + *(void **) &tramp[8] = (void *) ffi_closure_SYSV; /* function */ + *(void **) &tramp[9] = codeloc; /* context */ + + /* Flush the icache. */ + flush_icache ((char *)tramp, (char *)codeloc, 8 * 4); + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +/* Basically the trampoline invokes ffi_closure_SYSV, and on + entry, r11 holds the address of the closure. + After storing the registers that could possibly contain + parameters to be passed into the stack frame and setting + up space for a return value, ffi_closure_SYSV invokes the + following helper function to do most of the work. */ + +int +ffi_closure_helper_SYSV (ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *rvalue, + unsigned long *pgr, + ffi_dblfl *pfr, + unsigned long *pst) +{ + /* rvalue is the pointer to space for return value in closure assembly */ + /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */ + /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV */ + /* pst is the pointer to outgoing parameter stack in original caller */ + + void ** avalue; + ffi_type ** arg_types; + long i, avn; +#ifndef __NO_FPRS__ + long nf = 0; /* number of floating registers already used */ +#endif + long ng = 0; /* number of general registers already used */ + + unsigned size = cif->rtype->size; + unsigned short rtypenum = cif->rtype->type; + + avalue = alloca (cif->nargs * sizeof (void *)); + + /* First translate for softfloat/nonlinux */ + rtypenum = translate_float (cif->abi, rtypenum); + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. + For FFI_SYSV the result is passed in r3/r4 if the struct size is less + or equal 8 bytes. */ + if (rtypenum == FFI_TYPE_STRUCT + && !((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8)) + { + rvalue = (void *) *pgr; + ng++; + pgr++; + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) { + unsigned short typenum = arg_types[i]->type; + + /* We may need to handle some values depending on ABI. */ + typenum = translate_float (cif->abi, typenum); + + switch (typenum) + { +#ifndef __NO_FPRS__ + case FFI_TYPE_FLOAT: + /* Unfortunately float values are stored as doubles + in the ffi_closure_SYSV code (since we don't check + the type in that routine). */ + if (nf < NUM_FPR_ARG_REGISTERS) + { + /* FIXME? here we are really changing the values + stored in the original calling routines outgoing + parameter stack. This is probably a really + naughty thing to do but... */ + double temp = pfr->d; + pfr->f = (float) temp; + avalue[i] = pfr; + nf++; + pfr++; + } + else + { + avalue[i] = pst; + pst += 1; + } + break; + + case FFI_TYPE_DOUBLE: + if (nf < NUM_FPR_ARG_REGISTERS) + { + avalue[i] = pfr; + nf++; + pfr++; + } + else + { + if (((long) pst) & 4) + pst++; + avalue[i] = pst; + pst += 2; + } + break; + +# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + if (nf < NUM_FPR_ARG_REGISTERS - 1) + { + avalue[i] = pfr; + pfr += 2; + nf += 2; + } + else + { + if (((long) pst) & 4) + pst++; + avalue[i] = pst; + pst += 4; + nf = 8; + } + break; +# endif +#endif + + case FFI_TYPE_UINT128: + /* Test if for the whole long double, 4 gprs are available. + otherwise the stuff ends up on the stack. */ + if (ng < NUM_GPR_ARG_REGISTERS - 3) + { + avalue[i] = pgr; + pgr += 4; + ng += 4; + } + else + { + avalue[i] = pst; + pst += 4; + ng = 8+4; + } + break; + + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: +#ifndef __LITTLE_ENDIAN__ + if (ng < NUM_GPR_ARG_REGISTERS) + { + avalue[i] = (char *) pgr + 3; + ng++; + pgr++; + } + else + { + avalue[i] = (char *) pst + 3; + pst++; + } + break; +#endif + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: +#ifndef __LITTLE_ENDIAN__ + if (ng < NUM_GPR_ARG_REGISTERS) + { + avalue[i] = (char *) pgr + 2; + ng++; + pgr++; + } + else + { + avalue[i] = (char *) pst + 2; + pst++; + } + break; +#endif + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + if (ng < NUM_GPR_ARG_REGISTERS) + { + avalue[i] = pgr; + ng++; + pgr++; + } + else + { + avalue[i] = pst; + pst++; + } + break; + + case FFI_TYPE_STRUCT: + /* Structs are passed by reference. The address will appear in a + gpr if it is one of the first 8 arguments. */ + if (ng < NUM_GPR_ARG_REGISTERS) + { + avalue[i] = (void *) *pgr; + ng++; + pgr++; + } + else + { + avalue[i] = (void *) *pst; + pst++; + } + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* Passing long long ints are complex, they must + be passed in suitable register pairs such as + (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10) + and if the entire pair aren't available then the outgoing + parameter stack is used for both but an alignment of 8 + must will be kept. So we must either look in pgr + or pst to find the correct address for this type + of parameter. */ + if (ng < NUM_GPR_ARG_REGISTERS - 1) + { + if (ng & 1) + { + /* skip r4, r6, r8 as starting points */ + ng++; + pgr++; + } + avalue[i] = pgr; + ng += 2; + pgr += 2; + } + else + { + if (((long) pst) & 4) + pst++; + avalue[i] = pst; + pst += 2; + ng = NUM_GPR_ARG_REGISTERS; + } + break; + + default: + FFI_ASSERT (0); + } + + i++; + } + + (*fun) (cif, rvalue, avalue, user_data); + + /* Tell ffi_closure_SYSV how to perform return type promotions. + Because the FFI_SYSV ABI returns the structures <= 8 bytes in + r3/r4 we have to tell ffi_closure_SYSV how to treat them. We + combine the base type FFI_SYSV_TYPE_SMALL_STRUCT with the size of + the struct less one. We never have a struct with size zero. + See the comment in ffitarget.h about ordering. */ + if (rtypenum == FFI_TYPE_STRUCT + && (cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) + return FFI_SYSV_TYPE_SMALL_STRUCT - 1 + size; + return rtypenum; +} +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffitarget.h new file mode 100644 index 000000000000..7fb9a9390827 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ffitarget.h @@ -0,0 +1,204 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc + Copyright (c) 1996-2003 Red Hat, Inc. + + Target configuration macros for PowerPC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- System specific configurations ----------------------------------- */ + +#if defined (POWERPC) && defined (__powerpc64__) /* linux64 */ +#ifndef POWERPC64 +#define POWERPC64 +#endif +#elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin64 */ +#ifndef POWERPC64 +#define POWERPC64 +#endif +#ifndef POWERPC_DARWIN64 +#define POWERPC_DARWIN64 +#endif +#elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */ +#ifndef POWERPC64 +#define POWERPC64 +#endif +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + +#if defined (POWERPC_AIX) + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, + FFI_LAST_ABI + +#elif defined (POWERPC_DARWIN) + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, + FFI_LAST_ABI + +#else + /* The FFI_COMPAT values are used by old code. Since libffi may be + a shared library we have to support old values for backwards + compatibility. */ + FFI_COMPAT_SYSV, + FFI_COMPAT_GCC_SYSV, + FFI_COMPAT_LINUX64, + FFI_COMPAT_LINUX, + FFI_COMPAT_LINUX_SOFT_FLOAT, + +# if defined (POWERPC64) + /* This bit, always set in new code, must not be set in any of the + old FFI_COMPAT values that might be used for 64-bit linux. We + only need worry about FFI_COMPAT_LINUX64, but to be safe avoid + all old values. */ + FFI_LINUX = 8, + /* This and following bits can reuse FFI_COMPAT values. */ + FFI_LINUX_STRUCT_ALIGN = 1, + FFI_LINUX_LONG_DOUBLE_128 = 2, + FFI_LINUX_LONG_DOUBLE_IEEE128 = 4, + FFI_DEFAULT_ABI = (FFI_LINUX +# ifdef __STRUCT_PARM_ALIGN__ + | FFI_LINUX_STRUCT_ALIGN +# endif +# ifdef __LONG_DOUBLE_128__ + | FFI_LINUX_LONG_DOUBLE_128 +# ifdef __LONG_DOUBLE_IEEE128__ + | FFI_LINUX_LONG_DOUBLE_IEEE128 +# endif +# endif + ), + FFI_LAST_ABI = 16 + +# else + /* This bit, always set in new code, must not be set in any of the + old FFI_COMPAT values that might be used for 32-bit linux/sysv/bsd. */ + FFI_SYSV = 8, + /* This and following bits can reuse FFI_COMPAT values. */ + FFI_SYSV_SOFT_FLOAT = 1, + FFI_SYSV_STRUCT_RET = 2, + FFI_SYSV_IBM_LONG_DOUBLE = 4, + FFI_SYSV_LONG_DOUBLE_128 = 16, + + FFI_DEFAULT_ABI = (FFI_SYSV +# ifdef __NO_FPRS__ + | FFI_SYSV_SOFT_FLOAT +# endif +# if (defined (__SVR4_STRUCT_RETURN) \ + || defined (POWERPC_FREEBSD) && !defined (__AIX_STRUCT_RETURN)) + | FFI_SYSV_STRUCT_RET +# endif +# if __LDBL_MANT_DIG__ == 106 + | FFI_SYSV_IBM_LONG_DOUBLE +# endif +# ifdef __LONG_DOUBLE_128__ + | FFI_SYSV_LONG_DOUBLE_128 +# endif + ), + FFI_LAST_ABI = 32 +# endif +#endif + +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 +#if defined (POWERPC) || defined (POWERPC_FREEBSD) +# define FFI_GO_CLOSURES 1 +# define FFI_TARGET_SPECIFIC_VARIADIC 1 +# define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs +#endif +#if defined (POWERPC_AIX) +# define FFI_GO_CLOSURES 1 +#endif + +/* ppc_closure.S and linux64_closure.S expect this. */ +#define FFI_PPC_TYPE_LAST FFI_TYPE_POINTER + +/* We define additional types below. If generic types are added that + must be supported by powerpc libffi then it is likely that + FFI_PPC_TYPE_LAST needs increasing *and* the jump tables in + ppc_closure.S and linux64_closure.S be extended. */ + +#if !(FFI_TYPE_LAST == FFI_PPC_TYPE_LAST \ + || (FFI_TYPE_LAST == FFI_TYPE_COMPLEX \ + && !defined FFI_TARGET_HAS_COMPLEX_TYPE)) +# error "You likely have a broken powerpc libffi" +#endif + +/* Needed for soft-float long-double-128 support. */ +#define FFI_TYPE_UINT128 (FFI_PPC_TYPE_LAST + 1) + +/* Needed for FFI_SYSV small structure returns. */ +#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 2) + +/* Used by ELFv2 for homogenous structure returns. */ +#define FFI_V2_TYPE_VECTOR (FFI_PPC_TYPE_LAST + 1) +#define FFI_V2_TYPE_VECTOR_HOMOG (FFI_PPC_TYPE_LAST + 2) +#define FFI_V2_TYPE_FLOAT_HOMOG (FFI_PPC_TYPE_LAST + 3) +#define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_PPC_TYPE_LAST + 4) +#define FFI_V2_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 5) + +#if _CALL_ELF == 2 +# define FFI_TRAMPOLINE_SIZE 32 +#else +# if defined(POWERPC64) || defined(POWERPC_AIX) +# if defined(POWERPC_DARWIN64) +# define FFI_TRAMPOLINE_SIZE 48 +# else +# define FFI_TRAMPOLINE_SIZE 24 +# endif +# else /* POWERPC || POWERPC_AIX */ +# define FFI_TRAMPOLINE_SIZE 40 +# endif +#endif + +#ifndef LIBFFI_ASM +#if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) +struct ffi_aix_trampoline_struct { + void * code_pointer; /* Pointer to ffi_closure_ASM */ + void * toc; /* TOC */ + void * static_chain; /* Pointer to closure */ +}; +#endif +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/linux64.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/linux64.S new file mode 100644 index 000000000000..e92d64af34fd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/linux64.S @@ -0,0 +1,291 @@ +/* ----------------------------------------------------------------------- + sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com> + Copyright (c) 2008 Red Hat, Inc. + + PowerPC64 Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +#ifdef POWERPC64 + .hidden ffi_call_LINUX64 + .globl ffi_call_LINUX64 + .text + .cfi_startproc +# if _CALL_ELF == 2 +ffi_call_LINUX64: +# ifndef __PCREL__ + addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha + addi %r2, %r2, .TOC.-ffi_call_LINUX64@l +# endif + .localentry ffi_call_LINUX64, . - ffi_call_LINUX64 +# else + .section ".opd","aw" + .align 3 +ffi_call_LINUX64: +# ifdef _CALL_LINUX + .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0 + .type ffi_call_LINUX64,@function + .text +.L.ffi_call_LINUX64: +# else + .hidden .ffi_call_LINUX64 + .globl .ffi_call_LINUX64 + .quad .ffi_call_LINUX64,.TOC.@tocbase,0 + .size ffi_call_LINUX64,24 + .type .ffi_call_LINUX64,@function + .text +.ffi_call_LINUX64: +# endif +# endif + mflr %r0 + std %r28, -32(%r1) + std %r29, -24(%r1) + std %r30, -16(%r1) + std %r31, -8(%r1) + std %r7, 8(%r1) /* closure, saved in cr field. */ + std %r0, 16(%r1) + + mr %r28, %r1 /* our AP. */ + .cfi_def_cfa_register 28 + .cfi_offset 65, 16 + .cfi_offset 31, -8 + .cfi_offset 30, -16 + .cfi_offset 29, -24 + .cfi_offset 28, -32 + + stdux %r1, %r1, %r8 + mr %r31, %r6 /* flags, */ + mr %r30, %r5 /* rvalue, */ + mr %r29, %r4 /* function address. */ +/* Save toc pointer, not for the ffi_prep_args64 call, but for the later + bctrl function call. */ +# if _CALL_ELF == 2 + std %r2, 24(%r1) +# else + std %r2, 40(%r1) +# endif + + /* Call ffi_prep_args64. */ + mr %r4, %r1 +# if defined _CALL_LINUX || _CALL_ELF == 2 +# ifdef __PCREL__ + bl ffi_prep_args64@notoc +# else + bl ffi_prep_args64 + nop +# endif +# else + bl .ffi_prep_args64 + nop +# endif + +# if _CALL_ELF == 2 + mr %r12, %r29 +# else + ld %r12, 0(%r29) + ld %r2, 8(%r29) +# endif + /* Now do the call. */ + /* Set up cr1 with bits 3-7 of the flags. */ + mtcrf 0xc0, %r31 + + /* Get the address to call into CTR. */ + mtctr %r12 + /* Load all those argument registers. */ + addi %r29, %r28, -32-(8*8) + ld %r3, (0*8)(%r29) + ld %r4, (1*8)(%r29) + ld %r5, (2*8)(%r29) + ld %r6, (3*8)(%r29) + bf- 5, 1f + ld %r7, (4*8)(%r29) + ld %r8, (5*8)(%r29) + ld %r9, (6*8)(%r29) + ld %r10, (7*8)(%r29) +1: + + /* Load all the FP registers. */ + bf- 6, 2f + addi %r29, %r29, -(14*8) + lfd %f1, ( 1*8)(%r29) + lfd %f2, ( 2*8)(%r29) + lfd %f3, ( 3*8)(%r29) + lfd %f4, ( 4*8)(%r29) + lfd %f5, ( 5*8)(%r29) + lfd %f6, ( 6*8)(%r29) + lfd %f7, ( 7*8)(%r29) + lfd %f8, ( 8*8)(%r29) + lfd %f9, ( 9*8)(%r29) + lfd %f10, (10*8)(%r29) + lfd %f11, (11*8)(%r29) + lfd %f12, (12*8)(%r29) + lfd %f13, (13*8)(%r29) +2: + + /* Load all the vector registers. */ + bf- 3, 3f + addi %r29, %r29, -16 + lvx %v13, 0, %r29 + addi %r29, %r29, -16 + lvx %v12, 0, %r29 + addi %r29, %r29, -16 + lvx %v11, 0, %r29 + addi %r29, %r29, -16 + lvx %v10, 0, %r29 + addi %r29, %r29, -16 + lvx %v9, 0, %r29 + addi %r29, %r29, -16 + lvx %v8, 0, %r29 + addi %r29, %r29, -16 + lvx %v7, 0, %r29 + addi %r29, %r29, -16 + lvx %v6, 0, %r29 + addi %r29, %r29, -16 + lvx %v5, 0, %r29 + addi %r29, %r29, -16 + lvx %v4, 0, %r29 + addi %r29, %r29, -16 + lvx %v3, 0, %r29 + addi %r29, %r29, -16 + lvx %v2, 0, %r29 +3: + + /* Make the call. */ + ld %r11, 8(%r28) + bctrl + + /* This must follow the call immediately, the unwinder + uses this to find out if r2 has been saved or not. */ +# if _CALL_ELF == 2 + ld %r2, 24(%r1) +# else + ld %r2, 40(%r1) +# endif + + /* Now, deal with the return value. */ + mtcrf 0x01, %r31 + bt 31, .Lstruct_return_value + bt 30, .Ldone_return_value + bt 29, .Lfp_return_value + bt 28, .Lvec_return_value + std %r3, 0(%r30) + /* Fall through... */ + +.Ldone_return_value: + /* Restore the registers we used and return. */ + mr %r1, %r28 + .cfi_def_cfa_register 1 + ld %r0, 16(%r28) + ld %r28, -32(%r28) + mtlr %r0 + ld %r29, -24(%r1) + ld %r30, -16(%r1) + ld %r31, -8(%r1) + blr + +.Lvec_return_value: + stvx %v2, 0, %r30 + b .Ldone_return_value + +.Lfp_return_value: + .cfi_def_cfa_register 28 + mtcrf 0x02, %r31 /* cr6 */ + bf 27, .Lfloat_return_value + stfd %f1, 0(%r30) + bf 26, .Ldone_return_value + stfd %f2, 8(%r30) + b .Ldone_return_value +.Lfloat_return_value: + stfs %f1, 0(%r30) + b .Ldone_return_value + +.Lstruct_return_value: + bf 29, .Lvec_homog_or_small_struct + mtcrf 0x02, %r31 /* cr6 */ + bf 27, .Lfloat_homog_return_value + stfd %f1, 0(%r30) + stfd %f2, 8(%r30) + stfd %f3, 16(%r30) + stfd %f4, 24(%r30) + stfd %f5, 32(%r30) + stfd %f6, 40(%r30) + stfd %f7, 48(%r30) + stfd %f8, 56(%r30) + b .Ldone_return_value + +.Lfloat_homog_return_value: + stfs %f1, 0(%r30) + stfs %f2, 4(%r30) + stfs %f3, 8(%r30) + stfs %f4, 12(%r30) + stfs %f5, 16(%r30) + stfs %f6, 20(%r30) + stfs %f7, 24(%r30) + stfs %f8, 28(%r30) + b .Ldone_return_value + +.Lvec_homog_or_small_struct: + bf 28, .Lsmall_struct + stvx %v2, 0, %r30 + addi %r30, %r30, 16 + stvx %v3, 0, %r30 + addi %r30, %r30, 16 + stvx %v4, 0, %r30 + addi %r30, %r30, 16 + stvx %v5, 0, %r30 + addi %r30, %r30, 16 + stvx %v6, 0, %r30 + addi %r30, %r30, 16 + stvx %v7, 0, %r30 + addi %r30, %r30, 16 + stvx %v8, 0, %r30 + addi %r30, %r30, 16 + stvx %v9, 0, %r30 + b .Ldone_return_value + +.Lsmall_struct: + std %r3, 0(%r30) + std %r4, 8(%r30) + b .Ldone_return_value + + .cfi_endproc +# if _CALL_ELF == 2 + .size ffi_call_LINUX64,.-ffi_call_LINUX64 +# else +# ifdef _CALL_LINUX + .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64 +# else + .long 0 + .byte 0,12,0,1,128,4,0,0 + .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 +# endif +# endif + +#endif + +#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2 + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/linux64_closure.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/linux64_closure.S new file mode 100644 index 000000000000..3469a2cbb01e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/linux64_closure.S @@ -0,0 +1,564 @@ +/* ----------------------------------------------------------------------- + sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com> + Copyright (c) 2008 Red Hat, Inc. + + PowerPC64 Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + .file "linux64_closure.S" + +#ifdef POWERPC64 + FFI_HIDDEN (ffi_closure_LINUX64) + .globl ffi_closure_LINUX64 + .text + .cfi_startproc +# if _CALL_ELF == 2 +ffi_closure_LINUX64: +# ifndef __PCREL__ + addis %r2, %r12, .TOC.-ffi_closure_LINUX64@ha + addi %r2, %r2, .TOC.-ffi_closure_LINUX64@l +# endif + .localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64 +# else + .section ".opd","aw" + .align 3 +ffi_closure_LINUX64: +# ifdef _CALL_LINUX + .quad .L.ffi_closure_LINUX64,.TOC.@tocbase,0 + .type ffi_closure_LINUX64,@function + .text +.L.ffi_closure_LINUX64: +# else + FFI_HIDDEN (.ffi_closure_LINUX64) + .globl .ffi_closure_LINUX64 + .quad .ffi_closure_LINUX64,.TOC.@tocbase,0 + .size ffi_closure_LINUX64,24 + .type .ffi_closure_LINUX64,@function + .text +.ffi_closure_LINUX64: +# endif +# endif + +# if _CALL_ELF == 2 +# ifdef __VEC__ +# 32 byte special reg save area + 64 byte parm save area +# + 128 byte retval area + 13*8 fpr save area + 12*16 vec save area + round to 16 +# define STACKFRAME 528 +# else +# 32 byte special reg save area + 64 byte parm save area +# + 64 byte retval area + 13*8 fpr save area + round to 16 +# define STACKFRAME 272 +# endif +# define PARMSAVE 32 +# define RETVAL PARMSAVE+64 +# else +# 48 bytes special reg save area + 64 bytes parm save area +# + 16 bytes retval area + 13*8 bytes fpr save area + round to 16 +# define STACKFRAME 240 +# define PARMSAVE 48 +# define RETVAL PARMSAVE+64 +# endif + +# if _CALL_ELF == 2 + ld %r12, FFI_TRAMPOLINE_SIZE(%r11) # closure->cif + mflr %r0 + lwz %r12, 28(%r12) # cif->flags + mtcrf 0x40, %r12 + addi %r12, %r1, PARMSAVE + bt 7, 0f + # Our caller has not allocated a parameter save area. + # We need to allocate one here and use it to pass gprs to + # ffi_closure_helper_LINUX64. + addi %r12, %r1, -STACKFRAME+PARMSAVE +0: + # Save general regs into parm save area + std %r3, 0(%r12) + std %r4, 8(%r12) + std %r5, 16(%r12) + std %r6, 24(%r12) + std %r7, 32(%r12) + std %r8, 40(%r12) + std %r9, 48(%r12) + std %r10, 56(%r12) + + # load up the pointer to the parm save area + mr %r7, %r12 +# else + # copy r2 to r11 and load TOC into r2 + mr %r11, %r2 + ld %r2, 16(%r2) + + mflr %r0 + # Save general regs into parm save area + # This is the parameter save area set up by our caller. + std %r3, PARMSAVE+0(%r1) + std %r4, PARMSAVE+8(%r1) + std %r5, PARMSAVE+16(%r1) + std %r6, PARMSAVE+24(%r1) + std %r7, PARMSAVE+32(%r1) + std %r8, PARMSAVE+40(%r1) + std %r9, PARMSAVE+48(%r1) + std %r10, PARMSAVE+56(%r1) + + # load up the pointer to the parm save area + addi %r7, %r1, PARMSAVE +# endif + std %r0, 16(%r1) + + # closure->cif + ld %r3, FFI_TRAMPOLINE_SIZE(%r11) + # closure->fun + ld %r4, FFI_TRAMPOLINE_SIZE+8(%r11) + # closure->user_data + ld %r5, FFI_TRAMPOLINE_SIZE+16(%r11) + +.Ldoclosure: + # next save fpr 1 to fpr 13 + stfd %f1, -104+(0*8)(%r1) + stfd %f2, -104+(1*8)(%r1) + stfd %f3, -104+(2*8)(%r1) + stfd %f4, -104+(3*8)(%r1) + stfd %f5, -104+(4*8)(%r1) + stfd %f6, -104+(5*8)(%r1) + stfd %f7, -104+(6*8)(%r1) + stfd %f8, -104+(7*8)(%r1) + stfd %f9, -104+(8*8)(%r1) + stfd %f10, -104+(9*8)(%r1) + stfd %f11, -104+(10*8)(%r1) + stfd %f12, -104+(11*8)(%r1) + stfd %f13, -104+(12*8)(%r1) + + # load up the pointer to the saved fpr registers + addi %r8, %r1, -104 + +# ifdef __VEC__ + # load up the pointer to the saved vector registers + # 8 bytes padding for 16-byte alignment at -112(%r1) + addi %r9, %r8, -24 + stvx %v13, 0, %r9 + addi %r9, %r9, -16 + stvx %v12, 0, %r9 + addi %r9, %r9, -16 + stvx %v11, 0, %r9 + addi %r9, %r9, -16 + stvx %v10, 0, %r9 + addi %r9, %r9, -16 + stvx %v9, 0, %r9 + addi %r9, %r9, -16 + stvx %v8, 0, %r9 + addi %r9, %r9, -16 + stvx %v7, 0, %r9 + addi %r9, %r9, -16 + stvx %v6, 0, %r9 + addi %r9, %r9, -16 + stvx %v5, 0, %r9 + addi %r9, %r9, -16 + stvx %v4, 0, %r9 + addi %r9, %r9, -16 + stvx %v3, 0, %r9 + addi %r9, %r9, -16 + stvx %v2, 0, %r9 +# endif + + # load up the pointer to the result storage + addi %r6, %r1, -STACKFRAME+RETVAL + + stdu %r1, -STACKFRAME(%r1) + .cfi_def_cfa_offset STACKFRAME + .cfi_offset 65, 16 + + # make the call +# if defined _CALL_LINUX || _CALL_ELF == 2 +# ifdef __PCREL__ + bl ffi_closure_helper_LINUX64@notoc +.Lret: +# else + bl ffi_closure_helper_LINUX64 +.Lret: + nop +# endif +# else + bl .ffi_closure_helper_LINUX64 +.Lret: + nop +# endif + + # now r3 contains the return type + # so use it to look up in a table + # so we know how to deal with each type + + # look up the proper starting point in table + # by using return type as offset + ld %r0, STACKFRAME+16(%r1) + cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT + bge .Lsmall + mflr %r4 # move address of .Lret to r4 + sldi %r3, %r3, 4 # now multiply return type by 16 + addi %r4, %r4, .Lret_type0 - .Lret + add %r3, %r3, %r4 # add contents of table to table address + mtctr %r3 + bctr # jump to it + +# Each of the ret_typeX code fragments has to be exactly 16 bytes long +# (4 instructions). For cache effectiveness we align to a 16 byte boundary +# first. + .align 4 + +.Lret_type0: +# case FFI_TYPE_VOID + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME + nop +# case FFI_TYPE_INT +# ifdef __LITTLE_ENDIAN__ + lwa %r3, RETVAL+0(%r1) +# else + lwa %r3, RETVAL+4(%r1) +# endif + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_FLOAT + lfs %f1, RETVAL+0(%r1) + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_DOUBLE + lfd %f1, RETVAL+0(%r1) + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_LONGDOUBLE + lfd %f1, RETVAL+0(%r1) + mtlr %r0 + lfd %f2, RETVAL+8(%r1) + b .Lfinish +# case FFI_TYPE_UINT8 +# ifdef __LITTLE_ENDIAN__ + lbz %r3, RETVAL+0(%r1) +# else + lbz %r3, RETVAL+7(%r1) +# endif + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_SINT8 +# ifdef __LITTLE_ENDIAN__ + lbz %r3, RETVAL+0(%r1) +# else + lbz %r3, RETVAL+7(%r1) +# endif + extsb %r3,%r3 + mtlr %r0 + b .Lfinish +# case FFI_TYPE_UINT16 +# ifdef __LITTLE_ENDIAN__ + lhz %r3, RETVAL+0(%r1) +# else + lhz %r3, RETVAL+6(%r1) +# endif + mtlr %r0 +.Lfinish: + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_SINT16 +# ifdef __LITTLE_ENDIAN__ + lha %r3, RETVAL+0(%r1) +# else + lha %r3, RETVAL+6(%r1) +# endif + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_UINT32 +# ifdef __LITTLE_ENDIAN__ + lwz %r3, RETVAL+0(%r1) +# else + lwz %r3, RETVAL+4(%r1) +# endif + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_SINT32 +# ifdef __LITTLE_ENDIAN__ + lwa %r3, RETVAL+0(%r1) +# else + lwa %r3, RETVAL+4(%r1) +# endif + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_UINT64 + ld %r3, RETVAL+0(%r1) + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_SINT64 + ld %r3, RETVAL+0(%r1) + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_TYPE_STRUCT + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME + nop +# case FFI_TYPE_POINTER + ld %r3, RETVAL+0(%r1) + mtlr %r0 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +# case FFI_V2_TYPE_VECTOR + addi %r3, %r1, RETVAL + lvx %v2, 0, %r3 + mtlr %r0 + b .Lfinish +# case FFI_V2_TYPE_VECTOR_HOMOG + addi %r3, %r1, RETVAL + lvx %v2, 0, %r3 + addi %r3, %r3, 16 + b .Lmorevector +# case FFI_V2_TYPE_FLOAT_HOMOG + lfs %f1, RETVAL+0(%r1) + lfs %f2, RETVAL+4(%r1) + lfs %f3, RETVAL+8(%r1) + b .Lmorefloat +# case FFI_V2_TYPE_DOUBLE_HOMOG + lfd %f1, RETVAL+0(%r1) + lfd %f2, RETVAL+8(%r1) + lfd %f3, RETVAL+16(%r1) + lfd %f4, RETVAL+24(%r1) + mtlr %r0 + lfd %f5, RETVAL+32(%r1) + lfd %f6, RETVAL+40(%r1) + lfd %f7, RETVAL+48(%r1) + lfd %f8, RETVAL+56(%r1) + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +.Lmorevector: + lvx %v3, 0, %r3 + addi %r3, %r3, 16 + lvx %v4, 0, %r3 + addi %r3, %r3, 16 + lvx %v5, 0, %r3 + mtlr %r0 + addi %r3, %r3, 16 + lvx %v6, 0, %r3 + addi %r3, %r3, 16 + lvx %v7, 0, %r3 + addi %r3, %r3, 16 + lvx %v8, 0, %r3 + addi %r3, %r3, 16 + lvx %v9, 0, %r3 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +.Lmorefloat: + lfs %f4, RETVAL+12(%r1) + mtlr %r0 + lfs %f5, RETVAL+16(%r1) + lfs %f6, RETVAL+20(%r1) + lfs %f7, RETVAL+24(%r1) + lfs %f8, RETVAL+28(%r1) + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +.Lsmall: +# ifdef __LITTLE_ENDIAN__ + ld %r3,RETVAL+0(%r1) + mtlr %r0 + ld %r4,RETVAL+8(%r1) + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr +# else + # A struct smaller than a dword is returned in the low bits of r3 + # ie. right justified. Larger structs are passed left justified + # in r3 and r4. The return value area on the stack will have + # the structs as they are usually stored in memory. + cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT + 7 # size 8 bytes? + neg %r5, %r3 + ld %r3,RETVAL+0(%r1) + blt .Lsmalldown + mtlr %r0 + ld %r4,RETVAL+8(%r1) + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset STACKFRAME +.Lsmalldown: + addi %r5, %r5, FFI_V2_TYPE_SMALL_STRUCT + 7 + mtlr %r0 + sldi %r5, %r5, 3 + addi %r1, %r1, STACKFRAME + .cfi_def_cfa_offset 0 + srd %r3, %r3, %r5 + blr +# endif + + .cfi_endproc +# if _CALL_ELF == 2 + .size ffi_closure_LINUX64,.-ffi_closure_LINUX64 +# else +# ifdef _CALL_LINUX + .size ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64 +# else + .long 0 + .byte 0,12,0,1,128,0,0,0 + .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64 +# endif +# endif + + + FFI_HIDDEN (ffi_go_closure_linux64) + .globl ffi_go_closure_linux64 + .text + .cfi_startproc +# if _CALL_ELF == 2 +ffi_go_closure_linux64: +# ifndef __PCREL__ + addis %r2, %r12, .TOC.-ffi_go_closure_linux64@ha + addi %r2, %r2, .TOC.-ffi_go_closure_linux64@l +# endif + .localentry ffi_go_closure_linux64, . - ffi_go_closure_linux64 +# else + .section ".opd","aw" + .align 3 +ffi_go_closure_linux64: +# ifdef _CALL_LINUX + .quad .L.ffi_go_closure_linux64,.TOC.@tocbase,0 + .type ffi_go_closure_linux64,@function + .text +.L.ffi_go_closure_linux64: +# else + FFI_HIDDEN (.ffi_go_closure_linux64) + .globl .ffi_go_closure_linux64 + .quad .ffi_go_closure_linux64,.TOC.@tocbase,0 + .size ffi_go_closure_linux64,24 + .type .ffi_go_closure_linux64,@function + .text +.ffi_go_closure_linux64: +# endif +# endif + +# if _CALL_ELF == 2 + ld %r12, 8(%r11) # closure->cif + mflr %r0 + lwz %r12, 28(%r12) # cif->flags + mtcrf 0x40, %r12 + addi %r12, %r1, PARMSAVE + bt 7, 0f + # Our caller has not allocated a parameter save area. + # We need to allocate one here and use it to pass gprs to + # ffi_closure_helper_LINUX64. + addi %r12, %r1, -STACKFRAME+PARMSAVE +0: + # Save general regs into parm save area + std %r3, 0(%r12) + std %r4, 8(%r12) + std %r5, 16(%r12) + std %r6, 24(%r12) + std %r7, 32(%r12) + std %r8, 40(%r12) + std %r9, 48(%r12) + std %r10, 56(%r12) + + # load up the pointer to the parm save area + mr %r7, %r12 +# else + mflr %r0 + # Save general regs into parm save area + # This is the parameter save area set up by our caller. + std %r3, PARMSAVE+0(%r1) + std %r4, PARMSAVE+8(%r1) + std %r5, PARMSAVE+16(%r1) + std %r6, PARMSAVE+24(%r1) + std %r7, PARMSAVE+32(%r1) + std %r8, PARMSAVE+40(%r1) + std %r9, PARMSAVE+48(%r1) + std %r10, PARMSAVE+56(%r1) + + # load up the pointer to the parm save area + addi %r7, %r1, PARMSAVE +# endif + std %r0, 16(%r1) + + # closure->cif + ld %r3, 8(%r11) + # closure->fun + ld %r4, 16(%r11) + # user_data + mr %r5, %r11 + b .Ldoclosure + + .cfi_endproc +# if _CALL_ELF == 2 + .size ffi_go_closure_linux64,.-ffi_go_closure_linux64 +# else +# ifdef _CALL_LINUX + .size ffi_go_closure_linux64,.-.L.ffi_go_closure_linux64 +# else + .long 0 + .byte 0,12,0,1,128,0,0,0 + .size .ffi_go_closure_linux64,.-.ffi_go_closure_linux64 +# endif +# endif +#endif + +#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2 + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ppc_closure.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ppc_closure.S new file mode 100644 index 000000000000..b6d209de8635 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/ppc_closure.S @@ -0,0 +1,397 @@ +/* ----------------------------------------------------------------------- + sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com> + Copyright (c) 2008 Red Hat, Inc. + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <powerpc/asm.h> + + .file "ppc_closure.S" + +#ifndef POWERPC64 + +FFI_HIDDEN(ffi_closure_SYSV) +ENTRY(ffi_closure_SYSV) + .cfi_startproc + stwu %r1,-144(%r1) + .cfi_def_cfa_offset 144 + mflr %r0 + stw %r0,148(%r1) + .cfi_offset 65, 4 + +# we want to build up an areas for the parameters passed +# in registers (both floating point and integer) + + # so first save gpr 3 to gpr 10 (aligned to 4) + stw %r3, 16(%r1) + stw %r4, 20(%r1) + stw %r5, 24(%r1) + + # set up registers for the routine that does the work + + # closure->cif + lwz %r3,FFI_TRAMPOLINE_SIZE(%r11) + # closure->fun + lwz %r4,FFI_TRAMPOLINE_SIZE+4(%r11) + # closure->user_data + lwz %r5,FFI_TRAMPOLINE_SIZE+8(%r11) + +.Ldoclosure: + stw %r6, 28(%r1) + stw %r7, 32(%r1) + stw %r8, 36(%r1) + stw %r9, 40(%r1) + stw %r10,44(%r1) + +#ifndef __NO_FPRS__ + # next save fpr 1 to fpr 8 (aligned to 8) + stfd %f1, 48(%r1) + stfd %f2, 56(%r1) + stfd %f3, 64(%r1) + stfd %f4, 72(%r1) + stfd %f5, 80(%r1) + stfd %f6, 88(%r1) + stfd %f7, 96(%r1) + stfd %f8, 104(%r1) +#endif + + # pointer to the result storage + addi %r6,%r1,112 + + # pointer to the saved gpr registers + addi %r7,%r1,16 + + # pointer to the saved fpr registers + addi %r8,%r1,48 + + # pointer to the outgoing parameter save area in the previous frame + # i.e. the previous frame pointer + 8 + addi %r9,%r1,152 + + # make the call + bl ffi_closure_helper_SYSV@local +.Lret: + # now r3 contains the return type + # so use it to look up in a table + # so we know how to deal with each type + + # look up the proper starting point in table + # by using return type as offset + + mflr %r4 # move address of .Lret to r4 + slwi %r3,%r3,4 # now multiply return type by 16 + addi %r4, %r4, .Lret_type0 - .Lret + lwz %r0,148(%r1) + add %r3,%r3,%r4 # add contents of table to table address + mtctr %r3 + bctr # jump to it + +# Each of the ret_typeX code fragments has to be exactly 16 bytes long +# (4 instructions). For cache effectiveness we align to a 16 byte boundary +# first. + .align 4 +# case FFI_TYPE_VOID +.Lret_type0: + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + nop + +# case FFI_TYPE_INT + lwz %r3,112+0(%r1) + mtlr %r0 +.Lfinish: + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_TYPE_FLOAT +#ifndef __NO_FPRS__ + lfs %f1,112+0(%r1) +#else + nop +#endif + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_TYPE_DOUBLE +#ifndef __NO_FPRS__ + lfd %f1,112+0(%r1) +#else + nop +#endif + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_TYPE_LONGDOUBLE +#ifndef __NO_FPRS__ + lfd %f1,112+0(%r1) + lfd %f2,112+8(%r1) + mtlr %r0 + b .Lfinish +#else + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + nop +#endif + +# case FFI_TYPE_UINT8 +#ifdef __LITTLE_ENDIAN__ + lbz %r3,112+0(%r1) +#else + lbz %r3,112+3(%r1) +#endif + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_TYPE_SINT8 +#ifdef __LITTLE_ENDIAN__ + lbz %r3,112+0(%r1) +#else + lbz %r3,112+3(%r1) +#endif + extsb %r3,%r3 + mtlr %r0 + b .Lfinish + +# case FFI_TYPE_UINT16 +#ifdef __LITTLE_ENDIAN__ + lhz %r3,112+0(%r1) +#else + lhz %r3,112+2(%r1) +#endif + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_TYPE_SINT16 +#ifdef __LITTLE_ENDIAN__ + lha %r3,112+0(%r1) +#else + lha %r3,112+2(%r1) +#endif + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_TYPE_UINT32 + lwz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_TYPE_SINT32 + lwz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_TYPE_UINT64 + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + mtlr %r0 + b .Lfinish + +# case FFI_TYPE_SINT64 + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + mtlr %r0 + b .Lfinish + +# case FFI_TYPE_STRUCT + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + nop + +# case FFI_TYPE_POINTER + lwz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_TYPE_UINT128 + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + lwz %r5,112+8(%r1) + b .Luint128 + +# The return types below are only used when the ABI type is FFI_SYSV. +# case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct. + lbz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct. + lhz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. + lwz %r3,112+0(%r1) +#ifdef __LITTLE_ENDIAN__ + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 +#else + srwi %r3,%r3,8 + mtlr %r0 + b .Lfinish +#endif + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. + lwz %r3,112+0(%r1) + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) +#ifdef __LITTLE_ENDIAN__ + mtlr %r0 + b .Lfinish +#else + li %r5,24 + b .Lstruct567 +#endif + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct. + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) +#ifdef __LITTLE_ENDIAN__ + mtlr %r0 + b .Lfinish +#else + li %r5,16 + b .Lstruct567 +#endif + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct. + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) +#ifdef __LITTLE_ENDIAN__ + mtlr %r0 + b .Lfinish +#else + li %r5,8 + b .Lstruct567 +#endif + +# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. + lwz %r3,112+0(%r1) + lwz %r4,112+4(%r1) + mtlr %r0 + b .Lfinish + +#ifndef __LITTLE_ENDIAN__ +.Lstruct567: + subfic %r6,%r5,32 + srw %r4,%r4,%r5 + slw %r6,%r3,%r6 + srw %r3,%r3,%r5 + or %r4,%r6,%r4 + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_def_cfa_offset 144 +#endif + +.Luint128: + lwz %r6,112+12(%r1) + mtlr %r0 + addi %r1,%r1,144 + .cfi_def_cfa_offset 0 + blr + .cfi_endproc +END(ffi_closure_SYSV) + + +FFI_HIDDEN(ffi_go_closure_sysv) +ENTRY(ffi_go_closure_sysv) + .cfi_startproc + stwu %r1,-144(%r1) + .cfi_def_cfa_offset 144 + mflr %r0 + stw %r0,148(%r1) + .cfi_offset 65, 4 + + stw %r3, 16(%r1) + stw %r4, 20(%r1) + stw %r5, 24(%r1) + + # closure->cif + lwz %r3,4(%r11) + # closure->fun + lwz %r4,8(%r11) + # user_data + mr %r5,%r11 + b .Ldoclosure + .cfi_endproc +END(ffi_go_closure_sysv) + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/sysv.S new file mode 100644 index 000000000000..df9773427cba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/powerpc/sysv.S @@ -0,0 +1,173 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 1998 Geoffrey Keating + Copyright (C) 2007 Free Software Foundation, Inc + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <powerpc/asm.h> + +#ifndef POWERPC64 +FFI_HIDDEN(ffi_call_SYSV) +ENTRY(ffi_call_SYSV) + .cfi_startproc + /* Save the old stack pointer as AP. */ + mr %r10,%r1 + .cfi_def_cfa_register 10 + + /* Allocate the stack space we need. */ + stwux %r1,%r1,%r8 + /* Save registers we use. */ + mflr %r9 + stw %r28,-16(%r10) + stw %r29,-12(%r10) + stw %r30, -8(%r10) + stw %r31, -4(%r10) + stw %r9, 4(%r10) + .cfi_offset 65, 4 + .cfi_offset 31, -4 + .cfi_offset 30, -8 + .cfi_offset 29, -12 + .cfi_offset 28, -16 + + /* Save arguments over call... */ + stw %r7, -20(%r10) /* closure, */ + mr %r31,%r6 /* flags, */ + mr %r30,%r5 /* rvalue, */ + mr %r29,%r4 /* function address, */ + mr %r28,%r10 /* our AP. */ + .cfi_def_cfa_register 28 + + /* Call ffi_prep_args_SYSV. */ + mr %r4,%r1 + bl ffi_prep_args_SYSV@local + + /* Now do the call. */ + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,%r31 + /* Get the address to call into CTR. */ + mtctr %r29 + /* Load all those argument registers. */ + lwz %r3,-24-(8*4)(%r28) + lwz %r4,-24-(7*4)(%r28) + lwz %r5,-24-(6*4)(%r28) + lwz %r6,-24-(5*4)(%r28) + bf- 5,1f + nop + lwz %r7,-24-(4*4)(%r28) + lwz %r8,-24-(3*4)(%r28) + lwz %r9,-24-(2*4)(%r28) + lwz %r10,-24-(1*4)(%r28) + nop +1: + +#ifndef __NO_FPRS__ + /* Load all the FP registers. */ + bf- 6,2f + lfd %f1,-24-(8*4)-(8*8)(%r28) + lfd %f2,-24-(8*4)-(7*8)(%r28) + lfd %f3,-24-(8*4)-(6*8)(%r28) + lfd %f4,-24-(8*4)-(5*8)(%r28) + nop + lfd %f5,-24-(8*4)-(4*8)(%r28) + lfd %f6,-24-(8*4)-(3*8)(%r28) + lfd %f7,-24-(8*4)-(2*8)(%r28) + lfd %f8,-24-(8*4)-(1*8)(%r28) +#endif +2: + + /* Make the call. */ + lwz %r11, -20(%r28) + bctrl + + /* Now, deal with the return value. */ + mtcrf 0x03,%r31 /* cr6-cr7 */ + bt- 31,L(small_struct_return_value) + bt- 30,L(done_return_value) +#ifndef __NO_FPRS__ + bt- 29,L(fp_return_value) +#endif + stw %r3,0(%r30) + bf+ 27,L(done_return_value) + stw %r4,4(%r30) + bf 26,L(done_return_value) + stw %r5,8(%r30) + stw %r6,12(%r30) + /* Fall through... */ + +L(done_return_value): + /* Restore the registers we used and return. */ + lwz %r9, 4(%r28) + lwz %r31, -4(%r28) + mtlr %r9 + lwz %r30, -8(%r28) + lwz %r29,-12(%r28) + lwz %r28,-16(%r28) + .cfi_remember_state + /* At this point we don't have a cfa register. Say all our + saved regs have been restored. */ + .cfi_same_value 65 + .cfi_same_value 31 + .cfi_same_value 30 + .cfi_same_value 29 + .cfi_same_value 28 + /* Hopefully this works.. */ + .cfi_def_cfa_register 1 + .cfi_offset 1, 0 + lwz %r1,0(%r1) + .cfi_same_value 1 + blr + +#ifndef __NO_FPRS__ +L(fp_return_value): + .cfi_restore_state + bf 27,L(float_return_value) + stfd %f1,0(%r30) + bf 26,L(done_return_value) + stfd %f2,8(%r30) + b L(done_return_value) +L(float_return_value): + stfs %f1,0(%r30) + b L(done_return_value) +#endif + +L(small_struct_return_value): + /* + * The C code always allocates a properly-aligned 8-byte bounce + * buffer to make this assembly code very simple. Just write out + * r3 and r4 to the buffer to allow the C code to handle the rest. + */ + stw %r3, 0(%r30) + stw %r4, 4(%r30) + b L(done_return_value) + .cfi_endproc + +END(ffi_call_SYSV) + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/prep_cif.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/prep_cif.c new file mode 100644 index 000000000000..1db3804b210d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/prep_cif.c @@ -0,0 +1,263 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 2011, 2012 Anthony Green + Copyright (c) 1996, 1998, 2007 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> +#include <stdlib.h> + +/* Round up to FFI_SIZEOF_ARG. */ + +#define STACK_ARG_SIZE(x) FFI_ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status initialize_aggregate(ffi_type *arg, size_t *offsets) +{ + ffi_type **ptr; + + if (UNLIKELY(arg == NULL || arg->elements == NULL)) + return FFI_BAD_TYPEDEF; + + arg->size = 0; + arg->alignment = 0; + + ptr = &(arg->elements[0]); + + if (UNLIKELY(ptr == 0)) + return FFI_BAD_TYPEDEF; + + while ((*ptr) != NULL) + { + if (UNLIKELY(((*ptr)->size == 0) + && (initialize_aggregate((*ptr), NULL) != FFI_OK))) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + + arg->size = FFI_ALIGN(arg->size, (*ptr)->alignment); + if (offsets) + *offsets++ = arg->size; + arg->size += (*ptr)->size; + + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = FFI_ALIGN (arg->size, arg->alignment); + + /* On some targets, the ABI defines that structures have an additional + alignment beyond the "natural" one based on their elements. */ +#ifdef FFI_AGGREGATE_ALIGNMENT + if (FFI_AGGREGATE_ALIGNMENT > arg->alignment) + arg->alignment = FFI_AGGREGATE_ALIGNMENT; +#endif + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + else + return FFI_OK; +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +/* For non variadic functions isvariadic should be 0 and + nfixedargs==ntotalargs. + + For variadic calls, isvariadic should be 1 and nfixedargs + and ntotalargs set as appropriate. nfixedargs must always be >=1 */ + + +ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi, + unsigned int isvariadic, + unsigned int nfixedargs, + unsigned int ntotalargs, + ffi_type *rtype, ffi_type **atypes) +{ + unsigned bytes = 0; + unsigned int i; + ffi_type **ptr; + + FFI_ASSERT(cif != NULL); + FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); + FFI_ASSERT(nfixedargs <= ntotalargs); + + if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) + return FFI_BAD_ABI; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = ntotalargs; + cif->rtype = rtype; + + cif->flags = 0; +#if (defined(_M_ARM64) || defined(__aarch64__)) && defined(_WIN32) + cif->is_variadic = isvariadic; +#endif +#if HAVE_LONG_DOUBLE_VARIANT + ffi_prep_types (abi); +#endif + + /* Initialize the return type if necessary */ + if ((cif->rtype->size == 0) + && (initialize_aggregate(cif->rtype, NULL) != FFI_OK)) + return FFI_BAD_TYPEDEF; + +#ifndef FFI_TARGET_HAS_COMPLEX_TYPE + if (rtype->type == FFI_TYPE_COMPLEX) + abort(); +#endif + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef TILE + && (cif->rtype->size > 10 * FFI_SIZEOF_ARG) +#endif +#ifdef XTENSA + && (cif->rtype->size > 16) +#endif +#ifdef NIOS2 + && (cif->rtype->size > 8) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) + && (initialize_aggregate((*ptr), NULL) != FFI_OK)) + return FFI_BAD_TYPEDEF; + +#ifndef FFI_TARGET_HAS_COMPLEX_TYPE + if ((*ptr)->type == FFI_TYPE_COMPLEX) + abort(); +#endif + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if !defined FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = (unsigned)FFI_ALIGN(bytes, (*ptr)->alignment); + +#ifdef TILE + if (bytes < 10 * FFI_SIZEOF_ARG && + bytes + STACK_ARG_SIZE((*ptr)->size) > 10 * FFI_SIZEOF_ARG) + { + /* An argument is never split between the 10 parameter + registers and the stack. */ + bytes = 10 * FFI_SIZEOF_ARG; + } +#endif +#ifdef XTENSA + if (bytes <= 6*4 && bytes + STACK_ARG_SIZE((*ptr)->size) > 6*4) + bytes = 6*4; +#endif + + bytes += (unsigned int)STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ +#ifdef FFI_TARGET_SPECIFIC_VARIADIC + if (isvariadic) + return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs); +#endif + + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, + ffi_type *rtype, ffi_type **atypes) +{ + return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes); +} + +ffi_status ffi_prep_cif_var(ffi_cif *cif, + ffi_abi abi, + unsigned int nfixedargs, + unsigned int ntotalargs, + ffi_type *rtype, + ffi_type **atypes) +{ + return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes); +} + +#if FFI_CLOSURES + +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + return ffi_prep_closure_loc (closure, cif, fun, user_data, closure); +} + +#endif + +ffi_status +ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets) +{ + if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) + return FFI_BAD_ABI; + if (struct_type->type != FFI_TYPE_STRUCT) + return FFI_BAD_TYPEDEF; + +#if HAVE_LONG_DOUBLE_VARIANT + ffi_prep_types (abi); +#endif + + return initialize_aggregate(struct_type, offsets); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/raw_api.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/raw_api.c new file mode 100644 index 000000000000..be156116cb0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/raw_api.c @@ -0,0 +1,267 @@ +/* ----------------------------------------------------------------------- + raw_api.c - Copyright (c) 1999, 2008 Red Hat, Inc. + + Author: Kresten Krab Thorup <krab@gnu.org> + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* This file defines generic functions for use with the raw api. */ + +#include <ffi.h> +#include <ffi_common.h> + +#if !FFI_NO_RAW_API + +size_t +ffi_raw_size (ffi_cif *cif) +{ + size_t result = 0; + int i; + + ffi_type **at = cif->arg_types; + + for (i = cif->nargs-1; i >= 0; i--, at++) + { +#if !FFI_NO_STRUCTS + if ((*at)->type == FFI_TYPE_STRUCT) + result += FFI_ALIGN (sizeof (void*), FFI_SIZEOF_ARG); + else +#endif + result += FFI_ALIGN ((*at)->size, FFI_SIZEOF_ARG); + } + + return result; +} + + +void +ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + +#if WORDS_BIGENDIAN + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 1); + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 2); + break; + +#if FFI_SIZEOF_ARG >= 4 + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 4); + break; +#endif + +#if !FFI_NO_STRUCTS + case FFI_TYPE_STRUCT: + *args = (raw++)->ptr; + break; +#endif + + case FFI_TYPE_COMPLEX: + *args = (raw++)->ptr; + break; + + case FFI_TYPE_POINTER: + *args = (void*) &(raw++)->ptr; + break; + + default: + *args = raw; + raw += FFI_ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + } + } + +#else /* WORDS_BIGENDIAN */ + +#if !PDP + + /* then assume little endian */ + for (i = 0; i < cif->nargs; i++, tp++, args++) + { +#if !FFI_NO_STRUCTS + if ((*tp)->type == FFI_TYPE_STRUCT) + { + *args = (raw++)->ptr; + } + else +#endif + if ((*tp)->type == FFI_TYPE_COMPLEX) + { + *args = (raw++)->ptr; + } + else + { + *args = (void*) raw; + raw += FFI_ALIGN ((*tp)->size, sizeof (void*)) / sizeof (void*); + } + } + +#else +#error "pdp endian not supported" +#endif /* ! PDP */ + +#endif /* WORDS_BIGENDIAN */ +} + +void +ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: + (raw++)->uint = *(UINT8*) (*args); + break; + + case FFI_TYPE_SINT8: + (raw++)->sint = *(SINT8*) (*args); + break; + + case FFI_TYPE_UINT16: + (raw++)->uint = *(UINT16*) (*args); + break; + + case FFI_TYPE_SINT16: + (raw++)->sint = *(SINT16*) (*args); + break; + +#if FFI_SIZEOF_ARG >= 4 + case FFI_TYPE_UINT32: + (raw++)->uint = *(UINT32*) (*args); + break; + + case FFI_TYPE_SINT32: + (raw++)->sint = *(SINT32*) (*args); + break; +#endif + +#if !FFI_NO_STRUCTS + case FFI_TYPE_STRUCT: + (raw++)->ptr = *args; + break; +#endif + + case FFI_TYPE_COMPLEX: + (raw++)->ptr = *args; + break; + + case FFI_TYPE_POINTER: + (raw++)->ptr = **(void***) args; + break; + + default: + memcpy ((void*) raw->data, (void*)*args, (*tp)->size); + raw += FFI_ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + } + } +} + +#if !FFI_NATIVE_RAW_API + + +/* This is a generic definition of ffi_raw_call, to be used if the + * native system does not provide a machine-specific implementation. + * Having this, allows code to be written for the raw API, without + * the need for system-specific code to handle input in that format; + * these following couple of functions will handle the translation forth + * and back automatically. */ + +void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *raw) +{ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + ffi_raw_to_ptrarray (cif, raw, avalue); + ffi_call (cif, fn, rvalue, avalue); +} + +#if FFI_CLOSURES /* base system provides closures */ + +static void +ffi_translate_args (ffi_cif *cif, void *rvalue, + void **avalue, void *user_data) +{ + ffi_raw *raw = (ffi_raw*)alloca (ffi_raw_size (cif)); + ffi_raw_closure *cl = (ffi_raw_closure*)user_data; + + ffi_ptrarray_to_raw (cif, avalue, raw); + (*cl->fun) (cif, rvalue, raw, cl->user_data); +} + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + ffi_status status; + + status = ffi_prep_closure_loc ((ffi_closure*) cl, + cif, + &ffi_translate_args, + codeloc, + codeloc); + if (status == FFI_OK) + { + cl->fun = fun; + cl->user_data = user_data; + } + + return status; +} + +#endif /* FFI_CLOSURES */ +#endif /* !FFI_NATIVE_RAW_API */ + +#if FFI_CLOSURES + +/* Again, here is the generic version of ffi_prep_raw_closure, which + * will install an intermediate "hub" for translation of arguments from + * the pointer-array format, to the raw format */ + +ffi_status +ffi_prep_raw_closure (ffi_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data) +{ + return ffi_prep_raw_closure_loc (cl, cif, fun, user_data, cl); +} + +#endif /* FFI_CLOSURES */ + +#endif /* !FFI_NO_RAW_API */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/riscv/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/riscv/ffi.c new file mode 100644 index 000000000000..c910858896ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/riscv/ffi.c @@ -0,0 +1,481 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2015 Michael Knyszek <mknyszek@berkeley.edu> + 2015 Andrew Waterman <waterman@cs.berkeley.edu> + 2018 Stef O'Rear <sorear2@gmail.com> + Based on MIPS N32/64 port + + RISC-V Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <stdint.h> + +#if __riscv_float_abi_double +#define ABI_FLEN 64 +#define ABI_FLOAT double +#elif __riscv_float_abi_single +#define ABI_FLEN 32 +#define ABI_FLOAT float +#endif + +#define NARGREG 8 +#define STKALIGN 16 +#define MAXCOPYARG (2 * sizeof(double)) + +typedef struct call_context +{ +#if ABI_FLEN + ABI_FLOAT fa[8]; +#endif + size_t a[8]; + /* used by the assembly code to in-place construct its own stack frame */ + char frame[16]; +} call_context; + +typedef struct call_builder +{ + call_context *aregs; + int used_integer; + int used_float; + size_t *used_stack; +} call_builder; + +/* integer (not pointer) less than ABI XLEN */ +/* FFI_TYPE_INT does not appear to be used */ +#if __SIZEOF_POINTER__ == 8 +#define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT64) +#else +#define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT32) +#endif + +#if ABI_FLEN +typedef struct { + char as_elements, type1, offset2, type2; +} float_struct_info; + +#if ABI_FLEN >= 64 +#define IS_FLOAT(type) ((type) >= FFI_TYPE_FLOAT && (type) <= FFI_TYPE_DOUBLE) +#else +#define IS_FLOAT(type) ((type) == FFI_TYPE_FLOAT) +#endif + +static ffi_type **flatten_struct(ffi_type *in, ffi_type **out, ffi_type **out_end) { + int i; + if (out == out_end) return out; + if (in->type != FFI_TYPE_STRUCT) { + *(out++) = in; + } else { + for (i = 0; in->elements[i]; i++) + out = flatten_struct(in->elements[i], out, out_end); + } + return out; +} + +/* Structs with at most two fields after flattening, one of which is of + floating point type, are passed in multiple registers if sufficient + registers are available. */ +static float_struct_info struct_passed_as_elements(call_builder *cb, ffi_type *top) { + float_struct_info ret = {0, 0, 0, 0}; + ffi_type *fields[3]; + int num_floats, num_ints; + int num_fields = flatten_struct(top, fields, fields + 3) - fields; + + if (num_fields == 1) { + if (IS_FLOAT(fields[0]->type)) { + ret.as_elements = 1; + ret.type1 = fields[0]->type; + } + } else if (num_fields == 2) { + num_floats = IS_FLOAT(fields[0]->type) + IS_FLOAT(fields[1]->type); + num_ints = IS_INT(fields[0]->type) + IS_INT(fields[1]->type); + if (num_floats == 0 || num_floats + num_ints != 2) + return ret; + if (cb->used_float + num_floats > NARGREG || cb->used_integer + (2 - num_floats) > NARGREG) + return ret; + if (!IS_FLOAT(fields[0]->type) && !IS_FLOAT(fields[1]->type)) + return ret; + + ret.type1 = fields[0]->type; + ret.type2 = fields[1]->type; + ret.offset2 = FFI_ALIGN(fields[0]->size, fields[1]->alignment); + ret.as_elements = 1; + } + + return ret; +} +#endif + +/* allocates a single register, float register, or XLEN-sized stack slot to a datum */ +static void marshal_atom(call_builder *cb, int type, void *data) { + size_t value = 0; + switch (type) { + case FFI_TYPE_UINT8: value = *(uint8_t *)data; break; + case FFI_TYPE_SINT8: value = *(int8_t *)data; break; + case FFI_TYPE_UINT16: value = *(uint16_t *)data; break; + case FFI_TYPE_SINT16: value = *(int16_t *)data; break; + /* 32-bit quantities are always sign-extended in the ABI */ + case FFI_TYPE_UINT32: value = *(int32_t *)data; break; + case FFI_TYPE_SINT32: value = *(int32_t *)data; break; +#if __SIZEOF_POINTER__ == 8 + case FFI_TYPE_UINT64: value = *(uint64_t *)data; break; + case FFI_TYPE_SINT64: value = *(int64_t *)data; break; +#endif + case FFI_TYPE_POINTER: value = *(size_t *)data; break; + + /* float values may be recoded in an implementation-defined way + by hardware conforming to 2.1 or earlier, so use asm to + reinterpret floats as doubles */ +#if ABI_FLEN >= 32 + case FFI_TYPE_FLOAT: + asm("" : "=f"(cb->aregs->fa[cb->used_float++]) : "0"(*(float *)data)); + return; +#endif +#if ABI_FLEN >= 64 + case FFI_TYPE_DOUBLE: + asm("" : "=f"(cb->aregs->fa[cb->used_float++]) : "0"(*(double *)data)); + return; +#endif + default: FFI_ASSERT(0); break; + } + + if (cb->used_integer == NARGREG) { + *cb->used_stack++ = value; + } else { + cb->aregs->a[cb->used_integer++] = value; + } +} + +static void unmarshal_atom(call_builder *cb, int type, void *data) { + size_t value; + switch (type) { +#if ABI_FLEN >= 32 + case FFI_TYPE_FLOAT: + asm("" : "=f"(*(float *)data) : "0"(cb->aregs->fa[cb->used_float++])); + return; +#endif +#if ABI_FLEN >= 64 + case FFI_TYPE_DOUBLE: + asm("" : "=f"(*(double *)data) : "0"(cb->aregs->fa[cb->used_float++])); + return; +#endif + } + + if (cb->used_integer == NARGREG) { + value = *cb->used_stack++; + } else { + value = cb->aregs->a[cb->used_integer++]; + } + + switch (type) { + case FFI_TYPE_UINT8: *(uint8_t *)data = value; break; + case FFI_TYPE_SINT8: *(uint8_t *)data = value; break; + case FFI_TYPE_UINT16: *(uint16_t *)data = value; break; + case FFI_TYPE_SINT16: *(uint16_t *)data = value; break; + case FFI_TYPE_UINT32: *(uint32_t *)data = value; break; + case FFI_TYPE_SINT32: *(uint32_t *)data = value; break; +#if __SIZEOF_POINTER__ == 8 + case FFI_TYPE_UINT64: *(uint64_t *)data = value; break; + case FFI_TYPE_SINT64: *(uint64_t *)data = value; break; +#endif + case FFI_TYPE_POINTER: *(size_t *)data = value; break; + default: FFI_ASSERT(0); break; + } +} + +/* adds an argument to a call, or a not by reference return value */ +static void marshal(call_builder *cb, ffi_type *type, int var, void *data) { + size_t realign[2]; + +#if ABI_FLEN + if (!var && type->type == FFI_TYPE_STRUCT) { + float_struct_info fsi = struct_passed_as_elements(cb, type); + if (fsi.as_elements) { + marshal_atom(cb, fsi.type1, data); + if (fsi.offset2) + marshal_atom(cb, fsi.type2, ((char*)data) + fsi.offset2); + return; + } + } + + if (!var && cb->used_float < NARGREG && IS_FLOAT(type->type)) { + marshal_atom(cb, type->type, data); + return; + } +#endif + + if (type->size > 2 * __SIZEOF_POINTER__) { + /* pass by reference */ + marshal_atom(cb, FFI_TYPE_POINTER, &data); + } else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) { + marshal_atom(cb, type->type, data); + } else { + /* overlong integers, soft-float floats, and structs without special + float handling are treated identically from this point on */ + + /* variadics are aligned even in registers */ + if (type->alignment > __SIZEOF_POINTER__) { + if (var) + cb->used_integer = FFI_ALIGN(cb->used_integer, 2); + cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); + } + + memcpy(realign, data, type->size); + if (type->size > 0) + marshal_atom(cb, FFI_TYPE_POINTER, realign); + if (type->size > __SIZEOF_POINTER__) + marshal_atom(cb, FFI_TYPE_POINTER, realign + 1); + } +} + +/* for arguments passed by reference returns the pointer, otherwise the arg is copied (up to MAXCOPYARG bytes) */ +static void *unmarshal(call_builder *cb, ffi_type *type, int var, void *data) { + size_t realign[2]; + void *pointer; + +#if ABI_FLEN + if (!var && type->type == FFI_TYPE_STRUCT) { + float_struct_info fsi = struct_passed_as_elements(cb, type); + if (fsi.as_elements) { + unmarshal_atom(cb, fsi.type1, data); + if (fsi.offset2) + unmarshal_atom(cb, fsi.type2, ((char*)data) + fsi.offset2); + return data; + } + } + + if (!var && cb->used_float < NARGREG && IS_FLOAT(type->type)) { + unmarshal_atom(cb, type->type, data); + return data; + } +#endif + + if (type->size > 2 * __SIZEOF_POINTER__) { + /* pass by reference */ + unmarshal_atom(cb, FFI_TYPE_POINTER, (char*)&pointer); + return pointer; + } else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) { + unmarshal_atom(cb, type->type, data); + return data; + } else { + /* overlong integers, soft-float floats, and structs without special + float handling are treated identically from this point on */ + + /* variadics are aligned even in registers */ + if (type->alignment > __SIZEOF_POINTER__) { + if (var) + cb->used_integer = FFI_ALIGN(cb->used_integer, 2); + cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); + } + + if (type->size > 0) + unmarshal_atom(cb, FFI_TYPE_POINTER, realign); + if (type->size > __SIZEOF_POINTER__) + unmarshal_atom(cb, FFI_TYPE_POINTER, realign + 1); + memcpy(data, realign, type->size); + return data; + } +} + +static int passed_by_ref(call_builder *cb, ffi_type *type, int var) { +#if ABI_FLEN + if (!var && type->type == FFI_TYPE_STRUCT) { + float_struct_info fsi = struct_passed_as_elements(cb, type); + if (fsi.as_elements) return 0; + } +#endif + + return type->size > 2 * __SIZEOF_POINTER__; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { + cif->riscv_nfixedargs = cif->nargs; + return FFI_OK; +} + +/* Perform machine dependent cif processing when we have a variadic function */ + +ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsigned int ntotalargs) { + cif->riscv_nfixedargs = nfixedargs; + return FFI_OK; +} + +/* Low level routine for calling functions */ +extern void ffi_call_asm (void *stack, struct call_context *regs, + void (*fn) (void), void *closure) FFI_HIDDEN; + +static void +ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, + void *closure) +{ + /* this is a conservative estimate, assuming a complex return value and + that all remaining arguments are long long / __int128 */ + size_t arg_bytes = cif->nargs <= 3 ? 0 : + FFI_ALIGN(2 * sizeof(size_t) * (cif->nargs - 3), STKALIGN); + size_t rval_bytes = 0; + if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__) + rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN); + size_t alloc_size = arg_bytes + rval_bytes + sizeof(call_context); + + /* the assembly code will deallocate all stack data at lower addresses + than the argument region, so we need to allocate the frame and the + return value after the arguments in a single allocation */ + size_t alloc_base; + /* Argument region must be 16-byte aligned */ + if (_Alignof(max_align_t) >= STKALIGN) { + /* since sizeof long double is normally 16, the compiler will + guarantee alloca alignment to at least that much */ + alloc_base = (size_t)alloca(alloc_size); + } else { + alloc_base = FFI_ALIGN(alloca(alloc_size + STKALIGN - 1), STKALIGN); + } + + if (rval_bytes) + rvalue = (void*)(alloc_base + arg_bytes); + + call_builder cb; + cb.used_float = cb.used_integer = 0; + cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes); + cb.used_stack = (void*)alloc_base; + + int return_by_ref = passed_by_ref(&cb, cif->rtype, 0); + if (return_by_ref) + marshal(&cb, &ffi_type_pointer, 0, &rvalue); + + int i; + for (i = 0; i < cif->nargs; i++) + marshal(&cb, cif->arg_types[i], i >= cif->riscv_nfixedargs, avalue[i]); + + ffi_call_asm ((void *) alloc_base, cb.aregs, fn, closure); + + cb.used_float = cb.used_integer = 0; + if (!return_by_ref && rvalue) + unmarshal(&cb, cif->rtype, 0, rvalue); +} + +void +ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) +{ + ffi_call_int(cif, fn, rvalue, avalue, NULL); +} + +void +ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int(cif, fn, rvalue, avalue, closure); +} + +extern void ffi_closure_asm(void) FFI_HIDDEN; + +ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) +{ + uint32_t *tramp = (uint32_t *) &closure->tramp[0]; + uint64_t fn = (uint64_t) (uintptr_t) ffi_closure_asm; + + if (cif->abi <= FFI_FIRST_ABI || cif->abi >= FFI_LAST_ABI) + return FFI_BAD_ABI; + + /* we will call ffi_closure_inner with codeloc, not closure, but as long + as the memory is readable it should work */ + + tramp[0] = 0x00000317; /* auipc t1, 0 (i.e. t0 <- codeloc) */ +#if __SIZEOF_POINTER__ == 8 + tramp[1] = 0x01033383; /* ld t2, 16(t1) */ +#else + tramp[1] = 0x01032383; /* lw t2, 16(t1) */ +#endif + tramp[2] = 0x00038067; /* jr t2 */ + tramp[3] = 0x00000013; /* nop */ + tramp[4] = fn; + tramp[5] = fn >> 32; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + __builtin___clear_cache(codeloc, codeloc + FFI_TRAMPOLINE_SIZE); + + return FFI_OK; +} + +extern void ffi_go_closure_asm (void) FFI_HIDDEN; + +ffi_status +ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *)) +{ + if (cif->abi <= FFI_FIRST_ABI || cif->abi >= FFI_LAST_ABI) + return FFI_BAD_ABI; + + closure->tramp = (void *) ffi_go_closure_asm; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} + +/* Called by the assembly code with aregs pointing to saved argument registers + and stack pointing to the stacked arguments. Return values passed in + registers will be reloaded from aregs. */ +void FFI_HIDDEN +ffi_closure_inner (ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + size_t *stack, call_context *aregs) +{ + void **avalue = alloca(cif->nargs * sizeof(void*)); + /* storage for arguments which will be copied by unmarshal(). We could + theoretically avoid the copies in many cases and use at most 128 bytes + of memory, but allocating disjoint storage for each argument is + simpler. */ + char *astorage = alloca(cif->nargs * MAXCOPYARG); + void *rvalue; + call_builder cb; + int return_by_ref; + int i; + + cb.aregs = aregs; + cb.used_integer = cb.used_float = 0; + cb.used_stack = stack; + + return_by_ref = passed_by_ref(&cb, cif->rtype, 0); + if (return_by_ref) + unmarshal(&cb, &ffi_type_pointer, 0, &rvalue); + else + rvalue = alloca(cif->rtype->size); + + for (i = 0; i < cif->nargs; i++) + avalue[i] = unmarshal(&cb, cif->arg_types[i], + i >= cif->riscv_nfixedargs, astorage + i*MAXCOPYARG); + + fun (cif, rvalue, avalue, user_data); + + if (!return_by_ref && cif->rtype->type != FFI_TYPE_VOID) { + cb.used_integer = cb.used_float = 0; + marshal(&cb, cif->rtype, 0, rvalue); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/riscv/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/riscv/ffitarget.h new file mode 100644 index 000000000000..75e6462f5bbc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/riscv/ffitarget.h @@ -0,0 +1,69 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - 2014 Michael Knyszek + + Target configuration macros for RISC-V. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef __riscv +#error "libffi was configured for a RISC-V target but this does not appear to be a RISC-V compiler." +#endif + +#ifndef LIBFFI_ASM + +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +/* FFI_UNUSED_NN and riscv_unused are to maintain ABI compatibility with a + distributed Berkeley patch from 2014, and can be removed at SONAME bump */ +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_UNUSED_1, + FFI_UNUSED_2, + FFI_UNUSED_3, + FFI_LAST_ABI, + + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; + +#endif /* LIBFFI_ASM */ + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_GO_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 24 +#define FFI_NATIVE_RAW_API 0 +#define FFI_EXTRA_CIF_FIELDS unsigned riscv_nfixedargs; unsigned riscv_unused; +#define FFI_TARGET_SPECIFIC_VARIADIC + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/riscv/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/riscv/sysv.S new file mode 100644 index 000000000000..522d0b005500 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/riscv/sysv.S @@ -0,0 +1,293 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2015 Michael Knyszek <mknyszek@berkeley.edu> + 2015 Andrew Waterman <waterman@cs.berkeley.edu> + 2018 Stef O'Rear <sorear2@gmail.com> + + RISC-V Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +/* Define aliases so that we can handle all ABIs uniformly */ + +#if __SIZEOF_POINTER__ == 8 +#define PTRS 8 +#define LARG ld +#define SARG sd +#else +#define PTRS 4 +#define LARG lw +#define SARG sw +#endif + +#if __riscv_float_abi_double +#define FLTS 8 +#define FLARG fld +#define FSARG fsd +#elif __riscv_float_abi_single +#define FLTS 4 +#define FLARG flw +#define FSARG fsw +#else +#define FLTS 0 +#endif + +#define fp s0 + + .text + .globl ffi_call_asm + .type ffi_call_asm, @function + .hidden ffi_call_asm +/* + struct call_context { + floatreg fa[8]; + intreg a[8]; + intreg pad[rv32 ? 2 : 0]; + intreg save_fp, save_ra; + } + void ffi_call_asm (size_t *stackargs, struct call_context *regargs, + void (*fn) (void), void *closure); +*/ + +#define FRAME_LEN (8 * FLTS + 8 * PTRS + 16) + +ffi_call_asm: + .cfi_startproc + + /* + We are NOT going to set up an ordinary stack frame. In order to pass + the stacked args to the called function, we adjust our stack pointer to + a0, which is in the _caller's_ alloca area. We establish our own stack + frame at the end of the call_context. + + Anything below the arguments will be freed at this point, although we + preserve the call_context so that it can be read back in the caller. + */ + + .cfi_def_cfa 11, FRAME_LEN # interim CFA based on a1 + SARG fp, FRAME_LEN - 2*PTRS(a1) + .cfi_offset 8, -2*PTRS + SARG ra, FRAME_LEN - 1*PTRS(a1) + .cfi_offset 1, -1*PTRS + + addi fp, a1, FRAME_LEN + mv sp, a0 + .cfi_def_cfa 8, 0 # our frame is fully set up + + # Load arguments + mv t1, a2 + mv t2, a3 + +#if FLTS + FLARG fa0, -FRAME_LEN+0*FLTS(fp) + FLARG fa1, -FRAME_LEN+1*FLTS(fp) + FLARG fa2, -FRAME_LEN+2*FLTS(fp) + FLARG fa3, -FRAME_LEN+3*FLTS(fp) + FLARG fa4, -FRAME_LEN+4*FLTS(fp) + FLARG fa5, -FRAME_LEN+5*FLTS(fp) + FLARG fa6, -FRAME_LEN+6*FLTS(fp) + FLARG fa7, -FRAME_LEN+7*FLTS(fp) +#endif + + LARG a0, -FRAME_LEN+8*FLTS+0*PTRS(fp) + LARG a1, -FRAME_LEN+8*FLTS+1*PTRS(fp) + LARG a2, -FRAME_LEN+8*FLTS+2*PTRS(fp) + LARG a3, -FRAME_LEN+8*FLTS+3*PTRS(fp) + LARG a4, -FRAME_LEN+8*FLTS+4*PTRS(fp) + LARG a5, -FRAME_LEN+8*FLTS+5*PTRS(fp) + LARG a6, -FRAME_LEN+8*FLTS+6*PTRS(fp) + LARG a7, -FRAME_LEN+8*FLTS+7*PTRS(fp) + + /* Call */ + jalr t1 + + /* Save return values - only a0/a1 (fa0/fa1) are used */ +#if FLTS + FSARG fa0, -FRAME_LEN+0*FLTS(fp) + FSARG fa1, -FRAME_LEN+1*FLTS(fp) +#endif + + SARG a0, -FRAME_LEN+8*FLTS+0*PTRS(fp) + SARG a1, -FRAME_LEN+8*FLTS+1*PTRS(fp) + + /* Restore and return */ + addi sp, fp, -FRAME_LEN + .cfi_def_cfa 2, FRAME_LEN + LARG ra, -1*PTRS(fp) + .cfi_restore 1 + LARG fp, -2*PTRS(fp) + .cfi_restore 8 + ret + .cfi_endproc + .size ffi_call_asm, .-ffi_call_asm + + +/* + ffi_closure_asm. Expects address of the passed-in ffi_closure in t1. + void ffi_closure_inner (ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + size_t *stackargs, struct call_context *regargs) +*/ + + .globl ffi_closure_asm + .hidden ffi_closure_asm + .type ffi_closure_asm, @function +ffi_closure_asm: + .cfi_startproc + + addi sp, sp, -FRAME_LEN + .cfi_def_cfa_offset FRAME_LEN + + /* make a frame */ + SARG fp, FRAME_LEN - 2*PTRS(sp) + .cfi_offset 8, -2*PTRS + SARG ra, FRAME_LEN - 1*PTRS(sp) + .cfi_offset 1, -1*PTRS + addi fp, sp, FRAME_LEN + + /* save arguments */ +#if FLTS + FSARG fa0, 0*FLTS(sp) + FSARG fa1, 1*FLTS(sp) + FSARG fa2, 2*FLTS(sp) + FSARG fa3, 3*FLTS(sp) + FSARG fa4, 4*FLTS(sp) + FSARG fa5, 5*FLTS(sp) + FSARG fa6, 6*FLTS(sp) + FSARG fa7, 7*FLTS(sp) +#endif + + SARG a0, 8*FLTS+0*PTRS(sp) + SARG a1, 8*FLTS+1*PTRS(sp) + SARG a2, 8*FLTS+2*PTRS(sp) + SARG a3, 8*FLTS+3*PTRS(sp) + SARG a4, 8*FLTS+4*PTRS(sp) + SARG a5, 8*FLTS+5*PTRS(sp) + SARG a6, 8*FLTS+6*PTRS(sp) + SARG a7, 8*FLTS+7*PTRS(sp) + + /* enter C */ + LARG a0, FFI_TRAMPOLINE_SIZE+0*PTRS(t1) + LARG a1, FFI_TRAMPOLINE_SIZE+1*PTRS(t1) + LARG a2, FFI_TRAMPOLINE_SIZE+2*PTRS(t1) + addi a3, sp, FRAME_LEN + mv a4, sp + + call ffi_closure_inner + + /* return values */ +#if FLTS + FLARG fa0, 0*FLTS(sp) + FLARG fa1, 1*FLTS(sp) +#endif + + LARG a0, 8*FLTS+0*PTRS(sp) + LARG a1, 8*FLTS+1*PTRS(sp) + + /* restore and return */ + LARG ra, FRAME_LEN-1*PTRS(sp) + .cfi_restore 1 + LARG fp, FRAME_LEN-2*PTRS(sp) + .cfi_restore 8 + addi sp, sp, FRAME_LEN + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size ffi_closure_asm, .-ffi_closure_asm + +/* + ffi_go_closure_asm. Expects address of the passed-in ffi_go_closure in t2. + void ffi_closure_inner (ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + size_t *stackargs, struct call_context *regargs) +*/ + + .globl ffi_go_closure_asm + .hidden ffi_go_closure_asm + .type ffi_go_closure_asm, @function +ffi_go_closure_asm: + .cfi_startproc + + addi sp, sp, -FRAME_LEN + .cfi_def_cfa_offset FRAME_LEN + + /* make a frame */ + SARG fp, FRAME_LEN - 2*PTRS(sp) + .cfi_offset 8, -2*PTRS + SARG ra, FRAME_LEN - 1*PTRS(sp) + .cfi_offset 1, -1*PTRS + addi fp, sp, FRAME_LEN + + /* save arguments */ +#if FLTS + FSARG fa0, 0*FLTS(sp) + FSARG fa1, 1*FLTS(sp) + FSARG fa2, 2*FLTS(sp) + FSARG fa3, 3*FLTS(sp) + FSARG fa4, 4*FLTS(sp) + FSARG fa5, 5*FLTS(sp) + FSARG fa6, 6*FLTS(sp) + FSARG fa7, 7*FLTS(sp) +#endif + + SARG a0, 8*FLTS+0*PTRS(sp) + SARG a1, 8*FLTS+1*PTRS(sp) + SARG a2, 8*FLTS+2*PTRS(sp) + SARG a3, 8*FLTS+3*PTRS(sp) + SARG a4, 8*FLTS+4*PTRS(sp) + SARG a5, 8*FLTS+5*PTRS(sp) + SARG a6, 8*FLTS+6*PTRS(sp) + SARG a7, 8*FLTS+7*PTRS(sp) + + /* enter C */ + LARG a0, 1*PTRS(t2) + LARG a1, 2*PTRS(t2) + mv a2, t2 + addi a3, sp, FRAME_LEN + mv a4, sp + + call ffi_closure_inner + + /* return values */ +#if FLTS + FLARG fa0, 0*FLTS(sp) + FLARG fa1, 1*FLTS(sp) +#endif + + LARG a0, 8*FLTS+0*PTRS(sp) + LARG a1, 8*FLTS+1*PTRS(sp) + + /* restore and return */ + LARG ra, FRAME_LEN-1*PTRS(sp) + .cfi_restore 1 + LARG fp, FRAME_LEN-2*PTRS(sp) + .cfi_restore 8 + addi sp, sp, FRAME_LEN + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size ffi_go_closure_asm, .-ffi_go_closure_asm diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/ffi.c new file mode 100644 index 000000000000..4035b6e366e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/ffi.c @@ -0,0 +1,756 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2000, 2007 Software AG + Copyright (c) 2008 Red Hat, Inc + + S390 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ +/*====================================================================*/ +/* Includes */ +/* -------- */ +/*====================================================================*/ + +#include <ffi.h> +#include <ffi_common.h> +#include <stdint.h> +#include "internal.h" + +/*====================== End of Includes =============================*/ + +/*====================================================================*/ +/* Defines */ +/* ------- */ +/*====================================================================*/ + +/* Maximum number of GPRs available for argument passing. */ +#define MAX_GPRARGS 5 + +/* Maximum number of FPRs available for argument passing. */ +#ifdef __s390x__ +#define MAX_FPRARGS 4 +#else +#define MAX_FPRARGS 2 +#endif + +/* Round to multiple of 16. */ +#define ROUND_SIZE(size) (((size) + 15) & ~15) + +/*===================== End of Defines ===============================*/ + +/*====================================================================*/ +/* Externals */ +/* --------- */ +/*====================================================================*/ + +struct call_frame +{ + void *back_chain; + void *eos; + unsigned long gpr_args[5]; + unsigned long gpr_save[9]; + unsigned long long fpr_args[4]; +}; + +extern void FFI_HIDDEN ffi_call_SYSV(struct call_frame *, unsigned, void *, + void (*fn)(void), void *); + +extern void ffi_closure_SYSV(void); +extern void ffi_go_closure_SYSV(void); + +/*====================== End of Externals ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_check_struct_type. */ +/* */ +/* Function - Determine if a structure can be passed within a */ +/* general purpose or floating point register. */ +/* */ +/*====================================================================*/ + +static int +ffi_check_struct_type (ffi_type *arg) +{ + size_t size = arg->size; + + /* If the struct has just one element, look at that element + to find out whether to consider the struct as floating point. */ + while (arg->type == FFI_TYPE_STRUCT + && arg->elements[0] && !arg->elements[1]) + arg = arg->elements[0]; + + /* Structs of size 1, 2, 4, and 8 are passed in registers, + just like the corresponding int/float types. */ + switch (size) + { + case 1: + return FFI_TYPE_UINT8; + + case 2: + return FFI_TYPE_UINT16; + + case 4: + if (arg->type == FFI_TYPE_FLOAT) + return FFI_TYPE_FLOAT; + else + return FFI_TYPE_UINT32; + + case 8: + if (arg->type == FFI_TYPE_DOUBLE) + return FFI_TYPE_DOUBLE; + else + return FFI_TYPE_UINT64; + + default: + break; + } + + /* Other structs are passed via a pointer to the data. */ + return FFI_TYPE_POINTER; +} + +/*======================== End of Routine ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_prep_cif_machdep. */ +/* */ +/* Function - Perform machine dependent CIF processing. */ +/* */ +/*====================================================================*/ + +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep(ffi_cif *cif) +{ + size_t struct_size = 0; + int n_gpr = 0; + int n_fpr = 0; + int n_ov = 0; + + ffi_type **ptr; + int i; + + /* Determine return value handling. */ + + switch (cif->rtype->type) + { + /* Void is easy. */ + case FFI_TYPE_VOID: + cif->flags = FFI390_RET_VOID; + break; + + /* Structures and complex are returned via a hidden pointer. */ + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + cif->flags = FFI390_RET_STRUCT; + n_gpr++; /* We need one GPR to pass the pointer. */ + break; + + /* Floating point values are returned in fpr 0. */ + case FFI_TYPE_FLOAT: + cif->flags = FFI390_RET_FLOAT; + break; + + case FFI_TYPE_DOUBLE: + cif->flags = FFI390_RET_DOUBLE; + break; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + cif->flags = FFI390_RET_STRUCT; + n_gpr++; + break; +#endif + /* Integer values are returned in gpr 2 (and gpr 3 + for 64-bit values on 31-bit machines). */ + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + cif->flags = FFI390_RET_INT64; + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + /* These are to be extended to word size. */ +#ifdef __s390x__ + cif->flags = FFI390_RET_INT64; +#else + cif->flags = FFI390_RET_INT32; +#endif + break; + + default: + FFI_ASSERT (0); + break; + } + + /* Now for the arguments. */ + + for (ptr = cif->arg_types, i = cif->nargs; + i > 0; + i--, ptr++) + { + int type = (*ptr)->type; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + /* 16-byte long double is passed like a struct. */ + if (type == FFI_TYPE_LONGDOUBLE) + type = FFI_TYPE_STRUCT; +#endif + + /* Check how a structure type is passed. */ + if (type == FFI_TYPE_STRUCT || type == FFI_TYPE_COMPLEX) + { + if (type == FFI_TYPE_COMPLEX) + type = FFI_TYPE_POINTER; + else + type = ffi_check_struct_type (*ptr); + + /* If we pass the struct via pointer, we must reserve space + to copy its data for proper call-by-value semantics. */ + if (type == FFI_TYPE_POINTER) + struct_size += ROUND_SIZE ((*ptr)->size); + } + + /* Now handle all primitive int/float data types. */ + switch (type) + { + /* The first MAX_FPRARGS floating point arguments + go in FPRs, the rest overflow to the stack. */ + + case FFI_TYPE_DOUBLE: + if (n_fpr < MAX_FPRARGS) + n_fpr++; + else + n_ov += sizeof (double) / sizeof (long); + break; + + case FFI_TYPE_FLOAT: + if (n_fpr < MAX_FPRARGS) + n_fpr++; + else + n_ov++; + break; + + /* On 31-bit machines, 64-bit integers are passed in GPR pairs, + if one is still available, or else on the stack. If only one + register is free, skip the register (it won't be used for any + subsequent argument either). */ + +#ifndef __s390x__ + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + if (n_gpr == MAX_GPRARGS-1) + n_gpr = MAX_GPRARGS; + if (n_gpr < MAX_GPRARGS) + n_gpr += 2; + else + n_ov += 2; + break; +#endif + + /* Everything else is passed in GPRs (until MAX_GPRARGS + have been used) or overflows to the stack. */ + + default: + if (n_gpr < MAX_GPRARGS) + n_gpr++; + else + n_ov++; + break; + } + } + + /* Total stack space as required for overflow arguments + and temporary structure copies. */ + + cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size; + + return FFI_OK; +} + +/*======================== End of Routine ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_call. */ +/* */ +/* Function - Call the FFI routine. */ +/* */ +/*====================================================================*/ + +static void +ffi_call_int(ffi_cif *cif, + void (*fn)(void), + void *rvalue, + void **avalue, + void *closure) +{ + int ret_type = cif->flags; + size_t rsize = 0, bytes = cif->bytes; + unsigned char *stack, *p_struct; + struct call_frame *frame; + unsigned long *p_ov, *p_gpr; + unsigned long long *p_fpr; + int n_fpr, n_gpr, n_ov, i, n; + ffi_type **arg_types; + + FFI_ASSERT (cif->abi == FFI_SYSV); + + /* If we don't have a return value, we need to fake one. */ + if (rvalue == NULL) + { + if (ret_type & FFI390_RET_IN_MEM) + rsize = cif->rtype->size; + else + ret_type = FFI390_RET_VOID; + } + + /* The stack space will be filled with those areas: + + dummy structure return (highest addresses) + FPR argument register save area + GPR argument register save area + stack frame for ffi_call_SYSV + temporary struct copies + overflow argument area (lowest addresses) + + We set up the following pointers: + + p_fpr: bottom of the FPR area (growing upwards) + p_gpr: bottom of the GPR area (growing upwards) + p_ov: bottom of the overflow area (growing upwards) + p_struct: top of the struct copy area (growing downwards) + + All areas are kept aligned to twice the word size. + + Note that we're going to create the stack frame for both + ffi_call_SYSV _and_ the target function right here. This + works because we don't make any function calls with more + than 5 arguments (indeed only memcpy and ffi_call_SYSV), + and thus we don't have any stacked outgoing parameters. */ + + stack = alloca (bytes + sizeof(struct call_frame) + rsize); + frame = (struct call_frame *)(stack + bytes); + if (rsize) + rvalue = frame + 1; + + /* Link the new frame back to the one from this function. */ + frame->back_chain = __builtin_frame_address (0); + + /* Fill in all of the argument stuff. */ + p_ov = (unsigned long *)stack; + p_struct = (unsigned char *)frame; + p_gpr = frame->gpr_args; + p_fpr = frame->fpr_args; + n_fpr = n_gpr = n_ov = 0; + + /* If we returning a structure then we set the first parameter register + to the address of where we are returning this structure. */ + if (cif->flags & FFI390_RET_IN_MEM) + p_gpr[n_gpr++] = (uintptr_t) rvalue; + + /* Now for the arguments. */ + arg_types = cif->arg_types; + for (i = 0, n = cif->nargs; i < n; ++i) + { + ffi_type *ty = arg_types[i]; + void *arg = avalue[i]; + int type = ty->type; + ffi_arg val; + + restart: + switch (type) + { + case FFI_TYPE_SINT8: + val = *(SINT8 *)arg; + goto do_int; + case FFI_TYPE_UINT8: + val = *(UINT8 *)arg; + goto do_int; + case FFI_TYPE_SINT16: + val = *(SINT16 *)arg; + goto do_int; + case FFI_TYPE_UINT16: + val = *(UINT16 *)arg; + goto do_int; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + val = *(SINT32 *)arg; + goto do_int; + case FFI_TYPE_UINT32: + val = *(UINT32 *)arg; + goto do_int; + case FFI_TYPE_POINTER: + val = *(uintptr_t *)arg; + do_int: + *(n_gpr < MAX_GPRARGS ? p_gpr + n_gpr++ : p_ov + n_ov++) = val; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef __s390x__ + val = *(UINT64 *)arg; + goto do_int; +#else + if (n_gpr == MAX_GPRARGS-1) + n_gpr = MAX_GPRARGS; + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = ((UINT32 *) arg)[0], + p_gpr[n_gpr++] = ((UINT32 *) arg)[1]; + else + p_ov[n_ov++] = ((UINT32 *) arg)[0], + p_ov[n_ov++] = ((UINT32 *) arg)[1]; +#endif + break; + + case FFI_TYPE_DOUBLE: + if (n_fpr < MAX_FPRARGS) + p_fpr[n_fpr++] = *(UINT64 *) arg; + else + { +#ifdef __s390x__ + p_ov[n_ov++] = *(UINT64 *) arg; +#else + p_ov[n_ov++] = ((UINT32 *) arg)[0], + p_ov[n_ov++] = ((UINT32 *) arg)[1]; +#endif + } + break; + + case FFI_TYPE_FLOAT: + val = *(UINT32 *)arg; + if (n_fpr < MAX_FPRARGS) + p_fpr[n_fpr++] = (UINT64)val << 32; + else + p_ov[n_ov++] = val; + break; + + case FFI_TYPE_STRUCT: + /* Check how a structure type is passed. */ + type = ffi_check_struct_type (ty); + /* Some structures are passed via a type they contain. */ + if (type != FFI_TYPE_POINTER) + goto restart; + /* ... otherwise, passed by reference. fallthru. */ + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + /* 16-byte long double is passed via reference. */ +#endif + case FFI_TYPE_COMPLEX: + /* Complex types are passed via reference. */ + p_struct -= ROUND_SIZE (ty->size); + memcpy (p_struct, arg, ty->size); + val = (uintptr_t)p_struct; + goto do_int; + + default: + FFI_ASSERT (0); + break; + } + } + + ffi_call_SYSV (frame, ret_type & FFI360_RET_MASK, rvalue, fn, closure); +} + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_call_int(cif, fn, rvalue, avalue, NULL); +} + +void +ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int(cif, fn, rvalue, avalue, closure); +} + +/*======================== End of Routine ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_closure_helper_SYSV. */ +/* */ +/* Function - Call a FFI closure target function. */ +/* */ +/*====================================================================*/ + +void FFI_HIDDEN +ffi_closure_helper_SYSV (ffi_cif *cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + unsigned long *p_gpr, + unsigned long long *p_fpr, + unsigned long *p_ov) +{ + unsigned long long ret_buffer; + + void *rvalue = &ret_buffer; + void **avalue; + void **p_arg; + + int n_gpr = 0; + int n_fpr = 0; + int n_ov = 0; + + ffi_type **ptr; + int i; + + /* Allocate buffer for argument list pointers. */ + p_arg = avalue = alloca (cif->nargs * sizeof (void *)); + + /* If we returning a structure, pass the structure address + directly to the target function. Otherwise, have the target + function store the return value to the GPR save area. */ + if (cif->flags & FFI390_RET_IN_MEM) + rvalue = (void *) p_gpr[n_gpr++]; + + /* Now for the arguments. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, p_arg++, ptr++) + { + int deref_struct_pointer = 0; + int type = (*ptr)->type; + +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + /* 16-byte long double is passed like a struct. */ + if (type == FFI_TYPE_LONGDOUBLE) + type = FFI_TYPE_STRUCT; +#endif + + /* Check how a structure type is passed. */ + if (type == FFI_TYPE_STRUCT || type == FFI_TYPE_COMPLEX) + { + if (type == FFI_TYPE_COMPLEX) + type = FFI_TYPE_POINTER; + else + type = ffi_check_struct_type (*ptr); + + /* If we pass the struct via pointer, remember to + retrieve the pointer later. */ + if (type == FFI_TYPE_POINTER) + deref_struct_pointer = 1; + } + + /* Pointers are passed like UINTs of the same size. */ + if (type == FFI_TYPE_POINTER) + { +#ifdef __s390x__ + type = FFI_TYPE_UINT64; +#else + type = FFI_TYPE_UINT32; +#endif + } + + /* Now handle all primitive int/float data types. */ + switch (type) + { + case FFI_TYPE_DOUBLE: + if (n_fpr < MAX_FPRARGS) + *p_arg = &p_fpr[n_fpr++]; + else + *p_arg = &p_ov[n_ov], + n_ov += sizeof (double) / sizeof (long); + break; + + case FFI_TYPE_FLOAT: + if (n_fpr < MAX_FPRARGS) + *p_arg = &p_fpr[n_fpr++]; + else + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef __s390x__ + if (n_gpr < MAX_GPRARGS) + *p_arg = &p_gpr[n_gpr++]; + else + *p_arg = &p_ov[n_ov++]; +#else + if (n_gpr == MAX_GPRARGS-1) + n_gpr = MAX_GPRARGS; + if (n_gpr < MAX_GPRARGS) + *p_arg = &p_gpr[n_gpr], n_gpr += 2; + else + *p_arg = &p_ov[n_ov], n_ov += 2; +#endif + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + if (n_gpr < MAX_GPRARGS) + *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4; + else + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + if (n_gpr < MAX_GPRARGS) + *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2; + else + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2; + break; + + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + if (n_gpr < MAX_GPRARGS) + *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1; + else + *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1; + break; + + default: + FFI_ASSERT (0); + break; + } + + /* If this is a struct passed via pointer, we need to + actually retrieve that pointer. */ + if (deref_struct_pointer) + *p_arg = *(void **)*p_arg; + } + + + /* Call the target function. */ + (fun) (cif, rvalue, avalue, user_data); + + /* Convert the return value. */ + switch (cif->rtype->type) + { + /* Void is easy, and so is struct. */ + case FFI_TYPE_VOID: + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: +#endif + break; + + /* Floating point values are returned in fpr 0. */ + case FFI_TYPE_FLOAT: + p_fpr[0] = (long long) *(unsigned int *) rvalue << 32; + break; + + case FFI_TYPE_DOUBLE: + p_fpr[0] = *(unsigned long long *) rvalue; + break; + + /* Integer values are returned in gpr 2 (and gpr 3 + for 64-bit values on 31-bit machines). */ + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +#ifdef __s390x__ + p_gpr[0] = *(unsigned long *) rvalue; +#else + p_gpr[0] = ((unsigned long *) rvalue)[0], + p_gpr[1] = ((unsigned long *) rvalue)[1]; +#endif + break; + + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT32: + case FFI_TYPE_UINT16: + case FFI_TYPE_UINT8: + p_gpr[0] = *(unsigned long *) rvalue; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_SINT16: + case FFI_TYPE_SINT8: + p_gpr[0] = *(signed long *) rvalue; + break; + + default: + FFI_ASSERT (0); + break; + } +} + +/*======================== End of Routine ============================*/ + +/*====================================================================*/ +/* */ +/* Name - ffi_prep_closure_loc. */ +/* */ +/* Function - Prepare a FFI closure. */ +/* */ +/*====================================================================*/ + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + void *codeloc) +{ + static unsigned short const template[] = { + 0x0d10, /* basr %r1,0 */ +#ifndef __s390x__ + 0x9801, 0x1006, /* lm %r0,%r1,6(%r1) */ +#else + 0xeb01, 0x100e, 0x0004, /* lmg %r0,%r1,14(%r1) */ +#endif + 0x07f1 /* br %r1 */ + }; + + unsigned long *tramp = (unsigned long *)&closure->tramp; + + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + memcpy (tramp, template, sizeof(template)); + tramp[2] = (unsigned long)codeloc; + tramp[3] = (unsigned long)&ffi_closure_SYSV; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +/*======================== End of Routine ============================*/ + +/* Build a Go language closure. */ + +ffi_status +ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, + void (*fun)(ffi_cif*,void*,void**,void*)) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + closure->tramp = ffi_go_closure_SYSV; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/ffitarget.h new file mode 100644 index 000000000000..d8a4ee4bf103 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/ffitarget.h @@ -0,0 +1,70 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for S390. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#if defined (__s390x__) +#ifndef S390X +#define S390X +#endif +#endif + +/* ---- System specific configurations ----------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION +#define FFI_TARGET_HAS_COMPLEX_TYPE + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_GO_CLOSURES 1 +#ifdef S390X +#define FFI_TRAMPOLINE_SIZE 32 +#else +#define FFI_TRAMPOLINE_SIZE 16 +#endif +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/internal.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/internal.h new file mode 100644 index 000000000000..b8755786f9e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/internal.h @@ -0,0 +1,11 @@ +/* If these values change, sysv.S must be adapted! */ +#define FFI390_RET_DOUBLE 0 +#define FFI390_RET_FLOAT 1 +#define FFI390_RET_INT64 2 +#define FFI390_RET_INT32 3 +#define FFI390_RET_VOID 4 + +#define FFI360_RET_MASK 7 +#define FFI390_RET_IN_MEM 8 + +#define FFI390_RET_STRUCT (FFI390_RET_VOID | FFI390_RET_IN_MEM) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/sysv.S new file mode 100644 index 000000000000..c4b5006aed07 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/s390/sysv.S @@ -0,0 +1,325 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2000 Software AG + Copyright (c) 2008 Red Hat, Inc. + + S390 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + .text + +#ifndef __s390x__ + + # r2: frame + # r3: ret_type + # r4: ret_addr + # r5: fun + # r6: closure + + # This assumes we are using gas. + .balign 8 + .globl ffi_call_SYSV + FFI_HIDDEN(ffi_call_SYSV) + .type ffi_call_SYSV,%function +ffi_call_SYSV: + .cfi_startproc + st %r6,44(%r2) # Save registers + stm %r12,%r14,48(%r2) + lr %r13,%r2 # Install frame pointer + .cfi_rel_offset r6, 44 + .cfi_rel_offset r12, 48 + .cfi_rel_offset r13, 52 + .cfi_rel_offset r14, 56 + .cfi_def_cfa_register r13 + st %r2,0(%r15) # Set up back chain + sla %r3,3 # ret_type *= 8 + lr %r12,%r4 # Save ret_addr + lr %r1,%r5 # Save fun + lr %r0,%r6 # Install static chain + + # Set return address, so that there is only one indirect jump. +#ifdef HAVE_AS_S390_ZARCH + larl %r14,.Ltable + ar %r14,%r3 +#else + basr %r14,0 +0: la %r14,.Ltable-0b(%r14,%r3) +#endif + + lm %r2,%r6,8(%r13) # Load arguments + ld %f0,64(%r13) + ld %f2,72(%r13) + br %r1 # ... and call function + + .balign 8 +.Ltable: +# FFI390_RET_DOUBLE + std %f0,0(%r12) + j .Ldone + + .balign 8 +# FFI390_RET_FLOAT + ste %f0,0(%r12) + j .Ldone + + .balign 8 +# FFI390_RET_INT64 + st %r3,4(%r12) + nop + # fallthru + + .balign 8 +# FFI390_RET_INT32 + st %r2,0(%r12) + nop + # fallthru + + .balign 8 +# FFI390_RET_VOID +.Ldone: + l %r14,56(%r13) + l %r12,48(%r13) + l %r6,44(%r13) + l %r13,52(%r13) + .cfi_restore 14 + .cfi_restore 13 + .cfi_restore 12 + .cfi_restore 6 + .cfi_def_cfa r15, 96 + br %r14 + .cfi_endproc + .size ffi_call_SYSV,.-ffi_call_SYSV + + + .balign 8 + .globl ffi_go_closure_SYSV + FFI_HIDDEN(ffi_go_closure_SYSV) + .type ffi_go_closure_SYSV,%function +ffi_go_closure_SYSV: + .cfi_startproc + stm %r2,%r6,8(%r15) # Save arguments + lr %r4,%r0 # Load closure -> user_data + l %r2,4(%r4) # ->cif + l %r3,8(%r4) # ->fun + j .Ldoclosure + .cfi_endproc + + .balign 8 + .globl ffi_closure_SYSV + FFI_HIDDEN(ffi_closure_SYSV) + .type ffi_closure_SYSV,%function +ffi_closure_SYSV: + .cfi_startproc + stm %r2,%r6,8(%r15) # Save arguments + lr %r4,%r0 # Closure + l %r2,16(%r4) # ->cif + l %r3,20(%r4) # ->fun + l %r4,24(%r4) # ->user_data +.Ldoclosure: + stm %r12,%r15,48(%r15) # Save registers + lr %r12,%r15 + .cfi_def_cfa_register r12 + .cfi_rel_offset r6, 24 + .cfi_rel_offset r12, 48 + .cfi_rel_offset r13, 52 + .cfi_rel_offset r14, 56 + .cfi_rel_offset r15, 60 +#ifndef HAVE_AS_S390_ZARCH + basr %r13,0 # Set up base register +.Lcbase: + l %r1,.Lchelper-.Lcbase(%r13) # Get helper function +#endif + ahi %r15,-96-8 # Set up stack frame + st %r12,0(%r15) # Set up back chain + + std %f0,64(%r12) # Save fp arguments + std %f2,72(%r12) + + la %r5,96(%r12) # Overflow + st %r5,96(%r15) + la %r6,64(%r12) # FPRs + la %r5,8(%r12) # GPRs +#ifdef HAVE_AS_S390_ZARCH + brasl %r14,ffi_closure_helper_SYSV +#else + bas %r14,0(%r1,%r13) # Call helper +#endif + + lr %r15,%r12 + .cfi_def_cfa_register r15 + lm %r12,%r14,48(%r12) # Restore saved registers + l %r6,24(%r15) + ld %f0,64(%r15) # Load return registers + lm %r2,%r3,8(%r15) + br %r14 + .cfi_endproc + +#ifndef HAVE_AS_S390_ZARCH + .align 4 +.Lchelper: + .long ffi_closure_helper_SYSV-.Lcbase +#endif + + .size ffi_closure_SYSV,.-ffi_closure_SYSV + +#else + + # r2: frame + # r3: ret_type + # r4: ret_addr + # r5: fun + # r6: closure + + # This assumes we are using gas. + .balign 8 + .globl ffi_call_SYSV + FFI_HIDDEN(ffi_call_SYSV) + .type ffi_call_SYSV,%function +ffi_call_SYSV: + .cfi_startproc + stg %r6,88(%r2) # Save registers + stmg %r12,%r14,96(%r2) + lgr %r13,%r2 # Install frame pointer + .cfi_rel_offset r6, 88 + .cfi_rel_offset r12, 96 + .cfi_rel_offset r13, 104 + .cfi_rel_offset r14, 112 + .cfi_def_cfa_register r13 + stg %r2,0(%r15) # Set up back chain + larl %r14,.Ltable # Set up return address + slag %r3,%r3,3 # ret_type *= 8 + lgr %r12,%r4 # Save ret_addr + lgr %r1,%r5 # Save fun + lgr %r0,%r6 # Install static chain + agr %r14,%r3 + lmg %r2,%r6,16(%r13) # Load arguments + ld %f0,128(%r13) + ld %f2,136(%r13) + ld %f4,144(%r13) + ld %f6,152(%r13) + br %r1 # ... and call function + + .balign 8 +.Ltable: +# FFI390_RET_DOUBLE + std %f0,0(%r12) + j .Ldone + + .balign 8 +# FFI390_RET_DOUBLE + ste %f0,0(%r12) + j .Ldone + + .balign 8 +# FFI390_RET_INT64 + stg %r2,0(%r12) + + .balign 8 +# FFI390_RET_INT32 + # Never used, as we always store type ffi_arg. + # But the stg above is 6 bytes and we cannot + # jump around this case, so fall through. + nop + nop + + .balign 8 +# FFI390_RET_VOID +.Ldone: + lg %r14,112(%r13) + lg %r12,96(%r13) + lg %r6,88(%r13) + lg %r13,104(%r13) + .cfi_restore r14 + .cfi_restore r13 + .cfi_restore r12 + .cfi_restore r6 + .cfi_def_cfa r15, 160 + br %r14 + .cfi_endproc + .size ffi_call_SYSV,.-ffi_call_SYSV + + + .balign 8 + .globl ffi_go_closure_SYSV + FFI_HIDDEN(ffi_go_closure_SYSV) + .type ffi_go_closure_SYSV,%function +ffi_go_closure_SYSV: + .cfi_startproc + stmg %r2,%r6,16(%r15) # Save arguments + lgr %r4,%r0 # Load closure -> user_data + lg %r2,8(%r4) # ->cif + lg %r3,16(%r4) # ->fun + j .Ldoclosure + .cfi_endproc + .size ffi_go_closure_SYSV,.-ffi_go_closure_SYSV + + + .balign 8 + .globl ffi_closure_SYSV + FFI_HIDDEN(ffi_closure_SYSV) + .type ffi_closure_SYSV,%function +ffi_closure_SYSV: + .cfi_startproc + stmg %r2,%r6,16(%r15) # Save arguments + lgr %r4,%r0 # Load closure + lg %r2,32(%r4) # ->cif + lg %r3,40(%r4) # ->fun + lg %r4,48(%r4) # ->user_data +.Ldoclosure: + stmg %r13,%r15,104(%r15) # Save registers + lgr %r13,%r15 + .cfi_def_cfa_register r13 + .cfi_rel_offset r6, 48 + .cfi_rel_offset r13, 104 + .cfi_rel_offset r14, 112 + .cfi_rel_offset r15, 120 + aghi %r15,-160-16 # Set up stack frame + stg %r13,0(%r15) # Set up back chain + + std %f0,128(%r13) # Save fp arguments + std %f2,136(%r13) + std %f4,144(%r13) + std %f6,152(%r13) + la %r5,160(%r13) # Overflow + stg %r5,160(%r15) + la %r6,128(%r13) # FPRs + la %r5,16(%r13) # GPRs + brasl %r14,ffi_closure_helper_SYSV # Call helper + + lgr %r15,%r13 + .cfi_def_cfa_register r15 + lmg %r13,%r14,104(%r13) # Restore saved registers + lg %r6,48(%r15) + ld %f0,128(%r15) # Load return registers + lg %r2,16(%r15) + br %r14 + .cfi_endproc + .size ffi_closure_SYSV,.-ffi_closure_SYSV +#endif /* !s390x */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh/ffi.c new file mode 100644 index 000000000000..9ec86bfb205c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh/ffi.c @@ -0,0 +1,717 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2002-2008, 2012 Kaz Kojima + Copyright (c) 2008 Red Hat, Inc. + + SuperH Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> + +#define NGREGARG 4 +#if defined(__SH4__) +#define NFREGARG 8 +#endif + +#if defined(__HITACHI__) +#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 +#else +#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 +#endif + +/* If the structure has essentially an unique element, return its type. */ +static int +simple_type (ffi_type *arg) +{ + if (arg->type != FFI_TYPE_STRUCT) + return arg->type; + else if (arg->elements[1]) + return FFI_TYPE_STRUCT; + + return simple_type (arg->elements[0]); +} + +static int +return_type (ffi_type *arg) +{ + unsigned short type; + + if (arg->type != FFI_TYPE_STRUCT) + return arg->type; + + type = simple_type (arg->elements[0]); + if (! arg->elements[1]) + { + switch (type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + return FFI_TYPE_INT; + + default: + return type; + } + } + + /* gcc uses r0/r1 pair for some kind of structures. */ + if (arg->size <= 2 * sizeof (int)) + { + int i = 0; + ffi_type *e; + + while ((e = arg->elements[i++])) + { + type = simple_type (e); + switch (type) + { + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_INT: + case FFI_TYPE_FLOAT: + return FFI_TYPE_UINT64; + + default: + break; + } + } + } + + return FFI_TYPE_STRUCT; +} + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register int tmp; + register unsigned int avn; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + int greg, ireg; +#if defined(__SH4__) + int freg = 0; +#endif + + tmp = 0; + argp = stack; + + if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += 4; + ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; + } + else + ireg = 0; + + /* Set arguments for registers. */ + greg = ireg; + avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + if (greg++ >= NGREGARG) + continue; + + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + argp += z; + } + else if (z == sizeof(int)) + { +#if defined(__SH4__) + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg++ >= NFREGARG) + continue; + } + else +#endif + { + if (greg++ >= NGREGARG) + continue; + } + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + argp += z; + } +#if defined(__SH4__) + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 >= NFREGARG) + continue; + freg = (freg + 1) & ~1; + freg += 2; + memcpy (argp, *p_argv, z); + argp += z; + } +#endif + else + { + int n = (z + sizeof (int) - 1) / sizeof (int); +#if defined(__SH4__) + if (greg + n - 1 >= NGREGARG) + continue; +#else + if (greg >= NGREGARG) + continue; +#endif + greg += n; + memcpy (argp, *p_argv, z); + argp += n * sizeof (int); + } + } + + /* Set arguments on stack. */ + greg = ireg; +#if defined(__SH4__) + freg = 0; +#endif + p_argv = ecif->avalue; + + for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + if (greg++ < NGREGARG) + continue; + + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); + break; + + case FFI_TYPE_STRUCT: + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + break; + + default: + FFI_ASSERT(0); + } + argp += z; + } + else if (z == sizeof(int)) + { +#if defined(__SH4__) + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg++ < NFREGARG) + continue; + } + else +#endif + { + if (greg++ < NGREGARG) + continue; + } + *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); + argp += z; + } +#if defined(__SH4__) + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 < NFREGARG) + { + freg = (freg + 1) & ~1; + freg += 2; + continue; + } + memcpy (argp, *p_argv, z); + argp += z; + } +#endif + else + { + int n = (z + sizeof (int) - 1) / sizeof (int); + if (greg + n - 1 < NGREGARG) + { + greg += n; + continue; + } +#if (! defined(__SH4__)) + else if (greg < NGREGARG) + { + greg = NGREGARG; + continue; + } +#endif + memcpy (argp, *p_argv, z); + argp += n * sizeof (int); + } + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + int i, j; + int size, type; + int n, m; + int greg; +#if defined(__SH4__) + int freg = 0; +#endif + + cif->flags = 0; + + greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) && + STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0; + +#if defined(__SH4__) + for (i = j = 0; i < cif->nargs && j < 12; i++) + { + type = (cif->arg_types)[i]->type; + switch (type) + { + case FFI_TYPE_FLOAT: + if (freg >= NFREGARG) + continue; + freg++; + cif->flags += ((cif->arg_types)[i]->type) << (2 * j); + j++; + break; + + case FFI_TYPE_DOUBLE: + if ((freg + 1) >= NFREGARG) + continue; + freg = (freg + 1) & ~1; + freg += 2; + cif->flags += ((cif->arg_types)[i]->type) << (2 * j); + j++; + break; + + default: + size = (cif->arg_types)[i]->size; + n = (size + sizeof (int) - 1) / sizeof (int); + if (greg + n - 1 >= NGREGARG) + continue; + greg += n; + for (m = 0; m < n; m++) + cif->flags += FFI_TYPE_INT << (2 * j++); + break; + } + } +#else + for (i = j = 0; i < cif->nargs && j < 4; i++) + { + size = (cif->arg_types)[i]->size; + n = (size + sizeof (int) - 1) / sizeof (int); + if (greg >= NGREGARG) + continue; + else if (greg + n - 1 >= NGREGARG) + n = NGREGARG - greg; + greg += n; + for (m = 0; m < n; m++) + cif->flags += FFI_TYPE_INT << (2 * j++); + } +#endif + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_STRUCT: + cif->flags += (unsigned) (return_type (cif->rtype)) << 24; + break; + + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags += (unsigned) cif->rtype->type << 24; + break; + + default: + cif->flags += FFI_TYPE_INT << 24; + break; + } + + return FFI_OK; +} + +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, + unsigned, unsigned, unsigned *, void (*fn)(void)); + +void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + UINT64 trvalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if (cif->rtype->type == FFI_TYPE_STRUCT + && return_type (cif->rtype) != FFI_TYPE_STRUCT) + ecif.rvalue = &trvalue; + else if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, + fn); + break; + default: + FFI_ASSERT(0); + break; + } + + if (rvalue + && cif->rtype->type == FFI_TYPE_STRUCT + && return_type (cif->rtype) != FFI_TYPE_STRUCT) + memcpy (rvalue, &trvalue, cif->rtype->size); +} + +extern void ffi_closure_SYSV (void); +#if defined(__SH4__) +extern void __ic_invalidate (void *line); +#endif + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp; + unsigned int insn; + + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + tramp = (unsigned int *) &closure->tramp[0]; + /* Set T bit if the function returns a struct pointed with R2. */ + insn = (return_type (cif->rtype) == FFI_TYPE_STRUCT + ? 0x0018 /* sett */ + : 0x0008 /* clrt */); + +#ifdef __LITTLE_ENDIAN__ + tramp[0] = 0xd301d102; + tramp[1] = 0x0000412b | (insn << 16); +#else + tramp[0] = 0xd102d301; + tramp[1] = 0x412b0000 | insn; +#endif + *(void **) &tramp[2] = (void *)codeloc; /* ctx */ + *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + +#if defined(__SH4__) + /* Flush the icache. */ + __ic_invalidate(codeloc); +#endif + + return FFI_OK; +} + +/* Basically the trampoline invokes ffi_closure_SYSV, and on + * entry, r3 holds the address of the closure. + * After storing the registers that could possibly contain + * parameters to be passed into the stack frame and setting + * up space for a return value, ffi_closure_SYSV invokes the + * following helper function to do most of the work. + */ + +#ifdef __LITTLE_ENDIAN__ +#define OFS_INT8 0 +#define OFS_INT16 0 +#else +#define OFS_INT8 3 +#define OFS_INT16 2 +#endif + +int +ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, + unsigned long *pgr, unsigned long *pfr, + unsigned long *pst) +{ + void **avalue; + ffi_type **p_arg; + int i, avn; + int ireg, greg = 0; +#if defined(__SH4__) + int freg = 0; +#endif + ffi_cif *cif; + + cif = closure->cif; + avalue = alloca(cif->nargs * sizeof(void *)); + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ + if (cif->rtype->type == FFI_TYPE_STRUCT && STRUCT_VALUE_ADDRESS_WITH_ARG) + { + rvalue = (void *) *pgr++; + ireg = 1; + } + else + ireg = 0; + + cif = closure->cif; + greg = ireg; + avn = cif->nargs; + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + if (greg++ >= NGREGARG) + continue; + + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (((char *)pgr) + OFS_INT8); + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (((char *)pgr) + OFS_INT16); + break; + + case FFI_TYPE_STRUCT: + avalue[i] = pgr; + break; + + default: + FFI_ASSERT(0); + } + pgr++; + } + else if (z == sizeof(int)) + { +#if defined(__SH4__) + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg++ >= NFREGARG) + continue; + avalue[i] = pfr; + pfr++; + } + else +#endif + { + if (greg++ >= NGREGARG) + continue; + avalue[i] = pgr; + pgr++; + } + } +#if defined(__SH4__) + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 >= NFREGARG) + continue; + if (freg & 1) + pfr++; + freg = (freg + 1) & ~1; + freg += 2; + avalue[i] = pfr; + pfr += 2; + } +#endif + else + { + int n = (z + sizeof (int) - 1) / sizeof (int); +#if defined(__SH4__) + if (greg + n - 1 >= NGREGARG) + continue; +#else + if (greg >= NGREGARG) + continue; +#endif + greg += n; + avalue[i] = pgr; + pgr += n; + } + } + + greg = ireg; +#if defined(__SH4__) + freg = 0; +#endif + + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof(int)) + { + if (greg++ < NGREGARG) + continue; + + z = sizeof(int); + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + avalue[i] = (((char *)pst) + OFS_INT8); + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + avalue[i] = (((char *)pst) + OFS_INT16); + break; + + case FFI_TYPE_STRUCT: + avalue[i] = pst; + break; + + default: + FFI_ASSERT(0); + } + pst++; + } + else if (z == sizeof(int)) + { +#if defined(__SH4__) + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg++ < NFREGARG) + continue; + } + else +#endif + { + if (greg++ < NGREGARG) + continue; + } + avalue[i] = pst; + pst++; + } +#if defined(__SH4__) + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 < NFREGARG) + { + freg = (freg + 1) & ~1; + freg += 2; + continue; + } + avalue[i] = pst; + pst += 2; + } +#endif + else + { + int n = (z + sizeof (int) - 1) / sizeof (int); + if (greg + n - 1 < NGREGARG) + { + greg += n; + continue; + } +#if (! defined(__SH4__)) + else if (greg < NGREGARG) + { + greg += n; + pst += greg - NGREGARG; + continue; + } +#endif + avalue[i] = pst; + pst += n; + } + } + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_SYSV how to perform return type promotions. */ + return return_type (cif->rtype); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh/ffitarget.h new file mode 100644 index 000000000000..a36bf4207046 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh/ffitarget.h @@ -0,0 +1,54 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for SuperH. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 16 +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh/sysv.S new file mode 100644 index 000000000000..5be7516d6559 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh/sysv.S @@ -0,0 +1,850 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima + + SuperH Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#ifdef HAVE_MACHINE_ASM_H +#include <machine/asm.h> +#else +/* XXX these lose for some platforms, I'm sure. */ +#define CNAME(x) x +#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): +#endif + +#if defined(__HITACHI__) +#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 +#else +#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 +#endif + +.text + + # r4: ffi_prep_args + # r5: &ecif + # r6: bytes + # r7: flags + # sp+0: rvalue + # sp+4: fn + + # This assumes we are using gas. +ENTRY(ffi_call_SYSV) + # Save registers +.LFB1: + mov.l r8,@-r15 +.LCFI0: + mov.l r9,@-r15 +.LCFI1: + mov.l r10,@-r15 +.LCFI2: + mov.l r12,@-r15 +.LCFI3: + mov.l r14,@-r15 +.LCFI4: + sts.l pr,@-r15 +.LCFI5: + mov r15,r14 +.LCFI6: +#if defined(__SH4__) + mov r6,r8 + mov r7,r9 + + sub r6,r15 + add #-16,r15 + mov #~7,r0 + and r0,r15 + + mov r4,r0 + jsr @r0 + mov r15,r4 + + mov r9,r1 + shlr8 r9 + shlr8 r9 + shlr8 r9 + + mov #FFI_TYPE_STRUCT,r2 + cmp/eq r2,r9 + bf 1f +#if STRUCT_VALUE_ADDRESS_WITH_ARG + mov.l @r15+,r4 + bra 2f + mov #5,r2 +#else + mov.l @r15+,r10 +#endif +1: + mov #4,r2 +2: + mov #4,r3 + +L_pass: + cmp/pl r8 + bf L_call_it + + mov r1,r0 + and #3,r0 + +L_pass_d: + cmp/eq #FFI_TYPE_DOUBLE,r0 + bf L_pass_f + + mov r3,r0 + and #1,r0 + tst r0,r0 + bt 1f + add #1,r3 +1: + mov #12,r0 + cmp/hs r0,r3 + bt/s 3f + shlr2 r1 + bsr L_pop_d + nop +3: + add #2,r3 + bra L_pass + add #-8,r8 + +L_pop_d: + mov r3,r0 + add r0,r0 + add r3,r0 + add #-12,r0 + braf r0 + nop +#ifdef __LITTLE_ENDIAN__ + fmov.s @r15+,fr5 + rts + fmov.s @r15+,fr4 + fmov.s @r15+,fr7 + rts + fmov.s @r15+,fr6 + fmov.s @r15+,fr9 + rts + fmov.s @r15+,fr8 + fmov.s @r15+,fr11 + rts + fmov.s @r15+,fr10 +#else + fmov.s @r15+,fr4 + rts + fmov.s @r15+,fr5 + fmov.s @r15+,fr6 + rts + fmov.s @r15+,fr7 + fmov.s @r15+,fr8 + rts + fmov.s @r15+,fr9 + fmov.s @r15+,fr10 + rts + fmov.s @r15+,fr11 +#endif + +L_pass_f: + cmp/eq #FFI_TYPE_FLOAT,r0 + bf L_pass_i + + mov #12,r0 + cmp/hs r0,r3 + bt/s 2f + shlr2 r1 + bsr L_pop_f + nop +2: + add #1,r3 + bra L_pass + add #-4,r8 + +L_pop_f: + mov r3,r0 + shll2 r0 + add #-16,r0 + braf r0 + nop +#ifdef __LITTLE_ENDIAN__ + rts + fmov.s @r15+,fr5 + rts + fmov.s @r15+,fr4 + rts + fmov.s @r15+,fr7 + rts + fmov.s @r15+,fr6 + rts + fmov.s @r15+,fr9 + rts + fmov.s @r15+,fr8 + rts + fmov.s @r15+,fr11 + rts + fmov.s @r15+,fr10 +#else + rts + fmov.s @r15+,fr4 + rts + fmov.s @r15+,fr5 + rts + fmov.s @r15+,fr6 + rts + fmov.s @r15+,fr7 + rts + fmov.s @r15+,fr8 + rts + fmov.s @r15+,fr9 + rts + fmov.s @r15+,fr10 + rts + fmov.s @r15+,fr11 +#endif + +L_pass_i: + cmp/eq #FFI_TYPE_INT,r0 + bf L_call_it + + mov #8,r0 + cmp/hs r0,r2 + bt/s 2f + shlr2 r1 + bsr L_pop_i + nop +2: + add #1,r2 + bra L_pass + add #-4,r8 + +L_pop_i: + mov r2,r0 + shll2 r0 + add #-16,r0 + braf r0 + nop + rts + mov.l @r15+,r4 + rts + mov.l @r15+,r5 + rts + mov.l @r15+,r6 + rts + mov.l @r15+,r7 + +L_call_it: + # call function +#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) + mov r10, r2 +#endif + mov.l @(28,r14),r1 + jsr @r1 + nop + +L_ret_d: + mov #FFI_TYPE_DOUBLE,r2 + cmp/eq r2,r9 + bf L_ret_ll + + mov.l @(24,r14),r1 +#ifdef __LITTLE_ENDIAN__ + fmov.s fr1,@r1 + add #4,r1 + bra L_epilogue + fmov.s fr0,@r1 +#else + fmov.s fr0,@r1 + add #4,r1 + bra L_epilogue + fmov.s fr1,@r1 +#endif + +L_ret_ll: + mov #FFI_TYPE_SINT64,r2 + cmp/eq r2,r9 + bt/s 1f + mov #FFI_TYPE_UINT64,r2 + cmp/eq r2,r9 + bf L_ret_f + +1: + mov.l @(24,r14),r2 + mov.l r0,@r2 + bra L_epilogue + mov.l r1,@(4,r2) + +L_ret_f: + mov #FFI_TYPE_FLOAT,r2 + cmp/eq r2,r9 + bf L_ret_i + + mov.l @(24,r14),r1 + bra L_epilogue + fmov.s fr0,@r1 + +L_ret_i: + mov #FFI_TYPE_INT,r2 + cmp/eq r2,r9 + bf L_epilogue + + mov.l @(24,r14),r1 + bra L_epilogue + mov.l r0,@r1 + +L_epilogue: + # Remove the space we pushed for the args + mov r14,r15 + + lds.l @r15+,pr + mov.l @r15+,r14 + mov.l @r15+,r12 + mov.l @r15+,r10 + mov.l @r15+,r9 + rts + mov.l @r15+,r8 +#else + mov r6,r8 + mov r7,r9 + + sub r6,r15 + add #-16,r15 + mov #~7,r0 + and r0,r15 + + mov r4,r0 + jsr @r0 + mov r15,r4 + + mov r9,r3 + shlr8 r9 + shlr8 r9 + shlr8 r9 + + mov #FFI_TYPE_STRUCT,r2 + cmp/eq r2,r9 + bf 1f +#if STRUCT_VALUE_ADDRESS_WITH_ARG + mov.l @r15+,r4 + bra 2f + mov #5,r2 +#else + mov.l @r15+,r10 +#endif +1: + mov #4,r2 +2: + +L_pass: + cmp/pl r8 + bf L_call_it + + mov r3,r0 + and #3,r0 + +L_pass_d: + cmp/eq #FFI_TYPE_DOUBLE,r0 + bf L_pass_i + + mov r15,r0 + and #7,r0 + tst r0,r0 + bt 1f + add #4,r15 +1: + mov #8,r0 + cmp/hs r0,r2 + bt/s 2f + shlr2 r3 + bsr L_pop_d + nop +2: + add #2,r2 + bra L_pass + add #-8,r8 + +L_pop_d: + mov r2,r0 + add r0,r0 + add r2,r0 + add #-12,r0 + add r0,r0 + braf r0 + nop + mov.l @r15+,r4 + rts + mov.l @r15+,r5 + mov.l @r15+,r5 + rts + mov.l @r15+,r6 + mov.l @r15+,r6 + rts + mov.l @r15+,r7 + rts + mov.l @r15+,r7 + +L_pass_i: + cmp/eq #FFI_TYPE_INT,r0 + bf L_call_it + + mov #8,r0 + cmp/hs r0,r2 + bt/s 2f + shlr2 r3 + bsr L_pop_i + nop +2: + add #1,r2 + bra L_pass + add #-4,r8 + +L_pop_i: + mov r2,r0 + shll2 r0 + add #-16,r0 + braf r0 + nop + rts + mov.l @r15+,r4 + rts + mov.l @r15+,r5 + rts + mov.l @r15+,r6 + rts + mov.l @r15+,r7 + +L_call_it: + # call function +#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) + mov r10, r2 +#endif + mov.l @(28,r14),r1 + jsr @r1 + nop + +L_ret_d: + mov #FFI_TYPE_DOUBLE,r2 + cmp/eq r2,r9 + bf L_ret_ll + + mov.l @(24,r14),r2 + mov.l r0,@r2 + bra L_epilogue + mov.l r1,@(4,r2) + +L_ret_ll: + mov #FFI_TYPE_SINT64,r2 + cmp/eq r2,r9 + bt/s 1f + mov #FFI_TYPE_UINT64,r2 + cmp/eq r2,r9 + bf L_ret_i + +1: + mov.l @(24,r14),r2 + mov.l r0,@r2 + bra L_epilogue + mov.l r1,@(4,r2) + +L_ret_i: + mov #FFI_TYPE_FLOAT,r2 + cmp/eq r2,r9 + bt 1f + mov #FFI_TYPE_INT,r2 + cmp/eq r2,r9 + bf L_epilogue +1: + mov.l @(24,r14),r1 + bra L_epilogue + mov.l r0,@r1 + +L_epilogue: + # Remove the space we pushed for the args + mov r14,r15 + + lds.l @r15+,pr + mov.l @r15+,r14 + mov.l @r15+,r12 + mov.l @r15+,r10 + mov.l @r15+,r9 + rts + mov.l @r15+,r8 +#endif +.LFE1: +.ffi_call_SYSV_end: + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) + +.globl ffi_closure_helper_SYSV + +ENTRY(ffi_closure_SYSV) +.LFB2: + mov.l r7,@-r15 +.LCFI7: + mov.l r6,@-r15 +.LCFI8: + mov.l r5,@-r15 +.LCFI9: + mov.l r4,@-r15 +.LCFIA: + mov.l r14,@-r15 +.LCFIB: + sts.l pr,@-r15 + + /* Stack layout: + xx bytes (on stack parameters) + 16 bytes (register parameters) + 4 bytes (saved frame pointer) + 4 bytes (saved return address) + 32 bytes (floating register parameters, SH-4 only) + 8 bytes (result) + 4 bytes (pad) + 4 bytes (5th arg) + <- new stack pointer + */ +.LCFIC: +#if defined(__SH4__) + add #-48,r15 +#else + add #-16,r15 +#endif +.LCFID: + mov r15,r14 +.LCFIE: + +#if defined(__SH4__) + mov r14,r1 + add #48,r1 +#ifdef __LITTLE_ENDIAN__ + fmov.s fr10,@-r1 + fmov.s fr11,@-r1 + fmov.s fr8,@-r1 + fmov.s fr9,@-r1 + fmov.s fr6,@-r1 + fmov.s fr7,@-r1 + fmov.s fr4,@-r1 + fmov.s fr5,@-r1 +#else + fmov.s fr11,@-r1 + fmov.s fr10,@-r1 + fmov.s fr9,@-r1 + fmov.s fr8,@-r1 + fmov.s fr7,@-r1 + fmov.s fr6,@-r1 + fmov.s fr5,@-r1 + fmov.s fr4,@-r1 +#endif + mov r1,r7 + mov r14,r6 + add #56,r6 +#else + mov r14,r6 + add #24,r6 +#endif + + bt/s 10f + mov r2, r5 + mov r14,r1 + add #8,r1 + mov r1,r5 +10: + + mov r14,r1 +#if defined(__SH4__) + add #72,r1 +#else + add #40,r1 +#endif + mov.l r1,@r14 + +#ifdef PIC + mov.l L_got,r1 + mova L_got,r0 + add r0,r1 + mov.l L_helper,r0 + add r1,r0 +#else + mov.l L_helper,r0 +#endif + jsr @r0 + mov r3,r4 + + shll r0 + mov r0,r1 + mova L_table,r0 + add r1,r0 + mov.w @r0,r0 + mov r14,r2 + braf r0 + add #8,r2 +0: + .align 2 +#ifdef PIC +L_got: + .long _GLOBAL_OFFSET_TABLE_ +L_helper: + .long ffi_closure_helper_SYSV@GOTOFF +#else +L_helper: + .long ffi_closure_helper_SYSV +#endif +L_table: + .short L_case_v - 0b /* FFI_TYPE_VOID */ + .short L_case_i - 0b /* FFI_TYPE_INT */ +#if defined(__SH4__) + .short L_case_f - 0b /* FFI_TYPE_FLOAT */ + .short L_case_d - 0b /* FFI_TYPE_DOUBLE */ + .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */ +#else + .short L_case_i - 0b /* FFI_TYPE_FLOAT */ + .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */ + .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */ +#endif + .short L_case_uq - 0b /* FFI_TYPE_UINT8 */ + .short L_case_q - 0b /* FFI_TYPE_SINT8 */ + .short L_case_uh - 0b /* FFI_TYPE_UINT16 */ + .short L_case_h - 0b /* FFI_TYPE_SINT16 */ + .short L_case_i - 0b /* FFI_TYPE_UINT32 */ + .short L_case_i - 0b /* FFI_TYPE_SINT32 */ + .short L_case_ll - 0b /* FFI_TYPE_UINT64 */ + .short L_case_ll - 0b /* FFI_TYPE_SINT64 */ + .short L_case_v - 0b /* FFI_TYPE_STRUCT */ + .short L_case_i - 0b /* FFI_TYPE_POINTER */ + +#if defined(__SH4__) +L_case_d: +#ifdef __LITTLE_ENDIAN__ + fmov.s @r2+,fr1 + bra L_case_v + fmov.s @r2,fr0 +#else + fmov.s @r2+,fr0 + bra L_case_v + fmov.s @r2,fr1 +#endif + +L_case_f: + bra L_case_v + fmov.s @r2,fr0 +#endif + +L_case_ll: + mov.l @r2+,r0 + bra L_case_v + mov.l @r2,r1 + +L_case_i: + bra L_case_v + mov.l @r2,r0 + +L_case_q: +#ifdef __LITTLE_ENDIAN__ +#else + add #3,r2 +#endif + bra L_case_v + mov.b @r2,r0 + +L_case_uq: +#ifdef __LITTLE_ENDIAN__ +#else + add #3,r2 +#endif + mov.b @r2,r0 + bra L_case_v + extu.b r0,r0 + +L_case_h: +#ifdef __LITTLE_ENDIAN__ +#else + add #2,r2 +#endif + bra L_case_v + mov.w @r2,r0 + +L_case_uh: +#ifdef __LITTLE_ENDIAN__ +#else + add #2,r2 +#endif + mov.w @r2,r0 + extu.w r0,r0 + /* fall through */ + +L_case_v: +#if defined(__SH4__) + add #48,r15 +#else + add #16,r15 +#endif + lds.l @r15+,pr + mov.l @r15+,r14 + rts + add #16,r15 +.LFE2: +.ffi_closure_SYSV_end: + .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif + + .section ".eh_frame","aw",@progbits +__FRAME_BEGIN__: + .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ +.LSCIE1: + .4byte 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ +#ifdef PIC + .ascii "zR\0" /* CIE Augmentation */ +#else + .byte 0x0 /* CIE Augmentation */ +#endif + .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ + .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */ + .byte 0x11 /* CIE RA Column */ +#ifdef PIC + .uleb128 0x1 /* Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel) */ +#endif + .byte 0xc /* DW_CFA_def_cfa */ + .byte 0xf /* uleb128 0xf */ + .byte 0x0 /* uleb128 0x0 */ + .align 2 +.LECIE1: +.LSFDE1: + .4byte .LEFDE1-.LASFDE1 /* FDE Length */ +.LASFDE1: + .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */ +#ifdef PIC + .4byte .LFB1-. /* FDE initial location */ +#else + .4byte .LFB1 /* FDE initial location */ +#endif + .4byte .LFE1-.LFB1 /* FDE address range */ +#ifdef PIC + .uleb128 0x0 /* Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI0-.LFB1 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x4 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI1-.LCFI0 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI2-.LCFI1 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0xc /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI3-.LCFI2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x10 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI4-.LCFI3 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x14 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI5-.LCFI4 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x18 /* uleb128 0x4 */ + .byte 0x91 /* DW_CFA_offset, column 0x11 */ + .byte 0x6 /* uleb128 0x6 */ + .byte 0x8e /* DW_CFA_offset, column 0xe */ + .byte 0x5 /* uleb128 0x5 */ + .byte 0x8c /* DW_CFA_offset, column 0xc */ + .byte 0x4 /* uleb128 0x4 */ + .byte 0x8a /* DW_CFA_offset, column 0xa */ + .byte 0x3 /* uleb128 0x3 */ + .byte 0x89 /* DW_CFA_offset, column 0x9 */ + .byte 0x2 /* uleb128 0x2 */ + .byte 0x88 /* DW_CFA_offset, column 0x8 */ + .byte 0x1 /* uleb128 0x1 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI6-.LCFI5 + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0xe /* uleb128 0xe */ + .align 2 +.LEFDE1: + +.LSFDE3: + .4byte .LEFDE3-.LASFDE3 /* FDE Length */ +.LASFDE3: + .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */ +#ifdef PIC + .4byte .LFB2-. /* FDE initial location */ +#else + .4byte .LFB2 /* FDE initial location */ +#endif + .4byte .LFE2-.LFB2 /* FDE address range */ +#ifdef PIC + .uleb128 0x0 /* Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI7-.LFB2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x4 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI8-.LCFI7 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x8 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFI9-.LCFI8 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0xc /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFIA-.LCFI9 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x10 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFIB-.LCFIA + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x14 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFIC-.LCFIB + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte 0x18 /* uleb128 0x4 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFID-.LCFIC + .byte 0xe /* DW_CFA_def_cfa_offset */ +#if defined(__SH4__) + .byte 24+48 /* uleb128 24+48 */ +#else + .byte 24+16 /* uleb128 24+16 */ +#endif + .byte 0x91 /* DW_CFA_offset, column 0x11 */ + .byte 0x6 /* uleb128 0x6 */ + .byte 0x8e /* DW_CFA_offset, column 0xe */ + .byte 0x5 /* uleb128 0x5 */ + .byte 0x84 /* DW_CFA_offset, column 0x4 */ + .byte 0x4 /* uleb128 0x4 */ + .byte 0x85 /* DW_CFA_offset, column 0x5 */ + .byte 0x3 /* uleb128 0x3 */ + .byte 0x86 /* DW_CFA_offset, column 0x6 */ + .byte 0x2 /* uleb128 0x2 */ + .byte 0x87 /* DW_CFA_offset, column 0x7 */ + .byte 0x1 /* uleb128 0x1 */ + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte .LCFIE-.LCFID + .byte 0xd /* DW_CFA_def_cfa_register */ + .byte 0xe /* uleb128 0xe */ + .align 2 +.LEFDE3: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh64/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh64/ffi.c new file mode 100644 index 000000000000..123b87ace92f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh64/ffi.c @@ -0,0 +1,469 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima + Copyright (c) 2008 Anthony Green + + SuperH SHmedia Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> + +#define NGREGARG 8 +#define NFREGARG 12 + +static int +return_type (ffi_type *arg) +{ + + if (arg->type != FFI_TYPE_STRUCT) + return arg->type; + + /* gcc uses r2 if the result can be packed in on register. */ + if (arg->size <= sizeof (UINT8)) + return FFI_TYPE_UINT8; + else if (arg->size <= sizeof (UINT16)) + return FFI_TYPE_UINT16; + else if (arg->size <= sizeof (UINT32)) + return FFI_TYPE_UINT32; + else if (arg->size <= sizeof (UINT64)) + return FFI_TYPE_UINT64; + + return FFI_TYPE_STRUCT; +} + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +void ffi_prep_args(char *stack, extended_cif *ecif) +{ + register unsigned int i; + register unsigned int avn; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + + argp = stack; + + if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) + { + *(void **) argp = ecif->rvalue; + argp += sizeof (UINT64); + } + + avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) + { + size_t z; + int align; + + z = (*p_arg)->size; + align = (*p_arg)->alignment; + if (z < sizeof (UINT32)) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(SINT64 *) argp = (SINT64) *(SINT8 *)(*p_argv); + break; + + case FFI_TYPE_UINT8: + *(UINT64 *) argp = (UINT64) *(UINT8 *)(*p_argv); + break; + + case FFI_TYPE_SINT16: + *(SINT64 *) argp = (SINT64) *(SINT16 *)(*p_argv); + break; + + case FFI_TYPE_UINT16: + *(UINT64 *) argp = (UINT64) *(UINT16 *)(*p_argv); + break; + + case FFI_TYPE_STRUCT: + memcpy (argp, *p_argv, z); + break; + + default: + FFI_ASSERT(0); + } + argp += sizeof (UINT64); + } + else if (z == sizeof (UINT32) && align == sizeof (UINT32)) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + *(SINT64 *) argp = (SINT64) *(SINT32 *) (*p_argv); + break; + + case FFI_TYPE_FLOAT: + case FFI_TYPE_POINTER: + case FFI_TYPE_UINT32: + case FFI_TYPE_STRUCT: + *(UINT64 *) argp = (UINT64) *(UINT32 *) (*p_argv); + break; + + default: + FFI_ASSERT(0); + break; + } + argp += sizeof (UINT64); + } + else if (z == sizeof (UINT64) + && align == sizeof (UINT64) + && ((int) *p_argv & (sizeof (UINT64) - 1)) == 0) + { + *(UINT64 *) argp = *(UINT64 *) (*p_argv); + argp += sizeof (UINT64); + } + else + { + int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); + + memcpy (argp, *p_argv, z); + argp += n * sizeof (UINT64); + } + } + + return; +} + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + int i, j; + int size, type; + int n, m; + int greg; + int freg; + int fpair = -1; + + greg = (return_type (cif->rtype) == FFI_TYPE_STRUCT ? 1 : 0); + freg = 0; + cif->flags2 = 0; + + for (i = j = 0; i < cif->nargs; i++) + { + type = (cif->arg_types)[i]->type; + switch (type) + { + case FFI_TYPE_FLOAT: + greg++; + cif->bytes += sizeof (UINT64) - sizeof (float); + if (freg >= NFREGARG - 1) + continue; + if (fpair < 0) + { + fpair = freg; + freg += 2; + } + else + fpair = -1; + cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); + break; + + case FFI_TYPE_DOUBLE: + if (greg++ >= NGREGARG && (freg + 1) >= NFREGARG) + continue; + if ((freg + 1) < NFREGARG) + { + freg += 2; + cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); + } + else + cif->flags2 += FFI_TYPE_INT << (2 * j++); + break; + + default: + size = (cif->arg_types)[i]->size; + if (size < sizeof (UINT64)) + cif->bytes += sizeof (UINT64) - size; + n = (size + sizeof (UINT64) - 1) / sizeof (UINT64); + if (greg >= NGREGARG) + continue; + else if (greg + n - 1 >= NGREGARG) + greg = NGREGARG; + else + greg += n; + for (m = 0; m < n; m++) + cif->flags2 += FFI_TYPE_INT << (2 * j++); + break; + } + } + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_STRUCT: + cif->flags = return_type (cif->rtype); + break; + + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + cif->flags = cif->rtype->type; + break; + + default: + cif->flags = FFI_TYPE_INT; + break; + } + + return FFI_OK; +} + +/*@-declundef@*/ +/*@-exportheader@*/ +extern void ffi_call_SYSV(void (*)(char *, extended_cif *), + /*@out@*/ extended_cif *, + unsigned, unsigned, long long, + /*@out@*/ unsigned *, + void (*fn)(void)); +/*@=declundef@*/ +/*@=exportheader@*/ + +void ffi_call(/*@dependent@*/ ffi_cif *cif, + void (*fn)(void), + /*@out@*/ void *rvalue, + /*@dependent@*/ void **avalue) +{ + extended_cif ecif; + UINT64 trvalue; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if (cif->rtype->type == FFI_TYPE_STRUCT + && return_type (cif->rtype) != FFI_TYPE_STRUCT) + ecif.rvalue = &trvalue; + else if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + ecif.rvalue = alloca(cif->rtype->size); + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_SYSV: + ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, cif->flags2, + ecif.rvalue, fn); + break; + default: + FFI_ASSERT(0); + break; + } + + if (rvalue + && cif->rtype->type == FFI_TYPE_STRUCT + && return_type (cif->rtype) != FFI_TYPE_STRUCT) + memcpy (rvalue, &trvalue, cif->rtype->size); +} + +extern void ffi_closure_SYSV (void); +extern void __ic_invalidate (void *line); + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp; + + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + tramp = (unsigned int *) &closure->tramp[0]; + /* Since ffi_closure is an aligned object, the ffi trampoline is + called as an SHcompact code. Sigh. + SHcompact part: + mova @(1,pc),r0; add #1,r0; jmp @r0; nop; + SHmedia part: + movi fnaddr >> 16,r1; shori fnaddr,r1; ptabs/l r1,tr0 + movi cxt >> 16,r1; shori cxt,r1; blink tr0,r63 */ +#ifdef __LITTLE_ENDIAN__ + tramp[0] = 0x7001c701; + tramp[1] = 0x0009402b; +#else + tramp[0] = 0xc7017001; + tramp[1] = 0x402b0009; +#endif + tramp[2] = 0xcc000010 | (((UINT32) ffi_closure_SYSV) >> 16) << 10; + tramp[3] = 0xc8000010 | (((UINT32) ffi_closure_SYSV) & 0xffff) << 10; + tramp[4] = 0x6bf10600; + tramp[5] = 0xcc000010 | (((UINT32) codeloc) >> 16) << 10; + tramp[6] = 0xc8000010 | (((UINT32) codeloc) & 0xffff) << 10; + tramp[7] = 0x4401fff0; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Flush the icache. */ + asm volatile ("ocbwb %0,0; synco; icbi %1,0; synci" : : "r" (tramp), + "r"(codeloc)); + + return FFI_OK; +} + +/* Basically the trampoline invokes ffi_closure_SYSV, and on + * entry, r3 holds the address of the closure. + * After storing the registers that could possibly contain + * parameters to be passed into the stack frame and setting + * up space for a return value, ffi_closure_SYSV invokes the + * following helper function to do most of the work. + */ + +int +ffi_closure_helper_SYSV (ffi_closure *closure, UINT64 *rvalue, + UINT64 *pgr, UINT64 *pfr, UINT64 *pst) +{ + void **avalue; + ffi_type **p_arg; + int i, avn; + int greg, freg; + ffi_cif *cif; + int fpair = -1; + + cif = closure->cif; + avalue = alloca (cif->nargs * sizeof (void *)); + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ + if (return_type (cif->rtype) == FFI_TYPE_STRUCT) + { + rvalue = (UINT64 *) *pgr; + greg = 1; + } + else + greg = 0; + + freg = 0; + cif = closure->cif; + avn = cif->nargs; + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) + { + size_t z; + void *p; + + z = (*p_arg)->size; + if (z < sizeof (UINT32)) + { + p = pgr + greg++; + + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + case FFI_TYPE_STRUCT: +#ifdef __LITTLE_ENDIAN__ + avalue[i] = p; +#else + avalue[i] = ((char *) p) + sizeof (UINT32) - z; +#endif + break; + + default: + FFI_ASSERT(0); + } + } + else if (z == sizeof (UINT32)) + { + if ((*p_arg)->type == FFI_TYPE_FLOAT) + { + if (freg < NFREGARG - 1) + { + if (fpair >= 0) + { + avalue[i] = (UINT32 *) pfr + fpair; + fpair = -1; + } + else + { +#ifdef __LITTLE_ENDIAN__ + fpair = freg; + avalue[i] = (UINT32 *) pfr + (1 ^ freg); +#else + fpair = 1 ^ freg; + avalue[i] = (UINT32 *) pfr + freg; +#endif + freg += 2; + } + } + else +#ifdef __LITTLE_ENDIAN__ + avalue[i] = pgr + greg; +#else + avalue[i] = (UINT32 *) (pgr + greg) + 1; +#endif + } + else +#ifdef __LITTLE_ENDIAN__ + avalue[i] = pgr + greg; +#else + avalue[i] = (UINT32 *) (pgr + greg) + 1; +#endif + greg++; + } + else if ((*p_arg)->type == FFI_TYPE_DOUBLE) + { + if (freg + 1 >= NFREGARG) + avalue[i] = pgr + greg; + else + { + avalue[i] = pfr + (freg >> 1); + freg += 2; + } + greg++; + } + else + { + int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); + + avalue[i] = pgr + greg; + greg += n; + } + } + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_SYSV how to perform return type promotions. */ + return return_type (cif->rtype); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh64/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh64/ffitarget.h new file mode 100644 index 000000000000..08a6fe96cc71 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh64/ffitarget.h @@ -0,0 +1,58 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for SuperH - SHmedia. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; + +#define FFI_EXTRA_CIF_FIELDS long long flags2 +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 32 +#define FFI_NATIVE_RAW_API 0 + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh64/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh64/sysv.S new file mode 100644 index 000000000000..c4587d5f3e73 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sh64/sysv.S @@ -0,0 +1,539 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima + + SuperH SHmedia Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#ifdef HAVE_MACHINE_ASM_H +#include <machine/asm.h> +#else +/* XXX these lose for some platforms, I'm sure. */ +#define CNAME(x) x +#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): +#endif + +#ifdef __LITTLE_ENDIAN__ +#define OFS_FLT 0 +#else +#define OFS_FLT 4 +#endif + + .section .text..SHmedia32,"ax" + + # r2: ffi_prep_args + # r3: &ecif + # r4: bytes + # r5: flags + # r6: flags2 + # r7: rvalue + # r8: fn + + # This assumes we are using gas. + .align 5 +ENTRY(ffi_call_SYSV) + # Save registers +.LFB1: + addi.l r15, -48, r15 +.LCFI0: + st.q r15, 40, r32 + st.q r15, 32, r31 + st.q r15, 24, r30 + st.q r15, 16, r29 + st.q r15, 8, r28 + st.l r15, 4, r18 + st.l r15, 0, r14 +.LCFI1: + add.l r15, r63, r14 +.LCFI2: +# add r4, r63, r28 + add r5, r63, r29 + add r6, r63, r30 + add r7, r63, r31 + add r8, r63, r32 + + addi r4, (64 + 7), r4 + andi r4, ~7, r4 + sub.l r15, r4, r15 + + ptabs/l r2, tr0 + add r15, r63, r2 + blink tr0, r18 + + addi r15, 64, r22 + movi 0, r0 + movi 0, r1 + movi -1, r23 + + pt/l 1f, tr1 + bnei/l r29, FFI_TYPE_STRUCT, tr1 + ld.l r15, 0, r19 + addi r15, 8, r15 + addi r0, 1, r0 +1: + +.L_pass: + andi r30, 3, r20 + shlri r30, 2, r30 + + pt/l .L_call_it, tr0 + pt/l .L_pass_i, tr1 + pt/l .L_pass_f, tr2 + + beqi/l r20, FFI_TYPE_VOID, tr0 + beqi/l r20, FFI_TYPE_INT, tr1 + beqi/l r20, FFI_TYPE_FLOAT, tr2 + +.L_pass_d: + addi r0, 1, r0 + pt/l 3f, tr0 + movi 12, r20 + bge/l r1, r20, tr0 + + pt/l .L_pop_d, tr1 + pt/l 2f, tr0 + blink tr1, r63 +2: + addi.l r15, 8, r15 +3: + pt/l .L_pass, tr0 + addi r1, 2, r1 + blink tr0, r63 + +.L_pop_d: + pt/l .L_pop_d_tbl, tr1 + gettr tr1, r20 + shlli r1, 2, r21 + add r20, r21, r20 + ptabs/l r20, tr1 + blink tr1, r63 + +.L_pop_d_tbl: + fld.d r15, 0, dr0 + blink tr0, r63 + fld.d r15, 0, dr2 + blink tr0, r63 + fld.d r15, 0, dr4 + blink tr0, r63 + fld.d r15, 0, dr6 + blink tr0, r63 + fld.d r15, 0, dr8 + blink tr0, r63 + fld.d r15, 0, dr10 + blink tr0, r63 + +.L_pass_f: + addi r0, 1, r0 + pt/l 3f, tr0 + movi 12, r20 + bge/l r1, r20, tr0 + + pt/l .L_pop_f, tr1 + pt/l 2f, tr0 + blink tr1, r63 +2: + addi.l r15, 8, r15 +3: + pt/l .L_pass, tr0 + blink tr0, r63 + +.L_pop_f: + pt/l .L_pop_f_tbl, tr1 + pt/l 5f, tr2 + gettr tr1, r20 + bge/l r23, r63, tr2 + add r1, r63, r23 + shlli r1, 3, r21 + addi r1, 2, r1 + add r20, r21, r20 + ptabs/l r20, tr1 + blink tr1, r63 +5: + addi r23, 1, r21 + movi -1, r23 + shlli r21, 3, r21 + add r20, r21, r20 + ptabs/l r20, tr1 + blink tr1, r63 + +.L_pop_f_tbl: + fld.s r15, OFS_FLT, fr0 + blink tr0, r63 + fld.s r15, OFS_FLT, fr1 + blink tr0, r63 + fld.s r15, OFS_FLT, fr2 + blink tr0, r63 + fld.s r15, OFS_FLT, fr3 + blink tr0, r63 + fld.s r15, OFS_FLT, fr4 + blink tr0, r63 + fld.s r15, OFS_FLT, fr5 + blink tr0, r63 + fld.s r15, OFS_FLT, fr6 + blink tr0, r63 + fld.s r15, OFS_FLT, fr7 + blink tr0, r63 + fld.s r15, OFS_FLT, fr8 + blink tr0, r63 + fld.s r15, OFS_FLT, fr9 + blink tr0, r63 + fld.s r15, OFS_FLT, fr10 + blink tr0, r63 + fld.s r15, OFS_FLT, fr11 + blink tr0, r63 + +.L_pass_i: + pt/l 3f, tr0 + movi 8, r20 + bge/l r0, r20, tr0 + + pt/l .L_pop_i, tr1 + pt/l 2f, tr0 + blink tr1, r63 +2: + addi.l r15, 8, r15 +3: + pt/l .L_pass, tr0 + addi r0, 1, r0 + blink tr0, r63 + +.L_pop_i: + pt/l .L_pop_i_tbl, tr1 + gettr tr1, r20 + shlli r0, 3, r21 + add r20, r21, r20 + ptabs/l r20, tr1 + blink tr1, r63 + +.L_pop_i_tbl: + ld.q r15, 0, r2 + blink tr0, r63 + ld.q r15, 0, r3 + blink tr0, r63 + ld.q r15, 0, r4 + blink tr0, r63 + ld.q r15, 0, r5 + blink tr0, r63 + ld.q r15, 0, r6 + blink tr0, r63 + ld.q r15, 0, r7 + blink tr0, r63 + ld.q r15, 0, r8 + blink tr0, r63 + ld.q r15, 0, r9 + blink tr0, r63 + +.L_call_it: + # call function + pt/l 1f, tr1 + bnei/l r29, FFI_TYPE_STRUCT, tr1 + add r19, r63, r2 +1: + add r22, r63, r15 + ptabs/l r32, tr0 + blink tr0, r18 + + pt/l .L_ret_i, tr0 + pt/l .L_ret_ll, tr1 + pt/l .L_ret_d, tr2 + pt/l .L_ret_f, tr3 + pt/l .L_epilogue, tr4 + + beqi/l r29, FFI_TYPE_INT, tr0 + beqi/l r29, FFI_TYPE_UINT32, tr0 + beqi/l r29, FFI_TYPE_SINT64, tr1 + beqi/l r29, FFI_TYPE_UINT64, tr1 + beqi/l r29, FFI_TYPE_DOUBLE, tr2 + beqi/l r29, FFI_TYPE_FLOAT, tr3 + + pt/l .L_ret_q, tr0 + pt/l .L_ret_h, tr1 + + beqi/l r29, FFI_TYPE_UINT8, tr0 + beqi/l r29, FFI_TYPE_UINT16, tr1 + blink tr4, r63 + +.L_ret_d: + fst.d r31, 0, dr0 + blink tr4, r63 + +.L_ret_ll: + st.q r31, 0, r2 + blink tr4, r63 + +.L_ret_f: + fst.s r31, OFS_FLT, fr0 + blink tr4, r63 + +.L_ret_q: + st.b r31, 0, r2 + blink tr4, r63 + +.L_ret_h: + st.w r31, 0, r2 + blink tr4, r63 + +.L_ret_i: + st.l r31, 0, r2 + # Fall + +.L_epilogue: + # Remove the space we pushed for the args + add r14, r63, r15 + + ld.l r15, 0, r14 + ld.l r15, 4, r18 + ld.q r15, 8, r28 + ld.q r15, 16, r29 + ld.q r15, 24, r30 + ld.q r15, 32, r31 + ld.q r15, 40, r32 + addi.l r15, 48, r15 + ptabs r18, tr0 + blink tr0, r63 + +.LFE1: +.ffi_call_SYSV_end: + .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) + + .align 5 +ENTRY(ffi_closure_SYSV) +.LFB2: + addi.l r15, -136, r15 +.LCFI3: + st.l r15, 12, r18 + st.l r15, 8, r14 + st.l r15, 4, r12 +.LCFI4: + add r15, r63, r14 +.LCFI5: + /* Stack layout: + ... + 64 bytes (register parameters) + 48 bytes (floating register parameters) + 8 bytes (result) + 4 bytes (r18) + 4 bytes (r14) + 4 bytes (r12) + 4 bytes (for align) + <- new stack pointer + */ + fst.d r14, 24, dr0 + fst.d r14, 32, dr2 + fst.d r14, 40, dr4 + fst.d r14, 48, dr6 + fst.d r14, 56, dr8 + fst.d r14, 64, dr10 + st.q r14, 72, r2 + st.q r14, 80, r3 + st.q r14, 88, r4 + st.q r14, 96, r5 + st.q r14, 104, r6 + st.q r14, 112, r7 + st.q r14, 120, r8 + st.q r14, 128, r9 + + add r1, r63, r2 + addi r14, 16, r3 + addi r14, 72, r4 + addi r14, 24, r5 + addi r14, 136, r6 +#ifdef PIC + movi (((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12 + shori ((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12 +.LPCS0: ptrel/u r12, tr0 + movi ((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1 + gettr tr0, r12 + ldx.l r1, r12, r1 + ptabs r1, tr0 +#else + pt/l ffi_closure_helper_SYSV, tr0 +#endif + blink tr0, r18 + + shlli r2, 1, r1 + movi (((datalabel .L_table) >> 16) & 65535), r2 + shori ((datalabel .L_table) & 65535), r2 + ldx.w r2, r1, r1 + add r1, r2, r1 + pt/l .L_case_v, tr1 + ptabs r1, tr0 + blink tr0, r63 + + .align 2 +.L_table: + .word .L_case_v - datalabel .L_table /* FFI_TYPE_VOID */ + .word .L_case_i - datalabel .L_table /* FFI_TYPE_INT */ + .word .L_case_f - datalabel .L_table /* FFI_TYPE_FLOAT */ + .word .L_case_d - datalabel .L_table /* FFI_TYPE_DOUBLE */ + .word .L_case_d - datalabel .L_table /* FFI_TYPE_LONGDOUBLE */ + .word .L_case_uq - datalabel .L_table /* FFI_TYPE_UINT8 */ + .word .L_case_q - datalabel .L_table /* FFI_TYPE_SINT8 */ + .word .L_case_uh - datalabel .L_table /* FFI_TYPE_UINT16 */ + .word .L_case_h - datalabel .L_table /* FFI_TYPE_SINT16 */ + .word .L_case_i - datalabel .L_table /* FFI_TYPE_UINT32 */ + .word .L_case_i - datalabel .L_table /* FFI_TYPE_SINT32 */ + .word .L_case_ll - datalabel .L_table /* FFI_TYPE_UINT64 */ + .word .L_case_ll - datalabel .L_table /* FFI_TYPE_SINT64 */ + .word .L_case_v - datalabel .L_table /* FFI_TYPE_STRUCT */ + .word .L_case_i - datalabel .L_table /* FFI_TYPE_POINTER */ + + .align 2 +.L_case_d: + fld.d r14, 16, dr0 + blink tr1, r63 +.L_case_f: + fld.s r14, 16, fr0 + blink tr1, r63 +.L_case_ll: + ld.q r14, 16, r2 + blink tr1, r63 +.L_case_i: + ld.l r14, 16, r2 + blink tr1, r63 +.L_case_q: + ld.b r14, 16, r2 + blink tr1, r63 +.L_case_uq: + ld.ub r14, 16, r2 + blink tr1, r63 +.L_case_h: + ld.w r14, 16, r2 + blink tr1, r63 +.L_case_uh: + ld.uw r14, 16, r2 + blink tr1, r63 +.L_case_v: + add.l r14, r63, r15 + ld.l r15, 4, r12 + ld.l r15, 8, r14 + ld.l r15, 12, r18 + addi.l r15, 136, r15 + ptabs r18, tr0 + blink tr0, r63 + +.LFE2: +.ffi_closure_SYSV_end: + .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif + + .section ".eh_frame","aw",@progbits +__FRAME_BEGIN__: + .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ +.LSCIE1: + .4byte 0x0 /* CIE Identifier Tag */ + .byte 0x1 /* CIE Version */ +#ifdef PIC + .ascii "zR\0" /* CIE Augmentation */ +#else + .byte 0x0 /* CIE Augmentation */ +#endif + .uleb128 0x1 /* CIE Code Alignment Factor */ + .sleb128 -4 /* CIE Data Alignment Factor */ + .byte 0x12 /* CIE RA Column */ +#ifdef PIC + .uleb128 0x1 /* Augmentation size */ + .byte 0x10 /* FDE Encoding (pcrel) */ +#endif + .byte 0xc /* DW_CFA_def_cfa */ + .uleb128 0xf + .uleb128 0x0 + .align 2 +.LECIE1: +.LSFDE1: + .4byte datalabel .LEFDE1-datalabel .LASFDE1 /* FDE Length */ +.LASFDE1: + .4byte datalabel .LASFDE1-datalabel __FRAME_BEGIN__ +#ifdef PIC + .4byte .LFB1-. /* FDE initial location */ +#else + .4byte .LFB1 /* FDE initial location */ +#endif + .4byte datalabel .LFE1-datalabel .LFB1 /* FDE address range */ +#ifdef PIC + .uleb128 0x0 /* Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI0-datalabel .LFB1 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .uleb128 0x30 + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI1-datalabel .LCFI0 + .byte 0x8e /* DW_CFA_offset, column 0xe */ + .uleb128 0xc + .byte 0x92 /* DW_CFA_offset, column 0x12 */ + .uleb128 0xb + .byte 0x9c /* DW_CFA_offset, column 0x1c */ + .uleb128 0xa + .byte 0x9d /* DW_CFA_offset, column 0x1d */ + .uleb128 0x8 + .byte 0x9e /* DW_CFA_offset, column 0x1e */ + .uleb128 0x6 + .byte 0x9f /* DW_CFA_offset, column 0x1f */ + .uleb128 0x4 + .byte 0xa0 /* DW_CFA_offset, column 0x20 */ + .uleb128 0x2 + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI2-datalabel .LCFI1 + .byte 0xd /* DW_CFA_def_cfa_register */ + .uleb128 0xe + .align 2 +.LEFDE1: + +.LSFDE3: + .4byte datalabel .LEFDE3-datalabel .LASFDE3 /* FDE Length */ +.LASFDE3: + .4byte datalabel .LASFDE3-datalabel __FRAME_BEGIN__ +#ifdef PIC + .4byte .LFB2-. /* FDE initial location */ +#else + .4byte .LFB2 /* FDE initial location */ +#endif + .4byte datalabel .LFE2-datalabel .LFB2 /* FDE address range */ +#ifdef PIC + .uleb128 0x0 /* Augmentation size */ +#endif + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI3-datalabel .LFB2 + .byte 0xe /* DW_CFA_def_cfa_offset */ + .uleb128 0x88 + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI4-datalabel .LCFI3 + .byte 0x8c /* DW_CFA_offset, column 0xc */ + .uleb128 0x21 + .byte 0x8e /* DW_CFA_offset, column 0xe */ + .uleb128 0x20 + .byte 0x92 /* DW_CFA_offset, column 0x12 */ + .uleb128 0x1f + .byte 0x4 /* DW_CFA_advance_loc4 */ + .4byte datalabel .LCFI5-datalabel .LCFI4 + .byte 0xd /* DW_CFA_def_cfa_register */ + .uleb128 0xe + .align 2 +.LEFDE3: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/ffi.c new file mode 100644 index 000000000000..9e406d0af678 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/ffi.c @@ -0,0 +1,468 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011, 2013 Anthony Green + Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. + + SPARC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> +#include <stdlib.h> +#include "internal.h" + +#ifndef SPARC64 + +/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; + all further uses in this file will refer to the 128-bit type. */ +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +# if FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +#else +# undef FFI_TYPE_LONGDOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#endif + +/* Perform machine dependent cif processing */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep(ffi_cif *cif) +{ + ffi_type *rtype = cif->rtype; + int rtt = rtype->type; + size_t bytes; + int i, n, flags; + + /* Set the return type flag */ + switch (rtt) + { + case FFI_TYPE_VOID: + flags = SPARC_RET_VOID; + break; + case FFI_TYPE_FLOAT: + flags = SPARC_RET_F_1; + break; + case FFI_TYPE_DOUBLE: + flags = SPARC_RET_F_2; + break; + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_STRUCT: + flags = (rtype->size & 0xfff) << SPARC_SIZEMASK_SHIFT; + flags |= SPARC_RET_STRUCT; + break; + case FFI_TYPE_SINT8: + flags = SPARC_RET_SINT8; + break; + case FFI_TYPE_UINT8: + flags = SPARC_RET_UINT8; + break; + case FFI_TYPE_SINT16: + flags = SPARC_RET_SINT16; + break; + case FFI_TYPE_UINT16: + flags = SPARC_RET_UINT16; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + flags = SPARC_RET_UINT32; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + flags = SPARC_RET_INT64; + break; + case FFI_TYPE_COMPLEX: + rtt = rtype->elements[0]->type; + switch (rtt) + { + case FFI_TYPE_FLOAT: + flags = SPARC_RET_F_2; + break; + case FFI_TYPE_DOUBLE: + flags = SPARC_RET_F_4; + break; + case FFI_TYPE_LONGDOUBLE: + flags = SPARC_RET_F_8; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + flags = SPARC_RET_INT128; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + flags = SPARC_RET_INT64; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + flags = SP_V8_RET_CPLX16; + break; + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + flags = SP_V8_RET_CPLX8; + break; + default: + abort(); + } + break; + default: + abort(); + } + cif->flags = flags; + + bytes = 0; + for (i = 0, n = cif->nargs; i < n; ++i) + { + ffi_type *ty = cif->arg_types[i]; + size_t z = ty->size; + int tt = ty->type; + + switch (tt) + { + case FFI_TYPE_STRUCT: + case FFI_TYPE_LONGDOUBLE: + by_reference: + /* Passed by reference. */ + z = 4; + break; + + case FFI_TYPE_COMPLEX: + tt = ty->elements[0]->type; + if (tt == FFI_TYPE_FLOAT || z > 8) + goto by_reference; + /* FALLTHRU */ + + default: + z = FFI_ALIGN(z, 4); + } + bytes += z; + } + + /* Sparc call frames require that space is allocated for 6 args, + even if they aren't used. Make that space if necessary. */ + if (bytes < 6 * 4) + bytes = 6 * 4; + + /* The ABI always requires space for the struct return pointer. */ + bytes += 4; + + /* The stack must be 2 word aligned, so round bytes up appropriately. */ + bytes = FFI_ALIGN(bytes, 2 * 4); + + /* Include the call frame to prep_args. */ + bytes += 4*16 + 4*8; + cif->bytes = bytes; + + return FFI_OK; +} + +extern void ffi_call_v8(ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, size_t bytes, void *closure) FFI_HIDDEN; + +int FFI_HIDDEN +ffi_prep_args_v8(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue) +{ + ffi_type **p_arg; + int flags = cif->flags; + int i, nargs; + + if (rvalue == NULL) + { + if ((flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT) + { + /* Since we pass the pointer to the callee, we need a value. + We allowed for this space in ffi_call, before ffi_call_v8 + alloca'd the space. */ + rvalue = (char *)argp + cif->bytes; + } + else + { + /* Otherwise, we can ignore the return value. */ + flags = SPARC_RET_VOID; + } + } + + /* This could only really be done when we are returning a structure. + However, the space is reserved so we can do it unconditionally. */ + *argp++ = (unsigned long)rvalue; + +#ifdef USING_PURIFY + /* Purify will probably complain in our assembly routine, + unless we zero out this memory. */ + memset(argp, 0, 6*4); +#endif + + p_arg = cif->arg_types; + for (i = 0, nargs = cif->nargs; i < nargs; i++) + { + ffi_type *ty = p_arg[i]; + void *a = avalue[i]; + int tt = ty->type; + size_t z; + + switch (tt) + { + case FFI_TYPE_STRUCT: + case FFI_TYPE_LONGDOUBLE: + by_reference: + *argp++ = (unsigned long)a; + break; + + case FFI_TYPE_DOUBLE: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + memcpy(argp, a, 8); + argp += 2; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_FLOAT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + *argp++ = *(unsigned *)a; + break; + + case FFI_TYPE_UINT8: + *argp++ = *(UINT8 *)a; + break; + case FFI_TYPE_SINT8: + *argp++ = *(SINT8 *)a; + break; + case FFI_TYPE_UINT16: + *argp++ = *(UINT16 *)a; + break; + case FFI_TYPE_SINT16: + *argp++ = *(SINT16 *)a; + break; + + case FFI_TYPE_COMPLEX: + tt = ty->elements[0]->type; + z = ty->size; + if (tt == FFI_TYPE_FLOAT || z > 8) + goto by_reference; + if (z < 4) + { + memcpy((char *)argp + 4 - z, a, z); + argp++; + } + else + { + memcpy(argp, a, z); + argp += z / 4; + } + break; + + default: + abort(); + } + } + + return flags; +} + +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + size_t bytes = cif->bytes; + + FFI_ASSERT (cif->abi == FFI_V8); + + /* If we've not got a return value, we need to create one if we've + got to pass the return value to the callee. Otherwise ignore it. */ + if (rvalue == NULL + && (cif->flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT) + bytes += FFI_ALIGN (cif->rtype->size, 8); + + ffi_call_v8(cif, fn, rvalue, avalue, -bytes, closure); +} + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +void +ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} + +#ifdef __GNUC__ +static inline void +ffi_flush_icache (void *p) +{ + /* SPARC v8 requires 5 instructions for flush to be visible */ + asm volatile ("iflush %0; iflush %0+8; nop; nop; nop; nop; nop" + : : "r" (p) : "memory"); +} +#else +extern void ffi_flush_icache (void *) FFI_HIDDEN; +#endif + +extern void ffi_closure_v8(void) FFI_HIDDEN; +extern void ffi_go_closure_v8(void) FFI_HIDDEN; + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + unsigned long ctx = (unsigned long) closure; + unsigned long fn = (unsigned long) ffi_closure_v8; + + if (cif->abi != FFI_V8) + return FFI_BAD_ABI; + + tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */ + tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */ + tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */ + tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + ffi_flush_icache (closure); + + return FFI_OK; +} + +ffi_status +ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*)) +{ + if (cif->abi != FFI_V8) + return FFI_BAD_ABI; + + closure->tramp = ffi_go_closure_v8; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} + +int FFI_HIDDEN +ffi_closure_sparc_inner_v8(ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, void *rvalue, + unsigned long *argp) +{ + ffi_type **arg_types; + void **avalue; + int i, nargs, flags; + + arg_types = cif->arg_types; + nargs = cif->nargs; + flags = cif->flags; + avalue = alloca(nargs * sizeof(void *)); + + /* Copy the caller's structure return address so that the closure + returns the data directly to the caller. Also install it so we + can return the address in %o0. */ + if ((flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT) + { + void *new_rvalue = (void *)*argp; + *(void **)rvalue = new_rvalue; + rvalue = new_rvalue; + } + + /* Always skip the structure return address. */ + argp++; + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < nargs; i++) + { + ffi_type *ty = arg_types[i]; + int tt = ty->type; + void *a = argp; + size_t z; + + switch (tt) + { + case FFI_TYPE_STRUCT: + case FFI_TYPE_LONGDOUBLE: + by_reference: + /* Straight copy of invisible reference. */ + a = (void *)*argp; + break; + + case FFI_TYPE_DOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + if ((unsigned long)a & 7) + { + /* Align on a 8-byte boundary. */ + UINT64 *tmp = alloca(8); + *tmp = ((UINT64)argp[0] << 32) | argp[1]; + a = tmp; + } + argp++; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_FLOAT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + break; + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + a += 2; + break; + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + a += 3; + break; + + case FFI_TYPE_COMPLEX: + tt = ty->elements[0]->type; + z = ty->size; + if (tt == FFI_TYPE_FLOAT || z > 8) + goto by_reference; + if (z < 4) + a += 4 - z; + else if (z > 4) + argp++; + break; + + default: + abort(); + } + argp++; + avalue[i] = a; + } + + /* Invoke the closure. */ + fun (cif, rvalue, avalue, user_data); + + /* Tell ffi_closure_sparc how to perform return type promotions. */ + return flags; +} +#endif /* !SPARC64 */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/ffi64.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/ffi64.c new file mode 100644 index 000000000000..9e04061a4283 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/ffi64.c @@ -0,0 +1,608 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011, 2013 Anthony Green + Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. + + SPARC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> +#include <stdlib.h> +#include "internal.h" + +/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; + all further uses in this file will refer to the 128-bit type. */ +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +# if FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +#else +# undef FFI_TYPE_LONGDOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#endif + +#ifdef SPARC64 + +/* Flatten the contents of a structure to the parts that are passed in + floating point registers. The return is a bit mask wherein bit N + set means bytes [4*n, 4*n+3] are passed in %fN. + + We encode both the (running) size (maximum 32) and mask (maxumum 255) + into one integer. The size is placed in the low byte, so that align + and addition work correctly. The mask is placed in the second byte. */ + +static int +ffi_struct_float_mask (ffi_type *outer_type, int size_mask) +{ + ffi_type **elts; + ffi_type *t; + + if (outer_type->type == FFI_TYPE_COMPLEX) + { + int m = 0, tt = outer_type->elements[0]->type; + size_t z = outer_type->size; + + if (tt == FFI_TYPE_FLOAT + || tt == FFI_TYPE_DOUBLE + || tt == FFI_TYPE_LONGDOUBLE) + m = (1 << (z / 4)) - 1; + return (m << 8) | z; + } + FFI_ASSERT (outer_type->type == FFI_TYPE_STRUCT); + + for (elts = outer_type->elements; (t = *elts) != NULL; elts++) + { + size_t z = t->size; + int o, m, tt; + + size_mask = FFI_ALIGN(size_mask, t->alignment); + switch (t->type) + { + case FFI_TYPE_STRUCT: + size_mask = ffi_struct_float_mask (t, size_mask); + continue; + case FFI_TYPE_COMPLEX: + tt = t->elements[0]->type; + if (tt != FFI_TYPE_FLOAT + && tt != FFI_TYPE_DOUBLE + && tt != FFI_TYPE_LONGDOUBLE) + break; + /* FALLTHRU */ + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + m = (1 << (z / 4)) - 1; /* compute mask for type */ + o = (size_mask >> 2) & 0x3f; /* extract word offset */ + size_mask |= m << (o + 8); /* insert mask into place */ + break; + } + size_mask += z; + } + + size_mask = FFI_ALIGN(size_mask, outer_type->alignment); + FFI_ASSERT ((size_mask & 0xff) == outer_type->size); + + return size_mask; +} + +/* Merge floating point data into integer data. If the structure is + entirely floating point, simply return a pointer to the fp data. */ + +static void * +ffi_struct_float_merge (int size_mask, void *vi, void *vf) +{ + int size = size_mask & 0xff; + int mask = size_mask >> 8; + int n = size >> 2; + + if (mask == 0) + return vi; + else if (mask == (1 << n) - 1) + return vf; + else + { + unsigned int *wi = vi, *wf = vf; + int i; + + for (i = 0; i < n; ++i) + if ((mask >> i) & 1) + wi[i] = wf[i]; + + return vi; + } +} + +/* Similar, but place the data into VD in the end. */ + +void FFI_HIDDEN +ffi_struct_float_copy (int size_mask, void *vd, void *vi, void *vf) +{ + int size = size_mask & 0xff; + int mask = size_mask >> 8; + int n = size >> 2; + + if (mask == 0) + ; + else if (mask == (1 << n) - 1) + vi = vf; + else + { + unsigned int *wd = vd, *wi = vi, *wf = vf; + int i; + + for (i = 0; i < n; ++i) + wd[i] = ((mask >> i) & 1 ? wf : wi)[i]; + return; + } + memcpy (vd, vi, size); +} + +/* Perform machine dependent cif processing */ + +static ffi_status +ffi_prep_cif_machdep_core(ffi_cif *cif) +{ + ffi_type *rtype = cif->rtype; + int rtt = rtype->type; + size_t bytes = 0; + int i, n, flags; + + /* Set the return type flag */ + switch (rtt) + { + case FFI_TYPE_VOID: + flags = SPARC_RET_VOID; + break; + case FFI_TYPE_FLOAT: + flags = SPARC_RET_F_1; + break; + case FFI_TYPE_DOUBLE: + flags = SPARC_RET_F_2; + break; + case FFI_TYPE_LONGDOUBLE: + flags = SPARC_RET_F_4; + break; + + case FFI_TYPE_COMPLEX: + case FFI_TYPE_STRUCT: + if (rtype->size > 32) + { + flags = SPARC_RET_VOID | SPARC_FLAG_RET_IN_MEM; + bytes = 8; + } + else + { + int size_mask = ffi_struct_float_mask (rtype, 0); + int word_size = (size_mask >> 2) & 0x3f; + int all_mask = (1 << word_size) - 1; + int fp_mask = size_mask >> 8; + + flags = (size_mask << SPARC_SIZEMASK_SHIFT) | SPARC_RET_STRUCT; + + /* For special cases of all-int or all-fp, we can return + the value directly without popping through a struct copy. */ + if (fp_mask == 0) + { + if (rtype->alignment >= 8) + { + if (rtype->size == 8) + flags = SPARC_RET_INT64; + else if (rtype->size == 16) + flags = SPARC_RET_INT128; + } + } + else if (fp_mask == all_mask) + switch (word_size) + { + case 1: flags = SPARC_RET_F_1; break; + case 2: flags = SPARC_RET_F_2; break; + case 3: flags = SP_V9_RET_F_3; break; + case 4: flags = SPARC_RET_F_4; break; + /* 5 word structures skipped; handled via RET_STRUCT. */ + case 6: flags = SPARC_RET_F_6; break; + /* 7 word structures skipped; handled via RET_STRUCT. */ + case 8: flags = SPARC_RET_F_8; break; + } + } + break; + + case FFI_TYPE_SINT8: + flags = SPARC_RET_SINT8; + break; + case FFI_TYPE_UINT8: + flags = SPARC_RET_UINT8; + break; + case FFI_TYPE_SINT16: + flags = SPARC_RET_SINT16; + break; + case FFI_TYPE_UINT16: + flags = SPARC_RET_UINT16; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + flags = SP_V9_RET_SINT32; + break; + case FFI_TYPE_UINT32: + flags = SPARC_RET_UINT32; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + flags = SPARC_RET_INT64; + break; + + default: + abort(); + } + + bytes = 0; + for (i = 0, n = cif->nargs; i < n; ++i) + { + ffi_type *ty = cif->arg_types[i]; + size_t z = ty->size; + size_t a = ty->alignment; + + switch (ty->type) + { + case FFI_TYPE_COMPLEX: + case FFI_TYPE_STRUCT: + /* Large structs passed by reference. */ + if (z > 16) + { + a = z = 8; + break; + } + /* Small structs may be passed in integer or fp regs or both. */ + if (bytes >= 16*8) + break; + if ((ffi_struct_float_mask (ty, 0) & 0xff00) == 0) + break; + /* FALLTHRU */ + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + flags |= SPARC_FLAG_FP_ARGS; + break; + } + bytes = FFI_ALIGN(bytes, a); + bytes += FFI_ALIGN(z, 8); + } + + /* Sparc call frames require that space is allocated for 6 args, + even if they aren't used. Make that space if necessary. */ + if (bytes < 6 * 8) + bytes = 6 * 8; + + /* The stack must be 2 word aligned, so round bytes up appropriately. */ + bytes = FFI_ALIGN(bytes, 16); + + /* Include the call frame to prep_args. */ + bytes += 8*16 + 8*8; + + cif->bytes = bytes; + cif->flags = flags; + return FFI_OK; +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep(ffi_cif *cif) +{ + cif->nfixedargs = cif->nargs; + return ffi_prep_cif_machdep_core(cif); +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned nfixedargs, unsigned ntotalargs) +{ + cif->nfixedargs = nfixedargs; + return ffi_prep_cif_machdep_core(cif); +} + +extern void ffi_call_v9(ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, size_t bytes, void *closure) FFI_HIDDEN; + +/* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + +int FFI_HIDDEN +ffi_prep_args_v9(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue) +{ + ffi_type **p_arg; + int flags = cif->flags; + int i, nargs; + + if (rvalue == NULL) + { + if (flags & SPARC_FLAG_RET_IN_MEM) + { + /* Since we pass the pointer to the callee, we need a value. + We allowed for this space in ffi_call, before ffi_call_v8 + alloca'd the space. */ + rvalue = (char *)argp + cif->bytes; + } + else + { + /* Otherwise, we can ignore the return value. */ + flags = SPARC_RET_VOID; + } + } + +#ifdef USING_PURIFY + /* Purify will probably complain in our assembly routine, + unless we zero out this memory. */ + memset(argp, 0, 6*8); +#endif + + if (flags & SPARC_FLAG_RET_IN_MEM) + *argp++ = (unsigned long)rvalue; + + p_arg = cif->arg_types; + for (i = 0, nargs = cif->nargs; i < nargs; i++) + { + ffi_type *ty = p_arg[i]; + void *a = avalue[i]; + size_t z; + + switch (ty->type) + { + case FFI_TYPE_SINT8: + *argp++ = *(SINT8 *)a; + break; + case FFI_TYPE_UINT8: + *argp++ = *(UINT8 *)a; + break; + case FFI_TYPE_SINT16: + *argp++ = *(SINT16 *)a; + break; + case FFI_TYPE_UINT16: + *argp++ = *(UINT16 *)a; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + *argp++ = *(SINT32 *)a; + break; + case FFI_TYPE_UINT32: + case FFI_TYPE_FLOAT: + *argp++ = *(UINT32 *)a; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_POINTER: + case FFI_TYPE_DOUBLE: + *argp++ = *(UINT64 *)a; + break; + + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_COMPLEX: + case FFI_TYPE_STRUCT: + z = ty->size; + if (z > 16) + { + /* For structures larger than 16 bytes we pass reference. */ + *argp++ = (unsigned long)a; + break; + } + if (((unsigned long)argp & 15) && ty->alignment > 8) + argp++; + memcpy(argp, a, z); + argp += FFI_ALIGN(z, 8) / 8; + break; + + default: + abort(); + } + } + + return flags; +} + +static void +ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + size_t bytes = cif->bytes; + + FFI_ASSERT (cif->abi == FFI_V9); + + if (rvalue == NULL && (cif->flags & SPARC_FLAG_RET_IN_MEM)) + bytes += FFI_ALIGN (cif->rtype->size, 16); + + ffi_call_v9(cif, fn, rvalue, avalue, -bytes, closure); +} + +void +ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_call_int(cif, fn, rvalue, avalue, NULL); +} + +void +ffi_call_go(ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int(cif, fn, rvalue, avalue, closure); +} + +#ifdef __GNUC__ +static inline void +ffi_flush_icache (void *p) +{ + asm volatile ("flush %0; flush %0+8" : : "r" (p) : "memory"); +} +#else +extern void ffi_flush_icache (void *) FFI_HIDDEN; +#endif + +extern void ffi_closure_v9(void) FFI_HIDDEN; +extern void ffi_go_closure_v9(void) FFI_HIDDEN; + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + unsigned int *tramp = (unsigned int *) &closure->tramp[0]; + unsigned long fn; + + if (cif->abi != FFI_V9) + return FFI_BAD_ABI; + + /* Trampoline address is equal to the closure address. We take advantage + of that to reduce the trampoline size by 8 bytes. */ + fn = (unsigned long) ffi_closure_v9; + tramp[0] = 0x83414000; /* rd %pc, %g1 */ + tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */ + tramp[2] = 0x81c14000; /* jmp %g5 */ + tramp[3] = 0x01000000; /* nop */ + *((unsigned long *) &tramp[4]) = fn; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + ffi_flush_icache (closure); + + return FFI_OK; +} + +ffi_status +ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*)) +{ + if (cif->abi != FFI_V9) + return FFI_BAD_ABI; + + closure->tramp = ffi_go_closure_v9; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} + +int FFI_HIDDEN +ffi_closure_sparc_inner_v9(ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, void *rvalue, + unsigned long *gpr, unsigned long *fpr) +{ + ffi_type **arg_types; + void **avalue; + int i, argn, argx, nargs, flags, nfixedargs; + + arg_types = cif->arg_types; + nargs = cif->nargs; + flags = cif->flags; + nfixedargs = cif->nfixedargs; + + avalue = alloca(nargs * sizeof(void *)); + + /* Copy the caller's structure return address so that the closure + returns the data directly to the caller. */ + if (flags & SPARC_FLAG_RET_IN_MEM) + { + rvalue = (void *) gpr[0]; + /* Skip the structure return address. */ + argn = 1; + } + else + argn = 0; + + /* Grab the addresses of the arguments from the stack frame. */ + for (i = 0; i < nargs; i++, argn = argx) + { + int named = i < nfixedargs; + ffi_type *ty = arg_types[i]; + void *a = &gpr[argn]; + size_t z; + + argx = argn + 1; + switch (ty->type) + { + case FFI_TYPE_COMPLEX: + case FFI_TYPE_STRUCT: + z = ty->size; + if (z > 16) + a = *(void **)a; + else + { + argx = argn + FFI_ALIGN (z, 8) / 8; + if (named && argn < 16) + { + int size_mask = ffi_struct_float_mask (ty, 0); + int argn_mask = (0xffff00 >> argn) & 0xff00; + + /* Eliminate fp registers off the end. */ + size_mask = (size_mask & 0xff) | (size_mask & argn_mask); + a = ffi_struct_float_merge (size_mask, gpr+argn, fpr+argn); + } + } + break; + + case FFI_TYPE_LONGDOUBLE: + argn = FFI_ALIGN (argn, 2); + a = (named && argn < 16 ? fpr : gpr) + argn; + argx = argn + 2; + break; + case FFI_TYPE_DOUBLE: + if (named && argn < 16) + a = fpr + argn; + break; + case FFI_TYPE_FLOAT: + if (named && argn < 16) + a = fpr + argn; + a += 4; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + break; + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + a += 4; + break; + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + a += 6; + break; + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + a += 7; + break; + + default: + abort(); + } + avalue[i] = a; + } + + /* Invoke the closure. */ + fun (cif, rvalue, avalue, user_data); + + /* Tell ffi_closure_sparc how to perform return type promotions. */ + return flags; +} +#endif /* SPARC64 */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/ffitarget.h new file mode 100644 index 000000000000..2f4cd9a7a933 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/ffitarget.h @@ -0,0 +1,81 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Anthony Green + Copyright (c) 1996-2003 Red Hat, Inc. + Target configuration macros for SPARC. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- System specific configurations ----------------------------------- */ + +#if defined(__arch64__) || defined(__sparcv9) +#ifndef SPARC64 +#define SPARC64 +#endif +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, +#ifdef SPARC64 + FFI_V9, + FFI_DEFAULT_ABI = FFI_V9, +#else + FFI_V8, + FFI_DEFAULT_ABI = FFI_V8, +#endif + FFI_LAST_ABI +} ffi_abi; +#endif + +#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION 1 +#define FFI_TARGET_HAS_COMPLEX_TYPE 1 + +#ifdef SPARC64 +# define FFI_TARGET_SPECIFIC_VARIADIC 1 +# define FFI_EXTRA_CIF_FIELDS unsigned int nfixedargs +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_GO_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 + +#ifdef SPARC64 +#define FFI_TRAMPOLINE_SIZE 24 +#else +#define FFI_TRAMPOLINE_SIZE 16 +#endif + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/internal.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/internal.h new file mode 100644 index 000000000000..0a66472bade8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/internal.h @@ -0,0 +1,26 @@ +#define SPARC_RET_VOID 0 +#define SPARC_RET_STRUCT 1 +#define SPARC_RET_UINT8 2 +#define SPARC_RET_SINT8 3 +#define SPARC_RET_UINT16 4 +#define SPARC_RET_SINT16 5 +#define SPARC_RET_UINT32 6 +#define SP_V9_RET_SINT32 7 /* v9 only */ +#define SP_V8_RET_CPLX16 7 /* v8 only */ +#define SPARC_RET_INT64 8 +#define SPARC_RET_INT128 9 + +/* Note that F_7 is missing, and is handled by SPARC_RET_STRUCT. */ +#define SPARC_RET_F_8 10 +#define SPARC_RET_F_6 11 +#define SPARC_RET_F_4 12 +#define SPARC_RET_F_2 13 +#define SP_V9_RET_F_3 14 /* v9 only */ +#define SP_V8_RET_CPLX8 14 /* v8 only */ +#define SPARC_RET_F_1 15 + +#define SPARC_FLAG_RET_MASK 15 +#define SPARC_FLAG_RET_IN_MEM 32 +#define SPARC_FLAG_FP_ARGS 64 + +#define SPARC_SIZEMASK_SHIFT 8 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/v8.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/v8.S new file mode 100644 index 000000000000..a2e4908fd417 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/v8.S @@ -0,0 +1,443 @@ +/* ----------------------------------------------------------------------- + v8.S - Copyright (c) 2013 The Written Word, Inc. + Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. + + SPARC Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include "internal.h" + +#ifndef SPARC64 + +#define C2(X, Y) X ## Y +#define C1(X, Y) C2(X, Y) + +#ifdef __USER_LABEL_PREFIX__ +# define C(Y) C1(__USER_LABEL_PREFIX__, Y) +#else +# define C(Y) Y +#endif +#define L(Y) C1(.L, Y) + + .text + +#ifndef __GNUC__ + .align 8 + .globl C(ffi_flush_icache) + .type C(ffi_flush_icache),#function + FFI_HIDDEN(C(ffi_flush_icache)) + +C(ffi_flush_icache): +1: iflush %o0 + iflush %o+8 + nop + nop + nop + nop + nop + retl + nop + .size C(ffi_flush_icache), . - C(ffi_flush_icache) +#endif + +#if defined(__sun__) && defined(__svr4__) +# define E(INDEX) .align 16 +#else +# define E(INDEX) .align 16; .org 2b + INDEX * 16 +#endif + + .align 8 + .globl C(ffi_call_v8) + .type C(ffi_call_v8),#function + FFI_HIDDEN(C(ffi_call_v8)) + +C(ffi_call_v8): +.LUW0: + ! Allocate a stack frame sized by ffi_call. + save %sp, %o4, %sp +.LUW1: + mov %i0, %o0 ! copy cif + add %sp, 64+32, %o1 ! load args area + mov %i2, %o2 ! copy rvalue + call C(ffi_prep_args_v8) + mov %i3, %o3 ! copy avalue + + add %sp, 32, %sp ! deallocate prep frame + and %o0, SPARC_FLAG_RET_MASK, %l0 ! save return type + srl %o0, SPARC_SIZEMASK_SHIFT, %l1 ! save return size + ld [%sp+64+4], %o0 ! load all argument registers + ld [%sp+64+8], %o1 + ld [%sp+64+12], %o2 + ld [%sp+64+16], %o3 + cmp %l0, SPARC_RET_STRUCT ! struct return needs an unimp 4 + ld [%sp+64+20], %o4 + be 8f + ld [%sp+64+24], %o5 + + ! Call foreign function + call %i1 + mov %i5, %g2 ! load static chain + +0: call 1f ! load pc in %o7 + sll %l0, 4, %l0 +1: add %o7, %l0, %o7 ! o7 = 0b + ret_type*16 + jmp %o7+(2f-0b) + nop + + ! Note that each entry is 4 insns, enforced by the E macro. + .align 16 +2: +E(SPARC_RET_VOID) + ret + restore +E(SPARC_RET_STRUCT) + unimp +E(SPARC_RET_UINT8) + and %o0, 0xff, %o0 + st %o0, [%i2] + ret + restore +E(SPARC_RET_SINT8) + sll %o0, 24, %o0 + b 7f + sra %o0, 24, %o0 +E(SPARC_RET_UINT16) + sll %o0, 16, %o0 + b 7f + srl %o0, 16, %o0 +E(SPARC_RET_SINT16) + sll %o0, 16, %o0 + b 7f + sra %o0, 16, %o0 +E(SPARC_RET_UINT32) +7: st %o0, [%i2] + ret + restore +E(SP_V8_RET_CPLX16) + sth %o0, [%i2+2] + b 9f + srl %o0, 16, %o0 +E(SPARC_RET_INT64) + st %o0, [%i2] + st %o1, [%i2+4] + ret + restore +E(SPARC_RET_INT128) + std %o0, [%i2] + std %o2, [%i2+8] + ret + restore +E(SPARC_RET_F_8) + st %f7, [%i2+7*4] + nop + st %f6, [%i2+6*4] + nop +E(SPARC_RET_F_6) + st %f5, [%i2+5*4] + nop + st %f4, [%i2+4*4] + nop +E(SPARC_RET_F_4) + st %f3, [%i2+3*4] + nop + st %f2, [%i2+2*4] + nop +E(SPARC_RET_F_2) + st %f1, [%i2+4] + st %f0, [%i2] + ret + restore +E(SP_V8_RET_CPLX8) + stb %o0, [%i2+1] + b 0f + srl %o0, 8, %o0 +E(SPARC_RET_F_1) + st %f0, [%i2] + ret + restore + + .align 8 +9: sth %o0, [%i2] + ret + restore + .align 8 +0: stb %o0, [%i2] + ret + restore + + ! Struct returning functions expect and skip the unimp here. + ! To make it worse, conforming callees examine the unimp and + ! make sure the low 12 bits of the unimp match the size of + ! the struct being returned. + .align 8 +8: call 1f ! load pc in %o7 + sll %l1, 2, %l0 ! size * 4 +1: sll %l1, 4, %l1 ! size * 16 + add %l0, %l1, %l0 ! size * 20 + add %o7, %l0, %o7 ! o7 = 8b + size*20 + jmp %o7+(2f-8b) + mov %i5, %g2 ! load static chain +2: + +/* The Sun assembler doesn't understand .rept 0x1000. */ +#define rept1 \ + call %i1; \ + nop; \ + unimp (. - 2b) / 20; \ + ret; \ + restore + +#define rept16 \ + rept1; rept1; rept1; rept1; \ + rept1; rept1; rept1; rept1; \ + rept1; rept1; rept1; rept1; \ + rept1; rept1; rept1; rept1 + +#define rept256 \ + rept16; rept16; rept16; rept16; \ + rept16; rept16; rept16; rept16; \ + rept16; rept16; rept16; rept16; \ + rept16; rept16; rept16; rept16 + + rept256; rept256; rept256; rept256 + rept256; rept256; rept256; rept256 + rept256; rept256; rept256; rept256 + rept256; rept256; rept256; rept256 + +.LUW2: + .size C(ffi_call_v8),. - C(ffi_call_v8) + + +/* 16*4 register window + 1*4 struct return + 6*4 args backing store + + 8*4 return storage + 1*4 alignment. */ +#define STACKFRAME (16*4 + 4 + 6*4 + 8*4 + 4) + +/* ffi_closure_v8(...) + + Receives the closure argument in %g2. */ + +#ifdef HAVE_AS_REGISTER_PSEUDO_OP + .register %g2, #scratch +#endif + + .align 8 + .globl C(ffi_go_closure_v8) + .type C(ffi_go_closure_v8),#function + FFI_HIDDEN(C(ffi_go_closure_v8)) + +C(ffi_go_closure_v8): +.LUW3: + save %sp, -STACKFRAME, %sp +.LUW4: + ld [%g2+4], %o0 ! load cif + ld [%g2+8], %o1 ! load fun + b 0f + mov %g2, %o2 ! load user_data +.LUW5: + .size C(ffi_go_closure_v8), . - C(ffi_go_closure_v8) + + .align 8 + .globl C(ffi_closure_v8) + .type C(ffi_closure_v8),#function + FFI_HIDDEN(C(ffi_closure_v8)) + +C(ffi_closure_v8): +.LUW6: + save %sp, -STACKFRAME, %sp +.LUW7: + ld [%g2+FFI_TRAMPOLINE_SIZE], %o0 ! load cif + ld [%g2+FFI_TRAMPOLINE_SIZE+4], %o1 ! load fun + ld [%g2+FFI_TRAMPOLINE_SIZE+8], %o2 ! load user_data +0: + ! Store all of the potential argument registers in va_list format. + st %i0, [%fp+68+0] + st %i1, [%fp+68+4] + st %i2, [%fp+68+8] + st %i3, [%fp+68+12] + st %i4, [%fp+68+16] + st %i5, [%fp+68+20] + + ! Call ffi_closure_sparc_inner to do the bulk of the work. + add %fp, -8*4, %o3 + call ffi_closure_sparc_inner_v8 + add %fp, 64, %o4 + +0: call 1f + and %o0, SPARC_FLAG_RET_MASK, %o0 +1: sll %o0, 4, %o0 ! o0 = o0 * 16 + add %o7, %o0, %o7 ! o7 = 0b + o0*16 + jmp %o7+(2f-0b) + add %fp, -8*4, %i2 + + ! Note that each entry is 4 insns, enforced by the E macro. + .align 16 +2: +E(SPARC_RET_VOID) + ret + restore +E(SPARC_RET_STRUCT) + ld [%i2], %i0 + jmp %i7+12 + restore +E(SPARC_RET_UINT8) + ldub [%i2+3], %i0 + ret + restore +E(SPARC_RET_SINT8) + ldsb [%i2+3], %i0 + ret + restore +E(SPARC_RET_UINT16) + lduh [%i2+2], %i0 + ret + restore +E(SPARC_RET_SINT16) + ldsh [%i2+2], %i0 + ret + restore +E(SPARC_RET_UINT32) + ld [%i2], %i0 + ret + restore +E(SP_V8_RET_CPLX16) + ld [%i2], %i0 + ret + restore +E(SPARC_RET_INT64) + ldd [%i2], %i0 + ret + restore +E(SPARC_RET_INT128) + ldd [%i2], %i0 + ldd [%i2+8], %i2 + ret + restore +E(SPARC_RET_F_8) + ld [%i2+7*4], %f7 + nop + ld [%i2+6*4], %f6 + nop +E(SPARC_RET_F_6) + ld [%i2+5*4], %f5 + nop + ld [%i2+4*4], %f4 + nop +E(SPARC_RET_F_4) + ld [%i2+3*4], %f3 + nop + ld [%i2+2*4], %f2 + nop +E(SPARC_RET_F_2) + ldd [%i2], %f0 + ret + restore +E(SP_V8_RET_CPLX8) + lduh [%i2], %i0 + ret + restore +E(SPARC_RET_F_1) + ld [%i2], %f0 + ret + restore + +.LUW8: + .size C(ffi_closure_v8), . - C(ffi_closure_v8) + +#ifdef HAVE_RO_EH_FRAME + .section ".eh_frame",#alloc +#else + .section ".eh_frame",#alloc,#write +#endif + +#ifdef HAVE_AS_SPARC_UA_PCREL +# define FDE_ADDR(X) %r_disp32(X) +#else +# define FDE_ADDR(X) X +#endif + + .align 4 +.LCIE: + .long .LECIE - .LSCIE ! CIE Length +.LSCIE: + .long 0 ! CIE Identifier Tag + .byte 1 ! CIE Version + .ascii "zR\0" ! CIE Augmentation + .byte 4 ! CIE Code Alignment Factor + .byte 0x7c ! CIE Data Alignment Factor + .byte 15 ! CIE RA Column + .byte 1 ! Augmentation size +#ifdef HAVE_AS_SPARC_UA_PCREL + .byte 0x1b ! FDE Encoding (pcrel sdata4) +#else + .byte 0x50 ! FDE Encoding (aligned absolute) +#endif + .byte 0xc, 14, 0 ! DW_CFA_def_cfa, %o6, offset 0 + .align 4 +.LECIE: + + .long .LEFDE1 - .LSFDE1 ! FDE Length +.LSFDE1: + .long .LSFDE1 - .LCIE ! FDE CIE offset + .long FDE_ADDR(.LUW0) ! Initial location + .long .LUW2 - .LUW0 ! Address range + .byte 0 ! Augmentation size + .byte 0x40+1 ! DW_CFA_advance_loc 4 + .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 + .align 4 +.LEFDE1: + + .long .LEFDE2 - .LSFDE2 ! FDE Length +.LSFDE2: + .long .LSFDE2 - .LCIE ! FDE CIE offset + .long FDE_ADDR(.LUW3) ! Initial location + .long .LUW5 - .LUW3 ! Address range + .byte 0 ! Augmentation size + .byte 0x40+1 ! DW_CFA_advance_loc 4 + .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 + .align 4 +.LEFDE2: + + .long .LEFDE3 - .LSFDE3 ! FDE Length +.LSFDE3: + .long .LSFDE3 - .LCIE ! FDE CIE offset + .long FDE_ADDR(.LUW6) ! Initial location + .long .LUW8 - .LUW6 ! Address range + .byte 0 ! Augmentation size + .byte 0x40+1 ! DW_CFA_advance_loc 4 + .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 + .align 4 +.LEFDE3: + +#endif /* !SPARC64 */ +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/v9.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/v9.S new file mode 100644 index 000000000000..55f8f4324cfe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/sparc/v9.S @@ -0,0 +1,440 @@ +/* ----------------------------------------------------------------------- + v9.S - Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc. + + SPARC 64-bit Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include "internal.h" + +#ifdef SPARC64 + +#define C2(X, Y) X ## Y +#define C1(X, Y) C2(X, Y) + +#ifdef __USER_LABEL_PREFIX__ +# define C(Y) C1(__USER_LABEL_PREFIX__, Y) +#else +# define C(Y) Y +#endif +#define L(Y) C1(.L, Y) + +#if defined(__sun__) && defined(__svr4__) +# define E(INDEX) .align 16 +#else +# define E(INDEX) .align 16; .org 2b + INDEX * 16 +#endif + +#define STACK_BIAS 2047 + + .text + .align 8 + .globl C(ffi_call_v9) + .type C(ffi_call_v9),#function + FFI_HIDDEN(C(ffi_call_v9)) + +C(ffi_call_v9): +.LUW0: + save %sp, %o4, %sp +.LUW1: + mov %i0, %o0 ! copy cif + add %sp, STACK_BIAS+128+48, %o1 ! load args area + mov %i2, %o2 ! copy rvalue + call C(ffi_prep_args_v9) + mov %i3, %o3 ! copy avalue + + andcc %o0, SPARC_FLAG_FP_ARGS, %g0 ! need fp regs? + add %sp, 48, %sp ! deallocate prep frame + be,pt %xcc, 1f + mov %o0, %l0 ! save flags + + ldd [%sp+STACK_BIAS+128], %f0 ! load all fp arg regs + ldd [%sp+STACK_BIAS+128+8], %f2 + ldd [%sp+STACK_BIAS+128+16], %f4 + ldd [%sp+STACK_BIAS+128+24], %f6 + ldd [%sp+STACK_BIAS+128+32], %f8 + ldd [%sp+STACK_BIAS+128+40], %f10 + ldd [%sp+STACK_BIAS+128+48], %f12 + ldd [%sp+STACK_BIAS+128+56], %f14 + ldd [%sp+STACK_BIAS+128+64], %f16 + ldd [%sp+STACK_BIAS+128+72], %f18 + ldd [%sp+STACK_BIAS+128+80], %f20 + ldd [%sp+STACK_BIAS+128+88], %f22 + ldd [%sp+STACK_BIAS+128+96], %f24 + ldd [%sp+STACK_BIAS+128+104], %f26 + ldd [%sp+STACK_BIAS+128+112], %f28 + ldd [%sp+STACK_BIAS+128+120], %f30 + +1: ldx [%sp+STACK_BIAS+128], %o0 ! load all int arg regs + ldx [%sp+STACK_BIAS+128+8], %o1 + ldx [%sp+STACK_BIAS+128+16], %o2 + ldx [%sp+STACK_BIAS+128+24], %o3 + ldx [%sp+STACK_BIAS+128+32], %o4 + ldx [%sp+STACK_BIAS+128+40], %o5 + call %i1 + mov %i5, %g5 ! load static chain + +0: call 1f ! load pc in %o7 + and %l0, SPARC_FLAG_RET_MASK, %l1 +1: sll %l1, 4, %l1 + add %o7, %l1, %o7 ! o7 = 0b + ret_type*16 + jmp %o7+(2f-0b) + nop + + .align 16 +2: +E(SPARC_RET_VOID) + return %i7+8 + nop +E(SPARC_RET_STRUCT) + add %sp, STACK_BIAS-64+128+48, %l2 + sub %sp, 64, %sp + b 8f + stx %o0, [%l2] +E(SPARC_RET_UINT8) + and %o0, 0xff, %i0 + return %i7+8 + stx %o0, [%o2] +E(SPARC_RET_SINT8) + sll %o0, 24, %o0 + sra %o0, 24, %i0 + return %i7+8 + stx %o0, [%o2] +E(SPARC_RET_UINT16) + sll %o0, 16, %o0 + srl %o0, 16, %i0 + return %i7+8 + stx %o0, [%o2] +E(SPARC_RET_SINT16) + sll %o0, 16, %o0 + sra %o0, 16, %i0 + return %i7+8 + stx %o0, [%o2] +E(SPARC_RET_UINT32) + srl %o0, 0, %i0 + return %i7+8 + stx %o0, [%o2] +E(SP_V9_RET_SINT32) + sra %o0, 0, %i0 + return %i7+8 + stx %o0, [%o2] +E(SPARC_RET_INT64) + stx %o0, [%i2] + return %i7+8 + nop +E(SPARC_RET_INT128) + stx %o0, [%i2] + stx %o1, [%i2+8] + return %i7+8 + nop +E(SPARC_RET_F_8) + st %f7, [%i2+7*4] + nop + st %f6, [%i2+6*4] + nop +E(SPARC_RET_F_6) + st %f5, [%i2+5*4] + nop + st %f4, [%i2+4*4] + nop +E(SPARC_RET_F_4) + std %f2, [%i2+2*4] + return %i7+8 + std %f0, [%o2] +E(SPARC_RET_F_2) + return %i7+8 + std %f0, [%o2] +E(SP_V9_RET_F_3) + st %f2, [%i2+2*4] + nop + st %f1, [%i2+1*4] + nop +E(SPARC_RET_F_1) + return %i7+8 + st %f0, [%o2] + + ! Finish the SPARC_RET_STRUCT sequence. + .align 8 +8: stx %o1, [%l2+8] + stx %o2, [%l2+16] + stx %o3, [%l2+24] + std %f0, [%l2+32] + std %f2, [%l2+40] + std %f4, [%l2+48] + std %f6, [%l2+56] + + ! Copy the structure into place. + srl %l0, SPARC_SIZEMASK_SHIFT, %o0 ! load size_mask + mov %i2, %o1 ! load dst + mov %l2, %o2 ! load src_gp + call C(ffi_struct_float_copy) + add %l2, 32, %o3 ! load src_fp + + return %i7+8 + nop + +.LUW2: + .size C(ffi_call_v9), . - C(ffi_call_v9) + + +#undef STACKFRAME +#define STACKFRAME 336 /* 16*8 register window + + 6*8 args backing store + + 20*8 locals */ +#define FP %fp+STACK_BIAS + +/* ffi_closure_v9(...) + + Receives the closure argument in %g1. */ + + .align 8 + .globl C(ffi_go_closure_v9) + .type C(ffi_go_closure_v9),#function + FFI_HIDDEN(C(ffi_go_closure_v9)) + +C(ffi_go_closure_v9): +.LUW3: + save %sp, -STACKFRAME, %sp +.LUW4: + ldx [%g5+8], %o0 + ldx [%g5+16], %o1 + b 0f + mov %g5, %o2 + +.LUW5: + .size C(ffi_go_closure_v9), . - C(ffi_go_closure_v9) + + .align 8 + .globl C(ffi_closure_v9) + .type C(ffi_closure_v9),#function + FFI_HIDDEN(C(ffi_closure_v9)) + +C(ffi_closure_v9): +.LUW6: + save %sp, -STACKFRAME, %sp +.LUW7: + ldx [%g1+FFI_TRAMPOLINE_SIZE], %o0 + ldx [%g1+FFI_TRAMPOLINE_SIZE+8], %o1 + ldx [%g1+FFI_TRAMPOLINE_SIZE+16], %o2 +0: + ! Store all of the potential argument registers in va_list format. + stx %i0, [FP+128+0] + stx %i1, [FP+128+8] + stx %i2, [FP+128+16] + stx %i3, [FP+128+24] + stx %i4, [FP+128+32] + stx %i5, [FP+128+40] + + ! Store possible floating point argument registers too. + std %f0, [FP-128] + std %f2, [FP-120] + std %f4, [FP-112] + std %f6, [FP-104] + std %f8, [FP-96] + std %f10, [FP-88] + std %f12, [FP-80] + std %f14, [FP-72] + std %f16, [FP-64] + std %f18, [FP-56] + std %f20, [FP-48] + std %f22, [FP-40] + std %f24, [FP-32] + std %f26, [FP-24] + std %f28, [FP-16] + std %f30, [FP-8] + + ! Call ffi_closure_sparc_inner to do the bulk of the work. + add %fp, STACK_BIAS-160, %o3 + add %fp, STACK_BIAS+128, %o4 + call C(ffi_closure_sparc_inner_v9) + add %fp, STACK_BIAS-128, %o5 + +0: call 1f ! load pc in %o7 + and %o0, SPARC_FLAG_RET_MASK, %o0 +1: sll %o0, 4, %o0 ! o2 = i2 * 16 + add %o7, %o0, %o7 ! o7 = 0b + i2*16 + jmp %o7+(2f-0b) + nop + + ! Note that we cannot load the data in the delay slot of + ! the return insn because the data is in the stack frame + ! that is deallocated by the return. + .align 16 +2: +E(SPARC_RET_VOID) + return %i7+8 + nop +E(SPARC_RET_STRUCT) + ldx [FP-160], %i0 + ldd [FP-160], %f0 + b 8f + ldx [FP-152], %i1 +E(SPARC_RET_UINT8) + ldub [FP-160+7], %i0 + return %i7+8 + nop +E(SPARC_RET_SINT8) + ldsb [FP-160+7], %i0 + return %i7+8 + nop +E(SPARC_RET_UINT16) + lduh [FP-160+6], %i0 + return %i7+8 + nop +E(SPARC_RET_SINT16) + ldsh [FP-160+6], %i0 + return %i7+8 + nop +E(SPARC_RET_UINT32) + lduw [FP-160+4], %i0 + return %i7+8 + nop +E(SP_V9_RET_SINT32) + ldsw [FP-160+4], %i0 + return %i7+8 + nop +E(SPARC_RET_INT64) + ldx [FP-160], %i0 + return %i7+8 + nop +E(SPARC_RET_INT128) + ldx [FP-160], %i0 + ldx [FP-160+8], %i1 + return %i7+8 + nop +E(SPARC_RET_F_8) + ld [FP-160+7*4], %f7 + nop + ld [FP-160+6*4], %f6 + nop +E(SPARC_RET_F_6) + ld [FP-160+5*4], %f5 + nop + ld [FP-160+4*4], %f4 + nop +E(SPARC_RET_F_4) + ldd [FP-160], %f0 + ldd [FP-160+8], %f2 + return %i7+8 + nop +E(SPARC_RET_F_2) + ldd [FP-160], %f0 + return %i7+8 + nop +E(SP_V9_RET_F_3) + ld [FP-160+2*4], %f2 + nop + ld [FP-160+1*4], %f1 + nop +E(SPARC_RET_F_1) + ld [FP-160], %f0 + return %i7+8 + nop + + ! Finish the SPARC_RET_STRUCT sequence. + .align 8 +8: ldd [FP-152], %f2 + ldx [FP-144], %i2 + ldd [FP-144], %f4 + ldx [FP-136], %i3 + ldd [FP-136], %f6 + return %i7+8 + nop + +.LUW8: + .size C(ffi_closure_v9), . - C(ffi_closure_v9) + +#ifdef HAVE_RO_EH_FRAME + .section ".eh_frame",#alloc +#else + .section ".eh_frame",#alloc,#write +#endif + +#ifdef HAVE_AS_SPARC_UA_PCREL +# define FDE_RANGE(B, E) .long %r_disp32(B), E - B +#else +# define FDE_RANGE(B, E) .align 8; .xword B, E - B +#endif + + .align 8 +.LCIE: + .long .LECIE - .LSCIE ! CIE Length +.LSCIE: + .long 0 ! CIE Identifier Tag + .byte 1 ! CIE Version + .ascii "zR\0" ! CIE Augmentation + .byte 4 ! CIE Code Alignment Factor + .byte 0x78 ! CIE Data Alignment Factor + .byte 15 ! CIE RA Column + .byte 1 ! Augmentation size +#ifdef HAVE_AS_SPARC_UA_PCREL + .byte 0x1b ! FDE Encoding (pcrel sdata4) +#else + .byte 0x50 ! FDE Encoding (aligned absolute) +#endif + .byte 0xc, 14, 0xff, 0xf ! DW_CFA_def_cfa, %o6, offset 0x7ff + .align 8 +.LECIE: + + .long .LEFDE1 - .LSFDE1 ! FDE Length +.LSFDE1: + .long .LSFDE1 - .LCIE ! FDE CIE offset + FDE_RANGE(.LUW0, .LUW2) + .byte 0 ! Augmentation size + .byte 0x40+1 ! DW_CFA_advance_loc 4 + .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 + .align 8 +.LEFDE1: + + .long .LEFDE2 - .LSFDE2 ! FDE Length +.LSFDE2: + .long .LSFDE2 - .LCIE ! FDE CIE offset + FDE_RANGE(.LUW3, .LUW5) + .byte 0 ! Augmentation size + .byte 0x40+1 ! DW_CFA_advance_loc 4 + .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 + .align 8 +.LEFDE2: + + .long .LEFDE3 - .LSFDE3 ! FDE Length +.LSFDE3: + .long .LSFDE3 - .LCIE ! FDE CIE offset + FDE_RANGE(.LUW6, .LUW8) + .byte 0 ! Augmentation size + .byte 0x40+1 ! DW_CFA_advance_loc 4 + .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 + .align 8 +.LEFDE3: + +#endif /* SPARC64 */ +#ifdef __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/tile/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/tile/ffi.c new file mode 100644 index 000000000000..3a94469c7faf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/tile/ffi.c @@ -0,0 +1,355 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2012 Tilera Corp. + + TILE Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> +#include <stdlib.h> +#include <stdint.h> +#include <unistd.h> +#include <arch/abi.h> +#include <arch/icache.h> +#include <arch/opcode.h> + + +/* The first 10 registers are used to pass arguments and return values. */ +#define NUM_ARG_REGS 10 + +/* Performs a raw function call with the given NUM_ARG_REGS register arguments + and the specified additional stack arguments (if any). */ +extern void ffi_call_tile(ffi_sarg reg_args[NUM_ARG_REGS], + const ffi_sarg *stack_args, + size_t stack_args_bytes, + void (*fnaddr)(void)) + FFI_HIDDEN; + +/* This handles the raw call from the closure stub, cleaning up the + parameters and delegating to ffi_closure_tile_inner. */ +extern void ffi_closure_tile(void) FFI_HIDDEN; + + +ffi_status +ffi_prep_cif_machdep(ffi_cif *cif) +{ + /* We always allocate room for all registers. Even if we don't + use them as parameters, they get returned in the same array + as struct return values so we need to make room. */ + if (cif->bytes < NUM_ARG_REGS * FFI_SIZEOF_ARG) + cif->bytes = NUM_ARG_REGS * FFI_SIZEOF_ARG; + + if (cif->rtype->size > NUM_ARG_REGS * FFI_SIZEOF_ARG) + cif->flags = FFI_TYPE_STRUCT; + else + cif->flags = FFI_TYPE_INT; + + /* Nothing to do. */ + return FFI_OK; +} + + +static long +assign_to_ffi_arg(ffi_sarg *out, void *in, const ffi_type *type, + int write_to_reg) +{ + switch (type->type) + { + case FFI_TYPE_SINT8: + *out = *(SINT8 *)in; + return 1; + + case FFI_TYPE_UINT8: + *out = *(UINT8 *)in; + return 1; + + case FFI_TYPE_SINT16: + *out = *(SINT16 *)in; + return 1; + + case FFI_TYPE_UINT16: + *out = *(UINT16 *)in; + return 1; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: +#ifndef __LP64__ + case FFI_TYPE_POINTER: +#endif + /* Note that even unsigned 32-bit quantities are sign extended + on tilegx when stored in a register. */ + *out = *(SINT32 *)in; + return 1; + + case FFI_TYPE_FLOAT: +#ifdef __tilegx__ + if (write_to_reg) + { + /* Properly sign extend the value. */ + union { float f; SINT32 s32; } val; + val.f = *(float *)in; + *out = val.s32; + } + else +#endif + { + *(float *)out = *(float *)in; + } + return 1; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: +#ifdef __LP64__ + case FFI_TYPE_POINTER: +#endif + *(UINT64 *)out = *(UINT64 *)in; + return sizeof(UINT64) / FFI_SIZEOF_ARG; + + case FFI_TYPE_STRUCT: + memcpy(out, in, type->size); + return (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; + + case FFI_TYPE_VOID: + /* Must be a return type. Nothing to do. */ + return 0; + + default: + FFI_ASSERT(0); + return -1; + } +} + + +void +ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_sarg * const arg_mem = alloca(cif->bytes); + ffi_sarg * const reg_args = arg_mem; + ffi_sarg * const stack_args = &reg_args[NUM_ARG_REGS]; + ffi_sarg *argp = arg_mem; + ffi_type ** const arg_types = cif->arg_types; + const long num_args = cif->nargs; + long i; + + if (cif->flags == FFI_TYPE_STRUCT) + { + /* Pass a hidden pointer to the return value. We make sure there + is scratch space for the callee to store the return value even if + our caller doesn't care about it. */ + *argp++ = (intptr_t)(rvalue ? rvalue : alloca(cif->rtype->size)); + + /* No more work needed to return anything. */ + rvalue = NULL; + } + + for (i = 0; i < num_args; i++) + { + ffi_type *type = arg_types[i]; + void * const arg_in = avalue[i]; + ptrdiff_t arg_word = argp - arg_mem; + +#ifndef __tilegx__ + /* Doubleword-aligned values are always in an even-number register + pair, or doubleword-aligned stack slot if out of registers. */ + long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); + argp += align; + arg_word += align; +#endif + + if (type->type == FFI_TYPE_STRUCT) + { + const size_t arg_size_in_words = + (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; + + if (arg_word < NUM_ARG_REGS && + arg_word + arg_size_in_words > NUM_ARG_REGS) + { + /* Args are not allowed to span registers and the stack. */ + argp = stack_args; + } + + memcpy(argp, arg_in, type->size); + argp += arg_size_in_words; + } + else + { + argp += assign_to_ffi_arg(argp, arg_in, arg_types[i], 1); + } + } + + /* Actually do the call. */ + ffi_call_tile(reg_args, stack_args, + cif->bytes - (NUM_ARG_REGS * FFI_SIZEOF_ARG), fn); + + if (rvalue != NULL) + assign_to_ffi_arg(rvalue, reg_args, cif->rtype, 0); +} + + +/* Template code for closure. */ +extern const UINT64 ffi_template_tramp_tile[] FFI_HIDDEN; + + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ +#ifdef __tilegx__ + /* TILE-Gx */ + SINT64 c; + SINT64 h; + int s; + UINT64 *out; + + if (cif->abi != FFI_UNIX) + return FFI_BAD_ABI; + + out = (UINT64 *)closure->tramp; + + c = (intptr_t)closure; + h = (intptr_t)ffi_closure_tile; + s = 0; + + /* Find the smallest shift count that doesn't lose information + (i.e. no need to explicitly insert high bits of the address that + are just the sign extension of the low bits). */ + while ((c >> s) != (SINT16)(c >> s) || (h >> s) != (SINT16)(h >> s)) + s += 16; + +#define OPS(a, b, shift) \ + (create_Imm16_X0((a) >> (shift)) | create_Imm16_X1((b) >> (shift))) + + /* Emit the moveli. */ + *out++ = ffi_template_tramp_tile[0] | OPS(c, h, s); + for (s -= 16; s >= 0; s -= 16) + *out++ = ffi_template_tramp_tile[1] | OPS(c, h, s); + +#undef OPS + + *out++ = ffi_template_tramp_tile[2]; + +#else + /* TILEPro */ + UINT64 *out; + intptr_t delta; + + if (cif->abi != FFI_UNIX) + return FFI_BAD_ABI; + + out = (UINT64 *)closure->tramp; + delta = (intptr_t)ffi_closure_tile - (intptr_t)codeloc; + + *out++ = ffi_template_tramp_tile[0] | create_JOffLong_X1(delta >> 3); +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + invalidate_icache(closure->tramp, (char *)out - closure->tramp, + getpagesize()); + + return FFI_OK; +} + + +/* This is called by the assembly wrapper for closures. This does + all of the work. On entry reg_args[0] holds the values the registers + had when the closure was invoked. On return reg_args[1] holds the register + values to be returned to the caller (many of which may be garbage). */ +void FFI_HIDDEN +ffi_closure_tile_inner(ffi_closure *closure, + ffi_sarg reg_args[2][NUM_ARG_REGS], + ffi_sarg *stack_args) +{ + ffi_cif * const cif = closure->cif; + void ** const avalue = alloca(cif->nargs * sizeof(void *)); + void *rvalue; + ffi_type ** const arg_types = cif->arg_types; + ffi_sarg * const reg_args_in = reg_args[0]; + ffi_sarg * const reg_args_out = reg_args[1]; + ffi_sarg * argp; + long i, arg_word, nargs = cif->nargs; + /* Use a union to guarantee proper alignment for double. */ + union { ffi_sarg arg[NUM_ARG_REGS]; double d; UINT64 u64; } closure_ret; + + /* Start out reading register arguments. */ + argp = reg_args_in; + + /* Copy the caller's structure return address to that the closure + returns the data directly to the caller. */ + if (cif->flags == FFI_TYPE_STRUCT) + { + /* Return by reference via hidden pointer. */ + rvalue = (void *)(intptr_t)*argp++; + arg_word = 1; + } + else + { + /* Return the value in registers. */ + rvalue = &closure_ret; + arg_word = 0; + } + + /* Grab the addresses of the arguments. */ + for (i = 0; i < nargs; i++) + { + ffi_type * const type = arg_types[i]; + const size_t arg_size_in_words = + (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; + +#ifndef __tilegx__ + /* Doubleword-aligned values are always in an even-number register + pair, or doubleword-aligned stack slot if out of registers. */ + long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); + argp += align; + arg_word += align; +#endif + + if (arg_word == NUM_ARG_REGS || + (arg_word < NUM_ARG_REGS && + arg_word + arg_size_in_words > NUM_ARG_REGS)) + { + /* Switch to reading arguments from the stack. */ + argp = stack_args; + arg_word = NUM_ARG_REGS; + } + + avalue[i] = argp; + argp += arg_size_in_words; + arg_word += arg_size_in_words; + } + + /* Invoke the closure. */ + closure->fun(cif, rvalue, avalue, closure->user_data); + + if (cif->flags != FFI_TYPE_STRUCT) + { + /* Canonicalize for register representation. */ + assign_to_ffi_arg(reg_args_out, &closure_ret, cif->rtype, 1); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/tile/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/tile/ffitarget.h new file mode 100644 index 000000000000..679fb5d904b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/tile/ffitarget.h @@ -0,0 +1,65 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012 Tilera Corp. + Target configuration macros for TILE. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM + +#include <arch/abi.h> + +typedef uint_reg_t ffi_arg; +typedef int_reg_t ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_UNIX, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_UNIX +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ +#define FFI_CLOSURES 1 + +#ifdef __tilegx__ +/* We always pass 8-byte values, even in -m32 mode. */ +# define FFI_SIZEOF_ARG 8 +# ifdef __LP64__ +# define FFI_TRAMPOLINE_SIZE (8 * 5) /* 5 bundles */ +# else +# define FFI_TRAMPOLINE_SIZE (8 * 3) /* 3 bundles */ +# endif +#else +# define FFI_SIZEOF_ARG 4 +# define FFI_TRAMPOLINE_SIZE 8 /* 1 bundle */ +#endif +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/tile/tile.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/tile/tile.S new file mode 100644 index 000000000000..d1f82cb3dbfa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/tile/tile.S @@ -0,0 +1,360 @@ +/* ----------------------------------------------------------------------- + tile.S - Copyright (c) 2011 Tilera Corp. + + Tilera TILEPro and TILE-Gx Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +/* Number of bytes in a register. */ +#define REG_SIZE FFI_SIZEOF_ARG + +/* Number of bytes in stack linkage area for backtracing. + + A note about the ABI: on entry to a procedure, sp points to a stack + slot where it must spill the return address if it's not a leaf. + REG_SIZE bytes beyond that is a slot owned by the caller which + contains the sp value that the caller had when it was originally + entered (i.e. the caller's frame pointer). */ +#define LINKAGE_SIZE (2 * REG_SIZE) + +/* The first 10 registers are used to pass arguments and return values. */ +#define NUM_ARG_REGS 10 + +#ifdef __tilegx__ +#define SW st +#define LW ld +#define BGZT bgtzt +#else +#define SW sw +#define LW lw +#define BGZT bgzt +#endif + + +/* void ffi_call_tile (int_reg_t reg_args[NUM_ARG_REGS], + const int_reg_t *stack_args, + unsigned long stack_args_bytes, + void (*fnaddr)(void)); + + On entry, REG_ARGS contain the outgoing register values, + and STACK_ARGS contains STACK_ARG_BYTES of additional values + to be passed on the stack. If STACK_ARG_BYTES is zero, then + STACK_ARGS is ignored. + + When the invoked function returns, the values of r0-r9 are + blindly stored back into REG_ARGS for the caller to examine. */ + + .section .text.ffi_call_tile, "ax", @progbits + .align 8 + .globl ffi_call_tile + FFI_HIDDEN(ffi_call_tile) +ffi_call_tile: + +/* Incoming arguments. */ +#define REG_ARGS r0 +#define INCOMING_STACK_ARGS r1 +#define STACK_ARG_BYTES r2 +#define ORIG_FNADDR r3 + +/* Temporary values. */ +#define FRAME_SIZE r10 +#define TMP r11 +#define TMP2 r12 +#define OUTGOING_STACK_ARGS r13 +#define REG_ADDR_PTR r14 +#define RETURN_REG_ADDR r15 +#define FNADDR r16 + + .cfi_startproc + { + /* Save return address. */ + SW sp, lr + .cfi_offset lr, 0 + /* Prepare to spill incoming r52. */ + addi TMP, sp, -REG_SIZE + /* Increase frame size to have room to spill r52 and REG_ARGS. + The +7 is to round up mod 8. */ + addi FRAME_SIZE, STACK_ARG_BYTES, \ + REG_SIZE + REG_SIZE + LINKAGE_SIZE + 7 + } + { + /* Round stack frame size to a multiple of 8 to satisfy ABI. */ + andi FRAME_SIZE, FRAME_SIZE, -8 + /* Compute where to spill REG_ARGS value. */ + addi TMP2, sp, -(REG_SIZE * 2) + } + { + /* Spill incoming r52. */ + SW TMP, r52 + .cfi_offset r52, -REG_SIZE + /* Set up our frame pointer. */ + move r52, sp + .cfi_def_cfa_register r52 + /* Push stack frame. */ + sub sp, sp, FRAME_SIZE + } + { + /* Prepare to set up stack linkage. */ + addi TMP, sp, REG_SIZE + /* Prepare to memcpy stack args. */ + addi OUTGOING_STACK_ARGS, sp, LINKAGE_SIZE + /* Save REG_ARGS which we will need after we call the subroutine. */ + SW TMP2, REG_ARGS + } + { + /* Set up linkage info to hold incoming stack pointer. */ + SW TMP, r52 + } + { + /* Skip stack args memcpy if we don't have any stack args (common). */ + blezt STACK_ARG_BYTES, .Ldone_stack_args_memcpy + } + +.Lmemcpy_stack_args: + { + /* Load incoming argument from stack_args. */ + LW TMP, INCOMING_STACK_ARGS + addi INCOMING_STACK_ARGS, INCOMING_STACK_ARGS, REG_SIZE + } + { + /* Store stack argument into outgoing stack argument area. */ + SW OUTGOING_STACK_ARGS, TMP + addi OUTGOING_STACK_ARGS, OUTGOING_STACK_ARGS, REG_SIZE + addi STACK_ARG_BYTES, STACK_ARG_BYTES, -REG_SIZE + } + { + BGZT STACK_ARG_BYTES, .Lmemcpy_stack_args + } +.Ldone_stack_args_memcpy: + + { + /* Copy aside ORIG_FNADDR so we can overwrite its register. */ + move FNADDR, ORIG_FNADDR + /* Prepare to load argument registers. */ + addi REG_ADDR_PTR, r0, REG_SIZE + /* Load outgoing r0. */ + LW r0, r0 + } + + /* Load up argument registers from the REG_ARGS array. */ +#define LOAD_REG(REG, PTR) \ + { \ + LW REG, PTR ; \ + addi PTR, PTR, REG_SIZE \ + } + + LOAD_REG(r1, REG_ADDR_PTR) + LOAD_REG(r2, REG_ADDR_PTR) + LOAD_REG(r3, REG_ADDR_PTR) + LOAD_REG(r4, REG_ADDR_PTR) + LOAD_REG(r5, REG_ADDR_PTR) + LOAD_REG(r6, REG_ADDR_PTR) + LOAD_REG(r7, REG_ADDR_PTR) + LOAD_REG(r8, REG_ADDR_PTR) + LOAD_REG(r9, REG_ADDR_PTR) + + { + /* Call the subroutine. */ + jalr FNADDR + } + + { + /* Restore original lr. */ + LW lr, r52 + /* Prepare to recover ARGS, which we spilled earlier. */ + addi TMP, r52, -(2 * REG_SIZE) + } + { + /* Restore ARGS, so we can fill it in with the return regs r0-r9. */ + LW RETURN_REG_ADDR, TMP + /* Prepare to restore original r52. */ + addi TMP, r52, -REG_SIZE + } + + { + /* Pop stack frame. */ + move sp, r52 + /* Restore original r52. */ + LW r52, TMP + } + +#define STORE_REG(REG, PTR) \ + { \ + SW PTR, REG ; \ + addi PTR, PTR, REG_SIZE \ + } + + /* Return all register values by reference. */ + STORE_REG(r0, RETURN_REG_ADDR) + STORE_REG(r1, RETURN_REG_ADDR) + STORE_REG(r2, RETURN_REG_ADDR) + STORE_REG(r3, RETURN_REG_ADDR) + STORE_REG(r4, RETURN_REG_ADDR) + STORE_REG(r5, RETURN_REG_ADDR) + STORE_REG(r6, RETURN_REG_ADDR) + STORE_REG(r7, RETURN_REG_ADDR) + STORE_REG(r8, RETURN_REG_ADDR) + STORE_REG(r9, RETURN_REG_ADDR) + + { + jrp lr + } + + .cfi_endproc + .size ffi_call_tile, .-ffi_call_tile + +/* ffi_closure_tile(...) + + On entry, lr points to the closure plus 8 bytes, and r10 + contains the actual return address. + + This function simply dumps all register parameters into a stack array + and passes the closure, the registers array, and the stack arguments + to C code that does all of the actual closure processing. */ + + .section .text.ffi_closure_tile, "ax", @progbits + .align 8 + .globl ffi_closure_tile + FFI_HIDDEN(ffi_closure_tile) + + .cfi_startproc +/* Room to spill all NUM_ARG_REGS incoming registers, plus frame linkage. */ +#define CLOSURE_FRAME_SIZE (((NUM_ARG_REGS * REG_SIZE * 2 + LINKAGE_SIZE) + 7) & -8) +ffi_closure_tile: + { +#ifdef __tilegx__ + st sp, lr + .cfi_offset lr, 0 +#else + /* Save return address (in r10 due to closure stub wrapper). */ + SW sp, r10 + .cfi_return_column r10 + .cfi_offset r10, 0 +#endif + /* Compute address for stack frame linkage. */ + addli r10, sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) + } + { + /* Save incoming stack pointer in linkage area. */ + SW r10, sp + .cfi_offset sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) + /* Push a new stack frame. */ + addli sp, sp, -CLOSURE_FRAME_SIZE + .cfi_adjust_cfa_offset CLOSURE_FRAME_SIZE + } + + { + /* Create pointer to where to start spilling registers. */ + addi r10, sp, LINKAGE_SIZE + } + + /* Spill all the incoming registers. */ + STORE_REG(r0, r10) + STORE_REG(r1, r10) + STORE_REG(r2, r10) + STORE_REG(r3, r10) + STORE_REG(r4, r10) + STORE_REG(r5, r10) + STORE_REG(r6, r10) + STORE_REG(r7, r10) + STORE_REG(r8, r10) + { + /* Save r9. */ + SW r10, r9 +#ifdef __tilegx__ + /* Pointer to closure is passed in r11. */ + move r0, r11 +#else + /* Compute pointer to the closure object. Because the closure + starts with a "jal ffi_closure_tile", we can just take the + value of lr (a phony return address pointing into the closure) + and subtract 8. */ + addi r0, lr, -8 +#endif + /* Compute a pointer to the register arguments we just spilled. */ + addi r1, sp, LINKAGE_SIZE + } + { + /* Compute a pointer to the extra stack arguments (if any). */ + addli r2, sp, CLOSURE_FRAME_SIZE + LINKAGE_SIZE + /* Call C code to deal with all of the grotty details. */ + jal ffi_closure_tile_inner + } + { + addli r10, sp, CLOSURE_FRAME_SIZE + } + { + /* Restore the return address. */ + LW lr, r10 + /* Compute pointer to registers array. */ + addli r10, sp, LINKAGE_SIZE + (NUM_ARG_REGS * REG_SIZE) + } + /* Return all the register values, which C code may have set. */ + LOAD_REG(r0, r10) + LOAD_REG(r1, r10) + LOAD_REG(r2, r10) + LOAD_REG(r3, r10) + LOAD_REG(r4, r10) + LOAD_REG(r5, r10) + LOAD_REG(r6, r10) + LOAD_REG(r7, r10) + LOAD_REG(r8, r10) + LOAD_REG(r9, r10) + { + /* Pop the frame. */ + addli sp, sp, CLOSURE_FRAME_SIZE + jrp lr + } + + .cfi_endproc + .size ffi_closure_tile, . - ffi_closure_tile + + +/* What follows are code template instructions that get copied to the + closure trampoline by ffi_prep_closure_loc. The zeroed operands + get replaced by their proper values at runtime. */ + + .section .text.ffi_template_tramp_tile, "ax", @progbits + .align 8 + .globl ffi_template_tramp_tile + FFI_HIDDEN(ffi_template_tramp_tile) +ffi_template_tramp_tile: +#ifdef __tilegx__ + { + moveli r11, 0 /* backpatched to address of containing closure. */ + moveli r10, 0 /* backpatched to ffi_closure_tile. */ + } + /* Note: the following bundle gets generated multiple times + depending on the pointer value (esp. useful for -m32 mode). */ + { shl16insli r11, r11, 0 ; shl16insli r10, r10, 0 } + { info 2+8 /* for backtracer: -> pc in lr, frame size 0 */ ; jr r10 } +#else + /* 'jal .' yields a PC-relative offset of zero so we can OR in the + right offset at runtime. */ + { move r10, lr ; jal . /* ffi_closure_tile */ } +#endif + + .size ffi_template_tramp_tile, . - ffi_template_tramp_tile diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/types.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/types.c new file mode 100644 index 000000000000..9ec27f6cf376 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/types.c @@ -0,0 +1,108 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* Hide the basic type definitions from the header file, so that we + can redefine them here as "const". */ +#define LIBFFI_HIDE_BASIC_TYPES + +#include <ffi.h> +#include <ffi_common.h> + +/* Type definitions */ + +#define FFI_TYPEDEF(name, type, id, maybe_const)\ +struct struct_align_##name { \ + char c; \ + type x; \ +}; \ +FFI_EXTERN \ +maybe_const ffi_type ffi_type_##name = { \ + sizeof(type), \ + offsetof(struct struct_align_##name, x), \ + id, NULL \ +} + +#define FFI_COMPLEX_TYPEDEF(name, type, maybe_const) \ +static ffi_type *ffi_elements_complex_##name [2] = { \ + (ffi_type *)(&ffi_type_##name), NULL \ +}; \ +struct struct_align_complex_##name { \ + char c; \ + _Complex type x; \ +}; \ +FFI_EXTERN \ +maybe_const ffi_type ffi_type_complex_##name = { \ + sizeof(_Complex type), \ + offsetof(struct struct_align_complex_##name, x), \ + FFI_TYPE_COMPLEX, \ + (ffi_type **)ffi_elements_complex_##name \ +} + +/* Size and alignment are fake here. They must not be 0. */ +FFI_EXTERN const ffi_type ffi_type_void = { + 1, 1, FFI_TYPE_VOID, NULL +}; + +FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8, const); +FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8, const); +FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16, const); +FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16, const); +FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32, const); +FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32, const); +FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64, const); +FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64, const); + +FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER, const); + +FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT, const); +FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE, const); + +#if !defined HAVE_LONG_DOUBLE_VARIANT || defined __alpha__ +#define FFI_LDBL_CONST const +#else +#define FFI_LDBL_CONST +#endif + +#ifdef __alpha__ +/* Even if we're not configured to default to 128-bit long double, + maintain binary compatibility, as -mlong-double-128 can be used + at any time. */ +/* Validate the hard-coded number below. */ +# if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL }; +#elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE, FFI_LDBL_CONST); +#endif + +#ifdef FFI_TARGET_HAS_COMPLEX_TYPE +FFI_COMPLEX_TYPEDEF(float, float, const); +FFI_COMPLEX_TYPEDEF(double, double, const); +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +FFI_COMPLEX_TYPEDEF(longdouble, long double, FFI_LDBL_CONST); +#endif +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/vax/elfbsd.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/vax/elfbsd.S new file mode 100644 index 000000000000..01ca313402b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/vax/elfbsd.S @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2013 Miodrag Vallat. <miod@openbsd.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * ``Software''), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * vax Foreign Function Interface + */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + + .text + +/* + * void * %r0 + * ffi_call_elfbsd(extended_cif *ecif, 4(%ap) + * unsigned bytes, 8(%ap) + * unsigned flags, 12(%ap) + * void *rvalue, 16(%ap) + * void (*fn)()); 20(%ap) + */ + .globl ffi_call_elfbsd + .type ffi_call_elfbsd,@function + .align 2 +ffi_call_elfbsd: + .word 0x00c # save R2 and R3 + + # Allocate stack space for the args + subl2 8(%ap), %sp + + # Call ffi_prep_args + pushl %sp + pushl 4(%ap) + calls $2, ffi_prep_args + + # Get function pointer + movl 20(%ap), %r1 + + # Build a CALLS frame + ashl $-2, 8(%ap), %r0 + pushl %r0 # argument stack usage + movl %sp, %r0 # future %ap + # saved registers + bbc $11, 0(%r1), 1f + pushl %r11 +1: bbc $10, 0(%r1), 1f + pushl %r10 +1: bbc $9, 0(%r1), 1f + pushl %r9 +1: bbc $8, 0(%r1), 1f + pushl %r8 +1: bbc $7, 0(%r1), 1f + pushl %r7 +1: bbc $6, 0(%r1), 1f + pushl %r6 +1: bbc $5, 0(%r1), 1f + pushl %r5 +1: bbc $4, 0(%r1), 1f + pushl %r4 +1: bbc $3, 0(%r1), 1f + pushl %r3 +1: bbc $2, 0(%r1), 1f + pushl %r2 +1: + pushal 9f + pushl %fp + pushl %ap + movl 16(%ap), %r3 # struct return address, if needed + movl %r0, %ap + movzwl 4(%fp), %r0 # previous PSW, without the saved registers mask + bisl2 $0x20000000, %r0 # calls frame + movzwl 0(%r1), %r2 + bicw2 $0xf003, %r2 # only keep R11-R2 + ashl $16, %r2, %r2 + bisl2 %r2, %r0 # saved register mask of the called function + pushl %r0 + pushl $0 + movl %sp, %fp + + # Invoke the function + pushal 2(%r1) # skip procedure entry mask + movl %r3, %r1 + bicpsw $0x000f + rsb + +9: + # Copy return value if necessary + tstl 16(%ap) + jeql 9f + movl 16(%ap), %r2 + + bbc $0, 12(%ap), 1f # CIF_FLAGS_CHAR + movb %r0, 0(%r2) + brb 9f +1: + bbc $1, 12(%ap), 1f # CIF_FLAGS_SHORT + movw %r0, 0(%r2) + brb 9f +1: + bbc $2, 12(%ap), 1f # CIF_FLAGS_INT + movl %r0, 0(%r2) + brb 9f +1: + bbc $3, 12(%ap), 1f # CIF_FLAGS_DINT + movq %r0, 0(%r2) + brb 9f +1: + movl %r1, %r0 # might have been a struct + #brb 9f + +9: + ret + +/* + * ffi_closure_elfbsd(void); + * invoked with %r0: ffi_closure *closure + */ + .globl ffi_closure_elfbsd + .type ffi_closure_elfbsd, @function + .align 2 +ffi_closure_elfbsd: + .word 0 + + # Allocate room on stack for return value + subl2 $8, %sp + + # Invoke the closure function + pushal 4(%ap) # calling stack + pushal 4(%sp) # return value + pushl %r0 # closure + calls $3, ffi_closure_elfbsd_inner + + # Copy return value if necessary + bitb $1, %r0 # CIF_FLAGS_CHAR + beql 1f + movb 0(%sp), %r0 + brb 9f +1: + bitb $2, %r0 # CIF_FLAGS_SHORT + beql 1f + movw 0(%sp), %r0 + brb 9f +1: + bitb $4, %r0 # CIF_FLAGS_INT + beql 1f + movl 0(%sp), %r0 + brb 9f +1: + bitb $8, %r0 # CIF_FLAGS_DINT + beql 1f + movq 0(%sp), %r0 + #brb 9f +1: + +9: + ret + +/* + * ffi_closure_struct_elfbsd(void); + * invoked with %r0: ffi_closure *closure + * %r1: struct return address + */ + .globl ffi_closure_struct_elfbsd + .type ffi_closure_struct_elfbsd, @function + .align 2 +ffi_closure_struct_elfbsd: + .word 0 + + # Invoke the closure function + pushal 4(%ap) # calling stack + pushl %r1 # return value + pushl %r0 # closure + calls $3, ffi_closure_elfbsd_inner + + ret diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/vax/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/vax/ffi.c new file mode 100644 index 000000000000..e52caec86da2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/vax/ffi.c @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2013 Miodrag Vallat. <miod@openbsd.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * ``Software''), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * vax Foreign Function Interface + * + * This file attempts to provide all the FFI entry points which can reliably + * be implemented in C. + */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <unistd.h> + +#define CIF_FLAGS_CHAR 1 /* for struct only */ +#define CIF_FLAGS_SHORT 2 /* for struct only */ +#define CIF_FLAGS_INT 4 +#define CIF_FLAGS_DINT 8 + +/* + * Foreign Function Interface API + */ + +void ffi_call_elfbsd (extended_cif *, unsigned, unsigned, void *, + void (*) ()); +void *ffi_prep_args (extended_cif *ecif, void *stack); + +void * +ffi_prep_args (extended_cif *ecif, void *stack) +{ + unsigned int i; + void **p_argv; + char *argp; + ffi_type **p_arg; + void *struct_value_ptr; + + argp = stack; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT + && !ecif->cif->flags) + struct_value_ptr = ecif->rvalue; + else + struct_value_ptr = NULL; + + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; + i != 0; + i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + if (z < sizeof (int)) + { + switch ((*p_arg)->type) + { + case FFI_TYPE_SINT8: + *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; + break; + + case FFI_TYPE_UINT8: + *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; + break; + + case FFI_TYPE_SINT16: + *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; + break; + + case FFI_TYPE_UINT16: + *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; + break; + + case FFI_TYPE_STRUCT: + memcpy (argp, *p_argv, z); + break; + + default: + FFI_ASSERT (0); + } + z = sizeof (int); + } + else + { + memcpy (argp, *p_argv, z); + + /* Align if necessary. */ + if ((sizeof(int) - 1) & z) + z = FFI_ALIGN(z, sizeof(int)); + } + + p_argv++; + argp += z; + } + + return struct_value_ptr; +} + +ffi_status +ffi_prep_cif_machdep (ffi_cif *cif) +{ + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + cif->flags = 0; + break; + + case FFI_TYPE_STRUCT: + if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && + cif->rtype->elements[1]) + { + cif->flags = 0; + break; + } + + if (cif->rtype->size == sizeof (char)) + cif->flags = CIF_FLAGS_CHAR; + else if (cif->rtype->size == sizeof (short)) + cif->flags = CIF_FLAGS_SHORT; + else if (cif->rtype->size == sizeof (int)) + cif->flags = CIF_FLAGS_INT; + else if (cif->rtype->size == 2 * sizeof (int)) + cif->flags = CIF_FLAGS_DINT; + else + cif->flags = 0; + break; + + default: + if (cif->rtype->size <= sizeof (int)) + cif->flags = CIF_FLAGS_INT; + else + cif->flags = CIF_FLAGS_DINT; + break; + } + + return FFI_OK; +} + +void +ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) +{ + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return value + address then we need to make one. */ + + if (rvalue == NULL + && cif->rtype->type == FFI_TYPE_STRUCT + && cif->flags == 0) + ecif.rvalue = alloca (cif->rtype->size); + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_ELFBSD: + ffi_call_elfbsd (&ecif, cif->bytes, cif->flags, ecif.rvalue, fn); + break; + + default: + FFI_ASSERT (0); + break; + } +} + +/* + * Closure API + */ + +void ffi_closure_elfbsd (void); +void ffi_closure_struct_elfbsd (void); +unsigned int ffi_closure_elfbsd_inner (ffi_closure *, void *, char *); + +static void +ffi_prep_closure_elfbsd (ffi_cif *cif, void **avalue, char *stackp) +{ + unsigned int i; + void **p_argv; + ffi_type **p_arg; + + p_argv = avalue; + + for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) + { + size_t z; + + z = (*p_arg)->size; + *p_argv = stackp; + + /* Align if necessary */ + if ((sizeof (int) - 1) & z) + z = FFI_ALIGN(z, sizeof (int)); + + p_argv++; + stackp += z; + } +} + +unsigned int +ffi_closure_elfbsd_inner (ffi_closure *closure, void *resp, char *stack) +{ + ffi_cif *cif; + void **arg_area; + + cif = closure->cif; + arg_area = (void **) alloca (cif->nargs * sizeof (void *)); + + ffi_prep_closure_elfbsd (cif, arg_area, stack); + + (closure->fun) (cif, resp, arg_area, closure->user_data); + + return cif->flags; +} + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif, + void (*fun)(ffi_cif *, void *, void **, void *), + void *user_data, void *codeloc) +{ + char *tramp = (char *) codeloc; + void *fn; + + FFI_ASSERT (cif->abi == FFI_ELFBSD); + + /* entry mask */ + *(unsigned short *)(tramp + 0) = 0x0000; + /* movl #closure, r0 */ + tramp[2] = 0xd0; + tramp[3] = 0x8f; + *(unsigned int *)(tramp + 4) = (unsigned int) closure; + tramp[8] = 0x50; + + if (cif->rtype->type == FFI_TYPE_STRUCT + && !cif->flags) + fn = &ffi_closure_struct_elfbsd; + else + fn = &ffi_closure_elfbsd; + + /* jmpl #fn */ + tramp[9] = 0x17; + tramp[10] = 0xef; + *(unsigned int *)(tramp + 11) = (unsigned int)fn + 2 - + (unsigned int)tramp - 9 - 6; + + closure->cif = cif; + closure->user_data = user_data; + closure->fun = fun; + + return FFI_OK; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/vax/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/vax/ffitarget.h new file mode 100644 index 000000000000..2fc94881abbc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/vax/ffitarget.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2013 Miodrag Vallat. <miod@openbsd.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * ``Software''), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * vax Foreign Function Interface + */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_ELFBSD, + FFI_DEFAULT_ABI = FFI_ELFBSD, + FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_TRAMPOLINE_SIZE 15 +#define FFI_NATIVE_RAW_API 0 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/asmnames.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/asmnames.h new file mode 100644 index 000000000000..7551021e17eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/asmnames.h @@ -0,0 +1,30 @@ +#ifndef ASMNAMES_H +#define ASMNAMES_H + +#define C2(X, Y) X ## Y +#define C1(X, Y) C2(X, Y) +#ifdef __USER_LABEL_PREFIX__ +# define C(X) C1(__USER_LABEL_PREFIX__, X) +#else +# define C(X) X +#endif + +#ifdef __APPLE__ +# define L(X) C1(L, X) +#else +# define L(X) C1(.L, X) +#endif + +#if defined(__ELF__) && defined(__PIC__) +# define PLT(X) X@PLT +#else +# define PLT(X) X +#endif + +#ifdef __ELF__ +# define ENDF(X) .type X,@function; .size X, . - X +#else +# define ENDF(X) +#endif + +#endif /* ASMNAMES_H */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffi.c new file mode 100644 index 000000000000..5f7fd81d9768 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffi.c @@ -0,0 +1,770 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2017 Anthony Green + Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + Copyright (C) 2008, 2010 Free Software Foundation, Inc. + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if defined(__i386__) || defined(_M_IX86) +#include <ffi.h> +#include <ffi_common.h> +#include <stdint.h> +#include <stdlib.h> +#include "internal.h" + +/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; + all further uses in this file will refer to the 80-bit type. */ +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +# if FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +#else +# undef FFI_TYPE_LONGDOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#endif + +#if defined(__GNUC__) && !defined(__declspec) +# define __declspec(x) __attribute__((x)) +#endif + +#if defined(_MSC_VER) && defined(_M_IX86) +/* Stack is not 16-byte aligned on Windows. */ +#define STACK_ALIGN(bytes) (bytes) +#else +#define STACK_ALIGN(bytes) FFI_ALIGN (bytes, 16) +#endif + +/* Perform machine dependent cif processing. */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep(ffi_cif *cif) +{ + size_t bytes = 0; + int i, n, flags, cabi = cif->abi; + + switch (cabi) + { + case FFI_SYSV: + case FFI_STDCALL: + case FFI_THISCALL: + case FFI_FASTCALL: + case FFI_MS_CDECL: + case FFI_PASCAL: + case FFI_REGISTER: + break; + default: + return FFI_BAD_ABI; + } + + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + flags = X86_RET_VOID; + break; + case FFI_TYPE_FLOAT: + flags = X86_RET_FLOAT; + break; + case FFI_TYPE_DOUBLE: + flags = X86_RET_DOUBLE; + break; + case FFI_TYPE_LONGDOUBLE: + flags = X86_RET_LDOUBLE; + break; + case FFI_TYPE_UINT8: + flags = X86_RET_UINT8; + break; + case FFI_TYPE_UINT16: + flags = X86_RET_UINT16; + break; + case FFI_TYPE_SINT8: + flags = X86_RET_SINT8; + break; + case FFI_TYPE_SINT16: + flags = X86_RET_SINT16; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + flags = X86_RET_INT32; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + flags = X86_RET_INT64; + break; + case FFI_TYPE_STRUCT: +#ifndef X86 + /* ??? This should be a different ABI rather than an ifdef. */ + if (cif->rtype->size == 1) + flags = X86_RET_STRUCT_1B; + else if (cif->rtype->size == 2) + flags = X86_RET_STRUCT_2B; + else if (cif->rtype->size == 4) + flags = X86_RET_INT32; + else if (cif->rtype->size == 8) + flags = X86_RET_INT64; + else +#endif + { + do_struct: + switch (cabi) + { + case FFI_THISCALL: + case FFI_FASTCALL: + case FFI_STDCALL: + case FFI_MS_CDECL: + flags = X86_RET_STRUCTARG; + break; + default: + flags = X86_RET_STRUCTPOP; + break; + } + /* Allocate space for return value pointer. */ + bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG); + } + break; + case FFI_TYPE_COMPLEX: + switch (cif->rtype->elements[0]->type) + { + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + goto do_struct; + case FFI_TYPE_FLOAT: + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + flags = X86_RET_INT64; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + flags = X86_RET_INT32; + break; + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + flags = X86_RET_STRUCT_2B; + break; + default: + return FFI_BAD_TYPEDEF; + } + break; + default: + return FFI_BAD_TYPEDEF; + } + cif->flags = flags; + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *t = cif->arg_types[i]; + + bytes = FFI_ALIGN (bytes, t->alignment); + bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG); + } + cif->bytes = bytes; + + return FFI_OK; +} + +static ffi_arg +extend_basic_type(void *arg, int type) +{ + switch (type) + { + case FFI_TYPE_SINT8: + return *(SINT8 *)arg; + case FFI_TYPE_UINT8: + return *(UINT8 *)arg; + case FFI_TYPE_SINT16: + return *(SINT16 *)arg; + case FFI_TYPE_UINT16: + return *(UINT16 *)arg; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_FLOAT: + return *(UINT32 *)arg; + + default: + abort(); + } +} + +struct call_frame +{ + void *ebp; /* 0 */ + void *retaddr; /* 4 */ + void (*fn)(void); /* 8 */ + int flags; /* 12 */ + void *rvalue; /* 16 */ + unsigned regs[3]; /* 20-28 */ +}; + +struct abi_params +{ + int dir; /* parameter growth direction */ + int static_chain; /* the static chain register used by gcc */ + int nregs; /* number of register parameters */ + int regs[3]; +}; + +static const struct abi_params abi_params[FFI_LAST_ABI] = { + [FFI_SYSV] = { 1, R_ECX, 0 }, + [FFI_THISCALL] = { 1, R_EAX, 1, { R_ECX } }, + [FFI_FASTCALL] = { 1, R_EAX, 2, { R_ECX, R_EDX } }, + [FFI_STDCALL] = { 1, R_ECX, 0 }, + [FFI_PASCAL] = { -1, R_ECX, 0 }, + /* ??? No defined static chain; gcc does not support REGISTER. */ + [FFI_REGISTER] = { -1, R_ECX, 3, { R_EAX, R_EDX, R_ECX } }, + [FFI_MS_CDECL] = { 1, R_ECX, 0 } +}; + +#ifdef HAVE_FASTCALL + #ifdef _MSC_VER + #define FFI_DECLARE_FASTCALL __fastcall + #else + #define FFI_DECLARE_FASTCALL __declspec(fastcall) + #endif +#else + #define FFI_DECLARE_FASTCALL +#endif + +extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_HIDDEN; + +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + size_t rsize, bytes; + struct call_frame *frame; + char *stack, *argp; + ffi_type **arg_types; + int flags, cabi, i, n, dir, narg_reg; + const struct abi_params *pabi; + + flags = cif->flags; + cabi = cif->abi; + pabi = &abi_params[cabi]; + dir = pabi->dir; + + rsize = 0; + if (rvalue == NULL) + { + switch (flags) + { + case X86_RET_FLOAT: + case X86_RET_DOUBLE: + case X86_RET_LDOUBLE: + case X86_RET_STRUCTPOP: + case X86_RET_STRUCTARG: + /* The float cases need to pop the 387 stack. + The struct cases need to pass a valid pointer to the callee. */ + rsize = cif->rtype->size; + break; + default: + /* We can pretend that the callee returns nothing. */ + flags = X86_RET_VOID; + break; + } + } + + bytes = STACK_ALIGN (cif->bytes); + stack = alloca(bytes + sizeof(*frame) + rsize); + argp = (dir < 0 ? stack + bytes : stack); + frame = (struct call_frame *)(stack + bytes); + if (rsize) + rvalue = frame + 1; + + frame->fn = fn; + frame->flags = flags; + frame->rvalue = rvalue; + frame->regs[pabi->static_chain] = (unsigned)closure; + + narg_reg = 0; + switch (flags) + { + case X86_RET_STRUCTARG: + /* The pointer is passed as the first argument. */ + if (pabi->nregs > 0) + { + frame->regs[pabi->regs[0]] = (unsigned)rvalue; + narg_reg = 1; + break; + } + /* fallthru */ + case X86_RET_STRUCTPOP: + *(void **)argp = rvalue; + argp += sizeof(void *); + break; + } + + arg_types = cif->arg_types; + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + void *valp = avalue[i]; + size_t z = ty->size; + int t = ty->type; + + if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT) + { + ffi_arg val = extend_basic_type (valp, t); + + if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs) + frame->regs[pabi->regs[narg_reg++]] = val; + else if (dir < 0) + { + argp -= 4; + *(ffi_arg *)argp = val; + } + else + { + *(ffi_arg *)argp = val; + argp += 4; + } + } + else + { + size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG); + size_t align = FFI_SIZEOF_ARG; + + /* Issue 434: For thiscall and fastcall, if the paramter passed + as 64-bit integer or struct, all following integer parameters + will be passed on stack. */ + if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL) + && (t == FFI_TYPE_SINT64 + || t == FFI_TYPE_UINT64 + || t == FFI_TYPE_STRUCT)) + narg_reg = 2; + + /* Alignment rules for arguments are quite complex. Vectors and + structures with 16 byte alignment get it. Note that long double + on Darwin does have 16 byte alignment, and does not get this + alignment if passed directly; a structure with a long double + inside, however, would get 16 byte alignment. Since libffi does + not support vectors, we need non concern ourselves with other + cases. */ + if (t == FFI_TYPE_STRUCT && ty->alignment >= 16) + align = 16; + + if (dir < 0) + { + /* ??? These reverse argument ABIs are probably too old + to have cared about alignment. Someone should check. */ + argp -= za; + memcpy (argp, valp, z); + } + else + { + argp = (char *)FFI_ALIGN (argp, align); + memcpy (argp, valp, z); + argp += za; + } + } + } + FFI_ASSERT (dir > 0 || argp == stack); + + ffi_call_i386 (frame, stack); +} + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +#ifdef FFI_GO_CLOSURES +void +ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} +#endif + +/** private members **/ + +void FFI_HIDDEN ffi_closure_i386(void); +void FFI_HIDDEN ffi_closure_STDCALL(void); +void FFI_HIDDEN ffi_closure_REGISTER(void); + +struct closure_frame +{ + unsigned rettemp[4]; /* 0 */ + unsigned regs[3]; /* 16-24 */ + ffi_cif *cif; /* 28 */ + void (*fun)(ffi_cif*,void*,void**,void*); /* 32 */ + void *user_data; /* 36 */ +}; + +int FFI_HIDDEN FFI_DECLARE_FASTCALL +ffi_closure_inner (struct closure_frame *frame, char *stack) +{ + ffi_cif *cif = frame->cif; + int cabi, i, n, flags, dir, narg_reg; + const struct abi_params *pabi; + ffi_type **arg_types; + char *argp; + void *rvalue; + void **avalue; + + cabi = cif->abi; + flags = cif->flags; + narg_reg = 0; + rvalue = frame->rettemp; + pabi = &abi_params[cabi]; + dir = pabi->dir; + argp = (dir < 0 ? stack + STACK_ALIGN (cif->bytes) : stack); + + switch (flags) + { + case X86_RET_STRUCTARG: + if (pabi->nregs > 0) + { + rvalue = (void *)frame->regs[pabi->regs[0]]; + narg_reg = 1; + frame->rettemp[0] = (unsigned)rvalue; + break; + } + /* fallthru */ + case X86_RET_STRUCTPOP: + rvalue = *(void **)argp; + argp += sizeof(void *); + frame->rettemp[0] = (unsigned)rvalue; + break; + } + + n = cif->nargs; + avalue = alloca(sizeof(void *) * n); + + arg_types = cif->arg_types; + for (i = 0; i < n; ++i) + { + ffi_type *ty = arg_types[i]; + size_t z = ty->size; + int t = ty->type; + void *valp; + + if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT) + { + if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs) + valp = &frame->regs[pabi->regs[narg_reg++]]; + else if (dir < 0) + { + argp -= 4; + valp = argp; + } + else + { + valp = argp; + argp += 4; + } + } + else + { + size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG); + size_t align = FFI_SIZEOF_ARG; + + /* See the comment in ffi_call_int. */ + if (t == FFI_TYPE_STRUCT && ty->alignment >= 16) + align = 16; + + /* Issue 434: For thiscall and fastcall, if the paramter passed + as 64-bit integer or struct, all following integer parameters + will be passed on stack. */ + if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL) + && (t == FFI_TYPE_SINT64 + || t == FFI_TYPE_UINT64 + || t == FFI_TYPE_STRUCT)) + narg_reg = 2; + + if (dir < 0) + { + /* ??? These reverse argument ABIs are probably too old + to have cared about alignment. Someone should check. */ + argp -= za; + valp = argp; + } + else + { + argp = (char *)FFI_ALIGN (argp, align); + valp = argp; + argp += za; + } + } + + avalue[i] = valp; + } + + frame->fun (cif, rvalue, avalue, frame->user_data); + + if (cabi == FFI_STDCALL) + return flags + (cif->bytes << X86_RET_POP_SHIFT); + else + return flags; +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + char *tramp = closure->tramp; + void (*dest)(void); + int op = 0xb8; /* movl imm, %eax */ + + switch (cif->abi) + { + case FFI_SYSV: + case FFI_THISCALL: + case FFI_FASTCALL: + case FFI_MS_CDECL: + dest = ffi_closure_i386; + break; + case FFI_STDCALL: + case FFI_PASCAL: + dest = ffi_closure_STDCALL; + break; + case FFI_REGISTER: + dest = ffi_closure_REGISTER; + op = 0x68; /* pushl imm */ + break; + default: + return FFI_BAD_ABI; + } + + /* endbr32. */ + *(UINT32 *) tramp = 0xfb1e0ff3; + + /* movl or pushl immediate. */ + tramp[4] = op; + *(void **)(tramp + 5) = codeloc; + + /* jmp dest */ + tramp[9] = 0xe9; + *(unsigned *)(tramp + 10) = (unsigned)dest - ((unsigned)codeloc + 14); + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#ifdef FFI_GO_CLOSURES + +void FFI_HIDDEN ffi_go_closure_EAX(void); +void FFI_HIDDEN ffi_go_closure_ECX(void); +void FFI_HIDDEN ffi_go_closure_STDCALL(void); + +ffi_status +ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*)) +{ + void (*dest)(void); + + switch (cif->abi) + { + case FFI_SYSV: + case FFI_MS_CDECL: + dest = ffi_go_closure_ECX; + break; + case FFI_THISCALL: + case FFI_FASTCALL: + dest = ffi_go_closure_EAX; + break; + case FFI_STDCALL: + case FFI_PASCAL: + dest = ffi_go_closure_STDCALL; + break; + case FFI_REGISTER: + default: + return FFI_BAD_ABI; + } + + closure->tramp = dest; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} + +#endif /* FFI_GO_CLOSURES */ + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +void FFI_HIDDEN ffi_closure_raw_SYSV(void); +void FFI_HIDDEN ffi_closure_raw_THISCALL(void); + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure *closure, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + char *tramp = closure->tramp; + void (*dest)(void); + int i; + + /* We currently don't support certain kinds of arguments for raw + closures. This should be implemented by a separate assembly + language routine, since it would require argument processing, + something we don't do now for performance. */ + for (i = cif->nargs-1; i >= 0; i--) + switch (cif->arg_types[i]->type) + { + case FFI_TYPE_STRUCT: + case FFI_TYPE_LONGDOUBLE: + return FFI_BAD_TYPEDEF; + } + + switch (cif->abi) + { + case FFI_THISCALL: + dest = ffi_closure_raw_THISCALL; + break; + case FFI_SYSV: + dest = ffi_closure_raw_SYSV; + break; + default: + return FFI_BAD_ABI; + } + + /* movl imm, %eax. */ + tramp[0] = 0xb8; + *(void **)(tramp + 1) = codeloc; + + /* jmp dest */ + tramp[5] = 0xe9; + *(unsigned *)(tramp + 6) = (unsigned)dest - ((unsigned)codeloc + 10); + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue) +{ + size_t rsize, bytes; + struct call_frame *frame; + char *stack, *argp; + ffi_type **arg_types; + int flags, cabi, i, n, narg_reg; + const struct abi_params *pabi; + + flags = cif->flags; + cabi = cif->abi; + pabi = &abi_params[cabi]; + + rsize = 0; + if (rvalue == NULL) + { + switch (flags) + { + case X86_RET_FLOAT: + case X86_RET_DOUBLE: + case X86_RET_LDOUBLE: + case X86_RET_STRUCTPOP: + case X86_RET_STRUCTARG: + /* The float cases need to pop the 387 stack. + The struct cases need to pass a valid pointer to the callee. */ + rsize = cif->rtype->size; + break; + default: + /* We can pretend that the callee returns nothing. */ + flags = X86_RET_VOID; + break; + } + } + + bytes = STACK_ALIGN (cif->bytes); + argp = stack = + (void *)((uintptr_t)alloca(bytes + sizeof(*frame) + rsize + 15) & ~16); + frame = (struct call_frame *)(stack + bytes); + if (rsize) + rvalue = frame + 1; + + frame->fn = fn; + frame->flags = flags; + frame->rvalue = rvalue; + + narg_reg = 0; + switch (flags) + { + case X86_RET_STRUCTARG: + /* The pointer is passed as the first argument. */ + if (pabi->nregs > 0) + { + frame->regs[pabi->regs[0]] = (unsigned)rvalue; + narg_reg = 1; + break; + } + /* fallthru */ + case X86_RET_STRUCTPOP: + *(void **)argp = rvalue; + argp += sizeof(void *); + bytes -= sizeof(void *); + break; + } + + arg_types = cif->arg_types; + for (i = 0, n = cif->nargs; narg_reg < pabi->nregs && i < n; i++) + { + ffi_type *ty = arg_types[i]; + size_t z = ty->size; + int t = ty->type; + + if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT && t != FFI_TYPE_FLOAT) + { + ffi_arg val = extend_basic_type (avalue, t); + frame->regs[pabi->regs[narg_reg++]] = val; + z = FFI_SIZEOF_ARG; + } + else + { + memcpy (argp, avalue, z); + z = FFI_ALIGN (z, FFI_SIZEOF_ARG); + argp += z; + } + avalue += z; + bytes -= z; + } + if (i < n) + memcpy (argp, avalue, bytes); + + ffi_call_i386 (frame, stack); +} +#endif /* !FFI_NO_RAW_API */ +#endif /* __i386__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffi64.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffi64.c new file mode 100644 index 000000000000..39f95981bd8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffi64.c @@ -0,0 +1,895 @@ +/* ----------------------------------------------------------------------- + ffi64.c - Copyright (c) 2011, 2018 Anthony Green + Copyright (c) 2013 The Written Word, Inc. + Copyright (c) 2008, 2010 Red Hat, Inc. + Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de> + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +#include <stdlib.h> +#include <stdarg.h> +#include <stdint.h> +#include "internal64.h" + +#ifdef __x86_64__ + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +#if defined(__INTEL_COMPILER) +#include "xmmintrin.h" +#define UINT128 __m128 +#else +#if defined(__SUNPRO_C) +#include <sunmedia_types.h> +#define UINT128 __m128i +#else +#define UINT128 __int128_t +#endif +#endif + +union big_int_union +{ + UINT32 i32; + UINT64 i64; + UINT128 i128; +}; + +struct register_args +{ + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + union big_int_union sse[MAX_SSE_REGS]; + UINT64 rax; /* ssecount */ + UINT64 r10; /* static chain */ +}; + +extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)(void)) FFI_HIDDEN; + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the + exception of SSESF, SSEDF classes, that are basically SSE class, + just gcc will use SF or DFmode move instead of DImode to avoid + reformatting penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class + { + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS + }; + +#define MAX_CLASSES 4 + +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ + +static enum x86_64_reg_class +merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. +*/ +static size_t +classify_argument (ffi_type *type, enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + do_integer: + { + size_t size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGER_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } + case FFI_TYPE_FLOAT: + if (!(byte_offset % 8)) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + return 1; + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; +#endif + case FFI_TYPE_STRUCT: + { + const size_t UNITS_PER_WORD = 8; + size_t words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + ffi_type **ptr; + unsigned int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + + /* If the struct is larger than 32 bytes, pass it on the stack. */ + if (type->size > 32) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Zero sized arrays or structures are NO_CLASS. We return 0 to + signalize memory class, so handle it as special case. */ + if (!words) + { + case FFI_TYPE_VOID: + classes[0] = X86_64_NO_CLASS; + return 1; + } + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + size_t num; + + byte_offset = FFI_ALIGN (byte_offset, (*ptr)->alignment); + + num = classify_argument (*ptr, subclasses, byte_offset % 8); + if (num == 0) + return 0; + for (i = 0; i < num; i++) + { + size_t pos = byte_offset / 8; + classes[i + pos] = + merge_classes (subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */ + if (i > 1 && classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + /* The first one should never be X86_64_SSEUP_CLASS. */ + FFI_ASSERT (i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS, + everything should be passed in memory. */ + if (i > 1 && classes[i] == X86_64_X87UP_CLASS + && (classes[i - 1] != X86_64_X87_CLASS)) + { + /* The first one should never be X86_64_X87UP_CLASS. */ + FFI_ASSERT (i != 0); + return 0; + } + } + return words; + } + case FFI_TYPE_COMPLEX: + { + ffi_type *inner = type->elements[0]; + switch (inner->type) + { + case FFI_TYPE_INT: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + goto do_integer; + + case FFI_TYPE_FLOAT: + classes[0] = X86_64_SSE_CLASS; + if (byte_offset % 8) + { + classes[1] = X86_64_SSESF_CLASS; + return 2; + } + return 1; + case FFI_TYPE_DOUBLE: + classes[0] = classes[1] = X86_64_SSEDF_CLASS; + return 2; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_COMPLEX_X87_CLASS; + return 1; +#endif + } + } + } + abort(); +} + +/* Examine the argument and return set number of register required in each + class. Return zero iff parameter should be passed in memory, otherwise + the number of registers. */ + +static size_t +examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, int *pngpr, int *pnsse) +{ + size_t n; + unsigned int i; + int ngpr, nsse; + + n = classify_argument (type, classes, 0); + if (n == 0) + return 0; + + ngpr = nsse = 0; + for (i = 0; i < n; ++i) + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + default: + abort (); + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ + +#ifndef __ILP32__ +extern ffi_status +ffi_prep_cif_machdep_efi64(ffi_cif *cif); +#endif + +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep (ffi_cif *cif) +{ + int gprcount, ssecount, i, avn, ngpr, nsse; + unsigned flags; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes, n, rtype_size; + ffi_type *rtype; + +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + return ffi_prep_cif_machdep_efi64(cif); +#endif + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + gprcount = ssecount = 0; + + rtype = cif->rtype; + rtype_size = rtype->size; + switch (rtype->type) + { + case FFI_TYPE_VOID: + flags = UNIX64_RET_VOID; + break; + case FFI_TYPE_UINT8: + flags = UNIX64_RET_UINT8; + break; + case FFI_TYPE_SINT8: + flags = UNIX64_RET_SINT8; + break; + case FFI_TYPE_UINT16: + flags = UNIX64_RET_UINT16; + break; + case FFI_TYPE_SINT16: + flags = UNIX64_RET_SINT16; + break; + case FFI_TYPE_UINT32: + flags = UNIX64_RET_UINT32; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + flags = UNIX64_RET_SINT32; + break; + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags = UNIX64_RET_INT64; + break; + case FFI_TYPE_POINTER: + flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64); + break; + case FFI_TYPE_FLOAT: + flags = UNIX64_RET_XMM32; + break; + case FFI_TYPE_DOUBLE: + flags = UNIX64_RET_XMM64; + break; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags = UNIX64_RET_X87; + break; +#endif + case FFI_TYPE_STRUCT: + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + /* We don't have to do anything in asm for the return. */ + flags = UNIX64_RET_VOID | UNIX64_FLAG_RET_IN_MEM; + } + else + { + _Bool sse0 = SSE_CLASS_P (classes[0]); + + if (rtype_size == 4 && sse0) + flags = UNIX64_RET_XMM32; + else if (rtype_size == 8) + flags = sse0 ? UNIX64_RET_XMM64 : UNIX64_RET_INT64; + else + { + _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]); + if (sse0 && sse1) + flags = UNIX64_RET_ST_XMM0_XMM1; + else if (sse0) + flags = UNIX64_RET_ST_XMM0_RAX; + else if (sse1) + flags = UNIX64_RET_ST_RAX_XMM0; + else + flags = UNIX64_RET_ST_RAX_RDX; + flags |= rtype_size << UNIX64_SIZE_SHIFT; + } + } + break; + case FFI_TYPE_COMPLEX: + switch (rtype->elements[0]->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags = UNIX64_RET_ST_RAX_RDX | ((unsigned) rtype_size << UNIX64_SIZE_SHIFT); + break; + case FFI_TYPE_FLOAT: + flags = UNIX64_RET_XMM64; + break; + case FFI_TYPE_DOUBLE: + flags = UNIX64_RET_ST_XMM0_XMM1 | (16 << UNIX64_SIZE_SHIFT); + break; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags = UNIX64_RET_X87_2; + break; +#endif + default: + return FFI_BAD_TYPEDEF; + } + break; + default: + return FFI_BAD_TYPEDEF; + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument (cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = FFI_ALIGN (bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + if (ssecount) + flags |= UNIX64_FLAG_XMM_ARGS; + + cif->flags = flags; + cif->bytes = (unsigned) FFI_ALIGN (bytes, 8); + + return FFI_OK; +} + +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char *stack, *argp; + ffi_type **arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn, flags; + struct register_args *reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT (cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Otherwise we can ignore it. */ + flags = cif->flags; + if (rvalue == NULL) + { + if (flags & UNIX64_FLAG_RET_IN_MEM) + rvalue = alloca (cif->rtype->size); + else + flags = UNIX64_RET_VOID; + } + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8); + reg_args = (struct register_args *) stack; + argp = stack + sizeof (struct register_args); + + reg_args->r10 = (uintptr_t) closure; + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (flags & UNIX64_FLAG_RET_IN_MEM) + reg_args->gpr[gprcount++] = (unsigned long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t n, size = arg_types[i]->size; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) FFI_ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { + /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + unsigned int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + /* Sign-extend integer arguments passed in general + purpose registers, to cope with the fact that + LLVM incorrectly assumes that this will be done + (the x86-64 PS ABI does not specify this). */ + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + reg_args->gpr[gprcount] = (SINT64) *((SINT8 *) a); + break; + case FFI_TYPE_SINT16: + reg_args->gpr[gprcount] = (SINT64) *((SINT16 *) a); + break; + case FFI_TYPE_SINT32: + reg_args->gpr[gprcount] = (SINT64) *((SINT32 *) a); + break; + default: + reg_args->gpr[gprcount] = 0; + memcpy (&reg_args->gpr[gprcount], a, size); + } + gprcount++; + break; + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + memcpy (&reg_args->sse[ssecount++].i64, a, sizeof(UINT64)); + break; + case X86_64_SSESF_CLASS: + memcpy (&reg_args->sse[ssecount++].i32, a, sizeof(UINT32)); + break; + default: + abort(); + } + } + } + } + reg_args->rax = ssecount; + + ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args), + flags, rvalue, fn); +} + +#ifndef __ILP32__ +extern void +ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); +#endif + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + { + ffi_call_efi64(cif, fn, rvalue, avalue); + return; + } +#endif + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +#ifdef FFI_GO_CLOSURES + +#ifndef __ILP32__ +extern void +ffi_call_go_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure); +#endif + +void +ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + { + ffi_call_go_efi64(cif, fn, rvalue, avalue, closure); + return; + } +#endif + ffi_call_int (cif, fn, rvalue, avalue, closure); +} + +#endif /* FFI_GO_CLOSURES */ + +extern void ffi_closure_unix64(void) FFI_HIDDEN; +extern void ffi_closure_unix64_sse(void) FFI_HIDDEN; + +#ifndef __ILP32__ +extern ffi_status +ffi_prep_closure_loc_efi64(ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc); +#endif + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + static const unsigned char trampoline[24] = { + /* endbr64 */ + 0xf3, 0x0f, 0x1e, 0xfa, + /* leaq -0xb(%rip),%r10 # 0x0 */ + 0x4c, 0x8d, 0x15, 0xf5, 0xff, 0xff, 0xff, + /* jmpq *0x7(%rip) # 0x18 */ + 0xff, 0x25, 0x07, 0x00, 0x00, 0x00, + /* nopl 0(%rax) */ + 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00 + }; + void (*dest)(void); + char *tramp = closure->tramp; + +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + return ffi_prep_closure_loc_efi64(closure, cif, fun, user_data, codeloc); +#endif + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + if (cif->flags & UNIX64_FLAG_XMM_ARGS) + dest = ffi_closure_unix64_sse; + else + dest = ffi_closure_unix64; + + memcpy (tramp, trampoline, sizeof(trampoline)); + *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +int FFI_HIDDEN +ffi_closure_unix64_inner(ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *rvalue, + struct register_args *reg_args, + char *argp) +{ + void **avalue; + ffi_type **arg_types; + long i, avn; + int gprcount, ssecount, ngpr, nsse; + int flags; + + avn = cif->nargs; + flags = cif->flags; + avalue = alloca(avn * sizeof(void *)); + gprcount = ssecount = 0; + + if (flags & UNIX64_FLAG_RET_IN_MEM) + { + /* On return, %rax will contain the address that was passed + by the caller in %rdi. */ + void *r = (void *)(uintptr_t)reg_args->gpr[gprcount++]; + *(void **)rvalue = r; + rvalue = r; + flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64); + } + + arg_types = cif->arg_types; + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) FFI_ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + /* If the argument is in a single register, or two consecutive + integer registers, then we can use that address directly. */ + else if (n == 1 + || (n == 2 && !(SSE_CLASS_P (classes[0]) + || SSE_CLASS_P (classes[1])))) + { + /* The argument is in a single register. */ + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = &reg_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = &reg_args->gpr[gprcount]; + gprcount += n; + } + } + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + unsigned int j; + + avalue[i] = a; + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, &reg_args->sse[ssecount++], 8); + else + memcpy (a, &reg_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + fun (cif, rvalue, avalue, user_data); + + /* Tell assembly how to perform return type promotions. */ + return flags; +} + +#ifdef FFI_GO_CLOSURES + +extern void ffi_go_closure_unix64(void) FFI_HIDDEN; +extern void ffi_go_closure_unix64_sse(void) FFI_HIDDEN; + +#ifndef __ILP32__ +extern ffi_status +ffi_prep_go_closure_efi64(ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*)); +#endif + +ffi_status +ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*)) +{ +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + return ffi_prep_go_closure_efi64(closure, cif, fun); +#endif + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + closure->tramp = (cif->flags & UNIX64_FLAG_XMM_ARGS + ? ffi_go_closure_unix64_sse + : ffi_go_closure_unix64); + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} + +#endif /* FFI_GO_CLOSURES */ + +#endif /* __x86_64__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffitarget.h new file mode 100644 index 000000000000..a34f3e5b702b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffitarget.h @@ -0,0 +1,160 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2012, 2014, 2018 Anthony Green + Copyright (c) 1996-2003, 2010 Red Hat, Inc. + Copyright (C) 2008 Free Software Foundation, Inc. + + Target configuration macros for x86 and x86-64. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +/* ---- System specific configurations ----------------------------------- */ + +/* For code common to all platforms on x86 and x86_64. */ +#define X86_ANY + +#if defined (X86_64) && defined (__i386__) +#undef X86_64 +#define X86 +#endif + +#ifdef X86_WIN64 +#define FFI_SIZEOF_ARG 8 +#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */ +#endif + +#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION +#ifndef _MSC_VER +#define FFI_TARGET_HAS_COMPLEX_TYPE +#endif + +/* ---- Generic type definitions ----------------------------------------- */ + +#ifndef LIBFFI_ASM +#ifdef X86_WIN64 +#ifdef _MSC_VER +typedef unsigned __int64 ffi_arg; +typedef __int64 ffi_sarg; +#else +typedef unsigned long long ffi_arg; +typedef long long ffi_sarg; +#endif +#else +#if defined __x86_64__ && defined __ILP32__ +#define FFI_SIZEOF_ARG 8 +#define FFI_SIZEOF_JAVA_RAW 4 +typedef unsigned long long ffi_arg; +typedef long long ffi_sarg; +#else +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; +#endif +#endif + +typedef enum ffi_abi { +#if defined(X86_WIN64) + FFI_FIRST_ABI = 0, + FFI_WIN64, /* sizeof(long double) == 8 - microsoft compilers */ + FFI_GNUW64, /* sizeof(long double) == 16 - GNU compilers */ + FFI_LAST_ABI, +#ifdef __GNUC__ + FFI_DEFAULT_ABI = FFI_GNUW64 +#else + FFI_DEFAULT_ABI = FFI_WIN64 +#endif + +#elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) + FFI_FIRST_ABI = 1, + FFI_UNIX64, + FFI_WIN64, + FFI_EFI64 = FFI_WIN64, + FFI_GNUW64, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_UNIX64 + +#elif defined(X86_WIN32) + FFI_FIRST_ABI = 0, + FFI_SYSV = 1, + FFI_STDCALL = 2, + FFI_THISCALL = 3, + FFI_FASTCALL = 4, + FFI_MS_CDECL = 5, + FFI_PASCAL = 6, + FFI_REGISTER = 7, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_MS_CDECL +#else + FFI_FIRST_ABI = 0, + FFI_SYSV = 1, + FFI_THISCALL = 3, + FFI_FASTCALL = 4, + FFI_STDCALL = 5, + FFI_PASCAL = 6, + FFI_REGISTER = 7, + FFI_MS_CDECL = 8, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +#endif +} ffi_abi; +#endif + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_GO_CLOSURES 1 + +#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) +#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) +#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) +#define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) + +#if defined (X86_64) || defined(X86_WIN64) \ + || (defined (__x86_64__) && defined (X86_DARWIN)) +/* 4 bytes of ENDBR64 + 7 bytes of LEA + 6 bytes of JMP + 7 bytes of NOP + + 8 bytes of pointer. */ +# define FFI_TRAMPOLINE_SIZE 32 +# define FFI_NATIVE_RAW_API 0 +#else +/* 4 bytes of ENDBR32 + 5 bytes of MOV + 5 bytes of JMP + 2 unused + bytes. */ +# define FFI_TRAMPOLINE_SIZE 16 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +#endif + +#if !defined(GENERATE_LIBFFI_MAP) && defined(__ASSEMBLER__) \ + && defined(__CET__) +# include <cet.h> +# define _CET_NOTRACK notrack +#else +# define _CET_ENDBR +# define _CET_NOTRACK +#endif + +#endif + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffiw64.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffiw64.c new file mode 100644 index 000000000000..a43a9ebe94f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/ffiw64.c @@ -0,0 +1,318 @@ +/* ----------------------------------------------------------------------- + ffiw64.c - Copyright (c) 2018 Anthony Green + Copyright (c) 2014 Red Hat, Inc. + + x86 win64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if defined(__x86_64__) || defined(_M_AMD64) +#include <ffi.h> +#include <ffi_common.h> +#include <stdlib.h> +#include <stdint.h> + +#ifdef X86_WIN64 +#define EFI64(name) name +#else +#define EFI64(name) FFI_HIDDEN name##_efi64 +#endif + +struct win64_call_frame +{ + UINT64 rbp; /* 0 */ + UINT64 retaddr; /* 8 */ + UINT64 fn; /* 16 */ + UINT64 flags; /* 24 */ + UINT64 rvalue; /* 32 */ +}; + +extern void ffi_call_win64 (void *stack, struct win64_call_frame *, + void *closure) FFI_HIDDEN; + +ffi_status FFI_HIDDEN +EFI64(ffi_prep_cif_machdep)(ffi_cif *cif) +{ + int flags, n; + + switch (cif->abi) + { + case FFI_WIN64: + case FFI_GNUW64: + break; + default: + return FFI_BAD_ABI; + } + + flags = cif->rtype->type; + switch (flags) + { + default: + break; + case FFI_TYPE_LONGDOUBLE: + /* GCC returns long double values by reference, like a struct */ + if (cif->abi == FFI_GNUW64) + flags = FFI_TYPE_STRUCT; + break; + case FFI_TYPE_COMPLEX: + flags = FFI_TYPE_STRUCT; + /* FALLTHRU */ + case FFI_TYPE_STRUCT: + switch (cif->rtype->size) + { + case 8: + flags = FFI_TYPE_UINT64; + break; + case 4: + flags = FFI_TYPE_SMALL_STRUCT_4B; + break; + case 2: + flags = FFI_TYPE_SMALL_STRUCT_2B; + break; + case 1: + flags = FFI_TYPE_SMALL_STRUCT_1B; + break; + } + break; + } + cif->flags = flags; + + /* Each argument either fits in a register, an 8 byte slot, or is + passed by reference with the pointer in the 8 byte slot. */ + n = cif->nargs; + n += (flags == FFI_TYPE_STRUCT); + if (n < 4) + n = 4; + cif->bytes = n * 8; + + return FFI_OK; +} + +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + int i, j, n, flags; + UINT64 *stack; + size_t rsize; + struct win64_call_frame *frame; + + FFI_ASSERT(cif->abi == FFI_GNUW64 || cif->abi == FFI_WIN64); + + flags = cif->flags; + rsize = 0; + + /* If we have no return value for a structure, we need to create one. + Otherwise we can ignore the return type entirely. */ + if (rvalue == NULL) + { + if (flags == FFI_TYPE_STRUCT) + rsize = cif->rtype->size; + else + flags = FFI_TYPE_VOID; + } + + stack = alloca(cif->bytes + sizeof(struct win64_call_frame) + rsize); + frame = (struct win64_call_frame *)((char *)stack + cif->bytes); + if (rsize) + rvalue = frame + 1; + + frame->fn = (uintptr_t)fn; + frame->flags = flags; + frame->rvalue = (uintptr_t)rvalue; + + j = 0; + if (flags == FFI_TYPE_STRUCT) + { + stack[0] = (uintptr_t)rvalue; + j = 1; + } + + for (i = 0, n = cif->nargs; i < n; ++i, ++j) + { + switch (cif->arg_types[i]->size) + { + case 8: + stack[j] = *(UINT64 *)avalue[i]; + break; + case 4: + stack[j] = *(UINT32 *)avalue[i]; + break; + case 2: + stack[j] = *(UINT16 *)avalue[i]; + break; + case 1: + stack[j] = *(UINT8 *)avalue[i]; + break; + default: + stack[j] = (uintptr_t)avalue[i]; + break; + } + } + + ffi_call_win64 (stack, frame, closure); +} + +void +EFI64(ffi_call)(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +void +EFI64(ffi_call_go)(ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} + + +extern void ffi_closure_win64(void) FFI_HIDDEN; + +#ifdef FFI_GO_CLOSURES +extern void ffi_go_closure_win64(void) FFI_HIDDEN; +#endif + +ffi_status +EFI64(ffi_prep_closure_loc)(ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + static const unsigned char trampoline[FFI_TRAMPOLINE_SIZE - 8] = { + /* endbr64 */ + 0xf3, 0x0f, 0x1e, 0xfa, + /* leaq -0xb(%rip),%r10 # 0x0 */ + 0x4c, 0x8d, 0x15, 0xf5, 0xff, 0xff, 0xff, + /* jmpq *0x7(%rip) # 0x18 */ + 0xff, 0x25, 0x07, 0x00, 0x00, 0x00, + /* nopl 0(%rax) */ + 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00 + }; + char *tramp = closure->tramp; + + switch (cif->abi) + { + case FFI_WIN64: + case FFI_GNUW64: + break; + default: + return FFI_BAD_ABI; + } + + memcpy (tramp, trampoline, sizeof(trampoline)); + *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)ffi_closure_win64; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#ifdef FFI_GO_CLOSURES +ffi_status +EFI64(ffi_prep_go_closure)(ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*)) +{ + switch (cif->abi) + { + case FFI_WIN64: + case FFI_GNUW64: + break; + default: + return FFI_BAD_ABI; + } + + closure->tramp = ffi_go_closure_win64; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} +#endif + +struct win64_closure_frame +{ + UINT64 rvalue[2]; + UINT64 fargs[4]; + UINT64 retaddr; + UINT64 args[]; +}; + +/* Force the inner function to use the MS ABI. When compiling on win64 + this is a nop. When compiling on unix, this simplifies the assembly, + and places the burden of saving the extra call-saved registers on + the compiler. */ +int FFI_HIDDEN __attribute__((ms_abi)) +ffi_closure_win64_inner(ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + struct win64_closure_frame *frame) +{ + void **avalue; + void *rvalue; + int i, n, nreg, flags; + + avalue = alloca(cif->nargs * sizeof(void *)); + rvalue = frame->rvalue; + nreg = 0; + + /* When returning a structure, the address is in the first argument. + We must also be prepared to return the same address in eax, so + install that address in the frame and pretend we return a pointer. */ + flags = cif->flags; + if (flags == FFI_TYPE_STRUCT) + { + rvalue = (void *)(uintptr_t)frame->args[0]; + frame->rvalue[0] = frame->args[0]; + nreg = 1; + } + + for (i = 0, n = cif->nargs; i < n; ++i, ++nreg) + { + size_t size = cif->arg_types[i]->size; + size_t type = cif->arg_types[i]->type; + void *a; + + if (type == FFI_TYPE_DOUBLE || type == FFI_TYPE_FLOAT) + { + if (nreg < 4) + a = &frame->fargs[nreg]; + else + a = &frame->args[nreg]; + } + else if (size == 1 || size == 2 || size == 4 || size == 8) + a = &frame->args[nreg]; + else + a = (void *)(uintptr_t)frame->args[nreg]; + + avalue[i] = a; + } + + /* Invoke the closure. */ + fun (cif, rvalue, avalue, user_data); + return flags; +} + +#endif /* __x86_64__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/internal.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/internal.h new file mode 100644 index 000000000000..09771ba8cfb2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/internal.h @@ -0,0 +1,29 @@ +#define X86_RET_FLOAT 0 +#define X86_RET_DOUBLE 1 +#define X86_RET_LDOUBLE 2 +#define X86_RET_SINT8 3 +#define X86_RET_SINT16 4 +#define X86_RET_UINT8 5 +#define X86_RET_UINT16 6 +#define X86_RET_INT64 7 +#define X86_RET_INT32 8 +#define X86_RET_VOID 9 +#define X86_RET_STRUCTPOP 10 +#define X86_RET_STRUCTARG 11 +#define X86_RET_STRUCT_1B 12 +#define X86_RET_STRUCT_2B 13 +#define X86_RET_UNUSED14 14 +#define X86_RET_UNUSED15 15 + +#define X86_RET_TYPE_MASK 15 +#define X86_RET_POP_SHIFT 4 + +#define R_EAX 0 +#define R_EDX 1 +#define R_ECX 2 + +#ifdef __PCC__ +# define HAVE_FASTCALL 0 +#else +# define HAVE_FASTCALL 1 +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/internal64.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/internal64.h new file mode 100644 index 000000000000..512e95523e92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/internal64.h @@ -0,0 +1,22 @@ +#define UNIX64_RET_VOID 0 +#define UNIX64_RET_UINT8 1 +#define UNIX64_RET_UINT16 2 +#define UNIX64_RET_UINT32 3 +#define UNIX64_RET_SINT8 4 +#define UNIX64_RET_SINT16 5 +#define UNIX64_RET_SINT32 6 +#define UNIX64_RET_INT64 7 +#define UNIX64_RET_XMM32 8 +#define UNIX64_RET_XMM64 9 +#define UNIX64_RET_X87 10 +#define UNIX64_RET_X87_2 11 +#define UNIX64_RET_ST_XMM0_RAX 12 +#define UNIX64_RET_ST_RAX_XMM0 13 +#define UNIX64_RET_ST_XMM0_XMM1 14 +#define UNIX64_RET_ST_RAX_RDX 15 + +#define UNIX64_RET_LAST 15 + +#define UNIX64_FLAG_RET_IN_MEM (1 << 10) +#define UNIX64_FLAG_XMM_ARGS (1 << 11) +#define UNIX64_SIZE_SHIFT 12 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/sysv.S new file mode 100644 index 000000000000..d8ab4b02642a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/sysv.S @@ -0,0 +1,1138 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2017 Anthony Green + - Copyright (c) 2013 The Written Word, Inc. + - Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __i386__ +#ifndef _MSC_VER + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include "internal.h" + +#define C2(X, Y) X ## Y +#define C1(X, Y) C2(X, Y) +#ifdef __USER_LABEL_PREFIX__ +# define C(X) C1(__USER_LABEL_PREFIX__, X) +#else +# define C(X) X +#endif + +#ifdef X86_DARWIN +# define L(X) C1(L, X) +#else +# define L(X) C1(.L, X) +#endif + +#ifdef __ELF__ +# define ENDF(X) .type X,@function; .size X, . - X +#else +# define ENDF(X) +#endif + +/* Handle win32 fastcall name mangling. */ +#ifdef X86_WIN32 +# define ffi_call_i386 "@ffi_call_i386@8" +# define ffi_closure_inner "@ffi_closure_inner@8" +#else +# define ffi_call_i386 C(ffi_call_i386) +# define ffi_closure_inner C(ffi_closure_inner) +#endif + +/* This macro allows the safe creation of jump tables without an + actual table. The entry points into the table are all 8 bytes. + The use of ORG asserts that we're at the correct location. */ +/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ +#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) +# define E(BASE, X) .balign 8 +#else +# define E(BASE, X) .balign 8; .org BASE + X * 8 +#endif + + .text + .balign 16 + .globl ffi_call_i386 + FFI_HIDDEN(ffi_call_i386) + +/* This is declared as + + void ffi_call_i386(struct call_frame *frame, char *argp) + __attribute__((fastcall)); + + Thus the arguments are present in + + ecx: frame + edx: argp +*/ + +ffi_call_i386: +L(UW0): + # cfi_startproc + _CET_ENDBR +#if !HAVE_FASTCALL + movl 4(%esp), %ecx + movl 8(%esp), %edx +#endif + movl (%esp), %eax /* move the return address */ + movl %ebp, (%ecx) /* store %ebp into local frame */ + movl %eax, 4(%ecx) /* store retaddr into local frame */ + + /* New stack frame based off ebp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-4, so from the + perspective of the unwind info, it hasn't moved. */ + movl %ecx, %ebp +L(UW1): + # cfi_def_cfa(%ebp, 8) + # cfi_rel_offset(%ebp, 0) + + movl %edx, %esp /* set outgoing argument stack */ + movl 20+R_EAX*4(%ebp), %eax /* set register arguments */ + movl 20+R_EDX*4(%ebp), %edx + movl 20+R_ECX*4(%ebp), %ecx + + call *8(%ebp) + + movl 12(%ebp), %ecx /* load return type code */ + movl %ebx, 8(%ebp) /* preserve %ebx */ +L(UW2): + # cfi_rel_offset(%ebx, 8) + + andl $X86_RET_TYPE_MASK, %ecx +#ifdef __PIC__ + call C(__x86.get_pc_thunk.bx) +L(pc1): + leal L(store_table)-L(pc1)(%ebx, %ecx, 8), %ebx +#else + leal L(store_table)(,%ecx, 8), %ebx +#endif + movl 16(%ebp), %ecx /* load result address */ + _CET_NOTRACK jmp *%ebx + + .balign 8 +L(store_table): +E(L(store_table), X86_RET_FLOAT) + fstps (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_DOUBLE) + fstpl (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_LDOUBLE) + fstpt (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_SINT8) + movsbl %al, %eax + mov %eax, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_SINT16) + movswl %ax, %eax + mov %eax, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_UINT8) + movzbl %al, %eax + mov %eax, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_UINT16) + movzwl %ax, %eax + mov %eax, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_INT64) + movl %edx, 4(%ecx) + /* fallthru */ +E(L(store_table), X86_RET_INT32) + movl %eax, (%ecx) + /* fallthru */ +E(L(store_table), X86_RET_VOID) +L(e1): + movl 8(%ebp), %ebx + movl %ebp, %esp + popl %ebp +L(UW3): + # cfi_remember_state + # cfi_def_cfa(%esp, 4) + # cfi_restore(%ebx) + # cfi_restore(%ebp) + ret +L(UW4): + # cfi_restore_state + +E(L(store_table), X86_RET_STRUCTPOP) + jmp L(e1) +E(L(store_table), X86_RET_STRUCTARG) + jmp L(e1) +E(L(store_table), X86_RET_STRUCT_1B) + movb %al, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_STRUCT_2B) + movw %ax, (%ecx) + jmp L(e1) + + /* Fill out the table so that bad values are predictable. */ +E(L(store_table), X86_RET_UNUSED14) + ud2 +E(L(store_table), X86_RET_UNUSED15) + ud2 + +L(UW5): + # cfi_endproc +ENDF(ffi_call_i386) + +/* The inner helper is declared as + + void ffi_closure_inner(struct closure_frame *frame, char *argp) + __attribute_((fastcall)) + + Thus the arguments are placed in + + ecx: frame + edx: argp +*/ + +/* Macros to help setting up the closure_data structure. */ + +#if HAVE_FASTCALL +# define closure_FS (40 + 4) +# define closure_CF 0 +#else +# define closure_FS (8 + 40 + 12) +# define closure_CF 8 +#endif + +#define FFI_CLOSURE_SAVE_REGS \ + movl %eax, closure_CF+16+R_EAX*4(%esp); \ + movl %edx, closure_CF+16+R_EDX*4(%esp); \ + movl %ecx, closure_CF+16+R_ECX*4(%esp) + +#define FFI_CLOSURE_COPY_TRAMP_DATA \ + movl FFI_TRAMPOLINE_SIZE(%eax), %edx; /* copy cif */ \ + movl FFI_TRAMPOLINE_SIZE+4(%eax), %ecx; /* copy fun */ \ + movl FFI_TRAMPOLINE_SIZE+8(%eax), %eax; /* copy user_data */ \ + movl %edx, closure_CF+28(%esp); \ + movl %ecx, closure_CF+32(%esp); \ + movl %eax, closure_CF+36(%esp) + +#if HAVE_FASTCALL +# define FFI_CLOSURE_PREP_CALL \ + movl %esp, %ecx; /* load closure_data */ \ + leal closure_FS+4(%esp), %edx; /* load incoming stack */ +#else +# define FFI_CLOSURE_PREP_CALL \ + leal closure_CF(%esp), %ecx; /* load closure_data */ \ + leal closure_FS+4(%esp), %edx; /* load incoming stack */ \ + movl %ecx, (%esp); \ + movl %edx, 4(%esp) +#endif + +#define FFI_CLOSURE_CALL_INNER(UWN) \ + call ffi_closure_inner + +#define FFI_CLOSURE_MASK_AND_JUMP(N, UW) \ + andl $X86_RET_TYPE_MASK, %eax; \ + leal L(C1(load_table,N))(, %eax, 8), %edx; \ + movl closure_CF(%esp), %eax; /* optimiztic load */ \ + _CET_NOTRACK jmp *%edx + +#ifdef __PIC__ +# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +# undef FFI_CLOSURE_MASK_AND_JUMP +# define FFI_CLOSURE_MASK_AND_JUMP(N, UW) \ + andl $X86_RET_TYPE_MASK, %eax; \ + call C(__x86.get_pc_thunk.dx); \ +L(C1(pc,N)): \ + leal L(C1(load_table,N))-L(C1(pc,N))(%edx, %eax, 8), %edx; \ + movl closure_CF(%esp), %eax; /* optimiztic load */ \ + _CET_NOTRACK jmp *%edx +# else +# define FFI_CLOSURE_CALL_INNER_SAVE_EBX +# undef FFI_CLOSURE_CALL_INNER +# define FFI_CLOSURE_CALL_INNER(UWN) \ + movl %ebx, 40(%esp); /* save ebx */ \ +L(C1(UW,UWN)): \ + /* cfi_rel_offset(%ebx, 40); */ \ + call C(__x86.get_pc_thunk.bx); /* load got register */ \ + addl $C(_GLOBAL_OFFSET_TABLE_), %ebx; \ + call ffi_closure_inner@PLT +# undef FFI_CLOSURE_MASK_AND_JUMP +# define FFI_CLOSURE_MASK_AND_JUMP(N, UWN) \ + andl $X86_RET_TYPE_MASK, %eax; \ + leal L(C1(load_table,N))@GOTOFF(%ebx, %eax, 8), %edx; \ + movl 40(%esp), %ebx; /* restore ebx */ \ +L(C1(UW,UWN)): \ + /* cfi_restore(%ebx); */ \ + movl closure_CF(%esp), %eax; /* optimiztic load */ \ + _CET_NOTRACK jmp *%edx +# endif /* DARWIN || HIDDEN */ +#endif /* __PIC__ */ + + .balign 16 + .globl C(ffi_go_closure_EAX) + FFI_HIDDEN(C(ffi_go_closure_EAX)) +C(ffi_go_closure_EAX): +L(UW6): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW7): + # cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + movl 4(%eax), %edx /* copy cif */ + movl 8(%eax), %ecx /* copy fun */ + movl %edx, closure_CF+28(%esp) + movl %ecx, closure_CF+32(%esp) + movl %eax, closure_CF+36(%esp) /* closure is user_data */ + jmp L(do_closure_i386) +L(UW8): + # cfi_endproc +ENDF(C(ffi_go_closure_EAX)) + + .balign 16 + .globl C(ffi_go_closure_ECX) + FFI_HIDDEN(C(ffi_go_closure_ECX)) +C(ffi_go_closure_ECX): +L(UW9): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW10): + # cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + movl 4(%ecx), %edx /* copy cif */ + movl 8(%ecx), %eax /* copy fun */ + movl %edx, closure_CF+28(%esp) + movl %eax, closure_CF+32(%esp) + movl %ecx, closure_CF+36(%esp) /* closure is user_data */ + jmp L(do_closure_i386) +L(UW11): + # cfi_endproc +ENDF(C(ffi_go_closure_ECX)) + +/* The closure entry points are reached from the ffi_closure trampoline. + On entry, %eax contains the address of the ffi_closure. */ + + .balign 16 + .globl C(ffi_closure_i386) + FFI_HIDDEN(C(ffi_closure_i386)) + +C(ffi_closure_i386): +L(UW12): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW13): + # cfi_def_cfa_offset(closure_FS + 4) + + FFI_CLOSURE_SAVE_REGS + FFI_CLOSURE_COPY_TRAMP_DATA + + /* Entry point from preceeding Go closures. */ +L(do_closure_i386): + + FFI_CLOSURE_PREP_CALL + FFI_CLOSURE_CALL_INNER(14) + FFI_CLOSURE_MASK_AND_JUMP(2, 15) + + .balign 8 +L(load_table2): +E(L(load_table2), X86_RET_FLOAT) + flds closure_CF(%esp) + jmp L(e2) +E(L(load_table2), X86_RET_DOUBLE) + fldl closure_CF(%esp) + jmp L(e2) +E(L(load_table2), X86_RET_LDOUBLE) + fldt closure_CF(%esp) + jmp L(e2) +E(L(load_table2), X86_RET_SINT8) + movsbl %al, %eax + jmp L(e2) +E(L(load_table2), X86_RET_SINT16) + movswl %ax, %eax + jmp L(e2) +E(L(load_table2), X86_RET_UINT8) + movzbl %al, %eax + jmp L(e2) +E(L(load_table2), X86_RET_UINT16) + movzwl %ax, %eax + jmp L(e2) +E(L(load_table2), X86_RET_INT64) + movl closure_CF+4(%esp), %edx + jmp L(e2) +E(L(load_table2), X86_RET_INT32) + nop + /* fallthru */ +E(L(load_table2), X86_RET_VOID) +L(e2): + addl $closure_FS, %esp +L(UW16): + # cfi_adjust_cfa_offset(-closure_FS) + ret +L(UW17): + # cfi_adjust_cfa_offset(closure_FS) +E(L(load_table2), X86_RET_STRUCTPOP) + addl $closure_FS, %esp +L(UW18): + # cfi_adjust_cfa_offset(-closure_FS) + ret $4 +L(UW19): + # cfi_adjust_cfa_offset(closure_FS) +E(L(load_table2), X86_RET_STRUCTARG) + jmp L(e2) +E(L(load_table2), X86_RET_STRUCT_1B) + movzbl %al, %eax + jmp L(e2) +E(L(load_table2), X86_RET_STRUCT_2B) + movzwl %ax, %eax + jmp L(e2) + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table2), X86_RET_UNUSED14) + ud2 +E(L(load_table2), X86_RET_UNUSED15) + ud2 + +L(UW20): + # cfi_endproc +ENDF(C(ffi_closure_i386)) + + .balign 16 + .globl C(ffi_go_closure_STDCALL) + FFI_HIDDEN(C(ffi_go_closure_STDCALL)) +C(ffi_go_closure_STDCALL): +L(UW21): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW22): + # cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + movl 4(%ecx), %edx /* copy cif */ + movl 8(%ecx), %eax /* copy fun */ + movl %edx, closure_CF+28(%esp) + movl %eax, closure_CF+32(%esp) + movl %ecx, closure_CF+36(%esp) /* closure is user_data */ + jmp L(do_closure_STDCALL) +L(UW23): + # cfi_endproc +ENDF(C(ffi_go_closure_STDCALL)) + +/* For REGISTER, we have no available parameter registers, and so we + enter here having pushed the closure onto the stack. */ + + .balign 16 + .globl C(ffi_closure_REGISTER) + FFI_HIDDEN(C(ffi_closure_REGISTER)) +C(ffi_closure_REGISTER): +L(UW24): + # cfi_startproc + # cfi_def_cfa(%esp, 8) + # cfi_offset(%eip, -8) + _CET_ENDBR + subl $closure_FS-4, %esp +L(UW25): + # cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + movl closure_FS-4(%esp), %ecx /* load retaddr */ + movl closure_FS(%esp), %eax /* load closure */ + movl %ecx, closure_FS(%esp) /* move retaddr */ + jmp L(do_closure_REGISTER) +L(UW26): + # cfi_endproc +ENDF(C(ffi_closure_REGISTER)) + +/* For STDCALL (and others), we need to pop N bytes of arguments off + the stack following the closure. The amount needing to be popped + is returned to us from ffi_closure_inner. */ + + .balign 16 + .globl C(ffi_closure_STDCALL) + FFI_HIDDEN(C(ffi_closure_STDCALL)) +C(ffi_closure_STDCALL): +L(UW27): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW28): + # cfi_def_cfa_offset(closure_FS + 4) + + FFI_CLOSURE_SAVE_REGS + + /* Entry point from ffi_closure_REGISTER. */ +L(do_closure_REGISTER): + + FFI_CLOSURE_COPY_TRAMP_DATA + + /* Entry point from preceeding Go closure. */ +L(do_closure_STDCALL): + + FFI_CLOSURE_PREP_CALL + FFI_CLOSURE_CALL_INNER(29) + + movl %eax, %ecx + shrl $X86_RET_POP_SHIFT, %ecx /* isolate pop count */ + leal closure_FS(%esp, %ecx), %ecx /* compute popped esp */ + movl closure_FS(%esp), %edx /* move return address */ + movl %edx, (%ecx) + + /* From this point on, the value of %esp upon return is %ecx+4, + and we've copied the return address to %ecx to make return easy. + There's no point in representing this in the unwind info, as + there is always a window between the mov and the ret which + will be wrong from one point of view or another. */ + + FFI_CLOSURE_MASK_AND_JUMP(3, 30) + + .balign 8 +L(load_table3): +E(L(load_table3), X86_RET_FLOAT) + flds closure_CF(%esp) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_DOUBLE) + fldl closure_CF(%esp) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_LDOUBLE) + fldt closure_CF(%esp) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_SINT8) + movsbl %al, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_SINT16) + movswl %ax, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_UINT8) + movzbl %al, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_UINT16) + movzwl %ax, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_INT64) + movl closure_CF+4(%esp), %edx + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_INT32) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_VOID) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_STRUCTPOP) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_STRUCTARG) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_STRUCT_1B) + movzbl %al, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_STRUCT_2B) + movzwl %ax, %eax + movl %ecx, %esp + ret + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table3), X86_RET_UNUSED14) + ud2 +E(L(load_table3), X86_RET_UNUSED15) + ud2 + +L(UW31): + # cfi_endproc +ENDF(C(ffi_closure_STDCALL)) + +#if !FFI_NO_RAW_API + +#define raw_closure_S_FS (16+16+12) + + .balign 16 + .globl C(ffi_closure_raw_SYSV) + FFI_HIDDEN(C(ffi_closure_raw_SYSV)) +C(ffi_closure_raw_SYSV): +L(UW32): + # cfi_startproc + _CET_ENDBR + subl $raw_closure_S_FS, %esp +L(UW33): + # cfi_def_cfa_offset(raw_closure_S_FS + 4) + movl %ebx, raw_closure_S_FS-4(%esp) +L(UW34): + # cfi_rel_offset(%ebx, raw_closure_S_FS-4) + + movl FFI_TRAMPOLINE_SIZE+8(%eax), %edx /* load cl->user_data */ + movl %edx, 12(%esp) + leal raw_closure_S_FS+4(%esp), %edx /* load raw_args */ + movl %edx, 8(%esp) + leal 16(%esp), %edx /* load &res */ + movl %edx, 4(%esp) + movl FFI_TRAMPOLINE_SIZE(%eax), %ebx /* load cl->cif */ + movl %ebx, (%esp) + call *FFI_TRAMPOLINE_SIZE+4(%eax) /* call cl->fun */ + + movl 20(%ebx), %eax /* load cif->flags */ + andl $X86_RET_TYPE_MASK, %eax +#ifdef __PIC__ + call C(__x86.get_pc_thunk.bx) +L(pc4): + leal L(load_table4)-L(pc4)(%ebx, %eax, 8), %ecx +#else + leal L(load_table4)(,%eax, 8), %ecx +#endif + movl raw_closure_S_FS-4(%esp), %ebx +L(UW35): + # cfi_restore(%ebx) + movl 16(%esp), %eax /* Optimistic load */ + jmp *%ecx + + .balign 8 +L(load_table4): +E(L(load_table4), X86_RET_FLOAT) + flds 16(%esp) + jmp L(e4) +E(L(load_table4), X86_RET_DOUBLE) + fldl 16(%esp) + jmp L(e4) +E(L(load_table4), X86_RET_LDOUBLE) + fldt 16(%esp) + jmp L(e4) +E(L(load_table4), X86_RET_SINT8) + movsbl %al, %eax + jmp L(e4) +E(L(load_table4), X86_RET_SINT16) + movswl %ax, %eax + jmp L(e4) +E(L(load_table4), X86_RET_UINT8) + movzbl %al, %eax + jmp L(e4) +E(L(load_table4), X86_RET_UINT16) + movzwl %ax, %eax + jmp L(e4) +E(L(load_table4), X86_RET_INT64) + movl 16+4(%esp), %edx + jmp L(e4) +E(L(load_table4), X86_RET_INT32) + nop + /* fallthru */ +E(L(load_table4), X86_RET_VOID) +L(e4): + addl $raw_closure_S_FS, %esp +L(UW36): + # cfi_adjust_cfa_offset(-raw_closure_S_FS) + ret +L(UW37): + # cfi_adjust_cfa_offset(raw_closure_S_FS) +E(L(load_table4), X86_RET_STRUCTPOP) + addl $raw_closure_S_FS, %esp +L(UW38): + # cfi_adjust_cfa_offset(-raw_closure_S_FS) + ret $4 +L(UW39): + # cfi_adjust_cfa_offset(raw_closure_S_FS) +E(L(load_table4), X86_RET_STRUCTARG) + jmp L(e4) +E(L(load_table4), X86_RET_STRUCT_1B) + movzbl %al, %eax + jmp L(e4) +E(L(load_table4), X86_RET_STRUCT_2B) + movzwl %ax, %eax + jmp L(e4) + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table4), X86_RET_UNUSED14) + ud2 +E(L(load_table4), X86_RET_UNUSED15) + ud2 + +L(UW40): + # cfi_endproc +ENDF(C(ffi_closure_raw_SYSV)) + +#define raw_closure_T_FS (16+16+8) + + .balign 16 + .globl C(ffi_closure_raw_THISCALL) + FFI_HIDDEN(C(ffi_closure_raw_THISCALL)) +C(ffi_closure_raw_THISCALL): +L(UW41): + # cfi_startproc + _CET_ENDBR + /* Rearrange the stack such that %ecx is the first argument. + This means moving the return address. */ + popl %edx +L(UW42): + # cfi_def_cfa_offset(0) + # cfi_register(%eip, %edx) + pushl %ecx +L(UW43): + # cfi_adjust_cfa_offset(4) + pushl %edx +L(UW44): + # cfi_adjust_cfa_offset(4) + # cfi_rel_offset(%eip, 0) + subl $raw_closure_T_FS, %esp +L(UW45): + # cfi_adjust_cfa_offset(raw_closure_T_FS) + movl %ebx, raw_closure_T_FS-4(%esp) +L(UW46): + # cfi_rel_offset(%ebx, raw_closure_T_FS-4) + + movl FFI_TRAMPOLINE_SIZE+8(%eax), %edx /* load cl->user_data */ + movl %edx, 12(%esp) + leal raw_closure_T_FS+4(%esp), %edx /* load raw_args */ + movl %edx, 8(%esp) + leal 16(%esp), %edx /* load &res */ + movl %edx, 4(%esp) + movl FFI_TRAMPOLINE_SIZE(%eax), %ebx /* load cl->cif */ + movl %ebx, (%esp) + call *FFI_TRAMPOLINE_SIZE+4(%eax) /* call cl->fun */ + + movl 20(%ebx), %eax /* load cif->flags */ + andl $X86_RET_TYPE_MASK, %eax +#ifdef __PIC__ + call C(__x86.get_pc_thunk.bx) +L(pc5): + leal L(load_table5)-L(pc5)(%ebx, %eax, 8), %ecx +#else + leal L(load_table5)(,%eax, 8), %ecx +#endif + movl raw_closure_T_FS-4(%esp), %ebx +L(UW47): + # cfi_restore(%ebx) + movl 16(%esp), %eax /* Optimistic load */ + jmp *%ecx + + .balign 8 +L(load_table5): +E(L(load_table5), X86_RET_FLOAT) + flds 16(%esp) + jmp L(e5) +E(L(load_table5), X86_RET_DOUBLE) + fldl 16(%esp) + jmp L(e5) +E(L(load_table5), X86_RET_LDOUBLE) + fldt 16(%esp) + jmp L(e5) +E(L(load_table5), X86_RET_SINT8) + movsbl %al, %eax + jmp L(e5) +E(L(load_table5), X86_RET_SINT16) + movswl %ax, %eax + jmp L(e5) +E(L(load_table5), X86_RET_UINT8) + movzbl %al, %eax + jmp L(e5) +E(L(load_table5), X86_RET_UINT16) + movzwl %ax, %eax + jmp L(e5) +E(L(load_table5), X86_RET_INT64) + movl 16+4(%esp), %edx + jmp L(e5) +E(L(load_table5), X86_RET_INT32) + nop + /* fallthru */ +E(L(load_table5), X86_RET_VOID) +L(e5): + addl $raw_closure_T_FS, %esp +L(UW48): + # cfi_adjust_cfa_offset(-raw_closure_T_FS) + /* Remove the extra %ecx argument we pushed. */ + ret $4 +L(UW49): + # cfi_adjust_cfa_offset(raw_closure_T_FS) +E(L(load_table5), X86_RET_STRUCTPOP) + addl $raw_closure_T_FS, %esp +L(UW50): + # cfi_adjust_cfa_offset(-raw_closure_T_FS) + ret $8 +L(UW51): + # cfi_adjust_cfa_offset(raw_closure_T_FS) +E(L(load_table5), X86_RET_STRUCTARG) + jmp L(e5) +E(L(load_table5), X86_RET_STRUCT_1B) + movzbl %al, %eax + jmp L(e5) +E(L(load_table5), X86_RET_STRUCT_2B) + movzwl %ax, %eax + jmp L(e5) + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table5), X86_RET_UNUSED14) + ud2 +E(L(load_table5), X86_RET_UNUSED15) + ud2 + +L(UW52): + # cfi_endproc +ENDF(C(ffi_closure_raw_THISCALL)) + +#endif /* !FFI_NO_RAW_API */ + +#ifdef X86_DARWIN +# define COMDAT(X) \ + .section __TEXT,__text,coalesced,pure_instructions; \ + .weak_definition X; \ + FFI_HIDDEN(X) +#elif defined __ELF__ && !(defined(__sun__) && defined(__svr4__)) +# define COMDAT(X) \ + .section .text.X,"axG",@progbits,X,comdat; \ + .globl X; \ + FFI_HIDDEN(X) +#else +# define COMDAT(X) +#endif + +#if defined(__PIC__) + COMDAT(C(__x86.get_pc_thunk.bx)) +C(__x86.get_pc_thunk.bx): + movl (%esp), %ebx + ret +ENDF(C(__x86.get_pc_thunk.bx)) +# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE + COMDAT(C(__x86.get_pc_thunk.dx)) +C(__x86.get_pc_thunk.dx): + movl (%esp), %edx + ret +ENDF(C(__x86.get_pc_thunk.dx)) +#endif /* DARWIN || HIDDEN */ +#endif /* __PIC__ */ + +/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ + +#ifdef __APPLE__ +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EHFrame0: +#elif defined(X86_WIN32) +.section .eh_frame,"r" +#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) +.section .eh_frame,EH_FRAME_FLAGS,@unwind +#else +.section .eh_frame,EH_FRAME_FLAGS,@progbits +#endif + +#ifdef HAVE_AS_X86_PCREL +# define PCREL(X) X - . +#else +# define PCREL(X) X@rel +#endif + +/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ +#define ADV(N, P) .byte 2, L(N)-L(P) + + .balign 4 +L(CIE): + .set L(set0),L(ECIE)-L(SCIE) + .long L(set0) /* CIE Length */ +L(SCIE): + .long 0 /* CIE Identifier Tag */ + .byte 1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 1 /* CIE Code Alignment Factor */ + .byte 0x7c /* CIE Data Alignment Factor */ + .byte 0x8 /* CIE RA Column */ + .byte 1 /* Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ + .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp offset 4 */ + .byte 0x80+8, 1 /* DW_CFA_offset, %eip offset 1*-4 */ + .balign 4 +L(ECIE): + + .set L(set1),L(EFDE1)-L(SFDE1) + .long L(set1) /* FDE Length */ +L(SFDE1): + .long L(SFDE1)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW0)) /* Initial location */ + .long L(UW5)-L(UW0) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW1, UW0) + .byte 0xc, 5, 8 /* DW_CFA_def_cfa, %ebp 8 */ + .byte 0x80+5, 2 /* DW_CFA_offset, %ebp 2*-4 */ + ADV(UW2, UW1) + .byte 0x80+3, 0 /* DW_CFA_offset, %ebx 0*-4 */ + ADV(UW3, UW2) + .byte 0xa /* DW_CFA_remember_state */ + .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp 4 */ + .byte 0xc0+3 /* DW_CFA_restore, %ebx */ + .byte 0xc0+5 /* DW_CFA_restore, %ebp */ + ADV(UW4, UW3) + .byte 0xb /* DW_CFA_restore_state */ + .balign 4 +L(EFDE1): + + .set L(set2),L(EFDE2)-L(SFDE2) + .long L(set2) /* FDE Length */ +L(SFDE2): + .long L(SFDE2)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW6)) /* Initial location */ + .long L(UW8)-L(UW6) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW7, UW6) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE2): + + .set L(set3),L(EFDE3)-L(SFDE3) + .long L(set3) /* FDE Length */ +L(SFDE3): + .long L(SFDE3)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW9)) /* Initial location */ + .long L(UW11)-L(UW9) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW10, UW9) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE3): + + .set L(set4),L(EFDE4)-L(SFDE4) + .long L(set4) /* FDE Length */ +L(SFDE4): + .long L(SFDE4)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW12)) /* Initial location */ + .long L(UW20)-L(UW12) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW13, UW12) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ +#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX + ADV(UW14, UW13) + .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ + ADV(UW15, UW14) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ + ADV(UW16, UW15) +#else + ADV(UW16, UW13) +#endif + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW17, UW16) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + ADV(UW18, UW17) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW19, UW18) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE4): + + .set L(set5),L(EFDE5)-L(SFDE5) + .long L(set5) /* FDE Length */ +L(SFDE5): + .long L(SFDE5)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW21)) /* Initial location */ + .long L(UW23)-L(UW21) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW22, UW21) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE5): + + .set L(set6),L(EFDE6)-L(SFDE6) + .long L(set6) /* FDE Length */ +L(SFDE6): + .long L(SFDE6)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW24)) /* Initial location */ + .long L(UW26)-L(UW24) /* Address range */ + .byte 0 /* Augmentation size */ + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + .byte 0x80+8, 2 /* DW_CFA_offset %eip, 2*-4 */ + ADV(UW25, UW24) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE6): + + .set L(set7),L(EFDE7)-L(SFDE7) + .long L(set7) /* FDE Length */ +L(SFDE7): + .long L(SFDE7)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW27)) /* Initial location */ + .long L(UW31)-L(UW27) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW28, UW27) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ +#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX + ADV(UW29, UW28) + .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ + ADV(UW30, UW29) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ +#endif + .balign 4 +L(EFDE7): + +#if !FFI_NO_RAW_API + .set L(set8),L(EFDE8)-L(SFDE8) + .long L(set8) /* FDE Length */ +L(SFDE8): + .long L(SFDE8)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW32)) /* Initial location */ + .long L(UW40)-L(UW32) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW33, UW32) + .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ + ADV(UW34, UW33) + .byte 0x80+3, 2 /* DW_CFA_offset %ebx 2*-4 */ + ADV(UW35, UW34) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ + ADV(UW36, UW35) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW37, UW36) + .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ + ADV(UW38, UW37) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW39, UW38) + .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE8): + + .set L(set9),L(EFDE9)-L(SFDE9) + .long L(set9) /* FDE Length */ +L(SFDE9): + .long L(SFDE9)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW41)) /* Initial location */ + .long L(UW52)-L(UW41) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW42, UW41) + .byte 0xe, 0 /* DW_CFA_def_cfa_offset */ + .byte 0x9, 8, 2 /* DW_CFA_register %eip, %edx */ + ADV(UW43, UW42) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW44, UW43) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + .byte 0x80+8, 2 /* DW_CFA_offset %eip 2*-4 */ + ADV(UW45, UW44) + .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ + ADV(UW46, UW45) + .byte 0x80+3, 3 /* DW_CFA_offset %ebx 3*-4 */ + ADV(UW47, UW46) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ + ADV(UW48, UW47) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + ADV(UW49, UW48) + .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ + ADV(UW50, UW49) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + ADV(UW51, UW50) + .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE9): +#endif /* !FFI_NO_RAW_API */ + +#ifdef _WIN32 + .def @feat.00; + .scl 3; + .type 0; + .endef + .globl @feat.00 +@feat.00 = 1 +#endif + +#ifdef __APPLE__ + .subsections_via_symbols + .section __LD,__compact_unwind,regular,debug + + /* compact unwind for ffi_call_i386 */ + .long C(ffi_call_i386) + .set L1,L(UW5)-L(UW0) + .long L1 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_go_closure_EAX */ + .long C(ffi_go_closure_EAX) + .set L2,L(UW8)-L(UW6) + .long L2 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_go_closure_ECX */ + .long C(ffi_go_closure_ECX) + .set L3,L(UW11)-L(UW9) + .long L3 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_i386 */ + .long C(ffi_closure_i386) + .set L4,L(UW20)-L(UW12) + .long L4 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_go_closure_STDCALL */ + .long C(ffi_go_closure_STDCALL) + .set L5,L(UW23)-L(UW21) + .long L5 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_REGISTER */ + .long C(ffi_closure_REGISTER) + .set L6,L(UW26)-L(UW24) + .long L6 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_STDCALL */ + .long C(ffi_closure_STDCALL) + .set L7,L(UW31)-L(UW27) + .long L7 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_raw_SYSV */ + .long C(ffi_closure_raw_SYSV) + .set L8,L(UW40)-L(UW32) + .long L8 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_raw_THISCALL */ + .long C(ffi_closure_raw_THISCALL) + .set L9,L(UW52)-L(UW41) + .long L9 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 +#endif /* __APPLE__ */ + +#endif /* ifndef _MSC_VER */ +#endif /* ifdef __i386__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/sysv_intel.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/sysv_intel.S new file mode 100644 index 000000000000..3cafd71ce18f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/sysv_intel.S @@ -0,0 +1,995 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2017 Anthony Green + - Copyright (c) 2013 The Written Word, Inc. + - Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef __x86_64__ +#ifdef _MSC_VER + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "internal.h" + +#define C2(X, Y) X ## Y +#define C1(X, Y) C2(X, Y) +#define L(X) C1(L, X) +# define ENDF(X) X ENDP + +/* This macro allows the safe creation of jump tables without an + actual table. The entry points into the table are all 8 bytes. + The use of ORG asserts that we're at the correct location. */ +/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ +#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) +# define E(BASE, X) ALIGN 8 +#else +# define E(BASE, X) ALIGN 8; ORG BASE + X * 8 +#endif + + .686P + .MODEL FLAT + +EXTRN @ffi_closure_inner@8:PROC +_TEXT SEGMENT + +/* This is declared as + + void ffi_call_i386(struct call_frame *frame, char *argp) + __attribute__((fastcall)); + + Thus the arguments are present in + + ecx: frame + edx: argp +*/ + +ALIGN 16 +PUBLIC @ffi_call_i386@8 +@ffi_call_i386@8 PROC +L(UW0): + cfi_startproc + #if !HAVE_FASTCALL + mov ecx, [esp+4] + mov edx, [esp+8] + #endif + mov eax, [esp] /* move the return address */ + mov [ecx], ebp /* store ebp into local frame */ + mov [ecx+4], eax /* store retaddr into local frame */ + + /* New stack frame based off ebp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-4, so from the + perspective of the unwind info, it hasn't moved. */ + mov ebp, ecx +L(UW1): + // cfi_def_cfa(%ebp, 8) + // cfi_rel_offset(%ebp, 0) + + mov esp, edx /* set outgoing argument stack */ + mov eax, [20+R_EAX*4+ebp] /* set register arguments */ + mov edx, [20+R_EDX*4+ebp] + mov ecx, [20+R_ECX*4+ebp] + + call dword ptr [ebp+8] + + mov ecx, [12+ebp] /* load return type code */ + mov [ebp+8], ebx /* preserve %ebx */ +L(UW2): + // cfi_rel_offset(%ebx, 8) + + and ecx, X86_RET_TYPE_MASK + lea ebx, [L(store_table) + ecx * 8] + mov ecx, [ebp+16] /* load result address */ + jmp ebx + + ALIGN 8 +L(store_table): +E(L(store_table), X86_RET_FLOAT) + fstp DWORD PTR [ecx] + jmp L(e1) +E(L(store_table), X86_RET_DOUBLE) + fstp QWORD PTR [ecx] + jmp L(e1) +E(L(store_table), X86_RET_LDOUBLE) + fstp QWORD PTR [ecx] + jmp L(e1) +E(L(store_table), X86_RET_SINT8) + movsx eax, al + mov [ecx], eax + jmp L(e1) +E(L(store_table), X86_RET_SINT16) + movsx eax, ax + mov [ecx], eax + jmp L(e1) +E(L(store_table), X86_RET_UINT8) + movzx eax, al + mov [ecx], eax + jmp L(e1) +E(L(store_table), X86_RET_UINT16) + movzx eax, ax + mov [ecx], eax + jmp L(e1) +E(L(store_table), X86_RET_INT64) + mov [ecx+4], edx + /* fallthru */ +E(L(store_table), X86_RET_int 32) + mov [ecx], eax + /* fallthru */ +E(L(store_table), X86_RET_VOID) +L(e1): + mov ebx, [ebp+8] + mov esp, ebp + pop ebp +L(UW3): + // cfi_remember_state + // cfi_def_cfa(%esp, 4) + // cfi_restore(%ebx) + // cfi_restore(%ebp) + ret +L(UW4): + // cfi_restore_state + +E(L(store_table), X86_RET_STRUCTPOP) + jmp L(e1) +E(L(store_table), X86_RET_STRUCTARG) + jmp L(e1) +E(L(store_table), X86_RET_STRUCT_1B) + mov [ecx], al + jmp L(e1) +E(L(store_table), X86_RET_STRUCT_2B) + mov [ecx], ax + jmp L(e1) + + /* Fill out the table so that bad values are predictable. */ +E(L(store_table), X86_RET_UNUSED14) + int 3 +E(L(store_table), X86_RET_UNUSED15) + int 3 + +L(UW5): + // cfi_endproc +ENDF(@ffi_call_i386@8) + +/* The inner helper is declared as + + void ffi_closure_inner(struct closure_frame *frame, char *argp) + __attribute_((fastcall)) + + Thus the arguments are placed in + + ecx: frame + edx: argp +*/ + +/* Macros to help setting up the closure_data structure. */ + +#if HAVE_FASTCALL +# define closure_FS (40 + 4) +# define closure_CF 0 +#else +# define closure_FS (8 + 40 + 12) +# define closure_CF 8 +#endif + +FFI_CLOSURE_SAVE_REGS MACRO + mov [esp + closure_CF+16+R_EAX*4], eax + mov [esp + closure_CF+16+R_EDX*4], edx + mov [esp + closure_CF+16+R_ECX*4], ecx +ENDM + +FFI_CLOSURE_COPY_TRAMP_DATA MACRO + mov edx, [eax+FFI_TRAMPOLINE_SIZE] /* copy cif */ + mov ecx, [eax+FFI_TRAMPOLINE_SIZE+4] /* copy fun */ + mov eax, [eax+FFI_TRAMPOLINE_SIZE+8]; /* copy user_data */ + mov [esp+closure_CF+28], edx + mov [esp+closure_CF+32], ecx + mov [esp+closure_CF+36], eax +ENDM + +#if HAVE_FASTCALL +FFI_CLOSURE_PREP_CALL MACRO + mov ecx, esp /* load closure_data */ + lea edx, [esp+closure_FS+4] /* load incoming stack */ +ENDM +#else +FFI_CLOSURE_PREP_CALL MACRO + lea ecx, [esp+closure_CF] /* load closure_data */ + lea edx, [esp+closure_FS+4] /* load incoming stack */ + mov [esp], ecx + mov [esp+4], edx +ENDM +#endif + +FFI_CLOSURE_CALL_INNER MACRO UWN + call @ffi_closure_inner@8 +ENDM + +FFI_CLOSURE_MASK_AND_JUMP MACRO LABEL + and eax, X86_RET_TYPE_MASK + lea edx, [LABEL+eax*8] + mov eax, [esp+closure_CF] /* optimiztic load */ + jmp edx +ENDM + +ALIGN 16 +PUBLIC ffi_go_closure_EAX +ffi_go_closure_EAX PROC C +L(UW6): + // cfi_startproc + sub esp, closure_FS +L(UW7): + // cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + mov edx, [eax+4] /* copy cif */ + mov ecx, [eax +8] /* copy fun */ + mov [esp+closure_CF+28], edx + mov [esp+closure_CF+32], ecx + mov [esp+closure_CF+36], eax /* closure is user_data */ + jmp L(do_closure_i386) +L(UW8): + // cfi_endproc +ENDF(ffi_go_closure_EAX) + +ALIGN 16 +PUBLIC ffi_go_closure_ECX +ffi_go_closure_ECX PROC C +L(UW9): + // cfi_startproc + sub esp, closure_FS +L(UW10): + // cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + mov edx, [ecx+4] /* copy cif */ + mov eax, [ecx+8] /* copy fun */ + mov [esp+closure_CF+28], edx + mov [esp+closure_CF+32], eax + mov [esp+closure_CF+36], ecx /* closure is user_data */ + jmp L(do_closure_i386) +L(UW11): + // cfi_endproc +ENDF(ffi_go_closure_ECX) + +/* The closure entry points are reached from the ffi_closure trampoline. + On entry, %eax contains the address of the ffi_closure. */ + +ALIGN 16 +PUBLIC ffi_closure_i386 +ffi_closure_i386 PROC C +L(UW12): + // cfi_startproc + sub esp, closure_FS +L(UW13): + // cfi_def_cfa_offset(closure_FS + 4) + + FFI_CLOSURE_SAVE_REGS + FFI_CLOSURE_COPY_TRAMP_DATA + + /* Entry point from preceeding Go closures. */ +L(do_closure_i386):: + + FFI_CLOSURE_PREP_CALL + FFI_CLOSURE_CALL_INNER(14) + FFI_CLOSURE_MASK_AND_JUMP L(C1(load_table,2)) + + ALIGN 8 +L(load_table2): +E(L(load_table2), X86_RET_FLOAT) + fld dword ptr [esp+closure_CF] + jmp L(e2) +E(L(load_table2), X86_RET_DOUBLE) + fld qword ptr [esp+closure_CF] + jmp L(e2) +E(L(load_table2), X86_RET_LDOUBLE) + fld qword ptr [esp+closure_CF] + jmp L(e2) +E(L(load_table2), X86_RET_SINT8) + movsx eax, al + jmp L(e2) +E(L(load_table2), X86_RET_SINT16) + movsx eax, ax + jmp L(e2) +E(L(load_table2), X86_RET_UINT8) + movzx eax, al + jmp L(e2) +E(L(load_table2), X86_RET_UINT16) + movzx eax, ax + jmp L(e2) +E(L(load_table2), X86_RET_INT64) + mov edx, [esp+closure_CF+4] + jmp L(e2) +E(L(load_table2), X86_RET_INT32) + nop + /* fallthru */ +E(L(load_table2), X86_RET_VOID) +L(e2): + add esp, closure_FS +L(UW16): + // cfi_adjust_cfa_offset(-closure_FS) + ret +L(UW17): + // cfi_adjust_cfa_offset(closure_FS) +E(L(load_table2), X86_RET_STRUCTPOP) + add esp, closure_FS +L(UW18): + // cfi_adjust_cfa_offset(-closure_FS) + ret 4 +L(UW19): + // cfi_adjust_cfa_offset(closure_FS) +E(L(load_table2), X86_RET_STRUCTARG) + jmp L(e2) +E(L(load_table2), X86_RET_STRUCT_1B) + movzx eax, al + jmp L(e2) +E(L(load_table2), X86_RET_STRUCT_2B) + movzx eax, ax + jmp L(e2) + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table2), X86_RET_UNUSED14) + int 3 +E(L(load_table2), X86_RET_UNUSED15) + int 3 + +L(UW20): + // cfi_endproc +ENDF(ffi_closure_i386) + +ALIGN 16 +PUBLIC ffi_go_closure_STDCALL +ffi_go_closure_STDCALL PROC C +L(UW21): + // cfi_startproc + sub esp, closure_FS +L(UW22): + // cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + mov edx, [ecx+4] /* copy cif */ + mov eax, [ecx+8] /* copy fun */ + mov [esp+closure_CF+28], edx + mov [esp+closure_CF+32], eax + mov [esp+closure_CF+36], ecx /* closure is user_data */ + jmp L(do_closure_STDCALL) +L(UW23): + // cfi_endproc +ENDF(ffi_go_closure_STDCALL) + +/* For REGISTER, we have no available parameter registers, and so we + enter here having pushed the closure onto the stack. */ + +ALIGN 16 +PUBLIC ffi_closure_REGISTER +ffi_closure_REGISTER PROC C +L(UW24): + // cfi_startproc + // cfi_def_cfa(%esp, 8) + // cfi_offset(%eip, -8) + sub esp, closure_FS-4 +L(UW25): + // cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + mov ecx, [esp+closure_FS-4] /* load retaddr */ + mov eax, [esp+closure_FS] /* load closure */ + mov [esp+closure_FS], ecx /* move retaddr */ + jmp L(do_closure_REGISTER) +L(UW26): + // cfi_endproc +ENDF(ffi_closure_REGISTER) + +/* For STDCALL (and others), we need to pop N bytes of arguments off + the stack following the closure. The amount needing to be popped + is returned to us from ffi_closure_inner. */ + +ALIGN 16 +PUBLIC ffi_closure_STDCALL +ffi_closure_STDCALL PROC C +L(UW27): + // cfi_startproc + sub esp, closure_FS +L(UW28): + // cfi_def_cfa_offset(closure_FS + 4) + + FFI_CLOSURE_SAVE_REGS + + /* Entry point from ffi_closure_REGISTER. */ +L(do_closure_REGISTER):: + + FFI_CLOSURE_COPY_TRAMP_DATA + + /* Entry point from preceeding Go closure. */ +L(do_closure_STDCALL):: + + FFI_CLOSURE_PREP_CALL + FFI_CLOSURE_CALL_INNER(29) + + mov ecx, eax + shr ecx, X86_RET_POP_SHIFT /* isolate pop count */ + lea ecx, [esp+closure_FS+ecx] /* compute popped esp */ + mov edx, [esp+closure_FS] /* move return address */ + mov [ecx], edx + + /* From this point on, the value of %esp upon return is %ecx+4, + and we've copied the return address to %ecx to make return easy. + There's no point in representing this in the unwind info, as + there is always a window between the mov and the ret which + will be wrong from one point of view or another. */ + + FFI_CLOSURE_MASK_AND_JUMP L(C1(load_table,3)) + + ALIGN 8 +L(load_table3): +E(L(load_table3), X86_RET_FLOAT) + fld DWORD PTR [esp+closure_CF] + mov esp, ecx + ret +E(L(load_table3), X86_RET_DOUBLE) + fld QWORD PTR [esp+closure_CF] + mov esp, ecx + ret +E(L(load_table3), X86_RET_LDOUBLE) + fld QWORD PTR [esp+closure_CF] + mov esp, ecx + ret +E(L(load_table3), X86_RET_SINT8) + movsx eax, al + mov esp, ecx + ret +E(L(load_table3), X86_RET_SINT16) + movsx eax, ax + mov esp, ecx + ret +E(L(load_table3), X86_RET_UINT8) + movzx eax, al + mov esp, ecx + ret +E(L(load_table3), X86_RET_UINT16) + movzx eax, ax + mov esp, ecx + ret +E(L(load_table3), X86_RET_INT64) + mov edx, [esp+closure_CF+4] + mov esp, ecx + ret +E(L(load_table3), X86_RET_int 32) + mov esp, ecx + ret +E(L(load_table3), X86_RET_VOID) + mov esp, ecx + ret +E(L(load_table3), X86_RET_STRUCTPOP) + mov esp, ecx + ret +E(L(load_table3), X86_RET_STRUCTARG) + mov esp, ecx + ret +E(L(load_table3), X86_RET_STRUCT_1B) + movzx eax, al + mov esp, ecx + ret +E(L(load_table3), X86_RET_STRUCT_2B) + movzx eax, ax + mov esp, ecx + ret + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table3), X86_RET_UNUSED14) + int 3 +E(L(load_table3), X86_RET_UNUSED15) + int 3 + +L(UW31): + // cfi_endproc +ENDF(ffi_closure_STDCALL) + +#if !FFI_NO_RAW_API + +#define raw_closure_S_FS (16+16+12) + +ALIGN 16 +PUBLIC ffi_closure_raw_SYSV +ffi_closure_raw_SYSV PROC C +L(UW32): + // cfi_startproc + sub esp, raw_closure_S_FS +L(UW33): + // cfi_def_cfa_offset(raw_closure_S_FS + 4) + mov [esp+raw_closure_S_FS-4], ebx +L(UW34): + // cfi_rel_offset(%ebx, raw_closure_S_FS-4) + + mov edx, [eax+FFI_TRAMPOLINE_SIZE+8] /* load cl->user_data */ + mov [esp+12], edx + lea edx, [esp+raw_closure_S_FS+4] /* load raw_args */ + mov [esp+8], edx + lea edx, [esp+16] /* load &res */ + mov [esp+4], edx + mov ebx, [eax+FFI_TRAMPOLINE_SIZE] /* load cl->cif */ + mov [esp], ebx + call DWORD PTR [eax+FFI_TRAMPOLINE_SIZE+4] /* call cl->fun */ + + mov eax, [ebx+20] /* load cif->flags */ + and eax, X86_RET_TYPE_MASK +// #ifdef __PIC__ +// call __x86.get_pc_thunk.bx +// L(pc4): +// lea ecx, L(load_table4)-L(pc4)(%ebx, %eax, 8), %ecx +// #else + lea ecx, [L(load_table4)+eax+8] +// #endif + mov ebx, [esp+raw_closure_S_FS-4] +L(UW35): + // cfi_restore(%ebx) + mov eax, [esp+16] /* Optimistic load */ + jmp dword ptr [ecx] + + ALIGN 8 +L(load_table4): +E(L(load_table4), X86_RET_FLOAT) + fld DWORD PTR [esp +16] + jmp L(e4) +E(L(load_table4), X86_RET_DOUBLE) + fld QWORD PTR [esp +16] + jmp L(e4) +E(L(load_table4), X86_RET_LDOUBLE) + fld QWORD PTR [esp +16] + jmp L(e4) +E(L(load_table4), X86_RET_SINT8) + movsx eax, al + jmp L(e4) +E(L(load_table4), X86_RET_SINT16) + movsx eax, ax + jmp L(e4) +E(L(load_table4), X86_RET_UINT8) + movzx eax, al + jmp L(e4) +E(L(load_table4), X86_RET_UINT16) + movzx eax, ax + jmp L(e4) +E(L(load_table4), X86_RET_INT64) + mov edx, [esp+16+4] + jmp L(e4) +E(L(load_table4), X86_RET_int 32) + nop + /* fallthru */ +E(L(load_table4), X86_RET_VOID) +L(e4): + add esp, raw_closure_S_FS +L(UW36): + // cfi_adjust_cfa_offset(-raw_closure_S_FS) + ret +L(UW37): + // cfi_adjust_cfa_offset(raw_closure_S_FS) +E(L(load_table4), X86_RET_STRUCTPOP) + add esp, raw_closure_S_FS +L(UW38): + // cfi_adjust_cfa_offset(-raw_closure_S_FS) + ret 4 +L(UW39): + // cfi_adjust_cfa_offset(raw_closure_S_FS) +E(L(load_table4), X86_RET_STRUCTARG) + jmp L(e4) +E(L(load_table4), X86_RET_STRUCT_1B) + movzx eax, al + jmp L(e4) +E(L(load_table4), X86_RET_STRUCT_2B) + movzx eax, ax + jmp L(e4) + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table4), X86_RET_UNUSED14) + int 3 +E(L(load_table4), X86_RET_UNUSED15) + int 3 + +L(UW40): + // cfi_endproc +ENDF(ffi_closure_raw_SYSV) + +#define raw_closure_T_FS (16+16+8) + +ALIGN 16 +PUBLIC ffi_closure_raw_THISCALL +ffi_closure_raw_THISCALL PROC C +L(UW41): + // cfi_startproc + /* Rearrange the stack such that %ecx is the first argument. + This means moving the return address. */ + pop edx +L(UW42): + // cfi_def_cfa_offset(0) + // cfi_register(%eip, %edx) + push ecx +L(UW43): + // cfi_adjust_cfa_offset(4) + push edx +L(UW44): + // cfi_adjust_cfa_offset(4) + // cfi_rel_offset(%eip, 0) + sub esp, raw_closure_T_FS +L(UW45): + // cfi_adjust_cfa_offset(raw_closure_T_FS) + mov [esp+raw_closure_T_FS-4], ebx +L(UW46): + // cfi_rel_offset(%ebx, raw_closure_T_FS-4) + + mov edx, [eax+FFI_TRAMPOLINE_SIZE+8] /* load cl->user_data */ + mov [esp+12], edx + lea edx, [esp+raw_closure_T_FS+4] /* load raw_args */ + mov [esp+8], edx + lea edx, [esp+16] /* load &res */ + mov [esp+4], edx + mov ebx, [eax+FFI_TRAMPOLINE_SIZE] /* load cl->cif */ + mov [esp], ebx + call DWORD PTR [eax+FFI_TRAMPOLINE_SIZE+4] /* call cl->fun */ + + mov eax, [ebx+20] /* load cif->flags */ + and eax, X86_RET_TYPE_MASK +// #ifdef __PIC__ +// call __x86.get_pc_thunk.bx +// L(pc5): +// leal L(load_table5)-L(pc5)(%ebx, %eax, 8), %ecx +// #else + lea ecx, [L(load_table5)+eax*8] +//#endif + mov ebx, [esp+raw_closure_T_FS-4] +L(UW47): + // cfi_restore(%ebx) + mov eax, [esp+16] /* Optimistic load */ + jmp DWORD PTR [ecx] + + AlIGN 4 +L(load_table5): +E(L(load_table5), X86_RET_FLOAT) + fld DWORD PTR [esp +16] + jmp L(e5) +E(L(load_table5), X86_RET_DOUBLE) + fld QWORD PTR [esp +16] + jmp L(e5) +E(L(load_table5), X86_RET_LDOUBLE) + fld QWORD PTR [esp+16] + jmp L(e5) +E(L(load_table5), X86_RET_SINT8) + movsx eax, al + jmp L(e5) +E(L(load_table5), X86_RET_SINT16) + movsx eax, ax + jmp L(e5) +E(L(load_table5), X86_RET_UINT8) + movzx eax, al + jmp L(e5) +E(L(load_table5), X86_RET_UINT16) + movzx eax, ax + jmp L(e5) +E(L(load_table5), X86_RET_INT64) + mov edx, [esp+16+4] + jmp L(e5) +E(L(load_table5), X86_RET_int 32) + nop + /* fallthru */ +E(L(load_table5), X86_RET_VOID) +L(e5): + add esp, raw_closure_T_FS +L(UW48): + // cfi_adjust_cfa_offset(-raw_closure_T_FS) + /* Remove the extra %ecx argument we pushed. */ + ret 4 +L(UW49): + // cfi_adjust_cfa_offset(raw_closure_T_FS) +E(L(load_table5), X86_RET_STRUCTPOP) + add esp, raw_closure_T_FS +L(UW50): + // cfi_adjust_cfa_offset(-raw_closure_T_FS) + ret 8 +L(UW51): + // cfi_adjust_cfa_offset(raw_closure_T_FS) +E(L(load_table5), X86_RET_STRUCTARG) + jmp L(e5) +E(L(load_table5), X86_RET_STRUCT_1B) + movzx eax, al + jmp L(e5) +E(L(load_table5), X86_RET_STRUCT_2B) + movzx eax, ax + jmp L(e5) + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table5), X86_RET_UNUSED14) + int 3 +E(L(load_table5), X86_RET_UNUSED15) + int 3 + +L(UW52): + // cfi_endproc +ENDF(ffi_closure_raw_THISCALL) + +#endif /* !FFI_NO_RAW_API */ + +#ifdef X86_DARWIN +# define COMDAT(X) \ + .section __TEXT,__text,coalesced,pure_instructions; \ + .weak_definition X; \ + FFI_HIDDEN(X) +#elif defined __ELF__ && !(defined(__sun__) && defined(__svr4__)) +# define COMDAT(X) \ + .section .text.X,"axG",@progbits,X,comdat; \ + PUBLIC X; \ + FFI_HIDDEN(X) +#else +# define COMDAT(X) +#endif + +// #if defined(__PIC__) +// COMDAT(C(__x86.get_pc_thunk.bx)) +// C(__x86.get_pc_thunk.bx): +// movl (%esp), %ebx +// ret +// ENDF(C(__x86.get_pc_thunk.bx)) +// # if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +// COMDAT(C(__x86.get_pc_thunk.dx)) +// C(__x86.get_pc_thunk.dx): +// movl (%esp), %edx +// ret +// ENDF(C(__x86.get_pc_thunk.dx)) +// #endif /* DARWIN || HIDDEN */ +// #endif /* __PIC__ */ + +#if 0 +/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ + +#ifdef __APPLE__ +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EHFrame0: +#elif defined(X86_WIN32) +.section .eh_frame,"r" +#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) +.section .eh_frame,EH_FRAME_FLAGS,@unwind +#else +.section .eh_frame,EH_FRAME_FLAGS,@progbits +#endif + +#ifdef HAVE_AS_X86_PCREL +# define PCREL(X) X - . +#else +# define PCREL(X) X@rel +#endif + +/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ +#define ADV(N, P) .byte 2, L(N)-L(P) + + .balign 4 +L(CIE): + .set L(set0),L(ECIE)-L(SCIE) + .long L(set0) /* CIE Length */ +L(SCIE): + .long 0 /* CIE Identifier Tag */ + .byte 1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 1 /* CIE Code Alignment Factor */ + .byte 0x7c /* CIE Data Alignment Factor */ + .byte 0x8 /* CIE RA Column */ + .byte 1 /* Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ + .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp offset 4 */ + .byte 0x80+8, 1 /* DW_CFA_offset, %eip offset 1*-4 */ + .balign 4 +L(ECIE): + + .set L(set1),L(EFDE1)-L(SFDE1) + .long L(set1) /* FDE Length */ +L(SFDE1): + .long L(SFDE1)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW0)) /* Initial location */ + .long L(UW5)-L(UW0) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW1, UW0) + .byte 0xc, 5, 8 /* DW_CFA_def_cfa, %ebp 8 */ + .byte 0x80+5, 2 /* DW_CFA_offset, %ebp 2*-4 */ + ADV(UW2, UW1) + .byte 0x80+3, 0 /* DW_CFA_offset, %ebx 0*-4 */ + ADV(UW3, UW2) + .byte 0xa /* DW_CFA_remember_state */ + .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp 4 */ + .byte 0xc0+3 /* DW_CFA_restore, %ebx */ + .byte 0xc0+5 /* DW_CFA_restore, %ebp */ + ADV(UW4, UW3) + .byte 0xb /* DW_CFA_restore_state */ + .balign 4 +L(EFDE1): + + .set L(set2),L(EFDE2)-L(SFDE2) + .long L(set2) /* FDE Length */ +L(SFDE2): + .long L(SFDE2)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW6)) /* Initial location */ + .long L(UW8)-L(UW6) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW7, UW6) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE2): + + .set L(set3),L(EFDE3)-L(SFDE3) + .long L(set3) /* FDE Length */ +L(SFDE3): + .long L(SFDE3)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW9)) /* Initial location */ + .long L(UW11)-L(UW9) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW10, UW9) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE3): + + .set L(set4),L(EFDE4)-L(SFDE4) + .long L(set4) /* FDE Length */ +L(SFDE4): + .long L(SFDE4)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW12)) /* Initial location */ + .long L(UW20)-L(UW12) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW13, UW12) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ +#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX + ADV(UW14, UW13) + .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ + ADV(UW15, UW14) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ + ADV(UW16, UW15) +#else + ADV(UW16, UW13) +#endif + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW17, UW16) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + ADV(UW18, UW17) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW19, UW18) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE4): + + .set L(set5),L(EFDE5)-L(SFDE5) + .long L(set5) /* FDE Length */ +L(SFDE5): + .long L(SFDE5)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW21)) /* Initial location */ + .long L(UW23)-L(UW21) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW22, UW21) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE5): + + .set L(set6),L(EFDE6)-L(SFDE6) + .long L(set6) /* FDE Length */ +L(SFDE6): + .long L(SFDE6)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW24)) /* Initial location */ + .long L(UW26)-L(UW24) /* Address range */ + .byte 0 /* Augmentation size */ + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + .byte 0x80+8, 2 /* DW_CFA_offset %eip, 2*-4 */ + ADV(UW25, UW24) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE6): + + .set L(set7),L(EFDE7)-L(SFDE7) + .long L(set7) /* FDE Length */ +L(SFDE7): + .long L(SFDE7)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW27)) /* Initial location */ + .long L(UW31)-L(UW27) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW28, UW27) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ +#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX + ADV(UW29, UW28) + .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ + ADV(UW30, UW29) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ +#endif + .balign 4 +L(EFDE7): + +#if !FFI_NO_RAW_API + .set L(set8),L(EFDE8)-L(SFDE8) + .long L(set8) /* FDE Length */ +L(SFDE8): + .long L(SFDE8)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW32)) /* Initial location */ + .long L(UW40)-L(UW32) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW33, UW32) + .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ + ADV(UW34, UW33) + .byte 0x80+3, 2 /* DW_CFA_offset %ebx 2*-4 */ + ADV(UW35, UW34) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ + ADV(UW36, UW35) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW37, UW36) + .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ + ADV(UW38, UW37) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW39, UW38) + .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE8): + + .set L(set9),L(EFDE9)-L(SFDE9) + .long L(set9) /* FDE Length */ +L(SFDE9): + .long L(SFDE9)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW41)) /* Initial location */ + .long L(UW52)-L(UW41) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW42, UW41) + .byte 0xe, 0 /* DW_CFA_def_cfa_offset */ + .byte 0x9, 8, 2 /* DW_CFA_register %eip, %edx */ + ADV(UW43, UW42) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW44, UW43) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + .byte 0x80+8, 2 /* DW_CFA_offset %eip 2*-4 */ + ADV(UW45, UW44) + .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ + ADV(UW46, UW45) + .byte 0x80+3, 3 /* DW_CFA_offset %ebx 3*-4 */ + ADV(UW47, UW46) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ + ADV(UW48, UW47) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + ADV(UW49, UW48) + .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ + ADV(UW50, UW49) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + ADV(UW51, UW50) + .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE9): +#endif /* !FFI_NO_RAW_API */ + +#ifdef _WIN32 + .def @feat.00; + .scl 3; + .type 0; + .endef + PUBLIC @feat.00 +@feat.00 = 1 +#endif + +#endif /* ifndef _MSC_VER */ +#endif /* ifndef __x86_64__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif +#endif + +END \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/unix64.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/unix64.S new file mode 100644 index 000000000000..89d7db11fe99 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/unix64.S @@ -0,0 +1,621 @@ +/* ----------------------------------------------------------------------- + unix64.S - Copyright (c) 2013 The Written Word, Inc. + - Copyright (c) 2008 Red Hat, Inc + - Copyright (c) 2002 Bo Thorsen <bo@suse.de> + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include "internal64.h" +#include "asmnames.h" + + .text + +/* This macro allows the safe creation of jump tables without an + actual table. The entry points into the table are all 8 bytes. + The use of ORG asserts that we're at the correct location. */ +/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ +#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) +# define E(BASE, X) .balign 8 +#else +# ifdef __CET__ +# define E(BASE, X) .balign 8; .org BASE + X * 16 +# else +# define E(BASE, X) .balign 8; .org BASE + X * 8 +# endif +#endif + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)(void)); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .balign 8 + .globl C(ffi_call_unix64) + FFI_HIDDEN(C(ffi_call_unix64)) + +C(ffi_call_unix64): +L(UW0): + _CET_ENDBR + movq (%rsp), %r10 /* Load return address. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ +L(UW1): + /* cfi_def_cfa(%rbp, 32) */ + /* cfi_rel_offset(%rbp, 16) */ + + movq %rdi, %r10 /* Save a copy of the register area. */ + movq %r8, %r11 /* Save a copy of the target fn. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 0x08(%r10), %rsi + movq 0x10(%r10), %rdx + movq 0x18(%r10), %rcx + movq 0x20(%r10), %r8 + movq 0x28(%r10), %r9 + movl 0xb0(%r10), %eax /* Set number of SSE registers. */ + testl %eax, %eax + jnz L(load_sse) +L(ret_from_load_sse): + + /* Deallocate the reg arg area, except for r10, then load via pop. */ + leaq 0xb8(%r10), %rsp + popq %r10 + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +L(UW2): + /* cfi_remember_state */ + /* cfi_def_cfa(%rsp, 8) */ + /* cfi_restore(%rbp) */ + + /* The first byte of the flags contains the FFI_TYPE. */ + cmpb $UNIX64_RET_LAST, %cl + movzbl %cl, %r10d + leaq L(store_table)(%rip), %r11 + ja L(sa) +#ifdef __CET__ + /* NB: Originally, each slot is 8 byte. 4 bytes of ENDBR64 + + 4 bytes NOP padding double slot size to 16 bytes. */ + addl %r10d, %r10d +#endif + leaq (%r11, %r10, 8), %r10 + + /* Prep for the structure cases: scratch area in redzone. */ + leaq -20(%rsp), %rsi + jmp *%r10 + + .balign 8 +L(store_table): +E(L(store_table), UNIX64_RET_VOID) + _CET_ENDBR + ret +E(L(store_table), UNIX64_RET_UINT8) + _CET_ENDBR + movzbl %al, %eax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_UINT16) + _CET_ENDBR + movzwl %ax, %eax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_UINT32) + _CET_ENDBR + movl %eax, %eax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_SINT8) + _CET_ENDBR + movsbq %al, %rax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_SINT16) + _CET_ENDBR + movswq %ax, %rax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_SINT32) + _CET_ENDBR + cltq + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_INT64) + _CET_ENDBR + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_XMM32) + _CET_ENDBR + movd %xmm0, (%rdi) + ret +E(L(store_table), UNIX64_RET_XMM64) + _CET_ENDBR + movq %xmm0, (%rdi) + ret +E(L(store_table), UNIX64_RET_X87) + _CET_ENDBR + fstpt (%rdi) + ret +E(L(store_table), UNIX64_RET_X87_2) + _CET_ENDBR + fstpt (%rdi) + fstpt 16(%rdi) + ret +E(L(store_table), UNIX64_RET_ST_XMM0_RAX) + _CET_ENDBR + movq %rax, 8(%rsi) + jmp L(s3) +E(L(store_table), UNIX64_RET_ST_RAX_XMM0) + _CET_ENDBR + movq %xmm0, 8(%rsi) + jmp L(s2) +E(L(store_table), UNIX64_RET_ST_XMM0_XMM1) + _CET_ENDBR + movq %xmm1, 8(%rsi) + jmp L(s3) +E(L(store_table), UNIX64_RET_ST_RAX_RDX) + _CET_ENDBR + movq %rdx, 8(%rsi) +L(s2): + movq %rax, (%rsi) + shrl $UNIX64_SIZE_SHIFT, %ecx + rep movsb + ret + .balign 8 +L(s3): + movq %xmm0, (%rsi) + shrl $UNIX64_SIZE_SHIFT, %ecx + rep movsb + ret + +L(sa): call PLT(C(abort)) + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .balign 2 +L(UW3): + /* cfi_restore_state */ +L(load_sse): + movdqa 0x30(%r10), %xmm0 + movdqa 0x40(%r10), %xmm1 + movdqa 0x50(%r10), %xmm2 + movdqa 0x60(%r10), %xmm3 + movdqa 0x70(%r10), %xmm4 + movdqa 0x80(%r10), %xmm5 + movdqa 0x90(%r10), %xmm6 + movdqa 0xa0(%r10), %xmm7 + jmp L(ret_from_load_sse) + +L(UW4): +ENDF(C(ffi_call_unix64)) + +/* 6 general registers, 8 vector registers, + 32 bytes of rvalue, 8 bytes of alignment. */ +#define ffi_closure_OFS_G 0 +#define ffi_closure_OFS_V (6*8) +#define ffi_closure_OFS_RVALUE (ffi_closure_OFS_V + 8*16) +#define ffi_closure_FS (ffi_closure_OFS_RVALUE + 32 + 8) + +/* The location of rvalue within the red zone after deallocating the frame. */ +#define ffi_closure_RED_RVALUE (ffi_closure_OFS_RVALUE - ffi_closure_FS) + + .balign 2 + .globl C(ffi_closure_unix64_sse) + FFI_HIDDEN(C(ffi_closure_unix64_sse)) + +C(ffi_closure_unix64_sse): +L(UW5): + _CET_ENDBR + subq $ffi_closure_FS, %rsp +L(UW6): + /* cfi_adjust_cfa_offset(ffi_closure_FS) */ + + movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp) + movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp) + movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp) + movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp) + movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp) + movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp) + movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp) + movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp) + jmp L(sse_entry1) + +L(UW7): +ENDF(C(ffi_closure_unix64_sse)) + + .balign 2 + .globl C(ffi_closure_unix64) + FFI_HIDDEN(C(ffi_closure_unix64)) + +C(ffi_closure_unix64): +L(UW8): + _CET_ENDBR + subq $ffi_closure_FS, %rsp +L(UW9): + /* cfi_adjust_cfa_offset(ffi_closure_FS) */ +L(sse_entry1): + movq %rdi, ffi_closure_OFS_G+0x00(%rsp) + movq %rsi, ffi_closure_OFS_G+0x08(%rsp) + movq %rdx, ffi_closure_OFS_G+0x10(%rsp) + movq %rcx, ffi_closure_OFS_G+0x18(%rsp) + movq %r8, ffi_closure_OFS_G+0x20(%rsp) + movq %r9, ffi_closure_OFS_G+0x28(%rsp) + +#ifdef __ILP32__ + movl FFI_TRAMPOLINE_SIZE(%r10), %edi /* Load cif */ + movl FFI_TRAMPOLINE_SIZE+4(%r10), %esi /* Load fun */ + movl FFI_TRAMPOLINE_SIZE+8(%r10), %edx /* Load user_data */ +#else + movq FFI_TRAMPOLINE_SIZE(%r10), %rdi /* Load cif */ + movq FFI_TRAMPOLINE_SIZE+8(%r10), %rsi /* Load fun */ + movq FFI_TRAMPOLINE_SIZE+16(%r10), %rdx /* Load user_data */ +#endif +L(do_closure): + leaq ffi_closure_OFS_RVALUE(%rsp), %rcx /* Load rvalue */ + movq %rsp, %r8 /* Load reg_args */ + leaq ffi_closure_FS+8(%rsp), %r9 /* Load argp */ + call PLT(C(ffi_closure_unix64_inner)) + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $ffi_closure_FS, %rsp +L(UW10): + /* cfi_adjust_cfa_offset(-ffi_closure_FS) */ + + /* The first byte of the return value contains the FFI_TYPE. */ + cmpb $UNIX64_RET_LAST, %al + movzbl %al, %r10d + leaq L(load_table)(%rip), %r11 + ja L(la) +#ifdef __CET__ + /* NB: Originally, each slot is 8 byte. 4 bytes of ENDBR64 + + 4 bytes NOP padding double slot size to 16 bytes. */ + addl %r10d, %r10d +#endif + leaq (%r11, %r10, 8), %r10 + leaq ffi_closure_RED_RVALUE(%rsp), %rsi + jmp *%r10 + + .balign 8 +L(load_table): +E(L(load_table), UNIX64_RET_VOID) + _CET_ENDBR + ret +E(L(load_table), UNIX64_RET_UINT8) + _CET_ENDBR + movzbl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_UINT16) + _CET_ENDBR + movzwl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_UINT32) + _CET_ENDBR + movl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_SINT8) + _CET_ENDBR + movsbl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_SINT16) + _CET_ENDBR + movswl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_SINT32) + _CET_ENDBR + movl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_INT64) + _CET_ENDBR + movq (%rsi), %rax + ret +E(L(load_table), UNIX64_RET_XMM32) + _CET_ENDBR + movd (%rsi), %xmm0 + ret +E(L(load_table), UNIX64_RET_XMM64) + _CET_ENDBR + movq (%rsi), %xmm0 + ret +E(L(load_table), UNIX64_RET_X87) + _CET_ENDBR + fldt (%rsi) + ret +E(L(load_table), UNIX64_RET_X87_2) + _CET_ENDBR + fldt 16(%rsi) + fldt (%rsi) + ret +E(L(load_table), UNIX64_RET_ST_XMM0_RAX) + _CET_ENDBR + movq 8(%rsi), %rax + jmp L(l3) +E(L(load_table), UNIX64_RET_ST_RAX_XMM0) + _CET_ENDBR + movq 8(%rsi), %xmm0 + jmp L(l2) +E(L(load_table), UNIX64_RET_ST_XMM0_XMM1) + _CET_ENDBR + movq 8(%rsi), %xmm1 + jmp L(l3) +E(L(load_table), UNIX64_RET_ST_RAX_RDX) + _CET_ENDBR + movq 8(%rsi), %rdx +L(l2): + movq (%rsi), %rax + ret + .balign 8 +L(l3): + movq (%rsi), %xmm0 + ret + +L(la): call PLT(C(abort)) + +L(UW11): +ENDF(C(ffi_closure_unix64)) + + .balign 2 + .globl C(ffi_go_closure_unix64_sse) + FFI_HIDDEN(C(ffi_go_closure_unix64_sse)) + +C(ffi_go_closure_unix64_sse): +L(UW12): + _CET_ENDBR + subq $ffi_closure_FS, %rsp +L(UW13): + /* cfi_adjust_cfa_offset(ffi_closure_FS) */ + + movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp) + movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp) + movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp) + movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp) + movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp) + movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp) + movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp) + movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp) + jmp L(sse_entry2) + +L(UW14): +ENDF(C(ffi_go_closure_unix64_sse)) + + .balign 2 + .globl C(ffi_go_closure_unix64) + FFI_HIDDEN(C(ffi_go_closure_unix64)) + +C(ffi_go_closure_unix64): +L(UW15): + _CET_ENDBR + subq $ffi_closure_FS, %rsp +L(UW16): + /* cfi_adjust_cfa_offset(ffi_closure_FS) */ +L(sse_entry2): + movq %rdi, ffi_closure_OFS_G+0x00(%rsp) + movq %rsi, ffi_closure_OFS_G+0x08(%rsp) + movq %rdx, ffi_closure_OFS_G+0x10(%rsp) + movq %rcx, ffi_closure_OFS_G+0x18(%rsp) + movq %r8, ffi_closure_OFS_G+0x20(%rsp) + movq %r9, ffi_closure_OFS_G+0x28(%rsp) + +#ifdef __ILP32__ + movl 4(%r10), %edi /* Load cif */ + movl 8(%r10), %esi /* Load fun */ + movl %r10d, %edx /* Load closure (user_data) */ +#else + movq 8(%r10), %rdi /* Load cif */ + movq 16(%r10), %rsi /* Load fun */ + movq %r10, %rdx /* Load closure (user_data) */ +#endif + jmp L(do_closure) + +L(UW17): +ENDF(C(ffi_go_closure_unix64)) + +/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ + +#ifdef __APPLE__ +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EHFrame0: +#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) +.section .eh_frame,"a",@unwind +#else +.section .eh_frame,"a",@progbits +#endif + +#ifdef HAVE_AS_X86_PCREL +# define PCREL(X) X - . +#else +# define PCREL(X) X@rel +#endif + +/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ +#ifdef __CET__ +/* Use DW_CFA_advance_loc2 when IBT is enabled. */ +# define ADV(N, P) .byte 3; .2byte L(N)-L(P) +#else +# define ADV(N, P) .byte 2, L(N)-L(P) +#endif + + .balign 8 +L(CIE): + .set L(set0),L(ECIE)-L(SCIE) + .long L(set0) /* CIE Length */ +L(SCIE): + .long 0 /* CIE Identifier Tag */ + .byte 1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 1 /* CIE Code Alignment Factor */ + .byte 0x78 /* CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 1 /* Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ + .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x80+16, 1 /* DW_CFA_offset, %rip offset 1*-8 */ + .balign 8 +L(ECIE): + + .set L(set1),L(EFDE1)-L(SFDE1) + .long L(set1) /* FDE Length */ +L(SFDE1): + .long L(SFDE1)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW0)) /* Initial location */ + .long L(UW4)-L(UW0) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW1, UW0) + .byte 0xc, 6, 32 /* DW_CFA_def_cfa, %rbp 32 */ + .byte 0x80+6, 2 /* DW_CFA_offset, %rbp 2*-8 */ + ADV(UW2, UW1) + .byte 0xa /* DW_CFA_remember_state */ + .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp 8 */ + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + ADV(UW3, UW2) + .byte 0xb /* DW_CFA_restore_state */ + .balign 8 +L(EFDE1): + + .set L(set2),L(EFDE2)-L(SFDE2) + .long L(set2) /* FDE Length */ +L(SFDE2): + .long L(SFDE2)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW5)) /* Initial location */ + .long L(UW7)-L(UW5) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW6, UW5) + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ + .balign 8 +L(EFDE2): + + .set L(set3),L(EFDE3)-L(SFDE3) + .long L(set3) /* FDE Length */ +L(SFDE3): + .long L(SFDE3)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW8)) /* Initial location */ + .long L(UW11)-L(UW8) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW9, UW8) + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ + ADV(UW10, UW9) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset 8 */ +L(EFDE3): + + .set L(set4),L(EFDE4)-L(SFDE4) + .long L(set4) /* FDE Length */ +L(SFDE4): + .long L(SFDE4)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW12)) /* Initial location */ + .long L(UW14)-L(UW12) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW13, UW12) + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ + .balign 8 +L(EFDE4): + + .set L(set5),L(EFDE5)-L(SFDE5) + .long L(set5) /* FDE Length */ +L(SFDE5): + .long L(SFDE5)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW15)) /* Initial location */ + .long L(UW17)-L(UW15) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW16, UW15) + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ + .balign 8 +L(EFDE5): +#ifdef __APPLE__ + .subsections_via_symbols + .section __LD,__compact_unwind,regular,debug + + /* compact unwind for ffi_call_unix64 */ + .quad C(ffi_call_unix64) + .set L1,L(UW4)-L(UW0) + .long L1 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 + + /* compact unwind for ffi_closure_unix64_sse */ + .quad C(ffi_closure_unix64_sse) + .set L2,L(UW7)-L(UW5) + .long L2 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 + + /* compact unwind for ffi_closure_unix64 */ + .quad C(ffi_closure_unix64) + .set L3,L(UW11)-L(UW8) + .long L3 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 + + /* compact unwind for ffi_go_closure_unix64_sse */ + .quad C(ffi_go_closure_unix64_sse) + .set L4,L(UW14)-L(UW12) + .long L4 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 + + /* compact unwind for ffi_go_closure_unix64 */ + .quad C(ffi_go_closure_unix64) + .set L5,L(UW17)-L(UW15) + .long L5 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 +#endif + +#endif /* __x86_64__ */ +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/win64.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/win64.S new file mode 100644 index 000000000000..8315e8b75870 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/win64.S @@ -0,0 +1,241 @@ +#ifdef __x86_64__ +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "asmnames.h" + +#if defined(HAVE_AS_CFI_PSEUDO_OP) + .cfi_sections .debug_frame +#endif + +#ifdef X86_WIN64 +#define SEH(...) __VA_ARGS__ +#define arg0 %rcx +#define arg1 %rdx +#define arg2 %r8 +#define arg3 %r9 +#else +#define SEH(...) +#define arg0 %rdi +#define arg1 %rsi +#define arg2 %rdx +#define arg3 %rcx +#endif + +/* This macro allows the safe creation of jump tables without an + actual table. The entry points into the table are all 8 bytes. + The use of ORG asserts that we're at the correct location. */ +/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ +#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) +# define E(BASE, X) .balign 8 +#else +# define E(BASE, X) .balign 8; .org BASE + (X) * 8 +#endif + + .text + +/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10) + + Bit o trickiness here -- FRAME is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 8 + .globl C(ffi_call_win64) + FFI_HIDDEN(C(ffi_call_win64)) + + SEH(.seh_proc ffi_call_win64) +C(ffi_call_win64): + cfi_startproc + _CET_ENDBR + /* Set up the local stack frame and install it in rbp/rsp. */ + movq (%rsp), %rax + movq %rbp, (arg1) + movq %rax, 8(arg1) + movq arg1, %rbp + cfi_def_cfa(%rbp, 16) + cfi_rel_offset(%rbp, 0) + SEH(.seh_pushreg %rbp) + SEH(.seh_setframe %rbp, 0) + SEH(.seh_endprologue) + movq arg0, %rsp + + movq arg2, %r10 + + /* Load all slots into both general and xmm registers. */ + movq (%rsp), %rcx + movsd (%rsp), %xmm0 + movq 8(%rsp), %rdx + movsd 8(%rsp), %xmm1 + movq 16(%rsp), %r8 + movsd 16(%rsp), %xmm2 + movq 24(%rsp), %r9 + movsd 24(%rsp), %xmm3 + + call *16(%rbp) + + movl 24(%rbp), %ecx + movq 32(%rbp), %r8 + leaq 0f(%rip), %r10 + cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx + leaq (%r10, %rcx, 8), %r10 + ja 99f + _CET_NOTRACK jmp *%r10 + +/* Below, we're space constrained most of the time. Thus we eschew the + modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */ +.macro epilogue + leaveq + cfi_remember_state + cfi_def_cfa(%rsp, 8) + cfi_restore(%rbp) + ret + cfi_restore_state +.endm + + .align 8 +0: +E(0b, FFI_TYPE_VOID) + epilogue +E(0b, FFI_TYPE_INT) + movslq %eax, %rax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_FLOAT) + movss %xmm0, (%r8) + epilogue +E(0b, FFI_TYPE_DOUBLE) + movsd %xmm0, (%r8) + epilogue +// FFI_TYPE_LONGDOUBLE may be FFI_TYPE_DOUBLE but we need a different value here. +E(0b, FFI_TYPE_DOUBLE + 1) + call PLT(C(abort)) +E(0b, FFI_TYPE_UINT8) + movzbl %al, %eax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT8) + movsbq %al, %rax + jmp 98f +E(0b, FFI_TYPE_UINT16) + movzwl %ax, %eax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT16) + movswq %ax, %rax + jmp 98f +E(0b, FFI_TYPE_UINT32) + movl %eax, %eax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT32) + movslq %eax, %rax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_UINT64) +98: movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT64) + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_STRUCT) + epilogue +E(0b, FFI_TYPE_POINTER) + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_COMPLEX) + call PLT(C(abort)) +E(0b, FFI_TYPE_SMALL_STRUCT_1B) + movb %al, (%r8) + epilogue +E(0b, FFI_TYPE_SMALL_STRUCT_2B) + movw %ax, (%r8) + epilogue +E(0b, FFI_TYPE_SMALL_STRUCT_4B) + movl %eax, (%r8) + epilogue + + .align 8 +99: call PLT(C(abort)) + + epilogue + + cfi_endproc + SEH(.seh_endproc) + + +/* 32 bytes of outgoing register stack space, 8 bytes of alignment, + 16 bytes of result, 32 bytes of xmm registers. */ +#define ffi_clo_FS (32+8+16+32) +#define ffi_clo_OFF_R (32+8) +#define ffi_clo_OFF_X (32+8+16) + + .align 8 + .globl C(ffi_go_closure_win64) + FFI_HIDDEN(C(ffi_go_closure_win64)) + + SEH(.seh_proc ffi_go_closure_win64) +C(ffi_go_closure_win64): + cfi_startproc + _CET_ENDBR + /* Save all integer arguments into the incoming reg stack space. */ + movq %rcx, 8(%rsp) + movq %rdx, 16(%rsp) + movq %r8, 24(%rsp) + movq %r9, 32(%rsp) + + movq 8(%r10), %rcx /* load cif */ + movq 16(%r10), %rdx /* load fun */ + movq %r10, %r8 /* closure is user_data */ + jmp 0f + cfi_endproc + SEH(.seh_endproc) + + .align 8 + .globl C(ffi_closure_win64) + FFI_HIDDEN(C(ffi_closure_win64)) + + SEH(.seh_proc ffi_closure_win64) +C(ffi_closure_win64): + cfi_startproc + _CET_ENDBR + /* Save all integer arguments into the incoming reg stack space. */ + movq %rcx, 8(%rsp) + movq %rdx, 16(%rsp) + movq %r8, 24(%rsp) + movq %r9, 32(%rsp) + + movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */ + movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */ + movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */ +0: + subq $ffi_clo_FS, %rsp + cfi_adjust_cfa_offset(ffi_clo_FS) + SEH(.seh_stackalloc ffi_clo_FS) + SEH(.seh_endprologue) + + /* Save all sse arguments into the stack frame. */ + movsd %xmm0, ffi_clo_OFF_X(%rsp) + movsd %xmm1, ffi_clo_OFF_X+8(%rsp) + movsd %xmm2, ffi_clo_OFF_X+16(%rsp) + movsd %xmm3, ffi_clo_OFF_X+24(%rsp) + + leaq ffi_clo_OFF_R(%rsp), %r9 + call PLT(C(ffi_closure_win64_inner)) + + /* Load the result into both possible result registers. */ + movq ffi_clo_OFF_R(%rsp), %rax + movsd ffi_clo_OFF_R(%rsp), %xmm0 + + addq $ffi_clo_FS, %rsp + cfi_adjust_cfa_offset(-ffi_clo_FS) + ret + + cfi_endproc + SEH(.seh_endproc) +#endif /* __x86_64__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/win64_intel.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/win64_intel.S new file mode 100644 index 000000000000..970a4f997a98 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/x86/win64_intel.S @@ -0,0 +1,238 @@ +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "asmnames.h" + +#if defined(HAVE_AS_CFI_PSEUDO_OP) + .cfi_sections .debug_frame +#endif + +#ifdef X86_WIN64 +#define SEH(...) __VA_ARGS__ +#define arg0 rcx +#define arg1 rdx +#define arg2 r8 +#define arg3 r9 +#else +#define SEH(...) +#define arg0 rdi +#define arg1 rsi +#define arg2 rdx +#define arg3 rcx +#endif + +/* This macro allows the safe creation of jump tables without an + actual table. The entry points into the table are all 8 bytes. + The use of ORG asserts that we're at the correct location. */ +/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ +#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) +# define E(BASE, X) ALIGN 8 +#else +# define E(BASE, X) ALIGN 8; ORG BASE + (X) * 8 +#endif + + .CODE + extern PLT(C(abort)):near + extern C(ffi_closure_win64_inner):near + +/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10) + + Bit o trickiness here -- FRAME is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + ALIGN 8 + PUBLIC C(ffi_call_win64) + + ; SEH(.safesh ffi_call_win64) +C(ffi_call_win64) proc SEH(frame) + cfi_startproc + /* Set up the local stack frame and install it in rbp/rsp. */ + mov RAX, [RSP] ; movq (%rsp), %rax + mov [arg1], RBP ; movq %rbp, (arg1) + mov [arg1 + 8], RAX; movq %rax, 8(arg1) + mov RBP, arg1; movq arg1, %rbp + cfi_def_cfa(rbp, 16) + cfi_rel_offset(rbp, 0) + SEH(.pushreg rbp) + SEH(.setframe rbp, 0) + SEH(.endprolog) + mov RSP, arg0 ; movq arg0, %rsp + + mov R10, arg2 ; movq arg2, %r10 + + /* Load all slots into both general and xmm registers. */ + mov RCX, [RSP] ; movq (%rsp), %rcx + movsd XMM0, qword ptr [RSP] ; movsd (%rsp), %xmm0 + mov RDX, [RSP + 8] ;movq 8(%rsp), %rdx + movsd XMM1, qword ptr [RSP + 8]; movsd 8(%rsp), %xmm1 + mov R8, [RSP + 16] ; movq 16(%rsp), %r8 + movsd XMM2, qword ptr [RSP + 16] ; movsd 16(%rsp), %xmm2 + mov R9, [RSP + 24] ; movq 24(%rsp), %r9 + movsd XMM3, qword ptr [RSP + 24] ;movsd 24(%rsp), %xmm3 + + CALL qword ptr [RBP + 16] ; call *16(%rbp) + + mov ECX, [RBP + 24] ; movl 24(%rbp), %ecx + mov R8, [RBP + 32] ; movq 32(%rbp), %r8 + LEA R10, ffi_call_win64_tab ; leaq 0f(%rip), %r10 + CMP ECX, FFI_TYPE_SMALL_STRUCT_4B ; cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx + LEA R10, [R10 + RCX*8] ; leaq (%r10, %rcx, 8), %r10 + JA L99 ; ja 99f + JMP R10 ; jmp *%r10 + +/* Below, we're space constrained most of the time. Thus we eschew the + modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */ +epilogue macro + LEAVE + cfi_remember_state + cfi_def_cfa(rsp, 8) + cfi_restore(rbp) + RET + cfi_restore_state +endm + + ALIGN 8 +ffi_call_win64_tab LABEL NEAR +E(0b, FFI_TYPE_VOID) + epilogue +E(0b, FFI_TYPE_INT) + movsxd rax, eax ; movslq %eax, %rax + mov qword ptr [r8], rax; movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_FLOAT) + movss dword ptr [r8], xmm0 ; movss %xmm0, (%r8) + epilogue +E(0b, FFI_TYPE_DOUBLE) + movsd qword ptr[r8], xmm0; movsd %xmm0, (%r8) + epilogue +// FFI_TYPE_LONGDOUBLE may be FFI_TYPE_DOUBLE but we need a different value here. +E(0b, FFI_TYPE_DOUBLE + 1) + call PLT(C(abort)) +E(0b, FFI_TYPE_UINT8) + movzx eax, al ;movzbl %al, %eax + mov qword ptr[r8], rax; movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT8) + movsx rax, al ; movsbq %al, %rax + jmp L98 +E(0b, FFI_TYPE_UINT16) + movzx eax, ax ; movzwl %ax, %eax + mov qword ptr[r8], rax; movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT16) + movsx rax, ax; movswq %ax, %rax + jmp L98 +E(0b, FFI_TYPE_UINT32) + mov eax, eax; movl %eax, %eax + mov qword ptr[r8], rax ; movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT32) + movsxd rax, eax; movslq %eax, %rax + mov qword ptr [r8], rax; movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_UINT64) +L98 LABEL near + mov qword ptr [r8], rax ; movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT64) + mov qword ptr [r8], rax;movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_STRUCT) + epilogue +E(0b, FFI_TYPE_POINTER) + mov qword ptr [r8], rax ;movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_COMPLEX) + call PLT(C(abort)) +E(0b, FFI_TYPE_SMALL_STRUCT_1B) + mov byte ptr [r8], al ; movb %al, (%r8) + epilogue +E(0b, FFI_TYPE_SMALL_STRUCT_2B) + mov word ptr [r8], ax ; movw %ax, (%r8) + epilogue +E(0b, FFI_TYPE_SMALL_STRUCT_4B) + mov dword ptr [r8], eax ; movl %eax, (%r8) + epilogue + + align 8 +L99 LABEL near + call PLT(C(abort)) + + epilogue + + cfi_endproc + C(ffi_call_win64) endp + + +/* 32 bytes of outgoing register stack space, 8 bytes of alignment, + 16 bytes of result, 32 bytes of xmm registers. */ +#define ffi_clo_FS (32+8+16+32) +#define ffi_clo_OFF_R (32+8) +#define ffi_clo_OFF_X (32+8+16) + + align 8 + PUBLIC C(ffi_go_closure_win64) + +C(ffi_go_closure_win64) proc + cfi_startproc + /* Save all integer arguments into the incoming reg stack space. */ + mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp) + mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp) + mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp) + mov qword ptr [rsp + 32], r9 ;movq %r9, 32(%rsp) + + mov rcx, qword ptr [r10 + 8]; movq 8(%r10), %rcx /* load cif */ + mov rdx, qword ptr [r10 + 16]; movq 16(%r10), %rdx /* load fun */ + mov r8, r10 ; movq %r10, %r8 /* closure is user_data */ + jmp ffi_closure_win64_2 + cfi_endproc + C(ffi_go_closure_win64) endp + + align 8 + +PUBLIC C(ffi_closure_win64) +C(ffi_closure_win64) PROC FRAME + cfi_startproc + /* Save all integer arguments into the incoming reg stack space. */ + mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp) + mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp) + mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp) + mov qword ptr [rsp + 32], r9; movq %r9, 32(%rsp) + + mov rcx, qword ptr [FFI_TRAMPOLINE_SIZE + r10] ;movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */ + mov rdx, qword ptr [FFI_TRAMPOLINE_SIZE + 8 + r10] ; movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */ + mov r8, qword ptr [FFI_TRAMPOLINE_SIZE+16+r10] ;movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */ +ffi_closure_win64_2 LABEL near + sub rsp, ffi_clo_FS ;subq $ffi_clo_FS, %rsp + cfi_adjust_cfa_offset(ffi_clo_FS) + SEH(.allocstack ffi_clo_FS) + SEH(.endprolog) + + /* Save all sse arguments into the stack frame. */ + movsd qword ptr [ffi_clo_OFF_X + rsp], xmm0 ; movsd %xmm0, ffi_clo_OFF_X(%rsp) + movsd qword ptr [ffi_clo_OFF_X+8+rsp], xmm1 ; movsd %xmm1, ffi_clo_OFF_X+8(%rsp) + movsd qword ptr [ffi_clo_OFF_X+16+rsp], xmm2 ; movsd %xmm2, ffi_clo_OFF_X+16(%rsp) + movsd qword ptr [ffi_clo_OFF_X+24+rsp], xmm3 ; movsd %xmm3, ffi_clo_OFF_X+24(%rsp) + + lea r9, [ffi_clo_OFF_R + rsp] ; leaq ffi_clo_OFF_R(%rsp), %r9 + call C(ffi_closure_win64_inner) + + /* Load the result into both possible result registers. */ + + mov rax, qword ptr [ffi_clo_OFF_R + rsp] ;movq ffi_clo_OFF_R(%rsp), %rax + movsd xmm0, qword ptr [rsp + ffi_clo_OFF_R] ;movsd ffi_clo_OFF_R(%rsp), %xmm0 + + add rsp, ffi_clo_FS ;addq $ffi_clo_FS, %rsp + cfi_adjust_cfa_offset(-ffi_clo_FS) + ret + + cfi_endproc + C(ffi_closure_win64) endp + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif +_text ends +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/xtensa/ffi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/xtensa/ffi.c new file mode 100644 index 000000000000..9a0575ff90d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/xtensa/ffi.c @@ -0,0 +1,298 @@ +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2013 Tensilica, Inc. + + XTENSA Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include <ffi.h> +#include <ffi_common.h> + +/* + |----------------------------------------| + | | + on entry to ffi_call ----> |----------------------------------------| + | caller stack frame for registers a0-a3 | + |----------------------------------------| + | | + | additional arguments | + entry of the function ---> |----------------------------------------| + | copy of function arguments a2-a7 | + | - - - - - - - - - - - - - | + | | + + The area below the entry line becomes the new stack frame for the function. + +*/ + + +#define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST + + +extern void ffi_call_SYSV(void *rvalue, unsigned rsize, unsigned flags, + void(*fn)(void), unsigned nbytes, extended_cif*); +extern void ffi_closure_SYSV(void) FFI_HIDDEN; + +ffi_status ffi_prep_cif_machdep(ffi_cif *cif) +{ + switch(cif->rtype->type) { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + cif->flags = cif->rtype->type; + break; + case FFI_TYPE_VOID: + case FFI_TYPE_FLOAT: + cif->flags = FFI_TYPE_UINT32; + break; + case FFI_TYPE_DOUBLE: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + cif->flags = FFI_TYPE_UINT64; // cif->rtype->type; + break; + case FFI_TYPE_STRUCT: + cif->flags = FFI_TYPE_STRUCT; //_REGS; + /* Up to 16 bytes are returned in registers */ + if (cif->rtype->size > 4 * 4) { + /* returned structure is referenced by a register; use 8 bytes + (including 4 bytes for potential additional alignment) */ + cif->flags = FFI_TYPE_STRUCT; + cif->bytes += 8; + } + break; + + default: + cif->flags = FFI_TYPE_UINT32; + break; + } + + /* Round the stack up to a full 4 register frame, just in case + (we use this size in movsp). This way, it's also a multiple of + 8 bytes for 64-bit arguments. */ + cif->bytes = FFI_ALIGN(cif->bytes, 16); + + return FFI_OK; +} + +void ffi_prep_args(extended_cif *ecif, unsigned char* stack) +{ + unsigned int i; + unsigned long *addr; + ffi_type **ptr; + + union { + void **v; + char **c; + signed char **sc; + unsigned char **uc; + signed short **ss; + unsigned short **us; + unsigned int **i; + long long **ll; + float **f; + double **d; + } p_argv; + + /* Verify that everything is aligned up properly */ + FFI_ASSERT (((unsigned long) stack & 0x7) == 0); + + p_argv.v = ecif->avalue; + addr = (unsigned long*)stack; + + /* structures with a size greater than 16 bytes are passed in memory */ + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 16) + { + *addr++ = (unsigned long)ecif->rvalue; + } + + for (i = ecif->cif->nargs, ptr = ecif->cif->arg_types; + i > 0; + i--, ptr++, p_argv.v++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_SINT8: + *addr++ = **p_argv.sc; + break; + case FFI_TYPE_UINT8: + *addr++ = **p_argv.uc; + break; + case FFI_TYPE_SINT16: + *addr++ = **p_argv.ss; + break; + case FFI_TYPE_UINT16: + *addr++ = **p_argv.us; + break; + case FFI_TYPE_FLOAT: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + *addr++ = **p_argv.i; + break; + case FFI_TYPE_DOUBLE: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + if (((unsigned long)addr & 4) != 0) + addr++; + *(unsigned long long*)addr = **p_argv.ll; + addr += sizeof(unsigned long long) / sizeof (addr); + break; + + case FFI_TYPE_STRUCT: + { + unsigned long offs; + unsigned long size; + + if (((unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4) + addr++; + + offs = (unsigned long) addr - (unsigned long) stack; + size = (*ptr)->size; + + /* Entire structure must fit the argument registers or referenced */ + if (offs < FFI_REGISTER_NARGS * 4 + && offs + size > FFI_REGISTER_NARGS * 4) + addr = (unsigned long*) (stack + FFI_REGISTER_NARGS * 4); + + memcpy((char*) addr, *p_argv.c, size); + addr += (size + 3) / 4; + break; + } + + default: + FFI_ASSERT(0); + } + } +} + + +void ffi_call(ffi_cif* cif, void(*fn)(void), void *rvalue, void **avalue) +{ + extended_cif ecif; + unsigned long rsize = cif->rtype->size; + int flags = cif->flags; + void *alloc = NULL; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* Note that for structures that are returned in registers (size <= 16 bytes) + we allocate a temporary buffer and use memcpy to copy it to the final + destination. The reason is that the target address might be misaligned or + the length not a multiple of 4 bytes. Handling all those cases would be + very complex. */ + + if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue == NULL)) + { + alloc = alloca(FFI_ALIGN(rsize, 4)); + ecif.rvalue = alloc; + } + else + { + ecif.rvalue = rvalue; + } + + if (cif->abi != FFI_SYSV) + FFI_ASSERT(0); + + ffi_call_SYSV (ecif.rvalue, rsize, cif->flags, fn, cif->bytes, &ecif); + + if (alloc != NULL && rvalue != NULL) + memcpy(rvalue, alloc, rsize); +} + +extern void ffi_trampoline(); +extern void ffi_cacheflush(void* start, void* end); + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + /* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */ + memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE); + *(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV; + + // Do we have this function? + // __builtin___clear_cache(closer->tramp, closer->tramp + FFI_TRAMPOLINE_SIZE) + ffi_cacheflush(closure->tramp, closure->tramp + FFI_TRAMPOLINE_SIZE); + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + return FFI_OK; +} + + +long FFI_HIDDEN +ffi_closure_SYSV_inner(ffi_closure *closure, void **values, void *rvalue) +{ + ffi_cif *cif; + ffi_type **arg_types; + void **avalue; + int i, areg; + + cif = closure->cif; + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + areg = 0; + + int rtype = cif->rtype->type; + if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4) + { + rvalue = *values; + areg++; + } + + cif = closure->cif; + arg_types = cif->arg_types; + avalue = alloca(cif->nargs * sizeof(void *)); + + for (i = 0; i < cif->nargs; i++) + { + if (arg_types[i]->alignment == 8 && (areg & 1) != 0) + areg++; + + // skip the entry 16,a1 framework, add 16 bytes (4 registers) + if (areg == FFI_REGISTER_NARGS) + areg += 4; + + if (arg_types[i]->type == FFI_TYPE_STRUCT) + { + int numregs = ((arg_types[i]->size + 3) & ~3) / 4; + if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS) + areg = FFI_REGISTER_NARGS + 4; + } + + avalue[i] = &values[areg]; + areg += (arg_types[i]->size + 3) / 4; + } + + (closure->fun)(cif, rvalue, avalue, closure->user_data); + + return rtype; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/xtensa/ffitarget.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/xtensa/ffitarget.h new file mode 100644 index 000000000000..0ba728bc948c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/xtensa/ffitarget.h @@ -0,0 +1,53 @@ +/* -----------------------------------------------------------------*-C-*- + ffitarget.h - Copyright (c) 2013 Tensilica, Inc. + Target configuration macros for XTENSA. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifndef LIBFFI_TARGET_H +#define LIBFFI_TARGET_H + +#ifndef LIBFFI_H +#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." +#endif + +#ifndef LIBFFI_ASM +typedef unsigned long ffi_arg; +typedef signed long ffi_sarg; + +typedef enum ffi_abi { + FFI_FIRST_ABI = 0, + FFI_SYSV, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_SYSV +} ffi_abi; +#endif + +#define FFI_REGISTER_NARGS 6 + +/* ---- Definitions for closures ----------------------------------------- */ + +#define FFI_CLOSURES 1 +#define FFI_NATIVE_RAW_API 0 +#define FFI_TRAMPOLINE_SIZE 24 + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/xtensa/sysv.S b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/xtensa/sysv.S new file mode 100644 index 000000000000..e9421796fd86 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/src/xtensa/sysv.S @@ -0,0 +1,258 @@ +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2013 Tensilica, Inc. + + XTENSA Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> + +#define ENTRY(name) .text; .globl name; .type name,@function; .align 4; name: +#define END(name) .size name , . - name + +/* Assert that the table below is in sync with ffi.h. */ + +#if FFI_TYPE_UINT8 != 5 \ + || FFI_TYPE_SINT8 != 6 \ + || FFI_TYPE_UINT16 != 7 \ + || FFI_TYPE_SINT16 != 8 \ + || FFI_TYPE_UINT32 != 9 \ + || FFI_TYPE_SINT32 != 10 \ + || FFI_TYPE_UINT64 != 11 +#error "xtensa/sysv.S out of sync with ffi.h" +#endif + + +/* ffi_call_SYSV (rvalue, rbytes, flags, (*fnaddr)(), bytes, ecif) + void *rvalue; a2 + unsigned long rbytes; a3 + unsigned flags; a4 + void (*fnaddr)(); a5 + unsigned long bytes; a6 + extended_cif* ecif) a7 +*/ + +ENTRY(ffi_call_SYSV) + + entry a1, 32 # 32 byte frame for using call8 below + + mov a10, a7 # a10(->arg0): ecif + sub a11, a1, a6 # a11(->arg1): stack pointer + mov a7, a1 # fp + movsp a1, a11 # set new sp = old_sp - bytes + + movi a8, ffi_prep_args + callx8 a8 # ffi_prep_args(ecif, stack) + + # prepare to move stack pointer back up to 6 arguments + # note that 'bytes' is already aligned + + movi a10, 6*4 + sub a11, a6, a10 + movgez a6, a10, a11 + add a6, a1, a6 + + + # we can pass up to 6 arguments in registers + # for simplicity, just load 6 arguments + # (the stack size is at least 32 bytes, so no risk to cross boundaries) + + l32i a10, a1, 0 + l32i a11, a1, 4 + l32i a12, a1, 8 + l32i a13, a1, 12 + l32i a14, a1, 16 + l32i a15, a1, 20 + + # move stack pointer + + movsp a1, a6 + + callx8 a5 # (*fn)(args...) + + # Handle return value(s) + + beqz a2, .Lexit + + movi a5, FFI_TYPE_STRUCT + bne a4, a5, .Lstore + movi a5, 16 + blt a5, a3, .Lexit + + s32i a10, a2, 0 + blti a3, 5, .Lexit + addi a3, a3, -1 + s32i a11, a2, 4 + blti a3, 8, .Lexit + s32i a12, a2, 8 + blti a3, 12, .Lexit + s32i a13, a2, 12 + +.Lexit: retw + +.Lstore: + addi a4, a4, -FFI_TYPE_UINT8 + bgei a4, 7, .Lexit # should never happen + movi a6, store_calls + add a4, a4, a4 + addx4 a6, a4, a6 # store_table + idx * 8 + jx a6 + + .align 8 +store_calls: + # UINT8 + s8i a10, a2, 0 + retw + + # SINT8 + .align 8 + s8i a10, a2, 0 + retw + + # UINT16 + .align 8 + s16i a10, a2, 0 + retw + + # SINT16 + .align 8 + s16i a10, a2, 0 + retw + + # UINT32 + .align 8 + s32i a10, a2, 0 + retw + + # SINT32 + .align 8 + s32i a10, a2, 0 + retw + + # UINT64 + .align 8 + s32i a10, a2, 0 + s32i a11, a2, 4 + retw + +END(ffi_call_SYSV) + + +/* + * void ffi_cacheflush (unsigned long start, unsigned long end) + */ + +#define EXTRA_ARGS_SIZE 24 + +ENTRY(ffi_cacheflush) + + entry a1, 16 + +1: +#if XCHAL_DCACHE_SIZE + dhwbi a2, 0 +#endif +#if XCHAL_ICACHE_SIZE + ihi a2, 0 +#endif + addi a2, a2, 4 + blt a2, a3, 1b + + retw + +END(ffi_cacheflush) + +/* ffi_trampoline is copied to the stack */ + +ENTRY(ffi_trampoline) + + entry a1, 16 + (FFI_REGISTER_NARGS * 4) + (4 * 4) # [ 0] + j 2f # [ 3] + .align 4 # [ 6] +1: .long 0 # [ 8] +2: l32r a15, 1b # [12] + _mov a14, a0 # [15] + callx0 a15 # [18] + # [21] +END(ffi_trampoline) + +/* + * ffi_closure() + * + * a0: closure + 21 + * a14: return address (a0) + */ + +ENTRY(ffi_closure_SYSV) + + /* intentionally omitting entry here */ + + # restore return address (a0) and move pointer to closure to a10 + addi a10, a0, -21 + mov a0, a14 + + # allow up to 4 arguments as return values + addi a11, a1, 4 * 4 + + # save up to 6 arguments to stack (allocated by entry below) + s32i a2, a11, 0 + s32i a3, a11, 4 + s32i a4, a11, 8 + s32i a5, a11, 12 + s32i a6, a11, 16 + s32i a7, a11, 20 + + movi a8, ffi_closure_SYSV_inner + mov a12, a1 + callx8 a8 # .._inner(*closure, **avalue, *rvalue) + + # load up to four return arguments + l32i a2, a1, 0 + l32i a3, a1, 4 + l32i a4, a1, 8 + l32i a5, a1, 12 + + # (sign-)extend return value + movi a11, FFI_TYPE_UINT8 + bne a10, a11, 1f + extui a2, a2, 0, 8 + retw + +1: movi a11, FFI_TYPE_SINT8 + bne a10, a11, 1f + sext a2, a2, 7 + retw + +1: movi a11, FFI_TYPE_UINT16 + bne a10, a11, 1f + extui a2, a2, 0, 16 + retw + +1: movi a11, FFI_TYPE_SINT16 + bne a10, a11, 1f + sext a2, a2, 15 + +1: retw + +END(ffi_closure_SYSV) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/stamp-h.in b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/stamp-h.in new file mode 100644 index 000000000000..9788f70238c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/stamp-h.in @@ -0,0 +1 @@ +timestamp diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/Makefile.am b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/Makefile.am new file mode 100644 index 000000000000..bcfea5770562 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/Makefile.am @@ -0,0 +1,122 @@ +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = foreign dejagnu + +EXTRA_DEJAGNU_SITE_CONFIG=../local.exp + +CLEANFILES = *.exe core* *.log *.sum + +EXTRA_DIST = lib/target-libpath.exp lib/libffi.exp lib/wrapper.exp \ +libffi.call/strlen4.c libffi.call/struct10.c libffi.call/many_mixed.c \ +libffi.call/float.c libffi.call/struct5.c libffi.call/return_fl3.c \ +libffi.call/return_fl1.c libffi.call/call.exp libffi.call/pyobjc-tc.c \ +libffi.call/float_va.c libffi.call/struct8.c libffi.call/pr1172638.c \ +libffi.call/return_sc.c libffi.call/va_struct1.c \ +libffi.call/align_stdcall.c libffi.call/struct9.c libffi.call/va_1.c \ +libffi.call/va_struct2.c libffi.call/return_fl2.c \ +libffi.call/align_mixed.c libffi.call/ffitest.h libffi.call/struct4.c \ +libffi.call/return_ldl.c libffi.call/float3.c libffi.call/return_sl.c \ +libffi.call/return_dbl1.c libffi.call/err_bad_typedef.c \ +libffi.call/return_ll1.c libffi.call/return_dbl2.c \ +libffi.call/negint.c libffi.closures/nested_struct3.c \ +libffi.call/struct2.c libffi.call/struct3.c libffi.call/return_fl.c \ +libffi.call/offsets.c libffi.call/struct7.c libffi.call/va_struct3.c \ +libffi.call/float1.c libffi.call/uninitialized.c libffi.call/many2.c \ +libffi.call/struct6.c libffi.call/strlen2.c libffi.call/float2.c \ +libffi.call/return_ul.c libffi.call/struct1.c libffi.call/strlen3.c \ +libffi.call/return_dbl.c libffi.call/float4.c libffi.call/many.c \ +libffi.call/strlen.c libffi.call/return_uc.c libffi.call/many_double.c \ +libffi.call/return_ll.c libffi.call/promotion.c \ +libffi.complex/complex_defs_longdouble.inc \ +libffi.complex/cls_align_complex_float.c \ +libffi.complex/cls_complex_va_float.c \ +libffi.complex/cls_complex_struct_float.c \ +libffi.complex/return_complex2_longdouble.c \ +libffi.complex/cls_complex_float.c \ +libffi.complex/return_complex_longdouble.c \ +libffi.complex/return_complex2_float.c libffi.complex/cls_complex.inc \ +libffi.complex/cls_complex_va_longdouble.c \ +libffi.complex/return_complex_double.c \ +libffi.complex/return_complex.inc libffi.complex/many_complex.inc \ +libffi.complex/complex_float.c libffi.complex/cls_align_complex.inc \ +libffi.complex/return_complex2_double.c \ +libffi.complex/many_complex_float.c libffi.complex/ffitest.h \ +libffi.complex/return_complex1_double.c \ +libffi.complex/cls_complex_struct_longdouble.c \ +libffi.complex/complex_defs_double.inc \ +libffi.complex/cls_complex_va_double.c \ +libffi.complex/many_complex_double.c \ +libffi.complex/return_complex2.inc \ +libffi.complex/return_complex1_float.c \ +libffi.complex/complex_longdouble.c \ +libffi.complex/complex_defs_float.inc \ +libffi.complex/cls_complex_double.c \ +libffi.complex/cls_align_complex_double.c \ +libffi.complex/cls_align_complex_longdouble.c \ +libffi.complex/complex_double.c libffi.complex/cls_complex_va.inc \ +libffi.complex/many_complex_longdouble.c libffi.complex/complex.inc \ +libffi.complex/return_complex1_longdouble.c \ +libffi.complex/complex_int.c libffi.complex/cls_complex_longdouble.c \ +libffi.complex/cls_complex_struct_double.c \ +libffi.complex/return_complex1.inc libffi.complex/complex.exp \ +libffi.complex/cls_complex_struct.inc \ +libffi.complex/return_complex_float.c libffi.go/closure1.c \ +libffi.go/aa-direct.c libffi.go/ffitest.h libffi.go/go.exp \ +libffi.go/static-chain.h libffi.bhaible/bhaible.exp \ +libffi.bhaible/test-call.c libffi.bhaible/alignof.h \ +libffi.bhaible/testcases.c libffi.bhaible/test-callback.c \ +libffi.bhaible/Makefile libffi.bhaible/README config/default.exp \ +libffi.closures/cls_multi_sshort.c \ +libffi.closures/cls_align_longdouble_split2.c \ +libffi.closures/cls_1_1byte.c libffi.closures/cls_uint_va.c \ +libffi.closures/cls_3_1byte.c libffi.closures/cls_many_mixed_args.c \ +libffi.closures/cls_20byte1.c libffi.closures/cls_pointer_stack.c \ +libffi.closures/cls_align_float.c libffi.closures/cls_5_1_byte.c \ +libffi.closures/cls_9byte1.c libffi.closures/cls_align_uint32.c \ +libffi.closures/stret_medium.c libffi.closures/cls_3byte1.c \ +libffi.closures/cls_align_uint64.c libffi.closures/cls_longdouble_va.c \ +libffi.closures/cls_align_pointer.c libffi.closures/cls_19byte.c \ +libffi.closures/cls_ushort.c libffi.closures/cls_align_sint32.c \ +libffi.closures/cls_ulonglong.c libffi.closures/cls_struct_va1.c \ +libffi.closures/cls_9byte2.c libffi.closures/closure_fn5.c \ +libffi.closures/cls_5byte.c libffi.closures/cls_3float.c \ +libffi.closures/closure.exp libffi.closures/cls_schar.c \ +libffi.closures/closure_fn4.c libffi.closures/cls_uchar_va.c \ +libffi.closures/closure_fn0.c libffi.closures/huge_struct.c \ +libffi.closures/cls_ushort_va.c \ +libffi.closures/cls_64byte.c libffi.closures/cls_longdouble.c \ +libffi.closures/cls_ulong_va.c libffi.closures/cls_6_1_byte.c \ +libffi.closures/cls_align_uint16.c libffi.closures/closure_fn2.c \ +libffi.closures/unwindtest_ffi_call.cc \ +libffi.closures/cls_multi_ushortchar.c libffi.closures/cls_8byte.c \ +libffi.closures/ffitest.h libffi.closures/nested_struct8.c \ +libffi.closures/cls_pointer.c libffi.closures/nested_struct2.c \ +libffi.closures/nested_struct.c libffi.closures/cls_multi_schar.c \ +libffi.closures/cls_align_longdouble_split.c \ +libffi.closures/cls_uchar.c libffi.closures/nested_struct9.c \ +libffi.closures/cls_float.c libffi.closures/stret_medium2.c \ +libffi.closures/closure_loc_fn0.c libffi.closures/cls_6byte.c \ +libffi.closures/closure_simple.c libffi.closures/cls_align_double.c \ +libffi.closures/cls_multi_uchar.c libffi.closures/cls_4_1byte.c \ +libffi.closures/closure_fn3.c libffi.closures/cls_align_sint64.c \ +libffi.closures/nested_struct1.c libffi.closures/unwindtest.cc \ +libffi.closures/nested_struct5.c libffi.closures/cls_multi_ushort.c \ +libffi.closures/nested_struct11.c \ +libffi.closures/cls_multi_sshortchar.c \ +libffi.closures/cls_align_longdouble.c \ +libffi.closures/cls_dbls_struct.c \ +libffi.closures/cls_many_mixed_float_double.c \ +libffi.closures/stret_large.c libffi.closures/stret_large2.c \ +libffi.closures/cls_align_sint16.c libffi.closures/cls_2byte.c \ +libffi.closures/nested_struct4.c libffi.closures/problem1.c \ +libffi.closures/testclosure.c libffi.closures/nested_struct6.c \ +libffi.closures/cls_4byte.c libffi.closures/cls_24byte.c \ +libffi.closures/nested_struct10.c libffi.closures/cls_uint.c \ +libffi.closures/cls_12byte.c libffi.closures/cls_sint.c \ +libffi.closures/cls_7_1_byte.c libffi.closures/cls_sshort.c \ +libffi.closures/cls_16byte.c libffi.closures/nested_struct7.c \ +libffi.closures/cls_double_va.c libffi.closures/cls_3byte2.c \ +libffi.closures/cls_double.c libffi.closures/cls_7byte.c \ +libffi.closures/closure_fn6.c libffi.closures/closure_fn1.c \ +libffi.closures/cls_20byte.c libffi.closures/cls_18byte.c \ +libffi.closures/err_bad_abi.c diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/config/default.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/config/default.exp new file mode 100644 index 000000000000..90967cccc18a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/config/default.exp @@ -0,0 +1 @@ +load_lib "standard.exp" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/lib/libffi.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/lib/libffi.exp new file mode 100644 index 000000000000..d3c17db485a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/lib/libffi.exp @@ -0,0 +1,660 @@ +# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011, 2014, 2019 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +proc load_gcc_lib { filename } { + global srcdir + load_file $srcdir/lib/$filename +} + +load_lib dg.exp +load_lib libgloss.exp +load_gcc_lib target-libpath.exp +load_gcc_lib wrapper.exp + +proc check_effective_target_gccbug { } { + global has_gccbug + return $has_gccbug +} + +# Return 1 if the target matches the effective target 'arg', 0 otherwise. +# This can be used with any check_* proc that takes no argument and +# returns only 1 or 0. It could be used with check_* procs that take +# arguments with keywords that pass particular arguments. + +proc is-effective-target { arg } { + global et_index + set selected 0 + if { ![info exists et_index] } { + # Initialize the effective target index that is used in some + # check_effective_target_* procs. + set et_index 0 + } + if { [info procs check_effective_target_${arg}] != [list] } { + set selected [check_effective_target_${arg}] + } else { + error "unknown effective target keyword `$arg'" + } + verbose "is-effective-target: $arg $selected" 2 + return $selected +} + +proc is-effective-target-keyword { arg } { + if { [info procs check_effective_target_${arg}] != [list] } { + return 1 + } else { + return 0 + } +} + +# Intercept the call to the DejaGnu version of dg-process-target to +# support use of an effective-target keyword in place of a list of +# target triplets to xfail or skip a test. +# +# The argument to dg-process-target is the keyword "target" or "xfail" +# followed by a selector: +# target-triplet-1 ... +# effective-target-keyword +# selector-expression +# +# For a target list the result is "S" if the target is selected, "N" otherwise. +# For an xfail list the result is "F" if the target is affected, "P" otherwise. + +# In contexts that allow either "target" or "xfail" the argument can be +# target selector1 xfail selector2 +# which returns "N" if selector1 is not selected, otherwise the result of +# "xfail selector2". +# +# A selector expression appears within curly braces and uses a single logical +# operator: !, &&, or ||. An operand is another selector expression, an +# effective-target keyword, or a list of target triplets within quotes or +# curly braces. + +if { [info procs saved-dg-process-target] == [list] } { + rename dg-process-target saved-dg-process-target + + # Evaluate an operand within a selector expression. + proc selector_opd { op } { + set selector "target" + lappend selector $op + set answer [ expr { [dg-process-target $selector] == "S" } ] + verbose "selector_opd: `$op' $answer" 2 + return $answer + } + + # Evaluate a target triplet list within a selector expression. + # Unlike other operands, this needs to be expanded from a list to + # the same string as "target". + proc selector_list { op } { + set selector "target [join $op]" + set answer [ expr { [dg-process-target $selector] == "S" } ] + verbose "selector_list: `$op' $answer" 2 + return $answer + } + + # Evaluate a selector expression. + proc selector_expression { exp } { + if { [llength $exp] == 2 } { + if [string match "!" [lindex $exp 0]] { + set op1 [lindex $exp 1] + set answer [expr { ! [selector_opd $op1] }] + } else { + # Assume it's a list of target triplets. + set answer [selector_list $exp] + } + } elseif { [llength $exp] == 3 } { + set op1 [lindex $exp 0] + set opr [lindex $exp 1] + set op2 [lindex $exp 2] + if [string match "&&" $opr] { + set answer [expr { [selector_opd $op1] && [selector_opd $op2] }] + } elseif [string match "||" $opr] { + set answer [expr { [selector_opd $op1] || [selector_opd $op2] }] + } else { + # Assume it's a list of target triplets. + set answer [selector_list $exp] + } + } else { + # Assume it's a list of target triplets. + set answer [selector_list $exp] + } + + verbose "selector_expression: `$exp' $answer" 2 + return $answer + } + + # Evaluate "target selector" or "xfail selector". + + proc dg-process-target-1 { args } { + verbose "dg-process-target-1: `$args'" 2 + + # Extract the 'what' keyword from the argument list. + set selector [string trim [lindex $args 0]] + if [regexp "^xfail " $selector] { + set what "xfail" + } elseif [regexp "^target " $selector] { + set what "target" + } else { + error "syntax error in target selector \"$selector\"" + } + + # Extract the rest of the list, which might be a keyword. + regsub "^${what}" $selector "" rest + set rest [string trim $rest] + + if [is-effective-target-keyword $rest] { + # The selector is an effective target keyword. + if [is-effective-target $rest] { + return [expr { $what == "xfail" ? "F" : "S" }] + } else { + return [expr { $what == "xfail" ? "P" : "N" }] + } + } + + if [string match "{*}" $rest] { + if [selector_expression [lindex $rest 0]] { + return [expr { $what == "xfail" ? "F" : "S" }] + } else { + return [expr { $what == "xfail" ? "P" : "N" }] + } + } + + # The selector is not an effective-target keyword, so process + # the list of target triplets. + return [saved-dg-process-target $selector] + } + + # Intercept calls to the DejaGnu function. In addition to + # processing "target selector" or "xfail selector", handle + # "target selector1 xfail selector2". + + proc dg-process-target { args } { + verbose "replacement dg-process-target: `$args'" 2 + + set selector [string trim [lindex $args 0]] + + # If the argument list contains both 'target' and 'xfail', + # process 'target' and, if that succeeds, process 'xfail'. + if [regexp "^target .* xfail .*" $selector] { + set xfail_index [string first "xfail" $selector] + set xfail_selector [string range $selector $xfail_index end] + set target_selector [string range $selector 0 [expr $xfail_index-1]] + set target_selector [string trim $target_selector] + if { [dg-process-target-1 $target_selector] == "N" } { + return "N" + } + return [dg-process-target-1 $xfail_selector] + + } + return [dg-process-target-1 $selector] + } +} + +# Define libffi callbacks for dg.exp. + +proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } { + + # To get all \n in dg-output test strings to match printf output + # in a system that outputs it as \015\012 (i.e. not just \012), we + # need to change all \n into \r?\n. As there is no dejagnu flag + # or hook to do that, we simply change the text being tested. + # Unfortunately, we have to know that the variable is called + # dg-output-text and lives in the caller of libffi-dg-test, which + # is two calls up. Overriding proc dg-output would be longer and + # would necessarily have the same assumption. + upvar 2 dg-output-text output_match + + if { [llength $output_match] > 1 } { + regsub -all "\n" [lindex $output_match 1] "\r?\n" x + set output_match [lreplace $output_match 1 1 $x] + } + + # Set up the compiler flags, based on what we're going to do. + + set options [list] + switch $do_what { + "compile" { + set compile_type "assembly" + set output_file "[file rootname [file tail $prog]].s" + } + "link" { + set compile_type "executable" + set output_file "[file rootname [file tail $prog]].exe" + # The following line is needed for targets like the i960 where + # the default output file is b.out. Sigh. + } + "run" { + set compile_type "executable" + # FIXME: "./" is to cope with "." not being in $PATH. + # Should this be handled elsewhere? + # YES. + set output_file "./[file rootname [file tail $prog]].exe" + # This is the only place where we care if an executable was + # created or not. If it was, dg.exp will try to run it. + remote_file build delete $output_file; + } + default { + perror "$do_what: not a valid dg-do keyword" + return "" + } + } + + if { $extra_tool_flags != "" } { + lappend options "additional_flags=$extra_tool_flags" + } + + set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options]; + + + return [list $comp_output $output_file] +} + + +proc libffi-dg-test { prog do_what extra_tool_flags } { + return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags] +} + +proc libffi-dg-prune { target_triplet text } { + # We get this with some qemu emulated systems (eg. ppc64le-linux-gnu) + regsub -all "(^|\n)\[^\n\]*unable to perform all requested operations" $text "" text + return $text +} + +proc libffi-init { args } { + global gluefile wrap_flags; + global srcdir + global blddirffi + global objdir + global TOOL_OPTIONS + global tool + global libffi_include + global libffi_link_flags + global tool_root_dir + global ld_library_path + global compiler_vendor + + if ![info exists blddirffi] { + set blddirffi [pwd]/.. + } + + verbose "libffi $blddirffi" + + # Which compiler are we building with? + set tmp [grep "$blddirffi/config.log" "^ax_cv_c_compiler_vendor.*$"] + regexp -- {^[^=]*=(.*)$} $tmp nil compiler_vendor + + if { [string match $compiler_vendor "gnu"] } { + set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] + if {$gccdir != ""} { + set gccdir [file dirname $gccdir] + } + verbose "gccdir $gccdir" + + set ld_library_path "." + append ld_library_path ":${gccdir}" + + set compiler "${gccdir}/xgcc" + if { [is_remote host] == 0 && [which $compiler] != 0 } { + foreach i "[exec $compiler --print-multi-lib]" { + set mldir "" + regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir + set mldir [string trimright $mldir "\;@"] + if { "$mldir" == "." } { + continue + } + if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } { + append ld_library_path ":${gccdir}/${mldir}" + } + } + } + } + + # add the library path for libffi. + append ld_library_path ":${blddirffi}/.libs" + + verbose "ld_library_path: $ld_library_path" + + # Point to the Libffi headers in libffi. + set libffi_include "${blddirffi}/include" + verbose "libffi_include $libffi_include" + + set libffi_dir "${blddirffi}/.libs" + verbose "libffi_dir $libffi_dir" + if { $libffi_dir != "" } { + set libffi_dir [file dirname ${libffi_dir}] + set libffi_link_flags "-L${libffi_dir}/.libs" + } + + set_ld_library_path_env_vars + libffi_maybe_build_wrapper "${objdir}/testglue.o" +} + +proc libffi_exit { } { + global gluefile; + + if [info exists gluefile] { + file_on_build delete $gluefile; + unset gluefile; + } +} + +proc libffi_target_compile { source dest type options } { + global gluefile wrap_flags; + global srcdir + global blddirffi + global TOOL_OPTIONS + global libffi_link_flags + global libffi_include + global target_triplet + global compiler_vendor + + if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { + lappend options "libs=${gluefile}" + lappend options "ldflags=$wrap_flags" + } + + # TOOL_OPTIONS must come first, so that it doesn't override testcase + # specific options. + if [info exists TOOL_OPTIONS] { + lappend options "additional_flags=$TOOL_OPTIONS" + } + + # search for ffi_mips.h in srcdir, too + lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include -I${libffi_include}/.." + lappend options "additional_flags=${libffi_link_flags}" + + # Darwin needs a stack execution allowed flag. + + if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"] + || [istarget "*-*-darwin2*"] } { + lappend options "additional_flags=-Wl,-allow_stack_execute" + } + + # If you're building the compiler with --prefix set to a place + # where it's not yet installed, then the linker won't be able to + # find the libgcc used by libffi.dylib. We could pass the + # -dylib_file option, but that's complicated, and it's much easier + # to just make the linker find libgcc using -L options. + if { [string match "*-*-darwin*" $target_triplet] } { + lappend options "libs= -shared-libgcc" + } + + if { [string match "*-*-openbsd*" $target_triplet] } { + lappend options "libs= -lpthread" + } + + lappend options "libs= -lffi" + + if { [string match "aarch64*-*-linux*" $target_triplet] } { + lappend options "libs= -lpthread" + } + + # this may be required for g++, but just confused clang. + if { [string match "*.cc" $source] } { + lappend options "c++" + } + + if { [string match "arc*-*-linux*" $target_triplet] } { + lappend options "libs= -lpthread" + } + + verbose "options: $options" + return [target_compile $source $dest $type $options] +} + +# TEST should be a preprocessor condition. Returns true if it holds. +proc libffi_feature_test { test } { + set src "ffitest[pid].c" + + set f [open $src "w"] + puts $f "#include <ffi.h>" + puts $f $test + puts $f "/* OK */" + puts $f "#else" + puts $f "# error Failed $test" + puts $f "#endif" + close $f + + set lines [libffi_target_compile $src /dev/null assembly ""] + file delete $src + + return [string match "" $lines] +} + +# Utility routines. + +# +# search_for -- looks for a string match in a file +# +proc search_for { file pattern } { + set fd [open $file r] + while { [gets $fd cur_line]>=0 } { + if [string match "*$pattern*" $cur_line] then { + close $fd + return 1 + } + } + close $fd + return 0 +} + +# Modified dg-runtest that can cycle through a list of optimization options +# as c-torture does. +proc libffi-dg-runtest { testcases default-extra-flags } { + global runtests + + foreach test $testcases { + # If we're only testing specific files and this isn't one of + # them, skip it. + if ![runtest_file_p $runtests $test] { + continue + } + + # Look for a loop within the source code - if we don't find one, + # don't pass -funroll[-all]-loops. + global torture_with_loops torture_without_loops + if [expr [search_for $test "for*("]+[search_for $test "while*("]] { + set option_list $torture_with_loops + } else { + set option_list $torture_without_loops + } + + set nshort [file tail [file dirname $test]]/[file tail $test] + + foreach flags $option_list { + verbose "Testing $nshort, $flags" 1 + dg-test $test $flags ${default-extra-flags} + } + } +} + +proc run-many-tests { testcases extra_flags } { + global compiler_vendor + global has_gccbug + global env + switch $compiler_vendor { + "clang" { + set common "-W -Wall" + if [info exists env(LIBFFI_TEST_OPTIMIZATION)] { + set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ] + } else { + set optimizations { "-O0" "-O2" } + } + } + "gnu" { + set common "-W -Wall -Wno-psabi" + if [info exists env(LIBFFI_TEST_OPTIMIZATION)] { + set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ] + } else { + set optimizations { "-O0" "-O2" } + } + } + default { + # Assume we are using the vendor compiler. + set common "" + if [info exists env(LIBFFI_TEST_OPTIMIZATION)] { + set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ] + } else { + set optimizations { "" } + } + } + } + + info exists env(LD_LIBRARY_PATH) + + set targetabis { "" } + if [string match $compiler_vendor "gnu"] { + if [libffi_feature_test "#ifdef __i386__"] { + set targetabis { + "" + "-DABI_NUM=FFI_STDCALL -DABI_ATTR=__STDCALL__" + "-DABI_NUM=FFI_THISCALL -DABI_ATTR=__THISCALL__" + "-DABI_NUM=FFI_FASTCALL -DABI_ATTR=__FASTCALL__" + } + } elseif { [istarget "x86_64-*-*"] \ + && [libffi_feature_test "#if !defined __ILP32__ \ + && !defined __i386__"] } { + set targetabis { + "" + "-DABI_NUM=FFI_GNUW64 -DABI_ATTR=__MSABI__" + } + } + } + + set common [ concat $common $extra_flags ] + foreach test $testcases { + set testname [file tail $test] + if [search_for $test "ABI_NUM"] { + set abis $targetabis + } else { + set abis { "" } + } + foreach opt $optimizations { + foreach abi $abis { + set options [concat $common $opt $abi] + set has_gccbug false; + if { [string match $compiler_vendor "gnu"] \ + && [string match "*MSABI*" $abi] \ + && ( ( [string match "*DGTEST=57 *" $common] \ + && [string match "*call.c*" $testname] ) \ + || ( [string match "*DGTEST=54 *" $common] \ + && [string match "*callback*" $testname] ) \ + || [string match "*DGTEST=55 *" $common] \ + || [string match "*DGTEST=56 *" $common] ) } then { + if [libffi_feature_test "#if (__GNUC__ < 9) || ((__GNUC__ == 9) && (__GNUC_MINOR__ < 3))"] { + set has_gccbug true; + } + } + verbose "Testing $testname, $options" 1 + verbose "has_gccbug = $has_gccbug" 1 + dg-test $test $options "" + } + } + } +} + +# Like check_conditional_xfail, but callable from a dg test. + +proc dg-xfail-if { args } { + set args [lreplace $args 0 0] + set selector "target [join [lindex $args 1]]" + if { [dg-process-target $selector] == "S" } { + global compiler_conditional_xfail_data + set compiler_conditional_xfail_data $args + } +} + +proc check-flags { args } { + + # The args are within another list; pull them out. + set args [lindex $args 0] + + # The next two arguments are optional. If they were not specified, + # use the defaults. + if { [llength $args] == 2 } { + lappend $args [list "*"] + } + if { [llength $args] == 3 } { + lappend $args [list ""] + } + + # If the option strings are the defaults, or the same as the + # defaults, there is no need to call check_conditional_xfail to + # compare them to the actual options. + if { [string compare [lindex $args 2] "*"] == 0 + && [string compare [lindex $args 3] "" ] == 0 } { + set result 1 + } else { + # The target list might be an effective-target keyword, so replace + # the original list with "*-*-*", since we already know it matches. + set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]] + } + + return $result +} + +proc dg-skip-if { args } { + # Verify the number of arguments. The last two are optional. + set args [lreplace $args 0 0] + if { [llength $args] < 2 || [llength $args] > 4 } { + error "dg-skip-if 2: need 2, 3, or 4 arguments" + } + + # Don't bother if we're already skipping the test. + upvar dg-do-what dg-do-what + if { [lindex ${dg-do-what} 1] == "N" } { + return + } + + set selector [list target [lindex $args 1]] + if { [dg-process-target $selector] == "S" } { + if [check-flags $args] { + upvar dg-do-what dg-do-what + set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] + } + } +} + +# We need to make sure that additional_files and additional_sources +# are both cleared out after every test. It is not enough to clear +# them out *before* the next test run because gcc-target-compile gets +# run directly from some .exp files (outside of any test). (Those +# uses should eventually be eliminated.) + +# Because the DG framework doesn't provide a hook that is run at the +# end of a test, we must replace dg-test with a wrapper. + +if { [info procs saved-dg-test] == [list] } { + rename dg-test saved-dg-test + + proc dg-test { args } { + global additional_files + global additional_sources + global errorInfo + + if { [ catch { eval saved-dg-test $args } errmsg ] } { + set saved_info $errorInfo + set additional_files "" + set additional_sources "" + error $errmsg $saved_info + } + set additional_files "" + set additional_sources "" + } +} + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp new file mode 100644 index 000000000000..6b7beba93516 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp @@ -0,0 +1,283 @@ +# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# This file was contributed by John David Anglin (dave.anglin@nrc-cnrc.gc.ca) + +set orig_environment_saved 0 +set orig_ld_library_path_saved 0 +set orig_ld_run_path_saved 0 +set orig_shlib_path_saved 0 +set orig_ld_libraryn32_path_saved 0 +set orig_ld_library64_path_saved 0 +set orig_ld_library_path_32_saved 0 +set orig_ld_library_path_64_saved 0 +set orig_dyld_library_path_saved 0 +set orig_path_saved 0 + +####################################### +# proc set_ld_library_path_env_vars { } +####################################### + +proc set_ld_library_path_env_vars { } { + global ld_library_path + global orig_environment_saved + global orig_ld_library_path_saved + global orig_ld_run_path_saved + global orig_shlib_path_saved + global orig_ld_libraryn32_path_saved + global orig_ld_library64_path_saved + global orig_ld_library_path_32_saved + global orig_ld_library_path_64_saved + global orig_dyld_library_path_saved + global orig_path_saved + global orig_ld_library_path + global orig_ld_run_path + global orig_shlib_path + global orig_ld_libraryn32_path + global orig_ld_library64_path + global orig_ld_library_path_32 + global orig_ld_library_path_64 + global orig_dyld_library_path + global orig_path + global GCC_EXEC_PREFIX + + # Set the relocated compiler prefix, but only if the user hasn't specified one. + if { [info exists GCC_EXEC_PREFIX] && ![info exists env(GCC_EXEC_PREFIX)] } { + setenv GCC_EXEC_PREFIX "$GCC_EXEC_PREFIX" + } + + # Setting the ld library path causes trouble when testing cross-compilers. + if { [is_remote target] } { + return + } + + if { $orig_environment_saved == 0 } { + global env + + set orig_environment_saved 1 + + # Save the original environment. + if [info exists env(LD_LIBRARY_PATH)] { + set orig_ld_library_path "$env(LD_LIBRARY_PATH)" + set orig_ld_library_path_saved 1 + } + if [info exists env(LD_RUN_PATH)] { + set orig_ld_run_path "$env(LD_RUN_PATH)" + set orig_ld_run_path_saved 1 + } + if [info exists env(SHLIB_PATH)] { + set orig_shlib_path "$env(SHLIB_PATH)" + set orig_shlib_path_saved 1 + } + if [info exists env(LD_LIBRARYN32_PATH)] { + set orig_ld_libraryn32_path "$env(LD_LIBRARYN32_PATH)" + set orig_ld_libraryn32_path_saved 1 + } + if [info exists env(LD_LIBRARY64_PATH)] { + set orig_ld_library64_path "$env(LD_LIBRARY64_PATH)" + set orig_ld_library64_path_saved 1 + } + if [info exists env(LD_LIBRARY_PATH_32)] { + set orig_ld_library_path_32 "$env(LD_LIBRARY_PATH_32)" + set orig_ld_library_path_32_saved 1 + } + if [info exists env(LD_LIBRARY_PATH_64)] { + set orig_ld_library_path_64 "$env(LD_LIBRARY_PATH_64)" + set orig_ld_library_path_64_saved 1 + } + if [info exists env(DYLD_LIBRARY_PATH)] { + set orig_dyld_library_path "$env(DYLD_LIBRARY_PATH)" + set orig_dyld_library_path_saved 1 + } + if [info exists env(PATH)] { + set orig_path "$env(PATH)" + set orig_path_saved 1 + } + } + + # We need to set ld library path in the environment. Currently, + # unix.exp doesn't set the environment correctly for all systems. + # It only sets SHLIB_PATH and LD_LIBRARY_PATH when it executes a + # program. We also need the environment set for compilations, etc. + # + # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but + # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH + # (for the 64-bit ABI). The same applies to Darwin (DYLD_LIBRARY_PATH), + # Solaris 32 bit (LD_LIBRARY_PATH_32), Solaris 64 bit (LD_LIBRARY_PATH_64), + # and HP-UX (SHLIB_PATH). In some cases, the variables are independent + # of LD_LIBRARY_PATH, and in other cases LD_LIBRARY_PATH is used if the + # variable is not defined. + # + # Doing this is somewhat of a hack as ld_library_path gets repeated in + # SHLIB_PATH and LD_LIBRARY_PATH when unix_load sets these variables. + if { $orig_ld_library_path_saved } { + setenv LD_LIBRARY_PATH "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARY_PATH "$ld_library_path" + } + if { $orig_ld_run_path_saved } { + setenv LD_RUN_PATH "$ld_library_path:$orig_ld_run_path" + } else { + setenv LD_RUN_PATH "$ld_library_path" + } + # The default shared library dynamic path search for 64-bit + # HP-UX executables searches LD_LIBRARY_PATH before SHLIB_PATH. + # LD_LIBRARY_PATH isn't used for 32-bit executables. Thus, we + # set LD_LIBRARY_PATH and SHLIB_PATH as if they were independent. + if { $orig_shlib_path_saved } { + setenv SHLIB_PATH "$ld_library_path:$orig_shlib_path" + } else { + setenv SHLIB_PATH "$ld_library_path" + } + if { $orig_ld_libraryn32_path_saved } { + setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_libraryn32_path" + } elseif { $orig_ld_library_path_saved } { + setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARYN32_PATH "$ld_library_path" + } + if { $orig_ld_library64_path_saved } { + setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library64_path" + } elseif { $orig_ld_library_path_saved } { + setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARY64_PATH "$ld_library_path" + } + if { $orig_ld_library_path_32_saved } { + setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path_32" + } elseif { $orig_ld_library_path_saved } { + setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARY_PATH_32 "$ld_library_path" + } + if { $orig_ld_library_path_64_saved } { + setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path_64" + } elseif { $orig_ld_library_path_saved } { + setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path" + } else { + setenv LD_LIBRARY_PATH_64 "$ld_library_path" + } + if { $orig_dyld_library_path_saved } { + setenv DYLD_LIBRARY_PATH "$ld_library_path:$orig_dyld_library_path" + } else { + setenv DYLD_LIBRARY_PATH "$ld_library_path" + } + if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } { + if { $orig_path_saved } { + setenv PATH "$ld_library_path:$orig_path" + } else { + setenv PATH "$ld_library_path" + } + } + + verbose -log "set_ld_library_path_env_vars: ld_library_path=$ld_library_path" +} + +####################################### +# proc restore_ld_library_path_env_vars { } +####################################### + +proc restore_ld_library_path_env_vars { } { + global orig_environment_saved + global orig_ld_library_path_saved + global orig_ld_run_path_saved + global orig_shlib_path_saved + global orig_ld_libraryn32_path_saved + global orig_ld_library64_path_saved + global orig_ld_library_path_32_saved + global orig_ld_library_path_64_saved + global orig_dyld_library_path_saved + global orig_path_saved + global orig_ld_library_path + global orig_ld_run_path + global orig_shlib_path + global orig_ld_libraryn32_path + global orig_ld_library64_path + global orig_ld_library_path_32 + global orig_ld_library_path_64 + global orig_dyld_library_path + global orig_path + + if { $orig_environment_saved == 0 } { + return + } + + if { $orig_ld_library_path_saved } { + setenv LD_LIBRARY_PATH "$orig_ld_library_path" + } elseif [info exists env(LD_LIBRARY_PATH)] { + unsetenv LD_LIBRARY_PATH + } + if { $orig_ld_run_path_saved } { + setenv LD_RUN_PATH "$orig_ld_run_path" + } elseif [info exists env(LD_RUN_PATH)] { + unsetenv LD_RUN_PATH + } + if { $orig_shlib_path_saved } { + setenv SHLIB_PATH "$orig_shlib_path" + } elseif [info exists env(SHLIB_PATH)] { + unsetenv SHLIB_PATH + } + if { $orig_ld_libraryn32_path_saved } { + setenv LD_LIBRARYN32_PATH "$orig_ld_libraryn32_path" + } elseif [info exists env(LD_LIBRARYN32_PATH)] { + unsetenv LD_LIBRARYN32_PATH + } + if { $orig_ld_library64_path_saved } { + setenv LD_LIBRARY64_PATH "$orig_ld_library64_path" + } elseif [info exists env(LD_LIBRARY64_PATH)] { + unsetenv LD_LIBRARY64_PATH + } + if { $orig_ld_library_path_32_saved } { + setenv LD_LIBRARY_PATH_32 "$orig_ld_library_path_32" + } elseif [info exists env(LD_LIBRARY_PATH_32)] { + unsetenv LD_LIBRARY_PATH_32 + } + if { $orig_ld_library_path_64_saved } { + setenv LD_LIBRARY_PATH_64 "$orig_ld_library_path_64" + } elseif [info exists env(LD_LIBRARY_PATH_64)] { + unsetenv LD_LIBRARY_PATH_64 + } + if { $orig_dyld_library_path_saved } { + setenv DYLD_LIBRARY_PATH "$orig_dyld_library_path" + } elseif [info exists env(DYLD_LIBRARY_PATH)] { + unsetenv DYLD_LIBRARY_PATH + } + if { $orig_path_saved } { + setenv PATH "$orig_path" + } elseif [info exists env(PATH)] { + unsetenv PATH + } +} + +####################################### +# proc get_shlib_extension { } +####################################### + +proc get_shlib_extension { } { + global shlib_ext + + if { [ istarget *-*-darwin* ] } { + set shlib_ext "dylib" + } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-mingw* ] } { + set shlib_ext "dll" + } elseif { [ istarget hppa*-*-hpux* ] } { + set shlib_ext "sl" + } else { + set shlib_ext "so" + } + return $shlib_ext +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/lib/wrapper.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/lib/wrapper.exp new file mode 100644 index 000000000000..4e5ae435a13e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/lib/wrapper.exp @@ -0,0 +1,45 @@ +# Copyright (C) 2004, 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# This file contains GCC-specifics for status wrappers for test programs. + +# ${tool}_maybe_build_wrapper -- Build wrapper object if the target +# needs it. FILENAME is the path to the wrapper file. If there are +# additional arguments, they are command-line options to provide to +# the compiler when compiling FILENAME. + +proc ${tool}_maybe_build_wrapper { filename args } { + global gluefile wrap_flags + + if { [target_info needs_status_wrapper] != "" \ + && [target_info needs_status_wrapper] != "0" \ + && ![info exists gluefile] } { + set saved_wrap_compile_flags [target_info wrap_compile_flags] + set flags [join $args " "] + # The wrapper code may contain code that gcc objects on. This + # became true for dejagnu-1.4.4. The set of warnings and code + # that gcc objects on may change, so just make sure -w is always + # passed to turn off all warnings. + set_currtarget_info wrap_compile_flags \ + "$saved_wrap_compile_flags -w $flags" + set result [build_wrapper $filename] + set_currtarget_info wrap_compile_flags "$saved_wrap_compile_flags" + if { $result != "" } { + set gluefile [lindex $result 0] + set wrap_flags [lindex $result 1] + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile new file mode 100644 index 000000000000..3322de94f7ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile @@ -0,0 +1,28 @@ +CC = gcc +CFLAGS = -O2 -Wall +prefix = +includedir = $(prefix)/include +libdir = $(prefix)/lib +CPPFLAGS = -I$(includedir) +LDFLAGS = -L$(libdir) -Wl,-rpath,$(libdir) + +all: check-call check-callback + +test-call: test-call.c testcases.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-call test-call.c -lffi + +test-callback: test-callback.c testcases.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-callback test-callback.c -lffi + +check-call: test-call + ./test-call > test-call.out + LC_ALL=C uniq -u < test-call.out > failed-call + test '!' -s failed-call + +check-callback: test-callback + ./test-callback > test-callback.out + LC_ALL=C uniq -u < test-callback.out > failed-callback + test '!' -s failed-callback + +clean: + rm -f test-call test-callback test-call.out test-callback.out failed-call failed-callback diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/README b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/README new file mode 100644 index 000000000000..be8540b64fa9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/README @@ -0,0 +1,78 @@ +This package contains a test suite for libffi. + +This test suite can be compiled with a C compiler. No need for 'expect' +or some other package that is often not installed. + +The test suite consists of 81 C functions, each with a different signature. +* test-call verifies that calling each function directly produces the same + results as calling the function indirectly through 'ffi_call'. +* test-callback verifies that calling each function directly produces the same + results as calling a function that is a callback (object build by + 'ffi_prep_closure_loc') and simulates the original function. + +Each direct or indirect invocation should produce one line of output to +stdout. A correct output consists of paired lines, such as + +void f(void): +void f(void): +int f(void):->99 +int f(void):->99 +int f(int):(1)->2 +int f(int):(1)->2 +int f(2*int):(1,2)->3 +int f(2*int):(1,2)->3 +... + +The Makefile then creates two files: +* failed-call, which consists of the non-paired lines of output of + 'test-call', +* failed-callback, which consists of the non-paired lines of output of + 'test-callback'. + +The test suite passes if both failed-call and failed-callback come out +as empty. + + +How to use the test suite +------------------------- + +1. Modify the Makefile's variables + prefix = the directory in which libffi was installed + CC = the C compiler, often with options such as "-m32" or "-m64" + that enforce a certain ABI, + CFLAGS = optimization options (need to change them only for non-GCC + compilers) +2. Run "make". If it fails already in "test-call", run also + "make check-callback". +3. If this failed, inspect the output files. + + +How to interpret the results +---------------------------- + +The failed-call and failed-callback files consist of paired lines: +The first line is the result of the direct invocation. +The second line is the result of invocation through libffi. + +For example, this output + +uchar f(uchar,ushort,uint,ulong):(97,2,3,4)->255 +uchar f(uchar,ushort,uint,ulong):(97,2,3,4)->0 + +indicates that the arguments were passed correctly, but the return +value came out wrong. + +And this output + +float f(17*float,3*int,L):(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,6,7,8,561,1105,1729,2465,2821,6601)->15319.1 +float f(17*float,3*int,L):(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,-140443648,10,268042216,-72537980,-140443648,-140443648,-140443648,-140443648,-140443648)->-6.47158e+08 + +indicates that integer arguments that come after 17 floating-point arguments +were not passed correctly. + + +Credits +------- + +The test suite is based on the one of GNU libffcall-2.0. +Authors: Bill Triggs, Bruno Haible diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h new file mode 100644 index 000000000000..00604a513ad3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h @@ -0,0 +1,50 @@ +/* Determine alignment of types. + Copyright (C) 2003-2004, 2006, 2009-2017 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see <https://www.gnu.org/licenses/>. */ + +#ifndef _ALIGNOF_H +#define _ALIGNOF_H + +#include <stddef.h> + +/* alignof_slot (TYPE) + Determine the alignment of a structure slot (field) of a given type, + at compile time. Note that the result depends on the ABI. + This is the same as alignof (TYPE) and _Alignof (TYPE), defined in + <stdalign.h> if __alignof_is_defined is 1. + Note: The result cannot be used as a value for an 'enum' constant, + due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */ +#if defined __cplusplus + template <class type> struct alignof_helper { char __slot1; type __slot2; }; +# define alignof_slot(type) offsetof (alignof_helper<type>, __slot2) +#else +# define alignof_slot(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) +#endif + +/* alignof_type (TYPE) + Determine the good alignment of an object of the given type at compile time. + Note that this is not necessarily the same as alignof_slot(type). + For example, with GNU C on x86 platforms: alignof_type(double) = 8, but + - when -malign-double is not specified: alignof_slot(double) = 4, + - when -malign-double is specified: alignof_slot(double) = 8. + Note: The result cannot be used as a value for an 'enum' constant, + due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */ +#if defined __GNUC__ || defined __IBM__ALIGNOF__ +# define alignof_type __alignof__ +#else +# define alignof_type alignof_slot +#endif + +#endif /* _ALIGNOF_H */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp new file mode 100644 index 000000000000..44aebc5e0637 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp @@ -0,0 +1,63 @@ +# Copyright (C) 2003, 2006, 2009, 2010, 2014, 2018 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +dg-init +libffi-init + +global srcdir subdir +global compiler_vendor + +# The conversion of this testsuite into a dejagnu compatible testsuite +# was done in a pretty lazy fashion, and requires the use of compiler +# flags to disable warnings for now. +if { [string match $compiler_vendor "gnu"] } { + set warning_options "-Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -Wno-uninitialized"; +} +if { [string match $compiler_vendor "microsoft"] } { + # -wd4996 suggest use of vsprintf_s instead of vsprintf + # -wd4116 unnamed type definition + # -wd4101 unreferenced local variable + # -wd4244 warning about implicit double to float conversion + set warning_options "-wd4996 -wd4116 -wd4101 -wd4244"; +} +if { ![string match $compiler_vendor "microsoft"] && ![string match $compiler_vendor "gnu"] } { + set warning_options "-Wno-unused-variable -Wno-unused-parameter -Wno-uninitialized"; +} + + +set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/test-call.c]] + +for {set i 1} {$i < 82} {incr i} { + run-many-tests $tlist [format "-DDGTEST=%d %s" $i $warning_options] +} + +set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/test-callback.c]] + +for {set i 1} {$i < 81} {incr i} { + if { [libffi_feature_test "#if FFI_CLOSURES"] } { + run-many-tests $tlist [format "-DDGTEST=%d %s" $i $warning_options] + } else { + foreach test $tlist { + unsupported [format "%s -DDGTEST=%d %s" $test $i $warning_options] + } + } +} + +dg-finish + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c new file mode 100644 index 000000000000..cf9219e26637 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c @@ -0,0 +1,1745 @@ +/** + Copyright 1993 Bill Triggs <Bill.Triggs@inrialpes.fr> + Copyright 1995-2017 Bruno Haible <bruno@clisp.org> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +**/ + +/* { dg-do run { xfail gccbug } } */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ffi.h> +#include "alignof.h" +#include <stdarg.h> + +/* libffi testsuite local changes -------------------------------- */ +#ifdef DGTEST +/* Redefine exit(1) as a test failure */ +#define exit(V) (void)((V) ? (abort(), 1) : exit(0)) +int count = 0; +char rbuf1[2048]; +char rbuf2[2048]; +int _fprintf(FILE *stream, const char *format, ...) +{ + va_list args; + va_start(args, format); + + switch (count++) + { + case 0: + case 1: + vsprintf(&rbuf1[strlen(rbuf1)], format, args); + break; + case 2: + printf("%s", rbuf1); + vsprintf(rbuf2, format, args); + break; + case 3: + vsprintf(&rbuf2[strlen(rbuf2)], format, args); + printf("%s", rbuf2); + if (strcmp (rbuf1, rbuf2)) abort(); + break; + } + + va_end(args); + + return 0; +} +#define fprintf _fprintf +#endif +/* --------------------------------------------------------------- */ + +#include "testcases.c" + +#ifndef ABI_NUM +#define ABI_NUM FFI_DEFAULT_ABI +#endif + +/* Definitions that ought to be part of libffi. */ +static ffi_type ffi_type_char; +#define ffi_type_slonglong ffi_type_sint64 +#define ffi_type_ulonglong ffi_type_uint64 + +/* libffi does not support arrays inside structs. */ +#define SKIP_EXTRA_STRUCTS + +#define FFI_PREP_CIF(cif,argtypes,rettype) \ + if (ffi_prep_cif(&(cif),ABI_NUM,sizeof(argtypes)/sizeof(argtypes[0]),&rettype,argtypes) != FFI_OK) abort() +#define FFI_PREP_CIF_NOARGS(cif,rettype) \ + if (ffi_prep_cif(&(cif),ABI_NUM,0,&rettype,NULL) != FFI_OK) abort() +#define FFI_CALL(cif,fn,args,retaddr) \ + ffi_call(&(cif),(void(*)(void))(fn),retaddr,args) + +long clear_traces_i (long a, long b, long c, long d, long e, long f, long g, long h, + long i, long j, long k, long l, long m, long n, long o, long p) +{ return 0; } +float clear_traces_f (float a, float b, float c, float d, float e, float f, float g, + float h, float i, float j, float k, float l, float m, float n, + float o, float p) +{ return 0.0; } +double clear_traces_d (double a, double b, double c, double d, double e, double f, double g, + double h, double i, double j, double k, double l, double m, double n, + double o, double p) +{ return 0.0; } +J clear_traces_J (void) +{ J j; j.l1 = j.l2 = 0; return j; } +void clear_traces (void) +{ clear_traces_i(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); + clear_traces_f(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); + clear_traces_d(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); + clear_traces_J(); +} + +void + void_tests (void) +{ +#if (!defined(DGTEST)) || DGTEST == 1 + v_v(); + clear_traces(); + { + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_void); + { + FFI_CALL(cif,v_v,NULL,NULL); + } + } +#endif + return; +} +void + int_tests (void) +{ + int ir; + ffi_arg retvalue; +#if (!defined(DGTEST)) || DGTEST == 2 + ir = i_v(); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + { + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_sint); + { + FFI_CALL(cif,i_v,NULL,&retvalue); + ir = retvalue; + } + } + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 3 + ir = i_i(i1); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + { + /*const*/ void* args[] = { &i1 }; + FFI_CALL(cif,i_i,args,&retvalue); + ir = retvalue; + } + } + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 4 + ir = i_i2(i1,i2); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + { + /*const*/ void* args[] = { &i1, &i2 }; + FFI_CALL(cif,i_i2,args,&retvalue); + ir = retvalue; + } + } + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 5 + ir = i_i4(i1,i2,i3,i4); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + { + /*const*/ void* args[] = { &i1, &i2, &i3, &i4 }; + FFI_CALL(cif,i_i4,args,&retvalue); + ir = retvalue; + } + } + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 6 + ir = i_i8(i1,i2,i3,i4,i5,i6,i7,i8); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + { + /*const*/ void* args[] = { &i1, &i2, &i3, &i4, &i5, &i6, &i7, &i8 }; + FFI_CALL(cif,i_i8,args,&retvalue); + ir = retvalue; + } + } + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 7 + ir = i_i16(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + { + /*const*/ void* args[] = { &i1, &i2, &i3, &i4, &i5, &i6, &i7, &i8, &i9, &i10, &i11, &i12, &i13, &i14, &i15, &i16 }; + FFI_CALL(cif,i_i16,args,&retvalue); + ir = retvalue; + } + } + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + + return; +} +void + float_tests (void) +{ + float fr; + +#if (!defined(DGTEST)) || DGTEST == 8 + fr = f_f(f1); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1 }; + FFI_CALL(cif,f_f,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 9 + fr = f_f2(f1,f2); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2 }; + FFI_CALL(cif,f_f2,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 10 + fr = f_f4(f1,f2,f3,f4); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4 }; + FFI_CALL(cif,f_f4,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 11 + fr = f_f8(f1,f2,f3,f4,f5,f6,f7,f8); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8 }; + FFI_CALL(cif,f_f8,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 12 + fr = f_f16(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16 }; + FFI_CALL(cif,f_f16,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 13 + fr = f_f24(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16, &f17, &f18, &f19, &f20, &f21, &f22, &f23, &f24 }; + FFI_CALL(cif,f_f24,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif +} +void + double_tests (void) +{ + double dr; + +#if (!defined(DGTEST)) || DGTEST == 14 + + dr = d_d(d1); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1 }; + FFI_CALL(cif,d_d,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 15 + dr = d_d2(d1,d2); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2 }; + FFI_CALL(cif,d_d2,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 16 + dr = d_d4(d1,d2,d3,d4); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &d4 }; + FFI_CALL(cif,d_d4,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 17 + dr = d_d8(d1,d2,d3,d4,d5,d6,d7,d8); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8 }; + FFI_CALL(cif,d_d8,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 18 + dr = d_d16(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &d14, &d15, &d16 }; + FFI_CALL(cif,d_d16,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + return; +} +void + pointer_tests (void) +{ + void* vpr; + +#if (!defined(DGTEST)) || DGTEST == 19 + vpr = vp_vpdpcpsp(&uc1,&d2,str3,&I4); + fprintf(out,"->0x%p\n",vpr); + fflush(out); + vpr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_pointer); + { + void* puc1 = &uc1; + void* pd2 = &d2; + void* pstr3 = str3; + void* pI4 = &I4; + /*const*/ void* args[] = { &puc1, &pd2, &pstr3, &pI4 }; + FFI_CALL(cif,vp_vpdpcpsp,args,&vpr); + } + } + fprintf(out,"->0x%p\n",vpr); + fflush(out); +#endif + return; +} +void + mixed_number_tests (void) +{ + uchar ucr; + ushort usr; + float fr; + double dr; + long long llr; + + /* Unsigned types. + */ +#if (!defined(DGTEST)) || DGTEST == 20 + ucr = uc_ucsil(uc1, us2, ui3, ul4); + fprintf(out,"->%u\n",ucr); + fflush(out); + ucr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_uchar, &ffi_type_ushort, &ffi_type_uint, &ffi_type_ulong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_uchar); + { + ffi_arg r; + /*const*/ void* args[] = { &uc1, &us2, &ui3, &ul4 }; + FFI_CALL(cif,uc_ucsil,args,&r); + ucr = (uchar) r; + } + } + fprintf(out,"->%u\n",ucr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 21 + /* Mixed int & float types. + */ + dr = d_iidd(i1,i2,d3,d4); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &i1, &i2, &d3, &d4 }; + FFI_CALL(cif,d_iidd,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 22 + dr = d_iiidi(i1,i2,i3,d4,i5); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &i1, &i2, &i3, &d4, &i5 }; + FFI_CALL(cif,d_iiidi,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 23 + dr = d_idid(i1,d2,i3,d4); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_double, &ffi_type_sint, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &i1, &d2, &i3, &d4 }; + FFI_CALL(cif,d_idid,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 24 + dr = d_fdi(f1,d2,i3); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &f1, &d2, &i3 }; + FFI_CALL(cif,d_fdi,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 25 + usr = us_cdcd(c1,d2,c3,d4); + fprintf(out,"->%u\n",usr); + fflush(out); + usr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_char, &ffi_type_double, &ffi_type_char, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_ushort); + { + ffi_arg rint; + /*const*/ void* args[] = { &c1, &d2, &c3, &d4 }; + FFI_CALL(cif,us_cdcd,args,&rint); + usr = (ushort) rint; + } + } + fprintf(out,"->%u\n",usr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 26 + /* Long long types. + */ + llr = ll_iiilli(i1,i2,i3,ll1,i13); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_slonglong, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + { + /*const*/ void* args[] = { &i1, &i2, &i3, &ll1, &i13 }; + FFI_CALL(cif,ll_iiilli,args,&llr); + } + } + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 27 + llr = ll_flli(f13,ll1,i13); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_slonglong, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + { + /*const*/ void* args[] = { &f13, &ll1, &i13 }; + FFI_CALL(cif,ll_flli,args,&llr); + } + } + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 28 + fr = f_fi(f1,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &i9 }; + FFI_CALL(cif,f_fi,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 29 + fr = f_f2i(f1,f2,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &i9 }; + FFI_CALL(cif,f_f2i,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 30 + fr = f_f3i(f1,f2,f3,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &i9 }; + FFI_CALL(cif,f_f3i,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 31 + fr = f_f4i(f1,f2,f3,f4,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &i9 }; + FFI_CALL(cif,f_f4i,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 32 + fr = f_f7i(f1,f2,f3,f4,f5,f6,f7,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &i9 }; + FFI_CALL(cif,f_f7i,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 33 + fr = f_f8i(f1,f2,f3,f4,f5,f6,f7,f8,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &i9 }; + FFI_CALL(cif,f_f8i,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 34 + fr = f_f12i(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &i9 }; + FFI_CALL(cif,f_f12i,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 35 + fr = f_f13i(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &i9 }; + FFI_CALL(cif,f_f13i,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 36 + dr = d_di(d1,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &i9 }; + FFI_CALL(cif,d_di,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 37 + dr = d_d2i(d1,d2,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &i9 }; + FFI_CALL(cif,d_d2i,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 38 + dr = d_d3i(d1,d2,d3,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &i9 }; + FFI_CALL(cif,d_d3i,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 39 + dr = d_d4i(d1,d2,d3,d4,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &i9 }; + FFI_CALL(cif,d_d4i,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 40 + dr = d_d7i(d1,d2,d3,d4,d5,d6,d7,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &i9 }; + FFI_CALL(cif,d_d7i,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 41 + dr = d_d8i(d1,d2,d3,d4,d5,d6,d7,d8,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &i9 }; + FFI_CALL(cif,d_d8i,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 42 + dr = d_d12i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &i9 }; + FFI_CALL(cif,d_d12i,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 43 + dr = d_d13i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &i9 }; + FFI_CALL(cif,d_d13i,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + return; +} +void + small_structure_return_tests (void) +{ +#if (!defined(DGTEST)) || DGTEST == 44 + { + Size1 r = S1_v(); + fprintf(out,"->{%c}\n",r.x1); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + { + ffi_type* ffi_type_Size1_elements[] = { &ffi_type_char, NULL }; + ffi_type ffi_type_Size1; + ffi_type_Size1.type = FFI_TYPE_STRUCT; + ffi_type_Size1.size = sizeof(Size1); + ffi_type_Size1.alignment = alignof_slot(Size1); + ffi_type_Size1.elements = ffi_type_Size1_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size1); + { + FFI_CALL(cif,S1_v,NULL,&r); + } + } + fprintf(out,"->{%c}\n",r.x1); + fflush(out); + } +#endif +#if (!defined(DGTEST)) || DGTEST == 45 + { + Size2 r = S2_v(); + fprintf(out,"->{%c%c}\n",r.x1,r.x2); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + { + ffi_type* ffi_type_Size2_elements[] = { &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size2; + ffi_type_Size2.type = FFI_TYPE_STRUCT; + ffi_type_Size2.size = sizeof(Size2); + ffi_type_Size2.alignment = alignof_slot(Size2); + ffi_type_Size2.elements = ffi_type_Size2_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size2); + { + FFI_CALL(cif,S2_v,NULL,&r); + } + } + fprintf(out,"->{%c%c}\n",r.x1,r.x2); + fflush(out); + } +#endif +#if (!defined(DGTEST)) || DGTEST == 46 + { + Size3 r = S3_v(); + fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + { + ffi_type* ffi_type_Size3_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size3; + ffi_type_Size3.type = FFI_TYPE_STRUCT; + ffi_type_Size3.size = sizeof(Size3); + ffi_type_Size3.alignment = alignof_slot(Size3); + ffi_type_Size3.elements = ffi_type_Size3_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size3); + { + FFI_CALL(cif,S3_v,NULL,&r); + } + } + fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); + fflush(out); + } +#endif +#if (!defined(DGTEST)) || DGTEST == 47 + { + Size4 r = S4_v(); + fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + { + ffi_type* ffi_type_Size4_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size4; + ffi_type_Size4.type = FFI_TYPE_STRUCT; + ffi_type_Size4.size = sizeof(Size4); + ffi_type_Size4.alignment = alignof_slot(Size4); + ffi_type_Size4.elements = ffi_type_Size4_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size4); + { + FFI_CALL(cif,S4_v,NULL,&r); + } + } + fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); + fflush(out); + } +#endif +#if (!defined(DGTEST)) || DGTEST == 48 + { + Size7 r = S7_v(); + fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + { + ffi_type* ffi_type_Size7_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size7; + ffi_type_Size7.type = FFI_TYPE_STRUCT; + ffi_type_Size7.size = sizeof(Size7); + ffi_type_Size7.alignment = alignof_slot(Size7); + ffi_type_Size7.elements = ffi_type_Size7_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size7); + { + FFI_CALL(cif,S7_v,NULL,&r); + } + } + fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); + fflush(out); + } +#endif +#if (!defined(DGTEST)) || DGTEST == 49 + { + Size8 r = S8_v(); + fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + { + ffi_type* ffi_type_Size8_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size8; + ffi_type_Size8.type = FFI_TYPE_STRUCT; + ffi_type_Size8.size = sizeof(Size8); + ffi_type_Size8.alignment = alignof_slot(Size8); + ffi_type_Size8.elements = ffi_type_Size8_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size8); + { + FFI_CALL(cif,S8_v,NULL,&r); + } + } + fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); + fflush(out); + } +#endif +#if (!defined(DGTEST)) || DGTEST == 50 + { + Size12 r = S12_v(); + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + { + ffi_type* ffi_type_Size12_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size12; + ffi_type_Size12.type = FFI_TYPE_STRUCT; + ffi_type_Size12.size = sizeof(Size12); + ffi_type_Size12.alignment = alignof_slot(Size12); + ffi_type_Size12.elements = ffi_type_Size12_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size12); + { + FFI_CALL(cif,S12_v,NULL,&r); + } + } + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); + fflush(out); + } +#endif +#if (!defined(DGTEST)) || DGTEST == 51 + { + Size15 r = S15_v(); + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + { + ffi_type* ffi_type_Size15_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size15; + ffi_type_Size15.type = FFI_TYPE_STRUCT; + ffi_type_Size15.size = sizeof(Size15); + ffi_type_Size15.alignment = alignof_slot(Size15); + ffi_type_Size15.elements = ffi_type_Size15_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size15); + { + FFI_CALL(cif,S15_v,NULL,&r); + } + } + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); + fflush(out); + } +#endif +#if (!defined(DGTEST)) || DGTEST == 52 + { + Size16 r = S16_v(); + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + { + ffi_type* ffi_type_Size16_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size16; + ffi_type_Size16.type = FFI_TYPE_STRUCT; + ffi_type_Size16.size = sizeof(Size16); + ffi_type_Size16.alignment = alignof_slot(Size16); + ffi_type_Size16.elements = ffi_type_Size16_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size16); + { + FFI_CALL(cif,S16_v,NULL,&r); + } + } + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); + fflush(out); + } +#endif +} +void + structure_tests (void) +{ + Int Ir; + Char Cr; + Float Fr; + Double Dr; + J Jr; +#ifndef SKIP_EXTRA_STRUCTS + T Tr; + X Xr; +#endif + +#if (!defined(DGTEST)) || DGTEST == 53 + Ir = I_III(I1,I2,I3); + fprintf(out,"->{%d}\n",Ir.x); + fflush(out); + Ir.x = 0; clear_traces(); + { + ffi_type* ffi_type_Int_elements[] = { &ffi_type_sint, NULL }; + ffi_type ffi_type_Int; + ffi_type_Int.type = FFI_TYPE_STRUCT; + ffi_type_Int.size = sizeof(Int); + ffi_type_Int.alignment = alignof_slot(Int); + ffi_type_Int.elements = ffi_type_Int_elements; + ffi_type* argtypes[] = { &ffi_type_Int, &ffi_type_Int, &ffi_type_Int }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Int); + { + /*const*/ void* args[] = { &I1, &I2, &I3 }; + FFI_CALL(cif,I_III,args,&Ir); + } + } + fprintf(out,"->{%d}\n",Ir.x); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 54 + Cr = C_CdC(C1,d2,C3); + fprintf(out,"->{'%c'}\n",Cr.x); + fflush(out); + Cr.x = '\0'; clear_traces(); + { + ffi_type* ffi_type_Char_elements[] = { &ffi_type_char, NULL }; + ffi_type ffi_type_Char; + ffi_type_Char.type = FFI_TYPE_STRUCT; + ffi_type_Char.size = sizeof(Char); + ffi_type_Char.alignment = alignof_slot(Char); + ffi_type_Char.elements = ffi_type_Char_elements; + ffi_type* argtypes[] = { &ffi_type_Char, &ffi_type_double, &ffi_type_Char }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Char); + { + /*const*/ void* args[] = { &C1, &d2, &C3 }; + FFI_CALL(cif,C_CdC,args,&Cr); + } + } + fprintf(out,"->{'%c'}\n",Cr.x); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 55 + Fr = F_Ffd(F1,f2,d3); + fprintf(out,"->{%g}\n",Fr.x); + fflush(out); + Fr.x = 0.0; clear_traces(); + { + ffi_type* ffi_type_Float_elements[] = { &ffi_type_float, NULL }; + ffi_type ffi_type_Float; + ffi_type_Float.type = FFI_TYPE_STRUCT; + ffi_type_Float.size = sizeof(Float); + ffi_type_Float.alignment = alignof_slot(Float); + ffi_type_Float.elements = ffi_type_Float_elements; + ffi_type* argtypes[] = { &ffi_type_Float, &ffi_type_float, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Float); + { + /*const*/ void* args[] = { &F1, &f2, &d3 }; + FFI_CALL(cif,F_Ffd,args,&Fr); + } + } + fprintf(out,"->{%g}\n",Fr.x); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 56 + Dr = D_fDd(f1,D2,d3); + fprintf(out,"->{%g}\n",Dr.x); + fflush(out); + Dr.x = 0.0; clear_traces(); + { + ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; + ffi_type ffi_type_Double; + ffi_type_Double.type = FFI_TYPE_STRUCT; + ffi_type_Double.size = sizeof(Double); + ffi_type_Double.alignment = alignof_slot(Double); + ffi_type_Double.elements = ffi_type_Double_elements; + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_Double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Double); + { + /*const*/ void* args[] = { &f1, &D2, &d3 }; + FFI_CALL(cif,D_fDd,args,&Dr); + } + } + fprintf(out,"->{%g}\n",Dr.x); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 57 + Dr = D_Dfd(D1,f2,d3); + fprintf(out,"->{%g}\n",Dr.x); + fflush(out); + Dr.x = 0.0; clear_traces(); + { + ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; + ffi_type ffi_type_Double; + ffi_type_Double.type = FFI_TYPE_STRUCT; + ffi_type_Double.size = sizeof(Double); + ffi_type_Double.alignment = alignof_slot(Double); + ffi_type_Double.elements = ffi_type_Double_elements; + ffi_type* argtypes[] = { &ffi_type_Double, &ffi_type_float, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Double); + { + /*const*/ void* args[] = { &D1, &f2, &d3 }; + FFI_CALL(cif,D_Dfd,args,&Dr); + } + } + fprintf(out,"->{%g}\n",Dr.x); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 58 + Jr = J_JiJ(J1,i2,J2); + fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); + fflush(out); + Jr.l1 = Jr.l2 = 0; clear_traces(); + { + ffi_type* ffi_type_J_elements[] = { &ffi_type_slong, &ffi_type_slong, NULL }; + ffi_type ffi_type_J; + ffi_type_J.type = FFI_TYPE_STRUCT; + ffi_type_J.size = sizeof(J); + ffi_type_J.alignment = alignof_slot(J); + ffi_type_J.elements = ffi_type_J_elements; + ffi_type* argtypes[] = { &ffi_type_J, &ffi_type_sint, &ffi_type_J }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_J); + { + /*const*/ void* args[] = { &J1, &i2, &J2 }; + FFI_CALL(cif,J_JiJ,args,&Jr); + } + } + fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); + fflush(out); +#endif +#ifndef SKIP_EXTRA_STRUCTS +#if (!defined(DGTEST)) || DGTEST == 59 + Tr = T_TcT(T1,' ',T2); + fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); + fflush(out); + Tr.c[0] = Tr.c[1] = Tr.c[2] = 0; clear_traces(); + { + ffi_type* ffi_type_T_elements[] = { ??, NULL }; + ffi_type ffi_type_T; + ffi_type_T.type = FFI_TYPE_STRUCT; + ffi_type_T.size = sizeof(T); + ffi_type_T.alignment = alignof_slot(T); + ffi_type_T.elements = ffi_type_T_elements; + ffi_type* argtypes[] = { &ffi_type_T, &ffi_type_char, &ffi_type_T }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_T); + { + char space = ' '; + /*const*/ void* args[] = { &T1, &space, &T2 }; + FFI_CALL(cif,T_TcT,args,&Tr); + } + } + fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 60 + Xr = X_BcdB(B1,c2,d3,B2); + fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); + fflush(out); + Xr.c[0]=Xr.c1='\0'; clear_traces(); + { + ffi_type* ffi_type_X_elements[] = { ??, NULL }; + ffi_type ffi_type_X; + ffi_type_X.type = FFI_TYPE_STRUCT; + ffi_type_X.size = sizeof(X); + ffi_type_X.alignment = alignof_slot(X); + ffi_type_X.elements = ffi_type_X_elements; + ffi_type* argtypes[] = { &ffi_type_X, &ffi_type_char, &ffi_type_double, &ffi_type_X }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_X); + { + /*const*/ void* args[] = { &B1, &c2, &d3, &B2 }; + FFI_CALL(cif,X_BcdB,args,&Xr); + } + } + fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); + fflush(out); +#endif +#endif + + return; +} + +void + gpargs_boundary_tests (void) +{ + ffi_type* ffi_type_K_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; + ffi_type ffi_type_K; + ffi_type* ffi_type_L_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; + ffi_type ffi_type_L; + long lr; + long long llr; + float fr; + double dr; + + ffi_type_K.type = FFI_TYPE_STRUCT; + ffi_type_K.size = sizeof(K); + ffi_type_K.alignment = alignof_slot(K); + ffi_type_K.elements = ffi_type_K_elements; + + ffi_type_L.type = FFI_TYPE_STRUCT; + ffi_type_L.size = sizeof(L); + ffi_type_L.alignment = alignof_slot(L); + ffi_type_L.elements = ffi_type_L_elements; + +#if (!defined(DGTEST)) || DGTEST == 61 + lr = l_l0K(K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + { + /*const*/ void* args[] = { &K1, &l9 }; + FFI_CALL(cif,l_l0K,args,&lr); + } + } + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 62 + lr = l_l1K(l1,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + { + /*const*/ void* args[] = { &l1, &K1, &l9 }; + FFI_CALL(cif,l_l1K,args,&lr); + } + } + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 63 + lr = l_l2K(l1,l2,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + { + /*const*/ void* args[] = { &l1, &l2, &K1, &l9 }; + FFI_CALL(cif,l_l2K,args,&lr); + } + } + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 64 + lr = l_l3K(l1,l2,l3,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &K1, &l9 }; + FFI_CALL(cif,l_l3K,args,&lr); + } + } + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 65 + lr = l_l4K(l1,l2,l3,l4,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &K1, &l9 }; + FFI_CALL(cif,l_l4K,args,&lr); + } + } + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 66 + lr = l_l5K(l1,l2,l3,l4,l5,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &K1, &l9 }; + FFI_CALL(cif,l_l5K,args,&lr); + } + } + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 67 + lr = l_l6K(l1,l2,l3,l4,l5,l6,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &K1, &l9 }; + FFI_CALL(cif,l_l6K,args,&lr); + } + } + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 68 + fr = f_f17l3L(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,l6,l7,l8,L1); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + { + /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16, &f17, &l6, &l7, &l8, &L1 }; + FFI_CALL(cif,f_f17l3L,args,&fr); + } + } + fprintf(out,"->%g\n",fr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 69 + dr = d_d17l3L(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,l6,l7,l8,L1); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &d14, &d15, &d16, &d17, &l6, &l7, &l8, &L1 }; + FFI_CALL(cif,d_d17l3L,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 70 + llr = ll_l2ll(l1,l2,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + { + /*const*/ void* args[] = { &l1, &l2, &ll1, &l9 }; + FFI_CALL(cif,ll_l2ll,args,&llr); + } + } + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 71 + llr = ll_l3ll(l1,l2,l3,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &ll1, &l9 }; + FFI_CALL(cif,ll_l3ll,args,&llr); + } + } + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 72 + llr = ll_l4ll(l1,l2,l3,l4,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &ll1, &l9 }; + FFI_CALL(cif,ll_l4ll,args,&llr); + } + } + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 73 + llr = ll_l5ll(l1,l2,l3,l4,l5,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &ll1, &l9 }; + FFI_CALL(cif,ll_l5ll,args,&llr); + } + } + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 74 + llr = ll_l6ll(l1,l2,l3,l4,l5,l6,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &ll1, &l9 }; + FFI_CALL(cif,ll_l6ll,args,&llr); + } + } + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 75 + llr = ll_l7ll(l1,l2,l3,l4,l5,l6,l7,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &l7, &ll1, &l9 }; + FFI_CALL(cif,ll_l7ll,args,&llr); + } + } + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 76 + dr = d_l2d(l1,l2,d2,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &l1, &l2, &d2, &l9 }; + FFI_CALL(cif,d_l2d,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 77 + dr = d_l3d(l1,l2,l3,d2,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &d2, &l9 }; + FFI_CALL(cif,d_l3d,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 78 + dr = d_l4d(l1,l2,l3,l4,d2,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &d2, &l9 }; + FFI_CALL(cif,d_l4d,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 79 + dr = d_l5d(l1,l2,l3,l4,l5,d2,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &d2, &l9 }; + FFI_CALL(cif,d_l5d,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 80 + dr = d_l6d(l1,l2,l3,l4,l5,l6,d2,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &d2, &l9 }; + FFI_CALL(cif,d_l6d,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif +#if (!defined(DGTEST)) || DGTEST == 81 + dr = d_l7d(l1,l2,l3,l4,l5,l6,l7,d2,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + { + /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &l7, &d2, &l9 }; + FFI_CALL(cif,d_l7d,args,&dr); + } + } + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + return; +} + +int + main (void) +{ + ffi_type_char = (char)(-1) < 0 ? ffi_type_schar : ffi_type_uchar; + out = stdout; + + void_tests(); + int_tests(); + float_tests(); + double_tests(); + pointer_tests(); + mixed_number_tests(); + small_structure_return_tests(); + structure_tests(); + gpargs_boundary_tests(); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c new file mode 100644 index 000000000000..0b16799d868d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c @@ -0,0 +1,2885 @@ +/* + * Copyright 1993 Bill Triggs <Bill.Triggs@inrialpes.fr> + * Copyright 1995-2017 Bruno Haible <bruno@clisp.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* { dg-do run { xfail gccbug } } */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ffi.h> +#include "alignof.h" +#include <stdarg.h> + +/* libffi testsuite local changes -------------------------------- */ +#ifdef DGTEST +/* Redefine exit(1) as a test failure */ +#define exit(V) (void)((V) ? (abort(), 1) : exit(0)) +int count = 0; +char rbuf1[2048]; +char rbuf2[2048]; +int _fprintf(FILE *stream, const char *format, ...) +{ + va_list args; + va_start(args, format); + + switch (count++) + { + case 0: + case 1: + vsprintf(&rbuf1[strlen(rbuf1)], format, args); + break; + case 2: + printf("%s", rbuf1); + vsprintf(rbuf2, format, args); + break; + case 3: + vsprintf(&rbuf2[strlen(rbuf2)], format, args); + printf("%s", rbuf2); + if (strcmp (rbuf1, rbuf2)) abort(); + break; + } + + va_end(args); + + return 0; +} +#define fprintf _fprintf +#endif +/* --------------------------------------------------------------- */ + +#include "testcases.c" + +#ifndef ABI_NUM +#define ABI_NUM FFI_DEFAULT_ABI +#endif + +/* Definitions that ought to be part of libffi. */ +static ffi_type ffi_type_char; +#define ffi_type_slonglong ffi_type_sint64 +#define ffi_type_ulonglong ffi_type_uint64 + +/* libffi does not support arrays inside structs. */ +#define SKIP_EXTRA_STRUCTS + +#define FFI_PREP_CIF(cif,argtypes,rettype) \ + if (ffi_prep_cif(&(cif),ABI_NUM,sizeof(argtypes)/sizeof(argtypes[0]),&rettype,argtypes) != FFI_OK) abort() +#define FFI_PREP_CIF_NOARGS(cif,rettype) \ + if (ffi_prep_cif(&(cif),ABI_NUM,0,&rettype,NULL) != FFI_OK) abort() + +#if defined(__sparc__) && defined(__sun) && defined(__SUNPRO_C) /* SUNWspro cc */ +/* SunPRO cc miscompiles the simulator function for X_BcdB: d.i[1] is + * temporarily stored in %l2 and put onto the stack from %l2, but in between + * the copy of X has used %l2 as a counter without saving and restoring its + * value. + */ +#define SKIP_X +#endif +#if defined(__mipsn32__) && !defined(__GNUC__) +/* The X test crashes for an unknown reason. */ +#define SKIP_X +#endif + + +/* These functions simulate the behaviour of the functions defined in testcases.c. */ + +/* void tests */ +void v_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&v_v) { fprintf(out,"wrong data for v_v\n"); exit(1); } + fprintf(out,"void f(void):\n"); + fflush(out); +} + +/* int tests */ +void i_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&i_v) { fprintf(out,"wrong data for i_v\n"); exit(1); } + {int r=99; + fprintf(out,"int f(void):"); + fflush(out); + *(ffi_arg*)retp = r; +}} +void i_i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&i_i) { fprintf(out,"wrong data for i_i\n"); exit(1); } + int a = *(int*)(*args++); + int r=a+1; + fprintf(out,"int f(int):(%d)",a); + fflush(out); + *(ffi_arg*)retp = r; +} +void i_i2_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&i_i2) { fprintf(out,"wrong data for i_i2\n"); exit(1); } + {int a = *(int*)(*args++); + int b = *(int*)(*args++); + int r=a+b; + fprintf(out,"int f(2*int):(%d,%d)",a,b); + fflush(out); + *(ffi_arg*)retp = r; +}} +void i_i4_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&i_i4) { fprintf(out,"wrong data for i_i4\n"); exit(1); } + {int a = *(int*)(*args++); + int b = *(int*)(*args++); + int c = *(int*)(*args++); + int d = *(int*)(*args++); + int r=a+b+c+d; + fprintf(out,"int f(4*int):(%d,%d,%d,%d)",a,b,c,d); + fflush(out); + *(ffi_arg*)retp = r; +}} +void i_i8_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&i_i8) { fprintf(out,"wrong data for i_i8\n"); exit(1); } + {int a = *(int*)(*args++); + int b = *(int*)(*args++); + int c = *(int*)(*args++); + int d = *(int*)(*args++); + int e = *(int*)(*args++); + int f = *(int*)(*args++); + int g = *(int*)(*args++); + int h = *(int*)(*args++); + int r=a+b+c+d+e+f+g+h; + fprintf(out,"int f(8*int):(%d,%d,%d,%d,%d,%d,%d,%d)",a,b,c,d,e,f,g,h); + fflush(out); + *(ffi_arg*)retp = r; +}} +void i_i16_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&i_i16) { fprintf(out,"wrong data for i_i16\n"); exit(1); } + {int a = *(int*)(*args++); + int b = *(int*)(*args++); + int c = *(int*)(*args++); + int d = *(int*)(*args++); + int e = *(int*)(*args++); + int f = *(int*)(*args++); + int g = *(int*)(*args++); + int h = *(int*)(*args++); + int i = *(int*)(*args++); + int j = *(int*)(*args++); + int k = *(int*)(*args++); + int l = *(int*)(*args++); + int m = *(int*)(*args++); + int n = *(int*)(*args++); + int o = *(int*)(*args++); + int p = *(int*)(*args++); + int r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; + fprintf(out,"int f(16*int):(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)", + a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); + fflush(out); + *(ffi_arg*)retp = r; +}} + +/* float tests */ +void f_f_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f) { fprintf(out,"wrong data for f_f\n"); exit(1); } + {float a = *(float*)(*args++); + float r=a+1.0; + fprintf(out,"float f(float):(%g)",a); + fflush(out); + *(float*)retp = r; +}} +void f_f2_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f2) { fprintf(out,"wrong data for f_f2\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float r=a+b; + fprintf(out,"float f(2*float):(%g,%g)",a,b); + fflush(out); + *(float*)retp = r; +}} +void f_f4_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f4) { fprintf(out,"wrong data for f_f4\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + float r=a+b+c+d; + fprintf(out,"float f(4*float):(%g,%g,%g,%g)",a,b,c,d); + fflush(out); + *(float*)retp = r; +}} +void f_f8_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f8) { fprintf(out,"wrong data for f_f8\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + float e = *(float*)(*args++); + float f = *(float*)(*args++); + float g = *(float*)(*args++); + float h = *(float*)(*args++); + float r=a+b+c+d+e+f+g+h; + fprintf(out,"float f(8*float):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); + fflush(out); + *(float*)retp = r; +}} +void f_f16_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f16) { fprintf(out,"wrong data for f_f16\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + float e = *(float*)(*args++); + float f = *(float*)(*args++); + float g = *(float*)(*args++); + float h = *(float*)(*args++); + float i = *(float*)(*args++); + float j = *(float*)(*args++); + float k = *(float*)(*args++); + float l = *(float*)(*args++); + float m = *(float*)(*args++); + float n = *(float*)(*args++); + float o = *(float*)(*args++); + float p = *(float*)(*args++); + float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; + fprintf(out,"float f(16*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); + fflush(out); + *(float*)retp = r; +}} +void f_f24_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f24) { fprintf(out,"wrong data for f_f24\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + float e = *(float*)(*args++); + float f = *(float*)(*args++); + float g = *(float*)(*args++); + float h = *(float*)(*args++); + float i = *(float*)(*args++); + float j = *(float*)(*args++); + float k = *(float*)(*args++); + float l = *(float*)(*args++); + float m = *(float*)(*args++); + float n = *(float*)(*args++); + float o = *(float*)(*args++); + float p = *(float*)(*args++); + float q = *(float*)(*args++); + float s = *(float*)(*args++); + float t = *(float*)(*args++); + float u = *(float*)(*args++); + float v = *(float*)(*args++); + float w = *(float*)(*args++); + float x = *(float*)(*args++); + float y = *(float*)(*args++); + float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+v+w+x+y; + fprintf(out,"float f(24*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,v,w,x,y); + fflush(out); + *(float*)retp = r; +}} + +/* double tests */ +void d_d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d) { fprintf(out,"wrong data for d_d\n"); exit(1); } + {double a = *(double*)(*args++); + double r=a+1.0; + fprintf(out,"double f(double):(%g)",a); + fflush(out); + *(double*)retp = r; +}} +void d_d2_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d2) { fprintf(out,"wrong data for d_d2\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double r=a+b; + fprintf(out,"double f(2*double):(%g,%g)",a,b); + fflush(out); + *(double*)retp = r; +}} +void d_d4_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d4) { fprintf(out,"wrong data for d_d4\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + double r=a+b+c+d; + fprintf(out,"double f(4*double):(%g,%g,%g,%g)",a,b,c,d); + fflush(out); + *(double*)retp = r; +}} +void d_d8_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d8) { fprintf(out,"wrong data for d_d8\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + double e = *(double*)(*args++); + double f = *(double*)(*args++); + double g = *(double*)(*args++); + double h = *(double*)(*args++); + double r=a+b+c+d+e+f+g+h; + fprintf(out,"double f(8*double):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); + fflush(out); + *(double*)retp = r; +}} +void d_d16_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d16) { fprintf(out,"wrong data for d_d16\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + double e = *(double*)(*args++); + double f = *(double*)(*args++); + double g = *(double*)(*args++); + double h = *(double*)(*args++); + double i = *(double*)(*args++); + double j = *(double*)(*args++); + double k = *(double*)(*args++); + double l = *(double*)(*args++); + double m = *(double*)(*args++); + double n = *(double*)(*args++); + double o = *(double*)(*args++); + double p = *(double*)(*args++); + double r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; + fprintf(out,"double f(16*double):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); + fflush(out); + *(double*)retp = r; +}} + +/* pointer tests */ +void vp_vpdpcpsp_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&vp_vpdpcpsp) { fprintf(out,"wrong data for vp_vpdpcpsp\n"); exit(1); } + {void* a = *(void* *)(*args++); + double* b = *(double* *)(*args++); + char* c = *(char* *)(*args++); + Int* d = *(Int* *)(*args++); + void* ret = (char*)b + 1; + fprintf(out,"void* f(void*,double*,char*,Int*):(0x%p,0x%p,0x%p,0x%p)",a,b,c,d); + fflush(out); + *(void* *)retp = ret; +}} + +/* mixed number tests */ +void uc_ucsil_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&uc_ucsil) { fprintf(out,"wrong data for uc_ucsil\n"); exit(1); } + {uchar a = *(unsigned char *)(*args++); + ushort b = *(unsigned short *)(*args++); + uint c = *(unsigned int *)(*args++); + ulong d = *(unsigned long *)(*args++); + uchar r = (uchar)-1; + fprintf(out,"uchar f(uchar,ushort,uint,ulong):(%u,%u,%u,%lu)",a,b,c,d); + fflush(out); + *(ffi_arg *)retp = r; +}} +void d_iidd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_iidd) { fprintf(out,"wrong data for d_iidd\n"); exit(1); } + {int a = *(int*)(*args++); + int b = *(int*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + double r=a+b+c+d; + fprintf(out,"double f(int,int,double,double):(%d,%d,%g,%g)",a,b,c,d); + fflush(out); + *(double*)retp = r; +}} +void d_iiidi_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_iiidi) { fprintf(out,"wrong data for d_iiidi\n"); exit(1); } + {int a = *(int*)(*args++); + int b = *(int*)(*args++); + int c = *(int*)(*args++); + double d = *(double*)(*args++); + int e = *(int*)(*args++); + double r=a+b+c+d+e; + fprintf(out,"double f(int,int,int,double,int):(%d,%d,%d,%g,%d)",a,b,c,d,e); + fflush(out); + *(double*)retp = r; +}} +void d_idid_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_idid) { fprintf(out,"wrong data for d_idid\n"); exit(1); } + {int a = *(int*)(*args++); + double b = *(double*)(*args++); + int c = *(int*)(*args++); + double d = *(double*)(*args++); + double r=a+b+c+d; + fprintf(out,"double f(int,double,int,double):(%d,%g,%d,%g)",a,b,c,d); + fflush(out); + *(double*)retp = r; +}} +void d_fdi_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_fdi) { fprintf(out,"wrong data for d_fdi\n"); exit(1); } + {float a = *(float*)(*args++); + double b = *(double*)(*args++); + int c = *(int*)(*args++); + double r=a+b+c; + fprintf(out,"double f(float,double,int):(%g,%g,%d)",a,b,c); + fflush(out); + *(double*)retp = r; +}} +void us_cdcd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&us_cdcd) { fprintf(out,"wrong data for us_cdcd\n"); exit(1); } + {char a = *(char*)(*args++); + double b = *(double*)(*args++); + char c = *(char*)(*args++); + double d = *(double*)(*args++); + ushort r = (ushort)(a + b + c + d); + fprintf(out,"ushort f(char,double,char,double):('%c',%g,'%c',%g)",a,b,c,d); + fflush(out); + *(ffi_arg *)retp = r; +}} +void ll_iiilli_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&ll_iiilli) { fprintf(out,"wrong data for ll_iiilli\n"); exit(1); } + {int a = *(int*)(*args++); + int b = *(int*)(*args++); + int c = *(int*)(*args++); + long long d = *(long long *)(*args++); + int e = *(int*)(*args++); + long long r = (long long)(int)a + (long long)(int)b + (long long)(int)c + d + (long long)e; + fprintf(out,"long long f(int,int,int,long long,int):(%d,%d,%d,0x%lx%08lx,%d)",a,b,c,(long)(d>>32),(long)(d&0xffffffff),e); + fflush(out); + *(long long *)retp = r; +}} +void ll_flli_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&ll_flli) { fprintf(out,"wrong data for ll_flli\n"); exit(1); } + {float a = *(float*)(*args++); + long long b = *(long long *)(*args++); + int c = *(int*)(*args++); + long long r = (long long)(int)a + b + (long long)c; + fprintf(out,"long long f(float,long long,int):(%g,0x%lx%08lx,0x%lx)",a,(long)(b>>32),(long)(b&0xffffffff),(long)c); + fflush(out); + *(long long *)retp = r; +}} +void f_fi_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_fi) { fprintf(out,"wrong data for f_fi\n"); exit(1); } + {float a = *(float*)(*args++); + int z = *(int*)(*args++); + float r=a+z; + fprintf(out,"float f(float,int):(%g,%d)",a,z); + fflush(out); + *(float*)retp = r; +}} +void f_f2i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f2i) { fprintf(out,"wrong data for f_f2i\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + int z = *(int*)(*args++); + float r=a+b+z; + fprintf(out,"float f(2*float,int):(%g,%g,%d)",a,b,z); + fflush(out); + *(float*)retp = r; +}} +void f_f3i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f3i) { fprintf(out,"wrong data for f_f3i\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + int z = *(int*)(*args++); + float r=a+b+c+z; + fprintf(out,"float f(3*float,int):(%g,%g,%g,%d)",a,b,c,z); + fflush(out); + *(float*)retp = r; +}} +void f_f4i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f4i) { fprintf(out,"wrong data for f_f4i\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + int z = *(int*)(*args++); + float r=a+b+c+d+z; + fprintf(out,"float f(4*float,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); + fflush(out); + *(float*)retp = r; +}} +void f_f7i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f7i) { fprintf(out,"wrong data for f_f7i\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + float e = *(float*)(*args++); + float f = *(float*)(*args++); + float g = *(float*)(*args++); + int z = *(int*)(*args++); + float r=a+b+c+d+e+f+g+z; + fprintf(out,"float f(7*float,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); + fflush(out); + *(float*)retp = r; +}} +void f_f8i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f8i) { fprintf(out,"wrong data for f_f8i\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + float e = *(float*)(*args++); + float f = *(float*)(*args++); + float g = *(float*)(*args++); + float h = *(float*)(*args++); + int z = *(int*)(*args++); + float r=a+b+c+d+e+f+g+h+z; + fprintf(out,"float f(8*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); + fflush(out); + *(float*)retp = r; +}} +void f_f12i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f12i) { fprintf(out,"wrong data for f_f12i\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + float e = *(float*)(*args++); + float f = *(float*)(*args++); + float g = *(float*)(*args++); + float h = *(float*)(*args++); + float i = *(float*)(*args++); + float j = *(float*)(*args++); + float k = *(float*)(*args++); + float l = *(float*)(*args++); + int z = *(int*)(*args++); + float r=a+b+c+d+e+f+g+h+i+j+k+l+z; + fprintf(out,"float f(12*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); + fflush(out); + *(float*)retp = r; +}} +void f_f13i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f13i) { fprintf(out,"wrong data for f_f13i\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + float e = *(float*)(*args++); + float f = *(float*)(*args++); + float g = *(float*)(*args++); + float h = *(float*)(*args++); + float i = *(float*)(*args++); + float j = *(float*)(*args++); + float k = *(float*)(*args++); + float l = *(float*)(*args++); + float m = *(float*)(*args++); + int z = *(int*)(*args++); + float r=a+b+c+d+e+f+g+h+i+j+k+l+m+z; + fprintf(out,"float f(13*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); + fflush(out); + *(float*)retp = r; +}} +void d_di_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_di) { fprintf(out,"wrong data for d_di\n"); exit(1); } + {double a = *(double*)(*args++); + int z = *(int*)(*args++); + double r=a+z; + fprintf(out,"double f(double,int):(%g,%d)",a,z); + fflush(out); + *(double*)retp = r; +}} +void d_d2i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d2i) { fprintf(out,"wrong data for d_d2i\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + int z = *(int*)(*args++); + double r=a+b+z; + fprintf(out,"double f(2*double,int):(%g,%g,%d)",a,b,z); + fflush(out); + *(double*)retp = r; +}} +void d_d3i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d3i) { fprintf(out,"wrong data for d_d3i\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + int z = *(int*)(*args++); + double r=a+b+c+z; + fprintf(out,"double f(3*double,int):(%g,%g,%g,%d)",a,b,c,z); + fflush(out); + *(double*)retp = r; +}} +void d_d4i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d4i) { fprintf(out,"wrong data for d_d4i\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + int z = *(int*)(*args++); + double r=a+b+c+d+z; + fprintf(out,"double f(4*double,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); + fflush(out); + *(double*)retp = r; +}} +void d_d7i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d7i) { fprintf(out,"wrong data for d_d7i\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + double e = *(double*)(*args++); + double f = *(double*)(*args++); + double g = *(double*)(*args++); + int z = *(int*)(*args++); + double r=a+b+c+d+e+f+g+z; + fprintf(out,"double f(7*double,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); + fflush(out); + *(double*)retp = r; +}} +void d_d8i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d8i) { fprintf(out,"wrong data for d_d8i\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + double e = *(double*)(*args++); + double f = *(double*)(*args++); + double g = *(double*)(*args++); + double h = *(double*)(*args++); + int z = *(int*)(*args++); + double r=a+b+c+d+e+f+g+h+z; + fprintf(out,"double f(8*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); + fflush(out); + *(double*)retp = r; +}} +void d_d12i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d12i) { fprintf(out,"wrong data for d_d12i\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + double e = *(double*)(*args++); + double f = *(double*)(*args++); + double g = *(double*)(*args++); + double h = *(double*)(*args++); + double i = *(double*)(*args++); + double j = *(double*)(*args++); + double k = *(double*)(*args++); + double l = *(double*)(*args++); + int z = *(int*)(*args++); + double r=a+b+c+d+e+f+g+h+i+j+k+l+z; + fprintf(out,"double f(12*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); + fflush(out); + *(double*)retp = r; +}} +void d_d13i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d13i) { fprintf(out,"wrong data for d_d13i\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + double e = *(double*)(*args++); + double f = *(double*)(*args++); + double g = *(double*)(*args++); + double h = *(double*)(*args++); + double i = *(double*)(*args++); + double j = *(double*)(*args++); + double k = *(double*)(*args++); + double l = *(double*)(*args++); + double m = *(double*)(*args++); + int z = *(int*)(*args++); + double r=a+b+c+d+e+f+g+h+i+j+k+l+m+z; + fprintf(out,"double f(13*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); + fflush(out); + *(double*)retp = r; +}} + +/* small structure return tests */ +void S1_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&S1_v) { fprintf(out,"wrong data for S1_v\n"); exit(1); } + {Size1 r = Size1_1; + fprintf(out,"Size1 f(void):"); + fflush(out); + *(Size1*)retp = r; +}} +void S2_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&S2_v) { fprintf(out,"wrong data for S2_v\n"); exit(1); } + {Size2 r = Size2_1; + fprintf(out,"Size2 f(void):"); + fflush(out); + *(Size2*)retp = r; +}} +void S3_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&S3_v) { fprintf(out,"wrong data for S3_v\n"); exit(1); } + {Size3 r = Size3_1; + fprintf(out,"Size3 f(void):"); + fflush(out); + *(Size3*)retp = r; +}} +void S4_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&S4_v) { fprintf(out,"wrong data for S4_v\n"); exit(1); } + {Size4 r = Size4_1; + fprintf(out,"Size4 f(void):"); + fflush(out); + *(Size4*)retp = r; +}} +void S7_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&S7_v) { fprintf(out,"wrong data for S7_v\n"); exit(1); } + {Size7 r = Size7_1; + fprintf(out,"Size7 f(void):"); + fflush(out); + *(Size7*)retp = r; +}} +void S8_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&S8_v) { fprintf(out,"wrong data for S8_v\n"); exit(1); } + {Size8 r = Size8_1; + fprintf(out,"Size8 f(void):"); + fflush(out); + *(Size8*)retp = r; +}} +void S12_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&S12_v) { fprintf(out,"wrong data for S12_v\n"); exit(1); } + {Size12 r = Size12_1; + fprintf(out,"Size12 f(void):"); + fflush(out); + *(Size12*)retp = r; +}} +void S15_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&S15_v) { fprintf(out,"wrong data for S15_v\n"); exit(1); } + {Size15 r = Size15_1; + fprintf(out,"Size15 f(void):"); + fflush(out); + *(Size15*)retp = r; +}} +void S16_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&S16_v) { fprintf(out,"wrong data for S16_v\n"); exit(1); } + {Size16 r = Size16_1; + fprintf(out,"Size16 f(void):"); + fflush(out); + *(Size16*)retp = r; +}} + +/* structure tests */ +void I_III_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&I_III) { fprintf(out,"wrong data for I_III\n"); exit(1); } + {Int a = *(Int*)(*args++); + Int b = *(Int*)(*args++); + Int c = *(Int*)(*args++); + Int r; + r.x = a.x + b.x + c.x; + fprintf(out,"Int f(Int,Int,Int):({%d},{%d},{%d})",a.x,b.x,c.x); + fflush(out); + *(Int*)retp = r; +}} +void C_CdC_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&C_CdC) { fprintf(out,"wrong data for C_CdC\n"); exit(1); } + {Char a = *(Char*)(*args++); + double b = *(double*)(*args++); + Char c = *(Char*)(*args++); + Char r; + r.x = (a.x + c.x)/2; + fprintf(out,"Char f(Char,double,Char):({'%c'},%g,{'%c'})",a.x,b,c.x); + fflush(out); + *(Char*)retp = r; +}} +void F_Ffd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&F_Ffd) { fprintf(out,"wrong data for F_Ffd\n"); exit(1); } + {Float a = *(Float*)(*args++); + float b = *(float*)(*args++); + double c = *(double*)(*args++); + Float r; + r.x = a.x + b + c; + fprintf(out,"Float f(Float,float,double):({%g},%g,%g)",a.x,b,c); + fflush(out); + *(Float*)retp = r; +}} +void D_fDd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&D_fDd) { fprintf(out,"wrong data for D_fDd\n"); exit(1); } + {float a = *(float*)(*args++); + Double b = *(Double*)(*args++); + double c = *(double*)(*args++); + Double r; + r.x = a + b.x + c; + fprintf(out,"Double f(float,Double,double):(%g,{%g},%g)",a,b.x,c); + fflush(out); + *(Double*)retp = r; +}} +void D_Dfd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&D_Dfd) { fprintf(out,"wrong data for D_Dfd\n"); exit(1); } + {Double a = *(Double*)(*args++); + float b = *(float*)(*args++); + double c = *(double*)(*args++); + Double r; + r.x = a.x + b + c; + fprintf(out,"Double f(Double,float,double):({%g},%g,%g)",a.x,b,c); + fflush(out); + *(Double*)retp = r; +}} +void J_JiJ_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&J_JiJ) { fprintf(out,"wrong data for J_JiJ\n"); exit(1); } + {J a = *(J*)(*args++); + int b= *(int*)(*args++); + J c = *(J*)(*args++); + J r; + r.l1 = a.l1+c.l1; r.l2 = a.l2+b+c.l2; + fprintf(out,"J f(J,int,J):({%ld,%ld},%d,{%ld,%ld})",a.l1,a.l2,b,c.l1,c.l2); + fflush(out); + *(J*)retp = r; +}} +#ifndef SKIP_EXTRA_STRUCTS +void T_TcT_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&T_TcT) { fprintf(out,"wrong data for T_TcT\n"); exit(1); } + {T a = *(T*)(*args++); + char b = *(char*)(*args++); + T c = *(T*)(*args++); + T r; + r.c[0]='b'; r.c[1]=c.c[1]; r.c[2]=c.c[2]; + fprintf(out,"T f(T,char,T):({\"%c%c%c\"},'%c',{\"%c%c%c\"})",a.c[0],a.c[1],a.c[2],b,c.c[0],c.c[1],c.c[2]); + fflush(out); + *(T*)retp = r; +}} +void X_BcdB_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&X_BcdB) { fprintf(out,"wrong data for X_BcdB\n"); exit(1); } + {B a = *(B*)(*args++); + char b = *(char*)(*args++); + double c = *(double*)(*args++); + B d = *(B*)(*args++); + static X xr={"return val",'R'}; + X r; + r = xr; + r.c1 = b; + fprintf(out,"X f(B,char,double,B):({%g,{%d,%d,%d}},'%c',%g,{%g,{%d,%d,%d}})", + a.d,a.i[0],a.i[1],a.i[2],b,c,d.d,d.i[0],d.i[1],d.i[2]); + fflush(out); + *(X*)retp = r; +}} +#endif + +/* gpargs boundary tests */ +void l_l0K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&l_l0K) { fprintf(out,"wrong data for l_l0K\n"); exit(1); } + {K b = *(K*)(*args++); + long c = *(long*)(*args++); + long r = b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(K,long):(%ld,%ld,%ld,%ld,%ld)",b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + *(ffi_arg*)retp = r; +}} +void l_l1K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&l_l1K) { fprintf(out,"wrong data for l_l1K\n"); exit(1); } + {long a1 = *(long*)(*args++); + K b = *(K*)(*args++); + long c = *(long*)(*args++); + long r = a1 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld)",a1,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + *(ffi_arg*)retp = r; +}} +void l_l2K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&l_l2K) { fprintf(out,"wrong data for l_l2K\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + K b = *(K*)(*args++); + long c = *(long*)(*args++); + long r = a1 + a2 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(2*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + *(ffi_arg*)retp = r; +}} +void l_l3K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&l_l3K) { fprintf(out,"wrong data for l_l3K\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + K b = *(K*)(*args++); + long c = *(long*)(*args++); + long r = a1 + a2 + a3 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(3*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + *(ffi_arg*)retp = r; +}} +void l_l4K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&l_l4K) { fprintf(out,"wrong data for l_l4K\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + K b = *(K*)(*args++); + long c = *(long*)(*args++); + long r = a1 + a2 + a3 + a4 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(4*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + *(ffi_arg*)retp = r; +}} +void l_l5K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&l_l5K) { fprintf(out,"wrong data for l_l5K\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + long a5 = *(long*)(*args++); + K b = *(K*)(*args++); + long c = *(long*)(*args++); + long r = a1 + a2 + a3 + a4 + a5 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(5*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + *(ffi_arg*)retp = r; +}} +void l_l6K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&l_l6K) { fprintf(out,"wrong data for l_l6K\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + long a5 = *(long*)(*args++); + long a6 = *(long*)(*args++); + K b = *(K*)(*args++); + long c = *(long*)(*args++); + long r = a1 + a2 + a3 + a4 + a5 + a6 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(6*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,a6,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + *(ffi_arg*)retp = r; +}} +void f_f17l3L_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&f_f17l3L) { fprintf(out,"wrong data for f_f17l3L\n"); exit(1); } + {float a = *(float*)(*args++); + float b = *(float*)(*args++); + float c = *(float*)(*args++); + float d = *(float*)(*args++); + float e = *(float*)(*args++); + float f = *(float*)(*args++); + float g = *(float*)(*args++); + float h = *(float*)(*args++); + float i = *(float*)(*args++); + float j = *(float*)(*args++); + float k = *(float*)(*args++); + float l = *(float*)(*args++); + float m = *(float*)(*args++); + float n = *(float*)(*args++); + float o = *(float*)(*args++); + float p = *(float*)(*args++); + float q = *(float*)(*args++); + long s = *(long*)(*args++); + long t = *(long*)(*args++); + long u = *(long*)(*args++); + L z = *(L*)(*args++); + float r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; + fprintf(out,"float f(17*float,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); + fflush(out); + *(float*)retp = r; +}} +void d_d17l3L_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_d17l3L) { fprintf(out,"wrong data for d_d17l3L\n"); exit(1); } + {double a = *(double*)(*args++); + double b = *(double*)(*args++); + double c = *(double*)(*args++); + double d = *(double*)(*args++); + double e = *(double*)(*args++); + double f = *(double*)(*args++); + double g = *(double*)(*args++); + double h = *(double*)(*args++); + double i = *(double*)(*args++); + double j = *(double*)(*args++); + double k = *(double*)(*args++); + double l = *(double*)(*args++); + double m = *(double*)(*args++); + double n = *(double*)(*args++); + double o = *(double*)(*args++); + double p = *(double*)(*args++); + double q = *(double*)(*args++); + long s = *(long*)(*args++); + long t = *(long*)(*args++); + long u = *(long*)(*args++); + L z = *(L*)(*args++); + double r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; + fprintf(out,"double f(17*double,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); + fflush(out); + *(double*)retp = r; +}} +void ll_l2ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&ll_l2ll) { fprintf(out,"wrong data for ll_l2ll\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long long b = *(long long *)(*args++); + long c = *(long*)(*args++); + long long r = (long long) (a1 + a2) + b + c; + fprintf(out,"long long f(2*long,long long,long):(%ld,%ld,0x%lx%08lx,%ld)",a1,a2,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + *(long long *)retp = r; +}} +void ll_l3ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&ll_l3ll) { fprintf(out,"wrong data for ll_l3ll\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long long b = *(long long *)(*args++); + long c = *(long*)(*args++); + long long r = (long long) (a1 + a2 + a3) + b + c; + fprintf(out,"long long f(3*long,long long,long):(%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + *(long long *)retp = r; +}} +void ll_l4ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&ll_l4ll) { fprintf(out,"wrong data for ll_l4ll\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + long long b = *(long long *)(*args++); + long c = *(long*)(*args++); + long long r = (long long) (a1 + a2 + a3 + a4) + b + c; + fprintf(out,"long long f(4*long,long long,long):(%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + *(long long *)retp = r; +}} +void ll_l5ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&ll_l5ll) { fprintf(out,"wrong data for ll_l5ll\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + long a5 = *(long*)(*args++); + long long b = *(long long *)(*args++); + long c = *(long*)(*args++); + long long r = (long long) (a1 + a2 + a3 + a4 + a5) + b + c; + fprintf(out,"long long f(5*long,long long,long):(%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + *(long long *)retp = r; +}} +void ll_l6ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&ll_l6ll) { fprintf(out,"wrong data for ll_l6ll\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + long a5 = *(long*)(*args++); + long a6 = *(long*)(*args++); + long long b = *(long long *)(*args++); + long c = *(long*)(*args++); + long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; + fprintf(out,"long long f(6*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + *(long long *)retp = r; +}} +void ll_l7ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&ll_l7ll) { fprintf(out,"wrong data for ll_l7ll\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + long a5 = *(long*)(*args++); + long a6 = *(long*)(*args++); + long a7 = *(long*)(*args++); + long long b = *(long long *)(*args++); + long c = *(long*)(*args++); + long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; + fprintf(out,"long long f(7*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,a7,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + *(long long *)retp = r; +}} +void d_l2d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_l2d) { fprintf(out,"wrong data for d_l2d\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + double b = *(double*)(*args++); + long c = *(long*)(*args++); + double r = (double) (a1 + a2) + b + c; + fprintf(out,"double f(2*long,double,long):(%ld,%ld,%g,%ld)",a1,a2,b,c); + fflush(out); + *(double*)retp = r; +}} +void d_l3d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_l3d) { fprintf(out,"wrong data for d_l3d\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + double b = *(double*)(*args++); + long c = *(long*)(*args++); + double r = (double) (a1 + a2 + a3) + b + c; + fprintf(out,"double f(3*long,double,long):(%ld,%ld,%ld,%g,%ld)",a1,a2,a3,b,c); + fflush(out); + *(double*)retp = r; +}} +void d_l4d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_l4d) { fprintf(out,"wrong data for d_l4d\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + double b = *(double*)(*args++); + long c = *(long*)(*args++); + double r = (double) (a1 + a2 + a3 + a4) + b + c; + fprintf(out,"double f(4*long,double,long):(%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,b,c); + fflush(out); + *(double*)retp = r; +}} +void d_l5d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_l5d) { fprintf(out,"wrong data for d_l5d\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + long a5 = *(long*)(*args++); + double b = *(double*)(*args++); + long c = *(long*)(*args++); + double r = (double) (a1 + a2 + a3 + a4 + a5) + b + c; + fprintf(out,"double f(5*long,double,long):(%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,b,c); + fflush(out); + *(double*)retp = r; +}} +void d_l6d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_l6d) { fprintf(out,"wrong data for d_l6d\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + long a5 = *(long*)(*args++); + long a6 = *(long*)(*args++); + double b = *(double*)(*args++); + long c = *(long*)(*args++); + double r = (double) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; + fprintf(out,"double f(6*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,b,c); + fflush(out); + *(double*)retp = r; +}} +void d_l7d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) +{ + if (data != (void*)&d_l7d) { fprintf(out,"wrong data for d_l7d\n"); exit(1); } + {long a1 = *(long*)(*args++); + long a2 = *(long*)(*args++); + long a3 = *(long*)(*args++); + long a4 = *(long*)(*args++); + long a5 = *(long*)(*args++); + long a6 = *(long*)(*args++); + long a7 = *(long*)(*args++); + double b = *(double*)(*args++); + long c = *(long*)(*args++); + double r = (double) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; + fprintf(out,"double f(7*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,a7,b,c); + fflush(out); + *(double*)retp = r; +}} + + +/* + * The way we run these tests - first call the function directly, then + * through vacall() - there is the danger that arguments or results seem + * to be passed correctly, but what we are seeing are in fact the vestiges + * (traces) or the previous call. This may seriously fake the test. + * Avoid this by clearing the registers between the first and the second call. + */ +long clear_traces_i (long a, long b, long c, long d, long e, long f, long g, long h, + long i, long j, long k, long l, long m, long n, long o, long p) +{ return 0; } +float clear_traces_f (float a, float b, float c, float d, float e, float f, float g, + float h, float i, float j, float k, float l, float m, float n, + float o, float p) +{ return 0.0; } +double clear_traces_d (double a, double b, double c, double d, double e, double f, double g, + double h, double i, double j, double k, double l, double m, double n, + double o, double p) +{ return 0.0; } +J clear_traces_J (void) +{ J j; j.l1 = j.l2 = 0; return j; } +void clear_traces (void) +{ clear_traces_i(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); + clear_traces_f(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); + clear_traces_d(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); + clear_traces_J(); +} + +int main (void) +{ + void* callback_code; + void* callback_writable; +#define ALLOC_CALLBACK() \ + callback_writable = ffi_closure_alloc(sizeof(ffi_closure),&callback_code); \ + if (!callback_writable) abort() +#define PREP_CALLBACK(cif,simulator,data) \ + if (ffi_prep_closure_loc(callback_writable,&(cif),simulator,data,callback_code) != FFI_OK) abort() +#define FREE_CALLBACK() \ + ffi_closure_free(callback_writable) + + ffi_type_char = (char)(-1) < 0 ? ffi_type_schar : ffi_type_uchar; + out = stdout; + +#if (!defined(DGTEST)) || DGTEST == 1 + /* void tests */ + v_v(); + clear_traces(); + ALLOC_CALLBACK(); + { + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_void); + PREP_CALLBACK(cif,v_v_simulator,(void*)&v_v); + ((void (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); +#endif + + /* int tests */ + { int ir; + +#if (!defined(DGTEST)) || DGTEST == 2 + ir = i_v(); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_sint); + PREP_CALLBACK(cif,i_v_simulator,(void*)&i_v); + ir = ((int (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 3 + ir = i_i(i1); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + PREP_CALLBACK(cif,i_i_simulator,(void*)&i_i); + ir = ((int (ABI_ATTR *) (int)) callback_code) (i1); + } + FREE_CALLBACK(); + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 4 + ir = i_i2(i1,i2); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + PREP_CALLBACK(cif,i_i2_simulator,(void*)&i_i2); + ir = ((int (ABI_ATTR *) (int,int)) callback_code) (i1,i2); + } + FREE_CALLBACK(); + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 5 + ir = i_i4(i1,i2,i3,i4); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + PREP_CALLBACK(cif,i_i4_simulator,(void*)&i_i4); + ir = ((int (ABI_ATTR *) (int,int,int,int)) callback_code) (i1,i2,i3,i4); + } + FREE_CALLBACK(); + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 6 + ir = i_i8(i1,i2,i3,i4,i5,i6,i7,i8); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + PREP_CALLBACK(cif,i_i8_simulator,(void*)&i_i8); + ir = ((int (ABI_ATTR *) (int,int,int,int,int,int,int,int)) callback_code) (i1,i2,i3,i4,i5,i6,i7,i8); + } + FREE_CALLBACK(); + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 7 + ir = i_i16(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16); + fprintf(out,"->%d\n",ir); + fflush(out); + ir = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_sint); + PREP_CALLBACK(cif,i_i16_simulator,(void*)&i_i16); + ir = ((int (ABI_ATTR *) (int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int)) callback_code) (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16); + } + FREE_CALLBACK(); + fprintf(out,"->%d\n",ir); + fflush(out); +#endif + } + + /* float tests */ + { float fr; + +#if (!defined(DGTEST)) || DGTEST == 8 + fr = f_f(f1); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f_simulator,(void*)&f_f); + fr = ((float (ABI_ATTR *) (float)) callback_code) (f1); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 9 + fr = f_f2(f1,f2); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f2_simulator,(void*)&f_f2); + fr = ((float (ABI_ATTR *) (float,float)) callback_code) (f1,f2); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 10 + fr = f_f4(f1,f2,f3,f4); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f4_simulator,(void*)&f_f4); + fr = ((float (ABI_ATTR *) (float,float,float,float)) callback_code) (f1,f2,f3,f4); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 11 + fr = f_f8(f1,f2,f3,f4,f5,f6,f7,f8); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f8_simulator,(void*)&f_f8); + fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 12 + fr = f_f16(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f16_simulator,(void*)&f_f16); + fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 13 + fr = f_f24(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f24_simulator,(void*)&f_f24); + fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + + } + + /* double tests */ + { double dr; + +#if (!defined(DGTEST)) || DGTEST == 14 + dr = d_d(d1); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d_simulator,(void*)&d_d); + dr = ((double (ABI_ATTR *) (double)) callback_code) (d1); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 15 + dr = d_d2(d1,d2); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d2_simulator,(void*)&d_d2); + dr = ((double (ABI_ATTR *) (double,double)) callback_code) (d1,d2); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 16 + dr = d_d4(d1,d2,d3,d4); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d4_simulator,(void*)&d_d4); + dr = ((double (ABI_ATTR *) (double,double,double,double)) callback_code) (d1,d2,d3,d4); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 17 + dr = d_d8(d1,d2,d3,d4,d5,d6,d7,d8); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d8_simulator,(void*)&d_d8); + dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 18 + dr = d_d16(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d16_simulator,(void*)&d_d16); + dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + } + + /* pointer tests */ + { void* vpr; + +#if (!defined(DGTEST)) || DGTEST == 19 + vpr = vp_vpdpcpsp(&uc1,&d2,str3,&I4); + fprintf(out,"->0x%p\n",vpr); + fflush(out); + vpr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_pointer); + PREP_CALLBACK(cif,vp_vpdpcpsp_simulator,(void*)&vp_vpdpcpsp); + vpr = ((void* (ABI_ATTR *) (void*,double*,char*,Int*)) callback_code) (&uc1,&d2,str3,&I4); + } + FREE_CALLBACK(); + fprintf(out,"->0x%p\n",vpr); + fflush(out); +#endif + } + + /* mixed number tests */ + { uchar ucr; + ushort usr; + float fr; + double dr; + long long llr; + +#if (!defined(DGTEST)) || DGTEST == 20 + ucr = uc_ucsil(uc1,us2,ui3,ul4); + fprintf(out,"->%u\n",ucr); + fflush(out); + ucr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_uchar, &ffi_type_ushort, &ffi_type_uint, &ffi_type_ulong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_uchar); + PREP_CALLBACK(cif,uc_ucsil_simulator,(void*)&uc_ucsil); + ucr = ((uchar (ABI_ATTR *) (uchar,ushort,uint,ulong)) callback_code) (uc1,us2,ui3,ul4); + } + FREE_CALLBACK(); + fprintf(out,"->%u\n",ucr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 21 + dr = d_iidd(i1,i2,d3,d4); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_iidd_simulator,(void*)&d_iidd); + dr = ((double (ABI_ATTR *) (int,int,double,double)) callback_code) (i1,i2,d3,d4); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 22 + dr = d_iiidi(i1,i2,i3,d4,i5); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_iiidi_simulator,(void*)&d_iiidi); + dr = ((double (ABI_ATTR *) (int,int,int,double,int)) callback_code) (i1,i2,i3,d4,i5); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 23 + dr = d_idid(i1,d2,i3,d4); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_double, &ffi_type_sint, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_idid_simulator,(void*)&d_idid); + dr = ((double (ABI_ATTR *) (int,double,int,double)) callback_code) (i1,d2,i3,d4); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 24 + dr = d_fdi(f1,d2,i3); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_fdi_simulator,(void*)&d_fdi); + dr = ((double (ABI_ATTR *) (float,double,int)) callback_code) (f1,d2,i3); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 25 + usr = us_cdcd(c1,d2,c3,d4); + fprintf(out,"->%u\n",usr); + fflush(out); + usr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_char, &ffi_type_double, &ffi_type_char, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_ushort); + PREP_CALLBACK(cif,us_cdcd_simulator,(void*)&us_cdcd); + usr = ((ushort (ABI_ATTR *) (char,double,char,double)) callback_code) (c1,d2,c3,d4); + } + FREE_CALLBACK(); + fprintf(out,"->%u\n",usr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 26 + llr = ll_iiilli(i1,i2,i3,ll1,i13); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_slonglong, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + PREP_CALLBACK(cif,ll_iiilli_simulator,(void*)&ll_iiilli); + llr = ((long long (ABI_ATTR *) (int,int,int,long long,int)) callback_code) (i1,i2,i3,ll1,i13); + } + FREE_CALLBACK(); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 27 + llr = ll_flli(f13,ll1,i13); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_slonglong, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + PREP_CALLBACK(cif,ll_flli_simulator,(void*)&ll_flli); + llr = ((long long (ABI_ATTR *) (float,long long,int)) callback_code) (f13,ll1,i13); + } + FREE_CALLBACK(); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 28 + fr = f_fi(f1,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_fi_simulator,(void*)&f_fi); + fr = ((float (ABI_ATTR *) (float,int)) callback_code) (f1,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 29 + fr = f_f2i(f1,f2,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f2i_simulator,(void*)&f_f2i); + fr = ((float (ABI_ATTR *) (float,float,int)) callback_code) (f1,f2,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 30 + fr = f_f3i(f1,f2,f3,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f3i_simulator,(void*)&f_f3i); + fr = ((float (ABI_ATTR *) (float,float,float,int)) callback_code) (f1,f2,f3,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 31 + fr = f_f4i(f1,f2,f3,f4,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f4i_simulator,(void*)&f_f4i); + fr = ((float (ABI_ATTR *) (float,float,float,float,int)) callback_code) (f1,f2,f3,f4,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 32 + fr = f_f7i(f1,f2,f3,f4,f5,f6,f7,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f7i_simulator,(void*)&f_f7i); + fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,int)) callback_code) (f1,f2,f3,f4,f5,f6,f7,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 33 + fr = f_f8i(f1,f2,f3,f4,f5,f6,f7,f8,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f8i_simulator,(void*)&f_f8i); + fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,int)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 34 + fr = f_f13i(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,i9); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f13i_simulator,(void*)&f_f13i); + fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,int)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 35 + dr = d_di(d1,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_di_simulator,(void*)&d_di); + dr = ((double (ABI_ATTR *) (double,int)) callback_code) (d1,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 36 + dr = d_d2i(d1,d2,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d2i_simulator,(void*)&d_d2i); + dr = ((double (ABI_ATTR *) (double,double,int)) callback_code) (d1,d2,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 37 + dr = d_d3i(d1,d2,d3,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d3i_simulator,(void*)&d_d3i); + dr = ((double (ABI_ATTR *) (double,double,double,int)) callback_code) (d1,d2,d3,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 38 + dr = d_d4i(d1,d2,d3,d4,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d4i_simulator,(void*)&d_d4i); + dr = ((double (ABI_ATTR *) (double,double,double,double,int)) callback_code) (d1,d2,d3,d4,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 39 + dr = d_d7i(d1,d2,d3,d4,d5,d6,d7,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d7i_simulator,(void*)&d_d7i); + dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 40 + dr = d_d8i(d1,d2,d3,d4,d5,d6,d7,d8,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d8i_simulator,(void*)&d_d8i); + dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 41 + dr = d_d12i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d12i_simulator,(void*)&d_d12i); + dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 42 + dr = d_d13i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,i9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d13i_simulator,(void*)&d_d13i); + dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,i9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + } + + /* small structure return tests */ +#if (!defined(DGTEST)) || DGTEST == 43 + { + Size1 r = S1_v(); + fprintf(out,"->{%c}\n",r.x1); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Size1_elements[] = { &ffi_type_char, NULL }; + ffi_type ffi_type_Size1; + ffi_type_Size1.type = FFI_TYPE_STRUCT; + ffi_type_Size1.size = sizeof(Size1); + ffi_type_Size1.alignment = alignof_slot(Size1); + ffi_type_Size1.elements = ffi_type_Size1_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size1); + PREP_CALLBACK(cif,S1_v_simulator,(void*)&S1_v); + r = ((Size1 (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->{%c}\n",r.x1); + fflush(out); + } +#endif + +#if (!defined(DGTEST)) || DGTEST == 44 + { + Size2 r = S2_v(); + fprintf(out,"->{%c%c}\n",r.x1,r.x2); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Size2_elements[] = { &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size2; + ffi_type_Size2.type = FFI_TYPE_STRUCT; + ffi_type_Size2.size = sizeof(Size2); + ffi_type_Size2.alignment = alignof_slot(Size2); + ffi_type_Size2.elements = ffi_type_Size2_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size2); + PREP_CALLBACK(cif,S2_v_simulator,(void*)&S2_v); + r = ((Size2 (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->{%c%c}\n",r.x1,r.x2); + fflush(out); + } +#endif + +#if (!defined(DGTEST)) || DGTEST == 45 + { + Size3 r = S3_v(); + fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Size3_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size3; + ffi_type_Size3.type = FFI_TYPE_STRUCT; + ffi_type_Size3.size = sizeof(Size3); + ffi_type_Size3.alignment = alignof_slot(Size3); + ffi_type_Size3.elements = ffi_type_Size3_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size3); + PREP_CALLBACK(cif,S3_v_simulator,(void*)&S3_v); + r = ((Size3 (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); + fflush(out); + } +#endif + +#if (!defined(DGTEST)) || DGTEST == 46 + { + Size4 r = S4_v(); + fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Size4_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size4; + ffi_type_Size4.type = FFI_TYPE_STRUCT; + ffi_type_Size4.size = sizeof(Size4); + ffi_type_Size4.alignment = alignof_slot(Size4); + ffi_type_Size4.elements = ffi_type_Size4_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size4); + PREP_CALLBACK(cif,S4_v_simulator,(void*)&S4_v); + r = ((Size4 (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); + fflush(out); + } +#endif + +#if (!defined(DGTEST)) || DGTEST == 47 + { + Size7 r = S7_v(); + fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Size7_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size7; + ffi_type_Size7.type = FFI_TYPE_STRUCT; + ffi_type_Size7.size = sizeof(Size7); + ffi_type_Size7.alignment = alignof_slot(Size7); + ffi_type_Size7.elements = ffi_type_Size7_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size7); + PREP_CALLBACK(cif,S7_v_simulator,(void*)&S7_v); + r = ((Size7 (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); + fflush(out); + } +#endif + +#if (!defined(DGTEST)) || DGTEST == 48 + { + Size8 r = S8_v(); + fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Size8_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size8; + ffi_type_Size8.type = FFI_TYPE_STRUCT; + ffi_type_Size8.size = sizeof(Size8); + ffi_type_Size8.alignment = alignof_slot(Size8); + ffi_type_Size8.elements = ffi_type_Size8_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size8); + PREP_CALLBACK(cif,S8_v_simulator,(void*)&S8_v); + r = ((Size8 (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); + fflush(out); + } +#endif + +#if (!defined(DGTEST)) || DGTEST == 49 + { + Size12 r = S12_v(); + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Size12_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size12; + ffi_type_Size12.type = FFI_TYPE_STRUCT; + ffi_type_Size12.size = sizeof(Size12); + ffi_type_Size12.alignment = alignof_slot(Size12); + ffi_type_Size12.elements = ffi_type_Size12_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size12); + PREP_CALLBACK(cif,S12_v_simulator,(void*)&S12_v); + r = ((Size12 (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); + fflush(out); + } +#endif + +#if (!defined(DGTEST)) || DGTEST == 50 + { + Size15 r = S15_v(); + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Size15_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size15; + ffi_type_Size15.type = FFI_TYPE_STRUCT; + ffi_type_Size15.size = sizeof(Size15); + ffi_type_Size15.alignment = alignof_slot(Size15); + ffi_type_Size15.elements = ffi_type_Size15_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size15); + PREP_CALLBACK(cif,S15_v_simulator,(void*)&S15_v); + r = ((Size15 (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); + fflush(out); + } +#endif + +#if (!defined(DGTEST)) || DGTEST == 51 + { + Size16 r = S16_v(); + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); + fflush(out); + memset(&r,0,sizeof(r)); clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Size16_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; + ffi_type ffi_type_Size16; + ffi_type_Size16.type = FFI_TYPE_STRUCT; + ffi_type_Size16.size = sizeof(Size16); + ffi_type_Size16.alignment = alignof_slot(Size16); + ffi_type_Size16.elements = ffi_type_Size16_elements; + ffi_cif cif; + FFI_PREP_CIF_NOARGS(cif,ffi_type_Size16); + PREP_CALLBACK(cif,S16_v_simulator,(void*)&S16_v); + r = ((Size16 (ABI_ATTR *) (void)) callback_code) (); + } + FREE_CALLBACK(); + fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); + fflush(out); + } +#endif + + + /* structure tests */ + { Int Ir; + Char Cr; + Float Fr; + Double Dr; + J Jr; +#ifndef SKIP_EXTRA_STRUCTS + T Tr; + X Xr; +#endif + +#if (!defined(DGTEST)) || DGTEST == 52 + Ir = I_III(I1,I2,I3); + fprintf(out,"->{%d}\n",Ir.x); + fflush(out); + Ir.x = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Int_elements[] = { &ffi_type_sint, NULL }; + ffi_type ffi_type_Int; + ffi_type_Int.type = FFI_TYPE_STRUCT; + ffi_type_Int.size = sizeof(Int); + ffi_type_Int.alignment = alignof_slot(Int); + ffi_type_Int.elements = ffi_type_Int_elements; + ffi_type* argtypes[] = { &ffi_type_Int, &ffi_type_Int, &ffi_type_Int }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Int); + PREP_CALLBACK(cif,I_III_simulator,(void*)&I_III); + Ir = ((Int (ABI_ATTR *) (Int,Int,Int)) callback_code) (I1,I2,I3); + } + FREE_CALLBACK(); + fprintf(out,"->{%d}\n",Ir.x); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 53 + Cr = C_CdC(C1,d2,C3); + fprintf(out,"->{'%c'}\n",Cr.x); + fflush(out); + Cr.x = '\0'; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Char_elements[] = { &ffi_type_char, NULL }; + ffi_type ffi_type_Char; + ffi_type_Char.type = FFI_TYPE_STRUCT; + ffi_type_Char.size = sizeof(Char); + ffi_type_Char.alignment = alignof_slot(Char); + ffi_type_Char.elements = ffi_type_Char_elements; + ffi_type* argtypes[] = { &ffi_type_Char, &ffi_type_double, &ffi_type_Char }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Char); + PREP_CALLBACK(cif,C_CdC_simulator,(void*)&C_CdC); + Cr = ((Char (ABI_ATTR *) (Char,double,Char)) callback_code) (C1,d2,C3); + } + FREE_CALLBACK(); + fprintf(out,"->{'%c'}\n",Cr.x); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 54 + Fr = F_Ffd(F1,f2,d3); + fprintf(out,"->{%g}\n",Fr.x); + fflush(out); + Fr.x = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Float_elements[] = { &ffi_type_float, NULL }; + ffi_type ffi_type_Float; + ffi_type_Float.type = FFI_TYPE_STRUCT; + ffi_type_Float.size = sizeof(Float); + ffi_type_Float.alignment = alignof_slot(Float); + ffi_type_Float.elements = ffi_type_Float_elements; + ffi_type* argtypes[] = { &ffi_type_Float, &ffi_type_float, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Float); + PREP_CALLBACK(cif,F_Ffd_simulator,(void*)&F_Ffd); + Fr = ((Float (ABI_ATTR *) (Float,float,double)) callback_code) (F1,f2,d3); + } + FREE_CALLBACK(); + fprintf(out,"->{%g}\n",Fr.x); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 55 + Dr = D_fDd(f1,D2,d3); + fprintf(out,"->{%g}\n",Dr.x); + fflush(out); + Dr.x = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; + ffi_type ffi_type_Double; + ffi_type_Double.type = FFI_TYPE_STRUCT; + ffi_type_Double.size = sizeof(Double); + ffi_type_Double.alignment = alignof_slot(Double); + ffi_type_Double.elements = ffi_type_Double_elements; + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_Double, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Double); + PREP_CALLBACK(cif,D_fDd_simulator,(void*)&D_fDd); + Dr = ((Double (ABI_ATTR *) (float,Double,double)) callback_code) (f1,D2,d3); + } + FREE_CALLBACK(); + fprintf(out,"->{%g}\n",Dr.x); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 56 + Dr = D_Dfd(D1,f2,d3); + fprintf(out,"->{%g}\n",Dr.x); + fflush(out); + Dr.x = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; + ffi_type ffi_type_Double; + ffi_type_Double.type = FFI_TYPE_STRUCT; + ffi_type_Double.size = sizeof(Double); + ffi_type_Double.alignment = alignof_slot(Double); + ffi_type_Double.elements = ffi_type_Double_elements; + ffi_type* argtypes[] = { &ffi_type_Double, &ffi_type_float, &ffi_type_double }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_Double); + PREP_CALLBACK(cif,D_Dfd_simulator,(void*)&D_Dfd); + Dr = ((Double (ABI_ATTR *) (Double,float,double)) callback_code) (D1,f2,d3); + } + FREE_CALLBACK(); + fprintf(out,"->{%g}\n",Dr.x); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 57 + Jr = J_JiJ(J1,i2,J2); + fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); + fflush(out); + Jr.l1 = Jr.l2 = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_J_elements[] = { &ffi_type_slong, &ffi_type_slong, NULL }; + ffi_type ffi_type_J; + ffi_type_J.type = FFI_TYPE_STRUCT; + ffi_type_J.size = sizeof(J); + ffi_type_J.alignment = alignof_slot(J); + ffi_type_J.elements = ffi_type_J_elements; + ffi_type* argtypes[] = { &ffi_type_J, &ffi_type_sint, &ffi_type_J }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_J); + PREP_CALLBACK(cif,J_JiJ_simulator,(void*)&J_JiJ); + Jr = ((J (ABI_ATTR *) (J,int,J)) callback_code) (J1,i2,J2); + } + FREE_CALLBACK(); + fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); + fflush(out); +#endif + +#ifndef SKIP_EXTRA_STRUCTS +#if (!defined(DGTEST)) || DGTEST == 58 + Tr = T_TcT(T1,' ',T2); + fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); + fflush(out); + Tr.c[0] = Tr.c[1] = Tr.c[2] = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_T_elements[] = { ??, NULL }; + ffi_type ffi_type_T; + ffi_type_T.type = FFI_TYPE_STRUCT; + ffi_type_T.size = sizeof(T); + ffi_type_T.alignment = alignof_slot(T); + ffi_type_T.elements = ffi_type_T_elements; + ffi_type* argtypes[] = { &ffi_type_T, &ffi_type_char, &ffi_type_T }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_T); + PREP_CALLBACK(cif,T_TcT_simulator,(void*)&T_TcT); + Tr = ((T (ABI_ATTR *) (T,char,T)) callback_code) (T1,' ',T2); + } + FREE_CALLBACK(); + fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); + fflush(out); +#endif + +#ifndef SKIP_X +#if (!defined(DGTEST)) || DGTEST == 59 + Xr = X_BcdB(B1,c2,d3,B2); + fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); + fflush(out); + Xr.c[0]=Xr.c1='\0'; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* ffi_type_X_elements[] = { ??, NULL }; + ffi_type ffi_type_X; + ffi_type_X.type = FFI_TYPE_STRUCT; + ffi_type_X.size = sizeof(X); + ffi_type_X.alignment = alignof_slot(X); + ffi_type_X.elements = ffi_type_X_elements; + ffi_type* argtypes[] = { &ffi_type_X, &ffi_type_char, &ffi_type_double, &ffi_type_X }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_X); + PREP_CALLBACK(cif,X_BcdB_simulator,(void*)&X_BcdB); + Xr = ((X (ABI_ATTR *) (B,char,double,B)) callback_code) (B1,c2,d3,B2); + } + FREE_CALLBACK(); + fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); + fflush(out); +#endif +#endif +#endif + } + + + /* gpargs boundary tests */ + { + ffi_type* ffi_type_K_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; + ffi_type ffi_type_K; + ffi_type* ffi_type_L_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; + ffi_type ffi_type_L; + long lr; + long long llr; + float fr; + double dr; + + ffi_type_K.type = FFI_TYPE_STRUCT; + ffi_type_K.size = sizeof(K); + ffi_type_K.alignment = alignof_slot(K); + ffi_type_K.elements = ffi_type_K_elements; + + ffi_type_L.type = FFI_TYPE_STRUCT; + ffi_type_L.size = sizeof(L); + ffi_type_L.alignment = alignof_slot(L); + ffi_type_L.elements = ffi_type_L_elements; + +#if (!defined(DGTEST)) || DGTEST == 60 + lr = l_l0K(K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + PREP_CALLBACK(cif,l_l0K_simulator,(void*)l_l0K); + lr = ((long (ABI_ATTR *) (K,long)) callback_code) (K1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 61 + lr = l_l1K(l1,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + PREP_CALLBACK(cif,l_l1K_simulator,(void*)l_l1K); + lr = ((long (ABI_ATTR *) (long,K,long)) callback_code) (l1,K1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 62 + lr = l_l2K(l1,l2,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + PREP_CALLBACK(cif,l_l2K_simulator,(void*)l_l2K); + lr = ((long (ABI_ATTR *) (long,long,K,long)) callback_code) (l1,l2,K1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 63 + lr = l_l3K(l1,l2,l3,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + PREP_CALLBACK(cif,l_l3K_simulator,(void*)l_l3K); + lr = ((long (ABI_ATTR *) (long,long,long,K,long)) callback_code) (l1,l2,l3,K1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 64 + lr = l_l4K(l1,l2,l3,l4,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + PREP_CALLBACK(cif,l_l4K_simulator,(void*)l_l4K); + lr = ((long (ABI_ATTR *) (long,long,long,long,K,long)) callback_code) (l1,l2,l3,l4,K1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 65 + lr = l_l5K(l1,l2,l3,l4,l5,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + PREP_CALLBACK(cif,l_l5K_simulator,(void*)l_l5K); + lr = ((long (ABI_ATTR *) (long,long,long,long,long,K,long)) callback_code) (l1,l2,l3,l4,l5,K1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 66 + lr = l_l6K(l1,l2,l3,l4,l5,l6,K1,l9); + fprintf(out,"->%ld\n",lr); + fflush(out); + lr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slong); + PREP_CALLBACK(cif,l_l6K_simulator,(void*)l_l6K); + lr = ((long (ABI_ATTR *) (long,long,long,long,long,long,K,long)) callback_code) (l1,l2,l3,l4,l5,l6,K1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%ld\n",lr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 67 + fr = f_f17l3L(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,l6,l7,l8,L1); + fprintf(out,"->%g\n",fr); + fflush(out); + fr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_float); + PREP_CALLBACK(cif,f_f17l3L_simulator,(void*)&f_f17l3L); + fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,long,long,long,L)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,l6,l7,l8,L1); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",fr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 68 + dr = d_d17l3L(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,l6,l7,l8,L1); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_d17l3L_simulator,(void*)&d_d17l3L); + dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,long,long,long,L)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,l6,l7,l8,L1); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 69 + llr = ll_l2ll(l1,l2,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + PREP_CALLBACK(cif,ll_l2ll_simulator,(void*)ll_l2ll); + llr = ((long long (ABI_ATTR *) (long,long,long long,long)) callback_code) (l1,l2,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 70 + llr = ll_l3ll(l1,l2,l3,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + PREP_CALLBACK(cif,ll_l3ll_simulator,(void*)ll_l3ll); + llr = ((long long (ABI_ATTR *) (long,long,long,long long,long)) callback_code) (l1,l2,l3,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 71 + llr = ll_l4ll(l1,l2,l3,l4,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + PREP_CALLBACK(cif,ll_l4ll_simulator,(void*)ll_l4ll); + llr = ((long long (ABI_ATTR *) (long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 72 + llr = ll_l5ll(l1,l2,l3,l4,l5,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + PREP_CALLBACK(cif,ll_l5ll_simulator,(void*)ll_l5ll); + llr = ((long long (ABI_ATTR *) (long,long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,l5,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 73 + llr = ll_l6ll(l1,l2,l3,l4,l5,l6,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + PREP_CALLBACK(cif,ll_l6ll_simulator,(void*)ll_l6ll); + llr = ((long long (ABI_ATTR *) (long,long,long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,l5,l6,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 74 + llr = ll_l7ll(l1,l2,l3,l4,l5,l6,l7,ll1,l9); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); + llr = 0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); + PREP_CALLBACK(cif,ll_l7ll_simulator,(void*)ll_l7ll); + llr = ((long long (ABI_ATTR *) (long,long,long,long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,l5,l6,l7,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 75 + dr = d_l2d(l1,l2,ll1,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_l2d_simulator,(void*)d_l2d); + dr = ((double (ABI_ATTR *) (long,long,double,long)) callback_code) (l1,l2,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 76 + dr = d_l3d(l1,l2,l3,ll1,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_l3d_simulator,(void*)d_l3d); + dr = ((double (ABI_ATTR *) (long,long,long,double,long)) callback_code) (l1,l2,l3,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 77 + dr = d_l4d(l1,l2,l3,l4,ll1,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_l4d_simulator,(void*)d_l4d); + dr = ((double (ABI_ATTR *) (long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 78 + dr = d_l5d(l1,l2,l3,l4,l5,ll1,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_l5d_simulator,(void*)d_l5d); + dr = ((double (ABI_ATTR *) (long,long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,l5,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 79 + dr = d_l6d(l1,l2,l3,l4,l5,l6,ll1,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_l6d_simulator,(void*)d_l6d); + dr = ((double (ABI_ATTR *) (long,long,long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,l5,l6,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + +#if (!defined(DGTEST)) || DGTEST == 80 + dr = d_l7d(l1,l2,l3,l4,l5,l6,l7,ll1,l9); + fprintf(out,"->%g\n",dr); + fflush(out); + dr = 0.0; clear_traces(); + ALLOC_CALLBACK(); + { + ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; + ffi_cif cif; + FFI_PREP_CIF(cif,argtypes,ffi_type_double); + PREP_CALLBACK(cif,d_l7d_simulator,(void*)d_l7d); + dr = ((double (ABI_ATTR *) (long,long,long,long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,l5,l6,l7,ll1,l9); + } + FREE_CALLBACK(); + fprintf(out,"->%g\n",dr); + fflush(out); +#endif + + } + + exit(0); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c new file mode 100644 index 000000000000..d25ebf48c9b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c @@ -0,0 +1,743 @@ +/* + * Copyright 1993 Bill Triggs <Bill.Triggs@inrialpes.fr> + * Copyright 1995-2017 Bruno Haible <bruno@clisp.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* This file defines test functions of selected signatures, that exercise + dark corners of the various ABIs. */ + +#include <stdio.h> + +FILE* out; + +#define uchar unsigned char +#define ushort unsigned short +#define uint unsigned int +#define ulong unsigned long + +typedef struct { char x; } Char; +typedef struct { short x; } Short; +typedef struct { int x; } Int; +typedef struct { long x; } Long; +typedef struct { float x; } Float; +typedef struct { double x; } Double; +typedef struct { char c; float f; } A; +typedef struct { double d; int i[3]; } B; +typedef struct { long l1; long l2; } J; +typedef struct { long l1; long l2; long l3; long l4; } K; +typedef struct { long l1; long l2; long l3; long l4; long l5; long l6; } L; +typedef struct { char x1; } Size1; +typedef struct { char x1; char x2; } Size2; +typedef struct { char x1; char x2; char x3; } Size3; +typedef struct { char x1; char x2; char x3; char x4; } Size4; +typedef struct { + char x1; char x2; char x3; char x4; char x5; char x6; char x7; +} Size7; +typedef struct { + char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; +} Size8; +typedef struct { + char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; + char x9; char x10; char x11; char x12; +} Size12; +typedef struct { + char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; + char x9; char x10; char x11; char x12; char x13; char x14; char x15; +} Size15; +typedef struct { + char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; + char x9; char x10; char x11; char x12; char x13; char x14; char x15; char x16; +} Size16; +typedef struct { char c[3]; } T; +typedef struct { char c[33],c1; } X; + +char c1='a', c2=127, c3=(char)128, c4=(char)255, c5=-1; +short s1=32767, s2=(short)32768, s3=3, s4=4, s5=5, s6=6, s7=7, s8=8, s9=9; +int i1=1, i2=2, i3=3, i4=4, i5=5, i6=6, i7=7, i8=8, i9=9, + i10=11, i11=12, i12=13, i13=14, i14=15, i15=16, i16=17; +long l1=1, l2=2, l3=3, l4=4, l5=5, l6=6, l7=7, l8=8, l9=9; +long long ll1 = 3875056143130689530LL; +float f1=0.1f, f2=0.2f, f3=0.3f, f4=0.4f, f5=0.5f, f6=0.6f, f7=0.7f, f8=0.8f, f9=0.9f, + f10=1.1f, f11=1.2f, f12=1.3f, f13=1.4f, f14=1.5f, f15=1.6f, f16=1.7f, f17=1.8f, + f18=1.9f, f19=2.1f, f20=2.2f, f21=2.3f, f22=2.4f, f23=2.5f, f24=2.6f; +double d1=0.1, d2=0.2, d3=0.3, d4=0.4, d5=0.5, d6=0.6, d7=0.7, d8=0.8, d9=0.9, + d10=1.1, d11=1.2, d12=1.3, d13=1.4, d14=1.5, d15=1.6, d16=1.7, d17=1.8; + +uchar uc1='a', uc2=127, uc3=128, uc4=255, uc5=(uchar)-1; +ushort us1=1, us2=2, us3=3, us4=4, us5=5, us6=6, us7=7, us8=8, us9=9; +uint ui1=1, ui2=2, ui3=3, ui4=4, ui5=5, ui6=6, ui7=7, ui8=8, ui9=9; +ulong ul1=1, ul2=2, ul3=3, ul4=4, ul5=5, ul6=6, ul7=7, ul8=8, ul9=9; + +char *str1="hello",str2[]="goodbye",*str3="still here?"; +Char C1={'A'}, C2={'B'}, C3={'C'}, C4={'\377'}, C5={(char)(-1)}; +Short S1={1}, S2={2}, S3={3}, S4={4}, S5={5}, S6={6}, S7={7}, S8={8}, S9={9}; +Int I1={1}, I2={2}, I3={3}, I4={4}, I5={5}, I6={6}, I7={7}, I8={8}, I9={9}; +Float F1={0.1f}, F2={0.2f}, F3={0.3f}, F4={0.4f}, F5={0.5f}, F6={0.6f}, F7={0.7f}, F8={0.8f}, F9={0.9f}; +Double D1={0.1}, D2={0.2}, D3={0.3}, D4={0.4}, D5={0.5}, D6={0.6}, D7={0.7}, D8={0.8}, D9={0.9}; + +A A1={'a',0.1f},A2={'b',0.2f},A3={'\377',0.3f}; +B B1={0.1,{1,2,3}},B2={0.2,{5,4,3}}; +J J1={47,11},J2={73,55}; +K K1={19,69,12,28}; +L L1={561,1105,1729,2465,2821,6601}; /* A002997 */ +Size1 Size1_1={'a'}; +Size2 Size2_1={'a','b'}; +Size3 Size3_1={'a','b','c'}; +Size4 Size4_1={'a','b','c','d'}; +Size7 Size7_1={'a','b','c','d','e','f','g'}; +Size8 Size8_1={'a','b','c','d','e','f','g','h'}; +Size12 Size12_1={'a','b','c','d','e','f','g','h','i','j','k','l'}; +Size15 Size15_1={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'}; +Size16 Size16_1={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'}; +T T1={{'t','h','e'}},T2={{'f','o','x'}}; +X X1={"abcdefghijklmnopqrstuvwxyzABCDEF",'G'}, X2={"123",'9'}, X3={"return-return-return",'R'}; + +#if defined(__GNUC__) +#define __STDCALL__ __attribute__((stdcall)) +#define __THISCALL__ __attribute__((thiscall)) +#define __FASTCALL__ __attribute__((fastcall)) +#define __MSABI__ __attribute__((ms_abi)) +#else +#define __STDCALL__ __stdcall +#define __THISCALL__ __thiscall +#define __FASTCALL__ __fastcall +#endif + +#ifndef ABI_ATTR +#define ABI_ATTR +#endif + +/* void tests */ +void ABI_ATTR v_v (void) +{ + fprintf(out,"void f(void):\n"); + fflush(out); +} + +/* int tests */ +int ABI_ATTR i_v (void) +{ + int r=99; + fprintf(out,"int f(void):"); + fflush(out); + return r; +} +int ABI_ATTR i_i (int a) +{ + int r=a+1; + fprintf(out,"int f(int):(%d)",a); + fflush(out); + return r; +} +int ABI_ATTR i_i2 (int a, int b) +{ + int r=a+b; + fprintf(out,"int f(2*int):(%d,%d)",a,b); + fflush(out); + return r; +} +int ABI_ATTR i_i4 (int a, int b, int c, int d) +{ + int r=a+b+c+d; + fprintf(out,"int f(4*int):(%d,%d,%d,%d)",a,b,c,d); + fflush(out); + return r; +} +int ABI_ATTR i_i8 (int a, int b, int c, int d, int e, int f, int g, int h) +{ + int r=a+b+c+d+e+f+g+h; + fprintf(out,"int f(8*int):(%d,%d,%d,%d,%d,%d,%d,%d)",a,b,c,d,e,f,g,h); + fflush(out); + return r; +} +int ABI_ATTR i_i16 (int a, int b, int c, int d, int e, int f, int g, int h, + int i, int j, int k, int l, int m, int n, int o, int p) +{ + int r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; + fprintf(out,"int f(16*int):(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)", + a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); + fflush(out); + return r; +} + +/* float tests */ +float ABI_ATTR f_f (float a) +{ + float r=a+1.0f; + fprintf(out,"float f(float):(%g)",a); + fflush(out); + return r; +} +float ABI_ATTR f_f2 (float a, float b) +{ + float r=a+b; + fprintf(out,"float f(2*float):(%g,%g)",a,b); + fflush(out); + return r; +} +float ABI_ATTR f_f4 (float a, float b, float c, float d) +{ + float r=a+b+c+d; + fprintf(out,"float f(4*float):(%g,%g,%g,%g)",a,b,c,d); + fflush(out); + return r; +} +float ABI_ATTR f_f8 (float a, float b, float c, float d, float e, float f, + float g, float h) +{ + float r=a+b+c+d+e+f+g+h; + fprintf(out,"float f(8*float):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); + fflush(out); + return r; +} +float ABI_ATTR f_f16 (float a, float b, float c, float d, float e, float f, float g, float h, + float i, float j, float k, float l, float m, float n, float o, float p) +{ + float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; + fprintf(out,"float f(16*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); + fflush(out); + return r; +} +float ABI_ATTR f_f24 (float a, float b, float c, float d, float e, float f, float g, float h, + float i, float j, float k, float l, float m, float n, float o, float p, + float q, float s, float t, float u, float v, float w, float x, float y) +{ + float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+v+w+x+y; + fprintf(out,"float f(24*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,v,w,x,y); + fflush(out); + return r; +} + +/* double tests */ +double ABI_ATTR d_d (double a) +{ + double r=a+1.0; + fprintf(out,"double f(double):(%g)",a); + fflush(out); + return r; +} +double ABI_ATTR d_d2 (double a, double b) +{ + double r=a+b; + fprintf(out,"double f(2*double):(%g,%g)",a,b); + fflush(out); + return r; +} +double ABI_ATTR d_d4 (double a, double b, double c, double d) +{ + double r=a+b+c+d; + fprintf(out,"double f(4*double):(%g,%g,%g,%g)",a,b,c,d); + fflush(out); + return r; +} +double ABI_ATTR d_d8 (double a, double b, double c, double d, double e, double f, + double g, double h) +{ + double r=a+b+c+d+e+f+g+h; + fprintf(out,"double f(8*double):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); + fflush(out); + return r; +} +double ABI_ATTR d_d16 (double a, double b, double c, double d, double e, double f, + double g, double h, double i, double j, double k, double l, + double m, double n, double o, double p) +{ + double r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; + fprintf(out,"double f(16*double):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); + fflush(out); + return r; +} + +/* pointer tests */ +void* ABI_ATTR vp_vpdpcpsp (void* a, double* b, char* c, Int* d) +{ + void* ret = (char*)b + 1; + fprintf(out,"void* f(void*,double*,char*,Int*):(0x%p,0x%p,0x%p,0x%p)",a,b,c,d); + fflush(out); + return ret; +} + +/* mixed number tests */ +uchar ABI_ATTR uc_ucsil (uchar a, ushort b, uint c, ulong d) +{ + uchar r = (uchar)-1; + fprintf(out,"uchar f(uchar,ushort,uint,ulong):(%u,%u,%u,%lu)",a,b,c,d); + fflush(out); + return r; +} +double ABI_ATTR d_iidd (int a, int b, double c, double d) +{ + double r = a+b+c+d; + fprintf(out,"double f(int,int,double,double):(%d,%d,%g,%g)",a,b,c,d); + fflush(out); + return r; +} +double ABI_ATTR d_iiidi (int a, int b, int c, double d, int e) +{ + double r = a+b+c+d+e; + fprintf(out,"double f(int,int,int,double,int):(%d,%d,%d,%g,%d)",a,b,c,d,e); + fflush(out); + return r; +} +double ABI_ATTR d_idid (int a, double b, int c, double d) +{ + double r = a+b+c+d; + fprintf(out,"double f(int,double,int,double):(%d,%g,%d,%g)",a,b,c,d); + fflush(out); + return r; +} +double ABI_ATTR d_fdi (float a, double b, int c) +{ + double r = a+b+c; + fprintf(out,"double f(float,double,int):(%g,%g,%d)",a,b,c); + fflush(out); + return r; +} +ushort ABI_ATTR us_cdcd (char a, double b, char c, double d) +{ + ushort r = (ushort)(a + b + c + d); + fprintf(out,"ushort f(char,double,char,double):('%c',%g,'%c',%g)",a,b,c,d); + fflush(out); + return r; +} + +long long ABI_ATTR ll_iiilli (int a, int b, int c, long long d, int e) +{ + long long r = (long long)(int)a+(long long)(int)b+(long long)(int)c+d+(long long)(int)e; + fprintf(out,"long long f(int,int,int,long long,int):(%d,%d,%d,0x%lx%08lx,%d)",a,b,c,(long)(d>>32),(long)(d&0xffffffff),e); + fflush(out); + return r; +} +long long ABI_ATTR ll_flli (float a, long long b, int c) +{ + long long r = (long long)(int)a + b + (long long)c; + fprintf(out,"long long f(float,long long,int):(%g,0x%lx%08lx,0x%lx)",a,(long)(b>>32),(long)(b&0xffffffff),(long)c); + fflush(out); + return r; +} + +float ABI_ATTR f_fi (float a, int z) +{ + float r = a+z; + fprintf(out,"float f(float,int):(%g,%d)",a,z); + fflush(out); + return r; +} +float ABI_ATTR f_f2i (float a, float b, int z) +{ + float r = a+b+z; + fprintf(out,"float f(2*float,int):(%g,%g,%d)",a,b,z); + fflush(out); + return r; +} +float ABI_ATTR f_f3i (float a, float b, float c, int z) +{ + float r = a+b+c+z; + fprintf(out,"float f(3*float,int):(%g,%g,%g,%d)",a,b,c,z); + fflush(out); + return r; +} +float ABI_ATTR f_f4i (float a, float b, float c, float d, int z) +{ + float r = a+b+c+d+z; + fprintf(out,"float f(4*float,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); + fflush(out); + return r; +} +float ABI_ATTR f_f7i (float a, float b, float c, float d, float e, float f, float g, + int z) +{ + float r = a+b+c+d+e+f+g+z; + fprintf(out,"float f(7*float,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); + fflush(out); + return r; +} +float ABI_ATTR f_f8i (float a, float b, float c, float d, float e, float f, float g, + float h, int z) +{ + float r = a+b+c+d+e+f+g+h+z; + fprintf(out,"float f(8*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); + fflush(out); + return r; +} +float ABI_ATTR f_f12i (float a, float b, float c, float d, float e, float f, float g, + float h, float i, float j, float k, float l, int z) +{ + float r = a+b+c+d+e+f+g+h+i+j+k+l+z; + fprintf(out,"float f(12*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); + fflush(out); + return r; +} +float ABI_ATTR f_f13i (float a, float b, float c, float d, float e, float f, float g, + float h, float i, float j, float k, float l, float m, int z) +{ + float r = a+b+c+d+e+f+g+h+i+j+k+l+m+z; + fprintf(out,"float f(13*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); + fflush(out); + return r; +} + +double ABI_ATTR d_di (double a, int z) +{ + double r = a+z; + fprintf(out,"double f(double,int):(%g,%d)",a,z); + fflush(out); + return r; +} +double ABI_ATTR d_d2i (double a, double b, int z) +{ + double r = a+b+z; + fprintf(out,"double f(2*double,int):(%g,%g,%d)",a,b,z); + fflush(out); + return r; +} +double ABI_ATTR d_d3i (double a, double b, double c, int z) +{ + double r = a+b+c+z; + fprintf(out,"double f(3*double,int):(%g,%g,%g,%d)",a,b,c,z); + fflush(out); + return r; +} +double ABI_ATTR d_d4i (double a, double b, double c, double d, int z) +{ + double r = a+b+c+d+z; + fprintf(out,"double f(4*double,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); + fflush(out); + return r; +} +double ABI_ATTR d_d7i (double a, double b, double c, double d, double e, double f, + double g, int z) +{ + double r = a+b+c+d+e+f+g+z; + fprintf(out,"double f(7*double,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); + fflush(out); + return r; +} +double ABI_ATTR d_d8i (double a, double b, double c, double d, double e, double f, + double g, double h, int z) +{ + double r = a+b+c+d+e+f+g+h+z; + fprintf(out,"double f(8*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); + fflush(out); + return r; +} +double ABI_ATTR d_d12i (double a, double b, double c, double d, double e, double f, + double g, double h, double i, double j, double k, double l, + int z) +{ + double r = a+b+c+d+e+f+g+h+i+j+k+l+z; + fprintf(out,"double f(12*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); + fflush(out); + return r; +} +double ABI_ATTR d_d13i (double a, double b, double c, double d, double e, double f, + double g, double h, double i, double j, double k, double l, + double m, int z) +{ + double r = a+b+c+d+e+f+g+h+i+j+k+l+m+z; + fprintf(out,"double f(13*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); + fflush(out); + return r; +} + +/* small structure return tests */ +Size1 ABI_ATTR S1_v (void) +{ + fprintf(out,"Size1 f(void):"); + fflush(out); + return Size1_1; +} +Size2 ABI_ATTR S2_v (void) +{ + fprintf(out,"Size2 f(void):"); + fflush(out); + return Size2_1; +} +Size3 ABI_ATTR S3_v (void) +{ + fprintf(out,"Size3 f(void):"); + fflush(out); + return Size3_1; +} +Size4 ABI_ATTR S4_v (void) +{ + fprintf(out,"Size4 f(void):"); + fflush(out); + return Size4_1; +} +Size7 ABI_ATTR S7_v (void) +{ + fprintf(out,"Size7 f(void):"); + fflush(out); + return Size7_1; +} +Size8 ABI_ATTR S8_v (void) +{ + fprintf(out,"Size8 f(void):"); + fflush(out); + return Size8_1; +} +Size12 ABI_ATTR S12_v (void) +{ + fprintf(out,"Size12 f(void):"); + fflush(out); + return Size12_1; +} +Size15 ABI_ATTR S15_v (void) +{ + fprintf(out,"Size15 f(void):"); + fflush(out); + return Size15_1; +} +Size16 ABI_ATTR S16_v (void) +{ + fprintf(out,"Size16 f(void):"); + fflush(out); + return Size16_1; +} + +/* structure tests */ +Int ABI_ATTR I_III (Int a, Int b, Int c) +{ + Int r; + r.x = a.x + b.x + c.x; + fprintf(out,"Int f(Int,Int,Int):({%d},{%d},{%d})",a.x,b.x,c.x); + fflush(out); + return r; +} +Char ABI_ATTR C_CdC (Char a, double b, Char c) +{ + Char r; + r.x = (a.x + c.x)/2; + fprintf(out,"Char f(Char,double,Char):({'%c'},%g,{'%c'})",a.x,b,c.x); + fflush(out); + return r; +} +Float ABI_ATTR F_Ffd (Float a, float b, double c) +{ + Float r; + r.x = (float) (a.x + b + c); + fprintf(out,"Float f(Float,float,double):({%g},%g,%g)",a.x,b,c); + fflush(out); + return r; +} +Double ABI_ATTR D_fDd (float a, Double b, double c) +{ + Double r; + r.x = a + b.x + c; + fprintf(out,"Double f(float,Double,double):(%g,{%g},%g)",a,b.x,c); + fflush(out); + return r; +} +Double ABI_ATTR D_Dfd (Double a, float b, double c) +{ + Double r; + r.x = a.x + b + c; + fprintf(out,"Double f(Double,float,double):({%g},%g,%g)",a.x,b,c); + fflush(out); + return r; +} +J ABI_ATTR J_JiJ (J a, int b, J c) +{ + J r; + r.l1 = a.l1+c.l1; r.l2 = a.l2+b+c.l2; + fprintf(out,"J f(J,int,J):({%ld,%ld},%d,{%ld,%ld})",a.l1,a.l2,b,c.l1,c.l2); + fflush(out); + return r; +} +T ABI_ATTR T_TcT (T a, char b, T c) +{ + T r; + r.c[0]='b'; r.c[1]=c.c[1]; r.c[2]=c.c[2]; + fprintf(out,"T f(T,char,T):({\"%c%c%c\"},'%c',{\"%c%c%c\"})",a.c[0],a.c[1],a.c[2],b,c.c[0],c.c[1],c.c[2]); + fflush(out); + return r; +} +X ABI_ATTR X_BcdB (B a, char b, double c, B d) +{ + static X xr={"return val",'R'}; + X r; + r = xr; + r.c1 = b; + fprintf(out,"X f(B,char,double,B):({%g,{%d,%d,%d}},'%c',%g,{%g,{%d,%d,%d}})", + a.d,a.i[0],a.i[1],a.i[2],b,c,d.d,d.i[0],d.i[1],d.i[2]); + fflush(out); + return r; +} + +/* Test for cases where some argument (especially structure, 'long long', or + 'double') may be passed partially in general-purpose argument registers + and partially on the stack. Different ABIs pass between 4 and 8 arguments + (or none) in general-purpose argument registers. */ + +long ABI_ATTR l_l0K (K b, long c) +{ + long r = b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(K,long):(%ld,%ld,%ld,%ld,%ld)",b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + return r; +} +long ABI_ATTR l_l1K (long a1, K b, long c) +{ + long r = a1 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld)",a1,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + return r; +} +long ABI_ATTR l_l2K (long a1, long a2, K b, long c) +{ + long r = a1 + a2 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(2*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + return r; +} +long ABI_ATTR l_l3K (long a1, long a2, long a3, K b, long c) +{ + long r = a1 + a2 + a3 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(3*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + return r; +} +long ABI_ATTR l_l4K (long a1, long a2, long a3, long a4, K b, long c) +{ + long r = a1 + a2 + a3 + a4 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(4*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + return r; +} +long ABI_ATTR l_l5K (long a1, long a2, long a3, long a4, long a5, K b, long c) +{ + long r = a1 + a2 + a3 + a4 + a5 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(5*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + return r; +} +long ABI_ATTR l_l6K (long a1, long a2, long a3, long a4, long a5, long a6, K b, long c) +{ + long r = a1 + a2 + a3 + a4 + a5 + a6 + b.l1 + b.l2 + b.l3 + b.l4 + c; + fprintf(out,"long f(6*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,a6,b.l1,b.l2,b.l3,b.l4,c); + fflush(out); + return r; +} +/* These tests is crafted on the knowledge that for all known ABIs: + * 17 > number of floating-point argument registers, + * 3 < number of general-purpose argument registers < 3 + 6. */ +float ABI_ATTR f_f17l3L (float a, float b, float c, float d, float e, float f, float g, + float h, float i, float j, float k, float l, float m, float n, + float o, float p, float q, + long s, long t, long u, L z) +{ + float r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; + fprintf(out,"float f(17*float,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); + fflush(out); + return r; +} +double ABI_ATTR d_d17l3L (double a, double b, double c, double d, double e, double f, + double g, double h, double i, double j, double k, double l, + double m, double n, double o, double p, double q, + long s, long t, long u, L z) +{ + double r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; + fprintf(out,"double f(17*double,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); + fflush(out); + return r; +} + +long long ABI_ATTR ll_l2ll (long a1, long a2, long long b, long c) +{ + long long r = (long long) (a1 + a2) + b + c; + fprintf(out,"long long f(2*long,long long,long):(%ld,%ld,0x%lx%08lx,%ld)",a1,a2,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + return r; +} +long long ABI_ATTR ll_l3ll (long a1, long a2, long a3, long long b, long c) +{ + long long r = (long long) (a1 + a2 + a3) + b + c; + fprintf(out,"long long f(3*long,long long,long):(%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + return r; +} +long long ABI_ATTR ll_l4ll (long a1, long a2, long a3, long a4, long long b, long c) +{ + long long r = (long long) (a1 + a2 + a3 + a4) + b + c; + fprintf(out,"long long f(4*long,long long,long):(%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + return r; +} +long long ABI_ATTR ll_l5ll (long a1, long a2, long a3, long a4, long a5, long long b, long c) +{ + long long r = (long long) (a1 + a2 + a3 + a4 + a5) + b + c; + fprintf(out,"long long f(5*long,long long,long):(%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + return r; +} +long long ABI_ATTR ll_l6ll (long a1, long a2, long a3, long a4, long a5, long a6, long long b, long c) +{ + long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; + fprintf(out,"long long f(6*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + return r; +} +long long ABI_ATTR ll_l7ll (long a1, long a2, long a3, long a4, long a5, long a6, long a7, long long b, long c) +{ + long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; + fprintf(out,"long long f(7*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,a7,(long)(b>>32),(long)(b&0xffffffff),c); + fflush(out); + return r; +} + +double ABI_ATTR d_l2d (long a1, long a2, double b, long c) +{ + double r = (double) (a1 + a2) + b + c; + fprintf(out,"double f(2*long,double,long):(%ld,%ld,%g,%ld)",a1,a2,b,c); + fflush(out); + return r; +} +double ABI_ATTR d_l3d (long a1, long a2, long a3, double b, long c) +{ + double r = (double) (a1 + a2 + a3) + b + c; + fprintf(out,"double f(3*long,double,long):(%ld,%ld,%ld,%g,%ld)",a1,a2,a3,b,c); + fflush(out); + return r; +} +double ABI_ATTR d_l4d (long a1, long a2, long a3, long a4, double b, long c) +{ + double r = (double) (a1 + a2 + a3 + a4) + b + c; + fprintf(out,"double f(4*long,double,long):(%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,b,c); + fflush(out); + return r; +} +double ABI_ATTR d_l5d (long a1, long a2, long a3, long a4, long a5, double b, long c) +{ + double r = (double) (a1 + a2 + a3 + a4 + a5) + b + c; + fprintf(out,"double f(5*long,double,long):(%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,b,c); + fflush(out); + return r; +} +double ABI_ATTR d_l6d (long a1, long a2, long a3, long a4, long a5, long a6, double b, long c) +{ + double r = (double) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; + fprintf(out,"double f(6*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,b,c); + fflush(out); + return r; +} +double ABI_ATTR d_l7d (long a1, long a2, long a3, long a4, long a5, long a6, long a7, double b, long c) +{ + double r = (double) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; + fprintf(out,"double f(7*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,a7,b,c); + fflush(out); + return r; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c new file mode 100644 index 000000000000..5d4959ce975b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c @@ -0,0 +1,46 @@ +/* Area: ffi_call + Purpose: Check for proper argument alignment. + Limitations: none. + PR: none. + Originator: <twalljava@java.net> (from many_win32.c) */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static float ABI_ATTR align_arguments(int i1, + double f2, + int i3, + double f4) +{ + return i1+f2+i3+f4; +} + +int main(void) +{ + ffi_cif cif; + ffi_type *args[4] = { + &ffi_type_sint, + &ffi_type_double, + &ffi_type_sint, + &ffi_type_double + }; + double fa[2] = {1,2}; + int ia[2] = {1,2}; + void *values[4] = {&ia[0], &fa[0], &ia[1], &fa[1]}; + float f, ff; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, + &ffi_type_float, args) == FFI_OK); + + ff = align_arguments(ia[0], fa[0], ia[1], fa[1]); + + ffi_call(&cif, FFI_FN(align_arguments), &f, values); + + if (f == ff) + printf("align arguments tests ok!\n"); + else + CHECK(0); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c new file mode 100644 index 000000000000..5e5cb860cce9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c @@ -0,0 +1,46 @@ +/* Area: ffi_call + Purpose: Check for proper argument alignment. + Limitations: none. + PR: none. + Originator: <twalljava@java.net> (from many_win32.c) */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static float ABI_ATTR align_arguments(int i1, + double f2, + int i3, + double f4) +{ + return i1+f2+i3+f4; +} + +int main(void) +{ + ffi_cif cif; + ffi_type *args[4] = { + &ffi_type_sint, + &ffi_type_double, + &ffi_type_sint, + &ffi_type_double + }; + double fa[2] = {1,2}; + int ia[2] = {1,2}; + void *values[4] = {&ia[0], &fa[0], &ia[1], &fa[1]}; + float f, ff; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, + &ffi_type_float, args) == FFI_OK); + + ff = align_arguments(ia[0], fa[0], ia[1], fa[1]);; + + ffi_call(&cif, FFI_FN(align_arguments), &f, values); + + if (f == ff) + printf("align arguments tests ok!\n"); + else + CHECK(0); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/call.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/call.exp new file mode 100644 index 000000000000..13ba2bdcd492 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/call.exp @@ -0,0 +1,54 @@ +# Copyright (C) 2003, 2006, 2009, 2010, 2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +dg-init +libffi-init + +global srcdir subdir + +if { [string match $compiler_vendor "microsoft"] } { + # -wd4005 macro redefinition + # -wd4244 implicit conversion to type of smaller size + # -wd4305 truncation to smaller type + # -wd4477 printf %lu of uintptr_t + # -wd4312 implicit conversion to type of greater size + # -wd4311 pointer truncation to unsigned long + # -EHsc C++ Exception Handling (no SEH exceptions) + set additional_options "-wd4005 -wd4244 -wd4305 -wd4477 -wd4312 -wd4311 -EHsc"; +} else { + set additional_options ""; +} + +set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.c]] + +run-many-tests $tlist $additional_options + +set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.cc]] + +# No C++ for or1k +if { [istarget "or1k-*-*"] } { + foreach test $tlist { + unsupported "$test" + } +} else { + run-many-tests $tlist $additional_options +} + +dg-finish + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c new file mode 100644 index 000000000000..bf6016186170 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c @@ -0,0 +1,26 @@ +/* Area: ffi_prep_cif + Purpose: Test error return for bad typedefs. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +int main (void) +{ + ffi_cif cif; + ffi_type* arg_types[1]; + + ffi_type badType = ffi_type_void; + + arg_types[0] = NULL; + + badType.size = 0; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType, + arg_types) == FFI_BAD_TYPEDEF); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h new file mode 100644 index 000000000000..cfce1ad589b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h @@ -0,0 +1,138 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <ffi.h> +#include "fficonfig.h" + +#if defined HAVE_STDINT_H +#include <stdint.h> +#endif + +#if defined HAVE_INTTYPES_H +#include <inttypes.h> +#endif + +#define MAX_ARGS 256 + +#define CHECK(x) (void)(!(x) ? (abort(), 1) : 0) + +/* Define macros so that compilers other than gcc can run the tests. */ +#undef __UNUSED__ +#if defined(__GNUC__) +#define __UNUSED__ __attribute__((__unused__)) +#define __STDCALL__ __attribute__((stdcall)) +#define __THISCALL__ __attribute__((thiscall)) +#define __FASTCALL__ __attribute__((fastcall)) +#define __MSABI__ __attribute__((ms_abi)) +#else +#define __UNUSED__ +#define __STDCALL__ __stdcall +#define __THISCALL__ __thiscall +#define __FASTCALL__ __fastcall +#endif + +#ifndef ABI_NUM +#define ABI_NUM FFI_DEFAULT_ABI +#define ABI_ATTR +#endif + +/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a + file open. */ +#ifdef HAVE_MMAP_ANON +# undef HAVE_MMAP_DEV_ZERO + +# include <sys/mman.h> +# ifndef MAP_FAILED +# define MAP_FAILED -1 +# endif +# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) +# define MAP_ANONYMOUS MAP_ANON +# endif +# define USING_MMAP + +#endif + +#ifdef HAVE_MMAP_DEV_ZERO + +# include <sys/mman.h> +# ifndef MAP_FAILED +# define MAP_FAILED -1 +# endif +# define USING_MMAP + +#endif + +/* MinGW kludge. */ +#if defined(_WIN64) | defined(_WIN32) +#define PRIdLL "I64d" +#define PRIuLL "I64u" +#else +#define PRIdLL "lld" +#define PRIuLL "llu" +#endif + +/* Tru64 UNIX kludge. */ +#if defined(__alpha__) && defined(__osf__) +/* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ +#undef PRIdLL +#define PRIdLL "ld" +#undef PRIuLL +#define PRIuLL "lu" +#define PRId8 "hd" +#define PRIu8 "hu" +#define PRId64 "ld" +#define PRIu64 "lu" +#define PRIuPTR "lu" +#endif + +/* PA HP-UX kludge. */ +#if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) +#define PRIuPTR "lu" +#endif + +/* IRIX kludge. */ +#if defined(__sgi) +/* IRIX 6.5 <inttypes.h> provides all definitions, but only for C99 + compilations. */ +#define PRId8 "hhd" +#define PRIu8 "hhu" +#if (_MIPS_SZLONG == 32) +#define PRId64 "lld" +#define PRIu64 "llu" +#endif +/* This doesn't match <inttypes.h>, which always has "lld" here, but the + arguments are uint64_t, int64_t, which are unsigned long, long for + 64-bit in <sgidefs.h>. */ +#if (_MIPS_SZLONG == 64) +#define PRId64 "ld" +#define PRIu64 "lu" +#endif +/* This doesn't match <inttypes.h>, which has "u" here, but the arguments + are uintptr_t, which is always unsigned long. */ +#define PRIuPTR "lu" +#endif + +/* Solaris < 10 kludge. */ +#if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) +#if defined(__arch64__) || defined (__x86_64__) +#define PRIuPTR "lu" +#else +#define PRIuPTR "u" +#endif +#endif + +/* MSVC kludge. */ +#if defined _MSC_VER +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) +#define PRIuPTR "lu" +#define PRIu8 "u" +#define PRId8 "d" +#define PRIu64 "I64u" +#define PRId64 "I64d" +#endif +#endif + +#ifndef PRIuPTR +#define PRIuPTR "u" +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float.c new file mode 100644 index 000000000000..fbc272d84f1f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float.c @@ -0,0 +1,59 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static int floating(int a, float b, double c, long double d) +{ + int i; + + i = (int) ((float)a/b + ((float)c/(float)d)); + + return i; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + + float f; + signed int si1; + double d; + long double ld; + + args[0] = &ffi_type_sint; + values[0] = &si1; + args[1] = &ffi_type_float; + values[1] = &f; + args[2] = &ffi_type_double; + values[2] = &d; + args[3] = &ffi_type_longdouble; + values[3] = &ld; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_sint, args) == FFI_OK); + + si1 = 6; + f = 3.14159; + d = (double)1.0/(double)3.0; + ld = 2.71828182846L; + + floating (si1, f, d, ld); + + ffi_call(&cif, FFI_FN(floating), &rint, values); + + printf ("%d vs %d\n", (int)rint, floating (si1, f, d, ld)); + + CHECK((int)rint == floating(si1, f, d, ld)); + + exit (0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float1.c new file mode 100644 index 000000000000..c48493c6b227 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float1.c @@ -0,0 +1,60 @@ +/* Area: ffi_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +#include "float.h" + +#include <math.h> + +typedef union +{ + double d; + unsigned char c[sizeof (double)]; +} value_type; + +#define CANARY 0xba + +static double dblit(float f) +{ + return f/3.0; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float f; + value_type result[2]; + unsigned int i; + + args[0] = &ffi_type_float; + values[0] = &f; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_double, args) == FFI_OK); + + f = 3.14159; + + /* Put a canary in the return array. This is a regression test for + a buffer overrun. */ + memset(result[1].c, CANARY, sizeof (double)); + + ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); + + /* These are not always the same!! Check for a reasonable delta */ + + CHECK(fabs(result[0].d - dblit(f)) < DBL_EPSILON); + + /* Check the canary. */ + for (i = 0; i < sizeof (double); ++i) + CHECK(result[1].c[i] == CANARY); + + exit(0); + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float2.c new file mode 100644 index 000000000000..57cd9e30f928 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float2.c @@ -0,0 +1,61 @@ +/* Area: ffi_call + Purpose: Check return value long double. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ +/* { dg-do run } */ + +#include "ffitest.h" +#include "float.h" + +#include <math.h> + +static long double ldblit(float f) +{ + return (long double) (((long double) f)/ (long double) 3.0); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float f; + long double ld; + long double original; + + args[0] = &ffi_type_float; + values[0] = &f; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_longdouble, args) == FFI_OK); + + f = 3.14159; + +#if defined(__sun) && defined(__GNUC__) + /* long double support under SunOS/gcc is pretty much non-existent. + You'll get the odd bus error in library routines like printf() */ +#else + printf ("%Lf\n", ldblit(f)); +#endif + + ld = 666; + ffi_call(&cif, FFI_FN(ldblit), &ld, values); + +#if defined(__sun) && defined(__GNUC__) + /* long double support under SunOS/gcc is pretty much non-existent. + You'll get the odd bus error in library routines like printf() */ +#else + printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON); +#endif + + /* These are not always the same!! Check for a reasonable delta */ + original = ldblit(f); + if (((ld > original) ? (ld - original) : (original - ld)) < LDBL_EPSILON) + puts("long double return value tests ok!"); + else + CHECK(0); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float3.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float3.c new file mode 100644 index 000000000000..bab3206a174f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float3.c @@ -0,0 +1,74 @@ +/* Area: ffi_call + Purpose: Check float arguments with different orders. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ + +#include "ffitest.h" +#include "float.h" + +#include <math.h> + +static double floating_1(float a, double b, long double c) +{ + return (double) a + b + (double) c; +} + +static double floating_2(long double a, double b, float c) +{ + return (double) a + b + (double) c; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double rd; + + float f; + double d; + long double ld; + + args[0] = &ffi_type_float; + values[0] = &f; + args[1] = &ffi_type_double; + values[1] = &d; + args[2] = &ffi_type_longdouble; + values[2] = &ld; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_double, args) == FFI_OK); + + f = 3.14159; + d = (double)1.0/(double)3.0; + ld = 2.71828182846L; + + floating_1 (f, d, ld); + + ffi_call(&cif, FFI_FN(floating_1), &rd, values); + + CHECK(fabs(rd - floating_1(f, d, ld)) < DBL_EPSILON); + + args[0] = &ffi_type_longdouble; + values[0] = &ld; + args[1] = &ffi_type_double; + values[1] = &d; + args[2] = &ffi_type_float; + values[2] = &f; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_double, args) == FFI_OK); + + floating_2 (ld, d, f); + + ffi_call(&cif, FFI_FN(floating_2), &rd, values); + + CHECK(fabs(rd - floating_2(ld, d, f)) < DBL_EPSILON); + + exit (0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float4.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float4.c new file mode 100644 index 000000000000..0dd6d85e7aa0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float4.c @@ -0,0 +1,62 @@ +/* Area: ffi_call + Purpose: Check denorm double value. + Limitations: none. + PR: PR26483. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +/* { dg-options "-mieee" { target alpha*-*-* } } */ + +#include "ffitest.h" +#include "float.h" + +typedef union +{ + double d; + unsigned char c[sizeof (double)]; +} value_type; + +#define CANARY 0xba + +static double dblit(double d) +{ + return d; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double d; + value_type result[2]; + unsigned int i; + + args[0] = &ffi_type_double; + values[0] = &d; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_double, args) == FFI_OK); + + d = DBL_MIN / 2; + + /* Put a canary in the return array. This is a regression test for + a buffer overrun. */ + memset(result[1].c, CANARY, sizeof (double)); + + ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); + + /* The standard delta check doesn't work for denorms. Since we didn't do + any arithmetic, we should get the original result back, and hence an + exact check should be OK here. */ + + CHECK(result[0].d == dblit(d)); + + /* Check the canary. */ + for (i = 0; i < sizeof (double); ++i) + CHECK(result[1].c[i] == CANARY); + + exit(0); + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c new file mode 100644 index 000000000000..5acff91f6633 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c @@ -0,0 +1,107 @@ +/* Area: fp and variadics + Purpose: check fp inputs and returns work on variadics, even the fixed params + Limitations: None + PR: none + Originator: <david.gilbert@linaro.org> 2011-01-25 + + Intended to stress the difference in ABI on ARM vfp +*/ + +/* { dg-do run } */ + +#include <stdarg.h> + +#include "ffitest.h" + +/* prints out all the parameters, and returns the sum of them all. + * 'x' is the number of variadic parameters all of which are double in this test + */ +double float_va_fn(unsigned int x, double y,...) +{ + double total=0.0; + va_list ap; + unsigned int i; + + total+=(double)x; + total+=y; + + printf("%u: %.1f :", x, y); + + va_start(ap, y); + for(i=0;i<x;i++) + { + double arg=va_arg(ap, double); + total+=arg; + printf(" %d:%.1f ", i, arg); + } + va_end(ap); + + printf(" total: %.1f\n", total); + + return total; +} + +int main (void) +{ + ffi_cif cif; + + ffi_type *arg_types[5]; + void *values[5]; + double doubles[5]; + unsigned int firstarg; + double resfp; + + /* First test, pass float_va_fn(0,2.0) - note there are no actual + * variadic parameters, but it's declared variadic so the ABI may be + * different. */ + /* Call it statically and then via ffi */ + resfp=float_va_fn(0,2.0); + /* { dg-output "0: 2.0 : total: 2.0" } */ + printf("compiled: %.1f\n", resfp); + /* { dg-output "\ncompiled: 2.0" } */ + + arg_types[0] = &ffi_type_uint; + arg_types[1] = &ffi_type_double; + arg_types[2] = NULL; + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 2, 2, + &ffi_type_double, arg_types) == FFI_OK); + + firstarg = 0; + doubles[0] = 2.0; + values[0] = &firstarg; + values[1] = &doubles[0]; + ffi_call(&cif, FFI_FN(float_va_fn), &resfp, values); + /* { dg-output "\n0: 2.0 : total: 2.0" } */ + printf("ffi: %.1f\n", resfp); + /* { dg-output "\nffi: 2.0" } */ + + /* Second test, float_va_fn(2,2.0,3.0,4.0), now with variadic params */ + /* Call it statically and then via ffi */ + resfp=float_va_fn(2,2.0,3.0,4.0); + /* { dg-output "\n2: 2.0 : 0:3.0 1:4.0 total: 11.0" } */ + printf("compiled: %.1f\n", resfp); + /* { dg-output "\ncompiled: 11.0" } */ + + arg_types[0] = &ffi_type_uint; + arg_types[1] = &ffi_type_double; + arg_types[2] = &ffi_type_double; + arg_types[3] = &ffi_type_double; + arg_types[4] = NULL; + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 2, 4, + &ffi_type_double, arg_types) == FFI_OK); + + firstarg = 2; + doubles[0] = 2.0; + doubles[1] = 3.0; + doubles[2] = 4.0; + values[0] = &firstarg; + values[1] = &doubles[0]; + values[2] = &doubles[1]; + values[3] = &doubles[2]; + ffi_call(&cif, FFI_FN(float_va_fn), &resfp, values); + /* { dg-output "\n2: 2.0 : 0:3.0 1:4.0 total: 11.0" } */ + printf("ffi: %.1f\n", resfp); + /* { dg-output "\nffi: 11.0" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many.c new file mode 100644 index 000000000000..336968c77a2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many.c @@ -0,0 +1,59 @@ +/* Area: ffi_call + Purpose: Check return value float, with many arguments + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +#include <stdlib.h> +#include <float.h> +#include <math.h> + +static float ABI_ATTR many(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9, float f10, float f11, float f12, float f13) +{ +#if 0 + printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n", + (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, + (double) f6, (double) f7, (double) f8, (double) f9, (double) f10, + (double) f11, (double) f12, (double) f13); +#endif + + return f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[13]; + void *values[13]; + float fa[13]; + float f, ff; + int i; + + for (i = 0; i < 13; i++) + { + args[i] = &ffi_type_float; + values[i] = &fa[i]; + fa[i] = (float) i; + } + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 13, + &ffi_type_float, args) == FFI_OK); + + ffi_call(&cif, FFI_FN(many), &f, values); + + ff = many(fa[0], fa[1], + fa[2], fa[3], + fa[4], fa[5], + fa[6], fa[7], + fa[8], fa[9], + fa[10],fa[11],fa[12]); + + if (fabs(f - ff) < FLT_EPSILON) + exit(0); + else + abort(); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many2.c new file mode 100644 index 000000000000..1c85746e4c4b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many2.c @@ -0,0 +1,57 @@ +/* Area: ffi_call + Purpose: Check uint8_t arguments. + Limitations: none. + PR: PR45677. + Originator: Dan Witte <dwitte@gmail.com> 20100916 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +#define NARGS 7 + +typedef unsigned char u8; + +#ifdef __GNUC__ +__attribute__((noinline)) +#endif +uint8_t +foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d, + uint8_t e, uint8_t f, uint8_t g) +{ + return a + b + c + d + e + f + g; +} + +uint8_t ABI_ATTR +bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d, + uint8_t e, uint8_t f, uint8_t g) +{ + return foo (a, b, c, d, e, f, g); +} + +int +main (void) +{ + ffi_type *ffitypes[NARGS]; + int i; + ffi_cif cif; + ffi_arg result = 0; + uint8_t args[NARGS]; + void *argptrs[NARGS]; + + for (i = 0; i < NARGS; ++i) + ffitypes[i] = &ffi_type_uint8; + + CHECK (ffi_prep_cif (&cif, ABI_NUM, NARGS, + &ffi_type_uint8, ffitypes) == FFI_OK); + + for (i = 0; i < NARGS; ++i) + { + args[i] = i; + argptrs[i] = &args[i]; + } + ffi_call (&cif, FFI_FN (bar), &result, argptrs); + + CHECK (result == 21); + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c new file mode 100644 index 000000000000..4ef8c8ab28b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c @@ -0,0 +1,70 @@ +/* Area: ffi_call + Purpose: Check return value double, with many arguments + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +#include <stdlib.h> +#include <float.h> +#include <math.h> + +static double many(double f1, + double f2, + double f3, + double f4, + double f5, + double f6, + double f7, + double f8, + double f9, + double f10, + double f11, + double f12, + double f13) +{ +#if 0 + printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n", + (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, + (double) f6, (double) f7, (double) f8, (double) f9, (double) f10, + (double) f11, (double) f12, (double) f13); +#endif + + return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[13]; + void *values[13]; + double fa[13]; + double f, ff; + int i; + + for (i = 0; i < 13; i++) + { + args[i] = &ffi_type_double; + values[i] = &fa[i]; + fa[i] = (double) i; + } + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, + &ffi_type_double, args) == FFI_OK); + + ffi_call(&cif, FFI_FN(many), &f, values); + + ff = many(fa[0], fa[1], + fa[2], fa[3], + fa[4], fa[5], + fa[6], fa[7], + fa[8], fa[9], + fa[10],fa[11],fa[12]); + if (fabs(f - ff) < FLT_EPSILON) + exit(0); + else + abort(); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c new file mode 100644 index 000000000000..85ec36ecbefa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c @@ -0,0 +1,78 @@ +/* Area: ffi_call + Purpose: Check return value double, with many arguments + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +#include <stdlib.h> +#include <float.h> +#include <math.h> + +static double many(double f1, + double f2, + long int i1, + double f3, + double f4, + long int i2, + double f5, + double f6, + long int i3, + double f7, + double f8, + long int i4, + double f9, + double f10, + long int i5, + double f11, + double f12, + long int i6, + double f13) +{ + return ((double) (i1 + i2 + i3 + i4 + i5 + i6) + (f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[19]; + void *values[19]; + double fa[19]; + long int la[19]; + double f, ff; + int i; + + for (i = 0; i < 19; i++) + { + if( (i - 2) % 3 == 0) { + args[i] = &ffi_type_slong; + la[i] = (long int) i; + values[i] = &la[i]; + } + else { + args[i] = &ffi_type_double; + fa[i] = (double) i; + values[i] = &fa[i]; + } + } + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 19, + &ffi_type_double, args) == FFI_OK); + + ffi_call(&cif, FFI_FN(many), &f, values); + + ff = many(fa[0], fa[1], la[2], + fa[3], fa[4], la[5], + fa[6], fa[7], la[8], + fa[9], fa[10], la[11], + fa[12], fa[13], la[14], + fa[15], fa[16], la[17], + fa[18]); + if (fabs(f - ff) < FLT_EPSILON) + exit(0); + else + abort(); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/negint.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/negint.c new file mode 100644 index 000000000000..6e2f26fc100e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/negint.c @@ -0,0 +1,52 @@ +/* Area: ffi_call + Purpose: Check that negative integers are passed correctly. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static int checking(int a, short b, signed char c) +{ + + return (a < 0 && b < 0 && c < 0); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + + signed int si; + signed short ss; + signed char sc; + + args[0] = &ffi_type_sint; + values[0] = &si; + args[1] = &ffi_type_sshort; + values[1] = &ss; + args[2] = &ffi_type_schar; + values[2] = &sc; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_sint, args) == FFI_OK); + + si = -6; + ss = -12; + sc = -1; + + checking (si, ss, sc); + + ffi_call(&cif, FFI_FN(checking), &rint, values); + + printf ("%d vs %d\n", (int)rint, checking (si, ss, sc)); + + CHECK(rint != 0); + + exit (0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c new file mode 100644 index 000000000000..23d88b35d565 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c @@ -0,0 +1,46 @@ +/* Area: Struct layout + Purpose: Test ffi_get_struct_offsets + Limitations: none. + PR: none. + Originator: Tom Tromey. */ + +/* { dg-do run } */ +#include "ffitest.h" +#include <stddef.h> + +struct test_1 +{ + char c; + float f; + char c2; + int i; +}; + +int +main (void) +{ + ffi_type test_1_type; + ffi_type *test_1_elements[5]; + size_t test_1_offsets[4]; + + test_1_elements[0] = &ffi_type_schar; + test_1_elements[1] = &ffi_type_float; + test_1_elements[2] = &ffi_type_schar; + test_1_elements[3] = &ffi_type_sint; + test_1_elements[4] = NULL; + + test_1_type.size = 0; + test_1_type.alignment = 0; + test_1_type.type = FFI_TYPE_STRUCT; + test_1_type.elements = test_1_elements; + + CHECK (ffi_get_struct_offsets (FFI_DEFAULT_ABI, &test_1_type, test_1_offsets) + == FFI_OK); + CHECK (test_1_type.size == sizeof (struct test_1)); + CHECK (offsetof (struct test_1, c) == test_1_offsets[0]); + CHECK (offsetof (struct test_1, f) == test_1_offsets[1]); + CHECK (offsetof (struct test_1, c2) == test_1_offsets[2]); + CHECK (offsetof (struct test_1, i) == test_1_offsets[3]); + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c new file mode 100644 index 000000000000..7da1621cd663 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c @@ -0,0 +1,127 @@ +/* Area: ffi_call + Purpose: Reproduce bug found in python ctypes + Limitations: none. + PR: Fedora 1174037 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct { + long x; + long y; +} POINT; + +typedef struct { + long left; + long top; + long right; + long bottom; +} RECT; + +static RECT ABI_ATTR pr_test(int i __UNUSED__, RECT ar __UNUSED__, + RECT* br __UNUSED__, POINT cp __UNUSED__, + RECT dr __UNUSED__, RECT *er __UNUSED__, + POINT fp, RECT gr __UNUSED__) +{ + RECT result; + + result.left = fp.x; + result.right = fp.y; + result.top = fp.x; + result.bottom = fp.y; + + return result; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type point_type, rect_type; + ffi_type *point_type_elements[3]; + ffi_type *rect_type_elements[5]; + + int i; + POINT cp, fp; + RECT ar, br, dr, er, gr; + RECT *p1, *p2; + + /* This is a hack to get a properly aligned result buffer */ + RECT *rect_result = + (RECT *) malloc (sizeof(RECT)); + + point_type.size = 0; + point_type.alignment = 0; + point_type.type = FFI_TYPE_STRUCT; + point_type.elements = point_type_elements; + point_type_elements[0] = &ffi_type_slong; + point_type_elements[1] = &ffi_type_slong; + point_type_elements[2] = NULL; + + rect_type.size = 0; + rect_type.alignment = 0; + rect_type.type = FFI_TYPE_STRUCT; + rect_type.elements = rect_type_elements; + rect_type_elements[0] = &ffi_type_slong; + rect_type_elements[1] = &ffi_type_slong; + rect_type_elements[2] = &ffi_type_slong; + rect_type_elements[3] = &ffi_type_slong; + rect_type_elements[4] = NULL; + + args[0] = &ffi_type_sint; + args[1] = &rect_type; + args[2] = &ffi_type_pointer; + args[3] = &point_type; + args[4] = &rect_type; + args[5] = &ffi_type_pointer; + args[6] = &point_type; + args[7] = &rect_type; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 8, &rect_type, args) == FFI_OK); + + i = 1; + ar.left = 2; + ar.right = 3; + ar.top = 4; + ar.bottom = 5; + br.left = 6; + br.right = 7; + br.top = 8; + br.bottom = 9; + cp.x = 10; + cp.y = 11; + dr.left = 12; + dr.right = 13; + dr.top = 14; + dr.bottom = 15; + er.left = 16; + er.right = 17; + er.top = 18; + er.bottom = 19; + fp.x = 20; + fp.y = 21; + gr.left = 22; + gr.right = 23; + gr.top = 24; + gr.bottom = 25; + + values[0] = &i; + values[1] = &ar; + p1 = &br; + values[2] = &p1; + values[3] = &cp; + values[4] = &dr; + p2 = &er; + values[5] = &p2; + values[6] = &fp; + values[7] = &gr; + + ffi_call (&cif, FFI_FN(pr_test), rect_result, values); + + CHECK(rect_result->top == 20); + + free (rect_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c new file mode 100644 index 000000000000..44561615dd42 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c @@ -0,0 +1,59 @@ +/* Area: ffi_call + Purpose: Promotion test. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +static int promotion(signed char sc, signed short ss, + unsigned char uc, unsigned short us) +{ + int r = (int) sc + (int) ss + (int) uc + (int) us; + + return r; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + signed char sc; + unsigned char uc; + signed short ss; + unsigned short us; + unsigned long ul; + + args[0] = &ffi_type_schar; + args[1] = &ffi_type_sshort; + args[2] = &ffi_type_uchar; + args[3] = &ffi_type_ushort; + values[0] = &sc; + values[1] = &ss; + values[2] = &uc; + values[3] = &us; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_sint, args) == FFI_OK); + + us = 0; + ul = 0; + + for (sc = (signed char) -127; + sc <= (signed char) 120; sc += 1) + for (ss = -30000; ss <= 30000; ss += 10000) + for (uc = (unsigned char) 0; + uc <= (unsigned char) 200; uc += 20) + for (us = 0; us <= 60000; us += 10000) + { + ul++; + ffi_call(&cif, FFI_FN(promotion), &rint, values); + CHECK((int)rint == (signed char) sc + (signed short) ss + + (unsigned char) uc + (unsigned short) us); + } + printf("%lu promotion tests run\n", ul); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c new file mode 100644 index 000000000000..e29bd6c28368 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c @@ -0,0 +1,114 @@ +/* Area: ffi_call + Purpose: Check different structures. + Limitations: none. + PR: none. + Originator: Ronald Oussoren <oussoren@cistron.nl> 20030824 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct Point { + float x; + float y; +} Point; + +typedef struct Size { + float h; + float w; +} Size; + +typedef struct Rect { + Point o; + Size s; +} Rect; + +int doit(int o, char* s, Point p, Rect r, int last) +{ + printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", + o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last); + return 42; +} + + +int main(void) +{ + ffi_type point_type; + ffi_type size_type; + ffi_type rect_type; + ffi_cif cif; + ffi_type* arglist[6]; + void* values[6]; + int r; + + /* + * First set up FFI types for the 3 struct types + */ + + point_type.size = 0; /*sizeof(Point);*/ + point_type.alignment = 0; /*__alignof__(Point);*/ + point_type.type = FFI_TYPE_STRUCT; + point_type.elements = malloc(3 * sizeof(ffi_type*)); + point_type.elements[0] = &ffi_type_float; + point_type.elements[1] = &ffi_type_float; + point_type.elements[2] = NULL; + + size_type.size = 0;/* sizeof(Size);*/ + size_type.alignment = 0;/* __alignof__(Size);*/ + size_type.type = FFI_TYPE_STRUCT; + size_type.elements = malloc(3 * sizeof(ffi_type*)); + size_type.elements[0] = &ffi_type_float; + size_type.elements[1] = &ffi_type_float; + size_type.elements[2] = NULL; + + rect_type.size = 0;/*sizeof(Rect);*/ + rect_type.alignment =0;/* __alignof__(Rect);*/ + rect_type.type = FFI_TYPE_STRUCT; + rect_type.elements = malloc(3 * sizeof(ffi_type*)); + rect_type.elements[0] = &point_type; + rect_type.elements[1] = &size_type; + rect_type.elements[2] = NULL; + + /* + * Create a CIF + */ + arglist[0] = &ffi_type_sint; + arglist[1] = &ffi_type_pointer; + arglist[2] = &point_type; + arglist[3] = &rect_type; + arglist[4] = &ffi_type_sint; + arglist[5] = NULL; + + r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, + 5, &ffi_type_sint, arglist); + if (r != FFI_OK) { + abort(); + } + + + /* And call the function through the CIF */ + + { + Point p = { 1.0, 2.0 }; + Rect r = { { 9.0, 10.0}, { -1.0, -2.0 } }; + int o = 0; + int l = 42; + char* m = "myMethod"; + ffi_arg result; + + values[0] = &o; + values[1] = &m; + values[2] = &p; + values[3] = &r; + values[4] = &l; + values[5] = NULL; + + printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", + o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l); + + ffi_call(&cif, FFI_FN(doit), &result, values); + + printf ("The result is %d\n", (int)result); + + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c new file mode 100644 index 000000000000..fd07e501794d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c @@ -0,0 +1,36 @@ +/* Area: ffi_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static double return_dbl(double dbl) +{ + printf ("%f\n", dbl); + return 2 * dbl; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double dbl, rdbl; + + args[0] = &ffi_type_double; + values[0] = &dbl; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_double, args) == FFI_OK); + + for (dbl = -127.3; dbl < 127; dbl++) + { + ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); + printf ("%f vs %f\n", rdbl, return_dbl(dbl)); + CHECK(rdbl == 2 * dbl); + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c new file mode 100644 index 000000000000..0ea5d50551af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c @@ -0,0 +1,43 @@ +/* Area: ffi_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static double return_dbl(double dbl1, float fl2, unsigned int in3, double dbl4) +{ + return dbl1 + fl2 + in3 + dbl4; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double dbl1, dbl4, rdbl; + float fl2; + unsigned int in3; + args[0] = &ffi_type_double; + args[1] = &ffi_type_float; + args[2] = &ffi_type_uint; + args[3] = &ffi_type_double; + values[0] = &dbl1; + values[1] = &fl2; + values[2] = &in3; + values[3] = &dbl4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_double, args) == FFI_OK); + dbl1 = 127.0; + fl2 = 128.0; + in3 = 255; + dbl4 = 512.7; + + ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); + printf ("%f vs %f\n", rdbl, return_dbl(dbl1, fl2, in3, dbl4)); + CHECK(rdbl == dbl1 + fl2 + in3 + dbl4); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c new file mode 100644 index 000000000000..b3818f866b5d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c @@ -0,0 +1,42 @@ +/* Area: ffi_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static double return_dbl(double dbl1, double dbl2, unsigned int in3, double dbl4) +{ + return dbl1 + dbl2 + in3 + dbl4; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double dbl1, dbl2, dbl4, rdbl; + unsigned int in3; + args[0] = &ffi_type_double; + args[1] = &ffi_type_double; + args[2] = &ffi_type_uint; + args[3] = &ffi_type_double; + values[0] = &dbl1; + values[1] = &dbl2; + values[2] = &in3; + values[3] = &dbl4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_double, args) == FFI_OK); + dbl1 = 127.0; + dbl2 = 128.0; + in3 = 255; + dbl4 = 512.7; + + ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); + printf ("%f vs %f\n", rdbl, return_dbl(dbl1, dbl2, in3, dbl4)); + CHECK(rdbl == dbl1 + dbl2 + in3 + dbl4); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c new file mode 100644 index 000000000000..fb8a09e32ab4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c @@ -0,0 +1,35 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static float return_fl(float fl) +{ + return 2 * fl; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float fl, rfl; + + args[0] = &ffi_type_float; + values[0] = &fl; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_float, args) == FFI_OK); + + for (fl = -127.0; fl < 127; fl++) + { + ffi_call(&cif, FFI_FN(return_fl), &rfl, values); + printf ("%f vs %f\n", rfl, return_fl(fl)); + CHECK(rfl == 2 * fl); + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c new file mode 100644 index 000000000000..c3d92c283d0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c @@ -0,0 +1,36 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static float return_fl(float fl1, float fl2) +{ + return fl1 + fl2; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float fl1, fl2, rfl; + + args[0] = &ffi_type_float; + args[1] = &ffi_type_float; + values[0] = &fl1; + values[1] = &fl2; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_float, args) == FFI_OK); + fl1 = 127.0; + fl2 = 128.0; + + ffi_call(&cif, FFI_FN(return_fl), &rfl, values); + printf ("%f vs %f\n", rfl, return_fl(fl1, fl2)); + CHECK(rfl == fl1 + fl2); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c new file mode 100644 index 000000000000..ddb976cc2bbc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c @@ -0,0 +1,49 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +/* Use volatile float to avoid false negative on ix86. See PR target/323. */ +static float return_fl(float fl1, float fl2, float fl3, float fl4) +{ + volatile float sum; + + sum = fl1 + fl2 + fl3 + fl4; + return sum; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float fl1, fl2, fl3, fl4, rfl; + volatile float sum; + + args[0] = &ffi_type_float; + args[1] = &ffi_type_float; + args[2] = &ffi_type_float; + args[3] = &ffi_type_float; + values[0] = &fl1; + values[1] = &fl2; + values[2] = &fl3; + values[3] = &fl4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_float, args) == FFI_OK); + fl1 = 127.0; + fl2 = 128.0; + fl3 = 255.1; + fl4 = 512.7; + + ffi_call(&cif, FFI_FN(return_fl), &rfl, values); + printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, fl3, fl4)); + + sum = fl1 + fl2 + fl3 + fl4; + CHECK(rfl == sum); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c new file mode 100644 index 000000000000..c37877b18ec8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c @@ -0,0 +1,42 @@ +/* Area: ffi_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050212 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static float return_fl(float fl1, float fl2, unsigned int in3, float fl4) +{ + return fl1 + fl2 + in3 + fl4; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + float fl1, fl2, fl4, rfl; + unsigned int in3; + args[0] = &ffi_type_float; + args[1] = &ffi_type_float; + args[2] = &ffi_type_uint; + args[3] = &ffi_type_float; + values[0] = &fl1; + values[1] = &fl2; + values[2] = &in3; + values[3] = &fl4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_float, args) == FFI_OK); + fl1 = 127.0; + fl2 = 128.0; + in3 = 255; + fl4 = 512.7; + + ffi_call(&cif, FFI_FN(return_fl), &rfl, values); + printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, in3, fl4)); + CHECK(rfl == fl1 + fl2 + in3 + fl4); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c new file mode 100644 index 000000000000..52a92fe0711c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c @@ -0,0 +1,34 @@ +/* Area: ffi_call + Purpose: Check return value long double. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20071113 */ +/* { dg-do run } */ + +#include "ffitest.h" + +static long double return_ldl(long double ldl) +{ + return 2*ldl; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + long double ldl, rldl; + + args[0] = &ffi_type_longdouble; + values[0] = &ldl; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_longdouble, args) == FFI_OK); + + for (ldl = -127.0; ldl < 127.0; ldl++) + { + ffi_call(&cif, FFI_FN(return_ldl), &rldl, values); + CHECK(rldl == 2 * ldl); + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c new file mode 100644 index 000000000000..ea4a1e44780c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c @@ -0,0 +1,41 @@ +/* Area: ffi_call + Purpose: Check return value long long. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +static long long return_ll(long long ll) +{ + return ll; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + long long rlonglong; + long long ll; + + args[0] = &ffi_type_sint64; + values[0] = &ll; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_sint64, args) == FFI_OK); + + for (ll = 0LL; ll < 100LL; ll++) + { + ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); + CHECK(rlonglong == ll); + } + + for (ll = 55555555555000LL; ll < 55555555555100LL; ll++) + { + ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); + CHECK(rlonglong == ll); + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c new file mode 100644 index 000000000000..593e8a307cec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c @@ -0,0 +1,43 @@ +/* Area: ffi_call + Purpose: Check if long long are passed in the corresponding regs on ppc. + Limitations: none. + PR: 20104. + Originator: <andreast@gcc.gnu.org> 20050222 */ + +/* { dg-do run } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" +static long long return_ll(int ll0, long long ll1, int ll2) +{ + return ll0 + ll1 + ll2; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + long long rlonglong; + long long ll1; + unsigned ll0, ll2; + + args[0] = &ffi_type_sint; + args[1] = &ffi_type_sint64; + args[2] = &ffi_type_sint; + values[0] = &ll0; + values[1] = &ll1; + values[2] = &ll2; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_sint64, args) == FFI_OK); + + ll0 = 11111111; + ll1 = 11111111111000LL; + ll2 = 11111111; + + ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); + printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2); + /* { dg-output "res: 11111133333222, 11111133333222" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c new file mode 100644 index 000000000000..a36cf3eb8803 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c @@ -0,0 +1,36 @@ +/* Area: ffi_call + Purpose: Check return value signed char. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +static signed char return_sc(signed char sc) +{ + return sc; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + signed char sc; + + args[0] = &ffi_type_schar; + values[0] = &sc; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_schar, args) == FFI_OK); + + for (sc = (signed char) -127; + sc < (signed char) 127; sc++) + { + ffi_call(&cif, FFI_FN(return_sc), &rint, values); + CHECK((signed char)rint == sc); + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c new file mode 100644 index 000000000000..f0fd345f7a89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c @@ -0,0 +1,38 @@ +/* Area: ffi_call + Purpose: Check if long as return type is handled correctly. + Limitations: none. + PR: none. + */ + +/* { dg-do run } */ +#include "ffitest.h" +static long return_sl(long l1, long l2) +{ + return l1 - l2; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg res; + unsigned long l1, l2; + + args[0] = &ffi_type_slong; + args[1] = &ffi_type_slong; + values[0] = &l1; + values[1] = &l2; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_slong, args) == FFI_OK); + + l1 = 1073741823L; + l2 = 1073741824L; + + ffi_call(&cif, FFI_FN(return_sl), &res, values); + printf("res: %ld, %ld\n", (long)res, l1 - l2); + /* { dg-output "res: -1, -1" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c new file mode 100644 index 000000000000..6fe554619d52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c @@ -0,0 +1,38 @@ +/* Area: ffi_call + Purpose: Check return value unsigned char. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +static unsigned char return_uc(unsigned char uc) +{ + return uc; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + + unsigned char uc; + + args[0] = &ffi_type_uchar; + values[0] = &uc; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uchar, args) == FFI_OK); + + for (uc = (unsigned char) '\x00'; + uc < (unsigned char) '\xff'; uc++) + { + ffi_call(&cif, FFI_FN(return_uc), &rint, values); + CHECK((unsigned char)rint == uc); + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c new file mode 100644 index 000000000000..12b266f0373d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c @@ -0,0 +1,38 @@ +/* Area: ffi_call + Purpose: Check if unsigned long as return type is handled correctly. + Limitations: none. + PR: none. + Originator: <kaffeetisch at gmx dot de> 20060724 */ + +/* { dg-do run } */ +#include "ffitest.h" +static unsigned long return_ul(unsigned long ul1, unsigned long ul2) +{ + return ul1 + ul2; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg res; + unsigned long ul1, ul2; + + args[0] = &ffi_type_ulong; + args[1] = &ffi_type_ulong; + values[0] = &ul1; + values[1] = &ul2; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_ulong, args) == FFI_OK); + + ul1 = 1073741823L; + ul2 = 1073741824L; + + ffi_call(&cif, FFI_FN(return_ul), &res, values); + printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2); + /* { dg-output "res: 2147483647, 2147483647" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c new file mode 100644 index 000000000000..35b70ea4e2e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c @@ -0,0 +1,44 @@ +/* Area: ffi_call + Purpose: Check strlen function call. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +static size_t ABI_ATTR my_strlen(char *s) +{ + return (strlen(s)); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + char *s; + + args[0] = &ffi_type_pointer; + values[0] = (void*) &s; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, + &ffi_type_sint, args) == FFI_OK); + + s = "a"; + ffi_call(&cif, FFI_FN(my_strlen), &rint, values); + CHECK(rint == 1); + + s = "1234567"; + ffi_call(&cif, FFI_FN(my_strlen), &rint, values); + CHECK(rint == 7); + + s = "1234567890123456789012345"; + ffi_call(&cif, FFI_FN(my_strlen), &rint, values); + CHECK(rint == 25); + + exit (0); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c new file mode 100644 index 000000000000..96282bc0a1fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c @@ -0,0 +1,49 @@ +/* Area: ffi_call + Purpose: Check strlen function call with additional arguments. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static size_t ABI_ATTR my_f(char *s, float a) +{ + return (size_t) ((int) strlen(s) + (int) a); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + char *s; + float v2; + args[0] = &ffi_type_pointer; + args[1] = &ffi_type_float; + values[0] = (void*) &s; + values[1] = (void*) &v2; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, + &ffi_type_sint, args) == FFI_OK); + + s = "a"; + v2 = 0.0; + ffi_call(&cif, FFI_FN(my_f), &rint, values); + CHECK(rint == 1); + + s = "1234567"; + v2 = -1.0; + ffi_call(&cif, FFI_FN(my_f), &rint, values); + CHECK(rint == 6); + + s = "1234567890123456789012345"; + v2 = 1.0; + ffi_call(&cif, FFI_FN(my_f), &rint, values); + CHECK(rint == 26); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c new file mode 100644 index 000000000000..beba86e9eacf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c @@ -0,0 +1,49 @@ +/* Area: ffi_call + Purpose: Check strlen function call with additional arguments. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static size_t ABI_ATTR my_f(float a, char *s) +{ + return (size_t) ((int) strlen(s) + (int) a); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + char *s; + float v2; + args[1] = &ffi_type_pointer; + args[0] = &ffi_type_float; + values[1] = (void*) &s; + values[0] = (void*) &v2; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, + &ffi_type_sint, args) == FFI_OK); + + s = "a"; + v2 = 0.0; + ffi_call(&cif, FFI_FN(my_f), &rint, values); + CHECK(rint == 1); + + s = "1234567"; + v2 = -1.0; + ffi_call(&cif, FFI_FN(my_f), &rint, values); + CHECK(rint == 6); + + s = "1234567890123456789012345"; + v2 = 1.0; + ffi_call(&cif, FFI_FN(my_f), &rint, values); + CHECK(rint == 26); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c new file mode 100644 index 000000000000..d5d42b4f6ddf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c @@ -0,0 +1,55 @@ +/* Area: ffi_call + Purpose: Check strlen function call with additional arguments. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static size_t ABI_ATTR my_f(float a, char *s, int i) +{ + return (size_t) ((int) strlen(s) + (int) a + i); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + char *s; + int v1; + float v2; + args[2] = &ffi_type_sint; + args[1] = &ffi_type_pointer; + args[0] = &ffi_type_float; + values[2] = (void*) &v1; + values[1] = (void*) &s; + values[0] = (void*) &v2; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 3, + &ffi_type_sint, args) == FFI_OK); + + s = "a"; + v1 = 1; + v2 = 0.0; + ffi_call(&cif, FFI_FN(my_f), &rint, values); + CHECK(rint == 2); + + s = "1234567"; + v2 = -1.0; + v1 = -2; + ffi_call(&cif, FFI_FN(my_f), &rint, values); + CHECK(rint == 4); + + s = "1234567890123456789012345"; + v2 = 1.0; + v1 = 2; + ffi_call(&cif, FFI_FN(my_f), &rint, values); + CHECK(rint == 28); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c new file mode 100644 index 000000000000..c13e23f87273 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c @@ -0,0 +1,67 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + unsigned char uc; + double d; + unsigned int ui; +} test_structure_1; + +static test_structure_1 ABI_ATTR struct1(test_structure_1 ts) +{ + ts.uc++; + ts.d--; + ts.ui++; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts1_type; + ffi_type *ts1_type_elements[4]; + + test_structure_1 ts1_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_1 *ts1_result = + (test_structure_1 *) malloc (sizeof(test_structure_1)); + + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + ts1_type_elements[0] = &ffi_type_uchar; + ts1_type_elements[1] = &ffi_type_double; + ts1_type_elements[2] = &ffi_type_uint; + ts1_type_elements[3] = NULL; + + args[0] = &ts1_type; + values[0] = &ts1_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, + &ts1_type, args) == FFI_OK); + + ts1_arg.uc = '\x01'; + ts1_arg.d = 3.14159; + ts1_arg.ui = 555; + + ffi_call(&cif, FFI_FN(struct1), ts1_result, values); + + CHECK(ts1_result->ui == 556); + CHECK(ts1_result->d == 3.14159 - 1); + + free (ts1_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c new file mode 100644 index 000000000000..17b137742412 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c @@ -0,0 +1,57 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: Sergei Trofimovich <slyfox@gentoo.org> + + The test originally discovered in ruby's bindings + for ffi in https://bugs.gentoo.org/634190 */ + +/* { dg-do run } */ +#include "ffitest.h" + +struct s { + int s32; + float f32; + signed char s8; +}; + +struct s make_s(void) { + struct s r; + r.s32 = 0x1234; + r.f32 = 7.0; + r.s8 = 0x78; + return r; +} + +int main() { + ffi_cif cif; + struct s r; + ffi_type rtype; + ffi_type* s_fields[] = { + &ffi_type_sint, + &ffi_type_float, + &ffi_type_schar, + NULL, + }; + + rtype.size = 0; + rtype.alignment = 0, + rtype.type = FFI_TYPE_STRUCT, + rtype.elements = s_fields, + + r.s32 = 0xbad; + r.f32 = 999.999; + r.s8 = 0x51; + + // Here we emulate the following call: + //r = make_s(); + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &rtype, NULL) == FFI_OK); + ffi_call(&cif, FFI_FN(make_s), &r, NULL); + + CHECK(r.s32 == 0x1234); + CHECK(r.f32 == 7.0); + CHECK(r.s8 == 0x78); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c new file mode 100644 index 000000000000..5077a5ee45a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c @@ -0,0 +1,67 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + double d1; + double d2; +} test_structure_2; + +static test_structure_2 ABI_ATTR struct2(test_structure_2 ts) +{ + ts.d1--; + ts.d2--; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + test_structure_2 ts2_arg; + ffi_type ts2_type; + ffi_type *ts2_type_elements[3]; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_2 *ts2_result = + (test_structure_2 *) malloc (sizeof(test_structure_2)); + + ts2_type.size = 0; + ts2_type.alignment = 0; + ts2_type.type = FFI_TYPE_STRUCT; + ts2_type.elements = ts2_type_elements; + ts2_type_elements[0] = &ffi_type_double; + ts2_type_elements[1] = &ffi_type_double; + ts2_type_elements[2] = NULL; + + args[0] = &ts2_type; + values[0] = &ts2_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts2_type, args) == FFI_OK); + + ts2_arg.d1 = 5.55; + ts2_arg.d2 = 6.66; + + printf ("%g\n", ts2_arg.d1); + printf ("%g\n", ts2_arg.d2); + + ffi_call(&cif, FFI_FN(struct2), ts2_result, values); + + printf ("%g\n", ts2_result->d1); + printf ("%g\n", ts2_result->d2); + + CHECK(ts2_result->d1 == 5.55 - 1); + CHECK(ts2_result->d2 == 6.66 - 1); + + free (ts2_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c new file mode 100644 index 000000000000..7eba0ead6d6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c @@ -0,0 +1,60 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + int si; +} test_structure_3; + +static test_structure_3 ABI_ATTR struct3(test_structure_3 ts) +{ + ts.si = -(ts.si*2); + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + int compare_value; + ffi_type ts3_type; + ffi_type *ts3_type_elements[2]; + + test_structure_3 ts3_arg; + test_structure_3 *ts3_result = + (test_structure_3 *) malloc (sizeof(test_structure_3)); + + ts3_type.size = 0; + ts3_type.alignment = 0; + ts3_type.type = FFI_TYPE_STRUCT; + ts3_type.elements = ts3_type_elements; + ts3_type_elements[0] = &ffi_type_sint; + ts3_type_elements[1] = NULL; + + args[0] = &ts3_type; + values[0] = &ts3_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, + &ts3_type, args) == FFI_OK); + + ts3_arg.si = -123; + compare_value = ts3_arg.si; + + ffi_call(&cif, FFI_FN(struct3), ts3_result, values); + + printf ("%d %d\n", ts3_result->si, -(compare_value*2)); + + CHECK(ts3_result->si == -(compare_value*2)); + + free (ts3_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c new file mode 100644 index 000000000000..66a9551dd650 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c @@ -0,0 +1,64 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + unsigned ui1; + unsigned ui2; + unsigned ui3; +} test_structure_4; + +static test_structure_4 ABI_ATTR struct4(test_structure_4 ts) +{ + ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts4_type; + ffi_type *ts4_type_elements[4]; + + test_structure_4 ts4_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_4 *ts4_result = + (test_structure_4 *) malloc (sizeof(test_structure_4)); + + ts4_type.size = 0; + ts4_type.alignment = 0; + ts4_type.type = FFI_TYPE_STRUCT; + ts4_type.elements = ts4_type_elements; + ts4_type_elements[0] = &ffi_type_uint; + ts4_type_elements[1] = &ffi_type_uint; + ts4_type_elements[2] = &ffi_type_uint; + ts4_type_elements[3] = NULL; + + args[0] = &ts4_type; + values[0] = &ts4_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts4_type, args) == FFI_OK); + + ts4_arg.ui1 = 2; + ts4_arg.ui2 = 3; + ts4_arg.ui3 = 4; + + ffi_call (&cif, FFI_FN(struct4), ts4_result, values); + + CHECK(ts4_result->ui3 == 2U * 3U * 4U); + + + free (ts4_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c new file mode 100644 index 000000000000..23e2a3f745c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c @@ -0,0 +1,66 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +typedef struct +{ + char c1; + char c2; +} test_structure_5; + +static test_structure_5 ABI_ATTR struct5(test_structure_5 ts1, test_structure_5 ts2) +{ + ts1.c1 += ts2.c1; + ts1.c2 -= ts2.c2; + + return ts1; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts5_type; + ffi_type *ts5_type_elements[3]; + + test_structure_5 ts5_arg1, ts5_arg2; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_5 *ts5_result = + (test_structure_5 *) malloc (sizeof(test_structure_5)); + + ts5_type.size = 0; + ts5_type.alignment = 0; + ts5_type.type = FFI_TYPE_STRUCT; + ts5_type.elements = ts5_type_elements; + ts5_type_elements[0] = &ffi_type_schar; + ts5_type_elements[1] = &ffi_type_schar; + ts5_type_elements[2] = NULL; + + args[0] = &ts5_type; + args[1] = &ts5_type; + values[0] = &ts5_arg1; + values[1] = &ts5_arg2; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts5_type, args) == FFI_OK); + + ts5_arg1.c1 = 2; + ts5_arg1.c2 = 6; + ts5_arg2.c1 = 5; + ts5_arg2.c2 = 3; + + ffi_call (&cif, FFI_FN(struct5), ts5_result, values); + + CHECK(ts5_result->c1 == 7); + CHECK(ts5_result->c2 == 3); + + + free (ts5_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c new file mode 100644 index 000000000000..173c66eb4d2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c @@ -0,0 +1,64 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +typedef struct +{ + float f; + double d; +} test_structure_6; + +static test_structure_6 ABI_ATTR struct6 (test_structure_6 ts) +{ + ts.f += 1; + ts.d += 1; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts6_type; + ffi_type *ts6_type_elements[3]; + + test_structure_6 ts6_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_6 *ts6_result = + (test_structure_6 *) malloc (sizeof(test_structure_6)); + + ts6_type.size = 0; + ts6_type.alignment = 0; + ts6_type.type = FFI_TYPE_STRUCT; + ts6_type.elements = ts6_type_elements; + ts6_type_elements[0] = &ffi_type_float; + ts6_type_elements[1] = &ffi_type_double; + ts6_type_elements[2] = NULL; + + args[0] = &ts6_type; + values[0] = &ts6_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts6_type, args) == FFI_OK); + + ts6_arg.f = 5.55f; + ts6_arg.d = 6.66; + + printf ("%g\n", ts6_arg.f); + printf ("%g\n", ts6_arg.d); + + ffi_call(&cif, FFI_FN(struct6), ts6_result, values); + + CHECK(ts6_result->f == 5.55f + 1); + CHECK(ts6_result->d == 6.66 + 1); + + free (ts6_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c new file mode 100644 index 000000000000..badc7e055609 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c @@ -0,0 +1,74 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +typedef struct +{ + float f1; + float f2; + double d; +} test_structure_7; + +static test_structure_7 ABI_ATTR struct7 (test_structure_7 ts) +{ + ts.f1 += 1; + ts.f2 += 1; + ts.d += 1; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts7_type; + ffi_type *ts7_type_elements[4]; + + test_structure_7 ts7_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_7 *ts7_result = + (test_structure_7 *) malloc (sizeof(test_structure_7)); + + ts7_type.size = 0; + ts7_type.alignment = 0; + ts7_type.type = FFI_TYPE_STRUCT; + ts7_type.elements = ts7_type_elements; + ts7_type_elements[0] = &ffi_type_float; + ts7_type_elements[1] = &ffi_type_float; + ts7_type_elements[2] = &ffi_type_double; + ts7_type_elements[3] = NULL; + + args[0] = &ts7_type; + values[0] = &ts7_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts7_type, args) == FFI_OK); + + ts7_arg.f1 = 5.55f; + ts7_arg.f2 = 55.5f; + ts7_arg.d = 6.66; + + printf ("%g\n", ts7_arg.f1); + printf ("%g\n", ts7_arg.f2); + printf ("%g\n", ts7_arg.d); + + ffi_call(&cif, FFI_FN(struct7), ts7_result, values); + + printf ("%g\n", ts7_result->f1); + printf ("%g\n", ts7_result->f2); + printf ("%g\n", ts7_result->d); + + CHECK(ts7_result->f1 == 5.55f + 1); + CHECK(ts7_result->f2 == 55.5f + 1); + CHECK(ts7_result->d == 6.66 + 1); + + free (ts7_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c new file mode 100644 index 000000000000..ef204ecbbce5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c @@ -0,0 +1,81 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +typedef struct +{ + float f1; + float f2; + float f3; + float f4; +} test_structure_8; + +static test_structure_8 ABI_ATTR struct8 (test_structure_8 ts) +{ + ts.f1 += 1; + ts.f2 += 1; + ts.f3 += 1; + ts.f4 += 1; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts8_type; + ffi_type *ts8_type_elements[5]; + + test_structure_8 ts8_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_8 *ts8_result = + (test_structure_8 *) malloc (sizeof(test_structure_8)); + + ts8_type.size = 0; + ts8_type.alignment = 0; + ts8_type.type = FFI_TYPE_STRUCT; + ts8_type.elements = ts8_type_elements; + ts8_type_elements[0] = &ffi_type_float; + ts8_type_elements[1] = &ffi_type_float; + ts8_type_elements[2] = &ffi_type_float; + ts8_type_elements[3] = &ffi_type_float; + ts8_type_elements[4] = NULL; + + args[0] = &ts8_type; + values[0] = &ts8_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts8_type, args) == FFI_OK); + + ts8_arg.f1 = 5.55f; + ts8_arg.f2 = 55.5f; + ts8_arg.f3 = -5.55f; + ts8_arg.f4 = -55.5f; + + printf ("%g\n", ts8_arg.f1); + printf ("%g\n", ts8_arg.f2); + printf ("%g\n", ts8_arg.f3); + printf ("%g\n", ts8_arg.f4); + + ffi_call(&cif, FFI_FN(struct8), ts8_result, values); + + printf ("%g\n", ts8_result->f1); + printf ("%g\n", ts8_result->f2); + printf ("%g\n", ts8_result->f3); + printf ("%g\n", ts8_result->f4); + + CHECK(ts8_result->f1 == 5.55f + 1); + CHECK(ts8_result->f2 == 55.5f + 1); + CHECK(ts8_result->f3 == -5.55f + 1); + CHECK(ts8_result->f4 == -55.5f + 1); + + free (ts8_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c new file mode 100644 index 000000000000..4a13b818c4ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c @@ -0,0 +1,68 @@ +/* Area: ffi_call + Purpose: Check structures. + Limitations: none. + PR: none. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + float f; + int i; +} test_structure_9; + +static test_structure_9 ABI_ATTR struct9 (test_structure_9 ts) +{ + ts.f += 1; + ts.i += 1; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts9_type; + ffi_type *ts9_type_elements[3]; + + test_structure_9 ts9_arg; + + /* This is a hack to get a properly aligned result buffer */ + test_structure_9 *ts9_result = + (test_structure_9 *) malloc (sizeof(test_structure_9)); + + ts9_type.size = 0; + ts9_type.alignment = 0; + ts9_type.type = FFI_TYPE_STRUCT; + ts9_type.elements = ts9_type_elements; + ts9_type_elements[0] = &ffi_type_float; + ts9_type_elements[1] = &ffi_type_sint; + ts9_type_elements[2] = NULL; + + args[0] = &ts9_type; + values[0] = &ts9_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts9_type, args) == FFI_OK); + + ts9_arg.f = 5.55f; + ts9_arg.i = 5; + + printf ("%g\n", ts9_arg.f); + printf ("%d\n", ts9_arg.i); + + ffi_call(&cif, FFI_FN(struct9), ts9_result, values); + + printf ("%g\n", ts9_result->f); + printf ("%d\n", ts9_result->i); + + CHECK(ts9_result->f == 5.55f + 1); + CHECK(ts9_result->i == 5 + 1); + + free (ts9_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c new file mode 100644 index 000000000000..f00d8302349d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c @@ -0,0 +1,61 @@ +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct +{ + unsigned char uc; + double d; + unsigned int ui; +} test_structure_1; + +static test_structure_1 struct1(test_structure_1 ts) +{ + ts.uc++; + ts.d--; + ts.ui++; + + return ts; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_type ts1_type; + ffi_type *ts1_type_elements[4]; + + memset(&cif, 1, sizeof(cif)); + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + ts1_type_elements[0] = &ffi_type_uchar; + ts1_type_elements[1] = &ffi_type_double; + ts1_type_elements[2] = &ffi_type_uint; + ts1_type_elements[3] = NULL; + + test_structure_1 ts1_arg; + /* This is a hack to get a properly aligned result buffer */ + test_structure_1 *ts1_result = + (test_structure_1 *) malloc (sizeof(test_structure_1)); + + args[0] = &ts1_type; + values[0] = &ts1_arg; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ts1_type, args) == FFI_OK); + + ts1_arg.uc = '\x01'; + ts1_arg.d = 3.14159; + ts1_arg.ui = 555; + + ffi_call(&cif, FFI_FN(struct1), ts1_result, values); + + CHECK(ts1_result->ui == 556); + CHECK(ts1_result->d == 3.14159 - 1); + + free (ts1_result); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c new file mode 100644 index 000000000000..59d085c832ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c @@ -0,0 +1,196 @@ +/* Area: ffi_call + Purpose: Test passing struct in variable argument lists. + Limitations: none. + PR: none. + Originator: ARM Ltd. */ + +/* { dg-do run } */ +/* { dg-output "" { xfail avr32*-*-* m68k-*-* alpha-*-* } } */ + +#include "ffitest.h" +#include <stdarg.h> + +struct small_tag +{ + unsigned char a; + unsigned char b; +}; + +struct large_tag +{ + unsigned a; + unsigned b; + unsigned c; + unsigned d; + unsigned e; +}; + +static int +test_fn (int n, ...) +{ + va_list ap; + struct small_tag s1; + struct small_tag s2; + struct large_tag l; + unsigned char uc; + signed char sc; + unsigned short us; + signed short ss; + unsigned int ui; + signed int si; + unsigned long ul; + signed long sl; + float f; + double d; + + va_start (ap, n); + s1 = va_arg (ap, struct small_tag); + l = va_arg (ap, struct large_tag); + s2 = va_arg (ap, struct small_tag); + + uc = va_arg (ap, unsigned); + sc = va_arg (ap, signed); + + us = va_arg (ap, unsigned); + ss = va_arg (ap, signed); + + ui = va_arg (ap, unsigned int); + si = va_arg (ap, signed int); + + ul = va_arg (ap, unsigned long); + sl = va_arg (ap, signed long); + + f = va_arg (ap, double); /* C standard promotes float->double + when anonymous */ + d = va_arg (ap, double); + + printf ("%u %u %u %u %u %u %u %u %u uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n", + s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, + s2.a, s2.b, + uc, sc, + us, ss, + ui, si, + ul, sl, + f, d); + va_end (ap); + return n + 1; +} + +int +main (void) +{ + ffi_cif cif; + void* args[15]; + ffi_type* arg_types[15]; + + ffi_type s_type; + ffi_type *s_type_elements[3]; + + ffi_type l_type; + ffi_type *l_type_elements[6]; + + struct small_tag s1; + struct small_tag s2; + struct large_tag l1; + + int n; + ffi_arg res; + + unsigned char uc; + signed char sc; + unsigned short us; + signed short ss; + unsigned int ui; + signed int si; + unsigned long ul; + signed long sl; + double d1; + double f1; + + s_type.size = 0; + s_type.alignment = 0; + s_type.type = FFI_TYPE_STRUCT; + s_type.elements = s_type_elements; + + s_type_elements[0] = &ffi_type_uchar; + s_type_elements[1] = &ffi_type_uchar; + s_type_elements[2] = NULL; + + l_type.size = 0; + l_type.alignment = 0; + l_type.type = FFI_TYPE_STRUCT; + l_type.elements = l_type_elements; + + l_type_elements[0] = &ffi_type_uint; + l_type_elements[1] = &ffi_type_uint; + l_type_elements[2] = &ffi_type_uint; + l_type_elements[3] = &ffi_type_uint; + l_type_elements[4] = &ffi_type_uint; + l_type_elements[5] = NULL; + + arg_types[0] = &ffi_type_sint; + arg_types[1] = &s_type; + arg_types[2] = &l_type; + arg_types[3] = &s_type; + arg_types[4] = &ffi_type_uchar; + arg_types[5] = &ffi_type_schar; + arg_types[6] = &ffi_type_ushort; + arg_types[7] = &ffi_type_sshort; + arg_types[8] = &ffi_type_uint; + arg_types[9] = &ffi_type_sint; + arg_types[10] = &ffi_type_ulong; + arg_types[11] = &ffi_type_slong; + arg_types[12] = &ffi_type_double; + arg_types[13] = &ffi_type_double; + arg_types[14] = NULL; + + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 14, &ffi_type_sint, arg_types) == FFI_OK); + + s1.a = 5; + s1.b = 6; + + l1.a = 10; + l1.b = 11; + l1.c = 12; + l1.d = 13; + l1.e = 14; + + s2.a = 7; + s2.b = 8; + + n = 41; + + uc = 9; + sc = 10; + us = 11; + ss = 12; + ui = 13; + si = 14; + ul = 15; + sl = 16; + f1 = 2.12; + d1 = 3.13; + + args[0] = &n; + args[1] = &s1; + args[2] = &l1; + args[3] = &s2; + args[4] = &uc; + args[5] = &sc; + args[6] = &us; + args[7] = &ss; + args[8] = &ui; + args[9] = &si; + args[10] = &ul; + args[11] = &sl; + args[12] = &f1; + args[13] = &d1; + args[14] = NULL; + + ffi_call(&cif, FFI_FN(test_fn), &res, args); + /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */ + printf("res: %d\n", (int) res); + /* { dg-output "\nres: 42" } */ + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c new file mode 100644 index 000000000000..e6452061c1d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c @@ -0,0 +1,121 @@ +/* Area: ffi_call + Purpose: Test passing struct in variable argument lists. + Limitations: none. + PR: none. + Originator: ARM Ltd. */ + +/* { dg-do run } */ +/* { dg-output "" { xfail avr32*-*-* } } */ + +#include "ffitest.h" +#include <stdarg.h> + +struct small_tag +{ + unsigned char a; + unsigned char b; +}; + +struct large_tag +{ + unsigned a; + unsigned b; + unsigned c; + unsigned d; + unsigned e; +}; + +static int +test_fn (int n, ...) +{ + va_list ap; + struct small_tag s1; + struct small_tag s2; + struct large_tag l; + + va_start (ap, n); + s1 = va_arg (ap, struct small_tag); + l = va_arg (ap, struct large_tag); + s2 = va_arg (ap, struct small_tag); + printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, + s2.a, s2.b); + va_end (ap); + return n + 1; +} + +int +main (void) +{ + ffi_cif cif; + void* args[5]; + ffi_type* arg_types[5]; + + ffi_type s_type; + ffi_type *s_type_elements[3]; + + ffi_type l_type; + ffi_type *l_type_elements[6]; + + struct small_tag s1; + struct small_tag s2; + struct large_tag l1; + + int n; + ffi_arg res; + + s_type.size = 0; + s_type.alignment = 0; + s_type.type = FFI_TYPE_STRUCT; + s_type.elements = s_type_elements; + + s_type_elements[0] = &ffi_type_uchar; + s_type_elements[1] = &ffi_type_uchar; + s_type_elements[2] = NULL; + + l_type.size = 0; + l_type.alignment = 0; + l_type.type = FFI_TYPE_STRUCT; + l_type.elements = l_type_elements; + + l_type_elements[0] = &ffi_type_uint; + l_type_elements[1] = &ffi_type_uint; + l_type_elements[2] = &ffi_type_uint; + l_type_elements[3] = &ffi_type_uint; + l_type_elements[4] = &ffi_type_uint; + l_type_elements[5] = NULL; + + arg_types[0] = &ffi_type_sint; + arg_types[1] = &s_type; + arg_types[2] = &l_type; + arg_types[3] = &s_type; + arg_types[4] = NULL; + + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, arg_types) == FFI_OK); + + s1.a = 5; + s1.b = 6; + + l1.a = 10; + l1.b = 11; + l1.c = 12; + l1.d = 13; + l1.e = 14; + + s2.a = 7; + s2.b = 8; + + n = 41; + + args[0] = &n; + args[1] = &s1; + args[2] = &l1; + args[3] = &s2; + args[4] = NULL; + + ffi_call(&cif, FFI_FN(test_fn), &res, args); + /* { dg-output "5 6 10 11 12 13 14 7 8" } */ + printf("res: %d\n", (int) res); + /* { dg-output "\nres: 42" } */ + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c new file mode 100644 index 000000000000..56f5b9c75fa3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c @@ -0,0 +1,123 @@ +/* Area: ffi_call + Purpose: Test passing struct in variable argument lists. + Limitations: none. + PR: none. + Originator: ARM Ltd. */ + +/* { dg-do run } */ +/* { dg-output "" { xfail avr32*-*-* } } */ + +#include "ffitest.h" +#include <stdarg.h> + +struct small_tag +{ + unsigned char a; + unsigned char b; +}; + +struct large_tag +{ + unsigned a; + unsigned b; + unsigned c; + unsigned d; + unsigned e; +}; + +static struct small_tag +test_fn (int n, ...) +{ + va_list ap; + struct small_tag s1; + struct small_tag s2; + struct large_tag l; + + va_start (ap, n); + s1 = va_arg (ap, struct small_tag); + l = va_arg (ap, struct large_tag); + s2 = va_arg (ap, struct small_tag); + printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, + s2.a, s2.b); + va_end (ap); + s1.a += s2.a; + s1.b += s2.b; + return s1; +} + +int +main (void) +{ + ffi_cif cif; + void* args[5]; + ffi_type* arg_types[5]; + + ffi_type s_type; + ffi_type *s_type_elements[3]; + + ffi_type l_type; + ffi_type *l_type_elements[6]; + + struct small_tag s1; + struct small_tag s2; + struct large_tag l1; + + int n; + struct small_tag res; + + s_type.size = 0; + s_type.alignment = 0; + s_type.type = FFI_TYPE_STRUCT; + s_type.elements = s_type_elements; + + s_type_elements[0] = &ffi_type_uchar; + s_type_elements[1] = &ffi_type_uchar; + s_type_elements[2] = NULL; + + l_type.size = 0; + l_type.alignment = 0; + l_type.type = FFI_TYPE_STRUCT; + l_type.elements = l_type_elements; + + l_type_elements[0] = &ffi_type_uint; + l_type_elements[1] = &ffi_type_uint; + l_type_elements[2] = &ffi_type_uint; + l_type_elements[3] = &ffi_type_uint; + l_type_elements[4] = &ffi_type_uint; + l_type_elements[5] = NULL; + + arg_types[0] = &ffi_type_sint; + arg_types[1] = &s_type; + arg_types[2] = &l_type; + arg_types[3] = &s_type; + arg_types[4] = NULL; + + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &s_type, arg_types) == FFI_OK); + + s1.a = 5; + s1.b = 6; + + l1.a = 10; + l1.b = 11; + l1.c = 12; + l1.d = 13; + l1.e = 14; + + s2.a = 7; + s2.b = 8; + + n = 41; + + args[0] = &n; + args[1] = &s1; + args[2] = &l1; + args[3] = &s2; + args[4] = NULL; + + ffi_call(&cif, FFI_FN(test_fn), &res, args); + /* { dg-output "5 6 10 11 12 13 14 7 8" } */ + printf("res: %d %d\n", res.a, res.b); + /* { dg-output "\nres: 12 14" } */ + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c new file mode 100644 index 000000000000..9a27e7fd4a34 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c @@ -0,0 +1,125 @@ +/* Area: ffi_call + Purpose: Test passing struct in variable argument lists. + Limitations: none. + PR: none. + Originator: ARM Ltd. */ + +/* { dg-do run } */ +/* { dg-output "" { xfail avr32*-*-* } } */ + +#include "ffitest.h" +#include <stdarg.h> + +struct small_tag +{ + unsigned char a; + unsigned char b; +}; + +struct large_tag +{ + unsigned a; + unsigned b; + unsigned c; + unsigned d; + unsigned e; +}; + +static struct large_tag +test_fn (int n, ...) +{ + va_list ap; + struct small_tag s1; + struct small_tag s2; + struct large_tag l; + + va_start (ap, n); + s1 = va_arg (ap, struct small_tag); + l = va_arg (ap, struct large_tag); + s2 = va_arg (ap, struct small_tag); + printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, + s2.a, s2.b); + va_end (ap); + l.a += s1.a; + l.b += s1.b; + l.c += s2.a; + l.d += s2.b; + return l; +} + +int +main (void) +{ + ffi_cif cif; + void* args[5]; + ffi_type* arg_types[5]; + + ffi_type s_type; + ffi_type *s_type_elements[3]; + + ffi_type l_type; + ffi_type *l_type_elements[6]; + + struct small_tag s1; + struct small_tag s2; + struct large_tag l1; + + int n; + struct large_tag res; + + s_type.size = 0; + s_type.alignment = 0; + s_type.type = FFI_TYPE_STRUCT; + s_type.elements = s_type_elements; + + s_type_elements[0] = &ffi_type_uchar; + s_type_elements[1] = &ffi_type_uchar; + s_type_elements[2] = NULL; + + l_type.size = 0; + l_type.alignment = 0; + l_type.type = FFI_TYPE_STRUCT; + l_type.elements = l_type_elements; + + l_type_elements[0] = &ffi_type_uint; + l_type_elements[1] = &ffi_type_uint; + l_type_elements[2] = &ffi_type_uint; + l_type_elements[3] = &ffi_type_uint; + l_type_elements[4] = &ffi_type_uint; + l_type_elements[5] = NULL; + + arg_types[0] = &ffi_type_sint; + arg_types[1] = &s_type; + arg_types[2] = &l_type; + arg_types[3] = &s_type; + arg_types[4] = NULL; + + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &l_type, arg_types) == FFI_OK); + + s1.a = 5; + s1.b = 6; + + l1.a = 10; + l1.b = 11; + l1.c = 12; + l1.d = 13; + l1.e = 14; + + s2.a = 7; + s2.b = 8; + + n = 41; + + args[0] = &n; + args[1] = &s1; + args[2] = &l1; + args[3] = &s2; + args[4] = NULL; + + ffi_call(&cif, FFI_FN(test_fn), &res, args); + /* { dg-output "5 6 10 11 12 13 14 7 8" } */ + printf("res: %d %d %d %d %d\n", res.a, res.b, res.c, res.d, res.e); + /* { dg-output "\nres: 15 17 19 21 14" } */ + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp new file mode 100644 index 000000000000..ed4145ca843b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp @@ -0,0 +1,67 @@ +# Copyright (C) 2003, 2006, 2009, 2010, 2014, 2019 Free Software Foundation, Inc. +# Copyright (C) 2019 Anthony Green + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +dg-init +libffi-init + +global srcdir subdir + +if { [string match $compiler_vendor "microsoft"] } { + # -wd4005 macro redefinition + # -wd4244 implicit conversion to type of smaller size + # -wd4305 truncation to smaller type + # -wd4477 printf %lu of uintptr_t + # -wd4312 implicit conversion to type of greater size + # -wd4311 pointer truncation to unsigned long + # -EHsc C++ Exception Handling (no SEH exceptions) + set additional_options "-wd4005 -wd4244 -wd4305 -wd4477 -wd4312 -wd4311 -EHsc"; +} else { + set additional_options ""; +} + +set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.c]] + +if { [libffi_feature_test "#if FFI_CLOSURES"] } { + run-many-tests $tlist "" +} else { + foreach test $tlist { + unsupported "$test" + } +} + +set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.cc]] + +# No C++ for or1k +if { [istarget "or1k-*-*"] } { + foreach test $tlist { + unsupported "$test" + } +} else { + if { [libffi_feature_test "#if FFI_CLOSURES"] } { + run-many-tests $tlist $additional_options + } else { + foreach test $tlist { + unsupported "$test" + } + } +} + +dg-finish + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c new file mode 100644 index 000000000000..a579ff6c979f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn0.c @@ -0,0 +1,89 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + + + + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + + (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + + (int)(*(signed short *)args[4]) + + (int)(*(unsigned long long *)args[5]) + + (int)*(int *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double *)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), + (int)(*(unsigned long long *)args[2]), + (int)*(int *)args[3], (int)(*(signed short *)args[4]), + (int)(*(unsigned long long *)args[5]), + (int)*(int *)args[6], (int)(*(int *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(int *)args[14]),*(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long, + int, signed short, unsigned long long, int, + int, double, int, int, float, int, int, + int, int); + +int main (void) +{ + ffi_cif cif; + void * code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_uint64; + cl_arg_types[1] = &ffi_type_sint; + cl_arg_types[2] = &ffi_type_uint64; + cl_arg_types[3] = &ffi_type_sint; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_uint64; + cl_arg_types[6] = &ffi_type_sint; + cl_arg_types[7] = &ffi_type_sint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_sint; + cl_arg_types[14] = &ffi_type_sint; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type0)code)) + (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, + 19, 21, 1); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c new file mode 100644 index 000000000000..91231738c13b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn1.c @@ -0,0 +1,81 @@ +/* Area: closure_call. + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + + +static void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(float *)args[0] +(int)(*(float *)args[1]) + + (int)(*(float *)args[2]) + (int)*(float *)args[3] + + (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + + (int)*(float *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double*)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(float *)args[0], (int)(*(float *)args[1]), + (int)(*(float *)args[2]), (int)*(float *)args[3], + (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), + (int)*(float *)args[6], (int)(*(int *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(int *)args[14]), *(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); +} + +typedef int (*closure_test_type1)(float, float, float, float, signed short, + float, float, int, double, int, int, float, + int, int, int, int); +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_float; + cl_arg_types[1] = &ffi_type_float; + cl_arg_types[2] = &ffi_type_float; + cl_arg_types[3] = &ffi_type_float; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_float; + cl_arg_types[6] = &ffi_type_float; + cl_arg_types[7] = &ffi_type_sint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_sint; + cl_arg_types[14] = &ffi_type_sint; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type1)code)) + (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, + 19, 21, 1); + /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 255" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c new file mode 100644 index 000000000000..08ff9d92274c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn2.c @@ -0,0 +1,81 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(double *)args[0] +(int)(*(double *)args[1]) + + (int)(*(double *)args[2]) + (int)*(double *)args[3] + + (int)(*(signed short *)args[4]) + (int)(*(double *)args[5]) + + (int)*(double *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double *)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(float *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(double *)args[0], (int)(*(double *)args[1]), + (int)(*(double *)args[2]), (int)*(double *)args[3], + (int)(*(signed short *)args[4]), (int)(*(double *)args[5]), + (int)*(double *)args[6], (int)(*(int *)args[7]), + (int)(*(double*)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(float *)args[13]), + (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, + (int)*(ffi_arg *)resp); +} + +typedef int (*closure_test_type2)(double, double, double, double, signed short, + double, double, int, double, int, int, float, + int, float, int, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_double; + cl_arg_types[1] = &ffi_type_double; + cl_arg_types[2] = &ffi_type_double; + cl_arg_types[3] = &ffi_type_double; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_double; + cl_arg_types[6] = &ffi_type_double; + cl_arg_types[7] = &ffi_type_sint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_float; + cl_arg_types[14] = &ffi_type_sint; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn2, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type2)code)) + (1, 2, 3, 4, 127, 5, 6, 8, 9, 10, 11, 12.0, 13, + 19.0, 21, 1); + /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 255" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c new file mode 100644 index 000000000000..9b54d805c829 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn3.c @@ -0,0 +1,82 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) + { + *(ffi_arg*)resp = + (int)*(float *)args[0] +(int)(*(float *)args[1]) + + (int)(*(float *)args[2]) + (int)*(float *)args[3] + + (int)(*(float *)args[4]) + (int)(*(float *)args[5]) + + (int)*(float *)args[6] + (int)(*(float *)args[7]) + + (int)(*(double *)args[8]) + (int)*(int *)args[9] + + (int)(*(float *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(float *)args[13]) + + (int)(*(float *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(float *)args[0], (int)(*(float *)args[1]), + (int)(*(float *)args[2]), (int)*(float *)args[3], + (int)(*(float *)args[4]), (int)(*(float *)args[5]), + (int)*(float *)args[6], (int)(*(float *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(float *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(float *)args[13]), + (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, + (int)*(ffi_arg *)resp); + + } + +typedef int (*closure_test_type3)(float, float, float, float, float, float, + float, float, double, int, float, float, int, + float, float, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_float; + cl_arg_types[1] = &ffi_type_float; + cl_arg_types[2] = &ffi_type_float; + cl_arg_types[3] = &ffi_type_float; + cl_arg_types[4] = &ffi_type_float; + cl_arg_types[5] = &ffi_type_float; + cl_arg_types[6] = &ffi_type_float; + cl_arg_types[7] = &ffi_type_float; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_float; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_float; + cl_arg_types[14] = &ffi_type_float; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn3, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type3)code)) + (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9, 10, 11.11, 12.0, 13, + 19.19, 21.21, 1); + /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 19 21 1 3: 135" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 135" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c new file mode 100644 index 000000000000..d4a1530b065b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn4.c @@ -0,0 +1,89 @@ +/* Area: closure_call + Purpose: Check multiple long long values passing. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20031026 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static void +closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + + (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + + (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + + (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + + (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + + (int)*(unsigned long long *)args[10] + + (int)*(unsigned long long *)args[11] + + (int)*(unsigned long long *)args[12] + + (int)*(unsigned long long *)args[13] + + (int)*(unsigned long long *)args[14] + + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], + (int)*(unsigned long long *)args[1], + (int)*(unsigned long long *)args[2], + (int)*(unsigned long long *)args[3], + (int)*(unsigned long long *)args[4], + (int)*(unsigned long long *)args[5], + (int)*(unsigned long long *)args[6], + (int)*(unsigned long long *)args[7], + (int)*(unsigned long long *)args[8], + (int)*(unsigned long long *)args[9], + (int)*(unsigned long long *)args[10], + (int)*(unsigned long long *)args[11], + (int)*(unsigned long long *)args[12], + (int)*(unsigned long long *)args[13], + (int)*(unsigned long long *)args[14], + *(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_test_type0)(unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int i, res; + + for (i = 0; i < 15; i++) { + cl_arg_types[i] = &ffi_type_uint64; + } + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type0)code)) + (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL, + 13LL, 19LL, 21LL, 1); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c new file mode 100644 index 000000000000..99074426c67b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn5.c @@ -0,0 +1,92 @@ +/* Area: closure_call + Purpose: Check multiple long long values passing. + Exceed the limit of gpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20031026 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + + (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + + (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + + (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + + (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + + (int)*(int *)args[10] + + (int)*(unsigned long long *)args[11] + + (int)*(unsigned long long *)args[12] + + (int)*(unsigned long long *)args[13] + + (int)*(unsigned long long *)args[14] + + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], + (int)*(unsigned long long *)args[1], + (int)*(unsigned long long *)args[2], + (int)*(unsigned long long *)args[3], + (int)*(unsigned long long *)args[4], + (int)*(unsigned long long *)args[5], + (int)*(unsigned long long *)args[6], + (int)*(unsigned long long *)args[7], + (int)*(unsigned long long *)args[8], + (int)*(unsigned long long *)args[9], + (int)*(int *)args[10], + (int)*(unsigned long long *)args[11], + (int)*(unsigned long long *)args[12], + (int)*(unsigned long long *)args[13], + (int)*(unsigned long long *)args[14], + *(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_test_type0)(unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, unsigned long long, + int, unsigned long long, + unsigned long long, unsigned long long, + unsigned long long, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int i, res; + + for (i = 0; i < 10; i++) { + cl_arg_types[i] = &ffi_type_uint64; + } + cl_arg_types[10] = &ffi_type_sint; + for (i = 11; i < 15; i++) { + cl_arg_types[i] = &ffi_type_uint64; + } + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type0)code)) + (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL, + 13LL, 19LL, 21LL, 1); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c new file mode 100644 index 000000000000..73c54fd6b160 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_fn6.c @@ -0,0 +1,90 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC. + Limitations: none. + PR: PR23404 + Originator: <andreast@gcc.gnu.org> 20050830 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + + (int)(*(unsigned long long *)args[1]) + + (int)(*(unsigned long long *)args[2]) + + (int)*(unsigned long long *)args[3] + + (int)(*(int *)args[4]) + (int)(*(double *)args[5]) + + (int)*(double *)args[6] + (int)(*(float *)args[7]) + + (int)(*(double *)args[8]) + (int)*(double *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(double *)args[14]) + (int)*(double *)args[15] + + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], + (int)(*(unsigned long long *)args[1]), + (int)(*(unsigned long long *)args[2]), + (int)*(unsigned long long *)args[3], + (int)(*(int *)args[4]), (int)(*(double *)args[5]), + (int)*(double *)args[6], (int)(*(float *)args[7]), + (int)(*(double *)args[8]), (int)*(double *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(double *)args[14]), (int)(*(double *)args[15]), + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_test_type0)(unsigned long long, + unsigned long long, + unsigned long long, + unsigned long long, + int, double, double, float, double, double, + int, float, int, int, double, double); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_uint64; + cl_arg_types[1] = &ffi_type_uint64; + cl_arg_types[2] = &ffi_type_uint64; + cl_arg_types[3] = &ffi_type_uint64; + cl_arg_types[4] = &ffi_type_sint; + cl_arg_types[5] = &ffi_type_double; + cl_arg_types[6] = &ffi_type_double; + cl_arg_types[7] = &ffi_type_float; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_double; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_sint; + cl_arg_types[14] = &ffi_type_double; + cl_arg_types[15] = &ffi_type_double; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*((closure_test_type0)code)) + (1, 2, 3, 4, 127, 429., 7., 8., 9.5, 10., 11, 12., 13, + 19, 21., 1.); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c new file mode 100644 index 000000000000..b3afa0bbdfcf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_loc_fn0.c @@ -0,0 +1,95 @@ +/* Area: closure_call + Purpose: Check multiple values passing from different type. + Also, exceed the limit of gpr and fpr registers on PowerPC + Darwin. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + + + + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_loc_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + + (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + + (int)(*(signed short *)args[4]) + + (int)(*(unsigned long long *)args[5]) + + (int)*(int *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double *)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), + (int)(*(unsigned long long *)args[2]), + (int)*(int *)args[3], (int)(*(signed short *)args[4]), + (int)(*(unsigned long long *)args[5]), + (int)*(int *)args[6], (int)(*(int *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(int *)args[14]),*(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); + +} + +typedef int (*closure_loc_test_type0)(unsigned long long, int, unsigned long long, + int, signed short, unsigned long long, int, + int, double, int, int, float, int, int, + int, int); + +int main (void) +{ + ffi_cif cif; + ffi_closure *pcl; + ffi_type * cl_arg_types[17]; + int res; + void *codeloc; + + cl_arg_types[0] = &ffi_type_uint64; + cl_arg_types[1] = &ffi_type_sint; + cl_arg_types[2] = &ffi_type_uint64; + cl_arg_types[3] = &ffi_type_sint; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_uint64; + cl_arg_types[6] = &ffi_type_sint; + cl_arg_types[7] = &ffi_type_sint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_sint; + cl_arg_types[10] = &ffi_type_sint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_sint; + cl_arg_types[13] = &ffi_type_sint; + cl_arg_types[14] = &ffi_type_sint; + cl_arg_types[15] = &ffi_type_sint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + pcl = ffi_closure_alloc(sizeof(ffi_closure), &codeloc); + CHECK(pcl != NULL); + CHECK(codeloc != NULL); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0, + (void *) 3 /* userdata */, codeloc) == FFI_OK); + + CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0); + + res = (*((closure_loc_test_type0)codeloc)) + (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, + 19, 21, 1); + /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 680" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c new file mode 100644 index 000000000000..5a4e728d4a42 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/closure_simple.c @@ -0,0 +1,55 @@ +/* Area: closure_call + Purpose: Check simple closure handling with all ABIs + Limitations: none. + PR: none. + Originator: <twalljava@dev.java.net> */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_test(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) +{ + *(ffi_arg*)resp = + (int)*(int *)args[0] + (int)(*(int *)args[1]) + + (int)(*(int *)args[2]) + (int)(*(int *)args[3]) + + (int)(intptr_t)userdata; + + printf("%d %d %d %d: %d\n", + (int)*(int *)args[0], (int)(*(int *)args[1]), + (int)(*(int *)args[2]), (int)(*(int *)args[3]), + (int)*(ffi_arg *)resp); + +} + +typedef int (ABI_ATTR *closure_test_type0)(int, int, int, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_uint; + cl_arg_types[1] = &ffi_type_uint; + cl_arg_types[2] = &ffi_type_uint; + cl_arg_types[3] = &ffi_type_uint; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*(closure_test_type0)code)(0, 1, 2, 3); + /* { dg-output "0 1 2 3: 9" } */ + + printf("res: %d\n",res); + /* { dg-output "\nres: 9" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c new file mode 100644 index 000000000000..ea0825d175a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_12byte.c @@ -0,0 +1,94 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_12byte { + int a; + int b; + int c; +} cls_struct_12byte; + +cls_struct_12byte cls_struct_12byte_fn(struct cls_struct_12byte b1, + struct cls_struct_12byte b2) +{ + struct cls_struct_12byte result; + + result.a = b1.a + b2.a; + result.b = b1.b + b2.b; + result.c = b1.c + b2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, + result.a, result.b, result.c); + + return result; +} + +static void cls_struct_12byte_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args , void* userdata __UNUSED__) +{ + struct cls_struct_12byte b1, b2; + + b1 = *(struct cls_struct_12byte*)(args[0]); + b2 = *(struct cls_struct_12byte*)(args[1]); + + *(cls_struct_12byte*)resp = cls_struct_12byte_fn(b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_12byte h_dbl = { 7, 4, 9 }; + struct cls_struct_12byte j_dbl = { 1, 5, 3 }; + struct cls_struct_12byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_sint; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &h_dbl; + args_dbl[1] = &j_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_12byte_fn), &res_dbl, args_dbl); + /* { dg-output "7 4 9 1 5 3: 8 9 12" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 8 9 12" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_12byte_gn, NULL, code) == FFI_OK); + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + + res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(code))(h_dbl, j_dbl); + /* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 8 9 12" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c new file mode 100644 index 000000000000..89a08a2d97bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_16byte.c @@ -0,0 +1,95 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_16byte { + int a; + double b; + int c; +} cls_struct_16byte; + +cls_struct_16byte cls_struct_16byte_fn(struct cls_struct_16byte b1, + struct cls_struct_16byte b2) +{ + struct cls_struct_16byte result; + + result.a = b1.a + b2.a; + result.b = b1.b + b2.b; + result.c = b1.c + b2.c; + + printf("%d %g %d %d %g %d: %d %g %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, + result.a, result.b, result.c); + + return result; +} + +static void cls_struct_16byte_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + struct cls_struct_16byte b1, b2; + + b1 = *(struct cls_struct_16byte*)(args[0]); + b2 = *(struct cls_struct_16byte*)(args[1]); + + *(cls_struct_16byte*)resp = cls_struct_16byte_fn(b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_16byte h_dbl = { 7, 8.0, 9 }; + struct cls_struct_16byte j_dbl = { 1, 9.0, 3 }; + struct cls_struct_16byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &h_dbl; + args_dbl[1] = &j_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_16byte_fn), &res_dbl, args_dbl); + /* { dg-output "7 8 9 1 9 3: 8 17 12" } */ + printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 8 17 12" } */ + + res_dbl.a = 0; + res_dbl.b = 0.0; + res_dbl.c = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_16byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(code))(h_dbl, j_dbl); + /* { dg-output "\n7 8 9 1 9 3: 8 17 12" } */ + printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 8 17 12" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c new file mode 100644 index 000000000000..9f75da80aa05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_18byte.c @@ -0,0 +1,96 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Double alignment check on darwin. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030915 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_18byte { + double a; + unsigned char b; + unsigned char c; + double d; +} cls_struct_18byte; + +cls_struct_18byte cls_struct_18byte_fn(struct cls_struct_18byte a1, + struct cls_struct_18byte a2) +{ + struct cls_struct_18byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + + + printf("%g %d %d %g %g %d %d %g: %g %d %d %g\n", a1.a, a1.b, a1.c, a1.d, + a2.a, a2.b, a2.c, a2.d, + result.a, result.b, result.c, result.d); + return result; +} + +static void +cls_struct_18byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_18byte a1, a2; + + a1 = *(struct cls_struct_18byte*)(args[0]); + a2 = *(struct cls_struct_18byte*)(args[1]); + + *(cls_struct_18byte*)resp = cls_struct_18byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 }; + struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 }; + struct cls_struct_18byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_18byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 127 126 3 4 125 124 5: 5 252 250 8" } */ + printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 5 252 250 8" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_18byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */ + printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 5 252 250 8" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c new file mode 100644 index 000000000000..278794b5b877 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_19byte.c @@ -0,0 +1,102 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Double alignment check on darwin. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030915 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_19byte { + double a; + unsigned char b; + unsigned char c; + double d; + unsigned char e; +} cls_struct_19byte; + +cls_struct_19byte cls_struct_19byte_fn(struct cls_struct_19byte a1, + struct cls_struct_19byte a2) +{ + struct cls_struct_19byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + result.e = a1.e + a2.e; + + + printf("%g %d %d %g %d %g %d %d %g %d: %g %d %d %g %d\n", + a1.a, a1.b, a1.c, a1.d, a1.e, + a2.a, a2.b, a2.c, a2.d, a2.e, + result.a, result.b, result.c, result.d, result.e); + return result; +} + +static void +cls_struct_19byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_19byte a1, a2; + + a1 = *(struct cls_struct_19byte*)(args[0]); + a2 = *(struct cls_struct_19byte*)(args[1]); + + *(cls_struct_19byte*)resp = cls_struct_19byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[6]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 }; + struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 }; + struct cls_struct_19byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_19byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ + printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e); + /* { dg-output "\nres: 5 252 250 8 239" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_19byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ + printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e); + /* { dg-output "\nres: 5 252 250 8 239" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c new file mode 100644 index 000000000000..82492c020e2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_1_1byte.c @@ -0,0 +1,89 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030902 */ + + + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_1_1byte { + unsigned char a; +} cls_struct_1_1byte; + +cls_struct_1_1byte cls_struct_1_1byte_fn(struct cls_struct_1_1byte a1, + struct cls_struct_1_1byte a2) +{ + struct cls_struct_1_1byte result; + + result.a = a1.a + a2.a; + + printf("%d %d: %d\n", a1.a, a2.a, result.a); + + return result; +} + +static void +cls_struct_1_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_1_1byte a1, a2; + + a1 = *(struct cls_struct_1_1byte*)(args[0]); + a2 = *(struct cls_struct_1_1byte*)(args[1]); + + *(cls_struct_1_1byte*)resp = cls_struct_1_1byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[2]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_1_1byte g_dbl = { 12 }; + struct cls_struct_1_1byte f_dbl = { 178 }; + struct cls_struct_1_1byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_1_1byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 178: 190" } */ + printf("res: %d\n", res_dbl.a); + /* { dg-output "\nres: 190" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_1_1byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 178: 190" } */ + printf("res: %d\n", res_dbl.a); + /* { dg-output "\nres: 190" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c new file mode 100644 index 000000000000..3f8bb28ad297 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_20byte { + double a; + double b; + int c; +} cls_struct_20byte; + +cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, + struct cls_struct_20byte a2) +{ + struct cls_struct_20byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%g %g %d %g %g %d: %g %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, + result.a, result.b, result.c); + return result; +} + +static void +cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_20byte a1, a2; + + a1 = *(struct cls_struct_20byte*)(args[0]); + a2 = *(struct cls_struct_20byte*)(args[1]); + + *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 }; + struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 }; + struct cls_struct_20byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ + printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 5 7 10" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ + printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 5 7 10" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c new file mode 100644 index 000000000000..65627273c84b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_20byte1.c @@ -0,0 +1,93 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + + + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_20byte { + int a; + double b; + double c; +} cls_struct_20byte; + +cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, + struct cls_struct_20byte a2) +{ + struct cls_struct_20byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %g %g %d %g %g: %d %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, + result.a, result.b, result.c); + return result; +} + +static void +cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_20byte a1, a2; + + a1 = *(struct cls_struct_20byte*)(args[0]); + a2 = *(struct cls_struct_20byte*)(args[1]); + + *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 }; + struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 }; + struct cls_struct_20byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ + printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 5 7 10" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ + printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 5 7 10" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c new file mode 100644 index 000000000000..1d82f6e4a45b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_24byte.c @@ -0,0 +1,113 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_24byte { + double a; + double b; + int c; + float d; +} cls_struct_24byte; + +cls_struct_24byte cls_struct_24byte_fn(struct cls_struct_24byte b0, + struct cls_struct_24byte b1, + struct cls_struct_24byte b2, + struct cls_struct_24byte b3) +{ + struct cls_struct_24byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + + printf("%g %g %d %g %g %g %d %g %g %g %d %g %g %g %d %g: %g %g %d %g\n", + b0.a, b0.b, b0.c, b0.d, + b1.a, b1.b, b1.c, b1.d, + b2.a, b2.b, b2.c, b2.d, + b3.a, b3.b, b3.c, b2.d, + result.a, result.b, result.c, result.d); + + return result; +} + +static void +cls_struct_24byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_24byte b0, b1, b2, b3; + + b0 = *(struct cls_struct_24byte*)(args[0]); + b1 = *(struct cls_struct_24byte*)(args[1]); + b2 = *(struct cls_struct_24byte*)(args[2]); + b3 = *(struct cls_struct_24byte*)(args[3]); + + *(cls_struct_24byte*)resp = cls_struct_24byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 }; + struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 }; + struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 }; + struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 }; + struct cls_struct_24byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = &ffi_type_float; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_24byte_fn), &res_dbl, args_dbl); + /* { dg-output "9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ + printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 22 15 17 25" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_24byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_24byte(*)(cls_struct_24byte, + cls_struct_24byte, + cls_struct_24byte, + cls_struct_24byte)) + (code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ + printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 22 15 17 25" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c new file mode 100644 index 000000000000..81bb0a64a3ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_2byte.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_2byte { + unsigned char a; + unsigned char b; +} cls_struct_2byte; + +cls_struct_2byte cls_struct_2byte_fn(struct cls_struct_2byte a1, + struct cls_struct_2byte a2) +{ + struct cls_struct_2byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_2byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_2byte a1, a2; + + a1 = *(struct cls_struct_2byte*)(args[0]); + a2 = *(struct cls_struct_2byte*)(args[1]); + + *(cls_struct_2byte*)resp = cls_struct_2byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_2byte g_dbl = { 12, 127 }; + struct cls_struct_2byte f_dbl = { 1, 13 }; + struct cls_struct_2byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_2byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 127 1 13: 13 140" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 13 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_2byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 127 1 13: 13 140" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 13 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c new file mode 100644 index 000000000000..b7827466f6ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3_1byte.c @@ -0,0 +1,95 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030902 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_3_1byte { + unsigned char a; + unsigned char b; + unsigned char c; +} cls_struct_3_1byte; + +cls_struct_3_1byte cls_struct_3_1byte_fn(struct cls_struct_3_1byte a1, + struct cls_struct_3_1byte a2) +{ + struct cls_struct_3_1byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, + a2.a, a2.b, a2.c, + result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_3_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_3_1byte a1, a2; + + a1 = *(struct cls_struct_3_1byte*)(args[0]); + a2 = *(struct cls_struct_3_1byte*)(args[1]); + + *(cls_struct_3_1byte*)resp = cls_struct_3_1byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_3_1byte g_dbl = { 12, 13, 14 }; + struct cls_struct_3_1byte f_dbl = { 178, 179, 180 }; + struct cls_struct_3_1byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_3_1byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 13 14 178 179 180: 190 192 194" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 190 192 194" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3_1byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 13 14 178 179 180: 190 192 194" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 190 192 194" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c new file mode 100644 index 000000000000..a02c463af9f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte1.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_3byte { + unsigned short a; + unsigned char b; +} cls_struct_3byte; + +cls_struct_3byte cls_struct_3byte_fn(struct cls_struct_3byte a1, + struct cls_struct_3byte a2) +{ + struct cls_struct_3byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_3byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_3byte a1, a2; + + a1 = *(struct cls_struct_3byte*)(args[0]); + a2 = *(struct cls_struct_3byte*)(args[1]); + + *(cls_struct_3byte*)resp = cls_struct_3byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_3byte g_dbl = { 12, 119 }; + struct cls_struct_3byte f_dbl = { 1, 15 }; + struct cls_struct_3byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_3byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 119 1 15: 13 134" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 13 134" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 119 1 15: 13 134" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 13 134" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c new file mode 100644 index 000000000000..c7251cead603 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3byte2.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_3byte_1 { + unsigned char a; + unsigned short b; +} cls_struct_3byte_1; + +cls_struct_3byte_1 cls_struct_3byte_fn1(struct cls_struct_3byte_1 a1, + struct cls_struct_3byte_1 a2) +{ + struct cls_struct_3byte_1 result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_3byte_gn1(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_3byte_1 a1, a2; + + a1 = *(struct cls_struct_3byte_1*)(args[0]); + a2 = *(struct cls_struct_3byte_1*)(args[1]); + + *(cls_struct_3byte_1*)resp = cls_struct_3byte_fn1(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_3byte_1 g_dbl = { 15, 125 }; + struct cls_struct_3byte_1 f_dbl = { 9, 19 }; + struct cls_struct_3byte_1 res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_3byte_fn1), &res_dbl, args_dbl); + /* { dg-output "15 125 9 19: 24 144" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 24 144" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn1, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_3byte_1(*)(cls_struct_3byte_1, cls_struct_3byte_1))(code))(g_dbl, f_dbl); + /* { dg-output "\n15 125 9 19: 24 144" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 24 144" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c new file mode 100644 index 000000000000..48888f8405f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_3float.c @@ -0,0 +1,95 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations:>none. + PR: none. + Originator: <compnerd@compnerd.org> 20171026 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +typedef struct cls_struct_3float { + float f; + float g; + float h; +} cls_struct_3float; + +cls_struct_3float cls_struct_3float_fn(struct cls_struct_3float a1, + struct cls_struct_3float a2) +{ + struct cls_struct_3float result; + + result.f = a1.f + a2.f; + result.g = a1.g + a2.g; + result.h = a1.h + a2.h; + + printf("%g %g %g %g %g %g: %g %g %g\n", a1.f, a1.g, a1.h, + a2.f, a2.g, a2.h, result.f, result.g, result.h); + + return result; +} + +static void +cls_struct_3float_gn(ffi_cif *cif __UNUSED__, void* resp, void **args, + void* userdata __UNUSED__) +{ + struct cls_struct_3float a1, a2; + + a1 = *(struct cls_struct_3float*)(args[0]); + a2 = *(struct cls_struct_3float*)(args[1]); + + *(cls_struct_3float*)resp = cls_struct_3float_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void *args_dbl[3]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + struct cls_struct_3float g_dbl = { 1.0f, 2.0f, 3.0f }; + struct cls_struct_3float f_dbl = { 1.0f, 2.0f, 3.0f }; + struct cls_struct_3float res_dbl; + + cls_struct_fields[0] = &ffi_type_float; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_float; + cls_struct_fields[3] = NULL; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_3float_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 3 1 2 3: 2 4 6" } */ + printf("res: %g %g %g\n", res_dbl.f, res_dbl.g, res_dbl.h); + /* { dg-output "\nres: 2 4 6" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3float_gn, NULL, code) == + FFI_OK); + + res_dbl = ((cls_struct_3float(*)(cls_struct_3float, + cls_struct_3float))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */ + printf("res: %g %g %g\n", res_dbl.f, res_dbl.g, res_dbl.h); + /* { dg-output "\nres: 2 4 6" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c new file mode 100644 index 000000000000..2d6d8b622c37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4_1byte.c @@ -0,0 +1,98 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Especially with small structures which may fit in one + register. Depending on the ABI. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030902 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_4_1byte { + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; +} cls_struct_4_1byte; + +cls_struct_4_1byte cls_struct_4_1byte_fn(struct cls_struct_4_1byte a1, + struct cls_struct_4_1byte a2) +{ + struct cls_struct_4_1byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + + printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, + a2.a, a2.b, a2.c, a2.d, + result.a, result.b, result.c, result.d); + + return result; +} + +static void +cls_struct_4_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_4_1byte a1, a2; + + a1 = *(struct cls_struct_4_1byte*)(args[0]); + a2 = *(struct cls_struct_4_1byte*)(args[1]); + + *(cls_struct_4_1byte*)resp = cls_struct_4_1byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 }; + struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 }; + struct cls_struct_4_1byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_4_1byte_fn), &res_dbl, args_dbl); + /* { dg-output "12 13 14 15 178 179 180 181: 190 192 194 196" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 190 192 194 196" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4_1byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_4_1byte(*)(cls_struct_4_1byte, cls_struct_4_1byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 13 14 15 178 179 180 181: 190 192 194 196" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 190 192 194 196" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c new file mode 100644 index 000000000000..4ac378776b5c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_4byte.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +typedef struct cls_struct_4byte { + unsigned short a; + unsigned short b; +} cls_struct_4byte; + +cls_struct_4byte cls_struct_4byte_fn(struct cls_struct_4byte a1, + struct cls_struct_4byte a2) +{ + struct cls_struct_4byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_4byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_4byte a1, a2; + + a1 = *(struct cls_struct_4byte*)(args[0]); + a2 = *(struct cls_struct_4byte*)(args[1]); + + *(cls_struct_4byte*)resp = cls_struct_4byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_4byte g_dbl = { 127, 120 }; + struct cls_struct_4byte f_dbl = { 12, 128 }; + struct cls_struct_4byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_4byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 12 128: 139 248" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 139 248" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_4byte(*)(cls_struct_4byte, cls_struct_4byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 12 128: 139 248" } */ + printf("res: %d %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 139 248" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c new file mode 100644 index 000000000000..ad9d51c248c2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5_1_byte.c @@ -0,0 +1,109 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050708 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_5byte { + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; + unsigned char e; +} cls_struct_5byte; + +cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, + struct cls_struct_5byte a2) +{ + struct cls_struct_5byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + result.e = a1.e + a2.e; + + printf("%d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d\n", + a1.a, a1.b, a1.c, a1.d, a1.e, + a2.a, a2.b, a2.c, a2.d, a2.e, + result.a, result.b, result.c, result.d, result.e); + + return result; +} + +static void +cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_5byte a1, a2; + + a1 = *(struct cls_struct_5byte*)(args[0]); + a2 = *(struct cls_struct_5byte*)(args[1]); + + *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[6]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 }; + struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 }; + struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 }; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ + printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e); + /* { dg-output "\nres: 139 248 10 6 8" } */ + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + res_dbl.d = 0; + res_dbl.e = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ + printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e); + /* { dg-output "\nres: 139 248 10 6 8" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c new file mode 100644 index 000000000000..4e0c0003c0aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_5byte.c @@ -0,0 +1,98 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_5byte { + unsigned short a; + unsigned short b; + unsigned char c; +} cls_struct_5byte; + +cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, + struct cls_struct_5byte a2) +{ + struct cls_struct_5byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, + a2.a, a2.b, a2.c, + result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_5byte a1, a2; + + a1 = *(struct cls_struct_5byte*)(args[0]); + a2 = *(struct cls_struct_5byte*)(args[1]); + + *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_5byte g_dbl = { 127, 120, 1 }; + struct cls_struct_5byte f_dbl = { 12, 128, 9 }; + struct cls_struct_5byte res_dbl = { 0, 0, 0 }; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 12 128 9: 139 248 10" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 139 248 10" } */ + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 12 128 9: 139 248 10" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 139 248 10" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c new file mode 100644 index 000000000000..a55edc2c7b9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_64byte.c @@ -0,0 +1,124 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_64byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; +} cls_struct_64byte; + +cls_struct_64byte cls_struct_64byte_fn(struct cls_struct_64byte b0, + struct cls_struct_64byte b1, + struct cls_struct_64byte b2, + struct cls_struct_64byte b3) +{ + struct cls_struct_64byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + + printf("%g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h); + + return result; +} + +static void +cls_struct_64byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_64byte b0, b1, b2, b3; + + b0 = *(struct cls_struct_64byte*)(args[0]); + b1 = *(struct cls_struct_64byte*)(args[1]); + b2 = *(struct cls_struct_64byte*)(args[2]); + b3 = *(struct cls_struct_64byte*)(args[3]); + + *(cls_struct_64byte*)resp = cls_struct_64byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[9]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_64byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0 }; + struct cls_struct_64byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0 }; + struct cls_struct_64byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0 }; + struct cls_struct_64byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0 }; + struct cls_struct_64byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_64byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18" } */ + printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_64byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_64byte(*)(cls_struct_64byte, + cls_struct_64byte, + cls_struct_64byte, + cls_struct_64byte)) + (code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18" } */ + printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c new file mode 100644 index 000000000000..b4dcdba47283 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6_1_byte.c @@ -0,0 +1,113 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050708 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_6byte { + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; + unsigned char e; + unsigned char f; +} cls_struct_6byte; + +cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, + struct cls_struct_6byte a2) +{ + struct cls_struct_6byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + result.e = a1.e + a2.e; + result.f = a1.f + a2.f; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, + a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, + result.a, result.b, result.c, result.d, result.e, result.f); + + return result; +} + +static void +cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_6byte a1, a2; + + a1 = *(struct cls_struct_6byte*)(args[0]); + a2 = *(struct cls_struct_6byte*)(args[1]); + + *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[7]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 }; + struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 }; + struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 }; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = &ffi_type_uchar; + cls_struct_fields[6] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ + printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f); + /* { dg-output "\nres: 139 248 10 6 8 10" } */ + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + res_dbl.d = 0; + res_dbl.e = 0; + res_dbl.f = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ + printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f); + /* { dg-output "\nres: 139 248 10 6 8 10" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c new file mode 100644 index 000000000000..740678017b3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_6byte.c @@ -0,0 +1,99 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_6byte { + unsigned short a; + unsigned short b; + unsigned char c; + unsigned char d; +} cls_struct_6byte; + +cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, + struct cls_struct_6byte a2) +{ + struct cls_struct_6byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + + printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, + a2.a, a2.b, a2.c, a2.d, + result.a, result.b, result.c, result.d); + + return result; +} + +static void +cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_6byte a1, a2; + + a1 = *(struct cls_struct_6byte*)(args[0]); + a2 = *(struct cls_struct_6byte*)(args[1]); + + *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 }; + struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 }; + struct cls_struct_6byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 128 12 128 9 127: 139 248 10 255" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 139 248 10 255" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 139 248 10 255" } */ + + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c new file mode 100644 index 000000000000..14a7e96f9d65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7_1_byte.c @@ -0,0 +1,117 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20050708 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_7byte { + unsigned char a; + unsigned char b; + unsigned char c; + unsigned char d; + unsigned char e; + unsigned char f; + unsigned char g; +} cls_struct_7byte; + +cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, + struct cls_struct_7byte a2) +{ + struct cls_struct_7byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + result.e = a1.e + a2.e; + result.f = a1.f + a2.f; + result.g = a1.g + a2.g; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d %d\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, + a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, + result.a, result.b, result.c, result.d, result.e, result.f, result.g); + + return result; +} + +static void +cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_7byte a1, a2; + + a1 = *(struct cls_struct_7byte*)(args[0]); + a2 = *(struct cls_struct_7byte*)(args[1]); + + *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[8]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 }; + struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 }; + struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 }; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_uchar; + cls_struct_fields[4] = &ffi_type_uchar; + cls_struct_fields[5] = &ffi_type_uchar; + cls_struct_fields[6] = &ffi_type_uchar; + cls_struct_fields[7] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ + printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ + + res_dbl.a = 0; + res_dbl.b = 0; + res_dbl.c = 0; + res_dbl.d = 0; + res_dbl.e = 0; + res_dbl.f = 0; + res_dbl.g = 0; + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ + printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c new file mode 100644 index 000000000000..1645cc635f9a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_7byte.c @@ -0,0 +1,97 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_7byte { + unsigned short a; + unsigned short b; + unsigned char c; + unsigned short d; +} cls_struct_7byte; + +cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, + struct cls_struct_7byte a2) +{ + struct cls_struct_7byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + result.d = a1.d + a2.d; + + printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, + a2.a, a2.b, a2.c, a2.d, + result.a, result.b, result.c, result.d); + + return result; +} + +static void +cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_7byte a1, a2; + + a1 = *(struct cls_struct_7byte*)(args[0]); + a2 = *(struct cls_struct_7byte*)(args[1]); + + *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 }; + struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 }; + struct cls_struct_7byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_ushort; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = &ffi_type_ushort; + cls_struct_fields[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); + /* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 139 248 10 509" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */ + printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); + /* { dg-output "\nres: 139 248 10 509" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c new file mode 100644 index 000000000000..f6c1ea570ac8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_8byte.c @@ -0,0 +1,88 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Check overlapping. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_8byte { + int a; + float b; +} cls_struct_8byte; + +cls_struct_8byte cls_struct_8byte_fn(struct cls_struct_8byte a1, + struct cls_struct_8byte a2) +{ + struct cls_struct_8byte result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + + printf("%d %g %d %g: %d %g\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); + + return result; +} + +static void +cls_struct_8byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_8byte a1, a2; + + a1 = *(struct cls_struct_8byte*)(args[0]); + a2 = *(struct cls_struct_8byte*)(args[1]); + + *(cls_struct_8byte*)resp = cls_struct_8byte_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_8byte g_dbl = { 1, 2.0 }; + struct cls_struct_8byte f_dbl = { 4, 5.0 }; + struct cls_struct_8byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_8byte_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 4 5: 5 7" } */ + printf("res: %d %g\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 5 7" } */ + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_8byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_8byte(*)(cls_struct_8byte, cls_struct_8byte))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 4 5: 5 7" } */ + printf("res: %d %g\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 5 7" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c new file mode 100644 index 000000000000..0b8572223c9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte1.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Darwin/AIX do double-word + alignment of the struct if the first element is a double. + Check that it does not here. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030914 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_9byte { + int a; + double b; +} cls_struct_9byte; + +cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, + struct cls_struct_9byte b2) +{ + struct cls_struct_9byte result; + + result.a = b1.a + b2.a; + result.b = b1.b + b2.b; + + printf("%d %g %d %g: %d %g\n", b1.a, b1.b, b2.a, b2.b, + result.a, result.b); + + return result; +} + +static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + struct cls_struct_9byte b1, b2; + + b1 = *(struct cls_struct_9byte*)(args[0]); + b2 = *(struct cls_struct_9byte*)(args[1]); + + *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + struct cls_struct_9byte h_dbl = { 7, 8.0}; + struct cls_struct_9byte j_dbl = { 1, 9.0}; + struct cls_struct_9byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_sint; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &h_dbl; + args_dbl[1] = &j_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); + /* { dg-output "7 8 1 9: 8 17" } */ + printf("res: %d %g\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 8 17" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); + /* { dg-output "\n7 8 1 9: 8 17" } */ + printf("res: %d %g\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 8 17" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c new file mode 100644 index 000000000000..edf991de73ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_9byte2.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Depending on the ABI. Darwin/AIX do double-word + alignment of the struct if the first element is a double. + Check that it does here. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030914 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_9byte { + double a; + int b; +} cls_struct_9byte; + +cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, + struct cls_struct_9byte b2) +{ + struct cls_struct_9byte result; + + result.a = b1.a + b2.a; + result.b = b1.b + b2.b; + + printf("%g %d %g %d: %g %d\n", b1.a, b1.b, b2.a, b2.b, + result.a, result.b); + + return result; +} + +static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + struct cls_struct_9byte b1, b2; + + b1 = *(struct cls_struct_9byte*)(args[0]); + b2 = *(struct cls_struct_9byte*)(args[1]); + + *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + struct cls_struct_9byte h_dbl = { 7.0, 8}; + struct cls_struct_9byte j_dbl = { 1.0, 9}; + struct cls_struct_9byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_sint; + cls_struct_fields[2] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &h_dbl; + args_dbl[1] = &j_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); + /* { dg-output "7 8 1 9: 8 17" } */ + printf("res: %g %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 8 17" } */ + + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); + /* { dg-output "\n7 8 1 9: 8 17" } */ + printf("res: %g %d\n", res_dbl.a, res_dbl.b); + /* { dg-output "\nres: 8 17" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c new file mode 100644 index 000000000000..aad5f3ced6a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_double.c @@ -0,0 +1,93 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of double. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + + + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + double b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c new file mode 100644 index 000000000000..37e085529e7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_float.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of float. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + float b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c new file mode 100644 index 000000000000..b3322d861513 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble.c @@ -0,0 +1,92 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of long double. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + long double b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_longdouble; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c new file mode 100644 index 000000000000..cc1c43b8ca45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c @@ -0,0 +1,132 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of long double. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ + +#include "ffitest.h" + +typedef struct cls_struct_align { + long double a; + long double b; + long double c; + long double d; + long double e; + long double f; + long double g; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn( + cls_struct_align a1, + cls_struct_align a2) +{ + struct cls_struct_align r; + + r.a = a1.a + a2.a; + r.b = a1.b + a2.b; + r.c = a1.c + a2.c; + r.d = a1.d + a2.d; + r.e = a1.e + a2.e; + r.f = a1.f + a2.f; + r.g = a1.g + a2.g; + + printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: " + "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, + a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, + r.a, r.b, r.c, r.d, r.e, r.f, r.g); + + return r; +} + +cls_struct_align cls_struct_align_fn2( + cls_struct_align a1) +{ + struct cls_struct_align r; + + r.a = a1.a + 1; + r.b = a1.b + 1; + r.c = a1.c + 1; + r.d = a1.d + 1; + r.e = a1.e + 1; + r.f = a1.f + 1; + r.g = a1.g + 1; + + printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg: " + "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, + r.a, r.b, r.c, r.d, r.e, r.f, r.g); + + return r; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[8]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; + struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_longdouble; + cls_struct_fields[1] = &ffi_type_longdouble; + cls_struct_fields[2] = &ffi_type_longdouble; + cls_struct_fields[3] = &ffi_type_longdouble; + cls_struct_fields[4] = &ffi_type_longdouble; + cls_struct_fields[5] = &ffi_type_longdouble; + cls_struct_fields[6] = &ffi_type_longdouble; + cls_struct_fields[7] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ + printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ + printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c new file mode 100644 index 000000000000..5d3bec071968 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c @@ -0,0 +1,115 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of long double. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/18/2007 +*/ + +/* { dg-do run { xfail strongarm*-*-* } } */ +/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ + +#include "ffitest.h" + +typedef struct cls_struct_align { + long double a; + long double b; + long double c; + long double d; + long double e; + double f; + long double g; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn( + cls_struct_align a1, + cls_struct_align a2) +{ + struct cls_struct_align r; + + r.a = a1.a + a2.a; + r.b = a1.b + a2.b; + r.c = a1.c + a2.c; + r.d = a1.d + a2.d; + r.e = a1.e + a2.e; + r.f = a1.f + a2.f; + r.g = a1.g + a2.g; + + printf("%Lg %Lg %Lg %Lg %Lg %g %Lg %Lg %Lg %Lg %Lg %Lg %g %Lg: " + "%Lg %Lg %Lg %Lg %Lg %g %Lg\n", + a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, + a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, + r.a, r.b, r.c, r.d, r.e, r.f, r.g); + + return r; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[8]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[3]; + + struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; + struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_longdouble; + cls_struct_fields[1] = &ffi_type_longdouble; + cls_struct_fields[2] = &ffi_type_longdouble; + cls_struct_fields[3] = &ffi_type_longdouble; + cls_struct_fields[4] = &ffi_type_longdouble; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_longdouble; + cls_struct_fields[7] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ + printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ + printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); + /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ + + exit(0); +} + + + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c new file mode 100644 index 000000000000..8fbf36a5c115 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_pointer.c @@ -0,0 +1,95 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of pointer. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + void *b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = (void *)((uintptr_t)a1.b + (uintptr_t)a2.b); + result.c = a1.c + a2.c; + + printf("%d %" PRIuPTR " %d %d %" PRIuPTR " %d: %d %" PRIuPTR " %d\n", + a1.a, (uintptr_t)a1.b, a1.c, + a2.a, (uintptr_t)a2.b, a2.c, + result.a, (uintptr_t)result.b, + result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, (void *)4951, 127 }; + struct cls_struct_align f_dbl = { 1, (void *)9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_pointer; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c new file mode 100644 index 000000000000..039b87473200 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint16.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of sint16. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + signed short b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_sshort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c new file mode 100644 index 000000000000..c96c6d136df1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint32.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of sint32. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + signed int b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_sint; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c new file mode 100644 index 000000000000..9aa7bdddff7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_sint64.c @@ -0,0 +1,92 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of sint64. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + +/* { dg-do run } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + signed long long b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_sint64; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c new file mode 100644 index 000000000000..97620b79d1fb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint16.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of uint16. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + unsigned short b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_ushort; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c new file mode 100644 index 000000000000..5766fadf0dc9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint32.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of uint32. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + unsigned int b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uint; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c new file mode 100644 index 000000000000..a52cb8939c4f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_align_uint64.c @@ -0,0 +1,93 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of uint64. + Limitations: none. + PR: none. + Originator: <hos@tamanegi.org> 20031203 */ + + +/* { dg-do run } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" + +typedef struct cls_struct_align { + unsigned char a; + unsigned long long b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, + struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_align g_dbl = { 12, 4951, 127 }; + struct cls_struct_align f_dbl = { 1, 9320, 13 }; + struct cls_struct_align res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uint64; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &g_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); + /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); + /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ + printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); + /* { dg-output "\nres: 13 14271 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c new file mode 100644 index 000000000000..e451dea51ba6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_dbls_struct.c @@ -0,0 +1,66 @@ +/* Area: ffi_call, closure_call + Purpose: Check double arguments in structs. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/23/2007 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +typedef struct Dbls { + double x; + double y; +} Dbls; + +void +closure_test_fn(Dbls p) +{ + printf("%.1f %.1f\n", p.x, p.y); +} + +void +closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args, void* userdata __UNUSED__) +{ + closure_test_fn(*(Dbls*)args[0]); +} + +int main(int argc __UNUSED__, char** argv __UNUSED__) +{ + ffi_cif cif; + + void *code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type* cl_arg_types[1]; + + ffi_type ts1_type; + ffi_type* ts1_type_elements[4]; + + Dbls arg = { 1.0, 2.0 }; + + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + + ts1_type_elements[0] = &ffi_type_double; + ts1_type_elements[1] = &ffi_type_double; + ts1_type_elements[2] = NULL; + + cl_arg_types[0] = &ts1_type; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_void, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK); + + ((void*(*)(Dbls))(code))(arg); + /* { dg-output "1.0 2.0" } */ + + closure_test_fn(arg); + /* { dg-output "\n1.0 2.0" } */ + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double.c new file mode 100644 index 000000000000..84ad4cb7d925 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double.c @@ -0,0 +1,43 @@ +/* Area: closure_call + Purpose: Check return value double. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) + { + *(double *)resp = *(double *)args[0]; + + printf("%f: %f\n",*(double *)args[0], + *(double *)resp); + } +typedef double (*cls_ret_double)(double); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + double res; + + cl_arg_types[0] = &ffi_type_double; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_double, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_double)code))(21474.789); + /* { dg-output "21474.789000: 21474.789000" } */ + printf("res: %.6f\n", res); + /* { dg-output "\nres: 21474.789000" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c new file mode 100644 index 000000000000..e077f92b8638 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_double_va.c @@ -0,0 +1,61 @@ +/* Area: ffi_call, closure_call + Purpose: Test doubles passed in variable argument lists. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-output "" { xfail avr32*-*-* } } */ +/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ + +#include "ffitest.h" + +static void +cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + char* format = *(char**)args[0]; + double doubleValue = *(double*)args[1]; + + *(ffi_arg*)resp = printf(format, doubleValue); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; + ffi_type* arg_types[3]; + + char* format = "%.1f\n"; + double doubleArg = 7; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_double; + arg_types[2] = NULL; + + /* This printf call is variadic */ + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, + arg_types) == FFI_OK); + + args[0] = &format; + args[1] = &doubleArg; + args[2] = NULL; + + ffi_call(&cif, FFI_FN(printf), &res, args); + /* { dg-output "7.0" } */ + printf("res: %d\n", (int) res); + /* { dg-output "\nres: 4" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, + code) == FFI_OK); + + res = ((int(*)(char*, ...))(code))(format, doubleArg); + /* { dg-output "\n7.0" } */ + printf("res: %d\n", (int) res); + /* { dg-output "\nres: 4" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c new file mode 100644 index 000000000000..0090fed90631 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_float.c @@ -0,0 +1,42 @@ +/* Area: closure_call + Purpose: Check return value float. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_float_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) + { + *(float *)resp = *(float *)args[0]; + + printf("%g: %g\n",*(float *)args[0], + *(float *)resp); + } + +typedef float (*cls_ret_float)(float); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + float res; + + cl_arg_types[0] = &ffi_type_float; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_float, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_float_fn, NULL, code) == FFI_OK); + res = ((((cls_ret_float)code)(-2122.12))); + /* { dg-output "\\-2122.12: \\-2122.12" } */ + printf("res: %.6f\n", res); + /* { dg-output "\nres: \-2122.120117" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c new file mode 100644 index 000000000000..d24e72e4aed3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble.c @@ -0,0 +1,105 @@ +/* Area: ffi_call, closure_call + Purpose: Check long double arguments. + Limitations: none. + PR: none. + Originator: Blake Chaffin */ + +/* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have + remove the xfail for arm*-*-* below, until we know more. */ +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ + +#include "ffitest.h" + +long double cls_ldouble_fn( + long double a1, + long double a2, + long double a3, + long double a4, + long double a5, + long double a6, + long double a7, + long double a8) +{ + long double r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8; + + printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n", + a1, a2, a3, a4, a5, a6, a7, a8, r); + + return r; +} + +static void +cls_ldouble_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + long double a1 = *(long double*)args[0]; + long double a2 = *(long double*)args[1]; + long double a3 = *(long double*)args[2]; + long double a4 = *(long double*)args[3]; + long double a5 = *(long double*)args[4]; + long double a6 = *(long double*)args[5]; + long double a7 = *(long double*)args[6]; + long double a8 = *(long double*)args[7]; + + *(long double*)resp = cls_ldouble_fn( + a1, a2, a3, a4, a5, a6, a7, a8); +} + +int main(void) +{ + ffi_cif cif; + void* code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[9]; + ffi_type* arg_types[9]; + long double res = 0; + + long double arg1 = 1; + long double arg2 = 2; + long double arg3 = 3; + long double arg4 = 4; + long double arg5 = 5; + long double arg6 = 6; + long double arg7 = 7; + long double arg8 = 8; + + arg_types[0] = &ffi_type_longdouble; + arg_types[1] = &ffi_type_longdouble; + arg_types[2] = &ffi_type_longdouble; + arg_types[3] = &ffi_type_longdouble; + arg_types[4] = &ffi_type_longdouble; + arg_types[5] = &ffi_type_longdouble; + arg_types[6] = &ffi_type_longdouble; + arg_types[7] = &ffi_type_longdouble; + arg_types[8] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble, + arg_types) == FFI_OK); + + args[0] = &arg1; + args[1] = &arg2; + args[2] = &arg3; + args[3] = &arg4; + args[4] = &arg5; + args[5] = &arg6; + args[6] = &arg7; + args[7] = &arg8; + args[8] = NULL; + + ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args); + /* { dg-output "1 2 3 4 5 6 7 8: 36" } */ + printf("res: %Lg\n", res); + /* { dg-output "\nres: 36" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK); + + res = ((long double(*)(long double, long double, long double, long double, + long double, long double, long double, long double))(code))(arg1, arg2, + arg3, arg4, arg5, arg6, arg7, arg8); + /* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */ + printf("res: %Lg\n", res); + /* { dg-output "\nres: 36" } */ + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c new file mode 100644 index 000000000000..39b438b289a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_longdouble_va.c @@ -0,0 +1,61 @@ +/* Area: ffi_call, closure_call + Purpose: Test long doubles passed in variable argument lists. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */ +/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ + +#include "ffitest.h" + +static void +cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + char* format = *(char**)args[0]; + long double ldValue = *(long double*)args[1]; + + *(ffi_arg*)resp = printf(format, ldValue); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; + ffi_type* arg_types[3]; + + char* format = "%.1Lf\n"; + long double ldArg = 7; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_longdouble; + arg_types[2] = NULL; + + /* This printf call is variadic */ + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, + arg_types) == FFI_OK); + + args[0] = &format; + args[1] = &ldArg; + args[2] = NULL; + + ffi_call(&cif, FFI_FN(printf), &res, args); + /* { dg-output "7.0" } */ + printf("res: %d\n", (int) res); + /* { dg-output "\nres: 4" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, + code) == FFI_OK); + + res = ((int(*)(char*, ...))(code))(format, ldArg); + /* { dg-output "\n7.0" } */ + printf("res: %d\n", (int) res); + /* { dg-output "\nres: 4" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c new file mode 100644 index 000000000000..7fd6c8207ac7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_args.c @@ -0,0 +1,70 @@ +/* Area: closure_call + Purpose: Check closures called with many args of mixed types + Limitations: none. + PR: none. + Originator: <david.schneider@picle.org> */ + +/* { dg-do run } */ +#include "ffitest.h" +#include <float.h> +#include <math.h> + +#define NARGS 16 + +static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + int i; + double r = 0; + double t; + for(i = 0; i < NARGS; i++) + { + if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15) + { + t = *(long int *)args[i]; + CHECK(t == i+1); + } + else + { + t = *(double *)args[i]; + CHECK(fabs(t - ((i+1) * 0.1)) < FLT_EPSILON); + } + r += t; + } + *(double *)resp = r; +} +typedef double (*cls_ret_double)(double, double, double, double, long int, +double, double, double, double, long int, double, long int, double, long int, +double, long int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[NARGS]; + double res; + int i; + double expected = 64.9; + + for(i = 0; i < NARGS; i++) + { + if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15) + cl_arg_types[i] = &ffi_type_slong; + else + cl_arg_types[i] = &ffi_type_double; + } + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, NARGS, + &ffi_type_double, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK); + + res = (((cls_ret_double)code))(0.1, 0.2, 0.3, 0.4, 5, 0.6, 0.7, 0.8, 0.9, 10, + 1.1, 12, 1.3, 14, 1.5, 16); + if (fabs(res - expected) < FLT_EPSILON) + exit(0); + else + abort(); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c new file mode 100644 index 000000000000..62b0697ac01c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c @@ -0,0 +1,55 @@ +/* Area: closure_call + Purpose: Check register allocation for closure calls with many float and double arguments + Limitations: none. + PR: none. + Originator: <david.schneider@picle.org> */ + +/* { dg-do run } */ +#include "ffitest.h" +#include <float.h> +#include <math.h> + +#define NARGS 16 + +static void cls_mixed_float_double_fn(ffi_cif* cif , void* ret, void** args, + void* userdata __UNUSED__) +{ + double r = 0; + unsigned int i; + double t; + for(i=0; i < cif->nargs; i++) + { + if(cif->arg_types[i] == &ffi_type_double) { + t = *(((double**)(args))[i]); + } else { + t = *(((float**)(args))[i]); + } + r += t; + } + *((double*)ret) = r; +} +typedef double (*cls_mixed)(double, float, double, double, double, double, double, float, float, double, float, float); + +int main (void) +{ + ffi_cif cif; + ffi_closure *closure; + void* code; + ffi_type *argtypes[12] = {&ffi_type_double, &ffi_type_float, &ffi_type_double, + &ffi_type_double, &ffi_type_double, &ffi_type_double, + &ffi_type_double, &ffi_type_float, &ffi_type_float, + &ffi_type_double, &ffi_type_float, &ffi_type_float}; + + + closure = ffi_closure_alloc(sizeof(ffi_closure), (void**)&code); + if(closure ==NULL) + abort(); + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 12, &ffi_type_double, argtypes) == FFI_OK); + CHECK(ffi_prep_closure_loc(closure, &cif, cls_mixed_float_double_fn, NULL, code) == FFI_OK); + double ret = ((cls_mixed)code)(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2); + ffi_closure_free(closure); + if(fabs(ret - 7.8) < FLT_EPSILON) + exit(0); + else + abort(); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c new file mode 100644 index 000000000000..71df7b6516e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_schar.c @@ -0,0 +1,74 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple signed char values. + Limitations: none. + PR: PR13221. + Originator: <hos@tamanegi.org> 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +signed char test_func_fn(signed char a1, signed char a2) +{ + signed char result; + + result = a1 + a2; + + printf("%d %d: %d\n", a1, a2, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + signed char a1, a2; + + a1 = *(signed char *)avals[0]; + a2 = *(signed char *)avals[1]; + + *(ffi_arg *)rval = test_func_fn(a1, a2); + +} + +typedef signed char (*test_type)(signed char, signed char); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[3]; + ffi_type * cl_arg_types[3]; + ffi_arg res_call; + signed char a, b, res_closure; + + a = 2; + b = 125; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = NULL; + + cl_arg_types[0] = &ffi_type_schar; + cl_arg_types[1] = &ffi_type_schar; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_schar, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "2 125: 127" } */ + printf("res: %d\n", (signed char)res_call); + /* { dg-output "\nres: 127" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(2, 125); + /* { dg-output "\n2 125: 127" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 127" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c new file mode 100644 index 000000000000..4c3915326676 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshort.c @@ -0,0 +1,74 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple signed short values. + Limitations: none. + PR: PR13221. + Originator: <andreast@gcc.gnu.org> 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +signed short test_func_fn(signed short a1, signed short a2) +{ + signed short result; + + result = a1 + a2; + + printf("%d %d: %d\n", a1, a2, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + signed short a1, a2; + + a1 = *(signed short *)avals[0]; + a2 = *(signed short *)avals[1]; + + *(ffi_arg *)rval = test_func_fn(a1, a2); + +} + +typedef signed short (*test_type)(signed short, signed short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[3]; + ffi_type * cl_arg_types[3]; + ffi_arg res_call; + unsigned short a, b, res_closure; + + a = 2; + b = 32765; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = NULL; + + cl_arg_types[0] = &ffi_type_sshort; + cl_arg_types[1] = &ffi_type_sshort; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_sshort, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "2 32765: 32767" } */ + printf("res: %d\n", (unsigned short)res_call); + /* { dg-output "\nres: 32767" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(2, 32765); + /* { dg-output "\n2 32765: 32767" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 32767" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c new file mode 100644 index 000000000000..1c3aeb5a66c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c @@ -0,0 +1,86 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple signed short/char values. + Limitations: none. + PR: PR13221. + Originator: <andreast@gcc.gnu.org> 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +signed short test_func_fn(signed char a1, signed short a2, + signed char a3, signed short a4) +{ + signed short result; + + result = a1 + a2 + a3 + a4; + + printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + signed char a1, a3; + signed short a2, a4; + + a1 = *(signed char *)avals[0]; + a2 = *(signed short *)avals[1]; + a3 = *(signed char *)avals[2]; + a4 = *(signed short *)avals[3]; + + *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); + +} + +typedef signed short (*test_type)(signed char, signed short, + signed char, signed short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[5]; + ffi_type * cl_arg_types[5]; + ffi_arg res_call; + signed char a, c; + signed short b, d, res_closure; + + a = 1; + b = 32765; + c = 127; + d = -128; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = &c; + args_dbl[3] = &d; + args_dbl[4] = NULL; + + cl_arg_types[0] = &ffi_type_schar; + cl_arg_types[1] = &ffi_type_sshort; + cl_arg_types[2] = &ffi_type_schar; + cl_arg_types[3] = &ffi_type_sshort; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_sshort, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "1 32765 127 -128: 32765" } */ + printf("res: %d\n", (signed short)res_call); + /* { dg-output "\nres: 32765" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(1, 32765, 127, -128); + /* { dg-output "\n1 32765 127 -128: 32765" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 32765" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c new file mode 100644 index 000000000000..009c02c72ba5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_uchar.c @@ -0,0 +1,91 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple unsigned char values. + Limitations: none. + PR: PR13221. + Originator: <andreast@gcc.gnu.org> 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +unsigned char test_func_fn(unsigned char a1, unsigned char a2, + unsigned char a3, unsigned char a4) +{ + unsigned char result; + + result = a1 + a2 + a3 + a4; + + printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + unsigned char a1, a2, a3, a4; + + a1 = *(unsigned char *)avals[0]; + a2 = *(unsigned char *)avals[1]; + a3 = *(unsigned char *)avals[2]; + a4 = *(unsigned char *)avals[3]; + + *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); + +} + +typedef unsigned char (*test_type)(unsigned char, unsigned char, + unsigned char, unsigned char); + +void test_func(ffi_cif *cif __UNUSED__, void *rval __UNUSED__, void **avals, + void *data __UNUSED__) +{ + printf("%d %d %d %d\n", *(unsigned char *)avals[0], + *(unsigned char *)avals[1], *(unsigned char *)avals[2], + *(unsigned char *)avals[3]); +} +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[5]; + ffi_type * cl_arg_types[5]; + ffi_arg res_call; + unsigned char a, b, c, d, res_closure; + + a = 1; + b = 2; + c = 127; + d = 125; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = &c; + args_dbl[3] = &d; + args_dbl[4] = NULL; + + cl_arg_types[0] = &ffi_type_uchar; + cl_arg_types[1] = &ffi_type_uchar; + cl_arg_types[2] = &ffi_type_uchar; + cl_arg_types[3] = &ffi_type_uchar; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_uchar, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "1 2 127 125: 255" } */ + printf("res: %d\n", (unsigned char)res_call); + /* { dg-output "\nres: 255" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(1, 2, 127, 125); + /* { dg-output "\n1 2 127 125: 255" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 255" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c new file mode 100644 index 000000000000..dd10ca734685 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushort.c @@ -0,0 +1,74 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple unsigned short values. + Limitations: none. + PR: PR13221. + Originator: <andreast@gcc.gnu.org> 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +unsigned short test_func_fn(unsigned short a1, unsigned short a2) +{ + unsigned short result; + + result = a1 + a2; + + printf("%d %d: %d\n", a1, a2, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + unsigned short a1, a2; + + a1 = *(unsigned short *)avals[0]; + a2 = *(unsigned short *)avals[1]; + + *(ffi_arg *)rval = test_func_fn(a1, a2); + +} + +typedef unsigned short (*test_type)(unsigned short, unsigned short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[3]; + ffi_type * cl_arg_types[3]; + ffi_arg res_call; + unsigned short a, b, res_closure; + + a = 2; + b = 32765; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = NULL; + + cl_arg_types[0] = &ffi_type_ushort; + cl_arg_types[1] = &ffi_type_ushort; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, + &ffi_type_ushort, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "2 32765: 32767" } */ + printf("res: %d\n", (unsigned short)res_call); + /* { dg-output "\nres: 32767" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(2, 32765); + /* { dg-output "\n2 32765: 32767" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 32767" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c new file mode 100644 index 000000000000..2588e97f987f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c @@ -0,0 +1,86 @@ +/* Area: ffi_call, closure_call + Purpose: Check passing of multiple unsigned short/char values. + Limitations: none. + PR: PR13221. + Originator: <andreast@gcc.gnu.org> 20031129 */ + +/* { dg-do run } */ +#include "ffitest.h" + +unsigned short test_func_fn(unsigned char a1, unsigned short a2, + unsigned char a3, unsigned short a4) +{ + unsigned short result; + + result = a1 + a2 + a3 + a4; + + printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); + + return result; + +} + +static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, + void *data __UNUSED__) +{ + unsigned char a1, a3; + unsigned short a2, a4; + + a1 = *(unsigned char *)avals[0]; + a2 = *(unsigned short *)avals[1]; + a3 = *(unsigned char *)avals[2]; + a4 = *(unsigned short *)avals[3]; + + *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); + +} + +typedef unsigned short (*test_type)(unsigned char, unsigned short, + unsigned char, unsigned short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void * args_dbl[5]; + ffi_type * cl_arg_types[5]; + ffi_arg res_call; + unsigned char a, c; + unsigned short b, d, res_closure; + + a = 1; + b = 2; + c = 127; + d = 128; + + args_dbl[0] = &a; + args_dbl[1] = &b; + args_dbl[2] = &c; + args_dbl[3] = &d; + args_dbl[4] = NULL; + + cl_arg_types[0] = &ffi_type_uchar; + cl_arg_types[1] = &ffi_type_ushort; + cl_arg_types[2] = &ffi_type_uchar; + cl_arg_types[3] = &ffi_type_ushort; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &ffi_type_ushort, cl_arg_types) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); + /* { dg-output "1 2 127 128: 258" } */ + printf("res: %d\n", (unsigned short)res_call); + /* { dg-output "\nres: 258" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); + + res_closure = (*((test_type)code))(1, 2, 127, 128); + /* { dg-output "\n1 2 127 128: 258" } */ + printf("res: %d\n", res_closure); + /* { dg-output "\nres: 258" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c new file mode 100644 index 000000000000..d82a87a71b61 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer.c @@ -0,0 +1,74 @@ +/* Area: ffi_call, closure_call + Purpose: Check pointer arguments. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +void* cls_pointer_fn(void* a1, void* a2) +{ + void* result = (void*)((intptr_t)a1 + (intptr_t)a2); + + printf("0x%08x 0x%08x: 0x%08x\n", + (unsigned int)(uintptr_t) a1, + (unsigned int)(uintptr_t) a2, + (unsigned int)(uintptr_t) result); + + return result; +} + +static void +cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + void* a1 = *(void**)(args[0]); + void* a2 = *(void**)(args[1]); + + *(void**)resp = cls_pointer_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; + /* ffi_type cls_pointer_type; */ + ffi_type* arg_types[3]; + +/* cls_pointer_type.size = sizeof(void*); + cls_pointer_type.alignment = 0; + cls_pointer_type.type = FFI_TYPE_POINTER; + cls_pointer_type.elements = NULL;*/ + + void* arg1 = (void*)0x12345678; + void* arg2 = (void*)0x89abcdef; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_pointer; + arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, + arg_types) == FFI_OK); + + args[0] = &arg1; + args[1] = &arg2; + args[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_pointer_fn), &res, args); + /* { dg-output "0x12345678 0x89abcdef: 0x9be02467" } */ + printf("res: 0x%08x\n", (unsigned int) res); + /* { dg-output "\nres: 0x9be02467" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); + + res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); + /* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */ + printf("res: 0x%08x\n", (unsigned int) res); + /* { dg-output "\nres: 0x9be02467" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c new file mode 100644 index 000000000000..1f1d9157b9d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_pointer_stack.c @@ -0,0 +1,142 @@ +/* Area: ffi_call, closure_call + Purpose: Check pointer arguments across multiple hideous stack frames. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/7/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +static long dummyVar; + +long dummy_func( + long double a1, char b1, + long double a2, char b2, + long double a3, char b3, + long double a4, char b4) +{ + return a1 + b1 + a2 + b2 + a3 + b3 + a4 + b4; +} + +void* cls_pointer_fn2(void* a1, void* a2) +{ + long double trample1 = (intptr_t)a1 + (intptr_t)a2; + char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; + long double trample3 = (intptr_t)trample1 + (intptr_t)a1; + char trample4 = trample2 + ((char*)&a1)[1]; + long double trample5 = (intptr_t)trample3 + (intptr_t)a2; + char trample6 = trample4 + ((char*)&a2)[1]; + long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; + char trample8 = trample6 + trample2; + void* result; + + dummyVar = dummy_func(trample1, trample2, trample3, trample4, + trample5, trample6, trample7, trample8); + + result = (void*)((intptr_t)a1 + (intptr_t)a2); + + printf("0x%08x 0x%08x: 0x%08x\n", + (unsigned int)(uintptr_t) a1, + (unsigned int)(uintptr_t) a2, + (unsigned int)(uintptr_t) result); + + return result; +} + +void* cls_pointer_fn1(void* a1, void* a2) +{ + long double trample1 = (intptr_t)a1 + (intptr_t)a2; + char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; + long double trample3 = (intptr_t)trample1 + (intptr_t)a1; + char trample4 = trample2 + ((char*)&a1)[1]; + long double trample5 = (intptr_t)trample3 + (intptr_t)a2; + char trample6 = trample4 + ((char*)&a2)[1]; + long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; + char trample8 = trample6 + trample2; + void* result; + + dummyVar = dummy_func(trample1, trample2, trample3, trample4, + trample5, trample6, trample7, trample8); + + result = (void*)((intptr_t)a1 + (intptr_t)a2); + + printf("0x%08x 0x%08x: 0x%08x\n", + (unsigned int)(intptr_t) a1, + (unsigned int)(intptr_t) a2, + (unsigned int)(intptr_t) result); + + result = cls_pointer_fn2(result, a1); + + return result; +} + +static void +cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + void* a1 = *(void**)(args[0]); + void* a2 = *(void**)(args[1]); + + long double trample1 = (intptr_t)a1 + (intptr_t)a2; + char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; + long double trample3 = (intptr_t)trample1 + (intptr_t)a1; + char trample4 = trample2 + ((char*)&a1)[1]; + long double trample5 = (intptr_t)trample3 + (intptr_t)a2; + char trample6 = trample4 + ((char*)&a2)[1]; + long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; + char trample8 = trample6 + trample2; + + dummyVar = dummy_func(trample1, trample2, trample3, trample4, + trample5, trample6, trample7, trample8); + + *(void**)resp = cls_pointer_fn1(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; + /* ffi_type cls_pointer_type; */ + ffi_type* arg_types[3]; + +/* cls_pointer_type.size = sizeof(void*); + cls_pointer_type.alignment = 0; + cls_pointer_type.type = FFI_TYPE_POINTER; + cls_pointer_type.elements = NULL;*/ + + void* arg1 = (void*)0x01234567; + void* arg2 = (void*)0x89abcdef; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_pointer; + arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, + arg_types) == FFI_OK); + + args[0] = &arg1; + args[1] = &arg2; + args[2] = NULL; + + printf("\n"); + ffi_call(&cif, FFI_FN(cls_pointer_fn1), &res, args); + + printf("res: 0x%08x\n", (unsigned int) res); + /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ + /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ + /* { dg-output "\nres: 0x8bf258bd" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); + + res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); + + printf("res: 0x%08x\n", (unsigned int) res); + /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ + /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ + /* { dg-output "\nres: 0x8bf258bd" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c new file mode 100644 index 000000000000..82986b172c36 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_schar.c @@ -0,0 +1,44 @@ +/* Area: closure_call + Purpose: Check return value schar. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20031108 */ + + + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_schar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(signed char *)args[0]; + printf("%d: %d\n",*(signed char *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef signed char (*cls_ret_schar)(signed char); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + signed char res; + + cl_arg_types[0] = &ffi_type_schar; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_schar, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_schar_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_schar)code))(127); + /* { dg-output "127: 127" } */ + printf("res: %d\n", res); + /* { dg-output "\nres: 127" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c new file mode 100644 index 000000000000..c7e13b73a3ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sint.c @@ -0,0 +1,42 @@ +/* Area: closure_call + Purpose: Check return value sint32. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20031108 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_sint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(signed int *)args[0]; + printf("%d: %d\n",*(signed int *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef signed int (*cls_ret_sint)(signed int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + signed int res; + + cl_arg_types[0] = &ffi_type_sint; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sint_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_sint)code))(65534); + /* { dg-output "65534: 65534" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 65534" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c new file mode 100644 index 000000000000..846d57ed1ba5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_sshort.c @@ -0,0 +1,42 @@ +/* Area: closure_call + Purpose: Check return value sshort. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20031108 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_sshort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(signed short *)args[0]; + printf("%d: %d\n",*(signed short *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef signed short (*cls_ret_sshort)(signed short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + signed short res; + + cl_arg_types[0] = &ffi_type_sshort; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_sshort, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sshort_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_sshort)code))(255); + /* { dg-output "255: 255" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 255" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c new file mode 100644 index 000000000000..6d1fdaeb606a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_struct_va1.c @@ -0,0 +1,114 @@ +/* Area: ffi_call, closure_call + Purpose: Test doubles passed in variable argument lists. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run } */ +/* { dg-output "" { xfail avr32*-*-* } } */ +#include "ffitest.h" + +struct small_tag +{ + unsigned char a; + unsigned char b; +}; + +struct large_tag +{ + unsigned a; + unsigned b; + unsigned c; + unsigned d; + unsigned e; +}; + +static void +test_fn (ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + int n = *(int*)args[0]; + struct small_tag s1 = * (struct small_tag *) args[1]; + struct large_tag l1 = * (struct large_tag *) args[2]; + struct small_tag s2 = * (struct small_tag *) args[3]; + + printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b, + l1.a, l1.b, l1.c, l1.d, l1.e, + s2.a, s2.b); + * (ffi_arg*) resp = 42; +} + +int +main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc (sizeof (ffi_closure), &code); + ffi_type* arg_types[5]; + + ffi_arg res = 0; + + ffi_type s_type; + ffi_type *s_type_elements[3]; + + ffi_type l_type; + ffi_type *l_type_elements[6]; + + struct small_tag s1; + struct small_tag s2; + struct large_tag l1; + + int si; + + s_type.size = 0; + s_type.alignment = 0; + s_type.type = FFI_TYPE_STRUCT; + s_type.elements = s_type_elements; + + s_type_elements[0] = &ffi_type_uchar; + s_type_elements[1] = &ffi_type_uchar; + s_type_elements[2] = NULL; + + l_type.size = 0; + l_type.alignment = 0; + l_type.type = FFI_TYPE_STRUCT; + l_type.elements = l_type_elements; + + l_type_elements[0] = &ffi_type_uint; + l_type_elements[1] = &ffi_type_uint; + l_type_elements[2] = &ffi_type_uint; + l_type_elements[3] = &ffi_type_uint; + l_type_elements[4] = &ffi_type_uint; + l_type_elements[5] = NULL; + + arg_types[0] = &ffi_type_sint; + arg_types[1] = &s_type; + arg_types[2] = &l_type; + arg_types[3] = &s_type; + arg_types[4] = NULL; + + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, + arg_types) == FFI_OK); + + si = 4; + s1.a = 5; + s1.b = 6; + + s2.a = 20; + s2.b = 21; + + l1.a = 10; + l1.b = 11; + l1.c = 12; + l1.d = 13; + l1.e = 14; + + CHECK(ffi_prep_closure_loc(pcl, &cif, test_fn, NULL, code) == FFI_OK); + + res = ((int (*)(int, ...))(code))(si, s1, l1, s2); + /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */ + printf("res: %d\n", (int) res); + /* { dg-output "\nres: 42" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c new file mode 100644 index 000000000000..c1317e795fd6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar.c @@ -0,0 +1,42 @@ +/* Area: closure_call + Purpose: Check return value uchar. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_uchar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(unsigned char *)args[0]; + printf("%d: %d\n",*(unsigned char *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef unsigned char (*cls_ret_uchar)(unsigned char); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + unsigned char res; + + cl_arg_types[0] = &ffi_type_uchar; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uchar, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uchar_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_uchar)code))(127); + /* { dg-output "127: 127" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 127" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c new file mode 100644 index 000000000000..6491c5b3df15 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uchar_va.c @@ -0,0 +1,44 @@ +/* Area: closure_call + Purpose: Test anonymous unsigned char argument. + Limitations: none. + PR: none. + Originator: ARM Ltd. */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef unsigned char T; + +static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) + { + *(ffi_arg *)resp = *(T *)args[0]; + + printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); + } + +typedef T (*cls_ret_T)(T, ...); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[3]; + T res; + + cl_arg_types[0] = &ffi_type_uchar; + cl_arg_types[1] = &ffi_type_uchar; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, + &ffi_type_uchar, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); + res = ((((cls_ret_T)code)(67, 4))); + /* { dg-output "67: 67 4" } */ + printf("res: %d\n", res); + /* { dg-output "\nres: 67" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c new file mode 100644 index 000000000000..885cff5c3146 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint.c @@ -0,0 +1,43 @@ +/* Area: closure_call + Purpose: Check return value uint. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_uint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg *)resp = *(unsigned int *)args[0]; + + printf("%d: %d\n",*(unsigned int *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef unsigned int (*cls_ret_uint)(unsigned int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + unsigned int res; + + cl_arg_types[0] = &ffi_type_uint; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uint_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_uint)code))(2147483647); + /* { dg-output "2147483647: 2147483647" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 2147483647" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c new file mode 100644 index 000000000000..b04cfd19c2ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_uint_va.c @@ -0,0 +1,45 @@ +/* Area: closure_call + Purpose: Test anonymous unsigned int argument. + Limitations: none. + PR: none. + Originator: ARM Ltd. */ + +/* { dg-do run } */ + +#include "ffitest.h" + +typedef unsigned int T; + +static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) + { + *(ffi_arg *)resp = *(T *)args[0]; + + printf("%d: %d %d\n", (int)*(ffi_arg *)resp, *(T *)args[0], *(T *)args[1]); + } + +typedef T (*cls_ret_T)(T, ...); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[3]; + T res; + + cl_arg_types[0] = &ffi_type_uint; + cl_arg_types[1] = &ffi_type_uint; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, + &ffi_type_uint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); + res = ((((cls_ret_T)code)(67, 4))); + /* { dg-output "67: 67 4" } */ + printf("res: %d\n", res); + /* { dg-output "\nres: 67" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c new file mode 100644 index 000000000000..0315082e093b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulong_va.c @@ -0,0 +1,45 @@ +/* Area: closure_call + Purpose: Test anonymous unsigned long argument. + Limitations: none. + PR: none. + Originator: ARM Ltd. */ + +/* { dg-do run } */ + +#include "ffitest.h" + +typedef unsigned long T; + +static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) + { + *(T *)resp = *(T *)args[0]; + + printf("%ld: %ld %ld\n", *(T *)resp, *(T *)args[0], *(T *)args[1]); + } + +typedef T (*cls_ret_T)(T, ...); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[3]; + T res; + + cl_arg_types[0] = &ffi_type_ulong; + cl_arg_types[1] = &ffi_type_ulong; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, + &ffi_type_ulong, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); + res = ((((cls_ret_T)code)(67, 4))); + /* { dg-output "67: 67 4" } */ + printf("res: %ld\n", res); + /* { dg-output "\nres: 67" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c new file mode 100644 index 000000000000..62f2cae63a9b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ulonglong.c @@ -0,0 +1,47 @@ +/* Area: closure_call + Purpose: Check return value long long. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" + +static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + *(unsigned long long *)resp= 0xfffffffffffffffLL ^ *(unsigned long long *)args[0]; + + printf("%" PRIuLL ": %" PRIuLL "\n",*(unsigned long long *)args[0], + *(unsigned long long *)(resp)); +} +typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + unsigned long long res; + + cl_arg_types[0] = &ffi_type_uint64; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_uint64, cl_arg_types) == FFI_OK); + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ulonglong_fn, NULL, code) == FFI_OK); + res = (*((cls_ret_ulonglong)code))(214LL); + /* { dg-output "214: 1152921504606846761" } */ + printf("res: %" PRIdLL "\n", res); + /* { dg-output "\nres: 1152921504606846761" } */ + + res = (*((cls_ret_ulonglong)code))(9223372035854775808LL); + /* { dg-output "\n9223372035854775808: 8070450533247928831" } */ + printf("res: %" PRIdLL "\n", res); + /* { dg-output "\nres: 8070450533247928831" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c new file mode 100644 index 000000000000..a00100e07f8c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort.c @@ -0,0 +1,43 @@ +/* Area: closure_call + Purpose: Check return value ushort. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void cls_ret_ushort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + *(ffi_arg*)resp = *(unsigned short *)args[0]; + + printf("%d: %d\n",*(unsigned short *)args[0], + (int)*(ffi_arg *)(resp)); +} +typedef unsigned short (*cls_ret_ushort)(unsigned short); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + unsigned short res; + + cl_arg_types[0] = &ffi_type_ushort; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_ushort, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ushort_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_ushort)code))(65535); + /* { dg-output "65535: 65535" } */ + printf("res: %d\n",res); + /* { dg-output "\nres: 65535" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c new file mode 100644 index 000000000000..37aa1064ea71 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/cls_ushort_va.c @@ -0,0 +1,44 @@ +/* Area: closure_call + Purpose: Test anonymous unsigned short argument. + Limitations: none. + PR: none. + Originator: ARM Ltd. */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef unsigned short T; + +static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) + { + *(ffi_arg *)resp = *(T *)args[0]; + + printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); + } + +typedef T (*cls_ret_T)(T, ...); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[3]; + T res; + + cl_arg_types[0] = &ffi_type_ushort; + cl_arg_types[1] = &ffi_type_ushort; + cl_arg_types[2] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, + &ffi_type_ushort, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); + res = ((((cls_ret_T)code)(67, 4))); + /* { dg-output "67: 67 4" } */ + printf("res: %d\n", res); + /* { dg-output "\nres: 67" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/err_bad_abi.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/err_bad_abi.c new file mode 100644 index 000000000000..f5a73179ec96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/err_bad_abi.c @@ -0,0 +1,36 @@ +/* Area: ffi_prep_cif, ffi_prep_closure + Purpose: Test error return for bad ABIs. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run } */ + +#include "ffitest.h" + +static void +dummy_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args __UNUSED__, void* userdata __UNUSED__) +{} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type* arg_types[1]; + + arg_types[0] = NULL; + + CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void, + arg_types) == FFI_BAD_ABI); + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, + arg_types) == FFI_OK); + + cif.abi= 255; + + CHECK(ffi_prep_closure_loc(pcl, &cif, dummy_fn, NULL, code) == FFI_BAD_ABI); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h new file mode 100644 index 000000000000..cfce1ad589b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h @@ -0,0 +1,138 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <ffi.h> +#include "fficonfig.h" + +#if defined HAVE_STDINT_H +#include <stdint.h> +#endif + +#if defined HAVE_INTTYPES_H +#include <inttypes.h> +#endif + +#define MAX_ARGS 256 + +#define CHECK(x) (void)(!(x) ? (abort(), 1) : 0) + +/* Define macros so that compilers other than gcc can run the tests. */ +#undef __UNUSED__ +#if defined(__GNUC__) +#define __UNUSED__ __attribute__((__unused__)) +#define __STDCALL__ __attribute__((stdcall)) +#define __THISCALL__ __attribute__((thiscall)) +#define __FASTCALL__ __attribute__((fastcall)) +#define __MSABI__ __attribute__((ms_abi)) +#else +#define __UNUSED__ +#define __STDCALL__ __stdcall +#define __THISCALL__ __thiscall +#define __FASTCALL__ __fastcall +#endif + +#ifndef ABI_NUM +#define ABI_NUM FFI_DEFAULT_ABI +#define ABI_ATTR +#endif + +/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a + file open. */ +#ifdef HAVE_MMAP_ANON +# undef HAVE_MMAP_DEV_ZERO + +# include <sys/mman.h> +# ifndef MAP_FAILED +# define MAP_FAILED -1 +# endif +# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) +# define MAP_ANONYMOUS MAP_ANON +# endif +# define USING_MMAP + +#endif + +#ifdef HAVE_MMAP_DEV_ZERO + +# include <sys/mman.h> +# ifndef MAP_FAILED +# define MAP_FAILED -1 +# endif +# define USING_MMAP + +#endif + +/* MinGW kludge. */ +#if defined(_WIN64) | defined(_WIN32) +#define PRIdLL "I64d" +#define PRIuLL "I64u" +#else +#define PRIdLL "lld" +#define PRIuLL "llu" +#endif + +/* Tru64 UNIX kludge. */ +#if defined(__alpha__) && defined(__osf__) +/* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ +#undef PRIdLL +#define PRIdLL "ld" +#undef PRIuLL +#define PRIuLL "lu" +#define PRId8 "hd" +#define PRIu8 "hu" +#define PRId64 "ld" +#define PRIu64 "lu" +#define PRIuPTR "lu" +#endif + +/* PA HP-UX kludge. */ +#if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) +#define PRIuPTR "lu" +#endif + +/* IRIX kludge. */ +#if defined(__sgi) +/* IRIX 6.5 <inttypes.h> provides all definitions, but only for C99 + compilations. */ +#define PRId8 "hhd" +#define PRIu8 "hhu" +#if (_MIPS_SZLONG == 32) +#define PRId64 "lld" +#define PRIu64 "llu" +#endif +/* This doesn't match <inttypes.h>, which always has "lld" here, but the + arguments are uint64_t, int64_t, which are unsigned long, long for + 64-bit in <sgidefs.h>. */ +#if (_MIPS_SZLONG == 64) +#define PRId64 "ld" +#define PRIu64 "lu" +#endif +/* This doesn't match <inttypes.h>, which has "u" here, but the arguments + are uintptr_t, which is always unsigned long. */ +#define PRIuPTR "lu" +#endif + +/* Solaris < 10 kludge. */ +#if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) +#if defined(__arch64__) || defined (__x86_64__) +#define PRIuPTR "lu" +#else +#define PRIuPTR "u" +#endif +#endif + +/* MSVC kludge. */ +#if defined _MSC_VER +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) +#define PRIuPTR "lu" +#define PRIu8 "u" +#define PRId8 "d" +#define PRIu64 "I64u" +#define PRId64 "I64d" +#endif +#endif + +#ifndef PRIuPTR +#define PRIuPTR "u" +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c new file mode 100644 index 000000000000..e8e1d8601fb0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c @@ -0,0 +1,343 @@ +/* Area: ffi_call, closure_call + Purpose: Check large structure returns. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/18/2007 +*/ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ +/* { dg-options -Wformat=0 { target moxie*-*-elf or1k-*-* } } */ + +#include <inttypes.h> + +#include "ffitest.h" + +typedef struct BigStruct{ + uint8_t a; + int8_t b; + uint16_t c; + int16_t d; + uint32_t e; + int32_t f; + uint64_t g; + int64_t h; + float i; + double j; + long double k; + char* l; + uint8_t m; + int8_t n; + uint16_t o; + int16_t p; + uint32_t q; + int32_t r; + uint64_t s; + int64_t t; + float u; + double v; + long double w; + char* x; + uint8_t y; + int8_t z; + uint16_t aa; + int16_t bb; + uint32_t cc; + int32_t dd; + uint64_t ee; + int64_t ff; + float gg; + double hh; + long double ii; + char* jj; + uint8_t kk; + int8_t ll; + uint16_t mm; + int16_t nn; + uint32_t oo; + int32_t pp; + uint64_t qq; + int64_t rr; + float ss; + double tt; + long double uu; + char* vv; + uint8_t ww; + int8_t xx; +} BigStruct; + +BigStruct +test_large_fn( + uint8_t ui8_1, + int8_t si8_1, + uint16_t ui16_1, + int16_t si16_1, + uint32_t ui32_1, + int32_t si32_1, + uint64_t ui64_1, + int64_t si64_1, + float f_1, + double d_1, + long double ld_1, + char* p_1, + uint8_t ui8_2, + int8_t si8_2, + uint16_t ui16_2, + int16_t si16_2, + uint32_t ui32_2, + int32_t si32_2, + uint64_t ui64_2, + int64_t si64_2, + float f_2, + double d_2, + long double ld_2, + char* p_2, + uint8_t ui8_3, + int8_t si8_3, + uint16_t ui16_3, + int16_t si16_3, + uint32_t ui32_3, + int32_t si32_3, + uint64_t ui64_3, + int64_t si64_3, + float f_3, + double d_3, + long double ld_3, + char* p_3, + uint8_t ui8_4, + int8_t si8_4, + uint16_t ui16_4, + int16_t si16_4, + uint32_t ui32_4, + int32_t si32_4, + uint64_t ui64_4, + int64_t si64_4, + float f_4, + double d_4, + long double ld_4, + char* p_4, + uint8_t ui8_5, + int8_t si8_5) +{ + BigStruct retVal = { + ui8_1 + 1, si8_1 + 1, ui16_1 + 1, si16_1 + 1, ui32_1 + 1, si32_1 + 1, + ui64_1 + 1, si64_1 + 1, f_1 + 1, d_1 + 1, ld_1 + 1, (char*)((intptr_t)p_1 + 1), + ui8_2 + 2, si8_2 + 2, ui16_2 + 2, si16_2 + 2, ui32_2 + 2, si32_2 + 2, + ui64_2 + 2, si64_2 + 2, f_2 + 2, d_2 + 2, ld_2 + 2, (char*)((intptr_t)p_2 + 2), + ui8_3 + 3, si8_3 + 3, ui16_3 + 3, si16_3 + 3, ui32_3 + 3, si32_3 + 3, + ui64_3 + 3, si64_3 + 3, f_3 + 3, d_3 + 3, ld_3 + 3, (char*)((intptr_t)p_3 + 3), + ui8_4 + 4, si8_4 + 4, ui16_4 + 4, si16_4 + 4, ui32_4 + 4, si32_4 + 4, + ui64_4 + 4, si64_4 + 4, f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4), + ui8_5 + 5, si8_5 + 5}; + + printf("%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 ": " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n", + ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, (unsigned long)p_1, + ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, (unsigned long)p_2, + ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, (unsigned long)p_3, + ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, (unsigned long)p_4, ui8_5, si8_5, + retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f, + retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l, + retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r, + retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x, + retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd, + retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj, + retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, + retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx); + + return retVal; +} + +static void +cls_large_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + uint8_t ui8_1 = *(uint8_t*)args[0]; + int8_t si8_1 = *(int8_t*)args[1]; + uint16_t ui16_1 = *(uint16_t*)args[2]; + int16_t si16_1 = *(int16_t*)args[3]; + uint32_t ui32_1 = *(uint32_t*)args[4]; + int32_t si32_1 = *(int32_t*)args[5]; + uint64_t ui64_1 = *(uint64_t*)args[6]; + int64_t si64_1 = *(int64_t*)args[7]; + float f_1 = *(float*)args[8]; + double d_1 = *(double*)args[9]; + long double ld_1 = *(long double*)args[10]; + char* p_1 = *(char**)args[11]; + uint8_t ui8_2 = *(uint8_t*)args[12]; + int8_t si8_2 = *(int8_t*)args[13]; + uint16_t ui16_2 = *(uint16_t*)args[14]; + int16_t si16_2 = *(int16_t*)args[15]; + uint32_t ui32_2 = *(uint32_t*)args[16]; + int32_t si32_2 = *(int32_t*)args[17]; + uint64_t ui64_2 = *(uint64_t*)args[18]; + int64_t si64_2 = *(int64_t*)args[19]; + float f_2 = *(float*)args[20]; + double d_2 = *(double*)args[21]; + long double ld_2 = *(long double*)args[22]; + char* p_2 = *(char**)args[23]; + uint8_t ui8_3 = *(uint8_t*)args[24]; + int8_t si8_3 = *(int8_t*)args[25]; + uint16_t ui16_3 = *(uint16_t*)args[26]; + int16_t si16_3 = *(int16_t*)args[27]; + uint32_t ui32_3 = *(uint32_t*)args[28]; + int32_t si32_3 = *(int32_t*)args[29]; + uint64_t ui64_3 = *(uint64_t*)args[30]; + int64_t si64_3 = *(int64_t*)args[31]; + float f_3 = *(float*)args[32]; + double d_3 = *(double*)args[33]; + long double ld_3 = *(long double*)args[34]; + char* p_3 = *(char**)args[35]; + uint8_t ui8_4 = *(uint8_t*)args[36]; + int8_t si8_4 = *(int8_t*)args[37]; + uint16_t ui16_4 = *(uint16_t*)args[38]; + int16_t si16_4 = *(int16_t*)args[39]; + uint32_t ui32_4 = *(uint32_t*)args[40]; + int32_t si32_4 = *(int32_t*)args[41]; + uint64_t ui64_4 = *(uint64_t*)args[42]; + int64_t si64_4 = *(int64_t*)args[43]; + float f_4 = *(float*)args[44]; + double d_4 = *(double*)args[45]; + long double ld_4 = *(long double*)args[46]; + char* p_4 = *(char**)args[47]; + uint8_t ui8_5 = *(uint8_t*)args[48]; + int8_t si8_5 = *(int8_t*)args[49]; + + *(BigStruct*)resp = test_large_fn( + ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, p_1, + ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, p_2, + ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, p_3, + ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, p_4, + ui8_5, si8_5); +} + +int +main(int argc __UNUSED__, const char** argv __UNUSED__) +{ + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + + ffi_cif cif; + ffi_type* argTypes[51]; + void* argValues[51]; + + ffi_type ret_struct_type; + ffi_type* st_fields[51]; + BigStruct retVal; + + uint8_t ui8 = 1; + int8_t si8 = 2; + uint16_t ui16 = 3; + int16_t si16 = 4; + uint32_t ui32 = 5; + int32_t si32 = 6; + uint64_t ui64 = 7; + int64_t si64 = 8; + float f = 9; + double d = 10; + long double ld = 11; + char* p = (char*)0x12345678; + + memset (&retVal, 0, sizeof(retVal)); + + ret_struct_type.size = 0; + ret_struct_type.alignment = 0; + ret_struct_type.type = FFI_TYPE_STRUCT; + ret_struct_type.elements = st_fields; + + st_fields[0] = st_fields[12] = st_fields[24] = st_fields[36] = st_fields[48] = &ffi_type_uint8; + st_fields[1] = st_fields[13] = st_fields[25] = st_fields[37] = st_fields[49] = &ffi_type_sint8; + st_fields[2] = st_fields[14] = st_fields[26] = st_fields[38] = &ffi_type_uint16; + st_fields[3] = st_fields[15] = st_fields[27] = st_fields[39] = &ffi_type_sint16; + st_fields[4] = st_fields[16] = st_fields[28] = st_fields[40] = &ffi_type_uint32; + st_fields[5] = st_fields[17] = st_fields[29] = st_fields[41] = &ffi_type_sint32; + st_fields[6] = st_fields[18] = st_fields[30] = st_fields[42] = &ffi_type_uint64; + st_fields[7] = st_fields[19] = st_fields[31] = st_fields[43] = &ffi_type_sint64; + st_fields[8] = st_fields[20] = st_fields[32] = st_fields[44] = &ffi_type_float; + st_fields[9] = st_fields[21] = st_fields[33] = st_fields[45] = &ffi_type_double; + st_fields[10] = st_fields[22] = st_fields[34] = st_fields[46] = &ffi_type_longdouble; + st_fields[11] = st_fields[23] = st_fields[35] = st_fields[47] = &ffi_type_pointer; + + st_fields[50] = NULL; + + argTypes[0] = argTypes[12] = argTypes[24] = argTypes[36] = argTypes[48] = &ffi_type_uint8; + argValues[0] = argValues[12] = argValues[24] = argValues[36] = argValues[48] = &ui8; + argTypes[1] = argTypes[13] = argTypes[25] = argTypes[37] = argTypes[49] = &ffi_type_sint8; + argValues[1] = argValues[13] = argValues[25] = argValues[37] = argValues[49] = &si8; + argTypes[2] = argTypes[14] = argTypes[26] = argTypes[38] = &ffi_type_uint16; + argValues[2] = argValues[14] = argValues[26] = argValues[38] = &ui16; + argTypes[3] = argTypes[15] = argTypes[27] = argTypes[39] = &ffi_type_sint16; + argValues[3] = argValues[15] = argValues[27] = argValues[39] = &si16; + argTypes[4] = argTypes[16] = argTypes[28] = argTypes[40] = &ffi_type_uint32; + argValues[4] = argValues[16] = argValues[28] = argValues[40] = &ui32; + argTypes[5] = argTypes[17] = argTypes[29] = argTypes[41] = &ffi_type_sint32; + argValues[5] = argValues[17] = argValues[29] = argValues[41] = &si32; + argTypes[6] = argTypes[18] = argTypes[30] = argTypes[42] = &ffi_type_uint64; + argValues[6] = argValues[18] = argValues[30] = argValues[42] = &ui64; + argTypes[7] = argTypes[19] = argTypes[31] = argTypes[43] = &ffi_type_sint64; + argValues[7] = argValues[19] = argValues[31] = argValues[43] = &si64; + argTypes[8] = argTypes[20] = argTypes[32] = argTypes[44] = &ffi_type_float; + argValues[8] = argValues[20] = argValues[32] = argValues[44] = &f; + argTypes[9] = argTypes[21] = argTypes[33] = argTypes[45] = &ffi_type_double; + argValues[9] = argValues[21] = argValues[33] = argValues[45] = &d; + argTypes[10] = argTypes[22] = argTypes[34] = argTypes[46] = &ffi_type_longdouble; + argValues[10] = argValues[22] = argValues[34] = argValues[46] = &ld; + argTypes[11] = argTypes[23] = argTypes[35] = argTypes[47] = &ffi_type_pointer; + argValues[11] = argValues[23] = argValues[35] = argValues[47] = &p; + + argTypes[50] = NULL; + argValues[50] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 50, &ret_struct_type, argTypes) == FFI_OK); + + ffi_call(&cif, FFI_FN(test_large_fn), &retVal, argValues); + /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */ + printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n", + retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f, + retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l, + retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r, + retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x, + retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd, + retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj, + retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, + retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx); + /* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_large_fn, NULL, code) == FFI_OK); + + retVal = ((BigStruct(*)( + uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, + uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, + uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, + uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*, + uint8_t, int8_t))(code))( + ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, + ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, + ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, + ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p, + ui8, si8); + /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */ + printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx " + "%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n", + retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f, + retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l, + retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r, + retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x, + retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd, + retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj, + retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, + retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx); + /* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */ + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c new file mode 100644 index 000000000000..c15e3a033829 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct.c @@ -0,0 +1,152 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_16byte1 { + double a; + float b; + int c; +} cls_struct_16byte1; + +typedef struct cls_struct_16byte2 { + int ii; + double dd; + float ff; +} cls_struct_16byte2; + +typedef struct cls_struct_combined { + cls_struct_16byte1 d; + cls_struct_16byte2 e; +} cls_struct_combined; + +cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, + struct cls_struct_16byte2 b1, + struct cls_struct_combined b2) +{ + struct cls_struct_combined result; + + result.d.a = b0.a + b1.dd + b2.d.a; + result.d.b = b0.b + b1.ff + b2.d.b; + result.d.c = b0.c + b1.ii + b2.d.c; + result.e.ii = b0.c + b1.ii + b2.e.ii; + result.e.dd = b0.a + b1.dd + b2.e.dd; + result.e.ff = b0.b + b1.ff + b2.e.ff; + + printf("%g %g %d %d %g %g %g %g %d %d %g %g: %g %g %d %d %g %g\n", + b0.a, b0.b, b0.c, + b1.ii, b1.dd, b1.ff, + b2.d.a, b2.d.b, b2.d.c, + b2.e.ii, b2.e.dd, b2.e.ff, + result.d.a, result.d.b, result.d.c, + result.e.ii, result.e.dd, result.e.ff); + + return result; +} + +static void +cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_16byte1 b0; + struct cls_struct_16byte2 b1; + struct cls_struct_combined b2; + + b0 = *(struct cls_struct_16byte1*)(args[0]); + b1 = *(struct cls_struct_16byte2*)(args[1]); + b2 = *(struct cls_struct_combined*)(args[2]); + + + *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type* cls_struct_fields1[5]; + ffi_type* cls_struct_fields2[5]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; + struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; + struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, + {3, 1.0, 8.0}}; + struct cls_struct_combined res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + cls_struct_fields1[0] = &ffi_type_sint; + cls_struct_fields1[1] = &ffi_type_double; + cls_struct_fields1[2] = &ffi_type_float; + cls_struct_fields1[3] = NULL; + + cls_struct_fields2[0] = &cls_struct_type; + cls_struct_fields2[1] = &cls_struct_type1; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type2, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); + /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ + CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); + CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); + CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); + CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); + CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); + CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, + cls_struct_16byte2, + cls_struct_combined)) + (code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ + CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); + CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); + CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); + CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); + CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); + CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c new file mode 100644 index 000000000000..477a6b9bdee2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct1.c @@ -0,0 +1,161 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_16byte1 { + double a; + float b; + int c; +} cls_struct_16byte1; + +typedef struct cls_struct_16byte2 { + int ii; + double dd; + float ff; +} cls_struct_16byte2; + +typedef struct cls_struct_combined { + cls_struct_16byte1 d; + cls_struct_16byte2 e; +} cls_struct_combined; + +cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, + struct cls_struct_16byte2 b1, + struct cls_struct_combined b2, + struct cls_struct_16byte1 b3) +{ + struct cls_struct_combined result; + + result.d.a = b0.a + b1.dd + b2.d.a; + result.d.b = b0.b + b1.ff + b2.d.b; + result.d.c = b0.c + b1.ii + b2.d.c; + result.e.ii = b0.c + b1.ii + b2.e.ii; + result.e.dd = b0.a + b1.dd + b2.e.dd; + result.e.ff = b0.b + b1.ff + b2.e.ff; + + printf("%g %g %d %d %g %g %g %g %d %d %g %g %g %g %d: %g %g %d %d %g %g\n", + b0.a, b0.b, b0.c, + b1.ii, b1.dd, b1.ff, + b2.d.a, b2.d.b, b2.d.c, + b2.e.ii, b2.e.dd, b2.e.ff, + b3.a, b3.b, b3.c, + result.d.a, result.d.b, result.d.c, + result.e.ii, result.e.dd, result.e.ff); + + return result; +} + +static void +cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct cls_struct_16byte1 b0; + struct cls_struct_16byte2 b1; + struct cls_struct_combined b2; + struct cls_struct_16byte1 b3; + + b0 = *(struct cls_struct_16byte1*)(args[0]); + b1 = *(struct cls_struct_16byte2*)(args[1]); + b2 = *(struct cls_struct_combined*)(args[2]); + b3 = *(struct cls_struct_16byte1*)(args[3]); + + + *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[5]; + ffi_type* cls_struct_fields1[5]; + ffi_type* cls_struct_fields2[5]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; + struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; + struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, + {3, 1.0, 8.0}}; + struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4}; + struct cls_struct_combined res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_float; + cls_struct_fields[2] = &ffi_type_sint; + cls_struct_fields[3] = NULL; + + cls_struct_fields1[0] = &ffi_type_sint; + cls_struct_fields1[1] = &ffi_type_double; + cls_struct_fields1[2] = &ffi_type_float; + cls_struct_fields1[3] = NULL; + + cls_struct_fields2[0] = &cls_struct_type; + cls_struct_fields2[1] = &cls_struct_type1; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type2, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); + /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ + CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); + CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); + CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); + CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); + CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); + CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); + + res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, + cls_struct_16byte2, + cls_struct_combined, + cls_struct_16byte1)) + (code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ + CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); + CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); + CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); + CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); + CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); + CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); + /* CHECK( 1 == 0); */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c new file mode 100644 index 000000000000..3cf2b44abe89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct10.c @@ -0,0 +1,134 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long long a; + unsigned char b; +} A; + +typedef struct B { + unsigned char y; + struct A x; + unsigned int z; +} B; + +typedef struct C { + unsigned long long d; + unsigned char e; +} C; + +static B B_fn(struct A b2, struct B b3, struct C b4) +{ + struct B result; + + result.x.a = b2.a + b3.x.a + b3.z + b4.d; + result.x.b = b2.b + b3.x.b + b3.y + b4.e; + result.y = b2.b + b3.x.b + b4.e; + result.z = 0; + + printf("%d %d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, b3.z, (int)b4.d, b4.e, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + struct C b2; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + b2 = *(struct C*)(args[2]); + + *(B*)resp = B_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[4]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + + struct A e_dbl = { 1LL, 7}; + struct B f_dbl = { 99, {12LL , 127}, 255}; + struct C g_dbl = { 2LL, 9}; + + struct B res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &ffi_type_uchar; + cls_struct_fields1[1] = &cls_struct_type; + cls_struct_fields1[2] = &ffi_type_uint; + cls_struct_fields1[3] = NULL; + + cls_struct_fields2[0] = &ffi_type_uint64; + cls_struct_fields2[1] = &ffi_type_uchar; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99 255 2 9: 270 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n1 7 12 127 99 255 2 9: 270 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c new file mode 100644 index 000000000000..351049382c62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct11.c @@ -0,0 +1,121 @@ +/* Area: ffi_call, closure_call + Purpose: Check parameter passing with nested structs + of a single type. This tests the special cases + for homogeneous floating-point aggregates in the + AArch64 PCS. + Limitations: none. + PR: none. + Originator: ARM Ltd. */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + float a_x; + float a_y; +} A; + +typedef struct B { + float b_x; + float b_y; +} B; + +typedef struct C { + A a; + B b; +} C; + +static C C_fn (int x, int y, int z, C source, int i, int j, int k) +{ + C result; + result.a.a_x = source.a.a_x; + result.a.a_y = source.a.a_y; + result.b.b_x = source.b.b_x; + result.b.b_y = source.b.b_y; + + printf ("%d, %d, %d, %d, %d, %d\n", x, y, z, i, j, k); + + printf ("%.1f, %.1f, %.1f, %.1f, " + "%.1f, %.1f, %.1f, %.1f\n", + source.a.a_x, source.a.a_y, + source.b.b_x, source.b.b_y, + result.a.a_x, result.a.a_y, + result.b.b_x, result.b.b_y); + + return result; +} + +int main (void) +{ + ffi_cif cif; + + ffi_type* struct_fields_source_a[3]; + ffi_type* struct_fields_source_b[3]; + ffi_type* struct_fields_source_c[3]; + ffi_type* arg_types[8]; + + ffi_type struct_type_a, struct_type_b, struct_type_c; + + struct A source_fld_a = {1.0, 2.0}; + struct B source_fld_b = {4.0, 8.0}; + int k = 1; + + struct C result; + struct C source = {source_fld_a, source_fld_b}; + + struct_type_a.size = 0; + struct_type_a.alignment = 0; + struct_type_a.type = FFI_TYPE_STRUCT; + struct_type_a.elements = struct_fields_source_a; + + struct_type_b.size = 0; + struct_type_b.alignment = 0; + struct_type_b.type = FFI_TYPE_STRUCT; + struct_type_b.elements = struct_fields_source_b; + + struct_type_c.size = 0; + struct_type_c.alignment = 0; + struct_type_c.type = FFI_TYPE_STRUCT; + struct_type_c.elements = struct_fields_source_c; + + struct_fields_source_a[0] = &ffi_type_float; + struct_fields_source_a[1] = &ffi_type_float; + struct_fields_source_a[2] = NULL; + + struct_fields_source_b[0] = &ffi_type_float; + struct_fields_source_b[1] = &ffi_type_float; + struct_fields_source_b[2] = NULL; + + struct_fields_source_c[0] = &struct_type_a; + struct_fields_source_c[1] = &struct_type_b; + struct_fields_source_c[2] = NULL; + + arg_types[0] = &ffi_type_sint32; + arg_types[1] = &ffi_type_sint32; + arg_types[2] = &ffi_type_sint32; + arg_types[3] = &struct_type_c; + arg_types[4] = &ffi_type_sint32; + arg_types[5] = &ffi_type_sint32; + arg_types[6] = &ffi_type_sint32; + arg_types[7] = NULL; + + void *args[7]; + args[0] = &k; + args[1] = &k; + args[2] = &k; + args[3] = &source; + args[4] = &k; + args[5] = &k; + args[6] = &k; + CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, 7, &struct_type_c, + arg_types) == FFI_OK); + + ffi_call (&cif, FFI_FN (C_fn), &result, args); + /* { dg-output "1, 1, 1, 1, 1, 1\n" } */ + /* { dg-output "1.0, 2.0, 4.0, 8.0, 1.0, 2.0, 4.0, 8.0" } */ + CHECK (result.a.a_x == source.a.a_x); + CHECK (result.a.a_y == source.a.a_y); + CHECK (result.b.b_x == source.b.b_x); + CHECK (result.b.b_y == source.b.b_y); + exit (0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c new file mode 100644 index 000000000000..69268cdb8af3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct2.c @@ -0,0 +1,110 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030911 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +B B_fn(struct A b0, struct B b1) +{ + struct B result; + + result.x.a = b0.a + b1.x.a; + result.x.b = b0.b + b1.x.b + b1.y; + result.y = b0.b + b1.x.b; + + printf("%lu %d %lu %d %d: %lu %d %d\n", b0.a, b0.b, b1.x.a, b1.x.b, b1.y, + result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + struct A e_dbl = { 1, 7}; + struct B f_dbl = {{12 , 127}, 99}; + + struct B res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_fields[0] = &ffi_type_ulong; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c new file mode 100644 index 000000000000..ab18cad73352 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct3.c @@ -0,0 +1,111 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030911 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long long a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +B B_fn(struct A b0, struct B b1) +{ + struct B result; + + result.x.a = b0.a + b1.x.a; + result.x.b = b0.b + b1.x.b + b1.y; + result.y = b0.b + b1.x.b; + + printf("%d %d %d %d %d: %d %d %d\n", (int)b0.a, b0.b, + (int)b1.x.a, b1.x.b, b1.y, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + struct A e_dbl = { 1LL, 7}; + struct B f_dbl = {{12LL , 127}, 99}; + + struct B res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c new file mode 100644 index 000000000000..2ffb4d65a063 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct4.c @@ -0,0 +1,111 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: PR 25630. + Originator: <andreast@gcc.gnu.org> 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + double a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +static B B_fn(struct A b2, struct B b3) +{ + struct B result; + + result.x.a = b2.a + b3.x.a; + result.x.b = b2.b + b3.x.b + b3.y; + result.y = b2.b + b3.x.b; + + printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + struct A e_dbl = { 1.0, 7}; + struct B f_dbl = {{12.0 , 127}, 99}; + + struct B res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c new file mode 100644 index 000000000000..6c79845d984a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct5.c @@ -0,0 +1,112 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + long double a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +static B B_fn(struct A b2, struct B b3) +{ + struct B result; + + result.x.a = b2.a + b3.x.a; + result.x.b = b2.b + b3.x.b + b3.y; + result.y = b2.b + b3.x.b; + + printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + struct A e_dbl = { 1.0, 7}; + struct B f_dbl = {{12.0 , 127}, 99}; + + struct B res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_fields[0] = &ffi_type_longdouble; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c new file mode 100644 index 000000000000..59d35796f8de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct6.c @@ -0,0 +1,131 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: PR 25630. + Originator: <andreast@gcc.gnu.org> 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + double a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +typedef struct C { + long d; + unsigned char e; +} C; + +static B B_fn(struct A b2, struct B b3, struct C b4) +{ + struct B result; + + result.x.a = b2.a + b3.x.a + b4.d; + result.x.b = b2.b + b3.x.b + b3.y + b4.e; + result.y = b2.b + b3.x.b + b4.e; + + printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + struct C b2; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + b2 = *(struct C*)(args[2]); + + *(B*)resp = B_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + + struct A e_dbl = { 1.0, 7}; + struct B f_dbl = {{12.0 , 127}, 99}; + struct C g_dbl = { 2, 9}; + + struct B res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + cls_struct_fields2[0] = &ffi_type_slong; + cls_struct_fields2[1] = &ffi_type_uchar; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c new file mode 100644 index 000000000000..27595e6f5c30 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct7.c @@ -0,0 +1,111 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long long a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +static B B_fn(struct A b2, struct B b3) +{ + struct B result; + + result.x.a = b2.a + b3.x.a; + result.x.b = b2.b + b3.x.b + b3.y; + result.y = b2.b + b3.x.b; + + printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + + *(B*)resp = B_fn(b0, b1); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[3]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type cls_struct_type, cls_struct_type1; + ffi_type* dbl_arg_types[3]; + + struct A e_dbl = { 1LL, 7}; + struct B f_dbl = {{12.0 , 127}, 99}; + + struct B res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); + /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c new file mode 100644 index 000000000000..0e6c68281e1a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct8.c @@ -0,0 +1,131 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned long long a; + unsigned char b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +typedef struct C { + unsigned long long d; + unsigned char e; +} C; + +static B B_fn(struct A b2, struct B b3, struct C b4) +{ + struct B result; + + result.x.a = b2.a + b3.x.a + b4.d; + result.x.b = b2.b + b3.x.b + b3.y + b4.e; + result.y = b2.b + b3.x.b + b4.e; + + printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, + (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, + (int)result.x.a, result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + struct C b2; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + b2 = *(struct C*)(args[2]); + + *(B*)resp = B_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + + struct A e_dbl = { 1LL, 7}; + struct B f_dbl = {{12LL , 127}, 99}; + struct C g_dbl = { 2LL, 9}; + + struct B res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + cls_struct_fields[0] = &ffi_type_uint64; + cls_struct_fields[1] = &ffi_type_uchar; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + cls_struct_fields2[0] = &ffi_type_uint64; + cls_struct_fields2[1] = &ffi_type_uchar; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c new file mode 100644 index 000000000000..5f7ac67752ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/nested_struct9.c @@ -0,0 +1,131 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Contains structs as parameter of the struct itself. + Sample taken from Alan Modras patch to src/prep_cif.c. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20051010 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct A { + unsigned char a; + unsigned long long b; +} A; + +typedef struct B { + struct A x; + unsigned char y; +} B; + +typedef struct C { + unsigned long d; + unsigned char e; +} C; + +static B B_fn(struct A b2, struct B b3, struct C b4) +{ + struct B result; + + result.x.a = b2.a + b3.x.a + b4.d; + result.x.b = b2.b + b3.x.b + b3.y + b4.e; + result.y = b2.b + b3.x.b + b4.e; + + printf("%d %d %d %d %d %d %d: %d %d %d\n", b2.a, (int)b2.b, + b3.x.a, (int)b3.x.b, b3.y, (int)b4.d, b4.e, + result.x.a, (int)result.x.b, result.y); + + return result; +} + +static void +B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct A b0; + struct B b1; + struct C b2; + + b0 = *(struct A*)(args[0]); + b1 = *(struct B*)(args[1]); + b2 = *(struct C*)(args[2]); + + *(B*)resp = B_fn(b0, b1, b2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[4]; + ffi_type* cls_struct_fields[3]; + ffi_type* cls_struct_fields1[3]; + ffi_type* cls_struct_fields2[3]; + ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; + ffi_type* dbl_arg_types[4]; + + struct A e_dbl = { 1, 7LL}; + struct B f_dbl = {{12.0 , 127}, 99}; + struct C g_dbl = { 2, 9}; + + struct B res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_type1.size = 0; + cls_struct_type1.alignment = 0; + cls_struct_type1.type = FFI_TYPE_STRUCT; + cls_struct_type1.elements = cls_struct_fields1; + + cls_struct_type2.size = 0; + cls_struct_type2.alignment = 0; + cls_struct_type2.type = FFI_TYPE_STRUCT; + cls_struct_type2.elements = cls_struct_fields2; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &ffi_type_uint64; + cls_struct_fields[2] = NULL; + + cls_struct_fields1[0] = &cls_struct_type; + cls_struct_fields1[1] = &ffi_type_uchar; + cls_struct_fields1[2] = NULL; + + cls_struct_fields2[0] = &ffi_type_ulong; + cls_struct_fields2[1] = &ffi_type_uchar; + cls_struct_fields2[2] = NULL; + + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type1; + dbl_arg_types[2] = &cls_struct_type2; + dbl_arg_types[3] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = NULL; + + ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); + /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); + + res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); + /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ + CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); + CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); + CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/problem1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/problem1.c new file mode 100644 index 000000000000..6a91555a1fa8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/problem1.c @@ -0,0 +1,90 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure passing with different structure size. + Limitations: none. + PR: none. + Originator: <andreast@gcc.gnu.org> 20030828 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct my_ffi_struct { + double a; + double b; + double c; +} my_ffi_struct; + +my_ffi_struct callee(struct my_ffi_struct a1, struct my_ffi_struct a2) +{ + struct my_ffi_struct result; + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + + printf("%g %g %g %g %g %g: %g %g %g\n", a1.a, a1.b, a1.c, + a2.a, a2.b, a2.c, result.a, result.b, result.c); + + return result; +} + +void stub(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + struct my_ffi_struct a1; + struct my_ffi_struct a2; + + a1 = *(struct my_ffi_struct*)(args[0]); + a2 = *(struct my_ffi_struct*)(args[1]); + + *(my_ffi_struct *)resp = callee(a1, a2); +} + + +int main(void) +{ + ffi_type* my_ffi_struct_fields[4]; + ffi_type my_ffi_struct_type; + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[4]; + ffi_type* arg_types[3]; + + struct my_ffi_struct g = { 1.0, 2.0, 3.0 }; + struct my_ffi_struct f = { 1.0, 2.0, 3.0 }; + struct my_ffi_struct res; + + my_ffi_struct_type.size = 0; + my_ffi_struct_type.alignment = 0; + my_ffi_struct_type.type = FFI_TYPE_STRUCT; + my_ffi_struct_type.elements = my_ffi_struct_fields; + + my_ffi_struct_fields[0] = &ffi_type_double; + my_ffi_struct_fields[1] = &ffi_type_double; + my_ffi_struct_fields[2] = &ffi_type_double; + my_ffi_struct_fields[3] = NULL; + + arg_types[0] = &my_ffi_struct_type; + arg_types[1] = &my_ffi_struct_type; + arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &my_ffi_struct_type, + arg_types) == FFI_OK); + + args[0] = &g; + args[1] = &f; + args[2] = NULL; + ffi_call(&cif, FFI_FN(callee), &res, args); + /* { dg-output "1 2 3 1 2 3: 2 4 6" } */ + printf("res: %g %g %g\n", res.a, res.b, res.c); + /* { dg-output "\nres: 2 4 6" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, stub, NULL, code) == FFI_OK); + + res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(code))(g, f); + /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */ + printf("res: %g %g %g\n", res.a, res.b, res.c); + /* { dg-output "\nres: 2 4 6" } */ + + exit(0);; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large.c new file mode 100644 index 000000000000..71c2469e1c4d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large.c @@ -0,0 +1,145 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure returning with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +/* 13 FPRs: 104 bytes */ +/* 14 FPRs: 112 bytes */ + +typedef struct struct_108byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; + double i; + double j; + double k; + double l; + double m; + int n; +} struct_108byte; + +struct_108byte cls_struct_108byte_fn( + struct_108byte b0, + struct_108byte b1, + struct_108byte b2, + struct_108byte b3) +{ + struct_108byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + result.i = b0.i + b1.i + b2.i + b3.i; + result.j = b0.j + b1.j + b2.j + b3.j; + result.k = b0.k + b1.k + b2.k + b3.k; + result.l = b0.l + b1.l + b2.l + b3.l; + result.m = b0.m + b1.m + b2.m + b3.m; + result.n = b0.n + b1.n + b2.n + b3.n; + + printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h, result.i, + result.j, result.k, result.l, result.m, result.n); + + return result; +} + +static void +cls_struct_108byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + struct_108byte b0, b1, b2, b3; + + b0 = *(struct_108byte*)(args[0]); + b1 = *(struct_108byte*)(args[1]); + b2 = *(struct_108byte*)(args[2]); + b3 = *(struct_108byte*)(args[3]); + + *(struct_108byte*)resp = cls_struct_108byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[15]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 }; + struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 }; + struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 }; + struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 }; + struct_108byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = &ffi_type_double; + cls_struct_fields[9] = &ffi_type_double; + cls_struct_fields[10] = &ffi_type_double; + cls_struct_fields[11] = &ffi_type_double; + cls_struct_fields[12] = &ffi_type_double; + cls_struct_fields[13] = &ffi_type_sint32; + cls_struct_fields[14] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_108byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, + res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_108byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((struct_108byte(*)(struct_108byte, struct_108byte, + struct_108byte, struct_108byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, + res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large2.c new file mode 100644 index 000000000000..d9c750ee1c04 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_large2.c @@ -0,0 +1,148 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure returning with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +/* 13 FPRs: 104 bytes */ +/* 14 FPRs: 112 bytes */ + +typedef struct struct_116byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; + double i; + double j; + double k; + double l; + double m; + double n; + int o; +} struct_116byte; + +struct_116byte cls_struct_116byte_fn( + struct_116byte b0, + struct_116byte b1, + struct_116byte b2, + struct_116byte b3) +{ + struct_116byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + result.i = b0.i + b1.i + b2.i + b3.i; + result.j = b0.j + b1.j + b2.j + b3.j; + result.k = b0.k + b1.k + b2.k + b3.k; + result.l = b0.l + b1.l + b2.l + b3.l; + result.m = b0.m + b1.m + b2.m + b3.m; + result.n = b0.n + b1.n + b2.n + b3.n; + result.o = b0.o + b1.o + b2.o + b3.o; + + printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h, result.i, + result.j, result.k, result.l, result.m, result.n, result.o); + + return result; +} + +static void +cls_struct_116byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + struct_116byte b0, b1, b2, b3; + + b0 = *(struct_116byte*)(args[0]); + b1 = *(struct_116byte*)(args[1]); + b2 = *(struct_116byte*)(args[2]); + b3 = *(struct_116byte*)(args[3]); + + *(struct_116byte*)resp = cls_struct_116byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[16]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 }; + struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 }; + struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 }; + struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 }; + struct_116byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = &ffi_type_double; + cls_struct_fields[9] = &ffi_type_double; + cls_struct_fields[10] = &ffi_type_double; + cls_struct_fields[11] = &ffi_type_double; + cls_struct_fields[12] = &ffi_type_double; + cls_struct_fields[13] = &ffi_type_double; + cls_struct_fields[14] = &ffi_type_sint32; + cls_struct_fields[15] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_116byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, + res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_116byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((struct_116byte(*)(struct_116byte, struct_116byte, + struct_116byte, struct_116byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, + res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, + res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c new file mode 100644 index 000000000000..973ee02ede88 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium.c @@ -0,0 +1,124 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure returning with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +#include "ffitest.h" + +typedef struct struct_72byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; + double i; +} struct_72byte; + +struct_72byte cls_struct_72byte_fn( + struct_72byte b0, + struct_72byte b1, + struct_72byte b2, + struct_72byte b3) +{ + struct_72byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + result.i = b0.i + b1.i + b2.i + b3.i; + + printf("%g %g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h, result.i); + + return result; +} + +static void +cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + struct_72byte b0, b1, b2, b3; + + b0 = *(struct_72byte*)(args[0]); + b1 = *(struct_72byte*)(args[1]); + b2 = *(struct_72byte*)(args[2]); + b3 = *(struct_72byte*)(args[3]); + + *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[10]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 }; + struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 }; + struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 }; + struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 }; + struct_72byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = &ffi_type_double; + cls_struct_fields[9] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, + struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ + printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c new file mode 100644 index 000000000000..84323d16a918 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/stret_medium2.c @@ -0,0 +1,125 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure returning with different structure size. + Depending on the ABI. Check bigger struct which overlaps + the gp and fp register count on Darwin/AIX/ppc64. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/21/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ +#include "ffitest.h" + +typedef struct struct_72byte { + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; + long long i; +} struct_72byte; + +struct_72byte cls_struct_72byte_fn( + struct_72byte b0, + struct_72byte b1, + struct_72byte b2, + struct_72byte b3) +{ + struct_72byte result; + + result.a = b0.a + b1.a + b2.a + b3.a; + result.b = b0.b + b1.b + b2.b + b3.b; + result.c = b0.c + b1.c + b2.c + b3.c; + result.d = b0.d + b1.d + b2.d + b3.d; + result.e = b0.e + b1.e + b2.e + b3.e; + result.f = b0.f + b1.f + b2.f + b3.f; + result.g = b0.g + b1.g + b2.g + b3.g; + result.h = b0.h + b1.h + b2.h + b3.h; + result.i = b0.i + b1.i + b2.i + b3.i; + + printf("%g %g %g %g %g %g %g %g %" PRIdLL "\n", result.a, result.b, result.c, + result.d, result.e, result.f, result.g, result.h, result.i); + + return result; +} + +static void +cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) +{ + struct_72byte b0, b1, b2, b3; + + b0 = *(struct_72byte*)(args[0]); + b1 = *(struct_72byte*)(args[1]); + b2 = *(struct_72byte*)(args[2]); + b3 = *(struct_72byte*)(args[3]); + + *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_dbl[5]; + ffi_type* cls_struct_fields[10]; + ffi_type cls_struct_type; + ffi_type* dbl_arg_types[5]; + + struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 }; + struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 }; + struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 }; + struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 }; + struct_72byte res_dbl; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_double; + cls_struct_fields[1] = &ffi_type_double; + cls_struct_fields[2] = &ffi_type_double; + cls_struct_fields[3] = &ffi_type_double; + cls_struct_fields[4] = &ffi_type_double; + cls_struct_fields[5] = &ffi_type_double; + cls_struct_fields[6] = &ffi_type_double; + cls_struct_fields[7] = &ffi_type_double; + cls_struct_fields[8] = &ffi_type_sint64; + cls_struct_fields[9] = NULL; + + dbl_arg_types[0] = &cls_struct_type; + dbl_arg_types[1] = &cls_struct_type; + dbl_arg_types[2] = &cls_struct_type; + dbl_arg_types[3] = &cls_struct_type; + dbl_arg_types[4] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, + dbl_arg_types) == FFI_OK); + + args_dbl[0] = &e_dbl; + args_dbl[1] = &f_dbl; + args_dbl[2] = &g_dbl; + args_dbl[3] = &h_dbl; + args_dbl[4] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); + /* { dg-output "22 15 17 25 6 13 19 18 16" } */ + printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); + + res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, + struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); + /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ + printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, + res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); + /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c new file mode 100644 index 000000000000..ca31056d8c83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/testclosure.c @@ -0,0 +1,70 @@ +/* Area: closure_call + Purpose: Check return value float. + Limitations: none. + PR: 41908. + Originator: <rfm@gnu.org> 20091102 */ + +/* { dg-do run } */ +#include "ffitest.h" + +typedef struct cls_struct_combined { + float a; + float b; + float c; + float d; +} cls_struct_combined; + +void cls_struct_combined_fn(struct cls_struct_combined arg) +{ + printf("%g %g %g %g\n", + arg.a, arg.b, + arg.c, arg.d); + fflush(stdout); +} + +static void +cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args, void* userdata __UNUSED__) +{ + struct cls_struct_combined a0; + + a0 = *(struct cls_struct_combined*)(args[0]); + + cls_struct_combined_fn(a0); +} + + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type* cls_struct_fields0[5]; + ffi_type cls_struct_type0; + ffi_type* dbl_arg_types[5]; + + struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; + + cls_struct_type0.size = 0; + cls_struct_type0.alignment = 0; + cls_struct_type0.type = FFI_TYPE_STRUCT; + cls_struct_type0.elements = cls_struct_fields0; + + cls_struct_fields0[0] = &ffi_type_float; + cls_struct_fields0[1] = &ffi_type_float; + cls_struct_fields0[2] = &ffi_type_float; + cls_struct_fields0[3] = &ffi_type_float; + cls_struct_fields0[4] = NULL; + + dbl_arg_types[0] = &cls_struct_type0; + dbl_arg_types[1] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void, + dbl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); + + ((void(*)(cls_struct_combined)) (code))(g_dbl); + /* { dg-output "4 5 1 8" } */ + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc new file mode 100644 index 000000000000..e1145657d14d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest.cc @@ -0,0 +1,117 @@ +/* Area: ffi_closure, unwind info + Purpose: Check if the unwind information is passed correctly. + Limitations: none. + PR: none. + Originator: Jeff Sturm <jsturm@one-point.com> */ + +/* { dg-do run { xfail x86_64-apple-darwin* moxie*-*-* } } */ + +#include "ffitest.h" + +void ABI_ATTR +closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args __UNUSED__, void* userdata __UNUSED__) +{ + throw 9; +} + +typedef void (*closure_test_type)(); + +void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) + { + *(ffi_arg*)resp = + (int)*(float *)args[0] +(int)(*(float *)args[1]) + + (int)(*(float *)args[2]) + (int)*(float *)args[3] + + (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + + (int)*(float *)args[6] + (int)(*(int *)args[7]) + + (int)(*(double*)args[8]) + (int)*(int *)args[9] + + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + + (int)*(int *)args[12] + (int)(*(int *)args[13]) + + (int)(*(int *)args[14]) + *(int *)args[15] + (int)(intptr_t)userdata; + + printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", + (int)*(float *)args[0], (int)(*(float *)args[1]), + (int)(*(float *)args[2]), (int)*(float *)args[3], + (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), + (int)*(float *)args[6], (int)(*(int *)args[7]), + (int)(*(double *)args[8]), (int)*(int *)args[9], + (int)(*(int *)args[10]), (int)(*(float *)args[11]), + (int)*(int *)args[12], (int)(*(int *)args[13]), + (int)(*(int *)args[14]), *(int *)args[15], + (int)(intptr_t)userdata, (int)*(ffi_arg*)resp); + + throw (int)*(ffi_arg*)resp; +} + +typedef int (*closure_test_type1)(float, float, float, float, signed short, + float, float, int, double, int, int, float, + int, int, int, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + + { + cl_arg_types[1] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, + &ffi_type_void, cl_arg_types) == FFI_OK); + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn, NULL, code) == FFI_OK); + + try + { + (*((closure_test_type)(code)))(); + } catch (int exception_code) + { + CHECK(exception_code == 9); + } + + printf("part one OK\n"); + /* { dg-output "part one OK" } */ + } + + { + + cl_arg_types[0] = &ffi_type_float; + cl_arg_types[1] = &ffi_type_float; + cl_arg_types[2] = &ffi_type_float; + cl_arg_types[3] = &ffi_type_float; + cl_arg_types[4] = &ffi_type_sshort; + cl_arg_types[5] = &ffi_type_float; + cl_arg_types[6] = &ffi_type_float; + cl_arg_types[7] = &ffi_type_uint; + cl_arg_types[8] = &ffi_type_double; + cl_arg_types[9] = &ffi_type_uint; + cl_arg_types[10] = &ffi_type_uint; + cl_arg_types[11] = &ffi_type_float; + cl_arg_types[12] = &ffi_type_uint; + cl_arg_types[13] = &ffi_type_uint; + cl_arg_types[14] = &ffi_type_uint; + cl_arg_types[15] = &ffi_type_uint; + cl_arg_types[16] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, + (void *) 3 /* userdata */, code) == FFI_OK); + try + { + (*((closure_test_type1)code)) + (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, + 19, 21, 1); + /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ + } catch (int exception_code) + { + CHECK(exception_code == 255); + } + printf("part two OK\n"); + /* { dg-output "\npart two OK" } */ + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc new file mode 100644 index 000000000000..153d24094080 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc @@ -0,0 +1,54 @@ +/* Area: ffi_call, unwind info + Purpose: Check if the unwind information is passed correctly. + Limitations: none. + PR: none. + Originator: Andreas Tobler <andreast@gcc.gnu.org> 20061213 */ + +/* { dg-do run { xfail moxie*-*-* } } */ + +#include "ffitest.h" + +static int checking(int a __UNUSED__, short b __UNUSED__, + signed char c __UNUSED__) +{ + throw 9; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + ffi_arg rint; + + signed int si; + signed short ss; + signed char sc; + + args[0] = &ffi_type_sint; + values[0] = &si; + args[1] = &ffi_type_sshort; + values[1] = &ss; + args[2] = &ffi_type_schar; + values[2] = &sc; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &ffi_type_sint, args) == FFI_OK); + + si = -6; + ss = -12; + sc = -1; + { + try + { + ffi_call(&cif, FFI_FN(checking), &rint, values); + } catch (int exception_code) + { + CHECK(exception_code == 9); + } + printf("part one OK\n"); + /* { dg-output "part one OK" } */ + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc new file mode 100644 index 000000000000..4a812edf055e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc @@ -0,0 +1,91 @@ +/* -*-c-*- */ +#include "ffitest.h" +#include <complex.h> + +typedef struct cls_struct_align { + unsigned char a; + _Complex T_C_TYPE b; + unsigned char c; +} cls_struct_align; + +cls_struct_align cls_struct_align_fn( + struct cls_struct_align a1, struct cls_struct_align a2) +{ + struct cls_struct_align result; + + result.a = a1.a + a2.a; + result.b = a1.b + a2.b; + result.c = a1.c + a2.c; + + printf("%d %f,%fi %d %d %f,%fi %d: %d %f,%fi %d\n", + a1.a, T_CONV creal (a1.b), T_CONV cimag (a1.b), a1.c, + a2.a, T_CONV creal (a2.b), T_CONV cimag (a2.b), a2.c, + result.a, T_CONV creal (result.b), T_CONV cimag (result.b), result.c); + + return result; +} + +static void +cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) +{ + + struct cls_struct_align a1, a2; + + a1 = *(struct cls_struct_align*)(args[0]); + a2 = *(struct cls_struct_align*)(args[1]); + + *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args_c[5]; + ffi_type* cls_struct_fields[4]; + ffi_type cls_struct_type; + ffi_type* c_arg_types[5]; + + struct cls_struct_align g_c = { 12, 4951 + 7 * I, 127 }; + struct cls_struct_align f_c = { 1, 9320 + 1 * I, 13 }; + struct cls_struct_align res_c; + + cls_struct_type.size = 0; + cls_struct_type.alignment = 0; + cls_struct_type.type = FFI_TYPE_STRUCT; + cls_struct_type.elements = cls_struct_fields; + + cls_struct_fields[0] = &ffi_type_uchar; + cls_struct_fields[1] = &T_FFI_TYPE; + cls_struct_fields[2] = &ffi_type_uchar; + cls_struct_fields[3] = NULL; + + c_arg_types[0] = &cls_struct_type; + c_arg_types[1] = &cls_struct_type; + c_arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, + c_arg_types) == FFI_OK); + + args_c[0] = &g_c; + args_c[1] = &f_c; + args_c[2] = NULL; + + ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_c, args_c); + /* { dg-output "12 4951,7i 127 1 9320,1i 13: 13 14271,8i 140" } */ + printf("res: %d %f,%fi %d\n", + res_c.a, T_CONV creal (res_c.b), T_CONV cimag (res_c.b), res_c.c); + /* { dg-output "\nres: 13 14271,8i 140" } */ + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); + + res_c = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_c, f_c); + /* { dg-output "\n12 4951,7i 127 1 9320,1i 13: 13 14271,8i 140" } */ + printf("res: %d %f,%fi %d\n", + res_c.a, T_CONV creal (res_c.b), T_CONV cimag (res_c.b), res_c.c); + /* { dg-output "\nres: 13 14271,8i 140" } */ + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c new file mode 100644 index 000000000000..0dff23ae47c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c @@ -0,0 +1,10 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_double.inc" +#include "cls_align_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c new file mode 100644 index 000000000000..0affbd07e53d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c @@ -0,0 +1,10 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_float.inc" +#include "cls_align_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c new file mode 100644 index 000000000000..7889ba859b54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c @@ -0,0 +1,10 @@ +/* Area: ffi_call, closure_call + Purpose: Check structure alignment of complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_longdouble.inc" +#include "cls_align_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc new file mode 100644 index 000000000000..f9374044e878 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc @@ -0,0 +1,42 @@ +/* -*-c-*- */ +#include "ffitest.h" +#include <complex.h> + +static void cls_ret_complex_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata __UNUSED__) + { + _Complex T_C_TYPE *pa; + _Complex T_C_TYPE *pr; + pa = (_Complex T_C_TYPE *)args[0]; + pr = (_Complex T_C_TYPE *)resp; + *pr = *pa; + + printf("%.6f,%.6fi: %.6f,%.6fi\n", + T_CONV creal (*pa), T_CONV cimag (*pa), + T_CONV creal (*pr), T_CONV cimag (*pr)); + } +typedef _Complex T_C_TYPE (*cls_ret_complex)(_Complex T_C_TYPE); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[2]; + _Complex T_C_TYPE res; + + cl_arg_types[0] = &T_FFI_TYPE; + cl_arg_types[1] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &T_FFI_TYPE, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_complex_fn, NULL, code) == FFI_OK); + + res = (*((cls_ret_complex)code))(0.125 + 128.0 * I); + printf("res: %.6f,%.6fi\n", T_CONV creal (res), T_CONV cimag (res)); + CHECK (res == (0.125 + 128.0 * I)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c new file mode 100644 index 000000000000..05e35340e08d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c @@ -0,0 +1,10 @@ +/* Area: closure_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_double.inc" +#include "cls_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c new file mode 100644 index 000000000000..5df7849d4c97 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c @@ -0,0 +1,10 @@ +/* Area: closure_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_float.inc" +#include "cls_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c new file mode 100644 index 000000000000..2b1c320a20a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c @@ -0,0 +1,10 @@ +/* Area: closure_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_longdouble.inc" +#include "cls_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc new file mode 100644 index 000000000000..df8708d1c4f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc @@ -0,0 +1,71 @@ +/* -*-c-*- */ +#include "ffitest.h" +#include <complex.h> + +typedef struct Cs { + _Complex T_C_TYPE x; + _Complex T_C_TYPE y; +} Cs; + +Cs gc; + +void +closure_test_fn(Cs p) +{ + printf("%.1f,%.1fi %.1f,%.1fi\n", + T_CONV creal (p.x), T_CONV cimag (p.x), + T_CONV creal (p.y), T_CONV cimag (p.y)); + gc = p; +} + +void +closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, + void** args, void* userdata __UNUSED__) +{ + closure_test_fn(*(Cs*)args[0]); +} + +int main(int argc __UNUSED__, char** argv __UNUSED__) +{ + ffi_cif cif; + + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type *cl_arg_types[1]; + + ffi_type ts1_type; + ffi_type* ts1_type_elements[4]; + + Cs arg = { 1.0 + 11.0 * I, 2.0 + 22.0 * I}; + + ts1_type.size = 0; + ts1_type.alignment = 0; + ts1_type.type = FFI_TYPE_STRUCT; + ts1_type.elements = ts1_type_elements; + + ts1_type_elements[0] = &T_FFI_TYPE; + ts1_type_elements[1] = &T_FFI_TYPE; + ts1_type_elements[2] = NULL; + + cl_arg_types[0] = &ts1_type; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_void, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK); + + gc.x = 0.0 + 0.0 * I; + gc.y = 0.0 + 0.0 * I; + ((void*(*)(Cs))(code))(arg); + /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */ + CHECK (gc.x == arg.x && gc.y == arg.y); + + gc.x = 0.0 + 0.0 * I; + gc.y = 0.0 + 0.0 * I; + closure_test_fn(arg); + /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */ + CHECK (gc.x == arg.x && gc.y == arg.y); + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c new file mode 100644 index 000000000000..ec71346a3fb6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c @@ -0,0 +1,10 @@ +/* Area: ffi_call, closure_call + Purpose: Check complex arguments in structs. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_double.inc" +#include "cls_complex_struct.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c new file mode 100644 index 000000000000..96fdf7504306 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c @@ -0,0 +1,10 @@ +/* Area: ffi_call, closure_call + Purpose: Check complex arguments in structs. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_float.inc" +#include "cls_complex_struct.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c new file mode 100644 index 000000000000..005b467398f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c @@ -0,0 +1,10 @@ +/* Area: ffi_call, closure_call + Purpose: Check complex arguments in structs. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_longdouble.inc" +#include "cls_complex_struct.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc new file mode 100644 index 000000000000..8a3e15f0f6af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc @@ -0,0 +1,80 @@ +/* -*-c-*- */ +#include "ffitest.h" +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <complex.h> + +static _Complex T_C_TYPE gComplexValue1 = 1 + 2 * I; +static _Complex T_C_TYPE gComplexValue2 = 3 + 4 * I; + +static int cls_variadic(const char *format, ...) +{ + va_list ap; + _Complex T_C_TYPE p1, p2; + + va_start (ap, format); + p1 = va_arg (ap, _Complex T_C_TYPE); + p2 = va_arg (ap, _Complex T_C_TYPE); + va_end (ap); + + return printf(format, T_CONV creal (p1), T_CONV cimag (p1), + T_CONV creal (p2), T_CONV cimag (p2)); +} + +static void +cls_complex_va_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + char* format = *(char**)args[0]; + gComplexValue1 = *(_Complex T_C_TYPE*)args[1]; + gComplexValue2 = *(_Complex T_C_TYPE*)args[2]; + + *(ffi_arg*)resp = + printf(format, + T_CONV creal (gComplexValue1), T_CONV cimag (gComplexValue1), + T_CONV creal (gComplexValue2), T_CONV cimag (gComplexValue2)); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[4]; + ffi_type* arg_types[4]; + char *format = "%.1f,%.1fi %.1f,%.1fi\n"; + + _Complex T_C_TYPE complexArg1 = 1.0 + 22.0 *I; + _Complex T_C_TYPE complexArg2 = 333.0 + 4444.0 *I; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &T_FFI_TYPE; + arg_types[2] = &T_FFI_TYPE; + arg_types[3] = NULL; + + /* This printf call is variadic */ + CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint, + arg_types) == FFI_OK); + + args[0] = &format; + args[1] = &complexArg1; + args[2] = &complexArg2; + args[3] = NULL; + + ffi_call(&cif, FFI_FN(cls_variadic), &res, args); + printf("res: %d\n", (int) res); + CHECK (res == 24); + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_complex_va_fn, NULL, code) + == FFI_OK); + + res = ((int(*)(char *, ...))(code))(format, complexArg1, complexArg2); + CHECK (gComplexValue1 == complexArg1); + CHECK (gComplexValue2 == complexArg2); + printf("res: %d\n", (int) res); + CHECK (res == 24); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c new file mode 100644 index 000000000000..879ccf3b81f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c @@ -0,0 +1,10 @@ +/* Area: ffi_call, closure_call + Purpose: Test complex' passed in variable argument lists. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_double.inc" +#include "cls_complex_va.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c new file mode 100644 index 000000000000..2b17826045aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c @@ -0,0 +1,16 @@ +/* Area: ffi_call, closure_call + Purpose: Test complex' passed in variable argument lists. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +/* Alpha splits _Complex into two arguments. It's illegal to pass + float through varargs, so _Complex float goes badly. In sort of + gets passed as _Complex double, but the compiler doesn't agree + with itself on this issue. */ +/* { dg-do run { xfail alpha*-*-* } } */ + +#include "complex_defs_float.inc" +#include "cls_complex_va.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c new file mode 100644 index 000000000000..6eca9656eac5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c @@ -0,0 +1,10 @@ +/* Area: ffi_call, closure_call + Purpose: Test complex' passed in variable argument lists. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_longdouble.inc" +#include "cls_complex_va.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp new file mode 100644 index 000000000000..4631db285a24 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp @@ -0,0 +1,36 @@ +# Copyright (C) 2003, 2006, 2009, 2010, 2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +dg-init +libffi-init + +global srcdir subdir + +set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]] + +if { [libffi_feature_test "#ifdef FFI_TARGET_HAS_COMPLEX_TYPE"] } { + run-many-tests $tlist "" +} else { + foreach test $tlist { + unsupported "$test" + } +} + +dg-finish + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc new file mode 100644 index 000000000000..515ae3e60dea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc @@ -0,0 +1,51 @@ +/* -*-c-*-*/ +#include "ffitest.h" +#include <complex.h> + +static _Complex T_C_TYPE f_complex(_Complex T_C_TYPE c, int x, int *py) +{ + c = -(2 * creal (c)) + (cimag (c) + 1)* I; + *py += x; + + return c; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + + _Complex T_C_TYPE tc_arg; + _Complex T_C_TYPE tc_result; + int tc_int_arg_x; + int tc_y; + int *tc_ptr_arg_y = &tc_y; + + args[0] = &T_FFI_TYPE; + args[1] = &ffi_type_sint; + args[2] = &ffi_type_pointer; + values[0] = &tc_arg; + values[1] = &tc_int_arg_x; + values[2] = &tc_ptr_arg_y; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, + &T_FFI_TYPE, args) == FFI_OK); + + tc_arg = 1 + 7 * I; + tc_int_arg_x = 1234; + tc_y = 9876; + ffi_call(&cif, FFI_FN(f_complex), &tc_result, values); + + printf ("%f,%fi %f,%fi, x %d 1234, y %d 11110\n", + T_CONV creal (tc_result), T_CONV cimag (tc_result), + T_CONV creal (2.0), T_CONV creal (8.0), tc_int_arg_x, tc_y); + + CHECK (creal (tc_result) == -2); + CHECK (cimag (tc_result) == 8); + CHECK (tc_int_arg_x == 1234); + CHECK (*tc_ptr_arg_y == 11110); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc new file mode 100644 index 000000000000..3583e166d662 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc @@ -0,0 +1,7 @@ +/* -*-c-*- */ +/* Complex base type. */ +#define T_FFI_TYPE ffi_type_complex_double +/* C type corresponding to the base type. */ +#define T_C_TYPE double +/* C cast for a value of type T_C_TYPE that is passed to printf. */ +#define T_CONV diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc new file mode 100644 index 000000000000..bbd9375cbfaf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc @@ -0,0 +1,7 @@ +/* -*-c-*- */ +/* Complex base type. */ +#define T_FFI_TYPE ffi_type_complex_float +/* C type corresponding to the base type. */ +#define T_C_TYPE float +/* C cast for a value of type T_C_TYPE that is passed to printf. */ +#define T_CONV (double) diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc new file mode 100644 index 000000000000..14b9f243f480 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc @@ -0,0 +1,7 @@ +/* -*-c-*- */ +/* Complex base type. */ +#define T_FFI_TYPE ffi_type_complex_longdouble +/* C type corresponding to the base type. */ +#define T_C_TYPE long double +/* C cast for a value of type T_C_TYPE that is passed to printf. */ +#define T_CONV diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c new file mode 100644 index 000000000000..8a3297b2a24f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check complex types. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_double.inc" +#include "complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c new file mode 100644 index 000000000000..5044ebbcaae1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check complex types. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_float.inc" +#include "complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c new file mode 100644 index 000000000000..bac319081e61 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c @@ -0,0 +1,86 @@ +/* Area: ffi_call + Purpose: Check non-standard complex types. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "ffitest.h" +#include "ffi.h" +#include <complex.h> + +_Complex int f_complex(_Complex int c, int x, int *py) +{ + __real__ c = -2 * __real__ c; + __imag__ c = __imag__ c + 1; + *py += x; + return c; +} + +/* + * This macro can be used to define new complex type descriptors + * in a platform independent way. + * + * name: Name of the new descriptor is ffi_type_complex_<name>. + * type: The C base type of the complex type. + */ +#define FFI_COMPLEX_TYPEDEF(name, type, ffitype) \ + static ffi_type *ffi_elements_complex_##name [2] = { \ + (ffi_type *)(&ffitype), NULL \ + }; \ + struct struct_align_complex_##name { \ + char c; \ + _Complex type x; \ + }; \ + ffi_type ffi_type_complex_##name = { \ + sizeof(_Complex type), \ + offsetof(struct struct_align_complex_##name, x), \ + FFI_TYPE_COMPLEX, \ + (ffi_type **)ffi_elements_complex_##name \ + } + +/* Define new complex type descriptors using the macro: */ +/* ffi_type_complex_sint */ +FFI_COMPLEX_TYPEDEF(sint, int, ffi_type_sint); +/* ffi_type_complex_uchar */ +FFI_COMPLEX_TYPEDEF(uchar, unsigned char, ffi_type_uint8); + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + + _Complex int tc_arg; + _Complex int tc_result; + int tc_int_arg_x; + int tc_y; + int *tc_ptr_arg_y = &tc_y; + + args[0] = &ffi_type_complex_sint; + args[1] = &ffi_type_sint; + args[2] = &ffi_type_pointer; + values[0] = &tc_arg; + values[1] = &tc_int_arg_x; + values[2] = &tc_ptr_arg_y; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_complex_sint, args) + == FFI_OK); + + tc_arg = 1 + 7 * I; + tc_int_arg_x = 1234; + tc_y = 9876; + ffi_call(&cif, FFI_FN(f_complex), &tc_result, values); + + printf ("%d,%di %d,%di, x %d 1234, y %d 11110\n", + (int)tc_result, (int)(tc_result * -I), 2, 8, tc_int_arg_x, tc_y); + /* dg-output "-2,8i 2,8i, x 1234 1234, y 11110 11110" */ + CHECK (creal (tc_result) == -2); + CHECK (cimag (tc_result) == 8); + CHECK (tc_int_arg_x == 1234); + CHECK (*tc_ptr_arg_y == 11110); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c new file mode 100644 index 000000000000..7e783660930a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check complex types. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_longdouble.inc" +#include "complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h new file mode 100644 index 000000000000..d27d362d6a6e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h @@ -0,0 +1 @@ +#include "../libffi.call/ffitest.h" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc new file mode 100644 index 000000000000..e37a77439765 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc @@ -0,0 +1,78 @@ +/* -*-c-*- */ +#include "ffitest.h" + +#include <stdlib.h> +#include <complex.h> + +static _Complex T_C_TYPE many(_Complex T_C_TYPE c1, + _Complex T_C_TYPE c2, + _Complex T_C_TYPE c3, + _Complex T_C_TYPE c4, + _Complex T_C_TYPE c5, + _Complex T_C_TYPE c6, + _Complex T_C_TYPE c7, + _Complex T_C_TYPE c8, + _Complex T_C_TYPE c9, + _Complex T_C_TYPE c10, + _Complex T_C_TYPE c11, + _Complex T_C_TYPE c12, + _Complex T_C_TYPE c13) +{ + printf("0 :%f,%fi\n" + "1 :%f,%fi\n" + "2 :%f,%fi\n" + "3 :%f,%fi\n" + "4 :%f,%fi\n" + "5 :%f,%fi\n" + "6 :%f,%fi\n" + "7 :%f,%fi\n" + "8 :%f,%fi\n" + "9 :%f,%fi\n" + "10:%f,%fi\n" + "11:%f,%fi\n" + "12:%f,%fi\n", + T_CONV creal (c1), T_CONV cimag (c1), + T_CONV creal (c2), T_CONV cimag (c2), + T_CONV creal (c3), T_CONV cimag (c3), + T_CONV creal (c4), T_CONV cimag (c4), + T_CONV creal (c5), T_CONV cimag (c5), + T_CONV creal (c6), T_CONV cimag (c6), + T_CONV creal (c7), T_CONV cimag (c7), + T_CONV creal (c8), T_CONV cimag (c8), + T_CONV creal (c9), T_CONV cimag (c9), + T_CONV creal (c10), T_CONV cimag (c10), + T_CONV creal (c11), T_CONV cimag (c11), + T_CONV creal (c12), T_CONV cimag (c12), + T_CONV creal (c13), T_CONV cimag (c13)); + + return (c1+c2-c3-c4+c5+c6+c7-c8-c9-c10-c11+c12+c13); +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[13]; + void *values[13]; + _Complex T_C_TYPE ca[13]; + _Complex T_C_TYPE c, cc; + int i; + + for (i = 0; i < 13; i++) + { + args[i] = &T_FFI_TYPE; + values[i] = &ca[i]; + ca[i] = i + (-20 - i) * I; + } + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, &T_FFI_TYPE, args) == FFI_OK); + + ffi_call(&cif, FFI_FN(many), &c, values); + + cc = many(ca[0], ca[1], ca[2], ca[3], ca[4], ca[5], ca[6], ca[7], ca[8], + ca[9], ca[10], ca[11], ca[12]); + CHECK(creal (cc) == creal (c)); + CHECK(cimag (cc) == cimag (c)); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c new file mode 100644 index 000000000000..3fd53c3354d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex, with many arguments + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_double.inc" +#include "many_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c new file mode 100644 index 000000000000..c43d21cd9e12 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex, with many arguments + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_float.inc" +#include "many_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c new file mode 100644 index 000000000000..dbab723969c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex, with many arguments + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_longdouble.inc" +#include "many_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc new file mode 100644 index 000000000000..8bf0c1fbab85 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc @@ -0,0 +1,37 @@ +/* -*-c-*- */ +#include "ffitest.h" +#include <complex.h> + +static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c) +{ + printf ("%f,%fi\n", T_CONV creal (c), T_CONV cimag (c)); + return 2 * c; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + _Complex T_C_TYPE c, rc, rc2; + T_C_TYPE cr, ci; + + args[0] = &T_FFI_TYPE; + values[0] = &c; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &T_FFI_TYPE, args) == FFI_OK); + + for (cr = -127.0; cr < 127; cr++) + { + ci = 1000.0 - cr; + c = cr + ci * I; + ffi_call(&cif, FFI_FN(return_c), &rc, values); + rc2 = return_c(c); + printf ("%f,%fi vs %f,%fi\n", + T_CONV creal (rc), T_CONV cimag (rc), + T_CONV creal (rc2), T_CONV cimag (rc2)); + CHECK(rc == 2 * c); + } + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc new file mode 100644 index 000000000000..7cecc0fefa52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc @@ -0,0 +1,41 @@ +/* -*-c-*- */ +#include "ffitest.h" +#include <complex.h> + +static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c1, float fl2, unsigned int in3, _Complex T_C_TYPE c4) +{ + return c1 + fl2 + in3 + c4; +} +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + _Complex T_C_TYPE c1, c4, rc, rc2; + float fl2; + unsigned int in3; + args[0] = &T_FFI_TYPE; + args[1] = &ffi_type_float; + args[2] = &ffi_type_uint; + args[3] = &T_FFI_TYPE; + values[0] = &c1; + values[1] = &fl2; + values[2] = &in3; + values[3] = &c4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &T_FFI_TYPE, args) == FFI_OK); + c1 = 127.0 + 255.0 * I; + fl2 = 128.0; + in3 = 255; + c4 = 512.7 + 1024.1 * I; + + ffi_call(&cif, FFI_FN(return_c), &rc, values); + rc2 = return_c(c1, fl2, in3, c4); + printf ("%f,%fi vs %f,%fi\n", + T_CONV creal (rc), T_CONV cimag (rc), + T_CONV creal (rc2), T_CONV cimag (rc2)); + CHECK(rc == rc2); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c new file mode 100644 index 000000000000..727410d563da --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_double.inc" +#include "return_complex1.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c new file mode 100644 index 000000000000..a2aeada84763 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_float.inc" +#include "return_complex1.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c new file mode 100644 index 000000000000..103504bf64e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_longdouble.inc" +#include "return_complex1.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc new file mode 100644 index 000000000000..265170bf7182 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc @@ -0,0 +1,44 @@ +/* -*-c-*- */ +#include "ffitest.h" +#include <complex.h> + +_Complex T_C_TYPE +return_c(_Complex T_C_TYPE c1, _Complex T_C_TYPE c2, + unsigned int in3, _Complex T_C_TYPE c4) +{ + volatile _Complex T_C_TYPE r = c1 + c2 + in3 + c4; + return r; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + _Complex T_C_TYPE c1, c2, c4, rc, rc2; + unsigned int in3; + args[0] = &T_FFI_TYPE; + args[1] = &T_FFI_TYPE; + args[2] = &ffi_type_uint; + args[3] = &T_FFI_TYPE; + values[0] = &c1; + values[1] = &c2; + values[2] = &in3; + values[3] = &c4; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, + &T_FFI_TYPE, args) == FFI_OK); + c1 = 127.0 + 255.0 * I; + c2 = 128.0 + 256.0; + in3 = 255; + c4 = 512.7 + 1024.1 * I; + + ffi_call(&cif, FFI_FN(return_c), &rc, values); + rc2 = return_c(c1, c2, in3, c4); + printf ("%f,%fi vs %f,%fi\n", + T_CONV creal (rc), T_CONV cimag (rc), + T_CONV creal (rc2), T_CONV cimag (rc2)); + CHECK(rc == rc2); + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c new file mode 100644 index 000000000000..ab9efacb4a85 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_double.inc" +#include "return_complex2.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c new file mode 100644 index 000000000000..d7f22c2a0c78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_float.inc" +#include "return_complex2.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c new file mode 100644 index 000000000000..3edea629df0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_longdouble.inc" +#include "return_complex2.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c new file mode 100644 index 000000000000..e2497cc84aa0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_double.inc" +#include "return_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c new file mode 100644 index 000000000000..a35528ff9356 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_float.inc" +#include "return_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c new file mode 100644 index 000000000000..142d7becbace --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c @@ -0,0 +1,10 @@ +/* Area: ffi_call + Purpose: Check return value complex. + Limitations: none. + PR: none. + Originator: <vogt@linux.vnet.ibm.com>. */ + +/* { dg-do run } */ + +#include "complex_defs_longdouble.inc" +#include "return_complex.inc" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c new file mode 100644 index 000000000000..b00c404ab353 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c @@ -0,0 +1,34 @@ +/* { dg-do run } */ + +#include "static-chain.h" + +#if defined(__GNUC__) && !defined(__clang__) && defined(STATIC_CHAIN_REG) + +#include "ffitest.h" + +/* Blatent assumption here that the prologue doesn't clobber the + static chain for trivial functions. If this is not true, don't + define STATIC_CHAIN_REG, and we'll test what we can via other tests. */ +void *doit(void) +{ + register void *chain __asm__(STATIC_CHAIN_REG); + return chain; +} + +int main() +{ + ffi_cif cif; + void *result; + + CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK); + + ffi_call_go(&cif, FFI_FN(doit), &result, NULL, &result); + + CHECK(result == &result); + + return 0; +} + +#else /* UNSUPPORTED */ +int main() { return 0; } +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c new file mode 100644 index 000000000000..7b34afc88c8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ + +#include "ffitest.h" + +void doit(ffi_cif *cif, void *rvalue, void **avalue, void *closure) +{ + (void)cif; + (void)avalue; + *(void **)rvalue = closure; +} + +typedef void * (*FN)(void); + +int main() +{ + ffi_cif cif; + ffi_go_closure cl; + void *result; + + CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK); + CHECK(ffi_prep_go_closure(&cl, &cif, doit) == FFI_OK); + + ffi_call_go(&cif, FFI_FN(*(FN *)&cl), &result, NULL, &cl); + + CHECK(result == &cl); + + exit(0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h new file mode 100644 index 000000000000..d27d362d6a6e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h @@ -0,0 +1 @@ +#include "../libffi.call/ffitest.h" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/go.exp b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/go.exp new file mode 100644 index 000000000000..100c5e75b409 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/go.exp @@ -0,0 +1,36 @@ +# Copyright (C) 2003, 2006, 2009, 2010, 2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +dg-init +libffi-init + +global srcdir subdir + +set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]] + +if { [libffi_feature_test "#ifdef FFI_GO_CLOSURES"] } { + run-many-tests $tlist "" +} else { + foreach test $tlist { + unsupported "$test" + } +} + +dg-finish + +# Local Variables: +# tcl-indent-level:4 +# End: diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h new file mode 100644 index 000000000000..3675b40a54c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h @@ -0,0 +1,19 @@ +#ifdef __aarch64__ +# define STATIC_CHAIN_REG "x18" +#elif defined(__alpha__) +# define STATIC_CHAIN_REG "$1" +#elif defined(__arm__) +# define STATIC_CHAIN_REG "ip" +#elif defined(__sparc__) +# if defined(__arch64__) || defined(__sparcv9) +# define STATIC_CHAIN_REG "g5" +# else +# define STATIC_CHAIN_REG "g2" +# endif +#elif defined(__x86_64__) +# define STATIC_CHAIN_REG "r10" +#elif defined(__i386__) +# ifndef ABI_NUM +# define STATIC_CHAIN_REG "ecx" /* FFI_DEFAULT_ABI only */ +# endif +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/rbffi.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/rbffi.h new file mode 100644 index 000000000000..89b3e320b993 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/rbffi.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2008, 2009, Wayne Meissner + * + * Copyright (c) 2008-2013, Ruby FFI project contributors + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Ruby FFI project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RBFFI_RBFFI_H +#define RBFFI_RBFFI_H + +#include <ruby.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_PARAMETERS (32) + +extern VALUE rbffi_FFIModule; + +extern void rbffi_Type_Init(VALUE ffiModule); +extern void rbffi_Buffer_Init(VALUE ffiModule); +extern void rbffi_Invoker_Init(VALUE ffiModule); +extern void rbffi_Variadic_Init(VALUE ffiModule); +extern VALUE rbffi_AbstractMemoryClass, rbffi_InvokerClass; +extern int rbffi_type_size(VALUE type); +extern void rbffi_Thread_Init(VALUE moduleFFI); + +#ifdef __cplusplus +} +#endif + +#endif /* RBFFI_RBFFI_H */ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/rbffi_endian.h b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/rbffi_endian.h new file mode 100644 index 000000000000..ebb8420a6baa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ext/ffi_c/rbffi_endian.h @@ -0,0 +1,59 @@ +#ifndef JFFI_ENDIAN_H +#define JFFI_ENDIAN_H + +#ifndef _MSC_VER +#include <sys/param.h> +#endif + +#include <sys/types.h> + +#if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || defined(__GLIBC__) || defined(__HAIKU__) +# include <endian.h> +# if !defined(LITTLE_ENDIAN) && defined(__LITTLE_ENDIAN) +# define LITTLE_ENDIAN __LITTLE_ENDIAN +# endif +# if !defined(BIG_ENDIAN) && defined(__BIG_ENDIAN) +# define BIG_ENDIAN __BIG_ENDIAN +# endif +# if !defined(BYTE_ORDER) && defined(__BYTE_ORDER) +# define BYTE_ORDER __BYTE_ORDER +# endif +#endif + +#ifdef __sun +# include <sys/byteorder.h> +# define LITTLE_ENDIAN 1234 +# define BIG_ENDIAN 4321 +# if defined(_BIG_ENDIAN) +# define BYTE_ORDER BIG_ENDIAN +# elif defined(_LITTLE_ENDIAN) +# define BYTE_ORDER LITTLE_ENDIAN +# else +# error "Cannot determine endian-ness" +# endif +#endif + +#if defined(_AIX) && !defined(BYTE_ORDER) +# define LITTLE_ENDIAN 1234 +# define BIG_ENDIAN 4321 +# if defined(__BIG_ENDIAN__) +# define BYTE_ORDER BIG_ENDIAN +# elif defined(__LITTLE_ENDIAN__) +# define BYTE_ORDER LITTLE_ENDIAN +# else +# error "Cannot determine endian-ness" +# endif +#endif + +#if defined(_WIN32) +# define LITTLE_ENDIAN 1234 +# define BIG_ENDIAN 4321 +# define BYTE_ORDER LITTLE_ENDIAN +#endif + +#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) +# error "Cannot determine the endian-ness of this platform" +#endif + +#endif /* JFFI_ENDIAN_H */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ffi.gemspec b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ffi.gemspec new file mode 100644 index 000000000000..470f1a18d955 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/ffi.gemspec @@ -0,0 +1,43 @@ +require File.expand_path("../lib/#{File.basename(__FILE__, '.gemspec')}/version", __FILE__) + +Gem::Specification.new do |s| + s.name = 'ffi' + s.version = FFI::VERSION + s.author = 'Wayne Meissner' + s.email = 'wmeissner@gmail.com' + s.homepage = 'https://github.com/ffi/ffi/wiki' + s.summary = 'Ruby FFI' + s.description = 'Ruby FFI library' + if s.respond_to?(:metadata) + s.metadata['bug_tracker_uri'] = 'https://github.com/ffi/ffi/issues' + s.metadata['changelog_uri'] = 'https://github.com/ffi/ffi/blob/master/CHANGELOG.md' + s.metadata['documentation_uri'] = 'https://github.com/ffi/ffi/wiki' + s.metadata['wiki_uri'] = 'https://github.com/ffi/ffi/wiki' + s.metadata['source_code_uri'] = 'https://github.com/ffi/ffi/' + s.metadata['mailing_list_uri'] = 'http://groups.google.com/group/ruby-ffi' + end + s.files = `git ls-files -z`.split("\x0").reject do |f| + f =~ /^(\.|bench|gen|libtest|nbproject|spec)/ + end + + # Add libffi git files + lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0") + # Add autoconf generated files of libffi + lfs += %w[ configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ] + # Add automake generated files of libffi + lfs += `git --git-dir ext/ffi_c/libffi/.git ls-files -z *.am */*.am`.gsub(".am\0", ".in\0").split("\x0") + s.files += lfs.map do |f| + File.join("ext/ffi_c/libffi", f) + end + + s.extensions << 'ext/ffi_c/extconf.rb' + s.rdoc_options = %w[--exclude=ext/ffi_c/.*\.o$ --exclude=ffi_c\.(bundle|so)$] + s.license = 'BSD-3-Clause' + s.require_paths << 'ext/ffi_c' + s.required_ruby_version = '>= 2.3' + s.add_development_dependency 'rake', '~> 13.0' + s.add_development_dependency 'rake-compiler', '~> 1.0' + s.add_development_dependency 'rake-compiler-dock', '~> 1.0' + s.add_development_dependency 'rspec', '~> 2.14.1' + s.add_development_dependency 'rubygems-tasks', "~> 0.2.4" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi.rb new file mode 100644 index 000000000000..d9e7415828c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi.rb @@ -0,0 +1,28 @@ +if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx' + Object.send(:remove_const, :FFI) if defined?(::FFI) + begin + require RUBY_VERSION.split('.')[0, 2].join('.') + '/ffi_c' + rescue Exception + require 'ffi_c' + end + + require 'ffi/ffi' + +elsif RUBY_ENGINE == 'jruby' && (RUBY_ENGINE_VERSION.split('.').map(&:to_i) <=> [9, 3]) >= 0 + JRuby::Util.load_ext("org.jruby.ext.ffi.FFIService") + require 'ffi/ffi' + +elsif RUBY_ENGINE == 'truffleruby' && (RUBY_ENGINE_VERSION.split('.').map(&:to_i) <=> [20, 1, 0]) >= 0 + require 'truffleruby/ffi_backend' + require 'ffi/ffi' + +else + # Remove the ffi gem dir from the load path, then reload the internal ffi implementation + $LOAD_PATH.delete(File.dirname(__FILE__)) + $LOAD_PATH.delete(File.join(File.dirname(__FILE__), 'ffi')) + unless $LOADED_FEATURES.nil? + $LOADED_FEATURES.delete(__FILE__) + $LOADED_FEATURES.delete('ffi.rb') + end + require 'ffi.rb' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/abstract_memory.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/abstract_memory.rb new file mode 100644 index 000000000000..e0aa221643d0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/abstract_memory.rb @@ -0,0 +1,44 @@ +# +# Copyright (C) 2020 Lars Kanis +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.# + + +module FFI + class AbstractMemory + LONG_MAX = FFI::Pointer.new(1).size + private_constant :LONG_MAX + + # Return +true+ if +self+ has a size limit. + # + # @return [Boolean] + def size_limit? + size != LONG_MAX + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/autopointer.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/autopointer.rb new file mode 100644 index 000000000000..679d7e691df3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/autopointer.rb @@ -0,0 +1,203 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# Copyright (C) 2008 Mike Dalessio +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +module FFI + class AutoPointer < Pointer + extend DataConverter + + # @overload initialize(pointer, method) + # @param pointer [Pointer] + # @param method [Method] + # @return [self] + # The passed Method will be invoked at GC time. + # @overload initialize(pointer, proc) + # @param pointer [Pointer] + # @return [self] + # The passed Proc will be invoked at GC time (SEE WARNING BELOW!) + # @note WARNING: passing a proc _may_ cause your pointer to never be + # GC'd, unless you're careful to avoid trapping a reference to the + # pointer in the proc. See the test specs for examples. + # @overload initialize(pointer) { |p| ... } + # @param pointer [Pointer] + # @yieldparam [Pointer] p +pointer+ passed to the block + # @return [self] + # The passed block will be invoked at GC time. + # @note + # WARNING: passing a block will cause your pointer to never be GC'd. + # This is bad. + # @overload initialize(pointer) + # @param pointer [Pointer] + # @return [self] + # The pointer's release() class method will be invoked at GC time. + # + # @note The safest, and therefore preferred, calling + # idiom is to pass a Method as the second parameter. Example usage: + # + # class PointerHelper + # def self.release(pointer) + # ... + # end + # end + # + # p = AutoPointer.new(other_pointer, PointerHelper.method(:release)) + # + # The above code will cause PointerHelper#release to be invoked at GC time. + # + # @note + # The last calling idiom (only one parameter) is generally only + # going to be useful if you subclass {AutoPointer}, and override + # #release, which by default does nothing. + def initialize(ptr, proc=nil, &block) + super(ptr.type_size, ptr) + raise TypeError, "Invalid pointer" if ptr.nil? || !ptr.kind_of?(Pointer) \ + || ptr.kind_of?(MemoryPointer) || ptr.kind_of?(AutoPointer) + + @releaser = if proc + if not proc.respond_to?(:call) + raise RuntimeError.new("proc must be callable") + end + CallableReleaser.new(ptr, proc) + + else + if not self.class.respond_to?(:release) + raise RuntimeError.new("no release method defined") + end + DefaultReleaser.new(ptr, self.class) + end + + ObjectSpace.define_finalizer(self, @releaser) + self + end + + # @return [nil] + # Free the pointer. + def free + @releaser.free + end + + # @param [Boolean] autorelease + # @return [Boolean] +autorelease+ + # Set +autorelease+ property. See {Pointer Autorelease section at Pointer}. + def autorelease=(autorelease) + @releaser.autorelease=(autorelease) + end + + # @return [Boolean] +autorelease+ + # Get +autorelease+ property. See {Pointer Autorelease section at Pointer}. + def autorelease? + @releaser.autorelease + end + + # @abstract Base class for {AutoPointer}'s releasers. + # + # All subclasses of Releaser should define a +#release(ptr)+ method. + # A releaser is an object in charge of release an {AutoPointer}. + class Releaser + attr_accessor :autorelease + + # @param [Pointer] ptr + # @param [#call] proc + # @return [nil] + # A new instance of Releaser. + def initialize(ptr, proc) + @ptr = ptr + @proc = proc + @autorelease = true + end + + # @return [nil] + # Free pointer. + def free + if @ptr + release(@ptr) + @autorelease = false + @ptr = nil + @proc = nil + end + end + + # @param args + # Release pointer if +autorelease+ is set. + def call(*args) + release(@ptr) if @autorelease && @ptr + end + end + + # DefaultReleaser is a {Releaser} used when an {AutoPointer} is defined + # without Proc or Method. In this case, the pointer to release must be of + # a class derived from AutoPointer with a {release} class method. + class DefaultReleaser < Releaser + # @param [Pointer] ptr + # @return [nil] + # Release +ptr+ using the {release} class method of its class. + def release(ptr) + @proc.release(ptr) + end + end + + # CallableReleaser is a {Releaser} used when an {AutoPointer} is defined with a + # Proc or a Method. + class CallableReleaser < Releaser + # Release +ptr+ by using Proc or Method defined at +ptr+ + # {AutoPointer#initialize initialization}. + # + # @param [Pointer] ptr + # @return [nil] + def release(ptr) + @proc.call(ptr) + end + end + + # Return native type of AutoPointer. + # + # Override {DataConverter#native_type}. + # @return [Type::POINTER] + # @raise {RuntimeError} if class does not implement a +#release+ method + def self.native_type + if not self.respond_to?(:release) + raise RuntimeError.new("no release method defined for #{self.inspect}") + end + Type::POINTER + end + + # Create a new AutoPointer. + # + # Override {DataConverter#from_native}. + # @overload self.from_native(ptr, ctx) + # @param [Pointer] ptr + # @param ctx not used. Please set +nil+. + # @return [AutoPointer] + def self.from_native(val, ctx) + self.new(val) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/buffer.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/buffer.rb new file mode 100644 index 000000000000..449e45b0de9f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/buffer.rb @@ -0,0 +1,4 @@ +# +# All the code from this file is now implemented in C. This file remains +# to satisfy any leftover require 'ffi/buffer' in user code +# diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/callback.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/callback.rb new file mode 100644 index 000000000000..32d52f7214ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/callback.rb @@ -0,0 +1,4 @@ +# +# All the code from this file is now implemented in C. This file remains +# to satisfy any leftover require 'ffi/callback' in user code +# diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/data_converter.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/data_converter.rb new file mode 100644 index 000000000000..1527588b7584 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/data_converter.rb @@ -0,0 +1,67 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.# + +module FFI + # This module is used to extend somes classes and give then a common API. + # + # Most of methods defined here must be overriden. + module DataConverter + # Get native type. + # + # @overload native_type(type) + # @param [String, Symbol, Type] type + # @return [Type] + # Get native type from +type+. + # + # @overload native_type + # @raise {NotImplementedError} This method must be overriden. + def native_type(type = nil) + if type + @native_type = FFI.find_type(type) + else + native_type = @native_type + unless native_type + raise NotImplementedError, 'native_type method not overridden and no native_type set' + end + native_type + end + end + + # Convert to a native type. + def to_native(value, ctx) + value + end + + # Convert from a native type. + def from_native(value, ctx) + value + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/enum.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/enum.rb new file mode 100644 index 000000000000..8fcb49859530 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/enum.rb @@ -0,0 +1,296 @@ +# +# Copyright (C) 2009, 2010 Wayne Meissner +# Copyright (C) 2009 Luc Heinrich +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +module FFI + + # An instance of this class permits to manage {Enum}s. In fact, Enums is a collection of {Enum}s. + class Enums + + # @return [nil] + def initialize + @all_enums = Array.new + @tagged_enums = Hash.new + @symbol_map = Hash.new + end + + # @param [Enum] enum + # Add an {Enum} to the collection. + def <<(enum) + @all_enums << enum + @tagged_enums[enum.tag] = enum unless enum.tag.nil? + @symbol_map.merge!(enum.symbol_map) + end + + # @param query enum tag or part of an enum name + # @return [Enum] + # Find a {Enum} in collection. + def find(query) + if @tagged_enums.has_key?(query) + @tagged_enums[query] + else + @all_enums.detect { |enum| enum.symbols.include?(query) } + end + end + + # @param symbol a symbol to find in merge symbol maps of all enums. + # @return a symbol + def __map_symbol(symbol) + @symbol_map[symbol] + end + + end + + # Represents a C enum. + # + # For a C enum: + # enum fruits { + # apple, + # banana, + # orange, + # pineapple + # }; + # are defined this vocabulary: + # * a _symbol_ is a word from the enumeration (ie. _apple_, by example); + # * a _value_ is the value of a symbol in the enumeration (by example, apple has value _0_ and banana _1_). + class Enum + include DataConverter + + attr_reader :tag + attr_reader :native_type + + # @overload initialize(info, tag=nil) + # @param [nil, Enumerable] info + # @param [nil, Symbol] tag enum tag + # @overload initialize(native_type, info, tag=nil) + # @param [FFI::Type] native_type Native type for new Enum + # @param [nil, Enumerable] info symbols and values for new Enum + # @param [nil, Symbol] tag name of new Enum + def initialize(*args) + @native_type = args.first.kind_of?(FFI::Type) ? args.shift : Type::INT + info, @tag = *args + @kv_map = Hash.new + unless info.nil? + last_cst = nil + value = 0 + info.each do |i| + case i + when Symbol + raise ArgumentError, "duplicate enum key" if @kv_map.has_key?(i) + @kv_map[i] = value + last_cst = i + value += 1 + when Integer + @kv_map[last_cst] = i + value = i+1 + end + end + end + @vk_map = @kv_map.invert + end + + # @return [Array] enum symbol names + def symbols + @kv_map.keys + end + + # Get a symbol or a value from the enum. + # @overload [](query) + # Get enum value from symbol. + # @param [Symbol] query + # @return [Integer] + # @overload [](query) + # Get enum symbol from value. + # @param [Integer] query + # @return [Symbol] + def [](query) + case query + when Symbol + @kv_map[query] + when Integer + @vk_map[query] + end + end + alias find [] + + # Get the symbol map. + # @return [Hash] + def symbol_map + @kv_map + end + + alias to_h symbol_map + alias to_hash symbol_map + + # @param [Symbol, Integer, #to_int] val + # @param ctx unused + # @return [Integer] value of a enum symbol + def to_native(val, ctx) + @kv_map[val] || if val.is_a?(Integer) + val + elsif val.respond_to?(:to_int) + val.to_int + else + raise ArgumentError, "invalid enum value, #{val.inspect}" + end + end + + # @param val + # @return symbol name if it exists for +val+. + def from_native(val, ctx) + @vk_map[val] || val + end + end + + # Represents a C enum whose values are power of 2 + # + # @example + # enum { + # red = (1<<0), + # green = (1<<1), + # blue = (1<<2) + # } + # + # Contrary to classical enums, bitmask values are usually combined + # when used. + class Bitmask < Enum + + # @overload initialize(info, tag=nil) + # @param [nil, Enumerable] info symbols and bit rank for new Bitmask + # @param [nil, Symbol] tag name of new Bitmask + # @overload initialize(native_type, info, tag=nil) + # @param [FFI::Type] native_type Native type for new Bitmask + # @param [nil, Enumerable] info symbols and bit rank for new Bitmask + # @param [nil, Symbol] tag name of new Bitmask + def initialize(*args) + @native_type = args.first.kind_of?(FFI::Type) ? args.shift : Type::INT + info, @tag = *args + @kv_map = Hash.new + unless info.nil? + last_cst = nil + value = 0 + info.each do |i| + case i + when Symbol + raise ArgumentError, "duplicate bitmask key" if @kv_map.has_key?(i) + @kv_map[i] = 1 << value + last_cst = i + value += 1 + when Integer + raise ArgumentError, "bitmask index should be positive" if i<0 + @kv_map[last_cst] = 1 << i + value = i+1 + end + end + end + @vk_map = @kv_map.invert + end + + # Get a symbol list or a value from the bitmask + # @overload [](*query) + # Get bitmask value from symbol list + # @param [Symbol] query + # @return [Integer] + # @overload [](query) + # Get bitmaks value from symbol array + # @param [Array<Symbol>] query + # @return [Integer] + # @overload [](*query) + # Get a list of bitmask symbols corresponding to + # the or reduction of a list of integer + # @param [Integer] query + # @return [Array<Symbol>] + # @overload [](query) + # Get a list of bitmask symbols corresponding to + # the or reduction of a list of integer + # @param [Array<Integer>] query + # @return [Array<Symbol>] + def [](*query) + flat_query = query.flatten + raise ArgumentError, "query should be homogeneous, #{query.inspect}" unless flat_query.all? { |o| o.is_a?(Symbol) } || flat_query.all? { |o| o.is_a?(Integer) || o.respond_to?(:to_int) } + case flat_query[0] + when Symbol + flat_query.inject(0) do |val, o| + v = @kv_map[o] + if v then val |= v else val end + end + when Integer, ->(o) { o.respond_to?(:to_int) } + val = flat_query.inject(0) { |mask, o| mask |= o.to_int } + @kv_map.select { |_, v| v & val != 0 }.keys + end + end + + # Get the native value of a bitmask + # @overload to_native(query, ctx) + # @param [Symbol, Integer, #to_int] query + # @param ctx unused + # @return [Integer] value of a bitmask + # @overload to_native(query, ctx) + # @param [Array<Symbol, Integer, #to_int>] query + # @param ctx unused + # @return [Integer] value of a bitmask + def to_native(query, ctx) + return 0 if query.nil? + flat_query = [query].flatten + flat_query.inject(0) do |val, o| + case o + when Symbol + v = @kv_map[o] + raise ArgumentError, "invalid bitmask value, #{o.inspect}" unless v + val |= v + when Integer + val |= o + when ->(obj) { obj.respond_to?(:to_int) } + val |= o.to_int + else + raise ArgumentError, "invalid bitmask value, #{o.inspect}" + end + end + end + + # @param [Integer] val + # @param ctx unused + # @return [Array<Symbol, Integer>] list of symbol names corresponding to val, plus an optional remainder if some bits don't match any constant + def from_native(val, ctx) + list = @kv_map.select { |_, v| v & val != 0 }.keys + # If there are unmatch flags, + # return them in an integer, + # else information can be lost. + # Similar to Enum behavior. + remainder = val ^ list.inject(0) do |tmp, o| + v = @kv_map[o] + if v then tmp |= v else tmp end + end + list.push remainder unless remainder == 0 + return list + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/errno.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/errno.rb new file mode 100644 index 000000000000..de82d891fbe1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/errno.rb @@ -0,0 +1,43 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.# + +module FFI + # @return (see FFI::LastError.error) + # @see FFI::LastError.error + def self.errno + FFI::LastError.error + end + # @param error (see FFI::LastError.error=) + # @return (see FFI::LastError.error=) + # @see FFI::LastError.error= + def self.errno=(error) + FFI::LastError.error = error + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/ffi.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/ffi.rb new file mode 100644 index 000000000000..dfffa8ca0142 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/ffi.rb @@ -0,0 +1,47 @@ +# +# Copyright (C) 2008-2010 JRuby project +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +require 'ffi/platform' +require 'ffi/data_converter' +require 'ffi/types' +require 'ffi/library' +require 'ffi/errno' +require 'ffi/abstract_memory' +require 'ffi/pointer' +require 'ffi/memorypointer' +require 'ffi/struct' +require 'ffi/union' +require 'ffi/managedstruct' +require 'ffi/callback' +require 'ffi/io' +require 'ffi/autopointer' +require 'ffi/variadic' +require 'ffi/enum' +require 'ffi/version' diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/io.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/io.rb new file mode 100644 index 000000000000..e1bb95577d56 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/io.rb @@ -0,0 +1,62 @@ +# +# Copyright (C) 2008, 2009 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.# + +module FFI + + # This module implements a couple of class methods to play with IO. + module IO + # @param [Integer] fd file decriptor + # @param [String] mode mode string + # @return [::IO] + # Synonym for IO::for_fd. + def self.for_fd(fd, mode = "r") + ::IO.for_fd(fd, mode) + end + + # @param [#read] io io to read from + # @param [AbstractMemory] buf destination for data read from +io+ + # @param [nil, Numeric] len maximul number of bytes to read from +io+. If +nil+, + # read until end of file. + # @return [Numeric] length really read, in bytes + # + # A version of IO#read that reads data from an IO and put then into a native buffer. + # + # This will be optimized at some future time to eliminate the double copy. + # + def self.native_read(io, buf, len) + tmp = io.read(len) + return -1 unless tmp + buf.put_bytes(0, tmp) + tmp.length + end + + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/library.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/library.rb new file mode 100644 index 000000000000..c6f9654455a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/library.rb @@ -0,0 +1,592 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.# + +module FFI + CURRENT_PROCESS = USE_THIS_PROCESS_AS_LIBRARY = Object.new + + # @param [#to_s] lib library name + # @return [String] library name formatted for current platform + # Transform a generic library name to a platform library name + # @example + # # Linux + # FFI.map_library_name 'c' # -> "libc.so.6" + # FFI.map_library_name 'jpeg' # -> "libjpeg.so" + # # Windows + # FFI.map_library_name 'c' # -> "msvcrt.dll" + # FFI.map_library_name 'jpeg' # -> "jpeg.dll" + def self.map_library_name(lib) + # Mangle the library name to reflect the native library naming conventions + lib = Library::LIBC if lib == 'c' + + if lib && File.basename(lib) == lib + lib = Platform::LIBPREFIX + lib unless lib =~ /^#{Platform::LIBPREFIX}/ + r = Platform::IS_WINDOWS || Platform::IS_MAC ? "\\.#{Platform::LIBSUFFIX}$" : "\\.so($|\\.[1234567890]+)" + lib += ".#{Platform::LIBSUFFIX}" unless lib =~ /#{r}/ + end + + lib + end + + # Exception raised when a function is not found in libraries + class NotFoundError < LoadError + def initialize(function, *libraries) + super("Function '#{function}' not found in [#{libraries[0].nil? ? 'current process' : libraries.join(", ")}]") + end + end + + # This module is the base to use native functions. + # + # A basic usage may be: + # require 'ffi' + # + # module Hello + # extend FFI::Library + # ffi_lib FFI::Library::LIBC + # attach_function 'puts', [ :string ], :int + # end + # + # Hello.puts("Hello, World") + # + # + module Library + CURRENT_PROCESS = FFI::CURRENT_PROCESS + LIBC = FFI::Platform::LIBC + + # @param mod extended object + # @return [nil] + # @raise {RuntimeError} if +mod+ is not a Module + # Test if extended object is a Module. If not, raise RuntimeError. + def self.extended(mod) + raise RuntimeError.new("must only be extended by module") unless mod.kind_of?(Module) + end + + + # @param [Array] names names of libraries to load + # @return [Array<DynamicLibrary>] + # @raise {LoadError} if a library cannot be opened + # Load native libraries. + def ffi_lib(*names) + raise LoadError.new("library names list must not be empty") if names.empty? + + lib_flags = defined?(@ffi_lib_flags) ? @ffi_lib_flags : FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_LOCAL + ffi_libs = names.map do |name| + + if name == FFI::CURRENT_PROCESS + FFI::DynamicLibrary.open(nil, FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_LOCAL) + + else + libnames = (name.is_a?(::Array) ? name : [ name ]).map(&:to_s).map { |n| [ n, FFI.map_library_name(n) ].uniq }.flatten.compact + lib = nil + errors = {} + + libnames.each do |libname| + begin + orig = libname + lib = FFI::DynamicLibrary.open(libname, lib_flags) + break if lib + + rescue Exception => ex + ldscript = false + if ex.message =~ /(([^ \t()])+\.so([^ \t:()])*):([ \t])*(invalid ELF header|file too short|invalid file format)/ + if File.binread($1) =~ /(?:GROUP|INPUT) *\( *([^ \)]+)/ + libname = $1 + ldscript = true + end + end + + if ldscript + retry + else + # TODO better library lookup logic + unless libname.start_with?("/") || FFI::Platform.windows? + path = ['/usr/lib/','/usr/local/lib/','/opt/local/lib/'].find do |pth| + File.exist?(pth + libname) + end + if path + libname = path + libname + retry + end + end + + libr = (orig == libname ? orig : "#{orig} #{libname}") + errors[libr] = ex + end + end + end + + if lib.nil? + raise LoadError.new(errors.values.join(".\n")) + end + + # return the found lib + lib + end + end + + @ffi_libs = ffi_libs + end + + # Set the calling convention for {#attach_function} and {#callback} + # + # @see http://en.wikipedia.org/wiki/Stdcall#stdcall + # @note +:stdcall+ is typically used for attaching Windows API functions + # + # @param [Symbol] convention one of +:default+, +:stdcall+ + # @return [Symbol] the new calling convention + def ffi_convention(convention = nil) + @ffi_convention ||= :default + @ffi_convention = convention if convention + @ffi_convention + end + + # @see #ffi_lib + # @return [Array<FFI::DynamicLibrary>] array of currently loaded FFI libraries + # @raise [LoadError] if no libraries have been loaded (using {#ffi_lib}) + # Get FFI libraries loaded using {#ffi_lib}. + def ffi_libraries + raise LoadError.new("no library specified") if !defined?(@ffi_libs) || @ffi_libs.empty? + @ffi_libs + end + + # Flags used in {#ffi_lib}. + # + # This map allows you to supply symbols to {#ffi_lib_flags} instead of + # the actual constants. + FlagsMap = { + :global => DynamicLibrary::RTLD_GLOBAL, + :local => DynamicLibrary::RTLD_LOCAL, + :lazy => DynamicLibrary::RTLD_LAZY, + :now => DynamicLibrary::RTLD_NOW + } + + # Sets library flags for {#ffi_lib}. + # + # @example + # ffi_lib_flags(:lazy, :local) # => 5 + # + # @param [Symbol, …] flags (see {FlagsMap}) + # @return [Fixnum] the new value + def ffi_lib_flags(*flags) + @ffi_lib_flags = flags.inject(0) { |result, f| result | FlagsMap[f] } + end + + + ## + # @overload attach_function(func, args, returns, options = {}) + # @example attach function without an explicit name + # module Foo + # extend FFI::Library + # ffi_lib FFI::Library::LIBC + # attach_function :malloc, [:size_t], :pointer + # end + # # now callable via Foo.malloc + # @overload attach_function(name, func, args, returns, options = {}) + # @example attach function with an explicit name + # module Bar + # extend FFI::Library + # ffi_lib FFI::Library::LIBC + # attach_function :c_malloc, :malloc, [:size_t], :pointer + # end + # # now callable via Bar.c_malloc + # + # Attach C function +func+ to this module. + # + # + # @param [#to_s] name name of ruby method to attach as + # @param [#to_s] func name of C function to attach + # @param [Array<Symbol>] args an array of types + # @param [Symbol] returns type of return value + # @option options [Boolean] :blocking (@blocking) set to true if the C function is a blocking call + # @option options [Symbol] :convention (:default) calling convention (see {#ffi_convention}) + # @option options [FFI::Enums] :enums + # @option options [Hash] :type_map + # + # @return [FFI::VariadicInvoker] + # + # @raise [FFI::NotFoundError] if +func+ cannot be found in the attached libraries (see {#ffi_lib}) + def attach_function(name, func, args, returns = nil, options = nil) + mname, a2, a3, a4, a5 = name, func, args, returns, options + cname, arg_types, ret_type, opts = (a4 && (a2.is_a?(String) || a2.is_a?(Symbol))) ? [ a2, a3, a4, a5 ] : [ mname.to_s, a2, a3, a4 ] + + # Convert :foo to the native type + arg_types = arg_types.map { |e| find_type(e) } + options = { + :convention => ffi_convention, + :type_map => defined?(@ffi_typedefs) ? @ffi_typedefs : nil, + :blocking => defined?(@blocking) && @blocking, + :enums => defined?(@ffi_enums) ? @ffi_enums : nil, + } + + @blocking = false + options.merge!(opts) if opts && opts.is_a?(Hash) + + # Try to locate the function in any of the libraries + invokers = [] + ffi_libraries.each do |lib| + if invokers.empty? + begin + function = nil + function_names(cname, arg_types).find do |fname| + function = lib.find_function(fname) + end + raise LoadError unless function + + invokers << if arg_types.length > 0 && arg_types[arg_types.length - 1] == FFI::NativeType::VARARGS + VariadicInvoker.new(function, arg_types, find_type(ret_type), options) + + else + Function.new(find_type(ret_type), arg_types, function, options) + end + + rescue LoadError + end + end + end + invoker = invokers.compact.shift + raise FFI::NotFoundError.new(cname.to_s, ffi_libraries.map { |lib| lib.name }) unless invoker + + invoker.attach(self, mname.to_s) + invoker + end + + # @param [#to_s] name function name + # @param [Array] arg_types function's argument types + # @return [Array<String>] + # This function returns a list of possible names to lookup. + # @note Function names on windows may be decorated if they are using stdcall. See + # * http://en.wikipedia.org/wiki/Name_mangling#C_name_decoration_in_Microsoft_Windows + # * http://msdn.microsoft.com/en-us/library/zxk0tw93%28v=VS.100%29.aspx + # * http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#STDCALL + # Note that decorated names can be overridden via def files. Also note that the + # windows api, although using, doesn't have decorated names. + def function_names(name, arg_types) + result = [name.to_s] + if ffi_convention == :stdcall + # Get the size of each parameter + size = arg_types.inject(0) do |mem, arg| + size = arg.size + # The size must be a multiple of 4 + size += (4 - size) % 4 + mem + size + end + + result << "_#{name.to_s}@#{size}" # win32 + result << "#{name.to_s}@#{size}" # win64 + end + result + end + + # @overload attach_variable(mname, cname, type) + # @param [#to_s] mname name of ruby method to attach as + # @param [#to_s] cname name of C variable to attach + # @param [DataConverter, Struct, Symbol, Type] type C variable's type + # @example + # module Bar + # extend FFI::Library + # ffi_lib 'my_lib' + # attach_variable :c_myvar, :myvar, :long + # end + # # now callable via Bar.c_myvar + # @overload attach_variable(cname, type) + # @param [#to_s] mname name of ruby method to attach as + # @param [DataConverter, Struct, Symbol, Type] type C variable's type + # @example + # module Bar + # extend FFI::Library + # ffi_lib 'my_lib' + # attach_variable :myvar, :long + # end + # # now callable via Bar.myvar + # @return [DynamicLibrary::Symbol] + # @raise {FFI::NotFoundError} if +cname+ cannot be found in libraries + # + # Attach C variable +cname+ to this module. + def attach_variable(mname, a1, a2 = nil) + cname, type = a2 ? [ a1, a2 ] : [ mname.to_s, a1 ] + address = nil + ffi_libraries.each do |lib| + begin + address = lib.find_variable(cname.to_s) + break unless address.nil? + rescue LoadError + end + end + + raise FFI::NotFoundError.new(cname, ffi_libraries) if address.nil? || address.null? + if type.is_a?(Class) && type < FFI::Struct + # If it is a global struct, just attach directly to the pointer + s = s = type.new(address) # Assigning twice to suppress unused variable warning + self.module_eval <<-code, __FILE__, __LINE__ + @@ffi_gvar_#{mname} = s + def self.#{mname} + @@ffi_gvar_#{mname} + end + code + + else + sc = Class.new(FFI::Struct) + sc.layout :gvar, find_type(type) + s = sc.new(address) + # + # Attach to this module as mname/mname= + # + self.module_eval <<-code, __FILE__, __LINE__ + @@ffi_gvar_#{mname} = s + def self.#{mname} + @@ffi_gvar_#{mname}[:gvar] + end + def self.#{mname}=(value) + @@ffi_gvar_#{mname}[:gvar] = value + end + code + + end + + address + end + + + # @overload callback(name, params, ret) + # @param name callback name to add to type map + # @param [Array] params array of parameters' types + # @param [DataConverter, Struct, Symbol, Type] ret callback return type + # @overload callback(params, ret) + # @param [Array] params array of parameters' types + # @param [DataConverter, Struct, Symbol, Type] ret callback return type + # @return [FFI::CallbackInfo] + def callback(*args) + raise ArgumentError, "wrong number of arguments" if args.length < 2 || args.length > 3 + name, params, ret = if args.length == 3 + args + else + [ nil, args[0], args[1] ] + end + + native_params = params.map { |e| find_type(e) } + raise ArgumentError, "callbacks cannot have variadic parameters" if native_params.include?(FFI::Type::VARARGS) + options = Hash.new + options[:convention] = ffi_convention + options[:enums] = @ffi_enums if defined?(@ffi_enums) + ret_type = find_type(ret) + if ret_type == Type::STRING + raise TypeError, ":string is not allowed as return type of callbacks" + end + cb = FFI::CallbackInfo.new(ret_type, native_params, options) + + # Add to the symbol -> type map (unless there was no name) + unless name.nil? + typedef cb, name + end + + cb + end + + # Register or get an already registered type definition. + # + # To register a new type definition, +old+ should be a {FFI::Type}. +add+ + # is in this case the type definition. + # + # If +old+ is a {DataConverter}, a {Type::Mapped} is returned. + # + # If +old+ is +:enum+ + # * and +add+ is an +Array+, a call to {#enum} is made with +add+ as single parameter; + # * in others cases, +info+ is used to create a named enum. + # + # If +old+ is a key for type map, #typedef get +old+ type definition. + # + # @param [DataConverter, Symbol, Type] old + # @param [Symbol] add + # @param [Symbol] info + # @return [FFI::Enum, FFI::Type] + def typedef(old, add, info=nil) + @ffi_typedefs = Hash.new unless defined?(@ffi_typedefs) + + @ffi_typedefs[add] = if old.kind_of?(FFI::Type) + old + + elsif @ffi_typedefs.has_key?(old) + @ffi_typedefs[old] + + elsif old.is_a?(DataConverter) + FFI::Type::Mapped.new(old) + + elsif old == :enum + if add.kind_of?(Array) + self.enum(add) + else + self.enum(info, add) + end + + else + FFI.find_type(old) + end + end + + private + # Generic enum builder + # @param [Class] klass can be one of FFI::Enum or FFI::Bitmask + # @param args (see #enum or #bitmask) + def generic_enum(klass, *args) + native_type = args.first.kind_of?(FFI::Type) ? args.shift : nil + name, values = if args[0].kind_of?(Symbol) && args[1].kind_of?(Array) + [ args[0], args[1] ] + elsif args[0].kind_of?(Array) + [ nil, args[0] ] + else + [ nil, args ] + end + @ffi_enums = FFI::Enums.new unless defined?(@ffi_enums) + @ffi_enums << (e = native_type ? klass.new(native_type, values, name) : klass.new(values, name)) + + # If called with a name, add a typedef alias + typedef(e, name) if name + e + end + + public + # @overload enum(name, values) + # Create a named enum. + # @example + # enum :foo, [:zero, :one, :two] # named enum + # @param [Symbol] name name for new enum + # @param [Array] values values for enum + # @overload enum(*args) + # Create an unnamed enum. + # @example + # enum :zero, :one, :two # unnamed enum + # @param args values for enum + # @overload enum(values) + # Create an unnamed enum. + # @example + # enum [:zero, :one, :two] # unnamed enum, equivalent to above example + # @param [Array] values values for enum + # @overload enum(native_type, name, values) + # Create a named enum and specify the native type. + # @example + # enum FFI::Type::UINT64, :foo, [:zero, :one, :two] # named enum + # @param [FFI::Type] native_type native type for new enum + # @param [Symbol] name name for new enum + # @param [Array] values values for enum + # @overload enum(native_type, *args) + # Create an unnamed enum and specify the native type. + # @example + # enum FFI::Type::UINT64, :zero, :one, :two # unnamed enum + # @param [FFI::Type] native_type native type for new enum + # @param args values for enum + # @overload enum(native_type, values) + # Create an unnamed enum and specify the native type. + # @example + # enum Type::UINT64, [:zero, :one, :two] # unnamed enum, equivalent to above example + # @param [FFI::Type] native_type native type for new enum + # @param [Array] values values for enum + # @return [FFI::Enum] + # Create a new {FFI::Enum}. + def enum(*args) + generic_enum(FFI::Enum, *args) + end + + # @overload bitmask(name, values) + # Create a named bitmask + # @example + # bitmask :foo, [:red, :green, :blue] # bits 0,1,2 are used + # bitmask :foo, [:red, :green, 5, :blue] # bits 0,5,6 are used + # @param [Symbol] name for new bitmask + # @param [Array<Symbol, Integer>] values for new bitmask + # @overload bitmask(*args) + # Create an unamed bitmask + # @example + # bm = bitmask :red, :green, :blue # bits 0,1,2 are used + # bm = bitmask :red, :green, 5, blue # bits 0,5,6 are used + # @param [Symbol, Integer] args values for new bitmask + # @overload bitmask(values) + # Create an unamed bitmask + # @example + # bm = bitmask [:red, :green, :blue] # bits 0,1,2 are used + # bm = bitmask [:red, :green, 5, blue] # bits 0,5,6 are used + # @param [Array<Symbol, Integer>] values for new bitmask + # @overload bitmask(native_type, name, values) + # Create a named enum and specify the native type. + # @example + # bitmask FFI::Type::UINT64, :foo, [:red, :green, :blue] + # @param [FFI::Type] native_type native type for new bitmask + # @param [Symbol] name for new bitmask + # @param [Array<Symbol, Integer>] values for new bitmask + # @overload bitmask(native_type, *args) + # @example + # bitmask FFI::Type::UINT64, :red, :green, :blue + # @param [FFI::Type] native_type native type for new bitmask + # @param [Symbol, Integer] args values for new bitmask + # @overload bitmask(native_type, values) + # Create a named enum and specify the native type. + # @example + # bitmask FFI::Type::UINT64, [:red, :green, :blue] + # @param [FFI::Type] native_type native type for new bitmask + # @param [Array<Symbol, Integer>] values for new bitmask + # @return [FFI::Bitmask] + # Create a new FFI::Bitmask + def bitmask(*args) + generic_enum(FFI::Bitmask, *args) + end + + # @param name + # @return [FFI::Enum] + # Find an enum by name. + def enum_type(name) + @ffi_enums.find(name) if defined?(@ffi_enums) + end + + # @param symbol + # @return [FFI::Enum] + # Find an enum by a symbol it contains. + def enum_value(symbol) + @ffi_enums.__map_symbol(symbol) + end + + # @param [DataConverter, Type, Struct, Symbol] t type to find + # @return [Type] + # Find a type definition. + def find_type(t) + if t.kind_of?(Type) + t + + elsif defined?(@ffi_typedefs) && @ffi_typedefs.has_key?(t) + @ffi_typedefs[t] + + elsif t.is_a?(Class) && t < Struct + Type::POINTER + + elsif t.is_a?(DataConverter) + # Add a typedef so next time the converter is used, it hits the cache + typedef Type::Mapped.new(t), t + + end || FFI.find_type(t) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/managedstruct.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/managedstruct.rb new file mode 100644 index 000000000000..b5ec8a379769 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/managedstruct.rb @@ -0,0 +1,84 @@ +# Copyright (C) 2008 Mike Dalessio +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +module FFI + # + # FFI::ManagedStruct allows custom garbage-collection of your FFI::Structs. + # + # The typical use case would be when interacting with a library + # that has a nontrivial memory management design, such as a linked + # list or a binary tree. + # + # When the {Struct} instance is garbage collected, FFI::ManagedStruct will + # invoke the class's release() method during object finalization. + # + # @example Example usage: + # module MyLibrary + # ffi_lib "libmylibrary" + # attach_function :new_dlist, [], :pointer + # attach_function :destroy_dlist, [:pointer], :void + # end + # + # class DoublyLinkedList < FFI::ManagedStruct + # @@@ + # struct do |s| + # s.name 'struct dlist' + # s.include 'dlist.h' + # s.field :head, :pointer + # s.field :tail, :pointer + # end + # @@@ + # + # def self.release ptr + # MyLibrary.destroy_dlist(ptr) + # end + # end + # + # begin + # ptr = DoublyLinkedList.new(MyLibrary.new_dlist) + # # do something with the list + # end + # # struct is out of scope, and will be GC'd using DoublyLinkedList#release + # + # + class ManagedStruct < FFI::Struct + + # @overload initialize(pointer) + # @param [Pointer] pointer + # Create a new ManagedStruct which will invoke the class method #release on + # @overload initialize + # A new instance of FFI::ManagedStruct. + def initialize(pointer=nil) + raise NoMethodError, "release() not implemented for class #{self}" unless self.class.respond_to? :release + raise ArgumentError, "Must supply a pointer to memory for the Struct" unless pointer + super AutoPointer.new(pointer, self.class.method(:release)) + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/memorypointer.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/memorypointer.rb new file mode 100644 index 000000000000..9f07bc69595d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/memorypointer.rb @@ -0,0 +1 @@ +# This class is now implemented in C diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform.rb new file mode 100644 index 000000000000..0f0639e48f19 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform.rb @@ -0,0 +1,188 @@ +# +# Copyright (C) 2008, 2009 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.# + +require 'rbconfig' +module FFI + class PlatformError < LoadError; end + + # This module defines different constants and class methods to play with + # various platforms. + module Platform + OS = case RbConfig::CONFIG['host_os'].downcase + when /linux/ + "linux" + when /darwin/ + "darwin" + when /freebsd/ + "freebsd" + when /netbsd/ + "netbsd" + when /openbsd/ + "openbsd" + when /dragonfly/ + "dragonflybsd" + when /sunos|solaris/ + "solaris" + when /mingw|mswin/ + "windows" + else + RbConfig::CONFIG['host_os'].downcase + end + + OSVERSION = RbConfig::CONFIG['host_os'].gsub(/[^\d]/, '').to_i + + CPU = RbConfig::CONFIG['host_cpu'] + + ARCH = case CPU.downcase + when /amd64|x86_64|x64/ + "x86_64" + when /i\d86|x86|i86pc/ + "i386" + when /ppc64|powerpc64/ + "powerpc64" + when /ppc|powerpc/ + "powerpc" + when /sparcv9|sparc64/ + "sparcv9" + when /arm64|aarch64/ # MacOS calls it "arm64", other operating systems "aarch64" + "aarch64" + when /^arm/ + if OS == "darwin" # Ruby before 3.0 reports "arm" instead of "arm64" as host_cpu on darwin + "aarch64" + else + "arm" + end + else + RbConfig::CONFIG['host_cpu'] + end + + private + # @param [String) os + # @return [Boolean] + # Test if current OS is +os+. + def self.is_os(os) + OS == os + end + + IS_GNU = defined?(GNU_LIBC) + IS_LINUX = is_os("linux") + IS_MAC = is_os("darwin") + IS_FREEBSD = is_os("freebsd") + IS_NETBSD = is_os("netbsd") + IS_OPENBSD = is_os("openbsd") + IS_DRAGONFLYBSD = is_os("dragonfly") + IS_SOLARIS = is_os("solaris") + IS_WINDOWS = is_os("windows") + IS_BSD = IS_MAC || IS_FREEBSD || IS_NETBSD || IS_OPENBSD || IS_DRAGONFLYBSD + + # Add the version for known ABI breaks + name_version = "12" if IS_FREEBSD && OSVERSION >= 12 # 64-bit inodes + + NAME = "#{ARCH}-#{OS}#{name_version}" + CONF_DIR = File.join(File.dirname(__FILE__), 'platform', NAME) + + public + + LIBPREFIX = case OS + when /windows|msys/ + '' + when /cygwin/ + 'cyg' + else + 'lib' + end + + LIBSUFFIX = case OS + when /darwin/ + 'dylib' + when /linux|bsd|solaris/ + 'so' + when /windows|cygwin|msys/ + 'dll' + else + # Punt and just assume a sane unix (i.e. anything but AIX) + 'so' + end + + LIBC = if IS_WINDOWS + if RbConfig::CONFIG['host_os'] =~ /mingw/i + RbConfig::CONFIG['RUBY_SO_NAME'].split('-')[-2] + '.dll' + else + "ucrtbase.dll" + end + elsif IS_GNU + GNU_LIBC + elsif OS == 'cygwin' + "cygwin1.dll" + elsif OS == 'msys' + # Not sure how msys 1.0 behaves, tested on MSYS2. + "msys-2.0.dll" + else + "#{LIBPREFIX}c.#{LIBSUFFIX}" + end + + LITTLE_ENDIAN = 1234 unless defined?(LITTLE_ENDIAN) + BIG_ENDIAN = 4321 unless defined?(BIG_ENDIAN) + unless defined?(BYTE_ORDER) + BYTE_ORDER = [0x12345678].pack("I") == [0x12345678].pack("N") ? BIG_ENDIAN : LITTLE_ENDIAN + end + + # Test if current OS is a *BSD (include MAC) + # @return [Boolean] + def self.bsd? + IS_BSD + end + + # Test if current OS is Windows + # @return [Boolean] + def self.windows? + IS_WINDOWS + end + + # Test if current OS is Mac OS + # @return [Boolean] + def self.mac? + IS_MAC + end + + # Test if current OS is Solaris (Sun OS) + # @return [Boolean] + def self.solaris? + IS_SOLARIS + end + + # Test if current OS is a unix OS + # @return [Boolean] + def self.unix? + !IS_WINDOWS + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-darwin/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-darwin/types.conf new file mode 100644 index 000000000000..68841bb1d42f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-darwin/types.conf @@ -0,0 +1,130 @@ +rbx.platform.typedef.__darwin_blkcnt_t = long_long +rbx.platform.typedef.__darwin_blksize_t = int +rbx.platform.typedef.__darwin_clock_t = ulong +rbx.platform.typedef.__darwin_ct_rune_t = int +rbx.platform.typedef.__darwin_dev_t = int +rbx.platform.typedef.__darwin_fsblkcnt_t = uint +rbx.platform.typedef.__darwin_fsfilcnt_t = uint +rbx.platform.typedef.__darwin_gid_t = uint +rbx.platform.typedef.__darwin_id_t = uint +rbx.platform.typedef.__darwin_ino64_t = ulong_long +rbx.platform.typedef.__darwin_ino_t = ulong_long +rbx.platform.typedef.__darwin_intptr_t = long +rbx.platform.typedef.__darwin_mach_port_name_t = uint +rbx.platform.typedef.__darwin_mach_port_t = uint +rbx.platform.typedef.__darwin_mode_t = ushort +rbx.platform.typedef.__darwin_natural_t = uint +rbx.platform.typedef.__darwin_off_t = long_long +rbx.platform.typedef.__darwin_pid_t = int +rbx.platform.typedef.__darwin_pthread_key_t = ulong +rbx.platform.typedef.__darwin_ptrdiff_t = long +rbx.platform.typedef.__darwin_rune_t = int +rbx.platform.typedef.__darwin_sigset_t = uint +rbx.platform.typedef.__darwin_size_t = ulong +rbx.platform.typedef.__darwin_socklen_t = uint +rbx.platform.typedef.__darwin_ssize_t = long +rbx.platform.typedef.__darwin_suseconds_t = int +rbx.platform.typedef.__darwin_time_t = long +rbx.platform.typedef.__darwin_uid_t = uint +rbx.platform.typedef.__darwin_useconds_t = uint +rbx.platform.typedef.__darwin_uuid_string_t[37] = char +rbx.platform.typedef.__darwin_uuid_t[16] = uchar +rbx.platform.typedef.__darwin_wchar_t = int +rbx.platform.typedef.__darwin_wint_t = int +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.errno_t = int +rbx.platform.typedef.fd_mask = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = uint +rbx.platform.typedef.fsfilcnt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = short +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = ulong +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long_long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.rsize_t = ulong +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.sae_associd_t = uint +rbx.platform.typedef.sae_connid_t = uint +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.syscall_arg_t = ulong_long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = ushort +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.user_addr_t = ulong_long +rbx.platform.typedef.user_long_t = long_long +rbx.platform.typedef.user_off_t = long_long +rbx.platform.typedef.user_size_t = ulong_long +rbx.platform.typedef.user_ssize_t = long_long +rbx.platform.typedef.user_time_t = long_long +rbx.platform.typedef.user_ulong_t = ulong_long +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.wchar_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-freebsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-freebsd/types.conf new file mode 100644 index 000000000000..8255343fb26f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-freebsd/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fd_mask = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = long_long +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long_long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-freebsd12/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-freebsd12/types.conf new file mode 100644 index 000000000000..c29693226508 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-freebsd12/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = ulong_long +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong_long +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = long_long +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long_long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-linux/types.conf new file mode 100644 index 000000000000..4cd24385bbd9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-openbsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-openbsd/types.conf new file mode 100644 index 000000000000..6abc9c09a826 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/aarch64-openbsd/types.conf @@ -0,0 +1,134 @@ +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__clock_t = long_long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fd_mask = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = ulong_long +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = long +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = long_long +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = long_long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.sigset_t = uint +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = long_long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/arm-freebsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/arm-freebsd/types.conf new file mode 100644 index 000000000000..cfbb90f32389 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/arm-freebsd/types.conf @@ -0,0 +1,152 @@ + +rbx.platform.typedef.*) = pointer +rbx.platform.typedef.__accmode_t = int +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__blksize_t = uint +rbx.platform.typedef.__clock_t = ulong +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpulevel_t = int +rbx.platform.typedef.__cpumask_t = uint +rbx.platform.typedef.__cpusetid_t = int +rbx.platform.typedef.__cpuwhich_t = int +rbx.platform.typedef.__critical_t = int +rbx.platform.typedef.__ct_rune_t = int +rbx.platform.typedef.__dev_t = uint +rbx.platform.typedef.__fd_mask = ulong +rbx.platform.typedef.__fflags_t = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = long_long +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intfptr_t = int +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__lwpid_t = int +rbx.platform.typedef.__mode_t = ushort +rbx.platform.typedef.__nl_item = int +rbx.platform.typedef.__nlink_t = ushort +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__ptrdiff_t = int +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__rlim_t = long_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = uint +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__u_register_t = uint +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintfptr_t = uint +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vm_offset_t = uint +rbx.platform.typedef.__vm_ooffset_t = long_long +rbx.platform.typedef.__vm_paddr_t = uint +rbx.platform.typedef.__vm_pindex_t = ulong_long +rbx.platform.typedef.__vm_size_t = uint +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.accmode_t = int +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = uint +rbx.platform.typedef.c_caddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpulevel_t = int +rbx.platform.typedef.cpumask_t = uint +rbx.platform.typedef.cpusetid_t = int +rbx.platform.typedef.cpuwhich_t = int +rbx.platform.typedef.critical_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.fd_mask = ulong +rbx.platform.typedef.fflags_t = uint +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = long_long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.key_t = long +rbx.platform.typedef.lwpid_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = long_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_register_t = uint +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vm_offset_t = uint +rbx.platform.typedef.vm_ooffset_t = long_long +rbx.platform.typedef.vm_paddr_t = uint +rbx.platform.typedef.vm_pindex_t = ulong_long +rbx.platform.typedef.vm_size_t = uint diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/arm-freebsd12/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/arm-freebsd12/types.conf new file mode 100644 index 000000000000..523370d99a84 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/arm-freebsd12/types.conf @@ -0,0 +1,152 @@ + +rbx.platform.typedef.*) = pointer +rbx.platform.typedef.__accmode_t = int +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__blksize_t = uint +rbx.platform.typedef.__clock_t = ulong +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpulevel_t = int +rbx.platform.typedef.__cpumask_t = uint +rbx.platform.typedef.__cpusetid_t = int +rbx.platform.typedef.__cpuwhich_t = int +rbx.platform.typedef.__critical_t = int +rbx.platform.typedef.__ct_rune_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = ulong +rbx.platform.typedef.__fflags_t = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = long_long +rbx.platform.typedef.__ino_t = ulong_long +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intfptr_t = int +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__lwpid_t = int +rbx.platform.typedef.__mode_t = ushort +rbx.platform.typedef.__nl_item = int +rbx.platform.typedef.__nlink_t = ulong_long +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__ptrdiff_t = int +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__rlim_t = long_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = uint +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__u_register_t = uint +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintfptr_t = uint +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vm_offset_t = uint +rbx.platform.typedef.__vm_ooffset_t = long_long +rbx.platform.typedef.__vm_paddr_t = uint +rbx.platform.typedef.__vm_pindex_t = ulong_long +rbx.platform.typedef.__vm_size_t = uint +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.accmode_t = int +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = uint +rbx.platform.typedef.c_caddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpulevel_t = int +rbx.platform.typedef.cpumask_t = uint +rbx.platform.typedef.cpusetid_t = int +rbx.platform.typedef.cpuwhich_t = int +rbx.platform.typedef.critical_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = ulong +rbx.platform.typedef.fflags_t = uint +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = long_long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.key_t = long +rbx.platform.typedef.lwpid_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ulong_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = long_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_register_t = uint +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vm_offset_t = uint +rbx.platform.typedef.vm_ooffset_t = long_long +rbx.platform.typedef.vm_paddr_t = uint +rbx.platform.typedef.vm_pindex_t = ulong_long +rbx.platform.typedef.vm_size_t = uint diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/arm-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/arm-linux/types.conf new file mode 100644 index 000000000000..a070d39446a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/arm-linux/types.conf @@ -0,0 +1,132 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = int +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.wchar_t = uint diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-cygwin/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-cygwin/types.conf new file mode 100644 index 000000000000..93f6b86122dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-cygwin/types.conf @@ -0,0 +1,3 @@ +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ssize_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-darwin/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-darwin/types.conf new file mode 100644 index 000000000000..ae100f415bfb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-darwin/types.conf @@ -0,0 +1,100 @@ +rbx.platform.typedef.__darwin_blkcnt_t = long_long +rbx.platform.typedef.__darwin_blksize_t = int +rbx.platform.typedef.__darwin_clock_t = ulong +rbx.platform.typedef.__darwin_ct_rune_t = int +rbx.platform.typedef.__darwin_dev_t = int +rbx.platform.typedef.__darwin_fsblkcnt_t = uint +rbx.platform.typedef.__darwin_fsfilcnt_t = uint +rbx.platform.typedef.__darwin_gid_t = uint +rbx.platform.typedef.__darwin_id_t = uint +rbx.platform.typedef.__darwin_ino64_t = ulong_long +rbx.platform.typedef.__darwin_ino_t = ulong_long +rbx.platform.typedef.__darwin_intptr_t = long +rbx.platform.typedef.__darwin_mach_port_name_t = uint +rbx.platform.typedef.__darwin_mach_port_t = uint +rbx.platform.typedef.__darwin_mode_t = ushort +rbx.platform.typedef.__darwin_natural_t = uint +rbx.platform.typedef.__darwin_off_t = long_long +rbx.platform.typedef.__darwin_pid_t = int +rbx.platform.typedef.__darwin_pthread_key_t = ulong +rbx.platform.typedef.__darwin_ptrdiff_t = int +rbx.platform.typedef.__darwin_rune_t = int +rbx.platform.typedef.__darwin_sigset_t = uint +rbx.platform.typedef.__darwin_size_t = ulong +rbx.platform.typedef.__darwin_socklen_t = uint +rbx.platform.typedef.__darwin_ssize_t = long +rbx.platform.typedef.__darwin_suseconds_t = int +rbx.platform.typedef.__darwin_time_t = long +rbx.platform.typedef.__darwin_uid_t = uint +rbx.platform.typedef.__darwin_useconds_t = uint +rbx.platform.typedef.__darwin_uuid_t[16] = uchar +rbx.platform.typedef.__darwin_wchar_t = int +rbx.platform.typedef.__darwin_wint_t = int +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fd_mask = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = uint +rbx.platform.typedef.fsfilcnt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.syscall_arg_t = ulong_long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.user_addr_t = ulong_long +rbx.platform.typedef.user_long_t = long_long +rbx.platform.typedef.user_size_t = ulong_long +rbx.platform.typedef.user_ssize_t = long_long +rbx.platform.typedef.user_time_t = long_long +rbx.platform.typedef.user_ulong_t = ulong_long +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-freebsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-freebsd/types.conf new file mode 100644 index 000000000000..6c882d48c88e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-freebsd/types.conf @@ -0,0 +1,152 @@ + +rbx.platform.typedef.*) = pointer +rbx.platform.typedef.__accmode_t = int +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__blksize_t = uint +rbx.platform.typedef.__clock_t = ulong +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpulevel_t = int +rbx.platform.typedef.__cpumask_t = uint +rbx.platform.typedef.__cpusetid_t = int +rbx.platform.typedef.__cpuwhich_t = int +rbx.platform.typedef.__critical_t = int +rbx.platform.typedef.__ct_rune_t = int +rbx.platform.typedef.__dev_t = uint +rbx.platform.typedef.__fd_mask = ulong +rbx.platform.typedef.__fflags_t = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = long_long +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intfptr_t = int +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__lwpid_t = int +rbx.platform.typedef.__mode_t = ushort +rbx.platform.typedef.__nl_item = int +rbx.platform.typedef.__nlink_t = ushort +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__ptrdiff_t = int +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__rlim_t = long_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = uint +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__u_register_t = uint +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintfptr_t = uint +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vm_offset_t = uint +rbx.platform.typedef.__vm_ooffset_t = long_long +rbx.platform.typedef.__vm_paddr_t = uint +rbx.platform.typedef.__vm_pindex_t = ulong_long +rbx.platform.typedef.__vm_size_t = uint +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.accmode_t = int +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = uint +rbx.platform.typedef.c_caddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpulevel_t = int +rbx.platform.typedef.cpumask_t = uint +rbx.platform.typedef.cpusetid_t = int +rbx.platform.typedef.cpuwhich_t = int +rbx.platform.typedef.critical_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.fd_mask = ulong +rbx.platform.typedef.fflags_t = uint +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = long_long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.key_t = long +rbx.platform.typedef.lwpid_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = long_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_register_t = uint +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vm_offset_t = uint +rbx.platform.typedef.vm_ooffset_t = long_long +rbx.platform.typedef.vm_paddr_t = uint +rbx.platform.typedef.vm_pindex_t = ulong_long +rbx.platform.typedef.vm_size_t = uint diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-freebsd12/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-freebsd12/types.conf new file mode 100644 index 000000000000..523370d99a84 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-freebsd12/types.conf @@ -0,0 +1,152 @@ + +rbx.platform.typedef.*) = pointer +rbx.platform.typedef.__accmode_t = int +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__blksize_t = uint +rbx.platform.typedef.__clock_t = ulong +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpulevel_t = int +rbx.platform.typedef.__cpumask_t = uint +rbx.platform.typedef.__cpusetid_t = int +rbx.platform.typedef.__cpuwhich_t = int +rbx.platform.typedef.__critical_t = int +rbx.platform.typedef.__ct_rune_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = ulong +rbx.platform.typedef.__fflags_t = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = long_long +rbx.platform.typedef.__ino_t = ulong_long +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intfptr_t = int +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__lwpid_t = int +rbx.platform.typedef.__mode_t = ushort +rbx.platform.typedef.__nl_item = int +rbx.platform.typedef.__nlink_t = ulong_long +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__ptrdiff_t = int +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__rlim_t = long_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = uint +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__u_register_t = uint +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintfptr_t = uint +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = uint +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vm_offset_t = uint +rbx.platform.typedef.__vm_ooffset_t = long_long +rbx.platform.typedef.__vm_paddr_t = uint +rbx.platform.typedef.__vm_pindex_t = ulong_long +rbx.platform.typedef.__vm_size_t = uint +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.accmode_t = int +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = uint +rbx.platform.typedef.c_caddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpulevel_t = int +rbx.platform.typedef.cpumask_t = uint +rbx.platform.typedef.cpusetid_t = int +rbx.platform.typedef.cpuwhich_t = int +rbx.platform.typedef.critical_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = ulong +rbx.platform.typedef.fflags_t = uint +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = long_long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.key_t = long +rbx.platform.typedef.lwpid_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ulong_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = long_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_register_t = uint +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vm_offset_t = uint +rbx.platform.typedef.vm_ooffset_t = long_long +rbx.platform.typedef.vm_paddr_t = uint +rbx.platform.typedef.vm_pindex_t = ulong_long +rbx.platform.typedef.vm_size_t = uint diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-gnu/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-gnu/types.conf new file mode 100644 index 000000000000..fa2fa8cef642 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-gnu/types.conf @@ -0,0 +1,107 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = uint +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsid_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__pthread_key = int +rbx.platform.typedef.__pthread_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__sigset_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.fsid_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.pthread_t = int +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.sigset_t = ulong +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-linux/types.conf new file mode 100644 index 000000000000..feb6bc47081a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-linux/types.conf @@ -0,0 +1,103 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-netbsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-netbsd/types.conf new file mode 100644 index 000000000000..a5aba8943891 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-netbsd/types.conf @@ -0,0 +1,126 @@ +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fd_mask = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-openbsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-openbsd/types.conf new file mode 100644 index 000000000000..15a0d61380f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-openbsd/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fd_mask = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-solaris/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-solaris/types.conf new file mode 100644 index 000000000000..22a2414e97e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-solaris/types.conf @@ -0,0 +1,122 @@ +rbx.platform.typedef.*caddr_t = char +rbx.platform.typedef.blkcnt64_t = long_long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.cpu_flag_t = ushort +rbx.platform.typedef.ctid_t = long +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.datalink_id_t = uint +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.diskaddr_t = ulong_long +rbx.platform.typedef.disp_lock_t = uchar +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fds_mask = long +rbx.platform.typedef.fsblkcnt64_t = ulong_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt64_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.hrtime_t = long_long +rbx.platform.typedef.id_t = long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.index_t = short +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.ipaddr_t = uint +rbx.platform.typedef.k_fltset_t = uint +rbx.platform.typedef.key_t = int +rbx.platform.typedef.len_t = ulong_long +rbx.platform.typedef.lgrp_id_t = long +rbx.platform.typedef.lock_t = uchar +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.major_t = ulong +rbx.platform.typedef.minor_t = ulong +rbx.platform.typedef.mode_t = ulong +rbx.platform.typedef.model_t = uint +rbx.platform.typedef.nfds_t = ulong +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.o_dev_t = short +rbx.platform.typedef.o_gid_t = ushort +rbx.platform.typedef.o_ino_t = ushort +rbx.platform.typedef.o_mode_t = ushort +rbx.platform.typedef.o_nlink_t = short +rbx.platform.typedef.o_pid_t = short +rbx.platform.typedef.o_uid_t = ushort +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.pad64_t = long_long +rbx.platform.typedef.pfn_t = ulong +rbx.platform.typedef.pgcnt_t = ulong +rbx.platform.typedef.pid_t = long +rbx.platform.typedef.poolid_t = long +rbx.platform.typedef.pri_t = short +rbx.platform.typedef.projid_t = long +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.rlim64_t = ulong_long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.spgcnt_t = long +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.sysid_t = short +rbx.platform.typedef.t_scalar_t = long +rbx.platform.typedef.t_uscalar_t = ulong +rbx.platform.typedef.taskid_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.u_offset_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.upad64_t = ulong_long +rbx.platform.typedef.use_t = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.zoneid_t = long diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-windows/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-windows/types.conf new file mode 100644 index 000000000000..a5d0b058e0a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/i386-windows/types.conf @@ -0,0 +1,52 @@ +rbx.platform.typedef.__time32_t = long +rbx.platform.typedef.__time64_t = long_long +rbx.platform.typedef._dev_t = uint +rbx.platform.typedef._ino_t = ushort +rbx.platform.typedef._mode_t = ushort +rbx.platform.typedef._off64_t = long_long +rbx.platform.typedef._off_t = long +rbx.platform.typedef._pid_t = int +rbx.platform.typedef._sigset_t = ulong +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.errno_t = int +rbx.platform.typedef.ino_t = ushort +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = short +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.off32_t = long +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.rsize_t = uint +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = ushort +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.wchar_t = ushort +rbx.platform.typedef.wctype_t = ushort +rbx.platform.typedef.wint_t = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/ia64-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/ia64-linux/types.conf new file mode 100644 index 000000000000..e0eeecc94612 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/ia64-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mips-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mips-linux/types.conf new file mode 100644 index 000000000000..24e82024023d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mips-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mips64-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mips64-linux/types.conf new file mode 100644 index 000000000000..b61f4f70dd13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mips64-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mips64el-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mips64el-linux/types.conf new file mode 100644 index 000000000000..b61f4f70dd13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mips64el-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsel-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsel-linux/types.conf new file mode 100644 index 000000000000..24e82024023d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsel-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa32r6-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa32r6-linux/types.conf new file mode 100644 index 000000000000..24e82024023d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa32r6-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa32r6el-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa32r6el-linux/types.conf new file mode 100644 index 000000000000..24e82024023d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa32r6el-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa64r6-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa64r6-linux/types.conf new file mode 100644 index 000000000000..b61f4f70dd13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa64r6-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa64r6el-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa64r6el-linux/types.conf new file mode 100644 index 000000000000..b61f4f70dd13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/mipsisa64r6el-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-aix/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-aix/types.conf new file mode 100644 index 000000000000..cbd20e78cf8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-aix/types.conf @@ -0,0 +1,180 @@ +rbx.platform.typedef.UTF32Char = uint +rbx.platform.typedef.UniChar = ushort +rbx.platform.typedef.__cptr32 = string +rbx.platform.typedef.__cptr64 = ulong_long +rbx.platform.typedef.__long32_t = long +rbx.platform.typedef.__long64_t = int +rbx.platform.typedef.__ptr32 = pointer +rbx.platform.typedef.__ptr64 = ulong_long +rbx.platform.typedef.__ulong32_t = ulong +rbx.platform.typedef.__ulong64_t = uint +rbx.platform.typedef.aptx_t = ushort +rbx.platform.typedef.blkcnt32_t = int +rbx.platform.typedef.blkcnt64_t = ulong_long +rbx.platform.typedef.blkcnt_t = int +rbx.platform.typedef.blksize32_t = int +rbx.platform.typedef.blksize64_t = ulong_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.boolean_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.chan_t = int +rbx.platform.typedef.class_id_t = uint +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = long_long +rbx.platform.typedef.cnt64_t = long_long +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.crid_t = int +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev32_t = uint +rbx.platform.typedef.dev64_t = ulong_long +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.esid_t = uint +rbx.platform.typedef.ext_t = int +rbx.platform.typedef.fpos64_t = long_long +rbx.platform.typedef.fpos_t = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino32_t = uint +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.int16 = short +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32 = int +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int32long64_t = int +rbx.platform.typedef.int64 = long_long +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8 = char +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = short +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intfast_t = int +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.krpn_t = int +rbx.platform.typedef.kvmhandle_t = ulong +rbx.platform.typedef.kvmid_t = long +rbx.platform.typedef.kvpn_t = int +rbx.platform.typedef.level_t = int +rbx.platform.typedef.liobn_t = uint +rbx.platform.typedef.long32int64_t = long +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.mid_t = pointer +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.mtyp_t = long +rbx.platform.typedef.nlink_t = short +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.off_t = long +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.paddr_t = long +rbx.platform.typedef.pdtx_t = int +rbx.platform.typedef.pid32_t = int +rbx.platform.typedef.pid64_t = ulong_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pshift_t = ushort +rbx.platform.typedef.psize_t = long_long +rbx.platform.typedef.psx_t = short +rbx.platform.typedef.ptex_t = ulong +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.rlim64_t = ulong_long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.rpn64_t = long_long +rbx.platform.typedef.rpn_t = int +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.signal_t = int +rbx.platform.typedef.size64_t = ulong_long +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.slab_t[12] = char +rbx.platform.typedef.snidx_t = int +rbx.platform.typedef.socklen_t = ulong +rbx.platform.typedef.soff_t = int +rbx.platform.typedef.sshift_t = ushort +rbx.platform.typedef.ssize64_t = long_long +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.swhatx_t = ulong +rbx.platform.typedef.tid32_t = int +rbx.platform.typedef.tid64_t = ulong_long +rbx.platform.typedef.tid_t = int +rbx.platform.typedef.time32_t = int +rbx.platform.typedef.time64_t = long_long +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer32_t = int +rbx.platform.typedef.timer64_t = long_long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16 = ushort +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32 = uint +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64 = ulong_long +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8 = uchar +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uchar = uchar +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint32long64_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = ushort +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.uintfast_t = uint +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ulong32int64_t = ulong +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.unidx_t = int +rbx.platform.typedef.unit_addr_t = ulong_long +rbx.platform.typedef.ureg_t = ulong +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.va_list = string +rbx.platform.typedef.vmfkey_t = uint +rbx.platform.typedef.vmhandle32_t = uint +rbx.platform.typedef.vmhandle_t = ulong +rbx.platform.typedef.vmhwkey_t = int +rbx.platform.typedef.vmid32_t = int +rbx.platform.typedef.vmid64_t = long_long +rbx.platform.typedef.vmid_t = long +rbx.platform.typedef.vmidx_t = int +rbx.platform.typedef.vmkey_t = int +rbx.platform.typedef.vmlpghandle_t = ulong +rbx.platform.typedef.vmm_lock_t = int +rbx.platform.typedef.vmnodeidx_t = int +rbx.platform.typedef.vmprkey_t = uint +rbx.platform.typedef.vmsize_t = int +rbx.platform.typedef.vpn_t = int +rbx.platform.typedef.wchar_t = ushort +rbx.platform.typedef.wctype_t = uint +rbx.platform.typedef.wint_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-darwin/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-darwin/types.conf new file mode 100644 index 000000000000..ae100f415bfb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-darwin/types.conf @@ -0,0 +1,100 @@ +rbx.platform.typedef.__darwin_blkcnt_t = long_long +rbx.platform.typedef.__darwin_blksize_t = int +rbx.platform.typedef.__darwin_clock_t = ulong +rbx.platform.typedef.__darwin_ct_rune_t = int +rbx.platform.typedef.__darwin_dev_t = int +rbx.platform.typedef.__darwin_fsblkcnt_t = uint +rbx.platform.typedef.__darwin_fsfilcnt_t = uint +rbx.platform.typedef.__darwin_gid_t = uint +rbx.platform.typedef.__darwin_id_t = uint +rbx.platform.typedef.__darwin_ino64_t = ulong_long +rbx.platform.typedef.__darwin_ino_t = ulong_long +rbx.platform.typedef.__darwin_intptr_t = long +rbx.platform.typedef.__darwin_mach_port_name_t = uint +rbx.platform.typedef.__darwin_mach_port_t = uint +rbx.platform.typedef.__darwin_mode_t = ushort +rbx.platform.typedef.__darwin_natural_t = uint +rbx.platform.typedef.__darwin_off_t = long_long +rbx.platform.typedef.__darwin_pid_t = int +rbx.platform.typedef.__darwin_pthread_key_t = ulong +rbx.platform.typedef.__darwin_ptrdiff_t = int +rbx.platform.typedef.__darwin_rune_t = int +rbx.platform.typedef.__darwin_sigset_t = uint +rbx.platform.typedef.__darwin_size_t = ulong +rbx.platform.typedef.__darwin_socklen_t = uint +rbx.platform.typedef.__darwin_ssize_t = long +rbx.platform.typedef.__darwin_suseconds_t = int +rbx.platform.typedef.__darwin_time_t = long +rbx.platform.typedef.__darwin_uid_t = uint +rbx.platform.typedef.__darwin_useconds_t = uint +rbx.platform.typedef.__darwin_uuid_t[16] = uchar +rbx.platform.typedef.__darwin_wchar_t = int +rbx.platform.typedef.__darwin_wint_t = int +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fd_mask = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = uint +rbx.platform.typedef.fsfilcnt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.syscall_arg_t = ulong_long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.user_addr_t = ulong_long +rbx.platform.typedef.user_long_t = long_long +rbx.platform.typedef.user_size_t = ulong_long +rbx.platform.typedef.user_ssize_t = long_long +rbx.platform.typedef.user_time_t = long_long +rbx.platform.typedef.user_ulong_t = ulong_long +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-linux/types.conf new file mode 100644 index 000000000000..42eec130449c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-linux/types.conf @@ -0,0 +1,130 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = int +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.wchar_t = long diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-openbsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-openbsd/types.conf new file mode 100644 index 000000000000..aea795511590 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc-openbsd/types.conf @@ -0,0 +1,156 @@ +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__clock_t = long_long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fd_mask = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = ulong_long +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = long +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = long_long +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = long_long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = int +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.sigset_t = uint +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = long_long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uint +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong +rbx.platform.typedef.wchar_t = int +rbx.platform.typedef.wint_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc64-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc64-linux/types.conf new file mode 100644 index 000000000000..b61f4f70dd13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc64-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc64le-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc64le-linux/types.conf new file mode 100644 index 000000000000..9ac9c2e57254 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/powerpc64le-linux/types.conf @@ -0,0 +1,100 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/riscv64-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/riscv64-linux/types.conf new file mode 100644 index 000000000000..ede0f985a537 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/riscv64-linux/types.conf @@ -0,0 +1,104 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/s390-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/s390-linux/types.conf new file mode 100644 index 000000000000..291b0326b76e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/s390-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/s390x-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/s390x-linux/types.conf new file mode 100644 index 000000000000..32a7feba647a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/s390x-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparc-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparc-linux/types.conf new file mode 100644 index 000000000000..aea09d32cdfc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparc-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long_long +rbx.platform.typedef.__blkcnt64_t = long_long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong_long +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong_long +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong_long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = int +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long_long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long_long +rbx.platform.typedef.__rlim64_t = ulong_long +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = int +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong_long +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong_long +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparc-solaris/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparc-solaris/types.conf new file mode 100644 index 000000000000..a1548e56ea53 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparc-solaris/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.() = pointer +rbx.platform.typedef.*caddr_t = char +rbx.platform.typedef.Psocklen_t = pointer +rbx.platform.typedef.avl_index_t = uint +rbx.platform.typedef.blkcnt64_t = long_long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.cpu_flag_t = ushort +rbx.platform.typedef.ctid_t = long +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.diskaddr_t = ulong_long +rbx.platform.typedef.disp_lock_t = uchar +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fds_mask = long +rbx.platform.typedef.fsblkcnt64_t = ulong_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt64_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = long +rbx.platform.typedef.hrtime_t = long_long +rbx.platform.typedef.id_t = long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.index_t = short +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int) = pointer +rbx.platform.typedef.int) = pointer +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.ipaddr_t = uint +rbx.platform.typedef.k_fltset_t = uint +rbx.platform.typedef.key_t = int +rbx.platform.typedef.kid_t = int +rbx.platform.typedef.len_t = ulong_long +rbx.platform.typedef.lock_t = uchar +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.major_t = ulong +rbx.platform.typedef.minor_t = ulong +rbx.platform.typedef.mode_t = ulong +rbx.platform.typedef.model_t = uint +rbx.platform.typedef.nfds_t = ulong +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.o_dev_t = short +rbx.platform.typedef.o_gid_t = ushort +rbx.platform.typedef.o_ino_t = ushort +rbx.platform.typedef.o_mode_t = ushort +rbx.platform.typedef.o_nlink_t = short +rbx.platform.typedef.o_pid_t = short +rbx.platform.typedef.o_uid_t = ushort +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.pad64_t = long_long +rbx.platform.typedef.pfn_t = ulong +rbx.platform.typedef.pgcnt_t = ulong +rbx.platform.typedef.pid_t = long +rbx.platform.typedef.poolid_t = long +rbx.platform.typedef.pri_t = short +rbx.platform.typedef.projid_t = long +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.rlim64_t = ulong_long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.size_t) = pointer +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.spgcnt_t = long +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.sysid_t = short +rbx.platform.typedef.t_scalar_t = long +rbx.platform.typedef.t_uscalar_t = ulong +rbx.platform.typedef.taskid_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.ts_t = long_long +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.u_offset_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.uid_t = long +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.upad64_t = ulong_long +rbx.platform.typedef.use_t = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.zoneid_t = long diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparc64-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparc64-linux/types.conf new file mode 100644 index 000000000000..7626bfce8498 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparc64-linux/types.conf @@ -0,0 +1,102 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.*__qaddr_t = long +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.__swblk_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparcv9-openbsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparcv9-openbsd/types.conf new file mode 100644 index 000000000000..aea795511590 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparcv9-openbsd/types.conf @@ -0,0 +1,156 @@ +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__clock_t = long_long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fd_mask = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = ulong_long +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = long +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = long_long +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = long_long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = int +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.sigset_t = uint +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = long_long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uint +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong +rbx.platform.typedef.wchar_t = int +rbx.platform.typedef.wint_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparcv9-solaris/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparcv9-solaris/types.conf new file mode 100644 index 000000000000..a1548e56ea53 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/sparcv9-solaris/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.() = pointer +rbx.platform.typedef.*caddr_t = char +rbx.platform.typedef.Psocklen_t = pointer +rbx.platform.typedef.avl_index_t = uint +rbx.platform.typedef.blkcnt64_t = long_long +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.cpu_flag_t = ushort +rbx.platform.typedef.ctid_t = long +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.diskaddr_t = ulong_long +rbx.platform.typedef.disp_lock_t = uchar +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fds_mask = long +rbx.platform.typedef.fsblkcnt64_t = ulong_long +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt64_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = long +rbx.platform.typedef.hrtime_t = long_long +rbx.platform.typedef.id_t = long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.index_t = short +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int) = pointer +rbx.platform.typedef.int) = pointer +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = int +rbx.platform.typedef.ipaddr_t = uint +rbx.platform.typedef.k_fltset_t = uint +rbx.platform.typedef.key_t = int +rbx.platform.typedef.kid_t = int +rbx.platform.typedef.len_t = ulong_long +rbx.platform.typedef.lock_t = uchar +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.major_t = ulong +rbx.platform.typedef.minor_t = ulong +rbx.platform.typedef.mode_t = ulong +rbx.platform.typedef.model_t = uint +rbx.platform.typedef.nfds_t = ulong +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.o_dev_t = short +rbx.platform.typedef.o_gid_t = ushort +rbx.platform.typedef.o_ino_t = ushort +rbx.platform.typedef.o_mode_t = ushort +rbx.platform.typedef.o_nlink_t = short +rbx.platform.typedef.o_pid_t = short +rbx.platform.typedef.o_uid_t = ushort +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.pad64_t = long_long +rbx.platform.typedef.pfn_t = ulong +rbx.platform.typedef.pgcnt_t = ulong +rbx.platform.typedef.pid_t = long +rbx.platform.typedef.poolid_t = long +rbx.platform.typedef.pri_t = short +rbx.platform.typedef.projid_t = long +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.ptrdiff_t = int +rbx.platform.typedef.rlim64_t = ulong_long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = uint +rbx.platform.typedef.size_t) = pointer +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.spgcnt_t = long +rbx.platform.typedef.ssize_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.sysid_t = short +rbx.platform.typedef.t_scalar_t = long +rbx.platform.typedef.t_uscalar_t = ulong +rbx.platform.typedef.taskid_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.ts_t = long_long +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.u_offset_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.uid_t = long +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = uint +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.upad64_t = ulong_long +rbx.platform.typedef.use_t = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.zoneid_t = long diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-cygwin/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-cygwin/types.conf new file mode 100644 index 000000000000..5bef6d707e5f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-cygwin/types.conf @@ -0,0 +1,3 @@ +rbx.platform.typedef.ptrdiff_t = int64 +rbx.platform.typedef.size_t = uint64 +rbx.platform.typedef.ssize_t = int64 diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-darwin/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-darwin/types.conf new file mode 100644 index 000000000000..68841bb1d42f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-darwin/types.conf @@ -0,0 +1,130 @@ +rbx.platform.typedef.__darwin_blkcnt_t = long_long +rbx.platform.typedef.__darwin_blksize_t = int +rbx.platform.typedef.__darwin_clock_t = ulong +rbx.platform.typedef.__darwin_ct_rune_t = int +rbx.platform.typedef.__darwin_dev_t = int +rbx.platform.typedef.__darwin_fsblkcnt_t = uint +rbx.platform.typedef.__darwin_fsfilcnt_t = uint +rbx.platform.typedef.__darwin_gid_t = uint +rbx.platform.typedef.__darwin_id_t = uint +rbx.platform.typedef.__darwin_ino64_t = ulong_long +rbx.platform.typedef.__darwin_ino_t = ulong_long +rbx.platform.typedef.__darwin_intptr_t = long +rbx.platform.typedef.__darwin_mach_port_name_t = uint +rbx.platform.typedef.__darwin_mach_port_t = uint +rbx.platform.typedef.__darwin_mode_t = ushort +rbx.platform.typedef.__darwin_natural_t = uint +rbx.platform.typedef.__darwin_off_t = long_long +rbx.platform.typedef.__darwin_pid_t = int +rbx.platform.typedef.__darwin_pthread_key_t = ulong +rbx.platform.typedef.__darwin_ptrdiff_t = long +rbx.platform.typedef.__darwin_rune_t = int +rbx.platform.typedef.__darwin_sigset_t = uint +rbx.platform.typedef.__darwin_size_t = ulong +rbx.platform.typedef.__darwin_socklen_t = uint +rbx.platform.typedef.__darwin_ssize_t = long +rbx.platform.typedef.__darwin_suseconds_t = int +rbx.platform.typedef.__darwin_time_t = long +rbx.platform.typedef.__darwin_uid_t = uint +rbx.platform.typedef.__darwin_useconds_t = uint +rbx.platform.typedef.__darwin_uuid_string_t[37] = char +rbx.platform.typedef.__darwin_uuid_t[16] = uchar +rbx.platform.typedef.__darwin_wchar_t = int +rbx.platform.typedef.__darwin_wint_t = int +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.errno_t = int +rbx.platform.typedef.fd_mask = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = uint +rbx.platform.typedef.fsfilcnt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino64_t = ulong_long +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = short +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = ulong +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long_long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.rsize_t = ulong +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.sae_associd_t = uint +rbx.platform.typedef.sae_connid_t = uint +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.syscall_arg_t = ulong_long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = ushort +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.user_addr_t = ulong_long +rbx.platform.typedef.user_long_t = long_long +rbx.platform.typedef.user_off_t = long_long +rbx.platform.typedef.user_size_t = ulong_long +rbx.platform.typedef.user_ssize_t = long_long +rbx.platform.typedef.user_time_t = long_long +rbx.platform.typedef.user_ulong_t = ulong_long +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.wchar_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-dragonflybsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-dragonflybsd/types.conf new file mode 100644 index 000000000000..889f6a323fc1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-dragonflybsd/types.conf @@ -0,0 +1,130 @@ +rbx.platform.typedef.*) = pointer +rbx.platform.typedef.___wchar_t = int +rbx.platform.typedef.__clock_t = ulong +rbx.platform.typedef.__clockid_t = ulong +rbx.platform.typedef.__fd_mask = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intlp_t = long +rbx.platform.typedef.__intmax_t = long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = long +rbx.platform.typedef.__rlim_t = long +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintlp_t = ulong +rbx.platform.typedef.__uintmax_t = ulong +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.c_caddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.clockid_t = ulong +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long +rbx.platform.typedef.int_fast8_t = int +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.lwpid_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = long +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_daddr_t = uint +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong +rbx.platform.typedef.uint_fast8_t = uint +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.v_caddr_t = pointer +rbx.platform.typedef.wchar_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-freebsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-freebsd/types.conf new file mode 100644 index 000000000000..8dbe370349fe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-freebsd/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fd_mask = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = long_long +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long_long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-freebsd12/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-freebsd12/types.conf new file mode 100644 index 000000000000..31b1073da908 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-freebsd12/types.conf @@ -0,0 +1,158 @@ +rbx.platform.typedef.*) = pointer +rbx.platform.typedef.___wchar_t = int +rbx.platform.typedef.__accmode_t = int +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__char16_t = ushort +rbx.platform.typedef.__char32_t = uint +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpulevel_t = int +rbx.platform.typedef.__cpusetid_t = int +rbx.platform.typedef.__cpuwhich_t = int +rbx.platform.typedef.__critical_t = long +rbx.platform.typedef.__ct_rune_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = ulong +rbx.platform.typedef.__fflags_t = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = long +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intfptr_t = long +rbx.platform.typedef.__intmax_t = long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__lwpid_t = int +rbx.platform.typedef.__mode_t = ushort +rbx.platform.typedef.__nl_item = int +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = long +rbx.platform.typedef.__rlim_t = long +rbx.platform.typedef.__rman_res_t = ulong +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = long +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__u_register_t = ulong +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintfptr_t = ulong +rbx.platform.typedef.__uintmax_t = ulong +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vm_offset_t = ulong +rbx.platform.typedef.__vm_paddr_t = ulong +rbx.platform.typedef.__vm_size_t = ulong +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.accmode_t = int +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.c_caddr_t = pointer +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.cap_ioctl_t = ulong +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpulevel_t = int +rbx.platform.typedef.cpusetid_t = int +rbx.platform.typedef.cpuwhich_t = int +rbx.platform.typedef.critical_t = long +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = ulong +rbx.platform.typedef.fflags_t = uint +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = long +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.ksize_t = ulong +rbx.platform.typedef.kvaddr_t = ulong +rbx.platform.typedef.lwpid_t = int +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off64_t = long +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = long +rbx.platform.typedef.rman_res_t = ulong +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.sbintime_t = long +rbx.platform.typedef.segsz_t = long +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_register_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vm_offset_t = ulong +rbx.platform.typedef.vm_ooffset_t = long +rbx.platform.typedef.vm_paddr_t = ulong +rbx.platform.typedef.vm_pindex_t = ulong +rbx.platform.typedef.vm_size_t = ulong diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-haiku/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-haiku/types.conf new file mode 100644 index 000000000000..d5ddfa79c824 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-haiku/types.conf @@ -0,0 +1,117 @@ +rbx.platform.typedef.__haiku_addr_t = ulong +rbx.platform.typedef.__haiku_generic_addr_t = ulong +rbx.platform.typedef.__haiku_int16 = short +rbx.platform.typedef.__haiku_int32 = int +rbx.platform.typedef.__haiku_int64 = long +rbx.platform.typedef.__haiku_int8 = char +rbx.platform.typedef.__haiku_phys_addr_t = ulong +rbx.platform.typedef.__haiku_phys_saddr_t = long +rbx.platform.typedef.__haiku_saddr_t = long +rbx.platform.typedef.__haiku_std_int16 = short +rbx.platform.typedef.__haiku_std_int32 = int +rbx.platform.typedef.__haiku_std_int64 = long +rbx.platform.typedef.__haiku_std_int8 = char +rbx.platform.typedef.__haiku_std_uint16 = ushort +rbx.platform.typedef.__haiku_std_uint32 = uint +rbx.platform.typedef.__haiku_std_uint64 = ulong +rbx.platform.typedef.__haiku_std_uint8 = uchar +rbx.platform.typedef.__haiku_uint16 = ushort +rbx.platform.typedef.__haiku_uint32 = uint +rbx.platform.typedef.__haiku_uint64 = ulong +rbx.platform.typedef.__haiku_uint8 = uchar +rbx.platform.typedef.addr_t = ulong +rbx.platform.typedef.bigtime_t = long +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = pointer +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cnt_t = int +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fd_mask = uint +rbx.platform.typedef.fsblkcnt_t = long +rbx.platform.typedef.fsfilcnt_t = long +rbx.platform.typedef.generic_addr_t = ulong +rbx.platform.typedef.generic_size_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = int +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = long +rbx.platform.typedef.int16 = short +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32 = int +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64 = long +rbx.platform.typedef.int64_t = long +rbx.platform.typedef.int8 = char +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long +rbx.platform.typedef.int_fast8_t = int +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nanotime_t = long +rbx.platform.typedef.nlink_t = int +rbx.platform.typedef.off_t = long +rbx.platform.typedef.perform_code = uint +rbx.platform.typedef.phys_addr_t = ulong +rbx.platform.typedef.phys_size_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = int +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.sig_atomic_t = int +rbx.platform.typedef.sigset_t = ulong +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.status_t = int +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.type_code = uint +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uchar = uchar +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16 = ushort +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32 = uint +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64 = ulong +rbx.platform.typedef.uint64_t = ulong +rbx.platform.typedef.uint8 = uchar +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong +rbx.platform.typedef.uint_fast8_t = uint +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.umode_t = uint +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.unichar = ushort +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.void*) = pointer +rbx.platform.typedef.wchar_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-linux/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-linux/types.conf new file mode 100644 index 000000000000..060f1617c75a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-linux/types.conf @@ -0,0 +1,132 @@ +rbx.platform.typedef.*__caddr_t = char +rbx.platform.typedef.__blkcnt64_t = long +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = long +rbx.platform.typedef.__clock_t = long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__daddr_t = int +rbx.platform.typedef.__dev_t = ulong +rbx.platform.typedef.__fd_mask = long +rbx.platform.typedef.__fsblkcnt64_t = ulong +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt64_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__fsword_t = long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino64_t = ulong +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__intmax_t = long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = int +rbx.platform.typedef.__loff_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = ulong +rbx.platform.typedef.__off64_t = long +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__priority_which_t = int +rbx.platform.typedef.__quad_t = long +rbx.platform.typedef.__rlim64_t = ulong +rbx.platform.typedef.__rlim_t = ulong +rbx.platform.typedef.__rlimit_resource_t = int +rbx.platform.typedef.__rusage_who_t = int +rbx.platform.typedef.__sig_atomic_t = int +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__syscall_slong_t = long +rbx.platform.typedef.__syscall_ulong_t = ulong +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = pointer +rbx.platform.typedef.__u_char = uchar +rbx.platform.typedef.__u_int = uint +rbx.platform.typedef.__u_long = ulong +rbx.platform.typedef.__u_quad_t = ulong +rbx.platform.typedef.__u_short = ushort +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = long +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = long +rbx.platform.typedef.int_fast32_t = long +rbx.platform.typedef.int_fast64_t = long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = int +rbx.platform.typedef.loff_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ulong +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_once_t = int +rbx.platform.typedef.pthread_t = ulong +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.quad_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = pointer +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = ulong +rbx.platform.typedef.uint_fast32_t = ulong +rbx.platform.typedef.uint_fast64_t = ulong +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.wchar_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-msys/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-msys/types.conf new file mode 100644 index 000000000000..aa827c00884c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-msys/types.conf @@ -0,0 +1,119 @@ +rbx.platform.typedef.*addr_t = char +rbx.platform.typedef.__ULong = uint +rbx.platform.typedef.__blkcnt_t = long +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__clock_t = ulong +rbx.platform.typedef.__clockid_t = ulong +rbx.platform.typedef.__cpu_mask = ulong +rbx.platform.typedef.__dev_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong +rbx.platform.typedef.__fsfilcnt_t = ulong +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__ino_t = ulong +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long_long +rbx.platform.typedef.__loff_t = long_long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nl_item = int +rbx.platform.typedef.__nlink_t = ushort +rbx.platform.typedef.__off_t = long +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__sigset_t = ulong +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = int +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__time_t = long +rbx.platform.typedef.__timer_t = ulong +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = ulong +rbx.platform.typedef._fpos64_t = long_long +rbx.platform.typedef._fpos_t = long +rbx.platform.typedef._off64_t = long_long +rbx.platform.typedef._off_t = long +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = ulong +rbx.platform.typedef.clockid_t = ulong +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.fd_mask = ulong +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = long +rbx.platform.typedef.int_fast32_t = long +rbx.platform.typedef.int_fast64_t = long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long_long +rbx.platform.typedef.loff_t = long_long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = ushort +rbx.platform.typedef.off_t = long +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sbintime_t = long +rbx.platform.typedef.sig_atomic_t = int +rbx.platform.typedef.sigset_t = ulong +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = int +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = ulong +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_register_t = ulong +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = ulong +rbx.platform.typedef.uint_fast32_t = ulong +rbx.platform.typedef.uint_fast64_t = ulong +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.useconds_t = ulong +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vm_offset_t = ulong +rbx.platform.typedef.vm_size_t = ulong +rbx.platform.typedef.wint_t = uint diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-netbsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-netbsd/types.conf new file mode 100644 index 000000000000..15a0d61380f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-netbsd/types.conf @@ -0,0 +1,128 @@ +rbx.platform.typedef.__clock_t = int +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fd_mask = int +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = uint +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = int +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = int +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = int +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = int +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr64_t = long_long +rbx.platform.typedef.daddr_t = int +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = uint +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = int +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = int +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = int +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-openbsd/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-openbsd/types.conf new file mode 100644 index 000000000000..6abc9c09a826 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-openbsd/types.conf @@ -0,0 +1,134 @@ +rbx.platform.typedef.__blkcnt_t = long_long +rbx.platform.typedef.__blksize_t = int +rbx.platform.typedef.__clock_t = long_long +rbx.platform.typedef.__clockid_t = int +rbx.platform.typedef.__cpuid_t = ulong +rbx.platform.typedef.__dev_t = int +rbx.platform.typedef.__fd_mask = uint +rbx.platform.typedef.__fixpt_t = uint +rbx.platform.typedef.__fsblkcnt_t = ulong_long +rbx.platform.typedef.__fsfilcnt_t = ulong_long +rbx.platform.typedef.__gid_t = uint +rbx.platform.typedef.__id_t = uint +rbx.platform.typedef.__in_addr_t = uint +rbx.platform.typedef.__in_port_t = ushort +rbx.platform.typedef.__ino_t = ulong_long +rbx.platform.typedef.__int16_t = short +rbx.platform.typedef.__int32_t = int +rbx.platform.typedef.__int64_t = long_long +rbx.platform.typedef.__int8_t = char +rbx.platform.typedef.__int_fast16_t = int +rbx.platform.typedef.__int_fast32_t = int +rbx.platform.typedef.__int_fast64_t = long_long +rbx.platform.typedef.__int_fast8_t = int +rbx.platform.typedef.__int_least16_t = short +rbx.platform.typedef.__int_least32_t = int +rbx.platform.typedef.__int_least64_t = long_long +rbx.platform.typedef.__int_least8_t = char +rbx.platform.typedef.__intmax_t = long_long +rbx.platform.typedef.__intptr_t = long +rbx.platform.typedef.__key_t = long +rbx.platform.typedef.__mode_t = uint +rbx.platform.typedef.__nlink_t = uint +rbx.platform.typedef.__off_t = long_long +rbx.platform.typedef.__paddr_t = ulong +rbx.platform.typedef.__pid_t = int +rbx.platform.typedef.__psize_t = ulong +rbx.platform.typedef.__ptrdiff_t = long +rbx.platform.typedef.__register_t = long +rbx.platform.typedef.__rlim_t = ulong_long +rbx.platform.typedef.__rune_t = int +rbx.platform.typedef.__sa_family_t = uchar +rbx.platform.typedef.__segsz_t = int +rbx.platform.typedef.__size_t = ulong +rbx.platform.typedef.__socklen_t = uint +rbx.platform.typedef.__ssize_t = long +rbx.platform.typedef.__suseconds_t = long +rbx.platform.typedef.__swblk_t = int +rbx.platform.typedef.__time_t = long_long +rbx.platform.typedef.__timer_t = int +rbx.platform.typedef.__uid_t = uint +rbx.platform.typedef.__uint16_t = ushort +rbx.platform.typedef.__uint32_t = uint +rbx.platform.typedef.__uint64_t = ulong_long +rbx.platform.typedef.__uint8_t = uchar +rbx.platform.typedef.__uint_fast16_t = uint +rbx.platform.typedef.__uint_fast32_t = uint +rbx.platform.typedef.__uint_fast64_t = ulong_long +rbx.platform.typedef.__uint_fast8_t = uint +rbx.platform.typedef.__uint_least16_t = ushort +rbx.platform.typedef.__uint_least32_t = uint +rbx.platform.typedef.__uint_least64_t = ulong_long +rbx.platform.typedef.__uint_least8_t = uchar +rbx.platform.typedef.__uintmax_t = ulong_long +rbx.platform.typedef.__uintptr_t = ulong +rbx.platform.typedef.__useconds_t = uint +rbx.platform.typedef.__vaddr_t = ulong +rbx.platform.typedef.__vsize_t = ulong +rbx.platform.typedef.__wchar_t = int +rbx.platform.typedef.__wctrans_t = pointer +rbx.platform.typedef.__wctype_t = pointer +rbx.platform.typedef.__wint_t = int +rbx.platform.typedef.blkcnt_t = long_long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.caddr_t = string +rbx.platform.typedef.clock_t = long_long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cpuid_t = ulong +rbx.platform.typedef.daddr32_t = int +rbx.platform.typedef.daddr_t = long_long +rbx.platform.typedef.dev_t = int +rbx.platform.typedef.fixpt_t = uint +rbx.platform.typedef.fsblkcnt_t = ulong_long +rbx.platform.typedef.fsfilcnt_t = ulong_long +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.id_t = uint +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.ino_t = ulong_long +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.key_t = long +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.paddr_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.psize_t = ulong +rbx.platform.typedef.qaddr_t = pointer +rbx.platform.typedef.quad_t = long_long +rbx.platform.typedef.register_t = long +rbx.platform.typedef.rlim_t = ulong_long +rbx.platform.typedef.sa_family_t = uchar +rbx.platform.typedef.segsz_t = int +rbx.platform.typedef.sigset_t = uint +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.swblk_t = int +rbx.platform.typedef.time_t = long_long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_int16_t = ushort +rbx.platform.typedef.u_int32_t = uint +rbx.platform.typedef.u_int64_t = ulong_long +rbx.platform.typedef.u_int8_t = uchar +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_quad_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.vaddr_t = ulong +rbx.platform.typedef.vsize_t = ulong diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-solaris/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-solaris/types.conf new file mode 100644 index 000000000000..a7890d169663 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-solaris/types.conf @@ -0,0 +1,122 @@ +rbx.platform.typedef.*caddr_t = char +rbx.platform.typedef.blkcnt64_t = long +rbx.platform.typedef.blkcnt_t = long +rbx.platform.typedef.blksize_t = int +rbx.platform.typedef.clock_t = long +rbx.platform.typedef.clockid_t = int +rbx.platform.typedef.cnt_t = short +rbx.platform.typedef.cpu_flag_t = ushort +rbx.platform.typedef.ctid_t = int +rbx.platform.typedef.daddr_t = long +rbx.platform.typedef.datalink_id_t = uint +rbx.platform.typedef.dev_t = ulong +rbx.platform.typedef.diskaddr_t = ulong_long +rbx.platform.typedef.disp_lock_t = uchar +rbx.platform.typedef.fd_mask = long +rbx.platform.typedef.fds_mask = long +rbx.platform.typedef.fsblkcnt64_t = ulong +rbx.platform.typedef.fsblkcnt_t = ulong +rbx.platform.typedef.fsfilcnt64_t = ulong +rbx.platform.typedef.fsfilcnt_t = ulong +rbx.platform.typedef.gid_t = uint +rbx.platform.typedef.hrtime_t = long_long +rbx.platform.typedef.id_t = int +rbx.platform.typedef.in_addr_t = uint +rbx.platform.typedef.in_port_t = ushort +rbx.platform.typedef.index_t = short +rbx.platform.typedef.ino64_t = ulong +rbx.platform.typedef.ino_t = ulong +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = int +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long +rbx.platform.typedef.intptr_t = long +rbx.platform.typedef.ipaddr_t = uint +rbx.platform.typedef.k_fltset_t = uint +rbx.platform.typedef.key_t = int +rbx.platform.typedef.len_t = ulong_long +rbx.platform.typedef.lgrp_id_t = int +rbx.platform.typedef.lock_t = uchar +rbx.platform.typedef.longlong_t = long_long +rbx.platform.typedef.major_t = uint +rbx.platform.typedef.minor_t = uint +rbx.platform.typedef.mode_t = uint +rbx.platform.typedef.model_t = uint +rbx.platform.typedef.nfds_t = ulong +rbx.platform.typedef.nlink_t = uint +rbx.platform.typedef.o_dev_t = short +rbx.platform.typedef.o_gid_t = ushort +rbx.platform.typedef.o_ino_t = ushort +rbx.platform.typedef.o_mode_t = ushort +rbx.platform.typedef.o_nlink_t = short +rbx.platform.typedef.o_pid_t = short +rbx.platform.typedef.o_uid_t = ushort +rbx.platform.typedef.off64_t = long +rbx.platform.typedef.off_t = long +rbx.platform.typedef.offset_t = long_long +rbx.platform.typedef.pad64_t = long +rbx.platform.typedef.pfn_t = ulong +rbx.platform.typedef.pgcnt_t = ulong +rbx.platform.typedef.pid_t = int +rbx.platform.typedef.poolid_t = int +rbx.platform.typedef.pri_t = short +rbx.platform.typedef.projid_t = int +rbx.platform.typedef.pthread_key_t = uint +rbx.platform.typedef.pthread_t = uint +rbx.platform.typedef.ptrdiff_t = long +rbx.platform.typedef.rlim64_t = ulong_long +rbx.platform.typedef.rlim_t = ulong +rbx.platform.typedef.sa_family_t = ushort +rbx.platform.typedef.size_t = ulong +rbx.platform.typedef.socklen_t = uint +rbx.platform.typedef.spgcnt_t = long +rbx.platform.typedef.ssize_t = long +rbx.platform.typedef.suseconds_t = long +rbx.platform.typedef.sysid_t = short +rbx.platform.typedef.t_scalar_t = int +rbx.platform.typedef.t_uscalar_t = uint +rbx.platform.typedef.taskid_t = int +rbx.platform.typedef.time_t = long +rbx.platform.typedef.timer_t = int +rbx.platform.typedef.u_char = uchar +rbx.platform.typedef.u_int = uint +rbx.platform.typedef.u_long = ulong +rbx.platform.typedef.u_longlong_t = ulong_long +rbx.platform.typedef.u_offset_t = ulong_long +rbx.platform.typedef.u_short = ushort +rbx.platform.typedef.uchar_t = uchar +rbx.platform.typedef.uid_t = uint +rbx.platform.typedef.uint = uint +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint32_t = uint +rbx.platform.typedef.uint64_t = ulong +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = uint +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least32_t = uint +rbx.platform.typedef.uint_least64_t = ulong +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uint_t = uint +rbx.platform.typedef.uintmax_t = ulong +rbx.platform.typedef.uintptr_t = ulong +rbx.platform.typedef.ulong = ulong +rbx.platform.typedef.ulong_t = ulong +rbx.platform.typedef.unchar = uchar +rbx.platform.typedef.upad64_t = ulong +rbx.platform.typedef.use_t = uchar +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.ushort = ushort +rbx.platform.typedef.ushort_t = ushort +rbx.platform.typedef.zoneid_t = int diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-windows/types.conf b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-windows/types.conf new file mode 100644 index 000000000000..5bdbbde2e273 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/platform/x86_64-windows/types.conf @@ -0,0 +1,52 @@ +rbx.platform.typedef.__time32_t = long +rbx.platform.typedef.__time64_t = long_long +rbx.platform.typedef._dev_t = uint +rbx.platform.typedef._ino_t = ushort +rbx.platform.typedef._mode_t = ushort +rbx.platform.typedef._off64_t = long_long +rbx.platform.typedef._off_t = long +rbx.platform.typedef._pid_t = long_long +rbx.platform.typedef._sigset_t = ulong_long +rbx.platform.typedef.dev_t = uint +rbx.platform.typedef.errno_t = int +rbx.platform.typedef.ino_t = ushort +rbx.platform.typedef.int16_t = short +rbx.platform.typedef.int32_t = int +rbx.platform.typedef.int64_t = long_long +rbx.platform.typedef.int8_t = char +rbx.platform.typedef.int_fast16_t = short +rbx.platform.typedef.int_fast32_t = int +rbx.platform.typedef.int_fast64_t = long_long +rbx.platform.typedef.int_fast8_t = char +rbx.platform.typedef.int_least16_t = short +rbx.platform.typedef.int_least32_t = int +rbx.platform.typedef.int_least64_t = long_long +rbx.platform.typedef.int_least8_t = char +rbx.platform.typedef.intmax_t = long_long +rbx.platform.typedef.intptr_t = long_long +rbx.platform.typedef.mode_t = ushort +rbx.platform.typedef.off32_t = long +rbx.platform.typedef.off64_t = long_long +rbx.platform.typedef.off_t = long_long +rbx.platform.typedef.pid_t = long_long +rbx.platform.typedef.ptrdiff_t = long_long +rbx.platform.typedef.rsize_t = ulong_long +rbx.platform.typedef.size_t = ulong_long +rbx.platform.typedef.ssize_t = long_long +rbx.platform.typedef.time_t = long_long +rbx.platform.typedef.uint16_t = ushort +rbx.platform.typedef.uint64_t = ulong_long +rbx.platform.typedef.uint8_t = uchar +rbx.platform.typedef.uint_fast16_t = ushort +rbx.platform.typedef.uint_fast32_t = uint +rbx.platform.typedef.uint_fast64_t = ulong_long +rbx.platform.typedef.uint_fast8_t = uchar +rbx.platform.typedef.uint_least16_t = ushort +rbx.platform.typedef.uint_least64_t = ulong_long +rbx.platform.typedef.uint_least8_t = uchar +rbx.platform.typedef.uintmax_t = ulong_long +rbx.platform.typedef.uintptr_t = ulong_long +rbx.platform.typedef.useconds_t = uint +rbx.platform.typedef.wchar_t = ushort +rbx.platform.typedef.wctype_t = ushort +rbx.platform.typedef.wint_t = ushort diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/pointer.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/pointer.rb new file mode 100644 index 000000000000..37a054b298d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/pointer.rb @@ -0,0 +1,167 @@ +# +# Copyright (C) 2008, 2009 Wayne Meissner +# Copyright (c) 2007, 2008 Evan Phoenix +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +require 'ffi/platform' + +# NOTE: all method definitions in this file are conditional on +# whether they are not already defined. This is needed because +# some Ruby implementations (e.g., TruffleRuby) might already +# provide these methods due to using FFI internally, and we +# should not override them to avoid warnings. + +module FFI + class Pointer + + # Pointer size + SIZE = Platform::ADDRESS_SIZE / 8 unless const_defined?(:SIZE) + + # Return the size of a pointer on the current platform, in bytes + # @return [Numeric] + def self.size + SIZE + end unless respond_to?(:size) + + # @param [nil,Numeric] len length of string to return + # @return [String] + # Read pointer's contents as a string, or the first +len+ bytes of the + # equivalent string if +len+ is not +nil+. + def read_string(len=nil) + if len + return ''.b if len == 0 + get_bytes(0, len) + else + get_string(0) + end + end unless method_defined?(:read_string) + + # @param [Numeric] len length of string to return + # @return [String] + # Read the first +len+ bytes of pointer's contents as a string. + # + # Same as: + # ptr.read_string(len) # with len not nil + def read_string_length(len) + get_bytes(0, len) + end unless method_defined?(:read_string_length) + + # @return [String] + # Read pointer's contents as a string. + # + # Same as: + # ptr.read_string # with no len + def read_string_to_null + get_string(0) + end unless method_defined?(:read_string_to_null) + + # @param [String] str string to write + # @param [Numeric] len length of string to return + # @return [self] + # Write +len+ first bytes of +str+ in pointer's contents. + # + # Same as: + # ptr.write_string(str, len) # with len not nil + def write_string_length(str, len) + put_bytes(0, str, 0, len) + end unless method_defined?(:write_string_length) + + # @param [String] str string to write + # @param [Numeric] len length of string to return + # @return [self] + # Write +str+ in pointer's contents, or first +len+ bytes if + # +len+ is not +nil+. + def write_string(str, len=nil) + len = str.bytesize unless len + # Write the string data without NUL termination + put_bytes(0, str, 0, len) + end unless method_defined?(:write_string) + + # @param [Type] type type of data to read from pointer's contents + # @param [Symbol] reader method to send to +self+ to read +type+ + # @param [Numeric] length + # @return [Array] + # Read an array of +type+ of length +length+. + # @example + # ptr.read_array_of_type(TYPE_UINT8, :read_uint8, 4) # -> [1, 2, 3, 4] + def read_array_of_type(type, reader, length) + ary = [] + size = FFI.type_size(type) + tmp = self + length.times { |j| + ary << tmp.send(reader) + tmp += size unless j == length-1 # avoid OOB + } + ary + end unless method_defined?(:read_array_of_type) + + # @param [Type] type type of data to write to pointer's contents + # @param [Symbol] writer method to send to +self+ to write +type+ + # @param [Array] ary + # @return [self] + # Write +ary+ in pointer's contents as +type+. + # @example + # ptr.write_array_of_type(TYPE_UINT8, :put_uint8, [1, 2, 3 ,4]) + def write_array_of_type(type, writer, ary) + size = FFI.type_size(type) + ary.each_with_index { |val, i| + break unless i < self.size + self.send(writer, i * size, val) + } + self + end unless method_defined?(:write_array_of_type) + + # @return [self] + def to_ptr + self + end unless method_defined?(:to_ptr) + + # @param [Symbol,Type] type of data to read + # @return [Object] + # Read pointer's contents as +type+ + # + # Same as: + # ptr.get(type, 0) + def read(type) + get(type, 0) + end unless method_defined?(:read) + + # @param [Symbol,Type] type of data to read + # @param [Object] value to write + # @return [nil] + # Write +value+ of type +type+ to pointer's content + # + # Same as: + # ptr.put(type, 0) + def write(type, value) + put(type, 0, value) + end unless method_defined?(:write) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct.rb new file mode 100644 index 000000000000..70282580b04c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct.rb @@ -0,0 +1,316 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# Copyright (C) 2008, 2009 Andrea Fazzi +# Copyright (C) 2008, 2009 Luc Heinrich +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +require 'ffi/platform' +require 'ffi/struct_layout' +require 'ffi/struct_layout_builder' +require 'ffi/struct_by_reference' + +module FFI + + class Struct + + # Get struct size + # @return [Numeric] + def size + self.class.size + end + + # @return [Fixnum] Struct alignment + def alignment + self.class.alignment + end + alias_method :align, :alignment + + # (see FFI::StructLayout#offset_of) + def offset_of(name) + self.class.offset_of(name) + end + + # (see FFI::StructLayout#members) + def members + self.class.members + end + + # @return [Array] + # Get array of values from Struct fields. + def values + members.map { |m| self[m] } + end + + # (see FFI::StructLayout#offsets) + def offsets + self.class.offsets + end + + # Clear the struct content. + # @return [self] + def clear + pointer.clear + self + end + + # Get {Pointer} to struct content. + # @return [AbstractMemory] + def to_ptr + pointer + end + + # Get struct size + # @return [Numeric] + def self.size + defined?(@layout) ? @layout.size : defined?(@size) ? @size : 0 + end + + # set struct size + # @param [Numeric] size + # @return [size] + def self.size=(size) + raise ArgumentError, "Size already set" if defined?(@size) || defined?(@layout) + @size = size + end + + # @return (see Struct#alignment) + def self.alignment + @layout.alignment + end + + # (see FFI::Type#members) + def self.members + @layout.members + end + + # (see FFI::StructLayout#offsets) + def self.offsets + @layout.offsets + end + + # (see FFI::StructLayout#offset_of) + def self.offset_of(name) + @layout.offset_of(name) + end + + def self.in + ptr(:in) + end + + def self.out + ptr(:out) + end + + def self.ptr(flags = :inout) + @ref_data_type ||= Type::Mapped.new(StructByReference.new(self)) + end + + def self.val + @val_data_type ||= StructByValue.new(self) + end + + def self.by_value + self.val + end + + def self.by_ref(flags = :inout) + self.ptr(flags) + end + + class ManagedStructConverter < StructByReference + + # @param [Struct] struct_class + def initialize(struct_class) + super(struct_class) + + raise NoMethodError, "release() not implemented for class #{struct_class}" unless struct_class.respond_to? :release + @method = struct_class.method(:release) + end + + # @param [Pointer] ptr + # @param [nil] ctx + # @return [Struct] + def from_native(ptr, ctx) + struct_class.new(AutoPointer.new(ptr, @method)) + end + end + + def self.auto_ptr + @managed_type ||= Type::Mapped.new(ManagedStructConverter.new(self)) + end + + + class << self + public + + # @return [StructLayout] + # @overload layout + # @return [StructLayout] + # Get struct layout. + # @overload layout(*spec) + # @param [Array<Symbol, Integer>,Array(Hash)] spec + # @return [StructLayout] + # Create struct layout from +spec+. + # @example Creating a layout from an array +spec+ + # class MyStruct < Struct + # layout :field1, :int, + # :field2, :pointer, + # :field3, :string + # end + # @example Creating a layout from an array +spec+ with offset + # class MyStructWithOffset < Struct + # layout :field1, :int, + # :field2, :pointer, 6, # set offset to 6 for this field + # :field3, :string + # end + # @example Creating a layout from a hash +spec+ + # class MyStructFromHash < Struct + # layout :field1 => :int, + # :field2 => :pointer, + # :field3 => :string + # end + # @example Creating a layout with pointers to functions + # class MyFunctionTable < Struct + # layout :function1, callback([:int, :int], :int), + # :function2, callback([:pointer], :void), + # :field3, :string + # end + def layout(*spec) + warn "[DEPRECATION] Struct layout is already defined for class #{self.inspect}. Redefinition as in #{caller[0]} will be disallowed in ffi-2.0." if defined?(@layout) + return @layout if spec.size == 0 + + builder = StructLayoutBuilder.new + builder.union = self < Union + builder.packed = @packed if defined?(@packed) + builder.alignment = @min_alignment if defined?(@min_alignment) + + if spec[0].kind_of?(Hash) + hash_layout(builder, spec) + else + array_layout(builder, spec) + end + builder.size = @size if defined?(@size) && @size > builder.size + cspec = builder.build + @layout = cspec unless self == Struct + @size = cspec.size + return cspec + end + + + protected + + def callback(params, ret) + mod = enclosing_module + ret_type = find_type(ret, mod) + if ret_type == Type::STRING + raise TypeError, ":string is not allowed as return type of callbacks" + end + FFI::CallbackInfo.new(ret_type, params.map { |e| find_type(e, mod) }) + end + + def packed(packed = 1) + @packed = packed + end + alias :pack :packed + + def aligned(alignment = 1) + @min_alignment = alignment + end + alias :align :aligned + + def enclosing_module + begin + mod = self.name.split("::")[0..-2].inject(Object) { |obj, c| obj.const_get(c) } + if mod.respond_to?(:find_type) && (mod.is_a?(FFI::Library) || mod < FFI::Struct) + mod + end + rescue Exception + nil + end + end + + + def find_field_type(type, mod = enclosing_module) + if type.kind_of?(Class) && type < Struct + FFI::Type::Struct.new(type) + + elsif type.kind_of?(Class) && type < FFI::StructLayout::Field + type + + elsif type.kind_of?(::Array) + FFI::Type::Array.new(find_field_type(type[0]), type[1]) + + else + find_type(type, mod) + end + end + + def find_type(type, mod = enclosing_module) + if mod + mod.find_type(type) + end || FFI.find_type(type) + end + + private + + # @param [StructLayoutBuilder] builder + # @param [Hash] spec + # @return [builder] + # Add hash +spec+ to +builder+. + def hash_layout(builder, spec) + spec[0].each do |name, type| + builder.add name, find_field_type(type), nil + end + end + + # @param [StructLayoutBuilder] builder + # @param [Array<Symbol, Integer>] spec + # @return [builder] + # Add array +spec+ to +builder+. + def array_layout(builder, spec) + i = 0 + while i < spec.size + name, type = spec[i, 2] + i += 2 + + # If the next param is a Integer, it specifies the offset + if spec[i].kind_of?(Integer) + offset = spec[i] + i += 1 + else + offset = nil + end + + builder.add name, find_field_type(type), offset + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct_by_reference.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct_by_reference.rb new file mode 100644 index 000000000000..27f25eca7716 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct_by_reference.rb @@ -0,0 +1,72 @@ +# +# Copyright (C) 2010 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.# + +module FFI + # This class includes the {FFI::DataConverter} module. + class StructByReference + include DataConverter + + attr_reader :struct_class + + # @param [Struct] struct_class + def initialize(struct_class) + unless Class === struct_class and struct_class < FFI::Struct + raise TypeError, 'wrong type (expected subclass of FFI::Struct)' + end + @struct_class = struct_class + end + + # Always get {FFI::Type}::POINTER. + def native_type + FFI::Type::POINTER + end + + # @param [nil, Struct] value + # @param [nil] ctx + # @return [AbstractMemory] Pointer on +value+. + def to_native(value, ctx) + return Pointer::NULL if value.nil? + + unless @struct_class === value + raise TypeError, "wrong argument type #{value.class} (expected #{@struct_class})" + end + + value.pointer + end + + # @param [AbstractMemory] value + # @param [nil] ctx + # @return [Struct] + # Create a struct from content of memory +value+. + def from_native(value, ctx) + @struct_class.new(value) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct_layout.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct_layout.rb new file mode 100644 index 000000000000..d5a78a7a7d76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct_layout.rb @@ -0,0 +1,96 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# Copyright (C) 2008, 2009 Andrea Fazzi +# Copyright (C) 2008, 2009 Luc Heinrich +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +module FFI + + class StructLayout + + # @return [Array<Array(Symbol, Numeric)> + # Get an array of tuples (field name, offset of the field). + def offsets + members.map { |m| [ m, self[m].offset ] } + end + + # @return [Numeric] + # Get the offset of a field. + def offset_of(field_name) + self[field_name].offset + end + + # An enum {Field} in a {StructLayout}. + class Enum < Field + + # @param [AbstractMemory] ptr pointer on a {Struct} + # @return [Object] + # Get an object of type {#type} from memory pointed by +ptr+. + def get(ptr) + type.find(ptr.get_int(offset)) + end + + # @param [AbstractMemory] ptr pointer on a {Struct} + # @param value + # @return [nil] + # Set +value+ into memory pointed by +ptr+. + def put(ptr, value) + ptr.put_int(offset, type.find(value)) + end + + end + + class InnerStruct < Field + def get(ptr) + type.struct_class.new(ptr.slice(self.offset, self.size)) + end + + def put(ptr, value) + raise TypeError, "wrong value type (expected #{type.struct_class})" unless value.is_a?(type.struct_class) + ptr.slice(self.offset, self.size).__copy_from__(value.pointer, self.size) + end + end + + class Mapped < Field + def initialize(name, offset, type, orig_field) + super(name, offset, type) + @orig_field = orig_field + end + + def get(ptr) + type.from_native(@orig_field.get(ptr), nil) + end + + def put(ptr, value) + @orig_field.put(ptr, type.to_native(value, nil)) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct_layout_builder.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct_layout_builder.rb new file mode 100644 index 000000000000..4d6a464103a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/struct_layout_builder.rb @@ -0,0 +1,227 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +module FFI + + # Build a {StructLayout struct layout}. + class StructLayoutBuilder + attr_reader :size + attr_reader :alignment + + def initialize + @size = 0 + @alignment = 1 + @min_alignment = 1 + @packed = false + @union = false + @fields = Array.new + end + + # Set size attribute with +size+ only if +size+ is greater than attribute value. + # @param [Numeric] size + def size=(size) + @size = size if size > @size + end + + # Set alignment attribute with +align+ only if it is greater than attribute value. + # @param [Numeric] align + def alignment=(align) + @alignment = align if align > @alignment + @min_alignment = align + end + + # Set union attribute. + # Set to +true+ to build a {Union} instead of a {Struct}. + # @param [Boolean] is_union + # @return [is_union] + def union=(is_union) + @union = is_union + end + + # Building a {Union} or a {Struct} ? + # + # @return [Boolean] + # + def union? + @union + end + + # Set packed attribute + # @overload packed=(packed) Set alignment and packed attributes to + # +packed+. + # + # @param [Fixnum] packed + # + # @return [packed] + # @overload packed=(packed) Set packed attribute. + # @param packed + # + # @return [0,1] + # + def packed=(packed) + if packed.is_a?(0.class) + @alignment = packed + @packed = packed + else + @packed = packed ? 1 : 0 + end + end + + + # List of number types + NUMBER_TYPES = [ + Type::INT8, + Type::UINT8, + Type::INT16, + Type::UINT16, + Type::INT32, + Type::UINT32, + Type::LONG, + Type::ULONG, + Type::INT64, + Type::UINT64, + Type::FLOAT32, + Type::FLOAT64, + Type::LONGDOUBLE, + Type::BOOL, + ] + + # @param [String, Symbol] name name of the field + # @param [Array, DataConverter, Struct, StructLayout::Field, Symbol, Type] type type of the field + # @param [Numeric, nil] offset + # @return [self] + # Add a field to the builder. + # @note Setting +offset+ to +nil+ or +-1+ is equivalent to +0+. + def add(name, type, offset = nil) + + if offset.nil? || offset == -1 + offset = @union ? 0 : align(@size, @packed ? [ @packed, type.alignment ].min : [ @min_alignment, type.alignment ].max) + end + + # + # If a FFI::Type type was passed in as the field arg, try and convert to a StructLayout::Field instance + # + field = type.is_a?(StructLayout::Field) ? type : field_for_type(name, offset, type) + @fields << field + @alignment = [ @alignment, field.alignment ].max unless @packed + @size = [ @size, field.size + (@union ? 0 : field.offset) ].max + + return self + end + + # @param (see #add) + # @return (see #add) + # Same as {#add}. + # @see #add + def add_field(name, type, offset = nil) + add(name, type, offset) + end + + # @param (see #add) + # @return (see #add) + # Add a struct as a field to the builder. + def add_struct(name, type, offset = nil) + add(name, Type::Struct.new(type), offset) + end + + # @param name (see #add) + # @param type (see #add) + # @param [Numeric] count array length + # @param offset (see #add) + # @return (see #add) + # Add an array as a field to the builder. + def add_array(name, type, count, offset = nil) + add(name, Type::Array.new(type, count), offset) + end + + # @return [StructLayout] + # Build and return the struct layout. + def build + # Add tail padding if the struct is not packed + size = @packed ? @size : align(@size, @alignment) + + layout = StructLayout.new(@fields, size, @alignment) + layout.__union! if @union + layout + end + + private + + # @param [Numeric] offset + # @param [Numeric] align + # @return [Numeric] + def align(offset, align) + align + ((offset - 1) & ~(align - 1)); + end + + # @param (see #add) + # @return [StructLayout::Field] + def field_for_type(name, offset, type) + field_class = case + when type.is_a?(Type::Function) + StructLayout::Function + + when type.is_a?(Type::Struct) + StructLayout::InnerStruct + + when type.is_a?(Type::Array) + StructLayout::Array + + when type.is_a?(FFI::Enum) + StructLayout::Enum + + when NUMBER_TYPES.include?(type) + StructLayout::Number + + when type == Type::POINTER + StructLayout::Pointer + + when type == Type::STRING + StructLayout::String + + when type.is_a?(Class) && type < StructLayout::Field + type + + when type.is_a?(DataConverter) + return StructLayout::Mapped.new(name, offset, Type::Mapped.new(type), field_for_type(name, offset, type.native_type)) + + when type.is_a?(Type::Mapped) + return StructLayout::Mapped.new(name, offset, type, field_for_type(name, offset, type.native_type)) + + else + raise TypeError, "invalid struct field type #{type.inspect}" + end + + field_class.new(name, offset, type) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/const_generator.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/const_generator.rb new file mode 100644 index 000000000000..fb34d949e481 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/const_generator.rb @@ -0,0 +1,230 @@ +require 'tempfile' +require 'open3' + +module FFI + + # ConstGenerator turns C constants into ruby values. + # + # @example a simple example for stdio + # require 'ffi/tools/const_generator' + # cg = FFI::ConstGenerator.new('stdio') do |gen| + # gen.const(:SEEK_SET) + # gen.const('SEEK_CUR') + # gen.const('seek_end') # this constant does not exist + # end # #calculate called automatically at the end of the block + # + # cg['SEEK_SET'] # => 0 + # cg['SEEK_CUR'] # => 1 + # cg['seek_end'] # => nil + # cg.to_ruby # => "SEEK_SET = 0\nSEEK_CUR = 1\n# seek_end not available" + class ConstGenerator + @options = {} + attr_reader :constants + + # Creates a new constant generator that uses +prefix+ as a name, and an + # options hash. + # + # The only option is +:required+, which if set to +true+ raises an error if a + # constant you have requested was not found. + # + # @param [#to_s] prefix + # @param [Hash] options + # @return + # @option options [Boolean] :required + # @overload initialize(prefix, options) + # @overload initialize(prefix, options) { |gen| ... } + # @yieldparam [ConstGenerator] gen new generator is passed to the block + # When passed a block, {#calculate} is automatically called at the end of + # the block, otherwise you must call it yourself. + def initialize(prefix = nil, options = {}) + @includes = ['stdio.h', 'stddef.h'] + @constants = {} + @prefix = prefix + + @required = options[:required] + @options = options + + if block_given? then + yield self + calculate self.class.options.merge(options) + end + end + # Set class options + # These options are merged with {#initialize} options when it is called with a block. + # @param [Hash] options + # @return [Hash] class options + def self.options=(options) + @options = options + end + # Get class options. + # @return [Hash] class options + def self.options + @options + end + # @param [String] name + # @return constant value (converted if a +converter+ was defined). + # Access a constant by name. + def [](name) + @constants[name].converted_value + end + + # Request the value for C constant +name+. + # + # @param [#to_s] name C constant name + # @param [String] format a printf format string to print the value out + # @param [String] cast a C cast for the value + # @param ruby_name alternate ruby name for {#to_ruby} + # + # @overload const(name, format=nil, cast='', ruby_name=nil, converter=nil) + # +converter+ is a Method or a Proc. + # @param [#call] converter convert the value from a string to the appropriate + # type for {#to_ruby}. + # @overload const(name, format=nil, cast='', ruby_name=nil) { |value| ... } + # Use a converter block. This block convert the value from a string to the + # appropriate type for {#to_ruby}. + # @yieldparam value constant value + def const(name, format = nil, cast = '', ruby_name = nil, converter = nil, + &converter_proc) + format ||= '%d' + cast ||= '' + + if converter_proc and converter then + raise ArgumentError, "Supply only converter or converter block" + end + + converter = converter_proc if converter.nil? + + const = Constant.new name, format, cast, ruby_name, converter + @constants[name.to_s] = const + return const + end + + # Calculate constants values. + # @param [Hash] options + # @option options [String] :cppflags flags for C compiler + # @return [nil] + # @raise if a constant is missing and +:required+ was set to +true+ (see {#initialize}) + def calculate(options = {}) + binary = File.join Dir.tmpdir, "rb_const_gen_bin_#{Process.pid}" + + Tempfile.open("#{@prefix}.const_generator") do |f| + @includes.each do |inc| + f.puts "#include <#{inc}>" + end + f.puts "\nint main(int argc, char **argv)\n{" + + @constants.each_value do |const| + f.puts <<-EOF + #ifdef #{const.name} + printf("#{const.name} #{const.format}\\n", #{const.cast}#{const.name}); + #endif + EOF + end + + f.puts "\n\treturn 0;\n}" + f.flush + + output = `gcc #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -x c -Wall -Werror #{f.path} -o #{binary} 2>&1` + + unless $?.success? then + output = output.split("\n").map { |l| "\t#{l}" }.join "\n" + raise "Compilation error generating constants #{@prefix}:\n#{output}" + end + end + + output = `#{binary}` + File.unlink(binary + (FFI::Platform.windows? ? ".exe" : "")) + output.each_line do |line| + line =~ /^(\S+)\s(.*)$/ + const = @constants[$1] + const.value = $2 + end + + missing_constants = @constants.select do |name, constant| + constant.value.nil? + end.map { |name,| name } + + if @required and not missing_constants.empty? then + raise "Missing required constants for #{@prefix}: #{missing_constants.join ', '}" + end + end + + # Dump constants to +io+. + # @param [#puts] io + # @return [nil] + def dump_constants(io) + @constants.each do |name, constant| + name = [@prefix, name].join '.' if @prefix + io.puts "#{name} = #{constant.converted_value}" + end + end + + # Outputs values for discovered constants. If the constant's value was + # not discovered it is not omitted. + # @return [String] + def to_ruby + @constants.sort_by { |name,| name }.map do |name, constant| + if constant.value.nil? then + "# #{name} not available" + else + constant.to_ruby + end + end.join "\n" + end + + # Add additional C include file(s) to calculate constants from. + # @note +stdio.h+ and +stddef.h+ automatically included + # @param [List<String>, Array<String>] i include file(s) + # @return [Array<String>] array of include files + def include(*i) + @includes |= i.flatten + end + + end + + # This class hold constants for {ConstGenerator} + class ConstGenerator::Constant + + attr_reader :name, :format, :cast + attr_accessor :value + + # @param [#to_s] name + # @param [String] format a printf format string to print the value out + # @param [String] cast a C cast for the value + # @param ruby_name alternate ruby name for {#to_ruby} + # @param [#call] converter convert the value from a string to the appropriate + # type for {#to_ruby}. + def initialize(name, format, cast, ruby_name = nil, converter=nil) + @name = name + @format = format + @cast = cast + @ruby_name = ruby_name + @converter = converter + @value = nil + end + + # Return constant value (converted if a +converter+ was defined). + # @return constant value. + def converted_value + if @converter + @converter.call(@value) + else + @value + end + end + + # get constant ruby name + # @return [String] + def ruby_name + @ruby_name || @name + end + + # Get an evaluable string from constant. + # @return [String] + def to_ruby + "#{ruby_name} = #{converted_value}" + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/generator.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/generator.rb new file mode 100644 index 000000000000..5552ea597f5b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/generator.rb @@ -0,0 +1,105 @@ +require 'ffi/tools/struct_generator' +require 'ffi/tools/const_generator' + +module FFI + + ## + # Generate files with C structs for FFI::Struct and C constants. + # + # == A simple example + # + # In file +zlib.rb.ffi+: + # module Zlib + # @@@ + # constants do |c| + # c.include "zlib.h" + # c.const :ZLIB_VERNUM + # end + # @@@ + # + # class ZStream < FFI::Struct + # + # struct do |s| + # s.name "struct z_stream_s" + # s.include "zlib.h" + # + # s.field :next_in, :pointer + # s.field :avail_in, :uint + # s.field :total_in, :ulong + # end + # @@@ + # end + # end + # + # Translate the file: + # require "ffi/tools/generator" + # FFI::Generator.new "zlib.rb.ffi", "zlib.rb" + # + # Generates the file +zlib.rb+ with constant values and offsets: + # module Zlib + # ZLIB_VERNUM = 4784 + # + # class ZStream < FFI::Struct + # layout :next_in, :pointer, 0, + # :avail_in, :uint, 8, + # :total_in, :ulong, 16 + # end + # + # @see FFI::Generator::Task for easy integration in a Rakefile + class Generator + + def initialize(ffi_name, rb_name, options = {}) + @ffi_name = ffi_name + @rb_name = rb_name + @options = options + @name = File.basename rb_name, '.rb' + + file = File.read @ffi_name + + new_file = file.gsub(/^( *)@@@(.*?)@@@/m) do + @constants = [] + @structs = [] + + indent = $1 + original_lines = $2.count "\n" + + instance_eval $2, @ffi_name, $`.count("\n") + + new_lines = [] + @constants.each { |c| new_lines << c.to_ruby } + @structs.each { |s| new_lines << s.generate_layout } + + new_lines = new_lines.join("\n").split "\n" # expand multiline blocks + new_lines = new_lines.map { |line| indent + line } + + padding = original_lines - new_lines.length + new_lines += [nil] * padding if padding >= 0 + + new_lines.join "\n" + end + + open @rb_name, 'w' do |f| + f.puts "# This file is generated from `#{@ffi_name}'. Do not edit." + f.puts + f.puts new_file + end + end + + def constants(options = {}, &block) + @constants << FFI::ConstGenerator.new(@name, @options.merge(options), &block) + end + + def struct(options = {}, &block) + @structs << FFI::StructGenerator.new(@name, @options.merge(options), &block) + end + + ## + # Utility converter for constants + + def to_s + proc { |obj| obj.to_s.inspect } + end + + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/generator_task.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/generator_task.rb new file mode 100644 index 000000000000..da72968b3800 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/generator_task.rb @@ -0,0 +1,32 @@ +require 'ffi/tools/generator' +require 'rake' +require 'rake/tasklib' + +## +# Add Rake tasks that generate files with C structs for FFI::Struct and C constants. +# +# @example a simple example for your Rakefile +# require "ffi/tools/generator_task" +# # Add a task to generate my_object.rb out of my_object.rb.ffi +# FFI::Generator::Task.new ["my_object.rb"], cflags: "-I/usr/local/mylibrary" +# +# The generated files are also added to the 'clear' task. +# +# @see FFI::Generator for a description of the file content +class FFI::Generator::Task < Rake::TaskLib + + def initialize(rb_names, options={}) + task :clean do rm_f rb_names end + + rb_names.each do |rb_name| + ffi_name = "#{rb_name}.ffi" + + file rb_name => ffi_name do |t| + puts "Generating #{rb_name}..." if Rake.application.options.trace + + FFI::Generator.new ffi_name, rb_name, options + end + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/struct_generator.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/struct_generator.rb new file mode 100644 index 000000000000..7d2a6e5298d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/struct_generator.rb @@ -0,0 +1,194 @@ +require 'tempfile' + +module FFI + + ## + # Generates an FFI Struct layout. + # + # Given the @@@ portion in: + # + # class Zlib::ZStream < FFI::Struct + # @@@ + # name "struct z_stream_s" + # include "zlib.h" + # + # field :next_in, :pointer + # field :avail_in, :uint + # field :total_in, :ulong + # + # # ... + # @@@ + # end + # + # StructGenerator will create the layout: + # + # layout :next_in, :pointer, 0, + # :avail_in, :uint, 4, + # :total_in, :ulong, 8, + # # ... + # + # StructGenerator does its best to pad the layout it produces to preserve + # line numbers. Place the struct definition as close to the top of the file + # for best results. + + class StructGenerator + @options = {} + attr_accessor :size + attr_reader :fields + + def initialize(name, options = {}) + @name = name + @struct_name = nil + @includes = [] + @fields = [] + @found = false + @size = nil + + if block_given? then + yield self + calculate self.class.options.merge(options) + end + end + def self.options=(options) + @options = options + end + def self.options + @options + end + def calculate(options = {}) + binary = File.join Dir.tmpdir, "rb_struct_gen_bin_#{Process.pid}" + + raise "struct name not set" if @struct_name.nil? + + Tempfile.open("#{@name}.struct_generator") do |f| + f.puts "#include <stdio.h>" + + @includes.each do |inc| + f.puts "#include <#{inc}>" + end + + f.puts "#include <stddef.h>\n\n" + f.puts "int main(int argc, char **argv)\n{" + f.puts " #{@struct_name} s;" + f.puts %[ printf("sizeof(#{@struct_name}) %u\\n", (unsigned int) sizeof(#{@struct_name}));] + + @fields.each do |field| + f.puts <<-EOF + printf("#{field.name} %u %u\\n", (unsigned int) offsetof(#{@struct_name}, #{field.name}), + (unsigned int) sizeof(s.#{field.name})); + EOF + end + + f.puts "\n return 0;\n}" + f.flush + + output = `gcc #{options[:cppflags]} #{options[:cflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -x c -Wall -Werror #{f.path} -o #{binary} 2>&1` + + unless $?.success? then + @found = false + output = output.split("\n").map { |l| "\t#{l}" }.join "\n" + raise "Compilation error generating struct #{@name} (#{@struct_name}):\n#{output}" + end + end + + output = `#{binary}`.split "\n" + File.unlink(binary + (FFI::Platform.windows? ? ".exe" : "")) + sizeof = output.shift + unless @size + m = /\s*sizeof\([^)]+\) (\d+)/.match sizeof + @size = m[1] + end + + line_no = 0 + output.each do |line| + md = line.match(/.+ (\d+) (\d+)/) + @fields[line_no].offset = md[1].to_i + @fields[line_no].size = md[2].to_i + + line_no += 1 + end + + @found = true + end + + def field(name, type=nil) + field = Field.new(name, type) + @fields << field + return field + end + + def found? + @found + end + + def dump_config(io) + io.puts "rbx.platform.#{@name}.sizeof = #{@size}" + + @fields.each { |field| io.puts field.to_config(@name) } + end + + def generate_layout + buf = "" + + @fields.each_with_index do |field, i| + if buf.empty? + buf << "layout :#{field.name}, :#{field.type}, #{field.offset}" + else + buf << " :#{field.name}, :#{field.type}, #{field.offset}" + end + + if i < @fields.length - 1 + buf << ",\n" + end + end + + buf + end + + def get_field(name) + @fields.find { |f| name == f.name } + end + + def include(i) + @includes << i + end + + def name(n) + @struct_name = n + end + + end + + ## + # A field in a Struct. + + class StructGenerator::Field + + attr_reader :name + attr_reader :type + attr_reader :offset + attr_accessor :size + + def initialize(name, type) + @name = name + @type = type + @offset = nil + @size = nil + end + + def offset=(o) + @offset = o + end + + def to_config(name) + buf = [] + buf << "rbx.platform.#{name}.#{@name}.offset = #{@offset}" + buf << "rbx.platform.#{name}.#{@name}.size = #{@size}" + buf << "rbx.platform.#{name}.#{@name}.type = #{@type}" if @type + buf + end + + end + +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/types_generator.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/types_generator.rb new file mode 100644 index 000000000000..ba2d8c5b241b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/tools/types_generator.rb @@ -0,0 +1,137 @@ +require 'tempfile' + +module FFI + + # @private + class TypesGenerator + + ## + # Maps different C types to the C type representations we use + + TYPE_MAP = { + "char" => :char, + "signed char" => :char, + "__signed char" => :char, + "unsigned char" => :uchar, + + "short" => :short, + "signed short" => :short, + "signed short int" => :short, + "unsigned short" => :ushort, + "unsigned short int" => :ushort, + + "int" => :int, + "signed int" => :int, + "unsigned int" => :uint, + + "long" => :long, + "long int" => :long, + "signed long" => :long, + "signed long int" => :long, + "unsigned long" => :ulong, + "unsigned long int" => :ulong, + "long unsigned int" => :ulong, + + "long long" => :long_long, + "long long int" => :long_long, + "signed long long" => :long_long, + "signed long long int" => :long_long, + "unsigned long long" => :ulong_long, + "unsigned long long int" => :ulong_long, + + "char *" => :string, + "void *" => :pointer, + } + + def self.generate(options = {}) + typedefs = nil + Tempfile.open 'ffi_types_generator' do |io| + io.puts <<-C +#include <stdint.h> +#include <stddef.h> +#include <sys/types.h> +#if !(defined(WIN32)) +#include <sys/socket.h> +#include <netinet/in.h> +#include <sys/resource.h> +#endif + C + + io.close + cc = ENV['CC'] || 'gcc' + cmd = "#{cc} -E -x c #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -c" + if options[:input] + typedefs = File.read(options[:input]) + elsif options[:remote] + typedefs = `ssh #{options[:remote]} #{cmd} - < #{io.path}` + else + typedefs = `#{cmd} #{io.path}` + end + end + + code = [] + + typedefs.each_line do |type| + # We only care about single line typedef + next unless type =~ /typedef/ + # Ignore unions or structs + next if type =~ /union|struct/ + + # strip off the starting typedef and ending ; + type.gsub!(/^(.*typedef\s*)/, "") + type.gsub!(/\s*;\s*$/, "") + + parts = type.split(/\s+/) + def_type = parts.join(" ") + + # GCC does mapping with __attribute__ stuf, also see + # http://hal.cs.berkeley.edu/cil/cil016.html section 16.2.7. Problem + # with this is that the __attribute__ stuff can either occur before or + # after the new type that is defined... + if type =~ /__attribute__/ + if parts.last =~ /__QI__|__HI__|__SI__|__DI__|__word__/ + + # In this case, the new type is BEFORE __attribute__ we need to + # find the final_type as the type before the part that starts with + # __attribute__ + final_type = "" + parts.each do |p| + break if p =~ /__attribute__/ + final_type = p + end + else + final_type = parts.pop + end + + def_type = case type + when /__QI__/ then "char" + when /__HI__/ then "short" + when /__SI__/ then "int" + when /__DI__/ then "long long" + when /__word__/ then "long" + else "int" + end + + def_type = "unsigned #{def_type}" if type =~ /unsigned/ + else + final_type = parts.pop + def_type = parts.join(" ") + end + + if type = TYPE_MAP[def_type] + code << "rbx.platform.typedef.#{final_type} = #{type}" + TYPE_MAP[final_type] = TYPE_MAP[def_type] + else + # Fallback to an ordinary pointer if we don't know the type + if def_type =~ /\*/ + code << "rbx.platform.typedef.#{final_type} = pointer" + TYPE_MAP[final_type] = :pointer + end + end + end + + code.sort.join("\n") + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/types.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/types.rb new file mode 100644 index 000000000000..90f50c1b542a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/types.rb @@ -0,0 +1,194 @@ +# +# Copyright (C) 2008-2010 Wayne Meissner +# Copyright (c) 2007, 2008 Evan Phoenix +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# see {file:README} +module FFI + + # @param [Type, DataConverter, Symbol] old type definition used by {FFI.find_type} + # @param [Symbol] add new type definition's name to add + # @return [Type] + # Add a definition type to type definitions. + def self.typedef(old, add) + TypeDefs[add] = self.find_type(old) + end + + # (see FFI.typedef) + def self.add_typedef(old, add) + typedef old, add + end + + + # @param [Type, DataConverter, Symbol] name + # @param [Hash] type_map if nil, {FFI::TypeDefs} is used + # @return [Type] + # Find a type in +type_map+ ({FFI::TypeDefs}, by default) from + # a type objet, a type name (symbol). If +name+ is a {DataConverter}, + # a new {Type::Mapped} is created. + def self.find_type(name, type_map = nil) + if name.is_a?(Type) + name + + elsif type_map && type_map.has_key?(name) + type_map[name] + + elsif TypeDefs.has_key?(name) + TypeDefs[name] + + elsif name.is_a?(DataConverter) + (type_map || TypeDefs)[name] = Type::Mapped.new(name) + else + raise TypeError, "unable to resolve type '#{name}'" + end + end + + # List of type definitions + TypeDefs.merge!({ + # The C void type; only useful for function return types + :void => Type::VOID, + + # C boolean type + :bool => Type::BOOL, + + # C nul-terminated string + :string => Type::STRING, + + # C signed char + :char => Type::CHAR, + # C unsigned char + :uchar => Type::UCHAR, + + # C signed short + :short => Type::SHORT, + # C unsigned short + :ushort => Type::USHORT, + + # C signed int + :int => Type::INT, + # C unsigned int + :uint => Type::UINT, + + # C signed long + :long => Type::LONG, + + # C unsigned long + :ulong => Type::ULONG, + + # C signed long long integer + :long_long => Type::LONG_LONG, + + # C unsigned long long integer + :ulong_long => Type::ULONG_LONG, + + # C single precision float + :float => Type::FLOAT, + + # C double precision float + :double => Type::DOUBLE, + + # C long double + :long_double => Type::LONGDOUBLE, + + # Native memory address + :pointer => Type::POINTER, + + # 8 bit signed integer + :int8 => Type::INT8, + # 8 bit unsigned integer + :uint8 => Type::UINT8, + + # 16 bit signed integer + :int16 => Type::INT16, + # 16 bit unsigned integer + :uint16 => Type::UINT16, + + # 32 bit signed integer + :int32 => Type::INT32, + # 32 bit unsigned integer + :uint32 => Type::UINT32, + + # 64 bit signed integer + :int64 => Type::INT64, + # 64 bit unsigned integer + :uint64 => Type::UINT64, + + :buffer_in => Type::BUFFER_IN, + :buffer_out => Type::BUFFER_OUT, + :buffer_inout => Type::BUFFER_INOUT, + + # Used in function prototypes to indicate the arguments are variadic + :varargs => Type::VARARGS, + }) + + # This will convert a pointer to a Ruby string (just like `:string`), but + # also allow to work with the pointer itself. This is useful when you want + # a Ruby string already containing a copy of the data, but also the pointer + # to the data for you to do something with it, like freeing it, in case the + # library handed the memory off to the caller (Ruby-FFI). + # + # It's {typedef}'d as +:strptr+. + class StrPtrConverter + extend DataConverter + native_type Type::POINTER + + # @param [Pointer] val + # @param ctx not used + # @return [Array(String, Pointer)] + # Returns a [ String, Pointer ] tuple so the C memory for the string can be freed + def self.from_native(val, ctx) + [ val.null? ? nil : val.get_string(0), val ] + end + end + + typedef(StrPtrConverter, :strptr) + + # @param type +type+ is an instance of class accepted by {FFI.find_type} + # @return [Numeric] + # Get +type+ size, in bytes. + def self.type_size(type) + find_type(type).size + end + + # Load all the platform dependent types + begin + File.open(File.join(Platform::CONF_DIR, 'types.conf'), "r") do |f| + prefix = "rbx.platform.typedef." + f.each_line { |line| + if line.index(prefix) == 0 + new_type, orig_type = line.chomp.slice(prefix.length..-1).split(/\s*=\s*/) + typedef(orig_type.to_sym, new_type.to_sym) + end + } + end + typedef :pointer, :caddr_t + rescue Errno::ENOENT + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/union.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/union.rb new file mode 100644 index 000000000000..38414ab95295 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/union.rb @@ -0,0 +1,43 @@ +# +# Copyright (C) 2009 Andrea Fazzi <andrea.fazzi@alcacoop.it> +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +require 'ffi/struct' + +module FFI + + class Union < FFI::Struct + def self.builder + b = StructLayoutBuilder.new + b.union = true + b + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/variadic.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/variadic.rb new file mode 100644 index 000000000000..743ce7f0f34c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/variadic.rb @@ -0,0 +1,69 @@ +# +# Copyright (C) 2008, 2009 Wayne Meissner +# Copyright (C) 2009 Luc Heinrich +# +# This file is part of ruby-ffi. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the Ruby FFI project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +module FFI + class VariadicInvoker + def call(*args, &block) + param_types = Array.new(@fixed) + param_values = Array.new + @fixed.each_with_index do |t, i| + param_values << args[i] + end + i = @fixed.length + while i < args.length + param_types << FFI.find_type(args[i], @type_map) + param_values << args[i + 1] + i += 2 + end + invoke(param_types, param_values, &block) + end + + # + # Attach the invoker to module +mod+ as +mname+ + # + def attach(mod, mname) + invoker = self + params = "*args" + call = "call" + mod.module_eval <<-code + @@#{mname} = invoker + def self.#{mname}(#{params}) + @@#{mname}.#{call}(#{params}) + end + def #{mname}(#{params}) + @@#{mname}.#{call}(#{params}) + end + code + invoker + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/version.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/version.rb new file mode 100644 index 000000000000..216534e74918 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi/version.rb @@ -0,0 +1,3 @@ +module FFI + VERSION = '1.15.0' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi_c.so b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi_c.so new file mode 100644 index 000000000000..5708a8ee3700 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/lib/ffi_c.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/rakelib/ffi_gem_helper.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/rakelib/ffi_gem_helper.rb new file mode 100644 index 000000000000..2bdf1ed2ba54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/rakelib/ffi_gem_helper.rb @@ -0,0 +1,65 @@ +require 'bundler' +require 'bundler/gem_helper' + +class FfiGemHelper < Bundler::GemHelper + attr_accessor :cross_platforms + + def install + super + + task "release:guard_clean" => ["release:update_history"] + + task "release:update_history" do + update_history + end + + task "release:rubygem_push" => ["gem:windows", "gem:java"] + end + + def hfile + "CHANGELOG.md" + end + + def headline + '([^\w]*)(\d+\.\d+\.\d+(?:\.\w+)?)([^\w]+)([2Y][0Y][0-9Y][0-9Y]-[0-1M][0-9M]-[0-3D][0-9D])([^\w]*|$)' + end + + def reldate + Time.now.strftime("%Y-%m-%d") + end + + def update_history + hin = File.read(hfile) + hout = hin.sub(/#{headline}/) do + raise "#{hfile} isn't up-to-date for version #{version}" unless $2==version.to_s + $1 + $2 + $3 + reldate + $5 + end + if hout != hin + Bundler.ui.confirm "Updating #{hfile} for release." + File.write(hfile, hout) + Rake::FileUtilsExt.sh "git", "commit", hfile, "-m", "Update release date in #{hfile}" + end + end + + def tag_version + Bundler.ui.confirm "Tag release with annotation:" + m = File.read(hfile).match(/(?<annotation>#{headline}.*?)#{headline}/m) || raise("Unable to find release notes in #{hfile}") + Bundler.ui.info(m[:annotation].gsub(/^/, " ")) + IO.popen(["git", "tag", "--file=-", version_tag], "w") do |fd| + fd.write m[:annotation] + end + yield if block_given? + rescue + Bundler.ui.error "Untagging #{version_tag} due to error." + sh_with_code "git tag -d #{version_tag}" + raise + end + + def rubygem_push(path) + cross_platforms.each do |ruby_platform| + super(path.gsub(/\.gem\z/, "-#{ruby_platform}.gem")) + end + super(path.gsub(/\.gem\z/, "-java.gem")) + super(path) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/getlogin.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/getlogin.rb new file mode 100644 index 000000000000..6713021d7832 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/getlogin.rb @@ -0,0 +1,8 @@ +require 'ffi' + +module Foo + extend FFI::Library + ffi_lib FFI::Library::LIBC + attach_function :getlogin, [ ], :string +end +puts "getlogin=#{Foo.getlogin}" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/getpid.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/getpid.rb new file mode 100644 index 000000000000..1720635bc52c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/getpid.rb @@ -0,0 +1,8 @@ +require 'ffi' + +module Foo + extend FFI::Library + ffi_lib FFI::Library::LIBC + attach_function :getpid, [ ], :int +end +puts "My pid=#{Foo.getpid}" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/gettimeofday.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/gettimeofday.rb new file mode 100644 index 000000000000..864bbb62b1d1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/gettimeofday.rb @@ -0,0 +1,18 @@ +require 'ffi' +require 'rbconfig' + +class Timeval < FFI::Struct + layout tv_sec: :ulong, tv_usec: :ulong +end +module LibC + extend FFI::Library + if FFI::Platform.windows? + ffi_lib RbConfig::CONFIG["LIBRUBY_SO"] + else + ffi_lib FFI::Library::LIBC + end + attach_function :gettimeofday, [ :pointer, :pointer ], :int +end +t = Timeval.new +LibC.gettimeofday(t.pointer, nil) +puts "t.tv_sec=#{t[:tv_sec]} t.tv_usec=#{t[:tv_usec]}" diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/hello.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/hello.rb new file mode 100644 index 000000000000..f2ccf3772209 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/hello.rb @@ -0,0 +1,8 @@ +require 'ffi' + +module Foo + extend FFI::Library + ffi_lib FFI::Library::LIBC + attach_function("cputs", "puts", [ :string ], :int) +end +Foo.cputs("Hello, World via libc puts using FFI on MRI ruby") diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/inotify.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/inotify.rb new file mode 100644 index 000000000000..018d78cfce05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/inotify.rb @@ -0,0 +1,60 @@ +require 'ffi' + +module Inotify + extend FFI::Library + ffi_lib FFI::Library::LIBC + class Event < FFI::Struct + layout \ + :wd, :int, + :mask, :uint, + :cookie, :uint, + :len, :uint + end + attach_function :init, :inotify_init, [ ], :int + attach_function :add_watch, :inotify_add_watch, [ :int, :string, :uint ], :int + attach_function :rm_watch, :inotify_rm_watch, [ :int, :uint ], :int + attach_function :read, [ :int, :buffer_out, :uint ], :int + IN_ACCESS=0x00000001 + IN_MODIFY=0x00000002 + IN_ATTRIB=0x00000004 + IN_CLOSE_WRITE=0x00000008 + IN_CLOSE_NOWRITE=0x00000010 + IN_CLOSE=(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) + IN_OPEN=0x00000020 + IN_MOVED_FROM=0x00000040 + IN_MOVED_TO=0x00000080 + IN_MOVE= (IN_MOVED_FROM | IN_MOVED_TO) + IN_CREATE=0x00000100 + IN_DELETE=0x00000200 + IN_DELETE_SELF=0x00000400 + IN_MOVE_SELF=0x00000800 + # Events sent by the kernel. + IN_UNMOUNT=0x00002000 + IN_Q_OVERFLOW=0x00004000 + IN_IGNORED=0x00008000 + IN_ONLYDIR=0x01000000 + IN_DONT_FOLLOW=0x02000000 + IN_MASK_ADD=0x20000000 + IN_ISDIR=0x40000000 + IN_ONESHOT=0x80000000 + IN_ALL_EVENTS=(IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE \ + | IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM \ + | IN_MOVED_TO | IN_CREATE | IN_DELETE \ + | IN_DELETE_SELF | IN_MOVE_SELF) + +end +if $0 == __FILE__ + fd = Inotify.init + puts "fd=#{fd}" + wd = Inotify.add_watch(fd, "/tmp/", Inotify::IN_ALL_EVENTS) + fp = FFI::IO.for_fd(fd) + puts "wfp=#{fp}" + while true + buf = FFI::Buffer.alloc_out(Inotify::Event.size + 4096, 1, false) + ev = Inotify::Event.new buf + ready = IO.select([ fp ], nil, nil, nil) + n = Inotify.read(fd, buf, buf.total) + puts "Read #{n} bytes from inotify fd" + puts "event.wd=#{ev[:wd]} mask=#{ev[:mask]} len=#{ev[:len]} name=#{ev[:len] > 0 ? buf.get_string(16) : 'unknown'}" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/pty.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/pty.rb new file mode 100644 index 000000000000..8b6b885f8535 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/pty.rb @@ -0,0 +1,75 @@ +require 'ffi' + +module PTY + private + module LibC + extend FFI::Library + ffi_lib FFI::Library::LIBC + attach_function :forkpty, [ :buffer_out, :buffer_out, :buffer_in, :buffer_in ], :int + attach_function :openpty, [ :buffer_out, :buffer_out, :buffer_out, :buffer_in, :buffer_in ], :int + attach_function :login_tty, [ :int ], :int + attach_function :close, [ :int ], :int + attach_function :strerror, [ :int ], :string + attach_function :fork, [], :int + attach_function :execv, [ :string, :buffer_in ], :int + attach_function :execvp, [ :string, :buffer_in ], :int + attach_function :dup2, [ :int, :int ], :int + attach_function :dup, [ :int ], :int + end + Buffer = FFI::Buffer + def self.build_args(args) + cmd = args.shift + cmd_args = args.map do |arg| + MemoryPointer.from_string(arg) + end + exec_args = MemoryPointer.new(:pointer, 1 + cmd_args.length + 1) + exec_cmd = MemoryPointer.from_string(cmd) + exec_args[0].put_pointer(0, exec_cmd) + cmd_args.each_with_index do |arg, i| + exec_args[i + 1].put_pointer(0, arg) + end + [ cmd, exec_args ] + end + public + def self.getpty(*args) + mfdp = Buffer.new :int + name = Buffer.new 1024 + # + # All the execv setup is done in the parent, since doing anything other than + # execv in the child after fork is really flakey + # + exec_cmd, exec_args = build_args(args) + pid = LibC.forkpty(mfdp, name, nil, nil) + raise "forkpty failed: #{LibC.strerror(FFI.errno)}" if pid < 0 + if pid == 0 + LibC.execvp(exec_cmd, exec_args) + exit 1 + end + masterfd = mfdp.get_int(0) + rfp = FFI::IO.for_fd(masterfd, "r") + wfp = FFI::IO.for_fd(LibC.dup(masterfd), "w") + if block_given? + yield rfp, wfp, pid + rfp.close unless rfp.closed? + wfp.close unless wfp.closed? + else + [ rfp, wfp, pid ] + end + end + def self.spawn(*args, &block) + self.getpty("/bin/sh", "-c", args[0], &block) + end +end +module LibC + extend FFI::Library + attach_function :close, [ :int ], :int + attach_function :write, [ :int, :buffer_in, :ulong ], :long + attach_function :read, [ :int, :buffer_out, :ulong ], :long +end +PTY.getpty("/bin/ls", "-alR", "/") { |rfd, wfd, pid| +#PTY.spawn("ls -laR /") { |rfd, wfd, pid| + puts "child pid=#{pid}" + while !rfd.eof? && (buf = rfd.gets) + puts "child: '#{buf.strip}'" + end +} diff --git a/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/qsort.rb b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/qsort.rb new file mode 100644 index 000000000000..58622c16285a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ffi-1.15.0/samples/qsort.rb @@ -0,0 +1,20 @@ +require 'ffi' + +module LibC + extend FFI::Library + ffi_lib FFI::Library::LIBC + callback :qsort_cmp, [ :pointer, :pointer ], :int + attach_function :qsort, [ :pointer, :ulong, :ulong, :qsort_cmp ], :int +end + +p = FFI::MemoryPointer.new(:int, 2) +p.put_array_of_int32(0, [ 2, 1 ]) +puts "ptr=#{p.inspect}" +puts "Before qsort #{p.get_array_of_int32(0, 2).join(', ')}" +LibC.qsort(p, 2, 4) do |p1, p2| + i1 = p1.get_int32(0) + i2 = p2.get_int32(0) + puts "In block: comparing #{i1} and #{i2}" + i1 < i2 ? -1 : i1 > i2 ? 1 : 0 +end +puts "After qsort #{p.get_array_of_int32(0, 2).join(', ')}" diff --git a/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/Gemfile new file mode 100644 index 000000000000..ea587c77083d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/Gemfile @@ -0,0 +1,24 @@ +# ---------------------------------------------------------------------------- +# Frozen-string-literal: true +# Copyright: 2015-2016 Jordon Bedwell - MIT License +# Encoding: utf-8 +# ---------------------------------------------------------------------------- + +source "https://rubygems.org" +gem "rake", :require => false +gemspec + +group :test do + gem "rspec-helpers", :require => false + gem "codeclimate-test-reporter", :require => false + gem "luna-rspec-formatters", :require => false + gem "rspec", :require => false +end + +group :development do + gem "luna-rubocop-formatters", :require => false + gem "rubocop", :github => "bbatsov/rubocop", :require => false + gem "pry", { + :require => false + } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/LICENSE b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/LICENSE new file mode 100644 index 000000000000..e603a7825bb4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2016 Jordon Bedwell + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/Rakefile new file mode 100644 index 000000000000..1c929e5c6aff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/Rakefile @@ -0,0 +1,13 @@ +# ---------------------------------------------------------------------------- +# Frozen-string-literal: true +# Copyright: 2015-2016 Jordon Bedwell - MIT License +# Encoding: utf-8 +# ---------------------------------------------------------------------------- + +$LOAD_PATH.unshift(File.expand_path("../lib", __FILE__)) +require "luna/rubocop/rake/task" +require "rspec/core/rake_task" + +task :default => [:spec] +RSpec::Core::RakeTask.new :spec +task :test => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb new file mode 100644 index 000000000000..fc694cf10bd3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb @@ -0,0 +1,202 @@ +# ---------------------------------------------------------------------------- +# Frozen-string-literal: true +# Copyright: 2015-2016 Jordon Bedwell - MIT License +# Encoding: utf-8 +# ---------------------------------------------------------------------------- + +require "forwardable/extended/version" +require "forwardable" + +module Forwardable + module Extended + + # ------------------------------------------------------------------------ + # Make our methods private on the class, there is no reason for public. + # ------------------------------------------------------------------------ + + def self.extended(klass) + instance_methods.each do |method| + klass.private_class_method( + method + ) + end + end + + # ------------------------------------------------------------------------ + # Delegate using a Rails-like interface. + # ------------------------------------------------------------------------ + + def rb_delegate(method, to: nil, alias_of: method, **kwd) + raise ArgumentError, "to must be provided" unless to + def_delegator( + to, alias_of, method, **kwd + ) + end + + # ------------------------------------------------------------------------ + # Delegate a method to a hash and key. + # ------------------------------------------------------------------------ + + def def_hash_delegator(hash, method, key: method, **kwd) + prefix, suffix, wrap = prepare_delegate(**kwd) + + if suffix + method = method.to_s.gsub( + /\?$/, "" + ) + end + + class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 9 + def #{method}#{suffix}(*args) + #{wrap}( + #{prefix}#{hash}[#{key.inspect}] + ) + + rescue Exception + if !Forwardable.debug && $@ && $@.respond_to?(:delete_if) + $@.delete_if do |source| + source =~ %r"#{Regexp.escape(__FILE__)}"o + end + end + + raise + end + STR + end + + # ------------------------------------------------------------------------ + # Delegate a method to an instance variable. + # ------------------------------------------------------------------------ + + def def_ivar_delegator(ivar, alias_ = ivar, **kwd) + prefix, suffix, wrap = prepare_delegate(**kwd) + + if suffix + alias_ = alias_.to_s.gsub( + /\?$/, "" + ) + end + + class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 9 + def #{alias_.to_s.gsub(/\A@/, "")}#{suffix} + #{wrap}( + #{prefix}#{ivar} + ) + + rescue Exception + if !Forwardable.debug && $@ && $@.respond_to?(:delete_if) + $@.delete_if do |source| + source =~ %r"#{Regexp.escape(__FILE__)}"o + end + end + + raise + end + STR + end + + # ------------------------------------------------------------------------ + # Like def_delegator but allows you to send args and do other stuff. + # ------------------------------------------------------------------------ + + def def_modern_delegator(accessor, method, alias_ = method, args: \ + { :before => [], :after => [] }, **kwd) + + prefix, suffix, wrap = prepare_delegate(**kwd) + args = { :before => args } unless args.is_a?(Hash) + b = [args[:before]].flatten.compact.map(&:to_s).join(", ") + a = [args[ :after]].flatten.compact.map(&:to_s).join(", ") + b = b + ", " unless args[:before].nil? || args[:before].empty? + a = ", " + a unless args[ :after].nil? || args[ :after].empty? + alias_ = alias_.to_s.gsub(/\?$/, "") if suffix + + class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 10 + def #{alias_}#{suffix}(*args, &block) + #{wrap}(#{prefix}#{accessor}.send( + #{method.inspect}, #{b}*args#{a}, &block + )) + + rescue Exception + if !Forwardable.debug && $@ && $@.respond_to?(:delete_if) + $@.delete_if do |source| + source =~ %r"#{Regexp.escape(__FILE__)}"o + end + end + + raise + end + STR + end + + # ------------------------------------------------------------------------ + # Wraps around traditional delegation and modern delegation. + # ------------------------------------------------------------------------ + + def def_delegator(accessor, method, alias_ = method, **kwd) + kwd, alias_ = alias_, method if alias_.is_a?(Hash) && !kwd.any? + + if alias_.is_a?(Hash) || !kwd.any? + Forwardable.instance_method(:def_delegator).bind(self) \ + .call(accessor, method, alias_) + + elsif !kwd[:type] + def_modern_delegator( + accessor, method, alias_, **kwd + ) + + else + raise ArgumentError, "Alias not supported." if alias_ != method + send("def_#{kwd[:type]}_delegator", accessor, method, **kwd.tap do |obj| + obj.delete(:type) + end) + end + end + + # ------------------------------------------------------------------------ + # Create multiple delegates at once. + # ------------------------------------------------------------------------ + + def def_delegators(accessor, *methods) + kwd = methods.shift if methods.first.is_a?(Hash) + kwd = methods.pop if methods. last.is_a?(Hash) + kwd = {} unless kwd + + methods.each do |method| + def_delegator accessor, method, **kwd + end + end + + # ------------------------------------------------------------------------ + # Prepares a delegate and it's few arguments. + # ------------------------------------------------------------------------ + + private + def prepare_delegate(wrap: nil, bool: false) + prefix = (bool == :reverse ? "!!!" : "!!") if bool + wrap = "self.class.new" if wrap.is_a?(TrueClass) + suffix = "?" if bool + + return [ + prefix, suffix, wrap + ] + end + + # ------------------------------------------------------------------------ + + private + def delegate_debug(str) + if Forwardable.debug && !Forwardable.debug.is_a?(TrueClass) + then Forwardable.debug.debug( + str + ) + + elsif Forwardable.debug + $stdout.puts( + "\n# ------\n\n", str + ) + end + + str + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb new file mode 100644 index 000000000000..063937569396 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb @@ -0,0 +1,9 @@ +# Frozen-string-literal: true +# Copyright: 2015-2016 Jordon Bedwell - MIT License +# Encoding: utf-8 + +module Forwardable + module Extended + VERSION = "2.6.0" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/README.md b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/README.md new file mode 100644 index 000000000000..5af0a49250aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/README.md @@ -0,0 +1,115 @@ +gemoji +====== + +This library contains character information about native emoji, as well as image +files for a few custom emoji. + + +Installation +------------ + +Add `gemoji` to your Gemfile. + +``` ruby +gem 'gemoji' +``` + +### Extract images + +To obtain image files as fallbacks for browsers and OS's that don't support +emoji, run the `gemoji extract` command **on macOS Sierra or later**: + +``` sh +bundle exec gemoji extract public/images/emoji +``` + +This will extract images into filenames such as: + +* `public/images/emoji/octocat.png` +* `public/images/emoji/unicode/1f9c0.png` (the `:cheese:` emoji) + + +Example Rails Helper +-------------------- + +This would allow emojifying content such as: `it's raining :cat:s and :dog:s!` + +See the [Emoji cheat sheet](http://www.emoji-cheat-sheet.com) for more examples. + +```ruby +module EmojiHelper + def emojify(content) + h(content).to_str.gsub(/:([\w+-]+):/) do |match| + if emoji = Emoji.find_by_alias($1) + %(<img alt="#$1" src="#{image_path("emoji/#{emoji.image_filename}")}" style="vertical-align:middle" width="20" height="20" />) + else + match + end + end.html_safe if content.present? + end +end +``` + +Unicode mapping +--------------- + +Translate emoji names to unicode and vice versa. + +```ruby +>> Emoji.find_by_alias("cat").raw +=> "🐱" # Don't see a cat? That's U+1F431. + +>> Emoji.find_by_unicode("\u{1f431}").name +=> "cat" +``` + +Adding new emoji +---------------- + +You can add new emoji characters to the `Emoji.all` list: + +```ruby +emoji = Emoji.create("music") do |char| + char.add_alias "song" + char.add_unicode_alias "\u{266b}" + char.add_tag "notes" +end + +emoji.name #=> "music" +emoji.raw #=> "♫" +emoji.image_filename #=> "unicode/266b.png" + +# Creating custom emoji (no Unicode aliases): +emoji = Emoji.create("music") do |char| + char.add_tag "notes" +end + +emoji.custom? #=> true +emoji.image_filename #=> "music.png" +``` + +As you create new emoji, you must ensure that you also create and put the images +they reference by their `image_filename` to your assets directory. + +You can customize `image_filename` with: + +```ruby +emoji = Emoji.create("music") do |char| + char.image_filename = "subdirectory/my_emoji.gif" +end +``` + +For existing emojis, you can edit the list of aliases or add new tags in an edit block: + +```ruby +emoji = Emoji.find_by_alias "musical_note" + +Emoji.edit_emoji(emoji) do |char| + char.add_alias "music" + char.add_unicode_alias "\u{266b}" + char.add_tag "notes" +end + +Emoji.find_by_alias "music" #=> emoji +Emoji.find_by_unicode "\u{266b}" #=> emoji +``` diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/bin/gemoji b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/bin/gemoji new file mode 100644 index 000000000000..fe62da7d066b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/bin/gemoji @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby +require 'emoji/cli' + +exit_code = Emoji::CLI.dispatch(ARGV) +exit exit_code diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/db/Category-Emoji.json b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/db/Category-Emoji.json new file mode 100644 index 000000000000..7e5a02658a9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/db/Category-Emoji.json @@ -0,0 +1,71 @@ +{ + "EmojiDataArray" : [ + { + "CVDataTitle" : "EmojiCategory-People", + "CVCategoryImage" : "Emoji-HumanImage", + "CVCategoryData" : { + "CVSkipNullGlyphs" : false, + "Data" : "😀,😃,😄,😁,😆,😅,😂,🤣,☺️,😊,😇,🙂,🙃,😉,😌,😍,😘,😗,😙,😚,😋,😜,😝,😛,🤑,🤗,🤓,😎,🤡,🤠,😏,😒,😞,😔,😟,😕,🙁,☹️,😣,😖,😫,😩,😤,😠,😡,😶,😐,😑,😯,😦,😧,😮,😲,😵,😳,😱,😨,😰,😢,😥,🤤,😭,😓,😪,😴,🙄,🤔,🤥,😬,🤐,🤢,🤧,😷,🤒,🤕,😈,👿,👹,👺,💩,👻,💀,☠️,👽,👾,🤖,🎃,😺,😸,😹,😻,😼,😽,🙀,😿,😾,👐,🙌,👏,🙏,🤝,👍,👎,👊,✊,🤛,🤜,🤞,✌️,🤘,👌,👈,👉,👆,👇,☝️,✋,🤚,🖐,🖖,👋,🤙,💪,🖕,✍️,🤳,💅,💍,💄,💋,👄,👅,👂,👃,👣,👁,👀,🗣,👤,👥,👶,👦,👧,👨,👩,👱‍♀️,👱,👴,👵,👲,👳‍♀️,👳,👮‍♀️,👮,👷‍♀️,👷,💂‍♀️,💂,🕵️‍♀️,🕵️,👩‍⚕️,👨‍⚕️,👩‍🌾,👨‍🌾,👩‍🍳,👨‍🍳,👩‍🎓,👨‍🎓,👩‍🎤,👨‍🎤,👩‍🏫,👨‍🏫,👩‍🏭,👨‍🏭,👩‍💻,👨‍💻,👩‍💼,👨‍💼,👩‍🔧,👨‍🔧,👩‍🔬,👨‍🔬,👩‍🎨,👨‍🎨,👩‍🚒,👨‍🚒,👩‍✈️,👨‍✈️,👩‍🚀,👨‍🚀,👩‍⚖️,👨‍⚖️,🤶,🎅,👸,🤴,👰,🤵,👼,🤰,🙇‍♀️,🙇,💁,💁‍♂️,🙅,🙅‍♂️,🙆,🙆‍♂️,🙋,🙋‍♂️,🤦‍♀️,🤦‍♂️,🤷‍♀️,🤷‍♂️,🙎,🙎‍♂️,🙍,🙍‍♂️,💇,💇‍♂️,💆,💆‍♂️,🕴,💃,🕺,👯,👯‍♂️,🚶‍♀️,🚶,🏃‍♀️,🏃,👫,👭,👬,💑,👩‍❤️‍👩,👨‍❤️‍👨,💏,👩‍❤️‍💋‍👩,👨‍❤️‍💋‍👨,👪,👨‍👩‍👧,👨‍👩‍👧‍👦,👨‍👩‍👦‍👦,👨‍👩‍👧‍👧,👩‍👩‍👦,👩‍👩‍👧,👩‍👩‍👧‍👦,👩‍👩‍👦‍👦,👩‍👩‍👧‍👧,👨‍👨‍👦,👨‍👨‍👧,👨‍👨‍👧‍👦,👨‍👨‍👦‍👦,👨‍👨‍👧‍👧,👩‍👦,👩‍👧,👩‍👧‍👦,👩‍👦‍👦,👩‍👧‍👧,👨‍👦,👨‍👧,👨‍👧‍👦,👨‍👦‍👦,👨‍👧‍👧,👚,👕,👖,👔,👗,👙,👘,👠,👡,👢,👞,👟,👒,🎩,🎓,👑,⛑,🎒,👝,👛,👜,💼,👓,🕶,🌂,☂️" + } + }, + { + "CVDataTitle" : "EmojiCategory-Nature", + "CVCategoryImage" : "Emoji-NatureImage", + "CVCategoryData" : { + "CVSkipNullGlyphs" : false, + "Data" : "🐶,🐱,🐭,🐹,🐰,🦊,🐻,🐼,🐨,🐯,🦁,🐮,🐷,🐽,🐸,🐵,🙈,🙉,🙊,🐒,🐔,🐧,🐦,🐤,🐣,🐥,🦆,🦅,🦉,🦇,🐺,🐗,🐴,🦄,🐝,🐛,🦋,🐌,🐚,🐞,🐜,🕷,🕸,🐢,🐍,🦎,🦂,🦀,🦑,🐙,🦐,🐠,🐟,🐡,🐬,🦈,🐳,🐋,🐊,🐆,🐅,🐃,🐂,🐄,🦌,🐪,🐫,🐘,🦏,🦍,🐎,🐖,🐐,🐏,🐑,🐕,🐩,🐈,🐓,🦃,🕊,🐇,🐁,🐀,🐿,🐾,🐉,🐲,🌵,🎄,🌲,🌳,🌴,🌱,🌿,☘️,🍀,🎍,🎋,🍃,🍂,🍁,🍄,🌾,💐,🌷,🌹,🥀,🌻,🌼,🌸,🌺,🌎,🌍,🌏,🌕,🌖,🌗,🌘,🌑,🌒,🌓,🌔,🌚,🌝,🌞,🌛,🌜,🌙,💫,⭐️,🌟,✨,⚡️,🔥,💥,☄️,☀️,🌤,⛅️,🌥,🌦,🌈,☁️,🌧,⛈,🌩,🌨,☃️,⛄️,❄️,🌬,💨,🌪,🌫,🌊,💧,💦,☔️" + } + }, + { + "CVDataTitle" : "EmojiCategory-Foods", + "CVCategoryImage" : "Emoji-FoodsImage", + "CVCategoryData" : { + "CVSkipNullGlyphs" : false, + "Data" : "🍏,🍎,🍐,🍊,🍋,🍌,🍉,🍇,🍓,🍈,🍒,🍑,🍍,🥝,🥑,🍅,🍆,🥒,🥕,🌽,🌶,🥔,🍠,🌰,🥜,🍯,🥐,🍞,🥖,🧀,🥚,🍳,🥓,🥞,🍤,🍗,🍖,🍕,🌭,🍔,🍟,🥙,🌮,🌯,🥗,🥘,🍝,🍜,🍲,🍥,🍣,🍱,🍛,🍚,🍙,🍘,🍢,🍡,🍧,🍨,🍦,🍰,🎂,🍮,🍭,🍬,🍫,🍿,🍩,🍪,🥛,🍼,☕️,🍵,🍶,🍺,🍻,🥂,🍷,🥃,🍸,🍹,🍾,🥄,🍴,🍽" + } + }, + { + "CVDataTitle" : "EmojiCategory-Activity", + "CVCategoryImage" : "Emoji-ActivityImage", + "CVCategoryData" : { + "CVSkipNullGlyphs" : false, + "Data" : "⚽️,🏀,🏈,⚾️,🎾,🏐,🏉,🎱,🏓,🏸,🥅,🏒,🏑,🏏,⛳️,🏹,🎣,🥊,🥋,⛸,🎿,⛷,🏂,🏋️‍♀️,🏋️,🤺,🤼‍♀️,🤼‍♂️,🤸‍♀️,🤸‍♂️,⛹️‍♀️,⛹️,🤾‍♀️,🤾‍♂️,🏌️‍♀️,🏌️,🏄‍♀️,🏄,🏊‍♀️,🏊,🤽‍♀️,🤽‍♂️,🚣‍♀️,🚣,🏇,🚴‍♀️,🚴,🚵‍♀️,🚵,🎽,🏅,🎖,🥇,🥈,🥉,🏆,🏵,🎗,🎫,🎟,🎪,🤹‍♀️,🤹‍♂️,🎭,🎨,🎬,🎤,🎧,🎼,🎹,🥁,🎷,🎺,🎸,🎻,🎲,🎯,🎳,🎮,🎰" + } + }, + { + "CVDataTitle" : "EmojiCategory-Places", + "CVCategoryImage" : "Emoji-PlacesImage", + "CVCategoryData" : { + "CVSkipNullGlyphs" : false, + "Data" : "🚗,🚕,🚙,🚌,🚎,🏎,🚓,🚑,🚒,🚐,🚚,🚛,🚜,🛴,🚲,🛵,🏍,🚨,🚔,🚍,🚘,🚖,🚡,🚠,🚟,🚃,🚋,🚞,🚝,🚄,🚅,🚈,🚂,🚆,🚇,🚊,🚉,🚁,🛩,✈️,🛫,🛬,🚀,🛰,💺,🛶,⛵️,🛥,🚤,🛳,⛴,🚢,⚓️,🚧,⛽️,🚏,🚦,🚥,🗺,🗿,🗽,⛲️,🗼,🏰,🏯,🏟,🎡,🎢,🎠,⛱,🏖,🏝,⛰,🏔,🗻,🌋,🏜,🏕,⛺️,🛤,🛣,🏗,🏭,🏠,🏡,🏘,🏚,🏢,🏬,🏣,🏤,🏥,🏦,🏨,🏪,🏫,🏩,💒,🏛,⛪️,🕌,🕍,🕋,⛩,🗾,🎑,🏞,🌅,🌄,🌠,🎇,🎆,🌇,🌆,🏙,🌃,🌌,🌉,🌁" + } + }, + { + "CVDataTitle" : "EmojiCategory-Objects", + "CVCategoryImage" : "Emoji-ObjectsImage", + "CVCategoryData" : { + "CVSkipNullGlyphs" : false, + "Data" : "⌚️,📱,📲,💻,⌨️,🖥,🖨,🖱,🖲,🕹,🗜,💽,💾,💿,📀,📼,📷,📸,📹,🎥,📽,🎞,📞,☎️,📟,📠,📺,📻,🎙,🎚,🎛,⏱,⏲,⏰,🕰,⌛️,⏳,📡,🔋,🔌,💡,🔦,🕯,🗑,🛢,💸,💵,💴,💶,💷,💰,💳,💎,⚖️,🔧,🔨,⚒,🛠,⛏,🔩,⚙️,⛓,🔫,💣,🔪,🗡,⚔️,🛡,🚬,⚰️,⚱️,🏺,🔮,📿,💈,⚗️,🔭,🔬,🕳,💊,💉,🌡,🚽,🚰,🚿,🛁,🛀,🛎,🔑,🗝,🚪,🛋,🛏,🛌,🖼,🛍,🛒,🎁,🎈,🎏,🎀,🎊,🎉,🎎,🏮,🎐,✉️,📩,📨,📧,💌,📥,📤,📦,🏷,📪,📫,📬,📭,📮,📯,📜,📃,📄,📑,📊,📈,📉,🗒,🗓,📆,📅,📇,🗃,🗳,🗄,📋,📁,📂,🗂,🗞,📰,📓,📔,📒,📕,📗,📘,📙,📚,📖,🔖,🔗,📎,🖇,📐,📏,📌,📍,✂️,🖊,🖋,✒️,🖌,🖍,📝,✏️,🔍,🔎,🔏,🔐,🔒,🔓" + } + }, + { + "CVDataTitle" : "EmojiCategory-Symbols", + "CVCategoryImage" : "Emoji-SymbolImage", + "CVCategoryData" : { + "CVSkipNullGlyphs" : false, + "Data" : "❤️,💛,💚,💙,💜,🖤,💔,❣️,💕,💞,💓,💗,💖,💘,💝,💟,☮️,✝️,☪️,🕉,☸️,✡️,🔯,🕎,☯️,☦️,🛐,⛎,♈️,♉️,♊️,♋️,♌️,♍️,♎️,♏️,♐️,♑️,♒️,♓️,🆔,⚛️,🉑,☢️,☣️,📴,📳,🈶,🈚️,🈸,🈺,🈷️,✴️,🆚,💮,🉐,㊙️,㊗️,🈴,🈵,🈹,🈲,🅰️,🅱️,🆎,🆑,🅾️,🆘,❌,⭕️,🛑,⛔️,📛,🚫,💯,💢,♨️,🚷,🚯,🚳,🚱,🔞,📵,🚭,❗️,❕,❓,❔,‼️,⁉️,🔅,🔆,〽️,⚠️,🚸,🔱,⚜️,🔰,♻️,✅,🈯️,💹,❇️,✳️,❎,🌐,💠,Ⓜ️,🌀,💤,🏧,🚾,♿️,🅿️,🈳,🈂️,🛂,🛃,🛄,🛅,🚹,🚺,🚼,🚻,🚮,🎦,📶,🈁,🔣,ℹ️,🔤,🔡,🔠,🆖,🆗,🆙,🆒,🆕,🆓,0️⃣,1️⃣,2️⃣,3️⃣,4️⃣,5️⃣,6️⃣,7️⃣,8️⃣,9️⃣,🔟,🔢,#️⃣,*️⃣,▶️,⏸,⏯,⏹,⏺,⏭,⏮,⏩,⏪,⏫,⏬,◀️,🔼,🔽,➡️,⬅️,⬆️,⬇️,↗️,↘️,↙️,↖️,↕️,↔️,↪️,↩️,⤴️,⤵️,🔀,🔁,🔂,🔄,🔃,🎵,🎶,➕,➖,➗,✖️,💲,💱,™️,©️,®️,〰️,➰,➿,🔚,🔙,🔛,🔝,🔜,✔️,☑️,🔘,⚪️,⚫️,🔴,🔵,🔺,🔻,🔸,🔹,🔶,🔷,🔳,🔲,▪️,▫️,◾️,◽️,◼️,◻️,⬛️,⬜️,🔈,🔇,🔉,🔊,🔔,🔕,📣,📢,👁‍🗨,💬,💭,🗯,♠️,♣️,♥️,♦️,🃏,🎴,🀄️,🕐,🕑,🕒,🕓,🕔,🕕,🕖,🕗,🕘,🕙,🕚,🕛,🕜,🕝,🕞,🕟,🕠,🕡,🕢,🕣,🕤,🕥,🕦,🕧" + } + }, + { + "CVDataTitle" : "EmojiCategory-Flags", + "CVCategoryImage" : "Emoji-FlagsImage", + "CVCategoryData" : { + "CVSkipNullGlyphs" : false, + "Data" : "🏳️,🏴,🏁,🚩,🏳️‍🌈,🇦🇫,🇦🇽,🇦🇱,🇩🇿,🇦🇸,🇦🇩,🇦🇴,🇦🇮,🇦🇶,🇦🇬,🇦🇷,🇦🇲,🇦🇼,🇦🇺,🇦🇹,🇦🇿,🇧🇸,🇧🇭,🇧🇩,🇧🇧,🇧🇾,🇧🇪,🇧🇿,🇧🇯,🇧🇲,🇧🇹,🇧🇴,🇧🇶,🇧🇦,🇧🇼,🇧🇷,🇮🇴,🇻🇬,🇧🇳,🇧🇬,🇧🇫,🇧🇮,🇨🇻,🇰🇭,🇨🇲,🇨🇦,🇮🇨,🇰🇾,🇨🇫,🇹🇩,🇨🇱,🇨🇳,🇨🇽,🇨🇨,🇨🇴,🇰🇲,🇨🇬,🇨🇩,🇨🇰,🇨🇷,🇨🇮,🇭🇷,🇨🇺,🇨🇼,🇨🇾,🇨🇿,🇩🇰,🇩🇯,🇩🇲,🇩🇴,🇪🇨,🇪🇬,🇸🇻,🇬🇶,🇪🇷,🇪🇪,🇪🇹,🇪🇺,🇫🇰,🇫🇴,🇫🇯,🇫🇮,🇫🇷,🇬🇫,🇵🇫,🇹🇫,🇬🇦,🇬🇲,🇬🇪,🇩🇪,🇬🇭,🇬🇮,🇬🇷,🇬🇱,🇬🇩,🇬🇵,🇬🇺,🇬🇹,🇬🇬,🇬🇳,🇬🇼,🇬🇾,🇭🇹,🇭🇳,🇭🇰,🇭🇺,🇮🇸,🇮🇳,🇮🇩,🇮🇷,🇮🇶,🇮🇪,🇮🇲,🇮🇱,🇮🇹,🇯🇲,🇯🇵,🎌,🇯🇪,🇯🇴,🇰🇿,🇰🇪,🇰🇮,🇽🇰,🇰🇼,🇰🇬,🇱🇦,🇱🇻,🇱🇧,🇱🇸,🇱🇷,🇱🇾,🇱🇮,🇱🇹,🇱🇺,🇲🇴,🇲🇰,🇲🇬,🇲🇼,🇲🇾,🇲🇻,🇲🇱,🇲🇹,🇲🇭,🇲🇶,🇲🇷,🇲🇺,🇾🇹,🇲🇽,🇫🇲,🇲🇩,🇲🇨,🇲🇳,🇲🇪,🇲🇸,🇲🇦,🇲🇿,🇲🇲,🇳🇦,🇳🇷,🇳🇵,🇳🇱,🇳🇨,🇳🇿,🇳🇮,🇳🇪,🇳🇬,🇳🇺,🇳🇫,🇲🇵,🇰🇵,🇳🇴,🇴🇲,🇵🇰,🇵🇼,🇵🇸,🇵🇦,🇵🇬,🇵🇾,🇵🇪,🇵🇭,🇵🇳,🇵🇱,🇵🇹,🇵🇷,🇶🇦,🇷🇪,🇷🇴,🇷🇺,🇷🇼,🇧🇱,🇸🇭,🇰🇳,🇱🇨,🇵🇲,🇻🇨,🇼🇸,🇸🇲,🇸🇹,🇸🇦,🇸🇳,🇷🇸,🇸🇨,🇸🇱,🇸🇬,🇸🇽,🇸🇰,🇸🇮,🇸🇧,🇸🇴,🇿🇦,🇬🇸,🇰🇷,🇸🇸,🇪🇸,🇱🇰,🇸🇩,🇸🇷,🇸🇿,🇸🇪,🇨🇭,🇸🇾,🇹🇼,🇹🇯,🇹🇿,🇹🇭,🇹🇱,🇹🇬,🇹🇰,🇹🇴,🇹🇹,🇹🇳,🇹🇷,🇹🇲,🇹🇨,🇹🇻,🇺🇬,🇺🇦,🇦🇪,🇬🇧,🇺🇸,🇻🇮,🇺🇾,🇺🇿,🇻🇺,🇻🇦,🇻🇪,🇻🇳,🇼🇫,🇪🇭,🇾🇪,🇿🇲,🇿🇼" + } + } + ], + "CVViewFontList" : [ + "AppleColorEmoji" + ] +} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/db/emoji.json b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/db/emoji.json new file mode 100644 index 000000000000..87d719dfa94e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/db/emoji.json @@ -0,0 +1,17969 @@ +[ + { + "emoji": "😀" + , "description": "grinning face" + , "category": "People" + , "aliases": [ + "grinning" + ] + , "tags": [ + "smile" + , "happy" + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "😃" + , "description": "smiling face with open mouth" + , "category": "People" + , "aliases": [ + "smiley" + ] + , "tags": [ + "happy" + , "joy" + , "haha" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😄" + , "description": "smiling face with open mouth & smiling eyes" + , "category": "People" + , "aliases": [ + "smile" + ] + , "tags": [ + "happy" + , "joy" + , "laugh" + , "pleased" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😁" + , "description": "grinning face with smiling eyes" + , "category": "People" + , "aliases": [ + "grin" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😆" + , "description": "smiling face with open mouth & closed eyes" + , "category": "People" + , "aliases": [ + "laughing" + , "satisfied" + ] + , "tags": [ + "happy" + , "haha" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😅" + , "description": "smiling face with open mouth & cold sweat" + , "category": "People" + , "aliases": [ + "sweat_smile" + ] + , "tags": [ + "hot" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😂" + , "description": "face with tears of joy" + , "category": "People" + , "aliases": [ + "joy" + ] + , "tags": [ + "tears" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤣" + , "description": "rolling on the floor laughing" + , "category": "People" + , "aliases": [ + "rofl" + ] + , "tags": [ + "lol" + , "laughing" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "☺️" + , "description": "smiling face" + , "category": "People" + , "aliases": [ + "relaxed" + ] + , "tags": [ + "blush" + , "pleased" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "😊" + , "description": "smiling face with smiling eyes" + , "category": "People" + , "aliases": [ + "blush" + ] + , "tags": [ + "proud" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😇" + , "description": "smiling face with halo" + , "category": "People" + , "aliases": [ + "innocent" + ] + , "tags": [ + "angel" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙂" + , "description": "slightly smiling face" + , "category": "People" + , "aliases": [ + "slightly_smiling_face" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🙃" + , "description": "upside-down face" + , "category": "People" + , "aliases": [ + "upside_down_face" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "😉" + , "description": "winking face" + , "category": "People" + , "aliases": [ + "wink" + ] + , "tags": [ + "flirt" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😌" + , "description": "relieved face" + , "category": "People" + , "aliases": [ + "relieved" + ] + , "tags": [ + "whew" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😍" + , "description": "smiling face with heart-eyes" + , "category": "People" + , "aliases": [ + "heart_eyes" + ] + , "tags": [ + "love" + , "crush" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😘" + , "description": "face blowing a kiss" + , "category": "People" + , "aliases": [ + "kissing_heart" + ] + , "tags": [ + "flirt" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😗" + , "description": "kissing face" + , "category": "People" + , "aliases": [ + "kissing" + ] + , "tags": [ + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "😙" + , "description": "kissing face with smiling eyes" + , "category": "People" + , "aliases": [ + "kissing_smiling_eyes" + ] + , "tags": [ + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "😚" + , "description": "kissing face with closed eyes" + , "category": "People" + , "aliases": [ + "kissing_closed_eyes" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😋" + , "description": "face savouring delicious food" + , "category": "People" + , "aliases": [ + "yum" + ] + , "tags": [ + "tongue" + , "lick" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😜" + , "description": "face with stuck-out tongue & winking eye" + , "category": "People" + , "aliases": [ + "stuck_out_tongue_winking_eye" + ] + , "tags": [ + "prank" + , "silly" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😝" + , "description": "face with stuck-out tongue & closed eyes" + , "category": "People" + , "aliases": [ + "stuck_out_tongue_closed_eyes" + ] + , "tags": [ + "prank" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😛" + , "description": "face with stuck-out tongue" + , "category": "People" + , "aliases": [ + "stuck_out_tongue" + ] + , "tags": [ + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "🤑" + , "description": "money-mouth face" + , "category": "People" + , "aliases": [ + "money_mouth_face" + ] + , "tags": [ + "rich" + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🤗" + , "description": "hugging face" + , "category": "People" + , "aliases": [ + "hugs" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🤓" + , "description": "nerd face" + , "category": "People" + , "aliases": [ + "nerd_face" + ] + , "tags": [ + "geek" + , "glasses" + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "😎" + , "description": "smiling face with sunglasses" + , "category": "People" + , "aliases": [ + "sunglasses" + ] + , "tags": [ + "cool" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤡" + , "description": "clown face" + , "category": "People" + , "aliases": [ + "clown_face" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤠" + , "description": "cowboy hat face" + , "category": "People" + , "aliases": [ + "cowboy_hat_face" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "😏" + , "description": "smirking face" + , "category": "People" + , "aliases": [ + "smirk" + ] + , "tags": [ + "smug" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😒" + , "description": "unamused face" + , "category": "People" + , "aliases": [ + "unamused" + ] + , "tags": [ + "meh" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😞" + , "description": "disappointed face" + , "category": "People" + , "aliases": [ + "disappointed" + ] + , "tags": [ + "sad" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😔" + , "description": "pensive face" + , "category": "People" + , "aliases": [ + "pensive" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😟" + , "description": "worried face" + , "category": "People" + , "aliases": [ + "worried" + ] + , "tags": [ + "nervous" + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "😕" + , "description": "confused face" + , "category": "People" + , "aliases": [ + "confused" + ] + , "tags": [ + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "🙁" + , "description": "slightly frowning face" + , "category": "People" + , "aliases": [ + "slightly_frowning_face" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "☹️" + , "description": "frowning face" + , "category": "People" + , "aliases": [ + "frowning_face" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "😣" + , "description": "persevering face" + , "category": "People" + , "aliases": [ + "persevere" + ] + , "tags": [ + "struggling" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😖" + , "description": "confounded face" + , "category": "People" + , "aliases": [ + "confounded" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😫" + , "description": "tired face" + , "category": "People" + , "aliases": [ + "tired_face" + ] + , "tags": [ + "upset" + , "whine" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😩" + , "description": "weary face" + , "category": "People" + , "aliases": [ + "weary" + ] + , "tags": [ + "tired" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😤" + , "description": "face with steam from nose" + , "category": "People" + , "aliases": [ + "triumph" + ] + , "tags": [ + "smug" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😠" + , "description": "angry face" + , "category": "People" + , "aliases": [ + "angry" + ] + , "tags": [ + "mad" + , "annoyed" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😡" + , "description": "pouting face" + , "category": "People" + , "aliases": [ + "rage" + , "pout" + ] + , "tags": [ + "angry" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😶" + , "description": "face without mouth" + , "category": "People" + , "aliases": [ + "no_mouth" + ] + , "tags": [ + "mute" + , "silence" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😐" + , "description": "neutral face" + , "category": "People" + , "aliases": [ + "neutral_face" + ] + , "tags": [ + "meh" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😑" + , "description": "expressionless face" + , "category": "People" + , "aliases": [ + "expressionless" + ] + , "tags": [ + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "😯" + , "description": "hushed face" + , "category": "People" + , "aliases": [ + "hushed" + ] + , "tags": [ + "silence" + , "speechless" + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "😦" + , "description": "frowning face with open mouth" + , "category": "People" + , "aliases": [ + "frowning" + ] + , "tags": [ + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "😧" + , "description": "anguished face" + , "category": "People" + , "aliases": [ + "anguished" + ] + , "tags": [ + "stunned" + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "😮" + , "description": "face with open mouth" + , "category": "People" + , "aliases": [ + "open_mouth" + ] + , "tags": [ + "surprise" + , "impressed" + , "wow" + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "😲" + , "description": "astonished face" + , "category": "People" + , "aliases": [ + "astonished" + ] + , "tags": [ + "amazed" + , "gasp" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😵" + , "description": "dizzy face" + , "category": "People" + , "aliases": [ + "dizzy_face" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😳" + , "description": "flushed face" + , "category": "People" + , "aliases": [ + "flushed" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😱" + , "description": "face screaming in fear" + , "category": "People" + , "aliases": [ + "scream" + ] + , "tags": [ + "horror" + , "shocked" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😨" + , "description": "fearful face" + , "category": "People" + , "aliases": [ + "fearful" + ] + , "tags": [ + "scared" + , "shocked" + , "oops" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😰" + , "description": "face with open mouth & cold sweat" + , "category": "People" + , "aliases": [ + "cold_sweat" + ] + , "tags": [ + "nervous" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😢" + , "description": "crying face" + , "category": "People" + , "aliases": [ + "cry" + ] + , "tags": [ + "sad" + , "tear" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😥" + , "description": "disappointed but relieved face" + , "category": "People" + , "aliases": [ + "disappointed_relieved" + ] + , "tags": [ + "phew" + , "sweat" + , "nervous" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤤" + , "description": "drooling face" + , "category": "People" + , "aliases": [ + "drooling_face" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "😭" + , "description": "loudly crying face" + , "category": "People" + , "aliases": [ + "sob" + ] + , "tags": [ + "sad" + , "cry" + , "bawling" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😓" + , "description": "face with cold sweat" + , "category": "People" + , "aliases": [ + "sweat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😪" + , "description": "sleepy face" + , "category": "People" + , "aliases": [ + "sleepy" + ] + , "tags": [ + "tired" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😴" + , "description": "sleeping face" + , "category": "People" + , "aliases": [ + "sleeping" + ] + , "tags": [ + "zzz" + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "🙄" + , "description": "face with rolling eyes" + , "category": "People" + , "aliases": [ + "roll_eyes" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🤔" + , "description": "thinking face" + , "category": "People" + , "aliases": [ + "thinking" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🤥" + , "description": "lying face" + , "category": "People" + , "aliases": [ + "lying_face" + ] + , "tags": [ + "liar" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "😬" + , "description": "grimacing face" + , "category": "People" + , "aliases": [ + "grimacing" + ] + , "tags": [ + ] + , "unicode_version": "6.1" + , "ios_version": "6.0" + } +, { + "emoji": "🤐" + , "description": "zipper-mouth face" + , "category": "People" + , "aliases": [ + "zipper_mouth_face" + ] + , "tags": [ + "silence" + , "hush" + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🤢" + , "description": "nauseated face" + , "category": "People" + , "aliases": [ + "nauseated_face" + ] + , "tags": [ + "sick" + , "barf" + , "disgusted" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤧" + , "description": "sneezing face" + , "category": "People" + , "aliases": [ + "sneezing_face" + ] + , "tags": [ + "achoo" + , "sick" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "😷" + , "description": "face with medical mask" + , "category": "People" + , "aliases": [ + "mask" + ] + , "tags": [ + "sick" + , "ill" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤒" + , "description": "face with thermometer" + , "category": "People" + , "aliases": [ + "face_with_thermometer" + ] + , "tags": [ + "sick" + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🤕" + , "description": "face with head-bandage" + , "category": "People" + , "aliases": [ + "face_with_head_bandage" + ] + , "tags": [ + "hurt" + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "😈" + , "description": "smiling face with horns" + , "category": "People" + , "aliases": [ + "smiling_imp" + ] + , "tags": [ + "devil" + , "evil" + , "horns" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👿" + , "description": "angry face with horns" + , "category": "People" + , "aliases": [ + "imp" + ] + , "tags": [ + "angry" + , "devil" + , "evil" + , "horns" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👹" + , "description": "ogre" + , "category": "People" + , "aliases": [ + "japanese_ogre" + ] + , "tags": [ + "monster" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👺" + , "description": "goblin" + , "category": "People" + , "aliases": [ + "japanese_goblin" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💩" + , "description": "pile of poo" + , "category": "People" + , "aliases": [ + "hankey" + , "poop" + , "shit" + ] + , "tags": [ + "crap" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👻" + , "description": "ghost" + , "category": "People" + , "aliases": [ + "ghost" + ] + , "tags": [ + "halloween" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💀" + , "description": "skull" + , "category": "People" + , "aliases": [ + "skull" + ] + , "tags": [ + "dead" + , "danger" + , "poison" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☠️" + , "description": "skull and crossbones" + , "category": "People" + , "aliases": [ + "skull_and_crossbones" + ] + , "tags": [ + "danger" + , "pirate" + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "👽" + , "description": "alien" + , "category": "People" + , "aliases": [ + "alien" + ] + , "tags": [ + "ufo" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👾" + , "description": "alien monster" + , "category": "People" + , "aliases": [ + "space_invader" + ] + , "tags": [ + "game" + , "retro" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤖" + , "description": "robot face" + , "category": "People" + , "aliases": [ + "robot" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎃" + , "description": "jack-o-lantern" + , "category": "People" + , "aliases": [ + "jack_o_lantern" + ] + , "tags": [ + "halloween" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😺" + , "description": "smiling cat face with open mouth" + , "category": "People" + , "aliases": [ + "smiley_cat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😸" + , "description": "grinning cat face with smiling eyes" + , "category": "People" + , "aliases": [ + "smile_cat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😹" + , "description": "cat face with tears of joy" + , "category": "People" + , "aliases": [ + "joy_cat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😻" + , "description": "smiling cat face with heart-eyes" + , "category": "People" + , "aliases": [ + "heart_eyes_cat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😼" + , "description": "cat face with wry smile" + , "category": "People" + , "aliases": [ + "smirk_cat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😽" + , "description": "kissing cat face with closed eyes" + , "category": "People" + , "aliases": [ + "kissing_cat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙀" + , "description": "weary cat face" + , "category": "People" + , "aliases": [ + "scream_cat" + ] + , "tags": [ + "horror" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😿" + , "description": "crying cat face" + , "category": "People" + , "aliases": [ + "crying_cat_face" + ] + , "tags": [ + "sad" + , "tear" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "😾" + , "description": "pouting cat face" + , "category": "People" + , "aliases": [ + "pouting_cat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👐" + , "description": "open hands" + , "category": "People" + , "aliases": [ + "open_hands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙌" + , "description": "raising hands" + , "category": "People" + , "aliases": [ + "raised_hands" + ] + , "tags": [ + "hooray" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👏" + , "description": "clapping hands" + , "category": "People" + , "aliases": [ + "clap" + ] + , "tags": [ + "praise" + , "applause" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙏" + , "description": "folded hands" + , "category": "People" + , "aliases": [ + "pray" + ] + , "tags": [ + "please" + , "hope" + , "wish" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤝" + , "description": "handshake" + , "category": "People" + , "aliases": [ + "handshake" + ] + , "tags": [ + "deal" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "👍" + , "description": "thumbs up" + , "category": "People" + , "aliases": [ + "+1" + , "thumbsup" + ] + , "tags": [ + "approve" + , "ok" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👎" + , "description": "thumbs down" + , "category": "People" + , "aliases": [ + "-1" + , "thumbsdown" + ] + , "tags": [ + "disapprove" + , "bury" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👊" + , "description": "oncoming fist" + , "category": "People" + , "aliases": [ + "fist_oncoming" + , "facepunch" + , "punch" + ] + , "tags": [ + "attack" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "✊" + , "description": "raised fist" + , "category": "People" + , "aliases": [ + "fist_raised" + , "fist" + ] + , "tags": [ + "power" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤛" + , "description": "left-facing fist" + , "category": "People" + , "aliases": [ + "fist_left" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤜" + , "description": "right-facing fist" + , "category": "People" + , "aliases": [ + "fist_right" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤞" + , "description": "crossed fingers" + , "category": "People" + , "aliases": [ + "crossed_fingers" + ] + , "tags": [ + "luck" + , "hopeful" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "✌️" + , "description": "victory hand" + , "category": "People" + , "aliases": [ + "v" + ] + , "tags": [ + "victory" + , "peace" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🤘" + , "description": "sign of the horns" + , "category": "People" + , "aliases": [ + "metal" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "👌" + , "description": "OK hand" + , "category": "People" + , "aliases": [ + "ok_hand" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👈" + , "description": "backhand index pointing left" + , "category": "People" + , "aliases": [ + "point_left" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👉" + , "description": "backhand index pointing right" + , "category": "People" + , "aliases": [ + "point_right" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👆" + , "description": "backhand index pointing up" + , "category": "People" + , "aliases": [ + "point_up_2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👇" + , "description": "backhand index pointing down" + , "category": "People" + , "aliases": [ + "point_down" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☝️" + , "description": "index pointing up" + , "category": "People" + , "aliases": [ + "point_up" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "✋" + , "description": "raised hand" + , "category": "People" + , "aliases": [ + "hand" + , "raised_hand" + ] + , "tags": [ + "highfive" + , "stop" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤚" + , "description": "raised back of hand" + , "category": "People" + , "aliases": [ + "raised_back_of_hand" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🖐" + , "description": "raised hand with fingers splayed" + , "category": "People" + , "aliases": [ + "raised_hand_with_fingers_splayed" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🖖" + , "description": "vulcan salute" + , "category": "People" + , "aliases": [ + "vulcan_salute" + ] + , "tags": [ + "prosper" + , "spock" + ] + , "unicode_version": "7.0" + , "ios_version": "8.3" + } +, { + "emoji": "👋" + , "description": "waving hand" + , "category": "People" + , "aliases": [ + "wave" + ] + , "tags": [ + "goodbye" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤙" + , "description": "call me hand" + , "category": "People" + , "aliases": [ + "call_me_hand" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "💪" + , "description": "flexed biceps" + , "category": "People" + , "aliases": [ + "muscle" + ] + , "tags": [ + "flex" + , "bicep" + , "strong" + , "workout" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🖕" + , "description": "middle finger" + , "category": "People" + , "aliases": [ + "middle_finger" + , "fu" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "✍️" + , "description": "writing hand" + , "category": "People" + , "aliases": [ + "writing_hand" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "🤳" + , "description": "selfie" + , "category": "People" + , "aliases": [ + "selfie" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "💅" + , "description": "nail polish" + , "category": "People" + , "aliases": [ + "nail_care" + ] + , "tags": [ + "beauty" + , "manicure" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💍" + , "description": "ring" + , "category": "People" + , "aliases": [ + "ring" + ] + , "tags": [ + "wedding" + , "marriage" + , "engaged" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💄" + , "description": "lipstick" + , "category": "People" + , "aliases": [ + "lipstick" + ] + , "tags": [ + "makeup" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💋" + , "description": "kiss mark" + , "category": "People" + , "aliases": [ + "kiss" + ] + , "tags": [ + "lipstick" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👄" + , "description": "mouth" + , "category": "People" + , "aliases": [ + "lips" + ] + , "tags": [ + "kiss" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👅" + , "description": "tongue" + , "category": "People" + , "aliases": [ + "tongue" + ] + , "tags": [ + "taste" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👂" + , "description": "ear" + , "category": "People" + , "aliases": [ + "ear" + ] + , "tags": [ + "hear" + , "sound" + , "listen" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👃" + , "description": "nose" + , "category": "People" + , "aliases": [ + "nose" + ] + , "tags": [ + "smell" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👣" + , "description": "footprints" + , "category": "People" + , "aliases": [ + "footprints" + ] + , "tags": [ + "feet" + , "tracks" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👁" + , "description": "eye" + , "category": "People" + , "aliases": [ + "eye" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "👀" + , "description": "eyes" + , "category": "People" + , "aliases": [ + "eyes" + ] + , "tags": [ + "look" + , "see" + , "watch" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🗣" + , "description": "speaking head" + , "category": "People" + , "aliases": [ + "speaking_head" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "👤" + , "description": "bust in silhouette" + , "category": "People" + , "aliases": [ + "bust_in_silhouette" + ] + , "tags": [ + "user" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👥" + , "description": "busts in silhouette" + , "category": "People" + , "aliases": [ + "busts_in_silhouette" + ] + , "tags": [ + "users" + , "group" + , "team" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👶" + , "description": "baby" + , "category": "People" + , "aliases": [ + "baby" + ] + , "tags": [ + "child" + , "newborn" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👦" + , "description": "boy" + , "category": "People" + , "aliases": [ + "boy" + ] + , "tags": [ + "child" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👧" + , "description": "girl" + , "category": "People" + , "aliases": [ + "girl" + ] + , "tags": [ + "child" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👨" + , "description": "man" + , "category": "People" + , "aliases": [ + "man" + ] + , "tags": [ + "mustache" + , "father" + , "dad" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👩" + , "description": "woman" + , "category": "People" + , "aliases": [ + "woman" + ] + , "tags": [ + "girls" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👱‍♀" + , "description": "blond-haired woman" + , "category": "People" + , "aliases": [ + "blonde_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👱" + , "description": "blond-haired person" + , "category": "People" + , "aliases": [ + "blonde_man" + , "person_with_blond_hair" + ] + , "tags": [ + "boy" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👴" + , "description": "old man" + , "category": "People" + , "aliases": [ + "older_man" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👵" + , "description": "old woman" + , "category": "People" + , "aliases": [ + "older_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👲" + , "description": "man with Chinese cap" + , "category": "People" + , "aliases": [ + "man_with_gua_pi_mao" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👳‍♀" + , "description": "woman wearing turban" + , "category": "People" + , "aliases": [ + "woman_with_turban" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👳" + , "description": "person wearing turban" + , "category": "People" + , "aliases": [ + "man_with_turban" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👮‍♀" + , "description": "woman police officer" + , "category": "People" + , "aliases": [ + "policewoman" + ] + , "tags": [ + "police" + , "law" + , "cop" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👮" + , "description": "police officer" + , "category": "People" + , "aliases": [ + "policeman" + , "cop" + ] + , "tags": [ + "police" + , "law" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👷‍♀" + , "description": "woman construction worker" + , "category": "People" + , "aliases": [ + "construction_worker_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👷" + , "description": "construction worker" + , "category": "People" + , "aliases": [ + "construction_worker_man" + , "construction_worker" + ] + , "tags": [ + "helmet" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💂‍♀" + , "description": "woman guard" + , "category": "People" + , "aliases": [ + "guardswoman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "💂" + , "description": "guard" + , "category": "People" + , "aliases": [ + "guardsman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕵️‍♀️" + , "description": "woman detective" + , "category": "People" + , "aliases": [ + "female_detective" + ] + , "tags": [ + "sleuth" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🕵" + , "description": "detective" + , "category": "People" + , "aliases": [ + "male_detective" + , "detective" + ] + , "tags": [ + "sleuth" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "👩‍⚕" + , "description": "woman health worker" + , "category": "People" + , "aliases": [ + "woman_health_worker" + ] + , "tags": [ + "doctor" + , "nurse" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍⚕" + , "description": "man health worker" + , "category": "People" + , "aliases": [ + "man_health_worker" + ] + , "tags": [ + "doctor" + , "nurse" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🌾" + , "description": "woman farmer" + , "category": "People" + , "aliases": [ + "woman_farmer" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🌾" + , "description": "man farmer" + , "category": "People" + , "aliases": [ + "man_farmer" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🍳" + , "description": "woman cook" + , "category": "People" + , "aliases": [ + "woman_cook" + ] + , "tags": [ + "chef" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🍳" + , "description": "man cook" + , "category": "People" + , "aliases": [ + "man_cook" + ] + , "tags": [ + "chef" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🎓" + , "description": "woman student" + , "category": "People" + , "aliases": [ + "woman_student" + ] + , "tags": [ + "graduation" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🎓" + , "description": "man student" + , "category": "People" + , "aliases": [ + "man_student" + ] + , "tags": [ + "graduation" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🎤" + , "description": "woman singer" + , "category": "People" + , "aliases": [ + "woman_singer" + ] + , "tags": [ + "rockstar" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🎤" + , "description": "man singer" + , "category": "People" + , "aliases": [ + "man_singer" + ] + , "tags": [ + "rockstar" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🏫" + , "description": "woman teacher" + , "category": "People" + , "aliases": [ + "woman_teacher" + ] + , "tags": [ + "school" + , "professor" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🏫" + , "description": "man teacher" + , "category": "People" + , "aliases": [ + "man_teacher" + ] + , "tags": [ + "school" + , "professor" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🏭" + , "description": "woman factory worker" + , "category": "People" + , "aliases": [ + "woman_factory_worker" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🏭" + , "description": "man factory worker" + , "category": "People" + , "aliases": [ + "man_factory_worker" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍💻" + , "description": "woman technologist" + , "category": "People" + , "aliases": [ + "woman_technologist" + ] + , "tags": [ + "coder" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍💻" + , "description": "man technologist" + , "category": "People" + , "aliases": [ + "man_technologist" + ] + , "tags": [ + "coder" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍💼" + , "description": "woman office worker" + , "category": "People" + , "aliases": [ + "woman_office_worker" + ] + , "tags": [ + "business" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍💼" + , "description": "man office worker" + , "category": "People" + , "aliases": [ + "man_office_worker" + ] + , "tags": [ + "business" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🔧" + , "description": "woman mechanic" + , "category": "People" + , "aliases": [ + "woman_mechanic" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🔧" + , "description": "man mechanic" + , "category": "People" + , "aliases": [ + "man_mechanic" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🔬" + , "description": "woman scientist" + , "category": "People" + , "aliases": [ + "woman_scientist" + ] + , "tags": [ + "research" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🔬" + , "description": "man scientist" + , "category": "People" + , "aliases": [ + "man_scientist" + ] + , "tags": [ + "research" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🎨" + , "description": "woman artist" + , "category": "People" + , "aliases": [ + "woman_artist" + ] + , "tags": [ + "painter" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🎨" + , "description": "man artist" + , "category": "People" + , "aliases": [ + "man_artist" + ] + , "tags": [ + "painter" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🚒" + , "description": "woman firefighter" + , "category": "People" + , "aliases": [ + "woman_firefighter" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🚒" + , "description": "man firefighter" + , "category": "People" + , "aliases": [ + "man_firefighter" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍✈" + , "description": "woman pilot" + , "category": "People" + , "aliases": [ + "woman_pilot" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍✈" + , "description": "man pilot" + , "category": "People" + , "aliases": [ + "man_pilot" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍🚀" + , "description": "woman astronaut" + , "category": "People" + , "aliases": [ + "woman_astronaut" + ] + , "tags": [ + "space" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍🚀" + , "description": "man astronaut" + , "category": "People" + , "aliases": [ + "man_astronaut" + ] + , "tags": [ + "space" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👩‍⚖" + , "description": "woman judge" + , "category": "People" + , "aliases": [ + "woman_judge" + ] + , "tags": [ + "justice" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "👨‍⚖" + , "description": "man judge" + , "category": "People" + , "aliases": [ + "man_judge" + ] + , "tags": [ + "justice" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "🤶" + , "description": "Mrs. Claus" + , "category": "People" + , "aliases": [ + "mrs_claus" + ] + , "tags": [ + "santa" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🎅" + , "description": "Santa Claus" + , "category": "People" + , "aliases": [ + "santa" + ] + , "tags": [ + "christmas" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👸" + , "description": "princess" + , "category": "People" + , "aliases": [ + "princess" + ] + , "tags": [ + "blonde" + , "crown" + , "royal" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤴" + , "description": "prince" + , "category": "People" + , "aliases": [ + "prince" + ] + , "tags": [ + "crown" + , "royal" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "👰" + , "description": "bride with veil" + , "category": "People" + , "aliases": [ + "bride_with_veil" + ] + , "tags": [ + "marriage" + , "wedding" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤵" + , "description": "man in tuxedo" + , "category": "People" + , "aliases": [ + "man_in_tuxedo" + ] + , "tags": [ + "groom" + , "marriage" + , "wedding" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "👼" + , "description": "baby angel" + , "category": "People" + , "aliases": [ + "angel" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤰" + , "description": "pregnant woman" + , "category": "People" + , "aliases": [ + "pregnant_woman" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🙇‍♀" + , "description": "woman bowing" + , "category": "People" + , "aliases": [ + "bowing_woman" + ] + , "tags": [ + "respect" + , "thanks" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🙇" + , "description": "person bowing" + , "category": "People" + , "aliases": [ + "bowing_man" + , "bow" + ] + , "tags": [ + "respect" + , "thanks" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💁" + , "description": "person tipping hand" + , "category": "People" + , "aliases": [ + "tipping_hand_woman" + , "information_desk_person" + , "sassy_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💁‍♂" + , "description": "man tipping hand" + , "category": "People" + , "aliases": [ + "tipping_hand_man" + , "sassy_man" + ] + , "tags": [ + "information" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🙅" + , "description": "person gesturing NO" + , "category": "People" + , "aliases": [ + "no_good_woman" + , "no_good" + , "ng_woman" + ] + , "tags": [ + "stop" + , "halt" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙅‍♂" + , "description": "man gesturing NO" + , "category": "People" + , "aliases": [ + "no_good_man" + , "ng_man" + ] + , "tags": [ + "stop" + , "halt" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🙆" + , "description": "person gesturing OK" + , "category": "People" + , "aliases": [ + "ok_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙆‍♂" + , "description": "man gesturing OK" + , "category": "People" + , "aliases": [ + "ok_man" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🙋" + , "description": "person raising hand" + , "category": "People" + , "aliases": [ + "raising_hand_woman" + , "raising_hand" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙋‍♂" + , "description": "man raising hand" + , "category": "People" + , "aliases": [ + "raising_hand_man" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🤦‍♀" + , "description": "woman facepalming" + , "category": "People" + , "aliases": [ + "woman_facepalming" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤦‍♂" + , "description": "man facepalming" + , "category": "People" + , "aliases": [ + "man_facepalming" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤷‍♀" + , "description": "woman shrugging" + , "category": "People" + , "aliases": [ + "woman_shrugging" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤷‍♂" + , "description": "man shrugging" + , "category": "People" + , "aliases": [ + "man_shrugging" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🙎" + , "description": "person pouting" + , "category": "People" + , "aliases": [ + "pouting_woman" + , "person_with_pouting_face" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙎‍♂" + , "description": "man pouting" + , "category": "People" + , "aliases": [ + "pouting_man" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🙍" + , "description": "person frowning" + , "category": "People" + , "aliases": [ + "frowning_woman" + , "person_frowning" + ] + , "tags": [ + "sad" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙍‍♂" + , "description": "man frowning" + , "category": "People" + , "aliases": [ + "frowning_man" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "💇" + , "description": "person getting haircut" + , "category": "People" + , "aliases": [ + "haircut_woman" + , "haircut" + ] + , "tags": [ + "beauty" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💇‍♂" + , "description": "man getting haircut" + , "category": "People" + , "aliases": [ + "haircut_man" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "💆" + , "description": "person getting massage" + , "category": "People" + , "aliases": [ + "massage_woman" + , "massage" + ] + , "tags": [ + "spa" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💆‍♂" + , "description": "man getting massage" + , "category": "People" + , "aliases": [ + "massage_man" + ] + , "tags": [ + "spa" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🕴" + , "description": "man in business suit levitating" + , "category": "People" + , "aliases": [ + "business_suit_levitating" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "💃" + , "description": "woman dancing" + , "category": "People" + , "aliases": [ + "dancer" + ] + , "tags": [ + "dress" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕺" + , "description": "man dancing" + , "category": "People" + , "aliases": [ + "man_dancing" + ] + , "tags": [ + "dancer" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "👯" + , "description": "people with bunny ears partying" + , "category": "People" + , "aliases": [ + "dancing_women" + , "dancers" + ] + , "tags": [ + "bunny" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👯‍♂" + , "description": "men with bunny ears partying" + , "category": "People" + , "aliases": [ + "dancing_men" + ] + , "tags": [ + "bunny" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🚶‍♀" + , "description": "woman walking" + , "category": "People" + , "aliases": [ + "walking_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🚶" + , "description": "person walking" + , "category": "People" + , "aliases": [ + "walking_man" + , "walking" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏃‍♀" + , "description": "woman running" + , "category": "People" + , "aliases": [ + "running_woman" + ] + , "tags": [ + "exercise" + , "workout" + , "marathon" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🏃" + , "description": "person running" + , "category": "People" + , "aliases": [ + "running_man" + , "runner" + , "running" + ] + , "tags": [ + "exercise" + , "workout" + , "marathon" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👫" + , "description": "man and woman holding hands" + , "category": "People" + , "aliases": [ + "couple" + ] + , "tags": [ + "date" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👭" + , "description": "two women holding hands" + , "category": "People" + , "aliases": [ + "two_women_holding_hands" + ] + , "tags": [ + "couple" + , "date" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👬" + , "description": "two men holding hands" + , "category": "People" + , "aliases": [ + "two_men_holding_hands" + ] + , "tags": [ + "couple" + , "date" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💑" + , "description": "couple with heart" + , "category": "People" + , "aliases": [ + "couple_with_heart_woman_man" + , "couple_with_heart" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👩‍❤️‍👩" + , "description": "couple with heart: woman, woman" + , "category": "People" + , "aliases": [ + "couple_with_heart_woman_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍❤️‍👨" + , "description": "couple with heart: man, man" + , "category": "People" + , "aliases": [ + "couple_with_heart_man_man" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "💏" + , "description": "kiss" + , "category": "People" + , "aliases": [ + "couplekiss_man_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👩‍❤️‍💋‍👩" + , "description": "kiss: woman, woman" + , "category": "People" + , "aliases": [ + "couplekiss_woman_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍❤️‍💋‍👨" + , "description": "kiss: man, man" + , "category": "People" + , "aliases": [ + "couplekiss_man_man" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👪" + , "description": "family" + , "category": "People" + , "aliases": [ + "family_man_woman_boy" + , "family" + ] + , "tags": [ + "home" + , "parents" + , "child" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👨‍👩‍👧" + , "description": "family: man, woman, girl" + , "category": "People" + , "aliases": [ + "family_man_woman_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍👩‍👧‍👦" + , "description": "family: man, woman, girl, boy" + , "category": "People" + , "aliases": [ + "family_man_woman_girl_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍👩‍👦‍👦" + , "description": "family: man, woman, boy, boy" + , "category": "People" + , "aliases": [ + "family_man_woman_boy_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍👩‍👧‍👧" + , "description": "family: man, woman, girl, girl" + , "category": "People" + , "aliases": [ + "family_man_woman_girl_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👩‍👩‍👦" + , "description": "family: woman, woman, boy" + , "category": "People" + , "aliases": [ + "family_woman_woman_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👩‍👩‍👧" + , "description": "family: woman, woman, girl" + , "category": "People" + , "aliases": [ + "family_woman_woman_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👩‍👩‍👧‍👦" + , "description": "family: woman, woman, girl, boy" + , "category": "People" + , "aliases": [ + "family_woman_woman_girl_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👩‍👩‍👦‍👦" + , "description": "family: woman, woman, boy, boy" + , "category": "People" + , "aliases": [ + "family_woman_woman_boy_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👩‍👩‍👧‍👧" + , "description": "family: woman, woman, girl, girl" + , "category": "People" + , "aliases": [ + "family_woman_woman_girl_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍👨‍👦" + , "description": "family: man, man, boy" + , "category": "People" + , "aliases": [ + "family_man_man_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍👨‍👧" + , "description": "family: man, man, girl" + , "category": "People" + , "aliases": [ + "family_man_man_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍👨‍👧‍👦" + , "description": "family: man, man, girl, boy" + , "category": "People" + , "aliases": [ + "family_man_man_girl_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍👨‍👦‍👦" + , "description": "family: man, man, boy, boy" + , "category": "People" + , "aliases": [ + "family_man_man_boy_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👨‍👨‍👧‍👧" + , "description": "family: man, man, girl, girl" + , "category": "People" + , "aliases": [ + "family_man_man_girl_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "👩‍👦" + , "description": "family: woman, boy" + , "category": "People" + , "aliases": [ + "family_woman_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👩‍👧" + , "description": "family: woman, girl" + , "category": "People" + , "aliases": [ + "family_woman_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👩‍👧‍👦" + , "description": "family: woman, girl, boy" + , "category": "People" + , "aliases": [ + "family_woman_girl_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👩‍👦‍👦" + , "description": "family: woman, boy, boy" + , "category": "People" + , "aliases": [ + "family_woman_boy_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👩‍👧‍👧" + , "description": "family: woman, girl, girl" + , "category": "People" + , "aliases": [ + "family_woman_girl_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👨‍👦" + , "description": "family: man, boy" + , "category": "People" + , "aliases": [ + "family_man_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👨‍👧" + , "description": "family: man, girl" + , "category": "People" + , "aliases": [ + "family_man_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👨‍👧‍👦" + , "description": "family: man, girl, boy" + , "category": "People" + , "aliases": [ + "family_man_girl_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👨‍👦‍👦" + , "description": "family: man, boy, boy" + , "category": "People" + , "aliases": [ + "family_man_boy_boy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👨‍👧‍👧" + , "description": "family: man, girl, girl" + , "category": "People" + , "aliases": [ + "family_man_girl_girl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "👚" + , "description": "woman’s clothes" + , "category": "People" + , "aliases": [ + "womans_clothes" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👕" + , "description": "t-shirt" + , "category": "People" + , "aliases": [ + "shirt" + , "tshirt" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👖" + , "description": "jeans" + , "category": "People" + , "aliases": [ + "jeans" + ] + , "tags": [ + "pants" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👔" + , "description": "necktie" + , "category": "People" + , "aliases": [ + "necktie" + ] + , "tags": [ + "shirt" + , "formal" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👗" + , "description": "dress" + , "category": "People" + , "aliases": [ + "dress" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👙" + , "description": "bikini" + , "category": "People" + , "aliases": [ + "bikini" + ] + , "tags": [ + "beach" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👘" + , "description": "kimono" + , "category": "People" + , "aliases": [ + "kimono" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👠" + , "description": "high-heeled shoe" + , "category": "People" + , "aliases": [ + "high_heel" + ] + , "tags": [ + "shoe" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👡" + , "description": "woman’s sandal" + , "category": "People" + , "aliases": [ + "sandal" + ] + , "tags": [ + "shoe" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👢" + , "description": "woman’s boot" + , "category": "People" + , "aliases": [ + "boot" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👞" + , "description": "man’s shoe" + , "category": "People" + , "aliases": [ + "mans_shoe" + , "shoe" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👟" + , "description": "running shoe" + , "category": "People" + , "aliases": [ + "athletic_shoe" + ] + , "tags": [ + "sneaker" + , "sport" + , "running" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👒" + , "description": "woman’s hat" + , "category": "People" + , "aliases": [ + "womans_hat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎩" + , "description": "top hat" + , "category": "People" + , "aliases": [ + "tophat" + ] + , "tags": [ + "hat" + , "classy" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎓" + , "description": "graduation cap" + , "category": "People" + , "aliases": [ + "mortar_board" + ] + , "tags": [ + "education" + , "college" + , "university" + , "graduation" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👑" + , "description": "crown" + , "category": "People" + , "aliases": [ + "crown" + ] + , "tags": [ + "king" + , "queen" + , "royal" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⛑" + , "description": "rescue worker’s helmet" + , "category": "People" + , "aliases": [ + "rescue_worker_helmet" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🎒" + , "description": "school backpack" + , "category": "People" + , "aliases": [ + "school_satchel" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👝" + , "description": "clutch bag" + , "category": "People" + , "aliases": [ + "pouch" + ] + , "tags": [ + "bag" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👛" + , "description": "purse" + , "category": "People" + , "aliases": [ + "purse" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👜" + , "description": "handbag" + , "category": "People" + , "aliases": [ + "handbag" + ] + , "tags": [ + "bag" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💼" + , "description": "briefcase" + , "category": "People" + , "aliases": [ + "briefcase" + ] + , "tags": [ + "business" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👓" + , "description": "glasses" + , "category": "People" + , "aliases": [ + "eyeglasses" + ] + , "tags": [ + "glasses" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕶" + , "description": "sunglasses" + , "category": "People" + , "aliases": [ + "dark_sunglasses" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🌂" + , "description": "closed umbrella" + , "category": "People" + , "aliases": [ + "closed_umbrella" + ] + , "tags": [ + "weather" + , "rain" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☂️" + , "description": "umbrella" + , "category": "People" + , "aliases": [ + "open_umbrella" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "🐶" + , "description": "dog face" + , "category": "Nature" + , "aliases": [ + "dog" + ] + , "tags": [ + "pet" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐱" + , "description": "cat face" + , "category": "Nature" + , "aliases": [ + "cat" + ] + , "tags": [ + "pet" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐭" + , "description": "mouse face" + , "category": "Nature" + , "aliases": [ + "mouse" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐹" + , "description": "hamster face" + , "category": "Nature" + , "aliases": [ + "hamster" + ] + , "tags": [ + "pet" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐰" + , "description": "rabbit face" + , "category": "Nature" + , "aliases": [ + "rabbit" + ] + , "tags": [ + "bunny" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦊" + , "description": "fox face" + , "category": "Nature" + , "aliases": [ + "fox_face" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🐻" + , "description": "bear face" + , "category": "Nature" + , "aliases": [ + "bear" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐼" + , "description": "panda face" + , "category": "Nature" + , "aliases": [ + "panda_face" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐨" + , "description": "koala" + , "category": "Nature" + , "aliases": [ + "koala" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐯" + , "description": "tiger face" + , "category": "Nature" + , "aliases": [ + "tiger" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦁" + , "description": "lion face" + , "category": "Nature" + , "aliases": [ + "lion" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🐮" + , "description": "cow face" + , "category": "Nature" + , "aliases": [ + "cow" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐷" + , "description": "pig face" + , "category": "Nature" + , "aliases": [ + "pig" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐽" + , "description": "pig nose" + , "category": "Nature" + , "aliases": [ + "pig_nose" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐸" + , "description": "frog face" + , "category": "Nature" + , "aliases": [ + "frog" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐵" + , "description": "monkey face" + , "category": "Nature" + , "aliases": [ + "monkey_face" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙈" + , "description": "see-no-evil monkey" + , "category": "Nature" + , "aliases": [ + "see_no_evil" + ] + , "tags": [ + "monkey" + , "blind" + , "ignore" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙉" + , "description": "hear-no-evil monkey" + , "category": "Nature" + , "aliases": [ + "hear_no_evil" + ] + , "tags": [ + "monkey" + , "deaf" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🙊" + , "description": "speak-no-evil monkey" + , "category": "Nature" + , "aliases": [ + "speak_no_evil" + ] + , "tags": [ + "monkey" + , "mute" + , "hush" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐒" + , "description": "monkey" + , "category": "Nature" + , "aliases": [ + "monkey" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐔" + , "description": "chicken" + , "category": "Nature" + , "aliases": [ + "chicken" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐧" + , "description": "penguin" + , "category": "Nature" + , "aliases": [ + "penguin" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐦" + , "description": "bird" + , "category": "Nature" + , "aliases": [ + "bird" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐤" + , "description": "baby chick" + , "category": "Nature" + , "aliases": [ + "baby_chick" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐣" + , "description": "hatching chick" + , "category": "Nature" + , "aliases": [ + "hatching_chick" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐥" + , "description": "front-facing baby chick" + , "category": "Nature" + , "aliases": [ + "hatched_chick" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦆" + , "description": "duck" + , "category": "Nature" + , "aliases": [ + "duck" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🦅" + , "description": "eagle" + , "category": "Nature" + , "aliases": [ + "eagle" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🦉" + , "description": "owl" + , "category": "Nature" + , "aliases": [ + "owl" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🦇" + , "description": "bat" + , "category": "Nature" + , "aliases": [ + "bat" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🐺" + , "description": "wolf face" + , "category": "Nature" + , "aliases": [ + "wolf" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐗" + , "description": "boar" + , "category": "Nature" + , "aliases": [ + "boar" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐴" + , "description": "horse face" + , "category": "Nature" + , "aliases": [ + "horse" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦄" + , "description": "unicorn face" + , "category": "Nature" + , "aliases": [ + "unicorn" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🐝" + , "description": "honeybee" + , "category": "Nature" + , "aliases": [ + "bee" + , "honeybee" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐛" + , "description": "bug" + , "category": "Nature" + , "aliases": [ + "bug" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦋" + , "description": "butterfly" + , "category": "Nature" + , "aliases": [ + "butterfly" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🐌" + , "description": "snail" + , "category": "Nature" + , "aliases": [ + "snail" + ] + , "tags": [ + "slow" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐚" + , "description": "spiral shell" + , "category": "Nature" + , "aliases": [ + "shell" + ] + , "tags": [ + "sea" + , "beach" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐞" + , "description": "lady beetle" + , "category": "Nature" + , "aliases": [ + "beetle" + ] + , "tags": [ + "bug" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐜" + , "description": "ant" + , "category": "Nature" + , "aliases": [ + "ant" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕷" + , "description": "spider" + , "category": "Nature" + , "aliases": [ + "spider" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🕸" + , "description": "spider web" + , "category": "Nature" + , "aliases": [ + "spider_web" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🐢" + , "description": "turtle" + , "category": "Nature" + , "aliases": [ + "turtle" + ] + , "tags": [ + "slow" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐍" + , "description": "snake" + , "category": "Nature" + , "aliases": [ + "snake" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦎" + , "description": "lizard" + , "category": "Nature" + , "aliases": [ + "lizard" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🦂" + , "description": "scorpion" + , "category": "Nature" + , "aliases": [ + "scorpion" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🦀" + , "description": "crab" + , "category": "Nature" + , "aliases": [ + "crab" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🦑" + , "description": "squid" + , "category": "Nature" + , "aliases": [ + "squid" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🐙" + , "description": "octopus" + , "category": "Nature" + , "aliases": [ + "octopus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦐" + , "description": "shrimp" + , "category": "Nature" + , "aliases": [ + "shrimp" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🐠" + , "description": "tropical fish" + , "category": "Nature" + , "aliases": [ + "tropical_fish" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐟" + , "description": "fish" + , "category": "Nature" + , "aliases": [ + "fish" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐡" + , "description": "blowfish" + , "category": "Nature" + , "aliases": [ + "blowfish" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐬" + , "description": "dolphin" + , "category": "Nature" + , "aliases": [ + "dolphin" + , "flipper" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦈" + , "description": "shark" + , "category": "Nature" + , "aliases": [ + "shark" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🐳" + , "description": "spouting whale" + , "category": "Nature" + , "aliases": [ + "whale" + ] + , "tags": [ + "sea" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐋" + , "description": "whale" + , "category": "Nature" + , "aliases": [ + "whale2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐊" + , "description": "crocodile" + , "category": "Nature" + , "aliases": [ + "crocodile" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐆" + , "description": "leopard" + , "category": "Nature" + , "aliases": [ + "leopard" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐅" + , "description": "tiger" + , "category": "Nature" + , "aliases": [ + "tiger2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐃" + , "description": "water buffalo" + , "category": "Nature" + , "aliases": [ + "water_buffalo" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐂" + , "description": "ox" + , "category": "Nature" + , "aliases": [ + "ox" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐄" + , "description": "cow" + , "category": "Nature" + , "aliases": [ + "cow2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦌" + , "description": "deer" + , "category": "Nature" + , "aliases": [ + "deer" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🐪" + , "description": "camel" + , "category": "Nature" + , "aliases": [ + "dromedary_camel" + ] + , "tags": [ + "desert" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐫" + , "description": "two-hump camel" + , "category": "Nature" + , "aliases": [ + "camel" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐘" + , "description": "elephant" + , "category": "Nature" + , "aliases": [ + "elephant" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦏" + , "description": "rhinoceros" + , "category": "Nature" + , "aliases": [ + "rhinoceros" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🦍" + , "description": "gorilla" + , "category": "Nature" + , "aliases": [ + "gorilla" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🐎" + , "description": "horse" + , "category": "Nature" + , "aliases": [ + "racehorse" + ] + , "tags": [ + "speed" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐖" + , "description": "pig" + , "category": "Nature" + , "aliases": [ + "pig2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐐" + , "description": "goat" + , "category": "Nature" + , "aliases": [ + "goat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐏" + , "description": "ram" + , "category": "Nature" + , "aliases": [ + "ram" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐑" + , "description": "sheep" + , "category": "Nature" + , "aliases": [ + "sheep" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐕" + , "description": "dog" + , "category": "Nature" + , "aliases": [ + "dog2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐩" + , "description": "poodle" + , "category": "Nature" + , "aliases": [ + "poodle" + ] + , "tags": [ + "dog" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐈" + , "description": "cat" + , "category": "Nature" + , "aliases": [ + "cat2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐓" + , "description": "rooster" + , "category": "Nature" + , "aliases": [ + "rooster" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🦃" + , "description": "turkey" + , "category": "Nature" + , "aliases": [ + "turkey" + ] + , "tags": [ + "thanksgiving" + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🕊" + , "description": "dove" + , "category": "Nature" + , "aliases": [ + "dove" + ] + , "tags": [ + "peace" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🐇" + , "description": "rabbit" + , "category": "Nature" + , "aliases": [ + "rabbit2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐁" + , "description": "mouse" + , "category": "Nature" + , "aliases": [ + "mouse2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐀" + , "description": "rat" + , "category": "Nature" + , "aliases": [ + "rat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐿" + , "description": "chipmunk" + , "category": "Nature" + , "aliases": [ + "chipmunk" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🐾" + , "description": "paw prints" + , "category": "Nature" + , "aliases": [ + "feet" + , "paw_prints" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐉" + , "description": "dragon" + , "category": "Nature" + , "aliases": [ + "dragon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🐲" + , "description": "dragon face" + , "category": "Nature" + , "aliases": [ + "dragon_face" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌵" + , "description": "cactus" + , "category": "Nature" + , "aliases": [ + "cactus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎄" + , "description": "Christmas tree" + , "category": "Nature" + , "aliases": [ + "christmas_tree" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌲" + , "description": "evergreen tree" + , "category": "Nature" + , "aliases": [ + "evergreen_tree" + ] + , "tags": [ + "wood" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌳" + , "description": "deciduous tree" + , "category": "Nature" + , "aliases": [ + "deciduous_tree" + ] + , "tags": [ + "wood" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌴" + , "description": "palm tree" + , "category": "Nature" + , "aliases": [ + "palm_tree" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌱" + , "description": "seedling" + , "category": "Nature" + , "aliases": [ + "seedling" + ] + , "tags": [ + "plant" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌿" + , "description": "herb" + , "category": "Nature" + , "aliases": [ + "herb" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☘️" + , "description": "shamrock" + , "category": "Nature" + , "aliases": [ + "shamrock" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "🍀" + , "description": "four leaf clover" + , "category": "Nature" + , "aliases": [ + "four_leaf_clover" + ] + , "tags": [ + "luck" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎍" + , "description": "pine decoration" + , "category": "Nature" + , "aliases": [ + "bamboo" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎋" + , "description": "tanabata tree" + , "category": "Nature" + , "aliases": [ + "tanabata_tree" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍃" + , "description": "leaf fluttering in wind" + , "category": "Nature" + , "aliases": [ + "leaves" + ] + , "tags": [ + "leaf" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍂" + , "description": "fallen leaf" + , "category": "Nature" + , "aliases": [ + "fallen_leaf" + ] + , "tags": [ + "autumn" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍁" + , "description": "maple leaf" + , "category": "Nature" + , "aliases": [ + "maple_leaf" + ] + , "tags": [ + "canada" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍄" + , "description": "mushroom" + , "category": "Nature" + , "aliases": [ + "mushroom" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌾" + , "description": "sheaf of rice" + , "category": "Nature" + , "aliases": [ + "ear_of_rice" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💐" + , "description": "bouquet" + , "category": "Nature" + , "aliases": [ + "bouquet" + ] + , "tags": [ + "flowers" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌷" + , "description": "tulip" + , "category": "Nature" + , "aliases": [ + "tulip" + ] + , "tags": [ + "flower" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌹" + , "description": "rose" + , "category": "Nature" + , "aliases": [ + "rose" + ] + , "tags": [ + "flower" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥀" + , "description": "wilted flower" + , "category": "Nature" + , "aliases": [ + "wilted_flower" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🌻" + , "description": "sunflower" + , "category": "Nature" + , "aliases": [ + "sunflower" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌼" + , "description": "blossom" + , "category": "Nature" + , "aliases": [ + "blossom" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌸" + , "description": "cherry blossom" + , "category": "Nature" + , "aliases": [ + "cherry_blossom" + ] + , "tags": [ + "flower" + , "spring" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌺" + , "description": "hibiscus" + , "category": "Nature" + , "aliases": [ + "hibiscus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌎" + , "description": "globe showing Americas" + , "category": "Nature" + , "aliases": [ + "earth_americas" + ] + , "tags": [ + "globe" + , "world" + , "international" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌍" + , "description": "globe showing Europe-Africa" + , "category": "Nature" + , "aliases": [ + "earth_africa" + ] + , "tags": [ + "globe" + , "world" + , "international" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌏" + , "description": "globe showing Asia-Australia" + , "category": "Nature" + , "aliases": [ + "earth_asia" + ] + , "tags": [ + "globe" + , "world" + , "international" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌕" + , "description": "full moon" + , "category": "Nature" + , "aliases": [ + "full_moon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌖" + , "description": "waning gibbous moon" + , "category": "Nature" + , "aliases": [ + "waning_gibbous_moon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌗" + , "description": "last quarter moon" + , "category": "Nature" + , "aliases": [ + "last_quarter_moon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌘" + , "description": "waning crescent moon" + , "category": "Nature" + , "aliases": [ + "waning_crescent_moon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌑" + , "description": "new moon" + , "category": "Nature" + , "aliases": [ + "new_moon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌒" + , "description": "waxing crescent moon" + , "category": "Nature" + , "aliases": [ + "waxing_crescent_moon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌓" + , "description": "first quarter moon" + , "category": "Nature" + , "aliases": [ + "first_quarter_moon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌔" + , "description": "waxing gibbous moon" + , "category": "Nature" + , "aliases": [ + "moon" + , "waxing_gibbous_moon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌚" + , "description": "new moon face" + , "category": "Nature" + , "aliases": [ + "new_moon_with_face" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌝" + , "description": "full moon with face" + , "category": "Nature" + , "aliases": [ + "full_moon_with_face" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌞" + , "description": "sun with face" + , "category": "Nature" + , "aliases": [ + "sun_with_face" + ] + , "tags": [ + "summer" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌛" + , "description": "first quarter moon with face" + , "category": "Nature" + , "aliases": [ + "first_quarter_moon_with_face" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌜" + , "description": "last quarter moon with face" + , "category": "Nature" + , "aliases": [ + "last_quarter_moon_with_face" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌙" + , "description": "crescent moon" + , "category": "Nature" + , "aliases": [ + "crescent_moon" + ] + , "tags": [ + "night" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💫" + , "description": "dizzy" + , "category": "Nature" + , "aliases": [ + "dizzy" + ] + , "tags": [ + "star" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⭐️" + , "description": "white medium star" + , "category": "Nature" + , "aliases": [ + "star" + ] + , "tags": [ + ] + , "unicode_version": "5.1" + , "ios_version": "6.0" + } +, { + "emoji": "🌟" + , "description": "glowing star" + , "category": "Nature" + , "aliases": [ + "star2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "✨" + , "description": "sparkles" + , "category": "Nature" + , "aliases": [ + "sparkles" + ] + , "tags": [ + "shiny" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚡️" + , "description": "high voltage" + , "category": "Nature" + , "aliases": [ + "zap" + ] + , "tags": [ + "lightning" + , "thunder" + ] + , "unicode_version": "4.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔥" + , "description": "fire" + , "category": "Nature" + , "aliases": [ + "fire" + ] + , "tags": [ + "burn" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💥" + , "description": "collision" + , "category": "Nature" + , "aliases": [ + "boom" + , "collision" + ] + , "tags": [ + "explode" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☄" + , "description": "comet" + , "category": "Nature" + , "aliases": [ + "comet" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "☀️" + , "description": "sun" + , "category": "Nature" + , "aliases": [ + "sunny" + ] + , "tags": [ + "weather" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🌤" + , "description": "sun behind small cloud" + , "category": "Nature" + , "aliases": [ + "sun_behind_small_cloud" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛅️" + , "description": "sun behind cloud" + , "category": "Nature" + , "aliases": [ + "partly_sunny" + ] + , "tags": [ + "weather" + , "cloud" + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🌥" + , "description": "sun behind large cloud" + , "category": "Nature" + , "aliases": [ + "sun_behind_large_cloud" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🌦" + , "description": "sun behind rain cloud" + , "category": "Nature" + , "aliases": [ + "sun_behind_rain_cloud" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🌈" + , "description": "rainbow" + , "category": "Nature" + , "aliases": [ + "rainbow" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☁️" + , "description": "cloud" + , "category": "Nature" + , "aliases": [ + "cloud" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🌧" + , "description": "cloud with rain" + , "category": "Nature" + , "aliases": [ + "cloud_with_rain" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛈" + , "description": "cloud with lightning and rain" + , "category": "Nature" + , "aliases": [ + "cloud_with_lightning_and_rain" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🌩" + , "description": "cloud with lightning" + , "category": "Nature" + , "aliases": [ + "cloud_with_lightning" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🌨" + , "description": "cloud with snow" + , "category": "Nature" + , "aliases": [ + "cloud_with_snow" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "☃️" + , "description": "snowman" + , "category": "Nature" + , "aliases": [ + "snowman_with_snow" + ] + , "tags": [ + "winter" + , "christmas" + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "⛄️" + , "description": "snowman without snow" + , "category": "Nature" + , "aliases": [ + "snowman" + ] + , "tags": [ + "winter" + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "❄️" + , "description": "snowflake" + , "category": "Nature" + , "aliases": [ + "snowflake" + ] + , "tags": [ + "winter" + , "cold" + , "weather" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🌬" + , "description": "wind face" + , "category": "Nature" + , "aliases": [ + "wind_face" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "💨" + , "description": "dashing away" + , "category": "Nature" + , "aliases": [ + "dash" + ] + , "tags": [ + "wind" + , "blow" + , "fast" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌪" + , "description": "tornado" + , "category": "Nature" + , "aliases": [ + "tornado" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🌫" + , "description": "fog" + , "category": "Nature" + , "aliases": [ + "fog" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🌊" + , "description": "water wave" + , "category": "Nature" + , "aliases": [ + "ocean" + ] + , "tags": [ + "sea" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💧" + , "description": "droplet" + , "category": "Nature" + , "aliases": [ + "droplet" + ] + , "tags": [ + "water" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💦" + , "description": "sweat droplets" + , "category": "Nature" + , "aliases": [ + "sweat_drops" + ] + , "tags": [ + "water" + , "workout" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☔️" + , "description": "umbrella with rain drops" + , "category": "Nature" + , "aliases": [ + "umbrella" + ] + , "tags": [ + "rain" + , "weather" + ] + , "unicode_version": "4.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍏" + , "description": "green apple" + , "category": "Foods" + , "aliases": [ + "green_apple" + ] + , "tags": [ + "fruit" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍎" + , "description": "red apple" + , "category": "Foods" + , "aliases": [ + "apple" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍐" + , "description": "pear" + , "category": "Foods" + , "aliases": [ + "pear" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍊" + , "description": "tangerine" + , "category": "Foods" + , "aliases": [ + "tangerine" + , "orange" + , "mandarin" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍋" + , "description": "lemon" + , "category": "Foods" + , "aliases": [ + "lemon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍌" + , "description": "banana" + , "category": "Foods" + , "aliases": [ + "banana" + ] + , "tags": [ + "fruit" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍉" + , "description": "watermelon" + , "category": "Foods" + , "aliases": [ + "watermelon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍇" + , "description": "grapes" + , "category": "Foods" + , "aliases": [ + "grapes" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍓" + , "description": "strawberry" + , "category": "Foods" + , "aliases": [ + "strawberry" + ] + , "tags": [ + "fruit" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍈" + , "description": "melon" + , "category": "Foods" + , "aliases": [ + "melon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍒" + , "description": "cherries" + , "category": "Foods" + , "aliases": [ + "cherries" + ] + , "tags": [ + "fruit" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍑" + , "description": "peach" + , "category": "Foods" + , "aliases": [ + "peach" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍍" + , "description": "pineapple" + , "category": "Foods" + , "aliases": [ + "pineapple" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥝" + , "description": "kiwi fruit" + , "category": "Foods" + , "aliases": [ + "kiwi_fruit" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🥑" + , "description": "avocado" + , "category": "Foods" + , "aliases": [ + "avocado" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍅" + , "description": "tomato" + , "category": "Foods" + , "aliases": [ + "tomato" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍆" + , "description": "eggplant" + , "category": "Foods" + , "aliases": [ + "eggplant" + ] + , "tags": [ + "aubergine" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥒" + , "description": "cucumber" + , "category": "Foods" + , "aliases": [ + "cucumber" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🥕" + , "description": "carrot" + , "category": "Foods" + , "aliases": [ + "carrot" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🌽" + , "description": "ear of corn" + , "category": "Foods" + , "aliases": [ + "corn" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌶" + , "description": "hot pepper" + , "category": "Foods" + , "aliases": [ + "hot_pepper" + ] + , "tags": [ + "spicy" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🥔" + , "description": "potato" + , "category": "Foods" + , "aliases": [ + "potato" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍠" + , "description": "roasted sweet potato" + , "category": "Foods" + , "aliases": [ + "sweet_potato" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌰" + , "description": "chestnut" + , "category": "Foods" + , "aliases": [ + "chestnut" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥜" + , "description": "peanuts" + , "category": "Foods" + , "aliases": [ + "peanuts" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍯" + , "description": "honey pot" + , "category": "Foods" + , "aliases": [ + "honey_pot" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥐" + , "description": "croissant" + , "category": "Foods" + , "aliases": [ + "croissant" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍞" + , "description": "bread" + , "category": "Foods" + , "aliases": [ + "bread" + ] + , "tags": [ + "toast" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥖" + , "description": "baguette bread" + , "category": "Foods" + , "aliases": [ + "baguette_bread" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🧀" + , "description": "cheese wedge" + , "category": "Foods" + , "aliases": [ + "cheese" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🥚" + , "description": "egg" + , "category": "Foods" + , "aliases": [ + "egg" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍳" + , "description": "cooking" + , "category": "Foods" + , "aliases": [ + "fried_egg" + ] + , "tags": [ + "breakfast" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥓" + , "description": "bacon" + , "category": "Foods" + , "aliases": [ + "bacon" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🥞" + , "description": "pancakes" + , "category": "Foods" + , "aliases": [ + "pancakes" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍤" + , "description": "fried shrimp" + , "category": "Foods" + , "aliases": [ + "fried_shrimp" + ] + , "tags": [ + "tempura" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍗" + , "description": "poultry leg" + , "category": "Foods" + , "aliases": [ + "poultry_leg" + ] + , "tags": [ + "meat" + , "chicken" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍖" + , "description": "meat on bone" + , "category": "Foods" + , "aliases": [ + "meat_on_bone" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍕" + , "description": "pizza" + , "category": "Foods" + , "aliases": [ + "pizza" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌭" + , "description": "hot dog" + , "category": "Foods" + , "aliases": [ + "hotdog" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🍔" + , "description": "hamburger" + , "category": "Foods" + , "aliases": [ + "hamburger" + ] + , "tags": [ + "burger" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍟" + , "description": "french fries" + , "category": "Foods" + , "aliases": [ + "fries" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥙" + , "description": "stuffed flatbread" + , "category": "Foods" + , "aliases": [ + "stuffed_flatbread" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🌮" + , "description": "taco" + , "category": "Foods" + , "aliases": [ + "taco" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🌯" + , "description": "burrito" + , "category": "Foods" + , "aliases": [ + "burrito" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🥗" + , "description": "green salad" + , "category": "Foods" + , "aliases": [ + "green_salad" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🥘" + , "description": "shallow pan of food" + , "category": "Foods" + , "aliases": [ + "shallow_pan_of_food" + ] + , "tags": [ + "paella" + , "curry" + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "🍝" + , "description": "spaghetti" + , "category": "Foods" + , "aliases": [ + "spaghetti" + ] + , "tags": [ + "pasta" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍜" + , "description": "steaming bowl" + , "category": "Foods" + , "aliases": [ + "ramen" + ] + , "tags": [ + "noodle" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍲" + , "description": "pot of food" + , "category": "Foods" + , "aliases": [ + "stew" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍥" + , "description": "fish cake with swirl" + , "category": "Foods" + , "aliases": [ + "fish_cake" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍣" + , "description": "sushi" + , "category": "Foods" + , "aliases": [ + "sushi" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍱" + , "description": "bento box" + , "category": "Foods" + , "aliases": [ + "bento" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍛" + , "description": "curry rice" + , "category": "Foods" + , "aliases": [ + "curry" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍚" + , "description": "cooked rice" + , "category": "Foods" + , "aliases": [ + "rice" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍙" + , "description": "rice ball" + , "category": "Foods" + , "aliases": [ + "rice_ball" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍘" + , "description": "rice cracker" + , "category": "Foods" + , "aliases": [ + "rice_cracker" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍢" + , "description": "oden" + , "category": "Foods" + , "aliases": [ + "oden" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍡" + , "description": "dango" + , "category": "Foods" + , "aliases": [ + "dango" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍧" + , "description": "shaved ice" + , "category": "Foods" + , "aliases": [ + "shaved_ice" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍨" + , "description": "ice cream" + , "category": "Foods" + , "aliases": [ + "ice_cream" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍦" + , "description": "soft ice cream" + , "category": "Foods" + , "aliases": [ + "icecream" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍰" + , "description": "shortcake" + , "category": "Foods" + , "aliases": [ + "cake" + ] + , "tags": [ + "dessert" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎂" + , "description": "birthday cake" + , "category": "Foods" + , "aliases": [ + "birthday" + ] + , "tags": [ + "party" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍮" + , "description": "custard" + , "category": "Foods" + , "aliases": [ + "custard" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍭" + , "description": "lollipop" + , "category": "Foods" + , "aliases": [ + "lollipop" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍬" + , "description": "candy" + , "category": "Foods" + , "aliases": [ + "candy" + ] + , "tags": [ + "sweet" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍫" + , "description": "chocolate bar" + , "category": "Foods" + , "aliases": [ + "chocolate_bar" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍿" + , "description": "popcorn" + , "category": "Foods" + , "aliases": [ + "popcorn" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🍩" + , "description": "doughnut" + , "category": "Foods" + , "aliases": [ + "doughnut" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍪" + , "description": "cookie" + , "category": "Foods" + , "aliases": [ + "cookie" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥛" + , "description": "glass of milk" + , "category": "Foods" + , "aliases": [ + "milk_glass" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍼" + , "description": "baby bottle" + , "category": "Foods" + , "aliases": [ + "baby_bottle" + ] + , "tags": [ + "milk" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☕️" + , "description": "hot beverage" + , "category": "Foods" + , "aliases": [ + "coffee" + ] + , "tags": [ + "cafe" + , "espresso" + ] + , "unicode_version": "4.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍵" + , "description": "teacup without handle" + , "category": "Foods" + , "aliases": [ + "tea" + ] + , "tags": [ + "green" + , "breakfast" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍶" + , "description": "sake" + , "category": "Foods" + , "aliases": [ + "sake" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍺" + , "description": "beer mug" + , "category": "Foods" + , "aliases": [ + "beer" + ] + , "tags": [ + "drink" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍻" + , "description": "clinking beer mugs" + , "category": "Foods" + , "aliases": [ + "beers" + ] + , "tags": [ + "drinks" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥂" + , "description": "clinking glasses" + , "category": "Foods" + , "aliases": [ + "clinking_glasses" + ] + , "tags": [ + "cheers" + , "toast" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍷" + , "description": "wine glass" + , "category": "Foods" + , "aliases": [ + "wine_glass" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥃" + , "description": "tumbler glass" + , "category": "Foods" + , "aliases": [ + "tumbler_glass" + ] + , "tags": [ + "whisky" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍸" + , "description": "cocktail glass" + , "category": "Foods" + , "aliases": [ + "cocktail" + ] + , "tags": [ + "drink" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍹" + , "description": "tropical drink" + , "category": "Foods" + , "aliases": [ + "tropical_drink" + ] + , "tags": [ + "summer" + , "vacation" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍾" + , "description": "bottle with popping cork" + , "category": "Foods" + , "aliases": [ + "champagne" + ] + , "tags": [ + "bottle" + , "bubbly" + , "celebration" + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🥄" + , "description": "spoon" + , "category": "Foods" + , "aliases": [ + "spoon" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🍴" + , "description": "fork and knife" + , "category": "Foods" + , "aliases": [ + "fork_and_knife" + ] + , "tags": [ + "cutlery" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🍽" + , "description": "fork and knife with plate" + , "category": "Foods" + , "aliases": [ + "plate_with_cutlery" + ] + , "tags": [ + "dining" + , "dinner" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⚽️" + , "description": "soccer ball" + , "category": "Activity" + , "aliases": [ + "soccer" + ] + , "tags": [ + "sports" + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🏀" + , "description": "basketball" + , "category": "Activity" + , "aliases": [ + "basketball" + ] + , "tags": [ + "sports" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏈" + , "description": "american football" + , "category": "Activity" + , "aliases": [ + "football" + ] + , "tags": [ + "sports" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚾️" + , "description": "baseball" + , "category": "Activity" + , "aliases": [ + "baseball" + ] + , "tags": [ + "sports" + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🎾" + , "description": "tennis" + , "category": "Activity" + , "aliases": [ + "tennis" + ] + , "tags": [ + "sports" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏐" + , "description": "volleyball" + , "category": "Activity" + , "aliases": [ + "volleyball" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏉" + , "description": "rugby football" + , "category": "Activity" + , "aliases": [ + "rugby_football" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎱" + , "description": "pool 8 ball" + , "category": "Activity" + , "aliases": [ + "8ball" + ] + , "tags": [ + "pool" + , "billiards" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏓" + , "description": "ping pong" + , "category": "Activity" + , "aliases": [ + "ping_pong" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏸" + , "description": "badminton" + , "category": "Activity" + , "aliases": [ + "badminton" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🥅" + , "description": "goal net" + , "category": "Activity" + , "aliases": [ + "goal_net" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🏒" + , "description": "ice hockey" + , "category": "Activity" + , "aliases": [ + "ice_hockey" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏑" + , "description": "field hockey" + , "category": "Activity" + , "aliases": [ + "field_hockey" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏏" + , "description": "cricket" + , "category": "Activity" + , "aliases": [ + "cricket" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛳️" + , "description": "flag in hole" + , "category": "Activity" + , "aliases": [ + "golf" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🏹" + , "description": "bow and arrow" + , "category": "Activity" + , "aliases": [ + "bow_and_arrow" + ] + , "tags": [ + "archery" + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎣" + , "description": "fishing pole" + , "category": "Activity" + , "aliases": [ + "fishing_pole_and_fish" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥊" + , "description": "boxing glove" + , "category": "Activity" + , "aliases": [ + "boxing_glove" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🥋" + , "description": "martial arts uniform" + , "category": "Activity" + , "aliases": [ + "martial_arts_uniform" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "⛸" + , "description": "ice skate" + , "category": "Activity" + , "aliases": [ + "ice_skate" + ] + , "tags": [ + "skating" + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🎿" + , "description": "skis" + , "category": "Activity" + , "aliases": [ + "ski" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⛷" + , "description": "skier" + , "category": "Activity" + , "aliases": [ + "skier" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🏂" + , "description": "snowboarder" + , "category": "Activity" + , "aliases": [ + "snowboarder" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏋️‍♀️" + , "description": "woman lifting weights" + , "category": "Activity" + , "aliases": [ + "weight_lifting_woman" + ] + , "tags": [ + "gym" + , "workout" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🏋" + , "description": "person lifting weights" + , "category": "Activity" + , "aliases": [ + "weight_lifting_man" + ] + , "tags": [ + "gym" + , "workout" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🤺" + , "description": "person fencing" + , "category": "Activity" + , "aliases": [ + "person_fencing" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤼‍♀" + , "description": "women wrestling" + , "category": "Activity" + , "aliases": [ + "women_wrestling" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤼‍♂" + , "description": "men wrestling" + , "category": "Activity" + , "aliases": [ + "men_wrestling" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤸‍♀" + , "description": "woman cartwheeling" + , "category": "Activity" + , "aliases": [ + "woman_cartwheeling" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "🤸‍♂" + , "description": "man cartwheeling" + , "category": "Activity" + , "aliases": [ + "man_cartwheeling" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "⛹️‍♀️" + , "description": "woman bouncing ball" + , "category": "Activity" + , "aliases": [ + "basketball_woman" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "10.0" + } +, { + "emoji": "⛹" + , "description": "person bouncing ball" + , "category": "Activity" + , "aliases": [ + "basketball_man" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🤾‍♀" + , "description": "woman playing handball" + , "category": "Activity" + , "aliases": [ + "woman_playing_handball" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤾‍♂" + , "description": "man playing handball" + , "category": "Activity" + , "aliases": [ + "man_playing_handball" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🏌️‍♀️" + , "description": "woman golfing" + , "category": "Activity" + , "aliases": [ + "golfing_woman" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.0" + } +, { + "emoji": "🏌" + , "description": "person golfing" + , "category": "Activity" + , "aliases": [ + "golfing_man" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏄‍♀" + , "description": "woman surfing" + , "category": "Activity" + , "aliases": [ + "surfing_woman" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "10.0" + } +, { + "emoji": "🏄" + , "description": "person surfing" + , "category": "Activity" + , "aliases": [ + "surfing_man" + , "surfer" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏊‍♀" + , "description": "woman swimming" + , "category": "Activity" + , "aliases": [ + "swimming_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🏊" + , "description": "person swimming" + , "category": "Activity" + , "aliases": [ + "swimming_man" + , "swimmer" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤽‍♀" + , "description": "woman playing water polo" + , "category": "Activity" + , "aliases": [ + "woman_playing_water_polo" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤽‍♂" + , "description": "man playing water polo" + , "category": "Activity" + , "aliases": [ + "man_playing_water_polo" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🚣‍♀" + , "description": "woman rowing boat" + , "category": "Activity" + , "aliases": [ + "rowing_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🚣" + , "description": "person rowing boat" + , "category": "Activity" + , "aliases": [ + "rowing_man" + , "rowboat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏇" + , "description": "horse racing" + , "category": "Activity" + , "aliases": [ + "horse_racing" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚴‍♀" + , "description": "woman biking" + , "category": "Activity" + , "aliases": [ + "biking_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🚴" + , "description": "person biking" + , "category": "Activity" + , "aliases": [ + "biking_man" + , "bicyclist" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚵‍♀" + , "description": "woman mountain biking" + , "category": "Activity" + , "aliases": [ + "mountain_biking_woman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🚵" + , "description": "person mountain biking" + , "category": "Activity" + , "aliases": [ + "mountain_biking_man" + , "mountain_bicyclist" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎽" + , "description": "running shirt" + , "category": "Activity" + , "aliases": [ + "running_shirt_with_sash" + ] + , "tags": [ + "marathon" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏅" + , "description": "sports medal" + , "category": "Activity" + , "aliases": [ + "medal_sports" + ] + , "tags": [ + "gold" + , "winner" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎖" + , "description": "military medal" + , "category": "Activity" + , "aliases": [ + "medal_military" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🥇" + , "description": "1st place medal" + , "category": "Activity" + , "aliases": [ + "1st_place_medal" + ] + , "tags": [ + "gold" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🥈" + , "description": "2nd place medal" + , "category": "Activity" + , "aliases": [ + "2nd_place_medal" + ] + , "tags": [ + "silver" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🥉" + , "description": "3rd place medal" + , "category": "Activity" + , "aliases": [ + "3rd_place_medal" + ] + , "tags": [ + "bronze" + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🏆" + , "description": "trophy" + , "category": "Activity" + , "aliases": [ + "trophy" + ] + , "tags": [ + "award" + , "contest" + , "winner" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏵" + , "description": "rosette" + , "category": "Activity" + , "aliases": [ + "rosette" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎗" + , "description": "reminder ribbon" + , "category": "Activity" + , "aliases": [ + "reminder_ribbon" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎫" + , "description": "ticket" + , "category": "Activity" + , "aliases": [ + "ticket" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎟" + , "description": "admission tickets" + , "category": "Activity" + , "aliases": [ + "tickets" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎪" + , "description": "circus tent" + , "category": "Activity" + , "aliases": [ + "circus_tent" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🤹‍♀" + , "description": "woman juggling" + , "category": "Activity" + , "aliases": [ + "woman_juggling" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🤹‍♂" + , "description": "man juggling" + , "category": "Activity" + , "aliases": [ + "man_juggling" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🎭" + , "description": "performing arts" + , "category": "Activity" + , "aliases": [ + "performing_arts" + ] + , "tags": [ + "theater" + , "drama" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎨" + , "description": "artist palette" + , "category": "Activity" + , "aliases": [ + "art" + ] + , "tags": [ + "design" + , "paint" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎬" + , "description": "clapper board" + , "category": "Activity" + , "aliases": [ + "clapper" + ] + , "tags": [ + "film" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎤" + , "description": "microphone" + , "category": "Activity" + , "aliases": [ + "microphone" + ] + , "tags": [ + "sing" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎧" + , "description": "headphone" + , "category": "Activity" + , "aliases": [ + "headphones" + ] + , "tags": [ + "music" + , "earphones" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎼" + , "description": "musical score" + , "category": "Activity" + , "aliases": [ + "musical_score" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎹" + , "description": "musical keyboard" + , "category": "Activity" + , "aliases": [ + "musical_keyboard" + ] + , "tags": [ + "piano" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🥁" + , "description": "drum" + , "category": "Activity" + , "aliases": [ + "drum" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "10.2" + } +, { + "emoji": "🎷" + , "description": "saxophone" + , "category": "Activity" + , "aliases": [ + "saxophone" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎺" + , "description": "trumpet" + , "category": "Activity" + , "aliases": [ + "trumpet" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎸" + , "description": "guitar" + , "category": "Activity" + , "aliases": [ + "guitar" + ] + , "tags": [ + "rock" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎻" + , "description": "violin" + , "category": "Activity" + , "aliases": [ + "violin" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎲" + , "description": "game die" + , "category": "Activity" + , "aliases": [ + "game_die" + ] + , "tags": [ + "dice" + , "gambling" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎯" + , "description": "direct hit" + , "category": "Activity" + , "aliases": [ + "dart" + ] + , "tags": [ + "target" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎳" + , "description": "bowling" + , "category": "Activity" + , "aliases": [ + "bowling" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎮" + , "description": "video game" + , "category": "Activity" + , "aliases": [ + "video_game" + ] + , "tags": [ + "play" + , "controller" + , "console" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎰" + , "description": "slot machine" + , "category": "Activity" + , "aliases": [ + "slot_machine" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚗" + , "description": "automobile" + , "category": "Places" + , "aliases": [ + "car" + , "red_car" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚕" + , "description": "taxi" + , "category": "Places" + , "aliases": [ + "taxi" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚙" + , "description": "sport utility vehicle" + , "category": "Places" + , "aliases": [ + "blue_car" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚌" + , "description": "bus" + , "category": "Places" + , "aliases": [ + "bus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚎" + , "description": "trolleybus" + , "category": "Places" + , "aliases": [ + "trolleybus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏎" + , "description": "racing car" + , "category": "Places" + , "aliases": [ + "racing_car" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🚓" + , "description": "police car" + , "category": "Places" + , "aliases": [ + "police_car" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚑" + , "description": "ambulance" + , "category": "Places" + , "aliases": [ + "ambulance" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚒" + , "description": "fire engine" + , "category": "Places" + , "aliases": [ + "fire_engine" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚐" + , "description": "minibus" + , "category": "Places" + , "aliases": [ + "minibus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚚" + , "description": "delivery truck" + , "category": "Places" + , "aliases": [ + "truck" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚛" + , "description": "articulated lorry" + , "category": "Places" + , "aliases": [ + "articulated_lorry" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚜" + , "description": "tractor" + , "category": "Places" + , "aliases": [ + "tractor" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛴" + , "description": "kick scooter" + , "category": "Places" + , "aliases": [ + "kick_scooter" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🚲" + , "description": "bicycle" + , "category": "Places" + , "aliases": [ + "bike" + ] + , "tags": [ + "bicycle" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛵" + , "description": "motor scooter" + , "category": "Places" + , "aliases": [ + "motor_scooter" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🏍" + , "description": "motorcycle" + , "category": "Places" + , "aliases": [ + "motorcycle" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🚨" + , "description": "police car light" + , "category": "Places" + , "aliases": [ + "rotating_light" + ] + , "tags": [ + "911" + , "emergency" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚔" + , "description": "oncoming police car" + , "category": "Places" + , "aliases": [ + "oncoming_police_car" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚍" + , "description": "oncoming bus" + , "category": "Places" + , "aliases": [ + "oncoming_bus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚘" + , "description": "oncoming automobile" + , "category": "Places" + , "aliases": [ + "oncoming_automobile" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚖" + , "description": "oncoming taxi" + , "category": "Places" + , "aliases": [ + "oncoming_taxi" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚡" + , "description": "aerial tramway" + , "category": "Places" + , "aliases": [ + "aerial_tramway" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚠" + , "description": "mountain cableway" + , "category": "Places" + , "aliases": [ + "mountain_cableway" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚟" + , "description": "suspension railway" + , "category": "Places" + , "aliases": [ + "suspension_railway" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚃" + , "description": "railway car" + , "category": "Places" + , "aliases": [ + "railway_car" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚋" + , "description": "tram car" + , "category": "Places" + , "aliases": [ + "train" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚞" + , "description": "mountain railway" + , "category": "Places" + , "aliases": [ + "mountain_railway" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚝" + , "description": "monorail" + , "category": "Places" + , "aliases": [ + "monorail" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚄" + , "description": "high-speed train" + , "category": "Places" + , "aliases": [ + "bullettrain_side" + ] + , "tags": [ + "train" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚅" + , "description": "high-speed train with bullet nose" + , "category": "Places" + , "aliases": [ + "bullettrain_front" + ] + , "tags": [ + "train" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚈" + , "description": "light rail" + , "category": "Places" + , "aliases": [ + "light_rail" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚂" + , "description": "locomotive" + , "category": "Places" + , "aliases": [ + "steam_locomotive" + ] + , "tags": [ + "train" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚆" + , "description": "train" + , "category": "Places" + , "aliases": [ + "train2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚇" + , "description": "metro" + , "category": "Places" + , "aliases": [ + "metro" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚊" + , "description": "tram" + , "category": "Places" + , "aliases": [ + "tram" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚉" + , "description": "station" + , "category": "Places" + , "aliases": [ + "station" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚁" + , "description": "helicopter" + , "category": "Places" + , "aliases": [ + "helicopter" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛩" + , "description": "small airplane" + , "category": "Places" + , "aliases": [ + "small_airplane" + ] + , "tags": [ + "flight" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "✈️" + , "description": "airplane" + , "category": "Places" + , "aliases": [ + "airplane" + ] + , "tags": [ + "flight" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🛫" + , "description": "airplane departure" + , "category": "Places" + , "aliases": [ + "flight_departure" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🛬" + , "description": "airplane arrival" + , "category": "Places" + , "aliases": [ + "flight_arrival" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🚀" + , "description": "rocket" + , "category": "Places" + , "aliases": [ + "rocket" + ] + , "tags": [ + "ship" + , "launch" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛰" + , "description": "satellite" + , "category": "Places" + , "aliases": [ + "artificial_satellite" + ] + , "tags": [ + "orbit" + , "space" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "💺" + , "description": "seat" + , "category": "Places" + , "aliases": [ + "seat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛶" + , "description": "canoe" + , "category": "Places" + , "aliases": [ + "canoe" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "⛵️" + , "description": "sailboat" + , "category": "Places" + , "aliases": [ + "boat" + , "sailboat" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🛥" + , "description": "motor boat" + , "category": "Places" + , "aliases": [ + "motor_boat" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🚤" + , "description": "speedboat" + , "category": "Places" + , "aliases": [ + "speedboat" + ] + , "tags": [ + "ship" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛳" + , "description": "passenger ship" + , "category": "Places" + , "aliases": [ + "passenger_ship" + ] + , "tags": [ + "cruise" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛴" + , "description": "ferry" + , "category": "Places" + , "aliases": [ + "ferry" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🚢" + , "description": "ship" + , "category": "Places" + , "aliases": [ + "ship" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚓️" + , "description": "anchor" + , "category": "Places" + , "aliases": [ + "anchor" + ] + , "tags": [ + "ship" + ] + , "unicode_version": "4.1" + , "ios_version": "6.0" + } +, { + "emoji": "🚧" + , "description": "construction" + , "category": "Places" + , "aliases": [ + "construction" + ] + , "tags": [ + "wip" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⛽️" + , "description": "fuel pump" + , "category": "Places" + , "aliases": [ + "fuelpump" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🚏" + , "description": "bus stop" + , "category": "Places" + , "aliases": [ + "busstop" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚦" + , "description": "vertical traffic light" + , "category": "Places" + , "aliases": [ + "vertical_traffic_light" + ] + , "tags": [ + "semaphore" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚥" + , "description": "horizontal traffic light" + , "category": "Places" + , "aliases": [ + "traffic_light" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🗺" + , "description": "world map" + , "category": "Places" + , "aliases": [ + "world_map" + ] + , "tags": [ + "travel" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🗿" + , "description": "moai" + , "category": "Places" + , "aliases": [ + "moyai" + ] + , "tags": [ + "stone" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🗽" + , "description": "Statue of Liberty" + , "category": "Places" + , "aliases": [ + "statue_of_liberty" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⛲️" + , "description": "fountain" + , "category": "Places" + , "aliases": [ + "fountain" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🗼" + , "description": "Tokyo tower" + , "category": "Places" + , "aliases": [ + "tokyo_tower" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏰" + , "description": "castle" + , "category": "Places" + , "aliases": [ + "european_castle" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏯" + , "description": "Japanese castle" + , "category": "Places" + , "aliases": [ + "japanese_castle" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏟" + , "description": "stadium" + , "category": "Places" + , "aliases": [ + "stadium" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎡" + , "description": "ferris wheel" + , "category": "Places" + , "aliases": [ + "ferris_wheel" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎢" + , "description": "roller coaster" + , "category": "Places" + , "aliases": [ + "roller_coaster" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎠" + , "description": "carousel horse" + , "category": "Places" + , "aliases": [ + "carousel_horse" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⛱" + , "description": "umbrella on ground" + , "category": "Places" + , "aliases": [ + "parasol_on_ground" + ] + , "tags": [ + "beach_umbrella" + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🏖" + , "description": "beach with umbrella" + , "category": "Places" + , "aliases": [ + "beach_umbrella" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏝" + , "description": "desert island" + , "category": "Places" + , "aliases": [ + "desert_island" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛰" + , "description": "mountain" + , "category": "Places" + , "aliases": [ + "mountain" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🏔" + , "description": "snow-capped mountain" + , "category": "Places" + , "aliases": [ + "mountain_snow" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🗻" + , "description": "mount fuji" + , "category": "Places" + , "aliases": [ + "mount_fuji" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌋" + , "description": "volcano" + , "category": "Places" + , "aliases": [ + "volcano" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏜" + , "description": "desert" + , "category": "Places" + , "aliases": [ + "desert" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏕" + , "description": "camping" + , "category": "Places" + , "aliases": [ + "camping" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛺️" + , "description": "tent" + , "category": "Places" + , "aliases": [ + "tent" + ] + , "tags": [ + "camping" + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🛤" + , "description": "railway track" + , "category": "Places" + , "aliases": [ + "railway_track" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🛣" + , "description": "motorway" + , "category": "Places" + , "aliases": [ + "motorway" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏗" + , "description": "building construction" + , "category": "Places" + , "aliases": [ + "building_construction" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏭" + , "description": "factory" + , "category": "Places" + , "aliases": [ + "factory" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏠" + , "description": "house" + , "category": "Places" + , "aliases": [ + "house" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏡" + , "description": "house with garden" + , "category": "Places" + , "aliases": [ + "house_with_garden" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏘" + , "description": "house" + , "category": "Places" + , "aliases": [ + "houses" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏚" + , "description": "derelict house" + , "category": "Places" + , "aliases": [ + "derelict_house" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏢" + , "description": "office building" + , "category": "Places" + , "aliases": [ + "office" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏬" + , "description": "department store" + , "category": "Places" + , "aliases": [ + "department_store" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏣" + , "description": "Japanese post office" + , "category": "Places" + , "aliases": [ + "post_office" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏤" + , "description": "post office" + , "category": "Places" + , "aliases": [ + "european_post_office" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏥" + , "description": "hospital" + , "category": "Places" + , "aliases": [ + "hospital" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏦" + , "description": "bank" + , "category": "Places" + , "aliases": [ + "bank" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏨" + , "description": "hotel" + , "category": "Places" + , "aliases": [ + "hotel" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏪" + , "description": "convenience store" + , "category": "Places" + , "aliases": [ + "convenience_store" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏫" + , "description": "school" + , "category": "Places" + , "aliases": [ + "school" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏩" + , "description": "love hotel" + , "category": "Places" + , "aliases": [ + "love_hotel" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💒" + , "description": "wedding" + , "category": "Places" + , "aliases": [ + "wedding" + ] + , "tags": [ + "marriage" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏛" + , "description": "classical building" + , "category": "Places" + , "aliases": [ + "classical_building" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛪️" + , "description": "church" + , "category": "Places" + , "aliases": [ + "church" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🕌" + , "description": "mosque" + , "category": "Places" + , "aliases": [ + "mosque" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🕍" + , "description": "synagogue" + , "category": "Places" + , "aliases": [ + "synagogue" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🕋" + , "description": "kaaba" + , "category": "Places" + , "aliases": [ + "kaaba" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛩" + , "description": "shinto shrine" + , "category": "Places" + , "aliases": [ + "shinto_shrine" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🗾" + , "description": "map of Japan" + , "category": "Places" + , "aliases": [ + "japan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎑" + , "description": "moon viewing ceremony" + , "category": "Places" + , "aliases": [ + "rice_scene" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏞" + , "description": "national park" + , "category": "Places" + , "aliases": [ + "national_park" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🌅" + , "description": "sunrise" + , "category": "Places" + , "aliases": [ + "sunrise" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌄" + , "description": "sunrise over mountains" + , "category": "Places" + , "aliases": [ + "sunrise_over_mountains" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌠" + , "description": "shooting star" + , "category": "Places" + , "aliases": [ + "stars" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎇" + , "description": "sparkler" + , "category": "Places" + , "aliases": [ + "sparkler" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎆" + , "description": "fireworks" + , "category": "Places" + , "aliases": [ + "fireworks" + ] + , "tags": [ + "festival" + , "celebration" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌇" + , "description": "sunset" + , "category": "Places" + , "aliases": [ + "city_sunrise" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌆" + , "description": "cityscape at dusk" + , "category": "Places" + , "aliases": [ + "city_sunset" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏙" + , "description": "cityscape" + , "category": "Places" + , "aliases": [ + "cityscape" + ] + , "tags": [ + "skyline" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🌃" + , "description": "night with stars" + , "category": "Places" + , "aliases": [ + "night_with_stars" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌌" + , "description": "milky way" + , "category": "Places" + , "aliases": [ + "milky_way" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌉" + , "description": "bridge at night" + , "category": "Places" + , "aliases": [ + "bridge_at_night" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌁" + , "description": "foggy" + , "category": "Places" + , "aliases": [ + "foggy" + ] + , "tags": [ + "karl" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⌚️" + , "description": "watch" + , "category": "Objects" + , "aliases": [ + "watch" + ] + , "tags": [ + "time" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "📱" + , "description": "mobile phone" + , "category": "Objects" + , "aliases": [ + "iphone" + ] + , "tags": [ + "smartphone" + , "mobile" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📲" + , "description": "mobile phone with arrow" + , "category": "Objects" + , "aliases": [ + "calling" + ] + , "tags": [ + "call" + , "incoming" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💻" + , "description": "laptop computer" + , "category": "Objects" + , "aliases": [ + "computer" + ] + , "tags": [ + "desktop" + , "screen" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⌨️" + , "description": "keyboard" + , "category": "Objects" + , "aliases": [ + "keyboard" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "🖥" + , "description": "desktop computer" + , "category": "Objects" + , "aliases": [ + "desktop_computer" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🖨" + , "description": "printer" + , "category": "Objects" + , "aliases": [ + "printer" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🖱" + , "description": "computer mouse" + , "category": "Objects" + , "aliases": [ + "computer_mouse" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🖲" + , "description": "trackball" + , "category": "Objects" + , "aliases": [ + "trackball" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🕹" + , "description": "joystick" + , "category": "Objects" + , "aliases": [ + "joystick" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🗜" + , "description": "clamp" + , "category": "Objects" + , "aliases": [ + "clamp" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "💽" + , "description": "computer disk" + , "category": "Objects" + , "aliases": [ + "minidisc" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💾" + , "description": "floppy disk" + , "category": "Objects" + , "aliases": [ + "floppy_disk" + ] + , "tags": [ + "save" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💿" + , "description": "optical disk" + , "category": "Objects" + , "aliases": [ + "cd" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📀" + , "description": "dvd" + , "category": "Objects" + , "aliases": [ + "dvd" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📼" + , "description": "videocassette" + , "category": "Objects" + , "aliases": [ + "vhs" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📷" + , "description": "camera" + , "category": "Objects" + , "aliases": [ + "camera" + ] + , "tags": [ + "photo" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📸" + , "description": "camera with flash" + , "category": "Objects" + , "aliases": [ + "camera_flash" + ] + , "tags": [ + "photo" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "📹" + , "description": "video camera" + , "category": "Objects" + , "aliases": [ + "video_camera" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎥" + , "description": "movie camera" + , "category": "Objects" + , "aliases": [ + "movie_camera" + ] + , "tags": [ + "film" + , "video" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📽" + , "description": "film projector" + , "category": "Objects" + , "aliases": [ + "film_projector" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎞" + , "description": "film frames" + , "category": "Objects" + , "aliases": [ + "film_strip" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "📞" + , "description": "telephone receiver" + , "category": "Objects" + , "aliases": [ + "telephone_receiver" + ] + , "tags": [ + "phone" + , "call" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☎️" + , "description": "telephone" + , "category": "Objects" + , "aliases": [ + "phone" + , "telephone" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "📟" + , "description": "pager" + , "category": "Objects" + , "aliases": [ + "pager" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📠" + , "description": "fax machine" + , "category": "Objects" + , "aliases": [ + "fax" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📺" + , "description": "television" + , "category": "Objects" + , "aliases": [ + "tv" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📻" + , "description": "radio" + , "category": "Objects" + , "aliases": [ + "radio" + ] + , "tags": [ + "podcast" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎙" + , "description": "studio microphone" + , "category": "Objects" + , "aliases": [ + "studio_microphone" + ] + , "tags": [ + "podcast" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎚" + , "description": "level slider" + , "category": "Objects" + , "aliases": [ + "level_slider" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🎛" + , "description": "control knobs" + , "category": "Objects" + , "aliases": [ + "control_knobs" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⏱" + , "description": "stopwatch" + , "category": "Objects" + , "aliases": [ + "stopwatch" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.1" + } +, { + "emoji": "⏲" + , "description": "timer clock" + , "category": "Objects" + , "aliases": [ + "timer_clock" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.1" + } +, { + "emoji": "⏰" + , "description": "alarm clock" + , "category": "Objects" + , "aliases": [ + "alarm_clock" + ] + , "tags": [ + "morning" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕰" + , "description": "mantelpiece clock" + , "category": "Objects" + , "aliases": [ + "mantelpiece_clock" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⌛️" + , "description": "hourglass" + , "category": "Objects" + , "aliases": [ + "hourglass" + ] + , "tags": [ + "time" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "⏳" + , "description": "hourglass with flowing sand" + , "category": "Objects" + , "aliases": [ + "hourglass_flowing_sand" + ] + , "tags": [ + "time" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📡" + , "description": "satellite antenna" + , "category": "Objects" + , "aliases": [ + "satellite" + ] + , "tags": [ + "signal" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔋" + , "description": "battery" + , "category": "Objects" + , "aliases": [ + "battery" + ] + , "tags": [ + "power" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔌" + , "description": "electric plug" + , "category": "Objects" + , "aliases": [ + "electric_plug" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💡" + , "description": "light bulb" + , "category": "Objects" + , "aliases": [ + "bulb" + ] + , "tags": [ + "idea" + , "light" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔦" + , "description": "flashlight" + , "category": "Objects" + , "aliases": [ + "flashlight" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕯" + , "description": "candle" + , "category": "Objects" + , "aliases": [ + "candle" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🗑" + , "description": "wastebasket" + , "category": "Objects" + , "aliases": [ + "wastebasket" + ] + , "tags": [ + "trash" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🛢" + , "description": "oil drum" + , "category": "Objects" + , "aliases": [ + "oil_drum" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "💸" + , "description": "money with wings" + , "category": "Objects" + , "aliases": [ + "money_with_wings" + ] + , "tags": [ + "dollar" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💵" + , "description": "dollar banknote" + , "category": "Objects" + , "aliases": [ + "dollar" + ] + , "tags": [ + "money" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💴" + , "description": "yen banknote" + , "category": "Objects" + , "aliases": [ + "yen" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💶" + , "description": "euro banknote" + , "category": "Objects" + , "aliases": [ + "euro" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💷" + , "description": "pound banknote" + , "category": "Objects" + , "aliases": [ + "pound" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💰" + , "description": "money bag" + , "category": "Objects" + , "aliases": [ + "moneybag" + ] + , "tags": [ + "dollar" + , "cream" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💳" + , "description": "credit card" + , "category": "Objects" + , "aliases": [ + "credit_card" + ] + , "tags": [ + "subscription" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💎" + , "description": "gem stone" + , "category": "Objects" + , "aliases": [ + "gem" + ] + , "tags": [ + "diamond" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚖️" + , "description": "balance scale" + , "category": "Objects" + , "aliases": [ + "balance_scale" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "🔧" + , "description": "wrench" + , "category": "Objects" + , "aliases": [ + "wrench" + ] + , "tags": [ + "tool" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔨" + , "description": "hammer" + , "category": "Objects" + , "aliases": [ + "hammer" + ] + , "tags": [ + "tool" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚒" + , "description": "hammer and pick" + , "category": "Objects" + , "aliases": [ + "hammer_and_pick" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "🛠" + , "description": "hammer and wrench" + , "category": "Objects" + , "aliases": [ + "hammer_and_wrench" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛏" + , "description": "pick" + , "category": "Objects" + , "aliases": [ + "pick" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🔩" + , "description": "nut and bolt" + , "category": "Objects" + , "aliases": [ + "nut_and_bolt" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚙️" + , "description": "gear" + , "category": "Objects" + , "aliases": [ + "gear" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "⛓" + , "description": "chains" + , "category": "Objects" + , "aliases": [ + "chains" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "9.1" + } +, { + "emoji": "🔫" + , "description": "pistol" + , "category": "Objects" + , "aliases": [ + "gun" + ] + , "tags": [ + "shoot" + , "weapon" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💣" + , "description": "bomb" + , "category": "Objects" + , "aliases": [ + "bomb" + ] + , "tags": [ + "boom" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔪" + , "description": "kitchen knife" + , "category": "Objects" + , "aliases": [ + "hocho" + , "knife" + ] + , "tags": [ + "cut" + , "chop" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🗡" + , "description": "dagger" + , "category": "Objects" + , "aliases": [ + "dagger" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⚔️" + , "description": "crossed swords" + , "category": "Objects" + , "aliases": [ + "crossed_swords" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "🛡" + , "description": "shield" + , "category": "Objects" + , "aliases": [ + "shield" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🚬" + , "description": "cigarette" + , "category": "Objects" + , "aliases": [ + "smoking" + ] + , "tags": [ + "cigarette" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚰️" + , "description": "coffin" + , "category": "Objects" + , "aliases": [ + "coffin" + ] + , "tags": [ + "funeral" + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "⚱️" + , "description": "funeral urn" + , "category": "Objects" + , "aliases": [ + "funeral_urn" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "🏺" + , "description": "amphora" + , "category": "Objects" + , "aliases": [ + "amphora" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🔮" + , "description": "crystal ball" + , "category": "Objects" + , "aliases": [ + "crystal_ball" + ] + , "tags": [ + "fortune" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📿" + , "description": "prayer beads" + , "category": "Objects" + , "aliases": [ + "prayer_beads" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "💈" + , "description": "barber pole" + , "category": "Objects" + , "aliases": [ + "barber" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚗️" + , "description": "alembic" + , "category": "Objects" + , "aliases": [ + "alembic" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "🔭" + , "description": "telescope" + , "category": "Objects" + , "aliases": [ + "telescope" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔬" + , "description": "microscope" + , "category": "Objects" + , "aliases": [ + "microscope" + ] + , "tags": [ + "science" + , "laboratory" + , "investigate" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕳" + , "description": "hole" + , "category": "Objects" + , "aliases": [ + "hole" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "💊" + , "description": "pill" + , "category": "Objects" + , "aliases": [ + "pill" + ] + , "tags": [ + "health" + , "medicine" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💉" + , "description": "syringe" + , "category": "Objects" + , "aliases": [ + "syringe" + ] + , "tags": [ + "health" + , "hospital" + , "needle" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌡" + , "description": "thermometer" + , "category": "Objects" + , "aliases": [ + "thermometer" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🚽" + , "description": "toilet" + , "category": "Objects" + , "aliases": [ + "toilet" + ] + , "tags": [ + "wc" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚰" + , "description": "potable water" + , "category": "Objects" + , "aliases": [ + "potable_water" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚿" + , "description": "shower" + , "category": "Objects" + , "aliases": [ + "shower" + ] + , "tags": [ + "bath" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛁" + , "description": "bathtub" + , "category": "Objects" + , "aliases": [ + "bathtub" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛀" + , "description": "person taking bath" + , "category": "Objects" + , "aliases": [ + "bath" + ] + , "tags": [ + "shower" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛎" + , "description": "bellhop bell" + , "category": "Objects" + , "aliases": [ + "bellhop_bell" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🔑" + , "description": "key" + , "category": "Objects" + , "aliases": [ + "key" + ] + , "tags": [ + "lock" + , "password" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🗝" + , "description": "old key" + , "category": "Objects" + , "aliases": [ + "old_key" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🚪" + , "description": "door" + , "category": "Objects" + , "aliases": [ + "door" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛋" + , "description": "couch and lamp" + , "category": "Objects" + , "aliases": [ + "couch_and_lamp" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🛏" + , "description": "bed" + , "category": "Objects" + , "aliases": [ + "bed" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🛌" + , "description": "person in bed" + , "category": "Objects" + , "aliases": [ + "sleeping_bed" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🖼" + , "description": "framed picture" + , "category": "Objects" + , "aliases": [ + "framed_picture" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🛍" + , "description": "shopping bags" + , "category": "Objects" + , "aliases": [ + "shopping" + ] + , "tags": [ + "bags" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🛒" + , "description": "shopping cart" + , "category": "Objects" + , "aliases": [ + "shopping_cart" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "🎁" + , "description": "wrapped gift" + , "category": "Objects" + , "aliases": [ + "gift" + ] + , "tags": [ + "present" + , "birthday" + , "christmas" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎈" + , "description": "balloon" + , "category": "Objects" + , "aliases": [ + "balloon" + ] + , "tags": [ + "party" + , "birthday" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎏" + , "description": "carp streamer" + , "category": "Objects" + , "aliases": [ + "flags" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎀" + , "description": "ribbon" + , "category": "Objects" + , "aliases": [ + "ribbon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎊" + , "description": "confetti ball" + , "category": "Objects" + , "aliases": [ + "confetti_ball" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎉" + , "description": "party popper" + , "category": "Objects" + , "aliases": [ + "tada" + ] + , "tags": [ + "hooray" + , "party" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎎" + , "description": "Japanese dolls" + , "category": "Objects" + , "aliases": [ + "dolls" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏮" + , "description": "red paper lantern" + , "category": "Objects" + , "aliases": [ + "izakaya_lantern" + , "lantern" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎐" + , "description": "wind chime" + , "category": "Objects" + , "aliases": [ + "wind_chime" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "✉️" + , "description": "envelope" + , "category": "Objects" + , "aliases": [ + "email" + , "envelope" + ] + , "tags": [ + "letter" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "📩" + , "description": "envelope with arrow" + , "category": "Objects" + , "aliases": [ + "envelope_with_arrow" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📨" + , "description": "incoming envelope" + , "category": "Objects" + , "aliases": [ + "incoming_envelope" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📧" + , "description": "e-mail" + , "category": "Objects" + , "aliases": [ + "e-mail" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💌" + , "description": "love letter" + , "category": "Objects" + , "aliases": [ + "love_letter" + ] + , "tags": [ + "email" + , "envelope" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📥" + , "description": "inbox tray" + , "category": "Objects" + , "aliases": [ + "inbox_tray" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📤" + , "description": "outbox tray" + , "category": "Objects" + , "aliases": [ + "outbox_tray" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📦" + , "description": "package" + , "category": "Objects" + , "aliases": [ + "package" + ] + , "tags": [ + "shipping" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏷" + , "description": "label" + , "category": "Objects" + , "aliases": [ + "label" + ] + , "tags": [ + "tag" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "📪" + , "description": "closed mailbox with lowered flag" + , "category": "Objects" + , "aliases": [ + "mailbox_closed" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📫" + , "description": "closed mailbox with raised flag" + , "category": "Objects" + , "aliases": [ + "mailbox" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📬" + , "description": "open mailbox with raised flag" + , "category": "Objects" + , "aliases": [ + "mailbox_with_mail" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📭" + , "description": "open mailbox with lowered flag" + , "category": "Objects" + , "aliases": [ + "mailbox_with_no_mail" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📮" + , "description": "postbox" + , "category": "Objects" + , "aliases": [ + "postbox" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📯" + , "description": "postal horn" + , "category": "Objects" + , "aliases": [ + "postal_horn" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📜" + , "description": "scroll" + , "category": "Objects" + , "aliases": [ + "scroll" + ] + , "tags": [ + "document" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📃" + , "description": "page with curl" + , "category": "Objects" + , "aliases": [ + "page_with_curl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📄" + , "description": "page facing up" + , "category": "Objects" + , "aliases": [ + "page_facing_up" + ] + , "tags": [ + "document" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📑" + , "description": "bookmark tabs" + , "category": "Objects" + , "aliases": [ + "bookmark_tabs" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📊" + , "description": "bar chart" + , "category": "Objects" + , "aliases": [ + "bar_chart" + ] + , "tags": [ + "stats" + , "metrics" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📈" + , "description": "chart increasing" + , "category": "Objects" + , "aliases": [ + "chart_with_upwards_trend" + ] + , "tags": [ + "graph" + , "metrics" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📉" + , "description": "chart decreasing" + , "category": "Objects" + , "aliases": [ + "chart_with_downwards_trend" + ] + , "tags": [ + "graph" + , "metrics" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🗒" + , "description": "spiral notepad" + , "category": "Objects" + , "aliases": [ + "spiral_notepad" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🗓" + , "description": "spiral calendar" + , "category": "Objects" + , "aliases": [ + "spiral_calendar" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "📆" + , "description": "tear-off calendar" + , "category": "Objects" + , "aliases": [ + "calendar" + ] + , "tags": [ + "schedule" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📅" + , "description": "calendar" + , "category": "Objects" + , "aliases": [ + "date" + ] + , "tags": [ + "calendar" + , "schedule" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📇" + , "description": "card index" + , "category": "Objects" + , "aliases": [ + "card_index" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🗃" + , "description": "card file box" + , "category": "Objects" + , "aliases": [ + "card_file_box" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🗳" + , "description": "ballot box with ballot" + , "category": "Objects" + , "aliases": [ + "ballot_box" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🗄" + , "description": "file cabinet" + , "category": "Objects" + , "aliases": [ + "file_cabinet" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "📋" + , "description": "clipboard" + , "category": "Objects" + , "aliases": [ + "clipboard" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📁" + , "description": "file folder" + , "category": "Objects" + , "aliases": [ + "file_folder" + ] + , "tags": [ + "directory" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📂" + , "description": "open file folder" + , "category": "Objects" + , "aliases": [ + "open_file_folder" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🗂" + , "description": "card index dividers" + , "category": "Objects" + , "aliases": [ + "card_index_dividers" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🗞" + , "description": "rolled-up newspaper" + , "category": "Objects" + , "aliases": [ + "newspaper_roll" + ] + , "tags": [ + "press" + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "📰" + , "description": "newspaper" + , "category": "Objects" + , "aliases": [ + "newspaper" + ] + , "tags": [ + "press" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📓" + , "description": "notebook" + , "category": "Objects" + , "aliases": [ + "notebook" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📔" + , "description": "notebook with decorative cover" + , "category": "Objects" + , "aliases": [ + "notebook_with_decorative_cover" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📒" + , "description": "ledger" + , "category": "Objects" + , "aliases": [ + "ledger" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📕" + , "description": "closed book" + , "category": "Objects" + , "aliases": [ + "closed_book" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📗" + , "description": "green book" + , "category": "Objects" + , "aliases": [ + "green_book" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📘" + , "description": "blue book" + , "category": "Objects" + , "aliases": [ + "blue_book" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📙" + , "description": "orange book" + , "category": "Objects" + , "aliases": [ + "orange_book" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📚" + , "description": "books" + , "category": "Objects" + , "aliases": [ + "books" + ] + , "tags": [ + "library" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📖" + , "description": "open book" + , "category": "Objects" + , "aliases": [ + "book" + , "open_book" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔖" + , "description": "bookmark" + , "category": "Objects" + , "aliases": [ + "bookmark" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔗" + , "description": "link" + , "category": "Objects" + , "aliases": [ + "link" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📎" + , "description": "paperclip" + , "category": "Objects" + , "aliases": [ + "paperclip" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🖇" + , "description": "linked paperclips" + , "category": "Objects" + , "aliases": [ + "paperclips" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "📐" + , "description": "triangular ruler" + , "category": "Objects" + , "aliases": [ + "triangular_ruler" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📏" + , "description": "straight ruler" + , "category": "Objects" + , "aliases": [ + "straight_ruler" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📌" + , "description": "pushpin" + , "category": "Objects" + , "aliases": [ + "pushpin" + ] + , "tags": [ + "location" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📍" + , "description": "round pushpin" + , "category": "Objects" + , "aliases": [ + "round_pushpin" + ] + , "tags": [ + "location" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "✂️" + , "description": "scissors" + , "category": "Objects" + , "aliases": [ + "scissors" + ] + , "tags": [ + "cut" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🖊" + , "description": "pen" + , "category": "Objects" + , "aliases": [ + "pen" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🖋" + , "description": "fountain pen" + , "category": "Objects" + , "aliases": [ + "fountain_pen" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "✒️" + , "description": "black nib" + , "category": "Objects" + , "aliases": [ + "black_nib" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🖌" + , "description": "paintbrush" + , "category": "Objects" + , "aliases": [ + "paintbrush" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🖍" + , "description": "crayon" + , "category": "Objects" + , "aliases": [ + "crayon" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "📝" + , "description": "memo" + , "category": "Objects" + , "aliases": [ + "memo" + , "pencil" + ] + , "tags": [ + "document" + , "note" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "✏️" + , "description": "pencil" + , "category": "Objects" + , "aliases": [ + "pencil2" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🔍" + , "description": "left-pointing magnifying glass" + , "category": "Objects" + , "aliases": [ + "mag" + ] + , "tags": [ + "search" + , "zoom" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔎" + , "description": "right-pointing magnifying glass" + , "category": "Objects" + , "aliases": [ + "mag_right" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔏" + , "description": "locked with pen" + , "category": "Objects" + , "aliases": [ + "lock_with_ink_pen" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔐" + , "description": "locked with key" + , "category": "Objects" + , "aliases": [ + "closed_lock_with_key" + ] + , "tags": [ + "security" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔒" + , "description": "locked" + , "category": "Objects" + , "aliases": [ + "lock" + ] + , "tags": [ + "security" + , "private" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔓" + , "description": "unlocked" + , "category": "Objects" + , "aliases": [ + "unlock" + ] + , "tags": [ + "security" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "❤️" + , "description": "red heart" + , "category": "Symbols" + , "aliases": [ + "heart" + ] + , "tags": [ + "love" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "💛" + , "description": "yellow heart" + , "category": "Symbols" + , "aliases": [ + "yellow_heart" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💚" + , "description": "green heart" + , "category": "Symbols" + , "aliases": [ + "green_heart" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💙" + , "description": "blue heart" + , "category": "Symbols" + , "aliases": [ + "blue_heart" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💜" + , "description": "purple heart" + , "category": "Symbols" + , "aliases": [ + "purple_heart" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🖤" + , "description": "black heart" + , "category": "Symbols" + , "aliases": [ + "black_heart" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "💔" + , "description": "broken heart" + , "category": "Symbols" + , "aliases": [ + "broken_heart" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "❣️" + , "description": "heavy heart exclamation" + , "category": "Symbols" + , "aliases": [ + "heavy_heart_exclamation" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "💕" + , "description": "two hearts" + , "category": "Symbols" + , "aliases": [ + "two_hearts" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💞" + , "description": "revolving hearts" + , "category": "Symbols" + , "aliases": [ + "revolving_hearts" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💓" + , "description": "beating heart" + , "category": "Symbols" + , "aliases": [ + "heartbeat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💗" + , "description": "growing heart" + , "category": "Symbols" + , "aliases": [ + "heartpulse" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💖" + , "description": "sparkling heart" + , "category": "Symbols" + , "aliases": [ + "sparkling_heart" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💘" + , "description": "heart with arrow" + , "category": "Symbols" + , "aliases": [ + "cupid" + ] + , "tags": [ + "love" + , "heart" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💝" + , "description": "heart with ribbon" + , "category": "Symbols" + , "aliases": [ + "gift_heart" + ] + , "tags": [ + "chocolates" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💟" + , "description": "heart decoration" + , "category": "Symbols" + , "aliases": [ + "heart_decoration" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☮️" + , "description": "peace symbol" + , "category": "Symbols" + , "aliases": [ + "peace_symbol" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "✝️" + , "description": "latin cross" + , "category": "Symbols" + , "aliases": [ + "latin_cross" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "☪️" + , "description": "star and crescent" + , "category": "Symbols" + , "aliases": [ + "star_and_crescent" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "🕉" + , "description": "om" + , "category": "Symbols" + , "aliases": [ + "om" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "☸️" + , "description": "wheel of dharma" + , "category": "Symbols" + , "aliases": [ + "wheel_of_dharma" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "✡️" + , "description": "star of David" + , "category": "Symbols" + , "aliases": [ + "star_of_david" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "🔯" + , "description": "dotted six-pointed star" + , "category": "Symbols" + , "aliases": [ + "six_pointed_star" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕎" + , "description": "menorah" + , "category": "Symbols" + , "aliases": [ + "menorah" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "☯️" + , "description": "yin yang" + , "category": "Symbols" + , "aliases": [ + "yin_yang" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "☦️" + , "description": "orthodox cross" + , "category": "Symbols" + , "aliases": [ + "orthodox_cross" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "🛐" + , "description": "place of worship" + , "category": "Symbols" + , "aliases": [ + "place_of_worship" + ] + , "tags": [ + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "⛎" + , "description": "Ophiuchus" + , "category": "Symbols" + , "aliases": [ + "ophiuchus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "♈️" + , "description": "Aries" + , "category": "Symbols" + , "aliases": [ + "aries" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♉️" + , "description": "Taurus" + , "category": "Symbols" + , "aliases": [ + "taurus" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♊️" + , "description": "Gemini" + , "category": "Symbols" + , "aliases": [ + "gemini" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♋️" + , "description": "Cancer" + , "category": "Symbols" + , "aliases": [ + "cancer" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♌️" + , "description": "Leo" + , "category": "Symbols" + , "aliases": [ + "leo" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♍️" + , "description": "Virgo" + , "category": "Symbols" + , "aliases": [ + "virgo" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♎️" + , "description": "Libra" + , "category": "Symbols" + , "aliases": [ + "libra" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♏️" + , "description": "Scorpius" + , "category": "Symbols" + , "aliases": [ + "scorpius" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♐️" + , "description": "Sagittarius" + , "category": "Symbols" + , "aliases": [ + "sagittarius" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♑️" + , "description": "Capricorn" + , "category": "Symbols" + , "aliases": [ + "capricorn" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♒️" + , "description": "Aquarius" + , "category": "Symbols" + , "aliases": [ + "aquarius" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♓️" + , "description": "Pisces" + , "category": "Symbols" + , "aliases": [ + "pisces" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🆔" + , "description": "ID button" + , "category": "Symbols" + , "aliases": [ + "id" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚛️" + , "description": "atom symbol" + , "category": "Symbols" + , "aliases": [ + "atom_symbol" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "🉑" + , "description": "Japanese “acceptable” button" + , "category": "Symbols" + , "aliases": [ + "accept" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "☢️" + , "description": "radioactive" + , "category": "Symbols" + , "aliases": [ + "radioactive" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "☣️" + , "description": "biohazard" + , "category": "Symbols" + , "aliases": [ + "biohazard" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "📴" + , "description": "mobile phone off" + , "category": "Symbols" + , "aliases": [ + "mobile_phone_off" + ] + , "tags": [ + "mute" + , "off" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📳" + , "description": "vibration mode" + , "category": "Symbols" + , "aliases": [ + "vibration_mode" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈶" + , "description": "Japanese “not free of charge” button" + , "category": "Symbols" + , "aliases": [ + "u6709" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈚️" + , "description": "Japanese “free of charge” button" + , "category": "Symbols" + , "aliases": [ + "u7121" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🈸" + , "description": "Japanese “application” button" + , "category": "Symbols" + , "aliases": [ + "u7533" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈺" + , "description": "Japanese “open for business” button" + , "category": "Symbols" + , "aliases": [ + "u55b6" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈷️" + , "description": "Japanese “monthly amount” button" + , "category": "Symbols" + , "aliases": [ + "u6708" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "✴️" + , "description": "eight-pointed star" + , "category": "Symbols" + , "aliases": [ + "eight_pointed_black_star" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🆚" + , "description": "VS button" + , "category": "Symbols" + , "aliases": [ + "vs" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💮" + , "description": "white flower" + , "category": "Symbols" + , "aliases": [ + "white_flower" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🉐" + , "description": "Japanese “bargain” button" + , "category": "Symbols" + , "aliases": [ + "ideograph_advantage" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "㊙️" + , "description": "Japanese “secret” button" + , "category": "Symbols" + , "aliases": [ + "secret" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "㊗️" + , "description": "Japanese “congratulations” button" + , "category": "Symbols" + , "aliases": [ + "congratulations" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🈴" + , "description": "Japanese “passing grade” button" + , "category": "Symbols" + , "aliases": [ + "u5408" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈵" + , "description": "Japanese “no vacancy” button" + , "category": "Symbols" + , "aliases": [ + "u6e80" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈹" + , "description": "Japanese “discount” button" + , "category": "Symbols" + , "aliases": [ + "u5272" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈲" + , "description": "Japanese “prohibited” button" + , "category": "Symbols" + , "aliases": [ + "u7981" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🅰️" + , "description": "A button (blood type)" + , "category": "Symbols" + , "aliases": [ + "a" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🅱️" + , "description": "B button (blood type)" + , "category": "Symbols" + , "aliases": [ + "b" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🆎" + , "description": "AB button (blood type)" + , "category": "Symbols" + , "aliases": [ + "ab" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🆑" + , "description": "CL button" + , "category": "Symbols" + , "aliases": [ + "cl" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🅾️" + , "description": "O button (blood type)" + , "category": "Symbols" + , "aliases": [ + "o2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🆘" + , "description": "SOS button" + , "category": "Symbols" + , "aliases": [ + "sos" + ] + , "tags": [ + "help" + , "emergency" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "❌" + , "description": "cross mark" + , "category": "Symbols" + , "aliases": [ + "x" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⭕️" + , "description": "heavy large circle" + , "category": "Symbols" + , "aliases": [ + "o" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🛑" + , "description": "stop sign" + , "category": "Symbols" + , "aliases": [ + "stop_sign" + ] + , "tags": [ + ] + , "unicode_version": "9.0" + , "ios_version": "10.2" + } +, { + "emoji": "⛔️" + , "description": "no entry" + , "category": "Symbols" + , "aliases": [ + "no_entry" + ] + , "tags": [ + "limit" + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "📛" + , "description": "name badge" + , "category": "Symbols" + , "aliases": [ + "name_badge" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚫" + , "description": "prohibited" + , "category": "Symbols" + , "aliases": [ + "no_entry_sign" + ] + , "tags": [ + "block" + , "forbidden" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💯" + , "description": "hundred points" + , "category": "Symbols" + , "aliases": [ + "100" + ] + , "tags": [ + "score" + , "perfect" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💢" + , "description": "anger symbol" + , "category": "Symbols" + , "aliases": [ + "anger" + ] + , "tags": [ + "angry" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "♨️" + , "description": "hot springs" + , "category": "Symbols" + , "aliases": [ + "hotsprings" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🚷" + , "description": "no pedestrians" + , "category": "Symbols" + , "aliases": [ + "no_pedestrians" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚯" + , "description": "no littering" + , "category": "Symbols" + , "aliases": [ + "do_not_litter" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚳" + , "description": "no bicycles" + , "category": "Symbols" + , "aliases": [ + "no_bicycles" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚱" + , "description": "non-potable water" + , "category": "Symbols" + , "aliases": [ + "non-potable_water" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔞" + , "description": "no one under eighteen" + , "category": "Symbols" + , "aliases": [ + "underage" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📵" + , "description": "no mobile phones" + , "category": "Symbols" + , "aliases": [ + "no_mobile_phones" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚭" + , "description": "no smoking" + , "category": "Symbols" + , "aliases": [ + "no_smoking" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "❗️" + , "description": "exclamation mark" + , "category": "Symbols" + , "aliases": [ + "exclamation" + , "heavy_exclamation_mark" + ] + , "tags": [ + "bang" + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "❕" + , "description": "white exclamation mark" + , "category": "Symbols" + , "aliases": [ + "grey_exclamation" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "❓" + , "description": "question mark" + , "category": "Symbols" + , "aliases": [ + "question" + ] + , "tags": [ + "confused" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "❔" + , "description": "white question mark" + , "category": "Symbols" + , "aliases": [ + "grey_question" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "‼️" + , "description": "double exclamation mark" + , "category": "Symbols" + , "aliases": [ + "bangbang" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "⁉️" + , "description": "exclamation question mark" + , "category": "Symbols" + , "aliases": [ + "interrobang" + ] + , "tags": [ + ] + , "unicode_version": "3.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔅" + , "description": "dim button" + , "category": "Symbols" + , "aliases": [ + "low_brightness" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔆" + , "description": "bright button" + , "category": "Symbols" + , "aliases": [ + "high_brightness" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "〽️" + , "description": "part alternation mark" + , "category": "Symbols" + , "aliases": [ + "part_alternation_mark" + ] + , "tags": [ + ] + , "unicode_version": "3.2" + , "ios_version": "6.0" + } +, { + "emoji": "⚠️" + , "description": "warning" + , "category": "Symbols" + , "aliases": [ + "warning" + ] + , "tags": [ + "wip" + ] + , "unicode_version": "4.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚸" + , "description": "children crossing" + , "category": "Symbols" + , "aliases": [ + "children_crossing" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔱" + , "description": "trident emblem" + , "category": "Symbols" + , "aliases": [ + "trident" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚜️" + , "description": "fleur-de-lis" + , "category": "Symbols" + , "aliases": [ + "fleur_de_lis" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "9.1" + } +, { + "emoji": "🔰" + , "description": "Japanese symbol for beginner" + , "category": "Symbols" + , "aliases": [ + "beginner" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "♻️" + , "description": "recycling symbol" + , "category": "Symbols" + , "aliases": [ + "recycle" + ] + , "tags": [ + "environment" + , "green" + ] + , "unicode_version": "3.2" + , "ios_version": "6.0" + } +, { + "emoji": "✅" + , "description": "white heavy check mark" + , "category": "Symbols" + , "aliases": [ + "white_check_mark" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈯️" + , "description": "Japanese “reserved” button" + , "category": "Symbols" + , "aliases": [ + "u6307" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "💹" + , "description": "chart increasing with yen" + , "category": "Symbols" + , "aliases": [ + "chart" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "❇️" + , "description": "sparkle" + , "category": "Symbols" + , "aliases": [ + "sparkle" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "✳️" + , "description": "eight-spoked asterisk" + , "category": "Symbols" + , "aliases": [ + "eight_spoked_asterisk" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "❎" + , "description": "cross mark button" + , "category": "Symbols" + , "aliases": [ + "negative_squared_cross_mark" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🌐" + , "description": "globe with meridians" + , "category": "Symbols" + , "aliases": [ + "globe_with_meridians" + ] + , "tags": [ + "world" + , "global" + , "international" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💠" + , "description": "diamond with a dot" + , "category": "Symbols" + , "aliases": [ + "diamond_shape_with_a_dot_inside" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "Ⓜ️" + , "description": "circled M" + , "category": "Symbols" + , "aliases": [ + "m" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🌀" + , "description": "cyclone" + , "category": "Symbols" + , "aliases": [ + "cyclone" + ] + , "tags": [ + "swirl" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💤" + , "description": "zzz" + , "category": "Symbols" + , "aliases": [ + "zzz" + ] + , "tags": [ + "sleeping" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏧" + , "description": "ATM sign" + , "category": "Symbols" + , "aliases": [ + "atm" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚾" + , "description": "water closet" + , "category": "Symbols" + , "aliases": [ + "wc" + ] + , "tags": [ + "toilet" + , "restroom" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "♿️" + , "description": "wheelchair symbol" + , "category": "Symbols" + , "aliases": [ + "wheelchair" + ] + , "tags": [ + "accessibility" + ] + , "unicode_version": "4.1" + , "ios_version": "6.0" + } +, { + "emoji": "🅿️" + , "description": "P button" + , "category": "Symbols" + , "aliases": [ + "parking" + ] + , "tags": [ + ] + , "unicode_version": "5.2" + , "ios_version": "6.0" + } +, { + "emoji": "🈳" + , "description": "Japanese “vacancy” button" + , "category": "Symbols" + , "aliases": [ + "u7a7a" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈂️" + , "description": "Japanese “service charge” button" + , "category": "Symbols" + , "aliases": [ + "sa" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛂" + , "description": "passport control" + , "category": "Symbols" + , "aliases": [ + "passport_control" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛃" + , "description": "customs" + , "category": "Symbols" + , "aliases": [ + "customs" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛄" + , "description": "baggage claim" + , "category": "Symbols" + , "aliases": [ + "baggage_claim" + ] + , "tags": [ + "airport" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🛅" + , "description": "left luggage" + , "category": "Symbols" + , "aliases": [ + "left_luggage" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚹" + , "description": "men’s room" + , "category": "Symbols" + , "aliases": [ + "mens" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚺" + , "description": "women’s room" + , "category": "Symbols" + , "aliases": [ + "womens" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚼" + , "description": "baby symbol" + , "category": "Symbols" + , "aliases": [ + "baby_symbol" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚻" + , "description": "restroom" + , "category": "Symbols" + , "aliases": [ + "restroom" + ] + , "tags": [ + "toilet" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚮" + , "description": "litter in bin sign" + , "category": "Symbols" + , "aliases": [ + "put_litter_in_its_place" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎦" + , "description": "cinema" + , "category": "Symbols" + , "aliases": [ + "cinema" + ] + , "tags": [ + "film" + , "movie" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📶" + , "description": "antenna bars" + , "category": "Symbols" + , "aliases": [ + "signal_strength" + ] + , "tags": [ + "wifi" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🈁" + , "description": "Japanese “here” button" + , "category": "Symbols" + , "aliases": [ + "koko" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔣" + , "description": "input symbols" + , "category": "Symbols" + , "aliases": [ + "symbols" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "ℹ️" + , "description": "information" + , "category": "Symbols" + , "aliases": [ + "information_source" + ] + , "tags": [ + ] + , "unicode_version": "3.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔤" + , "description": "input latin letters" + , "category": "Symbols" + , "aliases": [ + "abc" + ] + , "tags": [ + "alphabet" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔡" + , "description": "input latin lowercase" + , "category": "Symbols" + , "aliases": [ + "abcd" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔠" + , "description": "input latin uppercase" + , "category": "Symbols" + , "aliases": [ + "capital_abcd" + ] + , "tags": [ + "letters" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🆖" + , "description": "NG button" + , "category": "Symbols" + , "aliases": [ + "ng" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🆗" + , "description": "OK button" + , "category": "Symbols" + , "aliases": [ + "ok" + ] + , "tags": [ + "yes" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🆙" + , "description": "UP! button" + , "category": "Symbols" + , "aliases": [ + "up" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🆒" + , "description": "COOL button" + , "category": "Symbols" + , "aliases": [ + "cool" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🆕" + , "description": "NEW button" + , "category": "Symbols" + , "aliases": [ + "new" + ] + , "tags": [ + "fresh" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🆓" + , "description": "FREE button" + , "category": "Symbols" + , "aliases": [ + "free" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "0️⃣" + , "description": "keycap: 0" + , "category": "Symbols" + , "aliases": [ + "zero" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "1️⃣" + , "description": "keycap: 1" + , "category": "Symbols" + , "aliases": [ + "one" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "2️⃣" + , "description": "keycap: 2" + , "category": "Symbols" + , "aliases": [ + "two" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "3️⃣" + , "description": "keycap: 3" + , "category": "Symbols" + , "aliases": [ + "three" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "4️⃣" + , "description": "keycap: 4" + , "category": "Symbols" + , "aliases": [ + "four" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "5️⃣" + , "description": "keycap: 5" + , "category": "Symbols" + , "aliases": [ + "five" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "6️⃣" + , "description": "keycap: 6" + , "category": "Symbols" + , "aliases": [ + "six" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "7️⃣" + , "description": "keycap: 7" + , "category": "Symbols" + , "aliases": [ + "seven" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "8️⃣" + , "description": "keycap: 8" + , "category": "Symbols" + , "aliases": [ + "eight" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "9️⃣" + , "description": "keycap: 9" + , "category": "Symbols" + , "aliases": [ + "nine" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🔟" + , "description": "keycap 10" + , "category": "Symbols" + , "aliases": [ + "keycap_ten" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔢" + , "description": "input numbers" + , "category": "Symbols" + , "aliases": [ + "1234" + ] + , "tags": [ + "numbers" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "#️⃣" + , "description": "keycap: #" + , "category": "Symbols" + , "aliases": [ + "hash" + ] + , "tags": [ + "number" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "*️⃣" + , "description": "keycap: *" + , "category": "Symbols" + , "aliases": [ + "asterisk" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "9.1" + } +, { + "emoji": "▶️" + , "description": "play button" + , "category": "Symbols" + , "aliases": [ + "arrow_forward" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "⏸" + , "description": "pause button" + , "category": "Symbols" + , "aliases": [ + "pause_button" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⏯" + , "description": "play or pause button" + , "category": "Symbols" + , "aliases": [ + "play_or_pause_button" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.1" + } +, { + "emoji": "⏹" + , "description": "stop button" + , "category": "Symbols" + , "aliases": [ + "stop_button" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⏺" + , "description": "record button" + , "category": "Symbols" + , "aliases": [ + "record_button" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "⏭" + , "description": "next track button" + , "category": "Symbols" + , "aliases": [ + "next_track_button" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.1" + } +, { + "emoji": "⏮" + , "description": "last track button" + , "category": "Symbols" + , "aliases": [ + "previous_track_button" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.1" + } +, { + "emoji": "⏩" + , "description": "fast-forward button" + , "category": "Symbols" + , "aliases": [ + "fast_forward" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⏪" + , "description": "fast reverse button" + , "category": "Symbols" + , "aliases": [ + "rewind" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⏫" + , "description": "fast up button" + , "category": "Symbols" + , "aliases": [ + "arrow_double_up" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⏬" + , "description": "fast down button" + , "category": "Symbols" + , "aliases": [ + "arrow_double_down" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "◀️" + , "description": "reverse button" + , "category": "Symbols" + , "aliases": [ + "arrow_backward" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🔼" + , "description": "up button" + , "category": "Symbols" + , "aliases": [ + "arrow_up_small" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔽" + , "description": "down button" + , "category": "Symbols" + , "aliases": [ + "arrow_down_small" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "➡️" + , "description": "right arrow" + , "category": "Symbols" + , "aliases": [ + "arrow_right" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "⬅️" + , "description": "left arrow" + , "category": "Symbols" + , "aliases": [ + "arrow_left" + ] + , "tags": [ + ] + , "unicode_version": "4.0" + , "ios_version": "6.0" + } +, { + "emoji": "⬆️" + , "description": "up arrow" + , "category": "Symbols" + , "aliases": [ + "arrow_up" + ] + , "tags": [ + ] + , "unicode_version": "4.0" + , "ios_version": "6.0" + } +, { + "emoji": "⬇️" + , "description": "down arrow" + , "category": "Symbols" + , "aliases": [ + "arrow_down" + ] + , "tags": [ + ] + , "unicode_version": "4.0" + , "ios_version": "6.0" + } +, { + "emoji": "↗️" + , "description": "up-right arrow" + , "category": "Symbols" + , "aliases": [ + "arrow_upper_right" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "↘️" + , "description": "down-right arrow" + , "category": "Symbols" + , "aliases": [ + "arrow_lower_right" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "↙️" + , "description": "down-left arrow" + , "category": "Symbols" + , "aliases": [ + "arrow_lower_left" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "↖️" + , "description": "up-left arrow" + , "category": "Symbols" + , "aliases": [ + "arrow_upper_left" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "↕️" + , "description": "up-down arrow" + , "category": "Symbols" + , "aliases": [ + "arrow_up_down" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "↔️" + , "description": "left-right arrow" + , "category": "Symbols" + , "aliases": [ + "left_right_arrow" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "↪️" + , "description": "left arrow curving right" + , "category": "Symbols" + , "aliases": [ + "arrow_right_hook" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "↩️" + , "description": "right arrow curving left" + , "category": "Symbols" + , "aliases": [ + "leftwards_arrow_with_hook" + ] + , "tags": [ + "return" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "⤴️" + , "description": "right arrow curving up" + , "category": "Symbols" + , "aliases": [ + "arrow_heading_up" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "⤵️" + , "description": "right arrow curving down" + , "category": "Symbols" + , "aliases": [ + "arrow_heading_down" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🔀" + , "description": "shuffle tracks button" + , "category": "Symbols" + , "aliases": [ + "twisted_rightwards_arrows" + ] + , "tags": [ + "shuffle" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔁" + , "description": "repeat button" + , "category": "Symbols" + , "aliases": [ + "repeat" + ] + , "tags": [ + "loop" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔂" + , "description": "repeat single button" + , "category": "Symbols" + , "aliases": [ + "repeat_one" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔄" + , "description": "anticlockwise arrows button" + , "category": "Symbols" + , "aliases": [ + "arrows_counterclockwise" + ] + , "tags": [ + "sync" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔃" + , "description": "clockwise vertical arrows" + , "category": "Symbols" + , "aliases": [ + "arrows_clockwise" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎵" + , "description": "musical note" + , "category": "Symbols" + , "aliases": [ + "musical_note" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎶" + , "description": "musical notes" + , "category": "Symbols" + , "aliases": [ + "notes" + ] + , "tags": [ + "music" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "➕" + , "description": "heavy plus sign" + , "category": "Symbols" + , "aliases": [ + "heavy_plus_sign" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "➖" + , "description": "heavy minus sign" + , "category": "Symbols" + , "aliases": [ + "heavy_minus_sign" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "➗" + , "description": "heavy division sign" + , "category": "Symbols" + , "aliases": [ + "heavy_division_sign" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "✖️" + , "description": "heavy multiplication x" + , "category": "Symbols" + , "aliases": [ + "heavy_multiplication_x" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "💲" + , "description": "heavy dollar sign" + , "category": "Symbols" + , "aliases": [ + "heavy_dollar_sign" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💱" + , "description": "currency exchange" + , "category": "Symbols" + , "aliases": [ + "currency_exchange" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "™️" + , "description": "trade mark" + , "category": "Symbols" + , "aliases": [ + "tm" + ] + , "tags": [ + "trademark" + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "©️" + , "description": "copyright" + , "category": "Symbols" + , "aliases": [ + "copyright" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "®️" + , "description": "registered" + , "category": "Symbols" + , "aliases": [ + "registered" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "〰️" + , "description": "wavy dash" + , "category": "Symbols" + , "aliases": [ + "wavy_dash" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "➰" + , "description": "curly loop" + , "category": "Symbols" + , "aliases": [ + "curly_loop" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "➿" + , "description": "double curly loop" + , "category": "Symbols" + , "aliases": [ + "loop" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔚" + , "description": "END arrow" + , "category": "Symbols" + , "aliases": [ + "end" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔙" + , "description": "BACK arrow" + , "category": "Symbols" + , "aliases": [ + "back" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔛" + , "description": "ON! arrow" + , "category": "Symbols" + , "aliases": [ + "on" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔝" + , "description": "TOP arrow" + , "category": "Symbols" + , "aliases": [ + "top" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔜" + , "description": "SOON arrow" + , "category": "Symbols" + , "aliases": [ + "soon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "✔️" + , "description": "heavy check mark" + , "category": "Symbols" + , "aliases": [ + "heavy_check_mark" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "☑️" + , "description": "ballot box with check" + , "category": "Symbols" + , "aliases": [ + "ballot_box_with_check" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🔘" + , "description": "radio button" + , "category": "Symbols" + , "aliases": [ + "radio_button" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "⚪️" + , "description": "white circle" + , "category": "Symbols" + , "aliases": [ + "white_circle" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "6.0" + } +, { + "emoji": "⚫️" + , "description": "black circle" + , "category": "Symbols" + , "aliases": [ + "black_circle" + ] + , "tags": [ + ] + , "unicode_version": "4.1" + , "ios_version": "6.0" + } +, { + "emoji": "🔴" + , "description": "red circle" + , "category": "Symbols" + , "aliases": [ + "red_circle" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔵" + , "description": "blue circle" + , "category": "Symbols" + , "aliases": [ + "large_blue_circle" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔺" + , "description": "red triangle pointed up" + , "category": "Symbols" + , "aliases": [ + "small_red_triangle" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔻" + , "description": "red triangle pointed down" + , "category": "Symbols" + , "aliases": [ + "small_red_triangle_down" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔸" + , "description": "small orange diamond" + , "category": "Symbols" + , "aliases": [ + "small_orange_diamond" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔹" + , "description": "small blue diamond" + , "category": "Symbols" + , "aliases": [ + "small_blue_diamond" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔶" + , "description": "large orange diamond" + , "category": "Symbols" + , "aliases": [ + "large_orange_diamond" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔷" + , "description": "large blue diamond" + , "category": "Symbols" + , "aliases": [ + "large_blue_diamond" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔳" + , "description": "white square button" + , "category": "Symbols" + , "aliases": [ + "white_square_button" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔲" + , "description": "black square button" + , "category": "Symbols" + , "aliases": [ + "black_square_button" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "▪️" + , "description": "black small square" + , "category": "Symbols" + , "aliases": [ + "black_small_square" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "▫️" + , "description": "white small square" + , "category": "Symbols" + , "aliases": [ + "white_small_square" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "◾️" + , "description": "black medium-small square" + , "category": "Symbols" + , "aliases": [ + "black_medium_small_square" + ] + , "tags": [ + ] + , "unicode_version": "3.2" + , "ios_version": "6.0" + } +, { + "emoji": "◽️" + , "description": "white medium-small square" + , "category": "Symbols" + , "aliases": [ + "white_medium_small_square" + ] + , "tags": [ + ] + , "unicode_version": "3.2" + , "ios_version": "6.0" + } +, { + "emoji": "◼️" + , "description": "black medium square" + , "category": "Symbols" + , "aliases": [ + "black_medium_square" + ] + , "tags": [ + ] + , "unicode_version": "3.2" + , "ios_version": "6.0" + } +, { + "emoji": "◻️" + , "description": "white medium square" + , "category": "Symbols" + , "aliases": [ + "white_medium_square" + ] + , "tags": [ + ] + , "unicode_version": "3.2" + , "ios_version": "6.0" + } +, { + "emoji": "⬛️" + , "description": "black large square" + , "category": "Symbols" + , "aliases": [ + "black_large_square" + ] + , "tags": [ + ] + , "unicode_version": "5.1" + , "ios_version": "6.0" + } +, { + "emoji": "⬜️" + , "description": "white large square" + , "category": "Symbols" + , "aliases": [ + "white_large_square" + ] + , "tags": [ + ] + , "unicode_version": "5.1" + , "ios_version": "6.0" + } +, { + "emoji": "🔈" + , "description": "speaker low volume" + , "category": "Symbols" + , "aliases": [ + "speaker" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔇" + , "description": "muted speaker" + , "category": "Symbols" + , "aliases": [ + "mute" + ] + , "tags": [ + "sound" + , "volume" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔉" + , "description": "speaker medium volume" + , "category": "Symbols" + , "aliases": [ + "sound" + ] + , "tags": [ + "volume" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔊" + , "description": "speaker high volume" + , "category": "Symbols" + , "aliases": [ + "loud_sound" + ] + , "tags": [ + "volume" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔔" + , "description": "bell" + , "category": "Symbols" + , "aliases": [ + "bell" + ] + , "tags": [ + "sound" + , "notification" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🔕" + , "description": "bell with slash" + , "category": "Symbols" + , "aliases": [ + "no_bell" + ] + , "tags": [ + "volume" + , "off" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📣" + , "description": "megaphone" + , "category": "Symbols" + , "aliases": [ + "mega" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "📢" + , "description": "loudspeaker" + , "category": "Symbols" + , "aliases": [ + "loudspeaker" + ] + , "tags": [ + "announcement" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "👁‍🗨" + , "description": "eye in speech bubble" + , "category": "Symbols" + , "aliases": [ + "eye_speech_bubble" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.1" + } +, { + "emoji": "💬" + , "description": "speech balloon" + , "category": "Symbols" + , "aliases": [ + "speech_balloon" + ] + , "tags": [ + "comment" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "💭" + , "description": "thought balloon" + , "category": "Symbols" + , "aliases": [ + "thought_balloon" + ] + , "tags": [ + "thinking" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🗯" + , "description": "right anger bubble" + , "category": "Symbols" + , "aliases": [ + "right_anger_bubble" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "♠️" + , "description": "spade suit" + , "category": "Symbols" + , "aliases": [ + "spades" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♣️" + , "description": "club suit" + , "category": "Symbols" + , "aliases": [ + "clubs" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♥️" + , "description": "heart suit" + , "category": "Symbols" + , "aliases": [ + "hearts" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "♦️" + , "description": "diamond suit" + , "category": "Symbols" + , "aliases": [ + "diamonds" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🃏" + , "description": "joker" + , "category": "Symbols" + , "aliases": [ + "black_joker" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎴" + , "description": "flower playing cards" + , "category": "Symbols" + , "aliases": [ + "flower_playing_cards" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🀄️" + , "description": "mahjong red dragon" + , "category": "Symbols" + , "aliases": [ + "mahjong" + ] + , "tags": [ + ] + , "unicode_version": "" + , "ios_version": "6.0" + } +, { + "emoji": "🕐" + , "description": "one o’clock" + , "category": "Symbols" + , "aliases": [ + "clock1" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕑" + , "description": "two o’clock" + , "category": "Symbols" + , "aliases": [ + "clock2" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕒" + , "description": "three o’clock" + , "category": "Symbols" + , "aliases": [ + "clock3" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕓" + , "description": "four o’clock" + , "category": "Symbols" + , "aliases": [ + "clock4" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕔" + , "description": "five o’clock" + , "category": "Symbols" + , "aliases": [ + "clock5" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕕" + , "description": "six o’clock" + , "category": "Symbols" + , "aliases": [ + "clock6" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕖" + , "description": "seven o’clock" + , "category": "Symbols" + , "aliases": [ + "clock7" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕗" + , "description": "eight o’clock" + , "category": "Symbols" + , "aliases": [ + "clock8" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕘" + , "description": "nine o’clock" + , "category": "Symbols" + , "aliases": [ + "clock9" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕙" + , "description": "ten o’clock" + , "category": "Symbols" + , "aliases": [ + "clock10" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕚" + , "description": "eleven o’clock" + , "category": "Symbols" + , "aliases": [ + "clock11" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕛" + , "description": "twelve o’clock" + , "category": "Symbols" + , "aliases": [ + "clock12" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕜" + , "description": "one-thirty" + , "category": "Symbols" + , "aliases": [ + "clock130" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕝" + , "description": "two-thirty" + , "category": "Symbols" + , "aliases": [ + "clock230" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕞" + , "description": "three-thirty" + , "category": "Symbols" + , "aliases": [ + "clock330" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕟" + , "description": "four-thirty" + , "category": "Symbols" + , "aliases": [ + "clock430" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕠" + , "description": "five-thirty" + , "category": "Symbols" + , "aliases": [ + "clock530" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕡" + , "description": "six-thirty" + , "category": "Symbols" + , "aliases": [ + "clock630" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕢" + , "description": "seven-thirty" + , "category": "Symbols" + , "aliases": [ + "clock730" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕣" + , "description": "eight-thirty" + , "category": "Symbols" + , "aliases": [ + "clock830" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕤" + , "description": "nine-thirty" + , "category": "Symbols" + , "aliases": [ + "clock930" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕥" + , "description": "ten-thirty" + , "category": "Symbols" + , "aliases": [ + "clock1030" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕦" + , "description": "eleven-thirty" + , "category": "Symbols" + , "aliases": [ + "clock1130" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🕧" + , "description": "twelve-thirty" + , "category": "Symbols" + , "aliases": [ + "clock1230" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏳️" + , "description": "white flag" + , "category": "Flags" + , "aliases": [ + "white_flag" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏴" + , "description": "black flag" + , "category": "Flags" + , "aliases": [ + "black_flag" + ] + , "tags": [ + ] + , "unicode_version": "7.0" + , "ios_version": "9.1" + } +, { + "emoji": "🏁" + , "description": "chequered flag" + , "category": "Flags" + , "aliases": [ + "checkered_flag" + ] + , "tags": [ + "milestone" + , "finish" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🚩" + , "description": "triangular flag" + , "category": "Flags" + , "aliases": [ + "triangular_flag_on_post" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🏳️‍🌈" + , "description": "rainbow flag" + , "category": "Flags" + , "aliases": [ + "rainbow_flag" + ] + , "tags": [ + "pride" + ] + , "unicode_version": "6.0" + , "ios_version": "10.0" + } +, { + "emoji": "🇦🇫" + , "description": "Afghanistan" + , "category": "Flags" + , "aliases": [ + "afghanistan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇽" + , "description": "Åland Islands" + , "category": "Flags" + , "aliases": [ + "aland_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇦🇱" + , "description": "Albania" + , "category": "Flags" + , "aliases": [ + "albania" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇩🇿" + , "description": "Algeria" + , "category": "Flags" + , "aliases": [ + "algeria" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇸" + , "description": "American Samoa" + , "category": "Flags" + , "aliases": [ + "american_samoa" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇩" + , "description": "Andorra" + , "category": "Flags" + , "aliases": [ + "andorra" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇴" + , "description": "Angola" + , "category": "Flags" + , "aliases": [ + "angola" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇮" + , "description": "Anguilla" + , "category": "Flags" + , "aliases": [ + "anguilla" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇶" + , "description": "Antarctica" + , "category": "Flags" + , "aliases": [ + "antarctica" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇦🇬" + , "description": "Antigua & Barbuda" + , "category": "Flags" + , "aliases": [ + "antigua_barbuda" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇷" + , "description": "Argentina" + , "category": "Flags" + , "aliases": [ + "argentina" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇲" + , "description": "Armenia" + , "category": "Flags" + , "aliases": [ + "armenia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇼" + , "description": "Aruba" + , "category": "Flags" + , "aliases": [ + "aruba" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇺" + , "description": "Australia" + , "category": "Flags" + , "aliases": [ + "australia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇹" + , "description": "Austria" + , "category": "Flags" + , "aliases": [ + "austria" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇿" + , "description": "Azerbaijan" + , "category": "Flags" + , "aliases": [ + "azerbaijan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇸" + , "description": "Bahamas" + , "category": "Flags" + , "aliases": [ + "bahamas" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇭" + , "description": "Bahrain" + , "category": "Flags" + , "aliases": [ + "bahrain" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇩" + , "description": "Bangladesh" + , "category": "Flags" + , "aliases": [ + "bangladesh" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇧" + , "description": "Barbados" + , "category": "Flags" + , "aliases": [ + "barbados" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇾" + , "description": "Belarus" + , "category": "Flags" + , "aliases": [ + "belarus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇪" + , "description": "Belgium" + , "category": "Flags" + , "aliases": [ + "belgium" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇿" + , "description": "Belize" + , "category": "Flags" + , "aliases": [ + "belize" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇯" + , "description": "Benin" + , "category": "Flags" + , "aliases": [ + "benin" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇲" + , "description": "Bermuda" + , "category": "Flags" + , "aliases": [ + "bermuda" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇹" + , "description": "Bhutan" + , "category": "Flags" + , "aliases": [ + "bhutan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇴" + , "description": "Bolivia" + , "category": "Flags" + , "aliases": [ + "bolivia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇶" + , "description": "Caribbean Netherlands" + , "category": "Flags" + , "aliases": [ + "caribbean_netherlands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇧🇦" + , "description": "Bosnia & Herzegovina" + , "category": "Flags" + , "aliases": [ + "bosnia_herzegovina" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇼" + , "description": "Botswana" + , "category": "Flags" + , "aliases": [ + "botswana" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇷" + , "description": "Brazil" + , "category": "Flags" + , "aliases": [ + "brazil" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇴" + , "description": "British Indian Ocean Territory" + , "category": "Flags" + , "aliases": [ + "british_indian_ocean_territory" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇻🇬" + , "description": "British Virgin Islands" + , "category": "Flags" + , "aliases": [ + "british_virgin_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇳" + , "description": "Brunei" + , "category": "Flags" + , "aliases": [ + "brunei" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇬" + , "description": "Bulgaria" + , "category": "Flags" + , "aliases": [ + "bulgaria" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇫" + , "description": "Burkina Faso" + , "category": "Flags" + , "aliases": [ + "burkina_faso" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇮" + , "description": "Burundi" + , "category": "Flags" + , "aliases": [ + "burundi" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇻" + , "description": "Cape Verde" + , "category": "Flags" + , "aliases": [ + "cape_verde" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇰🇭" + , "description": "Cambodia" + , "category": "Flags" + , "aliases": [ + "cambodia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇲" + , "description": "Cameroon" + , "category": "Flags" + , "aliases": [ + "cameroon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇦" + , "description": "Canada" + , "category": "Flags" + , "aliases": [ + "canada" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇨" + , "description": "Canary Islands" + , "category": "Flags" + , "aliases": [ + "canary_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇰🇾" + , "description": "Cayman Islands" + , "category": "Flags" + , "aliases": [ + "cayman_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇫" + , "description": "Central African Republic" + , "category": "Flags" + , "aliases": [ + "central_african_republic" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇩" + , "description": "Chad" + , "category": "Flags" + , "aliases": [ + "chad" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇨🇱" + , "description": "Chile" + , "category": "Flags" + , "aliases": [ + "chile" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇳" + , "description": "China" + , "category": "Flags" + , "aliases": [ + "cn" + ] + , "tags": [ + "china" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇨🇽" + , "description": "Christmas Island" + , "category": "Flags" + , "aliases": [ + "christmas_island" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇨🇨" + , "description": "Cocos (Keeling) Islands" + , "category": "Flags" + , "aliases": [ + "cocos_islands" + ] + , "tags": [ + "keeling" + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇨🇴" + , "description": "Colombia" + , "category": "Flags" + , "aliases": [ + "colombia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇰🇲" + , "description": "Comoros" + , "category": "Flags" + , "aliases": [ + "comoros" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇬" + , "description": "Congo - Brazzaville" + , "category": "Flags" + , "aliases": [ + "congo_brazzaville" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇩" + , "description": "Congo - Kinshasa" + , "category": "Flags" + , "aliases": [ + "congo_kinshasa" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇰" + , "description": "Cook Islands" + , "category": "Flags" + , "aliases": [ + "cook_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇷" + , "description": "Costa Rica" + , "category": "Flags" + , "aliases": [ + "costa_rica" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇮" + , "description": "Côte d’Ivoire" + , "category": "Flags" + , "aliases": [ + "cote_divoire" + ] + , "tags": [ + "ivory" + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇭🇷" + , "description": "Croatia" + , "category": "Flags" + , "aliases": [ + "croatia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇺" + , "description": "Cuba" + , "category": "Flags" + , "aliases": [ + "cuba" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇼" + , "description": "Curaçao" + , "category": "Flags" + , "aliases": [ + "curacao" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇾" + , "description": "Cyprus" + , "category": "Flags" + , "aliases": [ + "cyprus" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇿" + , "description": "Czech Republic" + , "category": "Flags" + , "aliases": [ + "czech_republic" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇩🇰" + , "description": "Denmark" + , "category": "Flags" + , "aliases": [ + "denmark" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇩🇯" + , "description": "Djibouti" + , "category": "Flags" + , "aliases": [ + "djibouti" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇩🇲" + , "description": "Dominica" + , "category": "Flags" + , "aliases": [ + "dominica" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇩🇴" + , "description": "Dominican Republic" + , "category": "Flags" + , "aliases": [ + "dominican_republic" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇪🇨" + , "description": "Ecuador" + , "category": "Flags" + , "aliases": [ + "ecuador" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇪🇬" + , "description": "Egypt" + , "category": "Flags" + , "aliases": [ + "egypt" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇻" + , "description": "El Salvador" + , "category": "Flags" + , "aliases": [ + "el_salvador" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇶" + , "description": "Equatorial Guinea" + , "category": "Flags" + , "aliases": [ + "equatorial_guinea" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇪🇷" + , "description": "Eritrea" + , "category": "Flags" + , "aliases": [ + "eritrea" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇪🇪" + , "description": "Estonia" + , "category": "Flags" + , "aliases": [ + "estonia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇪🇹" + , "description": "Ethiopia" + , "category": "Flags" + , "aliases": [ + "ethiopia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇪🇺" + , "description": "European Union" + , "category": "Flags" + , "aliases": [ + "eu" + , "european_union" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇫🇰" + , "description": "Falkland Islands" + , "category": "Flags" + , "aliases": [ + "falkland_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇫🇴" + , "description": "Faroe Islands" + , "category": "Flags" + , "aliases": [ + "faroe_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇫🇯" + , "description": "Fiji" + , "category": "Flags" + , "aliases": [ + "fiji" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇫🇮" + , "description": "Finland" + , "category": "Flags" + , "aliases": [ + "finland" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇫🇷" + , "description": "France" + , "category": "Flags" + , "aliases": [ + "fr" + ] + , "tags": [ + "france" + , "french" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇬🇫" + , "description": "French Guiana" + , "category": "Flags" + , "aliases": [ + "french_guiana" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇫" + , "description": "French Polynesia" + , "category": "Flags" + , "aliases": [ + "french_polynesia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇹🇫" + , "description": "French Southern Territories" + , "category": "Flags" + , "aliases": [ + "french_southern_territories" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇦" + , "description": "Gabon" + , "category": "Flags" + , "aliases": [ + "gabon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇲" + , "description": "Gambia" + , "category": "Flags" + , "aliases": [ + "gambia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇪" + , "description": "Georgia" + , "category": "Flags" + , "aliases": [ + "georgia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇩🇪" + , "description": "Germany" + , "category": "Flags" + , "aliases": [ + "de" + ] + , "tags": [ + "flag" + , "germany" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇬🇭" + , "description": "Ghana" + , "category": "Flags" + , "aliases": [ + "ghana" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇮" + , "description": "Gibraltar" + , "category": "Flags" + , "aliases": [ + "gibraltar" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇷" + , "description": "Greece" + , "category": "Flags" + , "aliases": [ + "greece" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇱" + , "description": "Greenland" + , "category": "Flags" + , "aliases": [ + "greenland" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇬🇩" + , "description": "Grenada" + , "category": "Flags" + , "aliases": [ + "grenada" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇵" + , "description": "Guadeloupe" + , "category": "Flags" + , "aliases": [ + "guadeloupe" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇬🇺" + , "description": "Guam" + , "category": "Flags" + , "aliases": [ + "guam" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇹" + , "description": "Guatemala" + , "category": "Flags" + , "aliases": [ + "guatemala" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇬" + , "description": "Guernsey" + , "category": "Flags" + , "aliases": [ + "guernsey" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇬🇳" + , "description": "Guinea" + , "category": "Flags" + , "aliases": [ + "guinea" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇼" + , "description": "Guinea-Bissau" + , "category": "Flags" + , "aliases": [ + "guinea_bissau" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇾" + , "description": "Guyana" + , "category": "Flags" + , "aliases": [ + "guyana" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇭🇹" + , "description": "Haiti" + , "category": "Flags" + , "aliases": [ + "haiti" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇭🇳" + , "description": "Honduras" + , "category": "Flags" + , "aliases": [ + "honduras" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇭🇰" + , "description": "Hong Kong SAR China" + , "category": "Flags" + , "aliases": [ + "hong_kong" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇭🇺" + , "description": "Hungary" + , "category": "Flags" + , "aliases": [ + "hungary" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇸" + , "description": "Iceland" + , "category": "Flags" + , "aliases": [ + "iceland" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇳" + , "description": "India" + , "category": "Flags" + , "aliases": [ + "india" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇩" + , "description": "Indonesia" + , "category": "Flags" + , "aliases": [ + "indonesia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇷" + , "description": "Iran" + , "category": "Flags" + , "aliases": [ + "iran" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇶" + , "description": "Iraq" + , "category": "Flags" + , "aliases": [ + "iraq" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇪" + , "description": "Ireland" + , "category": "Flags" + , "aliases": [ + "ireland" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇲" + , "description": "Isle of Man" + , "category": "Flags" + , "aliases": [ + "isle_of_man" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇮🇱" + , "description": "Israel" + , "category": "Flags" + , "aliases": [ + "israel" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇮🇹" + , "description": "Italy" + , "category": "Flags" + , "aliases": [ + "it" + ] + , "tags": [ + "italy" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇯🇲" + , "description": "Jamaica" + , "category": "Flags" + , "aliases": [ + "jamaica" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇯🇵" + , "description": "Japan" + , "category": "Flags" + , "aliases": [ + "jp" + ] + , "tags": [ + "japan" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🎌" + , "description": "crossed flags" + , "category": "Flags" + , "aliases": [ + "crossed_flags" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇯🇪" + , "description": "Jersey" + , "category": "Flags" + , "aliases": [ + "jersey" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇯🇴" + , "description": "Jordan" + , "category": "Flags" + , "aliases": [ + "jordan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇰🇿" + , "description": "Kazakhstan" + , "category": "Flags" + , "aliases": [ + "kazakhstan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇰🇪" + , "description": "Kenya" + , "category": "Flags" + , "aliases": [ + "kenya" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇰🇮" + , "description": "Kiribati" + , "category": "Flags" + , "aliases": [ + "kiribati" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇽🇰" + , "description": "Kosovo" + , "category": "Flags" + , "aliases": [ + "kosovo" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇰🇼" + , "description": "Kuwait" + , "category": "Flags" + , "aliases": [ + "kuwait" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇰🇬" + , "description": "Kyrgyzstan" + , "category": "Flags" + , "aliases": [ + "kyrgyzstan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇦" + , "description": "Laos" + , "category": "Flags" + , "aliases": [ + "laos" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇻" + , "description": "Latvia" + , "category": "Flags" + , "aliases": [ + "latvia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇧" + , "description": "Lebanon" + , "category": "Flags" + , "aliases": [ + "lebanon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇸" + , "description": "Lesotho" + , "category": "Flags" + , "aliases": [ + "lesotho" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇷" + , "description": "Liberia" + , "category": "Flags" + , "aliases": [ + "liberia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇾" + , "description": "Libya" + , "category": "Flags" + , "aliases": [ + "libya" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇮" + , "description": "Liechtenstein" + , "category": "Flags" + , "aliases": [ + "liechtenstein" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇹" + , "description": "Lithuania" + , "category": "Flags" + , "aliases": [ + "lithuania" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇺" + , "description": "Luxembourg" + , "category": "Flags" + , "aliases": [ + "luxembourg" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇴" + , "description": "Macau SAR China" + , "category": "Flags" + , "aliases": [ + "macau" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇰" + , "description": "Macedonia" + , "category": "Flags" + , "aliases": [ + "macedonia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇬" + , "description": "Madagascar" + , "category": "Flags" + , "aliases": [ + "madagascar" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇼" + , "description": "Malawi" + , "category": "Flags" + , "aliases": [ + "malawi" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇾" + , "description": "Malaysia" + , "category": "Flags" + , "aliases": [ + "malaysia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇻" + , "description": "Maldives" + , "category": "Flags" + , "aliases": [ + "maldives" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇱" + , "description": "Mali" + , "category": "Flags" + , "aliases": [ + "mali" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇹" + , "description": "Malta" + , "category": "Flags" + , "aliases": [ + "malta" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇭" + , "description": "Marshall Islands" + , "category": "Flags" + , "aliases": [ + "marshall_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇲🇶" + , "description": "Martinique" + , "category": "Flags" + , "aliases": [ + "martinique" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇲🇷" + , "description": "Mauritania" + , "category": "Flags" + , "aliases": [ + "mauritania" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇺" + , "description": "Mauritius" + , "category": "Flags" + , "aliases": [ + "mauritius" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇾🇹" + , "description": "Mayotte" + , "category": "Flags" + , "aliases": [ + "mayotte" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇲🇽" + , "description": "Mexico" + , "category": "Flags" + , "aliases": [ + "mexico" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇫🇲" + , "description": "Micronesia" + , "category": "Flags" + , "aliases": [ + "micronesia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇲🇩" + , "description": "Moldova" + , "category": "Flags" + , "aliases": [ + "moldova" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇨" + , "description": "Monaco" + , "category": "Flags" + , "aliases": [ + "monaco" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇲🇳" + , "description": "Mongolia" + , "category": "Flags" + , "aliases": [ + "mongolia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇪" + , "description": "Montenegro" + , "category": "Flags" + , "aliases": [ + "montenegro" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇸" + , "description": "Montserrat" + , "category": "Flags" + , "aliases": [ + "montserrat" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇦" + , "description": "Morocco" + , "category": "Flags" + , "aliases": [ + "morocco" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇿" + , "description": "Mozambique" + , "category": "Flags" + , "aliases": [ + "mozambique" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇲🇲" + , "description": "Myanmar (Burma)" + , "category": "Flags" + , "aliases": [ + "myanmar" + ] + , "tags": [ + "burma" + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇦" + , "description": "Namibia" + , "category": "Flags" + , "aliases": [ + "namibia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇷" + , "description": "Nauru" + , "category": "Flags" + , "aliases": [ + "nauru" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇳🇵" + , "description": "Nepal" + , "category": "Flags" + , "aliases": [ + "nepal" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇱" + , "description": "Netherlands" + , "category": "Flags" + , "aliases": [ + "netherlands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇨" + , "description": "New Caledonia" + , "category": "Flags" + , "aliases": [ + "new_caledonia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇿" + , "description": "New Zealand" + , "category": "Flags" + , "aliases": [ + "new_zealand" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇮" + , "description": "Nicaragua" + , "category": "Flags" + , "aliases": [ + "nicaragua" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇪" + , "description": "Niger" + , "category": "Flags" + , "aliases": [ + "niger" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇬" + , "description": "Nigeria" + , "category": "Flags" + , "aliases": [ + "nigeria" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇺" + , "description": "Niue" + , "category": "Flags" + , "aliases": [ + "niue" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇫" + , "description": "Norfolk Island" + , "category": "Flags" + , "aliases": [ + "norfolk_island" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇲🇵" + , "description": "Northern Mariana Islands" + , "category": "Flags" + , "aliases": [ + "northern_mariana_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇰🇵" + , "description": "North Korea" + , "category": "Flags" + , "aliases": [ + "north_korea" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇳🇴" + , "description": "Norway" + , "category": "Flags" + , "aliases": [ + "norway" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇴🇲" + , "description": "Oman" + , "category": "Flags" + , "aliases": [ + "oman" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇰" + , "description": "Pakistan" + , "category": "Flags" + , "aliases": [ + "pakistan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇼" + , "description": "Palau" + , "category": "Flags" + , "aliases": [ + "palau" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇸" + , "description": "Palestinian Territories" + , "category": "Flags" + , "aliases": [ + "palestinian_territories" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇦" + , "description": "Panama" + , "category": "Flags" + , "aliases": [ + "panama" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇬" + , "description": "Papua New Guinea" + , "category": "Flags" + , "aliases": [ + "papua_new_guinea" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇾" + , "description": "Paraguay" + , "category": "Flags" + , "aliases": [ + "paraguay" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇪" + , "description": "Peru" + , "category": "Flags" + , "aliases": [ + "peru" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇭" + , "description": "Philippines" + , "category": "Flags" + , "aliases": [ + "philippines" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇳" + , "description": "Pitcairn Islands" + , "category": "Flags" + , "aliases": [ + "pitcairn_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇵🇱" + , "description": "Poland" + , "category": "Flags" + , "aliases": [ + "poland" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇹" + , "description": "Portugal" + , "category": "Flags" + , "aliases": [ + "portugal" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇷" + , "description": "Puerto Rico" + , "category": "Flags" + , "aliases": [ + "puerto_rico" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇶🇦" + , "description": "Qatar" + , "category": "Flags" + , "aliases": [ + "qatar" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇷🇪" + , "description": "Réunion" + , "category": "Flags" + , "aliases": [ + "reunion" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇷🇴" + , "description": "Romania" + , "category": "Flags" + , "aliases": [ + "romania" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇷🇺" + , "description": "Russia" + , "category": "Flags" + , "aliases": [ + "ru" + ] + , "tags": [ + "russia" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇷🇼" + , "description": "Rwanda" + , "category": "Flags" + , "aliases": [ + "rwanda" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇧🇱" + , "description": "St. Barthélemy" + , "category": "Flags" + , "aliases": [ + "st_barthelemy" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇸🇭" + , "description": "St. Helena" + , "category": "Flags" + , "aliases": [ + "st_helena" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇰🇳" + , "description": "St. Kitts & Nevis" + , "category": "Flags" + , "aliases": [ + "st_kitts_nevis" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇱🇨" + , "description": "St. Lucia" + , "category": "Flags" + , "aliases": [ + "st_lucia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇵🇲" + , "description": "St. Pierre & Miquelon" + , "category": "Flags" + , "aliases": [ + "st_pierre_miquelon" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇻🇨" + , "description": "St. Vincent & Grenadines" + , "category": "Flags" + , "aliases": [ + "st_vincent_grenadines" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇼🇸" + , "description": "Samoa" + , "category": "Flags" + , "aliases": [ + "samoa" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇲" + , "description": "San Marino" + , "category": "Flags" + , "aliases": [ + "san_marino" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇹" + , "description": "São Tomé & Príncipe" + , "category": "Flags" + , "aliases": [ + "sao_tome_principe" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇦" + , "description": "Saudi Arabia" + , "category": "Flags" + , "aliases": [ + "saudi_arabia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇳" + , "description": "Senegal" + , "category": "Flags" + , "aliases": [ + "senegal" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇷🇸" + , "description": "Serbia" + , "category": "Flags" + , "aliases": [ + "serbia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇨" + , "description": "Seychelles" + , "category": "Flags" + , "aliases": [ + "seychelles" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇱" + , "description": "Sierra Leone" + , "category": "Flags" + , "aliases": [ + "sierra_leone" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇬" + , "description": "Singapore" + , "category": "Flags" + , "aliases": [ + "singapore" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇽" + , "description": "Sint Maarten" + , "category": "Flags" + , "aliases": [ + "sint_maarten" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇰" + , "description": "Slovakia" + , "category": "Flags" + , "aliases": [ + "slovakia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇮" + , "description": "Slovenia" + , "category": "Flags" + , "aliases": [ + "slovenia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇧" + , "description": "Solomon Islands" + , "category": "Flags" + , "aliases": [ + "solomon_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇴" + , "description": "Somalia" + , "category": "Flags" + , "aliases": [ + "somalia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇿🇦" + , "description": "South Africa" + , "category": "Flags" + , "aliases": [ + "south_africa" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇸" + , "description": "South Georgia & South Sandwich Islands" + , "category": "Flags" + , "aliases": [ + "south_georgia_south_sandwich_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇰🇷" + , "description": "South Korea" + , "category": "Flags" + , "aliases": [ + "kr" + ] + , "tags": [ + "korea" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇸🇸" + , "description": "South Sudan" + , "category": "Flags" + , "aliases": [ + "south_sudan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇪🇸" + , "description": "Spain" + , "category": "Flags" + , "aliases": [ + "es" + ] + , "tags": [ + "spain" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇱🇰" + , "description": "Sri Lanka" + , "category": "Flags" + , "aliases": [ + "sri_lanka" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇩" + , "description": "Sudan" + , "category": "Flags" + , "aliases": [ + "sudan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇷" + , "description": "Suriname" + , "category": "Flags" + , "aliases": [ + "suriname" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇿" + , "description": "Swaziland" + , "category": "Flags" + , "aliases": [ + "swaziland" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇪" + , "description": "Sweden" + , "category": "Flags" + , "aliases": [ + "sweden" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇨🇭" + , "description": "Switzerland" + , "category": "Flags" + , "aliases": [ + "switzerland" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇸🇾" + , "description": "Syria" + , "category": "Flags" + , "aliases": [ + "syria" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇼" + , "description": "Taiwan" + , "category": "Flags" + , "aliases": [ + "taiwan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇹🇯" + , "description": "Tajikistan" + , "category": "Flags" + , "aliases": [ + "tajikistan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇿" + , "description": "Tanzania" + , "category": "Flags" + , "aliases": [ + "tanzania" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇭" + , "description": "Thailand" + , "category": "Flags" + , "aliases": [ + "thailand" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇱" + , "description": "Timor-Leste" + , "category": "Flags" + , "aliases": [ + "timor_leste" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇬" + , "description": "Togo" + , "category": "Flags" + , "aliases": [ + "togo" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇰" + , "description": "Tokelau" + , "category": "Flags" + , "aliases": [ + "tokelau" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇹🇴" + , "description": "Tonga" + , "category": "Flags" + , "aliases": [ + "tonga" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇹" + , "description": "Trinidad & Tobago" + , "category": "Flags" + , "aliases": [ + "trinidad_tobago" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇳" + , "description": "Tunisia" + , "category": "Flags" + , "aliases": [ + "tunisia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇷" + , "description": "Turkey" + , "category": "Flags" + , "aliases": [ + "tr" + ] + , "tags": [ + "turkey" + ] + , "unicode_version": "8.0" + , "ios_version": "9.1" + } +, { + "emoji": "🇹🇲" + , "description": "Turkmenistan" + , "category": "Flags" + , "aliases": [ + "turkmenistan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇨" + , "description": "Turks & Caicos Islands" + , "category": "Flags" + , "aliases": [ + "turks_caicos_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇹🇻" + , "description": "Tuvalu" + , "category": "Flags" + , "aliases": [ + "tuvalu" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇺🇬" + , "description": "Uganda" + , "category": "Flags" + , "aliases": [ + "uganda" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇺🇦" + , "description": "Ukraine" + , "category": "Flags" + , "aliases": [ + "ukraine" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇦🇪" + , "description": "United Arab Emirates" + , "category": "Flags" + , "aliases": [ + "united_arab_emirates" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇬🇧" + , "description": "United Kingdom" + , "category": "Flags" + , "aliases": [ + "gb" + , "uk" + ] + , "tags": [ + "flag" + , "british" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇺🇸" + , "description": "United States" + , "category": "Flags" + , "aliases": [ + "us" + ] + , "tags": [ + "flag" + , "united" + , "america" + ] + , "unicode_version": "6.0" + , "ios_version": "6.0" + } +, { + "emoji": "🇻🇮" + , "description": "U.S. Virgin Islands" + , "category": "Flags" + , "aliases": [ + "us_virgin_islands" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇺🇾" + , "description": "Uruguay" + , "category": "Flags" + , "aliases": [ + "uruguay" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇺🇿" + , "description": "Uzbekistan" + , "category": "Flags" + , "aliases": [ + "uzbekistan" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇻🇺" + , "description": "Vanuatu" + , "category": "Flags" + , "aliases": [ + "vanuatu" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇻🇦" + , "description": "Vatican City" + , "category": "Flags" + , "aliases": [ + "vatican_city" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇻🇪" + , "description": "Venezuela" + , "category": "Flags" + , "aliases": [ + "venezuela" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇻🇳" + , "description": "Vietnam" + , "category": "Flags" + , "aliases": [ + "vietnam" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇼🇫" + , "description": "Wallis & Futuna" + , "category": "Flags" + , "aliases": [ + "wallis_futuna" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇪🇭" + , "description": "Western Sahara" + , "category": "Flags" + , "aliases": [ + "western_sahara" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "9.0" + } +, { + "emoji": "🇾🇪" + , "description": "Yemen" + , "category": "Flags" + , "aliases": [ + "yemen" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇿🇲" + , "description": "Zambia" + , "category": "Flags" + , "aliases": [ + "zambia" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "emoji": "🇿🇼" + , "description": "Zimbabwe" + , "category": "Flags" + , "aliases": [ + "zimbabwe" + ] + , "tags": [ + ] + , "unicode_version": "6.0" + , "ios_version": "8.3" + } +, { + "aliases": [ + "basecamp" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "basecampy" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "bowtie" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "feelsgood" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "finnadie" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "goberserk" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "godmode" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "hurtrealbad" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "neckbeard" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "octocat" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "rage1" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "rage2" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "rage3" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "rage4" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "shipit" + , "squirrel" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "suspect" + ] + , "tags": [ + ] + } +, { + "aliases": [ + "trollface" + ] + , "tags": [ + ] + } +] diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/basecamp.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/basecamp.png new file mode 100644 index 000000000000..d0267fb85739 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/basecamp.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/basecampy.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/basecampy.png new file mode 100644 index 000000000000..806d013fc8b1 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/basecampy.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/bowtie.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/bowtie.png new file mode 100644 index 000000000000..5616d691ad7d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/bowtie.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/feelsgood.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/feelsgood.png new file mode 100644 index 000000000000..891ec43e08d5 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/feelsgood.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/finnadie.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/finnadie.png new file mode 100644 index 000000000000..90266e24a2f5 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/finnadie.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/goberserk.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/goberserk.png new file mode 100644 index 000000000000..e617a9df7f1e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/goberserk.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/godmode.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/godmode.png new file mode 100644 index 000000000000..551111a7a4c4 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/godmode.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/hurtrealbad.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/hurtrealbad.png new file mode 100644 index 000000000000..60558415c6d2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/hurtrealbad.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/neckbeard.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/neckbeard.png new file mode 100644 index 000000000000..69ccffc76161 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/neckbeard.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/octocat.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/octocat.png new file mode 100644 index 000000000000..f9050b935792 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/octocat.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage1.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage1.png new file mode 100644 index 000000000000..99a28f26cceb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage1.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage2.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage2.png new file mode 100644 index 000000000000..e91813c936c7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage2.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage3.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage3.png new file mode 100644 index 000000000000..36f0733366a6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage3.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage4.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage4.png new file mode 100644 index 000000000000..d1b87ba9f0dc Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/rage4.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/shipit.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/shipit.png new file mode 100644 index 000000000000..2d018e65b429 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/shipit.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/suspect.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/suspect.png new file mode 100644 index 000000000000..c4fd15c224cb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/suspect.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/trollface.png b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/trollface.png new file mode 100644 index 000000000000..ee463dc6b8b7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/images/trollface.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji.rb b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji.rb new file mode 100644 index 000000000000..924e0620196e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji.rb @@ -0,0 +1,131 @@ +# encoding: utf-8 +require 'emoji/character' +require 'json' + +module Emoji + extend self + + def data_file + File.expand_path('../../db/emoji.json', __FILE__) + end + + def apple_palette_file + File.expand_path('../../db/Category-Emoji.json', __FILE__) + end + + def images_path + File.expand_path("../../images", __FILE__) + end + + def all + return @all if defined? @all + @all = [] + parse_data_file + @all + end + + def apple_palette + return @apple_palette if defined? @apple_palette + data = File.open(apple_palette_file, 'r:UTF-8') { |f| JSON.parse(f.read) } + @apple_palette = data.fetch('EmojiDataArray').each_with_object({}) do |group, all| + title = group.fetch('CVDataTitle').split('-', 2)[1] + all[title] = group.fetch('CVCategoryData').fetch('Data').split(',').map do |raw| + TEXT_GLYPHS.include?(raw) ? raw + VARIATION_SELECTOR_16 : raw + end + end + end + + # Public: Initialize an Emoji::Character instance and yield it to the block. + # The character is added to the `Emoji.all` set. + def create(name) + emoji = Emoji::Character.new(name) + self.all << edit_emoji(emoji) { yield emoji if block_given? } + emoji + end + + # Public: Yield an emoji to the block and update the indices in case its + # aliases or unicode_aliases lists changed. + def edit_emoji(emoji) + @names_index ||= Hash.new + @unicodes_index ||= Hash.new + + yield emoji + + emoji.aliases.each do |name| + @names_index[name] = emoji + end + emoji.unicode_aliases.each do |unicode| + @unicodes_index[unicode] = emoji + end + + emoji + end + + # Public: Find an emoji by its aliased name. Return nil if missing. + def find_by_alias(name) + names_index[name] + end + + # Public: Find an emoji by its unicode character. Return nil if missing. + def find_by_unicode(unicode) + unicodes_index[unicode] + end + + private + VARIATION_SELECTOR_16 = "\u{fe0f}".freeze + ZERO_WIDTH_JOINER = "\u{200d}".freeze + FEMALE_SYMBOL = "\u{2640}".freeze + MALE_SYMBOL = "\u{2642}".freeze + + # Chars from Apple's palette which must have VARIATION_SELECTOR_16 to render: + TEXT_GLYPHS = ["🈷", "🈂", "🅰", "🅱", "🅾", "©", "®", "™", "〰"].freeze + + def parse_data_file + data = File.open(data_file, 'r:UTF-8') { |file| JSON.parse(file.read) } + data.each do |raw_emoji| + self.create(nil) do |emoji| + raw_emoji.fetch('aliases').each { |name| emoji.add_alias(name) } + if raw = raw_emoji['emoji'] + unicodes = [raw, raw.sub(VARIATION_SELECTOR_16, '') + VARIATION_SELECTOR_16].uniq + unicodes.each { |uni| emoji.add_unicode_alias(uni) } + end + raw_emoji.fetch('tags').each { |tag| emoji.add_tag(tag) } + + emoji.category = raw_emoji['category'] + emoji.description = raw_emoji['description'] + emoji.unicode_version = raw_emoji['unicode_version'] + emoji.ios_version = raw_emoji['ios_version'] + end + end + + # Add an explicit gendered variant to emoji that historically imply a gender + data.each do |raw_emoji| + raw = raw_emoji['emoji'] + next unless raw + no_gender = raw.sub(/(#{VARIATION_SELECTOR_16})?#{ZERO_WIDTH_JOINER}(#{FEMALE_SYMBOL}|#{MALE_SYMBOL})/, '') + next unless $2 + emoji = find_by_unicode(no_gender) + next unless emoji + edit_emoji(emoji) do + emoji.add_unicode_alias( + $2 == FEMALE_SYMBOL ? + raw.sub(FEMALE_SYMBOL, MALE_SYMBOL) : + raw.sub(MALE_SYMBOL, FEMALE_SYMBOL) + ) + end + end + end + + def names_index + all unless defined? @all + @names_index + end + + def unicodes_index + all unless defined? @all + @unicodes_index + end +end + +# Preload emoji into memory +Emoji.all diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji/character.rb b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji/character.rb new file mode 100644 index 000000000000..1b302a006b0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji/character.rb @@ -0,0 +1,87 @@ +module Emoji + class Character + # Inspect individual Unicode characters in a string by dumping its + # codepoints in hexadecimal format. + def self.hex_inspect(str) + str.codepoints.map { |c| c.to_s(16).rjust(4, '0') }.join('-') + end + + # True if the emoji is not a standard Emoji character. + def custom?() !raw end + + # A list of names uniquely referring to this emoji. + attr_reader :aliases + + # The category for this emoji as per Apple's character palette + attr_accessor :category + + # The Unicode description text + attr_accessor :description + + # The Unicode spec version where this emoji first debuted + attr_accessor :unicode_version + + # The iOS version where this emoji first debuted + attr_accessor :ios_version + + def name() aliases.first end + + def add_alias(name) + aliases << name + end + + # A list of Unicode strings that uniquely refer to this emoji. + attr_reader :unicode_aliases + + # Raw Unicode string for an emoji. Nil if emoji is non-standard. + def raw() unicode_aliases.first end + + def add_unicode_alias(str) + unicode_aliases << str + end + + # A list of tags associated with an emoji. Multiple emojis can share the + # same tags. + attr_reader :tags + + def add_tag(tag) + tags << tag + end + + def initialize(name) + @aliases = Array(name) + @unicode_aliases = [] + @tags = [] + end + + def inspect + hex = '(%s)' % hex_inspect unless custom? + %(#<#{self.class.name}:#{name}#{hex}>) + end + + def hex_inspect + self.class.hex_inspect(raw) + end + + attr_writer :image_filename + + def image_filename + if defined? @image_filename + @image_filename + else + default_image_filename + end + end + + private + + def default_image_filename + if custom? + '%s.png' % name + else + hex_name = hex_inspect.gsub(/-(fe0f|200d)\b/, '') + 'unicode/%s.png' % hex_name + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji/cli.rb b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji/cli.rb new file mode 100644 index 000000000000..4efdadf0ceb3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji/cli.rb @@ -0,0 +1,68 @@ +require 'emoji/extractor' +require 'fileutils' +require 'optparse' + +module Emoji + module CLI + extend self + + InvalidUsage = Class.new(RuntimeError) + + def dispatch(argv) + cmd = argv[0] + argv = argv[1..-1] + + case cmd + when "extract" + public_send(cmd, argv) + when "help", "--help", "-h" + help + else + raise InvalidUsage + end + + return 0 + rescue InvalidUsage, OptionParser::InvalidArgument, OptionParser::InvalidOption => err + unless err.message == err.class.to_s + $stderr.puts err.message + $stderr.puts + end + $stderr.puts usage_text + return 1 + end + + def help + puts usage_text + end + + VALID_SIZES = [ 20, 32, 40, 48, 64, 96, 160 ] + + def extract(argv) + size = 64 + + OptionParser.new do |opts| + opts.on("--size=#{size}", Integer) do |val| + if VALID_SIZES.include?(val) + size = val + else + raise InvalidUsage, "size should be one of: #{VALID_SIZES.join(', ')}" + end + end + end.parse!(argv) + + raise InvalidUsage unless argv.size == 1 + path = argv[0] + + Emoji::Extractor.new(size, path).extract! + Dir["#{Emoji.images_path}/*.png"].each do |png| + FileUtils.cp(png, File.join(path, File.basename(png))) + end + end + + def usage_text + <<EOF +Usage: gemoji extract <path> [--size=64] +EOF + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji/extractor.rb b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji/extractor.rb new file mode 100644 index 000000000000..738b90ae3986 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/emoji/extractor.rb @@ -0,0 +1,190 @@ +require 'emoji' +require 'fileutils' + +module Emoji + class Extractor + EMOJI_TTF = "/System/Library/Fonts/Apple Color Emoji.ttc" + + attr_reader :size, :images_path + + def initialize(size, images_path) + @size = size + @images_path = images_path + end + + def each(&block) + return to_enum(__method__) unless block_given? + + File.open(EMOJI_TTF, 'rb') do |file| + font_offsets = parse_ttc(file) + file.pos = font_offsets[0] + + tables = parse_tables(file) + glyph_index = extract_glyph_index(file, tables) + + each_glyph_bitmap(file, tables, glyph_index, &block) + end + end + + def extract! + each do |glyph_name, type, binread| + if emoji = glyph_name_to_emoji(glyph_name) + image_filename = "#{images_path}/#{emoji.image_filename}" + FileUtils.mkdir_p(File.dirname(image_filename)) + File.open(image_filename, 'wb') { |f| f.write binread.call } + end + end + end + + private + + GENDER_MAP = { + "M" => "\u{2642}", + "W" => "\u{2640}", + } + + FAMILY_MAP = { + "B" => "\u{1f466}", + "G" => "\u{1f467}", + "M" => "\u{1f468}", + "W" => "\u{1f469}", + }.freeze + + FAMILY = "1F46A" + COUPLE = "1F491" + KISS = "1F48F" + + def glyph_name_to_emoji(glyph_name) + return if glyph_name =~ /\.[1-5]($|\.)/ + zwj = Emoji::ZERO_WIDTH_JOINER + v16 = Emoji::VARIATION_SELECTOR_16 + + if glyph_name =~ /^u(#{FAMILY}|#{COUPLE}|#{KISS})\.([#{FAMILY_MAP.keys.join('')}]+)$/ + if $1 == FAMILY ? $2 == "MWB" : $2 == "WM" + raw = [$1.hex].pack('U') + else + if $1 == COUPLE + middle = "#{zwj}\u{2764}#{v16}#{zwj}" # heavy black heart + elsif $1 == KISS + middle = "#{zwj}\u{2764}#{v16}#{zwj}\u{1F48B}#{zwj}" # heart + kiss mark + else + middle = zwj + end + raw = $2.split('').map { |c| FAMILY_MAP.fetch(c) }.join(middle) + end + candidates = [raw] + else + raw = glyph_name.gsub(/(^|_)u([0-9A-F]+)/) { ($1.empty?? $1 : zwj) + [$2.hex].pack('U') } + raw.sub!(/\.0\b/, '') + raw.sub!(/\.(#{GENDER_MAP.keys.join('|')})$/) { v16 + zwj + GENDER_MAP.fetch($1) } + candidates = [raw] + candidates << raw.sub(v16, '') if raw.include?(v16) + candidates << raw.gsub(zwj, '') if raw.include?(zwj) + candidates.dup.each { |c| candidates << (c + v16) } + end + + candidates.map { |c| Emoji.find_by_unicode(c) }.compact.first + end + + # https://www.microsoft.com/typography/otspec/otff.htm + def parse_ttc(io) + header_name = io.read(4).unpack('a*')[0] + raise unless "ttcf" == header_name + header_version, num_fonts = io.read(4*2).unpack('l>N') + # parse_version(header_version) #=> 2.0 + io.read(4 * num_fonts).unpack('N*') + end + + def parse_tables(io) + sfnt_version, num_tables = io.read(4 + 2*4).unpack('Nn') + # sfnt_version #=> 0x00010000 + num_tables.times.each_with_object({}) do |_, tables| + tag, checksum, offset, length = io.read(4 + 4*3).unpack('a4N*') + tables[tag] = { + checksum: checksum, + offset: offset, + length: length, + } + end + end + + GlyphIndex = Struct.new(:length, :name_index, :names) do + def name_for(glyph_id) + index = name_index[glyph_id] + names[index - 257] + end + + def each(&block) + length.times(&block) + end + + def each_with_name + each do |glyph_id| + yield glyph_id, name_for(glyph_id) + end + end + end + + def extract_glyph_index(io, tables) + postscript_table = tables.fetch('post') + io.pos = postscript_table[:offset] + end_pos = io.pos + postscript_table[:length] + + parse_version(io.read(32).unpack('l>')[0]) #=> 2.0 + num_glyphs = io.read(2).unpack('n')[0] + glyph_name_index = io.read(2*num_glyphs).unpack('n*') + + glyph_names = [] + while io.pos < end_pos + length = io.read(1).unpack('C')[0] + glyph_names << io.read(length) + end + + GlyphIndex.new(num_glyphs, glyph_name_index, glyph_names) + end + + # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6sbix.html + def each_glyph_bitmap(io, tables, glyph_index) + io.pos = sbix_offset = tables.fetch('sbix')[:offset] + strike = extract_sbix_strike(io, glyph_index.length, size) + + glyph_index.each_with_name do |glyph_id, glyph_name| + glyph_offset = strike[:glyph_data_offset][glyph_id] + next_glyph_offset = strike[:glyph_data_offset][glyph_id + 1] + + if glyph_offset && next_glyph_offset && glyph_offset < next_glyph_offset + io.pos = sbix_offset + strike[:offset] + glyph_offset + x, y, type = io.read(2*2 + 4).unpack('s2A4') + yield glyph_name, type, -> { io.read(next_glyph_offset - glyph_offset - 8) } + end + end + end + + def extract_sbix_strike(io, num_glyphs, image_size) + sbix_offset = io.pos + version, flags, num_strikes = io.read(2*2 + 4).unpack('n2N') + strike_offsets = num_strikes.times.map { io.read(4).unpack('N')[0] } + + strike_offsets.each do |strike_offset| + io.pos = sbix_offset + strike_offset + ppem, resolution = io.read(4*2).unpack('n2') + next unless ppem == size + + data_offsets = io.read(4 * (num_glyphs+1)).unpack('N*') + return { + ppem: ppem, + resolution: resolution, + offset: strike_offset, + glyph_data_offset: data_offsets, + } + end + return nil + end + + def parse_version(num) + major = num >> 16 + minor = num & 0xFFFF + "#{major}.#{minor}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/gemoji.rb b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/gemoji.rb new file mode 100644 index 000000000000..0de52ed4773c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/gemoji-3.0.1/lib/gemoji.rb @@ -0,0 +1 @@ +require 'emoji' diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-214/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/.rubocop.yml new file mode 100644 index 000000000000..fbcea5f9d579 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/.rubocop.yml @@ -0,0 +1,167 @@ +# Ruby linting configuration. +# See https://github.com/styleguide/ruby for the Ruby style guide + +# We only worry about two kinds of issues: 'error' and anything less than that. +# Error is not about severity, but about taste. Simple style choices that +# never have a great excuse to be broken, such as 1.9 JSON-like hash syntax, +# are errors. Choices that tend to have good exceptions in practice, such as +# line length, are warnings. + +# If you'd like to make changes, a full list of available issues is at +# https://github.com/bbatsov/rubocop/blob/master/config/enabled.yml +# +# A list of configurable issues is at: +# https://github.com/bbatsov/rubocop/blob/master/config/default.yml +# +# If you disable a check, document why. + +inherit_gem: + rubocop-github: + - config/default.yml + +require: + - rubocop-performance + +AllCops: + TargetRubyVersion: 2.5 + Exclude: + - 'bin/**/*' + - 'script/**/*' + - 'vendor/**/*' + - 'test-site/**/*' + +Layout/EndAlignment: + Severity: error + +Lint/RescueException: + Exclude: + - lib/pages_jekyll.rb + +Lint/UnreachableCode: + Severity: error + +Lint/AmbiguousRegexpLiteral: + Exclude: + - 'features/step_definitions/pages_steps.rb' + +Style/StringLiterals: + EnforcedStyle: double_quotes + Severity: error + +Style/StringLiteralsInInterpolation: + EnforcedStyle: double_quotes + +Style/HashSyntax: + EnforcedStyle: hash_rockets + Severity: error + +Layout/HashAlignment: + SupportedLastArgumentHashStyles: always_ignore + +Layout/ParameterAlignment: + Enabled: false # This is usually true, but we often want to roll back to + # the start of a line. + +Style/Attr: + Enabled: false # We have no styleguide guidance here, and it seems to be + # in frequent use. + +Style/ClassAndModuleChildren: + Enabled: false # module X<\n>module Y is just as good as module X::Y. + +Style/Documentation: + Exclude: + - !ruby/regexp /spec\/.*.rb$/ + - !ruby/regexp /features\/.*.rb$/ + +Metrics/ClassLength: + Exclude: + - !ruby/regexp /spec\/.*.rb$/ + - !ruby/regexp /features\/.*.rb$/ + - lib/github-pages/configuration.rb + +Metrics/BlockLength: + Exclude: + - github-pages.gemspec + - !ruby/regexp /spec\/.*.rb/ + +Layout/LineLength: + Max: 90 + Severity: warning + Exclude: + - !ruby/regexp /spec\/.*.rb/ + - !ruby/regexp /features\/.*.rb/ + +Style/MultilineTernaryOperator: + Severity: error + +Style/AndOr: + Severity: error + +Layout/IndentationWidth: + Severity: error + +Metrics/MethodLength: + CountComments: false # count full line comments? + Max: 20 + Severity: error + Exclude: + - lib/github-pages.rb # Exclude the dependency hash method + +Style/Alias: + Enabled: false # We have no guidance on alias vs alias_method + +Style/RedundantSelf: + Enabled: false # Sometimes a self.field is a bit more clear + +Style/IfUnlessModifier: + Enabled: false + +Naming/FileName: #Rubocop doesn't like the Git*H*ub namespace + Enabled: false + +Metrics/CyclomaticComplexity: + Max: 8 +Metrics/PerceivedComplexity: + Max: 8 +Metrics/ParameterLists: + Max: 4 +Metrics/AbcSize: + Max: 20 + +Style/SignalException: + EnforcedStyle: only_raise + +Layout/MultilineMethodCallIndentation: + EnforcedStyle: indented + +Layout/MultilineOperationIndentation: + EnforcedStyle: indented + +Layout/FirstArgumentIndentation: + EnforcedStyle: consistent + +Layout/FirstHashElementIndentation: + EnforcedStyle: consistent + +Layout/FirstArrayElementIndentation: + EnforcedStyle: consistent + +Layout/ExtraSpacing: + AllowForAlignment: true + +Style/TrailingCommaInArrayLiteral: + EnforcedStyleForMultiline: consistent_comma + +Style/TrailingCommaInHashLiteral: + EnforcedStyleForMultiline: consistent_comma + +Style/PercentLiteralDelimiters: + PreferredDelimiters: + '%q': '{}' + '%Q': '{}' + '%r': '{}' + '%s': '()' + '%w': '()' + '%W': '()' + '%x': '()' diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-214/bin/github-pages b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/bin/github-pages new file mode 100644 index 000000000000..055dfaf1957d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/bin/github-pages @@ -0,0 +1,59 @@ +#!/usr/bin/env ruby + +require 'mercenary' +require_relative "../lib/github-pages" + +Mercenary.program(:"github-pages") do |p| + p.version GitHubPages::VERSION + p.description + p.syntax "github-pages <subcommand> options" + + p.command(:versions) do |c| + c.syntax "versions" + c.description "lists the current gem dependency versions" + c.option "all", "--all", "Report all versions, not just ones we lock to (cannot be used with --gemfile)" + c.option "gemfile", "--gemfile", "use Gemfile formatting" + c.action do |args, options| + if options["gemfile"] + GitHubPages::Dependencies.gems.each { |g,v| puts "gem '#{g}', '#{v}'" } + else + require 'terminal-table' + versions = options['all'] ? GitHubPages::Dependencies.versions : GitHubPages::Dependencies.gems + puts Terminal::Table.new :rows => versions, :headings => ["Gem", "Version"] + end + end + end + + p.command(:branch) do |c| + c.syntax "branch BRANCH" + c.description "Generates the gem dependency at given branch" + c.alias(:br) + c.action do |args, options| + puts [ + "gem 'github-pages'", + ":branch => '#{args[0] || "master"}'", + ":git => 'git://github.com/github/pages-gem'" + ].join(", ") + end + end + + p.command(:"health-check") do |c| + c.syntax "health-check" + c.description "Checks your GitHub Pages site for common DNS configuration issues" + c.action do |args, options| + require 'github-pages-health-check' + cname_path = File.expand_path "CNAME", Dir.pwd + raise "No CNAME file found in current directory" unless File.exists?(cname_path) + cname = File.open(cname_path).read.strip + check = GitHubPages::HealthCheck.check(cname) + puts "Checking domain #{cname}..." + if check.valid? + puts "Everything looks a-okay! :)" + exit 0 + else + puts "Uh oh. Looks like something's fishy: #{check.reason}" + exit 1 + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages.rb new file mode 100644 index 000000000000..3d1f62d7e4df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.dirname(__FILE__)) +require "jekyll" + +# Top-level namespace for all GitHub Pages-related concerns. +module GitHubPages + autoload :Plugins, "github-pages/plugins" + autoload :Configuration, "github-pages/configuration" + autoload :Dependencies, "github-pages/dependencies" + autoload :VERSION, "github-pages/version" + + def self.versions + Dependencies.versions + end +end + +Jekyll::Hooks.register :site, :after_reset do |site| + GitHubPages::Configuration.set(site) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/configuration.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/configuration.rb new file mode 100644 index 000000000000..3b1932d7a568 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/configuration.rb @@ -0,0 +1,191 @@ +# frozen_string_literal: true + +require "securerandom" + +module GitHubPages + # Sets and manages Jekyll configuration defaults and overrides + class Configuration + # Backward compatability of constants + DEFAULT_PLUGINS = GitHubPages::Plugins::DEFAULT_PLUGINS + PLUGIN_WHITELIST = GitHubPages::Plugins::PLUGIN_WHITELIST + DEVELOPMENT_PLUGINS = GitHubPages::Plugins::DEVELOPMENT_PLUGINS + THEMES = GitHubPages::Plugins::THEMES + + # Default, user overwritable options + DEFAULTS = { + "jailed" => false, + "plugins" => GitHubPages::Plugins::DEFAULT_PLUGINS, + "future" => true, + "theme" => "jekyll-theme-primer", + "markdown" => "kramdown", + "kramdown" => { + "input" => "GFM", + "hard_wrap" => false, + "gfm_quirks" => "paragraph_end", + "syntax_highlighter_opts" => { + "default_lang" => "plaintext", + }, + }, + "exclude" => ["CNAME"], + }.freeze + + # User-overwritable defaults used only in production for practical reasons + PRODUCTION_DEFAULTS = Jekyll::Utils.deep_merge_hashes DEFAULTS, { + "sass" => { + "style" => "compressed", + }, + }.freeze + + # Options which GitHub Pages sets, regardless of the user-specified value + # + # The following values are also overridden by GitHub Pages, but are not + # overridden locally, for practical purposes: + # * source + # * destination + # * jailed + # * verbose + # * incremental + # * GH_ENV + OVERRIDES = { + "lsi" => false, + "safe" => true, + "plugins_dir" => SecureRandom.hex, + "whitelist" => GitHubPages::Plugins::PLUGIN_WHITELIST, + "highlighter" => "rouge", + "kramdown" => { + "template" => "", + "math_engine" => "mathjax", + "syntax_highlighter" => "rouge", + }, + "gist" => { + "noscript" => false, + }, + }.freeze + + # These configuration settings have corresponding instance variables on + # Jekyll::Site and need to be set properly when the config is updated. + CONFIGS_WITH_METHODS = %w( + safe lsi highlighter baseurl exclude include future unpublished + show_drafts limit_posts keep_files + ).freeze + + class << self + def processed?(site) + site.instance_variable_get(:@_github_pages_processed) == true + end + + def processed(site) + site.instance_variable_set :@_github_pages_processed, true + end + + def disable_whitelist? + development? && !ENV["DISABLE_WHITELIST"].to_s.empty? + end + + def development? + Jekyll.env == "development" + end + + def defaults_for_env + defaults = development? ? DEFAULTS : PRODUCTION_DEFAULTS + Jekyll::Utils.deep_merge_hashes Jekyll::Configuration::DEFAULTS, defaults + end + + # Given a user's config, determines the effective configuration by building a user + # configuration sandwhich with our overrides overriding the user's specified + # values which themselves override our defaults. + # + # Returns the effective Configuration + # + # Note: this is a highly modified version of Jekyll#configuration + def effective_config(user_config) + # Merge user config into defaults + config = Jekyll::Utils.deep_merge_hashes(defaults_for_env, user_config) + .fix_common_issues + .add_default_collections + + # Allow theme to be explicitly disabled via "theme: null" + config["theme"] = user_config["theme"] if user_config.key?("theme") + + exclude_cname(config) + + # Merge overwrites into user config + config = Jekyll::Utils.deep_merge_hashes config, OVERRIDES + + restrict_and_config_markdown_processor(config) + + configure_plugins(config) + + config + end + + # Set the site's configuration. Implemented as an `after_reset` hook. + # Equivalent #set! function contains the code of interest. This function + # guards against double-processing via the value in #processed. + def set(site) + return if processed? site + + debug_print_versions + set!(site) + processed(site) + end + + # Set the site's configuration with all the proper defaults and overrides. + # Should be called by #set to protect against multiple processings. + def set!(site) + site.config = effective_config(site.config) + end + + private + + # Ensure we're using Kramdown or GFM. Force to Kramdown if + # neither of these. + # + # This can get called multiply on the same config, so try to + # be idempotentish. + def restrict_and_config_markdown_processor(config) + config["markdown"] = "kramdown" unless \ + %w(kramdown gfm commonmarkghpages).include?(config["markdown"].to_s.downcase) + + return unless config["markdown"].to_s.casecmp("gfm").zero? + + config["markdown"] = "CommonMarkGhPages" + config["commonmark"] = { + "extensions" => %w(table strikethrough autolink tagfilter), + "options" => %w(footnotes), + } + end + + # If the user's 'exclude' config is the default, also exclude the CNAME + def exclude_cname(config) + return unless config["exclude"].eql? Jekyll::Configuration::DEFAULTS["exclude"] + + config["exclude"].concat(DEFAULTS["exclude"]) + end + + # Requires default plugins and configures whitelist in development + def configure_plugins(config) + # Ensure we have those gems we want. + config["plugins"] = Array(config["plugins"]) | DEFAULT_PLUGINS + + # To minimize errors, lazy-require jekyll-remote-theme if requested by the user + config["plugins"].push("jekyll-remote-theme") if config.key? "remote_theme" + + return unless development? + + if disable_whitelist? + config["whitelist"] = config["whitelist"] | config["plugins"] + end + + config["whitelist"] = config["whitelist"] | DEVELOPMENT_PLUGINS + end + + # Print the versions for github-pages and jekyll to the debug + # stream for debugging purposes. See by running Jekyll with '--verbose' + def debug_print_versions + Jekyll.logger.debug "GitHub Pages:", "github-pages v#{GitHubPages::VERSION}" + Jekyll.logger.debug "GitHub Pages:", "jekyll v#{Jekyll::VERSION}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/dependencies.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/dependencies.rb new file mode 100644 index 000000000000..543fce54029d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/dependencies.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +module GitHubPages + # Dependencies is where all the public dependencies for GitHub Pages are defined, + # and versions locked. Any plugin for Pages must be specified here with a + # corresponding version to which it shall be locked in the runtime dependencies. + class Dependencies + VERSIONS = { + # Jekyll + "jekyll" => "3.9.0", + "jekyll-sass-converter" => "1.5.2", + + # Converters + "kramdown" => "2.3.1", + "kramdown-parser-gfm" => "1.1.0", + "jekyll-commonmark-ghpages" => "0.1.6", + + # Misc + "liquid" => "4.0.3", + "rouge" => "3.26.0", + "github-pages-health-check" => "1.17.0", + + # Plugins + "jekyll-redirect-from" => "0.16.0", + "jekyll-sitemap" => "1.4.0", + "jekyll-feed" => "0.15.1", + "jekyll-gist" => "1.5.0", + "jekyll-paginate" => "1.1.0", + "jekyll-coffeescript" => "1.1.1", + "jekyll-seo-tag" => "2.7.1", + "jekyll-github-metadata" => "2.13.0", + "jekyll-avatar" => "0.7.0", + "jekyll-remote-theme" => "0.4.3", + + # Plugins to match GitHub.com Markdown + "jemoji" => "0.12.0", + "jekyll-mentions" => "1.6.0", + "jekyll-relative-links" => "0.6.1", + "jekyll-optional-front-matter" => "0.3.2", + "jekyll-readme-index" => "0.3.0", + "jekyll-default-layout" => "0.1.4", + "jekyll-titles-from-headings" => "0.5.3", + }.freeze + + # Jekyll and related dependency versions as used by GitHub Pages. + # For more information see: + # https://help.github.com/articles/using-jekyll-with-pages + def self.gems + VERSIONS.merge(GitHubPages::Plugins::THEMES) + end + + # Versions used by GitHub Pages, including github-pages gem and ruby version + # Useful for programmatically querying for the current-running version + def self.versions + gems.merge version_report + end + + def self.version_report + require "html/pipeline/version" + require "sass/version" + require "safe_yaml/version" + require "nokogiri" + + { + "ruby" => RUBY_VERSION, + + # Gem versions we're curious about + "github-pages" => VERSION.to_s, + "html-pipeline" => HTML::Pipeline::VERSION, + "sass" => Sass.version[:number], + "safe_yaml" => SafeYAML::VERSION, + "nokogiri" => Nokogiri::VERSION, + } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/plugins.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/plugins.rb new file mode 100644 index 000000000000..78db91af2b94 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/plugins.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +module GitHubPages + # Manages the constants that govern which plugins are allowed on GitHub Pages + class Plugins + # Plugins which are activated by default + DEFAULT_PLUGINS = %w( + jekyll-coffeescript + jekyll-commonmark-ghpages + jekyll-gist + jekyll-github-metadata + jekyll-paginate + jekyll-relative-links + jekyll-optional-front-matter + jekyll-readme-index + jekyll-default-layout + jekyll-titles-from-headings + ).freeze + + # Plugins allowed by GitHub Pages + PLUGIN_WHITELIST = %w( + jekyll-coffeescript + jekyll-commonmark-ghpages + jekyll-feed + jekyll-gist + jekyll-github-metadata + jekyll-paginate + jekyll-redirect-from + jekyll-seo-tag + jekyll-sitemap + jekyll-avatar + jemoji + jekyll-mentions + jekyll-relative-links + jekyll-optional-front-matter + jekyll-readme-index + jekyll-default-layout + jekyll-titles-from-headings + jekyll-include-cache + jekyll-octicons + jekyll-remote-theme + ).freeze + + # Plugins only allowed locally + DEVELOPMENT_PLUGINS = %w( + jekyll-admin + ).freeze + + # Themes + THEMES = { + "jekyll-swiss" => "1.0.0", + "minima" => "2.5.1", + "jekyll-theme-primer" => "0.5.4", + "jekyll-theme-architect" => "0.1.1", + "jekyll-theme-cayman" => "0.1.1", + "jekyll-theme-dinky" => "0.1.1", + "jekyll-theme-hacker" => "0.1.2", + "jekyll-theme-leap-day" => "0.1.1", + "jekyll-theme-merlot" => "0.1.1", + "jekyll-theme-midnight" => "0.1.1", + "jekyll-theme-minimal" => "0.1.1", + "jekyll-theme-modernist" => "0.1.1", + "jekyll-theme-slate" => "0.1.1", + "jekyll-theme-tactile" => "0.1.1", + "jekyll-theme-time-machine" => "0.1.1", + }.freeze + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/version.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/version.rb new file mode 100644 index 000000000000..458793e88da2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-214/lib/github-pages/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module GitHubPages + VERSION = 214 +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.dockerignore b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.dockerignore new file mode 100644 index 000000000000..b844b143d22f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.dockerignore @@ -0,0 +1 @@ +Gemfile.lock diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.github/workflows/push-cibuild.yml b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.github/workflows/push-cibuild.yml new file mode 100644 index 000000000000..662063c2305b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.github/workflows/push-cibuild.yml @@ -0,0 +1,18 @@ +on: push +name: cibuild on push +jobs: + build: + name: "GitHub Pages Health Check Tests" + runs-on: ubuntu-latest + strategy: + matrix: + ruby: + - 2.5 + - 2.6 + - 2.7 + steps: + - uses: actions/checkout@master + - name: script/cibuild-docker + run: script/cibuild-docker + env: + RUBY_VERSION: ${{ matrix.ruby }} diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.gitignore new file mode 100644 index 000000000000..b2f83a8f656e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.gitignore @@ -0,0 +1,7 @@ +/*.gem +*.lock +.bundle +vendor/gems +/bin +.env +spec/examples.txt diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.rspec b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.rspec new file mode 100644 index 000000000000..83e16f804474 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.rspec @@ -0,0 +1,2 @@ +--color +--require spec_helper diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.rubocop.yml new file mode 100644 index 000000000000..bb07562a0953 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.rubocop.yml @@ -0,0 +1,154 @@ +# Ruby linting configuration. +# See https://github.com/styleguide/ruby for the Ruby style guide + +# We only worry about two kinds of issues: 'error' and anything less than that. +# Error is not about severity, but about taste. Simple style choices that +# never have a great excuse to be broken, such as 1.9 JSON-like hash syntax, +# are errors. Choices that tend to have good exceptions in practice, such as +# line length, are warnings. + +# If you'd like to make changes, a full list of available issues is at +# https://github.com/bbatsov/rubocop/blob/master/config/enabled.yml +# +# A list of configurable issues is at: +# https://github.com/bbatsov/rubocop/blob/master/config/default.yml +# +# If you disable a check, document why. +# + +AllCops: + TargetRubyVersion: 2.6 + Exclude: + - 'bin/**/*' + - 'script/**/*' + - 'vendor/**/*' + - 'test-site/**/*' + +Layout/EndAlignment: + Severity: error + +Lint/UnreachableCode: + Severity: error + +Style/StringLiteralsInInterpolation: + EnforcedStyle: double_quotes + +Style/HashSyntax: + EnforcedStyle: hash_rockets + Severity: error + +Layout/HashAlignment: + SupportedLastArgumentHashStyles: always_ignore + +Layout/ParameterAlignment: + Enabled: false # This is usually true, but we often want to roll back to + # the start of a line. + +Style/Attr: + Enabled: false # We have no styleguide guidance here, and it seems to be + # in frequent use. + +Style/ClassAndModuleChildren: + Enabled: false # module X<\n>module Y is just as good as module X::Y. + +Layout/LineLength: + Max: 90 + Severity: warning + Exclude: + - github-pages-health-check.gemspec + - lib/github-pages-health-check/errors/*.rb + +Metrics/BlockLength: + Enabled: false + +Style/MultilineTernaryOperator: + Severity: error + +Style/AndOr: + Severity: error + +Layout/IndentationWidth: + Severity: error + +Metrics/MethodLength: + CountComments: false # count full line comments? + Max: 20 + Severity: error + Exclude: + - lib/github-pages-health-check/printer.rb + +Style/Alias: + Enabled: false # We have no guidance on alias vs alias_method + +Style/RedundantSelf: + Enabled: false # Sometimes a self.field is a bit more clear + +Style/IfUnlessModifier: + Enabled: false + +Naming/FileName: #Rubocop doesn't like the Git*H*ub namespace + Enabled: false + +Metrics/ParameterLists: { Max: 4 } + +Layout/FirstHashElementIndentation: { EnforcedStyle: consistent } +Layout/MultilineMethodCallIndentation: { EnforcedStyle: indented } +Layout/MultilineOperationIndentation: { EnforcedStyle: indented } +Layout/FirstParameterIndentation: { EnforcedStyle: consistent } +Layout/FirstArrayElementIndentation: { EnforcedStyle: consistent } +Layout/ExtraSpacing: { AllowForAlignment: true } +Style/SignalException: { EnforcedStyle: only_raise } +Style/StringLiterals: { EnforcedStyle: double_quotes } + +Style/PercentLiteralDelimiters: + PreferredDelimiters: + '%q': '{}' + '%Q': '{}' + '%r': '{}' + '%s': '()' + '%w': '()' + '%W': '()' + '%x': '()' + +Style/Documentation: + Enabled: false + +Metrics/ClassLength: + Exclude: + - lib/github-pages-health-check/domain.rb + +Metrics/CyclomaticComplexity: + Max: 9 + Exclude: + - lib/github-pages-health-check/printer.rb + +Metrics/PerceivedComplexity: + Max: 9 + Exclude: + - lib/github-pages-health-check/printer.rb + +Metrics/AbcSize: + Max: 17 + Exclude: + - lib/github-pages-health-check/printer.rb + +Style/DoubleNegation: + Enabled: false + +Layout/EmptyLineAfterMagicComment: + Exclude: + - script/* + +Style/FrozenStringLiteralComment: + Enabled: true + Severity: error + +Gemspec/RequiredRubyVersion: + Enabled: false + +Style/HashEachMethods: + Enabled: false +Style/HashTransformKeys: + Enabled: false +Style/HashTransformValues: + Enabled: false diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.ruby-version b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.ruby-version new file mode 100644 index 000000000000..860487ca19ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.ruby-version @@ -0,0 +1 @@ +2.7.1 diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.travis.yml new file mode 100644 index 000000000000..27e1eae2e734 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/.travis.yml @@ -0,0 +1,16 @@ +language: ruby +rvm: + - 2.5 + - 2.6 + - 2.7 + +before_install: + - gem update --system + +script: "script/cibuild" + +notifications: + email: false + +cache: bundler +sudo: false diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/Dockerfile b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/Dockerfile new file mode 100644 index 000000000000..f54863104cdd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/Dockerfile @@ -0,0 +1,18 @@ +ARG RUBY_VERSION +FROM ruby:$RUBY_VERSION-slim +RUN set -ex \ + && gem update --system --silent --quiet \ + && apt-get update -y \ + && apt-get upgrade -y \ + && apt-get install -y \ + build-essential \ + git \ + libcurl4-openssl-dev \ + && apt-get clean +WORKDIR /app/github-pages-health-check +COPY Gemfile . +COPY github-pages-health-check.gemspec . +COPY lib/github-pages-health-check/version.rb lib/github-pages-health-check/version.rb +RUN bundle install +COPY . . +ENTRYPOINT [ "/bin/bash" ] diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/Gemfile new file mode 100644 index 000000000000..bbfee1d23eec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/Gemfile @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +group :development do + gem "dotenv", "~> 2.7" + gem "gem-release", "~> 2.1" + gem "pry", "~> 0.10" + gem "rspec", "~> 3.0" + gem "rubocop", "~> 0.52" + gem "webmock", "~> 3.8" +end + +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/LICENSE.md new file mode 100644 index 000000000000..19030fac8f4c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 - 2017 GitHub, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/README.md b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/README.md new file mode 100644 index 000000000000..dc0b65859d58 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/README.md @@ -0,0 +1,83 @@ +# GitHub Pages Health Check + +*Checks your GitHub Pages site for common DNS configuration issues* + +[![Build Status](https://travis-ci.org/github/pages-health-check.svg)](https://travis-ci.org/github/pages-health-check) [![Gem Version](https://badge.fury.io/rb/github-pages-health-check.svg)](http://badge.fury.io/rb/github-pages-health-check) + +## Installation + +`gem install github-pages-health-check` + +## Usage + +### Basic Usage + +```ruby +> check = GitHubPages::HealthCheck::Site.new("choosealicense.com") +=> #<GitHubPages::HealthCheck::Site @domain="choosealicense.com" valid?=true> +> check.valid? +=> true +``` + +### An invalid domain + +```ruby +> check = GitHubPages::HealthCheck::Site.new("foo.github.com") +> check.valid? +=> false +> check.valid! +raises GitHubPages::HealthCheck::Errors::InvalidCNAMEError +``` + + +### Retrieving specific checks + +``` ruby +> check.domain.should_be_a_record? +=> true +> check.domain.a_record? +=> true +``` + +### Getting checks in bulk + +```ruby +> check.to_hash +=> { + :cloudflare_ip?=>false, + :old_ip_address?=>false, + :a_record?=>true, + :cname_record?=>false, + :valid_domain?=>true, + :apex_domain?=>true, + :should_be_a_record?=>true, + :pointed_to_github_user_domain?=>false, + :pointed_to_github_pages_ip?=>false, + :pages_domain?=>false, + :valid?=>true +} +> check.to_json +=> "{\"cloudflare_ip?\":false,\"old_ip_address?\":false,\"a_record?\":true,\"cname_record?\":false,\"valid_domain?\":true,\"apex_domain?\":true,\"should_be_a_record?\":true,\"pointed_to_github_user_domain?\":false,\"pointed_to_github_pages_ip?\":false,\"pages_domain?\":false,\"valid?\":true}" +``` + +### Getting the reason a domain is invalid + +```ruby +> check = GitHubPages::HealthCheck::Site.new "developer.facebook.com" +> check.valid? +=> false +> check.reason +=> #<GitHubPages::HealthCheck::InvalidCNAME> +> check.reason.message +=> "CNAME does not point to GitHub Pages" +``` + +### Repository checks + +Repository checks require a personal access or OAuth token with `repo` or scope. This can be passed as the second argument to the Site or Repository constructors like so: + +```ruby +check = GitHubPages::HealthCheck::Site.new "github/pages-health-check", access_token: "1234 +``` + +You can also set `OCTOKIT_ACCESS_TOKEN` as an environmental variable, or via a `.env` file in your working directory. diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/config/cloudflare-ips.txt b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/config/cloudflare-ips.txt new file mode 100644 index 000000000000..2800771cd88b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/config/cloudflare-ips.txt @@ -0,0 +1,14 @@ +173.245.48.0/20 +103.21.244.0/22 +103.22.200.0/22 +103.31.4.0/22 +141.101.64.0/18 +108.162.192.0/18 +190.93.240.0/20 +188.114.96.0/20 +197.234.240.0/22 +198.41.128.0/17 +162.158.0.0/15 +104.16.0.0/12 +172.64.0.0/13 +131.0.72.0/22 diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/config/fastly-ips.txt b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/config/fastly-ips.txt new file mode 100644 index 000000000000..d23cf1abb209 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/config/fastly-ips.txt @@ -0,0 +1,17 @@ +23.235.32.0/20 +43.249.72.0/22 +103.244.50.0/24 +103.245.222.0/23 +103.245.224.0/24 +104.156.80.0/20 +146.75.0.0/16 +151.101.0.0/16 +157.52.64.0/18 +167.82.0.0/17 +167.82.128.0/20 +167.82.160.0/20 +167.82.224.0/20 +172.111.64.0/18 +185.31.16.0/22 +199.27.72.0/21 +199.232.0.0/16 \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/github-pages-health-check.gemspec b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/github-pages-health-check.gemspec new file mode 100644 index 000000000000..58a64bdcd994 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/github-pages-health-check.gemspec @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require File.expand_path("lib/github-pages-health-check/version", __dir__) + +Gem::Specification.new do |s| + s.required_ruby_version = ">= 2.2.0" + + s.name = "github-pages-health-check" + s.version = GitHubPages::HealthCheck::VERSION + s.summary = "Checks your GitHub Pages site for commons DNS configuration issues" + s.description = "Checks your GitHub Pages site for commons DNS configuration issues." + s.authors = "GitHub, Inc." + s.email = "support@github.com" + s.homepage = "https://github.com/github/github-pages-health-check" + s.license = "MIT" + s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + s.require_paths = ["lib"] + + s.add_dependency("addressable", "~> 2.3") + s.add_dependency("dnsruby", "~> 1.60") + s.add_dependency("octokit", "~> 4.0") + s.add_dependency("public_suffix", ">= 2.0.2", "< 5.0") + s.add_dependency("typhoeus", "~> 1.3") +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check.rb new file mode 100644 index 000000000000..74390b5591df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +require "dnsruby" +require "addressable/idna" +require "addressable/uri" +require "ipaddr" +require "public_suffix" +require "singleton" +require "net/http" +require "typhoeus" +require "resolv" +require "timeout" +require "octokit" +require_relative "github-pages-health-check/version" + +if File.exist?(File.expand_path("../.env", File.dirname(__FILE__))) + require "dotenv" + Dotenv.load +end + +module GitHubPages + module HealthCheck + autoload :CDN, "github-pages-health-check/cdn" + autoload :CloudFlare, "github-pages-health-check/cdns/cloudflare" + autoload :Fastly, "github-pages-health-check/cdns/fastly" + autoload :Error, "github-pages-health-check/error" + autoload :Errors, "github-pages-health-check/errors" + autoload :CAA, "github-pages-health-check/caa" + autoload :Checkable, "github-pages-health-check/checkable" + autoload :Domain, "github-pages-health-check/domain" + autoload :RedundantCheck, "github-pages-health-check/redundant_check" + autoload :Repository, "github-pages-health-check/repository" + autoload :Resolver, "github-pages-health-check/resolver" + autoload :Site, "github-pages-health-check/site" + autoload :Printer, "github-pages-health-check/printer" + + # DNS and HTTP timeout, in seconds + TIMEOUT = 7 + + HUMAN_NAME = "GitHub Pages Health Check" + URL = "https://github.com/github/pages-health-check" + USER_AGENT = "Mozilla/5.0 (compatible; #{HUMAN_NAME}/#{VERSION}; +#{URL})" + + TYPHOEUS_OPTIONS = { + :followlocation => true, + :timeout => TIMEOUT, + :accept_encoding => "gzip", + :method => :head, + :headers => { + "User-Agent" => USER_AGENT + } + }.freeze + + # surpress warn-level feedback due to unsupported record types + def self.without_warnings(&block) + warn_level = $VERBOSE + $VERBOSE = nil + result = block.call + $VERBOSE = warn_level + result + end + + def self.check(repository_or_domain, access_token: nil) + Site.new repository_or_domain, :access_token => access_token + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/caa.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/caa.rb new file mode 100644 index 000000000000..e9e8a7fd38d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/caa.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +require "dnsruby" +require "public_suffix" +require "github-pages-health-check/resolver" + +module GitHubPages + module HealthCheck + class CAA + attr_reader :host, :error, :nameservers + + def initialize(host:, nameservers: :default) + raise ArgumentError, "host cannot be nil" if host.nil? + + @host = host + @nameservers = nameservers + end + + def errored? + records # load the records first + !error.nil? + end + + def lets_encrypt_allowed? + return false if errored? + return true unless records_present? + + records.any? { |r| r.property_value == "letsencrypt.org" } + end + + def records_present? + return false if errored? + + records && !records.empty? + end + + def records + return @records if defined?(@records) + + @records = get_caa_records(host) + @records = get_caa_records(parent_host) if @records.nil? || @records.empty? + + @records + end + + private + + def get_caa_records(domain) + return [] if domain.nil? + + query(domain).select { |r| issue_caa_record?(r) } + end + + def issue_caa_record?(record) + record.type == Dnsruby::Types::CAA && record.property_tag == "issue" + end + + def query(domain) + resolver(domain).query(Dnsruby::Types::CAA) + rescue Dnsruby::ResolvError, Dnsruby::ResolvTimeout => e + @error = e + [] + end + + def resolver(domain) + GitHubPages::HealthCheck::Resolver.new(domain, :nameservers => nameservers) + end + + def parent_host + host.split(".").drop(1).join(".") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/cdn.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/cdn.rb new file mode 100644 index 000000000000..01317e277058 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/cdn.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + class CDN + include Singleton + + # Internal: The path of the config file. + attr_reader :name, :path + + # Public: Does cloudflare control this address? + def self.controls_ip?(address) + instance.controls_ip?(address) + end + + # Internal: Create a new CDN info instance. + def initialize(options = {}) + @name = options.fetch(:name) { self.class.name.split("::").last.downcase } + @path = options.fetch(:path) { default_config_path } + end + + # Internal: Does this CDN control this address? + def controls_ip?(address) + ranges.any? { |range| range.include?(address.to_s) } + end + + private + + # Internal: The IP address ranges that cloudflare controls. + def ranges + @ranges ||= load_ranges + end + + # Internal: Load IPAddr ranges from #path + def load_ranges + File.read(path).lines.map { |line| IPAddr.new(line.chomp) } + end + + def default_config_path + File.expand_path("../../config/#{name}-ips.txt", File.dirname(__FILE__)) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/cdns/cloudflare.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/cdns/cloudflare.rb new file mode 100644 index 000000000000..70ee7cfcb783 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/cdns/cloudflare.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + # Instance of the CloudFlare CDN for checking IP ownership + # Specifically not namespaced to avoid a breaking change + class CloudFlare < CDN + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/cdns/fastly.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/cdns/fastly.rb new file mode 100644 index 000000000000..63d1e681c786 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/cdns/fastly.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + # Instance of the Fastly CDN for checking IP ownership + # Specifically not namespaced to avoid a breaking change + class Fastly < CDN + # Fastly maps used by GitHub Pages. + HOSTNAMES = %w( + github.map.fastly.net + github.map.fastly.net. + sni.github.map.fastly.net + sni.github.map.fastly.net. + ).freeze + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/checkable.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/checkable.rb new file mode 100644 index 000000000000..f8c84609db40 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/checkable.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + class Checkable + # Array of symbolized methods to be included in the output hash + HASH_METHODS = [].freeze + + def check! + raise "Not implemented" + end + alias valid! check! + + # Runs all checks, returns true if valid, otherwise false + def valid? + check! + true + rescue GitHubPages::HealthCheck::Error + false + end + + # Returns the reason the check failed, if any + def reason + check! + nil + rescue GitHubPages::HealthCheck::Error => e + e + end + + def to_hash + @to_hash ||= begin + hash = {} + self.class::HASH_METHODS.each do |method| + hash[method] = public_send(method) + end + hash + end + end + alias [] to_hash + alias to_h to_hash + + def to_json(state = nil) + require "json" + to_hash.to_json(state) + end + + def to_s + printer.simple_string + end + + def to_s_pretty + printer.pretty_print + end + alias pretty_print to_s_pretty + + private + + def printer + @printer ||= GitHubPages::HealthCheck::Printer.new(self) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/domain.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/domain.rb new file mode 100644 index 000000000000..32e2e2294617 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/domain.rb @@ -0,0 +1,507 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + class Domain < Checkable + attr_reader :host, :resolver, :nameservers + + LEGACY_IP_ADDRESSES = [ + # Legacy GitHub Datacenter + "207.97.227.245", + "204.232.175.78", + + # Aug. 2016 Fastly datacenter deprecation + "199.27.73.133", + "199.27.76.133", + + # Feb. 2017 Fastly datacenter deprecation + "103.245.222.133", + "103.245.223.133", + "103.245.224.133", + "104.156.81.133", + "104.156.82.133", + "104.156.83.133", + "104.156.85.133", + "104.156.87.133", + "104.156.88.133", + "104.156.89.133", + "104.156.90.133", + "104.156.91.133", + "104.156.92.133", + "104.156.93.133", + "104.156.94.133", + "104.156.95.133", + "104.37.95.133", + "157.52.64.133", + "157.52.66.133", + "157.52.67.133", + "157.52.68.133", + "157.52.69.133", + "157.52.96.133", + "172.111.64.133", + "172.111.96.133", + "185.31.16.133", + "185.31.17.133", + "185.31.18.133", + "185.31.19.133", + "199.27.74.133", + "199.27.75.133", + "199.27.76.133", + "199.27.78.133", + "199.27.79.133", + "23.235.33.133", + "23.235.37.133", + "23.235.39.133", + "23.235.40.133", + "23.235.41.133", + "23.235.43.133", + "23.235.44.133", + "23.235.45.133", + "23.235.46.133", + "23.235.47.133", + "23.235.47.133", + "43.249.72.133", + "43.249.73.133", + "43.249.74.133", + "43.249.75.133", + + # 2018 Move to GitHub assigned IP space + "192.30.252.153", + "192.30.252.154" + ].freeze + + CURRENT_IP_ADDRESSES = %w( + 185.199.108.153 + 185.199.109.153 + 185.199.110.153 + 185.199.111.153 + ).freeze + + HASH_METHODS = %i[ + host uri nameservers dns_resolves? proxied? cloudflare_ip? + fastly_ip? old_ip_address? a_record? cname_record? + mx_records_present? valid_domain? apex_domain? should_be_a_record? + cname_to_github_user_domain? cname_to_pages_dot_github_dot_com? + cname_to_fastly? pointed_to_github_pages_ip? + non_github_pages_ip_present? pages_domain? + served_by_pages? valid? reason valid_domain? https? + enforces_https? https_error https_eligible? caa_error + ].freeze + + def self.redundant(host) + GitHubPages::HealthCheck::RedundantCheck.new(host).check + end + + def initialize(host, nameservers: :default) + unless host.is_a? String + raise ArgumentError, "Expected string, got #{host.class}" + end + + @host = normalize_host(host) + @nameservers = nameservers + @resolver = GitHubPages::HealthCheck::Resolver.new(self.host, + :nameservers => nameservers) + end + + # Runs all checks, raises an error if invalid + # rubocop:disable Metrics/AbcSize + def check! + raise Errors::InvalidDomainError.new :domain => self unless valid_domain? + raise Errors::InvalidDNSError.new :domain => self unless dns_resolves? + raise Errors::DeprecatedIPError.new :domain => self if deprecated_ip? + return true if proxied? + raise Errors::InvalidARecordError.new :domain => self if invalid_a_record? + raise Errors::InvalidCNAMEError.new :domain => self if invalid_cname? + raise Errors::InvalidAAAARecordError.new :domain => self if invalid_aaaa_record? + raise Errors::NotServedByPagesError.new :domain => self unless served_by_pages? + + true + end + # rubocop:enable Metrics/AbcSize + + def deprecated_ip? + return @deprecated_ip if defined? @deprecated_ip + + @deprecated_ip = (valid_domain? && a_record? && old_ip_address?) + end + + def invalid_aaaa_record? + return @invalid_aaaa_record if defined? @invalid_aaaa_record + + @invalid_aaaa_record = (valid_domain? && should_be_a_record? && + aaaa_record_present?) + end + + def invalid_a_record? + return @invalid_a_record if defined? @invalid_a_record + + @invalid_a_record = (valid_domain? && a_record? && !should_be_a_record?) + end + + def invalid_cname? + return @invalid_cname if defined? @invalid_cname + + @invalid_cname = begin + return false unless valid_domain? + return false if github_domain? || apex_domain? + return true if cname_to_pages_dot_github_dot_com? || cname_to_fastly? + + !cname_to_github_user_domain? && should_be_cname_record? + end + end + + # Is this a valid domain that PublicSuffix recognizes? + # Used as an escape hatch to prevent false positives on DNS checkes + def valid_domain? + return @valid if defined? @valid + + unicode_host = Addressable::IDNA.to_unicode(host) + @valid = PublicSuffix.valid?(unicode_host, + :default_rule => nil, + :ignore_private => true) + end + + # Is this domain an apex domain, meaning a CNAME would be innapropriate + def apex_domain? + return @apex_domain if defined?(@apex_domain) + return unless valid_domain? + + # PublicSuffix.domain pulls out the apex-level domain name. + # E.g. PublicSuffix.domain("techblog.netflix.com") # => "netflix.com" + # It's aware of multi-step top-level domain names: + # E.g. PublicSuffix.domain("blog.digital.gov.uk") # => "digital.gov.uk" + # For apex-level domain names, DNS providers do not support CNAME records. + unicode_host = Addressable::IDNA.to_unicode(host) + PublicSuffix.domain(unicode_host, + :default_rule => nil, + :ignore_private => true) == unicode_host + end + + # Should the domain use an A record? + def should_be_a_record? + !pages_io_domain? && (apex_domain? || mx_records_present?) + end + + def should_be_cname_record? + !should_be_a_record? + end + + # Is the domain's first response an A record to a valid GitHub Pages IP? + def pointed_to_github_pages_ip? + a_record? && CURRENT_IP_ADDRESSES.include?(dns.first.address.to_s) + end + + # Are any of the domain's A records pointing elsewhere? + def non_github_pages_ip_present? + return unless dns? + + a_records = dns.select { |answer| answer.type == Dnsruby::Types::A } + + a_records.any? { |answer| !github_pages_ip?(answer.address.to_s) } + + false + end + + # Is the domain's first response a CNAME to a pages domain? + def cname_to_github_user_domain? + cname? && !cname_to_pages_dot_github_dot_com? && cname.pages_domain? + end + + # Is the given domain a CNAME to pages.github.(io|com) + # instead of being CNAME'd to the user's subdomain? + # + # domain - the domain to check, generaly the target of a cname + def cname_to_pages_dot_github_dot_com? + cname? && cname.pages_dot_github_dot_com? + end + + # Is the given domain CNAME'd directly to our Fastly account? + def cname_to_fastly? + cname? && !pages_domain? && cname.fastly? + end + + # Is the host a *.github.io domain? + def pages_io_domain? + !!host.match(/\A[\w-]+\.github\.(io)\.?\z/i) + end + + # Is the host a *.github.(io|com) domain? + def pages_domain? + !!host.match(/\A[\w-]+\.github\.(io|com)\.?\z/i) + end + + # Is the host pages.github.com or pages.github.io? + def pages_dot_github_dot_com? + !!host.match(/\Apages\.github\.(io|com)\.?\z/i) + end + + # Is this domain owned by GitHub? + def github_domain? + !!host.downcase.end_with?("github.com") + end + + # Is the host our Fastly CNAME? + def fastly? + !!host.match(/\A#{Regexp.union(Fastly::HOSTNAMES)}\z/i) + end + + # Does the domain resolve to a CloudFlare-owned IP + def cloudflare_ip? + cdn_ip?(CloudFlare) + end + + # Does the domain resolve to a Fastly-owned IP + def fastly_ip? + cdn_ip?(Fastly) + end + + # Does this non-GitHub-pages domain proxy a GitHub Pages site? + # + # This can be: + # 1. A Cloudflare-owned IP address + # 2. A site that returns GitHub.com server headers, but + # isn't CNAME'd to a GitHub domain + # 3. A site that returns GitHub.com server headers, but + # isn't CNAME'd to a GitHub IP + def proxied? + return unless dns? + return true if cloudflare_ip? + return false if pointed_to_github_pages_ip? + return false if cname_to_github_user_domain? + return false if cname_to_pages_dot_github_dot_com? + return false if cname_to_fastly? || fastly_ip? + + served_by_pages? + end + + REQUESTED_RECORD_TYPES = [ + Dnsruby::Types::A, + Dnsruby::Types::AAAA, + Dnsruby::Types::CNAME, + Dnsruby::Types::MX + ].freeze + + # Returns an array of DNS answers + def dns + return @dns if defined? @dns + return unless valid_domain? + + @dns = Timeout.timeout(TIMEOUT) do + GitHubPages::HealthCheck.without_warnings do + next if host.nil? + + REQUESTED_RECORD_TYPES + .map { |type| resolver.query(type) } + .flatten.uniq + end + end + rescue StandardError + @dns = nil + end + + # Are we even able to get the DNS record? + def dns? + !(dns.nil? || dns.empty?) + end + alias dns_resolves? dns? + + # Does this domain have *any* A record that points to the legacy IPs? + def old_ip_address? + return unless dns? + + dns.any? do |answer| + answer.type == Dnsruby::Types::A && legacy_ip?(answer.address.to_s) + end + end + + # Is this domain's first response an A record? + def a_record? + return unless dns? + + dns.first.type == Dnsruby::Types::A + end + + def aaaa_record_present? + return unless dns? + + dns.any? { |answer| answer.type == Dnsruby::Types::AAAA } + end + + # Is this domain's first response a CNAME record? + def cname_record? + return unless dns? + return false unless cname + + cname.valid_domain? + end + alias cname? cname_record? + + # The domain to which this domain's CNAME resolves + # Returns nil if the domain is not a CNAME + def cname + cnames = dns.take_while { |answer| answer.type == Dnsruby::Types::CNAME } + return if cnames.empty? + + @cname ||= Domain.new(cnames.last.cname.to_s) + end + + def mx_records_present? + return unless dns? + + dns.any? { |answer| answer.type == Dnsruby::Types::MX } + end + + def served_by_pages? + return @served_by_pages if defined? @served_by_pages + return unless dns_resolves? + + @served_by_pages = begin + return false unless response.mock? || response.return_code == :ok + return true if response.headers["Server"] == "GitHub.com" + + # Typhoeus mangles the case of the header, compare insensitively + response.headers.any? { |k, _v| k.downcase == "x-github-request-id" } + end + end + + def uri(overrides = {}) + options = { :host => host, :scheme => scheme, :path => "/" } + options = options.merge(overrides) + Addressable::URI.new(options).normalize.to_s + end + + # Does this domain respond to HTTPS requests with a valid cert? + def https? + https_response.return_code == :ok + end + + # The response code of the HTTPS request, if it failed. + # Useful for diagnosing cert errors + def https_error + https_response.return_code unless https? + end + + # Does this domain redirect HTTP requests to HTTPS? + def enforces_https? + return false unless https? && http_response.headers["Location"] + + redirect = Addressable::URI.parse(http_response.headers["Location"]) + redirect.scheme == "https" && redirect.host == host + end + + # Can an HTTPS certificate be issued for this domain? + def https_eligible? + # Can't have any IP's which aren't GitHub's present. + return false if non_github_pages_ip_present? + # Can't have any AAAA records present + return false if aaaa_record_present? + # Must be a CNAME or point to our IPs. + + # Only check the one domain if a CNAME. Don't check the parent domain. + return true if cname_to_github_user_domain? + + # Check CAA records for the full domain and its parent domain. + pointed_to_github_pages_ip? && caa.lets_encrypt_allowed? + end + + # Any errors querying CAA records + def caa_error + return nil unless caa.errored? + + caa.error.class.name + end + + private + + def caa + @caa ||= GitHubPages::HealthCheck::CAA.new( + :host => cname&.host || host, + :nameservers => nameservers + ) + end + + # The domain's response to HTTP(S) requests, following redirects + def response + return @response if defined? @response + + @response = Typhoeus.head(uri, TYPHOEUS_OPTIONS) + + # Workaround for webmock not playing nicely with Typhoeus redirects + # See https://github.com/bblimke/webmock/issues/237 + if @response.mock? && @response.headers["Location"] + @response = Typhoeus.head(response.headers["Location"], TYPHOEUS_OPTIONS) + end + + @response + end + + # The domain's response to HTTP requests, without following redirects + def http_response + options = TYPHOEUS_OPTIONS.merge(:followlocation => false) + @http_response ||= Typhoeus.head(uri(:scheme => "http"), options) + end + + # The domain's response to HTTPS requests, without following redirects + def https_response + options = TYPHOEUS_OPTIONS.merge(:followlocation => false) + @https_response ||= Typhoeus.head(uri(:scheme => "https"), options) + end + + # Parse the URI. Accept either domain names or full URI's. + # Used by the initializer so we can be more flexible with inputs. + # + # domain - a URI or domain name. + # + # Examples + # + # normalize_host("benbalter.github.com") + # # => 'benbalter.github.com' + # normalize_host("https://benbalter.github.com") + # # => 'benbalter.github.com' + # normalize_host("benbalter.github.com/help-me-im-a-path/") + # # => 'benbalter.github.com' + # + # Return the hostname. + def normalize_host(domain) + domain = domain.strip.chomp(".") + host = Addressable::URI.parse(domain).normalized_host + host ||= Addressable::URI.parse("http://#{domain}").normalized_host + host unless host.to_s.empty? + rescue Addressable::URI::InvalidURIError + nil + end + + # Adjust `domain` so that it won't be searched for with /etc/resolv.conf + # + # GitHubPages::HealthCheck.new("anything.io").absolute_domain + # => "anything.io." + def absolute_domain + host.end_with?(".") ? host : "#{host}." + end + + def scheme + @scheme ||= github_domain? ? "https" : "http" + end + + # Does the domain resolve to a CDN-owned IP + def cdn_ip?(cdn) + return unless dns? + + a_records = dns.select { |answer| answer.type == Dnsruby::Types::A } + return false if !a_records || a_records.empty? + + a_records.all? do |answer| + cdn.controls_ip?(answer.address) + end + end + + def legacy_ip?(ip_addr) + LEGACY_IP_ADDRESSES.include?(ip_addr) + end + + def github_pages_ip?(ip_addr) + CURRENT_IP_ADDRESSES.include?(ip_addr) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/error.rb new file mode 100644 index 000000000000..61b4018e04be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/error.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + class Error < StandardError + DOCUMENTATION_BASE = "https://help.github.com" + DOCUMENTATION_PATH = "/categories/github-pages-basics/" + LOCAL_ONLY = false # Error is only used when running locally + + attr_reader :repository, :domain + + def initialize(repository: nil, domain: nil) + super + @repository = repository + @domain = domain + end + + def self.inherited(base) + subclasses << base + end + + def self.subclasses + @subclasses ||= [] + end + + def message + "Something's wrong with your GitHub Pages site." + end + + # Error message, with get more info URL appended + def message_with_url + msg = message.gsub(/\s+/, " ").squeeze(" ").strip + msg << "." unless msg.end_with?(".") # add trailing period if not there + "#{msg} #{more_info}" + end + alias message_formatted message_with_url + + def to_s + "#{message_with_url} (#{name})".tr("\n", " ").squeeze(" ").strip + end + + private + + def name + self.class.name.split("::").last + end + + def username + if repository.nil? + "[YOUR USERNAME]" + else + repository.owner + end + end + + def more_info + "For more information, see #{documentation_url}." + end + + def documentation_url + URI.join(Error::DOCUMENTATION_BASE, self.class::DOCUMENTATION_PATH).to_s + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors.rb new file mode 100644 index 000000000000..6c25e8027f87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +Dir[File.expand_path("errors/*_error.rb", __dir__)].sort.each do |f| + require f +end + +module GitHubPages + module HealthCheck + module Errors + def self.all + Error.subclasses + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/build_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/build_error.rb new file mode 100644 index 000000000000..ca8356373996 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/build_error.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class BuildError < GitHubPages::HealthCheck::Error + DOCUMENTATION_PATH = "/articles/troubleshooting-jekyll-builds/" + LOCAL_ONLY = true + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/deprecated_ip_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/deprecated_ip_error.rb new file mode 100644 index 000000000000..fff3f52acc0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/deprecated_ip_error.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class DeprecatedIPError < GitHubPages::HealthCheck::Error + DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/" + + def message + <<-MSG + The custom domain for your GitHub Pages site is pointed at an outdated IP address. + You must update your site's DNS records if you'd like it to be available via your custom domain. + MSG + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_a_record_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_a_record_error.rb new file mode 100644 index 000000000000..3becf8867a54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_a_record_error.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class InvalidARecordError < GitHubPages::HealthCheck::Error + DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/" + + def message + <<-MSG + Your site's DNS settings are using a custom subdomain, #{domain.host}, + that's set up as an A record. We recommend you change this to a CNAME + record pointing at #{username}.github.io. + MSG + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_aaaa_record_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_aaaa_record_error.rb new file mode 100644 index 000000000000..c9a8721ae444 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_aaaa_record_error.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class InvalidAAAARecordError < GitHubPages::HealthCheck::Error + DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/" + + def message + <<-MSG + Your site's DNS settings are using a custom subdomain, #{domain.host}, + that's set up with an AAAA record. GitHub Pages currently does not support + IPv6. + MSG + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_cname_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_cname_error.rb new file mode 100644 index 000000000000..e62c04caef31 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_cname_error.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class InvalidCNAMEError < GitHubPages::HealthCheck::Error + DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/" + + def message + <<-MSG + Your site's DNS settings are using a custom subdomain, #{domain.host}, + that's not set up with a correct CNAME record. We recommend you set this + CNAME record to point at #{username}.github.io. + MSG + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_dns_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_dns_error.rb new file mode 100644 index 000000000000..9fa9bc80e4c2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_dns_error.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class InvalidDNSError < GitHubPages::HealthCheck::Error + DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/" + + def message + "Domain's DNS record could not be retrieved" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_domain_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_domain_error.rb new file mode 100644 index 000000000000..c33cd25c80e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_domain_error.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class InvalidDomainError < GitHubPages::HealthCheck::Error + DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/" + + def message + "Domain is not a valid domain" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_repository_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_repository_error.rb new file mode 100644 index 000000000000..dc59fc5b9c17 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/invalid_repository_error.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class InvalidRepositoryError < GitHubPages::HealthCheck::Error + LOCAL_ONLY = true + def message + "Repository is not a valid repository" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/missing_access_token_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/missing_access_token_error.rb new file mode 100644 index 000000000000..47b5d028d6ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/missing_access_token_error.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class MissingAccessTokenError < GitHubPages::HealthCheck::Error + LOCAL_ONLY = true + def message + "Cannot retrieve repository information with a valid access token" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/not_served_by_pages_error.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/not_served_by_pages_error.rb new file mode 100644 index 000000000000..7b3c57cab85a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/errors/not_served_by_pages_error.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + module Errors + class NotServedByPagesError < GitHubPages::HealthCheck::Error + DOCUMENTATION_PATH = "/articles/setting-up-a-custom-domain-with-github-pages/" + + def message + "Domain does not resolve to the GitHub Pages server" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/printer.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/printer.rb new file mode 100644 index 000000000000..0004a8d0c787 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/printer.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + class Printer + PRETTY_LEFT_WIDTH = 11 + PRETTY_JOINER = " | " + + attr_reader :health_check + + def initialize(health_check) + @health_check = health_check + end + + def simple_string + require "yaml" + hash = health_check.to_hash + hash[:reason] = hash[:reason].to_s if hash[:reason] + hash.to_yaml.sub(/\A---\n/, "").gsub(/^:/, "") + end + + def pretty_print + values = health_check.to_hash + output = StringIO.new + + # Header + output.puts new_line "Domain", (values[:uri]).to_s + output.puts "-" * (PRETTY_LEFT_WIDTH + 1) + "|" + "-" * 50 + + output.puts new_line "DNS", "does not resolve" unless values[:dns_resolves?] + + # Valid? + output.write new_line "State", (values[:valid?] ? "valid" : "invalid").to_s + output.puts " - is #{"NOT " unless values[:served_by_pages?]}served by Pages" + + # What's wrong? + output.puts new_line "Reason", (values[:reason]).to_s unless values[:valid?] + + if values[:pointed_to_github_user_domain?] + output.puts new_line nil, "pointed to user domain" + end + + if values[:pointed_to_github_pages_ip?] + output.puts new_line nil, "pointed to pages IP" + end + + # DNS Record info + record_type = if values[:a_record?] + "A" + elsif values[:cname_record?] + "CNAME" + else + "other" + end + output.write new_line "Record Type", record_type + should_be = values[:should_be_a_record?] ? "A record" : "CNAME" + output.puts ", should be #{should_be}" + + ip_problems = [] + ip_problems << "not apex domain" unless values[:apex_domain?] + ip_problems << "invalid domain" unless values[:valid_domain?] + ip_problems << "old ip address used" if values[:old_ip_address?] + + ip_problems_string = !ip_problems.empty? ? ip_problems.join(", ") : "none" + output.puts new_line "IP Problems", ip_problems_string + + if values[:proxied?] + proxy = values[:cloudflare_ip?] ? "CloudFlare" : "unknown" + output.puts new_line "Proxied", "yes, through #{proxy}" + end + + output.puts new_line "Domain", "*.github.com/io domain" if values[:pages_domain?] + + output.string + end + + def new_line(left = nil, right = nil) + if left && right + ljust(left) + PRETTY_JOINER + right + elsif left + ljust(left) + elsif right + " " * (PRETTY_LEFT_WIDTH + PRETTY_JOINER.size) + right + end + end + + def ljust(line) + line.ljust(PRETTY_LEFT_WIDTH) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/redundant_check.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/redundant_check.rb new file mode 100644 index 000000000000..632850a7a6e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/redundant_check.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + class RedundantCheck + extend Forwardable + + TIMEOUT = 5 # seconds + + attr_reader :domain + + def initialize(domain) + @domain = domain + end + + def check + @check ||= (checks.find(&:valid?) || check_with_default_nameservers) + end + + def_delegator :check, :reason, :reason + def_delegator :check, :valid?, :valid? + + def https_eligible? + checks.any?(&:https_eligible?) + end + + private + + def checks + @checks ||= %i[default authoritative public].map do |ns| + GitHubPages::HealthCheck::Domain.new(domain, :nameservers => ns) + end + end + + def check_with_default_nameservers + @check_with_default_nameservers ||= checks.find { |c| c.nameservers == :default } + end + + def check_with_public_nameservers + @check_with_public_nameservers ||= checks.find { |c| c.nameservers == :public } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/repository.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/repository.rb new file mode 100644 index 000000000000..800a5c46b664 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/repository.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + class Repository < Checkable + attr_reader :name, :owner + + REPO_REGEX = %r{\A[a-z0-9_\-]+/[a-z0-9_\-\.]+\z}i.freeze + + HASH_METHODS = %i[ + name_with_owner built? last_built build_duration build_error + ].freeze + + def initialize(name_with_owner, access_token: nil) + unless name_with_owner.match(REPO_REGEX) + raise Errors::InvalidRepositoryError + end + + parts = name_with_owner.split("/") + @owner = parts.first + @name = parts.last + @access_token = access_token || ENV["OCTOKIT_ACCESS_TOKEN"] + end + + def name_with_owner + @name_with_owner ||= [owner, name].join("/") + end + alias nwo name_with_owner + + def check! + raise Errors::BuildError.new(:repository => self), build_error unless built? + + true + end + + def last_build + @last_build ||= client.latest_pages_build(name_with_owner) + end + + def built? + last_build && last_build.status == "built" + end + + def build_error + last_build.error["message"] unless built? + end + alias reason build_error + + def build_duration + last_build&.duration + end + + def last_built + last_build&.updated_at + end + + def domain + return if cname.nil? + + @domain ||= GitHubPages::HealthCheck::Domain.redundant(cname) + end + + private + + def client + raise Errors::MissingAccessTokenError if @access_token.nil? + + @client ||= Octokit::Client.new(:access_token => @access_token) + end + + def pages_info + @pages_info ||= client.pages(name_with_owner) + end + + def cname + pages_info.cname + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/resolver.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/resolver.rb new file mode 100644 index 000000000000..9d161d74f382 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/resolver.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + class Resolver + DEFAULT_RESOLVER_OPTIONS = { + :retry_times => 2, + :query_timeout => 5, + :dnssec => false, + :do_caching => false + }.freeze + PUBLIC_NAMESERVERS = %w( + 8.8.8.8 + 1.1.1.1 + ).freeze + + class << self + def default_resolver + @default_resolver ||= Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS) + end + end + + attr_reader :domain, :nameservers + + # Create a new resolver. + # + # domain - the domain we're getting answers for + # nameserver - (optional) a case + def initialize(domain, nameservers: :default) + @domain = domain + @nameservers = nameservers + end + + def query(type) + resolver.query(Addressable::IDNA.to_ascii(domain), type).answer + end + + private + + def resolver + @resolver ||= case nameservers + when :default + self.class.default_resolver + when :authoritative + Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge( + :nameservers => authoritative_nameservers + )) + when :public + Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge( + :nameservers => PUBLIC_NAMESERVERS + )) + when Array + Dnsruby::Resolver.new(DEFAULT_RESOLVER_OPTIONS.merge( + :nameservers => nameservers + )) + else + raise "Invalid nameserver type: #{nameservers.inspect}" + end + end + + def authoritative_nameservers + @authoritative_nameservers ||= begin + self.class.default_resolver.query(domain, Dnsruby::Types::NS).answer.map do |rr| + next rr.nsdname.to_s if rr.type == Dnsruby::Types::NS + end.compact + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/site.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/site.rb new file mode 100644 index 000000000000..95e969101e31 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/site.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + class Site < Checkable + attr_reader :repository, :domain + + def initialize(repository_or_domain, access_token: nil) + @repository = Repository.new(repository_or_domain, :access_token => access_token) + @domain = @repository.domain + rescue GitHubPages::HealthCheck::Errors::InvalidRepositoryError + @repository = nil + @domain = Domain.redundant(repository_or_domain) + end + + def check! + [domain, repository].compact.each(&:check!) + true + end + + def to_hash + hash = (domain || {}).to_hash.dup + hash = hash.merge(repository.to_hash) unless repository.nil? + hash[:valid?] = valid? + hash[:reason] = reason + hash + end + alias to_h to_hash + alias as_json to_hash + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/version.rb b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/version.rb new file mode 100644 index 000000000000..f36a974f3781 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/lib/github-pages-health-check/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module GitHubPages + module HealthCheck + VERSION = "1.17.0" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/bootstrap new file mode 100644 index 000000000000..654265ea24eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/bootstrap @@ -0,0 +1,5 @@ +#!/bin/sh + +set -ex + +bundle install diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/check b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/check new file mode 100644 index 000000000000..2328b0a231e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/check @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true +# +# Usage: script/check [DOMAIN] + +require_relative "../lib/github-pages-health-check" + +if ARGV.count != 1 + puts "Usage: script/check [DOMAIN]" + exit 1 +end + +puts GitHubPages::HealthCheck.check(ARGV[0]) diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/check-cdn-ips b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/check-cdn-ips new file mode 100644 index 000000000000..8ded02354976 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/check-cdn-ips @@ -0,0 +1,20 @@ +#!/bin/bash -e + +script/update-cdn-ips >/dev/null 2>&1 +files=( cloudflare fastly) + +# `git diff --quiet` suppresses output and sets a return code +# 0 - no changes +# 1 - changes +for file in "${files[@]}" +do + if git diff -w --quiet --cached "config/$file-ips.txt" + then + echo "$file IP list is up-to-date." + else + echo git reset "config/$file-ips.txt" + git reset --quiet "config/$file-ips.txt" + echo "*** $file IP list is out of date! Run script/update-cdn-ips!" + exit 1 + fi +done diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/cibuild new file mode 100644 index 000000000000..78317608254d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/cibuild @@ -0,0 +1,11 @@ +#!/bin/sh + +set -ex + +script/bootstrap + +script/test $@ +script/check-cdn-ips +bundle exec script/check www.parkermoore.de | grep 'valid?: true' +bundle exec script/check ben.balter.com | grep 'valid?: true' +bundle exec gem build github-pages-health-check.gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/cibuild-docker b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/cibuild-docker new file mode 100644 index 000000000000..605b3ddd4f7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/cibuild-docker @@ -0,0 +1,11 @@ +#!/bin/bash + +: ${RUBY_VERSION:="2.7"} +docker build -t github-pages-health-check --build-arg RUBY_VERSION=$RUBY_VERSION . +if [ -n "$DEBUG" ]; then + # Run a shell. + docker run -it --rm -v $(pwd):/app/github-pages-health-check github-pages-health-check +else + # Run CI + docker run --rm github-pages-health-check script/cibuild --profile --fail-fast +fi diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/console b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/console new file mode 100644 index 000000000000..b2b30f9f961e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/console @@ -0,0 +1,5 @@ +#!/bin/sh + +set -ex + +bundle exec pry -r "./lib/github-pages-health-check" diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/fmt b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/fmt new file mode 100644 index 000000000000..fb13b6373f76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/fmt @@ -0,0 +1,5 @@ +#!/bin/bash +#/ Usage: script/fmt [args] +#/ Runs rubocop with the given arguments. + +bundle exec rubocop -D -S $@ diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/release b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/release new file mode 100644 index 000000000000..9e248ac14aa3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/release @@ -0,0 +1,42 @@ +#!/bin/sh +# Tag and push a release. + +set -e + +# Make sure we're in the project root. + +cd $(dirname "$0")/.. + +# Make sure the darn thing works + +bundle update + +# Build a new gem archive. + +rm -rf github-pages-health-check-*.gem +gem build -q github-pages-health-check.gemspec + +# Make sure we're on the master branch. + +(git branch | grep -q '* master') || { + echo "Only release from the master branch." + exit 1 +} + +# Figure out what version we're releasing. + +tag=v`ls github-pages-health-check-*.gem | sed 's/^github-pages-health-check-\(.*\)\.gem$/\1/'` + +# Make sure we haven't released this version before. + +git fetch -t origin + +(git tag -l | grep -q "$tag") && { + echo "Whoops, there's already a '${tag}' tag." + exit 1 +} + +# Tag it and bag it. + +gem push github-pages-health-check-*.gem && git tag "$tag" && + git push origin master && git push origin "$tag" diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/test b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/test new file mode 100644 index 000000000000..6eead4afc2d7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/test @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +bundle exec rspec $@ +script/fmt diff --git a/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/update-cdn-ips b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/update-cdn-ips new file mode 100644 index 000000000000..1cbfa00f54f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/github-pages-health-check-1.17.0/script/update-cdn-ips @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true +# +# Usage script/update-ips +# updates config/cloudflare-ips.txt and config/fastly-ips.txt + +require "open-uri" +require "json" + +SOURCES = { + :cloudflare => "https://www.cloudflare.com/ips-v4", + :fastly => "https://api.fastly.com/public-ip-list" +}.freeze + +SOURCES.each do |source, url| + file = "config/#{source}-ips.txt" + puts "Fetching #{url}..." + data = open(url).read + data = JSON.parse(data)["addresses"].join("\n") if source == :fastly + File.write(file, data) + `git add --verbose #{file}` +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/.github/FUNDING.yml b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/.github/FUNDING.yml new file mode 100644 index 000000000000..b9b6a92775f3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/.github/FUNDING.yml @@ -0,0 +1,4 @@ +github: gjtorikian +patreon: gjtorikian +open_collective: garen-torikian +issuehunt: gjtorikian diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/.gitignore new file mode 100644 index 000000000000..111f216b45a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/.gitignore @@ -0,0 +1,20 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +gemfiles/*.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp +exec/* +vendor/gems \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/.travis.yml new file mode 100644 index 000000000000..ff321ccdfc11 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/.travis.yml @@ -0,0 +1,43 @@ +language: ruby +cache: bundler +bundler_args: --path ../../vendor/bundle + +addons: + apt: + sources: + - libicu-dev + - kalakris-cmake + packages: + - cmake + +script: bundle exec rake + +gemfile: + - gemfiles/rails_6.gemfile + - gemfiles/rails_5.gemfile + - gemfiles/rails_4.gemfile + - gemfiles/rails_3.gemfile + +rvm: + - 2.4.6 + - 2.3.8 + - 2.5.7 + - ruby-head + +matrix: + fast_finish: true + allow_failures: + - rvm: ruby-head + exclude: + - gemfile: gemfiles/rails_6.gemfile + rvm: 2.4.6 + - gemfile: gemfiles/rails_6.gemfile + rvm: 2.3.8 + - gemfile: gemfiles/rails_4.gemfile + rvm: 2.5.7 + - gemfile: gemfiles/rails_4.gemfile + rvm: 2.4.6 + - gemfile: gemfiles/rails_3.gemfile + rvm: 2.5.7 + - gemfile: gemfiles/rails_3.gemfile + rvm: 2.4.6 diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/Appraisals b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/Appraisals new file mode 100644 index 000000000000..6037fd680c9f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/Appraisals @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +appraise 'rails-3' do + gem 'rack', '< 2' + gem 'rails', '3.2.22.2' +end + +appraise 'rails-4' do + gem 'rack', '< 2' + gem 'rails', '~> 4.2.6' +end + +appraise 'rails-5' do + gem 'rails', '~> 5.0.0' +end + +appraise 'rails-6' do + gem 'rails', '~> 6.0.0' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/CHANGELOG.md new file mode 100644 index 000000000000..50017db1edeb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/CHANGELOG.md @@ -0,0 +1,302 @@ +# CHANGELOG + +## 2.12.3 + + * Bug fix in `SyntaxHighlightFilter` [#325](https://github.com/jch/html-pipeline/pull/325) + +## 2.12.2 + + * Allow unsafe option for Custom Renderer of `MarkdownFilter` [#322](https://github.com/jch/html-pipeline/pull/322) + * Test with minitest-focus + +## 2.12.1 + + * Allow Custom Renderer for `MarkdownFilter` [#318](https://github.com/jch/html-pipeline/pull/318) + * Test against more Rails versions + +## 2.12.0 + + * Team mention filter [#314](https://github.com/jch/html-pipeline/pull/314) + +## 2.11.1 + + * Avoid YARD warning: Unknown tag @mention [#309](https://github.com/jch/html-pipeline/pull/309) + * Freeze string literals in Ruby 2.3 and beyond [#313](https://github.com/jch/html-pipeline/pull/313) + +## 2.11.0 + + * Test against Ruby 2.4 [#310](https://github.com/jch/html-pipeline/pull/310) + * CamoFilter: use String#unpack to hexencode URLs [#256](https://github.com/jch/html-pipeline/pull/256) + +## 2.10.0 + + * Add XMPP URI [#307](https://github.com/jch/html-pipeline/pull/307) + * Stop testing against Ruby 2.2 + +## 2.9.2 + + * Whitelist various inline semantic/formatting tags [#306](https://github.com/jch/html-pipeline/pull/306) + +## 2.9.1 + + * Render irc and ircs URLs [#191](https://github.com/jch/html-pipeline/pull/191) + +## 2.9.0 + + * Fix one more missing freeze [#300](https://github.com/jch/html-pipeline/pull/300) + * Adds `UNSAFE` option to CommonMarker usage where needed [#304](https://github.com/jch/html-pipeline/pull/304) + +## 2.8.4 + + * Freeze all elements in HTML::Pipeline::SanitizationFilter [#299](https://github.com/jch/html-pipeline/pull/299) + +## 2.8.3 + + * Whitelist some accessibility properties [#298](https://github.com/jch/html-pipeline/pull/298) + +## 2.8.2 + + * Update ruby-sanitize (fixes CVE-2018-3740) + +## 2.8.1 + + * Fix XSS vulnerability on table of content generation [#296](https://github.com/jch/html-pipeline/pull/296) + +## 2.8.0 + + * Ensure `<pre>` nodes are not removed after syntax highlighting [#295](https://github.com/jch/html-pipeline/pull/295) + +## 2.7.2 + + * Apply mention filter & emoji filter on node text [#290](https://github.com/jch/html-pipeline/pull/290) + * Disable processing @mentions in `<script>` tag [#292](https://github.com/jch/html-pipeline/pull/292) + * Update dependencies [#291](https://github.com/jch/html-pipeline/pull/291) + +## 2.7.1 + + * Output underlying load error when wrapping [#284](https://github.com/jch/html-pipeline/pull/284) + +## 2.7.0 + + * Let users set the common marker extensions [#279](https://github.com/jch/html-pipeline/pull/279) + +## 2.6.0 + + * Switch from github-markdown to CommonMark [#274](https://github.com/jch/html-pipeline/pull/274) + * Fixed a few warnings + +## 2.5.0 + + * Ruby 2.4 support. Backwards compatible, but bumped minor version so projects can choose to lock at older version [#268](https://github.com/jch/html-pipeline/pull/268) + +## 2.4.2 + + * Make EmojiFilter generated img tag HTML attributes configurable [#258](https://github.com/jch/html-pipeline/pull/258) + +## 2.4.1 + + * Regression in EmailReplyPipeline: unfiltered content is being omitted [#253](https://github.com/jch/html-pipeline/pull/253) + +## 2.4.0 + + * Optionally filter email addresses [#247](https://github.com/jch/html-pipeline/pull/247) + +## 2.3.0 + + * Add option to pass in an anchor icon, instead of using octicons [#244](https://github.com/jch/html-pipeline/pull/244) + +## 2.2.4 + + * Use entire namespace so MissingDependencyError constant is resolved [#243](https://github.com/jch/html-pipeline/pull/243) + +## 2.2.3 + + * raise MissingDependencyError instead of aborting on missing dependency [#241](https://github.com/jch/html-pipeline/pull/241) + * Fix typo [#239](https://github.com/jch/html-pipeline/pull/239) + * Test against Ruby 2.3.0 on Travis CI [#238](https://github.com/jch/html-pipeline/pull/238) + * use travis containers [#237](https://github.com/jch/html-pipeline/pull/237) + +## 2.2.2 + + * Fix for calling mention_link_filter with only one argument [#230](https://github.com/jch/html-pipeline/pull/230) + * Add html-pipeline-linkify_github to 3rd Party Extensions in README [#228](https://github.com/jch/html-pipeline/pull/228) + +## 2.2.1 + + * Soften Nokogiri dependency to versions ">= 1.4" [#208](https://github.com/jch/html-pipeline/pull/208) + +## 2.2.0 + + * Only allow cite attribute on blockquote and restrict schemes [#223](https://github.com/jch/html-pipeline/pull/223) + +## 2.1.0 + + * Whitelist schemes for longdesc [#221](https://github.com/jch/html-pipeline/pull/221) + * Extract emoji image tag generation to own method [#195](https://github.com/jch/html-pipeline/pull/195) + * Update README.md [#211](https://github.com/jch/html-pipeline/pull/211) + * Add ImageFilter for image url to img tag conversion [#207](https://github.com/jch/html-pipeline/pull/207) + +## 2.0 + +**New** + + * Implement new EmojiFilter context option: ignored_ancestor_tags to accept more ignored tags. [#170](https://github.com/jch/html-pipeline/pull/170) @JuanitoFatas + * Add GitHub flavor Markdown Task List extension [#162](https://github.com/jch/html-pipeline/pull/162) @simeonwillbanks + * @mention allow for custom regex to identify usernames. [#157](https://github.com/jch/html-pipeline/pull/157) @brittballard + * EmojiFilter now requires gemoji ~> 2. [#159](https://github.com/jch/html-pipeline/pull/159) @jch + +**Changes** + + * Restrict nokogiri to >= 1.4, <= 1.6.5 [#176](https://github.com/jch/html-pipeline/pull/176) @simeonwillbanks + * MentionFilter#link_to_mentioned_user: Replace String introspection with Regexp match [#172](https://github.com/jch/html-pipeline/pull/172) @simeonwillbanks + * Whitelist summary and details element. [#171](https://github.com/jch/html-pipeline/pull/171) @JuanitoFatas + * Support ~login for MentionFilter. [#167](https://github.com/jch/html-pipeline/pull/167) @JuanitoFatas + * Revert "Search for text nodes on DocumentFragments without root tags" [#158](https://github.com/jch/html-pipeline/pull/158) @jch + * Drop support for ruby ree, 1.9.2, 1.9.3 [#156](https://github.com/jch/html-pipeline/pull/156) @jch + * Skip EmojiFilter in `<tt>` tags [#147](https://github.com/jch/html-pipeline/pull/147) @moskvax + * Use Linguist lexers [#153](https://github.com/jch/html-pipeline/pull/153) @pchaigno + * Constrain Active Support >= 2, < 5 [#180](https://github.com/jch/html-pipeline/pull/180) @jch + +## 1.11.0 + + * Search for text nodes on DocumentFragments without root tags #146 Razer6 + * Don't filter @mentions in `<style>` tags #145 jch + * Prefer `http_url` in HttpsFilter. `base_url` still works. #142 bkeepers + * Remove duplicate check in EmojiFilter #141 Razer6 + +## 1.10.0 + + * Anchor TOCFilter with id's instead of name's #140 bkeepers + * Add `details` to sanitization whitelist #139 tansaku + * Fix README spelling #137 Razer6 + * Remove ActiveSupport `try` dependency #132 simeonwillbanks + +## 1.9.0 + + * Generalize https filter with :base_url #124 #131 rymohr + * Clean up gemspec dependencies #130 mislav + * EmojiFilter compatibility with gemoji v2 #129 mislav + * Now using Minitest #126 simeonwillbanks + +## 1.8.0 + + * Add custom path support for EmojiFilter #122 bradly + * Reorganize README and add table of contents #118 simeonwillbanks + +## 1.7.0 + + * SanitizationFilter whitelists <s> and <strike> elements #120 charliesome + * ruby 2.1.1 support #119 simeonwillbanks + +## 1.6.0 + + * Doc update for syntax highlighting #108 simeonwillbanks + * Add missing dependency for EmailReplyFilter #110 foca + * Fix deprecation warning for Digest::Digest #103 chrishunt + +## 1.5.0 + + * More flexible whitelist configuration for SanitizationFilter #98 aroben + +## 1.4.0 + + * Fix CamoFilter double entity encoding. #101 josh + +## 1.3.0 + +1.2.0 didn't actually include the following changes. Yanked that release. + + * CamoFilter now camos https images. #96 josh + +## 1.1.0 + + * escape emoji filenames in urls #92 jayroh + +## 1.0.0 + +To upgrade to this release, you will need to include separate gems for each of +the filters. See [this section of the README](/README.md#dependencies) for +details. + + * filter dependencies are no longer included #80 from simeonwillbanks/simple-dependency-management + * Add link_attr option to Autolink filter #89 from excid3/master + * Add ActiveSupport back in as dependency for xml-mini #85 from mojavelinux/xml-mini + +## 0.3.1 + + * Guard against nil node replacement in SyntaxHighlightFilter #84 jbarnette + +## 0.3.0 + + * Add support for manually specified default language in SyntaxHighlightFilter #81 jbarnette + +## 0.2.1 + + * Moves ActiveSupport as a development dependency #79 + +## 0.2.0 + + * Fix README typo #74 tricknotes + * TableOfContentsFilter generates list of sections #75 simeonwillbanks + +## 0.1.0 + +I realized I wasn't properly following [semver](http://semver.org) for interface +changes and new features. Starting from this release, semver will be followed. + + * Whitelist table section elements in sanitization filter #55 mojavelinux + * Update readme typo #57 envygeeks + * TOC unicode characters and anchor names for Ruby > 1.9 #64 jakedouglas/non_english_anchors + * Add :skip_tags option for AutolinkFilter #65 pengwynn + * Fix CI dependency issues #67 jch + * Fix ignored test and add Ruby 2.0 to CI. #71, #72 tricknotes + +## 0.0.14 + + * Remove unused can_access_repo? method jch + +## 0.0.13 + + * Update icon class name (only affects TOC pipeline) cameronmcefee #52 + +## 0.0.12 + + * add additional payload information for instrumentation mtodd #46 + * generate and link to gem docs in README + +## 0.0.11 + + * add instrumentation support. readme cleanup mtodd #45 + +## 0.0.10 + + * add bin/html-pipeline util indirect #44 + * add result[:mentioned_usernames] for MentionFilter fachen #42 + +## 0.0.9 + + * bump escape_utils ~> 0.3, github-linguist ~> 2.6.2 brianmario #41 + * remove nokogiri monkey patch for ruby >= 1.9 defunkt #40 + +## 0.0.8 + + * raise LoadError instead of printing to stderr if linguist is missing. gjtorikian #36 + +## 0.0.7 + + * optionally require github-linguist chrislloyd #33 + +## 0.0.6 + + * don't mutate markdown strings: jakedouglas #32 + +## 0.0.5 + + * fix li xss vulnerability in sanitization filter: vmg #31 + * gemspec cleanup: nbibler #23, jbarnette #24 + * doc updates: jch #16, pborreli #17, wickedshimmy #18, benubois #19, blackerby #21 + * loosen gemoji dependency: josh #15 + +## 0.0.4 + + * initial public release diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/CONTRIBUTING.md b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/CONTRIBUTING.md new file mode 100644 index 000000000000..5f66206dd60f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/CONTRIBUTING.md @@ -0,0 +1,60 @@ +# Contributing + +Thanks for using and improving `HTML::Pipeline`! + +- [Submitting a New Issue](#submitting-a-new-issue) +- [Sending a Pull Request](#sending-a-pull-request) + +## Submitting a New Issue + +If there's an idea you'd like to propose, or a design change, feel free to file a new issue. + +If you have an implementation question or believe you've found a bug, please provide as many details as possible: + +- Input document +- Output HTML document +- the exact `HTML::Pipeline` code you are using +- output of the following from your project + +``` +ruby -v +bundle exec nokogiri -v +``` + +## Sending a Pull Request + +[Pull requests][pr] are always welcome! + +Check out [the project's issues list][issues] for ideas on what could be improved. + +Before sending, please add tests and ensure the test suite passes. + +### Running the Tests + +To run the full suite: + + `bundle exec rake` + +To run a specific test file: + + `bundle exec ruby -Itest test/html/pipeline_test.rb` + +To run a specific test: + + `bundle exec ruby -Itest test/html/pipeline/markdown_filter_test.rb -n test_disabling_gfm` + +To run the full suite with all [supported rubies][travisyaml] in bash: + +```bash +rubies=(ree-1.8.7-2011.03 1.9.2-p290 1.9.3-p429 2.0.0-p247) +for r in ${rubies[*]} +do + rbenv local $r # switch to your version manager of choice + bundle install + bundle exec rake +done +``` + +[issues]: https://github.com/jch/html-pipeline/issues +[pr]: https://help.github.com/articles/using-pull-requests +[travisyaml]: https://github.com/jch/html-pipeline/blob/master/.travis.yml diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/Gemfile new file mode 100644 index 000000000000..adc923bdf9f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/Gemfile @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +# Specify your gem's dependencies in html-pipeline.gemspec +gemspec + +group :development do + gem 'appraisal' + gem 'bundler' + gem 'rake' +end + +group :test do + gem 'commonmarker', '~> 0.16', require: false + gem 'email_reply_parser', '~> 0.5', require: false + gem 'gemoji', '~> 2.0', require: false + gem 'minitest' + gem 'RedCloth', '~> 4.2.9', require: false + gem 'rinku', '~> 1.7', require: false + gem 'sanitize', '~> 4.6', require: false + + gem 'escape_utils', '~> 1.0', require: false + gem 'rouge', '~> 3.1', require: false + gem 'minitest-focus', '~> 1.1' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/LICENSE b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/LICENSE new file mode 100644 index 000000000000..c972fc6b08a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012 GitHub Inc. and Jerry Cheung + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/README.md b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/README.md new file mode 100644 index 000000000000..cc1c63309318 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/README.md @@ -0,0 +1,369 @@ +# HTML::Pipeline [![Build Status](https://travis-ci.org/jch/html-pipeline.svg?branch=master)](https://travis-ci.org/jch/html-pipeline) + +HTML processing filters and utilities. This module includes a small +framework for defining DOM based content filters and applying them to user +provided content. + +[This project was started at GitHub](https://github.com/blog/1311-html-pipeline-chainable-content-filters). While GitHub still uses a similar design and pattern for rendering content, this gem should be considered standalone and independent from GitHub. + +- [Installation](#installation) +- [Usage](#usage) + - [Examples](#examples) +- [Filters](#filters) +- [Dependencies](#dependencies) +- [Documentation](#documentation) +- [Extending](#extending) + - [3rd Party Extensions](#3rd-party-extensions) +- [Instrumenting](#instrumenting) +- [Contributing](#contributing) + - [Contributors](#contributors) + - [Releasing A New Version](#releasing-a-new-version) + +## Installation + +Add this line to your application's Gemfile: + +```ruby +gem 'html-pipeline' +``` + +And then execute: + +```sh +$ bundle +``` + +Or install it yourself as: + +```sh +$ gem install html-pipeline +``` + +## Usage + +This library provides a handful of chainable HTML filters to transform user +content into markup. A filter takes an HTML string or +`Nokogiri::HTML::DocumentFragment`, optionally manipulates it, and then +outputs the result. + +For example, to transform Markdown source into Markdown HTML: + +```ruby +require 'html/pipeline' + +filter = HTML::Pipeline::MarkdownFilter.new("Hi **world**!") +filter.call +``` + +Filters can be combined into a pipeline which causes each filter to hand its +output to the next filter's input. So if you wanted to have content be +filtered through Markdown and be syntax highlighted, you can create the +following pipeline: + +```ruby +pipeline = HTML::Pipeline.new [ + HTML::Pipeline::MarkdownFilter, + HTML::Pipeline::SyntaxHighlightFilter +] +result = pipeline.call <<-CODE +This is *great*: + + some_code(:first) + +CODE +result[:output].to_s +``` + +Prints: + +```html +<p>This is <em>great</em>:</p> + +<pre><code>some_code(:first) +</code></pre> +``` + +To generate CSS for HTML formatted code, use the [Rouge CSS Theme](https://github.com/rouge-ruby/rouge#css-options) `#css` method. `rouge` is a dependency of the `SyntaxHighlightFilter`. + +Some filters take an optional **context** and/or **result** hash. These are +used to pass around arguments and metadata between filters in a pipeline. For +example, if you don't want to use GitHub formatted Markdown, you can pass an +option in the context hash: + +```ruby +filter = HTML::Pipeline::MarkdownFilter.new("Hi **world**!", :gfm => false) +filter.call +``` + +### Examples + +We define different pipelines for different parts of our app. Here are a few +paraphrased snippets to get you started: + +```ruby +# The context hash is how you pass options between different filters. +# See individual filter source for explanation of options. +context = { + :asset_root => "http://your-domain.com/where/your/images/live/icons", + :base_url => "http://your-domain.com" +} + +# Pipeline providing sanitization and image hijacking but no mention +# related features. +SimplePipeline = Pipeline.new [ + SanitizationFilter, + TableOfContentsFilter, # add 'name' anchors to all headers and generate toc list + CamoFilter, + ImageMaxWidthFilter, + SyntaxHighlightFilter, + EmojiFilter, + AutolinkFilter +], context + +# Pipeline used for user provided content on the web +MarkdownPipeline = Pipeline.new [ + MarkdownFilter, + SanitizationFilter, + CamoFilter, + ImageMaxWidthFilter, + HttpsFilter, + MentionFilter, + EmojiFilter, + SyntaxHighlightFilter +], context.merge(:gfm => true) # enable github formatted markdown + + +# Define a pipeline based on another pipeline's filters +NonGFMMarkdownPipeline = Pipeline.new(MarkdownPipeline.filters, + context.merge(:gfm => false)) + +# Pipelines aren't limited to the web. You can use them for email +# processing also. +HtmlEmailPipeline = Pipeline.new [ + PlainTextInputFilter, + ImageMaxWidthFilter +], {} + +# Just emoji. +EmojiPipeline = Pipeline.new [ + PlainTextInputFilter, + EmojiFilter +], context +``` + +## Filters + +* `MentionFilter` - replace `@user` mentions with links +* `TeamMentionFilter` - replace `@org/team` mentions with links +* `AbsoluteSourceFilter` - replace relative image urls with fully qualified versions +* `AutolinkFilter` - auto_linking urls in HTML +* `CamoFilter` - replace http image urls with [camo-fied](https://github.com/atmos/camo) https versions +* `EmailReplyFilter` - util filter for working with emails +* `EmojiFilter` - everyone loves [emoji](http://www.emoji-cheat-sheet.com/)! +* `HttpsFilter` - HTML Filter for replacing http github urls with https versions. +* `ImageMaxWidthFilter` - link to full size image for large images +* `MarkdownFilter` - convert markdown to html +* `PlainTextInputFilter` - html escape text and wrap the result in a div +* `SanitizationFilter` - whitelist sanitize user markup +* `SyntaxHighlightFilter` - code syntax highlighter +* `TextileFilter` - convert textile to html +* `TableOfContentsFilter` - anchor headings with name attributes and generate Table of Contents html unordered list linking headings + +## Dependencies + +Filter gem dependencies are not bundled; you must bundle the filter's gem +dependencies. The below list details filters with dependencies. For example, +`SyntaxHighlightFilter` uses [rouge](https://github.com/jneen/rouge) +to detect and highlight languages. For example, to use the `SyntaxHighlightFilter`, +add the following to your Gemfile: + +```ruby +gem 'rouge' +``` + +* `AutolinkFilter` - `rinku` +* `EmailReplyFilter` - `escape_utils`, `email_reply_parser` +* `EmojiFilter` - `gemoji` +* `MarkdownFilter` - `commonmarker` +* `PlainTextInputFilter` - `escape_utils` +* `SanitizationFilter` - `sanitize` +* `SyntaxHighlightFilter` - `rouge` +* `TableOfContentsFilter` - `escape_utils` +* `TextileFilter` - `RedCloth` + +_Note:_ See [Gemfile](/Gemfile) `:test` block for version requirements. + +## Documentation + +Full reference documentation can be [found here](http://rubydoc.info/gems/html-pipeline/frames). + +## Extending +To write a custom filter, you need a class with a `call` method that inherits +from `HTML::Pipeline::Filter`. + +For example this filter adds a base url to images that are root relative: + +```ruby +require 'uri' + +class RootRelativeFilter < HTML::Pipeline::Filter + + def call + doc.search("img").each do |img| + next if img['src'].nil? + src = img['src'].strip + if src.start_with? '/' + img["src"] = URI.join(context[:base_url], src).to_s + end + end + doc + end + +end +``` + +Now this filter can be used in a pipeline: + +```ruby +Pipeline.new [ RootRelativeFilter ], { :base_url => 'http://somehost.com' } +``` + +### 3rd Party Extensions + +If you have an idea for a filter, propose it as +[an issue](https://github.com/jch/html-pipeline/issues) first. This allows us discuss +whether the filter is a common enough use case to belong in this gem, or should be +built as an external gem. + +Here are some extensions people have built: + +* [html-pipeline-asciidoc_filter](https://github.com/asciidoctor/html-pipeline-asciidoc_filter) +* [jekyll-html-pipeline](https://github.com/gjtorikian/jekyll-html-pipeline) +* [nanoc-html-pipeline](https://github.com/burnto/nanoc-html-pipeline) +* [html-pipeline-bitly](https://github.com/dewski/html-pipeline-bitly) +* [html-pipeline-cite](https://github.com/lifted-studios/html-pipeline-cite) +* [tilt-html-pipeline](https://github.com/bradgessler/tilt-html-pipeline) +* [html-pipeline-wiki-link'](https://github.com/lifted-studios/html-pipeline-wiki-link) - WikiMedia-style wiki links +* [task_list](https://github.com/github/task_list) - GitHub flavor Markdown Task List +* [html-pipeline-nico_link](https://github.com/rutan/html-pipeline-nico_link) - An HTML::Pipeline filter for [niconico](http://www.nicovideo.jp) description links +* [html-pipeline-gitlab](https://gitlab.com/gitlab-org/html-pipeline-gitlab) - This gem implements various filters for html-pipeline used by GitLab +* [html-pipeline-youtube](https://github.com/st0012/html-pipeline-youtube) - An HTML::Pipeline filter for YouTube links +* [html-pipeline-flickr](https://github.com/st0012/html-pipeline-flickr) - An HTML::Pipeline filter for Flickr links +* [html-pipeline-vimeo](https://github.com/dlackty/html-pipeline-vimeo) - An HTML::Pipeline filter for Vimeo links +* [html-pipeline-hashtag](https://github.com/mr-dxdy/html-pipeline-hashtag) - An HTML::Pipeline filter for hashtags +* [html-pipeline-linkify_github](https://github.com/jollygoodcode/html-pipeline-linkify_github) - An HTML::Pipeline filter to autolink GitHub urls +* [html-pipeline-redcarpet_filter](https://github.com/bmikol/html-pipeline-redcarpet_filter) - Render Markdown source text into Markdown HTML using Redcarpet +* [html-pipeline-typogruby_filter](https://github.com/bmikol/html-pipeline-typogruby_filter) - Add Typogruby text filters to your HTML::Pipeline +* [korgi](https://github.com/jodeci/korgi) - HTML::Pipeline filters for links to Rails resources + + +## Instrumenting + +Filters and Pipelines can be set up to be instrumented when called. The pipeline +must be setup with an +[ActiveSupport::Notifications](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html) +compatible service object and a name. New pipeline objects will default to the +`HTML::Pipeline.default_instrumentation_service` object. + +``` ruby +# the AS::Notifications-compatible service object +service = ActiveSupport::Notifications + +# instrument a specific pipeline +pipeline = HTML::Pipeline.new [MarkdownFilter], context +pipeline.setup_instrumentation "MarkdownPipeline", service + +# or set default instrumentation service for all new pipelines +HTML::Pipeline.default_instrumentation_service = service +pipeline = HTML::Pipeline.new [MarkdownFilter], context +pipeline.setup_instrumentation "MarkdownPipeline" +``` + +Filters are instrumented when they are run through the pipeline. A +`call_filter.html_pipeline` event is published once the filter finishes. The +`payload` should include the `filter` name. Each filter will trigger its own +instrumentation call. + +``` ruby +service.subscribe "call_filter.html_pipeline" do |event, start, ending, transaction_id, payload| + payload[:pipeline] #=> "MarkdownPipeline", set with `setup_instrumentation` + payload[:filter] #=> "MarkdownFilter" + payload[:context] #=> context Hash + payload[:result] #=> instance of result class + payload[:result][:output] #=> output HTML String or Nokogiri::DocumentFragment +end +``` + +The full pipeline is also instrumented: + +``` ruby +service.subscribe "call_pipeline.html_pipeline" do |event, start, ending, transaction_id, payload| + payload[:pipeline] #=> "MarkdownPipeline", set with `setup_instrumentation` + payload[:filters] #=> ["MarkdownFilter"] + payload[:doc] #=> HTML String or Nokogiri::DocumentFragment + payload[:context] #=> context Hash + payload[:result] #=> instance of result class + payload[:result][:output] #=> output HTML String or Nokogiri::DocumentFragment +end +``` + +## FAQ + +### 1. Why doesn't my pipeline work when there's no root element in the document? + +To make a pipeline work on a plain text document, put the `PlainTextInputFilter` +at the beginning of your pipeline. This will wrap the content in a `div` so the +filters have a root element to work with. If you're passing in an HTML fragment, +but it doesn't have a root element, you can wrap the content in a `div` +yourself. For example: + +```ruby +EmojiPipeline = Pipeline.new [ + PlainTextInputFilter, # <- Wraps input in a div and escapes html tags + EmojiFilter +], context + +plain_text = "Gutentag! :wave:" +EmojiPipeline.call(plain_text) + +html_fragment = "This is outside of an html element, but <strong>this isn't. :+1:</strong>" +EmojiPipeline.call("<div>#{html_fragment}</div>") # <- Wrap your own html fragments to avoid escaping +``` + +### 2. How do I customize a whitelist for `SanitizationFilter`s? + +`SanitizationFilter::WHITELIST` is the default whitelist used if no `:whitelist` +argument is given in the context. The default is a good starting template for +you to add additional elements. You can either modify the constant's value, or +re-define your own constant and pass that in via the context. + +## Contributing + +Please review the [Contributing Guide](https://github.com/jch/html-pipeline/blob/master/CONTRIBUTING.md). + +1. [Fork it](https://help.github.com/articles/fork-a-repo) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Added some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new [Pull Request](https://help.github.com/articles/using-pull-requests) + +To see what has changed in recent versions, see the [CHANGELOG](https://github.com/jch/html-pipeline/blob/master/CHANGELOG.md). + +### Contributors + +Thanks to all of [these contributors](https://github.com/jch/html-pipeline/graphs/contributors). + +Project is a member of the [OSS Manifesto](http://ossmanifesto.org/). + +The current maintainer is @gjtorikian + +### Releasing A New Version + +This section is for gem maintainers to cut a new version of the gem. + +* create a new branch named `release-x.y.z` where `x.y.z` follows [semver](http://semver.org) +* update lib/html/pipeline/version.rb to next version number X.X.X +* update CHANGELOG.md. Prepare a draft with `script/changelog` +* push branch and create a new pull request +* after tests are green, merge to master +* on the master branch, run `script/release` diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/Rakefile new file mode 100644 index 000000000000..f26f9adcab1b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/Rakefile @@ -0,0 +1,17 @@ +#!/usr/bin/env rake +# frozen_string_literal: true + +require 'rubygems' +require 'bundler/setup' + +require 'bundler/gem_tasks' +require 'rake/testtask' + +Rake::TestTask.new do |t| + t.libs << 'test' + t.test_files = FileList['test/**/*_test.rb'] + t.verbose = true + t.warning = false +end + +task default: :test diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/bin/html-pipeline b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/bin/html-pipeline new file mode 100644 index 000000000000..f262ac6b59dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/bin/html-pipeline @@ -0,0 +1,78 @@ +#!/usr/bin/env ruby +require 'html/pipeline' + +require 'optparse' + +# Accept "help", too +.map! { |a| a == 'help' ? '--help' : a } + +onParser.new do |opts| + opts.banner = <<-HELP.gsub(/^ /, '') + Usage: html-pipeline [-h] [-f] + html-pipeline [FILTER [FILTER [...]]] < file.md + cat file.md | html-pipeline [FILTER [FILTER [...]]] + HELP + + opts.separator 'Options:' + + opts.on('-f', '--filters', 'List the available filters') do + filters = HTML::Pipeline.constants.grep(/\w+Filter$/) + .map { |f| f.to_s.gsub(/Filter$/, '') } + + # Text filter doesn't work, no call method + filters -= ['Text'] + + abort <<-HELP.gsub(/^ /, '') + Available filters: + #{filters.join("\n ")} + HELP + end +end.parse! + +# Default to a GitHub-ish pipeline +if ARGV.empty? + + filters = [ + HTML::Pipeline::MarkdownFilter, + HTML::Pipeline::SanitizationFilter, + HTML::Pipeline::ImageMaxWidthFilter, + HTML::Pipeline::EmojiFilter, + HTML::Pipeline::AutolinkFilter, + HTML::Pipeline::TableOfContentsFilter + ] + + # Add syntax highlighting if rouge is present + begin + require 'rouge' + filters << HTML::Pipeline::SyntaxHighlightFilter + rescue LoadError + end + +else + + def filter_named(name) + case name + when 'Text' + raise NameError # Text filter doesn't work, no call method + end + + HTML::Pipeline.const_get("#{name}Filter") + rescue NameError => e + abort "Unknown filter '#{name}'. List filters with the -f option." + end + + filters = [] + until ARGV.empty? + name = ARGV.shift + filters << filter_named(name) + end + +end + +context = { + asset_root: '/assets', + base_url: '/', + gfm: true +} + +puts HTML::Pipeline.new(filters, context).call(ARGF.read)[:output] diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/html-pipeline.gemspec b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/html-pipeline.gemspec new file mode 100644 index 000000000000..ec88cfe2680a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/html-pipeline.gemspec @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require File.expand_path('../lib/html/pipeline/version', __FILE__) + +Gem::Specification.new do |gem| + gem.name = 'html-pipeline' + gem.version = HTML::Pipeline::VERSION + gem.license = 'MIT' + gem.authors = ['Ryan Tomayko', 'Jerry Cheung', 'Garen J. Torikian'] + gem.email = ['ryan@github.com', 'jerry@github.com', 'gjtorikian@gmail.com'] + gem.description = 'GitHub HTML processing filters and utilities' + gem.summary = 'Helpers for processing content through a chain of filters' + gem.homepage = 'https://github.com/jch/html-pipeline' + + gem.files = `git ls-files -z`.split("\x0").reject { |f| f =~ %r{^(test|gemfiles|script)/} } + gem.require_paths = ['lib'] + + gem.add_dependency 'activesupport', '>= 2' + gem.add_dependency 'nokogiri', '>= 1.4' + + gem.post_install_message = <<msg +------------------------------------------------- +Thank you for installing html-pipeline! +You must bundle Filter gem dependencies. +See html-pipeline README.md for more details. +https://github.com/jch/html-pipeline#dependencies +------------------------------------------------- +msg +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline.rb new file mode 100644 index 000000000000..8f5cf8db216a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline.rb @@ -0,0 +1,210 @@ +# frozen_string_literal: true + +require 'nokogiri' +require 'active_support/xml_mini/nokogiri' # convert Documents to hashes + +module HTML + # GitHub HTML processing filters and utilities. This module includes a small + # framework for defining DOM based content filters and applying them to user + # provided content. + # + # See HTML::Pipeline::Filter for information on building filters. + # + # Construct a Pipeline for running multiple HTML filters. A pipeline is created once + # with one to many filters, and it then can be `call`ed many times over the course + # of its lifetime with input. + # + # filters - Array of Filter objects. Each must respond to call(doc, + # context) and return the modified DocumentFragment or a + # String containing HTML markup. Filters are performed in the + # order provided. + # default_context - The default context hash. Values specified here will be merged + # into values from the each individual pipeline run. Can NOT be + # nil. Default: empty Hash. + # result_class - The default Class of the result object for individual + # calls. Default: Hash. Protip: Pass in a Struct to get + # some semblance of type safety. + class Pipeline + autoload :VERSION, 'html/pipeline/version' + autoload :Filter, 'html/pipeline/filter' + autoload :AbsoluteSourceFilter, 'html/pipeline/absolute_source_filter' + autoload :BodyContent, 'html/pipeline/body_content' + autoload :AutolinkFilter, 'html/pipeline/autolink_filter' + autoload :CamoFilter, 'html/pipeline/camo_filter' + autoload :EmailReplyFilter, 'html/pipeline/email_reply_filter' + autoload :EmojiFilter, 'html/pipeline/emoji_filter' + autoload :HttpsFilter, 'html/pipeline/https_filter' + autoload :ImageFilter, 'html/pipeline/image_filter' + autoload :ImageMaxWidthFilter, 'html/pipeline/image_max_width_filter' + autoload :MarkdownFilter, 'html/pipeline/markdown_filter' + autoload :MentionFilter, 'html/pipeline/@mention_filter' + autoload :TeamMentionFilter, 'html/pipeline/@team_mention_filter' + autoload :PlainTextInputFilter, 'html/pipeline/plain_text_input_filter' + autoload :SanitizationFilter, 'html/pipeline/sanitization_filter' + autoload :SyntaxHighlightFilter, 'html/pipeline/syntax_highlight_filter' + autoload :TextileFilter, 'html/pipeline/textile_filter' + autoload :TableOfContentsFilter, 'html/pipeline/toc_filter' + autoload :TextFilter, 'html/pipeline/text_filter' + + class MissingDependencyError < RuntimeError; end + def self.require_dependency(name, requirer) + require name + rescue LoadError => e + raise MissingDependencyError, + "Missing dependency '#{name}' for #{requirer}. See README.md for details.\n#{e.class.name}: #{e}" + end + + # Our DOM implementation. + DocumentFragment = Nokogiri::HTML::DocumentFragment + + # Parse a String into a DocumentFragment object. When a DocumentFragment is + # provided, return it verbatim. + def self.parse(document_or_html) + document_or_html ||= '' + if document_or_html.is_a?(String) + DocumentFragment.parse(document_or_html) + else + document_or_html + end + end + + # Public: Returns an Array of Filter objects for this Pipeline. + attr_reader :filters + + # Public: Instrumentation service for the pipeline. + # Set an ActiveSupport::Notifications compatible object to enable. + attr_accessor :instrumentation_service + + # Public: String name for this Pipeline. Defaults to Class name. + attr_writer :instrumentation_name + def instrumentation_name + return @instrumentation_name if defined?(@instrumentation_name) + @instrumentation_name = self.class.name + end + + class << self + # Public: Default instrumentation service for new pipeline objects. + attr_accessor :default_instrumentation_service + end + + def initialize(filters, default_context = {}, result_class = nil) + raise ArgumentError, 'default_context cannot be nil' if default_context.nil? + @filters = filters.flatten.freeze + @default_context = default_context.freeze + @result_class = result_class || Hash + @instrumentation_service = self.class.default_instrumentation_service + end + + # Apply all filters in the pipeline to the given HTML. + # + # html - A String containing HTML or a DocumentFragment object. + # context - The context hash passed to each filter. See the Filter docs + # for more info on possible values. This object MUST NOT be modified + # in place by filters. Use the Result for passing state back. + # result - The result Hash passed to each filter for modification. This + # is where Filters store extracted information from the content. + # + # Returns the result Hash after being filtered by this Pipeline. Contains an + # :output key with the DocumentFragment or String HTML markup based on the + # output of the last filter in the pipeline. + def call(html, context = {}, result = nil) + context = @default_context.merge(context) + context = context.freeze + result ||= @result_class.new + payload = default_payload filters: @filters.map(&:name), + context: context, result: result + instrument 'call_pipeline.html_pipeline', payload do + result[:output] = + @filters.inject(html) do |doc, filter| + perform_filter(filter, doc, context, result) + end + end + result + end + + # Internal: Applies a specific filter to the supplied doc. + # + # The filter is instrumented. + # + # Returns the result of the filter. + def perform_filter(filter, doc, context, result) + payload = default_payload filter: filter.name, + context: context, result: result + instrument 'call_filter.html_pipeline', payload do + filter.call(doc, context, result) + end + end + + # Like call but guarantee the value returned is a DocumentFragment. + # Pipelines may return a DocumentFragment or a String. Callers that need a + # DocumentFragment should use this method. + def to_document(input, context = {}, result = nil) + result = call(input, context, result) + HTML::Pipeline.parse(result[:output]) + end + + # Like call but guarantee the value returned is a string of HTML markup. + def to_html(input, context = {}, result = nil) + result = call(input, context, result = nil) + output = result[:output] + if output.respond_to?(:to_html) + output.to_html + else + output.to_s + end + end + + # Public: setup instrumentation for this pipeline. + # + # Returns nothing. + def setup_instrumentation(name = nil, service = nil) + self.instrumentation_name = name + self.instrumentation_service = + service || self.class.default_instrumentation_service + end + + # Internal: if the `instrumentation_service` object is set, instruments the + # block, otherwise the block is ran without instrumentation. + # + # Returns the result of the provided block. + def instrument(event, payload = nil) + payload ||= default_payload + return yield(payload) unless instrumentation_service + instrumentation_service.instrument event, payload do |payload| + yield payload + end + end + + # Internal: Default payload for instrumentation. + # + # Accepts a Hash of additional payload data to be merged. + # + # Returns a Hash. + def default_payload(payload = {}) + { pipeline: instrumentation_name }.merge(payload) + end + end +end + +# XXX nokogiri monkey patches for 1.8 +unless ''.respond_to?(:force_encoding) + class Nokogiri::XML::Node + # Work around an issue with utf-8 encoded data being erroneously converted to + # ... some other shit when replacing text nodes. See 'utf-8 output 2' in + # user_content_test.rb for details. + def replace_with_encoding_fix(replacement) + if replacement.respond_to?(:to_str) + replacement = document.fragment("<div>#{replacement}</div>").children.first.children + end + replace_without_encoding_fix(replacement) + end + + alias replace_without_encoding_fix replace + alias replace replace_with_encoding_fix + + def swap(replacement) + replace(replacement) + self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/@mention_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/@mention_filter.rb new file mode 100644 index 000000000000..415a78c7db05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/@mention_filter.rb @@ -0,0 +1,140 @@ +# frozen_string_literal: true + +require 'set' + +module HTML + class Pipeline + # HTML filter that replaces @user mentions with links. Mentions within <pre>, + # <code>, and <a> elements are ignored. Mentions that reference users that do + # not exist are ignored. + # + # Context options: + # :base_url - Used to construct links to user profile pages for each + # mention. + # :info_url - Used to link to "more info" when someone mentions @mention + # or @mentioned. + # :username_pattern - Used to provide a custom regular expression to + # identify usernames + # + class MentionFilter < Filter + # Public: Find user @mentions in text. See + # MentionFilter#mention_link_filter. + # + # MentionFilter.mentioned_logins_in(text) do |match, login, is_mentioned| + # "<a href=...>#{login}</a>" + # end + # + # text - String text to search. + # + # Yields the String match, the String login name, and a Boolean determining + # if the match = "@mention[ed]". The yield's return replaces the match in + # the original text. + # + # Returns a String replaced with the return of the block. + def self.mentioned_logins_in(text, username_pattern = UsernamePattern) + text.gsub MentionPatterns[username_pattern] do |match| + login = Regexp.last_match(1) + yield match, login, MentionLogins.include?(login.downcase) + end + end + + # Hash that contains all of the mention patterns used by the pipeline + MentionPatterns = Hash.new do |hash, key| + hash[key] = / + (?:^|\W) # beginning of string or non-word char + @((?>#{key})) # @username + (?!\/) # without a trailing slash + (?= + \.+[ \t\W]| # dots followed by space or non-word character + \.+$| # dots at end of line + [^0-9a-zA-Z_.]| # non-word character except dot + $ # end of line + ) + /ix + end + + # Default pattern used to extract usernames from text. The value can be + # overriden by providing the username_pattern variable in the context. + UsernamePattern = /[a-z0-9][a-z0-9-]*/ + + # List of username logins that, when mentioned, link to the blog post + # about @mentions instead of triggering a real mention. + MentionLogins = %w[ + mention + mentions + mentioned + mentioning + ].freeze + + # Don't look for mentions in text nodes that are children of these elements + IGNORE_PARENTS = %w(pre code a style script).to_set + + def call + result[:mentioned_usernames] ||= [] + + doc.search('.//text()').each do |node| + content = node.to_html + next unless content.include?('@') + next if has_ancestor?(node, IGNORE_PARENTS) + html = mention_link_filter(content, base_url, info_url, username_pattern) + next if html == content + node.replace(html) + end + doc + end + + # The URL to provide when someone @mentions a "mention" name, such + # as @mention or @mentioned, that will give them more info on mentions. + def info_url + context[:info_url] || nil + end + + def username_pattern + context[:username_pattern] || UsernamePattern + end + + # Replace user @mentions in text with links to the mentioned user's + # profile page. + # + # text - String text to replace @mention usernames in. + # base_url - The base URL used to construct user profile URLs. + # info_url - The "more info" URL used to link to more info on @mentions. + # If nil we don't link @mention or @mentioned. + # username_pattern - Regular expression used to identify usernames in + # text + # + # Returns a string with @mentions replaced with links. All links have a + # 'user-mention' class name attached for styling. + def mention_link_filter(text, _base_url = '/', info_url = nil, username_pattern = UsernamePattern) + self.class.mentioned_logins_in(text, username_pattern) do |match, login, is_mentioned| + link = + if is_mentioned + link_to_mention_info(login, info_url) + else + link_to_mentioned_user(login) + end + + link ? match.sub("@#{login}", link) : match + end + end + + def link_to_mention_info(text, info_url = nil) + return "@#{text}" if info_url.nil? + "<a href='#{info_url}' class='user-mention'>" \ + "@#{text}" \ + '</a>' + end + + def link_to_mentioned_user(login) + result[:mentioned_usernames] |= [login] + + url = base_url.dup + url << '/' unless url =~ /[\/~]\z/ + + "<a href='#{url << login}' class='user-mention'>" \ + "@#{login}" \ + '</a>' + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/@team_mention_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/@team_mention_filter.rb new file mode 100644 index 000000000000..562ef3444f2c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/@team_mention_filter.rb @@ -0,0 +1,99 @@ +# frozen_string_literal: true + +require 'set' + +module HTML + class Pipeline + # HTML filter that replaces @org/team mentions with links. Mentions within + # <pre>, <code>, <a>, <style>, and <script> elements are ignored. + # + # Context options: + # :base_url - Used to construct links to team profile pages for each + # mention. + # :team_pattern - Used to provide a custom regular expression to + # identify team names + # + class TeamMentionFilter < Filter + # Public: Find @org/team mentions in text. See + # TeamMentionFilter#team_mention_link_filter. + # + # TeamMentionFilter.mentioned_teams_in(text) do |match, org, team| + # "<a href=...>#{team}</a>" + # end + # + # text - String text to search. + # + # Yields the String match, org name, and team name. The yield's + # return replaces the match in the original text. + # + # Returns a String replaced with the return of the block. + def self.mentioned_teams_in(text, team_pattern = TeamPattern) + text.gsub team_pattern do |match| + org = $1 + team = $2 + yield match, org, team + end + end + + # Default pattern used to extract team names from text. The value can be + # overridden by providing the team_pattern variable in the context. To + # properly link the mention, should be in the format of /@(1)\/(2)/. + TeamPattern = / + (?<=^|\W) # beginning of string or non-word char + @([a-z0-9][a-z0-9-]*) # @organization + \/ # dividing slash + ([a-z0-9][a-z0-9\-_]*) # team + \b + /ix + + # Don't look for mentions in text nodes that are children of these elements + IGNORE_PARENTS = %w[pre code a style script].to_set + + def call + result[:mentioned_teams] ||= [] + + doc.search('.//text()').each do |node| + content = node.to_html + next unless content.include?('@') + next if has_ancestor?(node, IGNORE_PARENTS) + html = mention_link_filter(content, base_url, team_pattern) + next if html == content + node.replace(html) + end + doc + end + + def team_pattern + context[:team_pattern] || TeamPattern + end + + # Replace @org/team mentions in text with links to the mentioned team's + # page. + # + # text - String text to replace @mention team names in. + # base_url - The base URL used to construct team page URLs. + # team_pattern - Regular expression used to identify teams in text + # + # Returns a string with @team mentions replaced with links. All links have a + # 'team-mention' class name attached for styling. + def mention_link_filter(text, _base_url = '/', team_pattern = TeamPattern) + self.class.mentioned_teams_in(text, team_pattern) do |match, org, team| + link = link_to_mentioned_team(org, team) + + link ? match.sub("@#{org}/#{team}", link) : match + end + end + + def link_to_mentioned_team(org, team) + result[:mentioned_teams] |= [team] + + url = base_url.dup + url << '/' unless url =~ /[\/~]\z/ + + "<a href='#{url << org}/#{team}' class='team-mention'>" \ + "@#{org}/#{team}" \ + '</a>' + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/absolute_source_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/absolute_source_filter.rb new file mode 100644 index 000000000000..533491acfe43 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/absolute_source_filter.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'uri' + +module HTML + class Pipeline + class AbsoluteSourceFilter < Filter + # HTML Filter for replacing relative and root relative image URLs with + # fully qualified URLs + # + # This is useful if an image is root relative but should really be going + # through a cdn, or if the content for the page assumes the host is known + # i.e. scraped webpages and some RSS feeds. + # + # Context options: + # :image_base_url - Base URL for image host for root relative src. + # :image_subpage_url - For relative src. + # + # This filter does not write additional information to the context. + # This filter would need to be run before CamoFilter. + def call + doc.search('img').each do |element| + next if element['src'].nil? || element['src'].empty? + src = element['src'].strip + next if src.start_with? 'http' + base = if src.start_with? '/' + image_base_url + else + image_subpage_url + end + element['src'] = URI.join(base, src).to_s + end + doc + end + + # Private: the base url you want to use + def image_base_url + context[:image_base_url] || raise("Missing context :image_base_url for #{self.class.name}") + end + + # Private: the relative url you want to use + def image_subpage_url + context[:image_subpage_url] || raise("Missing context :image_subpage_url for #{self.class.name}") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/autolink_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/autolink_filter.rb new file mode 100644 index 000000000000..f2facdfdc98b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/autolink_filter.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +HTML::Pipeline.require_dependency('rinku', 'AutolinkFilter') + +module HTML + class Pipeline + # HTML Filter for auto_linking urls in HTML. + # + # Context options: + # :autolink - boolean whether to autolink urls + # :link_mode - :all, :urls or :email_addresses + # :link_attr - HTML attributes for the link that will be generated + # :skip_tags - HTML tags inside which autolinking will be skipped. + # See Rinku.skip_tags + # :flags - additional Rinku flags. See https://github.com/vmg/rinku + # + # This filter does not write additional information to the context. + class AutolinkFilter < Filter + def call + return html if context[:autolink] == false + + skip_tags = context[:skip_tags] + flags = 0 + flags |= context[:flags] if context[:flags] + + Rinku.auto_link(html, link_mode, context[:link_attr], skip_tags, flags) + end + + def link_mode + context[:link_mode] || :urls + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/body_content.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/body_content.rb new file mode 100644 index 000000000000..84f70f840768 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/body_content.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module HTML + class Pipeline + # Public: Runs a String of content through an HTML processing pipeline, + # providing easy access to a generated DocumentFragment. + class BodyContent + attr_reader :result + + # Public: Initialize a BodyContent. + # + # body - A String body. + # context - A Hash of context options for the filters. + # pipeline - A HTML::Pipeline object with one or more Filters. + def initialize(body, context, pipeline) + @body = body + @context = context + @pipeline = pipeline + end + + # Public: Gets the memoized result of the body content as it passed through + # the Pipeline. + # + # Returns a Hash, or something similar as defined by @pipeline.result_class. + def result + @result ||= @pipeline.call @body, @context + end + + # Public: Gets the updated body from the Pipeline result. + # + # Returns a String or DocumentFragment. + def output + @output ||= result[:output] + end + + # Public: Parses the output into a DocumentFragment. + # + # Returns a DocumentFragment. + def document + @document ||= HTML::Pipeline.parse output + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/camo_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/camo_filter.rb new file mode 100644 index 000000000000..378bd8b322a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/camo_filter.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +require 'openssl' +require 'uri' + +module HTML + class Pipeline + # HTML Filter for replacing http image URLs with camo versions. See: + # + # https://github.com/atmos/camo + # + # All images provided in user content should be run through this + # filter so that http image sources do not cause mixed-content warnings + # in browser clients. + # + # Context options: + # :asset_proxy (required) - Base URL for constructed asset proxy URLs. + # :asset_proxy_secret_key (required) - The shared secret used to encode URLs. + # :asset_proxy_whitelist - Array of host Strings or Regexps to skip + # src rewriting. + # + # This filter does not write additional information to the context. + class CamoFilter < Filter + # Hijacks images in the markup provided, replacing them with URLs that + # go through the github asset proxy. + def call + return doc unless asset_proxy_enabled? + + doc.search('img').each do |element| + original_src = element['src'] + next unless original_src + + begin + uri = URI.parse(original_src) + rescue Exception + next + end + + next if uri.host.nil? + next if asset_host_whitelisted?(uri.host) + + element['src'] = asset_proxy_url(original_src) + element['data-canonical-src'] = original_src + end + doc + end + + # Implementation of validate hook. + # Errors should raise exceptions or use an existing validator. + def validate + needs :asset_proxy, :asset_proxy_secret_key + end + + # The camouflaged URL for a given image URL. + def asset_proxy_url(url) + "#{asset_proxy_host}/#{asset_url_hash(url)}/#{hexencode(url)}" + end + + # Private: calculate the HMAC digest for a image source URL. + def asset_url_hash(url) + OpenSSL::HMAC.hexdigest('sha1', asset_proxy_secret_key, url) + end + + # Private: Return true if asset proxy filter should be enabled + def asset_proxy_enabled? + !context[:disable_asset_proxy] + end + + # Private: the host to use for generated asset proxied URLs. + def asset_proxy_host + context[:asset_proxy] + end + + def asset_proxy_secret_key + context[:asset_proxy_secret_key] + end + + def asset_proxy_whitelist + context[:asset_proxy_whitelist] || [] + end + + def asset_host_whitelisted?(host) + asset_proxy_whitelist.any? do |test| + test.is_a?(String) ? host == test : test.match(host) + end + end + + # Private: helper to hexencode a string. Each byte ends up encoded into + # two characters, zero padded value in the range [0-9a-f]. + def hexencode(str) + str.unpack('H*').first + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/email_reply_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/email_reply_filter.rb new file mode 100644 index 000000000000..fef61949d509 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/email_reply_filter.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +HTML::Pipeline.require_dependency('escape_utils', 'EmailReplyFilter') +HTML::Pipeline.require_dependency('email_reply_parser', 'EmailReplyFilter') + +module HTML + class Pipeline + # HTML Filter that converts email reply text into an HTML DocumentFragment. + # It must be used as the first filter in a pipeline. + # + # Context options: + # None + # + # This filter does not write any additional information to the context hash. + class EmailReplyFilter < TextFilter + include EscapeUtils + + EMAIL_HIDDEN_HEADER = %(<span class="email-hidden-toggle"><a href="#">&hellip;</a></span><div class="email-hidden-reply" style="display:none">).freeze + EMAIL_QUOTED_HEADER = %(<div class="email-quoted-reply">).freeze + EMAIL_SIGNATURE_HEADER = %(<div class="email-signature-reply">).freeze + EMAIL_FRAGMENT_HEADER = %(<div class="email-fragment">).freeze + EMAIL_HEADER_END = '</div>'.freeze + EMAIL_REGEX = /[^@\s.][^@\s]*@\[?[a-z0-9.-]+\]?/ + HIDDEN_EMAIL_PATTERN = '***@***.***'.freeze + + # Scans an email body to determine which bits are quoted and which should + # be hidden. EmailReplyParser is used to split the comment into an Array + # of quoted or unquoted Blocks. Now, we loop through them and attempt to + # add <div> tags around them so we can hide the hidden blocks, and style + # the quoted blocks differently. Since multiple blocks may be hidden, be + # sure to keep the "email-hidden-reply" <div>s around "email-quoted-reply" + # <div> tags. Call this on each comment of a visible thread in the order + # that they are displayed. Note: all comments are processed so we can + # maintain a Set of SHAs of paragraphs. Only plaintext comments skip the + # markdown step. + # + # Returns the email comment HTML as a String + def call + found_hidden = nil + paragraphs = EmailReplyParser.read(text.dup).fragments.map do |fragment| + pieces = [escape_html(fragment.to_s.strip).gsub(/^\s*(>|&gt;)/, '')] + if fragment.quoted? + if context[:hide_quoted_email_addresses] + pieces.map! do |piece| + piece.gsub(EMAIL_REGEX, HIDDEN_EMAIL_PATTERN) + end + end + pieces.unshift EMAIL_QUOTED_HEADER + pieces << EMAIL_HEADER_END + elsif fragment.signature? + pieces.unshift EMAIL_SIGNATURE_HEADER + pieces << EMAIL_HEADER_END + else + pieces.unshift EMAIL_FRAGMENT_HEADER + pieces << EMAIL_HEADER_END + end + if fragment.hidden? && !found_hidden + found_hidden = true + pieces.unshift EMAIL_HIDDEN_HEADER + end + pieces.join + end + paragraphs << EMAIL_HEADER_END if found_hidden + paragraphs.join("\n") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/emoji_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/emoji_filter.rb new file mode 100644 index 000000000000..d22bb479c645 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/emoji_filter.rb @@ -0,0 +1,127 @@ +# frozen_string_literal: true + +require 'cgi' +HTML::Pipeline.require_dependency('gemoji', 'EmojiFilter') + +module HTML + class Pipeline + # HTML filter that replaces :emoji: with images. + # + # Context: + # :asset_root (required) - base url to link to emoji sprite + # :asset_path (optional) - url path to link to emoji sprite. :file_name can be used as a placeholder for the sprite file name. If no asset_path is set "emoji/:file_name" is used. + # :ignored_ancestor_tags (optional) - Tags to stop the emojification. Node has matched ancestor HTML tags will not be emojified. Default to pre, code, and tt tags. Extra tags please pass in the form of array, e.g., %w(blockquote summary). + # :img_attrs (optional) - Attributes for generated img tag. E.g. Pass { "draggble" => true, "height" => nil } to set draggable attribute to "true" and clear height attribute of generated img tag. + class EmojiFilter < Filter + DEFAULT_IGNORED_ANCESTOR_TAGS = %w[pre code tt].freeze + + def call + doc.search('.//text()').each do |node| + content = node.text + next unless content.include?(':') + next if has_ancestor?(node, ignored_ancestor_tags) + html = emoji_image_filter(content) + next if html == content + node.replace(html) + end + doc + end + + # Implementation of validate hook. + # Errors should raise exceptions or use an existing validator. + def validate + needs :asset_root + end + + # Replace :emoji: with corresponding images. + # + # text - String text to replace :emoji: in. + # + # Returns a String with :emoji: replaced with images. + def emoji_image_filter(text) + text.gsub(emoji_pattern) do |_match| + emoji_image_tag(Regexp.last_match(1)) + end + end + + # The base url to link emoji sprites + # + # Raises ArgumentError if context option has not been provided. + # Returns the context's asset_root. + def asset_root + context[:asset_root] + end + + # The url path to link emoji sprites + # + # :file_name can be used in the asset_path as a placeholder for the sprite file name. If no asset_path is set in the context "emoji/:file_name" is used. + # Returns the context's asset_path or the default path if no context asset_path is given. + def asset_path(name) + if context[:asset_path] + context[:asset_path].gsub(':file_name', emoji_filename(name)) + else + File.join('emoji', emoji_filename(name)) + end + end + + private + + # Build an emoji image tag + def emoji_image_tag(name) + require 'active_support/core_ext/hash/indifferent_access' + html_attrs = + default_img_attrs(name) + .merge!((context[:img_attrs] || {}).with_indifferent_access) + .map { |attr, value| !value.nil? && %(#{attr}="#{value.respond_to?(:call) && value.call(name) || value}") } + .reject(&:blank?).join(' '.freeze) + + "<img #{html_attrs}>" + end + + # Default attributes for img tag + def default_img_attrs(name) + { + 'class' => 'emoji'.freeze, + 'title' => ":#{name}:", + 'alt' => ":#{name}:", + 'src' => emoji_url(name).to_s, + 'height' => '20'.freeze, + 'width' => '20'.freeze, + 'align' => 'absmiddle'.freeze + } + end + + def emoji_url(name) + File.join(asset_root, asset_path(name)) + end + + # Build a regexp that matches all valid :emoji: names. + def self.emoji_pattern + @emoji_pattern ||= /:(#{emoji_names.map { |name| Regexp.escape(name) }.join('|')}):/ + end + + def emoji_pattern + self.class.emoji_pattern + end + + def self.emoji_names + Emoji.all.map(&:aliases).flatten.sort + end + + def emoji_filename(name) + Emoji.find_by_alias(name).image_filename + end + + # Return ancestor tags to stop the emojification. + # + # @return [Array<String>] Ancestor tags. + def ignored_ancestor_tags + if context[:ignored_ancestor_tags] + DEFAULT_IGNORED_ANCESTOR_TAGS | context[:ignored_ancestor_tags] + else + DEFAULT_IGNORED_ANCESTOR_TAGS + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/filter.rb new file mode 100644 index 000000000000..d4c9d4c21f86 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/filter.rb @@ -0,0 +1,165 @@ +# frozen_string_literal: true + +module HTML + class Pipeline + # Base class for user content HTML filters. Each filter takes an + # HTML string or Nokogiri::HTML::DocumentFragment, performs + # modifications and/or writes information to the result hash. Filters must + # return a DocumentFragment (typically the same instance provided to the call + # method) or a String with HTML markup. + # + # Example filter that replaces all images with trollface: + # + # class FuuuFilter < HTML::Pipeline::Filter + # def call + # doc.search('img').each do |img| + # img['src'] = "http://paradoxdgn.com/junk/avatars/trollface.jpg" + # end + # end + # end + # + # The context Hash passes options to filters and should not be changed in + # place. A Result Hash allows filters to make extracted information + # available to the caller and is mutable. + # + # Common context options: + # :base_url - The site's base URL + # :repository - A Repository providing context for the HTML being processed + # + # Each filter may define additional options and output values. See the class + # docs for more info. + class Filter + class InvalidDocumentException < StandardError; end + + def initialize(doc, context = nil, result = nil) + if doc.is_a?(String) + @html = doc.to_str + @doc = nil + else + @doc = doc + @html = nil + end + @context = context || {} + @result = result || {} + validate + end + + # Public: Returns a simple Hash used to pass extra information into filters + # and also to allow filters to make extracted information available to the + # caller. + attr_reader :context + + # Public: Returns a Hash used to allow filters to pass back information + # to callers of the various Pipelines. This can be used for + # #mentioned_users, for example. + attr_reader :result + + # The Nokogiri::HTML::DocumentFragment to be manipulated. If the filter was + # provided a String, parse into a DocumentFragment the first time this + # method is called. + def doc + @doc ||= parse_html(html) + end + + # The String representation of the document. If a DocumentFragment was + # provided to the Filter, it is serialized into a String when this method is + # called. + def html + raise InvalidDocumentException if @html.nil? && @doc.nil? + @html || doc.to_html + end + + # The main filter entry point. The doc attribute is guaranteed to be a + # Nokogiri::HTML::DocumentFragment when invoked. Subclasses should modify + # this document in place or extract information and add it to the context + # hash. + def call + raise NotImplementedError + end + + # Make sure the context has everything we need. Noop: Subclasses can override. + def validate; end + + # The Repository object provided in the context hash, or nil when no + # :repository was specified. + # + # It's assumed that the repository context has already been checked + # for permissions + def repository + context[:repository] + end + + # The User object provided in the context hash, or nil when no user + # was specified + def current_user + context[:current_user] + end + + # The site's base URL provided in the context hash, or '/' when no + # base URL was specified. + def base_url + context[:base_url] || '/' + end + + # Ensure the passed argument is a DocumentFragment. When a string is + # provided, it is parsed and returned; otherwise, the DocumentFragment is + # returned unmodified. + def parse_html(html) + HTML::Pipeline.parse(html) + end + + # Helper method for filter subclasses used to determine if any of a node's + # ancestors have one of the tag names specified. + # + # node - The Node object to check. + # tags - An array of tag name strings to check. These should be downcase. + # + # Returns true when the node has a matching ancestor. + def has_ancestor?(node, tags) + while node = node.parent + break true if tags.include?(node.name.downcase) + end + end + + # Perform a filter on doc with the given context. + # + # Returns a HTML::Pipeline::DocumentFragment or a String containing HTML + # markup. + def self.call(doc, context = nil, result = nil) + new(doc, context, result).call + end + + # Like call but guarantees that a DocumentFragment is returned, even when + # the last filter returns a String. + def self.to_document(input, context = nil) + html = call(input, context) + HTML::Pipeline.parse(html) + end + + # Like call but guarantees that a string of HTML markup is returned. + def self.to_html(input, context = nil) + output = call(input, context) + if output.respond_to?(:to_html) + output.to_html + else + output.to_s + end + end + + # Validator for required context. This will check that anything passed in + # contexts exists in @contexts + # + # If any errors are found an ArgumentError will be raised with a + # message listing all the missing contexts and the filters that + # require them. + def needs(*keys) + missing = keys.reject { |key| context.include? key } + + if missing.any? + raise ArgumentError, + "Missing context keys for #{self.class.name}: #{missing.map(&:inspect).join ', '}" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/https_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/https_filter.rb new file mode 100644 index 000000000000..4196faa0e2f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/https_filter.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module HTML + class Pipeline + # HTML Filter for replacing http references to :http_url with https versions. + # Subdomain references are not rewritten. + # + # Context options: + # :http_url - The HTTP url to force HTTPS. Falls back to :base_url + class HttpsFilter < Filter + def call + doc.css(%(a[href^="#{http_url}"])).each do |element| + element['href'] = element['href'].sub(/^http:/, 'https:') + end + doc + end + + # HTTP url to replace. Falls back to :base_url + def http_url + context[:http_url] || context[:base_url] + end + + # Raise error if :http_url undefined + def validate + needs :http_url unless http_url + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/image_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/image_filter.rb new file mode 100644 index 000000000000..cd14d36355a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/image_filter.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module HTML + class Pipeline + # HTML Filter that converts image's url into <img> tag. + # For example, it will convert + # http://example.com/test.jpg + # into + # <img src="http://example.com/test.jpg" alt=""/>. + + class ImageFilter < TextFilter + def call + @text.gsub(/(https|http)?:\/\/.+\.(jpg|jpeg|bmp|gif|png)(\?\S+)?/i) do |match| + %(<img src="#{match}" alt=""/>) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/image_max_width_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/image_max_width_filter.rb new file mode 100644 index 000000000000..1af301d4603d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/image_max_width_filter.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module HTML + class Pipeline + # This filter rewrites image tags with a max-width inline style and also wraps + # the image in an <a> tag that causes the full size image to be opened in a + # new tab. + # + # The max-width inline styles are especially useful in HTML email which + # don't use a global stylesheets. + class ImageMaxWidthFilter < Filter + def call + doc.search('img').each do |element| + # Skip if there's already a style attribute. Not sure how this + # would happen but we can reconsider it in the future. + next if element['style'] + + # Bail out if src doesn't look like a valid http url. trying to avoid weird + # js injection via javascript: urls. + next if element['src'].to_s.strip =~ /\Ajavascript/i + + element['style'] = 'max-width:100%;' + + link_image element unless has_ancestor?(element, %w[a]) + end + + doc + end + + def link_image(element) + link = doc.document.create_element('a', href: element['src'], target: '_blank') + link.add_child(element.dup) + element.replace(link) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/markdown_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/markdown_filter.rb new file mode 100644 index 000000000000..0d836ae10773 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/markdown_filter.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +HTML::Pipeline.require_dependency('commonmarker', 'MarkdownFilter') + +module HTML + class Pipeline + # HTML Filter that converts Markdown text into HTML and converts into a + # DocumentFragment. This is different from most filters in that it can take a + # non-HTML as input. It must be used as the first filter in a pipeline. + # + # Context options: + # :gfm => false Disable GFM line-end processing + # :commonmarker_extensions => [ :table, :strikethrough, + # :tagfilter, :autolink ] Commonmarker extensions to include + # + # This filter does not write any additional information to the context hash. + class MarkdownFilter < TextFilter + DEFAULT_COMMONMARKER_EXTENSIONS = %i[table strikethrough tagfilter autolink].freeze + + def initialize(text, context = nil, result = nil) + super text, context, result + @text = @text.delete "\r" + end + + # Convert Markdown to HTML using the best available implementation + # and convert into a DocumentFragment. + def call + extensions = context.fetch( + :commonmarker_extensions, + DEFAULT_COMMONMARKER_EXTENSIONS + ) + html = if (renderer = context[:commonmarker_renderer]) + unless renderer < CommonMarker::HtmlRenderer + raise ArgumentError, "`commonmark_renderer` must be derived from `CommonMarker::HtmlRenderer`" + end + parse_options = :DEFAULT + parse_options = [:UNSAFE] if context[:unsafe] + + render_options = [:GITHUB_PRE_LANG] + render_options << :HARDBREAKS if context[:gfm] != false + render_options = [:UNSAFE] if context[:unsafe] + + doc = CommonMarker.render_doc(@text, parse_options, extensions) + renderer.new(options: render_options, extensions: extensions).render(doc) + else + options = [:GITHUB_PRE_LANG] + options << :HARDBREAKS if context[:gfm] != false + options << :UNSAFE if context[:unsafe] + CommonMarker.render_html(@text, options, extensions) + end + html.rstrip! + html + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/plain_text_input_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/plain_text_input_filter.rb new file mode 100644 index 000000000000..0f2f2493606f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/plain_text_input_filter.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +HTML::Pipeline.require_dependency('escape_utils', 'PlainTextInputFilter') + +module HTML + class Pipeline + # Simple filter for plain text input. HTML escapes the text input and wraps it + # in a div. + class PlainTextInputFilter < TextFilter + def call + "<div>#{EscapeUtils.escape_html(@text, false)}</div>" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/sanitization_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/sanitization_filter.rb new file mode 100644 index 000000000000..ee7c6ab4c099 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/sanitization_filter.rb @@ -0,0 +1,139 @@ +# frozen_string_literal: true + +HTML::Pipeline.require_dependency('sanitize', 'SanitizationFilter') + +module HTML + class Pipeline + # HTML filter with sanization routines and whitelists. This module defines + # what HTML is allowed in user provided content and fixes up issues with + # unbalanced tags and whatnot. + # + # See the Sanitize docs for more information on the underlying library: + # + # https://github.com/rgrove/sanitize/#readme + # + # Context options: + # :whitelist - The sanitizer whitelist configuration to use. This + # can be one of the options constants defined in this + # class or a custom sanitize options hash. + # :anchor_schemes - The URL schemes to allow in <a href> attributes. The + # default set is provided in the ANCHOR_SCHEMES + # constant in this class. If passed, this overrides any + # schemes specified in the whitelist configuration. + # + # This filter does not write additional information to the context. + class SanitizationFilter < Filter + LISTS = Set.new(%w[ul ol].freeze) + LIST_ITEM = 'li'.freeze + + # List of table child elements. These must be contained by a <table> element + # or they are not allowed through. Otherwise they can be used to break out + # of places we're using tables to contain formatted user content (like pull + # request review comments). + TABLE_ITEMS = Set.new(%w[tr td th].freeze) + TABLE = 'table'.freeze + TABLE_SECTIONS = Set.new(%w[thead tbody tfoot].freeze) + + # These schemes are the only ones allowed in <a href> attributes by default. + ANCHOR_SCHEMES = ['http', 'https', 'mailto', 'xmpp', :relative, 'github-windows', 'github-mac', 'irc', 'ircs'].freeze + + # The main sanitization whitelist. Only these elements and attributes are + # allowed through by default. + WHITELIST = { + elements: %w[ + h1 h2 h3 h4 h5 h6 h7 h8 br b i strong em a pre code img tt + div ins del sup sub p ol ul table thead tbody tfoot blockquote + dl dt dd kbd q samp var hr ruby rt rp li tr td th s strike summary + details caption figure figcaption + abbr bdo cite dfn mark small span time wbr + ].freeze, + remove_contents: ['script'].freeze, + attributes: { + 'a' => ['href'].freeze, + 'img' => %w[src longdesc].freeze, + 'div' => %w[itemscope itemtype].freeze, + 'blockquote' => ['cite'].freeze, + 'del' => ['cite'].freeze, + 'ins' => ['cite'].freeze, + 'q' => ['cite'].freeze, + all: %w[abbr accept accept-charset + accesskey action align alt + aria-describedby aria-hidden aria-label aria-labelledby + axis border cellpadding cellspacing char + charoff charset checked + clear cols colspan color + compact coords datetime dir + disabled enctype for frame + headers height hreflang + hspace ismap label lang + maxlength media method + multiple name nohref noshade + nowrap open prompt readonly rel rev + role rows rowspan rules scope + selected shape size span + start summary tabindex target + title type usemap valign value + vspace width itemprop].freeze + }.freeze, + protocols: { + 'a' => { 'href' => ANCHOR_SCHEMES }.freeze, + 'blockquote' => { 'cite' => ['http', 'https', :relative].freeze }, + 'del' => { 'cite' => ['http', 'https', :relative].freeze }, + 'ins' => { 'cite' => ['http', 'https', :relative].freeze }, + 'q' => { 'cite' => ['http', 'https', :relative].freeze }, + 'img' => { + 'src' => ['http', 'https', :relative].freeze, + 'longdesc' => ['http', 'https', :relative].freeze + }.freeze + }, + transformers: [ + # Top-level <li> elements are removed because they can break out of + # containing markup. + lambda { |env| + name = env[:node_name] + node = env[:node] + if name == LIST_ITEM && node.ancestors.none? { |n| LISTS.include?(n.name) } + node.replace(node.children) + end + }, + + # Table child elements that are not contained by a <table> are removed. + lambda { |env| + name = env[:node_name] + node = env[:node] + if (TABLE_SECTIONS.include?(name) || TABLE_ITEMS.include?(name)) && node.ancestors.none? { |n| n.name == TABLE } + node.replace(node.children) + end + } + ].freeze + }.freeze + + # A more limited sanitization whitelist. This includes all attributes, + # protocols, and transformers from WHITELIST but with a more locked down + # set of allowed elements. + LIMITED = WHITELIST.merge( + elements: %w[b i strong em a pre code img ins del sup sub mark abbr p ol ul li] + ) + + # Strip all HTML tags from the document. + FULL = { elements: [] }.freeze + + # Sanitize markup using the Sanitize library. + def call + Sanitize.clean_node!(doc, whitelist) + end + + # The whitelist to use when sanitizing. This can be passed in the context + # hash to the filter but defaults to WHITELIST constant value above. + def whitelist + whitelist = context[:whitelist] || WHITELIST + anchor_schemes = context[:anchor_schemes] + return whitelist unless anchor_schemes + whitelist = whitelist.dup + whitelist[:protocols] = (whitelist[:protocols] || {}).dup + whitelist[:protocols]['a'] = (whitelist[:protocols]['a'] || {}).merge('href' => anchor_schemes) + whitelist + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/syntax_highlight_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/syntax_highlight_filter.rb new file mode 100644 index 000000000000..5f695f8c7f55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/syntax_highlight_filter.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +HTML::Pipeline.require_dependency('rouge', 'SyntaxHighlightFilter') + +module HTML + class Pipeline + # HTML Filter that syntax highlights text inside code blocks. + # + # Context options: + # + # :highlight => String represents the language to pick lexer. Defaults to empty string. + # :scope => String represents the class attribute adds to pre element after. + # Defaults to "highlight highlight-css" if highlights a css code block. + # + # This filter does not write any additional information to the context hash. + class SyntaxHighlightFilter < Filter + def initialize(*args) + super(*args) + @formatter = Rouge::Formatters::HTML.new + end + + def call + doc.search('pre').each do |node| + default = context[:highlight] && context[:highlight].to_s + next unless lang = node['lang'] || default + next unless lexer = lexer_for(lang) + + text = node.inner_text + html = highlight_with_timeout_handling(text, lexer) + next if html.nil? + + node.inner_html = html + scope = context.fetch(:scope) { 'highlight' } + node['class'] = "#{scope} #{scope}-#{lang}" + end + doc + end + + def highlight_with_timeout_handling(text, lexer) + Rouge.highlight(text, lexer, @formatter) + rescue Timeout::Error => _ + nil + end + + def lexer_for(lang) + Rouge::Lexer.find(lang) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/text_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/text_filter.rb new file mode 100644 index 000000000000..13a8f0484a02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/text_filter.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module HTML + class Pipeline + class TextFilter < Filter + attr_reader :text + + def initialize(text, context = nil, result = nil) + raise TypeError, 'text cannot be HTML' if text.is_a?(DocumentFragment) + # Ensure that this is always a string + @text = text.respond_to?(:to_str) ? text.to_str : text.to_s + super nil, context, result + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/textile_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/textile_filter.rb new file mode 100644 index 000000000000..5b8fcd1dbca3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/textile_filter.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +HTML::Pipeline.require_dependency('redcloth', 'RedCloth') + +module HTML + class Pipeline + # HTML Filter that converts Textile text into HTML and converts into a + # DocumentFragment. This is different from most filters in that it can take a + # non-HTML as input. It must be used as the first filter in a pipeline. + # + # Context options: + # :autolink => false Disable autolinking URLs + # + # This filter does not write any additional information to the context hash. + # + # NOTE This filter is provided for really old comments only. It probably + # shouldn't be used for anything new. + class TextileFilter < TextFilter + # Convert Textile to HTML and convert into a DocumentFragment. + def call + RedCloth.new(@text).to_html + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/toc_filter.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/toc_filter.rb new file mode 100644 index 000000000000..6cc592c63b1c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/toc_filter.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +HTML::Pipeline.require_dependency('escape_utils', 'TableOfContentsFilter') + +module HTML + class Pipeline + # HTML filter that adds an 'id' attribute to all headers + # in a document, so they can be accessed from a table of contents. + # + # Generates the Table of Contents, with links to each header. + # + # Examples + # + # TocPipeline = + # HTML::Pipeline.new [ + # HTML::Pipeline::TableOfContentsFilter + # ] + # # => #<HTML::Pipeline:0x007fc13c4528d8...> + # orig = %(<h1>Ice cube</h1><p>is not for the pop chart</p>) + # # => "<h1>Ice cube</h1><p>is not for the pop chart</p>" + # result = {} + # # => {} + # TocPipeline.call(orig, {}, result) + # # => {:toc=> ...} + # result[:toc] + # # => "<ul class=\"section-nav\">\n<li><a href=\"#ice-cube\">...</li><ul>" + # result[:output].to_s + # # => "<h1>\n<a id=\"ice-cube\" class=\"anchor\" href=\"#ice-cube\">..." + class TableOfContentsFilter < Filter + PUNCTUATION_REGEXP = RUBY_VERSION > '1.9' ? /[^\p{Word}\- ]/u : /[^\w\- ]/ + + # The icon that will be placed next to an anchored rendered markdown header + def anchor_icon + context[:anchor_icon] || '<span aria-hidden="true" class="octicon octicon-link"></span>' + end + + def call + result[:toc] = String.new('') + + headers = Hash.new(0) + doc.css('h1, h2, h3, h4, h5, h6').each do |node| + text = node.text + id = ascii_downcase(text) + id.gsub!(PUNCTUATION_REGEXP, '') # remove punctuation + id.tr!(' ', '-') # replace spaces with dash + + uniq = headers[id] > 0 ? "-#{headers[id]}" : '' + headers[id] += 1 + if header_content = node.children.first + result[:toc] << %(<li><a href="##{id}#{uniq}">#{EscapeUtils.escape_html(text)}</a></li>\n) + header_content.add_previous_sibling(%(<a id="#{id}#{uniq}" class="anchor" href="##{id}#{uniq}" aria-hidden="true">#{anchor_icon}</a>)) + end + end + result[:toc] = %(<ul class="section-nav">\n#{result[:toc]}</ul>) unless result[:toc].empty? + doc + end + + if RUBY_VERSION >= '2.4' + def ascii_downcase(str) + str.downcase(:ascii) + end + else + def ascii_downcase(str) + str.downcase + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/version.rb b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/version.rb new file mode 100644 index 000000000000..94de5869334b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/html-pipeline-2.14.0/lib/html/pipeline/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module HTML + class Pipeline + VERSION = '2.14.0' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/.gitignore new file mode 100644 index 000000000000..d20f94b11483 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/.gitignore @@ -0,0 +1,11 @@ +tmp +*.bundle +*.gem +*.o +*.so +*.bundle +*.jar +*.swp +Makefile +tags +*.rbc diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/.gitmodules b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/.gitmodules new file mode 100644 index 000000000000..6c289a3e86c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/.gitmodules @@ -0,0 +1,6 @@ +[submodule "http-parser"] + path = ext/ruby_http_parser/vendor/http-parser + url = git://github.com/joyent/http-parser.git +[submodule "http-parser-java"] + path = ext/ruby_http_parser/vendor/http-parser-java + url = git://github.com/tmm1/http-parser.java diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/Gemfile new file mode 100644 index 000000000000..851fabc21ddb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/Gemfile.lock b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/Gemfile.lock new file mode 100644 index 000000000000..c880187f9b98 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/Gemfile.lock @@ -0,0 +1,39 @@ +PATH + remote: . + specs: + http_parser.rb (0.6.0.beta.2) + +GEM + remote: https://rubygems.org/ + specs: + benchmark_suite (0.8.0) + diff-lcs (1.1.2) + ffi (1.0.11) + ffi (1.0.11-java) + json (1.8.0) + json (1.8.0-java) + rake (0.9.2) + rake-compiler (0.7.9) + rake + rspec (2.4.0) + rspec-core (~> 2.4.0) + rspec-expectations (~> 2.4.0) + rspec-mocks (~> 2.4.0) + rspec-core (2.4.0) + rspec-expectations (2.4.0) + diff-lcs (~> 1.1.2) + rspec-mocks (2.4.0) + yajl-ruby (1.1.0) + +PLATFORMS + java + ruby + +DEPENDENCIES + benchmark_suite + ffi + http_parser.rb! + json (>= 1.4.6) + rake-compiler (>= 0.7.9) + rspec (>= 2.0.1) + yajl-ruby (>= 0.8.1) diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/LICENSE-MIT b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/LICENSE-MIT new file mode 100644 index 000000000000..35f0bf0de3e0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/LICENSE-MIT @@ -0,0 +1,20 @@ +Copyright 2009,2010 Marc-André Cournoyer <macournoyer@gmail.com> +Copyright 2010,2011 Aman Gupta <aman@tmm1.net> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/README.md b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/README.md new file mode 100644 index 000000000000..35dad451b61c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/README.md @@ -0,0 +1,90 @@ +# http_parser.rb + +A simple callback-based HTTP request/response parser for writing http +servers, clients and proxies. + +This gem is built on top of [joyent/http-parser](http://github.com/joyent/http-parser) and its java port [http-parser/http-parser.java](http://github.com/http-parser/http-parser.java). + +## Supported Platforms + +This gem aims to work on all major Ruby platforms, including: + +- MRI 1.8 and 1.9 +- Rubinius +- JRuby +- win32 + +## Usage + +```ruby +require "http/parser" + +parser = Http::Parser.new + +parser.on_headers_complete = proc do + p parser.http_version + + p parser.http_method # for requests + p parser.request_url + + p parser.status_code # for responses + + p parser.headers +end + +parser.on_body = proc do |chunk| + # One chunk of the body + p chunk +end + +parser.on_message_complete = proc do |env| + # Headers and body is all parsed + puts "Done!" +end +``` + +# Feed raw data from the socket to the parser +`parser << raw_data` + +## Advanced Usage + +### Accept callbacks on an object + +```ruby +module MyHttpConnection + def connection_completed + @parser = Http::Parser.new(self) + end + + def receive_data(data) + @parser << data + end + + def on_message_begin + @headers = nil + @body = '' + end + + def on_headers_complete(headers) + @headers = headers + end + + def on_body(chunk) + @body << chunk + end + + def on_message_complete + p [@headers, @body] + end +end +``` + +### Stop parsing after headers + +```ruby +parser = Http::Parser.new +parser.on_headers_complete = proc{ :stop } + +offset = parser << request_data +body = request_data[offset..-1] +``` diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/Rakefile new file mode 100644 index 000000000000..150f65268671 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/Rakefile @@ -0,0 +1,6 @@ +# load tasks +Dir['tasks/*.rake'].sort.each { |f| load f } + +# default task +task :compile => :submodules +task :default => [:compile, :spec] diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/bench/standalone.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/bench/standalone.rb new file mode 100644 index 000000000000..6b4dcb6f0b39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/bench/standalone.rb @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby +$:.unshift File.dirname(__FILE__) + "/../lib" +require "rubygems" +require "http/parser" +require "benchmark/ips" + +request = <<-REQUEST +GET / HTTP/1.1 +Host: www.example.com +Connection: keep-alive +User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.78 S +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Accept-Encoding: gzip,deflate,sdch +Accept-Language: en-US,en;q=0.8 +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 + +REQUEST +request.gsub!(/\n/m, "\r\n") + +Benchmark.ips do |ips| + ips.report("instance") { Http::Parser.new } + ips.report("parsing") { Http::Parser.new << request } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/bench/thin.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/bench/thin.rb new file mode 100644 index 000000000000..fe0dd6d6fc61 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/bench/thin.rb @@ -0,0 +1,58 @@ +$:.unshift File.dirname(__FILE__) + "/../lib" +require "rubygems" +require "thin_parser" +require "http_parser" +require "benchmark" +require "stringio" + +data = "POST /postit HTTP/1.1\r\n" + + "Host: localhost:3000\r\n" + + "User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9\r\n" + + "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n" + + "Accept-Language: en-us,en;q=0.5\r\n" + + "Accept-Encoding: gzip,deflate\r\n" + + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" + + "Keep-Alive: 300\r\n" + + "Connection: keep-alive\r\n" + + "Content-Type: text/html\r\n" + + "Content-Length: 37\r\n" + + "\r\n" + + "name=marc&email=macournoyer@gmail.com" + +def thin(data) + env = {"rack.input" => StringIO.new} + Thin::HttpParser.new.execute(env, data, 0) + env +end + +def http_parser(data) + body = StringIO.new + env = nil + + parser = HTTP::RequestParser.new + parser.on_headers_complete = proc { |e| env = e } + parser.on_body = proc { |c| body << c } + parser << data + + env["rack-input"] = body + env +end + +# p thin(data) +# p http_parser(data) + +TESTS = 30_000 +Benchmark.bmbm do |results| + results.report("thin:") { TESTS.times { thin data } } + results.report("http-parser:") { TESTS.times { http_parser data } } +end + +# On my MBP core duo 2.2Ghz +# Rehearsal ------------------------------------------------ +# thin: 1.470000 0.000000 1.470000 ( 1.474737) +# http-parser: 1.270000 0.020000 1.290000 ( 1.292758) +# --------------------------------------- total: 2.760000sec +# +# user system total real +# thin: 1.150000 0.030000 1.180000 ( 1.173767) +# http-parser: 1.250000 0.010000 1.260000 ( 1.263796) diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.gitignore b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.gitignore new file mode 100644 index 000000000000..cb899d12764d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.gitignore @@ -0,0 +1 @@ +ryah_http_parser.* diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.sitearchdir.time b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/.sitearchdir.time new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/RubyHttpParserService.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/RubyHttpParserService.java new file mode 100644 index 000000000000..2ea3e8e0f476 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/RubyHttpParserService.java @@ -0,0 +1,18 @@ +import java.io.IOException; + +import org.jruby.Ruby; +import org.jruby.RubyClass; +import org.jruby.RubyModule; +import org.jruby.runtime.load.BasicLibraryService; + +import org.ruby_http_parser.*; + +public class RubyHttpParserService implements BasicLibraryService { + public boolean basicLoad(final Ruby runtime) throws IOException { + RubyModule mHTTP = runtime.defineModule("HTTP"); + RubyClass cParser = mHTTP.defineClassUnder("Parser", runtime.getObject(), RubyHttpParser.ALLOCATOR); + cParser.defineAnnotatedMethods(RubyHttpParser.class); + cParser.defineClassUnder("Error", runtime.getClass("IOError"),runtime.getClass("IOError").getAllocator()); + return true; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ext_help.h b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ext_help.h new file mode 100644 index 000000000000..a919dffe7cf8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ext_help.h @@ -0,0 +1,18 @@ +#ifndef ext_help_h +#define ext_help_h + +#define RAISE_NOT_NULL(T) if(T == NULL) rb_raise(rb_eArgError, "NULL found for " # T " when shouldn't be."); +#define DATA_GET(from,type,name) Data_Get_Struct(from,type,name); RAISE_NOT_NULL(name); +#define REQUIRE_TYPE(V, T) if(TYPE(V) != T) rb_raise(rb_eTypeError, "Wrong argument type for " # V " required " # T); + +/* for compatibility with Ruby 1.8.5, which doesn't declare RSTRING_PTR */ +#ifndef RSTRING_PTR +#define RSTRING_PTR(s) (RSTRING(s)->ptr) +#endif + +/* for compatibility with Ruby 1.8.5, which doesn't declare RSTRING_LEN */ +#ifndef RSTRING_LEN +#define RSTRING_LEN(s) (RSTRING(s)->len) +#endif + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/extconf.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/extconf.rb new file mode 100644 index 000000000000..d2f6e519b57f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/extconf.rb @@ -0,0 +1,24 @@ +require 'mkmf' + +# check out code if it hasn't been already +if Dir[File.expand_path('../vendor/http-parser/*', __FILE__)].empty? + Dir.chdir(File.expand_path('../../../', __FILE__)) do + xsystem 'git submodule init' + xsystem 'git submodule update' + end +end + +# mongrel and http-parser both define http_parser_(init|execute), so we +# rename functions in http-parser before using them. +vendor_dir = File.expand_path('../vendor/http-parser/', __FILE__) +src_dir = File.expand_path('../', __FILE__) +%w[ http_parser.c http_parser.h ].each do |file| + File.open(File.join(src_dir, "ryah_#{file}"), 'w'){ |f| + f.write File.read(File.join(vendor_dir, file)).gsub('http_parser', 'ryah_http_parser') + } +end + +$CFLAGS << " -I#{src_dir}" + +dir_config("ruby_http_parser") +create_makefile("ruby_http_parser") diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java new file mode 100644 index 000000000000..ac586a91ab39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/org/ruby_http_parser/RubyHttpParser.java @@ -0,0 +1,495 @@ +package org.ruby_http_parser; + +import http_parser.HTTPException; +import http_parser.HTTPMethod; +import http_parser.HTTPParser; +import http_parser.lolevel.HTTPCallback; +import http_parser.lolevel.HTTPDataCallback; +import http_parser.lolevel.ParserSettings; + +import java.nio.ByteBuffer; + +import org.jcodings.Encoding; +import org.jcodings.specific.UTF8Encoding; +import org.jruby.Ruby; +import org.jruby.RubyArray; +import org.jruby.RubyClass; +import org.jruby.RubyHash; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.RubyString; +import org.jruby.RubySymbol; +import org.jruby.anno.JRubyMethod; +import org.jruby.exceptions.RaiseException; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; + +public class RubyHttpParser extends RubyObject { + + @JRubyMethod(name = "strict?", module = true) + public static IRubyObject strict(IRubyObject recv) { + return recv.getRuntime().newBoolean(true); + } + + public static ObjectAllocator ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyHttpParser(runtime, klass); + } + }; + + byte[] fetchBytes(ByteBuffer b, int pos, int len) { + byte[] by = new byte[len]; + int saved = b.position(); + b.position(pos); + b.get(by); + b.position(saved); + return by; + } + + public class StopException extends RuntimeException { + } + + private Ruby runtime; + private HTTPParser parser; + private ParserSettings settings; + + private RubyClass eParserError; + + private RubyHash headers; + + private IRubyObject on_message_begin; + private IRubyObject on_headers_complete; + private IRubyObject on_body; + private IRubyObject on_message_complete; + + private IRubyObject requestUrl; + private IRubyObject requestPath; + private IRubyObject queryString; + private IRubyObject fragment; + + private IRubyObject header_value_type; + private IRubyObject upgradeData; + + private IRubyObject callback_object; + + private boolean completed; + + private byte[] _current_header; + private byte[] _last_header; + + private static final Encoding UTF8 = UTF8Encoding.INSTANCE; + + public RubyHttpParser(final Ruby runtime, RubyClass clazz) { + super(runtime, clazz); + + this.runtime = runtime; + this.eParserError = (RubyClass) runtime.getModule("HTTP").getClass("Parser").getConstant("Error"); + + this.on_message_begin = null; + this.on_headers_complete = null; + this.on_body = null; + this.on_message_complete = null; + + this.callback_object = null; + + this.completed = false; + + this.header_value_type = runtime.getModule("HTTP").getClass("Parser") + .getInstanceVariable("@default_header_value_type"); + + initSettings(); + init(); + } + + private void initSettings() { + this.settings = new ParserSettings(); + + this.settings.on_url = new HTTPDataCallback() { + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + byte[] data = fetchBytes(buf, pos, len); + if (runtime.is1_9() || runtime.is2_0()) { + ((RubyString) requestUrl).cat(data, 0, data.length, UTF8); + } else { + ((RubyString) requestUrl).cat(data); + } + return 0; + } + }; + + this.settings.on_header_field = new HTTPDataCallback() { + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + byte[] data = fetchBytes(buf, pos, len); + + if (_current_header == null) + _current_header = data; + else { + byte[] tmp = new byte[_current_header.length + data.length]; + System.arraycopy(_current_header, 0, tmp, 0, _current_header.length); + System.arraycopy(data, 0, tmp, _current_header.length, data.length); + _current_header = tmp; + } + + return 0; + } + }; + final RubySymbol arraysSym = runtime.newSymbol("arrays"); + final RubySymbol mixedSym = runtime.newSymbol("mixed"); + final RubySymbol stopSym = runtime.newSymbol("stop"); + final RubySymbol resetSym = runtime.newSymbol("reset"); + this.settings.on_header_value = new HTTPDataCallback() { + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + byte[] data = fetchBytes(buf, pos, len); + ThreadContext context = headers.getRuntime().getCurrentContext(); + IRubyObject key, val; + int new_field = 0; + + if (_current_header != null) { + new_field = 1; + _last_header = _current_header; + _current_header = null; + } + + key = RubyString.newString(runtime, new ByteList(_last_header, UTF8, false)); + val = headers.op_aref(context, key); + + if (new_field == 1) { + if (val.isNil()) { + if (header_value_type == arraysSym) { + headers.op_aset(context, key, + RubyArray.newArrayLight(runtime, RubyString.newStringLight(runtime, 10, UTF8))); + } else { + headers.op_aset(context, key, RubyString.newStringLight(runtime, 10, UTF8)); + } + } else { + if (header_value_type == mixedSym) { + if (val instanceof RubyString) { + headers.op_aset(context, key, + RubyArray.newArrayLight(runtime, val, RubyString.newStringLight(runtime, 10, UTF8))); + } else { + ((RubyArray) val).add(RubyString.newStringLight(runtime, 10, UTF8)); + } + } else if (header_value_type == arraysSym) { + ((RubyArray) val).add(RubyString.newStringLight(runtime, 10, UTF8)); + } else { + if (runtime.is1_9() || runtime.is2_0()) { + ((RubyString) val).cat(',', UTF8).cat(' ', UTF8); + } else { + ((RubyString) val).cat(',').cat(' '); + } + } + } + val = headers.op_aref(context, key); + } + + if (val instanceof RubyArray) { + val = ((RubyArray) val).entry(-1); + } + + if (runtime.is1_9() || runtime.is2_0()) { + ((RubyString) val).cat(data, 0, data.length, UTF8); + } else { + ((RubyString) val).cat(data); + } + + return 0; + } + }; + + this.settings.on_message_begin = new HTTPCallback() { + public int cb(http_parser.lolevel.HTTPParser p) { + headers = new RubyHash(runtime); + + if (runtime.is1_9() || runtime.is2_0()) { + requestUrl = RubyString.newEmptyString(runtime, UTF8); + requestPath = RubyString.newEmptyString(runtime, UTF8); + queryString = RubyString.newEmptyString(runtime, UTF8); + fragment = RubyString.newEmptyString(runtime, UTF8); + upgradeData = RubyString.newEmptyString(runtime, UTF8); + } else { + requestUrl = RubyString.newEmptyString(runtime); + requestPath = RubyString.newEmptyString(runtime); + queryString = RubyString.newEmptyString(runtime); + fragment = RubyString.newEmptyString(runtime); + upgradeData = RubyString.newEmptyString(runtime); + } + + IRubyObject ret = runtime.getNil(); + + if (callback_object != null) { + if (((RubyObject) callback_object).respondsTo("on_message_begin")) { + ThreadContext context = callback_object.getRuntime().getCurrentContext(); + ret = callback_object.callMethod(context, "on_message_begin"); + } + } else if (on_message_begin != null) { + ThreadContext context = on_message_begin.getRuntime().getCurrentContext(); + ret = on_message_begin.callMethod(context, "call"); + } + + if (ret == stopSym) { + throw new StopException(); + } else { + return 0; + } + } + }; + this.settings.on_message_complete = new HTTPCallback() { + public int cb(http_parser.lolevel.HTTPParser p) { + IRubyObject ret = runtime.getNil(); + + completed = true; + + if (callback_object != null) { + if (((RubyObject) callback_object).respondsTo("on_message_complete")) { + ThreadContext context = callback_object.getRuntime().getCurrentContext(); + ret = callback_object.callMethod(context, "on_message_complete"); + } + } else if (on_message_complete != null) { + ThreadContext context = on_message_complete.getRuntime().getCurrentContext(); + ret = on_message_complete.callMethod(context, "call"); + } + + if (ret == stopSym) { + throw new StopException(); + } else { + return 0; + } + } + }; + this.settings.on_headers_complete = new HTTPCallback() { + public int cb(http_parser.lolevel.HTTPParser p) { + IRubyObject ret = runtime.getNil(); + + if (callback_object != null) { + if (((RubyObject) callback_object).respondsTo("on_headers_complete")) { + ThreadContext context = callback_object.getRuntime().getCurrentContext(); + ret = callback_object.callMethod(context, "on_headers_complete", headers); + } + } else if (on_headers_complete != null) { + ThreadContext context = on_headers_complete.getRuntime().getCurrentContext(); + ret = on_headers_complete.callMethod(context, "call", headers); + } + + if (ret == stopSym) { + throw new StopException(); + } else if (ret == resetSym) { + return 1; + } else { + return 0; + } + } + }; + this.settings.on_body = new HTTPDataCallback() { + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + IRubyObject ret = runtime.getNil(); + byte[] data = fetchBytes(buf, pos, len); + + if (callback_object != null) { + if (((RubyObject) callback_object).respondsTo("on_body")) { + ThreadContext context = callback_object.getRuntime().getCurrentContext(); + ret = callback_object.callMethod(context, "on_body", + RubyString.newString(runtime, new ByteList(data, UTF8, false))); + } + } else if (on_body != null) { + ThreadContext context = on_body.getRuntime().getCurrentContext(); + ret = on_body.callMethod(context, "call", RubyString.newString(runtime, new ByteList(data, UTF8, false))); + } + + if (ret == stopSym) { + throw new StopException(); + } else { + return 0; + } + } + }; + } + + private void init() { + this.parser = new HTTPParser(); + this.parser.HTTP_PARSER_STRICT = true; + this.headers = null; + + this.requestUrl = runtime.getNil(); + this.requestPath = runtime.getNil(); + this.queryString = runtime.getNil(); + this.fragment = runtime.getNil(); + + this.upgradeData = runtime.getNil(); + } + + @JRubyMethod(name = "initialize") + public IRubyObject initialize() { + return this; + } + + @JRubyMethod(name = "initialize") + public IRubyObject initialize(IRubyObject arg) { + callback_object = arg; + return initialize(); + } + + @JRubyMethod(name = "initialize") + public IRubyObject initialize(IRubyObject arg, IRubyObject arg2) { + header_value_type = arg2; + return initialize(arg); + } + + @JRubyMethod(name = "on_message_begin=") + public IRubyObject set_on_message_begin(IRubyObject cb) { + on_message_begin = cb; + return cb; + } + + @JRubyMethod(name = "on_headers_complete=") + public IRubyObject set_on_headers_complete(IRubyObject cb) { + on_headers_complete = cb; + return cb; + } + + @JRubyMethod(name = "on_body=") + public IRubyObject set_on_body(IRubyObject cb) { + on_body = cb; + return cb; + } + + @JRubyMethod(name = "on_message_complete=") + public IRubyObject set_on_message_complete(IRubyObject cb) { + on_message_complete = cb; + return cb; + } + + @JRubyMethod(name = "<<") + public IRubyObject execute(IRubyObject data) { + RubyString str = (RubyString) data; + ByteList byteList = str.getByteList(); + ByteBuffer buf = ByteBuffer.wrap(byteList.getUnsafeBytes(), byteList.getBegin(), byteList.getRealSize()); + boolean stopped = false; + + try { + this.parser.execute(this.settings, buf); + } catch (HTTPException e) { + throw new RaiseException(runtime, eParserError, e.getMessage(), true); + } catch (StopException e) { + stopped = true; + } + + if (parser.getUpgrade()) { + byte[] upData = fetchBytes(buf, buf.position(), buf.limit() - buf.position()); + if (runtime.is1_9() || runtime.is2_0()) { + ((RubyString) upgradeData).cat(upData, 0, upData.length, UTF8); + } else { + ((RubyString) upgradeData).cat(upData); + } + } else if (buf.hasRemaining() && !completed) { + if (!stopped) + throw new RaiseException(runtime, eParserError, "Could not parse data entirely", true); + } + + return RubyNumeric.int2fix(runtime, buf.position()); + } + + @JRubyMethod(name = "keep_alive?") + public IRubyObject shouldKeepAlive() { + return runtime.newBoolean(parser.shouldKeepAlive()); + } + + @JRubyMethod(name = "upgrade?") + public IRubyObject shouldUpgrade() { + return runtime.newBoolean(parser.getUpgrade()); + } + + @JRubyMethod(name = "http_major") + public IRubyObject httpMajor() { + if (parser.getMajor() == 0 && parser.getMinor() == 0) + return runtime.getNil(); + else + return RubyNumeric.int2fix(runtime, parser.getMajor()); + } + + @JRubyMethod(name = "http_minor") + public IRubyObject httpMinor() { + if (parser.getMajor() == 0 && parser.getMinor() == 0) + return runtime.getNil(); + else + return RubyNumeric.int2fix(runtime, parser.getMinor()); + } + + @JRubyMethod(name = "http_version") + public IRubyObject httpVersion() { + if (parser.getMajor() == 0 && parser.getMinor() == 0) + return runtime.getNil(); + else + return runtime.newArray(httpMajor(), httpMinor()); + } + + @JRubyMethod(name = "http_method") + public IRubyObject httpMethod() { + HTTPMethod method = parser.getHTTPMethod(); + if (method != null) + return runtime.newString(new String(method.bytes)); + else + return runtime.getNil(); + } + + @JRubyMethod(name = "status_code") + public IRubyObject statusCode() { + int code = parser.getStatusCode(); + if (code != 0) + return RubyNumeric.int2fix(runtime, code); + else + return runtime.getNil(); + } + + @JRubyMethod(name = "headers") + public IRubyObject getHeaders() { + return headers == null ? runtime.getNil() : headers; + } + + @JRubyMethod(name = "request_url") + public IRubyObject getRequestUrl() { + return requestUrl == null ? runtime.getNil() : requestUrl; + } + + @JRubyMethod(name = "request_path") + public IRubyObject getRequestPath() { + return requestPath == null ? runtime.getNil() : requestPath; + } + + @JRubyMethod(name = "query_string") + public IRubyObject getQueryString() { + return queryString == null ? runtime.getNil() : queryString; + } + + @JRubyMethod(name = "fragment") + public IRubyObject getFragment() { + return fragment == null ? runtime.getNil() : fragment; + } + + @JRubyMethod(name = "header_value_type") + public IRubyObject getHeaderValueType() { + return header_value_type == null ? runtime.getNil() : header_value_type; + } + + @JRubyMethod(name = "header_value_type=") + public IRubyObject set_header_value_type(IRubyObject val) { + String valString = val.toString(); + if (valString != "mixed" && valString != "arrays" && valString != "strings") { + throw runtime.newArgumentError("Invalid header value type"); + } + header_value_type = val; + return val; + } + + @JRubyMethod(name = "upgrade_data") + public IRubyObject upgradeData() { + return upgradeData == null ? runtime.getNil() : upgradeData; + } + + @JRubyMethod(name = "reset!") + public IRubyObject reset() { + init(); + return runtime.getTrue(); + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ruby_http_parser.c b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ruby_http_parser.c new file mode 100644 index 000000000000..56506527df2a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/ruby_http_parser.c @@ -0,0 +1,515 @@ +#include "ruby.h" +#include "ext_help.h" +#include "ryah_http_parser.h" + +#define GET_WRAPPER(N, from) ParserWrapper *N = (ParserWrapper *)(from)->data; +#define HASH_CAT(h, k, ptr, len) \ + do { \ + VALUE __v = rb_hash_aref(h, k); \ + if (__v != Qnil) { \ + rb_str_cat(__v, ptr, len); \ + } else { \ + rb_hash_aset(h, k, rb_str_new(ptr, len)); \ + } \ + } while(0) + +typedef struct ParserWrapper { + ryah_http_parser parser; + + VALUE request_url; + + VALUE headers; + + VALUE upgrade_data; + + VALUE on_message_begin; + VALUE on_headers_complete; + VALUE on_body; + VALUE on_message_complete; + + VALUE callback_object; + VALUE stopped; + VALUE completed; + + VALUE header_value_type; + + VALUE last_field_name; + VALUE curr_field_name; + + enum ryah_http_parser_type type; +} ParserWrapper; + +void ParserWrapper_init(ParserWrapper *wrapper) { + ryah_http_parser_init(&wrapper->parser, wrapper->type); + wrapper->parser.status_code = 0; + wrapper->parser.http_major = 0; + wrapper->parser.http_minor = 0; + + wrapper->request_url = Qnil; + + wrapper->upgrade_data = Qnil; + + wrapper->headers = Qnil; + wrapper->completed = Qfalse; + + wrapper->last_field_name = Qnil; + wrapper->curr_field_name = Qnil; +} + +void ParserWrapper_mark(void *data) { + if(data) { + ParserWrapper *wrapper = (ParserWrapper *) data; + rb_gc_mark_maybe(wrapper->request_url); + rb_gc_mark_maybe(wrapper->upgrade_data); + rb_gc_mark_maybe(wrapper->headers); + rb_gc_mark_maybe(wrapper->on_message_begin); + rb_gc_mark_maybe(wrapper->on_headers_complete); + rb_gc_mark_maybe(wrapper->on_body); + rb_gc_mark_maybe(wrapper->on_message_complete); + rb_gc_mark_maybe(wrapper->callback_object); + rb_gc_mark_maybe(wrapper->last_field_name); + rb_gc_mark_maybe(wrapper->curr_field_name); + } +} + +void ParserWrapper_free(void *data) { + if(data) { + free(data); + } +} + +static VALUE cParser; +static VALUE cRequestParser; +static VALUE cResponseParser; + +static VALUE eParserError; + +static ID Icall; +static ID Ion_message_begin; +static ID Ion_headers_complete; +static ID Ion_body; +static ID Ion_message_complete; + +static VALUE Sstop; +static VALUE Sreset; +static VALUE Sarrays; +static VALUE Sstrings; +static VALUE Smixed; + +/** Callbacks **/ + +int on_message_begin(ryah_http_parser *parser) { + GET_WRAPPER(wrapper, parser); + + wrapper->request_url = rb_str_new2(""); + wrapper->headers = rb_hash_new(); + wrapper->upgrade_data = rb_str_new2(""); + + VALUE ret = Qnil; + + if (wrapper->callback_object != Qnil && rb_respond_to(wrapper->callback_object, Ion_message_begin)) { + ret = rb_funcall(wrapper->callback_object, Ion_message_begin, 0); + } else if (wrapper->on_message_begin != Qnil) { + ret = rb_funcall(wrapper->on_message_begin, Icall, 0); + } + + if (ret == Sstop) { + wrapper->stopped = Qtrue; + return -1; + } else { + return 0; + } +} + +int on_url(ryah_http_parser *parser, const char *at, size_t length) { + GET_WRAPPER(wrapper, parser); + rb_str_cat(wrapper->request_url, at, length); + return 0; +} + +int on_header_field(ryah_http_parser *parser, const char *at, size_t length) { + GET_WRAPPER(wrapper, parser); + + if (wrapper->curr_field_name == Qnil) { + wrapper->last_field_name = Qnil; + wrapper->curr_field_name = rb_str_new(at, length); + } else { + rb_str_cat(wrapper->curr_field_name, at, length); + } + + return 0; +} + +int on_header_value(ryah_http_parser *parser, const char *at, size_t length) { + GET_WRAPPER(wrapper, parser); + + int new_field = 0; + VALUE current_value; + + if (wrapper->last_field_name == Qnil) { + new_field = 1; + wrapper->last_field_name = wrapper->curr_field_name; + wrapper->curr_field_name = Qnil; + } + + current_value = rb_hash_aref(wrapper->headers, wrapper->last_field_name); + + if (new_field == 1) { + if (current_value == Qnil) { + if (wrapper->header_value_type == Sarrays) { + rb_hash_aset(wrapper->headers, wrapper->last_field_name, rb_ary_new3(1, rb_str_new2(""))); + } else { + rb_hash_aset(wrapper->headers, wrapper->last_field_name, rb_str_new2("")); + } + } else { + if (wrapper->header_value_type == Smixed) { + if (TYPE(current_value) == T_STRING) { + rb_hash_aset(wrapper->headers, wrapper->last_field_name, rb_ary_new3(2, current_value, rb_str_new2(""))); + } else { + rb_ary_push(current_value, rb_str_new2("")); + } + } else if (wrapper->header_value_type == Sarrays) { + rb_ary_push(current_value, rb_str_new2("")); + } else { + rb_str_cat(current_value, ", ", 2); + } + } + current_value = rb_hash_aref(wrapper->headers, wrapper->last_field_name); + } + + if (TYPE(current_value) == T_ARRAY) { + current_value = rb_ary_entry(current_value, -1); + } + + rb_str_cat(current_value, at, length); + + return 0; +} + +int on_headers_complete(ryah_http_parser *parser) { + GET_WRAPPER(wrapper, parser); + + VALUE ret = Qnil; + + if (wrapper->callback_object != Qnil && rb_respond_to(wrapper->callback_object, Ion_headers_complete)) { + ret = rb_funcall(wrapper->callback_object, Ion_headers_complete, 1, wrapper->headers); + } else if (wrapper->on_headers_complete != Qnil) { + ret = rb_funcall(wrapper->on_headers_complete, Icall, 1, wrapper->headers); + } + + if (ret == Sstop) { + wrapper->stopped = Qtrue; + return -1; + } else if (ret == Sreset){ + return 1; + } else { + return 0; + } +} + +int on_body(ryah_http_parser *parser, const char *at, size_t length) { + GET_WRAPPER(wrapper, parser); + + VALUE ret = Qnil; + + if (wrapper->callback_object != Qnil && rb_respond_to(wrapper->callback_object, Ion_body)) { + ret = rb_funcall(wrapper->callback_object, Ion_body, 1, rb_str_new(at, length)); + } else if (wrapper->on_body != Qnil) { + ret = rb_funcall(wrapper->on_body, Icall, 1, rb_str_new(at, length)); + } + + if (ret == Sstop) { + wrapper->stopped = Qtrue; + return -1; + } else { + return 0; + } +} + +int on_message_complete(ryah_http_parser *parser) { + GET_WRAPPER(wrapper, parser); + + VALUE ret = Qnil; + wrapper->completed = Qtrue; + + if (wrapper->callback_object != Qnil && rb_respond_to(wrapper->callback_object, Ion_message_complete)) { + ret = rb_funcall(wrapper->callback_object, Ion_message_complete, 0); + } else if (wrapper->on_message_complete != Qnil) { + ret = rb_funcall(wrapper->on_message_complete, Icall, 0); + } + + if (ret == Sstop) { + wrapper->stopped = Qtrue; + return -1; + } else { + return 0; + } +} + +static ryah_http_parser_settings settings = { + .on_message_begin = on_message_begin, + .on_url = on_url, + .on_header_field = on_header_field, + .on_header_value = on_header_value, + .on_headers_complete = on_headers_complete, + .on_body = on_body, + .on_message_complete = on_message_complete +}; + +VALUE Parser_alloc_by_type(VALUE klass, enum ryah_http_parser_type type) { + ParserWrapper *wrapper = ALLOC_N(ParserWrapper, 1); + wrapper->type = type; + wrapper->parser.data = wrapper; + + wrapper->on_message_begin = Qnil; + wrapper->on_headers_complete = Qnil; + wrapper->on_body = Qnil; + wrapper->on_message_complete = Qnil; + + wrapper->callback_object = Qnil; + + ParserWrapper_init(wrapper); + + return Data_Wrap_Struct(klass, ParserWrapper_mark, ParserWrapper_free, wrapper); +} + +VALUE Parser_alloc(VALUE klass) { + return Parser_alloc_by_type(klass, HTTP_BOTH); +} + +VALUE RequestParser_alloc(VALUE klass) { + return Parser_alloc_by_type(klass, HTTP_REQUEST); +} + +VALUE ResponseParser_alloc(VALUE klass) { + return Parser_alloc_by_type(klass, HTTP_RESPONSE); +} + +VALUE Parser_strict_p(VALUE klass) { + return HTTP_PARSER_STRICT == 1 ? Qtrue : Qfalse; +} + +VALUE Parser_initialize(int argc, VALUE *argv, VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->header_value_type = rb_iv_get(CLASS_OF(self), "@default_header_value_type"); + + if (argc == 1) { + wrapper->callback_object = argv[0]; + } + + if (argc == 2) { + wrapper->callback_object = argv[0]; + wrapper->header_value_type = argv[1]; + } + + return self; +} + +VALUE Parser_execute(VALUE self, VALUE data) { + ParserWrapper *wrapper = NULL; + + Check_Type(data, T_STRING); + char *ptr = RSTRING_PTR(data); + long len = RSTRING_LEN(data); + + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->stopped = Qfalse; + size_t nparsed = ryah_http_parser_execute(&wrapper->parser, &settings, ptr, len); + + if (wrapper->parser.upgrade) { + if (RTEST(wrapper->stopped)) + nparsed += 1; + + rb_str_cat(wrapper->upgrade_data, ptr + nparsed, len - nparsed); + + } else if (nparsed != (size_t)len) { + if (!RTEST(wrapper->stopped) && !RTEST(wrapper->completed)) + rb_raise(eParserError, "Could not parse data entirely (%zu != %zu)", nparsed, len); + else + nparsed += 1; // error states fail on the current character + } + + return INT2FIX(nparsed); +} + +VALUE Parser_set_on_message_begin(VALUE self, VALUE callback) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->on_message_begin = callback; + return callback; +} + +VALUE Parser_set_on_headers_complete(VALUE self, VALUE callback) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->on_headers_complete = callback; + return callback; +} + +VALUE Parser_set_on_body(VALUE self, VALUE callback) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->on_body = callback; + return callback; +} + +VALUE Parser_set_on_message_complete(VALUE self, VALUE callback) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + wrapper->on_message_complete = callback; + return callback; +} + +VALUE Parser_keep_alive_p(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + return http_should_keep_alive(&wrapper->parser) == 1 ? Qtrue : Qfalse; +} + +VALUE Parser_upgrade_p(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + return wrapper->parser.upgrade ? Qtrue : Qfalse; +} + +VALUE Parser_http_version(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.http_major == 0 && wrapper->parser.http_minor == 0) + return Qnil; + else + return rb_ary_new3(2, INT2FIX(wrapper->parser.http_major), INT2FIX(wrapper->parser.http_minor)); +} + +VALUE Parser_http_major(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.http_major == 0 && wrapper->parser.http_minor == 0) + return Qnil; + else + return INT2FIX(wrapper->parser.http_major); +} + +VALUE Parser_http_minor(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.http_major == 0 && wrapper->parser.http_minor == 0) + return Qnil; + else + return INT2FIX(wrapper->parser.http_minor); +} + +VALUE Parser_http_method(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.type == HTTP_REQUEST) + return rb_str_new2(http_method_str(wrapper->parser.method)); + else + return Qnil; +} + +VALUE Parser_status_code(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + if (wrapper->parser.status_code) + return INT2FIX(wrapper->parser.status_code); + else + return Qnil; +} + +#define DEFINE_GETTER(name) \ + VALUE Parser_##name(VALUE self) { \ + ParserWrapper *wrapper = NULL; \ + DATA_GET(self, ParserWrapper, wrapper); \ + return wrapper->name; \ + } + +DEFINE_GETTER(request_url); +DEFINE_GETTER(headers); +DEFINE_GETTER(upgrade_data); +DEFINE_GETTER(header_value_type); + +VALUE Parser_set_header_value_type(VALUE self, VALUE val) { + if (val != Sarrays && val != Sstrings && val != Smixed) { + rb_raise(rb_eArgError, "Invalid header value type"); + } + + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + wrapper->header_value_type = val; + return wrapper->header_value_type; +} + +VALUE Parser_reset(VALUE self) { + ParserWrapper *wrapper = NULL; + DATA_GET(self, ParserWrapper, wrapper); + + ParserWrapper_init(wrapper); + + return Qtrue; +} + +void Init_ruby_http_parser() { + VALUE mHTTP = rb_define_module("HTTP"); + cParser = rb_define_class_under(mHTTP, "Parser", rb_cObject); + cRequestParser = rb_define_class_under(mHTTP, "RequestParser", cParser); + cResponseParser = rb_define_class_under(mHTTP, "ResponseParser", cParser); + + eParserError = rb_define_class_under(cParser, "Error", rb_eIOError); + Icall = rb_intern("call"); + Ion_message_begin = rb_intern("on_message_begin"); + Ion_headers_complete = rb_intern("on_headers_complete"); + Ion_body = rb_intern("on_body"); + Ion_message_complete = rb_intern("on_message_complete"); + Sstop = ID2SYM(rb_intern("stop")); + Sreset = ID2SYM(rb_intern("reset")); + + Sarrays = ID2SYM(rb_intern("arrays")); + Sstrings = ID2SYM(rb_intern("strings")); + Smixed = ID2SYM(rb_intern("mixed")); + + rb_define_alloc_func(cParser, Parser_alloc); + rb_define_alloc_func(cRequestParser, RequestParser_alloc); + rb_define_alloc_func(cResponseParser, ResponseParser_alloc); + + rb_define_singleton_method(cParser, "strict?", Parser_strict_p, 0); + rb_define_method(cParser, "initialize", Parser_initialize, -1); + + rb_define_method(cParser, "on_message_begin=", Parser_set_on_message_begin, 1); + rb_define_method(cParser, "on_headers_complete=", Parser_set_on_headers_complete, 1); + rb_define_method(cParser, "on_body=", Parser_set_on_body, 1); + rb_define_method(cParser, "on_message_complete=", Parser_set_on_message_complete, 1); + rb_define_method(cParser, "<<", Parser_execute, 1); + + rb_define_method(cParser, "keep_alive?", Parser_keep_alive_p, 0); + rb_define_method(cParser, "upgrade?", Parser_upgrade_p, 0); + + rb_define_method(cParser, "http_version", Parser_http_version, 0); + rb_define_method(cParser, "http_major", Parser_http_major, 0); + rb_define_method(cParser, "http_minor", Parser_http_minor, 0); + + rb_define_method(cParser, "http_method", Parser_http_method, 0); + rb_define_method(cParser, "status_code", Parser_status_code, 0); + + rb_define_method(cParser, "request_url", Parser_request_url, 0); + rb_define_method(cParser, "headers", Parser_headers, 0); + rb_define_method(cParser, "upgrade_data", Parser_upgrade_data, 0); + rb_define_method(cParser, "header_value_type", Parser_header_value_type, 0); + rb_define_method(cParser, "header_value_type=", Parser_set_header_value_type, 1); + + rb_define_method(cParser, "reset!", Parser_reset, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/.gitkeep b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/AUTHORS b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/AUTHORS new file mode 100644 index 000000000000..abe99dee44f3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/AUTHORS @@ -0,0 +1,32 @@ +# Authors ordered by first contribution. +Ryan Dahl <ry@tinyclouds.org> +Jeremy Hinegardner <jeremy@hinegardner.org> +Sergey Shepelev <temotor@gmail.com> +Joe Damato <ice799@gmail.com> +tomika <tomika_nospam@freemail.hu> +Phoenix Sol <phoenix@burninglabs.com> +Cliff Frey <cliff@meraki.com> +Ewen Cheslack-Postava <ewencp@cs.stanford.edu> +Santiago Gala <sgala@apache.org> +Tim Becker <tim.becker@syngenio.de> +Jeff Terrace <jterrace@gmail.com> +Ben Noordhuis <info@bnoordhuis.nl> +Nathan Rajlich <nathan@tootallnate.net> +Mark Nottingham <mnot@mnot.net> +Aman Gupta <aman@tmm1.net> +Tim Becker <tim.becker@kuriositaet.de> +Sean Cunningham <sean.cunningham@mandiant.com> +Peter Griess <pg@std.in> +Salman Haq <salman.haq@asti-usa.com> +Cliff Frey <clifffrey@gmail.com> +Jon Kolb <jon@b0g.us> +Fouad Mardini <f.mardini@gmail.com> +Paul Querna <pquerna@apache.org> +Felix Geisendörfer <felix@debuggable.com> +koichik <koichik@improvement.jp> +Andre Caron <andre.l.caron@gmail.com> +Ivo Raisr <ivosh@ivosh.net> +James McLaughlin <jamie@lacewing-project.org> +David Gwynne <loki@animata.net> +LE ROUX Thomas <thomas@procheo.fr> +Randy Rizun <rrizun@ortivawireless.com> diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT new file mode 100644 index 000000000000..a0ae8dc9a4d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/LICENSE-MIT @@ -0,0 +1,48 @@ +Copyright 2010 Tim Becker <tim.becker@kuriositaet.de> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +--- END OF LICENSE + +This code mainly based on code with the following license: + + +http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright +Igor Sysoev. + +Additional changes are licensed under the same terms as NGINX and +copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/README.md b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/README.md new file mode 100644 index 000000000000..0a6a432393ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/README.md @@ -0,0 +1,183 @@ +HTTP Parser +=========== + +This is a parser for HTTP written in Java, based quite heavily on +the Ryan Dahl's C Version: `http-parser` available here: + + http://github.com/ry/http-parser + +It parses both requests and responses. The parser is designed to be used +in performance HTTP applications. + +Features: + + * No dependencies (probably won't be able to keep it up) + * Handles persistent streams (keep-alive). + * Decodes chunked encoding. + * Upgrade support + +The parser extracts the following information from HTTP messages: + + * Header fields and values + * Content-Length + * Request method + * Response status code + * Transfer-Encoding + * HTTP version + * Request URL + * Message body + +Building +-------- + +use `ant compile|test|jar` + +Usage +----- + + TODO: in the present form, usage of the Java version of the parser + shouldn't be too difficult to figure out for someone familiar with the + C version. + + More documentation will follow shortly, in case you're looking for an + easy to use http library, this lib is probably not what you are + looking for anyway ... + + All text after this paragraph (and most of the text above it) are from + the original C version of the README and are currently only here for + reference. In case you encounter any difficulties, find bugs, need + help or have suggestions, feel free to contact me at + (tim.becker@kuriositaet.de). + + +One `http_parser` object is used per TCP connection. Initialize the struct +using `http_parser_init()` and set the callbacks. That might look something +like this for a request parser: + + http_parser_settings settings; + settings.on_path = my_path_callback; + settings.on_header_field = my_header_field_callback; + /* ... */ + + http_parser *parser = malloc(sizeof(http_parser)); + http_parser_init(parser, HTTP_REQUEST); + parser->data = my_socket; + +When data is received on the socket execute the parser and check for errors. + + size_t len = 80*1024, nparsed; + char buf[len]; + ssize_t recved; + + recved = recv(fd, buf, len, 0); + + if (recved < 0) { + /* Handle error. */ + } + + /* Start up / continue the parser. + * Note we pass recved==0 to signal that EOF has been recieved. + */ + nparsed = http_parser_execute(parser, &settings, buf, recved); + + if (parser->upgrade) { + /* handle new protocol */ + } else if (nparsed != recved) { + /* Handle error. Usually just close the connection. */ + } + +HTTP needs to know where the end of the stream is. For example, sometimes +servers send responses without Content-Length and expect the client to +consume input (for the body) until EOF. To tell http_parser about EOF, give +`0` as the forth parameter to `http_parser_execute()`. Callbacks and errors +can still be encountered during an EOF, so one must still be prepared +to receive them. + +Scalar valued message information such as `status_code`, `method`, and the +HTTP version are stored in the parser structure. This data is only +temporally stored in `http_parser` and gets reset on each new message. If +this information is needed later, copy it out of the structure during the +`headers_complete` callback. + +The parser decodes the transfer-encoding for both requests and responses +transparently. That is, a chunked encoding is decoded before being sent to +the on_body callback. + + +The Special Problem of Upgrade +------------------------------ + +HTTP supports upgrading the connection to a different protocol. An +increasingly common example of this is the Web Socket protocol which sends +a request like + + GET /demo HTTP/1.1 + Upgrade: WebSocket + Connection: Upgrade + Host: example.com + Origin: http://example.com + WebSocket-Protocol: sample + +followed by non-HTTP data. + +(See http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75 for more +information the Web Socket protocol.) + +To support this, the parser will treat this as a normal HTTP message without a +body. Issuing both on_headers_complete and on_message_complete callbacks. However +http_parser_execute() will stop parsing at the end of the headers and return. + +The user is expected to check if `parser->upgrade` has been set to 1 after +`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied +offset by the return value of `http_parser_execute()`. + + +Callbacks +--------- + +During the `http_parser_execute()` call, the callbacks set in +`http_parser_settings` will be executed. The parser maintains state and +never looks behind, so buffering the data is not necessary. If you need to +save certain data for later usage, you can do that from the callbacks. + +There are two types of callbacks: + +* notification `typedef int (*http_cb) (http_parser*);` + Callbacks: on_message_begin, on_headers_complete, on_message_complete. +* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);` + Callbacks: (requests only) on_uri, + (common) on_header_field, on_header_value, on_body; + +Callbacks must return 0 on success. Returning a non-zero value indicates +error to the parser, making it exit immediately. + +In case you parse HTTP message in chunks (i.e. `read()` request line +from socket, parse, read half headers, parse, etc) your data callbacks +may be called more than once. Http-parser guarantees that data pointer is only +valid for the lifetime of callback. You can also `read()` into a heap allocated +buffer to avoid copying memory around if this fits your application. + +Reading headers may be a tricky task if you read/parse headers partially. +Basically, you need to remember whether last header callback was field or value +and apply following logic: + + (on_header_field and on_header_value shortened to on_h_*) + ------------------------ ------------ -------------------------------------------- + | State (prev. callback) | Callback | Description/action | + ------------------------ ------------ -------------------------------------------- + | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | + | | | into it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_field | New header started. | + | | | Copy current name,value buffers to headers | + | | | list and allocate new buffer for new name | + ------------------------ ------------ -------------------------------------------- + | field | on_h_field | Previous name continues. Reallocate name | + | | | buffer and append callback data to it | + ------------------------ ------------ -------------------------------------------- + | field | on_h_value | Value for current header started. Allocate | + | | | new buffer and copy callback data to it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_value | Value continues. Reallocate value buffer | + | | | and append callback data to it | + ------------------------ ------------ -------------------------------------------- diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/TODO b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/TODO new file mode 100644 index 000000000000..eb46a08446a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/TODO @@ -0,0 +1,28 @@ +decide how to handle errs per default: + - ry: "set state to dead", return `read` + - current: call on_error w/ details, if no on_error handler set, + throw Exception, else call on_error and behave like orig... + +some tests from test.c left to port + (scan ...) +documentation + +hi level callback interface +eventloop +state() as a function (?) + - perhaps, the idea being to be able to log/debug better... +more tests + - in particular, port available c tests +impl bits of servlet api. + +DONE + +Sun Jul 18 12:19:18 CEST 2010 + +error handling + - consider callback based error handling and the current highlevel + "nice" logging moved to high level http impl. + - use Exceptions "ProtocolException"? + +better testing + - no junit to avoid dependencies diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/build.xml b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/build.xml new file mode 100644 index 000000000000..d2c6af45a2c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/build.xml @@ -0,0 +1,74 @@ +<?xml version="1.0"?> + +<project name="http-parser" default="compile" basedir="."> + +<echo message="pulling in property files"/> +<property file="build.properties"/> +<property name="classes.dir" value="classes"/> +<property name="assemble.dir" value="assemble"/> +<property name="lib.dir" value="lib"/> + + + +<target name="prepare"> + <mkdir dir="${classes.dir}" /> + <mkdir dir="${assemble.dir}" /> + <mkdir dir="${lib.dir}" /> +</target> + +<target name="clean"> + <delete dir="${classes.dir}"/> + <delete dir="lib"/> + <delete dir="doc"/> + <delete dir="${assemble.dir}"/> +</target> + +<target name="compile" depends="prepare"> + <javac srcdir="src" destdir="${classes.dir}" debug='true'> + <classpath> + <pathelement path="${classpath}"/> + <pathelement location="ext/http-parser.jar"/> + <pathelement location="ext/primitives.jar"/> + </classpath> + </javac> +</target> + +<target name="jar" depends="compile"> + <copy todir="${assemble.dir}"> + <fileset dir="classes"/> + </copy> + <jar basedir="${assemble.dir}" destfile="lib/${ant.project.name}.jar"/> +</target> + +<target name="run" depends="jar"> + <echo message="don't know how to run"/> +</target> + +<target name="doc" depends="prepare"> + <javadoc sourcepath="src/impl" destdir="doc"> + </javadoc> +</target> + +<target name="test_permutations" depends="compile"> + <java classname="http_parser.lolevel.TestLoaderNG"> + <arg value="tests.dumped"/> + <classpath> + <pathelement location="classes/"/> + <pathelement location="ext/primitives.jar/"/> + </classpath> + </java> +</target> + +<target name="test_unit" depends="compile"> + <java classname="http_parser.lolevel.Test"> + <arg value="tests.dumped"/> + <classpath> + <pathelement location="classes/"/> + <pathelement location="ext/primitives.jar/"/> + </classpath> + </java> +</target> + +<target name="test" depends="test_permutations, test_unit"/> + +</project> diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c new file mode 100644 index 000000000000..e961ae8a43ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.c @@ -0,0 +1,2175 @@ +/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev + * + * Additional changes are licensed under the same terms as NGINX and + * copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include <assert.h> +#include <stddef.h> +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +#ifndef ULLONG_MAX +# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ +#endif + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef ARRAY_SIZE +# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#endif + +#ifndef BIT_AT +# define BIT_AT(a, i) \ + (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \ + (1 << ((unsigned int) (i) & 7)))) +#endif + +#ifndef ELEM_AT +# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v)) +#endif + +#define SET_ERRNO(e) \ +do { \ + parser->http_errno = (e); \ +} while(0) + + +/* Run the notify callback FOR, returning ER if it fails */ +#define CALLBACK_NOTIFY_(FOR, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (settings->on_##FOR) { \ + if (0 != settings->on_##FOR(parser)) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + \ + /* We either errored above or got paused; get out */ \ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ + return (ER); \ + } \ + } \ +} while (0) + +/* Run the notify callback FOR and consume the current byte */ +#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) + +/* Run the notify callback FOR and don't consume the current byte */ +#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) + +/* Run data callback FOR with LEN bytes, returning ER if it fails */ +#define CALLBACK_DATA_(FOR, LEN, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (FOR##_mark) { \ + if (settings->on_##FOR) { \ + if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + \ + /* We either errored above or got paused; get out */ \ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ + return (ER); \ + } \ + } \ + FOR##_mark = NULL; \ + } \ +} while (0) + +/* Run the data callback FOR and consume the current byte */ +#define CALLBACK_DATA(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) + +/* Run the data callback FOR and don't consume the current byte */ +#define CALLBACK_DATA_NOADVANCE(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) + +/* Set the mark FOR; non-destructive if mark is already set */ +#define MARK(FOR) \ +do { \ + if (!FOR##_mark) { \ + FOR##_mark = p; \ + } \ +} while (0) + + +#define PROXY_CONNECTION "proxy-connection" +#define CONNECTION "connection" +#define CONTENT_LENGTH "content-length" +#define TRANSFER_ENCODING "transfer-encoding" +#define UPGRADE "upgrade" +#define CHUNKED "chunked" +#define KEEP_ALIVE "keep-alive" +#define CLOSE "close" + + +static const char *method_strings[] = + { +#define XX(num, name, string) #string, + HTTP_METHOD_MAP(XX) +#undef XX + }; + + +/* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1*<any CHAR except CTLs or separators> + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ +static const char tokens[256] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0, '!', 0, '#', '$', '%', '&', '\'', +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 0, 0, '*', '+', 0, '-', '.', 0, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + '0', '1', '2', '3', '4', '5', '6', '7', +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + '8', '9', 0, 0, 0, 0, 0, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 'x', 'y', 'z', 0, 0, 0, '^', '_', +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 'x', 'y', 'z', 0, '|', 0, '~', 0 }; + + +static const int8_t unhex[256] = + {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + }; + + +#if HTTP_PARSER_STRICT +# define T(v) 0 +#else +# define T(v) v +#endif + + +static const uint8_t normal_url_char[32] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128, +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, }; + +#undef T + +enum state + { s_dead = 1 /* important that this is > 0 */ + + , s_start_req_or_res + , s_res_or_resp_H + , s_start_res + , s_res_H + , s_res_HT + , s_res_HTT + , s_res_HTTP + , s_res_first_http_major + , s_res_http_major + , s_res_first_http_minor + , s_res_http_minor + , s_res_first_status_code + , s_res_status_code + , s_res_status + , s_res_line_almost_done + + , s_start_req + + , s_req_method + , s_req_spaces_before_url + , s_req_schema + , s_req_schema_slash + , s_req_schema_slash_slash + , s_req_server_start + , s_req_server + , s_req_server_with_at + , s_req_path + , s_req_query_string_start + , s_req_query_string + , s_req_fragment_start + , s_req_fragment + , s_req_http_start + , s_req_http_H + , s_req_http_HT + , s_req_http_HTT + , s_req_http_HTTP + , s_req_first_http_major + , s_req_http_major + , s_req_first_http_minor + , s_req_http_minor + , s_req_line_almost_done + + , s_header_field_start + , s_header_field + , s_header_value_start + , s_header_value + , s_header_value_lws + + , s_header_almost_done + + , s_chunk_size_start + , s_chunk_size + , s_chunk_parameters + , s_chunk_size_almost_done + + , s_headers_almost_done + , s_headers_done + + /* Important: 's_headers_done' must be the last 'header' state. All + * states beyond this must be 'body' states. It is used for overflow + * checking. See the PARSING_HEADER() macro. + */ + + , s_chunk_data + , s_chunk_data_almost_done + , s_chunk_data_done + + , s_body_identity + , s_body_identity_eof + + , s_message_done + }; + + +#define PARSING_HEADER(state) (state <= s_headers_done) + + +enum header_states + { h_general = 0 + , h_C + , h_CO + , h_CON + + , h_matching_connection + , h_matching_proxy_connection + , h_matching_content_length + , h_matching_transfer_encoding + , h_matching_upgrade + + , h_connection + , h_content_length + , h_transfer_encoding + , h_upgrade + + , h_matching_transfer_encoding_chunked + , h_matching_connection_keep_alive + , h_matching_connection_close + + , h_transfer_encoding_chunked + , h_connection_keep_alive + , h_connection_close + }; + +enum http_host_state + { + s_http_host_dead = 1 + , s_http_userinfo_start + , s_http_userinfo + , s_http_host_start + , s_http_host_v6_start + , s_http_host + , s_http_host_v6 + , s_http_host_v6_end + , s_http_host_port_start + , s_http_host_port +}; + +/* Macros for character classes; depends on strict-mode */ +#define CR '\r' +#define LF '\n' +#define LOWER(c) (unsigned char)(c | 0x20) +#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') +#define IS_NUM(c) ((c) >= '0' && (c) <= '9') +#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) +#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) +#define IS_MARK(c) ((c) == '-' || (c) == '_' || (c) == '.' || \ + (c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \ + (c) == ')') +#define IS_USERINFO_CHAR(c) (IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \ + (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \ + (c) == '$' || (c) == ',') + +#if HTTP_PARSER_STRICT +#define TOKEN(c) (tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c)) +#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') +#else +#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) \ + (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80)) +#define IS_HOST_CHAR(c) \ + (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') +#endif + + +#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) + + +#if HTTP_PARSER_STRICT +# define STRICT_CHECK(cond) \ +do { \ + if (cond) { \ + SET_ERRNO(HPE_STRICT); \ + goto error; \ + } \ +} while (0) +# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) +#else +# define STRICT_CHECK(cond) +# define NEW_MESSAGE() start_state +#endif + + +/* Map errno values to strings for human-readable output */ +#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, +static struct { + const char *name; + const char *description; +} http_strerror_tab[] = { + HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) +}; +#undef HTTP_STRERROR_GEN + +int http_message_needs_eof(const http_parser *parser); + +/* Our URL parser. + * + * This is designed to be shared by http_parser_execute() for URL validation, + * hence it has a state transition + byte-for-byte interface. In addition, it + * is meant to be embedded in http_parser_parse_url(), which does the dirty + * work of turning state transitions URL components for its API. + * + * This function should only be invoked with non-space characters. It is + * assumed that the caller cares about (and can detect) the transition between + * URL and non-URL states by looking for these. + */ +static enum state +parse_url_char(enum state s, const char ch) +{ + if (ch == ' ' || ch == '\r' || ch == '\n') { + return s_dead; + } + +#if HTTP_PARSER_STRICT + if (ch == '\t' || ch == '\f') { + return s_dead; + } +#endif + + switch (s) { + case s_req_spaces_before_url: + /* Proxied requests are followed by scheme of an absolute URI (alpha). + * All methods except CONNECT are followed by '/' or '*'. + */ + + if (ch == '/' || ch == '*') { + return s_req_path; + } + + if (IS_ALPHA(ch)) { + return s_req_schema; + } + + break; + + case s_req_schema: + if (IS_ALPHA(ch)) { + return s; + } + + if (ch == ':') { + return s_req_schema_slash; + } + + break; + + case s_req_schema_slash: + if (ch == '/') { + return s_req_schema_slash_slash; + } + + break; + + case s_req_schema_slash_slash: + if (ch == '/') { + return s_req_server_start; + } + + break; + + case s_req_server_with_at: + if (ch == '@') { + return s_dead; + } + + /* FALLTHROUGH */ + case s_req_server_start: + case s_req_server: + if (ch == '/') { + return s_req_path; + } + + if (ch == '?') { + return s_req_query_string_start; + } + + if (ch == '@') { + return s_req_server_with_at; + } + + if (IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') { + return s_req_server; + } + + break; + + case s_req_path: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + return s_req_query_string_start; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_query_string_start: + case s_req_query_string: + if (IS_URL_CHAR(ch)) { + return s_req_query_string; + } + + switch (ch) { + case '?': + /* allow extra '?' in query string */ + return s_req_query_string; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_fragment_start: + if (IS_URL_CHAR(ch)) { + return s_req_fragment; + } + + switch (ch) { + case '?': + return s_req_fragment; + + case '#': + return s; + } + + break; + + case s_req_fragment: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + case '#': + return s; + } + + break; + + default: + break; + } + + /* We should never fall out of the switch above unless there's an error */ + return s_dead; +} + +size_t http_parser_execute (http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len) +{ + char c, ch; + int8_t unhex_val; + const char *p = data; + const char *header_field_mark = 0; + const char *header_value_mark = 0; + const char *url_mark = 0; + const char *body_mark = 0; + + /* We're in an error state. Don't bother doing anything. */ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return 0; + } + + if (len == 0) { + switch (parser->state) { + case s_body_identity_eof: + /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if + * we got paused. + */ + CALLBACK_NOTIFY_NOADVANCE(message_complete); + return 0; + + case s_dead: + case s_start_req_or_res: + case s_start_res: + case s_start_req: + return 0; + + default: + SET_ERRNO(HPE_INVALID_EOF_STATE); + return 1; + } + } + + + if (parser->state == s_header_field) + header_field_mark = data; + if (parser->state == s_header_value) + header_value_mark = data; + switch (parser->state) { + case s_req_path: + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + case s_req_server: + case s_req_server_with_at: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + url_mark = data; + break; + } + + for (p=data; p != data + len; p++) { + ch = *p; + + if (PARSING_HEADER(parser->state)) { + ++parser->nread; + /* Buffer overflow attack */ + if (parser->nread > HTTP_MAX_HEADER_SIZE) { + SET_ERRNO(HPE_HEADER_OVERFLOW); + goto error; + } + } + + reexecute_byte: + switch (parser->state) { + + case s_dead: + /* this state is used after a 'Connection: close' message + * the parser will error out if it reads another message + */ + if (ch == CR || ch == LF) + break; + + SET_ERRNO(HPE_CLOSED_CONNECTION); + goto error; + + case s_start_req_or_res: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (ch == 'H') { + parser->state = s_res_or_resp_H; + + CALLBACK_NOTIFY(message_begin); + } else { + parser->type = HTTP_REQUEST; + parser->state = s_start_req; + goto reexecute_byte; + } + + break; + } + + case s_res_or_resp_H: + if (ch == 'T') { + parser->type = HTTP_RESPONSE; + parser->state = s_res_HT; + } else { + if (ch != 'E') { + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + parser->type = HTTP_REQUEST; + parser->method = HTTP_HEAD; + parser->index = 2; + parser->state = s_req_method; + } + break; + + case s_start_res: + { + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + switch (ch) { + case 'H': + parser->state = s_res_H; + break; + + case CR: + case LF: + break; + + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + CALLBACK_NOTIFY(message_begin); + break; + } + + case s_res_H: + STRICT_CHECK(ch != 'T'); + parser->state = s_res_HT; + break; + + case s_res_HT: + STRICT_CHECK(ch != 'T'); + parser->state = s_res_HTT; + break; + + case s_res_HTT: + STRICT_CHECK(ch != 'P'); + parser->state = s_res_HTTP; + break; + + case s_res_HTTP: + STRICT_CHECK(ch != '/'); + parser->state = s_res_first_http_major; + break; + + case s_res_first_http_major: + if (ch < '0' || ch > '9') { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + parser->state = s_res_http_major; + break; + + /* major HTTP version or dot */ + case s_res_http_major: + { + if (ch == '.') { + parser->state = s_res_first_http_minor; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major *= 10; + parser->http_major += ch - '0'; + + if (parser->http_major > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* first digit of minor HTTP version */ + case s_res_first_http_minor: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + parser->state = s_res_http_minor; + break; + + /* minor HTTP version or end of request line */ + case s_res_http_minor: + { + if (ch == ' ') { + parser->state = s_res_first_status_code; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor *= 10; + parser->http_minor += ch - '0'; + + if (parser->http_minor > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + case s_res_first_status_code: + { + if (!IS_NUM(ch)) { + if (ch == ' ') { + break; + } + + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + parser->status_code = ch - '0'; + parser->state = s_res_status_code; + break; + } + + case s_res_status_code: + { + if (!IS_NUM(ch)) { + switch (ch) { + case ' ': + parser->state = s_res_status; + break; + case CR: + parser->state = s_res_line_almost_done; + break; + case LF: + parser->state = s_header_field_start; + break; + default: + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + break; + } + + parser->status_code *= 10; + parser->status_code += ch - '0'; + + if (parser->status_code > 999) { + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + + break; + } + + case s_res_status: + /* the human readable status. e.g. "NOT FOUND" + * we are not humans so just ignore this */ + if (ch == CR) { + parser->state = s_res_line_almost_done; + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + break; + } + break; + + case s_res_line_almost_done: + STRICT_CHECK(ch != LF); + parser->state = s_header_field_start; + CALLBACK_NOTIFY(status_complete); + break; + + case s_start_req: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (!IS_ALPHA(ch)) { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + parser->method = (enum http_method) 0; + parser->index = 1; + switch (ch) { + case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; + case 'D': parser->method = HTTP_DELETE; break; + case 'G': parser->method = HTTP_GET; break; + case 'H': parser->method = HTTP_HEAD; break; + case 'L': parser->method = HTTP_LOCK; break; + case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break; + case 'N': parser->method = HTTP_NOTIFY; break; + case 'O': parser->method = HTTP_OPTIONS; break; + case 'P': parser->method = HTTP_POST; + /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ + break; + case 'R': parser->method = HTTP_REPORT; break; + case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break; + case 'T': parser->method = HTTP_TRACE; break; + case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break; + default: + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + parser->state = s_req_method; + + CALLBACK_NOTIFY(message_begin); + + break; + } + + case s_req_method: + { + const char *matcher; + if (ch == '\0') { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + matcher = method_strings[parser->method]; + if (ch == ' ' && matcher[parser->index] == '\0') { + parser->state = s_req_spaces_before_url; + } else if (ch == matcher[parser->index]) { + ; /* nada */ + } else if (parser->method == HTTP_CONNECT) { + if (parser->index == 1 && ch == 'H') { + parser->method = HTTP_CHECKOUT; + } else if (parser->index == 2 && ch == 'P') { + parser->method = HTTP_COPY; + } else { + goto error; + } + } else if (parser->method == HTTP_MKCOL) { + if (parser->index == 1 && ch == 'O') { + parser->method = HTTP_MOVE; + } else if (parser->index == 1 && ch == 'E') { + parser->method = HTTP_MERGE; + } else if (parser->index == 1 && ch == '-') { + parser->method = HTTP_MSEARCH; + } else if (parser->index == 2 && ch == 'A') { + parser->method = HTTP_MKACTIVITY; + } else { + goto error; + } + } else if (parser->method == HTTP_SUBSCRIBE) { + if (parser->index == 1 && ch == 'E') { + parser->method = HTTP_SEARCH; + } else { + goto error; + } + } else if (parser->index == 1 && parser->method == HTTP_POST) { + if (ch == 'R') { + parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */ + } else if (ch == 'U') { + parser->method = HTTP_PUT; /* or HTTP_PURGE */ + } else if (ch == 'A') { + parser->method = HTTP_PATCH; + } else { + goto error; + } + } else if (parser->index == 2) { + if (parser->method == HTTP_PUT) { + if (ch == 'R') parser->method = HTTP_PURGE; + } else if (parser->method == HTTP_UNLOCK) { + if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE; + } + } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') { + parser->method = HTTP_PROPPATCH; + } else { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + ++parser->index; + break; + } + + case s_req_spaces_before_url: + { + if (ch == ' ') break; + + MARK(url); + if (parser->method == HTTP_CONNECT) { + parser->state = s_req_server_start; + } + + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + + break; + } + + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + { + switch (ch) { + /* No whitespace allowed here */ + case ' ': + case CR: + case LF: + SET_ERRNO(HPE_INVALID_URL); + goto error; + default: + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + + break; + } + + case s_req_server: + case s_req_server_with_at: + case s_req_path: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + { + switch (ch) { + case ' ': + parser->state = s_req_http_start; + CALLBACK_DATA(url); + break; + case CR: + case LF: + parser->http_major = 0; + parser->http_minor = 9; + parser->state = (ch == CR) ? + s_req_line_almost_done : + s_header_field_start; + CALLBACK_DATA(url); + break; + default: + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + break; + } + + case s_req_http_start: + switch (ch) { + case 'H': + parser->state = s_req_http_H; + break; + case ' ': + break; + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + break; + + case s_req_http_H: + STRICT_CHECK(ch != 'T'); + parser->state = s_req_http_HT; + break; + + case s_req_http_HT: + STRICT_CHECK(ch != 'T'); + parser->state = s_req_http_HTT; + break; + + case s_req_http_HTT: + STRICT_CHECK(ch != 'P'); + parser->state = s_req_http_HTTP; + break; + + case s_req_http_HTTP: + STRICT_CHECK(ch != '/'); + parser->state = s_req_first_http_major; + break; + + /* first digit of major HTTP version */ + case s_req_first_http_major: + if (ch < '1' || ch > '9') { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + parser->state = s_req_http_major; + break; + + /* major HTTP version or dot */ + case s_req_http_major: + { + if (ch == '.') { + parser->state = s_req_first_http_minor; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major *= 10; + parser->http_major += ch - '0'; + + if (parser->http_major > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* first digit of minor HTTP version */ + case s_req_first_http_minor: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + parser->state = s_req_http_minor; + break; + + /* minor HTTP version or end of request line */ + case s_req_http_minor: + { + if (ch == CR) { + parser->state = s_req_line_almost_done; + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + break; + } + + /* XXX allow spaces after digit? */ + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor *= 10; + parser->http_minor += ch - '0'; + + if (parser->http_minor > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* end of request line */ + case s_req_line_almost_done: + { + if (ch != LF) { + SET_ERRNO(HPE_LF_EXPECTED); + goto error; + } + + parser->state = s_header_field_start; + break; + } + + case s_header_field_start: + { + if (ch == CR) { + parser->state = s_headers_almost_done; + break; + } + + if (ch == LF) { + /* they might be just sending \n instead of \r\n so this would be + * the second \n to denote the end of headers*/ + parser->state = s_headers_almost_done; + goto reexecute_byte; + } + + c = TOKEN(ch); + + if (!c) { + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + MARK(header_field); + + parser->index = 0; + parser->state = s_header_field; + + switch (c) { + case 'c': + parser->header_state = h_C; + break; + + case 'p': + parser->header_state = h_matching_proxy_connection; + break; + + case 't': + parser->header_state = h_matching_transfer_encoding; + break; + + case 'u': + parser->header_state = h_matching_upgrade; + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_field: + { + c = TOKEN(ch); + + if (c) { + switch (parser->header_state) { + case h_general: + break; + + case h_C: + parser->index++; + parser->header_state = (c == 'o' ? h_CO : h_general); + break; + + case h_CO: + parser->index++; + parser->header_state = (c == 'n' ? h_CON : h_general); + break; + + case h_CON: + parser->index++; + switch (c) { + case 'n': + parser->header_state = h_matching_connection; + break; + case 't': + parser->header_state = h_matching_content_length; + break; + default: + parser->header_state = h_general; + break; + } + break; + + /* connection */ + + case h_matching_connection: + parser->index++; + if (parser->index > sizeof(CONNECTION)-1 + || c != CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* proxy-connection */ + + case h_matching_proxy_connection: + parser->index++; + if (parser->index > sizeof(PROXY_CONNECTION)-1 + || c != PROXY_CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* content-length */ + + case h_matching_content_length: + parser->index++; + if (parser->index > sizeof(CONTENT_LENGTH)-1 + || c != CONTENT_LENGTH[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { + parser->header_state = h_content_length; + } + break; + + /* transfer-encoding */ + + case h_matching_transfer_encoding: + parser->index++; + if (parser->index > sizeof(TRANSFER_ENCODING)-1 + || c != TRANSFER_ENCODING[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { + parser->header_state = h_transfer_encoding; + } + break; + + /* upgrade */ + + case h_matching_upgrade: + parser->index++; + if (parser->index > sizeof(UPGRADE)-1 + || c != UPGRADE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(UPGRADE)-2) { + parser->header_state = h_upgrade; + } + break; + + case h_connection: + case h_content_length: + case h_transfer_encoding: + case h_upgrade: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + assert(0 && "Unknown header_state"); + break; + } + break; + } + + if (ch == ':') { + parser->state = s_header_value_start; + CALLBACK_DATA(header_field); + break; + } + + if (ch == CR) { + parser->state = s_header_almost_done; + CALLBACK_DATA(header_field); + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + CALLBACK_DATA(header_field); + break; + } + + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + case s_header_value_start: + { + if (ch == ' ' || ch == '\t') break; + + MARK(header_value); + + parser->state = s_header_value; + parser->index = 0; + + if (ch == CR) { + parser->header_state = h_general; + parser->state = s_header_almost_done; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + CALLBACK_DATA(header_value); + break; + } + + c = LOWER(ch); + + switch (parser->header_state) { + case h_upgrade: + parser->flags |= F_UPGRADE; + parser->header_state = h_general; + break; + + case h_transfer_encoding: + /* looking for 'Transfer-Encoding: chunked' */ + if ('c' == c) { + parser->header_state = h_matching_transfer_encoding_chunked; + } else { + parser->header_state = h_general; + } + break; + + case h_content_length: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = ch - '0'; + break; + + case h_connection: + /* looking for 'Connection: keep-alive' */ + if (c == 'k') { + parser->header_state = h_matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (c == 'c') { + parser->header_state = h_matching_connection_close; + } else { + parser->header_state = h_general; + } + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_value: + { + + if (ch == CR) { + parser->state = s_header_almost_done; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + parser->state = s_header_almost_done; + CALLBACK_DATA_NOADVANCE(header_value); + goto reexecute_byte; + } + + c = LOWER(ch); + + switch (parser->header_state) { + case h_general: + break; + + case h_connection: + case h_transfer_encoding: + assert(0 && "Shouldn't get here."); + break; + + case h_content_length: + { + uint64_t t; + + if (ch == ' ') break; + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + t = parser->content_length; + t *= 10; + t += ch - '0'; + + /* Overflow? */ + if (t < parser->content_length || t == ULLONG_MAX) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + /* Transfer-Encoding: chunked */ + case h_matching_transfer_encoding_chunked: + parser->index++; + if (parser->index > sizeof(CHUNKED)-1 + || c != CHUNKED[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CHUNKED)-2) { + parser->header_state = h_transfer_encoding_chunked; + } + break; + + /* looking for 'Connection: keep-alive' */ + case h_matching_connection_keep_alive: + parser->index++; + if (parser->index > sizeof(KEEP_ALIVE)-1 + || c != KEEP_ALIVE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(KEEP_ALIVE)-2) { + parser->header_state = h_connection_keep_alive; + } + break; + + /* looking for 'Connection: close' */ + case h_matching_connection_close: + parser->index++; + if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CLOSE)-2) { + parser->header_state = h_connection_close; + } + break; + + case h_transfer_encoding_chunked: + case h_connection_keep_alive: + case h_connection_close: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + parser->state = s_header_value; + parser->header_state = h_general; + break; + } + break; + } + + case s_header_almost_done: + { + STRICT_CHECK(ch != LF); + + parser->state = s_header_value_lws; + + switch (parser->header_state) { + case h_connection_keep_alive: + parser->flags |= F_CONNECTION_KEEP_ALIVE; + break; + case h_connection_close: + parser->flags |= F_CONNECTION_CLOSE; + break; + case h_transfer_encoding_chunked: + parser->flags |= F_CHUNKED; + break; + default: + break; + } + + break; + } + + case s_header_value_lws: + { + if (ch == ' ' || ch == '\t') + parser->state = s_header_value_start; + else + { + parser->state = s_header_field_start; + goto reexecute_byte; + } + break; + } + + case s_headers_almost_done: + { + STRICT_CHECK(ch != LF); + + if (parser->flags & F_TRAILING) { + /* End of a chunked request */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + break; + } + + parser->state = s_headers_done; + + /* Set this here so that on_headers_complete() callbacks can see it */ + parser->upgrade = + (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT); + + /* Here we call the headers_complete callback. This is somewhat + * different than other callbacks because if the user returns 1, we + * will interpret that as saying that this message has no body. This + * is needed for the annoying case of recieving a response to a HEAD + * request. + * + * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so + * we have to simulate it by handling a change in errno below. + */ + if (settings->on_headers_complete) { + switch (settings->on_headers_complete(parser)) { + case 0: + break; + + case 1: + parser->flags |= F_SKIPBODY; + break; + + default: + SET_ERRNO(HPE_CB_headers_complete); + return p - data; /* Error */ + } + } + + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return p - data; + } + + goto reexecute_byte; + } + + case s_headers_done: + { + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + /* Exit, the rest of the connect is in a different protocol. */ + if (parser->upgrade) { + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + return (p - data) + 1; + } + + if (parser->flags & F_SKIPBODY) { + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else if (parser->flags & F_CHUNKED) { + /* chunked encoding - ignore Content-Length header */ + parser->state = s_chunk_size_start; + } else { + if (parser->content_length == 0) { + /* Content-Length header given but zero: Content-Length: 0\r\n */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else if (parser->content_length != ULLONG_MAX) { + /* Content-Length header given and non-zero */ + parser->state = s_body_identity; + } else { + if (parser->type == HTTP_REQUEST || + !http_message_needs_eof(parser)) { + /* Assume content-length 0 - read the next */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else { + /* Read body until EOF */ + parser->state = s_body_identity_eof; + } + } + } + + break; + } + + case s_body_identity: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* The difference between advancing content_length and p is because + * the latter will automaticaly advance on the next loop iteration. + * Further, if content_length ends up at 0, we want to see the last + * byte again for our message complete callback. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + parser->state = s_message_done; + + /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. + * + * The alternative to doing this is to wait for the next byte to + * trigger the data callback, just as in every other case. The + * problem with this is that this makes it difficult for the test + * harness to distinguish between complete-on-EOF and + * complete-on-length. It's not clear that this distinction is + * important for applications, but let's keep it for now. + */ + CALLBACK_DATA_(body, p - body_mark + 1, p - data); + goto reexecute_byte; + } + + break; + } + + /* read until EOF */ + case s_body_identity_eof: + MARK(body); + p = data + len - 1; + + break; + + case s_message_done: + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + break; + + case s_chunk_size_start: + { + assert(parser->nread == 1); + assert(parser->flags & F_CHUNKED); + + unhex_val = unhex[(unsigned char)ch]; + if (unhex_val == -1) { + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + parser->content_length = unhex_val; + parser->state = s_chunk_size; + break; + } + + case s_chunk_size: + { + uint64_t t; + + assert(parser->flags & F_CHUNKED); + + if (ch == CR) { + parser->state = s_chunk_size_almost_done; + break; + } + + unhex_val = unhex[(unsigned char)ch]; + + if (unhex_val == -1) { + if (ch == ';' || ch == ' ') { + parser->state = s_chunk_parameters; + break; + } + + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + t = parser->content_length; + t *= 16; + t += unhex_val; + + /* Overflow? */ + if (t < parser->content_length || t == ULLONG_MAX) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + case s_chunk_parameters: + { + assert(parser->flags & F_CHUNKED); + /* just ignore this shit. TODO check for overflow */ + if (ch == CR) { + parser->state = s_chunk_size_almost_done; + break; + } + break; + } + + case s_chunk_size_almost_done: + { + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + if (parser->content_length == 0) { + parser->flags |= F_TRAILING; + parser->state = s_header_field_start; + } else { + parser->state = s_chunk_data; + } + break; + } + + case s_chunk_data: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->flags & F_CHUNKED); + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* See the explanation in s_body_identity for why the content + * length and data pointers are managed this way. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + parser->state = s_chunk_data_almost_done; + } + + break; + } + + case s_chunk_data_almost_done: + assert(parser->flags & F_CHUNKED); + assert(parser->content_length == 0); + STRICT_CHECK(ch != CR); + parser->state = s_chunk_data_done; + CALLBACK_DATA(body); + break; + + case s_chunk_data_done: + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + parser->nread = 0; + parser->state = s_chunk_size_start; + break; + + default: + assert(0 && "unhandled state"); + SET_ERRNO(HPE_INVALID_INTERNAL_STATE); + goto error; + } + } + + /* Run callbacks for any marks that we have leftover after we ran our of + * bytes. There should be at most one of these set, so it's OK to invoke + * them in series (unset marks will not result in callbacks). + * + * We use the NOADVANCE() variety of callbacks here because 'p' has already + * overflowed 'data' and this allows us to correct for the off-by-one that + * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' + * value that's in-bounds). + */ + + assert(((header_field_mark ? 1 : 0) + + (header_value_mark ? 1 : 0) + + (url_mark ? 1 : 0) + + (body_mark ? 1 : 0)) <= 1); + + CALLBACK_DATA_NOADVANCE(header_field); + CALLBACK_DATA_NOADVANCE(header_value); + CALLBACK_DATA_NOADVANCE(url); + CALLBACK_DATA_NOADVANCE(body); + + return len; + +error: + if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { + SET_ERRNO(HPE_UNKNOWN); + } + + return (p - data); +} + + +/* Does the parser need to see an EOF to find the end of the message? */ +int +http_message_needs_eof (const http_parser *parser) +{ + if (parser->type == HTTP_REQUEST) { + return 0; + } + + /* See RFC 2616 section 4.4 */ + if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ + parser->status_code == 204 || /* No Content */ + parser->status_code == 304 || /* Not Modified */ + parser->flags & F_SKIPBODY) { /* response to a HEAD request */ + return 0; + } + + if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { + return 0; + } + + return 1; +} + + +int +http_should_keep_alive (const http_parser *parser) +{ + if (parser->http_major > 0 && parser->http_minor > 0) { + /* HTTP/1.1 */ + if (parser->flags & F_CONNECTION_CLOSE) { + return 0; + } + } else { + /* HTTP/1.0 or earlier */ + if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { + return 0; + } + } + + return !http_message_needs_eof(parser); +} + + +const char * +http_method_str (enum http_method m) +{ + return ELEM_AT(method_strings, m, "<unknown>"); +} + + +void +http_parser_init (http_parser *parser, enum http_parser_type t) +{ + void *data = parser->data; /* preserve application data */ + memset(parser, 0, sizeof(*parser)); + parser->data = data; + parser->type = t; + parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); + parser->http_errno = HPE_OK; +} + +const char * +http_errno_name(enum http_errno err) { + assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); + return http_strerror_tab[err].name; +} + +const char * +http_errno_description(enum http_errno err) { + assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); + return http_strerror_tab[err].description; +} + +static enum http_host_state +http_parse_host_char(enum http_host_state s, const char ch) { + switch(s) { + case s_http_userinfo: + case s_http_userinfo_start: + if (ch == '@') { + return s_http_host_start; + } + + if (IS_USERINFO_CHAR(ch)) { + return s_http_userinfo; + } + break; + + case s_http_host_start: + if (ch == '[') { + return s_http_host_v6_start; + } + + if (IS_HOST_CHAR(ch)) { + return s_http_host; + } + + break; + + case s_http_host: + if (IS_HOST_CHAR(ch)) { + return s_http_host; + } + + /* FALLTHROUGH */ + case s_http_host_v6_end: + if (ch == ':') { + return s_http_host_port_start; + } + + break; + + case s_http_host_v6: + if (ch == ']') { + return s_http_host_v6_end; + } + + /* FALLTHROUGH */ + case s_http_host_v6_start: + if (IS_HEX(ch) || ch == ':' || ch == '.') { + return s_http_host_v6; + } + + break; + + case s_http_host_port: + case s_http_host_port_start: + if (IS_NUM(ch)) { + return s_http_host_port; + } + + break; + + default: + break; + } + return s_http_host_dead; +} + +static int +http_parse_host(const char * buf, struct http_parser_url *u, int found_at) { + enum http_host_state s; + + const char *p; + size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len; + + u->field_data[UF_HOST].len = 0; + + s = found_at ? s_http_userinfo_start : s_http_host_start; + + for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) { + enum http_host_state new_s = http_parse_host_char(s, *p); + + if (new_s == s_http_host_dead) { + return 1; + } + + switch(new_s) { + case s_http_host: + if (s != s_http_host) { + u->field_data[UF_HOST].off = p - buf; + } + u->field_data[UF_HOST].len++; + break; + + case s_http_host_v6: + if (s != s_http_host_v6) { + u->field_data[UF_HOST].off = p - buf; + } + u->field_data[UF_HOST].len++; + break; + + case s_http_host_port: + if (s != s_http_host_port) { + u->field_data[UF_PORT].off = p - buf; + u->field_data[UF_PORT].len = 0; + u->field_set |= (1 << UF_PORT); + } + u->field_data[UF_PORT].len++; + break; + + case s_http_userinfo: + if (s != s_http_userinfo) { + u->field_data[UF_USERINFO].off = p - buf ; + u->field_data[UF_USERINFO].len = 0; + u->field_set |= (1 << UF_USERINFO); + } + u->field_data[UF_USERINFO].len++; + break; + + default: + break; + } + s = new_s; + } + + /* Make sure we don't end somewhere unexpected */ + switch (s) { + case s_http_host_start: + case s_http_host_v6_start: + case s_http_host_v6: + case s_http_host_port_start: + case s_http_userinfo: + case s_http_userinfo_start: + return 1; + default: + break; + } + + return 0; +} + +int +http_parser_parse_url(const char *buf, size_t buflen, int is_connect, + struct http_parser_url *u) +{ + enum state s; + const char *p; + enum http_parser_url_fields uf, old_uf; + int found_at = 0; + + u->port = u->field_set = 0; + s = is_connect ? s_req_server_start : s_req_spaces_before_url; + uf = old_uf = UF_MAX; + + for (p = buf; p < buf + buflen; p++) { + s = parse_url_char(s, *p); + + /* Figure out the next field that we're operating on */ + switch (s) { + case s_dead: + return 1; + + /* Skip delimeters */ + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + case s_req_query_string_start: + case s_req_fragment_start: + continue; + + case s_req_schema: + uf = UF_SCHEMA; + break; + + case s_req_server_with_at: + found_at = 1; + + /* FALLTROUGH */ + case s_req_server: + uf = UF_HOST; + break; + + case s_req_path: + uf = UF_PATH; + break; + + case s_req_query_string: + uf = UF_QUERY; + break; + + case s_req_fragment: + uf = UF_FRAGMENT; + break; + + default: + assert(!"Unexpected state"); + return 1; + } + + /* Nothing's changed; soldier on */ + if (uf == old_uf) { + u->field_data[uf].len++; + continue; + } + + u->field_data[uf].off = p - buf; + u->field_data[uf].len = 1; + + u->field_set |= (1 << uf); + old_uf = uf; + } + + /* host must be present if there is a schema */ + /* parsing http:///toto will fail */ + if ((u->field_set & ((1 << UF_SCHEMA) | (1 << UF_HOST))) != 0) { + if (http_parse_host(buf, u, found_at) != 0) { + return 1; + } + } + + /* CONNECT requests can only contain "hostname:port" */ + if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { + return 1; + } + + if (u->field_set & (1 << UF_PORT)) { + /* Don't bother with endp; we've already validated the string */ + unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10); + + /* Ports have a max value of 2^16 */ + if (v > 0xffff) { + return 1; + } + + u->port = (uint16_t) v; + } + + return 0; +} + +void +http_parser_pause(http_parser *parser, int paused) { + /* Users should only be pausing/unpausing a parser that is not in an error + * state. In non-debug builds, there's not much that we can do about this + * other than ignore it. + */ + if (HTTP_PARSER_ERRNO(parser) == HPE_OK || + HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { + SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); + } else { + assert(0 && "Attempting to pause parser in error state"); + } +} + +int +http_body_is_final(const struct http_parser *parser) { + return parser->state == s_message_done; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.gyp b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.gyp new file mode 100644 index 000000000000..c6eada707f27 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.gyp @@ -0,0 +1,79 @@ +# This file is used with the GYP meta build system. +# http://code.google.com/p/gyp/ +# To build try this: +# svn co http://gyp.googlecode.com/svn/trunk gyp +# ./gyp/gyp -f make --depth=`pwd` http_parser.gyp +# ./out/Debug/test +{ + 'target_defaults': { + 'default_configuration': 'Debug', + 'configurations': { + # TODO: hoist these out and put them somewhere common, because + # RuntimeLibrary MUST MATCH across the entire project + 'Debug': { + 'defines': [ 'DEBUG', '_DEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 1, # static debug + }, + }, + }, + 'Release': { + 'defines': [ 'NDEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 0, # static release + }, + }, + } + }, + 'msvs_settings': { + 'VCCLCompilerTool': { + }, + 'VCLibrarianTool': { + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'conditions': [ + ['OS == "win"', { + 'defines': [ + 'WIN32' + ], + }] + ], + }, + + 'targets': [ + { + 'target_name': 'http_parser', + 'type': 'static_library', + 'include_dirs': [ '.' ], + 'direct_dependent_settings': { + 'include_dirs': [ '.' ], + }, + 'defines': [ 'HTTP_PARSER_STRICT=0' ], + 'sources': [ './http_parser.c', ], + 'conditions': [ + ['OS=="win"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + # Compile as C++. http_parser.c is actually C99, but C++ is + # close enough in this case. + 'CompileAs': 2, + }, + }, + }] + ], + }, + + { + 'target_name': 'test', + 'type': 'executable', + 'dependencies': [ 'http_parser' ], + 'sources': [ 'test.c' ] + } + ] +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h new file mode 100644 index 000000000000..2fff4bdd7d5e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/http_parser.h @@ -0,0 +1,304 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#ifndef http_parser_h +#define http_parser_h +#ifdef __cplusplus +extern "C" { +#endif + +#define HTTP_PARSER_VERSION_MAJOR 2 +#define HTTP_PARSER_VERSION_MINOR 0 + +#include <sys/types.h> +#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) +#include <BaseTsd.h> +#include <stddef.h> +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +#include <stdint.h> +#endif + +/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run + * faster + */ +#ifndef HTTP_PARSER_STRICT +# define HTTP_PARSER_STRICT 1 +#endif + +/* Maximium header size allowed */ +#define HTTP_MAX_HEADER_SIZE (80*1024) + + +typedef struct http_parser http_parser; +typedef struct http_parser_settings http_parser_settings; + + +/* Callbacks should return non-zero to indicate an error. The parser will + * then halt execution. + * + * The one exception is on_headers_complete. In a HTTP_RESPONSE parser + * returning '1' from on_headers_complete will tell the parser that it + * should not expect a body. This is used when receiving a response to a + * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: + * chunked' headers that indicate the presence of a body. + * + * http_data_cb does not return data chunks. It will be call arbitrarally + * many times for each string. E.G. you might get 10 callbacks for "on_url" + * each providing just a few characters more data. + */ +typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); +typedef int (*http_cb) (http_parser*); + + +/* Request Methods */ +#define HTTP_METHOD_MAP(XX) \ + XX(0, DELETE, DELETE) \ + XX(1, GET, GET) \ + XX(2, HEAD, HEAD) \ + XX(3, POST, POST) \ + XX(4, PUT, PUT) \ + /* pathological */ \ + XX(5, CONNECT, CONNECT) \ + XX(6, OPTIONS, OPTIONS) \ + XX(7, TRACE, TRACE) \ + /* webdav */ \ + XX(8, COPY, COPY) \ + XX(9, LOCK, LOCK) \ + XX(10, MKCOL, MKCOL) \ + XX(11, MOVE, MOVE) \ + XX(12, PROPFIND, PROPFIND) \ + XX(13, PROPPATCH, PROPPATCH) \ + XX(14, SEARCH, SEARCH) \ + XX(15, UNLOCK, UNLOCK) \ + /* subversion */ \ + XX(16, REPORT, REPORT) \ + XX(17, MKACTIVITY, MKACTIVITY) \ + XX(18, CHECKOUT, CHECKOUT) \ + XX(19, MERGE, MERGE) \ + /* upnp */ \ + XX(20, MSEARCH, M-SEARCH) \ + XX(21, NOTIFY, NOTIFY) \ + XX(22, SUBSCRIBE, SUBSCRIBE) \ + XX(23, UNSUBSCRIBE, UNSUBSCRIBE) \ + /* RFC-5789 */ \ + XX(24, PATCH, PATCH) \ + XX(25, PURGE, PURGE) \ + +enum http_method + { +#define XX(num, name, string) HTTP_##name = num, + HTTP_METHOD_MAP(XX) +#undef XX + }; + + +enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; + + +/* Flag values for http_parser.flags field */ +enum flags + { F_CHUNKED = 1 << 0 + , F_CONNECTION_KEEP_ALIVE = 1 << 1 + , F_CONNECTION_CLOSE = 1 << 2 + , F_TRAILING = 1 << 3 + , F_UPGRADE = 1 << 4 + , F_SKIPBODY = 1 << 5 + }; + + +/* Map for errno-related constants + * + * The provided argument should be a macro that takes 2 arguments. + */ +#define HTTP_ERRNO_MAP(XX) \ + /* No error */ \ + XX(OK, "success") \ + \ + /* Callback-related errors */ \ + XX(CB_message_begin, "the on_message_begin callback failed") \ + XX(CB_status_complete, "the on_status_complete callback failed") \ + XX(CB_url, "the on_url callback failed") \ + XX(CB_header_field, "the on_header_field callback failed") \ + XX(CB_header_value, "the on_header_value callback failed") \ + XX(CB_headers_complete, "the on_headers_complete callback failed") \ + XX(CB_body, "the on_body callback failed") \ + XX(CB_message_complete, "the on_message_complete callback failed") \ + \ + /* Parsing-related errors */ \ + XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ + XX(HEADER_OVERFLOW, \ + "too many header bytes seen; overflow detected") \ + XX(CLOSED_CONNECTION, \ + "data received after completed connection: close message") \ + XX(INVALID_VERSION, "invalid HTTP version") \ + XX(INVALID_STATUS, "invalid HTTP status code") \ + XX(INVALID_METHOD, "invalid HTTP method") \ + XX(INVALID_URL, "invalid URL") \ + XX(INVALID_HOST, "invalid host") \ + XX(INVALID_PORT, "invalid port") \ + XX(INVALID_PATH, "invalid path") \ + XX(INVALID_QUERY_STRING, "invalid query string") \ + XX(INVALID_FRAGMENT, "invalid fragment") \ + XX(LF_EXPECTED, "LF character expected") \ + XX(INVALID_HEADER_TOKEN, "invalid character in header") \ + XX(INVALID_CONTENT_LENGTH, \ + "invalid character in content-length header") \ + XX(INVALID_CHUNK_SIZE, \ + "invalid character in chunk size header") \ + XX(INVALID_CONSTANT, "invalid constant string") \ + XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ + XX(STRICT, "strict mode assertion failed") \ + XX(PAUSED, "parser is paused") \ + XX(UNKNOWN, "an unknown error occurred") + + +/* Define HPE_* values for each errno value above */ +#define HTTP_ERRNO_GEN(n, s) HPE_##n, +enum http_errno { + HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) +}; +#undef HTTP_ERRNO_GEN + + +/* Get an http_errno value from an http_parser */ +#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) + + +struct http_parser { + /** PRIVATE **/ + unsigned char type : 2; /* enum http_parser_type */ + unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */ + unsigned char state; /* enum state from http_parser.c */ + unsigned char header_state; /* enum header_state from http_parser.c */ + unsigned char index; /* index into current matcher */ + + uint32_t nread; /* # bytes read in various scenarios */ + uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */ + + /** READ-ONLY **/ + unsigned short http_major; + unsigned short http_minor; + unsigned short status_code; /* responses only */ + unsigned char method; /* requests only */ + unsigned char http_errno : 7; + + /* 1 = Upgrade header was present and the parser has exited because of that. + * 0 = No upgrade header present. + * Should be checked when http_parser_execute() returns in addition to + * error checking. + */ + unsigned char upgrade : 1; + + /** PUBLIC **/ + void *data; /* A pointer to get hook to the "connection" or "socket" object */ +}; + + +struct http_parser_settings { + http_cb on_message_begin; + http_data_cb on_url; + http_cb on_status_complete; + http_data_cb on_header_field; + http_data_cb on_header_value; + http_cb on_headers_complete; + http_data_cb on_body; + http_cb on_message_complete; +}; + + +enum http_parser_url_fields + { UF_SCHEMA = 0 + , UF_HOST = 1 + , UF_PORT = 2 + , UF_PATH = 3 + , UF_QUERY = 4 + , UF_FRAGMENT = 5 + , UF_USERINFO = 6 + , UF_MAX = 7 + }; + + +/* Result structure for http_parser_parse_url(). + * + * Callers should index into field_data[] with UF_* values iff field_set + * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and + * because we probably have padding left over), we convert any port to + * a uint16_t. + */ +struct http_parser_url { + uint16_t field_set; /* Bitmask of (1 << UF_*) values */ + uint16_t port; /* Converted UF_PORT string */ + + struct { + uint16_t off; /* Offset into buffer in which field starts */ + uint16_t len; /* Length of run in buffer */ + } field_data[UF_MAX]; +}; + + +void http_parser_init(http_parser *parser, enum http_parser_type type); + + +size_t http_parser_execute(http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len); + + +/* If http_should_keep_alive() in the on_headers_complete or + * on_message_complete callback returns 0, then this should be + * the last message on the connection. + * If you are the server, respond with the "Connection: close" header. + * If you are the client, close the connection. + */ +int http_should_keep_alive(const http_parser *parser); + +/* Returns a string version of the HTTP method. */ +const char *http_method_str(enum http_method m); + +/* Return a string name of the given error */ +const char *http_errno_name(enum http_errno err); + +/* Return a string description of the given error */ +const char *http_errno_description(enum http_errno err); + +/* Parse a URL; return nonzero on failure */ +int http_parser_parse_url(const char *buf, size_t buflen, + int is_connect, + struct http_parser_url *u); + +/* Pause or un-pause the parser; a nonzero value pauses */ +void http_parser_pause(http_parser *parser, int paused); + +/* Checks if this is the final chunk of the body. */ +int http_body_is_final(const http_parser *parser); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/Http-parser.java.iml b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/Http-parser.java.iml new file mode 100644 index 000000000000..741121a85ea9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/Http-parser.java.iml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/impl" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../ext/primitives.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + </component> +</module> + diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/FieldData.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/FieldData.java new file mode 100644 index 000000000000..774179fb8203 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/FieldData.java @@ -0,0 +1,41 @@ +package http_parser; + +public class FieldData { + public int off; + public int len; + + public FieldData(){} + + public FieldData(int off, int len){ + this.off = off; + this.len = len; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + FieldData fieldData = (FieldData) o; + + if (len != fieldData.len) return false; + if (off != fieldData.off) return false; + + return true; + } + + @Override + public int hashCode() { + int result = off; + result = 31 * result + len; + return result; + } + + @Override + public String toString() { + return "FieldData{" + + "off=" + off + + ", len=" + len + + '}'; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPCallback.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPCallback.java new file mode 100644 index 000000000000..5380b0fa8d01 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPCallback.java @@ -0,0 +1,8 @@ +package http_parser; + +public abstract class HTTPCallback implements http_parser.lolevel.HTTPCallback{ + public int cb (http_parser.lolevel.HTTPParser parser) { + return this.cb((HTTPParser)parser); + } + public abstract int cb (HTTPParser parser); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPDataCallback.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPDataCallback.java new file mode 100644 index 000000000000..bfe576f1528d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPDataCallback.java @@ -0,0 +1,34 @@ +package http_parser; + +import java.nio.ByteBuffer; + +public abstract class HTTPDataCallback implements http_parser.lolevel.HTTPDataCallback{ + /* + Very raw and extremly foolhardy! DANGER! + The whole Buffer concept is difficult enough to grasp as it is, + we pass in a buffer with an arbitrary position. + + The interesting data is located at position pos and is len + bytes long. + + The contract of this callback is that the buffer is + returned in the state that it was passed in, so implementing + this require good citizenship, you'll need to remember the current + position, change the position to get at the data you're interested + in and then set the position back to how you found it... + + Therefore: there is an abstract implementation that implements + cb as described above, and provides a new callback + with signature @see cb(byte[], int, int) + */ + public int cb(http_parser.lolevel.HTTPParser p, ByteBuffer buf, int pos, int len) { + byte [] by = new byte[len]; + int saved = buf.position(); + buf.position(pos); + buf.get(by); + buf.position(saved); + return cb((HTTPParser)p, by, 0, len); + } + + public abstract int cb(HTTPParser p, byte[] by, int pos, int len); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPErrorCallback.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPErrorCallback.java new file mode 100644 index 000000000000..a74206e5bca3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPErrorCallback.java @@ -0,0 +1,12 @@ +package http_parser; + + +import java.nio.ByteBuffer; + +public abstract class HTTPErrorCallback implements http_parser.lolevel.HTTPErrorCallback{ + public void cb (http_parser.lolevel.HTTPParser parser, String mes, ByteBuffer buf, int initial_position) { + this.cb((HTTPParser)parser, Util.error(mes, buf, initial_position)); + } + + public abstract void cb(HTTPParser parser, String error); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPException.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPException.java new file mode 100644 index 000000000000..9ccaf14fad45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPException.java @@ -0,0 +1,9 @@ +package http_parser; + +@SuppressWarnings("serial") +public class HTTPException extends RuntimeException { + +public HTTPException(String mes) { + super(mes); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java new file mode 100644 index 000000000000..7c080c1f9c28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPMethod.java @@ -0,0 +1,107 @@ +package http_parser; + +import java.nio.charset.Charset; + +public enum HTTPMethod { + HTTP_DELETE("DELETE")// = 0 + , HTTP_GET("GET") + , HTTP_HEAD("HEAD") + , HTTP_POST("POST") + , HTTP_PUT("PUT") + , HTTP_PATCH("PATCH") + /* pathological */ + , HTTP_CONNECT("CONNECT") + , HTTP_OPTIONS("OPTIONS") + , HTTP_TRACE("TRACE") + /* webdav */ + , HTTP_COPY("COPY") + , HTTP_LOCK("LOCK") + , HTTP_MKCOL("MKCOL") + , HTTP_MOVE("MOVE") + , HTTP_PROPFIND("PROPFIND") + , HTTP_PROPPATCH("PROPPATCH") + , HTTP_UNLOCK("UNLOCK") + , HTTP_REPORT("REPORT") + , HTTP_MKACTIVITY("MKACTIVITY") + , HTTP_CHECKOUT("CHECKOUT") + , HTTP_MERGE("MERGE") + , HTTP_MSEARCH("M-SEARCH") + , HTTP_NOTIFY("NOTIFY") + , HTTP_SUBSCRIBE("SUBSCRIBE") + , HTTP_UNSUBSCRIBE("UNSUBSCRIBE") + , HTTP_PURGE("PURGE") + ; + + private static Charset ASCII; + static { + ASCII = Charset.forName("US-ASCII");; + } + public byte[] bytes; + + HTTPMethod(String name) { + // good grief, Charlie Brown, the following is necessary because + // java is retarded: + // illegal reference to static field from initializer + // this.bytes = name.getBytes(ASCII); + // yet it's not illegal to reference static fields from + // methods called from initializer. + init(name); + } + public static HTTPMethod parse(String s) { + if ("HTTP_DELETE".equalsIgnoreCase(s)) {return HTTP_DELETE;} + else if ("DELETE".equalsIgnoreCase(s)) {return HTTP_DELETE;} + else if ("HTTP_GET".equalsIgnoreCase(s)) {return HTTP_GET;} + else if ("GET".equalsIgnoreCase(s)) {return HTTP_GET;} + else if ("HTTP_HEAD".equalsIgnoreCase(s)) {return HTTP_HEAD;} + else if ("HEAD".equalsIgnoreCase(s)) {return HTTP_HEAD;} + else if ("HTTP_POST".equalsIgnoreCase(s)) {return HTTP_POST;} + else if ("POST".equalsIgnoreCase(s)) {return HTTP_POST;} + else if ("HTTP_PUT".equalsIgnoreCase(s)) {return HTTP_PUT;} + else if ("PUT".equalsIgnoreCase(s)) {return HTTP_PUT;} + else if ("HTTP_PATCH".equalsIgnoreCase(s)) {return HTTP_PATCH;} + else if ("PATCH".equalsIgnoreCase(s)) {return HTTP_PATCH;} + else if ("HTTP_CONNECT".equalsIgnoreCase(s)) {return HTTP_CONNECT;} + else if ("CONNECT".equalsIgnoreCase(s)) {return HTTP_CONNECT;} + else if ("HTTP_OPTIONS".equalsIgnoreCase(s)) {return HTTP_OPTIONS;} + else if ("OPTIONS".equalsIgnoreCase(s)) {return HTTP_OPTIONS;} + else if ("HTTP_TRACE".equalsIgnoreCase(s)) {return HTTP_TRACE;} + else if ("TRACE".equalsIgnoreCase(s)) {return HTTP_TRACE;} + else if ("HTTP_COPY".equalsIgnoreCase(s)) {return HTTP_COPY;} + else if ("COPY".equalsIgnoreCase(s)) {return HTTP_COPY;} + else if ("HTTP_LOCK".equalsIgnoreCase(s)) {return HTTP_LOCK;} + else if ("LOCK".equalsIgnoreCase(s)) {return HTTP_LOCK;} + else if ("HTTP_MKCOL".equalsIgnoreCase(s)) {return HTTP_MKCOL;} + else if ("MKCOL".equalsIgnoreCase(s)) {return HTTP_MKCOL;} + else if ("HTTP_MOVE".equalsIgnoreCase(s)) {return HTTP_MOVE;} + else if ("MOVE".equalsIgnoreCase(s)) {return HTTP_MOVE;} + else if ("HTTP_PROPFIND".equalsIgnoreCase(s)){return HTTP_PROPFIND;} + else if ("PROPFIND".equalsIgnoreCase(s)) {return HTTP_PROPFIND;} + else if ("HTTP_PROPPATCH".equalsIgnoreCase(s)){return HTTP_PROPPATCH;} + else if ("PROPPATCH".equalsIgnoreCase(s)) {return HTTP_PROPPATCH;} + else if ("HTTP_UNLOCK".equalsIgnoreCase(s)) {return HTTP_UNLOCK;} + else if ("UNLOCK".equalsIgnoreCase(s)) {return HTTP_UNLOCK;} + else if ("HTTP_REPORT".equalsIgnoreCase(s)) {return HTTP_REPORT;} + else if ("REPORT".equalsIgnoreCase(s)){return HTTP_REPORT;} + else if ("HTTP_MKACTIVITY".equalsIgnoreCase(s)) {return HTTP_MKACTIVITY;} + else if ("MKACTIVITY".equalsIgnoreCase(s)){return HTTP_MKACTIVITY;} + else if ("HTTP_CHECKOUT".equalsIgnoreCase(s)) {return HTTP_CHECKOUT;} + else if ("CHECKOUT".equalsIgnoreCase(s)){return HTTP_CHECKOUT;} + else if ("HTTP_MERGE".equalsIgnoreCase(s)) {return HTTP_MERGE;} + else if ("MERGE".equalsIgnoreCase(s)){return HTTP_MERGE;} + else if ("HTTP_MSEARCH".equalsIgnoreCase(s)) {return HTTP_MSEARCH;} + else if ("M-SEARCH".equalsIgnoreCase(s)) {return HTTP_MSEARCH;} + else if ("HTTP_NOTIFY".equalsIgnoreCase(s)) {return HTTP_NOTIFY;} + else if ("NOTIFY".equalsIgnoreCase(s)) {return HTTP_NOTIFY;} + else if ("HTTP_SUBSCRIBE".equalsIgnoreCase(s)) {return HTTP_SUBSCRIBE;} + else if ("SUBSCRIBE".equalsIgnoreCase(s)) {return HTTP_SUBSCRIBE;} + else if ("HTTP_UNSUBSCRIBE".equalsIgnoreCase(s)) {return HTTP_UNSUBSCRIBE;} + else if ("UNSUBSCRIBE".equalsIgnoreCase(s)) {return HTTP_UNSUBSCRIBE;} + else if ("PATCH".equalsIgnoreCase(s)) {return HTTP_PATCH;} + else if ("PURGE".equalsIgnoreCase(s)) {return HTTP_PURGE;} + else {return null;} + } + void init (String name) { + ASCII = null == ASCII ? Charset.forName("US-ASCII") : ASCII; + this.bytes = name.getBytes(ASCII); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParser.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParser.java new file mode 100644 index 000000000000..7ab4fb4d2454 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParser.java @@ -0,0 +1,36 @@ +package http_parser; + +import java.nio.ByteBuffer; + +public class HTTPParser extends http_parser.lolevel.HTTPParser { + + public HTTPParser() { super(); } + public HTTPParser(ParserType type) { super(type); } + + public int getMajor() { + return super.http_major; + } + + public int getMinor() { + return super.http_minor; + } + + public int getStatusCode() { + return super.status_code; + } + + public HTTPMethod getHTTPMethod() { + return super.method; + } + + public boolean getUpgrade() { + return super.upgrade; + } + + public boolean shouldKeepAlive() { + return super.http_should_keep_alive(); + } + public void execute(ParserSettings settings, ByteBuffer data) { + this.execute(settings.getLoLevelSettings(), data); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParserUrl.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParserUrl.java new file mode 100644 index 000000000000..d37163400d09 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/HTTPParserUrl.java @@ -0,0 +1,76 @@ +package http_parser; + +import http_parser.lolevel.*; +import http_parser.lolevel.HTTPParser; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.util.Arrays; + +/** + */ +public class HTTPParserUrl { + + public int field_set; + public int port; + + public FieldData[] field_data = new FieldData[]{ + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0) + }; //UF_MAX + + public HTTPParserUrl(){} + + public HTTPParserUrl(int field_set, int port, FieldData[] field_data){ + this.field_set = field_set; + this.port = port; + this.field_data = field_data; + } + + public String getFieldValue(HTTPParser.UrlFields field, ByteBuffer data) throws UnsupportedEncodingException { + FieldData fd = this.field_data[field.getIndex()]; + if(fd.off == 0 & fd.len == 0) return ""; + byte[] dst = new byte[fd.len]; + int current_pos = data.position(); + data.position(fd.off); + data.get(dst,0,fd.len); + data.position(current_pos); + String v = new String(dst, "UTF8"); + return v; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + HTTPParserUrl that = (HTTPParserUrl) o; + + if (field_set != that.field_set) return false; + if (port != that.port) return false; + if (!Arrays.equals(field_data, that.field_data)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = field_set; + result = 31 * result + port; + result = 31 * result + Arrays.hashCode(field_data); + return result; + } + + @Override + public String toString() { + return "HTTPParserUrl{" + + "field_set=" + field_set + + ", port=" + port + + ", field_data=" + (field_data == null ? null : Arrays.asList(field_data)) + + '}'; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java new file mode 100644 index 000000000000..9a5e6e93a383 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserSettings.java @@ -0,0 +1,256 @@ +package http_parser; + + + +import primitive.collection.ByteList; + +public class ParserSettings extends http_parser.lolevel.ParserSettings { + + public HTTPCallback on_message_begin; + public HTTPDataCallback on_path; + public HTTPDataCallback on_query_string; + public HTTPDataCallback on_url; + public HTTPDataCallback on_fragment; + public HTTPCallback on_status_complete; + public HTTPDataCallback on_header_field; + public HTTPDataCallback on_header_value; + + public HTTPCallback on_headers_complete; + public HTTPDataCallback on_body; + public HTTPCallback on_message_complete; + + public HTTPErrorCallback on_error; + + private HTTPCallback _on_message_begin; + private HTTPDataCallback _on_path; + private HTTPDataCallback _on_query_string; + private HTTPDataCallback _on_url; + private HTTPDataCallback _on_fragment; + private HTTPCallback _on_status_complete; + private HTTPDataCallback _on_header_field; + private HTTPDataCallback _on_header_value; + private HTTPCallback _on_headers_complete; + private HTTPDataCallback _on_body; + private HTTPCallback _on_message_complete; + private HTTPErrorCallback _on_error; + + private http_parser.lolevel.ParserSettings settings; + + protected ByteList field = new ByteList(); + protected ByteList value = new ByteList(); + protected ByteList body = new ByteList(); + + public ParserSettings() { + this.settings = new http_parser.lolevel.ParserSettings(); + createMirrorCallbacks(); + attachCallbacks(); + } + + protected http_parser.lolevel.ParserSettings getLoLevelSettings() { + return this.settings; + } + + private void createMirrorCallbacks() { + this._on_message_begin = new HTTPCallback() { + public int cb(HTTPParser p) { + if (null != ParserSettings.this.on_message_begin) { + return ParserSettings.this.on_message_begin.cb(p); + } + return 0; + } + }; + this._on_path = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_path) { + return ParserSettings.this.on_path.cb(p, by, pos, len); + } + return 0; + } + }; + this._on_query_string = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_query_string) { + return ParserSettings.this.on_query_string.cb(p, by, pos, len); + } + return 0; + } + }; + this._on_url = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_url) { + return ParserSettings.this.on_url.cb(p, by, pos, len); + } + return 0; + } + }; + this._on_fragment = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_fragment) { + return ParserSettings.this.on_fragment.cb(p, by, pos, len); + } + return 0; + } + }; + this._on_status_complete = new HTTPCallback() { + @Override + public int cb(HTTPParser p) { + if (null != ParserSettings.this.on_status_complete) { + return ParserSettings.this.on_status_complete.cb(p); + } + return 0; + } + }; + this._on_error = new HTTPErrorCallback() { + @Override + public void cb(HTTPParser parser, String error) { + if (null != ParserSettings.this.on_error) { + ParserSettings.this.on_error.cb(parser, error); + } else { + throw new HTTPException(error); + } + + } + }; + + + +// (on_header_field and on_header_value shortened to on_h_*) +// ------------------------ ------------ -------------------------------------------- +// | State (prev. callback) | Callback | Description/action | +// ------------------------ ------------ -------------------------------------------- +// | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | +// | | | into it | +// ------------------------ ------------ -------------------------------------------- +// | value | on_h_field | New header started. | +// | | | Copy current name,value buffers to headers | +// | | | list and allocate new buffer for new name | +// ------------------------ ------------ -------------------------------------------- +// | field | on_h_field | Previous name continues. Reallocate name | +// | | | buffer and append callback data to it | +// ------------------------ ------------ -------------------------------------------- +// | field | on_h_value | Value for current header started. Allocate | +// | | | new buffer and copy callback data to it | +// ------------------------ ------------ -------------------------------------------- +// | value | on_h_value | Value continues. Reallocate value buffer | +// | | | and append callback data to it | +// ------------------------ ------------ -------------------------------------------- + this._on_header_field = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + // previous value complete, call on_value with full value, reset value. + if (0 != ParserSettings.this.value.size()) { + // check we're even interested... + if (null != ParserSettings.this.on_header_value) { + byte [] valueArr = ParserSettings.this.value.toArray(); + int ret = ParserSettings.this.on_header_value.cb(p, valueArr, 0, valueArr.length); + if (0 != ret) { + return ret; + } + ParserSettings.this.value.clear(); + } + } + + if (null == ParserSettings.this.on_header_field) { + return 0; + } + + ParserSettings.this.field.addAll(by); + return 0; + } + }; + this._on_header_value = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + + // previous field complete, call on_field with full field value, reset field. + if (0 != ParserSettings.this.field.size()) { + // check we're even interested... + if (null != ParserSettings.this.on_header_field) { + byte [] fieldArr = ParserSettings.this.field.toArray(); + int ret = ParserSettings.this.on_header_field.cb(p, fieldArr, 0, fieldArr.length); + if (0 != ret) { + return ret; + } + ParserSettings.this.field.clear(); + } + } + + if (null == ParserSettings.this.on_header_value) { + return 0; + } + ParserSettings.this.value.addAll(by); + return 0; + } + }; + this._on_headers_complete = new HTTPCallback() { + @Override + public int cb(HTTPParser parser) { + // is there an uncompleted value ... ? + if (0 != ParserSettings.this.value.size()) { + // check we're even interested... + if (null != ParserSettings.this.on_header_value) { + byte [] valueArr = ParserSettings.this.value.toArray(); + int ret = ParserSettings.this.on_header_value.cb(parser, valueArr, 0, valueArr.length); + if (0 != ret) { + return ret; + } + ParserSettings.this.value.clear(); + } + } + if (null != ParserSettings.this.on_headers_complete) { + return ParserSettings.this.on_headers_complete.cb(parser); + } + return 0; + } + + }; + this._on_body = new HTTPDataCallback() { + @Override + public int cb(HTTPParser p, byte[] by, int pos, int len) { + if (null != ParserSettings.this.on_body) { + ParserSettings.this.body.addAll(by, pos, len); + } + return 0; + } + }; + + this._on_message_complete = new HTTPCallback() { + @Override + public int cb(HTTPParser parser) { + if (null != ParserSettings.this.on_body) { + byte [] body = ParserSettings.this.body.toArray(); + int ret = ParserSettings.this.on_body.cb(parser, body, 0, body.length); + if (0!=ret) { + return ret; + } + ParserSettings.this.body.clear(); + } + if (null != ParserSettings.this.on_message_complete) { + return ParserSettings.this.on_message_complete.cb(parser); + } + return 0; + } + }; + + } + + private void attachCallbacks() { + // these are certainly set, because we mirror them ... + this.settings.on_message_begin = this._on_message_begin; + this.settings.on_path = this._on_path; + this.settings.on_query_string = this._on_query_string; + this.settings.on_url = this._on_url; + this.settings.on_fragment = this._on_fragment; + this.settings.on_status_complete = this._on_status_complete; + this.settings.on_header_field = this._on_header_field; + this.settings.on_header_value = this._on_header_value; + this.settings.on_headers_complete = this._on_headers_complete; + this.settings.on_body = this._on_body; + this.settings.on_message_complete = this._on_message_complete; + this.settings.on_error = this._on_error; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserType.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserType.java new file mode 100644 index 000000000000..a51f5b4cdba1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/ParserType.java @@ -0,0 +1,13 @@ +package http_parser; + +public enum ParserType { +HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH; + + public static ParserType parse(String s) { + if ("HTTP_REQUEST".equalsIgnoreCase(s)) { return HTTP_REQUEST; } + else if ("HTTP_RESPONSE".equalsIgnoreCase(s)) { return HTTP_RESPONSE; } + else if ("HTTP_BOTH".equalsIgnoreCase(s)) { return HTTP_BOTH; } + else { return null; } + } +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/Util.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/Util.java new file mode 100644 index 000000000000..575003ad34b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/Util.java @@ -0,0 +1,111 @@ +package http_parser; + +import java.nio.ByteBuffer; + +public class Util { +// public static String toString(http_parser.lolevel.HTTPParser p) { +// StringBuilder builder = new StringBuilder(); +// +// // the stuff up to the break is ephermeral and only meaningful +// // while the parser is parsing. In general, this method is +// // probably only useful during debugging. +// +// builder.append("state :"); builder.append(p.state); builder.append("\n"); +// builder.append("header_state :"); builder.append(p.header_state); builder.append("\n"); +// builder.append("strict :"); builder.append(p.strict); builder.append("\n"); +// builder.append("index :"); builder.append(p.index); builder.append("\n"); +// builder.append("flags :"); builder.append(p.flags); builder.append("\n"); +// builder.append("nread :"); builder.append(p.nread); builder.append("\n"); +// builder.append("content_length :"); builder.append(p.content_length); builder.append("\n"); +// +// +// builder.append("type :"); builder.append(p.type); builder.append("\n"); +// builder.append("http_major :"); builder.append(p.http_major); builder.append("\n"); +// builder.append("http_minor :"); builder.append(p.http_minor); builder.append("\n"); +// builder.append("status_code :"); builder.append(p.status_code); builder.append("\n"); +// builder.append("method :"); builder.append(p.method); builder.append("\n"); +// builder.append("upgrade :"); builder.append(p.upgrade); builder.append("\n"); +// +// return builder.toString(); +// +// } + + public static String error (String mes, ByteBuffer b, int beginning) { + // the error message should look like this: + // + // Bla expected something, but it's not there (mes) + // GEt / HTTP 1_1 + // ............^. + // + // |----------------- 72 -------------------------| + + // This is ridiculously complicated and probably riddled with + // off-by-one errors, should be moved into high level interface. + // TODO. + + // also: need to keep track of the initial buffer position in + // execute so that we don't screw up any `mark()` that may have + // been set outside of our control to be nice. + + final int mes_width = 72; + int p = b.position(); // error position + int end = b.limit(); // this is the end + int m = end - beginning; // max mes length + + StringBuilder builder = new StringBuilder(); + int p_adj = p; + + byte [] orig = new byte[0]; + if (m <= mes_width) { + orig = new byte[m]; + b.position(beginning); + b.get(orig, 0, m); + p_adj = p-beginning; + + + } else { + // we'll need to trim bit off the beginning and/or end + orig = new byte[mes_width]; + // three possibilities: + // a.) plenty of stuff around p + // b.) plenty of stuff in front of p + // c.) plenty of stuff behind p + // CAN'T be not enough stuff aorund p in total, because + // m>meswidth (see if to this else) + + int before = p-beginning; + int after = end - p; + if ( (before > mes_width/2) && (after > mes_width/2)) { + // plenty of stuff in front of and behind error + p_adj = mes_width/2; + b.position(p - mes_width/2); + b.get(orig, 0, mes_width); + } else if (before <= mes_width/2) { + // take all of the begining. + b.position(beginning); + // and as much of the rest as possible + + b.get(orig, 0, mes_width); + + } else { + // plenty of stuff before + before = end-mes_width; + b.position(before); + p_adj = p - before; + b.get(orig, 0, mes_width); + } + } + + builder.append(new String(orig)); + builder.append("\n"); + for (int i = 0; i!= p_adj; ++i) { + builder.append("."); + } + builder.append("^"); + + + b.position(p); // restore position + return builder.toString(); + + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPCallback.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPCallback.java new file mode 100644 index 000000000000..95c29b3e7032 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPCallback.java @@ -0,0 +1,5 @@ +package http_parser.lolevel; + +public interface HTTPCallback { + public int cb (HTTPParser parser); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPDataCallback.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPDataCallback.java new file mode 100644 index 000000000000..6cad156d1545 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPDataCallback.java @@ -0,0 +1,25 @@ +package http_parser.lolevel; + +import java.nio.ByteBuffer; + +public interface HTTPDataCallback { + /* + very raw and extremly foolhardy! DANGER! + The whole Buffer concept is difficult enough to grasp as it is, + we pass in a buffer with an arbitrary position. + + The interesting data is located at position pos and is len + bytes long. + + The contract of this callback is that the buffer is + returned in the state that it was passed in, so implementing + this require good citizenship, you'll need to remember the current + position, change the position to get at the data you're interested + in and then set the position back to how you found it... + + //TODO: there should be an abstract implementation that implements + cb as described above, marks it final an provides a new callback + with signature cb(byte[], int, int) + */ + public int cb(HTTPParser p, ByteBuffer buf, int pos, int len); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPErrorCallback.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPErrorCallback.java new file mode 100644 index 000000000000..d38d9d4a0212 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPErrorCallback.java @@ -0,0 +1,7 @@ +package http_parser.lolevel; + +import java.nio.ByteBuffer; + +public interface HTTPErrorCallback { + public void cb (HTTPParser parser, String mes, ByteBuffer buf, int initial_position); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java new file mode 100644 index 000000000000..42022ecb854d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/HTTPParser.java @@ -0,0 +1,2161 @@ +package http_parser.lolevel; + +import java.nio.ByteBuffer; +import http_parser.HTTPException; +import http_parser.HTTPMethod; +import http_parser.HTTPParserUrl; +import http_parser.ParserType; +import static http_parser.lolevel.HTTPParser.C.*; +import static http_parser.lolevel.HTTPParser.State.*; + +public class HTTPParser { + /* lots of unsigned chars here, not sure what + to about them, `bytes` in java suck... */ + + ParserType type; + State state; + HState header_state; + boolean strict; + + int index; + int flags; // TODO + + int nread; + long content_length; + + int p_start; // updated each call to execute to indicate where the buffer was before we began calling it. + + /** READ-ONLY **/ + public int http_major; + public int http_minor; + public int status_code; /* responses only */ + public HTTPMethod method; /* requests only */ + + /* true = Upgrade header was present and the parser has exited because of that. + * false = No upgrade header present. + * Should be checked when http_parser_execute() returns in addition to + * error checking. + */ + public boolean upgrade; + + /** PUBLIC **/ + // TODO : this is used in c to maintain application state. + // is this even necessary? we have state in java ? + // consider + // Object data; /* A pointer to get hook to the "connection" or "socket" object */ + + + /* + * technically we could combine all of these (except for url_mark) into one + * variable, saving stack space, but it seems more clear to have them + * separated. + */ + int header_field_mark = -1; + int header_value_mark = -1; + int url_mark = -1; + int body_mark = -1; + + /** + * Construct a Parser for ParserType.HTTP_BOTH, meaning it + * determines whether it's parsing a request or a response. + */ + public HTTPParser() { + this(ParserType.HTTP_BOTH); + } + + /** + * Construct a Parser and initialise it to parse either + * requests or responses. + */ + public HTTPParser(ParserType type) { + this.type = type; + switch(type) { + case HTTP_REQUEST: + this.state = State.start_req; + break; + case HTTP_RESPONSE: + this.state = State.start_res; + break; + case HTTP_BOTH: + this.state = State.start_req_or_res; + break; + default: + throw new HTTPException("can't happen, invalid ParserType enum"); + } + } + + /* + * Utility to facilitate System.out.println style debugging (the way god intended) + */ + static void p(Object o) {System.out.println(o);} + + /** Comment from C version follows + * + * Our URL parser. + * + * This is designed to be shared by http_parser_execute() for URL validation, + * hence it has a state transition + byte-for-byte interface. In addition, it + * is meant to be embedded in http_parser_parse_url(), which does the dirty + * work of turning state transitions URL components for its API. + * + * This function should only be invoked with non-space characters. It is + * assumed that the caller cares about (and can detect) the transition between + * URL and non-URL states by looking for these. + */ + public State parse_url_char(byte ch) { + + int chi = ch & 0xff; // utility, ch without signedness for table lookups. + + if(SPACE == ch){ + throw new HTTPException("space as url char"); + } + + switch(state) { + case req_spaces_before_url: + /* Proxied requests are followed by scheme of an absolute URI (alpha). + * All methods except CONNECT are followed by '/' or '*'. + */ + if(SLASH == ch || STAR == ch){ + return req_path; + } + if(isAtoZ(ch)){ + return req_schema; + } + break; + case req_schema: + if(isAtoZ(ch)){ + return req_schema; + } + if(COLON == ch){ + return req_schema_slash; + } + break; + case req_schema_slash: + if(SLASH == ch){ + return req_schema_slash_slash; + } + break; + case req_schema_slash_slash: + if(SLASH == ch){ + return req_host_start; + } + break; + case req_host_start: + if (ch == (byte)'[') { + return req_host_v6_start; + } + if (isHostChar(ch)) { + return req_host; + } + break; + + case req_host: + if (isHostChar(ch)) { + return req_host; + } + + /* FALLTHROUGH */ + case req_host_v6_end: + switch (ch) { + case ':': + return req_port_start; + case '/': + return req_path; + case '?': + return req_query_string_start; + } + break; + + case req_host_v6: + if (ch == ']') { + return req_host_v6_end; + } + + /* FALLTHROUGH */ + case req_host_v6_start: + if (isHex(ch) || ch == ':') { + return req_host_v6; + } + break; + + case req_port: + switch (ch) { + case '/': + return req_path; + case '?': + return req_query_string_start; + } + + /* FALLTHROUGH */ + case req_port_start: + if (isDigit(ch)) { + return req_port; + } + break; + + case req_path: + if (isNormalUrlChar(chi)) { + return req_path; + } + switch (ch) { + case '?': + return req_query_string_start; + case '#': + return req_fragment_start; + } + + break; + + case req_query_string_start: + case req_query_string: + if (isNormalUrlChar(chi)) { + return req_query_string; + } + + switch (ch) { + case '?': + /* allow extra '?' in query string */ + return req_query_string; + + case '#': + return req_fragment_start; + } + + break; + + case req_fragment_start: + if (isNormalUrlChar(chi)) { + return req_fragment; + } + switch (ch) { + case '?': + return req_fragment; + + case '#': + return req_fragment_start; + } + break; + + case req_fragment: + if (isNormalUrlChar(ch)) { + return req_fragment; + } + + switch (ch) { + case '?': + case '#': + return req_fragment; + } + + break; + default: + break; + } + + /* We should never fall out of the switch above unless there's an error */ + return dead; + } + + /** Execute the parser with the currently available data contained in + * the buffer. The buffers position() and limit() need to be set + * correctly (obviously) and a will be updated approriately when the + * method returns to reflect the consumed data. + */ + public int execute(ParserSettings settings, ByteBuffer data) { + + int p = data.position(); + this.p_start = p; // this is used for pretty printing errors. + // and returning the amount of processed bytes. + + + // In case the headers don't provide information about the content + // length, `execute` needs to be called with an empty buffer to + // indicate that all the data has been send be the client/server, + // else there is no way of knowing the message is complete. + int len = (data.limit() - data.position()); + if (0 == len) { +// if (State.body_identity_eof == state) { +// settings.call_on_message_complete(this); +// } + switch (state) { + case body_identity_eof: + settings.call_on_message_complete(this); + return data.position() - this.p_start; + + case dead: + case start_req_or_res: + case start_res: + case start_req: + return data.position() - this.p_start; + + default: + // should we really consider this an error!? + throw new HTTPException("empty bytes! "+state); // error + } + } + + + // in case the _previous_ call to the parser only has data to get to + // the middle of certain fields, we need to update marks to point at + // the beginning of the current buffer. + switch (state) { + case header_field: + header_field_mark = p; + break; + case header_value: + header_value_mark = p; + break; + case req_path: + case req_schema: + case req_schema_slash: + case req_schema_slash_slash: + case req_host_start: + case req_host_v6_start: + case req_host_v6: + case req_host_v6_end: + case req_host: + case req_port_start: + case req_port: + case req_query_string_start: + case req_query_string: + case req_fragment_start: + case req_fragment: + url_mark = p; + break; + } + boolean reexecute = false; + int pe = 0; + byte ch = 0; + int chi = 0; + byte c = -1; + int to_read = 0; + + // this is where the work gets done, traverse the available data... + while (data.position() != data.limit() || reexecute) { +// p(state + ": r: " + reexecute + " :: " +p ); + + if(!reexecute){ + p = data.position(); + pe = data.limit(); + ch = data.get(); // the current character to process. + chi = ch & 0xff; // utility, ch without signedness for table lookups. + c = -1; // utility variably used for up- and downcasing etc. + to_read = 0; // used to keep track of how much of body, etc. is left to read + + if (parsing_header(state)) { + ++nread; + if (nread > HTTP_MAX_HEADER_SIZE) { + return error(settings, "possible buffer overflow", data); + } + } + } + reexecute = false; +// p(state + " ::: " + ch + " : " + (((CR == ch) || (LF == ch)) ? ch : ("'" + (char)ch + "'")) +": "+p ); + + switch (state) { + /* + * this state is used after a 'Connection: close' message + * the parser will error out if it reads another message + */ + case dead: + if (CR == ch || LF == ch){ + break; + } + return error(settings, "Connection already closed", data); + + + + case start_req_or_res: + if (CR == ch || LF == ch){ + break; + } + flags = 0; + content_length = -1; + + if (H == ch) { + state = State.res_or_resp_H; + } else { + type = ParserType.HTTP_REQUEST; + method = start_req_method_assign(ch); + if (null == method) { + return error(settings, "invalid method", data); + } + index = 1; + state = State.req_method; + } + settings.call_on_message_begin(this); + break; + + + + case res_or_resp_H: + if (T == ch) { + type = ParserType.HTTP_RESPONSE; + state = State.res_HT; + } else { + if (E != ch) { + return error(settings, "not E", data); + } + type = ParserType.HTTP_REQUEST; + method = HTTPMethod.HTTP_HEAD; + index = 2; + state = State.req_method; + } + break; + + + + case start_res: + flags = 0; + content_length = -1; + + switch(ch) { + case H: + state = State.res_H; + break; + case CR: + case LF: + break; + default: + return error(settings, "Not H or CR/LF", data); + } + + settings.call_on_message_begin(this); + break; + + + + case res_H: + if (strict && T != ch) { + return error(settings, "Not T", data); + } + state = State.res_HT; + break; + case res_HT: + if (strict && T != ch) { +return error(settings, "Not T2", data); + } + state = State.res_HTT; + break; + case res_HTT: + if (strict && P != ch) { +return error(settings, "Not P", data); + } + state = State.res_HTTP; + break; + case res_HTTP: + if (strict && SLASH != ch) { +return error(settings, "Not '/'", data); + } + state = State.res_first_http_major; + break; + + + + case res_first_http_major: + if (!isDigit(ch)) { +return error(settings, "Not a digit", data); + } + http_major = (int) ch - 0x30; + state = State.res_http_major; + break; + + /* major HTTP version or dot */ + case res_http_major: + if (DOT == ch) { + state = State.res_first_http_minor; + break; + } + if (!isDigit(ch)) { +return error(settings, "Not a digit", data); + } + http_major *= 10; + http_major += (ch - 0x30); + + if (http_major > 999) { +return error(settings, "invalid http major version: ", data); + } + break; + + /* first digit of minor HTTP version */ + case res_first_http_minor: + if (!isDigit(ch)) { +return error(settings, "Not a digit", data); + } + http_minor = (int)ch - 0x30; + state = State.res_http_minor; + break; + + /* minor HTTP version or end of request line */ + case res_http_minor: + if (SPACE == ch) { + state = State.res_first_status_code; + break; + } + if (!isDigit(ch)) { +return error(settings, "Not a digit", data); + } + http_minor *= 10; + http_minor += (ch - 0x30); + if (http_minor > 999) { +return error(settings, "invalid http minor version: ", data); + } + break; + + + + case res_first_status_code: + if (!isDigit(ch)) { + if (SPACE == ch) { + break; + } +return error(settings, "Not a digit (status code)", data); + } + status_code = (int)ch - 0x30; + state = State.res_status_code; + break; + + case res_status_code: + if (!isDigit(ch)) { + switch(ch) { + case SPACE: + state = State.res_status; + break; + case CR: + state = State.res_line_almost_done; + break; + case LF: + state = State.header_field_start; + break; + default: +return error(settings, "not a valid status code", data); + } + break; + } + status_code *= 10; + status_code += (int)ch - 0x30; + if (status_code > 999) { +return error(settings, "ridiculous status code:", data); + } + + if (status_code > 99) { + settings.call_on_status_complete(this); + } + break; + + case res_status: + /* the human readable status. e.g. "NOT FOUND" + * we are not humans so just ignore this + * we are not men, we are devo. */ + + if (CR == ch) { + state = State.res_line_almost_done; + break; + } + if (LF == ch) { + state = State.header_field_start; + break; + } + break; + + case res_line_almost_done: + if (strict && LF != ch) { +return error(settings, "not LF", data); + } + state = State.header_field_start; + break; + + + + case start_req: + if (CR==ch || LF == ch) { + break; + } + flags = 0; + content_length = -1; + + if(!isAtoZ(ch)){ + return error(settings, "invalid method", data); + } + + method = start_req_method_assign(ch); + if (null == method) { + return error(settings, "invalid method", data); + } + index = 1; + state = State.req_method; + + settings.call_on_message_begin(this); + break; + + + + case req_method: + if (0 == ch) { + return error(settings, "NULL in method", data); + } + + byte [] arr = method.bytes; + + if (SPACE == ch && index == arr.length) { + state = State.req_spaces_before_url; + } else if (arr[index] == ch) { + // wuhu! + } else if (HTTPMethod.HTTP_CONNECT == method) { + if (1 == index && H == ch) { + method = HTTPMethod.HTTP_CHECKOUT; + } else if (2 == index && P == ch) { + method = HTTPMethod.HTTP_COPY; + } + } else if (HTTPMethod.HTTP_MKCOL == method) { + if (1 == index && O == ch) { + method = HTTPMethod.HTTP_MOVE; + } else if (1 == index && E == ch) { + method = HTTPMethod.HTTP_MERGE; + } else if (1 == index && DASH == ch) { /* M-SEARCH */ + method = HTTPMethod.HTTP_MSEARCH; + } else if (2 == index && A == ch) { + method = HTTPMethod.HTTP_MKACTIVITY; + } + } else if (1 == index && HTTPMethod.HTTP_POST == method) { + if(R == ch) { + method = HTTPMethod.HTTP_PROPFIND; /* or HTTP_PROPPATCH */ + }else if(U == ch){ + method = HTTPMethod.HTTP_PUT; /* or HTTP_PURGE */ + }else if(A == ch){ + method = HTTPMethod.HTTP_PATCH; + } + } else if (2 == index) { + if(HTTPMethod.HTTP_PUT == method) { + if(R == ch){ + method = HTTPMethod.HTTP_PURGE; + } + }else if(HTTPMethod.HTTP_UNLOCK == method){ + if(S == ch){ + method = HTTPMethod.HTTP_UNSUBSCRIBE; + } + } + }else if(4 == index && HTTPMethod.HTTP_PROPFIND == method && P == ch){ + method = HTTPMethod.HTTP_PROPPATCH; + } else { + return error(settings, "Invalid HTTP method", data); + } + + ++index; + break; + + + + /******************* URL *******************/ + case req_spaces_before_url: + if (SPACE == ch) { + break; + } + url_mark = p; + if(HTTPMethod.HTTP_CONNECT == method){ + state = req_host_start; + } + + state = parse_url_char(ch); + if(state == dead){ + return error(settings, "Invalid something", data); + } + break; + + + case req_schema: + case req_schema_slash: + case req_schema_slash_slash: + case req_host_start: + case req_host_v6_start: + case req_host_v6: + case req_port_start: + switch (ch) { + /* No whitespace allowed here */ + case SPACE: + case CR: + case LF: + return error(settings, "unexpected char in path", data); + default: + state = parse_url_char(ch); + if(dead == state){ + return error(settings, "unexpected char in path", data); + } + } + break; + + case req_host: + case req_host_v6_end: + case req_port: + case req_path: + case req_query_string_start: + case req_query_string: + case req_fragment_start: + case req_fragment: + switch (ch) { + case SPACE: + settings.call_on_url(this, data, url_mark, p-url_mark); + settings.call_on_path(this, data, url_mark, p - url_mark); + url_mark = -1; + state = State.req_http_start; + break; + case CR: + case LF: + http_major = 0; + http_minor = 9; + state = (CR == ch) ? req_line_almost_done : header_field_start; + settings.call_on_url(this, data, url_mark, p-url_mark); //TODO check params!!! + settings.call_on_path(this, data, url_mark, p-url_mark); + url_mark = -1; + break; + default: + state = parse_url_char(ch); + if(dead == state){ + return error(settings, "unexpected char in path", data); + } + } + break; + /******************* URL *******************/ + + + + /******************* HTTP 1.1 *******************/ + case req_http_start: + switch (ch) { + case H: + state = State.req_http_H; + break; + case SPACE: + break; + default: + return error(settings, "error in req_http_H", data); + } + break; + + case req_http_H: + if (strict && T != ch) { + return error(settings, "unexpected char", data); + } + state = State.req_http_HT; + break; + + case req_http_HT: + if (strict && T != ch) { + return error(settings, "unexpected char", data); + } + state = State.req_http_HTT; + break; + + case req_http_HTT: + if (strict && P != ch) { + return error(settings, "unexpected char", data); + } + state = State.req_http_HTTP; + break; + + case req_http_HTTP: + if (strict && SLASH != ch) { + return error(settings, "unexpected char", data); + } + state = req_first_http_major; + break; + + /* first digit of major HTTP version */ + case req_first_http_major: + if (!isDigit(ch)) { +return error(settings, "non digit in http major", data); + } + http_major = (int)ch - 0x30; + state = State.req_http_major; + break; + + /* major HTTP version or dot */ + case req_http_major: + if (DOT == ch) { + state = State.req_first_http_minor; + break; + } + + if (!isDigit(ch)) { +return error(settings, "non digit in http major", data); + } + + http_major *= 10; + http_major += (int)ch - 0x30; + + if (http_major > 999) { +return error(settings, "ridiculous http major", data); + }; + break; + + /* first digit of minor HTTP version */ + case req_first_http_minor: + if (!isDigit(ch)) { +return error(settings, "non digit in http minor", data); + } + http_minor = (int)ch - 0x30; + state = State.req_http_minor; + break; + + case req_http_minor: + if (ch == CR) { + state = State.req_line_almost_done; + break; + } + + if (ch == LF) { + state = State.header_field_start; + break; + } + + /* XXX allow spaces after digit? */ + + if (!isDigit(ch)) { +return error(settings, "non digit in http minor", data); + } + + http_minor *= 10; + http_minor += (int)ch - 0x30; + + + if (http_minor > 999) { +return error(settings, "ridiculous http minor", data); + }; + + break; + + /* end of request line */ + case req_line_almost_done: + { + if (ch != LF) { +return error(settings, "missing LF after request line", data); + } + state = header_field_start; + break; + } + + /******************* HTTP 1.1 *******************/ + + + + /******************* Header *******************/ + case header_field_start: + { + if (ch == CR) { + state = headers_almost_done; + break; + } + + if (ch == LF) { + /* they might be just sending \n instead of \r\n so this would be + * the second \n to denote the end of headers*/ + state = State.headers_almost_done; + reexecute = true; + break; + } + + c = token(ch); + + if (0 == c) { + return error(settings, "invalid char in header:", data); + } + + header_field_mark = p; + + index = 0; + state = State.header_field; + + switch (c) { + case C: + header_state = HState.C; + break; + + case P: + header_state = HState.matching_proxy_connection; + break; + + case T: + header_state = HState.matching_transfer_encoding; + break; + + case U: + header_state = HState.matching_upgrade; + break; + + default: + header_state = HState.general; + break; + } + break; + } + + + + case header_field: + { + c = token(ch); + if (0 != c) { + switch (header_state) { + case general: + break; + + case C: + index++; + header_state = (O == c ? HState.CO : HState.general); + break; + + case CO: + index++; + header_state = (N == c ? HState.CON : HState.general); + break; + + case CON: + index++; + switch (c) { + case N: + header_state = HState.matching_connection; + break; + case T: + header_state = HState.matching_content_length; + break; + default: + header_state = HState.general; + break; + } + break; + + /* connection */ + + case matching_connection: + index++; + if (index > CONNECTION.length || c != CONNECTION[index]) { + header_state = HState.general; + } else if (index == CONNECTION.length-1) { + header_state = HState.connection; + } + break; + + /* proxy-connection */ + + case matching_proxy_connection: + index++; + if (index > PROXY_CONNECTION.length || c != PROXY_CONNECTION[index]) { + header_state = HState.general; + } else if (index == PROXY_CONNECTION.length-1) { + header_state = HState.connection; + } + break; + + /* content-length */ + + case matching_content_length: + index++; + if (index > CONTENT_LENGTH.length || c != CONTENT_LENGTH[index]) { + header_state = HState.general; + } else if (index == CONTENT_LENGTH.length-1) { + header_state = HState.content_length; + } + break; + + /* transfer-encoding */ + + case matching_transfer_encoding: + index++; + if (index > TRANSFER_ENCODING.length || c != TRANSFER_ENCODING[index]) { + header_state = HState.general; + } else if (index == TRANSFER_ENCODING.length-1) { + header_state = HState.transfer_encoding; + } + break; + + /* upgrade */ + + case matching_upgrade: + index++; + if (index > UPGRADE.length || c != UPGRADE[index]) { + header_state = HState.general; + } else if (index == UPGRADE.length-1) { + header_state = HState.upgrade; + } + break; + + case connection: + case content_length: + case transfer_encoding: + case upgrade: + if (SPACE != ch) header_state = HState.general; + break; + + default: +return error(settings, "Unknown Header State", data); + } // switch: header_state + break; + } // 0 != c + + if (COLON == ch) { + settings.call_on_header_field(this, data, header_field_mark, p-header_field_mark); + header_field_mark = -1; + + state = State.header_value_start; + break; + } + + if (CR == ch) { + state = State.header_almost_done; + settings.call_on_header_field(this, data, header_field_mark, p-header_field_mark); + + header_field_mark = -1; + break; + } + + if (ch == LF) { + settings.call_on_header_field(this, data, header_field_mark, p-header_field_mark); + header_field_mark = -1; + + state = State.header_field_start; + break; + } + +return error(settings, "invalid header field", data); + } + + + + case header_value_start: + { + if ((SPACE == ch) || (TAB == ch)) break; + + header_value_mark = p; + + state = State.header_value; + index = 0; + + + if (CR == ch) { + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + header_value_mark = -1; + + header_state = HState.general; + state = State.header_almost_done; + break; + } + + if (LF == ch) { + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + header_value_mark = -1; + + state = State.header_field_start; + break; + } + + + c = upper(ch); + + switch (header_state) { + case upgrade: + flags |= F_UPGRADE; + header_state = HState.general; + break; + + case transfer_encoding: + /* looking for 'Transfer-Encoding: chunked' */ + if (C == c) { + header_state = HState.matching_transfer_encoding_chunked; + } else { + header_state = HState.general; + } + break; + + case content_length: + if (!isDigit(ch)) { +return error(settings, "Content-Length not numeric", data); + } + content_length = (int)ch - 0x30; + break; + + case connection: + /* looking for 'Connection: keep-alive' */ + if (K == c) { + header_state = HState.matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (C == c) { + header_state = HState.matching_connection_close; + } else { + header_state = HState.general; + } + break; + + default: + header_state = HState.general; + break; + } + break; + } // header value start + + + + case header_value: + { + + if (CR == ch) { + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + header_value_mark = -1; + + state = State.header_almost_done; + break; + } + + if (LF == ch) { + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + header_value_mark = -1; + state = header_almost_done; + reexecute = true; + break; + } + + c = upper(ch); + switch (header_state) { + case general: + break; + + case connection: + case transfer_encoding: +return error(settings, "Shouldn't be here", data); + + case content_length: + if (SPACE == ch) { + break; + } + if (!isDigit(ch)) { +return error(settings, "Content-Length not numeric", data); + } + + long t = content_length; + t *= 10; + t += (long)ch - 0x30; + + /* Overflow? */ + // t will wrap and become negative ... + if (t < content_length) { + return error(settings, "Invalid content length", data); + } + content_length = t; + break; + + /* Transfer-Encoding: chunked */ + case matching_transfer_encoding_chunked: + index++; + if (index > CHUNKED.length || c != CHUNKED[index]) { + header_state = HState.general; + } else if (index == CHUNKED.length-1) { + header_state = HState.transfer_encoding_chunked; + } + break; + + /* looking for 'Connection: keep-alive' */ + case matching_connection_keep_alive: + index++; + if (index > KEEP_ALIVE.length || c != KEEP_ALIVE[index]) { + header_state = HState.general; + } else if (index == KEEP_ALIVE.length-1) { + header_state = HState.connection_keep_alive; + } + break; + + /* looking for 'Connection: close' */ + case matching_connection_close: + index++; + if (index > CLOSE.length || c != CLOSE[index]) { + header_state = HState.general; + } else if (index == CLOSE.length-1) { + header_state = HState.connection_close; + } + break; + + case transfer_encoding_chunked: + case connection_keep_alive: + case connection_close: + if (SPACE != ch) header_state = HState.general; + break; + + default: + state = State.header_value; + header_state = HState.general; + break; + } + break; + } // header_value + + + + case header_almost_done: + if (!header_almost_done(ch)) { + return error(settings, "incorrect header ending, expecting LF", data); + } + break; + + case header_value_lws: + if (SPACE == ch || TAB == ch ){ + state = header_value_start; + } else { + state = header_field_start; + reexecute = true; + } + break; + + case headers_almost_done: + if (LF != ch) { + return error(settings, "header not properly completed", data); + } + if (0 != (flags & F_TRAILING)) { + /* End of a chunked request */ + state = new_message(); + settings.call_on_headers_complete(this); + settings.call_on_message_complete(this); + break; + } + + state = headers_done; + + if (0 != (flags & F_UPGRADE) || HTTPMethod.HTTP_CONNECT == method) { + upgrade = true; + } + + /* Here we call the headers_complete callback. This is somewhat + * different than other callbacks because if the user returns 1, we + * will interpret that as saying that this message has no body. This + * is needed for the annoying case of recieving a response to a HEAD + * request. + */ + + /* (responses to HEAD request contain a CONTENT-LENGTH header + * but no content) + * + * Consider what to do here: I don't like the idea of the callback + * interface having a different contract in the case of HEAD + * responses. The alternatives would be either to: + * + * a.) require the header_complete callback to implement a different + * interface or + * + * b.) provide an overridden execute(bla, bla, boolean + * parsingHeader) implementation ... + */ + + /*TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO */ + if (null != settings.on_headers_complete) { + settings.call_on_headers_complete(this); + //return; + } + + // if (null != settings.on_headers_complete) { + // switch (settings.on_headers_complete.cb(parser)) { + // case 0: + // break; + // + // case 1: + // flags |= F_SKIPBODY; + // break; + // + // default: + // return p - data; /* Error */ // TODO // RuntimeException ? + // } + // } + reexecute = true; + break; + + case headers_done: + if (strict && (LF != ch)) { + return error(settings, "STRICT CHECK", data); //TODO correct error msg + } + + nread = 0; + + // Exit, the rest of the connect is in a different protocol. + if (upgrade) { + state = new_message(); + settings.call_on_message_complete(this); + return data.position()-this.p_start; + } + + if (0 != (flags & F_SKIPBODY)) { + state = new_message(); + settings.call_on_message_complete(this); + } else if (0 != (flags & F_CHUNKED)) { + /* chunked encoding - ignore Content-Length header */ + state = State.chunk_size_start; + } else { + if (content_length == 0) { + /* Content-Length header given but zero: Content-Length: 0\r\n */ + state = new_message(); + settings.call_on_message_complete(this); + } else if (content_length != -1) { + /* Content-Length header given and non-zero */ + state = State.body_identity; + } else { + if (type == ParserType.HTTP_REQUEST || !http_message_needs_eof()) { + /* Assume content-length 0 - read the next */ + state = new_message(); + settings.call_on_message_complete(this); + } else { + /* Read body until EOF */ + state = State.body_identity_eof; + } + } + } + + break; + /******************* Header *******************/ + + + + + /******************* Body *******************/ + case body_identity: + to_read = min(pe - p, content_length); //TODO change to use buffer? + body_mark = p; + + if (to_read > 0) { + settings.call_on_body(this, data, p, to_read); + data.position(p+to_read); + content_length -= to_read; + + if (content_length == 0) { + state = message_done; + reexecute = true; + } + } + break; + + + + case body_identity_eof: + to_read = pe - p; // TODO change to use buffer ? + if (to_read > 0) { + settings.call_on_body(this, data, p, to_read); + data.position(p+to_read); + } + break; + + case message_done: + state = new_message(); + settings.call_on_message_complete(this); + break; + /******************* Body *******************/ + + + + /******************* Chunk *******************/ + case chunk_size_start: + if (1 != this.nread) { +return error(settings, "nread != 1 (chunking)", data); + + } + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + + c = UNHEX[chi]; + if (c == -1) { +return error(settings, "invalid hex char in chunk content length", data); + } + content_length = c; + state = State.chunk_size; + break; + + + + case chunk_size: + if (0 == (flags & F_CHUNKED)) { + return error(settings, "not chunked", data); + } + + if (CR == ch) { + state = State.chunk_size_almost_done; + break; + } + + c = UNHEX[chi]; + + if (c == -1) { + if (SEMI == ch || SPACE == ch) { + state = State.chunk_parameters; + break; + } + return error(settings, "invalid hex char in chunk content length", data); + } + long t = content_length; + + t *= 16; + t += c; + if(t < content_length){ + return error(settings, "invalid content length", data); + } + content_length = t; + break; + + + + case chunk_parameters: + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + /* just ignore this shit. TODO check for overflow */ + if (CR == ch) { + state = State.chunk_size_almost_done; + break; + } + break; + + + + case chunk_size_almost_done: + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + if (strict && LF != ch) { +return error(settings, "expected LF at end of chunk size", data); + } + + this.nread = 0; + + if (0 == content_length) { + flags |= F_TRAILING; + state = State.header_field_start; + } else { + state = State.chunk_data; + } + break; + + + + case chunk_data: + //TODO Apply changes from C version for s_chunk_data + if (0 == (flags & F_CHUNKED)) { + return error(settings, "not chunked", data); + } + + to_read = min(pe-p, content_length); + if (to_read > 0) { + settings.call_on_body(this, data, p, to_read); + data.position(p+to_read); + } + + if (to_read == content_length) { + state = State.chunk_data_almost_done; + } + + content_length -= to_read; + break; + + + + case chunk_data_almost_done: + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + if (strict && CR != ch) { +return error(settings, "chunk data terminated incorrectly, expected CR", data); + } + state = State.chunk_data_done; + //TODO CALLBACK_DATA(body) + // settings.call_on_body(this, data,p,?); + break; + + + + case chunk_data_done: + if (0 == (flags & F_CHUNKED)) { +return error(settings, "not chunked", data); + } + if (strict && LF != ch) { +return error(settings, "chunk data terminated incorrectly, expected LF", data); + } + state = State.chunk_size_start; + break; + /******************* Chunk *******************/ + + + + default: +return error(settings, "unhandled state", data); + + } // switch + } // while + + p = data.position(); + + + /* Reaching this point assumes that we only received part of a + * message, inform the callbacks about the progress made so far*/ + + settings.call_on_header_field(this, data, header_field_mark, p-header_field_mark); + settings.call_on_header_value(this, data, header_value_mark, p-header_value_mark); + settings.call_on_url (this, data, url_mark, p-url_mark); + settings.call_on_path (this, data, url_mark, p-url_mark); + + return data.position()-this.p_start; + } // execute + + int error (ParserSettings settings, String mes, ByteBuffer data) { + settings.call_on_error(this, mes, data, this.p_start); + this.state = State.dead; + return data.position()-this.p_start; + } + + public boolean http_message_needs_eof() { + if(type == ParserType.HTTP_REQUEST){ + return false; + } + /* See RFC 2616 section 4.4 */ + if ((status_code / 100 == 1) || /* 1xx e.g. Continue */ + (status_code == 204) || /* No Content */ + (status_code == 304) || /* Not Modified */ + (flags & F_SKIPBODY) != 0) { /* response to a HEAD request */ + return false; + } + if ((flags & F_CHUNKED) != 0 || content_length != -1) { + return false; + } + + return true; + } + + /* If http_should_keep_alive() in the on_headers_complete or + * on_message_complete callback returns true, then this will be should be + * the last message on the connection. + * If you are the server, respond with the "Connection: close" header. + * If you are the client, close the connection. + */ + public boolean http_should_keep_alive() { + if (http_major > 0 && http_minor > 0) { + /* HTTP/1.1 */ + if ( 0 != (flags & F_CONNECTION_CLOSE) ) { + return false; + } + } else { + /* HTTP/1.0 or earlier */ + if ( 0 == (flags & F_CONNECTION_KEEP_ALIVE) ) { + return false; + } + } + return !http_message_needs_eof(); + } + + public int parse_url(ByteBuffer data, boolean is_connect, HTTPParserUrl u) { + + UrlFields uf = UrlFields.UF_MAX; + UrlFields old_uf = UrlFields.UF_MAX; + u.port = 0; + u.field_set = 0; + state = (is_connect ? State.req_host_start : State.req_spaces_before_url); + int p_init = data.position(); + int p = 0; + byte ch = 0; + while (data.position() != data.limit()) { + p = data.position(); + ch = data.get(); + state = parse_url_char(ch); + switch(state) { + case dead: + return 1; + + /* Skip delimeters */ + case req_schema_slash: + case req_schema_slash_slash: + case req_host_start: + case req_host_v6_start: + case req_host_v6_end: + case req_port_start: + case req_query_string_start: + case req_fragment_start: + continue; + + case req_schema: + uf = UrlFields.UF_SCHEMA; + break; + + case req_host: + case req_host_v6: + uf = UrlFields.UF_HOST; + break; + + case req_port: + uf = UrlFields.UF_PORT; + break; + + case req_path: + uf = UrlFields.UF_PATH; + break; + + case req_query_string: + uf = UrlFields.UF_QUERY; + break; + + case req_fragment: + uf = UrlFields.UF_FRAGMENT; + break; + + default: + return 1; + } + /* Nothing's changed; soldier on */ + if (uf == old_uf) { + u.field_data[uf.getIndex()].len++; + continue; + } + + u.field_data[uf.getIndex()].off = p - p_init; + u.field_data[uf.getIndex()].len = 1; + + u.field_set |= (1 << uf.getIndex()); + old_uf = uf; + + } + + /* CONNECT requests can only contain "hostname:port" */ + if (is_connect && u.field_set != ((1 << UrlFields.UF_HOST.getIndex())|(1 << UrlFields.UF_PORT.getIndex()))) { + return 1; + } + + /* Make sure we don't end somewhere unexpected */ + switch (state) { + case req_host_v6_start: + case req_host_v6: + case req_host_v6_end: + case req_host: + case req_port_start: + return 1; + default: + break; + } + + if (0 != (u.field_set & (1 << UrlFields.UF_PORT.getIndex()))) { + /* Don't bother with endp; we've already validated the string */ + int v = strtoi(data, p_init + u.field_data[UrlFields.UF_PORT.getIndex()].off); + + /* Ports have a max value of 2^16 */ + if (v > 0xffff) { + return 1; + } + + u.port = v; + } + + return 0; + } + + //hacky reimplementation of srttoul, tailored for our simple needs + //we only need to parse port val, so no negative values etc + int strtoi(ByteBuffer data, int start_pos) { + data.position(start_pos); + byte ch; + String str = ""; + while(data.position() < data.limit()) { + ch = data.get(); + if(Character.isWhitespace((char)ch)){ + continue; + } + if(isDigit(ch)){ + str = str + (char)ch; //TODO replace with something less hacky + }else{ + break; + } + } + return Integer.parseInt(str); + } + + boolean isDigit(byte b) { + if (b >= 0x30 && b <=0x39) { + return true; + } + return false; + } + + boolean isHex(byte b) { + return isDigit(b) || (lower(b) >= 0x61 /*a*/ && lower(b) <= 0x66 /*f*/); + } + + boolean isAtoZ(byte b) { + byte c = lower(b); + return (c>= 0x61 /*a*/ && c <= 0x7a /*z*/); + } + + + byte lower (byte b) { + return (byte)(b|0x20); + } + + byte upper(byte b) { + char c = (char)(b); + return (byte)Character.toUpperCase(c); + } + + byte token(byte b) { + if(!strict){ + return (b == (byte)' ') ? (byte)' ' : (byte)tokens[b] ; + }else{ + return (byte)tokens[b]; + } + } + + boolean isHostChar(byte ch){ + if(!strict){ + return (isAtoZ(ch)) || isDigit(ch) || DOT == ch || DASH == ch || UNDER == ch ; + }else{ + return (isAtoZ(ch)) || isDigit(ch) || DOT == ch || DASH == ch; + } + } + + boolean isNormalUrlChar(int chi) { + if(!strict){ + return (chi > 0x80) || normal_url_char[chi]; + }else{ + return normal_url_char[chi]; + } + } + + HTTPMethod start_req_method_assign(byte c){ + switch (c) { + case C: return HTTPMethod.HTTP_CONNECT; /* or COPY, CHECKOUT */ + case D: return HTTPMethod.HTTP_DELETE; + case G: return HTTPMethod.HTTP_GET; + case H: return HTTPMethod.HTTP_HEAD; + case L: return HTTPMethod.HTTP_LOCK; + case M: return HTTPMethod.HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ + case N: return HTTPMethod.HTTP_NOTIFY; + case O: return HTTPMethod.HTTP_OPTIONS; + case P: return HTTPMethod.HTTP_POST; /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ + case R: return HTTPMethod.HTTP_REPORT; + case S: return HTTPMethod.HTTP_SUBSCRIBE; + case T: return HTTPMethod.HTTP_TRACE; + case U: return HTTPMethod.HTTP_UNLOCK; /* or UNSUBSCRIBE */ + } + return null; // ugh. + } + + boolean header_almost_done(byte ch) { + if (strict && LF != ch) { + return false; + } + + state = State.header_value_lws; + // TODO java enums support some sort of bitflag mechanism !? + switch (header_state) { + case connection_keep_alive: + flags |= F_CONNECTION_KEEP_ALIVE; + break; + case connection_close: + flags |= F_CONNECTION_CLOSE; + break; + case transfer_encoding_chunked: + flags |= F_CHUNKED; + break; + default: + break; + } + return true; + } + +// boolean headers_almost_done (byte ch, ParserSettings settings) { +// } // headers_almost_done + + + final int min (int a, int b) { + return a < b ? a : b; + } + + final int min (int a, long b) { + return a < b ? a : (int)b; + } + + /* probably not the best place to hide this ... */ + public boolean HTTP_PARSER_STRICT; + State new_message() { + if (HTTP_PARSER_STRICT){ + return http_should_keep_alive() ? start_state() : State.dead; + } else { + return start_state(); + } + + } + + State start_state() { + return type == ParserType.HTTP_REQUEST ? State.start_req : State.start_res; + } + + + boolean parsing_header(State state) { + + switch (state) { + case chunk_data : + case chunk_data_almost_done : + case chunk_data_done : + case body_identity : + case body_identity_eof : + case message_done : + return false; + + } + return true; + } + + /* "Dial C for Constants" */ + static class C { + static final int HTTP_MAX_HEADER_SIZE = 80 * 1024; + + static final int F_CHUNKED = 1 << 0; + static final int F_CONNECTION_KEEP_ALIVE = 1 << 1; + static final int F_CONNECTION_CLOSE = 1 << 2; + static final int F_TRAILING = 1 << 3; + static final int F_UPGRADE = 1 << 4; + static final int F_SKIPBODY = 1 << 5; + + static final byte [] UPCASE = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x2f, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x38,0x39,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x41,0x42,0x43,0x44,0x45,0x46,0x47, 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, 0x58,0x59,0x5a,0x00,0x00,0x00,0x00,0x5f, + 0x00,0x41,0x42,0x43,0x44,0x45,0x46,0x47, 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, 0x58,0x59,0x5a,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + }; + static final byte [] CONNECTION = { + 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, + }; + static final byte [] PROXY_CONNECTION = { + 0x50, 0x52, 0x4f, 0x58, 0x59, 0x2d, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, + }; + static final byte [] CONTENT_LENGTH = { + 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x2d, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, + }; + static final byte [] TRANSFER_ENCODING = { + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x2d, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, + }; + static final byte [] UPGRADE = { + 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, + }; + static final byte [] CHUNKED = { + 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x45, 0x44, + }; + static final byte [] KEEP_ALIVE = { + 0x4b, 0x45, 0x45, 0x50, 0x2d, 0x41, 0x4c, 0x49, 0x56, 0x45, + }; + static final byte [] CLOSE = { + 0x43, 0x4c, 0x4f, 0x53, 0x45, + }; + + /* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1*<any CHAR except CTLs or separators> + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ + + static final char [] tokens = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0, '!', 0, '#', '$', '%', '&', '\'', +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 0, 0, '*', '+', 0, '-', '.', 0 , +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + '0', '1', '2', '3', '4', '5', '6', '7', +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + '8', '9', 0, 0, 0, 0, 0, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 'X', 'Y', 'Z', 0, 0, 0, 0, '_', +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + 0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 'X', 'Y', 'Z', 0, '|', 0, '~', 0, +/* hi bit set, not ascii */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, }; + + static final byte [] UNHEX = + { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + }; + + static final boolean [] normal_url_char = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + false, false, false, false, false, false, false, false, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + false, false, false, false, false, false, false, false, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + false, false, false, false, false, false, false, false, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + false, false, false, false, false, false, false, false, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + false, true, true, false, true, true, true, true, +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + true, true, true, true, true, true, true, true, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + true, true, true, true, true, true, true, true, +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + true, true, true, true, true, true, true, false, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + true, true, true, true, true, true, true, true, +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + true, true, true, true, true, true, true, true, +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + true, true, true, true, true, true, true, true, +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + true, true, true, true, true, true, true, true, +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + true, true, true, true, true, true, true, true, +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + true, true, true, true, true, true, true, true, +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + true, true, true, true, true, true, true, true, +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + true, true, true, true, true, true, true, false, + +/* hi bit set, not ascii */ +/* Remainder of non-ASCII range are accepted as-is to support implicitly UTF-8 + * encoded paths. This is out of spec, but clients generate this and most other + * HTTP servers support it. We should, too. */ + + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, + + }; + + public static final byte A = 0x41; + public static final byte B = 0x42; + public static final byte C = 0x43; + public static final byte D = 0x44; + public static final byte E = 0x45; + public static final byte F = 0x46; + public static final byte G = 0x47; + public static final byte H = 0x48; + public static final byte I = 0x49; + public static final byte J = 0x4a; + public static final byte K = 0x4b; + public static final byte L = 0x4c; + public static final byte M = 0x4d; + public static final byte N = 0x4e; + public static final byte O = 0x4f; + public static final byte P = 0x50; + public static final byte Q = 0x51; + public static final byte R = 0x52; + public static final byte S = 0x53; + public static final byte T = 0x54; + public static final byte U = 0x55; + public static final byte V = 0x56; + public static final byte W = 0x57; + public static final byte X = 0x58; + public static final byte Y = 0x59; + public static final byte Z = 0x5a; + public static final byte UNDER = 0x5f; + public static final byte CR = 0x0d; + public static final byte LF = 0x0a; + public static final byte DOT = 0x2e; + public static final byte SPACE = 0x20; + public static final byte TAB = 0x09; + public static final byte SEMI = 0x3b; + public static final byte COLON = 0x3a; + public static final byte HASH = 0x23; + public static final byte QMARK = 0x3f; + public static final byte SLASH = 0x2f; + public static final byte DASH = 0x2d; + public static final byte STAR = 0x2a; + public static final byte NULL = 0x00; + } + + enum State { + + dead + + , start_req_or_res + , res_or_resp_H + , start_res + , res_H + , res_HT + , res_HTT + , res_HTTP + , res_first_http_major + , res_http_major + , res_first_http_minor + , res_http_minor + , res_first_status_code + , res_status_code + , res_status + , res_line_almost_done + + , start_req + + , req_method + , req_spaces_before_url + , req_schema + , req_schema_slash + , req_schema_slash_slash + , req_host_start + , req_host_v6_start + , req_host_v6 + , req_host_v6_end + , req_host + , req_port_start + , req_port + , req_path + , req_query_string_start + , req_query_string + , req_fragment_start + , req_fragment + , req_http_start + , req_http_H + , req_http_HT + , req_http_HTT + , req_http_HTTP + , req_first_http_major + , req_http_major + , req_first_http_minor + , req_http_minor + , req_line_almost_done + + , header_field_start + , header_field + , header_value_start + , header_value + , header_value_lws + + , header_almost_done + + , chunk_size_start + , chunk_size + , chunk_parameters + , chunk_size_almost_done + + , headers_almost_done + , headers_done +// This space intentionally not left blank, comment from c, for orientation... +// the c version uses <= s_header_almost_done in java, we list the states explicitly +// in `parsing_header()` +/* Important: 's_headers_done' must be the last 'header' state. All + * states beyond this must be 'body' states. It is used for overflow + * checking. See the PARSING_HEADER() macro. + */ + , chunk_data + , chunk_data_almost_done + , chunk_data_done + + , body_identity + , body_identity_eof + , message_done + + } + enum HState { + general + , C + , CO + , CON + + , matching_connection + , matching_proxy_connection + , matching_content_length + , matching_transfer_encoding + , matching_upgrade + + , connection + , content_length + , transfer_encoding + , upgrade + + , matching_transfer_encoding_chunked + , matching_connection_keep_alive + , matching_connection_close + + , transfer_encoding_chunked + , connection_keep_alive + , connection_close + } + public enum UrlFields { + UF_SCHEMA(0) + , UF_HOST(1) + , UF_PORT(2) + , UF_PATH(3) + , UF_QUERY(4) + , UF_FRAGMENT(5) + , UF_MAX(6); + + + private final int index; + + private UrlFields(int index) { + this.index = index; + } + public int getIndex() { + return index; + } + + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java new file mode 100644 index 000000000000..1ebdd4f8049e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/impl/http_parser/lolevel/ParserSettings.java @@ -0,0 +1,83 @@ +package http_parser.lolevel; +import java.nio.ByteBuffer; +import http_parser.HTTPException; +public class ParserSettings { + + public HTTPCallback on_message_begin; + public HTTPDataCallback on_path; + public HTTPDataCallback on_query_string; + public HTTPDataCallback on_url; + public HTTPDataCallback on_fragment; + public HTTPCallback on_status_complete; + public HTTPDataCallback on_header_field; + public HTTPDataCallback on_header_value; + public HTTPCallback on_headers_complete; + public HTTPDataCallback on_body; + public HTTPCallback on_message_complete; + public HTTPErrorCallback on_error; + + void call_on_message_begin (HTTPParser p) { + call_on(on_message_begin, p); + } + + void call_on_message_complete (HTTPParser p) { + call_on(on_message_complete, p); + } + + // this one is a little bit different: + // the current `position` of the buffer is the location of the + // error, `ini_pos` indicates where the position of + // the buffer when it was passed to the `execute` method of the parser, i.e. + // using this information and `limit` we'll know all the valid data + // in the buffer around the error we can use to print pretty error + // messages. + void call_on_error (HTTPParser p, String mes, ByteBuffer buf, int ini_pos) { + if (null != on_error) { + on_error.cb(p, mes, buf, ini_pos); + return; + } + // if on_error gets called it MUST throw an exception, else the parser + // will attempt to continue parsing, which it can't because it's + // in an invalid state. + throw new HTTPException(mes); + } + + void call_on_header_field (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_header_field, p, buf, pos, len); + } + void call_on_query_string (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_query_string, p, buf, pos, len); + } + void call_on_fragment (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_fragment, p, buf, pos, len); + } + void call_on_status_complete(HTTPParser p) { + call_on(on_status_complete, p); + } + void call_on_path (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_path, p, buf, pos, len); + } + void call_on_header_value (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_header_value, p, buf, pos, len); + } + void call_on_url (HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_url, p, buf, pos, len); + } + void call_on_body(HTTPParser p, ByteBuffer buf, int pos, int len) { + call_on(on_body, p, buf, pos, len); + } + void call_on_headers_complete(HTTPParser p) { + call_on(on_headers_complete, p); + } + void call_on (HTTPCallback cb, HTTPParser p) { + // cf. CALLBACK2 macro + if (null != cb) { + cb.cb(p); + } + } + void call_on (HTTPDataCallback cb, HTTPParser p, ByteBuffer buf, int pos, int len) { + if (null != cb && -1 != pos) { + cb.cb(p,buf,pos,len); + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java new file mode 100644 index 000000000000..62f0a0ee3b4c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Message.java @@ -0,0 +1,374 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.io.*; +import java.util.*; + +import http_parser.HTTPMethod; +import http_parser.HTTPParserUrl; +import http_parser.ParserType; +import http_parser.lolevel.TestLoaderNG.Header; +import http_parser.lolevel.TestLoaderNG.LastHeader; + +import primitive.collection.ByteList; + +import static http_parser.lolevel.Util.str; + +public class Message { + String name; + byte [] raw; + ParserType type; + HTTPMethod method; + int status_code; + String request_path; // byte [] ? + String request_url; + String fragment ; + String query_string; + byte [] body; + int body_size; + int num_headers; + LastHeader last_header_element; + Map<String,String> header; + List<Header> headers; + boolean should_keep_alive; + + byte[] upgrade; + boolean upgrade() { + return null != upgrade; + } + + int http_major; + int http_minor; + + boolean message_begin_called; + boolean headers_complete_called; + boolean message_complete_called; + boolean message_complete_on_eof; + + + Map<String,String> parsed_header; + String currHField; + String currHValue; + byte [] pbody; + int num_called; + + public String toString() { + StringBuilder b = new StringBuilder(); + b.append("NAME: "); b.append(name);b.append("\n"); + b.append("type: "); b.append(type);b.append("\n"); + b.append("method: "); b.append(method);b.append("\n"); + b.append("status_code: "); b.append(status_code);b.append("\n"); + b.append("request_path: "); b.append(request_path);b.append("\n"); + b.append("request_url: "); b.append(request_url);b.append("\n"); + b.append("fragment: "); b.append(fragment);b.append("\n"); + b.append("query_string: "); b.append(query_string);b.append("\n"); + b.append("body:\n"); b.append(new String(body));b.append("\n"); + b.append("should_keep_alive: "); b.append(should_keep_alive);b.append("\n"); + b.append("upgrade: "); b.append(upgrade);b.append("\n"); + b.append("http_major: "); b.append(http_major);b.append("\n"); + b.append("http_minor: "); b.append(http_minor);b.append("\n"); + b.append("message_complete_called: "); b.append(message_complete_called);b.append("\n"); + return b.toString(); + } + + Message () { + this.header = new HashMap<String, String>(); + this.headers = new LinkedList<Header>(); + reset(); + } + /* + *prepare this Test Instance for reuse. + * */ + void reset () { + this.parsed_header = new HashMap<String, String>(); + this.pbody = null; + this.num_called = 0; + + } + void check (boolean val, String mes) { + if (!val) { + //p(name+" : "+mes); + throw new RuntimeException(name+" : "+mes); + } + } + + + HTTPDataCallback getCB (final String value, final String mes, final TestSettings settings) { + return new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len){ + // if ("url".equals(mes)){ + // p("pos"+pos); + // p("len"+len); + // if (8==pos && 5 == len && "connect request".equals(name)) { + // //throw new RuntimeException(name); + // } + // } + //String str = str(b, pos, len); + ByteList list = settings.map.get(mes); + for (int i=0; i!=len; ++i) { + list.add(b.get(pos+i)); + } + //settings.map.put(mes, prev_val + str); + //check(value.equals(str), "incorrect "+mes+": "+str); + if (-1 == pos) { + throw new RuntimeException("he?"); + } + return 0; + } + }; + } + + void execute () { + p(name); + ByteBuffer buf = ByteBuffer.wrap(raw); + HTTPParser p = new HTTPParser(); + TestSettings s = settings(); + + + + p.execute(s, buf); + if (!p.upgrade) { + // call execute again, else parser can't know message is done + // if no content length is set. + p.execute(s, buf); + } + if (!s.success) { + throw new RuntimeException("Test: "+name+" failed"); + } + } // execute + + void execute_permutations() { + /* + |-|---------------| + |--|--------------| + |---|-------------| + (...) + |---------------|-| + |-----------------| + */ + p(name); + for (int i = 2; i != raw.length; ++i) { + // p(i); + HTTPParser p = new HTTPParser(); + TestSettings s = settings(); + ByteBuffer buf = ByteBuffer.wrap(raw); + int olimit = buf.limit(); + buf.limit(i); + + parse(p,s,buf); + if (!p.upgrade) { + buf.position(i); + buf.limit(olimit); + + parse(p,s,buf); + if (!p.upgrade) { + parse(p,s,buf); + } else { + if (!upgrade()) { + throw new RuntimeException("Test:"+name+"parsed as upgrade, is not"); + } + } + + } else { + if (!upgrade()) { + throw new RuntimeException("Test:"+name+"parsed as upgrade, is not"); + } + } + if (!s.success) { + p(this); + throw new RuntimeException("Test: "+name+" failed"); + } + reset(); + } + //System.exit(0); + } // execute_permutations + void parse(HTTPParser p, ParserSettings s, ByteBuffer b) { + //p("About to parse: "+b.position() + "->" + b.limit()); + p.execute(s, b); + } + + TestSettings settings() { + final TestSettings s = new TestSettings(); + s.on_url = getCB(request_url, "url", s); + s.on_message_begin = new HTTPCallback() { + public int cb (HTTPParser p) { + message_begin_called = true; + return -1; + } + }; + s.on_header_field = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len){ + if (null != currHValue && null == currHField) { + throw new RuntimeException(name+": shouldn't happen"); + } + if (null != currHField) { + if (null == currHValue) { + currHField += str(b,pos,len); + return 0; + } else { + parsed_header.put(currHField, currHValue); + currHField = null; + currHValue = null; + } + } + currHField = str(b,pos,len); + return 0; + } + }; + s.on_header_value = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len){ + if (null == currHField) { + throw new RuntimeException(name+" :shouldn't happen field"); + } + if (null == currHValue) { + currHValue = str(b,pos,len); + } else { + currHValue += str(b, pos, len); + } + return 0; + } + }; + s.on_headers_complete = new HTTPCallback() { + public int cb (HTTPParser p) { + headers_complete_called = true; + String parsed_path = null; + String parsed_query = null; + String parsed_url = null; + String parsed_frag = null; + + try { + parsed_url = new String(s.map.get("url").toArray(), "UTF8"); + + HTTPParserUrl u = new HTTPParserUrl(); + HTTPParser pp = new HTTPParser(); + ByteBuffer data = Util.buffer(parsed_url); + pp.parse_url(data,false, u); + + parsed_path = u.getFieldValue(HTTPParser.UrlFields.UF_PATH, data); + parsed_query = u.getFieldValue(HTTPParser.UrlFields.UF_QUERY, data); + parsed_frag = u.getFieldValue(HTTPParser.UrlFields.UF_FRAGMENT, data); + + } catch (java.io.UnsupportedEncodingException uee) { + throw new RuntimeException(uee); + } + + if (!request_path.equals(parsed_path)) { + throw new RuntimeException(name+": invalid path: "+parsed_path+" should be: "+request_path); + } + if (!query_string.equals(parsed_query)) { + throw new RuntimeException(name+": invalid query: "+parsed_query+" should be: "+query_string); + } + if (!request_url.equals(parsed_url)) { + throw new RuntimeException(">"+name+"<: invalid url: >"+parsed_url+"< should be: >"+request_url+"<"); + } + if (!fragment.equals(parsed_frag)) { + throw new RuntimeException(name+": invalid fragement: "+parsed_frag+" should be: "+fragment); + } + if (null != currHValue || null != currHField) { + if (null == currHField || null == currHValue) { + throw new RuntimeException("shouldn't happen"); + } + } + if (null != currHField) { + //p(currHField); + //p(">"+currHValue+"<"); + parsed_header.put(currHField, currHValue); + currHField = null; + currHValue = null; + } + + + return 0; + } + }; + // s.on_headers_complete = new HTTPCallback() { + // public int cb (HTTPParser p) { + // p("Complete:"+name); + // return 0; + // } + // }; + + s.on_body = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len){ + int l = pbody == null ? len : len + pbody.length; + int off = pbody == null ? 0 : pbody.length; + byte [] nbody = new byte[l]; + + if (null != pbody) { + System.arraycopy(pbody, 0, nbody, 0, pbody.length); + } + + int saved = b.position(); + b.position(pos); + b.get(nbody, off, len); + b.position(saved); + pbody = nbody; + return 0; + } + }; + + s.on_message_complete = new HTTPCallback() { + public int cb(HTTPParser p) { + message_complete_called = true; + num_called += 1; + if ( p.http_minor != http_minor + || p.http_major != http_major + || p.status_code != status_code ) { + + throw new RuntimeException("major/minor/status_code mismatch"); + } + + //check headers + + if (header.keySet().size() != parsed_header.keySet().size()) { + p(parsed_header); + throw new RuntimeException(name+": different amount of headers"); + } + for (String key : header.keySet()) { + String pvalue = parsed_header.get(key); + if (!header.get(key).equals(pvalue)) { + throw new RuntimeException(name+" : different values for :"+key+" is >"+pvalue+"< should: >"+header.get(key)+"<"); + } + } + //check body + if (null == pbody && (null == body || body.length == 0 || body.length == 1)) { + s.success = true; + return 0; + } + if (null == pbody) { + throw new RuntimeException(name+": no body, should be: "+new String(body)); + } + if (pbody.length != body.length) { + p(pbody.length); + p(body.length); + p(new String(pbody)); + p(new String(body)); + throw new RuntimeException(name+": incorrect body length"); + } + for (int i = 0 ; i!= body.length; ++i) { + if (pbody[i] != body[i]) { + throw new RuntimeException("different body"); + } + } + s.success = true; + return 0; + } + }; + return s; + } // settings + static void p(Object o) { + System.out.println(o); + } + + static class TestSettings extends ParserSettings { + public boolean success; + Map<String, ByteList> map; + TestSettings () { + map = new HashMap<String, ByteList>(); + map.put("path", new ByteList()); + map.put("query_string", new ByteList()); + map.put("url", new ByteList()); + map.put("fragment", new ByteList()); + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/ParseUrl.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/ParseUrl.java new file mode 100644 index 000000000000..0e740214737b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/ParseUrl.java @@ -0,0 +1,51 @@ +package http_parser.lolevel; + +import http_parser.HTTPParserUrl; +import static http_parser.lolevel.Util.*; + +public class ParseUrl { + public static void test(int i) { + HTTPParserUrl u = new HTTPParserUrl(); + HTTPParser p = new HTTPParser(); + Url test = Url.URL_TESTS[i]; +// System.out.println(":: " + test.name); + int rv = p.parse_url(Util.buffer(test.url),test.is_connect,u); + UnitTest.check_equals(rv, test.rv); + if(test.rv == 0){ + UnitTest.check_equals(u, test.u); + } + + } + public static void test() { + p(ParseUrl.class); + + for (int i = 0; i < Url.URL_TESTS.length; i++) { + test(i); + } + } + + static void usage() { + p("usage: [jre] http_parser.lolevel.ParseUrl [i]"); + p(" i : optional test case id"); + p("---------------------------------------------"); + p("Test Cases:"); + for (int i =0; i!= Url.URL_TESTS.length; ++i) { + p(" "+i+": "+Url.URL_TESTS[i].name); + } + } + + public static void main (String [] args) { + if (0 == args.length) { + test(); + } else { + try { + int i = Integer.parseInt(args[0]); + test(i); + } catch (Throwable t) { + t.printStackTrace(); + usage(); + } + + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java new file mode 100644 index 000000000000..4367bbbddfe1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Requests.java @@ -0,0 +1,69 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import static http_parser.lolevel.Util.*; +import http_parser.*; + +import primitive.collection.ByteList; + +public class Requests { + + static void test_simple(String req, boolean should_pass) { + HTTPParser parser = new HTTPParser(ParserType.HTTP_REQUEST); + ByteBuffer buf = buffer(req); + boolean passed = false; + int read = 0; + try { + parser.execute(Util.SETTINGS_NULL, buf); + passed = (read == req.length()); + read = parser.execute(Util.SETTINGS_NULL, Util.empty()); + passed &= (0 == read); + } catch (Throwable t) { + passed = false; + } + check(passed == should_pass); + } + static void simple_tests() { + test_simple("hello world", false); + test_simple("GET / HTP/1.1\r\n\r\n", false); + + test_simple("ASDF / HTTP/1.1\r\n\r\n", false); + test_simple("PROPPATCHA / HTTP/1.1\r\n\r\n", false); + test_simple("GETA / HTTP/1.1\r\n\r\n", false); + } + + public static void test () { + p(Requests.class); + simple_tests(); + + List<Message> all = TestLoaderNG.load("tests.dumped"); + List<Message> requests = new LinkedList<Message>(); + for (Message m : all) { + if (ParserType.HTTP_REQUEST == m.type) { + requests.add(m); + } + } + for (Message m : requests) { + test_message(m); + } + + for (int i = 0; i!= requests.size(); ++i) { + if (!requests.get(i).should_keep_alive) continue; + for (int j = 0; j!=requests.size(); ++j) { + if (!requests.get(j).should_keep_alive) continue; + for (int k = 0; k!= requests.size(); ++k) { + test_multiple3(requests.get(i), requests.get(j), requests.get(k)); + } + } + } + + // postpone test_scan + + } + + + + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java new file mode 100644 index 000000000000..1cb71dc5f959 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Responses.java @@ -0,0 +1,52 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import static http_parser.lolevel.Util.*; +import http_parser.*; + +import primitive.collection.ByteList; + +public class Responses { + + + + public static void test () { + p(Responses.class); + List<Message> all = TestLoaderNG.load("tests.dumped"); + List<Message> responses = new LinkedList<Message>(); + for (Message m : all) { + if (ParserType.HTTP_RESPONSE == m.type) { + responses.add(m); + } + } + for (Message m : responses) { + test_message(m); + } + + for (int i = 0; i!= responses.size(); ++i) { + if (!responses.get(i).should_keep_alive) continue; + for (int j = 0; j!=responses.size(); ++j) { + if (!responses.get(j).should_keep_alive) continue; + for (int k = 0; k!= responses.size(); ++k) { + test_multiple3(responses.get(i), responses.get(j), responses.get(k)); + } + } + } + + // not sure what test_message_count_body does that test_message doesn't... + // Message m = find(responses, "404 no headers no body"); + // test_message_count_body(m); + // m = find(responses, "200 trailing space on chunked body"); + // test_message_count_body(m); + + // TODO test very large chunked response + + // test_scan is more or less the same as test_permutations, will implement later... + } + + + + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java new file mode 100644 index 000000000000..6c35898329f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Test.java @@ -0,0 +1,16 @@ +package http_parser.lolevel; + + +public class Test { + public static void main (String [] args) { + UnitTest.test(); + TestHeaderOverflowError.test(); + TestNoOverflowLongBody.test(); + Responses.test(); + ParseUrl.test(); + Requests.test(); + Upgrade.test(); + WrongContentLength.test(); + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java new file mode 100644 index 000000000000..ee4790325645 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestHeaderOverflowError.java @@ -0,0 +1,48 @@ +package http_parser.lolevel; + +import java.nio.*; + +import static http_parser.lolevel.Util.*; + +public class TestHeaderOverflowError { + + public static void test (http_parser.ParserType type) { + HTTPParser parser = new HTTPParser(type); + ByteBuffer buf = getBytes(type); + + int numbytes = buf.limit(); + + parser.execute(Util.SETTINGS_NULL, buf); + + check(numbytes == buf.position()); + + buf = buffer("header-key: header-value\r\n"); + numbytes = buf.limit(); + for (int i = 0; i!= 1000; ++i) { + parser.execute(Util.SETTINGS_NULL, buf); + check(numbytes == buf.position()); + + buf.rewind(); + + } + } + + static ByteBuffer getBytes (http_parser.ParserType type) { + if (http_parser.ParserType.HTTP_BOTH == type) { + throw new RuntimeException("only HTTP_REQUEST and HTTP_RESPONSE"); + } + + if (http_parser.ParserType.HTTP_REQUEST == type) { + return buffer("GET / HTTP/1.1\r\n"); + } + return buffer("HTTP/1.0 200 OK\r\n"); + } + + public static void test () { + p(TestHeaderOverflowError.class); + test(http_parser.ParserType.HTTP_REQUEST); + test(http_parser.ParserType.HTTP_RESPONSE); + } + + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java new file mode 100644 index 000000000000..329485dbdbf5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestLoaderNG.java @@ -0,0 +1,212 @@ +package http_parser.lolevel; +// name : 200 trailing space on chunked body +// raw : "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n" +// type : HTTP_RESPONSE +// method: HTTP_DELETE +// status code :200 +// request_path: +// request_url : +// fragment : +// query_string: +// body :"This is the data in the first chunk\r\nand this is the second one\r\n" +// body_size :65 +// header_0 :{ "Content-Type": "text/plain"} +// header_1 :{ "Transfer-Encoding": "chunked"} +// should_keep_alive :1 +// upgrade :0 +// http_major :1 +// http_minor :1 + + +import java.io.FileReader; +import java.io.BufferedReader; +import java.io.StringReader; +import java.io.Reader; +import java.io.Reader; +import java.io.IOException; + +import java.util.*; +import java.util.regex.*; + +import java.nio.ByteBuffer; + +import http_parser.HTTPMethod; +import http_parser.ParserType; + +public class TestLoaderNG { + String fn; + public TestLoaderNG(String filename) { + this.fn = filename; + } + static void p(Object o) { + System.out.println(o); + } + public static List<Message> load (String fn) { + List<Message> list = null; + try { + BufferedReader buf = new BufferedReader(new FileReader(fn)); + list = load(buf); + } catch (Throwable t) { + throw new RuntimeException(t); + } + return list; + + } + public static Message parse (String message) { + List<Message> list = load(new BufferedReader(new StringReader(message))); + if (null == list || 0 == list.size() ) { + return null; + } + return list.get(0); + } + + public static List<Message> load (BufferedReader buf) { + List<Message> list = new LinkedList<Message>(); + String line = null; + Message curr = new Message(); + Pattern pattern = Pattern.compile("(\\S+)\\s*:(.*)"); + try { + while (null != (line = buf.readLine()) ){ + if ("".equals(line.trim())) { + list.add (curr); + curr = new Message(); + continue; + } + Matcher m = pattern.matcher(line); + if (m.matches()) { + // you can not be fucking serious!? + // this has got to be the most retarded regex + // interface in the history of the world ... + // (though I'm sure there's worse c++ regexp libs...) + MatchResult r = m.toMatchResult(); + String key = r.group(1).trim(); + String value = r.group(2).trim(); + if ("name".equals(key)) {curr.name = value;} + else if ("raw".equals(key)) {curr.raw = toByteArray(value);} //! + else if ("type".equals(key)) {curr.type = ParserType.parse(value);} + else if ("method".equals(key)) {curr.method = HTTPMethod.parse(value);} + else if ("status_code".equals(key)) {curr.status_code = Integer.parseInt(value);} + else if ("request_path".equals(key)) {curr.request_path = value;} + else if ("request_url".equals(key)) {curr.request_url = value;} + + else if ("fragment".equals(key)) {curr.fragment = value;} + else if ("query_string".equals(key)) {curr.query_string = value;} + else if ("body".equals(key)) {curr.body = toByteArray(value);} //! + else if ("body_size".equals(key)) {curr.body_size = Integer.parseInt(value);} + else if (key.startsWith("header")) { + String [] h = getHeader(value); + curr.header.put(h[0], h[1]); + } + else if ("should_keep_alive".equals(key)) + {curr.should_keep_alive = (1 == Integer.parseInt(value));} + else if ("upgrade".equals(key)) { curr.upgrade = toByteArray(value);} + else if ("http_major".equals(key)) {curr.http_major = Integer.parseInt(value);} + else if ("http_minor".equals(key)) {curr.http_minor = Integer.parseInt(value);} + } else { + p("WTF?"+line); + } + + } + } catch (Throwable t) { + throw new RuntimeException(t); + } + return list; + } + + static String [] getHeader(String value) { + // { "Host": "0.0.0.0=5000"} + Pattern p = Pattern.compile("\\{ ?\"([^\"]*)\": ?\"(.*)\"}"); + Matcher m = p.matcher(value); + if (!m.matches()) { + p(value); + throw new RuntimeException("something wrong"); + } + String [] result = new String[2]; + MatchResult r = m.toMatchResult(); + result[0] = r.group(1).trim(); + result[1] = r.group(2); //.trim(); + return result; + } + + static final byte BSLASH = 0x5c; + static final byte QUOT = 0x22; + static final byte CR = 0x0d; + static final byte LF = 0x0a; + static final byte n = 0x6e; + static final byte r = 0x72; + + static final Byte[] JAVA_GENERICS_ROCK_HARD = new Byte[0]; + + + static byte [] toByteArray (String quotedString) { + ArrayList<Byte> bytes = new ArrayList<Byte>(); + String s = quotedString.substring(1, quotedString.length()-1); + byte [] byts = s.getBytes(java.nio.charset.Charset.forName("UTF8")); + boolean escaped = false; + for (byte b : byts) { + switch (b) { + case BSLASH: + escaped = true; + break; + case n: + if (escaped) { + bytes.add(LF); + escaped = false; + } else { + bytes.add(b); + } + break; + case r: + if (escaped) { + escaped = false; + bytes.add(CR); + } else { + bytes.add(b); + } + break; + case QUOT: + escaped = false; + bytes.add(QUOT); + break; + default: + bytes.add(b); + } + + } + + byts = new byte[bytes.size()]; + int i = 0; + for (Byte b : bytes) { + byts[i++]=b; + } + return byts; + } + + public static void main(String [] args) throws Throwable { + //TestLoaderNG l = new TestLoaderNG(args[0]); + List<Message> ts = load(args[0]); + for (Message t : ts) { +// for (int i =0; i!= t.raw.length; ++i) { +// p(i+":"+t.raw[i]); +// } +// try { + t.execute_permutations(); +// } catch (Throwable th) { +// p("failed: "+t.name); +// } + t.execute(); + // System.exit(0); + } + } + + class Header { + String field; + String value; + } + enum LastHeader { + NONE + ,FIELD + ,VALUE + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java new file mode 100644 index 000000000000..13d8ea0b2368 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/TestNoOverflowLongBody.java @@ -0,0 +1,62 @@ +package http_parser.lolevel; + +import java.nio.*; + +import static http_parser.lolevel.Util.*; + +public class TestNoOverflowLongBody { + + public static void test (http_parser.ParserType type, int len) { + HTTPParser parser = new HTTPParser(type); + ByteBuffer buf = getBytes(type, len); + + int buflen = buf.limit(); + + parser.execute(Util.SETTINGS_NULL, buf); + + check(buflen == buf.position()); + + buf = buffer("a"); + buflen = buf.limit(); + + for (int i = 0; i!= len; ++i) { + parser.execute(Util.SETTINGS_NULL, buf); + check(buflen == buf.position()); + buf.rewind(); + } + + buf = getBytes(type, len); + buflen = buf.limit(); + + parser.execute(Util.SETTINGS_NULL, buf); + + check(buflen == buf.position()); + + } + + static ByteBuffer getBytes (http_parser.ParserType type, int length) { + if (http_parser.ParserType.HTTP_BOTH == type) { + throw new RuntimeException("only HTTP_REQUEST and HTTP_RESPONSE"); + } + + String template = "%s\r\nConnection: Keep-Alive\r\nContent-Length: %d\r\n\r\n"; + String str = null; + if (http_parser.ParserType.HTTP_REQUEST == type) { + str = String.format(template, "GET / HTTP/1.1", length); + } else { + str = String.format(template, "HTTP/1.0 200 OK", length); + } + return buffer(str); + } + + public static void test () { + p(TestNoOverflowLongBody.class); + test(http_parser.ParserType.HTTP_REQUEST, 1000); + test(http_parser.ParserType.HTTP_REQUEST, 100000); + test(http_parser.ParserType.HTTP_RESPONSE, 1000); + test(http_parser.ParserType.HTTP_RESPONSE, 100000); + } + + + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java new file mode 100644 index 000000000000..415998033a91 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/UnitTest.java @@ -0,0 +1,117 @@ +package http_parser.lolevel; + +import java.nio.ByteBuffer; +import http_parser.HTTPException; +import http_parser.Util; + +public class UnitTest { + + static void p(Object o) {System.out.println(o);} + + public static void testErrorFormat() { + String bla = "This has an error in position 10 (the n in 'an')"; + ByteBuffer buf = ByteBuffer.wrap(bla.getBytes()); + buf.position(10); + + String mes = +"This has an error in position 10 (the n in 'an')\n" + +"..........^"; + + check_equals(mes, Util.error ("test error", buf, 0)); + + + bla = "123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J"; + buf = ByteBuffer.wrap(bla.getBytes()); + buf.position(50); + mes = +"56789B123456789C123456789D123456789E123456789F123456789G123456789H123456\n"+ +"....................................^"; + check_equals(mes, Util.error("test trim right and left", buf, 0)); + + + buf.position(5); + mes = +"123456789A123456789B123456789C123456789D123456789E123456789F123456789G12\n"+ +".....^"; + check_equals(mes, Util.error("test trim right", buf, 0)); + + + int limit = buf.limit(); + buf.limit(10); + mes = +"123456789A\n"+ +".....^"; + check_equals(mes, Util.error("all before, not enough after", buf, 0)); + + + + buf.limit(limit); + buf.position(90); + mes = +"9C123456789D123456789E123456789F123456789G123456789H123456789I123456789J\n"+ +"..............................................................^"; + check_equals(mes, Util.error("test trim left", buf, 10)); + } + + + // Test that the error callbacks are properly called. + public static void testErrorCallback () { + String nothttp = "THis is certainly not valid HTTP"; + ByteBuffer buf = ByteBuffer.wrap(nothttp.getBytes()); + + ParserSettings s = new ParserSettings(); + s.on_error = new HTTPErrorCallback() { + public void cb (HTTPParser p, String mes, ByteBuffer buf, int pos) { + throw new HTTPException(mes); + } + }; // err callback + + + HTTPParser p = new HTTPParser(); + try { + p.execute(s, buf); + } catch (HTTPException e) { + check_equals("Invalid HTTP method", e.getMessage()); + } + + buf = ByteBuffer.wrap("GET / HTTP 1.10000".getBytes()); + p = new HTTPParser(); + try { + p.execute(s, buf); + } catch (HTTPException e) { + check_equals("ridiculous http minor", e.getMessage()); + } + + // if no error handler is defined, behave just like the above... + ParserSettings s0 = new ParserSettings(); + + buf = ByteBuffer.wrap("THis is certainly not valid HTTP".getBytes()); + p = new HTTPParser(); + try { + p.execute(s0, buf); + } catch (HTTPException e) { + check_equals("Invalid HTTP method", e.getMessage()); + } + + buf = ByteBuffer.wrap("GET / HTTP 1.10000".getBytes()); + p = new HTTPParser(); + try { + p.execute(s0, buf); + } catch (HTTPException e) { + check_equals("ridiculous http minor", e.getMessage()); + } + } + + static void check_equals(Object supposed2be, Object is) { + if (!supposed2be.equals(is)) { + throw new RuntimeException(is + " is supposed to be "+supposed2be); + } + } + + + public static void test () { + p(UnitTest.class); + testErrorFormat(); + testErrorCallback(); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java new file mode 100644 index 000000000000..9af3d4a44a2c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Upgrade.java @@ -0,0 +1,27 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import http_parser.ParserType; + +import static http_parser.lolevel.Util.*; + +public class Upgrade { + static final String upgrade = "GET /demo HTTP/1.1\r\n" + + "Connection: Upgrade\r\n" + + "Upgrade: WebSocket\r\n\r\n" + + "third key data"; + static void test () { + p(Upgrade.class); + HTTPParser parser = new HTTPParser(ParserType.HTTP_REQUEST); + ByteBuffer buf = buffer(upgrade); + + int read = parser.execute(Util.SETTINGS_NULL, buf); + check (63 == read); + String s = str(buf); + check ("third key data".equals(str(buf))); + + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Url.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Url.java new file mode 100644 index 000000000000..35469d1c4480 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Url.java @@ -0,0 +1,127 @@ +package http_parser.lolevel; + +import http_parser.FieldData; +import http_parser.HTTPParserUrl; + +import static http_parser.HTTPParserUrl.*; +import static http_parser.lolevel.HTTPParser.*; + +/** + */ +public class Url { + + public static Url[] URL_TESTS = new Url[]{ + new Url("proxy request", "http://hostname/", false, + new HTTPParserUrl( + (1 << UrlFields.UF_SCHEMA.getIndex()) | (1 << UrlFields.UF_HOST.getIndex()) | (1 << UrlFields.UF_PATH.getIndex()), + 0, + new FieldData[]{ + new FieldData(0,4), + new FieldData(7,8), + new FieldData(0,0), + new FieldData(15,1), + new FieldData(0,0), + new FieldData(0,0) + }), + 0), + new Url("CONNECT request", "hostname:443", true, + new HTTPParserUrl( + (1 << UrlFields.UF_HOST.getIndex()) | (1 << UrlFields.UF_PORT.getIndex()), + 443, + new FieldData[]{ + new FieldData(0,0), + new FieldData(0,8), + new FieldData(9,3), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0) + }), + 0), + new Url("proxy ipv6 request", "http://[1:2::3:4]/", false, + new HTTPParserUrl( + (1 << UrlFields.UF_SCHEMA.getIndex()) | (1 << UrlFields.UF_HOST.getIndex()) | (1 << UrlFields.UF_PATH.getIndex()), + 0, + new FieldData[]{ + new FieldData(0,4), + new FieldData(8,8), + new FieldData(0,0), + new FieldData(17,1), + new FieldData(0,0), + new FieldData(0,0) + }), + 0), + new Url("CONNECT ipv6 address", "[1:2::3:4]:443", true, + new HTTPParserUrl( + (1 << UrlFields.UF_HOST.getIndex()) | (1 << UrlFields.UF_PORT.getIndex()), + 443, + new FieldData[]{ + new FieldData(0,0), + new FieldData(1,8), + new FieldData(11,3), + new FieldData(0,0), + new FieldData(0,0), + new FieldData(0,0) + }), + 0), + new Url("extra ? in query string", + "http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css,fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css,fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css", + false, + new HTTPParserUrl( + (1 << UrlFields.UF_SCHEMA.getIndex()) | + (1 << UrlFields.UF_HOST.getIndex()) | + (1 << UrlFields.UF_PATH.getIndex()) | + (1 << UrlFields.UF_QUERY.getIndex()), + 0, + new FieldData[]{ + new FieldData(0,4), + new FieldData(7,10), + new FieldData(0,0), + new FieldData(17,12), + new FieldData(30,187), + new FieldData(0,0) + }), + 0), + new Url("proxy empty host", + "http://:443/", + false, + null, + 1), + new Url("proxy empty port", + "http://hostname:/", + false, + null, + 1), + new Url("CONNECT empty host", + ":443", + true, + null, + 1), + new Url("CONNECT empty port", + "hostname:", + true, + null, + 1), + new Url("CONNECT with extra bits", + "hostname:443/", + true, + null, + 1), + + }; + + String name; + String url; + boolean is_connect; + HTTPParserUrl u; + int rv; + + public Url(String name, String url, boolean is_connect, HTTPParserUrl u, int rv) { + this.name = name; + this.url = url; + this.is_connect = is_connect; + this.u = u; + this.rv = rv; + } + + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java new file mode 100644 index 000000000000..c73d9e6267c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/Util.java @@ -0,0 +1,236 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import primitive.collection.ByteList; + +import http_parser.*; + +public class Util { + + static final ParserSettings SETTINGS_NULL = new ParserSettings(); + + static String str (ByteBuffer b, int pos, int len) { + byte [] by = new byte[len]; + int saved = b.position(); + b.position(pos); + b.get(by); + b.position(saved); + return new String(by); + } + static String str (ByteBuffer b) { + int len = b.limit() - b.position(); + byte [] by = new byte[len]; + int saved = b.position(); + b.get(by); + b.position(saved); + return new String(by); + } + + static ByteBuffer buffer(String str) { + return ByteBuffer.wrap(str.getBytes()); + } + + static ByteBuffer empty() { + return ByteBuffer.wrap(new byte[0]); + } + + static void check(boolean betterBtrue) { + if (!betterBtrue) { + throw new RuntimeException("!"); + } + } + static void check (int should, int is) { + if (should != is) { + throw new RuntimeException("should be: "+should+" is:"+is); + } + } + + static void test_message(Message mes) { + int raw_len = mes.raw.length; + for (int msg1len = 0; msg1len != raw_len; ++msg1len) { + mes.reset(); + ByteBuffer msg1 = ByteBuffer.wrap(mes.raw, 0, msg1len); + ByteBuffer msg2 = ByteBuffer.wrap(mes.raw, msg1len, mes.raw.length - msg1len); + + HTTPParser parser = new HTTPParser(mes.type); + ParserSettings settings = mes.settings(); + + int read = 0; + if (msg1len !=0) { + read = parser.execute(settings, msg1); + if (mes.upgrade() && parser.upgrade) { + // Messages have a settings() that checks itself... + check(1 == mes.num_called); + continue; + } + check(read == msg1len); + } + + read = parser.execute(settings, msg2); + if (mes.upgrade() && parser.upgrade) { + check(1 == mes.num_called); + continue; + } + + check( mes.raw.length - msg1len, read); + + ByteBuffer empty = Util.empty(); + read = parser.execute(settings, empty); + + if (mes.upgrade() && parser.upgrade) { + check(1 == mes.num_called); + continue; + } + check(empty.position() == empty.limit()); + check(0 == read); + check(1 == mes.num_called); + + } + } + + static void test_multiple3(Message r1, Message r2, Message r3) { + int message_count = 1; + if (!r1.upgrade()) { + message_count++; + if (!r2.upgrade()) { + message_count++; + } + } + boolean has_upgrade = (message_count < 3 || r3.upgrade()); + + ByteList blist = new ByteList(); + blist.addAll(r1.raw); + blist.addAll(r2.raw); + blist.addAll(r3.raw); + + byte [] raw = blist.toArray(); + ByteBuffer buf = ByteBuffer.wrap(raw); + + Util.Settings settings = Util.settings(); + HTTPParser parser = new HTTPParser(r1.type); + + int read = parser.execute(settings, buf); + if (has_upgrade && parser.upgrade) { + raw = upgrade_message_fix(raw, read, r1,r2,r3); + check(settings.numCalled == message_count); + return; + } + + check(read == raw.length); + + buf = Util.empty(); + read = parser.execute(settings, buf); + if (has_upgrade && parser.upgrade) { + check(settings.numCalled == message_count); + return; + } + + check(0 == read); + check(settings.numCalled == message_count); + } + + /* Given a sequence of bytes and the number of these that we were able to + * parse, verify that upgrade bodies are correct. + */ + static byte [] upgrade_message_fix(byte[] body, int nread, Message... msgs) { + int off = 0; + for (Message m : msgs) { + off += m.raw.length; + if (m.upgrade()) { + off -= m.upgrade.length; + // Original C: + // Check the portion of the response after its specified upgrade + // if (!check_str_eq(m, "upgrade", body + off, body + nread)) { + // abort(); + // } + // to me, this seems to be equivalent to comparing off and nread ... + check (off, nread); + + // Original C: + // Fix up the response so that message_eq() will verify the beginning + // of the upgrade */ + // + // *(body + nread + strlen(m->upgrade)) = '\0'; + // This only shortens body so the strlen check passes. + return new byte[off]; + + } + } + return null; + } +//upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) { +// va_list ap; +// size_t i; +// size_t off = 0; +// +// va_start(ap, nmsgs); +// +// for (i = 0; i < nmsgs; i++) { +// struct message *m = va_arg(ap, struct message *); +// +// off += strlen(m->raw); +// +// if (m->upgrade) { +// off -= strlen(m->upgrade); +// +// /* Check the portion of the response after its specified upgrade */ +// if (!check_str_eq(m, "upgrade", body + off, body + nread)) { +// abort(); +// } +// +// /* Fix up the response so that message_eq() will verify the beginning +// * of the upgrade */ +// *(body + nread + strlen(m->upgrade)) = '\0'; +// messages[num_messages -1 ].upgrade = body + nread; +// +// va_end(ap); +// return; +// } +// } +// +// va_end(ap); +// printf("\n\n*** Error: expected a message with upgrade ***\n"); +// +// abort(); +//} + static void p (Object o) { + System.out.println(o); + } + + static Settings settings() { + return new Settings(); + } + static Message find(List<Message> list, String name) { + for (Message m : list) { + if (name.equals(m.name)) { + return m; + } + } + return null; + } + + static class Settings extends ParserSettings { + public int numCalled; + public int bodyCount; + Settings() { + this.on_message_complete = new HTTPCallback() { + public int cb (HTTPParser parser) { + numCalled++; + return 0; + } + }; + this.on_body = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len) { + bodyCount += len; + return 0; + } + }; + } + + int numCalled () { + return this.numCalled; + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java new file mode 100644 index 000000000000..fc8f081247c5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/src/test/http_parser/lolevel/WrongContentLength.java @@ -0,0 +1,59 @@ +package http_parser.lolevel; + +import java.nio.*; +import java.util.*; + +import http_parser.ParserType; + +import static http_parser.lolevel.Util.*; + +public class WrongContentLength { + static final String contentLength = "GET / HTTP/1.0\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "hello" + + "hello_again"; + static void test () { + p(WrongContentLength.class); + HTTPParser parser = new HTTPParser(ParserType.HTTP_REQUEST); + ByteBuffer buf = buffer(contentLength); + + Settings settings = new Settings(); + + int read = parser.execute(settings, buf); + check (settings.msg_cmplt_called); + check ("invalid method".equals(settings.err)); + + } + public static void main(String [] args) { + test(); + } + + static class Settings extends ParserSettings { + public int bodyCount; + public boolean msg_cmplt_called; + public String err; + Settings () { + this.on_message_complete = new HTTPCallback () { + public int cb (HTTPParser p) { + check (5 == bodyCount); + msg_cmplt_called = true; + return 0; + } + }; + this.on_body = new HTTPDataCallback() { + public int cb (HTTPParser p, ByteBuffer b, int pos, int len) { + bodyCount += len; + check ("hello".equals(str(b, pos, len))); + return 0; + } + }; + this.on_error = new HTTPErrorCallback() { + public void cb (HTTPParser p, String mes, ByteBuffer b, int i) { + err = mes; + } + }; + } + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/test.c b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/test.c new file mode 100644 index 000000000000..3840747c3067 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/test.c @@ -0,0 +1,3425 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include <stdlib.h> +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> /* rand */ +#include <string.h> +#include <stdarg.h> + +#undef TRUE +#define TRUE 1 +#undef FALSE +#define FALSE 0 + +#define MAX_HEADERS 13 +#define MAX_ELEMENT_SIZE 2048 + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +static http_parser *parser; + +struct message { + const char *name; // for debugging purposes + const char *raw; + enum http_parser_type type; + enum http_method method; + int status_code; + char request_path[MAX_ELEMENT_SIZE]; + char request_url[MAX_ELEMENT_SIZE]; + char fragment[MAX_ELEMENT_SIZE]; + char query_string[MAX_ELEMENT_SIZE]; + char body[MAX_ELEMENT_SIZE]; + size_t body_size; + const char *host; + const char *userinfo; + uint16_t port; + int num_headers; + enum { NONE=0, FIELD, VALUE } last_header_element; + char headers [MAX_HEADERS][2][MAX_ELEMENT_SIZE]; + int should_keep_alive; + + const char *upgrade; // upgraded body + + unsigned short http_major; + unsigned short http_minor; + + int message_begin_cb_called; + int headers_complete_cb_called; + int message_complete_cb_called; + int message_complete_on_eof; + int body_is_final; +}; + +static int currently_parsing_eof; + +static struct message messages[5]; +static int num_messages; +static http_parser_settings *current_pause_parser; + +/* * R E Q U E S T S * */ +const struct message requests[] = +#define CURL_GET 0 +{ {.name= "curl get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.1\r\n" + "User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= + { { "User-Agent", "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1" } + , { "Host", "0.0.0.0=5000" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define FIREFOX_GET 1 +, {.name= "firefox get" + ,.type= HTTP_REQUEST + ,.raw= "GET /favicon.ico HTTP/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" + "Accept-Language: en-us,en;q=0.5\r\n" + "Accept-Encoding: gzip,deflate\r\n" + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" + "Keep-Alive: 300\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/favicon.ico" + ,.request_url= "/favicon.ico" + ,.num_headers= 8 + ,.headers= + { { "Host", "0.0.0.0=5000" } + , { "User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0" } + , { "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } + , { "Accept-Language", "en-us,en;q=0.5" } + , { "Accept-Encoding", "gzip,deflate" } + , { "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" } + , { "Keep-Alive", "300" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define DUMBFUCK 2 +, {.name= "dumbfuck" + ,.type= HTTP_REQUEST + ,.raw= "GET /dumbfuck HTTP/1.1\r\n" + "aaaaaaaaaaaaa:++++++++++\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/dumbfuck" + ,.request_url= "/dumbfuck" + ,.num_headers= 1 + ,.headers= + { { "aaaaaaaaaaaaa", "++++++++++" } + } + ,.body= "" + } + +#define FRAGMENT_IN_URI 3 +, {.name= "fragment in url" + ,.type= HTTP_REQUEST + ,.raw= "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "page=1" + ,.fragment= "posts-17408" + ,.request_path= "/forums/1/topics/2375" + /* XXX request url does include fragment? */ + ,.request_url= "/forums/1/topics/2375?page=1#posts-17408" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_NO_HEADERS_NO_BODY 4 +, {.name= "get no headers no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_no_headers_no_body/world HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_no_headers_no_body/world" + ,.request_url= "/get_no_headers_no_body/world" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_ONE_HEADER_NO_BODY 5 +, {.name= "get one header no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_one_header_no_body HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_one_header_no_body" + ,.request_url= "/get_one_header_no_body" + ,.num_headers= 1 + ,.headers= + { { "Accept" , "*/*" } + } + ,.body= "" + } + +#define GET_FUNKY_CONTENT_LENGTH 6 +, {.name= "get funky content length body hello" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_funky_content_length_body_hello HTTP/1.0\r\n" + "conTENT-Length: 5\r\n" + "\r\n" + "HELLO" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_funky_content_length_body_hello" + ,.request_url= "/get_funky_content_length_body_hello" + ,.num_headers= 1 + ,.headers= + { { "conTENT-Length" , "5" } + } + ,.body= "HELLO" + } + +#define POST_IDENTITY_BODY_WORLD 7 +, {.name= "post identity body world" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_identity_body_world?q=search#hey HTTP/1.1\r\n" + "Accept: */*\r\n" + "Transfer-Encoding: identity\r\n" + "Content-Length: 5\r\n" + "\r\n" + "World" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "q=search" + ,.fragment= "hey" + ,.request_path= "/post_identity_body_world" + ,.request_url= "/post_identity_body_world?q=search#hey" + ,.num_headers= 3 + ,.headers= + { { "Accept", "*/*" } + , { "Transfer-Encoding", "identity" } + , { "Content-Length", "5" } + } + ,.body= "World" + } + +#define POST_CHUNKED_ALL_YOUR_BASE 8 +, {.name= "post - chunked body: all your base are belong to us" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_chunked_all_your_base HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "1e\r\nall your base are belong to us\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/post_chunked_all_your_base" + ,.request_url= "/post_chunked_all_your_base" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding" , "chunked" } + } + ,.body= "all your base are belong to us" + } + +#define TWO_CHUNKS_MULT_ZERO_END 9 +, {.name= "two chunks ; triple zero ending" + ,.type= HTTP_REQUEST + ,.raw= "POST /two_chunks_mult_zero_end HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "000\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/two_chunks_mult_zero_end" + ,.request_url= "/two_chunks_mult_zero_end" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + } + +#define CHUNKED_W_TRAILING_HEADERS 10 +, {.name= "chunked with trailing headers. blech." + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_trailing_headers HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "0\r\n" + "Vary: *\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_trailing_headers" + ,.request_url= "/chunked_w_trailing_headers" + ,.num_headers= 3 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Vary", "*" } + , { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define CHUNKED_W_BULLSHIT_AFTER_LENGTH 11 +, {.name= "with bullshit after the length" + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_bullshit_after_length HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n" + "6; blahblah; blah\r\n world\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_bullshit_after_length" + ,.request_url= "/chunked_w_bullshit_after_length" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + } + +#define WITH_QUOTES 12 +, {.name= "with quotes" + ,.type= HTTP_REQUEST + ,.raw= "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=\"bar\"" + ,.fragment= "" + ,.request_path= "/with_\"stupid\"_quotes" + ,.request_url= "/with_\"stupid\"_quotes?foo=\"bar\"" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define APACHEBENCH_GET 13 +/* The server receiving this request SHOULD NOT wait for EOF + * to know that content-length == 0. + * How to represent this in a unit test? message_complete_on_eof + * Compare with NO_CONTENT_LENGTH_RESPONSE. + */ +, {.name = "apachebench get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.0\r\n" + "Host: 0.0.0.0:5000\r\n" + "User-Agent: ApacheBench/2.3\r\n" + "Accept: */*\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= { { "Host", "0.0.0.0:5000" } + , { "User-Agent", "ApacheBench/2.3" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define QUERY_URL_WITH_QUESTION_MARK_GET 14 +/* Some clients include '?' characters in query strings. + */ +, {.name = "query url with question mark" + ,.type= HTTP_REQUEST + ,.raw= "GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=bar?baz" + ,.fragment= "" + ,.request_path= "/test.cgi" + ,.request_url= "/test.cgi?foo=bar?baz" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define PREFIX_NEWLINE_GET 15 +/* Some clients, especially after a POST in a keep-alive connection, + * will send an extra CRLF before the next request + */ +, {.name = "newline prefix get" + ,.type= HTTP_REQUEST + ,.raw= "\r\nGET /test HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define UPGRADE_REQUEST 16 +, {.name = "upgrade request" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "Upgrade: WebSocket\r\n" + "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" + "Origin: http://example.com\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.num_headers= 7 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Upgrade" } + , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } + , { "Sec-WebSocket-Protocol", "sample" } + , { "Upgrade", "WebSocket" } + , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } + , { "Origin", "http://example.com" } + } + ,.body= "" + } + +#define CONNECT_REQUEST 17 +, {.name = "connect request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + "some data\r\n" + "and yet even more data" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "0-home0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="some data\r\nand yet even more data" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#define REPORT_REQ 18 +, {.name= "report request" + ,.type= HTTP_REQUEST + ,.raw= "REPORT /test HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_REPORT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define NO_HTTP_VERSION 19 +, {.name= "request with no http version" + ,.type= HTTP_REQUEST + ,.raw= "GET /\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 0 + ,.http_minor= 9 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define MSEARCH_REQ 20 +, {.name= "m-search request" + ,.type= HTTP_REQUEST + ,.raw= "M-SEARCH * HTTP/1.1\r\n" + "HOST: 239.255.255.250:1900\r\n" + "MAN: \"ssdp:discover\"\r\n" + "ST: \"ssdp:all\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_MSEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "*" + ,.request_url= "*" + ,.num_headers= 3 + ,.headers= { { "HOST", "239.255.255.250:1900" } + , { "MAN", "\"ssdp:discover\"" } + , { "ST", "\"ssdp:all\"" } + } + ,.body= "" + } + +#define LINE_FOLDING_IN_HEADER 21 +, {.name= "line folding in header value" + ,.type= HTTP_REQUEST + ,.raw= "GET / HTTP/1.1\r\n" + "Line1: abc\r\n" + "\tdef\r\n" + " ghi\r\n" + "\t\tjkl\r\n" + " mno \r\n" + "\t \tqrs\r\n" + "Line2: \t line2\t\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 2 + ,.headers= { { "Line1", "abcdefghijklmno qrs" } + , { "Line2", "line2\t" } + } + ,.body= "" + } + + +#define QUERY_TERMINATED_HOST 22 +, {.name= "host terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org?hail=all" + ,.host= "hypnotoad.org" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define QUERY_TERMINATED_HOSTPORT 23 +, {.name= "host:port terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234?hail=all" + ,.host= "hypnotoad.org" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define SPACE_TERMINATED_HOSTPORT 24 +, {.name= "host:port terminated by a space" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234" + ,.host= "hypnotoad.org" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define PATCH_REQ 25 +, {.name = "PATCH request" + ,.type= HTTP_REQUEST + ,.raw= "PATCH /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/example\r\n" + "If-Match: \"e0023aa4e\"\r\n" + "Content-Length: 10\r\n" + "\r\n" + "cccccccccc" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PATCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 4 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/example" } + , { "If-Match", "\"e0023aa4e\"" } + , { "Content-Length", "10" } + } + ,.body= "cccccccccc" + } + +#define CONNECT_CAPS_REQUEST 26 +, {.name = "connect caps request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "HOME0.NETSCAPE.COM:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define UTF8_PATH_REQ 27 +, {.name= "utf-8 path request" + ,.type= HTTP_REQUEST + ,.raw= "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\n" + "Host: github.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "q=1" + ,.fragment= "narf" + ,.request_path= "/δ¶/δt/pope" + ,.request_url= "/δ¶/δt/pope?q=1#narf" + ,.num_headers= 1 + ,.headers= { {"Host", "github.com" } + } + ,.body= "" + } + +#define HOSTNAME_UNDERSCORE 28 +, {.name = "hostname underscore" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT home_0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "home_0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } +#endif /* !HTTP_PARSER_STRICT */ + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_NO_CONNECTION_CLOSE 29 +, {.name = "eat CRLF between requests, no \"Connection: close\" header" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 3 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + } + ,.body= "q=42" + } + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_WITH_CONNECTION_CLOSE 30 +, {.name = "eat CRLF between requests even if \"Connection: close\" is set" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "Connection: close\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE /* input buffer isn't empty when on_message_complete is called */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 4 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + , { "Connection", "close" } + } + ,.body= "q=42" + } + +#define PURGE_REQ 31 +, {.name = "PURGE request" + ,.type= HTTP_REQUEST + ,.raw= "PURGE /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PURGE + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +#define SEARCH_REQ 32 +, {.name = "SEARCH request" + ,.type= HTTP_REQUEST + ,.raw= "SEARCH / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_SEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +#define PROXY_WITH_BASIC_AUTH 33 +, {.name= "host:port and basic_auth" + ,.type= HTTP_REQUEST + ,.raw= "GET http://a%12:b!&*$@hypnotoad.org:1234/toto HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.fragment= "" + ,.request_path= "/toto" + ,.request_url= "http://a%12:b!&*$@hypnotoad.org:1234/toto" + ,.host= "hypnotoad.org" + ,.userinfo= "a%12:b!&*$" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + + +, {.name= NULL } /* sentinel */ +}; + +/* * R E S P O N S E S * */ +const struct message responses[] = +#define GOOGLE_301 0 +{ {.name= "google 301" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301 Moved Permanently\r\n" + "Location: http://www.google.com/\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Date: Sun, 26 Apr 2009 11:11:49 GMT\r\n" + "Expires: Tue, 26 May 2009 11:11:49 GMT\r\n" + "X-$PrototypeBI-Version: 1.6.0.3\r\n" /* $ char in header field */ + "Cache-Control: public, max-age=2592000\r\n" + "Server: gws\r\n" + "Content-Length: 219 \r\n" + "\r\n" + "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n" + "<TITLE>301 Moved</TITLE></HEAD><BODY>\n" + "<H1>301 Moved</H1>\n" + "The document has moved\n" + "<A HREF=\"http://www.google.com/\">here</A>.\r\n" + "</BODY></HTML>\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.num_headers= 8 + ,.headers= + { { "Location", "http://www.google.com/" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Date", "Sun, 26 Apr 2009 11:11:49 GMT" } + , { "Expires", "Tue, 26 May 2009 11:11:49 GMT" } + , { "X-$PrototypeBI-Version", "1.6.0.3" } + , { "Cache-Control", "public, max-age=2592000" } + , { "Server", "gws" } + , { "Content-Length", "219 " } + } + ,.body= "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n" + "<TITLE>301 Moved</TITLE></HEAD><BODY>\n" + "<H1>301 Moved</H1>\n" + "The document has moved\n" + "<A HREF=\"http://www.google.com/\">here</A>.\r\n" + "</BODY></HTML>\r\n" + } + +#define NO_CONTENT_LENGTH_RESPONSE 1 +/* The client should wait for the server's EOF. That is, when content-length + * is not specified, and "Connection: close", the end of body is specified + * by the EOF. + * Compare with APACHEBENCH_GET + */ +, {.name= "no content-length response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 04 Aug 2009 07:59:32 GMT\r\n" + "Server: Apache\r\n" + "X-Powered-By: Servlet/2.5 JSP/2.1\r\n" + "Content-Type: text/xml; charset=utf-8\r\n" + "Connection: close\r\n" + "\r\n" + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + " <SOAP-ENV:Body>\n" + " <SOAP-ENV:Fault>\n" + " <faultcode>SOAP-ENV:Client</faultcode>\n" + " <faultstring>Client Error</faultstring>\n" + " </SOAP-ENV:Fault>\n" + " </SOAP-ENV:Body>\n" + "</SOAP-ENV:Envelope>" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 5 + ,.headers= + { { "Date", "Tue, 04 Aug 2009 07:59:32 GMT" } + , { "Server", "Apache" } + , { "X-Powered-By", "Servlet/2.5 JSP/2.1" } + , { "Content-Type", "text/xml; charset=utf-8" } + , { "Connection", "close" } + } + ,.body= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + " <SOAP-ENV:Body>\n" + " <SOAP-ENV:Fault>\n" + " <faultcode>SOAP-ENV:Client</faultcode>\n" + " <faultstring>Client Error</faultstring>\n" + " </SOAP-ENV:Fault>\n" + " </SOAP-ENV:Body>\n" + "</SOAP-ENV:Envelope>" + } + +#define NO_HEADERS_NO_BODY_404 2 +, {.name= "404 no headers no body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 404 Not Found\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 404 + ,.num_headers= 0 + ,.headers= {} + ,.body_size= 0 + ,.body= "" + } + +#define NO_REASON_PHRASE 3 +, {.name= "301 no response phrase" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301\r\n\r\n" + ,.should_keep_alive = FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define TRAILING_SPACE_ON_CHUNKED_BODY 4 +, {.name="200 trailing space on chunked body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "25 \r\n" + "This is the data in the first chunk\r\n" + "\r\n" + "1C\r\n" + "and this is the second one\r\n" + "\r\n" + "0 \r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/plain" } + , {"Transfer-Encoding", "chunked" } + } + ,.body_size = 37+28 + ,.body = + "This is the data in the first chunk\r\n" + "and this is the second one\r\n" + + } + +#define NO_CARRIAGE_RET 5 +, {.name="no carriage ret" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\n" + "Content-Type: text/html; charset=utf-8\n" + "Connection: close\n" + "\n" + "these headers are from http://news.ycombinator.com/" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/html; charset=utf-8" } + , {"Connection", "close" } + } + ,.body= "these headers are from http://news.ycombinator.com/" + } + +#define PROXY_CONNECTION 6 +, {.name="proxy connection" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Content-Length: 11\r\n" + "Proxy-Connection: close\r\n" + "Date: Thu, 31 Dec 2009 20:55:48 +0000\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 4 + ,.headers= + { {"Content-Type", "text/html; charset=UTF-8" } + , {"Content-Length", "11" } + , {"Proxy-Connection", "close" } + , {"Date", "Thu, 31 Dec 2009 20:55:48 +0000"} + } + ,.body= "hello world" + } + +#define UNDERSTORE_HEADER_KEY 7 + // shown by + // curl -o /dev/null -v "http://ad.doubleclick.net/pfadx/DARTSHELLCONFIGXML;dcmt=text/xml;" +, {.name="underscore header key" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: DCLK-AdSvr\r\n" + "Content-Type: text/xml\r\n" + "Content-Length: 0\r\n" + "DCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 4 + ,.headers= + { {"Server", "DCLK-AdSvr" } + , {"Content-Type", "text/xml" } + , {"Content-Length", "0" } + , {"DCLK_imp", "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" } + } + ,.body= "" + } + +#define BONJOUR_MADAME_FR 8 +/* The client should not merge two headers fields when the first one doesn't + * have a value. + */ +, {.name= "bonjourmadame.fr" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 301 Moved Permanently\r\n" + "Date: Thu, 03 Jun 2010 09:56:32 GMT\r\n" + "Server: Apache/2.2.3 (Red Hat)\r\n" + "Cache-Control: public\r\n" + "Pragma: \r\n" + "Location: http://www.bonjourmadame.fr/\r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: 0\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 301 + ,.num_headers= 9 + ,.headers= + { { "Date", "Thu, 03 Jun 2010 09:56:32 GMT" } + , { "Server", "Apache/2.2.3 (Red Hat)" } + , { "Cache-Control", "public" } + , { "Pragma", "" } + , { "Location", "http://www.bonjourmadame.fr/" } + , { "Vary", "Accept-Encoding" } + , { "Content-Length", "0" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define RES_FIELD_UNDERSCORE 9 +/* Should handle spaces in header fields */ +, {.name= "field underscore" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 28 Sep 2010 01:14:13 GMT\r\n" + "Server: Apache\r\n" + "Cache-Control: no-cache, must-revalidate\r\n" + "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n" + ".et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\n" + "Vary: Accept-Encoding\r\n" + "_eep-Alive: timeout=45\r\n" /* semantic value ignored */ + "_onnection: Keep-Alive\r\n" /* semantic value ignored */ + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/html\r\n" + "Connection: close\r\n" + "\r\n" + "0\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 11 + ,.headers= + { { "Date", "Tue, 28 Sep 2010 01:14:13 GMT" } + , { "Server", "Apache" } + , { "Cache-Control", "no-cache, must-revalidate" } + , { "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" } + , { ".et-Cookie", "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com" } + , { "Vary", "Accept-Encoding" } + , { "_eep-Alive", "timeout=45" } + , { "_onnection", "Keep-Alive" } + , { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/html" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define NON_ASCII_IN_STATUS_LINE 10 +/* Should handle non-ASCII in status line */ +, {.name= "non-ASCII in status line" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 500 Oriëntatieprobleem\r\n" + "Date: Fri, 5 Nov 2010 23:07:12 GMT+2\r\n" + "Content-Length: 0\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 500 + ,.num_headers= 3 + ,.headers= + { { "Date", "Fri, 5 Nov 2010 23:07:12 GMT+2" } + , { "Content-Length", "0" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define HTTP_VERSION_0_9 11 +/* Should handle HTTP/0.9 */ +, {.name= "http version 0.9" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/0.9 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 0 + ,.http_minor= 9 + ,.status_code= 200 + ,.num_headers= 0 + ,.headers= + {} + ,.body= "" + } + +#define NO_CONTENT_LENGTH_NO_TRANSFER_ENCODING_RESPONSE 12 +/* The client should wait for the server's EOF. That is, when neither + * content-length nor transfer-encoding is specified, the end of body + * is specified by the EOF. + */ +, {.name= "neither content-length nor transfer-encoding response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define NO_BODY_HTTP10_KA_200 13 +, {.name= "HTTP/1.0 with keep-alive and EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 200 OK\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP10_KA_204 14 +, {.name= "HTTP/1.0 with keep-alive and a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 204 No content\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 204 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_200 15 +, {.name= "HTTP/1.1 with an EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_204 16 +, {.name= "HTTP/1.1 with a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_NOKA_204 17 +, {.name= "HTTP/1.1 with a 204 status and keep-alive disabled" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.num_headers= 1 + ,.headers= + { { "Connection", "close" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_CHUNKED_200 18 +, {.name= "HTTP/1.1 with chunked endocing and a 200 response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body_size= 0 + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define SPACE_IN_FIELD_RES 19 +/* Should handle spaces in header fields */ +, {.name= "field space" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: Microsoft-IIS/6.0\r\n" + "X-Powered-By: ASP.NET\r\n" + "en-US Content-Type: text/xml\r\n" /* this is the problem */ + "Content-Type: text/xml\r\n" + "Content-Length: 16\r\n" + "Date: Fri, 23 Jul 2010 18:45:38 GMT\r\n" + "Connection: keep-alive\r\n" + "\r\n" + "<xml>hello</xml>" /* fake body */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 7 + ,.headers= + { { "Server", "Microsoft-IIS/6.0" } + , { "X-Powered-By", "ASP.NET" } + , { "en-US Content-Type", "text/xml" } + , { "Content-Type", "text/xml" } + , { "Content-Length", "16" } + , { "Date", "Fri, 23 Jul 2010 18:45:38 GMT" } + , { "Connection", "keep-alive" } + } + ,.body= "<xml>hello</xml>" + } +#endif /* !HTTP_PARSER_STRICT */ + +, {.name= NULL } /* sentinel */ +}; + +/* strnlen() is a POSIX.2008 addition. Can't rely on it being available so + * define it ourselves. + */ +size_t +strnlen(const char *s, size_t maxlen) +{ + const char *p; + + p = memchr(s, '\0', maxlen); + if (p == NULL) + return maxlen; + + return p - s; +} + +size_t +strlncat(char *dst, size_t len, const char *src, size_t n) +{ + size_t slen; + size_t dlen; + size_t rlen; + size_t ncpy; + + slen = strnlen(src, n); + dlen = strnlen(dst, len); + + if (dlen < len) { + rlen = len - dlen; + ncpy = slen < rlen ? slen : (rlen - 1); + memcpy(dst + dlen, src, ncpy); + dst[dlen + ncpy] = '\0'; + } + + assert(len > slen + dlen); + return slen + dlen; +} + +size_t +strlcat(char *dst, const char *src, size_t len) +{ + return strlncat(dst, len, src, (size_t) -1); +} + +size_t +strlncpy(char *dst, size_t len, const char *src, size_t n) +{ + size_t slen; + size_t ncpy; + + slen = strnlen(src, n); + + if (len > 0) { + ncpy = slen < len ? slen : (len - 1); + memcpy(dst, src, ncpy); + dst[ncpy] = '\0'; + } + + assert(len > slen); + return slen; +} + +size_t +strlcpy(char *dst, const char *src, size_t len) +{ + return strlncpy(dst, len, src, (size_t) -1); +} + +int +request_url_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strlncat(messages[num_messages].request_url, + sizeof(messages[num_messages].request_url), + buf, + len); + return 0; +} + +int +status_complete_cb (http_parser *p) { + assert(p == parser); + p->data++; + return 0; +} + +int +header_field_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + if (m->last_header_element != FIELD) + m->num_headers++; + + strlncat(m->headers[m->num_headers-1][0], + sizeof(m->headers[m->num_headers-1][0]), + buf, + len); + + m->last_header_element = FIELD; + + return 0; +} + +int +header_value_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + strlncat(m->headers[m->num_headers-1][1], + sizeof(m->headers[m->num_headers-1][1]), + buf, + len); + + m->last_header_element = VALUE; + + return 0; +} + +void +check_body_is_final (const http_parser *p) +{ + if (messages[num_messages].body_is_final) { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + messages[num_messages].body_is_final = http_body_is_final(p); +} + +int +body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strlncat(messages[num_messages].body, + sizeof(messages[num_messages].body), + buf, + len); + messages[num_messages].body_size += len; + check_body_is_final(p); + // printf("body_cb: '%s'\n", requests[num_messages].body); + return 0; +} + +int +count_body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + assert(buf); + messages[num_messages].body_size += len; + check_body_is_final(p); + return 0; +} + +int +message_begin_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].message_begin_cb_called = TRUE; + return 0; +} + +int +headers_complete_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].method = parser->method; + messages[num_messages].status_code = parser->status_code; + messages[num_messages].http_major = parser->http_major; + messages[num_messages].http_minor = parser->http_minor; + messages[num_messages].headers_complete_cb_called = TRUE; + messages[num_messages].should_keep_alive = http_should_keep_alive(parser); + return 0; +} + +int +message_complete_cb (http_parser *p) +{ + assert(p == parser); + if (messages[num_messages].should_keep_alive != http_should_keep_alive(parser)) + { + fprintf(stderr, "\n\n *** Error http_should_keep_alive() should have same " + "value in both on_message_complete and on_headers_complete " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + + if (messages[num_messages].body_size && + http_body_is_final(p) && + !messages[num_messages].body_is_final) + { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + + messages[num_messages].message_complete_cb_called = TRUE; + + messages[num_messages].message_complete_on_eof = currently_parsing_eof; + + num_messages++; + return 0; +} + +/* These dontcall_* callbacks exist so that we can verify that when we're + * paused, no additional callbacks are invoked */ +int +dontcall_message_begin_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_begin() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_field() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_value() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_request_url() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_body_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_body_cb() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_headers_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_headers_complete() called on paused " + "parser ***\n\n"); + abort(); +} + +int +dontcall_message_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_complete() called on paused " + "parser ***\n\n"); + abort(); +} + +static http_parser_settings settings_dontcall = + {.on_message_begin = dontcall_message_begin_cb + ,.on_header_field = dontcall_header_field_cb + ,.on_header_value = dontcall_header_value_cb + ,.on_url = dontcall_request_url_cb + ,.on_body = dontcall_body_cb + ,.on_headers_complete = dontcall_headers_complete_cb + ,.on_message_complete = dontcall_message_complete_cb + }; + +/* These pause_* callbacks always pause the parser and just invoke the regular + * callback that tracks content. Before returning, we overwrite the parser + * settings to point to the _dontcall variety so that we can verify that + * the pause actually did, you know, pause. */ +int +pause_message_begin_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_begin_cb(p); +} + +int +pause_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_field_cb(p, buf, len); +} + +int +pause_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_value_cb(p, buf, len); +} + +int +pause_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return request_url_cb(p, buf, len); +} + +int +pause_body_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return body_cb(p, buf, len); +} + +int +pause_headers_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return headers_complete_cb(p); +} + +int +pause_message_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_complete_cb(p); +} + +static http_parser_settings settings_pause = + {.on_message_begin = pause_message_begin_cb + ,.on_header_field = pause_header_field_cb + ,.on_header_value = pause_header_value_cb + ,.on_url = pause_request_url_cb + ,.on_body = pause_body_cb + ,.on_headers_complete = pause_headers_complete_cb + ,.on_message_complete = pause_message_complete_cb + }; + +static http_parser_settings settings = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_body = body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + }; + +static http_parser_settings settings_count_body = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_body = count_body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + }; + +static http_parser_settings settings_null = + {.on_message_begin = 0 + ,.on_header_field = 0 + ,.on_header_value = 0 + ,.on_url = 0 + ,.on_body = 0 + ,.on_headers_complete = 0 + ,.on_message_complete = 0 + }; + +void +parser_init (enum http_parser_type type) +{ + num_messages = 0; + + assert(parser == NULL); + + parser = malloc(sizeof(http_parser)); + + http_parser_init(parser, type); + + memset(&messages, 0, sizeof messages); + +} + +void +parser_free () +{ + assert(parser); + free(parser); + parser = NULL; +} + +size_t parse (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings, buf, len); + return nparsed; +} + +size_t parse_count_body (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings_count_body, buf, len); + return nparsed; +} + +size_t parse_pause (const char *buf, size_t len) +{ + size_t nparsed; + http_parser_settings s = settings_pause; + + currently_parsing_eof = (len == 0); + current_pause_parser = &s; + nparsed = http_parser_execute(parser, current_pause_parser, buf, len); + return nparsed; +} + +static inline int +check_str_eq (const struct message *m, + const char *prop, + const char *expected, + const char *found) { + if ((expected == NULL) != (found == NULL)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %s\n", (expected == NULL) ? "NULL" : expected); + printf(" found %s\n", (found == NULL) ? "NULL" : found); + return 0; + } + if (expected != NULL && 0 != strcmp(expected, found)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected '%s'\n", expected); + printf(" found '%s'\n", found); + return 0; + } + return 1; +} + +static inline int +check_num_eq (const struct message *m, + const char *prop, + int expected, + int found) { + if (expected != found) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %d\n", expected); + printf(" found %d\n", found); + return 0; + } + return 1; +} + +#define MESSAGE_CHECK_STR_EQ(expected, found, prop) \ + if (!check_str_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_NUM_EQ(expected, found, prop) \ + if (!check_num_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_URL_EQ(u, expected, found, prop, fn) \ +do { \ + char ubuf[256]; \ + \ + if ((u)->field_set & (1 << (fn))) { \ + memcpy(ubuf, (found)->request_url + (u)->field_data[(fn)].off, \ + (u)->field_data[(fn)].len); \ + ubuf[(u)->field_data[(fn)].len] = '\0'; \ + } else { \ + ubuf[0] = '\0'; \ + } \ + \ + check_str_eq(expected, #prop, expected->prop, ubuf); \ +} while(0) + +int +message_eq (int index, const struct message *expected) +{ + int i; + struct message *m = &messages[index]; + + MESSAGE_CHECK_NUM_EQ(expected, m, http_major); + MESSAGE_CHECK_NUM_EQ(expected, m, http_minor); + + if (expected->type == HTTP_REQUEST) { + MESSAGE_CHECK_NUM_EQ(expected, m, method); + } else { + MESSAGE_CHECK_NUM_EQ(expected, m, status_code); + } + + MESSAGE_CHECK_NUM_EQ(expected, m, should_keep_alive); + MESSAGE_CHECK_NUM_EQ(expected, m, message_complete_on_eof); + + assert(m->message_begin_cb_called); + assert(m->headers_complete_cb_called); + assert(m->message_complete_cb_called); + + + MESSAGE_CHECK_STR_EQ(expected, m, request_url); + + /* Check URL components; we can't do this w/ CONNECT since it doesn't + * send us a well-formed URL. + */ + if (*m->request_url && m->method != HTTP_CONNECT) { + struct http_parser_url u; + + if (http_parser_parse_url(m->request_url, strlen(m->request_url), 0, &u)) { + fprintf(stderr, "\n\n*** failed to parse URL %s ***\n\n", + m->request_url); + abort(); + } + + if (expected->host) { + MESSAGE_CHECK_URL_EQ(&u, expected, m, host, UF_HOST); + } + + if (expected->userinfo) { + MESSAGE_CHECK_URL_EQ(&u, expected, m, userinfo, UF_USERINFO); + } + + m->port = (u.field_set & (1 << UF_PORT)) ? + u.port : 0; + + MESSAGE_CHECK_URL_EQ(&u, expected, m, query_string, UF_QUERY); + MESSAGE_CHECK_URL_EQ(&u, expected, m, fragment, UF_FRAGMENT); + MESSAGE_CHECK_URL_EQ(&u, expected, m, request_path, UF_PATH); + MESSAGE_CHECK_NUM_EQ(expected, m, port); + } + + if (expected->body_size) { + MESSAGE_CHECK_NUM_EQ(expected, m, body_size); + } else { + MESSAGE_CHECK_STR_EQ(expected, m, body); + } + + MESSAGE_CHECK_NUM_EQ(expected, m, num_headers); + + int r; + for (i = 0; i < m->num_headers; i++) { + r = check_str_eq(expected, "header field", expected->headers[i][0], m->headers[i][0]); + if (!r) return 0; + r = check_str_eq(expected, "header value", expected->headers[i][1], m->headers[i][1]); + if (!r) return 0; + } + + MESSAGE_CHECK_STR_EQ(expected, m, upgrade); + + return 1; +} + +/* Given a sequence of varargs messages, return the number of them that the + * parser should successfully parse, taking into account that upgraded + * messages prevent all subsequent messages from being parsed. + */ +size_t +count_parsed_messages(const size_t nmsgs, ...) { + size_t i; + va_list ap; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + if (m->upgrade) { + va_end(ap); + return i + 1; + } + } + + va_end(ap); + return nmsgs; +} + +/* Given a sequence of bytes and the number of these that we were able to + * parse, verify that upgrade bodies are correct. + */ +void +upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) { + va_list ap; + size_t i; + size_t off = 0; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + off += strlen(m->raw); + + if (m->upgrade) { + off -= strlen(m->upgrade); + + /* Check the portion of the response after its specified upgrade */ + if (!check_str_eq(m, "upgrade", body + off, body + nread)) { + abort(); + } + + /* Fix up the response so that message_eq() will verify the beginning + * of the upgrade */ + *(body + nread + strlen(m->upgrade)) = '\0'; + messages[num_messages -1 ].upgrade = body + nread; + + va_end(ap); + return; + } + } + + va_end(ap); + printf("\n\n*** Error: expected a message with upgrade ***\n"); + + abort(); +} + +static void +print_error (const char *raw, size_t error_location) +{ + fprintf(stderr, "\n*** %s ***\n\n", + http_errno_description(HTTP_PARSER_ERRNO(parser))); + + int this_line = 0, char_len = 0; + size_t i, j, len = strlen(raw), error_location_line = 0; + for (i = 0; i < len; i++) { + if (i == error_location) this_line = 1; + switch (raw[i]) { + case '\r': + char_len = 2; + fprintf(stderr, "\\r"); + break; + + case '\n': + char_len = 2; + fprintf(stderr, "\\n\n"); + + if (this_line) goto print; + + error_location_line = 0; + continue; + + default: + char_len = 1; + fputc(raw[i], stderr); + break; + } + if (!this_line) error_location_line += char_len; + } + + fprintf(stderr, "[eof]\n"); + + print: + for (j = 0; j < error_location_line; j++) { + fputc(' ', stderr); + } + fprintf(stderr, "^\n\nerror location: %u\n", (unsigned int)error_location); +} + +void +test_preserve_data (void) +{ + char my_data[] = "application-specific data"; + http_parser parser; + parser.data = my_data; + http_parser_init(&parser, HTTP_REQUEST); + if (parser.data != my_data) { + printf("\n*** parser.data not preserved accross http_parser_init ***\n\n"); + abort(); + } +} + +struct url_test { + const char *name; + const char *url; + int is_connect; + struct http_parser_url u; + int rv; +}; + +const struct url_test url_tests[] = +{ {.name="proxy request" + ,.url="http://hostname/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 15, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="proxy request with port" + ,.url="http://hostname:444/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) + ,.port=444 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 16, 3 } /* UF_PORT */ + ,{ 19, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request" + ,.url="hostname:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 8 } /* UF_HOST */ + ,{ 9, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request but not connect" + ,.url="hostname:443" + ,.is_connect=0 + ,.rv=1 + } + +, {.name="proxy ipv6 request" + ,.url="http://[1:2::3:4]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 17, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="proxy ipv6 request with port" + ,.url="http://[1:2::3:4]:67/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) + ,.port=67 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 18, 2 } /* UF_PORT */ + ,{ 20, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT ipv6 address" + ,.url="[1:2::3:4]:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 1, 8 } /* UF_HOST */ + ,{ 11, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="ipv4 in ipv6 address" + ,.url="http://[2001:0000:0000:0000:0000:0000:1.9.1.1]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 37 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 46, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="extra ? in query string" + ,.url="http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css," + "fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css," + "fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css" + ,.is_connect=0 + ,.u= + {.field_set=(1<<UF_SCHEMA) | (1<<UF_HOST) | (1<<UF_PATH) | (1<<UF_QUERY) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 10 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 17, 12 } /* UF_PATH */ + ,{ 30,187 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="space URL encoded" + ,.url="/toto.html?toto=a%20b" + ,.is_connect=0 + ,.u= + {.field_set= (1<<UF_PATH) | (1<<UF_QUERY) + ,.port=0 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 0 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 0, 10 } /* UF_PATH */ + ,{ 11, 10 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + + +, {.name="URL fragment" + ,.url="/toto.html#titi" + ,.is_connect=0 + ,.u= + {.field_set= (1<<UF_PATH) | (1<<UF_FRAGMENT) + ,.port=0 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 0 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 0, 10 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 11, 4 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="complex URL fragment" + ,.url="http://www.webmasterworld.com/r.cgi?f=21&d=8405&url=" + "http://www.example.com/index.html?foo=bar&hello=world#midpage" + ,.is_connect=0 + ,.u= + {.field_set= (1<<UF_SCHEMA) | (1<<UF_HOST) | (1<<UF_PATH) | (1<<UF_QUERY) |\ + (1<<UF_FRAGMENT) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 22 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 29, 6 } /* UF_PATH */ + ,{ 36, 69 } /* UF_QUERY */ + ,{106, 7 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="complex URL from node js url parser doc" + ,.url="http://host.com:8080/p/a/t/h?query=string#hash" + ,.is_connect=0 + ,.u= + {.field_set= (1<<UF_SCHEMA) | (1<<UF_HOST) | (1<<UF_PORT) | (1<<UF_PATH) |\ + (1<<UF_QUERY) | (1<<UF_FRAGMENT) + ,.port=8080 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 16, 4 } /* UF_PORT */ + ,{ 20, 8 } /* UF_PATH */ + ,{ 29, 12 } /* UF_QUERY */ + ,{ 42, 4 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="complex URL with basic auth from node js url parser doc" + ,.url="http://a:b@host.com:8080/p/a/t/h?query=string#hash" + ,.is_connect=0 + ,.u= + {.field_set= (1<<UF_SCHEMA) | (1<<UF_HOST) | (1<<UF_PORT) | (1<<UF_PATH) |\ + (1<<UF_QUERY) | (1<<UF_FRAGMENT) | (1<<UF_USERINFO) + ,.port=8080 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 11, 8 } /* UF_HOST */ + ,{ 20, 4 } /* UF_PORT */ + ,{ 24, 8 } /* UF_PATH */ + ,{ 33, 12 } /* UF_QUERY */ + ,{ 46, 4 } /* UF_FRAGMENT */ + ,{ 7, 3 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="double @" + ,.url="http://a:b@@hostname:443/" + ,.is_connect=0 + ,.rv=1 + } + +, {.name="proxy empty host" + ,.url="http://:443/" + ,.is_connect=0 + ,.rv=1 + } + +, {.name="proxy empty port" + ,.url="http://hostname:/" + ,.is_connect=0 + ,.rv=1 + } + +, {.name="CONNECT with basic auth" + ,.url="a:b@hostname:443" + ,.is_connect=1 + ,.rv=1 + } + +, {.name="CONNECT empty host" + ,.url=":443" + ,.is_connect=1 + ,.rv=1 + } + +, {.name="CONNECT empty port" + ,.url="hostname:" + ,.is_connect=1 + ,.rv=1 + } + +, {.name="CONNECT with extra bits" + ,.url="hostname:443/" + ,.is_connect=1 + ,.rv=1 + } + +, {.name="space in URL" + ,.url="/foo bar/" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy basic auth with space url encoded" + ,.url="http://a%20:b@host.com/" + ,.is_connect=0 + ,.u= + {.field_set= (1<<UF_SCHEMA) | (1<<UF_HOST) | (1<<UF_PATH) | (1<<UF_USERINFO) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 14, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 22, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 7, 6 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="carriage return in URL" + ,.url="/foo\rbar/" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy double : in URL" + ,.url="http://hostname::443/" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy basic auth with double :" + ,.url="http://a::b@host.com/" + ,.is_connect=0 + ,.u= + {.field_set= (1<<UF_SCHEMA) | (1<<UF_HOST) | (1<<UF_PATH) | (1<<UF_USERINFO) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 12, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 20, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 7, 4 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="line feed in URL" + ,.url="/foo\nbar/" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy empty basic auth" + ,.url="http://@hostname/fo" + ,.u= + {.field_set= (1<<UF_SCHEMA) | (1<<UF_HOST) | (1<<UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 16, 3 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } +, {.name="proxy line feed in hostname" + ,.url="http://host\name/fo" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy % in hostname" + ,.url="http://host%name/fo" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy ; in hostname" + ,.url="http://host;ame/fo" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy basic auth with unreservedchars" + ,.url="http://a!;-_!=+$@host.com/" + ,.is_connect=0 + ,.u= + {.field_set= (1<<UF_SCHEMA) | (1<<UF_HOST) | (1<<UF_PATH) | (1<<UF_USERINFO) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 17, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 25, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 7, 9 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="proxy only empty basic auth" + ,.url="http://@/fo" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy only basic auth" + ,.url="http://toto@/fo" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy emtpy hostname" + ,.url="http:///fo" + ,.rv=1 /* s_dead */ + } + +, {.name="proxy = in URL" + ,.url="http://host=ame/fo" + ,.rv=1 /* s_dead */ + } + +#if HTTP_PARSER_STRICT + +, {.name="tab in URL" + ,.url="/foo\tbar/" + ,.rv=1 /* s_dead */ + } + +, {.name="form feed in URL" + ,.url="/foo\fbar/" + ,.rv=1 /* s_dead */ + } + +#else /* !HTTP_PARSER_STRICT */ + +, {.name="tab in URL" + ,.url="/foo\tbar/" + ,.u= + {.field_set=(1 << UF_PATH) + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 0 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 0, 9 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="form feed in URL" + ,.url="/foo\fbar/" + ,.u= + {.field_set=(1 << UF_PATH) + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 0 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 0, 9 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } +#endif +}; + +void +dump_url (const char *url, const struct http_parser_url *u) +{ + unsigned int i; + + printf("\tfield_set: 0x%x, port: %u\n", u->field_set, u->port); + for (i = 0; i < UF_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + printf("\tfield_data[%u]: unset\n", i); + continue; + } + + printf("\tfield_data[%u]: off: %u len: %u part: \"%.*s\n\"", + i, + u->field_data[i].off, + u->field_data[i].len, + u->field_data[i].len, + url + u->field_data[i].off); + } +} + +void +test_parse_url (void) +{ + struct http_parser_url u; + const struct url_test *test; + unsigned int i; + int rv; + + for (i = 0; i < (sizeof(url_tests) / sizeof(url_tests[0])); i++) { + test = &url_tests[i]; + memset(&u, 0, sizeof(u)); + + rv = http_parser_parse_url(test->url, + strlen(test->url), + test->is_connect, + &u); + + if (test->rv == 0) { + if (rv != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + abort(); + } + + if (memcmp(&u, &test->u, sizeof(u)) != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" failed ***\n", + test->url, test->name); + + printf("target http_parser_url:\n"); + dump_url(test->url, &test->u); + printf("result http_parser_url:\n"); + dump_url(test->url, &u); + + abort(); + } + } else { + /* test->rv != 0 */ + if (rv == 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + abort(); + } + } + } +} + +void +test_method_str (void) +{ + assert(0 == strcmp("GET", http_method_str(HTTP_GET))); + assert(0 == strcmp("<unknown>", http_method_str(1337))); +} + +void +test_message (const struct message *message) +{ + size_t raw_len = strlen(message->raw); + size_t msg1len; + for (msg1len = 0; msg1len < raw_len; msg1len++) { + parser_init(message->type); + + size_t read; + const char *msg1 = message->raw; + const char *msg2 = msg1 + msg1len; + size_t msg2len = raw_len - msg1len; + + if (msg1len) { + read = parse(msg1, msg1len); + + if (message->upgrade && parser->upgrade) { + messages[num_messages - 1].upgrade = msg1 + read; + goto test; + } + + if (read != msg1len) { + print_error(msg1, read); + abort(); + } + } + + + read = parse(msg2, msg2len); + + if (message->upgrade && parser->upgrade) { + messages[num_messages - 1].upgrade = msg2 + read; + goto test; + } + + if (read != msg2len) { + print_error(msg2, read); + abort(); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(message->raw, read); + abort(); + } + + test: + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + abort(); + } + + if(!message_eq(0, message)) abort(); + + parser_free(); + } +} + +void +test_message_count_body (const struct message *message) +{ + parser_init(message->type); + + size_t read; + size_t l = strlen(message->raw); + size_t i, toread; + size_t chunk = 4024; + + for (i = 0; i < l; i+= chunk) { + toread = MIN(l-i, chunk); + read = parse_count_body(message->raw + i, toread); + if (read != toread) { + print_error(message->raw, read); + abort(); + } + } + + + read = parse_count_body(NULL, 0); + if (read != 0) { + print_error(message->raw, read); + abort(); + } + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + abort(); + } + + if(!message_eq(0, message)) abort(); + + parser_free(); +} + +void +test_simple (const char *buf, enum http_errno err_expected) +{ + parser_init(HTTP_REQUEST); + + size_t parsed; + int pass; + enum http_errno err; + + parsed = parse(buf, strlen(buf)); + pass = (parsed == strlen(buf)); + err = HTTP_PARSER_ERRNO(parser); + parsed = parse(NULL, 0); + pass &= (parsed == 0); + + parser_free(); + + /* In strict mode, allow us to pass with an unexpected HPE_STRICT as + * long as the caller isn't expecting success. + */ +#if HTTP_PARSER_STRICT + if (err_expected != err && err_expected != HPE_OK && err != HPE_STRICT) { +#else + if (err_expected != err) { +#endif + fprintf(stderr, "\n*** test_simple expected %s, but saw %s ***\n\n%s\n", + http_errno_name(err_expected), http_errno_name(err), buf); + abort(); + } +} + +void +test_header_overflow_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? "GET / HTTP/1.1\r\n" : "HTTP/1.0 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "header-key: header-value\r\n"; + size_t buflen = strlen(buf); + + int i; + for (i = 0; i < 10000; i++) { + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + //fprintf(stderr, "error found on iter %d\n", i); + assert(HTTP_PARSER_ERRNO(&parser) == HPE_HEADER_OVERFLOW); + return; + } + } + + fprintf(stderr, "\n*** Error expected but none in header overflow test ***\n"); + abort(); +} + +static void +test_content_length_overflow (const char *buf, size_t buflen, int expect_ok) +{ + http_parser parser; + http_parser_init(&parser, HTTP_RESPONSE); + http_parser_execute(&parser, &settings_null, buf, buflen); + + if (expect_ok) + assert(HTTP_PARSER_ERRNO(&parser) == HPE_OK); + else + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_CONTENT_LENGTH); +} + +void +test_header_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Content-Length: " #size "\r\n" \ + "\r\n" + const char a[] = X(18446744073709551614); /* 2^64-2 */ + const char b[] = X(18446744073709551615); /* 2^64-1 */ + const char c[] = X(18446744073709551616); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_chunk_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Transfer-Encoding: chunked\r\n" \ + "\r\n" \ + #size "\r\n" \ + "..." + const char a[] = X(FFFFFFFFFFFFFFFE); /* 2^64-2 */ + const char b[] = X(FFFFFFFFFFFFFFFF); /* 2^64-1 */ + const char c[] = X(10000000000000000); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_no_overflow_long_body (int req, size_t length) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + size_t i; + char buf1[3000]; + size_t buf1len = sprintf(buf1, "%s\r\nConnection: Keep-Alive\r\nContent-Length: %lu\r\n\r\n", + req ? "POST / HTTP/1.0" : "HTTP/1.0 200 OK", (unsigned long)length); + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) + goto err; + + for (i = 0; i < length; i++) { + char foo = 'a'; + parsed = http_parser_execute(&parser, &settings_null, &foo, 1); + if (parsed != 1) + goto err; + } + + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) goto err; + return; + + err: + fprintf(stderr, + "\n*** error in test_no_overflow_long_body %s of length %lu ***\n", + req ? "REQUEST" : "RESPONSE", + (unsigned long)length); + abort(); +} + +void +test_multiple3 (const struct message *r1, const struct message *r2, const struct message *r3) +{ + int message_count = count_parsed_messages(3, r1, r2, r3); + + char total[ strlen(r1->raw) + + strlen(r2->raw) + + strlen(r3->raw) + + 1 + ]; + total[0] = '\0'; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + parser_init(r1->type); + + size_t read; + + read = parse(total, strlen(total)); + + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + goto test; + } + + if (read != strlen(total)) { + print_error(total, read); + abort(); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(total, read); + abort(); + } + +test: + + if (message_count != num_messages) { + fprintf(stderr, "\n\n*** Parser didn't see 3 messages only %d *** \n", num_messages); + abort(); + } + + if (!message_eq(0, r1)) abort(); + if (message_count > 1 && !message_eq(1, r2)) abort(); + if (message_count > 2 && !message_eq(2, r3)) abort(); + + parser_free(); +} + +/* SCAN through every possible breaking to make sure the + * parser can handle getting the content in any chunks that + * might come from the socket + */ +void +test_scan (const struct message *r1, const struct message *r2, const struct message *r3) +{ + char total[80*1024] = "\0"; + char buf1[80*1024] = "\0"; + char buf2[80*1024] = "\0"; + char buf3[80*1024] = "\0"; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + size_t read; + + int total_len = strlen(total); + + int total_ops = 2 * (total_len - 1) * (total_len - 2) / 2; + int ops = 0 ; + + size_t buf1_len, buf2_len, buf3_len; + int message_count = count_parsed_messages(3, r1, r2, r3); + + int i,j,type_both; + for (type_both = 0; type_both < 2; type_both ++ ) { + for (j = 2; j < total_len; j ++ ) { + for (i = 1; i < j; i ++ ) { + + if (ops % 1000 == 0) { + printf("\b\b\b\b%3.0f%%", 100 * (float)ops /(float)total_ops); + fflush(stdout); + } + ops += 1; + + parser_init(type_both ? HTTP_BOTH : r1->type); + + buf1_len = i; + strlncpy(buf1, sizeof(buf1), total, buf1_len); + buf1[buf1_len] = 0; + + buf2_len = j - i; + strlncpy(buf2, sizeof(buf1), total+i, buf2_len); + buf2[buf2_len] = 0; + + buf3_len = total_len - j; + strlncpy(buf3, sizeof(buf1), total+j, buf3_len); + buf3[buf3_len] = 0; + + read = parse(buf1, buf1_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len) { + print_error(buf1, read); + goto error; + } + + read += parse(buf2, buf2_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len) { + print_error(buf2, read); + goto error; + } + + read += parse(buf3, buf3_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len + buf3_len) { + print_error(buf3, read); + goto error; + } + + parse(NULL, 0); + +test: + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + } + + if (message_count != num_messages) { + fprintf(stderr, "\n\nParser didn't see %d messages only %d\n", + message_count, num_messages); + goto error; + } + + if (!message_eq(0, r1)) { + fprintf(stderr, "\n\nError matching messages[0] in test_scan.\n"); + goto error; + } + + if (message_count > 1 && !message_eq(1, r2)) { + fprintf(stderr, "\n\nError matching messages[1] in test_scan.\n"); + goto error; + } + + if (message_count > 2 && !message_eq(2, r3)) { + fprintf(stderr, "\n\nError matching messages[2] in test_scan.\n"); + goto error; + } + + parser_free(); + } + } + } + puts("\b\b\b\b100%"); + return; + + error: + fprintf(stderr, "i=%d j=%d\n", i, j); + fprintf(stderr, "buf1 (%u) %s\n\n", (unsigned int)buf1_len, buf1); + fprintf(stderr, "buf2 (%u) %s\n\n", (unsigned int)buf2_len , buf2); + fprintf(stderr, "buf3 (%u) %s\n", (unsigned int)buf3_len, buf3); + abort(); +} + +// user required to free the result +// string terminated by \0 +char * +create_large_chunked_message (int body_size_in_kb, const char* headers) +{ + int i; + size_t wrote = 0; + size_t headers_len = strlen(headers); + size_t bufsize = headers_len + (5+1024+2)*body_size_in_kb + 6; + char * buf = malloc(bufsize); + + memcpy(buf, headers, headers_len); + wrote += headers_len; + + for (i = 0; i < body_size_in_kb; i++) { + // write 1kb chunk into the body. + memcpy(buf + wrote, "400\r\n", 5); + wrote += 5; + memset(buf + wrote, 'C', 1024); + wrote += 1024; + strcpy(buf + wrote, "\r\n"); + wrote += 2; + } + + memcpy(buf + wrote, "0\r\n\r\n", 6); + wrote += 6; + assert(wrote == bufsize); + + return buf; +} + +void +test_status_complete (void) +{ + parser_init(HTTP_RESPONSE); + parser->data = 0; + http_parser_settings settings = settings_null; + settings.on_status_complete = status_complete_cb; + + char *response = "don't mind me, just a simple response"; + http_parser_execute(parser, &settings, response, strlen(response)); + assert(parser->data == (void*)0); // the status_complete callback was never called + assert(parser->http_errno == HPE_INVALID_CONSTANT); // the errno for an invalid status line +} + +/* Verify that we can pause parsing at any of the bytes in the + * message and still get the result that we're expecting. */ +void +test_message_pause (const struct message *msg) +{ + char *buf = (char*) msg->raw; + size_t buflen = strlen(msg->raw); + size_t nread; + + parser_init(msg->type); + + do { + nread = parse_pause(buf, buflen); + + // We can only set the upgrade buffer once we've gotten our message + // completion callback. + if (messages[0].message_complete_cb_called && + msg->upgrade && + parser->upgrade) { + messages[0].upgrade = buf + nread; + goto test; + } + + if (nread < buflen) { + + // Not much do to if we failed a strict-mode check + if (HTTP_PARSER_ERRNO(parser) == HPE_STRICT) { + parser_free(); + return; + } + + assert (HTTP_PARSER_ERRNO(parser) == HPE_PAUSED); + } + + buf += nread; + buflen -= nread; + http_parser_pause(parser, 0); + } while (buflen > 0); + + nread = parse_pause(NULL, 0); + assert (nread == 0); + +test: + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); + abort(); + } + + if(!message_eq(0, msg)) abort(); + + parser_free(); +} + +int +main (void) +{ + parser = NULL; + int i, j, k; + int request_count; + int response_count; + + printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser)); + + for (request_count = 0; requests[request_count].name; request_count++); + for (response_count = 0; responses[response_count].name; response_count++); + + //// API + test_preserve_data(); + test_parse_url(); + test_method_str(); + + //// OVERFLOW CONDITIONS + + test_header_overflow_error(HTTP_REQUEST); + test_no_overflow_long_body(HTTP_REQUEST, 1000); + test_no_overflow_long_body(HTTP_REQUEST, 100000); + + test_header_overflow_error(HTTP_RESPONSE); + test_no_overflow_long_body(HTTP_RESPONSE, 1000); + test_no_overflow_long_body(HTTP_RESPONSE, 100000); + + test_header_content_length_overflow_error(); + test_chunk_content_length_overflow_error(); + + //// RESPONSES + + for (i = 0; i < response_count; i++) { + test_message(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + test_message_pause(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + if (!responses[i].should_keep_alive) continue; + for (j = 0; j < response_count; j++) { + if (!responses[j].should_keep_alive) continue; + for (k = 0; k < response_count; k++) { + test_multiple3(&responses[i], &responses[j], &responses[k]); + } + } + } + + test_message_count_body(&responses[NO_HEADERS_NO_BODY_404]); + test_message_count_body(&responses[TRAILING_SPACE_ON_CHUNKED_BODY]); + + // test very large chunked response + { + char * msg = create_large_chunked_message(31337, + "HTTP/1.0 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/plain\r\n" + "\r\n"); + struct message large_chunked = + {.name= "large chunked" + ,.type= HTTP_RESPONSE + ,.raw= msg + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/plain" } + } + ,.body_size= 31337*1024 + }; + test_message_count_body(&large_chunked); + free(msg); + } + + + + printf("response scan 1/2 "); + test_scan( &responses[TRAILING_SPACE_ON_CHUNKED_BODY] + , &responses[NO_BODY_HTTP10_KA_204] + , &responses[NO_REASON_PHRASE] + ); + + printf("response scan 2/2 "); + test_scan( &responses[BONJOUR_MADAME_FR] + , &responses[UNDERSTORE_HEADER_KEY] + , &responses[NO_CARRIAGE_RET] + ); + + puts("responses okay"); + + + /// REQUESTS + + test_simple("hello world", HPE_INVALID_METHOD); + test_simple("GET / HTP/1.1\r\n\r\n", HPE_INVALID_VERSION); + + + test_simple("ASDF / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("PROPPATCHA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("GETA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + + // Well-formed but incomplete + test_simple("GET / HTTP/1.1\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 6\r\n" + "\r\n" + "fooba", + HPE_OK); + + static const char *all_methods[] = { + "DELETE", + "GET", + "HEAD", + "POST", + "PUT", + //"CONNECT", //CONNECT can't be tested like other methods, it's a tunnel + "OPTIONS", + "TRACE", + "COPY", + "LOCK", + "MKCOL", + "MOVE", + "PROPFIND", + "PROPPATCH", + "UNLOCK", + "REPORT", + "MKACTIVITY", + "CHECKOUT", + "MERGE", + "M-SEARCH", + "NOTIFY", + "SUBSCRIBE", + "UNSUBSCRIBE", + "PATCH", + 0 }; + const char **this_method; + for (this_method = all_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_OK); + } + + static const char *bad_methods[] = { + "C******", + "M****", + 0 }; + for (this_method = bad_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_UNKNOWN); + } + + const char *dumbfuck2 = + "GET / HTTP/1.1\r\n" + "X-SSL-Bullshit: -----BEGIN CERTIFICATE-----\r\n" + "\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx\r\n" + "\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT\r\n" + "\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu\r\n" + "\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV\r\n" + "\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV\r\n" + "\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB\r\n" + "\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF\r\n" + "\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR\r\n" + "\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL\r\n" + "\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP\r\n" + "\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR\r\n" + "\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG\r\n" + "\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs\r\n" + "\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD\r\n" + "\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj\r\n" + "\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj\r\n" + "\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG\r\n" + "\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE\r\n" + "\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO\r\n" + "\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1\r\n" + "\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0\r\n" + "\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD\r\n" + "\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv\r\n" + "\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3\r\n" + "\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8\r\n" + "\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk\r\n" + "\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK\r\n" + "\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu\r\n" + "\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3\r\n" + "\tRA==\r\n" + "\t-----END CERTIFICATE-----\r\n" + "\r\n"; + test_simple(dumbfuck2, HPE_OK); + +#if 0 + // NOTE(Wed Nov 18 11:57:27 CET 2009) this seems okay. we just read body + // until EOF. + // + // no content-length + // error if there is a body without content length + const char *bad_get_no_headers_no_body = "GET /bad_get_no_headers_no_body/world HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + "HELLO"; + test_simple(bad_get_no_headers_no_body, 0); +#endif + /* TODO sending junk and large headers gets rejected */ + + + /* check to make sure our predefined requests are okay */ + for (i = 0; requests[i].name; i++) { + test_message(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + test_message_pause(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + if (!requests[i].should_keep_alive) continue; + for (j = 0; j < request_count; j++) { + if (!requests[j].should_keep_alive) continue; + for (k = 0; k < request_count; k++) { + test_multiple3(&requests[i], &requests[j], &requests[k]); + } + } + } + + printf("request scan 1/4 "); + test_scan( &requests[GET_NO_HEADERS_NO_BODY] + , &requests[GET_ONE_HEADER_NO_BODY] + , &requests[GET_NO_HEADERS_NO_BODY] + ); + + printf("request scan 2/4 "); + test_scan( &requests[POST_CHUNKED_ALL_YOUR_BASE] + , &requests[POST_IDENTITY_BODY_WORLD] + , &requests[GET_FUNKY_CONTENT_LENGTH] + ); + + printf("request scan 3/4 "); + test_scan( &requests[TWO_CHUNKS_MULT_ZERO_END] + , &requests[CHUNKED_W_TRAILING_HEADERS] + , &requests[CHUNKED_W_BULLSHIT_AFTER_LENGTH] + ); + + printf("request scan 4/4 "); + test_scan( &requests[QUERY_URL_WITH_QUESTION_MARK_GET] + , &requests[PREFIX_NEWLINE_GET ] + , &requests[CONNECT_REQUEST] + ); + + test_status_complete(); + + puts("requests okay"); + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped new file mode 100644 index 000000000000..038bb525d484 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.dumped @@ -0,0 +1,845 @@ +name :curl get +raw :"GET /test HTTP/1.1\r\nUser-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\nHost: 0.0.0.0=5000\r\nAccept: */*\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/test +request_url :/test +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "User-Agent": "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1"} +header_1 :{ "Host": "0.0.0.0=5000"} +header_2 :{ "Accept": "*/*"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :firefox get +raw :"GET /favicon.ico HTTP/1.1\r\nHost: 0.0.0.0=5000\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/favicon.ico +request_url :/favicon.ico +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Host": "0.0.0.0=5000"} +header_1 :{ "User-Agent": "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0"} +header_2 :{ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"} +header_3 :{ "Accept-Language": "en-us,en;q=0.5"} +header_4 :{ "Accept-Encoding": "gzip,deflate"} +header_5 :{ "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7"} +header_6 :{ "Keep-Alive": "300"} +header_7 :{ "Connection": "keep-alive"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :dumbfuck +raw :"GET /dumbfuck HTTP/1.1\r\naaaaaaaaaaaaa:++++++++++\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/dumbfuck +request_url :/dumbfuck +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "aaaaaaaaaaaaa": "++++++++++"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :fragment in url +raw :"GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/forums/1/topics/2375 +request_url :/forums/1/topics/2375?page=1#posts-17408 +fragment :posts-17408 +query_string:page=1 +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :get no headers no body +raw :"GET /get_no_headers_no_body/world HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/get_no_headers_no_body/world +request_url :/get_no_headers_no_body/world +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :get one header no body +raw :"GET /get_one_header_no_body HTTP/1.1\r\nAccept: */*\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/get_one_header_no_body +request_url :/get_one_header_no_body +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Accept": "*/*"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :get funky content length body hello +raw :"GET /get_funky_content_length_body_hello HTTP/1.0\r\nconTENT-Length: 5\r\n\r\nHELLO" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/get_funky_content_length_body_hello +request_url :/get_funky_content_length_body_hello +fragment : +query_string: +body :"HELLO" +body_size :0 +header_0 :{ "conTENT-Length": "5"} +should_keep_alive :0 +http_major :1 +http_minor :0 + +name :post identity body world +raw :"POST /post_identity_body_world?q=search#hey HTTP/1.1\r\nAccept: */*\r\nTransfer-Encoding: identity\r\nContent-Length: 5\r\n\r\nWorld" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/post_identity_body_world +request_url :/post_identity_body_world?q=search#hey +fragment :hey +query_string:q=search +body :"World" +body_size :0 +header_0 :{ "Accept": "*/*"} +header_1 :{ "Transfer-Encoding": "identity"} +header_2 :{ "Content-Length": "5"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :post - chunked body: all your base are belong to us +raw :"POST /post_chunked_all_your_base HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1e\r\nall your base are belong to us\r\n0\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/post_chunked_all_your_base +request_url :/post_chunked_all_your_base +fragment : +query_string: +body :"all your base are belong to us" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :two chunks ; triple zero ending +raw :"POST /two_chunks_mult_zero_end HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n6\r\n world\r\n000\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/two_chunks_mult_zero_end +request_url :/two_chunks_mult_zero_end +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :chunked with trailing headers. blech. +raw :"POST /chunked_w_trailing_headers HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n6\r\n world\r\n0\r\nVary: *\r\nContent-Type: text/plain\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/chunked_w_trailing_headers +request_url :/chunked_w_trailing_headers +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +header_1 :{ "Vary": "*"} +header_2 :{ "Content-Type": "text/plain"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :with bullshit after the length +raw :"POST /chunked_w_bullshit_after_length HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n6; blahblah; blah\r\n world\r\n0\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/chunked_w_bullshit_after_length +request_url :/chunked_w_bullshit_after_length +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :with quotes +raw :"GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/with_"stupid"_quotes +request_url :/with_"stupid"_quotes?foo="bar" +fragment : +query_string:foo="bar" +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :apachebench get +raw :"GET /test HTTP/1.0\r\nHost: 0.0.0.0:5000\r\nUser-Agent: ApacheBench/2.3\r\nAccept: */*\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/test +request_url :/test +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Host": "0.0.0.0:5000"} +header_1 :{ "User-Agent": "ApacheBench/2.3"} +header_2 :{ "Accept": "*/*"} +should_keep_alive :0 +http_major :1 +http_minor :0 + +name :query url with question mark +raw :"GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/test.cgi +request_url :/test.cgi?foo=bar?baz +fragment : +query_string:foo=bar?baz +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :newline prefix get +raw :"\r\nGET /test HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/test +request_url :/test +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :upgrade request +raw :"GET /demo HTTP/1.1\r\nHost: example.com\r\nConnection: Upgrade\r\nSec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\nSec-WebSocket-Protocol: sample\r\nUpgrade: WebSocket\r\nSec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\nOrigin: http://example.com\r\n\r\nHot diggity dogg" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/demo +request_url :/demo +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Host": "example.com"} +header_1 :{ "Connection": "Upgrade"} +header_2 :{ "Sec-WebSocket-Key2": "12998 5 Y3 1 .P00"} +header_3 :{ "Sec-WebSocket-Protocol": "sample"} +header_4 :{ "Upgrade": "WebSocket"} +header_5 :{ "Sec-WebSocket-Key1": "4 @1 46546xW%0l 1 5"} +header_6 :{ "Origin": "http://example.com"} +should_keep_alive :1 +upgrade :"Hot diggity dogg" +http_major :1 +http_minor :1 + +name :connect request +raw :"CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\nsome data\r\nand yet even more data" +type :HTTP_REQUEST +method: HTTP_CONNECT +status_code :0 +request_path: +request_url :0-home0.netscape.com:443 +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "User-agent": "Mozilla/1.1N"} +header_1 :{ "Proxy-authorization": "basic aGVsbG86d29ybGQ="} +should_keep_alive :0 +upgrade :"some data\r\nand yet even more data" +http_major :1 +http_minor :0 + +name :report request +raw :"REPORT /test HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_REPORT +status_code :0 +request_path:/test +request_url :/test +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :request with no http version +raw :"GET /\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/ +request_url :/ +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :0 +http_minor :9 + +name :m-search request +raw :"M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nST: \"ssdp:all\"\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_MSEARCH +status_code :0 +request_path:* +request_url :* +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "HOST": "239.255.255.250:1900"} +header_1 :{ "MAN": ""ssdp:discover""} +header_2 :{ "ST": ""ssdp:all""} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :line folding in header value +raw :"GET / HTTP/1.1\r\nLine1: abc\r\n def\r\n ghi\r\n jkl\r\n mno \r\n qrs\r\nLine2: line2 \r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/ +request_url :/ +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Line1": "abcdefghijklmno qrs"} +header_1 :{ "Line2": "line2 "} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :host terminated by a query string +raw :"GET http://hypnotoad.org?hail=all HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path: +request_url :http://hypnotoad.org?hail=all +fragment : +query_string:hail=all +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :host:port terminated by a query string +raw :"GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path: +request_url :http://hypnotoad.org:1234?hail=all +fragment : +query_string:hail=all +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :host:port terminated by a space +raw :"GET http://hypnotoad.org:1234 HTTP/1.1\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path: +request_url :http://hypnotoad.org:1234 +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :PATCH request +raw :"PATCH /file.txt HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/example\r\nIf-Match: \"e0023aa4e\"\r\nContent-Length: 10\r\n\r\ncccccccccc" +type :HTTP_REQUEST +method: UNKNOWN +status_code :0 +request_path:/file.txt +request_url :/file.txt +fragment : +query_string: +body :"cccccccccc" +body_size :0 +header_0 :{ "Host": "www.example.com"} +header_1 :{ "Content-Type": "application/example"} +header_2 :{ "If-Match": ""e0023aa4e""} +header_3 :{ "Content-Length": "10"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :connect caps request +raw :"CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_CONNECT +status_code :0 +request_path: +request_url :HOME0.NETSCAPE.COM:443 +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "User-agent": "Mozilla/1.1N"} +header_1 :{ "Proxy-authorization": "basic aGVsbG86d29ybGQ="} +should_keep_alive :0 +upgrade :"" +http_major :1 +http_minor :0 + +name :eat CRLF between requests, no "Connection: close" header +raw :"POST / HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\n\r\nq=42\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/ +request_url :/ +fragment : +query_string: +body :"q=42" +body_size :0 +header_0 :{ "Host": "www.example.com"} +header_1 :{ "Content-Type": "application/x-www-form-urlencoded"} +header_2 :{ "Content-Length": "4"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :eat CRLF between requests even if "Connection: close" is set +raw :"POST / HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\nConnection: close\r\n\r\nq=42\r\n" +type :HTTP_REQUEST +method: HTTP_POST +status_code :0 +request_path:/ +request_url :/ +fragment : +query_string: +body :"q=42" +body_size :0 +header_0 :{ "Host": "www.example.com"} +header_1 :{ "Content-Type": "application/x-www-form-urlencoded"} +header_2 :{ "Content-Length": "4"} +header_3 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :PURGE request +raw :"PURGE /file.txt HTTP/1.1\r\nHost: www.example.com\r\n\r\n" +type :HTTP_REQUEST +method: UNKNOWN +status_code :0 +request_path:/file.txt +request_url :/file.txt +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Host": "www.example.com"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :google 301 +raw :"HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.google.com/\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Sun, 26 Apr 2009 11:11:49 GMT\r\nExpires: Tue, 26 May 2009 11:11:49 GMT\r\nX-$PrototypeBI-Version: 1.6.0.3\r\nCache-Control: public, max-age=2592000\r\nServer: gws\r\nContent-Length: 219 \r\n\r\n<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.com/\">here</A>.\r\n</BODY></HTML>\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :301 +request_path: +request_url : +fragment : +query_string: +body :"<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.com/\">here</A>.\r\n</BODY></HTML>\r\n" +body_size :0 +header_0 :{ "Location": "http://www.google.com/"} +header_1 :{ "Content-Type": "text/html; charset=UTF-8"} +header_2 :{ "Date": "Sun, 26 Apr 2009 11:11:49 GMT"} +header_3 :{ "Expires": "Tue, 26 May 2009 11:11:49 GMT"} +header_4 :{ "X-$PrototypeBI-Version": "1.6.0.3"} +header_5 :{ "Cache-Control": "public, max-age=2592000"} +header_6 :{ "Server": "gws"} +header_7 :{ "Content-Length": "219 "} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :no content-length response +raw :"HTTP/1.1 200 OK\r\nDate: Tue, 04 Aug 2009 07:59:32 GMT\r\nServer: Apache\r\nX-Powered-By: Servlet/2.5 JSP/2.1\r\nContent-Type: text/xml; charset=utf-8\r\nConnection: close\r\n\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <SOAP-ENV:Body>\n <SOAP-ENV:Fault>\n <faultcode>SOAP-ENV:Client</faultcode>\n <faultstring>Client Error</faultstring>\n </SOAP-ENV:Fault>\n </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <SOAP-ENV:Body>\n <SOAP-ENV:Fault>\n <faultcode>SOAP-ENV:Client</faultcode>\n <faultstring>Client Error</faultstring>\n </SOAP-ENV:Fault>\n </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>" +body_size :0 +header_0 :{ "Date": "Tue, 04 Aug 2009 07:59:32 GMT"} +header_1 :{ "Server": "Apache"} +header_2 :{ "X-Powered-By": "Servlet/2.5 JSP/2.1"} +header_3 :{ "Content-Type": "text/xml; charset=utf-8"} +header_4 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :404 no headers no body +raw :"HTTP/1.1 404 Not Found\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :404 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :301 no response phrase +raw :"HTTP/1.1 301\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :301 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :200 trailing space on chunked body +raw :"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"This is the data in the first chunk\r\nand this is the second one\r\n" +body_size :65 +header_0 :{ "Content-Type": "text/plain"} +header_1 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :no carriage ret +raw :"HTTP/1.1 200 OK\nContent-Type: text/html; charset=utf-8\nConnection: close\n\nthese headers are from http://news.ycombinator.com/" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"these headers are from http://news.ycombinator.com/" +body_size :0 +header_0 :{ "Content-Type": "text/html; charset=utf-8"} +header_1 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :proxy connection +raw :"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Length: 11\r\nProxy-Connection: close\r\nDate: Thu, 31 Dec 2009 20:55:48 +0000\r\n\r\nhello world" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Content-Type": "text/html; charset=UTF-8"} +header_1 :{ "Content-Length": "11"} +header_2 :{ "Proxy-Connection": "close"} +header_3 :{ "Date": "Thu, 31 Dec 2009 20:55:48 +0000"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :underscore header key +raw :"HTTP/1.1 200 OK\r\nServer: DCLK-AdSvr\r\nContent-Type: text/xml\r\nContent-Length: 0\r\nDCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Server": "DCLK-AdSvr"} +header_1 :{ "Content-Type": "text/xml"} +header_2 :{ "Content-Length": "0"} +header_3 :{ "DCLK_imp": "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o"} +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :bonjourmadame.fr +raw :"HTTP/1.0 301 Moved Permanently\r\nDate: Thu, 03 Jun 2010 09:56:32 GMT\r\nServer: Apache/2.2.3 (Red Hat)\r\nCache-Control: public\r\nPragma: \r\nLocation: http://www.bonjourmadame.fr/\r\nVary: Accept-Encoding\r\nContent-Length: 0\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: keep-alive\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :301 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Date": "Thu, 03 Jun 2010 09:56:32 GMT"} +header_1 :{ "Server": "Apache/2.2.3 (Red Hat)"} +header_2 :{ "Cache-Control": "public"} +header_3 :{ "Pragma": ""} +header_4 :{ "Location": "http://www.bonjourmadame.fr/"} +header_5 :{ "Vary": "Accept-Encoding"} +header_6 :{ "Content-Length": "0"} +header_7 :{ "Content-Type": "text/html; charset=UTF-8"} +header_8 :{ "Connection": "keep-alive"} +should_keep_alive :1 +http_major :1 +http_minor :0 + +name :field underscore +raw :"HTTP/1.1 200 OK\r\nDate: Tue, 28 Sep 2010 01:14:13 GMT\r\nServer: Apache\r\nCache-Control: no-cache, must-revalidate\r\nExpires: Mon, 26 Jul 1997 05:00:00 GMT\r\n.et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\nVary: Accept-Encoding\r\n_eep-Alive: timeout=45\r\n_onnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n0\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Date": "Tue, 28 Sep 2010 01:14:13 GMT"} +header_1 :{ "Server": "Apache"} +header_2 :{ "Cache-Control": "no-cache, must-revalidate"} +header_3 :{ "Expires": "Mon, 26 Jul 1997 05:00:00 GMT"} +header_4 :{ ".et-Cookie": "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com"} +header_5 :{ "Vary": "Accept-Encoding"} +header_6 :{ "_eep-Alive": "timeout=45"} +header_7 :{ "_onnection": "Keep-Alive"} +header_8 :{ "Transfer-Encoding": "chunked"} +header_9 :{ "Content-Type": "text/html"} +header_10 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :non-ASCII in status line +raw :"HTTP/1.1 500 Oriëntatieprobleem\r\nDate: Fri, 5 Nov 2010 23:07:12 GMT+2\r\nContent-Length: 0\r\nConnection: close\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :500 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Date": "Fri, 5 Nov 2010 23:07:12 GMT+2"} +header_1 :{ "Content-Length": "0"} +header_2 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :http version 0.9 +raw :"HTTP/0.9 200 OK\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :0 +http_minor :9 + +name :neither content-length nor transfer-encoding response +raw :"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello world" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"hello world" +body_size :0 +header_0 :{ "Content-Type": "text/plain"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :HTTP/1.0 with keep-alive and EOF-terminated 200 status +raw :"HTTP/1.0 200 OK\r\nConnection: keep-alive\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Connection": "keep-alive"} +should_keep_alive :0 +http_major :1 +http_minor :0 + +name :HTTP/1.0 with keep-alive and a 204 status +raw :"HTTP/1.0 204 No content\r\nConnection: keep-alive\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :204 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Connection": "keep-alive"} +should_keep_alive :1 +http_major :1 +http_minor :0 + +name :HTTP/1.1 with an EOF-terminated 200 status +raw :"HTTP/1.1 200 OK\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :HTTP/1.1 with a 204 status +raw :"HTTP/1.1 204 No content\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :204 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +should_keep_alive :1 +http_major :1 +http_minor :1 + +name :HTTP/1.1 with a 204 status and keep-alive disabled +raw :"HTTP/1.1 204 No content\r\nConnection: close\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :204 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Connection": "close"} +should_keep_alive :0 +http_major :1 +http_minor :1 + +name :HTTP/1.1 with chunked endocing and a 200 response +raw :"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n" +type :HTTP_RESPONSE +method: HTTP_DELETE +status_code :200 +request_path: +request_url : +fragment : +query_string: +body :"" +body_size :0 +header_0 :{ "Transfer-Encoding": "chunked"} +should_keep_alive :1 +http_major :1 +http_minor :1 + diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.utf8 b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.utf8 new file mode 100644 index 000000000000..5266159241ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tests.utf8 @@ -0,0 +1,17 @@ +name :utf-8 path request +raw :"GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\nHost: github.com\r\n\r\n" +type :HTTP_REQUEST +method: HTTP_GET +status_code :0 +request_path:/δ¶/δt/pope +request_url :/δ¶/δt/pope?q=1#narf +fragment :narf +query_string:q=1 +body :"" +body_size :0 +header_0 :{ "Host": "github.com"} +should_keep_alive :1 +upgrade :0 +http_major :1 +http_minor :1 + diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/byte_constants.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/byte_constants.rb new file mode 100644 index 000000000000..16048905d6f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/byte_constants.rb @@ -0,0 +1,6 @@ + +"A".upto("Z") {|c| + puts "public static final byte #{c} = 0x#{c[0].to_s(16)};" +} + + diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/const_char.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/const_char.rb new file mode 100644 index 000000000000..84f9699f3e22 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/const_char.rb @@ -0,0 +1,13 @@ + + +def printbytes str +str.each_byte { |b| + print "0x#{b.to_s(16)}, " +} +end + +if $0 == __FILE__ + printf "static final byte [] #{ARGV[0]} = {\n" + printbytes ARGV[0] + printf "\n};\n" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/lowcase.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/lowcase.rb new file mode 100644 index 000000000000..13960cbd0946 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/lowcase.rb @@ -0,0 +1,15 @@ + + +0.upto(255) { |i| + printf "\n" if i%16 == 0 + printf " " if i%8 == 0 + s = ("" << i) + if s =~ /[A-Z0-9\-_\/ ]/ + print "0x#{i.to_s(16)}," + elsif s =~ /[a-z]/ + print "0x#{s.upcase[0].to_s(16)}," + else + print "0x00," + end + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/parse_tests.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/parse_tests.rb new file mode 100644 index 000000000000..683adb9d57f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser-java/tools/parse_tests.rb @@ -0,0 +1,33 @@ + + + + +# name : 200 trailing space on chunked body +# raw : "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n" +# type : HTTP_RESPONSE +# method: HTTP_DELETE +# status code :200 +# request_path: +# request_url : +# fragment : +# query_string: +# body :"This is the data in the first chunk\r\nand this is the second one\r\n" +# body_size :65 +# header_0 :{ "Content-Type": "text/plain"} +# header_1 :{ "Transfer-Encoding": "chunked"} +# should_keep_alive :1 +# upgrade :0 +# http_major :1 +# http_minor :1 + + +class ParserTest + attr_accessor :name + attr_accessor :raw + attr_accessor :type + attr_accessor :method + attr_accessor :status_code + attr_accessor :request_path + attr_accessor :method +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/AUTHORS b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/AUTHORS new file mode 100644 index 000000000000..abe99dee44f3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/AUTHORS @@ -0,0 +1,32 @@ +# Authors ordered by first contribution. +Ryan Dahl <ry@tinyclouds.org> +Jeremy Hinegardner <jeremy@hinegardner.org> +Sergey Shepelev <temotor@gmail.com> +Joe Damato <ice799@gmail.com> +tomika <tomika_nospam@freemail.hu> +Phoenix Sol <phoenix@burninglabs.com> +Cliff Frey <cliff@meraki.com> +Ewen Cheslack-Postava <ewencp@cs.stanford.edu> +Santiago Gala <sgala@apache.org> +Tim Becker <tim.becker@syngenio.de> +Jeff Terrace <jterrace@gmail.com> +Ben Noordhuis <info@bnoordhuis.nl> +Nathan Rajlich <nathan@tootallnate.net> +Mark Nottingham <mnot@mnot.net> +Aman Gupta <aman@tmm1.net> +Tim Becker <tim.becker@kuriositaet.de> +Sean Cunningham <sean.cunningham@mandiant.com> +Peter Griess <pg@std.in> +Salman Haq <salman.haq@asti-usa.com> +Cliff Frey <clifffrey@gmail.com> +Jon Kolb <jon@b0g.us> +Fouad Mardini <f.mardini@gmail.com> +Paul Querna <pquerna@apache.org> +Felix Geisendörfer <felix@debuggable.com> +koichik <koichik@improvement.jp> +Andre Caron <andre.l.caron@gmail.com> +Ivo Raisr <ivosh@ivosh.net> +James McLaughlin <jamie@lacewing-project.org> +David Gwynne <loki@animata.net> +LE ROUX Thomas <thomas@procheo.fr> +Randy Rizun <rrizun@ortivawireless.com> diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/CONTRIBUTIONS b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/CONTRIBUTIONS new file mode 100644 index 000000000000..11ba31e4b990 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/CONTRIBUTIONS @@ -0,0 +1,4 @@ +Contributors must agree to the Contributor License Agreement before patches +can be accepted. + +http://spreadsheets2.google.com/viewform?hl=en&formkey=dDJXOGUwbzlYaWM4cHN1MERwQS1CSnc6MQ diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT new file mode 100644 index 000000000000..58010b388945 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/LICENSE-MIT @@ -0,0 +1,23 @@ +http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright +Igor Sysoev. + +Additional changes are licensed under the same terms as NGINX and +copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/README.md b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/README.md new file mode 100644 index 000000000000..700c3ac98d87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/README.md @@ -0,0 +1,178 @@ +HTTP Parser +=========== + +This is a parser for HTTP messages written in C. It parses both requests and +responses. The parser is designed to be used in performance HTTP +applications. It does not make any syscalls nor allocations, it does not +buffer data, it can be interrupted at anytime. Depending on your +architecture, it only requires about 40 bytes of data per message +stream (in a web server that is per connection). + +Features: + + * No dependencies + * Handles persistent streams (keep-alive). + * Decodes chunked encoding. + * Upgrade support + * Defends against buffer overflow attacks. + +The parser extracts the following information from HTTP messages: + + * Header fields and values + * Content-Length + * Request method + * Response status code + * Transfer-Encoding + * HTTP version + * Request URL + * Message body + + +Usage +----- + +One `http_parser` object is used per TCP connection. Initialize the struct +using `http_parser_init()` and set the callbacks. That might look something +like this for a request parser: + + http_parser_settings settings; + settings.on_path = my_path_callback; + settings.on_header_field = my_header_field_callback; + /* ... */ + + http_parser *parser = malloc(sizeof(http_parser)); + http_parser_init(parser, HTTP_REQUEST); + parser->data = my_socket; + +When data is received on the socket execute the parser and check for errors. + + size_t len = 80*1024, nparsed; + char buf[len]; + ssize_t recved; + + recved = recv(fd, buf, len, 0); + + if (recved < 0) { + /* Handle error. */ + } + + /* Start up / continue the parser. + * Note we pass recved==0 to signal that EOF has been recieved. + */ + nparsed = http_parser_execute(parser, &settings, buf, recved); + + if (parser->upgrade) { + /* handle new protocol */ + } else if (nparsed != recved) { + /* Handle error. Usually just close the connection. */ + } + +HTTP needs to know where the end of the stream is. For example, sometimes +servers send responses without Content-Length and expect the client to +consume input (for the body) until EOF. To tell http_parser about EOF, give +`0` as the forth parameter to `http_parser_execute()`. Callbacks and errors +can still be encountered during an EOF, so one must still be prepared +to receive them. + +Scalar valued message information such as `status_code`, `method`, and the +HTTP version are stored in the parser structure. This data is only +temporally stored in `http_parser` and gets reset on each new message. If +this information is needed later, copy it out of the structure during the +`headers_complete` callback. + +The parser decodes the transfer-encoding for both requests and responses +transparently. That is, a chunked encoding is decoded before being sent to +the on_body callback. + + +The Special Problem of Upgrade +------------------------------ + +HTTP supports upgrading the connection to a different protocol. An +increasingly common example of this is the Web Socket protocol which sends +a request like + + GET /demo HTTP/1.1 + Upgrade: WebSocket + Connection: Upgrade + Host: example.com + Origin: http://example.com + WebSocket-Protocol: sample + +followed by non-HTTP data. + +(See http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75 for more +information the Web Socket protocol.) + +To support this, the parser will treat this as a normal HTTP message without a +body. Issuing both on_headers_complete and on_message_complete callbacks. However +http_parser_execute() will stop parsing at the end of the headers and return. + +The user is expected to check if `parser->upgrade` has been set to 1 after +`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied +offset by the return value of `http_parser_execute()`. + + +Callbacks +--------- + +During the `http_parser_execute()` call, the callbacks set in +`http_parser_settings` will be executed. The parser maintains state and +never looks behind, so buffering the data is not necessary. If you need to +save certain data for later usage, you can do that from the callbacks. + +There are two types of callbacks: + +* notification `typedef int (*http_cb) (http_parser*);` + Callbacks: on_message_begin, on_headers_complete, on_message_complete. +* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);` + Callbacks: (requests only) on_uri, + (common) on_header_field, on_header_value, on_body; + +Callbacks must return 0 on success. Returning a non-zero value indicates +error to the parser, making it exit immediately. + +In case you parse HTTP message in chunks (i.e. `read()` request line +from socket, parse, read half headers, parse, etc) your data callbacks +may be called more than once. Http-parser guarantees that data pointer is only +valid for the lifetime of callback. You can also `read()` into a heap allocated +buffer to avoid copying memory around if this fits your application. + +Reading headers may be a tricky task if you read/parse headers partially. +Basically, you need to remember whether last header callback was field or value +and apply following logic: + + (on_header_field and on_header_value shortened to on_h_*) + ------------------------ ------------ -------------------------------------------- + | State (prev. callback) | Callback | Description/action | + ------------------------ ------------ -------------------------------------------- + | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | + | | | into it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_field | New header started. | + | | | Copy current name,value buffers to headers | + | | | list and allocate new buffer for new name | + ------------------------ ------------ -------------------------------------------- + | field | on_h_field | Previous name continues. Reallocate name | + | | | buffer and append callback data to it | + ------------------------ ------------ -------------------------------------------- + | field | on_h_value | Value for current header started. Allocate | + | | | new buffer and copy callback data to it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_value | Value continues. Reallocate value buffer | + | | | and append callback data to it | + ------------------------ ------------ -------------------------------------------- + + +Parsing URLs +------------ + +A simplistic zero-copy URL parser is provided as `http_parser_parse_url()`. +Users of this library may wish to use it to parse URLs constructed from +consecutive `on_url` callbacks. + +See examples of reading in headers: + +* [partial example](http://gist.github.com/155877) in C +* [from http-parser tests](http://github.com/ry/http-parser/blob/37a0ff8928fb0d83cec0d0d8909c5a4abcd221af/test.c#L403) in C +* [from Node library](http://github.com/ry/node/blob/842eaf446d2fdcb33b296c67c911c32a0dabc747/src/http.js#L284) in Javascript diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.c b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.c new file mode 100644 index 000000000000..f2ca661ba679 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.c @@ -0,0 +1,2058 @@ +/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev + * + * Additional changes are licensed under the same terms as NGINX and + * copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include <assert.h> +#include <stddef.h> +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +#ifndef ULLONG_MAX +# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ +#endif + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + + +#if HTTP_PARSER_DEBUG +#define SET_ERRNO(e) \ +do { \ + parser->http_errno = (e); \ + parser->error_lineno = __LINE__; \ +} while (0) +#else +#define SET_ERRNO(e) \ +do { \ + parser->http_errno = (e); \ +} while(0) +#endif + + +/* Run the notify callback FOR, returning ER if it fails */ +#define CALLBACK_NOTIFY_(FOR, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (settings->on_##FOR) { \ + if (0 != settings->on_##FOR(parser)) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + \ + /* We either errored above or got paused; get out */ \ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ + return (ER); \ + } \ + } \ +} while (0) + +/* Run the notify callback FOR and consume the current byte */ +#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) + +/* Run the notify callback FOR and don't consume the current byte */ +#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) + +/* Run data callback FOR with LEN bytes, returning ER if it fails */ +#define CALLBACK_DATA_(FOR, LEN, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (FOR##_mark) { \ + if (settings->on_##FOR) { \ + if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + \ + /* We either errored above or got paused; get out */ \ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ + return (ER); \ + } \ + } \ + FOR##_mark = NULL; \ + } \ +} while (0) + +/* Run the data callback FOR and consume the current byte */ +#define CALLBACK_DATA(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) + +/* Run the data callback FOR and don't consume the current byte */ +#define CALLBACK_DATA_NOADVANCE(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) + +/* Set the mark FOR; non-destructive if mark is already set */ +#define MARK(FOR) \ +do { \ + if (!FOR##_mark) { \ + FOR##_mark = p; \ + } \ +} while (0) + + +#define PROXY_CONNECTION "proxy-connection" +#define CONNECTION "connection" +#define CONTENT_LENGTH "content-length" +#define TRANSFER_ENCODING "transfer-encoding" +#define UPGRADE "upgrade" +#define CHUNKED "chunked" +#define KEEP_ALIVE "keep-alive" +#define CLOSE "close" + + +static const char *method_strings[] = + { "DELETE" + , "GET" + , "HEAD" + , "POST" + , "PUT" + , "CONNECT" + , "OPTIONS" + , "TRACE" + , "COPY" + , "LOCK" + , "MKCOL" + , "MOVE" + , "PROPFIND" + , "PROPPATCH" + , "UNLOCK" + , "REPORT" + , "MKACTIVITY" + , "CHECKOUT" + , "MERGE" + , "M-SEARCH" + , "NOTIFY" + , "SUBSCRIBE" + , "UNSUBSCRIBE" + , "PATCH" + , "PURGE" + }; + + +/* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1*<any CHAR except CTLs or separators> + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ +static const char tokens[256] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0, '!', 0, '#', '$', '%', '&', '\'', +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 0, 0, '*', '+', 0, '-', '.', 0, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + '0', '1', '2', '3', '4', '5', '6', '7', +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + '8', '9', 0, 0, 0, 0, 0, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 'x', 'y', 'z', 0, 0, 0, '^', '_', +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 'x', 'y', 'z', 0, '|', 0, '~', 0 }; + + +static const int8_t unhex[256] = + {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + }; + + +static const uint8_t normal_url_char[256] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0, 1, 1, 0, 1, 1, 1, 1, +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + 1, 1, 1, 1, 1, 1, 1, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 1, 1, 1, 1, 1, 1, 1, 0, }; + + +enum state + { s_dead = 1 /* important that this is > 0 */ + + , s_start_req_or_res + , s_res_or_resp_H + , s_start_res + , s_res_H + , s_res_HT + , s_res_HTT + , s_res_HTTP + , s_res_first_http_major + , s_res_http_major + , s_res_first_http_minor + , s_res_http_minor + , s_res_first_status_code + , s_res_status_code + , s_res_status + , s_res_line_almost_done + + , s_start_req + + , s_req_method + , s_req_spaces_before_url + , s_req_schema + , s_req_schema_slash + , s_req_schema_slash_slash + , s_req_host_start + , s_req_host_v6_start + , s_req_host_v6 + , s_req_host_v6_end + , s_req_host + , s_req_port_start + , s_req_port + , s_req_path + , s_req_query_string_start + , s_req_query_string + , s_req_fragment_start + , s_req_fragment + , s_req_http_start + , s_req_http_H + , s_req_http_HT + , s_req_http_HTT + , s_req_http_HTTP + , s_req_first_http_major + , s_req_http_major + , s_req_first_http_minor + , s_req_http_minor + , s_req_line_almost_done + + , s_header_field_start + , s_header_field + , s_header_value_start + , s_header_value + , s_header_value_lws + + , s_header_almost_done + + , s_chunk_size_start + , s_chunk_size + , s_chunk_parameters + , s_chunk_size_almost_done + + , s_headers_almost_done + , s_headers_done + + /* Important: 's_headers_done' must be the last 'header' state. All + * states beyond this must be 'body' states. It is used for overflow + * checking. See the PARSING_HEADER() macro. + */ + + , s_chunk_data + , s_chunk_data_almost_done + , s_chunk_data_done + + , s_body_identity + , s_body_identity_eof + + , s_message_done + }; + + +#define PARSING_HEADER(state) (state <= s_headers_done) + + +enum header_states + { h_general = 0 + , h_C + , h_CO + , h_CON + + , h_matching_connection + , h_matching_proxy_connection + , h_matching_content_length + , h_matching_transfer_encoding + , h_matching_upgrade + + , h_connection + , h_content_length + , h_transfer_encoding + , h_upgrade + + , h_matching_transfer_encoding_chunked + , h_matching_connection_keep_alive + , h_matching_connection_close + + , h_transfer_encoding_chunked + , h_connection_keep_alive + , h_connection_close + }; + + +/* Macros for character classes; depends on strict-mode */ +#define CR '\r' +#define LF '\n' +#define LOWER(c) (unsigned char)(c | 0x20) +#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') +#define IS_NUM(c) ((c) >= '0' && (c) <= '9') +#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) +#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) + +#if HTTP_PARSER_STRICT +#define TOKEN(c) (tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) (normal_url_char[(unsigned char) (c)]) +#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') +#else +#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) \ + (normal_url_char[(unsigned char) (c)] || ((c) & 0x80)) +#define IS_HOST_CHAR(c) \ + (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') +#endif + + +#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) + + +#if HTTP_PARSER_STRICT +# define STRICT_CHECK(cond) \ +do { \ + if (cond) { \ + SET_ERRNO(HPE_STRICT); \ + goto error; \ + } \ +} while (0) +# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) +#else +# define STRICT_CHECK(cond) +# define NEW_MESSAGE() start_state +#endif + + +/* Map errno values to strings for human-readable output */ +#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, +static struct { + const char *name; + const char *description; +} http_strerror_tab[] = { + HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) +}; +#undef HTTP_STRERROR_GEN + +int http_message_needs_eof(http_parser *parser); + +/* Our URL parser. + * + * This is designed to be shared by http_parser_execute() for URL validation, + * hence it has a state transition + byte-for-byte interface. In addition, it + * is meant to be embedded in http_parser_parse_url(), which does the dirty + * work of turning state transitions URL components for its API. + * + * This function should only be invoked with non-space characters. It is + * assumed that the caller cares about (and can detect) the transition between + * URL and non-URL states by looking for these. + */ +static enum state +parse_url_char(enum state s, const char ch) +{ + assert(!isspace(ch)); + + switch (s) { + case s_req_spaces_before_url: + /* Proxied requests are followed by scheme of an absolute URI (alpha). + * All methods except CONNECT are followed by '/' or '*'. + */ + + if (ch == '/' || ch == '*') { + return s_req_path; + } + + if (IS_ALPHA(ch)) { + return s_req_schema; + } + + break; + + case s_req_schema: + if (IS_ALPHA(ch)) { + return s; + } + + if (ch == ':') { + return s_req_schema_slash; + } + + break; + + case s_req_schema_slash: + if (ch == '/') { + return s_req_schema_slash_slash; + } + + break; + + case s_req_schema_slash_slash: + if (ch == '/') { + return s_req_host_start; + } + + break; + + case s_req_host_start: + if (ch == '[') { + return s_req_host_v6_start; + } + + if (IS_HOST_CHAR(ch)) { + return s_req_host; + } + + break; + + case s_req_host: + if (IS_HOST_CHAR(ch)) { + return s_req_host; + } + + /* FALLTHROUGH */ + case s_req_host_v6_end: + switch (ch) { + case ':': + return s_req_port_start; + + case '/': + return s_req_path; + + case '?': + return s_req_query_string_start; + } + + break; + + case s_req_host_v6: + if (ch == ']') { + return s_req_host_v6_end; + } + + /* FALLTHROUGH */ + case s_req_host_v6_start: + if (IS_HEX(ch) || ch == ':') { + return s_req_host_v6; + } + break; + + case s_req_port: + switch (ch) { + case '/': + return s_req_path; + + case '?': + return s_req_query_string_start; + } + + /* FALLTHROUGH */ + case s_req_port_start: + if (IS_NUM(ch)) { + return s_req_port; + } + + break; + + case s_req_path: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + return s_req_query_string_start; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_query_string_start: + case s_req_query_string: + if (IS_URL_CHAR(ch)) { + return s_req_query_string; + } + + switch (ch) { + case '?': + /* allow extra '?' in query string */ + return s_req_query_string; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_fragment_start: + if (IS_URL_CHAR(ch)) { + return s_req_fragment; + } + + switch (ch) { + case '?': + return s_req_fragment; + + case '#': + return s; + } + + break; + + case s_req_fragment: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + case '#': + return s; + } + + break; + + default: + break; + } + + /* We should never fall out of the switch above unless there's an error */ + return s_dead; +} + +size_t http_parser_execute (http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len) +{ + char c, ch; + int8_t unhex_val; + const char *p = data; + const char *header_field_mark = 0; + const char *header_value_mark = 0; + const char *url_mark = 0; + const char *body_mark = 0; + + /* We're in an error state. Don't bother doing anything. */ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return 0; + } + + if (len == 0) { + switch (parser->state) { + case s_body_identity_eof: + /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if + * we got paused. + */ + CALLBACK_NOTIFY_NOADVANCE(message_complete); + return 0; + + case s_dead: + case s_start_req_or_res: + case s_start_res: + case s_start_req: + return 0; + + default: + SET_ERRNO(HPE_INVALID_EOF_STATE); + return 1; + } + } + + + if (parser->state == s_header_field) + header_field_mark = data; + if (parser->state == s_header_value) + header_value_mark = data; + switch (parser->state) { + case s_req_path: + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_host_start: + case s_req_host_v6_start: + case s_req_host_v6: + case s_req_host_v6_end: + case s_req_host: + case s_req_port_start: + case s_req_port: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + url_mark = data; + break; + } + + for (p=data; p != data + len; p++) { + ch = *p; + + if (PARSING_HEADER(parser->state)) { + ++parser->nread; + /* Buffer overflow attack */ + if (parser->nread > HTTP_MAX_HEADER_SIZE) { + SET_ERRNO(HPE_HEADER_OVERFLOW); + goto error; + } + } + + reexecute_byte: + switch (parser->state) { + + case s_dead: + /* this state is used after a 'Connection: close' message + * the parser will error out if it reads another message + */ + if (ch == CR || ch == LF) + break; + + SET_ERRNO(HPE_CLOSED_CONNECTION); + goto error; + + case s_start_req_or_res: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (ch == 'H') { + parser->state = s_res_or_resp_H; + + CALLBACK_NOTIFY(message_begin); + } else { + parser->type = HTTP_REQUEST; + parser->state = s_start_req; + goto reexecute_byte; + } + + break; + } + + case s_res_or_resp_H: + if (ch == 'T') { + parser->type = HTTP_RESPONSE; + parser->state = s_res_HT; + } else { + if (ch != 'E') { + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + parser->type = HTTP_REQUEST; + parser->method = HTTP_HEAD; + parser->index = 2; + parser->state = s_req_method; + } + break; + + case s_start_res: + { + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + switch (ch) { + case 'H': + parser->state = s_res_H; + break; + + case CR: + case LF: + break; + + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + CALLBACK_NOTIFY(message_begin); + break; + } + + case s_res_H: + STRICT_CHECK(ch != 'T'); + parser->state = s_res_HT; + break; + + case s_res_HT: + STRICT_CHECK(ch != 'T'); + parser->state = s_res_HTT; + break; + + case s_res_HTT: + STRICT_CHECK(ch != 'P'); + parser->state = s_res_HTTP; + break; + + case s_res_HTTP: + STRICT_CHECK(ch != '/'); + parser->state = s_res_first_http_major; + break; + + case s_res_first_http_major: + if (ch < '0' || ch > '9') { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + parser->state = s_res_http_major; + break; + + /* major HTTP version or dot */ + case s_res_http_major: + { + if (ch == '.') { + parser->state = s_res_first_http_minor; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major *= 10; + parser->http_major += ch - '0'; + + if (parser->http_major > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* first digit of minor HTTP version */ + case s_res_first_http_minor: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + parser->state = s_res_http_minor; + break; + + /* minor HTTP version or end of request line */ + case s_res_http_minor: + { + if (ch == ' ') { + parser->state = s_res_first_status_code; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor *= 10; + parser->http_minor += ch - '0'; + + if (parser->http_minor > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + case s_res_first_status_code: + { + if (!IS_NUM(ch)) { + if (ch == ' ') { + break; + } + + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + parser->status_code = ch - '0'; + parser->state = s_res_status_code; + break; + } + + case s_res_status_code: + { + if (!IS_NUM(ch)) { + switch (ch) { + case ' ': + parser->state = s_res_status; + break; + case CR: + parser->state = s_res_line_almost_done; + break; + case LF: + parser->state = s_header_field_start; + break; + default: + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + break; + } + + parser->status_code *= 10; + parser->status_code += ch - '0'; + + if (parser->status_code > 999) { + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + + break; + } + + case s_res_status: + /* the human readable status. e.g. "NOT FOUND" + * we are not humans so just ignore this */ + if (ch == CR) { + parser->state = s_res_line_almost_done; + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + break; + } + break; + + case s_res_line_almost_done: + STRICT_CHECK(ch != LF); + parser->state = s_header_field_start; + break; + + case s_start_req: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (!IS_ALPHA(ch)) { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + parser->method = (enum http_method) 0; + parser->index = 1; + switch (ch) { + case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; + case 'D': parser->method = HTTP_DELETE; break; + case 'G': parser->method = HTTP_GET; break; + case 'H': parser->method = HTTP_HEAD; break; + case 'L': parser->method = HTTP_LOCK; break; + case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break; + case 'N': parser->method = HTTP_NOTIFY; break; + case 'O': parser->method = HTTP_OPTIONS; break; + case 'P': parser->method = HTTP_POST; + /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ + break; + case 'R': parser->method = HTTP_REPORT; break; + case 'S': parser->method = HTTP_SUBSCRIBE; break; + case 'T': parser->method = HTTP_TRACE; break; + case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break; + default: + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + parser->state = s_req_method; + + CALLBACK_NOTIFY(message_begin); + + break; + } + + case s_req_method: + { + const char *matcher; + if (ch == '\0') { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + matcher = method_strings[parser->method]; + if (ch == ' ' && matcher[parser->index] == '\0') { + parser->state = s_req_spaces_before_url; + } else if (ch == matcher[parser->index]) { + ; /* nada */ + } else if (parser->method == HTTP_CONNECT) { + if (parser->index == 1 && ch == 'H') { + parser->method = HTTP_CHECKOUT; + } else if (parser->index == 2 && ch == 'P') { + parser->method = HTTP_COPY; + } else { + goto error; + } + } else if (parser->method == HTTP_MKCOL) { + if (parser->index == 1 && ch == 'O') { + parser->method = HTTP_MOVE; + } else if (parser->index == 1 && ch == 'E') { + parser->method = HTTP_MERGE; + } else if (parser->index == 1 && ch == '-') { + parser->method = HTTP_MSEARCH; + } else if (parser->index == 2 && ch == 'A') { + parser->method = HTTP_MKACTIVITY; + } else { + goto error; + } + } else if (parser->index == 1 && parser->method == HTTP_POST) { + if (ch == 'R') { + parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */ + } else if (ch == 'U') { + parser->method = HTTP_PUT; /* or HTTP_PURGE */ + } else if (ch == 'A') { + parser->method = HTTP_PATCH; + } else { + goto error; + } + } else if (parser->index == 2) { + if (parser->method == HTTP_PUT) { + if (ch == 'R') parser->method = HTTP_PURGE; + } else if (parser->method == HTTP_UNLOCK) { + if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE; + } + } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') { + parser->method = HTTP_PROPPATCH; + } else { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + ++parser->index; + break; + } + + case s_req_spaces_before_url: + { + if (ch == ' ') break; + + MARK(url); + if (parser->method == HTTP_CONNECT) { + parser->state = s_req_host_start; + } + + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + + break; + } + + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_host_start: + case s_req_host_v6_start: + case s_req_host_v6: + case s_req_port_start: + { + switch (ch) { + /* No whitespace allowed here */ + case ' ': + case CR: + case LF: + SET_ERRNO(HPE_INVALID_URL); + goto error; + default: + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + + break; + } + + case s_req_host: + case s_req_host_v6_end: + case s_req_port: + case s_req_path: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + { + switch (ch) { + case ' ': + parser->state = s_req_http_start; + CALLBACK_DATA(url); + break; + case CR: + case LF: + parser->http_major = 0; + parser->http_minor = 9; + parser->state = (ch == CR) ? + s_req_line_almost_done : + s_header_field_start; + CALLBACK_DATA(url); + break; + default: + parser->state = parse_url_char((enum state)parser->state, ch); + if (parser->state == s_dead) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + break; + } + + case s_req_http_start: + switch (ch) { + case 'H': + parser->state = s_req_http_H; + break; + case ' ': + break; + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + break; + + case s_req_http_H: + STRICT_CHECK(ch != 'T'); + parser->state = s_req_http_HT; + break; + + case s_req_http_HT: + STRICT_CHECK(ch != 'T'); + parser->state = s_req_http_HTT; + break; + + case s_req_http_HTT: + STRICT_CHECK(ch != 'P'); + parser->state = s_req_http_HTTP; + break; + + case s_req_http_HTTP: + STRICT_CHECK(ch != '/'); + parser->state = s_req_first_http_major; + break; + + /* first digit of major HTTP version */ + case s_req_first_http_major: + if (ch < '1' || ch > '9') { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + parser->state = s_req_http_major; + break; + + /* major HTTP version or dot */ + case s_req_http_major: + { + if (ch == '.') { + parser->state = s_req_first_http_minor; + break; + } + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major *= 10; + parser->http_major += ch - '0'; + + if (parser->http_major > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* first digit of minor HTTP version */ + case s_req_first_http_minor: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + parser->state = s_req_http_minor; + break; + + /* minor HTTP version or end of request line */ + case s_req_http_minor: + { + if (ch == CR) { + parser->state = s_req_line_almost_done; + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + break; + } + + /* XXX allow spaces after digit? */ + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor *= 10; + parser->http_minor += ch - '0'; + + if (parser->http_minor > 999) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + break; + } + + /* end of request line */ + case s_req_line_almost_done: + { + if (ch != LF) { + SET_ERRNO(HPE_LF_EXPECTED); + goto error; + } + + parser->state = s_header_field_start; + break; + } + + case s_header_field_start: + { + if (ch == CR) { + parser->state = s_headers_almost_done; + break; + } + + if (ch == LF) { + /* they might be just sending \n instead of \r\n so this would be + * the second \n to denote the end of headers*/ + parser->state = s_headers_almost_done; + goto reexecute_byte; + } + + c = TOKEN(ch); + + if (!c) { + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + MARK(header_field); + + parser->index = 0; + parser->state = s_header_field; + + switch (c) { + case 'c': + parser->header_state = h_C; + break; + + case 'p': + parser->header_state = h_matching_proxy_connection; + break; + + case 't': + parser->header_state = h_matching_transfer_encoding; + break; + + case 'u': + parser->header_state = h_matching_upgrade; + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_field: + { + c = TOKEN(ch); + + if (c) { + switch (parser->header_state) { + case h_general: + break; + + case h_C: + parser->index++; + parser->header_state = (c == 'o' ? h_CO : h_general); + break; + + case h_CO: + parser->index++; + parser->header_state = (c == 'n' ? h_CON : h_general); + break; + + case h_CON: + parser->index++; + switch (c) { + case 'n': + parser->header_state = h_matching_connection; + break; + case 't': + parser->header_state = h_matching_content_length; + break; + default: + parser->header_state = h_general; + break; + } + break; + + /* connection */ + + case h_matching_connection: + parser->index++; + if (parser->index > sizeof(CONNECTION)-1 + || c != CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* proxy-connection */ + + case h_matching_proxy_connection: + parser->index++; + if (parser->index > sizeof(PROXY_CONNECTION)-1 + || c != PROXY_CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* content-length */ + + case h_matching_content_length: + parser->index++; + if (parser->index > sizeof(CONTENT_LENGTH)-1 + || c != CONTENT_LENGTH[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { + parser->header_state = h_content_length; + } + break; + + /* transfer-encoding */ + + case h_matching_transfer_encoding: + parser->index++; + if (parser->index > sizeof(TRANSFER_ENCODING)-1 + || c != TRANSFER_ENCODING[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { + parser->header_state = h_transfer_encoding; + } + break; + + /* upgrade */ + + case h_matching_upgrade: + parser->index++; + if (parser->index > sizeof(UPGRADE)-1 + || c != UPGRADE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(UPGRADE)-2) { + parser->header_state = h_upgrade; + } + break; + + case h_connection: + case h_content_length: + case h_transfer_encoding: + case h_upgrade: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + assert(0 && "Unknown header_state"); + break; + } + break; + } + + if (ch == ':') { + parser->state = s_header_value_start; + CALLBACK_DATA(header_field); + break; + } + + if (ch == CR) { + parser->state = s_header_almost_done; + CALLBACK_DATA(header_field); + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + CALLBACK_DATA(header_field); + break; + } + + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + case s_header_value_start: + { + if (ch == ' ' || ch == '\t') break; + + MARK(header_value); + + parser->state = s_header_value; + parser->index = 0; + + if (ch == CR) { + parser->header_state = h_general; + parser->state = s_header_almost_done; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + parser->state = s_header_field_start; + CALLBACK_DATA(header_value); + break; + } + + c = LOWER(ch); + + switch (parser->header_state) { + case h_upgrade: + parser->flags |= F_UPGRADE; + parser->header_state = h_general; + break; + + case h_transfer_encoding: + /* looking for 'Transfer-Encoding: chunked' */ + if ('c' == c) { + parser->header_state = h_matching_transfer_encoding_chunked; + } else { + parser->header_state = h_general; + } + break; + + case h_content_length: + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = ch - '0'; + break; + + case h_connection: + /* looking for 'Connection: keep-alive' */ + if (c == 'k') { + parser->header_state = h_matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (c == 'c') { + parser->header_state = h_matching_connection_close; + } else { + parser->header_state = h_general; + } + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_value: + { + + if (ch == CR) { + parser->state = s_header_almost_done; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + parser->state = s_header_almost_done; + CALLBACK_DATA_NOADVANCE(header_value); + goto reexecute_byte; + } + + c = LOWER(ch); + + switch (parser->header_state) { + case h_general: + break; + + case h_connection: + case h_transfer_encoding: + assert(0 && "Shouldn't get here."); + break; + + case h_content_length: + { + uint64_t t; + + if (ch == ' ') break; + + if (!IS_NUM(ch)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + t = parser->content_length; + t *= 10; + t += ch - '0'; + + /* Overflow? */ + if (t < parser->content_length || t == ULLONG_MAX) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + /* Transfer-Encoding: chunked */ + case h_matching_transfer_encoding_chunked: + parser->index++; + if (parser->index > sizeof(CHUNKED)-1 + || c != CHUNKED[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CHUNKED)-2) { + parser->header_state = h_transfer_encoding_chunked; + } + break; + + /* looking for 'Connection: keep-alive' */ + case h_matching_connection_keep_alive: + parser->index++; + if (parser->index > sizeof(KEEP_ALIVE)-1 + || c != KEEP_ALIVE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(KEEP_ALIVE)-2) { + parser->header_state = h_connection_keep_alive; + } + break; + + /* looking for 'Connection: close' */ + case h_matching_connection_close: + parser->index++; + if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CLOSE)-2) { + parser->header_state = h_connection_close; + } + break; + + case h_transfer_encoding_chunked: + case h_connection_keep_alive: + case h_connection_close: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + parser->state = s_header_value; + parser->header_state = h_general; + break; + } + break; + } + + case s_header_almost_done: + { + STRICT_CHECK(ch != LF); + + parser->state = s_header_value_lws; + + switch (parser->header_state) { + case h_connection_keep_alive: + parser->flags |= F_CONNECTION_KEEP_ALIVE; + break; + case h_connection_close: + parser->flags |= F_CONNECTION_CLOSE; + break; + case h_transfer_encoding_chunked: + parser->flags |= F_CHUNKED; + break; + default: + break; + } + + break; + } + + case s_header_value_lws: + { + if (ch == ' ' || ch == '\t') + parser->state = s_header_value_start; + else + { + parser->state = s_header_field_start; + goto reexecute_byte; + } + break; + } + + case s_headers_almost_done: + { + STRICT_CHECK(ch != LF); + + if (parser->flags & F_TRAILING) { + /* End of a chunked request */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + break; + } + + parser->state = s_headers_done; + + /* Set this here so that on_headers_complete() callbacks can see it */ + parser->upgrade = + (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT); + + /* Here we call the headers_complete callback. This is somewhat + * different than other callbacks because if the user returns 1, we + * will interpret that as saying that this message has no body. This + * is needed for the annoying case of recieving a response to a HEAD + * request. + * + * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so + * we have to simulate it by handling a change in errno below. + */ + if (settings->on_headers_complete) { + switch (settings->on_headers_complete(parser)) { + case 0: + break; + + case 1: + parser->flags |= F_SKIPBODY; + break; + + default: + SET_ERRNO(HPE_CB_headers_complete); + return p - data; /* Error */ + } + } + + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return p - data; + } + + goto reexecute_byte; + } + + case s_headers_done: + { + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + /* Exit, the rest of the connect is in a different protocol. */ + if (parser->upgrade) { + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + return (p - data) + 1; + } + + if (parser->flags & F_SKIPBODY) { + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else if (parser->flags & F_CHUNKED) { + /* chunked encoding - ignore Content-Length header */ + parser->state = s_chunk_size_start; + } else { + if (parser->content_length == 0) { + /* Content-Length header given but zero: Content-Length: 0\r\n */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else if (parser->content_length != ULLONG_MAX) { + /* Content-Length header given and non-zero */ + parser->state = s_body_identity; + } else { + if (parser->type == HTTP_REQUEST || + !http_message_needs_eof(parser)) { + /* Assume content-length 0 - read the next */ + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + } else { + /* Read body until EOF */ + parser->state = s_body_identity_eof; + } + } + } + + break; + } + + case s_body_identity: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* The difference between advancing content_length and p is because + * the latter will automaticaly advance on the next loop iteration. + * Further, if content_length ends up at 0, we want to see the last + * byte again for our message complete callback. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + parser->state = s_message_done; + + /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. + * + * The alternative to doing this is to wait for the next byte to + * trigger the data callback, just as in every other case. The + * problem with this is that this makes it difficult for the test + * harness to distinguish between complete-on-EOF and + * complete-on-length. It's not clear that this distinction is + * important for applications, but let's keep it for now. + */ + CALLBACK_DATA_(body, p - body_mark + 1, p - data); + goto reexecute_byte; + } + + break; + } + + /* read until EOF */ + case s_body_identity_eof: + MARK(body); + p = data + len - 1; + + break; + + case s_message_done: + parser->state = NEW_MESSAGE(); + CALLBACK_NOTIFY(message_complete); + break; + + case s_chunk_size_start: + { + assert(parser->nread == 1); + assert(parser->flags & F_CHUNKED); + + unhex_val = unhex[(unsigned char)ch]; + if (unhex_val == -1) { + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + parser->content_length = unhex_val; + parser->state = s_chunk_size; + break; + } + + case s_chunk_size: + { + uint64_t t; + + assert(parser->flags & F_CHUNKED); + + if (ch == CR) { + parser->state = s_chunk_size_almost_done; + break; + } + + unhex_val = unhex[(unsigned char)ch]; + + if (unhex_val == -1) { + if (ch == ';' || ch == ' ') { + parser->state = s_chunk_parameters; + break; + } + + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + t = parser->content_length; + t *= 16; + t += unhex_val; + + /* Overflow? */ + if (t < parser->content_length || t == ULLONG_MAX) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + case s_chunk_parameters: + { + assert(parser->flags & F_CHUNKED); + /* just ignore this shit. TODO check for overflow */ + if (ch == CR) { + parser->state = s_chunk_size_almost_done; + break; + } + break; + } + + case s_chunk_size_almost_done: + { + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + if (parser->content_length == 0) { + parser->flags |= F_TRAILING; + parser->state = s_header_field_start; + } else { + parser->state = s_chunk_data; + } + break; + } + + case s_chunk_data: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->flags & F_CHUNKED); + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* See the explanation in s_body_identity for why the content + * length and data pointers are managed this way. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + parser->state = s_chunk_data_almost_done; + } + + break; + } + + case s_chunk_data_almost_done: + assert(parser->flags & F_CHUNKED); + assert(parser->content_length == 0); + STRICT_CHECK(ch != CR); + parser->state = s_chunk_data_done; + CALLBACK_DATA(body); + break; + + case s_chunk_data_done: + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + parser->nread = 0; + parser->state = s_chunk_size_start; + break; + + default: + assert(0 && "unhandled state"); + SET_ERRNO(HPE_INVALID_INTERNAL_STATE); + goto error; + } + } + + /* Run callbacks for any marks that we have leftover after we ran our of + * bytes. There should be at most one of these set, so it's OK to invoke + * them in series (unset marks will not result in callbacks). + * + * We use the NOADVANCE() variety of callbacks here because 'p' has already + * overflowed 'data' and this allows us to correct for the off-by-one that + * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' + * value that's in-bounds). + */ + + assert(((header_field_mark ? 1 : 0) + + (header_value_mark ? 1 : 0) + + (url_mark ? 1 : 0) + + (body_mark ? 1 : 0)) <= 1); + + CALLBACK_DATA_NOADVANCE(header_field); + CALLBACK_DATA_NOADVANCE(header_value); + CALLBACK_DATA_NOADVANCE(url); + CALLBACK_DATA_NOADVANCE(body); + + return len; + +error: + if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { + SET_ERRNO(HPE_UNKNOWN); + } + + return (p - data); +} + + +/* Does the parser need to see an EOF to find the end of the message? */ +int +http_message_needs_eof (http_parser *parser) +{ + if (parser->type == HTTP_REQUEST) { + return 0; + } + + /* See RFC 2616 section 4.4 */ + if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ + parser->status_code == 204 || /* No Content */ + parser->status_code == 304 || /* Not Modified */ + parser->flags & F_SKIPBODY) { /* response to a HEAD request */ + return 0; + } + + if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { + return 0; + } + + return 1; +} + + +int +http_should_keep_alive (http_parser *parser) +{ + if (parser->http_major > 0 && parser->http_minor > 0) { + /* HTTP/1.1 */ + if (parser->flags & F_CONNECTION_CLOSE) { + return 0; + } + } else { + /* HTTP/1.0 or earlier */ + if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { + return 0; + } + } + + return !http_message_needs_eof(parser); +} + + +const char * http_method_str (enum http_method m) +{ + return method_strings[m]; +} + + +void +http_parser_init (http_parser *parser, enum http_parser_type t) +{ + void *data = parser->data; /* preserve application data */ + memset(parser, 0, sizeof(*parser)); + parser->data = data; + parser->type = t; + parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); + parser->http_errno = HPE_OK; +} + +const char * +http_errno_name(enum http_errno err) { + assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); + return http_strerror_tab[err].name; +} + +const char * +http_errno_description(enum http_errno err) { + assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); + return http_strerror_tab[err].description; +} + +int +http_parser_parse_url(const char *buf, size_t buflen, int is_connect, + struct http_parser_url *u) +{ + enum state s; + const char *p; + enum http_parser_url_fields uf, old_uf; + + u->port = u->field_set = 0; + s = is_connect ? s_req_host_start : s_req_spaces_before_url; + uf = old_uf = UF_MAX; + + for (p = buf; p < buf + buflen; p++) { + s = parse_url_char(s, *p); + + /* Figure out the next field that we're operating on */ + switch (s) { + case s_dead: + return 1; + + /* Skip delimeters */ + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_host_start: + case s_req_host_v6_start: + case s_req_host_v6_end: + case s_req_port_start: + case s_req_query_string_start: + case s_req_fragment_start: + continue; + + case s_req_schema: + uf = UF_SCHEMA; + break; + + case s_req_host: + case s_req_host_v6: + uf = UF_HOST; + break; + + case s_req_port: + uf = UF_PORT; + break; + + case s_req_path: + uf = UF_PATH; + break; + + case s_req_query_string: + uf = UF_QUERY; + break; + + case s_req_fragment: + uf = UF_FRAGMENT; + break; + + default: + assert(!"Unexpected state"); + return 1; + } + + /* Nothing's changed; soldier on */ + if (uf == old_uf) { + u->field_data[uf].len++; + continue; + } + + u->field_data[uf].off = p - buf; + u->field_data[uf].len = 1; + + u->field_set |= (1 << uf); + old_uf = uf; + } + + /* CONNECT requests can only contain "hostname:port" */ + if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { + return 1; + } + + /* Make sure we don't end somewhere unexpected */ + switch (s) { + case s_req_host_v6_start: + case s_req_host_v6: + case s_req_host_v6_end: + case s_req_host: + case s_req_port_start: + return 1; + default: + break; + } + + if (u->field_set & (1 << UF_PORT)) { + /* Don't bother with endp; we've already validated the string */ + unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10); + + /* Ports have a max value of 2^16 */ + if (v > 0xffff) { + return 1; + } + + u->port = (uint16_t) v; + } + + return 0; +} + +void +http_parser_pause(http_parser *parser, int paused) { + /* Users should only be pausing/unpausing a parser that is not in an error + * state. In non-debug builds, there's not much that we can do about this + * other than ignore it. + */ + if (HTTP_PARSER_ERRNO(parser) == HPE_OK || + HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { + SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); + } else { + assert(0 && "Attempting to pause parser in error state"); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp new file mode 100644 index 000000000000..c6eada707f27 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.gyp @@ -0,0 +1,79 @@ +# This file is used with the GYP meta build system. +# http://code.google.com/p/gyp/ +# To build try this: +# svn co http://gyp.googlecode.com/svn/trunk gyp +# ./gyp/gyp -f make --depth=`pwd` http_parser.gyp +# ./out/Debug/test +{ + 'target_defaults': { + 'default_configuration': 'Debug', + 'configurations': { + # TODO: hoist these out and put them somewhere common, because + # RuntimeLibrary MUST MATCH across the entire project + 'Debug': { + 'defines': [ 'DEBUG', '_DEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 1, # static debug + }, + }, + }, + 'Release': { + 'defines': [ 'NDEBUG' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 0, # static release + }, + }, + } + }, + 'msvs_settings': { + 'VCCLCompilerTool': { + }, + 'VCLibrarianTool': { + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'conditions': [ + ['OS == "win"', { + 'defines': [ + 'WIN32' + ], + }] + ], + }, + + 'targets': [ + { + 'target_name': 'http_parser', + 'type': 'static_library', + 'include_dirs': [ '.' ], + 'direct_dependent_settings': { + 'include_dirs': [ '.' ], + }, + 'defines': [ 'HTTP_PARSER_STRICT=0' ], + 'sources': [ './http_parser.c', ], + 'conditions': [ + ['OS=="win"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + # Compile as C++. http_parser.c is actually C99, but C++ is + # close enough in this case. + 'CompileAs': 2, + }, + }, + }] + ], + }, + + { + 'target_name': 'test', + 'type': 'executable', + 'dependencies': [ 'http_parser' ], + 'sources': [ 'test.c' ] + } + ] +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.h b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.h new file mode 100644 index 000000000000..78b3701b227c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/http_parser.h @@ -0,0 +1,312 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#ifndef http_parser_h +#define http_parser_h +#ifdef __cplusplus +extern "C" { +#endif + +#define HTTP_PARSER_VERSION_MAJOR 1 +#define HTTP_PARSER_VERSION_MINOR 0 + +#include <sys/types.h> +#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; + +typedef unsigned int size_t; +typedef int ssize_t; +#else +#include <stdint.h> +#endif + +/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run + * faster + */ +#ifndef HTTP_PARSER_STRICT +# define HTTP_PARSER_STRICT 1 +#endif + +/* Compile with -DHTTP_PARSER_DEBUG=1 to add extra debugging information to + * the error reporting facility. + */ +#ifndef HTTP_PARSER_DEBUG +# define HTTP_PARSER_DEBUG 0 +#endif + + +/* Maximium header size allowed */ +#define HTTP_MAX_HEADER_SIZE (80*1024) + + +typedef struct http_parser http_parser; +typedef struct http_parser_settings http_parser_settings; +typedef struct http_parser_result http_parser_result; + + +/* Callbacks should return non-zero to indicate an error. The parser will + * then halt execution. + * + * The one exception is on_headers_complete. In a HTTP_RESPONSE parser + * returning '1' from on_headers_complete will tell the parser that it + * should not expect a body. This is used when receiving a response to a + * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: + * chunked' headers that indicate the presence of a body. + * + * http_data_cb does not return data chunks. It will be call arbitrarally + * many times for each string. E.G. you might get 10 callbacks for "on_path" + * each providing just a few characters more data. + */ +typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); +typedef int (*http_cb) (http_parser*); + + +/* Request Methods */ +enum http_method + { HTTP_DELETE = 0 + , HTTP_GET + , HTTP_HEAD + , HTTP_POST + , HTTP_PUT + /* pathological */ + , HTTP_CONNECT + , HTTP_OPTIONS + , HTTP_TRACE + /* webdav */ + , HTTP_COPY + , HTTP_LOCK + , HTTP_MKCOL + , HTTP_MOVE + , HTTP_PROPFIND + , HTTP_PROPPATCH + , HTTP_UNLOCK + /* subversion */ + , HTTP_REPORT + , HTTP_MKACTIVITY + , HTTP_CHECKOUT + , HTTP_MERGE + /* upnp */ + , HTTP_MSEARCH + , HTTP_NOTIFY + , HTTP_SUBSCRIBE + , HTTP_UNSUBSCRIBE + /* RFC-5789 */ + , HTTP_PATCH + , HTTP_PURGE + }; + + +enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; + + +/* Flag values for http_parser.flags field */ +enum flags + { F_CHUNKED = 1 << 0 + , F_CONNECTION_KEEP_ALIVE = 1 << 1 + , F_CONNECTION_CLOSE = 1 << 2 + , F_TRAILING = 1 << 3 + , F_UPGRADE = 1 << 4 + , F_SKIPBODY = 1 << 5 + }; + + +/* Map for errno-related constants + * + * The provided argument should be a macro that takes 2 arguments. + */ +#define HTTP_ERRNO_MAP(XX) \ + /* No error */ \ + XX(OK, "success") \ + \ + /* Callback-related errors */ \ + XX(CB_message_begin, "the on_message_begin callback failed") \ + XX(CB_url, "the on_url callback failed") \ + XX(CB_header_field, "the on_header_field callback failed") \ + XX(CB_header_value, "the on_header_value callback failed") \ + XX(CB_headers_complete, "the on_headers_complete callback failed") \ + XX(CB_body, "the on_body callback failed") \ + XX(CB_message_complete, "the on_message_complete callback failed") \ + \ + /* Parsing-related errors */ \ + XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ + XX(HEADER_OVERFLOW, \ + "too many header bytes seen; overflow detected") \ + XX(CLOSED_CONNECTION, \ + "data received after completed connection: close message") \ + XX(INVALID_VERSION, "invalid HTTP version") \ + XX(INVALID_STATUS, "invalid HTTP status code") \ + XX(INVALID_METHOD, "invalid HTTP method") \ + XX(INVALID_URL, "invalid URL") \ + XX(INVALID_HOST, "invalid host") \ + XX(INVALID_PORT, "invalid port") \ + XX(INVALID_PATH, "invalid path") \ + XX(INVALID_QUERY_STRING, "invalid query string") \ + XX(INVALID_FRAGMENT, "invalid fragment") \ + XX(LF_EXPECTED, "LF character expected") \ + XX(INVALID_HEADER_TOKEN, "invalid character in header") \ + XX(INVALID_CONTENT_LENGTH, \ + "invalid character in content-length header") \ + XX(INVALID_CHUNK_SIZE, \ + "invalid character in chunk size header") \ + XX(INVALID_CONSTANT, "invalid constant string") \ + XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ + XX(STRICT, "strict mode assertion failed") \ + XX(PAUSED, "parser is paused") \ + XX(UNKNOWN, "an unknown error occurred") + + +/* Define HPE_* values for each errno value above */ +#define HTTP_ERRNO_GEN(n, s) HPE_##n, +enum http_errno { + HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) +}; +#undef HTTP_ERRNO_GEN + + +/* Get an http_errno value from an http_parser */ +#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) + +/* Get the line number that generated the current error */ +#if HTTP_PARSER_DEBUG +#define HTTP_PARSER_ERRNO_LINE(p) ((p)->error_lineno) +#else +#define HTTP_PARSER_ERRNO_LINE(p) 0 +#endif + + +struct http_parser { + /** PRIVATE **/ + unsigned char type : 2; /* enum http_parser_type */ + unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */ + unsigned char state; /* enum state from http_parser.c */ + unsigned char header_state; /* enum header_state from http_parser.c */ + unsigned char index; /* index into current matcher */ + + uint32_t nread; /* # bytes read in various scenarios */ + uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */ + + /** READ-ONLY **/ + unsigned short http_major; + unsigned short http_minor; + unsigned short status_code; /* responses only */ + unsigned char method; /* requests only */ + unsigned char http_errno : 7; + + /* 1 = Upgrade header was present and the parser has exited because of that. + * 0 = No upgrade header present. + * Should be checked when http_parser_execute() returns in addition to + * error checking. + */ + unsigned char upgrade : 1; + +#if HTTP_PARSER_DEBUG + uint32_t error_lineno; +#endif + + /** PUBLIC **/ + void *data; /* A pointer to get hook to the "connection" or "socket" object */ +}; + + +struct http_parser_settings { + http_cb on_message_begin; + http_data_cb on_url; + http_data_cb on_header_field; + http_data_cb on_header_value; + http_cb on_headers_complete; + http_data_cb on_body; + http_cb on_message_complete; +}; + + +enum http_parser_url_fields + { UF_SCHEMA = 0 + , UF_HOST = 1 + , UF_PORT = 2 + , UF_PATH = 3 + , UF_QUERY = 4 + , UF_FRAGMENT = 5 + , UF_MAX = 6 + }; + + +/* Result structure for http_parser_parse_url(). + * + * Callers should index into field_data[] with UF_* values iff field_set + * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and + * because we probably have padding left over), we convert any port to + * a uint16_t. + */ +struct http_parser_url { + uint16_t field_set; /* Bitmask of (1 << UF_*) values */ + uint16_t port; /* Converted UF_PORT string */ + + struct { + uint16_t off; /* Offset into buffer in which field starts */ + uint16_t len; /* Length of run in buffer */ + } field_data[UF_MAX]; +}; + + +void http_parser_init(http_parser *parser, enum http_parser_type type); + + +size_t http_parser_execute(http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len); + + +/* If http_should_keep_alive() in the on_headers_complete or + * on_message_complete callback returns true, then this will be should be + * the last message on the connection. + * If you are the server, respond with the "Connection: close" header. + * If you are the client, close the connection. + */ +int http_should_keep_alive(http_parser *parser); + +/* Returns a string version of the HTTP method. */ +const char *http_method_str(enum http_method m); + +/* Return a string name of the given error */ +const char *http_errno_name(enum http_errno err); + +/* Return a string description of the given error */ +const char *http_errno_description(enum http_errno err); + +/* Parse a URL; return nonzero on failure */ +int http_parser_parse_url(const char *buf, size_t buflen, + int is_connect, + struct http_parser_url *u); + +/* Pause or un-pause the parser; a nonzero value pauses */ +void http_parser_pause(http_parser *parser, int paused); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/test.c b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/test.c new file mode 100644 index 000000000000..184ba243fcfd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/ext/ruby_http_parser/vendor/http-parser/test.c @@ -0,0 +1,2876 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include <stdlib.h> +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> /* rand */ +#include <string.h> +#include <stdarg.h> + +#undef TRUE +#define TRUE 1 +#undef FALSE +#define FALSE 0 + +#define MAX_HEADERS 13 +#define MAX_ELEMENT_SIZE 500 + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +static http_parser *parser; + +struct message { + const char *name; // for debugging purposes + const char *raw; + enum http_parser_type type; + enum http_method method; + int status_code; + char request_path[MAX_ELEMENT_SIZE]; + char request_url[MAX_ELEMENT_SIZE]; + char fragment[MAX_ELEMENT_SIZE]; + char query_string[MAX_ELEMENT_SIZE]; + char body[MAX_ELEMENT_SIZE]; + size_t body_size; + uint16_t port; + int num_headers; + enum { NONE=0, FIELD, VALUE } last_header_element; + char headers [MAX_HEADERS][2][MAX_ELEMENT_SIZE]; + int should_keep_alive; + + const char *upgrade; // upgraded body + + unsigned short http_major; + unsigned short http_minor; + + int message_begin_cb_called; + int headers_complete_cb_called; + int message_complete_cb_called; + int message_complete_on_eof; +}; + +static int currently_parsing_eof; + +static struct message messages[5]; +static int num_messages; +static http_parser_settings *current_pause_parser; + +/* * R E Q U E S T S * */ +const struct message requests[] = +#define CURL_GET 0 +{ {.name= "curl get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.1\r\n" + "User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= + { { "User-Agent", "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1" } + , { "Host", "0.0.0.0=5000" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define FIREFOX_GET 1 +, {.name= "firefox get" + ,.type= HTTP_REQUEST + ,.raw= "GET /favicon.ico HTTP/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" + "Accept-Language: en-us,en;q=0.5\r\n" + "Accept-Encoding: gzip,deflate\r\n" + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" + "Keep-Alive: 300\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/favicon.ico" + ,.request_url= "/favicon.ico" + ,.num_headers= 8 + ,.headers= + { { "Host", "0.0.0.0=5000" } + , { "User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0" } + , { "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } + , { "Accept-Language", "en-us,en;q=0.5" } + , { "Accept-Encoding", "gzip,deflate" } + , { "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" } + , { "Keep-Alive", "300" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define DUMBFUCK 2 +, {.name= "dumbfuck" + ,.type= HTTP_REQUEST + ,.raw= "GET /dumbfuck HTTP/1.1\r\n" + "aaaaaaaaaaaaa:++++++++++\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/dumbfuck" + ,.request_url= "/dumbfuck" + ,.num_headers= 1 + ,.headers= + { { "aaaaaaaaaaaaa", "++++++++++" } + } + ,.body= "" + } + +#define FRAGMENT_IN_URI 3 +, {.name= "fragment in url" + ,.type= HTTP_REQUEST + ,.raw= "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "page=1" + ,.fragment= "posts-17408" + ,.request_path= "/forums/1/topics/2375" + /* XXX request url does include fragment? */ + ,.request_url= "/forums/1/topics/2375?page=1#posts-17408" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_NO_HEADERS_NO_BODY 4 +, {.name= "get no headers no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_no_headers_no_body/world HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_no_headers_no_body/world" + ,.request_url= "/get_no_headers_no_body/world" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_ONE_HEADER_NO_BODY 5 +, {.name= "get one header no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_one_header_no_body HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_one_header_no_body" + ,.request_url= "/get_one_header_no_body" + ,.num_headers= 1 + ,.headers= + { { "Accept" , "*/*" } + } + ,.body= "" + } + +#define GET_FUNKY_CONTENT_LENGTH 6 +, {.name= "get funky content length body hello" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_funky_content_length_body_hello HTTP/1.0\r\n" + "conTENT-Length: 5\r\n" + "\r\n" + "HELLO" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_funky_content_length_body_hello" + ,.request_url= "/get_funky_content_length_body_hello" + ,.num_headers= 1 + ,.headers= + { { "conTENT-Length" , "5" } + } + ,.body= "HELLO" + } + +#define POST_IDENTITY_BODY_WORLD 7 +, {.name= "post identity body world" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_identity_body_world?q=search#hey HTTP/1.1\r\n" + "Accept: */*\r\n" + "Transfer-Encoding: identity\r\n" + "Content-Length: 5\r\n" + "\r\n" + "World" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "q=search" + ,.fragment= "hey" + ,.request_path= "/post_identity_body_world" + ,.request_url= "/post_identity_body_world?q=search#hey" + ,.num_headers= 3 + ,.headers= + { { "Accept", "*/*" } + , { "Transfer-Encoding", "identity" } + , { "Content-Length", "5" } + } + ,.body= "World" + } + +#define POST_CHUNKED_ALL_YOUR_BASE 8 +, {.name= "post - chunked body: all your base are belong to us" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_chunked_all_your_base HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "1e\r\nall your base are belong to us\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/post_chunked_all_your_base" + ,.request_url= "/post_chunked_all_your_base" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding" , "chunked" } + } + ,.body= "all your base are belong to us" + } + +#define TWO_CHUNKS_MULT_ZERO_END 9 +, {.name= "two chunks ; triple zero ending" + ,.type= HTTP_REQUEST + ,.raw= "POST /two_chunks_mult_zero_end HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "000\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/two_chunks_mult_zero_end" + ,.request_url= "/two_chunks_mult_zero_end" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + } + +#define CHUNKED_W_TRAILING_HEADERS 10 +, {.name= "chunked with trailing headers. blech." + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_trailing_headers HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "0\r\n" + "Vary: *\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_trailing_headers" + ,.request_url= "/chunked_w_trailing_headers" + ,.num_headers= 3 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Vary", "*" } + , { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define CHUNKED_W_BULLSHIT_AFTER_LENGTH 11 +, {.name= "with bullshit after the length" + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_bullshit_after_length HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n" + "6; blahblah; blah\r\n world\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_bullshit_after_length" + ,.request_url= "/chunked_w_bullshit_after_length" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + } + +#define WITH_QUOTES 12 +, {.name= "with quotes" + ,.type= HTTP_REQUEST + ,.raw= "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=\"bar\"" + ,.fragment= "" + ,.request_path= "/with_\"stupid\"_quotes" + ,.request_url= "/with_\"stupid\"_quotes?foo=\"bar\"" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define APACHEBENCH_GET 13 +/* The server receiving this request SHOULD NOT wait for EOF + * to know that content-length == 0. + * How to represent this in a unit test? message_complete_on_eof + * Compare with NO_CONTENT_LENGTH_RESPONSE. + */ +, {.name = "apachebench get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.0\r\n" + "Host: 0.0.0.0:5000\r\n" + "User-Agent: ApacheBench/2.3\r\n" + "Accept: */*\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= { { "Host", "0.0.0.0:5000" } + , { "User-Agent", "ApacheBench/2.3" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define QUERY_URL_WITH_QUESTION_MARK_GET 14 +/* Some clients include '?' characters in query strings. + */ +, {.name = "query url with question mark" + ,.type= HTTP_REQUEST + ,.raw= "GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=bar?baz" + ,.fragment= "" + ,.request_path= "/test.cgi" + ,.request_url= "/test.cgi?foo=bar?baz" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define PREFIX_NEWLINE_GET 15 +/* Some clients, especially after a POST in a keep-alive connection, + * will send an extra CRLF before the next request + */ +, {.name = "newline prefix get" + ,.type= HTTP_REQUEST + ,.raw= "\r\nGET /test HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define UPGRADE_REQUEST 16 +, {.name = "upgrade request" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "Upgrade: WebSocket\r\n" + "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" + "Origin: http://example.com\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.num_headers= 7 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Upgrade" } + , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } + , { "Sec-WebSocket-Protocol", "sample" } + , { "Upgrade", "WebSocket" } + , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } + , { "Origin", "http://example.com" } + } + ,.body= "" + } + +#define CONNECT_REQUEST 17 +, {.name = "connect request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + "some data\r\n" + "and yet even more data" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "0-home0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="some data\r\nand yet even more data" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#define REPORT_REQ 18 +, {.name= "report request" + ,.type= HTTP_REQUEST + ,.raw= "REPORT /test HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_REPORT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define NO_HTTP_VERSION 19 +, {.name= "request with no http version" + ,.type= HTTP_REQUEST + ,.raw= "GET /\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 0 + ,.http_minor= 9 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define MSEARCH_REQ 20 +, {.name= "m-search request" + ,.type= HTTP_REQUEST + ,.raw= "M-SEARCH * HTTP/1.1\r\n" + "HOST: 239.255.255.250:1900\r\n" + "MAN: \"ssdp:discover\"\r\n" + "ST: \"ssdp:all\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_MSEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "*" + ,.request_url= "*" + ,.num_headers= 3 + ,.headers= { { "HOST", "239.255.255.250:1900" } + , { "MAN", "\"ssdp:discover\"" } + , { "ST", "\"ssdp:all\"" } + } + ,.body= "" + } + +#define LINE_FOLDING_IN_HEADER 20 +, {.name= "line folding in header value" + ,.type= HTTP_REQUEST + ,.raw= "GET / HTTP/1.1\r\n" + "Line1: abc\r\n" + "\tdef\r\n" + " ghi\r\n" + "\t\tjkl\r\n" + " mno \r\n" + "\t \tqrs\r\n" + "Line2: \t line2\t\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 2 + ,.headers= { { "Line1", "abcdefghijklmno qrs" } + , { "Line2", "line2\t" } + } + ,.body= "" + } + + +#define QUERY_TERMINATED_HOST 21 +, {.name= "host terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org?hail=all" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define QUERY_TERMINATED_HOSTPORT 22 +, {.name= "host:port terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234?hail=all" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define SPACE_TERMINATED_HOSTPORT 23 +, {.name= "host:port terminated by a space" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define PATCH_REQ 24 +, {.name = "PATCH request" + ,.type= HTTP_REQUEST + ,.raw= "PATCH /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/example\r\n" + "If-Match: \"e0023aa4e\"\r\n" + "Content-Length: 10\r\n" + "\r\n" + "cccccccccc" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PATCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 4 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/example" } + , { "If-Match", "\"e0023aa4e\"" } + , { "Content-Length", "10" } + } + ,.body= "cccccccccc" + } + +#define CONNECT_CAPS_REQUEST 25 +, {.name = "connect caps request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "HOME0.NETSCAPE.COM:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define UTF8_PATH_REQ 26 +, {.name= "utf-8 path request" + ,.type= HTTP_REQUEST + ,.raw= "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\n" + "Host: github.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "q=1" + ,.fragment= "narf" + ,.request_path= "/δ¶/δt/pope" + ,.request_url= "/δ¶/δt/pope?q=1#narf" + ,.num_headers= 1 + ,.headers= { {"Host", "github.com" } + } + ,.body= "" + } + +#define HOSTNAME_UNDERSCORE 27 +, {.name = "hostname underscore" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT home_0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "home_0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } +#endif /* !HTTP_PARSER_STRICT */ + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_NO_CONNECTION_CLOSE 28 +, {.name = "eat CRLF between requests, no \"Connection: close\" header" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 3 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + } + ,.body= "q=42" + } + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_WITH_CONNECTION_CLOSE 29 +, {.name = "eat CRLF between requests even if \"Connection: close\" is set" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "Connection: close\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE /* input buffer isn't empty when on_message_complete is called */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 4 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + , { "Connection", "close" } + } + ,.body= "q=42" + } + +#define PURGE_REQ 30 +, {.name = "PURGE request" + ,.type= HTTP_REQUEST + ,.raw= "PURGE /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PURGE + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +, {.name= NULL } /* sentinel */ +}; + +/* * R E S P O N S E S * */ +const struct message responses[] = +#define GOOGLE_301 0 +{ {.name= "google 301" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301 Moved Permanently\r\n" + "Location: http://www.google.com/\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Date: Sun, 26 Apr 2009 11:11:49 GMT\r\n" + "Expires: Tue, 26 May 2009 11:11:49 GMT\r\n" + "X-$PrototypeBI-Version: 1.6.0.3\r\n" /* $ char in header field */ + "Cache-Control: public, max-age=2592000\r\n" + "Server: gws\r\n" + "Content-Length: 219 \r\n" + "\r\n" + "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n" + "<TITLE>301 Moved</TITLE></HEAD><BODY>\n" + "<H1>301 Moved</H1>\n" + "The document has moved\n" + "<A HREF=\"http://www.google.com/\">here</A>.\r\n" + "</BODY></HTML>\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.num_headers= 8 + ,.headers= + { { "Location", "http://www.google.com/" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Date", "Sun, 26 Apr 2009 11:11:49 GMT" } + , { "Expires", "Tue, 26 May 2009 11:11:49 GMT" } + , { "X-$PrototypeBI-Version", "1.6.0.3" } + , { "Cache-Control", "public, max-age=2592000" } + , { "Server", "gws" } + , { "Content-Length", "219 " } + } + ,.body= "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n" + "<TITLE>301 Moved</TITLE></HEAD><BODY>\n" + "<H1>301 Moved</H1>\n" + "The document has moved\n" + "<A HREF=\"http://www.google.com/\">here</A>.\r\n" + "</BODY></HTML>\r\n" + } + +#define NO_CONTENT_LENGTH_RESPONSE 1 +/* The client should wait for the server's EOF. That is, when content-length + * is not specified, and "Connection: close", the end of body is specified + * by the EOF. + * Compare with APACHEBENCH_GET + */ +, {.name= "no content-length response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 04 Aug 2009 07:59:32 GMT\r\n" + "Server: Apache\r\n" + "X-Powered-By: Servlet/2.5 JSP/2.1\r\n" + "Content-Type: text/xml; charset=utf-8\r\n" + "Connection: close\r\n" + "\r\n" + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + " <SOAP-ENV:Body>\n" + " <SOAP-ENV:Fault>\n" + " <faultcode>SOAP-ENV:Client</faultcode>\n" + " <faultstring>Client Error</faultstring>\n" + " </SOAP-ENV:Fault>\n" + " </SOAP-ENV:Body>\n" + "</SOAP-ENV:Envelope>" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 5 + ,.headers= + { { "Date", "Tue, 04 Aug 2009 07:59:32 GMT" } + , { "Server", "Apache" } + , { "X-Powered-By", "Servlet/2.5 JSP/2.1" } + , { "Content-Type", "text/xml; charset=utf-8" } + , { "Connection", "close" } + } + ,.body= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + " <SOAP-ENV:Body>\n" + " <SOAP-ENV:Fault>\n" + " <faultcode>SOAP-ENV:Client</faultcode>\n" + " <faultstring>Client Error</faultstring>\n" + " </SOAP-ENV:Fault>\n" + " </SOAP-ENV:Body>\n" + "</SOAP-ENV:Envelope>" + } + +#define NO_HEADERS_NO_BODY_404 2 +, {.name= "404 no headers no body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 404 Not Found\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 404 + ,.num_headers= 0 + ,.headers= {} + ,.body_size= 0 + ,.body= "" + } + +#define NO_REASON_PHRASE 3 +, {.name= "301 no response phrase" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301\r\n\r\n" + ,.should_keep_alive = FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define TRAILING_SPACE_ON_CHUNKED_BODY 4 +, {.name="200 trailing space on chunked body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "25 \r\n" + "This is the data in the first chunk\r\n" + "\r\n" + "1C\r\n" + "and this is the second one\r\n" + "\r\n" + "0 \r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/plain" } + , {"Transfer-Encoding", "chunked" } + } + ,.body_size = 37+28 + ,.body = + "This is the data in the first chunk\r\n" + "and this is the second one\r\n" + + } + +#define NO_CARRIAGE_RET 5 +, {.name="no carriage ret" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\n" + "Content-Type: text/html; charset=utf-8\n" + "Connection: close\n" + "\n" + "these headers are from http://news.ycombinator.com/" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/html; charset=utf-8" } + , {"Connection", "close" } + } + ,.body= "these headers are from http://news.ycombinator.com/" + } + +#define PROXY_CONNECTION 6 +, {.name="proxy connection" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Content-Length: 11\r\n" + "Proxy-Connection: close\r\n" + "Date: Thu, 31 Dec 2009 20:55:48 +0000\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 4 + ,.headers= + { {"Content-Type", "text/html; charset=UTF-8" } + , {"Content-Length", "11" } + , {"Proxy-Connection", "close" } + , {"Date", "Thu, 31 Dec 2009 20:55:48 +0000"} + } + ,.body= "hello world" + } + +#define UNDERSTORE_HEADER_KEY 7 + // shown by + // curl -o /dev/null -v "http://ad.doubleclick.net/pfadx/DARTSHELLCONFIGXML;dcmt=text/xml;" +, {.name="underscore header key" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: DCLK-AdSvr\r\n" + "Content-Type: text/xml\r\n" + "Content-Length: 0\r\n" + "DCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 4 + ,.headers= + { {"Server", "DCLK-AdSvr" } + , {"Content-Type", "text/xml" } + , {"Content-Length", "0" } + , {"DCLK_imp", "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" } + } + ,.body= "" + } + +#define BONJOUR_MADAME_FR 8 +/* The client should not merge two headers fields when the first one doesn't + * have a value. + */ +, {.name= "bonjourmadame.fr" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 301 Moved Permanently\r\n" + "Date: Thu, 03 Jun 2010 09:56:32 GMT\r\n" + "Server: Apache/2.2.3 (Red Hat)\r\n" + "Cache-Control: public\r\n" + "Pragma: \r\n" + "Location: http://www.bonjourmadame.fr/\r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: 0\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 301 + ,.num_headers= 9 + ,.headers= + { { "Date", "Thu, 03 Jun 2010 09:56:32 GMT" } + , { "Server", "Apache/2.2.3 (Red Hat)" } + , { "Cache-Control", "public" } + , { "Pragma", "" } + , { "Location", "http://www.bonjourmadame.fr/" } + , { "Vary", "Accept-Encoding" } + , { "Content-Length", "0" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define RES_FIELD_UNDERSCORE 9 +/* Should handle spaces in header fields */ +, {.name= "field underscore" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 28 Sep 2010 01:14:13 GMT\r\n" + "Server: Apache\r\n" + "Cache-Control: no-cache, must-revalidate\r\n" + "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n" + ".et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\n" + "Vary: Accept-Encoding\r\n" + "_eep-Alive: timeout=45\r\n" /* semantic value ignored */ + "_onnection: Keep-Alive\r\n" /* semantic value ignored */ + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/html\r\n" + "Connection: close\r\n" + "\r\n" + "0\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 11 + ,.headers= + { { "Date", "Tue, 28 Sep 2010 01:14:13 GMT" } + , { "Server", "Apache" } + , { "Cache-Control", "no-cache, must-revalidate" } + , { "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" } + , { ".et-Cookie", "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com" } + , { "Vary", "Accept-Encoding" } + , { "_eep-Alive", "timeout=45" } + , { "_onnection", "Keep-Alive" } + , { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/html" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define NON_ASCII_IN_STATUS_LINE 10 +/* Should handle non-ASCII in status line */ +, {.name= "non-ASCII in status line" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 500 Oriëntatieprobleem\r\n" + "Date: Fri, 5 Nov 2010 23:07:12 GMT+2\r\n" + "Content-Length: 0\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 500 + ,.num_headers= 3 + ,.headers= + { { "Date", "Fri, 5 Nov 2010 23:07:12 GMT+2" } + , { "Content-Length", "0" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define HTTP_VERSION_0_9 11 +/* Should handle HTTP/0.9 */ +, {.name= "http version 0.9" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/0.9 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 0 + ,.http_minor= 9 + ,.status_code= 200 + ,.num_headers= 0 + ,.headers= + {} + ,.body= "" + } + +#define NO_CONTENT_LENGTH_NO_TRANSFER_ENCODING_RESPONSE 12 +/* The client should wait for the server's EOF. That is, when neither + * content-length nor transfer-encoding is specified, the end of body + * is specified by the EOF. + */ +, {.name= "neither content-length nor transfer-encoding response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define NO_BODY_HTTP10_KA_200 13 +, {.name= "HTTP/1.0 with keep-alive and EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 200 OK\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP10_KA_204 14 +, {.name= "HTTP/1.0 with keep-alive and a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 204 No content\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 204 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_200 15 +, {.name= "HTTP/1.1 with an EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_204 16 +, {.name= "HTTP/1.1 with a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_NOKA_204 17 +, {.name= "HTTP/1.1 with a 204 status and keep-alive disabled" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.num_headers= 1 + ,.headers= + { { "Connection", "close" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_CHUNKED_200 18 +, {.name= "HTTP/1.1 with chunked endocing and a 200 response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body_size= 0 + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define SPACE_IN_FIELD_RES 19 +/* Should handle spaces in header fields */ +, {.name= "field space" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: Microsoft-IIS/6.0\r\n" + "X-Powered-By: ASP.NET\r\n" + "en-US Content-Type: text/xml\r\n" /* this is the problem */ + "Content-Type: text/xml\r\n" + "Content-Length: 16\r\n" + "Date: Fri, 23 Jul 2010 18:45:38 GMT\r\n" + "Connection: keep-alive\r\n" + "\r\n" + "<xml>hello</xml>" /* fake body */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 7 + ,.headers= + { { "Server", "Microsoft-IIS/6.0" } + , { "X-Powered-By", "ASP.NET" } + , { "en-US Content-Type", "text/xml" } + , { "Content-Type", "text/xml" } + , { "Content-Length", "16" } + , { "Date", "Fri, 23 Jul 2010 18:45:38 GMT" } + , { "Connection", "keep-alive" } + } + ,.body= "<xml>hello</xml>" + } +#endif /* !HTTP_PARSER_STRICT */ + +, {.name= NULL } /* sentinel */ +}; + +int +request_url_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strncat(messages[num_messages].request_url, buf, len); + return 0; +} + +int +header_field_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + if (m->last_header_element != FIELD) + m->num_headers++; + + strncat(m->headers[m->num_headers-1][0], buf, len); + + m->last_header_element = FIELD; + + return 0; +} + +int +header_value_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + strncat(m->headers[m->num_headers-1][1], buf, len); + + m->last_header_element = VALUE; + + return 0; +} + +int +body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strncat(messages[num_messages].body, buf, len); + messages[num_messages].body_size += len; + // printf("body_cb: '%s'\n", requests[num_messages].body); + return 0; +} + +int +count_body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + assert(buf); + messages[num_messages].body_size += len; + return 0; +} + +int +message_begin_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].message_begin_cb_called = TRUE; + return 0; +} + +int +headers_complete_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].method = parser->method; + messages[num_messages].status_code = parser->status_code; + messages[num_messages].http_major = parser->http_major; + messages[num_messages].http_minor = parser->http_minor; + messages[num_messages].headers_complete_cb_called = TRUE; + messages[num_messages].should_keep_alive = http_should_keep_alive(parser); + return 0; +} + +int +message_complete_cb (http_parser *p) +{ + assert(p == parser); + if (messages[num_messages].should_keep_alive != http_should_keep_alive(parser)) + { + fprintf(stderr, "\n\n *** Error http_should_keep_alive() should have same " + "value in both on_message_complete and on_headers_complete " + "but it doesn't! ***\n\n"); + assert(0); + exit(1); + } + messages[num_messages].message_complete_cb_called = TRUE; + + messages[num_messages].message_complete_on_eof = currently_parsing_eof; + + num_messages++; + return 0; +} + +/* These dontcall_* callbacks exist so that we can verify that when we're + * paused, no additional callbacks are invoked */ +int +dontcall_message_begin_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_begin() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_field() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_value() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_request_url() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_body_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_body_cb() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_headers_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_headers_complete() called on paused " + "parser ***\n\n"); + exit(1); +} + +int +dontcall_message_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_complete() called on paused " + "parser ***\n\n"); + exit(1); +} + +static http_parser_settings settings_dontcall = + {.on_message_begin = dontcall_message_begin_cb + ,.on_header_field = dontcall_header_field_cb + ,.on_header_value = dontcall_header_value_cb + ,.on_url = dontcall_request_url_cb + ,.on_body = dontcall_body_cb + ,.on_headers_complete = dontcall_headers_complete_cb + ,.on_message_complete = dontcall_message_complete_cb + }; + +/* These pause_* callbacks always pause the parser and just invoke the regular + * callback that tracks content. Before returning, we overwrite the parser + * settings to point to the _dontcall variety so that we can verify that + * the pause actually did, you know, pause. */ +int +pause_message_begin_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_begin_cb(p); +} + +int +pause_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_field_cb(p, buf, len); +} + +int +pause_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_value_cb(p, buf, len); +} + +int +pause_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return request_url_cb(p, buf, len); +} + +int +pause_body_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return body_cb(p, buf, len); +} + +int +pause_headers_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return headers_complete_cb(p); +} + +int +pause_message_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_complete_cb(p); +} + +static http_parser_settings settings_pause = + {.on_message_begin = pause_message_begin_cb + ,.on_header_field = pause_header_field_cb + ,.on_header_value = pause_header_value_cb + ,.on_url = pause_request_url_cb + ,.on_body = pause_body_cb + ,.on_headers_complete = pause_headers_complete_cb + ,.on_message_complete = pause_message_complete_cb + }; + +static http_parser_settings settings = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_body = body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + }; + +static http_parser_settings settings_count_body = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_body = count_body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + }; + +static http_parser_settings settings_null = + {.on_message_begin = 0 + ,.on_header_field = 0 + ,.on_header_value = 0 + ,.on_url = 0 + ,.on_body = 0 + ,.on_headers_complete = 0 + ,.on_message_complete = 0 + }; + +void +parser_init (enum http_parser_type type) +{ + num_messages = 0; + + assert(parser == NULL); + + parser = malloc(sizeof(http_parser)); + + http_parser_init(parser, type); + + memset(&messages, 0, sizeof messages); + +} + +void +parser_free () +{ + assert(parser); + free(parser); + parser = NULL; +} + +size_t parse (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings, buf, len); + return nparsed; +} + +size_t parse_count_body (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings_count_body, buf, len); + return nparsed; +} + +size_t parse_pause (const char *buf, size_t len) +{ + size_t nparsed; + http_parser_settings s = settings_pause; + + currently_parsing_eof = (len == 0); + current_pause_parser = &s; + nparsed = http_parser_execute(parser, current_pause_parser, buf, len); + return nparsed; +} + +static inline int +check_str_eq (const struct message *m, + const char *prop, + const char *expected, + const char *found) { + if ((expected == NULL) != (found == NULL)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %s\n", (expected == NULL) ? "NULL" : expected); + printf(" found %s\n", (found == NULL) ? "NULL" : found); + return 0; + } + if (expected != NULL && 0 != strcmp(expected, found)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected '%s'\n", expected); + printf(" found '%s'\n", found); + return 0; + } + return 1; +} + +static inline int +check_num_eq (const struct message *m, + const char *prop, + int expected, + int found) { + if (expected != found) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %d\n", expected); + printf(" found %d\n", found); + return 0; + } + return 1; +} + +#define MESSAGE_CHECK_STR_EQ(expected, found, prop) \ + if (!check_str_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_NUM_EQ(expected, found, prop) \ + if (!check_num_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_URL_EQ(u, expected, found, prop, fn) \ +do { \ + char ubuf[256]; \ + \ + if ((u)->field_set & (1 << (fn))) { \ + memcpy(ubuf, (found)->request_url + (u)->field_data[(fn)].off, \ + (u)->field_data[(fn)].len); \ + ubuf[(u)->field_data[(fn)].len] = '\0'; \ + } else { \ + ubuf[0] = '\0'; \ + } \ + \ + check_str_eq(expected, #prop, expected->prop, ubuf); \ +} while(0) + +int +message_eq (int index, const struct message *expected) +{ + int i; + struct message *m = &messages[index]; + + MESSAGE_CHECK_NUM_EQ(expected, m, http_major); + MESSAGE_CHECK_NUM_EQ(expected, m, http_minor); + + if (expected->type == HTTP_REQUEST) { + MESSAGE_CHECK_NUM_EQ(expected, m, method); + } else { + MESSAGE_CHECK_NUM_EQ(expected, m, status_code); + } + + MESSAGE_CHECK_NUM_EQ(expected, m, should_keep_alive); + MESSAGE_CHECK_NUM_EQ(expected, m, message_complete_on_eof); + + assert(m->message_begin_cb_called); + assert(m->headers_complete_cb_called); + assert(m->message_complete_cb_called); + + + MESSAGE_CHECK_STR_EQ(expected, m, request_url); + + /* Check URL components; we can't do this w/ CONNECT since it doesn't + * send us a well-formed URL. + */ + if (*m->request_url && m->method != HTTP_CONNECT) { + struct http_parser_url u; + + if (http_parser_parse_url(m->request_url, strlen(m->request_url), 0, &u)) { + fprintf(stderr, "\n\n*** failed to parse URL %s ***\n\n", + m->request_url); + exit(1); + } + + m->port = (u.field_set & (1 << UF_PORT)) ? + u.port : 0; + + MESSAGE_CHECK_URL_EQ(&u, expected, m, query_string, UF_QUERY); + MESSAGE_CHECK_URL_EQ(&u, expected, m, fragment, UF_FRAGMENT); + MESSAGE_CHECK_URL_EQ(&u, expected, m, request_path, UF_PATH); + MESSAGE_CHECK_NUM_EQ(expected, m, port); + } + + if (expected->body_size) { + MESSAGE_CHECK_NUM_EQ(expected, m, body_size); + } else { + MESSAGE_CHECK_STR_EQ(expected, m, body); + } + + MESSAGE_CHECK_NUM_EQ(expected, m, num_headers); + + int r; + for (i = 0; i < m->num_headers; i++) { + r = check_str_eq(expected, "header field", expected->headers[i][0], m->headers[i][0]); + if (!r) return 0; + r = check_str_eq(expected, "header value", expected->headers[i][1], m->headers[i][1]); + if (!r) return 0; + } + + MESSAGE_CHECK_STR_EQ(expected, m, upgrade); + + return 1; +} + +/* Given a sequence of varargs messages, return the number of them that the + * parser should successfully parse, taking into account that upgraded + * messages prevent all subsequent messages from being parsed. + */ +size_t +count_parsed_messages(const size_t nmsgs, ...) { + size_t i; + va_list ap; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + if (m->upgrade) { + va_end(ap); + return i + 1; + } + } + + va_end(ap); + return nmsgs; +} + +/* Given a sequence of bytes and the number of these that we were able to + * parse, verify that upgrade bodies are correct. + */ +void +upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) { + va_list ap; + size_t i; + size_t off = 0; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + off += strlen(m->raw); + + if (m->upgrade) { + off -= strlen(m->upgrade); + + /* Check the portion of the response after its specified upgrade */ + if (!check_str_eq(m, "upgrade", body + off, body + nread)) { + exit(1); + } + + /* Fix up the response so that message_eq() will verify the beginning + * of the upgrade */ + *(body + nread + strlen(m->upgrade)) = '\0'; + messages[num_messages -1 ].upgrade = body + nread; + + va_end(ap); + return; + } + } + + va_end(ap); + printf("\n\n*** Error: expected a message with upgrade ***\n"); + + exit(1); +} + +static void +print_error (const char *raw, size_t error_location) +{ + fprintf(stderr, "\n*** %s:%d -- %s ***\n\n", + "http_parser.c", HTTP_PARSER_ERRNO_LINE(parser), + http_errno_description(HTTP_PARSER_ERRNO(parser))); + + int this_line = 0, char_len = 0; + size_t i, j, len = strlen(raw), error_location_line = 0; + for (i = 0; i < len; i++) { + if (i == error_location) this_line = 1; + switch (raw[i]) { + case '\r': + char_len = 2; + fprintf(stderr, "\\r"); + break; + + case '\n': + char_len = 2; + fprintf(stderr, "\\n\n"); + + if (this_line) goto print; + + error_location_line = 0; + continue; + + default: + char_len = 1; + fputc(raw[i], stderr); + break; + } + if (!this_line) error_location_line += char_len; + } + + fprintf(stderr, "[eof]\n"); + + print: + for (j = 0; j < error_location_line; j++) { + fputc(' ', stderr); + } + fprintf(stderr, "^\n\nerror location: %u\n", (unsigned int)error_location); +} + +void +test_preserve_data (void) +{ + char my_data[] = "application-specific data"; + http_parser parser; + parser.data = my_data; + http_parser_init(&parser, HTTP_REQUEST); + if (parser.data != my_data) { + printf("\n*** parser.data not preserved accross http_parser_init ***\n\n"); + exit(1); + } +} + +struct url_test { + const char *name; + const char *url; + int is_connect; + struct http_parser_url u; + int rv; +}; + +const struct url_test url_tests[] = +{ {.name="proxy request" + ,.url="http://hostname/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 15, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request" + ,.url="hostname:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 8 } /* UF_HOST */ + ,{ 9, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + } + } + ,.rv=0 + } + +, {.name="proxy ipv6 request" + ,.url="http://[1:2::3:4]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 17, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + } + } + ,.rv=0 + } + +, {.name="CONNECT ipv6 address" + ,.url="[1:2::3:4]:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 1, 8 } /* UF_HOST */ + ,{ 11, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + } + } + ,.rv=0 + } + +, {.name="extra ? in query string" + ,.url="http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css,fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css,fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css" + ,.is_connect=0 + ,.u= + {.field_set=(1<<UF_SCHEMA) | (1<<UF_HOST) | (1<<UF_PATH) | (1<<UF_QUERY) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 10 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 17, 12 } /* UF_PATH */ + ,{ 30,187 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + } + } + ,.rv=0 + } + +, {.name="proxy empty host" + ,.url="http://:443/" + ,.is_connect=0 + ,.rv=1 + } + +, {.name="proxy empty port" + ,.url="http://hostname:/" + ,.is_connect=0 + ,.rv=1 + } + +, {.name="CONNECT empty host" + ,.url=":443" + ,.is_connect=1 + ,.rv=1 + } + +, {.name="CONNECT empty port" + ,.url="hostname:" + ,.is_connect=1 + ,.rv=1 + } + +, {.name="CONNECT with extra bits" + ,.url="hostname:443/" + ,.is_connect=1 + ,.rv=1 + } +}; + +void +dump_url (const char *url, const struct http_parser_url *u) +{ + char part[512]; + unsigned int i; + + printf("\tfield_set: 0x%x, port: %u\n", u->field_set, u->port); + for (i = 0; i < UF_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + printf("\tfield_data[%u]: unset\n", i); + continue; + } + + memcpy(part, url + u->field_data[i].off, u->field_data[i].len); + part[u->field_data[i].len] = '\0'; + + printf("\tfield_data[%u]: off: %u len: %u part: \"%s\"\n", + i, + u->field_data[i].off, + u->field_data[i].len, + part); + } +} + +void +test_parse_url (void) +{ + struct http_parser_url u; + const struct url_test *test; + unsigned int i; + int rv; + + for (i = 0; i < (sizeof(url_tests) / sizeof(url_tests[0])); i++) { + test = &url_tests[i]; + memset(&u, 0, sizeof(u)); + + rv = http_parser_parse_url(test->url, + strlen(test->url), + test->is_connect, + &u); + + if (test->rv == 0) { + if (rv != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + exit(1); + } + + if (memcmp(&u, &test->u, sizeof(u)) != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" failed ***\n", + test->url, test->name); + + printf("target http_parser_url:\n"); + dump_url(test->url, &test->u); + printf("result http_parser_url:\n"); + dump_url(test->url, &u); + + exit(1); + } + } else { + /* test->rv != 0 */ + if (rv == 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + exit(1); + } + } + } +} + +void +test_message (const struct message *message) +{ + size_t raw_len = strlen(message->raw); + size_t msg1len; + for (msg1len = 0; msg1len < raw_len; msg1len++) { + parser_init(message->type); + + size_t read; + const char *msg1 = message->raw; + const char *msg2 = msg1 + msg1len; + size_t msg2len = raw_len - msg1len; + + if (msg1len) { + read = parse(msg1, msg1len); + + if (message->upgrade && parser->upgrade) { + messages[num_messages - 1].upgrade = msg1 + read; + goto test; + } + + if (read != msg1len) { + print_error(msg1, read); + exit(1); + } + } + + + read = parse(msg2, msg2len); + + if (message->upgrade && parser->upgrade) { + messages[num_messages - 1].upgrade = msg2 + read; + goto test; + } + + if (read != msg2len) { + print_error(msg2, read); + exit(1); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(message->raw, read); + exit(1); + } + + test: + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + exit(1); + } + + if(!message_eq(0, message)) exit(1); + + parser_free(); + } +} + +void +test_message_count_body (const struct message *message) +{ + parser_init(message->type); + + size_t read; + size_t l = strlen(message->raw); + size_t i, toread; + size_t chunk = 4024; + + for (i = 0; i < l; i+= chunk) { + toread = MIN(l-i, chunk); + read = parse_count_body(message->raw + i, toread); + if (read != toread) { + print_error(message->raw, read); + exit(1); + } + } + + + read = parse_count_body(NULL, 0); + if (read != 0) { + print_error(message->raw, read); + exit(1); + } + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + exit(1); + } + + if(!message_eq(0, message)) exit(1); + + parser_free(); +} + +void +test_simple (const char *buf, enum http_errno err_expected) +{ + parser_init(HTTP_REQUEST); + + size_t parsed; + int pass; + enum http_errno err; + + parsed = parse(buf, strlen(buf)); + pass = (parsed == strlen(buf)); + err = HTTP_PARSER_ERRNO(parser); + parsed = parse(NULL, 0); + pass &= (parsed == 0); + + parser_free(); + + /* In strict mode, allow us to pass with an unexpected HPE_STRICT as + * long as the caller isn't expecting success. + */ +#if HTTP_PARSER_STRICT + if (err_expected != err && err_expected != HPE_OK && err != HPE_STRICT) { +#else + if (err_expected != err) { +#endif + fprintf(stderr, "\n*** test_simple expected %s, but saw %s ***\n\n%s\n", + http_errno_name(err_expected), http_errno_name(err), buf); + exit(1); + } +} + +void +test_header_overflow_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? "GET / HTTP/1.1\r\n" : "HTTP/1.0 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "header-key: header-value\r\n"; + size_t buflen = strlen(buf); + + int i; + for (i = 0; i < 10000; i++) { + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + //fprintf(stderr, "error found on iter %d\n", i); + assert(HTTP_PARSER_ERRNO(&parser) == HPE_HEADER_OVERFLOW); + return; + } + } + + fprintf(stderr, "\n*** Error expected but none in header overflow test ***\n"); + exit(1); +} + +static void +test_content_length_overflow (const char *buf, size_t buflen, int expect_ok) +{ + http_parser parser; + http_parser_init(&parser, HTTP_RESPONSE); + http_parser_execute(&parser, &settings_null, buf, buflen); + + if (expect_ok) + assert(HTTP_PARSER_ERRNO(&parser) == HPE_OK); + else + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_CONTENT_LENGTH); +} + +void +test_header_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Content-Length: " #size "\r\n" \ + "\r\n" + const char a[] = X(18446744073709551614); /* 2^64-2 */ + const char b[] = X(18446744073709551615); /* 2^64-1 */ + const char c[] = X(18446744073709551616); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_chunk_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Transfer-Encoding: chunked\r\n" \ + "\r\n" \ + #size "\r\n" \ + "..." + const char a[] = X(FFFFFFFFFFFFFFFE); /* 2^64-2 */ + const char b[] = X(FFFFFFFFFFFFFFFF); /* 2^64-1 */ + const char c[] = X(10000000000000000); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_no_overflow_long_body (int req, size_t length) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + size_t i; + char buf1[3000]; + size_t buf1len = sprintf(buf1, "%s\r\nConnection: Keep-Alive\r\nContent-Length: %zu\r\n\r\n", + req ? "POST / HTTP/1.0" : "HTTP/1.0 200 OK", length); + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) + goto err; + + for (i = 0; i < length; i++) { + char foo = 'a'; + parsed = http_parser_execute(&parser, &settings_null, &foo, 1); + if (parsed != 1) + goto err; + } + + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) goto err; + return; + + err: + fprintf(stderr, + "\n*** error in test_no_overflow_long_body %s of length %zu ***\n", + req ? "REQUEST" : "RESPONSE", + length); + exit(1); +} + +void +test_multiple3 (const struct message *r1, const struct message *r2, const struct message *r3) +{ + int message_count = count_parsed_messages(3, r1, r2, r3); + + char total[ strlen(r1->raw) + + strlen(r2->raw) + + strlen(r3->raw) + + 1 + ]; + total[0] = '\0'; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + parser_init(r1->type); + + size_t read; + + read = parse(total, strlen(total)); + + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + goto test; + } + + if (read != strlen(total)) { + print_error(total, read); + exit(1); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(total, read); + exit(1); + } + +test: + + if (message_count != num_messages) { + fprintf(stderr, "\n\n*** Parser didn't see 3 messages only %d *** \n", num_messages); + exit(1); + } + + if (!message_eq(0, r1)) exit(1); + if (message_count > 1 && !message_eq(1, r2)) exit(1); + if (message_count > 2 && !message_eq(2, r3)) exit(1); + + parser_free(); +} + +/* SCAN through every possible breaking to make sure the + * parser can handle getting the content in any chunks that + * might come from the socket + */ +void +test_scan (const struct message *r1, const struct message *r2, const struct message *r3) +{ + char total[80*1024] = "\0"; + char buf1[80*1024] = "\0"; + char buf2[80*1024] = "\0"; + char buf3[80*1024] = "\0"; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + size_t read; + + int total_len = strlen(total); + + int total_ops = 2 * (total_len - 1) * (total_len - 2) / 2; + int ops = 0 ; + + size_t buf1_len, buf2_len, buf3_len; + int message_count = count_parsed_messages(3, r1, r2, r3); + + int i,j,type_both; + for (type_both = 0; type_both < 2; type_both ++ ) { + for (j = 2; j < total_len; j ++ ) { + for (i = 1; i < j; i ++ ) { + + if (ops % 1000 == 0) { + printf("\b\b\b\b%3.0f%%", 100 * (float)ops /(float)total_ops); + fflush(stdout); + } + ops += 1; + + parser_init(type_both ? HTTP_BOTH : r1->type); + + buf1_len = i; + strncpy(buf1, total, buf1_len); + buf1[buf1_len] = 0; + + buf2_len = j - i; + strncpy(buf2, total+i, buf2_len); + buf2[buf2_len] = 0; + + buf3_len = total_len - j; + strncpy(buf3, total+j, buf3_len); + buf3[buf3_len] = 0; + + read = parse(buf1, buf1_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len) { + print_error(buf1, read); + goto error; + } + + read += parse(buf2, buf2_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len) { + print_error(buf2, read); + goto error; + } + + read += parse(buf3, buf3_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len + buf3_len) { + print_error(buf3, read); + goto error; + } + + parse(NULL, 0); + +test: + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + } + + if (message_count != num_messages) { + fprintf(stderr, "\n\nParser didn't see %d messages only %d\n", + message_count, num_messages); + goto error; + } + + if (!message_eq(0, r1)) { + fprintf(stderr, "\n\nError matching messages[0] in test_scan.\n"); + goto error; + } + + if (message_count > 1 && !message_eq(1, r2)) { + fprintf(stderr, "\n\nError matching messages[1] in test_scan.\n"); + goto error; + } + + if (message_count > 2 && !message_eq(2, r3)) { + fprintf(stderr, "\n\nError matching messages[2] in test_scan.\n"); + goto error; + } + + parser_free(); + } + } + } + puts("\b\b\b\b100%"); + return; + + error: + fprintf(stderr, "i=%d j=%d\n", i, j); + fprintf(stderr, "buf1 (%u) %s\n\n", (unsigned int)buf1_len, buf1); + fprintf(stderr, "buf2 (%u) %s\n\n", (unsigned int)buf2_len , buf2); + fprintf(stderr, "buf3 (%u) %s\n", (unsigned int)buf3_len, buf3); + exit(1); +} + +// user required to free the result +// string terminated by \0 +char * +create_large_chunked_message (int body_size_in_kb, const char* headers) +{ + int i; + size_t wrote = 0; + size_t headers_len = strlen(headers); + size_t bufsize = headers_len + (5+1024+2)*body_size_in_kb + 6; + char * buf = malloc(bufsize); + + memcpy(buf, headers, headers_len); + wrote += headers_len; + + for (i = 0; i < body_size_in_kb; i++) { + // write 1kb chunk into the body. + memcpy(buf + wrote, "400\r\n", 5); + wrote += 5; + memset(buf + wrote, 'C', 1024); + wrote += 1024; + strcpy(buf + wrote, "\r\n"); + wrote += 2; + } + + memcpy(buf + wrote, "0\r\n\r\n", 6); + wrote += 6; + assert(wrote == bufsize); + + return buf; +} + +/* Verify that we can pause parsing at any of the bytes in the + * message and still get the result that we're expecting. */ +void +test_message_pause (const struct message *msg) +{ + char *buf = (char*) msg->raw; + size_t buflen = strlen(msg->raw); + size_t nread; + + parser_init(msg->type); + + do { + nread = parse_pause(buf, buflen); + + // We can only set the upgrade buffer once we've gotten our message + // completion callback. + if (messages[0].message_complete_cb_called && + msg->upgrade && + parser->upgrade) { + messages[0].upgrade = buf + nread; + goto test; + } + + if (nread < buflen) { + + // Not much do to if we failed a strict-mode check + if (HTTP_PARSER_ERRNO(parser) == HPE_STRICT) { + parser_free(); + return; + } + + assert (HTTP_PARSER_ERRNO(parser) == HPE_PAUSED); + } + + buf += nread; + buflen -= nread; + http_parser_pause(parser, 0); + } while (buflen > 0); + + nread = parse_pause(NULL, 0); + assert (nread == 0); + +test: + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); + exit(1); + } + + if(!message_eq(0, msg)) exit(1); + + parser_free(); +} + +int +main (void) +{ + parser = NULL; + int i, j, k; + int request_count; + int response_count; + + printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser)); + + for (request_count = 0; requests[request_count].name; request_count++); + for (response_count = 0; responses[response_count].name; response_count++); + + //// API + test_preserve_data(); + test_parse_url(); + + //// OVERFLOW CONDITIONS + + test_header_overflow_error(HTTP_REQUEST); + test_no_overflow_long_body(HTTP_REQUEST, 1000); + test_no_overflow_long_body(HTTP_REQUEST, 100000); + + test_header_overflow_error(HTTP_RESPONSE); + test_no_overflow_long_body(HTTP_RESPONSE, 1000); + test_no_overflow_long_body(HTTP_RESPONSE, 100000); + + test_header_content_length_overflow_error(); + test_chunk_content_length_overflow_error(); + + //// RESPONSES + + for (i = 0; i < response_count; i++) { + test_message(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + test_message_pause(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + if (!responses[i].should_keep_alive) continue; + for (j = 0; j < response_count; j++) { + if (!responses[j].should_keep_alive) continue; + for (k = 0; k < response_count; k++) { + test_multiple3(&responses[i], &responses[j], &responses[k]); + } + } + } + + test_message_count_body(&responses[NO_HEADERS_NO_BODY_404]); + test_message_count_body(&responses[TRAILING_SPACE_ON_CHUNKED_BODY]); + + // test very large chunked response + { + char * msg = create_large_chunked_message(31337, + "HTTP/1.0 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/plain\r\n" + "\r\n"); + struct message large_chunked = + {.name= "large chunked" + ,.type= HTTP_RESPONSE + ,.raw= msg + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/plain" } + } + ,.body_size= 31337*1024 + }; + test_message_count_body(&large_chunked); + free(msg); + } + + + + printf("response scan 1/2 "); + test_scan( &responses[TRAILING_SPACE_ON_CHUNKED_BODY] + , &responses[NO_BODY_HTTP10_KA_204] + , &responses[NO_REASON_PHRASE] + ); + + printf("response scan 2/2 "); + test_scan( &responses[BONJOUR_MADAME_FR] + , &responses[UNDERSTORE_HEADER_KEY] + , &responses[NO_CARRIAGE_RET] + ); + + puts("responses okay"); + + + /// REQUESTS + + test_simple("hello world", HPE_INVALID_METHOD); + test_simple("GET / HTP/1.1\r\n\r\n", HPE_INVALID_VERSION); + + + test_simple("ASDF / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("PROPPATCHA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + test_simple("GETA / HTTP/1.1\r\n\r\n", HPE_INVALID_METHOD); + + // Well-formed but incomplete + test_simple("GET / HTTP/1.1\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 6\r\n" + "\r\n" + "fooba", + HPE_OK); + + static const char *all_methods[] = { + "DELETE", + "GET", + "HEAD", + "POST", + "PUT", + //"CONNECT", //CONNECT can't be tested like other methods, it's a tunnel + "OPTIONS", + "TRACE", + "COPY", + "LOCK", + "MKCOL", + "MOVE", + "PROPFIND", + "PROPPATCH", + "UNLOCK", + "REPORT", + "MKACTIVITY", + "CHECKOUT", + "MERGE", + "M-SEARCH", + "NOTIFY", + "SUBSCRIBE", + "UNSUBSCRIBE", + "PATCH", + 0 }; + const char **this_method; + for (this_method = all_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_OK); + } + + static const char *bad_methods[] = { + "C******", + "M****", + 0 }; + for (this_method = bad_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_UNKNOWN); + } + + const char *dumbfuck2 = + "GET / HTTP/1.1\r\n" + "X-SSL-Bullshit: -----BEGIN CERTIFICATE-----\r\n" + "\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx\r\n" + "\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT\r\n" + "\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu\r\n" + "\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV\r\n" + "\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV\r\n" + "\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB\r\n" + "\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF\r\n" + "\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR\r\n" + "\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL\r\n" + "\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP\r\n" + "\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR\r\n" + "\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG\r\n" + "\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs\r\n" + "\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD\r\n" + "\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj\r\n" + "\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj\r\n" + "\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG\r\n" + "\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE\r\n" + "\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO\r\n" + "\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1\r\n" + "\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0\r\n" + "\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD\r\n" + "\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv\r\n" + "\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3\r\n" + "\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8\r\n" + "\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk\r\n" + "\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK\r\n" + "\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu\r\n" + "\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3\r\n" + "\tRA==\r\n" + "\t-----END CERTIFICATE-----\r\n" + "\r\n"; + test_simple(dumbfuck2, HPE_OK); + +#if 0 + // NOTE(Wed Nov 18 11:57:27 CET 2009) this seems okay. we just read body + // until EOF. + // + // no content-length + // error if there is a body without content length + const char *bad_get_no_headers_no_body = "GET /bad_get_no_headers_no_body/world HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + "HELLO"; + test_simple(bad_get_no_headers_no_body, 0); +#endif + /* TODO sending junk and large headers gets rejected */ + + + /* check to make sure our predefined requests are okay */ + for (i = 0; requests[i].name; i++) { + test_message(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + test_message_pause(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + if (!requests[i].should_keep_alive) continue; + for (j = 0; j < request_count; j++) { + if (!requests[j].should_keep_alive) continue; + for (k = 0; k < request_count; k++) { + test_multiple3(&requests[i], &requests[j], &requests[k]); + } + } + } + + printf("request scan 1/4 "); + test_scan( &requests[GET_NO_HEADERS_NO_BODY] + , &requests[GET_ONE_HEADER_NO_BODY] + , &requests[GET_NO_HEADERS_NO_BODY] + ); + + printf("request scan 2/4 "); + test_scan( &requests[POST_CHUNKED_ALL_YOUR_BASE] + , &requests[POST_IDENTITY_BODY_WORLD] + , &requests[GET_FUNKY_CONTENT_LENGTH] + ); + + printf("request scan 3/4 "); + test_scan( &requests[TWO_CHUNKS_MULT_ZERO_END] + , &requests[CHUNKED_W_TRAILING_HEADERS] + , &requests[CHUNKED_W_BULLSHIT_AFTER_LENGTH] + ); + + printf("request scan 4/4 "); + test_scan( &requests[QUERY_URL_WITH_QUESTION_MARK_GET] + , &requests[PREFIX_NEWLINE_GET ] + , &requests[CONNECT_REQUEST] + ); + + puts("requests okay"); + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/http_parser.rb.gemspec b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/http_parser.rb.gemspec new file mode 100644 index 000000000000..9a406f8c62a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/http_parser.rb.gemspec @@ -0,0 +1,28 @@ +Gem::Specification.new do |s| + s.name = "http_parser.rb" + s.version = "0.6.0" + s.summary = "Simple callback-based HTTP request/response parser" + s.description = "Ruby bindings to http://github.com/ry/http-parser and http://github.com/a2800276/http-parser.java" + + s.authors = ["Marc-Andre Cournoyer", "Aman Gupta"] + s.email = ["macournoyer@gmail.com", "aman@tmm1.net"] + s.license = 'MIT' + + s.homepage = "http://github.com/tmm1/http_parser.rb" + s.files = `git ls-files`.split("\n") + Dir['ext/ruby_http_parser/vendor/**/*'] + + s.require_paths = ["lib"] + s.extensions = ["ext/ruby_http_parser/extconf.rb"] + + s.add_development_dependency 'rake-compiler', '>= 0.7.9' + s.add_development_dependency 'rspec', '>= 2.0.1' + s.add_development_dependency 'json', '>= 1.4.6' + s.add_development_dependency 'benchmark_suite' + s.add_development_dependency 'ffi' + + if RUBY_PLATFORM =~ /java/ + s.add_development_dependency 'jruby-openssl' + else + s.add_development_dependency 'yajl-ruby', '>= 0.8.1' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/lib/http/parser.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/lib/http/parser.rb new file mode 100644 index 000000000000..4881b031aa00 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/lib/http/parser.rb @@ -0,0 +1 @@ +require 'http_parser' diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/lib/http_parser.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/lib/http_parser.rb new file mode 100644 index 000000000000..c69f7a0bf1d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/lib/http_parser.rb @@ -0,0 +1,21 @@ +$:.unshift File.expand_path('../', __FILE__) +require 'ruby_http_parser' + +Http = HTTP + +module HTTP + class Parser + class << self + attr_reader :default_header_value_type + + def default_header_value_type=(val) + if (val != :mixed && val != :strings && val != :arrays) + raise ArgumentError, "Invalid header value type" + end + @default_header_value_type = val + end + end + end +end + +HTTP::Parser.default_header_value_type = :mixed diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/parser_spec.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/parser_spec.rb new file mode 100644 index 000000000000..7134476bf60b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/parser_spec.rb @@ -0,0 +1,350 @@ +require "spec_helper" +require "json" + +describe HTTP::Parser do + before do + @parser = HTTP::Parser.new + + @headers = nil + @body = "" + @started = false + @done = false + + @parser.on_message_begin = proc{ @started = true } + @parser.on_headers_complete = proc { |e| @headers = e } + @parser.on_body = proc { |chunk| @body << chunk } + @parser.on_message_complete = proc{ @done = true } + end + + it "should have initial state" do + @parser.headers.should be_nil + + @parser.http_version.should be_nil + @parser.http_method.should be_nil + @parser.status_code.should be_nil + + @parser.request_url.should be_nil + + @parser.header_value_type.should == :mixed + end + + it "should allow us to set the header value type" do + [:mixed, :arrays, :strings].each do |type| + @parser.header_value_type = type + @parser.header_value_type.should == type + + parser_tmp = HTTP::Parser.new(nil, type) + parser_tmp.header_value_type.should == type + end + end + + it "should allow us to set the default header value type" do + [:mixed, :arrays, :strings].each do |type| + HTTP::Parser.default_header_value_type = type + + parser = HTTP::Parser.new + parser.header_value_type.should == type + end + end + + it "should throw an Argument Error if header value type is invalid" do + proc{ @parser.header_value_type = 'bob' }.should raise_error(ArgumentError) + end + + it "should throw an Argument Error if default header value type is invalid" do + proc{ HTTP::Parser.default_header_value_type = 'bob' }.should raise_error(ArgumentError) + end + + it "should implement basic api" do + @parser << + "GET /test?ok=1 HTTP/1.1\r\n" + + "User-Agent: curl/7.18.0\r\n" + + "Host: 0.0.0.0:5000\r\n" + + "Accept: */*\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "World" + + @started.should be_true + @done.should be_true + + @parser.http_major.should == 1 + @parser.http_minor.should == 1 + @parser.http_version.should == [1,1] + @parser.http_method.should == 'GET' + @parser.status_code.should be_nil + + @parser.request_url.should == '/test?ok=1' + + @parser.headers.should == @headers + @parser.headers['User-Agent'].should == 'curl/7.18.0' + @parser.headers['Host'].should == '0.0.0.0:5000' + + @body.should == "World" + end + + it "should raise errors on invalid data" do + proc{ @parser << "BLAH" }.should raise_error(HTTP::Parser::Error) + end + + it "should abort parser via callback" do + @parser.on_headers_complete = proc { |e| @headers = e; :stop } + + data = + "GET / HTTP/1.0\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "World" + + bytes = @parser << data + + bytes.should == 37 + data[bytes..-1].should == 'World' + + @headers.should == {'Content-Length' => '5'} + @body.should be_empty + @done.should be_false + end + + it "should reset to initial state" do + @parser << "GET / HTTP/1.0\r\n\r\n" + + @parser.http_method.should == 'GET' + @parser.http_version.should == [1,0] + + @parser.request_url.should == '/' + + @parser.reset!.should be_true + + @parser.http_version.should be_nil + @parser.http_method.should be_nil + @parser.status_code.should be_nil + + @parser.request_url.should be_nil + end + + it "should optionally reset parser state on no-body responses" do + @parser.reset!.should be_true + + @head, @complete = 0, 0 + @parser.on_headers_complete = proc {|h| @head += 1; :reset } + @parser.on_message_complete = proc { @complete += 1 } + @parser.on_body = proc {|b| fail } + + head_response = "HTTP/1.1 200 OK\r\nContent-Length:10\r\n\r\n" + + @parser << head_response + @head.should == 1 + @complete.should == 1 + + @parser << head_response + @head.should == 2 + @complete.should == 2 + end + + it "should retain callbacks after reset" do + @parser.reset!.should be_true + + @parser << "GET / HTTP/1.0\r\n\r\n" + @started.should be_true + @headers.should == {} + @done.should be_true + end + + it "should parse headers incrementally" do + request = + "GET / HTTP/1.0\r\n" + + "Header1: value 1\r\n" + + "Header2: value 2\r\n" + + "\r\n" + + while chunk = request.slice!(0,2) and !chunk.empty? + @parser << chunk + end + + @parser.headers.should == { + 'Header1' => 'value 1', + 'Header2' => 'value 2' + } + end + + it "should handle multiple headers using strings" do + @parser.header_value_type = :strings + + @parser << + "GET / HTTP/1.0\r\n" + + "Set-Cookie: PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com\r\n" + + "Set-Cookie: NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly\r\n" + + "\r\n" + + @parser.headers["Set-Cookie"].should == "PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com, NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly" + end + + it "should handle multiple headers using strings" do + @parser.header_value_type = :arrays + + @parser << + "GET / HTTP/1.0\r\n" + + "Set-Cookie: PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com\r\n" + + "Set-Cookie: NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly\r\n" + + "\r\n" + + @parser.headers["Set-Cookie"].should == [ + "PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com", + "NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly" + ] + end + + it "should handle multiple headers using mixed" do + @parser.header_value_type = :mixed + + @parser << + "GET / HTTP/1.0\r\n" + + "Set-Cookie: PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com\r\n" + + "Set-Cookie: NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly\r\n" + + "\r\n" + + @parser.headers["Set-Cookie"].should == [ + "PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com", + "NID=46jSHxPM; path=/; domain=.bob.com; HttpOnly" + ] + end + + it "should handle a single cookie using mixed" do + @parser.header_value_type = :mixed + + @parser << + "GET / HTTP/1.0\r\n" + + "Set-Cookie: PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com\r\n" + + "\r\n" + + @parser.headers["Set-Cookie"].should == "PREF=ID=a7d2c98; expires=Fri, 05-Apr-2013 05:00:45 GMT; path=/; domain=.bob.com" + end + + it "should support alternative api" do + callbacks = double('callbacks') + callbacks.stub(:on_message_begin){ @started = true } + callbacks.stub(:on_headers_complete){ |e| @headers = e } + callbacks.stub(:on_body){ |chunk| @body << chunk } + callbacks.stub(:on_message_complete){ @done = true } + + @parser = HTTP::Parser.new(callbacks) + @parser << "GET / HTTP/1.0\r\n\r\n" + + @started.should be_true + @headers.should == {} + @body.should == '' + @done.should be_true + end + + it "should ignore extra content beyond specified length" do + @parser << + "GET / HTTP/1.0\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "hello" + + " \n" + + @body.should == 'hello' + @done.should be_true + end + + it 'sets upgrade_data if available' do + @parser << + "GET /demo HTTP/1.1\r\n" + + "Connection: Upgrade\r\n" + + "Upgrade: WebSocket\r\n\r\n" + + "third key data" + + @parser.upgrade?.should be_true + @parser.upgrade_data.should == 'third key data' + end + + it 'sets upgrade_data to blank if un-available' do + @parser << + "GET /demo HTTP/1.1\r\n" + + "Connection: Upgrade\r\n" + + "Upgrade: WebSocket\r\n\r\n" + + @parser.upgrade?.should be_true + @parser.upgrade_data.should == '' + end + + it 'should stop parsing headers when instructed' do + request = "GET /websocket HTTP/1.1\r\n" + + "host: localhost\r\n" + + "connection: Upgrade\r\n" + + "upgrade: websocket\r\n" + + "sec-websocket-key: SD6/hpYbKjQ6Sown7pBbWQ==\r\n" + + "sec-websocket-version: 13\r\n" + + "\r\n" + + @parser.on_headers_complete = proc { |e| :stop } + offset = (@parser << request) + @parser.upgrade?.should be_true + @parser.upgrade_data.should == '' + offset.should == request.length + end + + it "should execute on_body on requests with no content-length" do + @parser.reset!.should be_true + + @head, @complete, @body = 0, 0, 0 + @parser.on_headers_complete = proc {|h| @head += 1 } + @parser.on_message_complete = proc { @complete += 1 } + @parser.on_body = proc {|b| @body += 1 } + + head_response = "HTTP/1.1 200 OK\r\n\r\nstuff" + + @parser << head_response + @parser << '' + @head.should == 1 + @complete.should == 1 + @body.should == 1 + end + + + %w[ request response ].each do |type| + JSON.parse(File.read(File.expand_path("../support/#{type}s.json", __FILE__))).each do |test| + test['headers'] ||= {} + next if !defined?(JRUBY_VERSION) and HTTP::Parser.strict? != test['strict'] + + it "should parse #{type}: #{test['name']}" do + @parser << test['raw'] + + @parser.http_method.should == test['method'] + @parser.keep_alive?.should == test['should_keep_alive'] + + if test.has_key?('upgrade') and test['upgrade'] != 0 + @parser.upgrade?.should be_true + @parser.upgrade_data.should == test['upgrade'] + end + + fields = %w[ + http_major + http_minor + ] + + if test['type'] == 'HTTP_REQUEST' + fields += %w[ + request_url + ] + else + fields += %w[ + status_code + ] + end + + fields.each do |field| + @parser.send(field).should == test[field] + end + + @headers.size.should == test['num_headers'] + @headers.should == test['headers'] + + @body.should == test['body'] + @body.size.should == test['body_size'] if test['body_size'] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/spec_helper.rb new file mode 100644 index 000000000000..a4295f90a779 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/spec_helper.rb @@ -0,0 +1 @@ +require "http_parser" diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/support/requests.json b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/support/requests.json new file mode 100644 index 000000000000..dbb6e984a16f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/support/requests.json @@ -0,0 +1,612 @@ +[ + { + "name": "curl get", + "type": "HTTP_REQUEST", + "raw": "GET /test HTTP/1.1\r\nUser-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\nHost: 0.0.0.0=5000\r\nAccept: */*\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/test", + "request_url": "/test", + "num_headers": 3, + "headers": { + "User-Agent": "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1", + "Host": "0.0.0.0=5000", + "Accept": "*/*" + }, + "body": "", + "strict": true + }, + { + "name": "firefox get", + "type": "HTTP_REQUEST", + "raw": "GET /favicon.ico HTTP/1.1\r\nHost: 0.0.0.0=5000\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/favicon.ico", + "request_url": "/favicon.ico", + "num_headers": 8, + "headers": { + "Host": "0.0.0.0=5000", + "User-Agent": "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-us,en;q=0.5", + "Accept-Encoding": "gzip,deflate", + "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", + "Keep-Alive": "300", + "Connection": "keep-alive" + }, + "body": "", + "strict": true + }, + { + "name": "dumbfuck", + "type": "HTTP_REQUEST", + "raw": "GET /dumbfuck HTTP/1.1\r\naaaaaaaaaaaaa:++++++++++\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/dumbfuck", + "request_url": "/dumbfuck", + "num_headers": 1, + "headers": { + "aaaaaaaaaaaaa": "++++++++++" + }, + "body": "", + "strict": true + }, + { + "name": "fragment in url", + "type": "HTTP_REQUEST", + "raw": "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "page=1", + "fragment": "posts-17408", + "request_path": "/forums/1/topics/2375", + "request_url": "/forums/1/topics/2375?page=1#posts-17408", + "num_headers": 0, + "body": "", + "strict": true + }, + { + "name": "get no headers no body", + "type": "HTTP_REQUEST", + "raw": "GET /get_no_headers_no_body/world HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/get_no_headers_no_body/world", + "request_url": "/get_no_headers_no_body/world", + "num_headers": 0, + "body": "", + "strict": true + }, + { + "name": "get one header no body", + "type": "HTTP_REQUEST", + "raw": "GET /get_one_header_no_body HTTP/1.1\r\nAccept: */*\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/get_one_header_no_body", + "request_url": "/get_one_header_no_body", + "num_headers": 1, + "headers": { + "Accept": "*/*" + }, + "body": "", + "strict": true + }, + { + "name": "get funky content length body hello", + "type": "HTTP_REQUEST", + "raw": "GET /get_funky_content_length_body_hello HTTP/1.0\r\nconTENT-Length: 5\r\n\r\nHELLO", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/get_funky_content_length_body_hello", + "request_url": "/get_funky_content_length_body_hello", + "num_headers": 1, + "headers": { + "conTENT-Length": "5" + }, + "body": "HELLO", + "strict": true + }, + { + "name": "post identity body world", + "type": "HTTP_REQUEST", + "raw": "POST /post_identity_body_world?q=search#hey HTTP/1.1\r\nAccept: */*\r\nTransfer-Encoding: identity\r\nContent-Length: 5\r\n\r\nWorld", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "q=search", + "fragment": "hey", + "request_path": "/post_identity_body_world", + "request_url": "/post_identity_body_world?q=search#hey", + "num_headers": 3, + "headers": { + "Accept": "*/*", + "Transfer-Encoding": "identity", + "Content-Length": "5" + }, + "body": "World", + "strict": true + }, + { + "name": "post - chunked body: all your base are belong to us", + "type": "HTTP_REQUEST", + "raw": "POST /post_chunked_all_your_base HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1e\r\nall your base are belong to us\r\n0\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "", + "fragment": "", + "request_path": "/post_chunked_all_your_base", + "request_url": "/post_chunked_all_your_base", + "num_headers": 1, + "headers": { + "Transfer-Encoding": "chunked" + }, + "body": "all your base are belong to us", + "strict": true + }, + { + "name": "two chunks ; triple zero ending", + "type": "HTTP_REQUEST", + "raw": "POST /two_chunks_mult_zero_end HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n6\r\n world\r\n000\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "", + "fragment": "", + "request_path": "/two_chunks_mult_zero_end", + "request_url": "/two_chunks_mult_zero_end", + "num_headers": 1, + "headers": { + "Transfer-Encoding": "chunked" + }, + "body": "hello world", + "strict": true + }, + { + "name": "chunked with trailing headers. blech.", + "type": "HTTP_REQUEST", + "raw": "POST /chunked_w_trailing_headers HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5\r\nhello\r\n6\r\n world\r\n0\r\nVary: *\r\nContent-Type: text/plain\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "", + "fragment": "", + "request_path": "/chunked_w_trailing_headers", + "request_url": "/chunked_w_trailing_headers", + "num_headers": 3, + "headers": { + "Transfer-Encoding": "chunked", + "Vary": "*", + "Content-Type": "text/plain" + }, + "body": "hello world", + "strict": true + }, + { + "name": "with bullshit after the length", + "type": "HTTP_REQUEST", + "raw": "POST /chunked_w_bullshit_after_length HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n6; blahblah; blah\r\n world\r\n0\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "POST", + "query_string": "", + "fragment": "", + "request_path": "/chunked_w_bullshit_after_length", + "request_url": "/chunked_w_bullshit_after_length", + "num_headers": 1, + "headers": { + "Transfer-Encoding": "chunked" + }, + "body": "hello world", + "strict": true + }, + { + "name": "with quotes", + "type": "HTTP_REQUEST", + "raw": "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "foo=\"bar\"", + "fragment": "", + "request_path": "/with_\"stupid\"_quotes", + "request_url": "/with_\"stupid\"_quotes?foo=\"bar\"", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "apachebench get", + "type": "HTTP_REQUEST", + "raw": "GET /test HTTP/1.0\r\nHost: 0.0.0.0:5000\r\nUser-Agent: ApacheBench/2.3\r\nAccept: */*\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/test", + "request_url": "/test", + "num_headers": 3, + "headers": { + "Host": "0.0.0.0:5000", + "User-Agent": "ApacheBench/2.3", + "Accept": "*/*" + }, + "body": "", + "strict": true + }, + { + "name": "query url with question mark", + "type": "HTTP_REQUEST", + "raw": "GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "foo=bar?baz", + "fragment": "", + "request_path": "/test.cgi", + "request_url": "/test.cgi?foo=bar?baz", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "newline prefix get", + "type": "HTTP_REQUEST", + "raw": "\r\nGET /test HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/test", + "request_url": "/test", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "upgrade request", + "type": "HTTP_REQUEST", + "raw": "GET /demo HTTP/1.1\r\nHost: example.com\r\nConnection: Upgrade\r\nSec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\nSec-WebSocket-Protocol: sample\r\nUpgrade: WebSocket\r\nSec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\nOrigin: http://example.com\r\n\r\nHot diggity dogg", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/demo", + "request_url": "/demo", + "num_headers": 7, + "upgrade": "Hot diggity dogg", + "headers": { + "Host": "example.com", + "Connection": "Upgrade", + "Sec-WebSocket-Key2": "12998 5 Y3 1 .P00", + "Sec-WebSocket-Protocol": "sample", + "Upgrade": "WebSocket", + "Sec-WebSocket-Key1": "4 @1 46546xW%0l 1 5", + "Origin": "http://example.com" + }, + "body": "", + "strict": true + }, + { + "name": "connect request", + "type": "HTTP_REQUEST", + "raw": "CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\nsome data\r\nand yet even more data", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "CONNECT", + "query_string": "", + "fragment": "", + "request_path": "", + "request_url": "0-home0.netscape.com:443", + "num_headers": 2, + "upgrade": "some data\r\nand yet even more data", + "headers": { + "User-agent": "Mozilla/1.1N", + "Proxy-authorization": "basic aGVsbG86d29ybGQ=" + }, + "body": "", + "strict": true + }, + { + "name": "report request", + "type": "HTTP_REQUEST", + "raw": "REPORT /test HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "REPORT", + "query_string": "", + "fragment": "", + "request_path": "/test", + "request_url": "/test", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "request with no http version", + "type": "HTTP_REQUEST", + "raw": "GET /\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 0, + "http_minor": 9, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/", + "request_url": "/", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "m-search request", + "type": "HTTP_REQUEST", + "raw": "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nST: \"ssdp:all\"\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "M-SEARCH", + "query_string": "", + "fragment": "", + "request_path": "*", + "request_url": "*", + "num_headers": 3, + "headers": { + "HOST": "239.255.255.250:1900", + "MAN": "\"ssdp:discover\"", + "ST": "\"ssdp:all\"" + }, + "body": "", + "strict": true + }, + { + "name": "line folding in header value", + "type": "HTTP_REQUEST", + "raw": "GET / HTTP/1.1\r\nLine1: abc\r\n\tdef\r\n ghi\r\n\t\tjkl\r\n mno \r\n\t \tqrs\r\nLine2: \t line2\t\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "/", + "request_url": "/", + "num_headers": 2, + "headers": { + "Line1": "abcdefghijklmno qrs", + "Line2": "line2\t" + }, + "body": "", + "strict": true + }, + { + "name": "host terminated by a query string", + "type": "HTTP_REQUEST", + "raw": "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "hail=all", + "fragment": "", + "request_path": "", + "request_url": "http://hypnotoad.org?hail=all", + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "host:port terminated by a query string", + "type": "HTTP_REQUEST", + "raw": "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "hail=all", + "fragment": "", + "request_path": "", + "request_url": "http://hypnotoad.org:1234?hail=all", + "port": 1234, + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "host:port terminated by a space", + "type": "HTTP_REQUEST", + "raw": "GET http://hypnotoad.org:1234 HTTP/1.1\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "", + "fragment": "", + "request_path": "", + "request_url": "http://hypnotoad.org:1234", + "port": 1234, + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "PATCH request", + "type": "HTTP_REQUEST", + "raw": "PATCH /file.txt HTTP/1.1\r\nHost: www.example.com\r\nContent-Type: application/example\r\nIf-Match: \"e0023aa4e\"\r\nContent-Length: 10\r\n\r\ncccccccccc", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "PATCH", + "query_string": "", + "fragment": "", + "request_path": "/file.txt", + "request_url": "/file.txt", + "num_headers": 4, + "headers": { + "Host": "www.example.com", + "Content-Type": "application/example", + "If-Match": "\"e0023aa4e\"", + "Content-Length": "10" + }, + "body": "cccccccccc", + "strict": true + }, + { + "name": "connect caps request", + "type": "HTTP_REQUEST", + "raw": "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "CONNECT", + "query_string": "", + "fragment": "", + "request_path": "", + "request_url": "HOME0.NETSCAPE.COM:443", + "num_headers": 2, + "upgrade": "", + "headers": { + "User-agent": "Mozilla/1.1N", + "Proxy-authorization": "basic aGVsbG86d29ybGQ=" + }, + "body": "", + "strict": true + }, + { + "name": "utf-8 path request", + "type": "HTTP_REQUEST", + "strict": false, + "raw": "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\nHost: github.com\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "method": "GET", + "query_string": "q=1", + "fragment": "narf", + "request_path": "/δ¶/δt/pope", + "request_url": "/δ¶/δt/pope?q=1#narf", + "num_headers": 1, + "headers": { + "Host": "github.com" + }, + "body": "" + }, + { + "name": "hostname underscore", + "type": "HTTP_REQUEST", + "strict": false, + "raw": "CONNECT home_0.netscape.com:443 HTTP/1.0\r\nUser-agent: Mozilla/1.1N\r\nProxy-authorization: basic aGVsbG86d29ybGQ=\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "method": "CONNECT", + "query_string": "", + "fragment": "", + "request_path": "", + "request_url": "home_0.netscape.com:443", + "num_headers": 2, + "upgrade": "", + "headers": { + "User-agent": "Mozilla/1.1N", + "Proxy-authorization": "basic aGVsbG86d29ybGQ=" + }, + "body": "" + } +] \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/support/responses.json b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/support/responses.json new file mode 100644 index 000000000000..6dde20be304b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/spec/support/responses.json @@ -0,0 +1,375 @@ +[ + { + "name": "google 301", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.google.com/\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Sun, 26 Apr 2009 11:11:49 GMT\r\nExpires: Tue, 26 May 2009 11:11:49 GMT\r\nX-$PrototypeBI-Version: 1.6.0.3\r\nCache-Control: public, max-age=2592000\r\nServer: gws\r\nContent-Length: 219 \r\n\r\n<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.com/\">here</A>.\r\n</BODY></HTML>\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 301, + "num_headers": 8, + "headers": { + "Location": "http://www.google.com/", + "Content-Type": "text/html; charset=UTF-8", + "Date": "Sun, 26 Apr 2009 11:11:49 GMT", + "Expires": "Tue, 26 May 2009 11:11:49 GMT", + "X-$PrototypeBI-Version": "1.6.0.3", + "Cache-Control": "public, max-age=2592000", + "Server": "gws", + "Content-Length": "219 " + }, + "body": "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.com/\">here</A>.\r\n</BODY></HTML>\r\n", + "strict": true + }, + { + "name": "no content-length response", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nDate: Tue, 04 Aug 2009 07:59:32 GMT\r\nServer: Apache\r\nX-Powered-By: Servlet/2.5 JSP/2.1\r\nContent-Type: text/xml; charset=utf-8\r\nConnection: close\r\n\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <SOAP-ENV:Body>\n <SOAP-ENV:Fault>\n <faultcode>SOAP-ENV:Client</faultcode>\n <faultstring>Client Error</faultstring>\n </SOAP-ENV:Fault>\n </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 5, + "headers": { + "Date": "Tue, 04 Aug 2009 07:59:32 GMT", + "Server": "Apache", + "X-Powered-By": "Servlet/2.5 JSP/2.1", + "Content-Type": "text/xml; charset=utf-8", + "Connection": "close" + }, + "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <SOAP-ENV:Body>\n <SOAP-ENV:Fault>\n <faultcode>SOAP-ENV:Client</faultcode>\n <faultstring>Client Error</faultstring>\n </SOAP-ENV:Fault>\n </SOAP-ENV:Body>\n</SOAP-ENV:Envelope>", + "strict": true + }, + { + "name": "404 no headers no body", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 404 Not Found\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 404, + "num_headers": 0, + "headers": { + + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "301 no response phrase", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 301\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 301, + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "200 trailing space on chunked body", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n25 \r\nThis is the data in the first chunk\r\n\r\n1C\r\nand this is the second one\r\n\r\n0 \r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 2, + "headers": { + "Content-Type": "text/plain", + "Transfer-Encoding": "chunked" + }, + "body_size": 65, + "body": "This is the data in the first chunk\r\nand this is the second one\r\n", + "strict": true + }, + { + "name": "no carriage ret", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\nContent-Type: text/html; charset=utf-8\nConnection: close\n\nthese headers are from http://news.ycombinator.com/", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 2, + "headers": { + "Content-Type": "text/html; charset=utf-8", + "Connection": "close" + }, + "body": "these headers are from http://news.ycombinator.com/", + "strict": true + }, + { + "name": "proxy connection", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Length: 11\r\nProxy-Connection: close\r\nDate: Thu, 31 Dec 2009 20:55:48 +0000\r\n\r\nhello world", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 4, + "headers": { + "Content-Type": "text/html; charset=UTF-8", + "Content-Length": "11", + "Proxy-Connection": "close", + "Date": "Thu, 31 Dec 2009 20:55:48 +0000" + }, + "body": "hello world", + "strict": true + }, + { + "name": "underscore header key", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nServer: DCLK-AdSvr\r\nContent-Type: text/xml\r\nContent-Length: 0\r\nDCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 4, + "headers": { + "Server": "DCLK-AdSvr", + "Content-Type": "text/xml", + "Content-Length": "0", + "DCLK_imp": "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" + }, + "body": "", + "strict": true + }, + { + "name": "bonjourmadame.fr", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.0 301 Moved Permanently\r\nDate: Thu, 03 Jun 2010 09:56:32 GMT\r\nServer: Apache/2.2.3 (Red Hat)\r\nCache-Control: public\r\nPragma: \r\nLocation: http://www.bonjourmadame.fr/\r\nVary: Accept-Encoding\r\nContent-Length: 0\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: keep-alive\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "status_code": 301, + "num_headers": 9, + "headers": { + "Date": "Thu, 03 Jun 2010 09:56:32 GMT", + "Server": "Apache/2.2.3 (Red Hat)", + "Cache-Control": "public", + "Pragma": "", + "Location": "http://www.bonjourmadame.fr/", + "Vary": "Accept-Encoding", + "Content-Length": "0", + "Content-Type": "text/html; charset=UTF-8", + "Connection": "keep-alive" + }, + "body": "", + "strict": true + }, + { + "name": "field underscore", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nDate: Tue, 28 Sep 2010 01:14:13 GMT\r\nServer: Apache\r\nCache-Control: no-cache, must-revalidate\r\nExpires: Mon, 26 Jul 1997 05:00:00 GMT\r\n.et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\nVary: Accept-Encoding\r\n_eep-Alive: timeout=45\r\n_onnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n0\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 11, + "headers": { + "Date": "Tue, 28 Sep 2010 01:14:13 GMT", + "Server": "Apache", + "Cache-Control": "no-cache, must-revalidate", + "Expires": "Mon, 26 Jul 1997 05:00:00 GMT", + ".et-Cookie": "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com", + "Vary": "Accept-Encoding", + "_eep-Alive": "timeout=45", + "_onnection": "Keep-Alive", + "Transfer-Encoding": "chunked", + "Content-Type": "text/html", + "Connection": "close" + }, + "body": "", + "strict": true + }, + { + "name": "non-ASCII in status line", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 500 Oriëntatieprobleem\r\nDate: Fri, 5 Nov 2010 23:07:12 GMT+2\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 500, + "num_headers": 3, + "headers": { + "Date": "Fri, 5 Nov 2010 23:07:12 GMT+2", + "Content-Length": "0", + "Connection": "close" + }, + "body": "", + "strict": true + }, + { + "name": "http version 0.9", + "type": "HTTP_RESPONSE", + "raw": "HTTP/0.9 200 OK\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 0, + "http_minor": 9, + "status_code": 200, + "num_headers": 0, + "headers": { + + }, + "body": "", + "strict": true + }, + { + "name": "neither content-length nor transfer-encoding response", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello world", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 1, + "headers": { + "Content-Type": "text/plain" + }, + "body": "hello world", + "strict": true + }, + { + "name": "HTTP/1.0 with keep-alive and EOF-terminated 200 status", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.0 200 OK\r\nConnection: keep-alive\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 0, + "status_code": 200, + "num_headers": 1, + "headers": { + "Connection": "keep-alive" + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.0 with keep-alive and a 204 status", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.0 204 No content\r\nConnection: keep-alive\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 0, + "status_code": 204, + "num_headers": 1, + "headers": { + "Connection": "keep-alive" + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.1 with an EOF-terminated 200 status", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": true, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 0, + "headers": { + + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.1 with a 204 status", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 204 No content\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 204, + "num_headers": 0, + "headers": { + + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.1 with a 204 status and keep-alive disabled", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 204 No content\r\nConnection: close\r\n\r\n", + "should_keep_alive": false, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 204, + "num_headers": 1, + "headers": { + "Connection": "close" + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "HTTP/1.1 with chunked endocing and a 200 response", + "type": "HTTP_RESPONSE", + "raw": "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 1, + "headers": { + "Transfer-Encoding": "chunked" + }, + "body_size": 0, + "body": "", + "strict": true + }, + { + "name": "field space", + "type": "HTTP_RESPONSE", + "strict": false, + "raw": "HTTP/1.1 200 OK\r\nServer: Microsoft-IIS/6.0\r\nX-Powered-By: ASP.NET\r\nen-US Content-Type: text/xml\r\nContent-Type: text/xml\r\nContent-Length: 16\r\nDate: Fri, 23 Jul 2010 18:45:38 GMT\r\nConnection: keep-alive\r\n\r\n<xml>hello</xml>", + "should_keep_alive": true, + "message_complete_on_eof": false, + "http_major": 1, + "http_minor": 1, + "status_code": 200, + "num_headers": 7, + "headers": { + "Server": "Microsoft-IIS/6.0", + "X-Powered-By": "ASP.NET", + "en-US Content-Type": "text/xml", + "Content-Type": "text/xml", + "Content-Length": "16", + "Date": "Fri, 23 Jul 2010 18:45:38 GMT", + "Connection": "keep-alive" + }, + "body": "<xml>hello</xml>" + } +] \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/compile.rake b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/compile.rake new file mode 100644 index 000000000000..22d6f6d5ced0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/compile.rake @@ -0,0 +1,42 @@ +require 'rubygems/package_task' +require 'rake/extensiontask' +require 'rake/javaextensiontask' + +def gemspec + @clean_gemspec ||= eval(File.read(File.expand_path('../../http_parser.rb.gemspec', __FILE__))) +end + +Gem::PackageTask.new(gemspec) do |pkg| +end + +if RUBY_PLATFORM =~ /java/ + Rake::JavaExtensionTask.new("ruby_http_parser", gemspec) do |ext| + ext.classpath = File.expand_path('../../ext/ruby_http_parser/vendor/http-parser-java/ext/primitives.jar', __FILE__) + end +else + Rake::ExtensionTask.new("ruby_http_parser", gemspec) do |ext| + unless RUBY_PLATFORM =~ /mswin|mingw/ + ext.cross_compile = true + ext.cross_platform = ['x86-mingw32', 'x86-mswin32-60'] + + # inject 1.8/1.9 pure-ruby entry point + ext.cross_compiling do |spec| + spec.files += ['lib/ruby_http_parser.rb'] + end + end + end +end + +file 'lib/ruby_http_parser.rb' do |t| + File.open(t.name, 'wb') do |f| + f.write <<-eoruby +RUBY_VERSION =~ /(\\d+.\\d+)/ +require "\#{$1}/ruby_http_parser" + eoruby + end + at_exit{ FileUtils.rm t.name if File.exists?(t.name) } +end + +if Rake::Task.task_defined?(:cross) + task :cross => 'lib/ruby_http_parser.rb' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/fixtures.rake b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/fixtures.rake new file mode 100644 index 000000000000..b5d36ef81cc1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/fixtures.rake @@ -0,0 +1,71 @@ +desc "Generate test fixtures" +task :fixtures => :submodules do + require 'yajl' + data = File.read File.expand_path('../../ext/ruby_http_parser/vendor/http-parser/test.c', __FILE__) + + %w[ requests responses ].each do |type| + # find test definitions in between requests/responses[]= and .name=NULL + tmp = data[/#{type}\[\]\s*=(.+?),\s*\{\s*\.name=\s*NULL/m, 1] + + # replace first { with a [ (parsing an array of test cases) + tmp.sub!('{','[') + + # replace booleans + tmp.gsub!('TRUE', 'true') + tmp.gsub!('FALSE', 'false') + + # mark strict mode tests + tmp.gsub!(%r|#if\s+!HTTP_PARSER_STRICT(.+?)#endif\s*/\*\s*!HTTP_PARSER_STRICT.+\n|m){ + $1.gsub(/^(.+,\.type= .+)$/, "\\1\n, .strict= false") + } + + # remove macros and comments + tmp.gsub!(/^#(if|elif|endif|define).+$/,'') + tmp.gsub!(/\/\*(.+?)\*\/$/,'') + + # HTTP_* enums become strings + tmp.gsub!(/(= )(HTTP_\w+)/){ + "#{$1}#{$2.sub('MSEARCH','M-SEARCH').dump}" + } + + # join multiline strings for body and raw data + tmp.gsub!(/((body|raw)\s*=)(.+?)(\n\s+[\},])/m){ + before, after = $1, $4 + raw = $3.split("\n").map{ |l| l.strip[1..-2] }.join('') + "#{before} \"#{raw}\" #{after}" + } + + # make headers an array of array tuples + tmp.gsub!(/(\.headers\s*=)(.+?)(\s*,\.)/m){ + before, after = $1, $3 + raw = $2.gsub('{', '[').gsub('}', ']') + "#{before} #{raw} #{after}" + } + + # .name= becomes "name": + tmp.gsub!(/^(.{2,5})\.(\w+)\s*=/){ + "#{$1}#{$2.dump}: " + } + + # evaluate addition expressions + tmp.gsub!(/(body_size\":\s*)(\d+)\+(\d+)/){ + "#{$1}#{$2.to_i+$3.to_i}" + } + + # end result array + tmp << ']' + + # normalize data + results = Yajl.load(tmp, :symbolize_keys => true) + results.map{ |res| + res[:headers] and res[:headers] = Hash[*res[:headers].flatten] + res[:method] and res[:method].gsub!(/^HTTP_/, '') + res[:strict] = true unless res.has_key?(:strict) + } + + # write to a file + File.open("spec/support/#{type}.json", 'w'){ |f| + f.write Yajl.dump(results, :pretty => true) + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/spec.rake b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/spec.rake new file mode 100644 index 000000000000..8f5d9ea06ea8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/spec.rake @@ -0,0 +1,5 @@ +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new do |t| + t.rspec_opts = %w(-fs -c) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/submodules.rake b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/submodules.rake new file mode 100644 index 000000000000..d978e9ff0ded --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/http_parser.rb-0.6.0/tasks/submodules.rake @@ -0,0 +1,7 @@ +desc "Fetch upstream submodules" +task :submodules do + if Dir['ext/ruby_http_parser/vendor/http-parser/*'].empty? + sh 'git submodule init' + sh 'git submodule update' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/MIT-LICENSE b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/MIT-LICENSE new file mode 100644 index 000000000000..ed8e9ee66db8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2008 The Ruby I18n team + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/README.md b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/README.md new file mode 100644 index 000000000000..12b8ada1cf90 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/README.md @@ -0,0 +1,84 @@ +# Ruby I18n + +[![Build Status](https://api.travis-ci.org/svenfuchs/i18n.svg?branch=master)](https://travis-ci.org/svenfuchs/i18n) + +Ruby Internationalization and localization solution. + +[See the Rails Guide](http://guides.rubyonrails.org/i18n.html) for an example of its usage. (Note: This library can be used independently from Rails.) + +Features: + +* translation and localization +* interpolation of values to translations (Ruby 1.9 compatible syntax) +* pluralization (CLDR compatible) +* customizable transliteration to ASCII +* flexible defaults +* bulk lookup +* lambdas as translation data +* custom key/scope separator +* custom exception handlers +* extensible architecture with a swappable backend + +Pluggable features: + +* Cache +* Pluralization: lambda pluralizers stored as translation data +* Locale fallbacks, RFC4647 compliant (optionally: RFC4646 locale validation) +* [Gettext support](https://github.com/svenfuchs/i18n/wiki/Gettext) +* Translation metadata + +Alternative backends: + +* Chain +* ActiveRecord (optionally: ActiveRecord::Missing and ActiveRecord::StoreProcs) +* KeyValue (uses active_support/json and cannot store procs) + +For more information and lots of resources see [the 'Resources' page on the wiki](https://github.com/svenfuchs/i18n/wiki/Resources). + +## Installation + +``` +gem install i18n +``` + +## Tests + +You can run tests both with + +* `rake test` or just `rake` +* run any test file directly, e.g. `ruby -Ilib:test test/api/simple_test.rb` + +You can run all tests against all Gemfiles with + +* `ruby test/run_all.rb` + +The structure of the test suite is a bit unusual as it uses modules to reuse +particular tests in different test cases. + +The reason for this is that we need to enforce the I18n API across various +combinations of extensions. E.g. the Simple backend alone needs to support +the same API as any combination of feature and/or optimization modules included +to the Simple backend. We test this by reusing the same API defition (implemented +as test methods) in test cases with different setups. + +You can find the test cases that enforce the API in test/api. And you can find +the API definition test methods in test/api/tests. + +All other test cases (e.g. as defined in test/backend, test/core_ext) etc. +follow the usual test setup and should be easy to grok. + +## Authors + +* [Sven Fuchs](http://www.artweb-design.de) +* [Joshua Harvey](http://www.workingwithrails.com/person/759-joshua-harvey) +* [Stephan Soller](http://www.arkanis-development.de) +* [Saimon Moore](http://saimonmoore.net) +* [Matt Aimonetti](https://matt.aimonetti.net/) + +## Contributors + +https://github.com/svenfuchs/i18n/graphs/contributors + +## License + +MIT License. See the included MIT-LICENSE file. diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-3.2.x b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-3.2.x new file mode 100644 index 000000000000..071554fb35d1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-3.2.x @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 3.2.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' +gem 'oj' diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-4.0.x b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-4.0.x new file mode 100644 index 000000000000..cc527e7740c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-4.0.x @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 4.0.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' +gem 'oj' diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-4.1.x b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-4.1.x new file mode 100644 index 000000000000..682685530e77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-4.1.x @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 4.1.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' +gem 'oj' diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-4.2.x b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-4.2.x new file mode 100644 index 000000000000..68b886c3de13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-4.2.x @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 4.2.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' +gem 'oj' diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-5.0.x b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-5.0.x new file mode 100644 index 000000000000..1634537764a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-5.0.x @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 5.0.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' +gem 'oj' diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-5.1.x b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-5.1.x new file mode 100644 index 000000000000..d8fc5685a05b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-5.1.x @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', '~> 5.1.0' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' +gem 'oj' diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-master b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-master new file mode 100644 index 000000000000..b0ae1ce96a5f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/gemfiles/Gemfile.rails-master @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gemspec :path => '..' + +gem 'activesupport', github: 'rails/rails', branch: 'master' +gem 'mocha' +gem 'test_declarative' +gem 'rake' +gem 'minitest' +gem 'oj' diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n.rb new file mode 100644 index 000000000000..cf44ce3c89fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n.rb @@ -0,0 +1,356 @@ +require 'concurrent/map' + +require 'i18n/version' +require 'i18n/exceptions' +require 'i18n/interpolate/ruby' + +module I18n + autoload :Backend, 'i18n/backend' + autoload :Config, 'i18n/config' + autoload :Gettext, 'i18n/gettext' + autoload :Locale, 'i18n/locale' + autoload :Tests, 'i18n/tests' + autoload :Middleware, 'i18n/middleware' + + RESERVED_KEYS = [:scope, :default, :separator, :resolve, :object, :fallback, :fallback_in_progress, :format, :cascade, :throw, :raise, :deep_interpolation] + RESERVED_KEYS_PATTERN = /%\{(#{RESERVED_KEYS.join("|")})\}/ + + + def self.new_double_nested_cache # :nodoc: + Concurrent::Map.new { |h,k| h[k] = Concurrent::Map.new } + end + + module Base + # Gets I18n configuration object. + def config + Thread.current[:i18n_config] ||= I18n::Config.new + end + + # Sets I18n configuration object. + def config=(value) + Thread.current[:i18n_config] = value + end + + # Write methods which delegates to the configuration object + %w(locale backend default_locale available_locales default_separator + exception_handler load_path enforce_available_locales).each do |method| + module_eval <<-DELEGATORS, __FILE__, __LINE__ + 1 + def #{method} + config.#{method} + end + + def #{method}=(value) + config.#{method} = (value) + end + DELEGATORS + end + + # Tells the backend to reload translations. Used in situations like the + # Rails development environment. Backends can implement whatever strategy + # is useful. + def reload! + config.clear_available_locales_set + config.backend.reload! + end + + # Translates, pluralizes and interpolates a given key using a given locale, + # scope, and default, as well as interpolation values. + # + # *LOOKUP* + # + # Translation data is organized as a nested hash using the upper-level keys + # as namespaces. <em>E.g.</em>, ActionView ships with the translation: + # <tt>:date => {:formats => {:short => "%b %d"}}</tt>. + # + # Translations can be looked up at any level of this hash using the key argument + # and the scope option. <em>E.g.</em>, in this example <tt>I18n.t :date</tt> + # returns the whole translations hash <tt>{:formats => {:short => "%b %d"}}</tt>. + # + # Key can be either a single key or a dot-separated key (both Strings and Symbols + # work). <em>E.g.</em>, the short format can be looked up using both: + # I18n.t 'date.formats.short' + # I18n.t :'date.formats.short' + # + # Scope can be either a single key, a dot-separated key or an array of keys + # or dot-separated keys. Keys and scopes can be combined freely. So these + # examples will all look up the same short date format: + # I18n.t 'date.formats.short' + # I18n.t 'formats.short', :scope => 'date' + # I18n.t 'short', :scope => 'date.formats' + # I18n.t 'short', :scope => %w(date formats) + # + # *INTERPOLATION* + # + # Translations can contain interpolation variables which will be replaced by + # values passed to #translate as part of the options hash, with the keys matching + # the interpolation variable names. + # + # <em>E.g.</em>, with a translation <tt>:foo => "foo %{bar}"</tt> the option + # value for the key +bar+ will be interpolated into the translation: + # I18n.t :foo, :bar => 'baz' # => 'foo baz' + # + # *PLURALIZATION* + # + # Translation data can contain pluralized translations. Pluralized translations + # are arrays of singluar/plural versions of translations like <tt>['Foo', 'Foos']</tt>. + # + # Note that <tt>I18n::Backend::Simple</tt> only supports an algorithm for English + # pluralization rules. Other algorithms can be supported by custom backends. + # + # This returns the singular version of a pluralized translation: + # I18n.t :foo, :count => 1 # => 'Foo' + # + # These both return the plural version of a pluralized translation: + # I18n.t :foo, :count => 0 # => 'Foos' + # I18n.t :foo, :count => 2 # => 'Foos' + # + # The <tt>:count</tt> option can be used both for pluralization and interpolation. + # <em>E.g.</em>, with the translation + # <tt>:foo => ['%{count} foo', '%{count} foos']</tt>, count will + # be interpolated to the pluralized translation: + # I18n.t :foo, :count => 1 # => '1 foo' + # + # *DEFAULTS* + # + # This returns the translation for <tt>:foo</tt> or <tt>default</tt> if no translation was found: + # I18n.t :foo, :default => 'default' + # + # This returns the translation for <tt>:foo</tt> or the translation for <tt>:bar</tt> if no + # translation for <tt>:foo</tt> was found: + # I18n.t :foo, :default => :bar + # + # Returns the translation for <tt>:foo</tt> or the translation for <tt>:bar</tt> + # or <tt>default</tt> if no translations for <tt>:foo</tt> and <tt>:bar</tt> were found. + # I18n.t :foo, :default => [:bar, 'default'] + # + # *BULK LOOKUP* + # + # This returns an array with the translations for <tt>:foo</tt> and <tt>:bar</tt>. + # I18n.t [:foo, :bar] + # + # Can be used with dot-separated nested keys: + # I18n.t [:'baz.foo', :'baz.bar'] + # + # Which is the same as using a scope option: + # I18n.t [:foo, :bar], :scope => :baz + # + # *LAMBDAS* + # + # Both translations and defaults can be given as Ruby lambdas. Lambdas will be + # called and passed the key and options. + # + # E.g. assuming the key <tt>:salutation</tt> resolves to: + # lambda { |key, options| options[:gender] == 'm' ? "Mr. #{options[:name]}" : "Mrs. #{options[:name]}" } + # + # Then <tt>I18n.t(:salutation, :gender => 'w', :name => 'Smith') will result in "Mrs. Smith". + # + # Note that the string returned by lambda will go through string interpolation too, + # so the following lambda would give the same result: + # lambda { |key, options| options[:gender] == 'm' ? "Mr. %{name}" : "Mrs. %{name}" } + # + # It is recommended to use/implement lambdas in an "idempotent" way. E.g. when + # a cache layer is put in front of I18n.translate it will generate a cache key + # from the argument values passed to #translate. Therefor your lambdas should + # always return the same translations/values per unique combination of argument + # values. + def translate(*args) + options = args.last.is_a?(Hash) ? args.pop.dup : {} + key = args.shift + backend = config.backend + locale = options.delete(:locale) || config.locale + handling = options.delete(:throw) && :throw || options.delete(:raise) && :raise # TODO deprecate :raise + + enforce_available_locales!(locale) + + result = catch(:exception) do + if key.is_a?(Array) + key.map { |k| backend.translate(locale, k, options) } + else + backend.translate(locale, key, options) + end + end + result.is_a?(MissingTranslation) ? handle_exception(handling, result, locale, key, options) : result + end + alias :t :translate + + # Wrapper for <tt>translate</tt> that adds <tt>:raise => true</tt>. With + # this option, if no translation is found, it will raise <tt>I18n::MissingTranslationData</tt> + def translate!(key, options={}) + translate(key, options.merge(:raise => true)) + end + alias :t! :translate! + + # Returns true if a translation exists for a given key, otherwise returns false. + def exists?(key, locale = config.locale) + raise I18n::ArgumentError if key.is_a?(String) && key.empty? + config.backend.exists?(locale, key) + end + + # Transliterates UTF-8 characters to ASCII. By default this method will + # transliterate only Latin strings to an ASCII approximation: + # + # I18n.transliterate("Ærøskøbing") + # # => "AEroskobing" + # + # I18n.transliterate("日本語") + # # => "???" + # + # It's also possible to add support for per-locale transliterations. I18n + # expects transliteration rules to be stored at + # <tt>i18n.transliterate.rule</tt>. + # + # Transliteration rules can either be a Hash or a Proc. Procs must accept a + # single string argument. Hash rules inherit the default transliteration + # rules, while Procs do not. + # + # *Examples* + # + # Setting a Hash in <locale>.yml: + # + # i18n: + # transliterate: + # rule: + # ü: "ue" + # ö: "oe" + # + # Setting a Hash using Ruby: + # + # store_translations(:de, :i18n => { + # :transliterate => { + # :rule => { + # "ü" => "ue", + # "ö" => "oe" + # } + # } + # ) + # + # Setting a Proc: + # + # translit = lambda {|string| MyTransliterator.transliterate(string) } + # store_translations(:xx, :i18n => {:transliterate => {:rule => translit}) + # + # Transliterating strings: + # + # I18n.locale = :en + # I18n.transliterate("Jürgen") # => "Jurgen" + # I18n.locale = :de + # I18n.transliterate("Jürgen") # => "Juergen" + # I18n.transliterate("Jürgen", :locale => :en) # => "Jurgen" + # I18n.transliterate("Jürgen", :locale => :de) # => "Juergen" + def transliterate(*args) + options = args.pop.dup if args.last.is_a?(Hash) + key = args.shift + locale = options && options.delete(:locale) || config.locale + handling = options && (options.delete(:throw) && :throw || options.delete(:raise) && :raise) + replacement = options && options.delete(:replacement) + enforce_available_locales!(locale) + config.backend.transliterate(locale, key, replacement) + rescue I18n::ArgumentError => exception + handle_exception(handling, exception, locale, key, options || {}) + end + + # Localizes certain objects, such as dates and numbers to local formatting. + def localize(object, options = nil) + options = options ? options.dup : {} + locale = options.delete(:locale) || config.locale + format = options.delete(:format) || :default + enforce_available_locales!(locale) + config.backend.localize(locale, object, format, options) + end + alias :l :localize + + # Executes block with given I18n.locale set. + def with_locale(tmp_locale = nil) + if tmp_locale + current_locale = self.locale + self.locale = tmp_locale + end + yield + ensure + self.locale = current_locale if tmp_locale + end + + # Merges the given locale, key and scope into a single array of keys. + # Splits keys that contain dots into multiple keys. Makes sure all + # keys are Symbols. + def normalize_keys(locale, key, scope, separator = nil) + separator ||= I18n.default_separator + + keys = [] + keys.concat normalize_key(locale, separator) + keys.concat normalize_key(scope, separator) + keys.concat normalize_key(key, separator) + keys + end + + # Returns true when the passed locale, which can be either a String or a + # Symbol, is in the list of available locales. Returns false otherwise. + def locale_available?(locale) + I18n.config.available_locales_set.include?(locale) + end + + # Raises an InvalidLocale exception when the passed locale is not available. + def enforce_available_locales!(locale) + if config.enforce_available_locales + raise I18n::InvalidLocale.new(locale) if !locale_available?(locale) + end + end + + def available_locales_initialized? + config.available_locales_initialized? + end + + private + + # Any exceptions thrown in translate will be sent to the @@exception_handler + # which can be a Symbol, a Proc or any other Object unless they're forced to + # be raised or thrown (MissingTranslation). + # + # If exception_handler is a Symbol then it will simply be sent to I18n as + # a method call. A Proc will simply be called. In any other case the + # method #call will be called on the exception_handler object. + # + # Examples: + # + # I18n.exception_handler = :custom_exception_handler # this is the default + # I18n.custom_exception_handler(exception, locale, key, options) # will be called like this + # + # I18n.exception_handler = lambda { |*args| ... } # a lambda + # I18n.exception_handler.call(exception, locale, key, options) # will be called like this + # + # I18n.exception_handler = I18nExceptionHandler.new # an object + # I18n.exception_handler.call(exception, locale, key, options) # will be called like this + def handle_exception(handling, exception, locale, key, options) + case handling + when :raise + raise exception.respond_to?(:to_exception) ? exception.to_exception : exception + when :throw + throw :exception, exception + else + case handler = options[:exception_handler] || config.exception_handler + when Symbol + send(handler, exception, locale, key, options) + else + handler.call(exception, locale, key, options) + end + end + end + + @@normalized_key_cache = I18n.new_double_nested_cache + + def normalize_key(key, separator) + @@normalized_key_cache[separator][key] ||= + case key + when Array + key.map { |k| normalize_key(k, separator) }.flatten + else + keys = key.to_s.split(separator) + keys.delete('') + keys.map! { |k| k.to_sym } + keys + end + end + end + + extend Base +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend.rb new file mode 100644 index 000000000000..46ef054bfce1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend.rb @@ -0,0 +1,18 @@ +module I18n + module Backend + autoload :Base, 'i18n/backend/base' + autoload :InterpolationCompiler, 'i18n/backend/interpolation_compiler' + autoload :Cache, 'i18n/backend/cache' + autoload :Cascade, 'i18n/backend/cascade' + autoload :Chain, 'i18n/backend/chain' + autoload :Fallbacks, 'i18n/backend/fallbacks' + autoload :Flatten, 'i18n/backend/flatten' + autoload :Gettext, 'i18n/backend/gettext' + autoload :KeyValue, 'i18n/backend/key_value' + autoload :Memoize, 'i18n/backend/memoize' + autoload :Metadata, 'i18n/backend/metadata' + autoload :Pluralization, 'i18n/backend/pluralization' + autoload :Simple, 'i18n/backend/simple' + autoload :Transliterator, 'i18n/backend/transliterator' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/base.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/base.rb new file mode 100644 index 000000000000..a73a3ae03c24 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/base.rb @@ -0,0 +1,255 @@ +require 'yaml' +require 'i18n/core_ext/hash' +require 'i18n/core_ext/kernel/suppress_warnings' + +module I18n + module Backend + module Base + include I18n::Backend::Transliterator + + # Accepts a list of paths to translation files. Loads translations from + # plain Ruby (*.rb) or YAML files (*.yml). See #load_rb and #load_yml + # for details. + def load_translations(*filenames) + filenames = I18n.load_path if filenames.empty? + filenames.flatten.each { |filename| load_file(filename) } + end + + # This method receives a locale, a data hash and options for storing translations. + # Should be implemented + def store_translations(locale, data, options = {}) + raise NotImplementedError + end + + def translate(locale, key, options = {}) + raise I18n::ArgumentError if (key.is_a?(String) || key.is_a?(Symbol)) && key.empty? + raise InvalidLocale.new(locale) unless locale + return nil if key.nil? && !options.key?(:default) + + entry = lookup(locale, key, options[:scope], options) unless key.nil? + + if entry.nil? && options.key?(:default) + entry = default(locale, key, options[:default], options) + else + entry = resolve(locale, key, entry, options) + end + + count = options[:count] + + if entry.nil? && (subtrees? || !count) + if (options.key?(:default) && !options[:default].nil?) || !options.key?(:default) + throw(:exception, I18n::MissingTranslation.new(locale, key, options)) + end + end + + entry = entry.dup if entry.is_a?(String) + entry = pluralize(locale, entry, count) if count + + if entry.nil? && !subtrees? + throw(:exception, I18n::MissingTranslation.new(locale, key, options)) + end + + deep_interpolation = options[:deep_interpolation] + values = options.except(*RESERVED_KEYS) + if values + entry = if deep_interpolation + deep_interpolate(locale, entry, values) + else + interpolate(locale, entry, values) + end + end + entry + end + + def exists?(locale, key) + lookup(locale, key) != nil + end + + # Acts the same as +strftime+, but uses a localized version of the + # format string. Takes a key from the date/time formats translations as + # a format argument (<em>e.g.</em>, <tt>:short</tt> in <tt>:'date.formats'</tt>). + def localize(locale, object, format = :default, options = {}) + if object.nil? && options.include?(:default) + return options[:default] + end + raise ArgumentError, "Object must be a Date, DateTime or Time object. #{object.inspect} given." unless object.respond_to?(:strftime) + + if Symbol === format + key = format + type = object.respond_to?(:sec) ? 'time' : 'date' + options = options.merge(:raise => true, :object => object, :locale => locale) + format = I18n.t(:"#{type}.formats.#{key}", options) + end + + format = translate_localization_format(locale, object, format, options) + object.strftime(format) + end + + # Returns an array of locales for which translations are available + # ignoring the reserved translation meta data key :i18n. + def available_locales + raise NotImplementedError + end + + def reload! + end + + protected + + # The method which actually looks up for the translation in the store. + def lookup(locale, key, scope = [], options = {}) + raise NotImplementedError + end + + def subtrees? + true + end + + # Evaluates defaults. + # If given subject is an Array, it walks the array and returns the + # first translation that can be resolved. Otherwise it tries to resolve + # the translation directly. + def default(locale, object, subject, options = {}) + options = options.dup.reject { |key, value| key == :default } + case subject + when Array + subject.each do |item| + result = resolve(locale, object, item, options) + return result unless result.nil? + end and nil + else + resolve(locale, object, subject, options) + end + end + + # Resolves a translation. + # If the given subject is a Symbol, it will be translated with the + # given options. If it is a Proc then it will be evaluated. All other + # subjects will be returned directly. + def resolve(locale, object, subject, options = {}) + return subject if options[:resolve] == false + result = catch(:exception) do + case subject + when Symbol + I18n.translate(subject, options.merge(:locale => locale, :throw => true)) + when Proc + date_or_time = options.delete(:object) || object + resolve(locale, object, subject.call(date_or_time, options)) + else + subject + end + end + result unless result.is_a?(MissingTranslation) + end + + # Picks a translation from a pluralized mnemonic subkey according to English + # pluralization rules : + # - It will pick the :one subkey if count is equal to 1. + # - It will pick the :other subkey otherwise. + # - It will pick the :zero subkey in the special case where count is + # equal to 0 and there is a :zero subkey present. This behaviour is + # not standard with regards to the CLDR pluralization rules. + # Other backends can implement more flexible or complex pluralization rules. + def pluralize(locale, entry, count) + return entry unless entry.is_a?(Hash) && count + + key = pluralization_key(entry, count) + raise InvalidPluralizationData.new(entry, count, key) unless entry.has_key?(key) + entry[key] + end + + # Interpolates values into a given subject. + # + # if the given subject is a string then: + # method interpolates "file %{file} opened by %%{user}", :file => 'test.txt', :user => 'Mr. X' + # # => "file test.txt opened by %{user}" + # + # if the given subject is an array then: + # each element of the array is recursively interpolated (until it finds a string) + # method interpolates ["yes, %{user}", ["maybe no, %{user}, "no, %{user}"]], :user => "bartuz" + # # => "["yes, bartuz",["maybe no, bartuz", "no, bartuz"]]" + def interpolate(locale, subject, values = {}) + return subject if values.empty? + + case subject + when ::String then I18n.interpolate(subject, values) + when ::Array then subject.map { |element| interpolate(locale, element, values) } + else + subject + end + end + + # Deep interpolation + # + # deep_interpolate { people: { ann: "Ann is %{ann}", john: "John is %{john}" } }, + # ann: 'good', john: 'big' + # #=> { people: { ann: "Ann is good", john: "John is big" } } + def deep_interpolate(locale, data, values = {}) + return data if values.empty? + + case data + when ::String + I18n.interpolate(data, values) + when ::Hash + data.each_with_object({}) do |(k, v), result| + result[k] = deep_interpolate(locale, v, values) + end + when ::Array + data.map do |v| + deep_interpolate(locale, v, values) + end + else + data + end + end + + # Loads a single translations file by delegating to #load_rb or + # #load_yml depending on the file extension and directly merges the + # data to the existing translations. Raises I18n::UnknownFileType + # for all other file extensions. + def load_file(filename) + type = File.extname(filename).tr('.', '').downcase + raise UnknownFileType.new(type, filename) unless respond_to?(:"load_#{type}", true) + data = send(:"load_#{type}", filename) + unless data.is_a?(Hash) + raise InvalidLocaleData.new(filename, 'expects it to return a hash, but does not') + end + data.each { |locale, d| store_translations(locale, d || {}) } + end + + # Loads a plain Ruby translations file. eval'ing the file must yield + # a Hash containing translation data with locales as toplevel keys. + def load_rb(filename) + eval(IO.read(filename), binding, filename) + end + + # Loads a YAML translations file. The data must have locales as + # toplevel keys. + def load_yml(filename) + begin + YAML.load_file(filename) + rescue TypeError, ScriptError, StandardError => e + raise InvalidLocaleData.new(filename, e.inspect) + end + end + + def translate_localization_format(locale, object, format, options) + format.to_s.gsub(/%[aAbBpP]/) do |match| + case match + when '%a' then I18n.t(:"date.abbr_day_names", :locale => locale, :format => format)[object.wday] + when '%A' then I18n.t(:"date.day_names", :locale => locale, :format => format)[object.wday] + when '%b' then I18n.t(:"date.abbr_month_names", :locale => locale, :format => format)[object.mon] + when '%B' then I18n.t(:"date.month_names", :locale => locale, :format => format)[object.mon] + when '%p' then I18n.t(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format).upcase if object.respond_to? :hour + when '%P' then I18n.t(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format).downcase if object.respond_to? :hour + end + end + end + + def pluralization_key(entry, count) + key = :zero if count == 0 && entry.has_key?(:zero) + key ||= count == 1 ? :one : :other + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/cache.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/cache.rb new file mode 100644 index 000000000000..1aa6434876d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/cache.rb @@ -0,0 +1,114 @@ +# This module allows you to easily cache all responses from the backend - thus +# speeding up the I18n aspects of your application quite a bit. +# +# To enable caching you can simply include the Cache module to the Simple +# backend - or whatever other backend you are using: +# +# I18n::Backend::Simple.send(:include, I18n::Backend::Cache) +# +# You will also need to set a cache store implementation that you want to use: +# +# I18n.cache_store = ActiveSupport::Cache.lookup_store(:memory_store) +# +# You can use any cache implementation you want that provides the same API as +# ActiveSupport::Cache (only the methods #fetch and #write are being used). +# +# The cache_key implementation by default assumes you pass values that return +# a valid key from #hash (see +# http://www.ruby-doc.org/core/classes/Object.html#M000337). However, you can +# configure your own digest method via which responds to #hexdigest (see +# http://ruby-doc.org/stdlib/libdoc/digest/rdoc/index.html): +# +# I18n.cache_key_digest = Digest::MD5.new +# +# If you use a lambda as a default value in your translation like this: +# +# I18n.t(:"date.order", :default => lambda {[:month, :day, :year]}) +# +# Then you will always have a cache miss, because each time this method +# is called the lambda will have a different hash value. If you know +# the result of the lambda is a constant as in the example above, then +# to cache this you can make the lambda a constant, like this: +# +# DEFAULT_DATE_ORDER = lambda {[:month, :day, :year]} +# ... +# I18n.t(:"date.order", :default => DEFAULT_DATE_ORDER) +# +# If the lambda may result in different values for each call then consider +# also using the Memoize backend. +# +module I18n + class << self + @@cache_store = nil + @@cache_namespace = nil + @@cache_key_digest = nil + + def cache_store + @@cache_store + end + + def cache_store=(store) + @@cache_store = store + end + + def cache_namespace + @@cache_namespace + end + + def cache_namespace=(namespace) + @@cache_namespace = namespace + end + + def cache_key_digest + @@cache_key_digest + end + + def cache_key_digest=(key_digest) + @@cache_key_digest = key_digest + end + + def perform_caching? + !cache_store.nil? + end + end + + module Backend + # TODO Should the cache be cleared if new translations are stored? + module Cache + def translate(locale, key, options = {}) + I18n.perform_caching? ? fetch(cache_key(locale, key, options)) { super } : super + end + + protected + + def fetch(cache_key, &block) + result = _fetch(cache_key, &block) + throw(:exception, result) if result.is_a?(MissingTranslation) + result = result.dup if result.frozen? rescue result + result + end + + def _fetch(cache_key, &block) + result = I18n.cache_store.read(cache_key) + return result unless result.nil? + result = catch(:exception, &block) + I18n.cache_store.write(cache_key, result) unless result.is_a?(Proc) + result + end + + def cache_key(locale, key, options) + # This assumes that only simple, native Ruby values are passed to I18n.translate. + "i18n/#{I18n.cache_namespace}/#{locale}/#{digest_item(key)}/#{USE_INSPECT_HASH ? digest_item(options.inspect) : digest_item(options)}" + end + + private + # In Ruby < 1.9 the following is true: { :foo => 1, :bar => 2 }.hash == { :foo => 2, :bar => 1 }.hash + # Therefore we must use the hash of the inspect string instead to avoid cache key colisions. + USE_INSPECT_HASH = RUBY_VERSION <= "1.9" + + def digest_item(key) + I18n.cache_key_digest ? I18n.cache_key_digest.hexdigest(key.to_s) : key.hash + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/cascade.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/cascade.rb new file mode 100644 index 000000000000..d8fb1cf48b8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/cascade.rb @@ -0,0 +1,54 @@ +# The Cascade module adds the ability to do cascading lookups to backends that +# are compatible to the Simple backend. +# +# By cascading lookups we mean that for any key that can not be found the +# Cascade module strips one segment off the scope part of the key and then +# tries to look up the key in that scope. +# +# E.g. when a lookup for the key :"foo.bar.baz" does not yield a result then +# the segment :bar will be stripped off the scope part :"foo.bar" and the new +# scope :foo will be used to look up the key :baz. If that does not succeed +# then the remaining scope segment :foo will be omitted, too, and again the +# key :baz will be looked up (now with no scope). +# +# To enable a cascading lookup one passes the :cascade option: +# +# I18n.t(:'foo.bar.baz', :cascade => true) +# +# This will return the first translation found for :"foo.bar.baz", :"foo.baz" +# or :baz in this order. +# +# The cascading lookup takes precedence over resolving any given defaults. +# I.e. defaults will kick in after the cascading lookups haven't succeeded. +# +# This behavior is useful for libraries like ActiveRecord validations where +# the library wants to give users a bunch of more or less fine-grained options +# of scopes for a particular key. +# +# Thanks to Clemens Kofler for the initial idea and implementation! See +# http://github.com/clemens/i18n-cascading-backend + +module I18n + module Backend + module Cascade + def lookup(locale, key, scope = [], options = {}) + return super unless cascade = options[:cascade] + + cascade = { :step => 1 } unless cascade.is_a?(Hash) + step = cascade[:step] || 1 + offset = cascade[:offset] || 1 + separator = options[:separator] || I18n.default_separator + skip_root = cascade.has_key?(:skip_root) ? cascade[:skip_root] : true + + scope = I18n.normalize_keys(nil, key, scope, separator) + key = (scope.slice!(-offset, offset) || []).join(separator) + + begin + result = super + return result unless result.nil? + scope = scope.dup + end while (!scope.empty? || !skip_root) && scope.slice!(-step, step) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/chain.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/chain.rb new file mode 100644 index 000000000000..2a45cad34089 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/chain.rb @@ -0,0 +1,97 @@ +module I18n + module Backend + # Backend that chains multiple other backends and checks each of them when + # a translation needs to be looked up. This is useful when you want to use + # standard translations with a Simple backend but store custom application + # translations in a database or other backends. + # + # To use the Chain backend instantiate it and set it to the I18n module. + # You can add chained backends through the initializer or backends + # accessor: + # + # # preserves the existing Simple backend set to I18n.backend + # I18n.backend = I18n::Backend::Chain.new(I18n::Backend::ActiveRecord.new, I18n.backend) + # + # The implementation assumes that all backends added to the Chain implement + # a lookup method with the same API as Simple backend does. + class Chain + module Implementation + include Base + + attr_accessor :backends + + def initialize(*backends) + self.backends = backends + end + + def reload! + backends.each { |backend| backend.reload! } + end + + def store_translations(locale, data, options = {}) + backends.first.store_translations(locale, data, options) + end + + def available_locales + backends.map { |backend| backend.available_locales }.flatten.uniq + end + + def translate(locale, key, default_options = {}) + namespace = nil + options = default_options.except(:default) + + backends.each do |backend| + catch(:exception) do + options = default_options if backend == backends.last + translation = backend.translate(locale, key, options) + if namespace_lookup?(translation, options) + namespace = _deep_merge(translation, namespace || {}) + elsif !translation.nil? || (options.key?(:default) && options[:default].nil?) + return translation + end + end + end + + return namespace if namespace + throw(:exception, I18n::MissingTranslation.new(locale, key, options)) + end + + def exists?(locale, key) + backends.any? do |backend| + backend.exists?(locale, key) + end + end + + def localize(locale, object, format = :default, options = {}) + backends.each do |backend| + catch(:exception) do + result = backend.localize(locale, object, format, options) and return result + end + end + throw(:exception, I18n::MissingTranslation.new(locale, format, options)) + end + + protected + def namespace_lookup?(result, options) + result.is_a?(Hash) && !options.has_key?(:count) + end + + private + # This is approximately what gets used in ActiveSupport. + # However since we are not guaranteed to run in an ActiveSupport context + # it is wise to have our own copy. We underscore it + # to not pollute the namespace of the including class. + def _deep_merge(hash, other_hash) + copy = hash.dup + other_hash.each_pair do |k,v| + value_from_other = hash[k] + copy[k] = value_from_other.is_a?(Hash) && v.is_a?(Hash) ? _deep_merge(value_from_other, v) : v + end + copy + end + end + + include Implementation + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/fallbacks.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/fallbacks.rb new file mode 100644 index 000000000000..a3badaea5791 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/fallbacks.rb @@ -0,0 +1,86 @@ +# I18n locale fallbacks are useful when you want your application to use +# translations from other locales when translations for the current locale are +# missing. E.g. you might want to use :en translations when translations in +# your applications main locale :de are missing. +# +# To enable locale fallbacks you can simply include the Fallbacks module to +# the Simple backend - or whatever other backend you are using: +# +# I18n::Backend::Simple.include(I18n::Backend::Fallbacks) +module I18n + @@fallbacks = nil + + class << self + # Returns the current fallbacks implementation. Defaults to +I18n::Locale::Fallbacks+. + def fallbacks + @@fallbacks ||= I18n::Locale::Fallbacks.new + end + + # Sets the current fallbacks implementation. Use this to set a different fallbacks implementation. + def fallbacks=(fallbacks) + @@fallbacks = fallbacks + end + end + + module Backend + module Fallbacks + # Overwrites the Base backend translate method so that it will try each + # locale given by I18n.fallbacks for the given locale. E.g. for the + # locale :"de-DE" it might try the locales :"de-DE", :de and :en + # (depends on the fallbacks implementation) until it finds a result with + # the given options. If it does not find any result for any of the + # locales it will then throw MissingTranslation as usual. + # + # The default option takes precedence over fallback locales only when + # it's a Symbol. When the default contains a String, Proc or Hash + # it is evaluated last after all the fallback locales have been tried. + def translate(locale, key, options = {}) + return super unless options.fetch(:fallback, true) + return super if options[:fallback_in_progress] + default = extract_non_symbol_default!(options) if options[:default] + + begin + options[:fallback_in_progress] = true + I18n.fallbacks[locale].each do |fallback| + begin + catch(:exception) do + result = super(fallback, key, options) + return result unless result.nil? + end + rescue I18n::InvalidLocale + # we do nothing when the locale is invalid, as this is a fallback anyways. + end + end + ensure + options.delete(:fallback_in_progress) + end + + return if options.key?(:default) && options[:default].nil? + + return super(locale, nil, options.merge(:default => default)) if default + throw(:exception, I18n::MissingTranslation.new(locale, key, options)) + end + + def extract_non_symbol_default!(options) + defaults = [options[:default]].flatten + first_non_symbol_default = defaults.detect{|default| !default.is_a?(Symbol)} + if first_non_symbol_default + options[:default] = defaults[0, defaults.index(first_non_symbol_default)] + end + return first_non_symbol_default + end + + def exists?(locale, key) + I18n.fallbacks[locale].each do |fallback| + begin + return true if super(fallback, key) + rescue I18n::InvalidLocale + # we do nothing when the locale is invalid, as this is a fallback anyways. + end + end + + false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/flatten.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/flatten.rb new file mode 100644 index 000000000000..995c34629c6d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/flatten.rb @@ -0,0 +1,113 @@ +module I18n + module Backend + # This module contains several helpers to assist flattening translations. + # You may want to flatten translations for: + # + # 1) speed up lookups, as in the Memoize backend; + # 2) In case you want to store translations in a data store, as in ActiveRecord backend; + # + # You can check both backends above for some examples. + # This module also keeps all links in a hash so they can be properly resolved when flattened. + module Flatten + SEPARATOR_ESCAPE_CHAR = "\001" + FLATTEN_SEPARATOR = "." + + # normalize_keys the flatten way. This method is significantly faster + # and creates way less objects than the one at I18n.normalize_keys. + # It also handles escaping the translation keys. + def self.normalize_flat_keys(locale, key, scope, separator) + keys = [scope, key].flatten.compact + separator ||= I18n.default_separator + + if separator != FLATTEN_SEPARATOR + keys.map! do |k| + k.to_s.tr("#{FLATTEN_SEPARATOR}#{separator}", + "#{SEPARATOR_ESCAPE_CHAR}#{FLATTEN_SEPARATOR}") + end + end + + keys.join(".") + end + + # Receives a string and escape the default separator. + def self.escape_default_separator(key) #:nodoc: + key.to_s.tr(FLATTEN_SEPARATOR, SEPARATOR_ESCAPE_CHAR) + end + + # Shortcut to I18n::Backend::Flatten.normalize_flat_keys + # and then resolve_links. + def normalize_flat_keys(locale, key, scope, separator) + key = I18n::Backend::Flatten.normalize_flat_keys(locale, key, scope, separator) + resolve_link(locale, key) + end + + # Store flattened links. + def links + @links ||= I18n.new_double_nested_cache + end + + # Flatten keys for nested Hashes by chaining up keys: + # + # >> { "a" => { "b" => { "c" => "d", "e" => "f" }, "g" => "h" }, "i" => "j"}.wind + # => { "a.b.c" => "d", "a.b.e" => "f", "a.g" => "h", "i" => "j" } + # + def flatten_keys(hash, escape, prev_key=nil, &block) + hash.each_pair do |key, value| + key = escape_default_separator(key) if escape + curr_key = [prev_key, key].compact.join(FLATTEN_SEPARATOR).to_sym + yield curr_key, value + flatten_keys(value, escape, curr_key, &block) if value.is_a?(Hash) + end + end + + # Receives a hash of translations (where the key is a locale and + # the value is another hash) and return a hash with all + # translations flattened. + # + # Nested hashes are included in the flattened hash just if subtree + # is true and Symbols are automatically stored as links. + def flatten_translations(locale, data, escape, subtree) + hash = {} + flatten_keys(data, escape) do |key, value| + if value.is_a?(Hash) + hash[key] = value if subtree + else + store_link(locale, key, value) if value.is_a?(Symbol) + hash[key] = value + end + end + hash + end + + protected + + def store_link(locale, key, link) + links[locale.to_sym][key.to_s] = link.to_s + end + + def resolve_link(locale, key) + key, locale = key.to_s, locale.to_sym + links = self.links[locale] + + if links.key?(key) + links[key] + elsif link = find_link(locale, key) + store_link(locale, key, key.gsub(*link)) + else + key + end + end + + def find_link(locale, key) #:nodoc: + links[locale].each_pair do |from, to| + return [from, to] if key[0, from.length] == from + end && nil + end + + def escape_default_separator(key) #:nodoc: + I18n::Backend::Flatten.escape_default_separator(key) + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/gettext.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/gettext.rb new file mode 100644 index 000000000000..f41df6857858 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/gettext.rb @@ -0,0 +1,81 @@ +require 'i18n/gettext' +require 'i18n/gettext/po_parser' + +module I18n + module Backend + # Experimental support for using Gettext po files to store translations. + # + # To use this you can simply include the module to the Simple backend - or + # whatever other backend you are using. + # + # I18n::Backend::Simple.include(I18n::Backend::Gettext) + # + # Now you should be able to include your Gettext translation (*.po) files to + # the +I18n.load_path+ so they're loaded to the backend and you can use them as + # usual: + # + # I18n.load_path += Dir["path/to/locales/*.po"] + # + # Following the Gettext convention this implementation expects that your + # translation files are named by their locales. E.g. the file en.po would + # contain the translations for the English locale. + # + # To translate text <b>you must use</b> one of the translate methods provided by + # I18n::Gettext::Helpers. + # + # include I18n::Gettext::Helpers + # puts _("some string") + # + # Without it strings containing periods (".") will not be translated. + + module Gettext + class PoData < Hash + def set_comment(msgid_or_sym, comment) + # ignore + end + end + + protected + def load_po(filename) + locale = ::File.basename(filename, '.po').to_sym + data = normalize(locale, parse(filename)) + { locale => data } + end + + def parse(filename) + GetText::PoParser.new.parse(::File.read(filename), PoData.new) + end + + def normalize(locale, data) + data.inject({}) do |result, (key, value)| + unless key.nil? || key.empty? + key = key.gsub(I18n::Gettext::CONTEXT_SEPARATOR, '|') + key, value = normalize_pluralization(locale, key, value) if key.index("\000") + + parts = key.split('|').reverse + normalized = parts.inject({}) do |_normalized, part| + { part => _normalized.empty? ? value : _normalized } + end + + result.deep_merge!(normalized) + end + result + end + end + + def normalize_pluralization(locale, key, value) + # FIXME po_parser includes \000 chars that can not be turned into Symbols + key = key.gsub("\000", I18n::Gettext::PLURAL_SEPARATOR).split(I18n::Gettext::PLURAL_SEPARATOR).first + + keys = I18n::Gettext.plural_keys(locale) + values = value.split("\000") + raise "invalid number of plurals: #{values.size}, keys: #{keys.inspect} on #{locale} locale for msgid #{key.inspect} with values #{values.inspect}" if values.size != keys.size + + result = {} + values.each_with_index { |_value, ix| result[keys[ix]] = _value } + [key, result] + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/interpolation_compiler.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/interpolation_compiler.rb new file mode 100644 index 000000000000..0e3a603af99e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/interpolation_compiler.rb @@ -0,0 +1,121 @@ +# The InterpolationCompiler module contains optimizations that can tremendously +# speed up the interpolation process on the Simple backend. +# +# It works by defining a pre-compiled method on stored translation Strings that +# already bring all the knowledge about contained interpolation variables etc. +# so that the actual recurring interpolation will be very fast. +# +# To enable pre-compiled interpolations you can simply include the +# InterpolationCompiler module to the Simple backend: +# +# I18n::Backend::Simple.include(I18n::Backend::InterpolationCompiler) +# +# Note that InterpolationCompiler does not yield meaningful results and consequently +# should not be used with Ruby 1.9 (YARV) but improves performance everywhere else +# (jRuby, Rubinius). +module I18n + module Backend + module InterpolationCompiler + module Compiler + extend self + + TOKENIZER = /(%%\{[^\}]+\}|%\{[^\}]+\})/ + INTERPOLATION_SYNTAX_PATTERN = /(%)?(%\{([^\}]+)\})/ + + def compile_if_an_interpolation(string) + if interpolated_str?(string) + string.instance_eval <<-RUBY_EVAL, __FILE__, __LINE__ + def i18n_interpolate(v = {}) + "#{compiled_interpolation_body(string)}" + end + RUBY_EVAL + end + + string + end + + def interpolated_str?(str) + str.kind_of?(::String) && str =~ INTERPOLATION_SYNTAX_PATTERN + end + + protected + # tokenize("foo %{bar} baz %%{buz}") # => ["foo ", "%{bar}", " baz ", "%%{buz}"] + def tokenize(str) + str.split(TOKENIZER) + end + + def compiled_interpolation_body(str) + tokenize(str).map do |token| + (matchdata = token.match(INTERPOLATION_SYNTAX_PATTERN)) ? handle_interpolation_token(token, matchdata) : escape_plain_str(token) + end.join + end + + def handle_interpolation_token(interpolation, matchdata) + escaped, pattern, key = matchdata.values_at(1, 2, 3) + escaped ? pattern : compile_interpolation_token(key.to_sym) + end + + def compile_interpolation_token(key) + "\#{#{interpolate_or_raise_missing(key)}}" + end + + def interpolate_or_raise_missing(key) + escaped_key = escape_key_sym(key) + RESERVED_KEYS.include?(key) ? reserved_key(escaped_key) : interpolate_key(escaped_key) + end + + def interpolate_key(key) + [direct_key(key), nil_key(key), missing_key(key)].join('||') + end + + def direct_key(key) + "((t = v[#{key}]) && t.respond_to?(:call) ? t.call : t)" + end + + def nil_key(key) + "(v.has_key?(#{key}) && '')" + end + + def missing_key(key) + "I18n.config.missing_interpolation_argument_handler.call(#{key}, v, self)" + end + + def reserved_key(key) + "raise(ReservedInterpolationKey.new(#{key}, self))" + end + + def escape_plain_str(str) + str.gsub(/"|\\|#/) {|x| "\\#{x}"} + end + + def escape_key_sym(key) + # rely on Ruby to do all the hard work :) + key.to_sym.inspect + end + end + + def interpolate(locale, string, values) + if string.respond_to?(:i18n_interpolate) + string.i18n_interpolate(values) + elsif values + super + else + string + end + end + + def store_translations(locale, data, options = {}) + compile_all_strings_in(data) + super + end + + protected + def compile_all_strings_in(data) + data.each_value do |value| + Compiler.compile_if_an_interpolation(value) + compile_all_strings_in(value) if value.kind_of?(Hash) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/key_value.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/key_value.rb new file mode 100644 index 000000000000..95bdc6417845 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/key_value.rb @@ -0,0 +1,177 @@ +require 'i18n/backend/base' + +module I18n + + begin + require 'oj' + class JSON + class << self + def encode(value) + Oj::Rails.encode(value) + end + def decode(value) + Oj.load(value) + end + end + end + rescue LoadError + require 'active_support/json' + JSON = ActiveSupport::JSON + end + + module Backend + # This is a basic backend for key value stores. It receives on + # initialization the store, which should respond to three methods: + # + # * store#[](key) - Used to get a value + # * store#[]=(key, value) - Used to set a value + # * store#keys - Used to get all keys + # + # Since these stores only supports string, all values are converted + # to JSON before being stored, allowing it to also store booleans, + # hashes and arrays. However, this store does not support Procs. + # + # As the ActiveRecord backend, Symbols are just supported when loading + # translations from the filesystem or through explicit store translations. + # + # Also, avoid calling I18n.available_locales since it's a somehow + # expensive operation in most stores. + # + # == Example + # + # To setup I18n to use TokyoCabinet in memory is quite straightforward: + # + # require 'rufus/tokyo/cabinet' # gem install rufus-tokyo + # I18n.backend = I18n::Backend::KeyValue.new(Rufus::Tokyo::Cabinet.new('*')) + # + # == Performance + # + # You may make this backend even faster by including the Memoize module. + # However, notice that you should properly clear the cache if you change + # values directly in the key-store. + # + # == Subtrees + # + # In most backends, you are allowed to retrieve part of a translation tree: + # + # I18n.backend.store_translations :en, :foo => { :bar => :baz } + # I18n.t "foo" #=> { :bar => :baz } + # + # This backend supports this feature by default, but it slows down the storage + # of new data considerably and makes hard to delete entries. That said, you are + # allowed to disable the storage of subtrees on initialization: + # + # I18n::Backend::KeyValue.new(@store, false) + # + # This is useful if you are using a KeyValue backend chained to a Simple backend. + class KeyValue + module Implementation + attr_accessor :store + + include Base, Flatten + + def initialize(store, subtrees=true) + @store, @subtrees = store, subtrees + end + + def store_translations(locale, data, options = {}) + escape = options.fetch(:escape, true) + flatten_translations(locale, data, escape, @subtrees).each do |key, value| + key = "#{locale}.#{key}" + + case value + when Hash + if @subtrees && (old_value = @store[key]) + old_value = JSON.decode(old_value) + value = old_value.deep_symbolize_keys.deep_merge!(value) if old_value.is_a?(Hash) + end + when Proc + raise "Key-value stores cannot handle procs" + end + + @store[key] = JSON.encode(value) unless value.is_a?(Symbol) + end + end + + def available_locales + locales = @store.keys.map { |k| k =~ /\./; $` } + locales.uniq! + locales.compact! + locales.map! { |k| k.to_sym } + locales + end + + protected + + def subtrees? + @subtrees + end + + def lookup(locale, key, scope = [], options = {}) + key = normalize_flat_keys(locale, key, scope, options[:separator]) + value = @store["#{locale}.#{key}"] + value = JSON.decode(value) if value + + if value.is_a?(Hash) + value.deep_symbolize_keys + elsif !value.nil? + value + elsif !@subtrees + SubtreeProxy.new("#{locale}.#{key}", @store) + end + end + + def pluralize(locale, entry, count) + if subtrees? + super + else + key = pluralization_key(entry, count) + entry[key] + end + end + end + + class SubtreeProxy + def initialize(master_key, store) + @master_key = master_key + @store = store + @subtree = nil + end + + def has_key?(key) + @subtree && @subtree.has_key?(key) || self[key] + end + + def [](key) + unless @subtree && value = @subtree[key] + value = @store["#{@master_key}.#{key}"] + if value + value = JSON.decode(value) + (@subtree ||= {})[key] = value + end + end + value + end + + def is_a?(klass) + Hash == klass || super + end + alias :kind_of? :is_a? + + def instance_of?(klass) + Hash == klass || super + end + + def nil? + @subtree.nil? + end + + def inspect + @subtree.inspect + end + end + + include Implementation + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/memoize.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/memoize.rb new file mode 100644 index 000000000000..a11bdec11318 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/memoize.rb @@ -0,0 +1,46 @@ +# Memoize module simply memoizes the values returned by lookup using +# a flat hash and can tremendously speed up the lookup process in a backend. +# +# To enable it you can simply include the Memoize module to your backend: +# +# I18n::Backend::Simple.include(I18n::Backend::Memoize) +# +# Notice that it's the responsibility of the backend to define whenever the +# cache should be cleaned. +module I18n + module Backend + module Memoize + def available_locales + @memoized_locales ||= super + end + + def store_translations(locale, data, options = {}) + reset_memoizations!(locale) + super + end + + def reload! + reset_memoizations! + super + end + + protected + + def lookup(locale, key, scope = nil, options = {}) + flat_key = I18n::Backend::Flatten.normalize_flat_keys(locale, + key, scope, options[:separator]).to_sym + flat_hash = memoized_lookup[locale.to_sym] + flat_hash.key?(flat_key) ? flat_hash[flat_key] : (flat_hash[flat_key] = super) + end + + def memoized_lookup + @memoized_lookup ||= I18n.new_double_nested_cache + end + + def reset_memoizations!(locale=nil) + @memoized_locales = nil + (locale ? memoized_lookup[locale.to_sym] : memoized_lookup).clear + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/metadata.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/metadata.rb new file mode 100644 index 000000000000..a8d922a06180 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/metadata.rb @@ -0,0 +1,69 @@ +# I18n translation metadata is useful when you want to access information +# about how a translation was looked up, pluralized or interpolated in +# your application. +# +# msg = I18n.t(:message, :default => 'Hi!', :scope => :foo) +# msg.translation_metadata +# # => { :key => :message, :scope => :foo, :default => 'Hi!' } +# +# If a :count option was passed to #translate it will be set to the metadata. +# Likewise, if any interpolation variables were passed they will also be set. +# +# To enable translation metadata you can simply include the Metadata module +# into the Simple backend class - or whatever other backend you are using: +# +# I18n::Backend::Simple.include(I18n::Backend::Metadata) +# +module I18n + module Backend + module Metadata + class << self + def included(base) + Object.class_eval do + def translation_metadata + unless self.frozen? + @translation_metadata ||= {} + else + {} + end + end + + def translation_metadata=(translation_metadata) + @translation_metadata = translation_metadata unless self.frozen? + end + end unless Object.method_defined?(:translation_metadata) + end + end + + def translate(locale, key, options = {}) + metadata = { + :locale => locale, + :key => key, + :scope => options[:scope], + :default => options[:default], + :separator => options[:separator], + :values => options.reject { |name, value| RESERVED_KEYS.include?(name) } + } + with_metadata(metadata) { super } + end + + def interpolate(locale, entry, values = {}) + metadata = entry.translation_metadata.merge(:original => entry) + with_metadata(metadata) { super } + end + + def pluralize(locale, entry, count) + with_metadata(:count => count) { super } + end + + protected + + def with_metadata(metadata, &block) + result = yield + result.translation_metadata = result.translation_metadata.merge(metadata) if result + result + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/pluralization.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/pluralization.rb new file mode 100644 index 000000000000..01e68d279477 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/pluralization.rb @@ -0,0 +1,53 @@ +# I18n Pluralization are useful when you want your application to +# customize pluralization rules. +# +# To enable locale specific pluralizations you can simply include the +# Pluralization module to the Simple backend - or whatever other backend you +# are using. +# +# I18n::Backend::Simple.include(I18n::Backend::Pluralization) +# +# You also need to make sure to provide pluralization algorithms to the +# backend, i.e. include them to your I18n.load_path accordingly. +module I18n + module Backend + module Pluralization + # Overwrites the Base backend translate method so that it will check the + # translation meta data space (:i18n) for a locale specific pluralization + # rule and use it to pluralize the given entry. I.e. the library expects + # pluralization rules to be stored at I18n.t(:'i18n.plural.rule') + # + # Pluralization rules are expected to respond to #call(count) and + # return a pluralization key. Valid keys depend on the translation data + # hash (entry) but it is generally recommended to follow CLDR's style, + # i.e., return one of the keys :zero, :one, :few, :many, :other. + # + # The :zero key is always picked directly when count equals 0 AND the + # translation data has the key :zero. This way translators are free to + # either pick a special :zero translation even for languages where the + # pluralizer does not return a :zero key. + def pluralize(locale, entry, count) + return entry unless entry.is_a?(Hash) and count + + pluralizer = pluralizer(locale) + if pluralizer.respond_to?(:call) + key = count == 0 && entry.has_key?(:zero) ? :zero : pluralizer.call(count) + raise InvalidPluralizationData.new(entry, count, key) unless entry.has_key?(key) + entry[key] + else + super + end + end + + protected + + def pluralizers + @pluralizers ||= {} + end + + def pluralizer(locale) + pluralizers[locale] ||= I18n.t(:'i18n.plural.rule', :locale => locale, :resolve => false) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/simple.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/simple.rb new file mode 100644 index 000000000000..4744130feb49 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/simple.rb @@ -0,0 +1,93 @@ +module I18n + module Backend + # A simple backend that reads translations from YAML files and stores them in + # an in-memory hash. Relies on the Base backend. + # + # The implementation is provided by a Implementation module allowing to easily + # extend Simple backend's behavior by including modules. E.g.: + # + # module I18n::Backend::Pluralization + # def pluralize(*args) + # # extended pluralization logic + # super + # end + # end + # + # I18n::Backend::Simple.include(I18n::Backend::Pluralization) + class Simple + (class << self; self; end).class_eval { public :include } + + module Implementation + include Base + + def initialized? + @initialized ||= false + end + + # Stores translations for the given locale in memory. + # This uses a deep merge for the translations hash, so existing + # translations will be overwritten by new ones only at the deepest + # level of the hash. + def store_translations(locale, data, options = {}) + if I18n.enforce_available_locales && + I18n.available_locales_initialized? && + !I18n.available_locales.include?(locale.to_sym) && + !I18n.available_locales.include?(locale.to_s) + return data + end + locale = locale.to_sym + translations[locale] ||= {} + data = data.deep_symbolize_keys + translations[locale].deep_merge!(data) + end + + # Get available locales from the translations hash + def available_locales + init_translations unless initialized? + translations.inject([]) do |locales, (locale, data)| + locales << locale unless data.size <= 1 && (data.empty? || data.has_key?(:i18n)) + locales + end + end + + # Clean up translations hash and set initialized to false on reload! + def reload! + @initialized = false + @translations = nil + super + end + + protected + + def init_translations + load_translations + @initialized = true + end + + def translations + @translations ||= {} + end + + # Looks up a translation from the translations hash. Returns nil if + # either key is nil, or locale, scope or key do not exist as a key in the + # nested translations hash. Splits keys or scopes containing dots + # into multiple keys, i.e. <tt>currency.format</tt> is regarded the same as + # <tt>%w(currency format)</tt>. + def lookup(locale, key, scope = [], options = {}) + init_translations unless initialized? + keys = I18n.normalize_keys(locale, key, scope, options[:separator]) + + keys.inject(translations) do |result, _key| + _key = _key.to_sym + return nil unless result.is_a?(Hash) && result.has_key?(_key) + result = result[_key] + result = resolve(locale, _key, result, options.merge(:scope => nil)) if result.is_a?(Symbol) + result + end + end + end + + include Implementation + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/transliterator.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/transliterator.rb new file mode 100644 index 000000000000..2617bcf2a362 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/backend/transliterator.rb @@ -0,0 +1,106 @@ +# encoding: utf-8 +module I18n + module Backend + module Transliterator + DEFAULT_REPLACEMENT_CHAR = "?" + + # Given a locale and a UTF-8 string, return the locale's ASCII + # approximation for the string. + def transliterate(locale, string, replacement = nil) + @transliterators ||= {} + @transliterators[locale] ||= Transliterator.get I18n.t(:'i18n.transliterate.rule', + :locale => locale, :resolve => false, :default => {}) + @transliterators[locale].transliterate(string, replacement) + end + + # Get a transliterator instance. + def self.get(rule = nil) + if !rule || rule.kind_of?(Hash) + HashTransliterator.new(rule) + elsif rule.kind_of? Proc + ProcTransliterator.new(rule) + else + raise I18n::ArgumentError, "Transliteration rule must be a proc or a hash." + end + end + + # A transliterator which accepts a Proc as its transliteration rule. + class ProcTransliterator + def initialize(rule) + @rule = rule + end + + def transliterate(string, replacement = nil) + @rule.call(string) + end + end + + # A transliterator which accepts a Hash of characters as its translation + # rule. + class HashTransliterator + DEFAULT_APPROXIMATIONS = { + "À"=>"A", "Á"=>"A", "Â"=>"A", "Ã"=>"A", "Ä"=>"A", "Å"=>"A", "Æ"=>"AE", + "Ç"=>"C", "È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E", "Ì"=>"I", "Í"=>"I", + "Î"=>"I", "Ï"=>"I", "Ð"=>"D", "Ñ"=>"N", "Ò"=>"O", "Ó"=>"O", "Ô"=>"O", + "Õ"=>"O", "Ö"=>"O", "×"=>"x", "Ø"=>"O", "Ù"=>"U", "Ú"=>"U", "Û"=>"U", + "Ü"=>"U", "Ý"=>"Y", "Þ"=>"Th", "ß"=>"ss", "à"=>"a", "á"=>"a", "â"=>"a", + "ã"=>"a", "ä"=>"a", "å"=>"a", "æ"=>"ae", "ç"=>"c", "è"=>"e", "é"=>"e", + "ê"=>"e", "ë"=>"e", "ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i", "ð"=>"d", + "ñ"=>"n", "ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o", "ö"=>"o", "ø"=>"o", + "ù"=>"u", "ú"=>"u", "û"=>"u", "ü"=>"u", "ý"=>"y", "þ"=>"th", "ÿ"=>"y", + "Ā"=>"A", "ā"=>"a", "Ă"=>"A", "ă"=>"a", "Ą"=>"A", "ą"=>"a", "Ć"=>"C", + "ć"=>"c", "Ĉ"=>"C", "ĉ"=>"c", "Ċ"=>"C", "ċ"=>"c", "Č"=>"C", "č"=>"c", + "Ď"=>"D", "ď"=>"d", "Đ"=>"D", "đ"=>"d", "Ē"=>"E", "ē"=>"e", "Ĕ"=>"E", + "ĕ"=>"e", "Ė"=>"E", "ė"=>"e", "Ę"=>"E", "ę"=>"e", "Ě"=>"E", "ě"=>"e", + "Ĝ"=>"G", "ĝ"=>"g", "Ğ"=>"G", "ğ"=>"g", "Ġ"=>"G", "ġ"=>"g", "Ģ"=>"G", + "ģ"=>"g", "Ĥ"=>"H", "ĥ"=>"h", "Ħ"=>"H", "ħ"=>"h", "Ĩ"=>"I", "ĩ"=>"i", + "Ī"=>"I", "ī"=>"i", "Ĭ"=>"I", "ĭ"=>"i", "Į"=>"I", "į"=>"i", "İ"=>"I", + "ı"=>"i", "IJ"=>"IJ", "ij"=>"ij", "Ĵ"=>"J", "ĵ"=>"j", "Ķ"=>"K", "ķ"=>"k", + "ĸ"=>"k", "Ĺ"=>"L", "ĺ"=>"l", "Ļ"=>"L", "ļ"=>"l", "Ľ"=>"L", "ľ"=>"l", + "Ŀ"=>"L", "ŀ"=>"l", "Ł"=>"L", "ł"=>"l", "Ń"=>"N", "ń"=>"n", "Ņ"=>"N", + "ņ"=>"n", "Ň"=>"N", "ň"=>"n", "ʼn"=>"'n", "Ŋ"=>"NG", "ŋ"=>"ng", + "Ō"=>"O", "ō"=>"o", "Ŏ"=>"O", "ŏ"=>"o", "Ő"=>"O", "ő"=>"o", "Œ"=>"OE", + "œ"=>"oe", "Ŕ"=>"R", "ŕ"=>"r", "Ŗ"=>"R", "ŗ"=>"r", "Ř"=>"R", "ř"=>"r", + "Ś"=>"S", "ś"=>"s", "Ŝ"=>"S", "ŝ"=>"s", "Ş"=>"S", "ş"=>"s", "Š"=>"S", + "š"=>"s", "Ţ"=>"T", "ţ"=>"t", "Ť"=>"T", "ť"=>"t", "Ŧ"=>"T", "ŧ"=>"t", + "Ũ"=>"U", "ũ"=>"u", "Ū"=>"U", "ū"=>"u", "Ŭ"=>"U", "ŭ"=>"u", "Ů"=>"U", + "ů"=>"u", "Ű"=>"U", "ű"=>"u", "Ų"=>"U", "ų"=>"u", "Ŵ"=>"W", "ŵ"=>"w", + "Ŷ"=>"Y", "ŷ"=>"y", "Ÿ"=>"Y", "Ź"=>"Z", "ź"=>"z", "Ż"=>"Z", "ż"=>"z", + "Ž"=>"Z", "ž"=>"z" + }.freeze + + def initialize(rule = nil) + @rule = rule + add_default_approximations + add rule if rule + end + + def transliterate(string, replacement = nil) + replacement ||= DEFAULT_REPLACEMENT_CHAR + string.gsub(/[^\x00-\x7f]/u) do |char| + approximations[char] || replacement + end + end + + private + + def approximations + @approximations ||= {} + end + + def add_default_approximations + DEFAULT_APPROXIMATIONS.each do |key, value| + approximations[key] = value + end + end + + # Add transliteration rules to the approximations hash. + def add(hash) + hash.each do |key, value| + approximations[key.to_s] = value.to_s + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/config.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/config.rb new file mode 100644 index 000000000000..b37368963c62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/config.rb @@ -0,0 +1,147 @@ +require 'set' + +module I18n + class Config + # The only configuration value that is not global and scoped to thread is :locale. + # It defaults to the default_locale. + def locale + defined?(@locale) && @locale ? @locale : default_locale + end + + # Sets the current locale pseudo-globally, i.e. in the Thread.current hash. + def locale=(locale) + I18n.enforce_available_locales!(locale) + @locale = locale && locale.to_sym + end + + # Returns the current backend. Defaults to +Backend::Simple+. + def backend + @@backend ||= Backend::Simple.new + end + + # Sets the current backend. Used to set a custom backend. + def backend=(backend) + @@backend = backend + end + + # Returns the current default locale. Defaults to :'en' + def default_locale + @@default_locale ||= :en + end + + # Sets the current default locale. Used to set a custom default locale. + def default_locale=(locale) + I18n.enforce_available_locales!(locale) + @@default_locale = locale && locale.to_sym + end + + # Returns an array of locales for which translations are available. + # Unless you explicitely set these through I18n.available_locales= + # the call will be delegated to the backend. + def available_locales + @@available_locales ||= nil + @@available_locales || backend.available_locales + end + + # Caches the available locales list as both strings and symbols in a Set, so + # that we can have faster lookups to do the available locales enforce check. + def available_locales_set #:nodoc: + @@available_locales_set ||= available_locales.inject(Set.new) do |set, locale| + set << locale.to_s << locale.to_sym + end + end + + # Sets the available locales. + def available_locales=(locales) + @@available_locales = Array(locales).map { |locale| locale.to_sym } + @@available_locales = nil if @@available_locales.empty? + @@available_locales_set = nil + end + + # Returns true if the available_locales have been initialized + def available_locales_initialized? + ( !!defined?(@@available_locales) && !!@@available_locales ) + end + + # Clears the available locales set so it can be recomputed again after I18n + # gets reloaded. + def clear_available_locales_set #:nodoc: + @@available_locales_set = nil + end + + # Returns the current default scope separator. Defaults to '.' + def default_separator + @@default_separator ||= '.' + end + + # Sets the current default scope separator. + def default_separator=(separator) + @@default_separator = separator + end + + # Returns the current exception handler. Defaults to an instance of + # I18n::ExceptionHandler. + def exception_handler + @@exception_handler ||= ExceptionHandler.new + end + + # Sets the exception handler. + def exception_handler=(exception_handler) + @@exception_handler = exception_handler + end + + # Returns the current handler for situations when interpolation argument + # is missing. MissingInterpolationArgument will be raised by default. + def missing_interpolation_argument_handler + @@missing_interpolation_argument_handler ||= lambda do |missing_key, provided_hash, string| + raise MissingInterpolationArgument.new(missing_key, provided_hash, string) + end + end + + # Sets the missing interpolation argument handler. It can be any + # object that responds to #call. The arguments that will be passed to #call + # are the same as for MissingInterpolationArgument initializer. Use +Proc.new+ + # if you don't care about arity. + # + # == Example: + # You can supress raising an exception and return string instead: + # + # I18n.config.missing_interpolation_argument_handler = Proc.new do |key| + # "#{key} is missing" + # end + def missing_interpolation_argument_handler=(exception_handler) + @@missing_interpolation_argument_handler = exception_handler + end + + # Allow clients to register paths providing translation data sources. The + # backend defines acceptable sources. + # + # E.g. the provided SimpleBackend accepts a list of paths to translation + # files which are either named *.rb and contain plain Ruby Hashes or are + # named *.yml and contain YAML data. So for the SimpleBackend clients may + # register translation files like this: + # I18n.load_path << 'path/to/locale/en.yml' + def load_path + @@load_path ||= [] + end + + # Sets the load path instance. Custom implementations are expected to + # behave like a Ruby Array. + def load_path=(load_path) + @@load_path = load_path + @@available_locales_set = nil + backend.reload! + end + + # Whether or not to verify if locales are in the list of available locales. + # Defaults to true. + @@enforce_available_locales = true + def enforce_available_locales + @@enforce_available_locales + end + + def enforce_available_locales=(enforce_available_locales) + @@enforce_available_locales = enforce_available_locales + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/core_ext/hash.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/core_ext/hash.rb new file mode 100644 index 000000000000..895f41a43f7e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/core_ext/hash.rb @@ -0,0 +1,29 @@ +class Hash + def slice(*keep_keys) + h = {} + keep_keys.each { |key| h[key] = fetch(key) if has_key?(key) } + h + end unless Hash.method_defined?(:slice) + + def except(*less_keys) + slice(*keys - less_keys) + end unless Hash.method_defined?(:except) + + def deep_symbolize_keys + inject({}) { |result, (key, value)| + value = value.deep_symbolize_keys if value.is_a?(Hash) + result[(key.to_sym rescue key) || key] = value + result + } + end unless Hash.method_defined?(:deep_symbolize_keys) + + # deep_merge_hash! by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809 + MERGER = proc do |key, v1, v2| + Hash === v1 && Hash === v2 ? v1.merge(v2, &MERGER) : v2 + end + + def deep_merge!(data) + merge!(data, &MERGER) + end unless Hash.method_defined?(:deep_merge!) +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/core_ext/kernel/suppress_warnings.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/core_ext/kernel/suppress_warnings.rb new file mode 100644 index 000000000000..eec1435a71d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/core_ext/kernel/suppress_warnings.rb @@ -0,0 +1,8 @@ +module Kernel + def suppress_warnings + original_verbosity, $VERBOSE = $VERBOSE, nil + yield + ensure + $VERBOSE = original_verbosity + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/core_ext/string/interpolate.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/core_ext/string/interpolate.rb new file mode 100644 index 000000000000..a353310befea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/core_ext/string/interpolate.rb @@ -0,0 +1,9 @@ +# This file used to backport the Ruby 1.9 String interpolation syntax to Ruby 1.8. +# +# Since I18n has dropped support to Ruby 1.8, this file is not required anymore, +# however, Rails 3.2 still requires it directly: +# +# https://github.com/rails/rails/blob/3-2-stable/activesupport/lib/active_support/core_ext/string/interpolation.rb#L2 +# +# So we can't just drop the file entirely, which would then break Rails users +# under Ruby 1.9. This file can be removed once Rails 3.2 support is dropped. diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/exceptions.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/exceptions.rb new file mode 100644 index 000000000000..7e8b0d698128 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/exceptions.rb @@ -0,0 +1,104 @@ +require 'cgi' + +module I18n + # Handles exceptions raised in the backend. All exceptions except for + # MissingTranslationData exceptions are re-thrown. When a MissingTranslationData + # was caught the handler returns an error message string containing the key/scope. + # Note that the exception handler is not called when the option :throw was given. + class ExceptionHandler + include Module.new { + def call(exception, locale, key, options) + case exception + when MissingTranslation + exception.message + when Exception + raise exception + else + throw :exception, exception + end + end + } + end + + class ArgumentError < ::ArgumentError; end + + class InvalidLocale < ArgumentError + attr_reader :locale + def initialize(locale) + @locale = locale + super "#{locale.inspect} is not a valid locale" + end + end + + class InvalidLocaleData < ArgumentError + attr_reader :filename + def initialize(filename, exception_message) + @filename, @exception_message = filename, exception_message + super "can not load translations from #{filename}: #{exception_message}" + end + end + + class MissingTranslation < ArgumentError + module Base + attr_reader :locale, :key, :options + + def initialize(locale, key, options = {}) + @key, @locale, @options = key, locale, options.dup + options.each { |k, v| self.options[k] = v.inspect if v.is_a?(Proc) } + end + + def keys + @keys ||= I18n.normalize_keys(locale, key, options[:scope]).tap do |keys| + keys << 'no key' if keys.size < 2 + end + end + + def message + "translation missing: #{keys.join('.')}" + end + alias :to_s :message + + def to_exception + MissingTranslationData.new(locale, key, options) + end + end + + include Base + end + + class MissingTranslationData < ArgumentError + include MissingTranslation::Base + end + + class InvalidPluralizationData < ArgumentError + attr_reader :entry, :count, :key + def initialize(entry, count, key) + @entry, @count, @key = entry, count, key + super "translation data #{entry.inspect} can not be used with :count => #{count}. key '#{key}' is missing." + end + end + + class MissingInterpolationArgument < ArgumentError + attr_reader :key, :values, :string + def initialize(key, values, string) + @key, @values, @string = key, values, string + super "missing interpolation argument #{key.inspect} in #{string.inspect} (#{values.inspect} given)" + end + end + + class ReservedInterpolationKey < ArgumentError + attr_reader :key, :string + def initialize(key, string) + @key, @string = key, string + super "reserved key #{key.inspect} used in #{string.inspect}" + end + end + + class UnknownFileType < ArgumentError + attr_reader :type, :filename + def initialize(type, filename) + @type, @filename = type, filename + super "can not load translations from #{filename}, the file type #{type} is not known" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/gettext.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/gettext.rb new file mode 100644 index 000000000000..392cccd3a119 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/gettext.rb @@ -0,0 +1,26 @@ +module I18n + module Gettext + PLURAL_SEPARATOR = "\001" + CONTEXT_SEPARATOR = "\004" + + autoload :Helpers, 'i18n/gettext/helpers' + + @@plural_keys = { :en => [:one, :other] } + + class << self + # returns an array of plural keys for the given locale or the whole hash + # of locale mappings to plural keys so that we can convert from gettext's + # integer-index based style + # TODO move this information to the pluralization module + def plural_keys(*args) + args.empty? ? @@plural_keys : @@plural_keys[args.first] || @@plural_keys[:en] + end + + def extract_scope(msgid, separator) + scope = msgid.to_s.split(separator) + msgid = scope.pop + [scope, msgid] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/gettext/helpers.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/gettext/helpers.rb new file mode 100644 index 000000000000..c97fd349d534 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/gettext/helpers.rb @@ -0,0 +1,73 @@ +require 'i18n/gettext' + +module I18n + module Gettext + # Implements classical Gettext style accessors. To use this include the + # module to the global namespace or wherever you want to use it. + # + # include I18n::Gettext::Helpers + module Helpers + # Makes dynamic translation messages readable for the gettext parser. + # <tt>_(fruit)</tt> cannot be understood by the gettext parser. To help the parser find all your translations, + # you can add <tt>fruit = N_("Apple")</tt> which does not translate, but tells the parser: "Apple" needs translation. + # * msgid: the message id. + # * Returns: msgid. + def N_(msgsid) + msgsid + end + + def gettext(msgid, options = {}) + I18n.t(msgid, { :default => msgid, :separator => '|' }.merge(options)) + end + alias _ gettext + + def sgettext(msgid, separator = '|') + scope, msgid = I18n::Gettext.extract_scope(msgid, separator) + I18n.t(msgid, :scope => scope, :default => msgid, :separator => separator) + end + alias s_ sgettext + + def pgettext(msgctxt, msgid) + separator = I18n::Gettext::CONTEXT_SEPARATOR + sgettext([msgctxt, msgid].join(separator), separator) + end + alias p_ pgettext + + def ngettext(msgid, msgid_plural, n = 1) + nsgettext(msgid, msgid_plural, n) + end + alias n_ ngettext + + # Method signatures: + # nsgettext('Fruits|apple', 'apples', 2) + # nsgettext(['Fruits|apple', 'apples'], 2) + def nsgettext(msgid, msgid_plural, n = 1, separator = '|') + if msgid.is_a?(Array) + msgid, msgid_plural, n, separator = msgid[0], msgid[1], msgid_plural, n + separator = '|' unless separator.is_a?(::String) + end + + scope, msgid = I18n::Gettext.extract_scope(msgid, separator) + default = { :one => msgid, :other => msgid_plural } + I18n.t(msgid, :default => default, :count => n, :scope => scope, :separator => separator) + end + alias ns_ nsgettext + + # Method signatures: + # npgettext('Fruits', 'apple', 'apples', 2) + # npgettext('Fruits', ['apple', 'apples'], 2) + def npgettext(msgctxt, msgid, msgid_plural, n = 1) + separator = I18n::Gettext::CONTEXT_SEPARATOR + + if msgid.is_a?(Array) + msgid_plural, msgid, n = msgid[1], [msgctxt, msgid[0]].join(separator), msgid_plural + else + msgid = [msgctxt, msgid].join(separator) + end + + nsgettext(msgid, msgid_plural, n, separator) + end + alias np_ npgettext + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/gettext/po_parser.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/gettext/po_parser.rb new file mode 100644 index 000000000000..547df6a59316 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/gettext/po_parser.rb @@ -0,0 +1,329 @@ +=begin + poparser.rb - Generate a .mo + + Copyright (C) 2003-2009 Masao Mutoh <mutoh at highway.ne.jp> + + You may redistribute it and/or modify it under the same + license terms as Ruby. +=end + +#MODIFIED +# removed include GetText etc +# added stub translation method _(x) +require 'racc/parser' + +module GetText + + class PoParser < Racc::Parser + + def _(x) + x + end + +module_eval <<'..end src/poparser.ry modeval..id7a99570e05', 'src/poparser.ry', 108 + def unescape(orig) + ret = orig.gsub(/\\n/, "\n") + ret.gsub!(/\\t/, "\t") + ret.gsub!(/\\r/, "\r") + ret.gsub!(/\\"/, "\"") + ret + end + + def parse(str, data, ignore_fuzzy = true) + @comments = [] + @data = data + @fuzzy = false + @msgctxt = "" + $ignore_fuzzy = ignore_fuzzy + + str.strip! + @q = [] + until str.empty? do + case str + when /\A\s+/ + str = $' + when /\Amsgctxt/ + @q.push [:MSGCTXT, $&] + str = $' + when /\Amsgid_plural/ + @q.push [:MSGID_PLURAL, $&] + str = $' + when /\Amsgid/ + @q.push [:MSGID, $&] + str = $' + when /\Amsgstr/ + @q.push [:MSGSTR, $&] + str = $' + when /\A\[(\d+)\]/ + @q.push [:PLURAL_NUM, $1] + str = $' + when /\A\#~(.*)/ + $stderr.print _("Warning: obsolete msgid exists.\n") + $stderr.print " #{$&}\n" + @q.push [:COMMENT, $&] + str = $' + when /\A\#(.*)/ + @q.push [:COMMENT, $&] + str = $' + when /\A\"(.*)\"/ + @q.push [:STRING, $1] + str = $' + else + #c = str[0,1] + #@q.push [:STRING, c] + str = str[1..-1] + end + end + @q.push [false, '$end'] + if $DEBUG + @q.each do |a,b| + puts "[#{a}, #{b}]" + end + end + @yydebug = true if $DEBUG + do_parse + + if @comments.size > 0 + @data.set_comment(:last, @comments.join("\n")) + end + @data + end + + def next_token + @q.shift + end + + def on_message(msgid, msgstr) + if msgstr.size > 0 + @data[msgid] = msgstr + @data.set_comment(msgid, @comments.join("\n")) + end + @comments.clear + @msgctxt = "" + end + + def on_comment(comment) + @fuzzy = true if (/fuzzy/ =~ comment) + @comments << comment + end + + +..end src/poparser.ry modeval..id7a99570e05 + +##### racc 1.4.5 generates ### + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 10, :_reduce_none, + 2, 10, :_reduce_none, + 2, 10, :_reduce_none, + 2, 10, :_reduce_none, + 2, 12, :_reduce_5, + 1, 13, :_reduce_none, + 1, 13, :_reduce_none, + 4, 15, :_reduce_8, + 5, 16, :_reduce_9, + 2, 17, :_reduce_10, + 1, 17, :_reduce_none, + 3, 18, :_reduce_12, + 1, 11, :_reduce_13, + 2, 14, :_reduce_14, + 1, 14, :_reduce_15 ] + +racc_reduce_n = 16 + +racc_shift_n = 26 + +racc_action_table = [ + 3, 13, 5, 7, 9, 15, 16, 17, 20, 17, + 13, 17, 13, 13, 11, 17, 23, 20, 13, 17 ] + +racc_action_check = [ + 1, 16, 1, 1, 1, 12, 12, 12, 18, 18, + 7, 14, 15, 9, 3, 19, 20, 21, 23, 25 ] + +racc_action_pointer = [ + nil, 0, nil, 14, nil, nil, nil, 3, nil, 6, + nil, nil, 0, nil, 4, 5, -6, nil, 2, 8, + 8, 11, nil, 11, nil, 12 ] + +racc_action_default = [ + -1, -16, -2, -16, -3, -13, -4, -16, -6, -16, + -7, 26, -16, -15, -5, -16, -16, -14, -16, -8, + -16, -9, -11, -16, -10, -12 ] + +racc_goto_table = [ + 12, 22, 14, 4, 24, 6, 2, 8, 18, 19, + 10, 21, 1, nil, nil, nil, 25 ] + +racc_goto_check = [ + 5, 9, 5, 3, 9, 4, 2, 6, 5, 5, + 7, 8, 1, nil, nil, nil, 5 ] + +racc_goto_pointer = [ + nil, 12, 5, 2, 4, -7, 6, 9, -7, -17 ] + +racc_goto_default = [ + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil ] + +racc_token_table = { + false => 0, + Object.new => 1, + :COMMENT => 2, + :MSGID => 3, + :MSGCTXT => 4, + :MSGID_PLURAL => 5, + :MSGSTR => 6, + :STRING => 7, + :PLURAL_NUM => 8 } + +racc_use_result_var = true + +racc_nt_base = 9 + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ +'$end', +'error', +'COMMENT', +'MSGID', +'MSGCTXT', +'MSGID_PLURAL', +'MSGSTR', +'STRING', +'PLURAL_NUM', +'$start', +'msgfmt', +'comment', +'msgctxt', +'message', +'string_list', +'single_message', +'plural_message', +'msgstr_plural', +'msgstr_plural_line'] + +Racc_debug_parser = true + +##### racc system variables end ##### + + # reduce 0 omitted + + # reduce 1 omitted + + # reduce 2 omitted + + # reduce 3 omitted + + # reduce 4 omitted + +module_eval <<'.,.,', 'src/poparser.ry', 25 + def _reduce_5( val, _values, result ) + @msgctxt = unescape(val[1]) + "\004" + result + end +.,., + + # reduce 6 omitted + + # reduce 7 omitted + +module_eval <<'.,.,', 'src/poparser.ry', 48 + def _reduce_8( val, _values, result ) + if @fuzzy and $ignore_fuzzy + if val[1] != "" + $stderr.print _("Warning: fuzzy message was ignored.\n") + $stderr.print " msgid '#{val[1]}'\n" + else + on_message('', unescape(val[3])) + end + @fuzzy = false + else + on_message(@msgctxt + unescape(val[1]), unescape(val[3])) + end + result = "" + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 65 + def _reduce_9( val, _values, result ) + if @fuzzy and $ignore_fuzzy + if val[1] != "" + $stderr.print _("Warning: fuzzy message was ignored.\n") + $stderr.print "msgid = '#{val[1]}\n" + else + on_message('', unescape(val[3])) + end + @fuzzy = false + else + on_message(@msgctxt + unescape(val[1]) + "\000" + unescape(val[3]), unescape(val[4])) + end + result = "" + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 76 + def _reduce_10( val, _values, result ) + if val[0].size > 0 + result = val[0] + "\000" + val[1] + else + result = "" + end + result + end +.,., + + # reduce 11 omitted + +module_eval <<'.,.,', 'src/poparser.ry', 84 + def _reduce_12( val, _values, result ) + result = val[2] + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 91 + def _reduce_13( val, _values, result ) + on_comment(val[0]) + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 99 + def _reduce_14( val, _values, result ) + result = val.delete_if{|item| item == ""}.join + result + end +.,., + +module_eval <<'.,.,', 'src/poparser.ry', 103 + def _reduce_15( val, _values, result ) + result = val[0] + result + end +.,., + + def _reduce_none( val, _values, result ) + result + end + + end # class PoParser + +end # module GetText diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/interpolate/ruby.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/interpolate/ruby.rb new file mode 100644 index 000000000000..d2fdda75ec7c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/interpolate/ruby.rb @@ -0,0 +1,37 @@ +# heavily based on Masao Mutoh's gettext String interpolation extension +# http://github.com/mutoh/gettext/blob/f6566738b981fe0952548c421042ad1e0cdfb31e/lib/gettext/core_ext/string.rb + +module I18n + INTERPOLATION_PATTERN = Regexp.union( + /%%/, + /%\{(\w+)\}/, # matches placeholders like "%{foo}" + /%<(\w+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/ # matches placeholders like "%<foo>.d" + ) + + class << self + # Return String or raises MissingInterpolationArgument exception. + # Missing argument's logic is handled by I18n.config.missing_interpolation_argument_handler. + def interpolate(string, values) + raise ReservedInterpolationKey.new($1.to_sym, string) if string =~ RESERVED_KEYS_PATTERN + raise ArgumentError.new('Interpolation values must be a Hash.') unless values.kind_of?(Hash) + interpolate_hash(string, values) + end + + def interpolate_hash(string, values) + string.gsub(INTERPOLATION_PATTERN) do |match| + if match == '%%' + '%' + else + key = ($1 || $2 || match.tr("%{}", "")).to_sym + value = if values.key?(key) + values[key] + else + config.missing_interpolation_argument_handler.call(key, values, string) + end + value = value.call(values) if value.respond_to?(:call) + $3 ? sprintf("%#{$3}", value) : value + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale.rb new file mode 100644 index 000000000000..4f9d0266d546 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale.rb @@ -0,0 +1,6 @@ +module I18n + module Locale + autoload :Fallbacks, 'i18n/locale/fallbacks' + autoload :Tag, 'i18n/locale/tag' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/fallbacks.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/fallbacks.rb new file mode 100644 index 000000000000..08bf6f5508f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/fallbacks.rb @@ -0,0 +1,96 @@ +# Locale Fallbacks +# +# Extends the I18n module to hold a fallbacks instance which is set to an +# instance of I18n::Locale::Fallbacks by default but can be swapped with a +# different implementation. +# +# Locale fallbacks will compute a number of fallback locales for a given locale. +# For example: +# +# <pre><code> +# I18n.fallbacks[:"es-MX"] # => [:"es-MX", :es, :en] </code></pre> +# +# Locale fallbacks always fall back to +# +# * all parent locales of a given locale (e.g. :es for :"es-MX") first, +# * the current default locales and all of their parents second +# +# The default locales are set to [I18n.default_locale] by default but can be +# set to something else. +# +# One can additionally add any number of additional fallback locales manually. +# These will be added before the default locales to the fallback chain. For +# example: +# +# # using the default locale as default fallback locale +# +# I18n.default_locale = :"en-US" +# I18n.fallbacks = I18n::Locale::Fallbacks.new(:"de-AT" => :"de-DE") +# I18n.fallbacks[:"de-AT"] # => [:"de-AT", :"de-DE", :de, :"en-US", :en] +# +# # using a custom locale as default fallback locale +# +# I18n.fallbacks = I18n::Locale::Fallbacks.new(:"en-GB", :"de-AT" => :de, :"de-CH" => :de) +# I18n.fallbacks[:"de-AT"] # => [:"de-AT", :de, :"en-GB", :en] +# I18n.fallbacks[:"de-CH"] # => [:"de-CH", :de, :"en-GB", :en] +# +# # mapping fallbacks to an existing instance +# +# # people speaking Catalan also speak Spanish as spoken in Spain +# fallbacks = I18n.fallbacks +# fallbacks.map(:ca => :"es-ES") +# fallbacks[:ca] # => [:ca, :"es-ES", :es, :"en-US", :en] +# +# # people speaking Arabian as spoken in Palestine also speak Hebrew as spoken in Israel +# fallbacks.map(:"ar-PS" => :"he-IL") +# fallbacks[:"ar-PS"] # => [:"ar-PS", :ar, :"he-IL", :he, :"en-US", :en] +# fallbacks[:"ar-EG"] # => [:"ar-EG", :ar, :"en-US", :en] +# +# # people speaking Sami as spoken in Finnland also speak Swedish and Finnish as spoken in Finnland +# fallbacks.map(:sms => [:"se-FI", :"fi-FI"]) +# fallbacks[:sms] # => [:sms, :"se-FI", :se, :"fi-FI", :fi, :"en-US", :en] + +module I18n + module Locale + class Fallbacks < Hash + def initialize(*mappings) + @map = {} + map(mappings.pop) if mappings.last.is_a?(Hash) + self.defaults = mappings.empty? ? [I18n.default_locale.to_sym] : mappings + end + + def defaults=(defaults) + @defaults = defaults.map { |default| compute(default, false) }.flatten + end + attr_reader :defaults + + def [](locale) + raise InvalidLocale.new(locale) if locale.nil? + locale = locale.to_sym + super || store(locale, compute(locale)) + end + + def map(mappings) + mappings.each do |from, to| + from, to = from.to_sym, Array(to) + to.each do |_to| + @map[from] ||= [] + @map[from] << _to.to_sym + end + end + end + + protected + + def compute(tags, include_defaults = true, exclude = []) + result = Array(tags).collect do |tag| + tags = I18n::Locale::Tag.tag(tag).self_and_parents.map! { |t| t.to_sym } - exclude + tags.each { |_tag| tags += compute(@map[_tag], false, exclude + tags) if @map[_tag] } + tags + end.flatten + result.push(*defaults) if include_defaults + result.uniq.compact + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag.rb new file mode 100644 index 000000000000..a640b4465f6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag.rb @@ -0,0 +1,28 @@ +# encoding: utf-8 + +module I18n + module Locale + module Tag + autoload :Parents, 'i18n/locale/tag/parents' + autoload :Rfc4646, 'i18n/locale/tag/rfc4646' + autoload :Simple, 'i18n/locale/tag/simple' + + class << self + # Returns the current locale tag implementation. Defaults to +I18n::Locale::Tag::Simple+. + def implementation + @@implementation ||= Simple + end + + # Sets the current locale tag implementation. Use this to set a different locale tag implementation. + def implementation=(implementation) + @@implementation = implementation + end + + # Factory method for locale tags. Delegates to the current locale tag implementation. + def tag(tag) + implementation.tag(tag) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag/parents.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag/parents.rb new file mode 100644 index 000000000000..ec53060f9cd8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag/parents.rb @@ -0,0 +1,22 @@ +module I18n + module Locale + module Tag + module Parents + def parent + @parent ||= begin + segs = to_a.compact + segs.length > 1 ? self.class.tag(*segs[0..(segs.length-2)].join('-')) : nil + end + end + + def self_and_parents + @self_and_parents ||= [self] + parents + end + + def parents + @parents ||= ([parent] + (parent ? parent.parents : [])).compact + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag/rfc4646.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag/rfc4646.rb new file mode 100644 index 000000000000..4ce4c751ae11 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag/rfc4646.rb @@ -0,0 +1,74 @@ +# RFC 4646/47 compliant Locale tag implementation that parses locale tags to +# subtags such as language, script, region, variant etc. +# +# For more information see by http://en.wikipedia.org/wiki/IETF_language_tag +# +# Rfc4646::Parser does not implement grandfathered tags. + +module I18n + module Locale + module Tag + RFC4646_SUBTAGS = [ :language, :script, :region, :variant, :extension, :privateuse, :grandfathered ] + RFC4646_FORMATS = { :language => :downcase, :script => :capitalize, :region => :upcase, :variant => :downcase } + + class Rfc4646 < Struct.new(*RFC4646_SUBTAGS) + class << self + # Parses the given tag and returns a Tag instance if it is valid. + # Returns false if the given tag is not valid according to RFC 4646. + def tag(tag) + matches = parser.match(tag) + new(*matches) if matches + end + + def parser + @@parser ||= Rfc4646::Parser + end + + def parser=(parser) + @@parser = parser + end + end + + include Parents + + RFC4646_FORMATS.each do |name, format| + define_method(name) { self[name].send(format) unless self[name].nil? } + end + + def to_sym + to_s.to_sym + end + + def to_s + @tag ||= to_a.compact.join("-") + end + + def to_a + members.collect { |attr| self.send(attr) } + end + + module Parser + PATTERN = %r{\A(?: + ([a-z]{2,3}(?:(?:-[a-z]{3}){0,3})?|[a-z]{4}|[a-z]{5,8}) # language + (?:-([a-z]{4}))? # script + (?:-([a-z]{2}|\d{3}))? # region + (?:-([0-9a-z]{5,8}|\d[0-9a-z]{3}))* # variant + (?:-([0-9a-wyz](?:-[0-9a-z]{2,8})+))* # extension + (?:-(x(?:-[0-9a-z]{1,8})+))?| # privateuse subtag + (x(?:-[0-9a-z]{1,8})+)| # privateuse tag + /* ([a-z]{1,3}(?:-[0-9a-z]{2,8}){1,2}) */ # grandfathered + )\z}xi + + class << self + def match(tag) + c = PATTERN.match(tag.to_s).captures + c[0..4] << (c[5].nil? ? c[6] : c[5]) << c[7] # TODO c[7] is grandfathered, throw a NotImplemented exception here? + rescue + false + end + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag/simple.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag/simple.rb new file mode 100644 index 000000000000..68642a123f18 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/locale/tag/simple.rb @@ -0,0 +1,39 @@ +# Simple Locale tag implementation that computes subtags by simply splitting +# the locale tag at '-' occurences. +module I18n + module Locale + module Tag + class Simple + class << self + def tag(tag) + new(tag) + end + end + + include Parents + + attr_reader :tag + + def initialize(*tag) + @tag = tag.join('-').to_sym + end + + def subtags + @subtags = tag.to_s.split('-').map { |subtag| subtag.to_s } + end + + def to_sym + tag + end + + def to_s + tag.to_s + end + + def to_a + subtags + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/middleware.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/middleware.rb new file mode 100644 index 000000000000..67461f7a5efd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/middleware.rb @@ -0,0 +1,15 @@ +module I18n + class Middleware + + def initialize(app) + @app = app + end + + def call(env) + @app.call(env) + ensure + Thread.current[:i18n_config] = I18n::Config.new + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests.rb new file mode 100644 index 000000000000..554cdefea089 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests.rb @@ -0,0 +1,12 @@ +module I18n + module Tests + autoload :Basics, 'i18n/tests/basics' + autoload :Defaults, 'i18n/tests/defaults' + autoload :Interpolation, 'i18n/tests/interpolation' + autoload :Link, 'i18n/tests/link' + autoload :Localization, 'i18n/tests/localization' + autoload :Lookup, 'i18n/tests/lookup' + autoload :Pluralization, 'i18n/tests/pluralization' + autoload :Procs, 'i18n/tests/procs' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/basics.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/basics.rb new file mode 100644 index 000000000000..951d7ab5db35 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/basics.rb @@ -0,0 +1,60 @@ +module I18n + module Tests + module Basics + def teardown + I18n.available_locales = nil + end + + test "available_locales returns the locales stored to the backend by default" do + I18n.backend.store_translations('de', :foo => 'bar') + I18n.backend.store_translations('en', :foo => 'foo') + + assert I18n.available_locales.include?(:de) + assert I18n.available_locales.include?(:en) + end + + test "available_locales can be set to something else independently from the actual locale data" do + I18n.backend.store_translations('de', :foo => 'bar') + I18n.backend.store_translations('en', :foo => 'foo') + + I18n.available_locales = :foo + assert_equal [:foo], I18n.available_locales + + I18n.available_locales = [:foo, 'bar'] + assert_equal [:foo, :bar], I18n.available_locales + + I18n.available_locales = nil + assert I18n.available_locales.include?(:de) + assert I18n.available_locales.include?(:en) + end + + test "available_locales memoizes when set explicitely" do + I18n.backend.expects(:available_locales).never + I18n.available_locales = [:foo] + I18n.backend.store_translations('de', :bar => 'baz') + I18n.reload! + assert_equal [:foo], I18n.available_locales + end + + test "available_locales delegates to the backend when not set explicitely" do + original_available_locales_value = I18n.backend.available_locales + I18n.backend.expects(:available_locales).returns(original_available_locales_value).twice + assert_equal I18n.backend.available_locales, I18n.available_locales + end + + test "exists? is implemented by the backend" do + I18n.backend.store_translations(:foo, :bar => 'baz') + assert I18n.exists?(:bar, :foo) + end + + test "storing a nil value as a translation removes it from the available locale data" do + I18n.backend.store_translations(:en, :to_be_deleted => 'bar') + assert_equal 'bar', I18n.t(:to_be_deleted, :default => 'baz') + + I18n.cache_store.clear if I18n.respond_to?(:cache_store) && I18n.cache_store + I18n.backend.store_translations(:en, :to_be_deleted => nil) + assert_equal 'baz', I18n.t(:to_be_deleted, :default => 'baz') + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/defaults.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/defaults.rb new file mode 100644 index 000000000000..b46af61f0d9b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/defaults.rb @@ -0,0 +1,52 @@ +# encoding: utf-8 + +module I18n + module Tests + module Defaults + def setup + super + I18n.backend.store_translations(:en, :foo => { :bar => 'bar', :baz => 'baz' }) + end + + test "defaults: given nil as a key it returns the given default" do + assert_equal 'default', I18n.t(nil, :default => 'default') + end + + test "defaults: given a symbol as a default it translates the symbol" do + assert_equal 'bar', I18n.t(nil, :default => :'foo.bar') + end + + test "defaults: given a symbol as a default and a scope it stays inside the scope when looking up the symbol" do + assert_equal 'bar', I18n.t(:missing, :default => :bar, :scope => :foo) + end + + test "defaults: given an array as a default it returns the first match" do + assert_equal 'bar', I18n.t(:does_not_exist, :default => [:does_not_exist_2, :'foo.bar']) + end + + test "defaults: given an array as a default with false it returns false" do + assert_equal false, I18n.t(:does_not_exist, :default => [false]) + end + + test "defaults: given false it returns false" do + assert_equal false, I18n.t(:does_not_exist, :default => false) + end + + test "defaults: given nil it returns nil" do + assert_nil I18n.t(:does_not_exist, :default => nil) + end + + test "defaults: given an array of missing keys it raises a MissingTranslationData exception" do + assert_raise I18n::MissingTranslationData do + I18n.t(:does_not_exist, :default => [:does_not_exist_2, :does_not_exist_3], :raise => true) + end + end + + test "defaults: using a custom scope separator" do + # data must have been stored using the custom separator when using the ActiveRecord backend + I18n.backend.store_translations(:en, { :foo => { :bar => 'bar' } }, { :separator => '|' }) + assert_equal 'bar', I18n.t(nil, :default => :'foo|bar', :separator => '|') + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/interpolation.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/interpolation.rb new file mode 100644 index 000000000000..27c99c3b3860 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/interpolation.rb @@ -0,0 +1,158 @@ +# encoding: utf-8 + +module I18n + module Tests + module Interpolation + # If no interpolation parameter is not given, I18n should not alter the string. + # This behavior is due to three reasons: + # + # * Checking interpolation keys in all strings hits performance, badly; + # + # * This allows us to retrieve untouched values through I18n. For example + # I could have a middleware that returns I18n lookup results in JSON + # to be processed through Javascript. Leaving the keys untouched allows + # the interpolation to happen at the javascript level; + # + # * Security concerns: if I allow users to translate a web site, they can + # insert %{} in messages causing the I18n lookup to fail in every request. + # + test "interpolation: given no values it does not alter the string" do + assert_equal 'Hi %{name}!', interpolate(:default => 'Hi %{name}!') + end + + test "interpolation: given values it interpolates them into the string" do + assert_equal 'Hi David!', interpolate(:default => 'Hi %{name}!', :name => 'David') + end + + test "interpolation: given a nil value it still interpolates it into the string" do + assert_equal 'Hi !', interpolate(:default => 'Hi %{name}!', :name => nil) + end + + test "interpolation: given a lambda as a value it calls it if the string contains the key" do + assert_equal 'Hi David!', interpolate(:default => 'Hi %{name}!', :name => lambda { |*args| 'David' }) + end + + test "interpolation: given a lambda as a value it does not call it if the string does not contain the key" do + assert_nothing_raised { interpolate(:default => 'Hi!', :name => lambda { |*args| raise 'fail' }) } + end + + test "interpolation: given values but missing a key it raises I18n::MissingInterpolationArgument" do + assert_raise(I18n::MissingInterpolationArgument) do + interpolate(:default => '%{foo}', :bar => 'bar') + end + end + + test "interpolation: it does not raise I18n::MissingInterpolationArgument for escaped variables" do + assert_nothing_raised(I18n::MissingInterpolationArgument) do + assert_equal 'Barr %{foo}', interpolate(:default => '%{bar} %%{foo}', :bar => 'Barr') + end + end + + test "interpolation: it does not change the original, stored translation string" do + I18n.backend.store_translations(:en, :interpolate => 'Hi %{name}!') + assert_equal 'Hi David!', interpolate(:interpolate, :name => 'David') + assert_equal 'Hi Yehuda!', interpolate(:interpolate, :name => 'Yehuda') + end + + test "interpolation: given an array interpolates each element" do + I18n.backend.store_translations(:en, :array_interpolate => ['Hi', 'Mr. %{name}', 'or sir %{name}']) + assert_equal ['Hi', 'Mr. Bartuz', 'or sir Bartuz'], interpolate(:array_interpolate, :name => 'Bartuz') + end + + test "interpolation: given the translation is in utf-8 it still works" do + assert_equal 'Häi David!', interpolate(:default => 'Häi %{name}!', :name => 'David') + end + + test "interpolation: given the value is in utf-8 it still works" do + assert_equal 'Hi ゆきひろ!', interpolate(:default => 'Hi %{name}!', :name => 'ゆきひろ') + end + + test "interpolation: given the translation and the value are in utf-8 it still works" do + assert_equal 'こんにちは、ゆきひろさん!', interpolate(:default => 'こんにちは、%{name}さん!', :name => 'ゆきひろ') + end + + if Object.const_defined?(:Encoding) + test "interpolation: given a euc-jp translation and a utf-8 value it raises Encoding::CompatibilityError" do + assert_raise(Encoding::CompatibilityError) do + interpolate(:default => euc_jp('こんにちは、%{name}さん!'), :name => 'ゆきひろ') + end + end + + test "interpolation: given a utf-8 translation and a euc-jp value it raises Encoding::CompatibilityError" do + assert_raise(Encoding::CompatibilityError) do + interpolate(:default => 'こんにちは、%{name}さん!', :name => euc_jp('ゆきひろ')) + end + end + + test "interpolation: ASCII strings in the backend should be encoded to UTF8 if interpolation options are in UTF8" do + I18n.backend.store_translations 'en', 'encoding' => ('%{who} let me go'.force_encoding("ASCII")) + result = I18n.t 'encoding', :who => "måmmå miå" + assert_equal Encoding::UTF_8, result.encoding + end + + test "interpolation: UTF8 strings in the backend are still returned as UTF8 with ASCII interpolation" do + I18n.backend.store_translations 'en', 'encoding' => 'måmmå miå %{what}' + result = I18n.t 'encoding', :what => 'let me go'.force_encoding("ASCII") + assert_equal Encoding::UTF_8, result.encoding + end + + test "interpolation: UTF8 strings in the backend are still returned as UTF8 even with numbers interpolation" do + I18n.backend.store_translations 'en', 'encoding' => '%{count} times: måmmå miå' + result = I18n.t 'encoding', :count => 3 + assert_equal Encoding::UTF_8, result.encoding + end + end + + test "interpolation: given a translations containing a reserved key it raises I18n::ReservedInterpolationKey" do + assert_raise(I18n::ReservedInterpolationKey) { interpolate(:default => '%{default}', :foo => :bar) } + assert_raise(I18n::ReservedInterpolationKey) { interpolate(:default => '%{scope}', :foo => :bar) } + assert_raise(I18n::ReservedInterpolationKey) { interpolate(:default => '%{separator}', :foo => :bar) } + end + + test "interpolation: deep interpolation for default string" do + assert_equal 'Hi %{name}!', interpolate(:default => 'Hi %{name}!', :deep_interpolation => true) + end + + test "interpolation: deep interpolation for interpolated string" do + assert_equal 'Hi Ann!', interpolate(:default => 'Hi %{name}!', :name => 'Ann', :deep_interpolation => true) + end + + test "interpolation: deep interpolation for Hash" do + people = { :people => { :ann => 'Ann is %{ann}', :john => 'John is %{john}' } } + interpolated_people = { :people => { :ann => 'Ann is good', :john => 'John is big' } } + assert_equal interpolated_people, interpolate(:default => people, :ann => 'good', :john => 'big', :deep_interpolation => true) + end + + test "interpolation: deep interpolation for Array" do + people = { :people => ['Ann is %{ann}', 'John is %{john}'] } + interpolated_people = { :people => ['Ann is good', 'John is big'] } + assert_equal interpolated_people, interpolate(:default => people, :ann => 'good', :john => 'big', :deep_interpolation => true) + end + + protected + + def capture(stream) + begin + stream = stream.to_s + eval "$#{stream} = StringIO.new" + yield + result = eval("$#{stream}").string + ensure + eval("$#{stream} = #{stream.upcase}") + end + + result + end + + def euc_jp(string) + string.encode!(Encoding::EUC_JP) + end + + def interpolate(*args) + options = args.last.is_a?(Hash) ? args.pop : {} + key = args.pop + I18n.backend.translate('en', key, options) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/link.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/link.rb new file mode 100644 index 000000000000..da84a2c8434b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/link.rb @@ -0,0 +1,56 @@ +# encoding: utf-8 + +module I18n + module Tests + module Link + test "linked lookup: if a key resolves to a symbol it looks up the symbol" do + I18n.backend.store_translations 'en', { + :link => :linked, + :linked => 'linked' + } + assert_equal 'linked', I18n.backend.translate('en', :link) + end + + test "linked lookup: if a key resolves to a dot-separated symbol it looks up the symbol" do + I18n.backend.store_translations 'en', { + :link => :"foo.linked", + :foo => { :linked => 'linked' } + } + assert_equal('linked', I18n.backend.translate('en', :link)) + end + + test "linked lookup: if a dot-separated key resolves to a symbol it looks up the symbol" do + I18n.backend.store_translations 'en', { + :foo => { :link => :linked }, + :linked => 'linked' + } + assert_equal('linked', I18n.backend.translate('en', :'foo.link')) + end + + test "linked lookup: if a dot-separated key resolves to a dot-separated symbol it looks up the symbol" do + I18n.backend.store_translations 'en', { + :foo => { :link => :"bar.linked" }, + :bar => { :linked => 'linked' } + } + assert_equal('linked', I18n.backend.translate('en', :'foo.link')) + end + + test "linked lookup: links always refer to the absolute key" do + I18n.backend.store_translations 'en', { + :foo => { :link => :linked, :linked => 'linked in foo' }, + :linked => 'linked absolutely' + } + assert_equal 'linked absolutely', I18n.backend.translate('en', :link, :scope => :foo) + end + + test "linked lookup: a link can resolve to a namespace in the middle of a dot-separated key" do + I18n.backend.store_translations 'en', { + :activemodel => { :errors => { :messages => { :blank => "can't be blank" } } }, + :activerecord => { :errors => { :messages => :"activemodel.errors.messages" } } + } + assert_equal "can't be blank", I18n.t(:"activerecord.errors.messages.blank") + assert_equal "can't be blank", I18n.t(:"activerecord.errors.messages.blank") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization.rb new file mode 100644 index 000000000000..53b15029dab3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization.rb @@ -0,0 +1,19 @@ +module I18n + module Tests + module Localization + autoload :Date, 'i18n/tests/localization/date' + autoload :DateTime, 'i18n/tests/localization/date_time' + autoload :Time, 'i18n/tests/localization/time' + autoload :Procs, 'i18n/tests/localization/procs' + + def self.included(base) + base.class_eval do + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Procs + include I18n::Tests::Localization::Time + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/date.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/date.rb new file mode 100644 index 000000000000..fba5fe5c0b2a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/date.rb @@ -0,0 +1,95 @@ +# encoding: utf-8 + +module I18n + module Tests + module Localization + module Date + def setup + super + setup_date_translations + @date = ::Date.new(2008, 3, 1) + end + + test "localize Date: given the short format it uses it" do + # TODO should be Mrz, shouldn't it? + assert_equal '01. Mar', I18n.l(@date, :format => :short, :locale => :de) + end + + test "localize Date: given the long format it uses it" do + assert_equal '01. März 2008', I18n.l(@date, :format => :long, :locale => :de) + end + + test "localize Date: given the default format it uses it" do + assert_equal '01.03.2008', I18n.l(@date, :format => :default, :locale => :de) + end + + test "localize Date: given a day name format it returns the correct day name" do + assert_equal 'Samstag', I18n.l(@date, :format => '%A', :locale => :de) + end + + test "localize Date: given an abbreviated day name format it returns the correct abbreviated day name" do + assert_equal 'Sa', I18n.l(@date, :format => '%a', :locale => :de) + end + + test "localize Date: given a month name format it returns the correct month name" do + assert_equal 'März', I18n.l(@date, :format => '%B', :locale => :de) + end + + test "localize Date: given an abbreviated month name format it returns the correct abbreviated month name" do + # TODO should be Mrz, shouldn't it? + assert_equal 'Mar', I18n.l(@date, :format => '%b', :locale => :de) + end + + test "localize Date: given an unknown format it does not fail" do + assert_nothing_raised { I18n.l(@date, :format => '%x') } + end + + test "localize Date: does not modify the options hash" do + options = { :format => '%b', :locale => :de } + assert_equal 'Mar', I18n.l(@date, options) + assert_equal({ :format => '%b', :locale => :de }, options) + assert_nothing_raised { I18n.l(@date, options.freeze) } + end + + test "localize Date: given nil with default value it returns default" do + assert_equal 'default', I18n.l(nil, :default => 'default') + end + + test "localize Date: given nil it raises I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.l(nil) } + end + + test "localize Date: given a plain Object it raises I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.l(Object.new) } + end + + test "localize Date: given a format is missing it raises I18n::MissingTranslationData" do + assert_raise(I18n::MissingTranslationData) { I18n.l(@date, :format => :missing) } + end + + test "localize Date: it does not alter the format string" do + assert_equal '01. Februar 2009', I18n.l(::Date.parse('2009-02-01'), :format => :long, :locale => :de) + assert_equal '01. Oktober 2009', I18n.l(::Date.parse('2009-10-01'), :format => :long, :locale => :de) + end + + protected + + def setup_date_translations + I18n.backend.store_translations :de, { + :date => { + :formats => { + :default => "%d.%m.%Y", + :short => "%d. %b", + :long => "%d. %B %Y", + }, + :day_names => %w(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag), + :abbr_day_names => %w(So Mo Di Mi Do Fr Sa), + :month_names => %w(Januar Februar März April Mai Juni Juli August September Oktober November Dezember).unshift(nil), + :abbr_month_names => %w(Jan Feb Mar Apr Mai Jun Jul Aug Sep Okt Nov Dez).unshift(nil) + } + } + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/date_time.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/date_time.rb new file mode 100644 index 000000000000..7a30bff49184 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/date_time.rb @@ -0,0 +1,82 @@ +# encoding: utf-8 + +module I18n + module Tests + module Localization + module DateTime + def setup + super + setup_datetime_translations + @datetime = ::DateTime.new(2008, 3, 1, 6) + @other_datetime = ::DateTime.new(2008, 3, 1, 18) + end + + test "localize DateTime: given the short format it uses it" do + # TODO should be Mrz, shouldn't it? + assert_equal '01. Mar 06:00', I18n.l(@datetime, :format => :short, :locale => :de) + end + + test "localize DateTime: given the long format it uses it" do + assert_equal '01. März 2008 06:00', I18n.l(@datetime, :format => :long, :locale => :de) + end + + test "localize DateTime: given the default format it uses it" do + # TODO should be Mrz, shouldn't it? + assert_equal 'Sa, 01. Mar 2008 06:00:00 +0000', I18n.l(@datetime, :format => :default, :locale => :de) + end + + test "localize DateTime: given a day name format it returns the correct day name" do + assert_equal 'Samstag', I18n.l(@datetime, :format => '%A', :locale => :de) + end + + test "localize DateTime: given an abbreviated day name format it returns the correct abbreviated day name" do + assert_equal 'Sa', I18n.l(@datetime, :format => '%a', :locale => :de) + end + + test "localize DateTime: given a month name format it returns the correct month name" do + assert_equal 'März', I18n.l(@datetime, :format => '%B', :locale => :de) + end + + test "localize DateTime: given an abbreviated month name format it returns the correct abbreviated month name" do + # TODO should be Mrz, shouldn't it? + assert_equal 'Mar', I18n.l(@datetime, :format => '%b', :locale => :de) + end + + test "localize DateTime: given a meridian indicator format it returns the correct meridian indicator" do + assert_equal 'AM', I18n.l(@datetime, :format => '%p', :locale => :de) + assert_equal 'PM', I18n.l(@other_datetime, :format => '%p', :locale => :de) + end + + test "localize DateTime: given a meridian indicator format it returns the correct meridian indicator in downcase" do + assert_equal 'am', I18n.l(@datetime, :format => '%P', :locale => :de) + assert_equal 'pm', I18n.l(@other_datetime, :format => '%P', :locale => :de) + end + + test "localize DateTime: given an unknown format it does not fail" do + assert_nothing_raised { I18n.l(@datetime, :format => '%x') } + end + + test "localize DateTime: given a format is missing it raises I18n::MissingTranslationData" do + assert_raise(I18n::MissingTranslationData) { I18n.l(@datetime, :format => :missing) } + end + + protected + + def setup_datetime_translations + # time translations might have been set up in Tests::Api::Localization::Time + I18n.backend.store_translations :de, { + :time => { + :formats => { + :default => "%a, %d. %b %Y %H:%M:%S %z", + :short => "%d. %b %H:%M", + :long => "%d. %B %Y %H:%M" + }, + :am => 'am', + :pm => 'pm' + } + } + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/procs.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/procs.rb new file mode 100644 index 000000000000..de62488862b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/procs.rb @@ -0,0 +1,116 @@ +# encoding: utf-8 + +module I18n + module Tests + module Localization + module Procs + test "localize: using day names from lambdas" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + assert_match(/Суббота/, I18n.l(time, :format => "%A, %d %B", :locale => :ru)) + assert_match(/суббота/, I18n.l(time, :format => "%d %B (%A)", :locale => :ru)) + end + + test "localize: using month names from lambdas" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + assert_match(/марта/, I18n.l(time, :format => "%d %B %Y", :locale => :ru)) + assert_match(/Март /, I18n.l(time, :format => "%B %Y", :locale => :ru)) + end + + test "localize: using abbreviated day names from lambdas" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + assert_match(/марта/, I18n.l(time, :format => "%d %b %Y", :locale => :ru)) + assert_match(/март /, I18n.l(time, :format => "%b %Y", :locale => :ru)) + end + + test "localize Date: given a format that resolves to a Proc it calls the Proc with the object" do + setup_time_proc_translations + date = ::Date.new(2008, 3, 1) + assert_equal '[Sat, 01 Mar 2008, {}]', I18n.l(date, :format => :proc, :locale => :ru) + end + + test "localize Date: given a format that resolves to a Proc it calls the Proc with the object and extra options" do + setup_time_proc_translations + date = ::Date.new(2008, 3, 1) + assert_equal '[Sat, 01 Mar 2008, {:foo=>"foo"}]', I18n.l(date, :format => :proc, :foo => 'foo', :locale => :ru) + end + + test "localize DateTime: given a format that resolves to a Proc it calls the Proc with the object" do + setup_time_proc_translations + datetime = ::DateTime.new(2008, 3, 1, 6) + assert_equal '[Sat, 01 Mar 2008 06:00:00 +00:00, {}]', I18n.l(datetime, :format => :proc, :locale => :ru) + end + + test "localize DateTime: given a format that resolves to a Proc it calls the Proc with the object and extra options" do + setup_time_proc_translations + datetime = ::DateTime.new(2008, 3, 1, 6) + assert_equal '[Sat, 01 Mar 2008 06:00:00 +00:00, {:foo=>"foo"}]', I18n.l(datetime, :format => :proc, :foo => 'foo', :locale => :ru) + end + + test "localize Time: given a format that resolves to a Proc it calls the Proc with the object" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + assert_equal I18n::Tests::Localization::Procs.inspect_args([time, {}]), I18n.l(time, :format => :proc, :locale => :ru) + end + + test "localize Time: given a format that resolves to a Proc it calls the Proc with the object and extra options" do + setup_time_proc_translations + time = ::Time.utc(2008, 3, 1, 6, 0) + options = { :foo => 'foo' } + assert_equal I18n::Tests::Localization::Procs.inspect_args([time, options]), I18n.l(time, options.merge(:format => :proc, :locale => :ru)) + end + + protected + + def self.inspect_args(args) + args = args.map do |arg| + case arg + when ::Time, ::DateTime + arg.strftime('%a, %d %b %Y %H:%M:%S %Z').sub('+0000', '+00:00') + when ::Date + arg.strftime('%a, %d %b %Y') + when Hash + arg.delete(:fallback_in_progress) + arg.inspect + else + arg.inspect + end + end + "[#{args.join(', ')}]" + end + + def setup_time_proc_translations + I18n.backend.store_translations :ru, { + :time => { + :formats => { + :proc => lambda { |*args| I18n::Tests::Localization::Procs.inspect_args(args) } + } + }, + :date => { + :formats => { + :proc => lambda { |*args| I18n::Tests::Localization::Procs.inspect_args(args) } + }, + :'day_names' => lambda { |key, options| + (options[:format] =~ /^%A/) ? + %w(Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота) : + %w(воскресенье понедельник вторник среда четверг пятница суббота) + }, + :'month_names' => lambda { |key, options| + (options[:format] =~ /(%d|%e)(\s*)?(%B)/) ? + %w(января февраля марта апреля мая июня июля августа сентября октября ноября декабря).unshift(nil) : + %w(Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь).unshift(nil) + }, + :'abbr_month_names' => lambda { |key, options| + (options[:format] =~ /(%d|%e)(\s*)(%b)/) ? + %w(янв. февр. марта апр. мая июня июля авг. сент. окт. нояб. дек.).unshift(nil) : + %w(янв. февр. март апр. май июнь июль авг. сент. окт. нояб. дек.).unshift(nil) + }, + } + } + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/time.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/time.rb new file mode 100644 index 000000000000..8bbba43c181b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/localization/time.rb @@ -0,0 +1,81 @@ +# encoding: utf-8 + +module I18n + module Tests + module Localization + module Time + def setup + super + setup_time_translations + @time = ::Time.utc(2008, 3, 1, 6, 0) + @other_time = ::Time.utc(2008, 3, 1, 18, 0) + end + + test "localize Time: given the short format it uses it" do + # TODO should be Mrz, shouldn't it? + assert_equal '01. Mar 06:00', I18n.l(@time, :format => :short, :locale => :de) + end + + test "localize Time: given the long format it uses it" do + assert_equal '01. März 2008 06:00', I18n.l(@time, :format => :long, :locale => :de) + end + + # TODO Seems to break on Windows because ENV['TZ'] is ignored. What's a better way to do this? + # def test_localize_given_the_default_format_it_uses_it + # assert_equal 'Sa, 01. Mar 2008 06:00:00 +0000', I18n.l(@time, :format => :default, :locale => :de) + # end + + test "localize Time: given a day name format it returns the correct day name" do + assert_equal 'Samstag', I18n.l(@time, :format => '%A', :locale => :de) + end + + test "localize Time: given an abbreviated day name format it returns the correct abbreviated day name" do + assert_equal 'Sa', I18n.l(@time, :format => '%a', :locale => :de) + end + + test "localize Time: given a month name format it returns the correct month name" do + assert_equal 'März', I18n.l(@time, :format => '%B', :locale => :de) + end + + test "localize Time: given an abbreviated month name format it returns the correct abbreviated month name" do + # TODO should be Mrz, shouldn't it? + assert_equal 'Mar', I18n.l(@time, :format => '%b', :locale => :de) + end + + test "localize Time: given a meridian indicator format it returns the correct meridian indicator" do + assert_equal 'AM', I18n.l(@time, :format => '%p', :locale => :de) + assert_equal 'PM', I18n.l(@other_time, :format => '%p', :locale => :de) + end + + test "localize Time: given a meridian indicator format it returns the correct meridian indicator in upcase" do + assert_equal 'am', I18n.l(@time, :format => '%P', :locale => :de) + assert_equal 'pm', I18n.l(@other_time, :format => '%P', :locale => :de) + end + + test "localize Time: given an unknown format it does not fail" do + assert_nothing_raised { I18n.l(@time, :format => '%x') } + end + + test "localize Time: given a format is missing it raises I18n::MissingTranslationData" do + assert_raise(I18n::MissingTranslationData) { I18n.l(@time, :format => :missing) } + end + + protected + + def setup_time_translations + I18n.backend.store_translations :de, { + :time => { + :formats => { + :default => "%a, %d. %b %Y %H:%M:%S %z", + :short => "%d. %b %H:%M", + :long => "%d. %B %Y %H:%M", + }, + :am => 'am', + :pm => 'pm' + } + } + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/lookup.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/lookup.rb new file mode 100644 index 000000000000..3b4c843494c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/lookup.rb @@ -0,0 +1,81 @@ +# encoding: utf-8 + +module I18n + module Tests + module Lookup + def setup + super + I18n.backend.store_translations(:en, :foo => { :bar => 'bar', :baz => 'baz' }, :falsy => false, :truthy => true, + :string => "a", :array => %w(a b c), :hash => { "a" => "b" }) + end + + test "lookup: it returns a string" do + assert_equal("a", I18n.t(:string)) + end + + test "lookup: it returns hash" do + assert_equal({ :a => "b" }, I18n.t(:hash)) + end + + test "lookup: it returns an array" do + assert_equal(%w(a b c), I18n.t(:array)) + end + + test "lookup: it returns a native true" do + assert I18n.t(:truthy) === true + end + + test "lookup: it returns a native false" do + assert I18n.t(:falsy) === false + end + + test "lookup: given a missing key, no default and no raise option it returns an error message" do + assert_equal "translation missing: en.missing", I18n.t(:missing) + end + + test "lookup: given a missing key, no default and the raise option it raises MissingTranslationData" do + assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + end + + test "lookup: does not raise an exception if no translation data is present for the given locale" do + assert_nothing_raised { I18n.t(:foo, :locale => :xx) } + end + + test "lookup: does not modify the options hash" do + options = {} + assert_equal "a", I18n.t(:string, options) + assert_equal({}, options) + assert_nothing_raised { I18n.t(:string, options.freeze) } + end + + test "lookup: given an array of keys it translates all of them" do + assert_equal %w(bar baz), I18n.t([:bar, :baz], :scope => [:foo]) + end + + test "lookup: using a custom scope separator" do + # data must have been stored using the custom separator when using the ActiveRecord backend + I18n.backend.store_translations(:en, { :foo => { :bar => 'bar' } }, { :separator => '|' }) + assert_equal 'bar', I18n.t('foo|bar', :separator => '|') + end + + # In fact it probably *should* fail but Rails currently relies on using the default locale instead. + # So we'll stick to this for now until we get it fixed in Rails. + test "lookup: given nil as a locale it does not raise but use the default locale" do + # assert_raise(I18n::InvalidLocale) { I18n.t(:bar, :locale => nil) } + assert_nothing_raised { I18n.t(:bar, :locale => nil) } + end + + test "lookup: a resulting String is not frozen" do + assert !I18n.t(:string).frozen? + end + + test "lookup: a resulting Array is not frozen" do + assert !I18n.t(:array).frozen? + end + + test "lookup: a resulting Hash is not frozen" do + assert !I18n.t(:hash).frozen? + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/pluralization.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/pluralization.rb new file mode 100644 index 000000000000..d3319dcdadc9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/pluralization.rb @@ -0,0 +1,35 @@ +# encoding: utf-8 + +module I18n + module Tests + module Pluralization + test "pluralization: given 0 it returns the :zero translation if it is defined" do + assert_equal 'zero', I18n.t(:default => { :zero => 'zero' }, :count => 0) + end + + test "pluralization: given 0 it returns the :other translation if :zero is not defined" do + assert_equal 'bars', I18n.t(:default => { :other => 'bars' }, :count => 0) + end + + test "pluralization: given 1 it returns the singular translation" do + assert_equal 'bar', I18n.t(:default => { :one => 'bar' }, :count => 1) + end + + test "pluralization: given 2 it returns the :other translation" do + assert_equal 'bars', I18n.t(:default => { :other => 'bars' }, :count => 2) + end + + test "pluralization: given 3 it returns the :other translation" do + assert_equal 'bars', I18n.t(:default => { :other => 'bars' }, :count => 3) + end + + test "pluralization: given nil it returns the whole entry" do + assert_equal({ :one => 'bar' }, I18n.t(:default => { :one => 'bar' }, :count => nil)) + end + + test "pluralization: given incomplete pluralization data it raises I18n::InvalidPluralizationData" do + assert_raise(I18n::InvalidPluralizationData) { I18n.t(:default => { :one => 'bar' }, :count => 2) } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/procs.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/procs.rb new file mode 100644 index 000000000000..aa2df19afb1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/tests/procs.rb @@ -0,0 +1,55 @@ +# encoding: utf-8 + +module I18n + module Tests + module Procs + test "lookup: given a translation is a proc it calls the proc with the key and interpolation values" do + I18n.backend.store_translations(:en, :a_lambda => lambda { |*args| I18n::Tests::Procs.filter_args(*args) }) + assert_equal '[:a_lambda, {:foo=>"foo"}]', I18n.t(:a_lambda, :foo => 'foo') + end + + test "defaults: given a default is a Proc it calls it with the key and interpolation values" do + proc = lambda { |*args| I18n::Tests::Procs.filter_args(*args) } + assert_equal '[nil, {:foo=>"foo"}]', I18n.t(nil, :default => proc, :foo => 'foo') + end + + test "defaults: given a default is a key that resolves to a Proc it calls it with the key and interpolation values" do + the_lambda = lambda { |*args| I18n::Tests::Procs.filter_args(*args) } + I18n.backend.store_translations(:en, :a_lambda => the_lambda) + assert_equal '[:a_lambda, {:foo=>"foo"}]', I18n.t(nil, :default => :a_lambda, :foo => 'foo') + assert_equal '[:a_lambda, {:foo=>"foo"}]', I18n.t(nil, :default => [nil, :a_lambda], :foo => 'foo') + end + + test "interpolation: given an interpolation value is a lambda it calls it with key and values before interpolating it" do + proc = lambda { |*args| I18n::Tests::Procs.filter_args(*args) } + assert_match %r(\[\{:foo=>#<Proc.*>\}\]), I18n.t(nil, :default => '%{foo}', :foo => proc) + end + + test "interpolation: given a key resolves to a Proc that returns a string then interpolation still works" do + proc = lambda { |*args| "%{foo}: " + I18n::Tests::Procs.filter_args(*args) } + assert_equal 'foo: [nil, {:foo=>"foo"}]', I18n.t(nil, :default => proc, :foo => 'foo') + end + + test "pluralization: given a key resolves to a Proc that returns valid data then pluralization still works" do + proc = lambda { |*args| { :zero => 'zero', :one => 'one', :other => 'other' } } + assert_equal 'zero', I18n.t(:default => proc, :count => 0) + assert_equal 'one', I18n.t(:default => proc, :count => 1) + assert_equal 'other', I18n.t(:default => proc, :count => 2) + end + + test "lookup: given the option :resolve => false was passed it does not resolve proc translations" do + I18n.backend.store_translations(:en, :a_lambda => lambda { |*args| I18n::Tests::Procs.filter_args(*args) }) + assert_equal Proc, I18n.t(:a_lambda, :resolve => false).class + end + + test "lookup: given the option :resolve => false was passed it does not resolve proc default" do + assert_equal Proc, I18n.t(nil, :default => lambda { |*args| I18n::Tests::Procs.filter_args(*args) }, :resolve => false).class + end + + + def self.filter_args(*args) + args.map {|arg| arg.delete(:fallback_in_progress) if arg.is_a?(Hash) ; arg }.inspect + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/version.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/version.rb new file mode 100644 index 000000000000..0681a8216fe3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/lib/i18n/version.rb @@ -0,0 +1,3 @@ +module I18n + VERSION = "0.9.5" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/all_features_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/all_features_test.rb new file mode 100644 index 000000000000..a1799bd6e16e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/all_features_test.rb @@ -0,0 +1,58 @@ +require 'test_helper' + +begin + require 'rubygems' + require 'active_support' +rescue LoadError + puts "not testing with Cache enabled because active_support can not be found" +end + +class I18nAllFeaturesApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Metadata + include I18n::Backend::Cache + include I18n::Backend::Cascade + include I18n::Backend::Fallbacks + include I18n::Backend::Pluralization + include I18n::Backend::Memoize + end + + def setup + I18n.backend = I18n::Backend::Chain.new(Backend.new, I18n::Backend::Simple.new) + I18n.cache_store = cache_store + super + end + + def teardown + I18n.cache_store.clear if I18n.cache_store + I18n.cache_store = nil + super + end + + def cache_store + ActiveSupport::Cache.lookup_store(:memory_store) if cache_available? + end + + def cache_available? + defined?(ActiveSupport) && defined?(ActiveSupport::Cache) + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use a Chain backend with an all features backend" do + assert_equal I18n::Backend::Chain, I18n.backend.class + assert_equal Backend, I18n.backend.backends.first.class + end + + # links: test that keys stored on one backend can link to keys stored on another backend +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/cascade_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/cascade_test.rb new file mode 100644 index 000000000000..4d9516c46eee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/cascade_test.rb @@ -0,0 +1,28 @@ +require 'test_helper' + +class I18nCascadeApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Cascade + end + + def setup + I18n.backend = Backend.new + super + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use a backend with Cascade included" do + assert_equal Backend, I18n.backend.class + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/chain_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/chain_test.rb new file mode 100644 index 000000000000..f3dff1b574fb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/chain_test.rb @@ -0,0 +1,24 @@ +require 'test_helper' + +class I18nApiChainTest < I18n::TestCase + def setup + super + I18n.backend = I18n::Backend::Chain.new(I18n::Backend::Simple.new, I18n.backend) + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use the Chain backend" do + assert_equal I18n::Backend::Chain, I18n.backend.class + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/fallbacks_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/fallbacks_test.rb new file mode 100644 index 000000000000..e5ca5f2066db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/fallbacks_test.rb @@ -0,0 +1,30 @@ +require 'test_helper' + +class I18nFallbacksApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + def setup + I18n.backend = Backend.new + super + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use a backend with Fallbacks included" do + assert_equal Backend, I18n.backend.class + end + + # links: test that keys stored on one backend can link to keys stored on another backend +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/key_value_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/key_value_test.rb new file mode 100644 index 000000000000..4d6cdd8a4261 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/key_value_test.rb @@ -0,0 +1,24 @@ +require 'test_helper' + +class I18nKeyValueApiTest < I18n::TestCase + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + # include Tests::Api::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + # include Tests::Api::Localization::Procs + + def setup + I18n.backend = I18n::Backend::KeyValue.new({}) + super + end + + test "make sure we use the KeyValue backend" do + assert_equal I18n::Backend::KeyValue, I18n.backend.class + end +end if I18n::TestCase.key_value? diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/memoize_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/memoize_test.rb new file mode 100644 index 000000000000..ed938665c71e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/memoize_test.rb @@ -0,0 +1,56 @@ +require 'test_helper' + +class I18nMemoizeBackendWithSimpleApiTest < I18n::TestCase + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + class MemoizeBackend < I18n::Backend::Simple + include I18n::Backend::Memoize + end + + def setup + I18n.backend = MemoizeBackend.new + super + end + + test "make sure we use the MemoizeBackend backend" do + assert_equal MemoizeBackend, I18n.backend.class + end +end + +class I18nMemoizeBackendWithKeyValueApiTest < I18n::TestCase + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + + # include I18n::Tests::Procs + # include I18n::Tests::Localization::Procs + + class MemoizeBackend < I18n::Backend::KeyValue + include I18n::Backend::Memoize + end + + def setup + I18n.backend = MemoizeBackend.new({}) + super + end + + test "make sure we use the MemoizeBackend backend" do + assert_equal MemoizeBackend, I18n.backend.class + end +end if I18n::TestCase.key_value? diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/override_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/override_test.rb new file mode 100644 index 000000000000..6e1248ad4dde --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/override_test.rb @@ -0,0 +1,42 @@ +require 'test_helper' + +class I18nOverrideTest < I18n::TestCase + module OverrideInverse + def translate(*args) + super(*args).reverse + end + alias :t :translate + end + + module OverrideSignature + def translate(*args) + args.first + args[1] + end + alias :t :translate + end + + def setup + super + @I18n = I18n.dup + @I18n.backend = I18n::Backend::Simple.new + end + + test "make sure modules can overwrite I18n methods" do + @I18n.extend OverrideInverse + @I18n.backend.store_translations('en', :foo => 'bar') + + assert_equal 'rab', @I18n.translate(:foo, :locale => 'en') + assert_equal 'rab', @I18n.t(:foo, :locale => 'en') + assert_equal 'rab', @I18n.translate!(:foo, :locale => 'en') + assert_equal 'rab', @I18n.t!(:foo, :locale => 'en') + end + + test "make sure modules can overwrite I18n signature" do + exception = catch(:exception) do + @I18n.t('Hello', 'Welcome message on home page', :tokenize => true, :throw => true) + end + assert exception.message + @I18n.extend OverrideSignature + assert_equal 'HelloWelcome message on home page', @I18n.translate('Hello', 'Welcome message on home page', :tokenize => true) # tr8n example + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/pluralization_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/pluralization_test.rb new file mode 100644 index 000000000000..53004beb7142 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/pluralization_test.rb @@ -0,0 +1,30 @@ +require 'test_helper' + +class I18nPluralizationApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Pluralization + end + + def setup + I18n.backend = Backend.new + super + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use a backend with Pluralization included" do + assert_equal Backend, I18n.backend.class + end + + # links: test that keys stored on one backend can link to keys stored on another backend +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/simple_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/simple_test.rb new file mode 100644 index 000000000000..3fd3a4247ad7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/api/simple_test.rb @@ -0,0 +1,28 @@ +require 'test_helper' + +class I18nSimpleBackendApiTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Pluralization + end + + def setup + I18n.backend = I18n::Backend::Simple.new + super + end + + include I18n::Tests::Basics + include I18n::Tests::Defaults + include I18n::Tests::Interpolation + include I18n::Tests::Link + include I18n::Tests::Lookup + include I18n::Tests::Pluralization + include I18n::Tests::Procs + include I18n::Tests::Localization::Date + include I18n::Tests::Localization::DateTime + include I18n::Tests::Localization::Time + include I18n::Tests::Localization::Procs + + test "make sure we use the Simple backend" do + assert_equal I18n::Backend::Simple, I18n.backend.class + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/cache_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/cache_test.rb new file mode 100644 index 000000000000..3f44a6d43cec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/cache_test.rb @@ -0,0 +1,109 @@ +require 'test_helper' +require 'digest/md5' + +begin + require 'active_support' +rescue LoadError + $stderr.puts "Skipping cache tests using ActiveSupport" +else + +class I18nBackendCacheTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Cache + end + + def setup + I18n.backend = Backend.new + super + I18n.cache_store = ActiveSupport::Cache.lookup_store(:memory_store) + I18n.cache_key_digest = nil + end + + def teardown + super + I18n.cache_store = nil + end + + test "it uses the cache" do + assert I18n.cache_store.is_a?(ActiveSupport::Cache::MemoryStore) + end + + test "translate hits the backend and caches the response" do + I18n.backend.expects(:lookup).returns('Foo') + assert_equal 'Foo', I18n.t(:foo) + + I18n.backend.expects(:lookup).never + assert_equal 'Foo', I18n.t(:foo) + + I18n.backend.expects(:lookup).returns('Bar') + assert_equal 'Bar', I18n.t(:bar) + end + + test "translate returns a cached false response" do + I18n.backend.expects(:lookup).never + I18n.cache_store.expects(:read).returns(false) + assert_equal false, I18n.t(:foo) + end + + test "still raises MissingTranslationData but also caches it" do + assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + assert_equal 1, I18n.cache_store.instance_variable_get(:@data).size + + # I18n.backend.expects(:lookup).returns(nil) + # assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + # I18n.backend.expects(:lookup).never + # assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } + end + + test "uses 'i18n' as a cache key namespace by default" do + assert_equal 0, I18n.backend.send(:cache_key, :en, :foo, {}).index('i18n') + end + + test "adds a custom cache key namespace" do + with_cache_namespace('bar') do + assert_equal 0, I18n.backend.send(:cache_key, :en, :foo, {}).index('i18n/bar/') + end + end + + test "adds locale and hash of key and hash of options" do + options = { :bar=>1 } + options_hash = RUBY_VERSION <= "1.9" ? options.inspect.hash : options.hash + assert_equal "i18n//en/#{:foo.hash}/#{options_hash}", I18n.backend.send(:cache_key, :en, :foo, options) + end + + test "cache_key uses configured digest method" do + md5 = Digest::MD5.new + options = { :bar=>1 } + options_hash = options.inspect + with_cache_key_digest(md5) do + assert_equal "i18n//en/#{md5.hexdigest(:foo.to_s)}/#{md5.hexdigest(options_hash)}", I18n.backend.send(:cache_key, :en, :foo, options) + end + end + + test "keys should not be equal" do + interpolation_values1 = { :foo => 1, :bar => 2 } + interpolation_values2 = { :foo => 2, :bar => 1 } + + key1 = I18n.backend.send(:cache_key, :en, :some_key, interpolation_values1) + key2 = I18n.backend.send(:cache_key, :en, :some_key, interpolation_values2) + + assert key1 != key2 + end + + protected + + def with_cache_namespace(namespace) + I18n.cache_namespace = namespace + yield + I18n.cache_namespace = nil + end + + def with_cache_key_digest(digest) + I18n.cache_key_digest = digest + yield + I18n.cache_key_digest = nil + end +end + +end # AS cache check diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/cascade_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/cascade_test.rb new file mode 100644 index 000000000000..1101460542b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/cascade_test.rb @@ -0,0 +1,86 @@ +require 'test_helper' + +class I18nBackendCascadeTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Cascade + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :foo => 'foo', :bar => { :baz => 'baz' }) + @cascade_options = { :step => 1, :offset => 1, :skip_root => false } + end + + def lookup(key, options = {}) + I18n.t(key, options.merge(:cascade => @cascade_options)) + end + + test "still returns an existing translation as usual" do + assert_equal 'foo', lookup(:foo) + assert_equal 'baz', lookup(:'bar.baz') + end + + test "falls back by cutting keys off the end of the scope" do + assert_equal 'foo', lookup(:foo, :scope => :'missing') + assert_equal 'foo', lookup(:foo, :scope => :'missing.missing') + assert_equal 'baz', lookup(:baz, :scope => :'bar.missing') + assert_equal 'baz', lookup(:baz, :scope => :'bar.missing.missing') + end + + test "raises I18n::MissingTranslationData exception when no translation was found" do + assert_raise(I18n::MissingTranslationData) { lookup(:'foo.missing', :raise => true) } + assert_raise(I18n::MissingTranslationData) { lookup(:'bar.baz.missing', :raise => true) } + assert_raise(I18n::MissingTranslationData) { lookup(:'missing.bar.baz', :raise => true) } + end + + test "cascades before evaluating the default" do + assert_equal 'foo', lookup(:foo, :scope => :missing, :default => 'default') + end + + test "cascades defaults, too" do + assert_equal 'foo', lookup(nil, :default => [:'missing.missing', :'missing.foo']) + end + + test "works with :offset => 2 and a single key" do + @cascade_options[:offset] = 2 + lookup(:foo) + end + + test "assemble required fallbacks for ActiveRecord validation messages" do + store_translations(:en, + :errors => { + :odd => 'errors.odd', + :reply => { :title => { :blank => 'errors.reply.title.blank' }, :taken => 'errors.reply.taken' }, + :topic => { :title => { :format => 'errors.topic.title.format' }, :length => 'errors.topic.length' } + } + ) + assert_equal 'errors.reply.title.blank', lookup(:'errors.reply.title.blank', :default => :'errors.topic.title.blank') + assert_equal 'errors.reply.taken', lookup(:'errors.reply.title.taken', :default => :'errors.topic.title.taken') + assert_equal 'errors.topic.title.format', lookup(:'errors.reply.title.format', :default => :'errors.topic.title.format') + assert_equal 'errors.topic.length', lookup(:'errors.reply.title.length', :default => :'errors.topic.title.length') + assert_equal 'errors.odd', lookup(:'errors.reply.title.odd', :default => :'errors.topic.title.odd') + end + + test "assemble action view translation helper lookup cascade" do + @cascade_options[:offset] = 2 + + store_translations(:en, + :menu => { :show => 'menu.show' }, + :namespace => { + :menu => { :new => 'namespace.menu.new' }, + :controller => { + :menu => { :edit => 'namespace.controller.menu.edit' }, + :action => { + :menu => { :destroy => 'namespace.controller.action.menu.destroy' } + } + } + } + ) + + assert_equal 'menu.show', lookup(:'namespace.controller.action.menu.show') + assert_equal 'namespace.menu.new', lookup(:'namespace.controller.action.menu.new') + assert_equal 'namespace.controller.menu.edit', lookup(:'namespace.controller.action.menu.edit') + assert_equal 'namespace.controller.action.menu.destroy', lookup(:'namespace.controller.action.menu.destroy') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/chain_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/chain_test.rb new file mode 100644 index 000000000000..2fae0945bf36 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/chain_test.rb @@ -0,0 +1,122 @@ +require 'test_helper' + +class I18nBackendChainTest < I18n::TestCase + def setup + super + @first = backend(:en => { + :foo => 'Foo', :formats => { + :short => 'short', + :subformats => {:short => 'short'}, + }, + :plural_1 => { :one => '%{count}' }, + :dates => {:a => "A"} + }) + @second = backend(:en => { + :bar => 'Bar', :formats => { + :long => 'long', + :subformats => {:long => 'long'}, + }, + :plural_2 => { :one => 'one' }, + :dates => {:a => "B", :b => "B"} + }) + @chain = I18n.backend = I18n::Backend::Chain.new(@first, @second) + end + + test "looks up translations from the first chained backend" do + assert_equal 'Foo', @first.send(:translations)[:en][:foo] + assert_equal 'Foo', I18n.t(:foo) + end + + test "looks up translations from the second chained backend" do + assert_equal 'Bar', @second.send(:translations)[:en][:bar] + assert_equal 'Bar', I18n.t(:bar) + end + + test "defaults only apply to lookups on the last backend in the chain" do + assert_equal 'Foo', I18n.t(:foo, :default => 'Bah') + assert_equal 'Bar', I18n.t(:bar, :default => 'Bah') + assert_equal 'Bah', I18n.t(:bah, :default => 'Bah') # default kicks in only here + end + + test "default" do + assert_equal 'Fuh', I18n.t(:default => 'Fuh') + assert_equal 'Zero', I18n.t(:default => { :zero => 'Zero' }, :count => 0) + assert_equal({ :zero => 'Zero' }, I18n.t(:default => { :zero => 'Zero' })) + assert_equal 'Foo', I18n.t(:default => :foo) + end + + test 'default is returned if translation is missing' do + assert_equal({}, I18n.t(:'i18n.transliterate.rule', :locale => 'en', :default => {})) + end + + test "namespace lookup collects results from all backends and merges deep hashes" do + assert_equal({:long=>"long", :subformats=>{:long=>"long", :short=>"short"}, :short=>"short"}, I18n.t(:formats)) + end + + test "namespace lookup collects results from all backends and lets leftmost backend take priority" do + assert_equal({ :a => "A", :b => "B" }, I18n.t(:dates)) + end + + test "namespace lookup with only the first backend returning a result" do + assert_equal({ :one => '%{count}' }, I18n.t(:plural_1)) + end + + test "pluralization still works" do + assert_equal '1', I18n.t(:plural_1, :count => 1) + assert_equal 'one', I18n.t(:plural_2, :count => 1) + end + + test "bulk lookup collects results from all backends" do + assert_equal ['Foo', 'Bar'], I18n.t([:foo, :bar]) + assert_equal ['Foo', 'Bar', 'Bah'], I18n.t([:foo, :bar, :bah], :default => 'Bah') + assert_equal [{ + :long=>"long", + :subformats=>{:long=>"long", :short=>"short"}, + :short=>"short"}, {:one=>"one"}, + "Bah"], I18n.t([:formats, :plural_2, :bah], :default => 'Bah') + end + + test "store_translations options are not dropped while transfering to backend" do + @first.expects(:store_translations).with(:foo, {:bar => :baz}, {:option => 'persists'}) + I18n.backend.store_translations :foo, {:bar => :baz}, {:option => 'persists'} + end + + protected + + def backend(translations) + backend = I18n::Backend::Simple.new + translations.each { |locale, data| backend.store_translations(locale, data) } + backend + end +end + +class I18nBackendChainWithKeyValueTest < I18n::TestCase + def setup_backend!(subtrees = true) + first = I18n::Backend::KeyValue.new({}, subtrees) + first.store_translations(:en, :plural_1 => { :one => '%{count}' }) + + second = I18n::Backend::Simple.new + second.store_translations(:en, :plural_2 => { :one => 'one' }) + I18n.backend = I18n::Backend::Chain.new(first, second) + end + + test "subtrees enabled: looks up pluralization translations from the first chained backend" do + setup_backend! + assert_equal '1', I18n.t(:plural_1, count: 1) + end + + test "subtrees disabled: looks up pluralization translations from the first chained backend" do + setup_backend!(false) + assert_equal '1', I18n.t(:plural_1, count: 1) + end + + test "subtrees enabled: looks up translations from the second chained backend" do + setup_backend! + assert_equal 'one', I18n.t(:plural_2, count: 1) + end + + test "subtrees disabled: looks up translations from the second chained backend" do + setup_backend!(false) + assert_equal 'one', I18n.t(:plural_2, count: 1) + end +end if I18n::TestCase.key_value? diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/exceptions_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/exceptions_test.rb new file mode 100644 index 000000000000..cc221669b065 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/exceptions_test.rb @@ -0,0 +1,36 @@ +require 'test_helper' + +class I18nBackendExceptionsTest < I18n::TestCase + def setup + super + I18n.backend = I18n::Backend::Simple.new + end + + test "throw message: MissingTranslation message from #translate includes the given scope and full key" do + exception = catch(:exception) do + I18n.t(:'baz.missing', :scope => :'foo.bar', :throw => true) + end + assert_equal "translation missing: en.foo.bar.baz.missing", exception.message + end + + test "exceptions: MissingTranslationData message from #translate includes the given scope and full key" do + begin + I18n.t(:'baz.missing', :scope => :'foo.bar', :raise => true) + rescue I18n::MissingTranslationData => exception + end + assert_equal "translation missing: en.foo.bar.baz.missing", exception.message + end + + test "exceptions: MissingTranslationData message from #localize includes the given scope and full key" do + begin + I18n.l(Time.now, :format => :foo) + rescue I18n::MissingTranslationData => exception + end + assert_equal "translation missing: en.time.formats.foo", exception.message + end + + test "exceptions: MissingInterpolationArgument message includes missing key, provided keys and full string" do + exception = I18n::MissingInterpolationArgument.new('key', {:this => 'was given'}, 'string') + assert_equal 'missing interpolation argument "key" in "string" ({:this=>"was given"} given)', exception.message + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/fallbacks_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/fallbacks_test.rb new file mode 100644 index 000000000000..a220c0385091 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/fallbacks_test.rb @@ -0,0 +1,219 @@ +require 'test_helper' + +class I18nBackendFallbacksTranslateTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :foo => 'Foo in :en', :bar => 'Bar in :en', :buz => 'Buz in :en', :interpolate => 'Interpolate %{value}') + store_translations(:de, :bar => 'Bar in :de', :baz => 'Baz in :de') + store_translations(:'de-DE', :baz => 'Baz in :de-DE') + store_translations(:'pt-BR', :baz => 'Baz in :pt-BR') + end + + test "still returns an existing translation as usual" do + assert_equal 'Foo in :en', I18n.t(:foo, :locale => :en) + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :de) + assert_equal 'Baz in :de-DE', I18n.t(:baz, :locale => :'de-DE') + end + + test "returns interpolated value if no key provided" do + assert_equal 'Interpolate %{value}', I18n.t(:interpolate) + end + + test "returns the :en translation for a missing :de translation" do + assert_equal 'Foo in :en', I18n.t(:foo, :locale => :de) + end + + test "returns the :de translation for a missing :'de-DE' translation" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE') + end + + test "returns the :en translation for translation missing in both :de and :'de-De'" do + assert_equal 'Buz in :en', I18n.t(:buz, :locale => :'de-DE') + end + + test "returns the :de translation for a missing :'de-DE' when :default is a String" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => "Default Bar") + assert_equal "Default Bar", I18n.t(:missing_bar, :locale => :'de-DE', :default => "Default Bar") + end + + test "returns the :de translation for a missing :'de-DE' when defaults is a Symbol (which exists in :en)" do + assert_equal "Bar in :de", I18n.t(:bar, :locale => :'de-DE', :default => [:buz]) + end + + test "returns the :'de-DE' default :baz translation for a missing :'de-DE' (which exists in :de)" do + assert_equal "Baz in :de-DE", I18n.t(:bar, :locale => :'de-DE', :default => [:baz]) + end + + test "returns the :de translation for a missing :'de-DE' when :default is a Proc" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => Proc.new { "Default Bar" }) + assert_equal "Default Bar", I18n.t(:missing_bar, :locale => :'de-DE', :default => Proc.new { "Default Bar" }) + end + + test "returns the :de translation for a missing :'de-DE' when :default is a Hash" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => {}) + assert_equal({}, I18n.t(:missing_bar, :locale => :'de-DE', :default => {})) + end + + test "returns the :de translation for a missing :'de-DE' when :default is nil" do + assert_equal 'Bar in :de', I18n.t(:bar, :locale => :'de-DE', :default => nil) + assert_nil I18n.t(:missing_bar, :locale => :'de-DE', :default => nil) + end + + test "returns the translation missing message if the default is also missing" do + assert_equal 'translation missing: de-DE.missing_bar', I18n.t(:missing_bar, :locale => :'de-DE', :default => [:missing_baz]) + end + + test "returns the :'de-DE' default :baz translation for a missing :'de-DE' when defaults contains Symbol" do + assert_equal 'Baz in :de-DE', I18n.t(:missing_foo, :locale => :'de-DE', :default => [:baz, "Default Bar"]) + end + + test "returns the defaults translation for a missing :'de-DE' when defaults contains a String or Proc before Symbol" do + assert_equal "Default Bar", I18n.t(:missing_foo, :locale => :'de-DE', :default => [:missing_bar, "Default Bar", :baz]) + assert_equal "Default Bar", I18n.t(:missing_foo, :locale => :'de-DE', :default => [:missing_bar, Proc.new { "Default Bar" }, :baz]) + end + + test "returns the default translation for a missing :'de-DE' and existing :de when default is a Hash" do + assert_equal 'Default 6 Bars', I18n.t(:missing_foo, :locale => :'de-DE', :default => [:missing_bar, {:other => "Default %{count} Bars"}, "Default Bar"], :count => 6) + end + + test "returns the default translation for a missing :de translation even when default is a String when fallback is disabled" do + assert_equal 'Default String', I18n.t(:foo, :locale => :de, :default => 'Default String', :fallback => false) + end + + test "raises I18n::MissingTranslationData exception when fallback is disabled even when fallback translation exists" do + assert_raise(I18n::MissingTranslationData) { I18n.t(:foo, :locale => :de, :fallback => false, :raise => true) } + end + + test "raises I18n::MissingTranslationData exception when no translation was found" do + assert_raise(I18n::MissingTranslationData) { I18n.t(:faa, :locale => :en, :raise => true) } + assert_raise(I18n::MissingTranslationData) { I18n.t(:faa, :locale => :de, :raise => true) } + end + + test "should ensure that default is not splitted on new line char" do + assert_equal "Default \n Bar", I18n.t(:missing_bar, :default => "Default \n Bar") + end + + test "should not raise error when enforce_available_locales is true, :'pt' is missing and default is a Symbol" do + I18n.enforce_available_locales = true + begin + assert_equal 'Foo', I18n.t(:'model.attrs.foo', :locale => :'pt-BR', :default => [:'attrs.foo', "Foo"]) + ensure + I18n.enforce_available_locales = false + end + end +end + +class I18nBackendFallbacksLocalizeTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :date => { :formats => { :en => 'en' }, :day_names => %w(Sunday) }) + store_translations(:de, :date => { :formats => { :de => 'de' } }) + end + + test "still uses an existing format as usual" do + assert_equal 'en', I18n.l(Date.today, :format => :en, :locale => :en) + end + + test "looks up and uses a fallback locale's format for a key missing in the given locale (1)" do + assert_equal 'en', I18n.l(Date.today, :format => :en, :locale => :de) + end + + test "looks up and uses a fallback locale's format for a key missing in the given locale (2)" do + assert_equal 'de', I18n.l(Date.today, :format => :de, :locale => :'de-DE') + end + + test "still uses an existing day name translation as usual" do + assert_equal 'Sunday', I18n.l(Date.new(2010, 1, 3), :format => '%A', :locale => :en) + end + + test "uses a fallback locale's translation for a key missing in the given locale" do + assert_equal 'Sunday', I18n.l(Date.new(2010, 1, 3), :format => '%A', :locale => :de) + end +end + +class I18nBackendFallbacksWithChainTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + class Chain < I18n::Backend::Chain + include I18n::Backend::Fallbacks + end + + def setup + super + backend = Backend.new + backend.store_translations(:de, :foo => 'FOO') + backend.store_translations(:'pt-BR', :foo => 'Baz in :pt-BR') + I18n.backend = Chain.new(I18n::Backend::Simple.new, backend) + end + + test "falls back from de-DE to de when there is no translation for de-DE available" do + assert_equal 'FOO', I18n.t(:foo, :locale => :'de-DE') + end + + test "falls back from de-DE to de when there is no translation for de-DE available when using arrays, too" do + assert_equal ['FOO', 'FOO'], I18n.t([:foo, :foo], :locale => :'de-DE') + end + + test "should not raise error when enforce_available_locales is true, :'pt' is missing and default is a Symbol" do + I18n.enforce_available_locales = true + begin + assert_equal 'Foo', I18n.t(:'model.attrs.foo', :locale => :'pt-BR', :default => [:'attrs.foo', "Foo"]) + ensure + I18n.enforce_available_locales = false + end + end +end + +class I18nBackendFallbacksExistsTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Fallbacks + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :foo => 'Foo in :en', :bar => 'Bar in :en') + store_translations(:de, :bar => 'Bar in :de') + store_translations(:'de-DE', :baz => 'Baz in :de-DE') + end + + test "exists? given an existing key will return true" do + assert_equal true, I18n.exists?(:foo) + end + + test "exists? given a non-existing key will return false" do + assert_equal false, I18n.exists?(:bogus) + end + + test "exists? given an existing key and an existing locale will return true" do + assert_equal true, I18n.exists?(:foo, :en) + assert_equal true, I18n.exists?(:bar, :de) + end + + test "exists? given a non-existing key and an existing locale will return false" do + assert_equal false, I18n.exists?(:bogus, :en) + assert_equal false, I18n.exists?(:bogus, :de) + end + + test "exists? should return true given a key which is missing from the given locale and exists in a fallback locale" do + assert_equal true, I18n.exists?(:foo, :de) + assert_equal true, I18n.exists?(:foo, :'de-DE') + end + + test "exists? should return false given a key which is missing from the given locale and all its fallback locales" do + assert_equal false, I18n.exists?(:baz, :de) + assert_equal false, I18n.exists?(:bogus, :'de-DE') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/interpolation_compiler_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/interpolation_compiler_test.rb new file mode 100644 index 000000000000..cffe28f9ed80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/interpolation_compiler_test.rb @@ -0,0 +1,118 @@ +require 'test_helper' + +class InterpolationCompilerTest < I18n::TestCase + Compiler = I18n::Backend::InterpolationCompiler::Compiler + + def compile_and_interpolate(str, values = {}) + Compiler.compile_if_an_interpolation(str).i18n_interpolate(values) + end + + def assert_escapes_interpolation_key(expected, malicious_str) + assert_equal(expected, Compiler.send(:escape_key_sym, malicious_str)) + end + + def test_escape_key_properly_escapes + assert_escapes_interpolation_key ':"\""', '"' + assert_escapes_interpolation_key ':"\\\\"', '\\' + assert_escapes_interpolation_key ':"\\\\\""', '\\"' + assert_escapes_interpolation_key ':"\#{}"', '#{}' + assert_escapes_interpolation_key ':"\\\\\#{}"', '\#{}' + end + + def assert_escapes_plain_string(expected, plain_str) + assert_equal expected, Compiler.send(:escape_plain_str, plain_str) + end + + def test_escape_plain_string_properly_escapes + assert_escapes_plain_string '\\"', '"' + assert_escapes_plain_string '\'', '\'' + assert_escapes_plain_string '\\#', '#' + assert_escapes_plain_string '\\#{}', '#{}' + assert_escapes_plain_string '\\\\\\"','\\"' + end + + def test_non_interpolated_strings_or_arrays_dont_get_compiled + ['abc', '\\{a}}', '{a}}', []].each do |obj| + Compiler.compile_if_an_interpolation(obj) + assert_equal false, obj.respond_to?(:i18n_interpolate) + end + end + + def test_interpolated_string_gets_compiled + assert_equal '-A-', compile_and_interpolate('-%{a}-', :a => 'A') + end + + def assert_handles_key(str, key) + assert_equal 'A', compile_and_interpolate(str, key => 'A') + end + + def test_compiles_fancy_keys + assert_handles_key('%{\}', :'\\' ) + assert_handles_key('%{#}', :'#' ) + assert_handles_key('%{#{}', :'#{' ) + assert_handles_key('%{#$SAFE}', :'#$SAFE') + assert_handles_key('%{\000}', :'\000' ) + assert_handles_key('%{\'}', :'\'' ) + assert_handles_key('%{\'\'}', :'\'\'' ) + assert_handles_key('%{a.b}', :'a.b' ) + assert_handles_key('%{ }', :' ' ) + assert_handles_key('%{:}', :':' ) + assert_handles_key("%{:''}", :":''" ) + assert_handles_key('%{:"}', :':"' ) + end + + def test_str_containing_only_escaped_interpolation_is_handled_correctly + assert_equal 'abc %{x}', compile_and_interpolate('abc %%{x}') + end + + def test_handles_weird_strings + assert_equal '#{} a', compile_and_interpolate('#{} %{a}', :a => 'a') + assert_equal '"#{abc}"', compile_and_interpolate('"#{ab%{a}c}"', :a => '' ) + assert_equal 'a}', compile_and_interpolate('%{{a}}', :'{a' => 'a') + assert_equal '"', compile_and_interpolate('"%{a}', :a => '' ) + assert_equal 'a%{a}', compile_and_interpolate('%{a}%%{a}', :a => 'a') + assert_equal '%%{a}', compile_and_interpolate('%%%{a}') + assert_equal '\";eval("a")', compile_and_interpolate('\";eval("%{a}")', :a => 'a') + assert_equal '\";eval("a")', compile_and_interpolate('\";eval("a")%{a}', :a => '' ) + assert_equal "\na", compile_and_interpolate("\n%{a}", :a => 'a') + end + + def test_raises_exception_when_argument_is_missing + assert_raise(I18n::MissingInterpolationArgument) do + compile_and_interpolate('%{first} %{last}', :first => 'first') + end + end + + def test_custom_missing_interpolation_argument_handler + old_handler = I18n.config.missing_interpolation_argument_handler + I18n.config.missing_interpolation_argument_handler = lambda do |key, values, string| + "missing key is #{key}, values are #{values.inspect}, given string is '#{string}'" + end + assert_equal %|first missing key is last, values are {:first=>"first"}, given string is '%{first} %{last}'|, + compile_and_interpolate('%{first} %{last}', :first => 'first') + ensure + I18n.config.missing_interpolation_argument_handler = old_handler + end +end + +class I18nBackendInterpolationCompilerTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::InterpolationCompiler + end + + include I18n::Tests::Interpolation + + def setup + I18n.backend = Backend.new + super + end + + # pre-compile default strings to make sure we are testing I18n::Backend::InterpolationCompiler + def interpolate(*args) + options = args.last.kind_of?(Hash) ? args.last : {} + if default_str = options[:default] + I18n::Backend::InterpolationCompiler::Compiler.compile_if_an_interpolation(default_str) + end + super + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/key_value_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/key_value_test.rb new file mode 100644 index 000000000000..be220d346d29 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/key_value_test.rb @@ -0,0 +1,61 @@ +require 'test_helper' + +class I18nBackendKeyValueTest < I18n::TestCase + def setup_backend!(subtree=true) + I18n.backend = I18n::Backend::KeyValue.new({}, subtree) + store_translations(:en, :foo => { :bar => 'bar', :baz => 'baz' }) + end + + def assert_flattens(expected, nested, escape=true, subtree=true) + assert_equal expected, I18n.backend.flatten_translations("en", nested, escape, subtree) + end + + test "hash flattening works" do + setup_backend! + assert_flattens( + {:a=>'a', :b=>{:c=>'c', :d=>'d', :f=>{:x=>'x'}}, :"b.f" => {:x=>"x"}, :"b.c"=>"c", :"b.f.x"=>"x", :"b.d"=>"d"}, + {:a=>'a', :b=>{:c=>'c', :d=>'d', :f=>{:x=>'x'}}} + ) + assert_flattens({:a=>{:b =>['a', 'b']}, :"a.b"=>['a', 'b']}, {:a=>{:b =>['a', 'b']}}) + assert_flattens({:"a\001b" => "c"}, {:"a.b" => "c"}) + assert_flattens({:"a.b"=>['a', 'b']}, {:a=>{:b =>['a', 'b']}}, true, false) + assert_flattens({:"a.b" => "c"}, {:"a.b" => "c"}, false) + end + + test "store_translations handle subtrees by default" do + setup_backend! + assert_equal({ :bar => 'bar', :baz => 'baz' }, I18n.t("foo")) + end + + test "store_translations merge subtrees accordingly" do + setup_backend! + store_translations(:en, :foo => { :baz => "BAZ"}) + assert_equal('BAZ', I18n.t("foo.baz")) + assert_equal({ :bar => 'bar', :baz => 'BAZ' }, I18n.t("foo")) + end + + test "store_translations does not handle subtrees if desired" do + setup_backend!(false) + assert_raise I18n::MissingTranslationData do + I18n.t("foo", :raise => true) + end + end + + test "subtrees enabled: given incomplete pluralization data it raises I18n::InvalidPluralizationData" do + setup_backend! + store_translations(:en, :bar => { :one => "One" }) + assert_raise(I18n::InvalidPluralizationData) { I18n.t(:bar, :count => 2) } + end + + test "subtrees disabled: given incomplete pluralization data it returns an error message" do + setup_backend!(false) + store_translations(:en, :bar => { :one => "One" }) + assert_equal "translation missing: en.bar", I18n.t(:bar, :count => 2) + end + + test "translate handles subtrees for pluralization" do + setup_backend!(false) + store_translations(:en, :bar => { :one => "One" }) + assert_equal("One", I18n.t("bar", :count => 1)) + end +end if I18n::TestCase.key_value? diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/memoize_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/memoize_test.rb new file mode 100644 index 000000000000..344890494cce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/memoize_test.rb @@ -0,0 +1,79 @@ +require 'test_helper' +# TODO: change back to "require 'backend/simple'" when dropping support to Ruby 1.8.7. +require File.expand_path('../simple_test', __FILE__) + +class I18nBackendMemoizeTest < I18nBackendSimpleTest + module MemoizeSpy + attr_accessor :spy_calls + + def available_locales + self.spy_calls = (self.spy_calls || 0) + 1 + super + end + end + + class MemoizeBackend < I18n::Backend::Simple + include MemoizeSpy + include I18n::Backend::Memoize + end + + def setup + super + I18n.backend = MemoizeBackend.new + end + + def test_memoizes_available_locales + I18n.backend.spy_calls = 0 + assert_equal I18n.available_locales, I18n.available_locales + assert_equal 1, I18n.backend.spy_calls + end + + def test_resets_available_locales_on_reload! + I18n.available_locales + I18n.backend.spy_calls = 0 + I18n.reload! + assert_equal I18n.available_locales, I18n.available_locales + assert_equal 1, I18n.backend.spy_calls + end + + def test_resets_available_locales_on_store_translations + I18n.available_locales + I18n.backend.spy_calls = 0 + I18n.backend.store_translations(:copa, :ca => :bana) + assert_equal I18n.available_locales, I18n.available_locales + assert I18n.available_locales.include?(:copa) + assert_equal 1, I18n.backend.spy_calls + end + + module TestLookup + def lookup(locale, key, scope = [], options = {}) + keys = I18n.normalize_keys(locale, key, scope, options[:separator]) + keys.inspect + end + end + + def test_lookup_concurrent_consistency + backend_impl = Class.new(I18n::Backend::Simple) do + include TestLookup + include I18n::Backend::Memoize + end + backend = backend_impl.new + + memoized_lookup = backend.send(:memoized_lookup) + + assert_equal "[:foo, :scoped, :sample]", backend.translate('foo', scope = [:scoped, :sample]) + + results = [] + 30.times.inject([]) do |memo, i| + memo << Thread.new do + backend.translate('bar', scope); backend.translate(:baz, scope) + end + end.each(&:join) + + memoized_lookup = backend.send(:memoized_lookup) + puts memoized_lookup.inspect if $VERBOSE + assert_equal 3, memoized_lookup.size, "NON-THREAD-SAFE lookup memoization backend: #{memoized_lookup.class}" + # if a plain Hash is used might eventually end up in a weird (inconsistent) state + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/metadata_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/metadata_test.rb new file mode 100644 index 000000000000..44612cf0804a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/metadata_test.rb @@ -0,0 +1,48 @@ +require 'test_helper' + +class I18nBackendMetadataTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Metadata + end + + def setup + super + I18n.backend = Backend.new + store_translations(:en, :foo => 'Hi %{name}') + end + + test "translation strings carry metadata" do + translation = I18n.t(:foo, :name => 'David') + assert translation.respond_to?(:translation_metadata) + assert translation.translation_metadata.is_a?(Hash) + end + + test "translate adds the locale to metadata on Strings" do + assert_equal :en, I18n.t(:foo, :name => 'David', :locale => :en).translation_metadata[:locale] + end + + test "translate adds the key to metadata on Strings" do + assert_equal :foo, I18n.t(:foo, :name => 'David').translation_metadata[:key] + end + + test "translate adds the default to metadata on Strings" do + assert_equal 'bar', I18n.t(:foo, :default => 'bar', :name => '').translation_metadata[:default] + end + + test "translation adds the interpolation values to metadata on Strings" do + assert_equal({:name => 'David'}, I18n.t(:foo, :name => 'David').translation_metadata[:values]) + end + + test "interpolation adds the original string to metadata on Strings" do + assert_equal('Hi %{name}', I18n.t(:foo, :name => 'David').translation_metadata[:original]) + end + + test "pluralization adds the count to metadata on Strings" do + assert_equal(1, I18n.t(:missing, :count => 1, :default => { :one => 'foo' }).translation_metadata[:count]) + end + + test "metadata works with frozen values" do + assert_equal(1, I18n.t(:missing, :count => 1, :default => 'foo'.freeze).translation_metadata[:count]) + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/pluralization_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/pluralization_test.rb new file mode 100644 index 000000000000..1518efdb67be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/pluralization_test.rb @@ -0,0 +1,45 @@ +require 'test_helper' + +class I18nBackendPluralizationTest < I18n::TestCase + class Backend < I18n::Backend::Simple + include I18n::Backend::Pluralization + include I18n::Backend::Fallbacks + end + + def setup + super + I18n.backend = Backend.new + @rule = lambda { |n| n == 1 ? :one : n == 0 || (2..10).include?(n % 100) ? :few : (11..19).include?(n % 100) ? :many : :other } + store_translations(:xx, :i18n => { :plural => { :rule => @rule } }) + @entry = { :zero => 'zero', :one => 'one', :few => 'few', :many => 'many', :other => 'other' } + end + + test "pluralization picks a pluralizer from :'i18n.pluralize'" do + assert_equal @rule, I18n.backend.send(:pluralizer, :xx) + end + + test "pluralization picks :one for 1" do + assert_equal 'one', I18n.t(:count => 1, :default => @entry, :locale => :xx) + end + + test "pluralization picks :few for 2" do + assert_equal 'few', I18n.t(:count => 2, :default => @entry, :locale => :xx) + end + + test "pluralization picks :many for 11" do + assert_equal 'many', I18n.t(:count => 11, :default => @entry, :locale => :xx) + end + + test "pluralization picks zero for 0 if the key is contained in the data" do + assert_equal 'zero', I18n.t(:count => 0, :default => @entry, :locale => :xx) + end + + test "pluralization picks few for 0 if the key is not contained in the data" do + @entry.delete(:zero) + assert_equal 'few', I18n.t(:count => 0, :default => @entry, :locale => :xx) + end + + test "Fallbacks can pick up rules from fallback locales, too" do + assert_equal @rule, I18n.backend.send(:pluralizer, :'xx-XX') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/simple_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/simple_test.rb new file mode 100644 index 000000000000..be5715f5c064 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/simple_test.rb @@ -0,0 +1,103 @@ +require 'test_helper' + +class I18nBackendSimpleTest < I18n::TestCase + def setup + super + I18n.backend = I18n::Backend::Simple.new + I18n.load_path = [locales_dir + '/en.yml'] + end + + # useful because this way we can use the backend with no key for interpolation/pluralization + test "simple backend translate: given nil as a key it still interpolations the default value" do + assert_equal "Hi David", I18n.t(nil, :default => "Hi %{name}", :name => "David") + end + + # loading translations + test "simple load_translations: given an unknown file type it raises I18n::UnknownFileType" do + assert_raise(I18n::UnknownFileType) { I18n.backend.load_translations("#{locales_dir}/en.xml") } + end + + test "simple load_translations: given a Ruby file name it does not raise anything" do + assert_nothing_raised { I18n.backend.load_translations("#{locales_dir}/en.rb") } + end + + test "simple load_translations: given no argument, it uses I18n.load_path" do + I18n.backend.load_translations + assert_equal({ :en => { :foo => { :bar => 'baz' } } }, I18n.backend.send(:translations)) + end + + test "simple load_rb: loads data from a Ruby file" do + data = I18n.backend.send(:load_rb, "#{locales_dir}/en.rb") + assert_equal({ :en => { :fuh => { :bah => 'bas' } } }, data) + end + + test "simple load_yml: loads data from a YAML file" do + data = I18n.backend.send(:load_yml, "#{locales_dir}/en.yml") + assert_equal({ 'en' => { 'foo' => { 'bar' => 'baz' } } }, data) + end + + test "simple load_translations: loads data from known file formats" do + I18n.backend = I18n::Backend::Simple.new + I18n.backend.load_translations("#{locales_dir}/en.rb", "#{locales_dir}/en.yml") + expected = { :en => { :fuh => { :bah => "bas" }, :foo => { :bar => "baz" } } } + assert_equal expected, translations + end + + test "simple load_translations: given file names as array it does not raise anything" do + assert_nothing_raised { I18n.backend.load_translations(["#{locales_dir}/en.rb", "#{locales_dir}/en.yml"]) } + end + + # storing translations + + test "simple store_translations: stores translations, ... no, really :-)" do + store_translations :'en', :foo => 'bar' + assert_equal Hash[:'en', {:foo => 'bar'}], translations + end + + test "simple store_translations: deep_merges with existing translations" do + store_translations :'en', :foo => {:bar => 'bar'} + store_translations :'en', :foo => {:baz => 'baz'} + assert_equal Hash[:'en', {:foo => {:bar => 'bar', :baz => 'baz'}}], translations + end + + test "simple store_translations: converts the given locale to a Symbol" do + store_translations 'en', :foo => 'bar' + assert_equal Hash[:'en', {:foo => 'bar'}], translations + end + + test "simple store_translations: converts keys to Symbols" do + store_translations 'en', 'foo' => {'bar' => 'bar', 'baz' => 'baz'} + assert_equal Hash[:'en', {:foo => {:bar => 'bar', :baz => 'baz'}}], translations + end + + test "simple store_translations: do not store translations unavailable locales if enforce_available_locales is true" do + begin + I18n.enforce_available_locales = true + I18n.available_locales = [:en, :es] + store_translations(:fr, :foo => {:bar => 'barfr', :baz => 'bazfr'}) + store_translations(:es, :foo => {:bar => 'bares', :baz => 'bazes'}) + assert_nil translations[:fr] + assert_equal Hash[:foo, {:bar => 'bares', :baz => 'bazes'}], translations[:es] + ensure + I18n.config.enforce_available_locales = false + end + end + + test "simple store_translations: store translations for unavailable locales if enforce_available_locales is false" do + I18n.available_locales = [:en, :es] + store_translations(:fr, :foo => {:bar => 'barfr', :baz => 'bazfr'}) + assert_equal Hash[:foo, {:bar => 'barfr', :baz => 'bazfr'}], translations[:fr] + end + + # reloading translations + + test "simple reload_translations: unloads translations" do + I18n.backend.reload! + assert_nil translations + end + + test "simple reload_translations: uninitializes the backend" do + I18n.backend.reload! + assert_equal false, I18n.backend.initialized? + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/transliterator_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/transliterator_test.rb new file mode 100644 index 000000000000..c40e2bbffa5c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/backend/transliterator_test.rb @@ -0,0 +1,84 @@ +# encoding: utf-8 +require 'test_helper' + +class I18nBackendTransliterator < I18n::TestCase + def setup + super + I18n.backend = I18n::Backend::Simple.new + @proc = lambda { |n| n.upcase } + @hash = { "ü" => "ue", "ö" => "oe", "a" => "a" } + @transliterator = I18n::Backend::Transliterator.get + end + + test "transliteration rule can be a proc" do + store_translations(:xx, :i18n => {:transliterate => {:rule => @proc}}) + assert_equal "HELLO", I18n.backend.transliterate(:xx, "hello") + end + + test "transliteration rule can be a hash" do + store_translations(:xx, :i18n => {:transliterate => {:rule => @hash}}) + assert_equal "ue", I18n.backend.transliterate(:xx, "ü") + end + + test "transliteration rule must be a proc or hash" do + store_translations(:xx, :i18n => {:transliterate => {:rule => ""}}) + assert_raise I18n::ArgumentError do + I18n.backend.transliterate(:xx, "ü") + end + end + + test "transliterator defaults to latin => ascii when no rule is given" do + assert_equal "AEroskobing", I18n.backend.transliterate(:xx, "Ærøskøbing") + end + + test "default transliterator should not modify ascii characters" do + (0..127).each do |byte| + char = [byte].pack("U") + assert_equal char, @transliterator.transliterate(char) + end + end + + test "default transliterator correctly transliterates latin characters" do + # create string with range of Unicode's western characters with + # diacritics, excluding the division and multiplication signs which for + # some reason or other are floating in the middle of all the letters. + string = (0xC0..0x17E).to_a.reject {|c| [0xD7, 0xF7].include? c}.pack("U*") + string.split(//) do |char| + assert_match %r{^[a-zA-Z']*$}, @transliterator.transliterate(string) + end + end + + test "should replace non-ASCII chars not in map with a replacement char" do + assert_equal "abc?", @transliterator.transliterate("abcſ") + end + + test "can replace non-ASCII chars not in map with a custom replacement string" do + assert_equal "abc#", @transliterator.transliterate("abcſ", "#") + end + + test "default transliterator raises errors for invalid UTF-8" do + assert_raise ArgumentError do + @transliterator.transliterate("a\x92b") + end + end + + test "I18n.transliterate should transliterate using a default transliterator" do + assert_equal "aeo", I18n.transliterate("áèö") + end + + test "I18n.transliterate should transliterate using a locale" do + store_translations(:xx, :i18n => {:transliterate => {:rule => @hash}}) + assert_equal "ue", I18n.transliterate("ü", :locale => :xx) + end + + test "default transliterator fails with custom rules with uncomposed input" do + char = [117, 776].pack("U*") # "ü" as ASCII "u" plus COMBINING DIAERESIS + transliterator = I18n::Backend::Transliterator.get(@hash) + assert_not_equal "ue", transliterator.transliterate(char) + end + + test "DEFAULT_APPROXIMATIONS is frozen to prevent concurrency issues" do + assert I18n::Backend::Transliterator::HashTransliterator::DEFAULT_APPROXIMATIONS.frozen? + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/core_ext/hash_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/core_ext/hash_test.rb new file mode 100644 index 000000000000..f7ebd6fee059 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/core_ext/hash_test.rb @@ -0,0 +1,36 @@ +require 'test_helper' +require 'i18n/core_ext/hash' + +class I18nCoreExtHashInterpolationTest < I18n::TestCase + test "#deep_symbolize_keys" do + hash = { 'foo' => { 'bar' => { 'baz' => 'bar' } } } + expected = { :foo => { :bar => { :baz => 'bar' } } } + assert_equal expected, hash.deep_symbolize_keys + end + + test "#slice" do + hash = { :foo => 'bar', :baz => 'bar' } + expected = { :foo => 'bar' } + assert_equal expected, hash.slice(:foo) + end + + test "#slice non-existent key" do + hash = { :foo => 'bar', :baz => 'bar' } + expected = { :foo => 'bar' } + assert_equal expected, hash.slice(:foo, :not_here) + end + + test "#except" do + hash = { :foo => 'bar', :baz => 'bar' } + expected = { :foo => 'bar' } + assert_equal expected, hash.except(:baz) + end + + test "#deep_merge!" do + hash = { :foo => { :bar => { :baz => 'bar' } }, :baz => 'bar' } + hash.deep_merge!(:foo => { :bar => { :baz => 'foo' } }) + + expected = { :foo => { :bar => { :baz => 'foo' } }, :baz => 'bar' } + assert_equal expected, hash + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/gettext/api_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/gettext/api_test.rb new file mode 100644 index 000000000000..2cd157c0d8ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/gettext/api_test.rb @@ -0,0 +1,214 @@ +# encoding: utf-8 +require 'test_helper' +require 'i18n/gettext/helpers' + +include I18n::Gettext::Helpers + +class I18nGettextApiTest < I18n::TestCase + def setup + super + I18n.locale = :en + I18n.backend.store_translations :de, { + 'Hi Gettext!' => 'Hallo Gettext!', + 'Sentence 1. Sentence 2.' => 'Satz 1. Satz 2.', + "An apple" => { :one => 'Ein Apfel', :other => '%{count} Äpfel' }, + :special => { "A special apple" => { :one => 'Ein spezieller Apfel', :other => '%{count} spezielle Äpfel' } }, + :foo => { :bar => 'bar-de' }, + 'foo.bar' => 'Foo Bar' + }, :separator => '|' + end + + # N_ + def test_N_returns_original_msg + assert_equal 'foo|bar', N_('foo|bar') + I18n.locale = :de + assert_equal 'Hi Gettext!', N_('Hi Gettext!') + end + + # gettext + def test_gettext_uses_msg_as_default + assert_equal 'Hi Gettext!', _('Hi Gettext!') + end + + def test_gettext_uses_msg_as_key + I18n.locale = :de + assert_equal 'Hallo Gettext!', gettext('Hi Gettext!') + assert_equal 'Hallo Gettext!', _('Hi Gettext!') + end + + def test_gettext_uses_msg_containing_dots_as_default + assert_equal 'Sentence 1. Sentence 2.', gettext('Sentence 1. Sentence 2.') + assert_equal 'Sentence 1. Sentence 2.', _('Sentence 1. Sentence 2.') + end + + def test_gettext_uses_msg_containing_dots_as_key + I18n.locale = :de + assert_equal 'Satz 1. Satz 2.', gettext('Sentence 1. Sentence 2.') + assert_equal 'Satz 1. Satz 2.', _('Sentence 1. Sentence 2.') + end + + # sgettext + def test_sgettext_defaults_to_the_last_token_of_a_scoped_msgid + assert_equal 'bar', sgettext('foo|bar') + assert_equal 'bar', s_('foo|bar') + end + + def test_sgettext_looks_up_a_scoped_translation + I18n.locale = :de + assert_equal 'bar-de', sgettext('foo|bar') + assert_equal 'bar-de', s_('foo|bar') + end + + def test_sgettext_ignores_dots + I18n.locale = :de + assert_equal 'Foo Bar', sgettext('foo.bar') + assert_equal 'Foo Bar', s_('foo.bar') + end + + # pgettext + def test_pgettext_defaults_to_msgid + assert_equal 'bar', pgettext('foo', 'bar') + assert_equal 'bar', p_('foo', 'bar') + end + + def test_pgettext_looks_up_a_scoped_translation + I18n.locale = :de + assert_equal 'bar-de', pgettext('foo', 'bar') + assert_equal 'bar-de', p_('foo', 'bar') + end + + # ngettext + def test_ngettext_looks_up_msg_id_as_default_singular + assert_equal 'An apple', ngettext('An apple', '%{count} apples', 1) + assert_equal 'An apple', n_('An apple', '%{count} apples', 1) + end + + def test_ngettext_looks_up_msg_id_plural_as_default_plural + assert_equal '2 apples', ngettext('An apple', '%{count} apples', 2) + assert_equal '2 apples', n_('An apple', '%{count} apples', 2) + end + + def test_ngettext_looks_up_a_singular + I18n.locale = :de + assert_equal 'Ein Apfel', ngettext('An apple', '%{count} apples', 1) + assert_equal 'Ein Apfel', n_('An apple', '%{count} apples', 1) + end + + def test_ngettext_looks_up_a_plural + I18n.locale = :de + assert_equal '2 Äpfel', ngettext('An apple', '%{count} apples', 2) + assert_equal '2 Äpfel', n_('An apple', '%{count} apples', 2) + end + + def test_ngettext_looks_up_msg_id_as_default_singular_with_alternative_syntax + assert_equal 'An apple', ngettext(['An apple', '%{count} apples'], 1) + assert_equal 'An apple', n_(['An apple', '%{count} apples'], 1) + end + + def test_ngettext_looks_up_msg_id_plural_as_default_plural_with_alternative_syntax + assert_equal '2 apples', ngettext(['An apple', '%{count} apples'], 2) + assert_equal '2 apples', n_(['An apple', '%{count} apples'], 2) + end + + def test_ngettext_looks_up_a_singular_with_alternative_syntax + I18n.locale = :de + assert_equal 'Ein Apfel', ngettext(['An apple', '%{count} apples'], 1) + assert_equal 'Ein Apfel', n_(['An apple', '%{count} apples'], 1) + end + + def test_ngettext_looks_up_a_plural_with_alternative_syntax + I18n.locale = :de + assert_equal '2 Äpfel', ngettext(['An apple', '%{count} apples'], 2) + assert_equal '2 Äpfel', n_(['An apple', '%{count} apples'], 2) + end + + # nsgettext + def test_nsgettext_looks_up_msg_id_as_default_singular + assert_equal 'A special apple', nsgettext('special|A special apple', '%{count} special apples', 1) + assert_equal 'A special apple', ns_('special|A special apple', '%{count} special apples', 1) + end + + def test_nsgettext_looks_up_msg_id_plural_as_default_plural + assert_equal '2 special apples', nsgettext('special|A special apple', '%{count} special apples', 2) + assert_equal '2 special apples', ns_('special|A special apple', '%{count} special apples', 2) + end + + def test_nsgettext_looks_up_a_singular + I18n.locale = :de + assert_equal 'Ein spezieller Apfel', nsgettext('special|A special apple', '%{count} special apples', 1) + assert_equal 'Ein spezieller Apfel', ns_('special|A special apple', '%{count} special apples', 1) + end + + def test_nsgettext_looks_up_a_plural + I18n.locale = :de + assert_equal '2 spezielle Äpfel', nsgettext('special|A special apple', '%{count} special apples', 2) + assert_equal '2 spezielle Äpfel', ns_('special|A special apple', '%{count} special apples', 2) + end + + def test_nsgettext_looks_up_msg_id_as_default_singular_with_alternative_syntax + assert_equal 'A special apple', nsgettext(['special|A special apple', '%{count} special apples'], 1) + assert_equal 'A special apple', ns_(['special|A special apple', '%{count} special apples'], 1) + end + + def test_nsgettext_looks_up_msg_id_plural_as_default_plural_with_alternative_syntax + assert_equal '2 special apples', nsgettext(['special|A special apple', '%{count} special apples'], 2) + assert_equal '2 special apples', ns_(['special|A special apple', '%{count} special apples'], 2) + end + + def test_nsgettext_looks_up_a_singular_with_alternative_syntax + I18n.locale = :de + assert_equal 'Ein spezieller Apfel', nsgettext(['special|A special apple', '%{count} special apples'], 1) + assert_equal 'Ein spezieller Apfel', ns_(['special|A special apple', '%{count} special apples'], 1) + end + + def test_nsgettext_looks_up_a_plural_with_alternative_syntax + I18n.locale = :de + assert_equal '2 spezielle Äpfel', nsgettext(['special|A special apple', '%{count} special apples'], 2) + assert_equal '2 spezielle Äpfel', ns_(['special|A special apple', '%{count} special apples'], 2) + end + + # npgettext + def test_npgettext_looks_up_msg_id_as_default_singular + assert_equal 'A special apple', npgettext('special', 'A special apple', '%{count} special apples', 1) + assert_equal 'A special apple', np_('special', 'A special apple', '%{count} special apples', 1) + end + + def test_npgettext_looks_up_msg_id_plural_as_default_plural + assert_equal '2 special apples', npgettext('special', 'A special apple', '%{count} special apples', 2) + assert_equal '2 special apples', np_('special', 'A special apple', '%{count} special apples', 2) + end + + def test_npgettext_looks_up_a_singular + I18n.locale = :de + assert_equal 'Ein spezieller Apfel', npgettext('special', 'A special apple', '%{count} special apples', 1) + assert_equal 'Ein spezieller Apfel', np_('special', 'A special apple', '%{count} special apples', 1) + end + + def test_npgettext_looks_up_a_plural + I18n.locale = :de + assert_equal '2 spezielle Äpfel', npgettext('special', 'A special apple', '%{count} special apples', 2) + assert_equal '2 spezielle Äpfel', np_('special', 'A special apple', '%{count} special apples', 2) + end + + def test_npgettext_looks_up_msg_id_as_default_singular_with_alternative_syntax + assert_equal 'A special apple', npgettext('special', ['A special apple', '%{count} special apples'], 1) + assert_equal 'A special apple', np_('special', ['A special apple', '%{count} special apples'], 1) + end + + def test_npgettext_looks_up_msg_id_plural_as_default_plural_with_alternative_syntax + assert_equal '2 special apples', npgettext('special', ['A special apple', '%{count} special apples'], 2) + assert_equal '2 special apples', np_('special', ['A special apple', '%{count} special apples'], 2) + end + + def test_npgettext_looks_up_a_singular_with_alternative_syntax + I18n.locale = :de + assert_equal 'Ein spezieller Apfel', npgettext('special', ['A special apple', '%{count} special apples'], 1) + assert_equal 'Ein spezieller Apfel', np_('special', ['A special apple', '%{count} special apples'], 1) + end + + def test_npgettext_looks_up_a_plural_with_alternative_syntax + I18n.locale = :de + assert_equal '2 spezielle Äpfel', npgettext('special', ['A special apple', '%{count} special apples'], 2) + assert_equal '2 spezielle Äpfel', np_('special', ['A special apple', '%{count} special apples'], 2) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/gettext/backend_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/gettext/backend_test.rb new file mode 100644 index 000000000000..30254e6be096 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/gettext/backend_test.rb @@ -0,0 +1,92 @@ +# encoding: utf-8 + +require 'test_helper' + +class I18nGettextBackendTest < I18n::TestCase + include I18n::Gettext::Helpers + + class Backend < I18n::Backend::Simple + include I18n::Backend::Gettext + end + + def setup + super + I18n.backend = Backend.new + I18n.locale = :en + I18n.load_path = ["#{locales_dir}/de.po"] + I18n.default_separator = '|' + end + + def test_backend_loads_po_file + I18n.backend.send(:init_translations) + assert I18n.backend.send(:translations)[:de][:"Axis"] + end + + def test_looks_up_a_translation + I18n.locale = :de + assert_equal 'Auto', gettext('car') + end + + def test_uses_default_translation + assert_equal 'car', gettext('car') + end + + def test_looks_up_a_namespaced_translation + I18n.locale = :de + assert_equal 'Räderzahl', sgettext('Car|Wheels count') + assert_equal 'Räderzahl', pgettext('Car', 'Wheels count') + assert_equal 'Räderzahl!', pgettext('New car', 'Wheels count') + end + + def test_uses_namespaced_default_translation + assert_equal 'Wheels count', sgettext('Car|Wheels count') + assert_equal 'Wheels count', pgettext('Car', 'Wheels count') + assert_equal 'Wheels count', pgettext('New car', 'Wheels count') + end + + def test_pluralizes_entry + I18n.locale = :de + assert_equal 'Achse', ngettext('Axis', 'Axis', 1) + assert_equal 'Achsen', ngettext('Axis', 'Axis', 2) + end + + def test_pluralizes_default_entry + assert_equal 'Axis', ngettext('Axis', 'Axis', 1) + assert_equal 'Axis', ngettext('Axis', 'Axis', 2) + end + + def test_pluralizes_namespaced_entry + I18n.locale = :de + assert_equal 'Rad', nsgettext('Car|wheel', 'wheels', 1) + assert_equal 'Räder', nsgettext('Car|wheel', 'wheels', 2) + assert_equal 'Rad', npgettext('Car', 'wheel', 'wheels', 1) + assert_equal 'Räder', npgettext('Car', 'wheel', 'wheels', 2) + assert_equal 'Rad!', npgettext('New car', 'wheel', 'wheels', 1) + assert_equal 'Räder!', npgettext('New car', 'wheel', 'wheels', 2) + end + + def test_pluralizes_namespaced_default_entry + assert_equal 'wheel', nsgettext('Car|wheel', 'wheels', 1) + assert_equal 'wheels', nsgettext('Car|wheel', 'wheels', 2) + assert_equal 'wheel', npgettext('Car', 'wheel', 'wheels', 1) + assert_equal 'wheels', npgettext('Car', 'wheel', 'wheels', 2) + assert_equal 'wheel', npgettext('New car', 'wheel', 'wheels', 1) + assert_equal 'wheels', npgettext('New car', 'wheel', 'wheels', 2) + end + + def test_pluralizes_namespaced_entry_with_alternative_syntax + I18n.locale = :de + assert_equal 'Rad', nsgettext(['Car|wheel', 'wheels'], 1) + assert_equal 'Räder', nsgettext(['Car|wheel', 'wheels'], 2) + assert_equal 'Rad', npgettext('Car', ['wheel', 'wheels'], 1) + assert_equal 'Räder', npgettext('Car', ['wheel', 'wheels'], 2) + assert_equal 'Rad!', npgettext('New car', ['wheel', 'wheels'], 1) + assert_equal 'Räder!', npgettext('New car', ['wheel', 'wheels'], 2) + end + + def test_ngettextpluralizes_entry_with_dots + I18n.locale = :de + assert_equal 'Auf 1 Achse.', n_("On %{count} wheel.", "On %{count} wheels.", 1) + assert_equal 'Auf 2 Achsen.', n_("On %{count} wheel.", "On %{count} wheels.", 2) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/exceptions_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/exceptions_test.rb new file mode 100644 index 000000000000..84e1c8fca440 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/exceptions_test.rb @@ -0,0 +1,117 @@ +require 'test_helper' + +class I18nExceptionsTest < I18n::TestCase + def test_invalid_locale_stores_locale + force_invalid_locale + rescue I18n::ArgumentError => exception + assert_nil exception.locale + end + + test "passing an invalid locale raises an InvalidLocale exception" do + force_invalid_locale do |exception| + assert_equal 'nil is not a valid locale', exception.message + end + end + + test "MissingTranslation can be initialized without options" do + exception = I18n::MissingTranslation.new(:en, 'foo') + assert_equal({}, exception.options) + end + + test "MissingTranslationData exception stores locale, key and options" do + force_missing_translation_data do |exception| + assert_equal 'de', exception.locale + assert_equal :foo, exception.key + assert_equal({:scope => :bar}, exception.options) + end + end + + test "MissingTranslationData message contains the locale and scoped key" do + force_missing_translation_data do |exception| + assert_equal 'translation missing: de.bar.foo', exception.message + end + end + + test "InvalidPluralizationData stores entry, count and key" do + force_invalid_pluralization_data do |exception| + assert_equal({:other => "bar"}, exception.entry) + assert_equal 1, exception.count + assert_equal :one, exception.key + end + end + + test "InvalidPluralizationData message contains count, data and missing key" do + force_invalid_pluralization_data do |exception| + assert_match '1', exception.message + assert_match '{:other=>"bar"}', exception.message + assert_match 'one', exception.message + end + end + + test "MissingInterpolationArgument stores key and string" do + assert_raise(I18n::MissingInterpolationArgument) { force_missing_interpolation_argument } + force_missing_interpolation_argument do |exception| + assert_equal :bar, exception.key + assert_equal "%{bar}", exception.string + end + end + + test "MissingInterpolationArgument message contains the missing and given arguments" do + force_missing_interpolation_argument do |exception| + assert_equal 'missing interpolation argument :bar in "%{bar}" ({:baz=>"baz"} given)', exception.message + end + end + + test "ReservedInterpolationKey stores key and string" do + force_reserved_interpolation_key do |exception| + assert_equal :scope, exception.key + assert_equal "%{scope}", exception.string + end + end + + test "ReservedInterpolationKey message contains the reserved key" do + force_reserved_interpolation_key do |exception| + assert_equal 'reserved key :scope used in "%{scope}"', exception.message + end + end + + test "MissingTranslationData#new can be initialized with just two arguments" do + assert I18n::MissingTranslationData.new('en', 'key') + end + + private + + def force_invalid_locale + I18n.translate(:foo, :locale => nil) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end + + def force_missing_translation_data(options = {}) + store_translations('de', :bar => nil) + I18n.translate(:foo, options.merge(:scope => :bar, :locale => :de)) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end + + def force_invalid_pluralization_data + store_translations('de', :foo => { :other => 'bar' }) + I18n.translate(:foo, :count => 1, :locale => :de) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end + + def force_missing_interpolation_argument + store_translations('de', :foo => "%{bar}") + I18n.translate(:foo, :baz => 'baz', :locale => :de) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end + + def force_reserved_interpolation_key + store_translations('de', :foo => "%{scope}") + I18n.translate(:foo, :baz => 'baz', :locale => :de) + rescue I18n::ArgumentError => e + block_given? ? yield(e) : raise(e) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/gettext_plural_keys_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/gettext_plural_keys_test.rb new file mode 100644 index 000000000000..4d0c9778048a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/gettext_plural_keys_test.rb @@ -0,0 +1,20 @@ +require 'test_helper' + +class I18nGettextPluralKeysTest < I18n::TestCase + def setup + super + I18n::Gettext.plural_keys[:zz] = [:value1, :value2] + end + + test "Returns the plural keys of the given locale if present" do + assert_equal I18n::Gettext.plural_keys(:zz), [:value1, :value2] + end + + test "Returns the plural keys of :en if given locale not present" do + assert_equal I18n::Gettext.plural_keys(:yy), [:one, :other] + end + + test "Returns the whole hash with no arguments" do + assert_equal I18n::Gettext.plural_keys, { :en => [:one, :other], :zz => [:value1, :value2] } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/interpolate_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/interpolate_test.rb new file mode 100644 index 000000000000..78e54d3bbb71 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/interpolate_test.rb @@ -0,0 +1,91 @@ +require 'test_helper' + +# thanks to Masao's String extensions, some tests taken from Masao's tests +# http://github.com/mutoh/gettext/blob/edbbe1fa8238fa12c7f26f2418403015f0270e47/test/test_string.rb + +class I18nInterpolateTest < I18n::TestCase + test "String interpolates a hash argument w/ named placeholders" do + assert_equal "Masao Mutoh", I18n.interpolate("%{first} %{last}", :first => 'Masao', :last => 'Mutoh' ) + end + + test "String interpolates a hash argument w/ named placeholders (reverse order)" do + assert_equal "Mutoh, Masao", I18n.interpolate("%{last}, %{first}", :first => 'Masao', :last => 'Mutoh' ) + end + + test "String interpolates named placeholders with sprintf syntax" do + assert_equal "10, 43.4", I18n.interpolate("%<integer>d, %<float>.1f", :integer => 10, :float => 43.4) + end + + test "String interpolates named placeholders with sprintf syntax, does not recurse" do + assert_equal "%<not_translated>s", I18n.interpolate("%{msg}", :msg => '%<not_translated>s', :not_translated => 'should not happen' ) + end + + test "String interpolation does not replace anything when no placeholders are given" do + assert_equal "aaa", I18n.interpolate("aaa", :num => 1) + end + + test "String interpolation sprintf behaviour equals Ruby 1.9 behaviour" do + assert_equal "1", I18n.interpolate("%<num>d", :num => 1) + assert_equal "0b1", I18n.interpolate("%<num>#b", :num => 1) + assert_equal "foo", I18n.interpolate("%<msg>s", :msg => "foo") + assert_equal "1.000000", I18n.interpolate("%<num>f", :num => 1.0) + assert_equal " 1", I18n.interpolate("%<num>3.0f", :num => 1.0) + assert_equal "100.00", I18n.interpolate("%<num>2.2f", :num => 100.0) + assert_equal "0x64", I18n.interpolate("%<num>#x", :num => 100.0) + assert_raise(ArgumentError) { I18n.interpolate("%<num>,d", :num => 100) } + assert_raise(ArgumentError) { I18n.interpolate("%<num>/d", :num => 100) } + end + + test "String interpolation raises an I18n::MissingInterpolationArgument when the string has extra placeholders" do + assert_raise(I18n::MissingInterpolationArgument) do # Ruby 1.9 msg: "key not found" + I18n.interpolate("%{first} %{last}", :first => 'Masao') + end + end + + test "String interpolation does not raise when extra values were passed" do + assert_nothing_raised do + assert_equal "Masao Mutoh", I18n.interpolate("%{first} %{last}", :first => 'Masao', :last => 'Mutoh', :salutation => 'Mr.' ) + end + end + + test "% acts as escape character in String interpolation" do + assert_equal "%{first}", I18n.interpolate("%%{first}", :first => 'Masao') + assert_equal "% 1", I18n.interpolate("%% %<num>d", :num => 1.0) + assert_equal "%{num} %<num>d", I18n.interpolate("%%{num} %%<num>d", :num => 1) + end + + def test_sprintf_mix_unformatted_and_formatted_named_placeholders + assert_equal "foo 1.000000", I18n.interpolate("%{name} %<num>f", :name => "foo", :num => 1.0) + end + + class RailsSafeBuffer < String + + def gsub(*args, &block) + to_str.gsub(*args, &block) + end + + end + test "with String subclass that redefined gsub method" do + assert_equal "Hello mars world", I18n.interpolate(RailsSafeBuffer.new("Hello %{planet} world"), :planet => 'mars') + end +end + +class I18nMissingInterpolationCustomHandlerTest < I18n::TestCase + def setup + super + @old_handler = I18n.config.missing_interpolation_argument_handler + I18n.config.missing_interpolation_argument_handler = lambda do |key, values, string| + "missing key is #{key}, values are #{values.inspect}, given string is '#{string}'" + end + end + + def teardown + I18n.config.missing_interpolation_argument_handler = @old_handler + super + end + + test "String interpolation can use custom missing interpolation handler" do + assert_equal %|Masao missing key is last, values are {:first=>"Masao"}, given string is '%{first} %{last}'|, + I18n.interpolate("%{first} %{last}", :first => 'Masao') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/load_path_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/load_path_test.rb new file mode 100644 index 000000000000..804aa88f7b2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/load_path_test.rb @@ -0,0 +1,34 @@ +require 'test_helper' + +class I18nLoadPathTest < I18n::TestCase + def setup + super + I18n.locale = :en + I18n.backend = I18n::Backend::Simple.new + store_translations(:en, :foo => {:bar => 'bar', :baz => 'baz'}) + end + + test "nested load paths do not break locale loading" do + I18n.load_path = [[locales_dir + '/en.yml']] + assert_equal "baz", I18n.t(:'foo.bar') + end + + test "loading an empty yml file raises an InvalidLocaleData exception" do + assert_raise I18n::InvalidLocaleData do + I18n.load_path = [[locales_dir + '/invalid/empty.yml']] + I18n.t(:'foo.bar', :default => "baz") + end + end + + test "loading an invalid yml file raises an InvalidLocaleData exception" do + assert_raise I18n::InvalidLocaleData do + I18n.load_path = [[locales_dir + '/invalid/syntax.yml']] + I18n.t(:'foo.bar', :default => "baz") + end + end + + test "adding arrays of filenames to the load path does not break locale loading" do + I18n.load_path << Dir[locales_dir + '/*.{rb,yml}'] + assert_equal "baz", I18n.t(:'foo.bar') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/middleware_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/middleware_test.rb new file mode 100644 index 000000000000..2190d189f8f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n/middleware_test.rb @@ -0,0 +1,24 @@ +require 'test_helper' + +class I18nMiddlewareTest < I18n::TestCase + def setup + super + I18n.default_locale = :fr + @app = DummyRackApp.new + @middleware = I18n::Middleware.new(@app) + end + + test "middleware initializes new config object after request" do + old_i18n_config_object_id = Thread.current[:i18n_config].object_id + @middleware.call({}) + + updated_i18n_config_object_id = Thread.current[:i18n_config].object_id + assert_not_equal updated_i18n_config_object_id, old_i18n_config_object_id + end + + test "succesfully resets i18n locale to default locale by defining new config" do + @middleware.call({}) + + assert_equal :fr, I18n.locale + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n_test.rb new file mode 100644 index 000000000000..c7e6b437fa9b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/i18n_test.rb @@ -0,0 +1,462 @@ +# encoding: utf-8 +require 'test_helper' + +class I18nTest < I18n::TestCase + def setup + super + store_translations(:en, :currency => { :format => { :separator => '.', :delimiter => ',', } }) + store_translations(:nl, :currency => { :format => { :separator => ',', :delimiter => '.', } }) + store_translations(:en, "true" => "Yes", "false" => "No") + end + + test "exposes its VERSION constant" do + assert I18n::VERSION + end + + test "uses the simple backend by default" do + assert I18n.backend.is_a?(I18n::Backend::Simple) + end + + test "can set the backend" do + begin + assert_nothing_raised { I18n.backend = self } + assert_equal self, I18n.backend + ensure + I18n.backend = I18n::Backend::Simple.new + end + end + + test "uses :en as a default_locale by default" do + assert_equal :en, I18n.default_locale + end + + test "can set the default locale" do + begin + assert_nothing_raised { I18n.default_locale = 'de' } + assert_equal :de, I18n.default_locale + ensure + I18n.default_locale = :en + end + end + + test "default_locale= doesn't ignore junk" do + assert_raise(NoMethodError) { I18n.default_locale = Class } + end + + test "raises an I18n::InvalidLocale exception when setting an unavailable default locale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.default_locale = :klingon } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "uses the default locale as a locale by default" do + assert_equal I18n.default_locale, I18n.locale + end + + test "sets the current locale to Thread.current" do + assert_nothing_raised { I18n.locale = 'de' } + assert_equal :de, I18n.locale + assert_equal :de, Thread.current[:i18n_config].locale + I18n.locale = :en + end + + test "locale= doesn't ignore junk" do + assert_raise(NoMethodError) { I18n.locale = Class } + end + + test "raises an I18n::InvalidLocale exception when setting an unavailable locale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.locale = :klingon } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "can set the configuration object" do + begin + I18n.config = self + assert_equal self, I18n.config + assert_equal self, Thread.current[:i18n_config] + ensure + I18n.config = ::I18n::Config.new + end + end + + test "locale is not shared between configurations" do + a = I18n::Config.new + b = I18n::Config.new + a.locale = :fr + b.locale = :es + assert_equal :fr, a.locale + assert_equal :es, b.locale + assert_equal :en, I18n.locale + end + + test "other options are shared between configurations" do + begin + a = I18n::Config.new + b = I18n::Config.new + a.default_locale = :fr + b.default_locale = :es + assert_equal :es, a.default_locale + assert_equal :es, b.default_locale + assert_equal :es, I18n.default_locale + ensure + I18n.default_locale = :en + end + end + + test "uses a dot as a default_separator by default" do + assert_equal '.', I18n.default_separator + end + + test "can set the default_separator" do + begin + assert_nothing_raised { I18n.default_separator = "\001" } + ensure + I18n.default_separator = '.' + end + end + + test "normalize_keys normalizes given locale, keys and scope to an array of single-key symbols" do + assert_equal [:en, :foo, :bar], I18n.normalize_keys(:en, :bar, :foo) + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz.buz', :'foo.bar') + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, 'baz.buz', 'foo.bar') + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, %w(baz buz), %w(foo bar)) + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, [:baz, :buz], [:foo, :bar]) + end + + test "normalize_keys discards empty keys" do + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz..buz', :'foo..bar') + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz......buz', :'foo......bar') + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, ['baz', nil, '', 'buz'], ['foo', nil, '', 'bar']) + end + + test "normalize_keys uses a given separator" do + assert_equal [:en, :foo, :bar, :baz, :buz], I18n.normalize_keys(:en, :'baz|buz', :'foo|bar', '|') + end + + test "can set the exception_handler" do + begin + previous_exception_handler = I18n.exception_handler + assert_nothing_raised { I18n.exception_handler = :custom_exception_handler } + ensure + I18n.exception_handler = previous_exception_handler + end + end + + test "uses a custom exception handler set to I18n.exception_handler" do + begin + previous_exception_handler = I18n.exception_handler + I18n.exception_handler = :custom_exception_handler + I18n.expects(:custom_exception_handler) + I18n.translate :bogus + ensure + I18n.exception_handler = previous_exception_handler + end + end + + test "uses a custom exception handler passed as an option" do + I18n.expects(:custom_exception_handler) + I18n.translate(:bogus, :exception_handler => :custom_exception_handler) + end + + test "delegates translate calls to the backend" do + I18n.backend.expects(:translate).with('de', :foo, {}) + I18n.translate :foo, :locale => 'de' + end + + test "delegates localize calls to the backend" do + I18n.backend.expects(:localize).with('de', :whatever, :default, {}) + I18n.localize :whatever, :locale => 'de' + end + + test "translate given no locale uses the current locale" do + I18n.backend.expects(:translate).with(:en, :foo, {}) + I18n.translate :foo + end + + test "translate works with nested symbol keys" do + assert_equal ".", I18n.t(:'currency.format.separator') + end + + test "translate works with nested string keys" do + assert_equal ".", I18n.t('currency.format.separator') + end + + test "translate with an array as a scope works" do + assert_equal ".", I18n.t(:separator, :scope => %w(currency format)) + end + + test "translate with an array containing dot separated strings as a scope works" do + assert_equal ".", I18n.t(:separator, :scope => ['currency.format']) + end + + test "translate with an array of keys and a dot separated string as a scope works" do + assert_equal [".", ","], I18n.t(%w(separator delimiter), :scope => 'currency.format') + end + + test "translate with an array of dot separated keys and a scope works" do + assert_equal [".", ","], I18n.t(%w(format.separator format.delimiter), :scope => 'currency') + end + + # def test_translate_given_no_args_raises_missing_translation_data + # assert_equal "translation missing: en, no key", I18n.t + # end + + test "translate given a bogus key returns an error message" do + assert_equal "translation missing: en.bogus", I18n.t(:bogus) + end + + test "translate given an empty string as a key raises an I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.t("") } + end + + test "translate given an empty symbol as a key raises an I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.t(:"") } + end + + test "translate given an array with empty string as a key raises an I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.t(["", :foo]) } + end + + test "translate given an empty array as a key returns empty array" do + assert_equal [], I18n.t([]) + end + + test "translate given nil returns nil" do + assert_nil I18n.t(nil) + end + + test "translate given an unavailable locale rases an I18n::InvalidLocale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.t(:foo, :locale => 'klingon') } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "translate given true as a key works" do + assert_equal "Yes", I18n.t(true) + end + + test "translate given false as a key works" do + assert_equal "No", I18n.t(false) + end + + test "available_locales can be replaced at runtime" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.t(:foo, :locale => 'klingon') } + old_locales, I18n.config.available_locales = I18n.config.available_locales, [:klingon] + I18n.t(:foo, :locale => 'klingon') + ensure + I18n.config.enforce_available_locales = false + I18n.config.available_locales = old_locales + end + end + + test "available_locales_set should return a set" do + assert_equal Set, I18n.config.available_locales_set.class + assert_equal I18n.config.available_locales.size * 2, I18n.config.available_locales_set.size + end + + test "exists? given an existing key will return true" do + assert_equal true, I18n.exists?(:currency) + end + + test "exists? given a non-existing key will return false" do + assert_equal false, I18n.exists?(:bogus) + end + + test "exists? given an existing dot-separated key will return true" do + assert_equal true, I18n.exists?('currency.format.delimiter') + end + + test "exists? given a non-existing dot-separated key will return false" do + assert_equal false, I18n.exists?('currency.format.bogus') + end + + test "exists? given an existing key and an existing locale will return true" do + assert_equal true, I18n.exists?(:currency, :nl) + end + + test "exists? given a non-existing key and an existing locale will return false" do + assert_equal false, I18n.exists?(:bogus, :nl) + end + + test "localize given nil raises an I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.l nil } + end + + test "localize given nil and default returns default" do + assert_nil I18n.l(nil, :default => nil) + end + + test "localize given an Object raises an I18n::ArgumentError" do + assert_raise(I18n::ArgumentError) { I18n.l Object.new } + end + + test "localize given an unavailable locale rases an I18n::InvalidLocale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.l(Time.now, :locale => 'klingon') } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "can use a lambda as an exception handler" do + begin + previous_exception_handler = I18n.exception_handler + I18n.exception_handler = Proc.new { |exception, locale, key, options| key } + assert_equal :test_proc_handler, I18n.translate(:test_proc_handler) + ensure + I18n.exception_handler = previous_exception_handler + end + end + + test "can use an object responding to #call as an exception handler" do + begin + previous_exception_handler = I18n.exception_handler + I18n.exception_handler = Class.new do + def call(exception, locale, key, options); key; end + end.new + assert_equal :test_proc_handler, I18n.translate(:test_proc_handler) + ensure + I18n.exception_handler = previous_exception_handler + end + end + + test "I18n.with_locale temporarily sets the given locale" do + store_translations(:en, :foo => 'Foo in :en') + store_translations(:de, :foo => 'Foo in :de') + store_translations(:pl, :foo => 'Foo in :pl') + + I18n.with_locale { assert_equal [:en, 'Foo in :en'], [I18n.locale, I18n.t(:foo)] } + I18n.with_locale(:de) { assert_equal [:de, 'Foo in :de'], [I18n.locale, I18n.t(:foo)] } + I18n.with_locale(:pl) { assert_equal [:pl, 'Foo in :pl'], [I18n.locale, I18n.t(:foo)] } + I18n.with_locale(:en) { assert_equal [:en, 'Foo in :en'], [I18n.locale, I18n.t(:foo)] } + + assert_equal I18n.default_locale, I18n.locale + end + + test "I18n.with_locale resets the locale in case of errors" do + assert_raise(I18n::ArgumentError) { I18n.with_locale(:pl) { raise I18n::ArgumentError } } + assert_equal I18n.default_locale, I18n.locale + end + + test "I18n.translitarate handles I18n::ArgumentError exception" do + I18n::Backend::Transliterator.stubs(:get).raises(I18n::ArgumentError) + I18n.exception_handler.expects(:call).raises(I18n::ArgumentError) + assert_raise(I18n::ArgumentError) { + I18n.transliterate("ąćó") + } + end + + test "I18n.translitarate raises I18n::ArgumentError exception" do + I18n::Backend::Transliterator.stubs(:get).raises(I18n::ArgumentError) + I18n.exception_handler.expects(:call).never + assert_raise(I18n::ArgumentError) { + I18n.transliterate("ąćó", :raise => true) + } + end + + test "transliterate given an unavailable locale rases an I18n::InvalidLocale" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.transliterate('string', :locale => 'klingon') } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "transliterate non-ASCII chars not in map with default replacement char" do + assert_equal "???", I18n.transliterate("日本語") + end + + test "I18n.locale_available? returns true when the passed locale is available" do + I18n.available_locales = [:en, :de] + assert_equal true, I18n.locale_available?(:de) + end + + test "I18n.locale_available? returns true when the passed locale is a string and is available" do + I18n.available_locales = [:en, :de] + assert_equal true, I18n.locale_available?('de') + end + + test "I18n.locale_available? returns false when the passed locale is unavailable" do + assert_equal false, I18n.locale_available?(:klingon) + end + + test "I18n.enforce_available_locales! raises an I18n::InvalidLocale when the passed locale is unavailable" do + begin + I18n.config.enforce_available_locales = true + assert_raise(I18n::InvalidLocale) { I18n.enforce_available_locales!(:klingon) } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "I18n.enforce_available_locales! does nothing when the passed locale is available" do + I18n.available_locales = [:en, :de] + begin + I18n.config.enforce_available_locales = true + assert_nothing_raised { I18n.enforce_available_locales!(:en) } + ensure + I18n.config.enforce_available_locales = false + end + end + + test "I18n.enforce_available_locales config can be set to false" do + begin + I18n.config.enforce_available_locales = false + assert_equal false, I18n.config.enforce_available_locales + ensure + I18n.config.enforce_available_locales = false + end + end + + test 'I18n.reload! reloads the set of locales that are enforced' do + begin + # Clear the backend that affects the available locales and somehow can remain + # set from the last running test. + # For instance, it contains enough translations to cause a false positive with + # this test when ran with --seed=50992 + I18n.backend = I18n::Backend::Simple.new + + assert !I18n.available_locales.include?(:de), "Available locales should not include :de at this point" + + I18n.enforce_available_locales = true + + assert_raise(I18n::InvalidLocale) { I18n.default_locale = :de } + assert_raise(I18n::InvalidLocale) { I18n.locale = :de } + + store_translations(:de, :foo => 'Foo in :de') + + assert_raise(I18n::InvalidLocale) { I18n.default_locale = :de } + assert_raise(I18n::InvalidLocale) { I18n.locale = :de } + + I18n.reload! + + store_translations(:en, :foo => 'Foo in :en') + store_translations(:de, :foo => 'Foo in :de') + store_translations(:pl, :foo => 'Foo in :pl') + + assert I18n.available_locales.include?(:de), ":de should now be allowed" + assert I18n.available_locales.include?(:en), ":en should now be allowed" + assert I18n.available_locales.include?(:pl), ":pl should now be allowed" + + assert_nothing_raised { I18n.default_locale = I18n.locale = :en } + assert_nothing_raised { I18n.default_locale = I18n.locale = :de } + assert_nothing_raised { I18n.default_locale = I18n.locale = :pl } + ensure + I18n.enforce_available_locales = false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/locale/fallbacks_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/locale/fallbacks_test.rb new file mode 100644 index 000000000000..7a438523edf7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/locale/fallbacks_test.rb @@ -0,0 +1,133 @@ +require 'test_helper' + +include I18n::Locale + +class I18nFallbacksDefaultsTest < I18n::TestCase + test "defaults reflect the I18n.default_locale if no default has been set manually" do + I18n.default_locale = :'en-US' + fallbacks = Fallbacks.new + assert_equal [:'en-US', :en], fallbacks.defaults + end + + test "defaults reflect a manually passed default locale if any" do + fallbacks = Fallbacks.new(:'fi-FI') + assert_equal [:'fi-FI', :fi], fallbacks.defaults + I18n.default_locale = :'de-DE' + assert_equal [:'fi-FI', :fi], fallbacks.defaults + end + + test "defaults allows to set multiple defaults" do + fallbacks = Fallbacks.new(:'fi-FI', :'se-FI') + assert_equal [:'fi-FI', :fi, :'se-FI', :se], fallbacks.defaults + end +end + +class I18nFallbacksComputationTest < I18n::TestCase + def setup + super + @fallbacks = Fallbacks.new(:'en-US') + end + + test "with no mappings defined it returns [:es, :en-US] for :es" do + assert_equal [:es, :"en-US", :en], @fallbacks[:es] + end + + test "with no mappings defined it returns [:es-ES, :es, :en-US] for :es-ES" do + assert_equal [:"es-ES", :es, :"en-US", :en], @fallbacks[:"es-ES"] + end + + test "with no mappings defined it returns [:es-MX, :es, :en-US] for :es-MX" do + assert_equal [:"es-MX", :es, :"en-US", :en], @fallbacks[:"es-MX"] + end + + test "with no mappings defined it returns [:es-Latn-ES, :es-Latn, :es, :en-US] for :es-Latn-ES" do + assert_equal [:"es-Latn-ES", :"es-Latn", :es, :"en-US", :en], @fallbacks[:'es-Latn-ES'] + end + + test "with no mappings defined it returns [:en, :en-US] for :en" do + assert_equal [:en, :"en-US"], @fallbacks[:en] + end + + test "with no mappings defined it returns [:en-US, :en] for :en-US (special case: locale == default)" do + assert_equal [:"en-US", :en], @fallbacks[:"en-US"] + end + + # Most people who speak Catalan also live in Spain, so it is safe to assume + # that they also speak Spanish as spoken in Spain. + test "with a Catalan mapping defined it returns [:ca, :es-ES, :es, :en-US] for :ca" do + @fallbacks.map(:ca => :"es-ES") + assert_equal [:ca, :"es-ES", :es, :"en-US", :en], @fallbacks[:ca] + end + + test "with a Catalan mapping defined it returns [:ca-ES, :ca, :es-ES, :es, :en-US] for :ca-ES" do + @fallbacks.map(:ca => :"es-ES") + assert_equal [:"ca-ES", :ca, :"es-ES", :es, :"en-US", :en], @fallbacks[:"ca-ES"] + end + + # People who speak Arabic as spoken in Palestine often times also speak + # Hebrew as spoken in Israel. However it is in no way safe to assume that + # everybody who speaks Arabic also speaks Hebrew. + + test "with a Hebrew mapping defined it returns [:ar, :en-US] for :ar" do + @fallbacks.map(:"ar-PS" => :"he-IL") + assert_equal [:ar, :"en-US", :en], @fallbacks[:ar] + end + + test "with a Hebrew mapping defined it returns [:ar-EG, :ar, :en-US] for :ar-EG" do + @fallbacks.map(:"ar-PS" => :"he-IL") + assert_equal [:"ar-EG", :ar, :"en-US", :en], @fallbacks[:"ar-EG"] + end + + test "with a Hebrew mapping defined it returns [:ar-PS, :ar, :he-IL, :he, :en-US] for :ar-PS" do + @fallbacks.map(:"ar-PS" => :"he-IL") + assert_equal [:"ar-PS", :ar, :"he-IL", :he, :"en-US", :en], @fallbacks[:"ar-PS"] + end + + # Sami people live in several scandinavian countries. In Finnland many people + # know Swedish and Finnish. Thus, it can be assumed that Sami living in + # Finnland also speak Swedish and Finnish. + + test "with a Sami mapping defined it returns [:sms-FI, :sms, :se-FI, :se, :fi-FI, :fi, :en-US] for :sms-FI" do + @fallbacks.map(:sms => [:"se-FI", :"fi-FI"]) + assert_equal [:"sms-FI", :sms, :"se-FI", :se, :"fi-FI", :fi, :"en-US", :en], @fallbacks[:"sms-FI"] + end + + # Austrian people understand German as spoken in Germany + + test "with a German mapping defined it returns [:de, :en-US] for de" do + @fallbacks.map(:"de-AT" => :"de-DE") + assert_equal [:de, :"en-US", :en], @fallbacks[:"de"] + end + + test "with a German mapping defined it returns [:de-DE, :de, :en-US] for de-DE" do + @fallbacks.map(:"de-AT" => :"de-DE") + assert_equal [:"de-DE", :de, :"en-US", :en], @fallbacks[:"de-DE"] + end + + test "with a German mapping defined it returns [:de-AT, :de, :de-DE, :en-US] for de-AT" do + @fallbacks.map(:"de-AT" => :"de-DE") + assert_equal [:"de-AT", :de, :"de-DE", :"en-US", :en], @fallbacks[:"de-AT"] + end + + # Mapping :de => :en, :he => :en + + test "with a mapping :de => :en, :he => :en defined it returns [:de, :en] for :de" do + assert_equal [:de, :"en-US", :en], @fallbacks[:de] + end + + test "with a mapping :de => :en, :he => :en defined it [:he, :en] for :de" do + assert_equal [:he, :"en-US", :en], @fallbacks[:he] + end + + # Test allowing mappings that fallback to each other + + test "with :no => :nb, :nb => :no defined :no returns [:no, :nb, :en-US, :en]" do + @fallbacks.map(:no => :nb, :nb => :no) + assert_equal [:no, :nb, :"en-US", :en], @fallbacks[:no] + end + + test "with :no => :nb, :nb => :no defined :nb returns [:nb, :no, :en-US, :en]" do + @fallbacks.map(:no => :nb, :nb => :no) + assert_equal [:nb, :no, :"en-US", :en], @fallbacks[:nb] + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/locale/tag/rfc4646_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/locale/tag/rfc4646_test.rb new file mode 100644 index 000000000000..a0f4286434c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/locale/tag/rfc4646_test.rb @@ -0,0 +1,143 @@ +# encoding: utf-8 +require 'test_helper' + +class I18nLocaleTagRfc4646ParserTest < I18n::TestCase + include I18n::Locale + + test "Rfc4646::Parser given a valid tag 'de' returns an array of subtags" do + assert_equal ['de', nil, nil, nil, nil, nil, nil], Tag::Rfc4646::Parser.match('de') + end + + test "Rfc4646::Parser given a valid tag 'de-DE' returns an array of subtags" do + assert_equal ['de', nil, 'DE', nil, nil, nil, nil], Tag::Rfc4646::Parser.match('de-DE') + end + + test "Rfc4646::Parser given a valid lowercase tag 'de-latn-de-variant-x-phonebk' returns an array of subtags" do + assert_equal ['de', 'latn', 'de', 'variant', nil, 'x-phonebk', nil], Tag::Rfc4646::Parser.match('de-latn-de-variant-x-phonebk') + end + + test "Rfc4646::Parser given a valid uppercase tag 'DE-LATN-DE-VARIANT-X-PHONEBK' returns an array of subtags" do + assert_equal ['DE', 'LATN', 'DE', 'VARIANT', nil, 'X-PHONEBK', nil], Tag::Rfc4646::Parser.match('DE-LATN-DE-VARIANT-X-PHONEBK') + end + + test "Rfc4646::Parser given an invalid tag 'a-DE' it returns false" do + assert_equal false, Tag::Rfc4646::Parser.match('a-DE') + end + + test "Rfc4646::Parser given an invalid tag 'de-419-DE' it returns false" do + assert_equal false, Tag::Rfc4646::Parser.match('de-419-DE') + end +end + +# Tag for the locale 'de-Latn-DE-Variant-a-ext-x-phonebk-i-klingon' + +class I18nLocaleTagSubtagsTest < I18n::TestCase + include I18n::Locale + + def setup + super + subtags = %w(de Latn DE variant a-ext x-phonebk i-klingon) + @tag = Tag::Rfc4646.new(*subtags) + end + + test "returns 'de' as the language subtag in lowercase" do + assert_equal 'de', @tag.language + end + + test "returns 'Latn' as the script subtag in titlecase" do + assert_equal 'Latn', @tag.script + end + + test "returns 'DE' as the region subtag in uppercase" do + assert_equal 'DE', @tag.region + end + + test "returns 'variant' as the variant subtag in lowercase" do + assert_equal 'variant', @tag.variant + end + + test "returns 'a-ext' as the extension subtag" do + assert_equal 'a-ext', @tag.extension + end + + test "returns 'x-phonebk' as the privateuse subtag" do + assert_equal 'x-phonebk', @tag.privateuse + end + + test "returns 'i-klingon' as the grandfathered subtag" do + assert_equal 'i-klingon', @tag.grandfathered + end + + test "returns a formatted tag string from #to_s" do + assert_equal 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon', @tag.to_s + end + + test "returns an array containing the formatted subtags from #to_a" do + assert_equal %w(de Latn DE variant a-ext x-phonebk i-klingon), @tag.to_a + end +end + +# Tag inheritance + +class I18nLocaleTagSubtagsTest < I18n::TestCase + test "#parent returns 'de-Latn-DE-variant-a-ext-x-phonebk' as the parent of 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk i-klingon)) + assert_equal 'de-Latn-DE-variant-a-ext-x-phonebk', tag.parent.to_s + end + + test "#parent returns 'de-Latn-DE-variant-a-ext' as the parent of 'de-Latn-DE-variant-a-ext-x-phonebk'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk)) + assert_equal 'de-Latn-DE-variant-a-ext', tag.parent.to_s + end + + test "#parent returns 'de-Latn-DE-variant' as the parent of 'de-Latn-DE-variant-a-ext'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext)) + assert_equal 'de-Latn-DE-variant', tag.parent.to_s + end + + test "#parent returns 'de-Latn-DE' as the parent of 'de-Latn-DE-variant'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE variant)) + assert_equal 'de-Latn-DE', tag.parent.to_s + end + + test "#parent returns 'de-Latn' as the parent of 'de-Latn-DE'" do + tag = Tag::Rfc4646.new(*%w(de Latn DE)) + assert_equal 'de-Latn', tag.parent.to_s + end + + test "#parent returns 'de' as the parent of 'de-Latn'" do + tag = Tag::Rfc4646.new(*%w(de Latn)) + assert_equal 'de', tag.parent.to_s + end + + # TODO RFC4647 says: "If no language tag matches the request, the "default" value is returned." + # where should we set the default language? + # test "#parent returns '' as the parent of 'de'" do + # tag = Tag::Rfc4646.new *%w(de) + # assert_equal '', tag.parent.to_s + # end + + test "#parent returns an array of 5 parents for 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do + parents = %w(de-Latn-DE-variant-a-ext-x-phonebk-i-klingon + de-Latn-DE-variant-a-ext-x-phonebk + de-Latn-DE-variant-a-ext + de-Latn-DE-variant + de-Latn-DE + de-Latn + de) + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk i-klingon)) + assert_equal parents, tag.self_and_parents.map(&:to_s) + end + + test "returns an array of 5 parents for 'de-Latn-DE-variant-a-ext-x-phonebk-i-klingon'" do + parents = %w(de-Latn-DE-variant-a-ext-x-phonebk-i-klingon + de-Latn-DE-variant-a-ext-x-phonebk + de-Latn-DE-variant-a-ext + de-Latn-DE-variant + de-Latn-DE + de-Latn + de) + tag = Tag::Rfc4646.new(*%w(de Latn DE variant a-ext x-phonebk i-klingon)) + assert_equal parents, tag.self_and_parents.map(&:to_s) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/locale/tag/simple_test.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/locale/tag/simple_test.rb new file mode 100644 index 000000000000..002c63d26694 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/locale/tag/simple_test.rb @@ -0,0 +1,32 @@ +# encoding: utf-8 +require 'test_helper' + +class I18nLocaleTagSimpleTest < I18n::TestCase + include I18n::Locale + + test "returns 'de' as the language subtag in lowercase" do + assert_equal %w(de Latn DE), Tag::Simple.new('de-Latn-DE').subtags + end + + test "returns a formatted tag string from #to_s" do + assert_equal 'de-Latn-DE', Tag::Simple.new('de-Latn-DE').to_s + end + + test "returns an array containing the formatted subtags from #to_a" do + assert_equal %w(de Latn DE), Tag::Simple.new('de-Latn-DE').to_a + end + + # Tag inheritance + + test "#parent returns 'de-Latn' as the parent of 'de-Latn-DE'" do + assert_equal 'de-Latn', Tag::Simple.new('de-Latn-DE').parent.to_s + end + + test "#parent returns 'de' as the parent of 'de-Latn'" do + assert_equal 'de', Tag::Simple.new('de-Latn').parent.to_s + end + + test "#self_and_parents returns an array of 3 tags for 'de-Latn-DE'" do + assert_equal %w(de-Latn-DE de-Latn de), Tag::Simple.new('de-Latn-DE').self_and_parents.map { |tag| tag.to_s} + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/run_all.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/run_all.rb new file mode 100644 index 000000000000..64ff743db616 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/run_all.rb @@ -0,0 +1,20 @@ +def bundle_check + `bundle check` == "Resolving dependencies...\nThe Gemfile's dependencies are satisfied\n" +end + +def execute(command) + puts command + system command +end + +gemfiles = %w(Gemfile) + Dir['gemfiles/Gemfile*'].reject { |f| f.end_with?('.lock') } + +results = gemfiles.map do |gemfile| + puts "\nBUNDLE_GEMFILE=#{gemfile}" + ENV['BUNDLE_GEMFILE'] = File.expand_path("../../#{gemfile}", __FILE__) + + execute 'bundle install' unless bundle_check + execute 'bundle exec rake test' +end + +exit results.all? diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/de.po b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/de.po new file mode 100644 index 000000000000..f3c9998d034b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/de.po @@ -0,0 +1,82 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2009-02-26 19:50+0100\n" +"PO-Revision-Date: 2009-02-18 14:53+0100\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +# #: app/helpers/translation_helper.rb:3 +# msgid "%{relative_time} ago" +# msgstr "vor %{relative_time}" + +#: app/views/cars/show.html.erb:5 +msgid "Axis" +msgid_plural "Axis" +msgstr[0] "Achse" +msgstr[1] "Achsen" + +#: app/controllers/cars_controller.rb:47 +msgid "Car was successfully created." +msgstr "Auto wurde erfolgreich gespeichert" + +#: app/controllers/cars_controller.rb:64 +msgid "Car was successfully updated." +msgstr "Auto wurde erfolgreich aktualisiert" + +#: app/views/cars/show.html.erb:1 locale/model_attributes.rb:3 +msgid "Car|Model" +msgstr "Modell" + +#: app/views/cars/show.html.erb:3 locale/model_attributes.rb:4 +msgid "Car|Wheels count" +msgstr "Räderzahl" + +msgctxt "New car" +msgid "Wheels count" +msgstr "Räderzahl!" + +#: app/views/cars/show.html.erb:7 +msgid "Created" +msgstr "Erstellt" + +#: app/views/cars/show.html.erb:9 +msgid "Month" +msgstr "Monat" + +#: locale/model_attributes.rb:2 +msgid "car" +msgstr "Auto" + +#: locale/testlog_phrases.rb:2 +msgid "this is a dynamic translation which was found thorugh gettext_test_log!" +msgstr "" +"Dies ist eine dynamische Übersetzung, die durch gettext_test_log " +"gefunden wurde!" + +#: app/views/cars/nowhere_really +msgid "Car|wheel" +msgid_plural "Car|wheels" +msgstr[0] "Rad" +msgstr[1] "Räder" + +msgctxt "New car" +msgid "wheel" +msgid_plural "wheels" +msgstr[0] "Rad!" +msgstr[1] "Räder!" + +msgid "On %{count} wheel." +msgid_plural "On %{count} wheels." +msgstr[0] "Auf %{count} Achse." +msgstr[1] "Auf %{count} Achsen." diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/en.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/en.rb new file mode 100644 index 000000000000..e847d1046c3c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/en.rb @@ -0,0 +1,3 @@ +# encoding: utf-8 + +{ :en => { :fuh => { :bah => "bas" } } } \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/en.yml b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/en.yml new file mode 100644 index 000000000000..25f5bb6ddea9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/en.yml @@ -0,0 +1,3 @@ +en: + foo: + bar: baz \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/invalid/empty.yml b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/invalid/empty.yml new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/invalid/syntax.yml b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/invalid/syntax.yml new file mode 100644 index 000000000000..40b1e61402ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/invalid/syntax.yml @@ -0,0 +1,4 @@ +en: + foo: foo + bar: + baz: \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/plurals.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/plurals.rb new file mode 100644 index 000000000000..f4002851a2fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_data/locales/plurals.rb @@ -0,0 +1,113 @@ +# encoding: utf-8 + +{ + :af => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :am => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :ar => { :i18n => { :plural => { :keys => [:zero, :one, :two, :few, :many, :other], :rule => lambda { |n| n == 0 ? :zero : n == 1 ? :one : n == 2 ? :two : [3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99].include?(n % 100) ? :many : :other } } } }, + :az => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :be => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :bg => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :bh => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :bn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :bo => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :bs => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :ca => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :cs => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } }, + :cy => { :i18n => { :plural => { :keys => [:one, :two, :many, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : n == 8 || n == 11 ? :many : :other } } } }, + :da => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :de => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :dz => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :el => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :en => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :eo => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :es => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :et => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :eu => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :fa => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :fi => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :fil => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :fo => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :fr => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n.between?(0, 2) && n != 2 ? :one : :other } } } }, + :fur => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :fy => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ga => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :gl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :gu => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :guw => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :ha => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :he => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :hi => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :hr => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :hu => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :id => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :is => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :it => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :iw => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ja => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :jv => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :ka => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :km => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :kn => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :ko => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :ku => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :lb => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ln => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :lt => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n % 10 == 1 && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :one : [2, 3, 4, 5, 6, 7, 8, 9].include?(n % 10) && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :few : :other } } } }, + :lv => { :i18n => { :plural => { :keys => [:zero, :one, :other], :rule => lambda { |n| n == 0 ? :zero : n % 10 == 1 && n % 100 != 11 ? :one : :other } } } }, + :mg => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :mk => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n % 10 == 1 ? :one : :other } } } }, + :ml => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :mn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :mo => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 ? :few : :other } } } }, + :mr => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ms => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :mt => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 || [2, 3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :many : :other } } } }, + :my => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :nah => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :nb => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ne => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :nl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :nn => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :no => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :nso => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :om => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :or => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :pa => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :pap => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :pl => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : (n != 1 && [0, 1].include?(n % 10)) || [5, 6, 7, 8, 9].include?(n % 10) || [12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :ps => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :pt => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :"pt-PT" => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ro => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 ? :few : :other } } } }, + :ru => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :se => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :sh => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :sk => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other } } } }, + :sl => { :i18n => { :plural => { :keys => [:one, :two, :few, :other], :rule => lambda { |n| n % 100 == 1 ? :one : n % 100 == 2 ? :two : [3, 4].include?(n % 100) ? :few : :other } } } }, + :sma => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :smi => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :smj => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :smn => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :sms => { :i18n => { :plural => { :keys => [:one, :two, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : :other } } } }, + :so => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :sq => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :sr => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :sv => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :sw => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :ta => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :te => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :th => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :ti => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :tk => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :tl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :to => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :tr => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :uk => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :ur => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, + :vi => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :wa => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, + :yo => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :zh => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, + :zu => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } } +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_helper.rb b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_helper.rb new file mode 100644 index 000000000000..702a1b57d539 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/i18n-0.9.5/test/test_helper.rb @@ -0,0 +1,61 @@ +$KCODE = 'u' if RUBY_VERSION <= '1.9' + +require 'minitest/autorun' +TEST_CASE = defined?(Minitest::Test) ? Minitest::Test : MiniTest::Unit::TestCase + +# TODO: Remove these aliases and update tests accordingly. +class TEST_CASE + alias :assert_raise :assert_raises + alias :assert_not_equal :refute_equal + + def assert_nothing_raised(*args) + yield + end +end + +require 'bundler/setup' +require 'i18n' +require 'mocha/setup' +require 'test_declarative' + +class I18n::TestCase < TEST_CASE + def self.key_value? + defined?(ActiveSupport) + end + + def setup + super + I18n.enforce_available_locales = false + end + + def teardown + I18n.locale = nil + I18n.default_locale = nil + I18n.load_path = nil + I18n.available_locales = nil + I18n.backend = nil + I18n.default_separator = nil + I18n.enforce_available_locales = true + super + end + + protected + + def translations + I18n.backend.instance_variable_get(:@translations) + end + + def store_translations(locale, data) + I18n.backend.store_translations(locale, data) + end + + def locales_dir + File.dirname(__FILE__) + '/test_data/locales' + end +end + +class DummyRackApp + def call(env) + I18n.locale = :es + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/.rubocop.yml new file mode 100644 index 000000000000..e10e55511c3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/.rubocop.yml @@ -0,0 +1,183 @@ +--- + +require: + - ./rubocop/jekyll + +Jekyll/NoPutsAllowed: + Exclude: + - rake/*.rake + +AllCops: + TargetRubyVersion: 2.1 + Include: + - lib/**/*.rb + Exclude: + - bin/**/* + - exe/**/* + - benchmark/**/* + - script/**/* + - vendor/**/* + - tmp/**/* +Layout/AlignArray: + Enabled: false +Layout/AlignHash: + EnforcedHashRocketStyle: table +Layout/AlignParameters: + Enabled: false +Layout/EmptyLinesAroundAccessModifier: + Enabled: false +Layout/EmptyLinesAroundModuleBody: + Enabled: false +Layout/EndOfLine: + EnforcedStyle: native +Layout/ExtraSpacing: + AllowForAlignment: true +Layout/FirstParameterIndentation: + EnforcedStyle: consistent +Layout/IndentationWidth: + Severity: error +Layout/IndentArray: + EnforcedStyle: consistent +Layout/IndentHash: + EnforcedStyle: consistent +Layout/IndentHeredoc: + Enabled: false +Layout/MultilineMethodCallIndentation: + EnforcedStyle: indented +Layout/MultilineOperationIndentation: + EnforcedStyle: indented +Lint/NestedPercentLiteral: + Exclude: + - test/test_site.rb +Layout/EmptyComment: + Enabled: false +Layout/EndAlignment: + Severity: error +Lint/SplatKeywordArguments: + Enabled: false +Lint/UnreachableCode: + Severity: error +Lint/UselessAccessModifier: + Enabled: false +Lint/Void: + Enabled: false +Metrics/AbcSize: + Max: 21 +Metrics/BlockLength: + Exclude: + - test/**/*.rb + - lib/jekyll/configuration.rb + - rake/*.rake + - jekyll.gemspec +Metrics/ClassLength: + Exclude: + - !ruby/regexp /features\/.*.rb$/ + - !ruby/regexp /test\/.*.rb$/ + Max: 300 +Metrics/CyclomaticComplexity: + Max: 9 +Metrics/LineLength: + Exclude: + - !ruby/regexp /features\/.*.rb/ + - Rakefile + - rake/*.rake + - Gemfile + - jekyll.gemspec + Max: 90 + Severity: warning +Metrics/MethodLength: + CountComments: false + Max: 20 + Severity: error +Metrics/ModuleLength: + Max: 240 +Metrics/ParameterLists: + Max: 4 +Metrics/PerceivedComplexity: + Max: 8 +Naming/FileName: + Enabled: false +Naming/HeredocDelimiterNaming: + Enabled: false +Naming/MemoizedInstanceVariableName: + Exclude: + - lib/jekyll/page_without_a_file.rb + - lib/jekyll/drops/unified_payload_drop.rb + - lib/jekyll/drops/site_drop.rb +Naming/UncommunicativeMethodParamName: + AllowedNames: + - _ +Security/MarshalLoad: + Exclude: + - !ruby/regexp /test\/.*.rb$/ + - lib/jekyll/regenerator.rb +Security/YAMLLoad: + Exclude: + - !ruby/regexp /features\/.*.rb/ + - !ruby/regexp /test\/.*.rb$/ +Style/Alias: + Enabled: false +Style/AndOr: + Severity: error +Style/BracesAroundHashParameters: + Enabled: false +Style/ClassAndModuleChildren: + Enabled: false +Style/FrozenStringLiteralComment: + EnforcedStyle: always +Style/Documentation: + Enabled: false + Exclude: + - !ruby/regexp /features\/.*.rb$/ +Style/DoubleNegation: + Enabled: false +Style/FormatStringToken: + Exclude: + - lib/jekyll/utils/ansi.rb +Style/GuardClause: + Enabled: false +Style/HashSyntax: + EnforcedStyle: hash_rockets + Severity: error +Style/IfUnlessModifier: + Enabled: false +Style/InverseMethods: + Enabled: false +Style/MixinUsage: + Exclude: + - test/helper.rb +Style/ModuleFunction: + Enabled: false +Style/MultilineTernaryOperator: + Severity: error +Style/PercentLiteralDelimiters: + PreferredDelimiters: + "%q": "{}" + "%Q": "{}" + "%r": "!!" + "%s": "()" + "%w": "()" + "%W": "()" + "%x": "()" +Style/RedundantReturn: + Enabled: false +Style/RedundantSelf: + Enabled: false +Style/RegexpLiteral: + EnforcedStyle: percent_r +Style/RescueModifier: + Enabled: false +Style/SignalException: + EnforcedStyle: only_raise +Style/SingleLineMethods: + Enabled: false +Style/StringLiterals: + EnforcedStyle: double_quotes +Style/StringLiteralsInInterpolation: + EnforcedStyle: double_quotes +Style/SymbolArray: + Enabled: false +Style/TrailingCommaInArrayLiteral: + EnforcedStyleForMultiline: consistent_comma +Style/TrailingCommaInHashLiteral: + EnforcedStyleForMultiline: consistent_comma diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/LICENSE new file mode 100644 index 000000000000..c98bc25f3162 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2008-2018 Tom Preston-Werner and Jekyll contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/README.markdown b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/README.markdown new file mode 100644 index 000000000000..c6864b4b3ad9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/README.markdown @@ -0,0 +1,61 @@ +# [Jekyll](https://jekyllrb.com/) + +[![Gem Version](https://img.shields.io/gem/v/jekyll.svg)][ruby-gems] +[![Linux Build Status](https://img.shields.io/travis/jekyll/jekyll/master.svg?label=Linux%20build)][travis] +[![Windows Build status](https://img.shields.io/appveyor/ci/jekyll/jekyll/master.svg?label=Windows%20build)][appveyor] +[![Maintainability](https://api.codeclimate.com/v1/badges/8ba0cb5b17bb9848e128/maintainability)](codeclimate) +[![Test Coverage](https://api.codeclimate.com/v1/badges/8ba0cb5b17bb9848e128/test_coverage)](coverage) +[![Dependency Status](https://img.shields.io/gemnasium/jekyll/jekyll.svg)][gemnasium] +[![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)][hakiri] + +[ruby-gems]: https://rubygems.org/gems/jekyll +[gemnasium]: https://gemnasium.com/jekyll/jekyll +[codeclimate]: https://codeclimate.com/github/jekyll/jekyll +[coverage]: https://codeclimate.com/github/jekyll/jekyll/coverage +[hakiri]: https://hakiri.io/github/jekyll/jekyll/master +[travis]: https://travis-ci.org/jekyll/jekyll +[appveyor]: https://ci.appveyor.com/project/jekyll/jekyll/branch/master + +Jekyll is a simple, blog-aware, static site generator perfect for personal, project, or organization sites. Think of it like a file-based CMS, without all the complexity. Jekyll takes your content, renders Markdown and Liquid templates, and spits out a complete, static website ready to be served by Apache, Nginx or another web server. Jekyll is the engine behind [GitHub Pages](https://pages.github.com), which you can use to host sites right from your GitHub repositories. + +## Philosophy + +Jekyll does what you tell it to do — no more, no less. It doesn't try to outsmart users by making bold assumptions, nor does it burden them with needless complexity and configuration. Put simply, Jekyll gets out of your way and allows you to concentrate on what truly matters: your content. + +See: https://jekyllrb.com/philosophy + +## Having trouble? + +See: https://jekyllrb.com/docs/troubleshooting/ + +## Getting Started + +* [Install](https://jekyllrb.com/docs/installation/) the gem +* Read up about its [Usage](https://jekyllrb.com/docs/usage/) and [Configuration](https://jekyllrb.com/docs/configuration/) +* Take a gander at some existing [Sites](https://wiki.github.com/jekyll/jekyll/sites) +* [Fork](https://github.com/jekyll/jekyll/fork) and [Contribute](https://jekyllrb.com/docs/contributing/) your own modifications +* Have questions? Check out our official forum community [Jekyll Talk](https://talk.jekyllrb.com/) or [`#jekyll` on irc.freenode.net](https://botbot.me/freenode/jekyll/) + +## Code of Conduct + +In order to have a more open and welcoming community, Jekyll adheres to a +[code of conduct](CODE_OF_CONDUCT.markdown) adapted from the Ruby on Rails code of +conduct. + +Please adhere to this code of conduct in any interactions you have in the +Jekyll community. It is strictly enforced on all official Jekyll +repositories, websites, and resources. If you encounter someone violating +these terms, please let one of our core team members [Olivia](mailto:olivia@jekyllrb.com?subject=Jekyll%20CoC%20Violation), [Pat](mailto:pat@jekyllrb.com?subject=Jekyll%20CoC%20Violation), [Matt](mailto:matt@jekyllrb.com?subject=Jekyll%20CoC%20Violation) or [Parker](mailto:parker@jekyllrb.com?subject=Jekyll%20CoC%20Violation) know and we will address it as soon as possible. + +## Diving In + +* [Migrate](http://import.jekyllrb.com/docs/home/) from your previous system +* Learn how the [YAML Front Matter](https://jekyllrb.com/docs/frontmatter/) works +* Put information on your site with [Variables](https://jekyllrb.com/docs/variables/) +* Customize the [Permalinks](https://jekyllrb.com/docs/permalinks/) your posts are generated with +* Use the built-in [Liquid Extensions](https://jekyllrb.com/docs/templates/) to make your life easier +* Use custom [Plugins](https://jekyllrb.com/docs/plugins/) to generate content specific to your site + +## License + +See the [LICENSE](https://github.com/jekyll/jekyll/blob/master/LICENSE) file. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/exe/jekyll b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/exe/jekyll new file mode 100644 index 000000000000..07e13717771e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/exe/jekyll @@ -0,0 +1,57 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +STDOUT.sync = true + +$LOAD_PATH.unshift File.expand_path("../lib", __dir__) + +require "jekyll" +require "mercenary" + +Jekyll::PluginManager.require_from_bundler + +Jekyll::Deprecator.process(ARGV) + +Mercenary.program(:jekyll) do |p| + p.version Jekyll::VERSION + p.description "Jekyll is a blog-aware, static site generator in Ruby" + p.syntax "jekyll <subcommand> [options]" + + p.option "source", "-s", "--source [DIR]", "Source directory (defaults to ./)" + p.option "destination", "-d", "--destination [DIR]", + "Destination directory (defaults to ./_site)" + p.option "safe", "--safe", "Safe mode (defaults to false)" + p.option "plugins_dir", "-p", "--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]", Array, + "Plugins directory (defaults to ./_plugins)" + p.option "layouts_dir", "--layouts DIR", String, + "Layouts directory (defaults to ./_layouts)" + p.option "profile", "--profile", "Generate a Liquid rendering profile" + + Jekyll::External.require_if_present(Jekyll::External.blessed_gems) do |g, ver_constraint| + cmd = g.split("-").last + p.command(cmd.to_sym) do |c| + c.syntax cmd + c.action do + Jekyll.logger.abort_with "You must install the '#{g}' gem" \ + " version #{ver_constraint} to use the 'jekyll #{cmd}' command." + end + end + end + + Jekyll::Command.subclasses.each { |c| c.init_with_program(p) } + + p.action do |args, _| + if args.empty? + Jekyll.logger.error "A subcommand is required." + puts p + abort + else + subcommand = args.first + unless p.has_command? subcommand + Jekyll.logger.abort_with "fatal: 'jekyll #{args.first}' could not" \ + " be found. You may need to install the jekyll-#{args.first} gem" \ + " or a related gem to be able to use this subcommand." + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll.rb new file mode 100644 index 000000000000..56a9b84f5b23 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll.rb @@ -0,0 +1,200 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift __dir__ # For use/testing when no gem is installed + +# Require all of the Ruby files in the given directory. +# +# path - The String relative path from here to the directory. +# +# Returns nothing. +def require_all(path) + glob = File.join(__dir__, path, "*.rb") + Dir[glob].sort.each do |f| + require f + end +end + +# rubygems +require "rubygems" + +# stdlib +require "forwardable" +require "fileutils" +require "time" +require "English" +require "pathname" +require "logger" +require "set" +require "csv" +require "json" + +# 3rd party +require "pathutil" +require "addressable/uri" +require "safe_yaml/load" +require "liquid" +require "kramdown" +require "colorator" +require "i18n" + +SafeYAML::OPTIONS[:suppress_warnings] = true + +module Jekyll + # internal requires + autoload :Cleaner, "jekyll/cleaner" + autoload :Collection, "jekyll/collection" + autoload :Configuration, "jekyll/configuration" + autoload :Convertible, "jekyll/convertible" + autoload :Deprecator, "jekyll/deprecator" + autoload :Document, "jekyll/document" + autoload :EntryFilter, "jekyll/entry_filter" + autoload :Errors, "jekyll/errors" + autoload :Excerpt, "jekyll/excerpt" + autoload :External, "jekyll/external" + autoload :FrontmatterDefaults, "jekyll/frontmatter_defaults" + autoload :Hooks, "jekyll/hooks" + autoload :Layout, "jekyll/layout" + autoload :CollectionReader, "jekyll/readers/collection_reader" + autoload :DataReader, "jekyll/readers/data_reader" + autoload :LayoutReader, "jekyll/readers/layout_reader" + autoload :PostReader, "jekyll/readers/post_reader" + autoload :PageReader, "jekyll/readers/page_reader" + autoload :StaticFileReader, "jekyll/readers/static_file_reader" + autoload :ThemeAssetsReader, "jekyll/readers/theme_assets_reader" + autoload :LogAdapter, "jekyll/log_adapter" + autoload :Page, "jekyll/page" + autoload :PageWithoutAFile, "jekyll/page_without_a_file" + autoload :PluginManager, "jekyll/plugin_manager" + autoload :Publisher, "jekyll/publisher" + autoload :Reader, "jekyll/reader" + autoload :Regenerator, "jekyll/regenerator" + autoload :RelatedPosts, "jekyll/related_posts" + autoload :Renderer, "jekyll/renderer" + autoload :LiquidRenderer, "jekyll/liquid_renderer" + autoload :Site, "jekyll/site" + autoload :StaticFile, "jekyll/static_file" + autoload :Stevenson, "jekyll/stevenson" + autoload :Theme, "jekyll/theme" + autoload :ThemeBuilder, "jekyll/theme_builder" + autoload :URL, "jekyll/url" + autoload :Utils, "jekyll/utils" + autoload :VERSION, "jekyll/version" + + # extensions + require "jekyll/plugin" + require "jekyll/converter" + require "jekyll/generator" + require "jekyll/command" + require "jekyll/liquid_extensions" + require "jekyll/filters" + + class << self + # Public: Tells you which Jekyll environment you are building in so you can skip tasks + # if you need to. This is useful when doing expensive compression tasks on css and + # images and allows you to skip that when working in development. + + def env + ENV["JEKYLL_ENV"] || "development" + end + + # Public: Generate a Jekyll configuration Hash by merging the default + # options with anything in _config.yml, and adding the given options on top. + # + # override - A Hash of config directives that override any options in both + # the defaults and the config file. + # See Jekyll::Configuration::DEFAULTS for a + # list of option names and their defaults. + # + # Returns the final configuration Hash. + def configuration(override = {}) + config = Configuration.new + override = Configuration[override].stringify_keys + unless override.delete("skip_config_files") + config = config.read_config_files(config.config_files(override)) + end + + # Merge DEFAULTS < _config.yml < override + Configuration.from(Utils.deep_merge_hashes(config, override)).tap do |obj| + set_timezone(obj["timezone"]) if obj["timezone"] + end + end + + # Public: Set the TZ environment variable to use the timezone specified + # + # timezone - the IANA Time Zone + # + # Returns nothing + # rubocop:disable Naming/AccessorMethodName + def set_timezone(timezone) + ENV["TZ"] = if Utils::Platforms.really_windows? + Utils::WinTZ.calculate(timezone) + else + timezone + end + end + # rubocop:enable Naming/AccessorMethodName + + # Public: Fetch the logger instance for this Jekyll process. + # + # Returns the LogAdapter instance. + def logger + @logger ||= LogAdapter.new(Stevenson.new, (ENV["JEKYLL_LOG_LEVEL"] || :info).to_sym) + end + + # Public: Set the log writer. + # New log writer must respond to the same methods + # as Ruby's interal Logger. + # + # writer - the new Logger-compatible log transport + # + # Returns the new logger. + def logger=(writer) + @logger = LogAdapter.new(writer, (ENV["JEKYLL_LOG_LEVEL"] || :info).to_sym) + end + + # Public: An array of sites + # + # Returns the Jekyll sites created. + def sites + @sites ||= [] + end + + # Public: Ensures the questionable path is prefixed with the base directory + # and prepends the questionable path with the base directory if false. + # + # base_directory - the directory with which to prefix the questionable path + # questionable_path - the path we're unsure about, and want prefixed + # + # Returns the sanitized path. + def sanitized_path(base_directory, questionable_path) + return base_directory if base_directory.eql?(questionable_path) + + clean_path = questionable_path.dup + clean_path.insert(0, "/") if clean_path.start_with?("~") + clean_path = File.expand_path(clean_path, "/") + + return clean_path if clean_path.eql?(base_directory) + + if clean_path.start_with?(base_directory.sub(%r!\z!, "/")) + clean_path + else + clean_path.sub!(%r!\A\w:/!, "/") + File.join(base_directory, clean_path) + end + end + + # Conditional optimizations + Jekyll::External.require_if_present("liquid-c") + end +end + +require "jekyll/drops/drop" +require "jekyll/drops/document_drop" +require_all "jekyll/commands" +require_all "jekyll/converters" +require_all "jekyll/converters/markdown" +require_all "jekyll/drops" +require_all "jekyll/generators" +require_all "jekyll/tags" + +require "jekyll-sass-converter" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/cleaner.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/cleaner.rb new file mode 100644 index 000000000000..36d28a9b6db4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/cleaner.rb @@ -0,0 +1,110 @@ +# frozen_string_literal: true + +module Jekyll + # Handles the cleanup of a site's destination before it is built. + class Cleaner + HIDDEN_FILE_REGEX = %r!\/\.{1,2}$! + attr_reader :site + + def initialize(site) + @site = site + end + + # Cleans up the site's destination directory + def cleanup! + FileUtils.rm_rf(obsolete_files) + FileUtils.rm_rf(metadata_file) unless @site.incremental? + end + + private + + # Private: The list of files and directories to be deleted during cleanup process + # + # Returns an Array of the file and directory paths + def obsolete_files + out = (existing_files - new_files - new_dirs + replaced_files).to_a + Jekyll::Hooks.trigger :clean, :on_obsolete, out + out + end + + # Private: The metadata file storing dependency tree and build history + # + # Returns an Array with the metdata file as the only item + def metadata_file + [site.regenerator.metadata_file] + end + + # Private: The list of existing files, apart from those included in + # keep_files and hidden files. + # + # Returns a Set with the file paths + def existing_files + files = Set.new + regex = keep_file_regex + dirs = keep_dirs + + Utils.safe_glob(site.in_dest_dir, ["**", "*"], File::FNM_DOTMATCH).each do |file| + next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file) + files << file + end + + files + end + + # Private: The list of files to be created when site is built. + # + # Returns a Set with the file paths + def new_files + @new_files ||= Set.new.tap do |files| + site.each_site_file { |item| files << item.destination(site.dest) } + end + end + + # Private: The list of directories to be created when site is built. + # These are the parent directories of the files in #new_files. + # + # Returns a Set with the directory paths + def new_dirs + @new_dirs ||= new_files.map { |file| parent_dirs(file) }.flatten.to_set + end + + # Private: The list of parent directories of a given file + # + # Returns an Array with the directory paths + def parent_dirs(file) + parent_dir = File.dirname(file) + if parent_dir == site.dest + [] + else + [parent_dir] + parent_dirs(parent_dir) + end + end + + # Private: The list of existing files that will be replaced by a directory + # during build + # + # Returns a Set with the file paths + def replaced_files + new_dirs.select { |dir| File.file?(dir) }.to_set + end + + # Private: The list of directories that need to be kept because they are + # parent directories of files specified in keep_files + # + # Returns a Set with the directory paths + def keep_dirs + site.keep_files.map { |file| parent_dirs(site.in_dest_dir(file)) }.flatten.to_set + end + + # Private: Creates a regular expression from the config's keep_files array + # + # Examples + # ['.git','.svn'] with site.dest "/myblog/_site" creates + # the following regex: /\A\/myblog\/_site\/(\.git|\/.svn)/ + # + # Returns the regular expression + def keep_file_regex + %r!\A#{Regexp.quote(site.dest)}\/(#{Regexp.union(site.keep_files).source})! + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/collection.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/collection.rb new file mode 100644 index 000000000000..4a8b6f5320ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/collection.rb @@ -0,0 +1,237 @@ +# frozen_string_literal: true + +module Jekyll + class Collection + attr_reader :site, :label, :metadata + attr_writer :docs + + # Create a new Collection. + # + # site - the site to which this collection belongs. + # label - the name of the collection + # + # Returns nothing. + def initialize(site, label) + @site = site + @label = sanitize_label(label) + @metadata = extract_metadata + end + + # Fetch the Documents in this collection. + # Defaults to an empty array if no documents have been read in. + # + # Returns an array of Jekyll::Document objects. + def docs + @docs ||= [] + end + + # Override of normal respond_to? to match method_missing's logic for + # looking in @data. + def respond_to_missing?(method, include_private = false) + docs.respond_to?(method.to_sym, include_private) || super + end + + # Override of method_missing to check in @data for the key. + def method_missing(method, *args, &blck) + if docs.respond_to?(method.to_sym) + Jekyll.logger.warn "Deprecation:", + "#{label}.#{method} should be changed to #{label}.docs.#{method}." + Jekyll.logger.warn "", "Called by #{caller(0..0)}." + docs.public_send(method.to_sym, *args, &blck) + else + super + end + end + + # Fetch the static files in this collection. + # Defaults to an empty array if no static files have been read in. + # + # Returns an array of Jekyll::StaticFile objects. + def files + @files ||= [] + end + + # Read the allowed documents into the collection's array of docs. + # + # Returns the sorted array of docs. + def read + filtered_entries.each do |file_path| + full_path = collection_dir(file_path) + next if File.directory?(full_path) + if Utils.has_yaml_header? full_path + read_document(full_path) + else + read_static_file(file_path, full_path) + end + end + docs.sort! + end + + # All the entries in this collection. + # + # Returns an Array of file paths to the documents in this collection + # relative to the collection's directory + def entries + return [] unless exists? + @entries ||= + Utils.safe_glob(collection_dir, ["**", "*"], File::FNM_DOTMATCH).map do |entry| + entry["#{collection_dir}/"] = "" + entry + end + end + + # Filtered version of the entries in this collection. + # See `Jekyll::EntryFilter#filter` for more information. + # + # Returns a list of filtered entry paths. + def filtered_entries + return [] unless exists? + @filtered_entries ||= + Dir.chdir(directory) do + entry_filter.filter(entries).reject do |f| + path = collection_dir(f) + File.directory?(path) || entry_filter.symlink?(f) + end + end + end + + # The directory for this Collection, relative to the site source or the directory + # containing the collection. + # + # Returns a String containing the directory name where the collection + # is stored on the filesystem. + def relative_directory + @relative_directory ||= "_#{label}" + end + + # The full path to the directory containing the collection. + # + # Returns a String containing th directory name where the collection + # is stored on the filesystem. + def directory + @directory ||= site.in_source_dir( + File.join(container, relative_directory) + ) + end + + # The full path to the directory containing the collection, with + # optional subpaths. + # + # *files - (optional) any other path pieces relative to the + # directory to append to the path + # + # Returns a String containing th directory name where the collection + # is stored on the filesystem. + def collection_dir(*files) + return directory if files.empty? + site.in_source_dir(container, relative_directory, *files) + end + + # Checks whether the directory "exists" for this collection. + # The directory must exist on the filesystem and must not be a symlink + # if in safe mode. + # + # Returns false if the directory doesn't exist or if it's a symlink + # and we're in safe mode. + def exists? + File.directory?(directory) && !entry_filter.symlink?(directory) + end + + # The entry filter for this collection. + # Creates an instance of Jekyll::EntryFilter. + # + # Returns the instance of Jekyll::EntryFilter for this collection. + def entry_filter + @entry_filter ||= Jekyll::EntryFilter.new(site, relative_directory) + end + + # An inspect string. + # + # Returns the inspect string + def inspect + "#<Jekyll::Collection @label=#{label} docs=#{docs}>" + end + + # Produce a sanitized label name + # Label names may not contain anything but alphanumeric characters, + # underscores, and hyphens. + # + # label - the possibly-unsafe label + # + # Returns a sanitized version of the label. + def sanitize_label(label) + label.gsub(%r![^a-z0-9_\-\.]!i, "") + end + + # Produce a representation of this Collection for use in Liquid. + # Exposes two attributes: + # - label + # - docs + # + # Returns a representation of this collection for use in Liquid. + def to_liquid + Drops::CollectionDrop.new self + end + + # Whether the collection's documents ought to be written as individual + # files in the output. + # + # Returns true if the 'write' metadata is true, false otherwise. + def write? + !!metadata.fetch("output", false) + end + + # The URL template to render collection's documents at. + # + # Returns the URL template to render collection's documents at. + def url_template + @url_template ||= metadata.fetch("permalink") do + Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) + end + end + + # Extract options for this collection from the site configuration. + # + # Returns the metadata for this collection + def extract_metadata + if site.config["collections"].is_a?(Hash) + site.config["collections"][label] || {} + else + {} + end + end + + private + + def container + @container ||= site.config["collections_dir"] + end + + private + + def read_document(full_path) + doc = Document.new(full_path, :site => site, :collection => self) + doc.read + if site.unpublished || doc.published? + docs << doc + end + end + + private + + def read_static_file(file_path, full_path) + relative_dir = Jekyll.sanitized_path( + relative_directory, + File.dirname(file_path) + ).chomp("/.") + + files << StaticFile.new( + site, + site.source, + relative_dir, + File.basename(full_path), + self + ) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/command.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/command.rb new file mode 100644 index 000000000000..2df86ed3366e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/command.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +module Jekyll + class Command + class << self + # A list of subclasses of Jekyll::Command + def subclasses + @subclasses ||= [] + end + + # Keep a list of subclasses of Jekyll::Command every time it's inherited + # Called automatically. + # + # base - the subclass + # + # Returns nothing + def inherited(base) + subclasses << base + super(base) + end + + # Run Site#process and catch errors + # + # site - the Jekyll::Site object + # + # Returns nothing + def process_site(site) + site.process + rescue Jekyll::Errors::FatalException => e + Jekyll.logger.error "ERROR:", "YOUR SITE COULD NOT BE BUILT:" + Jekyll.logger.error "", "------------------------------------" + Jekyll.logger.error "", e.message + exit(1) + end + + # Create a full Jekyll configuration with the options passed in as overrides + # + # options - the configuration overrides + # + # Returns a full Jekyll configuration + def configuration_from_options(options) + return options if options.is_a?(Jekyll::Configuration) + Jekyll.configuration(options) + end + + # Add common options to a command for building configuration + # + # cmd - the Jekyll::Command to add these options to + # + # Returns nothing + # rubocop:disable Metrics/MethodLength + def add_build_options(cmd) + cmd.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", + Array, "Custom configuration file" + cmd.option "destination", "-d", "--destination DESTINATION", + "The current folder will be generated into DESTINATION" + cmd.option "source", "-s", "--source SOURCE", "Custom source directory" + cmd.option "future", "--future", "Publishes posts with a future date" + cmd.option "limit_posts", "--limit_posts MAX_POSTS", Integer, + "Limits the number of posts to parse and publish" + cmd.option "watch", "-w", "--[no-]watch", "Watch for changes and rebuild" + cmd.option "baseurl", "-b", "--baseurl URL", + "Serve the website from the given base URL" + cmd.option "force_polling", "--force_polling", "Force watch to use polling" + cmd.option "lsi", "--lsi", "Use LSI for improved related posts" + cmd.option "show_drafts", "-D", "--drafts", "Render posts in the _drafts folder" + cmd.option "unpublished", "--unpublished", + "Render posts that were marked as unpublished" + cmd.option "quiet", "-q", "--quiet", "Silence output." + cmd.option "verbose", "-V", "--verbose", "Print verbose output." + cmd.option "incremental", "-I", "--incremental", "Enable incremental rebuild." + cmd.option "strict_front_matter", "--strict_front_matter", + "Fail if errors are present in front matter" + end + # rubocop:enable Metrics/MethodLength + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/build.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/build.rb new file mode 100644 index 000000000000..96a48cdfd6ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/build.rb @@ -0,0 +1,102 @@ +# frozen_string_literal: true + +module Jekyll + module Commands + class Build < Command + class << self + # Create the Mercenary command for the Jekyll CLI for this Command + def init_with_program(prog) + prog.command(:build) do |c| + c.syntax "build [options]" + c.description "Build your site" + c.alias :b + + add_build_options(c) + + c.action do |_, options| + options["serving"] = false + Jekyll::Commands::Build.process(options) + end + end + end + + # Build your jekyll site + # Continuously watch if `watch` is set to true in the config. + def process(options) + # Adjust verbosity quickly + Jekyll.logger.adjust_verbosity(options) + + options = configuration_from_options(options) + site = Jekyll::Site.new(options) + + if options.fetch("skip_initial_build", false) + Jekyll.logger.warn "Build Warning:", "Skipping the initial build." \ + " This may result in an out-of-date site." + else + build(site, options) + end + + if options.fetch("detach", false) + Jekyll.logger.info "Auto-regeneration:", + "disabled when running server detached." + elsif options.fetch("watch", false) + watch(site, options) + else + Jekyll.logger.info "Auto-regeneration:", "disabled. Use --watch to enable." + end + end + + # Build your Jekyll site. + # + # site - the Jekyll::Site instance to build + # options - A Hash of options passed to the command + # + # Returns nothing. + def build(site, options) + t = Time.now + source = options["source"] + destination = options["destination"] + incremental = options["incremental"] + Jekyll.logger.info "Source:", source + Jekyll.logger.info "Destination:", destination + Jekyll.logger.info "Incremental build:", + (incremental ? "enabled" : "disabled. Enable with --incremental") + Jekyll.logger.info "Generating..." + process_site(site) + Jekyll.logger.info "", "done in #{(Time.now - t).round(3)} seconds." + end + + # Private: Watch for file changes and rebuild the site. + # + # site - A Jekyll::Site instance + # options - A Hash of options passed to the command + # + # Returns nothing. + def watch(site, options) + # Warn Windows users that they might need to upgrade. + if Utils::Platforms.bash_on_windows? + Jekyll.logger.warn "", + "Auto-regeneration may not work on some Windows versions." + Jekyll.logger.warn "", + "Please see: https://github.com/Microsoft/BashOnWindows/issues/216" + Jekyll.logger.warn "", + "If it does not work, please upgrade Bash on Windows or "\ + "run Jekyll with --no-watch." + end + + External.require_with_graceful_fail "jekyll-watch" + watch_method = Jekyll::Watcher.method(:watch) + if watch_method.parameters.size == 1 + watch_method.call( + options + ) + else + watch_method.call( + options, site + ) + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/clean.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/clean.rb new file mode 100644 index 000000000000..1ef65db22dbe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/clean.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module Jekyll + module Commands + class Clean < Command + class << self + def init_with_program(prog) + prog.command(:clean) do |c| + c.syntax "clean [subcommand]" + c.description "Clean the site " \ + "(removes site output and metadata file) without building." + + add_build_options(c) + + c.action do |_, options| + Jekyll::Commands::Clean.process(options) + end + end + end + + def process(options) + options = configuration_from_options(options) + destination = options["destination"] + metadata_file = File.join(options["source"], ".jekyll-metadata") + sass_cache = ".sass-cache" + + remove(destination, :checker_func => :directory?) + remove(metadata_file, :checker_func => :file?) + remove(sass_cache, :checker_func => :directory?) + end + + def remove(filename, checker_func: :file?) + if File.public_send(checker_func, filename) + Jekyll.logger.info "Cleaner:", "Removing #{filename}..." + FileUtils.rm_rf(filename) + else + Jekyll.logger.info "Cleaner:", "Nothing to do for #{filename}." + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/doctor.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/doctor.rb new file mode 100644 index 000000000000..bb313152c37c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/doctor.rb @@ -0,0 +1,166 @@ +# frozen_string_literal: true + +module Jekyll + module Commands + class Doctor < Command + class << self + def init_with_program(prog) + prog.command(:doctor) do |c| + c.syntax "doctor" + c.description "Search site and print specific deprecation warnings" + c.alias(:hyde) + + c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", Array, + "Custom configuration file" + + c.action do |_, options| + Jekyll::Commands::Doctor.process(options) + end + end + end + + def process(options) + site = Jekyll::Site.new(configuration_from_options(options)) + site.reset + site.read + site.generate + + if healthy?(site) + Jekyll.logger.info "Your test results", "are in. Everything looks fine." + else + abort + end + end + + def healthy?(site) + [ + fsnotify_buggy?(site), + !deprecated_relative_permalinks(site), + !conflicting_urls(site), + !urls_only_differ_by_case(site), + proper_site_url?(site), + properly_gathered_posts?(site), + ].all? + end + + def properly_gathered_posts?(site) + return true if site.config["collections_dir"].empty? + posts_at_root = site.in_source_dir("_posts") + return true unless File.directory?(posts_at_root) + Jekyll.logger.warn "Warning:", + "Detected '_posts' directory outside custom `collections_dir`!" + Jekyll.logger.warn "", + "Please move '#{posts_at_root}' into the custom directory at " \ + "'#{site.in_source_dir(site.config["collections_dir"])}'" + false + end + + def deprecated_relative_permalinks(site) + if site.config["relative_permalinks"] + Jekyll::Deprecator.deprecation_message "Your site still uses relative" \ + " permalinks, which was removed in" \ + " Jekyll v3.0.0." + return true + end + end + + def conflicting_urls(site) + conflicting_urls = false + urls = {} + urls = collect_urls(urls, site.pages, site.dest) + urls = collect_urls(urls, site.posts.docs, site.dest) + urls.each do |url, paths| + next unless paths.size > 1 + conflicting_urls = true + Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" \ + " for the following pages: #{paths.join(", ")}" + end + conflicting_urls + end + + def fsnotify_buggy?(_site) + return true unless Utils::Platforms.osx? + if Dir.pwd != `pwd`.strip + Jekyll.logger.error " " + <<-STR.strip.gsub(%r!\n\s+!, "\n ") + We have detected that there might be trouble using fsevent on your + operating system, you can read https://github.com/thibaudgg/rb-fsevent/wiki/no-fsevents-fired-(OSX-bug) + for possible work arounds or you can work around it immediately + with `--force-polling`. + STR + + false + end + + true + end + + def urls_only_differ_by_case(site) + urls_only_differ_by_case = false + urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest) + urls.each_value do |real_urls| + next unless real_urls.uniq.size > 1 + urls_only_differ_by_case = true + Jekyll.logger.warn "Warning:", "The following URLs only differ" \ + " by case. On a case-insensitive file system one of the URLs" \ + " will be overwritten by the other: #{real_urls.join(", ")}" + end + urls_only_differ_by_case + end + + def proper_site_url?(site) + url = site.config["url"] + [ + url_exists?(url), + url_valid?(url), + url_absolute(url), + ].all? + end + + private + def collect_urls(urls, things, destination) + things.each do |thing| + dest = thing.destination(destination) + if urls[dest] + urls[dest] << thing.path + else + urls[dest] = [thing.path] + end + end + urls + end + + def case_insensitive_urls(things, destination) + things.each_with_object({}) do |thing, memo| + dest = thing.destination(destination) + (memo[dest.downcase] ||= []) << dest + end + end + + def url_exists?(url) + return true unless url.nil? || url.empty? + Jekyll.logger.warn "Warning:", "You didn't set an URL in the config file, "\ + "you may encounter problems with some plugins." + false + end + + def url_valid?(url) + Addressable::URI.parse(url) + true + # Addressable::URI#parse only raises a TypeError + # https://git.io/vFfbx + rescue TypeError + Jekyll.logger.warn "Warning:", "The site URL does not seem to be valid, "\ + "check the value of `url` in your config file." + false + end + + def url_absolute(url) + return true if Addressable::URI.parse(url).absolute? + Jekyll.logger.warn "Warning:", "Your site URL does not seem to be absolute, "\ + "check the value of `url` in your config file." + false + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/help.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/help.rb new file mode 100644 index 000000000000..80c80e9aeac5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/help.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Jekyll + module Commands + class Help < Command + class << self + def init_with_program(prog) + prog.command(:help) do |c| + c.syntax "help [subcommand]" + c.description "Show the help message, optionally for a given subcommand." + + c.action do |args, _| + cmd = (args.first || "").to_sym + if args.empty? + Jekyll.logger.info prog.to_s + elsif prog.has_command? cmd + Jekyll.logger.info prog.commands[cmd].to_s + else + invalid_command(prog, cmd) + abort + end + end + end + end + + def invalid_command(prog, cmd) + Jekyll.logger.error "Error:", + "Hmm... we don't know what the '#{cmd}' command is." + Jekyll.logger.info "Valid commands:", prog.commands.keys.join(", ") + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/new.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/new.rb new file mode 100644 index 000000000000..3d47e10d7a48 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/new.rb @@ -0,0 +1,171 @@ +# frozen_string_literal: true + +require "erb" + +module Jekyll + module Commands + class New < Command + class << self + def init_with_program(prog) + prog.command(:new) do |c| + c.syntax "new PATH" + c.description "Creates a new Jekyll site scaffold in PATH" + + c.option "force", "--force", "Force creation even if PATH already exists" + c.option "blank", "--blank", "Creates scaffolding but with empty files" + c.option "skip-bundle", "--skip-bundle", "Skip 'bundle install'" + + c.action do |args, options| + Jekyll::Commands::New.process(args, options) + end + end + end + + def process(args, options = {}) + raise ArgumentError, "You must specify a path." if args.empty? + + new_blog_path = File.expand_path(args.join(" "), Dir.pwd) + FileUtils.mkdir_p new_blog_path + if preserve_source_location?(new_blog_path, options) + Jekyll.logger.error "Conflict:", "#{new_blog_path} exists and is not empty." + Jekyll.logger.abort_with "", "Ensure #{new_blog_path} is empty or else " \ + "try again with `--force` to proceed and overwrite any files." + end + + if options["blank"] + create_blank_site new_blog_path + else + create_site new_blog_path + end + + after_install(new_blog_path, options) + end + + def create_blank_site(path) + Dir.chdir(path) do + FileUtils.mkdir(%w(_layouts _posts _drafts)) + FileUtils.touch("index.html") + end + end + + def scaffold_post_content + ERB.new(File.read(File.expand_path(scaffold_path, site_template))).result + end + + # Internal: Gets the filename of the sample post to be created + # + # Returns the filename of the sample post, as a String + def initialized_post_name + "_posts/#{Time.now.strftime("%Y-%m-%d")}-welcome-to-jekyll.markdown" + end + + private + + def gemfile_contents + <<-RUBY +source "https://rubygems.org" + +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +gem "jekyll", "~> #{Jekyll::VERSION}" + +# This is the default theme for new Jekyll sites. You may change this to anything you like. +gem "minima", "~> 2.0" + +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +# gem "github-pages", group: :jekyll_plugins + +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.6" +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +# and associated library. +install_if -> { RUBY_PLATFORM =~ %r!mingw|mswin|java! } do + gem "tzinfo", "~> 1.2" + gem "tzinfo-data" +end + +# Performance-booster for watching directories on Windows +gem "wdm", "~> 0.1.0", :install_if => Gem.win_platform? + +# kramdown v2 ships without the gfm parser by default. If you're using +# kramdown v1, comment out this line. +gem "kramdown-parser-gfm" + +RUBY + end + + def create_site(new_blog_path) + create_sample_files new_blog_path + + File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f| + f.write(scaffold_post_content) + end + + File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f| + f.write(gemfile_contents) + end + end + + def preserve_source_location?(path, options) + !options["force"] && !Dir["#{path}/**/*"].empty? + end + + def create_sample_files(path) + FileUtils.cp_r site_template + "/.", path + FileUtils.chmod_R "u+w", path + FileUtils.rm File.expand_path(scaffold_path, path) + end + + def site_template + File.expand_path("../../site_template", __dir__) + end + + def scaffold_path + "_posts/0000-00-00-welcome-to-jekyll.markdown.erb" + end + + # After a new blog has been created, print a success notification and + # then automatically execute bundle install from within the new blog dir + # unless the user opts to generate a blank blog or skip 'bundle install'. + + def after_install(path, options = {}) + unless options["blank"] || options["skip-bundle"] + begin + require "bundler" + bundle_install path + rescue LoadError + Jekyll.logger.info "Could not load Bundler. Bundle install skipped." + end + end + + Jekyll.logger.info "New jekyll site installed in #{path.cyan}." + Jekyll.logger.info "Bundle install skipped." if options["skip-bundle"] + end + + def bundle_install(path) + Jekyll.logger.info "Running bundle install in #{path.cyan}..." + Dir.chdir(path) do + exe = Gem.bin_path("bundler", "bundle") + process, output = Jekyll::Utils::Exec.run("ruby", exe, "install") + + output.to_s.each_line do |line| + Jekyll.logger.info("Bundler:".green, line.strip) unless line.to_s.empty? + end + + raise SystemExit unless process.success? + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/new_theme.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/new_theme.rb new file mode 100644 index 000000000000..c55e68127d86 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/new_theme.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require "erb" + +class Jekyll::Commands::NewTheme < Jekyll::Command + class << self + def init_with_program(prog) + prog.command(:"new-theme") do |c| + c.syntax "new-theme NAME" + c.description "Creates a new Jekyll theme scaffold" + c.option "code_of_conduct", \ + "-c", "--code-of-conduct", \ + "Include a Code of Conduct. (defaults to false)" + + c.action do |args, opts| + Jekyll::Commands::NewTheme.process(args, opts) + end + end + end + + # rubocop:disable Metrics/AbcSize + def process(args, opts) + if !args || args.empty? + raise Jekyll::Errors::InvalidThemeName, "You must specify a theme name." + end + + new_theme_name = args.join("_") + theme = Jekyll::ThemeBuilder.new(new_theme_name, opts) + if theme.path.exist? + Jekyll.logger.abort_with "Conflict:", "#{theme.path} already exists." + end + + theme.create! + Jekyll.logger.info "Your new Jekyll theme, #{theme.name.cyan}," \ + " is ready for you in #{theme.path.to_s.cyan}!" + Jekyll.logger.info "For help getting started, read #{theme.path}/README.md." + end + # rubocop:enable Metrics/AbcSize + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb new file mode 100644 index 000000000000..7efeb72d496c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve.rb @@ -0,0 +1,388 @@ +# frozen_string_literal: true + +require "thread" + +module Jekyll + module Commands + class Serve < Command + # Similar to the pattern in Utils::ThreadEvent except we are maintaining the + # state of @running instead of just signaling an event. We have to maintain this + # state since Serve is just called via class methods instead of an instance + # being created each time. + @mutex = Mutex.new + @run_cond = ConditionVariable.new + @running = false + + class << self + COMMAND_OPTIONS = { + "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], + "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], + "open_url" => ["-o", "--open-url", "Launch your site in a browser"], + "detach" => ["-B", "--detach", + "Run the server in the background",], + "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], + "port" => ["-P", "--port [PORT]", "Port to listen on"], + "show_dir_listing" => ["--show-dir-listing", + "Show a directory listing instead of loading your index file.",], + "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", + "Skips the initial site build which occurs before the server is started.",], + "livereload" => ["-l", "--livereload", + "Use LiveReload to automatically refresh browsers",], + "livereload_ignore" => ["--livereload-ignore ignore GLOB1[,GLOB2[,...]]", + Array, + "Files for LiveReload to ignore. Remember to quote the values so your shell "\ + "won't expand them",], + "livereload_min_delay" => ["--livereload-min-delay [SECONDS]", + "Minimum reload delay",], + "livereload_max_delay" => ["--livereload-max-delay [SECONDS]", + "Maximum reload delay",], + "livereload_port" => ["--livereload-port [PORT]", Integer, + "Port for LiveReload to listen on",], + }.freeze + + DIRECTORY_INDEX = %w( + index.htm + index.html + index.rhtml + index.cgi + index.xml + index.json + ).freeze + + LIVERELOAD_PORT = 35_729 + LIVERELOAD_DIR = File.join(__dir__, "serve", "livereload_assets") + + attr_reader :mutex, :run_cond, :running + alias_method :running?, :running + + def init_with_program(prog) + prog.command(:serve) do |cmd| + cmd.description "Serve your site locally" + cmd.syntax "serve [options]" + cmd.alias :server + cmd.alias :s + + add_build_options(cmd) + COMMAND_OPTIONS.each do |key, val| + cmd.option key, *val + end + + cmd.action do |_, opts| + opts["livereload_port"] ||= LIVERELOAD_PORT + opts["serving"] = true + opts["watch"] = true unless opts.key?("watch") + + start(opts) + end + end + end + + # + + def start(opts) + # Set the reactor to nil so any old reactor will be GCed. + # We can't unregister a hook so in testing when Serve.start is + # called multiple times we don't want to inadvertently keep using + # a reactor created by a previous test when our test might not + @reload_reactor = nil + + config = configuration_from_options(opts) + if Jekyll.env == "development" + config["url"] = default_url(config) + end + [Build, Serve].each { |klass| klass.process(config) } + end + + # + + def process(opts) + opts = configuration_from_options(opts) + destination = opts["destination"] + register_reload_hooks(opts) if opts["livereload"] + setup(destination) + + start_up_webrick(opts, destination) + end + + def shutdown + @server.shutdown if running? + end + + # Perform logical validation of CLI options + + private + def validate_options(opts) + if opts["livereload"] + if opts["detach"] + Jekyll.logger.warn "Warning:", + "--detach and --livereload are mutually exclusive. Choosing --livereload" + opts["detach"] = false + end + if opts["ssl_cert"] || opts["ssl_key"] + # This is not technically true. LiveReload works fine over SSL, but + # EventMachine's SSL support in Windows requires building the gem's + # native extensions against OpenSSL and that proved to be a process + # so tedious that expecting users to do it is a non-starter. + Jekyll.logger.abort_with "Error:", "LiveReload does not support SSL" + end + unless opts["watch"] + # Using livereload logically implies you want to watch the files + opts["watch"] = true + end + elsif %w(livereload_min_delay + livereload_max_delay + livereload_ignore + livereload_port).any? { |o| opts[o] } + Jekyll.logger.abort_with "--livereload-min-delay, "\ + "--livereload-max-delay, --livereload-ignore, and "\ + "--livereload-port require the --livereload option." + end + end + + # + + private + # rubocop:disable Metrics/AbcSize + def register_reload_hooks(opts) + require_relative "serve/live_reload_reactor" + @reload_reactor = LiveReloadReactor.new + + Jekyll::Hooks.register(:site, :post_render) do |site| + regenerator = Jekyll::Regenerator.new(site) + @changed_pages = site.pages.select do |p| + regenerator.regenerate?(p) + end + end + + # A note on ignoring files: LiveReload errs on the side of reloading when it + # comes to the message it gets. If, for example, a page is ignored but a CSS + # file linked in the page isn't, the page will still be reloaded if the CSS + # file is contained in the message sent to LiveReload. Additionally, the + # path matching is very loose so that a message to reload "/" will always + # lead the page to reload since every page starts with "/". + Jekyll::Hooks.register(:site, :post_write) do + if @changed_pages && @reload_reactor && @reload_reactor.running? + ignore, @changed_pages = @changed_pages.partition do |p| + Array(opts["livereload_ignore"]).any? do |filter| + File.fnmatch(filter, Jekyll.sanitized_path(p.relative_path)) + end + end + Jekyll.logger.debug "LiveReload:", "Ignoring #{ignore.map(&:relative_path)}" + @reload_reactor.reload(@changed_pages) + end + @changed_pages = nil + end + end + # rubocop:enable Metrics/AbcSize + + # Do a base pre-setup of WEBRick so that everything is in place + # when we get ready to party, checking for an setting up an error page + # and making sure our destination exists. + + private + def setup(destination) + require_relative "serve/servlet" + + FileUtils.mkdir_p(destination) + if File.exist?(File.join(destination, "404.html")) + WEBrick::HTTPResponse.class_eval do + def create_error_page + @header["Content-Type"] = "text/html; charset=UTF-8" + @body = IO.read(File.join(@config[:DocumentRoot], "404.html")) + end + end + end + end + + # + + private + def webrick_opts(opts) + opts = { + :JekyllOptions => opts, + :DoNotReverseLookup => true, + :MimeTypes => mime_types, + :DocumentRoot => opts["destination"], + :StartCallback => start_callback(opts["detach"]), + :StopCallback => stop_callback(opts["detach"]), + :BindAddress => opts["host"], + :Port => opts["port"], + :DirectoryIndex => DIRECTORY_INDEX, + } + + opts[:DirectoryIndex] = [] if opts[:JekyllOptions]["show_dir_listing"] + + enable_ssl(opts) + enable_logging(opts) + opts + end + + # + + private + def start_up_webrick(opts, destination) + if opts["livereload"] + @reload_reactor.start(opts) + end + + @server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } + @server.mount(opts["baseurl"].to_s, Servlet, destination, file_handler_opts) + + Jekyll.logger.info "Server address:", server_address(@server, opts) + launch_browser @server, opts if opts["open_url"] + boot_or_detach @server, opts + end + + # Recreate NondisclosureName under utf-8 circumstance + + private + def file_handler_opts + WEBrick::Config::FileHandler.merge({ + :FancyIndexing => true, + :NondisclosureName => [ + ".ht*", "~*", + ], + }) + end + + # + + private + def server_address(server, options = {}) + format_url( + server.config[:SSLEnable], + server.config[:BindAddress], + server.config[:Port], + options["baseurl"] + ) + end + + private + def format_url(ssl_enabled, address, port, baseurl = nil) + format("%<prefix>s://%<address>s:%<port>i%<baseurl>s", { + :prefix => ssl_enabled ? "https" : "http", + :address => address, + :port => port, + :baseurl => baseurl ? "#{baseurl}/" : "", + }) + end + + # + + private + def default_url(opts) + config = configuration_from_options(opts) + format_url( + config["ssl_cert"] && config["ssl_key"], + config["host"] == "127.0.0.1" ? "localhost" : config["host"], + config["port"] + ) + end + + # + + private + def launch_browser(server, opts) + address = server_address(server, opts) + return system "start", address if Utils::Platforms.windows? + return system "xdg-open", address if Utils::Platforms.linux? + return system "open", address if Utils::Platforms.osx? + Jekyll.logger.error "Refusing to launch browser; " \ + "Platform launcher unknown." + end + + # Keep in our area with a thread or detach the server as requested + # by the user. This method determines what we do based on what you + # ask us to do. + + private + def boot_or_detach(server, opts) + if opts["detach"] + pid = Process.fork do + server.start + end + + Process.detach(pid) + Jekyll.logger.info "Server detached with pid '#{pid}'.", \ + "Run `pkill -f jekyll' or `kill -9 #{pid}' to stop the server." + else + t = Thread.new { server.start } + trap("INT") { server.shutdown } + t.join + end + end + + # Make the stack verbose if the user requests it. + + private + def enable_logging(opts) + opts[:AccessLog] = [] + level = WEBrick::Log.const_get(opts[:JekyllOptions]["verbose"] ? :DEBUG : :WARN) + opts[:Logger] = WEBrick::Log.new($stdout, level) + end + + # Add SSL to the stack if the user triggers --enable-ssl and they + # provide both types of certificates commonly needed. Raise if they + # forget to add one of the certificates. + + private + def enable_ssl(opts) + cert, key, src = + opts[:JekyllOptions].values_at("ssl_cert", "ssl_key", "source") + + return if cert.nil? && key.nil? + raise "Missing --ssl_cert or --ssl_key. Both are required." unless cert && key + + require "openssl" + require "webrick/https" + + opts[:SSLCertificate] = OpenSSL::X509::Certificate.new(read_file(src, cert)) + opts[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(read_file(src, key)) + opts[:SSLEnable] = true + end + + private + def start_callback(detached) + unless detached + proc do + mutex.synchronize do + # Block until EventMachine reactor starts + @reload_reactor.started_event.wait unless @reload_reactor.nil? + @running = true + Jekyll.logger.info("Server running...", "press ctrl-c to stop.") + @run_cond.broadcast + end + end + end + end + + private + def stop_callback(detached) + unless detached + proc do + mutex.synchronize do + unless @reload_reactor.nil? + @reload_reactor.stop + @reload_reactor.stopped_event.wait + end + @running = false + @run_cond.broadcast + end + end + end + end + + private + def mime_types + file = File.expand_path("../mime.types", __dir__) + WEBrick::HTTPUtils.load_mime_types(file) + end + + private + def read_file(source_dir, file_path) + File.read(Jekyll.sanitized_path(source_dir, file_path)) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/live_reload_reactor.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/live_reload_reactor.rb new file mode 100644 index 000000000000..5f3a4877cce2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/live_reload_reactor.rb @@ -0,0 +1,126 @@ +# frozen_string_literal: true + +require "em-websocket" + +require_relative "websockets" + +module Jekyll + module Commands + class Serve + class LiveReloadReactor + attr_reader :started_event + attr_reader :stopped_event + attr_reader :thread + + def initialize + @websockets = [] + @connections_count = 0 + @started_event = Utils::ThreadEvent.new + @stopped_event = Utils::ThreadEvent.new + end + + def stop + # There is only one EventMachine instance per Ruby process so stopping + # it here will stop the reactor thread we have running. + EM.stop if EM.reactor_running? + Jekyll.logger.debug "LiveReload Server:", "halted" + end + + def running? + EM.reactor_running? + end + + def handle_websockets_event(websocket) + websocket.onopen { |handshake| connect(websocket, handshake) } + websocket.onclose { disconnect(websocket) } + websocket.onmessage { |msg| print_message(msg) } + websocket.onerror { |error| log_error(error) } + end + + def start(opts) + @thread = Thread.new do + # Use epoll if the kernel supports it + EM.epoll + EM.run do + EM.error_handler { |e| log_error(e) } + + EM.start_server( + opts["host"], + opts["livereload_port"], + HttpAwareConnection, + opts + ) do |ws| + handle_websockets_event(ws) + end + + # Notify blocked threads that EventMachine has started or shutdown + EM.schedule { @started_event.set } + EM.add_shutdown_hook { @stopped_event.set } + + Jekyll.logger.info "LiveReload address:", + "http://#{opts["host"]}:#{opts["livereload_port"]}" + end + end + @thread.abort_on_exception = true + end + + # For a description of the protocol see + # http://feedback.livereload.com/knowledgebase/articles/86174-livereload-protocol + def reload(pages) + pages.each do |p| + json_message = JSON.dump({ + :command => "reload", + :path => p.url, + :liveCSS => true, + }) + + Jekyll.logger.debug "LiveReload:", "Reloading #{p.url}" + Jekyll.logger.debug "", json_message + @websockets.each { |ws| ws.send(json_message) } + end + end + + private + def connect(websocket, handshake) + @connections_count += 1 + if @connections_count == 1 + message = "Browser connected" + message += " over SSL/TLS" if handshake.secure? + Jekyll.logger.info "LiveReload:", message + end + websocket.send( + JSON.dump( + :command => "hello", + :protocols => ["http://livereload.com/protocols/official-7"], + :serverName => "jekyll" + ) + ) + + @websockets << websocket + end + + private + def disconnect(websocket) + @websockets.delete(websocket) + end + + private + def print_message(json_message) + msg = JSON.parse(json_message) + # Not sure what the 'url' command even does in LiveReload. The spec is silent + # on its purpose. + if msg["command"] == "url" + Jekyll.logger.info "LiveReload:", "Browser URL: #{msg["url"]}" + end + end + + private + def log_error(error) + Jekyll.logger.error "LiveReload experienced an error. " \ + "Run with --trace for more information." + raise error + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/livereload_assets/livereload.js b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/livereload_assets/livereload.js new file mode 100644 index 000000000000..eee60ec8b1d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/livereload_assets/livereload.js @@ -0,0 +1,1183 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ +(function() { + var Connector, PROTOCOL_6, PROTOCOL_7, Parser, Version, _ref; + + _ref = require('./protocol'), Parser = _ref.Parser, PROTOCOL_6 = _ref.PROTOCOL_6, PROTOCOL_7 = _ref.PROTOCOL_7; + + Version = '2.2.2'; + + exports.Connector = Connector = (function() { + function Connector(options, WebSocket, Timer, handlers) { + this.options = options; + this.WebSocket = WebSocket; + this.Timer = Timer; + this.handlers = handlers; + this._uri = "ws" + (this.options.https ? "s" : "") + "://" + this.options.host + ":" + this.options.port + "/livereload"; + this._nextDelay = this.options.mindelay; + this._connectionDesired = false; + this.protocol = 0; + this.protocolParser = new Parser({ + connected: (function(_this) { + return function(protocol) { + _this.protocol = protocol; + _this._handshakeTimeout.stop(); + _this._nextDelay = _this.options.mindelay; + _this._disconnectionReason = 'broken'; + return _this.handlers.connected(protocol); + }; + })(this), + error: (function(_this) { + return function(e) { + _this.handlers.error(e); + return _this._closeOnError(); + }; + })(this), + message: (function(_this) { + return function(message) { + return _this.handlers.message(message); + }; + })(this) + }); + this._handshakeTimeout = new Timer((function(_this) { + return function() { + if (!_this._isSocketConnected()) { + return; + } + _this._disconnectionReason = 'handshake-timeout'; + return _this.socket.close(); + }; + })(this)); + this._reconnectTimer = new Timer((function(_this) { + return function() { + if (!_this._connectionDesired) { + return; + } + return _this.connect(); + }; + })(this)); + this.connect(); + } + + Connector.prototype._isSocketConnected = function() { + return this.socket && this.socket.readyState === this.WebSocket.OPEN; + }; + + Connector.prototype.connect = function() { + this._connectionDesired = true; + if (this._isSocketConnected()) { + return; + } + this._reconnectTimer.stop(); + this._disconnectionReason = 'cannot-connect'; + this.protocolParser.reset(); + this.handlers.connecting(); + this.socket = new this.WebSocket(this._uri); + this.socket.onopen = (function(_this) { + return function(e) { + return _this._onopen(e); + }; + })(this); + this.socket.onclose = (function(_this) { + return function(e) { + return _this._onclose(e); + }; + })(this); + this.socket.onmessage = (function(_this) { + return function(e) { + return _this._onmessage(e); + }; + })(this); + return this.socket.onerror = (function(_this) { + return function(e) { + return _this._onerror(e); + }; + })(this); + }; + + Connector.prototype.disconnect = function() { + this._connectionDesired = false; + this._reconnectTimer.stop(); + if (!this._isSocketConnected()) { + return; + } + this._disconnectionReason = 'manual'; + return this.socket.close(); + }; + + Connector.prototype._scheduleReconnection = function() { + if (!this._connectionDesired) { + return; + } + if (!this._reconnectTimer.running) { + this._reconnectTimer.start(this._nextDelay); + return this._nextDelay = Math.min(this.options.maxdelay, this._nextDelay * 2); + } + }; + + Connector.prototype.sendCommand = function(command) { + if (this.protocol == null) { + return; + } + return this._sendCommand(command); + }; + + Connector.prototype._sendCommand = function(command) { + return this.socket.send(JSON.stringify(command)); + }; + + Connector.prototype._closeOnError = function() { + this._handshakeTimeout.stop(); + this._disconnectionReason = 'error'; + return this.socket.close(); + }; + + Connector.prototype._onopen = function(e) { + var hello; + this.handlers.socketConnected(); + this._disconnectionReason = 'handshake-failed'; + hello = { + command: 'hello', + protocols: [PROTOCOL_6, PROTOCOL_7] + }; + hello.ver = Version; + if (this.options.ext) { + hello.ext = this.options.ext; + } + if (this.options.extver) { + hello.extver = this.options.extver; + } + if (this.options.snipver) { + hello.snipver = this.options.snipver; + } + this._sendCommand(hello); + return this._handshakeTimeout.start(this.options.handshake_timeout); + }; + + Connector.prototype._onclose = function(e) { + this.protocol = 0; + this.handlers.disconnected(this._disconnectionReason, this._nextDelay); + return this._scheduleReconnection(); + }; + + Connector.prototype._onerror = function(e) {}; + + Connector.prototype._onmessage = function(e) { + return this.protocolParser.process(e.data); + }; + + return Connector; + + })(); + +}).call(this); + +},{"./protocol":6}],2:[function(require,module,exports){ +(function() { + var CustomEvents; + + CustomEvents = { + bind: function(element, eventName, handler) { + if (element.addEventListener) { + return element.addEventListener(eventName, handler, false); + } else if (element.attachEvent) { + element[eventName] = 1; + return element.attachEvent('onpropertychange', function(event) { + if (event.propertyName === eventName) { + return handler(); + } + }); + } else { + throw new Error("Attempt to attach custom event " + eventName + " to something which isn't a DOMElement"); + } + }, + fire: function(element, eventName) { + var event; + if (element.addEventListener) { + event = document.createEvent('HTMLEvents'); + event.initEvent(eventName, true, true); + return document.dispatchEvent(event); + } else if (element.attachEvent) { + if (element[eventName]) { + return element[eventName]++; + } + } else { + throw new Error("Attempt to fire custom event " + eventName + " on something which isn't a DOMElement"); + } + } + }; + + exports.bind = CustomEvents.bind; + + exports.fire = CustomEvents.fire; + +}).call(this); + +},{}],3:[function(require,module,exports){ +(function() { + var LessPlugin; + + module.exports = LessPlugin = (function() { + LessPlugin.identifier = 'less'; + + LessPlugin.version = '1.0'; + + function LessPlugin(window, host) { + this.window = window; + this.host = host; + } + + LessPlugin.prototype.reload = function(path, options) { + if (this.window.less && this.window.less.refresh) { + if (path.match(/\.less$/i)) { + return this.reloadLess(path); + } + if (options.originalPath.match(/\.less$/i)) { + return this.reloadLess(options.originalPath); + } + } + return false; + }; + + LessPlugin.prototype.reloadLess = function(path) { + var link, links, _i, _len; + links = (function() { + var _i, _len, _ref, _results; + _ref = document.getElementsByTagName('link'); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + link = _ref[_i]; + if (link.href && link.rel.match(/^stylesheet\/less$/i) || (link.rel.match(/stylesheet/i) && link.type.match(/^text\/(x-)?less$/i))) { + _results.push(link); + } + } + return _results; + })(); + if (links.length === 0) { + return false; + } + for (_i = 0, _len = links.length; _i < _len; _i++) { + link = links[_i]; + link.href = this.host.generateCacheBustUrl(link.href); + } + this.host.console.log("LiveReload is asking LESS to recompile all stylesheets"); + this.window.less.refresh(true); + return true; + }; + + LessPlugin.prototype.analyze = function() { + return { + disable: !!(this.window.less && this.window.less.refresh) + }; + }; + + return LessPlugin; + + })(); + +}).call(this); + +},{}],4:[function(require,module,exports){ +(function() { + var Connector, LiveReload, Options, Reloader, Timer, + __hasProp = {}.hasOwnProperty; + + Connector = require('./connector').Connector; + + Timer = require('./timer').Timer; + + Options = require('./options').Options; + + Reloader = require('./reloader').Reloader; + + exports.LiveReload = LiveReload = (function() { + function LiveReload(window) { + var k, v, _ref; + this.window = window; + this.listeners = {}; + this.plugins = []; + this.pluginIdentifiers = {}; + this.console = this.window.console && this.window.console.log && this.window.console.error ? this.window.location.href.match(/LR-verbose/) ? this.window.console : { + log: function() {}, + error: this.window.console.error.bind(this.window.console) + } : { + log: function() {}, + error: function() {} + }; + if (!(this.WebSocket = this.window.WebSocket || this.window.MozWebSocket)) { + this.console.error("LiveReload disabled because the browser does not seem to support web sockets"); + return; + } + if ('LiveReloadOptions' in window) { + this.options = new Options(); + _ref = window['LiveReloadOptions']; + for (k in _ref) { + if (!__hasProp.call(_ref, k)) continue; + v = _ref[k]; + this.options.set(k, v); + } + } else { + this.options = Options.extract(this.window.document); + if (!this.options) { + this.console.error("LiveReload disabled because it could not find its own <SCRIPT> tag"); + return; + } + } + this.reloader = new Reloader(this.window, this.console, Timer); + this.connector = new Connector(this.options, this.WebSocket, Timer, { + connecting: (function(_this) { + return function() {}; + })(this), + socketConnected: (function(_this) { + return function() {}; + })(this), + connected: (function(_this) { + return function(protocol) { + var _base; + if (typeof (_base = _this.listeners).connect === "function") { + _base.connect(); + } + _this.log("LiveReload is connected to " + _this.options.host + ":" + _this.options.port + " (protocol v" + protocol + ")."); + return _this.analyze(); + }; + })(this), + error: (function(_this) { + return function(e) { + if (e instanceof ProtocolError) { + if (typeof console !== "undefined" && console !== null) { + return console.log("" + e.message + "."); + } + } else { + if (typeof console !== "undefined" && console !== null) { + return console.log("LiveReload internal error: " + e.message); + } + } + }; + })(this), + disconnected: (function(_this) { + return function(reason, nextDelay) { + var _base; + if (typeof (_base = _this.listeners).disconnect === "function") { + _base.disconnect(); + } + switch (reason) { + case 'cannot-connect': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + ", will retry in " + nextDelay + " sec."); + case 'broken': + return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + ", reconnecting in " + nextDelay + " sec."); + case 'handshake-timeout': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake timeout), will retry in " + nextDelay + " sec."); + case 'handshake-failed': + return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake failed), will retry in " + nextDelay + " sec."); + case 'manual': + break; + case 'error': + break; + default: + return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + " (" + reason + "), reconnecting in " + nextDelay + " sec."); + } + }; + })(this), + message: (function(_this) { + return function(message) { + switch (message.command) { + case 'reload': + return _this.performReload(message); + case 'alert': + return _this.performAlert(message); + } + }; + })(this) + }); + this.initialized = true; + } + + LiveReload.prototype.on = function(eventName, handler) { + return this.listeners[eventName] = handler; + }; + + LiveReload.prototype.log = function(message) { + return this.console.log("" + message); + }; + + LiveReload.prototype.performReload = function(message) { + var _ref, _ref1; + this.log("LiveReload received reload request: " + (JSON.stringify(message, null, 2))); + return this.reloader.reload(message.path, { + liveCSS: (_ref = message.liveCSS) != null ? _ref : true, + liveImg: (_ref1 = message.liveImg) != null ? _ref1 : true, + originalPath: message.originalPath || '', + overrideURL: message.overrideURL || '', + serverURL: "http://" + this.options.host + ":" + this.options.port + }); + }; + + LiveReload.prototype.performAlert = function(message) { + return alert(message.message); + }; + + LiveReload.prototype.shutDown = function() { + var _base; + if (!this.initialized) { + return; + } + this.connector.disconnect(); + this.log("LiveReload disconnected."); + return typeof (_base = this.listeners).shutdown === "function" ? _base.shutdown() : void 0; + }; + + LiveReload.prototype.hasPlugin = function(identifier) { + return !!this.pluginIdentifiers[identifier]; + }; + + LiveReload.prototype.addPlugin = function(pluginClass) { + var plugin; + if (!this.initialized) { + return; + } + if (this.hasPlugin(pluginClass.identifier)) { + return; + } + this.pluginIdentifiers[pluginClass.identifier] = true; + plugin = new pluginClass(this.window, { + _livereload: this, + _reloader: this.reloader, + _connector: this.connector, + console: this.console, + Timer: Timer, + generateCacheBustUrl: (function(_this) { + return function(url) { + return _this.reloader.generateCacheBustUrl(url); + }; + })(this) + }); + this.plugins.push(plugin); + this.reloader.addPlugin(plugin); + }; + + LiveReload.prototype.analyze = function() { + var plugin, pluginData, pluginsData, _i, _len, _ref; + if (!this.initialized) { + return; + } + if (!(this.connector.protocol >= 7)) { + return; + } + pluginsData = {}; + _ref = this.plugins; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i]; + pluginsData[plugin.constructor.identifier] = pluginData = (typeof plugin.analyze === "function" ? plugin.analyze() : void 0) || {}; + pluginData.version = plugin.constructor.version; + } + this.connector.sendCommand({ + command: 'info', + plugins: pluginsData, + url: this.window.location.href + }); + }; + + return LiveReload; + + })(); + +}).call(this); + +},{"./connector":1,"./options":5,"./reloader":7,"./timer":9}],5:[function(require,module,exports){ +(function() { + var Options; + + exports.Options = Options = (function() { + function Options() { + this.https = false; + this.host = null; + this.port = 35729; + this.snipver = null; + this.ext = null; + this.extver = null; + this.mindelay = 1000; + this.maxdelay = 60000; + this.handshake_timeout = 5000; + } + + Options.prototype.set = function(name, value) { + if (typeof value === 'undefined') { + return; + } + if (!isNaN(+value)) { + value = +value; + } + return this[name] = value; + }; + + return Options; + + })(); + + Options.extract = function(document) { + var element, keyAndValue, m, mm, options, pair, src, _i, _j, _len, _len1, _ref, _ref1; + _ref = document.getElementsByTagName('script'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + if ((src = element.src) && (m = src.match(/^[^:]+:\/\/(.*)\/z?livereload\.js(?:\?(.*))?$/))) { + options = new Options(); + options.https = src.indexOf("https") === 0; + if (mm = m[1].match(/^([^\/:]+)(?::(\d+))?$/)) { + options.host = mm[1]; + if (mm[2]) { + options.port = parseInt(mm[2], 10); + } + } + if (m[2]) { + _ref1 = m[2].split('&'); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + pair = _ref1[_j]; + if ((keyAndValue = pair.split('=')).length > 1) { + options.set(keyAndValue[0].replace(/-/g, '_'), keyAndValue.slice(1).join('=')); + } + } + } + return options; + } + } + return null; + }; + +}).call(this); + +},{}],6:[function(require,module,exports){ +(function() { + var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6'; + + exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7'; + + exports.ProtocolError = ProtocolError = (function() { + function ProtocolError(reason, data) { + this.message = "LiveReload protocol error (" + reason + ") after receiving data: \"" + data + "\"."; + } + + return ProtocolError; + + })(); + + exports.Parser = Parser = (function() { + function Parser(handlers) { + this.handlers = handlers; + this.reset(); + } + + Parser.prototype.reset = function() { + return this.protocol = null; + }; + + Parser.prototype.process = function(data) { + var command, e, message, options, _ref; + try { + if (this.protocol == null) { + if (data.match(/^!!ver:([\d.]+)$/)) { + this.protocol = 6; + } else if (message = this._parseMessage(data, ['hello'])) { + if (!message.protocols.length) { + throw new ProtocolError("no protocols specified in handshake message"); + } else if (__indexOf.call(message.protocols, PROTOCOL_7) >= 0) { + this.protocol = 7; + } else if (__indexOf.call(message.protocols, PROTOCOL_6) >= 0) { + this.protocol = 6; + } else { + throw new ProtocolError("no supported protocols found"); + } + } + return this.handlers.connected(this.protocol); + } else if (this.protocol === 6) { + message = JSON.parse(data); + if (!message.length) { + throw new ProtocolError("protocol 6 messages must be arrays"); + } + command = message[0], options = message[1]; + if (command !== 'refresh') { + throw new ProtocolError("unknown protocol 6 command"); + } + return this.handlers.message({ + command: 'reload', + path: options.path, + liveCSS: (_ref = options.apply_css_live) != null ? _ref : true + }); + } else { + message = this._parseMessage(data, ['reload', 'alert']); + return this.handlers.message(message); + } + } catch (_error) { + e = _error; + if (e instanceof ProtocolError) { + return this.handlers.error(e); + } else { + throw e; + } + } + }; + + Parser.prototype._parseMessage = function(data, validCommands) { + var e, message, _ref; + try { + message = JSON.parse(data); + } catch (_error) { + e = _error; + throw new ProtocolError('unparsable JSON', data); + } + if (!message.command) { + throw new ProtocolError('missing "command" key', data); + } + if (_ref = message.command, __indexOf.call(validCommands, _ref) < 0) { + throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ")", data); + } + return message; + }; + + return Parser; + + })(); + +}).call(this); + +},{}],7:[function(require,module,exports){ +(function() { + var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl; + + splitUrl = function(url) { + var hash, index, params; + if ((index = url.indexOf('#')) >= 0) { + hash = url.slice(index); + url = url.slice(0, index); + } else { + hash = ''; + } + if ((index = url.indexOf('?')) >= 0) { + params = url.slice(index); + url = url.slice(0, index); + } else { + params = ''; + } + return { + url: url, + params: params, + hash: hash + }; + }; + + pathFromUrl = function(url) { + var path; + url = splitUrl(url).url; + if (url.indexOf('file://') === 0) { + path = url.replace(/^file:\/\/(localhost)?/, ''); + } else { + path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/'); + } + return decodeURIComponent(path); + }; + + pickBestMatch = function(path, objects, pathFunc) { + var bestMatch, object, score, _i, _len; + bestMatch = { + score: 0 + }; + for (_i = 0, _len = objects.length; _i < _len; _i++) { + object = objects[_i]; + score = numberOfMatchingSegments(path, pathFunc(object)); + if (score > bestMatch.score) { + bestMatch = { + object: object, + score: score + }; + } + } + if (bestMatch.score > 0) { + return bestMatch; + } else { + return null; + } + }; + + numberOfMatchingSegments = function(path1, path2) { + var comps1, comps2, eqCount, len; + path1 = path1.replace(/^\/+/, '').toLowerCase(); + path2 = path2.replace(/^\/+/, '').toLowerCase(); + if (path1 === path2) { + return 10000; + } + comps1 = path1.split('/').reverse(); + comps2 = path2.split('/').reverse(); + len = Math.min(comps1.length, comps2.length); + eqCount = 0; + while (eqCount < len && comps1[eqCount] === comps2[eqCount]) { + ++eqCount; + } + return eqCount; + }; + + pathsMatch = function(path1, path2) { + return numberOfMatchingSegments(path1, path2) > 0; + }; + + IMAGE_STYLES = [ + { + selector: 'background', + styleNames: ['backgroundImage'] + }, { + selector: 'border', + styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage'] + } + ]; + + exports.Reloader = Reloader = (function() { + function Reloader(window, console, Timer) { + this.window = window; + this.console = console; + this.Timer = Timer; + this.document = this.window.document; + this.importCacheWaitPeriod = 200; + this.plugins = []; + } + + Reloader.prototype.addPlugin = function(plugin) { + return this.plugins.push(plugin); + }; + + Reloader.prototype.analyze = function(callback) { + return results; + }; + + Reloader.prototype.reload = function(path, options) { + var plugin, _base, _i, _len, _ref; + this.options = options; + if ((_base = this.options).stylesheetReloadTimeout == null) { + _base.stylesheetReloadTimeout = 15000; + } + _ref = this.plugins; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i]; + if (plugin.reload && plugin.reload(path, options)) { + return; + } + } + if (options.liveCSS) { + if (path.match(/\.css$/i)) { + if (this.reloadStylesheet(path)) { + return; + } + } + } + if (options.liveImg) { + if (path.match(/\.(jpe?g|png|gif)$/i)) { + this.reloadImages(path); + return; + } + } + return this.reloadPage(); + }; + + Reloader.prototype.reloadPage = function() { + return this.window.document.location.reload(); + }; + + Reloader.prototype.reloadImages = function(path) { + var expando, img, selector, styleNames, styleSheet, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _results; + expando = this.generateUniqueString(); + _ref = this.document.images; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + img = _ref[_i]; + if (pathsMatch(path, pathFromUrl(img.src))) { + img.src = this.generateCacheBustUrl(img.src, expando); + } + } + if (this.document.querySelectorAll) { + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + _ref1 = IMAGE_STYLES[_j], selector = _ref1.selector, styleNames = _ref1.styleNames; + _ref2 = this.document.querySelectorAll("[style*=" + selector + "]"); + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + img = _ref2[_k]; + this.reloadStyleImages(img.style, styleNames, path, expando); + } + } + } + if (this.document.styleSheets) { + _ref3 = this.document.styleSheets; + _results = []; + for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { + styleSheet = _ref3[_l]; + _results.push(this.reloadStylesheetImages(styleSheet, path, expando)); + } + return _results; + } + }; + + Reloader.prototype.reloadStylesheetImages = function(styleSheet, path, expando) { + var e, rule, rules, styleNames, _i, _j, _len, _len1; + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0; + } catch (_error) { + e = _error; + } + if (!rules) { + return; + } + for (_i = 0, _len = rules.length; _i < _len; _i++) { + rule = rules[_i]; + switch (rule.type) { + case CSSRule.IMPORT_RULE: + this.reloadStylesheetImages(rule.styleSheet, path, expando); + break; + case CSSRule.STYLE_RULE: + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + styleNames = IMAGE_STYLES[_j].styleNames; + this.reloadStyleImages(rule.style, styleNames, path, expando); + } + break; + case CSSRule.MEDIA_RULE: + this.reloadStylesheetImages(rule, path, expando); + } + } + }; + + Reloader.prototype.reloadStyleImages = function(style, styleNames, path, expando) { + var newValue, styleName, value, _i, _len; + for (_i = 0, _len = styleNames.length; _i < _len; _i++) { + styleName = styleNames[_i]; + value = style[styleName]; + if (typeof value === 'string') { + newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function(_this) { + return function(match, src) { + if (pathsMatch(path, pathFromUrl(src))) { + return "url(" + (_this.generateCacheBustUrl(src, expando)) + ")"; + } else { + return match; + } + }; + })(this)); + if (newValue !== value) { + style[styleName] = newValue; + } + } + } + }; + + Reloader.prototype.reloadStylesheet = function(path) { + var imported, link, links, match, style, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1; + links = (function() { + var _i, _len, _ref, _results; + _ref = this.document.getElementsByTagName('link'); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + link = _ref[_i]; + if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) { + _results.push(link); + } + } + return _results; + }).call(this); + imported = []; + _ref = this.document.getElementsByTagName('style'); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + style = _ref[_i]; + if (style.sheet) { + this.collectImportedStylesheets(style, style.sheet, imported); + } + } + for (_j = 0, _len1 = links.length; _j < _len1; _j++) { + link = links[_j]; + this.collectImportedStylesheets(link, link.sheet, imported); + } + if (this.window.StyleFix && this.document.querySelectorAll) { + _ref1 = this.document.querySelectorAll('style[data-href]'); + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + style = _ref1[_k]; + links.push(style); + } + } + this.console.log("LiveReload found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets"); + match = pickBestMatch(path, links.concat(imported), (function(_this) { + return function(l) { + return pathFromUrl(_this.linkHref(l)); + }; + })(this)); + if (match) { + if (match.object.rule) { + this.console.log("LiveReload is reloading imported stylesheet: " + match.object.href); + this.reattachImportedRule(match.object); + } else { + this.console.log("LiveReload is reloading stylesheet: " + (this.linkHref(match.object))); + this.reattachStylesheetLink(match.object); + } + } else { + this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one"); + for (_l = 0, _len3 = links.length; _l < _len3; _l++) { + link = links[_l]; + this.reattachStylesheetLink(link); + } + } + return true; + }; + + Reloader.prototype.collectImportedStylesheets = function(link, styleSheet, result) { + var e, index, rule, rules, _i, _len; + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0; + } catch (_error) { + e = _error; + } + if (rules && rules.length) { + for (index = _i = 0, _len = rules.length; _i < _len; index = ++_i) { + rule = rules[index]; + switch (rule.type) { + case CSSRule.CHARSET_RULE: + continue; + case CSSRule.IMPORT_RULE: + result.push({ + link: link, + rule: rule, + index: index, + href: rule.href + }); + this.collectImportedStylesheets(link, rule.styleSheet, result); + break; + default: + break; + } + } + } + }; + + Reloader.prototype.waitUntilCssLoads = function(clone, func) { + var callbackExecuted, executeCallback, poll; + callbackExecuted = false; + executeCallback = (function(_this) { + return function() { + if (callbackExecuted) { + return; + } + callbackExecuted = true; + return func(); + }; + })(this); + clone.onload = (function(_this) { + return function() { + _this.console.log("LiveReload: the new stylesheet has finished loading"); + _this.knownToSupportCssOnLoad = true; + return executeCallback(); + }; + })(this); + if (!this.knownToSupportCssOnLoad) { + (poll = (function(_this) { + return function() { + if (clone.sheet) { + _this.console.log("LiveReload is polling until the new CSS finishes loading..."); + return executeCallback(); + } else { + return _this.Timer.start(50, poll); + } + }; + })(this))(); + } + return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback); + }; + + Reloader.prototype.linkHref = function(link) { + return link.href || link.getAttribute('data-href'); + }; + + Reloader.prototype.reattachStylesheetLink = function(link) { + var clone, parent; + if (link.__LiveReload_pendingRemoval) { + return; + } + link.__LiveReload_pendingRemoval = true; + if (link.tagName === 'STYLE') { + clone = this.document.createElement('link'); + clone.rel = 'stylesheet'; + clone.media = link.media; + clone.disabled = link.disabled; + } else { + clone = link.cloneNode(false); + } + clone.href = this.generateCacheBustUrl(this.linkHref(link)); + parent = link.parentNode; + if (parent.lastChild === link) { + parent.appendChild(clone); + } else { + parent.insertBefore(clone, link.nextSibling); + } + return this.waitUntilCssLoads(clone, (function(_this) { + return function() { + var additionalWaitingTime; + if (/AppleWebKit/.test(navigator.userAgent)) { + additionalWaitingTime = 5; + } else { + additionalWaitingTime = 200; + } + return _this.Timer.start(additionalWaitingTime, function() { + var _ref; + if (!link.parentNode) { + return; + } + link.parentNode.removeChild(link); + clone.onreadystatechange = null; + return (_ref = _this.window.StyleFix) != null ? _ref.link(clone) : void 0; + }); + }; + })(this)); + }; + + Reloader.prototype.reattachImportedRule = function(_arg) { + var href, index, link, media, newRule, parent, rule, tempLink; + rule = _arg.rule, index = _arg.index, link = _arg.link; + parent = rule.parentStyleSheet; + href = this.generateCacheBustUrl(rule.href); + media = rule.media.length ? [].join.call(rule.media, ', ') : ''; + newRule = "@import url(\"" + href + "\") " + media + ";"; + rule.__LiveReload_newHref = href; + tempLink = this.document.createElement("link"); + tempLink.rel = 'stylesheet'; + tempLink.href = href; + tempLink.__LiveReload_pendingRemoval = true; + if (link.parentNode) { + link.parentNode.insertBefore(tempLink, link); + } + return this.Timer.start(this.importCacheWaitPeriod, (function(_this) { + return function() { + if (tempLink.parentNode) { + tempLink.parentNode.removeChild(tempLink); + } + if (rule.__LiveReload_newHref !== href) { + return; + } + parent.insertRule(newRule, index); + parent.deleteRule(index + 1); + rule = parent.cssRules[index]; + rule.__LiveReload_newHref = href; + return _this.Timer.start(_this.importCacheWaitPeriod, function() { + if (rule.__LiveReload_newHref !== href) { + return; + } + parent.insertRule(newRule, index); + return parent.deleteRule(index + 1); + }); + }; + })(this)); + }; + + Reloader.prototype.generateUniqueString = function() { + return 'livereload=' + Date.now(); + }; + + Reloader.prototype.generateCacheBustUrl = function(url, expando) { + var hash, oldParams, originalUrl, params, _ref; + if (expando == null) { + expando = this.generateUniqueString(); + } + _ref = splitUrl(url), url = _ref.url, hash = _ref.hash, oldParams = _ref.params; + if (this.options.overrideURL) { + if (url.indexOf(this.options.serverURL) < 0) { + originalUrl = url; + url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url); + this.console.log("LiveReload is overriding source URL " + originalUrl + " with " + url); + } + } + params = oldParams.replace(/(\?|&)livereload=(\d+)/, function(match, sep) { + return "" + sep + expando; + }); + if (params === oldParams) { + if (oldParams.length === 0) { + params = "?" + expando; + } else { + params = "" + oldParams + "&" + expando; + } + } + return url + params + hash; + }; + + return Reloader; + + })(); + +}).call(this); + +},{}],8:[function(require,module,exports){ +(function() { + var CustomEvents, LiveReload, k; + + CustomEvents = require('./customevents'); + + LiveReload = window.LiveReload = new (require('./livereload').LiveReload)(window); + + for (k in window) { + if (k.match(/^LiveReloadPlugin/)) { + LiveReload.addPlugin(window[k]); + } + } + + LiveReload.addPlugin(require('./less')); + + LiveReload.on('shutdown', function() { + return delete window.LiveReload; + }); + + LiveReload.on('connect', function() { + return CustomEvents.fire(document, 'LiveReloadConnect'); + }); + + LiveReload.on('disconnect', function() { + return CustomEvents.fire(document, 'LiveReloadDisconnect'); + }); + + CustomEvents.bind(document, 'LiveReloadShutDown', function() { + return LiveReload.shutDown(); + }); + +}).call(this); + +},{"./customevents":2,"./less":3,"./livereload":4}],9:[function(require,module,exports){ +(function() { + var Timer; + + exports.Timer = Timer = (function() { + function Timer(func) { + this.func = func; + this.running = false; + this.id = null; + this._handler = (function(_this) { + return function() { + _this.running = false; + _this.id = null; + return _this.func(); + }; + })(this); + } + + Timer.prototype.start = function(timeout) { + if (this.running) { + clearTimeout(this.id); + } + this.id = setTimeout(this._handler, timeout); + return this.running = true; + }; + + Timer.prototype.stop = function() { + if (this.running) { + clearTimeout(this.id); + this.running = false; + return this.id = null; + } + }; + + return Timer; + + })(); + + Timer.start = function(timeout, func) { + return setTimeout(func, timeout); + }; + +}).call(this); + +},{}]},{},[8]); diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/servlet.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/servlet.rb new file mode 100644 index 000000000000..567ec313cbe6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/servlet.rb @@ -0,0 +1,205 @@ +# frozen_string_literal: true + +require "webrick" + +module Jekyll + module Commands + class Serve + # This class is used to determine if the Servlet should modify a served file + # to insert the LiveReload script tags + class SkipAnalyzer + BAD_USER_AGENTS = [%r!MSIE!].freeze + + def self.skip_processing?(request, response, options) + new(request, response, options).skip_processing? + end + + def initialize(request, response, options) + @options = options + @request = request + @response = response + end + + def skip_processing? + !html? || chunked? || inline? || bad_browser? + end + + def chunked? + @response["Transfer-Encoding"] == "chunked" + end + + def inline? + @response["Content-Disposition"] =~ %r!^inline! + end + + def bad_browser? + BAD_USER_AGENTS.any? { |pattern| @request["User-Agent"] =~ pattern } + end + + def html? + @response["Content-Type"] =~ %r!text/html! + end + end + + # This class inserts the LiveReload script tags into HTML as it is served + class BodyProcessor + HEAD_TAG_REGEX = %r!<head>|<head[^(er)][^<]*>! + + attr_reader :content_length, :new_body, :livereload_added + + def initialize(body, options) + @body = body + @options = options + @processed = false + end + + def processed? + @processed + end + + # rubocop:disable Metrics/MethodLength + def process! + @new_body = [] + # @body will usually be a File object but Strings occur in rare cases + if @body.respond_to?(:each) + begin + @body.each { |line| @new_body << line.to_s } + ensure + @body.close + end + else + @new_body = @body.lines + end + + @content_length = 0 + @livereload_added = false + + @new_body.each do |line| + if !@livereload_added && line["<head"] + line.gsub!(HEAD_TAG_REGEX) do |match| + %(#{match}#{template.result(binding)}) + end + + @livereload_added = true + end + + @content_length += line.bytesize + @processed = true + end + @new_body = @new_body.join + end + # rubocop:enable Metrics/MethodLength + + def template + # Unclear what "snipver" does. Doc at + # https://github.com/livereload/livereload-js states that the recommended + # setting is 1. + + # Complicated JavaScript to ensure that livereload.js is loaded from the + # same origin as the page. Mostly useful for dealing with the browser's + # distinction between 'localhost' and 127.0.0.1 + template = <<-TEMPLATE + <script> + document.write( + '<script src="http://' + + (location.host || 'localhost').split(':')[0] + + ':<%=@options["livereload_port"] %>/livereload.js?snipver=1<%= livereload_args %>"' + + '></' + + 'script>'); + </script> + TEMPLATE + ERB.new(Jekyll::Utils.strip_heredoc(template)) + end + + def livereload_args + # XHTML standard requires ampersands to be encoded as entities when in + # attributes. See http://stackoverflow.com/a/2190292 + src = "" + if @options["livereload_min_delay"] + src += "&amp;mindelay=#{@options["livereload_min_delay"]}" + end + if @options["livereload_max_delay"] + src += "&amp;maxdelay=#{@options["livereload_max_delay"]}" + end + if @options["livereload_port"] + src += "&amp;port=#{@options["livereload_port"]}" + end + src + end + end + + class Servlet < WEBrick::HTTPServlet::FileHandler + DEFAULTS = { + "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ + "no-store, no-cache, must-revalidate", + }.freeze + + def initialize(server, root, callbacks) + # So we can access them easily. + @jekyll_opts = server.config[:JekyllOptions] + set_defaults + super + end + + def search_index_file(req, res) + super || search_file(req, res, ".html") + end + + # Add the ability to tap file.html the same way that Nginx does on our + # Docker images (or on GitHub Pages.) The difference is that we might end + # up with a different preference on which comes first. + + def search_file(req, res, basename) + # /file.* > /file/index.html > /file.html + super || super(req, res, "#{basename}.html") + end + + # rubocop:disable Naming/MethodName + def do_GET(req, res) + rtn = super + + if @jekyll_opts["livereload"] + return rtn if SkipAnalyzer.skip_processing?(req, res, @jekyll_opts) + + processor = BodyProcessor.new(res.body, @jekyll_opts) + processor.process! + res.body = processor.new_body + res.content_length = processor.content_length.to_s + + if processor.livereload_added + # Add a header to indicate that the page content has been modified + res["X-Rack-LiveReload"] = "1" + end + end + + validate_and_ensure_charset(req, res) + res.header.merge!(@headers) + rtn + end + # rubocop:enable Naming/MethodName + + # + + private + def validate_and_ensure_charset(_req, res) + key = res.header.keys.grep(%r!content-type!i).first + typ = res.header[key] + + unless typ =~ %r!;\s*charset=! + res.header[key] = "#{typ}; charset=#{@jekyll_opts["encoding"]}" + end + end + + # + + private + def set_defaults + hash_ = @jekyll_opts.fetch("webrick", {}).fetch("headers", {}) + DEFAULTS.each_with_object(@headers = hash_) do |(key, val), hash| + hash[key] = val unless hash.key?(key) + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/websockets.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/websockets.rb new file mode 100644 index 000000000000..8b49bd65cd8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/commands/serve/websockets.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +require "http/parser" + +module Jekyll + module Commands + class Serve + # The LiveReload protocol requires the server to serve livereload.js over HTTP + # despite the fact that the protocol itself uses WebSockets. This custom connection + # class addresses the dual protocols that the server needs to understand. + class HttpAwareConnection < EventMachine::WebSocket::Connection + attr_reader :reload_body, :reload_size + + def initialize(_opts) + # If EventMachine SSL support on Windows ever gets better, the code below will + # set up the reactor to handle SSL + # + # @ssl_enabled = opts["ssl_cert"] && opts["ssl_key"] + # if @ssl_enabled + # em_opts[:tls_options] = { + # :private_key_file => Jekyll.sanitized_path(opts["source"], opts["ssl_key"]), + # :cert_chain_file => Jekyll.sanitized_path(opts["source"], opts["ssl_cert"]) + # } + # em_opts[:secure] = true + # end + + # This is too noisy even for --verbose, but uncomment if you need it for + # a specific WebSockets issue. Adding ?LR-verbose=true onto the URL will + # enable logging on the client side. + # em_opts[:debug] = true + + em_opts = {} + super(em_opts) + + reload_file = File.join(Serve.singleton_class::LIVERELOAD_DIR, "livereload.js") + + @reload_body = File.read(reload_file) + @reload_size = @reload_body.bytesize + end + + # rubocop:disable Metrics/MethodLength + def dispatch(data) + parser = Http::Parser.new + parser << data + + # WebSockets requests will have a Connection: Upgrade header + if parser.http_method != "GET" || parser.upgrade? + super + elsif parser.request_url =~ %r!^\/livereload.js! + headers = [ + "HTTP/1.1 200 OK", + "Content-Type: application/javascript", + "Content-Length: #{reload_size}", + "", + "", + ].join("\r\n") + send_data(headers) + + # stream_file_data would free us from keeping livereload.js in memory + # but JRuby blocks on that call and never returns + send_data(reload_body) + close_connection_after_writing + else + body = "This port only serves livereload.js over HTTP.\n" + headers = [ + "HTTP/1.1 400 Bad Request", + "Content-Type: text/plain", + "Content-Length: #{body.bytesize}", + "", + "", + ].join("\r\n") + send_data(headers) + send_data(body) + close_connection_after_writing + end + end + # rubocop:enable Metrics/MethodLength + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/configuration.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/configuration.rb new file mode 100644 index 000000000000..27c6f5cd34f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/configuration.rb @@ -0,0 +1,405 @@ +# frozen_string_literal: true + +module Jekyll + class Configuration < Hash + # Default options. Overridden by values in _config.yml. + # Strings rather than symbols are used for compatibility with YAML. + DEFAULTS = Configuration[{ + # Where things are + "source" => Dir.pwd, + "destination" => File.join(Dir.pwd, "_site"), + "collections_dir" => "", + "plugins_dir" => "_plugins", + "layouts_dir" => "_layouts", + "data_dir" => "_data", + "includes_dir" => "_includes", + "collections" => {}, + + # Handling Reading + "safe" => false, + "include" => [".htaccess"], + "exclude" => %w( + Gemfile Gemfile.lock node_modules vendor/bundle/ vendor/cache/ vendor/gems/ + vendor/ruby/ + ), + "keep_files" => [".git", ".svn"], + "encoding" => "utf-8", + "markdown_ext" => "markdown,mkdown,mkdn,mkd,md", + "strict_front_matter" => false, + + # Filtering Content + "show_drafts" => nil, + "limit_posts" => 0, + "future" => false, + "unpublished" => false, + + # Plugins + "whitelist" => [], + "plugins" => [], + + # Conversion + "markdown" => "kramdown", + "highlighter" => "rouge", + "lsi" => false, + "excerpt_separator" => "\n\n", + "incremental" => false, + + # Serving + "detach" => false, # default to not detaching the server + "port" => "4000", + "host" => "127.0.0.1", + "baseurl" => nil, # this mounts at /, i.e. no subdirectory + "show_dir_listing" => false, + + # Output Configuration + "permalink" => "date", + "paginate_path" => "/page:num", + "timezone" => nil, # use the local timezone + + "quiet" => false, + "verbose" => false, + "defaults" => [], + + "liquid" => { + "error_mode" => "warn", + "strict_filters" => false, + "strict_variables" => false, + }, + + "rdiscount" => { + "extensions" => [], + }, + + "redcarpet" => { + "extensions" => [], + }, + + "kramdown" => { + "auto_ids" => true, + "toc_levels" => "1..6", + "entity_output" => "as_char", + "smart_quotes" => "lsquo,rsquo,ldquo,rdquo", + "input" => "GFM", + "hard_wrap" => false, + "guess_lang" => true, + "footnote_nr" => 1, + "show_warnings" => false, + }, + }.map { |k, v| [k, v.freeze] }].freeze + + class << self + # Static: Produce a Configuration ready for use in a Site. + # It takes the input, fills in the defaults where values do not + # exist, and patches common issues including migrating options for + # backwards compatiblity. Except where a key or value is being fixed, + # the user configuration will override the defaults. + # + # user_config - a Hash or Configuration of overrides. + # + # Returns a Configuration filled with defaults and fixed for common + # problems and backwards-compatibility. + def from(user_config) + Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys) + .add_default_collections + end + end + + # Public: Turn all keys into string + # + # Return a copy of the hash where all its keys are strings + def stringify_keys + reduce({}) { |hsh, (k, v)| hsh.merge(k.to_s => v) } + end + + def get_config_value_with_override(config_key, override) + override[config_key] || self[config_key] || DEFAULTS[config_key] + end + + # Public: Directory of the Jekyll source folder + # + # override - the command-line options hash + # + # Returns the path to the Jekyll source directory + def source(override) + get_config_value_with_override("source", override) + end + + def quiet(override = {}) + get_config_value_with_override("quiet", override) + end + alias_method :quiet?, :quiet + + def verbose(override = {}) + get_config_value_with_override("verbose", override) + end + alias_method :verbose?, :verbose + + def safe_load_file(filename) + case File.extname(filename) + when %r!\.toml!i + Jekyll::External.require_with_graceful_fail("tomlrb") unless defined?(Tomlrb) + Tomlrb.load_file(filename) + when %r!\.ya?ml!i + SafeYAML.load_file(filename) || {} + else + raise ArgumentError, "No parser for '#{filename}' is available. + Use a .y(a)ml or .toml file instead." + end + end + + # Public: Generate list of configuration files from the override + # + # override - the command-line options hash + # + # Returns an Array of config files + def config_files(override) + # Adjust verbosity quickly + Jekyll.logger.adjust_verbosity( + :quiet => quiet?(override), + :verbose => verbose?(override) + ) + + # Get configuration from <source>/_config.yml or <source>/<config_file> + config_files = override["config"] + if config_files.to_s.empty? + default = %w(yml yaml).find(-> { "yml" }) do |ext| + File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}")) + end + config_files = Jekyll.sanitized_path(source(override), "_config.#{default}") + @default_config_file = true + end + Array(config_files) + end + + # Public: Read configuration and return merged Hash + # + # file - the path to the YAML file to be read in + # + # Returns this configuration, overridden by the values in the file + def read_config_file(file) + next_config = safe_load_file(file) + check_config_is_hash!(next_config, file) + Jekyll.logger.info "Configuration file:", file + next_config + rescue SystemCallError + if @default_config_file ||= nil + Jekyll.logger.warn "Configuration file:", "none" + {} + else + Jekyll.logger.error "Fatal:", "The configuration file '#{file}' + could not be found." + raise LoadError, "The Configuration file '#{file}' could not be found." + end + end + + # Public: Read in a list of configuration files and merge with this hash + # + # files - the list of configuration file paths + # + # Returns the full configuration, with the defaults overridden by the values in the + # configuration files + def read_config_files(files) + configuration = clone + + begin + files.each do |config_file| + next if config_file.nil? || config_file.empty? + new_config = read_config_file(config_file) + configuration = Utils.deep_merge_hashes(configuration, new_config) + end + rescue ArgumentError => err + Jekyll.logger.warn "WARNING:", "Error reading configuration. " \ + "Using defaults (and options)." + warn err + end + + configuration.backwards_compatibilize.add_default_collections + end + + # Public: Split a CSV string into an array containing its values + # + # csv - the string of comma-separated values + # + # Returns an array of the values contained in the CSV + def csv_to_array(csv) + csv.split(",").map(&:strip) + end + + # Public: Ensure the proper options are set in the configuration to allow for + # backwards-compatibility with Jekyll pre-1.0 + # + # Returns the backwards-compatible configuration + def backwards_compatibilize + config = clone + # Provide backwards-compatibility + check_auto(config) + check_server(config) + check_plugins(config) + + renamed_key "server_port", "port", config + renamed_key "gems", "plugins", config + renamed_key "layouts", "layouts_dir", config + renamed_key "data_source", "data_dir", config + + check_pygments(config) + check_include_exclude(config) + check_coderay(config) + check_maruku(config) + + config + end + + # DEPRECATED. + def fix_common_issues + self + end + + def add_default_collections + config = clone + + # It defaults to `{}`, so this is only if someone sets it to null manually. + return config if config["collections"].nil? + + # Ensure we have a hash. + if config["collections"].is_a?(Array) + config["collections"] = Hash[config["collections"].map { |c| [c, {}] }] + end + + config["collections"] = Utils.deep_merge_hashes( + { "posts" => {} }, config["collections"] + ).tap do |collections| + collections["posts"]["output"] = true + if config["permalink"] + collections["posts"]["permalink"] ||= style_to_permalink(config["permalink"]) + end + end + + config + end + + def renamed_key(old, new, config, _ = nil) + if config.key?(old) + Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" \ + " option has been renamed to '#{new}'. Please update your config" \ + " file accordingly." + config[new] = config.delete(old) + end + end + + private + def style_to_permalink(permalink_style) + case permalink_style.to_sym + when :pretty + "/:categories/:year/:month/:day/:title/" + when :none + "/:categories/:title:output_ext" + when :date + "/:categories/:year/:month/:day/:title:output_ext" + when :ordinal + "/:categories/:year/:y_day/:title:output_ext" + else + permalink_style.to_s + end + end + + # Private: Checks if a given config is a hash + # + # extracted_config - the value to check + # file - the file from which the config was extracted + # + # Raises an ArgumentError if given config is not a hash + private + def check_config_is_hash!(extracted_config, file) + unless extracted_config.is_a?(Hash) + raise ArgumentError, "Configuration file: (INVALID) #{file}".yellow + end + end + + private + def check_auto(config) + if config.key?("auto") || config.key?("watch") + Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" \ + " be set from your configuration file(s). Use the" \ + " --[no-]watch/-w command-line option instead." + config.delete("auto") + config.delete("watch") + end + end + + private + def check_server(config) + if config.key?("server") + Jekyll::Deprecator.deprecation_message "The 'server' configuration option" \ + " is no longer accepted. Use the 'jekyll serve'" \ + " subcommand to serve your site with WEBrick." + config.delete("server") + end + end + + private + def check_pygments(config) + if config.key?("pygments") + Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" \ + " has been renamed to 'highlighter'. Please update your" \ + " config file accordingly. The allowed values are 'rouge', " \ + "'pygments' or null." + + config["highlighter"] = "pygments" if config["pygments"] + config.delete("pygments") + end + end + + private + def check_include_exclude(config) + %w(include exclude).each do |option| + if config[option].is_a?(String) + Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" \ + " must now be specified as an array, but you specified" \ + " a string. For now, we've treated the string you provided" \ + " as a list of comma-separated values." + config[option] = csv_to_array(config[option]) + end + config[option].map!(&:to_s) if config[option] + end + end + + private + def check_coderay(config) + if (config["kramdown"] || {}).key?("use_coderay") + Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" \ + " to 'enable_coderay' in your configuration file." + config["kramdown"]["use_coderay"] = config["kramdown"].delete("enable_coderay") + end + end + + private + def check_maruku(config) + if config.fetch("markdown", "kramdown").to_s.casecmp("maruku").zero? + Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " \ + "Markdown processor, which has been removed as of 3.0.0. " \ + "We recommend you switch to Kramdown. To do this, replace " \ + "`markdown: maruku` with `markdown: kramdown` in your " \ + "`_config.yml` file." + end + end + + # Private: Checks if the `plugins` config is a String + # + # config - the config hash + # + # Raises a Jekyll::Errors::InvalidConfigurationError if the config `plugins` + # is a string + private + def check_plugins(config) + if config.key?("plugins") && config["plugins"].is_a?(String) + Jekyll.logger.error "Configuration Error:", "You specified the" \ + " `plugins` config in your configuration file as a string, please" \ + " use an array instead. If you wanted to set the directory of your" \ + " plugins, use the config key `plugins_dir` instead." + raise Jekyll::Errors::InvalidConfigurationError, + "'plugins' should not be a string, but was: " \ + "#{config["plugins"].inspect}. Use 'plugins_dir' instead." + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converter.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converter.rb new file mode 100644 index 000000000000..3cb74de21233 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converter.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +module Jekyll + class Converter < Plugin + # Public: Get or set the highlighter prefix. When an argument is specified, + # the prefix will be set. If no argument is specified, the current prefix + # will be returned. + # + # highlighter_prefix - The String prefix (default: nil). + # + # Returns the String prefix. + def self.highlighter_prefix(highlighter_prefix = nil) + unless defined?(@highlighter_prefix) && highlighter_prefix.nil? + @highlighter_prefix = highlighter_prefix + end + @highlighter_prefix + end + + # Public: Get or set the highlighter suffix. When an argument is specified, + # the suffix will be set. If no argument is specified, the current suffix + # will be returned. + # + # highlighter_suffix - The String suffix (default: nil). + # + # Returns the String suffix. + def self.highlighter_suffix(highlighter_suffix = nil) + unless defined?(@highlighter_suffix) && highlighter_suffix.nil? + @highlighter_suffix = highlighter_suffix + end + @highlighter_suffix + end + + # Initialize the converter. + # + # Returns an initialized Converter. + def initialize(config = {}) + @config = config + end + + # Get the highlighter prefix. + # + # Returns the String prefix. + def highlighter_prefix + self.class.highlighter_prefix + end + + # Get the highlighter suffix. + # + # Returns the String suffix. + def highlighter_suffix + self.class.highlighter_suffix + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/identity.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/identity.rb new file mode 100644 index 000000000000..2296aff19669 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/identity.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Jekyll + module Converters + class Identity < Converter + safe true + + priority :lowest + + def matches(_ext) + true + end + + def output_ext(ext) + ext + end + + def convert(content) + content + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown.rb new file mode 100644 index 000000000000..17d102ff0380 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +module Jekyll + module Converters + class Markdown < Converter + highlighter_prefix "\n" + highlighter_suffix "\n" + safe true + + def setup + return if @setup ||= false + unless (@parser = get_processor) + Jekyll.logger.error "Invalid Markdown processor given:", @config["markdown"] + if @config["safe"] + Jekyll.logger.info "", "Custom processors are not loaded in safe mode" + end + Jekyll.logger.error( + "", + "Available processors are: #{valid_processors.join(", ")}" + ) + raise Errors::FatalException, "Bailing out; invalid Markdown processor." + end + + @setup = true + end + + # Rubocop does not allow reader methods to have names starting with `get_` + # To ensure compatibility, this check has been disabled on this method + # + # rubocop:disable Naming/AccessorMethodName + def get_processor + case @config["markdown"].downcase + when "redcarpet" then return RedcarpetParser.new(@config) + when "kramdown" then return KramdownParser.new(@config) + when "rdiscount" then return RDiscountParser.new(@config) + else + custom_processor + end + end + # rubocop:enable Naming/AccessorMethodName + + # Public: Provides you with a list of processors, the ones we + # support internally and the ones that you have provided to us (if you + # are not in safe mode.) + + def valid_processors + %w(rdiscount kramdown redcarpet) + third_party_processors + end + + # Public: A list of processors that you provide via plugins. + # This is really only available if you are not in safe mode, if you are + # in safe mode (re: GitHub) then there will be none. + + def third_party_processors + self.class.constants - \ + %w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map( + &:to_sym + ) + end + + def extname_list + @extname_list ||= @config["markdown_ext"].split(",").map do |e| + ".#{e.downcase}" + end + end + + def matches(ext) + extname_list.include?(ext.downcase) + end + + def output_ext(_ext) + ".html" + end + + def convert(content) + setup + @parser.convert(content) + end + + private + def custom_processor + converter_name = @config["markdown"] + if custom_class_allowed?(converter_name) + self.class.const_get(converter_name).new(@config) + end + end + + # Private: Determine whether a class name is an allowed custom + # markdown class name. + # + # parser_name - the name of the parser class + # + # Returns true if the parser name contains only alphanumeric + # characters and is defined within Jekyll::Converters::Markdown + + private + def custom_class_allowed?(parser_name) + parser_name !~ %r![^A-Za-z0-9_]! && self.class.constants.include?( + parser_name.to_sym + ) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown/kramdown_parser.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown/kramdown_parser.rb new file mode 100644 index 000000000000..6ed3d7178ad6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown/kramdown_parser.rb @@ -0,0 +1,147 @@ +# Frozen-string-literal: true + +module Jekyll + module Converters + class Markdown + class KramdownParser + CODERAY_DEFAULTS = { + "css" => "style", + "bold_every" => 10, + "line_numbers" => "inline", + "line_number_start" => 1, + "tab_width" => 4, + "wrap" => "div", + }.freeze + + def initialize(config) + @main_fallback_highlighter = config["highlighter"] || "rouge" + @config = config["kramdown"] || {} + @highlighter = nil + setup + load_dependencies + end + + # Setup and normalize the configuration: + # * Create Kramdown if it doesn't exist. + # * Set syntax_highlighter, detecting enable_coderay and merging + # highlighter if none. + # * Merge kramdown[coderay] into syntax_highlighter_opts stripping coderay_. + # * Make sure `syntax_highlighter_opts` exists. + + def setup + @config["syntax_highlighter"] ||= highlighter + @config["syntax_highlighter_opts"] ||= {} + @config["syntax_highlighter_opts"]["default_lang"] ||= "plaintext" + @config["syntax_highlighter_opts"]["guess_lang"] = @config["guess_lang"] + @config["coderay"] ||= {} # XXX: Legacy. + modernize_coderay_config + make_accessible + end + + def convert(content) + document = Kramdown::Document.new(content, @config) + html_output = document.to_html + if @config["show_warnings"] + document.warnings.each do |warning| + Jekyll.logger.warn "Kramdown warning:", warning + end + end + html_output + end + + private + + def load_dependencies + return if Kramdown::VERSION.to_i < 2 + if @config["input"] == "GFM" + Jekyll::External.require_with_graceful_fail("kramdown-parser-gfm") + end + + if highlighter == "coderay" + Jekyll::External.require_with_graceful_fail("kramdown-syntax-coderay") + end + + # `mathjax` emgine is bundled within kramdown-2.x and will be handled by + # kramdown itself. + if (math_engine = @config["math_engine"]) && math_engine != "mathjax" + Jekyll::External.require_with_graceful_fail("kramdown-math-#{math_engine}") + end + end + + def make_accessible(hash = @config) + hash.keys.each do |key| + hash[key.to_sym] = hash[key] + make_accessible(hash[key]) if hash[key].is_a?(Hash) + end + end + + # config[kramdown][syntax_higlighter] > + # config[kramdown][enable_coderay] > + # config[highlighter] + # Where `enable_coderay` is now deprecated because Kramdown + # supports Rouge now too. + + private + def highlighter + return @highlighter if @highlighter + + if @config["syntax_highlighter"] + return @highlighter = @config[ + "syntax_highlighter" + ] + end + + @highlighter = begin + if @config.key?("enable_coderay") && @config["enable_coderay"] + Jekyll::Deprecator.deprecation_message( + "You are using 'enable_coderay', " \ + "use syntax_highlighter: coderay in your configuration file." + ) + + "coderay" + else + @main_fallback_highlighter + end + end + end + + private + def strip_coderay_prefix(hash) + hash.each_with_object({}) do |(key, val), hsh| + cleaned_key = key.to_s.gsub(%r!\Acoderay_!, "") + + if key != cleaned_key + Jekyll::Deprecator.deprecation_message( + "You are using '#{key}'. Normalizing to #{cleaned_key}." + ) + end + + hsh[cleaned_key] = val + end + end + + # If our highlighter is CodeRay we go in to merge the CodeRay defaults + # with your "coderay" key if it's there, deprecating it in the + # process of you using it. + + private + def modernize_coderay_config + unless @config["coderay"].empty? + Jekyll::Deprecator.deprecation_message( + "You are using 'kramdown.coderay' in your configuration, " \ + "please use 'syntax_highlighter_opts' instead." + ) + + @config["syntax_highlighter_opts"] = begin + strip_coderay_prefix( + @config["syntax_highlighter_opts"] \ + .merge(CODERAY_DEFAULTS) \ + .merge(@config["coderay"]) + ) + end + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown/rdiscount_parser.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown/rdiscount_parser.rb new file mode 100644 index 000000000000..9da177d4badf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown/rdiscount_parser.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module Jekyll + module Converters + class Markdown + class RDiscountParser + def initialize(config) + unless defined?(RDiscount) + Jekyll::External.require_with_graceful_fail "rdiscount" + end + @config = config + @rdiscount_extensions = @config["rdiscount"]["extensions"].map(&:to_sym) + end + + def convert(content) + rd = RDiscount.new(content, *@rdiscount_extensions) + html = rd.to_html + if @config["rdiscount"]["toc_token"] + html = replace_generated_toc(rd, html, @config["rdiscount"]["toc_token"]) + end + html + end + + private + def replace_generated_toc(rd_instance, html, toc_token) + if rd_instance.generate_toc && html.include?(toc_token) + utf8_toc = rd_instance.toc_content + utf8_toc.force_encoding("utf-8") if utf8_toc.respond_to?(:force_encoding) + html.gsub(toc_token, utf8_toc) + else + html + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown/redcarpet_parser.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown/redcarpet_parser.rb new file mode 100644 index 000000000000..d148e06d2069 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/markdown/redcarpet_parser.rb @@ -0,0 +1,112 @@ +# frozen_string_literal: true + +class Jekyll::Converters::Markdown::RedcarpetParser + module CommonMethods + def add_code_tags(code, lang) + code = code.to_s + code = code.sub( + %r!<pre>!, + "<pre><code class=\"language-#{lang}\" data-lang=\"#{lang}\">" + ) + code = code.sub(%r!</pre>!, "</code></pre>") + code + end + end + + module WithPygments + include CommonMethods + def block_code(code, lang) + unless defined?(Pygments) + Jekyll::External.require_with_graceful_fail("pygments") + end + lang = lang && lang.split.first || "text" + add_code_tags( + Pygments.highlight( + code, + { + :lexer => lang, + :options => { :encoding => "utf-8" }, + } + ), + lang + ) + end + end + + module WithoutHighlighting + require "cgi" + + include CommonMethods + + def code_wrap(code) + "<figure class=\"highlight\"><pre>#{CGI.escapeHTML(code)}</pre></figure>" + end + + def block_code(code, lang) + lang = lang && lang.split.first || "text" + add_code_tags(code_wrap(code), lang) + end + end + + module WithRouge + def block_code(_code, lang) + code = "<pre>#{super}</pre>" + + "<div class=\"highlight\">#{add_code_tags(code, lang)}</div>" + end + + protected + def rouge_formatter(_lexer) + Jekyll::Utils::Rouge.html_formatter(:wrap => false) + end + end + + def initialize(config) + unless defined?(Redcarpet) + Jekyll::External.require_with_graceful_fail("redcarpet") + end + @config = config + @redcarpet_extensions = {} + @config["redcarpet"]["extensions"].each do |e| + @redcarpet_extensions[e.to_sym] = true + end + + @renderer ||= class_with_proper_highlighter(@config["highlighter"]) + end + + def class_with_proper_highlighter(highlighter) + Class.new(Redcarpet::Render::HTML) do + case highlighter + when "pygments" + include WithPygments + when "rouge" + Jekyll::External.require_with_graceful_fail(%w( + rouge rouge/plugins/redcarpet + )) + + unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0") + abort "Please install Rouge 1.3.0 or greater and try running Jekyll again." + end + + include Rouge::Plugins::Redcarpet + include CommonMethods + include WithRouge + else + include WithoutHighlighting + end + end + end + + def convert(content) + @redcarpet_extensions[:fenced_code_blocks] = \ + !@redcarpet_extensions[:no_fenced_code_blocks] + if @redcarpet_extensions[:smart] + @renderer.send :include, Redcarpet::Render::SmartyPants + end + markdown = Redcarpet::Markdown.new( + @renderer.new(@redcarpet_extensions), + @redcarpet_extensions + ) + markdown.render(content) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/smartypants.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/smartypants.rb new file mode 100644 index 000000000000..8234a41afc1f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/converters/smartypants.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown + def initialize(source, options) + super + @block_parsers = [:block_html, :content] + @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :span_html] + end + + def parse_content + add_text @src.scan(%r!\A.*\n!) + end + define_parser(:content, %r!\A!) +end + +module Jekyll + module Converters + class SmartyPants < Converter + safe true + priority :low + + def initialize(config) + unless defined?(Kramdown) + Jekyll::External.require_with_graceful_fail "kramdown" + end + @config = config["kramdown"].dup || {} + @config[:input] = :SmartyPants + end + + def matches(_) + false + end + + def output_ext(_) + nil + end + + def convert(content) + document = Kramdown::Document.new(content, @config) + html_output = document.to_html.chomp + if @config["show_warnings"] + document.warnings.each do |warning| + Jekyll.logger.warn "Kramdown warning:", warning.sub(%r!^Warning:\s+!, "") + end + end + html_output + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/convertible.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/convertible.rb new file mode 100644 index 000000000000..8a851f7c466a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/convertible.rb @@ -0,0 +1,255 @@ +# frozen_string_literal: true + +# Convertible provides methods for converting a pagelike item +# from a certain type of markup into actual content +# +# Requires +# self.site -> Jekyll::Site +# self.content +# self.content= +# self.data= +# self.ext= +# self.output= +# self.name +# self.path +# self.type -> :page, :post or :draft + +module Jekyll + module Convertible + # Returns the contents as a String. + def to_s + content || "" + end + + # Whether the file is published or not, as indicated in YAML front-matter + def published? + !(data.key?("published") && data["published"] == false) + end + + # Read the YAML frontmatter. + # + # base - The String path to the dir containing the file. + # name - The String filename of the file. + # opts - optional parameter to File.read, default at site configs + # + # Returns nothing. + # rubocop:disable Metrics/AbcSize + def read_yaml(base, name, opts = {}) + filename = File.join(base, name) + + begin + self.content = File.read(@path || site.in_source_dir(base, name), + **Utils.merged_file_read_opts(site, opts)) + if content =~ Document::YAML_FRONT_MATTER_REGEXP + self.content = $POSTMATCH + self.data = SafeYAML.load(Regexp.last_match(1)) + end + rescue Psych::SyntaxError => e + Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" + raise e if self.site.config["strict_front_matter"] + rescue StandardError => e + Jekyll.logger.warn "Error reading file #{filename}: #{e.message}" + raise e if self.site.config["strict_front_matter"] + end + + self.data ||= {} + + validate_data! filename + validate_permalink! filename + + self.data + end + # rubocop:enable Metrics/AbcSize + + def validate_data!(filename) + unless self.data.is_a?(Hash) + raise Errors::InvalidYAMLFrontMatterError, + "Invalid YAML front matter in #{filename}" + end + end + + def validate_permalink!(filename) + if self.data["permalink"] && self.data["permalink"].to_s.empty? + raise Errors::InvalidPermalinkError, "Invalid permalink in #{filename}" + end + end + + # Transform the contents based on the content type. + # + # Returns the transformed contents. + def transform + _renderer.convert(content) + end + + # Determine the extension depending on content_type. + # + # Returns the String extension for the output file. + # e.g. ".html" for an HTML output file. + def output_ext + _renderer.output_ext + end + + # Determine which converter to use based on this convertible's + # extension. + # + # Returns the Converter instance. + def converters + _renderer.converters + end + + # Render Liquid in the content + # + # content - the raw Liquid content to render + # payload - the payload for Liquid + # info - the info for Liquid + # + # Returns the converted content + def render_liquid(content, payload, info, path) + _renderer.render_liquid(content, payload, info, path) + end + + # Convert this Convertible's data to a Hash suitable for use by Liquid. + # + # Returns the Hash representation of this Convertible. + def to_liquid(attrs = nil) + further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map do |attribute| + [attribute, send(attribute)] + end] + + defaults = site.frontmatter_defaults.all(relative_path, type) + Utils.deep_merge_hashes defaults, Utils.deep_merge_hashes(data, further_data) + end + + # The type of a document, + # i.e., its classname downcase'd and to_sym'd. + # + # Returns the type of self. + def type + if is_a?(Page) + :pages + end + end + + # returns the owner symbol for hook triggering + def hook_owner + if is_a?(Page) + :pages + end + end + + # Determine whether the document is an asset file. + # Asset files include CoffeeScript files and Sass/SCSS files. + # + # Returns true if the extname belongs to the set of extensions + # that asset files use. + def asset_file? + sass_file? || coffeescript_file? + end + + # Determine whether the document is a Sass file. + # + # Returns true if extname == .sass or .scss, false otherwise. + def sass_file? + %w(.sass .scss).include?(ext) + end + + # Determine whether the document is a CoffeeScript file. + # + # Returns true if extname == .coffee, false otherwise. + def coffeescript_file? + ext == ".coffee" + end + + # Determine whether the file should be rendered with Liquid. + # + # Returns true if the file has Liquid Tags or Variables, false otherwise. + def render_with_liquid? + Jekyll::Utils.has_liquid_construct?(content) + end + + # Determine whether the file should be placed into layouts. + # + # Returns false if the document is an asset file or if the front matter + # specifies `layout: none` + def place_in_layout? + !(asset_file? || no_layout?) + end + + # Checks if the layout specified in the document actually exists + # + # layout - the layout to check + # + # Returns true if the layout is invalid, false if otherwise + def invalid_layout?(layout) + !data["layout"].nil? && layout.nil? && !(self.is_a? Jekyll::Excerpt) + end + + # Recursively render layouts + # + # layouts - a list of the layouts + # payload - the payload for Liquid + # info - the info for Liquid + # + # Returns nothing + def render_all_layouts(layouts, payload, info) + _renderer.layouts = layouts + self.output = _renderer.place_in_layouts(output, payload, info) + ensure + @_renderer = nil # this will allow the modifications above to disappear + end + + # Add any necessary layouts to this convertible document. + # + # payload - The site payload Drop or Hash. + # layouts - A Hash of {"name" => "layout"}. + # + # Returns nothing. + def do_layout(payload, layouts) + self.output = _renderer.tap do |renderer| + renderer.layouts = layouts + renderer.payload = payload + end.run + + Jekyll.logger.debug "Post-Render Hooks:", self.relative_path + Jekyll::Hooks.trigger hook_owner, :post_render, self + ensure + @_renderer = nil # this will allow the modifications above to disappear + end + + # Write the generated page file to the destination directory. + # + # dest - The String path to the destination dir. + # + # Returns nothing. + def write(dest) + path = destination(dest) + FileUtils.mkdir_p(File.dirname(path)) + Jekyll.logger.debug "Writing:", path + File.write(path, output, :mode => "wb") + Jekyll::Hooks.trigger hook_owner, :post_write, self + end + + # Accessor for data properties by Liquid. + # + # property - The String name of the property to retrieve. + # + # Returns the String value or nil if the property isn't included. + def [](property) + if self.class::ATTRIBUTES_FOR_LIQUID.include?(property) + send(property) + else + data[property] + end + end + + private + + def _renderer + @_renderer ||= Jekyll::Renderer.new(site, self) + end + + def no_layout? + data["layout"] == "none" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/deprecator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/deprecator.rb new file mode 100644 index 000000000000..327358c2d4fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/deprecator.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module Jekyll + module Deprecator + extend self + + def process(args) + arg_is_present? args, "--server", "The --server command has been replaced by the \ + 'serve' subcommand." + arg_is_present? args, "--serve", "The --serve command has been replaced by the \ + 'serve' subcommand." + arg_is_present? args, "--no-server", "To build Jekyll without launching a server, \ + use the 'build' subcommand." + arg_is_present? args, "--auto", "The switch '--auto' has been replaced with \ + '--watch'." + arg_is_present? args, "--no-auto", "To disable auto-replication, simply leave off \ + the '--watch' switch." + arg_is_present? args, "--pygments", "The 'pygments'settings has been removed in \ + favour of 'highlighter'." + arg_is_present? args, "--paginate", "The 'paginate' setting can only be set in \ + your config files." + arg_is_present? args, "--url", "The 'url' setting can only be set in your \ + config files." + no_subcommand(args) + end + + def no_subcommand(args) + unless args.empty? || + args.first !~ %r(!/^--/!) || %w(--help --version).include?(args.first) + deprecation_message "Jekyll now uses subcommands instead of just switches. \ + Run `jekyll help` to find out more." + abort + end + end + + def arg_is_present?(args, deprecated_argument, message) + if args.include?(deprecated_argument) + deprecation_message(message) + end + end + + def deprecation_message(message) + Jekyll.logger.warn "Deprecation:", message + end + + def defaults_deprecate_type(old, current) + Jekyll.logger.warn "Defaults:", "The '#{old}' type has become '#{current}'." + Jekyll.logger.warn "Defaults:", "Please update your front-matter defaults to use \ + 'type: #{current}'." + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/document.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/document.rb new file mode 100644 index 000000000000..a3971998bab7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/document.rb @@ -0,0 +1,508 @@ +# frozen_string_literal: true + +module Jekyll + class Document + include Comparable + extend Forwardable + + attr_reader :path, :site, :extname, :collection + attr_accessor :content, :output + + def_delegator :self, :read_post_data, :post_read + + YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m + DATELESS_FILENAME_MATCHER = %r!^(?:.+/)*(.*)(\.[^.]+)$! + DATE_FILENAME_MATCHER = %r!^(?:.+/)*(\d{2,4}-\d{1,2}-\d{1,2})-(.*)(\.[^.]+)$! + + # Create a new Document. + # + # path - the path to the file + # relations - a hash with keys :site and :collection, the values of which + # are the Jekyll::Site and Jekyll::Collection to which this + # Document belong. + # + # Returns nothing. + def initialize(path, relations = {}) + @site = relations[:site] + @path = path + @extname = File.extname(path) + @collection = relations[:collection] + @has_yaml_header = nil + + if draft? + categories_from_path("_drafts") + else + categories_from_path(collection.relative_directory) + end + + data.default_proc = proc do |_, key| + site.frontmatter_defaults.find(relative_path, collection.label, key) + end + + trigger_hooks(:post_init) + end + + # Fetch the Document's data. + # + # Returns a Hash containing the data. An empty hash is returned if + # no data was read. + def data + @data ||= {} + end + + # Merge some data in with this document's data. + # + # Returns the merged data. + def merge_data!(other, source: "YAML front matter") + merge_categories!(other) + Utils.deep_merge_hashes!(data, other) + merge_date!(source) + data + end + + def date + data["date"] ||= (draft? ? source_file_mtime : site.time) + end + + def source_file_mtime + @source_file_mtime ||= File.mtime(path) + end + + # Returns whether the document is a draft. This is only the case if + # the document is in the 'posts' collection but in a different + # directory than '_posts'. + # + # Returns whether the document is a draft. + def draft? + data["draft"] ||= relative_path.index(collection.relative_directory).nil? && + collection.label == "posts" + end + + # The path to the document, relative to the collections_dir. + # + # Returns a String path which represents the relative path from the collections_dir + # to this document. + def relative_path + @relative_path ||= path.sub("#{site.collections_path}/", "") + end + + # The output extension of the document. + # + # Returns the output extension + def output_ext + @output_ext ||= Jekyll::Renderer.new(site, self).output_ext + end + + # The base filename of the document, without the file extname. + # + # Returns the basename without the file extname. + def basename_without_ext + @basename_without_ext ||= File.basename(path, ".*") + end + + # The base filename of the document. + # + # Returns the base filename of the document. + def basename + @basename ||= File.basename(path) + end + + # Produces a "cleaned" relative path. + # The "cleaned" relative path is the relative path without the extname + # and with the collection's directory removed as well. + # This method is useful when building the URL of the document. + # + # Examples: + # When relative_path is "_methods/site/generate.md": + # cleaned_relative_path + # # => "/site/generate" + # + # Returns the cleaned relative path of the document. + def cleaned_relative_path + @cleaned_relative_path ||= + relative_path[0..-extname.length - 1].sub(collection.relative_directory, "") + end + + # Determine whether the document is a YAML file. + # + # Returns true if the extname is either .yml or .yaml, false otherwise. + def yaml_file? + %w(.yaml .yml).include?(extname) + end + + # Determine whether the document is an asset file. + # Asset files include CoffeeScript files and Sass/SCSS files. + # + # Returns true if the extname belongs to the set of extensions + # that asset files use. + def asset_file? + sass_file? || coffeescript_file? + end + + # Determine whether the document is a Sass file. + # + # Returns true if extname == .sass or .scss, false otherwise. + def sass_file? + %w(.sass .scss).include?(extname) + end + + # Determine whether the document is a CoffeeScript file. + # + # Returns true if extname == .coffee, false otherwise. + def coffeescript_file? + extname == ".coffee" + end + + # Determine whether the file should be rendered with Liquid. + # + # Returns false if the document is either an asset file or a yaml file, + # or if the document doesn't contain any Liquid Tags or Variables, + # true otherwise. + def render_with_liquid? + !(coffeescript_file? || yaml_file? || !Utils.has_liquid_construct?(content)) + end + + # Determine whether the file should be rendered with a layout. + # + # Returns true if the Front Matter specifies that `layout` is set to `none`. + def no_layout? + data["layout"] == "none" + end + + # Determine whether the file should be placed into layouts. + # + # Returns false if the document is set to `layouts: none`, or is either an + # asset file or a yaml file. Returns true otherwise. + def place_in_layout? + !(asset_file? || yaml_file? || no_layout?) + end + + # The URL template where the document would be accessible. + # + # Returns the URL template for the document. + def url_template + collection.url_template + end + + # Construct a Hash of key-value pairs which contain a mapping between + # a key in the URL template and the corresponding value for this document. + # + # Returns the Hash of key-value pairs for replacement in the URL. + def url_placeholders + @url_placeholders ||= Drops::UrlDrop.new(self) + end + + # The permalink for this Document. + # Permalink is set via the data Hash. + # + # Returns the permalink or nil if no permalink was set in the data. + def permalink + data && data.is_a?(Hash) && data["permalink"] + end + + # The computed URL for the document. See `Jekyll::URL#to_s` for more details. + # + # Returns the computed URL for the document. + def url + @url ||= URL.new({ + :template => url_template, + :placeholders => url_placeholders, + :permalink => permalink, + }).to_s + end + + def [](key) + data[key] + end + + # The full path to the output file. + # + # base_directory - the base path of the output directory + # + # Returns the full path to the output file of this document. + def destination(base_directory) + dest = site.in_dest_dir(base_directory) + path = site.in_dest_dir(dest, URL.unescape_path(url)) + if url.end_with? "/" + path = File.join(path, "index.html") + else + path << output_ext unless path.end_with? output_ext + end + path + end + + # Write the generated Document file to the destination directory. + # + # dest - The String path to the destination dir. + # + # Returns nothing. + def write(dest) + path = destination(dest) + FileUtils.mkdir_p(File.dirname(path)) + Jekyll.logger.debug "Writing:", path + File.write(path, output, :mode => "wb") + + trigger_hooks(:post_write) + end + + # Whether the file is published or not, as indicated in YAML front-matter + # + # Returns 'false' if the 'published' key is specified in the + # YAML front-matter and is 'false'. Otherwise returns 'true'. + def published? + !(data.key?("published") && data["published"] == false) + end + + # Read in the file and assign the content and data based on the file contents. + # Merge the frontmatter of the file with the frontmatter default + # values + # + # Returns nothing. + def read(opts = {}) + Jekyll.logger.debug "Reading:", relative_path + + if yaml_file? + @data = SafeYAML.load_file(path) + else + begin + merge_defaults + read_content(**opts) + read_post_data + rescue StandardError => e + handle_read_error(e) + end + end + end + + # Create a Liquid-understandable version of this Document. + # + # Returns a Hash representing this Document's data. + def to_liquid + @to_liquid ||= Drops::DocumentDrop.new(self) + end + + # The inspect string for this document. + # Includes the relative path and the collection label. + # + # Returns the inspect string for this document. + def inspect + "#<Jekyll::Document #{relative_path} collection=#{collection.label}>" + end + + # The string representation for this document. + # + # Returns the content of the document + def to_s + output || content || "NO CONTENT" + end + + # Compare this document against another document. + # Comparison is a comparison between the 2 paths of the documents. + # + # Returns -1, 0, +1 or nil depending on whether this doc's path is less than, + # equal or greater than the other doc's path. See String#<=> for more details. + def <=>(other) + return nil unless other.respond_to?(:data) + cmp = data["date"] <=> other.data["date"] + cmp = path <=> other.path if cmp.nil? || cmp.zero? + cmp + end + + # Determine whether this document should be written. + # Based on the Collection to which it belongs. + # + # True if the document has a collection and if that collection's #write? + # method returns true, and if the site's Publisher will publish the document. + # False otherwise. + def write? + collection && collection.write? && site.publisher.publish?(self) + end + + # The Document excerpt_separator, from the YAML Front-Matter or site + # default excerpt_separator value + # + # Returns the document excerpt_separator + def excerpt_separator + (data["excerpt_separator"] || site.config["excerpt_separator"]).to_s + end + + # Whether to generate an excerpt + # + # Returns true if the excerpt separator is configured. + def generate_excerpt? + !excerpt_separator.empty? + end + + def next_doc + pos = collection.docs.index { |post| post.equal?(self) } + if pos && pos < collection.docs.length - 1 + collection.docs[pos + 1] + end + end + + def previous_doc + pos = collection.docs.index { |post| post.equal?(self) } + if pos && pos > 0 + collection.docs[pos - 1] + end + end + + def trigger_hooks(hook_name, *args) + Jekyll::Hooks.trigger collection.label.to_sym, hook_name, self, *args if collection + Jekyll::Hooks.trigger :documents, hook_name, self, *args + end + + def id + @id ||= File.join(File.dirname(url), (data["slug"] || basename_without_ext).to_s) + end + + # Calculate related posts. + # + # Returns an Array of related Posts. + def related_posts + @related_posts ||= Jekyll::RelatedPosts.new(self).build + end + + # Override of normal respond_to? to match method_missing's logic for + # looking in @data. + def respond_to?(method, include_private = false) + data.key?(method.to_s) || super + end + + # Override of method_missing to check in @data for the key. + def method_missing(method, *args, &blck) + if data.key?(method.to_s) + Jekyll::Deprecator.deprecation_message "Document##{method} is now a key "\ + "in the #data hash." + Jekyll::Deprecator.deprecation_message "Called by #{caller(0..0)}." + data[method.to_s] + else + super + end + end + + def respond_to_missing?(method, *) + data.key?(method.to_s) || super + end + + # Add superdirectories of the special_dir to categories. + # In the case of es/_posts, 'es' is added as a category. + # In the case of _posts/es, 'es' is NOT added as a category. + # + # Returns nothing. + def categories_from_path(special_dir) + superdirs = relative_path.sub(%r!#{special_dir}(.*)!, "") + .split(File::SEPARATOR) + .reject do |c| + c.empty? || c == special_dir || c == basename + end + merge_data!({ "categories" => superdirs }, :source => "file path") + end + + def populate_categories + merge_data!({ + "categories" => ( + Array(data["categories"]) + Utils.pluralized_array_from_hash( + data, "category", "categories" + ) + ).map(&:to_s).flatten.uniq, + }) + end + + def populate_tags + merge_data!({ + "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten, + }) + end + + private + def merge_categories!(other) + if other.key?("categories") && !other["categories"].nil? + if other["categories"].is_a?(String) + other["categories"] = other["categories"].split + end + other["categories"] = (data["categories"] || []) | other["categories"] + end + end + + private + def merge_date!(source) + if data.key?("date") + data["date"] = Utils.parse_date( + data["date"].to_s, + "Document '#{relative_path}' does not have a valid date in the #{source}." + ) + end + end + + private + def merge_defaults + defaults = @site.frontmatter_defaults.all( + relative_path, + collection.label.to_sym + ) + merge_data!(defaults, :source => "front matter defaults") unless defaults.empty? + end + + private + def read_content(**opts) + self.content = File.read(path, **Utils.merged_file_read_opts(site, opts)) + if content =~ YAML_FRONT_MATTER_REGEXP + self.content = $POSTMATCH + data_file = SafeYAML.load(Regexp.last_match(1)) + merge_data!(data_file, :source => "YAML front matter") if data_file + end + end + + private + def read_post_data + populate_title + populate_categories + populate_tags + generate_excerpt + end + + private + def handle_read_error(error) + if error.is_a? Psych::SyntaxError + Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{error.message}" + else + Jekyll.logger.error "Error:", "could not read file #{path}: #{error.message}" + end + + if site.config["strict_front_matter"] || error.is_a?(Jekyll::Errors::FatalException) + raise error + end + end + + private + def populate_title + if relative_path =~ DATE_FILENAME_MATCHER + date, slug, ext = Regexp.last_match.captures + modify_date(date) + elsif relative_path =~ DATELESS_FILENAME_MATCHER + slug, ext = Regexp.last_match.captures + end + + # Try to ensure the user gets a title. + data["title"] ||= Utils.titleize_slug(slug) + # Only overwrite slug & ext if they aren't specified. + data["slug"] ||= slug + data["ext"] ||= ext + end + + private + def modify_date(date) + if !data["date"] || data["date"].to_i == site.time.to_i + merge_data!({ "date" => date }, :source => "filename") + end + end + + private + def generate_excerpt + if generate_excerpt? + data["excerpt"] ||= Jekyll::Excerpt.new(self) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/collection_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/collection_drop.rb new file mode 100644 index 000000000000..858a721a6f64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/collection_drop.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class CollectionDrop < Drop + extend Forwardable + + mutable false + + def_delegator :@obj, :write?, :output + def_delegators :@obj, :label, :docs, :files, :directory, + :relative_directory + + private def_delegator :@obj, :metadata, :fallback_data + + def to_s + docs.to_s + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/document_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/document_drop.rb new file mode 100644 index 000000000000..9c19ec911a27 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/document_drop.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class DocumentDrop < Drop + extend Forwardable + + NESTED_OBJECT_FIELD_BLACKLIST = %w( + content output excerpt next previous + ).freeze + + mutable false + + def_delegator :@obj, :relative_path, :path + def_delegators :@obj, :id, :output, :content, :to_s, :relative_path, :url + + private def_delegator :@obj, :data, :fallback_data + + def collection + @obj.collection.label + end + + def excerpt + fallback_data["excerpt"].to_s + end + + def <=>(other) + return nil unless other.is_a? DocumentDrop + cmp = self["date"] <=> other["date"] + cmp = self["path"] <=> other["path"] if cmp.nil? || cmp.zero? + cmp + end + + def previous + @obj.previous_doc.to_liquid + end + + def next + @obj.next_doc.to_liquid + end + + # Generate a Hash for use in generating JSON. + # This is useful if fields need to be cleared before the JSON can generate. + # + # state - the JSON::State object which determines the state of current processing. + # + # Returns a Hash ready for JSON generation. + def hash_for_json(state = nil) + to_h.tap do |hash| + if state && state.depth >= 2 + hash["previous"] = collapse_document(hash["previous"]) if hash["previous"] + hash["next"] = collapse_document(hash["next"]) if hash["next"] + end + end + end + + # Generate a Hash which breaks the recursive chain. + # Certain fields which are normally available are omitted. + # + # Returns a Hash with only non-recursive fields present. + def collapse_document(doc) + doc.keys.each_with_object({}) do |(key, _), result| + result[key] = doc[key] unless NESTED_OBJECT_FIELD_BLACKLIST.include?(key) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/drop.rb new file mode 100644 index 000000000000..be842737b19d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/drop.rb @@ -0,0 +1,212 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class Drop < Liquid::Drop + include Enumerable + + NON_CONTENT_METHODS = [:fallback_data, :collapse_document].freeze + + # Get or set whether the drop class is mutable. + # Mutability determines whether or not pre-defined fields may be + # overwritten. + # + # is_mutable - Boolean set mutability of the class (default: nil) + # + # Returns the mutability of the class + def self.mutable(is_mutable = nil) + @is_mutable = if is_mutable + is_mutable + else + false + end + end + + def self.mutable? + @is_mutable + end + + # Create a new Drop + # + # obj - the Jekyll Site, Collection, or Document required by the + # drop. + # + # Returns nothing + def initialize(obj) + @obj = obj + @mutations = {} # only if mutable: true + end + + # Access a method in the Drop or a field in the underlying hash data. + # If mutable, checks the mutations first. Then checks the methods, + # and finally check the underlying hash (e.g. document front matter) + # if all the previous places didn't match. + # + # key - the string key whose value to fetch + # + # Returns the value for the given key, or nil if none exists + def [](key) + if self.class.mutable? && @mutations.key?(key) + @mutations[key] + elsif self.class.invokable? key + public_send key + else + fallback_data[key] + end + end + alias_method :invoke_drop, :[] + + # Set a field in the Drop. If mutable, sets in the mutations and + # returns. If not mutable, checks first if it's trying to override a + # Drop method and raises a DropMutationException if so. If not + # mutable and the key is not a method on the Drop, then it sets the + # key to the value in the underlying hash (e.g. document front + # matter) + # + # key - the String key whose value to set + # val - the Object to set the key's value to + # + # Returns the value the key was set to unless the Drop is not mutable + # and the key matches a method in which case it raises a + # DropMutationException. + def []=(key, val) + if respond_to?("#{key}=") + public_send("#{key}=", val) + elsif respond_to?(key.to_s) + if self.class.mutable? + @mutations[key] = val + else + raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." + end + else + fallback_data[key] = val + end + end + + # Generates a list of strings which correspond to content getter + # methods. + # + # Returns an Array of strings which represent method-specific keys. + def content_methods + @content_methods ||= ( + self.class.instance_methods \ + - Jekyll::Drops::Drop.instance_methods \ + - NON_CONTENT_METHODS + ).map(&:to_s).reject do |method| + method.end_with?("=") + end + end + + # Check if key exists in Drop + # + # key - the string key whose value to fetch + # + # Returns true if the given key is present + def key?(key) + return false if key.nil? + return true if self.class.mutable? && @mutations.key?(key) + respond_to?(key) || fallback_data.key?(key) + end + + # Generates a list of keys with user content as their values. + # This gathers up the Drop methods and keys of the mutations and + # underlying data hashes and performs a set union to ensure a list + # of unique keys for the Drop. + # + # Returns an Array of unique keys for content for the Drop. + def keys + (content_methods | + @mutations.keys | + fallback_data.keys).flatten + end + + # Generate a Hash representation of the Drop by resolving each key's + # value. It includes Drop methods, mutations, and the underlying object's + # data. See the documentation for Drop#keys for more. + # + # Returns a Hash with all the keys and values resolved. + def to_h + keys.each_with_object({}) do |(key, _), result| + result[key] = self[key] + end + end + alias_method :to_hash, :to_h + + # Inspect the drop's keys and values through a JSON representation + # of its keys and values. + # + # Returns a pretty generation of the hash representation of the Drop. + def inspect + JSON.pretty_generate to_h + end + + # Generate a Hash for use in generating JSON. + # This is useful if fields need to be cleared before the JSON can generate. + # + # Returns a Hash ready for JSON generation. + def hash_for_json(*) + to_h + end + + # Generate a JSON representation of the Drop. + # + # state - the JSON::State object which determines the state of current processing. + # + # Returns a JSON representation of the Drop in a String. + def to_json(state = nil) + JSON.generate(hash_for_json(state), state) + end + + # Collects all the keys and passes each to the block in turn. + # + # block - a block which accepts one argument, the key + # + # Returns nothing. + def each_key(&block) + keys.each(&block) + end + + def each + each_key.each do |key| + yield key, self[key] + end + end + + def merge(other, &block) + self.dup.tap do |me| + if block.nil? + me.merge!(other) + else + me.merge!(other, block) + end + end + end + + def merge!(other) + other.each_key do |key| + if block_given? + self[key] = yield key, self[key], other[key] + else + if Utils.mergable?(self[key]) && Utils.mergable?(other[key]) + self[key] = Utils.deep_merge_hashes(self[key], other[key]) + next + end + + self[key] = other[key] unless other[key].nil? + end + end + end + + # Imitate Hash.fetch method in Drop + # + # Returns value if key is present in Drop, otherwise returns default value + # KeyError is raised if key is not present and no default value given + def fetch(key, default = nil, &block) + return self[key] if key?(key) + raise KeyError, %(key not found: "#{key}") if default.nil? && block.nil? + return yield(key) unless block.nil? + return default unless default.nil? + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/excerpt_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/excerpt_drop.rb new file mode 100644 index 000000000000..0362d9304ee0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/excerpt_drop.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class ExcerptDrop < DocumentDrop + def layout + @obj.doc.data["layout"] + end + + def excerpt + nil + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/jekyll_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/jekyll_drop.rb new file mode 100644 index 000000000000..63187cc4dcb0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/jekyll_drop.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class JekyllDrop < Liquid::Drop + class << self + def global + @global ||= JekyllDrop.new + end + end + + def version + Jekyll::VERSION + end + + def environment + Jekyll.env + end + + def to_h + @to_h ||= { + "version" => version, + "environment" => environment, + } + end + + def to_json(state = nil) + JSON.generate(to_h, state) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/site_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/site_drop.rb new file mode 100644 index 000000000000..996126829f98 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/site_drop.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class SiteDrop < Drop + extend Forwardable + + mutable false + + def_delegator :@obj, :site_data, :data + def_delegators :@obj, :time, :pages, :static_files, :tags, :categories + + private def_delegator :@obj, :config, :fallback_data + + def [](key) + if @obj.collections.key?(key) && key != "posts" + @obj.collections[key].docs + else + super(key) + end + end + + def key?(key) + (@obj.collections.key?(key) && key != "posts") || super + end + + def posts + @site_posts ||= @obj.posts.docs.sort { |a, b| b <=> a } + end + + def html_pages + @site_html_pages ||= @obj.pages.select do |page| + page.html? || page.url.end_with?("/") + end + end + + def collections + @site_collections ||= @obj.collections.values.sort_by(&:label).map(&:to_liquid) + end + + # `Site#documents` cannot be memoized so that `Site#docs_to_write` can access the + # latest state of the attribute. + # + # Since this method will be called after `Site#pre_render` hook, + # the `Site#documents` array shouldn't thereafter change and can therefore be + # safely memoized to prevent additional computation of `Site#documents`. + def documents + @documents ||= @obj.documents + end + + # `{{ site.related_posts }}` is how posts can get posts related to + # them, either through LSI if it's enabled, or through the most + # recent posts. + # We should remove this in 4.0 and switch to `{{ post.related_posts }}`. + def related_posts + return nil unless @current_document.is_a?(Jekyll::Document) + @current_document.related_posts + end + attr_writer :current_document + + # return nil for `{{ site.config }}` even if --config was passed via CLI + def config; end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/static_file_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/static_file_drop.rb new file mode 100644 index 000000000000..e76566b054f3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/static_file_drop.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class StaticFileDrop < Drop + extend Forwardable + def_delegators :@obj, :name, :extname, :modified_time, :basename + def_delegator :@obj, :relative_path, :path + def_delegator :@obj, :type, :collection + + private def_delegator :@obj, :data, :fallback_data + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/unified_payload_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/unified_payload_drop.rb new file mode 100644 index 000000000000..52647f98bf66 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/unified_payload_drop.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class UnifiedPayloadDrop < Drop + mutable true + + attr_accessor :page, :layout, :content, :paginator + attr_accessor :highlighter_prefix, :highlighter_suffix + + def jekyll + JekyllDrop.global + end + + def site + @site_drop ||= SiteDrop.new(@obj) + end + + private + def fallback_data + @fallback_data ||= {} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/url_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/url_drop.rb new file mode 100644 index 000000000000..0571558bf4e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/drops/url_drop.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +module Jekyll + module Drops + class UrlDrop < Drop + extend Forwardable + + mutable false + + def_delegator :@obj, :cleaned_relative_path, :path + def_delegator :@obj, :output_ext, :output_ext + + def collection + @obj.collection.label + end + + def name + Utils.slugify(@obj.basename_without_ext) + end + + def title + Utils.slugify(@obj.data["slug"], :mode => "pretty", :cased => true) || + Utils.slugify(@obj.basename_without_ext, :mode => "pretty", :cased => true) + end + + def slug + Utils.slugify(@obj.data["slug"]) || Utils.slugify(@obj.basename_without_ext) + end + + def categories + category_set = Set.new + Array(@obj.data["categories"]).each do |category| + category_set << category.to_s.downcase + end + category_set.to_a.join("/") + end + + def year + @obj.date.strftime("%Y") + end + + def month + @obj.date.strftime("%m") + end + + def day + @obj.date.strftime("%d") + end + + def hour + @obj.date.strftime("%H") + end + + def minute + @obj.date.strftime("%M") + end + + def second + @obj.date.strftime("%S") + end + + def i_day + @obj.date.strftime("%-d") + end + + def i_month + @obj.date.strftime("%-m") + end + + def short_month + @obj.date.strftime("%b") + end + + def short_year + @obj.date.strftime("%y") + end + + def y_day + @obj.date.strftime("%j") + end + + private + def fallback_data + {} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/entry_filter.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/entry_filter.rb new file mode 100644 index 000000000000..91d7961c94b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/entry_filter.rb @@ -0,0 +1,126 @@ +# frozen_string_literal: true + +module Jekyll + class EntryFilter + attr_reader :site + SPECIAL_LEADING_CHARACTERS = [ + ".", "_", "#", "~", + ].freeze + + def initialize(site, base_directory = nil) + @site = site + @base_directory = derive_base_directory( + @site, base_directory.to_s.dup + ) + end + + def base_directory + @base_directory.to_s + end + + def derive_base_directory(site, base_dir) + base_dir[site.source] = "" if base_dir.start_with?(site.source) + base_dir + end + + def relative_to_source(entry) + File.join( + base_directory, entry + ) + end + + def filter(entries) + entries.reject do |e| + # Reject this entry if it is a symlink. + next true if symlink?(e) + # Do not reject this entry if it is included. + next false if included?(e) + # Reject this entry if it is special, a backup file, or excluded. + special?(e) || backup?(e) || excluded?(e) + end + end + + def included?(entry) + glob_include?(site.include, entry) || + glob_include?(site.include, File.basename(entry)) + end + + def special?(entry) + SPECIAL_LEADING_CHARACTERS.include?(entry[0..0]) || + SPECIAL_LEADING_CHARACTERS.include?(File.basename(entry)[0..0]) + end + + def backup?(entry) + entry[-1..-1] == "~" + end + + def excluded?(entry) + glob_include?(site.exclude, relative_to_source(entry)).tap do |excluded| + if excluded + Jekyll.logger.debug( + "EntryFilter:", + "excluded #{relative_to_source(entry)}" + ) + end + end + end + + # -- + # Check if a file is a symlink. + # NOTE: This can be converted to allowing even in safe, + # since we use Pathutil#in_path? now. + # -- + def symlink?(entry) + site.safe && File.symlink?(entry) && symlink_outside_site_source?(entry) + end + + # -- + # NOTE: Pathutil#in_path? gets the realpath. + # @param [<Anything>] entry the entry you want to validate. + # Check if a path is outside of our given root. + # -- + def symlink_outside_site_source?(entry) + !Pathutil.new(entry).in_path?( + site.in_source_dir + ) + end + + # -- + # Check if an entry matches a specific pattern and return true,false. + # Returns true if path matches against any glob pattern. + # -- + def glob_include?(enum, entry) + entry_path = Pathutil.new(site.in_source_dir).join(entry) + enum.any? do |exp| + # Users who send a Regexp knows what they want to + # exclude, so let them send a Regexp to exclude files, + # we will not bother caring if it works or not, it's + # on them at this point. + + if exp.is_a?(Regexp) + entry_path =~ exp + + else + item = Pathutil.new(site.in_source_dir).join(exp) + + # If it's a directory they want to exclude, AKA + # ends with a "/" then we will go on to check and + # see if the entry falls within that path and + # exclude it if that's the case. + + if entry.end_with?("/") + entry_path.in_path?( + item + ) + + else + File.fnmatch?(item, entry_path) || + entry_path.to_path.start_with?( + item + ) + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/errors.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/errors.rb new file mode 100644 index 000000000000..8d659e8d285c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/errors.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Jekyll + module Errors + FatalException = Class.new(::RuntimeError) + + InvalidThemeName = Class.new(FatalException) + + DropMutationException = Class.new(FatalException) + InvalidPermalinkError = Class.new(FatalException) + InvalidYAMLFrontMatterError = Class.new(FatalException) + MissingDependencyException = Class.new(FatalException) + + InvalidDateError = Class.new(FatalException) + InvalidPostNameError = Class.new(FatalException) + PostURLError = Class.new(FatalException) + InvalidURLError = Class.new(FatalException) + InvalidConfigurationError = Class.new(FatalException) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/excerpt.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/excerpt.rb new file mode 100644 index 000000000000..82a43f3a85cf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/excerpt.rb @@ -0,0 +1,190 @@ +# frozen_string_literal: true + +module Jekyll + class Excerpt + extend Forwardable + + attr_accessor :doc + attr_accessor :content, :ext + attr_writer :output + + def_delegators :@doc, :site, :name, :ext, :extname, + :collection, :related_posts, + :coffeescript_file?, :yaml_file?, + :url, :next_doc, :previous_doc + + private :coffeescript_file?, :yaml_file? + + # Initialize this Excerpt instance. + # + # doc - The Document. + # + # Returns the new Excerpt. + def initialize(doc) + self.doc = doc + self.content = extract_excerpt(doc.content) + end + + # Fetch YAML front-matter data from related doc, without layout key + # + # Returns Hash of doc data + def data + @data ||= doc.data.dup + @data.delete("layout") + @data.delete("excerpt") + @data + end + + def trigger_hooks(*); end + + # 'Path' of the excerpt. + # + # Returns the path for the doc this excerpt belongs to with #excerpt appended + def path + File.join(doc.path, "#excerpt") + end + + # 'Relative Path' of the excerpt. + # + # Returns the relative_path for the doc this excerpt belongs to with #excerpt appended + def relative_path + File.join(doc.relative_path, "#excerpt") + end + + # Check if excerpt includes a string + # + # Returns true if the string passed in + def include?(something) + (output && output.include?(something)) || content.include?(something) + end + + # The UID for this doc (useful in feeds). + # e.g. /2008/11/05/my-awesome-doc + # + # Returns the String UID. + def id + "#{doc.id}#excerpt" + end + + def to_s + output || content + end + + def to_liquid + Jekyll::Drops::ExcerptDrop.new(self) + end + + # Returns the shorthand String identifier of this doc. + def inspect + "<Excerpt: #{self.id}>" + end + + def output + @output ||= Renderer.new(doc.site, self, site.site_payload).run + end + + def place_in_layout? + false + end + + def render_with_liquid? + !(coffeescript_file? || yaml_file? || !Utils.has_liquid_construct?(content)) + end + + protected + + # Internal: Extract excerpt from the content + # + # By default excerpt is your first paragraph of a doc: everything before + # the first two new lines: + # + # --- + # title: Example + # --- + # + # First paragraph with [link][1]. + # + # Second paragraph. + # + # [1]: http://example.com/ + # + # This is fairly good option for Markdown and Textile files. But might cause + # problems for HTML docs (which is quite unusual for Jekyll). If default + # excerpt delimiter is not good for you, you might want to set your own via + # configuration option `excerpt_separator`. For example, following is a good + # alternative for HTML docs: + # + # # file: _config.yml + # excerpt_separator: "<!-- more -->" + # + # Notice that all markdown-style link references will be appended to the + # excerpt. So the example doc above will have this excerpt source: + # + # First paragraph with [link][1]. + # + # [1]: http://example.com/ + # + # Excerpts are rendered same time as content is rendered. + # + # Returns excerpt String + + LIQUID_TAG_REGEX = %r!{%-?\s*(\w+)\s*.*?-?%}!m + MKDWN_LINK_REF_REGEX = %r!^ {0,3}\[[^\]]+\]:.+$! + + def extract_excerpt(doc_content) + head, _, tail = doc_content.to_s.partition(doc.excerpt_separator) + + # append appropriate closing tag(s) (for each Liquid block), to the `head` + # if the partitioning resulted in leaving the closing tag somewhere + # in the `tail` partition. + + if head.include?("{%") + modified = false + tag_names = head.scan(LIQUID_TAG_REGEX) + tag_names.flatten! + tag_names.reverse_each do |tag_name| + next unless liquid_block?(tag_name) + next if head =~ endtag_regex_stash(tag_name) + + modified = true + head << "\n{% end#{tag_name} %}" + end + print_build_warning if modified + end + + return head if tail.empty? + + head << "\n\n" << tail.scan(MKDWN_LINK_REF_REGEX).join("\n") + end + + private + + def endtag_regex_stash(tag_name) + @endtag_regex_stash ||= {} + @endtag_regex_stash[tag_name] ||= %r!{%-?\s*end#{tag_name}.*?\s*-?%}!m + end + + def liquid_block?(tag_name) + return false unless tag_name.is_a?(String) + return false unless Liquid::Template.tags[tag_name] + + Liquid::Template.tags[tag_name].ancestors.include?(Liquid::Block) + rescue NoMethodError + Jekyll.logger.error "Error:", + "A Liquid tag in the excerpt of #{doc.relative_path} couldn't be " \ + "parsed." + raise + end + + def print_build_warning + Jekyll.logger.warn "Warning:", "Excerpt modified in #{doc.relative_path}!" + Jekyll.logger.warn "", "Found a Liquid block containing the excerpt separator" \ + " #{doc.excerpt_separator.inspect}. " + Jekyll.logger.warn "", "The block has been modified with the appropriate" \ + " closing tag." + Jekyll.logger.warn "", "Feel free to define a custom excerpt or" \ + " excerpt_separator in the document's front matter" \ + " if the generated excerpt is unsatisfactory." + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/external.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/external.rb new file mode 100644 index 000000000000..0a65dfad058d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/external.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +module Jekyll + module External + class << self + # + # Gems that, if installed, should be loaded. + # Usually contain subcommands. + # + def blessed_gems + %w( + jekyll-docs + jekyll-import + ) + end + + # + # Require a gem or file if it's present, otherwise silently fail. + # + # names - a string gem name or array of gem names + # + def require_if_present(names) + Array(names).each do |name| + begin + require name + rescue LoadError + Jekyll.logger.debug "Couldn't load #{name}. Skipping." + yield(name, version_constraint(name)) if block_given? + false + end + end + end + + # + # The version constraint required to activate a given gem. + # Usually the gem version requirement is "> 0," because any version + # will do. In the case of jekyll-docs, however, we require the exact + # same version as Jekyll. + # + # Returns a String version constraint in a parseable form for + # RubyGems. + def version_constraint(gem_name) + return "= #{Jekyll::VERSION}" if gem_name.to_s.eql?("jekyll-docs") + "> 0" + end + + # + # Require a gem or gems. If it's not present, show a very nice error + # message that explains everything and is much more helpful than the + # normal LoadError. + # + # names - a string gem name or array of gem names + # + def require_with_graceful_fail(names) + Array(names).each do |name| + begin + Jekyll.logger.debug "Requiring:", name.to_s + require name + rescue LoadError => e + Jekyll.logger.error "Dependency Error:", <<-MSG +Yikes! It looks like you don't have #{name} or one of its dependencies installed. +In order to use Jekyll as currently configured, you'll need to install this gem. + +The full error message from Ruby is: '#{e.message}' + +If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/! + MSG + raise Jekyll::Errors::MissingDependencyException, name + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters.rb new file mode 100644 index 000000000000..209a3e0e331d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters.rb @@ -0,0 +1,379 @@ +# frozen_string_literal: true + +require_all "jekyll/filters" + +module Jekyll + module Filters + include URLFilters + include GroupingFilters + include DateFilters + + # Convert a Markdown string into HTML output. + # + # input - The Markdown String to convert. + # + # Returns the HTML formatted String. + def markdownify(input) + @context.registers[:site].find_converter_instance( + Jekyll::Converters::Markdown + ).convert(input.to_s) + end + + # Convert quotes into smart quotes. + # + # input - The String to convert. + # + # Returns the smart-quotified String. + def smartify(input) + @context.registers[:site].find_converter_instance( + Jekyll::Converters::SmartyPants + ).convert(input.to_s) + end + + # Convert a Sass string into CSS output. + # + # input - The Sass String to convert. + # + # Returns the CSS formatted String. + def sassify(input) + @context.registers[:site].find_converter_instance( + Jekyll::Converters::Sass + ).convert(input) + end + + # Convert a Scss string into CSS output. + # + # input - The Scss String to convert. + # + # Returns the CSS formatted String. + def scssify(input) + @context.registers[:site].find_converter_instance( + Jekyll::Converters::Scss + ).convert(input) + end + + # Slugify a filename or title. + # + # input - The filename or title to slugify. + # mode - how string is slugified + # + # Returns the given filename or title as a lowercase URL String. + # See Utils.slugify for more detail. + def slugify(input, mode = nil) + Utils.slugify(input, :mode => mode) + end + + # XML escape a string for use. Replaces any special characters with + # appropriate HTML entity replacements. + # + # input - The String to escape. + # + # Examples + # + # xml_escape('foo "bar" <baz>') + # # => "foo &quot;bar&quot; &lt;baz&gt;" + # + # Returns the escaped String. + def xml_escape(input) + input.to_s.encode(:xml => :attr).gsub(%r!\A"|"\Z!, "") + end + + # CGI escape a string for use in a URL. Replaces any special characters + # with appropriate %XX replacements. + # + # input - The String to escape. + # + # Examples + # + # cgi_escape('foo,bar;baz?') + # # => "foo%2Cbar%3Bbaz%3F" + # + # Returns the escaped String. + def cgi_escape(input) + CGI.escape(input) + end + + # URI escape a string. + # + # input - The String to escape. + # + # Examples + # + # uri_escape('foo, bar \\baz?') + # # => "foo,%20bar%20%5Cbaz?" + # + # Returns the escaped String. + def uri_escape(input) + Addressable::URI.normalize_component(input) + end + + # Replace any whitespace in the input string with a single space + # + # input - The String on which to operate. + # + # Returns the formatted String + def normalize_whitespace(input) + input.to_s.gsub(%r!\s+!, " ").strip + end + + # Count the number of words in the input string. + # + # input - The String on which to operate. + # + # Returns the Integer word count. + def number_of_words(input) + input.split.length + end + + # Join an array of things into a string by separating with commas and the + # word "and" for the last one. + # + # array - The Array of Strings to join. + # connector - Word used to connect the last 2 items in the array + # + # Examples + # + # array_to_sentence_string(["apples", "oranges", "grapes"]) + # # => "apples, oranges, and grapes" + # + # Returns the formatted String. + def array_to_sentence_string(array, connector = "and") + case array.length + when 0 + "" + when 1 + array[0].to_s + when 2 + "#{array[0]} #{connector} #{array[1]}" + else + "#{array[0...-1].join(", ")}, #{connector} #{array[-1]}" + end + end + + # Convert the input into json string + # + # input - The Array or Hash to be converted + # + # Returns the converted json string + def jsonify(input) + as_liquid(input).to_json + end + + # Filter an array of objects + # + # input - the object array + # property - property within each object to filter by + # value - desired value + # + # Returns the filtered array of objects + def where(input, property, value) + return input if property.nil? || value.nil? + return input unless input.respond_to?(:select) + input = input.values if input.is_a?(Hash) + input_id = input.hash + + # implement a hash based on method parameters to cache the end-result + # for given parameters. + @where_filter_cache ||= {} + @where_filter_cache[input_id] ||= {} + @where_filter_cache[input_id][property] ||= {} + + # stash or retrive results to return + @where_filter_cache[input_id][property][value] ||= begin + input.select do |object| + Array(item_property(object, property)).map!(&:to_s).include?(value.to_s) + end || [] + end + end + + # Filters an array of objects against an expression + # + # input - the object array + # variable - the variable to assign each item to in the expression + # expression - a Liquid comparison expression passed in as a string + # + # Returns the filtered array of objects + def where_exp(input, variable, expression) + return input unless input.respond_to?(:select) + input = input.values if input.is_a?(Hash) # FIXME + + condition = parse_condition(expression) + @context.stack do + input.select do |object| + @context[variable] = object + condition.evaluate(@context) + end + end || [] + end + + # Convert the input into integer + # + # input - the object string + # + # Returns the integer value + def to_integer(input) + return 1 if input == true + return 0 if input == false + input.to_i + end + + # Sort an array of objects + # + # input - the object array + # property - property within each object to filter by + # nils ('first' | 'last') - nils appear before or after non-nil values + # + # Returns the filtered array of objects + def sort(input, property = nil, nils = "first") + if input.nil? + raise ArgumentError, "Cannot sort a null object." + end + if property.nil? + input.sort + else + if nils == "first" + order = - 1 + elsif nils == "last" + order = + 1 + else + raise ArgumentError, "Invalid nils order: " \ + "'#{nils}' is not a valid nils order. It must be 'first' or 'last'." + end + + sort_input(input, property, order) + end + end + + def pop(array, num = 1) + return array unless array.is_a?(Array) + num = Liquid::Utils.to_integer(num) + new_ary = array.dup + new_ary.pop(num) + new_ary + end + + def push(array, input) + return array unless array.is_a?(Array) + new_ary = array.dup + new_ary.push(input) + new_ary + end + + def shift(array, num = 1) + return array unless array.is_a?(Array) + num = Liquid::Utils.to_integer(num) + new_ary = array.dup + new_ary.shift(num) + new_ary + end + + def unshift(array, input) + return array unless array.is_a?(Array) + new_ary = array.dup + new_ary.unshift(input) + new_ary + end + + def sample(input, num = 1) + return input unless input.respond_to?(:sample) + num = Liquid::Utils.to_integer(num) rescue 1 + if num == 1 + input.sample + else + input.sample(num) + end + end + + # Convert an object into its String representation for debugging + # + # input - The Object to be converted + # + # Returns a String representation of the object. + def inspect(input) + xml_escape(input.inspect) + end + + private + + # Sort the input Enumerable by the given property. + # If the property doesn't exist, return the sort order respective of + # which item doesn't have the property. + # We also utilize the Schwartzian transform to make this more efficient. + def sort_input(input, property, order) + input.map { |item| [item_property(item, property), item] } + .sort! do |apple_info, orange_info| + apple_property = apple_info.first + orange_property = orange_info.first + + if !apple_property.nil? && orange_property.nil? + - order + elsif apple_property.nil? && !orange_property.nil? + + order + else + apple_property <=> orange_property + end + end + .map!(&:last) + end + + private + def item_property(item, property) + if item.respond_to?(:to_liquid) + property.to_s.split(".").reduce(item.to_liquid) do |subvalue, attribute| + subvalue[attribute] + end + elsif item.respond_to?(:data) + item.data[property.to_s] + else + item[property.to_s] + end + end + + private + def as_liquid(item) + case item + when Hash + pairs = item.map { |k, v| as_liquid([k, v]) } + Hash[pairs] + when Array + item.map { |i| as_liquid(i) } + else + if item.respond_to?(:to_liquid) + liquidated = item.to_liquid + # prevent infinite recursion for simple types (which return `self`) + if liquidated == item + item + else + as_liquid(liquidated) + end + else + item + end + end + end + + # Parse a string to a Liquid Condition + private + def parse_condition(exp) + parser = Liquid::Parser.new(exp) + left_expr = parser.expression + operator = parser.consume?(:comparison) + condition = + if operator + Liquid::Condition.new(Liquid::Expression.parse(left_expr), + operator, + Liquid::Expression.parse(parser.expression)) + else + Liquid::Condition.new(Liquid::Expression.parse(left_expr)) + end + parser.consume(:end_of_string) + + condition + end + + end +end + +Liquid::Template.register_filter( + Jekyll::Filters +) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters/date_filters.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters/date_filters.rb new file mode 100644 index 000000000000..40028c88c777 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters/date_filters.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true + +module Jekyll + module Filters + module DateFilters + # Format a date in short format e.g. "27 Jan 2011". + # Ordinal format is also supported, in both the UK + # (e.g. "27th Jan 2011") and US ("e.g. Jan 27th, 2011") formats. + # UK format is the default. + # + # date - the Time to format. + # type - if "ordinal" the returned String will be in ordinal format + # style - if "US" the returned String will be in US format. + # Otherwise it will be in UK format. + # + # Returns the formatting String. + def date_to_string(date, type = nil, style = nil) + stringify_date(date, "%b", type, style) + end + + # Format a date in long format e.g. "27 January 2011". + # Ordinal format is also supported, in both the UK + # (e.g. "27th January 2011") and US ("e.g. January 27th, 2011") formats. + # UK format is the default. + # + # date - the Time to format. + # type - if "ordinal" the returned String will be in ordinal format + # style - if "US" the returned String will be in US format. + # Otherwise it will be in UK format. + # + # Returns the formatted String. + def date_to_long_string(date, type = nil, style = nil) + stringify_date(date, "%B", type, style) + end + + # Format a date for use in XML. + # + # date - The Time to format. + # + # Examples + # + # date_to_xmlschema(Time.now) + # # => "2011-04-24T20:34:46+08:00" + # + # Returns the formatted String. + def date_to_xmlschema(date) + return date if date.to_s.empty? + time(date).xmlschema + end + + # Format a date according to RFC-822 + # + # date - The Time to format. + # + # Examples + # + # date_to_rfc822(Time.now) + # # => "Sun, 24 Apr 2011 12:34:46 +0000" + # + # Returns the formatted String. + def date_to_rfc822(date) + return date if date.to_s.empty? + time(date).rfc822 + end + + private + # month_type: Notations that evaluate to 'Month' via `Time#strftime` ("%b", "%B") + # type: nil (default) or "ordinal" + # style: nil (default) or "US" + # + # Returns a stringified date or the empty input. + def stringify_date(date, month_type, type = nil, style = nil) + return date if date.to_s.empty? + time = time(date) + if type == "ordinal" + day = time.day + ordinal_day = "#{day}#{ordinal(day)}" + return time.strftime("#{month_type} #{ordinal_day}, %Y") if style == "US" + return time.strftime("#{ordinal_day} #{month_type} %Y") + end + time.strftime("%d #{month_type} %Y") + end + + private + def ordinal(number) + return "th" if (11..13).cover?(number) + + case number % 10 + when 1 then "st" + when 2 then "nd" + when 3 then "rd" + else "th" + end + end + + private + def time(input) + date = Liquid::Utils.to_date(input) + unless date.respond_to?(:to_time) + raise Errors::InvalidDateError, + "Invalid Date: '#{input.inspect}' is not a valid datetime." + end + date.to_time.dup.localtime + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters/grouping_filters.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters/grouping_filters.rb new file mode 100644 index 000000000000..4086bbe9854d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters/grouping_filters.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module Jekyll + module Filters + module GroupingFilters + # Group an array of items by a property + # + # input - the inputted Enumerable + # property - the property + # + # Returns an array of Hashes, each looking something like this: + # {"name" => "larry" + # "items" => [...] } # all the items where `property` == "larry" + def group_by(input, property) + if groupable?(input) + groups = input.group_by { |item| item_property(item, property).to_s } + grouped_array(groups) + else + input + end + end + + # Group an array of items by an expression + # + # input - the object array + # variable - the variable to assign each item to in the expression + # expression -a Liquid comparison expression passed in as a string + # + # Returns the filtered array of objects + def group_by_exp(input, variable, expression) + return input unless groupable?(input) + + parsed_expr = parse_expression(expression) + @context.stack do + groups = input.group_by do |item| + @context[variable] = item + parsed_expr.render(@context) + end + grouped_array(groups) + end + end + + private + def parse_expression(str) + Liquid::Variable.new(str, Liquid::ParseContext.new) + end + + private + def groupable?(element) + element.respond_to?(:group_by) + end + + private + def grouped_array(groups) + groups.each_with_object([]) do |item, array| + array << { + "name" => item.first, + "items" => item.last, + "size" => item.last.size, + } + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters/url_filters.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters/url_filters.rb new file mode 100644 index 000000000000..67abe137caa5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/filters/url_filters.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +module Jekyll + module Filters + module URLFilters + # Produces an absolute URL based on site.url and site.baseurl. + # + # input - the URL to make absolute. + # + # Returns the absolute URL as a String. + def absolute_url(input) + return if input.nil? + input = input.url if input.respond_to?(:url) + return input if Addressable::URI.parse(input.to_s).absolute? + site = @context.registers[:site] + return relative_url(input) if site.config["url"].nil? + Addressable::URI.parse( + site.config["url"].to_s + relative_url(input) + ).normalize.to_s + end + + # Produces a URL relative to the domain root based on site.baseurl + # unless it is already an absolute url with an authority (host). + # + # input - the URL to make relative to the domain root + # + # Returns a URL relative to the domain root as a String. + def relative_url(input) + return if input.nil? + input = input.url if input.respond_to?(:url) + return input if Addressable::URI.parse(input.to_s).absolute? + + parts = [sanitized_baseurl, input] + Addressable::URI.parse( + parts.compact.map { |part| ensure_leading_slash(part.to_s) }.join + ).normalize.to_s + end + + # Strips trailing `/index.html` from URLs to create pretty permalinks + # + # input - the URL with a possible `/index.html` + # + # Returns a URL with the trailing `/index.html` removed + def strip_index(input) + return if input.nil? || input.to_s.empty? + input.sub(%r!/index\.html?$!, "/") + end + + private + + def sanitized_baseurl + site = @context.registers[:site] + site.config["baseurl"].to_s.chomp("/") + end + + def ensure_leading_slash(input) + return input if input.nil? || input.empty? || input.start_with?("/") + "/#{input}" + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/frontmatter_defaults.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/frontmatter_defaults.rb new file mode 100644 index 000000000000..7d96b8cade7b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/frontmatter_defaults.rb @@ -0,0 +1,229 @@ +# frozen_string_literal: true + +module Jekyll + # This class handles custom defaults for YAML frontmatter settings. + # These are set in _config.yml and apply both to internal use (e.g. layout) + # and the data available to liquid. + # + # It is exposed via the frontmatter_defaults method on the site class. + class FrontmatterDefaults + # Initializes a new instance. + def initialize(site) + @site = site + end + + def update_deprecated_types(set) + return set unless set.key?("scope") && set["scope"].key?("type") + + set["scope"]["type"] = + case set["scope"]["type"] + when "page" + Deprecator.defaults_deprecate_type("page", "pages") + "pages" + when "post" + Deprecator.defaults_deprecate_type("post", "posts") + "posts" + when "draft" + Deprecator.defaults_deprecate_type("draft", "drafts") + "drafts" + else + set["scope"]["type"] + end + + set + end + + def ensure_time!(set) + return set unless set.key?("values") && set["values"].key?("date") + return set if set["values"]["date"].is_a?(Time) + set["values"]["date"] = Utils.parse_date( + set["values"]["date"], + "An invalid date format was found in a front-matter default set: #{set}" + ) + set + end + + # Finds a default value for a given setting, filtered by path and type + # + # path - the path (relative to the source) of the page, + # post or :draft the default is used in + # type - a symbol indicating whether a :page, + # a :post or a :draft calls this method + # + # Returns the default value or nil if none was found + def find(path, type, setting) + value = nil + old_scope = nil + + matching_sets(path, type).each do |set| + if set["values"].key?(setting) && has_precedence?(old_scope, set["scope"]) + value = set["values"][setting] + old_scope = set["scope"] + end + end + value + end + + # Collects a hash with all default values for a page or post + # + # path - the relative path of the page or post + # type - a symbol indicating the type (:post, :page or :draft) + # + # Returns a hash with all default values (an empty hash if there are none) + def all(path, type) + defaults = {} + old_scope = nil + matching_sets(path, type).each do |set| + if has_precedence?(old_scope, set["scope"]) + defaults = Utils.deep_merge_hashes(defaults, set["values"]) + old_scope = set["scope"] + else + defaults = Utils.deep_merge_hashes(set["values"], defaults) + end + end + defaults + end + + private + + # Checks if a given default setting scope matches the given path and type + # + # scope - the hash indicating the scope, as defined in _config.yml + # path - the path to check for + # type - the type (:post, :page or :draft) to check for + # + # Returns true if the scope applies to the given path and type + def applies?(scope, path, type) + applies_path?(scope, path) && applies_type?(scope, type) + end + + # rubocop:disable Metrics/AbcSize + def applies_path?(scope, path) + return true if !scope.key?("path") || scope["path"].empty? + + sanitized_path = Pathname.new(sanitize_path(path)) + site_path = Pathname.new(@site.source) + rel_scope_path = Pathname.new(scope["path"]) + abs_scope_path = File.join(@site.source, rel_scope_path) + + if scope["path"].to_s.include?("*") + Dir.glob(abs_scope_path).each do |scope_path| + scope_path = Pathname.new(scope_path).relative_path_from(site_path) + scope_path = strip_collections_dir(scope_path) + Jekyll.logger.debug "Globbed Scope Path:", scope_path + return true if path_is_subpath?(sanitized_path, scope_path) + end + false + else + path_is_subpath?(sanitized_path, strip_collections_dir(rel_scope_path)) + end + end + # rubocop:enable Metrics/AbcSize + + def path_is_subpath?(path, parent_path) + path.ascend do |ascended_path| + if ascended_path.to_s == parent_path.to_s + return true + end + end + + false + end + + def strip_collections_dir(path) + collections_dir = @site.config["collections_dir"] + slashed_coll_dir = "#{collections_dir}/" + return path if collections_dir.empty? || !path.to_s.start_with?(slashed_coll_dir) + path.sub(slashed_coll_dir, "") + end + + # Determines whether the scope applies to type. + # The scope applies to the type if: + # 1. no 'type' is specified + # 2. the 'type' in the scope is the same as the type asked about + # + # scope - the Hash defaults set being asked about application + # type - the type of the document being processed / asked about + # its defaults. + # + # Returns true if either of the above conditions are satisfied, + # otherwise returns false + def applies_type?(scope, type) + !scope.key?("type") || scope["type"].eql?(type.to_s) + end + + # Checks if a given set of default values is valid + # + # set - the default value hash, as defined in _config.yml + # + # Returns true if the set is valid and can be used in this class + def valid?(set) + set.is_a?(Hash) && set["values"].is_a?(Hash) + end + + # Determines if a new scope has precedence over an old one + # + # old_scope - the old scope hash, or nil if there's none + # new_scope - the new scope hash + # + # Returns true if the new scope has precedence over the older + # rubocop: disable PredicateName + def has_precedence?(old_scope, new_scope) + return true if old_scope.nil? + + new_path = sanitize_path(new_scope["path"]) + old_path = sanitize_path(old_scope["path"]) + + if new_path.length != old_path.length + new_path.length >= old_path.length + elsif new_scope.key?("type") + true + else + !old_scope.key? "type" + end + end + # rubocop: enable PredicateName + + # Collects a list of sets that match the given path and type + # + # Returns an array of hashes + def matching_sets(path, type) + valid_sets.select do |set| + !set.key?("scope") || applies?(set["scope"], path, type) + end + end + + # Returns a list of valid sets + # + # This is not cached to allow plugins to modify the configuration + # and have their changes take effect + # + # Returns an array of hashes + def valid_sets + sets = @site.config["defaults"] + return [] unless sets.is_a?(Array) + + sets.map do |set| + if valid?(set) + ensure_time!(update_deprecated_types(set)) + else + Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:" + Jekyll.logger.warn set.to_s + nil + end + end.compact + end + + # Sanitizes the given path by removing a leading and adding a trailing slash + + SANITIZATION_REGEX = %r!\A/|(?<=[^/])\z! + + def sanitize_path(path) + if path.nil? || path.empty? + "" + else + path.gsub(SANITIZATION_REGEX, "") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/generator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/generator.rb new file mode 100644 index 000000000000..649715f840c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/generator.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Jekyll + Generator = Class.new(Plugin) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/hooks.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/hooks.rb new file mode 100644 index 000000000000..64496b53119c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/hooks.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true + +module Jekyll + module Hooks + DEFAULT_PRIORITY = 20 + + # compatibility layer for octopress-hooks users + PRIORITY_MAP = { + :low => 10, + :normal => 20, + :high => 30, + }.freeze + + # initial empty hooks + @registry = { + :site => { + :after_init => [], + :after_reset => [], + :post_read => [], + :pre_render => [], + :post_render => [], + :post_write => [], + }, + :pages => { + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], + }, + :posts => { + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], + }, + :documents => { + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], + }, + :clean => { + :on_obsolete => [], + }, + } + + # map of all hooks and their priorities + @hook_priority = {} + + NotAvailable = Class.new(RuntimeError) + Uncallable = Class.new(RuntimeError) + + # register hook(s) to be called later, public API + def self.register(owners, event, priority: DEFAULT_PRIORITY, &block) + Array(owners).each do |owner| + register_one(owner, event, priority_value(priority), &block) + end + end + + # Ensure the priority is a Fixnum + def self.priority_value(priority) + return priority if priority.is_a?(Integer) + PRIORITY_MAP[priority] || DEFAULT_PRIORITY + end + + # register a single hook to be called later, internal API + def self.register_one(owner, event, priority, &block) + @registry[owner] ||= { + :post_init => [], + :pre_render => [], + :post_render => [], + :post_write => [], + } + + unless @registry[owner][event] + raise NotAvailable, "Invalid hook. #{owner} supports only the " \ + "following hooks #{@registry[owner].keys.inspect}" + end + + unless block.respond_to? :call + raise Uncallable, "Hooks must respond to :call" + end + + insert_hook owner, event, priority, &block + end + + def self.insert_hook(owner, event, priority, &block) + @hook_priority[block] = [-priority, @hook_priority.size] + @registry[owner][event] << block + end + + # interface for Jekyll core components to trigger hooks + def self.trigger(owner, event, *args) + # proceed only if there are hooks to call + return unless @registry[owner] + return unless @registry[owner][event] + + # hooks to call for this owner and event + hooks = @registry[owner][event] + + # sort and call hooks according to priority and load order + hooks.sort_by { |h| @hook_priority[h] }.each do |hook| + hook.call(*args) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/layout.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/layout.rb new file mode 100644 index 000000000000..f62fec08be25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/layout.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module Jekyll + class Layout + include Convertible + + # Gets the Site object. + attr_reader :site + + # Gets the name of this layout. + attr_reader :name + + # Gets the path to this layout. + attr_reader :path + + # Gets the path to this layout relative to its base + attr_reader :relative_path + + # Gets/Sets the extension of this layout. + attr_accessor :ext + + # Gets/Sets the Hash that holds the metadata for this layout. + attr_accessor :data + + # Gets/Sets the content of this layout. + attr_accessor :content + + # Initialize a new Layout. + # + # site - The Site. + # base - The String path to the source. + # name - The String filename of the post file. + def initialize(site, base, name) + @site = site + @base = base + @name = name + + if site.theme && site.theme.layouts_path.eql?(base) + @base_dir = site.theme.root + @path = site.in_theme_dir(base, name) + else + @base_dir = site.source + @path = site.in_source_dir(base, name) + end + @relative_path = @path.sub(@base_dir, "") + + self.data = {} + + process(name) + read_yaml(base, name) + end + + # Extract information from the layout filename. + # + # name - The String filename of the layout file. + # + # Returns nothing. + def process(name) + self.ext = File.extname(name) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_extensions.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_extensions.rb new file mode 100644 index 000000000000..4551ac19bbd0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_extensions.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Jekyll + module LiquidExtensions + + # Lookup a Liquid variable in the given context. + # + # context - the Liquid context in question. + # variable - the variable name, as a string. + # + # Returns the value of the variable in the context + # or the variable name if not found. + def lookup_variable(context, variable) + lookup = context + + variable.split(".").each do |value| + lookup = lookup[value] + end + + lookup || variable + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_renderer.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_renderer.rb new file mode 100644 index 000000000000..39bc639ff9ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_renderer.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +require_relative "liquid_renderer/file" +require_relative "liquid_renderer/table" + +module Jekyll + class LiquidRenderer + extend Forwardable + + private def_delegator :@site, :in_source_dir, :source_dir + private def_delegator :@site, :in_theme_dir, :theme_dir + + def initialize(site) + @site = site + Liquid::Template.error_mode = @site.config["liquid"]["error_mode"].to_sym + reset + end + + def reset + @stats = {} + end + + def file(filename) + filename.match(filename_regex) + filename = + if Regexp.last_match(1) == theme_dir("") + ::File.join(::File.basename(Regexp.last_match(1)), Regexp.last_match(2)) + else + Regexp.last_match(2) + end + LiquidRenderer::File.new(self, filename).tap do + @stats[filename] ||= new_profile_hash + @stats[filename][:count] += 1 + end + end + + def increment_bytes(filename, bytes) + @stats[filename][:bytes] += bytes + end + + def increment_time(filename, time) + @stats[filename][:time] += time + end + + def stats_table(num_of_rows = 50) + LiquidRenderer::Table.new(@stats).to_s(num_of_rows) + end + + def self.format_error(error, path) + "#{error.message} in #{path}" + end + + private + + def filename_regex + @filename_regex ||= begin + %r!\A(#{Regexp.escape(source_dir)}/|#{Regexp.escape(theme_dir.to_s)}/|/*)(.*)!i + end + end + + def new_profile_hash + Hash.new { |hash, key| hash[key] = 0 } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_renderer/file.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_renderer/file.rb new file mode 100644 index 000000000000..574bbd313006 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_renderer/file.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module Jekyll + class LiquidRenderer + class File + def initialize(renderer, filename) + @renderer = renderer + @filename = filename + end + + def parse(content) + measure_time do + @template = Liquid::Template.parse(content, :line_numbers => true) + end + + self + end + + def render(*args) + measure_time do + measure_bytes do + @template.render(*args) + end + end + end + + def render!(*args) + measure_time do + measure_bytes do + @template.render!(*args) + end + end + end + + def warnings + @template.warnings + end + + private + + def measure_bytes + yield.tap do |str| + @renderer.increment_bytes(@filename, str.bytesize) + end + end + + def measure_time + before = Time.now + yield + ensure + after = Time.now + @renderer.increment_time(@filename, after - before) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_renderer/table.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_renderer/table.rb new file mode 100644 index 000000000000..b2d91fecd6fe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/liquid_renderer/table.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +module Jekyll + class LiquidRenderer::Table + def initialize(stats) + @stats = stats + end + + def to_s(num_of_rows = 50) + data = data_for_table(num_of_rows) + widths = table_widths(data) + generate_table(data, widths) + end + + private + + def generate_table(data, widths) + str = String.new("\n") + + table_head = data.shift + str << generate_row(table_head, widths) + str << generate_table_head_border(table_head, widths) + + data.each do |row_data| + str << generate_row(row_data, widths) + end + + str << "\n" + str + end + + def generate_table_head_border(row_data, widths) + str = String.new("") + + row_data.each_index do |cell_index| + str << "-" * widths[cell_index] + str << "-+-" unless cell_index == row_data.length - 1 + end + + str << "\n" + str + end + + def generate_row(row_data, widths) + str = String.new("") + + row_data.each_with_index do |cell_data, cell_index| + str << if cell_index.zero? + cell_data.ljust(widths[cell_index], " ") + else + cell_data.rjust(widths[cell_index], " ") + end + + str << " | " unless cell_index == row_data.length - 1 + end + + str << "\n" + str + end + + def table_widths(data) + widths = [] + + data.each do |row| + row.each_with_index do |cell, index| + widths[index] = [cell.length, widths[index]].compact.max + end + end + + widths + end + + def data_for_table(num_of_rows) + sorted = @stats.sort_by { |_, file_stats| -file_stats[:time] } + sorted = sorted.slice(0, num_of_rows) + + table = [%w(Filename Count Bytes Time)] + + sorted.each do |filename, file_stats| + row = [] + row << filename + row << file_stats[:count].to_s + row << format_bytes(file_stats[:bytes]) + row << format("%.3f", file_stats[:time]) + table << row + end + + table + end + + def format_bytes(bytes) + bytes /= 1024.0 + format("%.2fK", bytes) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/log_adapter.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/log_adapter.rb new file mode 100644 index 000000000000..65b8f9deb7b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/log_adapter.rb @@ -0,0 +1,147 @@ +# frozen_string_literal: true + +module Jekyll + class LogAdapter + attr_reader :writer, :messages, :level + + LOG_LEVELS = { + :debug => ::Logger::DEBUG, + :info => ::Logger::INFO, + :warn => ::Logger::WARN, + :error => ::Logger::ERROR, + }.freeze + + # Public: Create a new instance of a log writer + # + # writer - Logger compatible instance + # log_level - (optional, symbol) the log level + # + # Returns nothing + def initialize(writer, level = :info) + @messages = [] + @writer = writer + self.log_level = level + end + + # Public: Set the log level on the writer + # + # level - (symbol) the log level + # + # Returns nothing + def log_level=(level) + writer.level = LOG_LEVELS.fetch(level) + @level = level + end + + def adjust_verbosity(options = {}) + # Quiet always wins. + if options[:quiet] + self.log_level = :error + elsif options[:verbose] + self.log_level = :debug + end + debug "Logging at level:", LOG_LEVELS.key(writer.level).to_s + end + + # Public: Print a debug message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def debug(topic, message = nil, &block) + write(:debug, topic, message, &block) + end + + # Public: Print a message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def info(topic, message = nil, &block) + write(:info, topic, message, &block) + end + + # Public: Print a message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def warn(topic, message = nil, &block) + write(:warn, topic, message, &block) + end + + # Public: Print an error message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def error(topic, message = nil, &block) + write(:error, topic, message, &block) + end + + # Public: Print an error message and immediately abort the process + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail (can be omitted) + # + # Returns nothing + def abort_with(topic, message = nil, &block) + error(topic, message, &block) + abort + end + + # Internal: Build a topic method + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns the formatted message + def message(topic, message = nil) + raise ArgumentError, "block or message, not both" if block_given? && message + + message = yield if block_given? + message = message.to_s.gsub(%r!\s+!, " ") + topic = formatted_topic(topic, block_given?) + out = topic + message + messages << out + out + end + + # Internal: Format the topic + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # colon - + # + # Returns the formatted topic statement + def formatted_topic(topic, colon = false) + "#{topic}#{colon ? ": " : " "}".rjust(20) + end + + # Internal: Check if the message should be written given the log level. + # + # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error + # + # Returns whether the message should be written. + def write_message?(level_of_message) + LOG_LEVELS.fetch(level) <= LOG_LEVELS.fetch(level_of_message) + end + + # Internal: Log a message. + # + # level_of_message - the Symbol level of message, one of :debug, :info, :warn, :error + # topic - the String topic or full message + # message - the String message (optional) + # block - a block containing the message (optional) + # + # Returns false if the message was not written, otherwise returns the value of calling + # the appropriate writer method, e.g. writer.info. + def write(level_of_message, topic, message = nil, &block) + return false unless write_message?(level_of_message) + writer.public_send(level_of_message, message(topic, message, &block)) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/mime.types b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/mime.types new file mode 100644 index 000000000000..af68d359e112 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/mime.types @@ -0,0 +1,825 @@ +# Woah there. Do not edit this file directly. +# This file is generated automatically by script/vendor-mimes. + +application/andrew-inset ez +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +application/atomsvc+xml atomsvc +application/bdoc bdoc +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +application/cu-seeme cu +application/dash+xml mpd +application/davmount+xml davmount +application/docbook+xml dbk +application/dssc+der dssc +application/dssc+xml xdssc +application/ecmascript ecma +application/emma+xml emma +application/epub+zip epub +application/exi exi +application/font-tdpfr pfr +application/font-woff woff +application/font-woff2 woff2 +application/geo+json geojson +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +application/gzip gz +application/hyperstudio stk +application/inkml+xml ink inkml +application/ipfix ipfix +application/java-archive jar war ear +application/java-serialized-object ser +application/java-vm class +application/javascript js mjs +application/json json map +application/json5 json5 +application/jsonml+json jsonml +application/ld+json jsonld +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/mads+xml mads +application/manifest+json webmanifest +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +application/mathml+xml mathml +application/mbox mbox +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +application/mods+xml mods +application/mp21 m21 mp21 +application/mp4 mp4s m4p +application/msword doc dot +application/mxf mxf +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy exe dll deb dmg iso img msi msp msm buffer +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +application/pgp-signature asc sig +application/pics-rules prf +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +application/postscript ai eps ps +application/prs.cww cww +application/pskc+xml pskcxml +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +application/set-payment-initiation setpay +application/set-registration-initiation setreg +application/shf+xml shf +application/smil+xml smi smil +application/sparql-query rq +application/sparql-results+xml srx +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +application/tei+xml tei teicorpus +application/thraud+xml tfi +application/timestamped-data tsd +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +application/vnd.apple.pkpass pkpass +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +application/vnd.blueice.multipass mpm +application/vnd.bmi bmi +application/vnd.businessobjects rep +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +application/vnd.cups-ppd ppd +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +application/vnd.dna dna +application/vnd.dolby.mlp mlp +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +application/vnd.dvb.service svc +application/vnd.dynageo geo +application/vnd.ecowin.chart mag +application/vnd.enliven nml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +application/vnd.eszigno3+xml es3 et3 +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +application/vnd.gmx gmx +application/vnd.google-apps.document gdoc +application/vnd.google-apps.presentation gslides +application/vnd.google-apps.spreadsheet gsheet +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +application/vnd.hydrostatix.sof-data sfd-hdstx +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +application/vnd.ms-cab-compressed cab +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +application/vnd.ms-officetheme thmx +application/vnd.ms-outlook msg +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +application/vnd.ms-project mpp mpt +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.olpc-sugar xo +application/vnd.oma.dd2+xml dd2 +application/vnd.openofficeorg.extension oxt +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +application/vnd.openxmlformats-officedocument.presentationml.template potx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +application/vnd.osgeo.mapguide.package mgp +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +application/vnd.palm pdb pqa oprc +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +application/vnd.picsel efif +application/vnd.pmi.widget wg +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +application/vnd.sailingtracker.track st +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +application/vnd.smart.teacher teacher +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +application/vnd.sun.wadl+xml wadl +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.sus-calendar sus susp +application/vnd.svd svd +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +application/vnd.vcx vcx +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +application/vnd.vsf vsf +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +application/vnd.wt.stf stf +application/vnd.xara xar +application/vnd.xfdl xfdl +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +application/widget wgt +application/winhlp hlp +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +application/x-arj arj +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-chrome-extension crx +application/x-cocoa cco +application/x-conference nsc +application/x-cpio cpio +application/x-csh csh +application/x-debian-package udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +application/x-font-ghostscript gsf +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +application/x-hdf hdf +application/x-httpd-php php +application/x-install-instructions install +application/x-java-archive-diff jardiff +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lua-bytecode luac +application/x-lzh-compressed lzh lha +application/x-makeself run +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload com bat +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-ns-proxy-autoconfig pac +application/x-nzb nzb +application/x-perl pl pm +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-redhat-package-manager rpm +application/x-research-info-systems ris +application/x-sea sea +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl tk +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-virtualbox-hdd hdd +application/x-virtualbox-ova ova +application/x-virtualbox-ovf ovf +application/x-virtualbox-vbox vbox +application/x-virtualbox-vbox-extpack vbox-extpack +application/x-virtualbox-vdi vdi +application/x-virtualbox-vhd vhd +application/x-virtualbox-vmdk vmdk +application/x-wais-source src +application/x-web-app-manifest+json webapp +application/x-x509-ca-cert der crt pem +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +application/xaml+xml xaml +application/xcap-diff+xml xdf +application/xenc+xml xenc +application/xhtml+xml xhtml xht +application/xml xml xsl xsd rng +application/xml-dtd dtd +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +audio/3gpp 3gpp +audio/adpcm adp +audio/basic au snd +audio/midi mid midi kar rmi +audio/mp3 mp3 +audio/mp4 m4a mp4a +audio/mpeg mpga mp2 mp2a m2a m3a +audio/ogg oga ogg spx +audio/s3m s3m +audio/silk sil +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +audio/vnd.rip rip +audio/wav wav +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +chemical/x-xyz xyz +image/apng apng +image/bmp bmp +image/cgm cgm +image/g3fax g3 +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/ktx ktx +image/png png +image/prs.btif btif +image/sgi sgi +image/svg+xml svg svgz +image/tiff tiff tif +image/vnd.adobe.photoshop psd +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.djvu djvu djv +image/vnd.dvb.subtitle sub +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/webp webp +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-jng jng +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/rfc822 eml mime +model/gltf+json gltf +model/gltf-binary glb +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +model/vnd.gdl gdl +model/vnd.gtw gtw +model/vnd.mts mts +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +text/cache-manifest appcache manifest +text/calendar ics ifb +text/coffeescript coffee litcoffee +text/css css +text/csv csv +text/hjson hjson +text/html html htm shtml +text/jade jade +text/jsx jsx +text/less less +text/markdown markdown md +text/mathml mml +text/n3 n3 +text/plain txt text conf def list log in ini +text/prs.lines.tag dsc +text/richtext rtx +text/sgml sgml sgm +text/slim slim slm +text/stylus stylus styl +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +text/uri-list uri uris urls +text/vcard vcard +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.mcurl mcurl +text/vnd.curl.scurl scurl +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +text/vnd.sun.j2me.app-descriptor jad +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/vtt vtt +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-component htc +text/x-fortran f for f77 f90 +text/x-handlebars-template hbs +text/x-java-source java +text/x-lua lua +text/x-markdown mkd +text/x-nfo nfo +text/x-opml opml +text/x-pascal p pas +text/x-processing pde +text/x-sass sass +text/x-scss scss +text/x-setext etx +text/x-sfv sfv +text/x-suse-ymp ymp +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +text/yaml yaml yml +video/3gpp 3gp +video/3gpp2 3g2 +video/h261 h261 +video/h263 h263 +video/h264 h264 +video/jpeg jpgv +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +video/mp2t ts +video/mp4 mp4 mp4v mpg4 +video/mpeg mpeg mpg mpe m1v m2v +video/ogg ogv +video/quicktime qt mov +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +video/vnd.dvb.file dvb +video/vnd.fvt fvt +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/page.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/page.rb new file mode 100644 index 000000000000..caea9cd924e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/page.rb @@ -0,0 +1,187 @@ +# frozen_string_literal: true + +module Jekyll + class Page + include Convertible + + attr_writer :dir + attr_accessor :site, :pager + attr_accessor :name, :ext, :basename + attr_accessor :data, :content, :output + + alias_method :extname, :ext + + FORWARD_SLASH = "/".freeze + + # Attributes for Liquid templates + ATTRIBUTES_FOR_LIQUID = %w( + content + dir + name + path + url + ).freeze + + # A set of extensions that are considered HTML or HTML-like so we + # should not alter them, this includes .xhtml through XHTM5. + + HTML_EXTENSIONS = %w( + .html + .xhtml + .htm + ).freeze + + # Initialize a new Page. + # + # site - The Site object. + # base - The String path to the source. + # dir - The String path between the source and the file. + # name - The String filename of the file. + def initialize(site, base, dir, name) + @site = site + @base = base + @dir = dir + @name = name + @path = if site.in_theme_dir(base) == base # we're in a theme + site.in_theme_dir(base, dir, name) + else + site.in_source_dir(base, dir, name) + end + + process(name) + read_yaml(File.join(base, dir), name) + + data.default_proc = proc do |_, key| + site.frontmatter_defaults.find(File.join(dir, name), type, key) + end + + Jekyll::Hooks.trigger :pages, :post_init, self + end + + # The generated directory into which the page will be placed + # upon generation. This is derived from the permalink or, if + # permalink is absent, will be '/' + # + # Returns the String destination directory. + def dir + if url.end_with?(FORWARD_SLASH) + url + else + url_dir = File.dirname(url) + url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/" + end + end + + # The full path and filename of the post. Defined in the YAML of the post + # body. + # + # Returns the String permalink or nil if none has been set. + def permalink + data.nil? ? nil : data["permalink"] + end + + # The template of the permalink. + # + # Returns the template String. + def template + if !html? + "/:path/:basename:output_ext" + elsif index? + "/:path/" + else + Utils.add_permalink_suffix("/:path/:basename", site.permalink_style) + end + end + + # The generated relative url of this page. e.g. /about.html. + # + # Returns the String url. + def url + @url ||= URL.new({ + :template => template, + :placeholders => url_placeholders, + :permalink => permalink, + }).to_s + end + + # Returns a hash of URL placeholder names (as symbols) mapping to the + # desired placeholder replacements. For details see "url.rb" + def url_placeholders + { + :path => @dir, + :basename => basename, + :output_ext => output_ext, + } + end + + # Extract information from the page filename. + # + # name - The String filename of the page file. + # + # Returns nothing. + def process(name) + self.ext = File.extname(name) + self.basename = name[0..-ext.length - 1] + end + + # Add any necessary layouts to this post + # + # layouts - The Hash of {"name" => "layout"}. + # site_payload - The site payload Hash. + # + # Returns String rendered page. + def render(layouts, site_payload) + site_payload["page"] = to_liquid + site_payload["paginator"] = pager.to_liquid + + do_layout(site_payload, layouts) + end + + # The path to the source file + # + # Returns the path to the source file + def path + data.fetch("path") { relative_path } + end + + # The path to the page source file, relative to the site source + def relative_path + File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r!\A\/!, "") + end + + # Obtain destination path. + # + # dest - The String path to the destination dir. + # + # Returns the destination file path String. + def destination(dest) + path = site.in_dest_dir(dest, URL.unescape_path(url)) + path = File.join(path, "index") if url.end_with?("/") + path << output_ext unless path.end_with? output_ext + path + end + + # Returns the object as a debug String. + def inspect + "#<Jekyll::Page @name=#{name.inspect}>" + end + + # Returns the Boolean of whether this Page is HTML or not. + def html? + HTML_EXTENSIONS.include?(output_ext) + end + + # Returns the Boolean of whether this Page is an index file or not. + def index? + basename == "index" + end + + def trigger_hooks(hook_name, *args) + Jekyll::Hooks.trigger :pages, hook_name, self, *args + end + + def write? + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/page_without_a_file.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/page_without_a_file.rb new file mode 100644 index 000000000000..2d30af51116c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/page_without_a_file.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Jekyll + # A Jekyll::Page subclass to handle processing files without reading it to + # determine the page-data and page-content based on Front Matter delimiters. + # + # The class instance is basically just a bare-bones entity with just + # attributes "dir", "name", "path", "url" defined on it. + class PageWithoutAFile < Page + def read_yaml(*) + @data ||= {} + end + + def inspect + "#<Jekyll:PageWithoutAFile @name=#{name.inspect}>" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/plugin.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/plugin.rb new file mode 100644 index 000000000000..2a9dbeed41b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/plugin.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: true + +module Jekyll + class Plugin + PRIORITIES = { + :low => -10, + :highest => 100, + :lowest => -100, + :normal => 0, + :high => 10, + }.freeze + + # + + def self.inherited(const) + return catch_inheritance(const) do |const_| + catch_inheritance(const_) + end + end + + # + + def self.catch_inheritance(const) + const.define_singleton_method :inherited do |const_| + (@children ||= Set.new).add const_ + if block_given? + yield const_ + end + end + end + + # + + def self.descendants + @children ||= Set.new + out = @children.map(&:descendants) + out << self unless superclass == Plugin + Set.new(out).flatten + end + + # Get or set the priority of this plugin. When called without an + # argument it returns the priority. When an argument is given, it will + # set the priority. + # + # priority - The Symbol priority (default: nil). Valid options are: + # :lowest, :low, :normal, :high, :highest + # + # Returns the Symbol priority. + def self.priority(priority = nil) + @priority ||= nil + if priority && PRIORITIES.key?(priority) + @priority = priority + end + @priority || :normal + end + + # Get or set the safety of this plugin. When called without an argument + # it returns the safety. When an argument is given, it will set the + # safety. + # + # safe - The Boolean safety (default: nil). + # + # Returns the safety Boolean. + def self.safe(safe = nil) + unless defined?(@safe) && safe.nil? + @safe = safe + end + @safe || false + end + + # Spaceship is priority [higher -> lower] + # + # other - The class to be compared. + # + # Returns -1, 0, 1. + def self.<=>(other) + PRIORITIES[other.priority] <=> PRIORITIES[self.priority] + end + + # Spaceship is priority [higher -> lower] + # + # other - The class to be compared. + # + # Returns -1, 0, 1. + def <=>(other) + self.class <=> other.class + end + + # Initialize a new plugin. This should be overridden by the subclass. + # + # config - The Hash of configuration options. + # + # Returns a new instance. + def initialize(config = {}) + # no-op for default + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/plugin_manager.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/plugin_manager.rb new file mode 100644 index 000000000000..f53d187a337f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/plugin_manager.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +module Jekyll + class PluginManager + attr_reader :site + + # Create an instance of this class. + # + # site - the instance of Jekyll::Site we're concerned with + # + # Returns nothing + def initialize(site) + @site = site + end + + # Require all the plugins which are allowed. + # + # Returns nothing + def conscientious_require + require_theme_deps if site.theme + require_plugin_files + require_gems + deprecation_checks + end + + # Require each of the gem plugins specified. + # + # Returns nothing. + def require_gems + Jekyll::External.require_with_graceful_fail( + site.gems.select { |plugin| plugin_allowed?(plugin) } + ) + end + + # Require each of the runtime_dependencies specified by the theme's gemspec. + # + # Returns false only if no dependencies have been specified, otherwise nothing. + def require_theme_deps + return false unless site.theme.runtime_dependencies + site.theme.runtime_dependencies.each do |dep| + next if dep.name == "jekyll" + External.require_with_graceful_fail(dep.name) if plugin_allowed?(dep.name) + end + end + + def self.require_from_bundler + if !ENV["JEKYLL_NO_BUNDLER_REQUIRE"] && File.file?("Gemfile") + require "bundler" + + Bundler.setup + required_gems = Bundler.require(:jekyll_plugins) + message = "Required #{required_gems.map(&:name).join(", ")}" + Jekyll.logger.debug("PluginManager:", message) + ENV["JEKYLL_NO_BUNDLER_REQUIRE"] = "true" + + true + else + false + end + end + + # Check whether a gem plugin is allowed to be used during this build. + # + # plugin_name - the name of the plugin + # + # Returns true if the plugin name is in the whitelist or if the site is not + # in safe mode. + def plugin_allowed?(plugin_name) + !site.safe || whitelist.include?(plugin_name) + end + + # Build an array of allowed plugin gem names. + # + # Returns an array of strings, each string being the name of a gem name + # that is allowed to be used. + def whitelist + @whitelist ||= Array[site.config["whitelist"]].flatten + end + + # Require all .rb files if safe mode is off + # + # Returns nothing. + def require_plugin_files + unless site.safe + plugins_path.each do |plugin_search_path| + plugin_files = Utils.safe_glob(plugin_search_path, File.join("**", "*.rb")) + Jekyll::External.require_with_graceful_fail(plugin_files) + end + end + end + + # Public: Setup the plugin search path + # + # Returns an Array of plugin search paths + def plugins_path + if site.config["plugins_dir"].eql? Jekyll::Configuration::DEFAULTS["plugins_dir"] + [site.in_source_dir(site.config["plugins_dir"])] + else + Array(site.config["plugins_dir"]).map { |d| File.expand_path(d) } + end + end + + def deprecation_checks + pagination_included = (site.config["plugins"] || []).include?("jekyll-paginate") || + defined?(Jekyll::Paginate) + if site.config["paginate"] && !pagination_included + Jekyll::Deprecator.deprecation_message "You appear to have pagination " \ + "turned on, but you haven't included the `jekyll-paginate` gem. " \ + "Ensure you have `plugins: [jekyll-paginate]` in your configuration file." + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/publisher.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/publisher.rb new file mode 100644 index 000000000000..26fe4a3869bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/publisher.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Jekyll + class Publisher + def initialize(site) + @site = site + end + + def publish?(thing) + can_be_published?(thing) && !hidden_in_the_future?(thing) + end + + def hidden_in_the_future?(thing) + thing.respond_to?(:date) && !@site.future && thing.date.to_i > @site.time.to_i + end + + private + + def can_be_published?(thing) + thing.data.fetch("published", true) || @site.unpublished + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/reader.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/reader.rb new file mode 100644 index 000000000000..fed76a163031 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/reader.rb @@ -0,0 +1,154 @@ +# frozen_string_literal: true + +module Jekyll + class Reader + attr_reader :site + + def initialize(site) + @site = site + end + + # Read Site data from disk and load it into internal data structures. + # + # Returns nothing. + def read + @site.layouts = LayoutReader.new(site).read + read_directories + sort_files! + @site.data = DataReader.new(site).read(site.config["data_dir"]) + CollectionReader.new(site).read + ThemeAssetsReader.new(site).read + end + + # Sorts posts, pages, and static files. + def sort_files! + site.collections.each_value { |c| c.docs.sort! } + site.pages.sort_by!(&:name) + site.static_files.sort_by!(&:relative_path) + end + + # Recursively traverse directories to find pages and static files + # that will become part of the site according to the rules in + # filter_entries. + # + # dir - The String relative path of the directory to read. Default: ''. + # + # Returns nothing. + def read_directories(dir = "") + base = site.in_source_dir(dir) + + return unless File.directory?(base) + + dot = Dir.chdir(base) { filter_entries(Dir.entries("."), base) } + dot_dirs = dot.select { |file| File.directory?(@site.in_source_dir(base, file)) } + dot_files = (dot - dot_dirs) + dot_pages = dot_files.select do |file| + Utils.has_yaml_header?(@site.in_source_dir(base, file)) + end + dot_static_files = dot_files - dot_pages + + retrieve_posts(dir) + retrieve_dirs(base, dir, dot_dirs) + retrieve_pages(dir, dot_pages) + retrieve_static_files(dir, dot_static_files) + end + + # Retrieves all the posts(posts/drafts) from the given directory + # and add them to the site and sort them. + # + # dir - The String representing the directory to retrieve the posts from. + # + # Returns nothing. + def retrieve_posts(dir) + return if outside_configured_directory?(dir) + site.posts.docs.concat(post_reader.read_posts(dir)) + site.posts.docs.concat(post_reader.read_drafts(dir)) if site.show_drafts + end + + # Recursively traverse directories with the read_directories function. + # + # base - The String representing the site's base directory. + # dir - The String representing the directory to traverse down. + # dot_dirs - The Array of subdirectories in the dir. + # + # Returns nothing. + def retrieve_dirs(_base, dir, dot_dirs) + dot_dirs.each do |file| + dir_path = site.in_source_dir(dir, file) + rel_path = File.join(dir, file) + unless @site.dest.chomp("/") == dir_path + @site.reader.read_directories(rel_path) + end + end + end + + # Retrieve all the pages from the current directory, + # add them to the site and sort them. + # + # dir - The String representing the directory retrieve the pages from. + # dot_pages - The Array of pages in the dir. + # + # Returns nothing. + def retrieve_pages(dir, dot_pages) + site.pages.concat(PageReader.new(site, dir).read(dot_pages)) + end + + # Retrieve all the static files from the current directory, + # add them to the site and sort them. + # + # dir - The directory retrieve the static files from. + # dot_static_files - The static files in the dir. + # + # Returns nothing. + def retrieve_static_files(dir, dot_static_files) + site.static_files.concat(StaticFileReader.new(site, dir).read(dot_static_files)) + end + + # Filter out any files/directories that are hidden or backup files (start + # with "." or "#" or end with "~"), or contain site content (start with "_"), + # or are excluded in the site configuration, unless they are web server + # files such as '.htaccess'. + # + # entries - The Array of String file/directory entries to filter. + # base_directory - The string representing the optional base directory. + # + # Returns the Array of filtered entries. + def filter_entries(entries, base_directory = nil) + EntryFilter.new(site, base_directory).filter(entries) + end + + # Read the entries from a particular directory for processing + # + # dir - The String representing the relative path of the directory to read. + # subfolder - The String representing the directory to read. + # + # Returns the list of entries to process + def get_entries(dir, subfolder) + base = site.in_source_dir(dir, subfolder) + return [] unless File.exist?(base) + entries = Dir.chdir(base) { filter_entries(Dir["**/*"], base) } + entries.delete_if { |e| File.directory?(site.in_source_dir(base, e)) } + end + + private + + # Internal + # + # Determine if the directory is supposed to contain posts and drafts. + # If the user has defined a custom collections_dir, then attempt to read + # posts and drafts only from within that directory. + # + # Returns true if a custom collections_dir has been set but current directory lies + # outside that directory. + def outside_configured_directory?(dir) + collections_dir = site.config["collections_dir"] + !collections_dir.empty? && !dir.start_with?("/#{collections_dir}") + end + + # Create a single PostReader instance to retrieve drafts and posts from all valid + # directories in current site. + def post_reader + @post_reader ||= PostReader.new(site) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/collection_reader.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/collection_reader.rb new file mode 100644 index 000000000000..77c700976f78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/collection_reader.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Jekyll + class CollectionReader + SPECIAL_COLLECTIONS = %w(posts data).freeze + + attr_reader :site, :content + def initialize(site) + @site = site + @content = {} + end + + # Read in all collections specified in the configuration + # + # Returns nothing. + def read + site.collections.each_value do |collection| + collection.read unless SPECIAL_COLLECTIONS.include?(collection.label) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/data_reader.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/data_reader.rb new file mode 100644 index 000000000000..445d548802b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/data_reader.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +module Jekyll + class DataReader + attr_reader :site, :content + def initialize(site) + @site = site + @content = {} + @entry_filter = EntryFilter.new(site) + end + + # Read all the files in <dir> and adds them to @content + # + # dir - The String relative path of the directory to read. + # + # Returns @content, a Hash of the .yaml, .yml, + # .json, and .csv files in the base directory + def read(dir) + base = site.in_source_dir(dir) + read_data_to(base, @content) + @content + end + + # Read and parse all .yaml, .yml, .json, .csv and .tsv + # files under <dir> and add them to the <data> variable. + # + # dir - The string absolute path of the directory to read. + # data - The variable to which data will be added. + # + # Returns nothing + def read_data_to(dir, data) + return unless File.directory?(dir) && !@entry_filter.symlink?(dir) + + entries = Dir.chdir(dir) do + Dir["*.{yaml,yml,json,csv,tsv}"] + Dir["*"].select { |fn| File.directory?(fn) } + end + + entries.each do |entry| + path = @site.in_source_dir(dir, entry) + next if @entry_filter.symlink?(path) + + if File.directory?(path) + read_data_to(path, data[sanitize_filename(entry)] = {}) + else + key = sanitize_filename(File.basename(entry, ".*")) + data[key] = read_data_file(path) + end + end + end + + # Determines how to read a data file. + # + # Returns the contents of the data file. + def read_data_file(path) + case File.extname(path).downcase + when ".csv" + CSV.read(path, { + :headers => true, + :encoding => site.config["encoding"], + }).map(&:to_hash) + when ".tsv" + CSV.read(path, { + :col_sep => "\t", + :headers => true, + :encoding => site.config["encoding"], + }).map(&:to_hash) + else + SafeYAML.load_file(path) + end + end + + def sanitize_filename(name) + name.gsub(%r![^\w\s-]+|(?<=^|\b\s)\s+(?=$|\s?\b)!, "") + .gsub(%r!\s+!, "_") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/layout_reader.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/layout_reader.rb new file mode 100644 index 000000000000..706dfed8c43c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/layout_reader.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +module Jekyll + class LayoutReader + attr_reader :site + def initialize(site) + @site = site + @layouts = {} + end + + def read + layout_entries.each do |layout_file| + @layouts[layout_name(layout_file)] = \ + Layout.new(site, layout_directory, layout_file) + end + + theme_layout_entries.each do |layout_file| + @layouts[layout_name(layout_file)] ||= \ + Layout.new(site, theme_layout_directory, layout_file) + end + + @layouts + end + + def layout_directory + @layout_directory ||= (layout_directory_in_cwd || layout_directory_inside_source) + end + + def theme_layout_directory + @theme_layout_directory ||= site.theme.layouts_path if site.theme + end + + private + + def layout_entries + entries_in layout_directory + end + + def theme_layout_entries + theme_layout_directory ? entries_in(theme_layout_directory) : [] + end + + def entries_in(dir) + entries = [] + within(dir) do + entries = EntryFilter.new(site).filter(Dir["**/*.*"]) + end + entries + end + + def layout_name(file) + file.split(".")[0..-2].join(".") + end + + def within(directory) + return unless File.exist?(directory) + Dir.chdir(directory) { yield } + end + + def layout_directory_inside_source + site.in_source_dir(site.config["layouts_dir"]) + end + + def layout_directory_in_cwd + dir = Jekyll.sanitized_path(Dir.pwd, site.config["layouts_dir"]) + if File.directory?(dir) && !site.safe + dir + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/page_reader.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/page_reader.rb new file mode 100644 index 000000000000..62d7419efeca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/page_reader.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Jekyll + class PageReader + attr_reader :site, :dir, :unfiltered_content + def initialize(site, dir) + @site = site + @dir = dir + @unfiltered_content = [] + end + + # Read all the files in <source>/<dir>/ for Yaml header and create a new Page + # object for each file. + # + # dir - The String relative path of the directory to read. + # + # Returns an array of static pages. + def read(files) + files.map do |page| + @unfiltered_content << Page.new(@site, @site.source, @dir, page) + end + @unfiltered_content.select { |page| site.publisher.publish?(page) } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/post_reader.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/post_reader.rb new file mode 100644 index 000000000000..b0dc30326b55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/post_reader.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +module Jekyll + class PostReader + attr_reader :site, :unfiltered_content + def initialize(site) + @site = site + end + + # Read all the files in <source>/<dir>/_drafts and create a new + # Document object with each one. + # + # dir - The String relative path of the directory to read. + # + # Returns nothing. + def read_drafts(dir) + read_publishable(dir, "_drafts", Document::DATELESS_FILENAME_MATCHER) + end + + # Read all the files in <source>/<dir>/_posts and create a new Document + # object with each one. + # + # dir - The String relative path of the directory to read. + # + # Returns nothing. + def read_posts(dir) + read_publishable(dir, "_posts", Document::DATE_FILENAME_MATCHER) + end + + # Read all the files in <source>/<dir>/<magic_dir> and create a new + # Document object with each one insofar as it matches the regexp matcher. + # + # dir - The String relative path of the directory to read. + # + # Returns nothing. + def read_publishable(dir, magic_dir, matcher) + read_content(dir, magic_dir, matcher).tap { |docs| docs.each(&:read) } + .select do |doc| + if doc.content.valid_encoding? + site.publisher.publish?(doc).tap do |will_publish| + if !will_publish && site.publisher.hidden_in_the_future?(doc) + Jekyll.logger.debug "Skipping:", "#{doc.relative_path} has a future date" + end + end + else + Jekyll.logger.debug "Skipping:", "#{doc.relative_path} is not valid UTF-8" + false + end + end + end + + # Read all the content files from <source>/<dir>/magic_dir + # and return them with the type klass. + # + # dir - The String relative path of the directory to read. + # magic_dir - The String relative directory to <dir>, + # looks for content here. + # klass - The return type of the content. + # + # Returns klass type of content files + def read_content(dir, magic_dir, matcher) + @site.reader.get_entries(dir, magic_dir).map do |entry| + next unless entry =~ matcher + path = @site.in_source_dir(File.join(dir, magic_dir, entry)) + Document.new(path, { + :site => @site, + :collection => @site.posts, + }) + end.reject(&:nil?) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/static_file_reader.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/static_file_reader.rb new file mode 100644 index 000000000000..6bf07f5a0c31 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/static_file_reader.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Jekyll + class StaticFileReader + attr_reader :site, :dir, :unfiltered_content + def initialize(site, dir) + @site = site + @dir = dir + @unfiltered_content = [] + end + + # Read all the files in <source>/<dir>/ for Yaml header and create a new Page + # object for each file. + # + # dir - The String relative path of the directory to read. + # + # Returns an array of static files. + def read(files) + files.map do |file| + @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file) + end + @unfiltered_content + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/theme_assets_reader.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/theme_assets_reader.rb new file mode 100644 index 000000000000..2706690c5ce5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/readers/theme_assets_reader.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Jekyll + class ThemeAssetsReader + attr_reader :site + def initialize(site) + @site = site + end + + def read + return unless site.theme && site.theme.assets_path + + Find.find(site.theme.assets_path) do |path| + next if File.directory?(path) + if File.symlink?(path) + Jekyll.logger.warn "Theme reader:", "Ignored symlinked asset: #{path}" + else + read_theme_asset(path) + end + end + end + + private + def read_theme_asset(path) + base = site.theme.root + dir = File.dirname(path.sub("#{site.theme.root}/", "")) + name = File.basename(path) + + if Utils.has_yaml_header?(path) + append_unless_exists site.pages, + Jekyll::Page.new(site, base, dir, name) + else + append_unless_exists site.static_files, + Jekyll::StaticFile.new(site, base, "/#{dir}", name) + end + end + + def append_unless_exists(haystack, new_item) + if haystack.any? { |file| file.relative_path == new_item.relative_path } + Jekyll.logger.debug "Theme:", + "Ignoring #{new_item.relative_path} in theme due to existing file " \ + "with that path in site." + return + end + + haystack << new_item + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/regenerator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/regenerator.rb new file mode 100644 index 000000000000..178cb1a90c67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/regenerator.rb @@ -0,0 +1,203 @@ +# frozen_string_literal: true + +module Jekyll + class Regenerator + attr_reader :site, :metadata, :cache + attr_accessor :disabled + private :disabled, :disabled= + + def initialize(site) + @site = site + + # Read metadata from file + read_metadata + + # Initialize cache to an empty hash + clear_cache + end + + # Checks if a renderable object needs to be regenerated + # + # Returns a boolean. + def regenerate?(document) + return true if disabled + case document + when Page + regenerate_page?(document) + when Document + regenerate_document?(document) + else + source_path = document.respond_to?(:path) ? document.path : nil + dest_path = if document.respond_to?(:destination) + document.destination(@site.dest) + end + source_modified_or_dest_missing?(source_path, dest_path) + end + end + + # Add a path to the metadata + # + # Returns true, also on failure. + def add(path) + return true unless File.exist?(path) + + metadata[path] = { + "mtime" => File.mtime(path), + "deps" => [], + } + cache[path] = true + end + + # Force a path to regenerate + # + # Returns true. + def force(path) + cache[path] = true + end + + # Clear the metadata and cache + # + # Returns nothing + def clear + @metadata = {} + clear_cache + end + + # Clear just the cache + # + # Returns nothing + def clear_cache + @cache = {} + end + + # Checks if the source has been modified or the + # destination is missing + # + # returns a boolean + def source_modified_or_dest_missing?(source_path, dest_path) + modified?(source_path) || (dest_path && !File.exist?(dest_path)) + end + + # Checks if a path's (or one of its dependencies) + # mtime has changed + # + # Returns a boolean. + def modified?(path) + return true if disabled? + + # objects that don't have a path are always regenerated + return true if path.nil? + + # Check for path in cache + if cache.key? path + return cache[path] + end + + if metadata[path] + # If we have seen this file before, + # check if it or one of its dependencies has been modified + existing_file_modified?(path) + else + # If we have not seen this file before, add it to the metadata and regenerate it + add(path) + end + end + + # Add a dependency of a path + # + # Returns nothing. + def add_dependency(path, dependency) + return if metadata[path].nil? || disabled + + unless metadata[path]["deps"].include? dependency + metadata[path]["deps"] << dependency + add(dependency) unless metadata.include?(dependency) + end + regenerate? dependency + end + + # Write the metadata to disk + # + # Returns nothing. + def write_metadata + unless disabled? + Jekyll.logger.debug "Writing Metadata:", ".jekyll-metadata" + File.binwrite(metadata_file, Marshal.dump(metadata)) + end + end + + # Produce the absolute path of the metadata file + # + # Returns the String path of the file. + def metadata_file + @metadata_file ||= site.in_source_dir(".jekyll-metadata") + end + + # Check if metadata has been disabled + # + # Returns a Boolean (true for disabled, false for enabled). + def disabled? + self.disabled = !site.incremental? if disabled.nil? + disabled + end + + private + + # Read metadata from the metadata file, if no file is found, + # initialize with an empty hash + # + # Returns the read metadata. + def read_metadata + @metadata = + if !disabled? && File.file?(metadata_file) + content = File.binread(metadata_file) + + begin + Marshal.load(content) + rescue TypeError + SafeYAML.load(content) + rescue ArgumentError => e + Jekyll.logger.warn("Failed to load #{metadata_file}: #{e}") + {} + end + else + {} + end + end + + private + def regenerate_page?(document) + document.asset_file? || document.data["regenerate"] || + source_modified_or_dest_missing?( + site.in_source_dir(document.relative_path), document.destination(@site.dest) + ) + end + + private + def regenerate_document?(document) + !document.write? || document.data["regenerate"] || + source_modified_or_dest_missing?( + document.path, document.destination(@site.dest) + ) + end + + private + def existing_file_modified?(path) + # If one of this file dependencies have been modified, + # set the regeneration bit for both the dependency and the file to true + metadata[path]["deps"].each do |dependency| + if modified?(dependency) + return cache[dependency] = cache[path] = true + end + end + + if File.exist?(path) && metadata[path]["mtime"].eql?(File.mtime(path)) + # If this file has not been modified, set the regeneration bit to false + cache[path] = false + else + # If it has been modified, set it to true + add(path) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/related_posts.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/related_posts.rb new file mode 100644 index 000000000000..4ad16ef4b7f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/related_posts.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module Jekyll + class RelatedPosts + class << self + attr_accessor :lsi + end + + attr_reader :post, :site + + def initialize(post) + @post = post + @site = post.site + Jekyll::External.require_with_graceful_fail("classifier-reborn") if site.lsi + end + + def build + return [] unless site.posts.docs.size > 1 + + if site.lsi + build_index + lsi_related_posts + else + most_recent_posts + end + end + + def build_index + self.class.lsi ||= begin + lsi = ClassifierReborn::LSI.new(:auto_rebuild => false) + Jekyll.logger.info("Populating LSI...") + + site.posts.docs.each do |x| + lsi.add_item(x) + end + + Jekyll.logger.info("Rebuilding index...") + lsi.build_index + Jekyll.logger.info("") + lsi + end + end + + def lsi_related_posts + self.class.lsi.find_related(post, 11) + end + + def most_recent_posts + @most_recent_posts ||= (site.posts.docs.last(11).reverse - [post]).first(10) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/renderer.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/renderer.rb new file mode 100644 index 000000000000..9c47b2568e11 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/renderer.rb @@ -0,0 +1,278 @@ +# frozen_string_literal: true + +module Jekyll + class Renderer + attr_reader :document, :site + attr_writer :layouts, :payload + + def initialize(site, document, site_payload = nil) + @site = site + @document = document + @payload = site_payload + end + + # Fetches the payload used in Liquid rendering. + # It can be written with #payload=(new_payload) + # Falls back to site.site_payload if no payload is set. + # + # Returns a Jekyll::Drops::UnifiedPayloadDrop + def payload + @payload ||= site.site_payload + end + + # The list of layouts registered for this Renderer. + # It can be written with #layouts=(new_layouts) + # Falls back to site.layouts if no layouts are registered. + # + # Returns a Hash of String => Jekyll::Layout identified + # as basename without the extension name. + def layouts + @layouts || site.layouts + end + + # Determine which converters to use based on this document's + # extension. + # + # Returns Array of Converter instances. + def converters + @converters ||= site.converters.select { |c| c.matches(document.extname) }.sort + end + + # Determine the extname the outputted file should have + # + # Returns String the output extname including the leading period. + def output_ext + @output_ext ||= (permalink_ext || converter_output_ext) + end + + # Prepare payload and render the document + # + # Returns String rendered document output + def run + Jekyll.logger.debug "Rendering:", document.relative_path + + assign_pages! + assign_current_document! + assign_highlighter_options! + assign_layout_data! + + Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path + document.trigger_hooks(:pre_render, payload) + + render_document + end + + # Render the document. + # + # Returns String rendered document output + # rubocop: disable AbcSize + def render_document + info = { + :registers => { :site => site, :page => payload["page"] }, + :strict_filters => liquid_options["strict_filters"], + :strict_variables => liquid_options["strict_variables"], + } + + output = document.content + if document.render_with_liquid? + Jekyll.logger.debug "Rendering Liquid:", document.relative_path + output = render_liquid(output, payload, info, document.path) + end + + Jekyll.logger.debug "Rendering Markup:", document.relative_path + output = convert(output.to_s) + document.content = output + + if document.place_in_layout? + Jekyll.logger.debug "Rendering Layout:", document.relative_path + output = place_in_layouts(output, payload, info) + end + + output + end + # rubocop: enable AbcSize + + # Convert the document using the converters which match this renderer's document. + # + # Returns String the converted content. + def convert(content) + converters.reduce(content) do |output, converter| + begin + converter.convert output + rescue StandardError => e + Jekyll.logger.error "Conversion error:", + "#{converter.class} encountered an error while "\ + "converting '#{document.relative_path}':" + Jekyll.logger.error("", e.to_s) + raise e + end + end + end + + # Render the given content with the payload and info + # + # content - + # payload - + # info - + # path - (optional) the path to the file, for use in ex + # + # Returns String the content, rendered by Liquid. + def render_liquid(content, payload, info, path = nil) + template = site.liquid_renderer.file(path).parse(content) + template.warnings.each do |e| + Jekyll.logger.warn "Liquid Warning:", + LiquidRenderer.format_error(e, path || document.relative_path) + end + template.render!(payload, info) + # rubocop: disable RescueException + rescue Exception => e + Jekyll.logger.error "Liquid Exception:", + LiquidRenderer.format_error(e, path || document.relative_path) + raise e + end + # rubocop: enable RescueException + + # Checks if the layout specified in the document actually exists + # + # layout - the layout to check + # + # Returns Boolean true if the layout is invalid, false if otherwise + def invalid_layout?(layout) + !document.data["layout"].nil? && layout.nil? && !(document.is_a? Jekyll::Excerpt) + end + + # Render layouts and place document content inside. + # + # Returns String rendered content + def place_in_layouts(content, payload, info) + output = content.dup + layout = layouts[document.data["layout"].to_s] + validate_layout(layout) + + used = Set.new([layout]) + + # Reset the payload layout data to ensure it starts fresh for each page. + payload["layout"] = nil + + while layout + output = render_layout(output, layout, info) + add_regenerator_dependencies(layout) + + if (layout = site.layouts[layout.data["layout"]]) + break if used.include?(layout) + used << layout + end + end + output + end + + # Checks if the layout specified in the document actually exists + # + # layout - the layout to check + # Returns nothing + private + def validate_layout(layout) + if invalid_layout?(layout) + Jekyll.logger.warn( + "Build Warning:", + "Layout '#{document.data["layout"]}' requested "\ + "in #{document.relative_path} does not exist." + ) + elsif !layout.nil? + layout_source = layout.path.start_with?(site.source) ? :site : :theme + Jekyll.logger.debug "Layout source:", layout_source + end + end + + # Render layout content into document.output + # + # Returns String rendered content + private + def render_layout(output, layout, info) + payload["content"] = output + payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) + + render_liquid( + layout.content, + payload, + info, + layout.relative_path + ) + end + + private + def add_regenerator_dependencies(layout) + return unless document.write? + site.regenerator.add_dependency( + site.in_source_dir(document.path), + layout.path + ) + end + + # Set page content to payload and assign pager if document has one. + # + # Returns nothing + private + def assign_pages! + payload["page"] = document.to_liquid + payload["paginator"] = if document.respond_to?(:pager) + document.pager.to_liquid + end + end + + # Set related posts to payload if document is a post. + # + # Returns nothing + private + def assign_current_document! + payload["site"].current_document = document + end + + # Set highlighter prefix and suffix + # + # Returns nothing + private + def assign_highlighter_options! + payload["highlighter_prefix"] = converters.first.highlighter_prefix + payload["highlighter_suffix"] = converters.first.highlighter_suffix + end + + private + def assign_layout_data! + layout = layouts[document.data["layout"]] + if layout + payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) + end + end + + private + def permalink_ext + document_permalink = document.permalink + if document_permalink && !document_permalink.end_with?("/") + permalink_ext = File.extname(document_permalink) + permalink_ext unless permalink_ext.empty? + end + end + + private + def converter_output_ext + if output_exts.size == 1 + output_exts.last + else + output_exts[-2] + end + end + + private + def output_exts + @output_exts ||= converters.map do |c| + c.output_ext(document.extname) + end.compact + end + + private + def liquid_options + @liquid_options ||= site.config["liquid"] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/site.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/site.rb new file mode 100644 index 000000000000..44bacc9047c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/site.rb @@ -0,0 +1,483 @@ +# frozen_string_literal: true + +module Jekyll + class Site + attr_reader :source, :dest, :config + attr_accessor :layouts, :pages, :static_files, :drafts, + :exclude, :include, :lsi, :highlighter, :permalink_style, + :time, :future, :unpublished, :safe, :plugins, :limit_posts, + :show_drafts, :keep_files, :baseurl, :data, :file_read_opts, + :gems, :plugin_manager, :theme + + attr_accessor :converters, :generators, :reader + attr_reader :regenerator, :liquid_renderer, :includes_load_paths + + # Public: Initialize a new Site. + # + # config - A Hash containing site configuration details. + def initialize(config) + # Source and destination may not be changed after the site has been created. + @source = File.expand_path(config["source"]).freeze + @dest = File.expand_path(config["destination"]).freeze + + self.config = config + + @reader = Reader.new(self) + @regenerator = Regenerator.new(self) + @liquid_renderer = LiquidRenderer.new(self) + + Jekyll.sites << self + + reset + setup + + Jekyll::Hooks.trigger :site, :after_init, self + end + + # Public: Set the site's configuration. This handles side-effects caused by + # changing values in the configuration. + # + # config - a Jekyll::Configuration, containing the new configuration. + # + # Returns the new configuration. + def config=(config) + @config = config.clone + + %w(safe lsi highlighter baseurl exclude include future unpublished + show_drafts limit_posts keep_files).each do |opt| + self.send("#{opt}=", config[opt]) + end + + # keep using `gems` to avoid breaking change + self.gems = config["plugins"] + + configure_plugins + configure_theme + configure_include_paths + configure_file_read_opts + + self.permalink_style = config["permalink"].to_sym + + @config + end + + # Public: Read, process, and write this Site to output. + # + # Returns nothing. + def process + reset + read + generate + render + cleanup + write + print_stats if config["profile"] + end + + def print_stats + Jekyll.logger.info @liquid_renderer.stats_table + end + + # Reset Site details. + # + # Returns nothing + def reset + self.time = if config["time"] + Utils.parse_date(config["time"].to_s, "Invalid time in _config.yml.") + else + Time.now + end + self.layouts = {} + self.pages = [] + self.static_files = [] + self.data = {} + @site_data = nil + @collections = nil + @docs_to_write = nil + @regenerator.clear_cache + @liquid_renderer.reset + @site_cleaner = nil + + if limit_posts < 0 + raise ArgumentError, "limit_posts must be a non-negative number" + end + + Jekyll::Hooks.trigger :site, :after_reset, self + end + + # Load necessary libraries, plugins, converters, and generators. + # + # Returns nothing. + def setup + ensure_not_in_dest + + plugin_manager.conscientious_require + + self.converters = instantiate_subclasses(Jekyll::Converter) + self.generators = instantiate_subclasses(Jekyll::Generator) + end + + # Check that the destination dir isn't the source dir or a directory + # parent to the source dir. + def ensure_not_in_dest + dest_pathname = Pathname.new(dest) + Pathname.new(source).ascend do |path| + if path == dest_pathname + raise Errors::FatalException, + "Destination directory cannot be or contain the Source directory." + end + end + end + + # The list of collections and their corresponding Jekyll::Collection instances. + # If config['collections'] is set, a new instance is created + # for each item in the collection, a new hash is returned otherwise. + # + # Returns a Hash containing collection name-to-instance pairs. + def collections + @collections ||= Hash[collection_names.map do |coll| + [coll, Jekyll::Collection.new(self, coll)] + end] + end + + # The list of collection names. + # + # Returns an array of collection names from the configuration, + # or an empty array if the `collections` key is not set. + def collection_names + case config["collections"] + when Hash + config["collections"].keys + when Array + config["collections"] + when nil + [] + else + raise ArgumentError, "Your `collections` key must be a hash or an array." + end + end + + # Read Site data from disk and load it into internal data structures. + # + # Returns nothing. + def read + reader.read + limit_posts! + Jekyll::Hooks.trigger :site, :post_read, self + end + + # Run each of the Generators. + # + # Returns nothing. + def generate + generators.each do |generator| + start = Time.now + generator.generate(self) + Jekyll.logger.debug "Generating:", + "#{generator.class} finished in #{Time.now - start} seconds." + end + end + + # Render the site to the destination. + # + # Returns nothing. + def render + relative_permalinks_are_deprecated + + payload = site_payload + + Jekyll::Hooks.trigger :site, :pre_render, self, payload + + render_docs(payload) + render_pages(payload) + + Jekyll::Hooks.trigger :site, :post_render, self, payload + end + + # Remove orphaned files and empty directories in destination. + # + # Returns nothing. + def cleanup + site_cleaner.cleanup! + end + + # Write static files, pages, and posts. + # + # Returns nothing. + def write + each_site_file do |item| + item.write(dest) if regenerator.regenerate?(item) + end + regenerator.write_metadata + Jekyll::Hooks.trigger :site, :post_write, self + end + + def posts + collections["posts"] ||= Collection.new(self, "posts") + end + + # Construct a Hash of Posts indexed by the specified Post attribute. + # + # post_attr - The String name of the Post attribute. + # + # Examples + # + # post_attr_hash('categories') + # # => { 'tech' => [<Post A>, <Post B>], + # # 'ruby' => [<Post B>] } + # + # Returns the Hash: { attr => posts } where + # attr - One of the values for the requested attribute. + # posts - The Array of Posts with the given attr value. + def post_attr_hash(post_attr) + # Build a hash map based on the specified post attribute ( post attr => + # array of posts ) then sort each array in reverse order. + hash = Hash.new { |h, key| h[key] = [] } + posts.docs.each do |p| + p.data[post_attr].each { |t| hash[t] << p } if p.data[post_attr] + end + hash.each_value { |posts| posts.sort!.reverse! } + hash + end + + def tags + post_attr_hash("tags") + end + + def categories + post_attr_hash("categories") + end + + # Prepare site data for site payload. The method maintains backward compatibility + # if the key 'data' is already used in _config.yml. + # + # Returns the Hash to be hooked to site.data. + def site_data + @site_data ||= (config["data"] || data) + end + + # The Hash payload containing site-wide data. + # + # Returns the Hash: { "site" => data } where data is a Hash with keys: + # "time" - The Time as specified in the configuration or the + # current time if none was specified. + # "posts" - The Array of Posts, sorted chronologically by post date + # and then title. + # "pages" - The Array of all Pages. + # "html_pages" - The Array of HTML Pages. + # "categories" - The Hash of category values and Posts. + # See Site#post_attr_hash for type info. + # "tags" - The Hash of tag values and Posts. + # See Site#post_attr_hash for type info. + def site_payload + Drops::UnifiedPayloadDrop.new self + end + alias_method :to_liquid, :site_payload + + # Get the implementation class for the given Converter. + # Returns the Converter instance implementing the given Converter. + # klass - The Class of the Converter to fetch. + def find_converter_instance(klass) + @find_converter_instance ||= {} + @find_converter_instance[klass] ||= begin + converters.find { |converter| converter.instance_of?(klass) } || \ + raise("No Converters found for #{klass}") + end + end + + # klass - class or module containing the subclasses. + # Returns array of instances of subclasses of parameter. + # Create array of instances of the subclasses of the class or module + # passed in as argument. + + def instantiate_subclasses(klass) + klass.descendants.select { |c| !safe || c.safe }.sort.map do |c| + c.new(config) + end + end + + # Warns the user if permanent links are relative to the parent + # directory. As this is a deprecated function of Jekyll. + # + # Returns + def relative_permalinks_are_deprecated + if config["relative_permalinks"] + Jekyll.logger.abort_with "Since v3.0, permalinks for pages" \ + " in subfolders must be relative to the" \ + " site source directory, not the parent" \ + " directory. Check https://jekyllrb.com/docs/upgrading/"\ + " for more info." + end + end + + # Get the to be written documents + # + # Returns an Array of Documents which should be written + def docs_to_write + documents.select(&:write?) + end + + # Get all the documents + # + # Returns an Array of all Documents + def documents + collections.each_with_object(Set.new) do |(_, collection), set| + set.merge(collection.docs).merge(collection.files) + end.to_a + end + + def each_site_file + %w(pages static_files docs_to_write).each do |type| + send(type).each do |item| + yield item + end + end + end + + # Returns the FrontmatterDefaults or creates a new FrontmatterDefaults + # if it doesn't already exist. + # + # Returns The FrontmatterDefaults + def frontmatter_defaults + @frontmatter_defaults ||= FrontmatterDefaults.new(self) + end + + # Whether to perform a full rebuild without incremental regeneration + # + # Returns a Boolean: true for a full rebuild, false for normal build + def incremental?(override = {}) + override["incremental"] || config["incremental"] + end + + # Returns the publisher or creates a new publisher if it doesn't + # already exist. + # + # Returns The Publisher + def publisher + @publisher ||= Publisher.new(self) + end + + # Public: Prefix a given path with the source directory. + # + # paths - (optional) path elements to a file or directory within the + # source directory + # + # Returns a path which is prefixed with the source directory. + def in_source_dir(*paths) + paths.reduce(source) do |base, path| + Jekyll.sanitized_path(base, path) + end + end + + # Public: Prefix a given path with the theme directory. + # + # paths - (optional) path elements to a file or directory within the + # theme directory + # + # Returns a path which is prefixed with the theme root directory. + def in_theme_dir(*paths) + return nil unless theme + paths.reduce(theme.root) do |base, path| + Jekyll.sanitized_path(base, path) + end + end + + # Public: Prefix a given path with the destination directory. + # + # paths - (optional) path elements to a file or directory within the + # destination directory + # + # Returns a path which is prefixed with the destination directory. + def in_dest_dir(*paths) + paths.reduce(dest) do |base, path| + Jekyll.sanitized_path(base, path) + end + end + + # Public: The full path to the directory that houses all the collections registered + # with the current site. + # + # Returns the source directory or the absolute path to the custom collections_dir + def collections_path + dir_str = config["collections_dir"] + @collections_path ||= dir_str.empty? ? source : in_source_dir(dir_str) + end + + # Limits the current posts; removes the posts which exceed the limit_posts + # + # Returns nothing + private + def limit_posts! + if limit_posts > 0 + limit = posts.docs.length < limit_posts ? posts.docs.length : limit_posts + self.posts.docs = posts.docs[-limit, limit] + end + end + + # Returns the Cleaner or creates a new Cleaner if it doesn't + # already exist. + # + # Returns The Cleaner + private + def site_cleaner + @site_cleaner ||= Cleaner.new(self) + end + + private + def configure_plugins + self.plugin_manager = Jekyll::PluginManager.new(self) + self.plugins = plugin_manager.plugins_path + end + + private + def configure_theme + self.theme = nil + return if config["theme"].nil? + + self.theme = + if config["theme"].is_a?(String) + Jekyll::Theme.new(config["theme"]) + else + Jekyll.logger.warn "Theme:", "value of 'theme' in config should be " \ + "String to use gem-based themes, but got #{config["theme"].class}" + nil + end + end + + private + def configure_include_paths + @includes_load_paths = Array(in_source_dir(config["includes_dir"].to_s)) + @includes_load_paths << theme.includes_path if theme && theme.includes_path + end + + private + def configure_file_read_opts + self.file_read_opts = {} + self.file_read_opts[:encoding] = config["encoding"] if config["encoding"] + self.file_read_opts = Jekyll::Utils.merged_file_read_opts(self, {}) + end + + private + def render_docs(payload) + collections.each_value do |collection| + collection.docs.each do |document| + render_regenerated(document, payload) + end + end + end + + private + def render_pages(payload) + pages.flatten.each do |page| + render_regenerated(page, payload) + end + end + + private + def render_regenerated(document, payload) + return unless regenerator.regenerate?(document) + document.output = Jekyll::Renderer.new(self, document, payload).run + document.trigger_hooks(:post_render) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/static_file.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/static_file.rb new file mode 100644 index 000000000000..ea89b6d2be9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/static_file.rb @@ -0,0 +1,167 @@ +# frozen_string_literal: true + +module Jekyll + class StaticFile + extend Forwardable + + attr_reader :relative_path, :extname, :name, :data + + def_delegator :to_liquid, :to_json, :to_json + + class << self + # The cache of last modification times [path] -> mtime. + def mtimes + @mtimes ||= {} + end + + def reset_cache + @mtimes = nil + end + end + + # Initialize a new StaticFile. + # + # site - The Site. + # base - The String path to the <source>. + # dir - The String path between <source> and the file. + # name - The String filename of the file. + # rubocop: disable ParameterLists + def initialize(site, base, dir, name, collection = nil) + @site = site + @base = base + @dir = dir + @name = name + @collection = collection + @relative_path = File.join(*[@dir, @name].compact) + @extname = File.extname(@name) + @data = @site.frontmatter_defaults.all(relative_path, type) + end + # rubocop: enable ParameterLists + + # Returns source file path. + def path + # Static file is from a collection inside custom collections directory + if !@collection.nil? && !@site.config["collections_dir"].empty? + File.join(*[@base, @site.config["collections_dir"], @dir, @name].compact) + else + File.join(*[@base, @dir, @name].compact) + end + end + + # Obtain destination path. + # + # dest - The String path to the destination dir. + # + # Returns destination file path. + def destination(dest) + @site.in_dest_dir(*[dest, destination_rel_dir, @name].compact) + end + + def destination_rel_dir + if @collection + File.dirname(url) + else + @dir + end + end + + def modified_time + @modified_time ||= File.stat(path).mtime + end + + # Returns last modification time for this file. + def mtime + modified_time.to_i + end + + # Is source path modified? + # + # Returns true if modified since last write. + def modified? + self.class.mtimes[path] != mtime + end + + # Whether to write the file to the filesystem + # + # Returns true unless the defaults for the destination path from + # _config.yml contain `published: false`. + def write? + defaults.fetch("published", true) + end + + # Write the static file to the destination directory (if modified). + # + # dest - The String path to the destination dir. + # + # Returns false if the file was not modified since last time (no-op). + def write(dest) + dest_path = destination(dest) + + return false if File.exist?(dest_path) && !modified? + self.class.mtimes[path] = mtime + + FileUtils.mkdir_p(File.dirname(dest_path)) + FileUtils.rm(dest_path) if File.exist?(dest_path) + copy_file(dest_path) + + true + end + + def to_liquid + @to_liquid ||= Drops::StaticFileDrop.new(self) + end + + def basename + File.basename(name, extname) + end + + def placeholders + { + :collection => @collection.label, + :path => relative_path[ + @collection.relative_directory.size..relative_path.size], + :output_ext => "", + :name => "", + :title => "", + } + end + + # Applies a similar URL-building technique as Jekyll::Document that takes + # the collection's URL template into account. The default URL template can + # be overriden in the collection's configuration in _config.yml. + def url + @url ||= if @collection.nil? + relative_path + else + ::Jekyll::URL.new({ + :template => @collection.url_template, + :placeholders => placeholders, + }) + end.to_s.chomp("/") + end + + # Returns the type of the collection if present, nil otherwise. + def type + @type ||= @collection.nil? ? nil : @collection.label.to_sym + end + + # Returns the front matter defaults defined for the file's URL and/or type + # as defined in _config.yml. + def defaults + @defaults ||= @site.frontmatter_defaults.all url, type + end + + private + def copy_file(dest_path) + if @site.safe || Jekyll.env == "production" + FileUtils.cp(path, dest_path) + else + FileUtils.copy_entry(path, dest_path) + end + + unless File.symlink?(dest_path) + File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/stevenson.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/stevenson.rb new file mode 100644 index 000000000000..bbec66171f63 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/stevenson.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +module Jekyll + class Stevenson < ::Logger + def initialize + @progname = nil + @level = DEBUG + @default_formatter = Formatter.new + @logdev = $stdout + @formatter = proc do |_, _, _, msg| + msg.to_s + end + end + + def add(severity, message = nil, progname = nil) + severity ||= UNKNOWN + @logdev = logdevice(severity) + + if @logdev.nil? || severity < @level + return true + end + progname ||= @progname + if message.nil? + if block_given? + message = yield + else + message = progname + progname = @progname + end + end + @logdev.puts( + format_message(format_severity(severity), Time.now, progname, message) + ) + true + end + + # Log a +WARN+ message + def warn(progname = nil, &block) + add(WARN, nil, progname.yellow, &block) + end + + # Log an +ERROR+ message + def error(progname = nil, &block) + add(ERROR, nil, progname.red, &block) + end + + def close + # No LogDevice in use + end + + private + + def logdevice(severity) + if severity > INFO + $stderr + else + $stdout + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/highlight.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/highlight.rb new file mode 100644 index 000000000000..37fbec2c6af5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/highlight.rb @@ -0,0 +1,142 @@ +# frozen_string_literal: true + +module Jekyll + module Tags + class HighlightBlock < Liquid::Block + include Liquid::StandardFilters + + # The regular expression syntax checker. Start with the language specifier. + # Follow that by zero or more space separated options that take one of three + # forms: name, name=value, or name="<quoted list>" + # + # <quoted list> is a space-separated list of numbers + SYNTAX = %r!^([a-zA-Z0-9.+#_-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$! + + def initialize(tag_name, markup, tokens) + super + if markup.strip =~ SYNTAX + @lang = Regexp.last_match(1).downcase + @highlight_options = parse_options(Regexp.last_match(2)) + else + raise SyntaxError, <<-MSG +Syntax Error in tag 'highlight' while parsing the following markup: + + #{markup} + +Valid syntax: highlight <lang> [linenos] +MSG + end + end + + def render(context) + prefix = context["highlighter_prefix"] || "" + suffix = context["highlighter_suffix"] || "" + code = super.to_s.gsub(%r!\A(\n|\r)+|(\n|\r)+\z!, "") + + is_safe = !!context.registers[:site].safe + + output = + case context.registers[:site].highlighter + when "pygments" + render_pygments(code, is_safe) + when "rouge" + render_rouge(code) + else + render_codehighlighter(code) + end + + rendered_output = add_code_tag(output) + prefix + rendered_output + suffix + end + + def sanitized_opts(opts, is_safe) + if is_safe + Hash[[ + [:startinline, opts.fetch(:startinline, nil)], + [:hl_lines, opts.fetch(:hl_lines, nil)], + [:linenos, opts.fetch(:linenos, nil)], + [:encoding, opts.fetch(:encoding, "utf-8")], + [:cssclass, opts.fetch(:cssclass, nil)], + ].reject { |f| f.last.nil? }] + else + opts + end + end + + private + + OPTIONS_REGEX = %r!(?:\w="[^"]*"|\w=\w|\w)+! + + def parse_options(input) + options = {} + return options if input.empty? + + # Split along 3 possible forms -- key="<quoted list>", key=value, or key + input.scan(OPTIONS_REGEX) do |opt| + key, value = opt.split("=") + # If a quoted list, convert to array + if value && value.include?('"') + value.delete!('"') + value = value.split + end + options[key.to_sym] = value || true + end + + options[:linenos] = "inline" if options[:linenos] == true + options + end + + def render_pygments(code, is_safe) + Jekyll::External.require_with_graceful_fail("pygments") unless defined?(Pygments) + + highlighted_code = Pygments.highlight( + code, + :lexer => @lang, + :options => sanitized_opts(@highlight_options, is_safe) + ) + + if highlighted_code.nil? + Jekyll.logger.error <<-MSG +There was an error highlighting your code: + +#{code} + +While attempting to convert the above code, Pygments.rb returned an unacceptable value. +This is usually a timeout problem solved by running `jekyll build` again. +MSG + raise ArgumentError, "Pygments.rb returned an unacceptable value "\ + "when attempting to highlight some code." + end + + highlighted_code.sub('<div class="highlight"><pre>', "").sub("</pre></div>", "") + end + + def render_rouge(code) + formatter = Jekyll::Utils::Rouge.html_formatter( + :line_numbers => @highlight_options[:linenos], + :wrap => false, + :css_class => "highlight", + :gutter_class => "gutter", + :code_class => "code" + ) + lexer = ::Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText + formatter.format(lexer.lex(code)) + end + + def render_codehighlighter(code) + h(code).strip + end + + def add_code_tag(code) + code_attributes = [ + "class=\"language-#{@lang.to_s.tr("+", "-")}\"", + "data-lang=\"#{@lang}\"", + ].join(" ") + "<figure class=\"highlight\"><pre><code #{code_attributes}>"\ + "#{code.chomp}</code></pre></figure>" + end + end + end +end + +Liquid::Template.register_tag("highlight", Jekyll::Tags::HighlightBlock) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/include.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/include.rb new file mode 100644 index 000000000000..8ec5854b8af5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/include.rb @@ -0,0 +1,236 @@ +# frozen_string_literal: true + +module Jekyll + module Tags + class IncludeTagError < StandardError + attr_accessor :path + + def initialize(msg, path) + super(msg) + @path = path + end + end + + class IncludeTag < Liquid::Tag + VALID_SYNTAX = %r! + ([\w-]+)\s*=\s* + (?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+)) + !x + VARIABLE_SYNTAX = %r! + (?<variable>[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+) + (?<params>.*) + !mx + + FULL_VALID_SYNTAX = %r!\A\s*(?:#{VALID_SYNTAX}(?=\s|\z)\s*)*\z! + VALID_FILENAME_CHARS = %r!^[\w/\.-]+$! + INVALID_SEQUENCES = %r![./]{2,}! + + def initialize(tag_name, markup, tokens) + super + matched = markup.strip.match(VARIABLE_SYNTAX) + if matched + @file = matched["variable"].strip + @params = matched["params"].strip + else + @file, @params = markup.strip.split(%r!\s+!, 2) + end + validate_params if @params + @tag_name = tag_name + end + + def syntax_example + "{% #{@tag_name} file.ext param='value' param2='value' %}" + end + + def parse_params(context) + params = {} + markup = @params + + while (match = VALID_SYNTAX.match(markup)) + markup = markup[match.end(0)..-1] + + value = if match[2] + match[2].gsub(%r!\\"!, '"') + elsif match[3] + match[3].gsub(%r!\\'!, "'") + elsif match[4] + context[match[4]] + end + + params[match[1]] = value + end + params + end + + def validate_file_name(file) + if file =~ INVALID_SEQUENCES || file !~ VALID_FILENAME_CHARS + raise ArgumentError, <<-MSG +Invalid syntax for include tag. File contains invalid characters or sequences: + + #{file} + +Valid syntax: + + #{syntax_example} + +MSG + end + end + + def validate_params + unless @params =~ FULL_VALID_SYNTAX + raise ArgumentError, <<-MSG +Invalid syntax for include tag: + + #{@params} + +Valid syntax: + + #{syntax_example} + +MSG + end + end + + # Grab file read opts in the context + def file_read_opts(context) + context.registers[:site].file_read_opts + end + + # Render the variable if required + def render_variable(context) + if @file =~ VARIABLE_SYNTAX + partial = context.registers[:site] + .liquid_renderer + .file("(variable)") + .parse(@file) + partial.render!(context) + end + end + + def tag_includes_dirs(context) + context.registers[:site].includes_load_paths.freeze + end + + def locate_include_file(context, file, safe) + includes_dirs = tag_includes_dirs(context) + includes_dirs.each do |dir| + path = File.join(dir.to_s, file.to_s) + return path if valid_include_file?(path, dir.to_s, safe) + end + raise IOError, could_not_locate_message(file, includes_dirs, safe) + end + + def render(context) + site = context.registers[:site] + + file = render_variable(context) || @file + validate_file_name(file) + + path = locate_include_file(context, file, site.safe) + return unless path + + add_include_to_dependency(site, path, context) + + partial = load_cached_partial(path, context) + + context.stack do + context["include"] = parse_params(context) if @params + begin + partial.render!(context) + rescue Liquid::Error => e + e.template_name = path + e.markup_context = "included " if e.markup_context.nil? + raise e + end + end + end + + def add_include_to_dependency(site, path, context) + if context.registers[:page] && context.registers[:page].key?("path") + site.regenerator.add_dependency( + site.in_source_dir(context.registers[:page]["path"]), + path + ) + end + end + + def load_cached_partial(path, context) + context.registers[:cached_partials] ||= {} + cached_partial = context.registers[:cached_partials] + + if cached_partial.key?(path) + cached_partial[path] + else + unparsed_file = context.registers[:site] + .liquid_renderer + .file(path) + begin + cached_partial[path] = unparsed_file.parse(read_file(path, context)) + rescue Liquid::Error => e + e.template_name = path + e.markup_context = "included " if e.markup_context.nil? + raise e + end + end + end + + def valid_include_file?(path, dir, safe) + !outside_site_source?(path, dir, safe) && File.file?(path) + end + + def outside_site_source?(path, dir, safe) + safe && !realpath_prefixed_with?(path, dir) + end + + def realpath_prefixed_with?(path, dir) + File.exist?(path) && File.realpath(path).start_with?(dir) + rescue StandardError + false + end + + # This method allows to modify the file content by inheriting from the class. + def read_file(file, context) + File.read(file, **file_read_opts(context)) + end + + private + + def could_not_locate_message(file, includes_dirs, safe) + message = "Could not locate the included file '#{file}' in any of "\ + "#{includes_dirs}. Ensure it exists in one of those directories and" + message + if safe + " is not a symlink as those are not allowed in safe mode." + else + ", if it is a symlink, does not point outside your site source." + end + end + end + + class IncludeRelativeTag < IncludeTag + def tag_includes_dirs(context) + Array(page_path(context)).freeze + end + + def page_path(context) + if context.registers[:page].nil? + context.registers[:site].source + else + site = context.registers[:site] + page_payload = context.registers[:page] + resource_path = \ + if page_payload["collection"].nil? + page_payload["path"] + else + File.join(site.config["collections_dir"], page_payload["path"]) + end + resource_path.sub!(%r!/#excerpt\z!, "") + site.in_source_dir File.dirname(resource_path) + end + end + end + end +end + +Liquid::Template.register_tag("include", Jekyll::Tags::IncludeTag) +Liquid::Template.register_tag("include_relative", Jekyll::Tags::IncludeRelativeTag) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/link.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/link.rb new file mode 100644 index 000000000000..b3f5a2ad40c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/link.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module Jekyll + module Tags + class Link < Liquid::Tag + class << self + def tag_name + self.name.split("::").last.downcase + end + end + + def initialize(tag_name, relative_path, tokens) + super + + @relative_path = relative_path.strip + end + + def render(context) + site = context.registers[:site] + + site.each_site_file do |item| + return item.url if item.relative_path == @relative_path + # This takes care of the case for static files that have a leading / + return item.url if item.relative_path == "/#{@relative_path}" + end + + raise ArgumentError, <<-MSG +Could not find document '#{@relative_path}' in tag '#{self.class.tag_name}'. + +Make sure the document exists and the path is correct. +MSG + end + end + end +end + +Liquid::Template.register_tag(Jekyll::Tags::Link.tag_name, Jekyll::Tags::Link) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/post_url.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/post_url.rb new file mode 100644 index 000000000000..db0b3fa06f61 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/tags/post_url.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true + +module Jekyll + module Tags + class PostComparer + MATCHER = %r!^(.+/)*(\d+-\d+-\d+)-(.*)$! + + attr_reader :path, :date, :slug, :name + + def initialize(name) + @name = name + + all, @path, @date, @slug = *name.sub(%r!^/!, "").match(MATCHER) + unless all + raise Jekyll::Errors::InvalidPostNameError, + "'#{name}' does not contain valid date and/or title." + end + + escaped_slug = Regexp.escape(slug) + @name_regex = %r!^_posts/#{path}#{date}-#{escaped_slug}\.[^.]+| + ^#{path}_posts/?#{date}-#{escaped_slug}\.[^.]+!x + end + + def post_date + @post_date ||= Utils.parse_date(date, + "\"#{date}\" does not contain valid date and/or title.") + end + + def ==(other) + other.relative_path.match(@name_regex) + end + + def deprecated_equality(other) + slug == post_slug(other) && + post_date.year == other.date.year && + post_date.month == other.date.month && + post_date.day == other.date.day + end + + private + # Construct the directory-aware post slug for a Jekyll::Post + # + # other - the Jekyll::Post + # + # Returns the post slug with the subdirectory (relative to _posts) + def post_slug(other) + path = other.basename.split("/")[0...-1].join("/") + if path.nil? || path == "" + other.data["slug"] + else + path + "/" + other.data["slug"] + end + end + end + + class PostUrl < Liquid::Tag + def initialize(tag_name, post, tokens) + super + @orig_post = post.strip + begin + @post = PostComparer.new(@orig_post) + rescue StandardError => e + raise Jekyll::Errors::PostURLError, <<-MSG +Could not parse name of post "#{@orig_post}" in tag 'post_url'. + +Make sure the post exists and the name is correct. + +#{e.class}: #{e.message} +MSG + end + end + + def render(context) + site = context.registers[:site] + + site.posts.docs.each do |p| + return p.url if @post == p + end + + # New matching method did not match, fall back to old method + # with deprecation warning if this matches + + site.posts.docs.each do |p| + next unless @post.deprecated_equality p + Jekyll::Deprecator.deprecation_message "A call to "\ + "'{% post_url #{@post.name} %}' did not match " \ + "a post using the new matching method of checking name " \ + "(path-date-slug) equality. Please make sure that you " \ + "change this tag to match the post's name exactly." + return p.url + end + + raise Jekyll::Errors::PostURLError, <<-MSG +Could not find post "#{@orig_post}" in tag 'post_url'. + +Make sure the post exists and the name is correct. +MSG + end + end + end +end + +Liquid::Template.register_tag("post_url", Jekyll::Tags::PostUrl) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/theme.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/theme.rb new file mode 100644 index 000000000000..8b28fbb47dcc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/theme.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +module Jekyll + class Theme + extend Forwardable + attr_reader :name + def_delegator :gemspec, :version, :version + + def initialize(name) + @name = name.downcase.strip + Jekyll.logger.debug "Theme:", name + Jekyll.logger.debug "Theme source:", root + configure_sass + end + + def root + # Must use File.realpath to resolve symlinks created by rbenv + # Otherwise, Jekyll.sanitized path with prepend the unresolved root + @root ||= File.realpath(gemspec.full_gem_path) + rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP + raise "Path #{gemspec.full_gem_path} does not exist, is not accessible "\ + "or includes a symbolic link loop" + end + + def includes_path + @includes_path ||= path_for "_includes".freeze + end + + def layouts_path + @layouts_path ||= path_for "_layouts".freeze + end + + def sass_path + @sass_path ||= path_for "_sass".freeze + end + + def assets_path + @assets_path ||= path_for "assets".freeze + end + + def configure_sass + return unless sass_path + External.require_with_graceful_fail("sass") unless defined?(Sass) + Sass.load_paths << sass_path + end + + def runtime_dependencies + gemspec.runtime_dependencies + end + + private + + def path_for(folder) + path = realpath_for(folder) + path if path && File.directory?(path) + end + + def realpath_for(folder) + # This resolves all symlinks for the theme subfolder and then ensures + # that the directory remains inside the theme root. This prevents the + # use of symlinks for theme subfolders to escape the theme root. + # However, symlinks are allowed to point to other directories within the theme. + Jekyll.sanitized_path(root, File.realpath(Jekyll.sanitized_path(root, folder.to_s))) + rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP => e + log_realpath_exception(e, folder) + nil + end + + def log_realpath_exception(err, folder) + return if err.is_a?(Errno::ENOENT) + + case err + when Errno::EACCES + Jekyll.logger.error "Theme error:", "Directory '#{folder}' is not accessible." + when Errno::ELOOP + Jekyll.logger.error "Theme error:", + "Directory '#{folder}' includes a symbolic link loop." + end + end + + def gemspec + @gemspec ||= Gem::Specification.find_by_name(name) + rescue Gem::LoadError + raise Jekyll::Errors::MissingDependencyException, + "The #{name} theme could not be found." + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/theme_builder.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/theme_builder.rb new file mode 100644 index 000000000000..36ef71611d43 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/theme_builder.rb @@ -0,0 +1,119 @@ +# frozen_string_literal: true + +class Jekyll::ThemeBuilder + SCAFFOLD_DIRECTORIES = %w( + assets _layouts _includes _sass + ).freeze + + attr_reader :name, :path, :code_of_conduct + + def initialize(theme_name, opts) + @name = theme_name.to_s.tr(" ", "_").squeeze("_") + @path = Pathname.new(File.expand_path(name, Dir.pwd)) + @code_of_conduct = !!opts["code_of_conduct"] + end + + def create! + create_directories + create_starter_files + create_gemspec + create_accessories + initialize_git_repo + end + + def user_name + @user_name ||= `git config user.name`.chomp + end + + def user_email + @user_email ||= `git config user.email`.chomp + end + + private + + def root + @root ||= Pathname.new(File.expand_path("../", __dir__)) + end + + def template_file(filename) + [ + root.join("theme_template", "#{filename}.erb"), + root.join("theme_template", filename.to_s), + ].find(&:exist?) + end + + def template(filename) + erb.render(template_file(filename).read) + end + + def erb + @erb ||= ERBRenderer.new(self) + end + + def mkdir_p(directories) + Array(directories).each do |directory| + full_path = path.join(directory) + Jekyll.logger.info "create", full_path.to_s + FileUtils.mkdir_p(full_path) + end + end + + def write_file(filename, contents) + full_path = path.join(filename) + Jekyll.logger.info "create", full_path.to_s + File.write(full_path, contents) + end + + def create_directories + mkdir_p(SCAFFOLD_DIRECTORIES) + end + + def create_starter_files + %w(page post default).each do |layout| + write_file("_layouts/#{layout}.html", template("_layouts/#{layout}.html")) + end + end + + def create_gemspec + write_file("Gemfile", template("Gemfile")) + write_file("#{name}.gemspec", template("theme.gemspec")) + end + + def create_accessories + accessories = %w(README.md LICENSE.txt) + accessories << "CODE_OF_CONDUCT.md" if code_of_conduct + accessories.each do |filename| + write_file(filename, template(filename)) + end + end + + def initialize_git_repo + Jekyll.logger.info "initialize", path.join(".git").to_s + Dir.chdir(path.to_s) { `git init` } + write_file(".gitignore", template("gitignore")) + end + + class ERBRenderer + extend Forwardable + + def_delegator :@theme_builder, :name, :theme_name + def_delegator :@theme_builder, :user_name, :user_name + def_delegator :@theme_builder, :user_email, :user_email + + def initialize(theme_builder) + @theme_builder = theme_builder + end + + def jekyll_version_with_minor + Jekyll::VERSION.split(".").take(2).join(".") + end + + def theme_directories + SCAFFOLD_DIRECTORIES + end + + def render(contents) + ERB.new(contents).result binding + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/url.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/url.rb new file mode 100644 index 000000000000..87f20e138ebc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/url.rb @@ -0,0 +1,159 @@ +# frozen_string_literal: true + +# Public: Methods that generate a URL for a resource such as a Post or a Page. +# +# Examples +# +# URL.new({ +# :template => /:categories/:title.html", +# :placeholders => {:categories => "ruby", :title => "something"} +# }).to_s +# +module Jekyll + class URL + # options - One of :permalink or :template must be supplied. + # :template - The String used as template for URL generation, + # for example "/:path/:basename:output_ext", where + # a placeholder is prefixed with a colon. + # :placeholders - A hash containing the placeholders which will be + # replaced when used inside the template. E.g. + # { "year" => Time.now.strftime("%Y") } would replace + # the placeholder ":year" with the current year. + # :permalink - If supplied, no URL will be generated from the + # template. Instead, the given permalink will be + # used as URL. + def initialize(options) + @template = options[:template] + @placeholders = options[:placeholders] || {} + @permalink = options[:permalink] + + if (@template || @permalink).nil? + raise ArgumentError, "One of :template or :permalink must be supplied." + end + end + + # The generated relative URL of the resource + # + # Returns the String URL + def to_s + sanitize_url(generated_permalink || generated_url) + end + + # Generates a URL from the permalink + # + # Returns the _unsanitized String URL + def generated_permalink + (@generated_permalink ||= generate_url(@permalink)) if @permalink + end + + # Generates a URL from the template + # + # Returns the unsanitized String URL + def generated_url + @generated_url ||= generate_url(@template) + end + + # Internal: Generate the URL by replacing all placeholders with their + # respective values in the given template + # + # Returns the unsanitized String URL + def generate_url(template) + if @placeholders.is_a? Drops::UrlDrop + generate_url_from_drop(template) + else + generate_url_from_hash(template) + end + end + + def generate_url_from_hash(template) + @placeholders.inject(template) do |result, token| + break result if result.index(":").nil? + if token.last.nil? + # Remove leading "/" to avoid generating urls with `//` + result.gsub("/:#{token.first}", "") + else + result.gsub(":#{token.first}", self.class.escape_path(token.last)) + end + end + end + + # We include underscores in keys to allow for 'i_month' and so forth. + # This poses a problem for keys which are followed by an underscore + # but the underscore is not part of the key, e.g. '/:month_:day'. + # That should be :month and :day, but our key extraction regexp isn't + # smart enough to know that so we have to make it an explicit + # possibility. + def possible_keys(key) + if key.end_with?("_") + [key, key.chomp("_")] + else + [key] + end + end + + def generate_url_from_drop(template) + template.gsub(%r!:([a-z_]+)!) do |match| + pool = possible_keys(match.sub(":", "")) + + winner = pool.find { |key| @placeholders.key?(key) } + if winner.nil? + raise NoMethodError, + "The URL template doesn't have #{pool.join(" or ")} keys. "\ + "Check your permalink template!" + end + + value = @placeholders[winner] + value = "" if value.nil? + replacement = self.class.escape_path(value) + + match.sub(":#{winner}", replacement) + end.squeeze("/") + end + + # Returns a sanitized String URL, stripping "../../" and multiples of "/", + # as well as the beginning "/" so we can enforce and ensure it. + + def sanitize_url(str) + "/#{str}".gsub("..", "/").gsub("./", "").squeeze("/") + end + + # Escapes a path to be a valid URL path segment + # + # path - The path to be escaped. + # + # Examples: + # + # URL.escape_path("/a b") + # # => "/a%20b" + # + # Returns the escaped path. + def self.escape_path(path) + # Because URI.escape doesn't escape "?", "[" and "]" by default, + # specify unsafe string (except unreserved, sub-delims, ":", "@" and "/"). + # + # URI path segment is defined in RFC 3986 as follows: + # segment = *pchar + # pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + # pct-encoded = "%" HEXDIG HEXDIG + # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + # / "*" / "+" / "," / ";" / "=" + path = Addressable::URI.encode(path) + path.encode("utf-8").sub("#", "%23") + end + + # Unescapes a URL path segment + # + # path - The path to be unescaped. + # + # Examples: + # + # URL.unescape_path("/a%20b") + # # => "/a b" + # + # Returns the unescaped path. + def self.unescape_path(path) + Addressable::URI.unencode(path.encode("utf-8")) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils.rb new file mode 100644 index 000000000000..742a862c4e37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils.rb @@ -0,0 +1,370 @@ +# frozen_string_literal: true + +module Jekyll + module Utils + extend self + autoload :Ansi, "jekyll/utils/ansi" + autoload :Exec, "jekyll/utils/exec" + autoload :Internet, "jekyll/utils/internet" + autoload :Platforms, "jekyll/utils/platforms" + autoload :Rouge, "jekyll/utils/rouge" + autoload :ThreadEvent, "jekyll/utils/thread_event" + autoload :WinTZ, "jekyll/utils/win_tz" + + # Constants for use in #slugify + SLUGIFY_MODES = %w(raw default pretty ascii latin).freeze + SLUGIFY_RAW_REGEXP = Regexp.new('\\s+').freeze + SLUGIFY_DEFAULT_REGEXP = Regexp.new("[^[:alnum:]]+").freeze + SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze + SLUGIFY_ASCII_REGEXP = Regexp.new("[^[A-Za-z0-9]]+").freeze + + # Takes an indented string and removes the preceding spaces on each line + + def strip_heredoc(str) + str.gsub(%r!^[ \t]{#{(str.scan(%r!^[ \t]*(?=\S)!).min || "").size}}!, "") + end + + # Takes a slug and turns it into a simple title. + + def titleize_slug(slug) + slug.split("-").map!(&:capitalize).join(" ") + end + + # Non-destructive version of deep_merge_hashes! See that method. + # + # Returns the merged hashes. + def deep_merge_hashes(master_hash, other_hash) + deep_merge_hashes!(master_hash.dup, other_hash) + end + + # Merges a master hash with another hash, recursively. + # + # master_hash - the "parent" hash whose values will be overridden + # other_hash - the other hash whose values will be persisted after the merge + # + # This code was lovingly stolen from some random gem: + # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html + # + # Thanks to whoever made it. + def deep_merge_hashes!(target, overwrite) + merge_values(target, overwrite) + merge_default_proc(target, overwrite) + duplicate_frozen_values(target) + + target + end + + def mergable?(value) + value.is_a?(Hash) || value.is_a?(Drops::Drop) + end + + def duplicable?(obj) + case obj + when nil, false, true, Symbol, Numeric + false + else + true + end + end + + # Read array from the supplied hash favouring the singular key + # and then the plural key, and handling any nil entries. + # + # hash - the hash to read from + # singular_key - the singular key + # plural_key - the plural key + # + # Returns an array + def pluralized_array_from_hash(hash, singular_key, plural_key) + [].tap do |array| + value = value_from_singular_key(hash, singular_key) + value ||= value_from_plural_key(hash, plural_key) + array << value + end.flatten.compact + end + + def value_from_singular_key(hash, key) + hash[key] if hash.key?(key) || (hash.default_proc && hash[key]) + end + + def value_from_plural_key(hash, key) + if hash.key?(key) || (hash.default_proc && hash[key]) + val = hash[key] + case val + when String + val.split + when Array + val.compact + end + end + end + + def transform_keys(hash) + result = {} + hash.each_key do |key| + result[yield(key)] = hash[key] + end + result + end + + # Apply #to_sym to all keys in the hash + # + # hash - the hash to which to apply this transformation + # + # Returns a new hash with symbolized keys + def symbolize_hash_keys(hash) + transform_keys(hash) { |key| key.to_sym rescue key } + end + + # Apply #to_s to all keys in the Hash + # + # hash - the hash to which to apply this transformation + # + # Returns a new hash with stringified keys + def stringify_hash_keys(hash) + transform_keys(hash) { |key| key.to_s rescue key } + end + + # Parse a date/time and throw an error if invalid + # + # input - the date/time to parse + # msg - (optional) the error message to show the user + # + # Returns the parsed date if successful, throws a FatalException + # if not + def parse_date(input, msg = "Input could not be parsed.") + Time.parse(input).localtime + rescue ArgumentError + raise Errors::InvalidDateError, "Invalid date '#{input}': #{msg}" + end + + # Determines whether a given file has + # + # Returns true if the YAML front matter is present. + # rubocop: disable PredicateName + def has_yaml_header?(file) + !!(File.open(file, "rb", &:readline) =~ %r!\A---\s*\r?\n!) + rescue EOFError + false + end + + # Determine whether the given content string contains Liquid Tags or Vaiables + # + # Returns true is the string contains sequences of `{%` or `{{` + def has_liquid_construct?(content) + return false if content.nil? || content.empty? + content.include?("{%") || content.include?("{{") + end + # rubocop: enable PredicateName + + # Slugify a filename or title. + # + # string - the filename or title to slugify + # mode - how string is slugified + # cased - whether to replace all uppercase letters with their + # lowercase counterparts + # + # When mode is "none", return the given string. + # + # When mode is "raw", return the given string, + # with every sequence of spaces characters replaced with a hyphen. + # + # When mode is "default" or nil, non-alphabetic characters are + # replaced with a hyphen too. + # + # When mode is "pretty", some non-alphabetic characters (._~!$&'()+,;=@) + # are not replaced with hyphen. + # + # When mode is "ascii", some everything else except ASCII characters + # a-z (lowercase), A-Z (uppercase) and 0-9 (numbers) are not replaced with hyphen. + # + # When mode is "latin", the input string is first preprocessed so that + # any letters with accents are replaced with the plain letter. Afterwards, + # it follows the "default" mode of operation. + # + # If cased is true, all uppercase letters in the result string are + # replaced with their lowercase counterparts. + # + # Examples: + # slugify("The _config.yml file") + # # => "the-config-yml-file" + # + # slugify("The _config.yml file", "pretty") + # # => "the-_config.yml-file" + # + # slugify("The _config.yml file", "pretty", true) + # # => "The-_config.yml file" + # + # slugify("The _config.yml file", "ascii") + # # => "the-config-yml-file" + # + # slugify("The _config.yml file", "latin") + # # => "the-config-yml-file" + # + # Returns the slugified string. + def slugify(string, mode: nil, cased: false) + mode ||= "default" + return nil if string.nil? + + unless SLUGIFY_MODES.include?(mode) + return cased ? string : string.downcase + end + + # Drop accent marks from latin characters. Everything else turns to ? + if mode == "latin" + I18n.config.available_locales = :en if I18n.config.available_locales.empty? + string = I18n.transliterate(string) + end + + slug = replace_character_sequence_with_hyphen(string, :mode => mode) + + # Remove leading/trailing hyphen + slug.gsub!(%r!^\-|\-$!i, "") + + slug.downcase! unless cased + slug + end + + # Add an appropriate suffix to template so that it matches the specified + # permalink style. + # + # template - permalink template without trailing slash or file extension + # permalink_style - permalink style, either built-in or custom + # + # The returned permalink template will use the same ending style as + # specified in permalink_style. For example, if permalink_style contains a + # trailing slash (or is :pretty, which indirectly has a trailing slash), + # then so will the returned template. If permalink_style has a trailing + # ":output_ext" (or is :none, :date, or :ordinal) then so will the returned + # template. Otherwise, template will be returned without modification. + # + # Examples: + # add_permalink_suffix("/:basename", :pretty) + # # => "/:basename/" + # + # add_permalink_suffix("/:basename", :date) + # # => "/:basename:output_ext" + # + # add_permalink_suffix("/:basename", "/:year/:month/:title/") + # # => "/:basename/" + # + # add_permalink_suffix("/:basename", "/:year/:month/:title") + # # => "/:basename" + # + # Returns the updated permalink template + def add_permalink_suffix(template, permalink_style) + template = template.dup + + case permalink_style + when :pretty + template << "/" + when :date, :ordinal, :none + template << ":output_ext" + else + template << "/" if permalink_style.to_s.end_with?("/") + template << ":output_ext" if permalink_style.to_s.end_with?(":output_ext") + end + + template + end + + # Work the same way as Dir.glob but seperating the input into two parts + # ('dir' + '/' + 'pattern') to make sure the first part('dir') does not act + # as a pattern. + # + # For example, Dir.glob("path[/*") always returns an empty array, + # because the method fails to find the closing pattern to '[' which is ']' + # + # Examples: + # safe_glob("path[", "*") + # # => ["path[/file1", "path[/file2"] + # + # safe_glob("path", "*", File::FNM_DOTMATCH) + # # => ["path/.", "path/..", "path/file1"] + # + # safe_glob("path", ["**", "*"]) + # # => ["path[/file1", "path[/folder/file2"] + # + # dir - the dir where glob will be executed under + # (the dir will be included to each result) + # patterns - the patterns (or the pattern) which will be applied under the dir + # flags - the flags which will be applied to the pattern + # + # Returns matched pathes + def safe_glob(dir, patterns, flags = 0) + return [] unless Dir.exist?(dir) + pattern = File.join(Array(patterns)) + return [dir] if pattern.empty? + Dir.chdir(dir) do + Dir.glob(pattern, flags).map { |f| File.join(dir, f) } + end + end + + # Returns merged option hash for File.read of self.site (if exists) + # and a given param + def merged_file_read_opts(site, opts) + merged = (site ? site.file_read_opts : {}).merge(opts) + if merged[:encoding] && !merged[:encoding].start_with?("bom|") + merged[:encoding] = "bom|#{merged[:encoding]}" + end + if merged["encoding"] && !merged["encoding"].start_with?("bom|") + merged["encoding"] = "bom|#{merged["encoding"]}" + end + merged + end + + private + def merge_values(target, overwrite) + target.merge!(overwrite) do |_key, old_val, new_val| + if new_val.nil? + old_val + elsif mergable?(old_val) && mergable?(new_val) + deep_merge_hashes(old_val, new_val) + else + new_val + end + end + end + + private + def merge_default_proc(target, overwrite) + if target.is_a?(Hash) && overwrite.is_a?(Hash) && target.default_proc.nil? + target.default_proc = overwrite.default_proc + end + end + + private + def duplicate_frozen_values(target) + target.each do |key, val| + target[key] = val.dup if val.frozen? && duplicable?(val) + end + end + + # Replace each character sequence with a hyphen. + # + # See Utils#slugify for a description of the character sequence specified + # by each mode. + private + def replace_character_sequence_with_hyphen(string, mode: "default") + replaceable_char = + case mode + when "raw" + SLUGIFY_RAW_REGEXP + when "pretty" + # "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL + # and is allowed in both extN and NTFS. + SLUGIFY_PRETTY_REGEXP + when "ascii" + # For web servers not being able to handle Unicode, the safe + # method is to ditch anything else but latin letters and numeric + # digits. + SLUGIFY_ASCII_REGEXP + else + SLUGIFY_DEFAULT_REGEXP + end + + # Strip according to the mode + string.gsub(replaceable_char, "-") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/ansi.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/ansi.rb new file mode 100644 index 000000000000..b680528eb956 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/ansi.rb @@ -0,0 +1,57 @@ +# Frozen-string-literal: true + +module Jekyll + module Utils + module Ansi + extend self + + ESCAPE = format("%c", 27) + MATCH = %r!#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m!ix + COLORS = { + :red => 31, + :green => 32, + :black => 30, + :magenta => 35, + :yellow => 33, + :white => 37, + :blue => 34, + :cyan => 36, + }.freeze + + # Strip ANSI from the current string. It also strips cursor stuff, + # well some of it, and it also strips some other stuff that a lot of + # the other ANSI strippers don't. + + def strip(str) + str.gsub MATCH, "" + end + + # + + def has?(str) + !!(str =~ MATCH) + end + + # Reset the color back to the default color so that you do not leak any + # colors when you move onto the next line. This is probably normally + # used as part of a wrapper so that we don't leak colors. + + def reset(str = "") + @ansi_reset ||= format("%c[0m", 27) + "#{@ansi_reset}#{str}" + end + + # SEE: `self::COLORS` for a list of methods. They are mostly + # standard base colors supported by pretty much any xterm-color, we do + # not need more than the base colors so we do not include them. + # Actually... if I'm honest we don't even need most of the + # base colors. + + COLORS.each do |color, num| + define_method color do |str| + "#{format("%c", 27)}[#{num}m#{str}#{reset}" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/exec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/exec.rb new file mode 100644 index 000000000000..fee8b2d2e5be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/exec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require "open3" + +module Jekyll + module Utils + module Exec + extend self + + # Runs a program in a sub-shell. + # + # *args - a list of strings containing the program name and arguments + # + # Returns a Process::Status and a String of output in an array in + # that order. + def run(*args) + stdin, stdout, stderr, process = Open3.popen3(*args) + out = stdout.read.strip + err = stderr.read.strip + + [stdin, stdout, stderr].each(&:close) + [process.value, out + err] + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/internet.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/internet.rb new file mode 100644 index 000000000000..f895596c548f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/internet.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module Jekyll + module Utils + module Internet + + # Public: Determine whether the present device has a connection to + # the Internet. This allows plugin writers which require the outside + # world to have a neat fallback mechanism for offline building. + # + # Example: + # if Internet.connected? + # Typhoeus.get("https://pages.github.com/versions.json") + # else + # Jekyll.logger.warn "Warning:", "Version check has been disabled." + # Jekyll.logger.warn "", "Connect to the Internet to enable it." + # nil + # end + # + # Returns true if a DNS call can successfully be made, or false if not. + module_function + def connected? + !dns("example.com").nil? + end + + private + module_function + def dns(domain) + require "resolv" + Resolv::DNS.open do |resolver| + resolver.getaddress(domain) + end + rescue Resolv::ResolvError, Resolv::ResolvTimeout + nil + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/platforms.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/platforms.rb new file mode 100644 index 000000000000..6665527a726b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/platforms.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +module Jekyll + module Utils + module Platforms + extend self + + # Provides jruby? and mri? which respectively detect these two types of + # tested Engines we support, in the future we might probably support the + # other one that everyone used to talk about. + + { :jruby? => "jruby", :mri? => "ruby" }.each do |k, v| + define_method k do + ::RUBY_ENGINE == v + end + end + + # -- + # Allows you to detect "real" Windows, or what we would consider + # "real" Windows. That is, that we can pass the basic test and the + # /proc/version returns nothing to us. + # -- + + def vanilla_windows? + RbConfig::CONFIG["host_os"] =~ %r!mswin|mingw|cygwin!i && \ + !proc_version + end + + # -- + # XXX: Remove in 4.0 + # -- + + alias_method :really_windows?, \ + :vanilla_windows? + + # + + def bash_on_windows? + RbConfig::CONFIG["host_os"] =~ %r!linux! && \ + proc_version =~ %r!microsoft!i + end + + # + + def windows? + vanilla_windows? || bash_on_windows? + end + + # + + def linux? + RbConfig::CONFIG["host_os"] =~ %r!linux! && \ + proc_version !~ %r!microsoft!i + end + + # Provides windows?, linux?, osx?, unix? so that we can detect + # platforms. This is mostly useful for `jekyll doctor` and for testing + # where we kick off certain tests based on the platform. + + { :osx? => %r!darwin|mac os!, :unix? => %r!solaris|bsd! }.each do |k, v| + define_method k do + !!( + RbConfig::CONFIG["host_os"] =~ v + ) + end + end + + # + + private + def proc_version + @proc_version ||= begin + Pathutil.new( + "/proc/version" + ).read + rescue Errno::ENOENT + nil + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/rouge.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/rouge.rb new file mode 100644 index 000000000000..9afc689fe800 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/rouge.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +Jekyll::External.require_with_graceful_fail("rouge") + +module Jekyll + module Utils + module Rouge + + def self.html_formatter(*args) + if old_api? + ::Rouge::Formatters::HTML.new(*args) + else + ::Rouge::Formatters::HTMLLegacy.new(*args) + end + end + + def self.old_api? + ::Rouge.version.to_s < "2" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/thread_event.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/thread_event.rb new file mode 100644 index 000000000000..5afb50d93eb5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/thread_event.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require "thread" + +module Jekyll + module Utils + # Based on the pattern and code from + # https://emptysqua.re/blog/an-event-synchronization-primitive-for-ruby/ + class ThreadEvent + attr_reader :flag + + def initialize + @lock = Mutex.new + @cond = ConditionVariable.new + @flag = false + end + + def set + @lock.synchronize do + yield if block_given? + @flag = true + @cond.broadcast + end + end + + def wait + @lock.synchronize do + unless @flag + @cond.wait(@lock) + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/win_tz.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/win_tz.rb new file mode 100644 index 000000000000..239650f71feb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/utils/win_tz.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +module Jekyll + module Utils + module WinTZ + extend self + + # Public: Calculate the Timezone for Windows when the config file has a defined + # 'timezone' key. + # + # timezone - the IANA Time Zone specified in "_config.yml" + # + # Returns a string that ultimately re-defines ENV["TZ"] in Windows + def calculate(timezone) + External.require_with_graceful_fail("tzinfo") unless defined?(TZInfo) + tz = TZInfo::Timezone.get(timezone) + difference = Time.now.to_i - tz.now.to_i + # + # POSIX style definition reverses the offset sign. + # e.g. Eastern Standard Time (EST) that is 5Hrs. to the 'west' of Prime Meridian + # is denoted as: + # EST+5 (or) EST+05:00 + # Reference: http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + sign = difference < 0 ? "-" : "+" + offset = sign == "-" ? "+" : "-" unless difference.zero? + # + # convert the difference (in seconds) to hours, as a rational number, and perform + # a modulo operation on it. + modulo = modulo_of(rational_hour(difference)) + # + # Format the hour as a two-digit number. + # Establish the minutes based on modulo expression. + hh = format("%02d", absolute_hour(difference).ceil) + mm = modulo.zero? ? "00" : "30" + + Jekyll.logger.debug "Timezone:", "#{timezone} #{offset}#{hh}:#{mm}" + # + # Note: The 3-letter-word below doesn't have a particular significance. + "WTZ#{sign}#{hh}:#{mm}" + end + + private + + # Private: Convert given seconds to an hour as a rational number. + # + # seconds - supplied as an integer, it is converted to a rational number. + # 3600 - no. of seconds in an hour. + # + # Returns a rational number. + def rational_hour(seconds) + seconds.to_r / 3600 + end + + # Private: Convert given seconds to an hour as an absolute number. + # + # seconds - supplied as an integer, it is converted to its absolute. + # 3600 - no. of seconds in an hour. + # + # Returns an integer. + def absolute_hour(seconds) + seconds.abs / 3600 + end + + # Private: Perform a modulo operation on a given fraction. + # + # fraction - supplied as a rational number, its numerator is divided + # by its denominator and the remainder returned. + # + # Returns an integer. + def modulo_of(fraction) + fraction.numerator % fraction.denominator + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/version.rb new file mode 100644 index 000000000000..95a643b2350f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/jekyll/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Jekyll + VERSION = "3.9.0".freeze +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/.gitignore b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/.gitignore new file mode 100644 index 000000000000..45c150536e5f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/.gitignore @@ -0,0 +1,3 @@ +_site +.sass-cache +.jekyll-metadata diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/404.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/404.html new file mode 100644 index 000000000000..c472b4ea0a78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/404.html @@ -0,0 +1,24 @@ +--- +layout: default +--- + +<style type="text/css" media="screen"> + .container { + margin: 10px auto; + max-width: 600px; + text-align: center; + } + h1 { + margin: 30px 0; + font-size: 4em; + line-height: 1; + letter-spacing: -1px; + } +</style> + +<div class="container"> + <h1>404</h1> + + <p><strong>Page not found :(</strong></p> + <p>The requested page could not be found.</p> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/_config.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/_config.yml new file mode 100644 index 000000000000..f91333e51028 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/_config.yml @@ -0,0 +1,43 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'bundle exec jekyll serve'. If you change this file, please restart the server process. + +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. +title: Your awesome title +email: your-email@example.com +description: >- # this means to ignore newlines until "baseurl:" + Write an awesome description for your new site here. You can edit this + line in _config.yml. It will appear in your document head meta (for + Google search results) and in your feed.xml site description. +baseurl: "" # the subpath of your site, e.g. /blog +url: "" # the base hostname & protocol for your site, e.g. http://example.com +twitter_username: jekyllrb +github_username: jekyll + +# Build settings +markdown: kramdown +theme: minima +plugins: + - jekyll-feed + +# Exclude from processing. +# The following items will not be processed, by default. Create a custom list +# to override the default setting. +# exclude: +# - Gemfile +# - Gemfile.lock +# - node_modules +# - vendor/bundle/ +# - vendor/cache/ +# - vendor/gems/ +# - vendor/ruby/ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb new file mode 100644 index 000000000000..8d8f7c162bd1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb @@ -0,0 +1,25 @@ +--- +layout: post +title: "Welcome to Jekyll!" +date: <%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %> +categories: jekyll update +--- +You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. + +To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. + +Jekyll also offers powerful support for code snippets: + +{% highlight ruby %} +def print_hi(name) + puts "Hi, #{name}" +end +print_hi('Tom') +#=> prints 'Hi, Tom' to STDOUT. +{% endhighlight %} + +Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk]. + +[jekyll-docs]: https://jekyllrb.com/docs/home +[jekyll-gh]: https://github.com/jekyll/jekyll +[jekyll-talk]: https://talk.jekyllrb.com/ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/about.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/about.md new file mode 100644 index 000000000000..8b4e0b28c83e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/about.md @@ -0,0 +1,18 @@ +--- +layout: page +title: About +permalink: /about/ +--- + +This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](https://jekyllrb.com/) + +You can find the source code for Minima at GitHub: +[jekyll][jekyll-organization] / +[minima](https://github.com/jekyll/minima) + +You can find the source code for Jekyll at GitHub: +[jekyll][jekyll-organization] / +[jekyll](https://github.com/jekyll/jekyll) + + +[jekyll-organization]: https://github.com/jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/index.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/index.md new file mode 100644 index 000000000000..06715078416f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/site_template/index.md @@ -0,0 +1,6 @@ +--- +# Feel free to add content and custom Front Matter to this file. +# To modify the layout, see https://jekyllrb.com/docs/themes/#overriding-theme-defaults + +layout: home +--- diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/CODE_OF_CONDUCT.md.erb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/CODE_OF_CONDUCT.md.erb new file mode 100644 index 000000000000..2b2c7734f87d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/CODE_OF_CONDUCT.md.erb @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at <%= user_email %>. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/Gemfile new file mode 100644 index 000000000000..bb94df82938c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/Gemfile @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +source "https://rubygems.org" +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/LICENSE.txt.erb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/LICENSE.txt.erb new file mode 100644 index 000000000000..38a0eb4e8e79 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/LICENSE.txt.erb @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) <%= Time.now.year %> <%= user_name %> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/README.md.erb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/README.md.erb new file mode 100644 index 000000000000..ff8ad05fb285 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/README.md.erb @@ -0,0 +1,52 @@ +# <%= theme_name %> + +Welcome to your new Jekyll theme! In this directory, you'll find the files you need to be able to package up your theme into a gem. Put your layouts in `_layouts`, your includes in `_includes`, your sass files in `_sass` and any other assets in `assets`. + +To experiment with this code, add some sample content and run `bundle exec jekyll serve` – this directory is setup just like a Jekyll site! + +TODO: Delete this and the text above, and describe your gem + + +## Installation + +Add this line to your Jekyll site's `Gemfile`: + +```ruby +gem <%= theme_name.inspect %> +``` + +And add this line to your Jekyll site's `_config.yml`: + +```yaml +theme: <%= theme_name %> +``` + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install <%= theme_name %> + +## Usage + +TODO: Write usage instructions here. Describe your available layouts, includes, sass and/or assets. + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/hello. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. + +## Development + +To set up your environment to develop this theme, run `bundle install`. + +Your theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal. + +When your theme is released, only the files in `_layouts`, `_includes`, `_sass` and `assets` tracked with Git will be bundled. +To add a custom directory to your theme-gem, please edit the regexp in `<%= theme_name %>.gemspec` accordingly. + +## License + +The theme is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). + diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/_layouts/default.html new file mode 100644 index 000000000000..cddd07099f28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/_layouts/default.html @@ -0,0 +1 @@ +{{ content }} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/_layouts/page.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/_layouts/page.html new file mode 100644 index 000000000000..5e7112684af4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/_layouts/page.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/_layouts/post.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/_layouts/post.html new file mode 100644 index 000000000000..5e7112684af4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/_layouts/post.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{{ content }} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/_config.yml.erb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/_config.yml.erb new file mode 100644 index 000000000000..82e8d42df7bd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/_config.yml.erb @@ -0,0 +1 @@ +theme: <%= theme_name %> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/_post.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/_post.md new file mode 100644 index 000000000000..145b21de42f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/_post.md @@ -0,0 +1,12 @@ +--- +layout: post +--- + +Eos eu docendi tractatos sapientem, brute option menandri in vix, quando vivendo accommodare te ius. Nec melius fastidii constituam id, viderer theophrastus ad sit, hinc semper periculis cum id. Noluisse postulant assentior est in, no choro sadipscing repudiandae vix. Vis in euismod delenit dignissim. Ex quod nostrum sit, suas decore animal id ius, nobis solet detracto quo te. + +{% comment %} +Might you have an include in your theme? Why not try it here! +{% include my-themes-great-include.html %} +{% endcomment %} + +No laudem altera adolescens has, volumus lucilius eum no. Eam ei nulla audiam efficiantur. Suas affert per no, ei tale nibh sea. Sea ne magna harum, in denique scriptorem sea, cetero alienum tibique ei eos. Labores persequeris referrentur eos ei. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/index.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/index.html new file mode 100644 index 000000000000..b688538cd69d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/index.html @@ -0,0 +1,14 @@ +--- +layout: page +--- + +Lorem ipsum dolor sit amet, quo id prima corrumpit pertinacia, id ius dolor dolores, an veri pertinax explicari mea. Agam solum et qui, his id ludus graeco adipiscing. Duis theophrastus nam in, at his vidisse atomorum. Tantas gloriatur scripserit ne eos. Est wisi tempor habemus at, ei graeco dissentiet eos. Ne usu aliquip sanctus conceptam, te vis ignota animal, modus latine contentiones ius te. + +{% for post in site.posts %} +<h2><a href="{{ post.url }}">{{ post.title }}</a></h2> +<blockquote>{{ post.excerpt }}</blockquote> +{% endfor %} + +Te falli veritus sea, at molestiae scribentur deterruisset vix, et mea zril phaedrum vulputate. No cum dicit consulatu. Ut has nostro noluisse expetendis, te pro quaeque disputando, eu sed summo omnes. Eos at tale aperiam, usu cu propriae quaestio constituto, sed aperiam erroribus temporibus an. + +Quo eu liber mediocritatem, vix an delectus eleifend, iuvaret suscipit ei vel. Partem invenire per an, mea postulant dissentias eu, ius tantas audire nominavi eu. Dicunt tritani veritus ex vis, mei in case sententiae. At exerci democritum nam, cu lobortis iracundia mei. Alia eligendi consectetuer eu sed, paulo docendi noluisse sit ex. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/style.scss new file mode 100644 index 000000000000..7388f52b367c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/example/style.scss @@ -0,0 +1,7 @@ +--- +--- + +// Here, you can test out the Sass/SCSS that you include in your theme. +// Simply `@import` the necessary file(s) to get the proper styles on the site. +// E.g.: +// @import "a-file-from-my-theme"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/gitignore.erb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/gitignore.erb new file mode 100644 index 000000000000..867d3792d5a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/gitignore.erb @@ -0,0 +1,5 @@ +*.gem +.bundle +.sass-cache +_site +Gemfile.lock diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/theme.gemspec.erb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/theme.gemspec.erb new file mode 100644 index 000000000000..3b41e491693c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/lib/theme_template/theme.gemspec.erb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +Gem::Specification.new do |spec| + spec.name = <%= theme_name.inspect %> + spec.version = "0.1.0" + spec.authors = [<%= user_name.inspect %>] + spec.email = [<%= user_email.inspect %>] + + spec.summary = "TODO: Write a short summary, because Rubygems requires one." + spec.homepage = "TODO: Put your gem's website or public repo URL here." + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0").select { |f| f.match(%r!^(<%= theme_directories.join("|") %>|LICENSE|README)!i) } + + spec.add_runtime_dependency "jekyll", "~> <%= jekyll_version_with_minor %>" + + spec.add_development_dependency "bundler", "~> 1.16" + spec.add_development_dependency "rake", "~> 12.0" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/rubocop/jekyll.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/rubocop/jekyll.rb new file mode 100644 index 000000000000..31236b8ab15a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/rubocop/jekyll.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +Dir[File.join(File.expand_path("jekyll", __dir__), "*.rb")].each do |ruby_file| + require ruby_file +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/rubocop/jekyll/no_p_allowed.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/rubocop/jekyll/no_p_allowed.rb new file mode 100644 index 000000000000..cc7d997b71f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/rubocop/jekyll/no_p_allowed.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require "rubocop" + +module RuboCop + module Cop + module Jekyll + class NoPAllowed < Cop + MSG = "Avoid using `p` to print things. Use `Jekyll.logger` instead.".freeze + + def_node_search :p_called?, <<-PATTERN + (send _ :p _) + PATTERN + + def on_send(node) + if p_called?(node) + add_offense(node, :location => :selector) + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/rubocop/jekyll/no_puts_allowed.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/rubocop/jekyll/no_puts_allowed.rb new file mode 100644 index 000000000000..a666aacbfc33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-3.9.0/rubocop/jekyll/no_puts_allowed.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require "rubocop" + +module RuboCop + module Cop + module Jekyll + class NoPutsAllowed < Cop + MSG = "Avoid using `puts` to print things. Use `Jekyll.logger` instead.".freeze + + def_node_search :puts_called?, <<-PATTERN + (send nil? :puts _) + PATTERN + + def on_send(node) + if puts_called?(node) + add_offense(node, :location => :selector) + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/LICENSE.md new file mode 100644 index 000000000000..4a831d15ad37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Vincent Wochnik. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/README.md new file mode 100644 index 000000000000..61c3cf8a049d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/README.md @@ -0,0 +1,62 @@ +# Jekyll Autoprefixer [![Gem Version](https://badge.fury.io/rb/jekyll-autoprefixer.png)](http://badge.fury.io/rb/jekyll-autoprefixer) + +> Autoprefixer integration for Jekyll + +This plugin provides simple autoprefixer support for Jekyll. + +## Installation + +This plugin is available as a [RubyGem][ruby-gem]. + +Add this line to your application's `Gemfile`: + +``` +gem 'jekyll-autoprefixer' +``` + +And then execute the `bundle` command to install the gem. + +Alternatively, you can also manually install the gem using the following command: + +``` +$ gem install jekyll-autoprefixer +``` + +After the plugin has been installed successfully, add the following lines to your `_config.yml` in order to tell Jekyll to use the plugin: + +``` +plugins: +- jekyll-autoprefixer +``` + +## Getting Started + +No additional steps are required. All written CSS files inside the destination +directory are overwritten with the output of autoprefixer. + +Optionally, you can specify the browsers for which autoprefixer is supposed to generate prefixes inside your configuration: + +``` +autoprefixer: + browsers: + - last 2 versions +``` + +You can also specify that autoprefixer should only work in production mode: + +``` +autoprefixer: + only_production: true +``` + +# Contribute + +Fork this repository, make your changes and then issue a pull request. If you find bugs or have new ideas that you do not want to implement yourself, file a bug report. + +# Copyright + +Copyright (c) 2015 Vincent Wochnik. + +License: MIT + +[ruby-gem]: https://rubygems.org/gems/jekyll-email-protect diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll-autoprefixer.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll-autoprefixer.rb new file mode 100644 index 000000000000..310d91cfd32a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll-autoprefixer.rb @@ -0,0 +1,25 @@ +# Frozen-string-literal: true +# Encoding: utf-8 + +require 'jekyll' + +require_relative 'jekyll/patches' +require_relative 'jekyll/autoprefixer' + +Jekyll::Hooks.register :site, :after_reset do |site| + # create new autoprefixer instance + site.autoprefixer = Jekyll::Autoprefixer::Autoprefixer.new(site) +end + +Jekyll::Hooks.register :site, :post_render do |site| + site.each_site_file do |item| + if site.regenerator.regenerate?(item) + ext = File.extname(item.destination(site.dest)) + site.autoprefixer.batch.push(item) if ext == ".css" + end + end +end + +Jekyll::Hooks.register :site, :post_write do |site| + site.autoprefixer.process +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/autoprefixer.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/autoprefixer.rb new file mode 100644 index 000000000000..f778c24d9a22 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/autoprefixer.rb @@ -0,0 +1,11 @@ +# Frozen-string-literal: true +# Encoding: utf-8 + +module Jekyll + module Autoprefixer + + # plugin requires + require_relative 'autoprefixer/autoprefixer' + require_relative 'autoprefixer/version' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/autoprefixer/autoprefixer.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/autoprefixer/autoprefixer.rb new file mode 100644 index 000000000000..f64a615f573a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/autoprefixer/autoprefixer.rb @@ -0,0 +1,36 @@ +# Frozen-string-literal: true +# Encoding: utf-8 + +require 'autoprefixer-rails' + +module Jekyll + module Autoprefixer + class Autoprefixer + attr_reader :site, :batch + + def initialize(site) + @site = site + @batch = Array.new + end + + def process() + options = @site.config['autoprefixer'] || {} + + if !options['only_production'] || Jekyll.env == "production" + @batch.each do |item| + path = item.destination(@site.dest) + + File.open(path, 'r+') do |file| + content = file.read + file.truncate(0) + file.rewind + file.write(AutoprefixerRails.process(content, options)) + end + end + end + + @batch.clear + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/autoprefixer/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/autoprefixer/version.rb new file mode 100644 index 000000000000..ce06015c35aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/autoprefixer/version.rb @@ -0,0 +1,5 @@ +module Jekyll + module Autoprefixer + VERSION = '1.0.2' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/patches.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/patches.rb new file mode 100644 index 000000000000..e0390dfd931b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/patches.rb @@ -0,0 +1,4 @@ +# Frozen-string-literal: true +# Encoding: utf-8 + +require_relative 'patches/jekyll/site' diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/patches/jekyll/site.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/patches/jekyll/site.rb new file mode 100644 index 000000000000..17aee1b85529 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-autoprefixer-1.0.2/lib/jekyll/patches/jekyll/site.rb @@ -0,0 +1,8 @@ +# Frozen-string-literal: true +# Encoding: utf-8 + +module Jekyll + class Site + attr_accessor :autoprefixer + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/CODEOWNERS b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/CODEOWNERS new file mode 100644 index 000000000000..75822572e4a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/CODEOWNERS @@ -0,0 +1,3 @@ +# Require @benbalter's :+1: for changes to the .github repo-config files +# mainly due to https://github.com/probot/settings privilege escalation +.github/* @benbalter diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/ISSUE_TEMPLATE/bug_report.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000000..aedf0813c314 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,28 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +### Describe the bug + +A clear and concise description of what the bug is. + +### Steps to reproduce the behavior + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +### Expected behavior + +A clear and concise description of what you expected to happen. + +### Screenshots + +If applicable, add screenshots to help explain your problem. + +### Additional context + +Add any other context about the problem here. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/ISSUE_TEMPLATE/feature_request.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000000..7a8d46c7b33a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,21 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +### Is your feature request related to a problem? Please describe the problem you're trying to solve. + +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +### Describe the solution you'd like + +A clear and concise description of what you want to happen. + +### Describe alternatives you've considered + +A clear and concise description of any alternative solutions or features you've considered. + +### Additional context + +Add any other context or screenshots about the feature request here. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/config.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/config.yml new file mode 100644 index 000000000000..a0010ab63701 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/config.yml @@ -0,0 +1,23 @@ +# Behaviorbot config. See https://github.com/behaviorbot/ for more information. +# Note: Please Don't edit this file directly. +# Edit https://github.com/benbalter/shared-community-files instead. + +# Configuration for update-docs - https://github.com/behaviorbot/update-docs +updateDocsComment: "Thanks for the pull request! If you are making any changes to the user-facing functionality, please be sure to update the documentation in the `README` or `docs/` folder alongside your change. :heart:" + +# Configuration for request-info - https://github.com/behaviorbot/request-info +requestInfoReplyComment: Thanks for this. Do you mind providing a bit more information about what problem you're trying to solve? +requestInfoLabelToAdd: more-information-needed + +# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome +#newIssueWelcomeComment: > +# Welcome! + +# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome +newPRWelcomeComment: Welcome! Congrats on your first pull request to Jekyll Avatar. If you haven't already, please be sure to check out [the contributing guidelines](https://github.com/benbalter/jekyll-avatar/blob/master/docs/CONTRIBUTING.md). + +# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge +firstPRMergeComment: "Congrats on getting your first pull request to Jekyll Avatar merged! Without amazing humans like you submitting pull requests, we couldn’t run this project. You rock! :tada:<br /><br />If you're interested in tackling another bug or feature, take a look at [the open issues](https://github.com/benbalter/jekyll-avatar/issues), especially those [labeled `help wanted`](https://github.com/benbalter/jekyll-avatar/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22)." + +# Bug workaround +contact_links: [] diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/funding.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/funding.yml new file mode 100644 index 000000000000..6023e4312c72 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/funding.yml @@ -0,0 +1 @@ +patreon: benbalter diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/no-response.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/no-response.yml new file mode 100644 index 000000000000..87344a5627a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/no-response.yml @@ -0,0 +1,15 @@ +# Configuration for probot-no-response - https://github.com/probot/no-response +# Note: Please Don't edit this file directly. +# Edit https://github.com/benbalter/shared-community-files instead. + +# Number of days of inactivity before an Issue is closed for lack of response +daysUntilClose: 14 +# Label requiring a response +responseRequiredLabel: more-information-needed +# Comment to post when closing an Issue for lack of response. Set to `false` to disable +closeComment: > + This issue has been automatically closed because there has been no response + to our request for more information from the original author. With only the + information that is currently in the issue, we don't have enough information + to take action. Please reach out if you have or find the answers we need so + that we can investigate further. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/release-drafter.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/release-drafter.yml new file mode 100644 index 000000000000..a4dce4c2b4b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/release-drafter.yml @@ -0,0 +1,4 @@ +template: | + ## What's Changed + + $CHANGES diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/settings.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/settings.yml new file mode 100644 index 000000000000..1ab325abf3f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/settings.yml @@ -0,0 +1,33 @@ +# Repository settings set via https://github.com/probot/settings +# Note: Please Don't edit this file directly. +# Edit https://github.com/benbalter/shared-community-files instead. + +repository: + has_issues: true + has_wiki: false + has_projects: false + has_downloads: false + +labels: + - name: help wanted + oldname: help-wanted + color: 0e8a16 + - name: more-information-needed + color: d93f0b + - name: bug + color: b60205 + - name: feature + color: 1d76db + - name: good first issue + color: "5319e7" + +# Not currently implemented by probot/settings, but manually implemented in script/deploy +branch_protection: + restrictions: null + enforce_admins: false + required_status_checks: + strict: true + contexts: + - "continuous-integration/travis-ci" + required_pull_request_reviews: + require_code_owner_reviews: true diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/stale.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/stale.yml new file mode 100644 index 000000000000..801709fa2523 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.github/stale.yml @@ -0,0 +1,29 @@ +# Configuration for probot-stale - https://github.com/probot/stale +# Note: Please Don't edit this file directly. +# Edit https://github.com/benbalter/shared-community-files instead. + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 60 + +# Number of days of inactivity before a stale Issue or Pull Request is closed +daysUntilClose: 7 + +# Issues or Pull Requests with these labels will never be considered stale +exemptLabels: + - pinned + - security + +# Label to use when marking as stale +staleLabel: wontfix + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + +# Comment to post when closing a stale Issue or Pull Request. Set to `false` to disable +closeComment: false + +# Limit to only `issues` or `pulls` +# only: issues diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.gitignore new file mode 100644 index 000000000000..b7e772516738 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.gitignore @@ -0,0 +1,10 @@ +/.bundle/ +/.yardoc +/Gemfile.lock +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ +*.gem diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.rspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.rspec new file mode 100644 index 000000000000..8c18f1abdd41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.rspec @@ -0,0 +1,2 @@ +--format documentation +--color diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.rubocop.yml new file mode 100644 index 000000000000..6260c43d7433 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.rubocop.yml @@ -0,0 +1,19 @@ +inherit_from: .rubocop_todo.yml + +require: rubocop-jekyll +inherit_gem: + rubocop-jekyll: .rubocop.yml + +Naming/FileName: + Enabled: false + +Metrics/LineLength: + Exclude: + - spec/*/** + +Metrics/BlockLength: + Enabled: false + +AllCops: + Exclude: + - vendor/**/* diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.rubocop_todo.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.rubocop_todo.yml new file mode 100644 index 000000000000..178a46eacccc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.rubocop_todo.yml @@ -0,0 +1,46 @@ +# This configuration was generated by +# `rubocop --auto-gen-config` +# on 2019-04-18 23:25:25 +0530 using RuboCop version 0.66.0. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle. +# SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent +Layout/IndentHeredoc: + Exclude: + - 'spec/jekyll/avatar_spec.rb' + +# Offense count: 2 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle. +# SupportedStyles: braces, no_braces, context_dependent +Style/BracesAroundHashParameters: + Exclude: + - 'spec/jekyll/avatar_spec.rb' + - 'spec/spec_helper.rb' + +# Offense count: 2 +# Cop supports --auto-correct. +Style/ExpandPathArguments: + Exclude: + - 'jekyll-avatar.gemspec' + - 'spec/spec_helper.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +Style/RedundantFreeze: + Exclude: + - 'lib/jekyll-avatar/version.rb' + +# Offense count: 6 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyleForMultiline. +# SupportedStylesForMultiline: comma, consistent_comma, no_comma +Style/TrailingCommaInHashLiteral: + Exclude: + - 'lib/jekyll-avatar.rb' + - 'spec/jekyll/avatar_spec.rb' diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.ruby-version b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.ruby-version new file mode 100644 index 000000000000..aedc15bb0c6e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.ruby-version @@ -0,0 +1 @@ +2.5.3 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.travis.yml new file mode 100644 index 000000000000..851c5afb56c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/.travis.yml @@ -0,0 +1,9 @@ +language: ruby +rvm: + - 2.4 +cache: bundler +script: script/cibuild +env: + matrix: + - JEKYLL_VERSION="~> 3.0" + - JEKYLL_VERSION=">= 4.0.0.pre.alpha1" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/Gemfile new file mode 100644 index 000000000000..a1ebfdb0fd68 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +gemspec + +gem "jekyll", ENV["JEKYLL_VERSION"] if ENV["JEKYLL_VERSION"] diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/LICENSE.txt new file mode 100644 index 000000000000..192fb07ae2c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Ben Balter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/README.md new file mode 100644 index 000000000000..4aa350cbc9fb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/README.md @@ -0,0 +1,97 @@ +# Jekyll Avatar + +*A Jekyll plugin for rendering GitHub avatars* + +[![Build Status](https://travis-ci.org/benbalter/jekyll-avatar.svg)](https://travis-ci.org/benbalter/jekyll-avatar) + +Jekyll Avatar makes it easy to add GitHub avatars to your Jekyll site by specifying a username. If performance is a concern, Jekyll Avatar is deeply integrated with the GitHub avatar API, ensuring avatars are cached and load in parallel. It even automatically upgrades users to Retina images, when supported. + +## Installation + +Add the following to your site's `Gemfile`: + +```ruby +gem 'jekyll-avatar' +``` + +And add the following to your site's `_config.yml` file: + +```yaml +plugins: + - jekyll-avatar +``` +Note: If you are using a Jekyll version less than 3.5.0, use the `gems` key instead of `plugins`. + +## Usage + +Simply add the following, anywhere you'd like a user's avatar to appear: + +``` +{% avatar [USERNAME] %} +``` + +With `[USERNAME]` being the user's GitHub username: + +``` +{% avatar hubot %} +``` + +That will output: + +```html +<img class="avatar avatar-small" src="https://avatars3.githubusercontent.com/hubot?v=3&amp;s=40" alt="hubot" srcset="https://avatars3.githubusercontent.com/hubot?v=3&amp;s=40 1x, https://avatars3.githubusercontent.com/hubot?v=3&amp;s=80 2x, https://avatars3.githubusercontent.com/hubot?v=3&amp;s=120 3x, https://avatars3.githubusercontent.com/hubot?v=3&amp;s=160 4x" width="40" height="40" /> +``` + +### Customizing + +You can customize the size of the resulting avatar by passing the size argument: + +``` +{% avatar hubot size=50 %} +``` + +That will output: + +```html +<img class="avatar" src="https://avatars3.githubusercontent.com/hubot?v=3&amp;s=50" alt="hubot" srcset="https://avatars3.githubusercontent.com/hubot?v=3&amp;s=50 1x, https://avatars3.githubusercontent.com/hubot?v=3&amp;s=100 2x, https://avatars3.githubusercontent.com/hubot?v=3&amp;s=150 3x, https://avatars3.githubusercontent.com/hubot?v=3&amp;s=200 4x" width="50" height="50" /> +``` + +### Passing the username as variable + +You can also pass the username as a variable, like this: + +``` +{% assign user="hubot" %} +{% avatar {{ username }} %} +``` + +Or, if the variable is someplace a bit more complex, like a loop: + +``` +{% assign employees = "alice|bob" | split:"|" %} +{% for employee in employees %} + {% avatar user=employee %} +{% endfor %} +``` + +### Lazy loading images + +For pages showing a large number of avatars, you may want to load the images lazily. + +```liquid +{% avatar hubot lazy=true %} +``` + +This will set the `data-src` and `data-srcset` attributes on the `<img>` tag, which is compatible with many lazy load JavaScript plugins, such as: + +* https://www.andreaverlicchi.eu/lazyload/ +* https://appelsiini.net/projects/lazyload/ + +### Using with GitHub Enterprise + +To use Jekyll Avatars with GitHub Enterprise, you must set the `PAGES_AVATARS_URL` environmental variable. + +This should be the full URL to the avatars subdomain or subpath. For example: + +* With subdomain isolation: `PAGES_AVATARS_URL="https://avatars.github.example.com"` +* Without subdomain isolation: `PAGES_AVATARS_URL="https://github.example.com/avatars"` diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/Rakefile new file mode 100644 index 000000000000..ee617bbbf3aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/Rakefile @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "bundler/gem_tasks" +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/docs/CODE_OF_CONDUCT.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/docs/CODE_OF_CONDUCT.md new file mode 100644 index 000000000000..17a935bab097 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/docs/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at ben@balter.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/docs/CONTRIBUTING.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/docs/CONTRIBUTING.md new file mode 100644 index 000000000000..4850dcc70c4d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/docs/CONTRIBUTING.md @@ -0,0 +1,85 @@ +# Contributing to Jekyll Avatar + +Hi there! We're thrilled that you'd like to contribute to Jekyll Avatar. Your help is essential for keeping it great. + +Jekyll Avatar is an open source project supported by the efforts of an entire community and built one contribution at a time by users like you. We'd love for you to get involved. Whatever your level of skill or however much time you can give, your contribution is greatly appreciated. There are many ways to contribute, from writing tutorials or blog posts, improving the documentation, submitting bug reports and feature requests, helping other users by commenting on issues, or writing code which can be incorporated into Jekyll Avatar itself. + +Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests. + + + +## How to report a bug + +Think you found a bug? Please check [the list of open issues](https://github.com/benbalter/jekyll-avatar/issues) to see if your bug has already been reported. If it hasn't please [submit a new issue](https://github.com/benbalter/jekyll-avatar/issues/new). + +Here are a few tips for writing *great* bug reports: + +* Describe the specific problem (e.g., "widget doesn't turn clockwise" versus "getting an error") +* Include the steps to reproduce the bug, what you expected to happen, and what happened instead +* Check that you are using the latest version of the project and its dependencies +* Include what version of the project your using, as well as any relevant dependencies +* Only include one bug per issue. If you have discovered two bugs, please file two issues +* Include screenshots or screencasts whenever possible +* Even if you don't know how to fix the bug, including a failing test may help others track it down + +**If you find a security vulnerability, do not open an issue. Please email ben@balter.com instead.** + +## How to suggest a feature or enhancement + +If you find yourself wishing for a feature that doesn't exist in Jekyll Avatar, you are probably not alone. There are bound to be others out there with similar needs. Many of the features that Jekyll Avatar has today have been added because our users saw the need. + +Feature requests are welcome. But take a moment to find out whether your idea fits with the scope and goals of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Please provide as much detail and context as possible, including describing the problem you're trying to solve. + +[Open an issue](https://github.com/benbalter/jekyll-avatar/issues/new) which describes the feature you would like to see, why you want it, how it should work, etc. + + + +## Your first contribution + +We'd love for you to contribute to the project. Unsure where to begin contributing to Jekyll Avatar? You can start by looking through these "good first issue" and "help wanted" issues: + +* [Good first issues](https://github.com/benbalter/jekyll-avatar/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - issues which should only require a few lines of code and a test or two +* [Help wanted issues](https://github.com/benbalter/jekyll-avatar/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) - issues which may be a bit more involved, but are specifically seeking community contributions + +*p.s. Feel free to ask for help; everyone is a beginner at first* :smiley_cat: + +## How to propose changes + +Here's a few general guidelines for proposing changes: + +* If you are changing any user-facing functionality, please be sure to update the documentation +* If you are adding a new behavior or changing an existing behavior, please be sure to update the corresponding test(s) +* Each pull request should implement **one** feature or bug fix. If you want to add or fix more than one thing, submit more than one pull request +* Do not commit changes to files that are irrelevant to your feature or bug fix +* Don't bump the version number in your pull request (it will be bumped prior to release) +* Write [a good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) + +At a high level, [the process for proposing changes](https://guides.github.com/introduction/flow/) is: + +1. [Fork](https://github.com/benbalter/jekyll-avatar/fork) and clone the project +2. Configure and install the dependencies: `script/bootstrap` +3. Make sure the tests pass on your machine: `script/cibuild` +4. Create a descriptively named branch: `git checkout -b my-branch-name` +5. Make your change, add tests and documentation, and make sure the tests still pass +6. Push to your fork and [submit a pull request](https://github.com/benbalter/jekyll-avatar/compare) describing your change +7. Pat your self on the back and wait for your pull request to be reviewed and merged + +**Interesting in submitting your first Pull Request?** It's easy! You can learn how from this *free* series [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github) + +## Bootstrapping your local development environment + +`script/bootstrap` + +## Running tests + +`script/cibuild` + +## Code of conduct + +This project is governed by [the Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. + +## Additional Resources + +* [Contributing to Open Source on GitHub](https://guides.github.com/activities/contributing-to-open-source/) +* [Using Pull Requests](https://help.github.com/articles/using-pull-requests/) +* [GitHub Help](https://help.github.com) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/docs/SECURITY.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/docs/SECURITY.md new file mode 100644 index 000000000000..472e9b867ec3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/docs/SECURITY.md @@ -0,0 +1,3 @@ +# Security Policy + +To report a security vulnerability, please email [ben@balter.com](mailto:ben@balter.com). diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/jekyll-avatar.gemspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/jekyll-avatar.gemspec new file mode 100644 index 000000000000..8e9c2a139df6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/jekyll-avatar.gemspec @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +lib = File.expand_path("../lib", __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require "jekyll-avatar/version" + +Gem::Specification.new do |spec| + spec.name = "jekyll-avatar" + spec.version = Jekyll::Avatar::VERSION + spec.authors = ["Ben Balter"] + spec.email = ["ben.balter@github.com"] + + spec.summary = "A Jekyll plugin for rendering GitHub avatars" + spec.homepage = "https://github.com/benbalter/jekyll-avatar" + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0").reject do |file| + file.match(%r!^(test|spec|features)/!) + end + + spec.require_paths = ["lib"] + + spec.add_dependency "jekyll", ">= 3.0", "< 5.0" + spec.add_development_dependency "bundler", "> 1.0", "< 3.0" + spec.add_development_dependency "rake", "~> 12.3" + spec.add_development_dependency "rspec", "~> 3.0" + spec.add_development_dependency "rspec-html-matchers", "~> 0.9" + spec.add_development_dependency "rubocop-jekyll", "~> 0.10.0" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/lib/jekyll-avatar.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/lib/jekyll-avatar.rb new file mode 100644 index 000000000000..1849dcdc96f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/lib/jekyll-avatar.rb @@ -0,0 +1,105 @@ +# frozen_string_literal: true + +require "zlib" + +module Jekyll + class Avatar < Liquid::Tag + include Jekyll::LiquidExtensions + + SERVERS = 4 + DEFAULT_SIZE = 40 + API_VERSION = 3 + + def initialize(_tag_name, text, _tokens) + super + @text = text + end + + def render(context) + @context = context + @text = Liquid::Template.parse(@text).render(@context) + attrs = attributes.map { |k, v| "#{k}=\"#{v}\"" }.join(" ") + "<img #{attrs} />" + end + + private + + def attributes + result = { + :class => classes, + :alt => username, + :width => size, + :height => size, + "data-proofer-ignore" => true + } + + if lazy_load? + result[:src] = "" + result["data-src"] = url + result["data-srcset"] = srcset + else + result[:src] = url + result[:srcset] = srcset + end + + result + end + + def lazy_load? + @text.include?("lazy=true") + end + + def username + matches = @text.match(%r!\buser=([\w\.]+)\b!) + if matches + lookup_variable(@context, matches[1]) + else + @text.split(" ").first.sub("@", "") + end + end + + def size + matches = @text.match(%r!\bsize=(\d+)\b!i) + matches ? matches[1].to_i : DEFAULT_SIZE + end + + def path(scale = 1) + "#{username}?v=#{API_VERSION}&s=#{size * scale}" + end + + def server_number + Zlib.crc32(path) % SERVERS + end + + def host + if ENV["PAGES_AVATARS_URL"].is_a?(String) && !ENV["PAGES_AVATARS_URL"].empty? + ENV["PAGES_AVATARS_URL"] + else + "https://avatars#{server_number}.githubusercontent.com" + end + end + + def parsed_host + @parsed_host ||= {} + @parsed_host[host] ||= Addressable::URI.parse(host) + end + + def url(scale = 1) + uri = parsed_host + uri.path << "/" unless uri.path.end_with?("/") + uri = uri.join path(scale) + uri.to_s + end + + def srcset + (1..4).map { |scale| "#{url(scale)} #{scale}x" }.join(", ") + end + + # See http://primercss.io/avatars/#small-avatars + def classes + size < 48 ? "avatar avatar-small" : "avatar" + end + end +end + +Liquid::Template.register_tag("avatar", Jekyll::Avatar) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/lib/jekyll-avatar/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/lib/jekyll-avatar/version.rb new file mode 100644 index 000000000000..3835029e5132 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/lib/jekyll-avatar/version.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +module Liquid; class Tag; end; end +module Jekyll + class Avatar < Liquid::Tag + VERSION = "0.7.0".freeze + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/script/bootstrap new file mode 100644 index 000000000000..654265ea24eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/script/bootstrap @@ -0,0 +1,5 @@ +#!/bin/sh + +set -ex + +bundle install diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/script/cibuild new file mode 100644 index 000000000000..d838d0e0d75e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-avatar-0.7.0/script/cibuild @@ -0,0 +1,6 @@ +#!/bin/sh + +set -ex + +bundle exec rake spec +bundle exec rubocop diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-coffeescript-1.1.1/lib/jekyll-coffeescript.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-coffeescript-1.1.1/lib/jekyll-coffeescript.rb new file mode 100644 index 000000000000..09e652e807b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-coffeescript-1.1.1/lib/jekyll-coffeescript.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +require "jekyll" +require "jekyll-coffeescript/version" +require "jekyll/converters/coffeescript" + +module Jekyll + module Coffeescript + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-coffeescript-1.1.1/lib/jekyll-coffeescript/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-coffeescript-1.1.1/lib/jekyll-coffeescript/version.rb new file mode 100644 index 000000000000..6473e71c1997 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-coffeescript-1.1.1/lib/jekyll-coffeescript/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Jekyll + module Coffeescript + VERSION = "1.1.1".freeze + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-coffeescript-1.1.1/lib/jekyll/converters/coffeescript.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-coffeescript-1.1.1/lib/jekyll/converters/coffeescript.rb new file mode 100644 index 000000000000..eb8dcc0863ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-coffeescript-1.1.1/lib/jekyll/converters/coffeescript.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module Jekyll + module Converters + class CoffeeScript < Converter + safe true + priority :low + + def setup + require "coffee-script" + @setup = true + end + + def matches(ext) + ext.casecmp(".coffee").zero? + end + + def output_ext(_ext) + ".js" + end + + def convert(content) + setup unless @setup + ::CoffeeScript.compile(content) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.github/stale.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.github/stale.yml new file mode 100644 index 000000000000..dc90e5a1c3aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.gitignore b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.gitignore new file mode 100644 index 000000000000..a9ab0c79174f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.gitignore @@ -0,0 +1,4 @@ +*.gem +Gemfile.lock +spec/dest +.bundle diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.rubocop.yml new file mode 100644 index 000000000000..ad7530e4ae16 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.rubocop.yml @@ -0,0 +1,12 @@ +inherit_from: .rubocop_todo.yml + +require: rubocop-jekyll + +inherit_gem: + rubocop-jekyll: .rubocop.yml + +AllCops: + TargetRubyVersion: 2.3 + Exclude: + - script/**/* + - vendor/**/* diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.rubocop_todo.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.rubocop_todo.yml new file mode 100644 index 000000000000..74e8194bb839 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.rubocop_todo.yml @@ -0,0 +1,39 @@ +# This configuration was generated by +# `rubocop --auto-gen-config` +# on 2019-01-03 13:58:24 +0100 using RuboCop version 0.62.0. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 1 +# Configuration parameters: Max. +Metrics/AbcSize: + Exclude: + - 'lib/jekyll-commonmark.rb' + +# Offense count: 1 +# Configuration parameters: CountComments, Max, ExcludedMethods. +# ExcludedMethods: refine +Metrics/BlockLength: + Exclude: + - 'spec/jekyll_commonmark_spec.rb' + +# Offense count: 1 +# Configuration parameters: Max. +Metrics/CyclomaticComplexity: + Exclude: + - 'lib/jekyll-commonmark.rb' + +# Offense count: 1 +# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. +# URISchemes: http, https +Metrics/LineLength: + Exclude: + - 'lib/jekyll-commonmark.rb' + +# Offense count: 1 +# Configuration parameters: CountComments, Max, ExcludedMethods. +Metrics/MethodLength: + Exclude: + - 'lib/jekyll-commonmark.rb' diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.travis.yml new file mode 100644 index 000000000000..bedfd26b7c77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/.travis.yml @@ -0,0 +1,35 @@ +language: ruby +cache: bundler +rvm: + - &latest_ruby 2.6 + - 2.4 + - 2.3 +git: + depth: 3 + +# we need a more recent cmake than travis/linux provides (at least 2.8.9): +addons: + apt: + sources: + - kalakris-cmake + packages: + - cmake + +before_install: + - gem update --system + - gem install bundler +before_script: bundle update +script: script/cibuild + +env: + global: + - NOKOGIRI_USE_SYSTEM_LIBRARIES=true + matrix: + - JEKYLL_VERSION="~> 3.8" + +matrix: + include: + - rvm: *latest_ruby + env: JEKYLL_VERSION="~> 3.7.4" + - rvm: *latest_ruby + env: JEKYLL_VERSION=">= 4.0.0.pre.alpha1" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/Gemfile new file mode 100644 index 000000000000..46cdbf02794a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/Gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +source "https://rubygems.org" +gemspec + +gem "jekyll", ENV["JEKYLL_VERSION"] if ENV["JEKYLL_VERSION"] diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/History.markdown b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/History.markdown new file mode 100644 index 000000000000..9c642745cc5b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/History.markdown @@ -0,0 +1,29 @@ +## 1.3.1 / 2019-03-25 + +### Bug Fixes + + * Re-introduce Ruby 2.3 support and test Jekyll 3.7+ (#32) + +## 1.3.0 / 2019-03-22 + +### Development Fixes + + * Allow Jekyll v4 (still alpha) + * Drop Ruby < 2.4 + * chore(deps): rubocop-jekyll 0.3.0 (#25) + * Target Ruby 2.4 (#30) + +## 1.2.0 / 2018-03-29 + +### Minor Enhancements + + * Allow render options (#4) + * Only set options once (#17) + +### Development Fixes + + * Test plugin on Windows (#13) + * Allow options passed to Rubocop (#15) + * Add tests (#16) + * Test against Ruby 2.5 (#18) + * Version with class (#19) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/LICENSE new file mode 100644 index 000000000000..bd4ac9516a3f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present Pat Hawks and jekyll-commonmark contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/Rakefile b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/Rakefile new file mode 100644 index 000000000000..ee617bbbf3aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/Rakefile @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "bundler/gem_tasks" +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/Readme.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/Readme.md new file mode 100644 index 000000000000..e7d24b348a3f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/Readme.md @@ -0,0 +1,40 @@ +# jekyll-commonmark + +*CommonMark Markdown converter for Jekyll* + +[![Gem Version](https://img.shields.io/gem/v/jekyll-commonmark.svg)](https://rubygems.org/gems/jekyll-commonmark) +[![Build Status](https://img.shields.io/travis/jekyll/jekyll-commonmark/master.svg)](https://travis-ci.org/jekyll/jekyll-commonmark) +[![Windows Build status](https://img.shields.io/appveyor/ci/pathawks/jekyll-commonmark/master.svg?label=Windows%20build)](https://ci.appveyor.com/project/pathawks/jekyll-commonmark) +[![Dependency Status](https://img.shields.io/gemnasium/pathawks/jekyll-commonmark.svg)](https://gemnasium.com/pathawks/jekyll-commonmark) + +Jekyll Markdown converter that uses [libcmark](https://github.com/jgm/CommonMark), the reference parser for CommonMark. +As a result, it is faster than Kramdown. + +GitHub Pages supports CommonMark through https://github.com/github/jekyll-commonmark-ghpages + +## Installation + +Add the following to your `Gemfile` + +```ruby +group :jekyll_plugins do + gem 'jekyll-commonmark' +end +``` + +and modify your `_config.yml` to use **CommonMark** as your Markdown converter + +```yaml +markdown: CommonMark +``` + +## Configuration + +To specify [extensions](https://github.com/gjtorikian/commonmarker#extensions) and [options](https://github.com/gjtorikian/commonmarker#options) for use in converting Markdown to HTML, supply options to the Markdown converter: + +```yaml +commonmark: + options: ["SMART", "FOOTNOTES"] + extensions: ["strikethrough", "autolink", "table"] + ``` + diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/appveyor.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/appveyor.yml new file mode 100644 index 000000000000..459a3e321ac0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/appveyor.yml @@ -0,0 +1,27 @@ +version: "{build}" +clone_depth: 5 +build: off + +install: + - SET PATH=C:\Ruby%RUBY_FOLDER_VER%-x64\bin;%PATH% + - bundle install --retry 5 --jobs=%NUMBER_OF_PROCESSORS% --clean --path vendor\bundle + +environment: + JEKYLL_VERSION: "~> 3.8" + matrix: + - RUBY_FOLDER_VER: "26" + JEKYLL_VERSION : "~> 3.7.4" + - RUBY_FOLDER_VER: "26" + JEKYLL_VERSION : ">= 4.0.0.pre.alpha1" + - RUBY_FOLDER_VER: "26" + - RUBY_FOLDER_VER: "24" + - RUBY_FOLDER_VER: "23" + +test_script: + - ruby --version + - gem --version + - bundler --version + - bash script/cibuild + +cache: + - 'vendor\bundle -> appveyor.yml,Gemfile,jekyll-commonmark.gemspec' diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/jekyll-commonmark.gemspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/jekyll-commonmark.gemspec new file mode 100644 index 000000000000..6bc4a8e4c891 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/jekyll-commonmark.gemspec @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift File.expand_path("lib", __dir__) +require "jekyll-commonmark/version" + +Gem::Specification.new do |spec| + spec.name = "jekyll-commonmark" + spec.summary = "CommonMark generator for Jekyll" + spec.version = Jekyll::CommonMark::VERSION + spec.authors = ["Pat Hawks"] + spec.email = "pat@pathawks.com" + spec.homepage = "https://github.com/pathawks/jekyll-commonmark" + spec.licenses = ["MIT"] + + spec.files = `git ls-files -z`.split("\x0") + spec.executables = spec.files.grep(%r!^bin/!) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r!^(test|spec|features)/!) + spec.require_paths = ["lib"] + + spec.required_ruby_version = ">= 2.3.0" + + spec.add_runtime_dependency "commonmarker", "~> 0.14" + spec.add_runtime_dependency "jekyll", ">= 3.7", "< 5.0" + + spec.add_development_dependency "bundler" + spec.add_development_dependency "rake", "~> 12.0" + spec.add_development_dependency "rspec", "~> 3.0" + spec.add_development_dependency "rubocop-jekyll", "~> 0.5" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/lib/jekyll-commonmark.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/lib/jekyll-commonmark.rb new file mode 100644 index 000000000000..3458c9dca663 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/lib/jekyll-commonmark.rb @@ -0,0 +1,52 @@ +# frozen-string-literal: true + +module Jekyll + module Converters + class Markdown + class CommonMark + def initialize(config) + Jekyll::External.require_with_graceful_fail "commonmarker" + begin + options = config["commonmark"]["options"].collect { |e| e.upcase.to_sym } + rescue NoMethodError + options = [] + else + valid_opts = Set.new(CommonMarker::Config::Parse.keys + CommonMarker::Config::Render.keys) + options.reject! do |e| + next if valid_opts.include? e + + Jekyll.logger.warn "CommonMark:", "#{e} is not a valid option" + Jekyll.logger.info "Valid options:", valid_opts.to_a.join(", ") + true + end + end + begin + @extensions = config["commonmark"]["extensions"].collect(&:to_sym) + rescue NoMethodError + @extensions = [] + else + @extensions.reject! do |e| + next if CommonMarker.extensions.include? e.to_s + + Jekyll.logger.warn "CommonMark:", "#{e} is not a valid extension" + Jekyll.logger.info "Valid extensions:", CommonMarker.extensions.join(", ") + true + end + end + + options_set = Set.new(options).freeze + @parse_options = (options_set & CommonMarker::Config::Parse.keys).to_a + @render_options = (options_set & CommonMarker::Config::Render.keys).to_a + + @parse_options = :DEFAULT if @parse_options.empty? + @render_options = :DEFAULT if @render_options.empty? + end + + def convert(content) + CommonMarker.render_doc(content, @parse_options, @extensions) + .to_html(@render_options, @extensions) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/lib/jekyll-commonmark/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/lib/jekyll-commonmark/version.rb new file mode 100644 index 000000000000..c7de8482b636 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/lib/jekyll-commonmark/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Jekyll + module CommonMark + VERSION = "1.3.1" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/bootstrap new file mode 100644 index 000000000000..8a09d8a6bb4a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/bootstrap @@ -0,0 +1,3 @@ +#! /bin/bash + +bundle install diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/cibuild new file mode 100644 index 000000000000..b6b1131b675d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/cibuild @@ -0,0 +1,4 @@ +#! /bin/bash + +script/fmt +bundle exec rspec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/console b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/console new file mode 100644 index 000000000000..09d4c6b1742e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/console @@ -0,0 +1,35 @@ +#! /usr/bin/env ruby +# frozen_string_literal: true + +def relative_to_root(path) + File.expand_path(path, File.dirname(File.dirname(__FILE__))) +end + +require "jekyll" +require relative_to_root("lib/jekyll-smartify.rb") +require "pry-debugger" + +SOURCE_DIR = relative_to_root("spec/fixtures") +DEST_DIR = relative_to_root("spec/dest") + +def source_dir(*files) + File.join(SOURCE_DIR, *files) +end + +def dest_dir(*files) + File.join(DEST_DIR, *files) +end + +def config(overrides = {}) + Jekyll.configuration( + "source" => source_dir, + "destination" => dest_dir, + "url" => "http://example.org" + ).merge(overrides) +end + +def site(configuration = config) + Jekyll::Site.new(configuration) +end + +binding.pry diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/fmt b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/fmt new file mode 100644 index 000000000000..ae0e1c1bfaca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/fmt @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e +echo "Rubocop $(bundle exec rubocop --version)" +bundle exec rubocop -D -E $@ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/release b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/release new file mode 100644 index 000000000000..a9c226f977c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/script/release @@ -0,0 +1,7 @@ +#!/bin/sh +# Tag and push a release. + +set -e + +script/cibuild +bundle exec rake release diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/spec/jekyll_commonmark_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/spec/jekyll_commonmark_spec.rb new file mode 100644 index 000000000000..f7b852b86317 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/spec/jekyll_commonmark_spec.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe(Jekyll::Converters::Markdown::CommonMark) do + let(:options) { [] } + let(:extensions) { [] } + let(:config) do + { + "commonmark" => { + "options" => options, + "extensions" => extensions, + }, + } + end + let(:commonmark) { described_class.new(config) } + let(:output) { commonmark.convert(content) } + + context "with default configuration" do + it "produces the correct script tag" do + actual = commonmark.convert("# Heading") + expected = "<h1>Heading</h1>" + expect(actual).to match(expected) + end + + it "does not treat newlines as hardbreaks" do + actual = commonmark.convert("a\nb") + expected = "<p>a\nb</p>" + expect(actual).to match(expected) + end + + it "treats double linebreaks as a new paragraph" do + actual = commonmark.convert("a\n\nb") + expected = "<p>a</p>\n<p>b</p>" + expect(actual).to match(expected) + end + + it "escapes quotes" do + actual = commonmark.convert('"SmartyPants"') + expected = "<p>&quot;SmartyPants&quot;</p>" + expect(actual).to match(expected) + end + + it "does not link urls" do + actual = commonmark.convert("https://example.com") + expected = "https://example.com" + expect(actual).to match(expected) + end + end + + context "with SmartyPants enabled" do + let(:options) { ["SMART"] } + + it "makes quotes curly" do + actual = commonmark.convert('"SmartyPants"') + expected = "<p>“SmartyPants”</p>" + expect(actual).to match(expected) + end + end + + context "with hardbreaks enabled" do + let(:options) { ["HARDBREAKS"] } + + it "treats newlines as hardbreaks" do + actual = commonmark.convert("a\nb") + expected = "<p>a<br />\nb</p>" + expect(actual).to match(expected) + end + end + + context "with nobreaks enabled" do + let(:options) { ["NOBREAKS"] } + + it "treats newlines as a single space" do + actual = commonmark.convert("a\nb") + expected = "<p>a b</p>" + expect(actual).to match(expected) + end + end + + context "with autolink enabled" do + let(:extensions) { ["autolink"] } + + it "links urls" do + actual = commonmark.convert("https://example.com") + expected = '<p><a href="https://example.com">https://example.com</a></p>' + expect(actual).to match(expected) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/spec/spec_helper.rb new file mode 100644 index 000000000000..39721bf95a23 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-1.3.1/spec/spec_helper.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require "jekyll" +require_relative "../lib/jekyll-commonmark.rb" + +Jekyll.logger.log_level = :info + +RSpec.configure do |config| + config.run_all_when_everything_filtered = true + config.filter_run :focus + config.order = "random" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/.gitignore b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/.gitignore new file mode 100644 index 000000000000..a9ab0c79174f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/.gitignore @@ -0,0 +1,4 @@ +*.gem +Gemfile.lock +spec/dest +.bundle diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/.travis.yml new file mode 100644 index 000000000000..a538dc5594e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/.travis.yml @@ -0,0 +1,22 @@ +language: ruby +cache: bundler +rvm: + - 2.4 + - 2.3 +git: + depth: 1 + +sudo: false + +addons: + apt: + sources: + - kalakris-cmake + packages: + - cmake + +before_install: + - gem install bundler + +before_script: bundle update +script: script/cibuild diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/Gemfile new file mode 100644 index 000000000000..b4e2a20bb606 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/LICENSE new file mode 100644 index 000000000000..131d9c019308 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 GitHub + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/README.md new file mode 100644 index 000000000000..ee2242eba59b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/README.md @@ -0,0 +1,35 @@ +# jekyll-commonmark-ghpages + +*GitHub Flavored Markdown converter for Jekyll, based on [`jekyll-commonmark`](https://github.com/jekyll/jekyll-commonmark)* + +[![Gem Version](https://img.shields.io/gem/v/jekyll-commonmark-ghpages.svg)](https://rubygems.org/gems/jekyll-commonmark-ghpages) +[![Build Status](https://img.shields.io/travis/github/jekyll-commonmark-ghpages/master.svg)](https://travis-ci.org/github/jekyll-commonmark-ghpages) +[![Windows Build status](https://img.shields.io/appveyor/ci/github/jekyll-commonmark-ghpages/master.svg?label=Windows%20build)](https://ci.appveyor.com/project/github/jekyll-commonmark-ghpages) + +Jekyll Markdown converter that uses [libcmark-gfm](https://github.com/github/cmark), GitHub's fork of [cmark](https://github.com/commonmark/cmark), the reference parser for CommonMark, with some additions to ensure compatibility with existing Kramdown-based sites. + +## Installation + +Add the following to your `Gemfile`: + +```ruby +group :jekyll_plugins do + gem 'jekyll-commonmark-ghpages' +end +``` + +and modify your `_config.yml` to use **CommonMarkGhPages** as your Markdown converter: + +```yaml +markdown: CommonMarkGhPages +``` + +This processor is currently in testing for use in GitHub Pages. + +To specify extensions and options for use in converting Markdown to HTML, supply options to the Markdown converter: + +```yaml +commonmark: + options: ["SMART", "FOOTNOTES"] + extensions: ["strikethrough", "autolink", "table", "tagfilter"] +``` diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/Rakefile b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/Rakefile new file mode 100644 index 000000000000..8754e40cbd08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/Rakefile @@ -0,0 +1,6 @@ +require "bundler/gem_tasks" +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/appveyor.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/appveyor.yml new file mode 100644 index 000000000000..ad534c86b966 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/appveyor.yml @@ -0,0 +1,23 @@ +version: "{build}" +clone_depth: 5 +build: off + +install: + - SET PATH=C:\Ruby%RUBY_FOLDER_VER%\bin;%PATH% + - bundle install --retry 5 --jobs=%NUMBER_OF_PROCESSORS% --clean --path vendor\bundle + +environment: + matrix: + - RUBY_FOLDER_VER: "24" + - RUBY_FOLDER_VER: "24-x64" + - RUBY_FOLDER_VER: "23" + - RUBY_FOLDER_VER: "22" + +test_script: + - ruby --version + - gem --version + - bundler --version + - bash script/cibuild + +cache: + - 'vendor\bundle -> appveyor.yml,Gemfile,jekyll-commonmark-ghpages.gemspec' diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/jekyll-commonmark-ghpages.gemspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/jekyll-commonmark-ghpages.gemspec new file mode 100644 index 000000000000..f40c60b75143 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/jekyll-commonmark-ghpages.gemspec @@ -0,0 +1,23 @@ +# coding: utf-8 + +Gem::Specification.new do |spec| + spec.name = "jekyll-commonmark-ghpages" + spec.summary = "CommonMark generator for Jekyll" + spec.version = "0.1.6" + spec.authors = ["Ashe Connor"] + spec.email = "kivikakk@github.com" + spec.homepage = "https://github.com/github/jekyll-commonmark-ghpages" + spec.licenses = ["MIT"] + + spec.files = `git ls-files -z`.split("\x0") + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ["lib"] + + spec.add_runtime_dependency "jekyll-commonmark", "~> 1.2" + spec.add_runtime_dependency "commonmarker", "~> 0.17.6" + spec.add_runtime_dependency "rouge", ">= 2.0", "< 4.0" + + spec.add_development_dependency "rspec", "~> 3.0" + spec.add_development_dependency "rake" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/lib/jekyll-commonmark-ghpages.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/lib/jekyll-commonmark-ghpages.rb new file mode 100644 index 000000000000..3c0be1ade088 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/lib/jekyll-commonmark-ghpages.rb @@ -0,0 +1,117 @@ +# frozen-string-literal: true +# encoding: utf-8 + +require "commonmarker" +require "jekyll" +require "jekyll-commonmark" +require "rouge" + +# A customized version of CommonMarker::HtmlRenderer which: +# - outputs Kramdown-style header IDs. +# - performs syntax highlighting in code blocks. +class JekyllCommonMarkCustomRenderer < ::CommonMarker::HtmlRenderer + def header(node) + block do + old_stream = @stream + @stream = StringIO.new(String.new.force_encoding("utf-8")) + out(:children) + content = @stream.string + @stream = old_stream + + id = generate_id(content) + out("<h", node.header_level, "#{sourcepos(node)} id=\"#{id}\">", + content, "</h", node.header_level, ">") + end + end + + def code_block(node) + lang = if node.fence_info && !node.fence_info.empty? + node.fence_info.split(/[\s,]/)[0] + end + + content = node.string_content + + if lang && lexer = ::Rouge::Lexer.find_fancy(lang, content) + block do + out("<div class=\"language-#{lang} highlighter-rouge\">") + out(::Rouge::Formatters::HTMLLegacy.new(css_class: 'highlight').format(lexer.lex(content))) + out("</div>") + end + return + end + + if option_enabled?(:GITHUB_PRE_LANG) + out("<pre#{sourcepos(node)}") + out(' lang="', lang, '"') if lang + out('><code>') + else + out("<pre#{sourcepos(node)}><code") + out(' class="language-', lang, '">') if lang + out('>') + end + out(escape_html(content)) + out('</code></pre>') + end + + private + + def generate_id(str) + gen_id = basic_generate_id(str) + gen_id = "section" if gen_id.empty? + @used_ids ||= {} + if @used_ids.key?(gen_id) + gen_id += "-" + (@used_ids[gen_id] += 1).to_s + else + @used_ids[gen_id] = 0 + end + gen_id + end + + def basic_generate_id(str) + gen_id = str.gsub(/^[^a-zA-Z]+/, "") + gen_id.tr!("^a-zA-Z0-9 -", "") + gen_id.tr!(" ", "-") + gen_id.downcase! + gen_id + end +end + +class Jekyll::Converters::Markdown + # A Markdown renderer which uses JekyllCommonMarkCustomRenderer to output the + # final document. + class CommonMarkGhPages < CommonMark + def convert(content) + doc = CommonMarker.render_doc(content, @parse_options, @extensions) + html = JekyllCommonMarkCustomRenderer.new( + :options => @render_options, + :extensions => @extensions + ).render(doc) + html.gsub(/<br data-jekyll-commonmark-ghpages>/, "\n") + end + end +end + +class Jekyll::Tags::HighlightBlock + alias render_rouge_without_ghpages_hack render_rouge + alias render_without_ghpages_hack render + + def render(context) + @render_ghpages_hack_context = context + render_without_ghpages_hack(context) + end + + def render_rouge(context) + rendered = render_rouge_without_ghpages_hack(context) + + processor = @render_ghpages_hack_context + .registers[:site] + .find_converter_instance(Jekyll::Converters::Markdown) + .get_processor + + if processor.is_a?(Jekyll::Converters::Markdown::CommonMarkGhPages) + rendered.gsub!(/\r?\n/, "<br data-jekyll-commonmark-ghpages>") + end + + rendered + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/script/cibuild new file mode 100644 index 000000000000..45d681aa3f6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/script/cibuild @@ -0,0 +1,3 @@ +#!/bin/bash + +bundle exec rspec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/spec/spec_helper.rb new file mode 100644 index 000000000000..ac6c3abefd5e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/spec/spec_helper.rb @@ -0,0 +1,7 @@ +require "rspec/expectations" +require File.expand_path("../lib/jekyll-commonmark-ghpages.rb", File.dirname(__FILE__)) + +RSpec.configure do |config| + config.run_all_when_everything_filtered = true + config.order = "random" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/spec/test_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/spec/test_spec.rb new file mode 100644 index 000000000000..239187620fab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-commonmark-ghpages-0.1.6/spec/test_spec.rb @@ -0,0 +1,55 @@ +require "spec_helper" + +describe JekyllCommonMarkCustomRenderer do + let(:renderer) { JekyllCommonMarkCustomRenderer.new } + subject { renderer.render(doc) } + + context "headers" do + let(:doc) { CommonMarker.render_doc("# Hello\n\n## Hi, world!") } + it { is_expected.to match %r{<h1 id="hello">Hello</h1>} } + it { is_expected.to match %r{<h2 id="hi-world">Hi, world!</h2>} } + end + + context "code blocks" do + let(:doc) { CommonMarker.render_doc("```ruby\nputs \"Hi!\"\n```\n") } + it { is_expected.to match %r{<div class="language-ruby highlighter-rouge">} } + it { is_expected.to match %r{<code><span class=".*?">puts</span> <span class=".*?">"Hi!"</span>} } + end +end + +describe Jekyll::Converters::Markdown::CommonMarkGhPages do + let(:converter) { Jekyll::Converters::Markdown::CommonMarkGhPages.new(config) } + let(:config) { + {"commonmark" => { + "options" => ["SMART", "FOOTNOTES"], + "extensions" => ["tagfilter"], + }} + } + subject { converter.convert("### \"Hi\" <xmp>[^nb]\n\n[^nb]: Yes.\n") } + + it { is_expected.to match %r{<h3 id="[^"]*">“Hi” &lt;xmp><sup[^>]*><a href="#fn1"[^>]*>1</a></sup></h3>\n<section class="footnotes">\n<ol>\n<li id="fn1">\n<p>Yes. <a href="#fnref1".*</a></p>} } +end + +describe Jekyll::Renderer do + it "should not re-process markdown in a liquid tag" do + site = Jekyll::Site.new(Jekyll.configuration("markdown" => "CommonMarkGhPages")) + collection = Jekyll::Collection.new(site, "pages") + document = Jekyll::Document.new("hello.md", site: site, collection: collection) + document.content = "**Hi**\n" \ + "\n" \ + "```markdown\n" \ + "**Yo**\n" \ + "```\n" \ + "\n" \ + "{% highlight markdown %}\n" \ + "**Hey**\n" \ + "\n" \ + "**Hello**\n" \ + "{% endhighlight %}\n" + out = Jekyll::Renderer.new(site, document).run + expect(out).to match %r(<p><strong>Hi</strong></p>) + expect(out).to match %r(<span class="gs">\*\*Yo\*\*</span>) + expect(out).to match %r(<span class="gs">\*\*Hey\*\*</span>\n\n) + expect(out).to match %r(<span class="gs">\*\*Hello\*\*</span>) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-default-layout-0.1.4/lib/jekyll-default-layout.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-default-layout-0.1.4/lib/jekyll-default-layout.rb new file mode 100644 index 000000000000..959d8cccf073 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-default-layout-0.1.4/lib/jekyll-default-layout.rb @@ -0,0 +1,5 @@ +require "jekyll" +require "jekyll-default-layout/generator" + +module JekyllDefaultLayout +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-default-layout-0.1.4/lib/jekyll-default-layout/generator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-default-layout-0.1.4/lib/jekyll-default-layout/generator.rb new file mode 100644 index 000000000000..83c160a0c166 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-default-layout-0.1.4/lib/jekyll-default-layout/generator.rb @@ -0,0 +1,74 @@ +module JekyllDefaultLayout + # Injects front matter defaults to set default layouts, if they exist + class Generator < Jekyll::Generator + attr_accessor :site + + safe true + priority :lowest + + def initialize(site) + @site = site + end + + def generate(site) + @site = site + documents.each do |document| + next unless should_set_layout?(document) + document.data["layout"] = layout_for(document) + end + end + + def should_set_layout?(document) + markdown?(document) && !layout_specified?(document) + end + + # Does the given layout exist for the site? + def layout_exists?(layout) + !site.layouts[layout].nil? + end + + # Has the user already specified a default for this layout? + # Note: We must use `to_liquid`, and not data, to ensure front matter defaults + def layout_specified?(document) + document.to_liquid.key? "layout" + end + + def markdown?(document) + markdown_converter.matches(document.extname) + end + + # What layout is appropriate for this document, if any + # rubocop:disable Metrics/PerceivedComplexity + def layout_for(document) + if index?(document) && layout_exists?("home") + "home" + elsif page?(document) && layout_exists?("page") + "page" + elsif post?(document) && layout_exists?("post") + "post" + elsif layout_exists?("default") + "default" + end + end + + def documents + [site.pages, site.posts.docs].flatten + end + + def markdown_converter + @markdown_converter ||= site.find_converter_instance(Jekyll::Converters::Markdown) + end + + def post?(document) + document.is_a?(Jekyll::Document) && document.collection.label == "posts" + end + + def page?(document) + document.is_a?(Jekyll::Page) + end + + def index?(document) + document.url == "/" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-default-layout-0.1.4/lib/jekyll-default-layout/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-default-layout-0.1.4/lib/jekyll-default-layout/version.rb new file mode 100644 index 000000000000..3d2bb5b92c96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-default-layout-0.1.4/lib/jekyll-default-layout/version.rb @@ -0,0 +1,3 @@ +module JekyllDefaultLayout + VERSION = "0.1.4".freeze +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/History.markdown b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/History.markdown new file mode 100644 index 000000000000..4e39f544ba79 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/History.markdown @@ -0,0 +1,197 @@ +## HEAD + +## 0.15.1 / 2020-10-04 + +### Bug Fixes + + * MetaTag: when encoding for XML special characters, handle non-string objects (#326) + +## 0.15.0 / 2020-07-10 + +### Minor Enhancements + + * Add support for drafts (#316) + +## 0.14.0 / 2020-06-24 + +### Minor Enhancements + + * add support for categories (#153) (#233) + * add support for tags (#264) + * Make posts limit configurable (#314) + * XML escape the title field of feed_meta (#306) + +### Bug Fixes + + * Fix feed link when post title contains HTML (#305) + +### Development Fixes + + * Use Dir to list source files (#309) + * Require Ruby &gt;=2.4.0 (#307) + +## 0.13.0 / 2019-11-13 + +### Minor Enhancements + + * Excerpt only flag (#287) + * Add media:content tag (#290) + +### Development Fixes + + * test: use categories in post (#249) + +## 0.12.1 / 2019-03-23 + +### Bug Fixes + + * Re-introduce Ruby 2.3 support and test Jekyll 3.7+ (#272) + +## 0.12.0 / 2019-03-21 + + * Allow Jekyll v4 (still alpha) + +### Development Fixes + + * style: fix offenses in specs (#248) + * dev: update CI and style settings (#258) + * Enable testing for Windows platform (#265) + +## 0.11.0 / 2018-09-09 + +### Development Fixes + + * Require Ruby 2.3 (#222) + * Refactor to remove redundant calls and variables (#240) + +### Minor Enhancements + + * Categories and collections (#228) + * Remove check for older version of Jekyll (#234) + +## 0.10.0 / 2018-06-04 + +### Bug Fixes + + * Escape image URL (#209) + +### Development Fixes + + * Rubocop 0.55 (#223) + * Bump Rubocop (#230) + +### Minor Enhancements + + * Support Typhoeus 1.0 (#232) + +## 0.9.3 / 2018-02-04 + + * Define path with __dir (#187) + * Bump Ruby for Travis (#188) + +### Documentation + + * Fix: Add note about using plugins instead of gems key (#197) + * Add documentation for disabling smartify filter (#205) + * Use `https` in more places. (#165) + +### Development Fixes + + * Rubocop: Target Ruby 2.2 (#195) + * Test feeds that have a `site.lang` (#164) + * Test against Ruby 2.5 (#201) + +### Minor Enhancements + + * fix <entry> template for posts with post.lang defined (#168) + +## 0.9.3 / 2017-03-28 + +## 0.9.1 / 2017-02-17 + +### Minor Enhancements + + * Update feed.xml (#162) + +## 0.9.0 / 2017-02-16 + +### Minor Enhancements + + * Use absolute_url to generate the feed_meta url (#150) + * Make feed stylesheet optional (#149) + * Use new `normalize_whitespace` filter (#143) + * Feed entries must contain <author> (#152) + * Remove trailing slash from feed ID (#159) + +### Development Fixes + + * Simplify minify regular expression (#141) + * Namespace as JekyllFeed (#151) + * rubocop -a (#160) + +### Bug Fixes + + * Filter out drafts before limit (#154) + +## 0.8.0 / 2016-10-06 + + * Use filters to clean up Liquid template (#134) + +### Minor Enhancements + + * Don't set @site.config["time"] on feed generation (#138) + +### pedantry + + * Appease Rubocop (#139) + +## 0.7.2 / 2016-10-06 + + * Support `image.path` when `post.image` is an object (#137) + +## 0.7.1 / 2016-09-26 + + * Assign `url_base` before first usage (#133) + +## 0.7.0 / 2016-09-06 + + * Use type="html" to skirt around double escaping problem (#127) + +## 0.6.0 / 2016-07-08 + + * Cleanup `post_author` logic (#113) + * Add XML stylesheet example with XSLT (#119) + * DRY up and add more doc (#120) + * Use smartify filter (#117) + +## 0.5.1 / 2016-04-18 + + * Fix mangling of whitespace when `site.lang` is set (#110) + +## 0.5.0 / 2016-04-13 + + * Consolidate regexps for stripping whitespace (#82) + * Only test against Jekyll 3 (#99) + * Think about how i18n might work (#75) + * Find author by reference (#106) + * Drop support for Jekyll 2 (#105) + * Add support for post image (#104) + +### Minor Enhancements + + * Use Module#method_defined? (#83) + * Use site.title for meta tag if available (#100) + +### Development Fixes + + * Do not require [**jekyll-last-modified-at**](https://github.com/gjtorikian/jekyll-last-modified-at) in tests (#87) + * Add Rubocop (#81) + * Correct typo in tests (#102) + * Simplify testing feed_meta tag (#101) + * Quiet known warnings in tests (#103) + +## 0.4.0 / 2015-12-30 + + * Feed uses `site.title`, or `site.name` if `title` doesn't exist (#72) + * Replace newlines with spaces in `title` and `summary` elements (#67) + * Properly render post content with Jekyll (#73) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/LICENSE.txt new file mode 100644 index 000000000000..e8e13376879d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2015-present Ben Balter and jekyll-feed contributors + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/README.md new file mode 100644 index 000000000000..3159782b56b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/README.md @@ -0,0 +1,253 @@ +# Jekyll Feed plugin + +A Jekyll plugin to generate an Atom (RSS-like) feed of your Jekyll posts + +[![Build Status](https://travis-ci.org/jekyll/jekyll-feed.svg)](https://travis-ci.org/jekyll/jekyll-feed) [![Gem Version](https://badge.fury.io/rb/jekyll-feed.svg)](https://badge.fury.io/rb/jekyll-feed) + +## Installation + +Add this line to your site's Gemfile: + +```ruby +gem 'jekyll-feed' +``` + +And then add this line to your site's `_config.yml`: + +```yml +plugins: + - jekyll-feed +``` + +:warning: If you are using Jekyll < 3.5.0 use the `gems` key instead of `plugins`. + +## Usage + +The plugin will automatically generate an Atom feed at `/feed.xml`. + +### Optional configuration options + +The plugin will automatically use any of the following configuration variables, if they are present in your site's `_config.yml` file. + +* `title` or `name` - The title of the site, e.g., "My awesome site" +* `description` - A longer description of what your site is about, e.g., "Where I blog about Jekyll and other awesome things" +* `url` - The URL to your site, e.g., `https://example.com`. If none is provided, the plugin will try to use `site.github.url`. +* `author` - Global author information (see below) + +### Already have a feed path? + +Do you already have an existing feed someplace other than `/feed.xml`, but are on a host like GitHub Pages that doesn't support machine-friendly redirects? If you simply swap out `jekyll-feed` for your existing template, your existing subscribers won't continue to get updates. Instead, you can specify a non-default path via your site's config. + +```yml +feed: + path: atom.xml +``` + +To note, you shouldn't have to do this unless you already have a feed you're using, and you can't or wish not to redirect existing subscribers. + +### Optional front matter + +The plugin will use the following post metadata, automatically generated by Jekyll, which you can override via a post's YAML front matter: + +* `date` +* `title` +* `excerpt` +* `id` +* `category` +* `tags` + +Additionally, the plugin will use the following values, if present in a post's YAML front matter: + +* `image` - URL of an image that is representative of the post (can also be passed as `image.path`) + +* `author` - The author of the post, e.g., "Dr. Jekyll". If none is given, feed readers will look to the feed author as defined in `_config.yml`. Like the feed author, this can also be an object or a reference to an author in `_data/authors.yml` (see below). + +### Author information + +*TL;DR: In most cases, put `author: [your name]` in the document's front matter, for sites with multiple authors. If you need something more complicated, read on.* + +There are several ways to convey author-specific information. Author information is found in the following order of priority: + +1. An `author` object, in the documents's front matter, e.g.: + + ```yml + author: + twitter: benbalter + ``` + +2. An `author` object, in the site's `_config.yml`, e.g.: + + ```yml + author: + twitter: benbalter + ``` + +3. `site.data.authors[author]`, if an author is specified in the document's front matter, and a corresponding key exists in `site.data.authors`. E.g., you have the following in the document's front matter: + + ```yml + author: benbalter + ``` + + And you have the following in `_data/authors.yml`: + + ```yml + benbalter: + picture: /img/benbalter.png + twitter: jekyllrb + + potus: + picture: /img/potus.png + twitter: whitehouse + ``` + + In the above example, the author `benbalter`'s Twitter handle will be resolved to `@jekyllrb`. This allows you to centralize author information in a single `_data/authors` file for site with many authors that require more than just the author's username. + + *Pro-tip: If `authors` is present in the document's front matter as an array (and `author` is not), the plugin will use the first author listed.* + +4. An author in the document's front matter (the simplest way), e.g.: + + ```yml + author: benbalter + ``` + +5. An author in the site's `_config.yml`, e.g.: + + ```yml + author: benbalter + ``` + +### Meta tags + +The plugin exposes a helper tag to expose the appropriate meta tags to support automated discovery of your feed. Simply place `{% feed_meta %}` someplace in your template's `<head>` section, to output the necessary metadata. + +### SmartyPants + +The plugin uses [Jekyll's `smartify` filter](https://jekyllrb.com/docs/templates/) for processing the site title and post titles. This will translate plain ASCII punctuation into "smart" typographic punctuation. This will not render or strip any Markdown you may be using in a title. + +Jekyll's `smartify` filter uses [kramdown](https://kramdown.gettalong.org/options.html) as a processor. Accordingly, if you do not want "smart" typographic punctuation, disabling them in kramdown in your `_config.yml` will disable them in your feed. For example: + + ```yml + kramdown: + smart_quotes: apos,apos,quot,quot + typographic_symbols: {hellip: ...} + ``` + +### Custom styling + +Want to style what your feed looks like in the browser? When a XSLT Styleheet file named `feed.xslt.xml` exists at the root of your repository, a link to this stylesheet is added to the generated feed. + +## Why Atom, and not RSS? + +Great question. In short, Atom is a better format. Think of it like RSS 3.0. For more information, see [this discussion on why we chose Atom over RSS 2.0](https://github.com/jekyll/jekyll-rss-feed/issues/2). + +## Categories + +Jekyll Feed can generate feeds for each category. Simply define which categories you'd like feeds for in your config: + +```yml +feed: + categories: + - news + - updates +``` + +## Posts limit + +By default the plugin limits the number of posts in the feed to 10. Simply define a new limit in your config: + +```yml +feed: + posts_limit: 20 +``` + +## Collections + +Jekyll Feed can generate feeds for collections other than the Posts collection. This works best for chronological collections (e.g., collections with dates in the filenames). Simply define which collections you'd like feeds for in your config: + +```yml +feed: + collections: + - changes +``` + +By default, collection feeds will be outputted to `/feed/<COLLECTION>.xml`. If you'd like to customize the output path, specify a collection's custom path as follows: + +```yml +feed: + collections: + changes: + path: "/changes.xml" +``` + +Finally, collections can also have category feeds which are outputted as `/feed/<COLLECTION>/<CATEGORY>.xml`. Specify categories like so: + +```yml +feed: + collections: + changes: + path: "/changes.xml" + categories: + - news + - updates +``` + +## Excerpt Only flag + +Optional flag `excerpt_only` allows you to exclude post content from the Atom feed. Default value is `false` for backward compatibility. + +When in `config.yml` is `true` than all posts in feed will be without `<content>` tags. + +```yml +feed: + excerpt_only: true +``` + +The same flag can be used directly in post file. It will be disable `<content>` tag for selected post. +Settings in post file has higher priority than in config file. + +## Tags + +To automatically generate feeds for each tag you apply to your posts you can add a tags setting to your config: + +```yml +feed: + tags: true +``` + +If there are tags you don't want included in this auto generation you can exclude them + +```yml +feed: + tags: + except: + - tag-to-exclude + - another-tag +``` + +If you wish to change the location of these auto generated feeds (`/feed/by_tag/<TAG>.xml` by default) you can provide an alternative folder for them to live in. + +```yml +feed: + tags: + path: "alternative/path/for/tags/feeds/" +``` + +If you only want to generate feeds for a few tags you can also set this. + +```yml +feed: + tags: + only: + - tag-to-include + - another-tag +``` + +Note that if you include a tag that is excluded a feed will not be generated for it. + +## Contributing + +1. Fork it (https://github.com/jekyll/jekyll-feed/fork) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create a new Pull Request diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed.rb new file mode 100644 index 000000000000..60dd6078b417 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require "jekyll" +require "fileutils" +require "jekyll-feed/generator" + +module JekyllFeed + autoload :MetaTag, "jekyll-feed/meta-tag" + autoload :PageWithoutAFile, "jekyll-feed/page-without-a-file.rb" +end + +Liquid::Template.register_tag "feed_meta", JekyllFeed::MetaTag diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/feed.xml b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/feed.xml new file mode 100644 index 000000000000..afba157abd8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/feed.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="utf-8"?> +{% if page.xsl %} + <?xml-stylesheet type="text/xml" href="{{ '/feed.xslt.xml' | absolute_url }}"?> +{% endif %} +<feed xmlns="http://www.w3.org/2005/Atom" {% if site.lang %}xml:lang="{{ site.lang }}"{% endif %}> + <generator uri="https://jekyllrb.com/" version="{{ jekyll.version }}">Jekyll</generator> + <link href="{{ page.url | absolute_url }}" rel="self" type="application/atom+xml" /> + <link href="{{ '/' | absolute_url }}" rel="alternate" type="text/html" {% if site.lang %}hreflang="{{ site.lang }}" {% endif %}/> + <updated>{{ site.time | date_to_xmlschema }}</updated> + <id>{{ page.url | absolute_url | xml_escape }}</id> + + {% assign title = site.title | default: site.name %} + {% if page.collection != "posts" %} + {% assign collection = page.collection | capitalize %} + {% assign title = title | append: " | " | append: collection %} + {% endif %} + {% if page.category %} + {% assign category = page.category | capitalize %} + {% assign title = title | append: " | " | append: category %} + {% endif %} + + {% if title %} + <title type="html">{{ title | smartify | xml_escape }}</title> + {% endif %} + + {% if site.description %} + <subtitle>{{ site.description | xml_escape }}</subtitle> + {% endif %} + + {% if site.author %} + <author> + <name>{{ site.author.name | default: site.author | xml_escape }}</name> + {% if site.author.email %} + <email>{{ site.author.email | xml_escape }}</email> + {% endif %} + {% if site.author.uri %} + <uri>{{ site.author.uri | xml_escape }}</uri> + {% endif %} + </author> + {% endif %} + + {% if page.tags %} + {% assign posts = site.tags[page.tags] %} + {% else %} + {% assign posts = site[page.collection] %} + {% endif %} + {% if page.category %} + {% assign posts = posts | where: "category", page.category %} + {% endif %} + {% unless site.show_drafts %} + {% assign posts = posts | where_exp: "post", "post.draft != true" %} + {% endunless %} + {% assign posts = posts | sort: "date" | reverse %} + {% assign posts_limit = site.feed.posts_limit | default: 10 %} + {% for post in posts limit: posts_limit %} + <entry{% if post.lang %}{{" "}}xml:lang="{{ post.lang }}"{% endif %}> + {% assign post_title = post.title | smartify | strip_html | normalize_whitespace | xml_escape %} + + <title type="html">{{ post_title }}</title> + <link href="{{ post.url | absolute_url }}" rel="alternate" type="text/html" title="{{ post_title }}" /> + <published>{{ post.date | date_to_xmlschema }}</published> + <updated>{{ post.last_modified_at | default: post.date | date_to_xmlschema }}</updated> + <id>{{ post.id | absolute_url | xml_escape }}</id> + {% assign excerpt_only = post.feed.excerpt_only | default: site.feed.excerpt_only %} + {% unless excerpt_only %} + <content type="html" xml:base="{{ post.url | absolute_url | xml_escape }}">{{ post.content | strip | xml_escape }}</content> + {% endunless %} + + {% assign post_author = post.author | default: post.authors[0] | default: site.author %} + {% assign post_author = site.data.authors[post_author] | default: post_author %} + {% assign post_author_email = post_author.email | default: nil %} + {% assign post_author_uri = post_author.uri | default: nil %} + {% assign post_author_name = post_author.name | default: post_author %} + + <author> + <name>{{ post_author_name | default: "" | xml_escape }}</name> + {% if post_author_email %} + <email>{{ post_author_email | xml_escape }}</email> + {% endif %} + {% if post_author_uri %} + <uri>{{ post_author_uri | xml_escape }}</uri> + {% endif %} + </author> + + {% if post.category %} + <category term="{{ post.category | xml_escape }}" /> + {% elsif post.categories %} + {% for category in post.categories %} + <category term="{{ category | xml_escape }}" /> + {% endfor %} + {% endif %} + + {% for tag in post.tags %} + <category term="{{ tag | xml_escape }}" /> + {% endfor %} + + {% if post.excerpt and post.excerpt != empty %} + <summary type="html">{{ post.excerpt | strip_html | normalize_whitespace | xml_escape }}</summary> + {% endif %} + + {% assign post_image = post.image.path | default: post.image %} + {% if post_image %} + {% unless post_image contains "://" %} + {% assign post_image = post_image | absolute_url %} + {% endunless %} + <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="{{ post_image | xml_escape }}" /> + <media:content medium="image" url="{{ post_image | xml_escape }}" xmlns:media="http://search.yahoo.com/mrss/" /> + {% endif %} + </entry> + {% endfor %} +</feed> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/generator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/generator.rb new file mode 100644 index 000000000000..ade634aea831 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/generator.rb @@ -0,0 +1,140 @@ +# frozen_string_literal: true + +module JekyllFeed + class Generator < Jekyll::Generator + safe true + priority :lowest + + # Main plugin action, called by Jekyll-core + def generate(site) + @site = site + collections.each do |name, meta| + Jekyll.logger.info "Jekyll Feed:", "Generating feed for #{name}" + (meta["categories"] + [nil]).each do |category| + path = feed_path(:collection => name, :category => category) + next if file_exists?(path) + + @site.pages << make_page(path, :collection => name, :category => category) + end + end + generate_feed_by_tag if config["tags"] && !@site.tags.empty? + end + + private + + # Matches all whitespace that follows + # 1. A '>', which closes an XML tag or + # 2. A '}', which closes a Liquid tag + # We will strip all of this whitespace to minify the template + MINIFY_REGEX = %r!(?<=>|})\s+!.freeze + + # Returns the plugin's config or an empty hash if not set + def config + @config ||= @site.config["feed"] || {} + end + + # Determines the destination path of a given feed + # + # collection - the name of a collection, e.g., "posts" + # category - a category within that collection, e.g., "news" + # + # Will return "/feed.xml", or the config-specified default feed for posts + # Will return `/feed/category.xml` for post categories + # WIll return `/feed/collection.xml` for other collections + # Will return `/feed/collection/category.xml` for other collection categories + def feed_path(collection: "posts", category: nil) + prefix = collection == "posts" ? "/feed" : "/feed/#{collection}" + return "#{prefix}/#{category}.xml" if category + + collections.dig(collection, "path") || "#{prefix}.xml" + end + + # Returns a hash representing all collections to be processed and their metadata + # in the form of { collection_name => { categories = [...], path = "..." } } + def collections + return @collections if defined?(@collections) + + @collections = if config["collections"].is_a?(Array) + config["collections"].map { |c| [c, {}] }.to_h + elsif config["collections"].is_a?(Hash) + config["collections"] + else + {} + end + + @collections = normalize_posts_meta(@collections) + @collections.each_value do |meta| + meta["categories"] = (meta["categories"] || []).to_set + end + + @collections + end + + def generate_feed_by_tag + tags_config = config["tags"] + tags_config = {} unless tags_config.is_a?(Hash) + + except = tags_config["except"] || [] + only = tags_config["only"] || @site.tags.keys + tags_pool = only - except + tags_path = tags_config["path"] || "/feed/by_tag/" + + generate_tag_feed(tags_pool, tags_path) + end + + def generate_tag_feed(tags_pool, tags_path) + tags_pool.each do |tag| + # allow only tags with basic alphanumeric characters and underscore to keep + # feed path simple. + next if %r![^a-zA-Z0-9_]!.match?(tag) + + Jekyll.logger.info "Jekyll Feed:", "Generating feed for posts tagged #{tag}" + path = "#{tags_path}#{tag}.xml" + next if file_exists?(path) + + @site.pages << make_page(path, :tags => tag) + end + end + + # Path to feed.xml template file + def feed_source_path + @feed_source_path ||= File.expand_path "feed.xml", __dir__ + end + + def feed_template + @feed_template ||= File.read(feed_source_path).gsub(MINIFY_REGEX, "") + end + + # Checks if a file already exists in the site source + def file_exists?(file_path) + File.exist? @site.in_source_dir(file_path) + end + + # Generates contents for a file + + def make_page(file_path, collection: "posts", category: nil, tags: nil) + PageWithoutAFile.new(@site, __dir__, "", file_path).tap do |file| + file.content = feed_template + file.data.merge!( + "layout" => nil, + "sitemap" => false, + "xsl" => file_exists?("feed.xslt.xml"), + "collection" => collection, + "category" => category, + "tags" => tags + ) + file.output + end + end + + # Special case the "posts" collection, which, for ease of use and backwards + # compatability, can be configured via top-level keys or directly as a collection + def normalize_posts_meta(hash) + hash["posts"] ||= {} + hash["posts"]["path"] ||= config["path"] + hash["posts"]["categories"] ||= config["categories"] + config["path"] ||= hash["posts"]["path"] + hash + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/meta-tag.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/meta-tag.rb new file mode 100644 index 000000000000..5475929735f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/meta-tag.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module JekyllFeed + class MetaTag < Liquid::Tag + # Use Jekyll's native relative_url filter + include Jekyll::Filters::URLFilters + + def render(context) + @context = context + attrs = attributes.map do |k, v| + v = v.to_s unless v.respond_to?(:encode) + %(#{k}=#{v.encode(:xml => :attr)}) + end + "<link #{attrs.join(" ")} />" + end + + private + + def config + @config ||= @context.registers[:site].config + end + + def attributes + { + :type => "application/atom+xml", + :rel => "alternate", + :href => absolute_url(path), + :title => title, + }.keep_if { |_, v| v } + end + + def path + config.dig("feed", "path") || "feed.xml" + end + + def title + config["title"] || config["name"] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/page-without-a-file.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/page-without-a-file.rb new file mode 100644 index 000000000000..b7d3278aa5a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/page-without-a-file.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module JekyllFeed + class PageWithoutAFile < Jekyll::Page + def read_yaml(*) + @data ||= {} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/version.rb new file mode 100644 index 000000000000..474050b75d0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-feed-0.15.1/lib/jekyll-feed/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Jekyll + module Feed + VERSION = "0.15.1" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.gitignore new file mode 100644 index 000000000000..31cafb5d8865 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.gitignore @@ -0,0 +1,22 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp +*.bundle +*.so +*.o +*.a +mkmf.log diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.rspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.rspec new file mode 100644 index 000000000000..5f1647637a0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.rspec @@ -0,0 +1,2 @@ +--color +--format progress diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.rubocop.yml new file mode 100644 index 000000000000..e86cc3dc17b1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.rubocop.yml @@ -0,0 +1,28 @@ +inherit_gem: + jekyll: .rubocop.yml + +AllCops: + TargetRubyVersion: 2.1 + Exclude: + - vendor/**/* + - spec/*.rb + +Lint/IneffectiveAccessModifier: + Exclude: + - lib/jekyll-gist/gist_tag.rb + +Lint/ShadowedException: + Exclude: + - lib/jekyll-gist/gist_tag.rb + +Metrics/AbcSize: + Exclude: + - lib/jekyll-gist/gist_tag.rb + +Metrics/MethodLength: + Exclude: + - lib/jekyll-gist/gist_tag.rb + +Style/PreferredHashMethods: + Exclude: + - lib/jekyll-gist/gist_tag.rb diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.travis.yml new file mode 100644 index 000000000000..4eb8a4b552d2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/.travis.yml @@ -0,0 +1,22 @@ +language: ruby +script : script/cibuild +sudo: false +notifications: + email: false +branches: + only: + - master + +rvm: + - 2.4 + - 2.3 + - 2.2 + - 2.1 +env: + - "" + - JEKYLL_VERSION=3.6.2 +matrix: + include: + - # GitHub Pages + rvm: 2.4.0 + env: GH_PAGES=true diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/Gemfile new file mode 100644 index 000000000000..c24711a426ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/Gemfile @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +source "https://rubygems.org" +gemspec + +if ENV["GH_PAGES"] + gem "github-pages" +elsif ENV["JEKYLL_VERSION"] + gem "jekyll", "~> #{ENV["JEKYLL_VERSION"]}" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/History.markdown b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/History.markdown new file mode 100644 index 000000000000..586a6c2ddcbe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/History.markdown @@ -0,0 +1,76 @@ +## HEAD + +### Documentation + + * replace &#39;plugins&#39; key in config with &#39;gems&#39; (#46) + * Docs: Remove username in gist (#54) + +### Development Fixes + + * Remove testing for Jekyll 2.x + * Requires Ruby > 2.1 + * Add release script + * Inherit Jekyll&#39;s rubocop config for consistency (#48) + * define path with __dir__ (#47) + + +## 1.4.1 / 2017-06-21 + + * Don't ask .empty? until it's a String. (#38) + * rename Liquid 4 `has_key?` to `key?` to add compatibility for liquid 4 (#41) + * Test against Ruby 2.1 to 2.4 (#45) + +## 1.4.0 / 2015-12-01 + + * Allow `noscript` fallback to be disabled (#29) + * Use Octokit to fetch Gist content when passed `JEKYLL_GITHUB_TOKEN` in env(#28) + +## 1.3.5 / 2015-10-23 + + * Fix encoding error for `noscript` code (#23) + * Test against Jekyll 3, 2, and the github-pages gem (#19) + +## 1.3.4 / 2015-08-28 + + * Catch `TimeoutError` to further support 1.9.3 (#16) + +## 1.3.3 / 2015-08-20 + + * Fix gemspec to allow Ruby 1.9.3 (relates to #14) + +## 1.3.2 / 2016-08-19 + + * Re-add support for Ruby 1.9.3. Fixes #11 for 1.9.3 (#14) + * Replaced `OpenURI` with `Net::HTTP` and introduced timeout of 3 seconds (#11) + +## 1.3.1 / 2015-08-16 + + * Replaced `OpenURI` with `Net::HTTP` and introduced timeout of 3 seconds (#11) + +## 1.3.0 / 2015-08-05 + + * Added an `noscript` fallback for browsers without JavaScript enabled. (#7) + +## 1.2.1 / 2015-03-22 + + * Use `has_key?` (#6) + +## 1.2.0 / 2015-03-21 + +### Minor Enhancements + + * Allow variables as parameters (#4) + +### Development Fixes + + * Fix RSpec deprecation warning (#5) + +## 1.1.0 / 2014-06-18 + +### Minor Enhancements + + * Update regex to allow for new sha-ish ids in Gist. (#1) + +## 1.0.0 / 2014-06-01 + + * Birthday! diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/LICENSE.txt new file mode 100644 index 000000000000..3ed9f598eb17 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2014 Parker Moore + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/README.md new file mode 100644 index 000000000000..9bbba396288f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/README.md @@ -0,0 +1,69 @@ +# Jekyll::Gist + +Liquid tag for displaying GitHub Gists in Jekyll sites: `{% gist %}`. + +[![Build Status](https://travis-ci.org/jekyll/jekyll-gist.svg?branch=master)](https://travis-ci.org/jekyll/jekyll-gist) + +## Installation + +Add this line to your application's Gemfile: + + $ gem 'jekyll-gist' + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install jekyll-gist + +Then add the following to your site's `_config.yml`: + +``` +plugins: + - jekyll-gist +``` + +💡 If you are using a Jekyll version less than 3.5.0, use the `gems` key instead of `plugins`. + +## Usage + +Use the tag as follows in your Jekyll pages, posts and collections: + +```liquid +{% gist c08ee0f2726fd0e3909d %} +``` + +This will create the associated script tag: + +```html +<script src="https://gist.github.com/parkr/c08ee0f2726fd0e3909d.js"> </script> +``` + +You may optionally specify a `filename` after the `gist_id`: + +```liquid +{% gist c08ee0f2726fd0e3909d test.md %} +``` + +This will produce the correct URL to show just the specified file in your post rather than the entire Gist. + +**Pro-tip**: If you provide a personal access token with Gist scope, as the environmental variable `JEKYLL_GITHUB_TOKEN`, Jekyll Gist will use the Gist API to speed up site generation. + +## Disabling `noscript` support + +By default, Jekyll Gist will make an HTTP call per Gist to retrieve the raw content of the Gist. This information is used to propagate `noscript` tags for search engines and browsers without Javascript support. If you'd like to disable this feature, for example, to speed up builds locally, add the following to your site's `_config.yml`: + +```yml +gist: + noscript: false +``` + +## Contributing + +1. Fork it ( https://github.com/jekyll/jekyll-gist/fork ) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create a new Pull Request diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/Rakefile new file mode 100644 index 000000000000..5263b5839422 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/Rakefile @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require "bundler/gem_tasks" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/jekyll-gist.gemspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/jekyll-gist.gemspec new file mode 100644 index 000000000000..dfdd91f34d9e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/jekyll-gist.gemspec @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +lib = File.expand_path("lib", __dir__) + +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require "jekyll-gist/version" + +Gem::Specification.new do |spec| + spec.name = "jekyll-gist" + spec.version = Jekyll::Gist::VERSION + spec.authors = ["Parker Moore"] + spec.email = ["parkrmoore@gmail.com"] + spec.summary = "Liquid tag for displaying GitHub Gists in Jekyll sites." + spec.homepage = "https://github.com/jekyll/jekyll-gist" + spec.license = "MIT" + + spec.required_ruby_version = ">= 2.1" + + spec.files = `git ls-files -z`.split("\x0") + spec.executables = spec.files.grep(%r!^bin/!) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r!^(test|spec|features)/!) + spec.require_paths = ["lib"] + + spec.add_dependency "octokit", "~> 4.2" + spec.add_development_dependency "bundler", "~> 1.6" + spec.add_development_dependency "jekyll", ">= 3.0" + spec.add_development_dependency "rake" + spec.add_development_dependency "rspec" + spec.add_development_dependency "rubocop", "~> 0.51" + spec.add_development_dependency "webmock" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/lib/jekyll-gist.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/lib/jekyll-gist.rb new file mode 100644 index 000000000000..728e7ce63a9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/lib/jekyll-gist.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require "jekyll-gist/version" +require "jekyll-gist/gist_tag" + +module Jekyll + module Gist + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/lib/jekyll-gist/gist_tag.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/lib/jekyll-gist/gist_tag.rb new file mode 100644 index 000000000000..c265063c3f01 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/lib/jekyll-gist/gist_tag.rb @@ -0,0 +1,128 @@ +# frozen_string_literal: true + +require "cgi" +require "net/http" +require "octokit" + +Net::OpenTimeout = Class.new(RuntimeError) unless Net.const_defined?(:OpenTimeout) +Net::ReadTimeout = Class.new(RuntimeError) unless Net.const_defined?(:ReadTimeout) + +module Jekyll + module Gist + class GistTag < Liquid::Tag + def render(context) + @encoding = context.registers[:site].config["encoding"] || "utf-8" + @settings = context.registers[:site].config["gist"] + if (tag_contents = determine_arguments(@markup.strip)) + gist_id = tag_contents[0] + filename = tag_contents[1] + if context_contains_key?(context, gist_id) + gist_id = context[gist_id] + end + if context_contains_key?(context, filename) + filename = context[filename] + end + noscript_tag = gist_noscript_tag(gist_id, filename) + script_tag = gist_script_tag(gist_id, filename) + "#{noscript_tag}#{script_tag}" + else + raise ArgumentError, <<-EOS + Syntax error in tag 'gist' while parsing the following markup: + + #{@markup} + + Valid syntax: + {% gist user/1234567 %} + {% gist user/1234567 foo.js %} + {% gist 28949e1d5ee2273f9fd3 %} + {% gist 28949e1d5ee2273f9fd3 best.md %} + EOS + end + end + + private + + def determine_arguments(input) + matched = input.match(%r!\A([\S]+|.*(?=\/).+)\s?(\S*)\Z!) + [matched[1].strip, matched[2].strip] if matched && matched.length >= 3 + end + + private + + def context_contains_key?(context, key) + if context.respond_to?(:has_key?) + context.has_key?(key) + else + context.key?(key) + end + end + + def gist_script_tag(gist_id, filename = nil) + url = "https://gist.github.com/#{gist_id}.js" + url = "#{url}?file=#{filename}" unless filename.to_s.empty? + "<script src=\"#{url}\"> </script>" + end + + def gist_noscript_tag(gist_id, filename = nil) + return if @settings && @settings["noscript"] == false + code = fetch_raw_code(gist_id, filename) + if !code.nil? + code = code.force_encoding(@encoding) + code = CGI.escapeHTML(code) + + # CGI.escapeHTML behavior differs in Ruby < 2.0 + # See https://github.com/jekyll/jekyll-gist/pull/28 + code = code.gsub("'", "&#39;") if RUBY_VERSION < "2.0" + + "<noscript><pre>#{code}</pre></noscript>" + else + Jekyll.logger.warn "Warning:", "The <noscript> tag for your gist #{gist_id} " + Jekyll.logger.warn "", "could not be generated. This will affect users who do " + Jekyll.logger.warn "", "not have JavaScript enabled in their browsers." + end + end + + def fetch_raw_code(gist_id, filename = nil) + return code_from_api(gist_id, filename) if ENV["JEKYLL_GITHUB_TOKEN"] + + url = "https://gist.githubusercontent.com/#{gist_id}/raw" + url = "#{url}/#{filename}" unless filename.to_s.empty? + uri = URI(url) + Net::HTTP.start(uri.host, uri.port, + :use_ssl => uri.scheme == "https", + :read_timeout => 3, :open_timeout => 3) do |http| + request = Net::HTTP::Get.new uri.to_s + response = http.request(request) + response.body + end + rescue SocketError, Net::HTTPError, Net::OpenTimeout, Net::ReadTimeout, TimeoutError + nil + end + + private + + def code_from_api(gist_id, filename = nil) + gist = GistTag.client.gist gist_id + + file = if filename.to_s.empty? + # No file specified, return the value of the first key/value pair + gist.files.first[1] + else + # .files is a hash of :"filename.extension" => data pairs + # Rather than using to_sym on arbitrary user input, + # Find our file by calling to_s on the keys + match = gist.files.find { |name, _data| name.to_s == filename } + match[1] if match + end + + file[:content] if file + end + + def self.client + @client ||= Octokit::Client.new :access_token => ENV["JEKYLL_GITHUB_TOKEN"] + end + end + end +end + +Liquid::Template.register_tag("gist", Jekyll::Gist::GistTag) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/lib/jekyll-gist/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/lib/jekyll-gist/version.rb new file mode 100644 index 000000000000..0de8671cfa26 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/lib/jekyll-gist/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Jekyll + module Gist + VERSION = "1.5.0".freeze + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/bootstrap new file mode 100644 index 000000000000..31a01b794fe5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/bootstrap @@ -0,0 +1,4 @@ +#! /usr/bin/env bash +set -ex + +bundle install diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/cibuild new file mode 100644 index 000000000000..70e6da620b2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/cibuild @@ -0,0 +1,5 @@ +#! /usr/bin/env bash +set -e + +script/fmt +bundle exec rspec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/fmt b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/fmt new file mode 100644 index 000000000000..c5351ecf017f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/fmt @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +echo "Rubocop $(bundle exec rubocop --version)" +bundle exec rubocop -D -E $@ +success=$? +if ((success != 0)); then + echo -e "\nTry running \`script/fmt -a\` to automatically fix errors" +fi +exit $success diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/release b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/release new file mode 100644 index 000000000000..c204a27a909c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/script/release @@ -0,0 +1,3 @@ +#! /bin/bash + +rake release diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/fixtures/multiple-files.json b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/fixtures/multiple-files.json new file mode 100644 index 000000000000..338d3a716f5b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/fixtures/multiple-files.json @@ -0,0 +1,111 @@ +{ + "url": "https://api.github.com/gists/aa5a315d61ae9438b18d", + "forks_url": "https://api.github.com/gists/aa5a315d61ae9438b18d/forks", + "commits_url": "https://api.github.com/gists/aa5a315d61ae9438b18d/commits", + "id": "aa5a315d61ae9438b18d", + "description": "description of gist", + "public": true, + "owner": { + "login": "octocat", + "id": 1, + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "user": null, + "files": { + "ring.erl": { + "size": 932, + "raw_url": "https://gist.githubusercontent.com/raw/365370/8c4d2d43d178df44f4c03a7f2ac0ff512853564e/ring.erl", + "type": "text/plain", + "language": "Erlang", + "truncated": false, + "content": "contents of gist" + }, + "hello-world.rb": { + "size": 932, + "raw_url": "https://gist.githubusercontent.com/raw/365370/8c4d2d43d178df44f4c03a7f2ac0ff512853564e/ring.erl", + "type": "text/plain", + "language": "Ruby", + "truncated": false, + "content": "puts 'hello world'" + } + }, + "comments": 0, + "comments_url": "https://api.github.com/gists/aa5a315d61ae9438b18d/comments/", + "html_url": "https://gist.github.com/aa5a315d61ae9438b18d", + "git_pull_url": "https://gist.github.com/aa5a315d61ae9438b18d.git", + "git_push_url": "https://gist.github.com/aa5a315d61ae9438b18d.git", + "created_at": "2010-04-14T02:15:15Z", + "updated_at": "2011-06-20T11:34:15Z", + "forks": [ + { + "user": { + "login": "octocat", + "id": 1, + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "url": "https://api.github.com/gists/dee9c42e4998ce2ea439", + "id": "dee9c42e4998ce2ea439", + "created_at": "2011-04-14T16:00:49Z", + "updated_at": "2011-04-14T16:00:49Z" + } + ], + "history": [ + { + "url": "https://api.github.com/gists/aa5a315d61ae9438b18d/57a7f021a713b1c5a6a199b54cc514735d2d462f", + "version": "57a7f021a713b1c5a6a199b54cc514735d2d462f", + "user": { + "login": "octocat", + "id": 1, + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "change_status": { + "deletions": 0, + "additions": 180, + "total": 180 + }, + "committed_at": "2010-04-14T02:15:15Z" + } + ] +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/fixtures/single-file.json b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/fixtures/single-file.json new file mode 100644 index 000000000000..9ac792132fbd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/fixtures/single-file.json @@ -0,0 +1,103 @@ +{ + "url": "https://api.github.com/gists/aa5a315d61ae9438b18d", + "forks_url": "https://api.github.com/gists/aa5a315d61ae9438b18d/forks", + "commits_url": "https://api.github.com/gists/aa5a315d61ae9438b18d/commits", + "id": "aa5a315d61ae9438b18d", + "description": "description of gist", + "public": true, + "owner": { + "login": "octocat", + "id": 1, + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "user": null, + "files": { + "ring.erl": { + "size": 932, + "raw_url": "https://gist.githubusercontent.com/raw/365370/8c4d2d43d178df44f4c03a7f2ac0ff512853564e/ring.erl", + "type": "text/plain", + "language": "Erlang", + "truncated": false, + "content": "contents of gist" + } + }, + "comments": 0, + "comments_url": "https://api.github.com/gists/aa5a315d61ae9438b18d/comments/", + "html_url": "https://gist.github.com/aa5a315d61ae9438b18d", + "git_pull_url": "https://gist.github.com/aa5a315d61ae9438b18d.git", + "git_push_url": "https://gist.github.com/aa5a315d61ae9438b18d.git", + "created_at": "2010-04-14T02:15:15Z", + "updated_at": "2011-06-20T11:34:15Z", + "forks": [ + { + "user": { + "login": "octocat", + "id": 1, + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "url": "https://api.github.com/gists/dee9c42e4998ce2ea439", + "id": "dee9c42e4998ce2ea439", + "created_at": "2011-04-14T16:00:49Z", + "updated_at": "2011-04-14T16:00:49Z" + } + ], + "history": [ + { + "url": "https://api.github.com/gists/aa5a315d61ae9438b18d/57a7f021a713b1c5a6a199b54cc514735d2d462f", + "version": "57a7f021a713b1c5a6a199b54cc514735d2d462f", + "user": { + "login": "octocat", + "id": 1, + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "change_status": { + "deletions": 0, + "additions": 180, + "total": 180 + }, + "committed_at": "2010-04-14T02:15:15Z" + } + ] +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/gist_tag_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/gist_tag_spec.rb new file mode 100644 index 000000000000..f04618c3094e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/gist_tag_spec.rb @@ -0,0 +1,175 @@ +require "spec_helper" + +describe(Jekyll::Gist::GistTag) do + let(:http_output) { "<test>true</test>" } + let(:doc) { doc_with_content(content) } + let(:content) { "{% gist #{gist} %}" } + let(:output) do + doc.content = content + doc.output = Jekyll::Renderer.new(doc.site, doc).run + end + + before(:each) { ENV["JEKYLL_GITHUB_TOKEN"] = nil } + + context "valid gist" do + context "with user prefix" do + before { stub_request(:get, "https://gist.githubusercontent.com/#{gist}/raw").to_return(:body => http_output) } + let(:gist) { "mattr-/24081a1d93d2898ecf0f" } + + it "produces the correct script tag" do + expect(output).to match(%r!<script src="https:\/\/gist.github.com\/#{gist}.js">\s<\/script>!) + end + it "produces the correct noscript tag" do + expect(output).to match(%r!<noscript><pre>&lt;test&gt;true&lt;\/test&gt;<\/pre><\/noscript>\n!) + end + end + + context "without user prefix" do + before { stub_request(:get, "https://gist.githubusercontent.com/#{gist}/raw").to_return(:body => http_output) } + let(:gist) { "28949e1d5ee2273f9fd3" } + + it "produces the correct script tag" do + expect(output).to match(%r!<script src="https:\/\/gist.github.com\/#{gist}.js">\s<\/script>!) + end + it "produces the correct noscript tag" do + expect(output).to match(%r!<noscript><pre>&lt;test&gt;true&lt;\/test&gt;<\/pre><\/noscript>\n!) + end + end + + context "classic Gist id style" do + before { stub_request(:get, "https://gist.githubusercontent.com/#{gist}/raw").to_return(:body => http_output) } + let(:gist) { "1234321" } + + it "produces the correct script tag" do + expect(output).to match(%r!<script src="https:\/\/gist.github.com\/#{gist}.js">\s<\/script>!) + end + it "produces the correct noscript tag" do + expect(output).to match(%r!<noscript><pre>&lt;test&gt;true&lt;\/test&gt;<\/pre><\/noscript>\n!) + end + end + + context "with file specified" do + before { stub_request(:get, "https://gist.githubusercontent.com/#{gist}/raw/#{filename}").to_return(:body => http_output) } + let(:gist) { "mattr-/24081a1d93d2898ecf0f" } + let(:filename) { "myfile.ext" } + let(:content) { "{% gist #{gist} #{filename} %}" } + + it "produces the correct script tag" do + expect(output).to match(%r!<script src="https:\/\/gist.github.com\/#{gist}.js\?file=#{filename}">\s<\/script>!) + end + it "produces the correct noscript tag" do + expect(output).to match(%r!<noscript><pre>&lt;test&gt;true&lt;\/test&gt;<\/pre><\/noscript>\n!) + end + end + + context "with variable gist id" do + before { stub_request(:get, "https://gist.githubusercontent.com/#{gist_id}/raw").to_return(:body => http_output) } + let(:gist_id) { "1342013" } + let(:gist) { "page.gist_id" } + let(:output) do + doc.data["gist_id"] = gist_id + doc.content = content + doc.output = Jekyll::Renderer.new(doc.site, doc).run + end + + it "produces the correct script tag" do + expect(output).to match(%r!<script src="https:\/\/gist.github.com\/#{doc.data['gist_id']}.js">\s<\/script>!) + end + it "produces the correct noscript tag" do + expect(output).to match(%r!<noscript><pre>&lt;test&gt;true&lt;\/test&gt;<\/pre><\/noscript>\n!) + end + end + + context "with variable gist id and filename" do + before { stub_request(:get, "https://gist.githubusercontent.com/#{gist_id}/raw/#{gist_filename}").to_return(:body => http_output) } + let(:gist_id) { "1342013" } + let(:gist_filename) { "atom.xml" } + let(:gist) { "page.gist_id" } + let(:filename) { "page.gist_filename" } + let(:content) { "{% gist #{gist} #{filename} %}" } + let(:output) do + doc.data["gist_id"] = "1342013" + doc.data["gist_filename"] = "atom.xml" + doc.content = content + doc.output = Jekyll::Renderer.new(doc.site, doc).run + end + + it "produces the correct script tag" do + expect(output).to match(%r!<script src="https:\/\/gist.github.com\/#{doc.data['gist_id']}.js\?file=#{doc.data['gist_filename']}">\s<\/script>!) + end + + it "produces the correct noscript tag" do + expect(output).to match(%r!<noscript><pre>&lt;test&gt;true&lt;\/test&gt;<\/pre><\/noscript>\n!) + end + end + + context "with valid gist id and invalid filename" do + before { stub_request(:get, "https://gist.githubusercontent.com/#{gist_id}/raw/#{gist_filename}").to_return(:status => 404) } + let(:gist_id) { "mattr-/24081a1d93d2898ecf0f" } + let(:gist_filename) { "myfile.ext" } + let(:content) { "{% gist #{gist_id} #{gist_filename} %}" } + + it "produces the correct script tag" do + expect(output).to match(%r!<script src="https:\/\/gist.github.com\/#{gist_id}.js\?file=#{gist_filename}">\s<\/script>!) + end + + it "does not produce the noscript tag" do + expect(output).to_not match(%r!<noscript><pre>&lt;test&gt;true&lt;\/test&gt;<\/pre><\/noscript>\n!) + end + end + + context "with token" do + before { ENV["JEKYLL_GITHUB_TOKEN"] = "1234" } + before do + stub_request(:get, "https://api.github.com/gists/1342013") + .to_return(:status => 200, :body => fixture("single-file"), :headers => { "Content-Type" => "application/json" }) + end + let(:gist_id) { "1342013" } + let(:gist) { "page.gist_id" } + let(:output) do + doc.data["gist_id"] = gist_id + doc.content = content + doc.output = Jekyll::Renderer.new(doc.site, doc).run + end + + it "produces the noscript tag" do + expect(output).to match(%r!<noscript><pre>contents of gist<\/pre><\/noscript>!) + end + + context "with a filename" do + before do + stub_request(:get, "https://api.github.com/gists/1342013") + .to_return(:status => 200, :body => fixture("multiple-files"), :headers => { "Content-Type" => "application/json" }) + end + let(:content) { "{% gist 1342013 hello-world.rb %}" } + + it "produces the noscript tag" do + expect(output).to match(%r!<noscript><pre>puts &#39;hello world&#39;<\/pre><\/noscript>!) + end + end + end + + context "with noscript disabled" do + let(:doc) { doc_with_content(content, { "gist" => { "noscript" => false } }) } + let(:output) do + doc.content = content + doc.output = Jekyll::Renderer.new(doc.site, doc).run + end + let(:gist) { "mattr-/24081a1d93d2898ecf0f" } + + it "does not produce the noscript tag" do + expect(output).to_not match(%r!<noscript>!) + end + end + end + + context "invalid gist" do + context "no gist id present" do + let(:gist) { "" } + + it "raises an error" do + expect(-> { output }).to raise_error + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/spec_helper.rb new file mode 100644 index 000000000000..f2d0a7ae8395 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-gist-1.5.0/spec/spec_helper.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +TEST_DIR = __dir__ +TMP_DIR = File.expand_path("../tmp", TEST_DIR) + +require "webmock/rspec" +require "cgi" +require "jekyll" +require File.expand_path("../lib/jekyll-gist.rb", TEST_DIR) + +Jekyll.logger.log_level = :error + +RSpec.configure do |config| + config.run_all_when_everything_filtered = true + config.filter_run :focus + config.order = "random" + + def tmp_dir(*files) + File.join(TMP_DIR, *files) + end + + def source_dir(*files) + tmp_dir("source", *files) + end + + def dest_dir(*files) + tmp_dir("dest", *files) + end + + def doc_with_content(_content, opts = {}) + my_site = site(opts) + Jekyll::Document.new(source_dir("_test/doc.md"), { :site => my_site, :collection => collection(my_site) }) + end + + def collection(site, label = "test") + Jekyll::Collection.new(site, label) + end + + def site(opts = {}) + conf = Jekyll::Utils.deep_merge_hashes(Jekyll::Configuration::DEFAULTS, opts.merge({ + "source" => source_dir, + "destination" => dest_dir, + })) + Jekyll::Site.new(conf) + end + + def fixture(name) + path = File.expand_path "fixtures/#{name}.json", __dir__ + File.open(path).read + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata.rb new file mode 100644 index 000000000000..6aaa00424da6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: true + +require "jekyll" +require "octokit" + +if Jekyll.env == "development" + begin + require "dotenv" + Dotenv.load + rescue LoadError + Jekyll.logger.debug "Dotenv not found. Skipping" + end +end + +module Jekyll + module GitHubMetadata + autoload :Client, "jekyll-github-metadata/client" + autoload :EditLinkTag, "jekyll-github-metadata/edit-link-tag" + autoload :MetadataDrop, "jekyll-github-metadata/metadata_drop" + autoload :Owner, "jekyll-github-metadata/owner" + autoload :Pages, "jekyll-github-metadata/pages" + autoload :Repository, "jekyll-github-metadata/repository" + autoload :RepositoryFinder, "jekyll-github-metadata/repository_finder" + autoload :RepositoryCompat, "jekyll-github-metadata/repository_compat" + autoload :Sanitizer, "jekyll-github-metadata/sanitizer" + autoload :Value, "jekyll-github-metadata/value" + autoload :VERSION, "jekyll-github-metadata/version" + + NoRepositoryError = RepositoryFinder::NoRepositoryError + + require_relative "jekyll-github-metadata/site_github_munger" if Jekyll.const_defined? :Site + + class << self + attr_reader :repository_finder + attr_writer :client, :logger + + def site + repository_finder.site + end + + def environment + Jekyll.env + end + + def logger + @logger ||= Jekyll.logger + end + + def log(severity, message) + if logger.method(severity).arity.abs >= 2 + logger.public_send(severity, "GitHub Metadata:", message.to_s) + else + logger.public_send(severity, "GitHub Metadata: #{message}") + end + end + + def client + @client ||= Client.new + end + + def repository + @repository ||= GitHubMetadata::Repository.new(repository_finder.nwo).tap do |repo| + log :debug, "Generating for #{repo.nwo}" + end + end + + def site=(new_site) + reset! + @repository_finder = GitHubMetadata::RepositoryFinder.new(new_site) + end + + def reset! + @logger = @client = @repository = @nwo = @site = nil + end + end + end +end + +Liquid::Template.register_tag("github_edit_link", Jekyll::GitHubMetadata::EditLinkTag) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/client.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/client.rb new file mode 100644 index 000000000000..fca7c7a75cb6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/client.rb @@ -0,0 +1,152 @@ +# frozen_string_literal: true + +require "digest" + +module Jekyll + module GitHubMetadata + class Client + InvalidMethodError = Class.new(NoMethodError) + BadCredentialsError = Class.new(StandardError) + + # Whitelisted API calls. + API_CALLS = Set.new(%w( + repository + organization + user + repository? + pages + contributors + releases + latest_release + list_repos + organization_public_members + )) + + def initialize(options = nil) + @client = build_octokit_client(options) + end + + def safe_require(gem_name) + require gem_name + true + rescue LoadError + false + end + + def default_octokit_options + { + :api_endpoint => Jekyll::GitHubMetadata::Pages.api_url, + :web_endpoint => Jekyll::GitHubMetadata::Pages.github_url, + :auto_paginate => true, + } + end + + def build_octokit_client(options = nil) + options ||= {} + options.merge!(pluck_auth_method) unless options.key?(:access_token) + Octokit::Client.new(default_octokit_options.merge(options)) + end + + def accepts_client_method?(method_name) + API_CALLS.include?(method_name.to_s) && @client.respond_to?(method_name) + end + + def respond_to_missing?(method_name, include_private = false) + accepts_client_method?(method_name) || super + end + + def method_missing(method_name, *args, &block) + method = method_name.to_s + if accepts_client_method?(method_name) + key = cache_key(method_name, args) + GitHubMetadata.log :debug, "Calling @client.#{method}(#{args.map(&:inspect).join(", ")})" + cache[key] ||= save_from_errors { @client.public_send(method_name, *args, &block) } + elsif @client.respond_to?(method_name) + raise InvalidMethodError, "#{method_name} is not whitelisted on #{inspect}" + else + super + end + end + + # NOTE: Faraday's error classes has been promoted to under Faraday module from v1.0.0. + # This patch aims to prevent on locking specific version of Faraday. + FARADAY_FAILED_CONNECTION = + begin + Faraday::Error::ConnectionFailed + rescue NameError + Faraday::ConnectionFailed + end + + def save_from_errors(default = false) + unless internet_connected? + GitHubMetadata.log :warn, "No internet connection. GitHub metadata may be missing or incorrect." + return default + end + + yield @client + rescue Octokit::Unauthorized + raise BadCredentialsError, "The GitHub API credentials you provided aren't valid." + rescue FARADAY_FAILED_CONNECTION, Octokit::TooManyRequests => e + GitHubMetadata.log :warn, e.message + default + rescue Octokit::NotFound + default + end + + def inspect + "#<#{self.class.name} @client=#{client_inspect} @internet_connected=#{internet_connected?}>" + end + + def authenticated? + !@client.access_token.to_s.empty? + end + + def internet_connected? + return @internet_connected if defined?(@internet_connected) + + require "resolv" + begin + Resolv::DNS.open do |dns| + dns.timeouts = 2 + dns.getaddress("api.github.com") + end + @internet_connected = true + rescue Resolv::ResolvError + @internet_connected = false + end + end + + private + + def client_inspect + if @client.nil? + "nil" + else + "#<#{@client.class.name} (#{"un" unless authenticated?}authenticated)>" + end + end + + # rubocop:disable Metrics/CyclomaticComplexity + def pluck_auth_method + if ENV["JEKYLL_GITHUB_TOKEN"] || Octokit.access_token + { :access_token => ENV["JEKYLL_GITHUB_TOKEN"] || Octokit.access_token } + elsif !ENV["NO_NETRC"] && File.exist?(File.join(ENV["HOME"], ".netrc")) && safe_require("netrc") + { :netrc => true } + else + GitHubMetadata.log :warn, "No GitHub API authentication could be found." \ + " Some fields may be missing or have incorrect data." + {}.freeze + end + end + # rubocop:enable Metrics/CyclomaticComplexity + + def cache_key(method, *args) + Digest::SHA1.hexdigest(method.to_s + args.join(", ")) + end + + def cache + @cache ||= {} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/edit-link-tag.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/edit-link-tag.rb new file mode 100644 index 000000000000..c150646bc6bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/edit-link-tag.rb @@ -0,0 +1,125 @@ +# frozen_string_literal: true + +module Jekyll + module GitHubMetadata + class EditLinkTag < Liquid::Tag + attr_reader :context + + # Defines an instance method that delegates to a hash's key + # + # hash_method - a symbol representing the instance method to delegate to. The + # instance method should return a hash or respond to #[] + # key - the key to call within the hash + # method - (optional) the instance method the key should be aliased to. + # If not specified, defaults to the hash key + # default - (optional) value to return if value is nil (defaults to nil) + # + # Returns a symbol representing the instance method + def self.def_hash_delegator(hash_method, key, method, default = nil) + define_method(method) do + hash = send(hash_method) + if hash.respond_to? :[] + hash[key.to_s] || default + else + default + end + end + end + + MISSING_DATA_MSG = "Cannot generate edit URLs due to missing site.github data" + LINK_TEXT_REGEX = %r!(?:\"(.*)\"|'(.*)')!.freeze + + extend Forwardable + private def_hash_delegator :site, :github, :site_github, {} + private def_hash_delegator :site_github, :repository_url, :repository_url + private def_hash_delegator :site_github, :source, :source, {} + private def_hash_delegator :source, :branch, :branch + private def_hash_delegator :source, :path, :source_path + private def_hash_delegator :page, :path, :page_path + + def render(context) + @context = context + if link_text + link + else + uri.to_s + end + end + + private + + def link_text + @link_text ||= begin + matches = @markup.match LINK_TEXT_REGEX + matches[1] || matches[2] if matches + end + end + + def link + "<a href=\"#{uri}\">#{link_text}</a>" + end + + def uri + if parts.any?(&:nil?) + Jekyll.logger.warn "JekyllEditLink: ", MISSING_DATA_MSG + "" + else + Addressable::URI.join(*parts_normalized).normalize + end + end + + def parts + memoize_conditionally { [repository_url, "edit/", branch, source_path, page_path] } + end + + def parts_normalized + memoize_conditionally do + parts.map.with_index do |part, index| + part = remove_leading_slash(part.to_s) + part = ensure_trailing_slash(part) unless index == parts.length - 1 + ensure_not_just_a_slash(part) + end + end + end + + def page + memoize_conditionally { context.registers[:page] } + end + + # Utility function for compatibility with Jekyll 4.0 + def memoize_conditionally + if renderer_cached? + yield + else + dispatcher = "@#{caller_locations(1..1).first.label}".to_sym + if instance_variable_defined?(dispatcher) + instance_variable_get(dispatcher) + else + instance_variable_set(dispatcher, yield) + end + end + end + + # Utility function to detect Jekyll 4.0 + def renderer_cached? + @renderer_cached ||= context.registers[:site].liquid_renderer.respond_to?(:cache) + end + + def site + @site ||= context.registers[:site].site_payload["site"] + end + + def remove_leading_slash(part) + part.start_with?("/") ? part[1..-1] : part + end + + def ensure_trailing_slash(part) + part.end_with?("/") ? part : "#{part}/" + end + + def ensure_not_just_a_slash(part) + part == "/" ? "" : part + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/metadata_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/metadata_drop.rb new file mode 100644 index 000000000000..e7be085f7c59 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/metadata_drop.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +require "jekyll" +require "forwardable" + +module Jekyll + module GitHubMetadata + class MetadataDrop < Jekyll::Drops::Drop + extend Forwardable + + mutable true + + # See https://github.com/jekyll/jekyll/pull/6338 + alias_method :invoke_drop, :[] + def key?(key) + return false if key.nil? + return true if self.class.mutable? && mutations.key?(key) + + respond_to?(key) || fallback_data.key?(key) + end + + def to_s + require "json" + JSON.pretty_generate to_h + end + alias_method :to_str, :to_s + + def content_methods + super - %w(to_s to_str) + end + + def keys + super.sort + end + + def_delegator Jekyll::GitHubMetadata::Pages, :env, :environment + def_delegator Jekyll::GitHubMetadata::Pages, :env, :pages_env + def_delegator Jekyll::GitHubMetadata::Pages, :github_hostname, :hostname + def_delegator Jekyll::GitHubMetadata::Pages, :pages_hostname, :pages_hostname + def_delegator Jekyll::GitHubMetadata::Pages, :api_url, :api_url + def_delegator Jekyll::GitHubMetadata::Pages, :help_url, :help_url + + private def_delegator Jekyll::GitHubMetadata, :repository + + def_delegator :repository, :owner_public_repositories, :public_repositories + def_delegator :repository, :organization_public_members, :organization_members + def_delegator :repository, :name, :project_title + def_delegator :repository, :tagline, :project_tagline + def_delegator :repository, :owner_metadata, :owner + def_delegator :repository, :owner, :owner_name + def_delegator :repository, :owner_url, :owner_url + def_delegator :repository, :owner_gravatar_url, :owner_gravatar_url + def_delegator :repository, :repository_url, :repository_url + def_delegator :repository, :nwo, :repository_nwo + def_delegator :repository, :name, :repository_name + def_delegator :repository, :zip_url, :zip_url + def_delegator :repository, :tar_url, :tar_url + def_delegator :repository, :repo_clone_url, :clone_url + def_delegator :repository, :releases_url, :releases_url + def_delegator :repository, :issues_url, :issues_url + def_delegator :repository, :wiki_url, :wiki_url + def_delegator :repository, :language, :language + def_delegator :repository, :user_page?, :is_user_page + def_delegator :repository, :project_page?, :is_project_page + def_delegator :repository, :show_downloads?, :show_downloads + def_delegator :repository, :html_url, :url + def_delegator :repository, :baseurl, :baseurl + def_delegator :repository, :contributors, :contributors + def_delegator :repository, :releases, :releases + def_delegator :repository, :latest_release, :latest_release + def_delegator :repository, :private?, :private + def_delegator :repository, :archived?, :archived + def_delegator :repository, :disabled?, :disabled + def_delegator :repository, :license, :license + def_delegator :repository, :source, :source + + def versions + return @versions if defined?(@versions) + + begin + require "github-pages" + @versions = GitHubPages.versions + rescue LoadError + @versions = {} + end + end + + def build_revision + @build_revision ||= begin + ENV["JEKYLL_BUILD_REVISION"] || `git rev-parse HEAD`.strip + end + end + + private + + # Nothing to see here. + def fallback_data + @fallback_data ||= {} + end + + def mutations + @mutations ||= {} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/owner.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/owner.rb new file mode 100644 index 000000000000..8430170a04f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/owner.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +module Jekyll + module GitHubMetadata + class Owner + extend Forwardable + + # Defines an instance method that delegates to a hash's key + # + # hash - a symbol representing the instance method to delegate to. The + # instance method should return a hash or respond to #[] + # key - the key to call within the hash + # method - (optional) the instance method the key should be aliased to. + # If not specified, defaults to the hash key + # + # Returns a symbol representing the instance method + def self.def_hash_delegators(hash, *methods) + content_methods.concat(methods) + methods.each do |method| + define_method(method) do + send(hash)[method.to_s] + end + end + end + + def self.content_methods + @content_methods ||= [] + end + + # List of whitelisted keys. + def_hash_delegators :owner_info, + :avatar_url, + :bio, + :blog, + :collaborators, + :company, + :created_at, + :description, + :email, + :followers, + :following, + :has_organization_projects, + :has_repository_projects, + :hireable, + :html_url, + :id, + :is_verified, + :location, + :login, + :name, + :node_id, + :public_gists, + :public_gists, + :public_repos, + :public_repos, + :type, + :updated_at + + attr_reader :owner_login + + def initialize(owner_login) + @owner_login = owner_login + end + + def to_h + @to_h ||= self.class.content_methods + .each_with_object({}) { |method, hash| hash[method.to_s] = public_send(method) } + end + alias_method :to_hash, :to_h + def_delegator :to_h, :to_json, :to_json + def_delegator :to_h, :to_liquid, :to_liquid + + def_delegator :to_h, :to_s, :to_s + alias_method :to_str, :to_s + + private + + def owner_info + @owner_info ||= begin + Value.new( + "owner", + proc do |c| + (c.organization(owner_login) || c.user(owner_login) || {}).to_h + end + ).render || {} + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/pages.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/pages.rb new file mode 100644 index 000000000000..eba58940bc45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/pages.rb @@ -0,0 +1,115 @@ +# frozen_string_literal: true + +module Jekyll + module GitHubMetadata + class Pages + class << self + DEFAULTS = { + "PAGES_ENV" => "development", + "PAGES_API_URL" => "https://api.github.com", + "PAGES_HELP_URL" => "https://help.github.com", + "PAGES_GITHUB_HOSTNAME" => "github.com", + "PAGES_PAGES_HOSTNAME" => "github.io", + "SSL" => "false", + "SUBDOMAIN_ISOLATION" => "false", + "PAGES_PREVIEW_HTML_URL" => nil, + "PAGE_BUILD_ID" => nil, + }.freeze + + # Whether the GitHub instance supports HTTPS + # Note: this will be the same as how sites are served in Enterprise, + # but may be different from how sites are served on GitHub.com. + # See Repository#url_scheme + def ssl? + env_var("SSL") == "true" || test? + end + + def scheme + ssl? ? "https" : "http" + end + + def subdomain_isolation? + env_var("SUBDOMAIN_ISOLATION").eql? "true" + end + + def test? + env == "test" + end + + def dotcom? + env == "dotcom" + end + + def enterprise? + env == "enterprise" + end + + def development? + env == "development" + end + + def custom_domains_enabled? + dotcom? || test? + end + + def env + env_var "PAGES_ENV", ENV["JEKYLL_ENV"] + end + + def repo_pages_html_url_preview? + env_var "PAGES_PREVIEW_HTML_URL" + end + + def github_url + if dotcom? || github_hostname == "github.com" + "https://github.com" + else + "#{scheme}://#{github_hostname}" + end + end + + def api_url + trim_last_slash env_var("PAGES_API_URL", ENV["API_URL"]) + end + + def help_url + trim_last_slash env_var("PAGES_HELP_URL", ENV["HELP_URL"]) + end + + def github_hostname + trim_last_slash env_var("PAGES_GITHUB_HOSTNAME", ENV["GITHUB_HOSTNAME"]) + end + + def pages_hostname + intermediate_default = ENV["PAGES_HOSTNAME"] + intermediate_default ||= "localhost:4000" if development? + trim_last_slash env_var("PAGES_PAGES_HOSTNAME", intermediate_default) + end + + def page_build? + !env_var("PAGE_BUILD_ID").to_s.empty? + end + + def configuration + (methods - Object.methods - [:configuration]).sort.each_with_object({}) do |meth, memo| + memo[meth.to_s] = public_send(meth) + end + end + + private + + def env_var(key, intermediate_default = nil) + !ENV[key].to_s.empty? ? ENV[key] : (intermediate_default || DEFAULTS[key]) + end + + def trim_last_slash(url) + if url[-1] == "/" + url[0..-2] + else + url + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/repository.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/repository.rb new file mode 100644 index 000000000000..03cfeafa1dfd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/repository.rb @@ -0,0 +1,209 @@ +# frozen_string_literal: true + +module Jekyll + module GitHubMetadata + class Repository + attr_reader :nwo, :owner, :name + + # Defines an instance method that delegates to a hash's key + # + # hash - a symbol representing the instance method to delegate to. The + # instance method should return a hash or respond to #[] + # key - the key to call within the hash + # method - (optional) the instance method the key should be aliased to. + # If not specified, defaults to the hash key + # + # Returns a symbol representing the instance method + def self.def_hash_delegator(hash, key, method) + define_method(method) do + public_send(hash)[key.to_s] + end + end + + extend Forwardable + def_hash_delegator :repo_info, :license, :license + def_hash_delegator :repo_info, :language, :language + def_hash_delegator :repo_info, :description, :tagline + def_hash_delegator :repo_info, :has_downloads, :show_downloads? + def_hash_delegator :repo_info, :private, :private? + def_hash_delegator :repo_info, :archived, :archived? + def_hash_delegator :repo_info, :disabled, :disabled? + def_hash_delegator :latest_release, :url, :latest_release_url + def_hash_delegator :source, :branch, :git_ref + + def_delegator :uri, :host, :domain + def_delegator :uri, :scheme, :url_scheme + def_delegator :uri, :path, :baseurl + + def initialize(name_with_owner) + @nwo = name_with_owner + @owner = nwo.split("/").first + @name = nwo.split("/").last + end + + def repo_compat + @repo_compat ||= Jekyll::GitHubMetadata::RepositoryCompat.new(self) + end + + def repo_info + @repo_info ||= begin + options = { :accept => "application/vnd.github.drax-preview+json" } + (Value.new("repo_info", proc { |c| c.repository(nwo, options) }).render || {}) + end + end + + def repo_pages_info + @repo_pages_info ||= (Value.new("repo_pages_info", proc { |c| c.pages(nwo, repo_pages_info_opts) }).render || {}) + end + + def repo_pages_info_opts + if Pages.repo_pages_html_url_preview? + { :accept => "application/vnd.github.mister-fantastic-preview+json" } + else + {} + end + end + + def owner_metadata + @owner_metadata ||= Jekyll::GitHubMetadata::Owner.new(owner) + end + + def owner_url + "#{Pages.github_url}/#{owner}" + end + + def owner_gravatar_url + "#{owner_url}.png" + end + + def repo_clone_url + "#{repository_url}.git" + end + + def repository_url + "#{owner_url}/#{name}" + end + + def zip_url + "#{repository_url}/zipball/#{git_ref}" + end + + def tar_url + "#{repository_url}/tarball/#{git_ref}" + end + + def releases_url + "#{repository_url}/releases" + end + + def issues_url + "#{repository_url}/issues" if repo_info["has_issues"] + end + + def wiki_url + "#{repository_url}/wiki" if repo_info["has_wiki"] + end + + def organization_repository? + memoize_value :@is_organization_repository, Value.new("organization_repository?", proc { |c| !!c.organization(owner) }) + end + + def owner_public_repositories + options = { + :type => "public", + :accept => "application/vnd.github.mercy-preview+json", + } + memoize_value :@owner_public_repositories, Value.new("owner_public_repositories", proc { |c| c.list_repos(owner, options) }) + end + + def organization_public_members + memoize_value :@organization_public_members, Value.new("organization_public_members", proc do |c| + c.organization_public_members(owner) if organization_repository? + end) + end + + def contributors + memoize_value :@contributors, Value.new("contributors", proc { |c| c.contributors(nwo) }) + end + + def releases + memoize_value :@releases, Value.new("releases", proc { |c| c.releases(nwo) }) + end + + def latest_release + memoize_value :@latest_release, Value.new("latest_release", proc { |c| c.latest_release(nwo) }) + end + + def source + repo_pages_info["source"] || repo_compat.source + end + + def project_page? + !user_page? + end + + def github_repo? + !Pages.enterprise? && owner.eql?("github") + end + + def primary? + if Pages.enterprise? + name.downcase == "#{owner.to_s.downcase}.#{Pages.github_hostname}" + else + user_page_domains.include? name.downcase + end + end + alias_method :user_page?, :primary? + + def user_page_domains + domains = [default_user_domain] + domains.push "#{owner}.github.com".downcase unless Pages.enterprise? + domains + end + + def default_user_domain + if github_repo? + "#{owner}.#{Pages.github_hostname}".downcase + elsif Pages.enterprise? + Pages.pages_hostname.downcase + else + "#{owner}.#{Pages.pages_hostname}".downcase + end + end + + def cname + return nil unless Pages.custom_domains_enabled? + + repo_pages_info["cname"] + end + + def html_url + @html_url ||= (repo_pages_info["html_url"] || repo_compat.pages_url).chomp("/") + end + + def uri + @uri ||= URI(html_url) + end + + def url_without_path + uri.dup.tap { |u| u.path = "" }.to_s + end + + def stargazers_count + repo_pages_info["stargazers_count"] || 0 + end + + def forks_count + repo_pages_info["forks_count"] || 0 + end + + private + + def memoize_value(var_name, value) + return instance_variable_get(var_name) if instance_variable_defined?(var_name) + + instance_variable_set(var_name, value.render) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/repository_compat.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/repository_compat.rb new file mode 100644 index 000000000000..bd3243561858 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/repository_compat.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +module Jekyll + module GitHubMetadata + class RepositoryCompat + attr_reader :repo + + def initialize(repo) + @repo = repo + end + + # In enterprise, the site's scheme will be the same as the instance's + # In dotcom, this will be `https` for GitHub-owned sites that end with + # `.github.com` and will be `http` for all other sites. + # Note: This is not the same as *instance*'s scheme, which may differ + def url_scheme + if Pages.enterprise? + Pages.scheme + elsif repo.owner == "github" && domain.end_with?(".github.com") + "https" + else + "http" + end + end + + def user_domain + domain = repo.default_user_domain + repo.user_page_domains.each do |user_repo| + candidate_nwo = "#{repo.owner}/#{user_repo}" + next unless Jekyll::GitHubMetadata.client.repository?(candidate_nwo) + + domain = Jekyll::GitHubMetadata::Repository.new(candidate_nwo).repo_compat.domain + end + domain + end + + def pages_url + return enterprise_url unless Pages.custom_domains_enabled? + + if repo.cname || repo.primary? + "#{url_scheme}://#{domain}" + else + URI.join("#{url_scheme}://#{domain}", repo.name).to_s + end + end + alias_method :html_url, :pages_url + + def domain + @domain ||= + if !Pages.custom_domains_enabled? + Pages.github_hostname + elsif repo.cname # explicit CNAME + repo.cname + elsif repo.primary? # user/org repo + repo.default_user_domain + else # project repo + user_domain + end + end + + def source + { + "branch" => (repo.user_page? ? "master" : "gh-pages"), + "path" => "/", + } + end + + private + + def enterprise_url + path = repo.user_page? ? repo.owner : repo.nwo + if Pages.subdomain_isolation? + URI.join("#{Pages.scheme}://#{Pages.pages_hostname}/", path).to_s + else + URI.join("#{Pages.github_url}/pages/", path).to_s + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/repository_finder.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/repository_finder.rb new file mode 100644 index 000000000000..4c68823bcf28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/repository_finder.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +module Jekyll + module GitHubMetadata + class RepositoryFinder + NoRepositoryError = Class.new(Jekyll::Errors::FatalException) + + attr_reader :site + def initialize(site) + @site = site + end + + # Public: fetches the repository name with owner to fetch metadata for. + # In order of precedence, this method uses: + # 1. the environment variable $PAGES_REPO_NWO + # 2. 'repository' variable in the site config + # 3. the 'origin' git remote's URL + # + # site - the Jekyll::Site being processed + # + # Return the name with owner (e.g. 'parkr/my-repo') or raises an + # error if one cannot be found. + def nwo + @nwo ||= begin + nwo_from_env || \ + nwo_from_config || \ + nwo_from_git_origin_remote || \ + proc do + raise NoRepositoryError, "No repo name found. " \ + "Specify using PAGES_REPO_NWO environment variables, " \ + "'repository' in your configuration, or set up an 'origin' " \ + "git remote pointing to your github.com repository." + end.call + end + end + + private + + def nwo_from_env + ENV["PAGES_REPO_NWO"] + end + + def nwo_from_config + repo = site.config["repository"] + repo if repo&.is_a?(String) && repo&.include?("/") + end + + def git_remotes + _process, output = Jekyll::Utils::Exec.run("git", "remote", "--verbose") + output.to_s.strip.split("\n") + rescue Errno::ENOENT => e + Jekyll.logger.warn "Not Installed:", e.message + [] + end + + def git_remote_url + git_remotes.grep(%r!\Aorigin\t!).map do |remote| + remote.sub(%r!\Aorigin\t(.*) \([a-z]+\)!, "\\1") + end.uniq.first || "" + end + + def nwo_from_git_origin_remote + return unless Jekyll.env == "development" || Jekyll.env == "test" + + matches = git_remote_url.chomp(".git").match github_remote_regex + matches[2..3].join("/") if matches + end + + def github_remote_regex + github_host_regex = Regexp.escape(Jekyll::GitHubMetadata::Pages.github_hostname) + %r!#{github_host_regex}(:|/)([\w-]+)/([\w\.-]+)! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/sanitizer.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/sanitizer.rb new file mode 100644 index 000000000000..edaf5540a562 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/sanitizer.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +module Jekyll + module GitHubMetadata + module Sanitizer + extend self + # Sanitize an object. + # When the resource is either `false`, `true`, `nil` or a number, + # it returns the resource as-is. When the resource is an array, + # it maps over the entire array, sanitizing each of its values. + # When the resource responds to the #to_hash method, it returns + # the value of #sanitize_resource (see below). If none of the + # aforementioned conditions are met, the return value of #to_s + # is used. + # + # resource - an Object + # + # Returns the sanitized resource. + # rubocop:disable Metrics/CyclomaticComplexity + def sanitize(resource) + case resource + when Array + resource.map { |item| sanitize(item) } + when Numeric, Time + resource + when FalseClass + false + when TrueClass + true + when NilClass + nil + when String + resource + else + if resource.respond_to?(:to_hash) + sanitize_resource(resource) + else + resource.to_s + end + end + end + # rubocop:enable Metrics/CyclomaticComplexity + + # Sanitize the Sawyer Resource or Hash + # Note: the object must respond to :to_hash for this to work. + # Consider using #sanitize instead of this method directly. + # + # resource - an Object which responds to :to_hash + # + # Returns the sanitized sawyer resource or hash as a hash. + def sanitize_resource(resource) + resource.to_hash.each_with_object({}) do |(k, v), result| + result[k.to_s] = sanitize(v) + result + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/site_github_munger.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/site_github_munger.rb new file mode 100644 index 000000000000..c24f55de7cb8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/site_github_munger.rb @@ -0,0 +1,82 @@ +require "jekyll" +require "uri" + +module Jekyll + module GitHubMetadata + class SiteGitHubMunger + extend Forwardable + + def_delegators Jekyll::GitHubMetadata, :site, :repository + private :repository + + def initialize(site) + Jekyll::GitHubMetadata.site = site + end + + def munge! + Jekyll::GitHubMetadata.log :debug, "Initializing..." + + # This is the good stuff. + site.config["github"] = github_namespace + + add_title_and_description_fallbacks! + add_url_and_baseurl_fallbacks! if should_add_url_fallbacks? + end + + private + + def github_namespace + case site.config["github"] + when nil + drop + when Hash + Jekyll::Utils.deep_merge_hashes(drop, site.config["github"]) + else + site.config["github"] + end + end + + def drop + @drop ||= MetadataDrop.new(GitHubMetadata.site) + end + + # Set `site.url` and `site.baseurl` if unset. + def add_url_and_baseurl_fallbacks! + site.config["url"] ||= Value.new("url", proc { |_c, r| r.url_without_path }) + return unless should_set_baseurl? + + site.config["baseurl"] = Value.new("baseurl", proc { |_c, r| r.baseurl }) + end + + def add_title_and_description_fallbacks! + if should_warn_about_site_name? + msg = "site.name is set in _config.yml, but many plugins and themes expect " + msg << "site.title to be used instead. To avoid potential inconsistency, " + msg << "Jekyll GitHub Metadata will not set site.title to the repository's name." + Jekyll::GitHubMetadata.log :warn, msg + else + site.config["title"] ||= Value.new("title", proc { |_c, r| r.name }) + end + site.config["description"] ||= Value.new("description", proc { |_c, r| r.tagline }) + end + + # Set the baseurl only if it is `nil` or `/` + # Baseurls should never be "/". See http://bit.ly/2s1Srid + def should_set_baseurl? + site.config["baseurl"].nil? || site.config["baseurl"] == "/" + end + + def should_add_url_fallbacks? + Jekyll.env == "production" || Pages.page_build? + end + + def should_warn_about_site_name? + site.config["name"] && !site.config["title"] + end + end + end +end + +Jekyll::Hooks.register :site, :after_init do |site| + Jekyll::GitHubMetadata::SiteGitHubMunger.new(site).munge! +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/value.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/value.rb new file mode 100644 index 000000000000..49e16ae7314d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/value.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +require "json" + +module Jekyll + module GitHubMetadata + class Value + extend Forwardable + def_delegators :render, :+, :to_s, :to_json, :eql?, :hash + + attr_reader :key, :value + + def initialize(*args) + case args.size + when 1 + @key = "{anonymous}" + @value = args.first + when 2 + @key = args.first.to_s + @value = args.last + else + raise ArgumentError, "#{args.size} args given but expected 1 or 2" + end + end + + def render + return @rendered if defined? @rendered + + @rendered = @value = Sanitizer.sanitize(call_or_value) + rescue RuntimeError, NameError => e + Jekyll::GitHubMetadata.log :error, "Error processing value '#{key}':" + raise e + end + + def to_liquid + case render + when nil, true, false, Hash, String, Numeric, Array + value + else + to_json + end + end + + private + + # Calls the value Proc with the appropriate number of arguments + # or returns the raw value if it's a literal + def call_or_value + return value unless value.respond_to?(:call) + + case value.arity + when 0 + value.call + when 1 + value.call(GitHubMetadata.client) + when 2 + value.call(GitHubMetadata.client, GitHubMetadata.repository) + else + raise ArgumentError, "Whoa, arity of 0, 1, or 2 please in your procs." + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/version.rb new file mode 100644 index 000000000000..4955e18f652a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-github-metadata-2.13.0/lib/jekyll-github-metadata/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Jekyll + module GitHubMetadata + VERSION = "2.13.0" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-mentions-1.6.0/lib/jekyll-mentions.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-mentions-1.6.0/lib/jekyll-mentions.rb new file mode 100644 index 000000000000..41d8f34c35c5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-mentions-1.6.0/lib/jekyll-mentions.rb @@ -0,0 +1,128 @@ +# frozen_string_literal: true + +require "jekyll" +require "html/pipeline" + +module Jekyll + class Mentions + GITHUB_DOT_COM = "https://github.com" + BODY_START_TAG = "<body" + + OPENING_BODY_TAG_REGEX = %r!<body(.*?)>\s*!m.freeze + + InvalidJekyllMentionConfig = Class.new(Jekyll::Errors::FatalException) + + class << self + # rubocop:disable Metrics/AbcSize + def mentionify(doc) + content = doc.output + return unless content.include?("@") + + config = doc.site.config + config = config.merge(doc.data) if doc.data.key?("jekyll-mentions") + + src = mention_base(config) + + if content.include? BODY_START_TAG + head, opener, tail = content.partition(OPENING_BODY_TAG_REGEX) + body_content, *rest = tail.partition("</body>") + + return unless body_content&.match?(filter_regex) + + processed_markup = filter_with_mention(src).call(body_content)[:output].to_s + doc.output = String.new(head) << opener << processed_markup << rest.join + else + return unless content&.match?(filter_regex) + + doc.output = filter_with_mention(src).call(content)[:output].to_s + end + end + # rubocop:enable Metrics/AbcSize + + # Public: Create or fetch the filter for the given {{src}} base URL. + # + # src - the base URL (e.g. https://github.com) + # + # Returns an HTML::Pipeline instance for the given base URL. + def filter_with_mention(src) + filters[src] ||= HTML::Pipeline.new([ + HTML::Pipeline::MentionFilter, + ], :base_url => src, :username_pattern => mention_username_pattern) + end + + def mention_username_pattern + @mention_username_pattern ||= %r![\w][\w-]*! + end + + # Public: Filters hash where the key is the mention base URL. + # Effectively a cache. + def filters + @filters ||= {} + end + + # Public: Calculate the base URL to use for mentioning. + # + # The custom base URL can be defined in either the site config or a document's + # front matter as `jekyll-mentions.base_url` or `jekyll-mentions`, and must be + # a valid URL (i.e. it must include a protocol and valid domain). + # It should _not_ have a trailing slash. + # + # config - The effective configuration that includes configurations for mentions. + # + # Returns a URL to use as the base URL for mentions. + # Defaults to the https://github.com. + def mention_base(config = {}) + mention_config = config["jekyll-mentions"] + case mention_config + when nil, NilClass + default_mention_base + when String + mention_config.to_s + when Hash + mention_config.fetch("base_url", default_mention_base) + else + raise InvalidJekyllMentionConfig, + "Your jekyll-mentions config has to either be a string or a hash. " \ + "It's a #{mention_config.class} right now." + end + end + + # Public: Defines the conditions for a document to be mentionable. + # + # doc - the Jekyll::Document or Jekyll::Page + # + # Returns true if the doc is written & is HTML. + def mentionable?(doc) + (doc.is_a?(Jekyll::Page) || doc.write?) && + (doc.output_ext == ".html" || (doc.permalink&.end_with?("/"))) && + (doc.data["jekyll-mentions"] != false) + end + + private + + def filter_regex + @filter_regex ||= + begin + Regexp.new( + HTML::Pipeline::MentionFilter::MentionPatterns[mention_username_pattern] + ) + rescue TypeError + %r!@\w+! + end + end + + def default_mention_base + if !ENV["SSL"].to_s.empty? && !ENV["GITHUB_HOSTNAME"].to_s.empty? + scheme = ENV["SSL"] == "true" ? "https://" : "http://" + "#{scheme}#{ENV["GITHUB_HOSTNAME"].chomp("/")}" + else + GITHUB_DOT_COM + end + end + end + end +end + +Jekyll::Hooks.register [:pages, :documents], :post_render do |doc| + Jekyll::Mentions.mentionify(doc) if Jekyll::Mentions.mentionable?(doc) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-optional-front-matter-0.3.2/lib/jekyll-optional-front-matter.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-optional-front-matter-0.3.2/lib/jekyll-optional-front-matter.rb new file mode 100644 index 000000000000..24c06d786749 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-optional-front-matter-0.3.2/lib/jekyll-optional-front-matter.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require "jekyll" +require "jekyll-optional-front-matter/generator" + +module JekyllOptionalFrontMatter + # Case-insensitive array of filenames to exclude. All files must first + # match the config-defined list of markdown extensions. If you'd like one + # of these files included in your site, simply add YAML front matter to it. + FILENAME_BLACKLIST = %w( + README + LICENSE + LICENCE + COPYING + CODE_OF_CONDUCT + CONTRIBUTING + ISSUE_TEMPLATE + PULL_REQUEST_TEMPLATE + ).freeze +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-optional-front-matter-0.3.2/lib/jekyll-optional-front-matter/generator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-optional-front-matter-0.3.2/lib/jekyll-optional-front-matter/generator.rb new file mode 100644 index 000000000000..76886b0a04f3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-optional-front-matter-0.3.2/lib/jekyll-optional-front-matter/generator.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +module JekyllOptionalFrontMatter + class Generator < Jekyll::Generator + attr_accessor :site + + safe true + priority :normal + + CONFIG_KEY = "optional_front_matter" + ENABLED_KEY = "enabled" + CLEANUP_KEY = "remove_originals" + + def initialize(site) + @site = site + end + + def generate(site) + @site = site + return if disabled? + + site.pages.concat(pages_to_add) + site.static_files -= static_files_to_remove if cleanup? + end + + private + + # An array of Jekyll::Pages to add, *excluding* blacklisted files + def pages_to_add + pages.reject { |page| blacklisted?(page) } + end + + # An array of Jekyll::StaticFile's, *excluding* blacklisted files + def static_files_to_remove + markdown_files.reject { |page| blacklisted?(page) } + end + + # An array of potential Jekyll::Pages to add, *including* blacklisted files + def pages + markdown_files.map { |static_file| page_from_static_file(static_file) } + end + + # An array of Jekyll::StaticFile's with a site-defined markdown extension + def markdown_files + site.static_files.select { |file| markdown_converter.matches(file.extname) } + end + + # Given a Jekyll::StaticFile, returns the file as a Jekyll::Page + def page_from_static_file(static_file) + base = static_file.instance_variable_get("@base") + dir = static_file.instance_variable_get("@dir") + name = static_file.instance_variable_get("@name") + Jekyll::Page.new(site, base, dir, name) + end + + # Does the given Jekyll::Page match our filename blacklist? + def blacklisted?(page) + return false if whitelisted?(page) + + FILENAME_BLACKLIST.include?(page.basename.upcase) + end + + def whitelisted?(page) + return false unless site.config["include"].is_a? Array + + entry_filter.included?(page.relative_path) + end + + def markdown_converter + @markdown_converter ||= site.find_converter_instance(Jekyll::Converters::Markdown) + end + + def entry_filter + @entry_filter ||= Jekyll::EntryFilter.new(site) + end + + def option(key) + site.config[CONFIG_KEY] && site.config[CONFIG_KEY][key] + end + + def disabled? + option(ENABLED_KEY) == false || site.config["require_front_matter"] + end + + def cleanup? + option(CLEANUP_KEY) == true || site.config["require_front_matter"] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-optional-front-matter-0.3.2/lib/jekyll-optional-front-matter/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-optional-front-matter-0.3.2/lib/jekyll-optional-front-matter/version.rb new file mode 100644 index 000000000000..33081a5dd2a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-optional-front-matter-0.3.2/lib/jekyll-optional-front-matter/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module JekyllOptionalFrontMatter + VERSION = "0.3.2" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/.gitignore new file mode 100644 index 000000000000..35d00b2e6eba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/.gitignore @@ -0,0 +1,16 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +spec/dest +tmp diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/.rspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/.rspec new file mode 100644 index 000000000000..5f1647637a0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/.rspec @@ -0,0 +1,2 @@ +--color +--format progress diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/.travis.yml new file mode 100644 index 000000000000..55765aad4463 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/.travis.yml @@ -0,0 +1,21 @@ +language: ruby +cache: bundler +before_install: script/unbundle +install: +- travis_retry bundle install --path vendor/bundle +rvm: +- 2.1 +- 2.0 +- 1.9.3 +script: script/cibuild +notifications: + irc: + on_success: change + on_failure: change + channels: + - irc.freenode.org#jekyll + template: + - '%{repository}#%{build_number} (%{branch}) %{message} %{build_url}' + email: + on_success: never + on_failure: never diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/Gemfile new file mode 100644 index 000000000000..c892bd3635ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in jekyll-paginate.gemspec +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/History.markdown b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/History.markdown new file mode 100644 index 000000000000..605e4c366141 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/History.markdown @@ -0,0 +1,9 @@ +## 1.1.0 / 2014-10-14 + +### Minor Enhancements + + * Filter out posts that have `hidden: true` in front matter (#13) + +### Development Fixes + + * Fix tests for rspec 3. (#9) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/LICENSE.txt new file mode 100644 index 000000000000..3ed9f598eb17 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2014 Parker Moore + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/README.md new file mode 100644 index 000000000000..67fd2fc1c759 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/README.md @@ -0,0 +1,31 @@ +# Jekyll::Paginate + +Default pagination generator for Jekyll. + +[![Build Status](https://secure.travis-ci.org/jekyll/jekyll-paginate.svg?branch=master)](https://travis-ci.org/jekyll/jekyll-paginate) + +## Installation + +Add this line to your application's Gemfile: + + gem 'jekyll-paginate' + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install jekyll-paginate + +## Usage + +Once the gem is installed on your system, Jekyll will auto-require it. Just set the following configuration + +## Contributing + +1. Fork it ( http://github.com/jekyll/jekyll-paginate/fork ) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/Rakefile new file mode 100644 index 000000000000..29955274e0d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/Rakefile @@ -0,0 +1 @@ +require "bundler/gem_tasks" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/jekyll-paginate.gemspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/jekyll-paginate.gemspec new file mode 100644 index 000000000000..ab4606735e22 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/jekyll-paginate.gemspec @@ -0,0 +1,24 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'jekyll-paginate/version' + +Gem::Specification.new do |spec| + spec.name = "jekyll-paginate" + spec.version = Jekyll::Paginate::VERSION + spec.authors = ["Parker Moore"] + spec.email = ["parkrmoore@gmail.com"] + spec.summary = %q{Built-in Pagination Generator for Jekyll} + spec.homepage = "https://github.com/jekyll/jekyll-paginate" + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0") + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ["lib"] + + spec.add_development_dependency "jekyll", "~> 2.0" + spec.add_development_dependency "bundler", "~> 1.5" + spec.add_development_dependency "rake" + spec.add_development_dependency "rspec", "~> 3.0" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate.rb new file mode 100644 index 000000000000..3a3d6ff0f42c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate.rb @@ -0,0 +1,8 @@ +require "jekyll-paginate/version" +require "jekyll-paginate/pager" +require "jekyll-paginate/pagination" + +module Jekyll + module Paginate + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate/pager.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate/pager.rb new file mode 100644 index 000000000000..eba983d282ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate/pager.rb @@ -0,0 +1,137 @@ +module Jekyll + module Paginate + class Pager + attr_reader :page, :per_page, :posts, :total_posts, :total_pages, + :previous_page, :previous_page_path, :next_page, :next_page_path + + # Calculate the number of pages. + # + # all_posts - The Array of all Posts. + # per_page - The Integer of entries per page. + # + # Returns the Integer number of pages. + def self.calculate_pages(all_posts, per_page) + (all_posts.size.to_f / per_page.to_i).ceil + end + + # Determine if pagination is enabled the site. + # + # site - the Jekyll::Site object + # + # Returns true if pagination is enabled, false otherwise. + def self.pagination_enabled?(site) + !site.config['paginate'].nil? && + site.pages.size > 0 + end + + # Static: Determine if a page is a possible candidate to be a template page. + # Page's name must be `index.html` and exist in any of the directories + # between the site source and `paginate_path`. + # + # config - the site configuration hash + # page - the Jekyll::Page about which we're inquiring + # + # Returns true if the + def self.pagination_candidate?(config, page) + page_dir = File.dirname(File.expand_path(remove_leading_slash(page.path), config['source'])) + paginate_path = remove_leading_slash(config['paginate_path']) + paginate_path = File.expand_path(paginate_path, config['source']) + page.name == 'index.html' && + in_hierarchy(config['source'], page_dir, File.dirname(paginate_path)) + end + + # Determine if the subdirectories of the two paths are the same relative to source + # + # source - the site source + # page_dir - the directory of the Jekyll::Page + # paginate_path - the absolute paginate path (from root of FS) + # + # Returns whether the subdirectories are the same relative to source + def self.in_hierarchy(source, page_dir, paginate_path) + return false if paginate_path == File.dirname(paginate_path) + return false if paginate_path == Pathname.new(source).parent + page_dir == paginate_path || + in_hierarchy(source, page_dir, File.dirname(paginate_path)) + end + + # Static: Return the pagination path of the page + # + # site - the Jekyll::Site object + # num_page - the pagination page number + # + # Returns the pagination path as a string + def self.paginate_path(site, num_page) + return nil if num_page.nil? + return Pagination.first_page_url(site) if num_page <= 1 + format = site.config['paginate_path'] + format = format.sub(':num', num_page.to_s) + ensure_leading_slash(format) + end + + # Static: Return a String version of the input which has a leading slash. + # If the input already has a forward slash in position zero, it will be + # returned unchanged. + # + # path - a String path + # + # Returns the path with a leading slash + def self.ensure_leading_slash(path) + path[0..0] == "/" ? path : "/#{path}" + end + + # Static: Return a String version of the input without a leading slash. + # + # path - a String path + # + # Returns the input without the leading slash + def self.remove_leading_slash(path) + ensure_leading_slash(path)[1..-1] + end + + # Initialize a new Pager. + # + # site - the Jekyll::Site object + # page - The Integer page number. + # all_posts - The Array of all the site's Posts. + # num_pages - The Integer number of pages or nil if you'd like the number + # of pages calculated. + def initialize(site, page, all_posts, num_pages = nil) + @page = page + @per_page = site.config['paginate'].to_i + @total_pages = num_pages || Pager.calculate_pages(all_posts, @per_page) + + if @page > @total_pages + raise RuntimeError, "page number can't be greater than total pages: #{@page} > #{@total_pages}" + end + + init = (@page - 1) * @per_page + offset = (init + @per_page - 1) >= all_posts.size ? all_posts.size : (init + @per_page - 1) + + @total_posts = all_posts.size + @posts = all_posts[init..offset] + @previous_page = @page != 1 ? @page - 1 : nil + @previous_page_path = Pager.paginate_path(site, @previous_page) + @next_page = @page != @total_pages ? @page + 1 : nil + @next_page_path = Pager.paginate_path(site, @next_page) + end + + # Convert this Pager's data to a Hash suitable for use by Liquid. + # + # Returns the Hash representation of this Pager. + def to_liquid + { + 'page' => page, + 'per_page' => per_page, + 'posts' => posts, + 'total_posts' => total_posts, + 'total_pages' => total_pages, + 'previous_page' => previous_page, + 'previous_page_path' => previous_page_path, + 'next_page' => next_page, + 'next_page_path' => next_page_path + } + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate/pagination.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate/pagination.rb new file mode 100644 index 000000000000..79614c4cdfe0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate/pagination.rb @@ -0,0 +1,86 @@ +module Jekyll + module Paginate + class Pagination < Generator + # This generator is safe from arbitrary code execution. + safe true + + # This generator should be passive with regard to its execution + priority :lowest + + # Generate paginated pages if necessary. + # + # site - The Site. + # + # Returns nothing. + def generate(site) + if Pager.pagination_enabled?(site) + if template = template_page(site) + paginate(site, template) + else + Jekyll.logger.warn "Pagination:", "Pagination is enabled, but I couldn't find " + + "an index.html page to use as the pagination template. Skipping pagination." + end + end + end + + # Paginates the blog's posts. Renders the index.html file into paginated + # directories, e.g.: page2/index.html, page3/index.html, etc and adds more + # site-wide data. + # + # site - The Site. + # page - The index.html Page that requires pagination. + # + # {"paginator" => { "page" => <Number>, + # "per_page" => <Number>, + # "posts" => [<Post>], + # "total_posts" => <Number>, + # "total_pages" => <Number>, + # "previous_page" => <Number>, + # "next_page" => <Number> }} + def paginate(site, page) + all_posts = site.site_payload['site']['posts'] + all_posts = all_posts.reject { |p| p['hidden'] } + pages = Pager.calculate_pages(all_posts, site.config['paginate'].to_i) + (1..pages).each do |num_page| + pager = Pager.new(site, num_page, all_posts, pages) + if num_page > 1 + newpage = Page.new(site, site.source, page.dir, page.name) + newpage.pager = pager + newpage.dir = Pager.paginate_path(site, num_page) + site.pages << newpage + else + page.pager = pager + end + end + end + + # Static: Fetch the URL of the template page. Used to determine the + # path to the first pager in the series. + # + # site - the Jekyll::Site object + # + # Returns the url of the template page + def self.first_page_url(site) + if page = Pagination.new.template_page(site) + page.url + else + nil + end + end + + # Public: Find the Jekyll::Page which will act as the pager template + # + # site - the Jekyll::Site object + # + # Returns the Jekyll::Page which will act as the pager template + def template_page(site) + site.pages.dup.select do |page| + Pager.pagination_candidate?(site.config, page) + end.sort do |one, two| + two.path.size <=> one.path.size + end.first + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate/version.rb new file mode 100644 index 000000000000..4442dcca6026 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/lib/jekyll-paginate/version.rb @@ -0,0 +1,5 @@ +module Jekyll + module Paginate + VERSION = "1.1.0" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/script/bootstrap new file mode 100644 index 000000000000..0a7447970f80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/script/bootstrap @@ -0,0 +1,3 @@ +#!/bin/bash + +bundle install diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/script/cibuild new file mode 100644 index 000000000000..45d681aa3f6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/script/cibuild @@ -0,0 +1,3 @@ +#!/bin/bash + +bundle exec rspec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/script/unbundle b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/script/unbundle new file mode 100644 index 000000000000..9c4120b93b3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/script/unbundle @@ -0,0 +1,8 @@ +#!/bin/bash + +RELEASES_URL="https://github.com/jekyll/jekyll/releases" +JEKYLL_VERSION=`curl http://jekyllrb.com/latest_version.txt` +JEKYLL_BUNDLE="jekyll-${JEKYLL_VERSION}.tar.gz" + +wget "${RELEASES_URL}/download/v${JEKYLL_VERSION}/${JEKYLL_BUNDLE}" +tar -xzvf ${JEKYLL_BUNDLE} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/pager_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/pager_spec.rb new file mode 100644 index 000000000000..2dba114ab87c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/pager_spec.rb @@ -0,0 +1,134 @@ +require 'spec_helper' + +RSpec.describe(Jekyll::Paginate::Pager) do + + it "calculate number of pages" do + expect(described_class.calculate_pages([], '2')).to eql(0) + expect(described_class.calculate_pages([1], '2')).to eql(1) + expect(described_class.calculate_pages([1,2], '2')).to eql(1) + expect(described_class.calculate_pages([1,2,3], '2')).to eql(2) + expect(described_class.calculate_pages([1,2,3,4], '2')).to eql(2) + expect(described_class.calculate_pages([1,2,3,4,5], '2')).to eql(3) + end + + context "with the default paginate_path" do + let(:site) { build_site } + + it "determines the correct pagination path for each page" do + expect(described_class.paginate_path(site, 1)).to eql("/index.html") + expect(described_class.paginate_path(site, 2)).to eql("/page2") + end + end + + context "with paginate_path set to a subdirectory with no index.html" do + let(:site) { build_site({'paginate_path' => '/blog/page-:num'}) } + + it "determines the correct pagination path for each page" do + expect(described_class.paginate_path(site, 1)).to eql("/index.html") + expect(described_class.paginate_path(site, 2)).to eql("/blog/page-2") + end + end + + context "with paginate_path set to a subdirectory with no index.html with num pages being in subdirectories" do + let(:site) { build_site({'paginate_path' => '/blog/page/:num'}) } + + it "determines the correct pagination path for each page" do + expect(described_class.paginate_path(site, 1)).to eql("/index.html") + expect(described_class.paginate_path(site, 2)).to eql("/blog/page/2") + end + end + + context "with paginate_path set to a subdirectory wherein an index.html exists" do + let(:site) { build_site({'paginate_path' => '/contacts/page:num'}) } + + it "determines the correct pagination path for each page" do + expect(described_class.paginate_path(site, 1)).to eql("/contacts/index.html") + expect(described_class.paginate_path(site, 2)).to eql("/contacts/page2") + end + end + + context "with paginate_path set to a subdir wherein an index.html exists with pages in subdirs" do + let(:site) { build_site({'paginate_path' => '/contacts/page/:num'}) } + + it "determines the correct pagination path for each page" do + expect(described_class.paginate_path(site, 1)).to eql("/contacts/index.html") + expect(described_class.paginate_path(site, 2)).to eql("/contacts/page/2") + end + end + + context "pagination disabled" do + let(:site) { build_site('paginate' => nil) } + + it "report that pagination is disabled" do + expect(described_class.pagination_enabled?(site)).to be_falsey + end + end + + context "pagination enabled for 2" do + let(:site) { build_site('paginate' => 2) } + let(:posts) { site.posts } + + it "report that pagination is enabled" do + expect(described_class.pagination_enabled?(site)).to be_truthy + end + + context "with 4 posts" do + let(:posts) { site.posts[1..4] } + + it "create first pager" do + pager = described_class.new(site, 1, posts) + expect(pager.posts.size).to eql(2) + expect(pager.total_pages).to eql(2) + expect(pager.previous_page).to be_nil + expect(pager.next_page).to eql(2) + end + + it "create second pager" do + pager = described_class.new(site, 2, posts) + expect(pager.posts.size).to eql(2) + expect(pager.total_pages).to eql(2) + expect(pager.previous_page).to eql(1) + expect(pager.next_page).to be_nil + end + + it "not create third pager" do + expect { described_class.new(site, 3, posts) }.to raise_error + end + + end + + context "with 5 posts" do + let(:posts) { site.posts[1..5] } + + it "create first pager" do + pager = described_class.new(site, 1, posts) + expect(pager.posts.size).to eql(2) + expect(pager.total_pages).to eql(3) + expect(pager.previous_page).to be_nil + expect(pager.next_page).to eql(2) + end + + it "create second pager" do + pager = described_class.new(site, 2, posts) + expect(pager.posts.size).to eql(2) + expect(pager.total_pages).to eql(3) + expect(pager.previous_page).to eql(1) + expect(pager.next_page).to eql(3) + end + + it "create third pager" do + pager = described_class.new(site, 3, posts) + expect(pager.posts.size).to eql(1) + expect(pager.total_pages).to eql(3) + expect(pager.previous_page).to eql(2) + expect(pager.next_page).to be_nil + end + + it "not create fourth pager" do + expect { described_class.new(site, 4, posts) }.to raise_error(RuntimeError) + end + + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/pagination_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/pagination_spec.rb new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-20-blah.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-20-blah.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-21-bleh.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-21-bleh.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-22-humor.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-22-humor.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-23-hey-there.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-23-hey-there.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-24-whateva.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-24-whateva.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-25-oh-yes.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/_posts/2014-05-25-oh-yes.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/contacts/index.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/contacts/index.html new file mode 100644 index 000000000000..a49ba48448f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/contacts/index.html @@ -0,0 +1,2 @@ +--- +--- \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/index.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/index.html new file mode 100644 index 000000000000..a49ba48448f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/source/index.html @@ -0,0 +1,2 @@ +--- +--- \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/spec_helper.rb new file mode 100644 index 000000000000..c8de5348bd33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-1.1.0/spec/spec_helper.rb @@ -0,0 +1,97 @@ +require 'jekyll' +require File.expand_path("../lib/jekyll-paginate", File.dirname(__FILE__)) + +module TestMethods + def test_dir(*subdirs) + File.join(File.dirname(__FILE__), *subdirs) + end + + def dest_dir(*subdirs) + test_dir('dest', *subdirs) + end + + def source_dir(*subdirs) + test_dir('source', *subdirs) + end + + def build_configs(overrides, base_hash = Jekyll::Configuration::DEFAULTS) + Jekyll::Utils.deep_merge_hashes(base_hash, overrides) + end + + def site_configuration(overrides = {}) + build_configs({ + "source" => source_dir, + "destination" => dest_dir + }, build_configs(overrides)) + end + + def build_site(config = {}) + site = Jekyll::Site.new(site_configuration( + {"paginate" => 1}.merge(config) + )) + site.process + site + end +end + +RSpec.configure do |config| + config.expect_with :rspec do |expectations| + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # These two settings work together to allow you to limit a spec run + # to individual examples or groups you care about by tagging them with + # `:focus` metadata. When nothing is tagged with `:focus`, all examples + # get run. + config.filter_run :focus + config.run_all_when_everything_filtered = true + + # Limits the available syntax to the non-monkey patched syntax that is recommended. + # For more details, see: + # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax + # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + # config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = 'doc' + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed + + include TestMethods +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/CODE_OF_CONDUCT.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/CODE_OF_CONDUCT.md new file mode 100644 index 000000000000..ab6b52428f82 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/CODE_OF_CONDUCT.md @@ -0,0 +1,86 @@ +# Contributor Covenant Code of Conduct + +> “Be kind, +> +> for everyone you meet is fighting a harder battle.” +> +> --Plato + + +## TL;DR +Try to be the best version of yourself and to be excellent to others. + +:purple_heart: + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at [jekyll@sverrirs.com](mailto:jekyll@sverrirs.com). All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/Gemfile new file mode 100644 index 000000000000..6ded57bd25ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/Gemfile @@ -0,0 +1,14 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in jekyll-paginate-v2.gemspec +gemspec + +if ENV["JEKYLL_VERSION"] + gem "jekyll", "~> #{ENV["JEKYLL_VERSION"]}" +end + +# adding dev-dependencies to Gemfile (instead of gemspec) allows calling +# `bundle exec [executable] [options]` more easily. +group :test do + gem "rubocop", "~> 0.51.0" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/LICENSE new file mode 100644 index 000000000000..5a65f9877935 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2016 Sverrir Sigmundarson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/README-AUTOPAGES.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/README-AUTOPAGES.md new file mode 100644 index 000000000000..4abf2ae17a30 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/README-AUTOPAGES.md @@ -0,0 +1,104 @@ +# Jekyll::Paginate V2::AutoPages + +**AutoPages** are an optional pagination addon that can automatically generate paginated pages for all your collections, tags and categories used in the pages on your site. This is useful if you have a large site where paginating the contents of your collections, tags or category lists provides a better user experience. + +<p align="center"> + <img src="https://raw.githubusercontent.com/sverrirs/jekyll-paginate-v2/master/res/autopages-logo.png" height="128" /> +</p> + + +> This feature is based on [code](https://github.com/stevecrozz/lithostech.com/blob/master/_plugins/tag_indexes.rb) written and graciously donated by [Stephen Crosby](https://github.com/stevecrozz). Thanks! :) + +* [Site configuration](#site-configuration) +* [Simple configuration](#simple-configuration) + + [Obtaining the original Tag or Category name](#obtaining-the-original-tag-or-category-name) +* [Advanced configuration](#advanced-configuration) +* [Specialised pages](#specialised-pages) +* [Considerations](#considerations) + + [Title should not contain pagination macros](#title-should-not-contain-pagination-macros) +* [Example Sites](https://github.com/sverrirs/jekyll-paginate-v2/tree/master/examples) +* [Common issues](#common-issues) + +:warning: Please note, this feature is still **experimental** and might not be ready for production yet. + +## Site configuration + +``` yml +############################################################ +# Site configuration for the Auto-Pages feature +# The values here represent the defaults if nothing is set +autopages: + + # Site-wide kill switch, disable here and it doesn't run at all + enabled: false + + # Category pages, omit entire config element to disable + categories: + # Optional, the list of layouts that should be processed for every category found in the site + layouts: + - 'autopage_category.html' + # Optional, the title that each category paginate page should get (:cat is replaced by the Category name) + title: 'Posts in category :cat' + # Optional, the permalink for the pagination page (:cat is replaced), + # the pagination permalink path is then appended to this permalink structure + permalink: '/category/:cat' + + # Collection pages, omit to disable + collections: + layouts: + - 'autopage_collection.html' + title: 'Posts in collection :coll' # :coll is replaced by the collection name + permalink: '/collection/:coll' + + # Tag pages, omit to disable + tags: + layouts: + - 'autopage_tags.html' + title: 'Posts tagged with :tag' # :tag is replaced by the tag name + permalink: '/tag/:tag' +``` + +## Simple configuration +The only thing needed to enable the auto pages is to add the configuration element to the site.config file and then create a layout that the pages should use. + +Example of a simple autopage layout can be seen in Example 3 [examples/03-tags/_layouts/autopage_tags.html](https://github.com/sverrirs/jekyll-paginate-v2/blob/master/examples/03-tags/_layouts/autopage_tags.html). + +The layout does not need anything special beyond the normal pagination logic (e.g. `for post in paginator.posts` and then the next/prev arrows). You can either name the layouts by the default names (see site configuration section above) or give them a custom name and add them to the `layouts:` configuration for the relevant type of autopage. + +### Obtaining the original Tag or Category name +Internally the autopage system will trim and downcase the indexing key (tag, category or collection name). To retrieve the original name of the index key you can use the `autopages.display_name` liquid variable. + +``` html +<h1 class="page-heading">All pages tagged with <b>{% if page.autopages %}{{page.autopages.display_name}}{% endif %}</b></h1> +``` + +This variable returns the untouched key value. As an example if your site uses the tag `Science-Fiction` then + +``` +page.tag = "science-fiction" +page.autopages.display_name = "Science-Fiction" +``` + +See [#6](https://github.com/sverrirs/jekyll-paginate-v2/issues/6) for more information. + + +## Advanced configuration +You can customize the look an feel of the permalink structure and the title for the auto-pages. You can also add front-matter `pagination` configuration to the layout pages you're using to specify things like sorting, filtering and all the other configuration options that are available in the normal pagination generator. + +> Keep in mind that when the autopages are paginated the pagination permalink structure and pagination title suffix is appended to them. + +## Specialised pages + +Special autopages can be used that leverage the powerful filtering and sorting features of the pagination logic. For example you might want to create special pages autopages that paginate all tags in a certain collection or certain tags within a category. + +To achieve this you specify the `pagination` front-matter configuration in the autopage layout file. + +An example of this can be found in [examples/03-tags/_layouts/autopage_collections_tags.html](https://github.com/sverrirs/jekyll-paginate-v2/blob/master/examples/03-tags/_layouts/autopage_collections_tags.html). This page creates paginated pages for all tags that are found in the special _all_ collections. + +## Considerations + +### Title should not contain pagination macros +There is no need to include the pagination title macros `:num`, `:max` or `:title` in the title configuration. The autopages will use the title configuration from the pagination configuration itself. + +## Common issues +_None reported so far_ \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/README-GENERATOR.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/README-GENERATOR.md new file mode 100644 index 000000000000..461e759f2dcb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/README-GENERATOR.md @@ -0,0 +1,668 @@ +# Jekyll::Paginate V2::Generator + +The **Generator** forms the core of the pagination logic. It is responsible for reading the posts and collections in your site and split them correctly across multiple pages according to the supplied configuration. It also performs the necessary functions to link to the previous and next pages in the page-sets that it generates. +<p align="center"> + <img src="https://raw.githubusercontent.com/sverrirs/jekyll-paginate-v2/master/res/generator-logo.png" height="128" /> +</p> + +> The code was based on the original design of [jekyll-paginate](https://github.com/jekyll/jekyll-paginate) and features were sourced from discussions such as [#27](https://github.com/jekyll/jekyll-paginate/issues/27) (thanks [Günter Kits](https://github.com/gynter)). + +* [Site configuration](#site-configuration) +* [Page configuration](#page-configuration) +* [Backwards compatibility](#backwards-compatibility-with-jekyll-paginate) +* [Example Sites](https://github.com/sverrirs/jekyll-paginate-v2/tree/master/examples) +* [Paginating collections](#paginating-collections) + + [Single collection](#paginating-a-single-collection) + + [Multiple collection](#paginating-multiple-collections) + + [The special 'all' collection](#the-special-all-collection) +* [How to paginate categories, tags, locales](#paginate-categories-tags-locales) + + [Filtering categories](#filtering-categories) + + [Filtering tags](#filtering-tags) + + [Filtering locales](#filtering-locales) +* [How to paginate on combination of filters](#paginate-on-combination-of-filters) +* [Overriding site configuration](#configuration-overrides) +* [Offsetting posts (how to skip newest posts)](#offsetting-posts) +* [Advanced Sorting](#advanced-sorting) +* [Creating Pagination Trails](#creating-pagination-trails) +* [How to detect auto-generated pages](#detecting-generated-pagination-pages) +* [Formatting page titles](#formatting-page-titles) +* [Reading pagination meta information](#reading-pagination-meta-information) +* [How to generate a JSON API](#generating-a-json-api) +* [Renaming pagination file names](#renaming-pagination-file-names) +* [Common issues](#common-issues) + - [Dependency Error after installing](#i-keep-getting-a-dependency-error-when-running-jekyll-serve-after-installing-this-gem) + - [Bundler error upgrading gem (Bundler::GemNotFound)](#im-getting-a-bundler-error-after-upgrading-the-gem-bundlergemnotfound) + - [Bundler error running gem (Gem::LoadError)](#im-getting-a-bundler-error-after-upgrading-the-gem-gemloaderror) + - [Pagination pages are not found](#my-pagination-pages-are-not-being-found-couldnt-find-any-pagination-page-skipping-pagination) + - [Categories cause excess folder nesting](#my-pages-are-being-nested-multiple-levels-deep) + - [Pagination pages overwriting each others pages](#my-pagination-pages-are-overwriting-each-others-pages) + +## Site configuration + +The pagination gem is configured in the site's `_config.yml` file by including the `pagination` configuration element + +``` yml +############################################################ +# Site configuration for the Jekyll 3 Pagination Gem +# The values here represent the defaults if nothing is set +pagination: + + # Site-wide kill switch, disabled here it doesn't run at all + enabled: true + + # Set to 'true' to enable pagination debugging. This can be enabled in the site config or only for individual pagination pages + debug: false + + # The default document collection to paginate if nothing is specified ('posts' is default) + collection: 'posts' + + # How many objects per paginated page, used to be `paginate` (default: 0, means all) + per_page: 10 + + # The permalink structure for the paginated pages (this can be any level deep) + permalink: '/page/:num/' # Pages are index.html inside this folder (default) + #permalink: '/page/:num.html' # Pages are simple html files + #permalink: '/page/:num' # Pages are html files, linked jekyll extensionless permalink style. + + # Optional the title format for the paginated pages (supports :title for original page title, :num for pagination page number, :max for total number of pages) + title: ':title - page :num' + + # Limit how many pagenated pages to create (default: 0, means all) + limit: 0 + + # Optional, defines the field that the posts should be sorted on (omit to default to 'date') + sort_field: 'date' + + # Optional, sorts the posts in reverse order (omit to default decending or sort_reverse: true) + sort_reverse: true + + # Optional, the default category to use, omit or just leave this as 'posts' to get a backwards-compatible behavior (all posts) + category: 'posts' + + # Optional, the default tag to use, omit to disable + tag: '' + + # Optional, the default locale to use, omit to disable (depends on a field 'locale' to be specified in the posts, + # in reality this can be any value, suggested are the Microsoft locale-codes (e.g. en_US, en_GB) or simply the ISO-639 language code ) + locale: '' + + # Optional,omit or set both before and after to zero to disable. + # Controls how the pagination trail for the paginated pages look like. + trail: + before: 2 + after: 2 + + # Optional, the default file extension for generated pages (e.g html, json, xml). + # Internally this is set to html by default + extension: html + + # Optional, the default name of the index file for generated pages (e.g. 'index.html') + # Without file extension + indexpage: 'index' + +############################################################ +``` + +Also ensure that you remove the old 'jekyll-paginate' gem from your `gems` list and add this new gem instead + +``` yml +gems: [jekyll-paginate-v2] +``` + +## Page configuration + +To enable pagination on a page then simply include the minimal pagination configuration in the page front-matter: + +``` yml +--- +layout: page +pagination: + enabled: true +--- +``` + +Then you can use the normal `paginator.posts` logic to iterate through the posts. + +``` html +{% for post in paginator.posts %} + <h1>{{ post.title }}</h1> +{% endfor %} +``` + +And to display pagination links, simply + +``` html +{% if paginator.total_pages > 1 %} +<ul> + {% if paginator.previous_page %} + <li> + <a href="{{ paginator.previous_page_path | prepend: site.baseurl }}">Newer</a> + </li> + {% endif %} + {% if paginator.next_page %} + <li> + <a href="{{ paginator.next_page_path | prepend: site.baseurl }}">Older</a> + </li> + {% endif %} +</ul> +{% endif %} +``` + +> All posts that have the `hidden: true` in their front matter are ignored by the pagination logic. + +Following fields area available on the `paginator` object + +| Field | Description | +| --- | --- | +| per_page | Maximum number of posts or documents on each pagination page. | +| posts | The list of post objects that belong to this pagination page. | +| total_posts | Total number of posts included in pagination. | +| total_pages | Total number of pagination pages created. | +| page | Number of the current pagination page. | +| page_path | The relative Url path of the current pagination page. | +| previous_page | Number of the previous page in the pagination. Nil if no previous page is available. | +| previous_page_path | The relative Url of the previous page. Nil if no previous page is available. | +| next_page | Number of the next page in the pagination. Nil if there is no next page available. | +| next_page_path | The relative Url of the next page in the pagination. Nil if there is no next page available. | +| first_page | Number of the first page in the pagination (usually this is `1`). | +| first_page_path | The relative Url of the first page in the pagination. | +| last_page | Number of the last page in the pagination (this is equal to `total_pages`). | +| last_page_path | The relative Url of the last page in the pagination. | +| page_trail | The [pagination trail](#creating-pagination-trails) structure | + + +The code is fully backwards compatible and you will have access to all the normal paginator variables defined in the [official jekyll documentation](https://jekyllrb.com/docs/pagination/#liquid-attributes-available). + +Neat! :ok_hand: + +Don't delay, go see the [Examples](https://github.com/sverrirs/jekyll-paginate-v2/tree/master/examples), they're way more useful than read-me docs at this point :) + +## Backwards compatibility with jekyll-paginate +This gem is fully backwards compatible with the old [jekyll-paginate](https://github.com/jekyll/jekyll-paginate) gem and can be used as a zero-configuration replacement for it. If the old site config is detected then the gem will fall back to the old logic of pagination. + +> You cannot run both the new pagination logic and the old one at the same time + +The following `_config.yml` settings are honored when running this gem in compatability mode + +``` yml +paginate: 8 +paginate_path: "/legacy/page:num/" +``` + +See more about the old style of pagination at the [jekyll-paginate](https://github.com/jekyll/jekyll-paginate) page. + +> :bangbang: **Warning** Backwards compatibility with the old jekyll-paginate gem is currently scheduled to be removed after **1st January 2018**. Users will start receiving warning log messages when running jekyll two months before this date. + +## Paginating collections +By default the pagination system only paginates `posts`. If you only have `posts` and `pages` in your site you don't need to worry about a thing, everything will work as intended without you configuring anything. + +However if you use document collections, or would like to, then this pagination gem offers extensive support for paginating documents in one or more collections at the same time. + +> Collections are groups of documents that belong together but should not be grouped by date. +> See more about ['collections'](http://ben.balter.com/2015/02/20/jekyll-collections/) on Ben Balters blog. + +### Paginating a single collection + +Lets expand on Ben's collection discussion (linked above). Let's say that you have hundreds of cupcake pages in your cupcake collection. To create a pagination page for only documents from the cupcake collection you would do this + +``` yml +--- +layout: page +title: All Cupcakes +pagination: + enabled: true + collection: cupcakes +--- +``` + +### Paginating multiple collections + +Lets say that you want to create a single pagination page for only small cakes on your page (you have both cupcakes and cookies to sell). You could do that like this + +``` yml +--- +layout: page +title: Lil'bits +pagination: + enabled: true + collection: cupcakes, cookies +--- +``` + +### The special 'all' collection + +Now your site has grown and you have multiple cake collections on it and you want to have a single page that paginates all of your collections at the same time. +You can use the special `all` collection name for this. + +``` yml +--- +layout: page +title: All the Cakes! +pagination: + enabled: true + collection: all +--- +``` + +> Note: Due to the `all` keyword being reserved for this feature, you cannot have a collection called `all` in your site configuration. Sorry. + + +## Paginate categories, tags, locales + +Enabling pagination for specific categories, tags or locales is as simple as adding values to the pagination page front-matter and corresponding values in the posts. + +### Filtering categories + +Filter single category 'software' + +``` yml +--- +layout: post +pagination: + enabled: true + category: software +--- +``` + +Filter multiple categories (lists only posts belonging to all categories) + +``` yml +pagination: + enabled: true + category: software, ruby +``` + +> To define categories you can either specify them in the front-matter or through the [directory structure](http://jekyllrb.com/docs/variables/#page-variables) of your jekyll site (Categories are derived from the directory structure above the \_posts directory). You can actually use both approaches to assign your pages to multiple categories. + +### Filtering tags + +Filter on a single tag + +``` yml +pagination: + enabled: true + tag: cool +``` + +Filter on multiple tags + +``` yml +pagination: + enabled: true + tag: cool, life +``` + +> When specifying tags in your posts make sure that the values are not enclosed in single quotes (double quotes are fine). If they are you will get a cryptic error when generating your site that looks like _"Error: could not read file <FILE>: did not find expected key while parsing a block mapping at line 2 column 1"_ + +### Filtering locales + +In the case your site offers multiple languages you can include a `locale` item in your post front matter. The paginator can then use this value to filter on + +The category page front-matter would look like this + +``` yml +pagination: + enabled: true + locale: en_US +``` + +Then for the relevant posts, include the `locale` variable in their front-matter + +``` yml +locale: en_US +``` + +## Paginate on combination of filters + +Including only posts from categories 'ruby' and 'software' written in English + +``` yml +pagination: + enabled: true + category: software, ruby + locale: en_US, en_GB, en_WW +``` + +Only showing posts tagged with 'cool' and in category 'cars' + +``` yml +pagination: + enabled: true + category: cars + tag: cool +``` + +... and so on and so on + +## Configuration overrides + +All of the configuration elements from the `_config.yml` file can be overwritten in the pagination pages. E.g. if you want one category page to have different permalink structure simply override the item like so + +``` yml +pagination: + enabled: true + category: cars + permalink: '/cars/:num/' +``` + +Overriding sorting to sort by the post title in ascending order for another paginated page could be done like so + +``` yml +pagination: + enabled: true + category: ruby + sort_field: 'title' + sort_reverse: false +``` + +## Offsetting posts +The paging logic can be instructed to exclude the first _N_ number of newest posts from the pagination. +This can be useful in situations where your site treats the first N posts differently from the rest (e.g. a featured post that is always present). + +The number of pages to skip is configured using the `offset` setting like so + +``` yml +pagination: + enabled: true + offset: 3 +``` + +This example skips the 3 newest posts from the pagination logic. + +## Advanced Sorting +Sorting can be done by any field that is available in the post front-matter. You can even sort by nested fields. + +> When sorting by nested fields separate the fields with a colon `:` character. + +As an example, assuming all your posts have the following front-matter + +``` yml +--- +layout: post +author: + name: + first: "John" + last: "Smith" + born: 1960 +--- +``` + +You can define pagination sorting on the nested `first` field like so + +``` yml +--- +layout: page +title: "Authors by first name" +pagination: + enabled: true + sort_field: 'author:name:first' +--- +``` + +To sort by the `born` year in decending order (youngest first) + +``` yml +--- +layout: page +title: "Authors by birth year" +pagination: + enabled: true + sort_field: 'author:born' + sort_reverse: true +--- +``` + +## Creating Pagination Trails + +<p align="center"> + <img src="https://raw.githubusercontent.com/sverrirs/jekyll-paginate-v2/master/res/pagination-trails.png" /> +</p> + +Creating a trail structure for your pagination as shown above can be achieved by enabling the `trail` configuration and including a little extra code in your liquid templates. + +``` yml +pagination: + trail: + before: 2 # The number of links before the current page + after: 2 # The number of links after the current page +``` + +Your layout file would then have to include code similar to the following to generate the correct HTML structure + +``` HTML +{% if paginator.page_trail %} + {% for trail in paginator.page_trail %} + <li {% if page.url == trail.path %}class="selected"{% endif %}> + <a href="{{ trail.path | prepend: site.baseurl }}" title="{{trail.title}}">{{ trail.num }}</a> + </li> + {% endfor %} +{% endif %} +``` +_See [example 3](https://github.com/sverrirs/jekyll-paginate-v2/tree/master/examples/03-tags) for a demo of a pagination trail_ + +The `trail` object exposes three properties: +* `num`: The number of the page +* `path`: The path to the page +* `title`: The title of the page + +The algorithm will always attempt to keep the same trail length for all pages (`trail length = before + after + 1`). +As an example if we have only 7 pagination pages in total and the user is currently on page 6 then the trail would look like this + +<p align="center"> + <img src="https://raw.githubusercontent.com/sverrirs/jekyll-paginate-v2/master/res/pagination-trails-p6.png" /> +</p> + +Different number of before and after trail links can be specified. Below is an example of how the yml config below would look like when on the same page 4 + +``` yml +pagination: + trail: + before: 1 + after: 3 +``` + +<p align="center"> + <img src="https://raw.githubusercontent.com/sverrirs/jekyll-paginate-v2/master/res/pagination-trails-p4-b1a3.png" /> +</p> + +## Detecting generated pagination pages + +To identify the auto-generated pages that are created by the pagination logic when iterating through collections such as `site.pages` the `page.autogen` variable can be used like so + +``` +{% for my_page in site.pages %} + {% if my_page.title and my_page.autogen == nil %} + <h1>{{ my_page.title | escape }}</h1> + {% endif %} +{% endfor %} +``` +_In this example only pages that have a title and are not auto-generated are included._ + +This variable is created and assigned the value `page.autogen = "jekyll-paginate-v2"` by the pagination logic. This way you can detect which pages are auto-generated and by what gem. + +## Formatting page titles + +The `title` field in both the site.config and the front-matter configuration supports the following macros. + +| Text | Replaced with | Example | +| --- | --- | --- | +| :title | original page title | Page with `title: "Index"` and paginate config `title: ":title - split"` becomes `<title>Index - split</title>` | +| :num | number of the current page | Page with `title: "Index"` and paginate config `title: ":title (page :num)"` the second page becomes `<title>Index (page 2)</title>` | +| :max | total number of pages | Page with paginate config `title: ":num of :max"` the third page of 10 will become `<title>3 of 10</title>"` | + +## Reading pagination meta information +Each pagination page defines an information structure `pagination_info` that is available to the liquid templates. This structure contains meta information for the pagination process, such as current pagination page and the total number of paginated pages. + +The following fields are available + +| Field | Description | +| --- | --- | +| curr_page | The number of the current pagination page | +| total_pages | The total number of pages in this pagination | + +Below is an example on how to print out a "Page x of n" in the pagination layout + +``` html +<h2>Page {{page.pagination_info.curr_page}} of {{page.pagination_info.total_pages}}</h2> +``` + +## Generating a JSON API + +Delivering content via an API is useful, for a lot of the same reasons that pagination is useful. We want to delivery content, in such a way, that is: + +1. Easy for the user to consume. +2. Easy for the browser to load. + +Paginating content meets both of these requirements, but developers are limited to presenting content statically rather than dynamically. Some example of dynamic content delivery are: +- Pop up modals +- Infinite scrolling +- Multi-tiered pagination (e.g. Netflix UI horizontal scrolling for multiple movie categories) + +### So how do I generate a JSON API for Jekyll? + +First, create a new jekyll page and set its layout to `null` to avoid any extra html to show up. + +Next, use the `extension` and `indexpage` option to customize the output of the page and its paginated content as JSON files. +> Note that the `indexpage` field also supports the same macros as the permalink field + +Here's an example page: +``` +--- +layout: null +permalink: /api +pagination: + permalink: '' + enabled: true + extension: .json + indexpage: 'feed-:num' +--- + +{ + "pages": [{% for post in paginator.posts %} + {% if forloop.first != true %},{% endif %} + { + "title": "{{ post.title }}", + "link": "{{ post.url }}" + }{% endfor %} + ] +} +``` +Next, run `jekyll build`. This will generate a set of paginated JSON files under the folder `/api`. These JSON files can be loaded via Javascript/AJAX to dynamically load content into your site. + +Below's an example set of routes that the configuration would generate: +- http://localhost:4000/api/feed-1.json +- http://localhost:4000/api/feed-2.json +- http://localhost:4000/api/feed-3.json + +And here is an example of one of the feed.json files that are created given the markup above +``` +{ + "pages": [ + { + "title": "Narcisse Snake Pits", + "link": "/2016/11/narcisse-snake-pits.html" + },{ + "title": "Luft-Fahrzeug-Gesellschaft", + "link": "/2016/11/luft-fahrzeug-gesellschaft.html" + },{ + "title": "Rotary engine", + "link": "/2016/11/rotary-engine.html" + } + ], + "next": "/api/feed-11.json", + "prev": "/api/feed-9.json", + "first": "/api/feed-1.json" +} +``` + +For further information see [Example 4](https://github.com/sverrirs/jekyll-paginate-v2/tree/master/examples/04-jsonapi), that project can serve as a starting point for your experiments with this feature. + +### How did you generate those 'next', 'prev' and 'first' links? + +All the normal paginator variables can be used in these JSON feed files. You can use them to achive quite powerful features such as pre-loading and detecting when there are no more feeds to load. + +``` +{% if paginator.next_page %} + ,"next": "{{ paginator.next_page_path }}" + {% endif %} + {% if paginator.last_page %} + ,"prev": "{{ paginator.last_page_path }}" + {% endif %} + {% if paginator.first_page %} + ,"first": "{{ paginator.first_page_path }}" + {% endif %} +``` + +## Renaming pagination file names +By default the pagination system creates all paginated pages as `index.html`. The system provides an option to override this name and file extension with the + +```yml + indexpage: index + extension: html +``` + +If you wanted to generate all pagination files as `default.htm` then the settings should be configured as follows + +```yml + indexpage: default + extension: htm +``` + +## Common issues + +### I keep getting a dependency error when running jekyll serve after installing this gem + +> Dependency Error: Yikes! It looks like you don't have jekyll-paginate-v2 or one of its dependencies installed... + +Check your `Gemfile` in the site root. Ensure that the jekyll-paginate-v2 gem is present in the jekyll_plugins group like the example below. If this group is missing add to the file. + +``` ruby +group :jekyll_plugins do + gem "jekyll-paginate-v2" +end +``` + +### I'm getting a bundler error after upgrading the gem (Bundler::GemNotFound) + +> bundler/spec_set.rb:95:in `block in materialize': Could not find jekyll-paginate-v2-1.0.0 in any of the sources (Bundler::GemNotFound) + +Delete your `Gemfile.lock` file and try again. + + +### I'm getting a bundler error after upgrading the gem (Gem::LoadError) + +> bundler/runtime.rb:40:in 'block in setup': You have already activated addressable 2.5.0, but your Gemfile requires addressable 2.4.0. Prepending `bundle exec` to your command may solve this. (Gem::LoadError) + +Delete your `Gemfile.lock` file and try again. + +### My pagination pages are not being found (Couldn't find any pagination page. Skipping pagination) + +> Pagination: Is enabled, but I couldn't find any pagination page. Skipping pagination... + +* Ensure that you have the correct minimum front-matter in the pagination pages +``` yml +pagination: + enabled: true +``` +* You can place pagination logic into either the pages or liquid templates (templates are stored under the `_layouts/` and `_includes/` folders). + +### My pages are being nested multiple levels deep + +When using `categories` for posts it is advisable to explicitly state a `permalink` structure in your `_config.yml` file. + +``` +permalink: /:year/:month/:title.html +``` + +This is because the default behavior in Jekyll is to nest pages for every category that they belong to and Jekyll unfortunately does not understand multi-categories separated with `,` or `;` but instead does all separation on `[space]` only. + +### My pagination pages are overwriting each others pages +If you specify multiple pages that paginate in the site root then you must give them unique and separate pagination permalink. This link is set in the pagination page front-matter like so + +``` yml +pagination: + enabled: true + permalink: '/cars/:num/' +``` + +Make absolutely sure that your pagination permalink paths do not clash with any other paths in your final site. For simplicity it is recommended that you keep all custom pagination (non root index.html) in a single or multiple separate sub folders under your site root. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/README.md new file mode 100644 index 000000000000..878f008c9363 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/README.md @@ -0,0 +1,82 @@ +# Jekyll::Paginate V2 + +Pagination gem built specially for Jekyll 3 and newer that is fully backwards compatible and serves as an enhanced replacement for the previously built-in [jekyll-paginate gem](https://github.com/jekyll/jekyll-paginate). View it on [rubygems.org](https://rubygems.org/gems/jekyll-paginate-v2). + +[![Code Shelter](https://www.codeshelter.co/static/badges/badge-flat.svg)](https://www.codeshelter.co/) +[![Gem](https://img.shields.io/gem/v/jekyll-paginate-v2.svg)](https://rubygems.org/gems/jekyll-paginate-v2) +[![Join the chat at https://gitter.im/jekyll-paginate-v2/Lobby](https://badges.gitter.im/jekyll-paginate-v2/Lobby.svg)](https://gitter.im/jekyll-paginate-v2/Lobby) +[![Build Status](https://travis-ci.org/sverrirs/jekyll-paginate-v2.svg?branch=master)](https://travis-ci.org/sverrirs/jekyll-paginate-v2) +[![Code Climate](https://codeclimate.com/github/sverrirs/jekyll-paginate-v2/badges/gpa.svg)](https://codeclimate.com/github/sverrirs/jekyll-paginate-v2) +[![security](https://hakiri.io/github/sverrirs/jekyll-paginate-v2/master.svg)](https://hakiri.io/github/sverrirs/jekyll-paginate-v2/master) +[![Gem](https://img.shields.io/gem/dt/jekyll-paginate-v2.svg)](https://rubygems.org/gems/jekyll-paginate-v2) + +Reach me at the [project issues](https://github.com/sverrirs/jekyll-paginate-v2/issues) section or via email at [jekyll@sverrirs.com](mailto:jekyll@sverrirs.com), you can also get in touch on the project's [Gitter chat room](https://gitter.im/jekyll-paginate-v2/Lobby). + +> The code was based on the original design of [jekyll-paginate](https://github.com/jekyll/jekyll-paginate) and features were sourced from discussions such as [#27](https://github.com/jekyll/jekyll-paginate/issues/27) (thanks [Günter Kits](https://github.com/gynter)). + +* [Installation](#installation) +* [Example Sites](https://github.com/sverrirs/jekyll-paginate-v2/tree/master/examples) +* [Pagination Generator](#pagination-generator) +* [Auto-Pages](#auto-pages) +* [Issues / to-be-completed](#issues--to-be-completed) +* [How to Contribute](#contributing) + +> _"Be excellent to each other"_ + +:heart: + +## Installation + +``` +gem install jekyll-paginate-v2 +``` + +Update your [_config.yml](README-GENERATOR.md#site-configuration) and [pages](README-GENERATOR.md#page-configuration). + +> Although fully backwards compatible, to enable the new features this gem needs slightly extended [site yml](README-GENERATOR.md#site-configuration) configuration and miniscule additional new front-matter for the [pages to paginate on](README-GENERATOR.md#page-configuration). + +Now you're ready to run `jekyll serve` and your paginated files should be generated. + +Please see the [Examples](https://github.com/sverrirs/jekyll-paginate-v2/tree/master/examples) for tips and tricks on how to configure the pagination logic. + +> :warning: Please note that this plugin is currently NOT supported by GitHub pages. Here is a [list of all plugins supported](https://pages.github.com/versions/). There is work underway to try to get it added it but until then please follow [this GitHub guide](https://help.github.com/articles/adding-jekyll-plugins-to-a-github-pages-site/) to enable it or use [Travis CI](https://ayastreb.me/deploy-jekyll-to-github-pages-with-travis-ci/). + +> GitLab supposedly supports [any plugin](https://about.gitlab.com/comparison/gitlab-pages-vs-github-pages.html). + + +## Pagination Generator + +The [Pagination Generator](README-GENERATOR.md) forms the core of the pagination logic. Calculates and generates the pagination pages. + + +## Auto Pages + +The [Auto-Pages](README-AUTOPAGES.md) is an optional feature that auto-magically generates paginated pages for all your tags, categories and collections. + + +## Issues / to-be-completed + +* Unit-tests do not cover all critical code paths +* No integration tests yet [#2](https://github.com/jekyll/jekyll-paginate/pull/2) +* _Exclude_ filter not implemented [#6](https://github.com/jekyll/jekyll-paginate/issues/6) +* Elegant way of collecting and printing debug information during pagination + + +I welcome all testers and people willing to give me feedback and code reviews. + +## Contributing + +> Although this project is small it has a [code of conduct](CODE_OF_CONDUCT.md) that I hope everyone will do their best to follow when contributing to any aspects of this project. Be it discussions, issue reporting, documentation or programming. + +If you don't want to open issues here on Github, send me your feedback by email at [jekyll@sverrirs.com](mailto:jekyll@sverrirs.com). + +1. Fork it ( https://github.com/sverrirs/jekyll-paginate-v2/fork ) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Run the unit tests (`rake`) +4. Commit your changes (`git commit -am 'Add some feature'`) +5. Build the gem locally (`gem build jekyll-paginate-v2.gemspec`) +6. Test and verify the gem locally (`gem install ./jekyll-paginate-v2-x.x.x.gem`) +7. Push to the branch (`git push origin my-new-feature`) +8. Create new Pull Request + +Note: This project uses [semantic versioning](http://semver.org/). diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/Rakefile new file mode 100644 index 000000000000..59acedd15c26 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/Rakefile @@ -0,0 +1,16 @@ +require 'rake' +require 'rake/testtask' + +#$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib])) +#require 'lib/jekyll-paginate-v2/version' + +Rake::TestTask.new do |t| + t.libs.push 'lib' + t.libs.push 'specs' + t.verbose = true + t.pattern = "spec/**/*_spec.rb" + t.test_files = FileList['spec/**/*_spec.rb'] +end + +desc "Run tests" +task :default => [:test] \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/jekyll-paginate-v2.gemspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/jekyll-paginate-v2.gemspec new file mode 100644 index 000000000000..abfe84f10114 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/jekyll-paginate-v2.gemspec @@ -0,0 +1,33 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'jekyll-paginate-v2/version' +require 'date' + +Gem::Specification.new do |spec| + spec.name = "jekyll-paginate-v2" + spec.version = Jekyll::PaginateV2::VERSION + spec.platform = Gem::Platform::RUBY + spec.required_ruby_version = '>= 2.0.0' # Same as Jekyll + spec.date = DateTime.now.strftime('%Y-%m-%d') + spec.authors = ["Sverrir Sigmundarson"] + spec.email = ["jekyll@sverrirs.com"] + spec.homepage = "https://github.com/sverrirs/jekyll-paginate-v2" + spec.license = "MIT" + + spec.summary = %q{Pagination Generator for Jekyll 3 and newer} + spec.description = %q{An enhanced zero-configuration in-place replacement for the now decomissioned built-in jekyll-paginate gem. This pagination gem offers full backwards compatability as well as a slew of new frequently requested features with minimal additional site and page configuration. Optional features include auto-generation of paginated collection, tag and category pages.} + + spec.files = Dir['CODE_OF_CONDUCT.md', 'README*.md', 'LICENSE', 'Rakefile', '*.gemspec', 'Gemfile', 'lib/**/*', 'spec/**/*'] + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ["lib"] + + # Gem requires Jekyll to work + # ~> is the pessimistic operator and is equivalent to '>= 3.0', '< 4.0' + spec.add_runtime_dependency "jekyll", ">= 3.0", "< 5.0" + + # Development requires more + spec.add_development_dependency "bundler", "~> 1.5" + spec.add_development_dependency "rake", "~> 10.4" + spec.add_development_dependency "minitest", '~> 5.4' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2.rb new file mode 100644 index 000000000000..dd19254cf446 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2.rb @@ -0,0 +1,34 @@ +# Jekyll::Paginate V2 is a gem built for Jekyll 3 that generates pagiatation for posts, collections, categories and tags. +# +# It is based on https://github.com/jekyll/jekyll-paginate, the original Jekyll paginator +# which was decommissioned in Jekyll 3 release onwards. This code is currently not officially +# supported on Jekyll versions < 3.0 (although it might work) +# +# Author: Sverrir Sigmundarson +# Site: https://github.com/sverrirs/jekyll-paginate-v2 +# Distributed Under The MIT License (MIT) as described in the LICENSE file +# - https://opensource.org/licenses/MIT + +require "jekyll-paginate-v2/version" +# Files needed for the pagination generator +require "jekyll-paginate-v2/generator/defaults" +require "jekyll-paginate-v2/generator/compatibilityUtils" +require "jekyll-paginate-v2/generator/utils" +require "jekyll-paginate-v2/generator/paginationIndexer" +require "jekyll-paginate-v2/generator/paginator" +require "jekyll-paginate-v2/generator/paginationPage" +require "jekyll-paginate-v2/generator/paginationModel" +require "jekyll-paginate-v2/generator/paginationGenerator" +# Files needed for the auto category and tag pages +require "jekyll-paginate-v2/autopages/utils" +require "jekyll-paginate-v2/autopages/defaults" +require "jekyll-paginate-v2/autopages/autoPages" +require "jekyll-paginate-v2/autopages/pages/baseAutoPage" +require "jekyll-paginate-v2/autopages/pages/categoryAutoPage" +require "jekyll-paginate-v2/autopages/pages/collectionAutoPage" +require "jekyll-paginate-v2/autopages/pages/tagAutoPage" + +module Jekyll + module PaginateV2 + end # module PaginateV2 +end # module Jekyll \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/autoPages.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/autoPages.rb new file mode 100644 index 000000000000..843f63719c85 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/autoPages.rb @@ -0,0 +1,77 @@ +module Jekyll + module PaginateV2::AutoPages + + # + # This function is called right after the main generator is triggered by Jekyll + # This code is adapted from Stephen Crosby's code https://github.com/stevecrozz + def self.create_autopages(site) + + # Get the configuration for the auto pages + autopage_config = Jekyll::Utils.deep_merge_hashes(DEFAULT, site.config['autopages'] || {}) + pagination_config = Jekyll::Utils.deep_merge_hashes(Jekyll::PaginateV2::Generator::DEFAULT, site.config['pagination'] || {}) + + # If disabled then don't do anything + if !autopage_config['enabled'] || autopage_config['enabled'].nil? + Jekyll.logger.info "AutoPages:","Disabled/Not configured in site.config." + return + end + + # TODO: Should I detect here and disable if we're running the legacy paginate code???! + + # Simply gather all documents across all pages/posts/collections that we have + # we could be generating quite a few empty pages but the logic is just vastly simpler than trying to + # figure out what tag/category belong to which collection. + posts_to_use = Utils.collect_all_docs(site.collections) + + ############################################### + # Generate the Tag pages if enabled + createtagpage_lambda = lambda do | autopage_tag_config, pagination_config, layout_name, tag, tag_original_name | + site.pages << TagAutoPage.new(site, site.dest, autopage_tag_config, pagination_config, layout_name, tag, tag_original_name) + end + autopage_create(autopage_config, pagination_config, posts_to_use, 'tags', 'tags', createtagpage_lambda) # Call the actual function + + + ############################################### + # Generate the category pages if enabled + createcatpage_lambda = lambda do | autopage_cat_config, pagination_config, layout_name, category, category_original_name | + site.pages << CategoryAutoPage.new(site, site.dest, autopage_cat_config, pagination_config, layout_name, category, category_original_name) + end + autopage_create(autopage_config, pagination_config,posts_to_use, 'categories', 'categories', createcatpage_lambda) # Call the actual function + + ############################################### + # Generate the Collection pages if enabled + createcolpage_lambda = lambda do | autopage_col_config, pagination_config, layout_name, coll_name, coll_original_name | + site.pages << CollectionAutoPage.new(site, site.dest, autopage_col_config, pagination_config, layout_name, coll_name, coll_original_name) + end + autopage_create(autopage_config, pagination_config,posts_to_use, 'collections', '__coll', createcolpage_lambda) # Call the actual function + + end # create_autopages + + + # STATIC: this function actually performs the steps to generate the autopages. It uses a lambda function to delegate the creation of the individual + # page types to the calling code (this way all features can reuse the logic). + # + def self.autopage_create(autopage_config, pagination_config, posts_to_use, configkey_name, indexkey_name, createpage_lambda ) + if !autopage_config[configkey_name].nil? + ap_sub_config = autopage_config[configkey_name] + if ap_sub_config ['enabled'] + Jekyll.logger.info "AutoPages:","Generating #{configkey_name} pages" + + # Roll through all documents in the posts collection and extract the tags + index_keys = Utils.ap_index_posts_by(posts_to_use, indexkey_name) # Cannot use just the posts here, must use all things.. posts, collections... + + index_keys.each do |index_key, value| + # Iterate over each layout specified in the config + ap_sub_config ['layouts'].each do | layout_name | + # Use site.dest here as these pages are never created in the actual source but only inside the _site folder + createpage_lambda.call(ap_sub_config, pagination_config, layout_name, index_key, value[-1]) # the last item in the value array will be the display name + end + end + else + Jekyll.logger.info "AutoPages:","#{configkey_name} pages are disabled/not configured in site.config." + end + end + end + + end # module PaginateV2 +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/defaults.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/defaults.rb new file mode 100644 index 000000000000..94617f8fa20a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/defaults.rb @@ -0,0 +1,40 @@ +module Jekyll + module PaginateV2::AutoPages + + # The default configuration for the AutoPages + DEFAULT = { + 'enabled' => false, + 'tags' => { + 'layouts' => ['autopage_tags.html'], + 'title' => 'Posts tagged with :tag', + 'permalink' => '/tag/:tag', + 'enabled' => true, + 'slugify' => { + 'mode' => 'none', # [raw default pretty ascii latin], none gives back the same string + 'cased'=> false # If cased is true, all uppercase letters in the result string are replaced with their lowercase counterparts. + } + }, + 'categories' => { + 'layouts' => ['autopage_category.html'], + 'title' => 'Posts in category :cat', + 'permalink' => '/category/:cat', + 'enabled' => true, + 'slugify' => { + 'mode' => 'none', # [raw default pretty ascii latin], none gives back the same string + 'cased'=> false # If cased is true, all uppercase letters in the result string are replaced with their lowercase counterparts. + } + }, + 'collections' => { + 'layouts' => ['autopage_collection.html'], + 'title' => 'Posts in collection :coll', + 'permalink' => '/collection/:coll', + 'enabled' => true, + 'slugify' => { + 'mode' => 'none', # [raw default pretty ascii latin], none gives back the same string + 'cased'=> false # If cased is true, all uppercase letters in the result string are replaced with their lowercase counterparts. + } + } + } + + end # module PaginateV2::AutoPages +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/baseAutoPage.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/baseAutoPage.rb new file mode 100644 index 000000000000..3ed5a1c77d2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/baseAutoPage.rb @@ -0,0 +1,60 @@ +module Jekyll + module PaginateV2::AutoPages + + class BaseAutoPage < Jekyll::Page + def initialize(site, base, autopage_config, pagination_config, layout_name, set_autopage_data_lambda, get_autopage_permalink_lambda, get_autopage_title_lambda, display_name) + @site = site + @base = base + @name = 'index.html' + + layout_dir = '_layouts' + + # Path is only used by the convertible module and accessed below when calling read_yaml + # Handling themes stored in a gem + @path = if site.in_theme_dir(site.source) == site.source # we're in a theme + site.in_theme_dir(site.source, layout_dir, layout_name) + else + site.in_source_dir(site.source, layout_dir, layout_name) + end + + self.process(@name) # Creates the base name and extension + self.read_yaml(File.join(site.source, layout_dir), layout_name) + + # Merge the config with any config that might already be defined in the layout + pagination_layout_config = Jekyll::Utils.deep_merge_hashes( pagination_config, self.data['pagination'] || {} ) + + # Read any possible autopage overrides in the layout page + autopage_layout_config = Jekyll::Utils.deep_merge_hashes( autopage_config, self.data['autopages'] || {} ) + + # Now set the page specific pagination data + set_autopage_data_lambda.call(pagination_layout_config) + + # Get permalink structure + permalink_formatted = get_autopage_permalink_lambda.call(autopage_layout_config['permalink']) + + # Construct the title + page_title = autopage_layout_config['title'] + + # NOTE: Should we set this before calling read_yaml as that function validates the permalink structure + self.data['permalink'] = permalink_formatted + @url = File.join(permalink_formatted, @name) + @dir = permalink_formatted + + self.data['layout'] = File.basename(layout_name, File.extname(layout_name)) + self.data['title'] = get_autopage_title_lambda.call( page_title ) + self.data['pagination'] = pagination_layout_config # Store the pagination configuration + + # Add the auto page flag in there to be able to detect the page (necessary when figuring out where to load it from) + # TODO: Need to re-think this variable!!! + self.data['autopage'] = {"layout_path" => File.join( layout_dir, layout_name ), 'display_name' => display_name.to_s } + + data.default_proc = proc do |_, key| + site.frontmatter_defaults.find(File.join(layout_dir, layout_name), type, key) + end + + # Trigger a page event + #Jekyll::Hooks.trigger :pages, :post_init, self + end #function initialize + end #class BaseAutoPage + end # module PaginateV2 +end # module Jekyll \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/categoryAutoPage.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/categoryAutoPage.rb new file mode 100644 index 000000000000..aba6578571e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/categoryAutoPage.rb @@ -0,0 +1,31 @@ +module Jekyll + module PaginateV2::AutoPages + + class CategoryAutoPage < BaseAutoPage + def initialize(site, base, autopage_config, pagination_config, layout_name, category, category_name) + + # Do we have a slugify configuration available + slugify_config = autopage_config.is_a?(Hash) && autopage_config.has_key?('slugify') ? autopage_config['slugify'] : nil + + # Construc the lambda function to set the config values + # this function received the pagination config hash and manipulates it + set_autopage_data_lambda = lambda do | in_config | + in_config['category'] = category + end + + get_autopage_permalink_lambda = lambda do |permalink_pattern| + return Utils.format_cat_macro(permalink_pattern, category, slugify_config) + end + + get_autopage_title_lambda = lambda do |title_pattern| + return Utils.format_cat_macro(title_pattern, category, slugify_config) + end + + # Call the super constuctor with our custom lambda + super(site, base, autopage_config, pagination_config, layout_name, set_autopage_data_lambda, get_autopage_permalink_lambda, get_autopage_title_lambda, category_name) + + end #function initialize + + end #class CategoryAutoPage + end # module PaginateV2 +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/collectionAutoPage.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/collectionAutoPage.rb new file mode 100644 index 000000000000..77491ca23ae2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/collectionAutoPage.rb @@ -0,0 +1,31 @@ +module Jekyll + module PaginateV2::AutoPages + + class CollectionAutoPage < BaseAutoPage + def initialize(site, base, autopage_config, pagination_config, layout_name, collection, collection_name) + + # Do we have a slugify configuration available + slugify_config = autopage_config.is_a?(Hash) && autopage_config.has_key?('slugify') ? autopage_config['slugify'] : nil + + # Construc the lambda function to set the config values + # this function received the pagination config hash and manipulates it + set_autopage_data_lambda = lambda do | in_config | + in_config['collection'] = collection + end + + get_autopage_permalink_lambda = lambda do |permalink_pattern| + return Utils.format_coll_macro(permalink_pattern, collection, slugify_config) + end + + get_autopage_title_lambda = lambda do |title_pattern| + return Utils.format_coll_macro(title_pattern, collection, slugify_config) + end + + # Call the super constuctor with our custom lambda + super(site, base, autopage_config, pagination_config, layout_name, set_autopage_data_lambda, get_autopage_permalink_lambda, get_autopage_title_lambda, collection_name) + + end #function initialize + + end #class CollectionAutoPage + end # module PaginateV2 +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/tagAutoPage.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/tagAutoPage.rb new file mode 100644 index 000000000000..7c05556edd6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/pages/tagAutoPage.rb @@ -0,0 +1,31 @@ +module Jekyll + module PaginateV2::AutoPages + + class TagAutoPage < BaseAutoPage + def initialize(site, base, autopage_config, pagination_config, layout_name, tag, tag_name) + + # Do we have a slugify configuration available + slugify_config = autopage_config.is_a?(Hash) && autopage_config.has_key?('slugify') ? autopage_config['slugify'] : nil + + # Construc the lambda function to set the config values, + # this function received the pagination config hash and manipulates it + set_autopage_data_lambda = lambda do | config | + config['tag'] = tag + end + + get_autopage_permalink_lambda = lambda do |permalink_pattern| + return Utils.format_tag_macro(permalink_pattern, tag, slugify_config) + end + + get_autopage_title_lambda = lambda do |title_pattern| + return Utils.format_tag_macro(title_pattern, tag, slugify_config) + end + + # Call the super constuctor with our custom lambda + super(site, base, autopage_config, pagination_config, layout_name, set_autopage_data_lambda, get_autopage_permalink_lambda, get_autopage_title_lambda, tag_name) + + end #function initialize + + end #class TagAutoPage + end # module PaginateV2 +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/utils.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/utils.rb new file mode 100644 index 000000000000..7bd605db2c5f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/autopages/utils.rb @@ -0,0 +1,80 @@ +module Jekyll + module PaginateV2::AutoPages + + class Utils + + # Static: returns a fully formatted string with the tag macro (:tag) replaced + # + def self.format_tag_macro(toFormat, tag, slugify_config=nil) + slugify_mode = slugify_config.has_key?('mode') ? slugify_config['mode'] : nil + slugify_cased = slugify_config.has_key?('cased') ? slugify_config['cased'] : false + return toFormat.sub(':tag', Jekyll::Utils.slugify(tag.to_s, mode:slugify_mode, cased:slugify_cased)) + end #function format_tag_macro + + # Static: returns a fully formatted string with the category macro (:cat) replaced + # + def self.format_cat_macro(toFormat, category, slugify_config=nil) + slugify_mode = slugify_config.has_key?('mode') ? slugify_config['mode'] : nil + slugify_cased = slugify_config.has_key?('cased') ? slugify_config['cased'] : false + return toFormat.sub(':cat', Jekyll::Utils.slugify(category.to_s, mode:slugify_mode, cased:slugify_cased)) + end #function format_cat_macro + + # Static: returns a fully formatted string with the collection macro (:coll) replaced + # + def self.format_coll_macro(toFormat, collection, slugify_config=nil) + slugify_mode = slugify_config.has_key?('mode') ? slugify_config['mode'] : nil + slugify_cased = slugify_config.has_key?('cased') ? slugify_config['cased'] : false + return toFormat.sub(':coll', Jekyll::Utils.slugify(collection.to_s, mode:slugify_mode, cased:slugify_cased)) + end #function format_coll_macro + + # Static: returns all documents from all collections defined in the hash of collections passed in + # excludes all pagination pages though + def self.collect_all_docs(site_collections) + coll = [] + site_collections.each do |coll_name, coll_data| + if !coll_data.nil? + coll += coll_data.docs.select { |doc| !doc.data.has_key?('pagination') }.each{ |doc| doc.data['__coll'] = coll_name } # Exclude all pagination pages and then for every page store it's collection name + end + end + return coll + end + + def self.ap_index_posts_by(all_posts, index_key) + return nil if all_posts.nil? + return all_posts if index_key.nil? + index = {} + all_posts.each do |post| + next if post.data.nil? + next if !post.data.has_key?(index_key) + next if post.data[index_key].nil? + next if post.data[index_key].size <= 0 + next if post.data[index_key].to_s.strip.length == 0 + + # Only tags and categories come as premade arrays, locale does not, so convert any data + # elements that are strings into arrays + post_data = post.data[index_key] + if post_data.is_a?(String) + post_data = post_data.split(/;|,|\s/) + end + + post_data.each do |key| + key = key.strip + # If the key is a delimetered list of values + # (meaning the user didn't use an array but a string with commas) + key.split(/;|,/).each do |raw_k_split| + k_split = raw_k_split.to_s.downcase.strip #Clean whitespace and junk + if !index.has_key?(k_split) + # Need to store the original key value here so that I can present it to the users as a page variable they can use (unmodified, e.g. tags not being 'sci-fi' but "Sci-Fi") + # Also, only interested in storing all the keys not the pages in this case + index[k_split.to_s] = [k_split.to_s, raw_k_split.to_s] + end + end + end + end + return index + end # function index_posts_by + + end # class Utils + + end # module PaginateV2 +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/compatibilityUtils.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/compatibilityUtils.rb new file mode 100644 index 000000000000..aabc3d06f0aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/compatibilityUtils.rb @@ -0,0 +1,121 @@ +module Jekyll + module PaginateV2::Generator + + class CompatibilityPaginationPage < Page + def initialize(site, base, dir, template_path) + @site = site + @base = base + @dir = dir + @template = template_path + @name = 'index.html' + + templ_dir = File.dirname(template_path) + templ_file = File.basename(template_path) + + # Path is only used by the convertible module and accessed below when calling read_yaml + # in our case we have the path point to the original template instead of our faux new pagination page + @path = if site.in_theme_dir(base) == base # we're in a theme + site.in_theme_dir(base, templ_dir, templ_file) + else + site.in_source_dir(base, templ_dir, templ_file) + end + + self.process(@name) + self.read_yaml(templ_dir, templ_file) + + data.default_proc = proc do |_, key| + site.frontmatter_defaults.find(File.join(templ_dir, templ_file), type, key) + end + + end + end # class CompatibilityPaginationPage + + # + # Static utility functions that provide backwards compatibility with the old + # jekyll-paginate gem that this new version superseeds (this code is here to ensure) + # that sites still running the old gem work without problems + # (REMOVE AFTER 2018-01-01) + # + # THIS CLASS IS ADAPTED FROM THE ORIGINAL IMPLEMENTATION AND WILL BE REMOVED, THERE ARE DELIBERATELY NO TESTS FOR THIS CLASS + # + class CompatibilityUtils + + # Public: Find the Jekyll::Page which will act as the pager template + # + # Returns the Jekyll::Page which will act as the pager template + def self.template_page(site_pages, config_source, config_paginate_path) + site_pages.select do |page| + CompatibilityUtils.pagination_candidate?(config_source, config_paginate_path, page) + end.sort do |one, two| + two.path.size <=> one.path.size + end.first + end + + # Static: Determine if a page is a possible candidate to be a template page. + # Page's name must be `index.html` and exist in any of the directories + # between the site source and `paginate_path`. + def self.pagination_candidate?(config_source, config_paginate_path, page) + page_dir = File.dirname(File.expand_path(Utils.remove_leading_slash(page.path), config_source)) + paginate_path = Utils.remove_leading_slash(config_paginate_path) + paginate_path = File.expand_path(paginate_path, config_source) + page.name == 'index.html' && CompatibilityUtils.in_hierarchy(config_source, page_dir, File.dirname(paginate_path)) + end + + # Determine if the subdirectories of the two paths are the same relative to source + # + # source - the site source + # page_dir - the directory of the Jekyll::Page + # paginate_path - the absolute paginate path (from root of FS) + # + # Returns whether the subdirectories are the same relative to source + def self.in_hierarchy(source, page_dir, paginate_path) + return false if paginate_path == File.dirname(paginate_path) + return false if paginate_path == Pathname.new(source).parent + page_dir == paginate_path || + CompatibilityUtils.in_hierarchy(source, page_dir, File.dirname(paginate_path)) + end + + # Paginates the blog's posts. Renders the index.html file into paginated + # directories, e.g.: page2/index.html, page3/index.html, etc and adds more + # site-wide data. + # + def self.paginate(legacy_config, all_posts, page, page_add_lambda ) + pages = Utils.calculate_number_of_pages(all_posts, legacy_config['per_page'].to_i) + (1..pages).each do |num_page| + pager = Paginator.new( legacy_config['per_page'], page.url, legacy_config['permalink'], all_posts, num_page, pages, '', '' ) + if num_page > 1 + template_full_path = File.join(page.site.source, page.path) + template_dir = File.dirname(page.path) + newpage = CompatibilityPaginationPage.new(page.site, page.site.source, template_dir, template_full_path) + newpage.pager = pager + newpage.dir = CompatibilityUtils.paginate_path(page.url, num_page, legacy_config['permalink']) + newpage.data['autogen'] = "jekyll-paginate-v2" # Signals that this page is automatically generated by the pagination logic + page_add_lambda.call(newpage) + else + page.pager = pager + end + end + end + + # Static: Return the pagination path of the page + # + # site - the Jekyll::Site object + # cur_page_nr - the pagination page number + # config - the current configuration in use + # + # Returns the pagination path as a string + def self.paginate_path(template_url, cur_page_nr, permalink_format) + return nil if cur_page_nr.nil? + return template_url if cur_page_nr <= 1 + if permalink_format.include?(":num") + permalink_format = Utils.format_page_number(permalink_format, cur_page_nr) + else + raise ArgumentError.new("Invalid pagination path: '#{permalink_format}'. It must include ':num'.") + end + + Utils.ensure_leading_slash(permalink_format) + end #function paginate_path + + end # class CompatibilityUtils + end # module PaginateV2 +end # module Jekyll \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/defaults.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/defaults.rb new file mode 100644 index 000000000000..f67ca3776e03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/defaults.rb @@ -0,0 +1,27 @@ +module Jekyll + module PaginateV2::Generator + + # The default configuration for the Paginator + DEFAULT = { + 'enabled' => false, + 'collection' => 'posts', + 'offset' => 0, # Supports skipping x number of posts from the beginning of the post list + 'per_page' => 10, + 'permalink' => '/page:num/', # Supports :num as customizable elements + 'title' => ':title - page :num', # Supports :num as customizable elements + 'page_num' => 1, + 'sort_reverse' => false, + 'sort_field' => 'date', + 'limit' => 0, # Limit how many content objects to paginate (default: 0, means all) + 'trail' => { + 'before' => 0, # Limits how many links to show before the current page in the pagination trail (0, means off, default: 0) + 'after' => 0, # Limits how many links to show after the current page in the pagination trail (0 means off, default: 0) + }, + 'indexpage' => nil, # The default name of the index pages + 'extension' => 'html', # The default extension for the output pages (ignored if indexpage is nil) + 'debug' => false, # Turns on debug output for the gem + 'legacy' => false # Internal value, do not use (will be removed after 2018-01-01) + } + + end # module PaginateV2 +end # module Jekyll \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationGenerator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationGenerator.rb new file mode 100644 index 000000000000..762e6b0993fe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationGenerator.rb @@ -0,0 +1,145 @@ +module Jekyll + module PaginateV2::Generator + + # + # The main entry point into the generator, called by Jekyll + # this function extracts all the necessary information from the jekyll end and passes it into the pagination + # logic. Additionally it also contains all site specific actions that the pagination logic needs access to + # (such as how to create new pages) + # + class PaginationGenerator < Generator + # This generator is safe from arbitrary code execution. + safe true + + # This generator should be passive with regard to its execution + priority :lowest + + # Generate paginated pages if necessary (Default entry point) + # site - The Site. + # + # Returns nothing. + def generate(site) + #begin + # Generate the AutoPages first + PaginateV2::AutoPages.create_autopages(site) + + # Retrieve and merge the pagination configuration from the site yml file + default_config = Jekyll::Utils.deep_merge_hashes(DEFAULT, site.config['pagination'] || {}) + + # Compatibility Note: (REMOVE AFTER 2018-01-01) + # If the legacy paginate logic is configured then read those values and merge with config + if !site.config['paginate'].nil? + Jekyll.logger.info "Pagination:","Legacy paginate configuration settings detected and will be used." + # You cannot run both the new code and the old code side by side + if !site.config['pagination'].nil? + err_msg = "The new jekyll-paginate-v2 and the old jekyll-paginate logic cannot both be configured in the site config at the same time. Please disable the old 'paginate:' config settings by either omitting the values or setting them to 'paginate:off'." + Jekyll.logger.error err_msg + raise ArgumentError.new(err_msg) + end + + default_config['per_page'] = site.config['paginate'].to_i + default_config['legacy_source'] = site.config['source'] + if !site.config['paginate_path'].nil? + default_config['permalink'] = site.config['paginate_path'].to_s + end + # In case of legacy, enable pagination by default + default_config['enabled'] = true + default_config['legacy'] = true + end # Compatibility END (REMOVE AFTER 2018-01-01) + + # If disabled then simply quit + if !default_config['enabled'] + Jekyll.logger.info "Pagination:","Disabled in site.config." + return + end + + # Handle deprecation of settings and features + if( !default_config['title_suffix' ].nil? ) + Jekyll::Deprecator.deprecation_message "Pagination: The 'title_suffix' configuration has been deprecated. Please use 'title'. See https://github.com/sverrirs/jekyll-paginate-v2/blob/master/README-GENERATOR.md#site-configuration" + end + + Jekyll.logger.debug "Pagination:","Starting" + + ################ 0 #################### + # Get all pages in the site (this will be used to find the pagination templates) + all_pages = site.pages + + # Get the default title of the site (used as backup when there is no title available for pagination) + site_title = site.config['title'] + + ################ 1 #################### + # Specify the callback function that returns the correct docs/posts based on the collection name + # "posts" are just another collection in Jekyll but a specialized version that require timestamps + # This collection is the default and if the user doesn't specify a collection in their front-matter then that is the one we load + # If the collection is not found then empty array is returned + collection_by_name_lambda = lambda do |collection_name| + coll = [] + if collection_name == "all" + # the 'all' collection_name is a special case and includes all collections in the site (except posts!!) + # this is useful when you want to list items across multiple collections + site.collections.each do |coll_name, coll_data| + if( !coll_data.nil? && coll_name != 'posts') + coll += coll_data.docs.select { |doc| !doc.data.has_key?('pagination') } # Exclude all pagination pages + end + end + else + # Just the one collection requested + if !site.collections.has_key?(collection_name) + return [] + end + + coll = site.collections[collection_name].docs.select { |doc| !doc.data.has_key?('pagination') } # Exclude all pagination pages + end + return coll + end + + ################ 2 #################### + # Create the proc that constructs the real-life site page + # This is necessary to decouple the code from the Jekyll site object + page_add_lambda = lambda do | newpage | + site.pages << newpage # Add the page to the site so that it is generated correctly + return newpage # Return the site to the calling code + end + + ################ 2.5 #################### + # lambda that removes a page from the site pages list + page_remove_lambda = lambda do | page_to_remove | + site.pages.delete_if {|page| page == page_to_remove } + end + + ################ 3 #################### + # Create a proc that will delegate logging + # Decoupling Jekyll specific logging + logging_lambda = lambda do | message, type="info" | + if type == 'debug' + Jekyll.logger.debug "Pagination:","#{message}" + elsif type == 'error' + Jekyll.logger.error "Pagination:", "#{message}" + elsif type == 'warn' + Jekyll.logger.warn "Pagination:", "#{message}" + else + Jekyll.logger.info "Pagination:", "#{message}" + end + end + + ################ 4 #################### + # Now create and call the model with the real-life page creation proc and site data + model = PaginationModel.new(logging_lambda, page_add_lambda, page_remove_lambda, collection_by_name_lambda) + if( default_config['legacy'] ) #(REMOVE AFTER 2018-01-01) + Jekyll.logger.warn "Pagination:", "You are running jekyll-paginate backwards compatible pagination logic. Please ignore all earlier warnings displayed related to the old jekyll-paginate gem." + all_posts = site.site_payload['site']['posts'].reject { |post| post['hidden'] } + model.run_compatability(default_config, all_pages, site_title, all_posts) #(REMOVE AFTER 2018-01-01) + else + count = model.run(default_config, all_pages, site_title) + Jekyll.logger.info "Pagination:", "Complete, processed #{count} pagination page(s)" + end + + #rescue => ex + # puts ex.backtrace + # raise + #end + end # function generate + end # class PaginationGenerator + + end # module PaginateV2 +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationIndexer.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationIndexer.rb new file mode 100644 index 000000000000..a864c28f6fbc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationIndexer.rb @@ -0,0 +1,93 @@ +module Jekyll + module PaginateV2::Generator + + # + # Performs indexing of the posts or collection documents + # as well as filtering said collections when requested by the defined filters. + class PaginationIndexer + # + # Create a hash index for all post based on a key in the post.data table + # + def self.index_posts_by(all_posts, index_key) + return nil if all_posts.nil? + return all_posts if index_key.nil? + index = {} + all_posts.each do |post| + next if post.data.nil? + next if !post.data.has_key?(index_key) + next if post.data[index_key].nil? + next if post.data[index_key].size <= 0 + next if post.data[index_key].to_s.strip.length == 0 + + # Only tags and categories come as premade arrays, locale does not, so convert any data + # elements that are strings into arrays + post_data = post.data[index_key] + if post_data.is_a?(String) + post_data = post_data.split(/;|,|\s/) + end + + post_data.each do |key| + key = key.to_s.downcase.strip + # If the key is a delimetered list of values + # (meaning the user didn't use an array but a string with commas) + key.split(/;|,/).each do |k_split| + k_split = k_split.to_s.downcase.strip #Clean whitespace and junk + if !index.has_key?(k_split) + index[k_split.to_s] = [] + end + index[k_split.to_s] << post + end + end + end + return index + end # function index_posts_by + + # + # Creates an intersection (only returns common elements) + # between multiple arrays + # + def self.intersect_arrays(first, *rest) + return nil if first.nil? + return nil if rest.nil? + + intersect = first + rest.each do |item| + return [] if item.nil? + intersect = intersect & item + end + return intersect + end #function intersect_arrays + + # + # Filters posts based on a keyed source_posts hash of indexed posts and performs a intersection of + # the two sets. Returns only posts that are common between all collections + # + def self.read_config_value_and_filter_posts(config, config_key, posts, source_posts) + return nil if posts.nil? + return nil if source_posts.nil? # If the source is empty then simply don't do anything + return posts if config.nil? + return posts if !config.has_key?(config_key) + return posts if config[config_key].nil? + + # Get the filter values from the config (this is the cat/tag/locale values that should be filtered on) + config_value = config[config_key] + + # If we're dealing with a delimitered string instead of an array then let's be forgiving + if( config_value.is_a?(String)) + config_value = config_value.split(/;|,/) + end + + # Now for all filter values for the config key, let's remove all items from the posts that + # aren't common for all collections that the user wants to filter on + config_value.each do |key| + key = key.to_s.downcase.strip + posts = PaginationIndexer.intersect_arrays(posts, source_posts[key]) + end + + # The fully filtered final post list + return posts + end #function read_config_value_and_filter_posts + end #class PaginationIndexer + + end #module PaginateV2 +end #module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationModel.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationModel.rb new file mode 100644 index 000000000000..fb265be4d918 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationModel.rb @@ -0,0 +1,373 @@ +module Jekyll + module PaginateV2::Generator + + # + # The main model for the pagination, handles the orchestration of the pagination and calling all the necessary bits and bobs needed :) + # + class PaginationModel + + @debug = false # is debug output enabled? + @logging_lambda = nil # The lambda to use for logging + @page_add_lambda = nil # The lambda used to create pages and add them to the site + @page_remove_lambda = nil # Lambda to remove a page from the site.pages collection + @collection_by_name_lambda = nil # Lambda to get all documents/posts in a particular collection (by name) + + # ctor + def initialize(logging_lambda, page_add_lambda, page_remove_lambda, collection_by_name_lambda) + @logging_lambda = logging_lambda + @page_add_lambda = page_add_lambda + @page_remove_lambda = page_remove_lambda + @collection_by_name_lambda = collection_by_name_lambda + end + + + def run(default_config, site_pages, site_title) + # By default if pagination is enabled we attempt to find all index.html pages in the site + templates = self.discover_paginate_templates(site_pages) + if( templates.size.to_i <= 0 ) + @logging_lambda.call "Is enabled, but I couldn't find any pagination page. Skipping pagination. "+ + "Pages must have 'pagination: enabled: true' in their front-matter for pagination to work.", "warn" + return + end + + # Now for each template page generate the paginator for it + templates.each do |template| + # All pages that should be paginated need to include the pagination config element + if template.data['pagination'].is_a?(Hash) + template_config = Jekyll::Utils.deep_merge_hashes(default_config, template.data['pagination'] || {}) + + # Handling deprecation of configuration values + self._fix_deprecated_config_features(template_config) + + @debug = template_config['debug'] # Is debugging enabled on the page level + + self._debug_print_config_info(template_config, template.path) + + # Only paginate the template if it is explicitly enabled + # requiring this makes the logic simpler as I don't need to determine which index pages + # were generated automatically and which weren't + if( template_config['enabled'] ) + if !@debug + @logging_lambda.call "found page: "+template.path, 'debug' + end + + # Request all documents in all collections that the user has requested + all_posts = self.get_docs_in_collections(template_config['collection']) + + # Create the necessary indexes for the posts + all_categories = PaginationIndexer.index_posts_by(all_posts, 'categories') + all_categories['posts'] = all_posts; # Populate a category for all posts (this is here for backward compatibility, do not use this as it will be decommissioned 2018-01-01) + # (this is a default and must not be used in the category system) + all_tags = PaginationIndexer.index_posts_by(all_posts, 'tags') + all_locales = PaginationIndexer.index_posts_by(all_posts, 'locale') + + # TODO: NOTE!!! This whole request for posts and indexing results could be cached to improve performance, leaving like this for now during testing + + # Now construct the pagination data for this template page + self.paginate(template, template_config, site_title, all_posts, all_tags, all_categories, all_locales) + end + end + end #for + + # Return the total number of templates found + return templates.size.to_i + end # function run + + # + # This function is here to retain the old compatability logic with the jekyll-paginate gem + # no changes should be made to this function and it should be retired and deleted after 2018-01-01 + # (REMOVE AFTER 2018-01-01) + # + def run_compatability(legacy_config, site_pages, site_title, all_posts) + + # Decomissioning error + if( date = Date.strptime("20180101","%Y%m%d") <= Date.today ) + raise ArgumentError.new("Legacy jekyll-paginate configuration compatibility mode has expired. Please upgrade to jekyll-paginate-v2 configuration.") + end + + # Two month warning or general notification + if( date = Date.strptime("20171101","%Y%m%d") <= Date.today ) + @logging_lambda.call "Legacy pagination logic will stop working on Jan 1st 2018, update your configs before that time.", "warn" + else + @logging_lambda.call "Detected legacy jekyll-paginate logic running. "+ + "Please update your configs to use the jekyll-paginate-v2 logic. This compatibility function "+ + "will stop working after Jan 1st 2018 and your site build will throw an error.", "warn" + end + + if template = CompatibilityUtils.template_page(site_pages, legacy_config['legacy_source'], legacy_config['permalink']) + CompatibilityUtils.paginate(legacy_config, all_posts, template, @page_add_lambda) + else + @logging_lambda.call "Legacy pagination is enabled, but I couldn't find " + + "an index.html page to use as the pagination page. Skipping pagination.", "warn" + end + end # function run_compatability (REMOVE AFTER 2018-01-01) + + # Returns the combination of all documents in the collections that are specified + # raw_collection_names can either be a list of collections separated by a ',' or ' ' or a single string + def get_docs_in_collections(raw_collection_names) + if raw_collection_names.is_a?(String) + collection_names = raw_collection_names.split(/;|,|\s/) + else + collection_names = raw_collection_names + end + + docs = [] + # Now for each of the collections get the docs + collection_names.each do |coll_name| + # Request all the documents for the collection in question, and join it with the total collection + docs += @collection_by_name_lambda.call(coll_name.downcase.strip) + end + + # Hidden documents should not not be processed anywhere. + docs = docs.reject { |doc| doc['hidden'] } + + return docs + end + + def _fix_deprecated_config_features(config) + keys_to_delete = [] + + # As of v1.5.1 the title_suffix is deprecated and 'title' should be used + # but only if title has not been defined already! + if( !config['title_suffix'].nil? ) + if( config['title'].nil? ) + config['title'] = ":title" + config['title_suffix'].to_s # Migrate the old key to title + end + keys_to_delete << "title_suffix" # Always remove the depricated key if found + end + + # Delete the depricated keys + config.delete_if{ |k,| keys_to_delete.include? k } + end + + def _debug_print_config_info(config, page_path) + r = 20 + f = "Pagination: ".rjust(20) + # Debug print the config + if @debug + puts f + "----------------------------" + puts f + "Page: "+page_path.to_s + puts f + " Active configuration" + puts f + " Enabled: ".ljust(r) + config['enabled'].to_s + puts f + " Items per page: ".ljust(r) + config['per_page'].to_s + puts f + " Permalink: ".ljust(r) + config['permalink'].to_s + puts f + " Title: ".ljust(r) + config['title'].to_s + puts f + " Limit: ".ljust(r) + config['limit'].to_s + puts f + " Sort by: ".ljust(r) + config['sort_field'].to_s + puts f + " Sort reverse: ".ljust(r) + config['sort_reverse'].to_s + + puts f + " Active Filters" + puts f + " Collection: ".ljust(r) + config['collection'].to_s + puts f + " Offset: ".ljust(r) + config['offset'].to_s + puts f + " Category: ".ljust(r) + (config['category'].nil? || config['category'] == "posts" ? "[Not set]" : config['category'].to_s) + puts f + " Tag: ".ljust(r) + (config['tag'].nil? ? "[Not set]" : config['tag'].to_s) + puts f + " Locale: ".ljust(r) + (config['locale'].nil? ? "[Not set]" : config['locale'].to_s) + + if config['legacy'] + puts f + " Legacy Paginate Code Enabled" + puts f + " Legacy Paginate: ".ljust(r) + config['per_page'].to_s + puts f + " Legacy Source: ".ljust(r) + config['legacy_source'].to_s + puts f + " Legacy Path: ".ljust(r) + config['paginate_path'].to_s + end + end + end + + def _debug_print_filtering_info(filter_name, before_count, after_count) + # Debug print the config + if @debug + puts "Pagination: ".rjust(20) + " Filtering by: "+filter_name.to_s.ljust(9) + " " + before_count.to_s.rjust(3) + " => " + after_count.to_s + end + end + + # + # Rolls through all the pages passed in and finds all pages that have pagination enabled on them. + # These pages will be used as templates + # + # site_pages - All pages in the site + # + def discover_paginate_templates(site_pages) + candidates = [] + site_pages.select do |page| + # If the page has the enabled config set, supports any type of file name html or md + if page.data['pagination'].is_a?(Hash) && page.data['pagination']['enabled'] + candidates << page + end + end + return candidates + end # function discover_paginate_templates + + # Paginates the blog's posts. Renders the index.html file into paginated + # directories, e.g.: page2/index.html, page3/index.html, etc and adds more + # site-wide data. + # + # site - The Site. + # template - The index.html Page that requires pagination. + # config - The configuration settings that should be used + # + def paginate(template, config, site_title, all_posts, all_tags, all_categories, all_locales) + # By default paginate on all posts in the site + using_posts = all_posts + + # Now start filtering out any posts that the user doesn't want included in the pagination + before = using_posts.size.to_i + using_posts = PaginationIndexer.read_config_value_and_filter_posts(config, 'category', using_posts, all_categories) + self._debug_print_filtering_info('Category', before, using_posts.size.to_i) + before = using_posts.size.to_i + using_posts = PaginationIndexer.read_config_value_and_filter_posts(config, 'tag', using_posts, all_tags) + self._debug_print_filtering_info('Tag', before, using_posts.size.to_i) + before = using_posts.size.to_i + using_posts = PaginationIndexer.read_config_value_and_filter_posts(config, 'locale', using_posts, all_locales) + self._debug_print_filtering_info('Locale', before, using_posts.size.to_i) + + # Apply sorting to the posts if configured, any field for the post is available for sorting + if config['sort_field'] + sort_field = config['sort_field'].to_s + + # There is an issue in Jekyll related to lazy initialized member variables that causes iterators to + # break when accessing an uninitialized value during iteration. This happens for document.rb when the <=> compaison function + # is called (as this function calls the 'date' field which for drafts are not initialized.) + # So to unblock this common issue for the date field I simply iterate once over every document and initialize the .date field explicitly + if @debug + puts "Pagination: ".rjust(20) + "Rolling through the date fields for all documents" + end + using_posts.each do |u_post| + if u_post.respond_to?('date') + tmp_date = u_post.date + if( !tmp_date || tmp_date.nil? ) + if @debug + puts "Pagination: ".rjust(20) + "Explicitly assigning date for doc: #{u_post.data['title']} | #{u_post.path}" + end + u_post.date = File.mtime(u_post.path) + end + end + end + + using_posts.sort!{ |a,b| Utils.sort_values(Utils.sort_get_post_data(a.data, sort_field), Utils.sort_get_post_data(b.data, sort_field)) } + + # Remove the first x entries + offset_post_count = [0, config['offset'].to_i].max + using_posts.pop(offset_post_count) + + if config['sort_reverse'] + using_posts.reverse! + end + end + + # Calculate the max number of pagination-pages based on the configured per page value + total_pages = Utils.calculate_number_of_pages(using_posts, config['per_page']) + + # If a upper limit is set on the number of total pagination pages then impose that now + if config['limit'] && config['limit'].to_i > 0 && config['limit'].to_i < total_pages + total_pages = config['limit'].to_i + end + + #### BEFORE STARTING REMOVE THE TEMPLATE PAGE FROM THE SITE LIST! + @page_remove_lambda.call( template ) + + # list of all newly created pages + newpages = [] + + # Consider the default index page name and extension + indexPageName = config['indexpage'].nil? ? '' : config['indexpage'].split('.')[0] + indexPageExt = config['extension'].nil? ? '' : Utils.ensure_leading_dot(config['extension']) + indexPageWithExt = indexPageName + indexPageExt + + # In case there are no (visible) posts, generate the index file anyway + total_pages = 1 if total_pages.zero? + + # Now for each pagination page create it and configure the ranges for the collection + # This .pager member is a built in thing in Jekyll and defines the paginator implementation + # Simpy override to use mine + (1..total_pages).each do |cur_page_nr| + + # 1. Create the in-memory page + # External Proc call to create the actual page for us (this is passed in when the pagination is run) + newpage = PaginationPage.new( template, cur_page_nr, total_pages, indexPageWithExt ) + + # 2. Create the url for the in-memory page (calc permalink etc), construct the title, set all page.data values needed + paginated_page_url = config['permalink'] + first_index_page_url = "" + if template.data['permalink'] + first_index_page_url = Utils.ensure_trailing_slash(template.data['permalink']) + else + first_index_page_url = Utils.ensure_trailing_slash(template.dir) + end + paginated_page_url = File.join(first_index_page_url, paginated_page_url) + + # 3. Create the pager logic for this page, pass in the prev and next page numbers, assign pager to in-memory page + newpage.pager = Paginator.new( config['per_page'], first_index_page_url, paginated_page_url, using_posts, cur_page_nr, total_pages, indexPageName, indexPageExt) + + # Create the url for the new page, make sure we prepend any permalinks that are defined in the template page before + if newpage.pager.page_path.end_with? '/' + newpage.set_url(File.join(newpage.pager.page_path, indexPageWithExt)) + elsif newpage.pager.page_path.end_with? indexPageExt + # Support for direct .html files + newpage.set_url(newpage.pager.page_path) + else + # Support for extensionless permalinks + newpage.set_url(newpage.pager.page_path+indexPageExt) + end + + if( template.data['permalink'] ) + newpage.data['permalink'] = newpage.pager.page_path + end + + # Transfer the title across to the new page + if( !template.data['title'] ) + tmp_title = site_title + else + tmp_title = template.data['title'] + end + # If the user specified a title suffix to be added then let's add that to all the pages except the first + if( cur_page_nr > 1 && config.has_key?('title') ) + newpage.data['title'] = "#{Utils.format_page_title(config['title'], tmp_title, cur_page_nr, total_pages)}" + else + newpage.data['title'] = tmp_title + end + + # Signals that this page is automatically generated by the pagination logic + # (we don't do this for the first page as it is there to mask the one we removed) + if cur_page_nr > 1 + newpage.data['autogen'] = "jekyll-paginate-v2" + end + + # Add the page to the site + @page_add_lambda.call( newpage ) + + # Store the page in an internal list for later referencing if we need to generate a pagination number path later on + newpages << newpage + end #each.do total_pages + + # Now generate the pagination number path, e.g. so that the users can have a prev 1 2 3 4 5 next structure on their page + # simplest is to include all of the links to the pages preceeding the current one + # (e.g for page 1 you get the list 2, 3, 4.... and for page 2 you get the list 3,4,5...) + if( config['trail'] && !config['trail'].nil? && newpages.size.to_i > 1 ) + trail_before = [config['trail']['before'].to_i, 0].max + trail_after = [config['trail']['after'].to_i, 0].max + trail_length = trail_before + trail_after + 1 + + if( trail_before > 0 || trail_after > 0 ) + newpages.select do | npage | + idx_start = [ npage.pager.page - trail_before - 1, 0].max # Selecting the beginning of the trail + idx_end = [idx_start + trail_length, newpages.size.to_i].min # Selecting the end of the trail + + # Always attempt to maintain the max total of <trail_length> pages in the trail (it will look better if the trail doesn't shrink) + if( idx_end - idx_start < trail_length ) + # Attempt to pad the beginning if we have enough pages + idx_start = [idx_start - ( trail_length - (idx_end - idx_start) ), 0].max # Never go beyond the zero index + end + + # Convert the newpages array into a two dimensional array that has [index, page_url] as items + #puts( "Trail created for page #{npage.pager.page} (idx_start:#{idx_start} idx_end:#{idx_end})") + npage.pager.page_trail = newpages[idx_start...idx_end].each_with_index.map {|ipage,idx| PageTrail.new(idx_start+idx+1, ipage.pager.page_path, ipage.data['title'])} + #puts( npage.pager.page_trail ) + end #newpages.select + end #if trail_before / trail_after + end # if config['trail'] + + end # function paginate + + end # class PaginationV2 + + end # module PaginateV2 +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationPage.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationPage.rb new file mode 100644 index 000000000000..279073772ba5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginationPage.rb @@ -0,0 +1,49 @@ +module Jekyll + module PaginateV2::Generator + + # + # This page handles the creation of the fake pagination pages based on the original page configuration + # The code does the same things as the default Jekyll/page.rb code but just forces the code to look + # into the template instead of the (currently non-existing) pagination page. + # + # This page exists purely in memory and is not read from disk + # + class PaginationPage < Page + def initialize(page_to_copy, cur_page_nr, total_pages, index_pageandext) + @site = page_to_copy.site + @base = '' + @url = '' + @name = index_pageandext.nil? ? 'index.html' : index_pageandext + + self.process(@name) # Creates the basename and ext member values + + # Only need to copy the data part of the page as it already contains the layout information + self.data = Jekyll::Utils.deep_merge_hashes( page_to_copy.data, {} ) + if !page_to_copy.data['autopage'] + self.content = page_to_copy.content + else + # If the page is an auto page then migrate the necessary autopage info across into the + # new pagination page (so that users can get the correct keys etc) + if( page_to_copy.data['autopage'].has_key?('display_name') ) + self.data['autopages'] = Jekyll::Utils.deep_merge_hashes( page_to_copy.data['autopage'], {} ) + end + end + + # Store the current page and total page numbers in the pagination_info construct + self.data['pagination_info'] = {"curr_page" => cur_page_nr, 'total_pages' => total_pages } + + # Perform some validation that is also performed in Jekyll::Page + validate_data! page_to_copy.path + validate_permalink! page_to_copy.path + + # Trigger a page event + #Jekyll::Hooks.trigger :pages, :post_init, self + end + + def set_url(url_value) + @url = url_value + end + end # class PaginationPage + + end # module PaginateV2 +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginator.rb new file mode 100644 index 000000000000..02c0a3229c6b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/paginator.rb @@ -0,0 +1,111 @@ +module Jekyll + module PaginateV2::Generator + + # + # Handles the preparation of all the posts based on the current page index + # + class Paginator + attr_reader :page, :per_page, :posts, :total_posts, :total_pages, + :previous_page, :previous_page_path, :next_page, :next_page_path, :page_path, :page_trail, + :first_page, :first_page_path, :last_page, :last_page_path + + def page_trail + @page_trail + end + + def page_trail=(page_array) + @page_trail = page_array + end + + # Initialize a new Paginator. + # + def initialize(config_per_page, first_index_page_url, paginated_page_url, posts, cur_page_nr, num_pages, default_indexpage, default_ext) + @page = cur_page_nr + @per_page = config_per_page.to_i + @total_pages = num_pages + + if @page > @total_pages + raise RuntimeError, "page number can't be greater than total pages: #{@page} > #{@total_pages}" + end + + init = (@page - 1) * @per_page + offset = (init + @per_page - 1) >= posts.size ? posts.size : (init + @per_page - 1) + + # Ensure that the current page has correct extensions if needed + this_page_url = Utils.ensure_full_path(@page == 1 ? first_index_page_url : paginated_page_url, + !default_indexpage || default_indexpage.length == 0 ? 'index' : default_indexpage, + !default_ext || default_ext.length == 0 ? '.html' : default_ext) + + # To support customizable pagination pages we attempt to explicitly append the page name to + # the url incase the user is using extensionless permalinks. + if default_indexpage && default_indexpage.length > 0 + # Adjust first page url + first_index_page_url = Utils.ensure_full_path(first_index_page_url, default_indexpage, default_ext) + # Adjust the paginated pages as well + paginated_page_url = Utils.ensure_full_path(paginated_page_url, default_indexpage, default_ext) + end + + @total_posts = posts.size + @posts = posts[init..offset] + @page_path = Utils.format_page_number(this_page_url, cur_page_nr, @total_pages) + + @previous_page = @page != 1 ? @page - 1 : nil + @previous_page_path = @page == 1 ? nil : + @page == 2 ? Utils.format_page_number(first_index_page_url, 1, @total_pages) : + Utils.format_page_number(paginated_page_url, @previous_page, @total_pages) + @next_page = @page != @total_pages ? @page + 1 : nil + @next_page_path = @page != @total_pages ? Utils.format_page_number(paginated_page_url, @next_page, @total_pages) : nil + + @first_page = 1 + @first_page_path = Utils.format_page_number(first_index_page_url, 1, @total_pages) + @last_page = @total_pages + @last_page_path = Utils.format_page_number(paginated_page_url, @total_pages, @total_pages) + end + + # Convert this Paginator's data to a Hash suitable for use by Liquid. + # + # Returns the Hash representation of this Paginator. + def to_liquid + { + 'per_page' => per_page, + 'posts' => posts, + 'total_posts' => total_posts, + 'total_pages' => total_pages, + 'page' => page, + 'page_path' => page_path, + 'previous_page' => previous_page, + 'previous_page_path' => previous_page_path, + 'next_page' => next_page, + 'next_page_path' => next_page_path, + 'first_page' => first_page, + 'first_page_path' => first_page_path, + 'last_page' => last_page, + 'last_page_path' => last_page_path, + 'page_trail' => page_trail + } + end + + end # class Paginator + + # Small utility class that handles individual pagination trails + # and makes them easier to work with in Liquid + class PageTrail + attr_reader :num, :path, :title + + def initialize( num, path, title ) + @num = num + @path = path + @title = title + end #func initialize + + def to_liquid + { + 'num' => num, + 'path' => path, + 'title' => title + } + end + end #class PageTrail + + end # module PaginateV2 +end # module Jekyll \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/utils.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/utils.rb new file mode 100644 index 000000000000..f0360e1f8bf9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/generator/utils.rb @@ -0,0 +1,141 @@ +module Jekyll + module PaginateV2::Generator + + # + # Static utility functions that are used in the code and + # don't belong in once place in particular + # + class Utils + + # Static: Calculate the number of pages. + # + # all_posts - The Array of all Posts. + # per_page - The Integer of entries per page. + # + # Returns the Integer number of pages. + def self.calculate_number_of_pages(all_posts, per_page) + (all_posts.size.to_f / per_page.to_i).ceil + end + + # Static: returns a fully formatted string with the current (:num) page number and maximum (:max) page count replaced if configured + # + def self.format_page_number(toFormat, cur_page_nr, total_page_count=nil) + s = toFormat.sub(':num', cur_page_nr.to_s) + if !total_page_count.nil? + s = s.sub(':max', total_page_count.to_s) + end + return s + end #function format_page_number + + # Static: returns a fully formatted string with the :title variable and the current (:num) page number and maximum (:max) page count replaced + # + def self.format_page_title(toFormat, title, cur_page_nr=nil, total_page_count=nil) + return format_page_number(toFormat.sub(':title', title.to_s), cur_page_nr, total_page_count) + end #function format_page_title + + # Static: Return a String version of the input which has a leading dot. + # If the input already has a dot in position zero, it will be + # returned unchanged. + # + # path - a String path + # + # Returns the path with a leading slash + def self.ensure_leading_dot(path) + path[0..0] == "." ? path : ".#{path}" + end + + # Static: Return a String version of the input which has a leading slash. + # If the input already has a forward slash in position zero, it will be + # returned unchanged. + # + # path - a String path + # + # Returns the path with a leading slash + def self.ensure_leading_slash(path) + path[0..0] == "/" ? path : "/#{path}" + end + + # Static: Return a String version of the input without a leading slash. + # + # path - a String path + # + # Returns the input without the leading slash + def self.remove_leading_slash(path) + path[0..0] == "/" ? path[1..-1] : path + end + + # Static: Return a String version of the input which has a trailing slash. + # If the input already has a forward slash at the end, it will be + # returned unchanged. + # + # path - a String path + # + # Returns the path with a trailing slash + def self.ensure_trailing_slash(path) + path[-1] == "/" ? path : "#{path}/" + end + + # + # Sorting routine used for ordering posts by custom fields. + # Handles Strings separately as we want a case-insenstive sorting + # + def self.sort_values(a, b) + if a.nil? && !b.nil? + return -1 + elsif !a.nil? && b.nil? + return 1 + end + + if a.is_a?(String) + return a.downcase <=> b.downcase + end + + if a.respond_to?('to_datetime') && b.respond_to?('to_datetime') + return a.to_datetime <=> b.to_datetime + end + + # By default use the built in sorting for the data type + return a <=> b + end + + # Retrieves the given sort field from the given post + # the sort_field variable can be a hierarchical value on the form "parent_field:child_field" repeated as many times as needed + # only the leaf child_field will be retrieved + def self.sort_get_post_data(post_data, sort_field) + + # Begin by splitting up the sort_field by (;,:.) + sort_split = sort_field.split(":") + sort_value = post_data + + sort_split.each do |r_key| + key = r_key.downcase.strip # Remove any erronious whitespace and convert to lower case + if !sort_value.has_key?(key) + return nil + end + # Work my way through the hash + sort_value = sort_value[key] + end + + # If the sort value is a hash then return nil else return the value + if( sort_value.is_a?(Hash) ) + return nil + else + return sort_value + end + end + + # Ensures that the passed in url has a index and extension applied + def self.ensure_full_path(url, default_index, default_ext) + if( url.end_with?('/')) + return url + default_index + default_ext + elsif !url.include?('.') + return url + default_index + end + # Default + return url + end + + end + + end # module PaginateV2 +end # module Jekyll diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/version.rb new file mode 100644 index 000000000000..a854efc95327 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/lib/jekyll-paginate-v2/version.rb @@ -0,0 +1,12 @@ +module Jekyll + module PaginateV2 + VERSION = "3.0.0" + # When modifying remember to issue a new tag command in git before committing, then push the new tag + # git tag -a v3.0.0 -m "Gem v3.0.0" + # git push origin --tags + # Yanking a published Gem + # gem yank jekyll-paginate-v2 -v VERSION + # Building gem + # gem build jekyll-paginate-v2.gemspec + end # module PaginateV2 +end # module Jekyll \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/defaults_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/defaults_spec.rb new file mode 100644 index 000000000000..5574af133ea7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/defaults_spec.rb @@ -0,0 +1,34 @@ +require_relative '../spec_helper.rb' + +module Jekyll::PaginateV2::Generator + describe "checking default config" do + + it "should always contain the following keys" do + DEFAULT.must_include 'enabled' + DEFAULT.must_include 'collection' + DEFAULT.must_include 'per_page' + DEFAULT.must_include 'permalink' + DEFAULT.must_include 'title' + DEFAULT.must_include 'page_num' + DEFAULT.must_include 'sort_reverse' + DEFAULT.must_include 'sort_field' + DEFAULT.must_include 'limit' + DEFAULT.must_include 'debug' + DEFAULT.size.must_be :>=, 10 + end + + it "should always contain the following key defaults" do + DEFAULT['enabled'].must_equal false + DEFAULT['collection'].must_equal 'posts' + DEFAULT['per_page'].must_equal 10 + DEFAULT['permalink'].must_equal '/page:num/' + DEFAULT['title'].must_equal ':title - page :num' + DEFAULT['page_num'].must_equal 1 + DEFAULT['sort_reverse'].must_equal false + DEFAULT['sort_field'].must_equal 'date' + DEFAULT['limit'].must_equal 0 + DEFAULT['debug'].must_equal false + end + + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/paginationPage_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/paginationPage_spec.rb new file mode 100644 index 000000000000..a47ed51ddb1e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/paginationPage_spec.rb @@ -0,0 +1,12 @@ +require_relative '../spec_helper.rb' + +module Jekyll::PaginateV2::Generator + describe "tesing pagination page implementation" do + + it "sould always read the template file into itself" do + # DUE TO THE JEKYLL:PAGE CLASS ACCESSING FILE IO DIRECTLY + # I AM UNABLE TO MOCK OUT THE FILE OPERATIONS TO CREATE UNIT TESTS FOR THIS CLASS :/ + end + + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/paginator_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/paginator_spec.rb new file mode 100644 index 000000000000..7558e3518ae8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/paginator_spec.rb @@ -0,0 +1,157 @@ +require_relative '../spec_helper.rb' + +module Jekyll::PaginateV2::Generator + describe Paginator do + + it "must include the necessary paginator attributes" do + + # config_per_page, first_index_page_url, paginated_page_url, posts, cur_page_nr, num_pages + pager = Paginator.new(10, "index.html", "/page:num/", [], 1, 10, 'index', '.html') + + # None of these accessors should throw errors, just run through them to test + val = pager.page + val = pager.per_page + val = pager.posts + val = pager.total_posts + val = pager.total_pages + val = pager.previous_page + val = pager.previous_page_path + val = pager.next_page + val = pager.next_page_path + + end + + it "must throw an error if the current page number is greater than the total pages" do + err = -> { pager = Paginator.new(10, "index.html", "/page:num/", [], 10, 8, 'index', '.html') }.must_raise RuntimeError + + # No error should be raised below + pager = Paginator.new(10, "index.html", "/page:num/", [], 8, 10, 'index', '.html') + end + + it "must trim the list of posts correctly based on the cur_page_nr and per_page" do + # Create a dummy list of posts that is easy to track + posts = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35'] + + # Initialize a pager with + # 5 posts per page + # at page 2 out of 5 pages + pager = Paginator.new(5, "index.html", "/page:num/", posts, 2, 5, '', '') + + pager.page.must_equal 2 + pager.per_page.must_equal 5 + pager.total_pages.must_equal 5 + + pager.total_posts.must_equal 35 + + pager.posts.size.must_equal 5 + pager.posts[0].must_equal '6' + pager.posts[4].must_equal '10' + + pager.previous_page.must_equal 1 + pager.previous_page_path.must_equal 'index.html' + pager.next_page.must_equal 3 + pager.next_page_path.must_equal '/page3/' + end + + it "must not create a previous page if we're at first page" do + # Create a dummy list of posts that is easy to track + posts = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35'] + + # Initialize a pager with + # 5 posts per page + # at page 2 out of 5 pages + pager = Paginator.new(5, "index.html", "/page:num/", posts, 1, 5, '', '') + + pager.page.must_equal 1 + pager.per_page.must_equal 5 + pager.total_pages.must_equal 5 + + pager.total_posts.must_equal 35 + + pager.posts.size.must_equal 5 + pager.posts[0].must_equal '1' + pager.posts[4].must_equal '5' + + pager.previous_page.must_be_nil + pager.previous_page_path.must_be_nil + pager.next_page.must_equal 2 + pager.next_page_path.must_equal '/page2/' + end + + it "must not create a next page if we're at the final page" do + # Create a dummy list of posts that is easy to track + posts = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35'] + + # Initialize a pager with + # 5 posts per page + # at page 2 out of 5 pages + pager = Paginator.new(5, "index.html", "/page:num/", posts, 5, 5, '', '') + + pager.page.must_equal 5 + pager.per_page.must_equal 5 + pager.total_pages.must_equal 5 + + pager.total_posts.must_equal 35 + + pager.posts.size.must_equal 5 + pager.posts[0].must_equal '21' + pager.posts[4].must_equal '25' + + pager.previous_page.must_equal 4 + pager.previous_page_path.must_equal '/page4/' + pager.next_page.must_be_nil + pager.next_page_path.must_be_nil + end + + it "must create the explicit index page and index extension when specified" do + # Create a dummy list of posts that is easy to track + posts = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35'] + + # Initialize a pager with + # 5 posts per page + # at page 2 out of 5 pages + pager = Paginator.new(5, "index.html", "/page:num/", posts, 2, 5, 'index', '.html') + + pager.page.must_equal 2 + pager.per_page.must_equal 5 + pager.total_pages.must_equal 5 + + pager.total_posts.must_equal 35 + + pager.posts.size.must_equal 5 + pager.posts[0].must_equal '6' + pager.posts[4].must_equal '10' + + pager.previous_page.must_equal 1 + pager.previous_page_path.must_equal 'index.html' + pager.next_page.must_equal 3 + pager.next_page_path.must_equal '/page3/index.html' + end + + it "must create the explicit index page and index extension when specified" do + # Create a dummy list of posts that is easy to track + posts = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35'] + + # Initialize a pager with + # 5 posts per page + # at page 2 out of 5 pages + pager = Paginator.new(5, "/", "/", posts, 2, 5, 'feed:num', '.json') + + pager.page.must_equal 2 + pager.per_page.must_equal 5 + pager.total_pages.must_equal 5 + + pager.total_posts.must_equal 35 + + pager.posts.size.must_equal 5 + pager.posts[0].must_equal '6' + pager.posts[4].must_equal '10' + + pager.previous_page.must_equal 1 + pager.previous_page_path.must_equal '/feed1.json' + pager.next_page.must_equal 3 + pager.next_page_path.must_equal '/feed3.json' + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/utils_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/utils_spec.rb new file mode 100644 index 000000000000..7b5c387b212d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/generator/utils_spec.rb @@ -0,0 +1,67 @@ +require_relative '../spec_helper.rb' + +module Jekyll::PaginateV2::Generator + describe Utils do + + it "should always replace num format with the specified number" do + Utils.format_page_number( ":num", 7).must_equal "7" + Utils.format_page_number( ":num", 13).must_equal "13" + Utils.format_page_number( ":num", -2).must_equal "-2" + Utils.format_page_number( ":num", 0).must_equal "0" + Utils.format_page_number( ":num", 1000).must_equal "1000" + end + + it "should always replace num format with the specified number and keep rest of formatting" do + Utils.format_page_number( "/page:num/", 7).must_equal "/page7/" + Utils.format_page_number( "/page:num/", 50).must_equal "/page50/" + Utils.format_page_number( "/page:num/", -5).must_equal "/page-5/" + + Utils.format_page_number( "/car/:num/", 1).must_equal "/car/1/" + Utils.format_page_number( "/car/:num", 1).must_equal "/car/1" + Utils.format_page_number( "car/:num", 1).must_equal "car/1" + Utils.format_page_number( "/car//:num", 1).must_equal "/car//1" + end + + it "make sure there is a leading slash in path" do + Utils.ensure_leading_slash("path/to/file/wow").must_equal "/path/to/file/wow" + Utils.ensure_leading_slash("/no/place/wow/").must_equal "/no/place/wow/" + Utils.ensure_leading_slash("/no").must_equal "/no" + Utils.ensure_leading_slash("no").must_equal "/no" + end + + it "make sure there is never a leading slash in path" do + Utils.remove_leading_slash("path/to/file/wow").must_equal "path/to/file/wow" + Utils.remove_leading_slash("/no/place/wow/").must_equal "no/place/wow/" + Utils.remove_leading_slash("/no").must_equal "no" + Utils.remove_leading_slash("no").must_equal "no" + end + + it "sort must sort strings lowercase" do + Utils.sort_values( "AARON", "Aaron").must_equal 0 + Utils.sort_values( "AARON", "aaron").must_equal 0 + Utils.sort_values( "aaron", "AARON").must_equal 0 + end + + it "when sorting by nested post data the values must be resolved fully" do + data = {'book'=>{ 'name' => { 'first'=> 'John', 'last'=> 'Smith'}, 'rank'=>20}} + Utils.sort_get_post_data(data, "book:rank").must_equal 20 + Utils.sort_get_post_data(data, "book:name:first").must_equal "John" + Utils.sort_get_post_data(data, "book:name:last").must_equal "Smith" + + Utils.sort_get_post_data(data, "book:name").must_be_nil + Utils.sort_get_post_data(data, "name").must_be_nil + Utils.sort_get_post_data(data, "book").must_be_nil + end + + it "should always replace max format with the specified number if specified" do + Utils.format_page_number( ":num-:max", 7, 16).must_equal "7-16" + Utils.format_page_number( ":num-:max", 13, 20).must_equal "13-20" + Utils.format_page_number( ":num-:max", -2, -4).must_equal "-2--4" + Utils.format_page_number( ":num_of_:max", 0, 10).must_equal "0_of_10" + Utils.format_page_number( ":num/:max", 1000, 2000).must_equal "1000/2000" + end + + + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/spec_helper.rb new file mode 100644 index 000000000000..e7f8f46a7661 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-paginate-v2-3.0.0/spec/spec_helper.rb @@ -0,0 +1,13 @@ +require 'minitest/spec' +require 'minitest/autorun' + +require 'jekyll' +require_relative '../lib/jekyll-paginate-v2/version' +require_relative '../lib/jekyll-paginate-v2/generator/defaults' +require_relative '../lib/jekyll-paginate-v2/generator/utils' +require_relative '../lib/jekyll-paginate-v2/generator/compatibilityUtils' +require_relative '../lib/jekyll-paginate-v2/generator/paginationIndexer' +require_relative '../lib/jekyll-paginate-v2/generator/paginator' +require_relative '../lib/jekyll-paginate-v2/generator/paginationPage' +require_relative '../lib/jekyll-paginate-v2/generator/paginationModel' +require_relative '../lib/jekyll-paginate-v2/generator/paginationGenerator' \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll-readme-index.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll-readme-index.rb new file mode 100644 index 000000000000..c47e309869b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll-readme-index.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "jekyll" +require "jekyll-readme-index/generator" +require_relative "./jekyll/static_file_ext" + +module JekyllReadmeIndex +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll-readme-index/generator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll-readme-index/generator.rb new file mode 100644 index 000000000000..7a40c265aded --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll-readme-index/generator.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +module JekyllReadmeIndex + class Generator < Jekyll::Generator + INDEX_REGEX = %r!$|index\.(html?|xhtml|xml)$!i.freeze + + attr_accessor :site + + safe true + priority :low + + CONFIG_KEY = "readme_index" + ENABLED_KEY = "enabled" + CLEANUP_KEY = "remove_originals" + FRONTMATTER_KEY = "with_frontmatter" + + def initialize(site) + @site = site + end + + def generate(site) + @site = site + return if disabled? + + readmes.each do |readme| + next unless should_be_index?(readme) + + site.pages << readme.to_page + site.static_files.delete(readme) if cleanup? + end + + if with_frontmatter? + readmes_with_frontmatter.each do |readme| + next unless should_be_index?(readme) + + readme.update_permalink + end + end + end + + private + + # Returns an array of all READMEs as StaticFiles + def readmes + site.static_files.select { |file| file.relative_path =~ readme_regex } + end + + def readmes_with_frontmatter + site.pages.select { |file| ("/" + file.path) =~ readme_regex } + end + + # Should the given readme be the containing directory's index? + def should_be_index?(readme) + return false unless readme + + !dir_has_index? File.dirname(readme.url) + end + + # Does the given directory have an index? + # + # relative_path - the directory path relative to the site root + def dir_has_index?(relative_path) + relative_path << "/" unless relative_path.end_with? "/" + regex = %r!^#{Regexp.escape(relative_path)}#{INDEX_REGEX}!i + (site.pages + site.static_files).any? { |file| file.url =~ regex } + end + + # Regexp to match a file path against to detect if the given file is a README + def readme_regex + @readme_regex ||= %r!/readme(#{Regexp.union(markdown_converter.extname_list)})$!i + end + + def markdown_converter + @markdown_converter ||= site.find_converter_instance(Jekyll::Converters::Markdown) + end + + def option(key) + site.config[CONFIG_KEY] && site.config[CONFIG_KEY][key] + end + + def disabled? + option(ENABLED_KEY) == false + end + + def cleanup? + option(CLEANUP_KEY) == true + end + + def with_frontmatter? + option(FRONTMATTER_KEY) == true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll-readme-index/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll-readme-index/version.rb new file mode 100644 index 000000000000..fdd5f764502e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll-readme-index/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module JekyllReadmeIndex + VERSION = "0.3.0" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll/static_file_ext.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll/static_file_ext.rb new file mode 100644 index 000000000000..f8619c87ad57 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-readme-index-0.3.0/lib/jekyll/static_file_ext.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Jekyll + class StaticFile + # Convert this static file to a Page + def to_page + page = Jekyll::Page.new(@site, @base, @dir, @name) + page.data["permalink"] = File.dirname(url) + "/" + page + end + end + + class Page + def update_permalink + data["permalink"] = File.dirname(url) + "/" + @url = URL.new( + :template => template, + :placeholders => url_placeholders, + :permalink => permalink + ).to_s + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.gitignore new file mode 100644 index 000000000000..e47808f0fc1a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.gitignore @@ -0,0 +1,20 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +spec/fixtures/.jekyll-metadata +spec/fixtures/.jekyll-cache +test/tmp +test/version_tmp +tmp +vendor/bundle diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.rspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.rspec new file mode 100644 index 000000000000..98b34a690949 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.rspec @@ -0,0 +1,4 @@ +--color +--format progress +--require spec_helper +--order random diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.rubocop.yml new file mode 100644 index 000000000000..abb655734f7b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.rubocop.yml @@ -0,0 +1,11 @@ +inherit_from: .rubocop_todo.yml + +require: rubocop-jekyll + +inherit_gem: + rubocop-jekyll: .rubocop.yml + +AllCops: + TargetRubyVersion: 2.4 + Exclude: + - vendor/**/* diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.rubocop_todo.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.rubocop_todo.yml new file mode 100644 index 000000000000..b0fac8c09f29 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.rubocop_todo.yml @@ -0,0 +1,40 @@ +# This configuration was generated by +# `rubocop --auto-gen-config` +# on 2018-12-06 11:51:19 +0100 using RuboCop version 0.61.1. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 12 +# Configuration parameters: CountComments, Max, ExcludedMethods. +# ExcludedMethods: refine +Metrics/BlockLength: + Exclude: + - 'spec/integrations_spec.rb' + - 'spec/jekyll_redirect_from/generator_spec.rb' + - 'spec/jekyll_redirect_from/redirect_page_spec.rb' + - 'spec/jekyll_redirect_from/redirectable_spec.rb' + - 'spec/spec_helper.rb' + +# Offense count: 3 +# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. +# URISchemes: http, https +Metrics/LineLength: + Exclude: + - 'spec/jekyll_redirect_from/generator_spec.rb' + - 'spec/jekyll_redirect_from/redirect_page_spec.rb' + +# Offense count: 1 +# Configuration parameters: EnforcedStyleForLeadingUnderscores. +# SupportedStylesForLeadingUnderscores: disallowed, required, optional +Naming/MemoizedInstanceVariableName: + Exclude: + - 'lib/jekyll-redirect-from/page_without_a_file.rb' + +# Offense count: 2 +# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames. +# AllowedNames: io, id, to, by, on, in, at, ip, db +Naming/UncommunicativeMethodParamName: + Exclude: + - 'lib/jekyll-redirect-from/redirect_page.rb' diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.travis.yml new file mode 100644 index 000000000000..3570263db481 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/.travis.yml @@ -0,0 +1,20 @@ +language: ruby +cache: bundler +rvm: + - &latest_ruby 2.6 + - 2.4 + - 2.3 +env: + - JEKYLL_VERSION="~> 3.8" +matrix: + include: + - # GitHub Pages + rvm: 2.5.3 + env: GH_PAGES=true + - rvm: *latest_ruby + env: JEKYLL_VERSION="~> 4.0" + +before_install: +- gem update --system +before_script: bundle update +script: script/cibuild diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/Gemfile new file mode 100644 index 000000000000..7ffc8baaa3e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" +gemspec + +gem "github-pages" if ENV["GH_PAGES"] +gem "jekyll", ENV["JEKYLL_VERSION"] if ENV["JEKYLL_VERSION"] diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/History.markdown b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/History.markdown new file mode 100644 index 000000000000..1190d1198c2d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/History.markdown @@ -0,0 +1,203 @@ +## 0.16.0 / 2020-01-26 + +### Minor Enhancements + + * Allows generation of `redirects.json` to be disabled (#207) + * Allow redirects from and for subclasses of page and document (#204) + +### Bug Fixes + + * Use `Hash#key?` instead of `Hash#keys.any?` (#201) + +### Development Fixes + + * Target Ruby 2.4 + * Stop testing with backwards-compatible site config (#211) + +### Documentation + + * Simplifies YAML for `redirect_to` (#185) + +## 0.15.0 / 2019-03-23 + +### Development Fixes + + * chore(deps): rubocop-jekyll 0.3 (#187) + +### Bug Fixes + + * Allow testing and using with Jekyll 4.x (#196) + +## 0.14.0 / 2018-06-29 + +### Minor Enhancements + + * Run javascript at first to avoid splash (#158) + +### Development Fixes + + * Use Rubocop 0.57 + * Target Ruby 2.3 + * Test against Ruby 2.5 (#173) + +## 0.13.0 / 2017-12-03 + + * Test against same version of Ruby that GitHub Pages uses (#132) + +### Development Fixes + + * Rubocop (#141) + * Fix tests for jekyll 3.5.x (#160) + * Rubocop: autocorrect (#165) + +### Minor Enhancements + + * HTML encode ellipsis (#142) + * Added no-index to template (#152) + * Define path with __dir__ (#161) + +### Major Enhancements + + * Create redirects.json file (#147) + +### Documentation + + * Update README.md (#167) + +## 0.12.1 / 2017-01-12 + +### Development Fixes + + * Stop testing Ruby 1.9 (#133) + +### Minor Enhancements + + * Use send to monkey patch to support Ruby < 2.2.0 (#136) + * set `page.output` to empty string instead of nil (#137) + +## 0.12.0 / 2017-01-02 + +### Major Enhancements + + * Support for custom redirect templates + * Use Jekyll's `absolute_url` filter to generate canonical URLs (now respecting `baseurl`) + * Rely more heavily on Jekyll's native Page, permalink, and extension handling logic + +### Minor Enhancementse + + * redirect_to Pages should not have a layout. (#115) + * Require Jekyll >= 3.3 + +### Development Enhancements + + * Push redirect logic to the redirect page model (#131) + * Add Rubocop and enforce Jekyll coding standards + * Tests no longer build and write the entire site between each example + * Removed all the `is_*`? and `has_*`? helpers from the generator + +## 0.11.0 / 2016-07-06 + + * Redirect page should not have any layout (#106) + * Include absolute path in canonical url (#109) + * Add <html> tag and language (#100) + * Ensure redirect_to links produce an HTML file. (#111) + +## 0.10.0 / 2016-03-16 + + * Ensure output extension is assigned (#96) + +## 0.9.1 / 2015-12-11 + + * Enforce double-quote strings to pass htmlhint (#83) + * Stringify all values coming from `site.github` (#89) + +## 0.9.0 / 2015-10-28 + + * Support Jekyll 3 stable (#76) + * Test against Jekyll 3, 2, and GitHub Pages (#72) + +## 0.8.0 / 2015-05-20 + + * Exclude redirect pages from sitemap (#69) + +## 0.7.0 / 2015-03-16 + + * Remove spaces in redirect page (#62) + * Only parse through documents/pages/posts (#56) + * Simplified `has_alt_urls?` and `has_redirect_to_url?` conditions (#52) + * Add support for Jekyll 3. (#59) + +## 0.6.2 / 2014-09-12 + + * Fixed error where `redirect_to` `Document`s were not being output properly (#46) + +## 0.6.1 / 2014-09-08 + + * Fixed error when the `site.github` config key is not a `Hash` (#43) + +## 0.6.0 / 2014-08-22 + + * Support redirecting to/from collection documents (#40) + +## 0.5.0 / 2014-08-10 + +### Minor Enhancements + + * Support `redirect_to` property (#32) + * Automatically prefix redirects with the `baseurl` or GitHub URL. (#26) + +### Bug Fixes + + * Remove unnecessary `Array#flatten` (#34) + +### Development Fixes + + * Use `be_truthy` instead of `be_true`. (#33) + +## 0.4.0 / 2014-05-06 + +### Major Enhancements + + * Upgrade to Jekyll 2.0 (#27) + +### Minor Enhancements + + * Shorten resulting HTML to make redirects quicker (#20) + +### Development Fixes + + * Use SVG Travis badge in README (#21) + +## 0.3.1 / 2014-01-22 + +### Bug Fixes + + * Add `safe true` to the `Jekyll::Generator` so it can be run in safe mode (#12) + +## 0.3.0 / 2014-01-15 + +### Major Enhancements + + * `redirect_from` items are now proper permalinks rooted in site source (#8) + +### Development Fixes + + * Add forgotten `s` to `gems` in README.md (#7) + +## 0.2.0 / 2014-01-04 + +### Minor Enhancements + + * Allow user to set one or many `redirect_from` URLs + * Rename from `jekyll-alt-urls` to `jekyll-redirect-from` (props to @benbalter) + * Namespace now its own module: `JekyllRedirectFrom` (#3) + +### Development Fixes + + * Add history file + * Add specs (#3) + * Add TravisCI badge (#4) + +## 0.1.0 / 2013-12-15 + + * Birthday! diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/LICENSE.txt new file mode 100644 index 000000000000..02956170b3fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2013-present Parker Moore and jekyll-redirect-from contributors + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/README.md new file mode 100644 index 000000000000..706435b1654f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/README.md @@ -0,0 +1,149 @@ +# JekyllRedirectFrom + +Give your Jekyll posts and pages multiple URLs. + +When importing your posts and pages from, say, Tumblr, it's annoying and +impractical to create new pages in the proper subdirectories so they, e.g. +`/post/123456789/my-slug-that-is-often-incompl`, redirect to the new post URL. + +Instead of dealing with maintaining those pages for redirection, let +`jekyll-redirect-from` handle it for you. + +[![Build Status](https://travis-ci.org/jekyll/jekyll-redirect-from.svg?branch=master)](https://travis-ci.org/jekyll/jekyll-redirect-from) + +## How it Works + +Redirects are performed by serving an HTML file with an HTTP-REFRESH meta +tag which points to your destination. No `.htaccess` file, nginx conf, xml +file, or anything else will be generated. It simply creates HTML files. + +## Installation + +Add this line to your application's Gemfile: + + gem 'jekyll-redirect-from' + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install jekyll-redirect-from + +Once it's installed into your evironment, add it to your `_config.yml`: + +```yaml +plugins: + - jekyll-redirect-from +``` + +💡 If you are using a Jekyll version less than 3.5.0, use the `gems` key instead of `plugins`. + +If you're using Jekyll in `safe` mode to mimic GitHub Pages, make sure to +add jekyll-redirect-from to your whitelist: + +```yaml +whitelist: + - jekyll-redirect-from +``` + +Then run `jekyll <cmd> --safe` like normal. + +## Usage + +The object of this gem is to allow an author to specify multiple URLs for a +page, such that the alternative URLs redirect to the new Jekyll URL. + +To use it, simply add the array to the YAML front-matter of your page or post: + +```yaml +title: My amazing post +redirect_from: + - /post/123456789/ + - /post/123456789/my-amazing-post/ +``` + +Redirects including a trailing slash will generate a corresponding subdirectory containing an `index.html`, while redirects without a trailing slash will generate a corresponding `filename` without an extension, and without a subdirectory. + +For example... + +```text +redirect_from: + - /post/123456789/my-amazing-post +``` + +...will generate the following page in the destination: + +```text +/post/123456789/my-amazing-post +``` + +While... + +```text +redirect_from: + - /post/123456789/my-amazing-post/ +``` + +...will generate the following page in the destination: + +```text +/post/123456789/my-amazing-post/index.html +``` + +These pages will contain an HTTP-REFRESH meta tag which redirect to your URL. + +You can also specify just **one url** like this: + +```text +title: My other awesome post +redirect_from: /post/123456798/ +``` + +### Prefix + +If `site.url` is set, its value, together with `site.baseurl`, is used as a prefix for the redirect url automatically. This is useful for scenarios where a site isn't available from the domain root, so the redirects point to the correct path. If `site.url` is not set, only `site.baseurl` is used, if set. + +**_Note_**: If you are hosting your Jekyll site on [GitHub Pages](https://pages.github.com/), and `site.url` is not set, the prefix is set to the pages domain name i.e. http://example.github.io/project or a custom CNAME. + +### Redirect To + +Sometimes, you may want to redirect a site page to a totally different website. This plugin also supports that with the `redirect_to` key: + +```yaml +title: My amazing post +redirect_to: http://www.github.com +``` + +**Note**: Using `redirect_to` or `redirect_from` with collections will only work with files which are output to HTML, such as `.md`, `.textile`, `.html` etc. + +## Customizing the redirect template + +If you want to customize the redirect template, you can. Simply create a layout in your site's `_layouts` directory called `redirect.html`. + +Your layout will get the following variables: + +* `page.redirect.from` - the relative path to the redirect page +* `page.redirect.to` - the absolute URL (where available) to the target page + +## Configuration + +You can configure this plugin in `_config.yml` by adding to the `redirect_from` key. + +### Disabling `redirects.json` + +By default, a file called `redirects.json`, which can be used for automated testing or to implement server-side redirects, will be included in the output. To exclude it from the output, set the `json` key to `false`: + +```yml +redirect_from: + json: false +``` + +## Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/Rakefile new file mode 100644 index 000000000000..ee617bbbf3aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/Rakefile @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "bundler/gem_tasks" +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/jekyll-redirect-from.gemspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/jekyll-redirect-from.gemspec new file mode 100644 index 000000000000..cdad96a5909b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/jekyll-redirect-from.gemspec @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +lib = File.expand_path("lib", __dir__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require "jekyll-redirect-from/version" + +Gem::Specification.new do |spec| + spec.name = "jekyll-redirect-from" + spec.version = JekyllRedirectFrom::VERSION + spec.authors = ["Parker Moore"] + spec.email = ["parkrmoore@gmail.com"] + spec.summary = "Seamlessly specify multiple redirection URLs " \ + "for your pages and posts" + spec.homepage = "https://github.com/jekyll/jekyll-redirect-from" + spec.license = "MIT" + + # rubocop:disable Style/SpecialGlobalVars + spec.files = `git ls-files`.split($/) + # rubocop:enable Style/SpecialGlobalVars + + spec.executables = spec.files.grep(%r!^bin/!) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r!^(test|spec|features)/!) + spec.require_paths = ["lib"] + + spec.required_ruby_version = ">= 2.4.0" + + spec.add_runtime_dependency "jekyll", ">= 3.3", "< 5.0" + + spec.add_development_dependency "bundler" + spec.add_development_dependency "jekyll-sitemap", "~> 1.0" + spec.add_development_dependency "rake", "~> 12.0" + spec.add_development_dependency "rspec", "~> 3.5" + spec.add_development_dependency "rubocop-jekyll", "~> 0.10" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from.rb new file mode 100644 index 000000000000..1922bc11eaed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require "jekyll" +require "jekyll-redirect-from/version" +require "jekyll-redirect-from/generator" + +module JekyllRedirectFrom + # Jekyll classes which should be redirectable + CLASSES = [Jekyll::Page, Jekyll::Document].freeze + + autoload :Context, "jekyll-redirect-from/context" + autoload :RedirectPage, "jekyll-redirect-from/redirect_page" + autoload :Redirectable, "jekyll-redirect-from/redirectable" + autoload :Layout, "jekyll-redirect-from/layout" + autoload :PageWithoutAFile, "jekyll-redirect-from/page_without_a_file" +end + +JekyllRedirectFrom::CLASSES.each do |klass| + klass.send :include, JekyllRedirectFrom::Redirectable +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/context.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/context.rb new file mode 100644 index 000000000000..25cfcf98b588 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/context.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module JekyllRedirectFrom + # Stubbed LiquidContext to support relative_url and absolute_url helpers + class Context + attr_reader :site + + def initialize(site) + @site = site + end + + def registers + { :site => site } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/generator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/generator.rb new file mode 100644 index 000000000000..52e68f5c6329 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/generator.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module JekyllRedirectFrom + class Generator < Jekyll::Generator + safe true + attr_reader :site, :redirects + + def generate(site) + @site = site + @redirects = {} + + # Inject our layout, unless the user has already specified a redirect layout' + unless site.layouts.key?("redirect") + site.layouts["redirect"] = JekyllRedirectFrom::Layout.new(site) + end + + # Must duplicate pages to modify while in loop + (site.docs_to_write + site.pages.dup).each do |doc| + next unless redirectable_document?(doc) + + generate_redirect_from(doc) + generate_redirect_to(doc) + end + + generate_redirects_json if generate_redirects_json? + end + + private + + # For every `redirect_from` entry, generate a redirect page + def generate_redirect_from(doc) + doc.redirect_from.each do |path| + page = RedirectPage.redirect_from(doc, path) + doc.site.pages << page + redirects[page.redirect_from] = page.redirect_to + end + end + + def generate_redirect_to(doc) + return unless doc.redirect_to + + page = RedirectPage.redirect_to(doc, doc.redirect_to) + doc.data.merge!(page.data) + doc.content = doc.output = page.output + redirects[page.redirect_from] = page.redirect_to + end + + def generate_redirects_json + return if File.exist? site.in_source_dir("redirects.json") + + page = PageWithoutAFile.new(site, "", "", "redirects.json") + page.content = redirects.to_json + page.data["layout"] = nil + site.pages << page + end + + def redirectable_document?(doc) + doc.is_a?(Jekyll::Document) || doc.is_a?(Jekyll::Page) + end + + def generate_redirects_json? + site.config.dig("redirect_from", "json") != false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/layout.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/layout.rb new file mode 100644 index 000000000000..b39ca9df70d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/layout.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module JekyllRedirectFrom + # A stubbed layout for our default redirect template + # We cannot use the standard Layout class because of site.in_source_dir + class Layout < Jekyll::Layout + def initialize(site) + @site = site + @base = __dir__ + @name = "redirect.html" + @path = File.expand_path(@name, @base) + @relative_path = "_layouts/redirect.html" + + self.data = {} + self.ext = "html" + self.content = File.read(@path) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/page_without_a_file.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/page_without_a_file.rb new file mode 100644 index 000000000000..9604cb8d7d65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/page_without_a_file.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module JekyllRedirectFrom + class PageWithoutAFile < Jekyll::Page + def read_yaml(*) + @data ||= {} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/redirect.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/redirect.html new file mode 100644 index 000000000000..66403105069b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/redirect.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html lang="en-US"> + <meta charset="utf-8"> + <title>Redirecting&hellip;</title> + <link rel="canonical" href="{{ page.redirect.to }}"> + <script>location="{{ page.redirect.to }}"</script> + <meta http-equiv="refresh" content="0; url={{ page.redirect.to }}"> + <meta name="robots" content="noindex"> + <h1>Redirecting&hellip;</h1> + <a href="{{ page.redirect.to }}">Click here if you are not redirected.</a> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/redirect_page.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/redirect_page.rb new file mode 100644 index 000000000000..58d022c186bf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/redirect_page.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +module JekyllRedirectFrom + # Specialty page which implements the redirect path logic + class RedirectPage < Jekyll::Page + # Use Jekyll's native absolute_url filter + include Jekyll::Filters::URLFilters + + DEFAULT_DATA = { + "sitemap" => false, + "layout" => "redirect", + }.freeze + + # Creates a new RedirectPage instance from a source path and redirect path + # + # site - The Site object + # from - the (URL) path, relative to the site root to redirect from + # to - the relative path or URL which the page should redirect to + def self.from_paths(site, from, to) + page = RedirectPage.new(site, site.source, "", "redirect.html") + page.set_paths(from, to) + page + end + + # Creates a new RedirectPage instance from the path to the given doc + def self.redirect_from(doc, path) + RedirectPage.from_paths(doc.site, path, doc.url) + end + + # Creates a new RedirectPage instance from the doc to the given path + def self.redirect_to(doc, path) + RedirectPage.from_paths(doc.site, doc.url, path) + end + + # Overwrite the default read_yaml method since the file doesn't exist + def read_yaml(_base, _name, _opts = {}) + self.content = self.output = "" + self.data ||= DEFAULT_DATA.dup + end + + # Helper function to set the appropriate path metadata + # + # from - the relative path to the redirect page + # to - the relative path or absolute URL to the redirect target + def set_paths(from, to) + @context ||= context + from = ensure_leading_slash(from) + data.merge!( + "permalink" => from, + "redirect" => { + "from" => from, + "to" => %r!^https?://!.match?(to) ? to : absolute_url(to), + } + ) + end + + def redirect_from + data["redirect"]["from"] if data["redirect"] + end + + def redirect_to + data["redirect"]["to"] if data["redirect"] + end + + private + + def context + JekyllRedirectFrom::Context.new(site) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/redirectable.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/redirectable.rb new file mode 100644 index 000000000000..741ddc49b639 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/redirectable.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module JekyllRedirectFrom + # Module which can be mixed in to documents (and pages) to provide + # redirect_to and redirect_from helpers + module Redirectable + # Returns a string representing the relative path or URL + # to which the document should be redirected + def redirect_to + if to_liquid["redirect_to"].is_a?(Array) + to_liquid["redirect_to"].compact.first + else + to_liquid["redirect_to"] + end + end + + # Returns an array representing the relative paths to other + # documents which should be redirected to this document + def redirect_from + if to_liquid["redirect_from"].is_a?(Array) + to_liquid["redirect_from"].compact + else + [to_liquid["redirect_from"]].compact + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/version.rb new file mode 100644 index 000000000000..56f5d47e5dd6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/lib/jekyll-redirect-from/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module JekyllRedirectFrom + VERSION = "0.16.0" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/bootstrap new file mode 100644 index 000000000000..e3126bf435ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/bootstrap @@ -0,0 +1,4 @@ +#! /bin/bash +set -e + +bundle install -j8 || bundle install diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/cibuild new file mode 100644 index 000000000000..40589af0eefc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/cibuild @@ -0,0 +1,6 @@ +#! /bin/bash +set -e + +script/test +script/fmt +bundle exec rake build diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/fmt b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/fmt new file mode 100644 index 000000000000..c5351ecf017f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/fmt @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +echo "Rubocop $(bundle exec rubocop --version)" +bundle exec rubocop -D -E $@ +success=$? +if ((success != 0)); then + echo -e "\nTry running \`script/fmt -a\` to automatically fix errors" +fi +exit $success diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/release b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/release new file mode 100644 index 000000000000..6c9fcf2f3d41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/release @@ -0,0 +1,4 @@ +#! /bin/bash + +script/cibuild +bundle exec rake release diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/test b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/test new file mode 100644 index 000000000000..8f46fe479a76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/script/test @@ -0,0 +1,2 @@ +#!/bin/sh +bundle exec rspec $@ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_articles/redirect-me-plz.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_articles/redirect-me-plz.md new file mode 100644 index 000000000000..6b78e9639f8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_articles/redirect-me-plz.md @@ -0,0 +1,6 @@ +--- +title: Please redirect me, sir. +redirect_from: /articles/23128432159832/mary-had-a-little-lamb +--- + +Yay. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_articles/redirect-somewhere-else-im-a-permalink.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_articles/redirect-somewhere-else-im-a-permalink.html new file mode 100644 index 000000000000..aab0bd35b2ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_articles/redirect-somewhere-else-im-a-permalink.html @@ -0,0 +1,7 @@ +--- +title: Please redirect away from me and my permalink. +permalink: /tags/our projects/ +redirect_to: /tags/our-projects/ +--- + +Bye. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_articles/redirect-somewhere-else-plz.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_articles/redirect-somewhere-else-plz.html new file mode 100644 index 000000000000..afae1018c4a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_articles/redirect-somewhere-else-plz.html @@ -0,0 +1,6 @@ +--- +title: Please redirect away from me, sir. +redirect_to: "http://www.zombo.com" +--- + +Boo. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_authors/kansaichris.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_authors/kansaichris.md new file mode 100644 index 000000000000..6b23a088cdaa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_authors/kansaichris.md @@ -0,0 +1,5 @@ +--- +redirect_from: /kansaichris/ +--- + +Hi. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_layouts/layout.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_layouts/layout.html new file mode 100644 index 000000000000..82e099dc276a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_layouts/layout.html @@ -0,0 +1,6 @@ +--- +--- + +LAYOUT INCLUDED + +{{ content }} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_posts/2014-01-03-redirect-me-plz.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_posts/2014-01-03-redirect-me-plz.md new file mode 100644 index 000000000000..e25d2c360e6e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/_posts/2014-01-03-redirect-me-plz.md @@ -0,0 +1,6 @@ +--- +title: Please redirect me, sir. +redirect_from: /posts/23128432159832/mary-had-a-little-lamb +--- + +Yay. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/multiple_redirect_froms.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/multiple_redirect_froms.md new file mode 100644 index 000000000000..d7a196db1952 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/multiple_redirect_froms.md @@ -0,0 +1,10 @@ +--- +title: I have lots of redirect urls +redirect_from: +- help +- contact +- let-there/be/light-he-said +- /geepers/mccreepin +--- + +Lots of redirect urls diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/multiple_redirect_tos.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/multiple_redirect_tos.md new file mode 100644 index 000000000000..8d6f76e25040 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/multiple_redirect_tos.md @@ -0,0 +1,9 @@ +--- +title: I have lots of redirect to urls +redirect_to: +- https://www.jekyllrb.com +- https://www.github.com +- https://www.twitter.com +--- + +Lots of redirect to urls. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/one_redirect_from.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/one_redirect_from.md new file mode 100644 index 000000000000..86be7efa7d8a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/one_redirect_from.md @@ -0,0 +1,6 @@ +--- +title: I only have one redirect path +redirect_from: some/other/path +--- + +One redirect url diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/one_redirect_to_path.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/one_redirect_to_path.md new file mode 100644 index 000000000000..d3796717d48e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/one_redirect_to_path.md @@ -0,0 +1,6 @@ +--- +title: I am going somewhere external +redirect_to: /foo +--- + +Redirecting elsewhere. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/one_redirect_to_url.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/one_redirect_to_url.md new file mode 100644 index 000000000000..6b3f28c4f882 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/one_redirect_to_url.md @@ -0,0 +1,6 @@ +--- +title: I am going somewhere external +redirect_to: https://www.github.com +--- + +Redirecting elsewhere. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/tags/how we work.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/tags/how we work.md new file mode 100644 index 000000000000..e87d072278f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/fixtures/tags/how we work.md @@ -0,0 +1,4 @@ +--- +redirect_to: "/tags/how-we-work/" +permalink: "/tags/how we work/" +--- diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/integrations_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/integrations_spec.rb new file mode 100644 index 000000000000..2ca7b64b93b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/integrations_spec.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +RSpec.describe "JekyllRedirectFrom integration tests" do + before { site.process } + let(:relative_path) { "" } + let(:path) { dest_dir(relative_path) } + let(:contents) { File.read(path) } + + context "pages" do + context "single redirect from" do + let(:relative_path) { "some/other/path.html" } + + it "exists in the built site" do + expect(path).to exist + expect(contents).to match("http://jekyllrb.com/one_redirect_from.html") + end + end + + context "multiple redirect froms" do + %w(help contact let-there/be/light-he-said geepers/mccreepin).each do |redirect| + context "the #{redirect} redirect" do + let(:relative_path) { "#{redirect}.html" } + + it "exists in the built site" do + expect(path).to exist + expect(contents).to match("http://jekyllrb.com/multiple_redirect_froms.html") + end + end + end + end + + context "a redirect to URL" do + let(:relative_path) { "one_redirect_to_url.html" } + + it "exists in the built site" do + expect(path).to exist + expect(contents).to match("https://www.github.com") + end + end + + context "a redirect to path" do + let(:relative_path) { "one_redirect_to_path.html" } + + it "exists in the built site" do + expect(path).to exist + expect(contents).to match("http://jekyllrb.com/foo") + end + end + end + + context "documents" do + context "a single redirect from" do + let(:relative_path) { "articles/23128432159832/mary-had-a-little-lamb.html" } + + it "exists in the built site" do + expect(path).to exist + expect(contents).to match("http://jekyllrb.com/articles/redirect-me-plz.html") + end + end + + context "redirect to" do + let(:relative_path) { "articles/redirect-somewhere-else-plz.html" } + + it "exists in the built site" do + expect(path).to exist + expect(contents).to match("http://www.zombo.com") + end + end + + context "with a permalink" do + let(:relative_path) { "tags/our projects/index.html" } + + it "exists in the built site" do + expect(path).to exist + expect(contents).to match("http://jekyllrb.com/tags/our-projects/") + end + end + end + + context "sitemap" do + let(:relative_path) { "sitemap.xml" } + + it "doesn't contain redirects" do + expect(contents).to_not be_nil + expect(contents).to_not match("redirect_to") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/context_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/context_spec.rb new file mode 100644 index 000000000000..b619d03ecca9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/context_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +RSpec.describe JekyllRedirectFrom::Context do + subject { described_class.new(site) } + + it "stores the site" do + expect(subject.site).to be_a(Jekyll::Site) + end + + it "returns the register" do + expect(subject.registers).to have_key(:site) + expect(subject.registers[:site]).to be_a(Jekyll::Site) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/generator_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/generator_spec.rb new file mode 100644 index 000000000000..5a7767b88927 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/generator_spec.rb @@ -0,0 +1,171 @@ +# frozen_string_literal: true + +RSpec.describe JekyllRedirectFrom::Generator do + before(:each) do + site.read + site.generate + site.render + site.write + end + + context "layouts" do + context "a site with a redirect layout" do + before { site.layouts["redirect"] = "foo" } + + it "doesn't inject the layout" do + expect(site.layouts["redirect"]).to eql("foo") + end + end + + context "a site without a redirect layout" do + it "injects the layout" do + expect(site.layouts["redirect"]).to be_a(JekyllRedirectFrom::Layout) + end + end + end + + context "redirect froms" do + context "pages" do + context "a page with a single redirect" do + let(:page) { site.pages.find { |p| p.url == "/some/other/path" } } + + it "creates the redirect" do + expect(page).to_not be_nil + expect(page.output).to match("http://jekyllrb.com/one_redirect_from.html") + end + end + + context "a page with multiple redirects" do + let(:redirects) do + ["/help", "/contact", "/let-there/be/light-he-said", "/geepers/mccreepin"] + end + + it "creates all the redirects" do + redirects.each do |url| + page = site.pages.find { |p| p.url == url } + expect(page).to_not be_nil + expect(page.output).to match("http://jekyllrb.com/multiple_redirect_froms.html") + end + end + end + end + + context "documents" do + let(:page) { site.pages.find { |p| p.url == "/articles/23128432159832/mary-had-a-little-lamb" } } + + it "redirects" do + expect(page).to_not be_nil + expect(page.output).to match("http://jekyllrb.com/articles/redirect-me-plz.html") + end + end + end + + context "redirect tos" do + context "pages" do + context "a single redirect to" do + let(:page) { site.pages.find { |p| p.url == "/one_redirect_to_url.html" } } + + it "redirects" do + expect(page.output).to match("https://www.github.com") + end + end + + context "multiple redirect tos" do + let(:page) { site.pages.find { |p| p.url == "/multiple_redirect_tos.html" } } + + it "redirects to the first entry" do + expect(page.output).to match("https://www.jekyllrb.com") + end + end + end + + context "documents" do + let(:doc) { site.documents.find { |p| p.url == "/articles/redirect-somewhere-else-plz.html" } } + + it "redirects" do + expect(doc.output).to match("http://www.zombo.com") + end + end + end + + context "redirects.json" do + let(:path) { dest_dir("redirects.json") } + let(:contents) { File.read(path) } + let(:redirects) { JSON.parse(contents) } + let(:domain) { "http://jekyllrb.com" } + + it "creates the redirects file" do + expect(path).to exist + end + + it "contains redirects" do + expect(redirects.count).to eql(13) + end + + it "contains single redirects tos" do + expect(redirects.keys).to include "/one_redirect_to_path.html" + expect(redirects["/one_redirect_to_path.html"]).to eql("#{domain}/foo") + end + + it "contains multiple redirect tos" do + expect(redirects.keys).to include "/multiple_redirect_tos.html" + expect(redirects["/multiple_redirect_tos.html"]).to eql("https://www.jekyllrb.com") + end + + it "contains single redirect froms" do + expect(redirects.keys).to include "/some/other/path" + expect(redirects["/some/other/path"]).to eql("#{domain}/one_redirect_from.html") + end + + it "contains multiple redirect froms" do + expect(redirects.keys).to include "/help" + expect(redirects["/help"]).to eql("#{domain}/multiple_redirect_froms.html") + + expect(redirects.keys).to include "/contact" + expect(redirects["/contact"]).to eql("#{domain}/multiple_redirect_froms.html") + end + + context "with a user-supplied redirects.json" do + let(:source_path) { File.join fixtures_path, "redirects.json" } + before do + File.write source_path, { "foo" => "bar" }.to_json + site.reset + site.read + site.generate + site.render + site.write + end + + after do + FileUtils.rm_f source_path + end + + it "doesn't overwrite redirects.json" do + expect(path).to exist + expect(redirects).to eql("foo" => "bar") + end + end + + context "when explicitly disabled" do + let(:site) { Jekyll::Site.new(config.merge("redirect_from" => { "json" => false })) } + + it "does not create the redirects file" do + expect(path).to_not exist + end + end + end + + context "redirectable_document?" do + let(:generator) { JekyllRedirectFrom::Generator.new } + + it "accepts subclasses of Jekyll::Document" do + SubclassOfJekyllDocument = Class.new(Jekyll::Document) { define_method(:initialize) {} } + expect(generator.send(:redirectable_document?, SubclassOfJekyllDocument.new)).to be_truthy + end + + it "accepts subclasses of Jekyll::Page" do + SubclassOfJekyllPage = Class.new(Jekyll::Page) { define_method(:initialize) {} } + expect(generator.send(:redirectable_document?, SubclassOfJekyllPage.new)).to be_truthy + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/layout_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/layout_spec.rb new file mode 100644 index 000000000000..60d6f42fc5fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/layout_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +RSpec.describe JekyllRedirectFrom::Layout do + subject { described_class.new(@site) } + + it "exposes the site" do + expect(subject.site).to eql(@site) + end + + it "exposes the name" do + expect(subject.name).to eql("redirect.html") + end + + it "exposes the path" do + expected = File.expand_path "../../lib/jekyll-redirect-from/redirect.html", __dir__ + expect(subject.path).to eql(expected) + end + + it "exposes the relative path" do + expect(subject.relative_path).to eql("_layouts/redirect.html") + end + + it "exposes the ext" do + expect(subject.ext).to eql("html") + end + + it "exposes data" do + expect(subject.data).to eql({}) + end + + it "exposes content" do + expect(subject.content).to match("Redirecting...") + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/redirect_page_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/redirect_page_spec.rb new file mode 100644 index 000000000000..e3cd2c635402 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/redirect_page_spec.rb @@ -0,0 +1,211 @@ +# frozen_string_literal: true + +describe JekyllRedirectFrom::RedirectPage do + let(:from) { "/foo" } + let(:to) { "/bar" } + let(:site_url) { site.config["url"] } + subject { described_class.from_paths(site, from, to) } + before { site.read } + + context "being a page" do + before { subject.read_yaml(nil, nil, nil) } + + it "returns no content" do + expect(subject.content).to eql("") + end + + it "returns no output" do + expect(subject.output).to eql("") + end + + it "sets default data" do + expect(subject.to_liquid["layout"]).to eql("redirect") + expect(subject.to_liquid["sitemap"]).to be_falsey + end + end + + context "creating a page from paths" do + it "sets the permalink" do + expect(subject.to_liquid["permalink"]).to eql(from) + end + + it "sets redirect metadata" do + expect(subject.to_liquid).to have_key("redirect") + expect(subject.to_liquid["redirect"]["from"]).to eql(from) + expect(subject.to_liquid["redirect"]["to"]).to eql("#{site_url}#{to}") + end + + context "with a document" do + let(:doc) { site.documents.first } + + context "redirect from" do + let(:page) { described_class.redirect_from(doc, from) } + + it "creates with redirect_from" do + expect(page.to_liquid["permalink"]).to eql(from) + expect(page.to_liquid).to have_key("redirect") + expect(page.to_liquid["redirect"]["from"]).to eql(from) + expected = "http://jekyllrb.com/2014/01/03/redirect-me-plz.html" + expect(page.to_liquid["redirect"]["to"]).to eql(expected) + end + end + + context "redirect to" do + let(:page) { described_class.redirect_to(doc, to) } + + context "redirecting to a path" do + let(:to) { "/bar" } + + it "redirects" do + expect(page.to_liquid["permalink"]).to eql("/2014/01/03/redirect-me-plz.html") + expect(page.to_liquid).to have_key("redirect") + expect(page.to_liquid["redirect"]["to"]).to eql("#{site_url}#{to}") + expect(page.to_liquid["redirect"]["from"]).to eql("/2014/01/03/redirect-me-plz.html") + end + + context "with no leading slash" do + let(:to) { "bar" } + + it "redirects" do + expect(page.to_liquid).to have_key("redirect") + expect(page.to_liquid["redirect"]["to"]).to eql("#{site_url}/#{to}") + end + end + + context "with a trailing slash" do + let(:to) { "/bar/" } + + it "redirects" do + expect(page.to_liquid).to have_key("redirect") + expect(page.to_liquid["redirect"]["to"]).to eql("#{site_url}#{to}") + end + end + end + + context "redirecting to a URL" do + let(:to) { "https://foo.invalid" } + + it "redirects" do + expect(page.to_liquid["permalink"]).to eql("/2014/01/03/redirect-me-plz.html") + expect(page.to_liquid).to have_key("redirect") + expect(page.to_liquid["redirect"]["to"]).to eql("https://foo.invalid") + expect(page.to_liquid["redirect"]["from"]).to eql("/2014/01/03/redirect-me-plz.html") + end + end + end + end + end + + context "setting the paths" do + let(:from) { "/foo2" } + let(:to) { "/bar2" } + + before { subject.set_paths(from, to) } + + it "sets the paths" do + expect(subject.to_liquid["permalink"]).to eql(from) + expect(subject.to_liquid).to have_key("redirect") + expect(subject.to_liquid["redirect"]["from"]).to eql(from) + expect(subject.to_liquid["redirect"]["to"]).to eql("#{site_url}#{to}") + end + end + + context "generating" do + before { site.generate } + let(:output) { Jekyll::Renderer.new(site, subject, site.site_payload).run } + + it "renders the template" do + expect(output).to_not be_nil + expect(output.to_s).to_not be_empty + end + + it "contains the meta refresh tag" do + expect(output).to match("<meta http-equiv=\"refresh\" content=\"0; url=#{site_url}#{to}\">") + end + + it "contains the javascript redirect" do + expect(output).to match("<script>location=\"#{site_url}#{to}\"</script>") + end + + it "contains canonical link in header" do + expect(output).to match("<link rel=\"canonical\" href=\"#{site_url}#{to}\">") + end + + it "contains the clickable link" do + expect(output).to match("<a href=\"#{site_url}#{to}\">Click here if you are not redirected.</a>") + end + end + + context "redirect from destination" do + context "when redirect from has no extension" do + let(:from) { "/foo" } + + it "adds .html" do + expected = File.expand_path "foo.html", site.dest + expect(subject.destination("/")).to eql(expected) + end + end + + context "when redirect from is a directory" do + let(:from) { "/foo/" } + + it "knows to add the index.html" do + expected = File.expand_path "foo/index.html", site.dest + expect(subject.destination("/")).to eql(expected) + end + end + + context "when redirect from is an HTML file" do + let(:from) { "/foo.html" } + + it "adds .html" do + expected = File.expand_path "foo.html", site.dest + expect(subject.destination("/")).to eql(expected) + end + end + + context "when redirect from is another extension" do + let(:from) { "/foo.htm" } + + it "doesn't add .html" do + expected = File.expand_path "foo.htm", site.dest + expect(subject.destination("/")).to eql(expected) + end + end + + context "when redirect from has no leading slash" do + let(:from) { "foo" } + + it "adds the slash" do + expected = File.expand_path "foo.html", site.dest + expect(subject.destination("/")).to eql(expected) + end + end + end + + context "output extension" do + context "with an extension" do + let(:from) { "foo.htm" } + + it "honors the extension" do + expect(subject.output_ext).to eql(".htm") + end + end + + context "with a trailing slash" do + let(:from) { "foo/" } + + it "uses HTML" do + expect(subject.output_ext).to eql(".html") + end + end + + context "with no slash" do + let(:from) { "foo" } + + it "uses HTML" do + expect(subject.output_ext).to eql(".html") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/redirectable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/redirectable_spec.rb new file mode 100644 index 000000000000..c9a210856caa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/jekyll_redirect_from/redirectable_spec.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +class RedirectableTestHelper + include JekyllRedirectFrom::Redirectable + attr_reader :to_liquid + + def initialize(data) + @to_liquid = data + end +end + +RSpec.describe JekyllRedirectFrom::Redirectable do + let(:data) { "" } + subject { RedirectableTestHelper.new(data) } + + context "with strings" do + let(:data) { { "redirect_from" => "/foo", "redirect_to" => "/bar" } } + + it "returns redirect_from" do + expect(subject.redirect_from).to eql(["/foo"]) + end + + it "returns redirect_to" do + expect(subject.redirect_to).to eql("/bar") + end + end + + context "with arrays" do + let(:data) { { "redirect_from" => ["/foo"], "redirect_to" => ["/bar"] } } + + it "returns redirect_from" do + expect(subject.redirect_from).to eql(["/foo"]) + end + + it "returns redirect_to" do + expect(subject.redirect_to).to eql("/bar") + end + end + + context "with fields missing" do + let(:data) { {} } + + it "returns an empty array for redirect_from" do + expect(subject.redirect_from).to eql([]) + end + + it "returns nil for redirect_to" do + expect(subject.redirect_to).to be_nil + end + end + + context "with nils" do + let(:data) { { "redirect_from" => nil, "redirect_to" => nil } } + + it "returns an empty array for redirect_from" do + expect(subject.redirect_from).to eql([]) + end + + it "returns nil for redirect_to" do + expect(subject.redirect_to).to be_nil + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/spec_helper.rb new file mode 100644 index 000000000000..ef597e79b47a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-redirect-from-0.16.0/spec/spec_helper.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +require "jekyll" +require File.expand_path("lib/jekyll-redirect-from.rb") + +RSpec.configure do |config| + config.run_all_when_everything_filtered = true + config.filter_run :focus + + config.expect_with :rspec do |c| + c.syntax = :expect + end + + config.before(:each) do + Jekyll.logger.log_level = :error + dest_path.rmtree if dest_path.exist? + site.reset + end + + config.after(:each) do + dest_path.rmtree if dest_path.exist? + end + + def fixtures_path + Pathname.new(__dir__).join("fixtures") + end + + def dest_path + Pathname.new(site.dest) + end + + def dest_dir(*paths) + dest_path.join(*paths) + end + + def config + Jekyll.configuration( + "source" => fixtures_path.to_s, + "destination" => fixtures_path.join("_site").to_s, + "collections" => { + "articles" => { "output" => true }, + "authors" => {}, + }, + "url" => "http://jekyllrb.com", + "plugins" => [ + "jekyll-redirect-from", + "jekyll-sitemap", + ], + "defaults" => [{ + "scope" => { "path" => "" }, + "values" => { "layout" => "layout" }, + }] + ) + end + + def site + @site ||= Jekyll::Site.new(config) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links.rb new file mode 100644 index 000000000000..91bed7a02dfe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "jekyll" +require_relative "jekyll-relative-links/generator" +require_relative "jekyll-relative-links/context" + +module JekyllRelativeLinks +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links/context.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links/context.rb new file mode 100644 index 000000000000..9ed53892ae6d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links/context.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module JekyllRelativeLinks + class Context + attr_reader :site + + def initialize(site) + @site = site + end + + def registers + { :site => site } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links/generator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links/generator.rb new file mode 100644 index 000000000000..fb8fde513f90 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links/generator.rb @@ -0,0 +1,157 @@ +# frozen_string_literal: true + +module JekyllRelativeLinks + class Generator < Jekyll::Generator + attr_accessor :site, :config + + # Use Jekyll's native relative_url filter + include Jekyll::Filters::URLFilters + + LINK_TEXT_REGEX = %r!(.*?)!.freeze + FRAGMENT_REGEX = %r!(#.+?)?!.freeze + INLINE_LINK_REGEX = %r!\[#{LINK_TEXT_REGEX}\]\(([^\)]+?)#{FRAGMENT_REGEX}\)!.freeze + REFERENCE_LINK_REGEX = %r!^\s*?\[#{LINK_TEXT_REGEX}\]: (.+?)#{FRAGMENT_REGEX}\s*?$!.freeze + LINK_REGEX = %r!(#{INLINE_LINK_REGEX}|#{REFERENCE_LINK_REGEX})!.freeze + CONVERTER_CLASS = Jekyll::Converters::Markdown + CONFIG_KEY = "relative_links" + ENABLED_KEY = "enabled" + COLLECTIONS_KEY = "collections" + LOG_KEY = "Relative Links:" + + safe true + priority :lowest + + def initialize(config) + @config = config + end + + def generate(site) + return if disabled? + + @site = site + @context = context + + documents = site.pages + documents = site.pages + site.docs_to_write if collections? + + documents.each do |document| + next unless markdown_extension?(document.extname) + next if document.is_a?(Jekyll::StaticFile) + next if excluded?(document) + + replace_relative_links!(document) + end + end + + def replace_relative_links!(document) + url_base = File.dirname(document.relative_path) + return document if document.content.nil? + + document.content = document.content.dup.gsub(LINK_REGEX) do |original| + link_type, link_text, relative_path, fragment = link_parts(Regexp.last_match) + next original unless replaceable_link?(relative_path) + + path = path_from_root(relative_path, url_base) + url = url_for_path(path) + next original unless url + + replacement_text(link_type, link_text, url, fragment) + end + rescue ArgumentError => e + raise e unless e.to_s.start_with?("invalid byte sequence in UTF-8") + end + + private + + def link_parts(matches) + link_type = matches[2] ? :inline : :reference + link_text = matches[link_type == :inline ? 2 : 5] + relative_path = matches[link_type == :inline ? 3 : 6] + fragment = matches[link_type == :inline ? 4 : 7] + [link_type, link_text, relative_path, fragment] + end + + def context + @context ||= JekyllRelativeLinks::Context.new(site) + end + + def markdown_extension?(extension) + markdown_converter.matches(extension) + end + + def markdown_converter + @markdown_converter ||= site.find_converter_instance(CONVERTER_CLASS) + end + + def url_for_path(path) + target = potential_targets.find { |p| p.relative_path.sub(%r!\A/!, "") == path } + relative_url(target.url) if target&.url + end + + def potential_targets + @potential_targets ||= site.pages + site.static_files + site.docs_to_write + end + + def path_from_root(relative_path, url_base) + relative_path.sub!(%r!\A/!, "") + absolute_path = File.expand_path(relative_path, url_base) + absolute_path.sub(%r!\A#{Regexp.escape(Dir.pwd)}/!, "") + end + + def replacement_text(type, text, url, fragment = nil) + url << fragment if fragment + + if type == :inline + "[#{text}](#{url})" + else + "\n[#{text}]: #{url}" + end + end + + def absolute_url?(string) + return unless string + + Addressable::URI.parse(string).absolute? + rescue Addressable::URI::InvalidURIError + nil + end + + def fragment?(string) + string&.start_with?("#") + end + + def replaceable_link?(string) + !fragment?(string) && !absolute_url?(string) + end + + def option(key) + config[CONFIG_KEY] && config[CONFIG_KEY][key] + end + + def disabled? + option(ENABLED_KEY) == false + end + + def collections? + option(COLLECTIONS_KEY) == true + end + + def excluded?(document) + return false unless option("exclude") + + entry_filter = if document.respond_to?(:collection) + document.collection.entry_filter + else + global_entry_filter + end + + entry_filter.glob_include?(option("exclude"), document.relative_path).tap do |excluded| + Jekyll.logger.debug(LOG_KEY, "excluded #{document.relative_path}") if excluded + end + end + + def global_entry_filter + @global_entry_filter ||= Jekyll::EntryFilter.new(site) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links/version.rb new file mode 100644 index 000000000000..b339e79d0fb4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-relative-links-0.6.1/lib/jekyll-relative-links/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module JekyllRelativeLinks + VERSION = "0.6.1" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme.rb new file mode 100644 index 000000000000..adc72e475170 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require "jekyll" +require "fileutils" +require "tempfile" +require "addressable" +require "net/http" +require "zip" + +$LOAD_PATH.unshift(File.dirname(__FILE__)) + +module Jekyll + module RemoteTheme + class DownloadError < StandardError; end + + autoload :Downloader, "jekyll-remote-theme/downloader" + autoload :MockGemspec, "jekyll-remote-theme/mock_gemspec" + autoload :Munger, "jekyll-remote-theme/munger" + autoload :Theme, "jekyll-remote-theme/theme" + autoload :VERSION, "jekyll-remote-theme/version" + + CONFIG_KEY = "remote_theme" + LOG_KEY = "Remote Theme:" + TEMP_PREFIX = "jekyll-remote-theme-" + + def self.init(site) + Munger.new(site).munge! + end + end +end + +Jekyll::Hooks.register :site, :after_reset do |site| + Jekyll::RemoteTheme.init(site) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/downloader.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/downloader.rb new file mode 100644 index 000000000000..09f171a6c099 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/downloader.rb @@ -0,0 +1,117 @@ +# frozen_string_literal: true + +module Jekyll + module RemoteTheme + class Downloader + PROJECT_URL = "https://github.com/benbalter/jekyll-remote-theme" + USER_AGENT = "Jekyll Remote Theme/#{VERSION} (+#{PROJECT_URL})" + MAX_FILE_SIZE = 1 * (1024 * 1024 * 1024) # Size in bytes (1 GB) + NET_HTTP_ERRORS = [ + Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::OpenTimeout, + Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError, + ].freeze + + def initialize(theme) + @theme = theme + end + + def run + if downloaded? + Jekyll.logger.debug LOG_KEY, "Using existing #{theme.name_with_owner}" + return + end + + download + unzip + end + + def downloaded? + @downloaded ||= theme_dir_exists? && !theme_dir_empty? + end + + private + + attr_reader :theme + + def zip_file + @zip_file ||= Tempfile.new([TEMP_PREFIX, ".zip"], :binmode => true) + end + + def download + Jekyll.logger.debug LOG_KEY, "Downloading #{zip_url} to #{zip_file.path}" + Net::HTTP.start(zip_url.host, zip_url.port, :use_ssl => true) do |http| + http.request(request) do |response| + raise_unless_sucess(response) + enforce_max_file_size(response.content_length) + response.read_body do |chunk| + zip_file.write chunk + end + end + end + @downloaded = true + rescue *NET_HTTP_ERRORS => e + raise DownloadError, e.message + end + + def request + return @request if defined? @request + + @request = Net::HTTP::Get.new zip_url.request_uri + @request["User-Agent"] = USER_AGENT + @request + end + + def raise_unless_sucess(response) + return if response.is_a?(Net::HTTPSuccess) + + raise DownloadError, "#{response.code} - #{response.message} - Loading URL: #{zip_url}" + end + + def enforce_max_file_size(size) + return unless size && size > MAX_FILE_SIZE + + raise DownloadError, "Maximum file size of #{MAX_FILE_SIZE} bytes exceeded" + end + + def unzip + Jekyll.logger.debug LOG_KEY, "Unzipping #{zip_file.path} to #{theme.root}" + + # File IO is already open, rewind pointer to start of file to read + zip_file.rewind + + Zip::File.open(zip_file) do |archive| + archive.each { |file| file.extract path_without_name_and_ref(file.name) } + end + ensure + zip_file.close + zip_file.unlink + end + + # Full URL to codeload zip download endpoint for the given theme + def zip_url + @zip_url ||= Addressable::URI.new( + :scheme => theme.scheme, + :host => "codeload.#{theme.host}", + :path => [theme.owner, theme.name, "zip", theme.git_ref].join("/") + ).normalize + end + + def theme_dir_exists? + theme.root && Dir.exist?(theme.root) + end + + def theme_dir_empty? + Dir["#{theme.root}/*"].empty? + end + + # Codeload generated zip files contain a top level folder in the form of + # THEME_NAME-GIT_REF/. While requests for Git repos are case insensitive, + # the zip subfolder will respect the case in the repository's name, thus + # making it impossible to predict the true path to the theme. In case we're + # on a case-sensitive file system, strip the parent folder from all paths. + def path_without_name_and_ref(path) + Jekyll.sanitized_path theme.root, path.split("/").drop(1).join("/") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/mock_gemspec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/mock_gemspec.rb new file mode 100644 index 000000000000..8414b9b87218 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/mock_gemspec.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module Jekyll + module RemoteTheme + # Jekyll::Theme expects the theme's gemspec to tell it things like + # the path to the theme and runtime dependencies. MockGemspec serves as a + # stand in, since remote themes don't need Gemspecs + class MockGemspec + extend Forwardable + def_delegator :theme, :root, :full_gem_path + + DEPENDENCY_PREFIX = %r!^\s*[a-z]+\.add_(?:runtime_)?dependency!.freeze + DEPENDENCY_REGEX = %r!#{DEPENDENCY_PREFIX}\(?\s*["']([a-z_-]+)["']!.freeze + + def initialize(theme) + @theme = theme + end + + def runtime_dependencies + @runtime_dependencies ||= dependency_names.map do |name| + Gem::Dependency.new(name) + end + end + + private + + def contents + @contents ||= File.read(path, :encoding => "utf-8") if path + end + + def path + @path ||= potential_paths.find { |path| File.exist? path } + end + + def potential_paths + [theme.name, "jekyll-theme-#{theme.name}"].map do |filename| + File.expand_path "#{filename}.gemspec", theme.root + end + end + + def dependency_names + @dependency_names ||= if contents + contents.scan(DEPENDENCY_REGEX).flatten + else + [] + end + end + + attr_reader :theme + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/munger.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/munger.rb new file mode 100644 index 000000000000..63d2d1d119bf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/munger.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +module Jekyll + module RemoteTheme + class Munger + extend Forwardable + def_delegator :site, :config + attr_reader :site + + def initialize(site) + @site = site + end + + def munge! + return unless raw_theme + + unless theme.valid? + Jekyll.logger.error LOG_KEY, "#{raw_theme.inspect} is not a valid remote theme" + return + end + + Jekyll.logger.info LOG_KEY, "Using theme #{theme.name_with_owner}" + unless munged? + downloader.run + configure_theme + end + enqueue_theme_cleanup + + theme + end + + private + + def munged? + site.theme&.is_a?(Jekyll::RemoteTheme::Theme) + end + + def theme + @theme ||= Theme.new(raw_theme) + end + + def raw_theme + config[CONFIG_KEY] + end + + def downloader + @downloader ||= Downloader.new(theme) + end + + def configure_theme + return unless theme + + site.config["theme"] = theme.name + site.theme = theme + site.theme.configure_sass if site.theme.respond_to?(:configure_sass) + site.send(:configure_include_paths) + site.plugin_manager.require_theme_deps + end + + def enqueue_theme_cleanup + at_exit do + Jekyll.logger.debug LOG_KEY, "Cleaning up #{theme.root}" + FileUtils.rm_rf theme.root + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/theme.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/theme.rb new file mode 100644 index 000000000000..332ec0e77aef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/theme.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +module Jekyll + module RemoteTheme + class Theme < Jekyll::Theme + OWNER_REGEX = %r!(?<owner>[a-z0-9\-]+)!i.freeze + NAME_REGEX = %r!(?<name>[a-z0-9\._\-]+)!i.freeze + REF_REGEX = %r!@(?<ref>[a-z0-9\._\-]+)!i.freeze # May be a branch, tag, or commit + THEME_REGEX = %r!\A#{OWNER_REGEX}/#{NAME_REGEX}(?:#{REF_REGEX})?\z!i.freeze + + # Initializes a new Jekyll::RemoteTheme::Theme + # + # raw_theme can be in the form of: + # + # 1. owner/theme-name - a GitHub owner + theme-name string + # 2. owner/theme-name@git_ref - a GitHub owner + theme-name + Git ref string + # 3. http[s]://github.<yourEnterprise>.com/owner/theme-name + # - An enterprise GitHub instance + a GitHub owner + a theme-name string + # 4. http[s]://github.<yourEnterprise>.com/owner/theme-name@git_ref + # - An enterprise GitHub instance + a GitHub owner + a theme-name + Git ref string + def initialize(raw_theme) + @raw_theme = raw_theme.to_s.downcase.strip + super(@raw_theme) + end + + def name + theme_parts[:name] + end + + def owner + theme_parts[:owner] + end + + def host + uri&.host + end + + def scheme + uri&.scheme + end + + def name_with_owner + [owner, name].join("/") + end + alias_method :nwo, :name_with_owner + + def valid? + return false unless uri && theme_parts && name && owner + + host && valid_hosts.include?(host) + end + + def git_ref + theme_parts[:ref] || "HEAD" + end + + def root + @root ||= File.realpath Dir.mktmpdir(TEMP_PREFIX) + end + + def inspect + "#<Jekyll::RemoteTheme::Theme host=\"#{host}\" owner=\"#{owner}\" name=\"#{name}\"" \ + " ref=\"#{git_ref}\" root=\"#{root}\">" + end + + private + + def uri + return @uri if defined? @uri + + @uri = if THEME_REGEX.match?(@raw_theme) + Addressable::URI.new( + :scheme => "https", + :host => "github.com", + :path => @raw_theme + ) + else + Addressable::URI.parse @raw_theme + end + rescue Addressable::URI::InvalidURIError + @uri = nil + end + + def theme_parts + @theme_parts ||= uri.path[1..-1].match(THEME_REGEX) if uri + end + + def gemspec + @gemspec ||= MockGemspec.new(self) + end + + def valid_hosts + @valid_hosts ||= [ + "github.com", + ENV["PAGES_GITHUB_HOSTNAME"], + ENV["GITHUB_HOSTNAME"], + ].compact.to_set + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/version.rb new file mode 100644 index 000000000000..f3d1621a30c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-remote-theme-0.4.3/lib/jekyll-remote-theme/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Jekyll + module RemoteTheme + VERSION = "0.4.3" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter.rb new file mode 100644 index 000000000000..ed73199d6ec1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "jekyll-sass-converter/version" +require "jekyll/converters/scss" +require "jekyll/converters/sass" + +module JekyllSassConverter +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter/version.rb new file mode 100644 index 000000000000..47e34f8f8c98 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module JekyllSassConverter + VERSION = "1.5.2".freeze +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/sass.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/sass.rb new file mode 100644 index 000000000000..1124988c76ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/sass.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require "sass" +require "jekyll/utils" +require "jekyll/converters/scss" + +module Jekyll + module Converters + class Sass < Scss + safe true + priority :low + + def matches(ext) + ext =~ %r!^\.sass$!i + end + + def syntax + :sass + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/scss.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/scss.rb new file mode 100644 index 000000000000..fe41cfed2976 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/scss.rb @@ -0,0 +1,132 @@ +# frozen_string_literal: true + +require "sass" +require "jekyll/utils" + +module Jekyll + module Converters + class Scss < Converter + BYTE_ORDER_MARK = %r!^\xEF\xBB\xBF! + SyntaxError = Class.new(ArgumentError) + + safe true + priority :low + + ALLOWED_STYLES = %w(nested expanded compact compressed).freeze + + def matches(ext) + ext =~ %r!^\.scss$!i + end + + def output_ext(_ext) + ".css" + end + + def safe? + !!@config["safe"] + end + + def jekyll_sass_configuration + options = @config["sass"] || {} + unless options["style"].nil? + options["style"] = options["style"].to_s.gsub(%r!\A:!, "").to_sym + end + options + end + + def sass_build_configuration_options(overrides) + if safe? + { + :load_paths => sass_load_paths, + :syntax => syntax, + :style => sass_style, + :cache => false, + } + else + Jekyll::Utils.symbolize_hash_keys( + Jekyll::Utils.deep_merge_hashes( + jekyll_sass_configuration, + overrides + ) + ) + end + end + + def syntax + :scss + end + + def sass_dir + return "_sass" if jekyll_sass_configuration["sass_dir"].to_s.empty? + jekyll_sass_configuration["sass_dir"] + end + + def sass_style + style = jekyll_sass_configuration.fetch("style", :compact) + ALLOWED_STYLES.include?(style.to_s) ? style.to_sym : :compact + end + + def user_sass_load_paths + Array(jekyll_sass_configuration["load_paths"]) + end + + def sass_dir_relative_to_site_source + Jekyll.sanitized_path(site_source, sass_dir) + end + + def sass_load_paths + paths = user_sass_load_paths + [sass_dir_relative_to_site_source] + + if safe? + # Sanitize paths to prevent any attack vectors (.e.g. `/**/*`) + paths.map! { |path| Jekyll.sanitized_path(site_source, path) } + end + + # Expand file globs (e.g. `node_modules/*/node_modules` ) + Dir.chdir(site_source) do + paths = paths.map { |path| Dir.glob(path) }.flatten.uniq + + paths.map! do |path| + if safe? + # Sanitize again in case globbing was able to do something crazy. + Jekyll.sanitized_path(site_source, path) + else + File.expand_path(path) + end + end + end + + paths.select { |path| File.directory?(path) } + end + + def allow_caching? + !safe? + end + + def add_charset? + !!jekyll_sass_configuration["add_charset"] + end + + def sass_configs + sass_build_configuration_options({ + "syntax" => syntax, + "cache" => allow_caching?, + "load_paths" => sass_load_paths, + }) + end + + def convert(content) + output = ::Sass.compile(content, sass_configs) + replacement = add_charset? ? '@charset "UTF-8";' : "" + output.sub(BYTE_ORDER_MARK, replacement) + rescue ::Sass::SyntaxError => e + raise SyntaxError, "#{e} on line #{e.sass_line}" + end + + private + def site_source + @site_source ||= File.expand_path(@config["source"]).freeze + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.github/workflows/actions/memprof.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.github/workflows/actions/memprof.rb new file mode 100644 index 000000000000..45143d8b9326 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.github/workflows/actions/memprof.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require 'jekyll' +require 'memory_profiler' + +MemoryProfiler.report(allow_files: 'lib/jekyll-seo-tag') do + Jekyll::PluginManager.require_from_bundler + Jekyll::Commands::Build.process({ + "source" => File.expand_path(ARGV[0]), + "destination" => File.expand_path("#{ARGV[0]}/_site"), + "disable_disk_cache" => true, + }) + puts '' +end.pretty_print(scale_bytes: true, normalize_paths: true) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.github/workflows/third-party.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.github/workflows/third-party.yml new file mode 100644 index 000000000000..e450e8a003a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.github/workflows/third-party.yml @@ -0,0 +1,61 @@ +name: Third-Party Repository Profiling + +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + build_n_profile: + if: "!contains(github.event.commits[0].message, '[ci skip]')" + runs-on: 'ubuntu-latest' + steps: + - name: Checkout Jekyll SEO Tag + uses: actions/checkout@v2 + with: + fetch-depth: 5 + path: jekyll-seo-tag + - name: Checkout Third-Party Repository (WITHOUT SEO Tag) + uses: actions/checkout@v2 + with: + repository: ashmaroli/tomjoht.github.io + ref: 'no-seo-tag' + path: alpha-sandbox + - name: Checkout Same Third-Party Repository (WITH SEO Tag) + uses: actions/checkout@v2 + with: + repository: ashmaroli/tomjoht.github.io + ref: 'seo-tag' + path: sandbox + - name: Set up Ruby + uses: actions/setup-ruby@v1 + with: + ruby-version: 2.6.x + - name: Set up Dependencies Cache + uses: actions/cache@v1 + with: + path: sandbox/vendor/bundle + key: ubuntu-latest-gems- + restore-keys: | + ubuntu-latest-gems- + - name: Set up Dependencies + run: | + gem update --system --no-document + gem update bundler --no-document + bundle config gemfile sandbox/Gemfile + bundle config path vendor/bundle + bundle install --jobs 4 --retry 3 + - name: Run Jekyll Build (WITHOUT SEO Tag) 3 times + run: | + bundle exec jekyll build -s alpha-sandbox -d alpha-sandbox/_site --trace + bundle exec jekyll build -s alpha-sandbox -d alpha-sandbox/_site --trace + bundle exec jekyll build -s alpha-sandbox -d alpha-sandbox/_site --trace + - name: Run Jekyll Build (WITH SEO Tag) 3 times + run: | + bundle exec jekyll build -s sandbox -d sandbox/_site --trace + bundle exec jekyll build -s sandbox -d sandbox/_site --trace + bundle exec jekyll build -s sandbox -d sandbox/_site --trace + - name: Memory Analysis of Jekyll Build (WITH SEO Tag) + run: bundle exec ruby jekyll-seo-tag/.github/workflows/actions/memprof.rb sandbox diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.gitignore b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.gitignore new file mode 100644 index 000000000000..6256dfa7a2a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.gitignore @@ -0,0 +1,9 @@ +*.gem +.bundle +.yardoc +Gemfile.lock +pkg +spec/reports/ +spec/fixtures/.jekyll-cache +tmp/ +vendor/bundle diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.rspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.rspec new file mode 100644 index 000000000000..83e16f804474 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.rspec @@ -0,0 +1,2 @@ +--color +--require spec_helper diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.rubocop.yml new file mode 100644 index 000000000000..7c33120c64f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.rubocop.yml @@ -0,0 +1,19 @@ +inherit_from: .rubocop_todo.yml + +require: rubocop-jekyll +inherit_gem: + rubocop-jekyll: .rubocop.yml + +AllCops: + TargetRubyVersion: 2.4 + Exclude: + - vendor/**/* + +Layout/LineLength: + Exclude: + - spec/**/* + - jekyll-seo-tag.gemspec + +Metrics/BlockLength: + Exclude: + - spec/**/* diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.rubocop_todo.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.rubocop_todo.yml new file mode 100644 index 000000000000..cb469c1e3356 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.rubocop_todo.yml @@ -0,0 +1,13 @@ +# This configuration was generated by +# `rubocop --auto-gen-config --auto-gen-only-exclude` +# on 2020-03-20 11:41:46 +0100 using RuboCop version 0.80.1. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 1 +# Cop supports --auto-correct. +Lint/ToJSON: + Exclude: + - 'lib/jekyll-seo-tag/json_ld_drop.rb' diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.travis.yml new file mode 100644 index 000000000000..d5ffa5c2bf88 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/.travis.yml @@ -0,0 +1,18 @@ +language: ruby +cache: bundler +rvm: + - 2.5 + - 2.7 + +before_install: + - gem update --system + - gem install bundler + +script: script/cibuild + +env: + global: + - NOKOGIRI_USE_SYSTEM_LIBRARIES=true + matrix: + - JEKYLL_VERSION="~> 3.9" + - JEKYLL_VERSION="~> 4.0" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/Gemfile new file mode 100644 index 000000000000..40f83de9b8c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/Gemfile @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +gemspec + +gem "jekyll", ENV["JEKYLL_VERSION"] if ENV["JEKYLL_VERSION"] +gem "kramdown-parser-gfm" if ENV["JEKYLL_VERSION"] == "~> 3.9" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/History.markdown b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/History.markdown new file mode 100644 index 000000000000..ec186708cc77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/History.markdown @@ -0,0 +1,193 @@ +## 2.7.1 / 2020-10-18 + +### Development Fixes + + * refactor: mutate site payload instead of duplicating it (#419) + +## 2.7.0 / 2020-10-18 + +### Minor Enhancements + + * Change pagination message with `seo_paginator_message` option (#324) + * Make Twitter Summary Card without having Twitter account (#284) + * Prefer site.tagline to site.description for page title (#356) + * Render og:locale meta only when defined explicitly (#388) + +### Bug Fixes + + * Ensure a single leading `@` for twitter usernames (#367) + +### Development Fixes + + * chore(deps): require Ruby > 2.4.0 EOL + * test: fix locale specs that use the fallback locale (#360) + * refactor: Replace read-only empty hash with private constant (#418) + * refactor: Mutate hash literals instead of duplicating them (#417) + * refactor: Reduce allocations of instance-agnostic objects (#376) + * refactor: Memoize #author_hash in SeoTag::AuthorDrop (#342) + * refactor: simplify conditional in SeoTag::Drop#date_modified (#343) + * chore(ci): profile seo-tag plugin on a third-party repository (#414) + * chore(ci): Jekyll v4.0 (#372) + * chore(ci): test against current stable Ruby 2.5 and 2.7 (#385) + * style: align with latest jekyll-rubocop (#382) + * fix: Travis builds for Jekyll 3.x (#415) + +### Documentation + + * Structured Data Testing Tool is deprecated (#409) + * Rename Google webmaster tools to Google Search Console (#403) + * Improve documentation on plugin usage (#399) + * remove Google+ from example snippet (#358) + * HTTPS link to https://ogp.me/ (#359) + * HTTPS links to schema.org (#350) + * use example.com for example URL (#351) + +## 2.6.1 / 2019-05-17 + +### Development Fixes + + * Test against Jekyll 4.x (#336) + +## 2.6.0 / 2019-03-16 + +### Minor Enhancements + + * Twitter Image and Title (#330) + +### Bug Fixes + + * Do not cache the drop payload for SeoTag (#306) + * Update url of schema website (#296) + +### Development Fixes + + * Relax version constraint on Bundler (#325) + * chore(ci): Add Ruby 2.6, drop Ruby 2.3 (#326) + * chore (ci): remove deprecated `sudo: false` in .travis.yml (#333) + * Lint Ruby code with rubocop-jekyll gem (#302) + * chore(deps): bump rubocop-jekyll to v0.4 (#320) + * chore(deps): bump rubocop-jekyll to v0.3 (#316) + * Correct RuboCop offenses in spec files (#319) + +### Documentation + + * Rectify error in Usage documentation (#328) + +## 2.5.0 / 2018-05-18 + + * Docs: Prevent GitHub Pages from processing Liquid raw tag (#276) + +### Documentation + + * Use gems config key for Jekyll &lt; 3.5.0 (#255) + * docs/usage - replace &#34;below&#34; with correct link (#280) + +### Development Fixes + + * Test against Ruby 2.5 (#260) + * add tests for twitter.card types (#289) + * Target Ruby 2.3 and Rubocop 0.56.0 (#292) + +### Minor Enhancements + + * Add webmaster_verifications for baidu (#263) + * Include page number in title (#250) + * Configure default Twitter summary card type (V2) (#225) + +## 2.4.0 / 2017-12-04 + +### Minor + + * Add meta generator (#236) + * Consistently use self-closing tags (#246) + * Strip null values from JSON-LD hash (#249) + +### Documentation + + * Avoid deprecation warning when building docs (#243) + +### Development Fixes + + * Test against latest Rubies (#242) + * Use Nokigiri on CI (#181) + +## 2.3.0 + +### Minor Enhancements + + * Use canonical_url specified in page if present #211 + * Fix for image.path causing an invalid url error #228 + * Ensure `site.data.authors` is properly formatted before attempting to retrieve author meta #227 + * Convert author, image, and JSON-LD to dedicated drops #229 + * Cache parsed template #231 + * Define path with `__dir__` #232 + +### Documentation + + * gems: is deprecated in current Jekyll version of github-pages #230 + +## 2.2.3 + + * Guard against the author's Twitter handle being Nil when stripping @'s #203 + * Guard against empty title or description strings #206 + +## 2.2.2 + +### Minor Enhancements + + * Guard against arrays in subhashes #197 + * Guard against invalid or missing URLs #199 + +### Development fixes + + * Remove dynamic GitHub Pages logic from Gemfile #194 + +## 2.2.1 + + * Convert template logic to a Liquid Drop (significant performance improvement) (#184) + * Fix for JSON-LD validation warning for images missing required properties (#183) + +## 2.2.0 + +### Major Enhancements + + * Add author meta (#103) + * Add og:locale support #166 + * Add support for Bing and Yandex webmaster tools. Closes #147 (#148) + * Add SEO author and date modified to validate JSON-LD output (#151) + +### Minor Enhancements + + * Use `|` for title separator (#162) + * Use `og:image` for twitter image (#174) + +### Development Fixes + + * Style fixes (#170, #157, #149) + * Test against latest version of Jekyll (#171) + * Bump dev dependencies (#172) + * Remove Rake dependency (#180) + +## 2.1.0 + +### Major Enhancement + + * Use new URL filters (#123) + +### Minor Enhancements + + * Wraps logo image json data in a publisher property (#133) + * Fix duplicated `escape_once` (#93) + * Simplify minify regex (#125) + * Don't mangle text with newlines #126 + +### Documentation + + * Add front matter default example for image (#132) + * Fix tiny typo (#106) + * add example usage of social profiles (#139) + +### Development + + * Inherit Jekyll's rubocop config for consistency (#109) + * Correct spelling in .travis.yml (#112) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/LICENSE.txt new file mode 100644 index 000000000000..3b5c0a6ed8b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present Ben Balter and the jekyll-seo-tag contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/README.md new file mode 100644 index 000000000000..9a9557def202 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/README.md @@ -0,0 +1,33 @@ +## About Jekyll SEO Tag + +A Jekyll plugin to add metadata tags for search engines and social networks to better index and display your site's content. + +[![Gem Version](https://badge.fury.io/rb/jekyll-seo-tag.svg)](https://badge.fury.io/rb/jekyll-seo-tag) [![Build Status](https://travis-ci.org/jekyll/jekyll-seo-tag.svg)](https://travis-ci.org/jekyll/jekyll-seo-tag) + +## What it does + +Jekyll SEO Tag adds the following meta tags to your site: + +* Page title, with site title or description appended +* Page description +* Canonical URL +* Next and previous URLs on paginated pages +* [JSON-LD Site and post metadata](https://developers.google.com/search/docs/guides/intro-structured-data) for richer indexing +* [Open Graph](https://ogp.me/) title, description, site title, and URL (for Facebook, LinkedIn, etc.) +* [Twitter Summary Card](https://dev.twitter.com/cards/overview) metadata + +While you could theoretically add the necessary metadata tags yourself, Jekyll SEO Tag provides a battle-tested template of crowdsourced best-practices. + +## What it doesn't do + +Jekyll SEO tag is designed to output machine-readable metadata for search engines and social networks to index and display. If you're looking for something to analyze your Jekyll site's structure and content (e.g., more traditional SEO optimization), take a look at [The Jekyll SEO Gem](https://github.com/pmarsceill/jekyll-seo-gem). + +Jekyll SEO tag isn't designed to accommodate every possible use case. It should work for most site out of the box and without a laundry list of configuration options that serve only to confuse most users. + +## Documentation + +For more information, see: + +* [Installation](installation.md) +* [Usage](usage.md) +* [Advanced usage](advanced-usage.md) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/_config.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/_config.yml new file mode 100644 index 000000000000..286cdd04acde --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/_config.yml @@ -0,0 +1,10 @@ +title: Jekyll SEO Tag +description: A Jekyll plugin to add metadata tags for search engines and social networks to better index and display your site's content. + +permalink: pretty + +plugins: + - jekyll-seo-tag + - jekyll-sitemap + +theme: jekyll-theme-primer diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/_layouts/default.html new file mode 100644 index 000000000000..da8eec83f6a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/_layouts/default.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}" rel="stylesheet"> + {% seo %} + </head> + <body> + <div class="container markdown-body"> + <h1>{{ site.title }}</h1> + + {{ content }} + </div> + <script src="{{ "assets/javascript/anchor-js/anchor.min.js" | relative_url }}"></script> + <script>anchors.add();</script> + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/advanced-usage.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/advanced-usage.md new file mode 100644 index 000000000000..a0d0a5777081 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/advanced-usage.md @@ -0,0 +1,156 @@ +## Advanced usage + +Jekyll SEO Tag is designed to implement SEO best practices by default and to be the right fit for most sites right out of the box. If for some reason, you need more control over the output, read on: + +### Disabling `<title>` output + +If for some reason, you don't want the plugin to output `<title>` tags on each page, simply invoke the plugin within your template like so: + +<!-- {% raw %} --> +``` +{% seo title=false %} +``` +<!-- {% endraw %} --> + +### Author information + +Author information is used to propagate the `creator` field of Twitter summary cards. This should be an author-specific, not site-wide Twitter handle (the site-wide username be stored as `site.twitter.username`). + +*TL;DR: In most cases, put `author: [your Twitter handle]` in the document's front matter, for sites with multiple authors. If you need something more complicated, read on.* + +There are several ways to convey this author-specific information. Author information is found in the following order of priority: + +1. An `author` object, in the documents's front matter, e.g.: + + ```yml + author: + twitter: benbalter + ``` + +2. An `author` object, in the site's `_config.yml`, e.g.: + + ```yml + author: + twitter: benbalter + ``` + +3. `site.data.authors[author]`, if an author is specified in the document's front matter, and a corresponding key exists in `site.data.authors`. E.g., you have the following in the document's front matter: + + ```yml + author: benbalter + ``` + + And you have the following in `_data/authors.yml`: + + ```yml + benbalter: + picture: /img/benbalter.png + twitter: jekyllrb + + potus: + picture: /img/potus.png + twitter: whitehouse + ``` + + In the above example, the author `benbalter`'s Twitter handle will be resolved to `@jekyllrb`. This allows you to centralize author information in a single `_data/authors` file for site with many authors that require more than just the author's username. + + *Pro-tip: If `authors` is present in the document's front matter as an array (and `author` is not), the plugin will use the first author listed, as Twitter supports only one author.* + +4. An author in the document's front matter (the simplest way), e.g.: + + ```yml + author: benbalter + ``` + +5. An author in the site's `_config.yml`, e.g.: + + ```yml + author: benbalter + ``` + +### Customizing JSON-LD output + +The following options can be set for any particular page. While the default options are meant to serve most users in the most common circumstances, there may be situations where more precise control is necessary. + +* `seo` + * `name` - If the name of the thing that the page represents is different from the page title. (i.e.: "Frank's Café" vs "Welcome to Frank's Café") + * `type` - The type of things that the page represents. This must be a [Schema.org type](https://schema.org/docs/schemas.html), and will probably usually be something like [`BlogPosting`](https://schema.org/BlogPosting), [`NewsArticle`](https://schema.org/NewsArticle), [`Person`](https://schema.org/Person), [`Organization`](https://schema.org/Organization), etc. + * `links` - An array of other URLs that represent the same thing that this page represents. For instance, Jane's bio page might include links to Jane's GitHub and Twitter profiles. + * `date_modified` - Manually specify the `dateModified` field in the JSON-LD output to override Jekyll's own `dateModified`. + This field will take **first priority** for the `dateModified` JSON-LD output. This is useful when the file timestamp does not match the true time that the content was modified. A user may also install [Last Modified At](https://github.com/gjtorikian/jekyll-last-modified-at) which will offer an alternative way of providing for the `dateModified` field. + +### Customizing image output + +For most users, setting `image: [path-to-image]` on a per-page basis should be enough. If you need more control over how images are represented, the `image` property can also be an object, with the following options: + +* `path` - The relative path to the image. Same as `image: [path-to-image]` +* `height` - The height of the Open Graph (`og:image`) image +* `width` - The width of the Open Graph (`og:image`) image + +You can use any of the above, optional properties, like so: + +```yml +image: + path: /img/twitter.png + height: 100 + width: 100 +``` + +### Setting a default image + +You can define a default image using [Front Matter defaults](https://jekyllrb.com/docs/configuration/front-matter-defaults/), to provide a default Twitter Card or OGP image to all of your posts and pages. + +Here is a very basic example, that you are encouraged to adapt to your needs: + +```yml +defaults: + - scope: + path: "" + values: + image: /assets/images/default-card.png +``` + +### SmartyPants Titles + +Titles will be processed using [Jekyll's `smartify` filter](https://jekyllrb.com/docs/liquid/filters/). This will use SmartyPants to translate plain ASCII punctuation into "smart" typographic punctuation. This will not render or strip any Markdown you may be using in a page title. + +### Setting customized Canonical URL + +You can set custom Canonical URL for a page by specifying canonical_url option in page front matter. +E.g., you have the following in the page's front matter: +```yml +layout: post +title: Title of Your Post +canonical_url: 'https://github.com/jekyll/jekyll-seo-tag/' +``` + +Which will generate canonical_url with specified link in canonical_url. +```html +<link rel="canonical" href="https://github.com/jekyll/jekyll-seo-tag/" /> +``` + +If no canonical_url option was specified, then uses page url for generating canonical_url. +E.g., you have not specified canonical_url in front matter: +```yml +layout: post +title: Title of Your Post +``` + +Which will generate following canonical_url: +```html +<link rel="canonical" href="https://example.com/title-of-your-post" /> +``` + +### Customizing title modifier for paginated pages + +You can override the default title modifier for paginated pages from `Page %{current} of %{total} for ` to a string of your +choice by setting a `seo_paginator_message` key in your `_config.yml`. + +For example: + +```yml +seo_paginator_message: "%<current>s / %<total>s | " +``` + +While the value can be any string text, we recommend using a Ruby string-template containing the variables `current` and `total` +similar to the example above, to incorporate the current page-number and total number of paginated pages in the title. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/installation.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/installation.md new file mode 100644 index 000000000000..4a913403dab1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/installation.md @@ -0,0 +1,24 @@ +# Installing Jekyll SEO Tag + +1. Add the following to your site's `Gemfile`: + + ```ruby + gem 'jekyll-seo-tag' + ``` + +2. Add the following to your site's `_config.yml`: + + ```yml + plugins: + - jekyll-seo-tag + ``` + +If you are using a Jekyll version less than `3.5.0`, use the `gems` key instead of `plugins`. + +3. Add the following right before `</head>` in your site's template(s): + +<!-- {% raw %} --> + ```liquid + {% seo %} + ``` +<!-- {% endraw %} --> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/usage.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/usage.md new file mode 100644 index 000000000000..489c2331ab30 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/docs/usage.md @@ -0,0 +1,80 @@ +## Usage + +The SEO tag will respect any of the following if included in your site's `_config.yml` (and simply not include them if +they're not defined): + +* `title` - Your site's title (e.g., *Ben's Awesome Site*, *The GitHub Blog*, etc.), used as part of the title tag like +`Home | Ben's Awesome Site`. +* `tagline` - A short description (e.g., *A blog dedicated to reviewing cat gifs*), used as part of the title tag like +`Ben's Awesome Site | A blog dedicated to reviewing cat gifs` instead of `Ben's Awesome Site | Long description about a +blog dedicated to reviewing cat gifs` that would be used when `page.title` is not defined. +* `description` - A longer description used for the description meta tag. Also used as fallback for pages that don't +provide their own `description`, and also as part of the page's title tag if neither `page.title` nor `site.tagline` +has been defined. +* `url` - The full URL to your site. Note: `site.github.url` will be used by default. +* `author` - global author information (see [Advanced usage](advanced-usage.md#author-information)) +* `twitter` - The following properties are available: + * `twitter:card` - The site's default card type + * `twitter:username` - The site's Twitter handle. + + You'll want to describe them like so: + + ```yml + twitter: + username: benbalter + card: summary + ``` +* `facebook` - The following properties are available: + * `facebook:app_id` - a Facebook app ID for Facebook insights + * `facebook:publisher` - a Facebook page URL or ID of the publishing entity + * `facebook:admins` - a Facebook user ID for domain insights linked to a personal account + + You'll want to describe one or more like so: + + ```yml + facebook: + app_id: 1234 + publisher: 1234 + admins: 1234 + ``` +* `logo` - URL to a site-wide logo (e.g., `/assets/your-company-logo.png`) - If you would like the "publisher" property +to be present, you must add this field to your site's configuration, during the validation of the structured data by +Google Search Console, if the `logo` field is not validated, you will find errors inherent to the publisher in the +[Rich Results Testing Tool](https://search.google.com/test/rich-results) +* `social` - For [specifying social profiles](https://developers.google.com/search/docs/guides/enhance-site#add-your-sites-name-logo-and-social-links). +The following properties are available: + * `name` - If the user or organization name differs from the site's name + * `links` - An array of links to social media profiles. + + ```yml + social: + name: Ben Balter + links: + - https://twitter.com/BenBalter + - https://www.facebook.com/ben.balter + - https://www.linkedin.com/in/BenBalter + - https://github.com/benbalter + - https://keybase.io/benbalter + ``` +* `google_site_verification` for verifying ownership via Google Search Console +* Alternatively, verify ownership with several services at once using the following format: + ```yml + webmaster_verifications: + google: 1234 + bing: 1234 + alexa: 1234 + yandex: 1234 + baidu: 1234 + ``` +* `locale` - The locale these tags are marked up in. Of the format `language_TERRITORY`. Default is `en_US`. Takes priority +over existing config key `lang`. + +The SEO tag will respect the following YAML front matter if included in a post, page, or document: + +* `title` - The title of the post, page, or document +* `description` - A short description of the page's content +* `image` - URL to an image associated with the post, page, or document (e.g., `/assets/page-pic.jpg`) +* `author` - Page-, post-, or document-specific author information (see [Advanced usage](advanced-usage.md#author-information)) +* `locale` - Page-, post-, or document-specific locale information. Takes priority over existing front matter attribute `lang`. + +*Note:* Front matter defaults can be used for any of the above values as described in advanced usage with an image example. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/jekyll-seo-tag.gemspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/jekyll-seo-tag.gemspec new file mode 100644 index 000000000000..17eb92d969f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/jekyll-seo-tag.gemspec @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require_relative "lib/jekyll-seo-tag/version" + +Gem::Specification.new do |spec| + spec.name = "jekyll-seo-tag" + spec.version = Jekyll::SeoTag::VERSION + spec.authors = ["Ben Balter"] + spec.email = ["ben.balter@github.com"] + spec.summary = "A Jekyll plugin to add metadata tags for search engines and social networks to better index and display your site's content." + spec.homepage = "https://github.com/jekyll/jekyll-seo-tag" + spec.license = "MIT" + + # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or + # delete this section to allow pushing this gem to any host. + if spec.respond_to?(:metadata) + spec.metadata["allowed_push_host"] = "https://rubygems.org" + else + raise "RubyGems 2.0 or newer is required to protect against public gem pushes." + end + + spec.required_ruby_version = ">= 2.4.0" + + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r!^(test|spec|features)/!) } + spec.bindir = "exe" + spec.executables = spec.files.grep(%r!^exe/!) { |f| File.basename(f) } + spec.require_paths = ["lib"] + + spec.add_dependency "jekyll", ">= 3.8", "< 5.0" + spec.add_development_dependency "bundler", ">= 1.15" + spec.add_development_dependency "html-proofer", "~> 3.7" + spec.add_development_dependency "rspec", "~> 3.5" + spec.add_development_dependency "rubocop-jekyll", "~> 0.11" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag.rb new file mode 100644 index 000000000000..2edafd7d003b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +require "jekyll" +require "jekyll-seo-tag/version" + +module Jekyll + class SeoTag < Liquid::Tag + autoload :JSONLD, "jekyll-seo-tag/json_ld" + autoload :AuthorDrop, "jekyll-seo-tag/author_drop" + autoload :ImageDrop, "jekyll-seo-tag/image_drop" + autoload :JSONLDDrop, "jekyll-seo-tag/json_ld_drop" + autoload :UrlHelper, "jekyll-seo-tag/url_helper" + autoload :Drop, "jekyll-seo-tag/drop" + autoload :Filters, "jekyll-seo-tag/filters" + + attr_accessor :context + + # Matches all whitespace that follows either + # 1. A '}', which closes a Liquid tag + # 2. A '{', which opens a JSON block + # 3. A '>' followed by a newline, which closes an XML tag or + # 4. A ',' followed by a newline, which ends a JSON line + # We will strip all of this whitespace to minify the template + # We will not strip any whitespace if the next character is a '-' + # so that we do not interfere with the HTML comment at the + # very begining + MINIFY_REGEX = %r!(?<=[{}]|[>,]\n)\s+(?\!-)!.freeze + + def initialize(_tag_name, text, _tokens) + super + @text = text + end + + def render(context) + @context = context + SeoTag.template.render!(payload, info) + end + + private + + def options + { + "version" => Jekyll::SeoTag::VERSION, + "title" => title?, + } + end + + def payload + # site_payload is an instance of UnifiedPayloadDrop. See https://git.io/v5ajm + context.registers[:site].site_payload.tap do |site_payload| + site_payload["page"] = context.registers[:page] + site_payload["paginator"] = context["paginator"] + site_payload["seo_tag"] = drop + end + end + + def drop + if context.registers[:site].liquid_renderer.respond_to?(:cache) + Jekyll::SeoTag::Drop.new(@text, @context) + else + @drop ||= Jekyll::SeoTag::Drop.new(@text, @context) + end + end + + def info + { + :registers => context.registers, + :filters => [Jekyll::Filters], + } + end + + class << self + def template + @template ||= Liquid::Template.parse template_contents + end + + private + + def template_contents + @template_contents ||= begin + File.read(template_path).gsub(MINIFY_REGEX, "") + end + end + + def template_path + @template_path ||= begin + File.expand_path "./template.html", File.dirname(__FILE__) + end + end + end + end +end + +Liquid::Template.register_tag("seo", Jekyll::SeoTag) diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/author_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/author_drop.rb new file mode 100644 index 000000000000..2baa95e22a64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/author_drop.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +module Jekyll + class SeoTag + # A drop representing the current page's author + # + # Author name will be pulled from: + # + # 1. The page's `author` key + # 2. The first author in the page's `authors` key + # 3. The `author` key in the site config + # + # If the result from the name search is a string, we'll also check + # for additional author metadata in `site.data.authors` + class AuthorDrop < Jekyll::Drops::Drop + # Initialize a new AuthorDrop + # + # page - The page hash (e.g., Page#to_liquid) + # site - The Jekyll::Drops::SiteDrop + def initialize(page: nil, site: nil) + raise ArgumentError unless page && site + + @mutations = {} + @page = page + @site = site + end + + # AuthorDrop#to_s should return name, allowing the author drop to safely + # replace `page.author`, if necessary, and remain backwards compatible + def name + author_hash["name"] + end + alias_method :to_s, :name + + def twitter + return @twitter if defined? @twitter + + twitter = author_hash["twitter"] || author_hash["name"] + @twitter = twitter.is_a?(String) ? twitter.sub(%r!^@!, "") : nil + end + + private + + attr_reader :page + attr_reader :site + + # Finds the page author in the page.author, page.authors, or site.author + # + # Returns a string or hash representing the author + def resolved_author + return @resolved_author if defined? @resolved_author + + sources = [page["author"]] + sources << page["authors"].first if page["authors"].is_a?(Array) + sources << site["author"] + @resolved_author = sources.find { |s| !s.to_s.empty? } + end + + # If resolved_author is a string, attempts to find coresponding author + # metadata in `site.data.authors` + # + # Returns a hash representing additional metadata or an empty hash + def site_data_hash + @site_data_hash ||= begin + return {} unless resolved_author.is_a?(String) + return {} unless site.data["authors"].is_a?(Hash) + + author_hash = site.data["authors"][resolved_author] + author_hash.is_a?(Hash) ? author_hash : {} + end + end + + # Returns the normalized author hash representing the page author, + # including site-wide metadata if the author is provided as a string, + # or an empty hash, if the author cannot be resolved + def author_hash + @author_hash ||= begin + if resolved_author.is_a? Hash + resolved_author + elsif resolved_author.is_a? String + { "name" => resolved_author }.merge!(site_data_hash) + else + {} + end + end + end + + # Since author_hash is aliased to fallback_data, any values in the hash + # will be exposed via the drop, allowing support for arbitrary metadata + alias_method :fallback_data, :author_hash + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/drop.rb new file mode 100644 index 000000000000..157babd4e861 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/drop.rb @@ -0,0 +1,247 @@ +# frozen_string_literal: true + +module Jekyll + class SeoTag + class Drop < Jekyll::Drops::Drop + include Jekyll::SeoTag::UrlHelper + + TITLE_SEPARATOR = " | " + FORMAT_STRING_METHODS = [ + :markdownify, :strip_html, :normalize_whitespace, :escape_once, + ].freeze + HOMEPAGE_OR_ABOUT_REGEX = %r!^/(about/)?(index.html?)?$!.freeze + + EMPTY_READ_ONLY_HASH = {}.freeze + private_constant :EMPTY_READ_ONLY_HASH + + def initialize(text, context) + @obj = EMPTY_READ_ONLY_HASH + @mutations = {} + @text = text + @context = context + end + + def version + Jekyll::SeoTag::VERSION + end + + # Should the `<title>` tag be generated for this page? + def title? + return false unless title + return @display_title if defined?(@display_title) + + @display_title = (@text !~ %r!title=false!i) + end + + def site_title + @site_title ||= format_string(site["title"] || site["name"]) + end + + def site_tagline + @site_tagline ||= format_string site["tagline"] + end + + def site_description + @site_description ||= format_string site["description"] + end + + # Page title without site title or description appended + def page_title + @page_title ||= format_string(page["title"]) || site_title + end + + def site_tagline_or_description + site_tagline || site_description + end + + # Page title with site title or description appended + # rubocop:disable Metrics/CyclomaticComplexity + def title + @title ||= begin + if site_title && page_title != site_title + page_title + TITLE_SEPARATOR + site_title + elsif site_description && site_title + site_title + TITLE_SEPARATOR + site_tagline_or_description + else + page_title || site_title + end + end + + return page_number + @title if page_number + + @title + end + # rubocop:enable Metrics/CyclomaticComplexity + + def name + return @name if defined?(@name) + + @name = if seo_name + seo_name + elsif !homepage_or_about? + nil + elsif site_social["name"] + format_string site_social["name"] + elsif site_title + site_title + end + end + + def description + @description ||= begin + format_string(page["description"] || page["excerpt"]) || site_description + end + end + + # A drop representing the page author + def author + @author ||= AuthorDrop.new(:page => page, :site => site) + end + + # A drop representing the JSON-LD output + def json_ld + @json_ld ||= JSONLDDrop.new(self) + end + + # Returns a Drop representing the page's image + # Returns nil if the image has no path, to preserve backwards compatability + def image + @image ||= ImageDrop.new(:page => page, :context => @context) + @image if @image.path + end + + def date_modified + @date_modified ||= begin + date = page_seo["date_modified"] || page["last_modified_at"].to_liquid || page["date"] + filters.date_to_xmlschema(date) if date + end + end + + def date_published + @date_published ||= filters.date_to_xmlschema(page["date"]) if page["date"] + end + + def type + @type ||= begin + if page_seo["type"] + page_seo["type"] + elsif homepage_or_about? + "WebSite" + elsif page["date"] + "BlogPosting" + else + "WebPage" + end + end + end + + def links + @links ||= begin + if page_seo["links"] + page_seo["links"] + elsif homepage_or_about? && site_social["links"] + site_social["links"] + end + end + end + + def logo + @logo ||= begin + return unless site["logo"] + + if absolute_url? site["logo"] + filters.uri_escape site["logo"] + else + filters.uri_escape filters.absolute_url site["logo"] + end + end + end + + def page_lang + @page_lang ||= page["lang"] || site["lang"] || "en_US" + end + + def page_locale + @page_locale ||= (page["locale"] || site["locale"] || page_lang).tr("-", "_") + end + + def canonical_url + @canonical_url ||= begin + if page["canonical_url"].to_s.empty? + filters.absolute_url(page["url"]).to_s.gsub(%r!/index\.html$!, "/") + else + page["canonical_url"] + end + end + end + + private + + def filters + @filters ||= Jekyll::SeoTag::Filters.new(@context) + end + + def page + @page ||= @context.registers[:page].to_liquid + end + + def site + @site ||= @context.registers[:site].site_payload["site"].to_liquid + end + + def homepage_or_about? + page["url"] =~ HOMEPAGE_OR_ABOUT_REGEX + end + + def page_number + return unless @context["paginator"] && @context["paginator"]["page"] + + current = @context["paginator"]["page"] + total = @context["paginator"]["total_pages"] + paginator_message = site["seo_paginator_message"] || "Page %<current>s of %<total>s for " + + format(paginator_message, :current => current, :total => total) if current > 1 + end + + attr_reader :context + + def fallback_data + @fallback_data ||= {} + end + + def format_string(string) + string = FORMAT_STRING_METHODS.reduce(string) do |memo, method| + filters.public_send(method, memo) + end + + string unless string.empty? + end + + def seo_name + @seo_name ||= format_string(page_seo["name"]) if page_seo["name"] + end + + def page_seo + @page_seo ||= sub_hash(page, "seo") + end + + def site_social + @site_social ||= sub_hash(site, "social") + end + + # Safely returns a sub hash + # + # hash - the parent hash + # key - the key in the parent hash + # + # Returns the sub hash or an empty hash, if it does not exist + def sub_hash(hash, key) + if hash[key].is_a?(Hash) + hash[key] + else + EMPTY_READ_ONLY_HASH + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/filters.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/filters.rb new file mode 100644 index 000000000000..6cbdf817b6fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/filters.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Jekyll + class SeoTag + class Filters + include Jekyll::Filters + include Liquid::StandardFilters + + def initialize(context) + @context = context + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/image_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/image_drop.rb new file mode 100644 index 000000000000..54273531cc65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/image_drop.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +module Jekyll + class SeoTag + # A drop representing the page image + # The image path will be pulled from: + # + # 1. The `image` key if it's a string + # 2. The `image.path` key if it's a hash + # 3. The `image.facebook` key + # 4. The `image.twitter` key + class ImageDrop < Jekyll::Drops::Drop + include Jekyll::SeoTag::UrlHelper + + # Initialize a new ImageDrop + # + # page - The page hash (e.g., Page#to_liquid) + # context - the Liquid::Context + def initialize(page: nil, context: nil) + raise ArgumentError unless page && context + + @mutations = {} + @page = page + @context = context + end + + # Called path for backwards compatability, this is really + # the escaped, absolute URL representing the page's image + # Returns nil if no image path can be determined + def path + @path ||= filters.uri_escape(absolute_url) if absolute_url + end + alias_method :to_s, :path + + private + + attr_accessor :page + attr_accessor :context + + # The normalized image hash with a `path` key (which may be nil) + def image_hash + @image_hash ||= begin + image_meta = page["image"] + + if image_meta.is_a?(Hash) + { "path" => nil }.merge!(image_meta) + elsif image_meta.is_a?(String) + { "path" => image_meta } + else + { "path" => nil } + end + end + end + alias_method :fallback_data, :image_hash + + def raw_path + @raw_path ||= begin + image_hash["path"] || image_hash["facebook"] || image_hash["twitter"] + end + end + + def absolute_url + return unless raw_path + return @absolute_url if defined? @absolute_url + + @absolute_url = if raw_path.is_a?(String) && absolute_url?(raw_path) == false + filters.absolute_url raw_path + else + raw_path + end + end + + def filters + @filters ||= Jekyll::SeoTag::Filters.new(context) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/json_ld.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/json_ld.rb new file mode 100644 index 000000000000..34d424ab05d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/json_ld.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Jekyll + class SeoTag + # This module is deprecated, but is included in the Gem to avoid a breaking + # change and should be removed at the next major version bump + module JSONLD + METHODS_KEYS = { + :json_context => "@context", + :type => "@type", + :name => "name", + :page_title => "headline", + :json_author => "author", + :json_image => "image", + :date_published => "datePublished", + :date_modified => "dateModified", + :description => "description", + :publisher => "publisher", + :main_entity => "mainEntityOfPage", + :links => "sameAs", + :canonical_url => "url", + }.freeze + + # Self should be a Jekyll::SeoTag::Drop instance (when extending the module) + def json_ld + Jekyll.logger.warn "Jekyll::SeoTag::JSONLD is deprecated" + @json_ld ||= JSONLDDrop.new(self) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/json_ld_drop.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/json_ld_drop.rb new file mode 100644 index 000000000000..3bd1d46dd93f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/json_ld_drop.rb @@ -0,0 +1,91 @@ +# frozen_string_literal: true + +module Jekyll + class SeoTag + class JSONLDDrop < Jekyll::Drops::Drop + extend Forwardable + + def_delegator :page_drop, :name, :name + def_delegator :page_drop, :description, :description + def_delegator :page_drop, :canonical_url, :url + def_delegator :page_drop, :page_title, :headline + def_delegator :page_drop, :date_modified, :dateModified + def_delegator :page_drop, :date_published, :datePublished + def_delegator :page_drop, :links, :sameAs + def_delegator :page_drop, :logo, :logo + def_delegator :page_drop, :type, :type + + # Expose #type and #logo as private methods and #@type as a public method + alias_method :"@type", :type + private :type + private :logo + + VALID_ENTITY_TYPES = %w(BlogPosting CreativeWork).freeze + private_constant :VALID_ENTITY_TYPES + + # page_drop should be an instance of Jekyll::SeoTag::Drop + def initialize(page_drop) + @mutations = {} + @page_drop = page_drop + end + + def fallback_data + @fallback_data ||= { + "@context" => "https://schema.org", + } + end + + def author + return unless page_drop.author["name"] + + { + "@type" => "Person", + "name" => page_drop.author["name"], + } + end + + def image + return unless page_drop.image + return page_drop.image.path if page_drop.image.keys.length == 1 + + hash = page_drop.image.to_h + hash["url"] = hash.delete("path") + hash["@type"] = "imageObject" + hash + end + + def publisher + return unless logo + + output = { + "@type" => "Organization", + "logo" => { + "@type" => "ImageObject", + "url" => logo, + }, + } + output["name"] = page_drop.author.name if page_drop.author.name + output + end + + def main_entity + return unless VALID_ENTITY_TYPES.include?(type) + + { + "@type" => "WebPage", + "@id" => page_drop.canonical_url, + } + end + alias_method :mainEntityOfPage, :main_entity + private :main_entity + + def to_json + to_h.reject { |_k, v| v.nil? }.to_json + end + + private + + attr_reader :page_drop + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/url_helper.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/url_helper.rb new file mode 100644 index 000000000000..68246cd0699d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/url_helper.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Jekyll + class SeoTag + # Mixin to share common URL-related methods between class + module UrlHelper + private + + # Determines if the given string is an absolute URL + # + # Returns true if an absolute URL. + # Retruns false if it's a relative URL + # Returns nil if it is not a string or can't be parsed as a URL + def absolute_url?(string) + return unless string + + Addressable::URI.parse(string).absolute? + rescue Addressable::URI::InvalidURIError + nil + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/version.rb new file mode 100644 index 000000000000..7287eb554aa3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/jekyll-seo-tag/version.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +# Prevent bundler errors +module Liquid; class Tag; end; end + +module Jekyll + class SeoTag < Liquid::Tag + VERSION = "2.7.1" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/template.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/template.html new file mode 100644 index 000000000000..bc507e7b9b15 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/lib/template.html @@ -0,0 +1,116 @@ +<!-- Begin Jekyll SEO tag v{{ seo_tag.version }} --> +{% if seo_tag.title? %} + <title>{{ seo_tag.title }}</title> +{% endif %} + +<meta name="generator" content="Jekyll v{{ jekyll.version }}" /> + +{% if seo_tag.page_title %} + <meta property="og:title" content="{{ seo_tag.page_title }}" /> +{% endif %} + +{% if seo_tag.author.name %} + <meta name="author" content="{{ seo_tag.author.name }}" /> +{% endif %} + +<meta property="og:locale" content="{{ seo_tag.page_locale }}" /> + +{% if seo_tag.description %} + <meta name="description" content="{{ seo_tag.description }}" /> + <meta property="og:description" content="{{ seo_tag.description }}" /> +{% endif %} + +{% if site.url %} + <link rel="canonical" href="{{ seo_tag.canonical_url }}" /> + <meta property="og:url" content="{{ seo_tag.canonical_url }}" /> +{% endif %} + +{% if seo_tag.site_title %} + <meta property="og:site_name" content="{{ seo_tag.site_title }}" /> +{% endif %} + +{% if seo_tag.image %} + <meta property="og:image" content="{{ seo_tag.image.path }}" /> + {% if seo_tag.image.height %} + <meta property="og:image:height" content="{{ seo_tag.image.height }}" /> + {% endif %} + {% if seo_tag.image.width %} + <meta property="og:image:width" content="{{ seo_tag.image.width }}" /> + {% endif %} +{% endif %} + +{% if page.date %} + <meta property="og:type" content="article" /> + <meta property="article:published_time" content="{{ page.date | date_to_xmlschema }}" /> +{% endif %} + +{% if paginator.previous_page %} + <link rel="prev" href="{{ paginator.previous_page_path | absolute_url }}" /> +{% endif %} +{% if paginator.next_page %} + <link rel="next" href="{{ paginator.next_page_path | absolute_url }}" /> +{% endif %} + + +{% if seo_tag.image %} + <meta name="twitter:card" content="{{ page.twitter.card | default: site.twitter.card | default: "summary_large_image" }}" /> + <meta property="twitter:image" content="{{ seo_tag.image.path }}" /> +{% else %} + <meta name="twitter:card" content="summary" /> +{% endif %} + +{% if seo_tag.page_title %} + <meta property="twitter:title" content="{{ seo_tag.page_title }}" /> +{% endif %} + +{% if site.twitter %} + <meta name="twitter:site" content="@{{ site.twitter.username | remove:'@' }}" /> + + {% if seo_tag.author.twitter %} + <meta name="twitter:creator" content="@{{ seo_tag.author.twitter | remove:'@' }}" /> + {% endif %} +{% endif %} + +{% if site.facebook %} + {% if site.facebook.admins %} + <meta property="fb:admins" content="{{ site.facebook.admins }}" /> + {% endif %} + + {% if site.facebook.publisher %} + <meta property="article:publisher" content="{{ site.facebook.publisher }}" /> + {% endif %} + + {% if site.facebook.app_id %} + <meta property="fb:app_id" content="{{ site.facebook.app_id }}" /> + {% endif %} +{% endif %} + +{% if site.webmaster_verifications %} + {% if site.webmaster_verifications.google %} + <meta name="google-site-verification" content="{{ site.webmaster_verifications.google }}" /> + {% endif %} + + {% if site.webmaster_verifications.bing %} + <meta name="msvalidate.01" content="{{ site.webmaster_verifications.bing }}" /> + {% endif %} + + {% if site.webmaster_verifications.alexa %} + <meta name="alexaVerifyID" content="{{ site.webmaster_verifications.alexa }}" /> + {% endif %} + + {% if site.webmaster_verifications.yandex %} + <meta name="yandex-verification" content="{{ site.webmaster_verifications.yandex }}" /> + {% endif %} + + {% if site.webmaster_verifications.baidu %} + <meta name="baidu-site-verification" content="{{ site.webmaster_verifications.baidu }}" /> + {% endif %} +{% elsif site.google_site_verification %} + <meta name="google-site-verification" content="{{ site.google_site_verification }}" /> +{% endif %} + +<script type="application/ld+json"> + {{ seo_tag.json_ld | jsonify }} +</script> + +<!-- End Jekyll SEO tag --> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/bootstrap new file mode 100644 index 000000000000..654265ea24eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/bootstrap @@ -0,0 +1,5 @@ +#!/bin/sh + +set -ex + +bundle install diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/cibuild new file mode 100644 index 000000000000..dec4aa6e305e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/cibuild @@ -0,0 +1,7 @@ +#!/bin/sh + +set -ex + +bundle exec rspec +bundle exec rubocop -S -D +bundle exec gem build jekyll-seo-tag.gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/release b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/release new file mode 100644 index 000000000000..14588429a8aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/release @@ -0,0 +1,38 @@ +#!/bin/sh +# Tag and push a release. + +set -e + +# Make sure we're in the project root. + +cd $(dirname "$0")/.. + +# Build a new gem archive. + +rm -rf jekyll-seo-tag-*.gem +gem build -q jekyll-seo-tag.gemspec + +# Make sure we're on the master branch. + +(git branch | grep -q '* master') || { + echo "Only release from the master branch." + exit 1 +} + +# Figure out what version we're releasing. + +tag=v`ls jekyll-seo-tag-*.gem | sed 's/^jekyll-seo-tag-\(.*\)\.gem$/\1/'` + +# Make sure we haven't released this version before. + +git fetch -t origin + +(git tag -l | grep -q "$tag") && { + echo "Whoops, there's already a '${tag}' tag." + exit 1 +} + +# Tag it and bag it. + +gem push jekyll-seo-tag-*.gem && git tag "$tag" && + git push origin master && git push origin "$tag" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/site b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/site new file mode 100644 index 000000000000..9e4f56f2e1db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-seo-tag-2.7.1/script/site @@ -0,0 +1,3 @@ +#!/bin/sh + +bundle exec jekyll serve --source docs diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.gitignore new file mode 100644 index 000000000000..08626c886bbe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.gitignore @@ -0,0 +1,6 @@ +.bundle +*.gem +Gemfile.lock +spec/dest +spec/fixtures/.jekyll-cache +vendor/bundle diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.rspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.rspec new file mode 100644 index 000000000000..5f1647637a0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.rspec @@ -0,0 +1,2 @@ +--color +--format progress diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.rubocop.yml new file mode 100644 index 000000000000..d2e8a8ee073d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.rubocop.yml @@ -0,0 +1,9 @@ +inherit_from: .rubocop_todo.yml + +require: rubocop-jekyll +inherit_gem: + rubocop-jekyll: .rubocop.yml + +AllCops: + Exclude: + - vendor/**/* diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.rubocop_todo.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.rubocop_todo.yml new file mode 100644 index 000000000000..3503a7fce0ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.rubocop_todo.yml @@ -0,0 +1,26 @@ +# This configuration was generated by +# `rubocop --auto-gen-config` +# on 2018-12-06 11:55:46 +0100 using RuboCop version 0.61.1. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 1 +Lint/Debugger: + Exclude: + - 'script/console' + +# Offense count: 3 +# Configuration parameters: CountComments, Max, ExcludedMethods. +# ExcludedMethods: refine +Metrics/BlockLength: + Exclude: + - 'spec/jekyll-sitemap_spec.rb' + - 'spec/test_jekyll-last-modified-at.rb' + +# Offense count: 17 +# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. +# URISchemes: http, https +Metrics/LineLength: + Max: 154 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.travis.yml new file mode 100644 index 000000000000..6c1707b28378 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/.travis.yml @@ -0,0 +1,48 @@ +language: ruby +cache: bundler +rvm: +- &latest_ruby 2.6 +- 2.4 +matrix: + include: + # GitHub Pages + - rvm: 2.5.3 + env: + - JEKYLL_VERSION="~> 3.8.5" + - GITHUB_PAGES=1 # Only set on one build in matrix + - rvm: *latest_ruby + env: JEKYLL_VERSION=">= 4.0.0" +env: + matrix: + - JEKYLL_VERSION="~> 3.8" +branches: + only: + - master + - /^v\d+\.\d+\.\d+/ +git: + depth: 1000 +before_install: +- gem update --system +install: +- travis_retry script/bootstrap +script: script/cibuild +notifications: + irc: + on_success: change + on_failure: change + channels: + - irc.freenode.org#jekyll + template: + - "%{repository}#%{build_number} %{message} %{build_url}" + email: + on_success: never + on_failure: change +deploy: + provider: rubygems + api_key: + secure: O8fGRnM6OJCqC2BlVE1BqYfq5aR19ulpiHhQwRiHbtSCh8H4rYt7FLsuOwSTtRQjhWYRRSpdRt2ilfQ6PY6Jx1UkxZq5zo9QAPQ9tKxiFTm7gBpZAiAgb06eyaMBSzyQ8qe2qccaFI6CiZhsiaGMsdKsWuYpuoPmdLPd7aDyYJs= + gem: jekyll-sitemap + on: + tags: true + repo: jekyll/jekyll-sitemap + condition: "$GITHUB_PAGES == 1" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/Gemfile new file mode 100644 index 000000000000..46cdbf02794a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/Gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +source "https://rubygems.org" +gemspec + +gem "jekyll", ENV["JEKYLL_VERSION"] if ENV["JEKYLL_VERSION"] diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/History.markdown b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/History.markdown new file mode 100644 index 000000000000..56fc3f882d8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/History.markdown @@ -0,0 +1,221 @@ +## 1.4.0 / 2019-11-21 + +### Minor Enhancements + + * Avoid overwriting an existing robots.txt (#246) + +### Bug Fixes + + * Simulate `last_modified_at` injection by plugin (#256) + +## 1.3.1 / 2019-03-25 + +### Bug Fixes + + * Update plugin metadata and dev environment (#244) + +### Development Fixes + + * Lock requirement for `jekyll-last-modified-at` to `>= 1.0` + +## 1.3.0 / 2019-03-21 + + * Allow Jekyll v4 (still alpha) + +### Documentation + + * Add PDF file exclusion documentation (#213) + * Correct capitalization of GitHub (#207) + +### Development Fixes + + * Use Ruby 2.3 and Rubocop 0.55 (#214) + * chore(deps): rubocop-jekyll-0.3 (#227) + +## 1.2.0 / 2018-01-25 + +### Minor Enhancements + + * Remove excluded static files from the sitemap (#166) + * filter/replace static index.html paths to permalink (#170) + +### Development Fixes + + * Condition the static file tests on Jekyll 3.4.2 and above (#167) + * Update versions for Travis (#174) + * Fix Travis Deploy (#173) + * Test against Jekyll 3.4.x *and* latest 3.x (#177) + * Define path with __dir__ (#186) + * Style: Rubocop auto-correct (#195) + * Test against Ruby 2.5 (#201) + +### Documentation + + * Add note about use with Github Pages gem (#179) + * Fix a couple of typos (#184) + * Use plugins instead of gems in README config (#185) + * Docs: set site.url in config (#172) + +## 1.1.1 / 2017-04-11 + + * Cut a new version to alleviate sha256 checksum issue on RubyGems.org (#165) + +## 1.1.0 / 2017-04-10 + +### Minor Enhancements + + * escape& (#162) + * feat: remove 404 pages from the sitemap. closes #113 (#164) + +## 1.0.0 / 2017-01-06 + + * No new changes + +## 0.13.0 / 2017-01-05 + +### Minor Enhancements + + * Add sitemap.xsl if exists (#143) + * Add robots.txt when none exists (#146) + * Refactor and add sitemap to `site.pages` (#137) + * DRY in sitemap.xml (#136) + +### Documentation + + * Fix #134: Rename "Issues" to "Known Issues" (#135) + * Fix #104: Add explanation in README for <lastmod> tag (#139) + * Update copyright attribution (#149) + +### Development Fixes + + * Travis should do a deep clone (#147) + +## 0.12.0 / 2016-10-06 + +### Minor Enhancements + + * Don't set @site.config["time"] on sitemap generation (#131) + * Use filters to clean up Liquid template (#128) + +### Development Fixes + + * Appease Rubocop (#132) + * Drop Addressable dependency (#133) + +## 0.11.0 / 2016-07-08 + + * Add Rubocop (#100) + * Allow Travis to cache dependencies (#108) + * Properly Escape URLs (#107) + * Include PDF files in sitemap (#109) + +## 0.10.0 / 2016-01-05 + + * URI encode sitemap URLs (#85) + * Do not include 'posts' collection twice (#92) + * Fix GitHub Pages tests to test just the Jekyll version (#87) + * Allow HTML files to end with `.xhtml` or `.htm` (#93) + * Simplify whitespace regex for stripping whitespace (#96) + +## 0.9.0 / 2015-09-21 + + * Test against Jekyll 2, 3, and the GitHub Pages version. (#83) + +## 0.8.1 / 2015-03-11 + + * Do not assume all pages have changed (#35) + * Remove duplicated range from regex (#73) + +## 0.8.0 / 2015-02-03 + + * Call each page `page` in pages loop in `sitemap.xml` for clarity (#64) + * Remove `changefreq` (#34) + * Remove `priority` (#33) + * Don't strip 'index.html' when there is more to filename ## Minor Enhancements (#68) + +## 0.7.0 / 2014-12-07 + + * Make `site.baseurl` support more robust (#59) + * Add `site.baseurl` to base site URL construction ## Development Fixes (#50) + * Remove unnecessary spaces and escaping in README ## Bug Fixes (#58) + +## 0.6.3 / 2014-11-11 + + * Be backwards-compatible when `Site#in_source_dir` and `Site#in_dest_dir` don't exist (#57) + +## 0.6.2 / 2014-11-08 + +### Bug Fixes + + * Don't attempt to read the sitemap upon page creation. (#52) + * Use new secure methods to build source & dest paths. (#53) + +## 0.6.1 / 2014-10-17 + +### Minor Enhancements + + * Strip excess whitespace (#40) + +### Bug Fixes + + * Add UTC offset to `<lastmod>` to handle non-UTC timezones (#49) + +### Development Fixes + + * Adding information about exclusion flag (#45) + +## 0.6.0 / 2014-09-05 + +### Minor Enhancements + + * Include custom collections in the sitemap. (#30) + * Use `post.last_modified_at` for post `<lastmod>` if available (#37) + +## 0.5.1 / 2014-07-31 + +### Bug Fixes + + * Explicitly set sitemap layout to `nil` to avoid warning (#32) + +## 0.5.0 / 2014-06-02 + +### Minor Enhancements + + * Allow users to exclude a page/post from the sitemap (#11) + +## 0.4.1 / 2014-05-10 + +### Bug Fixes + + * Force sitemap layout to be `nil` (#16) + * Correct seconds in timestamp for static files # Development Fixes (#24) + * Upgrade to Rspec 3.0 and use `be_truthy` (#24) + +## 0.4.0 / 2014-05-06 + +### Major Enhancements + + * Support Jekyll 2.0 (#12) + +## 0.3.0 / 2014-05-05 + +### Minor Enhancements + + * Generate sitemap using html_pages (#10) + +### Bug Fixes + + * Remove stray sitemap.xsl from template (#8) + +### Development Fixes + + * Added travis (#6) + * Better timezone support (#7) + +## 0.2.0 / 2014-03-24 + + * Loosen Jekyll requirement (#4) + +## 0.1.0 / 2014-03-15 + + * Birthday! diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/LICENSE.md new file mode 100644 index 000000000000..1672e4a6b331 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-present, GitHub, inc. and the jekyll-sitemap contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/README.md new file mode 100644 index 000000000000..c85be55cc3e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/README.md @@ -0,0 +1,92 @@ +# Jekyll Sitemap Generator Plugin + +*Jekyll plugin to silently generate a sitemaps.org compliant sitemap for your Jekyll site* + +[![Build Status](https://travis-ci.org/jekyll/jekyll-sitemap.svg?branch=master)](https://travis-ci.org/jekyll/jekyll-sitemap) + +## Usage + +1. Add `gem 'jekyll-sitemap'` to your site's Gemfile and run `bundle` +2. Add the following to your site's `_config.yml`: + +```yml +url: "http://example.com" # the base hostname & protocol for your site +plugins: + - jekyll-sitemap +``` + +💡 If you are using a Jekyll version less than 3.5.0, use the `gems` key instead of `plugins`. + +If all gem plugins have the same `priority`, they will be executed in the +order they are required, generally. Thus, if you have other plugins which +generate content and store that content in `site.pages`, `site.posts`, or +`site.collections`, be sure to require `jekyll-sitemap` either *after* +those other gems if you *want* the sitemap to include the generated +content, or *before* those other gems if you *don't want* the sitemap to +include the generated content from the gems. (Programming is *hard*.) + +Because the sitemap is added to `site.pages`, you may have to modify any +templates that iterate through all pages (for example, to build a menu of +all of the site's content). + +## Note on Use with GitHub Pages Gem +The GitHub Pages gem ignores all plugins included in the Gemfile. If you only include `jekyll-sitemap` in the Gemfile without also including it in the `_config.yml` *the plugin will not work*. This can be confusing because the official Jekyll docs state that plugins can be included in either the Gemfile or `_config.yml`. + +When building a site that uses the GitHub Pages gem, follow the instructions above and ensure that `jekyll-sitemap` is listed in the `plugins` array in `_config.yml`. + +:warning: If you are using Jekyll < 3.5.0 use the `gems` key instead of `plugins`. + +## `<lastmod>` tag +The `<lastmod>` tag in the `sitemap.xml` will reflect by priority: + +1. The modified date of the file as reported by the filesystem if you have `jekyll-last-modified-at` plugin installed (not compatible with GitHub Pages auto building) +2. A personalised date if you add the variable `last_modified_at:` with a date in the Front Matter +3. The creation date of your post (corresponding to the `post.date` variable) + +## Exclusions + +If you would like to exclude specific pages/posts from the sitemap set the +sitemap flag to `false` in the front matter for the page/post. + +```yml +sitemap: false +``` + +To exclude files from your sitemap. It can be achieved with configuration using [Jekyll v3.7.2 and jekyll-sitemap v1.2.0](https://github.com/jekyll/jekyll/commit/776433109b96cb644938ffbf9caf4923bdde4d7f). + +Add a glob config to your `_config.yml` file. + +```yml +defaults: + - + scope: + path: "assets/**/*.pdf" + values: + sitemap: false +``` + +## Override default development settings + +[Follow these instructions on Jekyll's documentation](https://jekyllrb.com/docs/usage/#override-default-development-settings). + +## Developing locally + +* Use `script/bootstrap` to bootstrap your local development environment. +* Use `script/console` to load a local IRB console with the Gem. + +## Testing + +1. `script/bootstrap` +2. `script/cibuild` + +## Known Issues + +1. If the `sitemap.xml` doesn't generate in the `_site` folder, ensure `_config.yml` doesn't have `safe: true`. That prevents all plugins from working. +2. If the `sitemap.xml` doesn't generate in the `_site` folder, ensure that you don't have a sitemap generator plugin in your `_plugin` folder. + +## Contributing + +1. Fork the project +2. Create a descriptively named feature branch +3. Add your feature +4. Submit a pull request diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/Rakefile new file mode 100644 index 000000000000..ee617bbbf3aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/Rakefile @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "bundler/gem_tasks" +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/jekyll-sitemap.gemspec b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/jekyll-sitemap.gemspec new file mode 100644 index 000000000000..a9cdeeae4340 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/jekyll-sitemap.gemspec @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +lib = File.expand_path("lib", __dir__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require "jekyll-sitemap/version" + +Gem::Specification.new do |spec| + spec.name = "jekyll-sitemap" + spec.summary = "Automatically generate a sitemap.xml for your Jekyll site." + spec.version = Jekyll::Sitemap::VERSION + spec.authors = ["GitHub, Inc."] + spec.email = "support@github.com" + spec.homepage = "https://github.com/jekyll/jekyll-sitemap" + spec.licenses = ["MIT"] + + spec.files = `git ls-files -z`.split("\x0") + spec.executables = spec.files.grep(%r!^bin/!) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r!^(test|spec|features)/!) + spec.require_paths = ["lib"] + + spec.required_ruby_version = ">= 2.3.0" + + spec.add_dependency "jekyll", ">= 3.7", "< 5.0" + + spec.add_development_dependency "bundler" + spec.add_development_dependency "rake" + spec.add_development_dependency "rspec", "~> 3.0" + spec.add_development_dependency "rubocop-jekyll", "~> 0.4" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll-sitemap.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll-sitemap.rb new file mode 100644 index 000000000000..b788fae93912 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll-sitemap.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +require "jekyll/page_without_a_file" +require "jekyll/jekyll-sitemap" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll-sitemap/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll-sitemap/version.rb new file mode 100644 index 000000000000..504172d06c78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll-sitemap/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Jekyll + module Sitemap + VERSION = "1.4.0" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll/jekyll-sitemap.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll/jekyll-sitemap.rb new file mode 100644 index 000000000000..54ff823dde87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll/jekyll-sitemap.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require "fileutils" + +module Jekyll + class JekyllSitemap < Jekyll::Generator + safe true + priority :lowest + + # Main plugin action, called by Jekyll-core + def generate(site) + @site = site + @site.pages << sitemap unless file_exists?("sitemap.xml") + @site.pages << robots unless file_exists?("robots.txt") + end + + private + + INCLUDED_EXTENSIONS = %w( + .htm + .html + .xhtml + .pdf + ).freeze + + # Matches all whitespace that follows + # 1. A '>' followed by a newline or + # 2. A '}' which closes a Liquid tag + # We will strip all of this whitespace to minify the template + MINIFY_REGEX = %r!(?<=>\n|})\s+!.freeze + + # Array of all non-jekyll site files with an HTML extension + def static_files + @site.static_files.select { |file| INCLUDED_EXTENSIONS.include? file.extname } + end + + # Path to sitemap.xml template file + def source_path(file = "sitemap.xml") + File.expand_path "../#{file}", __dir__ + end + + # Destination for sitemap.xml file within the site source directory + def destination_path(file = "sitemap.xml") + @site.in_dest_dir(file) + end + + def sitemap + site_map = PageWithoutAFile.new(@site, __dir__, "", "sitemap.xml") + site_map.content = File.read(source_path).gsub(MINIFY_REGEX, "") + site_map.data["layout"] = nil + site_map.data["static_files"] = static_files.map(&:to_liquid) + site_map.data["xsl"] = file_exists?("sitemap.xsl") + site_map + end + + def robots + robots = PageWithoutAFile.new(@site, __dir__, "", "robots.txt") + robots.content = File.read(source_path("robots.txt")) + robots.data["layout"] = nil + robots + end + + # Checks if a file already exists in the site source + def file_exists?(file_path) + pages_and_files.any? { |p| p.url == "/#{file_path}" } + end + + def pages_and_files + @pages_and_files ||= @site.pages + @site.static_files + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll/page_without_a_file.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll/page_without_a_file.rb new file mode 100644 index 000000000000..42ecf08b9ed4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/jekyll/page_without_a_file.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Jekyll + class PageWithoutAFile < Page + # rubocop:disable Naming/MemoizedInstanceVariableName + def read_yaml(*) + @data ||= {} + end + # rubocop:enable Naming/MemoizedInstanceVariableName + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/robots.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/robots.txt new file mode 100644 index 000000000000..a699016f6535 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/robots.txt @@ -0,0 +1 @@ +Sitemap: {{ "sitemap.xml" | absolute_url }} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/sitemap.xml b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/sitemap.xml new file mode 100644 index 000000000000..75d0c1ecf05b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/lib/sitemap.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +{% if page.xsl %} + <?xml-stylesheet type="text/xsl" href="{{ "/sitemap.xsl" | absolute_url }}"?> +{% endif %} +<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> + {% assign collections = site.collections | where_exp:'collection','collection.output != false' %} + {% for collection in collections %} + {% assign docs = collection.docs | where_exp:'doc','doc.sitemap != false' %} + {% for doc in docs %} + <url> + <loc>{{ doc.url | replace:'/index.html','/' | absolute_url | xml_escape }}</loc> + {% if doc.last_modified_at or doc.date %} + <lastmod>{{ doc.last_modified_at | default: doc.date | date_to_xmlschema }}</lastmod> + {% endif %} + </url> + {% endfor %} + {% endfor %} + + {% assign pages = site.html_pages | where_exp:'doc','doc.sitemap != false' | where_exp:'doc','doc.url != "/404.html"' %} + {% for page in pages %} + <url> + <loc>{{ page.url | replace:'/index.html','/' | absolute_url | xml_escape }}</loc> + {% if page.last_modified_at %} + <lastmod>{{ page.last_modified_at | date_to_xmlschema }}</lastmod> + {% endif %} + </url> + {% endfor %} + + {% assign static_files = page.static_files | where_exp:'page','page.sitemap != false' | where_exp:'page','page.name != "404.html"' %} + {% for file in static_files %} + <url> + <loc>{{ file.path | replace:'/index.html','/' | absolute_url | xml_escape }}</loc> + <lastmod>{{ file.modified_time | date_to_xmlschema }}</lastmod> + </url> + {% endfor %} +</urlset> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/bootstrap new file mode 100644 index 000000000000..e2b126bd7daa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/bootstrap @@ -0,0 +1,4 @@ +#!/bin/sh +set -ex + +bundle install diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/cibuild new file mode 100644 index 000000000000..509b0c9f7011 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/cibuild @@ -0,0 +1,5 @@ +#!/bin/sh +set -e + +time script/fmt +time script/test diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/console b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/console new file mode 100644 index 000000000000..6132d7fe62ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/console @@ -0,0 +1,35 @@ +#! /usr/bin/env ruby +# frozen_string_literal: true + +def relative_to_root(path) + File.expand_path(path, File.dirname(__dir__)) +end + +require "jekyll" +require relative_to_root("lib/jekyll-sitemap.rb") +require "pry-debugger" + +SOURCE_DIR = relative_to_root("spec/fixtures") +DEST_DIR = relative_to_root("spec/dest") + +def source_dir(*files) + File.join(SOURCE_DIR, *files) +end + +def dest_dir(*files) + File.join(DEST_DIR, *files) +end + +def config(overrides = {}) + Jekyll.configuration( + "source" => source_dir, + "destination" => dest_dir, + "url" => "http://example.org" + ).merge(overrides) +end + +def site(configuration = config) + Jekyll::Site.new(configuration) +end + +binding.pry diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/fmt b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/fmt new file mode 100644 index 000000000000..c5351ecf017f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/fmt @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +echo "Rubocop $(bundle exec rubocop --version)" +bundle exec rubocop -D -E $@ +success=$? +if ((success != 0)); then + echo -e "\nTry running \`script/fmt -a\` to automatically fix errors" +fi +exit $success diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/release b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/release new file mode 100644 index 000000000000..a9c226f977c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/release @@ -0,0 +1,7 @@ +#!/bin/sh +# Tag and push a release. + +set -e + +script/cibuild +bundle exec rake release diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/test b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/test new file mode 100644 index 000000000000..506d5ef5982a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/script/test @@ -0,0 +1,5 @@ +#!/bin/bash +set -ex + +bundle exec rspec "$@" +bundle exec rspec spec/test_jekyll-last-modified-at.rb diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/404.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/404.md new file mode 100644 index 000000000000..0d9de631b2ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/404.md @@ -0,0 +1,4 @@ +--- +--- + +404. That's an error. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_config.yml b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_config.yml new file mode 100644 index 000000000000..cffd3fbfba2f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_config.yml @@ -0,0 +1,19 @@ +timezone: UTC + +defaults: + - + scope: + path: "" + type: page + values: + layout: some_default + - + scope: + path: "static_files/excluded.pdf" + values: + sitemap: false + - + scope: + path: "static_files/html_file.html" + values: + sitemap: false diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_layouts/some_default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_layouts/some_default.html new file mode 100644 index 000000000000..c38a7b9fd973 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_layouts/some_default.html @@ -0,0 +1,4 @@ +--- +--- +THIS IS MY LAYOUT +{{ content }} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/custom_permalink.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/custom_permalink.md new file mode 100644 index 000000000000..ce4a7d05db8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/custom_permalink.md @@ -0,0 +1,5 @@ +--- +permalink: /permalink/ +--- + +# Custom permalink diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/custom_permalink_2.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/custom_permalink_2.md new file mode 100644 index 000000000000..551ee02524fe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/custom_permalink_2.md @@ -0,0 +1,5 @@ +--- +permalink: /permalink/unique_name.html +--- + +# Unique html name diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/test.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/test.html new file mode 100644 index 000000000000..2d8402151959 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/test.html @@ -0,0 +1,4 @@ +--- +--- + +This is just a test. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/this-has-non-standard-chars.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/this-has-non-standard-chars.md new file mode 100644 index 000000000000..519dae0a3abb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_my_collection/this-has-non-standard-chars.md @@ -0,0 +1,5 @@ +--- +permalink: this url has an ümlaut +--- + +# URL contains characters that need to be URI encoded diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_other_things/test2.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_other_things/test2.html new file mode 100644 index 000000000000..d222dde770f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_other_things/test2.html @@ -0,0 +1,4 @@ +--- +--- + +This file shouldn't show up in the sitemap. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2013-12-12-dec-the-second.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2013-12-12-dec-the-second.md new file mode 100644 index 000000000000..02829945635e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2013-12-12-dec-the-second.md @@ -0,0 +1,4 @@ +--- +--- + +December the twelfth, actually. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2014-03-02-march-the-second.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2014-03-02-march-the-second.md new file mode 100644 index 000000000000..9a47b49f121e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2014-03-02-march-the-second.md @@ -0,0 +1,4 @@ +--- +--- + +March the second! diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2014-03-04-march-the-fourth.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2014-03-04-march-the-fourth.md new file mode 100644 index 000000000000..42ed97c8cd5b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2014-03-04-march-the-fourth.md @@ -0,0 +1,4 @@ +--- +--- + +March the fourth! diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2014-05-11-exclude-this-post.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2014-05-11-exclude-this-post.md new file mode 100644 index 000000000000..ccd540faba67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2014-05-11-exclude-this-post.md @@ -0,0 +1,5 @@ +--- +sitemap: false +--- + +This post should not appear in the sitemap. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md new file mode 100644 index 000000000000..e26b59b744a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md @@ -0,0 +1,4 @@ +--- +--- + +Please don't modify this file. It's modified time is important. diff --git "a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2016-04-01-\351\224\231\350\257\257.html" "b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2016-04-01-\351\224\231\350\257\257.html" new file mode 100644 index 000000000000..a845151cc840 --- /dev/null +++ "b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2016-04-01-\351\224\231\350\257\257.html" @@ -0,0 +1,2 @@ +--- +--- diff --git "a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2016-04-02-\351\224\231\350\257\257.html" "b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2016-04-02-\351\224\231\350\257\257.html" new file mode 100644 index 000000000000..f660f6f3880d --- /dev/null +++ "b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2016-04-02-\351\224\231\350\257\257.html" @@ -0,0 +1,3 @@ +--- +permalink: "/2016/04/02/错误.html" +--- diff --git "a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2016-04-03-\351\224\231\350\257\257.html" "b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2016-04-03-\351\224\231\350\257\257.html" new file mode 100644 index 000000000000..3123e48aafb5 --- /dev/null +++ "b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/_posts/2016-04-03-\351\224\231\350\257\257.html" @@ -0,0 +1,3 @@ +--- +permalink: "/2016/04/03/%E9%94%99%E8%AF%AF.html" +--- diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/feeds/atom.xml b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/feeds/atom.xml new file mode 100644 index 000000000000..58715b686f05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/feeds/atom.xml @@ -0,0 +1,6 @@ +--- +--- + +<?xml version="1.0" encoding="utf-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"> +</feed> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/images/hubot.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/images/hubot.png new file mode 100644 index 000000000000..75da791d8e0a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/images/hubot.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/index.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/index.html new file mode 100644 index 000000000000..fce076a33a78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/index.html @@ -0,0 +1,4 @@ +--- +--- + +HERE IS MY SITE I AM SO EXCITED TO BE USING GITHUB PAGES diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/jekyll-last-modified-at/page.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/jekyll-last-modified-at/page.html new file mode 100644 index 000000000000..6fe4bdb8c47b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/jekyll-last-modified-at/page.html @@ -0,0 +1,4 @@ +--- +--- + +This is a page with a modified time. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/exclude-this-page.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/exclude-this-page.html new file mode 100644 index 000000000000..9eea02e7d943 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/exclude-this-page.html @@ -0,0 +1,5 @@ +--- +sitemap: false +--- + +Exclude this page diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/htm.htm b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/htm.htm new file mode 100644 index 000000000000..7da6a6b037e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/htm.htm @@ -0,0 +1 @@ +This file has an .htm extension, and should be included in the sitemap diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/index.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/index.html new file mode 100644 index 000000000000..2c2b27d6ba48 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/index.html @@ -0,0 +1 @@ +static subfolder index.html file that should be indexed as permalink diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/test_index.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/test_index.html new file mode 100644 index 000000000000..e1ac7a964399 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/test_index.html @@ -0,0 +1,4 @@ +--- +--- + +The permalink of this page does not end with a '/', but with a filename diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/this-is-a-subfile.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/this-is-a-subfile.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/this-is-a-subpage.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/this-is-a-subpage.html new file mode 100644 index 000000000000..06dd70786420 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/this-is-a-subpage.html @@ -0,0 +1,4 @@ +--- +--- + +This is a subpage! diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/xhtml.xhtml b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/xhtml.xhtml new file mode 100644 index 000000000000..7c5eafafedfb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/some-subfolder/xhtml.xhtml @@ -0,0 +1 @@ +This file has an .xhtml extension, and should be included in the sitemap diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/static_files/404.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/static_files/404.html new file mode 100644 index 000000000000..5416e297580a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/static_files/404.html @@ -0,0 +1 @@ +404. That's an error. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/static_files/excluded.pdf b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/static_files/excluded.pdf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/static_files/html_file.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/static_files/html_file.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/static_files/test.pdf b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/fixtures/static_files/test.pdf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/jekyll-sitemap_spec.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/jekyll-sitemap_spec.rb new file mode 100644 index 000000000000..2b7d9c58c933 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/jekyll-sitemap_spec.rb @@ -0,0 +1,256 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe(Jekyll::JekyllSitemap) do + let(:overrides) do + { + "source" => source_dir, + "destination" => dest_dir, + "url" => "http://example.org", + "collections" => { + "my_collection" => { "output" => true }, + "other_things" => { "output" => false }, + }, + } + end + let(:config) do + Jekyll.configuration(overrides) + end + let(:site) { Jekyll::Site.new(config) } + let(:contents) { File.read(dest_dir("sitemap.xml")) } + before(:each) do + site.process + end + + it "has no layout" do + expect(contents).not_to match(%r!\ATHIS IS MY LAYOUT!) + end + + it "creates a sitemap.xml file" do + expect(File.exist?(dest_dir("sitemap.xml"))).to be_truthy + end + + it "doesn't have multiple new lines or trailing whitespace" do + expect(contents).to_not match %r!\s+\n! + expect(contents).to_not match %r!\n{2,}! + end + + it "puts all the pages in the sitemap.xml file" do + expect(contents).to match %r!<loc>http://example\.org/</loc>! + expect(contents).to match %r!<loc>http://example\.org/some-subfolder/this-is-a-subpage\.html</loc>! + end + + it "only strips 'index.html' from end of permalink" do + expect(contents).to match %r!<loc>http://example\.org/some-subfolder/test_index\.html</loc>! + end + + it "puts all the posts in the sitemap.xml file" do + expect(contents).to match %r!<loc>http://example\.org/2014/03/04/march-the-fourth\.html</loc>! + expect(contents).to match %r!<loc>http://example\.org/2014/03/02/march-the-second\.html</loc>! + expect(contents).to match %r!<loc>http://example\.org/2013/12/12/dec-the-second\.html</loc>! + end + + describe "collections" do + it "puts all the `output:true` into sitemap.xml" do + expect(contents).to match %r!<loc>http://example\.org/my_collection/test\.html</loc>! + end + + it "doesn't put all the `output:false` into sitemap.xml" do + expect(contents).to_not match %r!<loc>http://example\.org/other_things/test2\.html</loc>! + end + + it "remove 'index.html' for directory custom permalinks" do + expect(contents).to match %r!<loc>http://example\.org/permalink/</loc>! + end + + it "doesn't remove filename for non-directory custom permalinks" do + expect(contents).to match %r!<loc>http://example\.org/permalink/unique_name\.html</loc>! + end + + it "performs URI encoding of site paths" do + expect(contents).to match %r!<loc>http://example\.org/this%20url%20has%20an%20%C3%BCmlaut</loc>! + end + end + + it "generates the correct date for each of the posts" do + expect(contents).to match %r!<lastmod>2014-03-04T00:00:00(-|\+)\d+:\d+</lastmod>! + expect(contents).to match %r!<lastmod>2014-03-02T00:00:00(-|\+)\d+:\d+</lastmod>! + expect(contents).to match %r!<lastmod>2013-12-12T00:00:00(-|\+)\d+:\d+</lastmod>! + end + + it "puts all the static HTML files in the sitemap.xml file" do + expect(contents).to match %r!<loc>http://example\.org/some-subfolder/this-is-a-subfile\.html</loc>! + end + + it "does not include assets or any static files that aren't .html" do + expect(contents).not_to match %r!<loc>http://example\.org/images/hubot\.png</loc>! + expect(contents).not_to match %r!<loc>http://example\.org/feeds/atom\.xml</loc>! + end + + it "converts static index.html files to permalink version" do + expect(contents).to match %r!<loc>http://example\.org/some-subfolder/</loc>! + end + + it "does include assets or any static files with .xhtml and .htm extensions" do + expect(contents).to match %r!/some-subfolder/xhtml\.xhtml! + expect(contents).to match %r!/some-subfolder/htm\.htm! + end + + it "does include assets or any static files with .pdf extension" do + expect(contents).to match %r!/static_files/test.pdf! + end + + it "does not include any static files named 404.html" do + expect(contents).not_to match %r!/static_files/404.html! + end + + if Gem::Version.new(Jekyll::VERSION) >= Gem::Version.new("3.4.2") + it "does not include any static files that have set 'sitemap: false'" do + expect(contents).not_to match %r!/static_files/excluded\.pdf! + end + + it "does not include any static files that have set 'sitemap: false'" do + expect(contents).not_to match %r!/static_files/html_file\.html! + end + end + + it "does not include posts that have set 'sitemap: false'" do + expect(contents).not_to match %r!/exclude-this-post\.html</loc>! + end + + it "does not include pages that have set 'sitemap: false'" do + expect(contents).not_to match %r!/exclude-this-page\.html</loc>! + end + + it "does not include the 404 page" do + expect(contents).not_to match %r!/404\.html</loc>! + end + + it "correctly formats timestamps of static files" do + expect(contents).to match %r!/this-is-a-subfile\.html</loc>\s+<lastmod>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(-|\+)\d{2}:\d{2}</lastmod>! + end + + it "includes the correct number of items" do + # static_files/excluded.pdf is excluded on Jekyll 3.4.2 and above + if Gem::Version.new(Jekyll::VERSION) >= Gem::Version.new("3.4.2") + expect(contents.scan(%r!(?=<url>)!).count).to eql 20 + else + expect(contents.scan(%r!(?=<url>)!).count).to eql 21 + end + end + + context "with a baseurl" do + let(:config) do + Jekyll.configuration(Jekyll::Utils.deep_merge_hashes(overrides, "baseurl" => "/bass")) + end + + it "correctly adds the baseurl to the static files" do + expect(contents).to match %r!<loc>http://example\.org/bass/some-subfolder/this-is-a-subfile\.html</loc>! + end + + it "correctly adds the baseurl to the collections" do + expect(contents).to match %r!<loc>http://example\.org/bass/my_collection/test\.html</loc>! + end + + it "correctly adds the baseurl to the pages" do + expect(contents).to match %r!<loc>http://example\.org/bass/</loc>! + expect(contents).to match %r!<loc>http://example\.org/bass/some-subfolder/this-is-a-subpage\.html</loc>! + end + + it "correctly adds the baseurl to the posts" do + expect(contents).to match %r!<loc>http://example\.org/bass/2014/03/04/march-the-fourth\.html</loc>! + expect(contents).to match %r!<loc>http://example\.org/bass/2014/03/02/march-the-second\.html</loc>! + expect(contents).to match %r!<loc>http://example\.org/bass/2013/12/12/dec-the-second\.html</loc>! + end + + it "adds baseurl to robots.txt" do + content = File.read(dest_dir("robots.txt")) + expect(content).to match("Sitemap: http://example.org/bass/sitemap.xml") + end + end + + context "with urls that needs URI encoding" do + let(:config) do + Jekyll.configuration(Jekyll::Utils.deep_merge_hashes(overrides, "url" => "http://ümlaut.example.org")) + end + + it "performs URI encoding of site url" do + expect(contents).to match %r!<loc>http://xn--mlaut-jva.example.org/</loc>! + expect(contents).to match %r!<loc>http://xn--mlaut-jva.example.org/some-subfolder/this-is-a-subpage.html</loc>! + expect(contents).to match %r!<loc>http://xn--mlaut-jva.example.org/2014/03/04/march-the-fourth.html</loc>! + expect(contents).to match %r!<loc>http://xn--mlaut-jva.example.org/2016/04/01/%E9%94%99%E8%AF%AF.html</loc>! + expect(contents).to match %r!<loc>http://xn--mlaut-jva.example.org/2016/04/02/%E9%94%99%E8%AF%AF.html</loc>! + expect(contents).to match %r!<loc>http://xn--mlaut-jva.example.org/2016/04/03/%E9%94%99%E8%AF%AF.html</loc>! + end + + it "does not double-escape urls" do + expect(contents).to_not match %r!%25! + end + + context "readme" do + let(:contents) { File.read(dest_dir("robots.txt")) } + + it "has no layout" do + expect(contents).not_to match(%r!\ATHIS IS MY LAYOUT!) + end + + it "creates a robots.txt file" do + expect(File.exist?(dest_dir("robots.txt"))).to be_truthy + end + + it "renders liquid" do + expect(contents).to match("Sitemap: http://xn--mlaut-jva.example.org/sitemap.xml") + end + end + end + + context "with user-defined robots.txt" do + let(:fixture) { "/" } + let(:fixture_source) { robot_fixtures(fixture) } + let(:fixture_dest) { robot_fixtures(fixture, "_site") } + let(:robot_contents) { File.read(robot_fixtures(fixture, "_site", "robots.txt")).strip } + let(:overrides) do + { + "source" => fixture_source, + "destination" => fixture_dest, + "url" => "http://example.org", + } + end + + before(:each) { setup_fixture(fixture) } + after(:each) { cleanup_fixture(fixture) } + + context "as a static-file at source-root" do + let(:fixture) { "static-at-source-root" } + + it "doesn't override the robots file" do + expect(robot_contents).to eql("Allow: /") + end + end + + context "as a static-file in a subdir" do + let(:fixture) { "static-in-subdir" } + + it "generates a valid robot.txt" do + expect(robot_contents).to eql("Sitemap: http://example.org/sitemap.xml") + end + end + + context "as a page at root" do + let(:fixture) { "page-at-root" } + + it "doesn't override the robots file" do + expect(robot_contents).to eql("Allow: http://example.org") + end + end + + context "as a page with permalink in a subdir" do + let(:fixture) { "permalinked-page-in-subdir" } + + it "doesn't override the robots file" do + expect(robot_contents).to eql("Allow: http://example.org") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/page-at-root/robots.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/page-at-root/robots.txt new file mode 100644 index 000000000000..e63befd2ec26 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/page-at-root/robots.txt @@ -0,0 +1,4 @@ +--- +--- + +Allow: {{ site.url }} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/permalinked-page-in-subdir/assets/robots.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/permalinked-page-in-subdir/assets/robots.txt new file mode 100644 index 000000000000..0e396d1b3034 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/permalinked-page-in-subdir/assets/robots.txt @@ -0,0 +1,5 @@ +--- +permalink: '/robots.txt' +--- + +Allow: {{ site.url }} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/static-at-source-root/robots.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/static-at-source-root/robots.txt new file mode 100644 index 000000000000..e9f7c88672c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/static-at-source-root/robots.txt @@ -0,0 +1 @@ +Allow: / diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/static-in-subdir/assets/robots.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/static-in-subdir/assets/robots.txt new file mode 100644 index 000000000000..e9f7c88672c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/robot-fixtures/static-in-subdir/assets/robots.txt @@ -0,0 +1 @@ +Allow: / diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/spec_helper.rb new file mode 100644 index 000000000000..ebeaef9e8457 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/spec_helper.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require "jekyll" +require "fileutils" +require File.expand_path("../lib/jekyll-sitemap", __dir__) + +Jekyll.logger.log_level = :error + +RSpec.configure do |config| + config.run_all_when_everything_filtered = true + config.filter_run :focus + config.order = "random" + + SOURCE_DIR = File.expand_path("fixtures", __dir__) + DEST_DIR = File.expand_path("dest", __dir__) + ROBOT_FIXTURES = File.expand_path("robot-fixtures", __dir__) + ROBOT_FIXTURE_ITEMS = %w(_posts _layouts _config.yml index.html).freeze + + def source_dir(*files) + File.join(SOURCE_DIR, *files) + end + + def dest_dir(*files) + File.join(DEST_DIR, *files) + end + + def robot_fixtures(*subdirs) + File.join(ROBOT_FIXTURES, *subdirs) + end + + def setup_fixture(directory) + ROBOT_FIXTURE_ITEMS.each { |item| FileUtils.cp_r(source_dir(item), robot_fixtures(directory)) } + end + + def cleanup_fixture(directory, dest_dirname = "_site") + (ROBOT_FIXTURE_ITEMS + [dest_dirname]).each do |item| + FileUtils.remove_entry(robot_fixtures(directory, item)) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/test_jekyll-last-modified-at.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/test_jekyll-last-modified-at.rb new file mode 100644 index 000000000000..4387b051a572 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-sitemap-1.4.0/spec/test_jekyll-last-modified-at.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe(Jekyll::JekyllSitemap) do + let(:overrides) do + { + "source" => source_dir, + "destination" => dest_dir, + "url" => "http://example.org", + "collections" => { + "my_collection" => { "output" => true }, + "other_things" => { "output" => false }, + }, + } + end + let(:config) do + Jekyll.configuration(overrides) + end + let(:site) { Jekyll::Site.new(config) } + let(:contents) { File.read(dest_dir("sitemap.xml")) } + before(:each) do + # simulate `last_modified_at` injection by `jekyll-last-modified-at` plugin + Jekyll::Hooks.register([:pages, :documents], :post_init) do |page| + page.data["last_modified_at"] = Time.parse("2015-01-18T00:00:00+00:00") + end + + site.process + end + + context "with jekyll-last-modified-at" do + it "correctly adds the modified time to the posts" do + expect(contents).to match( + %r! + <loc>http://example.org/2015/01/18/jekyll-last-modified-at.html</loc>\s+ + <lastmod>2015-01-18T00:00:00\+00:00</lastmod> + !x + ) + end + + it "correctly adds the modified time to the pages" do + expect(contents).to match( + %r! + <loc>http://example.org/jekyll-last-modified-at/page.html</loc>\s+ + <lastmod>2015-01-18T00:00:00\+00:00</lastmod> + !x + ) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/LICENSE.txt new file mode 100644 index 000000000000..391529651e41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 broccolini + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/README.md new file mode 100644 index 000000000000..19203a6b1860 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/README.md @@ -0,0 +1,59 @@ +# Swiss Jekyll Theme + +Swiss is a bold Jekyll theme inspired by Swiss design and the works of Massimo Vignelli. This theme lends itself well to sites heavy on written content. + +### Features: +* Mobile-first design ensures this theme performs fastest on mobile while scaling elegantly to desktop-size screens. +* Designed for blogs and sites heavy on written content, with bold typography styles, homepage summaries, and previous/next snippets. +* Supports a wide range of HTML elements and markdown. +* Flexible styles that can be reused for customization without adding additional CSS. +* Dynamically generated navigation links. See docs for adding pages with specific post category for-loops. + +## Installation + +Add this line to your Jekyll site's Gemfile: + +```ruby +gem "github-pages", group: :jekyll_plugins +``` + +And add this line to your Jekyll site: + +```yaml +remote_theme: broccolini/swiss +``` + +And then execute: + + $ bundle + +## Usage + +This theme comes in eight different color variations. The default is set to the black theme, to change to a different theme edit the config under `theme_color: black` to one of the following colors: + +| | | +|:-----------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------| +| `theme_color: black` | `theme_color: red` | +| <img width="330" alt="black" src="https://cloud.githubusercontent.com/assets/334891/18476835/8d70b330-7999-11e6-8c84-a558906d636e.png"> | <img width="330" alt="red" src="https://cloud.githubusercontent.com/assets/334891/18477185/c53af09a-799a-11e6-9354-b9bf1a7f1826.png"> | +| `theme_color: white` | `theme_color: gray` | +| <img width="330" alt="white" src="https://cloud.githubusercontent.com/assets/334891/18477206/d9dc55fc-799a-11e6-89f2-b4ae150caa80.png"> | <img width="330" alt="gray" src="https://cloud.githubusercontent.com/assets/334891/18477058/4e61700c-799a-11e6-80a0-805e57f2563e.png"> | +| `theme_color: blue` | `theme_color: magenta` | +| <img width="330" alt="blue" src="https://cloud.githubusercontent.com/assets/334891/18477240/f03646d2-799a-11e6-8895-25b37d3a1438.png"> | <img width="330" alt="magenta" src="https://cloud.githubusercontent.com/assets/334891/18477252/fb2f5128-799a-11e6-8c8f-e79d9c1884b7.png"> | +| `theme_color: orange` | `theme_color: yellow` | +| <img width="330" alt="orange" src="https://cloud.githubusercontent.com/assets/334891/18477265/06e302bc-799b-11e6-970e-6461b2a89c57.png"> | <img width="330" alt="yellow" src="https://cloud.githubusercontent.com/assets/334891/18477278/117347aa-799b-11e6-83a8-f82341c143e0.png"> | + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/broccolini/swiss. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. + +## Development + +To set up your environment to develop this theme, run `bundle install`. + +Your theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal. + +When your theme is released, only the files in `_layouts`, `_includes`, and `_sass` tracked with Git will be released. + +## License + +The theme is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/dot-accent.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/dot-accent.html new file mode 100644 index 000000000000..c329351cc141 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/dot-accent.html @@ -0,0 +1,3 @@ +<svg height="32" class="header-social-accent" version="1.1" width="32" viewBox="0 0 16 16" aria-hidden="true"> + <circle cx="8" cy="8" r="8"/> +</svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/dot.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/dot.html new file mode 100644 index 000000000000..3c0cfcaf05d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/dot.html @@ -0,0 +1,3 @@ +<svg height="32" class="header-social" version="1.1" width="32" viewBox="0 0 16 16" aria-hidden="true"> + <circle cx="8" cy="8" r="8"/> +</svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/dribbble.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/dribbble.html new file mode 100644 index 000000000000..fabf93267273 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/dribbble.html @@ -0,0 +1,5 @@ +<a href="https://dribbble.com/{{ site.social_username }}" title="Follow me on Dribbble" class="link-social block"> + <svg height="32" class="header-social" version="1.1" width="32" viewBox="0 0 16 16" aria-hidden="true" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"> + <path d="M8 16c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm6.747-6.905c-.234-.074-2.115-.635-4.257-.292.894 2.456 1.258 4.456 1.328 4.872 1.533-1.037 2.624-2.68 2.93-4.58zM10.67 14.3c-.102-.6-.5-2.688-1.46-5.18l-.044.014C5.312 10.477 3.93 13.15 3.806 13.4c1.158.905 2.614 1.444 4.194 1.444.947 0 1.85-.194 2.67-.543zm-7.747-1.72c.155-.266 2.03-3.37 5.555-4.51.09-.03.18-.056.27-.08-.173-.39-.36-.778-.555-1.16C4.78 7.85 1.47 7.807 1.17 7.8l-.003.208c0 1.755.665 3.358 1.756 4.57zM1.31 6.61c.307.005 3.122.017 6.318-.832-1.132-2.012-2.353-3.705-2.533-3.952-1.912.902-3.34 2.664-3.784 4.785zM6.4 1.368c.188.253 1.43 1.943 2.548 4 2.43-.91 3.46-2.293 3.582-2.468C11.323 1.827 9.736 1.176 8 1.176c-.55 0-1.087.066-1.6.19zm6.89 2.322c-.145.194-1.29 1.662-3.816 2.694.16.325.31.656.453.99.05.117.1.235.147.352 2.274-.286 4.533.172 4.758.22-.015-1.613-.59-3.094-1.543-4.257z"/> + </svg> +</a> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/footer.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/footer.html new file mode 100644 index 000000000000..707950b41e37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/footer.html @@ -0,0 +1,13 @@ +<div class="border-top-thin clearfix mt-2 mt-lg-4"> + <div class="container mx-auto px-2"> + <p class="col-8 sm-width-full left py-2 mb-0">This project is maintained by <a class="text-accent" href="https://github.com/{{ site.github_username }}">{{ site.github_username }}</a></p> + <ul class="list-reset right clearfix sm-width-full py-2 mb-2 mb-lg-0"> + <li class="inline-block mr-1"> + <a href="https://twitter.com/share" class="twitter-share-button" data-hashtags="{{ site.title }}">Tweet</a> <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script> + </li> + <li class="inline-block"> + <a class="github-button" href="https://github.com/{{ site.github_username }}/{{ site.github_repo }}" data-icon="octicon-star" data-count-href="{{ site.github_username }}/{{ github_repo }}/stargazers" data-count-api="/repos/{{ site.github_username }}/{{ github_repo }}#stargazers_count" data-count-aria-label="# stargazers on GitHub" aria-label="Star {{ site.github_username }}/{{ github_repo }} on GitHub">Star</a> + </li> + </ul> + </div> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/github.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/github.html new file mode 100644 index 000000000000..5398249ebcb2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/github.html @@ -0,0 +1,4 @@ +<a href="https://github.com/{{ site.github_username }}/{{ site.github_repo }}" title="Fork me on GitHub" class="link-social block"> +<svg height="32" class="octicon octicon-mark-github header-social" viewBox="0 0 16 16" version="1.1" width="32" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path> +</svg> +</a> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/head.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/head.html new file mode 100644 index 000000000000..cc35426ef125 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/head.html @@ -0,0 +1,17 @@ +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + + <title>{% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %}</title> + <meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}"> + + {% assign user_url = site.url | append: site.baseurl %} + {% assign full_base_url = user_url | default: site.github.url %} + <link rel="stylesheet" href="{{ "/assets/style.css" | prepend: full_base_url }}"> + + <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}"> + <link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}"> + + <script async defer src="https://buttons.github.io/buttons.js"></script> +</head> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/header.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/header.html new file mode 100644 index 000000000000..4dbfeb8292c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/header.html @@ -0,0 +1,20 @@ +<header class="border-bottom-thick px-2 clearfix"> + <div class="left sm-width-full py-1 mt-1 mt-lg-0"> + <a class="align-middle link-primary text-accent" href="{{ site.baseurl }}/"> + {{ site.title }} + </a> + </div> + <div class="right sm-width-full"> + <ul class="list-reset mt-lg-1 mb-2 mb-lg-1"> + {% for my_page in site.pages %} + {% if my_page.title %} + <li class="inline-block"> + <a class="align-middle link-primary mr-2 mr-lg-0 ml-lg-2" href="{{ my_page.url | prepend: site.baseurl }}"> + {{ my_page.title }} + </a> + </li> + {% endif %} + {% endfor %} + </ul> + </div> +</header> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/instagram.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/instagram.html new file mode 100644 index 000000000000..530a0502cefa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/instagram.html @@ -0,0 +1,18 @@ +<a href="https://www.instagram.com/{{ site.social_username }}" title="Follow me on Instagram" class="link-social block"> + <svg height="32" class="header-social" version="1.1" width="32" viewBox="0 0 16 16" aria-hidden="true"> + <g> + <path d="M11.9,5.1c-0.1-0.2-0.2-0.4-0.4-0.6s-0.3-0.3-0.6-0.4C10.8,4,10.5,4,10,3.9c-0.5,0-0.7,0-2,0s-1.5,0-2,0 + C5.5,4,5.2,4,5.1,4.1C4.8,4.2,4.7,4.3,4.5,4.5S4.2,4.8,4.1,5.1C4,5.2,4,5.5,3.9,6c0,0.5,0,0.7,0,2s0,1.5,0,2c0,0.5,0.1,0.8,0.2,0.9 + c0.1,0.2,0.2,0.4,0.4,0.6c0.2,0.2,0.3,0.3,0.6,0.4C5.2,12,5.5,12,6,12.1c0.5,0,0.7,0,2,0c1.3,0,1.5,0,2,0c0.5,0,0.8-0.1,0.9-0.2 + c0.2-0.1,0.4-0.2,0.6-0.4s0.3-0.3,0.4-0.6c0.1-0.2,0.2-0.4,0.2-0.9c0-0.5,0-0.7,0-2s0-1.5,0-2C12,5.5,12,5.2,11.9,5.1z M8,10.6 + c-1.4,0-2.6-1.1-2.6-2.6c0-1.4,1.1-2.6,2.6-2.6c1.4,0,2.6,1.1,2.6,2.6C10.6,9.4,9.4,10.6,8,10.6z M10.7,5.9c-0.3,0-0.6-0.3-0.6-0.6 + s0.3-0.6,0.6-0.6s0.6,0.3,0.6,0.6S11,5.9,10.7,5.9z"/> + <path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M13,10.1c0,0.5-0.1,0.9-0.2,1.2c-0.1,0.3-0.3,0.6-0.6,0.9 + c-0.3,0.3-0.6,0.4-0.9,0.6c-0.3,0.1-0.7,0.2-1.2,0.2c-0.5,0-0.7,0-2.1,0s-1.5,0-2.1,0c-0.5,0-0.9-0.1-1.2-0.2 + c-0.3-0.1-0.6-0.3-0.9-0.6c-0.3-0.3-0.4-0.6-0.6-0.9C3.1,11,3.1,10.6,3,10.1C3,9.5,3,9.4,3,8s0-1.5,0-2.1c0-0.5,0.1-0.9,0.2-1.2 + c0.1-0.3,0.3-0.6,0.6-0.9c0.3-0.3,0.6-0.4,0.9-0.6C5,3.1,5.4,3.1,5.9,3C6.5,3,6.6,3,8,3s1.5,0,2.1,0c0.5,0,0.9,0.1,1.2,0.2 + c0.3,0.1,0.6,0.3,0.9,0.6c0.3,0.3,0.4,0.6,0.6,0.9C12.9,5,12.9,5.4,13,5.9c0,0.5,0,0.7,0,2.1S13,9.5,13,10.1z"/> + <circle cx="8" cy="8" r="1.7"/> + </g> + </svg> +</a> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/medium.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/medium.html new file mode 100644 index 000000000000..05a6bc4ea19f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/medium.html @@ -0,0 +1,9 @@ +<a href="https://medium.com/@{{ site.social_username }}" title="Follow me on Medium" class="link-social block"> + <svg height="32" class="header-social" version="1.1" width="32" viewBox="0 0 16 16" aria-hidden="true"> + <path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M6.3,12.1c0,0.2-0.1,0.3-0.3,0.3c-0.1,0-0.1,0-0.2-0.1l-2.6-1.3 + C3.1,11.1,3,10.9,3,10.7V4.3c0-0.2,0.1-0.3,0.2-0.3c0,0,0.1,0,0.2,0l0.1,0h0l2.9,1.4c0,0,0,0,0,0V12.1z M9.3,10.8L9,10.7L7,9.6v-3 + l0.2,0.3l0.2,0.3l0.2,0.3L9,10l0,0l0.3,0.5L9.7,11L9.3,10.8z M9.7,9.8L9.3,9.3L9,8.8L7.8,6.9L9,4.9l0.3-0.5l0.2-0.2 + C9.6,4.1,9.7,4,9.8,4c0,0,0,0,0,0c0,0,0.1,0,0.1,0l3,1.5c0,0,0,0,0,0l0,0c0,0,0,0,0,0.1L10,10.4L9.7,9.8z M13,12.1 + c0,0.2-0.1,0.3-0.3,0.3c-0.1,0-0.2,0-0.3-0.1l-1.7-0.9l-0.5-0.2l0.2-0.3h0L13,6.8V12.1z"/> + </svg> +</a> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/post_block.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/post_block.html new file mode 100644 index 000000000000..7f6ed435b959 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/post_block.html @@ -0,0 +1,8 @@ +<!-- Renders post date, title, and snippet of text. --> +<div class="py-2 mb-2 prose"> + <a class="no-underline h5 bold text-accent" title="{{ post.url | prepend: site.baseurl }}" href="{{ post.url | prepend: site.baseurl }}">{{ post.date | date: "%b %-d, %Y" }}</a> + <h2 class="h1 lh-condensed col-9 mt-0"> + <a class="link-primary" title="{{ post.url | prepend: site.baseurl }}" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a> + </h2> + <p>{{ post.content | strip_html | truncatewords:30 }}</p> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/previous-next.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/previous-next.html new file mode 100644 index 000000000000..3ac67a49f0f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/previous-next.html @@ -0,0 +1,21 @@ +<!-- Use if you want to show previous and next for all posts. --> +{% assign user_url = site.url | append: site.baseurl %} +{% assign full_base_url = user_url | default: site.github.url %} +{% if page.previous.url %} + <div class="col-4 sm-width-full left mr-lg-4 mt-3"> + <a class="no-underline border-top-thin py-1 block" href="{{ page.previous.url | prepend: full_base_url }}"> + <span class="h5 bold text-accent">Previous</span> + <p class="bold h3 link-primary mb-1">{{ page.previous.title }}</p> + <p>{{ page.previous.content | strip_html | truncatewords:20 }}</p> + </a> + </div> + {% endif %} + {% if page.next.url %} + <div class="col-4 sm-width-full left mt-3"> + <a class="no-underline border-top-thin py-1 block" href="{{ page.next.url | prepend: full_base_url }}"> + <span class="h5 bold text-accent">Next</span> + <p class="bold h3 link-primary mb-1">{{ page.next.title }}</p> + <p>{{ page.next.content | strip_html | truncatewords:20 }}</p> + </a> + </div> +{% endif %} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/previous-next_has-categories.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/previous-next_has-categories.html new file mode 100644 index 000000000000..55bd883ec2a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/previous-next_has-categories.html @@ -0,0 +1,39 @@ +<!-- Use if you want to show previous and next for posts within a category. --> +{% if page.categories %} + {% assign category = page.categories[0] %} + {% assign posts = site.categories[category] %} + {% for post in posts %} + {% if post.url == page.url %} + {% assign post_index0 = forloop.index0 %} + {% assign post_index1 = forloop.index %} + {% endif %} + {% endfor %} + {% for post in posts %} + {% if post_index0 == forloop.index %} + {% assign next_post = post %} + {% endif %} + {% if post_index1 == forloop.index0 %} + {% assign prev_post = post %} + {% endif %} + {% endfor %} +{% endif %} +{% assign user_url = site.url | append: site.baseurl %} +{% assign full_base_url = user_url | default: site.github.url %} +{% if prev_post %} +<div class="col-4 sm-width-full left mr-lg-4 mt-3"> + <a class="no-underline border-top-thin py-1 block" href="{{ prev_post.url | prepend: full_base_url }}"> + <span class="h5 bold text-accent">Previous</span> + <p class="bold h3 link-primary mb-1">{{ prev_post.title }}</p> + <p>{{ page.previous.content | strip_html | truncatewords:20 }}</p> + </a> +</div> +{% endif %} +{% if next_post %} +<div class="col-4 sm-width-full left mt-3"> + <a class="no-underline border-top-thin py-1 block" href="{{ next_post.url | prepend: full_base_url }}"> + <span class="h5 bold text-accent">Next</span> + <p class="bold h3 link-primary mb-1">{{ next_post.title }}</p> + <p>{{ page.next.content | strip_html | truncatewords:20 }}</p> + </a> +</div> +{% endif %} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/twitter.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/twitter.html new file mode 100644 index 000000000000..defca532f74f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_includes/twitter.html @@ -0,0 +1,9 @@ +<a href="https://twitter.com/{{ site.social_username }}" title="Follow me on twitter" class="link-social block"> + <svg height="32" class="header-social" version="1.1" width="32" viewBox="0 0 16 16" aria-hidden="true"> + <path d="M8,0C3.6,0,0,3.6,0,8s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z M12,6c0,0.1,0,0.2,0,0.3c0,2.7-2.1,5.8-5.8,5.8 + c-1.2,0-2.2-0.3-3.1-0.9c0.2,0,0.3,0,0.5,0c1,0,1.8-0.3,2.5-0.9c-0.9,0-1.7-0.6-1.9-1.4c0.1,0,0.3,0,0.4,0c0.2,0,0.4,0,0.5-0.1 + c-0.9-0.2-1.6-1-1.6-2v0C3.7,6.9,4,7,4.3,7.1c-0.5-0.4-0.9-1-0.9-1.7c0-0.4,0.1-0.7,0.3-1c1,1.2,2.5,2.1,4.2,2.1 + c0-0.2-0.1-0.3-0.1-0.5c0-1.1,0.9-2,2.1-2c0.6,0,1.1,0.2,1.5,0.6c0.5-0.1,0.9-0.3,1.3-0.5c-0.2,0.5-0.5,0.9-0.9,1.1 + c0.4,0,0.8-0.2,1.2-0.3h0C12.7,5.3,12.4,5.7,12,6z"/> + </svg> +</a> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/category-post.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/category-post.html new file mode 100644 index 000000000000..550e76167ba0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/category-post.html @@ -0,0 +1,18 @@ +--- +layout: default +--- +<article class="container px-2 mx-auto mb4" itemscope itemtype="http://schema.org/BlogPosting"> + <h1 class="h0 col-9 sm-width-full py-4 mt-3 inline-block" itemprop="name headline">{{ page.title }}</h1> + <div class="col-4 sm-width-full mt-1 border-top-thin "> + <p class="mb-3 py-2 bold h4"><time datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">{{ page.date | date: "%b %-d, %Y" }}</time></p> + </div> + + <div class="prose" itemprop="articleBody"> + {{ content }} + </div> + +</article> + +<div class="container mx-auto px-2 py-2 clearfix"> + {% include previous-next_has-categories.html %} +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/category_index.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/category_index.html new file mode 100644 index 000000000000..3e1ee61f4bdd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/category_index.html @@ -0,0 +1,13 @@ +--- +layout: page +--- + +{% if page.category_name %} + {% assign category_name = page.category_name %} +{% endif %} + +<div class="container mx-auto"> + {% for post in site.categories[category_name] %} + {% include post_block.html %} + {% endfor %} +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/default.html new file mode 100644 index 000000000000..4176004cfddf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/default.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> + + {% include head.html %} + + <body> + + {% include header.html %} + + <div> + {{ content }} + </div> + + {% include footer.html %} + + </body> + +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/home.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/home.html new file mode 100644 index 000000000000..141be67e23b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/home.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html> + + {% include head.html %} + + <body> + + <div> + + <header class="header-background"> + + <div class="clearfix border-bottom-thick header-border"> + <ul class="list-reset right py-1 header-text font-smoothing"> + {% for my_page in site.pages %} + {% if my_page.title %} + <li class="inline-block"> + <a class="align-middle link-primary header-link mr-2" href="{{ my_page.url | prepend: site.baseurl }}">{{ my_page.title }}</a> + </li> + {% endif %} + {% endfor %} + </ul> + </div> + + <div class="container mx-auto px-2 mb-2 clearfix header-text"> + <h1 class="h0 inline-block col-9 sm-width-full py-4 mt-3 header-title">{{ site.title }}</h1> + + <div class="clearfix mb-4 py-1"> + <div class="col-4 sm-width-full left border-top-thin"> + <div class="table"> + <div class="inline-block mt-3 mr-1"> + {% include dot-accent.html %} + </div> + <div class="inline-block mt-3 mr-1"> + {% include dot-accent.html %} + </div> + <div class="inline-block mt-3"> + {% include github.html %} + </div> + </div> + <!-- Set site description in config.yml --> + <p class="h4 lh-condensed font-smoothing mt-2 py-1">{{ site.description }}</p> + </div> + + <div class="col-4 sm-width-full left border-top-thin mt-3 mt-lg-0 ml-lg-4 table"> + <div class="inline-block mt-3 mr-1"> + {% include dot.html %} + </div> + <div class="inline-block mt-3"> + {% include {{ site.social_link | default: "twitter" }}.html %} + </div> + </div> + </div> + + </div> + </header> + + <div class="container mx-auto px-2 py-4"> + {% for post in site.posts %} + {% include post_block.html %} + {% endfor %} + </div> + + </div> + + {% include footer.html %} + + </body> + +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/page.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/page.html new file mode 100644 index 000000000000..a4882103bc10 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/page.html @@ -0,0 +1,13 @@ +--- +layout: default +--- +<article class="container mx-auto px-2 mt2 mb4"> + <header> + <h1 class="h0 py-4 mt-3">{{ page.title }}</h1> + </header> + <div class="col-4 sm-width-full border-top-thin"> + </div> + <div class="prose mb-4 py-4"> + {{ content }} + </div> +</article> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/post.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/post.html new file mode 100644 index 000000000000..030559180296 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_layouts/post.html @@ -0,0 +1,18 @@ +--- +layout: default +--- +<article class="container px-2 mx-auto mb4" itemscope itemtype="http://schema.org/BlogPosting"> + <h1 class="h0 col-9 sm-width-full py-4 mt-3 inline-block" itemprop="name headline">{{ page.title }}</h1> + <div class="col-4 sm-width-full mt-1 border-top-thin "> + <p class="mb-3 py-2 bold h4"><time datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">{{ page.date | date: "%b %-d, %Y" }}</time></p> + </div> + + <div class="prose" itemprop="articleBody"> + {{ content }} + </div> + +</article> + +<div class="container mx-auto px-2 py-2 clearfix"> + {% include previous-next.html %} +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_base.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_base.scss new file mode 100644 index 000000000000..b88e4cdb77a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_base.scss @@ -0,0 +1,62 @@ +/** + * Reset some basic elements +*/ + +* { + box-sizing: border-box !important; + margin: 0; } + +input, +select, +textarea, +button { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + + +body, h1, h2, h3, h4, h5, h6, +p, blockquote, pre, hr, +dl, dd, ol, ul, figure { + margin: 0; + padding: 0; +} + + +/** + * Basic styling + */ +body { + font-family: $body-font-family; + font-size: $body-font-size; + line-height: 1.5; + color: $color-body-text; + background-color: #fff; +} + +p { + margin-top: 0; + margin-bottom: 0.5em; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 1em; + margin-bottom: 0.25em; +} + +h1, .h1 { font-size: $h1-size; } +h2, .h2 { font-size: $h2-size; } +h3, .h3 { font-size: $h3-size; } +h4, .h4 { font-size: $h4-size; } +h5, .h5 { font-size: $h5-size; } +h6, .h6 { font-size: $h6-size; text-transform: uppercase; letter-spacing: 0.02em; } + +a { + color: inherit; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_components.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_components.scss new file mode 100644 index 000000000000..a21ef35b7892 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_components.scss @@ -0,0 +1,139 @@ +// Styling markdown output + +// Code formatting +pre { + border-left: $spacer-1 solid $color-border; + margin: $spacer-3 0; + padding-left: 16px; + width: (9 / 12 * 100%); // matches col-9 + overflow-x: auto; +} + +code { + color: $color-code; + font-size: $body-font-size; + padding: 1px 0px; +} + + +.prose { + + a { + text-decoration: underline dotted; + + &:hover { + text-decoration: underline; + } + } + + p, ol, ul { + font-size: $prose-font-size; + margin-bottom: 1em; + width: 100%; + + @media (min-width: $breakpoint-lg) { + width: (10 / 12 * 100%); // matches col-10 + } + + } + + ul, ol { + padding-left: 40px; + } + + li { + margin-bottom: 0.5em; + + ul li, ol li { + margin-bottom: 0; + } + } + + img { + + max-width: 100%; + + @media (min-width: $breakpoint-lg) { + max-width: (12 / 10 * 100%); // make image fill width of container on desktop + } + + } + + blockquote { + line-height: 1.375; + padding-left: 20px; + margin: 40px 0 40px -16px; + border-left: $spacer-1 solid $color-border; + font-style: italic; + + p { + font-size: 24px; + } + + @media (min-width: $breakpoint-lg) { + padding-left: $spacer-3; + margin: $spacer-4 0 $spacer-4 -40px; + max-width: (11 / 10 * 100%); + + p { + font-size: 32px; + } + + } + + } + + hr { + color: $color-body-text; + border-style: solid; + border-width: thin; + margin-top: 0.5em; + margin-bottom: 0.5em; + } + + dt { + font-weight: bold; + font-style: italic; + line-height: 1.25; + } + + dd { + font-style: italic; + margin-bottom: 0.5em; + } + + // Markdown tables + table { + border-collapse: collapse; + display: block; + width: 100%; + margin-bottom: 1.5em; + overflow: auto; + // For Firefox to horizontally scroll wider tables. + word-break: normal; + word-break: keep-all; + + th { + font-weight: bold; + text-align: left; + } + + th, + td { + padding: $spacer-2 $spacer-3 $spacer-2 2px; + border-top: 1px solid $color-body-text; + border-bottom: 1px solid $color-body-text; + } + + tr { + background-color: #fff; + border-top: 1px solid $color-body-text; + } + + tr th { + border-top: 2px solid $color-body-text; + border-bottom: 2px solid $color-body-text; + } + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-black.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-black.scss new file mode 100644 index 000000000000..f6136da9b9f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-black.scss @@ -0,0 +1,31 @@ +// Default black theme + +// Color variables +$black: #181818; +$red: #E74727; +$red-small: #DC3918; +$white: #fff; + +// Config +$color-background: $black !default; +$color-dot-accent: $red !default; +$color-foreground: $white !default; +$color-title: $white !default; +$color-body-text: $black !default; +$color-text-accent: $red !default; +$color-code: $red-small !default; +$color-nav-link: $red !default; +$color-primary-link: $red !default; + +.font-smoothing { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +// Import sass partials (used in all themes) +@import + "variables", + "base", + "components", + "utilities" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-blue.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-blue.scss new file mode 100644 index 000000000000..cc644363dccd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-blue.scss @@ -0,0 +1,31 @@ +// Blue theme + +// Color variables +$blue: #009DDB; +$blue-small: #007AB3; +$gray: #45474A; +$white: #fff; + +// Config +$color-background: $gray !default; +$color-dot-accent: $blue !default; +$color-foreground: $white !default; +$color-title: $blue !default; +$color-body-text: $gray !default; +$color-text-accent: $blue !default; +$color-code: $blue-small !default; +$color-nav-link: $blue !default; +$color-primary-link: $blue !default; + +.font-smoothing { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +// Import sass partials (used in all themes) +@import + "variables", + "base", + "components", + "utilities" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-gray.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-gray.scss new file mode 100644 index 000000000000..a917564c34e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-gray.scss @@ -0,0 +1,28 @@ +// Gray theme + +// Color variables +$white: #fff; +$black: #181818; +$gray: #444; +$gray-light: #777; +$gray-lighter: #bbb; + +// Config +$color-background: $gray-lighter !default; +$color-dot-accent: $white !default; +$color-foreground: $black !default; +$color-title: $black !default; +$color-body-text: $black !default; +$color-text-accent: $gray-light !default; +$color-code: $gray-light !default; +$color-nav-link: $gray !default; +$color-primary-link: $gray-light !default; + + +// Import sass partials (used in all themes) +@import + "variables", + "base", + "components", + "utilities" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-magenta.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-magenta.scss new file mode 100644 index 000000000000..5969f38425cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-magenta.scss @@ -0,0 +1,25 @@ +// Pink theme - links on inside pages? + +// Color variables +$magenta: #CD2DA8; +$black: #2F2323; +$white: #fff; + +// Config +$color-background: $magenta !default; +$color-dot-accent: $black !default; +$color-foreground: $white !default; +$color-title: $white !default; +$color-body-text: $black !default; +$color-text-accent: $magenta !default; +$color-code: $magenta !default; +$color-nav-link: $black !default; +$color-primary-link: $magenta !default; + +// Import sass partials (used in all themes) +@import + "variables", + "base", + "components", + "utilities" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-orange.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-orange.scss new file mode 100644 index 000000000000..a6c22017e6db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-orange.scss @@ -0,0 +1,27 @@ +// Orange theme + +$orange: #fa8224; +$orange-dark: #DF6D16; +$gray: #767676; +$white: #fff; +$black: #181818; + +$color-background: $orange !default; +$color-dot-accent: $black !default; +$color-foreground: $black !default; +$color-title: $white !default; +$color-body-text: $black !default; +$color-text-accent: $orange-dark !default; +$color-code: $gray !default; +$color-nav-link: $white !default; +$color-primary-link: $orange !default; +$color-border: $orange; + + +// Import sass partials (used in all themes) +@import + "variables", + "base", + "components", + "utilities" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-red.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-red.scss new file mode 100644 index 000000000000..2e8dc3b23fbf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-red.scss @@ -0,0 +1,26 @@ +// Default black theme + +// Color variables +$black: #181818; +$red: #E74727; +$red-dark: #DC3918; +$white: #fff; + +// Config +$color-background: $red !default; +$color-dot-accent: $black !default; +$color-foreground: $black !default; +$color-title: $white !default; +$color-body-text: $black !default; +$color-text-accent: $red-dark !default; +$color-code: $red-dark !default; +$color-nav-link: $white !default; +$color-primary-link: $red !default; + +// Import sass partials (used in all themes) +@import + "variables", + "base", + "components", + "utilities" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-white.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-white.scss new file mode 100644 index 000000000000..960c1aa5629c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-white.scss @@ -0,0 +1,28 @@ +// White theme + +// Color variables +$black: #181818; +$red: #E74727; +$red-dark: #DC3918; +$gray-light: #f5f5f5; +$white: #fff; + +// Config +$color-background: $gray-light !default; +$color-dot-accent: $red !default; +$color-foreground: $black !default; +$color-title: $black !default; +$color-body-text: $black !default; +$color-text-accent: $red-dark !default; +$color-code: $red-dark !default; +$color-nav-link: $red-dark !default; +$color-primary-link: $red-dark !default; + + +// Import sass partials (used in all themes) +@import + "variables", + "base", + "components", + "utilities" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-yellow.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-yellow.scss new file mode 100644 index 000000000000..c9cfb2650504 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_theme-yellow.scss @@ -0,0 +1,29 @@ +// Yellow theme - could do yellow on borders? - links on inside pages? + +// Color variables +$black: #181818; +$white: #fff; +$gray: #777; +$yellow: #fec92e; + + +// Config +$color-background: $yellow !default; +$color-dot-accent: $white !default; +$color-foreground: $black !default; +$color-title: $black !default; +$color-body-text: $black !default; +$color-text-accent: $gray !default; +$color-code: $gray !default; +$color-nav-link: $white !default; +$color-primary-link: $gray !default; +$color-border: $yellow; + + +// Import sass partials (used in all themes) +@import + "variables", + "base", + "components", + "utilities" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_utilities.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_utilities.scss new file mode 100644 index 000000000000..bba91651482b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_utilities.scss @@ -0,0 +1,182 @@ +/* Type utilities */ +.h0 { + font-size: $h0-mobile; + line-height: 1.0125; + margin-top: 0.85em; + word-wrap: break-word; + + @media (min-width: $breakpoint-lg) { + font-size: $h0-desktop; + } +} + +.text-right { text-align: right; } + +.no-underline { + text-decoration: none !important; + + &:hover { + text-decoration: none !important; + } +} + +.bold { font-weight: bold; } +.uppercase { text-transform: uppercase; } + +.lh-condensed { line-height: 1.25; } + +.list-reset { + list-style: none; + padding-left: 0; +} + +/* Border utilities */ +.border-bottom-thick { border-bottom: 2px solid; border-color: currentColor; } +.border-bottom-thin { border-bottom: 1px solid; border-color: currentColor; } +.border-top-thick { border-top: 2px solid; border-color: currentColor; } +.border-top-thin { border-top: 1px solid; border-color: currentColor; } +.border-0 { border: 0; } + + +/* Theme color utilities */ +.header-background { background-color: $color-background; } +.header-border { border-color: $color-foreground; } +.header-title { color: $color-title; } +.header-text { color: $color-foreground; } +.header-social { fill: $color-foreground; } +.header-social-accent { fill: $color-dot-accent; } +.header-link:hover { color: $color-nav-link !important; } // used for navigation links on homepage +.text-accent { color: $color-text-accent; } // used for date in post list and home link + +/* Layout utilities */ +.container { max-width: $container-width; } + +.col-1 { width: (1 / 12 * 100%); } +.col-2 { width: (2 / 12 * 100%); } +.col-3 { width: (3 / 12 * 100%); } +.col-4 { width: (4 / 12 * 100%); } +.col-5 { width: (5 / 12 * 100%); } +.col-6 { width: (6 / 12 * 100%); } +.col-7 { width: (7 / 12 * 100%); } +.col-8 { width: (8 / 12 * 100%); } +.col-9 { width: (9 / 12 * 100%); } +.col-10 { width: (10 / 12 * 100%); } +.col-11 { width: (11 / 12 * 100%); } +.col-12 { width: 100%; } + +@media (max-width: $breakpoint-lg) { + .sm-width-full { width: 100% !important; } +} + +.block { display: block !important; } +.inline-block { display: inline-block !important; } + +.table { display: table !important; } + +.left { float: left; } +.right { float: right; } + +.clearfix:before, +.clearfix:after { + content: " "; + display: table +} +.clearfix:after { clear: both } + +.align-middle { vertical-align: middle; } + +/* Padding */ +.px-0 { padding-left: 0; padding-right: 0 } +.py-0 { padding-top: 0; padding-bottom: 0 } + +.px-1 { padding-left: $spacer-1; padding-right: $spacer-1 } +.py-1 { padding-top: $spacer-1; padding-bottom: $spacer-1 } + +.px-2 { padding-left: $spacer-2; padding-right: $spacer-2; } +.py-2 { padding-top: $spacer-2; padding-bottom: $spacer-2; } + +.px-3 { padding-left: $spacer-3; padding-right: $spacer-3; } +.py-3 { padding-top: $spacer-3; padding-bottom: $spacer-3; } + +.px-4 { padding-left: $spacer-4; padding-right: $spacer-4; } +.py-4 { padding-top: $spacer-4; padding-bottom: $spacer-4; } + +/* Margin */ +.mx-auto { margin-left: auto; margin-right: auto; } + +.mt-0 { margin-top: 0; } +.mr-0 { margin-right: 0; } +.mb-0 { margin-bottom: 0; } +.ml-0 { margin-left: 0; } + +.mt-1 { margin-top: $spacer-1; } +.mr-1 { margin-right: $spacer-1; } +.mb-1 { margin-bottom: $spacer-1; } +.ml-1 { margin-left: $spacer-1; } + +.mt-2 { margin-top: $spacer-2; } +.mr-2 { margin-right: $spacer-2; } +.mb-2 { margin-bottom: $spacer-2; } +.ml-2 { margin-left: $spacer-2; } + +.mt-3 { margin-top: $spacer-3; } +.mr-3 { margin-right: $spacer-3; } +.mb-3 { margin-bottom: $spacer-3; } +.ml-3 { margin-left: $spacer-3; } + +.mt-4 { margin-top: $spacer-4; } +.mr-4 { margin-right: $spacer-4; } +.mb-4 { margin-bottom: $spacer-4; } +.ml-4 { margin-left: $spacer-4; } + +// Responsive margin +@media (min-width: 52em) { + .mx-lg-auto { margin-left: auto; margin-right: auto; } + + .mt-lg-0 { margin-top: 0; } + .mr-lg-0 { margin-right: 0; } + .mb-lg-0 { margin-bottom: 0; } + .ml-lg-0 { margin-left: 0; } + + .mt-lg-1 { margin-top: $spacer-1; } + .mr-lg-1 { margin-right: $spacer-1; } + .mb-lg-1 { margin-bottom: $spacer-1; } + .ml-lg-1 { margin-left: $spacer-1; } + + .mt-lg-2 { margin-top: $spacer-2; } + .mr-lg-2 { margin-right: $spacer-2; } + .mb-lg-2 { margin-bottom: $spacer-2; } + .ml-lg-2 { margin-left: $spacer-2; } + + .mt-lg-3 { margin-top: $spacer-3; } + .mr-lg-3 { margin-right: $spacer-3; } + .mb-lg-3 { margin-bottom: $spacer-3; } + .ml-lg-3 { margin-left: $spacer-3; } + + .mt-lg-4 { margin-top: $spacer-4; } + .mr-lg-4 { margin-right: $spacer-4; } + .mb-lg-4 { margin-bottom: $spacer-4; } + .ml-lg-4 { margin-left: $spacer-4; } +} + +// Link styles for social icons +.link-social { + text-decoration: none; + font-weight: bold; + line-height: 1; + + &:hover { + text-decoration: none !important; + } +} + +// Link styles for navigation +.link-primary { + font-weight: bold; + text-decoration: none !important; + + &:hover { + color: $color-primary-link; + text-decoration: none !important; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_variables.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_variables.scss new file mode 100644 index 000000000000..66b0361a0f54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/_sass/_variables.scss @@ -0,0 +1,35 @@ + +// Font family +$body-font-family: "Helvetica Neue", Arial, sans-serif; +$body-font-size: 16px; +$prose-font-size: 20px; + + +// Type scale +$h0-mobile: 64px; +$h0-desktop: 128px; + +$h1-size: 40px !default; +$h2-size: 32px !default; +$h3-size: 24px !default; +$h4-size: 20px !default; +$h5-size: 16px !default; +$h6-size: 12px !default; + +// Default border color +$color-border: #ddd !default; + +// Container width +$container-width: 64em; + +// Large breakpoint +$breakpoint-lg: 52em; + +// Spacing unit +$spacer: 8px !default; + +// Spacing scale +$spacer-1: $spacer !default; // 8px +$spacer-2: ($spacer * 2) !default; // 16px +$spacer-3: ($spacer * 4) !default; // 32px +$spacer-4: ($spacer * 8) !default; // 64px diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/assets/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/assets/style.scss new file mode 100644 index 000000000000..bf4f155ef6d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-swiss-1.0.0/assets/style.scss @@ -0,0 +1,9 @@ +--- +# Only the main Sass file needs front matter (the dashes are enough) +--- +@charset "utf-8"; + +// Import partials from `sass_dir` and set theme here +@import + "theme-{{ site.theme_color | default: "black" }}.scss" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/README.md new file mode 100644 index 000000000000..101bc166a9d2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Architect theme + +[![Build Status](https://travis-ci.org/pages-themes/architect.svg?branch=master)](https://travis-ci.org/pages-themes/architect) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-architect.svg)](https://badge.fury.io/rb/jekyll-theme-architect) + +*Architect is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/architect), or even [use it today](#usage).* + +![Thumbnail of Architect](thumbnail.png) + +## Usage + +To use the Architect theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-architect + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Architect will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/architect/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/architect/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/architect/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Architect theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Architect? We'd love your help. Architect is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/architect`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..7fa1c5f883ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_layouts/default.html @@ -0,0 +1,71 @@ +<!DOCTYPE html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset='utf-8'> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}" media="screen" type="text/css"> + <link rel="stylesheet" href="{{ '/assets/css/print.css' | relative_url }}" media="print" type="text/css"> + + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + +{% seo %} + </head> + + <body> + <header> + <div class="inner"> + <a href="{{ '/' | absolute_url }}"> + <h1>{{ site.title | default: site.github.repository_name }}</h1> + </a> + <h2>{{ site.description | default: site.github.project_tagline }}</h2> + {% if site.github.is_project_page %} + <a href="{{ site.github.repository_url }}" class="button"><small>View project on</small> GitHub</a> + {% endif %} + {% if site.github.is_user_page %} + <a href="{{ site.github.owner_url }}" class="button"><small>Follow me on</small> GitHub</a> + {% endif %} + </div> + </header> + + <div id="content-wrapper"> + <div class="inner clearfix"> + <section id="main-content"> + {{ content }} + </section> + + <aside id="sidebar"> + {% if site.show_downloads %} + <a href="{{ site.github.zip_url }}" class="button"> + <small>Download</small> + .zip file + </a> + <a href="{{ site.github.tar_url }}" class="button"> + <small>Download</small> + .tar.gz file + </a> + {% endif %} + + {% if site.github.is_project_page %} + <p class="repo-owner"><a href="{{ site.github.repository_url }}">{{ site.github.repository_name }}</a> is maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a>.</p> + {% endif %} + + <p>This page was generated by <a href="https://pages.github.com">GitHub Pages</a>.</p> + </aside> + </div> + </div> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_sass/jekyll-theme-architect.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_sass/jekyll-theme-architect.scss new file mode 100644 index 000000000000..43f045e11271 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_sass/jekyll-theme-architect.scss @@ -0,0 +1,455 @@ +@import "normalize"; +@import "rouge-github"; +@import url('https://fonts.googleapis.com/css?family=Architects+Daughter'); + +/* LAYOUT STYLES */ +body { + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 15px; + font-weight: 400; + line-height: 1.5; + color: #666; + background: #fafafa url(../images/body-bg.jpg) 0 0 repeat; +} + +p { + margin-top: 0; +} + +a { + color: #2879d0; +} +a:hover { + color: #2268b2; +} + +header { + padding-top: 40px; + padding-bottom: 40px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + background: #2e7bcf url(../images/header-bg.jpg) 0 0 repeat-x; + border-bottom: solid 1px #275da1; +} + +header h1 { + width: 540px; + margin-top: 0; + margin-bottom: 0.2em; + font-size: 72px; + font-weight: normal; + line-height: 1; + color: #fff; + letter-spacing: -1px; +} + +header h2 { + width: 540px; + margin-top: 0; + margin-bottom: 0; + font-size: 26px; + font-weight: normal; + line-height: 1.3; + color: #9ddcff; + letter-spacing: 0; +} + +.inner { + position: relative; + width: 940px; + margin: 0 auto; +} + +#content-wrapper { + padding-top: 30px; + border-top: solid 1px #fff; +} + +#main-content { + float: left; + width: 690px; +} + +#main-content img { + max-width: 100%; +} + +aside#sidebar { + float: right; + width: 200px; + min-height: 504px; + padding-left: 20px; + font-size: 12px; + line-height: 1.3; + background: transparent url(../images/sidebar-bg.jpg) 0 0 no-repeat; +} + +aside#sidebar p.repo-owner, +aside#sidebar p.repo-owner a { + font-weight: bold; +} + +#downloads { + margin-bottom: 40px; +} + +a.button { + width: 134px; + height: 58px; + padding-top: 22px; + padding-left: 68px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 23px; + line-height: 1.2; + color: #fff; +} +a.button small { + display: block; + font-size: 11px; +} +header a.button { + position: absolute; + top: 0; + right: 0; + background: transparent url(../images/github-button.png) 0 0 no-repeat; +} +aside a.button { + display: block; + width: 138px; + padding-left: 64px; + margin-bottom: 20px; + font-size: 21px; + background: transparent url(../images/download-button.png) 0 0 no-repeat; +} + +code, pre { + margin-bottom: 30px; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + font-size: 13px; + color: #222; +} + +code { + padding: 0 3px; + background-color: #f2f8fc; + border: solid 1px #dbe7f3; +} + +pre { + padding: 20px; + overflow: auto; + text-shadow: none; + background: #fff; + border: solid 1px #f2f2f2; +} +pre code { + padding: 0; + color: #2879d0; + background-color: #fff; + border: none; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +hr { + height: 0; + margin-top: 1em; + margin-bottom: 1em; + border: 0; + border-top: solid 1px #ddd; +} + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + font-weight: 300; + text-align: center; + border: 1px solid #ebebeb; +} + +form { + padding: 20px; + background: #f2f2f2; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +#main-content h1 { + margin-top: 0; + margin-bottom: 0; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 2.8em; + font-weight: normal; + color: #474747; + text-indent: 6px; + letter-spacing: -1px; +} + +#main-content h1:before { + padding-right: 0.3em; + margin-left: -0.9em; + color: #9ddcff; + content: "/"; +} + +#main-content h2 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 22px; + font-weight: bold; + color: #474747; + text-indent: 4px; +} +#main-content h2:before { + padding-right: 0.3em; + margin-left: -1.5em; + content: "//"; + color: #9ddcff; +} + +#main-content h3 { + margin-top: 24px; + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 18px; + font-weight: bold; + color: #474747; + text-indent: 3px; +} + +#main-content h3:before { + padding-right: 0.3em; + margin-left: -2em; + content: "///"; + color: #9ddcff; +} + +#main-content h4 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 15px; + font-weight: bold; + color: #474747; + text-indent: 3px; +} + +h4:before { + padding-right: 0.3em; + margin-left: -2.8em; + content: "////"; + color: #9ddcff; +} + +#main-content h5 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 14px; + color: #474747; + text-indent: 3px; +} +h5:before { + padding-right: 0.3em; + margin-left: -3.2em; + content: "/////"; + color: #9ddcff; +} + +#main-content h6 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: .8em; + color: #474747; + text-indent: 3px; +} +h6:before { + padding-right: 0.3em; + margin-left: -3.7em; + content: "//////"; + color: #9ddcff; +} + +p { + margin-bottom: 20px; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + padding: 0 0 0 30px; + margin-bottom: 20px; + font-size: 15px; + border-left: 10px solid #e9e9e9; +} + +ul { + list-style-position: inside; + list-style: disc; + padding-left: 20px; +} + +ol { + list-style-position: inside; + list-style: decimal; + padding-left: 3px; +} + +dl dd { + font-style: italic; + font-weight: 100; +} + +footer { + padding-top: 20px; + padding-bottom: 30px; + margin-top: 40px; + font-size: 13px; + color: #aaa; +} + +footer a { + color: #666; +} +footer a:hover { + color: #444; +} + +/* MISC */ +.clearfix:after { + display: block; + height: 0; + clear: both; + visibility: hidden; + content: '.'; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} + +/* #Media Queries +================================================== */ + +/* Smaller than standard 960 (devices and browsers) */ +@media only screen and (max-width: 959px) { } + +/* Tablet Portrait size to standard 960 (devices and browsers) */ +@media only screen and (min-width: 768px) and (max-width: 959px) { + .inner { + width: 740px; + } + header h1, header h2 { + width: 340px; + } + header h1 { + font-size: 60px; + } + header h2 { + font-size: 30px; + } + #main-content { + width: 490px; + } + #main-content h1:before, + #main-content h2:before, + #main-content h3:before, + #main-content h4:before, + #main-content h5:before, + #main-content h6:before { + padding-right: 0; + margin-left: 0; + content: none; + } +} + +/* All Mobile Sizes (devices and browser) */ +@media only screen and (max-width: 767px) { + .inner { + width: 93%; + } + header { + padding: 20px 0; + } + header .inner { + position: relative; + } + header h1, header h2 { + width: 100%; + } + header h1 { + font-size: 48px; + } + header h2 { + font-size: 24px; + } + header a.button { + position: relative; + display: inline-block; + width: auto; + height: auto; + padding: 5px 10px; + margin-top: 15px; + font-size: 13px; + line-height: 1; + color: #2879d0; + text-align: center; + background-color: #9ddcff; + background-image: none; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + header a.button small { + display: inline; + font-size: 13px; + } + #main-content, + aside#sidebar { + float: none; + width: 100% ! important; + } + aside#sidebar { + min-height: 0; + padding: 20px 0; + margin-top: 20px; + background-image: none; + border-top: solid 1px #ddd; + } + aside#sidebar a.button { + display: none; + } + #main-content h1:before, + #main-content h2:before, + #main-content h3:before, + #main-content h4:before, + #main-content h5:before, + #main-content h6:before { + padding-right: 0; + margin-left: 0; + content: none; + } +} + +/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ +@media only screen and (min-width: 480px) and (max-width: 767px) { } + +/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ +@media only screen and (max-width: 479px) { } diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_sass/normalize.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_sass/normalize.scss new file mode 100644 index 000000000000..30366a6e9837 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_sass/normalize.scss @@ -0,0 +1,424 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_sass/rouge-github.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_sass/rouge-github.scss new file mode 100644 index 000000000000..daf76adee989 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/_sass/rouge-github.scss @@ -0,0 +1,209 @@ +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight .cm { + color: #999988; + font-style: italic; +} +.highlight .cp { + color: #999999; + font-weight: bold; +} +.highlight .c1 { + color: #999988; + font-style: italic; +} +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; +} +.highlight .c, .highlight .cd { + color: #999988; + font-style: italic; +} +.highlight .err { + color: #a61717; + background-color: #e3d2d2; +} +.highlight .gd { + color: #000000; + background-color: #ffdddd; +} +.highlight .ge { + color: #000000; + font-style: italic; +} +.highlight .gr { + color: #aa0000; +} +.highlight .gh { + color: #999999; +} +.highlight .gi { + color: #000000; + background-color: #ddffdd; +} +.highlight .go { + color: #888888; +} +.highlight .gp { + color: #555555; +} +.highlight .gs { + font-weight: bold; +} +.highlight .gu { + color: #aaaaaa; +} +.highlight .gt { + color: #aa0000; +} +.highlight .kc { + color: #000000; + font-weight: bold; +} +.highlight .kd { + color: #000000; + font-weight: bold; +} +.highlight .kn { + color: #000000; + font-weight: bold; +} +.highlight .kp { + color: #000000; + font-weight: bold; +} +.highlight .kr { + color: #000000; + font-weight: bold; +} +.highlight .kt { + color: #445588; + font-weight: bold; +} +.highlight .k, .highlight .kv { + color: #000000; + font-weight: bold; +} +.highlight .mf { + color: #009999; +} +.highlight .mh { + color: #009999; +} +.highlight .il { + color: #009999; +} +.highlight .mi { + color: #009999; +} +.highlight .mo { + color: #009999; +} +.highlight .m, .highlight .mb, .highlight .mx { + color: #009999; +} +.highlight .sb { + color: #d14; +} +.highlight .sc { + color: #d14; +} +.highlight .sd { + color: #d14; +} +.highlight .s2 { + color: #d14; +} +.highlight .se { + color: #d14; +} +.highlight .sh { + color: #d14; +} +.highlight .si { + color: #d14; +} +.highlight .sx { + color: #d14; +} +.highlight .sr { + color: #009926; +} +.highlight .s1 { + color: #d14; +} +.highlight .ss { + color: #990073; +} +.highlight .s { + color: #d14; +} +.highlight .na { + color: #008080; +} +.highlight .bp { + color: #999999; +} +.highlight .nb { + color: #0086B3; +} +.highlight .nc { + color: #445588; + font-weight: bold; +} +.highlight .no { + color: #008080; +} +.highlight .nd { + color: #3c5d5d; + font-weight: bold; +} +.highlight .ni { + color: #800080; +} +.highlight .ne { + color: #990000; + font-weight: bold; +} +.highlight .nf { + color: #990000; + font-weight: bold; +} +.highlight .nl { + color: #990000; + font-weight: bold; +} +.highlight .nn { + color: #555555; +} +.highlight .nt { + color: #000080; +} +.highlight .vc { + color: #008080; +} +.highlight .vg { + color: #008080; +} +.highlight .vi { + color: #008080; +} +.highlight .nv { + color: #008080; +} +.highlight .ow { + color: #000000; + font-weight: bold; +} +.highlight .o { + color: #000000; + font-weight: bold; +} +.highlight .w { + color: #bbbbbb; +} +.highlight { + background-color: #f8f8f8; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/css/print.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/css/print.scss new file mode 100644 index 000000000000..e9bc8ba9ab44 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/css/print.scss @@ -0,0 +1,231 @@ +--- +--- + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + padding: 0; + margin: 0; + font: inherit; + font-size: 100%; + vertical-align: baseline; + border: 0; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +body { + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 13px; + line-height: 1.5; + color: #000; +} + +a { + font-weight: bold; + color: #d5000d; +} + +header { + padding-top: 35px; + padding-bottom: 10px; +} + +header h1 { + font-size: 48px; + font-weight: bold; + line-height: 1.2; + color: #303030; + letter-spacing: -1px; +} + +header h2 { + font-size: 24px; + font-weight: normal; + line-height: 1.3; + color: #aaa; + letter-spacing: -1px; +} +#downloads { + display: none; +} +#main_content { + padding-top: 20px; +} + +code, pre { + margin-bottom: 30px; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; + font-size: 12px; + color: #222; +} + +code { + padding: 0 3px; +} + +pre { + padding: 20px; + overflow: auto; + border: solid 1px #ddd; +} +pre code { + padding: 0; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + font-weight: 300; + text-align: center; + border: 1px solid #ebebeb; +} + +form { + padding: 20px; + background: #f2f2f2; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +h1 { + font-size: 2.8em; +} + +h2 { + margin-bottom: 8px; + font-size: 22px; + font-weight: bold; + color: #303030; +} + +h3 { + margin-bottom: 8px; + font-size: 18px; + font-weight: bold; + color: #d5000d; +} + +h4 { + font-size: 16px; + font-weight: bold; + color: #303030; +} + +h5 { + font-size: 1em; + color: #303030; +} + +h6 { + font-size: .8em; + color: #303030; +} + +p { + margin-bottom: 20px; + font-weight: 300; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + padding: 0 0 0 30px; + margin-bottom: 20px; + font-size: 1.6em; + border-left: 10px solid #e9e9e9; +} + +ul li { + padding-left: 20px; + list-style-position: inside; + list-style: disc; +} + +ol li { + padding-left: 3px; + list-style-position: inside; + list-style: decimal; +} + +dl dd { + font-style: italic; + font-weight: 100; +} + +footer { + padding-top: 20px; + padding-bottom: 30px; + margin-top: 40px; + font-size: 13px; + color: #aaa; +} + +footer a { + color: #666; +} + +/* MISC */ +.clearfix:after { + display: block; + height: 0; + clear: both; + visibility: hidden; + content: '.'; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..793052a6f7f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import 'jekyll-theme-architect'; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/body-bg.jpg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/body-bg.jpg new file mode 100644 index 000000000000..719fb8863848 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/body-bg.jpg differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/download-button.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/download-button.png new file mode 100644 index 000000000000..c5ffb3a89178 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/download-button.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/github-button.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/github-button.png new file mode 100644 index 000000000000..cd415802340c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/github-button.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/header-bg.jpg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/header-bg.jpg new file mode 100644 index 000000000000..d16497a40f3a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/header-bg.jpg differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/highlight-bg.jpg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/highlight-bg.jpg new file mode 100644 index 000000000000..355e089b2d7d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/highlight-bg.jpg differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/sidebar-bg.jpg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/sidebar-bg.jpg new file mode 100644 index 000000000000..536ead91e35a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-architect-0.1.1/assets/images/sidebar-bg.jpg differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/README.md new file mode 100644 index 000000000000..e48f515f03de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Cayman theme + +[![Build Status](https://travis-ci.org/pages-themes/cayman.svg?branch=master)](https://travis-ci.org/pages-themes/cayman) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-cayman.svg)](https://badge.fury.io/rb/jekyll-theme-cayman) + +*Cayman is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/cayman), or even [use it today](#usage).* + +![Thumbnail of Cayman](thumbnail.png) + +## Usage + +To use the Cayman theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-cayman + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Cayman will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/cayman/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/cayman/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/cayman/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Cayman theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Cayman? We'd love your help. Cayman is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/cayman`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..47541f6681bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_layouts/default.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset="UTF-8"> + +{% seo %} + <meta name="viewport" content="width=device-width, initial-scale=1"> + <meta name="theme-color" content="#157878"> + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}"> + </head> + <body> + <section class="page-header"> + <h1 class="project-name">{{ site.title | default: site.github.repository_name }}</h1> + <h2 class="project-tagline">{{ site.description | default: site.github.project_tagline }}</h2> + {% if site.github.is_project_page %} + <a href="{{ site.github.repository_url }}" class="btn">View on GitHub</a> + {% endif %} + {% if site.show_downloads %} + <a href="{{ site.github.zip_url }}" class="btn">Download .zip</a> + <a href="{{ site.github.tar_url }}" class="btn">Download .tar.gz</a> + {% endif %} + </section> + + <section class="main-content"> + {{ content }} + + <footer class="site-footer"> + {% if site.github.is_project_page %} + <span class="site-footer-owner"><a href="{{ site.github.repository_url }}">{{ site.github.repository_name }}</a> is maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a>.</span> + {% endif %} + <span class="site-footer-credits">This page was generated by <a href="https://pages.github.com">GitHub Pages</a>.</span> + </footer> + </section> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/jekyll-theme-cayman.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/jekyll-theme-cayman.scss new file mode 100644 index 000000000000..1ce80e0f4d70 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/jekyll-theme-cayman.scss @@ -0,0 +1,346 @@ +@import "normalize"; +@import "rouge-github"; +@import "variables"; +@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700'); + +@mixin large { + @media screen and (min-width: #{$large-breakpoint}) { + @content; + } +} + +@mixin medium { + @media screen and (min-width: #{$medium-breakpoint}) and (max-width: #{$large-breakpoint}) { + @content; + } +} + +@mixin small { + @media screen and (max-width: #{$medium-breakpoint}) { + @content; + } +} + +* { + box-sizing: border-box; +} + +body { + padding: 0; + margin: 0; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 1.5; + color: $body-text-color; +} + +a { + color: $body-link-color; + text-decoration: none; + + &:hover { + text-decoration: underline; + } +} + +.btn { + display: inline-block; + margin-bottom: 1rem; + color: rgba(255, 255, 255, 0.7); + background-color: rgba(255, 255, 255, 0.08); + border-color: rgba(255, 255, 255, 0.2); + border-style: solid; + border-width: 1px; + border-radius: 0.3rem; + transition: color 0.2s, background-color 0.2s, border-color 0.2s; + + &:hover { + color: rgba(255, 255, 255, 0.8); + text-decoration: none; + background-color: rgba(255, 255, 255, 0.2); + border-color: rgba(255, 255, 255, 0.3); + } + + + .btn { + margin-left: 1rem; + } + + @include large { + padding: 0.75rem 1rem; + } + + @include medium { + padding: 0.6rem 0.9rem; + font-size: 0.9rem; + } + + @include small { + display: block; + width: 100%; + padding: 0.75rem; + font-size: 0.9rem; + + + .btn { + margin-top: 1rem; + margin-left: 0; + } + } +} + +.page-header { + color: $header-heading-color; + text-align: center; + background-color: $header-bg-color; + background-image: linear-gradient(120deg, $header-bg-color-secondary, $header-bg-color); + + @include large { + padding: 5rem 6rem; + } + + @include medium { + padding: 3rem 4rem; + } + + @include small { + padding: 2rem 1rem; + } +} + +.project-name { + margin-top: 0; + margin-bottom: 0.1rem; + + @include large { + font-size: 3.25rem; + } + + @include medium { + font-size: 2.25rem; + } + + @include small { + font-size: 1.75rem; + } +} + +.project-tagline { + margin-bottom: 2rem; + font-weight: normal; + opacity: 0.7; + + @include large { + font-size: 1.25rem; + } + + @include medium { + font-size: 1.15rem; + } + + @include small { + font-size: 1rem; + } +} + +.main-content { + word-wrap: break-word; + + :first-child { + margin-top: 0; + } + + @include large { + max-width: 64rem; + padding: 2rem 6rem; + margin: 0 auto; + font-size: 1.1rem; + } + + @include medium { + padding: 2rem 4rem; + font-size: 1.1rem; + } + + @include small { + padding: 2rem 1rem; + font-size: 1rem; + } + + img { + max-width: 100%; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + margin-top: 2rem; + margin-bottom: 1rem; + font-weight: normal; + color: $section-headings-color; + } + + p { + margin-bottom: 1em; + } + + code { + padding: 2px 4px; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 0.9rem; + color: $code-text-color; + background-color: $code-bg-color; + border-radius: 0.3rem; + } + + pre { + padding: 0.8rem; + margin-top: 0; + margin-bottom: 1rem; + font: 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace; + color: $code-text-color; + word-wrap: normal; + background-color: $code-bg-color; + border: solid 1px $border-color; + border-radius: 0.3rem; + + > code { + padding: 0; + margin: 0; + font-size: 0.9rem; + color: $code-text-color; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; + } + } + + .highlight { + margin-bottom: 1rem; + + pre { + margin-bottom: 0; + word-break: normal; + } + } + + .highlight pre, + pre { + padding: 0.8rem; + overflow: auto; + font-size: 0.9rem; + line-height: 1.45; + border-radius: 0.3rem; + -webkit-overflow-scrolling: touch; + } + + pre code, + pre tt { + display: inline; + max-width: initial; + padding: 0; + margin: 0; + overflow: initial; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; + + &:before, + &:after { + content: normal; + } + } + + ul, + ol { + margin-top: 0; + } + + blockquote { + padding: 0 1rem; + margin-left: 0; + color: $blockquote-text-color; + border-left: 0.3rem solid $border-color; + + > :first-child { + margin-top: 0; + } + + > :last-child { + margin-bottom: 0; + } + } + + table { + display: block; + width: 100%; + overflow: auto; + word-break: normal; + word-break: keep-all; // For Firefox to horizontally scroll wider tables. + -webkit-overflow-scrolling: touch; + + th { + font-weight: bold; + } + + th, + td { + padding: 0.5rem 1rem; + border: 1px solid $table-border-color; + } + } + + dl { + padding: 0; + + dt { + padding: 0; + margin-top: 1rem; + font-size: 1rem; + font-weight: bold; + } + + dd { + padding: 0; + margin-bottom: 1rem; + } + } + + hr { + height: 2px; + padding: 0; + margin: 1rem 0; + background-color: $hr-border-color; + border: 0; + } +} + +.site-footer { + padding-top: 2rem; + margin-top: 2rem; + border-top: solid 1px $hr-border-color; + + @include large { + font-size: 1rem; + } + + @include medium { + font-size: 1rem; + } + + @include small { + font-size: 0.9rem; + } +} + +.site-footer-owner { + display: block; + font-weight: bold; +} + +.site-footer-credits { + color: $blockquote-text-color; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/normalize.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/normalize.scss new file mode 100644 index 000000000000..30366a6e9837 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/normalize.scss @@ -0,0 +1,424 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/rouge-github.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/rouge-github.scss new file mode 100644 index 000000000000..daf76adee989 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/rouge-github.scss @@ -0,0 +1,209 @@ +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight .cm { + color: #999988; + font-style: italic; +} +.highlight .cp { + color: #999999; + font-weight: bold; +} +.highlight .c1 { + color: #999988; + font-style: italic; +} +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; +} +.highlight .c, .highlight .cd { + color: #999988; + font-style: italic; +} +.highlight .err { + color: #a61717; + background-color: #e3d2d2; +} +.highlight .gd { + color: #000000; + background-color: #ffdddd; +} +.highlight .ge { + color: #000000; + font-style: italic; +} +.highlight .gr { + color: #aa0000; +} +.highlight .gh { + color: #999999; +} +.highlight .gi { + color: #000000; + background-color: #ddffdd; +} +.highlight .go { + color: #888888; +} +.highlight .gp { + color: #555555; +} +.highlight .gs { + font-weight: bold; +} +.highlight .gu { + color: #aaaaaa; +} +.highlight .gt { + color: #aa0000; +} +.highlight .kc { + color: #000000; + font-weight: bold; +} +.highlight .kd { + color: #000000; + font-weight: bold; +} +.highlight .kn { + color: #000000; + font-weight: bold; +} +.highlight .kp { + color: #000000; + font-weight: bold; +} +.highlight .kr { + color: #000000; + font-weight: bold; +} +.highlight .kt { + color: #445588; + font-weight: bold; +} +.highlight .k, .highlight .kv { + color: #000000; + font-weight: bold; +} +.highlight .mf { + color: #009999; +} +.highlight .mh { + color: #009999; +} +.highlight .il { + color: #009999; +} +.highlight .mi { + color: #009999; +} +.highlight .mo { + color: #009999; +} +.highlight .m, .highlight .mb, .highlight .mx { + color: #009999; +} +.highlight .sb { + color: #d14; +} +.highlight .sc { + color: #d14; +} +.highlight .sd { + color: #d14; +} +.highlight .s2 { + color: #d14; +} +.highlight .se { + color: #d14; +} +.highlight .sh { + color: #d14; +} +.highlight .si { + color: #d14; +} +.highlight .sx { + color: #d14; +} +.highlight .sr { + color: #009926; +} +.highlight .s1 { + color: #d14; +} +.highlight .ss { + color: #990073; +} +.highlight .s { + color: #d14; +} +.highlight .na { + color: #008080; +} +.highlight .bp { + color: #999999; +} +.highlight .nb { + color: #0086B3; +} +.highlight .nc { + color: #445588; + font-weight: bold; +} +.highlight .no { + color: #008080; +} +.highlight .nd { + color: #3c5d5d; + font-weight: bold; +} +.highlight .ni { + color: #800080; +} +.highlight .ne { + color: #990000; + font-weight: bold; +} +.highlight .nf { + color: #990000; + font-weight: bold; +} +.highlight .nl { + color: #990000; + font-weight: bold; +} +.highlight .nn { + color: #555555; +} +.highlight .nt { + color: #000080; +} +.highlight .vc { + color: #008080; +} +.highlight .vg { + color: #008080; +} +.highlight .vi { + color: #008080; +} +.highlight .nv { + color: #008080; +} +.highlight .ow { + color: #000000; + font-weight: bold; +} +.highlight .o { + color: #000000; + font-weight: bold; +} +.highlight .w { + color: #bbbbbb; +} +.highlight { + background-color: #f8f8f8; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/variables.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/variables.scss new file mode 100644 index 000000000000..bf564509c845 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/_sass/variables.scss @@ -0,0 +1,23 @@ +// Breakpoints +$large-breakpoint: 64em !default; +$medium-breakpoint: 42em !default; + +// Headers +$header-heading-color: #fff !default; +$header-bg-color: #159957 !default; +$header-bg-color-secondary: #155799 !default; + +// Text +$section-headings-color: #159957 !default; +$body-text-color: #606c71 !default; +$body-link-color: #1e6bb8 !default; +$blockquote-text-color: #819198 !default; + +// Code +$code-bg-color: #f3f6fa !default; +$code-text-color: #567482 !default; + +// Borders +$border-color: #dce6f0 !default; +$table-border-color: #e9ebec !default; +$hr-border-color: #eff0f1 !default; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..46e65d9696c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-cayman-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import 'jekyll-theme-cayman'; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/README.md new file mode 100644 index 000000000000..a909e9b63fb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Dinky theme + +[![Build Status](https://travis-ci.org/pages-themes/dinky.svg?branch=master)](https://travis-ci.org/pages-themes/dinky) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-dinky.svg)](https://badge.fury.io/rb/jekyll-theme-dinky) + +*Dinky is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/dinky), or even [use it today](#usage).* + +![Thumbnail of Dinky](thumbnail.png) + +## Usage + +To use the Dinky theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-dinky + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Dinky will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/dinky/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/dinky/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/dinky/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Dinky theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Dinky? We'd love your help. Dinky is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/dinky`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..e20390274f27 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/_layouts/default.html @@ -0,0 +1,60 @@ +<!doctype html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + +{% seo %} + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}"> + <script src="{{ '/assets/js/scale.fix.js' | relative_url }}"></script> + <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + </head> + <body> + <div class="wrapper"> + <header> + <h1 class="header">{{ site.title | default: site.github.repository_name }}</h1> + <p class="header">{{ site.description | default: site.github.project_tagline }}</p> + + <ul> + {% if site.show_downloads %} + <li class="download"><a class="buttons" href="{{ site.github.zip_url }}">Download ZIP</a></li> + <li class="download"><a class="buttons" href="{{ site.github.tar_url }}">Download TAR</a></li> + {% endif %} + <li><a class="buttons github" href="{{ site.github.repository_url }}">View On GitHub</a></li> + </ul> + + {% if site.github.is_project_page %} + <p class="header">This project is maintained by <a class="header name" href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p> + {% endif %} + + {% if site.github.is_user_page %} + <ul> + <li><a class="buttons github" href="{{ site.github.owner_url }}">GitHub Profile</a></li> + </ul> + {% endif %} + </header> + + <section> + {{ content }} + </section> + + <footer> + <p><small>Hosted on <a href="https://pages.github.com">GitHub Pages</a> using the Dinky theme</small></p> + </footer> + </div> + <!--[if !IE]><script>fixScale(document);</script><![endif]--> + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/_sass/jekyll-theme-dinky.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/_sass/jekyll-theme-dinky.scss new file mode 100644 index 000000000000..d6e175685a46 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/_sass/jekyll-theme-dinky.scss @@ -0,0 +1,424 @@ +@import "rouge-github"; +@import url('https://fonts.googleapis.com/css?family=Arvo:400,700,400italic'); + +/* MeyerWeb Reset */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} + + +/* Base text styles */ + +body { + padding:10px 50px 0 0; + font-family:"Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + color: #232323; + background-color: #FBFAF7; + margin: 0; + line-height: 1.8em; + -webkit-font-smoothing: antialiased; + +} + +h1, h2, h3, h4, h5, h6 { + color:#232323; + margin:36px 0 10px; +} + +p, ul, ol, table, dl { + margin:0 0 22px; +} + +h1, h2, h3 { + font-family: Arvo, Monaco, serif; + line-height:1.3; + font-weight: normal; +} + +h1,h2, h3 { + display: block; + border-bottom: 1px solid #ccc; + padding-bottom: 5px; +} + +h1 { + font-size: 30px; +} + +h2 { + font-size: 24px; +} + +h3 { + font-size: 18px; +} + +h4, h5, h6 { + font-family: Arvo, Monaco, serif; + font-weight: 700; +} + +a { + color:#C30000; + font-weight:200; + text-decoration:none; +} + +a:hover { + text-decoration: underline; +} + +a small { + font-size: 12px; +} + +em { + font-style: italic; +} + +strong { + font-weight:700; +} + +ul { + list-style-position: inside; + list-style: disc; + padding-left: 25px; +} + +ol { + list-style-position: inside; + list-style: decimal; + padding-left: 25px; +} + +blockquote { + margin: 0; + padding: 0 0 0 20px; + font-style: italic; +} + +dl, dt, dd, dl p { + color: #444; +} + +dl dt { + font-weight: bold; +} + +dl dd { + padding-left: 20px; + font-style: italic; +} + +dl p { + padding-left: 20px; + font-style: italic; +} + +hr { + border:0; + background:#ccc; + height:1px; + margin:0 0 24px; +} + +/* Images */ + +img { + position: relative; + margin: 0 auto; + max-width: 650px; + padding: 5px; + margin: 10px 0 32px 0; + border: 1px solid #ccc; +} + +p img, .emoji { + display: inline; + margin: 0; + padding: 0; + vertical-align: middle; + text-align: center; + border: none; +} + +/* Code blocks */ + +code, pre { + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + color:#000; + font-size:14px; +} + +pre { + padding: 4px 12px; + background: #FDFEFB; + border-radius:4px; + border:1px solid #D7D8C8; + overflow: auto; + overflow-y: hidden; + margin-bottom: 32px; +} + + +/* Tables */ + +table { + width:100%; +} + +table { + border: 1px solid #ccc; + margin-bottom: 32px; + text-align: left; + } + +th { + font-family: 'Arvo', Helvetica, Arial, sans-serif; + font-size: 18px; + font-weight: normal; + padding: 10px; + background: #232323; + color: #FDFEFB; + } + +td { + padding: 10px; + background: #ccc; + } + + +/* Wrapper */ +.wrapper { + width:960px; +} + + +/* Header */ + +header { + background-color: #171717; + color: #FDFDFB; + width:170px; + float:left; + position:fixed; + border: 1px solid #000; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + padding: 34px 25px 22px 50px; + margin: 30px 25px 0 0; + -webkit-font-smoothing: antialiased; +} + +p.header { + font-size: 16px; +} + +h1.header { + font-family: Arvo, sans-serif; + font-size: 30px; + font-weight: 300; + line-height: 1.3em; + border-bottom: none; + margin-top: 0; +} + + +h1.header, a.header, a.name, header a{ + color: #fff; +} + +a.header { + text-decoration: underline; +} + +a.name { + white-space: nowrap; +} + +header ul { + list-style:none; + padding:0; +} + +header li { + list-style-type: none; + width:132px; + height:15px; + margin-bottom: 12px; + line-height: 1em; + padding: 6px 6px 6px 7px; + + background: #AF0011; + background: -moz-linear-gradient(top, #AF0011 0%, #820011 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); + background: -webkit-linear-gradient(top, #AF0011 0%,#820011 100%); + background: -o-linear-gradient(top, #AF0011 0%,#820011 100%); + background: -ms-linear-gradient(top, #AF0011 0%,#820011 100%); + background: linear-gradient(to top, #AF0011 0%,#820011 100%); + + border-radius:4px; + border:1px solid #0D0D0D; + + -webkit-box-shadow: inset 0px 1px 1px 0 rgba(233,2,38, 1); + box-shadow: inset 0px 1px 1px 0 rgba(233,2,38, 1); + +} + +header li:hover { + background: #C3001D; + background: -moz-linear-gradient(top, #C3001D 0%, #950119 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); + background: -webkit-linear-gradient(top, #C3001D 0%,#950119 100%); + background: -o-linear-gradient(top, #C3001D 0%,#950119 100%); + background: -ms-linear-gradient(top, #C3001D 0%,#950119 100%); + background: linear-gradient(to top, #C3001D 0%,#950119 100%); +} + +a.buttons { + -webkit-font-smoothing: antialiased; + background: url(../images/arrow-down.png) no-repeat; + font-weight: normal; + text-shadow: rgba(0, 0, 0, 0.4) 0 -1px 0; + padding: 2px 2px 2px 22px; + height: 30px; +} + +a.github { + background: url(../images/octocat-small.png) no-repeat 1px; +} + +a.buttons:hover { + color: #fff; + text-decoration: none; +} + + +/* Section - for main page content */ + +section { + width:650px; + float:right; + padding-bottom:50px; +} + + +/* Footer */ + +footer { + width:170px; + float:left; + position:fixed; + bottom:10px; + padding-left: 50px; +} + +@media print, screen and (max-width: 960px) { + + div.wrapper { + width:auto; + margin:0; + } + + header, section, footer { + float:none; + position:static; + width:auto; + } + + footer { + border-top: 1px solid #ccc; + margin:0 84px 0 50px; + padding:0; + } + + header { + padding-right:320px; + } + + section { + padding:20px 84px 20px 50px; + margin:0 0 20px; + } + + header a small { + display:inline; + } + + header ul { + position:absolute; + right:130px; + top:84px; + } +} + +@media print, screen and (max-width: 720px) { + body { + word-wrap:break-word; + } + + header { + padding:10px 20px 0; + margin-right: 0; + } + + section { + padding:10px 0 10px 20px; + margin:0 0 30px; + } + + footer { + margin: 0 0 0 30px; + } + + header ul, header p.view { + position:static; + } +} + +@media print, screen and (max-width: 480px) { + + header ul li.download { + display:none; + } + + footer { + margin: 0 0 0 20px; + } + + footer a{ + display:block; + } + +} + +@media print { + body { + padding:0.4in; + font-size:12pt; + color:#444; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/_sass/rouge-github.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/_sass/rouge-github.scss new file mode 100644 index 000000000000..daf76adee989 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/_sass/rouge-github.scss @@ -0,0 +1,209 @@ +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight .cm { + color: #999988; + font-style: italic; +} +.highlight .cp { + color: #999999; + font-weight: bold; +} +.highlight .c1 { + color: #999988; + font-style: italic; +} +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; +} +.highlight .c, .highlight .cd { + color: #999988; + font-style: italic; +} +.highlight .err { + color: #a61717; + background-color: #e3d2d2; +} +.highlight .gd { + color: #000000; + background-color: #ffdddd; +} +.highlight .ge { + color: #000000; + font-style: italic; +} +.highlight .gr { + color: #aa0000; +} +.highlight .gh { + color: #999999; +} +.highlight .gi { + color: #000000; + background-color: #ddffdd; +} +.highlight .go { + color: #888888; +} +.highlight .gp { + color: #555555; +} +.highlight .gs { + font-weight: bold; +} +.highlight .gu { + color: #aaaaaa; +} +.highlight .gt { + color: #aa0000; +} +.highlight .kc { + color: #000000; + font-weight: bold; +} +.highlight .kd { + color: #000000; + font-weight: bold; +} +.highlight .kn { + color: #000000; + font-weight: bold; +} +.highlight .kp { + color: #000000; + font-weight: bold; +} +.highlight .kr { + color: #000000; + font-weight: bold; +} +.highlight .kt { + color: #445588; + font-weight: bold; +} +.highlight .k, .highlight .kv { + color: #000000; + font-weight: bold; +} +.highlight .mf { + color: #009999; +} +.highlight .mh { + color: #009999; +} +.highlight .il { + color: #009999; +} +.highlight .mi { + color: #009999; +} +.highlight .mo { + color: #009999; +} +.highlight .m, .highlight .mb, .highlight .mx { + color: #009999; +} +.highlight .sb { + color: #d14; +} +.highlight .sc { + color: #d14; +} +.highlight .sd { + color: #d14; +} +.highlight .s2 { + color: #d14; +} +.highlight .se { + color: #d14; +} +.highlight .sh { + color: #d14; +} +.highlight .si { + color: #d14; +} +.highlight .sx { + color: #d14; +} +.highlight .sr { + color: #009926; +} +.highlight .s1 { + color: #d14; +} +.highlight .ss { + color: #990073; +} +.highlight .s { + color: #d14; +} +.highlight .na { + color: #008080; +} +.highlight .bp { + color: #999999; +} +.highlight .nb { + color: #0086B3; +} +.highlight .nc { + color: #445588; + font-weight: bold; +} +.highlight .no { + color: #008080; +} +.highlight .nd { + color: #3c5d5d; + font-weight: bold; +} +.highlight .ni { + color: #800080; +} +.highlight .ne { + color: #990000; + font-weight: bold; +} +.highlight .nf { + color: #990000; + font-weight: bold; +} +.highlight .nl { + color: #990000; + font-weight: bold; +} +.highlight .nn { + color: #555555; +} +.highlight .nt { + color: #000080; +} +.highlight .vc { + color: #008080; +} +.highlight .vg { + color: #008080; +} +.highlight .vi { + color: #008080; +} +.highlight .nv { + color: #008080; +} +.highlight .ow { + color: #000000; + font-weight: bold; +} +.highlight .o { + color: #000000; + font-weight: bold; +} +.highlight .w { + color: #bbbbbb; +} +.highlight { + background-color: #f8f8f8; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..bc852a15db28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import 'jekyll-theme-dinky'; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/images/arrow-down.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/images/arrow-down.png new file mode 100644 index 000000000000..5c55c6a8c9ed Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/images/arrow-down.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/images/octocat-small.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/images/octocat-small.png new file mode 100644 index 000000000000..57c1e44f9b67 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/images/octocat-small.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/js/scale.fix.js b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/js/scale.fix.js new file mode 100644 index 000000000000..08716c00605a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-dinky-0.1.1/assets/js/scale.fix.js @@ -0,0 +1,20 @@ +fixScale = function(doc) { + + var addEvent = 'addEventListener', + type = 'gesturestart', + qsa = 'querySelectorAll', + scales = [1, 1], + meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : []; + + function fix() { + meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1]; + doc.removeEventListener(type, fix, true); + } + + if ((meta = meta[meta.length - 1]) && addEvent in doc) { + fix(); + scales = [.25, 1.6]; + doc[addEvent](type, fix, true); + } + +}; \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/README.md new file mode 100644 index 000000000000..424e10973477 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/README.md @@ -0,0 +1,109 @@ +# The Hacker theme + +[![Build Status](https://travis-ci.org/pages-themes/hacker.svg?branch=master)](https://travis-ci.org/pages-themes/hacker) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-hacker.svg)](https://badge.fury.io/rb/jekyll-theme-hacker) + +*Hacker is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/hacker), or even [use it today](#usage).* + +![Thumbnail of Hacker](thumbnail.png) + +## Usage + +To use the Hacker theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-hacker + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Hacker will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/hacker/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/hacker/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/hacker/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Hacker theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Hacker? We'd love your help. Hacker is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/hacker`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_layouts/default.html new file mode 100644 index 000000000000..aa651986a261 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_layouts/default.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset='utf-8'> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}"> + +{% seo %} + </head> + + <body> + + <header> + <div class="container"> + <a id="a-title" href="{{ '/' | relative_url }}"> + <h1>{{ site.title | default: site.github.repository_name }}</h1> + </a> + <h2>{{ site.description | default: site.github.project_tagline }}</h2> + + <section id="downloads"> + {% if site.show_downloads %} + <a href="{{ site.github.zip_url }}" class="btn">Download as .zip</a> + <a href="{{ site.github.tar_url }}" class="btn">Download as .tar.gz</a> + {% endif %} + <a href="{{ site.github.repository_url }}" class="btn btn-github"><span class="icon"></span>View on GitHub</a> + </section> + </div> + </header> + + <div class="container"> + <section id="main_content"> + {{ content }} + </section> + </div> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_layouts/post.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_layouts/post.html new file mode 100644 index 000000000000..0676aff31c49 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_layouts/post.html @@ -0,0 +1,14 @@ +--- +layout: default +--- + +<small>{{ page.date | date: "%-d %B %Y" }}</small> +<h1>{{ page.title }}</h1> + +<p class="view">by {{ page.author | default: site.author }}</p> + +{{content}} + +{% if page.tags %} + <small>tags: <em>{{ page.tags | join: "</em> - <em>" }}</em></small> +{% endif %} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_sass/_default_colors.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_sass/_default_colors.scss new file mode 100644 index 000000000000..dee878d702a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_sass/_default_colors.scss @@ -0,0 +1,15 @@ +$apple-blossom: #ac4142; +$alto: #d0d0d0; +$bouquet: #aa759f; +$chelsea-cucumber: #90a959; +$cod-grey: #151515; +$conifer: #b5e853; +$dove-grey: #666; +$gallery: #eaeaea; +$grey: #888; +$gulf-stream: #75b5aa; +$hippie-blue: #6a9fb5; +$potters-clay: #8f5536; +$rajah: #f4bf75; +$raw-sienna: #d28445; +$silver-chalice: #aaa; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_sass/jekyll-theme-hacker.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_sass/jekyll-theme-hacker.scss new file mode 100644 index 000000000000..b3123a11ce36 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_sass/jekyll-theme-hacker.scss @@ -0,0 +1,268 @@ +@import "rouge-base16-dark"; +@import "default_colors"; + +$body-background: $cod-grey !default; +$body-foreground: $gallery !default; +$header: $conifer !default; +$blockquote-color: $silver-chalice !default; +$blockquote-border: $dove-grey !default; +$container-max-width: 1000px; + +@mixin media-max-width($max-width) { + @media (max-width: $max-width) { + @content; + } +} + +body { + margin: 0; + padding: 0; + background: $body-background url("../images/bkg.png") 0 0; + color: $body-foreground; + font-size: 16px; + line-height: 1.5; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; +} + +/* General & 'Reset' Stuff */ + +.container { + width: 90%; + max-width: $container-max-width; + margin: 0 auto; +} + +section { + display: block; + margin: 0 0 20px 0; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0 0 20px; +} + +li { + line-height: 1.4 ; +} + +/* Header, <header> + header - container + h1 - project name + h2 - project description +*/ + +header { + background: rgba(0, 0, 0, 0.1); + width: 100%; + border-bottom: 1px dashed $conifer; //header; + padding: 20px 0; + margin: 0 0 40px 0; +} + +header h1 { + font-size: 30px; + line-height: 1.5; + margin: 0 0 0 -40px; + font-weight: bold; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + color: $conifer;//$header; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), + 0 0 5px rgba(181, 232, 83, 0.1), + 0 0 10px rgba(181, 232, 83, 0.1); + letter-spacing: -1px; + -webkit-font-smoothing: antialiased; + @include media-max-width($container-max-width) { + margin-left: 0; + } +} + + +header h1:before { + content: "./ "; + font-size: 24px; +} + +header h2 { + font-size: 18px; + font-weight: 300; + color: #666; +} + +#downloads .btn { + display: inline-block; + text-align: center; + margin: 0; +} + +/* Main Content +*/ + +#main_content { + width: 100%; + -webkit-font-smoothing: antialiased; +} +section img { + max-width: 100% +} + +h1, h2, h3, h4, h5, h6 { + font-weight: normal; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + color: $header; + letter-spacing: -0.03em; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), + 0 0 5px rgba(181, 232, 83, 0.1), + 0 0 10px rgba(181, 232, 83, 0.1); +} + +#main_content h1 { + font-size: 30px; +} + +#main_content h2 { + font-size: 24px; +} + +#main_content h3 { + font-size: 18px; +} + +#main_content h4 { + font-size: 14px; +} + +#main_content h5 { + font-size: 12px; + text-transform: uppercase; + margin: 0 0 5px 0; +} + +#main_content h6 { + font-size: 12px; + text-transform: uppercase; + color: #999; + margin: 0 0 5px 0; +} + +dt { + font-style: italic; + font-weight: bold; +} + +ul li { + list-style-image:url('../images/bullet.png'); +} + +blockquote { + color: $blockquote-color; + padding-left: 10px; + border-left: 1px dotted $blockquote-border; +} + +pre { + background: rgba(0, 0, 0, 0.9); + border: 1px solid rgba(255, 255, 255, 0.15); + padding: 10px; + font-size: 16px; + color: #b5e853; + border-radius: 2px; + word-wrap: normal; + overflow: auto; + overflow-y: hidden; +} + +code.highlighter-rouge { + background: rgba(0,0,0,0.9); + border: 1px solid rgba(255, 255, 255, 0.15); + padding: 0px 3px; + margin: 0px -3px; + color: #aa759f; + border-radius: 2px; +} + +table { + width: 100%; + margin: 0 0 20px 0; +} + +th { + text-align: left; + border-bottom: 1px dashed #b5e853; + padding: 5px 10px; +} + +td { + padding: 5px 10px; +} + +hr { + height: 0; + border: 0; + border-bottom: 1px dashed #b5e853; + color: #b5e853; +} + +/* Buttons +*/ + +.btn { + display: inline-block; + background: -webkit-linear-gradient(top, rgba(40, 40, 40, 0.3), rgba(35, 35, 35, 0.3) 50%, rgba(10, 10, 10, 0.3) 50%, rgba(0, 0, 0, 0.3)); + padding: 8px 18px; + border-radius: 50px; + border: 2px solid rgba(0, 0, 0, 0.7); + border-bottom: 2px solid rgba(0, 0, 0, 0.7); + border-top: 2px solid rgba(0, 0, 0, 1); + color: rgba(255, 255, 255, 0.8); + font-family: Helvetica, Arial, sans-serif; + font-weight: bold; + font-size: 13px; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.75); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05); +} + +.btn:hover { + background: -webkit-linear-gradient(top, rgba(40, 40, 40, 0.6), rgba(35, 35, 35, 0.6) 50%, rgba(10, 10, 10, 0.8) 50%, rgba(0, 0, 0, 0.8)); +} + +.btn .icon { + display: inline-block; + width: 16px; + height: 16px; + margin: 1px 8px 0 0; + float: left; +} + +.btn-github .icon { + opacity: 0.6; + background: url("../images/blacktocat.png") 0 0 no-repeat; +} + +/* Links + a, a:hover, a:visited +*/ + +a { + color: #63c0f5; + text-shadow: 0 0 5px rgba(104, 182, 255, 0.5); +} + +/* Clearfix */ + +.cf:before, .cf:after { + content:""; + display:table; +} + +.cf:after { + clear:both; +} + +.cf { + zoom:1; +} + +#a-title { + text-decoration: none; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_sass/rouge-base16-dark.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_sass/rouge-base16-dark.scss new file mode 100644 index 000000000000..7f839e968fda --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/_sass/rouge-base16-dark.scss @@ -0,0 +1,87 @@ +/* + generated by rouge http://rouge.jneen.net/ + original base16 by Chris Kempson (https://github.com/chriskempson/base16) +*/ + +@import "default_colors"; + +.highlight { + + $plaintext: $alto !default; + $string: $chelsea-cucumber !default; + $literal: $chelsea-cucumber !default; + $keyword: $bouquet !default; + $error-foreground: $cod-grey !default; + $error-background: $apple-blossom !default; + $comment: $grey !default; + $preprocessor: $rajah !default; + $name-space: $rajah !default; + $name-attribute: $hippie-blue !default; + $operator: $rajah !default; + $keyword-type: $raw-sienna !default; + $regex: $gulf-stream !default; + $string-escape: $potters-clay !default; + $deleted: $apple-blossom !default; + $header: $hippie-blue !default; + + color: $plaintext; + + table td { padding: 5px; } + table pre { margin: 0; } + .w { + color: $plaintext; + } + .err { + color: $error-foreground; + background-color: $error-background; + } + .c, .cd, .cm, .c1, .cs { + color: $comment; + } + .cp { + color: $preprocessor; + } + .o, .ow { + color: $operator; + } + .p, .pi { + color: $plaintext; + } + .gi { + color: $string; + } + .gd { + color: $deleted; + } + .gh { + color: $header; + font-weight: bold; + } + .k, .kn, .kp, .kr, .kv { + color: $keyword; + } + .kc, .kt, .kd { + color: $keyword-type; + } + .s, .sb, .sc, .sd, .s2, .sh, .sx, .s1 { + color: $string; + } + .sr { + color: $regex; + } + .si, .se { + color: $string-escape; + } + .nt, .nn, .nc, .no{ + color: $name-space; + } + .na { + color: $name-attribute; + } + .m, .mf, .mh, .mi, .il, .mo, .mb, .mx { + color: $literal; + } + .ss { + color: $string; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/css/style.scss new file mode 100644 index 000000000000..5f1392bde1c5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import 'jekyll-theme-hacker'; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/images/bkg.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/images/bkg.png new file mode 100644 index 000000000000..d10e5caf1adb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/images/bkg.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/images/blacktocat.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/images/blacktocat.png new file mode 100644 index 000000000000..9759d7762ca8 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/images/blacktocat.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/images/bullet.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/images/bullet.png new file mode 100644 index 000000000000..c8f8de1a7e0d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-hacker-0.1.2/assets/images/bullet.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/README.md new file mode 100644 index 000000000000..a1c3f1a2bc46 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Leap day theme + +[![Build Status](https://travis-ci.org/pages-themes/leap-day.svg?branch=master)](https://travis-ci.org/pages-themes/leap-day) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-leap-day.svg)](https://badge.fury.io/rb/jekyll-theme-leap-day) + +*Leap day is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/leap-day), or even [use it today](#usage).* + +![Thumbnail of Leap day](thumbnail.png) + +## Usage + +To use the Leap day theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-leap-day + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Leap day will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/leap-day/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/leap-day/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/leap-day/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Leap day theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Leap day? We'd love your help. Leap day is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/leap-day`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..fff3138179ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_layouts/default.html @@ -0,0 +1,66 @@ +<!doctype html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + +{% seo %} + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}"> + <script src="https://code.jquery.com/jquery-3.3.0.min.js" integrity="sha256-RTQy8VOmNlT6b2PIRur37p6JEBZUE7o8wPgMvu18MC4=" crossorigin="anonymous"></script> + <script src="{{ '/assets/js/main.js' | relative_url }}"></script> + <!--[if lt IE 9]> + <script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" integrity="sha256-3Jy/GbSLrg0o9y5Z5n1uw0qxZECH7C6OQpVBgNFYa0g=" crossorigin="anonymous"></script> + <![endif]--> + <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> + + </head> + <body> + + <header> + <h1>{{ site.title | default: site.github.repository_name }}</h1> + <p>{{ site.description | default: site.github.project_tagline }}</p> + </header> + + <div id="banner"> + <span id="logo"></span> + + <a href="{{ site.github.repository_url }}" class="button fork"><strong>View On GitHub</strong></a> + {% if site.show_downloads %} + <div class="downloads"> + <span>Downloads:</span> + <ul> + <li><a href="{{ site.github.zip_url }}" class="button">ZIP</a></li> + <li><a href="{{ site.github.tar_url }}" class="button">TAR</a></li> + </ul> + </div> + {% endif %} + </div><!-- end banner --> + + <div class="wrapper"> + <nav> + <ul></ul> + </nav> + <section> + {{ content }} + + </section> + <footer> + {% if site.github.is_project_page %} + <p>Project maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p> + {% endif %} + <p><small>Hosted on GitHub Pages &mdash; Theme by <a href="https://twitter.com/michigangraham">mattgraham</a></small></p> + </footer> + </div> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/fonts.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/fonts.scss new file mode 100644 index 000000000000..482518e6e8cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/fonts.scss @@ -0,0 +1,55 @@ + +@font-face { + font-family: 'Quattrocento Sans'; + src: url('../fonts/quattrocentosans-bold-webfont.eot'); + src: url('../fonts/quattrocentosans-bold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/quattrocentosans-bold-webfont.woff') format('woff'), + url('../fonts/quattrocentosans-bold-webfont.ttf') format('truetype'), + url('../fonts/quattrocentosans-bold-webfont.svg#QuattrocentoSansBold') format('svg'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Quattrocento Sans'; + src: url('../fonts/quattrocentosans-bolditalic-webfont.eot'); + src: url('../fonts/quattrocentosans-bolditalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/quattrocentosans-bolditalic-webfont.woff') format('woff'), + url('../fonts/quattrocentosans-bolditalic-webfont.ttf') format('truetype'), + url('../fonts/quattrocentosans-bolditalic-webfont.svg#QuattrocentoSansBoldItalic') format('svg'); + font-weight: bold; + font-style: italic; +} + +@font-face { + font-family: 'Quattrocento Sans'; + src: url('../fonts/quattrocentosans-italic-webfont.eot'); + src: url('../fonts/quattrocentosans-italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/quattrocentosans-italic-webfont.woff') format('woff'), + url('../fonts/quattrocentosans-italic-webfont.ttf') format('truetype'), + url('../fonts/quattrocentosans-italic-webfont.svg#QuattrocentoSansItalic') format('svg'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Quattrocento Sans'; + src: url('../fonts/quattrocentosans-regular-webfont.eot'); + src: url('../fonts/quattrocentosans-regular-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/quattrocentosans-regular-webfont.woff') format('woff'), + url('../fonts/quattrocentosans-regular-webfont.ttf') format('truetype'), + url('../fonts/quattrocentosans-regular-webfont.svg#QuattrocentoSansRegular') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Copse'; + src: url('../fonts/copse-regular-webfont.eot'); + src: url('../fonts/copse-regular-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/copse-regular-webfont.woff') format('woff'), + url('../fonts/copse-regular-webfont.ttf') format('truetype'), + url('../fonts/copse-regular-webfont.svg#CopseRegular') format('svg'); + font-weight: normal; + font-style: normal; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/jekyll-theme-leap-day.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/jekyll-theme-leap-day.scss new file mode 100644 index 000000000000..5b5c797fba3b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/jekyll-theme-leap-day.scss @@ -0,0 +1,516 @@ +/* +Leap Day for GitHub Pages +by Matt Graham +*/ + +@import "normalize"; +@import "fonts"; +@import "rouge-base16-dark"; + +body { + font:14px/22px 'Quattrocento Sans', "Helvetica Neue", Helvetica, Arial, sans-serif; + color:#666; + font-weight:300; + margin: 0px; + padding:0px 0 20px 0px; + background: url(../images/body-background.png) #eae6d1; +} + +h1, h2, h3, h4, h5, h6 { + color:#333; + margin:0 0 10px; +} + +p, ul, ol, table, pre, dl { + margin:0 0 20px; +} + +h1, h2, h3 { + line-height:1.1; +} + +h1 { + font-size:28px; +} + +h2 { + font-size: 24px; + color:#393939; +} + +h3, h4, h5, h6 { + color:#666666; +} + +h3 { + font-size: 18px; + line-height: 24px; +} + +a { + color:#3399cc; + font-weight:400; + text-decoration:none; +} + +a small { + font-size:11px; + color:#666; + margin-top:-0.6em; + display:block; +} + +ul{ + list-style-image:url('../images/bullet.png'); +} + +strong { + font-weight: bold; + color: #333; +} + +.wrapper { + width:650px; + margin:0 auto; + position:relative; +} + +section img { + max-width: 100%; +} + +blockquote { + border-left:1px solid #ffcc00; + margin:0; + padding:0 0 0 20px; + font-style:italic; +} + +code { + font-family: 'Lucida Sans', Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal; + font-size:13px; + color:#efefef; + text-shadow: 0px 1px 0px #000; + margin: 0 4px; + padding: 2px 6px; + background: #333; + border-radius: 2px; +} + +pre { + padding:8px 15px; + background: #333333; + border-radius: 3px; + border:1px solid #c7c7c7; + overflow: auto; + overflow-y: hidden; + + code { + margin: 0px; + padding: 0px; + } +} + +table { + width:100%; + border-collapse:collapse; +} + +th { + text-align:left; + padding:5px 10px; + border-bottom:1px solid #e5e5e5; + color: #444; +} + +td { + text-align:left; + padding:5px 10px; + border-bottom:1px solid #e5e5e5; + border-right: 1px solid #ffcc00; + + &:first-child { + border-left: 1px solid #ffcc00; + } +} + +hr { + border: 0; + outline: none; + height: 11px; + background: transparent url('../images/hr.gif') center center repeat-x; + margin: 0 0 20px; +} + +dt { + color:#444; + font-weight:700; +} + +header { + padding: 25px 20px 40px 20px; + margin: 0; + position: fixed; + top: 0; + left:0; + right:0; + width: 100%; + text-align: center; + background: url(../images/background.png) #4276b6; + box-shadow: 1px 0px 2px rgba(0,0,0,.75); + z-index:99; + -webkit-font-smoothing:antialiased; + min-height: 76px; + + h1 { + font: 40px/48px 'Copse', "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #f3f3f3; + text-shadow: 0px 2px 0px #235796; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + } + + p { + color: #d8d8d8; + text-shadow:rgba(#000, 0.2) 0 1px 0; + font-size: 18px; + margin: 0px; + } +} + +#banner { + z-index: 100; + left:0; + right:50%; + height: 50px; + margin-right:-382px; + position: fixed; + top: 115px; + background: #ffcc00; + border: 1px solid #f0b500; + box-shadow: 0px 1px 3px rgba(0,0,0,.25); + border-radius: 0px 2px 2px 0px; + padding-right: 10px; + + .button { + border: 1px solid #dba500; + background: linear_gradient(rgb(255, 231, 136), rgb(255, 206, 56)); + border-radius: 2px; + box-shadow: inset 0px 1px 0px rgba(255,255,255,.4), 0px 1px 1px rgba(0,0,0,.1); + background-color: #FFE788; + margin-left: 5px; + padding: 10px 12px; + margin-top: 6px; + line-height:14px; + font-size:14px; + color:#333; + font-weight: bold; + display:inline-block; + text-align:center; + + &:hover { + background: linear_gradient(rgb(255, 231, 136), rgb(255, 231, 136)); + background-color: #ffeca0; + } + } + + .fork { + position:fixed; + left:50%; + margin-left:-325px; + padding: 10px 12px; + margin-top: 6px; + line-height:14px; + font-size:14px; + background-color: #FFE788; + } + + .downloads { + float: right; + margin:0 45px 0 0; + + span { + float:left; + line-height:52px; + font-size:90%; + color:#9d7f0d; + text-transform:uppercase; + text-shadow:rgba(#fff, 0.2) 0 1px 0; + } + } + + ul { + list-style:none; + height:40px; + padding:0; + float: left; + margin-left:10px; + + li { + display:inline; + + a.button { + background-color: #FFE788; + } + } + } + + #logo { + position:absolute; + height: 36px; + width: 36px; + right:7px; + top:7px; + display: block; + background: url(../images/octocat-logo.svg); + } +} + +section { + width:590px; + padding: 30px 30px 50px 30px; + margin: 20px 0; + margin-top: 190px; + position:relative; + background: #fbfbfb; + border-radius: 3px; + border: 1px solid #cbcbcb; + box-shadow: 0px 1px 2px rgba(0,0,0,.09), inset 0px 0px 2px 2px rgba(255,255,255,.5), inset 0 0 5px 5px rgba(255,255,255,.4); +} + +small { + font-size:12px; +} + +nav { + width: 230px; + position: fixed; + top: 220px; + left:50%; + margin-left:-580px; + text-align: right; + + ul { + list-style: none; + list-style-image:none; + font-size: 14px; + line-height:24px; + + li { + padding: 5px 0px; + line-height: 16px; + // padding-right:17px; + // position:relative; + // right:-12px; + + &.tag-h1 { + font-size: 1.2em; + + a { + font-weight: bold; + color: #333; + } + + + .tag-h2 { + + } + } + + &.tag-h2 { + + + .tag-h1 { + margin-top:10px; + } + } + } + + a { + color: #666; + + &:hover { color: #999; } + } + + // .active { + // border-right:solid 4px #39C; + // padding-right:13px; + // } + } +} + +footer { + width:180px; + position: fixed; + left:50%; + margin-left:-530px; + bottom:20px; + text-align: right; + line-height: 16px; +} + +@media print, screen and (max-width: 1060px) { + + div.wrapper { + width:auto; + margin:0; + } + + nav{ + display: none; + } + + header, section, footer { + float:none; + + h1 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + } + } + + #banner { + width: 100%; + + .downloads { + margin-right: 60px; + } + + .fork { + } + + #logo { + margin-right: 15px; + } + } + + section { + border:1px solid #e5e5e5; + border-width:1px 0; + padding:20px auto; + margin: 190px auto 20px; + max-width: 600px; + } + + footer{ + text-align: center; + margin: 20px auto; + position: relative; + left:auto; + bottom:auto; + width:auto; + } +} + +@media print, screen and (max-width: 720px) { + body { + word-wrap:break-word; + } + + header { + padding:20px 20px; + margin: 0; + + h1 { + font-size: 32px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + } + + p { display: none;} + } + + #banner { + top: 80px; + + .fork { + float: left; + display: inline-block; + margin-left: 0px; + position:fixed; + left:20px; + + } + } + + section { + margin-top: 130px; + margin-bottom: 0px; + width: auto; + } + + header ul, header p.view { + position:static; + } +} + +@media print, screen and (max-width: 480px) { + body { + } + + header{ + position: relative; + padding: 5px 0px; + min-height: 0px; + + h1 { + font-size: 24px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + } + } + section { + margin-top: 5px; + } + + #banner { display: none;} + header ul { + display:none; + } +} + +@media print { + body { + padding:0.4in; + font-size:12pt; + color:#444; + } +} + +@media print, screen and (max-height: 680px) { + + footer { + text-align: center; + margin: 20px auto; + position: relative; + left:auto; + bottom:auto; + width:auto; + } +} + +@media print, screen and (max-height: 480px) { + nav { + display: none; + } + + footer { + text-align: center; + margin: 20px auto; + position: relative; + left:auto; + bottom:auto; + width:auto; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/normalize.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/normalize.scss new file mode 100644 index 000000000000..2fa717f777f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/normalize.scss @@ -0,0 +1,492 @@ +/*! normalize.css 2012-02-07T12:37 UTC - https://github.com/necolas/normalize.css */ + +/* ============================================================================= + HTML5 display definitions + ========================================================================== */ + +/* + * Corrects block display not defined in IE6/7/8/9 & FF3 + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +summary { + display: block; +} + +/* + * Corrects inline-block display not defined in IE6/7/8/9 & FF3 + */ + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +/* + * Prevents modern browsers from displaying 'audio' without controls + */ + +audio:not([controls]) { + display: none; +} + +/* + * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4 + * Known issue: no IE6 support + */ + +[hidden] { + display: none; +} + + +/* ============================================================================= + Base + ========================================================================== */ + +/* + * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units + * http://clagnut.com/blog/348/#c790 + * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom + * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ + */ + +html { + font-size: 100%; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/* + * Addresses font-family inconsistency between 'textarea' and other form elements. + */ + +html, +button, +input, +select, +textarea { + font-family: sans-serif; +} + +/* + * Addresses margins handled incorrectly in IE6/7 + */ + +body { + margin: 0; +} + + +/* ============================================================================= + Links + ========================================================================== */ + +/* + * Addresses outline displayed oddly in Chrome + */ + +a:focus { + outline: thin dotted; +} + +/* + * Improves readability when focused and also mouse hovered in all browsers + * people.opera.com/patrickl/experiments/keyboard/test + */ + +a:hover, +a:active { + outline: 0; +} + + +/* ============================================================================= + Typography + ========================================================================== */ + +/* + * Addresses font sizes and margins set differently in IE6/7 + * Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5 + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.75em; + margin: 2.33em 0; +} + +/* + * Addresses styling not present in IE7/8/9, S5, Chrome + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/* + * Addresses style set to 'bolder' in FF3+, S4/5, Chrome +*/ + +b, +strong { + font-weight: bold; +} + +blockquote { + margin: 1em 40px; +} + +/* + * Addresses styling not present in S5, Chrome + */ + +dfn { + font-style: italic; +} + +/* + * Addresses styling not present in IE6/7/8/9 + */ + +mark { + background: #ff0; + color: #000; +} + +/* + * Addresses margins set differently in IE6/7 + */ + +p, +pre { + margin: 1em 0; +} + +/* + * Corrects font family set oddly in IE6, S4/5, Chrome + * en.wikipedia.org/wiki/User:Davidgothberg/Test59 + */ + +pre, +code, +kbd, +samp { + font-family: monospace, serif; + _font-family: 'courier new', monospace; + font-size: 1em; +} + +/* + * 1. Addresses CSS quotes not supported in IE6/7 + * 2. Addresses quote property not supported in S4 + */ + +/* 1 */ + +q { + quotes: none; +} + +/* 2 */ + +q:before, +q:after { + content: ''; + content: none; +} + +small { + font-size: 75%; +} + +/* + * Prevents sub and sup affecting line-height in all browsers + * gist.github.com/413930 + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + + +/* ============================================================================= + Lists + ========================================================================== */ + +/* + * Addresses margins set differently in IE6/7 + */ + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +/* + * Addresses paddings set differently in IE6/7 + */ + +menu, +ol, +ul { + padding: 0 0 0 40px; +} + +/* + * Corrects list images handled incorrectly in IE7 + */ + +nav ul, +nav ol { + list-style: none; + list-style-image: none; +} + + +/* ============================================================================= + Embedded content + ========================================================================== */ + +/* + * 1. Removes border when inside 'a' element in IE6/7/8/9, FF3 + * 2. Improves image quality when scaled in IE7 + * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ + */ + +img { + border: 0; /* 1 */ + -ms-interpolation-mode: bicubic; /* 2 */ +} + +/* + * Corrects overflow displayed oddly in IE9 + */ + +svg:not(:root) { + overflow: hidden; +} + + +/* ============================================================================= + Figures + ========================================================================== */ + +/* + * Addresses margin not present in IE6/7/8/9, S5, O11 + */ + +figure { + margin: 0; +} + + +/* ============================================================================= + Forms + ========================================================================== */ + +/* + * Corrects margin displayed oddly in IE6/7 + */ + +form { + margin: 0; +} + +/* + * Define consistent border, margin, and padding + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/* + * 1. Corrects color not being inherited in IE6/7/8/9 + * 2. Corrects text not wrapping in FF3 + * 3. Corrects alignment displayed oddly in IE6/7 + */ + +legend { + border: 0; /* 1 */ + padding: 0; + white-space: normal; /* 2 */ + *margin-left: -7px; /* 3 */ +} + +/* + * 1. Corrects font size not being inherited in all browsers + * 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome + * 3. Improves appearance and consistency in all browsers + */ + +button, +input, +select, +textarea { + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ + vertical-align: baseline; /* 3 */ + *vertical-align: middle; /* 3 */ +} + +/* + * Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet + */ + +button, +input { + line-height: normal; /* 1 */ +} + +/* + * 1. Improves usability and consistency of cursor style between image-type 'input' and others + * 2. Corrects inability to style clickable 'input' types in iOS + * 3. Removes inner spacing in IE7 without affecting normal text inputs + * Known issue: inner spacing remains in IE6 + */ + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; /* 1 */ + -webkit-appearance: button; /* 2 */ + *overflow: visible; /* 3 */ +} + +/* + * Re-set default cursor for disabled elements + */ + +button[disabled], +input[disabled] { + cursor: default; +} + +/* + * 1. Addresses box sizing set to content-box in IE8/9 + * 2. Removes excess padding in IE8/9 + * 3. Removes excess padding in IE7 + Known issue: excess padding remains in IE6 + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + *height: 13px; /* 3 */ + *width: 13px; /* 3 */ +} + +/* + * 1. Addresses appearance set to searchfield in S5, Chrome + * 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof) + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/* + * Removes inner padding and search cancel button in S5, Chrome on OS X + */ + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +/* + * Removes inner padding and border in FF3+ + * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/ + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* + * 1. Removes default vertical scrollbar in IE6/7/8/9 + * 2. Improves readability and alignment in all browsers + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + + +/* ============================================================================= + Tables + ========================================================================== */ + +/* + * Remove most spacing between table cells + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/rouge-base16-dark.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/rouge-base16-dark.scss new file mode 100644 index 000000000000..c303bd5847d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/_sass/rouge-base16-dark.scss @@ -0,0 +1,81 @@ +/* + generated by rouge http://rouge.jneen.net/ + original base16 by Chris Kempson (https://github.com/chriskempson/base16) +*/ + +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight, .highlight .w { + color: #d0d0d0; +} +.highlight .err { + color: #151515; + background-color: #ac4142; +} +.highlight .c, .highlight .cd, .highlight .cm, .highlight .c1, .highlight .cs { + color: #888; +} +.highlight .cp { + color: #f4bf75; +} +.highlight .nt { + color: #f4bf75; +} +.highlight .o, .highlight .ow { + color: #d0d0d0; +} +.highlight .p, .highlight .pi { + color: #d0d0d0; +} +.highlight .gi { + color: #90a959; +} +.highlight .gd { + color: #ac4142; +} +.highlight .gh { + color: #6a9fb5; + font-weight: bold; +} +.highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv { + color: #aa759f; +} +.highlight .kc { + color: #d28445; +} +.highlight .kt { + color: #d28445; +} +.highlight .kd { + color: #d28445; +} +.highlight .s, .highlight .sb, .highlight .sc, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 { + color: #90a959; +} +.highlight .sr { + color: #75b5aa; +} +.highlight .si { + color: #8f5536; +} +.highlight .se { + color: #8f5536; +} +.highlight .nn { + color: #f4bf75; +} +.highlight .nc { + color: #f4bf75; +} +.highlight .no { + color: #f4bf75; +} +.highlight .na { + color: #6a9fb5; +} +.highlight .m, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mb, .highlight .mx { + color: #90a959; +} +.highlight .ss { + color: #90a959; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..5cb49aa279cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import 'jekyll-theme-leap-day'; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.eot new file mode 100644 index 000000000000..af1f5e6e27f6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.svg new file mode 100644 index 000000000000..1e920b5119a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.svg @@ -0,0 +1,247 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2010 Daniel Rhatigansparkyultrasparkyorg with Reserved Font Name Copse +Designer : Daniel Rhatigan +Foundry : Daniel Rhatigan +</metadata> +<defs> +<font id="CopseRegular" horiz-adv-x="1200" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="440" /> +<glyph unicode=" " horiz-adv-x="440" /> +<glyph unicode="&#x09;" horiz-adv-x="440" /> +<glyph unicode="&#xa0;" horiz-adv-x="440" /> +<glyph unicode="!" horiz-adv-x="596" d="M163 120q0 29 10 54q9 26 27 44q38 40 96 41q58 -1 100 -41q42 -39 42 -84t-11 -70.5t-31 -43.5q-42 -39 -100 -40q-90 0 -123 84q-10 26 -10 56zM165 1494q0 31 134 31q133 0 133 -33l-50 -1060q0 -27 -55 -38q-15 -3 -28 -3q-86 0 -86 44z" /> +<glyph unicode="&#x22;" horiz-adv-x="760" d="M67 1534q0 49 124 49q62 0 85.5 -16.5t23.5 -28.5l-35 -398q-3 -30 -69 -30q-42 0 -59 11t-18 19zM459 1538q1 32 77 42q18 2 33 3h10q11 0 25 -1q20 -2 40 -6q48 -11 48 -42l-52 -394q-4 -30 -77 -30q-66 0 -69 30z" /> +<glyph unicode="#" horiz-adv-x="1190" d="M60 519q0 11 2 25q3 12 8 24q12 28 31 28h184l46 310h-146q-29 0 -39 52q-2 13 -2 24q0 46 15 62t26 16h168l66 445q3 18 31 19t39 1q10 0 22.5 -0.5t23.5 -2.5q26 -4 26 -17l-64 -445h287l66 445q3 18 31 19t39 1q10 0 22.5 -0.5t23.5 -2.5q26 -4 26 -17l-64 -445h162 q26 0 36 -51q2 -13 3 -24v-4q0 -9 -2 -21q-3 -14 -7 -26q-10 -28 -30 -28h-184l-45 -310h148q27 0 37 -50q2 -13 2 -24q0 -12 -2 -26q-4 -14 -8 -26q-10 -28 -29 -28h-170l-63 -442q-2 -17 -33.5 -18.5t-41.5 -1.5h-22q-11 0 -23 2q-26 3 -27 18l65 442h-286l-63 -442 q-2 -17 -33.5 -18.5t-41.5 -1.5h-22q-12 0 -24 2q-26 3 -26 18l65 442h-162q-29 0 -39 52q-2 13 -2 25zM430 596h286l46 310h-287z" /> +<glyph unicode="$" horiz-adv-x="1130" d="M65 300q0 66 45 111t109 45q65 0 109 -45q44 -46 44 -111q0 -8 -2 -18l-6 -21q-3 -11 -6.5 -21t-5.5 -17q58 -43 138 -48v506q-185 80 -253.5 141.5t-102.5 126.5t-34 152q0 86 30.5 150.5t83.5 110.5q103 90 276 113v133q0 28 71 28t71 -28v-127q153 -9 272 -79 q140 -81 140 -205q0 -64 -44 -110q-43 -44 -109 -44q-65 0 -109 44q-45 45 -45 96q0 50 29 108q-55 32 -134 36v-477q204 -94 276.5 -151t110.5 -119t38 -148q0 -87 -32 -158q-33 -70 -89 -122q-112 -103 -304 -126v-168q0 -28 -71 -28t-71 28v163q-163 11 -284 80 q-141 80 -141 199zM311 1135q0 -120 179 -216v399q-179 -32 -179 -183zM632 184q153 29 198 137q16 37 16 79t-16 72q-17 30 -46 56q-47 42 -152 91v-435z" /> +<glyph unicode="%" horiz-adv-x="1281" d="M67 0l992 1505q20 32 96 32q62 0 62 -32l-984 -1505q-22 -30 -103 -30q-63 0 -63 30zM81 1182q0 140 85 231q86 92 220 92q129 0 202 -91q66 -82 66 -208q0 -140 -85 -231q-86 -92 -221 -92q-68 0 -118 25q-48 25 -82 66q-66 81 -67 208zM238 1205q0 -147 69 -196 q24 -17 58 -17q130 0 130 189q0 148 -71 196q-25 17 -59 17q-127 0 -127 -189zM627 279q0 140 85 231q86 92 220 92q129 0 202 -91q66 -82 66 -208q0 -140 -85 -231q-86 -92 -221 -92q-68 0 -118 25q-48 25 -82 66q-66 81 -67 208zM785 305q0 -147 69 -196q24 -17 58 -17 q130 0 130 189q0 148 -71 196q-25 17 -59 17q-127 0 -127 -189z" /> +<glyph unicode="&#x26;" horiz-adv-x="1354" d="M74 376q0 125 60 228q52 89 196 233l-44 72q-89 151 -89 291q1 136 101 227q108 98 292 98q195 -1 293 -111q75 -85 75 -209q0 -120 -63 -229q-59 -102 -215 -262l255 -338q117 169 117 274q0 16 -13 16h-124q-29 0 -39 54q-2 14 -2 28q0 59 26 59h398q25 0 25 -70 q0 -71 -35 -71h-61q-22 -185 -202 -403l21 -33q31 -49 76.5 -69t115.5 -20q24 0 24 -65q0 -47 -14.5 -61.5t-24.5 -14.5h-170q-76 0 -168 103q-171 -123 -379 -123q-190 0 -310 109q-122 111 -122 287zM307 423q1 -137 63 -215q59 -74 142 -74q161 0 281 91l-369 487 q-117 -117 -117 -289zM399 1228q0 -55 15.5 -102t41.5 -95q42 -77 132 -191q165 146 165 347q-1 125 -93 169q-30 14 -73 15h-4q-41 0 -75 -12q-36 -12 -60 -33q-49 -43 -49 -98z" /> +<glyph unicode="'" horiz-adv-x="379" d="M73 1534q0 49 116 49q71 0 94 -15t23 -30l-43 -398q-3 -30 -69 -30q-74 0 -77 30z" /> +<glyph unicode="(" horiz-adv-x="636" d="M92 727q0 287 102 549q90 230 245 399q10 9 43 9q32 0 55 -21.5t23 -48.5q-208 -356 -244 -660q-12 -106 -12 -224q-1 -5 -1 -9q0 -114 13 -218q12 -107 42 -215q59 -210 202 -454q0 -45 -47 -67q-13 -6 -32 -6q-20 0 -42 12q-239 257 -319 663q-28 140 -28 291z" /> +<glyph unicode=")" horiz-adv-x="637" d="M76 -166q208 353 244 669q12 108 13 227v9q0 113 -12 216q-13 106 -43 211q-58 204 -202 448q0 27 23 48.5t47 21.5q41 0 51 -9q241 -261 319 -657q28 -138 28 -291q0 -433 -213 -777q-63 -102 -134 -177q-22 -12 -41 -12q-20 0 -33 6q-13 5 -23 15q-24 21 -24 52z" /> +<glyph unicode="*" horiz-adv-x="676" d="M66 1349q0 20 4 40t12 40q18 50 42 50l5 -1l147 -67l-17 158q0 21 52 29q13 2 25 2q11 0 26 -2q16 0 28 -4q29 -8 29 -24v-1l-20 -160l145 67q2 1 10 1t19 -14.5t19 -34.5q18 -41 18 -69q0 -29 -14 -35l-161 -33l114 -116q3 -5 3 -14q0 -10 -13 -26.5t-31 -30.5 q-44 -34 -62 -34q-19 0 -23 7l-89 145l-77 -142q-6 -7 -17 -7q-12 0 -31.5 8.5t-38.5 22.5q-46 33 -46 59q0 5 3 10l109 122l-156 30q-14 4 -14 24z" /> +<glyph unicode="+" horiz-adv-x="1042" d="M59 655q0 10 3 22q2 13 7 25q12 27 30 27h349v369q0 21 72 21t72 -21v-369h350q26 0 36 -50q2 -13 3 -24q0 -45 -14.5 -62.5t-24.5 -17.5h-350v-413q0 -21 -72 -21t-72 21v413h-348q-28 0 -38 52q-2 13 -2 25q-1 1 -1 3z" /> +<glyph unicode="," horiz-adv-x="505" d="M74 -211q106 119 106 195q-74 39 -74 129q0 59 42 99t87 40t72 -11t47 -29q44 -40 45 -99q0 -176 -265 -383q-29 0 -44.5 16t-15.5 43z" /> +<glyph unicode="-" horiz-adv-x="750" d="M112 600q0 12 2.5 27t7.5 29q12 33 31 33h447q26 0 36 -59q2 -14 2 -26q0 -52 -14.5 -71.5t-24.5 -19.5h-447q-28 0 -38 61q-2 14 -2 26z" /> +<glyph unicode="." horiz-adv-x="487" d="M106 115q0 95 84 129q26 10 55 10t54 -10q25 -12 43 -30q39 -40 39 -99q0 -92 -82 -125q-25 -10 -54 -10q-30 0 -55.5 10t-43.5 28q-40 38 -40 97z" /> +<glyph unicode="/" horiz-adv-x="913" d="M34 -141l673 1747q49 32 75 32q25 0 38 -1q12 -1 24 -5q28 -8 28 -26l-666 -1747q-40 -29 -97 -29q-46 0 -60.5 10t-14.5 19z" /> +<glyph unicode="0" d="M94 679q0 246 35.5 401.5t104 254.5t167.5 144.5t227 45.5t218 -56q91 -55 149 -155q111 -190 111 -536q0 -367 -142 -581q-144 -217 -390 -217q-240 0 -370 246q-110 206 -110 453zM327 753q0 -427 153 -562q52 -46 122 -46q69 0 120 46q50 46 84 127q66 161 67 435 q0 439 -140 561q-52 46 -131 46q-218 0 -262 -364q-13 -105 -13 -226v-17z" /> +<glyph unicode="1" d="M242 1204q0 26 16 36l458 285q91 0 91 -20v-1364h245q25 0 25 -70q0 -71 -36 -71h-723q-23 0 -23 55v3q0 47 27 75q8 8 16 8h149q91 0 105 25q4 8 4 18v967q0 61 -21 61q-7 0 -27 -8l-46 -18q-26 -10 -55 -23t-56 -23q-66 -26 -80 -26t-26 9q-11 9 -21 23q-22 31 -22 58z " /> +<glyph unicode="2" d="M143 1174q0 76 40.5 143t104.5 113q131 94 307 95q199 0 321 -89q123 -90 123 -241v-2q0 -231 -186 -410q-53 -52 -113 -101l-120 -98q-223 -182 -282 -373h553l40 137q27 22 55 22q55 0 79 -51l-46 -319h-846v75q0 279 200 499q57 62 117 118l116 110q125 118 173 226 q27 61 27 150t-65 141t-180 52q-125 0 -185 -71q32 -16 53 -54t21 -77t-12 -67t-32 -49q-42 -44 -109 -44q-65 0 -109 44q-45 45 -45 121z" /> +<glyph unicode="3" d="M145 340v2q0 65 45 110q44 44 109 44q60 0 105 -42q46 -43 46 -113t-72 -136q60 -71 185 -71q117 0 189 76q74 77 74 206q0 116 -71 204q-77 96 -210 111v93q173 49 237 189q26 55 26 117t-17 103t-49 72q-67 66 -179 66q-125 0 -185 -71q32 -16 53 -54t21 -77t-12 -67 t-32 -49q-43 -44 -109 -44q-65 0 -109 44q-45 45 -45 121t40.5 143t104.5 113q131 94 307 95q194 0 310 -105q112 -102 112 -259v-2q0 -187 -157 -303q-44 -33 -91 -54q125 -63 180 -123q108 -120 108 -273v-2q0 -166 -131 -291q-139 -133 -346 -133q-164 0 -294 94 q-143 104 -143 266z" /> +<glyph unicode="4" d="M96 485l459 1040q175 0 175 -132l-416 -823h382v348q0 102 211 102v-450h183q25 0 25 -62q0 -52 -17 -72t-28 -20h-163v-275h147q25 0 25 -70q0 -71 -36 -71h-625q-23 0 -23 55v3q0 47 27 75q8 8 16 8h149q91 0 105 25q4 8 4 18v232h-553q-41 24 -47 69z" /> +<glyph unicode="5" d="M145 340q0 66 45 111t109 45q65 0 109 -45q44 -46 44 -112t-74 -134q60 -71 197 -71q111 0 185 76q80 82 80 218q0 153 -97 244q-94 88 -254 88h-244v745h758q0 -110 -12 -143q-25 -68 -98 -68h-494v-380h154q248 0 391 -146q129 -132 129 -329q0 -209 -139 -335 q-137 -123 -355 -124q-162 0 -291 94q-143 104 -143 266z" /> +<glyph unicode="6" d="M109 710q0 404 182 624q157 191 367 191h2q299 -1 384 -205q28 -68 28 -128t-12 -88.5t-33 -49.5q-45 -45 -109 -45t-108 45q-44 46 -45 111q0 97 74 135q-60 71 -177 71h-2q-126 0 -217 -145q-101 -160 -101 -417q69 72 204 100q49 10 130 10q80 0 165 -32 q85 -31 146 -93q128 -129 128 -351q0 -206 -156 -339q-146 -124 -331 -124q-519 0 -519 730zM342 577q0 -168 70 -299q78 -144 202 -144q116 0 191 88q77 91 77 237q0 123 -70 211q-76 94 -188 95q-58 0 -104 -17.5t-82 -45.5q-68 -53 -96 -125z" /> +<glyph unicode="7" d="M91 1215l38 290h972q35 0 35 -65l-148 -258q-138 -247 -199.5 -403.5t-93.5 -270.5q-64 -226 -87 -508q0 -20 -116 -20q-117 0 -117 20q53 556 331 1014q88 144 193 296h-637l-37 -124q-6 -19 -44 -19q-84 0 -90 48z" /> +<glyph unicode="8" d="M93 389v3q0 234 264 444q-87 72 -122 128q-71 112 -71 236q0 132 124 227q127 98 316 98q205 0 333 -101q115 -91 115 -219q0 -189 -140 -347q-38 -44 -76 -80q139 -75 187.5 -132t69 -113t20.5 -141q0 -86 -40.5 -164t-108.5 -133q-141 -115 -339 -115q-259 0 -399 116 q-133 109 -133 293zM326 413q0 -123 76 -200q78 -79 208 -79q121 0 201 86q69 74 69 145t-28.5 121t-80.5 96q-78 68 -284 179q-161 -172 -161 -348zM366 1201q0 -62 27 -107t73 -86q71 -64 236 -158q145 187 145 307v3q0 94 -73 154q-68 57 -170 57q-111 -1 -177 -57 q-61 -52 -61 -113z" /> +<glyph unicode="9" d="M92 1062q0 206 156 339q146 124 331 124q519 0 519 -730q0 -621 -318 -769q-100 -46 -201 -46t-176 23t-135 69q-133 101 -133 266v2q0 66 45 111t109 45q65 0 109 -45q44 -46 44 -111q0 -97 -74 -135q60 -71 198 -71q129 0 209 134q90 151 90 428q-64 -72 -204 -100 q-49 -10 -129 -10q-81 0 -166 32t-146 94q-128 129 -128 350zM325 1043q0 -122 69 -209q74 -94 189 -94q58 0 104 18q45 16 81 44q70 54 97 126q-1 197 -71 318q-73 125 -201 125q-116 -1 -191 -89q-77 -91 -77 -236v-3z" /> +<glyph unicode=":" horiz-adv-x="559" d="M142 162q0 60 39 100q38 40 82 40h1q45 -1 70 -12q26 -10 44 -28q39 -39 39 -97v-6q0 -56 -39 -95q-38 -38 -83 -38q-2 -1 -4 -1q-42 0 -67 10q-25 11 -43 29q-39 40 -39 98zM142 772q0 58 39 98q37 38 83 39h4q42 0 66 -10q26 -11 44 -29q39 -39 39 -95v-6 q0 -56 -39 -95q-38 -38 -84 -39q-76 0 -114 39.5t-38 97.5z" /> +<glyph unicode=";" horiz-adv-x="573" d="M110 -211q106 119 106 195q-74 39 -74 129q0 59 42 99t87 40t72 -11t47 -29q44 -40 45 -99q0 -176 -265 -383q-29 0 -44.5 16t-15.5 43zM147 772q0 94 82 127q25 10 55 10q29 0 54 -10q26 -11 44 -29q39 -39 39 -95v-6q0 -56 -39 -95q-38 -38 -84 -39q-74 0 -112.5 38.5 t-38.5 98.5z" /> +<glyph unicode="&#x3c;" horiz-adv-x="1075" d="M56 641q0 60 53 90l791 443q46 -15 62 -73q4 -17 5 -33l-636 -426l636 -446q0 -76 -62 -100l-799 462q-50 30 -50 83z" /> +<glyph unicode="=" horiz-adv-x="1165" d="M118 838q0 46 15 62t26 16h846q27 0 37 -51q2 -13 2 -24t-2 -25q-4 -14 -8 -26q-10 -28 -29 -28h-846q-29 0 -39 52q-2 13 -2 24zM122 466q0 11 2.5 24.5t7.5 25.5q12 27 30 27h843q27 0 37 -50q2 -13 2 -24q0 -12 -2 -26q-4 -14 -8 -26q-10 -28 -29 -28h-842 q-29 0 -39 52q-2 13 -2 25z" /> +<glyph unicode="&#x3e;" horiz-adv-x="1074" d="M108 196l636 446l-636 426q0 57 38 90q12 11 29 16l791 -443q53 -30 53 -90q0 -53 -50 -83l-799 -462q-62 24 -62 100z" /> +<glyph unicode="?" horiz-adv-x="947" d="M56 1267q0 53 22 89.5t58 64t80.5 47.5t90.5 32q90 24 176 25h2q84 0 161 -29q78 -29 130 -78q106 -99 107 -251q0 -149 -117 -271q-52 -54 -116 -103l-129 -101v-247q0 -45 -63 -59q-18 -4 -38 -4q-94 0 -94 63v270q36 33 76 63l77 60q90 73 124 122q63 93 63 187 q0 101 -63 163q-62 60 -166 61q-81 0 -124 -11q23 -41 23 -79t-11 -63.5t-30 -43.5q-41 -40 -85 -40t-70 10q-25 12 -44 30q-40 39 -40 93zM281 119q0 30 10.5 55.5t29.5 43.5q42 40 86 41h3q41 0 66 -11q25 -12 44 -30q41 -40 41 -84q0 -45 -11 -70.5t-30 -43.5 q-41 -40 -85 -40t-69.5 10.5t-44.5 29t-29.5 44t-10.5 55.5z" /> +<glyph unicode="@" horiz-adv-x="1843" d="M68 459q0 398 249 650q156 158 381 217q111 29 266 29t308.5 -63t261.5 -174q226 -231 226 -589q0 -225 -129 -381q-131 -159 -329 -159h-3q-103 0 -143 52q-14 18 -24 44q-83 -67 -211 -95q-46 -10 -95 -10q-366 0 -366 532q0 228 138 373q132 139 331 139 q100 0 233 -37l40 51q6 2 12 2h15q59 0 104 -36q13 -10 19 -23l-55 -215v-577q0 -35 9 -44q14 -15 53 -15t80.5 25t76.5 75q82 118 82 279q0 160 -45 282.5t-131 213.5q-184 196 -492 196q-310 -1 -499 -195q-198 -203 -198 -558q1 -286 183 -465q186 -183 471 -183t461 116 q46 -20 76 -84q8 -18 11 -34q-217 -148 -523 -148q-390 0 -614 210q-230 216 -230 599zM665 512q0 -105 16 -176.5t43 -116.5q51 -85 143 -85q115 0 235 100v571q-83 65 -188 65q-158 0 -224 -184q-25 -70 -25 -174z" /> +<glyph unicode="A" horiz-adv-x="1424" d="M-12 57q0 52 24 76q8 8 36 8q74 0 97 57l509 1307q8 20 39 20q67 0 75 -20l533 -1364h117q26 0 26 -60q0 -50 -14.5 -65.5t-24.5 -15.5h-485q-25 0 -25 55q0 52 15 69t26 17q124 0 124 24q0 9 -8 25l-119 309h-507l-139 -358h172q26 0 26 -58q0 -52 -13.5 -67.5 t-22.5 -15.5h-436q-25 0 -25 57zM485 653h389l-193 504z" /> +<glyph unicode="B" horiz-adv-x="1329" d="M74 1446q0 59 26 59h514q543 0 543 -368q0 -114 -82 -205q-79 -87 -194 -118q169 -24 269 -124q99 -100 99 -252q0 -318 -316 -415q-108 -33 -255 -33l-251 10h-302q-25 0 -25 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163 q-29 0 -39 54q-2 14 -2 28zM502 298q0 -79 39.5 -116.5t133.5 -37.5q93 0 157 14t105 48q79 65 79 231q0 143 -132 225q-113 71 -274 71h-108v-435zM502 887h153q186 0 246 118q23 45 23 118t-28 119t-82 70q-87 39 -312 39v-464z" /> +<glyph unicode="C" horiz-adv-x="1274" d="M102 734q0 386 194 596q180 195 478 195h3q157 0 288 -76q145 -84 145 -208q0 -64 -44 -110q-43 -44 -109 -44q-65 0 -109 44q-45 45 -45 106q0 60 22 98q-59 36 -155 36t-176 -39q-78 -39 -136 -111q-122 -153 -123 -398q0 -507 249 -637q79 -42 161 -42q1 0 2 1 q82 0 130.5 13t87.5 31.5t69 38.5q58 40 73 40q14 0 28 -11t26 -27q27 -35 27 -61q0 -27 -18.5 -43.5t-57 -42t-94.5 -48.5q-135 -55 -277 -55t-255 44q-112 45 -198 138q-186 202 -186 572z" /> +<glyph unicode="D" horiz-adv-x="1517" d="M73 1442q0 63 26 63h582q395 0 569 -190q162 -177 163 -557v-3q0 -380 -229 -579q-202 -175 -503 -176h-553q-27 0 -27 57q0 46 26 76q7 8 34 8q26 0 55 3q30 2 46 7q28 9 28 33v1166q0 14 -12 14h-164q-28 0 -38 52q-2 14 -3 26zM501 154h147q214 0 364 139 q168 157 168 430q0 468 -292 589q-94 39 -215 39h-172v-1197z" /> +<glyph unicode="E" horiz-adv-x="1288" d="M73 1442q0 63 26 63h1100v-291q0 -34 -70 -34q-71 0 -71 22q0 84 -22 108q-39 41 -142 41h-393v-503h254q46 0 54 22q13 32 13 129q0 23 60 23q52 0 67 -14t15 -23v-428q0 -41 -72 -41t-72 27v151h-319v-540h530l76 149q10 19 38 19q27 0 42 -3t27 -8q27 -11 27 -30 q0 -5 -1 -7l-92 -274h-1020q-27 0 -27 59q1 51 25 75q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1166q0 14 -12 14h-164q-28 0 -38 52q-2 14 -3 26z" /> +<glyph unicode="F" horiz-adv-x="1236" d="M73 1442q0 63 26 63h1100v-291q0 -34 -70 -34q-71 0 -71 22q0 84 -22 108q-39 41 -142 41h-393v-503h254q46 0 54 22q13 32 13 129q0 23 60 23q52 0 67 -14t15 -23v-428q0 -41 -72 -41t-72 27v151h-319v-553h215q26 0 26 -61q0 -48 -15 -64t-26 -16h-573q-27 0 -27 59 q1 51 25 75q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1166q0 14 -12 14h-164q-28 0 -38 52q-2 14 -3 26z" /> +<glyph unicode="G" horiz-adv-x="1363" d="M100 777q0 157 52 305q51 150 141 248q178 195 477 195h8q183 0 313 -75q142 -81 142 -209q-1 -64 -45 -110q-43 -44 -108 -44t-109 44q-45 45 -45 107q0 61 16 98q-77 35 -173 35q-97 0 -177 -39q-78 -39 -136 -111q-122 -153 -123 -398v-4q0 -504 247 -633 q79 -42 190 -42q2 0 3 1q113 0 214 41v289q0 16 -13 16h-163q-29 1 -39 55q-2 14 -2 27q0 59 26 59h483q25 0 25 -70q0 -71 -35 -71h-71v-344q-84 -72 -154 -103q-147 -64 -323 -64q-167 0 -310 94q-221 146 -289 446q-22 100 -22 257z" /> +<glyph unicode="H" horiz-adv-x="1612" d="M73 1444q0 61 26 61h592q25 0 25 -70q0 -71 -35 -71h-180v-516h610v500q0 16 -12 16h-164q-29 0 -39 53q-2 14 -2 27q0 61 27 61h591q25 0 25 -70q0 -71 -35 -71h-180v-1223h168q27 0 27 -61q0 -49 -15.5 -64.5t-25.5 -15.5h-531q-24 0 -24 57q0 51 27 77q8 8 32 8h3 q4 -1 9 -1q23 0 47 3q28 2 44 7q28 9 28 33v510h-610v-553h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-532q-23 0 -23 57v3q0 47 27 74q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-28 0 -38 53q-2 14 -3 27z" /> +<glyph unicode="I" horiz-adv-x="791" d="M74 1446q0 59 26 59h592q25 0 25 -70q0 -71 -35 -71h-180v-1223h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-532q-23 0 -23 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28z" /> +<glyph unicode="J" horiz-adv-x="756" d="M-53 -303q0 95 83 129q25 10 54 10q75 0 117 -67q72 45 72 231v1348q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28q0 59 26 59h592q25 0 25 -70q0 -71 -35 -71h-180v-1296q0 -187 -100 -339q-70 -104 -178 -147q-56 -22 -103 -22q-48 0 -73 10q-26 10 -44 28 q-39 39 -39 96v3z" /> +<glyph unicode="K" horiz-adv-x="1487" d="M74 1446q0 59 26 59h540q25 0 25 -70q0 -71 -35 -71h-128v-1223h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-532q-23 0 -23 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28zM569 796l525 568h-132 q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h437q25 0 25 -57q0 -52 -24 -76q-8 -8 -24 -8q-17 0 -34 -3.5t-29 -9.5q-20 -10 -38 -30l-457 -518l440 -573q35 -46 78.5 -67.5t113.5 -21.5q24 0 24 -65q0 -47 -14.5 -61.5t-24.5 -14.5h-170q-69 0 -139 62q-20 18 -36 40z" /> +<glyph unicode="L" horiz-adv-x="1183" d="M73 1449q0 9 2 17q1 10 4 18q7 20 20 21h592q25 0 25 -70q0 -71 -35 -71h-180v-1210h469l77 149q10 19 38 19q27 0 42 -3t27 -8q28 -12 28 -30q0 -5 -1 -7l-93 -274h-966q-23 0 -23 59v3q0 45 27 72q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164 q0 16 -13 16h-163q-28 0 -38 54q-2 14 -2 26q-1 2 -1 5z" /> +<glyph unicode="M" horiz-adv-x="1969" d="M74 1446q0 59 26 59h298q28 0 41 -29l549 -1156l481 1165q9 20 26 20h375q25 0 25 -70q0 -71 -35 -71h-180v-1223h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-530q-25 0 -25 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v935l-449 -1119 q-12 -12 -40 -12q-54 0 -75 12l-460 1023v-882h167q26 0 26 -61q0 -48 -15 -64t-26 -16h-472q-25 0 -25 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28z" /> +<glyph unicode="N" horiz-adv-x="1667" d="M74 1446q0 59 26 59h348l793 -1160v1003q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28q0 59 26 59h534q25 0 25 -70q0 -71 -35 -71h-179v-1366q0 -18 -74 -18q-71 0 -82 18l-794 1129v-986h168q27 0 27 -61q0 -50 -15 -65t-27 -15h-473q-25 0 -25 57q0 49 28 77q8 8 31 8 h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28z" /> +<glyph unicode="O" horiz-adv-x="1501" d="M102 731q0 386 192 597q179 197 480 197q303 -1 465 -215q159 -210 159 -594q0 -366 -200 -562q-176 -174 -464 -174q-132 0 -246 44q-114 45 -200 137q-186 200 -186 570zM332 823q0 -505 249 -636q80 -42 172 -42q91 0 164 30q73 31 129 99q122 149 122 455 q0 265 -122 447q-124 184 -305 184q-175 0 -289 -145q-120 -151 -120 -392z" /> +<glyph unicode="P" horiz-adv-x="1221" d="M73 1446q0 59 27 59h556q231 -1 367 -111q137 -111 137 -304q0 -461 -659 -461v-488h223q26 0 26 -61q0 -48 -15 -64t-26 -16h-586q-24 0 -24 56v3q0 48 27 75q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1165q0 15 -13 15h-163q-28 0 -38 54q-2 14 -3 28z M501 783q210 1 304 51q122 65 122 230v3q0 166 -99 227q-92 57 -327 57v-568z" /> +<glyph unicode="Q" horiz-adv-x="1502" d="M103 727v4q0 386 192 597q179 197 480 197q303 -1 465 -215q159 -210 159 -594q0 -410 -242 -600q-74 -58 -161 -91q165 -310 392 -310q108 0 248 84q7 4 18 4q10 0 24 -9q16 -10 28 -25q28 -34 28 -65t-22 -46.5t-55 -31.5q-33 -18 -78 -32q-101 -33 -212 -33h-7 q-363 0 -620 419h-8q-276 0 -444 182q-185 200 -185 565zM333 823q0 -505 249 -636q80 -42 172 -42q91 0 164 30q73 31 129 99q122 149 122 455q-1 265 -123 447q-124 184 -304 184q-176 0 -290 -145q-119 -150 -119 -388v-4z" /> +<glyph unicode="R" horiz-adv-x="1355" d="M73 1446q0 59 27 59h556q231 -1 367 -111q137 -111 137 -304q0 -302 -291 -408l280 -452q30 -49 76 -69t116 -20q24 0 24 -65q0 -47 -14.5 -61.5t-24.5 -14.5h-170q-76 0 -141 60q-20 18 -34 42l-328 534q-63 -7 -152 -7v-488h223q26 0 26 -61q0 -48 -15 -64t-26 -16 h-586q-24 0 -24 56v3q0 48 27 75q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1165q0 15 -13 15h-163q-28 0 -38 54q-2 14 -3 28zM501 783q210 1 304 51q122 65 122 230v3q0 166 -99 227q-92 57 -327 57v-568z" /> +<glyph unicode="S" horiz-adv-x="1177" d="M83 260q0 66 45 111t109 45q65 0 109 -45q44 -46 44 -99t-28 -103q65 -35 161 -35t154 18q57 16 99 48q88 67 89 177v1q0 126 -205 244q-58 34 -126 67l-143 73q-273 144 -273 385q0 185 150 287q134 91 341 91h9q154 0 286 -69q158 -81 158 -215q0 -64 -44 -110 q-43 -44 -109 -44q-65 0 -109 44q-45 45 -45 110q0 53 29 94q-59 36 -141 36q-83 0 -137 -15q-54 -14 -94 -42q-82 -57 -83 -163v-2q0 -78 87 -141q42 -32 104 -64l135 -70q221 -110 310 -203q111 -115 111 -276q0 -184 -144 -299.5t-365 -115.5q-170 0 -315 71 q-169 83 -169 209z" /> +<glyph unicode="T" horiz-adv-x="1275" d="M18 1228v4l38 273h1161l38 -273v-4q0 -36 -55 -48q-12 -3 -25 -3h-6q-39 0 -48 26l-44 148h-335v-1210h168q27 0 27 -67q0 -43 -15.5 -58.5t-25.5 -15.5h-531q-24 0 -24 57q0 51 27 77q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q27 8 27 33v1167h-335l-44 -148 q-9 -26 -50 -26q-50 1 -76 31q-8 10 -8 20z" /> +<glyph unicode="U" horiz-adv-x="1545" d="M41 1444q0 61 26 61h572q25 0 25 -70q0 -71 -35 -71h-160v-786q0 -341 194 -411q61 -22 141 -22t142 25.5t102 78.5q78 103 78 326v773q0 16 -13 16h-144q-29 0 -39 54q-2 14 -2 28q0 59 26 59h516q26 0 26 -64q0 -48 -13.5 -62.5t-22.5 -14.5h-169v-809 q0 -575 -519 -575q-280 0 -402 152q-112 139 -112 437v779q0 16 -13 16h-163q-28 0 -38 54q-2 14 -3 26z" /> +<glyph unicode="V" horiz-adv-x="1426" d="M-19 1424q0 49 14 65t25 16h485q25 0 25 -55q0 -53 -15.5 -69.5t-25.5 -16.5q-124 0 -124 -24q0 -9 8 -25l371 -967l375 1016h-153q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h436q25 0 25 -57q0 -52 -24 -76q-9 -8 -37 -8q-76 0 -96 -57l-503 -1307q-8 -20 -61 -20 q-49 0 -59 20l-540 1364h-110q-26 0 -26 60z" /> +<glyph unicode="W" horiz-adv-x="2059" d="M-37 1424q0 49 14 65t25 16h485q25 0 25 -55q0 -53 -15.5 -69.5t-25.5 -16.5q-124 0 -124 -24q0 -9 8 -25l360 -939l229 691l-116 297h-117q-26 0 -26 60q0 49 14 65t25 16h485q25 0 25 -55q0 -53 -15.5 -69.5t-25.5 -16.5q-124 0 -124 -24q0 -9 8 -25l359 -939l297 988 h-156q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h436q25 0 25 -57q0 -52 -24 -76q-8 -8 -36 -8q-74 0 -97 -57l-410 -1307q-6 -20 -41 -20q-71 0 -79 20l-331 848l-277 -848q-6 -20 -55 -20t-59 20l-541 1364h-109q-26 0 -26 60z" /> +<glyph unicode="X" horiz-adv-x="1383" d="M17 61q0 47 26 73q7 7 28 7t45.5 4.5t41.5 12.5q28 12 47 38l349 569l-375 599h-122q-27 0 -27 58q0 50 14.5 66.5t24.5 16.5h511q23 0 23 -57q0 -53 -15.5 -68.5t-26.5 -15.5q-111 0 -111 -22q0 -7 9 -25l257 -411l318 458h-165q-26 0 -26 59q0 51 13.5 66.5t22.5 15.5 h441q24 0 24 -58q0 -51 -15 -67t-25 -16q-72 0 -110 -43l-387 -560l349 -557q34 -56 134 -62q19 -1 37 -1h17q26 0 26 -61q0 -48 -15 -64t-26 -16h-528q-27 0 -27 61q0 47 28 73q8 7 14 7h129l-299 477l-275 -447q-7 -10 -7 -17q0 -13 18 -13h105q26 0 26 -60q0 -49 -15 -65 t-26 -16h-429q-26 0 -26 61z" /> +<glyph unicode="Y" horiz-adv-x="1284" d="M-31 1424q0 49 14 65t25 16h493q25 0 25 -57q0 -52 -15 -68t-26 -16q-106 0 -106 -35q0 -10 6 -22l285 -572l316 629h-156q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h436q25 0 25 -57q0 -52 -24 -76q-9 -8 -37 -8q-66 0 -88 -43l-397 -762v-418h245q26 0 26 -61 q0 -48 -15 -64t-26 -16h-717q-25 0 -25 57v3q0 47 27 74q7 7 14 7h151q91 0 105 25q4 8 4 18v375l-437 805h-112q-26 0 -26 60z" /> +<glyph unicode="Z" horiz-adv-x="1280" d="M80 0v75l822 1276h-644l-44 -148q-9 -26 -50 -26q-50 1 -76 31q-8 10 -8 20v4l38 273h1084l-3 -68l-825 -1283h626l77 149q10 19 38 19q27 0 42 -3t27 -8q28 -12 28 -30q0 -5 -1 -7l-93 -274h-1038z" /> +<glyph unicode="[" horiz-adv-x="654" d="M185 -160v1831h429q33 0 33 -70q0 -71 -33 -71h-234v-1549h234q30 0 30 -70q0 -71 -30 -71h-429z" /> +<glyph unicode="\" horiz-adv-x="913" d="M41 1606q0 32 75 32q41 0 90 -32l673 -1747q0 -29 -75 -29q-57 0 -97 29z" /> +<glyph unicode="]" horiz-adv-x="654" d="M7 1601q0 70 33 70h429v-1831h-429q-30 0 -30 71q0 70 30 70h234v1549h-234q-33 0 -33 71z" /> +<glyph unicode="^" horiz-adv-x="1180" d="M59 920l453 489q30 35 64 35q50 0 83 -35l459 -491q0 -38 -20 -61t-56 -23l-462 405l-445 -405q-76 0 -76 86z" /> +<glyph unicode="_" horiz-adv-x="1178" d="M0 -164h1178v-123h-1178v123z" /> +<glyph unicode="`" horiz-adv-x="1065" d="M211 1423q0 109 90 147q25 11 54 11h5l273 -285q-1 -43 -21 -66q-36 -42 -77 -42z" /> +<glyph unicode="a" horiz-adv-x="1045" d="M69 261v3q0 153 113 239q99 76 247 76h247q0 167 -27.5 215.5t-66 67t-102.5 18.5h-102q12 -26 12 -59t-10 -58q-12 -25 -30 -43q-38 -38 -97 -39q-93 0 -127 82q-10 25 -10 62q0 36 21 68t55.5 55t78 37t88.5 22q79 14 173 14q93 0 161.5 -30t108.5 -81q69 -89 69 -252 v-517h168q27 0 27 -59q0 -26 -10 -51.5t-31 -30.5q-56 -16 -160 -16q-105 0 -117 3.5t-22 12.5q-19 17 -38 69q-122 -89 -294 -89q-154 0 -242 82q-83 76 -83 199zM271 291q0 -118 98 -148q29 -9 61 -9q126 0 246 100v195h-218q-80 0 -118 -27q-69 -48 -69 -111z" /> +<glyph unicode="b" horiz-adv-x="1099" d="M-70 1491q0 44 26.5 54.5t70.5 17.5t93 11q93 8 177 9q43 0 45 -85v-559q138 82 247 82q108 0 183 -35q76 -36 130 -102q115 -140 115 -374v-8q0 -241 -139 -383q-130 -133 -336 -133q-80 0 -180 60q-24 14 -41 23l-70 -85q-10 -6 -25 -6q-30 0 -79 24q-43 21 -45 42 l45 181v1184h-176q-29 0 -39 52q-2 14 -2 30zM342 207q95 -67 188 -67q191 0 256 182q26 72 26 181t-25 175q-25 64 -62 102q-66 66 -160 67q-87 0 -169 -49q-30 -18 -54 -45v-546z" /> +<glyph unicode="c" horiz-adv-x="1004" d="M82 510q0 240 145 380q136 130 347 131q226 -1 313 -99q33 -38 33 -81t-10 -68q-12 -25 -30 -43q-40 -39 -97 -39t-97 39q-40 38 -40 76t9 74h-93q-104 0 -179 -79q-96 -101 -96 -291q0 -278 155 -352q49 -24 100 -24t92 11t80 29q40 17 76 39l71 43q4 3 14 3 q9 0 23 -11.5t26 -27.5q26 -38 26 -63t-11 -34q-191 -143 -416 -143q-209 0 -327 145q-114 140 -114 385z" /> +<glyph unicode="d" horiz-adv-x="1147" d="M83 512v3q0 240 149 379q136 127 351 127q101 0 176 -20v408h-176q-29 0 -39 49q-2 14 -2 30q0 48 27 58t71 17t92 11q92 8 177 9h1q42 0 44 -85v-1358h168q26 0 26 -60q0 -45 -15 -62t-22.5 -17.5t-28 -3t-52.5 -5.5q-87 -8 -135 -8q-49 0 -63 4q-14 3 -24 12 q-19 16 -38 69q-122 -89 -287 -89q-194 0 -299 146q-101 140 -101 386zM288 512q0 -105 21 -176.5t53 -116.5q62 -85 148 -85q129 0 249 100v568q-83 65 -188 65q-187 0 -257 -181q-26 -69 -26 -174z" /> +<glyph unicode="e" horiz-adv-x="1041" d="M81 514q0 124 41 220q40 94 108 158q138 128 341 129h3q186 0 287 -117q101 -116 101 -335q0 -47 -43 -81q-42 -33 -106 -33h-527q18 -234 163 -300q46 -21 97 -21t91 11.5t77 29t72 39.5q73 46 86 46q12 -1 26 -12q12 -12 24 -28q26 -38 27 -64v-2q0 -24 -11 -32 q-183 -142 -416 -142q-209 0 -326 146q-115 142 -115 388zM286 605h471v4q0 198 -115 244q-36 14 -80 14t-92 -16q-48 -17 -88 -49q-89 -73 -96 -197z" /> +<glyph unicode="f" horiz-adv-x="792" d="M64 847q0 110 13.5 132t29.5 22h10q116 0 132 23q6 8 6 20v126q0 288 179 379q66 34 135 34t107 -7t68 -26q70 -43 70 -133q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82q-10 25 -10 55v32h-1q-81 0 -87 -169q-2 -48 -2 -96v-183h269q25 0 25 -59q0 -58 -24 -86 q-7 -9 -19 -9h-251v-706h226q27 0 27 -61q0 -48 -15 -64t-26 -16h-569q-27 0 -27 61q0 48 15 64t26 16h10q116 0 132 23q6 8 6 20v663h-191z" /> +<glyph unicode="g" horiz-adv-x="1130" d="M63 -166q0 43 14.5 82t38.5 72q24 34 55 64l64 65q-12 15 -24 29t-21 30q-21 38 -21 91q0 52 84 141q-68 45 -106.5 115.5t-38.5 157.5t38.5 150.5t99.5 104.5q119 80 282 80q59 0 117 -15h366q90 0 111 -61q6 -18 6 -39t-9 -40t-23 -31q-30 -26 -66 -26q-2 -1 -3 -1 q-34 0 -51 11q-16 11 -34 26q-48 41 -116 52q76 -86 76 -180t-37.5 -161t-98.5 -112q-123 -91 -298 -91q-39 0 -75 6q-34 -42 -34 -76t34.5 -58.5t91.5 -24.5h203q196 0 282 -85q67 -66 67 -192q0 -136 -128 -238q-151 -120 -416 -120q-217 0 -337 98q-50 41 -71.5 87 t-21.5 89zM258 -137q0 -149 241 -149q135 0 233 57q110 63 110 157q0 79 -108 107q-38 10 -93 10h-272l-34 -37q-77 -84 -77 -145zM318 690q0 -1 1 -1q0 -90 48 -138.5t110 -48.5t99.5 17t63.5 47q51 59 51 146v3q0 69 -49 119q-50 52 -110 52t-97 -14t-63 -40 q-54 -54 -54 -142z" /> +<glyph unicode="h" horiz-adv-x="1249" d="M-7 1489q0 46 27 56.5t71 17.5q45 7 93 11q92 8 176 9q42 0 44 -85q0 -25 1 -52v-535q129 74 259 102q38 8 62 8q196 0 266 -102q54 -78 54 -276v-502h156q26 0 26 -61q0 -48 -15 -64t-26 -16h-454q-27 0 -27 61q0 48 15 64t26 16q104 0 104 43v297q0 192 -22 248.5 t-56.5 80t-93.5 23.5q-134 0 -274 -112v-580h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q116 0 131 23q6 8 6 20v1225h-176q-28 1 -38 51q-2 14 -3 29z" /> +<glyph unicode="i" horiz-adv-x="662" d="M34 927q0 46 27 56.5t71 17.5t92 11q92 8 177 9h1q42 0 44 -85v-795h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q117 0 132 23q5 7 5 17v666h-176q-29 1 -39 51q-2 14 -2 29zM190 1409q0 95 83 129q25 10 54 10q58 0 97.5 -39.5 t39.5 -99.5q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82q-10 25 -10 55z" /> +<glyph unicode="j" horiz-adv-x="568" d="M-92 -303q0 95 83 129q25 10 54 10q73 0 99 -67q90 0 90 231v847h-176q-30 1 -38 49q-2 14 -3 29q0 46 26 57q105 39 341 39h1q41 0 43 -85q0 -24 1 -52v-816q0 -191 -92 -339q-105 -169 -292 -169q-93 0 -127 82q-10 25 -10 55zM172 1409q0 95 84 129q26 10 54 10 q58 0 97.5 -39.5t39.5 -99.5v-3q0 -57 -39 -96q-38 -38 -98 -38q-94 0 -128 82q-10 25 -10 55z" /> +<glyph unicode="k" horiz-adv-x="1209" d="M-7 1489q0 46 27 56.5t71 17.5q45 7 93 11q92 8 176 9q42 0 44 -85q0 -25 1 -52v-1305h105q27 0 27 -61q0 -49 -15.5 -64.5t-25.5 -15.5h-448q-26 0 -26 61q0 48 15 64t26 16h10q116 0 131 23q6 8 6 20v1225h-176q-28 1 -38 51q-2 14 -3 29zM417 600l403 401h212 q28 0 38 -52q2 -14 2 -27q0 -62 -26 -62q-97 0 -132 -14.5t-51 -30.5l-219 -222l350 -385q60 -67 160 -67q27 0 27 -63q0 -46 -15 -62t-26 -16h-261z" /> +<glyph unicode="l" horiz-adv-x="621" d="M-7 1489q0 46 27 56.5t71 17.5q45 7 93 11q92 8 176 9q42 0 44 -85q0 -25 1 -52v-1305h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q116 0 131 23q6 8 6 20v1225h-176q-28 1 -38 51q-2 14 -3 29z" /> +<glyph unicode="m" horiz-adv-x="1931" d="M34 924q0 47 26.5 57.5t67.5 18.5t86 12q90 10 135 10h4q44 -1 53 -10q10 -10 14 -26q5 -17 5 -71v-19q151 84 275 115q40 10 67 10q185 0 266 -141q155 90 301 129q44 12 107 12t125 -26.5t98 -76.5q64 -88 64 -280v-497h155q27 0 27 -70q0 -71 -37 -71h-459 q-26 0 -26 61q0 49 24 73q7 7 15 7h2q104 0 104 43v297q0 194 -22 254.5t-56.5 86t-93.5 25.5q-111 0 -274 -129v-577h155q27 0 27 -70q0 -71 -41 -71h-455q-26 0 -26 59v4q0 46 25 71q7 7 14 7h2q104 0 104 43v297q0 194 -22 254.5t-56.5 86t-93.5 25.5q-111 0 -274 -129 v-577h168q26 0 26 -59q0 -49 -15.5 -65.5t-25.5 -16.5h-508q-28 0 -28 57q0 52 15 68t26 16h10q115 0 131 23q6 8 6 20v663h-176q-29 1 -39 51q-2 14 -2 26z" /> +<glyph unicode="n" horiz-adv-x="1290" d="M34 925q0 46 26.5 56.5t67.5 18.5t86 12q90 10 135 10h4q44 -1 53 -10q10 -10 14 -26q5 -17 5 -71v-19q151 84 275 115q40 10 102 10q61 0 123 -26.5t98 -76.5q64 -88 64 -280v-497h155q27 0 27 -61q0 -48 -15 -64t-26 -16h-455q-26 0 -26 61q0 48 15 64t26 16 q104 0 104 43v297q0 194 -22 254.5t-56.5 86t-93.5 25.5q-111 0 -274 -129v-577h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q115 0 131 23q6 8 6 20v663h-176q-31 1 -39 49q-2 14 -2 29z" /> +<glyph unicode="o" horiz-adv-x="1093" d="M80 512q0 246 152 384q138 125 348 125h3q196 0 315 -149q114 -142 114 -368q0 -252 -140 -392q-132 -132 -355 -132q-107 0 -188 40t-137 112q-112 145 -112 380zM285 517q0 -102 19 -173q20 -70 54 -116q69 -94 191 -94q126 0 195 110q63 100 63 262q-1 271 -159 340 q-48 21 -97 21q-50 0 -95.5 -15t-83.5 -55t-62.5 -109.5t-24.5 -170.5z" /> +<glyph unicode="p" horiz-adv-x="1177" d="M7 926q0 47 23 54.5t57.5 14.5t78.5 13q94 13 150 13q55 0 64 -5q10 -4 14 -16q5 -12 5 -59v-17q137 78 219 92q30 6 85 6h9q62 -1 137 -36.5t130 -101.5q116 -140 116 -378q0 -248 -137 -388q-129 -132 -338 -132q-82 0 -170 45q-20 10 -30 14v-342h222q27 0 27 -61 q0 -48 -15 -64t-26 -16h-565q-27 0 -27 61q0 48 15 64t26 16q125 0 142 23q6 8 6 20v1101h-177q-30 1 -38 49q-2 14 -3 30zM420 195q69 -55 188 -55q190 0 256 182q26 72 26 181q0 108 -25 173.5t-63 103.5q-66 67 -160 67h-3q-86 0 -165 -53q-30 -20 -54 -48v-551z" /> +<glyph unicode="q" horiz-adv-x="1116" d="M83 512v3q0 240 149 379q136 127 349 127q105 0 238 -37l63 82q6 2 12 2h15q59 0 104 -36q13 -10 19 -23l-78 -246v-1061h164q26 0 26 -59q0 -50 -15 -66t-26 -16h-579q-27 0 -27 63q0 46 15 62t26 16h84q116 0 132 24q5 7 5 16v322q-67 -55 -193 -77q-40 -7 -111 -7 t-146 38t-125 108q-101 140 -101 386zM288 512q0 -105 23 -176.5t58 -116.5q66 -85 168 -85t222 100v568q-83 65 -188 65q-187 0 -257 -181q-26 -69 -26 -174z" /> +<glyph unicode="r" horiz-adv-x="901" d="M36 921q0 50 25.5 61t66.5 18q42 8 86 12q84 8 133 9h8q41 0 49 -5q10 -4 14 -14q5 -10 5 -43v-12l-1 -40q0 -12 -0.5 -24t-0.5 -22q117 107 235 147q38 12 79 13h2q39 0 70 -15q32 -16 51 -38q34 -40 34 -83q0 -44 -11 -69t-31 -43q-42 -39 -83 -39q-42 0 -64 11.5 t-39 29.5q-36 38 -36 85q-58 -27 -88 -62t-50 -65l-44 -68v-524h243q23 0 23 -61q0 -49 -14.5 -64.5t-26.5 -15.5h-582q-28 0 -28 63q1 46 27 71q8 7 35 7t55.5 2.5t44.5 7.5q28 9 28 33v659h-176q-39 0 -39 78z" /> +<glyph unicode="s" horiz-adv-x="926" d="M76 181q0 34 10 59q12 26 30 44q39 38 98 38q58 0 98 -39q40 -38 40 -86v-1q-1 -50 -5 -62h114q139 0 187 85q14 26 14 57t-14.5 53.5t-45.5 41.5q-47 29 -156.5 62.5t-166.5 58t-99 58.5q-86 72 -86 198q0 185 207 249q78 24 154 24q75 0 139 -10q66 -10 118 -34 q119 -55 119 -157v-5q0 -56 -39 -95q-38 -38 -98 -39q-94 0 -128 82q-10 25 -10 41t12 76h-99q-81 0 -120 -28q-71 -49 -71 -108q0 -78 140 -126l76 -26q193 -64 248 -109t80 -98t25 -121q0 -69 -27 -119q-26 -51 -74 -87q-103 -78 -268 -78q-146 0 -262 44q-86 32 -122 92 q-18 30 -18 65z" /> +<glyph unicode="t" horiz-adv-x="731" d="M27 847q0 110 13.5 132t29.5 22h10q123 0 148 23q10 8 11 20l43 221q12 55 130 55v-319h270q25 0 25 -59q-1 -58 -25 -86q-7 -9 -18 -9h-252v-590q0 -112 66 -112q75 0 106.5 11.5t43.5 11.5q11 0 22.5 -7.5t19.5 -19.5q17 -26 17 -54q0 -30 -19 -39q-129 -68 -246 -68 q-205 0 -205 277v590h-190z" /> +<glyph unicode="u" horiz-adv-x="1234" d="M21 923q0 50 20 55q168 43 307 43q44 0 46 -80v-530q0 -195 100 -233q30 -12 75 -12q44 0 84.5 10t72.5 24q30 15 54 32l43 32v583h-137q-41 0 -41 74q0 47 26.5 57.5t64.5 18.5q38 7 79 13q78 10 125 11h3q43 0 53 -11q12 -10 16 -28q6 -25 6 -88v-753h168q27 0 27 -65 q0 -70 -41 -76q-102 -16 -182 -16t-94 8t-24 22q-16 22 -38 82q-159 -116 -287 -116q-252 0 -324 202q-24 67 -24 156v509h-141q-37 0 -37 76z" /> +<glyph unicode="v" horiz-adv-x="1096" d="M4 920q0 49 14 65t25 16h434q25 0 25 -57q0 -52 -15 -68t-26 -16q-88 0 -88 -43l198 -549l242 592h-131q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h375q25 0 25 -57q0 -52 -24 -76q-8 -8 -24 -8q-17 0 -32 -2q-14 -2 -24 -8q-16 -9 -25 -33l-334 -817q-7 -18 -39 -19 t-48 -1q-56 0 -65 20l-335 860h-112q-26 0 -26 60z" /> +<glyph unicode="w" horiz-adv-x="1563" d="M8 921q0 48 15 64t24 16h434q25 0 25 -57q0 -52 -15 -68t-26 -16q-88 0 -88 -43l136 -601l249 690q9 19 50 19q44 0 52 -18l254 -705l159 658h-131q-26 0 -26 59q0 49 13.5 65.5t22.5 16.5h375q24 0 24 -70q0 -71 -40 -71q-63 0 -79 -24q-6 -8 -9 -19l-244 -817 q-7 -20 -68 -20q-72 0 -79 20l-235 587l-239 -587q-7 -17 -37.5 -18.5t-39.5 -1.5h-23q-14 0 -26 2q-30 4 -33 18l-241 860h-129q-25 0 -25 61z" /> +<glyph unicode="x" horiz-adv-x="1174" d="M35 61q0 47 26 73q7 7 38 7t67 17t53 38l246 324l-273 340h-122q-27 0 -27 58q0 50 14.5 66.5t24.5 16.5h437q23 0 23 -57q0 -53 -15.5 -68.5t-26.5 -15.5q-64 0 -64 -18q0 -7 7 -16l190 -238l203 272h-124q-26 0 -26 59q0 51 13.5 66.5t22.5 15.5h384q24 0 24 -58 q0 -51 -15 -67t-25 -16q-76 0 -110 -43l-265 -331l230 -289q41 -49 119 -55q16 -1 33 -1h16q26 0 26 -61q0 -48 -15 -64t-26 -16h-425q-27 0 -27 61q0 47 28 73q8 7 14 7h83l-221 274l-176 -244q-7 -10 -7 -17q0 -13 18 -13h57q26 0 26 -60q0 -49 -15 -65t-26 -16h-366 q-26 0 -26 61z" /> +<glyph unicode="y" horiz-adv-x="1098" d="M6 920q0 49 14 65t25 16h434q25 0 25 -57q0 -51 -15.5 -67.5t-25.5 -16.5q-88 0 -88 -43l203 -594l237 637h-131q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h375q25 0 25 -57q0 -52 -24 -76q-8 -8 -24 -8q-17 0 -32 -2q-14 -2 -24 -8q-16 -9 -25 -33l-422 -1077 q-32 -83 -104 -131.5t-177 -48.5q-140 0 -196 92q-20 34 -20 73q-1 2 -1 3q0 37 11 62q10 26 28 44q40 40 87 40h2q48 -1 74 -14q25 -14 41 -36q28 -41 29 -110q32 0 55.5 36t41 77t30 77.5t21 64.5t11.5 37l-332 854h-112q-26 0 -26 60z" /> +<glyph unicode="z" horiz-adv-x="1007" d="M75 736q0 3 4 23l44 242h800v-111l-569 -740h415l47 109q10 21 35 21t39 -3q12 -3 24 -9q26 -12 26 -30q0 -5 -1 -7l-72 -231h-778v110l569 741h-393l-30 -110q-11 -42 -85 -42q-75 0 -75 37z" /> +<glyph unicode="{" horiz-adv-x="667" d="M62 683q0 61 29 67q70 10 87 32q28 35 28 109v461q0 251 150 302q50 17 117 17h164q28 0 28 -69q0 -72 -28 -72h-79q-100 0 -132 -48q-25 -37 -25 -136v-445q0 -124 -97 -185q-34 -22 -83 -34q180 -52 180 -225v-309q0 -92 19 -118q35 -49 138 -49h79q28 0 28 -70 q0 -71 -28 -71h-164q-139 0 -201 66q-66 71 -66 244v321q0 76 -17 97q-27 33 -98 43q-29 4 -29 72z" /> +<glyph unicode="|" horiz-adv-x="516" d="M181 -455v2063q0 28 77 28t77 -28v-2063q0 -28 -77 -28t-77 28z" /> +<glyph unicode="}" horiz-adv-x="667" d="M2 -89q0 70 28 70h84q97 0 128 43q24 33 24 133v300q0 172 180 225q-180 45 -180 221v443q0 100 -20 130q-37 54 -137 54h-79q-28 0 -28 72q0 69 28 69h168q133 0 196 -71q66 -74 67 -248v-469q0 -68 17 -88q28 -35 98 -45q29 -6 29 -67q0 -42 -10.5 -56.5t-32.5 -17.5 t-44 -11q-24 -8 -36 -24q-21 -26 -21 -96v-328q0 -250 -150 -295q-50 -15 -117 -15h-164q-28 0 -28 71z" /> +<glyph unicode="~" horiz-adv-x="1218" d="M109 557q65 119 179 175q48 24 93 24q44 0 81 -11t78.5 -27t85.5 -35t84 -35q96 -38 131 -38t60 15.5t46 37t38 43t31 33.5q38 0 60 -21q38 -36 38 -71q-54 -121 -168 -180q-48 -25 -96 -25q-49 0 -90 10t-84 24q-44 14 -88 32l-84 32q-94 34 -129 35h-3q-34 0 -59 -14 q-27 -14 -48 -32t-36 -36.5t-26 -27.5q-37 1 -59 21q-35 34 -35 71z" /> +<glyph unicode="&#xa1;" horiz-adv-x="568" d="M144 886q0 45 11 70.5t31 43.5q42 40 100 40q90 0 123 -84q10 -26 10 -55q0 -30 -10 -55q-9 -26 -27 -45q-37 -40 -96 -40q-58 0 -100 40t-42 85zM150 -407l50 992q0 27 54 38q14 3 29 3q86 0 86 -44l47 -991q-49 -30 -140 -30q-92 0 -126 32z" /> +<glyph unicode="&#xa2;" horiz-adv-x="1002" d="M65 705q0 241 145 381q136 130 347 130q226 0 313 -98q33 -38 33 -81q0 -44 -10.5 -69t-28.5 -43q-40 -39 -98 -39t-98 39q-40 38 -40 75q0 1 1 1q0 38 9 74h-93q-104 0 -179 -79q-96 -101 -96 -291q0 -279 155 -353q48 -24 98 -24q1 0 2 1q51 0 92 11t80 28.5t75 39.5 l72 43q4 3 14 3q9 0 23 -12q13 -12 25 -28q26 -38 27 -62v-3q0 -22 -11 -31q-191 -143 -416 -143q-208 0 -326 145q-114 140 -115 385zM467 0v295h141v-295q-25 -27 -69 -27q-45 0 -72 27zM467 1171h141v232q-29 29 -70 29q-42 0 -71 -29v-232z" /> +<glyph unicode="&#xa3;" horiz-adv-x="1164" d="M61 134q0 66 45 111t109 45q52 0 86 -20l46 -26q41 104 41 362h-232q-28 0 -38 51q-2 13 -2 25q-1 1 -1 3q0 10 3 22q2 13 7 25q12 28 31 28h232v433q0 167 118 257q98 75 237 75h4q165 0 239 -46q21 -14 21 -59q-1 -69 -41 -111q-12 -13 -24 -13t-42 14q-74 35 -162 35 h-3q-66 0 -97 -45q-39 -56 -39 -190v-350h263q26 0 36 -51q2 -13 3 -24q0 -46 -14.5 -62.5t-24.5 -16.5h-263q-4 -39 -7 -84.5t-12 -97.5q-21 -122 -81 -234q149 -56 251 -56q83 0 114 19q55 34 102 129q12 23 38 23t41 -4q15 -3 27 -11q29 -17 33 -43q-65 -210 -193 -253 q-42 -14 -85 -14q-44 0 -94 6q-51 4 -107 14q-122 21 -230 52q-13 -6 -33.5 -18t-44.5 -24q-61 -30 -98 -30t-65 11.5t-49 32.5q-45 45 -45 110z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1184" d="M97 1028q1 59 47 102q44 41 100 41l116 -116q103 66 227 66q123 0 231 -73l122 125h3q54 0 98 -41q46 -43 46 -100l-125 -127q78 -121 78 -256q0 -136 -74 -254l123 -124q0 -53 -47 -99q-45 -44 -99 -44h-2l-121 122q-111 -75 -233 -75t-228 69l-113 -118q-57 0 -103 46 q-44 44 -44 95l116 117q-82 125 -82 267q0 141 80 261zM333 649q1 -118 71 -200q72 -84 187 -84q59 0 106.5 22.5t81.5 61.5q70 80 70 200q0 124 -70 204q-74 85 -189 85q-112 0 -186 -85q-70 -82 -71 -204z" /> +<glyph unicode="&#xa5;" horiz-adv-x="1275" d="M59 1424q0 49 14 65t25 16h470q25 0 25 -57q0 -52 -15 -68t-26 -16q-106 0 -106 -35q0 -4 6 -22l227 -525l239 582h-86q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h350q25 0 25 -57q0 -52 -24 -76q-9 -8 -37 -8q-71 0 -88 -43l-156 -382h146q26 0 36 -51q2 -13 3 -24v-4 q0 -9 -2 -21q-3 -14 -7 -26q-10 -28 -30 -28h-209l-89 -219h298q26 0 36 -50q2 -13 3 -24v-4q0 -10 -2 -22q-3 -14 -7 -26q-10 -28 -30 -28h-301v-271h189q26 0 26 -61q0 -48 -15 -64t-26 -16h-573q-25 0 -25 57v3q0 47 27 74q7 7 14 7h63q91 0 105 25q4 8 4 18v228h-330 q-28 0 -38 52q-2 13 -2 25q-1 1 -1 3q0 10 3 22q2 12 7 24q12 28 31 28h327l-95 219h-236q-28 0 -38 52q-2 13 -3 24q0 46 15 62t26 16h169l-184 425h-112q-26 0 -26 60z" /> +<glyph unicode="&#xa6;" horiz-adv-x="522" d="M184 -455v971h154v-971q0 -28 -77 -28t-77 28zM184 694v914q0 28 77 28t77 -28v-914h-154z" /> +<glyph unicode="&#xa7;" horiz-adv-x="1148" d="M67 -95q0 66 45 111t109 45q65 0 109 -45q44 -46 44 -111q0 -30 -11.5 -54t-16.5 -38q65 -35 161 -35t154 20q57 19 99 53q88 73 89 183v1q0 118 -205 225l-269 136q-273 144 -273 377q0 90 38 179l21 49q-60 91 -60 196q0 104 41 175q42 72 110 119q134 92 345 92 q155 -1 291 -71q157 -80 157 -212v-2q-1 -64 -45 -110q-43 -44 -108 -44t-109 44q-45 45 -45 95t30 110q-59 36 -141 36q-83 0 -138 -14.5t-94 -42.5q-83 -60 -83 -164q0 -80 88 -144q42 -32 102 -62l136 -70q221 -110 311 -199q111 -109 111 -257h-1q0 -84 -59 -238 q60 -91 60 -190q0 -100 -38 -176q-38 -78 -106 -132q-143 -115 -361 -115h-4q-170 0 -315 71q-169 83 -169 209zM313 789q0 -36 21.5 -74.5t63.5 -74.5q72 -63 234 -147l211 -109q6 24 6 67t-28 84.5t-73.5 78t-104.5 68.5l-325 171q-5 -28 -5 -64z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1065" d="M178 1327q0 95 80 129q24 10 54 10t56 -10q26 -12 44 -30q39 -39 39 -96v-6q0 -57 -39 -96q-38 -38 -84 -38q-76 0 -113 39t-37 98zM631 1327q0 95 80 129q25 10 55 10q58 0 98 -40q38 -38 39 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1686" d="M67 745v11q0 209 105 387q103 175 279 277q181 105 392 105t392 -105q177 -102 279 -277q105 -178 105 -387v-8q0 -209 -105 -387q-102 -173 -279 -276q-181 -105 -392 -105q-321 0 -549 225q-144 142 -200 341q-27 96 -27 199zM198 752q0 -137 49.5 -256t136.5 -207.5 t205 -139.5t254 -51q271 0 458 190t187 464q0 272 -187 463q-188 192 -458 192q-136 0 -254 -51.5t-205 -140.5t-136.5 -208t-49.5 -255zM365 753q0 241 145 382q136 132 347 132q226 -1 313 -99q33 -38 33 -81t-10.5 -68t-28.5 -43q-40 -39 -98 -39t-98 39q-39 37 -39 95 v17q0 6 2 15q-37 10 -82 10q-46 0 -94 -16.5t-89 -57.5q-96 -96 -96 -286q0 -279 155 -353q48 -24 98 -24q1 0 2 1q51 0 92 11t80 28.5t75 39.5l72 43q54 -15 76 -73q6 -18 6 -30q0 -18 -4 -30q-177 -143 -416 -143q-208 0 -326 145q-114 140 -115 385z" /> +<glyph unicode="&#xaa;" horiz-adv-x="915" d="M119 662q0 10 2 21q1 11 5 21q8 23 24 23h610q19 0 27 -41q2 -10 2 -20q0 -39 -11.5 -52.5t-18.5 -13.5h-609q-21 0 -29 42q-2 10 -2 20zM131 1024q0 65 19.5 106t51.5 69q67 58 157 58h182q0 97 -43 137.5t-124 40.5q-29 0 -48 -4q7 -16 7 -44t-24 -52.5t-61 -24.5 q-38 0 -62.5 24.5t-24.5 57.5t14 53t37 34.5t52 23.5q28 9 58 13q56 8 114 9h2q56 0 101 -20q45 -21 73 -55q52 -63 52 -167v-321h106q16 0 16 -28q0 -58 -26 -63q-40 -9 -156 -9q-21 0 -33 18t-24 53q-55 -44 -167 -67q-34 -7 -72 -7t-74 14q-36 15 -59 39q-44 47 -44 112z M260 1052q0 -23 7 -38.5t19 -23.5q20 -14 54 -14q2 -1 5 -1q31 0 57 7q28 6 55 16q52 18 84 39v123h-161q-50 0 -76 -23.5t-35 -42.5t-9 -42z" /> +<glyph unicode="&#xab;" horiz-adv-x="1186" d="M43 502q0 68 41 100l421 333q30 0 51 -22q37 -39 37 -73l-306 -305l306 -351q0 -34 -19 -56q-34 -38 -68 -38l-422 339q-41 33 -41 73zM542 513q0 55 40 88l421 334q32 0 53 -22q37 -39 37 -73l-307 -305l307 -351q0 -34 -20 -55q-36 -39 -69 -39l-423 339q-39 31 -39 84 z" /> +<glyph unicode="&#xac;" horiz-adv-x="1119" d="M83 655q0 10 3 22q2 13 7 25q12 27 30 27h810q72 0 72 -84v-360q0 -27 -50 -37q-13 -2 -24 -2q-47 0 -63.5 14.5t-16.5 24.5v290h-727q-28 0 -38 52q-2 13 -2 25q-1 1 -1 3z" /> +<glyph unicode="&#xad;" horiz-adv-x="750" d="M159 604q0 11 3 23q2 15 7 29q12 33 31 33h447q25 0 35 -59q2 -14 3 -26q0 -52 -14.5 -71.5t-24.5 -19.5h-447q-27 0 -37 61q-2 14 -2 26q-1 2 -1 4z" /> +<glyph unicode="&#xae;" horiz-adv-x="1088" d="M68 980q0 197 139.5 336.5t337.5 139.5q196 0 335.5 -139.5t139.5 -336.5q0 -196 -140 -336q-138 -138 -335 -139q-199 1 -337 139q-140 140 -140 336zM176 981q0 -155 108 -267q107 -110 260 -110q135 0 237 89h-43q-42 0 -67 39l-127 200q-26 -2 -53 -2v-174h84 q10 -4 10 -30q0 -27 -15 -33h-220q-9 9 -9 24t5.5 26.5t10.5 12.5q26 0 31 4t5 13v416q0 6 -5 6h-42q-15 4 -15 31q0 26 10 32h228q87 0 138.5 -41.5t51.5 -113.5q0 -115 -114 -156l109 -168q19 -28 78 -33q81 104 81 235q-1 157 -109 267q-110 111 -260 111 q-151 0 -260 -111q-108 -110 -108 -267zM491 1001q85 0 111 11q50 22 50 90q0 90 -161 90v-191z" /> +<glyph unicode="&#xaf;" horiz-adv-x="1065" d="M192 1304q0 67 16 67h637q11 0 13 -17.5t2 -66.5q0 -50 -15 -50h-637q-16 0 -16 67z" /> +<glyph unicode="&#xb0;" horiz-adv-x="855" d="M67 1140q0 154 103 259t256 105q160 0 262 -105q100 -104 100 -259q0 -157 -100 -256t-260 -99q-79 0 -144.5 26t-113.5 73q-103 101 -103 256zM227 1140q1 -138 121 -186q36 -14 80 -14q1 -1 2 -1q42 0 78 15q37 14 64 40q56 54 56 146q0 89 -56 147q-58 60 -146 60 q-84 0 -142 -60q-57 -59 -57 -147z" /> +<glyph unicode="&#xb1;" horiz-adv-x="1093" d="M81 718q0 72 17 72h376v308q0 16 72 16t72 -16v-308h377q16 0 16 -72t-16 -72h-377v-338q0 -16 -72 -16t-72 16v338h-376q-17 0 -17 72zM85 76q0 46 15 62t26 16h842q26 0 36 -50q2 -13 3 -24v-4q0 -10 -2 -22q-3 -14 -7 -26q-10 -28 -30 -28h-842q-28 0 -38 52 q-2 13 -3 24z" /> +<glyph unicode="&#xb2;" horiz-adv-x="808" d="M93 1310q0 48 22 88t62 68q82 58 219 59h4q211 0 274 -121q22 -39 22 -100v-2q-1 -63 -26.5 -111.5t-65 -85t-89 -67t-97.5 -64.5q-114 -80 -151 -181h328l28 78q17 13 46 13q28 0 44 -29l-31 -208h-569v43q1 194 199 354q126 101 162 151.5t36 94.5t-12 70 q-12 27 -32 44q-39 32 -90 32t-77 -9t-49 -32q32 -13 44 -61q4 -14 4 -26q0 -47 -29 -76t-72 -29q-44 0 -74 29.5t-30 77.5z" /> +<glyph unicode="&#xb3;" horiz-adv-x="800" d="M89 843q0 50 31.5 78.5t64.5 28.5t51 -7.5t32 -21.5q30 -30 30 -76q0 -47 -46 -81q41 -41 130 -41h2q59 0 96 49q37 48 37 125v6q0 67 -21 97q-40 58 -126 67v54q67 34 90 60q44 51 44 125q0 54 -41 92q-40 37 -85 37h-2q-89 0 -129 -40q31 -15 45 -58q4 -12 4 -21 q0 -54 -29 -84t-74 -30t-74.5 30.5t-29.5 82.5q0 51 28.5 90t73.5 65q93 54 215 55q204 0 266 -127q18 -38 19 -80v-3q0 -41 -15 -73q-16 -32 -40 -58q-47 -50 -119 -76q99 -41 131 -69q71 -62 71 -159q0 -182 -188 -230q-58 -16 -120 -16q-2 0 -4 1q-64 0 -119 14 q-54 15 -98 41q-100 60 -101 153z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1065" d="M440 1296l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1239" d="M164 -380v1381h195v-366q0 -365 95 -441q34 -28 87 -28t99.5 35t79.5 107q69 151 69 446v247h145q49 0 49 -40v-646q0 -105 17 -133.5t32.5 -34.5t34.5 -6h84q29 -9 29 -47q0 -82 -43 -94q-7 -1 -27 -3l-44 -5q-66 -6 -104 -6q-39 0 -67.5 12t-49.5 38q-46 58 -46 167 q-32 -100 -72 -140q-80 -83 -202 -83q-185 0 -244 159q14 -182 88 -504q-8 -32 -41 -53t-78 -21q-86 0 -86 59z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1579" d="M59 1044q0 232 169.5 346.5t489.5 114.5h766q25 0 25 -70q0 -71 -35 -71h-180v-1223h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-898q-25 0 -25 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v445h-152q-231 1 -367 111q-137 111 -137 304zM292 1089 q0 -88 34 -147t92 -95q110 -68 297 -68v572q-217 0 -288.5 -34.5t-103 -87t-31.5 -140.5zM926 141h19q116 0 132 23q6 8 6 20v1164q0 16 -13 16h-144v-1223z" /> +<glyph unicode="&#xb7;" horiz-adv-x="522" d="M124 564q0 30 10 55q12 25 30 43q39 38 97 38q93 0 127 -81q10 -25 10 -55t-10 -55q-12 -25 -30 -43q-40 -38 -97 -38q-93 0 -127 81q-10 25 -10 55z" /> +<glyph unicode="&#xb8;" horiz-adv-x="1188" d="M409 -382q0 54 29 54q142 0 194 50q17 15 17 36v2q0 61 -136 61l-39 48l52 146h159l-36 -105q115 -20 155 -92q13 -22 13 -50v-4q0 -204 -368 -204q-20 0 -30 20q-10 18 -10 38z" /> +<glyph unicode="&#xb9;" horiz-adv-x="720" d="M76 1338q0 1 1 1q0 16 9 22l338 164h15q37 0 37 -12v-763h141q15 0 15 -51q0 -52 -21 -52h-481q-12 0 -12 35q0 68 24 68h86q63 0 63 25v508q0 35 -9 35q-10 0 -31 -9l-93 -39q-22 -9 -30 -9q-9 0 -17.5 9.5t-16.5 22.5q-18 29 -18 45z" /> +<glyph unicode="&#xba;" horiz-adv-x="913" d="M112 1187q0 162 112 255q100 83 253 83h3q145 0 230 -99q82 -95 82 -244q0 -166 -102 -258q-96 -87 -256 -87h-4q-78 0 -136 27q-60 26 -100 73q-82 96 -82 250zM125 662q0 10 2 21q1 11 5 21q8 23 24 23h610q19 0 27 -41q2 -10 2 -20q0 -39 -11.5 -52.5t-18.5 -13.5 h-609q-21 0 -29 42q-2 10 -2 20zM261 1186q0 -124 53 -185.5t140 -61.5q92 0 142 72q46 66 46 151q0 84 -14.5 129t-40.5 75q-50 57 -135 57h-3q-123 0 -170 -119q-18 -46 -18 -118z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1184" d="M93 185l306 305l-306 351v3q0 31 19 52q35 39 69 39l422 -340q40 -32 40 -72q0 -68 -41 -100l-420 -333q-31 0 -52 22q-37 39 -37 73zM592 185l306 305l-306 351q0 33 20 55q35 39 68 39l422 -340q41 -35 41 -74q0 -66 -42 -98l-420 -333q-32 0 -53 22q-36 39 -36 73z " /> +<glyph unicode="&#xbc;" horiz-adv-x="1770" d="M68 1338q0 1 1 1q0 16 9 22l338 164h15q37 0 37 -12v-763h141q15 0 15 -51q0 -52 -21 -52h-481q-12 0 -12 35q0 68 24 68h86q63 0 63 25v508q0 35 -9 35q-10 0 -31 -9l-93 -39q-22 -9 -30 -9q-9 0 -17.5 9.5t-16.5 22.5q-18 29 -18 45zM334 0l992 1505q20 32 96 32 q62 0 62 -32l-984 -1505q-22 -30 -103 -30q-63 0 -63 30zM986 280l318 600q69 0 119 -38q44 -34 44 -66l-330 -435h245v189q0 45 124 56q32 3 61 3v-248h130q17 0 17 -48q0 -35 -12 -50t-19 -15h-116v-125h105q17 0 17 -51q0 -52 -25 -52h-455q-16 0 -16 42q0 30 12 45.5 t18 15.5h83q76 0 76 25v100h-364q-26 12 -32 52z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1767" d="M60 1338q0 1 1 1q0 16 9 22l338 164h15q37 0 37 -12v-763h141q15 0 15 -51q0 -52 -21 -52h-481q-12 0 -12 35q0 68 24 68h86q63 0 63 25v508q0 35 -9 35q-10 0 -31 -9l-93 -39q-22 -9 -30 -9q-9 0 -17.5 9.5t-16.5 22.5q-18 29 -18 45zM326 0l992 1505q20 32 96 32 q62 0 62 -32l-984 -1505q-22 -30 -103 -30q-63 0 -63 30zM1076 663q0 48 22 88q22 41 62 69q82 58 219 58q213 0 277 -122q22 -40 22 -102t-25.5 -110.5t-65 -85t-89.5 -66.5q-48 -30 -96 -64q-114 -80 -152 -182h328l28 78q17 13 46 13q28 0 44 -29l-31 -208h-569v43 q0 193 198 353q126 101 162.5 152t36.5 95t-11.5 70.5t-31.5 43.5q-39 32 -90 32q-52 0 -78 -9t-49 -32q33 -12 45 -60q3 -11 3 -22v-5q0 -47 -29 -76t-72 -29q-44 0 -74 29.5t-30 77.5z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1831" d="M83 843q0 50 31.5 78.5t64.5 28.5t51 -7.5t32 -21.5q30 -30 30 -76q0 -47 -46 -81q41 -41 130 -41h2q59 0 96 49q37 48 37 125v6q0 67 -21 97q-40 58 -126 67v54q67 34 90 60q44 51 44 125q0 54 -41 92q-40 37 -85 37h-2q-89 0 -129 -40q31 -15 45 -58q4 -12 4 -21 q0 -54 -29 -84t-74 -30t-74.5 30.5t-29.5 82.5q0 51 28.5 90t73.5 65q93 54 215 55q204 0 266 -127q18 -38 19 -80v-3q0 -41 -15 -73q-16 -32 -40 -58q-47 -50 -119 -76q99 -41 131 -69q71 -62 71 -159q0 -182 -188 -230q-58 -16 -120 -16q-2 0 -4 1q-64 0 -119 14 q-54 15 -98 41q-100 60 -101 153zM346 0l992 1505q20 32 96 32q62 0 62 -32l-984 -1505q-22 -30 -103 -30q-63 0 -63 30zM1048 280l318 600q69 0 119 -38q44 -34 44 -66l-330 -435h245v189q0 45 124 56q32 3 61 3v-248h130q17 0 17 -48q0 -35 -12 -50t-19 -15h-116v-125h105 q17 0 17 -51q0 -52 -25 -52h-455q-16 0 -16 42q0 30 12 45.5t18 15.5h83q76 0 76 25v100h-364q-26 12 -32 52z" /> +<glyph unicode="&#xbf;" horiz-adv-x="949" d="M83 -80q0 148 117 270q52 54 116 104l129 101v155q0 45 63 59q18 4 38 4q94 0 94 -63v-178q-55 -49 -115 -91q-60 -41 -110 -89q-115 -109 -115 -252q0 -102 63 -164q62 -60 166 -60h35q45 0 89 11q-23 41 -23 79t11 64t30 44q41 39 85 39t70 -11q26 -10 44 -28 q40 -40 40 -93q0 -54 -22 -90.5t-58 -64t-80 -47.5q-45 -21 -91 -33q-90 -24 -175 -24q-86 0 -164 29t-130 78q-106 99 -107 251zM405 865q0 44 11 69.5t30 43.5q41 40 85 40t69.5 -10.5t44 -29t29.5 -44t11 -55.5t-11 -55q-12 -26 -30 -45q-39 -40 -83 -40 q-45 0 -70.5 10.5t-44.5 29.5q-41 41 -41 86z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1424" d="M-12 57q0 52 24 76q8 8 36 8q74 0 97 57l509 1307q8 20 39 20q67 0 75 -20l533 -1364h117q26 0 26 -60q0 -50 -14.5 -65.5t-24.5 -15.5h-485q-25 0 -25 55q0 52 15 69t26 17q124 0 124 24q0 9 -8 25l-119 309h-507l-139 -358h172q26 0 26 -58q0 -52 -13.5 -67.5 t-22.5 -15.5h-436q-25 0 -25 57zM321 1833q0 109 90 147q25 11 54 11h5l273 -285q-1 -43 -21 -66q-36 -42 -77 -42zM485 653h389l-193 504z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1424" d="M-12 57q0 52 24 76q8 8 36 8q74 0 97 57l509 1307q8 20 39 20q67 0 75 -20l533 -1364h117q26 0 26 -60q0 -50 -14.5 -65.5t-24.5 -15.5h-485q-25 0 -25 55q0 52 15 69t26 17q124 0 124 24q0 9 -8 25l-119 309h-507l-139 -358h172q26 0 26 -58q0 -52 -13.5 -67.5 t-22.5 -15.5h-436q-25 0 -25 57zM485 653h389l-193 504zM683 1706l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1424" d="M-12 57q0 52 24 76q8 8 36 8q74 0 97 57l509 1307q8 20 39 20q67 0 75 -20l533 -1364h117q26 0 26 -60q0 -50 -14.5 -65.5t-24.5 -15.5h-485q-25 0 -25 55q0 52 15 69t26 17q124 0 124 24q0 9 -8 25l-119 309h-507l-139 -358h172q26 0 26 -58q0 -52 -13.5 -67.5 t-22.5 -15.5h-436q-25 0 -25 57zM381 1709l256 177q43 28 71 28q36 0 78 -28l256 -177q0 -63 -51 -91q-15 -8 -33 -9l-245 117l-248 -117q-34 1 -53 23q-31 38 -31 77zM485 653h389l-193 504z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1424" d="M-12 57q0 52 24 76q8 8 36 8q74 0 97 57l509 1307q8 20 39 20q67 0 75 -20l533 -1364h117q26 0 26 -60q0 -50 -14.5 -65.5t-24.5 -15.5h-485q-25 0 -25 55q0 52 15 69t26 17q124 0 124 24q0 9 -8 25l-119 309h-507l-139 -358h172q26 0 26 -58q0 -52 -13.5 -67.5 t-22.5 -15.5h-436q-25 0 -25 57zM288 1719q66 117 180 174q48 24 99 24t87.5 -22.5t71.5 -50t70.5 -50t69.5 -22.5q33 0 58 15.5t46 36.5t38 43t31 34q38 0 60 -21q38 -36 38 -71q-53 -121 -167 -180q-48 -25 -97 -25t-78.5 10t-55.5 24.5t-49.5 32t-45.5 31.5 q-54 34 -90 35h-3q-34 0 -59 -14q-27 -14 -48 -32t-36.5 -36.5t-25.5 -27.5q-40 1 -60 21q-34 34 -34 71zM485 653h389l-193 504z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1424" d="M-12 57q0 52 24 76q8 8 36 8q74 0 97 57l509 1307q8 20 39 20q67 0 75 -20l533 -1364h117q26 0 26 -60q0 -50 -14.5 -65.5t-24.5 -15.5h-485q-25 0 -25 55q0 52 15 69t26 17q124 0 124 24q0 9 -8 25l-119 309h-507l-139 -358h172q26 0 26 -58q0 -52 -13.5 -67.5 t-22.5 -15.5h-436q-25 0 -25 57zM355 1757v2q0 93 79 127q24 10 55 10q30 0 55 -10q26 -12 44 -30q40 -40 40 -99t-40 -99q-38 -38 -84 -38q-76 0 -112.5 39t-36.5 98zM485 653h389l-193 504zM808 1757q0 95 80 129q25 10 55 10q59 0 99 -40q38 -38 38 -99q0 -94 -82 -127 q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1420" d="M-14 57q0 52 24 76q8 8 36 8q74 0 97 57l509 1307q8 20 39 20q67 0 75 -20l533 -1364h117q26 0 26 -60q0 -50 -14.5 -65.5t-24.5 -15.5h-485q-25 0 -25 55q0 52 15 69t26 17q124 0 124 24q0 9 -8 25l-119 309h-507l-139 -358h172q26 0 26 -58q0 -52 -13.5 -67.5 t-22.5 -15.5h-436q-25 0 -25 57zM483 653h389l-193 504zM488 1608q0 44 16 82q16 39 44 68q62 63 157 63t157 -63q60 -61 60 -150q0 -88 -60 -148q-62 -62 -157 -63q-95 1 -157 63q-60 58 -60 148zM627 1612q0 -35 23.5 -59.5t58.5 -24.5t58.5 24.5t23.5 59.5t-23.5 59.5 t-58.5 24.5t-58.5 -24.5t-23.5 -59.5z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1875" d="M-37 57q0 51 16 68t25 18q48 4 76 14.5t40 40.5l495 1271q14 36 56 36h1113v-291q0 -34 -70 -34q-71 0 -71 22q0 84 -22 108q-39 41 -142 41h-439l22 -566h278q46 0 54 22q13 32 13 129q0 23 60 23q52 0 67 -14t15 -23v-428q0 -41 -72 -41t-72 27v151h-337l18 -477h284 q143 0 191 17t77.5 47t43.5 85q4 20 43 20h6q13 0 31 -3q62 -9 63 -38v-8q-14 -102 -45.5 -177.5t-46.5 -96.5h-1020q-27 0 -27 59q0 51 24 75q8 8 32 8h3q5 -1 11 -1q22 0 45 2q29 2 45 7q29 9 29 34l-17 447h-391l-194 -490h112q26 0 26 -58q0 -52 -13.5 -67.5 t-22.5 -15.5h-387q-25 0 -25 57zM526 785h326l-23 565v1q0 13 -17 13q-57 0 -77 -51z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1277" d="M103 730v4q0 386 194 596q180 195 478 195h3q157 0 288 -76q145 -84 145 -208q-1 -64 -45 -110q-43 -44 -108 -44t-109 44q-45 45 -45 106q0 60 22 98q-59 36 -155 36t-175.5 -39t-137.5 -111q-122 -153 -122 -398q0 -507 249 -637q79 -42 161 -42q1 0 2 1q82 0 130.5 13 t87.5 31.5t69 38.5q58 40 73 40q14 0 28 -11t26 -27q27 -35 27 -61q0 -27 -18.5 -43.5t-56.5 -41.5q-40 -26 -96 -49q-135 -55 -276 -55q-142 0 -255 44.5t-199 137.5q-185 201 -185 568zM545 -382q0 54 29 54q142 0 194 50q17 15 17 36v2q0 61 -136 61l-39 48l52 146h159 l-36 -105q115 -20 155 -92q13 -22 13 -50v-4q0 -204 -368 -204q-20 0 -30 20q-10 18 -10 38z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1288" d="M73 1442q0 63 26 63h1100v-291q0 -34 -70 -34q-71 0 -71 22q0 84 -22 108q-39 41 -142 41h-393v-503h254q46 0 54 22q13 32 13 129q0 23 60 23q52 0 67 -14t15 -23v-428q0 -41 -72 -41t-72 27v151h-319v-540h530l76 149q10 19 38 19q27 0 42 -3t27 -8q27 -11 27 -30 q0 -5 -1 -7l-92 -274h-1020q-27 0 -27 59q1 51 25 75q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1166q0 14 -12 14h-164q-28 0 -38 52q-2 14 -3 26zM411 1833q0 109 90 147q25 11 54 11h5l273 -285q-1 -43 -21 -66q-36 -42 -77 -42z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1288" d="M73 1442q0 63 26 63h1100v-291q0 -34 -70 -34q-71 0 -71 22q0 84 -22 108q-39 41 -142 41h-393v-503h254q46 0 54 22q13 32 13 129q0 23 60 23q52 0 67 -14t15 -23v-428q0 -41 -72 -41t-72 27v151h-319v-540h530l76 149q10 19 38 19q27 0 42 -3t27 -8q27 -11 27 -30 q0 -5 -1 -7l-92 -274h-1020q-27 0 -27 59q1 51 25 75q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1166q0 14 -12 14h-164q-28 0 -38 52q-2 14 -3 26zM584 1706l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xca;" horiz-adv-x="1288" d="M73 1442q0 63 26 63h1100v-291q0 -34 -70 -34q-71 0 -71 22q0 84 -22 108q-39 41 -142 41h-393v-503h254q46 0 54 22q13 32 13 129q0 23 60 23q52 0 67 -14t15 -23v-428q0 -41 -72 -41t-72 27v151h-319v-540h530l76 149q10 19 38 19q27 0 42 -3t27 -8q27 -11 27 -30 q0 -5 -1 -7l-92 -274h-1020q-27 0 -27 59q1 51 25 75q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1166q0 14 -12 14h-164q-28 0 -38 52q-2 14 -3 26zM366 1709l256 177q42 28 70 28q36 0 79 -28l256 -177q0 -63 -51 -91q-15 -8 -33 -9l-245 117l-248 -117 q-34 1 -53 23q-31 38 -31 77z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1288" d="M73 1442q0 63 26 63h1100v-291q0 -34 -70 -34q-71 0 -71 22q0 84 -22 108q-39 41 -142 41h-393v-503h254q46 0 54 22q13 32 13 129q0 23 60 23q52 0 67 -14t15 -23v-428q0 -41 -72 -41t-72 27v151h-319v-540h530l76 149q10 19 38 19q27 0 42 -3t27 -8q27 -11 27 -30 q0 -5 -1 -7l-92 -274h-1020q-27 0 -27 59q1 51 25 75q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q28 9 28 33v1166q0 14 -12 14h-164q-28 0 -38 52q-2 14 -3 26zM324 1757q0 95 80 129q24 10 54 10t56 -10q26 -12 44 -30q39 -39 39 -96v-6q0 -57 -39 -96q-38 -38 -84 -38 q-76 0 -113 39t-37 98zM777 1757q0 95 80 129q25 10 55 10q58 0 98 -40q38 -38 39 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xcc;" horiz-adv-x="791" d="M57 1833q0 109 90 147q25 11 54 11h5l273 -285q-1 -43 -21 -66q-36 -42 -77 -42zM74 1446q0 59 26 59h592q25 0 25 -70q0 -71 -35 -71h-180v-1223h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-532q-23 0 -23 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7 q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28z" /> +<glyph unicode="&#xcd;" horiz-adv-x="791" d="M74 1446q0 59 26 59h592q25 0 25 -70q0 -71 -35 -71h-180v-1223h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-532q-23 0 -23 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28zM313 1706l273 285h3 q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xce;" horiz-adv-x="791" d="M61 1709l256 177q43 28 71 28q36 0 78 -28l256 -177q0 -63 -51 -91q-15 -8 -33 -9l-245 117l-248 -117q-34 1 -53 23q-31 38 -31 77zM74 1446q0 59 26 59h592q25 0 25 -70q0 -71 -35 -71h-180v-1223h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-532q-23 0 -23 57q0 49 28 77 q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28z" /> +<glyph unicode="&#xcf;" horiz-adv-x="791" d="M35 1757v2q0 93 79 127q24 10 55 10q30 0 55 -10q26 -12 44 -30q40 -40 40 -99t-40 -99q-38 -38 -84 -38q-76 0 -112.5 39t-36.5 98zM74 1446q0 59 26 59h592q25 0 25 -70q0 -71 -35 -71h-180v-1223h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-532q-23 0 -23 57q0 49 28 77 q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28zM488 1757q0 95 80 129q25 10 55 10q59 0 99 -40q38 -38 38 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1527" d="M83 1442q0 63 26 63h582q395 0 569 -190q162 -177 163 -557v-3q0 -380 -229 -579q-202 -175 -503 -176h-553q-27 0 -27 57q0 46 26 76q7 8 34 8q26 0 55 3q30 2 46 7q28 9 28 33v1166q0 14 -12 14h-164q-28 0 -38 52q-2 14 -3 26zM130 694v154h635v-154h-635zM511 154 h147q214 0 364 139q168 157 168 430q0 468 -292 589q-94 39 -215 39h-172v-1197z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1667" d="M74 1446q0 59 26 59h348l793 -1160v1003q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28q0 59 26 59h534q25 0 25 -70q0 -71 -35 -71h-179v-1366q0 -18 -74 -18q-71 0 -82 18l-794 1129v-986h168q27 0 27 -61q0 -50 -15 -65t-27 -15h-473q-25 0 -25 57q0 49 28 77q8 8 31 8 h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28zM421 1719q65 117 179 174q48 24 100 24q51 0 87.5 -22.5t71.5 -50t70.5 -50t69.5 -22.5q33 0 58 15.5t46 36.5t38 43t31 34q38 0 60 -21q38 -36 38 -71q-54 -121 -168 -180 q-48 -25 -96 -25q-49 0 -78.5 10t-55.5 24.5t-50 31.5q-24 18 -46 32q-54 34 -89 35h-3q-34 0 -59 -14q-27 -14 -48 -32t-36.5 -36.5t-25.5 -27.5q-39 1 -59 21q-34 34 -35 71z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1501" d="M102 731q0 386 192 597q179 197 480 197q303 -1 465 -215q159 -210 159 -594q0 -366 -200 -562q-176 -174 -464 -174q-132 0 -246 44q-114 45 -200 137q-186 200 -186 570zM332 823q0 -505 249 -636q80 -42 172 -42q91 0 164 30q73 31 129 99q122 149 122 455 q0 265 -122 447q-124 184 -305 184q-175 0 -289 -145q-120 -151 -120 -392zM379 1833q0 109 90 147q25 11 54 11h5l273 -285q-1 -43 -21 -66q-36 -42 -77 -42z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1501" d="M102 731q0 386 192 597q179 197 480 197q303 -1 465 -215q159 -210 159 -594q0 -366 -200 -562q-176 -174 -464 -174q-132 0 -246 44q-114 45 -200 137q-186 200 -186 570zM332 823q0 -505 249 -636q80 -42 172 -42q91 0 164 30q73 31 129 99q122 149 122 455 q0 265 -122 447q-124 184 -305 184q-175 0 -289 -145q-120 -151 -120 -392zM676 1706l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1501" d="M102 731q0 386 192 597q179 197 480 197q303 -1 465 -215q159 -210 159 -594q0 -366 -200 -562q-176 -174 -464 -174q-132 0 -246 44q-114 45 -200 137q-186 200 -186 570zM332 823q0 -505 249 -636q80 -42 172 -42q91 0 164 30q73 31 129 99q122 149 122 455 q0 265 -122 447q-124 184 -305 184q-175 0 -289 -145q-120 -151 -120 -392zM425 1709l256 177q43 28 71 28q36 0 78 -28l256 -177q0 -63 -51 -91q-15 -8 -33 -9l-245 117l-248 -117q-34 1 -53 23q-31 38 -31 77z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1501" d="M102 731q0 386 192 597q179 197 480 197q303 -1 465 -215q159 -210 159 -594q0 -366 -200 -562q-176 -174 -464 -174q-132 0 -246 44q-114 45 -200 137q-186 200 -186 570zM327 1719q65 117 179 174q48 24 100 24q51 0 87.5 -22.5t71.5 -50t70.5 -50t69.5 -22.5 q33 0 58 15.5t46 36.5t38 43t31 34q38 0 60 -21q38 -36 38 -71q-54 -121 -168 -180q-48 -25 -96 -25q-49 0 -78.5 10t-55.5 24.5t-50 31.5q-24 18 -46 32q-54 34 -89 35h-3q-34 0 -59 -14q-27 -14 -48 -32t-36.5 -36.5t-25.5 -27.5q-39 1 -59 21q-34 34 -35 71zM332 823 q0 -505 249 -636q80 -42 172 -42q91 0 164 30q73 31 129 99q122 149 122 455q0 265 -122 447q-124 184 -305 184q-175 0 -289 -145q-120 -151 -120 -392z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1501" d="M102 731q0 386 192 597q179 197 480 197q303 -1 465 -215q159 -210 159 -594q0 -366 -200 -562q-176 -174 -464 -174q-132 0 -246 44q-114 45 -200 137q-186 200 -186 570zM332 823q0 -505 249 -636q80 -42 172 -42q91 0 164 30q73 31 129 99q122 149 122 455 q0 265 -122 447q-124 184 -305 184q-175 0 -289 -145q-120 -151 -120 -392zM386 1757q0 95 80 129q24 10 54 10t56 -10q26 -12 44 -30q39 -39 39 -96v-6q0 -57 -39 -96q-38 -38 -84 -38q-76 0 -113 39t-37 98zM839 1757q0 95 80 129q25 10 55 10q58 0 98 -40q38 -38 39 -99 q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xd7;" horiz-adv-x="1143" d="M85 285l375 368l-367 351q0 83 68 104q19 6 38 6l369 -352l375 366q106 -6 106 -106l-370 -365l379 -362q0 -51 -27 -81t-80 -30l-383 365l-377 -371q-38 0 -62 23q-44 41 -44 84z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1522" d="M63 -39l1225 1545q54 26 79 26t37.5 -1t23.5 -3q26 -6 26 -22l-1206 -1545q-72 -27 -97 -27h-39q-13 2 -24 4q-25 6 -25 23zM113 727v4q0 386 192 597q179 197 480 197q303 -1 465 -215q159 -210 159 -594v-4q0 -363 -199 -558q-178 -174 -466 -174q-132 0 -246 44.5 t-200 136.5q-185 199 -185 566zM343 823q0 -505 249 -636q80 -42 172 -42q91 0 164 30q73 31 129 99q122 149 122 455q-1 265 -123 447q-124 184 -304 184q-176 0 -290 -145q-119 -150 -119 -388v-4z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1545" d="M41 1444q0 61 26 61h572q25 0 25 -70q0 -71 -35 -71h-160v-786q0 -341 194 -411q61 -22 141 -22t142 25.5t102 78.5q78 103 78 326v773q0 16 -13 16h-144q-29 0 -39 54q-2 14 -2 28q0 59 26 59h516q26 0 26 -64q0 -48 -13.5 -62.5t-22.5 -14.5h-169v-809 q0 -575 -519 -575q-280 0 -402 152q-112 139 -112 437v779q0 16 -13 16h-163q-28 0 -38 54q-2 14 -3 26zM447 1833q0 109 90 147q25 11 54 11h5l273 -285q-1 -43 -21 -66q-36 -42 -77 -42z" /> +<glyph unicode="&#xda;" horiz-adv-x="1545" d="M41 1444q0 61 26 61h572q25 0 25 -70q0 -71 -35 -71h-160v-786q0 -341 194 -411q61 -22 141 -22t142 25.5t102 78.5q78 103 78 326v773q0 16 -13 16h-144q-29 0 -39 54q-2 14 -2 28q0 59 26 59h516q26 0 26 -64q0 -48 -13.5 -62.5t-22.5 -14.5h-169v-809 q0 -575 -519 -575q-280 0 -402 152q-112 139 -112 437v779q0 16 -13 16h-163q-28 0 -38 54q-2 14 -3 26zM758 1706l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1545" d="M41 1444q0 61 26 61h572q25 0 25 -70q0 -71 -35 -71h-160v-786q0 -341 194 -411q61 -22 141 -22t142 25.5t102 78.5q78 103 78 326v773q0 16 -13 16h-144q-29 0 -39 54q-2 14 -2 28q0 59 26 59h516q26 0 26 -64q0 -48 -13.5 -62.5t-22.5 -14.5h-169v-809 q0 -575 -519 -575q-280 0 -402 152q-112 139 -112 437v779q0 16 -13 16h-163q-28 0 -38 54q-2 14 -3 26zM472 1709l256 177q42 28 70 28q36 0 79 -28l256 -177q0 -63 -51 -91q-15 -8 -33 -9l-245 117l-248 -117q-34 1 -53 23q-31 38 -31 77z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1545" d="M41 1444q0 61 26 61h572q25 0 25 -70q0 -71 -35 -71h-160v-786q0 -341 194 -411q61 -22 141 -22t142 25.5t102 78.5q78 103 78 326v773q0 16 -13 16h-144q-29 0 -39 54q-2 14 -2 28q0 59 26 59h516q26 0 26 -64q0 -48 -13.5 -62.5t-22.5 -14.5h-169v-809 q0 -575 -519 -575q-280 0 -402 152q-112 139 -112 437v779q0 16 -13 16h-163q-28 0 -38 54q-2 14 -3 26zM445 1757v2q0 93 79 127q24 10 55 10q30 0 55 -10q26 -12 44 -30q40 -40 40 -99t-40 -99q-38 -38 -84 -38q-76 0 -112.5 39t-36.5 98zM898 1757q0 95 80 129 q25 10 55 10q59 0 99 -40q38 -38 38 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1284" d="M-31 1424q0 49 14 65t25 16h493q25 0 25 -57q0 -52 -15 -68t-26 -16q-106 0 -106 -35q0 -10 6 -22l285 -572l316 629h-156q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h436q25 0 25 -57q0 -52 -24 -76q-9 -8 -37 -8q-66 0 -88 -43l-397 -762v-418h245q26 0 26 -61 q0 -48 -15 -64t-26 -16h-717q-25 0 -25 57v3q0 47 27 74q7 7 14 7h151q91 0 105 25q4 8 4 18v375l-437 805h-112q-26 0 -26 60zM622 1706l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xde;" horiz-adv-x="1219" d="M74 1446q0 59 26 59h592q25 0 25 -70q0 -71 -35 -71h-180v-182h153q361 0 467 -218q35 -70 35 -164v-5q0 -461 -655 -461v-193h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-530q-25 0 -25 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164 q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28zM502 488q206 0 302 48q120 62 120 216q0 84 -34 138t-92 84q-101 54 -296 54v-540z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1191" d="M102 44l45 181v857q0 211 111 347q125 154 356 154q274 0 372 -181q36 -66 36 -145t-20.5 -127t-51 -87.5t-66.5 -73t-66 -65.5q-72 -75 -72 -127q0 -53 17 -82t45 -51q28 -20 64 -38l74 -37q96 -48 130 -90q69 -82 69 -200q-1 -136 -93 -217q-94 -82 -247 -82 q-111 0 -219 44q-78 32 -114 92q-18 30 -18 65q0 34 10 59q12 26 30 44q39 38 98 38q58 0 98 -39q39 -37 39 -96v-3q0 -27 -4 -41q32 -9 81 -9q48 0 71 10.5t39 27.5q34 35 34 83t-17 80t-45 55t-64 40l-74 34q-94 43 -129 81q-70 75 -70 187q0 142 130 270 q77 76 103.5 132.5t26.5 113.5t-19 93q-20 35 -48 55q-48 32 -123 33h-2q-74 0 -125 -35q-53 -35 -87 -88q-65 -101 -65 -229v-991l-91 -100q-11 -6 -27 -6q-56 0 -104 40q-14 12 -18 24z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1045" d="M69 261v3q0 153 113 239q99 76 247 76h247q0 167 -27.5 215.5t-66 67t-102.5 18.5h-102q12 -26 12 -59t-10 -58q-12 -25 -30 -43q-38 -38 -97 -39q-93 0 -127 82q-10 25 -10 62q0 36 21 68t55.5 55t78 37t88.5 22q79 14 173 14q93 0 161.5 -30t108.5 -81q69 -89 69 -252 v-517h168q27 0 27 -59q0 -26 -10 -51.5t-31 -30.5q-56 -16 -160 -16q-105 0 -117 3.5t-22 12.5q-19 17 -38 69q-122 -89 -294 -89q-154 0 -242 82q-83 76 -83 199zM210 1423q0 109 90 147q25 11 54 11h5l273 -285q0 -43 -20 -66q-36 -42 -78 -42zM271 291q0 -118 98 -148 q29 -9 61 -9q126 0 246 100v195h-218q-80 0 -118 -27q-69 -48 -69 -111z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1045" d="M69 261v3q0 153 113 239q99 76 247 76h247q0 167 -27.5 215.5t-66 67t-102.5 18.5h-102q12 -26 12 -59t-10 -58q-12 -25 -30 -43q-38 -38 -97 -39q-93 0 -127 82q-10 25 -10 62q0 36 21 68t55.5 55t78 37t88.5 22q79 14 173 14q93 0 161.5 -30t108.5 -81q69 -89 69 -252 v-517h168q27 0 27 -59q0 -26 -10 -51.5t-31 -30.5q-56 -16 -160 -16q-105 0 -117 3.5t-22 12.5q-19 17 -38 69q-122 -89 -294 -89q-154 0 -242 82q-83 76 -83 199zM271 291q0 -118 98 -148q29 -9 61 -9q126 0 246 100v195h-218q-80 0 -118 -27q-69 -48 -69 -111zM423 1296 l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1045" d="M69 261v3q0 153 113 239q99 76 247 76h247q0 167 -27.5 215.5t-66 67t-102.5 18.5h-102q12 -26 12 -59t-10 -58q-12 -25 -30 -43q-38 -38 -97 -39q-93 0 -127 82q-10 25 -10 62q0 36 21 68t55.5 55t78 37t88.5 22q79 14 173 14q93 0 161.5 -30t108.5 -81q69 -89 69 -252 v-517h168q27 0 27 -59q0 -26 -10 -51.5t-31 -30.5q-56 -16 -160 -16q-105 0 -117 3.5t-22 12.5q-19 17 -38 69q-122 -89 -294 -89q-154 0 -242 82q-83 76 -83 199zM160 1300l256 177q42 28 70 28q36 0 79 -28l256 -177q0 -64 -51 -92q-15 -8 -33 -8l-245 117l-248 -117 q-34 0 -53 22q-31 38 -31 78zM271 291q0 -118 98 -148q29 -9 61 -9q126 0 246 100v195h-218q-80 0 -118 -27q-69 -48 -69 -111z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1045" d="M57 1309q65 117 179 174q48 24 100 24q51 0 87.5 -22.5t71.5 -50t70.5 -50t69.5 -22.5q33 0 58 15.5t46 36.5t38 43t31 34q38 0 60 -21q38 -36 38 -71q-54 -121 -168 -180q-48 -25 -96 -25q-49 0 -78.5 10t-55.5 24.5t-50 31.5q-24 18 -46 32q-54 34 -89 35h-3 q-34 0 -59 -14q-27 -14 -48 -32t-36.5 -36.5t-25.5 -27.5q-39 1 -59 21q-34 34 -35 71zM69 261v3q0 153 113 239q99 76 247 76h247q0 167 -27.5 215.5t-66 67t-102.5 18.5h-102q12 -26 12 -59t-10 -58q-12 -25 -30 -43q-38 -38 -97 -39q-93 0 -127 82q-10 25 -10 62 q0 36 21 68t55.5 55t78 37t88.5 22q79 14 173 14q93 0 161.5 -30t108.5 -81q69 -89 69 -252v-517h168q27 0 27 -59q0 -26 -10 -51.5t-31 -30.5q-56 -16 -160 -16q-105 0 -117 3.5t-22 12.5q-19 17 -38 69q-122 -89 -294 -89q-154 0 -242 82q-83 76 -83 199zM271 291 q0 -118 98 -148q29 -9 61 -9q126 0 246 100v195h-218q-80 0 -118 -27q-69 -48 -69 -111z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1045" d="M69 261v3q0 153 113 239q99 76 247 76h247q0 167 -27.5 215.5t-66 67t-102.5 18.5h-102q12 -26 12 -59t-10 -58q-12 -25 -30 -43q-38 -38 -97 -39q-93 0 -127 82q-10 25 -10 62q0 36 21 68t55.5 55t78 37t88.5 22q79 14 173 14q93 0 161.5 -30t108.5 -81q69 -89 69 -252 v-517h168q27 0 27 -59q0 -26 -10 -51.5t-31 -30.5q-56 -16 -160 -16q-105 0 -117 3.5t-22 12.5q-19 17 -38 69q-122 -89 -294 -89q-154 0 -242 82q-83 76 -83 199zM114 1327q0 95 80 129q24 10 54 10t56 -10q26 -12 44 -30q39 -39 39 -96v-6q0 -57 -39 -96q-38 -38 -84 -38 q-76 0 -113 39t-37 98zM271 291q0 -118 98 -148q29 -9 61 -9q126 0 246 100v195h-218q-80 0 -118 -27q-69 -48 -69 -111zM567 1327q0 95 80 129q25 10 55 10q58 0 98 -40q38 -38 39 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1045" d="M69 261v3q0 153 113 239q99 76 247 76h247q0 167 -27.5 215.5t-66 67t-102.5 18.5h-102q12 -26 12 -59t-10 -58q-12 -25 -30 -43q-38 -38 -97 -39q-93 0 -127 82q-10 25 -10 62q0 36 21 68t55.5 55t78 37t88.5 22q79 14 173 14q93 0 161.5 -30t108.5 -81q69 -89 69 -252 v-517h168q27 0 27 -59q0 -26 -10 -51.5t-31 -30.5q-56 -16 -160 -16q-105 0 -117 3.5t-22 12.5q-19 17 -38 69q-122 -89 -294 -89q-154 0 -242 82q-83 76 -83 199zM257 1331v3q0 44 15.5 82t43.5 67q62 63 158 63t158 -63q59 -60 59 -147v-6q0 -87 -59 -146 q-62 -62 -158 -62t-158 62q-59 59 -59 147zM271 291q0 -118 98 -148q29 -9 61 -9q126 0 246 100v195h-218q-80 0 -118 -27q-69 -48 -69 -111zM396 1337q0 -35 23.5 -59.5t58.5 -24.5t58.5 24.5t23.5 59.5t-23.5 59.5t-58.5 24.5t-58.5 -24.5t-23.5 -59.5z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1590" d="M71 261v3q0 155 113 246q103 83 247 83h202q9 81 9 98q0 187 -160 187h-18q-12 0 -27.5 -1t-30.5 -2t-26 -4q12 -26 12 -54q0 -29 -10 -54q-12 -25 -30 -43q-38 -38 -97 -39q-93 0 -127 82q-10 25 -10 62q0 36 19 68t50 55t71 37q38 14 80 22q73 14 139 14t109 -11 q44 -10 78 -30q68 -38 102 -100q110 100 258 131q48 10 119 10t144 -31.5t123 -91.5q101 -121 101 -340q0 -46 -43 -80t-110 -34h-521q11 -155 81.5 -232.5t180.5 -77.5q104 0 234 78l70 41q5 2 9 4t14 2q9 0 22.5 -11.5t24.5 -28.5q25 -39 25 -64q0 -26 -10 -33 q-183 -142 -399 -142q-217 0 -333 132l-66 -43q-136 -89 -294 -89q-154 0 -242 82q-83 76 -83 199zM273 303q0 -53 13 -83q12 -28 34 -48q42 -37 98 -37q3 -1 6 -1q51 0 84 9q35 8 65 22q52 24 107 70q-34 82 -46 208h-168q-83 0 -138 -43.5t-55 -96.5zM835 594h472 q-1 210 -117 258q-36 14 -79 15h-3q-42 0 -89 -17q-47 -18 -87 -52q-89 -78 -97 -204z" /> +<glyph unicode="&#xe7;" horiz-adv-x="1004" d="M82 510q0 240 145 380q136 130 347 131q226 -1 313 -99q33 -38 33 -81t-10 -68q-12 -25 -30 -43q-40 -39 -97 -39t-97 39q-40 38 -40 76t9 74h-93q-104 0 -179 -79q-96 -101 -96 -291q0 -278 155 -352q49 -24 100 -24t92 11t80 29q40 17 76 39l71 43q4 3 14 3 q9 0 23 -11.5t26 -27.5q26 -38 26 -63t-11 -34q-191 -143 -416 -143q-209 0 -327 145q-114 140 -114 385zM330 -382q0 54 29 54q141 0 193 50q18 16 18 38q0 61 -136 61l-39 48l52 146h159l-36 -105q114 -20 154 -92q14 -24 14 -54q0 -204 -368 -204q-20 0 -30 20 q-10 18 -10 38z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1042" d="M81 514q0 124 41 220q40 94 108 158q138 128 341 129h3q186 0 287 -117q101 -116 101 -335q0 -47 -43 -81q-42 -33 -106 -33h-527q18 -234 163 -300q46 -21 97 -21t91 11.5t77 29t72 39.5q73 46 86 46q12 -1 26 -12q12 -12 24 -28q26 -38 27 -64v-2q0 -24 -11 -32 q-183 -142 -416 -142q-209 0 -326 146q-115 142 -115 388zM239 1423q0 109 90 147q25 11 54 11h5l273 -285q-1 -43 -21 -66q-36 -42 -77 -42zM286 605h471v4q0 198 -115 244q-36 14 -80 14t-92 -16q-48 -17 -88 -49q-89 -73 -96 -197z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1042" d="M81 514q0 124 41 220q40 94 108 158q138 128 341 129h3q186 0 287 -117q101 -116 101 -335q0 -47 -43 -81q-42 -33 -106 -33h-527q18 -234 163 -300q46 -21 97 -21t91 11.5t77 29t72 39.5q73 46 86 46q12 -1 26 -12q12 -12 24 -28q26 -38 27 -64v-2q0 -24 -11 -32 q-183 -142 -416 -142q-209 0 -326 146q-115 142 -115 388zM286 605h471v4q0 198 -115 244q-36 14 -80 14t-92 -16q-48 -17 -88 -49q-89 -73 -96 -197zM474 1296l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xea;" horiz-adv-x="1042" d="M81 514q0 124 41 220q40 94 108 158q138 128 341 129h3q186 0 287 -117q101 -116 101 -335q0 -47 -43 -81q-42 -33 -106 -33h-527q18 -234 163 -300q46 -21 97 -21t91 11.5t77 29t72 39.5q73 46 86 46q12 -1 26 -12q12 -12 24 -28q26 -38 27 -64v-2q0 -24 -11 -32 q-183 -142 -416 -142q-209 0 -326 146q-115 142 -115 388zM214 1300l256 177q42 28 70 28q36 0 79 -28l256 -177q0 -64 -51 -92q-15 -8 -33 -8l-245 117l-248 -117q-34 0 -53 22q-31 38 -31 78zM286 605h471v4q0 198 -115 244q-36 14 -80 14t-92 -16q-48 -17 -88 -49 q-89 -73 -96 -197z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1042" d="M81 514q0 124 41 220q40 94 108 158q138 128 341 129h3q186 0 287 -117q101 -116 101 -335q0 -47 -43 -81q-42 -33 -106 -33h-527q18 -234 163 -300q46 -21 97 -21t91 11.5t77 29t72 39.5q73 46 86 46q12 -1 26 -12q12 -12 24 -28q26 -38 27 -64v-2q0 -24 -11 -32 q-183 -142 -416 -142q-209 0 -326 146q-115 142 -115 388zM206 1327q0 95 80 129q24 10 54 10t56 -10q26 -12 44 -30q39 -39 39 -96v-6q0 -57 -39 -96q-38 -38 -84 -38q-76 0 -113 39t-37 98zM286 605h471v4q0 198 -115 244q-36 14 -80 14t-92 -16q-48 -17 -88 -49 q-89 -73 -96 -197zM659 1327q0 95 80 129q25 10 55 10q58 0 98 -40q38 -38 39 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xec;" horiz-adv-x="662" d="M22 1423q0 109 90 147q25 11 54 11h5l273 -285q0 -43 -20 -66q-36 -42 -78 -42zM34 927q0 46 27 56.5t71 17.5t92 11q92 8 177 9h1q42 0 44 -85v-795h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q117 0 132 23q5 7 5 17v666h-176 q-29 1 -39 51q-2 14 -2 29z" /> +<glyph unicode="&#xed;" horiz-adv-x="662" d="M34 927q0 46 27 56.5t71 17.5t92 11q92 8 177 9h1q42 0 44 -85v-795h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q117 0 132 23q5 7 5 17v666h-176q-29 1 -39 51q-2 14 -2 29zM257 1296l273 285h3q62 0 103 -43q43 -44 43 -115 l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xee;" horiz-adv-x="662" d="M-25 1300l256 177q43 28 71 28q36 0 78 -28l256 -177q0 -64 -51 -92q-15 -8 -33 -8l-245 117l-248 -117q-34 0 -53 22q-31 38 -31 78zM34 927q0 46 27 56.5t71 17.5t92 11q92 8 177 9h1q42 0 44 -85v-795h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61 q0 48 15 64t26 16h10q117 0 132 23q5 7 5 17v666h-176q-29 1 -39 51q-2 14 -2 29z" /> +<glyph unicode="&#xef;" horiz-adv-x="662" d="M-44 1327q0 95 80 129q24 10 54 10t56 -10q26 -12 44 -30q39 -39 39 -96v-6q0 -57 -39 -96q-38 -38 -84 -38q-76 0 -113 39t-37 98zM34 927q0 46 27 56.5t71 17.5t92 11q92 8 177 9h1q42 0 44 -85v-795h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61 q0 48 15 64t26 16h10q117 0 132 23q5 7 5 17v666h-176q-29 1 -39 51q-2 14 -2 29zM409 1327q0 95 80 129q25 10 55 10q58 0 98 -40q38 -38 39 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1113" d="M78 510q0 212 146 356q138 136 313 136q109 0 185 -49q-56 140 -214 279l-201 -163l-86 105l180 143q-96 69 -197 118q-25 12 -25 47q0 34 16 58q29 43 58 43q23 0 125 -57.5t161 -98.5l196 156q2 0 13 -15l69 -85l-170 -138q280 -237 343 -591q21 -118 21 -249t-37 -229 t-103 -164q-132 -132 -358 -132q-203 0 -321 152q-114 146 -114 378zM283 507q0 -273 155 -349q48 -24 112 -24q63 0 111.5 29.5t80.5 80.5q64 102 64 262q0 342 -270 342q-96 0 -168 -82q-84 -97 -85 -256v-3z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1290" d="M34 925q0 46 26.5 56.5t67.5 18.5t86 12q90 10 135 10h4q44 -1 53 -10q10 -10 14 -26q5 -17 5 -71v-19q151 84 275 115q40 10 102 10q61 0 123 -26.5t98 -76.5q64 -88 64 -280v-497h155q27 0 27 -61q0 -48 -15 -64t-26 -16h-455q-26 0 -26 61q0 48 15 64t26 16 q104 0 104 43v297q0 194 -22 254.5t-56.5 86t-93.5 25.5q-111 0 -274 -129v-577h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q115 0 131 23q6 8 6 20v663h-176q-31 1 -39 49q-2 14 -2 29zM229 1309q65 117 179 174q48 24 100 24 q51 0 87.5 -22.5t71.5 -50t70.5 -50t69.5 -22.5q33 0 58 15.5t46 36.5t38 43t31 34q38 0 60 -21q38 -36 38 -71q-54 -121 -168 -180q-48 -25 -96 -25q-49 0 -78.5 10t-55.5 24.5t-50 31.5q-24 18 -46 32q-54 34 -89 35h-3q-34 0 -59 -14q-27 -14 -48 -32t-36.5 -36.5 t-25.5 -27.5q-39 1 -59 21q-34 34 -35 71z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1093" d="M80 512q0 246 152 384q138 125 348 125h3q196 0 315 -149q114 -142 114 -368q0 -252 -140 -392q-132 -132 -355 -132q-107 0 -188 40t-137 112q-112 145 -112 380zM244 1423q0 109 90 147q25 11 54 11h5l273 -285q0 -43 -20 -66q-36 -42 -78 -42zM285 517q0 -102 19 -173 q20 -70 54 -116q69 -94 191 -94q126 0 195 110q63 100 63 262q-1 271 -159 340q-48 21 -97 21q-50 0 -95.5 -15t-83.5 -55t-62.5 -109.5t-24.5 -170.5z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1093" d="M80 512q0 246 152 384q138 125 348 125h3q196 0 315 -149q114 -142 114 -368q0 -252 -140 -392q-132 -132 -355 -132q-107 0 -188 40t-137 112q-112 145 -112 380zM285 517q0 -102 19 -173q20 -70 54 -116q69 -94 191 -94q126 0 195 110q63 100 63 262q-1 271 -159 340 q-48 21 -97 21q-50 0 -95.5 -15t-83.5 -55t-62.5 -109.5t-24.5 -170.5zM480 1296l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1093" d="M80 512q0 246 152 384q138 125 348 125h3q196 0 315 -149q114 -142 114 -368q0 -252 -140 -392q-132 -132 -355 -132q-107 0 -188 40t-137 112q-112 145 -112 380zM247 1300l256 177q43 28 71 28q36 0 78 -28l256 -177q0 -64 -51 -92q-15 -8 -33 -8l-245 117l-248 -117 q-34 0 -53 22q-31 38 -31 78zM285 517q0 -102 19 -173q20 -70 54 -116q69 -94 191 -94q126 0 195 110q63 100 63 262q-1 271 -159 340q-48 21 -97 21q-50 0 -95.5 -15t-83.5 -55t-62.5 -109.5t-24.5 -170.5z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1093" d="M80 512q0 246 152 384q138 125 348 125h3q196 0 315 -149q114 -142 114 -368q0 -252 -140 -392q-132 -132 -355 -132q-107 0 -188 40t-137 112q-112 145 -112 380zM146 1309q74 121 180 174q48 24 99 24t87.5 -22.5t72 -50t71 -50t69.5 -22.5q33 0 57.5 15.5t45.5 36.5 t38.5 43t31.5 34q38 0 60 -21q38 -36 38 -71q-54 -121 -168 -180q-48 -25 -97 -25t-78.5 10t-55.5 24.5t-49.5 32t-45.5 31.5q-54 34 -90 35h-3q-34 0 -59 -14q-27 -14 -48 -32t-36 -36.5t-26 -27.5q-37 1 -59 21q-35 34 -35 71zM285 517q0 -102 19 -173q20 -70 54 -116 q69 -94 191 -94q126 0 195 110q63 100 63 262q-1 271 -159 340q-48 21 -97 21q-50 0 -95.5 -15t-83.5 -55t-62.5 -109.5t-24.5 -170.5z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1093" d="M80 512q0 246 152 384q138 125 348 125h3q196 0 315 -149q114 -142 114 -368q0 -252 -140 -392q-132 -132 -355 -132q-107 0 -188 40t-137 112q-112 145 -112 380zM181 1327v2q0 93 79 127q24 10 55 10q30 0 55 -10q26 -12 44 -30q40 -40 40 -99t-40 -99q-38 -38 -84 -38 q-76 0 -112.5 39t-36.5 98zM285 517q0 -102 19 -173q20 -70 54 -116q69 -94 191 -94q126 0 195 110q63 100 63 262q-1 271 -159 340q-48 21 -97 21q-50 0 -95.5 -15t-83.5 -55t-62.5 -109.5t-24.5 -170.5zM634 1327q0 95 80 129q25 10 55 10q59 0 99 -40q38 -38 38 -99 q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xf7;" horiz-adv-x="1065" d="M71 651q0 10 3 22q2 13 7 25q12 27 30 27h843q26 0 36 -50q2 -13 3 -24q0 -47 -14.5 -63.5t-24.5 -16.5h-842q-28 0 -38 52q-2 13 -2 25q-1 1 -1 3zM395 324q0 59 38 99t83 40q44 0 69 -10.5t43 -29.5q38 -40 39 -99q0 -93 -82 -126q-25 -10 -54 -10q-30 0 -55 10t-43 28 q-38 38 -38 98zM395 957q0 45 10 70t28 43q38 38 83 38q44 0 69 -10t43 -28q38 -37 39 -82v-5q0 -42 -10 -66q-10 -25 -28.5 -43t-43.5 -28t-69 -10q-45 0 -83 37.5t-38 83.5z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1095" d="M40 -39l145 192q-102 146 -102 359q1 247 153 385q138 125 347 125q120 0 215 -58l59 78q17 22 50 23.5t44 1.5q10 0 25 -1q16 0 30 -2q34 -6 34 -22l-133 -178q108 -143 108 -360q0 -247 -152 -392q-138 -132 -347 -132q-126 0 -221 64l-62 -83q-19 -27 -111 -27 q-82 0 -82 27zM288 510q0 -128 16 -199l398 527q-56 33 -127 33t-117 -16q-45 -17 -83 -57q-87 -93 -87 -288zM390 171q58 -37 143 -37t133.5 29.5t80.5 80.5q63 100 63 246t-20 217z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1234" d="M21 923q0 50 20 55q168 43 307 43q44 0 46 -80v-530q0 -195 100 -233q30 -12 75 -12q44 0 84.5 10t72.5 24q30 15 54 32l43 32v583h-137q-41 0 -41 74q0 47 26.5 57.5t64.5 18.5q38 7 79 13q78 10 125 11h3q43 0 53 -11q12 -10 16 -28q6 -25 6 -88v-753h168q27 0 27 -65 q0 -70 -41 -76q-102 -16 -182 -16t-94 8t-24 22q-16 22 -38 82q-159 -116 -287 -116q-252 0 -324 202q-24 67 -24 156v509h-141q-37 0 -37 76zM293 1423q0 109 90 147q25 11 54 11h5l273 -285q-1 -43 -21 -66q-36 -42 -77 -42z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1234" d="M21 923q0 50 20 55q168 43 307 43q44 0 46 -80v-530q0 -195 100 -233q30 -12 75 -12q44 0 84.5 10t72.5 24q30 15 54 32l43 32v583h-137q-41 0 -41 74q0 47 26.5 57.5t64.5 18.5q38 7 79 13q78 10 125 11h3q43 0 53 -11q12 -10 16 -28q6 -25 6 -88v-753h168q27 0 27 -65 q0 -70 -41 -76q-102 -16 -182 -16t-94 8t-24 22q-16 22 -38 82q-159 -116 -287 -116q-252 0 -324 202q-24 67 -24 156v509h-141q-37 0 -37 76zM528 1296l273 285h3q62 0 103 -43q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1234" d="M21 923q0 50 20 55q168 43 307 43q44 0 46 -80v-530q0 -195 100 -233q30 -12 75 -12q44 0 84.5 10t72.5 24q30 15 54 32l43 32v583h-137q-41 0 -41 74q0 47 26.5 57.5t64.5 18.5q38 7 79 13q78 10 125 11h3q43 0 53 -11q12 -10 16 -28q6 -25 6 -88v-753h168q27 0 27 -65 q0 -70 -41 -76q-102 -16 -182 -16t-94 8t-24 22q-16 22 -38 82q-159 -116 -287 -116q-252 0 -324 202q-24 67 -24 156v509h-141q-37 0 -37 76zM267 1300l256 177q43 28 71 28q36 0 78 -28l256 -177q0 -64 -51 -92q-15 -8 -33 -8l-245 117l-248 -117q-34 0 -53 22 q-31 38 -31 78z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1234" d="M21 923q0 50 20 55q168 43 307 43q44 0 46 -80v-530q0 -195 100 -233q30 -12 75 -12q44 0 84.5 10t72.5 24q30 15 54 32l43 32v583h-137q-41 0 -41 74q0 47 26.5 57.5t64.5 18.5q38 7 79 13q78 10 125 11h3q43 0 53 -11q12 -10 16 -28q6 -25 6 -88v-753h168q27 0 27 -65 q0 -70 -41 -76q-102 -16 -182 -16t-94 8t-24 22q-16 22 -38 82q-159 -116 -287 -116q-252 0 -324 202q-24 67 -24 156v509h-141q-37 0 -37 76zM227 1327v2q0 93 79 127q24 10 55 10q30 0 55 -10q26 -12 44 -30q40 -40 40 -99t-40 -99q-38 -38 -84 -38q-76 0 -112.5 39 t-36.5 98zM680 1327q0 95 80 129q25 10 55 10q59 0 99 -40q38 -38 38 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1099" d="M6 920q0 49 14 65t25 16h434q25 0 25 -57q0 -51 -15.5 -67.5t-25.5 -16.5q-88 0 -88 -43l203 -594l237 637h-131q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h375q25 0 25 -57q0 -52 -24 -76q-8 -8 -24 -8q-17 0 -32 -2q-14 -2 -24 -8q-16 -9 -25 -33l-422 -1077 q-32 -83 -104 -131.5t-177 -48.5q-140 0 -196 92q-20 34 -20 73q-1 2 -1 3q0 37 11 62q10 26 28 44q40 40 87 40h2q48 -1 74 -14q25 -14 41 -36q28 -41 29 -110q32 0 55.5 36t41 77t30 77.5t21 64.5t11.5 37l-332 854h-112q-26 0 -26 60zM557 1296l273 285h3q62 0 103 -43 q43 -44 43 -115l-323 -235q-42 0 -63 24q-36 41 -36 84z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1093" d="M-77 1489q0 45 27 56t71 19q45 7 93 11q97 8 176 8q42 0 45 -85q1 -25 1 -52v-508q146 83 250 83t179 -35.5t130 -101.5q116 -140 116 -378q0 -248 -137 -388q-129 -132 -338 -132q-82 0 -170 45q-20 10 -30 14v-342h222q27 0 27 -61q0 -48 -15 -64t-26 -16h-565 q-27 0 -27 61q0 48 15 64t26 16q125 0 142 23q6 8 6 20v1663h-177q-28 1 -38 51q-2 14 -3 29zM336 195q69 -55 188 -55q190 0 256 182q26 72 26 181q0 108 -25 173.5t-63 103.5q-66 67 -160 67q-88 0 -168 -51q-30 -19 -54 -47v-554z" /> +<glyph unicode="&#xff;" horiz-adv-x="1099" d="M6 920q0 49 14 65t25 16h434q25 0 25 -57q0 -51 -15.5 -67.5t-25.5 -16.5q-88 0 -88 -43l203 -594l237 637h-131q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h375q25 0 25 -57q0 -52 -24 -76q-8 -8 -24 -8q-17 0 -32 -2q-14 -2 -24 -8q-16 -9 -25 -33l-422 -1077 q-32 -83 -104 -131.5t-177 -48.5q-140 0 -196 92q-20 34 -20 73q-1 2 -1 3q0 37 11 62q10 26 28 44q40 40 87 40h2q48 -1 74 -14q25 -14 41 -36q28 -41 29 -110q32 0 55.5 36t41 77t30 77.5t21 64.5t11.5 37l-332 854h-112q-26 0 -26 60zM230 1327q0 95 80 129q24 10 54 10 t56 -10q26 -12 44 -30q39 -39 39 -96v-6q0 -57 -39 -96q-38 -38 -84 -38q-76 0 -113 39t-37 98zM683 1327q0 95 80 129q25 10 55 10q58 0 98 -40q38 -38 39 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55z" /> +<glyph unicode="&#x152;" horiz-adv-x="2042" d="M102 731q0 386 192 597q179 197 480 197q89 0 171 -20h1008v-291q0 -34 -70 -34q-71 0 -71 22q0 84 -22 108q-39 41 -142 41h-393v-503h254q46 0 54 22q13 32 13 129q0 23 60 23q52 0 67 -14t15 -23v-428q0 -41 -72 -41t-72 27v151h-319v-540h530l76 149q10 19 38 19 q27 0 42 -3t27 -8q27 -11 27 -30q0 -5 -1 -7l-92 -274h-992q-88 -20 -198 -20t-224 44q-114 45 -200 137q-186 200 -186 570zM332 823q0 -505 249 -636q80 -42 182 -42q192 0 281 76v1032q-105 107 -303 107q-175 0 -289 -145q-120 -151 -120 -392z" /> +<glyph unicode="&#x153;" horiz-adv-x="1769" d="M80 512q0 246 152 384q138 125 351 125t333 -174q138 174 383 174h3q186 0 287 -117q101 -116 101 -335q0 -47 -43 -81q-42 -33 -106 -33h-527q18 -234 163 -300q46 -21 97 -21t91 11.5t77 29t72 39.5q73 46 86 46q12 -1 26 -12q12 -12 24 -28q26 -38 27 -64v-2 q0 -24 -11 -32q-183 -142 -412 -142t-349 170q-132 -170 -390 -170q-205 0 -323 152q-112 145 -112 380zM285 517q0 -102 19 -173q20 -70 54 -116q69 -94 191 -94q126 0 195 110q63 100 63 262q-1 271 -159 340q-48 21 -97 21q-50 0 -95.5 -15t-83.5 -55t-62.5 -109.5 t-24.5 -170.5zM1014 605h471v4q0 198 -115 244q-36 14 -80 14t-92 -16q-48 -17 -88 -49q-89 -73 -96 -197z" /> +<glyph unicode="&#x178;" horiz-adv-x="1284" d="M280 1784q0 95 80 129q24 10 54 10t56 -10q26 -12 44 -30q39 -39 39 -96v-6q0 -57 -39 -96q-38 -38 -84 -38q-76 0 -113 39t-37 98zM733 1784q0 95 80 129q25 10 55 10q58 0 98 -40q38 -38 39 -99q0 -94 -82 -127q-25 -10 -55 -10q-92 0 -125 82q-10 25 -10 55zM-31 1424 q0 49 14 65t25 16h493q25 0 25 -57q0 -52 -15 -68t-26 -16q-106 0 -106 -35q0 -10 6 -22l285 -572l316 629h-156q-26 0 -26 58q0 52 13.5 67.5t22.5 15.5h436q25 0 25 -57q0 -52 -24 -76q-9 -8 -37 -8q-66 0 -88 -43l-397 -762v-418h245q26 0 26 -61q0 -48 -15 -64t-26 -16 h-717q-25 0 -25 57v3q0 47 27 74q7 7 14 7h151q91 0 105 25q4 8 4 18v375l-437 805h-112q-26 0 -26 60z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="1045" d="M192 1300l256 177q42 28 70 28q36 0 79 -28l256 -177q0 -64 -51 -92q-15 -8 -33 -8l-245 117l-248 -117q-34 0 -53 22q-31 38 -31 78z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="1233" d="M192 1309q66 117 180 174q48 24 99 24t87.5 -22.5t71.5 -50t70.5 -50t69.5 -22.5q33 0 58 15.5t46 36.5t38 43t31 34q38 0 60 -21q38 -36 38 -71q-53 -121 -167 -180q-48 -25 -97 -25t-78.5 10t-55.5 24.5t-49.5 32t-45.5 31.5q-54 34 -90 35h-3q-34 0 -59 -14 q-27 -14 -48 -32t-36.5 -36.5t-25.5 -27.5q-40 1 -60 21q-34 34 -34 71z" /> +<glyph unicode="&#x2000;" horiz-adv-x="995" /> +<glyph unicode="&#x2001;" horiz-adv-x="1991" /> +<glyph unicode="&#x2002;" horiz-adv-x="995" /> +<glyph unicode="&#x2003;" horiz-adv-x="1991" /> +<glyph unicode="&#x2004;" horiz-adv-x="663" /> +<glyph unicode="&#x2005;" horiz-adv-x="497" /> +<glyph unicode="&#x2006;" horiz-adv-x="331" /> +<glyph unicode="&#x2007;" horiz-adv-x="331" /> +<glyph unicode="&#x2008;" horiz-adv-x="248" /> +<glyph unicode="&#x2009;" horiz-adv-x="398" /> +<glyph unicode="&#x200a;" horiz-adv-x="110" /> +<glyph unicode="&#x2010;" horiz-adv-x="750" d="M112 600q0 12 2.5 27t7.5 29q12 33 31 33h447q26 0 36 -59q2 -14 2 -26q0 -52 -14.5 -71.5t-24.5 -19.5h-447q-28 0 -38 61q-2 14 -2 26z" /> +<glyph unicode="&#x2011;" horiz-adv-x="750" d="M112 600q0 12 2.5 27t7.5 29q12 33 31 33h447q26 0 36 -59q2 -14 2 -26q0 -52 -14.5 -71.5t-24.5 -19.5h-447q-28 0 -38 61q-2 14 -2 26z" /> +<glyph unicode="&#x2012;" horiz-adv-x="750" d="M112 600q0 12 2.5 27t7.5 29q12 33 31 33h447q26 0 36 -59q2 -14 2 -26q0 -52 -14.5 -71.5t-24.5 -19.5h-447q-28 0 -38 61q-2 14 -2 26z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1103" d="M113 615q0 10 3 22q2 13 7 25q12 27 30 27h798q27 0 37 -50q2 -13 2 -24q0 -45 -14.5 -62.5t-24.5 -17.5h-797q-28 0 -38 52q-2 13 -2 25q-1 1 -1 3z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1979" d="M113 614q0 10 3 22q2 13 7 25q12 28 31 28h1673q27 0 37 -51q2 -13 2 -24q0 -48 -14.5 -63.5t-24.5 -15.5h-1673q-28 0 -38 51q-2 13 -2 25q-1 1 -1 3z" /> +<glyph unicode="&#x2018;" horiz-adv-x="443" d="M66 1200q0 176 265 383q29 0 44.5 -16t15.5 -43q-106 -119 -106 -195q74 -39 74 -129q-1 -60 -43 -100q-41 -40 -85 -40q-1 0 -1 1q-45 0 -72 11q-28 12 -48 30q-44 40 -44 98z" /> +<glyph unicode="&#x2019;" horiz-adv-x="447" d="M80 1120q106 119 106 195q-74 39 -74 129q0 60 42 100q41 40 86 40h1q45 -1 72 -12q27 -12 47 -30q44 -40 45 -98q0 -176 -265 -383q-29 0 -44.5 16t-15.5 43z" /> +<glyph unicode="&#x201a;" horiz-adv-x="505" d="M74 -211q106 119 106 195q-74 39 -74 129q0 59 42 99t87 40t72 -11t47 -29q44 -40 45 -99q0 -176 -265 -383q-29 0 -44.5 16t-15.5 43z" /> +<glyph unicode="&#x201c;" horiz-adv-x="842" d="M66 1200q0 176 265 383q29 0 44.5 -16t15.5 -43q-106 -119 -106 -195q74 -39 74 -129q-1 -60 -43 -100q-41 -40 -85 -40q-1 0 -1 1q-45 0 -72 11q-28 12 -48 30q-44 40 -44 98zM465 1200q0 176 265 383q29 0 44.5 -16t15.5 -43q-106 -119 -106 -195q74 -39 74 -129 q0 -60 -42 -100q-41 -40 -86 -40l-1 1q-45 0 -72 11q-27 12 -47 30q-44 40 -45 98z" /> +<glyph unicode="&#x201d;" horiz-adv-x="845" d="M80 1120q106 119 106 195q-74 39 -74 129q0 60 42 100q41 40 86 40h1q45 -1 72 -12q27 -12 47 -30q44 -40 45 -98q0 -176 -265 -383q-29 0 -44.5 16t-15.5 43zM479 1120q106 119 106 195q-74 39 -74 129q1 60 43 100q41 40 85 40h2q44 -1 71 -12q28 -12 48 -30 q44 -40 44 -98q0 -176 -265 -383q-29 0 -44.5 16t-15.5 43z" /> +<glyph unicode="&#x201e;" horiz-adv-x="904" d="M74 -211q106 119 106 195q-74 39 -74 129q0 59 42 99t87 40t72 -11t47 -29q44 -40 45 -99q0 -176 -265 -383q-29 0 -44.5 16t-15.5 43zM473 -211q106 119 106 195q-74 39 -74 129q1 59 43 99t87 40q44 0 71 -11q28 -11 48 -29q44 -40 44 -99q0 -176 -265 -383 q-29 0 -44.5 16t-15.5 43z" /> +<glyph unicode="&#x2022;" horiz-adv-x="713" d="M100 770q0 112 73 186q72 74 181 74q110 0 185 -74t75 -186q0 -110 -75.5 -183t-184.5 -73q-54 0 -100.5 19.5t-80.5 53.5q-73 73 -73 183z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1461" d="M1080 115q0 95 84 129q26 10 55 10t54 -10q25 -12 43 -30q39 -40 39 -99q0 -92 -82 -125q-25 -10 -54 -10q-30 0 -55.5 10t-43.5 28q-40 38 -40 97zM593 115q0 95 84 129q26 10 55 10t54 -10q25 -12 43 -30q39 -40 39 -99q0 -92 -82 -125q-25 -10 -54 -10q-30 0 -55.5 10 t-43.5 28q-40 38 -40 97zM106 115q0 95 84 129q26 10 55 10t54 -10q25 -12 43 -30q39 -40 39 -99q0 -92 -82 -125q-25 -10 -54 -10q-30 0 -55.5 10t-43.5 28q-40 38 -40 97z" /> +<glyph unicode="&#x202f;" horiz-adv-x="398" /> +<glyph unicode="&#x2039;" horiz-adv-x="686" d="M43 502q0 69 40 100l421 333q31 0 52 -22q37 -39 37 -73l-306 -305l306 -351q0 -34 -20 -55q-36 -39 -68 -39l-422 339q-40 33 -40 73z" /> +<glyph unicode="&#x203a;" horiz-adv-x="686" d="M93 185l305 305l-305 351q0 34 19 56q34 38 68 38l422 -340q41 -33 41 -72q0 -66 -42 -100l-420 -333q-30 0 -51 22q-37 39 -37 73z" /> +<glyph unicode="&#x205f;" horiz-adv-x="497" /> +<glyph unicode="&#x20ac;" d="M27 642q0 10 3 22q2 12 7 24q12 28 31 28h133v18q0 58 3 112h-88q-28 0 -38 52q-2 13 -3 24q0 46 15 62t26 16h103q80 525 516 525q157 0 283 -76q140 -85 141 -208q-1 -64 -45 -110q-43 -44 -108 -44t-109 44q-45 45 -45 106q0 60 22 98q-59 36 -159 36 q-101 0 -169 -94.5t-96 -276.5h307q27 0 37 -51q2 -13 2 -24t-2 -25q-4 -14 -8 -26q-10 -28 -29 -28h-321q-2 -22 -2 -44v-86h278q26 0 36 -50q2 -13 3 -24v-4q0 -10 -2 -22q-3 -14 -7 -26q-10 -28 -30 -28h-268q35 -300 186 -387q52 -30 104 -30q51 0 86 7t69 19 q62 22 95.5 41t45.5 19q11 0 23.5 -9.5t22.5 -23.5q24 -31 24 -57q0 -27 -18.5 -43.5t-49.5 -37.5q-32 -21 -74 -39q-97 -41 -222 -41t-217 50q-91 49 -155 131q-118 152 -152 401h-144q-28 0 -38 52q-2 13 -2 25q-1 1 -1 3z" /> +<glyph unicode="&#x2122;" horiz-adv-x="3244" d="M1349 1446q0 59 26 59h298q28 0 41 -29l549 -1156l481 1165q9 20 26 20h375q25 0 25 -70q0 -71 -35 -71h-180v-1223h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-530q-25 0 -25 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v935l-449 -1119 q-12 -12 -40 -12q-54 0 -75 12l-460 1023v-882h167q26 0 26 -61q0 -48 -15 -64t-26 -16h-472q-25 0 -25 57q0 49 28 77q8 8 31 8h4q4 -1 8 -1q23 0 47 3q29 2 45 7q28 9 28 33v1164q0 16 -13 16h-163q-29 0 -39 54q-2 14 -2 28zM18 1228v4l38 273h1161l38 -273v-4 q0 -36 -55 -48q-12 -3 -25 -3h-6q-39 0 -48 26l-44 148h-335v-1210h168q27 0 27 -67q0 -43 -15.5 -58.5t-25.5 -15.5h-531q-24 0 -24 57q0 51 27 77q8 8 32 8h3q4 -1 9 -1q23 0 47 3q29 2 45 7q27 8 27 33v1167h-335l-44 -148q-9 -26 -50 -26q-50 1 -76 31q-8 10 -8 20z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1000" d="M0 1000h1000v-1000h-1000v1000z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1454" d="M826 927q0 46 27 56.5t71 17.5t92 11q92 8 177 9h1q42 0 44 -85v-795h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q117 0 132 23q5 7 5 17v666h-176q-29 1 -39 51q-2 14 -2 29zM982 1409q0 95 83 129q25 10 54 10q58 0 97.5 -39.5 t39.5 -99.5q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82q-10 25 -10 55zM64 847q0 110 13.5 132t29.5 22h10q116 0 132 23q6 8 6 20v126q0 288 179 379q66 34 135 34t107 -7t68 -26q70 -43 70 -133q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82q-10 25 -10 55v32h-1 q-81 0 -87 -169q-2 -48 -2 -96v-183h269q25 0 25 -59q0 -58 -24 -86q-7 -9 -19 -9h-251v-706h226q27 0 27 -61q0 -48 -15 -64t-26 -16h-569q-27 0 -27 61q0 48 15 64t26 16h10q116 0 132 23q6 8 6 20v663h-191z" /> +<glyph unicode="&#xfb02;" horiz-adv-x="1413" d="M785 1489q0 46 27 56.5t71 17.5q45 7 93 11q92 8 176 9q42 0 44 -85q0 -25 1 -52v-1305h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q116 0 131 23q6 8 6 20v1225h-176q-28 1 -38 51q-2 14 -3 29zM64 847q0 110 13.5 132t29.5 22h10 q116 0 132 23q6 8 6 20v126q0 288 179 379q66 34 135 34t107 -7t68 -26q70 -43 70 -133q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82q-10 25 -10 55v32h-1q-81 0 -87 -169q-2 -48 -2 -96v-183h269q25 0 25 -59q0 -58 -24 -86q-7 -9 -19 -9h-251v-706h226q27 0 27 -61 q0 -48 -15 -64t-26 -16h-569q-27 0 -27 61q0 48 15 64t26 16h10q116 0 132 23q6 8 6 20v663h-191z" /> +<glyph unicode="&#xfb03;" horiz-adv-x="2246" d="M1618 927q0 46 27 56.5t71 17.5t92 11q92 8 177 9h1q42 0 44 -85v-795h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q117 0 132 23q5 7 5 17v666h-176q-29 1 -39 51q-2 14 -2 29zM1774 1409q0 95 83 129q25 10 54 10q58 0 97.5 -39.5 t39.5 -99.5q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82q-10 25 -10 55zM856 847q0 110 13.5 132t29.5 22h10q116 0 132 23q6 8 6 20v126q0 288 179 379q66 34 135 34t107 -7t68 -26q70 -43 70 -133q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82q-10 25 -10 55v32h-1 q-81 0 -87 -169q-2 -48 -2 -96v-183h269q25 0 25 -59q0 -58 -24 -86q-7 -9 -19 -9h-251v-706h226q27 0 27 -61q0 -48 -15 -64t-26 -16h-569q-27 0 -27 61q0 48 15 64t26 16h10q116 0 132 23q6 8 6 20v663h-191zM64 847q0 110 13.5 132t29.5 22h10q116 0 132 23q6 8 6 20v126 q0 288 179 379q66 34 135 34t107 -7t68 -26q70 -43 70 -133q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82q-10 25 -10 55v32h-1q-81 0 -87 -169q-2 -48 -2 -96v-183h269q25 0 25 -59q0 -58 -24 -86q-7 -9 -19 -9h-251v-706h226q27 0 27 -61q0 -48 -15 -64t-26 -16h-569 q-27 0 -27 61q0 48 15 64t26 16h10q116 0 132 23q6 8 6 20v663h-191z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="2205" d="M1577 1489q0 46 27 56.5t71 17.5q45 7 93 11q92 8 176 9q42 0 44 -85q0 -25 1 -52v-1305h168q26 0 26 -61q0 -48 -15 -64t-26 -16h-510q-26 0 -26 61q0 48 15 64t26 16h10q116 0 131 23q6 8 6 20v1225h-176q-28 1 -38 51q-2 14 -3 29zM856 847q0 110 13.5 132t29.5 22h10 q116 0 132 23q6 8 6 20v126q0 288 179 379q66 34 135 34t107 -7t68 -26q70 -43 70 -133q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82q-10 25 -10 55v32h-1q-81 0 -87 -169q-2 -48 -2 -96v-183h269q25 0 25 -59q0 -58 -24 -86q-7 -9 -19 -9h-251v-706h226q27 0 27 -61 q0 -48 -15 -64t-26 -16h-569q-27 0 -27 61q0 48 15 64t26 16h10q116 0 132 23q6 8 6 20v663h-191zM64 847q0 110 13.5 132t29.5 22h10q116 0 132 23q6 8 6 20v126q0 288 179 379q66 34 135 34t107 -7t68 -26q70 -43 70 -133q0 -59 -40 -99q-38 -38 -97 -38q-93 0 -127 82 q-10 25 -10 55v32h-1q-81 0 -87 -169q-2 -48 -2 -96v-183h269q25 0 25 -59q0 -58 -24 -86q-7 -9 -19 -9h-251v-706h226q27 0 27 -61q0 -48 -15 -64t-26 -16h-569q-27 0 -27 61q0 48 15 64t26 16h10q116 0 132 23q6 8 6 20v663h-191z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.ttf new file mode 100644 index 000000000000..434b208ef85d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.woff new file mode 100644 index 000000000000..a9a0450e6752 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/copse-regular-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.eot new file mode 100644 index 000000000000..c041ed970bfc Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.svg new file mode 100644 index 000000000000..fb162e948630 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.svg @@ -0,0 +1,247 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Pablo Impallari wwwimpallaricomimpallarigmailcomCopyright c 2011 Igino Marini wwwikerncommailiginomarinicomCopyright c 2011 Brenda Gallo gbrenda1987gmailcomwith Reserved Font Name Quattrocento Sans +Designer : Pablo Impallari +Foundry : Pablo Impallari Igino Marini Brenda Gallo +Foundry URL : wwwimpallaricom +</metadata> +<defs> +<font id="QuattrocentoSansBold" horiz-adv-x="1103" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="501" /> +<glyph unicode=" " horiz-adv-x="501" /> +<glyph unicode="&#x09;" horiz-adv-x="501" /> +<glyph unicode="&#xa0;" horiz-adv-x="501" /> +<glyph unicode="!" horiz-adv-x="552" d="M127 121q0 57 43 99t102 42t104.5 -42t45.5 -101t-46 -101.5t-106 -42.5q-59 0 -101 43.5t-42 102.5zM137 1397h281l-53 -1028h-179z" /> +<glyph unicode="&#x22;" horiz-adv-x="770" d="M102 1499h248l-49 -442h-156zM424 1499h248l-49 -442h-156z" /> +<glyph unicode="#" horiz-adv-x="1263" d="M74 424l35 170h198l39 182h-209l33 168h213l84 395h213l-84 -395h176l84 395h213l-84 -395h207l-33 -168h-211l-39 -182h221l-34 -170h-222l-90 -424h-213l91 424h-177l-90 -424h-213l90 424h-198zM520 594h176l39 182h-176z" /> +<glyph unicode="$" horiz-adv-x="1060" d="M74 88l59 211q66 -51 146.5 -85t181.5 -42v428q-59 20 -120.5 48t-113 73t-84 114.5t-32.5 172.5q0 88 26.5 152.5t73.5 105.5t110.5 63.5t139.5 28.5v178h164v-180q84 -8 158.5 -27.5t129.5 -44.5l-55 -217q-49 33 -111.5 55.5t-121.5 34.5v-356q68 -27 132 -60.5 t115.5 -83t82 -119t30.5 -167.5q0 -92 -28.5 -161t-78 -115t-115 -73.5t-138.5 -37.5v-181h-164v174q-117 6 -216 38t-171 73zM328 1024q0 -59 35.5 -95t97.5 -65v297q-61 -10 -97 -44t-36 -93zM625 186q70 18 102.5 60.5t32.5 99.5q0 70 -41 115t-94 74v-349z" /> +<glyph unicode="%" horiz-adv-x="1716" d="M74 977q0 80 21.5 150.5t63.5 123t101 82t135 29.5t135.5 -31t101.5 -82t63.5 -119.5t21.5 -144.5q0 -74 -21.5 -143.5t-63.5 -122.5t-103.5 -85t-141.5 -32q-78 0 -136 30t-98 81t-59.5 119.5t-19.5 144.5zM250 989q0 -127 37 -190.5t102 -63.5q41 0 69.5 19.5t47 53.5 t28 78t9.5 95q0 111 -37 179.5t-115 68.5t-109.5 -68t-31.5 -172zM289 -49l948 1464h184l-948 -1464h-184zM1001 365q0 80 21.5 150.5t63.5 122.5t101.5 82t135.5 30t135.5 -31t101.5 -82t63.5 -119.5t21.5 -144.5q0 -74 -21.5 -143.5t-63.5 -123t-103.5 -85t-141.5 -31.5 q-78 0 -136.5 29.5t-98.5 81t-59.5 120t-19.5 144.5zM1178 377q0 -127 36.5 -190.5t102.5 -63.5q41 0 69.5 19.5t47 53t27.5 77.5t9 96q0 111 -36.5 179t-114.5 68t-109.5 -67.5t-31.5 -171.5z" /> +<glyph unicode="&#x26;" horiz-adv-x="1443" d="M109 360q0 55 17 113.5t51 112t86 98.5t120 74q-59 70 -92 139.5t-33 159.5q0 76 23.5 132t65.5 95t97.5 58.5t116.5 19.5q70 0 146.5 -23.5t146.5 -66.5l-57 -197q-18 16 -45 33.5t-56.5 31t-60.5 22.5t-57 9q-49 0 -83 -32.5t-34 -98.5t37 -118t90 -107l352 -364 q2 10 3 22t1 25q0 47 -15.5 101t-54.5 110l-100 -7v127l594 76v-157l-295 -23q66 -115 66 -244q0 -100 -41 -194l278 -287h-254l-129 133q-72 -72 -176 -115t-239 -43q-115 0 -203 32t-147.5 86t-89 123.5t-29.5 143.5zM346 389q0 -111 70.5 -164t179.5 -53q82 0 147.5 27.5 t110.5 74.5l-348 355q-39 -10 -68.5 -35t-50 -56.5t-31 -70.5t-10.5 -78z" /> +<glyph unicode="'" horiz-adv-x="448" d="M102 1499h248l-49 -442h-156z" /> +<glyph unicode="(" horiz-adv-x="669" d="M84 670q0 262 108.5 495.5t305.5 413.5l139 -51q-78 -92 -135.5 -187.5t-94 -200t-54 -221t-17.5 -251.5q0 -80 9 -178.5t40 -209t90.5 -229.5t159.5 -239l-137 -52q-197 176 -305.5 412t-108.5 498z" /> +<glyph unicode=")" horiz-adv-x="669" d="M33 1528l139 51q197 -180 305.5 -413.5t108.5 -495.5t-108.5 -497.5t-305.5 -412.5l-137 52q100 121 159.5 239.5t90 229t40 209t9.5 178.5q0 135 -17.5 251.5t-54.5 221t-94 200t-135 187.5z" /> +<glyph unicode="*" horiz-adv-x="901" d="M106 1024l244 78l-244 78l107 182l188 -178l-55 254h209l-55 -254l188 178l107 -182l-246 -78l246 -78l-107 -182l-190 176l57 -252h-209l55 252l-188 -176z" /> +<glyph unicode="+" horiz-adv-x="997" d="M94 406v167h309v301h189v-301h311v-167h-311v-322h-189v322h-309z" /> +<glyph unicode="," horiz-adv-x="534" d="M104 -242l93 232h-52v280h244v-311l-211 -252z" /> +<glyph unicode="-" horiz-adv-x="958" d="M133 406v167h692v-167h-692z" /> +<glyph unicode="." horiz-adv-x="522" d="M115 121q0 29 11 55.5t31.5 48t46 33.5t56.5 12q29 0 55.5 -12t48 -33.5t34 -48t12.5 -55.5q0 -31 -12.5 -56.5t-34 -46t-48 -32t-55.5 -11.5q-59 0 -102 43.5t-43 102.5z" /> +<glyph unicode="/" horiz-adv-x="923" d="M59 -117l570 1555h235l-569 -1555h-236z" /> +<glyph unicode="0" horiz-adv-x="1300" d="M106 659q0 145 37 273.5t106.5 223.5t171 150.5t230.5 55.5q131 0 232.5 -56.5t171 -150.5t105.5 -218t36 -261t-37 -263t-107.5 -223.5t-175 -156t-239.5 -58.5q-133 0 -232.5 55.5t-165 149.5t-99.5 218t-34 261zM358 674q0 -248 75 -375t212 -127q78 0 134.5 38 t93 105.5t55 159.5t18.5 199q0 109 -18.5 199t-56 155.5t-95 101t-133.5 35.5t-130 -35.5t-88 -100t-50.5 -155.5t-16.5 -200z" /> +<glyph unicode="1" horiz-adv-x="681" d="M55 1126l447 226v-1352h-236v995l-166 -73z" /> +<glyph unicode="2" horiz-adv-x="1032" d="M96 0v205q80 109 181.5 214t190.5 205.5t150.5 197t61.5 188.5q0 88 -57.5 124.5t-149.5 36.5q-88 0 -173 -27.5t-150 -64.5l-48 176q39 20 89.5 40t104.5 35.5t109.5 23.5t108.5 8q86 0 160 -23.5t126 -67.5t81.5 -106.5t29.5 -138.5q0 -104 -52 -207.5t-131 -207 t-173 -205t-176 -201.5h547v-205h-830z" /> +<glyph unicode="3" horiz-adv-x="1083" d="M61 115l58 186q72 -59 160 -94t188 -35q129 0 195.5 60.5t66.5 177.5q0 104 -60.5 164.5t-201.5 60.5h-55v178h63q90 0 139.5 57.5t49.5 151.5q0 84 -51.5 118t-123.5 34q-39 0 -80.5 -8.5t-80.5 -24t-73 -35t-58 -41.5l-54 188q78 47 179.5 78t201.5 31q86 0 158 -24.5 t124 -68.5t80.5 -105.5t28.5 -135.5q0 -109 -55 -177.5t-139 -115.5q123 -41 191.5 -123t68.5 -215q0 -86 -30.5 -162.5t-94 -134t-158 -91.5t-219.5 -34q-254 1 -418 140z" /> +<glyph unicode="4" horiz-adv-x="1101" d="M53 389v184l572 779h245v-779h142v-184h-142v-389h-235v389h-582zM285 573h350v496z" /> +<glyph unicode="5" horiz-adv-x="1087" d="M76 113l59 194q31 -29 71 -52.5t86 -40.5t94 -27.5t95 -10.5q51 0 99.5 13.5t84 42t57 74.5t21.5 112q0 49 -12 90t-40.5 69.5t-77 45t-121.5 16.5q-63 0 -139.5 -12.5t-143.5 -38.5l-59 30l79 744h695v-215h-504l-31 -324q43 12 90 17.5t86 5.5q94 0 172 -27.5 t135.5 -81t89 -130.5t31.5 -175q0 -94 -30.5 -177t-93 -145.5t-157 -98.5t-220.5 -36q-125 0 -230.5 36t-185.5 102z" /> +<glyph unicode="6" d="M115 614q0 139 23.5 273.5t82 239t155.5 169t242 64.5q37 0 82 -5t91.5 -17.5t89.5 -33t73 -51.5l-51 -180q-68 51 -143.5 71.5t-132.5 20.5q-86 0 -143.5 -37.5t-91.5 -99t-47 -137.5t-13 -152v-29q0 -13 2 -30l6 -2q35 74 107.5 108.5t170.5 34.5q117 0 193 -43 t121 -106.5t62.5 -136t17.5 -134.5q0 -74 -23.5 -149.5t-76 -137t-136.5 -100.5t-203 -39q-127 0 -214 46.5t-141 130.5t-78.5 201.5t-24.5 260.5zM377 395q0 -106 53 -169.5t145 -63.5t143.5 65.5t51.5 182.5q0 43 -8 84t-29.5 72.5t-57.5 50t-89 18.5q-104 0 -156.5 -68 t-52.5 -172z" /> +<glyph unicode="7" horiz-adv-x="935" d="M76 1147v215h829v-215q-88 -96 -176 -234.5t-157.5 -288t-112.5 -293t-43 -249.5v-43q0 -20 2 -39h-260q-2 18 -2 40v40q0 121 48 265t123.5 288.5t167 279t177.5 234.5h-596z" /> +<glyph unicode="8" horiz-adv-x="1114" d="M104 381q0 135 66 229.5t182 128.5v9q-72 27 -126 100.5t-54 185.5q0 147 100.5 237.5t284.5 90.5q180 0 282.5 -87t102.5 -235q0 -109 -52 -183.5t-128 -106.5v-9q119 -27 183.5 -123t64.5 -233q0 -86 -27 -160.5t-83 -130t-142 -87.5t-203 -32q-123 0 -209 34 t-139 90.5t-78 130t-25 151.5zM336 379q0 -111 60.5 -168t158.5 -57t158.5 57t60.5 168q0 47 -12 94t-39 84t-69 60.5t-99 23.5q-59 0 -100 -23.5t-68 -61.5t-39 -85t-12 -92zM397 1010q0 -86 43 -135.5t115 -49.5t115 49.5t43 133.5q0 80 -40 126t-118 46q-76 0 -117 -44 t-41 -126z" /> +<glyph unicode="9" d="M92 934q0 74 23.5 149.5t76 137t135.5 100.5t203 39q127 0 214 -46t141.5 -130t79 -202t24.5 -261q0 -139 -23.5 -273.5t-82 -239t-155.5 -169t-243 -64.5q-37 0 -82 5.5t-91 17.5t-89 32.5t-73 51.5l51 180q68 -51 143.5 -71.5t132.5 -20.5q86 0 142.5 38t90 99.5 t48 137t14.5 151.5v30q0 13 -2 29l-6 2q-35 -74 -107.5 -108.5t-171.5 -34.5q-117 0 -192.5 43t-120.5 106.5t-62.5 136.5t-17.5 134zM334 926q0 -43 8 -84t29.5 -73t57.5 -50.5t89 -18.5q104 0 156.5 68t52.5 172q0 106 -53 170t-146 64q-92 0 -143 -65.5t-51 -182.5z" /> +<glyph unicode=":" horiz-adv-x="561" d="M133 121q0 29 11.5 55.5t32 48t46 33.5t56.5 12q29 0 55 -12t47.5 -33.5t34 -48t12.5 -55.5q0 -31 -12.5 -56.5t-34 -46t-48 -32t-54.5 -11.5q-59 0 -102.5 43.5t-43.5 102.5zM133 782q0 29 11.5 55.5t32 48t46 34t56.5 12.5q29 0 55 -12.5t47.5 -34t34 -48t12.5 -55.5 q0 -31 -12.5 -56.5t-34 -46t-48 -31.5t-54.5 -11q-59 0 -102.5 43t-43.5 102z" /> +<glyph unicode=";" horiz-adv-x="571" d="M123 -242l92 232h-51v280h244v-311l-211 -252zM141 782q0 29 11.5 55.5t32 48t46 34t56.5 12.5q29 0 55.5 -12.5t48 -34t33.5 -48t12 -55.5q0 -31 -12 -56.5t-33.5 -46t-48.5 -31.5t-55 -11q-59 0 -102.5 43t-43.5 102z" /> +<glyph unicode="&#x3c;" horiz-adv-x="813" d="M80 426v133l584 397l36 -190l-403 -268v-11l405 -272l-36 -192z" /> +<glyph unicode="=" horiz-adv-x="974" d="M141 250v168h693v-168h-693zM141 561v168h693v-168h-693z" /> +<glyph unicode="&#x3e;" horiz-adv-x="813" d="M111 215l405 272v11l-403 268l37 190l583 -397v-133l-586 -403z" /> +<glyph unicode="?" horiz-adv-x="837" d="M74 1298q57 43 142 75t177 32q76 0 139.5 -24.5t109.5 -67.5t71.5 -102.5t25.5 -129.5q0 -92 -40 -165.5t-88 -150.5t-89 -170t-41 -224h-213q0 139 39 237.5t85 173t85 139t39 136.5q0 82 -49 114.5t-111 32.5q-66 0 -129 -28.5t-100 -73.5zM233 121q0 57 43 99t103 42 q59 0 104 -42t45 -101t-46 -101.5t-105 -42.5t-101.5 43.5t-42.5 102.5z" /> +<glyph unicode="@" horiz-adv-x="1476" d="M102 369q0 117 42 249t130 244.5t223.5 186t323.5 73.5q145 0 251 -45t174.5 -116.5t101 -161.5t32.5 -178q0 -94 -32.5 -179.5t-89 -150t-131 -102t-156.5 -37.5q-88 0 -123 42t-35 107q-35 -70 -94.5 -110.5t-112.5 -40.5q-31 0 -62.5 15t-56 46t-41 77t-16.5 107 q0 92 36 166t91 126t124 81t136 29q27 0 58.5 -5.5t62.5 -14.5t56.5 -24.5t41.5 -35.5l-63 -291q-4 -20 -6 -42t-2 -38t6 -32.5t35 -16.5q35 0 65.5 26.5t53 70.5t36 99.5t13.5 112.5q0 66 -19.5 130.5t-62.5 114.5t-111 82t-162 32q-125 0 -219 -53.5t-157.5 -138.5 t-96.5 -191.5t-33 -212.5q0 -111 33 -190t90.5 -129t132 -73.5t160.5 -23.5q80 0 150.5 17.5t127 43t98.5 54t64 49.5v-164q-20 -18 -64 -46t-105.5 -53.5t-138.5 -43t-161 -17.5q-121 0 -229.5 41t-190 116t-130 181.5t-48.5 237.5zM631 391q0 -84 45 -84q18 0 39.5 15.5 t42 43t37 63.5t22.5 79l25 147q-18 8 -41 9q-41 0 -72 -28t-53.5 -69t-33.5 -89t-11 -87z" /> +<glyph unicode="A" horiz-adv-x="1286" d="M4 0l524 1352h203l578 -1352h-256l-154 393h-510l-139 -393h-246zM455 578h370l-194 497z" /> +<glyph unicode="B" horiz-adv-x="1167" d="M180 0v1352q23 2 64 3t88 3t94 3t84 1q217 0 332.5 -89t115.5 -263q0 -82 -33.5 -148.5t-105.5 -113.5q123 -41 192.5 -129.5t69.5 -223.5q0 -86 -30.5 -161.5t-94 -133t-157.5 -91.5t-221 -34q-113 0 -219.5 7.5t-178.5 17.5zM416 176q37 -4 76 -4h79q125 0 195 61.5 t70 178.5q0 104 -63.5 164.5t-205.5 60.5q-39 0 -77.5 -1t-73.5 -3v-457zM416 809q25 -2 50 -2h52q90 0 141.5 60.5t51.5 158.5q0 61 -42 102t-120 41q-41 0 -73 -3t-60 -7v-350z" /> +<glyph unicode="C" horiz-adv-x="1286" d="M102 662q0 145 43 272t128 222t211 150.5t294 55.5q111 0 221.5 -23.5t190.5 -64.5l-60 -213q-66 45 -156.5 72.5t-207.5 27.5q-111 0 -189.5 -34.5t-128 -98t-73 -153t-23.5 -197.5q0 -248 105.5 -375t304.5 -127q123 0 224 37t167 90l61 -203q-82 -49 -197.5 -87 t-260.5 -38q-168 0 -291 55.5t-204 149.5t-120 218.5t-39 263.5z" /> +<glyph unicode="D" horiz-adv-x="1447" d="M180 0v1352q27 2 84.5 4t121 3t121.5 2t91 1q199 0 327 -41t212 -113q109 -94 157.5 -239.5t48.5 -321.5q0 -133 -33.5 -255t-120.5 -214t-239.5 -146.5t-390.5 -54.5q-86 0 -184.5 6.5t-194.5 16.5zM416 180q57 -4 110.5 -6t89.5 -2q248 0 362 119t114 387 q0 121 -24 212t-81 152.5t-153.5 92t-239.5 30.5h-77q-48 0 -101 -2v-983z" /> +<glyph unicode="E" horiz-adv-x="1083" d="M180 0v1352h783v-205h-547v-328h409v-205h-409v-409h588v-205h-824z" /> +<glyph unicode="F" horiz-adv-x="997" d="M180 0v1352h772v-205h-536v-328h387v-205h-387v-614h-236z" /> +<glyph unicode="G" horiz-adv-x="1345" d="M102 662q0 145 43 272t128 222t212 150.5t297 55.5q115 0 227.5 -23.5t200.5 -64.5l-65 -213q-70 41 -162 70.5t-209 29.5t-197.5 -33.5t-130 -97t-72 -153t-22.5 -201.5q0 -500 424 -500q76 0 121 12.5t96 28.5v340h236v-444q-92 -61 -211 -99.5t-260 -38.5 q-170 0 -293 55.5t-204 149.5t-120 218.5t-39 263.5z" /> +<glyph unicode="H" horiz-adv-x="1478" d="M180 0v1352h236v-553h647v553h235v-1352h-235v594h-647v-594h-236z" /> +<glyph unicode="I" horiz-adv-x="595" d="M180 0v1352h236v-1352h-236z" /> +<glyph unicode="J" horiz-adv-x="593" d="M-27 -141q72 0 114 32.5t62.5 83t25.5 113t5 121.5v1143h236v-1145q0 -109 -23.5 -204t-73 -167t-124 -113.5t-177.5 -41.5z" /> +<glyph unicode="K" horiz-adv-x="1247" d="M180 0v1352h236v-590q117 111 209 215q86 98 155.5 191.5t120.5 183.5h258q-90 -123 -172 -225.5t-180 -213.5q-37 -41 -76 -84t-80 -86l604 -743h-272l-481 592l-86 -80v-512h-236z" /> +<glyph unicode="L" horiz-adv-x="1017" d="M180 0v1352h236v-1147h563v-205h-799z" /> +<glyph unicode="M" horiz-adv-x="1806" d="M180 0v1352h269l460 -1033l449 1033h268v-1352h-233v891l-389 -891h-189l-399 891v-891h-236z" /> +<glyph unicode="N" horiz-adv-x="1478" d="M180 0v1352h289l594 -994v994h235v-1352h-288l-594 991v-991h-236z" /> +<glyph unicode="O" horiz-adv-x="1519" d="M100 659q0 145 44 273.5t128 223.5t207 150.5t281 55.5q160 0 282.5 -55.5t206.5 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -284.5 55.5t-200.5 149.5t-120 218t-40 261zM352 680q0 -250 102.5 -377t295.5 -127q113 0 191.5 38 t129.5 104.5t74.5 156.5t23.5 193q0 111 -24.5 200.5t-75.5 155.5t-130 101.5t-185 35.5q-109 0 -185.5 -35.5t-125 -99t-70 -152t-21.5 -194.5z" /> +<glyph unicode="P" horiz-adv-x="1087" d="M180 0v1352q31 2 71 4t84 3l88 2q44 1 83 1q115 0 209 -27.5t161.5 -83t104.5 -136.5t37 -187q0 -86 -28.5 -162t-86 -133.5t-146.5 -91t-208 -33.5h-69q-34 0 -64 2v-510h-236zM416 707q29 -2 60 -2h67q111 0 167 61t56 178q0 98 -50 159.5t-177 61.5h-64q-31 0 -59 -2 v-456z" /> +<glyph unicode="Q" horiz-adv-x="1525" d="M104 659q0 145 44.5 273.5t128 223.5t206.5 150.5t281 55.5q160 0 282.5 -55.5t206.5 -150.5t127 -220t43 -262q0 -131 -40 -254t-119.5 -219.5t-198.5 -156.5t-277 -67q74 -8 141.5 -32.5t134 -50t135.5 -46t147 -20.5q45 0 94 9t104 32l-53 -201q-37 -14 -73 -19 t-70 -5q-86 0 -165 27.5t-156 59t-151.5 59.5t-150.5 28q-45 0 -112.5 -16.5t-131.5 -63.5l-41 147q55 43 120 65.5t124 26.5q-145 10 -255 69.5t-181.5 152t-107.5 211t-36 249.5zM356 674q0 -246 102.5 -372t299.5 -126q111 0 189.5 39t128.5 105.5t74 157.5t24 196 q0 106 -25 196.5t-76 155t-130 100t-187 35.5q-109 0 -184.5 -35.5t-124 -100t-70 -153.5t-21.5 -198z" /> +<glyph unicode="R" horiz-adv-x="1241" d="M180 0v1352q33 2 75 4t85 3t81 2t60 1q262 0 399.5 -99.5t137.5 -289.5q0 -121 -59.5 -217.5t-198.5 -143.5l495 -612h-272l-471 578h-46q-24 0 -50 2v-580h-236zM416 774h127q111 0 168 55.5t57 157.5q0 92 -56.5 135t-209.5 43h-39q-23 0 -47 -2v-389z" /> +<glyph unicode="S" horiz-adv-x="1110" d="M86 88l61 221q78 -59 173.5 -98t218.5 -39q131 0 190 46t59 124q0 59 -28.5 101t-71.5 72t-91 48.5t-85 30.5q-66 20 -133.5 49t-124.5 75t-93 115.5t-36 174.5q0 98 34 165.5t92 109.5t137 60.5t171 18.5q113 0 218.5 -22.5t176.5 -55.5l-55 -217q-37 25 -80 43 t-89 30.5t-92 19.5t-87 7q-92 0 -145.5 -34.5t-53.5 -106.5q0 -43 19.5 -73.5t54.5 -53t83 -42t107 -40.5q74 -27 147 -60.5t131 -83.5t95 -124t37 -178q0 -111 -40 -186.5t-107.5 -122t-155.5 -67t-182 -20.5q-135 0 -253 33t-202 80z" /> +<glyph unicode="T" d="M43 1147v205h1018v-205h-391v-1147h-236v1147h-391z" /> +<glyph unicode="U" horiz-adv-x="1443" d="M166 475v877h235v-828q0 -186 86 -267t240 -81t241 81t87 267v828h225v-877q0 -100 -33 -190t-101.5 -159t-176 -109t-254.5 -40t-252 40t-171.5 109t-96 159t-29.5 190z" /> +<glyph unicode="V" horiz-adv-x="1298" d="M-25 1352h256l431 -1065l389 1065h245l-540 -1352h-187z" /> +<glyph unicode="W" horiz-adv-x="2134" d="M2 1352h256l346 -1049l348 1049h232l346 -1049l346 1049h256l-502 -1352h-194l-369 1028l-367 -1028h-194z" /> +<glyph unicode="X" horiz-adv-x="1306" d="M23 0l499 696l-469 656h264l342 -529l338 529h258l-471 -658l498 -694h-264l-371 547l-366 -547h-258z" /> +<glyph unicode="Y" horiz-adv-x="1155" d="M-25 1352h265l346 -613l332 613h260l-482 -797v-555h-235v547z" /> +<glyph unicode="Z" horiz-adv-x="1134" d="M88 0v205l672 942h-641v205h897v-205l-672 -942h703v-205h-959z" /> +<glyph unicode="[" horiz-adv-x="575" d="M158 -195v1729h327v-148h-112v-1433h112v-148h-327z" /> +<glyph unicode="\" horiz-adv-x="921" d="M59 1438h232l569 -1555h-231z" /> +<glyph unicode="]" horiz-adv-x="575" d="M90 -47h113v1433h-113v148h328v-1729h-328v148z" /> +<glyph unicode="^" horiz-adv-x="712" d="M117 1161l6 15l225 202h17l225 -202l6 -15l-33 -59l-14 -6l-193 84l-192 -84l-14 6z" /> +<glyph unicode="_" horiz-adv-x="964" d="M39 0h887v-168h-887v168z" /> +<glyph unicode="`" horiz-adv-x="448" d="M0 1292q0 35 16.5 71t44.5 36q8 0 21 -6l369 -207l6 -15l-31 -73l-16 -6l-383 141q-14 4 -20.5 20t-6.5 39z" /> +<glyph unicode="a" horiz-adv-x="1026" d="M70 248q0 84 35.5 150.5t103 112.5t162 70.5t211.5 24.5h88v31q0 80 -52 117q-53 37 -165 37q-152 0 -271 -68l-43 170q137 80 332 80q205 0 311 -84q49 -39 81 -100.5t32 -147.5v-641h-180l-17 129h-8q-55 -70 -150.5 -112t-193.5 -42q-129 0 -202.5 75t-73.5 198z M309 281q0 -123 125 -123q66 0 131.5 31.5t104.5 84.5v187h-39q-168 0 -245 -43t-77 -137z" /> +<glyph unicode="b" horiz-adv-x="1175" d="M141 0v1516h224v-668q47 59 124.5 92t176.5 33q106 0 186 -41t133 -108.5t79 -156.5t26 -186q0 -109 -31 -201t-87.5 -159.5t-136 -106.5t-176.5 -39q-111 0 -183.5 45.5t-129.5 108.5h-8l-16 -129h-181zM365 274q23 -31 55.5 -54t68 -39.5t72.5 -26t70 -9.5q59 0 103 29 t74 75t44 106.5t14 121.5q0 63 -15 121.5t-47 104t-80 71t-112 25.5q-59 0 -122.5 -28t-124.5 -103v-394z" /> +<glyph unicode="c" horiz-adv-x="1001" d="M86 479q0 98 27.5 187.5t87 158t151.5 108.5t221 40q98 0 192.5 -22.5t152.5 -59.5l-50 -182q-23 16 -56.5 32.5t-72.5 28.5t-81 19.5t-78 7.5q-70 0 -118 -26t-78 -67.5t-43 -97t-13 -114.5q0 -70 16 -130.5t49 -105.5t83 -71.5t116 -26.5q74 0 156.5 29.5t138.5 82.5 l41 -192q-57 -37 -156.5 -70t-212.5 -33q-119 0 -208 41t-147.5 110t-88 160t-29.5 193z" /> +<glyph unicode="d" horiz-adv-x="1175" d="M86 481q0 96 25.5 185.5t79 157t132 108.5t187.5 41q98 0 176 -33t125 -92v668h223v-1516h-180l-16 129h-9q-57 -63 -129.5 -108.5t-183.5 -45.5q-96 0 -176 39t-136.5 106.5t-87 159.5t-30.5 201zM309 477q0 -61 14.5 -121.5t43 -106.5t73.5 -75t105 -29q33 0 69.5 9.5 t72.5 26t68.5 40t55.5 53.5v394q-61 76 -124.5 103.5t-123.5 27.5q-66 0 -113 -25.5t-78.5 -71t-47 -104t-15.5 -121.5z" /> +<glyph unicode="e" horiz-adv-x="1034" d="M84 471q0 100 31.5 191.5t93 161t153 109.5t207.5 40q180 0 278.5 -91t98.5 -257q0 -23 -3 -48.5t-8 -50t-12.5 -44t-15.5 -31.5h-596q4 -61 22.5 -115.5t53.5 -94.5t85 -63.5t118 -23.5q76 0 161 28.5t144 71.5l37 -168q-27 -16 -66 -35.5t-88 -36t-105.5 -28 t-117.5 -11.5q-115 0 -203 40t-147.5 109t-90 159t-30.5 188zM330 610h391q2 6 3 14.5t1 20.5q0 66 -45 109t-117 43q-86 0 -146 -50.5t-87 -136.5z" /> +<glyph unicode="f" horiz-adv-x="634" d="M70 805v117l116 18q0 117 7.5 199t19.5 138t27.5 91t31.5 57q41 53 107.5 77t146.5 24q10 0 33 -1t50.5 -5t57 -13.5t54.5 -23.5l-51 -174q-20 12 -67.5 33.5t-92.5 21.5q-27 0 -45.5 -12.5t-30.5 -45t-17 -88t-5 -141.5v-135h180v-137h-180v-805h-226v805h-116z" /> +<glyph unicode="g" horiz-adv-x="1019" d="M53 -233q0 41 14.5 80.5t40 73.5t59.5 60.5t73 38.5v9q-47 20 -65.5 55t-18.5 68q0 43 28.5 79.5t81.5 57.5v8q-92 39 -133 121t-41 178q0 80 26.5 149.5t77 119.5t121 79t160.5 29q53 0 105.5 -10.5t91.5 -30.5q86 2 156.5 13t136.5 30l18 -14l-22 -156l-11 -10l-145 16 l-2 -6q70 -88 69 -207q0 -72 -25.5 -134.5t-74.5 -108.5t-121.5 -73.5t-165.5 -27.5q-23 0 -36 1t-25 1q-35 -12 -53.5 -31.5t-18.5 -40.5q0 -23 22.5 -39t69.5 -22l199 -25q68 -8 126 -28.5t102.5 -55t69 -84t24.5 -112.5t-27 -123t-84 -105t-144 -71.5t-210 -26.5 q-109 0 -192 21.5t-140 58.5t-87 87.5t-30 107.5zM254 -209q0 -66 64.5 -98.5t187.5 -32.5q121 0 192.5 34t71.5 109q0 74 -80 105t-268 47q-70 -12 -119 -58.5t-49 -105.5zM305 610q0 -37 11.5 -72.5t34 -63.5t56 -45t78.5 -17q84 0 127 54t43 132q0 37 -10 75t-32.5 68.5 t-56.5 50t-79 19.5q-43 0 -75.5 -17.5t-54 -46t-32 -64.5t-10.5 -73z" /> +<glyph unicode="h" horiz-adv-x="1130" d="M141 0v1516h226v-713q57 90 134 130t181 40q61 0 118.5 -17.5t101.5 -56.5t69.5 -102.5t25.5 -155.5v-641h-225v623q0 84 -37 126t-100 42q-39 0 -81 -12.5t-79 -37t-65.5 -59.5t-42.5 -78v-604h-226z" /> +<glyph unicode="i" horiz-adv-x="507" d="M109 1245q0 29 11 55.5t31.5 48t46 34t56.5 12.5q29 0 55.5 -12.5t48 -34t33.5 -48t12 -55.5q0 -31 -12 -56.5t-33.5 -46t-48 -31.5t-55.5 -11q-59 0 -102 43t-43 102zM141 0v942h226v-942h-226z" /> +<glyph unicode="j" horiz-adv-x="507" d="M-78 -385q6 -4 18.5 -5t24.5 -1q61 0 96 38t53.5 96t22.5 126t4 127v946h226v-948q0 -104 -24 -198.5t-69 -167t-111.5 -114.5t-154.5 -42q-16 0 -29.5 1t-19.5 5zM109 1245q0 29 11 55.5t31.5 48t46 34t56.5 12.5q59 0 104 -46t45 -106q0 -59 -46 -101t-105 -42t-101 43 t-42 102z" /> +<glyph unicode="k" horiz-adv-x="1009" d="M141 0v1516h226v-875l313 301h252l-336 -332l401 -610h-245l-306 463l-79 -80v-383h-226z" /> +<glyph unicode="l" horiz-adv-x="532" d="M154 0v1516h225v-1516h-225z" /> +<glyph unicode="m" horiz-adv-x="1710" d="M141 0v942h176l11 -139h8q41 86 130 128t189 42q96 0 175 -38t118 -130q41 84 129 126t189 42q66 0 124 -17.5t102 -56.5t69.5 -102.5t25.5 -155.5v-641h-225v623q0 168 -133 168q-33 0 -71 -12.5t-73.5 -36t-65.5 -58.5t-42 -80v-604h-225v623q0 168 -134 168 q-33 0 -70.5 -12.5t-73.5 -36t-65.5 -58.5t-41.5 -80v-604h-226z" /> +<glyph unicode="n" horiz-adv-x="1120" d="M141 0v942h176l11 -139h8q43 86 134 128t196 42q68 0 127 -17.5t105 -56.5t72.5 -102.5t26.5 -155.5v-641h-225v623q0 168 -143 168q-35 0 -75 -12.5t-77 -36t-66.5 -58.5t-43.5 -80v-604h-226z" /> +<glyph unicode="o" horiz-adv-x="1124" d="M86 475q0 100 28.5 190.5t87 159t148.5 108.5t211 40q125 0 215 -42t148.5 -112.5t86 -162t27.5 -191.5t-27.5 -189.5t-86 -156t-147.5 -105.5t-210 -39q-125 0 -215 41t-149.5 110t-88 159t-28.5 190zM328 481q0 -66 13 -126t43 -107t75 -75t106 -28q59 0 103.5 26 t73 70t42 101t13.5 121q0 66 -14.5 126t-44 106t-75 74t-108.5 28q-59 0 -102 -26t-71 -69t-41 -100.5t-13 -120.5z" /> +<glyph unicode="p" horiz-adv-x="1177" d="M141 -532v1474h181l16 -129h8q27 33 63.5 62.5t79.5 51t88.5 34t88.5 12.5q111 0 190.5 -42t131.5 -111.5t77 -161t25 -189.5q0 -100 -26 -190.5t-79 -158t-133 -106.5t-190 -39q-92 0 -171 27t-126 86v-620h-224zM365 268q61 -76 125.5 -95t117.5 -19q68 0 116 24.5 t80 66.5t47 98t15 122q0 61 -13 121.5t-43 107.5t-75 77t-106 30q-31 0 -68 -9.5t-72.5 -26.5t-68.5 -42t-55 -55v-400z" /> +<glyph unicode="q" horiz-adv-x="1177" d="M88 469q0 98 24.5 189.5t77 161t132 111.5t190.5 42q43 0 88 -12.5t88 -34t80 -51t63 -62.5h9l16 129h180v-1474h-223v620q-47 -59 -126 -86t-171 -27q-111 0 -190.5 39t-133 106.5t-79 158t-25.5 190.5zM311 465q0 -66 15.5 -123t47.5 -100t80 -67.5t115 -24.5 q53 0 118 24.5t126 93.5v400q-23 31 -55.5 55.5t-68.5 41.5t-72.5 26.5t-67.5 9.5q-61 0 -106.5 -30t-75 -77t-43 -107.5t-13.5 -121.5z" /> +<glyph unicode="r" horiz-adv-x="765" d="M141 0v942h176l11 -197h8q20 43 42.5 84t51.5 73t67 51.5t89 19.5q82 0 153 -53l-59 -183q-20 16 -63.5 26.5t-73.5 10.5q-41 0 -67.5 -19.5t-47 -51t-35 -72.5t-26.5 -84v-547h-226z" /> +<glyph unicode="s" horiz-adv-x="886" d="M88 78l53 194q70 -68 157 -100.5t161 -32.5q78 0 118.5 34t40.5 93q0 35 -20 58.5t-82 40.5l-197 49q-70 16 -113.5 47t-69 68.5t-35 78.5t-9.5 78q0 137 96.5 212t249.5 75q80 0 172 -21.5t156 -62.5l-59 -184q-41 33 -115 66.5t-164 33.5q-68 0 -105.5 -25.5 t-37.5 -72.5q0 -31 21.5 -56.5t90.5 -42.5l146 -33q86 -18 138 -53t82 -75.5t40 -84t10 -79.5q0 -66 -26.5 -122.5t-75.5 -97t-119 -64.5t-156 -24q-109 0 -201 32t-147 71z" /> +<glyph unicode="t" horiz-adv-x="679" d="M68 805v123l133 20l37 279h172v-285h180v-137h-180v-541q0 -61 12 -82.5t47 -21.5q27 0 53.5 10t77.5 39l37 -162q-39 -33 -109.5 -52.5t-140.5 -19.5q-61 0 -101 16.5t-62.5 48.5t-31 77t-8.5 100v588h-116z" /> +<glyph unicode="u" d="M133 301v641h225v-612q0 -84 44 -128t114 -44q72 0 131.5 48t87.5 138v598h228v-942h-177l-12 131h-8q-23 -47 -57.5 -76.5t-76.5 -47t-87 -25t-88 -7.5q-68 0 -126.5 16.5t-102.5 54.5t-69.5 100.5t-25.5 154.5z" /> +<glyph unicode="v" horiz-adv-x="1073" d="M20 942h236l285 -756l297 756h221l-389 -942h-273z" /> +<glyph unicode="w" horiz-adv-x="1683" d="M27 942h235l246 -723l223 723h225l224 -723l245 723h232l-342 -942h-268l-203 655l-203 -655h-272z" /> +<glyph unicode="x" horiz-adv-x="1040" d="M29 0l362 481l-342 461h256l221 -317l211 317h256l-344 -457l365 -485h-256l-240 344l-233 -344h-256z" /> +<glyph unicode="y" horiz-adv-x="1062" d="M-14 942h235l328 -670l262 670h217l-389 -950q-29 -72 -79 -161t-118.5 -168t-154.5 -133t-187 -54q-16 0 -24 1t-19 5l-39 176q6 -2 14.5 -4t35.5 -2q39 0 76.5 8t76.5 33q74 47 128 131t106 207z" /> +<glyph unicode="z" horiz-adv-x="856" d="M86 0v182l430 578h-410v182h644v-182l-443 -578h463v-182h-684z" /> +<glyph unicode="{" horiz-adv-x="598" d="M61 618v103q55 2 85 28.5t43.5 61.5t16.5 73t3 64q0 43 -1 90t-1 90t-1 78t-1 58q0 66 10 120t42 91.5t89 59t154 21.5l4 -104q-49 -6 -60.5 -49t-11.5 -90q0 -25 1 -66t1 -84t1 -83t1 -60q0 -147 -44 -235.5t-148 -114.5q104 -27 148 -115t44 -236q0 -23 -1 -61.5 t-1 -81.5t-1 -83t-1 -64q0 -49 11.5 -92t60.5 -50l-4 -104q-96 0 -153.5 21.5t-89.5 59.5t-42 92t-10 122q0 20 1 58t1 80t1 85t1 76q0 37 -3 78t-17.5 76.5t-44.5 60t-83 26.5z" /> +<glyph unicode="|" horiz-adv-x="524" d="M158 -233v1806h209v-1806h-209z" /> +<glyph unicode="}" horiz-adv-x="598" d="M94 -113q49 6 60.5 49.5t11.5 90.5q0 25 -1 65.5t-1 83.5t-1 82t-1 61q0 147 44 235.5t148 115.5q-104 27 -148 114.5t-44 235.5q0 20 1 60t1 83t1 83t1 65q0 49 -11.5 92t-60.5 49l4 104q94 0 152.5 -21.5t90.5 -59t42 -92t10 -121.5q0 -23 -1 -60t-1 -79t-1 -85t-1 -75 q0 -37 3 -78t17.5 -77t44 -60.5t83.5 -26.5v-103q-55 -4 -85 -29.5t-43.5 -60t-16.5 -72.5t-3 -65q0 -43 1 -90t1 -90t1 -79t1 -56q0 -66 -10 -120t-42 -93t-90 -59.5t-153 -20.5z" /> +<glyph unicode="~" horiz-adv-x="970" d="M131 414q0 16 11.5 48t35 62.5t60 54t88.5 23.5q18 0 61 -3t94 -6t104.5 -6t94.5 -3q39 0 75 7t62 40l25 -41q0 -10 -10.5 -40t-32 -63.5t-57 -59.5t-87.5 -26q-16 0 -67 3.5t-111.5 6.5t-117 6t-85.5 3q-47 0 -71.5 -10.5t-44.5 -34.5z" /> +<glyph unicode="&#xa1;" horiz-adv-x="522" d="M115 831q0 59 46 101.5t105 42.5t101.5 -43t42.5 -103q0 -57 -43 -99t-103 -42q-59 0 -104 42t-45 101zM119 -446l53 1028h178l49 -1028h-280z" /> +<glyph unicode="&#xa2;" horiz-adv-x="1015" d="M84 449q0 84 23.5 161.5t72.5 139t126 103.5t183 54v275h189v-279q72 -10 134 -28.5t103 -45.5l-53 -190q-29 27 -78 48.5t-106 33.5v-559q59 14 112.5 41.5t94.5 64.5l41 -190q-41 -29 -105.5 -53.5t-142.5 -36.5v-269h-189v261q-102 10 -177.5 52t-127 104.5t-76 143.5 t-24.5 169zM303 455q0 -98 50 -178t136 -111v557q-92 -27 -139 -103.5t-47 -164.5z" /> +<glyph unicode="&#xa3;" horiz-adv-x="1193" d="M66 74q156 59 225 169.5t69 237.5v31h-190v168h182q-10 90 -24.5 169t-14.5 148q0 98 36 168t94.5 114t129 63.5t142.5 19.5q92 0 183 -28.5t144 -71.5l-45 -187q-41 41 -119.5 71t-154.5 30q-49 0 -81 -13.5t-50.5 -37t-25.5 -55.5t-7 -71q0 -63 12.5 -145t20.5 -174 h250v-168h-246q-4 -86 -36 -179t-99 -171l4 -6q57 -4 112.5 -17.5t113 -29t114.5 -27.5t119 -12q98 0 190 39l-49 -201q-51 -27 -86 -34t-70 -7q-82 0 -158.5 21.5t-150.5 46t-144.5 46t-140.5 21.5q-43 0 -95 -13.5t-109 -60.5z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1212" d="M98 856l113 113l149 -146q61 41 120 60.5t124 19.5q68 0 126 -19.5t116 -60.5l149 146l113 -111l-145 -149q41 -59 60 -118t19 -124q0 -66 -18 -122t-59 -116l149 -147l-115 -113l-151 146q-113 -82 -240 -82q-63 0 -120.5 19.5t-122.5 62.5l-150 -146l-111 113l146 147 q-80 104 -80 242q0 63 18.5 120.5t63.5 117.5zM334 469q0 -57 21.5 -107.5t58.5 -87t87 -58t107 -21.5t106.5 21.5t86.5 58t57.5 87t20.5 107.5t-20.5 107.5t-57.5 87t-87 58t-108 21.5q-55 0 -105 -21.5t-87 -58t-58.5 -87t-21.5 -107.5z" /> +<glyph unicode="&#xa5;" horiz-adv-x="1325" d="M63 1352h265l346 -613l332 613h260l-334 -553h155v-168h-258l-45 -76v-33h303v-168h-303v-354h-235v354h-320v168h320v25l-51 84h-269v168h168z" /> +<glyph unicode="&#xa6;" horiz-adv-x="528" d="M160 -233v794h209v-794h-209zM160 778v795h209v-795h-209z" /> +<glyph unicode="&#xa7;" horiz-adv-x="888" d="M88 760q0 76 35 147.5t94 114.5q-23 61 -22 127q0 78 27.5 135t71.5 94t96 55.5t102 18.5q68 0 140.5 -27.5t119.5 -66.5l-68 -158q-39 29 -82 45.5t-78 16.5q-53 0 -82.5 -38t-29.5 -98q0 -59 28.5 -105t71.5 -86t94 -77t94 -80t72 -95t29 -122q0 -78 -36 -148.5 t-93 -115.5q23 -57 22 -125q0 -78 -27.5 -135t-71.5 -94t-96.5 -55.5t-101.5 -18.5q-68 0 -140.5 27.5t-119.5 66.5l68 158q39 -29 82 -45.5t78 -16.5q53 0 82.5 38t29.5 98q0 59 -28.5 105t-71.5 86t-94.5 77t-94.5 80t-71.5 95t-28.5 122zM270 813q0 -63 34 -112.5 t83 -93.5t106.5 -89t104.5 -100q20 45 20 90q0 61 -33.5 110.5t-83.5 94.5t-107.5 90t-104.5 100q-19 -41 -19 -90z" /> +<glyph unicode="&#xa8;" horiz-adv-x="450" d="M0 1266q0 47 35 83.5t82 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-82 35t-35 82zM279 1266q0 47 34.5 83.5t81.5 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-81.5 35t-34.5 82z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1456" d="M106 725q0 127 48.5 238.5t133.5 195.5t197.5 132t241.5 48t242.5 -48t197.5 -132t133.5 -195.5t49.5 -238.5q0 -129 -49.5 -242.5t-134.5 -196.5t-200.5 -131.5t-248.5 -48.5q-125 0 -236.5 49.5t-194.5 133.5t-131.5 196.5t-48.5 239.5zM231 729q0 -109 37 -202 t102.5 -161.5t152.5 -108.5t190 -40q109 0 201 39t159.5 106.5t106.5 159.5t39 201q0 104 -38 196.5t-103.5 161t-154.5 108.5t-192 40q-106 0 -197.5 -39t-159 -106.5t-105.5 -159t-38 -195.5zM381 729q0 70 19.5 132.5t60.5 109.5t105.5 75.5t154.5 28.5q68 0 134.5 -15.5 t107.5 -41.5l-33 -144q-29 18 -90.5 34t-114.5 16q-49 0 -83 -17.5t-55.5 -45t-30.5 -62.5t-9 -72q0 -82 46 -144.5t138 -62.5q57 0 115.5 22.5t97.5 51.5l25 -145q-41 -27 -111 -49.5t-147 -22.5q-84 0 -145.5 28.5t-102.5 76.5t-61.5 111.5t-20.5 135.5z" /> +<glyph unicode="&#xaa;" horiz-adv-x="747" d="M104 903q0 102 82 158.5t226 56.5h51v19q0 25 -6 42t-25 31q-35 27 -94 27q-53 0 -92 -18.5t-74 -42.5l-27 112q80 59 203 60q53 0 102.5 -11.5t86.5 -40.5q39 -31 57 -76.5t18 -93.5v-370h-120l-9 75h-8q-33 -41 -89 -66.5t-116 -25.5q-80 0 -123 46t-43 118zM248 922 q0 -72 74 -72q41 0 79.5 19.5t61.5 50.5v112h-23q-102 0 -147 -26.5t-45 -83.5z" /> +<glyph unicode="&#xab;" horiz-adv-x="1087" d="M88 489v11l274 360h230l-297 -362v-11l297 -362h-232zM485 489v11l275 360h229l-297 -362v-11l297 -362h-231z" /> +<glyph unicode="&#xac;" horiz-adv-x="1277" d="M141 561v168h983v-489h-190v321h-793z" /> +<glyph unicode="&#xad;" horiz-adv-x="954" d="M133 406v167h688v-167h-688z" /> +<glyph unicode="&#xae;" horiz-adv-x="1456" d="M106 725q0 127 48.5 238.5t133.5 195.5t197.5 132t241.5 48t242.5 -48t197.5 -132t133.5 -195.5t49.5 -238.5q0 -129 -49.5 -242.5t-134.5 -196.5t-200.5 -131.5t-248.5 -48.5q-125 0 -236.5 49.5t-194.5 133.5t-131.5 196.5t-48.5 239.5zM231 729q0 -109 37 -202 t102.5 -161.5t152.5 -108.5t190 -40q109 0 201 39t159.5 106.5t106.5 159.5t39 201q0 104 -38 196.5t-103.5 161t-154.5 108.5t-192 40q-106 0 -197.5 -39t-159 -106.5t-105.5 -159t-38 -195.5zM506 412v671q16 2 41 3l49 3q25 1 46 1h34q86 0 140 -17.5t85 -47.5t43 -70 t12 -87q0 -55 -28.5 -103t-81.5 -77l153 -276h-145l-127 243h-84v-243h-137zM643 754h59q57 0 89 37.5t32 89.5q0 47 -31.5 78.5t-115.5 31.5h-33v-237z" /> +<glyph unicode="&#xb0;" horiz-adv-x="757" d="M98 1079q0 55 18.5 104.5t53.5 85.5t87 57.5t120 21.5q70 0 123 -21.5t89 -58.5t53 -87.5t17 -105.5q0 -53 -16 -100t-51 -82t-88 -55.5t-127 -20.5t-127 21.5t-87 57.5t-49.5 83t-15.5 100zM242 1085q0 -55 33.5 -99t101.5 -44q72 0 101.5 41t29.5 96q0 53 -29.5 95.5 t-101.5 42.5t-103.5 -40.5t-31.5 -91.5z" /> +<glyph unicode="&#xb1;" horiz-adv-x="948" d="M145 84v168h658v-168h-658zM147 582v168h238v182h188v-182h228v-168h-228v-207h-188v207h-238z" /> +<glyph unicode="&#xb2;" horiz-adv-x="772" d="M119 612v127q49 55 113.5 105.5t121 98.5t95 97.5t38.5 106.5q0 12 -3 28.5t-12 31t-26.5 23.5t-44.5 9q-53 0 -112.5 -36t-104.5 -93l-34 131q66 59 131 90t137 31q104 0 160.5 -55.5t56.5 -141.5q0 -59 -26.5 -112.5t-73 -104.5t-106.5 -102t-128 -107h334v-127h-516z " /> +<glyph unicode="&#xb3;" horiz-adv-x="696" d="M98 680l25 123q43 -35 80 -56.5t98 -21.5q78 0 114 34t36 93q0 53 -36 83t-136 30h-25v110h31q66 0 97.5 25.5t31.5 70.5q0 29 -16.5 48.5t-67.5 19.5q-53 0 -93 -18.5t-67 -40.5l-23 120q47 29 88 45.5t99 16.5q104 0 162.5 -51t58.5 -131q0 -55 -26.5 -91t-69.5 -63 q63 -23 99 -67t36 -117q0 -47 -16.5 -90t-51 -77t-89 -53.5t-128.5 -19.5q-76 0 -120 20.5t-91 57.5z" /> +<glyph unicode="&#xb4;" horiz-adv-x="448" d="M0 1171l6 15l369 207q12 6 20 6q29 0 45.5 -36t16.5 -71q0 -23 -6.5 -39t-20.5 -20l-383 -141l-16 6z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1173" d="M63 -227q37 70 66 132t48.5 125.5t30.5 129t11 141.5v641h225v-612q0 -84 44 -128t114 -44q72 0 131.5 49t87.5 139v596h228v-942h-177l-12 131h-8q-23 -47 -57.5 -76.5t-75.5 -47t-86 -25t-88 -7.5q-86 0 -154 25l-4 -16q-10 -43 -21.5 -80t-24.5 -73t-28.5 -74 t-36.5 -81z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1140" d="M68 928q0 106 34.5 187t99 136.5t156 83t201.5 27.5q78 0 188.5 -3t208.5 -7v-1528h-174v1341h-90v-1341h-184v684h-43q-94 0 -168 33.5t-125 91t-77.5 133.5t-26.5 162z" /> +<glyph unicode="&#xb7;" horiz-adv-x="546" d="M127 498q0 29 11.5 55.5t31.5 48t46 33.5t56 12q29 0 55.5 -12t48 -33.5t34 -48.5t12.5 -55q0 -31 -12.5 -56.5t-34 -46t-48 -32t-55.5 -11.5q-59 0 -102 43.5t-43 102.5z" /> +<glyph unicode="&#xb8;" horiz-adv-x="413" d="M0 -395l57 98h15q23 -10 58.5 -17.5t70.5 -7.5t62.5 13.5t27.5 48.5q0 37 -25.5 50t-60.5 13q-25 0 -50.5 -4t-48.5 -10l-38 53l104 158h111l-52 -84q31 8 60 8q72 0 117 -48t45 -120q0 -41 -19.5 -76.5t-53.5 -64.5t-81 -45t-102 -16q-53 0 -103.5 11t-91.5 27z" /> +<glyph unicode="&#xb9;" horiz-adv-x="516" d="M72 1206l297 156v-750h-154v545l-117 -57z" /> +<glyph unicode="&#xba;" horiz-adv-x="802" d="M96 1051q0 63 20.5 121.5t60.5 101.5t95.5 68.5t126.5 25.5q74 0 131.5 -26.5t96.5 -71.5t59.5 -103.5t20.5 -122.5q0 -59 -18.5 -115.5t-57.5 -99.5t-96.5 -68.5t-133.5 -25.5q-78 0 -135 26.5t-95 71t-56.5 102t-18.5 116.5zM262 1053q0 -72 34 -122t105 -50 q74 0 106 46t32 117q0 72 -35 122.5t-109 50.5q-76 0 -104.5 -47t-28.5 -117z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1087" d="M98 125l297 362v11l-297 362h230l274 -360v-11l-272 -364h-232zM496 125l297 362v11l-297 362h229l274 -360v-11l-272 -364h-231z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1583" d="M70 1206l297 156v-750h-154v545l-117 -57zM180 -49l948 1464h185l-948 -1464h-185zM922 186v127l301 437h211v-437h69v-127h-69v-186h-140v186h-372zM1069 313h225v316z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1595" d="M70 1206l297 156v-750h-154v545l-117 -57zM184 -49l949 1464h184l-948 -1464h-185zM987 0v127q49 55 113.5 105.5t121 98.5t95.5 97t39 107q0 12 -3 28.5t-12.5 30.5t-27 23.5t-43.5 9.5q-53 0 -112.5 -36t-104.5 -93l-35 131q66 59 131 90t137 31q104 0 160.5 -55.5 t56.5 -141.5q0 -59 -26.5 -112.5t-72.5 -104.5t-106.5 -102.5t-128.5 -106.5h334v-127h-516z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1585" d="M74 680l24 123q43 -35 80 -56.5t98 -21.5q78 0 114 34t36 93q0 53 -36 83t-136 30h-25v110h31q66 0 97.5 25.5t31.5 70.5q0 29 -16.5 48.5t-67.5 19.5q-53 0 -93 -18.5t-67 -40.5l-22 120q47 29 88 45.5t98 16.5q104 0 162.5 -51t58.5 -131q0 -55 -26.5 -91t-69.5 -63 q63 -23 99 -67t36 -117q0 -47 -16 -90t-51 -77t-89.5 -53.5t-127.5 -19.5q-76 0 -120 20.5t-91 57.5zM225 -49l949 1464h184l-948 -1464h-185zM926 186v127l301 437h211v-437h69v-127h-69v-186h-140v186h-372zM1073 313h225v316z" /> +<glyph unicode="&#xbf;" horiz-adv-x="821" d="M88 -131q0 92 40 166t88 150.5t89 170t41 224.5h213q0 -139 -39 -237.5t-85 -173.5t-85 -139.5t-39 -135.5q0 -82 49.5 -115t110.5 -33q66 0 129.5 28.5t99.5 73.5l54 -196q-57 -43 -142.5 -75t-177.5 -32q-76 0 -139.5 24.5t-109.5 68t-71.5 102.5t-25.5 129zM299 831 q0 59 46 101.5t106 42.5q59 0 101 -43t42 -103q0 -57 -43 -99t-102 -42t-104.5 42t-45.5 101z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1286" d="M4 2l524 1352h203l578 -1352h-256l-154 393h-510l-139 -393h-246zM420 1630q0 35 16.5 71t44.5 36q8 0 21 -6l368 -207l7 -15l-31 -73l-17 -6l-383 141q-14 4 -20 20t-6 39zM455 580h370l-194 497z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1286" d="M4 0l524 1352h203l578 -1352h-256l-154 393h-510l-139 -393h-246zM414 1511l6 15l368 207q12 6 21 6q29 0 45 -36t16 -71q0 -23 -6 -39t-20 -20l-383 -141l-17 6zM455 578h370l-194 497z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1286" d="M4 0l524 1352h203l578 -1352h-256l-154 393h-510l-139 -393h-246zM414 1507l6 15l225 202h17l225 -202l6 -15l-33 -59l-14 -6l-193 84l-192 -84l-15 6zM455 578h370l-194 497z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1286" d="M4 0l524 1352h203l578 -1352h-256l-154 393h-510l-139 -393h-246zM332 1511q12 37 25.5 71t36 59.5t55 41t83.5 15.5q59 0 130 -14.5t126 -14.5q37 0 76 11.5t80 41.5l25 -47q-6 -33 -19.5 -66.5t-35 -60t-53.5 -44t-77 -17.5q-25 0 -56.5 4t-68 10t-74.5 10.5t-73 4.5 q-47 0 -86 -11.5t-68 -40.5zM455 578h370l-194 497z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1286" d="M4 0l524 1352h203l578 -1352h-256l-154 393h-510l-139 -393h-246zM393 1604q0 47 35 83.5t82 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-82 35t-35 82zM455 578h370l-194 497zM672 1604q0 47 34.5 83.5t81.5 36.5t84 -36.5t37 -83.5t-36.5 -82t-84.5 -35q-47 0 -81.5 35 t-34.5 82z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1300" d="M4 0l518 1300q-39 23 -61.5 61t-22.5 83q0 72 54.5 125t144.5 53t143.5 -55.5t53.5 -126.5q0 -45 -23 -81t-57 -59l571 -1300h-264l-154 414h-510l-139 -414h-254zM463 598h371l-195 477zM559 1446q0 -35 23.5 -60.5t56.5 -25.5q31 0 51.5 24.5t20.5 55.5 q0 33 -21.5 56.5t-54.5 23.5q-35 0 -55.5 -21.5t-20.5 -52.5z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1550" d="M-29 0l721 1352h735v-209h-413v-322h276v-209h-276v-403h454v-209h-677v389h-363l-207 -389h-250zM537 594h254v479z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1288" d="M104 662q0 145 43 272t128 222t211 150.5t294 55.5q111 0 221.5 -23.5t190.5 -64.5l-59 -213q-66 45 -157 72.5t-208 27.5q-111 0 -189.5 -34.5t-128 -98t-73 -153t-23.5 -197.5q0 -248 105.5 -375t304.5 -127q123 0 224.5 37t166.5 90l62 -203q-78 -47 -183.5 -82.5 t-236.5 -40.5l-37 -61q31 8 59 8q72 0 117 -48t45 -120q0 -41 -19.5 -76.5t-53.5 -64.5t-81 -45t-102 -16q-53 0 -103.5 11t-91.5 27l-2 13l58 98h14q23 -10 58.5 -17.5t70.5 -7.5t62.5 13.5t27.5 48.5q0 37 -25.5 50t-60.5 13q-25 0 -50.5 -4t-47.5 -10l-39 53l90 138 q-150 12 -259.5 70.5t-181 150.5t-106.5 211t-35 250z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1083" d="M180 0v1352h783v-205h-547v-328h409v-205h-409v-409h588v-205h-824zM356 1630q0 35 16.5 71t45.5 36q8 0 20 -6l369 -207l6 -15l-31 -73l-16 -6l-383 141q-14 4 -20.5 20t-6.5 39z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1083" d="M180 0v1352h783v-205h-547v-328h409v-205h-409v-409h588v-205h-824zM381 1509l6 15l369 207q12 6 20 6q29 0 45.5 -36t16.5 -71q0 -23 -6.5 -39t-20.5 -20l-383 -141l-16 6z" /> +<glyph unicode="&#xca;" horiz-adv-x="1083" d="M180 0v1352h783v-205h-547v-328h409v-205h-409v-409h588v-205h-824zM367 1507l6 15l225 202h16l226 -202l6 -15l-33 -59l-14 -6l-193 84l-192 -84l-15 6z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1083" d="M180 0v1352h783v-205h-547v-328h409v-205h-409v-409h588v-205h-824zM330 1606q0 47 34.5 83.5t81.5 36.5t84 -36.5t37 -83.5t-36.5 -82t-84.5 -35q-47 0 -81.5 35t-34.5 82zM608 1606q0 47 35 83.5t82 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-82 35t-35 82z" /> +<glyph unicode="&#xcc;" horiz-adv-x="595" d="M45 1630q0 35 16.5 71t44.5 36q8 0 21 -6l369 -207l6 -15l-31 -73l-16 -6l-383 141q-14 4 -20.5 20t-6.5 39zM180 0v1352h236v-1352h-236z" /> +<glyph unicode="&#xcd;" horiz-adv-x="595" d="M94 1509l6 15l369 207q12 6 20 6q29 0 45.5 -36t16.5 -71q0 -23 -6 -39t-21 -20l-383 -141l-16 6zM180 0v1352h236v-1352h-236z" /> +<glyph unicode="&#xce;" horiz-adv-x="595" d="M53 1507l6 15l226 202h16l225 -202l6 -15l-32 -59l-15 -6l-192 84l-193 -84l-14 6zM180 0v1352h236v-1352h-236z" /> +<glyph unicode="&#xcf;" horiz-adv-x="595" d="M43 1604q0 47 35 83.5t82 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-82 35t-35 82zM180 0v1352h236v-1352h-236zM322 1604q0 47 34.5 83.5t81.5 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-81.5 35t-34.5 82z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1462" d="M41 637v151h152v564q27 2 84 4t120.5 3t122 2t90.5 1q199 0 327 -41t212 -113q109 -94 158 -239.5t49 -321.5q0 -133 -34 -255t-121 -214t-239.5 -146.5t-390.5 -54.5q-86 0 -184 6.5t-194 16.5v637h-152zM428 180q57 -4 110.5 -6t90.5 -2q248 0 361.5 119t113.5 387 q0 121 -23.5 212t-81 152.5t-153.5 92t-240 30.5h-77q-48 0 -101 -2v-375h303v-151h-303v-457z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1478" d="M180 0v1352h289l594 -994v994h235v-1352h-288l-594 991v-991h-236zM387 1511q12 37 25.5 71t36 59.5t55.5 41t84 15.5q59 0 129.5 -14.5t126.5 -14.5q37 0 75.5 11.5t79.5 41.5l25 -47q-6 -33 -19.5 -66.5t-35 -60t-53 -44t-76.5 -17.5q-25 0 -56.5 4t-68.5 10t-75 10.5 t-73 4.5q-47 0 -86 -11.5t-67 -40.5z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1519" d="M100 659q0 145 44 273.5t128 223.5t207 150.5t281 55.5q160 0 282.5 -55.5t206.5 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -284.5 55.5t-200.5 149.5t-120 218t-40 261zM352 680q0 -250 102.5 -377t295.5 -127q113 0 191.5 38 t129.5 104.5t74.5 156.5t23.5 193q0 111 -24.5 200.5t-75.5 155.5t-130 101.5t-185 35.5q-109 0 -185.5 -35.5t-125 -99t-70 -152t-21.5 -194.5zM471 1630q0 35 16.5 71t44.5 36q8 0 21 -6l369 -207l6 -15l-31 -73l-16 -6l-383 141q-14 4 -20.5 20t-6.5 39z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1519" d="M100 659q0 145 44 273.5t128 223.5t207 150.5t281 55.5q160 0 282.5 -55.5t206.5 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -284.5 55.5t-200.5 149.5t-120 218t-40 261zM352 680q0 -250 102.5 -377t295.5 -127q113 0 191.5 38 t129.5 104.5t74.5 156.5t23.5 193q0 111 -24.5 200.5t-75.5 155.5t-130 101.5t-185 35.5q-109 0 -185.5 -35.5t-125 -99t-70 -152t-21.5 -194.5zM610 1509l6 15l369 207q12 6 21 6q29 0 45 -36t16 -71q0 -23 -6 -39t-21 -20l-383 -141l-16 6z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1519" d="M100 659q0 145 44 273.5t128 223.5t207 150.5t281 55.5q160 0 282.5 -55.5t206.5 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -284.5 55.5t-200.5 149.5t-120 218t-40 261zM352 680q0 -250 102.5 -377t295.5 -127q113 0 191.5 38 t129.5 104.5t74.5 156.5t23.5 193q0 111 -24.5 200.5t-75.5 155.5t-130 101.5t-185 35.5q-109 0 -185.5 -35.5t-125 -99t-70 -152t-21.5 -194.5zM541 1507l6 15l225 202h16l226 -202l6 -15l-33 -59l-14 -6l-193 84l-192 -84l-15 6z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1519" d="M100 659q0 145 44 273.5t128 223.5t207 150.5t281 55.5q160 0 282.5 -55.5t206.5 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -284.5 55.5t-200.5 149.5t-120 218t-40 261zM352 680q0 -250 102.5 -377t295.5 -127q113 0 191.5 38 t129.5 104.5t74.5 156.5t23.5 193q0 111 -24.5 200.5t-75.5 155.5t-130 101.5t-185 35.5q-109 0 -185.5 -35.5t-125 -99t-70 -152t-21.5 -194.5zM442 1511q12 37 25.5 71t36 59.5t55.5 41t84 15.5q59 0 130 -14.5t126 -14.5q37 0 76 11.5t80 41.5l24 -47q-6 -33 -19 -66.5 t-34.5 -60t-53.5 -44t-77 -17.5q-25 0 -56.5 4t-68.5 10t-75 10.5t-72 4.5q-47 0 -86 -11.5t-68 -40.5z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1519" d="M100 659q0 145 44 273.5t128 223.5t207 150.5t281 55.5q160 0 282.5 -55.5t206.5 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -284.5 55.5t-200.5 149.5t-120 218t-40 261zM352 680q0 -250 102.5 -377t295.5 -127q113 0 191.5 38 t129.5 104.5t74.5 156.5t23.5 193q0 111 -24.5 200.5t-75.5 155.5t-130 101.5t-185 35.5q-109 0 -185.5 -35.5t-125 -99t-70 -152t-21.5 -194.5zM504 1604q0 47 34.5 83.5t82.5 36.5q47 0 83.5 -36.5t36.5 -83.5t-36.5 -82t-83.5 -35t-82 35t-35 82zM782 1604q0 47 35 83.5 t82 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-82 35t-35 82z" /> +<glyph unicode="&#xd7;" horiz-adv-x="933" d="M129 258l231 231l-231 230l107 106l231 -229l233 233l107 -106l-234 -234l234 -235l-105 -104l-235 233l-231 -231z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1521" d="M72 41l155 184q-63 90 -94 201t-31 233q0 145 44 273.5t128 223.5t207 150.5t281 55.5q104 0 192 -24.5t160 -67.5l137 162l166 -127l-147 -172q76 -94 113.5 -212t37.5 -247q0 -135 -42 -261t-127 -223.5t-211 -156t-293 -58.5q-113 0 -206 27t-165 76l-150 -176z M354 680q0 -156 39 -260l582 688q-90 53 -219 53q-109 0 -185.5 -35.5t-125 -99t-70 -152t-21.5 -194.5zM518 244q92 -68 234 -68q113 0 191.5 38t129.5 104.5t74.5 156.5t23.5 193q0 166 -55 282z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1443" d="M166 475v877h235v-828q0 -186 86 -267t240 -81t241 81t87 267v828h225v-877q0 -100 -33 -190t-101.5 -159t-176 -109t-254.5 -40t-252 40t-171.5 109t-96 159t-29.5 190zM467 1630q0 35 16.5 71t44.5 36q8 0 21 -6l369 -207l6 -15l-31 -73l-16 -6l-383 141 q-14 4 -20.5 20t-6.5 39z" /> +<glyph unicode="&#xda;" horiz-adv-x="1443" d="M166 475v877h235v-828q0 -186 86 -267t240 -81t241 81t87 267v828h225v-877q0 -100 -33 -190t-101.5 -159t-176 -109t-254.5 -40t-252 40t-171.5 109t-96 159t-29.5 190zM526 1509l6 15l369 207q12 6 21 6q29 0 45 -36t16 -71q0 -23 -6 -39t-21 -20l-383 -141l-16 6z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1443" d="M166 475v877h235v-828q0 -186 86 -267t240 -81t241 81t87 267v828h225v-877q0 -100 -33 -190t-101.5 -159t-176 -109t-254.5 -40t-252 40t-171.5 109t-96 159t-29.5 190zM475 1507l6 15l226 202h16l225 -202l6 -15l-32 -59l-15 -6l-192 84l-193 -84l-14 6z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1443" d="M166 475v877h235v-828q0 -186 86 -267t240 -81t241 81t87 267v828h225v-877q0 -100 -33 -190t-101.5 -159t-176 -109t-254.5 -40t-252 40t-171.5 109t-96 159t-29.5 190zM489 1604q0 47 35 83.5t82 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-82 35t-35 82zM768 1604 q0 47 35 83.5t82 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-82 35t-35 82z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1155" d="M-25 1352h265l346 -613l332 613h260l-482 -797v-555h-235v547zM432 1509l6 15l369 207q12 6 20 6q29 0 45.5 -36t16.5 -71q0 -23 -6 -39t-21 -20l-383 -141l-16 6z" /> +<glyph unicode="&#xde;" horiz-adv-x="1089" d="M180 0v1352h236v-226h90q115 0 209 -27.5t161.5 -82.5t104.5 -136t37 -188q0 -86 -28.5 -161.5t-86 -133t-146.5 -91.5t-208 -34h-69q-34 0 -64 2v-274h-236zM416 471q29 -2 60 -2h67q111 0 167 61.5t56 178.5q0 98 -50 159.5t-177 61.5h-64q-31 0 -59 -2v-457z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1132" d="M141 0v995q0 115 26 209t77 162t128 104.5t179 36.5q76 0 137.5 -23.5t104.5 -61.5t66.5 -88t23.5 -103q0 -70 -33 -128.5t-72 -110.5t-71.5 -100t-32.5 -93q0 -43 29.5 -75t74.5 -62.5t98.5 -63.5t98.5 -77t74.5 -101.5t29.5 -136.5q0 -92 -33.5 -157t-83 -104.5 t-106.5 -58t-106 -18.5q-74 0 -136.5 27.5t-103.5 62.5l59 215q35 -59 84 -98t111 -39q41 0 71.5 36.5t30.5 110.5q0 72 -28.5 121t-71.5 85t-94 65.5t-94 63.5t-72 78t-29 111q0 72 30 127.5t65.5 104.5t65.5 98t30 107q0 49 -32 84.5t-93 35.5q-66 0 -104 -28.5 t-59.5 -76.5t-27.5 -110.5t-6 -130.5v-995h-205z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1026" d="M70 248q0 84 35.5 150.5t103 112.5t162 70.5t211.5 24.5h88v31q0 80 -52 117q-53 37 -165 37q-152 0 -271 -68l-43 170q137 80 332 80q205 0 311 -84q49 -39 81 -100.5t32 -147.5v-641h-180l-17 129h-8q-55 -70 -150.5 -112t-193.5 -42q-129 0 -202.5 75t-73.5 198z M215 1288q0 35 16.5 71t44.5 36q8 0 21 -6l369 -207l6 -15l-31 -73l-16 -7l-383 142q-14 4 -20.5 20t-6.5 39zM309 281q0 -123 125 -123q66 0 131.5 31.5t104.5 84.5v187h-39q-168 0 -245 -43t-77 -137z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1026" d="M70 248q0 84 35.5 150.5t103 112.5t162 70.5t211.5 24.5h88v31q0 80 -52 117q-53 37 -165 37q-152 0 -271 -68l-43 170q137 80 332 80q205 0 311 -84q49 -39 81 -100.5t32 -147.5v-641h-180l-17 129h-8q-55 -70 -150.5 -112t-193.5 -42q-129 0 -202.5 75t-73.5 198z M309 281q0 -123 125 -123q66 0 131.5 31.5t104.5 84.5v187h-39q-168 0 -245 -43t-77 -137zM367 1169l6 15l368 207q12 6 21 6q29 0 45 -36t16 -71q0 -23 -6 -39t-20 -20l-383 -141l-17 6z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1026" d="M70 248q0 84 35.5 150.5t103 112.5t162 70.5t211.5 24.5h88v31q0 80 -52 117q-53 37 -165 37q-152 0 -271 -68l-43 170q137 80 332 80q205 0 311 -84q49 -39 81 -100.5t32 -147.5v-641h-180l-17 129h-8q-55 -70 -150.5 -112t-193.5 -42q-129 0 -202.5 75t-73.5 198z M256 1161l6 15l225 202h17l225 -202l6 -15l-33 -59l-14 -6l-192 84l-193 -84l-14 6zM309 281q0 -123 125 -123q66 0 131.5 31.5t104.5 84.5v187h-39q-168 0 -245 -43t-77 -137z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1026" d="M70 248q0 84 35.5 150.5t103 112.5t162 70.5t211.5 24.5h88v31q0 80 -52 117q-53 37 -165 37q-152 0 -271 -68l-43 170q137 80 332 80q205 0 311 -84q49 -39 81 -100.5t32 -147.5v-641h-180l-17 129h-8q-55 -70 -150.5 -112t-193.5 -42q-129 0 -202.5 75t-73.5 198z M193 1184q12 37 25 70.5t35.5 59t55.5 41t84 15.5q59 0 130 -14.5t126 -14.5q37 0 76 11.5t80 42.5l24 -47q-6 -33 -19 -67t-34.5 -60.5t-53.5 -44t-77 -17.5q-25 0 -56.5 4t-68.5 10.5t-74.5 10.5t-72.5 4q-47 0 -86 -11.5t-68 -39.5zM309 281q0 -123 125 -123 q66 0 131.5 31.5t104.5 84.5v187h-39q-168 0 -245 -43t-77 -137z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1026" d="M70 248q0 84 35.5 150.5t103 112.5t162 70.5t211.5 24.5h88v31q0 80 -52 117q-53 37 -165 37q-152 0 -271 -68l-43 170q137 80 332 80q205 0 311 -84q49 -39 81 -100.5t32 -147.5v-641h-180l-17 129h-8q-55 -70 -150.5 -112t-193.5 -42q-129 0 -202.5 75t-73.5 198z M258 1253q0 47 35 84t82 37t84 -37t37 -84t-37 -81.5t-84 -34.5t-82 34.5t-35 81.5zM309 281q0 -123 125 -123q66 0 131.5 31.5t104.5 84.5v187h-39q-168 0 -245 -43t-77 -137zM537 1253q0 47 34.5 84t81.5 37t84 -37t37 -84t-37 -81.5t-84 -34.5t-81.5 34.5t-34.5 81.5z " /> +<glyph unicode="&#xe5;" horiz-adv-x="1026" d="M70 248q0 84 35.5 150.5t103 112.5t162 70.5t211.5 24.5h88v31q0 80 -52 117q-53 37 -165 37q-152 0 -271 -68l-43 170q137 80 332 80q205 0 311 -84q49 -39 81 -100.5t32 -147.5v-641h-180l-17 129h-8q-55 -70 -150.5 -112t-193.5 -42q-129 0 -202.5 75t-73.5 198z M309 281q0 -123 125 -123q66 0 131.5 31.5t104.5 84.5v187h-39q-168 0 -245 -43t-77 -137zM336 1249q0 66 50 118t138 52q45 0 80 -15t59.5 -40t38 -55.5t13.5 -63.5q0 -61 -48.5 -112.5t-140.5 -51.5q-49 0 -84.5 15.5t-59.5 39t-35 53t-11 60.5zM453 1251 q0 -29 20.5 -54.5t52.5 -25.5q33 0 51.5 24t18.5 50q0 29 -19.5 56.5t-54.5 27.5t-52 -24.5t-17 -53.5z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1642" d="M70 248q0 117 55 187.5t135 108.5t169 50t155 12h86v19q0 55 -16.5 84.5t-47.5 50.5q-27 16 -56.5 23.5t-76.5 7.5q-90 0 -157.5 -18.5t-133.5 -49.5l-43 170q147 80 346 80q45 0 93.5 -6t94.5 -21.5t87 -41t71 -64.5q61 61 148.5 97t198.5 36q180 0 278 -91t98 -257 q0 -23 -3 -48.5t-8 -50t-12 -44t-15 -31.5h-596q4 -61 22.5 -115.5t53 -94.5t84.5 -63.5t118 -23.5q76 0 161 28.5t144 71.5l37 -168q-27 -16 -65.5 -35.5t-88 -36t-105.5 -28t-118 -11.5q-127 0 -220 48.5t-152 128.5q-86 -98 -200 -137.5t-237 -39.5q-72 0 -125 20.5 t-88 57.5t-53 87.5t-18 107.5zM309 266q0 -53 34 -80.5t91 -27.5q59 0 127 29.5t109 86.5v191h-15q-59 0 -120.5 -6t-111.5 -26.5t-82 -59.5t-32 -107zM938 610h391q2 10 2 19v18q0 74 -48 112t-112 38q-92 0 -150 -52.5t-83 -134.5z" /> +<glyph unicode="&#xe7;" horiz-adv-x="1003" d="M88 479q0 98 27.5 187.5t87 158t151.5 108.5t221 40q98 0 192.5 -22.5t152.5 -59.5l-50 -182q-23 16 -56.5 32.5t-72.5 28.5t-81 19.5t-78 7.5q-70 0 -118 -26t-78 -67.5t-43 -97t-13 -114.5q0 -70 16 -130.5t49 -105.5t83 -71.5t116 -26.5q74 0 157 29.5t138 82.5 l41 -192q-53 -35 -139 -64.5t-187 -36.5l-37 -61q31 8 60 8q72 0 116.5 -48t44.5 -120q0 -41 -19 -76.5t-53 -64.5t-81 -45t-103 -16q-53 0 -103 11t-91 27l-2 13l57 98h15q23 -10 58.5 -17.5t70.5 -7.5t62.5 13.5t27.5 48.5q0 37 -26 50t-60 13q-25 0 -50.5 -4t-48.5 -10 l-39 53l91 138q-102 12 -178 56t-127.5 110.5t-76 152.5t-24.5 180z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1034" d="M84 471q0 100 31.5 191.5t93 161t153 109.5t207.5 40q180 0 278.5 -91t98.5 -257q0 -23 -3 -48.5t-8 -50t-12.5 -44t-15.5 -31.5h-596q4 -61 22.5 -115.5t53.5 -94.5t85 -63.5t118 -23.5q76 0 161 28.5t144 71.5l37 -168q-27 -16 -66 -35.5t-88 -36t-105.5 -28 t-117.5 -11.5q-115 0 -203 40t-147.5 109t-90 159t-30.5 188zM266 1288q0 35 16.5 71t45.5 36q8 0 20 -6l369 -207l6 -15l-31 -73l-16 -7l-383 142q-14 4 -20.5 20t-6.5 39zM330 610h391q2 10 2 19v18q0 74 -48 112t-112 38q-92 0 -150 -52.5t-83 -134.5z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1034" d="M84 471q0 100 31.5 191.5t93 161t153 109.5t207.5 40q180 0 278.5 -91t98.5 -257q0 -23 -3 -48.5t-8 -50t-12.5 -44t-15.5 -31.5h-596q4 -61 22.5 -115.5t53.5 -94.5t85 -63.5t118 -23.5q76 0 161 28.5t144 71.5l37 -168q-27 -16 -66 -35.5t-88 -36t-105.5 -28 t-117.5 -11.5q-115 0 -203 40t-147.5 109t-90 159t-30.5 188zM330 610h391q2 10 2 19v18q0 74 -48 112t-112 38q-92 0 -150 -52.5t-83 -134.5zM379 1169l6 15l369 207q12 6 20 6q29 0 45.5 -37t16.5 -70q0 -23 -6.5 -39t-20.5 -20l-383 -141l-16 6z" /> +<glyph unicode="&#xea;" horiz-adv-x="1034" d="M84 471q0 100 31.5 191.5t93 161t153 109.5t207.5 40q180 0 278.5 -91t98.5 -257q0 -23 -3 -48.5t-8 -50t-12.5 -44t-15.5 -31.5h-596q4 -61 22.5 -115.5t53.5 -94.5t85 -63.5t118 -23.5q76 0 161 28.5t144 71.5l37 -168q-27 -16 -66 -35.5t-88 -36t-105.5 -28 t-117.5 -11.5q-115 0 -203 40t-147.5 109t-90 159t-30.5 188zM303 1161l6 15l226 202h16l225 -202l6 -15l-32 -59l-15 -6l-192 84l-193 -84l-14 6zM330 610h391q2 10 2 19v18q0 74 -48 112t-112 38q-92 0 -150 -52.5t-83 -134.5z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1034" d="M84 471q0 100 31.5 191.5t93 161t153 109.5t207.5 40q180 0 278.5 -91t98.5 -257q0 -23 -3 -48.5t-8 -50t-12.5 -44t-15.5 -31.5h-596q4 -61 22.5 -115.5t53.5 -94.5t85 -63.5t118 -23.5q76 0 161 28.5t144 71.5l37 -168q-27 -16 -66 -35.5t-88 -36t-105.5 -28 t-117.5 -11.5q-115 0 -203 40t-147.5 109t-90 159t-30.5 188zM283 1253q0 47 34.5 84t81.5 37t84 -37t37 -84t-37 -81.5t-84 -34.5t-81.5 34.5t-34.5 81.5zM330 610h391q2 10 2 19v18q0 74 -48 112t-112 38q-92 0 -150 -52.5t-83 -134.5zM561 1253q0 47 35 84t82 37t84 -37 t37 -84t-37 -81.5t-84 -34.5t-82 34.5t-35 81.5z" /> +<glyph unicode="&#xec;" horiz-adv-x="507" d="M-49 1288q0 35 16.5 71t44.5 36q8 0 21 -6l368 -207l7 -15l-31 -73l-17 -7l-383 142q-14 4 -20 20t-6 39zM141 0v942h226v-942h-226z" /> +<glyph unicode="&#xed;" horiz-adv-x="507" d="M49 1169l6 15l369 207q12 6 20 6q29 0 45.5 -36t16.5 -71q0 -23 -6 -39t-21 -20l-383 -141l-16 6zM141 0v942h226v-942h-226z" /> +<glyph unicode="&#xee;" horiz-adv-x="507" d="M8 1161l6 15l226 202h16l225 -202l6 -15l-32 -59l-15 -6l-192 84l-193 -84l-14 6zM141 0v942h226v-942h-226z" /> +<glyph unicode="&#xef;" horiz-adv-x="507" d="M-6 1253q0 47 34.5 84t82.5 37q47 0 83.5 -37t36.5 -84t-36.5 -81.5t-83.5 -34.5t-82 34.5t-35 81.5zM141 0v942h226v-942h-226zM272 1253q0 47 35 84t82 37t84 -37t37 -84t-37 -81.5t-84 -34.5t-82 34.5t-35 81.5z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1146" d="M86 475q0 100 28.5 190.5t86 159t141.5 108.5t193 40q104 0 173.5 -36t106.5 -97l6 2q-10 72 -44 156.5t-85 170.5l-237 -59l-43 133l198 51q-53 72 -113.5 129.5t-119.5 92.5h301q37 -35 72.5 -77t68.5 -89l252 67l43 -139l-217 -55q68 -129 110 -288t42 -341 q0 -125 -24 -236.5t-79 -196.5t-147 -135.5t-232 -50.5q-131 0 -222 43t-148.5 114t-84 161t-26.5 182zM328 481q0 -66 13 -126t43 -107t75 -75t106 -28q59 0 103.5 26t73 70t42 101t13.5 121q0 66 -14.5 126t-44 106t-75 74t-108.5 28q-59 0 -102 -26t-71 -69t-41 -100.5 t-13 -120.5z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1120" d="M141 0v942h176l11 -139h8q43 86 134 128t196 42q68 0 127 -17.5t105 -56.5t72.5 -102.5t26.5 -155.5v-641h-225v623q0 168 -143 168q-35 0 -75 -12.5t-77 -36t-66.5 -58.5t-43.5 -80v-604h-226zM233 1184q12 37 25.5 70.5t36 59t55.5 41t84 15.5q59 0 130 -14.5 t126 -14.5q37 0 76 11.5t80 42.5l24 -47q-6 -33 -19 -67t-34.5 -60.5t-53.5 -44t-77 -17.5q-25 0 -56.5 4t-68.5 10.5t-74.5 10.5t-72.5 4q-47 0 -86 -11.5t-68 -39.5z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1124" d="M86 475q0 100 28.5 190.5t87 159t148.5 108.5t211 40q125 0 215 -42t148.5 -112.5t86 -162t27.5 -191.5t-27.5 -189.5t-86 -156t-147.5 -105.5t-210 -39q-125 0 -215 41t-149.5 110t-88 159t-28.5 190zM264 1288q0 35 16.5 71t45.5 36q8 0 20 -6l369 -207l6 -15l-31 -73 l-16 -7l-383 142q-14 4 -20.5 20t-6.5 39zM328 481q0 -66 13 -126t43 -107t75 -75t106 -28q59 0 103.5 26t73 70t42 101t13.5 121q0 66 -14.5 126t-44 106t-75 74t-108.5 28q-59 0 -102 -26t-71 -69t-41 -100.5t-13 -120.5z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1124" d="M86 475q0 100 28.5 190.5t87 159t148.5 108.5t211 40q125 0 215 -42t148.5 -112.5t86 -162t27.5 -191.5t-27.5 -189.5t-86 -156t-147.5 -105.5t-210 -39q-125 0 -215 41t-149.5 110t-88 159t-28.5 190zM328 481q0 -66 13 -126t43 -107t75 -75t106 -28q59 0 103.5 26 t73 70t42 101t13.5 121q0 66 -14.5 126t-44 106t-75 74t-108.5 28q-59 0 -102 -26t-71 -69t-41 -100.5t-13 -120.5zM393 1169l6 15l369 207q12 6 20 6q29 0 45.5 -36t16.5 -71q0 -23 -6 -39t-21 -20l-383 -141l-16 6z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1124" d="M86 475q0 100 28.5 190.5t87 159t148.5 108.5t211 40q125 0 215 -42t148.5 -112.5t86 -162t27.5 -191.5t-27.5 -189.5t-86 -156t-147.5 -105.5t-210 -39q-125 0 -215 41t-149.5 110t-88 159t-28.5 190zM328 481q0 -66 13 -126t43 -107t75 -75t106 -28q59 0 103.5 26 t73 70t42 101t13.5 121q0 66 -14.5 126t-44 106t-75 74t-108.5 28q-59 0 -102 -26t-71 -69t-41 -100.5t-13 -120.5zM340 1161l6 15l225 202h17l225 -202l6 -15l-33 -59l-14 -6l-192 84l-193 -84l-14 6z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1124" d="M86 475q0 100 28.5 190.5t87 159t148.5 108.5t211 40q125 0 215 -42t148.5 -112.5t86 -162t27.5 -191.5t-27.5 -189.5t-86 -156t-147.5 -105.5t-210 -39q-125 0 -215 41t-149.5 110t-88 159t-28.5 190zM223 1184q12 37 25.5 70.5t36 59t55.5 41t84 15.5q59 0 130 -14.5 t126 -14.5q37 0 76 11.5t80 42.5l24 -47q-6 -33 -19.5 -67t-35 -60.5t-53 -44t-76.5 -17.5q-25 0 -56.5 4t-68.5 10.5t-75 10.5t-73 4q-47 0 -85.5 -11.5t-67.5 -39.5zM328 481q0 -66 13 -126t43 -107t75 -75t106 -28q59 0 103.5 26t73 70t42 101t13.5 121q0 66 -14.5 126 t-44 106t-75 74t-108.5 28q-59 0 -102 -26t-71 -69t-41 -100.5t-13 -120.5z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1124" d="M86 475q0 100 28.5 190.5t87 159t148.5 108.5t211 40q125 0 215 -42t148.5 -112.5t86 -162t27.5 -191.5t-27.5 -189.5t-86 -156t-147.5 -105.5t-210 -39q-125 0 -215 41t-149.5 110t-88 159t-28.5 190zM307 1253q0 47 35 84t82 37t84 -37t37 -84t-37 -81.5t-84 -34.5 t-82 34.5t-35 81.5zM328 481q0 -66 13 -126t43 -107t75 -75t106 -28q59 0 103.5 26t73 70t42 101t13.5 121q0 66 -14.5 126t-44 106t-75 74t-108.5 28q-59 0 -102 -26t-71 -69t-41 -100.5t-13 -120.5zM586 1253q0 47 34.5 84t81.5 37t84 -37t37 -84t-36.5 -81.5t-84.5 -34.5 q-47 0 -81.5 34.5t-34.5 81.5z" /> +<glyph unicode="&#xf7;" horiz-adv-x="1050" d="M102 406v167h848v-167h-848zM401 131q0 29 11.5 55.5t32 48t46 34t56.5 12.5q29 0 55.5 -12.5t48 -34t33.5 -48t12 -55.5q0 -31 -12 -56.5t-33.5 -46t-48.5 -31.5t-55 -11q-59 0 -102.5 43t-43.5 102zM401 844q0 29 11.5 55.5t32 48t46 33.5t56.5 12q29 0 55.5 -12 t48 -33.5t33.5 -48.5t12 -55q0 -31 -12 -56.5t-33.5 -46t-48.5 -32t-55 -11.5q-59 0 -102.5 43.5t-43.5 102.5z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1126" d="M66 25l112 129q-47 66 -69.5 147.5t-22.5 173.5q0 100 28.5 190.5t87 159t148.5 108.5t211 40q84 0 151.5 -19.5t121.5 -54.5l104 119l121 -90l-117 -133q49 -70 72.5 -154t23.5 -176q0 -100 -27.5 -189.5t-86 -156t-147.5 -105.5t-210 -39q-86 0 -154.5 19.5 t-121.5 54.5l-111 -127zM328 481q0 -88 20 -155l361 407q-29 29 -68 46.5t-86 17.5q-59 0 -102 -26t-71 -69t-41 -100.5t-13 -120.5zM412 211q59 -66 153 -66q59 0 103.5 26t73 70t42 101t13.5 121q0 86 -25 160z" /> +<glyph unicode="&#xf9;" d="M133 301v641h225v-612q0 -84 44 -128t114 -44q72 0 131.5 48t87.5 138v598h228v-942h-177l-12 131h-8q-23 -47 -57.5 -76.5t-76.5 -47t-87 -25t-88 -7.5q-68 0 -126.5 16.5t-102.5 54.5t-69.5 100.5t-25.5 154.5zM252 1288q0 35 16.5 71t44.5 36q8 0 21 -6l368 -207 l7 -15l-31 -73l-16 -7l-383 142q-14 4 -20.5 20t-6.5 39z" /> +<glyph unicode="&#xfa;" d="M133 301v641h225v-612q0 -84 44 -128t114 -44q72 0 131.5 48t87.5 138v598h228v-942h-177l-12 131h-8q-23 -47 -57.5 -76.5t-76.5 -47t-87 -25t-88 -7.5q-68 0 -126.5 16.5t-102.5 54.5t-69.5 100.5t-25.5 154.5zM328 1169l6 15l368 207q12 6 21 6q29 0 45 -36t16 -71 q0 -23 -6 -39t-20 -20l-383 -141l-17 6z" /> +<glyph unicode="&#xfb;" d="M133 301v641h225v-612q0 -84 44 -128t114 -44q72 0 131.5 48t87.5 138v598h228v-942h-177l-12 131h-8q-23 -47 -57.5 -76.5t-76.5 -47t-87 -25t-88 -7.5q-68 0 -126.5 16.5t-102.5 54.5t-69.5 100.5t-25.5 154.5zM299 1161l6 15l225 202h17l225 -202l6 -15l-33 -59 l-14 -6l-192 84l-193 -84l-14 6z" /> +<glyph unicode="&#xfc;" d="M133 301v641h225v-612q0 -84 44 -128t114 -44q72 0 131.5 48t87.5 138v598h228v-942h-177l-12 131h-8q-23 -47 -57.5 -76.5t-76.5 -47t-87 -25t-88 -7.5q-68 0 -126.5 16.5t-102.5 54.5t-69.5 100.5t-25.5 154.5zM281 1253q0 47 34.5 84t81.5 37t84 -37t37 -84t-37 -81.5 t-84 -34.5t-81.5 34.5t-34.5 81.5zM559 1253q0 47 35 84t82 37t84 -37t37 -84t-37 -81.5t-84 -34.5t-82 34.5t-35 81.5z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1062" d="M-14 942h235l328 -670l262 670h217l-389 -950q-29 -72 -79 -161t-118.5 -168t-154.5 -133t-187 -54q-16 0 -24 1t-19 5l-39 176q6 -2 14.5 -4t35.5 -2q39 0 76.5 8t76.5 33q74 47 128 131t106 207zM383 1169l6 15l369 207q12 6 20 6q29 0 45.5 -36t16.5 -71 q0 -23 -6.5 -39t-20.5 -20l-383 -141l-16 6z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1177" d="M141 -532v2048h217v-682h9q25 29 59.5 54t74.5 43.5t83 30t82 11.5q111 0 190.5 -42t131.5 -111.5t77 -161t25 -189.5q0 -100 -26 -190.5t-79 -158t-133 -106.5t-190 -39q-92 0 -171 27t-126 86v-620h-224zM365 268q61 -76 125.5 -95t117.5 -19q68 0 116 24.5t80 66.5 t47 98t15 122q0 61 -13 121.5t-43 107.5t-75 77t-106 30q-31 0 -68 -9.5t-72.5 -26.5t-68.5 -42t-55 -55v-400z" /> +<glyph unicode="&#xff;" horiz-adv-x="1062" d="M-14 942h235l328 -670l262 670h217l-389 -950q-29 -72 -79 -161t-118.5 -168t-154.5 -133t-187 -54q-16 0 -24 1t-19 5l-39 176q6 -2 14.5 -4t35.5 -2q39 0 76.5 8t76.5 33q74 47 128 131t106 207zM250 1253q0 47 34.5 84t82.5 37q47 0 83.5 -37t36.5 -84t-36.5 -81.5 t-83.5 -34.5t-82 34.5t-35 81.5zM528 1253q0 47 35 84t82 37t84 -37t37 -84t-37 -81.5t-84 -34.5t-82 34.5t-35 81.5z" /> +<glyph unicode="&#x152;" horiz-adv-x="1730" d="M100 659q0 145 44 273.5t128 223.5t207 150.5t281 55.5q39 0 75.5 -3t71.5 -7h703v-205h-508v-328h371v-205h-371v-409h549v-205h-709q-90 -25 -197 -25q-164 0 -284.5 55.5t-200.5 149.5t-120 218t-40 261zM352 680q0 -252 102.5 -380t295.5 -128q63 0 116 18v957 q-53 18 -112 18q-109 0 -185.5 -35.5t-125 -100t-70 -154t-21.5 -195.5z" /> +<glyph unicode="&#x153;" horiz-adv-x="1728" d="M86 475q0 100 28.5 190.5t87 159t148.5 108.5t211 40q119 0 208 -43t142 -137q121 180 353 180q180 0 278 -91t98 -257q0 -23 -3 -48.5t-8 -50t-12 -44t-15 -31.5h-596q4 -61 22.5 -115.5t53 -94.5t85 -63.5t117.5 -23.5q76 0 161 28.5t144 71.5l37 -168 q-27 -16 -65.5 -35.5t-88 -36t-105.5 -28t-118 -11.5q-109 0 -195.5 41t-140.5 131q-53 -94 -141 -133t-205 -39q-125 0 -215 41t-149.5 110t-88 159t-28.5 190zM328 481q0 -66 13 -126t43 -107t75 -75t106 -28q59 0 103.5 26t73 70t42 101t13.5 121q0 66 -14.5 126t-44 106 t-75 74t-108.5 28q-59 0 -102 -26t-71 -69t-41 -100.5t-13 -120.5zM1024 610h391q2 10 2 19v18q0 74 -48 112t-112 38q-92 0 -150 -52.5t-83 -134.5z" /> +<glyph unicode="&#x178;" horiz-adv-x="1155" d="M-25 1352h265l346 -613l332 613h260l-482 -797v-555h-235v547zM328 1604q0 47 34.5 83.5t81.5 36.5t84 -36.5t37 -83.5t-36.5 -82t-84.5 -35q-47 0 -81.5 35t-34.5 82zM606 1604q0 47 35 83.5t82 36.5t84 -36.5t37 -83.5t-37 -82t-84 -35t-82 35t-35 82z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="479" d="M0 1161l6 15l225 202h17l225 -202l6 -15l-33 -59l-14 -6l-192 84l-193 -84l-14 6z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="636" d="M0 1163q12 37 26.5 71t36 59.5t54.5 41t84 15.5q59 0 129.5 -14.5t126.5 -14.5q37 0 75.5 11t79.5 42l25 -47q-6 -33 -19.5 -66.5t-35 -60t-53 -44t-76.5 -17.5q-25 0 -56.5 4t-68.5 10t-75 10t-73 4q-47 0 -86 -11t-67 -40z" /> +<glyph unicode="&#x2000;" horiz-adv-x="868" /> +<glyph unicode="&#x2001;" horiz-adv-x="1738" /> +<glyph unicode="&#x2002;" horiz-adv-x="868" /> +<glyph unicode="&#x2003;" horiz-adv-x="1738" /> +<glyph unicode="&#x2004;" horiz-adv-x="579" /> +<glyph unicode="&#x2005;" horiz-adv-x="434" /> +<glyph unicode="&#x2006;" horiz-adv-x="288" /> +<glyph unicode="&#x2007;" horiz-adv-x="288" /> +<glyph unicode="&#x2008;" horiz-adv-x="217" /> +<glyph unicode="&#x2009;" horiz-adv-x="346" /> +<glyph unicode="&#x200a;" horiz-adv-x="96" /> +<glyph unicode="&#x2010;" horiz-adv-x="958" d="M133 406v167h692v-167h-692z" /> +<glyph unicode="&#x2011;" horiz-adv-x="958" d="M133 406v167h692v-167h-692z" /> +<glyph unicode="&#x2012;" horiz-adv-x="958" d="M133 406v167h692v-167h-692z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1114" d="M133 406v167h848v-167h-848z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1581" d="M133 406v167h1315v-167h-1315z" /> +<glyph unicode="&#x2018;" horiz-adv-x="516" d="M135 942v311l211 252l74 -51l-92 -231h51v-281h-244z" /> +<glyph unicode="&#x2019;" horiz-adv-x="477" d="M106 993l93 232h-52v280h244v-311l-211 -252z" /> +<glyph unicode="&#x201a;" horiz-adv-x="534" d="M104 -242l93 232h-52v280h244v-311l-211 -252z" /> +<glyph unicode="&#x201c;" horiz-adv-x="841" d="M135 942v311l211 252l74 -51l-92 -231h51v-281h-244zM461 942v311l211 252l73 -51l-92 -231h52v-281h-244z" /> +<glyph unicode="&#x201d;" horiz-adv-x="802" d="M106 993l93 232h-52v280h244v-311l-211 -252zM432 993l92 232h-51v280h244v-311l-211 -252z" /> +<glyph unicode="&#x201e;" horiz-adv-x="860" d="M104 -242l93 232h-52v280h244v-311l-211 -252zM430 -242l92 232h-51v280h244v-311l-211 -252z" /> +<glyph unicode="&#x2022;" horiz-adv-x="659" d="M182 498q0 29 11.5 55.5t32 48t46 33.5t56.5 12q29 0 55.5 -12t48 -33.5t33.5 -48.5t12 -55q0 -31 -12 -56.5t-33.5 -46t-48.5 -32t-55 -11.5q-59 0 -102.5 43.5t-43.5 102.5z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1298" d="M115 121q0 29 11 55.5t31.5 48t46 33.5t56.5 12q29 0 55.5 -12t48 -33.5t34 -48t12.5 -55.5q0 -31 -12.5 -56.5t-34 -46t-48 -32t-55.5 -11.5q-59 0 -102 43.5t-43 102.5zM504 121q0 29 11 55.5t31.5 48t46 33.5t56.5 12q29 0 55.5 -12t48 -33.5t34 -48t12.5 -55.5 q0 -31 -12.5 -56.5t-34 -46t-48 -32t-55.5 -11.5q-59 0 -102 43.5t-43 102.5zM891 121q0 29 11 55.5t31.5 48t46.5 33.5t56 12q29 0 55.5 -12t48 -33.5t34 -48t12.5 -55.5q0 -31 -12.5 -56.5t-34 -46t-48 -32t-55.5 -11.5q-59 0 -102 43.5t-43 102.5z" /> +<glyph unicode="&#x202f;" horiz-adv-x="346" /> +<glyph unicode="&#x2039;" horiz-adv-x="690" d="M88 489v11l274 360h230l-297 -362v-11l297 -362h-232z" /> +<glyph unicode="&#x203a;" horiz-adv-x="690" d="M98 125l297 362v11l-297 362h230l274 -360v-11l-272 -364h-232z" /> +<glyph unicode="&#x205f;" horiz-adv-x="434" /> +<glyph unicode="&#x20ac;" horiz-adv-x="1261" d="M86 461v168h156v33v37q0 19 2 38h-158v168h184q25 100 71 184.5t113.5 144.5t155.5 94t197 34q92 0 188.5 -23.5t161.5 -64.5l-65 -227q-51 49 -125 81.5t-170 32.5q-123 0 -189.5 -68.5t-95.5 -187.5h432v-168h-452v-108h452v-168h-434q59 -285 274 -285q104 0 193.5 37 t142.5 94l62 -207q-72 -49 -171.5 -87t-226.5 -38q-113 0 -200.5 37t-153 102.5t-107.5 153.5t-63 193h-174z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1458" d="M133 1206v131h442v-131h-151v-450h-139v450h-152zM643 756v581h184l146 -411l143 411h182v-581h-139v336l-123 -336h-133l-121 338v-338h-139z" /> +<glyph unicode="&#xe000;" horiz-adv-x="940" d="M0 940h940v-940h-940v940z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1075" d="M70 805v117l116 18q0 117 7.5 199t19.5 138t27.5 91t31.5 57q41 53 107.5 77t146.5 24q25 0 61 -3t79 -14.5t92 -32t98 -53.5l-92 -166q-55 35 -114.5 71t-139.5 36q-27 0 -45.5 -12.5t-30.5 -45t-17 -88t-5 -141.5v-135h180v-137h-180v-805h-226v805h-116zM711 0v942 h225v-942h-225z" /> +<glyph unicode="&#xfb02;" horiz-adv-x="1097" d="M70 805v117l116 18q0 117 7.5 199t19.5 138t27.5 91t31.5 57q41 53 107.5 77t146.5 24q47 0 139.5 -12.5t190.5 -47.5l88 50v-1516h-225v1319q-47 16 -97.5 30.5t-111.5 14.5q-27 0 -45.5 -12.5t-30.5 -45t-17 -88t-5 -141.5v-135h180v-137h-180v-805h-226v805h-116z" /> +<glyph unicode="&#xfb03;" horiz-adv-x="1777" d="M1379 1245q0 29 11 55.5t31.5 48t46 34t56.5 12.5q29 0 55.5 -12.5t48 -34t33.5 -48t12 -55.5q0 -31 -12 -56.5t-33.5 -46t-48 -31.5t-55.5 -11q-59 0 -102 43t-43 102zM1411 0v942h226v-942h-226zM705 805v117l116 18q0 117 7.5 199t19.5 138t27.5 91t31.5 57 q41 53 107.5 77t146.5 24q10 0 33 -1t50.5 -5t57 -13.5t54.5 -23.5l-51 -174q-20 12 -67.5 33.5t-92.5 21.5q-27 0 -45.5 -12.5t-30.5 -45t-17 -88t-5 -141.5v-135h180v-137h-180v-805h-226v805h-116zM70 805v117l116 18q0 117 7.5 199t19.5 138t27.5 91t31.5 57 q41 53 107.5 77t146.5 24q10 0 33 -1t50.5 -5t57 -13.5t54.5 -23.5l-51 -174q-20 12 -67.5 33.5t-92.5 21.5q-27 0 -45.5 -12.5t-30.5 -45t-17 -88t-5 -141.5v-135h180v-137h-180v-805h-226v805h-116z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="1802" d="M1424 0v1516h225v-1516h-225zM705 805v117l116 18q0 117 7.5 199t19.5 138t27.5 91t31.5 57q41 53 107.5 77t146.5 24q10 0 33 -1t50.5 -5t57 -13.5t54.5 -23.5l-51 -174q-20 12 -67.5 33.5t-92.5 21.5q-27 0 -45.5 -12.5t-30.5 -45t-17 -88t-5 -141.5v-135h180v-137 h-180v-805h-226v805h-116zM70 805v117l116 18q0 117 7.5 199t19.5 138t27.5 91t31.5 57q41 53 107.5 77t146.5 24q10 0 33 -1t50.5 -5t57 -13.5t54.5 -23.5l-51 -174q-20 12 -67.5 33.5t-92.5 21.5q-27 0 -45.5 -12.5t-30.5 -45t-17 -88t-5 -141.5v-135h180v-137h-180v-805 h-226v805h-116z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.ttf new file mode 100644 index 000000000000..7389c879ddca Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.woff new file mode 100644 index 000000000000..fc14168b0af5 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bold-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.eot new file mode 100644 index 000000000000..7c1aa7aac024 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.svg new file mode 100644 index 000000000000..9070a8b3ae03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.svg @@ -0,0 +1,248 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Pablo Impallari wwwimpallaricomimpallarigmailcomCopyright c 2011 Igino Marini wwwikerncommailiginomarinicomCopyright c 2011 Brenda Gallo gbrenda1987gmailcomwith Reserved Font Name Quattrocento Sans +Designer : Pablo Impallari +Foundry : Pablo Impallari Igino Marini Brenda Gallo +Foundry URL : wwwimpallaricom +</metadata> +<defs> +<font id="QuattrocentoSansBoldItalic" horiz-adv-x="1179" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="501" /> +<glyph unicode=" " horiz-adv-x="501" /> +<glyph unicode="&#x09;" horiz-adv-x="501" /> +<glyph unicode="&#xa0;" horiz-adv-x="501" /> +<glyph unicode="!" horiz-adv-x="555" d="M33 96q0 33 15 62.5t40 53.5t56.5 37t66.5 13q53 0 88 -36t35 -85q0 -33 -17.5 -62.5t-44 -53t-59.5 -37t-66 -13.5q-51 0 -82.5 36t-31.5 85zM147 369l170 1028h281l-272 -1028h-179z" /> +<glyph unicode="&#x22;" horiz-adv-x="768" d="M246 1057l51 442h248l-144 -442h-155zM567 1057l51 442h248l-143 -442h-156z" /> +<glyph unicode="#" horiz-adv-x="1269" d="M49 424l72 170h198l78 182h-209l68 168h213l168 395h213l-168 -395h176l168 395h213l-168 -395h207l-68 -168h-211l-77 -182h221l-72 -170h-221l-180 -424h-213l180 424h-176l-180 -424h-213l180 424h-199zM532 594h177l77 182h-176z" /> +<glyph unicode="$" horiz-adv-x="1073" d="M-20 88l104 211q53 -51 127 -85t172 -42l92 428q-47 16 -95 41t-88 61.5t-65.5 91t-25.5 132.5q0 111 33.5 188.5t93 129.5t138.5 80t171 34l37 178h164l-39 -180q84 -8 154.5 -27.5t119.5 -44.5l-100 -217q-43 33 -100.5 56.5t-116.5 33.5l-76 -354q53 -23 104.5 -52.5 t91 -70.5t63.5 -96.5t24 -130.5q0 -115 -38 -198t-100.5 -140.5t-145.5 -89t-173 -41.5l-37 -181h-164l37 174q-115 6 -207 38t-155 73zM428 997q0 -47 27.5 -77.5t74.5 -55.5l64 297q-74 -12 -120 -52t-46 -112zM549 184q90 23 133 75t43 120q0 53 -29.5 92t-70.5 64z" /> +<glyph unicode="%" horiz-adv-x="1726" d="M156 887q0 94 31.5 180t87 151.5t131 104.5t165.5 39q63 0 110.5 -23.5t79.5 -63.5t47 -93.5t15 -112.5q0 -86 -30.5 -170t-87 -149.5t-134 -106.5t-170.5 -41q-63 0 -109 22.5t-77 60.5t-45 90.5t-14 111.5zM166 -49l1259 1464h185l-1260 -1464h-184zM332 893 q0 -158 100 -158q55 0 96 31t68 79t40 106.5t13 113.5q0 72 -26.5 118t-83.5 46q-66 0 -106 -38t-62.5 -91t-30.5 -110.5t-8 -96.5zM954 274q0 94 32 180.5t87 152t131 104.5t166 39q63 0 110.5 -24t79 -63.5t47 -93t15.5 -112.5q0 -86 -30.5 -170t-87 -149.5t-134.5 -106.5 t-170 -41q-63 0 -109.5 22.5t-77 60.5t-45 90t-14.5 111zM1130 281q0 -158 101 -158q55 0 96 30.5t67.5 79t40 106.5t13.5 114q0 72 -26.5 117.5t-84.5 45.5q-66 0 -105.5 -37.5t-62 -91t-31 -110.5t-8.5 -96z" /> +<glyph unicode="&#x26;" horiz-adv-x="1435" d="M57 299q0 61 24.5 129t72 129t116 114.5t154.5 88.5q-70 109 -70 229q0 90 32 160t84 117t119.5 71.5t141.5 24.5q70 0 141.5 -23.5t133.5 -66.5l-101 -197q-14 16 -37.5 33.5t-50 31t-55.5 22.5t-55 9q-59 0 -104.5 -43t-45.5 -122q0 -53 24.5 -98.5t59.5 -92.5 l279 -369q18 51 18 111q0 35 -8 74t-25 78l-102 -7l28 127l609 76l-33 -157l-299 -23q25 -78 25 -162q0 -152 -89 -282l213 -281h-256l-98 127q-88 -70 -201.5 -111t-248.5 -41q-100 0 -175 27t-124.5 72t-73 103.5t-23.5 121.5zM303 344q0 -86 58.5 -129t150.5 -43 q84 0 154.5 25.5t128.5 72.5l-275 359q-49 -12 -90 -41t-68.5 -69t-43 -86t-15.5 -89z" /> +<glyph unicode="'" horiz-adv-x="446" d="M246 1057l51 442h248l-144 -442h-155z" /> +<glyph unicode="(" horiz-adv-x="667" d="M84 467q0 162 45 314.5t128 292.5t199.5 267t260.5 238l129 -51q-166 -156 -268.5 -302.5t-159 -284.5t-74.5 -269t-18 -256q0 -59 7 -134t25.5 -156t48 -162t72.5 -152l-147 -52q-123 135 -185.5 322.5t-62.5 384.5z" /> +<glyph unicode=")" horiz-adv-x="667" d="M-129 -188q125 121 222 243.5t164 258t100.5 288t33.5 334.5q0 166 -40 317.5t-118 274.5l150 51q59 -68 105.5 -149.5t78 -174t48 -189.5t16.5 -196q0 -160 -45 -313.5t-128 -293.5t-200 -267t-260 -236z" /> +<glyph unicode="*" horiz-adv-x="899" d="M201 1024l260 78l-228 78l146 182l149 -178v254h209l-108 -254l225 178l68 -182l-263 -78l230 -78l-146 -182l-149 176v-252h-209l109 252l-226 -176z" /> +<glyph unicode="+" horiz-adv-x="989" d="M57 406l35 167h309l66 301h188l-65 -301h311l-35 -167h-311l-68 -322h-188l68 322h-310z" /> +<glyph unicode="," horiz-adv-x="532" d="M-63 -242l141 232h-51l59 280h244l-66 -311l-264 -252z" /> +<glyph unicode="-" horiz-adv-x="960" d="M102 406l35 167h692l-34 -167h-693z" /> +<glyph unicode="." horiz-adv-x="516" d="M20 96q0 33 15.5 63.5t41 55.5t57.5 40t67 15q51 0 86 -38.5t35 -90.5q0 -33 -16.5 -62.5t-43 -53t-59.5 -37t-66 -13.5q-53 0 -85 35t-32 86z" /> +<glyph unicode="/" horiz-adv-x="956" d="M-70 -117l899 1555h236l-899 -1555h-236z" /> +<glyph unicode="0" horiz-adv-x="1312" d="M111 485q0 170 53 328t148.5 279.5t227.5 195.5t287 74q106 0 185.5 -42t131.5 -113.5t78.5 -167t26.5 -201.5q0 -158 -53 -311.5t-149.5 -276.5t-230.5 -199t-296 -76q-104 0 -182 40t-128 110t-74.5 163t-24.5 197zM362 489q0 -154 52.5 -235.5t154.5 -81.5 q106 0 187.5 61.5t135.5 157.5t81.5 215t27.5 234q0 143 -54 234t-169 91q-117 0 -195.5 -67.5t-127.5 -169t-71 -219.5t-22 -220z" /> +<glyph unicode="1" horiz-adv-x="684" d="M150 0l210 995l-182 -73v204l494 226l-287 -1352h-235z" /> +<glyph unicode="2" horiz-adv-x="1030" d="M-23 0l43 205q74 78 159 152.5t169 146t162 141.5t138.5 137.5t96 132t35.5 127.5q0 70 -49 99.5t-127 29.5q-88 0 -180 -27.5t-164 -64.5l-10 176q43 20 97 40t111.5 35.5t115 23.5t110.5 8q154 0 244 -76t90 -201q0 -76 -32 -149.5t-86 -147t-126 -146.5t-151.5 -145.5 t-161.5 -146.5t-158 -145h547l-43 -205h-830z" /> +<glyph unicode="3" horiz-adv-x="1085" d="M-33 115l96 186q59 -59 140.5 -94t181.5 -35q158 0 239 79t81 212q0 80 -51.5 126t-170.5 46h-55l37 178h63q55 0 99.5 19.5t75 53.5t47 77t16.5 92q0 66 -42 92.5t-103 26.5q-39 0 -83 -8.5t-86 -24t-80 -35t-67 -41.5l-14 188q88 47 195.5 78t207.5 31q154 0 242 -76 t88 -201q0 -66 -20.5 -118t-56.5 -95t-85 -76.5t-104 -60.5q94 -35 146 -101.5t52 -166.5q0 -94 -39.5 -183t-115.5 -158t-188.5 -110t-256.5 -41q-254 1 -389 140z" /> +<glyph unicode="4" horiz-adv-x="1101" d="M18 389l39 184l738 779h245l-166 -779h142l-39 -184h-141l-82 -389h-236l82 389h-582zM289 573h350l106 496z" /> +<glyph unicode="5" horiz-adv-x="1093" d="M-16 113l100 194q25 -29 59.5 -52.5t76.5 -40.5t89 -27.5t94 -10.5q61 0 120 16.5t103 53.5t71.5 93t27.5 136q0 72 -47 118t-166 46q-63 0 -142 -12.5t-153 -38.5l-51 30l237 744h695l-47 -215h-504l-98 -324q45 12 93 17.5t87 5.5q162 0 257 -86t95 -242 q0 -104 -40 -202.5t-116.5 -173t-191.5 -121t-262 -46.5q-125 0 -223 36t-164 102z" /> +<glyph unicode="6" horiz-adv-x="1116" d="M104 401q0 78 13.5 179.5t45.5 208t84 209t129 183.5t181.5 130t241.5 49q37 0 81 -5t87 -17.5t81.5 -33t63.5 -51.5l-90 -180q-57 51 -128 71.5t-128 20.5q-86 0 -151.5 -37.5t-112.5 -99t-77 -137.5t-46 -152q-4 -16 -6 -29.5t-4 -29.5l6 -2q49 74 130 108.5t179 34.5 q92 0 153.5 -31.5t97.5 -79.5t50 -106.5t14 -114.5q0 -82 -31.5 -173t-98 -166.5t-169 -125t-241.5 -49.5q-96 0 -163 31t-110 87.5t-62.5 134t-19.5 173.5zM344 338q0 -80 40 -128t116 -48q57 0 105 23.5t82 65.5t52.5 99.5t18.5 124.5q0 66 -33 113t-115 47 q-63 0 -112 -24.5t-83 -65.5t-52.5 -94.5t-18.5 -112.5z" /> +<glyph unicode="7" horiz-adv-x="940" d="M37 0q4 18 7 39.5t7 40.5q16 80 58.5 172t101.5 188.5t131 193.5t148.5 189t154.5 174t150 150h-596l45 215h829l-45 -215q-72 -63 -149.5 -147.5t-151.5 -179.5t-142.5 -195.5t-123.5 -197.5t-94 -185t-54 -160l-16 -82h-260z" /> +<glyph unicode="8" horiz-adv-x="1118" d="M57 299q0 162 91.5 279.5t244.5 160.5l2 9q-55 23 -92 80t-37 143q0 84 33 155.5t93.5 124t145.5 82t191 29.5q156 0 241 -71.5t85 -190.5q0 -63 -20.5 -118.5t-55.5 -100.5t-80 -79t-94 -52l-2 -9q92 -23 137 -95.5t45 -176.5q0 -96 -33.5 -185t-103.5 -158t-173.5 -110 t-242.5 -41q-102 0 -174 27t-116 71t-64.5 102t-20.5 124zM293 328q0 -86 47 -130t131 -44q117 0 195.5 75.5t78.5 210.5q0 39 -9 75t-30.5 63.5t-54.5 45t-78 17.5q-70 0 -122 -30.5t-87.5 -78t-53 -101.5t-17.5 -103zM489 965q0 -63 33 -101.5t92 -38.5q43 0 80 17.5 t63.5 47.5t42 70.5t15.5 90.5q0 59 -31.5 94t-95.5 35q-92 0 -145.5 -58.5t-53.5 -156.5z" /> +<glyph unicode="9" horiz-adv-x="1116" d="M49 82l90 180q57 -51 128 -71.5t128 -20.5q96 0 165 46t115 116.5t73.5 156.5t44.5 166l-7 2q-49 -74 -130 -108.5t-179 -34.5q-92 0 -153.5 32t-97.5 80t-50 106.5t-14 113.5q0 82 31.5 173t98 167t169 125t241.5 49q94 0 162 -31t111 -87t62.5 -135t19.5 -173 q0 -78 -13.5 -179.5t-45 -208t-84 -208.5t-130 -183t-182 -130.5t-240.5 -49.5q-37 0 -80.5 5.5t-86.5 17.5t-82 32.5t-64 51.5zM403 844q0 -61 32 -102.5t114 -41.5q63 0 112.5 25t84 65.5t53 94t18.5 112.5q0 80 -40 128.5t-118 48.5q-61 0 -109 -31t-80 -78t-49.5 -105.5 t-17.5 -115.5z" /> +<glyph unicode=":" horiz-adv-x="563" d="M37 96q0 33 15.5 63.5t41 55.5t57 40t66.5 15q51 0 86 -38.5t35 -90.5q0 -33 -16.5 -62.5t-43 -53t-59.5 -37t-65 -13.5q-53 0 -85 35t-32 86zM178 758q0 33 15.5 63.5t41 55t57.5 40t66 15.5q51 0 86 -39t35 -90q0 -33 -17.5 -62.5t-44 -53t-59 -37t-63.5 -13.5 q-53 0 -85 35t-32 86z" /> +<glyph unicode=";" horiz-adv-x="573" d="M-47 -242l141 232h-51l59 280h244l-65 -311l-265 -252zM186 758q0 33 15.5 63.5t41 55t57.5 40t67 15.5q51 0 85.5 -39t34.5 -90q0 -33 -17 -62.5t-44 -53t-59.5 -37t-63.5 -13.5q-53 0 -85 35t-32 86z" /> +<glyph unicode="&#x3c;" horiz-adv-x="808" d="M51 426l29 133l663 397v-190l-460 -268l-2 -11l348 -272l-78 -192z" /> +<glyph unicode="=" horiz-adv-x="976" d="M76 250l35 168h692l-35 -168h-692zM141 561l37 168h692l-36 -168h-693z" /> +<glyph unicode="&#x3e;" horiz-adv-x="811" d="M35 23v192l463 272l2 11l-346 268l77 190l500 -397l-29 -133z" /> +<glyph unicode="?" horiz-adv-x="843" d="M137 96q0 33 15.5 62.5t41 53.5t57.5 37t64 13q53 0 88 -36t35 -85q0 -33 -17.5 -62.5t-44 -53t-59 -37t-65.5 -13.5q-51 0 -83 36t-32 85zM227 371q20 100 59.5 178t83.5 140.5t90 112.5t83 97t60.5 92t23.5 99q0 63 -40 88.5t-93 25.5q-66 0 -135.5 -28.5t-116.5 -73.5 l-11 196q66 43 158 75t184 32q131 0 208 -75t77 -191q0 -72 -24.5 -130.5t-64.5 -110.5t-88 -105.5t-94 -115t-86 -136t-61 -170.5h-213z" /> +<glyph unicode="@" horiz-adv-x="1478" d="M49 262q0 80 26.5 175t79 191.5t129 185.5t176 157.5t220.5 109.5t262 41q125 0 213 -35.5t144.5 -95t82 -134.5t25.5 -150q0 -109 -46 -208.5t-121 -177t-168 -123.5t-187 -46q-59 0 -95 27.5t-36 80.5q0 18 6 41q-49 -70 -118 -110.5t-122 -40.5q-51 0 -91 46t-40 138 q0 102 47 187t118 146.5t155 95.5t159 34q27 0 57.5 -5.5t59.5 -14.5t52.5 -24.5t33.5 -35.5l-125 -291q-12 -29 -20 -57.5t-8 -38.5q0 -12 6 -22.5t28 -10.5q41 0 84 36t79 91t58.5 123.5t22.5 134.5q0 55 -15.5 105.5t-50 90.5t-90 63.5t-133.5 23.5q-145 0 -264 -67 t-204 -169t-132 -224t-47 -235q0 -84 25.5 -143t71.5 -98t108.5 -57.5t136.5 -18.5q80 0 154.5 17.5t136 43t109 54t75.5 49.5l-35 -164q-25 -18 -74.5 -46t-117.5 -53.5t-147.5 -43t-163.5 -17.5q-104 0 -194.5 33t-156 94.5t-102.5 148.5t-37 193zM592 358q0 -51 33 -51 q18 0 42.5 15.5t50 43t49.5 63.5t40 79l55 147q-16 8 -37 9q-47 0 -89 -34t-73.5 -81t-51 -99.5t-19.5 -91.5z" /> +<glyph unicode="A" horiz-adv-x="1292" d="M-106 0l811 1352h202l291 -1352h-256l-72 393h-510l-221 -393h-245zM465 578h373l-90 497z" /> +<glyph unicode="B" horiz-adv-x="1169" d="M61 0l287 1352q25 2 66 3t88 3t94 3t84 1q188 0 286.5 -71.5t98.5 -209.5q0 -104 -51 -190t-156 -143q94 -35 146.5 -106t52.5 -175q0 -94 -40 -183t-117 -158t-189.5 -110t-257.5 -41q-113 0 -216.5 7.5t-175.5 17.5zM334 176q35 -4 75 -4h80q147 0 234.5 77t87.5 212 q0 80 -53 128t-174 48q-39 0 -78 -1t-76 -3zM467 809q25 -2 51 -2h53q53 0 98.5 20.5t77 54t49 79t17.5 92.5q0 51 -35 83.5t-100 32.5q-41 0 -74 -3t-61 -7z" /> +<glyph unicode="C" horiz-adv-x="1290" d="M109 508q0 166 57 320.5t166.5 272.5t266.5 189.5t355 71.5q111 0 216.5 -23.5t177.5 -64.5l-105 -213q-55 45 -141 72.5t-203 27.5q-147 0 -249.5 -53t-166 -141t-92.5 -202t-29 -233q0 -174 82 -265t242 -91q123 0 231.5 37t186.5 90l18 -203q-92 -49 -216 -87 t-269 -38q-139 0 -238.5 42t-164 115t-95 170t-30.5 206z" /> +<glyph unicode="D" horiz-adv-x="1458" d="M61 0l287 1352q29 2 86.5 4t120.5 3t121.5 2t91.5 1q197 0 317.5 -41t188.5 -113q59 -63 87 -165.5t28 -213.5q0 -203 -59.5 -360.5t-178.5 -267t-298 -167t-417 -57.5q-86 0 -183.5 6.5t-191.5 16.5zM334 180q57 -4 110.5 -6t90.5 -2q180 0 296.5 48t185 135t95.5 207 t27 263q0 166 -94.5 253t-321.5 87h-77q-48 0 -103 -2z" /> +<glyph unicode="E" horiz-adv-x="1081" d="M61 0l287 1352h782l-43 -205h-548l-70 -328h412l-43 -205h-412l-86 -409h588l-43 -205h-824z" /> +<glyph unicode="F" horiz-adv-x="1003" d="M61 0l287 1352h772l-43 -205h-538l-70 -328h389l-43 -205h-389l-129 -614h-236z" /> +<glyph unicode="G" horiz-adv-x="1351" d="M109 508q0 166 57 320.5t165.5 272.5t266.5 189.5t360 71.5q115 0 222.5 -23.5t187.5 -64.5l-111 -213q-61 41 -147 70.5t-203 29.5q-170 0 -276.5 -58.5t-167 -150.5t-82 -204.5t-21.5 -221.5q0 -350 340 -350q76 0 124 12.5t102 28.5l71 340h236l-94 -444 q-104 -61 -231.5 -99.5t-268.5 -38.5q-139 0 -239.5 42t-165 115t-95 169t-30.5 207z" /> +<glyph unicode="H" horiz-adv-x="1478" d="M61 0l287 1352h236l-119 -553h647l119 553h235l-286 -1352h-236l125 594h-647l-125 -594h-236z" /> +<glyph unicode="I" horiz-adv-x="595" d="M61 0l287 1352h236l-287 -1352h-236z" /> +<glyph unicode="J" horiz-adv-x="595" d="M-174 -141q72 0 120 32.5t79.5 83t50 113t30.5 121.5l244 1143h236l-244 -1145q-23 -109 -67 -204t-108.5 -167t-147 -113.5t-185.5 -41.5z" /> +<glyph unicode="K" horiz-adv-x="1239" d="M61 0l287 1352h236l-125 -590q68 53 132 107.5t122 107.5q106 98 196 191.5t160 183.5h258q-115 -123 -219 -225.5t-225 -213.5q-45 -41 -93.5 -84t-99.5 -86l447 -743h-273l-356 592q-27 -23 -52.5 -42.5t-49.5 -37.5l-109 -512h-236z" /> +<glyph unicode="L" horiz-adv-x="1007" d="M61 0l287 1352h236l-244 -1147h563l-43 -205h-799z" /> +<glyph unicode="M" horiz-adv-x="1806" d="M61 0l287 1352h268l242 -1033l668 1033h268l-287 -1352h-233l188 891l-577 -891h-189l-211 891l-188 -891h-236z" /> +<glyph unicode="N" horiz-adv-x="1478" d="M61 0l287 1352h289l383 -994l211 994h235l-286 -1352h-289l-383 991l-211 -991h-236z" /> +<glyph unicode="O" horiz-adv-x="1531" d="M109 510q0 168 59 321.5t168.5 271.5t262.5 188.5t339 70.5q135 0 234.5 -43t166 -118t99 -174t32.5 -212q0 -154 -57 -303.5t-166.5 -269t-265.5 -193.5t-352 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM354 514q0 -152 83 -245t249 -93q135 0 237.5 57.5 t170 148.5t101.5 204.5t34 228.5q0 76 -20.5 139.5t-63.5 109.5t-108.5 71.5t-157.5 25.5q-141 0 -240.5 -58.5t-162 -151.5t-92.5 -208.5t-30 -228.5z" /> +<glyph unicode="P" horiz-adv-x="1091" d="M61 0l287 1352q31 2 72 4t85 3l88 2q44 1 83 1q201 0 316.5 -89t115.5 -259q0 -98 -37 -189.5t-108.5 -162t-178 -112.5t-245.5 -42h-69q-34 0 -64 2l-109 -510h-236zM446 707q29 -2 61 -2h66q141 0 212 82.5t71 213.5q0 72 -43 118t-145 46h-64q-31 0 -61 -2z" /> +<glyph unicode="Q" horiz-adv-x="1536" d="M111 510q0 168 59 321.5t169 271.5t262.5 188.5t338.5 70.5q135 0 234.5 -43t166 -118t99.5 -174t33 -212q0 -150 -55.5 -296t-159 -264t-252 -193.5t-336.5 -84.5q72 -8 134 -32.5t123.5 -50t126 -46t142.5 -20.5q92 0 207 41l-96 -201q-41 -14 -78 -19t-72 -5 q-86 0 -158.5 27.5t-142.5 59t-138.5 59.5t-144.5 28q-45 0 -116.5 -16.5t-145.5 -63.5l-8 147q66 45 137.5 66.5t130.5 25.5q-121 8 -206.5 54.5t-143 118t-84 164t-26.5 196.5zM354 514q0 -152 83 -245t249 -93q135 0 237.5 57.5t170 148.5t101.5 204.5t34 228.5 q0 76 -20.5 139.5t-63.5 109.5t-108.5 71.5t-157.5 25.5q-141 0 -240.5 -58.5t-162 -151.5t-92.5 -208.5t-30 -228.5z" /> +<glyph unicode="R" horiz-adv-x="1228" d="M61 0l287 1352q33 2 76 4t86 3t81 2t60 1q229 0 347 -81t118 -234q0 -68 -19.5 -134.5t-60.5 -125t-107.5 -105.5t-158.5 -74l367 -608h-273l-348 578h-46q-24 0 -50 2l-123 -580h-236zM461 774h127q135 0 206.5 72t71.5 184q0 68 -53 101.5t-182 33.5h-39q-23 0 -49 -2z " /> +<glyph unicode="S" horiz-adv-x="1120" d="M-8 88l108 221q66 -59 153 -98t210 -39q152 0 221.5 57.5t69.5 145.5q0 49 -23.5 86t-58.5 62.5t-75 42t-71 28.5q-53 18 -107 43t-100.5 62.5t-75 93t-28.5 137.5q0 117 41 199.5t111.5 134t166 75t201.5 23.5q113 0 214.5 -22.5t164.5 -55.5l-100 -217 q-63 47 -154.5 73.5t-173.5 26.5q-104 0 -167.5 -41t-63.5 -127q0 -35 16 -61.5t46 -47t71 -37.5t90 -36q59 -23 117.5 -52.5t104.5 -71.5t75 -101.5t29 -140.5q0 -131 -50.5 -222.5t-132.5 -147.5t-186.5 -81t-212.5 -25q-135 0 -245.5 33t-184.5 80z" /> +<glyph unicode="T" horiz-adv-x="1095" d="M166 1147l43 205h1018l-43 -205h-391l-244 -1147h-236l244 1147h-391z" /> +<glyph unicode="U" horiz-adv-x="1443" d="M133 346q0 66 14 129l187 877h235l-176 -828q-8 -33 -11 -62.5t-3 -55.5q0 -123 69.5 -176.5t196.5 -53.5q154 0 257.5 81t144.5 267l176 828h225l-186 -877q-23 -100 -74 -190t-135 -159t-200 -109t-263 -40q-123 0 -210 29t-142.5 78t-80 116.5t-24.5 145.5z" /> +<glyph unicode="V" horiz-adv-x="1304" d="M141 1352h256l205 -1065l615 1065h245l-827 -1352h-186z" /> +<glyph unicode="W" horiz-adv-x="2138" d="M162 1352h256l125 -1049l569 1049h231l125 -1049l568 1049h256l-789 -1352h-194l-150 1028l-586 -1028h-194z" /> +<glyph unicode="X" horiz-adv-x="1304" d="M-96 0l647 696l-330 656h264l230 -529l450 529h258l-610 -658l350 -694h-264l-254 547l-483 -547h-258z" /> +<glyph unicode="Y" horiz-adv-x="1150" d="M137 1352h264l215 -613l463 613h260l-651 -797l-117 -555h-235l115 547z" /> +<glyph unicode="Z" horiz-adv-x="1132" d="M-31 0l43 205l873 942h-641l43 205h897l-43 -205l-873 -942h703l-43 -205h-959z" /> +<glyph unicode="[" horiz-adv-x="577" d="M0 -195l367 1729h327l-30 -148h-113l-305 -1433h112l-30 -148h-328z" /> +<glyph unicode="\" horiz-adv-x="919" d="M246 1438h231l240 -1555h-232z" /> +<glyph unicode="]" horiz-adv-x="577" d="M-70 -195l31 148h113l305 1433h-113l31 148h328l-367 -1729h-328z" /> +<glyph unicode="^" horiz-adv-x="712" d="M365 1161l8 15l270 202h16l181 -202l4 -15l-45 -59l-17 -6l-174 84l-211 -84l-12 6z" /> +<glyph unicode="_" horiz-adv-x="948" d="M-106 -168l34 168h887l-35 -168h-886z" /> +<glyph unicode="`" horiz-adv-x="448" d="M272 1272q0 18 7.5 40.5t19.5 42t27.5 32t31.5 12.5q8 0 21 -6l323 -207l5 -15l-48 -73l-16 -6l-354 141q-17 6 -17 39z" /> +<glyph unicode="a" d="M57 367q0 111 37 219t106.5 194t171 139.5t230.5 53.5q98 0 177 -33t114 -92h8l43 94h176l-200 -942h-181l11 129h-9q-72 -63 -153.5 -108.5t-192.5 -45.5q-80 0 -143.5 30t-106.5 82t-65.5 124t-22.5 156zM283 389q0 -47 10 -91t31.5 -78t55.5 -54.5t81 -20.5 q33 0 71.5 9.5t78.5 26t77 40t66 53.5l84 394q-47 76 -104.5 103.5t-117.5 27.5q-80 0 -141 -36t-104 -94.5t-65.5 -131t-22.5 -148.5z" /> +<glyph unicode="b" horiz-adv-x="1177" d="M23 0l321 1516h223l-141 -668q59 59 144 92t184 33q88 0 150.5 -31t103.5 -83t60 -119.5t19 -143.5q0 -127 -43 -239.5t-117.5 -197.5t-176 -134.5t-215.5 -49.5q-111 0 -173.5 45.5t-107.5 108.5h-8l-43 -129h-180zM303 274q16 -31 44 -54t59.5 -39.5t67.5 -26t69 -9.5 q74 0 132 39t99 99.5t63.5 133t22.5 142.5q0 98 -47 169t-149 71q-59 0 -129 -28t-148 -103z" /> +<glyph unicode="c" horiz-adv-x="1001" d="M57 369q0 111 37 219t113 193t190.5 138.5t268.5 53.5q98 0 187 -22.5t138 -59.5l-88 -182q-39 35 -116.5 61.5t-153.5 26.5q-90 0 -152.5 -37t-101.5 -94.5t-56.5 -127t-17.5 -132.5q0 -104 49 -176t156 -72q74 0 163 29.5t156 82.5v-192q-66 -37 -172 -70t-219 -33 q-98 0 -169.5 31t-119 85t-70 126t-22.5 152z" /> +<glyph unicode="d" horiz-adv-x="1177" d="M57 367q0 111 37 219t106.5 194t171 139.5t230.5 53.5q98 0 169 -33t106 -92l141 668h223l-321 -1516h-181l11 129h-9q-72 -63 -153.5 -108.5t-192.5 -45.5q-80 0 -143.5 30t-106.5 82t-65.5 124t-22.5 156zM283 389q0 -47 10 -91t31.5 -78t55.5 -54.5t81 -20.5 q33 0 71.5 9.5t78.5 26t77 40t66 53.5l84 394q-47 76 -104.5 103.5t-117.5 27.5q-80 0 -141 -36t-104 -94.5t-65.5 -131t-22.5 -148.5z" /> +<glyph unicode="e" horiz-adv-x="1034" d="M53 369q0 115 43 223t123 193t191.5 136.5t248.5 51.5q154 0 234 -71t80 -200q0 -39 -8.5 -77.5t-21.5 -72.5t-28.5 -60.5t-27.5 -40.5h-600q-2 -12 -2 -25v-25q0 -51 13 -96t40 -78.5t69 -53t99 -19.5q76 0 166 28.5t162 71.5v-168q-31 -16 -75 -35.5t-96.5 -36 t-110.5 -28t-120 -11.5q-96 0 -166.5 32t-118 85t-71 125t-23.5 152zM334 610h399q6 14 11.5 29.5t5.5 32.5q0 55 -37 90t-99 35q-90 0 -163.5 -50.5t-116.5 -136.5z" /> +<glyph unicode="f" horiz-adv-x="634" d="M-47 -535l285 1340h-117l24 117l121 18q25 117 49.5 199t49 138t47 91t43.5 57q51 53 122.5 77t151.5 24q10 0 32.5 -1t49.5 -5t54.5 -13.5t49.5 -23.5l-88 -174q-16 12 -59 33.5t-88 21.5q-27 0 -48.5 -12.5t-40 -45t-35.5 -88t-36 -141.5l-28 -135h180l-29 -137h-180 l-285 -1340h-225z" /> +<glyph unicode="g" horiz-adv-x="1173" d="M-12 -410l35 172q88 -53 191 -83.5t198 -30.5q66 0 113.5 18.5t82.5 61.5t60.5 115.5t48.5 181.5l20 104q-68 -63 -151.5 -108.5t-192.5 -45.5q-82 0 -145.5 30t-106.5 82t-65.5 124t-22.5 156q0 111 37 219t106.5 194t171 139.5t228.5 53.5q98 0 178 -33t115 -92h8 l43 94l170 2l-207 -983q-27 -129 -68.5 -219t-105 -147.5t-149.5 -84t-199 -26.5q-53 0 -100.5 6t-93.5 18.5t-95 32.5t-104 49zM279 391q0 -49 10 -93t31.5 -78t55.5 -54.5t83 -20.5q31 0 68.5 8.5t77.5 26t77 41t68 53.5l84 394q-47 76 -105.5 103.5t-118.5 27.5 q-78 0 -139 -36t-104 -93.5t-65.5 -130t-22.5 -148.5z" /> +<glyph unicode="h" horiz-adv-x="1128" d="M23 0l321 1516h225l-151 -713q78 90 163 130t189 40q53 0 100.5 -12.5t82 -39t55 -70.5t20.5 -108q0 -47 -12 -102l-137 -641h-226l133 623q6 31 7 55q0 55 -29 84t-80 29q-39 0 -83 -12.5t-86 -37t-79 -59.5t-59 -78l-129 -604h-225z" /> +<glyph unicode="i" horiz-adv-x="505" d="M20 0l201 942h225l-200 -942h-226zM250 1221q0 33 15.5 63.5t41 55t57 40t66.5 15.5q51 0 86 -39t35 -90q0 -33 -17.5 -62.5t-44 -53.5t-59.5 -37t-63 -13q-53 0 -85 35t-32 86z" /> +<glyph unicode="j" horiz-adv-x="503" d="M-281 -385q12 -6 41 -6q61 0 105.5 38t74 96t49 126t31.5 127l201 946h223l-200 -948q-23 -104 -66 -198.5t-103.5 -167t-136 -114.5t-163.5 -42q-16 0 -29.5 1t-17.5 5zM250 1221q0 33 15.5 63.5t41 55t57 40t66.5 15.5q51 0 85 -39t34 -90q0 -33 -16.5 -62.5t-43 -53.5 t-59.5 -37t-65 -13q-51 0 -83 36t-32 85z" /> +<glyph unicode="k" horiz-adv-x="1005" d="M23 0l321 1516h225l-186 -877l379 303h252l-408 -334l273 -608h-246l-207 463l-96 -80l-82 -383h-225z" /> +<glyph unicode="l" horiz-adv-x="530" d="M35 0l321 1516h226l-322 -1516h-225z" /> +<glyph unicode="m" horiz-adv-x="1716" d="M20 0l201 942h176l-20 -139h8q59 86 157.5 128t198.5 42q96 0 167 -37t91 -129q59 84 156.5 125t196.5 41q55 0 103 -12.5t84 -39t56.5 -70.5t20.5 -108q0 -47 -12 -102l-138 -641h-225l133 623q6 33 6 59q0 109 -104 109q-33 0 -74 -12.5t-82 -36t-76.5 -58.5t-56.5 -80 v8l-131 -612h-225l133 623q6 33 6 59q0 109 -104 109q-33 0 -74 -12.5t-82 -36t-77 -58.5t-58 -80l-129 -604h-226z" /> +<glyph unicode="n" horiz-adv-x="1126" d="M20 0l201 942h176l-20 -139h8q61 86 161.5 128t205.5 42q57 0 107 -12.5t87 -40t58.5 -71.5t21.5 -108q0 -45 -12 -100l-137 -641h-226l133 623q6 31 7 55q0 113 -115 113q-35 0 -77 -12.5t-84 -36t-80 -58.5t-60 -80l-129 -604h-226z" /> +<glyph unicode="o" horiz-adv-x="1130" d="M55 365q0 113 39 222t114 195t186.5 138.5t256.5 52.5q102 0 175 -32t120 -86t68.5 -125t21.5 -150q0 -115 -37.5 -223.5t-111.5 -193.5t-184.5 -136.5t-258.5 -51.5q-102 0 -175.5 31t-121 84t-70 124t-22.5 151zM301 385q0 -47 10.5 -91t32 -77t55 -52.5t80.5 -19.5 q76 0 134.5 37t97.5 95.5t59.5 131t20.5 146.5q0 49 -10.5 93t-33 77t-56.5 52.5t-83 19.5q-76 0 -133 -37t-96 -95.5t-58.5 -132t-19.5 -147.5z" /> +<glyph unicode="p" d="M-92 -532l313 1474h180l-10 -129h8q33 33 76 62.5t91 51t95.5 34t90.5 12.5q88 0 151.5 -31t104.5 -82t59 -120.5t18 -145.5q0 -117 -35.5 -227.5t-104 -197.5t-171 -140.5t-237.5 -53.5q-92 0 -166 27t-109 86l-131 -620h-223zM301 268q47 -76 106.5 -95t112.5 -19 q84 0 146.5 33.5t104.5 90t63.5 129t21.5 148.5q0 47 -9 92t-30.5 79t-55.5 54.5t-83 20.5q-31 0 -69 -9.5t-77.5 -26.5t-77.5 -42t-67 -55z" /> +<glyph unicode="q" d="M55 348q0 111 35 221.5t103.5 200.5t171 146.5t237.5 56.5q43 0 85 -12.5t81 -34t70.5 -51t50.5 -62.5h8l43 129h180l-313 -1474h-223l131 620q-59 -59 -143.5 -86t-176.5 -27q-90 0 -153.5 29t-105.5 80t-61.5 118.5t-19.5 145.5zM283 383q0 -49 11 -91t35.5 -74 t63.5 -50t92 -18t123 24.5t146 93.5l86 400q-16 31 -44 55.5t-61 41.5t-67.5 26.5t-65.5 9.5q-76 0 -135 -40t-100 -101.5t-62.5 -135t-21.5 -141.5z" /> +<glyph unicode="r" horiz-adv-x="765" d="M20 0l201 942h176l-32 -197h8q31 43 62.5 84t66.5 73t77 51.5t93 19.5q82 0 141 -53l-96 -183q-16 16 -58.5 26.5t-72.5 10.5q-41 0 -72 -19.5t-57.5 -51t-49 -72.5t-45.5 -84l-116 -547h-226z" /> +<glyph unicode="s" horiz-adv-x="888" d="M-12 78l94 194q55 -68 135 -100.5t154 -32.5q92 0 141 41t49 107q0 27 -18.5 46t-67.5 32l-184 49q-51 14 -85 37.5t-54.5 53.5t-28.5 62.5t-8 63.5q0 80 31.5 143.5t87 107.5t131 67.5t163.5 23.5q39 0 83 -5t85 -16.5t78 -27t64 -35.5l-99 -184q-33 33 -100.5 66.5 t-157.5 33.5q-78 0 -122 -31t-44 -84q0 -25 19.5 -46t77.5 -36l137 -33q63 -16 105 -42.5t66.5 -59.5t34 -68.5t9.5 -68.5q0 -76 -34 -141.5t-93 -114.5t-142 -77t-182 -28q-109 0 -193.5 32t-131.5 71z" /> +<glyph unicode="t" horiz-adv-x="673" d="M96 111q0 23 4 50t11 56l125 588h-117l24 123l138 20l96 279h172l-60 -285h181l-29 -137h-182l-115 -541q-8 -33 -8 -59q0 -27 11 -36t36 -9q27 0 55.5 10t87.5 39v-162q-47 -33 -121.5 -52.5t-144.5 -19.5q-92 0 -128 35t-36 101z" /> +<glyph unicode="u" horiz-adv-x="1099" d="M63 197q0 45 13 104l137 641h225l-131 -612q-6 -29 -6 -49q0 -59 34 -91t93 -32q72 0 141.5 48t116.5 138l127 598h227l-200 -942h-176l16 131h-8q-33 -47 -74 -76.5t-86 -47t-92 -25t-90 -7.5q-57 0 -105.5 11.5t-84.5 37t-56.5 69t-20.5 104.5z" /> +<glyph unicode="v" horiz-adv-x="1069" d="M92 942h236l125 -756l456 756h221l-589 -942h-273z" /> +<glyph unicode="w" horiz-adv-x="1681" d="M100 942h236l92 -723l377 723h225l68 -723l401 723h232l-543 -942h-268l-64 655l-342 -655h-272z" /> +<glyph unicode="x" horiz-adv-x="1036" d="M-92 0l465 481l-244 461h256l154 -317l278 317h256l-442 -457l262 -485h-256l-166 344l-307 -344h-256z" /> +<glyph unicode="y" horiz-adv-x="1060" d="M-172 -342q6 -2 13 -4t34 -2q135 0 245.5 99t223.5 280l-276 911h235l186 -670l404 670h219l-592 -950q-43 -72 -112.5 -161t-154.5 -168t-183.5 -133t-198.5 -54q-16 0 -24.5 1t-18.5 5v176z" /> +<glyph unicode="z" horiz-adv-x="854" d="M-33 0l39 182l553 578h-409l38 182h643l-38 -182l-566 -578h463l-39 -182h-684z" /> +<glyph unicode="{" horiz-adv-x="593" d="M72 618l22 103q55 2 90 28.5t56.5 61.5t32 73t16.5 64q8 43 18 90t18.5 90t15.5 78t11 58q14 66 36 120t61.5 91.5t101 59t158.5 21.5l-17 -104q-51 -6 -71.5 -49t-30.5 -90q-6 -25 -13.5 -66t-15.5 -84t-16 -83t-13 -60q-31 -147 -94 -235.5t-174 -114.5 q72 -18 104.5 -79t32.5 -153q0 -53 -14 -122.5t-32.5 -137t-33 -125t-14.5 -84.5q0 -29 11.5 -53.5t39.5 -28.5l-26 -104q-72 0 -119 14.5t-75.5 40t-41 61t-12.5 81.5q0 47 15.5 115.5t34 139t33.5 135t15 101.5q0 25 -5 50.5t-17.5 47t-33.5 34.5t-54 15z" /> +<glyph unicode="|" horiz-adv-x="524" d="M-10 -233l383 1806h209l-383 -1806h-209z" /> +<glyph unicode="}" horiz-adv-x="593" d="M-68 -217l19 104q51 6 70.5 49.5t29.5 90.5q6 25 14.5 65.5t16.5 83.5t16 82t13 61q31 147 93 235.5t173 115.5q-72 18 -103.5 78.5t-31.5 152.5q0 53 14 123t31.5 137.5t32 123.5t14.5 85t-10.5 53.5t-40.5 28.5l26 104q72 0 119 -14t75.5 -39.5t41 -61.5t12.5 -81 q0 -47 -15.5 -115.5t-34 -139.5t-33.5 -135.5t-15 -101.5q0 -25 5 -50t17.5 -46.5t34 -35t53.5 -15.5l-20 -103q-55 -4 -91 -29.5t-57.5 -60t-32 -72.5t-16.5 -65q-10 -43 -19 -90t-17.5 -90t-15.5 -79l-11 -56q-14 -66 -36 -120t-61.5 -93t-102.5 -59.5t-157 -20.5z" /> +<glyph unicode="~" horiz-adv-x="970" d="M100 414q2 16 20.5 48t49.5 62.5t73 54t93 23.5q18 0 60 -3t93.5 -6t103.5 -6t93 -3q39 0 76 7t72 40l14 -41q-2 -10 -17.5 -40t-45 -63.5t-70.5 -59.5t-92 -26q-16 0 -66.5 3.5t-110 6.5t-116 6t-84.5 3q-47 0 -75 -10.5t-52 -34.5z" /> +<glyph unicode="&#xa1;" horiz-adv-x="524" d="M-94 -446l272 1028h178l-170 -1028h-280zM170 809q0 33 17.5 62.5t44 53t59.5 37t65 13.5q51 0 83 -36t32 -85q0 -33 -15.5 -62.5t-41 -53t-57 -37t-64.5 -13.5q-53 0 -88 36t-35 85z" /> +<glyph unicode="&#xa2;" horiz-adv-x="1019" d="M53 350q0 96 32 190.5t95.5 171t160.5 130t228 65.5l60 275h188l-59 -279q70 -10 128 -28.5t93 -45.5l-94 -190q-23 27 -68 48.5t-98 33.5l-119 -559q61 14 121.5 41.5t107.5 64.5v-190q-47 -29 -116.5 -53.5t-149.5 -36.5l-57 -269h-189l56 261q-84 8 -143.5 40.5 t-99.5 83t-58.5 112.5t-18.5 134zM279 395q0 -78 33.5 -138t99.5 -89l118 557q-57 -14 -104 -48t-80 -79t-50 -98.5t-17 -104.5z" /> +<glyph unicode="&#xa3;" horiz-adv-x="1193" d="M-35 74q168 59 261 168.5t120 238.5l6 31h-190l37 168h182q10 90 11 169t18 148q20 98 71 168t118 114t142.5 63.5t147.5 19.5q92 0 177 -28.5t128 -71.5l-84 -187q-16 20 -43 39t-61.5 32t-73.5 21.5t-76 8.5q-96 0 -140 -50.5t-61 -126.5q-14 -63 -18 -145t-16 -174 h249l-36 -168h-246q-20 -86 -71.5 -179t-137.5 -171l4 -6q55 -4 108.5 -17.5t106.5 -29t108.5 -27.5t116.5 -12q96 0 199 39l-92 -201q-57 -27 -93 -34t-71 -7q-82 0 -153.5 21.5t-140.5 46t-135.5 46t-135.5 21.5q-43 0 -99.5 -13.5t-121.5 -60.5z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1210" d="M2 82l176 147q-20 35 -29.5 80t-9.5 88q0 70 27 142.5t117 169.5l-123 147l137 113l119 -146q72 41 133 60.5t127 19.5q133 0 225 -80l180 146l90 -111l-178 -149q39 -84 39 -172q0 -70 -27.5 -142.5t-111.5 -165.5l119 -147l-140 -113l-120 146q-129 -82 -256 -82 q-63 0 -117.5 19.5t-110.5 62.5l-180 -146zM307 420q0 -96 61.5 -160.5t161.5 -64.5q63 0 124 25.5t108 69.5t74.5 103.5t27.5 124.5q0 94 -59.5 159.5t-159.5 65.5q-63 0 -123.5 -25.5t-108.5 -69.5t-77 -102t-29 -126z" /> +<glyph unicode="&#xa5;" horiz-adv-x="1331" d="M180 354l35 168h320l6 25l-33 84h-268l34 168h168l-215 553h265l215 -613l462 613h261l-453 -553h156l-35 -168h-258l-62 -76l-8 -33h303l-35 -168h-303l-76 -354h-235l76 354h-320z" /> +<glyph unicode="&#xa6;" horiz-adv-x="532" d="M-6 -233l168 794h209l-168 -794h-209zM209 778l168 795h209l-168 -795h-209z" /> +<glyph unicode="&#xa7;" horiz-adv-x="888" d="M10 -37l101 158q33 -29 72.5 -45.5t74.5 -16.5q33 0 60.5 15.5t46 41t28.5 57.5t10 65q0 47 -20.5 84.5t-51 71.5t-67.5 68t-67.5 70.5t-51 80.5t-20.5 100q0 43 15.5 88t41 87t60 77.5t75.5 60.5q-6 27 -6 61q0 92 37 161t92.5 114t120 67.5t121.5 22.5 q68 0 133.5 -27.5t106.5 -66.5l-103 -158q-33 29 -71.5 45.5t-73.5 16.5q-66 0 -107 -49.5t-41 -120.5q0 -74 44 -127.5t96.5 -104.5t96.5 -110.5t44 -141.5q0 -45 -15.5 -90t-42 -86t-61.5 -77t-74 -60q6 -29 7 -62q0 -92 -37 -160.5t-92.5 -113.5t-121 -67.5t-120.5 -22.5 q-68 0 -133.5 27.5t-106.5 66.5zM319 780q0 -55 27 -99t65 -87t81 -87t75 -95q18 29 31.5 61.5t13.5 67.5q0 53 -26.5 98t-65.5 87t-81 86t-74 95q-20 -27 -33 -59.5t-13 -67.5z" /> +<glyph unicode="&#xa8;" horiz-adv-x="450" d="M266 1247q0 27 12.5 51.5t33 44t47 31.5t53.5 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13.5 -50.5t-35 -42t-47 -29.5t-52.5 -11q-41 0 -67.5 28.5t-26.5 69.5zM545 1247q0 27 12 51.5t32.5 44t47.5 31.5t53 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13 -50.5t-34.5 -42 t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1460" d="M131 621q0 143 64.5 274t172 229.5t245 156.5t282.5 58q113 0 206 -39.5t159.5 -108.5t103.5 -162t37 -200q0 -147 -65.5 -278t-173 -230.5t-248 -157t-289.5 -57.5q-109 0 -200 40t-156.5 110t-101.5 164.5t-36 200.5zM258 633q0 -88 27.5 -164t78 -132t122 -88 t157.5 -32q123 0 236.5 47t199.5 129t137.5 190.5t51.5 231.5q0 86 -28 162t-79 132t-123.5 88t-160.5 32q-121 0 -233 -47t-198 -129t-137 -189.5t-51 -230.5zM410 651q0 78 25.5 154t77.5 136t132 97t189 37q68 0 131 -15.5t98 -41.5l-64 -144q-25 18 -83 34t-111 16 q-59 0 -101 -22.5t-70 -58.5t-41 -79t-13 -82q0 -66 34.5 -114t110.5 -48q57 0 120.5 22.5t108.5 51.5l-6 -145q-47 -27 -120.5 -49.5t-151.5 -22.5q-70 0 -120 21.5t-83 59.5t-48 88t-15 105z" /> +<glyph unicode="&#xaa;" horiz-adv-x="745" d="M170 868q0 117 97.5 183.5t260.5 66.5h52l4 19q2 8 3 14t1 14q0 35 -32 53.5t-77 18.5q-53 0 -95 -18.5t-83 -42.5l-4 112q94 59 215 60q96 0 160.5 -39t64.5 -133q0 -25 -6 -50l-78 -370h-123l9 75h-9q-41 -41 -103 -66.5t-122 -25.5q-66 0 -100.5 36t-34.5 93zM319 903 q0 -53 62 -53q41 0 84 19.5t72 50.5l24 112h-22q-121 0 -170.5 -33t-49.5 -96z" /> +<glyph unicode="&#xab;" horiz-adv-x="1081" d="M70 489l2 11l350 360h229l-372 -362l-3 -11l220 -362h-232zM467 489l2 11l350 360h230l-373 -362l-2 -11l219 -362h-231z" /> +<glyph unicode="&#xac;" horiz-adv-x="1271" d="M135 561l35 168h983l-102 -489h-191l68 321h-793z" /> +<glyph unicode="&#xad;" horiz-adv-x="956" d="M102 406l35 167h688l-34 -167h-689z" /> +<glyph unicode="&#xae;" horiz-adv-x="1460" d="M131 621q0 143 64.5 274t172 229.5t245 156.5t282.5 58q113 0 206 -39.5t159.5 -108.5t103.5 -162t37 -200q0 -147 -65.5 -278t-173 -230.5t-248 -157t-289.5 -57.5q-109 0 -200 40t-156.5 110t-101.5 164.5t-36 200.5zM258 633q0 -88 27.5 -164t78 -132t122 -88 t157.5 -32q123 0 236.5 47t199.5 129t137.5 190.5t51.5 231.5q0 86 -28 162t-79 132t-123.5 88t-160.5 32q-121 0 -233 -47t-198 -129t-137 -189.5t-51 -230.5zM477 412l144 671q16 2 40.5 3t50 2.5t47.5 1.5h34q70 0 115.5 -12.5t73.5 -35t39 -53.5t11 -67 q0 -76 -43 -137.5t-115 -96.5l97 -276h-146l-73 243h-86l-52 -243h-137zM686 754h62q66 0 107.5 47t41.5 102q0 37 -27.5 62.5t-99.5 25.5h-33z" /> +<glyph unicode="&#xaf;" horiz-adv-x="1705" /> +<glyph unicode="&#xb0;" horiz-adv-x="755" d="M197 1024q0 63 23.5 121.5t68.5 103.5t108.5 72t141.5 27q121 0 177 -62.5t56 -155.5q0 -59 -21.5 -115.5t-64.5 -100.5t-107.5 -70.5t-152.5 -26.5q-61 0 -105.5 16.5t-72 45t-39.5 65.5t-12 80zM344 1057q0 -47 25.5 -81t83.5 -34q43 0 74.5 15.5t52 39t29.5 54t9 61.5 q0 41 -24.5 73t-81.5 32q-43 0 -74.5 -14.5t-52 -37t-31 -51t-10.5 -57.5z" /> +<glyph unicode="&#xb1;" horiz-adv-x="946" d="M47 84l35 168h657l-34 -168h-658zM156 582l34 168h238l39 182h188l-39 -182h228l-35 -168h-227l-45 -207h-189l45 207h-237z" /> +<glyph unicode="&#xb2;" horiz-adv-x="768" d="M127 612l27 127q66 59 145.5 111.5t149 103t116.5 102.5t47 113q0 23 -14 46.5t-55 23.5q-53 0 -120 -36t-124 -93l-8 131q80 59 151.5 90t143.5 31q88 0 134 -45t46 -115q0 -61 -32 -116.5t-89 -110.5t-136 -112.5t-173 -123.5h334l-27 -127h-516z" /> +<glyph unicode="&#xb3;" horiz-adv-x="694" d="M121 680l51 123q35 -35 67.5 -56.5t94.5 -21.5q94 0 137 43t43 109q0 41 -32.5 64.5t-119.5 23.5h-24l22 110h31q76 0 114 32t38 81q0 23 -15.5 37t-56.5 14q-53 0 -97 -18.5t-75 -40.5l2 120q53 29 98 45.5t103 16.5q90 0 138 -42t48 -108q0 -68 -37 -110.5t-96 -75.5 q47 -16 74.5 -53t27.5 -90q0 -51 -21.5 -101.5t-63.5 -90.5t-106.5 -64.5t-150.5 -24.5q-76 0 -115.5 20.5t-78.5 57.5z" /> +<glyph unicode="&#xb4;" horiz-adv-x="448" d="M250 1171l10 15l412 207q12 6 22 6q23 0 32 -25.5t9 -54.5t-11 -54.5t-32 -31.5l-413 -141l-15 6z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1175" d="M-102 -227q51 70 93 132t75.5 125.5t58.5 129t41 141.5l137 641h225l-131 -612q-6 -29 -6 -49q0 -59 34 -91t93 -32q72 0 142.5 49t117.5 139l125 596h227l-198 -942h-176l14 131h-8q-33 -47 -74 -76.5t-86 -47t-91 -25t-89 -7.5q-86 0 -148 25l-8 -16q-20 -43 -39.5 -80 t-40 -73t-44 -74t-52.5 -81z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1150" d="M141 842q0 123 44 219t124 162.5t189.5 102.5t238.5 36q78 0 187.5 -3t208.5 -7l-326 -1528h-174l285 1341h-91l-284 -1341h-185l146 684h-43q-80 0 -139.5 26.5t-99.5 71.5t-60.5 105.5t-20.5 130.5z" /> +<glyph unicode="&#xb7;" horiz-adv-x="540" d="M106 473q0 33 15.5 63.5t41 55t58.5 40t66 15.5q51 0 86 -39t35 -90q0 -33 -16.5 -62.5t-43 -53t-59.5 -37t-64 -13.5q-53 0 -86 35t-33 86z" /> +<glyph unicode="&#xb8;" horiz-adv-x="413" d="M-84 -395l78 98h14q23 -10 56.5 -17.5t68.5 -7.5q41 0 73 15.5t32 58.5q0 29 -22.5 40t-51.5 11q-25 0 -52.5 -4t-50.5 -10l-26 53l137 158h111l-68 -84q31 8 59 8q61 0 96.5 -38t35.5 -97q0 -47 -25 -89t-67 -75t-96 -52t-116 -19q-53 0 -100 11t-86 27v13z" /> +<glyph unicode="&#xb9;" horiz-adv-x="509" d="M203 1206l329 156l-159 -750h-154l117 545l-129 -57z" /> +<glyph unicode="&#xba;" horiz-adv-x="802" d="M188 985q0 74 29 143.5t79 123t119.5 85t151.5 31.5q61 0 108.5 -20.5t78 -56.5t46 -83t15.5 -98q0 -70 -25.5 -136.5t-74.5 -119.5t-120 -86t-161 -33q-66 0 -112 20.5t-75.5 55.5t-44 80t-14.5 94zM356 1008q0 -53 27 -90t84 -37q49 0 83 18.5t55.5 48t30.5 66.5t9 73 q0 53 -27.5 91.5t-87.5 38.5q-53 0 -86.5 -21.5t-53 -52.5t-27 -67.5t-7.5 -67.5z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1081" d="M2 125l375 362l2 11l-221 362h229l199 -360l-2 -11l-351 -364h-231zM399 125l375 362l2 11l-221 362h229l199 -360l-2 -11l-350 -364h-232z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1583" d="M51 -49l1260 1464h184l-1259 -1464h-185zM207 1206l330 156l-160 -750h-154l117 545l-129 -57zM842 186l26 127l394 437h211l-93 -437h70l-27 -127h-69l-39 -186h-139l38 186h-372zM1016 313h225l68 316z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1593" d="M55 -49l1260 1464h184l-1259 -1464h-185zM207 1206l330 156l-160 -750h-154l117 545l-129 -57zM868 0l27 127q66 59 145.5 111.5t149.5 102.5t117 102.5t47 113.5q0 23 -14.5 46.5t-55.5 23.5q-53 0 -119.5 -36t-124.5 -93l-8 131q80 59 151.5 90t143.5 31 q88 0 134 -45.5t46 -114.5q0 -61 -31.5 -116.5t-89 -111t-136.5 -112.5t-173 -123h334l-27 -127h-516z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1583" d="M94 -49l1260 1464h184l-1259 -1464h-185zM98 680l52 123q35 -35 67.5 -56.5t93.5 -21.5q94 0 137.5 43t43.5 109q0 41 -33 64.5t-119 23.5h-25l23 110h31q76 0 113.5 32t37.5 81q0 23 -15.5 37t-55.5 14q-53 0 -97.5 -18.5t-75.5 -40.5l3 120q53 29 98 45.5t102 16.5 q90 0 138.5 -42t48.5 -108q0 -68 -37 -110.5t-97 -75.5q47 -16 75 -53t28 -90q0 -51 -21.5 -101.5t-63.5 -90.5t-106.5 -64.5t-150.5 -24.5q-76 0 -116 20.5t-79 57.5zM844 186l26 127l394 437h211l-93 -437h70l-27 -127h-69l-39 -186h-139l39 186h-373zM1018 313h225 l68 316z" /> +<glyph unicode="&#xbf;" horiz-adv-x="831" d="M-59 -188q0 72 24.5 130t64.5 110t88 105.5t94 115t85 136t61 171.5h213q-20 -100 -59 -178t-83 -140.5t-90 -113t-83 -97.5t-60.5 -92t-23.5 -98q0 -63 40 -89t93 -26q66 0 135.5 28.5t116.5 73.5l10 -196q-66 -43 -158 -75t-184 -32q-131 0 -207.5 75t-76.5 192z M360 809q0 33 17.5 62.5t44.5 53t59.5 37t65.5 13.5q51 0 83 -36t32 -85q0 -33 -15.5 -62.5t-41 -53t-57.5 -37t-65 -13.5q-53 0 -88 36t-35 85z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1292" d="M-104 2l811 1352h202l291 -1352h-256l-70 393h-509l-224 -393h-245zM469 580h371l-88 497zM655 1610q0 18 7.5 40.5t19.5 42t27.5 32t31.5 12.5q8 0 19 -6l325 -207l2 -15l-45 -73l-16 -6l-354 141q-17 6 -17 39z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1292" d="M-106 0l811 1352h202l291 -1352h-256l-70 393h-510l-223 -393h-245zM467 578h371l-88 497zM625 1511l8 15l414 207q12 6 20 6q23 0 33 -25.5t10 -54.5t-11.5 -54.5t-31.5 -31.5l-414 -141l-14 6z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1292" d="M-106 0l811 1352h202l291 -1352h-256l-70 393h-510l-223 -393h-245zM467 578h371l-88 497zM623 1507l10 15l268 202h17l182 -202l2 -15l-45 -59l-15 -6l-176 84l-209 -84l-14 6z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1292" d="M-106 0l811 1352h202l291 -1352h-256l-70 393h-510l-223 -393h-245zM467 578h371l-88 497zM543 1511q18 37 39.5 71t49 59.5t63.5 41t87 15.5q59 0 127 -14.5t123 -14.5q37 0 79 11.5t89 41.5l14 -47q-12 -33 -32.5 -66.5t-48 -60t-63.5 -44t-81 -17.5q-25 0 -55.5 4 t-66.5 10t-72.5 10.5t-71.5 4.5q-47 0 -88 -11.5t-76 -40.5z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1292" d="M-106 0l811 1352h202l291 -1352h-256l-70 393h-510l-223 -393h-245zM467 578h371l-88 497zM621 1585q0 27 12 51.5t32.5 44t47 31.5t53.5 12q41 0 69.5 -31.5t28.5 -72.5q0 -27 -13 -50.5t-34.5 -42t-48.5 -29.5t-53 -11q-41 0 -67.5 28.5t-26.5 69.5zM899 1585 q0 27 12.5 51.5t33 44t47 31.5t52.5 12q41 0 70 -31.5t29 -72.5q0 -27 -14.5 -50.5t-36 -42t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1304" d="M-109 0l795 1300q-29 16 -43 48t-14 67q0 39 18.5 77t51 66.5t76.5 46t93 17.5q78 0 120 -46t42 -108q0 -53 -32.5 -97t-79.5 -71l294 -1300h-264l-65 414h-510l-228 -414h-254zM477 598h371l-92 477zM752 1432q0 -29 17 -50.5t46 -21.5q35 0 62.5 29.5t27.5 64.5 q0 29 -15.5 47.5t-43.5 18.5q-41 0 -67.5 -26.5t-26.5 -61.5z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1556" d="M-139 0l1007 1352h736l-43 -209h-416l-68 -322h277l-43 -209h-279l-86 -403h457l-45 -209h-678l82 389h-363l-288 -389h-250zM551 594h254l102 479z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1292" d="M111 508q0 166 57 320.5t166.5 272.5t266.5 189.5t355 71.5q111 0 216.5 -23.5t177.5 -64.5l-105 -213q-55 45 -141 72.5t-203 27.5q-147 0 -249.5 -53t-166 -141t-92 -202t-28.5 -233q0 -174 81.5 -265t241.5 -91q123 0 231.5 37t186.5 90l18 -203q-86 -47 -199.5 -82.5 t-248.5 -40.5l-47 -61q16 4 32.5 6t28.5 2q59 0 94 -38t35 -97q0 -47 -24.5 -89t-66.5 -75t-96 -52t-116 -19q-53 0 -100 11t-86 27v13l80 98h14q20 -10 54 -17.5t69 -7.5q41 0 72.5 15.5t31.5 58.5q0 29 -21.5 40t-51.5 11q-25 0 -51.5 -4t-49.5 -10l-28 53l118 138 q-119 10 -205 56t-142 116.5t-82.5 162t-26.5 193.5z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1081" d="M61 0l287 1352h782l-43 -205h-548l-70 -328h412l-43 -205h-412l-86 -409h588l-43 -205h-824zM582 1610q0 18 7 40.5t19.5 42t27.5 32t32 12.5q8 0 20 -6l324 -207l4 -15l-47 -73l-17 -6l-354 141q-16 6 -16 39z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1081" d="M61 0l287 1352h782l-43 -205h-548l-70 -328h412l-43 -205h-412l-86 -409h588l-43 -205h-824zM584 1509l8 15l414 207q12 6 20 6q23 0 33 -25.5t10 -54.5t-11 -54.5t-32 -31.5l-414 -141l-14 6z" /> +<glyph unicode="&#xca;" horiz-adv-x="1081" d="M61 0l287 1352h782l-43 -205h-548l-70 -328h412l-43 -205h-412l-86 -409h588l-43 -205h-824zM567 1507l11 15l268 202h16l182 -202l3 -15l-46 -59l-14 -6l-176 84l-209 -84l-14 6z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1081" d="M61 0l287 1352h782l-43 -205h-548l-70 -328h412l-43 -205h-412l-86 -409h588l-43 -205h-824zM549 1587q0 27 13 51.5t33.5 44t46.5 31.5t52 12q41 0 70 -31.5t29 -72.5q0 -27 -13.5 -50.5t-35 -42t-48 -29.5t-51.5 -11q-43 0 -69.5 28.5t-26.5 69.5zM827 1587 q0 27 13.5 51.5t34 44t46 31.5t52.5 12q41 0 69.5 -31.5t28.5 -72.5q0 -27 -13.5 -50.5t-35 -42t-48 -29.5t-50.5 -11q-43 0 -70 28.5t-27 69.5z" /> +<glyph unicode="&#xcc;" horiz-adv-x="595" d="M61 0l287 1352h236l-287 -1352h-236zM270 1610q0 18 7.5 40.5t19.5 42t27.5 32t31.5 12.5q8 0 21 -6l323 -207l5 -15l-48 -73l-16 -6l-354 141q-17 6 -17 39z" /> +<glyph unicode="&#xcd;" horiz-adv-x="595" d="M61 0l287 1352h236l-287 -1352h-236zM297 1509l8 15l414 207q12 6 20 6q23 0 33 -25.5t10 -54.5t-11 -54.5t-32 -31.5l-413 -141l-15 6z" /> +<glyph unicode="&#xce;" horiz-adv-x="595" d="M61 0l287 1352h236l-287 -1352h-236zM254 1507l10 15l268 202h17l182 -202l2 -15l-45 -59l-14 -6l-176 84l-209 -84l-15 6z" /> +<glyph unicode="&#xcf;" horiz-adv-x="595" d="M61 0l287 1352h236l-287 -1352h-236zM262 1585q0 27 12.5 51.5t33 44t47 31.5t53.5 12q41 0 69.5 -31.5t28.5 -72.5q0 -27 -13.5 -50.5t-35 -42t-48 -29.5t-53.5 -11q-41 0 -67.5 28.5t-26.5 69.5zM541 1585q0 27 12 51.5t32.5 44t47 31.5t53.5 12q41 0 69.5 -31.5 t28.5 -72.5q0 -27 -13 -50.5t-34.5 -42t-48 -29.5t-53.5 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1468" d="M57 637l33 151h152l118 564q29 2 86.5 4t121 3t122 2t90.5 1q197 0 318 -41t188 -113q59 -63 86 -165.5t27 -213.5q0 -203 -59.5 -360.5t-178.5 -267t-297 -167t-415 -57.5q-86 0 -184.5 6.5t-190.5 16.5l135 637h-152zM348 180q55 -4 108.5 -6t90.5 -2q180 0 297 48 t185.5 135t95 207t26.5 263q0 166 -94 253t-322 87h-77q-48 0 -101 -2l-80 -375h303l-32 -151h-304z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1478" d="M61 0l287 1352h289l383 -994l211 994h235l-286 -1352h-289l-383 991l-211 -991h-236zM590 1511q18 37 39.5 71t49.5 59.5t63.5 41t86.5 15.5q59 0 127 -14.5t123 -14.5q37 0 79 11.5t89 41.5l15 -47q-12 -33 -33 -66.5t-48.5 -60t-63.5 -44t-81 -17.5q-25 0 -55.5 4 t-66 10t-72.5 10.5t-72 4.5q-47 0 -88 -11.5t-76 -40.5z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1531" d="M109 510q0 168 59 321.5t168.5 271.5t262.5 188.5t339 70.5q135 0 234.5 -43t166 -118t99 -174t32.5 -212q0 -154 -57 -303.5t-166.5 -269t-265.5 -193.5t-352 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM354 514q0 -152 83 -245t249 -93q135 0 237.5 57.5 t170 148.5t101.5 204.5t34 228.5q0 76 -20.5 139.5t-63.5 109.5t-108.5 71.5t-157.5 25.5q-141 0 -240.5 -58.5t-162 -151.5t-92.5 -208.5t-30 -228.5zM702 1610q0 18 8.5 40.5t20.5 42t27.5 32t32.5 12.5q8 0 18 -6l326 -207l2 -15l-47 -73l-17 -6l-354 141q-17 6 -17 39z " /> +<glyph unicode="&#xd3;" horiz-adv-x="1531" d="M109 510q0 168 59 321.5t168.5 271.5t262.5 188.5t339 70.5q135 0 234.5 -43t166 -118t99 -174t32.5 -212q0 -154 -57 -303.5t-166.5 -269t-265.5 -193.5t-352 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM354 514q0 -152 83 -245t249 -93q135 0 237.5 57.5 t170 148.5t101.5 204.5t34 228.5q0 76 -20.5 139.5t-63.5 109.5t-108.5 71.5t-157.5 25.5q-141 0 -240.5 -58.5t-162 -151.5t-92.5 -208.5t-30 -228.5zM819 1509l10 15l412 207q12 6 23 6q23 0 32 -25.5t9 -54.5t-10.5 -54.5t-30.5 -31.5l-414 -141l-16 6z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1531" d="M109 510q0 168 59 321.5t168.5 271.5t262.5 188.5t339 70.5q135 0 234.5 -43t166 -118t99 -174t32.5 -212q0 -154 -57 -303.5t-166.5 -269t-265.5 -193.5t-352 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM354 514q0 -152 83 -245t249 -93q135 0 237.5 57.5 t170 148.5t101.5 204.5t34 228.5q0 76 -20.5 139.5t-63.5 109.5t-108.5 71.5t-157.5 25.5q-141 0 -240.5 -58.5t-162 -151.5t-92.5 -208.5t-30 -228.5zM750 1507l8 15l268 202h16l183 -202l4 -15l-45 -59l-17 -6l-174 84l-211 -84l-12 6z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1531" d="M109 510q0 168 59 321.5t168.5 271.5t262.5 188.5t339 70.5q135 0 234.5 -43t166 -118t99 -174t32.5 -212q0 -154 -57 -303.5t-166.5 -269t-265.5 -193.5t-352 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM354 514q0 -152 83 -245t249 -93q135 0 237.5 57.5 t170 148.5t101.5 204.5t34 228.5q0 76 -20.5 139.5t-63.5 109.5t-108.5 71.5t-157.5 25.5q-141 0 -240.5 -58.5t-162 -151.5t-92.5 -208.5t-30 -228.5zM651 1511q20 37 41 71t48.5 59.5t64.5 41t88 15.5q59 0 126.5 -14.5t123.5 -14.5q37 0 78 11.5t88 41.5l14 -47 q-12 -33 -32.5 -66.5t-48.5 -60t-62.5 -44t-79.5 -17.5q-25 0 -55.5 4t-66.5 10t-73 10.5t-71 4.5q-47 0 -89.5 -11.5t-76.5 -40.5z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1531" d="M109 510q0 168 59 321.5t168.5 271.5t262.5 188.5t339 70.5q135 0 234.5 -43t166 -118t99 -174t32.5 -212q0 -154 -57 -303.5t-166.5 -269t-265.5 -193.5t-352 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM354 514q0 -152 83 -245t249 -93q135 0 237.5 57.5 t170 148.5t101.5 204.5t34 228.5q0 76 -20.5 139.5t-63.5 109.5t-108.5 71.5t-157.5 25.5q-141 0 -240.5 -58.5t-162 -151.5t-92.5 -208.5t-30 -228.5zM731 1585q0 27 12.5 51.5t33 44t46 31.5t51.5 12q41 0 70 -31.5t29 -72.5q0 -27 -13.5 -50.5t-35 -42t-48 -29.5 t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5zM1010 1585q0 27 12 51.5t32.5 44t46 31.5t52.5 12q41 0 69.5 -31.5t28.5 -72.5q0 -27 -13 -50.5t-34.5 -42t-48.5 -29.5t-51 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#xd7;" horiz-adv-x="929" d="M61 258l281 231l-182 230l129 106l182 -229l283 233l84 -106l-283 -234l184 -235l-127 -104l-186 233l-281 -231z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1533" d="M-31 41l201 188q-31 61 -45 132t-14 149q0 168 59 321.5t169 271.5t262.5 188.5t338.5 70.5q102 0 183 -25.5t145 -70.5l176 166l139 -127l-188 -179q78 -137 78 -311q0 -154 -57.5 -303.5t-167 -269t-265.5 -193.5t-352 -74q-111 0 -196 28t-148 79l-191 -180zM354 514 q0 -29 2 -53.5t9 -46.5l731 690q-82 57 -217 57q-141 0 -240.5 -58.5t-162 -151.5t-92.5 -208.5t-30 -228.5zM461 246q86 -70 225 -70q135 0 237.5 57.5t170 148.5t101.5 204.5t34 228.5q0 78 -21 137z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1443" d="M133 346q0 66 14 129l187 877h235l-176 -828q-8 -33 -11 -62.5t-3 -55.5q0 -123 69.5 -176.5t196.5 -53.5q154 0 257.5 81t144.5 267l176 828h225l-186 -877q-23 -100 -74 -190t-135 -159t-200 -109t-263 -40q-123 0 -210 29t-142.5 78t-80 116.5t-24.5 145.5zM690 1610 q0 18 8.5 40.5t20.5 42t27.5 32t31.5 12.5q8 0 19 -6l325 -207l2 -15l-45 -73l-18 -6l-352 141q-19 6 -19 39z" /> +<glyph unicode="&#xda;" horiz-adv-x="1443" d="M133 346q0 66 14 129l187 877h235l-176 -828q-8 -33 -11 -62.5t-3 -55.5q0 -123 69.5 -176.5t196.5 -53.5q154 0 257.5 81t144.5 267l176 828h225l-186 -877q-23 -100 -74 -190t-135 -159t-200 -109t-263 -40q-123 0 -210 29t-142.5 78t-80 116.5t-24.5 145.5zM727 1509 l10 15l412 207q12 6 22 6q23 0 32 -25.5t9 -54.5t-10 -54.5t-31 -31.5l-413 -141l-15 6z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1443" d="M133 346q0 66 14 129l187 877h235l-176 -828q-8 -33 -11 -62.5t-3 -55.5q0 -123 69.5 -176.5t196.5 -53.5q154 0 257.5 81t144.5 267l176 828h225l-186 -877q-23 -100 -74 -190t-135 -159t-200 -109t-263 -40q-123 0 -210 29t-142.5 78t-80 116.5t-24.5 145.5zM676 1507 l8 15l270 202h17l180 -202l4 -15l-45 -59l-16 -6l-174 84l-211 -84l-13 6z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1443" d="M133 346q0 66 14 129l187 877h235l-176 -828q-8 -33 -11 -62.5t-3 -55.5q0 -123 69.5 -176.5t196.5 -53.5q154 0 257.5 81t144.5 267l176 828h225l-186 -877q-23 -100 -74 -190t-135 -159t-200 -109t-263 -40q-123 0 -210 29t-142.5 78t-80 116.5t-24.5 145.5zM709 1585 q0 27 12 51.5t32.5 44t47 31.5t53.5 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13 -50.5t-34.5 -42t-48.5 -29.5t-51 -11q-41 0 -67.5 28.5t-26.5 69.5zM987 1585q0 27 12.5 51.5t33 44t47 31.5t53.5 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13.5 -50.5t-35 -42t-48 -29.5 t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1150" d="M137 1352h264l215 -613l463 613h260l-651 -797l-117 -555h-235l115 547zM627 1509l10 15l412 207q12 6 22 6q23 0 33 -25.5t10 -54.5t-11 -54.5t-32 -31.5l-414 -141l-14 6z" /> +<glyph unicode="&#xde;" horiz-adv-x="1091" d="M61 0l287 1352h236l-47 -226h90q201 0 316.5 -89t115.5 -259q0 -98 -37 -189t-108.5 -162t-178 -113t-248.5 -42h-68q-34 0 -65 2l-57 -274h-236zM397 471q29 -2 61 -2h66q141 0 211 83t70 214q0 72 -41 118t-146 46h-63q-31 0 -61 -2z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1132" d="M23 0l210 995q25 115 71 209t111.5 162t149.5 104.5t187 36.5q68 0 119 -19.5t86.5 -51t54 -74.5t18.5 -90q0 -55 -22.5 -103.5t-57.5 -90.5t-73.5 -81t-73.5 -74.5t-57.5 -70.5t-22.5 -70t22.5 -63.5t56.5 -57t73.5 -58.5t73.5 -66.5t56.5 -85t22.5 -111.5 q0 -106 -43 -181t-106.5 -123t-134 -69.5t-126.5 -21.5q-74 0 -130 27.5t-89 62.5l105 215q23 -59 63.5 -98t102.5 -39q51 0 95 50t44 144q0 55 -21.5 95t-53.5 72t-69.5 58.5t-69.5 56t-53.5 66.5t-21.5 88q0 88 45 151.5t100.5 119t100.5 110t45 121.5q0 41 -24.5 68.5 t-77.5 27.5q-66 0 -110 -28.5t-74.5 -76.5t-51 -110.5t-35.5 -130.5l-211 -995h-204z" /> +<glyph unicode="&#xe0;" d="M57 367q0 111 37 219t106.5 194t171 139.5t230.5 53.5q98 0 177 -33t114 -92h8l43 94h176l-200 -942h-181l11 129h-9q-72 -63 -153.5 -108.5t-192.5 -45.5q-80 0 -143.5 30t-106.5 82t-65.5 124t-22.5 156zM283 389q0 -47 10 -91t31.5 -78t55.5 -54.5t81 -20.5 q33 0 71.5 9.5t78.5 26t77 40t66 53.5l84 394q-47 76 -104.5 103.5t-117.5 27.5q-80 0 -141 -36t-104 -94.5t-65.5 -131t-22.5 -148.5zM485 1268q0 18 8.5 40.5t20.5 42t27.5 32t31.5 12.5q8 0 19 -6l326 -207l2 -15l-46 -73l-18 -7l-352 142q-19 6 -19 39z" /> +<glyph unicode="&#xe1;" d="M57 367q0 111 37 219t106.5 194t171 139.5t230.5 53.5q98 0 177 -33t114 -92h8l43 94h176l-200 -942h-181l11 129h-9q-72 -63 -153.5 -108.5t-192.5 -45.5q-80 0 -143.5 30t-106.5 82t-65.5 124t-22.5 156zM283 389q0 -47 10 -91t31.5 -78t55.5 -54.5t81 -20.5 q33 0 71.5 9.5t78.5 26t77 40t66 53.5l84 394q-47 76 -104.5 103.5t-117.5 27.5q-80 0 -141 -36t-104 -94.5t-65.5 -131t-22.5 -148.5zM614 1169l11 15l411 207q12 6 23 6q23 0 33 -25.5t10 -54.5t-11.5 -54.5t-31.5 -31.5l-414 -141l-14 6z" /> +<glyph unicode="&#xe2;" d="M57 367q0 111 37 219t106.5 194t171 139.5t230.5 53.5q98 0 177 -33t114 -92h8l43 94h176l-200 -942h-181l11 129h-9q-72 -63 -153.5 -108.5t-192.5 -45.5q-80 0 -143.5 30t-106.5 82t-65.5 124t-22.5 156zM283 389q0 -47 10 -91t31.5 -78t55.5 -54.5t81 -20.5 q33 0 71.5 9.5t78.5 26t77 40t66 53.5l84 394q-47 76 -104.5 103.5t-117.5 27.5q-80 0 -141 -36t-104 -94.5t-65.5 -131t-22.5 -148.5zM504 1161l8 15l268 202h17l182 -202l4 -15l-47 -59l-14 -6l-174 84l-211 -84l-15 6z" /> +<glyph unicode="&#xe3;" d="M57 367q0 111 37 219t106.5 194t171 139.5t230.5 53.5q98 0 177 -33t114 -92h8l43 94h176l-200 -942h-181l11 129h-9q-72 -63 -153.5 -108.5t-192.5 -45.5q-80 0 -143.5 30t-106.5 82t-65.5 124t-22.5 156zM283 389q0 -47 10 -91t31.5 -78t55.5 -54.5t81 -20.5 q33 0 71.5 9.5t78.5 26t77 40t66 53.5l84 394q-47 76 -104.5 103.5t-117.5 27.5q-80 0 -141 -36t-104 -94.5t-65.5 -131t-22.5 -148.5zM444 1184q18 37 40 70.5t49.5 59t63.5 41t87 15.5q59 0 127 -14.5t123 -14.5q37 0 79 11.5t89 42.5l14 -47q-12 -33 -32.5 -67t-48 -60.5 t-63.5 -44t-81 -17.5q-25 0 -55.5 4t-66.5 10.5t-73 10.5t-71 4q-47 0 -88 -11.5t-76 -39.5z" /> +<glyph unicode="&#xe4;" d="M57 367q0 111 37 219t106.5 194t171 139.5t230.5 53.5q98 0 177 -33t114 -92h8l43 94h176l-200 -942h-181l11 129h-9q-72 -63 -153.5 -108.5t-192.5 -45.5q-80 0 -143.5 30t-106.5 82t-65.5 124t-22.5 156zM283 389q0 -47 10 -91t31.5 -78t55.5 -54.5t81 -20.5 q33 0 71.5 9.5t78.5 26t77 40t66 53.5l84 394q-47 76 -104.5 103.5t-117.5 27.5q-80 0 -141 -36t-104 -94.5t-65.5 -131t-22.5 -148.5zM522 1235q0 27 12.5 51.5t33 44t47 31.5t53.5 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13.5 -50.5t-35 -42t-48 -29.5t-51.5 -11 q-41 0 -67.5 28.5t-26.5 69.5zM801 1235q0 27 12 51.5t32.5 44t47.5 31.5t53 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13 -50.5t-34.5 -42t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#xe5;" d="M57 367q0 111 37 219t106.5 194t171 139.5t230.5 53.5q98 0 177 -33t114 -92h8l43 94h176l-200 -942h-181l11 129h-9q-72 -63 -153.5 -108.5t-192.5 -45.5q-80 0 -143.5 30t-106.5 82t-65.5 124t-22.5 156zM283 389q0 -47 10 -91t31.5 -78t55.5 -54.5t81 -20.5 q33 0 71.5 9.5t78.5 26t77 40t66 53.5l84 394q-47 76 -104.5 103.5t-117.5 27.5q-80 0 -141 -36t-104 -94.5t-65.5 -131t-22.5 -148.5zM598 1223q0 37 17.5 71.5t47 62t71.5 45t91 17.5q78 0 118 -45t40 -102q0 -35 -16.5 -69t-46 -61.5t-71.5 -44t-93 -16.5 q-84 0 -121 44.5t-37 97.5zM717 1237q0 -25 15.5 -45.5t43.5 -20.5q35 0 60.5 29t25.5 60q0 27 -14 48t-43 21q-39 0 -63.5 -30.5t-24.5 -61.5z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1642" d="M-2 190q0 90 30.5 156t81 112t115 75.5t131 45t129 21.5t111.5 6h86l4 19q6 27 6 51q0 115 -168 115q-90 0 -161.5 -18.5t-143.5 -49.5l-6 170q162 80 362 80q45 0 92.5 -6t90.5 -21.5t77.5 -41t57.5 -64.5q76 61 170 97t205 36q154 0 233.5 -71t79.5 -200 q0 -39 -8 -77.5t-20.5 -72.5t-28 -60.5t-29.5 -40.5h-596q-6 -35 -6 -68q0 -98 52 -163.5t169 -65.5q76 0 166 28.5t162 71.5v-168q-31 -16 -75 -35.5t-96 -36t-110.5 -28t-120.5 -11.5q-127 0 -209.5 48.5t-123.5 128.5q-109 -98 -231 -137.5t-245 -39.5q-119 0 -176 61.5 t-57 153.5zM246 244q0 -41 27.5 -63.5t76.5 -22.5q29 0 64 7t69.5 22.5t68.5 37t60 49.5l39 191h-14q-68 0 -136.5 -7t-126 -29.5t-93 -66.5t-35.5 -118zM950 610h344q43 0 49 2q4 10 8.5 22.5t4.5 41.5q0 59 -38 90t-93 31q-92 0 -162 -52.5t-113 -134.5z" /> +<glyph unicode="&#xe7;" horiz-adv-x="1001" d="M57 369q0 111 37 219t113 193t190.5 138.5t268.5 53.5q98 0 187 -22.5t138 -59.5l-88 -182q-39 35 -116.5 61.5t-153.5 26.5q-90 0 -152.5 -37t-101.5 -94.5t-56.5 -127t-17.5 -132.5q0 -104 49 -176t156 -72q74 0 163 29.5t156 82.5v-192q-59 -35 -152 -64.5t-196 -36.5 l-49 -61q16 4 32.5 6t29.5 2q59 0 94 -38t35 -97q0 -47 -25 -89t-65.5 -75t-96 -52t-117.5 -19q-53 0 -100 11t-86 27l2 13l78 98h14q20 -10 54 -17.5t69 -7.5q41 0 73 15.5t32 58.5q0 29 -21.5 40t-52.5 11q-25 0 -51.5 -4t-48.5 -10l-29 53l121 138q-82 10 -141.5 43.5 t-98.5 86t-57.5 119t-18.5 140.5z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1034" d="M53 369q0 115 43 223t123 193t191.5 136.5t248.5 51.5q154 0 234 -71t80 -200q0 -39 -8.5 -77.5t-21.5 -72.5t-28.5 -60.5t-27.5 -40.5h-600q-2 -12 -2 -25v-25q0 -51 13 -96t40 -78.5t69 -53t99 -19.5q76 0 166 28.5t162 71.5v-168q-31 -16 -75 -35.5t-96.5 -36 t-110.5 -28t-120 -11.5q-96 0 -166.5 32t-118 85t-71 125t-23.5 152zM334 610h399q4 10 9.5 22.5t5.5 43.5q0 59 -39 90t-95 31q-96 0 -167.5 -53.5t-112.5 -133.5zM420 1268q0 18 7 40.5t19.5 42t29 32t32.5 12.5q6 0 18 -6l324 -207l4 -15l-47 -73l-16 -7l-355 142 q-16 6 -16 39z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1034" d="M53 369q0 115 43 223t123 193t191.5 136.5t248.5 51.5q154 0 234 -71t80 -200q0 -39 -8.5 -77.5t-21.5 -72.5t-28.5 -60.5t-27.5 -40.5h-600q-2 -12 -2 -25v-25q0 -51 13 -96t40 -78.5t69 -53t99 -19.5q76 0 166 28.5t162 71.5v-168q-31 -16 -75 -35.5t-96.5 -36 t-110.5 -28t-120 -11.5q-96 0 -166.5 32t-118 85t-71 125t-23.5 152zM334 610h399q4 10 9.5 22.5t5.5 43.5q0 59 -39 90t-95 31q-96 0 -167.5 -53.5t-112.5 -133.5zM510 1169l10 15l412 207q12 6 22 6q23 0 33 -25.5t10 -54.5t-11 -54.5t-32 -31.5l-413 -141l-15 6z" /> +<glyph unicode="&#xea;" horiz-adv-x="1034" d="M53 369q0 115 43 223t123 193t191.5 136.5t248.5 51.5q154 0 234 -71t80 -200q0 -39 -8.5 -77.5t-21.5 -72.5t-28.5 -60.5t-27.5 -40.5h-600q-2 -12 -2 -25v-25q0 -51 13 -96t40 -78.5t69 -53t99 -19.5q76 0 166 28.5t162 71.5v-168q-31 -16 -75 -35.5t-96.5 -36 t-110.5 -28t-120 -11.5q-96 0 -166.5 32t-118 85t-71 125t-23.5 152zM334 610h399q4 10 9.5 22.5t5.5 43.5q0 59 -39 90t-95 31q-96 0 -167.5 -53.5t-112.5 -133.5zM432 1161l10 15l269 202h16l182 -202l2 -15l-45 -59l-16 -6l-174 84l-211 -84l-12 6z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1034" d="M53 369q0 115 43 223t123 193t191.5 136.5t248.5 51.5q154 0 234 -71t80 -200q0 -39 -8.5 -77.5t-21.5 -72.5t-28.5 -60.5t-27.5 -40.5h-600q-2 -12 -2 -25v-25q0 -51 13 -96t40 -78.5t69 -53t99 -19.5q76 0 166 28.5t162 71.5v-168q-31 -16 -75 -35.5t-96.5 -36 t-110.5 -28t-120 -11.5q-96 0 -166.5 32t-118 85t-71 125t-23.5 152zM334 610h399q4 10 9.5 22.5t5.5 43.5q0 59 -39 90t-95 31q-96 0 -167.5 -53.5t-112.5 -133.5zM430 1235q0 27 12.5 51.5t33 44t46 31.5t51.5 12q41 0 70 -31.5t29 -72.5q0 -27 -13.5 -50.5t-35 -42 t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5zM709 1235q0 27 12 51.5t32.5 44t46 31.5t52.5 12q41 0 69.5 -31.5t28.5 -72.5q0 -27 -13 -50.5t-34.5 -42t-48.5 -29.5t-51 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#xec;" horiz-adv-x="505" d="M20 0l201 942h225l-200 -942h-226zM100 1268q0 18 8.5 40.5t20.5 42t27.5 32t31.5 12.5q8 0 19 -6l325 -207l3 -15l-46 -73l-18 -7l-352 142q-19 6 -19 39z" /> +<glyph unicode="&#xed;" horiz-adv-x="505" d="M20 0l201 942h225l-200 -942h-226zM176 1169l10 15l412 207q12 6 23 6q23 0 33 -25.5t10 -54.5t-11.5 -54.5t-31.5 -31.5l-414 -141l-14 6z" /> +<glyph unicode="&#xee;" horiz-adv-x="505" d="M20 0l201 942h225l-200 -942h-226zM135 1161l8 15l269 202h16l182 -202l4 -15l-47 -59l-14 -6l-176 84l-209 -84l-14 6z" /> +<glyph unicode="&#xef;" horiz-adv-x="505" d="M20 0l201 942h225l-200 -942h-226zM137 1235q0 27 12.5 51.5t33 44t47 31.5t53.5 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13.5 -50.5t-35 -42t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5zM416 1235q0 27 12 51.5t32.5 44t47.5 31.5t53 12q41 0 68.5 -31.5 t27.5 -72.5q0 -27 -13 -50.5t-34.5 -42t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1171" d="M55 365q0 117 41 226t115 194t179.5 136.5t234.5 51.5q104 0 166.5 -36t85.5 -97l6 2q0 10 1 18t1 19q0 66 -15.5 140.5t-44.5 149.5l-252 -59l-14 133l211 51q-39 72 -87 129.5t-101 92.5h301q57 -68 104 -166l268 67l15 -139l-236 -57q27 -86 41.5 -183.5t14.5 -201.5 q0 -84 -10.5 -180.5t-38 -191.5t-73.5 -184.5t-118 -157t-172 -107.5t-234 -40q-106 0 -181 33t-121 87.5t-66.5 124t-20.5 145.5zM299 385q0 -47 10 -91t31.5 -77t56.5 -52.5t82 -19.5q76 0 134.5 37t97.5 95.5t59.5 131t20.5 146.5q0 49 -10.5 93t-33 77t-56.5 52.5 t-83 19.5q-76 0 -134 -37t-97 -95.5t-58.5 -132t-19.5 -147.5z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1126" d="M20 0l201 942h176l-20 -139h8q61 86 161.5 128t205.5 42q57 0 107 -12.5t87 -40t58.5 -71.5t21.5 -108q0 -45 -12 -100l-137 -641h-226l133 623q6 31 7 55q0 113 -115 113q-35 0 -77 -12.5t-84 -36t-80 -58.5t-60 -80l-129 -604h-226zM365 1184q18 37 39.5 70.5t49 59 t63.5 41t87 15.5q59 0 127 -14.5t123 -14.5q37 0 78 11.5t90 42.5l14 -47q-12 -33 -32.5 -67t-48 -60.5t-63.5 -44t-81 -17.5q-25 0 -55.5 4t-66.5 10.5t-72.5 10.5t-71.5 4q-47 0 -88 -11.5t-76 -39.5z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1130" d="M55 365q0 113 39 222t114 195t186.5 138.5t256.5 52.5q102 0 175 -32t120 -86t68.5 -125t21.5 -150q0 -115 -37.5 -223.5t-111.5 -193.5t-184.5 -136.5t-258.5 -51.5q-102 0 -175.5 31t-121 84t-70 124t-22.5 151zM301 385q0 -47 10.5 -91t32 -77t55 -52.5t80.5 -19.5 q76 0 134.5 37t97.5 95.5t59.5 131t20.5 146.5q0 49 -10.5 93t-33 77t-56.5 52.5t-83 19.5q-76 0 -133 -37t-96 -95.5t-58.5 -132t-19.5 -147.5zM418 1268q0 18 8 40.5t20.5 42t27.5 32t32 12.5q8 0 18 -6l326 -207l2 -15l-47 -73l-17 -7l-354 142q-16 6 -16 39z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1130" d="M55 365q0 113 39 222t114 195t186.5 138.5t256.5 52.5q102 0 175 -32t120 -86t68.5 -125t21.5 -150q0 -115 -37.5 -223.5t-111.5 -193.5t-184.5 -136.5t-258.5 -51.5q-102 0 -175.5 31t-121 84t-70 124t-22.5 151zM301 385q0 -47 10.5 -91t32 -77t55 -52.5t80.5 -19.5 q76 0 134.5 37t97.5 95.5t59.5 131t20.5 146.5q0 49 -10.5 93t-33 77t-56.5 52.5t-83 19.5q-76 0 -133 -37t-96 -95.5t-58.5 -132t-19.5 -147.5zM524 1169l11 15l411 207q12 6 23 6q23 0 33 -25.5t10 -54.5t-11.5 -54.5t-31.5 -31.5l-414 -141l-14 6z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1130" d="M55 365q0 113 39 222t114 195t186.5 138.5t256.5 52.5q102 0 175 -32t120 -86t68.5 -125t21.5 -150q0 -115 -37.5 -223.5t-111.5 -193.5t-184.5 -136.5t-258.5 -51.5q-102 0 -175.5 31t-121 84t-70 124t-22.5 151zM301 385q0 -47 10.5 -91t32 -77t55 -52.5t80.5 -19.5 q76 0 134.5 37t97.5 95.5t59.5 131t20.5 146.5q0 49 -10.5 93t-33 77t-56.5 52.5t-83 19.5q-76 0 -133 -37t-96 -95.5t-58.5 -132t-19.5 -147.5zM469 1161l10 15l269 202h16l182 -202l2 -15l-45 -59l-14 -6l-176 84l-209 -84l-15 6z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1130" d="M55 365q0 113 39 222t114 195t186.5 138.5t256.5 52.5q102 0 175 -32t120 -86t68.5 -125t21.5 -150q0 -115 -37.5 -223.5t-111.5 -193.5t-184.5 -136.5t-258.5 -51.5q-102 0 -175.5 31t-121 84t-70 124t-22.5 151zM301 385q0 -47 10.5 -91t32 -77t55 -52.5t80.5 -19.5 q76 0 134.5 37t97.5 95.5t59.5 131t20.5 146.5q0 49 -10.5 93t-33 77t-56.5 52.5t-83 19.5q-76 0 -133 -37t-96 -95.5t-58.5 -132t-19.5 -147.5zM358 1184q18 37 40 70.5t49.5 59t63.5 41t87 15.5q59 0 127 -14.5t123 -14.5q37 0 78 11.5t90 42.5l14 -47q-12 -33 -32.5 -67 t-48 -60.5t-63.5 -44t-81 -17.5q-25 0 -55.5 4t-66.5 10.5t-73 10.5t-71 4q-47 0 -88 -11.5t-76 -39.5z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1130" d="M55 365q0 113 39 222t114 195t186.5 138.5t256.5 52.5q102 0 175 -32t120 -86t68.5 -125t21.5 -150q0 -115 -37.5 -223.5t-111.5 -193.5t-184.5 -136.5t-258.5 -51.5q-102 0 -175.5 31t-121 84t-70 124t-22.5 151zM301 385q0 -47 10.5 -91t32 -77t55 -52.5t80.5 -19.5 q76 0 134.5 37t97.5 95.5t59.5 131t20.5 146.5q0 49 -10.5 93t-33 77t-56.5 52.5t-83 19.5q-76 0 -133 -37t-96 -95.5t-58.5 -132t-19.5 -147.5zM455 1235q0 27 12 51.5t32.5 44t47 31.5t53.5 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13 -50.5t-34.5 -42t-48.5 -29.5t-51 -11 q-41 0 -67.5 28.5t-26.5 69.5zM733 1235q0 27 12.5 51.5t33 44t47 31.5t53.5 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13.5 -50.5t-35 -42t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#xf7;" horiz-adv-x="1042" d="M66 406l34 167h848l-35 -167h-847zM303 106q0 33 15.5 64t41 55.5t57.5 40t66 15.5q51 0 86 -39t35 -90q0 -33 -17.5 -63t-44 -53.5t-59 -36.5t-63.5 -13q-53 0 -85 34.5t-32 85.5zM455 819q0 33 15 63.5t41 55.5t57.5 40t66.5 15q51 0 86 -39t35 -90q0 -33 -16.5 -62.5 t-43 -53t-59.5 -37t-66 -13.5q-53 0 -84.5 35t-31.5 86z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1130" d="M-45 25l145 133q-45 90 -45 207q0 113 39 222t114 195t186.5 138.5t256.5 52.5q82 0 144.5 -21.5t107.5 -56.5l135 123l103 -90l-152 -140q25 -47 36 -99t11 -109q0 -115 -37.5 -223.5t-111.5 -193.5t-184.5 -136.5t-256.5 -51.5q-84 0 -147 20.5t-111 55.5l-141 -129z M301 354q0 -14 4 -28l440 405q-23 29 -56.5 47.5t-80.5 18.5q-76 0 -133 -37t-96 -95.5t-58.5 -132t-19.5 -147.5v-31zM344 215q23 -33 56.5 -51.5t80.5 -18.5q76 0 134.5 37t97.5 95.5t59.5 131t20.5 146.5q0 33 -7 68z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1099" d="M63 197q0 45 13 104l137 641h225l-131 -612q-4 -10 -4 -22v-21q0 -53 29.5 -91t95.5 -38q72 0 141.5 48t116.5 138l127 598h227l-200 -942h-176l16 131h-8q-33 -47 -74 -76.5t-86 -47t-92 -25t-90 -7.5q-57 0 -105.5 11.5t-84.5 37t-56.5 69t-20.5 104.5zM401 1268 q0 18 7.5 40.5t19.5 42t27.5 32t31.5 12.5q8 0 21 -6l323 -207l5 -15l-48 -73l-16 -7l-354 142q-17 6 -17 39z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1099" d="M63 197q0 45 13 104l137 641h225l-131 -612q-4 -10 -4 -22v-21q0 -53 29.5 -91t95.5 -38q72 0 141.5 48t116.5 138l127 598h227l-200 -942h-176l16 131h-8q-33 -47 -74 -76.5t-86 -47t-92 -25t-90 -7.5q-57 0 -105.5 11.5t-84.5 37t-56.5 69t-20.5 104.5zM455 1169l8 15 l414 207q12 6 20 6q23 0 33 -25.5t10 -54.5t-11 -54.5t-32 -31.5l-414 -141l-14 6z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1099" d="M63 199q0 43 13 102l137 641h225l-131 -612q-4 -10 -4 -22v-21q0 -53 29.5 -91t95.5 -38q72 0 141.5 48t116.5 138l127 598h227l-200 -942h-176l16 131h-8q-33 -47 -74 -76.5t-86 -47t-92 -25t-90 -7.5q-57 0 -105.5 11.5t-84.5 38t-56.5 70t-20.5 104.5zM424 1161l8 15 l270 202h17l180 -202l4 -15l-45 -59l-16 -6l-174 84l-211 -84l-13 6z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1099" d="M63 199q0 43 13 102l137 641h225l-131 -612q-6 -29 -6 -51q0 -59 34 -90t93 -31q72 0 141.5 48t116.5 138l127 598h227l-200 -942h-176l16 131h-8q-33 -47 -74 -76.5t-86 -47t-92 -25t-90 -7.5q-57 0 -105.5 11.5t-84.5 38t-56.5 70t-20.5 104.5zM422 1235q0 27 12 51.5 t32.5 44t47.5 31.5t53 12q41 0 70 -31.5t29 -72.5q0 -27 -14.5 -50.5t-36 -42t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5zM700 1235q0 27 12.5 51.5t33 44t47 31.5t53.5 12q41 0 69.5 -31.5t28.5 -72.5q0 -27 -13 -50.5t-35 -42t-48.5 -29.5t-52.5 -11 q-41 0 -68 28.5t-27 69.5z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1060" d="M-172 -342q6 -2 13 -4t34 -2q39 0 80 8t84 33q84 47 155.5 131t149.5 207l-276 911h235l186 -670l404 670h219l-592 -950q-43 -72 -112.5 -161t-154.5 -168t-183.5 -133t-198.5 -54q-16 0 -24.5 1t-18.5 5v176zM514 1169l8 15l414 207q12 6 20 6q23 0 33 -25.5t10 -54.5 t-11 -54.5t-32 -31.5l-413 -141l-15 6z" /> +<glyph unicode="&#xfe;" d="M-92 -532l436 2048h217l-145 -682h8q31 29 71 54t84 43.5t89 30t84 11.5q88 0 151.5 -31t104.5 -82t59 -120.5t18 -145.5q0 -117 -35.5 -227.5t-104 -197.5t-171 -140.5t-237.5 -53.5q-92 0 -166 27t-109 86l-131 -620h-223zM301 268q47 -76 106.5 -95t112.5 -19 q84 0 146.5 33.5t104.5 90t63.5 129t21.5 148.5q0 47 -9 92t-30.5 79t-55.5 54.5t-83 20.5q-31 0 -69 -9.5t-77.5 -26.5t-77.5 -42t-67 -55z" /> +<glyph unicode="&#xff;" horiz-adv-x="1060" d="M-172 -342q6 -2 13 -4t34 -2q39 0 80 8t84 33q84 47 155.5 131t149.5 207l-276 911h235l186 -670l404 670h219l-592 -950q-43 -72 -112.5 -161t-154.5 -168t-183.5 -133t-198.5 -54q-16 0 -24.5 1t-18.5 5v176zM395 1235q0 27 12.5 51.5t33 44t47 31.5t53.5 12 q41 0 69.5 -31.5t28.5 -72.5q0 -27 -14.5 -50.5t-36 -42t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5zM674 1235q0 27 12 51.5t32.5 44t47.5 31.5t53 12q41 0 70 -31.5t29 -72.5q0 -27 -14.5 -50.5t-36 -42t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#x152;" horiz-adv-x="1736" d="M109 510q0 168 59 321.5t168.5 271.5t262.5 188.5t339 70.5q39 0 75 -3t70 -7h703l-45 -205h-508l-70 -328h371l-43 -205h-371l-86 -409h549l-45 -205h-709q-92 -25 -200 -25q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM362 528q0 -174 79 -265t233 -91q66 0 121 18 l202 957q-47 18 -108 18q-147 0 -247.5 -56t-163 -147.5t-89.5 -205t-27 -228.5z" /> +<glyph unicode="&#x153;" horiz-adv-x="1728" d="M55 365q0 113 39 222t114 195t186.5 138.5t256.5 52.5q119 0 199 -43t113 -137q160 180 391 180q154 0 233.5 -71t79.5 -200q0 -39 -8 -77.5t-20.5 -72.5t-28 -60.5t-29.5 -40.5h-596q-6 -35 -6 -68q0 -98 52 -163.5t169 -65.5q76 0 166 28.5t162 71.5v-168 q-31 -16 -75 -35.5t-96 -36t-110.5 -28t-120.5 -11.5q-109 0 -186.5 41t-112.5 131q-72 -94 -169 -133t-214 -39q-102 0 -175.5 31t-121 84t-70 124t-22.5 151zM301 385q0 -47 10.5 -91t32 -77t55 -52.5t80.5 -19.5q76 0 134.5 37t97.5 95.5t59.5 131t20.5 146.5 q0 49 -10.5 93t-33 77t-56.5 52.5t-83 19.5q-76 0 -133 -37t-96 -95.5t-58.5 -132t-19.5 -147.5zM1036 610h344q43 0 50 2q4 10 8 22.5t4 41.5q0 59 -38 90t-93 31q-92 0 -162 -52.5t-113 -134.5z" /> +<glyph unicode="&#x178;" horiz-adv-x="1150" d="M137 1352h264l215 -613l463 613h260l-651 -797l-117 -555h-235l115 547zM541 1585q0 27 12 51.5t32.5 44t47 31.5t53.5 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13 -50.5t-34.5 -42t-48.5 -29.5t-51 -11q-41 0 -67.5 28.5t-26.5 69.5zM819 1585q0 27 12.5 51.5t33 44 t47 31.5t53.5 12q41 0 68.5 -31.5t27.5 -72.5q0 -27 -13.5 -50.5t-35 -42t-48 -29.5t-51.5 -11q-41 0 -67.5 28.5t-26.5 69.5z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="479" d="M248 1161l8 15l270 202h17l180 -202l4 -15l-45 -59l-16 -6l-174 84l-211 -84l-13 6z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="636" d="M248 1163q18 37 39.5 71t49.5 59.5t64.5 41t85.5 15.5q59 0 127 -14.5t123 -14.5q37 0 79 11t89 42l15 -47q-12 -33 -33 -66.5t-48.5 -60t-63.5 -44t-81 -17.5q-25 0 -56.5 4t-66 10t-71.5 10t-72 4q-47 0 -88 -11t-76 -40z" /> +<glyph unicode="&#x2000;" horiz-adv-x="868" /> +<glyph unicode="&#x2001;" horiz-adv-x="1738" /> +<glyph unicode="&#x2002;" horiz-adv-x="868" /> +<glyph unicode="&#x2003;" horiz-adv-x="1738" /> +<glyph unicode="&#x2004;" horiz-adv-x="579" /> +<glyph unicode="&#x2005;" horiz-adv-x="434" /> +<glyph unicode="&#x2006;" horiz-adv-x="288" /> +<glyph unicode="&#x2007;" horiz-adv-x="288" /> +<glyph unicode="&#x2008;" horiz-adv-x="217" /> +<glyph unicode="&#x2009;" horiz-adv-x="346" /> +<glyph unicode="&#x200a;" horiz-adv-x="96" /> +<glyph unicode="&#x2010;" horiz-adv-x="960" d="M102 406l35 167h692l-34 -167h-693z" /> +<glyph unicode="&#x2011;" horiz-adv-x="960" d="M102 406l35 167h692l-34 -167h-693z" /> +<glyph unicode="&#x2012;" horiz-adv-x="960" d="M102 406l35 167h692l-34 -167h-693z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1116" d="M102 406l35 167h848l-35 -167h-848z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1583" d="M102 406l35 167h1315l-35 -167h-1315z" /> +<glyph unicode="&#x2018;" horiz-adv-x="514" d="M213 942l66 311l264 252l63 -51l-141 -231h51l-59 -281h-244z" /> +<glyph unicode="&#x2019;" horiz-adv-x="479" d="M195 993l141 232h-51l59 280h244l-66 -311l-264 -252z" /> +<glyph unicode="&#x201a;" horiz-adv-x="532" d="M-63 -242l141 232h-51l59 280h244l-66 -311l-264 -252z" /> +<glyph unicode="&#x201c;" horiz-adv-x="839" d="M213 942l66 311l264 252l63 -51l-141 -231h51l-59 -281h-244zM539 942l65 311l264 252l64 -51l-141 -231h51l-60 -281h-243z" /> +<glyph unicode="&#x201d;" horiz-adv-x="804" d="M195 993l141 232h-51l59 280h244l-66 -311l-264 -252zM520 993l142 232h-52l60 280h243l-65 -311l-264 -252z" /> +<glyph unicode="&#x201e;" horiz-adv-x="858" d="M-63 -242l141 232h-51l59 280h244l-66 -311l-264 -252zM262 -242l141 232h-51l60 280h243l-65 -311l-264 -252z" /> +<glyph unicode="&#x2022;" horiz-adv-x="663" d="M168 473q0 33 15.5 63.5t41 55t58 40t65.5 15.5q51 0 86 -39t35 -90q0 -33 -16.5 -62.5t-43 -53t-59.5 -37t-63 -13.5q-53 0 -86 35t-33 86z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1292" d="M20 96q0 33 15.5 63.5t41 55.5t57.5 40t67 15q51 0 86 -38.5t35 -90.5q0 -33 -16.5 -62.5t-43 -53t-59.5 -37t-66 -13.5q-53 0 -85 35t-32 86zM410 96q0 33 15 63.5t41 55.5t58.5 40t65.5 15q51 0 86 -38.5t35 -90.5q0 -33 -16.5 -62.5t-43 -53t-59.5 -37t-66 -13.5 q-53 0 -84.5 35t-31.5 86zM797 96q0 33 15 63.5t41 55.5t58.5 40t65.5 15q51 0 86 -38.5t35 -90.5q0 -33 -17.5 -62.5t-44 -53t-59.5 -37t-64 -13.5q-53 0 -84.5 35t-31.5 86z" /> +<glyph unicode="&#x202f;" horiz-adv-x="346" /> +<glyph unicode="&#x2039;" horiz-adv-x="684" d="M70 489l2 11l350 360h229l-372 -362l-3 -11l220 -362h-232z" /> +<glyph unicode="&#x203a;" horiz-adv-x="684" d="M2 125l375 362l2 11l-221 362h229l199 -360l-2 -11l-351 -364h-231z" /> +<glyph unicode="&#x205f;" horiz-adv-x="434" /> +<glyph unicode="&#x20ac;" horiz-adv-x="1257" d="M61 461l35 168h150q6 57 20 108h-145l35 168h168q45 98 109.5 182t147.5 144.5t181 95.5t213 35q92 0 182 -23.5t148 -64.5l-113 -227q-41 49 -107.5 81.5t-162.5 32.5q-74 0 -131.5 -20.5t-101.5 -56t-75.5 -82t-54.5 -97.5h455l-35 -168h-471q-6 -29 -10 -56.5 t-6 -51.5h462l-34 -168h-435q6 -139 60.5 -212t152.5 -73q104 0 201.5 37t163.5 94l18 -207q-84 -49 -190.5 -87t-233.5 -38q-109 0 -186.5 38t-129.5 104.5t-77.5 154.5t-27.5 189h-175z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1449" d="M260 1206l29 131h442l-29 -131h-151l-96 -450h-140l97 450h-152zM674 756l125 581h184l57 -411l232 411h182l-125 -581h-139l72 336l-195 -336h-133l-49 338l-72 -338h-139z" /> +<glyph unicode="&#xe000;" horiz-adv-x="940" d="M0 940h940v-940h-940v940z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1073" d="M-47 -532l285 1337h-117l24 117l121 18q25 117 49.5 199t49 138t47 91t43.5 57q51 53 122.5 77t151.5 24q25 0 59.5 -3t75.5 -14.5t86 -32t88 -53.5l-127 -166l-49 37q-25 18 -51.5 33.5t-59 26t-71.5 10.5q-27 0 -48.5 -12.5t-40 -45t-35.5 -88t-36 -141.5l-28 -135h180 l-29 -137h-180l-285 -1337h-225zM590 0l201 942h225l-201 -942h-225z" /> +<glyph unicode="&#xfb02;" horiz-adv-x="1093" d="M-47 -532l285 1337h-117l24 117l121 18q25 117 49.5 199t49 138t47 91t43.5 57q51 53 122.5 77t151.5 24q47 0 136 -12.5t182 -47.5l98 50l-322 -1516h-225l281 1319q-41 16 -89.5 30.5t-109.5 14.5q-27 0 -48.5 -12.5t-40 -45t-35.5 -88t-36 -141.5l-28 -135h180 l-29 -137h-180l-285 -1337h-225z" /> +<glyph unicode="&#xfb03;" horiz-adv-x="1775" d="M1290 0l201 942h225l-200 -942h-226zM1520 1221q0 33 15.5 63.5t41 55t57 40t66.5 15.5q51 0 86 -39t35 -90q0 -33 -17.5 -62.5t-44 -53.5t-59.5 -37t-63 -13q-53 0 -85 35t-32 86zM588 -535l285 1340h-117l24 117l121 18q25 117 49.5 199t49 138t47 91t43.5 57 q51 53 122.5 77t151.5 24q10 0 32.5 -1t49.5 -5t54.5 -13.5t49.5 -23.5l-88 -174q-16 12 -59 33.5t-88 21.5q-27 0 -48.5 -12.5t-40 -45t-35.5 -88t-36 -141.5l-28 -135h180l-29 -137h-180l-285 -1340h-225zM-47 -535l285 1340h-117l24 117l121 18q25 117 49.5 199t49 138 t47 91t43.5 57q51 53 122.5 77t151.5 24q10 0 32.5 -1t49.5 -5t54.5 -13.5t49.5 -23.5l-88 -174q-16 12 -59 33.5t-88 21.5q-27 0 -48.5 -12.5t-40 -45t-35.5 -88t-36 -141.5l-28 -135h180l-29 -137h-180l-285 -1340h-225z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="1800" d="M1305 0l321 1516h226l-322 -1516h-225zM588 -535l285 1340h-117l24 117l121 18q25 117 49.5 199t49 138t47 91t43.5 57q51 53 122.5 77t151.5 24q10 0 32.5 -1t49.5 -5t54.5 -13.5t49.5 -23.5l-88 -174q-16 12 -59 33.5t-88 21.5q-27 0 -48.5 -12.5t-40 -45t-35.5 -88 t-36 -141.5l-28 -135h180l-29 -137h-180l-285 -1340h-225zM-47 -535l285 1340h-117l24 117l121 18q25 117 49.5 199t49 138t47 91t43.5 57q51 53 122.5 77t151.5 24q10 0 32.5 -1t49.5 -5t54.5 -13.5t49.5 -23.5l-88 -174q-16 12 -59 33.5t-88 21.5q-27 0 -48.5 -12.5 t-40 -45t-35.5 -88t-36 -141.5l-28 -135h180l-29 -137h-180l-285 -1340h-225z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.ttf new file mode 100644 index 000000000000..9766a17a8436 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.woff new file mode 100644 index 000000000000..c436da0625fd Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-bolditalic-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.eot new file mode 100644 index 000000000000..379b3834ac89 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.svg new file mode 100644 index 000000000000..b613779eab22 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.svg @@ -0,0 +1,247 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Pablo Impallari wwwimpallaricomimpallarigmailcomCopyright c 2011 Igino Marini wwwikerncommailiginomarinicomCopyright c 2011 Brenda Gallo gbrenda1987gmailcomwith Reserved Font Name Quattrocento Sans +Designer : Pablo Impallari +Foundry : Pablo Impallari Igino Marini Brenda Gallo +Foundry URL : wwwimpallaricom +</metadata> +<defs> +<font id="QuattrocentoSansItalic" horiz-adv-x="1177" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="501" /> +<glyph unicode=" " horiz-adv-x="501" /> +<glyph unicode="&#x09;" horiz-adv-x="501" /> +<glyph unicode="&#xa0;" horiz-adv-x="501" /> +<glyph unicode="!" horiz-adv-x="530" d="M63 55q0 43 38 79t83 36q33 0 54.5 -24.5t21.5 -59.5q0 -23 -11 -42t-27.5 -33.5t-37 -24t-41.5 -9.5q-35 0 -57.5 22.5t-22.5 55.5zM162 307l182 1090h199l-285 -1090h-96z" /> +<glyph unicode="&#x22;" horiz-adv-x="681" d="M264 1057l51 442h166l-143 -442h-74zM545 1057l51 442h166l-144 -442h-73z" /> +<glyph unicode="#" horiz-adv-x="1261" d="M57 455l43 108h242l102 244h-249l43 106h251l183 426h131l-182 -426h258l182 426h131l-182 -426h250l-43 -106h-252l-103 -244h260l-43 -108h-264l-192 -455h-131l192 455h-258l-193 -455h-131l193 455h-238zM473 563h258l103 244h-259z" /> +<glyph unicode="$" horiz-adv-x="1087" d="M-10 88l76 150q31 -25 62.5 -47.5t70.5 -40t87 -27.5t111 -12l113 530q-68 25 -123 53.5t-94 65.5t-60.5 84t-21.5 108q0 98 35 172t96 124t143 78t177 34l38 176h123l-39 -176q90 -6 166 -26.5t129 -49.5l-75 -158q-41 45 -110 68t-138 29l-94 -449q57 -23 113 -49.5 t99.5 -65t70 -92t26.5 -129.5q0 -113 -40 -195.5t-106.5 -138t-152.5 -86t-180 -38.5l-37 -177h-123l37 174q-119 4 -215 36t-164 75zM367 991q0 -63 44 -100t136 -74l86 408q-123 -10 -194.5 -69t-71.5 -165zM520 115q154 18 218.5 91t64.5 169q0 43 -14.5 75.5t-39 59.5 t-57.5 48.5t-69 37.5z" /> +<glyph unicode="%" horiz-adv-x="1683" d="M160 883q0 94 29.5 180t83 152.5t125 106.5t157.5 40q57 0 101 -22.5t74 -61.5t44 -92t14 -113q0 -86 -29.5 -170t-82.5 -151.5t-128 -108.5t-163 -41q-57 0 -100 21.5t-71 60.5t-41 89.5t-13 109.5zM170 -49l1260 1464h133l-1260 -1464h-133zM274 885q0 -190 134 -191 q70 0 120 35t82.5 89t49 122t16.5 133q0 88 -35 142.5t-109 54.5q-76 0 -126 -39t-78.5 -96.5t-41 -125t-12.5 -124.5zM946 266q0 94 30 180t83 153t124.5 106.5t157.5 39.5q57 0 101.5 -22.5t74 -61t44 -92t14.5 -112.5q0 -86 -29.5 -170t-83 -151.5t-128 -108.5 t-163.5 -41q-57 0 -100 21.5t-70.5 60t-41 89t-13.5 109.5zM1061 268q0 -190 133 -190q70 0 120 34.5t83 89t49 122t16 133.5q0 88 -34.5 142t-108.5 54q-76 0 -126 -39t-79 -96t-41 -125t-12 -125z" /> +<glyph unicode="&#x26;" horiz-adv-x="1427" d="M76 299q0 61 24.5 129t71.5 129t115.5 114.5t154.5 88.5q-70 109 -69 229q0 90 31.5 160t84 117t120 71.5t141.5 24.5q70 0 138 -23.5t128 -66.5l-74 -146q-35 45 -95.5 74t-121.5 29q-41 0 -79 -13.5t-66.5 -42t-46 -72.5t-17.5 -106q0 -100 62 -180l366 -489 q74 109 74 229q0 39 -8.5 79t-22.5 77l-104 -9l20 97l531 75l-27 -126l-281 -25q12 -37 18.5 -79t6.5 -81q0 -90 -34 -177t-95 -161l170 -225h-172l-98 127q-88 -70 -201 -111t-246 -41q-102 0 -177 27t-124 71t-73.5 102t-24.5 124zM238 332q0 -106 77.5 -163.5 t206.5 -57.5q98 0 180 29.5t148 82.5l-338 441q-59 -18 -109.5 -51t-87 -77t-57 -96.5t-20.5 -107.5z" /> +<glyph unicode="'" horiz-adv-x="401" d="M264 1057l51 442h166l-143 -442h-74z" /> +<glyph unicode="(" horiz-adv-x="636" d="M102 467q0 162 45.5 314.5t128 292.5t199.5 267t260 238l74 -27q-104 -94 -201.5 -196.5t-171.5 -235.5t-119 -309t-45 -418q0 -59 7.5 -135t26 -157t49 -161.5t75.5 -152.5l-80 -27q-123 135 -185.5 322.5t-62.5 384.5z" /> +<glyph unicode=")" horiz-adv-x="634" d="M-123 -213q133 125 233.5 252t167 267t100.5 300t34 350q0 166 -39 320t-123 276l84 27q59 -68 105 -149.5t77 -174t47.5 -189.5t16.5 -196q0 -160 -45.5 -313.5t-128 -293.5t-199.5 -267t-260 -236z" /> +<glyph unicode="*" horiz-adv-x="897" d="M211 991l274 109l-227 110l92 119l185 -166l28 275h135l-90 -275l256 166l43 -119l-276 -110l229 -109l-90 -117l-188 162l-27 -270h-133l86 270l-256 -162z" /> +<glyph unicode="+" horiz-adv-x="1009" d="M74 436l22 107h350l70 331h107l-70 -331h352l-22 -107h-353l-75 -352h-107l76 352h-350z" /> +<glyph unicode="," horiz-adv-x="491" d="M-12 -160l112 150h-51l39 184h162l-47 -215l-183 -158z" /> +<glyph unicode="-" horiz-adv-x="995" d="M125 436l22 107h693l-23 -107h-692z" /> +<glyph unicode="." horiz-adv-x="475" d="M45 55q0 43 37 79t82 36q35 0 56.5 -24.5t21.5 -59.5q0 -23 -11.5 -42t-28 -33.5t-38 -24t-41.5 -9.5q-35 0 -56.5 22.5t-21.5 55.5z" /> +<glyph unicode="/" horiz-adv-x="878" d="M-63 -117l899 1555h153l-899 -1555h-153z" /> +<glyph unicode="0" horiz-adv-x="1341" d="M125 485q0 170 53 328t148.5 279.5t227.5 195.5t288 74q106 0 185 -42t131 -112.5t79 -166t27 -201.5q0 -158 -53.5 -312.5t-149.5 -277.5t-230.5 -199t-295.5 -76q-104 0 -182.5 40t-128.5 110t-74.5 163t-24.5 197zM295 487q0 -184 69.5 -280t202.5 -96t232.5 65.5 t166 170t99.5 235.5t33 262q0 86 -17.5 155.5t-53.5 120.5t-91 79t-129 28q-141 0 -239.5 -68.5t-159 -176.5t-87 -239t-26.5 -256z" /> +<glyph unicode="1" horiz-adv-x="643" d="M166 1126l442 226l-286 -1352h-154l229 1077l-217 -94z" /> +<glyph unicode="2" horiz-adv-x="1038" d="M-23 0l31 143q84 86 179.5 167t188.5 159t179 153.5t150.5 150.5t103.5 148.5t39 149.5q0 63 -44 109.5t-153 46.5q-45 0 -97 -7.5t-103.5 -21.5t-98.5 -32.5t-80 -39.5l-8 136q88 43 204 71.5t216 28.5q158 0 247 -76t89 -199q0 -82 -38 -160.5t-101.5 -156.5 t-147.5 -155.5t-177 -155.5t-189.5 -157t-184.5 -159h656l-31 -143h-830z" /> +<glyph unicode="3" horiz-adv-x="1095" d="M-23 102l70 138q59 -59 140 -94t186 -35q199 0 305 96t106 258q0 92 -69.5 146.5t-229.5 54.5h-55l27 116h63q74 0 134.5 21.5t103.5 60.5t66.5 92.5t23.5 118.5q0 68 -42 110t-142 42q-47 0 -96.5 -8.5t-95.5 -21.5t-87 -31.5t-72 -39.5l-8 136q39 20 87 38.5t98.5 33 t99.5 21.5t90 7q158 0 248 -71.5t90 -207.5q0 -61 -21.5 -114.5t-58.5 -96.5t-84 -77.5t-98 -59.5q92 -35 144 -101.5t52 -168.5q0 -94 -39 -182t-115.5 -157t-189 -110t-258.5 -41q-119 0 -213 34t-160 93z" /> +<glyph unicode="4" horiz-adv-x="1040" d="M37 430l31 143l737 779h164l-166 -779h141l-31 -143h-141l-92 -430h-154l92 430h-581zM242 573h407l117 555z" /> +<glyph unicode="5" horiz-adv-x="1110" d="M2 102l74 144q63 -59 139 -97t191 -38q186 0 294.5 96t108.5 266q0 88 -61.5 142.5t-212.5 54.5q-72 0 -151 -12.5t-151 -39.5l-53 31l228 713h694l-31 -143h-565l-146 -437q66 14 137.5 23.5t131.5 9.5q160 0 257 -81t97 -230q0 -98 -40 -193.5t-117.5 -169t-190.5 -120 t-260 -46.5q-119 0 -213 34t-160 93z" /> +<glyph unicode="6" horiz-adv-x="1144" d="M121 399q0 72 12 172.5t43 207t82 211t129 186t184.5 133t247.5 51.5q33 0 75 -4t85 -15.5t81 -31t62 -47.5l-63 -136q-57 57 -131 79t-135 22q-111 0 -197 -52.5t-146.5 -133t-95.5 -179t-43 -190.5q72 88 173.5 118.5t199.5 30.5q100 0 164.5 -31.5t102.5 -79.5 t52.5 -105.5t14.5 -108.5q0 -84 -33 -176.5t-99.5 -169t-168 -126t-238.5 -49.5q-96 0 -163.5 31t-110.5 86t-63.5 133t-20.5 174zM276 328q0 -104 58.5 -166t171.5 -62q76 0 140.5 28t111.5 79t72.5 120.5t25.5 155.5q0 43 -11 81t-36 68t-64.5 47t-97.5 17 q-94 0 -163.5 -30.5t-115.5 -82t-69 -117.5t-23 -138z" /> +<glyph unicode="7" horiz-adv-x="937" d="M41 0q4 18 7 39.5t7 40.5q18 86 64.5 184t111 200.5t144.5 206t165 201t171 186.5t166 161h-660l31 143h829l-30 -143q-125 -102 -258.5 -249t-248 -306.5t-197.5 -313t-107 -268.5l-17 -82h-178z" /> +<glyph unicode="8" horiz-adv-x="1146" d="M72 299q0 162 91 279.5t245 160.5l2 9q-55 23 -92 80t-37 143q0 84 32.5 155.5t93 124t145.5 82t191 29.5q156 0 241 -71.5t85 -190.5q0 -63 -20.5 -118.5t-55.5 -100.5t-80 -79t-94 -52l-2 -9q92 -23 137 -95.5t45 -176.5q0 -96 -33.5 -185t-103 -158t-173 -110 t-243.5 -41q-102 0 -173.5 27t-115.5 71t-64.5 102t-20.5 124zM238 307q0 -98 59 -152.5t176 -54.5q168 0 260 92.5t92 247.5q0 45 -12 87t-40 74t-72 51.5t-105 19.5q-94 0 -161.5 -34t-111.5 -87t-64.5 -118t-20.5 -126zM444 973q0 -78 44 -128t133 -50q63 0 114 22.5 t87 60t55.5 89t19.5 108.5q0 66 -41 112t-141 46q-76 0 -127 -21.5t-83 -58.5t-46.5 -84t-14.5 -96z" /> +<glyph unicode="9" horiz-adv-x="1146" d="M70 74l63 135q57 -57 131 -78.5t135 -21.5q106 0 186.5 44t137.5 114.5t93 159.5t54 177q4 16 6.5 29.5t4.5 30.5l-7 2q-33 -45 -75.5 -74t-92 -46.5t-99.5 -24.5t-99 -7q-100 0 -164.5 32t-102.5 80t-52.5 105t-14.5 109q0 84 33 176t99.5 169t166.5 126t238 49 q193 0 276.5 -116t83.5 -308q0 -72 -12 -172t-43 -206.5t-82 -211t-129 -186.5t-184.5 -133.5t-247.5 -51.5q-33 0 -75 4.5t-85 15.5t-80.5 30.5t-62.5 48.5zM336 836q0 -84 46 -140.5t163 -56.5q94 0 162.5 30.5t114.5 82t68.5 118t22.5 138.5q0 104 -57 165.5t-170 61.5 q-78 0 -142.5 -34t-110.5 -89t-71.5 -127.5t-25.5 -148.5z" /> +<glyph unicode=":" horiz-adv-x="499" d="M47 55q0 43 36 79t83 36q35 0 56.5 -24.5t21.5 -59.5q0 -23 -11.5 -42t-28 -33.5t-38 -24t-41.5 -9.5q-35 0 -56.5 22.5t-21.5 55.5zM211 819q0 43 36 78t81 35q35 0 57.5 -23.5t22.5 -58.5q0 -45 -39 -78t-82 -33q-35 0 -55.5 22.5t-20.5 57.5z" /> +<glyph unicode=";" horiz-adv-x="518" d="M-2 -160l113 150h-52l39 184h162l-47 -215l-182 -158zM223 819q0 43 36 78t81 35q35 0 57.5 -23.5t22.5 -58.5q0 -45 -39 -78t-82 -33q-35 0 -55.5 22.5t-20.5 57.5z" /> +<glyph unicode="&#x3c;" horiz-adv-x="841" d="M68 487l2 11l667 397l11 -129l-461 -268l-2 -11l348 -272l-66 -131z" /> +<glyph unicode="=" horiz-adv-x="1005" d="M96 281l23 106h692l-23 -106h-692zM162 592l22 106h693l-23 -106h-692z" /> +<glyph unicode="&#x3e;" horiz-adv-x="837" d="M61 215l463 272l2 11l-346 268l66 129l497 -397l-2 -11l-671 -403z" /> +<glyph unicode="?" horiz-adv-x="854" d="M178 57q0 47 36 80t81 33q35 0 57.5 -23.5t22.5 -58.5q0 -23 -11.5 -42t-29 -34.5t-39 -25t-41.5 -9.5q-35 0 -55.5 23.5t-20.5 56.5zM242 1305q66 43 153.5 71.5t165.5 28.5q141 0 218 -74t77 -192q0 -74 -28.5 -136.5t-73.5 -120t-99.5 -115.5t-106.5 -126t-96 -148.5 t-67 -183.5h-131q25 113 66.5 197t92 150.5t102.5 120.5t94 105.5t69 106.5t27 125q0 66 -42 112t-133 46q-33 0 -70.5 -8.5t-75.5 -21.5t-73 -32.5t-61 -40.5z" /> +<glyph unicode="@" horiz-adv-x="1486" d="M63 262q0 80 27 175t79 191.5t129 185.5t176 157.5t221 109.5t263 41q123 0 210 -35.5t143.5 -94t82 -133.5t25.5 -154q0 -104 -42 -204t-114.5 -177.5t-169 -124.5t-202.5 -47q-74 0 -99.5 23.5t-25.5 62.5q0 16 2 31.5t6 31.5q-49 -70 -110.5 -110.5t-114.5 -40.5 q-51 0 -90 46t-39 136q0 102 47 188t118.5 147.5t156.5 95.5t163 34q49 0 104.5 -16.5t82.5 -51.5q-57 -137 -88 -212t-45.5 -109.5t-17.5 -40.5l-3 -7q-12 -29 -18.5 -48t-6.5 -38q0 -39 50 -38q63 0 122.5 41.5t105.5 107.5t73.5 146.5t27.5 158.5q0 63 -19.5 123.5 t-62.5 108t-110.5 76t-163.5 28.5q-111 0 -210 -32.5t-181 -90t-147.5 -133.5t-111.5 -161t-69.5 -174t-23.5 -173q0 -96 31.5 -166.5t86 -116t128 -67t157.5 -21.5t159.5 17.5t138 43t110 54.5t73.5 49l-20 -102q-25 -18 -75 -46t-116.5 -53.5t-146.5 -43t-164 -17.5 q-106 0 -196.5 33t-156 94.5t-102.5 148.5t-37 193zM551 317q0 -80 45 -79q27 0 61.5 21.5t68.5 55t63.5 74.5t46.5 80l102 248q-10 12 -49 12q-78 0 -140.5 -46t-106.5 -110.5t-67.5 -135.5t-23.5 -120z" /> +<glyph unicode="A" horiz-adv-x="1316" d="M-102 0l827 1352h186l308 -1352h-175l-102 455h-604l-277 -455h-163zM424 598h485l-129 582z" /> +<glyph unicode="B" horiz-adv-x="1148" d="M86 0l287 1352q70 4 156.5 7t160.5 3q158 0 249 -71.5t91 -207.5q0 -106 -51 -192t-156 -143q94 -35 146.5 -106t52.5 -175q0 -94 -40 -183t-117 -158t-189.5 -110t-257.5 -41q-100 0 -183 7.5t-149 17.5zM264 117q76 -6 176 -6q199 0 305.5 96t106.5 258 q0 92 -68.5 146.5t-228.5 54.5q-45 0 -90 -1t-86 -3zM406 784q29 -2 60 -2h64q76 0 136.5 21.5t103.5 60.5t66.5 92.5t23.5 118.5q0 68 -42 110t-144 42q-45 0 -90 -1t-86 -3z" /> +<glyph unicode="C" horiz-adv-x="1316" d="M123 508q0 166 57.5 320.5t167 272.5t266 189.5t355.5 71.5q111 0 216 -23.5t177 -64.5l-76 -148q-55 43 -145 72t-213 29q-188 0 -311 -63.5t-195 -166t-100.5 -229.5t-28.5 -252q0 -199 98 -302t295 -103q129 0 245 36.5t193 90.5l13 -138q-92 -49 -216 -87t-270 -38 q-139 0 -238.5 42t-164 115t-95 170t-30.5 206z" /> +<glyph unicode="D" horiz-adv-x="1449" d="M86 0l287 1352q100 4 219 7t229 3q145 0 257 -41t179 -113q59 -66 87 -168t28 -211q0 -162 -53 -315.5t-157.5 -273t-258 -192.5t-354.5 -73q-145 0 -258 7.5t-205 17.5zM266 123q125 -12 305 -12q160 0 279 53t197.5 149.5t117.5 229.5t39 293q0 88 -21.5 159.5 t-69.5 122.5t-124 80t-184 29q-82 0 -162 -1t-145 -5z" /> +<glyph unicode="E" horiz-adv-x="1069" d="M86 0l287 1352h741l-31 -144h-587l-88 -420h450l-31 -143h-450l-107 -502h629l-31 -143h-782z" /> +<glyph unicode="F" horiz-adv-x="991" d="M86 0l287 1352h731l-31 -144h-577l-88 -420h428l-31 -143h-428l-137 -645h-154z" /> +<glyph unicode="G" horiz-adv-x="1380" d="M123 508q0 166 57.5 320.5t167 272.5t266 189.5t355.5 71.5q119 0 226.5 -23.5t186.5 -64.5l-75 -148q-55 43 -152.5 72t-226.5 29q-188 0 -311 -63.5t-195 -166t-100.5 -229.5t-28.5 -252q0 -199 98 -302t295 -103q90 0 173 18t155 47l80 381h153l-94 -444 q-104 -61 -230 -99.5t-272 -38.5q-139 0 -238.5 42t-164 115t-95 170t-30.5 206z" /> +<glyph unicode="H" horiz-adv-x="1443" d="M86 0l287 1352h153l-125 -584h729l125 584h154l-287 -1352h-153l131 625h-729l-131 -625h-154z" /> +<glyph unicode="I" horiz-adv-x="561" d="M86 0l287 1352h153l-286 -1352h-154z" /> +<glyph unicode="J" horiz-adv-x="559" d="M-190 -207q80 0 135 39t91 99.5t57.5 134t35.5 143.5l244 1143h153l-243 -1145q-23 -109 -65 -204t-101.5 -167t-135 -113.5t-167.5 -41.5z" /> +<glyph unicode="K" horiz-adv-x="1220" d="M86 0l287 1352h153l-135 -639q66 39 120 77.5t126 96.5q123 98 251 220t238 245h177q-127 -143 -300.5 -303t-375.5 -326l473 -723h-191l-415 627l-142 -92l-112 -535h-154z" /> +<glyph unicode="L" horiz-adv-x="985" d="M86 0l287 1352h153l-256 -1209h604l-30 -143h-758z" /> +<glyph unicode="M" horiz-adv-x="1728" d="M86 0l287 1352h207l213 -1159l704 1159h197l-287 -1352h-154l217 1022l-630 -1022h-185l-198 1024l-217 -1024h-154z" /> +<glyph unicode="N" horiz-adv-x="1443" d="M86 0l287 1352h186l461 -1108l235 1108h154l-287 -1352h-186l-463 1106l-233 -1106h-154z" /> +<glyph unicode="O" horiz-adv-x="1560" d="M123 510q0 168 59.5 321.5t169 271.5t262 188.5t338.5 70.5q135 0 234.5 -43t166 -118t99.5 -174t33 -212q0 -154 -57.5 -303.5t-167 -269t-265 -193.5t-352.5 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM283 504q0 -184 105.5 -288.5t303.5 -104.5 q160 0 280 63.5t198.5 164.5t117.5 230t39 260q0 88 -25.5 161t-78 125t-133 82t-191.5 30q-164 0 -280.5 -63.5t-191.5 -166t-109.5 -232.5t-34.5 -261z" /> +<glyph unicode="P" horiz-adv-x="1089" d="M86 0l287 1352h8q68 4 147.5 7t151.5 3q193 0 302.5 -89t109.5 -255q0 -98 -37 -190.5t-109 -163t-178 -113.5t-246 -43q-98 0 -174 6l-108 -514h-154zM377 649q74 -6 168 -6q188 0 283.5 101.5t95.5 269.5q0 96 -59.5 154.5t-200.5 58.5q-43 0 -85 -1t-81 -3z" /> +<glyph unicode="Q" horiz-adv-x="1564" d="M125 510q0 168 59.5 321.5t169 271.5t262 188.5t338.5 70.5q135 0 234.5 -43t166 -118t99.5 -174t33 -212q0 -150 -55.5 -296t-158 -264t-252 -193.5t-335.5 -84.5q70 -8 133.5 -33.5t128 -52t131 -48t144.5 -21.5q80 0 182 39l-68 -131q-41 -20 -82 -26.5t-75 -6.5 q-86 0 -162 28.5t-145.5 62.5t-136 62.5t-134.5 28.5q-49 0 -122.5 -18.5t-147.5 -65.5l-8 96q66 41 133 61.5t131 24.5q-121 8 -208 54.5t-143.5 118t-84 164t-27.5 196.5zM283 504q0 -184 105.5 -288.5t303.5 -104.5q160 0 280 63.5t198.5 164.5t117.5 230t39 260 q0 88 -25.5 161t-78 125t-133 82t-191.5 30q-164 0 -280.5 -63.5t-191.5 -166t-109.5 -232.5t-34.5 -261z" /> +<glyph unicode="R" horiz-adv-x="1208" d="M86 0l287 1352h8q68 4 147.5 7t151.5 3q195 0 307.5 -82t112.5 -236q0 -74 -24.5 -145.5t-74 -130.5t-123 -104.5t-169.5 -67.5l391 -596h-191l-383 578q-90 0 -164 6l-122 -584h-154zM391 717q37 -4 79 -4h89q184 0 277.5 90t93.5 237q0 82 -60.5 134.5t-205.5 52.5 q-43 0 -85 -1t-81 -3z" /> +<glyph unicode="S" horiz-adv-x="1138" d="M6 88l76 150q33 -27 66.5 -50.5t75.5 -40t95.5 -26.5t124.5 -10q109 0 183.5 20.5t122 56t69 83.5t21.5 102q0 57 -27 98t-70 71.5t-96 52t-104 40.5q-72 25 -130.5 54.5t-99.5 66.5t-63.5 85t-22.5 111q0 106 41 184t112 128.5t165 74t200 23.5q111 0 209.5 -22.5 t161.5 -55.5l-76 -158q-27 29 -66.5 48.5t-84.5 31t-92 16.5t-88 5q-150 0 -238 -58.5t-88 -177.5q0 -41 18.5 -69.5t54.5 -52t91 -45t129 -48.5q61 -23 121.5 -49.5t106.5 -66t75 -94t29 -132.5q0 -123 -50.5 -210t-131.5 -142t-185 -81t-213 -26q-133 0 -240.5 33 t-181.5 80z" /> +<glyph unicode="T" horiz-adv-x="1085" d="M172 1208l31 144h1018l-31 -144h-432l-256 -1208h-154l256 1208h-432z" /> +<glyph unicode="U" horiz-adv-x="1411" d="M152 317q0 61 16 138l190 897h154l-176 -828q-18 -84 -19 -147q0 -141 78 -203.5t219 -62.5q172 0 291 96t166 317l176 828h144l-191 -897q-23 -100 -72 -187.5t-125.5 -152t-181 -101.5t-235.5 -37q-119 0 -201 26t-134 71t-75.5 107t-23.5 136z" /> +<glyph unicode="V" horiz-adv-x="1320" d="M150 1352h174l264 -1180l719 1180h163l-823 -1352h-194z" /> +<glyph unicode="W" horiz-adv-x="2215" d="M162 1352h174l209 -1157l641 1157h174l176 -1153l655 1153h164l-768 -1352h-194l-172 1118l-619 -1118h-194z" /> +<glyph unicode="X" horiz-adv-x="1323" d="M-86 0l684 698l-367 654h183l307 -547l536 547h177l-650 -662l390 -690h-183l-327 584l-574 -584h-176z" /> +<glyph unicode="Y" horiz-adv-x="1157" d="M139 1352h183l290 -650l551 650h178l-692 -797l-117 -555h-153l115 547z" /> +<glyph unicode="Z" horiz-adv-x="1130" d="M-31 0l31 143l979 1065h-723l31 144h897l-31 -144l-979 -1065h784l-30 -143h-959z" /> +<glyph unicode="[" horiz-adv-x="583" d="M25 -195l366 1729h328l-19 -86h-194l-330 -1557h195l-19 -86h-327z" /> +<glyph unicode="\" horiz-adv-x="864" d="M258 1438h150l239 -1555h-149z" /> +<glyph unicode="]" horiz-adv-x="583" d="M-88 -195l18 86h195l330 1557h-195l19 86h327l-366 -1729h-328z" /> +<glyph unicode="^" horiz-adv-x="712" d="M365 1161l8 15l270 202h16l181 -202l4 -15l-21 -39l-16 -6l-186 125l-240 -125l-12 6z" /> +<glyph unicode="_" horiz-adv-x="985" d="M-76 -106l23 106h887l-23 -106h-887z" /> +<glyph unicode="`" horiz-adv-x="448" d="M279 1293v12q0 35 23.5 60.5t64.5 27.5l327 -207l2 -15l-20 -41l-17 -6l-378 158q-2 4 -2 11z" /> +<glyph unicode="a" d="M66 350q0 117 37.5 228.5t110.5 198.5t176.5 141.5t234.5 54.5q137 0 212.5 -59.5t84.5 -147.5l65 176h113l-199 -942h-113l21 168h-8q-66 -76 -172.5 -134.5t-237.5 -58.5q-84 0 -145.5 30t-101.5 81t-59 119.5t-19 144.5zM217 362q0 -51 11.5 -99t37 -85t66.5 -59.5 t100 -22.5q98 0 205.5 53.5t185.5 153.5l64 301q-12 117 -85 182.5t-181 65.5q-86 0 -161 -39t-128 -104.5t-84 -156t-31 -190.5z" /> +<glyph unicode="b" d="M39 0l321 1516h144l-160 -750q47 88 149.5 147.5t235.5 59.5q88 0 153.5 -31t107.5 -83t62.5 -122.5t20.5 -150.5q0 -111 -36 -220.5t-104.5 -195.5t-167.5 -140.5t-226 -54.5q-131 0 -212 58.5t-116 134.5h-8l-51 -168h-113zM246 303q39 -98 122 -152.5t181 -54.5 q100 0 169.5 46t115 117t66 152t20.5 152q0 129 -60.5 209t-177.5 80q-109 0 -209 -65.5t-162 -182.5z" /> +<glyph unicode="c" horiz-adv-x="1024" d="M70 369q0 111 36.5 219t112.5 193t190.5 138.5t268.5 53.5q98 0 187 -22.5t139 -59.5l-62 -121q-39 35 -121 62.5t-170 27.5q-109 0 -188.5 -41t-131.5 -107.5t-78 -148.5t-26 -164q0 -63 16.5 -119.5t50.5 -99.5t85 -67.5t123 -24.5q82 0 176 35t164 88v-133 q-66 -37 -172.5 -70t-218.5 -33q-98 0 -170 31t-119 85t-69.5 126t-22.5 152z" /> +<glyph unicode="d" horiz-adv-x="1179" d="M68 350q0 117 37.5 228.5t110.5 198.5t176.5 141.5t234.5 54.5q137 0 212.5 -59.5t84.5 -147.5l157 750h144l-322 -1516h-112l20 168h-8q-66 -76 -172.5 -134.5t-237.5 -58.5q-84 0 -145.5 30t-101.5 81t-59 119.5t-19 144.5zM219 362q0 -51 11.5 -99t37 -85t66.5 -59.5 t100 -22.5q98 0 206 53.5t185 153.5l64 301q-12 117 -85 182.5t-181 65.5q-86 0 -161 -39t-128 -104.5t-84 -156t-31 -190.5z" /> +<glyph unicode="e" horiz-adv-x="1056" d="M66 369q0 115 43 223t122.5 193t191.5 136.5t249 51.5q154 0 233.5 -71t79.5 -200q0 -59 -18.5 -117.5t-36.5 -82.5h-697q-12 -59 -12 -117q0 -61 15.5 -115.5t47 -95.5t82 -65.5t117.5 -24.5q49 0 99.5 11t96.5 28.5t88 38t75 41.5v-117q-31 -16 -74 -35.5t-94 -36 t-109.5 -28t-120.5 -11.5q-96 0 -166.5 32t-117.5 85t-70.5 125t-23.5 152zM268 610h568q4 10 9 23.5t5 50.5q0 86 -61.5 130t-147.5 44q-141 0 -233.5 -72t-139.5 -176z" /> +<glyph unicode="f" horiz-adv-x="608" d="M-23 -532l293 1378h-157l16 76l162 18q25 115 49.5 197t48 138t46 92t42.5 58q49 57 111.5 79t124.5 22q8 0 28.5 -1t45 -4t50 -10.5t48.5 -19.5l-62 -121q-6 0 -26.5 7t-47 16.5t-56 17.5t-54.5 8q-31 0 -54.5 -17.5t-44 -57t-39 -105t-38.5 -162.5l-29 -135h221 l-20 -96h-221l-293 -1378h-144z" /> +<glyph unicode="g" d="M-29 -406l25 111q43 -25 95 -45t106.5 -33.5t107.5 -21.5t98 -8q154 0 241 91t128 298l37 182h-8q-33 -37 -77 -72t-96.5 -61.5t-111.5 -43t-123 -16.5q-86 0 -148.5 30t-102.5 81t-58 119.5t-18 146.5q0 113 37.5 224.5t109.5 199.5t175.5 142.5t234.5 54.5 q141 0 215.5 -60.5t83.5 -146.5l65 176h113l-203 -954q-31 -139 -75 -235.5t-105.5 -156t-144.5 -86t-191 -26.5q-220 -1 -410 110zM217 369q0 -55 11.5 -104.5t37 -87.5t67.5 -59.5t103 -21.5q47 0 98.5 13.5t102.5 40t99 65.5t87 88l64 301q-12 117 -85 182.5t-184 65.5 q-86 0 -159.5 -39t-126.5 -105.5t-84 -153.5t-31 -185z" /> +<glyph unicode="h" horiz-adv-x="1112" d="M39 0l321 1516h144l-160 -750q45 86 147.5 146.5t239.5 60.5q55 0 103.5 -12.5t83 -39t55 -69.5t20.5 -107q0 -47 -12 -104l-137 -641h-144l134 623q8 39 8 77q0 82 -43 117t-115 35q-51 0 -104.5 -16.5t-102.5 -48t-92 -77.5t-74 -106l-129 -604h-143z" /> +<glyph unicode="i" horiz-adv-x="458" d="M39 0l201 942h143l-201 -942h-143zM279 1268q0 25 11 47t28.5 39.5t41 28t48.5 10.5q37 0 60.5 -28t23.5 -62q0 -49 -41 -84t-89 -35q-37 0 -60 24.5t-23 59.5z" /> +<glyph unicode="j" horiz-adv-x="460" d="M-293 -403q12 -6 43 -7q70 0 119 40t82 99.5t53.5 131t34.5 135.5l201 946h143l-201 -948q-23 -104 -62.5 -199.5t-94 -167t-122 -113.5t-145.5 -42q-14 0 -26.5 1t-16.5 5zM281 1268q0 47 38.5 86t88.5 39q37 0 61.5 -28t24.5 -62q0 -49 -41 -84t-88 -35 q-37 0 -60.5 24.5t-23.5 59.5z" /> +<glyph unicode="k" horiz-adv-x="964" d="M39 0l321 1516h144l-207 -973l500 399h164l-408 -332l272 -610h-163l-230 512l-172 -141l-78 -371h-143z" /> +<glyph unicode="l" horiz-adv-x="483" d="M51 0l322 1516h143l-321 -1516h-144z" /> +<glyph unicode="m" horiz-adv-x="1757" d="M39 0l201 942h112l-22 -176h8q45 86 143.5 146.5t233.5 60.5q123 0 193.5 -54.5t72.5 -152.5q59 82 156.5 144.5t236.5 62.5q53 0 101.5 -12.5t84 -40t57 -71.5t21.5 -108q0 -45 -12 -100l-137 -641h-143l133 623q8 39 8 75q0 84 -45 119t-117 35q-104 0 -201.5 -64.5 t-158.5 -183.5l-129 -604h-144l133 623q8 39 9 75q0 84 -45.5 119t-116.5 35q-104 0 -201.5 -64.5t-159.5 -183.5l-129 -604h-143z" /> +<glyph unicode="n" horiz-adv-x="1112" d="M39 0l201 942h112l-22 -176h8q45 86 150.5 146.5t242.5 60.5q55 0 103.5 -12.5t83 -39t55 -69.5t20.5 -107q0 -47 -12 -104l-137 -641h-144l134 623q8 39 8 77q0 80 -43 116t-115 36q-51 0 -104.5 -16.5t-102.5 -48t-92 -77.5t-74 -106l-129 -604h-143z" /> +<glyph unicode="o" horiz-adv-x="1155" d="M68 367q0 113 38.5 221t113.5 194t186.5 138.5t257.5 52.5q102 0 174.5 -32t120 -86t69 -125t21.5 -150q0 -115 -37 -223.5t-111 -192.5t-184.5 -136.5t-257.5 -52.5q-102 0 -177 31t-122 85t-69.5 125t-22.5 151zM221 383q0 -59 14.5 -113.5t46 -95.5t81 -65.5 t118.5 -24.5q102 0 179 42t129.5 109.5t78 152.5t25.5 171q0 61 -14.5 115.5t-46 95.5t-81 64.5t-118.5 23.5q-102 0 -180 -42t-129.5 -109.5t-77 -152.5t-25.5 -171z" /> +<glyph unicode="p" horiz-adv-x="1179" d="M-74 -532l314 1474h112l-20 -176h8q33 37 77 75t96 66.5t112.5 47t126.5 18.5q84 0 145 -30t101 -81t59.5 -119.5t19.5 -144.5q0 -117 -39 -228.5t-110.5 -198.5t-175 -141.5t-234.5 -54.5q-137 0 -213 59.5t-84 147.5l-151 -714h-144zM256 344q6 -59 31.5 -104t63.5 -78 t87 -49.5t103 -16.5q88 0 158.5 40t119.5 106.5t76 151.5t27 175q0 57 -13.5 108.5t-41 90.5t-71.5 61.5t-106 22.5q-98 0 -195.5 -53.5t-175.5 -153.5z" /> +<glyph unicode="q" horiz-adv-x="1179" d="M68 360q0 113 36.5 222.5t105.5 196.5t166 140.5t220 53.5q68 0 122 -18.5t95 -47t68.5 -65.5t46.5 -76h8l53 176h113l-314 -1474h-143l152 714q-45 -88 -145.5 -147.5t-237.5 -59.5q-90 0 -155.5 31t-107.5 83t-62.5 121.5t-20.5 149.5zM219 371q0 -117 53.5 -196 t167.5 -79q53 0 109.5 16.5t109 49.5t97.5 78t75 104l64 301q-35 100 -108.5 153.5t-172.5 53.5q-96 0 -169.5 -44t-124 -113.5t-76 -155.5t-25.5 -168z" /> +<glyph unicode="r" horiz-adv-x="729" d="M39 0l201 942h112l-28 -207h8q25 47 57.5 90t73.5 76t88 52.5t102 19.5q39 0 79 -13.5t54 -33.5l-71 -135q-29 18 -59.5 29t-61.5 11q-41 0 -83 -22.5t-81 -61t-72.5 -90t-58.5 -106.5l-117 -551h-143z" /> +<glyph unicode="s" horiz-adv-x="905" d="M-4 78l65 133q59 -68 142.5 -98.5t154.5 -30.5q55 0 101.5 16.5t79 44t51 62.5t18.5 74q0 33 -22.5 71.5t-91.5 57.5l-187 49q-102 27 -140 82t-38 114q0 70 30.5 128.5t85 101.5t129.5 66.5t163 23.5q39 0 83 -5t84.5 -16.5t77.5 -27t64 -35.5l-66 -123 q-35 35 -108.5 63.5t-169.5 28.5q-117 0 -168 -45t-51 -113q0 -35 26.5 -71.5t100.5 -53.5l139 -32q66 -16 107.5 -41t66.5 -54.5t34 -62.5t9 -61q0 -70 -33 -133.5t-91 -110.5t-140 -76t-180 -29q-109 0 -194 32t-132 71z" /> +<glyph unicode="t" horiz-adv-x="634" d="M104 846l17 76l166 20l92 285h108l-61 -285h221l-20 -96h-221l-140 -653q-6 -31 -6 -54q0 -33 15.5 -43t48.5 -10q47 0 88 14.5t71 34.5l6 -108q-37 -16 -97 -33t-128 -17q-92 0 -122.5 36t-30.5 87q0 20 4 43l8 45l139 658h-158z" /> +<glyph unicode="u" horiz-adv-x="1110" d="M82 197q0 45 12 104l137 641h144l-133 -623q-4 -23 -7.5 -42t-3.5 -35q0 -82 44 -114t114 -32q104 0 207.5 61.5t167.5 180.5l127 604h143l-200 -942h-113l22 176h-8q-45 -86 -149.5 -143.5t-241.5 -57.5q-55 0 -103 11.5t-83 37t-55.5 69t-20.5 104.5z" /> +<glyph unicode="v" horiz-adv-x="1067" d="M88 942h156l194 -807l539 807h149l-628 -942h-183z" /> +<glyph unicode="w" horiz-adv-x="1685" d="M106 942h152l123 -803l467 803h151l107 -803l483 803h146l-568 -942h-194l-99 737l-428 -737h-194z" /> +<glyph unicode="x" horiz-adv-x="1052" d="M-84 0l510 481l-289 461h174l224 -358l372 358h174l-485 -457l305 -485h-174l-240 383l-397 -383h-174z" /> +<glyph unicode="y" horiz-adv-x="1060" d="M-158 -383q6 -2 13.5 -4t27.5 -2q137 0 251 114.5t222 305.5l-276 911h170l207 -784l504 784h161l-635 -950q-43 -66 -105.5 -155t-140 -169t-168.5 -136t-192 -56q-16 0 -23.5 1t-15.5 5v135z" /> +<glyph unicode="z" horiz-adv-x="849" d="M-35 0l27 123l645 698h-477l26 121h643l-26 -119l-649 -702h522l-27 -121h-684z" /> +<glyph unicode="{" horiz-adv-x="579" d="M88 639l12 61q55 2 92 31t59.5 70t34 86t19.5 82q27 125 43.5 233.5t51 186t102 122.5t198.5 45l-4 -43q-47 -4 -77.5 -22t-50 -46t-31 -65t-19.5 -75l-57 -293q-12 -63 -32.5 -119.5t-52.5 -102t-77 -77t-104 -43.5q78 -18 107.5 -81t29.5 -145q0 -55 -15.5 -123.5 t-33 -137t-32.5 -130t-15 -100.5q0 -47 21.5 -84t80.5 -43l-14 -43q-66 0 -110 14.5t-70.5 39t-37 60t-10.5 78.5q0 49 16.5 117t35 139.5t35 139t16.5 114.5q0 25 -5.5 51.5t-17.5 49t-33.5 37t-54.5 16.5z" /> +<glyph unicode="|" horiz-adv-x="495" d="M16 -233l383 1806h127l-383 -1806h-127z" /> +<glyph unicode="}" horiz-adv-x="577" d="M-76 -217l4 43q47 4 78 22.5t50.5 46t30.5 63.5t19 77q20 98 38 201.5t50.5 192.5t87 154.5t148.5 86.5q-76 18 -106.5 80.5t-30.5 144.5q0 55 15.5 123.5t32.5 137.5t32.5 130.5t15.5 99.5q0 47 -20.5 84t-79.5 43l12 43q131 0 179 -53t48 -139q0 -49 -15 -116.5 t-34.5 -139.5t-35 -138.5t-15.5 -113.5q0 -25 5 -51.5t17.5 -49t33 -38t53.5 -17.5l-13 -61q-55 -2 -91 -29.5t-58.5 -66.5t-33.5 -84t-19 -82q-27 -125 -43.5 -233.5t-52.5 -188.5t-104.5 -126t-197.5 -46z" /> +<glyph unicode="~" horiz-adv-x="1013" d="M121 414q2 14 20.5 40.5t48 53.5t68.5 45t82 18q27 0 70 -3t93 -6t102 -6t97 -3q35 0 73 8t73 45l20 -16q-2 -6 -17 -32t-43 -53.5t-65.5 -50t-87.5 -22.5q-23 0 -73 3t-109 6t-115.5 6.5t-89.5 3.5q-51 0 -74.5 -13.5t-48.5 -38.5z" /> +<glyph unicode="&#xa1;" horiz-adv-x="491" d="M-66 -446l281 1089h96l-178 -1089h-199zM219 862q0 45 36 78t81 33q35 0 56.5 -22.5t21.5 -57.5q0 -23 -11.5 -42.5t-28 -35.5t-38 -25.5t-41.5 -9.5q-35 0 -55.5 24.5t-20.5 57.5z" /> +<glyph unicode="&#xa2;" horiz-adv-x="1040" d="M66 350q0 98 32.5 194.5t100 174.5t169 129t240.5 61l58 273h122l-59 -275q80 -6 150.5 -26.5t111.5 -51.5l-61 -120q-33 29 -93.5 51t-131.5 33l-150 -703q74 10 150.5 42t136.5 79v-133q-53 -31 -135 -59.5t-175 -38.5l-55 -261h-123l54 258q-88 6 -153 38t-107 82 t-62 114.5t-20 138.5zM223 383q0 -106 51.5 -187t159.5 -102l150 701q-92 -10 -161 -50t-113 -97.5t-65.5 -126t-21.5 -138.5z" /> +<glyph unicode="&#xa3;" horiz-adv-x="1159" d="M-41 33q88 35 154.5 86t113.5 113.5t77 134t46 145.5l6 31h-200l22 106h193q10 94 14 184.5t21 161.5q20 100 70 170t115.5 114t139.5 63.5t141 19.5q94 0 174 -29.5t125 -70.5l-65 -136q-33 41 -104.5 71t-153.5 30q-61 0 -105.5 -17.5t-75 -48.5t-49 -72.5t-28.5 -89.5 q-16 -70 -20.5 -158.5t-20.5 -191.5h285l-23 -106h-281q-27 -104 -91 -220t-167 -212l2 -7q63 -4 126 -17t124.5 -28.5t125 -28t130.5 -12.5q51 0 94.5 9.5t96.5 29.5l-72 -149q-57 -27 -93 -34t-81 -7q-74 0 -140.5 21.5t-132 46t-134 46t-148.5 21.5q-20 0 -77.5 -9 t-125.5 -56z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1187" d="M12 55l195 164q-23 39 -35 87t-12 95q0 33 5 67t20.5 73t46 83t83.5 95l-133 164l74 61l129 -162q76 47 140.5 68.5t133.5 21.5q72 0 127.5 -21.5t104.5 -68.5l201 160l49 -59l-197 -164q23 -43 34 -90t11 -94q0 -78 -31.5 -152t-117.5 -164l129 -164l-76 -61l-133 162 q-68 -45 -134.5 -69t-133.5 -24q-66 0 -121.5 23t-114.5 70l-197 -162zM266 416q0 -53 17.5 -99.5t50.5 -80t78 -53t100 -19.5q72 0 138.5 28.5t118.5 77.5t84 114t32 138q0 53 -17.5 99.5t-49.5 80t-77 53t-100 19.5q-72 0 -138.5 -28.5t-119.5 -76.5t-85 -113.5 t-32 -139.5z" /> +<glyph unicode="&#xa5;" horiz-adv-x="1339" d="M205 416l22 106h353l6 25l-37 84h-299l22 106h230l-273 615h183l290 -650l551 650h179l-535 -615h233l-22 -106h-303l-66 -76l-8 -33h354l-22 -106h-354l-86 -416h-154l88 416h-352z" /> +<glyph unicode="&#xa6;" horiz-adv-x="499" d="M18 -233l168 794h127l-168 -794h-127zM233 778l168 795h127l-168 -795h-127z" /> +<glyph unicode="&#xa7;" horiz-adv-x="907" d="M37 -51l80 137q29 -41 76 -63.5t98 -22.5q37 0 71.5 13.5t62.5 38t44 57t16 73.5q0 49 -25.5 90t-65.5 80t-85 77t-85 81t-65.5 92t-25.5 113q0 45 15.5 90t42 86t62.5 77t77 60q-8 27 -8 68q0 88 36.5 155.5t92 111.5t121 66.5t122.5 22.5q59 0 119.5 -22.5t99.5 -55.5 l-79 -137q-29 41 -76 63.5t-99 22.5q-35 0 -69.5 -11.5t-62 -35t-45 -56t-17.5 -75.5q0 -49 25.5 -91t65.5 -81t85 -77t85 -81t65.5 -94t25.5 -113q0 -45 -15.5 -90t-42 -87t-62 -78t-76.5 -60q4 -16 6 -32.5t2 -33.5q0 -90 -37 -156.5t-92.5 -110.5t-121 -66.5 t-122.5 -22.5q-59 0 -119.5 22.5t-99.5 55.5zM274 782q0 -59 36 -106t87.5 -93t104.5 -95.5t88 -110.5q41 31 63.5 77t22.5 87q0 57 -36 104t-87 93t-104.5 95.5t-88.5 112.5q-43 -31 -64.5 -78t-21.5 -86z" /> +<glyph unicode="&#xa8;" horiz-adv-x="450" d="M272 1276q0 41 33 74.5t74 33.5q29 0 48 -22.5t19 -54.5q0 -43 -33.5 -74t-72.5 -31q-31 0 -49.5 20.5t-18.5 53.5zM553 1276q0 41 32.5 74.5t73.5 33.5q29 0 48.5 -22.5t19.5 -54.5q0 -43 -34 -74t-72 -31q-31 0 -49.5 20.5t-18.5 53.5z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1488" d="M145 621q0 143 64.5 274t172 229.5t245 156.5t282.5 58q113 0 206 -39.5t159.5 -108.5t103.5 -162t37 -200q0 -147 -65.5 -278t-173 -230.5t-248 -157t-289.5 -57.5q-109 0 -200 40t-156.5 110t-101.5 164.5t-36 200.5zM242 629q0 -92 29.5 -173t85 -139.5t132 -92.5 t168.5 -34q131 0 251 50.5t211 135.5t145.5 199.5t54.5 243.5q0 92 -31 172t-86 138.5t-134 92t-175 33.5q-127 0 -244 -50t-208 -136t-145 -199.5t-54 -240.5zM436 649q0 76 23.5 152t74 134t129 95t189.5 37q68 0 131.5 -15.5t97.5 -41.5l-47 -105q-27 25 -85 43.5 t-118 18.5q-74 0 -125 -27t-81.5 -69t-45 -93t-14.5 -102q0 -80 41 -135.5t131 -55.5q59 0 125 23.5t115 62.5l-6 -114q-47 -27 -122 -49.5t-153 -22.5q-135 0 -197.5 76.5t-62.5 187.5z" /> +<glyph unicode="&#xaa;" horiz-adv-x="759" d="M186 868q0 82 42 132.5t101.5 76t126 33.5t113.5 8h56l2 15q2 10 2 30q0 106 -131 107q-53 0 -95.5 -13.5t-83.5 -35.5l-4 73q47 25 98.5 39.5t108.5 14.5q41 0 80 -8.5t68.5 -27t47 -48t17.5 -72.5q0 -23 -6 -49l-82 -387h-82l10 100h-8q-39 -47 -108.5 -82t-141.5 -35 q-66 0 -98.5 37t-32.5 92zM287 887q0 -63 75 -64q49 0 114 34t112 93l20 99h-10q-55 0 -110.5 -4.5t-100.5 -20.5t-72.5 -49t-27.5 -88z" /> +<glyph unicode="&#xab;" horiz-adv-x="985" d="M88 487l2 11l352 362h162l-373 -362l-2 -11l217 -362h-163zM420 487l2 11l352 362h162l-373 -362l-2 -11l217 -362h-164z" /> +<glyph unicode="&#xac;" horiz-adv-x="1298" d="M162 592l22 106h983l-98 -458h-108l75 352h-874z" /> +<glyph unicode="&#xad;" horiz-adv-x="999" d="M125 436l27 107h688l-27 -107h-688z" /> +<glyph unicode="&#xae;" horiz-adv-x="1488" d="M145 621q0 143 64.5 274t172 229.5t245 156.5t282.5 58q113 0 206 -39.5t159.5 -108.5t103.5 -162t37 -200q0 -147 -65.5 -278t-173 -230.5t-248 -157t-289.5 -57.5q-109 0 -200 40t-156.5 110t-101.5 164.5t-36 200.5zM242 629q0 -92 29.5 -173t85 -139.5t132 -92.5 t168.5 -34q131 0 251 50.5t211 135.5t145.5 199.5t54.5 243.5q0 92 -31 172t-86 138.5t-134 92t-175 33.5q-127 0 -244 -50t-208 -136t-145 -199.5t-54 -240.5zM508 412l143 673q35 2 87.5 3.5t88.5 1.5q98 0 159 -31t61 -117q0 -84 -57.5 -144.5t-149.5 -82.5l141 -303 h-113l-139 297h-59l-64 -297h-98zM686 782q16 -2 37 -2h43q80 0 128 40t48 108q0 37 -29.5 60.5t-99.5 23.5q-23 0 -42 -1t-38 -1z" /> +<glyph unicode="&#xb0;" horiz-adv-x="729" d="M221 1065q0 55 21.5 106.5t61.5 90t96.5 62.5t125.5 24q106 0 156.5 -56.5t50.5 -138.5q0 -53 -19.5 -102.5t-58.5 -87t-96 -61t-133 -23.5q-109 0 -157 56t-48 130zM319 1079q0 -53 30 -88t93 -35q94 0 140.5 54.5t46.5 130.5q0 53 -29 88t-94 35q-49 0 -84 -15.5 t-58.5 -42t-34 -59.5t-10.5 -68z" /> +<glyph unicode="&#xb1;" horiz-adv-x="987" d="M84 143l22 109h654l-23 -109h-653zM182 610l25 109h272l45 213h107l-45 -213h274l-24 -109h-275l-49 -235h-106l49 235h-273z" /> +<glyph unicode="&#xb2;" horiz-adv-x="763" d="M141 612l19 86q66 66 147.5 125.5t153 117.5t121 118.5t49.5 126.5q0 33 -19.5 63.5t-79.5 30.5q-53 0 -113.5 -31.5t-105.5 -77.5l-4 91q57 43 121 71.5t123 28.5q92 0 139 -44t47 -116q0 -76 -40 -139.5t-104.5 -121.5t-146 -116.5t-163.5 -126.5h358l-18 -86h-484z " /> +<glyph unicode="&#xb3;" horiz-adv-x="727" d="M135 680l43 82q35 -35 66.5 -56.5t93.5 -21.5q125 0 178 57.5t53 141.5q0 47 -36.5 74.5t-131.5 27.5h-24l14 70h31q92 0 135 43t43 110q0 33 -21.5 52.5t-80.5 19.5q-55 0 -97.5 -17.5t-78.5 -41.5l-7 79q47 27 95.5 44.5t97.5 17.5q94 0 144 -39t50 -113 q0 -68 -47 -112.5t-106 -71.5q57 -18 89 -55t32 -94q0 -49 -20.5 -97.5t-63.5 -88.5t-107.5 -64.5t-152.5 -24.5q-72 0 -112 20.5t-79 57.5z" /> +<glyph unicode="&#xb4;" horiz-adv-x="448" d="M250 1171l8 15l414 207q29 -2 44 -18.5t15 -39.5q0 -27 -18 -53l-447 -158l-12 6z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1181" d="M-86 -227q51 70 93 132t76 125.5t58.5 129t40.5 141.5l137 641h144l-133 -623q-8 -33 -8 -71q0 -66 34.5 -109t122.5 -43q104 0 206.5 61.5t166.5 180.5l127 604h143l-198 -942h-113l20 176h-8q-45 -86 -149.5 -143.5t-241.5 -57.5q-66 0 -121 16.5t-90 55.5l-12 -27 q-35 -78 -79 -153.5t-97 -153.5z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1101" d="M145 846q0 121 44 216t124 161.5t188.5 102.5t237.5 36q72 0 155 -3t169 -7l-324 -1528h-92l297 1403h-110l-297 -1403h-103l146 684h-43q-102 0 -176 26.5t-122.5 72.5t-71 107.5t-22.5 131.5z" /> +<glyph unicode="&#xb7;" horiz-adv-x="497" d="M137 481q0 43 37 79t82 36q33 0 55.5 -24.5t22.5 -59.5q0 -23 -11.5 -42t-27.5 -33.5t-37.5 -24t-42.5 -9.5q-35 0 -56.5 22.5t-21.5 55.5z" /> +<glyph unicode="&#xb8;" horiz-adv-x="413" d="M-78 -365l37 48h14q23 -10 61 -17.5t77 -7.5q51 0 91 21.5t40 82.5q0 41 -27 56.5t-63 15.5q-25 0 -52.5 -4t-50.5 -10l-12 22l137 158h70l-84 -104q39 8 71 8q61 0 97.5 -35t36.5 -88q0 -39 -21.5 -74t-57.5 -62.5t-84 -44t-102 -16.5q-49 0 -95 11.5t-83 27.5v12z" /> +<glyph unicode="&#xb9;" horiz-adv-x="499" d="M221 1227l283 135l-160 -750h-111l125 586l-129 -57z" /> +<glyph unicode="&#xba;" horiz-adv-x="796" d="M207 989q0 70 26.5 134.5t73.5 114.5t111.5 80t142.5 30q115 0 172.5 -72t57.5 -170q0 -66 -24 -128.5t-70 -111.5t-111.5 -79.5t-149.5 -30.5q-61 0 -104 19.5t-71 51t-41 73.5t-13 89zM313 999q0 -68 34 -113.5t108 -45.5q61 0 105 22.5t71.5 59t40 83t12.5 93.5 q0 66 -35 112.5t-112 46.5q-66 0 -109 -24.5t-68.5 -62t-36 -83t-10.5 -88.5z" /> +<glyph unicode="&#xbb;" horiz-adv-x="985" d="M20 125l373 362l2 11l-219 362h162l199 -362l-2 -11l-351 -362h-164zM352 125l373 362l2 11l-219 362h162l198 -362l-2 -11l-350 -362h-164z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1458" d="M35 -49l1259 1464h133l-1259 -1464h-133zM215 1227l283 135l-160 -750h-111l125 586l-129 -57zM825 225l19 86l393 437h98l-92 -437h74l-19 -86h-73l-49 -227h-93l50 227h-308zM948 311h203l68 316z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1462" d="M-2 -49l1259 1464h134l-1260 -1464h-133zM219 1227l283 135l-160 -750h-111l125 586l-129 -57zM772 -4l19 86q66 66 147.5 125t153 117.5t121 119t49.5 125.5q0 33 -19.5 64t-79.5 31q-53 0 -113.5 -32t-105.5 -77l-4 90q57 43 120.5 71.5t123.5 28.5q92 0 139 -44 t47 -115q0 -76 -40 -139.5t-104.5 -122t-146.5 -116.5t-164 -126h359l-19 -86h-483z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1538" d="M100 680l43 82q35 -35 67 -56.5t93 -21.5q125 0 178.5 57.5t53.5 141.5q0 47 -37 74.5t-131 27.5h-25l14 70h31q92 0 135 43t43 110q0 33 -21.5 52.5t-80.5 19.5q-55 0 -97 -17.5t-79 -41.5l-6 79q47 27 95 44.5t97 17.5q94 0 144.5 -39t50.5 -113q0 -68 -47.5 -112.5 t-106.5 -71.5q57 -18 89 -55t32 -94q0 -49 -20.5 -97.5t-63.5 -88.5t-107.5 -64.5t-152.5 -24.5q-72 0 -112 20.5t-79 57.5zM141 -49l1260 1464h133l-1260 -1464h-133zM903 225l19 86l393 437h98l-92 -437h74l-19 -86h-73l-50 -227h-92l49 227h-307zM1026 311h203l67 316z " /> +<glyph unicode="&#xbf;" horiz-adv-x="831" d="M-51 -188q0 74 28.5 136t73.5 119.5t99.5 116t106.5 126t96 148.5t67 183h131q-25 -113 -68 -197t-93 -150.5t-102 -120.5t-94 -105.5t-69 -106.5t-27 -125q0 -66 42 -112t134 -46q33 0 71 8.5t76 21.5t71.5 31.5t60.5 41.5l8 -135q-66 -43 -152.5 -72t-164.5 -29 q-141 0 -218 74t-77 193zM430 862q0 43 39 77t82 34q35 0 55.5 -22.5t20.5 -55.5q0 -43 -35 -79t-82 -36q-35 0 -57.5 23.5t-22.5 58.5z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1316" d="M-102 0l827 1352h186l308 -1352h-175l-102 455h-604l-277 -455h-163zM424 598h485l-129 582zM678 1639v12q0 35 23.5 59.5t64.5 26.5l328 -205l2 -14l-21 -41l-16 -7l-379 158q-2 4 -2 11z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1316" d="M-102 0l827 1352h186l308 -1352h-175l-102 455h-604l-277 -455h-163zM424 598h485l-129 582zM649 1518l8 14l412 205q31 -2 45 -17.5t14 -38.5q0 -29 -16 -53l-446 -158l-15 7z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1316" d="M-102 0l827 1352h186l308 -1352h-175l-102 455h-604l-277 -455h-163zM424 598h485l-129 582zM635 1507l10 15l268 202h17l182 -202l2 -15l-20 -41l-15 -6l-186 127l-240 -127l-14 6z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1316" d="M-102 0l827 1352h186l308 -1352h-175l-102 455h-604l-277 -455h-163zM424 598h485l-129 582zM559 1540q14 27 33.5 55.5t46.5 50t61.5 36t77.5 14.5q51 0 88 -4t69 -10.5t61.5 -10.5t68.5 -4q35 0 72 8t73 45l21 -16q-12 -29 -31.5 -56.5t-46.5 -50t-60.5 -37 t-76.5 -14.5q-82 0 -164 14.5t-147 14.5q-51 0 -74 -13.5t-49 -37.5z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1316" d="M-102 0l827 1352h186l308 -1352h-175l-102 455h-604l-277 -455h-163zM424 598h485l-129 582zM649 1610q0 41 32 74.5t73 33.5q29 0 49 -22.5t20 -55.5q0 -43 -34.5 -73.5t-73.5 -30.5q-31 0 -48.5 20.5t-17.5 53.5zM971 1610q0 41 31.5 74.5t72.5 33.5q29 0 48.5 -22.5 t19.5 -53.5q0 -45 -35 -75.5t-72 -30.5q-29 0 -47 20.5t-18 53.5z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1316" d="M-102 0l809 1321q-25 16 -38.5 43t-13.5 57q0 35 16.5 68t46.5 57.5t68.5 40t83.5 15.5q72 0 109 -41t37 -95q0 -49 -29 -86t-69 -59l301 -1321h-175l-102 455h-604l-277 -455h-163zM426 598h483l-131 582zM737 1427q0 -35 22.5 -61.5t57.5 -26.5q45 0 81 37t36 82 q0 35 -21.5 58.5t-56.5 23.5q-53 0 -86 -33t-33 -80z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1560" d="M-125 0l1008 1352h725l-31 -144h-485l-88 -420h348l-31 -143h-348l-107 -502h527l-31 -143h-680l96 455h-397l-338 -455h-168zM487 598h322l129 606z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1318" d="M125 508q0 166 57.5 320.5t167 272.5t266 189.5t355.5 71.5q111 0 216 -23.5t177 -64.5l-76 -148q-55 43 -145 72t-213 29q-188 0 -311 -63.5t-195 -166t-100.5 -229.5t-28.5 -252q0 -199 98.5 -302t294.5 -103q129 0 245 36.5t193 90.5l13 -138q-90 -47 -207 -83.5 t-256 -41.5l-66 -79q18 4 36 6t32 2q63 0 99 -34t36 -87q0 -39 -21.5 -75t-57.5 -63.5t-84 -44t-101 -16.5q-49 0 -96 11.5t-82 27.5l2 12l35 48h14q23 -10 59.5 -17.5t77.5 -7.5q53 0 91 21.5t38 82.5q0 41 -25.5 56.5t-62.5 15.5q-25 0 -51.5 -4t-50.5 -10l-13 22l117 135 q-125 8 -215 53.5t-148.5 117t-86 164t-27.5 196.5z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1069" d="M86 0l287 1352h741l-31 -144h-587l-88 -420h450l-31 -143h-450l-107 -502h629l-31 -143h-782zM580 1639v12q0 35 23.5 59.5t64.5 26.5l327 -205l4 -14l-22 -41l-16 -7l-379 158q-2 4 -2 11z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1069" d="M86 0l287 1352h741l-31 -144h-587l-88 -420h450l-31 -143h-450l-107 -502h629l-31 -143h-782zM571 1518l9 14l413 205q59 -4 60 -56q0 -20 -6.5 -31.5t-12.5 -21.5l-446 -158l-15 7z" /> +<glyph unicode="&#xca;" horiz-adv-x="1069" d="M86 0l287 1352h741l-31 -144h-587l-88 -420h450l-31 -143h-450l-107 -502h629l-31 -143h-782zM551 1507l10 15l268 202h17l182 -202l2 -15l-20 -41l-15 -6l-186 127l-240 -127l-14 6z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1069" d="M86 0l287 1352h741l-31 -144h-587l-88 -420h450l-31 -143h-450l-107 -502h629l-31 -143h-782zM551 1610q0 41 31.5 74.5t72.5 33.5q29 0 49.5 -22.5t20.5 -55.5q0 -43 -35 -73.5t-74 -30.5q-31 0 -48 20.5t-17 53.5zM872 1610q0 41 32 74.5t73 33.5q29 0 49.5 -22.5 t20.5 -55.5q0 -43 -35 -73.5t-74 -30.5q-31 0 -48.5 20.5t-17.5 53.5z" /> +<glyph unicode="&#xcc;" horiz-adv-x="561" d="M86 0l287 1352h153l-286 -1352h-154zM266 1639v12q0 35 23.5 59.5t64.5 26.5l328 -205l4 -14l-22 -41l-15 -7l-381 158q-2 4 -2 11z" /> +<glyph unicode="&#xcd;" horiz-adv-x="561" d="M86 0l287 1352h153l-286 -1352h-154zM279 1518l8 14l413 205q31 -2 45.5 -17.5t14.5 -38.5q0 -20 -6 -31.5t-13 -21.5l-444 -158l-16 7z" /> +<glyph unicode="&#xce;" horiz-adv-x="561" d="M86 0l287 1352h153l-286 -1352h-154zM240 1507l10 15l268 202h14l185 -202l2 -15l-21 -41l-16 -6l-184 127l-240 -127l-16 6z" /> +<glyph unicode="&#xcf;" horiz-adv-x="561" d="M86 0l287 1352h153l-286 -1352h-154zM266 1610q0 41 32 74.5t73 33.5q29 0 49 -22.5t20 -55.5q0 -43 -34.5 -73.5t-73.5 -30.5q-29 0 -47.5 20.5t-18.5 53.5zM588 1610q0 41 31.5 74.5t72.5 33.5q29 0 49.5 -22.5t20.5 -55.5q0 -43 -35 -73.5t-74 -30.5q-31 0 -48 20.5 t-17 53.5z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1462" d="M59 668l19 90h178l127 594l10 2q47 6 101.5 8t111.5 2q121 0 220.5 -4t180 -19.5t145.5 -47t116 -85.5q59 -66 86.5 -168t27.5 -211q0 -162 -53 -315.5t-157.5 -273t-258 -192.5t-354.5 -73q-145 0 -259 7.5t-204 17.5l142 668h-179zM274 123q129 -12 308 -12 q158 0 276.5 53t197.5 149.5t118.5 229.5t39.5 293q0 88 -21.5 159.5t-69.5 122.5t-123.5 80t-184.5 29q-82 0 -162 -1t-145 -5l-98 -463h358l-18 -90h-359z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1443" d="M86 0l287 1352h174l473 -1112l235 1112h154l-287 -1352h-174l-473 1110l-235 -1110h-154zM586 1540q14 27 33.5 55.5t46 50t61.5 36t78 14.5q51 0 88 -4t68.5 -10.5t61.5 -10.5t69 -4q35 0 71.5 8t73.5 45l20 -16q-12 -29 -31.5 -56.5t-46 -50t-60.5 -37t-77 -14.5 q-82 0 -163.5 14.5t-147.5 14.5q-51 0 -73.5 -13.5t-49.5 -37.5z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1560" d="M123 510q0 168 59.5 321.5t169 271.5t262 188.5t338.5 70.5q135 0 234.5 -43t166 -118t99.5 -174t33 -212q0 -154 -57.5 -303.5t-167 -269t-265 -193.5t-352.5 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM283 504q0 -184 105.5 -288.5t303.5 -104.5 q160 0 280 63.5t198.5 164.5t117.5 230t39 260q0 88 -25.5 161t-78 125t-133 82t-191.5 30q-164 0 -280.5 -63.5t-191.5 -166t-109.5 -232.5t-34.5 -261zM731 1651q0 35 23.5 59.5t66.5 26.5l324 -205l4 -14l-19 -41l-18 -7l-379 158q0 4 -1 11.5t-1 11.5z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1560" d="M123 510q0 168 59.5 321.5t169 271.5t262 188.5t338.5 70.5q135 0 234.5 -43t166 -118t99.5 -174t33 -212q0 -154 -57.5 -303.5t-167 -269t-265 -193.5t-352.5 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM283 504q0 -184 105.5 -288.5t303.5 -104.5 q160 0 280 63.5t198.5 164.5t117.5 230t39 260q0 88 -25.5 161t-78 125t-133 82t-191.5 30q-164 0 -280.5 -63.5t-191.5 -166t-109.5 -232.5t-34.5 -261zM840 1518l8 14l414 205q29 -2 43 -17.5t14 -38.5q0 -20 -16 -53l-447 -158l-14 7z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1560" d="M123 510q0 168 59.5 321.5t169 271.5t262 188.5t338.5 70.5q135 0 234.5 -43t166 -118t99.5 -174t33 -212q0 -154 -57.5 -303.5t-167 -269t-265 -193.5t-352.5 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM283 504q0 -184 105.5 -288.5t303.5 -104.5 q160 0 280 63.5t198.5 164.5t117.5 230t39 260q0 88 -25.5 161t-78 125t-133 82t-191.5 30q-164 0 -280.5 -63.5t-191.5 -166t-109.5 -232.5t-34.5 -261zM764 1507l8 15l268 202h17l182 -202l4 -15l-20 -41l-17 -6l-186 127l-240 -127l-12 6z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1560" d="M123 510q0 168 59.5 321.5t169 271.5t262 188.5t338.5 70.5q135 0 234.5 -43t166 -118t99.5 -174t33 -212q0 -154 -57.5 -303.5t-167 -269t-265 -193.5t-352.5 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM283 504q0 -184 105.5 -288.5t303.5 -104.5 q160 0 280 63.5t198.5 164.5t117.5 230t39 260q0 88 -25.5 161t-78 125t-133 82t-191.5 30q-164 0 -280.5 -63.5t-191.5 -166t-109.5 -232.5t-34.5 -261zM674 1540q14 27 34.5 55.5t46 50t60.5 36t78 14.5q51 0 88 -4t68.5 -10.5t61.5 -10.5t69 -4q35 0 72.5 8t72.5 45 l21 -16q-12 -29 -31 -56.5t-45.5 -50t-60 -37t-76.5 -14.5q-82 0 -164 14.5t-148 14.5q-51 0 -74.5 -13.5t-48.5 -37.5z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1560" d="M123 510q0 168 59.5 321.5t169 271.5t262 188.5t338.5 70.5q135 0 234.5 -43t166 -118t99.5 -174t33 -212q0 -154 -57.5 -303.5t-167 -269t-265 -193.5t-352.5 -74q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM283 504q0 -184 105.5 -288.5t303.5 -104.5 q160 0 280 63.5t198.5 164.5t117.5 230t39 260q0 88 -25.5 161t-78 125t-133 82t-191.5 30q-164 0 -280.5 -63.5t-191.5 -166t-109.5 -232.5t-34.5 -261zM762 1610q0 41 32.5 74.5t73.5 33.5q29 0 48.5 -22.5t19.5 -55.5q0 -43 -34 -73.5t-73 -30.5q-31 0 -49 20.5t-18 53.5 zM1083 1610q0 41 33 74.5t74 33.5q29 0 48 -22.5t19 -55.5q0 -43 -33.5 -73.5t-72.5 -30.5q-31 0 -49.5 20.5t-18.5 53.5z" /> +<glyph unicode="&#xd7;" horiz-adv-x="933" d="M76 242l299 247l-195 246l92 76l195 -246l301 248l59 -76l-301 -248l197 -249l-92 -76l-197 250l-299 -248z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1558" d="M8 16l191 183q-76 131 -76 311q0 168 59.5 321.5t169 271.5t262 188.5t338.5 70.5q113 0 200 -31t153 -86l170 162l88 -80l-179 -170q49 -72 74 -158t25 -184q0 -154 -57.5 -303.5t-166 -269t-264 -193.5t-352.5 -74q-123 0 -214 34t-155 95l-186 -176zM283 504 q0 -111 36 -191l875 828q-53 41 -125 63.5t-170 22.5q-164 0 -280.5 -63.5t-191.5 -166t-109.5 -232.5t-34.5 -261zM389 215q109 -104 303 -104q160 0 280 63.5t198.5 164.5t117.5 230t39 260q0 127 -55 224z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1411" d="M152 317q0 61 16 138l190 897h154l-176 -828q-18 -84 -19 -147q0 -141 78 -203.5t219 -62.5q172 0 291 96t166 317l176 828h144l-191 -897q-23 -100 -72 -187.5t-125.5 -152t-181 -101.5t-235.5 -37q-119 0 -201 26t-134 71t-75.5 107t-23.5 136zM688 1639v12 q0 35 23.5 59.5t64.5 26.5l328 -205v-14l-19 -41l-18 -7l-377 158q-2 4 -2 11z" /> +<glyph unicode="&#xda;" horiz-adv-x="1411" d="M152 317q0 61 16 138l190 897h154l-176 -828q-18 -84 -19 -147q0 -141 78 -203.5t219 -62.5q172 0 291 96t166 317l176 828h144l-191 -897q-23 -100 -72 -187.5t-125.5 -152t-181 -101.5t-235.5 -37q-119 0 -201 26t-134 71t-75.5 107t-23.5 136zM715 1518l10 14l414 205 q59 -4 59 -56q0 -20 -6 -31.5t-12 -21.5l-447 -158l-14 7z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1411" d="M152 317q0 61 16 138l190 897h154l-176 -828q-18 -84 -19 -147q0 -141 78 -203.5t219 -62.5q172 0 291 96t166 317l176 828h144l-191 -897q-23 -100 -72 -187.5t-125.5 -152t-181 -101.5t-235.5 -37q-119 0 -201 26t-134 71t-75.5 107t-23.5 136zM662 1466v41l8 15 l270 202h14l185 -202v-15l-19 -41l-18 -6l-184 127l-240 -127z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1411" d="M152 317q0 61 16 138l190 897h154l-176 -828q-18 -84 -19 -147q0 -141 78 -203.5t219 -62.5q172 0 291 96t166 317l176 828h144l-191 -897q-23 -100 -72 -187.5t-125.5 -152t-181 -101.5t-235.5 -37q-119 0 -201 26t-134 71t-75.5 107t-23.5 136zM709 1610 q0 41 32.5 74.5t73.5 33.5q29 0 48.5 -22.5t19.5 -55.5q0 -43 -34 -73.5t-73 -30.5q-31 0 -49 20.5t-18 53.5zM1030 1610q0 41 33 74.5t74 33.5q29 0 48 -22.5t19 -55.5q0 -43 -33.5 -73.5t-72.5 -30.5q-31 0 -49.5 20.5t-18.5 53.5z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1157" d="M139 1352h183l290 -650l551 650h178l-692 -797l-117 -555h-153l115 547zM637 1518l10 14l412 205q59 -4 59 -56q0 -20 -16 -53l-449 -158l-14 7z" /> +<glyph unicode="&#xde;" horiz-adv-x="1069" d="M86 0l287 1352h143l-55 -260q41 2 83 3t68 1q193 0 299.5 -84t106.5 -244q0 -90 -32 -177t-100.5 -155.5t-176 -110.5t-260.5 -42q-29 0 -73 1t-85 5l-62 -289h-143zM319 426q39 -4 82 -6t68 -2q201 0 290 93t89 255q0 92 -58.5 143.5t-201.5 51.5q-27 0 -72 -1.5 t-84 -3.5z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1110" d="M39 0l211 995q25 115 68.5 209t105 162t140.5 104.5t173 36.5q68 0 119 -19.5t87 -51t54.5 -74.5t18.5 -90q0 -82 -48 -149.5t-105.5 -126t-105.5 -110.5t-48 -106q0 -35 21.5 -63.5t52 -56t68.5 -57.5t68.5 -66.5t52 -83.5t21.5 -111q0 -98 -41 -168t-99 -114 t-124.5 -64.5t-118.5 -20.5q-68 0 -119 28t-79 63l71 145q16 -61 63.5 -95t102.5 -34q37 0 70 15.5t59.5 44t42 71.5t15.5 98q0 82 -42 131.5t-92.5 90t-92.5 87t-42 121.5q0 59 21.5 107.5t54.5 88.5t71 77t70.5 72.5t54 75.5t21.5 87q0 53 -39 93t-119 40 q-74 0 -126 -32.5t-86.5 -86t-57 -124t-39.5 -144.5l-211 -995h-143z" /> +<glyph unicode="&#xe0;" d="M66 350q0 117 37.5 228.5t110.5 198.5t176.5 141.5t234.5 54.5q137 0 212.5 -59.5t84.5 -147.5l65 176h113l-199 -942h-113l21 168h-8q-66 -76 -172.5 -134.5t-237.5 -58.5q-84 0 -145.5 30t-101.5 81t-59 119.5t-19 144.5zM217 362q0 -51 11.5 -99t37 -85t66.5 -59.5 t100 -22.5q98 0 205.5 53.5t185.5 153.5l64 301q-12 117 -85 182.5t-181 65.5q-86 0 -161 -39t-128 -104.5t-84 -156t-31 -190.5zM489 1282q0 47 19.5 78t69.5 33l325 -207l4 -15l-20 -41l-17 -6z" /> +<glyph unicode="&#xe1;" d="M66 350q0 117 37.5 228.5t110.5 198.5t176.5 141.5t234.5 54.5q137 0 212.5 -59.5t84.5 -147.5l65 176h113l-199 -942h-113l21 168h-8q-66 -76 -172.5 -134.5t-237.5 -58.5q-84 0 -145.5 30t-101.5 81t-59 119.5t-19 144.5zM217 362q0 -51 11.5 -99t37 -85t66.5 -59.5 t100 -22.5q98 0 205.5 53.5t185.5 153.5l64 301q-12 117 -85 182.5t-181 65.5q-86 0 -161 -39t-128 -104.5t-84 -156t-31 -190.5zM612 1130v41l9 15l411 207q31 -2 46.5 -18.5t15.5 -39.5t-19 -53l-446 -158z" /> +<glyph unicode="&#xe2;" d="M66 350q0 117 37.5 228.5t110.5 198.5t176.5 141.5t234.5 54.5q137 0 212.5 -59.5t84.5 -147.5l65 176h113l-199 -942h-113l21 168h-8q-66 -76 -172.5 -134.5t-237.5 -58.5q-84 0 -145.5 30t-101.5 81t-59 119.5t-19 144.5zM217 362q0 -51 11.5 -99t37 -85t66.5 -59.5 t100 -22.5q98 0 205.5 53.5t185.5 153.5l64 301q-12 117 -85 182.5t-181 65.5q-86 0 -161 -39t-128 -104.5t-84 -156t-31 -190.5zM494 1161l10 15l268 202h16l183 -202l2 -15l-21 -39l-14 -6l-186 125l-238 -125l-16 6z" /> +<glyph unicode="&#xe3;" d="M66 350q0 117 37.5 228.5t110.5 198.5t176.5 141.5t234.5 54.5q137 0 212.5 -59.5t84.5 -147.5l65 176h113l-199 -942h-113l21 168h-8q-66 -76 -172.5 -134.5t-237.5 -58.5q-84 0 -145.5 30t-101.5 81t-59 119.5t-19 144.5zM217 362q0 -51 11.5 -99t37 -85t66.5 -59.5 t100 -22.5q98 0 205.5 53.5t185.5 153.5l64 301q-12 117 -85 182.5t-181 65.5q-86 0 -161 -39t-128 -104.5t-84 -156t-31 -190.5zM432 1194q2 14 20.5 41t48 52.5t68.5 44t82 18.5q53 0 132 -9.5t169 -9.5q35 0 73 8.5t73 44.5l20 -16q-2 -6 -17.5 -31.5t-43 -53.5 t-65.5 -50.5t-87 -22.5q-23 0 -63.5 3.5t-88.5 6.5t-95.5 6t-79.5 3q-51 0 -74 -13.5t-49 -37.5z" /> +<glyph unicode="&#xe4;" d="M66 350q0 117 37.5 228.5t110.5 198.5t176.5 141.5t234.5 54.5q137 0 212.5 -59.5t84.5 -147.5l65 176h113l-199 -942h-113l21 168h-8q-66 -76 -172.5 -134.5t-237.5 -58.5q-84 0 -145.5 30t-101.5 81t-59 119.5t-19 144.5zM217 362q0 -51 11.5 -99t37 -85t66.5 -59.5 t100 -22.5q98 0 205.5 53.5t185.5 153.5l64 301q-12 117 -85 182.5t-181 65.5q-86 0 -161 -39t-128 -104.5t-84 -156t-31 -190.5zM532 1266q0 41 33 74.5t74 33.5q29 0 47.5 -22.5t18.5 -53.5q0 -45 -35 -75.5t-70 -30.5q-31 0 -49.5 20.5t-18.5 53.5zM854 1264 q0 43 33 76.5t71 33.5q29 0 48.5 -22.5t19.5 -55.5q0 -43 -34 -73.5t-72 -30.5q-29 0 -47.5 20.5t-18.5 51.5z" /> +<glyph unicode="&#xe5;" d="M66 350q0 117 37.5 228.5t110.5 198.5t176.5 141.5t234.5 54.5q137 0 212.5 -59.5t84.5 -147.5l65 176h113l-199 -942h-113l21 168h-8q-66 -76 -172.5 -134.5t-237.5 -58.5q-84 0 -145.5 30t-101.5 81t-59 119.5t-19 144.5zM217 362q0 -51 11.5 -99t37 -85t66.5 -59.5 t100 -22.5q98 0 205.5 53.5t185.5 153.5l64 301q-12 117 -85 182.5t-181 65.5q-86 0 -161 -39t-128 -104.5t-84 -156t-31 -190.5zM610 1227q0 31 15.5 61.5t42 55t64.5 40t81 15.5q70 0 105.5 -40t35.5 -89q0 -31 -14 -60.5t-41 -54.5t-64.5 -39t-82.5 -14q-74 0 -108 39 t-34 86zM688 1235q0 -33 19.5 -58.5t54.5 -25.5q47 0 79.5 36t32.5 77q0 33 -18 59.5t-55 26.5q-49 0 -81 -38t-32 -77z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1673" d="M8 190q0 92 33 158t86 112t120.5 72.5t138.5 42t137.5 19.5t119.5 4h92l6 25q4 23 7.5 39t3.5 32q0 41 -15.5 69t-40.5 48q-31 23 -68.5 32t-103.5 9q-86 0 -155.5 -22.5t-139.5 -59.5l-6 123q154 80 344 80q76 0 141.5 -13.5t108.5 -46.5q23 -16 40 -44.5t22 -57.5h8 q74 70 180.5 116t222.5 46q154 0 234 -71t80 -200q0 -59 -18.5 -117.5t-37.5 -82.5h-690l-8 -37q-12 -55 -12 -105q0 -117 64.5 -196.5t201.5 -79.5q49 0 98 10t95 25.5t86 35t73 40.5l4 -109q-31 -16 -74 -35.5t-94 -36t-109.5 -28t-119.5 -11.5q-137 0 -223 56.5 t-125 148.5h-8q-106 -113 -234.5 -159t-245.5 -46q-111 0 -165 61.5t-54 153.5zM164 221q0 -59 34.5 -92t98.5 -33q41 0 90 13.5t99.5 40t98.5 65.5t87 88l41 191h-19q-92 0 -186 -8.5t-171 -36t-125 -82t-48 -146.5zM895 610h559q4 10 10 23.5t6 50.5q0 86 -61 130t-149 44 q-135 0 -225.5 -71t-139.5 -177z" /> +<glyph unicode="&#xe7;" horiz-adv-x="1024" d="M70 369q0 111 36.5 219t112.5 193t190.5 138.5t268.5 53.5q98 0 187 -22.5t139 -59.5l-62 -121q-39 35 -121 62.5t-170 27.5q-109 0 -188.5 -41t-131.5 -107.5t-78 -148.5t-26 -164q0 -63 16.5 -119.5t50.5 -99.5t85 -67.5t123 -24.5q82 0 173 32t161 85l6 -127 q-61 -35 -160.5 -66.5t-208.5 -36.5l-65 -79q18 4 36.5 6t32.5 2q61 0 97 -34t36 -87q0 -39 -21.5 -75t-57 -63.5t-84 -44t-101.5 -16.5q-49 0 -96 11.5t-82 27.5l2 12l37 48h14q23 -10 58.5 -17.5t76.5 -7.5q53 0 91 21.5t38 82.5q0 41 -25.5 56.5t-62.5 15.5 q-25 0 -51.5 -4t-50.5 -10l-12 22l116 135q-86 8 -147.5 42t-102 86.5t-60 120t-19.5 143.5z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1054" d="M66 369q0 115 43 223t122.5 193t191.5 136.5t249 51.5q154 0 233.5 -71t79.5 -200q0 -59 -18.5 -117.5t-36.5 -82.5h-697q-12 -59 -12 -117q0 -61 15.5 -115.5t47 -95.5t82 -65.5t117.5 -24.5q98 0 193.5 35t161.5 76l4 -109q-31 -16 -74 -35.5t-94 -36t-109.5 -28 t-120.5 -11.5q-96 0 -166.5 32t-117.5 85t-70.5 125t-23.5 152zM268 610h568q4 10 9 23.5t5 50.5q0 86 -61.5 130t-147.5 44q-141 0 -233.5 -72t-139.5 -176zM444 1282q0 47 19.5 78t68.5 33l326 -207l2 -15l-18 -41l-19 -6z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1054" d="M66 369q0 115 43 223t122.5 193t191.5 136.5t249 51.5q154 0 233.5 -71t79.5 -200q0 -59 -18.5 -117.5t-36.5 -82.5h-697q-12 -59 -12 -117q0 -61 15.5 -115.5t47 -95.5t82 -65.5t117.5 -24.5q98 0 193.5 35t161.5 76l4 -109q-31 -16 -74 -35.5t-94 -36t-109.5 -28 t-120.5 -11.5q-96 0 -166.5 32t-117.5 85t-70.5 125t-23.5 152zM268 610h568q4 10 9 23.5t5 50.5q0 86 -61.5 130t-147.5 44q-141 0 -233.5 -72t-139.5 -176zM526 1171l11 15l411 207q31 -2 45.5 -18.5t14.5 -39.5q0 -18 -5.5 -30.5t-11.5 -22.5l-448 -158l-13 6z" /> +<glyph unicode="&#xea;" horiz-adv-x="1054" d="M66 369q0 115 43 223t122.5 193t191.5 136.5t249 51.5q154 0 233.5 -71t79.5 -200q0 -59 -18.5 -117.5t-36.5 -82.5h-697q-12 -59 -12 -117q0 -61 15.5 -115.5t47 -95.5t82 -65.5t117.5 -24.5q98 0 193.5 35t161.5 76l4 -109q-31 -16 -74 -35.5t-94 -36t-109.5 -28 t-120.5 -11.5q-96 0 -166.5 32t-117.5 85t-70.5 125t-23.5 152zM268 610h568q4 10 9 23.5t5 50.5q0 86 -61.5 130t-147.5 44q-141 0 -233.5 -72t-139.5 -176zM446 1161l9 15l270 202h14l185 -202v-15l-19 -39l-16 -6l-184 125l-240 -125l-16 6z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1054" d="M66 369q0 115 43 223t122.5 193t191.5 136.5t249 51.5q154 0 233.5 -71t79.5 -200q0 -59 -18.5 -117.5t-36.5 -82.5h-697q-12 -59 -12 -117q0 -61 15.5 -115.5t47 -95.5t82 -65.5t117.5 -24.5q98 0 193.5 35t161.5 76l4 -109q-31 -16 -74 -35.5t-94 -36t-109.5 -28 t-120.5 -11.5q-96 0 -166.5 32t-117.5 85t-70.5 125t-23.5 152zM268 610h568q4 10 9 23.5t5 50.5q0 86 -61.5 130t-147.5 44q-141 0 -233.5 -72t-139.5 -176zM459 1266q0 41 31.5 74.5t72.5 33.5q29 0 49.5 -22.5t20.5 -55.5q0 -43 -35 -73.5t-74 -30.5q-29 0 -47 20.5 t-18 53.5zM780 1266q0 41 32 74.5t73 33.5q29 0 49 -22.5t20 -55.5q0 -43 -34.5 -73.5t-73.5 -30.5q-29 0 -47.5 20.5t-18.5 53.5z" /> +<glyph unicode="&#xec;" horiz-adv-x="458" d="M39 0l201 942h143l-201 -942h-143zM88 1293v12q0 35 23.5 60.5t66.5 27.5l326 -207l4 -15l-23 -41l-16 -6l-379 158q-2 4 -2 11z" /> +<glyph unicode="&#xed;" horiz-adv-x="458" d="M39 0l201 942h143l-201 -942h-143zM160 1171l8 15l414 207q29 -2 44 -18.5t15 -39.5t-18 -53l-447 -158l-14 6z" /> +<glyph unicode="&#xee;" horiz-adv-x="458" d="M39 0l201 942h143l-201 -942h-143zM113 1161l8 15l268 202h17l182 -202l4 -15l-23 -39l-14 -6l-186 125l-238 -125l-16 6z" /> +<glyph unicode="&#xef;" horiz-adv-x="458" d="M39 0l201 942h143l-201 -942h-143zM133 1266q0 41 33 74.5t74 33.5q29 0 48 -22.5t19 -55.5q0 -43 -33.5 -73.5t-72.5 -30.5q-31 0 -49.5 20.5t-18.5 53.5zM455 1266q0 41 32.5 74.5t73.5 33.5q29 0 48.5 -22.5t19.5 -55.5q0 -43 -34 -73.5t-73 -30.5q-31 0 -49 20.5 t-18 53.5z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1181" d="M70 369q0 111 36.5 219t111.5 194t186.5 138.5t261.5 52.5q113 0 193.5 -38t103.5 -124l6 2q-2 123 -11.5 216t-29.5 171l-271 -65l-14 94l254 63q-23 59 -56.5 112.5t-78.5 111.5h149q31 -35 56.5 -84.5t48.5 -110.5l258 65l16 -98l-248 -61q23 -86 33 -178.5t10 -188.5 q0 -84 -10 -182t-36.5 -196.5t-71.5 -189.5t-116 -162t-169 -113t-231 -42q-104 0 -176 33t-118 87.5t-66.5 125t-20.5 148.5zM225 383q0 -59 14.5 -113.5t44 -95.5t77 -65.5t112.5 -24.5q102 0 181 46t133.5 117.5t82 160t27.5 174.5q0 137 -70.5 207.5t-191.5 70.5 q-109 0 -185.5 -44t-127 -113.5t-74 -153.5t-23.5 -166z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1112" d="M39 0l201 942h112l-22 -176h8q45 86 150.5 146.5t242.5 60.5q55 0 103.5 -12.5t83 -39t55 -69.5t20.5 -107q0 -47 -12 -104l-137 -641h-144l134 623q8 39 8 77q0 82 -43 117t-115 35q-51 0 -104.5 -16.5t-102.5 -48t-92 -77.5t-74 -106l-129 -604h-143zM379 1194 q14 27 34.5 55.5t46 50t60.5 36t78 14.5q51 0 88 -4.5t68.5 -10.5t61.5 -10t69 -4q35 0 72.5 8t72.5 45l21 -16q-12 -29 -32 -56.5t-45.5 -50t-59 -37t-76.5 -14.5q-82 0 -164 14.5t-148 14.5q-51 0 -74.5 -13.5t-50.5 -37.5z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1155" d="M68 367q0 113 38.5 221t113.5 194t186.5 138.5t257.5 52.5q102 0 174.5 -32t120 -86t69 -125t21.5 -150q0 -115 -37 -223.5t-111 -192.5t-184.5 -136.5t-257.5 -52.5q-102 0 -177 31t-122 85t-69.5 125t-22.5 151zM221 383q0 -59 14.5 -113.5t46 -95.5t81 -65.5 t118.5 -24.5q102 0 179 42t129.5 109.5t78 152.5t25.5 171q0 61 -14.5 115.5t-46 95.5t-81 64.5t-118.5 23.5q-102 0 -180 -42t-129.5 -109.5t-77 -152.5t-25.5 -171zM440 1293v12q0 35 24.5 60.5t63.5 27.5l328 -207l2 -15l-20 -41l-15 -6l-381 158q-2 4 -2 11z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1155" d="M68 367q0 113 38.5 221t113.5 194t186.5 138.5t257.5 52.5q102 0 174.5 -32t120 -86t69 -125t21.5 -150q0 -115 -37 -223.5t-111 -192.5t-184.5 -136.5t-257.5 -52.5q-102 0 -177 31t-122 85t-69.5 125t-22.5 151zM221 383q0 -59 14.5 -113.5t46 -95.5t81 -65.5 t118.5 -24.5q102 0 179 42t129.5 109.5t78 152.5t25.5 171q0 61 -14.5 115.5t-46 95.5t-81 64.5t-118.5 23.5q-102 0 -180 -42t-129.5 -109.5t-77 -152.5t-25.5 -171zM541 1171l10 15l412 207q31 -2 46 -18.5t15 -39.5t-18 -53l-447 -158l-14 6z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1155" d="M68 367q0 113 38.5 221t113.5 194t186.5 138.5t257.5 52.5q102 0 174.5 -32t120 -86t69 -125t21.5 -150q0 -115 -37 -223.5t-111 -192.5t-184.5 -136.5t-257.5 -52.5q-102 0 -177 31t-122 85t-69.5 125t-22.5 151zM221 383q0 -59 14.5 -113.5t46 -95.5t81 -65.5 t118.5 -24.5q102 0 179 42t129.5 109.5t78 152.5t25.5 171q0 61 -14.5 115.5t-46 95.5t-81 64.5t-118.5 23.5q-102 0 -180 -42t-129.5 -109.5t-77 -152.5t-25.5 -171zM479 1161l10 15l271 202h14l182 -202l2 -15l-18 -39l-16 -6l-187 125l-237 -125l-17 6z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1155" d="M68 367q0 113 38.5 221t113.5 194t186.5 138.5t257.5 52.5q102 0 174.5 -32t120 -86t69 -125t21.5 -150q0 -115 -37 -223.5t-111 -192.5t-184.5 -136.5t-257.5 -52.5q-102 0 -177 31t-122 85t-69.5 125t-22.5 151zM221 383q0 -59 14.5 -113.5t46 -95.5t81 -65.5 t118.5 -24.5q102 0 179 42t129.5 109.5t78 152.5t25.5 171q0 61 -14.5 115.5t-46 95.5t-81 64.5t-118.5 23.5q-102 0 -180 -42t-129.5 -109.5t-77 -152.5t-25.5 -171zM375 1194q14 27 33.5 55.5t46 50t61.5 36t78 14.5q51 0 88 -4.5t68.5 -10.5t61.5 -10t69 -4q35 0 71.5 8 t73.5 45l21 -16q-12 -29 -32 -56.5t-46.5 -50t-60.5 -37t-77 -14.5q-82 0 -163.5 14.5t-147.5 14.5q-51 0 -73.5 -13.5t-49.5 -37.5z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1155" d="M68 367q0 113 38.5 221t113.5 194t186.5 138.5t257.5 52.5q102 0 174.5 -32t120 -86t69 -125t21.5 -150q0 -115 -37 -223.5t-111 -192.5t-184.5 -136.5t-257.5 -52.5q-102 0 -177 31t-122 85t-69.5 125t-22.5 151zM221 383q0 -59 14.5 -113.5t46 -95.5t81 -65.5 t118.5 -24.5q102 0 179 42t129.5 109.5t78 152.5t25.5 171q0 61 -14.5 115.5t-46 95.5t-81 64.5t-118.5 23.5q-102 0 -180 -42t-129.5 -109.5t-77 -152.5t-25.5 -171zM483 1266q0 41 33 74.5t74 33.5q29 0 48 -22.5t19 -55.5q0 -43 -33.5 -73.5t-72.5 -30.5 q-31 0 -49.5 20.5t-18.5 53.5zM805 1266q0 41 32.5 74.5t73.5 33.5q29 0 48.5 -22.5t19.5 -55.5q0 -43 -34 -73.5t-73 -30.5q-31 0 -49 20.5t-18 53.5z" /> +<glyph unicode="&#xf7;" horiz-adv-x="1150" d="M127 436l23 107h847l-22 -107h-848zM418 147q0 45 37 79t82 34q33 0 55 -23.5t22 -58.5q0 -23 -11 -42t-27.5 -34.5t-38 -24.5t-41.5 -9q-35 0 -56.5 22t-21.5 57zM555 797q0 43 37 78.5t82 35.5q33 0 55.5 -24.5t22.5 -59.5q0 -23 -11.5 -42t-28 -33.5t-38 -23.5 t-41.5 -9q-35 0 -56.5 22.5t-21.5 55.5z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1155" d="M-29 16l148 136q-51 90 -51 215q0 113 38.5 221t113.5 194t186.5 138.5t257.5 52.5q86 0 149.5 -22.5t110.5 -61.5l133 123l88 -80l-148 -135q27 -47 39.5 -102.5t12.5 -114.5q0 -115 -37 -223.5t-111 -192.5t-184.5 -136.5t-255.5 -52.5q-88 0 -153.5 21.5t-112.5 62.5 l-144 -131zM223 383q0 -33 3 -62.5t14 -58.5l575 526q-33 33 -78 51.5t-104 18.5q-102 0 -179 -42t-128.5 -109.5t-77 -152.5t-25.5 -171zM299 154q31 -33 76 -51.5t106 -18.5q102 0 179 42t129.5 109.5t79 152.5t26.5 171q0 66 -18 125z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1110" d="M82 197q0 45 12 104l137 641h144l-133 -623q-4 -23 -7.5 -42t-3.5 -35q0 -82 44 -114t114 -32q104 0 207.5 61.5t167.5 180.5l127 604h143l-200 -942h-113l22 176h-8q-45 -86 -149.5 -143.5t-241.5 -57.5q-55 0 -103 11.5t-83 37t-55.5 69t-20.5 104.5zM422 1293v12 q0 35 23.5 60.5t64.5 27.5l326 -207l2 -15l-19 -41l-18 -6l-377 158q-2 4 -2 11z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1110" d="M82 197q0 45 12 104l137 641h144l-133 -623q-4 -23 -7.5 -42t-3.5 -35q0 -82 44 -114t114 -32q104 0 207.5 61.5t167.5 180.5l127 604h143l-200 -942h-113l22 176h-8q-45 -86 -149.5 -143.5t-241.5 -57.5q-55 0 -103 11.5t-83 37t-55.5 69t-20.5 104.5zM469 1130v41 l10 15l412 207q29 -2 44 -18.5t15 -39.5q0 -12 -5 -25.5t-11 -27.5l-449 -158z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1110" d="M82 197q0 45 12 104l137 641h144l-133 -623q-4 -23 -7.5 -42t-3.5 -35q0 -82 44 -114t114 -32q104 0 207.5 61.5t167.5 180.5l127 604h143l-200 -942h-113l22 176h-8q-45 -86 -149.5 -143.5t-241.5 -57.5q-55 0 -103 11.5t-83 37t-55.5 69t-20.5 104.5zM434 1122v39l6 15 l273 202h14l182 -202l2 -15l-18 -39l-19 -6l-186 125l-237 -125z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1110" d="M82 197q0 45 12 104l137 641h144l-133 -623q-4 -23 -7.5 -42t-3.5 -35q0 -82 44 -114t114 -32q104 0 207.5 61.5t167.5 180.5l127 604h143l-200 -942h-113l22 176h-8q-45 -86 -149.5 -143.5t-241.5 -57.5q-55 0 -103 11.5t-83 37t-55.5 69t-20.5 104.5zM449 1266 q0 41 32.5 74.5t73.5 33.5q29 0 49.5 -22.5t20.5 -55.5q0 -43 -35 -73.5t-74 -30.5q-31 0 -49 20.5t-18 53.5zM770 1266q0 41 33 74.5t74 33.5q29 0 49 -22.5t20 -55.5q0 -43 -34.5 -73.5t-73.5 -30.5q-31 0 -49.5 20.5t-18.5 53.5z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1060" d="M-158 -383q6 -2 13.5 -4t27.5 -2q41 0 79 8t79 33q84 51 162 149.5t153 229.5l-276 911h170l207 -784l504 784h161l-635 -950q-43 -66 -105.5 -155t-140 -169t-168.5 -136t-192 -56q-16 0 -23.5 1t-15.5 5v135zM522 1171l10 15l412 207q31 -2 45.5 -18.5t14.5 -39.5 q0 -18 -5.5 -30.5t-11.5 -22.5l-448 -158l-13 6z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1179" d="M-74 -532l436 2048h144l-160 -750q29 35 72 71.5t95 66.5t112.5 49.5t126.5 19.5q84 0 145 -30t101 -81t59.5 -119.5t19.5 -144.5q0 -117 -39 -228.5t-110.5 -198.5t-175 -141.5t-234.5 -54.5q-137 0 -213 59.5t-84 147.5l-151 -714h-144zM256 344q6 -59 31.5 -104 t63.5 -78t87 -49.5t103 -16.5q88 0 158.5 40t119.5 106.5t76 151.5t27 175q0 57 -13.5 108.5t-41 90.5t-71.5 61.5t-106 22.5q-98 0 -195.5 -53.5t-175.5 -153.5z" /> +<glyph unicode="&#xff;" horiz-adv-x="1060" d="M-158 -383q6 -2 13.5 -4t27.5 -2q41 0 79 8t79 33q84 51 162 149.5t153 229.5l-276 911h170l207 -784l504 784h161l-635 -950q-43 -66 -105.5 -155t-140 -169t-168.5 -136t-192 -56q-16 0 -23.5 1t-15.5 5v135zM426 1266q0 41 31.5 74.5t72.5 33.5q29 0 49.5 -22.5 t20.5 -55.5q0 -43 -35 -73.5t-73 -30.5q-29 0 -47.5 20.5t-18.5 53.5zM748 1266q0 41 31.5 74.5t72.5 33.5q29 0 49.5 -22.5t20.5 -55.5q0 -43 -35 -73.5t-74 -30.5q-29 0 -47 20.5t-18 53.5z" /> +<glyph unicode="&#x152;" horiz-adv-x="1753" d="M123 510q0 168 59.5 321.5t169 271.5t262 188.5t338.5 70.5q39 0 75 -3t71 -7h702l-31 -144h-548l-91 -420h412l-31 -143h-411l-107 -502h590l-31 -143h-708q-92 -25 -201 -25q-135 0 -233.5 42t-162 115t-94 170t-30.5 208zM295 518q0 -199 96 -303t285 -104 q88 0 162 18l229 1079q-68 18 -149 19q-176 0 -295 -61.5t-192 -161t-104.5 -227.5t-31.5 -259z" /> +<glyph unicode="&#x153;" horiz-adv-x="1865" d="M68 365q0 113 38.5 221t113.5 194t186.5 138.5t257.5 52.5q152 0 236.5 -60.5t119.5 -158.5q80 98 197.5 158.5t265.5 60.5q154 0 233.5 -71t79.5 -200q0 -59 -18.5 -117.5t-36.5 -82.5h-690l-4 -21q-12 -59 -13 -114q0 -59 15.5 -110.5t47 -90.5t81 -60.5t118.5 -21.5 q49 0 98.5 10t95.5 25.5t86 35t73 40.5l4 -109q-31 -16 -74 -35.5t-94 -36t-109.5 -28t-120.5 -11.5q-139 0 -228 57.5t-126 151.5q-74 -94 -183.5 -151.5t-258.5 -57.5q-102 0 -177 31t-122 85t-69.5 125t-22.5 151zM221 381q0 -59 14.5 -113.5t46 -95.5t81 -65.5 t118.5 -24.5q102 0 179 42t129.5 109.5t78 152.5t25.5 171q0 61 -14.5 115.5t-46 95.5t-81 64.5t-118.5 23.5q-102 0 -180 -42t-129.5 -109.5t-77 -152.5t-25.5 -171zM1087 608h560q4 10 10 23.5t6 50.5q0 86 -61.5 130t-149.5 44q-135 0 -225.5 -71t-139.5 -177z" /> +<glyph unicode="&#x178;" horiz-adv-x="1157" d="M139 1352h183l290 -650l551 650h178l-692 -797l-117 -555h-153l115 547zM559 1610q0 41 33 74.5t74 33.5q29 0 47 -22.5t18 -53.5q0 -45 -33.5 -75.5t-70.5 -30.5q-31 0 -49.5 20.5t-18.5 53.5zM881 1608q0 43 32.5 76.5t71.5 33.5q29 0 48.5 -22.5t19.5 -55.5 q0 -43 -34 -73.5t-73 -30.5q-29 0 -47 20.5t-18 51.5z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="479" d="M248 1161l8 15l270 202h17l180 -202l4 -15l-20 -39l-17 -6l-186 125l-240 -125l-12 6z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="636" d="M254 1194q14 27 33.5 55.5t46 50t61.5 36t78 14.5q51 0 88 -4.5t69 -10.5t61.5 -10t68.5 -4q35 0 72.5 8t72.5 45l21 -16q-25 -57 -77 -107.5t-136 -50.5q-82 0 -164 14.5t-148 14.5q-51 0 -74.5 -13.5t-50.5 -37.5z" /> +<glyph unicode="&#x2000;" horiz-adv-x="868" /> +<glyph unicode="&#x2001;" horiz-adv-x="1736" /> +<glyph unicode="&#x2002;" horiz-adv-x="868" /> +<glyph unicode="&#x2003;" horiz-adv-x="1736" /> +<glyph unicode="&#x2004;" horiz-adv-x="577" /> +<glyph unicode="&#x2005;" horiz-adv-x="434" /> +<glyph unicode="&#x2006;" horiz-adv-x="288" /> +<glyph unicode="&#x2007;" horiz-adv-x="288" /> +<glyph unicode="&#x2008;" horiz-adv-x="217" /> +<glyph unicode="&#x2009;" horiz-adv-x="346" /> +<glyph unicode="&#x200a;" horiz-adv-x="96" /> +<glyph unicode="&#x2010;" horiz-adv-x="995" d="M125 436l22 107h693l-23 -107h-692z" /> +<glyph unicode="&#x2011;" horiz-adv-x="995" d="M125 436l22 107h693l-23 -107h-692z" /> +<glyph unicode="&#x2012;" horiz-adv-x="995" d="M125 436l22 107h693l-23 -107h-692z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1150" d="M125 436l22 107h848l-22 -107h-848z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1617" d="M125 436l22 107h1315l-22 -107h-1315z" /> +<glyph unicode="&#x2018;" horiz-adv-x="456" d="M266 1130l45 216l185 157l32 -39l-112 -149h51l-39 -185h-162z" /> +<glyph unicode="&#x2019;" horiz-adv-x="419" d="M250 1169l112 150h-51l39 184h162l-47 -215l-182 -158z" /> +<glyph unicode="&#x201a;" horiz-adv-x="491" d="M-12 -160l112 150h-51l39 184h162l-47 -215l-183 -158z" /> +<glyph unicode="&#x201c;" horiz-adv-x="763" d="M266 1130l45 216l185 157l32 -39l-112 -149h51l-39 -185h-162zM573 1130l45 216l185 157l33 -39l-113 -149h51l-39 -185h-162z" /> +<glyph unicode="&#x201d;" horiz-adv-x="727" d="M250 1169l112 150h-51l39 184h162l-47 -215l-182 -158zM557 1169l113 150h-52l39 184h162l-47 -215l-182 -158z" /> +<glyph unicode="&#x201e;" horiz-adv-x="821" d="M-12 -160l112 150h-51l39 184h162l-47 -215l-183 -158zM317 -160l113 150h-51l39 184h162l-48 -215l-182 -158z" /> +<glyph unicode="&#x2022;" horiz-adv-x="677" d="M182 473q0 31 14.5 61.5t39 53t55.5 37t63 14.5q47 0 80 -36t33 -85q0 -33 -15.5 -61.5t-40 -50t-55 -34t-61.5 -12.5q-51 0 -82 33t-31 80z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1249" d="M45 55q0 43 37 79t82 36q35 0 56.5 -24.5t21.5 -59.5q0 -23 -11.5 -42t-28 -33.5t-38 -24t-41.5 -9.5q-35 0 -56.5 22.5t-21.5 55.5zM432 55q0 43 38 79t81 36q35 0 56.5 -24.5t21.5 -59.5q0 -23 -11.5 -42t-28 -33.5t-38 -24t-41.5 -9.5q-35 0 -56.5 22.5t-21.5 55.5z M819 55q0 43 38 79t81 36q35 0 56.5 -24.5t21.5 -59.5q0 -23 -11.5 -42t-27.5 -33.5t-37.5 -24t-42.5 -9.5q-35 0 -56.5 22.5t-21.5 55.5z" /> +<glyph unicode="&#x202f;" horiz-adv-x="346" /> +<glyph unicode="&#x2039;" horiz-adv-x="653" d="M88 487l2 11l352 362h162l-373 -362l-2 -11l217 -362h-163z" /> +<glyph unicode="&#x203a;" horiz-adv-x="653" d="M20 125l373 362l2 11l-219 362h162l199 -362l-2 -11l-351 -362h-164z" /> +<glyph unicode="&#x205f;" horiz-adv-x="434" /> +<glyph unicode="&#x20ac;" horiz-adv-x="1267" d="M72 522l22 107h150q6 57 20 108h-147l22 107h158q41 111 105.5 205t150.5 163.5t190.5 109.5t227.5 40q92 0 183 -23.5t149 -64.5l-74 -148q-47 43 -121 72t-178 29q-109 0 -188.5 -33t-137 -86t-94.5 -121.5t-59 -142.5h546l-22 -107h-551q-6 -29 -9 -56.5t-5 -51.5h542 l-22 -107h-527v-35q0 -184 72 -280t213 -96q111 0 210 36.5t167 90.5l12 -138q-84 -49 -190.5 -87t-233.5 -38q-111 0 -189.5 40t-129.5 110t-76 162t-25 196v39h-161z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1404" d="M268 1257l17 80h440l-16 -80h-172l-107 -501h-96l106 501h-172zM678 756l123 581h98l96 -495l303 495h97l-123 -581h-80l90 428l-262 -428h-92l-80 430l-92 -430h-78z" /> +<glyph unicode="&#xe000;" horiz-adv-x="940" d="M0 940h940v-940h-940v940z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1071" d="M-25 -532l295 1378h-157l16 76l162 18q41 199 92 312.5t109 172.5q61 66 118.5 83.5t110.5 17.5q102 0 178 -34t123 -69l-96 -123q-80 57 -137.5 88t-116.5 31q-45 0 -76 -19.5t-53.5 -62.5t-42 -110.5t-39.5 -161.5l-27 -123h221l-20 -96h-221l-295 -1378h-144zM653 0 l201 942h143l-200 -942h-144z" /> +<glyph unicode="&#xfb02;" horiz-adv-x="1097" d="M-23 -532l293 1378h-157l16 76l162 18q23 111 51.5 190.5t58 137t60.5 95.5t57 62q63 59 120.5 80t104.5 21q20 0 53 -1t74 -6.5t87.5 -16.5t93.5 -29l79 43l-321 -1516h-143l288 1362q-51 29 -123.5 43t-148.5 14q-33 0 -63.5 -18.5t-58.5 -59.5t-53.5 -108.5 t-45.5 -167.5l-27 -123h221l-20 -96h-221l-293 -1378h-144z" /> +<glyph unicode="&#xfb03;" horiz-adv-x="1675" d="M1256 0l201 942h143l-201 -942h-143zM1496 1268q0 25 11 47t28.5 39.5t41 28t48.5 10.5q37 0 60.5 -28t23.5 -62q0 -49 -41 -84t-89 -35q-37 0 -60 24.5t-23 59.5zM585 -532l293 1378h-157l16 76l162 18q25 115 49.5 197t48 138t46 92t42.5 58q49 57 111.5 79t124.5 22 q8 0 28.5 -1t45 -4t50 -10.5t48.5 -19.5l-62 -121q-6 0 -26.5 7t-47 16.5t-56 17.5t-54.5 8q-31 0 -54.5 -17.5t-44 -57t-39 -105t-38.5 -162.5l-29 -135h221l-20 -96h-221l-293 -1378h-144zM-23 -532l293 1378h-157l16 76l162 18q25 115 49.5 197t48 138t46 92t42.5 58 q49 57 111.5 79t124.5 22q8 0 28.5 -1t45 -4t50 -10.5t48.5 -19.5l-62 -121q-6 0 -26.5 7t-47 16.5t-56 17.5t-54.5 8q-31 0 -54.5 -17.5t-44 -57t-39 -105t-38.5 -162.5l-29 -135h221l-20 -96h-221l-293 -1378h-144z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="1699" d="M1268 0l322 1516h143l-321 -1516h-144zM585 -532l293 1378h-157l16 76l162 18q25 115 49.5 197t48 138t46 92t42.5 58q49 57 111.5 79t124.5 22q8 0 28.5 -1t45 -4t50 -10.5t48.5 -19.5l-62 -121q-6 0 -26.5 7t-47 16.5t-56 17.5t-54.5 8q-31 0 -54.5 -17.5t-44 -57 t-39 -105t-38.5 -162.5l-29 -135h221l-20 -96h-221l-293 -1378h-144zM-23 -532l293 1378h-157l16 76l162 18q25 115 49.5 197t48 138t46 92t42.5 58q49 57 111.5 79t124.5 22q8 0 28.5 -1t45 -4t50 -10.5t48.5 -19.5l-62 -121q-6 0 -26.5 7t-47 16.5t-56 17.5t-54.5 8 q-31 0 -54.5 -17.5t-44 -57t-39 -105t-38.5 -162.5l-29 -135h221l-20 -96h-221l-293 -1378h-144z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.ttf new file mode 100644 index 000000000000..c7ba47a1c589 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.woff new file mode 100644 index 000000000000..3798881e6461 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-italic-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.eot new file mode 100644 index 000000000000..346db6fe355a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.svg new file mode 100644 index 000000000000..34709243b867 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.svg @@ -0,0 +1,247 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 Pablo Impallari wwwimpallaricomimpallarigmailcomCopyright c 2011 Igino Marini wwwikerncommailiginomarinicomCopyright c 2011 Brenda Gallo gbrenda1987gmailcomwith Reserved Font Name Quattrocento Sans +Designer : Pablo Impallari +Foundry : Pablo Impallari Igino Marini Brenda Gallo +Foundry URL : wwwimpallaricom +</metadata> +<defs> +<font id="QuattrocentoSansRegular" horiz-adv-x="1314" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="501" /> +<glyph unicode=" " horiz-adv-x="501" /> +<glyph unicode="&#x09;" horiz-adv-x="501" /> +<glyph unicode="&#xa0;" horiz-adv-x="501" /> +<glyph unicode="!" horiz-adv-x="528" d="M166 1397h199l-54 -1090h-96zM170 72q0 39 27.5 68.5t68.5 29.5q37 0 66.5 -29.5t29.5 -68.5t-29.5 -67t-66.5 -28q-41 0 -68.5 28t-27.5 67z" /> +<glyph unicode="&#x22;" horiz-adv-x="684" d="M121 1499h166l-49 -442h-74zM401 1499h166l-49 -442h-74z" /> +<glyph unicode="#" horiz-adv-x="1257" d="M78 455l20 108h240l53 244h-252l21 106h254l90 426h131l-90 -426h258l90 426h131l-90 -426h248l-21 -106h-250l-53 -244h262l-20 -108h-264l-97 -455h-131l97 455h-259l-96 -455h-131l96 455h-237zM469 563h258l53 244h-258z" /> +<glyph unicode="$" horiz-adv-x="1083" d="M88 88l43 150q74 -51 154 -87t207 -40v530q-86 29 -155 61.5t-117 76.5t-73.5 102.5t-25.5 138.5q0 82 27.5 143.5t77.5 102.5t118 63.5t148 28.5v178h122v-176q90 -6 170 -26.5t140 -49.5l-43 -158q-51 45 -124 68t-143 29v-449q72 -25 141.5 -55.5t124 -77.5t88 -114.5 t33.5 -166.5q0 -94 -30.5 -162.5t-83.5 -114.5t-124 -70.5t-149 -32.5v-177h-122v174q-121 4 -224.5 36t-179.5 75zM270 1026q0 -41 13.5 -71.5t40 -54t68.5 -43t100 -40.5v406q-104 -10 -163 -57.5t-59 -139.5zM614 117q123 16 176.5 74.5t53.5 140.5q0 53 -19.5 94 t-51.5 72.5t-73 55.5t-86 42v-479z" /> +<glyph unicode="%" horiz-adv-x="1675" d="M80 977q0 80 20.5 150.5t59.5 123t94 82t127 29.5t128 -31t94 -82t58.5 -119.5t20.5 -144.5q0 -74 -20.5 -143.5t-59.5 -122.5t-97.5 -85t-131.5 -32q-72 0 -127.5 30t-92 81t-55 119.5t-18.5 144.5zM195 989q0 -147 47 -221t133 -74q51 0 88 22.5t60.5 61.5t34.5 91.5 t11 111.5q0 129 -47 209t-145 80q-100 0 -141 -79t-41 -202zM295 -49l948 1464h133l-948 -1464h-133zM997 360q0 80 20.5 151t59.5 123t94.5 81.5t126.5 29.5q72 0 128.5 -30.5t94.5 -81.5t58 -120t20 -144q0 -74 -20 -143.5t-59 -123t-97.5 -85t-132.5 -31.5 q-72 0 -127 29.5t-92 80.5t-55.5 119.5t-18.5 144.5zM1112 373q0 -147 47 -221t133 -74q51 0 88 22.5t60.5 61.5t35 91t11.5 112q0 129 -47 208.5t-146 79.5q-100 0 -141 -78.5t-41 -201.5z" /> +<glyph unicode="&#x26;" horiz-adv-x="1435" d="M129 360q0 55 17.5 113.5t51 112t86 98.5t119.5 74q-59 70 -91.5 139.5t-32.5 159.5q0 76 23.5 132t65.5 95t97 58.5t117 19.5q70 0 142.5 -23.5t141.5 -66.5l-41 -146q-47 45 -112.5 74t-126.5 29q-68 0 -116 -42t-48 -140q0 -68 26.5 -123.5t77.5 -108.5l467 -483 q33 78 33 157q0 61 -17.5 115.5t-50.5 106.5l-102 -9v97l514 75v-126l-274 -25q63 -117 63 -242q0 -133 -69 -250l225 -231h-172l-131 133q-72 -72 -175.5 -115t-234.5 -43q-117 0 -206 32t-148.5 86t-89 123.5t-29.5 143.5zM285 379q0 -66 25.5 -115t69.5 -84t105.5 -52 t135.5 -17q98 0 171.5 31.5t127.5 84.5l-426 437q-96 -33 -152.5 -109t-56.5 -176z" /> +<glyph unicode="'" horiz-adv-x="403" d="M121 1499h166l-49 -442h-74z" /> +<glyph unicode="(" horiz-adv-x="636" d="M102 670q0 262 108.5 495.5t305.5 413.5l78 -27q-84 -94 -142.5 -192t-95.5 -205.5t-53 -227.5t-16 -257q0 -84 7 -185.5t37.5 -215t92 -235.5t168.5 -247l-76 -27q-197 176 -305.5 412t-108.5 498z" /> +<glyph unicode=")" horiz-adv-x="636" d="M43 1552l78 27q197 -180 305.5 -413.5t108.5 -495.5t-109 -497.5t-305 -412.5l-76 27q106 125 167.5 247t92.5 235.5t38 215t7 185.5q0 137 -16.5 257t-53 227.5t-95 205.5t-142.5 192z" /> +<glyph unicode="*" horiz-adv-x="899" d="M125 991l252 109l-252 110l68 119l219 -166l-29 275h135l-33 -275l222 166l67 -119l-252 -110l252 -109l-65 -117l-224 162l31 -270h-133l29 270l-222 -162z" /> +<glyph unicode="+" horiz-adv-x="1017" d="M104 436v107h351v331h106v-331h352v-107h-352v-352h-106v352h-351z" /> +<glyph unicode="," horiz-adv-x="497" d="M139 -160l80 150h-51v184h162v-215l-150 -158z" /> +<glyph unicode="-" horiz-adv-x="995" d="M152 436v107h692v-107h-692z" /> +<glyph unicode="." horiz-adv-x="481" d="M145 72q0 39 27 68.5t68 29.5q39 0 68.5 -29.5t29.5 -68.5t-29.5 -67t-68.5 -28q-41 0 -68 28t-27 67z" /> +<glyph unicode="/" horiz-adv-x="868" d="M74 -117l569 1555h154l-570 -1555h-153z" /> +<glyph unicode="0" horiz-adv-x="1329" d="M121 659q0 145 37 273.5t106.5 223.5t171 150.5t230.5 55.5q131 0 232 -55.5t171 -150.5t105.5 -220t35.5 -262q0 -135 -36.5 -261t-107.5 -223.5t-175.5 -156t-239.5 -58.5q-133 0 -232.5 55.5t-165 149.5t-99 218t-33.5 261zM291 680q0 -283 95 -426t269 -143 q100 0 174 43t121 118.5t69.5 177t22.5 218.5q0 125 -23.5 227t-71.5 176t-119.5 115t-168.5 41q-98 0 -168.5 -40t-114.5 -113t-64.5 -173t-20.5 -221z" /> +<glyph unicode="1" horiz-adv-x="649" d="M51 1126l395 226v-1352h-153v1077l-197 -94z" /> +<glyph unicode="2" horiz-adv-x="1042" d="M96 0v143q92 119 205 232.5t211 222.5t163.5 215.5t65.5 214.5q0 41 -11 77t-38.5 63.5t-72 43t-109.5 15.5q-45 0 -95 -7.5t-99.5 -21.5t-92.5 -32.5t-71 -39.5l-37 136q39 20 88 38.5t101 33t106.5 21.5t103.5 7q88 0 162 -24.5t126 -67.5t80.5 -104.5t28.5 -135.5 q0 -115 -63.5 -225.5t-158.5 -220t-207.5 -220t-211.5 -221.5h656v-143h-830z" /> +<glyph unicode="3" horiz-adv-x="1095" d="M76 102l41 138q72 -59 160 -94t192 -35q166 0 253 76.5t87 224.5q0 117 -79 185.5t-265 68.5h-55v116h63q129 0 199.5 65.5t70.5 178.5q0 90 -49 145.5t-172 55.5q-47 0 -94 -8.5t-90 -21.5t-81 -31.5t-62 -39.5l-37 136q35 20 79 38.5t91 33t94 21.5t88 7 q182 0 292.5 -89t110.5 -263q0 -86 -56 -159t-138 -116q123 -41 191.5 -123t68.5 -217q0 -86 -30.5 -161.5t-94 -133t-158 -91.5t-221.5 -34q-119 0 -220 34t-179 93z" /> +<glyph unicode="4" horiz-adv-x="1040" d="M63 430v143l572 779h164v-779h141v-143h-141v-430h-154v430h-582zM238 573h407v555z" /> +<glyph unicode="5" horiz-adv-x="1101" d="M96 102l43 144q76 -59 160 -97t199 -38q156 0 243.5 76.5t87.5 224.5q0 57 -15 105t-53 82t-99.5 52.5t-153.5 18.5q-72 0 -147.5 -12.5t-143.5 -39.5l-59 31l75 713h695v-143h-566l-53 -437q63 14 133 23.5t129 9.5q92 0 171 -25.5t135.5 -74.5t88 -122t31.5 -167 q0 -90 -30.5 -172t-93 -143.5t-156.5 -98.5t-221 -37q-119 0 -220.5 34t-179.5 93z" /> +<glyph unicode="6" horiz-adv-x="1128" d="M129 612q0 141 23.5 275.5t82 239t156.5 169t246 64.5q33 0 76 -4t88 -15.5t87 -31t73 -47.5l-35 -136q-70 57 -148 79t-139 22q-106 0 -177 -44t-113 -115t-59.5 -160t-17.5 -177v-30q0 -13 2 -29l7 -2q25 45 61.5 73.5t81.5 46t94 24.5t98 7q129 0 209 -44t124 -107.5 t60.5 -136t16.5 -127.5q0 -74 -23.5 -151t-76 -139.5t-135 -101.5t-199.5 -39q-129 0 -217 45.5t-142.5 129t-79 200.5t-24.5 262zM309 395q0 -135 74 -215t209 -80q127 0 200.5 81t73.5 227q0 55 -13 107t-43 92t-80 64.5t-124 24.5q-154 0 -225.5 -86t-71.5 -215z" /> +<glyph unicode="7" horiz-adv-x="935" d="M82 1219v143h829v-143q-102 -102 -204.5 -249t-184.5 -306.5t-132 -313t-50 -268.5v-43q0 -20 2 -39h-178q-2 18 -2 40v40q0 129 54 282.5t138 308t187.5 297t199.5 251.5h-659z" /> +<glyph unicode="8" horiz-adv-x="1142" d="M119 381q0 135 65.5 229.5t182.5 128.5v9q-72 27 -126.5 100.5t-54.5 185.5q0 147 100.5 237.5t284.5 90.5q180 0 282.5 -87t102.5 -235q0 -109 -52 -183.5t-128 -106.5v-9q119 -27 183.5 -123t64.5 -233q0 -86 -26.5 -160.5t-83 -130t-142.5 -87.5t-203 -32 q-123 0 -209 34t-139 90.5t-77.5 130t-24.5 151.5zM285 371q0 -129 72.5 -200t211.5 -71t212 71t73 200q0 57 -15.5 111.5t-50 96.5t-89 67.5t-130.5 25.5q-78 0 -132 -25.5t-88 -67.5t-49 -96.5t-15 -111.5zM350 1026q0 -102 56.5 -166.5t162.5 -64.5t162.5 64.5 t56.5 166.5q0 86 -48 146.5t-171 60.5q-121 0 -170 -58.5t-49 -148.5z" /> +<glyph unicode="9" horiz-adv-x="1130" d="M104 930q0 74 24 150.5t76 139t135 101.5t200 39q129 0 217 -45t142 -129t78.5 -202t24.5 -261q0 -141 -23.5 -275.5t-81.5 -239t-156.5 -169t-245.5 -64.5q-33 0 -76 4.5t-88 15.5t-87 30.5t-73 48.5l35 135q70 -57 147.5 -78.5t139.5 -21.5q106 0 176.5 44t112.5 114.5 t59.5 159.5t17.5 177v30q0 13 -2 30l-6 2q-25 -45 -61.5 -74t-81.5 -46.5t-94.5 -24.5t-98.5 -7q-129 0 -209 44t-124 107.5t-60.5 136.5t-16.5 128zM264 928q0 -55 13.5 -107.5t43 -92.5t80 -64.5t123.5 -24.5q154 0 225.5 86t71.5 215q0 135 -73.5 215t-208.5 80 q-127 0 -201 -81t-74 -226z" /> +<glyph unicode=":" horiz-adv-x="495" d="M152 72q0 39 26.5 68.5t67.5 29.5q39 0 68.5 -29.5t29.5 -68.5t-29.5 -67t-68.5 -28q-41 0 -67.5 28t-26.5 67zM152 836q0 39 26.5 67.5t67.5 28.5q39 0 68.5 -29t29.5 -67q0 -41 -29.5 -69t-68.5 -28q-41 0 -67.5 28t-26.5 69z" /> +<glyph unicode=";" horiz-adv-x="520" d="M154 -160l79 150h-51v184h162v-215l-149 -158zM170 836q0 39 26.5 67.5t67.5 28.5q39 0 68.5 -29t29.5 -67q0 -41 -29.5 -69t-68.5 -28q-41 0 -67.5 28t-26.5 69z" /> +<glyph unicode="&#x3c;" horiz-adv-x="835" d="M78 487v11l584 397l36 -129l-403 -268v-11l405 -272l-36 -131z" /> +<glyph unicode="=" horiz-adv-x="1003" d="M156 281v106h692v-106h-692zM156 592v106h692v-106h-692z" /> +<glyph unicode="&#x3e;" horiz-adv-x="835" d="M135 215l406 272v11l-404 268l37 129l584 -397v-11l-586 -403z" /> +<glyph unicode="?" horiz-adv-x="843" d="M82 1305q55 43 137 71.5t160 28.5q82 0 148.5 -24.5t112.5 -67.5t70.5 -104.5t24.5 -135.5q0 -61 -21.5 -115.5t-55 -108.5t-71.5 -109.5t-72 -120t-56.5 -140.5t-22.5 -170h-131q0 102 20.5 182t52.5 144.5t68.5 118t68.5 103.5t52.5 102.5t20.5 115.5q0 82 -52.5 139.5 t-158.5 57.5q-33 0 -70 -8.5t-71.5 -21.5t-65.5 -32.5t-51 -40.5zM281 74q0 41 27.5 68.5t66.5 27.5t68.5 -27.5t29.5 -68.5q0 -39 -29.5 -68t-68.5 -29t-66.5 29t-27.5 68z" /> +<glyph unicode="@" horiz-adv-x="1480" d="M117 369q0 117 42 249t130 244.5t224 186t325 73.5q143 0 248.5 -45t174 -116.5t101.5 -161.5t33 -183q0 -90 -30 -174t-85 -148.5t-132 -103t-171 -38.5q-49 0 -79 11t-45 30.5t-20.5 47t-5.5 60.5q-35 -70 -87 -110.5t-105 -40.5q-31 0 -61.5 15t-55 46t-40 77 t-15.5 107q0 92 34.5 166t91 126t126 81t139.5 29q49 0 107.5 -16.5t93.5 -51.5l-76 -364q-4 -23 -6 -40.5t-2 -31.5q0 -29 12 -43t47 -14q53 0 97 31.5t76 83.5t49.5 120t17.5 137q0 76 -24.5 151t-77 134t-134.5 96t-198 37q-145 0 -256 -58.5t-184.5 -152.5t-111.5 -211 t-38 -235q0 -127 40 -217.5t107.5 -148.5t156.5 -85t187 -27q84 0 156 17.5t129 43t98 54.5t64 49v-102q-20 -18 -64.5 -46t-106 -53.5t-137 -43t-159.5 -17.5q-123 0 -231.5 41t-190.5 116t-130 181.5t-48 237.5zM598 369q0 -68 18.5 -99.5t47.5 -31.5q27 0 56.5 21.5 t56 55t48 74.5t29.5 80l49 248q-12 12 -51 12q-68 0 -116 -37t-78.5 -91t-45 -117.5t-14.5 -114.5z" /> +<glyph unicode="A" d="M10 0l541 1352h186l594 -1352h-174l-199 455h-604l-180 -455h-164zM412 598h483l-254 582z" /> +<glyph unicode="B" horiz-adv-x="1144" d="M203 0v1352q66 4 153.5 7t161.5 3q182 0 293 -89t111 -263q0 -82 -34 -148.5t-106 -113.5q123 -41 192.5 -129.5t69.5 -223.5q0 -86 -30.5 -161.5t-94 -133t-157.5 -91.5t-221 -34q-100 0 -186 7.5t-152 17.5zM356 117q80 -6 179 -6q166 0 252.5 76.5t86.5 224.5 q0 117 -78.5 185.5t-265.5 68.5q-45 0 -89 -1t-85 -3v-545zM356 784q29 -2 61 -2h64q129 0 200 65.5t71 178.5q0 90 -49.5 145.5t-172.5 55.5q-45 0 -89 -1t-85 -3v-439z" /> +<glyph unicode="C" d="M117 662q0 145 43 272t128 222t211 150.5t294 55.5q111 0 221 -23.5t190 -64.5l-43 -148q-66 43 -162 72t-219 29q-137 0 -231 -40t-152.5 -111.5t-84 -173t-25.5 -224.5q0 -281 122.5 -424t366.5 -143q129 0 237.5 36.5t174.5 90.5l41 -138q-82 -49 -198 -87t-261 -38 q-168 0 -291 55.5t-203.5 149.5t-119.5 218.5t-39 263.5z" /> +<glyph unicode="D" horiz-adv-x="1441" d="M203 0v1352h10q98 4 213 7t223 3q145 0 265 -41t204 -113q109 -98 158 -239.5t49 -306.5q0 -139 -39 -263.5t-120 -218.5t-203.5 -149.5t-290.5 -55.5q-145 0 -261 7.5t-208 17.5zM356 123q129 -12 310 -12q244 0 366.5 143t122.5 424q0 123 -25.5 224.5t-84 173 t-152.5 111.5t-231 40q-82 0 -161 -1t-145 -5v-1098z" /> +<glyph unicode="E" horiz-adv-x="1069" d="M203 0v1352h741v-144h-588v-420h451v-143h-451v-502h629v-143h-782z" /> +<glyph unicode="F" horiz-adv-x="983" d="M203 0v1352h731v-144h-578v-420h428v-143h-428v-645h-153z" /> +<glyph unicode="G" horiz-adv-x="1376" d="M117 662q0 145 43 272t128 222t211 150.5t294 55.5q119 0 231.5 -23.5t200.5 -64.5l-43 -148q-66 43 -169.5 72t-232.5 29q-137 0 -231 -40t-152.5 -111.5t-84 -173t-25.5 -224.5q0 -281 122.5 -424t366.5 -143q90 0 169 18t145 47v381h153v-444q-92 -61 -210 -99.5 t-263 -38.5q-168 0 -291 55.5t-203.5 149.5t-119.5 218.5t-39 263.5z" /> +<glyph unicode="H" horiz-adv-x="1441" d="M203 0v1352h153v-584h729v584h154v-1352h-154v625h-729v-625h-153z" /> +<glyph unicode="I" horiz-adv-x="559" d="M203 0v1352h153v-1352h-153z" /> +<glyph unicode="J" horiz-adv-x="557" d="M-29 -207q80 0 127 39t69.5 99.5t29 134t6.5 143.5v1143h153v-1145q0 -109 -21.5 -204t-65.5 -167t-110.5 -113.5t-158.5 -41.5z" /> +<glyph unicode="K" horiz-adv-x="1224" d="M203 0v1352h153v-639q57 39 103.5 77.5t105.5 96.5q100 98 202.5 220t188.5 245h177q-49 -72 -107.5 -147t-120 -147.5t-122 -138t-113.5 -118.5q-23 -23 -42.5 -41.5t-37.5 -34.5l627 -725h-191l-549 627l-121 -92v-535h-153z" /> +<glyph unicode="L" horiz-adv-x="995" d="M203 0v1352h153v-1209h605v-143h-758z" /> +<glyph unicode="M" horiz-adv-x="1726" d="M203 0v1352h207l458 -1159l459 1159h197v-1352h-154v1022l-414 -1022h-184l-416 1024v-1024h-153z" /> +<glyph unicode="N" horiz-adv-x="1441" d="M203 0v1352h186l696 -1108v1108h154v-1352h-186l-697 1106v-1106h-153z" /> +<glyph unicode="O" horiz-adv-x="1548" d="M115 659q0 145 44 273.5t128 223.5t206.5 150.5t280.5 55.5q160 0 283 -55.5t207 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -285 55.5t-200.5 149.5t-119.5 218t-40 261zM285 680q0 -283 122.5 -426t356.5 -143q133 0 228 43 t155.5 118.5t89.5 177t29 218.5q0 125 -30 227t-90.5 176t-154.5 115t-223 41q-131 0 -223 -40t-149.5 -113t-84 -173t-26.5 -221z" /> +<glyph unicode="P" horiz-adv-x="1083" d="M203 0v1352h8q66 4 145.5 7t151.5 3q111 0 201 -27.5t154.5 -83t100 -136.5t35.5 -187q0 -86 -28.5 -162t-86 -133.5t-146.5 -91t-208 -33.5q-98 0 -174 6v-514h-153zM356 649q74 -6 168 -6q152 0 228.5 77t76.5 224q0 63 -16 115.5t-52 89.5t-95.5 57.5t-145.5 20.5 q-43 0 -85 -1t-79 -3v-574z" /> +<glyph unicode="Q" horiz-adv-x="1554" d="M119 659q0 145 44 273.5t128 223.5t207 150.5t280 55.5q160 0 283 -55.5t207 -150.5t127 -220t43 -262q0 -131 -40 -254t-119 -218.5t-197.5 -155.5t-276.5 -69q72 -8 140.5 -33.5t138 -52t141 -48t149.5 -21.5q82 0 174 39l-39 -131q-39 -20 -77.5 -26.5t-73.5 -6.5 q-86 0 -168 28.5t-159 62.5t-149.5 62.5t-140.5 28.5q-49 0 -118.5 -18.5t-133.5 -65.5l-28 96q53 41 116.5 61.5t122.5 24.5q-147 10 -255.5 69.5t-181.5 152t-108.5 211t-35.5 249.5zM289 674q0 -279 124 -421t359 -142q131 0 226.5 43t154.5 118.5t88 179t29 222.5 q0 123 -30 224t-91.5 174t-155.5 114t-225 41q-129 0 -220 -40t-148.5 -114t-84 -175t-26.5 -224z" /> +<glyph unicode="R" horiz-adv-x="1218" d="M203 0v1352q72 4 152.5 7t152.5 3q111 0 201 -25.5t154.5 -75t100 -122t35.5 -166.5q0 -131 -73.5 -233.5t-227.5 -143.5l519 -596h-191l-506 578q-90 0 -164 6v-584h-153zM356 717q37 -4 79 -4h89q152 0 228.5 70.5t76.5 205.5q0 106 -68.5 172t-240.5 66q-43 0 -85 -1 t-79 -3v-506z" /> +<glyph unicode="S" horiz-adv-x="1128" d="M100 88l43 150q39 -27 78 -50.5t85 -40t101.5 -26.5t127.5 -10q92 0 157.5 16t106.5 46t59.5 71t18.5 88q0 70 -33 118t-85 82.5t-114.5 58t-124.5 44.5q-88 29 -159.5 61.5t-122 77.5t-78 104.5t-27.5 141.5q0 92 34 156.5t92 105.5t138 60.5t172 19.5 q111 0 213.5 -22.5t173.5 -55.5l-43 -158q-33 29 -76.5 48.5t-92 31t-95.5 16.5t-88 5q-129 0 -203.5 -48.5t-74.5 -152.5q0 -51 19.5 -85t61.5 -60.5t106.5 -50t154.5 -54.5q76 -25 149.5 -56.5t132 -77.5t93 -114.5t34.5 -167.5q0 -104 -41 -177.5t-108.5 -120t-155.5 -67 t-182 -20.5q-133 0 -248 33t-199 80z" /> +<glyph unicode="T" horiz-adv-x="1091" d="M37 1208v144h1018v-144h-432v-1208h-154v1208h-432z" /> +<glyph unicode="U" horiz-adv-x="1409" d="M188 455v897h154v-828q0 -221 97.5 -317t269.5 -96t270 96t98 317v828h144v-897q0 -100 -31 -187.5t-94.5 -152t-159.5 -101.5t-227 -37q-143 0 -242.5 37t-161 101.5t-89.5 152t-28 187.5z" /> +<glyph unicode="V" horiz-adv-x="1318" d="M-14 1352h174l514 -1180l469 1180h164l-537 -1352h-195z" /> +<glyph unicode="W" horiz-adv-x="2213" d="M-2 1352h174l455 -1157l395 1157h174l420 -1153l412 1153h163l-481 -1352h-194l-410 1118l-381 -1118h-195z" /> +<glyph unicode="X" horiz-adv-x="1323" d="M31 0l536 698l-506 654h183l422 -547l421 547h177l-510 -662l536 -690h-182l-453 584l-448 -584h-176z" /> +<glyph unicode="Y" horiz-adv-x="1159" d="M-23 1352h183l428 -650l413 650h179l-523 -797v-555h-153v547z" /> +<glyph unicode="Z" horiz-adv-x="1134" d="M88 0v143l754 1065h-723v144h897v-144l-754 -1065h785v-143h-959z" /> +<glyph unicode="[" horiz-adv-x="585" d="M184 -195v1729h328v-86h-195v-1557h195v-86h-328z" /> +<glyph unicode="\" horiz-adv-x="864" d="M72 1438h149l570 -1555h-150z" /> +<glyph unicode="]" horiz-adv-x="585" d="M74 -109h194v1557h-194v86h327v-1729h-327v86z" /> +<glyph unicode="^" horiz-adv-x="712" d="M117 1161l6 15l225 202h17l225 -202l6 -15l-12 -39l-15 -6l-213 125l-213 -125l-14 6z" /> +<glyph unicode="_" horiz-adv-x="1001" d="M57 0h887v-106h-887v106z" /> +<glyph unicode="`" horiz-adv-x="448" d="M0 1321q0 29 18.5 49.5t53.5 22.5l370 -207l7 -15l-13 -41l-16 -6l-412 158q-8 19 -8 39z" /> +<glyph unicode="a" horiz-adv-x="1019" d="M82 252q0 117 59.5 186.5t145.5 104.5t181 45t167 10h92v25q0 78 -21.5 118.5t-62.5 69.5q-35 23 -75 32t-105 9q-86 0 -151.5 -22.5t-127.5 -59.5l-32 123q137 80 327 80q76 0 143.5 -13.5t118.5 -46.5q59 -37 94 -104.5t35 -167.5v-641h-112l-17 168h-8 q-25 -39 -65.5 -74t-91 -61.5t-108.5 -42t-116 -15.5q-135 0 -202.5 79t-67.5 198zM233 260q0 -80 44.5 -122t117.5 -42q84 0 178.5 53.5t153.5 153.5v191h-18q-84 0 -168 -6.5t-153 -31t-112 -70.5t-43 -126z" /> +<glyph unicode="b" horiz-adv-x="1177" d="M160 0v1516h143v-750q27 88 117 147.5t223 59.5q109 0 190.5 -41t136 -109.5t82 -161t27.5 -192.5q0 -98 -25.5 -187t-76.5 -157t-129 -109t-182 -41q-131 0 -225.5 58.5t-143.5 134.5h-8l-17 -168h-112zM303 303q59 -98 153.5 -152.5t192.5 -54.5q78 0 131.5 33t86 85 t47 117.5t14.5 131.5q0 86 -21.5 157.5t-60.5 123t-96.5 80t-126.5 28.5q-109 0 -196 -65.5t-124 -182.5v-301z" /> +<glyph unicode="c" horiz-adv-x="1024" d="M98 479q0 98 28 187.5t87 158t151.5 108.5t221.5 40q98 0 192 -22.5t152 -59.5l-35 -121q-47 35 -135 62.5t-176 27.5q-90 0 -152.5 -30.5t-103.5 -82t-59.5 -118t-18.5 -137.5q0 -80 22.5 -154t66.5 -129t108.5 -88t150.5 -33q82 0 169 35t144 88l29 -133 q-57 -37 -156.5 -70t-212.5 -33q-119 0 -208 41t-147 110t-88 160t-30 193z" /> +<glyph unicode="d" horiz-adv-x="1177" d="M98 469q0 100 28 192.5t82 161t136 109.5t191 41q137 0 225 -59.5t114 -147.5v750h144v-1516h-113l-16 168h-8q-49 -76 -143.5 -134.5t-225.5 -58.5q-104 0 -182 41t-129 109t-77 157t-26 187zM250 463q0 -66 14.5 -131.5t47 -117.5t86 -85t130.5 -33q98 0 193.5 53.5 t152.5 153.5v301q-37 117 -123.5 182.5t-195.5 65.5q-72 0 -128 -28.5t-95 -80t-60.5 -123t-21.5 -157.5z" /> +<glyph unicode="e" horiz-adv-x="1058" d="M96 471q0 100 32 191.5t93.5 161t152.5 109.5t208 40q180 0 278 -91t98 -257q0 -35 -4 -71t-14 -52h-690v-21q0 -78 20.5 -149.5t61.5 -126.5t103.5 -88t148.5 -33q49 0 96 11t90 28.5t80 38t65 41.5l25 -117q-27 -16 -65.5 -35.5t-86 -36t-103.5 -28t-118 -11.5 q-115 0 -203 40t-147 109t-90 159t-31 188zM264 610h559q2 10 2 19v18q0 51 -20.5 91t-55 66.5t-79.5 40t-95 13.5q-135 0 -209.5 -71t-101.5 -177z" /> +<glyph unicode="f" horiz-adv-x="610" d="M51 846v76l158 18q0 115 7 197t19.5 138t28 92t29.5 58q39 57 96 79t119 22q8 0 28.5 -1t46 -4t52.5 -10.5t51 -19.5l-35 -121q-6 0 -28.5 7t-50 16.5t-59.5 17.5t-56 8q-31 0 -51.5 -17.5t-32 -57t-16.5 -105t-5 -162.5v-135h221v-96h-221v-846h-143v846h-158z" /> +<glyph unicode="g" horiz-adv-x="1040" d="M66 -236q0 41 16 81t43 75t62.5 61.5t74.5 41.5v8q-84 39 -84 106q0 43 32 78t79 68v8q-98 39 -141.5 124t-43.5 183q0 80 27 147.5t77 118.5t120.5 80t160.5 29q53 0 105.5 -10.5t91.5 -30.5q86 2 161 10t140 27l10 -8l-14 -113l-10 -10l-187 8l-2 -6q53 -43 78 -113 t25 -135q0 -68 -25.5 -129.5t-75 -107.5t-122 -73.5t-166.5 -27.5q-23 0 -39.5 1t-30.5 1q-43 -14 -64.5 -38.5t-21.5 -41.5q0 -20 27.5 -35.5t89.5 -21.5l198 -21q68 -6 126.5 -27.5t101.5 -55t68.5 -82t25.5 -109.5q0 -59 -26.5 -121.5t-80.5 -108.5q-53 -45 -147 -73.5 t-217 -28.5q-104 0 -187 21.5t-139.5 59.5t-86 87t-29.5 104zM211 -211q0 -78 83 -124t224 -46q68 0 126 11.5t100 35t67 57t25 80.5q0 92 -99.5 132t-304.5 55q-47 0 -87 -18.5t-69.5 -47t-47 -64.5t-17.5 -71zM250 610q0 -47 15.5 -92t47 -81t77.5 -58.5t108 -22.5 q57 0 101 19.5t75 51.5t47 75t16 90t-16 96t-48 89t-79 64.5t-109 24.5q-59 0 -103 -23.5t-73.5 -60.5t-44 -82t-14.5 -90z" /> +<glyph unicode="h" horiz-adv-x="1116" d="M160 0v1516h143v-750q27 86 116 146.5t226 60.5q66 0 124 -17.5t101 -56.5t69 -102.5t26 -155.5v-641h-144v623q0 125 -55 177t-141 52q-51 0 -101.5 -16.5t-93.5 -48t-75.5 -77.5t-51.5 -106v-604h-143z" /> +<glyph unicode="i" horiz-adv-x="462" d="M129 1286q0 41 29.5 74t72.5 33q41 0 74 -33t33 -74q0 -43 -33 -72.5t-74 -29.5q-43 0 -72.5 29.5t-29.5 72.5zM160 0v942h143v-942h-143z" /> +<glyph unicode="j" horiz-adv-x="462" d="M-88 -403q12 -6 45 -7q70 0 111 40t61.5 99.5t25.5 131t5 135.5v946h143v-948q0 -104 -19.5 -199.5t-58.5 -167t-98 -113.5t-137 -42q-33 0 -45 6zM129 1286q0 41 29.5 74t72.5 33q41 0 74 -33t33 -74q0 -43 -33 -72.5t-74 -29.5q-43 0 -72.5 29.5t-29.5 72.5z" /> +<glyph unicode="k" horiz-adv-x="970" d="M160 0v1516h143v-971l414 397h164l-336 -332l401 -610h-164l-338 512l-141 -141v-371h-143z" /> +<glyph unicode="l" horiz-adv-x="487" d="M172 0v1516h143v-1516h-143z" /> +<glyph unicode="m" horiz-adv-x="1759" d="M160 0v942h112l17 -176h8q27 86 112 146.5t220 60.5q123 0 206 -54.5t105 -152.5q20 41 51 78t74 65.5t98.5 46t124.5 17.5q63 0 121.5 -17.5t102.5 -56.5t71 -102.5t27 -155.5v-641h-144v623q0 125 -57 177t-143 52q-104 0 -188.5 -64.5t-121.5 -183.5v-604h-143v623 q0 125 -57.5 177t-143.5 52q-104 0 -188 -64.5t-121 -183.5v-604h-143z" /> +<glyph unicode="n" horiz-adv-x="1116" d="M160 0v942h112l17 -176h8q27 86 119 146.5t229 60.5q66 0 124 -17.5t101 -56.5t69 -102.5t26 -155.5v-641h-144v623q0 123 -55 176t-141 53q-51 0 -101.5 -16.5t-93.5 -48t-75.5 -77.5t-51.5 -106v-604h-143z" /> +<glyph unicode="o" horiz-adv-x="1148" d="M98 475q0 100 29 190.5t87 159t148.5 108.5t210.5 40q125 0 215.5 -42t148.5 -112.5t86 -162t28 -191.5t-28 -189.5t-85 -156t-146.5 -105.5t-209.5 -39q-125 0 -216.5 41t-150.5 110t-88 159t-29 190zM250 481q0 -78 19.5 -149.5t59.5 -126.5t102.5 -88t148.5 -33 q82 0 142 30.5t100 83t58.5 121t18.5 144.5q0 78 -19.5 149.5t-60.5 126t-103.5 87t-148.5 32.5q-84 0 -143 -30.5t-98 -82t-57.5 -120t-18.5 -144.5z" /> +<glyph unicode="p" horiz-adv-x="1177" d="M160 -532v1474h112l17 -176h8q25 37 60.5 75t82.5 66.5t103.5 47t122.5 18.5q104 0 182 -41t129 -108.5t76.5 -156.5t25.5 -188q0 -102 -27.5 -193t-82 -160t-136 -110t-190.5 -41q-137 0 -225 59.5t-115 147.5v-714h-143zM303 344q18 -59 53 -104t81 -78t98.5 -49.5 t105.5 -16.5q72 0 125 29t89 80t54.5 118.5t18.5 145.5q0 74 -17.5 143.5t-54.5 122.5t-93 85t-134 32q-98 0 -183.5 -53.5t-142.5 -153.5v-301z" /> +<glyph unicode="q" horiz-adv-x="1177" d="M98 477q0 98 26 188.5t77 158t126.5 108.5t178.5 41q68 0 126 -18.5t104 -47t83 -65.5t62 -76h8l16 176h113v-1474h-144v714q-27 -88 -114.5 -147.5t-224.5 -59.5q-109 0 -191 41t-136 110t-82 160t-28 191zM250 469q0 -78 18.5 -145.5t54 -118.5t89 -80t125.5 -29 q53 0 105 16.5t98 49.5t81 78t53 104v301q-57 100 -142 153.5t-183 53.5q-78 0 -134.5 -32t-93 -85t-54 -122.5t-17.5 -143.5z" /> +<glyph unicode="r" horiz-adv-x="731" d="M160 0v942h112l17 -207h8q14 47 37.5 90t57.5 76t77 52.5t98 19.5q39 0 82 -13.5t62 -33.5l-43 -135q-33 18 -66 29t-63 11q-41 0 -78 -22.5t-68 -61t-54.5 -90t-35.5 -106.5v-551h-143z" /> +<glyph unicode="s" horiz-adv-x="903" d="M96 78l37 133q74 -68 164 -98.5t162 -30.5q102 0 155.5 50t53.5 106q0 18 -2 41.5t-16.5 48t-43 46t-82.5 34.5l-196 49q-68 16 -111 42.5t-67.5 58.5t-35 68t-10.5 72q0 125 93.5 200t248.5 75q80 0 172.5 -21.5t155.5 -62.5l-39 -123q-41 35 -122 63.5t-177 28.5 q-98 0 -142 -36t-44 -97q0 -20 6 -43t23.5 -42t47 -36.5t79.5 -28.5l145 -32q86 -18 138 -50t81 -69t38 -75t9 -70q0 -63 -25.5 -119t-73.5 -96.5t-118 -64.5t-156 -24q-109 0 -201 32t-147 71z" /> +<glyph unicode="t" horiz-adv-x="641" d="M45 846v76l162 20l31 285h108v-285h221v-96h-221v-653q0 -66 19.5 -86.5t60.5 -20.5q47 0 84 14.5t65 34.5l29 -108q-35 -16 -91 -33t-124 -17q-66 0 -102.5 18.5t-55 49.5t-23.5 69t-5 74v658h-158z" /> +<glyph unicode="u" horiz-adv-x="1114" d="M150 301v641h143v-623q0 -63 15.5 -106t41 -68.5t61 -37t78.5 -11.5q51 0 101.5 15.5t93.5 46t76 76t51 104.5v604h143v-942h-112l-17 176h-8q-27 -86 -119 -143.5t-229 -57.5q-66 0 -124 16.5t-101 54.5t-68.5 100.5t-25.5 154.5z" /> +<glyph unicode="v" horiz-adv-x="1067" d="M14 942h156l367 -807l366 807h150l-428 -942h-183z" /> +<glyph unicode="w" horiz-adv-x="1683" d="M33 942h151l295 -803l295 803h152l276 -803l314 803h145l-367 -942h-194l-256 737l-271 -737h-194z" /> +<glyph unicode="x" horiz-adv-x="1058" d="M37 0l405 481l-385 461h174l299 -358l297 358h174l-387 -457l408 -485h-174l-322 383l-315 -383h-174z" /> +<glyph unicode="y" horiz-adv-x="1062" d="M-4 942h170l375 -784l336 784h161l-432 -950q-31 -66 -74 -155t-102 -169t-139 -136t-180 -56q-16 0 -24.5 1t-18.5 5l-27 135q6 -2 14 -4t29 -2q41 0 77 8t70 33q72 51 130.5 149.5t105.5 229.5z" /> +<glyph unicode="z" horiz-adv-x="854" d="M86 0v123l498 698h-478v121h644v-119l-502 -702h522v-121h-684z" /> +<glyph unicode="{" horiz-adv-x="583" d="M74 639v61q55 2 84.5 31t44 70t16.5 86t2 82q0 31 -1 72.5t-1 84.5t-1 80t-1 60q0 63 10.5 117.5t39 92t82.5 59t143 21.5l4 -43q-45 -4 -72 -22t-40 -46t-17.5 -65t-4.5 -75q0 -18 1.5 -57.5t1.5 -82.5t1 -85t1 -68q0 -63 -9.5 -119.5t-31 -102t-58.5 -77t-94 -43.5 q57 -12 94 -44t58.5 -77t31 -101.5t9.5 -119.5q0 -27 -1 -69t-1 -85t-1.5 -82t-1.5 -57q0 -41 4.5 -77t17.5 -63.5t40 -46t72 -22.5l-4 -43q-88 0 -142.5 21.5t-83 59.5t-39 91t-10.5 119q0 23 1 61.5t1 82.5t1 87t1 72q0 37 -3 82t-16.5 84t-43 66.5t-84.5 29.5z" /> +<glyph unicode="|" horiz-adv-x="491" d="M182 -233v1806h127v-1806h-127z" /> +<glyph unicode="}" horiz-adv-x="583" d="M88 -174q45 4 71.5 22.5t40 46t17.5 63.5t4 77q0 18 -1 57t-1 82t-1 85t-1 69q0 63 9.5 119.5t31 101.5t58 76.5t94.5 44.5q-57 12 -94 43.5t-58.5 77t-31 101.5t-9.5 120q0 27 1 68.5t1 84.5t1 82t1 58q0 39 -4 75.5t-17.5 64.5t-40 46t-71.5 22l4 43q88 0 142.5 -21.5 t83 -59t39 -92t10.5 -117.5q0 -23 -1 -60t-1 -80t-1.5 -85t-1.5 -72q0 -37 2.5 -82t16.5 -86t44 -70t85 -31v-61q-55 -2 -85 -29.5t-43 -66.5t-16.5 -84t-3.5 -82q0 -29 1.5 -72t1.5 -87t1 -83t1 -61q0 -66 -10.5 -119t-39 -91t-83 -59.5t-142.5 -21.5z" /> +<glyph unicode="~" horiz-adv-x="1015" d="M154 414q0 14 12 40.5t36.5 53.5t59.5 45t78 18q27 0 71 -3t94 -6t103.5 -6t98.5 -3q35 0 70.5 8t62.5 45l24 -16q0 -6 -10 -32t-31.5 -53.5t-55.5 -50t-83 -22.5q-23 0 -74 3t-111.5 6t-116.5 6.5t-89 3.5q-51 0 -71.5 -13.5t-41.5 -38.5z" /> +<glyph unicode="&#xa1;" horiz-adv-x="491" d="M147 -446l50 1089h96l53 -1089h-199zM152 879q0 39 27.5 66.5t68.5 27.5q37 0 66.5 -27.5t29.5 -66.5t-29.5 -69t-66.5 -30q-41 0 -68.5 30t-27.5 69z" /> +<glyph unicode="&#xa2;" horiz-adv-x="1036" d="M96 449q0 86 24.5 165.5t77 142t134.5 102.5t194 50v273h123v-275q82 -6 157 -26.5t122 -51.5l-35 -120q-39 29 -105.5 51t-138.5 33v-703q72 10 142.5 42t117.5 79l29 -133q-47 -31 -123 -59.5t-166 -38.5v-261h-123v258q-109 8 -189.5 48.5t-133.5 105t-80 146.5 t-27 172zM248 461q0 -68 17.5 -129.5t53 -110.5t88 -82t119.5 -45v701q-74 -10 -127 -40t-86.5 -75t-49 -101.5t-15.5 -117.5z" /> +<glyph unicode="&#xa3;" horiz-adv-x="1161" d="M70 33q80 35 135 86t89 113.5t49 134t15 145.5v31h-200v106h192q-10 94 -24.5 184.5t-14.5 161.5q0 100 35 170t91.5 114t126 63.5t136.5 19.5q94 0 180.5 -29.5t139.5 -70.5l-37 -136q-41 41 -119 71t-159 30q-61 0 -101.5 -17.5t-64 -48.5t-33.5 -72.5t-10 -89.5 q0 -70 13 -158.5t19 -191.5h285v-106h-281q-4 -104 -43.5 -220t-121.5 -212l4 -7q63 -4 127.5 -17t130 -28.5t131 -28t133.5 -12.5q51 0 93 9.5t89 29.5l-39 -149q-51 -27 -86 -34t-80 -7q-74 0 -145.5 21.5t-142 46t-143 46t-152.5 21.5q-20 0 -75.5 -9t-113.5 -56z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1189" d="M113 883l61 61l164 -162q66 47 125 68.5t129 21.5q72 0 132 -21.5t120 -68.5l166 160l61 -59l-162 -164q47 -63 68.5 -122.5t21.5 -129.5q0 -68 -20.5 -127t-67.5 -121l164 -164l-63 -61l-166 162q-59 -45 -120.5 -69t-129.5 -24q-66 0 -126 23t-128 70l-164 -162l-59 61 l160 164q-90 111 -91 252q0 66 20.5 125t72.5 123zM291 469q0 -63 23.5 -118.5t65.5 -97.5t97 -65.5t119 -23.5q63 0 117.5 23.5t95.5 65.5t64.5 97.5t23.5 118.5t-23.5 118.5t-64.5 96.5t-96.5 65.5t-118.5 24.5q-61 0 -116.5 -23.5t-97.5 -64.5t-65.5 -97.5t-23.5 -119.5z " /> +<glyph unicode="&#xa5;" horiz-adv-x="1329" d="M63 1352h183l428 -650l413 650h179l-404 -615h234v-106h-303l-50 -76v-33h353v-106h-353v-416h-153v416h-352v106h352v25l-55 84h-297v106h227z" /> +<glyph unicode="&#xa6;" horiz-adv-x="499" d="M186 -233v794h127v-794h-127zM186 778v795h127v-795h-127z" /> +<glyph unicode="&#xa7;" horiz-adv-x="901" d="M94 762q0 78 36 148.5t95 115.5q-25 55 -24 127q0 76 27.5 132t71.5 93t97.5 55.5t104.5 18.5q59 0 124.5 -22.5t110.5 -55.5l-51 -137q-37 41 -89 63.5t-103 22.5q-61 0 -109.5 -38t-48.5 -109q0 -59 35 -106.5t87 -90.5t113.5 -86t113.5 -91t87 -106.5t35 -134.5 q0 -78 -36 -149.5t-95 -114.5q10 -29 17 -60.5t7 -66.5q0 -76 -27.5 -132t-71.5 -93t-97 -55.5t-105 -18.5q-59 0 -124.5 22.5t-110.5 55.5l51 137q37 -41 89 -63.5t104 -22.5q61 0 109 38t48 109q0 59 -34.5 106.5t-87 90.5t-114 86t-113.5 91t-87 106.5t-35 134.5z M221 811q0 -68 44 -119t107.5 -98t133 -98.5t121.5 -116.5q29 27 41 62.5t12 70.5q0 66 -45 117t-108.5 99t-133 98.5t-119.5 115.5q-29 -27 -41 -62.5t-12 -68.5z" /> +<glyph unicode="&#xa8;" horiz-adv-x="450" d="M0 1292q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5zM281 1292q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -26 -64.5t-60 -25.5q-35 0 -59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1484" d="M121 725q0 127 48 238.5t133 195.5t197.5 132t241.5 48t243 -48t198 -132t133 -195.5t49 -238.5q0 -129 -49 -242.5t-134 -196.5t-201 -131.5t-249 -48.5q-125 0 -236.5 49.5t-194.5 133.5t-131 196.5t-48 239.5zM217 725q0 -113 40 -210t110.5 -170t164 -114t201.5 -41 q115 0 212 41t169 113t113 169t41 212q0 111 -41 207t-112 169t-167 113.5t-207 40.5t-207 -40.5t-166.5 -113.5t-110.5 -169t-40 -207zM408 729q0 70 18 131.5t58 107.5t103.5 72.5t153.5 26.5q68 0 134.5 -15.5t107.5 -41.5l-25 -105q-33 25 -95 43.5t-122 18.5 q-57 0 -97 -18.5t-64.5 -49.5t-36 -73t-11.5 -89q0 -104 54.5 -178t163.5 -74q59 0 119.5 23.5t101.5 62.5l18 -114q-41 -27 -110.5 -49.5t-147.5 -22.5q-84 0 -144.5 27.5t-100.5 73.5t-59 108.5t-19 134.5z" /> +<glyph unicode="&#xaa;" horiz-adv-x="763" d="M123 905q0 70 36 113t87 64.5t108.5 28.5t100.5 7h55v15q0 70 -43 103.5t-115 33.5q-53 0 -92 -13.5t-76 -35.5l-20 73q41 25 90 39.5t106 14.5q47 0 92.5 -11.5t80 -36t56 -63.5t21.5 -94v-387h-82l-10 100h-8q-29 -47 -91.5 -82t-133.5 -35q-80 0 -121 47t-41 119z M221 911q0 -47 22.5 -67.5t67.5 -20.5q49 0 106.5 34t92.5 93v99h-10q-49 0 -99.5 -4.5t-90.5 -17.5t-64.5 -41t-24.5 -75z" /> +<glyph unicode="&#xab;" horiz-adv-x="991" d="M106 487v11l275 362h162l-295 -362v-11l295 -362h-164zM438 487v11l275 362h161l-294 -362v-11l294 -362h-163z" /> +<glyph unicode="&#xac;" horiz-adv-x="1294" d="M156 592v106h983v-458h-109v352h-874z" /> +<glyph unicode="&#xad;" horiz-adv-x="997" d="M152 436l4 107h688l-4 -107h-688z" /> +<glyph unicode="&#xae;" horiz-adv-x="1484" d="M121 725q0 127 48 238.5t133 195.5t197.5 132t241.5 48t243 -48t198 -132t133 -195.5t49 -238.5q0 -129 -49 -242.5t-134 -196.5t-201 -131.5t-249 -48.5q-125 0 -236.5 49.5t-194.5 133.5t-131 196.5t-48 239.5zM217 725q0 -113 40 -210t110.5 -170t164 -114t201.5 -41 q115 0 212 41t169 113t113 169t41 212q0 111 -41 207t-112 169t-167 113.5t-207 40.5t-207 -40.5t-166.5 -113.5t-110.5 -169t-40 -207zM537 412v673q35 2 86 3.5t88 1.5q55 0 102 -9.5t81 -31t52.5 -58.5t18.5 -92q0 -63 -43 -113.5t-119 -70.5l207 -303h-113l-203 297h-59 v-297h-98zM635 782q18 -2 39 -2h43q68 0 106.5 33t38.5 94q0 47 -33.5 76t-113.5 29q-23 0 -42.5 -1t-37.5 -1v-228z" /> +<glyph unicode="&#xb0;" horiz-adv-x="733" d="M117 1112q0 49 16.5 91t48 75t77.5 51.5t106 18.5q125 0 188 -72t63 -170q0 -45 -15 -86t-46 -73t-79 -50t-111 -18q-66 0 -113 19.5t-77 52t-44 74.5t-14 87zM213 1114q0 -66 38 -112t114 -46q78 0 113.5 42t35.5 108t-37 112t-115 46q-80 0 -114.5 -44.5t-34.5 -105.5z " /> +<glyph unicode="&#xb1;" horiz-adv-x="989" d="M168 143v109h653v-109h-653zM168 610v109h272v213h107v-213h274v-109h-274v-235h-107v235h-272z" /> +<glyph unicode="&#xb2;" horiz-adv-x="768" d="M133 612v86q49 61 112.5 117.5t120 113t96.5 114t40 118.5q0 18 -5 39t-18.5 38t-36 29.5t-59.5 12.5q-53 0 -107.5 -31.5t-89.5 -77.5l-22 91q47 43 104.5 71.5t116.5 28.5q109 0 166 -55.5t57 -143.5q0 -68 -31.5 -126t-82 -113.5t-113 -109.5t-123.5 -116h358v-86 h-483z" /> +<glyph unicode="&#xb3;" horiz-adv-x="731" d="M115 680l24 82q43 -35 80 -56.5t98 -21.5q100 0 145.5 45t45.5 123q0 61 -40 97t-153 36h-24v70h31q76 0 111.5 32.5t35.5 92.5q0 45 -22.5 72.5t-96.5 27.5q-55 0 -94 -17.5t-70 -41.5l-22 79q41 27 85 44.5t93 17.5q111 0 170 -49t59 -144q0 -45 -34.5 -82.5 t-81.5 -60.5q72 -23 113.5 -67t41.5 -117q0 -47 -16 -90t-52 -77t-90.5 -53.5t-129.5 -19.5q-72 0 -116 20.5t-91 57.5z" /> +<glyph unicode="&#xb4;" horiz-adv-x="448" d="M0 1171l6 15l369 207q35 -2 54.5 -22.5t19.5 -49.5q0 -20 -9 -39l-413 -158l-15 6z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1181" d="M82 -227q37 70 65.5 132t48 125.5t31 129t11.5 141.5v641h143v-623q0 -63 15.5 -106t41 -68.5t61.5 -37t79 -11.5q51 0 101 15.5t93 46t76 76t51 104.5v604h143v-942h-112l-17 176h-8q-27 -86 -119 -143.5t-229 -57.5q-66 0 -125 16.5t-102 55.5l-6 -27 q-35 -152 -111 -307z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1091" d="M72 928q0 106 34.5 187t99 136.5t156 83t201.5 27.5q72 0 155 -3t171 -7v-1528h-92v1403h-111v-1403h-102v684h-43q-121 0 -209 33.5t-145.5 91t-86 133.5t-28.5 162z" /> +<glyph unicode="&#xb7;" horiz-adv-x="495" d="M152 498q0 39 27.5 68.5t68.5 29.5q37 0 66.5 -29.5t29.5 -68.5t-29.5 -67t-66.5 -28q-41 0 -68.5 28t-27.5 67z" /> +<glyph unicode="&#xb8;" horiz-adv-x="413" d="M0 -365l27 48h14q25 -10 63.5 -17.5t77.5 -7.5q45 0 78 17.5t33 64.5q0 55 -32 74.5t-75 19.5q-25 0 -50 -4t-48 -10l-18 22l104 158h70l-62 -104q35 8 70 8q72 0 117 -42t45 -106q0 -35 -17.5 -65.5t-47.5 -54t-70.5 -38t-90.5 -14.5q-49 0 -97 11.5t-89 27.5z" /> +<glyph unicode="&#xb9;" horiz-adv-x="507" d="M88 1227l254 135v-750h-111v586l-116 -57z" /> +<glyph unicode="&#xba;" horiz-adv-x="798" d="M115 1051q0 61 19.5 114.5t56 94t89 64.5t117.5 24q70 0 123 -25t90 -67t55.5 -97t18.5 -115q0 -55 -17.5 -107t-53 -92t-89 -64.5t-125.5 -24.5q-74 0 -127 24.5t-87.5 66.5t-52 95.5t-17.5 108.5zM219 1053q0 -90 44 -151.5t136 -61.5q96 0 137.5 57t41.5 147 q0 88 -44.5 150.5t-140.5 62.5t-135 -58t-39 -146z" /> +<glyph unicode="&#xbb;" horiz-adv-x="991" d="M117 125l295 362v11l-295 362h162l274 -362v-11l-272 -362h-164zM449 125l294 362v11l-294 362h161l275 -362v-11l-273 -362h-163z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1456" d="M72 1227l254 135v-750h-111v586l-117 -57zM162 -49l948 1464h133l-948 -1464h-133zM895 225v86l301 437h98v-437h74v-86h-74v-227h-92v227h-307zM999 311h203v316z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1464" d="M76 1227l254 135v-750h-111v586l-117 -57zM125 -49l948 1464h133l-948 -1464h-133zM889 -4v86q49 61 112.5 117.5t120 113t96 113.5t39.5 119q0 18 -5 38.5t-18 38t-35.5 30t-59.5 12.5q-53 0 -107.5 -32t-89.5 -77l-22 90q47 43 104 71.5t117 28.5q109 0 166 -55 t57 -143q0 -68 -32 -126.5t-82 -113.5t-112.5 -109.5t-123.5 -115.5h358v-86h-483z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1536" d="M76 678l24 82q43 -35 80 -56.5t99 -21.5q100 0 145 45t45 123q0 61 -40 97t-153 36h-24v70h31q76 0 111.5 32.5t35.5 92.5q0 45 -22.5 72.5t-96.5 27.5q-55 0 -94 -17.5t-70 -41.5l-22 79q41 27 85 44.5t93 17.5q111 0 170 -49t59 -144q0 -45 -34.5 -82.5t-81.5 -60.5 q72 -23 113.5 -67t41.5 -117q0 -47 -16 -90t-52 -77t-90.5 -53.5t-129.5 -19.5q-72 0 -116 20.5t-91 57.5zM270 -49l949 1464h133l-949 -1464h-133zM975 225v86l301 437h98v-437h74v-86h-74v-227h-92v227h-307zM1079 311h203v316z" /> +<glyph unicode="&#xbf;" horiz-adv-x="823" d="M94 -123q0 61 21.5 115.5t55.5 109t72 109.5t71.5 119.5t56 140.5t22.5 170h131q0 -102 -20.5 -182t-52 -144.5t-68.5 -118t-68.5 -103.5t-52 -103t-20.5 -115q0 -82 52 -139.5t159 -57.5q33 0 69.5 8.5t71.5 21.5t64.5 31.5t52.5 41.5l37 -135q-55 -43 -137.5 -72 t-159.5 -29q-82 0 -148.5 24.5t-113 68t-71 104.5t-24.5 135zM356 877q0 39 30 67.5t69 28.5t66.5 -29t27.5 -67q0 -41 -27.5 -69t-66.5 -28t-69 28t-30 69z" /> +<glyph unicode="&#xc0;" d="M10 0l541 1352h186l594 -1352h-174l-199 455h-604l-180 -455h-164zM412 598h483l-254 582zM438 1667q0 29 18.5 48.5t53.5 21.5l371 -205l4 -14l-11 -41l-16 -7l-412 158q-8 19 -8 39z" /> +<glyph unicode="&#xc1;" d="M10 0l541 1352h186l594 -1352h-174l-199 455h-604l-180 -455h-164zM412 598h483l-254 582zM438 1518l6 14l369 205q35 -2 53.5 -21.5t18.5 -48.5q0 -10 -1 -19.5t-5 -19.5l-414 -158l-14 7z" /> +<glyph unicode="&#xc2;" d="M10 0l541 1352h186l594 -1352h-174l-199 455h-604l-180 -455h-164zM412 598h483l-254 582zM428 1507l6 15l225 202h17l225 -202l6 -15l-12 -41l-14 -6l-213 127l-213 -127l-15 6z" /> +<glyph unicode="&#xc3;" d="M10 0l541 1352h186l594 -1352h-174l-199 455h-604l-180 -455h-164zM344 1540q8 27 22.5 55.5t36 50t53 36t74.5 14.5q51 0 89 -4t71 -10.5t63.5 -10.5t69.5 -4q35 0 70 8t63 45l25 -16q-6 -29 -19.5 -56.5t-35 -50t-52 -37t-73.5 -14.5q-82 0 -167 14.5t-151 14.5 q-51 0 -71.5 -13.5t-40.5 -37.5zM412 598h483l-254 582z" /> +<glyph unicode="&#xc4;" d="M10 0l541 1352h186l594 -1352h-174l-199 455h-604l-180 -455h-164zM412 598h483l-254 582zM418 1626q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5zM739 1626q0 37 24.5 64.5t59.5 27.5q33 0 58.5 -27.5 t25.5 -64.5q0 -39 -25.5 -64.5t-58.5 -25.5q-35 0 -59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xc5;" d="M10 0l529 1321q-35 18 -54.5 51t-19.5 72q0 63 49 110.5t129 47.5t128 -49.5t48 -112.5q0 -39 -19.5 -70t-49.5 -49l581 -1321h-174l-199 455h-604l-180 -455h-164zM412 598h483l-254 582zM545 1446q0 -41 29.5 -74t70.5 -33t66.5 31t25.5 70q0 41 -27.5 70.5t-68.5 29.5 q-45 0 -70.5 -26.5t-25.5 -67.5z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1554" d="M-14 0l721 1352h725v-144h-486v-420h348v-143h-348v-502h527v-143h-680v455h-400l-239 -455h-168zM469 598h324v606z" /> +<glyph unicode="&#xc7;" d="M117 662q0 145 43 272t128 222t211 150.5t294 55.5q111 0 221 -23.5t190 -64.5l-43 -148q-66 43 -162 72t-219 29q-137 0 -231 -40t-152.5 -111.5t-84 -173t-25.5 -224.5q0 -281 122.5 -424t366.5 -143q129 0 237.5 36.5t174.5 90.5l41 -138q-78 -47 -188.5 -83.5 t-247.5 -41.5l-50 -79q18 4 36 6t32 2q72 0 117 -42t45 -106q0 -35 -16.5 -65.5t-46 -54t-70.5 -38t-90 -14.5t-98.5 11.5t-88.5 27.5l-2 12l27 48h14q25 -10 62.5 -17.5t78.5 -7.5q45 0 77 17.5t32 64.5q0 55 -30.5 74.5t-73.5 19.5q-25 0 -51.5 -4t-49.5 -10l-16 22 l88 135q-154 8 -267.5 66.5t-188.5 152t-110.5 213.5t-35.5 253z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1069" d="M203 0v1352h741v-144h-588v-420h451v-143h-451v-502h629v-143h-782zM344 1667q0 29 18.5 48.5t53.5 21.5l370 -205l7 -14l-13 -41l-16 -7l-412 158q-8 19 -8 39z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1069" d="M203 0v1352h741v-144h-588v-420h451v-143h-451v-502h629v-143h-782zM365 1518l6 14l370 205q35 -2 53.5 -21.5t18.5 -48.5q0 -20 -8 -39l-414 -158l-14 7z" /> +<glyph unicode="&#xca;" horiz-adv-x="1069" d="M203 0v1352h741v-144h-588v-420h451v-143h-451v-502h629v-143h-782zM348 1507l6 15l226 202h16l225 -202l6 -15l-12 -41l-14 -6l-213 127l-213 -127l-15 6z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1069" d="M203 0v1352h741v-144h-588v-420h451v-143h-451v-502h629v-143h-782zM324 1626q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -26 -64.5t-60 -25.5q-35 0 -59.5 25.5t-24.5 64.5zM645 1626q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5 t-60.5 -25.5t-59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xcc;" horiz-adv-x="559" d="M31 1667q0 29 18.5 48.5t52.5 21.5l371 -205l6 -14l-12 -41l-14 -7l-414 158q-8 19 -8 39zM203 0v1352h153v-1352h-153z" /> +<glyph unicode="&#xcd;" horiz-adv-x="559" d="M72 1518l6 14l371 205q35 -2 53 -21.5t18 -48.5q0 -20 -8 -39l-412 -158l-16 7zM203 0v1352h153v-1352h-153z" /> +<glyph unicode="&#xce;" horiz-adv-x="559" d="M37 1507l6 15l225 202h15l227 -202l6 -15l-12 -41l-17 -6l-211 127l-213 -127l-16 6zM203 0v1352h153v-1352h-153z" /> +<glyph unicode="&#xcf;" horiz-adv-x="559" d="M39 1626q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5zM203 0v1352h153v-1352h-153zM360 1626q0 37 25 64.5t59 27.5q35 0 60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1445" d="M29 668v90h178v594h10q98 4 213 7t223 3q145 0 265 -41t204 -113q109 -98 158 -239.5t49 -306.5q0 -139 -39 -263.5t-119.5 -218.5t-203.5 -149.5t-291 -55.5q-145 0 -261 7.5t-208 17.5v668h-178zM360 123q129 -12 310 -12q244 0 366.5 143t122.5 424q0 123 -25.5 224.5 t-84 173t-152.5 111.5t-231 40q-82 0 -161 -1t-145 -5v-463h359v-90h-359v-545z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1441" d="M203 0v1352h174l708 -1112v1112h154v-1352h-174l-709 1110v-1110h-153zM375 1540q8 27 22.5 55.5t36 50t53 36t74.5 14.5q51 0 89 -4t71 -10.5t63.5 -10.5t69.5 -4q35 0 69.5 8t63.5 45l25 -16q-6 -29 -19.5 -56.5t-35 -50t-52.5 -37t-74 -14.5q-82 0 -166.5 14.5 t-150.5 14.5q-51 0 -71.5 -13.5t-41.5 -37.5z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1548" d="M115 659q0 145 44 273.5t128 223.5t206.5 150.5t280.5 55.5q160 0 283 -55.5t207 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -285 55.5t-200.5 149.5t-119.5 218t-40 261zM285 680q0 -283 122.5 -426t356.5 -143q133 0 228 43 t155.5 118.5t89.5 177t29 218.5q0 125 -30 227t-90.5 176t-154.5 115t-223 41q-131 0 -223 -40t-149.5 -113t-84 -173t-26.5 -221zM492 1667q0 29 18 48.5t53 21.5l369 -205l6 -14l-10 -41l-17 -7l-411 158q-8 19 -8 39z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1548" d="M115 659q0 145 44 273.5t128 223.5t206.5 150.5t280.5 55.5q160 0 283 -55.5t207 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -285 55.5t-200.5 149.5t-119.5 218t-40 261zM285 680q0 -283 122.5 -426t356.5 -143q133 0 228 43 t155.5 118.5t89.5 177t29 218.5q0 125 -30 227t-90.5 176t-154.5 115t-223 41q-131 0 -223 -40t-149.5 -113t-84 -173t-26.5 -221zM629 1518l6 14l369 205q35 -2 53 -21.5t18 -48.5q0 -18 -6 -39l-414 -158l-16 7z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1548" d="M115 659q0 145 44 273.5t128 223.5t206.5 150.5t280.5 55.5q160 0 283 -55.5t207 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -285 55.5t-200.5 149.5t-119.5 218t-40 261zM285 680q0 -283 122.5 -426t356.5 -143q133 0 228 43 t155.5 118.5t89.5 177t29 218.5q0 125 -30 227t-90.5 176t-154.5 115t-223 41q-131 0 -223 -40t-149.5 -113t-84 -173t-26.5 -221zM555 1507l6 15l225 202h17l225 -202l6 -15l-12 -41l-14 -6l-213 127l-213 -127l-15 6z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1548" d="M115 659q0 145 44 273.5t128 223.5t206.5 150.5t280.5 55.5q160 0 283 -55.5t207 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -285 55.5t-200.5 149.5t-119.5 218t-40 261zM285 680q0 -283 122.5 -426t356.5 -143q133 0 228 43 t155.5 118.5t89.5 177t29 218.5q0 125 -30 227t-90.5 176t-154.5 115t-223 41q-131 0 -223 -40t-149.5 -113t-84 -173t-26.5 -221zM459 1540q8 27 22.5 55.5t36 50t53 36t74.5 14.5q51 0 89 -4t71 -10.5t63.5 -10.5t69.5 -4q35 0 69.5 8t63.5 45l25 -16q-6 -29 -19.5 -56.5 t-35 -50t-52.5 -37t-74 -14.5q-82 0 -166.5 14.5t-150.5 14.5q-51 0 -71.5 -13.5t-41.5 -37.5z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1548" d="M115 659q0 145 44 273.5t128 223.5t206.5 150.5t280.5 55.5q160 0 283 -55.5t207 -150.5t127 -220t43 -262q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-164 0 -285 55.5t-200.5 149.5t-119.5 218t-40 261zM285 680q0 -283 122.5 -426t356.5 -143q133 0 228 43 t155.5 118.5t89.5 177t29 218.5q0 125 -30 227t-90.5 176t-154.5 115t-223 41q-131 0 -223 -40t-149.5 -113t-84 -173t-26.5 -221zM530 1626q0 37 25 64.5t59 27.5q35 0 60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5zM852 1626 q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xd7;" horiz-adv-x="937" d="M145 242l246 247l-246 246l76 76l246 -246l250 248l76 -76l-250 -248l250 -249l-76 -76l-250 250l-246 -248z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1548" d="M117 659q0 145 44 273.5t128 223.5t206.5 150.5t280.5 55.5q115 0 210 -28.5t171 -82.5l133 156l105 -80l-138 -164q88 -96 133.5 -222t45.5 -267q0 -135 -42 -261t-127 -223.5t-211 -156t-294 -58.5q-125 0 -224.5 32t-177.5 91l-143 -170l-98 88l147 174 q-76 94 -112.5 214t-36.5 255zM287 680q0 -229 82 -367l700 832q-117 82 -299 82q-131 0 -223 -40t-149.5 -113t-84 -173t-26.5 -221zM455 209q117 -98 311 -98q133 0 228.5 43t155.5 118.5t89 177t29 218.5q0 238 -105 385z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1409" d="M188 455v897h154v-828q0 -221 97.5 -317t269.5 -96t270 96t98 317v828h144v-897q0 -100 -31 -187.5t-94.5 -152t-159.5 -101.5t-227 -37q-143 0 -242.5 37t-161 101.5t-89.5 152t-28 187.5zM453 1667q0 29 18 48.5t53 21.5l371 -205l4 -14l-10 -41l-17 -7l-411 158 q-8 19 -8 39z" /> +<glyph unicode="&#xda;" horiz-adv-x="1409" d="M188 455v897h154v-828q0 -221 97.5 -317t269.5 -96t270 96t98 317v828h144v-897q0 -100 -31 -187.5t-94.5 -152t-159.5 -101.5t-227 -37q-143 0 -242.5 37t-161 101.5t-89.5 152t-28 187.5zM510 1518l6 14l371 205q35 -2 53 -21.5t18 -48.5q0 -20 -8 -39l-411 -158l-17 7 z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1409" d="M188 455v897h154v-828q0 -221 97.5 -317t269.5 -96t270 96t98 317v828h144v-897q0 -100 -31 -187.5t-94.5 -152t-159.5 -101.5t-227 -37q-143 0 -242.5 37t-161 101.5t-89.5 152t-28 187.5zM459 1507l4 15l227 202h15l227 -202l4 -15l-10 -41l-17 -6l-211 127l-213 -127 l-16 6z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1409" d="M188 455v897h154v-828q0 -221 97.5 -317t269.5 -96t270 96t98 317v828h144v-897q0 -100 -31 -187.5t-94.5 -152t-159.5 -101.5t-227 -37q-143 0 -242.5 37t-161 101.5t-89.5 152t-28 187.5zM483 1626q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5 t-60.5 -25.5t-59.5 25.5t-24.5 64.5zM805 1626q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1159" d="M-23 1352h183l428 -650l413 650h179l-523 -797v-555h-153v547zM440 1518l6 14l369 205q35 -2 53.5 -21.5t18.5 -48.5q0 -18 -6 -39l-414 -158l-16 7z" /> +<glyph unicode="&#xde;" horiz-adv-x="1062" d="M203 0v1352h143v-260q41 2 82 3t68 1q221 0 351 -105.5t130 -304.5q0 -84 -25.5 -156.5t-82 -128t-146.5 -87t-217 -31.5q-29 0 -74 1t-86 5v-289h-143zM346 426q39 -4 83 -6t69 -2q160 0 234.5 68.5t74.5 211.5q0 61 -15.5 109.5t-51 82.5t-94 52.5t-146.5 18.5 q-27 0 -71 -1.5t-83 -3.5v-530z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1114" d="M160 0v995q0 115 23.5 209t71.5 162t118.5 104.5t165.5 36.5q76 0 137 -23.5t104 -61.5t66.5 -88t23.5 -103q0 -70 -32.5 -128.5t-71.5 -110.5t-71.5 -100t-32.5 -93q0 -43 28.5 -75t71.5 -62.5t92 -63.5t92 -77t72 -101.5t29 -136.5q0 -84 -32 -142.5t-78 -95.5 t-100.5 -53.5t-99.5 -16.5q-68 0 -125 28t-94 63l41 145q31 -61 84 -95t109 -34q59 0 101 44t42 134q0 72 -27.5 121t-68.5 85t-88 65.5t-88 63.5t-69 78t-28 111q0 72 30 127.5t65.5 104.5t65.5 98t30 107q0 66 -46 113.5t-141 47.5q-74 0 -118.5 -32.5t-69.5 -86t-32 -124 t-7 -144.5v-995h-143z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1019" d="M82 252q0 117 59.5 186.5t145.5 104.5t181 45t167 10h92v25q0 78 -21.5 118.5t-62.5 69.5q-35 23 -75 32t-105 9q-86 0 -151.5 -22.5t-127.5 -59.5l-32 123q137 80 327 80q76 0 143.5 -13.5t118.5 -46.5q59 -37 94 -104.5t35 -167.5v-641h-112l-17 168h-8 q-25 -39 -65.5 -74t-91 -61.5t-108.5 -42t-116 -15.5q-135 0 -202.5 79t-67.5 198zM215 1321q0 29 18.5 49.5t53.5 22.5l368 -207l7 -15l-11 -41l-16 -6l-414 158q-6 21 -6 39zM233 260q0 -80 44.5 -122t117.5 -42q84 0 178.5 53.5t153.5 153.5v191h-18q-84 0 -168 -6.5 t-153 -31t-112 -70.5t-43 -126z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1019" d="M82 252q0 117 59.5 186.5t145.5 104.5t181 45t167 10h92v25q0 78 -21.5 118.5t-62.5 69.5q-35 23 -75 32t-105 9q-86 0 -151.5 -22.5t-127.5 -59.5l-32 123q137 80 327 80q76 0 143.5 -13.5t118.5 -46.5q59 -37 94 -104.5t35 -167.5v-641h-112l-17 168h-8 q-25 -39 -65.5 -74t-91 -61.5t-108.5 -42t-116 -15.5q-135 0 -202.5 79t-67.5 198zM233 260q0 -80 44.5 -122t117.5 -42q84 0 178.5 53.5t153.5 153.5v191h-18q-84 0 -168 -6.5t-153 -31t-112 -70.5t-43 -126zM367 1171l6 15l368 207q35 -2 54.5 -22.5t19.5 -49.5 q0 -20 -8 -39l-414 -158l-14 6z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1019" d="M82 252q0 117 59.5 186.5t145.5 104.5t181 45t167 10h92v25q0 78 -21.5 118.5t-62.5 69.5q-35 23 -75 32t-105 9q-86 0 -151.5 -22.5t-127.5 -59.5l-32 123q137 80 327 80q76 0 143.5 -13.5t118.5 -46.5q59 -37 94 -104.5t35 -167.5v-641h-112l-17 168h-8 q-25 -39 -65.5 -74t-91 -61.5t-108.5 -42t-116 -15.5q-135 0 -202.5 79t-67.5 198zM233 260q0 -80 44.5 -122t117.5 -42q84 0 178.5 53.5t153.5 153.5v191h-18q-84 0 -168 -6.5t-153 -31t-112 -70.5t-43 -126zM252 1161l6 15l225 202h17l225 -202l6 -15l-12 -39l-14 -6 l-213 125l-211 -125l-17 6z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1019" d="M82 252q0 117 59.5 186.5t145.5 104.5t181 45t167 10h92v25q0 78 -21.5 118.5t-62.5 69.5q-35 23 -75 32t-105 9q-86 0 -151.5 -22.5t-127.5 -59.5l-32 123q137 80 327 80q76 0 143.5 -13.5t118.5 -46.5q59 -37 94 -104.5t35 -167.5v-641h-112l-17 168h-8 q-25 -39 -65.5 -74t-91 -61.5t-108.5 -42t-116 -15.5q-135 0 -202.5 79t-67.5 198zM182 1194q0 14 12.5 41t37 52.5t59.5 44t78 18.5q53 0 134 -9.5t171 -9.5q35 0 69.5 8.5t63.5 44.5l24 -16q0 -6 -10 -31.5t-31.5 -53.5t-55.5 -50.5t-83 -22.5q-23 0 -64.5 3.5t-89.5 6.5 t-95.5 6t-79.5 3q-51 0 -72 -13.5t-41 -37.5zM233 260q0 -80 44.5 -122t117.5 -42q84 0 178.5 53.5t153.5 153.5v191h-18q-84 0 -168 -6.5t-153 -31t-112 -70.5t-43 -126z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1019" d="M82 252q0 117 59.5 186.5t145.5 104.5t181 45t167 10h92v25q0 78 -21.5 118.5t-62.5 69.5q-35 23 -75 32t-105 9q-86 0 -151.5 -22.5t-127.5 -59.5l-32 123q137 80 327 80q76 0 143.5 -13.5t118.5 -46.5q59 -37 94 -104.5t35 -167.5v-641h-112l-17 168h-8 q-25 -39 -65.5 -74t-91 -61.5t-108.5 -42t-116 -15.5q-135 0 -202.5 79t-67.5 198zM233 260q0 -80 44.5 -122t117.5 -42q84 0 178.5 53.5t153.5 153.5v191h-18q-84 0 -168 -6.5t-153 -31t-112 -70.5t-43 -126zM266 1282q0 37 24.5 64.5t59.5 27.5q33 0 58.5 -27.5 t25.5 -64.5q0 -39 -25.5 -64.5t-58.5 -25.5q-35 0 -59.5 25.5t-24.5 64.5zM588 1282q0 37 23.5 64.5t58.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-58.5 25.5t-23.5 64.5z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1019" d="M82 252q0 117 59.5 186.5t145.5 104.5t181 45t167 10h92v25q0 78 -21.5 118.5t-62.5 69.5q-35 23 -75 32t-105 9q-86 0 -151.5 -22.5t-127.5 -59.5l-32 123q137 80 327 80q76 0 143.5 -13.5t118.5 -46.5q59 -37 94 -104.5t35 -167.5v-641h-112l-17 168h-8 q-25 -39 -65.5 -74t-91 -61.5t-108.5 -42t-116 -15.5q-135 0 -202.5 79t-67.5 198zM233 260q0 -80 44.5 -122t117.5 -42q84 0 178.5 53.5t153.5 153.5v191h-18q-84 0 -168 -6.5t-153 -31t-112 -70.5t-43 -126zM352 1249q0 57 45 103.5t123 46.5q80 0 125 -48t45 -106 q0 -53 -43 -98t-125 -45q-43 0 -74.5 13t-53 34.5t-32 47t-10.5 52.5zM428 1251q0 -37 26.5 -68.5t67.5 -31.5t65.5 29.5t24.5 64.5q0 37 -25.5 71t-68.5 34t-66.5 -32t-23.5 -67z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1677" d="M82 252q0 117 59.5 186.5t145.5 104.5t181 45t167 10h92v25q0 78 -21.5 118.5t-62.5 69.5q-35 23 -75 32t-105 9q-86 0 -151.5 -22.5t-127.5 -59.5l-32 123q137 80 327 80q76 0 143.5 -13.5t118.5 -46.5q25 -16 49.5 -44.5t34.5 -57.5h9q59 70 155 116t213 46 q180 0 278.5 -91t98.5 -257q0 -35 -4 -71t-14 -52h-691v-37q2 -76 22.5 -145.5t62.5 -122t103.5 -83t145.5 -30.5q98 0 185.5 35t144.5 76l27 -109q-27 -16 -66 -35.5t-86 -36t-103.5 -28t-117.5 -11.5q-137 0 -235.5 56.5t-157.5 148.5h-9q-82 -113 -199.5 -159t-234.5 -46 q-135 0 -202.5 79t-67.5 198zM233 260q0 -80 44.5 -122t117.5 -42q84 0 178.5 53.5t153.5 153.5v191h-18q-84 0 -168 -6.5t-153 -31t-112 -70.5t-43 -126zM885 610h559q2 10 2 19v18q0 51 -20.5 91t-55.5 66.5t-80 40t-94 13.5q-135 0 -209.5 -71t-101.5 -177z" /> +<glyph unicode="&#xe7;" horiz-adv-x="1024" d="M100 479q0 98 28 187.5t87 158t151.5 108.5t221.5 40q98 0 192 -22.5t152 -59.5l-35 -121q-47 35 -135 62.5t-176 27.5q-90 0 -152.5 -30.5t-103.5 -82t-59.5 -118t-18.5 -137.5q0 -80 22.5 -154t66.5 -129t108.5 -88t150.5 -33q82 0 167 32t142 85l33 -127 q-53 -35 -146.5 -66.5t-199.5 -36.5l-49 -79q18 4 35.5 6t31.5 2q72 0 117 -42t45 -106q0 -35 -16.5 -65.5t-46 -54t-70.5 -38t-90 -14.5t-98 11.5t-88 27.5l-2 12l26 48h15q25 -10 62.5 -17.5t78.5 -7.5q45 0 76.5 17.5t31.5 64.5q0 55 -30.5 74.5t-73.5 19.5 q-25 0 -51.5 -4t-48.5 -10l-17 22l88 135q-106 8 -185 52.5t-131 112t-79 154.5t-27 183z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1056" d="M96 471q0 100 32 191.5t93.5 161t152.5 109.5t208 40q180 0 278 -91t98 -257q0 -35 -4 -71t-14 -52h-690v-21q0 -78 20.5 -149.5t61.5 -126.5t103.5 -88t148.5 -33q98 0 185 35t144 76l27 -109q-27 -16 -65.5 -35.5t-86 -36t-103.5 -28t-118 -11.5q-115 0 -203 40 t-147 109t-90 159t-31 188zM264 610h559q2 10 2 19v18q0 51 -20.5 91t-55 66.5t-79.5 40t-95 13.5q-135 0 -209.5 -71t-101.5 -177zM283 1321q0 29 18 49.5t53 22.5l369 -207l6 -15l-10 -41l-17 -6l-413 158q-6 21 -6 39z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1056" d="M96 471q0 100 32 191.5t93.5 161t152.5 109.5t208 40q180 0 278 -91t98 -257q0 -35 -4 -71t-14 -52h-690v-21q0 -78 20.5 -149.5t61.5 -126.5t103.5 -88t148.5 -33q98 0 185 35t144 76l27 -109q-27 -16 -65.5 -35.5t-86 -36t-103.5 -28t-118 -11.5q-115 0 -203 40 t-147 109t-90 159t-31 188zM264 610h559q2 10 2 19v18q0 51 -20.5 91t-55 66.5t-79.5 40t-95 13.5q-135 0 -209.5 -71t-101.5 -177zM395 1171l6 15l369 207q35 -2 53.5 -22.5t18.5 -49.5q0 -8 -1 -18.5t-5 -20.5l-414 -158l-14 6z" /> +<glyph unicode="&#xea;" horiz-adv-x="1056" d="M96 471q0 100 32 191.5t93.5 161t152.5 109.5t208 40q180 0 278 -91t98 -257q0 -35 -4 -71t-14 -52h-690v-21q0 -78 20.5 -149.5t61.5 -126.5t103.5 -88t148.5 -33q98 0 185 35t144 76l27 -109q-27 -16 -65.5 -35.5t-86 -36t-103.5 -28t-118 -11.5q-115 0 -203 40 t-147 109t-90 159t-31 188zM264 610h559q2 10 2 19v18q0 51 -20.5 91t-55 66.5t-79.5 40t-95 13.5q-135 0 -209.5 -71t-101.5 -177zM317 1161l5 15l227 202h14l228 -202l4 -15l-11 -39l-16 -6l-211 125l-213 -125l-16 6z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1056" d="M96 471q0 100 32 191.5t93.5 161t152.5 109.5t208 40q180 0 278 -91t98 -257q0 -35 -4 -71t-14 -52h-690v-21q0 -78 20.5 -149.5t61.5 -126.5t103.5 -88t148.5 -33q98 0 185 35t144 76l27 -109q-27 -16 -65.5 -35.5t-86 -36t-103.5 -28t-118 -11.5q-115 0 -203 40 t-147 109t-90 159t-31 188zM264 610h559q2 10 2 19v18q0 51 -20.5 91t-55 66.5t-79.5 40t-95 13.5q-135 0 -209.5 -71t-101.5 -177zM305 1282q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5zM627 1282 q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -26 -64.5t-60 -25.5q-35 0 -59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xec;" horiz-adv-x="462" d="M-70 1321q0 29 18.5 49.5t53.5 22.5l371 -207l6 -15l-12 -41l-17 -6l-411 158q-9 19 -9 39zM160 0v942h143v-942h-143z" /> +<glyph unicode="&#xed;" horiz-adv-x="462" d="M31 1171l6 15l369 207q35 -2 54 -22.5t19 -49.5q0 -20 -8 -39l-414 -158l-14 6zM160 0v942h143v-942h-143z" /> +<glyph unicode="&#xee;" horiz-adv-x="462" d="M-14 1161l6 15l225 202h16l226 -202l6 -15l-12 -39l-15 -6l-213 125l-211 -125l-16 6zM160 0v942h143v-942h-143z" /> +<glyph unicode="&#xef;" horiz-adv-x="462" d="M-16 1282q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -26 -64.5t-60 -25.5q-35 0 -59.5 25.5t-24.5 64.5zM160 0v942h143v-942h-143zM305 1282q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1155" d="M98 481q0 98 28 187.5t86 157t148.5 107.5t214.5 40q113 0 201 -38t129 -124l6 2q-29 123 -57.5 216t-65.5 171l-256 -65l-34 94l241 63q-37 59 -82 112.5t-102 111.5h150q82 -74 151 -193l240 63l37 -98l-230 -59q63 -135 100 -300t37 -337q0 -119 -21.5 -230.5 t-75.5 -197.5t-144 -137.5t-228 -51.5q-127 0 -217 43t-146 115t-83 162t-27 186zM252 485q0 -78 18.5 -149.5t57.5 -127.5t99 -90t144 -34t144.5 34t100.5 90t59.5 129t19.5 152q0 184 -91 277.5t-237 93.5q-86 0 -146.5 -31.5t-97 -84t-54 -120t-17.5 -139.5z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1116" d="M160 0v942h112l17 -176h8q27 86 119 146.5t229 60.5q66 0 124 -17.5t101 -56.5t69 -102.5t26 -155.5v-641h-144v623q0 125 -55 177t-141 52q-51 0 -101.5 -16.5t-93.5 -48t-75.5 -77.5t-51.5 -106v-604h-143zM246 1194q8 27 22.5 55.5t36 50t53 36t74.5 14.5 q51 0 89 -4.5t71 -10.5t63.5 -10t69.5 -4q35 0 69.5 8t63.5 45l25 -16q-6 -29 -19.5 -56.5t-35 -50t-52.5 -37t-74 -14.5q-82 0 -166.5 14.5t-150.5 14.5q-51 0 -71.5 -13.5t-41.5 -37.5z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1148" d="M98 475q0 100 29 190.5t87 159t148.5 108.5t210.5 40q125 0 215.5 -42t148.5 -112.5t86 -162t28 -191.5t-28 -189.5t-85 -156t-146.5 -105.5t-209.5 -39q-125 0 -216.5 41t-150.5 110t-88 159t-29 190zM250 481q0 -78 19.5 -149.5t59.5 -126.5t102.5 -88t148.5 -33 q82 0 142 30.5t100 83t58.5 121t18.5 144.5q0 78 -19.5 149.5t-60.5 126t-103.5 87t-148.5 32.5q-84 0 -143 -30.5t-98 -82t-57.5 -120t-18.5 -144.5zM279 1321q0 29 18 49.5t53 22.5l371 -207l6 -15l-12 -41l-15 -6l-413 158q-8 19 -8 39z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1148" d="M98 475q0 100 29 190.5t87 159t148.5 108.5t210.5 40q125 0 215.5 -42t148.5 -112.5t86 -162t28 -191.5t-28 -189.5t-85 -156t-146.5 -105.5t-209.5 -39q-125 0 -216.5 41t-150.5 110t-88 159t-29 190zM250 481q0 -78 19.5 -149.5t59.5 -126.5t102.5 -88t148.5 -33 q82 0 142 30.5t100 83t58.5 121t18.5 144.5q0 78 -19.5 149.5t-60.5 126t-103.5 87t-148.5 32.5q-84 0 -143 -30.5t-98 -82t-57.5 -120t-18.5 -144.5zM410 1171l6 15l368 207q35 -2 54.5 -22.5t19.5 -49.5q0 -20 -8 -39l-414 -158l-14 6z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1148" d="M98 475q0 100 29 190.5t87 159t148.5 108.5t210.5 40q125 0 215.5 -42t148.5 -112.5t86 -162t28 -191.5t-28 -189.5t-85 -156t-146.5 -105.5t-209.5 -39q-125 0 -216.5 41t-150.5 110t-88 159t-29 190zM250 481q0 -78 19.5 -149.5t59.5 -126.5t102.5 -88t148.5 -33 q82 0 142 30.5t100 83t58.5 121t18.5 144.5q0 78 -19.5 149.5t-60.5 126t-103.5 87t-148.5 32.5q-84 0 -143 -30.5t-98 -82t-57.5 -120t-18.5 -144.5zM350 1161l6 15l228 202h14l225 -202l6 -15l-10 -39l-16 -6l-213 125l-211 -125l-17 6z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1148" d="M98 475q0 100 29 190.5t87 159t148.5 108.5t210.5 40q125 0 215.5 -42t148.5 -112.5t86 -162t28 -191.5t-28 -189.5t-85 -156t-146.5 -105.5t-209.5 -39q-125 0 -216.5 41t-150.5 110t-88 159t-29 190zM238 1194q8 27 22 55.5t35.5 50t53.5 36t75 14.5q51 0 89 -4.5 t70.5 -10.5t63.5 -10t70 -4q35 0 69.5 8t63.5 45l24 -16q-6 -29 -19 -56.5t-34.5 -50t-52.5 -37t-74 -14.5q-82 0 -167 14.5t-150 14.5q-51 0 -71.5 -13.5t-41.5 -37.5zM250 481q0 -78 19.5 -149.5t59.5 -126.5t102.5 -88t148.5 -33q82 0 142 30.5t100 83t58.5 121 t18.5 144.5q0 78 -19.5 149.5t-60.5 126t-103.5 87t-148.5 32.5q-84 0 -143 -30.5t-98 -82t-57.5 -120t-18.5 -144.5z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1148" d="M98 475q0 100 29 190.5t87 159t148.5 108.5t210.5 40q125 0 215.5 -42t148.5 -112.5t86 -162t28 -191.5t-28 -189.5t-85 -156t-146.5 -105.5t-209.5 -39q-125 0 -216.5 41t-150.5 110t-88 159t-29 190zM250 481q0 -78 19.5 -149.5t59.5 -126.5t102.5 -88t148.5 -33 q82 0 142 30.5t100 83t58.5 121t18.5 144.5q0 78 -19.5 149.5t-60.5 126t-103.5 87t-148.5 32.5q-84 0 -143 -30.5t-98 -82t-57.5 -120t-18.5 -144.5zM330 1282q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5z M651 1282q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xf7;" horiz-adv-x="1159" d="M158 436v107h848v-107h-848zM508 164q0 39 27.5 67.5t68.5 28.5q37 0 66.5 -28.5t29.5 -67.5q0 -41 -29.5 -68.5t-66.5 -27.5q-41 0 -68.5 27.5t-27.5 68.5zM508 813q0 39 27.5 68.5t68.5 29.5q37 0 66.5 -29.5t29.5 -68.5t-29.5 -66.5t-66.5 -27.5q-41 0 -68.5 27.5 t-27.5 66.5z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1148" d="M84 16l115 129q-51 68 -76 153t-25 177q0 100 29 190.5t87 159t148.5 108.5t210.5 40q86 0 157 -21.5t124 -58.5l104 119l105 -80l-115 -129q53 -70 78 -157t25 -181q0 -100 -28 -189.5t-85 -156t-146.5 -105.5t-209.5 -39q-174 0 -289 80l-111 -127zM250 481 q0 -59 11 -116.5t36 -106.5l469 535q-39 31 -88 48t-111 17q-84 0 -143 -30.5t-98 -82t-57.5 -120t-18.5 -144.5zM379 152q80 -68 201 -68q82 0 142 30.5t100 83t58.5 121t18.5 144.5q0 127 -49 225z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1114" d="M150 301v641h143v-623q0 -63 15.5 -106t41 -68.5t61 -37t78.5 -11.5q51 0 101.5 15.5t93.5 46t76 76t51 104.5v604h143v-942h-112l-17 176h-8q-27 -86 -119 -143.5t-229 -57.5q-66 0 -124 16.5t-101 54.5t-68.5 100.5t-25.5 154.5zM262 1321q0 29 18.5 49.5t53.5 22.5 l368 -207l7 -15l-11 -41l-16 -6l-412 158q-8 19 -8 39z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1114" d="M150 301v641h143v-623q0 -63 15.5 -106t41 -68.5t61 -37t78.5 -11.5q51 0 101.5 15.5t93.5 46t76 76t51 104.5v604h143v-942h-112l-17 176h-8q-27 -86 -119 -143.5t-229 -57.5q-66 0 -124 16.5t-101 54.5t-68.5 100.5t-25.5 154.5zM340 1171l6 15l369 207q35 -2 53 -22.5 t18 -49.5q0 -18 -6 -39l-413 -158l-17 6z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1114" d="M150 301v641h143v-623q0 -63 15.5 -106t41 -68.5t61 -37t78.5 -11.5q51 0 101.5 15.5t93.5 46t76 76t51 104.5v604h143v-942h-112l-17 176h-8q-27 -86 -119 -143.5t-229 -57.5q-66 0 -124 16.5t-101 54.5t-68.5 100.5t-25.5 154.5zM307 1161l4 15l228 202h14l227 -202 l4 -15l-10 -39l-16 -6l-213 125l-211 -125l-17 6z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1114" d="M150 301v641h143v-623q0 -63 15.5 -106t41 -68.5t61 -37t78.5 -11.5q51 0 101.5 15.5t93.5 46t76 76t51 104.5v604h143v-942h-112l-17 176h-8q-27 -86 -119 -143.5t-229 -57.5q-66 0 -124 16.5t-101 54.5t-68.5 100.5t-25.5 154.5zM299 1282q0 37 24.5 64.5t59.5 27.5 t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5zM621 1282q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -26 -64.5t-60 -25.5q-35 0 -59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1062" d="M-4 942h170l375 -784l336 784h161l-432 -950q-31 -66 -74 -155t-102 -169t-139 -136t-180 -56q-16 0 -24.5 1t-18.5 5l-27 135q6 -2 14 -4t29 -2q41 0 77 8t70 33q72 51 130.5 149.5t105.5 229.5zM391 1171l6 15l369 207q35 -2 53.5 -22.5t18.5 -49.5q0 -8 -1 -18.5 t-6 -20.5l-413 -158l-15 6z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1177" d="M160 -532v2048h143v-750q20 35 56 71.5t82 66.5t102.5 49.5t122.5 19.5q104 0 182 -41t129 -108.5t76.5 -156.5t25.5 -188q0 -102 -27.5 -193t-82 -160t-136 -110t-190.5 -41q-137 0 -225 59.5t-115 147.5v-714h-143zM303 344q18 -59 53 -104t81 -78t98.5 -49.5 t105.5 -16.5q72 0 125 29t89 80t54.5 118.5t18.5 145.5q0 74 -17.5 143.5t-54.5 122.5t-93 85t-134 32q-98 0 -183.5 -53.5t-142.5 -153.5v-301z" /> +<glyph unicode="&#xff;" horiz-adv-x="1062" d="M-4 942h170l375 -784l336 784h161l-432 -950q-31 -66 -74 -155t-102 -169t-139 -136t-180 -56q-16 0 -24.5 1t-18.5 5l-27 135q6 -2 14 -4t29 -2q41 0 77 8t70 33q72 51 130.5 149.5t105.5 229.5zM272 1282q0 37 25 64.5t59 27.5q35 0 60.5 -27.5t25.5 -64.5 q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5zM594 1282q0 37 24.5 64.5t59.5 27.5t60.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-60.5 -25.5t-59.5 25.5t-24.5 64.5z" /> +<glyph unicode="&#x152;" horiz-adv-x="1748" d="M115 659q0 145 44 273.5t128 223.5t206.5 150.5t280.5 55.5q39 0 76 -3t72 -7h702v-144h-549v-420h412v-143h-412v-502h590v-143h-709q-90 -25 -196 -25q-164 0 -285 55.5t-200.5 149.5t-119.5 218t-40 261zM285 680q0 -283 122.5 -426t356.5 -143q86 0 158 18v1079 q-72 18 -154 19q-131 0 -223 -40t-149.5 -113t-84 -173t-26.5 -221z" /> +<glyph unicode="&#x153;" horiz-adv-x="1867" d="M98 473q0 100 29 190.5t87 159t148.5 108.5t210.5 40q152 0 250.5 -60.5t153.5 -158.5q59 98 163.5 158.5t252.5 60.5q180 0 278 -91.5t98 -256.5q0 -35 -4 -71t-14 -52h-690v-21q0 -78 20.5 -149.5t61.5 -127t103.5 -88t148.5 -32.5q98 0 185 35t144 76l27 -109 q-27 -16 -65.5 -35.5t-86 -36t-103.5 -28t-118 -11.5q-139 0 -240.5 57.5t-158.5 151.5q-53 -94 -150.5 -151.5t-246.5 -57.5q-125 0 -216.5 41t-150.5 110t-88 159t-29 190zM250 479q0 -78 19.5 -149.5t59.5 -127t102.5 -88t148.5 -32.5q82 0 142 30.5t100 83t58.5 121 t18.5 144.5q0 78 -19.5 149.5t-60.5 126t-103.5 87t-148.5 32.5q-84 0 -143 -30.5t-98 -82t-57.5 -120t-18.5 -144.5zM1075 608h559q2 10 2 19v18q0 51 -20.5 91t-55 66.5t-79.5 40t-95 13.5q-135 0 -209.5 -71t-101.5 -177z" /> +<glyph unicode="&#x178;" horiz-adv-x="1159" d="M-23 1352h183l428 -650l413 650h179l-523 -797v-555h-153v547zM342 1626q0 37 24.5 64.5t59.5 27.5q33 0 58.5 -27.5t25.5 -64.5q0 -39 -25.5 -64.5t-58.5 -25.5q-35 0 -59.5 25.5t-24.5 64.5zM664 1626q0 37 23.5 64.5t57.5 27.5q35 0 60.5 -27.5t25.5 -64.5 q0 -39 -25.5 -64.5t-60.5 -25.5t-58 25.5t-23 64.5z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="479" d="M0 1161l6 15l225 202h17l225 -202l6 -15l-12 -39l-14 -6l-213 125l-213 -125l-15 6z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="636" d="M0 1194q8 27 22.5 55.5t36 50t53 36t74.5 14.5q51 0 89 -4.5t71 -10.5t63.5 -10t69.5 -4q35 0 70 8t63 45l25 -16q-6 -29 -19.5 -56.5t-35 -50t-52 -37t-73.5 -14.5q-82 0 -167 14.5t-151 14.5q-51 0 -71.5 -13.5t-40.5 -37.5z" /> +<glyph unicode="&#x2000;" horiz-adv-x="868" /> +<glyph unicode="&#x2001;" horiz-adv-x="1736" /> +<glyph unicode="&#x2002;" horiz-adv-x="868" /> +<glyph unicode="&#x2003;" horiz-adv-x="1736" /> +<glyph unicode="&#x2004;" horiz-adv-x="577" /> +<glyph unicode="&#x2005;" horiz-adv-x="434" /> +<glyph unicode="&#x2006;" horiz-adv-x="288" /> +<glyph unicode="&#x2007;" horiz-adv-x="288" /> +<glyph unicode="&#x2008;" horiz-adv-x="217" /> +<glyph unicode="&#x2009;" horiz-adv-x="346" /> +<glyph unicode="&#x200a;" horiz-adv-x="96" /> +<glyph unicode="&#x2010;" horiz-adv-x="995" d="M152 436v107h692v-107h-692z" /> +<glyph unicode="&#x2011;" horiz-adv-x="995" d="M152 436v107h692v-107h-692z" /> +<glyph unicode="&#x2012;" horiz-adv-x="995" d="M152 436v107h692v-107h-692z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1150" d="M152 436v107h847v-107h-847z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1617" d="M152 436v107h1314v-107h-1314z" /> +<glyph unicode="&#x2018;" horiz-adv-x="460" d="M150 1130v216l149 157l41 -39l-80 -149h51v-185h-161z" /> +<glyph unicode="&#x2019;" horiz-adv-x="419" d="M127 1169l80 150h-51v184h161v-215l-149 -158z" /> +<glyph unicode="&#x201a;" horiz-adv-x="497" d="M139 -160l80 150h-51v184h162v-215l-150 -158z" /> +<glyph unicode="&#x201c;" horiz-adv-x="768" d="M150 1130v216l149 157l41 -39l-80 -149h51v-185h-161zM457 1130v216l149 157l41 -39l-80 -149h51v-185h-161z" /> +<glyph unicode="&#x201d;" horiz-adv-x="727" d="M127 1169l80 150h-51v184h161v-215l-149 -158zM434 1169l80 150h-51v184h162v-215l-150 -158z" /> +<glyph unicode="&#x201e;" horiz-adv-x="827" d="M139 -160l80 150h-51v184h162v-215l-150 -158zM469 -160l80 150h-51v184h161v-215l-149 -158z" /> +<glyph unicode="&#x2022;" horiz-adv-x="671" d="M197 498q0 55 39.5 98t99.5 43q27 0 52.5 -11.5t45 -32t30.5 -46t11 -51.5q0 -59 -43 -98.5t-96 -39.5q-59 0 -99 39.5t-40 98.5z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1255" d="M145 72q0 39 27 68.5t68 29.5q39 0 68.5 -29.5t29.5 -68.5t-29.5 -67t-68.5 -28q-41 0 -68 28t-27 67zM532 72q0 39 28 68.5t67 29.5t68.5 -29.5t29.5 -68.5t-29.5 -67t-68.5 -28t-67 28t-28 67zM920 72q0 39 27.5 68.5t66.5 29.5t68.5 -29.5t29.5 -68.5t-29.5 -67 t-68.5 -28t-66.5 28t-27.5 67z" /> +<glyph unicode="&#x202f;" horiz-adv-x="346" /> +<glyph unicode="&#x2039;" horiz-adv-x="659" d="M106 487v11l275 362h162l-295 -362v-11l295 -362h-164z" /> +<glyph unicode="&#x203a;" horiz-adv-x="659" d="M117 125l295 362v11l-295 362h162l274 -362v-11l-272 -362h-164z" /> +<glyph unicode="&#x205f;" horiz-adv-x="434" /> +<glyph unicode="&#x20ac;" horiz-adv-x="1275" d="M86 522v107h156v54q0 32 2 54h-158v107h172q20 113 64.5 207t114 163.5t161.5 108.5t209 39q92 0 188.5 -23.5t161.5 -64.5l-43 -148q-55 43 -135 72t-184 29q-88 0 -154 -26.5t-110 -77t-70.5 -121t-38.5 -158.5h522v-107h-532v-108h532v-107h-524q53 -412 371 -411 q111 0 201.5 36.5t148.5 90.5l41 -138q-72 -49 -171.5 -87t-226.5 -38q-121 0 -214 42t-159.5 116t-106.5 174.5t-54 214.5h-164z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1415" d="M131 1257v80h440v-80h-172v-501h-96v501h-172zM647 756v581h98l201 -495l199 495h96v-581h-80v428l-172 -428h-92l-172 430v-430h-78z" /> +<glyph unicode="&#xe000;" horiz-adv-x="940" d="M0 940h940v-940h-940v940z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1071" d="M51 846v76l158 18q0 199 26.5 312.5t71.5 172.5q47 66 101.5 83.5t107.5 17.5q102 0 184 -34t138 -69l-70 -123q-92 57 -155.5 88t-123.5 31q-45 0 -71.5 -19.5t-41 -62.5t-19.5 -110.5t-5 -161.5v-123h221v-96h-221v-846h-143v846h-158zM772 0v942h143v-942h-143z" /> +<glyph unicode="&#xfb02;" horiz-adv-x="1099" d="M51 846v76l158 18q0 111 11 190.5t29.5 137t40 95.5t44.5 62q51 59 104.5 80t100.5 21q20 0 53 -1t75 -6.5t91 -16.5t98 -29l72 43v-1516h-144v1362q-57 29 -133 43t-151 14q-33 0 -60.5 -18.5t-47 -59.5t-30 -108.5t-10.5 -167.5v-123h221v-96h-221v-846h-143v846h-158z " /> +<glyph unicode="&#xfb03;" horiz-adv-x="1683" d="M1350 1286q0 41 29.5 74t72.5 33q41 0 74 -33t33 -74q0 -43 -33 -72.5t-74 -29.5q-43 0 -72.5 29.5t-29.5 72.5zM1381 0v942h143v-942h-143zM661 846v76l158 18q0 115 7 197t19.5 138t28 92t29.5 58q39 57 96 79t119 22q8 0 28.5 -1t46 -4t52.5 -10.5t51 -19.5l-35 -121 q-6 0 -28.5 7t-50 16.5t-59.5 17.5t-56 8q-31 0 -51.5 -17.5t-32 -57t-16.5 -105t-5 -162.5v-135h221v-96h-221v-846h-143v846h-158zM51 846v76l158 18q0 115 7 197t19.5 138t28 92t29.5 58q39 57 96 79t119 22q8 0 28.5 -1t46 -4t52.5 -10.5t51 -19.5l-35 -121 q-6 0 -28.5 7t-50 16.5t-59.5 17.5t-56 8q-31 0 -51.5 -17.5t-32 -57t-16.5 -105t-5 -162.5v-135h221v-96h-221v-846h-143v846h-158z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="1708" d="M1393 0v1516h143v-1516h-143zM661 846v76l158 18q0 115 7 197t19.5 138t28 92t29.5 58q39 57 96 79t119 22q8 0 28.5 -1t46 -4t52.5 -10.5t51 -19.5l-35 -121q-6 0 -28.5 7t-50 16.5t-59.5 17.5t-56 8q-31 0 -51.5 -17.5t-32 -57t-16.5 -105t-5 -162.5v-135h221v-96h-221 v-846h-143v846h-158zM51 846v76l158 18q0 115 7 197t19.5 138t28 92t29.5 58q39 57 96 79t119 22q8 0 28.5 -1t46 -4t52.5 -10.5t51 -19.5l-35 -121q-6 0 -28.5 7t-50 16.5t-59.5 17.5t-56 8q-31 0 -51.5 -17.5t-32 -57t-16.5 -105t-5 -162.5v-135h221v-96h-221v-846h-143 v846h-158z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.ttf new file mode 100644 index 000000000000..e4146706d18f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.woff new file mode 100644 index 000000000000..09ed324db361 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/fonts/quattrocentosans-regular-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/background.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/background.png new file mode 100644 index 000000000000..e57dd78b70be Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/background.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/body-background.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/body-background.png new file mode 100644 index 000000000000..dbe1a7752643 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/body-background.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/bullet.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/bullet.png new file mode 100644 index 000000000000..732fa2f1865b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/bullet.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/hr.gif b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/hr.gif new file mode 100644 index 000000000000..a64b56c03bb4 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/hr.gif differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/octocat-logo.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/octocat-logo.svg new file mode 100644 index 000000000000..78471ae83741 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/images/octocat-logo.svg @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + id="Layer_1" + viewBox="0 0 35.999998 36.000002" + width="36" + height="36" + version="1.1" + sodipodi:docname="octocat-logo.svg" + inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> + <metadata + id="metadata17"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs15" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="986" + id="namedview13" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="7.9999999" + inkscape:cx="-10.44459" + inkscape:cy="22.061679" + inkscape:window-x="-11" + inkscape:window-y="-11" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" /> + <style + id="style3">.Round_x0020_Corners_x0020_2_x0020_pt{fill:#FFF;stroke:#000;stroke-miterlimit:10}.Live_x0020_Reflect_x0020_X{fill:none}.Bevel_x0020_Soft{fill:url(#SVGID_1_)}.Dusk{fill:#FFF}.Foliage_GS{fill:#FD0}.Pompadour_GS{fill:#44ade2}.Pompadour_GS,.st0{fill-rule:evenodd;clip-rule:evenodd}.st0{fill:#191717}</style> + <linearGradient + id="SVGID_1_" + gradientUnits="userSpaceOnUse" + x1="-216.625" + y1="-385.75" + x2="-215.918" + y2="-385.043"> + <stop + offset="0" + id="stop6" + stop-color="#dedfe3" /> + <stop + offset=".174" + id="stop8" + stop-color="#d8d9dd" /> + <stop + offset=".352" + id="stop10" + stop-color="#c9cacd" /> + <stop + offset=".532" + id="stop12" + stop-color="#b4b5b8" /> + <stop + offset=".714" + id="stop14" + stop-color="#989a9c" /> + <stop + offset=".895" + id="stop16" + stop-color="#797c7e" /> + <stop + offset="1" + id="stop18" + stop-color="#656b6c" /> + </linearGradient> + <path + style="fill:#231e1e;fill-opacity:0.2;stroke-width:0.809865" + d="M 18 0 A 18.000056 18.000669 0 0 0 0 18 A 18.000056 18.000669 0 0 0 18 36 A 18.000056 18.000669 0 0 0 36 18 A 18.000056 18.000669 0 0 0 18 0 z M 18 2.6542969 A 15.344311 15.344834 0 0 1 33.34375 18 A 15.344311 15.344834 0 0 1 33.275391 19.332031 C 32.516916 19.269784 31.250006 19.173828 30.369141 19.173828 C 30.002345 19.173828 29.487474 19.211973 29.003906 19.240234 C 29.136396 18.53009 29.210936 17.741989 29.210938 16.853516 A 6.7759857 6.8161667 0 0 0 27.431641 12.216797 C 27.535943 11.794914 28.165751 10.002117 27.222656 7.6835938 C 27.222656 7.6835938 27.131616 7.6572437 26.943359 7.6523438 C 26.378576 7.6376238 24.941822 7.8149574 22.505859 9.4746094 C 21.143368 9.1583804 19.677 8.9492188 18.210938 8.9492188 C 16.744145 8.9492188 15.277048 9.0554125 13.916016 9.4765625 C 10.667336 7.2636935 9.203125 7.6855469 9.203125 7.6855469 C 8.2600308 10.00407 8.7828545 11.794914 8.9921875 12.216797 C 7.8397593 13.481713 7.2109375 14.956875 7.2109375 16.853516 C 7.2109375 17.749113 7.287253 18.543958 7.421875 19.261719 C 6.7665871 19.218431 6.0514138 19.173828 5.5585938 19.173828 C 4.6865309 19.173828 3.4702374 19.269331 2.7246094 19.332031 A 15.344311 15.344834 0 0 1 2.65625 18 A 15.344311 15.344834 0 0 1 18 2.6542969 z M 5.5585938 19.640625 C 6.0798391 19.640625 6.8427542 19.689853 7.5292969 19.736328 C 7.5517558 19.830302 7.5690333 19.932552 7.59375 20.023438 C 6.889709 19.975122 6.0968717 19.925781 5.5585938 19.925781 C 4.7279419 19.925781 3.5908298 20.012069 2.8164062 20.076172 A 15.344311 15.344834 0 0 1 2.7734375 19.794922 C 3.535949 19.731328 4.7085974 19.640625 5.5585938 19.640625 z M 30.369141 19.640625 C 31.227754 19.640625 32.447334 19.73359 33.224609 19.796875 A 15.344311 15.344834 0 0 1 33.181641 20.078125 C 32.391381 20.014231 31.208932 19.925781 30.369141 19.925781 C 29.956167 19.925781 29.37691 19.968116 28.832031 20.001953 C 28.857004 19.910243 28.873836 19.80783 28.896484 19.712891 C 29.418753 19.681148 29.973493 19.640625 30.369141 19.640625 z M 5.5585938 20.394531 C 6.1376861 20.394531 7.0062594 20.445584 7.7480469 20.498047 C 8.9519568 24.076065 12.018089 25.061521 14.964844 25.390625 C 14.545447 25.812509 14.021542 26.549722 13.917969 27.708984 C 12.974875 28.1316 10.564741 28.868395 8.9921875 26.234375 C 8.9921875 26.234375 8.0491739 24.549013 6.3730469 24.443359 C 6.3730469 24.443359 4.6964831 24.44322 6.2675781 25.496094 C 6.2675781 25.496094 7.4212649 26.024315 8.1542969 28.027344 C 8.1542969 28.027344 9.2044478 31.39931 13.919922 30.345703 L 13.919922 32.775391 A 15.344311 15.344834 0 0 1 2.8867188 20.539062 C 3.6750481 20.474648 4.7595789 20.394531 5.5585938 20.394531 z M 30.369141 20.394531 C 31.178146 20.394531 32.305364 20.476631 33.111328 20.541016 A 15.344311 15.344834 0 0 1 22.611328 32.617188 L 22.611328 28.447266 C 22.611328 26.86612 22.088443 25.81196 21.458984 25.285156 C 24.408908 24.955826 27.476238 24.032852 28.677734 20.476562 C 29.274352 20.437755 29.914716 20.394531 30.369141 20.394531 z M 18.144531 26.724609 C 18.288441 26.724609 18.404297 26.902841 18.404297 27.125 L 18.404297 33.369141 A 9.9683741 15.388561 0 0 1 18.050781 33.388672 A 9.9683741 15.388561 0 0 1 17.882812 33.375 L 17.882812 27.125 C 17.882812 26.902841 18.000621 26.724609 18.144531 26.724609 z M 16.164062 27.585938 C 16.307972 27.585938 16.423828 27.766122 16.423828 27.988281 L 16.423828 33.316406 A 9.9683741 15.388561 0 0 1 15.904297 33.203125 L 15.904297 27.988281 C 15.904297 27.766122 16.020152 27.585938 16.164062 27.585938 z M 20.185547 27.585938 C 20.329457 27.585936 20.445312 27.766122 20.445312 27.988281 L 20.445312 33.173828 A 9.9683741 15.388561 0 0 1 19.925781 33.271484 L 19.925781 27.988281 C 19.925781 27.766122 20.041637 27.585938 20.185547 27.585938 z " + id="path57" /> +</svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/js/main.js b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/js/main.js new file mode 100644 index 000000000000..811bd2ea1364 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-leap-day-0.1.1/assets/js/main.js @@ -0,0 +1,33 @@ +var sectionHeight = function() { + var total = $(window).height(), + $section = $('section').css('height','auto'); + + if ($section.outerHeight(true) < total) { + var margin = $section.outerHeight(true) - $section.height(); + $section.height(total - margin - 20); + } else { + $section.css('height','auto'); + } +} + +$(window).resize(sectionHeight); + +$(function() { + $("section h1, section h2, section h3").each(function(){ + $("nav ul").append("<li class='tag-" + this.nodeName.toLowerCase() + "'><a href='#" + $(this).text().toLowerCase().replace(/ /g, '-').replace(/[^\w-]+/g,'') + "'>" + $(this).text() + "</a></li>"); + $(this).attr("id",$(this).text().toLowerCase().replace(/ /g, '-').replace(/[^\w-]+/g,'')); + $("nav ul li:first-child a").parent().addClass("active"); + }); + + $("nav ul li").on("click", "a", function(event) { + var position = $($(this).attr("href")).offset().top - 190; + $("html, body").animate({scrollTop: position}, 400); + $("nav ul li a").parent().removeClass("active"); + $(this).parent().addClass("active"); + event.preventDefault(); + }); + + sectionHeight(); + + $('img').on('load', sectionHeight); +}); diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/README.md new file mode 100644 index 000000000000..07b2f8c3c670 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Merlot theme + +[![Build Status](https://travis-ci.org/pages-themes/merlot.svg?branch=master)](https://travis-ci.org/pages-themes/merlot) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-merlot.svg)](https://badge.fury.io/rb/jekyll-theme-merlot) + +*Merlot is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/merlot), or even [use it today](#usage).* + +![Thumbnail of Merlot](thumbnail.png) + +## Usage + +To use the Merlot theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-merlot + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Merlot will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/merlot/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/merlot/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/merlot/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Merlot theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Merlot? We'd love your help. Merlot is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/merlot`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..ac6329021704 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_layouts/default.html @@ -0,0 +1,90 @@ +<!DOCTYPE html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset='utf-8'> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=640"> + + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}" media="screen"> + <link rel="stylesheet" href="{{ '/assets/css/mobile.css' | relative_url }}" media="handheld, only screen and (max-device-width:640px)"> + <link rel="stylesheet" href="{{ '/assets/css/non-screen.css' | relative_url }}" media="handheld, only screen and (max-device-width:640px)"> + + <script src="{{ '/assets/js/modernizr.js' | relative_url }}"></script> + <script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script> + <script src="{{ '/assets/js/headsmart.min.js' | relative_url }}"></script> + <script> + $(document).ready(function () { + $('#main_content').headsmart() + }) + </script> + +{% seo %} + </head> + + <body> + <a id="forkme_banner" href="{{ site.github.repository_url }}">View on GitHub</a> + <div class="shell"> + + <header> + <span class="ribbon-outer"> + <span class="ribbon-inner"> + <h1>{{ site.title | default: site.github.repository_name }}</h1> + <h2>{{ site.description | default: site.github.project_tagline }}</h2> + </span> + <span class="left-tail"></span> + <span class="right-tail"></span> + </span> + </header> + + {% if site.show_downloads %} + <section id="downloads"> + <span class="inner"> + <a href="{{ site.github.zip_url }}" class="zip"><em>download</em> .ZIP</a><a href="{{ site.github.tar_url }}" class="tgz"><em>download</em> .TGZ</a> + </span> + </section> + {% else %} + <div id="no-downloads"> + <span class="inner"> + </span> + </div> + {% endif %} + + + <span class="banner-fix"></span> + + + <section id="main_content"> + {{ content }} + </section> + + <footer> + <span class="ribbon-outer"> + <span class="ribbon-inner"> + {% if site.github.is_project_page %} + <p>this project by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a> can be found on <a href="{{ site.github.repository_url }}">GitHub</a></p> + {% endif %} + {% if site.github.is_user_page %} + <p>Projects by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a> can be found on <a href="{{ site.github.repository_url }}">GitHub</a></p> + {% endif %} + </span> + <span class="left-tail"></span> + <span class="right-tail"></span> + </span> + <p>Generated with <a href="https://pages.github.com">GitHub Pages</a> using Merlot</p> + <span class="octocat"></span> + </footer> + + </div> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_sass/jekyll-theme-merlot.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_sass/jekyll-theme-merlot.scss new file mode 100644 index 000000000000..f1d3ceaf7df3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_sass/jekyll-theme-merlot.scss @@ -0,0 +1,4 @@ +@import "screen"; +@import "rouge-base16-solarized"; +@import url("non-screen.css") handheld; +@import url("non-screen.css") only screen and (max-device-width:640px); diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_sass/rouge-base16-solarized.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_sass/rouge-base16-solarized.scss new file mode 100644 index 000000000000..009bb214ae99 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_sass/rouge-base16-solarized.scss @@ -0,0 +1,77 @@ +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight, .highlight .w { + color: #586e75; +} +.highlight .err { + color: #002b36; + background-color: #dc322f; +} +.highlight .c, .highlight .cd, .highlight .cm, .highlight .c1, .highlight .cs { + color: #657b83; +} +.highlight .cp { + color: #b58900; +} +.highlight .nt { + color: #b58900; +} +.highlight .o, .highlight .ow { + color: #93a1a1; +} +.highlight .p, .highlight .pi { + color: #93a1a1; +} +.highlight .gi { + color: #859900; +} +.highlight .gd { + color: #dc322f; +} +.highlight .gh { + color: #268bd2; + background-color: #002b36; + font-weight: bold; +} +.highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv { + color: #6c71c4; +} +.highlight .kc { + color: #cb4b16; +} +.highlight .kt { + color: #cb4b16; +} +.highlight .kd { + color: #cb4b16; +} +.highlight .s, .highlight .sb, .highlight .sc, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 { + color: #859900; +} +.highlight .sr { + color: #2aa198; +} +.highlight .si { + color: #d33682; +} +.highlight .se { + color: #d33682; +} +.highlight .nn { + color: #b58900; +} +.highlight .nc { + color: #b58900; +} +.highlight .no { + color: #b58900; +} +.highlight .na { + color: #268bd2; +} +.highlight .m, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mb, .highlight .mx { + color: #859900; +} +.highlight .ss { + color: #859900; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_sass/screen.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_sass/screen.scss new file mode 100644 index 000000000000..b9e53362f599 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/_sass/screen.scss @@ -0,0 +1,570 @@ +/* Generated by Font Squirrel (http://www.fontsquirrel.com) on February 9, 2012 */ + + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-regular-webfont.eot'); + src: url('../fonts/opensans-regular-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-regular-webfont.woff') format('woff'), + url('../fonts/opensans-regular-webfont.ttf') format('truetype'), + url('../fonts/opensans-regular-webfont.svg#OpenSansRegular') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-italic-webfont.eot'); + src: url('../fonts/opensans-italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-italic-webfont.woff') format('woff'), + url('../fonts/opensans-italic-webfont.ttf') format('truetype'), + url('../fonts/opensans-italic-webfont.svg#OpenSansItalic') format('svg'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-bold-webfont.eot'); + src: url('../fonts/opensans-bold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-bold-webfont.woff') format('woff'), + url('../fonts/opensans-bold-webfont.ttf') format('truetype'), + url('../fonts/opensans-bold-webfont.svg#OpenSansBold') format('svg'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-bolditalic-webfont.eot'); + src: url('../fonts/opensans-bolditalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-bolditalic-webfont.woff') format('woff'), + url('../fonts/opensans-bolditalic-webfont.ttf') format('truetype'), + url('../fonts/opensans-bolditalic-webfont.svg#OpenSansBoldItalic') format('svg'); + font-weight: bold; + font-style: italic; +} + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-extrabold-webfont.eot'); + src: url('../fonts/opensans-extrabold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-extrabold-webfont.woff') format('woff'), + url('../fonts/opensans-extrabold-webfont.ttf') format('truetype'), + url('../fonts/opensans-extrabold-webfont.svg#OpenSansExtrabold') format('svg'); + font-weight: 800; + font-style: normal; +} + +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +header, footer, section { + display: block; + position: relative; +} + +/* STYLES */ + +div.shell { + display: block; + width: 670px; + margin: 0 auto; +} + +a#forkme_banner { + position: absolute; + top: 0; + left: 0; + width: 138px; + height: 138px; + display: block; + background: transparent url(../images/fork-sprite.png) 0 0 no-repeat; + text-indent: -9000px; + z-index: 3; +} + +a#forkme_banner:hover { + background-position: 0 -138px; +} + +/* header */ + +header { + position: relative; + z-index: 2; + margin: 0 auto; + max-width: 600px; + top: 38px; +} + +header span.ribbon-inner { + position: relative; + display: block; + background-color: #cd596b; + border: 4px solid #7c334f; + padding: 2px; + z-index: 1; +} + +header span.left-tail, header span.right-tail { + position: relative; + display: block; + width: 56px; + height: 105px; + background: transparent url(../images/ribbon-tail-sprite.png) 0 0 no-repeat; + position: absolute; + bottom: -37px; + z-index: 0; +} + +header span.left-tail { + background-position: 0 0; + left: -31px; +} + +header span.right-tail { + background-position: -56px 0; + right: -31px; +} + +header h1 { + background-color: #7c334f; + font-size: 2.5em; + font-weight: 800; + font-style: normal; + text-transform: uppercase; + color: #ece4d8; + text-align: center; + line-height:1; + padding: 14px 20px 0; +} + +header h2 { + background-color: #7c334f; + font: bold italic .85em/1.5 Georgia, Times, “Times New Roman”, serif; + color: #e69b95; + padding-bottom: 14px; + margin-top: -3px; + text-align: center; +} + +section#downloads, +div#no-downloads { + position: relative; + display: block; + height: 197px; + width: 550px; + padding-bottom: 150px; + margin: -80px auto -150px; + z-index: 1; + background: transparent url(../images/bg-ramp.jpg) center 171px no-repeat; +} + +div#no-downloads span.inner { + display: block; + position: relative; + height: 197px; + width: 550px; + background: transparent url(../images/download-sprite.png) 0 0 no-repeat; +} + +section#downloads a { + display: block; + position: relative; + height: 67px; + width: 275px; + padding-top: 130px; + background: transparent url(../images/download-sprite.png) 0 0 no-repeat; + text-align: center; + line-height: 1; + color: #fff; + font-family: 'Open Sans', Myriad, Calibri, sans-serif; + font-weight: 800; + font-size: 1.3em; +} + +section#downloads a:hover { + text-decoration: none; +} + +section#downloads a em { + font: bold italic 12px/1 Georgia, Times, “Times New Roman”, serif; + color: #83b7da; + display: block; +} + +section#downloads a.zip { + float: left; + background-position: 0 0; +} + +section#downloads a.tgz { + float: right; + background-position: -275px 0; +} + +section#downloads a.zip:hover { + background-position: 0 -197px; +} + +section#downloads a.tgz:hover { + background-position: -275px -197px; +} + +span.banner-fix { + background: transparent url(../images/download-fallback-bg.png) center top no-repeat; + display: block; + height: 19px; + position: absolute; + width: 670px; + top: 19px; +} + +section#main_content { + z-index: 2; + padding: 20px 82px 0; + min-height:185px; +} + +/* footer */ + +footer { + background: transparent url(../images/footer-ramp.jpg) center -1px no-repeat; + padding-top: 104px; + margin: -94px auto 40px; + max-width: 560px; + text-align: center; +} + +footer span.ribbon-outer { + display: block; + position: relative; + border-bottom: 2px solid #bdb6ad; +} + +footer span.ribbon-inner { + position: relative; + display: block; + background-color: #cd596b; + border: 2px solid #7c334f; + padding: 1px; + z-index: 1; +} + +footer p { + font-family: 'Open Sans', Myriad, Calibri, sans-serif; + font-weight: bold; + font-size: .8em; + color: #8b786f; +} + +footer a { + color: #cd596b; +} + +footer span.ribbon-inner p { + background-color: #7c334f; + margin: 0; + color: #e69b95; + font: bold italic 12px/1 Georgia, Times, “Times New Roman”, serif; + padding-bottom:4px; +} + +footer span.ribbon-inner a { + position: relative; + bottom: -1px; + color: #7eb0d2; + font-family: 'Open Sans', Myriad, Calibri, sans-serif; + text-transform: uppercase; + font-style: normal; + font-weight: 800; + font-size: 1.2em; +} + +footer span.ribbon-inner a:hover { + color: #7eb0d2; +} + +footer span.left-tail, footer span.right-tail { + position: relative; + display: block; + width: 18px; + height: 29px; + background: transparent url(../images/small-ribbon-tail-sprite.png) 0 0 no-repeat; + position: absolute; + bottom: 5px; + z-index: 0; +} + +footer span.left-tail { + background-position: 0 0; + left: -11px; +} + +footer span.right-tail { + background-position: -18px 0; + right: -11px; +} + +footer span.octocat { + background: transparent url(../images/octocat.png) 0 0 no-repeat; + display: block; + width: 30px; + height: 30px; + margin: 0 auto; +} + +/* content */ + +body { + background: #ece4d8; + font: normal normal 15px/1.5 Georgia, Palatino,” Palatino Linotype”, Times, “Times New Roman”, serif; + color: #544943; + -webkit-font-smoothing: antialiased; +} + +a, a:hover { + color: #417090; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +h1,h2,h3,h4,h5,h6 { + font-family: 'Open Sans', Myriad, Calibri, sans-serif; + font-weight: bold; +} + +p { + margin: .7em 0; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +ol { + margin: .7em 0; + list-style-type: decimal; + padding-left: 1.35em; +} + +ul { + margin: .7em 0; + padding-left: 1.35em; +} + +ul li { + padding-left: 10px; + background: transparent url(../images/chevron.png) left 6px no-repeat; +} + +blockquote { + font-family: 'Open Sans', Myriad, Calibri, sans-serif; + margin: 20px 0; + color: #8b786f; + padding-left: 1.35em; + background: transparent url('../images/blockquote-gfx.png') 0 4px no-repeat; +} + +img { + -webkit-box-shadow: 0px 2px 0px #bdb6ad; + -moz-box-shadow: 0px 2px 0px #bdb6ad; + box-shadow: 0px 2px 0px #bdb6ad; + border: 2px solid #fff6e9; + max-width: 502px; +} + +hr { + border: none; + outline: none; + height: 18px; + background: transparent url('../images/hr.jpg') center center repeat-x; + margin: 0 0 20px; +} + +code { + background: #fff6e9; + font: normal normal .8em/1.7 "Lucida Sans Typewriter", "Lucida Console", Monaco, "Bitstream Vera Sans Mono", monospace; + padding: 0 5px 1px; +} + +pre { + margin: 10px 0 20px; + padding: .7em; + background: #fff6e9; + border-bottom: 2px solid #bdb6ad; + font: normal normal .9em/1.7 "Lucida Sans Typewriter", "Lucida Console", Monaco, "Bitstream Vera Sans Mono", monospace; + overflow: auto; +} + +pre code { + font: normal normal 1em/1.7 "Lucida Sans Typewriter", "Lucida Console", Monaco, "Bitstream Vera Sans Mono", monospace; + padding: 0; +} + +table { + background: #fff6e9; + display: table; + width: 100%; + border-collapse: separate; + border-bottom: 2px solid #bdb6ad; + margin: 10px 0; +} + +tr { + display: table-row; +} + +th { + display: table-cell; + padding: 2px 10px; + border: solid #ece4d8; + border-width: 0 2px 2px 0; + color: #cd596b; + font-family: 'Open Sans', Myriad, Calibri, sans-serif; + font-weight: bold; + font-size: .85em; +} + +td { + display: table-cell; + padding: 0 .7em; + border: solid #ece4d8; + border-width: 0 2px 2px 0; +} + +td:last-child, th:last-child { + border-right: none; +} + +tr:last-child td { + border-bottom: none; +} + +dl { + margin: .7em 0 20px; +} + +dt { + font-family: 'Open Sans', Myriad, Calibri, sans-serif; + font-weight: bold; +} + +dd { + padding-left: 1.35em; +} + +dd p:first-child { + margin-top: 0; +} + +/* Content based headers */ + +#main_content > .header-level-1:first-child, +#main_content > .header-level-2:first-child, +#main_content > .header-level-3:first-child, +#main_content > .header-level-4:first-child, +#main_content > .header-level-5:first-child, +#main_content > .header-level-6:first-child { + margin-top: 0; +} + +.header-level-1 { + font-size: 1.85em; + border-bottom: .2em double #d3ccc1; + color: #7c334f; + text-align: center; + font-style: italic; + margin: 1.1em 0 .38em; + line-height: 1.2; + padding-bottom: 10px +} + +.header-level-2 { + font-size: 1.58em; + color: #7c334f; + margin: .95em 0 .5em; + border-bottom: .1em solid #D3CCC1; + line-height: 1.2; + padding-bottom: 10px +} + +.header-level-3 { + margin: 20px 0 10px; + font-size: 1.45em; +} + +.header-level-4 { + margin: .6em 0; + font-size: 1.2em; + color: #cd596b; +} + +.header-level-5 { + margin: .7em 0; + font-size: 1em; + color: #8b786f; +} + +.header-level-6 { + margin: .8em 0; + font-size: .85em; + font-style: italic; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/css/mobile.css b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/css/mobile.css new file mode 100644 index 000000000000..c860c09f5282 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/css/mobile.css @@ -0,0 +1,510 @@ +/* Generated by Font Squirrel (http://www.fontsquirrel.com) on February 9, 2012 */ + + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-regular-webfont.eot'); + src: url('../fonts/opensans-regular-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-regular-webfont.woff') format('woff'), + url('../fonts/opensans-regular-webfont.ttf') format('truetype'), + url('../fonts/opensans-regular-webfont.svg#OpenSansRegular') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-italic-webfont.eot'); + src: url('../fonts/opensans-italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-italic-webfont.woff') format('woff'), + url('../fonts/opensans-italic-webfont.ttf') format('truetype'), + url('../fonts/opensans-italic-webfont.svg#OpenSansItalic') format('svg'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-bold-webfont.eot'); + src: url('../fonts/opensans-bold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-bold-webfont.woff') format('woff'), + url('../fonts/opensans-bold-webfont.ttf') format('truetype'), + url('../fonts/opensans-bold-webfont.svg#OpenSansBold') format('svg'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-bolditalic-webfont.eot'); + src: url('../fonts/opensans-bolditalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-bolditalic-webfont.woff') format('woff'), + url('../fonts/opensans-bolditalic-webfont.ttf') format('truetype'), + url('../fonts/opensans-bolditalic-webfont.svg#OpenSansBoldItalic') format('svg'); + font-weight: bold; + font-style: italic; +} + +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/opensans-extrabold-webfont.eot'); + src: url('../fonts/opensans-extrabold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/opensans-extrabold-webfont.woff') format('woff'), + url('../fonts/opensans-extrabold-webfont.ttf') format('truetype'), + url('../fonts/opensans-extrabold-webfont.svg#OpenSansExtrabold') format('svg'); + font-weight: bolder; + font-style: normal; +} + + +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +header, footer, section { + display: block; + position: relative; +} + +/* STYLES */ + +div.shell { + display: block; + width: 640px; + margin: 0 auto; +} + +a#forkme_banner { + display: none; +} + +/* header */ + +header { + position: relative; + z-index: 2; + margin: 0; + max-width: 640px; + top: 51px; +} + +header span.ribbon-inner { + position: relative; + display: block; + background-color: #cd596b; + border: 8px solid #7c334f; + padding: 6px; + z-index: 1; +} + +header span.left-tail, header span.right-tail { + position: relative; + display: block; + width: 19px; + height: 10px; + background: transparent url(../images/ribbon-tail-sprite-2x.png) 0 0 no-repeat; + position: absolute; + bottom: -10px; + z-index: 0; +} + +header span.left-tail { + background-position: 0 0; + left: 0; +} + +header span.right-tail { + background-position: -19px 0; + right: 0; +} + +header h1 { + background-color: #7c334f; + font-size: 2em; + font-weight: bolder; + font-style: normal; + text-transform: uppercase; + color: #ece4d8; + text-align: center; + line-height:1; + padding: 14px 20px 0; +} + +header h2 { + background-color: #7c334f; + font: bold italic .85em/1.5 Georgia, Times, “Times New Roman”, serif; + color: #e69b95; + padding-bottom: 14px; + margin-top: -3px; + text-align: center; +} + +section#downloads { + position: relative; + display: block; + height: 171px; + width: 602px; + padding-bottom: 150px; + margin: 51px auto -250px; + z-index: 1; + background: transparent url(../images/shield.png) center 0 no-repeat; +} + +section#downloads a { + display: none; +} + +span.banner-fix { + background: transparent url(../images/shield-fallback.png) center top no-repeat; + display: block; + height: 31px; + position: absolute; + width: 640px; + top: 20px; + +} + +section#main_content { + z-index: 2; + padding: 20px 40px 0; + min-height:185px; +} + +/* footer */ + +footer { + background: none; + padding-top: 104px; + margin: -94px auto 40px; + max-width:640px; + text-align: center; +} + +footer span.ribbon-outer { + display: block; + position: relative; + border-bottom: 2px solid #bdb6ad; +} + +footer span.ribbon-inner { + position: relative; + display: block; + background-color: #cd596b; + border: 8px solid #7c334f; + padding: 6px; + z-index: 1; +} + +footer p { + font-family: 'Open Sans', sans-serif; + font-weight: bold; + font-size: .6em; + color: #8b786f; +} + +footer a { + color: #cd596b; +} + +footer span.ribbon-inner p { + background-color: #7c334f; + margin: 0; + color: #e69b95; + font: bold italic 22px/1 Georgia, Times, “Times New Roman”, serif; + height: auto; + line-height: 1.1; + padding: 20px 0px 10px; +} + +footer span.ribbon-inner a { + display: block; + position: relative; + bottom: 0; + color: #7eb0d2; + font-family: 'Open Sans', sans-serif; + text-transform: uppercase; + font-style: normal; + font-weight: bolder; + font-size: 38px; + padding-bottom: 10px; +} + +footer span.ribbon-inner a:hover { + color: #7eb0d2; +} + +footer span.left-tail, footer span.right-tail { + position: relative; + display: block; + width: 23px; + height: 126px; + background: transparent url(../images/small-ribbon-tail-sprite-2x.png) 0 0 no-repeat; + position: absolute; + top: -126px; + z-index: 0; +} + +footer span.left-tail { + background-position: 0 0; + left: 0; +} + +footer span.right-tail { + background-position: -23px 0; + right: 0; +} + +footer span.octocat { + background: transparent url(../images/octocat-2x.png) 0 0 no-repeat; + display: block; + width: 60px; + height: 60px; + margin: 20px auto 0;} + +/* content */ + +body { + background: #ece4d8; + font: normal normal 30px/1.5 Georgia, Palatino,” Palatino Linotype”, Times, “Times New Roman”, serif; + color: #544943; + -webkit-font-smoothing: antialiased; +} + +a, a:hover { + color: #417090; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +h1,h2,h3,h4,h5,h6 { + font-family: 'Open Sans', sans-serif; + font-weight: bold; +} + +p { + margin: .7em 0 0; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +ol { + margin: .7em 0; + list-style-type: decimal; + padding-left: 1.35em; +} + +ul { + margin: .7em 0; + padding-left: 1.35em; +} + +ul li { + padding-left: 20px; + background: transparent url(../images/chevron-2x.png) left 15px no-repeat; +} + +blockquote { + font-family: 'Open Sans', sans-serif; + margin: 20px 0; + color: #8b786f; + padding-left: 1.35em; + background: transparent url('../images/blockquote-gfx-2x.png') 0 8px no-repeat; +} + +img { + -webkit-box-shadow: 0px 4px 0px #bdb6ad; + -moz-box-shadow: 0px 4px 0px #bdb6ad; + box-shadow: 0px 4px 0px #bdb6ad; + border: 4px solid #fff6e9; + max-width: 556px; +} + +hr { + border: none; + outline: none; + height: 42px; + background: transparent url('../images/hr-2x.jpg') center center repeat-x; + margin: 0 0 20px; +} + +code { + background: #fff6e9; + font: normal normal .9em/1.7 "Lucida Sans Typewriter", "Lucida Console", Monaco, "Bitstream Vera Sans Mono", monospace; + padding: 0 5px 1px; +} + +pre { + margin: 10px 0 20px; + padding: .7em; + background: #fff6e9; + border-bottom: 4px solid #bdb6ad; + font: normal normal .9em/1.7 "Lucida Sans Typewriter", "Lucida Console", Monaco, "Bitstream Vera Sans Mono", monospace; + overflow: auto; +} + +table { + background: #fff6e9; + display: table; + width: 100%; + border-collapse: separate; + border-bottom: 4px solid #bdb6ad; + margin: 10px 0; +} + +tr { + display: table-row; +} + +th { + display: table-cell; + padding: 2px 10px; + border: solid #ece4d8; + border-width: 0 4px 4px 0; + color: #cd596b; + font-family: 'Open Sans', sans-serif; + font-weight: bold; + font-size: .85em; +} + +td { + display: table-cell; + padding: 0 .7em; + border: solid #ece4d8; + border-width: 0 4px 4px 0; +} + +td:last-child, th:last-child { + border-right: none; +} + +tr:last-child td { + border-bottom: none; +} + +dl { + margin: .7em 0 20px; +} + +dt { + font-family: 'Open Sans', sans-serif; + font-weight: bold; +} + +dd { + padding-left: 1.35em; +} + +dd p:first-child { + margin-top: 0; +} + +/* Content based headers */ + +#main_content > .header-level-1:first-child, +#main_content > .header-level-2:first-child, +#main_content > .header-level-3:first-child, +#main_content > .header-level-4:first-child, +#main_content > .header-level-5:first-child, +#main_content > .header-level-6:first-child { + margin-top: 0; +} + +.header-level-1 { + font-size: 1.85em; + border-bottom: .2em double #d3ccc1; + color: #7c334f; + text-align: center; + font-style: italic; + margin: 1.1em 0 .38em; + line-height: 1.2; + padding-bottom: 10px +} + +.header-level-2 { + font-size: 1.58em; + color: #7c334f; + margin: .95em 0 .5em; + border-bottom: .1em solid #D3CCC1; + line-height: 1.2; + padding-bottom: 10px +} + +.header-level-3 { + margin: 20px 0 10px; + font-size: 1.45em; +} + +.header-level-4 { + margin: .6em 0; + font-size: 1.2em; + color: #cd596b; +} + +.header-level-5 { + margin: .7em 0; + font-size: 1em; + color: #8b786f; +} + +.header-level-6 { + margin: .8em 0; + font-size: .85em; + font-style: italic; +} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/css/non-screen.css b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/css/non-screen.css new file mode 100644 index 000000000000..eea5ecddbc76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/css/non-screen.css @@ -0,0 +1,154 @@ +a#forkme_banner { + display: none; +} + +div.shell { + width: 640px; +} + + +header { + max-width:640px; + margin: 0; + top: 51px; +} + +header span.ribbon-inner { + border: 8px solid #7c334f; + padding: 6px; +} + +header span.left-tail, header span.right-tail { + width: 19px; + height: 10px; + background: transparent url(../images/ribbon-tail-sprite-2x.png) 0 0 no-repeat; + bottom: -10px; +} + +header span.left-tail { + left: 0; +} + +header span.right-tail { + background-position: -19px 0; + right: 0; +} + +header h1 { + font-size: 2em; +} + +section#downloads { + height: 171px; + width: 602px; + margin: 51px auto -250px; + background: transparent url(../images/shield.png) center 0 no-repeat; +} + +section#downloads a { + display: none; +} + +span.banner-fix { + background: transparent url(../images/shield-fallback.png) center top no-repeat; + height: 31px; + width: 640px; + top: 20px; +} + +section#main_content { + padding: 20px 40px 0; +} + +footer { + max-width:640px; + background: none; +} + +footer span.left-tail, footer span.right-tail { + width: 23px; + height: 126px; + background: transparent url(../images/small-ribbon-tail-sprite-2x.png) 0 0 no-repeat; + top: -126px; +} + +footer span.left-tail { + left: 0; +} + +footer span.right-tail { + background-position: -23px 0; + right: 0; +} + +footer p { + font-size: .6em; +} + +footer span.ribbon-inner { + border: 8px solid #7c334f; + padding: 6px; +} + +footer span.ribbon-inner p { + font-size: 22px; + height: auto; + line-height: 1.1; + padding: 20px 0px 10px; +} + +footer span.ribbon-inner a { + font-size: 38px; + display: block; + bottom: 0; + padding-bottom: 10px; +} + +footer span.octocat { + background: transparent url(../images/octocat-2x.png) 0 0 no-repeat; + width: 60px; + height: 60px; + margin: 20px auto 0; +} + +body { + font: normal normal 30px/1.5 Georgia, Palatino,” Palatino Linotype”, Times, “Times New Roman”, serif; +} + +ul li { + padding-left: 20px; + background: transparent url(../images/chevron-2x.png) left 15px no-repeat; +} + +table { + border-bottom: 4px solid #bdb6ad; +} + +th { + border-width: 0 4px 4px 0; +} + +td { + border-width: 0 4px 4px 0; +} + +pre { + border-bottom: 4px solid #bdb6ad; +} + +img { + -webkit-box-shadow: 0px 4px 0px #bdb6ad; + -moz-box-shadow: 0px 4px 0px #bdb6ad; + box-shadow: 0px 4px 0px #bdb6ad; + border: 4px solid #fff6e9; + max-width: 556px; +} + +blockquote { + background: transparent url('../images/blockquote-gfx-2x.png') 0 8px no-repeat; +} + +hr { + height: 42px; + background: transparent url('../images/hr-2x.jpg') center center repeat-x; +} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..89562e7b7136 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import 'jekyll-theme-merlot'; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.eot new file mode 100644 index 000000000000..b5bad08afe4f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.svg new file mode 100644 index 000000000000..1557f6807473 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.svg @@ -0,0 +1,251 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansBold" horiz-adv-x="1169" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="586" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM121 1462h346l-51 -977h-244z" /> +<glyph unicode="&#x22;" horiz-adv-x="967" d="M133 1462h279l-41 -528h-197zM555 1462h279l-41 -528h-197z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M45 406v206h277l47 232h-252v209h289l77 407h219l-77 -407h198l78 407h215l-78 -407h240v-209h-279l-47 -232h258v-206h-297l-77 -406h-220l78 406h-194l-76 -406h-215l74 406h-238zM539 612h196l47 232h-196z" /> +<glyph unicode="$" d="M88 1049q0 145 113.5 238.5t316.5 113.5v153h137v-149q229 -10 414 -92l-94 -234q-156 64 -320 78v-295q195 -75 277.5 -130t121 -121t38.5 -154q0 -159 -115 -255.5t-322 -115.5v-205h-137v201q-244 5 -428 86v264q87 -43 209.5 -76t218.5 -39v310l-67 26 q-198 78 -280.5 169.5t-82.5 226.5zM389 1049q0 -44 30.5 -72.5t98.5 -58.5v235q-129 -19 -129 -104zM655 324q136 23 136 118q0 42 -34 71t-102 60v-249z" /> +<glyph unicode="%" horiz-adv-x="1845" d="M63 1026q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5q0 -230 -89 -345.5t-261 -115.5q-165 0 -255 118.5t-90 342.5zM315 1024q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5zM395 0l811 1462h240l-811 -1462h-240z M1087 442q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5q0 -229 -89 -344.5t-261 -115.5q-165 0 -255 118.5t-90 341.5zM1339 440q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5z" /> +<glyph unicode="&#x26;" horiz-adv-x="1536" d="M82 395q0 137 60.5 233.5t207.5 180.5q-75 86 -109 164.5t-34 171.5q0 152 116.5 245t311.5 93q186 0 297.5 -86.5t111.5 -231.5q0 -119 -69 -217.5t-223 -187.5l284 -277q71 117 123 301h318q-36 -135 -99 -263.5t-143 -227.5l301 -293h-377l-115 113 q-191 -133 -432 -133q-244 0 -387 112t-143 303zM403 424q0 -86 64.5 -137t165.5 -51q126 0 227 61l-332 330q-58 -44 -91.5 -92t-33.5 -111zM489 1124q0 -88 95 -194q86 48 132 94.5t46 108.5q0 53 -36 83.5t-93 30.5q-67 0 -105.5 -32t-38.5 -91z" /> +<glyph unicode="'" horiz-adv-x="545" d="M133 1462h279l-41 -528h-197z" /> +<glyph unicode="(" horiz-adv-x="694" d="M82 561q0 265 77.5 496t223.5 405h250q-141 -193 -213 -424t-72 -475q0 -245 73.5 -473.5t209.5 -413.5h-248q-147 170 -224 397t-77 488z" /> +<glyph unicode=")" horiz-adv-x="694" d="M61 1462h250q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-248q135 184 209 412.5t74 474.5q0 244 -72 475t-213 424z" /> +<glyph unicode="*" horiz-adv-x="1116" d="M63 1042l39 250l365 -104l-41 368h262l-41 -368l373 104l33 -252l-340 -24l223 -297l-227 -121l-156 313l-137 -311l-236 119l221 297z" /> +<glyph unicode="+" d="M88 612v219h387v390h219v-390h387v-219h-387v-385h-219v385h-387z" /> +<glyph unicode="," horiz-adv-x="594" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220z" /> +<glyph unicode="-" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="." horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" /> +<glyph unicode="/" horiz-adv-x="846" d="M14 0l545 1462h277l-545 -1462h-277z" /> +<glyph unicode="0" d="M74 731q0 387 125 570.5t385 183.5q253 0 382.5 -192t129.5 -562q0 -383 -125.5 -567t-386.5 -184q-253 0 -381.5 190t-128.5 561zM381 731q0 -269 46.5 -385.5t156.5 -116.5q108 0 156 118t48 384q0 269 -48.5 386.5t-155.5 117.5q-109 0 -156 -117.5t-47 -386.5z" /> +<glyph unicode="1" d="M121 1087l471 375h254v-1462h-309v846l3 139l5 152q-77 -77 -107 -101l-168 -135z" /> +<glyph unicode="2" d="M78 1274q108 92 179 130t155 58.5t188 20.5q137 0 242 -50t163 -140t58 -206q0 -101 -35.5 -189.5t-110 -181.5t-262.5 -265l-188 -177v-14h637v-260h-1022v215l367 371q163 167 213 231.5t72 119.5t22 114q0 88 -48.5 131t-129.5 43q-85 0 -165 -39t-167 -111z" /> +<glyph unicode="3" d="M78 59v263q85 -43 187 -70t202 -27q153 0 226 52t73 167q0 103 -84 146t-268 43h-111v237h113q170 0 248.5 44.5t78.5 152.5q0 166 -208 166q-72 0 -146.5 -24t-165.5 -83l-143 213q200 144 477 144q227 0 358.5 -92t131.5 -256q0 -137 -83 -233t-233 -132v-6 q177 -22 268 -107.5t91 -230.5q0 -211 -153 -328.5t-437 -117.5q-238 0 -422 79z" /> +<glyph unicode="4" d="M35 303v215l641 944h285v-919h176v-240h-176v-303h-302v303h-624zM307 543h352v248q0 62 5 180t8 137h-8q-37 -82 -89 -160z" /> +<glyph unicode="5" d="M100 59v267q79 -42 184 -68.5t199 -26.5q283 0 283 232q0 221 -293 221q-53 0 -117 -10.5t-104 -22.5l-123 66l55 745h793v-262h-522l-27 -287l35 7q61 14 151 14q212 0 337.5 -119t125.5 -326q0 -245 -151 -377t-432 -132q-244 0 -394 79z" /> +<glyph unicode="6" d="M72 621q0 434 183.5 646t549.5 212q125 0 196 -15v-247q-89 20 -176 20q-159 0 -259.5 -48t-150.5 -142t-59 -267h13q99 170 317 170q196 0 307 -123t111 -340q0 -234 -132 -370.5t-366 -136.5q-162 0 -282.5 75t-186 219t-65.5 347zM379 510q0 -119 62.5 -201t158.5 -82 q99 0 152 66.5t53 189.5q0 107 -49.5 168.5t-149.5 61.5q-94 0 -160.5 -61t-66.5 -142z" /> +<glyph unicode="7" d="M55 1200v260h1049v-194l-553 -1266h-324l549 1200h-721z" /> +<glyph unicode="8" d="M72 371q0 125 66.5 222t213.5 171q-125 79 -180 169t-55 197q0 157 130 254t339 97q210 0 338.5 -95.5t128.5 -257.5q0 -112 -62 -199.5t-200 -156.5q164 -88 235.5 -183.5t71.5 -209.5q0 -180 -141 -289.5t-371 -109.5q-240 0 -377 102t-137 289zM358 389q0 -86 60 -134 t164 -48q115 0 172 49.5t57 130.5q0 67 -56.5 125.5t-183.5 124.5q-213 -98 -213 -248zM408 1106q0 -60 38.5 -107.5t139.5 -97.5q98 46 137 94t39 111q0 69 -50 109t-128 40q-79 0 -127.5 -40.5t-48.5 -108.5z" /> +<glyph unicode="9" d="M66 971q0 235 133.5 371.5t363.5 136.5q162 0 283.5 -76t186.5 -220.5t65 -344.5q0 -432 -182 -645t-551 -213q-130 0 -197 14v248q84 -21 176 -21q155 0 255 45.5t153 143t61 268.5h-12q-58 -94 -134 -132t-190 -38q-191 0 -301 122.5t-110 340.5zM365 975 q0 -106 49 -168t149 -62q94 0 161 61.5t67 141.5q0 119 -62.5 201t-159.5 82q-96 0 -150 -66t-54 -190z" /> +<glyph unicode=":" horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" /> +<glyph unicode=";" horiz-adv-x="594" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" /> +<glyph unicode="&#x3c;" d="M88 641v143l993 496v-240l-684 -317l684 -281v-239z" /> +<glyph unicode="=" d="M88 418v219h993v-219h-993zM88 805v219h993v-219h-993z" /> +<glyph unicode="&#x3e;" d="M88 203v239l684 281l-684 317v240l993 -496v-143z" /> +<glyph unicode="?" horiz-adv-x="977" d="M6 1358q223 125 473 125q206 0 327.5 -99t121.5 -264q0 -110 -50 -190t-190 -180q-96 -71 -121.5 -108t-25.5 -97v-60h-265v74q0 96 41 167t150 151q105 75 138.5 122t33.5 105q0 65 -48 99t-134 34q-150 0 -342 -98zM244 143q0 84 45 127t131 43q83 0 128.5 -44 t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" /> +<glyph unicode="@" horiz-adv-x="1837" d="M102 602q0 247 108.5 448.5t309 316t461.5 114.5q220 0 393 -90t267 -256t94 -383q0 -144 -46 -263.5t-130 -187.5t-195 -68q-74 0 -131 35.5t-82 93.5h-16q-108 -129 -275 -129q-177 0 -279 106.5t-102 291.5q0 211 134 340t350 129q86 0 189.5 -16.5t170.5 -39.5 l-23 -489q0 -139 76 -139q64 0 102 93.5t38 244.5q0 161 -67 284.5t-188.5 188.5t-277.5 65q-202 0 -351 -83t-228.5 -239.5t-79.5 -361.5q0 -276 147.5 -423.5t427.5 -147.5q106 0 233 23.5t250 68.5v-192q-214 -91 -475 -91q-380 0 -592.5 200t-212.5 556zM711 627 q0 -211 172 -211q90 0 137 63.5t57 206.5l13 221q-51 11 -115 11q-125 0 -194.5 -78t-69.5 -213z" /> +<glyph unicode="A" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633z" /> +<glyph unicode="B" horiz-adv-x="1376" d="M184 0v1462h455q311 0 451.5 -88.5t140.5 -281.5q0 -131 -61.5 -215t-163.5 -101v-10q139 -31 200.5 -116t61.5 -226q0 -200 -144.5 -312t-392.5 -112h-547zM494 256h202q128 0 189 49t61 150q0 182 -260 182h-192v-381zM494 883h180q126 0 182.5 39t56.5 129 q0 84 -61.5 120.5t-194.5 36.5h-163v-325z" /> +<glyph unicode="C" horiz-adv-x="1305" d="M119 729q0 228 83 399.5t238.5 263t364.5 91.5q213 0 428 -103l-100 -252q-82 39 -165 68t-163 29q-175 0 -271 -131.5t-96 -366.5q0 -489 367 -489q154 0 373 77v-260q-180 -75 -402 -75q-319 0 -488 193.5t-169 555.5z" /> +<glyph unicode="D" horiz-adv-x="1516" d="M184 0v1462h459q358 0 556 -189t198 -528q0 -361 -205.5 -553t-593.5 -192h-414zM494 256h133q448 0 448 481q0 471 -416 471h-165v-952z" /> +<glyph unicode="E" horiz-adv-x="1147" d="M184 0v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256h-842z" /> +<glyph unicode="F" horiz-adv-x="1124" d="M184 0v1462h838v-254h-533v-377h496v-253h-496v-578h-305z" /> +<glyph unicode="G" horiz-adv-x="1483" d="M119 733q0 354 202.5 552t561.5 198q225 0 434 -90l-103 -248q-160 80 -333 80q-201 0 -322 -135t-121 -363q0 -238 97.5 -363.5t283.5 -125.5q97 0 197 20v305h-277v258h580v-758q-141 -46 -265.5 -64.5t-254.5 -18.5q-331 0 -505.5 194.5t-174.5 558.5z" /> +<glyph unicode="H" horiz-adv-x="1567" d="M184 0v1462h310v-573h579v573h309v-1462h-309v631h-579v-631h-310z" /> +<glyph unicode="I" horiz-adv-x="678" d="M184 0v1462h310v-1462h-310z" /> +<glyph unicode="J" horiz-adv-x="678" d="M-152 -150q80 -20 146 -20q102 0 146 63.5t44 198.5v1370h310v-1368q0 -256 -117 -390t-346 -134q-105 0 -183 22v258z" /> +<glyph unicode="K" horiz-adv-x="1360" d="M184 0v1462h310v-669l122 172l396 497h344l-510 -647l514 -815h-352l-383 616l-131 -94v-522h-310z" /> +<glyph unicode="L" horiz-adv-x="1157" d="M184 0v1462h310v-1206h593v-256h-903z" /> +<glyph unicode="M" horiz-adv-x="1931" d="M184 0v1462h422l346 -1118h6l367 1118h422v-1462h-289v692q0 49 1.5 113t13.5 340h-9l-377 -1145h-284l-352 1147h-9q19 -350 19 -467v-680h-277z" /> +<glyph unicode="N" horiz-adv-x="1665" d="M184 0v1462h391l635 -1095h7q-15 285 -15 403v692h279v-1462h-394l-636 1106h-9q19 -293 19 -418v-688h-277z" /> +<glyph unicode="O" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -363 -180 -558t-516 -195t-516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" /> +<glyph unicode="P" horiz-adv-x="1286" d="M184 0v1462h467q266 0 404.5 -114.5t138.5 -341.5q0 -236 -147.5 -361t-419.5 -125h-133v-520h-310zM494 774h102q143 0 214 56.5t71 164.5q0 109 -59.5 161t-186.5 52h-141v-434z" /> +<glyph unicode="Q" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -258 -91.5 -432.5t-268.5 -255.5l352 -393h-397l-268 328h-23q-336 0 -516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" /> +<glyph unicode="R" horiz-adv-x="1352" d="M184 0v1462h426q298 0 441 -108.5t143 -329.5q0 -129 -71 -229.5t-201 -157.5q330 -493 430 -637h-344l-349 561h-165v-561h-310zM494 813h100q147 0 217 49t70 154q0 104 -71.5 148t-221.5 44h-94v-395z" /> +<glyph unicode="S" horiz-adv-x="1128" d="M94 68v288q148 -66 250.5 -93t187.5 -27q102 0 156.5 39t54.5 116q0 43 -24 76.5t-70.5 64.5t-189.5 99q-134 63 -201 121t-107 135t-40 180q0 194 131.5 305t363.5 111q114 0 217.5 -27t216.5 -76l-100 -241q-117 48 -193.5 67t-150.5 19q-88 0 -135 -41t-47 -107 q0 -41 19 -71.5t60.5 -59t196.5 -102.5q205 -98 281 -196.5t76 -241.5q0 -198 -142.5 -312t-396.5 -114q-234 0 -414 88z" /> +<glyph unicode="T" horiz-adv-x="1186" d="M41 1204v258h1104v-258h-397v-1204h-310v1204h-397z" /> +<glyph unicode="U" horiz-adv-x="1548" d="M174 520v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5z" /> +<glyph unicode="V" horiz-adv-x="1331" d="M0 1462h313l275 -870q23 -77 47.5 -179.5t30.5 -142.5q11 92 75 322l277 870h313l-497 -1462h-338z" /> +<glyph unicode="W" horiz-adv-x="1980" d="M0 1462h305l187 -798q49 -221 71 -383q6 57 27.5 176.5t40.5 185.5l213 819h293l213 -819q14 -55 35 -168t32 -194q10 78 32 194.5t40 188.5l186 798h305l-372 -1462h-353l-198 768q-11 41 -37.5 169.5t-30.5 172.5q-6 -54 -30 -173.5t-37 -170.5l-197 -766h-352z" /> +<glyph unicode="X" horiz-adv-x="1366" d="M0 0l485 754l-454 708h342l315 -526l309 526h334l-459 -725l494 -737h-354l-340 553l-340 -553h-332z" /> +<glyph unicode="Y" horiz-adv-x="1278" d="M0 1462h336l303 -602l305 602h334l-485 -893v-569h-308v559z" /> +<glyph unicode="Z" horiz-adv-x="1186" d="M49 0v201l701 1005h-682v256h1050v-200l-700 -1006h719v-256h-1088z" /> +<glyph unicode="[" horiz-adv-x="678" d="M143 -324v1786h484v-211h-224v-1364h224v-211h-484z" /> +<glyph unicode="\" horiz-adv-x="846" d="M12 1462h277l545 -1462h-277z" /> +<glyph unicode="]" horiz-adv-x="678" d="M51 -113h223v1364h-223v211h484v-1786h-484v211z" /> +<glyph unicode="^" horiz-adv-x="1090" d="M8 520l438 950h144l495 -950h-239l-322 643l-280 -643h-236z" /> +<glyph unicode="_" horiz-adv-x="842" d="M-4 -184h850v-140h-850v140z" /> +<glyph unicode="`" horiz-adv-x="1243" d="M332 1548v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="a" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134z" /> +<glyph unicode="b" horiz-adv-x="1296" d="M160 0v1556h305v-362q0 -69 -12 -221h12q107 166 317 166q198 0 310 -154.5t112 -423.5q0 -277 -115.5 -429t-314.5 -152q-197 0 -309 143h-21l-51 -123h-233zM465 563q0 -180 53.5 -258t169.5 -78q94 0 149.5 86.5t55.5 251.5t-56 247.5t-153 82.5q-113 0 -165 -69.5 t-54 -229.5v-33z" /> +<glyph unicode="c" horiz-adv-x="1053" d="M92 553q0 285 142 435.5t407 150.5q194 0 348 -76l-90 -236q-72 29 -134 47.5t-124 18.5q-238 0 -238 -338q0 -328 238 -328q88 0 163 23.5t150 73.5v-261q-74 -47 -149.5 -65t-190.5 -18q-522 0 -522 573z" /> +<glyph unicode="d" horiz-adv-x="1296" d="M92 557q0 275 114.5 428.5t315.5 153.5q211 0 322 -164h10q-23 125 -23 223v358h306v-1556h-234l-59 145h-13q-104 -165 -317 -165q-197 0 -309.5 153t-112.5 424zM401 553q0 -165 57 -247.5t163 -82.5q117 0 171.5 68t59.5 231v33q0 180 -55.5 258t-180.5 78 q-102 0 -158.5 -86.5t-56.5 -251.5z" /> +<glyph unicode="e" horiz-adv-x="1210" d="M92 551q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5q-270 0 -422 149t-152 422zM408 686h428q-2 113 -59 174.5t-154 61.5t-152 -61.5t-63 -174.5z" /> +<glyph unicode="f" horiz-adv-x="793" d="M41 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229h-264v-889h-305v889h-168z" /> +<glyph unicode="g" horiz-adv-x="1157" d="M6 -182q0 101 63 169t185 97q-47 20 -82 65.5t-35 96.5q0 64 37 106.5t107 83.5q-88 38 -139.5 122t-51.5 198q0 183 119 283t340 100q47 0 111.5 -8.5t82.5 -12.5h390v-155l-175 -45q48 -75 48 -168q0 -180 -125.5 -280.5t-348.5 -100.5l-55 3l-45 5q-47 -36 -47 -80 q0 -66 168 -66h190q184 0 280.5 -79t96.5 -232q0 -196 -163.5 -304t-469.5 -108q-234 0 -357.5 81.5t-123.5 228.5zM270 -158q0 -63 60.5 -99t169.5 -36q164 0 257 45t93 123q0 63 -55 87t-170 24h-158q-84 0 -140.5 -39.5t-56.5 -104.5zM381 752q0 -91 41.5 -144t126.5 -53 q86 0 126 53t40 144q0 202 -166 202q-168 0 -168 -202z" /> +<glyph unicode="h" horiz-adv-x="1346" d="M160 0v1556h305v-317q0 -37 -7 -174l-7 -90h16q102 164 324 164q197 0 299 -106t102 -304v-729h-305v653q0 242 -180 242q-128 0 -185 -87t-57 -282v-526h-305z" /> +<glyph unicode="i" horiz-adv-x="625" d="M147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150zM160 0v1118h305v-1118h-305z" /> +<glyph unicode="j" horiz-adv-x="625" d="M-131 -227q70 -19 143 -19q77 0 112.5 43t35.5 127v1194h305v-1239q0 -178 -103 -274.5t-292 -96.5q-117 0 -201 25v240zM147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150z" /> +<glyph unicode="k" horiz-adv-x="1270" d="M160 0v1556h305v-694l-16 -254h4l133 170l313 340h344l-444 -485l471 -633h-352l-322 453l-131 -105v-348h-305z" /> +<glyph unicode="l" horiz-adv-x="625" d="M160 0v1556h305v-1556h-305z" /> +<glyph unicode="m" horiz-adv-x="2011" d="M160 0v1118h233l41 -143h17q45 77 130 120.5t195 43.5q251 0 340 -164h27q45 78 132.5 121t197.5 43q190 0 287.5 -97.5t97.5 -312.5v-729h-306v653q0 121 -40.5 181.5t-127.5 60.5q-112 0 -167.5 -80t-55.5 -254v-561h-305v653q0 121 -40.5 181.5t-127.5 60.5 q-117 0 -170 -86t-53 -283v-526h-305z" /> +<glyph unicode="n" horiz-adv-x="1346" d="M160 0v1118h233l41 -143h17q51 81 140.5 122.5t203.5 41.5q195 0 296 -105.5t101 -304.5v-729h-305v653q0 121 -43 181.5t-137 60.5q-128 0 -185 -85.5t-57 -283.5v-526h-305z" /> +<glyph unicode="o" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5z" /> +<glyph unicode="p" horiz-adv-x="1296" d="M160 -492v1610h248l43 -145h14q107 166 317 166q198 0 310 -153t112 -425q0 -179 -52.5 -311t-149.5 -201t-228 -69q-197 0 -309 143h-16q16 -140 16 -162v-453h-305zM465 563q0 -180 53.5 -258t169.5 -78q205 0 205 338q0 165 -50.5 247.5t-158.5 82.5 q-113 0 -165 -69.5t-54 -229.5v-33z" /> +<glyph unicode="q" horiz-adv-x="1296" d="M92 557q0 274 114.5 428t313.5 154q106 0 185 -40t139 -124h8l27 143h258v-1610h-306v469q0 61 13 168h-13q-49 -81 -130 -123t-187 -42q-198 0 -310 152.5t-112 424.5zM403 553q0 -168 53.5 -251t166.5 -83q116 0 170 66.5t59 232.5v37q0 180 -55.5 258t-178.5 78 q-215 0 -215 -338z" /> +<glyph unicode="r" horiz-adv-x="930" d="M160 0v1118h231l45 -188h15q52 94 140.5 151.5t192.5 57.5q62 0 103 -9l-23 -286q-37 10 -90 10q-146 0 -227.5 -75t-81.5 -210v-569h-305z" /> +<glyph unicode="s" horiz-adv-x="1018" d="M92 827q0 149 115.5 230.5t327.5 81.5q202 0 393 -88l-92 -220q-84 36 -157 59t-149 23q-135 0 -135 -73q0 -41 43.5 -71t190.5 -89q131 -53 192 -99t90 -106t29 -143q0 -172 -119.5 -262t-357.5 -90q-122 0 -208 16.5t-161 48.5v252q85 -40 191.5 -67t187.5 -27 q166 0 166 96q0 36 -22 58.5t-76 51t-144 66.5q-129 54 -189.5 100t-88 105.5t-27.5 146.5z" /> +<glyph unicode="t" horiz-adv-x="889" d="M47 889v129l168 102l88 236h195v-238h313v-229h-313v-539q0 -65 36.5 -96t96.5 -31q80 0 192 35v-227q-114 -51 -280 -51q-183 0 -266.5 92.5t-83.5 277.5v539h-146z" /> +<glyph unicode="u" horiz-adv-x="1346" d="M154 389v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5z" /> +<glyph unicode="v" horiz-adv-x="1165" d="M0 1118h319l216 -637q36 -121 45 -229h6q5 96 45 229l215 637h319l-426 -1118h-313z" /> +<glyph unicode="w" horiz-adv-x="1753" d="M20 1118h304l129 -495q31 -133 63 -367h6q4 76 35 241l16 85l138 536h336l131 -536q4 -22 12.5 -65t16.5 -91.5t14.5 -95t7.5 -74.5h6q9 72 32 197.5t33 169.5l134 495h299l-322 -1118h-332l-86 391l-116 494h-7l-204 -885h-328z" /> +<glyph unicode="x" horiz-adv-x="1184" d="M10 0l379 571l-360 547h346l217 -356l219 356h346l-364 -547l381 -571h-347l-235 383l-236 -383h-346z" /> +<glyph unicode="y" horiz-adv-x="1165" d="M0 1118h334l211 -629q27 -82 37 -194h6q11 103 43 194l207 629h327l-473 -1261q-65 -175 -185.5 -262t-281.5 -87q-79 0 -155 17v242q55 -13 120 -13q81 0 141.5 49.5t94.5 149.5l18 55z" /> +<glyph unicode="z" horiz-adv-x="999" d="M55 0v180l518 705h-487v233h834v-198l-504 -687h522v-233h-883z" /> +<glyph unicode="{" horiz-adv-x="807" d="M31 449v239q126 0 191 44t65 126v8v318q0 153 97 215.5t341 62.5v-225q-99 -3 -136.5 -38t-37.5 -103v-299q-6 -188 -234 -222v-12q234 -35 234 -212v-9v-299q0 -68 37 -103t137 -38v-226q-244 0 -341 62.5t-97 216.5v315q0 87 -65.5 133t-190.5 46z" /> +<glyph unicode="|" horiz-adv-x="1128" d="M455 -465v2015h219v-2015h-219z" /> +<glyph unicode="}" horiz-adv-x="807" d="M82 -98q99 2 136.5 36t37.5 105v299v11q0 86 59 139.5t174 70.5v12q-227 34 -233 222v299q0 70 -37 104t-137 37v225q167 0 262 -26.5t135.5 -84t40.5 -167.5v-318v-10q0 -84 61.5 -126t194.5 -42v-239q-125 0 -190.5 -41t-65.5 -138v-315q0 -112 -41 -169t-135.5 -83.5 t-261.5 -26.5v226z" /> +<glyph unicode="~" d="M88 551v231q103 109 256 109q73 0 137.5 -16t139.5 -48q129 -55 227 -55q53 0 116 32t117 89v-231q-101 -109 -256 -109q-66 0 -126 13t-150 50q-131 56 -227 56q-55 0 -117.5 -33.5t-116.5 -87.5z" /> +<glyph unicode="&#xa1;" horiz-adv-x="586" d="M117 -369l51 975h244l51 -975h-346zM117 948q0 81 46.5 125.5t127.5 44.5q84 0 130 -44t46 -126q0 -84 -45 -127t-131 -43q-83 0 -128.5 44t-45.5 126z" /> +<glyph unicode="&#xa2;" d="M143 741q0 261 104.5 403t315.5 173v166h178v-158q166 -9 299 -74l-90 -235q-72 29 -134 47t-124 18q-121 0 -179 -83.5t-58 -254.5q0 -327 237 -327q82 0 148 15.5t166 60.5v-254q-127 -61 -265 -70v-188h-178v196q-420 59 -420 565z" /> +<glyph unicode="&#xa3;" d="M82 0v248q103 44 141.5 101t38.5 157v145h-178v219h178v195q0 201 114.5 309.5t323.5 108.5q195 0 390 -82l-93 -230q-157 64 -272 64q-78 0 -120 -44.5t-42 -127.5v-193h375v-219h-375v-143q0 -170 -151 -248h718v-260h-1048z" /> +<glyph unicode="&#xa4;" d="M113 1047l147 147l127 -127q91 53 197 53q105 0 196 -55l127 129l150 -143l-129 -129q53 -89 53 -199q0 -107 -53 -199l125 -125l-146 -145l-127 125q-95 -51 -196 -51q-115 0 -199 51l-125 -123l-145 145l127 125q-54 93 -54 197q0 102 54 197zM395 723 q0 -77 54.5 -132.5t134.5 -55.5q81 0 136.5 55t55.5 133q0 80 -56.5 135t-135.5 55q-78 0 -133.5 -56t-55.5 -134z" /> +<glyph unicode="&#xa5;" d="M6 1462h316l262 -602l264 602h313l-383 -747h195v-178h-246v-138h246v-178h-246v-221h-287v221h-247v178h247v138h-247v178h190z" /> +<glyph unicode="&#xa6;" horiz-adv-x="1128" d="M455 350h219v-815h-219v815zM455 735v815h219v-815h-219z" /> +<glyph unicode="&#xa7;" horiz-adv-x="995" d="M106 59v207q81 -41 180 -69.5t169 -28.5q194 0 194 117q0 39 -18.5 63t-63.5 49.5t-125 59.5q-183 74 -252 152.5t-69 195.5q0 79 36 144.5t97 105.5q-133 84 -133 233q0 131 111.5 210t293.5 79q170 0 363 -84l-82 -190q-68 32 -138.5 57.5t-148.5 25.5q-81 0 -118 -23 t-37 -71q0 -49 49.5 -86t163.5 -82q163 -64 240 -148.5t77 -193.5q0 -177 -125 -260q62 -40 93.5 -92.5t31.5 -126.5q0 -148 -119.5 -235.5t-320.5 -87.5q-203 0 -349 79zM344 827q0 -67 65 -119t181 -98q78 57 78 146q0 68 -50.5 115t-183.5 96q-37 -14 -63.5 -53.5 t-26.5 -86.5z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1243" d="M279 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM682 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223 t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304zM461 733q0 220 110.5 342.5t309.5 122.5q149 0 305 -78l-74 -168q-113 58 -217 58q-97 0 -150 -74t-53 -205q0 -280 203 -280q57 0 123 15t123 44v-191q-120 -57 -252 -57q-204 0 -316 125t-112 346z" /> +<glyph unicode="&#xaa;" horiz-adv-x="784" d="M47 975q0 109 82.5 163.5t267.5 63.5l99 4q0 117 -127 117q-81 0 -217 -61l-66 135q66 32 145.5 57t178.5 25q137 0 211.5 -71t74.5 -202v-442h-135l-31 110q-43 -58 -105 -90t-136 -32q-117 0 -179.5 58.5t-62.5 164.5zM252 977q0 -38 23 -56t55 -18q77 0 121.5 41.5 t44.5 106.5v36l-99 -6q-145 -10 -145 -104z" /> +<glyph unicode="&#xab;" horiz-adv-x="1260" d="M82 547v26l371 455l219 -119l-279 -348l279 -348l-219 -119zM588 547v26l370 455l220 -119l-279 -348l279 -348l-220 -119z" /> +<glyph unicode="&#xac;" d="M88 612v219h993v-583h-219v364h-774z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223 t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304zM543 272v916h264q181 0 265.5 -70t84.5 -213q0 -170 -143 -233l237 -400h-254l-178 338h-47v-338h-229zM772 778h31q66 0 94.5 28.5t28.5 94.5q0 65 -28 92t-97 27h-29v-242z" /> +<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M-6 1556v201h1036v-201h-1036z" /> +<glyph unicode="&#xb0;" horiz-adv-x="877" d="M92 1137q0 92 46 172t126 127t174 47q92 0 172.5 -46t127 -127t46.5 -173q0 -93 -46.5 -173.5t-126.5 -125.5t-173 -45q-145 0 -245.5 99.5t-100.5 244.5zM283 1137q0 -64 44.5 -109t110.5 -45t111 46t45 108q0 63 -45.5 110t-110.5 47q-64 0 -109.5 -46t-45.5 -111z" /> +<glyph unicode="&#xb1;" d="M88 0v219h993v-219h-993zM88 674v219h387v389h219v-389h387v-219h-387v-385h-219v385h-387z" /> +<glyph unicode="&#xb2;" horiz-adv-x="776" d="M47 1354q147 129 336 129q137 0 216 -66.5t79 -183.5q0 -85 -47 -160t-176 -192l-105 -95h352v-200h-647v168l224 219q102 100 130.5 144.5t28.5 94.5q0 38 -24 58t-64 20q-81 0 -180 -88z" /> +<glyph unicode="&#xb3;" horiz-adv-x="776" d="M59 639v190q148 -90 271 -90q143 0 143 107q0 53 -44 79.5t-122 26.5h-112v160h92q83 0 123.5 26t40.5 83q0 38 -25 63t-76 25q-47 0 -89 -19t-99 -59l-101 141q62 47 137.5 78t178.5 31q127 0 208 -64t81 -168q0 -143 -170 -198v-13q94 -20 146 -75t52 -134 q0 -121 -88 -190.5t-274 -69.5q-143 0 -273 70z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1243" d="M332 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1352" d="M160 -492v1610h305v-653q0 -121 44 -181.5t138 -60.5q126 0 183 86.5t57 282.5v526h305v-1118h-231l-43 150h-15q-42 -85 -102 -127.5t-148 -42.5q-62 0 -114 23t-84 67l5 -85l5 -157v-320h-305z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M113 1042q0 260 109 387t341 127h604v-1816h-161v1616h-166v-1616h-162v819q-62 -18 -146 -18q-216 0 -317.5 125t-101.5 376z" /> +<glyph unicode="&#xb7;" horiz-adv-x="584" d="M117 723q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" /> +<glyph unicode="&#xb8;" horiz-adv-x="420" d="M-37 -303q27 -7 72.5 -14t70.5 -7q72 0 72 62q0 83 -166 108l78 154h193l-27 -61q74 -24 118 -74.5t44 -114.5q0 -128 -75.5 -185t-233.5 -57q-78 0 -146 21v168z" /> +<glyph unicode="&#xb9;" horiz-adv-x="776" d="M92 1227l301 235h191v-876h-238v446l3 112l5 95q-27 -36 -75 -78l-78 -61z" /> +<glyph unicode="&#xba;" horiz-adv-x="795" d="M57 1116q0 169 89.5 266t252.5 97q152 0 245 -98.5t93 -264.5q0 -171 -91.5 -267.5t-250.5 -96.5q-153 0 -245.5 98.5t-92.5 265.5zM260 1116q0 -100 32.5 -150.5t104.5 -50.5t103.5 50.5t31.5 150.5t-31.5 149.5t-103.5 49.5t-104.5 -49.5t-32.5 -149.5z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1260" d="M82 213l278 348l-278 348l219 119l371 -455v-26l-371 -453zM588 213l278 348l-278 348l219 119l371 -455v-26l-371 -453z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1804" d="M46 1227l301 235h191v-876h-238v446l3 112l5 95q-27 -36 -75 -78l-78 -61zM320 0l811 1462h239l-811 -1462h-239zM936 152v154l385 577h236v-563h125v-168h-125v-151h-238v151h-383zM1121 320h198v164q0 86 6 184q-9 -26 -35.5 -80t-41.5 -77z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1804" d="M46 1227l301 235h191v-876h-238v446l3 112l5 95q-27 -36 -75 -78l-78 -61zM320 0l811 1462h239l-811 -1462h-239zM1061 769q147 129 336 129q137 0 216 -66.5t79 -183.5q0 -85 -47 -160t-176 -192l-105 -95h352v-200h-647v168l224 219q102 100 130.5 144.5t28.5 94.5 q0 38 -24 58t-64 20q-81 0 -180 -88z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1804" d="M90 639v190q148 -90 271 -90q143 0 143 107q0 53 -44 79.5t-122 26.5h-112v160h92q83 0 123.5 26t40.5 83q0 38 -25 63t-76 25q-47 0 -89 -19t-99 -59l-101 141q62 47 137.5 78t178.5 31q127 0 208 -64t81 -168q0 -143 -170 -198v-13q94 -20 146 -75t52 -134 q0 -121 -88 -190.5t-274 -69.5q-143 0 -273 70zM391 0l811 1462h239l-811 -1462h-239zM966 152v154l385 577h236v-563h125v-168h-125v-151h-238v151h-383zM1151 320h198v164q0 86 6 184q-9 -26 -35.5 -80t-41.5 -77z" /> +<glyph unicode="&#xbf;" horiz-adv-x="977" d="M61 -29q0 108 48.5 187t191.5 184q95 70 121.5 107t26.5 98v59h264v-74q0 -98 -44.5 -169t-152.5 -148q-109 -78 -137.5 -122t-28.5 -107q0 -57 43.5 -94t132.5 -37q79 0 169 29t186 71l102 -221q-98 -56 -221.5 -90.5t-229.5 -34.5q-220 0 -345.5 96.5t-125.5 265.5z M395 948q0 81 46.5 125.5t127.5 44.5q84 0 130 -44t46 -126q0 -84 -45 -127t-131 -43q-83 0 -128.5 44t-45.5 126z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633zM338 1886v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633zM541 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633zM272 1579v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633zM293 1577q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227 t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5q-31 0 -59.5 -26.5t-41.5 -80.5h-149z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633zM365 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM768 1743 q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633zM457 1565q0 108 67.5 172.5t180.5 64.5q110 0 182 -66t72 -169q0 -108 -71 -174t-183 -66t-180 64t-68 174zM609 1565q0 -45 24 -71 t72 -26q42 0 69 26t27 71t-27 70.5t-69 25.5t-69 -25.5t-27 -70.5z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1950" d="M0 0l655 1462h1174v-254h-563v-321h526v-254h-526v-377h563v-256h-873v348h-491l-150 -348h-315zM578 608h378v590h-127z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1305" d="M119 729q0 228 83 399.5t238.5 263t364.5 91.5q213 0 428 -103l-100 -252q-82 39 -165 68t-163 29q-175 0 -271 -131.5t-96 -366.5q0 -489 367 -489q154 0 373 77v-260q-180 -75 -402 -75q-319 0 -488 193.5t-169 555.5zM504 -303q27 -7 72.5 -14t70.5 -7q72 0 72 62 q0 83 -166 108l78 154h193l-27 -61q74 -24 118 -74.5t44 -114.5q0 -128 -75.5 -185t-233.5 -57q-78 0 -146 21v168z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1147" d="M184 0v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256h-842zM259 1886v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1147" d="M184 0v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256h-842zM424 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xca;" horiz-adv-x="1147" d="M184 0v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256h-842zM175 1579v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1147" d="M184 0v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256h-842zM272 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM675 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97 t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#xcc;" horiz-adv-x="678" d="M184 0v1462h310v-1462h-310zM-58 1886v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xcd;" horiz-adv-x="678" d="M184 0v1462h310v-1462h-310zM167 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xce;" horiz-adv-x="678" d="M184 0v1462h310v-1462h-310zM-96 1579v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xcf;" horiz-adv-x="678" d="M184 0v1462h310v-1462h-310zM-3 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM400 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z " /> +<glyph unicode="&#xd0;" horiz-adv-x="1516" d="M47 596v254h137v612h459q358 0 556 -189t198 -528q0 -361 -205.5 -553t-593.5 -192h-414v596h-137zM494 256h131q450 0 450 481q0 232 -104 351.5t-314 119.5h-163v-358h237v-254h-237v-340z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1665" d="M184 0v1462h391l635 -1095h7q-15 285 -15 403v692h279v-1462h-394l-636 1106h-9q19 -293 19 -418v-688h-277zM418 1577q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5 t-78 36t-75.5 36t-73 16.5q-31 0 -59.5 -26.5t-41.5 -80.5h-149z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -363 -180 -558t-516 -195t-516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM449 1886v21h342q63 -101 235 -301v-27h-202 q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -363 -180 -558t-516 -195t-516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM658 1579v27q172 200 235 301h342v-21 q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -363 -180 -558t-516 -195t-516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM381 1579v27q189 189 256 301h357q31 -52 107.5 -141.5 t148.5 -159.5v-27h-203q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -363 -180 -558t-516 -195t-516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM402 1577q11 145 82.5 227t189.5 82q41 0 80.5 -16.5 t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5q-31 0 -59.5 -26.5t-41.5 -80.5h-149z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -363 -180 -558t-516 -195t-516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM474 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37 t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM877 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#xd7;" d="M129 1024l152 154l301 -299l305 299l153 -150l-305 -305l301 -303l-149 -152l-305 301l-301 -299l-150 152l297 301z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5q198 0 344 -70l84 125l160 -104l-88 -131q194 -194 194 -572q0 -363 -180 -558t-516 -195q-197 0 -336 65l-90 -135l-162 108l90 136q-198 194 -198 581zM444 733q0 -191 56 -307l506 756q-84 45 -189 45q-185 0 -279 -124.5 t-94 -369.5zM635 279q76 -39 180 -39q371 0 371 493q0 180 -51 297z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1548" d="M174 520v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5zM375 1886v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xda;" horiz-adv-x="1548" d="M174 520v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5zM602 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1548" d="M174 520v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5zM340 1579v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203q-157 93 -234 176 q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1548" d="M174 520v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5zM433 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5 q-64 0 -101.5 35t-37.5 98zM836 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1278" d="M0 1462h336l303 -602l305 602h334l-485 -893v-569h-308v559zM461 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xde;" horiz-adv-x="1286" d="M184 0v1462h310v-229h178q254 0 388 -119t134 -344q0 -229 -142.5 -353t-404.5 -124h-153v-293h-310zM494 543h100q145 0 216 52.5t71 174.5q0 107 -63.5 159t-199.5 52h-124v-438z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1456" d="M160 0v1139q0 201 146.5 314.5t404.5 113.5q244 0 391 -88.5t147 -237.5q0 -64 -21 -112.5t-53 -86.5t-69 -67t-69 -53t-53 -45t-21 -43q0 -27 26.5 -53t92.5 -66q146 -91 198.5 -140t78 -110t25.5 -139q0 -172 -116.5 -259t-343.5 -87q-99 0 -171 14.5t-132 48.5v242 q53 -36 135.5 -61t146.5 -25q168 0 168 123q0 41 -16 66.5t-57 55.5t-115 72q-126 72 -175 131.5t-49 140.5q0 64 35 117t105 102q77 55 108 95t31 86q0 60 -63.5 100.5t-163.5 40.5q-116 0 -181 -52.5t-65 -148.5v-1128h-305z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134zM239 1548v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134zM441 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134zM177 1240v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134zM217 1239q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5q-31 0 -59.5 -26.5t-41.5 -80.5 h-149z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134zM285 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM688 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36 q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134zM381 1477q0 108 67.5 172.5t180.5 64.5q110 0 182 -66t72 -169q0 -108 -71 -174t-183 -66t-180 64t-68 174zM533 1477q0 -45 24 -71t72 -26q42 0 69 26t27 71t-27 70.5t-69 25.5t-69 -25.5t-27 -70.5z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1878" d="M86 334q0 178 121 262.5t362 93.5l191 6v84q0 69 -44.5 102t-121.5 33q-140 0 -305 -77l-99 202q189 101 422 101q227 0 342 -131q66 64 152.5 96.5t206.5 32.5q221 0 349 -137.5t128 -370.5v-148h-723q5 -130 77 -203t202 -73q196 0 380 88v-236q-79 -39 -171 -59 t-226 -20q-137 0 -249.5 50.5t-184.5 155.5q-98 -117 -196.5 -161.5t-256.5 -44.5q-161 0 -258.5 94.5t-97.5 259.5zM399 332q0 -129 140 -129q101 0 161 61t60 162v92l-113 -4q-124 -4 -186 -47.5t-62 -134.5zM1073 686h430q-2 112 -55 174t-141 62q-217 0 -234 -236z" /> +<glyph unicode="&#xe7;" horiz-adv-x="1053" d="M92 553q0 285 142 435.5t407 150.5q194 0 348 -76l-90 -236q-72 29 -134 47.5t-124 18.5q-238 0 -238 -338q0 -328 238 -328q88 0 163 23.5t150 73.5v-261q-74 -47 -149.5 -65t-190.5 -18q-522 0 -522 573zM350 -303q27 -7 72.5 -14t70.5 -7q72 0 72 62q0 83 -166 108 l78 154h193l-27 -61q74 -24 118 -74.5t44 -114.5q0 -128 -75.5 -185t-233.5 -57q-78 0 -146 21v168z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1210" d="M92 551q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5q-270 0 -422 149t-152 422zM408 686h428q-2 113 -59 174.5t-154 61.5t-152 -61.5t-63 -174.5zM245 1548v21 h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1210" d="M92 551q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5q-270 0 -422 149t-152 422zM408 686h428q-2 113 -59 174.5t-154 61.5t-152 -61.5t-63 -174.5zM447 1241v27 q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xea;" horiz-adv-x="1210" d="M92 551q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5q-270 0 -422 149t-152 422zM408 686h428q-2 113 -59 174.5t-154 61.5t-152 -61.5t-63 -174.5zM194 1241v27 q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1210" d="M92 551q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5q-270 0 -422 149t-152 422zM408 686h428q-2 113 -59 174.5t-154 61.5t-152 -61.5t-63 -174.5zM297 1405 q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM700 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#xec;" horiz-adv-x="625" d="M160 0v1118h305v-1118h-305zM-101 1548v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xed;" horiz-adv-x="625" d="M160 0v1118h305v-1118h-305zM145 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xee;" horiz-adv-x="625" d="M160 0v1118h305v-1118h-305zM-122 1241v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xef;" horiz-adv-x="625" d="M160 0v1118h305v-1118h-305zM-29 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM374 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z " /> +<glyph unicode="&#xf0;" horiz-adv-x="1268" d="M92 489q0 233 130 369.5t351 136.5q205 0 275 -98l8 4q-67 162 -192 281l-230 -142l-100 156l176 107q-80 53 -152 92l101 176q144 -65 258 -141l225 139l100 -154l-170 -104q156 -143 230 -324.5t74 -413.5q0 -280 -145 -436.5t-400 -156.5q-245 0 -392 137t-147 372z M403 487q0 -140 60 -211t172 -71q123 0 176 82t53 245q0 108 -61 173t-168 65q-121 0 -176.5 -68.5t-55.5 -214.5z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1346" d="M160 0v1118h233l41 -143h17q51 81 140.5 122.5t203.5 41.5q195 0 296 -105.5t101 -304.5v-729h-305v653q0 121 -43 181.5t-137 60.5q-128 0 -185 -85.5t-57 -283.5v-526h-305zM258 1239q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26 t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5q-31 0 -59.5 -26.5t-41.5 -80.5h-149z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM237 1548v21 h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM467 1241v27 q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM198 1241v27 q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM219 1239 q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5q-31 0 -59.5 -26.5t-41.5 -80.5h-149z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM291 1405 q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM694 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#xf7;" d="M88 612v219h993v-219h-993zM444 373q0 76 37 113.5t103 37.5t102.5 -39t36.5 -112q0 -70 -37 -111t-102 -41t-102.5 39t-37.5 113zM444 1071q0 75 37 113.5t103 38.5q67 0 103 -40.5t36 -111.5q0 -70 -37 -110.5t-102 -40.5t-102.5 39t-37.5 112z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q132 0 248 -52l55 82l152 -108l-58 -84q142 -155 142 -416q0 -273 -144 -427t-401 -154q-126 0 -234 45l-67 -101l-154 105l68 100q-152 156 -152 432zM403 561q0 -94 19 -166l317 475q-43 23 -106 23q-122 0 -176 -82.5t-54 -249.5z M543 240q38 -15 92 -15q122 0 175.5 84.5t53.5 251.5q0 81 -12 141z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1346" d="M154 389v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5zM245 1548v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1346" d="M154 389v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5zM498 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1346" d="M154 389v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5zM235 1241v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203 q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1346" d="M154 389v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5zM326 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5 q-64 0 -101.5 35t-37.5 98zM729 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1165" d="M0 1118h334l211 -629q27 -82 37 -194h6q11 103 43 194l207 629h327l-473 -1261q-65 -175 -185.5 -262t-281.5 -87q-79 0 -155 17v242q55 -13 120 -13q81 0 141.5 49.5t94.5 149.5l18 55zM393 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z " /> +<glyph unicode="&#xfe;" horiz-adv-x="1296" d="M160 -492v2048h305v-391l-7 -120l-7 -72h14q50 81 131 123.5t186 42.5q198 0 310 -154.5t112 -423.5q0 -273 -111.5 -427t-310.5 -154q-213 0 -317 137h-14l7 -62l7 -94v-453h-305zM465 563q0 -180 53.5 -258t169.5 -78q205 0 205 338q0 165 -50.5 247.5t-158.5 82.5 q-113 0 -165 -69.5t-54 -229.5v-33z" /> +<glyph unicode="&#xff;" horiz-adv-x="1165" d="M0 1118h334l211 -629q27 -82 37 -194h6q11 103 43 194l207 629h327l-473 -1261q-65 -175 -185.5 -262t-281.5 -87q-79 0 -155 17v242q55 -13 120 -13q81 0 141.5 49.5t94.5 149.5l18 55zM243 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5 t-103 -36.5q-64 0 -101.5 35t-37.5 98zM646 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#x131;" horiz-adv-x="625" d="M160 0v1118h305v-1118h-305z" /> +<glyph unicode="&#x152;" horiz-adv-x="1993" d="M119 735q0 363 169.5 556.5t487.5 193.5q61 0 127 -7t101 -16h868v-254h-563v-321h526v-254h-526v-377h563v-256h-873q-38 -9 -109 -14.5t-116 -5.5q-319 0 -487 197t-168 558zM438 733q0 -244 86 -368.5t250 -124.5q65 0 126 10.5t99 28.5v907q-35 19 -101.5 30 t-121.5 11q-166 0 -252 -125.5t-86 -368.5z" /> +<glyph unicode="&#x153;" horiz-adv-x="2003" d="M92 561q0 277 141.5 427.5t399.5 150.5q112 0 212 -39.5t171 -116.5q144 156 383 156q244 0 380 -135t136 -373v-148h-746v-8q7 -127 81.5 -197.5t207.5 -70.5q107 0 200 21t193 67v-236q-81 -39 -175.5 -59t-229.5 -20q-271 0 -420 155q-141 -155 -391 -155 q-162 0 -286 70t-190.5 202t-66.5 309zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM1178 686h450q-2 111 -60.5 173.5t-162.5 62.5q-94 0 -156 -57.5t-71 -178.5z" /> +<glyph unicode="&#x178;" horiz-adv-x="1278" d="M0 1462h336l303 -602l305 602h334l-485 -893v-569h-308v559zM297 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM700 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36 q-60 0 -100.5 32.5t-40.5 100.5z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="1243" d="M186 1241v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203q-157 93 -234 176q-78 -81 -229 -176h-203z" /> +<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M340 1477q0 108 67.5 172.5t180.5 64.5q110 0 182 -66t72 -169q0 -108 -71 -174t-183 -66t-180 64t-68 174zM492 1477q0 -45 24 -71t72 -26q42 0 69 26t27 71t-27 70.5t-69 25.5t-69 -25.5t-27 -70.5z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="1243" d="M207 1239q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5q-31 0 -59.5 -26.5t-41.5 -80.5h-149z" /> +<glyph unicode="&#x2000;" horiz-adv-x="953" /> +<glyph unicode="&#x2001;" horiz-adv-x="1907" /> +<glyph unicode="&#x2002;" horiz-adv-x="953" /> +<glyph unicode="&#x2003;" horiz-adv-x="1907" /> +<glyph unicode="&#x2004;" horiz-adv-x="635" /> +<glyph unicode="&#x2005;" horiz-adv-x="476" /> +<glyph unicode="&#x2006;" horiz-adv-x="317" /> +<glyph unicode="&#x2007;" horiz-adv-x="317" /> +<glyph unicode="&#x2008;" horiz-adv-x="238" /> +<glyph unicode="&#x2009;" horiz-adv-x="381" /> +<glyph unicode="&#x200a;" horiz-adv-x="105" /> +<glyph unicode="&#x2010;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="&#x2011;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="&#x2012;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 436v230h860v-230h-860z" /> +<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 436v230h1884v-230h-1884z" /> +<glyph unicode="&#x2018;" horiz-adv-x="444" d="M25 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" /> +<glyph unicode="&#x2019;" horiz-adv-x="444" d="M25 961q69 296 100 501h281l14 -22q-50 -197 -176 -479h-219z" /> +<glyph unicode="&#x201a;" horiz-adv-x="596" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220z" /> +<glyph unicode="&#x201c;" horiz-adv-x="911" d="M25 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280zM492 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" /> +<glyph unicode="&#x201d;" horiz-adv-x="911" d="M25 961q69 296 100 501h281l14 -22q-50 -197 -176 -479h-219zM492 961q69 296 100 501h280l15 -22q-50 -197 -176 -479h-219z" /> +<glyph unicode="&#x201e;" horiz-adv-x="1061" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220zM530 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M98 748q0 154 74 235.5t213 81.5q137 0 212 -82t75 -235q0 -152 -75.5 -235t-211.5 -83q-138 0 -212.5 83t-74.5 235z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1751" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM700 143q0 84 45 127t132 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-85 0 -131 44.5t-46 125.5zM1284 143q0 84 45 127t131 43 q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" /> +<glyph unicode="&#x202f;" horiz-adv-x="381" /> +<glyph unicode="&#x2039;" horiz-adv-x="754" d="M82 547v26l371 455l219 -119l-279 -348l279 -348l-219 -119z" /> +<glyph unicode="&#x203a;" horiz-adv-x="754" d="M82 213l278 348l-278 348l219 119l371 -455v-26l-371 -453z" /> +<glyph unicode="&#x2044;" horiz-adv-x="266" d="M-393 0l811 1462h239l-811 -1462h-239z" /> +<glyph unicode="&#x205f;" horiz-adv-x="476" /> +<glyph unicode="&#x2074;" horiz-adv-x="776" d="M12 737v154l385 577h236v-563h125v-168h-125v-151h-238v151h-383zM197 905h198v164q0 86 6 184q-9 -26 -35.5 -80t-41.5 -77z" /> +<glyph unicode="&#x20ac;" d="M66 481v178h118q-4 23 -4 62l2 53h-116v176h133q37 242 199 382.5t405 140.5q188 0 352 -82l-98 -232q-69 31 -129 48.5t-125 17.5q-122 0 -201 -70.5t-102 -204.5h403v-176h-418l-2 -35v-47l2 -33h355v-178h-338q51 -243 321 -243q143 0 275 57v-256q-116 -59 -293 -59 q-245 0 -403 133t-199 368h-137z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M16 1313v149h564v-149h-199v-572h-168v572h-197zM625 741v721h247l160 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-142l-165 529h-7l4 -111v-418h-163z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1417" d="M41 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229h-264v-889h-305v889h-168zM940 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150zM953 0v1118h305v-1118h-305z " /> +<glyph unicode="&#xfb02;" horiz-adv-x="1417" d="M41 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229h-264v-889h-305v889h-168zM953 0v1556h305v-1556h-305z" /> +<glyph unicode="&#xfb03;" horiz-adv-x="2208" d="M41 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229h-264v-889h-305v889h-168zM834 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5 v-70h264v-229h-264v-889h-305v889h-168zM1730 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150zM1743 0v1118h305v-1118h-305z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="2208" d="M41 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229h-264v-889h-305v889h-168zM834 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5 v-70h264v-229h-264v-889h-305v889h-168zM1743 0v1556h305v-1556h-305z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.ttf new file mode 100644 index 000000000000..338220f25b96 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.woff new file mode 100644 index 000000000000..ea6007b3b1ed Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bold-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.eot new file mode 100644 index 000000000000..d892fd9d8a96 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.svg new file mode 100644 index 000000000000..24661f35f983 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.svg @@ -0,0 +1,251 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansBoldItalic" horiz-adv-x="1128" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="586" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM150 485l157 977h340l-256 -977h-241z" /> +<glyph unicode="&#x22;" horiz-adv-x="928" d="M201 934l71 528h277l-152 -528h-196zM604 934l74 528h276l-151 -528h-199z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M41 408l18 206h277l70 232h-252l18 209h289l119 407h217l-117 -407h199l116 407h215l-116 -407h239l-18 -209h-279l-69 -232h258l-19 -206h-297l-116 -408h-220l117 408h-194l-115 -408h-215l113 408h-238zM553 614h197l69 232h-196z" /> +<glyph unicode="$" d="M51 168v266q198 -107 404 -117l71 322q-163 61 -241 151t-78 214q0 173 127 279.5t350 121.5l35 151h139l-33 -151q166 -22 295 -90l-106 -232q-132 65 -242 74l-63 -299q131 -51 195 -99.5t97 -113t33 -149.5q0 -184 -125.5 -291.5t-367.5 -124.5l-39 -199h-140l44 201 q-209 12 -355 86zM502 1022q0 -79 80 -111l51 246q-62 -7 -96.5 -41t-34.5 -94zM594 322q63 9 102 45t39 98q0 46 -24.5 75.5t-59.5 43.5z" /> +<glyph unicode="%" horiz-adv-x="1753" d="M115 885q0 169 55.5 311.5t148.5 214.5t216 72q137 0 211.5 -80t74.5 -238q0 -166 -56 -310t-151 -217t-217 -73q-139 0 -210.5 83.5t-71.5 236.5zM231 0l1088 1462h235l-1083 -1462h-240zM360 868q0 -96 56 -96q65 0 112 131t47 275q0 96 -57 96q-63 0 -110.5 -128.5 t-47.5 -277.5zM973 283q0 177 53 322.5t148 219.5t219 74q137 0 211.5 -78.5t74.5 -230.5q0 -167 -54 -313.5t-148 -220.5t-215 -74q-144 0 -216.5 78.5t-72.5 222.5zM1219 285q0 -97 55 -97q41 0 77 55t59.5 154.5t23.5 196.5q0 96 -58 96q-39 0 -75 -56t-59 -154t-23 -195 z" /> +<glyph unicode="&#x26;" horiz-adv-x="1450" d="M68 358q0 145 78.5 248.5t273.5 200.5q-76 130 -76 258q0 195 117.5 307.5t316.5 112.5q169 0 266 -82.5t97 -224.5q0 -280 -365 -426l195 -263q44 57 80.5 121.5t78.5 173.5h300q-133 -313 -310 -497l205 -287h-350l-72 98q-175 -118 -403 -118q-209 0 -320.5 97.5 t-111.5 280.5zM383 387q0 -65 45.5 -108t116.5 -43q115 0 221 59l-225 328q-88 -51 -123 -104.5t-35 -131.5zM621 1085q0 -46 12 -92t29 -73q113 59 155.5 111t42.5 112q0 57 -30 82.5t-70 25.5q-66 0 -102.5 -46.5t-36.5 -119.5z" /> +<glyph unicode="'" horiz-adv-x="522" d="M201 934l71 528h277l-152 -528h-196z" /> +<glyph unicode="(" horiz-adv-x="694" d="M74 281q0 339 122.5 626.5t381.5 554.5h262q-255 -278 -377.5 -573.5t-122.5 -618.5q0 -308 117 -594h-234q-149 266 -149 605z" /> +<glyph unicode=")" horiz-adv-x="694" d="M-147 -324q499 545 499 1192q0 307 -116 594h233q149 -264 149 -604q0 -342 -124 -630.5t-379 -551.5h-262z" /> +<glyph unicode="*" horiz-adv-x="1116" d="M172 1141l86 237l338 -174l33 369l256 -51l-113 -353l387 29l-18 -254l-338 43l160 -336l-246 -73l-90 337l-197 -278l-207 164l275 248z" /> +<glyph unicode="+" d="M109 612v219h366v369h219v-369h367v-219h-367v-364h-219v364h-366z" /> +<glyph unicode="," horiz-adv-x="569" d="M-102 -264q74 167 194 502h285l8 -23q-118 -255 -262 -479h-225z" /> +<glyph unicode="-" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="." horiz-adv-x="584" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" /> +<glyph unicode="/" horiz-adv-x="862" d="M-90 0l809 1462h295l-809 -1462h-295z" /> +<glyph unicode="0" d="M66 467q0 297 84 537t228 360.5t333 120.5q399 0 399 -473q0 -470 -168.5 -751t-472.5 -281q-198 0 -300.5 122t-102.5 365zM369 461q0 -115 27.5 -173.5t97.5 -58.5q81 0 150.5 106t116 301t46.5 386q0 111 -30.5 162t-92.5 51q-80 0 -149.5 -104t-117.5 -302t-48 -368z " /> +<glyph unicode="1" d="M182 1114l566 348h249l-309 -1462h-305l180 829q35 152 76 287q-9 -8 -61.5 -47t-262.5 -170z" /> +<glyph unicode="2" d="M-49 0l43 213l477 424q180 159 248.5 254.5t68.5 179.5q0 75 -41 114.5t-110 39.5q-66 0 -135.5 -33.5t-171.5 -118.5l-146 203q132 112 252 159.5t250 47.5q190 0 301 -98t111 -259q0 -107 -41 -201t-122.5 -188t-266.5 -245l-269 -222v-10h568l-54 -260h-962z" /> +<glyph unicode="3" d="M14 59v267q84 -50 182 -75.5t191 -25.5q158 0 243 63.5t85 176.5q0 172 -258 172h-138l46 221h73q167 0 263 62t96 172q0 67 -43 104t-121 37q-134 0 -287 -100l-127 204q124 81 232.5 113.5t246.5 32.5q190 0 298 -90.5t108 -243.5q0 -156 -94.5 -262t-261.5 -135v-4 q131 -26 198.5 -106.5t67.5 -201.5q0 -133 -74 -238t-212 -163.5t-327 -58.5q-239 0 -387 79z" /> +<glyph unicode="4" d="M-25 303l48 234l770 925h311l-195 -919h170l-51 -240h-170l-63 -303h-293l63 303h-590zM305 543h311l58 248q12 58 40 164t42 141h-6q-35 -63 -132 -181z" /> +<glyph unicode="5" d="M27 61v269q174 -99 352 -99q154 0 241 71t87 194q0 94 -57.5 141t-166.5 47q-102 0 -213 -33l-104 78l207 733h755l-55 -262h-489l-88 -293q72 15 127 15q183 0 289 -103t106 -287q0 -167 -71.5 -292t-208.5 -192.5t-330 -67.5q-117 0 -218.5 23t-162.5 58z" /> +<glyph unicode="6" d="M88 469q0 202 61 395.5t167.5 335t256.5 213.5t357 72q125 0 223 -27l-51 -246q-84 25 -191 25q-194 0 -313.5 -108t-185.5 -345h4q115 166 311 166q157 0 242.5 -97t85.5 -273q0 -169 -71 -313.5t-190.5 -215.5t-277.5 -71q-212 0 -320 127t-108 362zM383 422 q0 -91 40 -143t107 -52q99 0 161.5 94t62.5 236q0 71 -33.5 113.5t-102.5 42.5q-60 0 -114.5 -35.5t-87.5 -95.5t-33 -160z" /> +<glyph unicode="7" d="M78 0l737 1202h-629l56 260h975l-41 -194l-752 -1268h-346z" /> +<glyph unicode="8" d="M55 350q0 298 348 426q-165 132 -165 299q0 119 58 212.5t168 145.5t257 52q123 0 215.5 -42t141 -118t48.5 -174q0 -134 -80.5 -233.5t-230.5 -151.5q217 -141 217 -365q0 -122 -63.5 -218.5t-181 -149.5t-273.5 -53q-214 0 -336.5 100t-122.5 270zM352 383 q0 -81 50 -128.5t135 -47.5q93 0 147.5 53.5t54.5 138.5q0 73 -36.5 131.5t-120.5 112.5q-116 -45 -173 -107t-57 -153zM528 1094q0 -132 123 -201q185 72 185 221q0 68 -39.5 107t-102.5 39q-76 0 -121 -46.5t-45 -119.5z" /> +<glyph unicode="9" d="M86 12v256q111 -41 227 -41q121 0 207.5 49t144 138.5t99.5 257.5h-4q-111 -158 -295 -158q-163 0 -252.5 103.5t-89.5 285.5q0 166 73 305.5t196 208t286 68.5q203 0 308.5 -123t105.5 -361q0 -280 -99 -533t-264 -370.5t-403 -117.5q-128 0 -240 32zM424 928 q0 -87 37.5 -131.5t105.5 -44.5q60 0 111.5 36.5t82 100t30.5 158.5q0 84 -35.5 137t-110.5 53q-65 0 -115.5 -42t-78 -114t-27.5 -153z" /> +<glyph unicode=":" horiz-adv-x="584" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5z" /> +<glyph unicode=";" horiz-adv-x="584" d="M-102 -264q74 167 194 502h285l8 -23q-118 -255 -262 -479h-225zM207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5z" /> +<glyph unicode="&#x3c;" d="M109 641v143l952 496v-240l-643 -317l643 -281v-239z" /> +<glyph unicode="=" d="M109 418v219h952v-219h-952zM109 807v217h952v-217h-952z" /> +<glyph unicode="&#x3e;" d="M109 203v239l643 281l-643 317v240l952 -496v-143z" /> +<glyph unicode="?" horiz-adv-x="940" d="M166 115q0 91 55 144.5t150 53.5q68 0 108.5 -38t40.5 -107q0 -87 -55 -141t-143 -54q-74 0 -115 38t-41 104zM178 1358q230 125 445 125q177 0 280 -87.5t103 -244.5q0 -83 -28.5 -149.5t-82.5 -123t-190 -147.5q-64 -43 -96.5 -73t-52.5 -64.5t-38 -108.5h-258l14 78 q19 103 73.5 177t172.5 155q124 84 157.5 127t33.5 96q0 119 -133 119q-50 0 -106.5 -16t-201.5 -84z" /> +<glyph unicode="@" horiz-adv-x="1753" d="M92 500q0 279 120.5 497t343 341.5t497.5 123.5q318 0 499 -163.5t181 -458.5q0 -173 -64 -321t-177.5 -231t-254.5 -83q-88 0 -144.5 38.5t-72.5 108.5h-6q-50 -77 -113 -112t-147 -35q-127 0 -198 79.5t-71 229.5q0 147 67.5 276.5t187.5 205t268 75.5q185 0 327 -55 l-106 -420q-11 -44 -19 -76.5t-8 -64.5q0 -68 58 -68q66 0 124 64t92.5 171t34.5 214q0 213 -123.5 325.5t-359.5 112.5q-203 0 -366.5 -94t-255 -266t-91.5 -392q0 -243 134 -380.5t376 -137.5q117 0 219.5 20t221.5 66v-186q-230 -90 -465 -90q-217 0 -378 85.5 t-246 241.5t-85 359zM713 526q0 -65 24.5 -102t69.5 -37q141 0 213 270l57 222q-36 10 -82 10q-82 0 -145.5 -51.5t-100 -137t-36.5 -174.5z" /> +<glyph unicode="A" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254z" /> +<glyph unicode="B" horiz-adv-x="1270" d="M53 0l309 1462h426q229 0 346 -81.5t117 -243.5q0 -150 -83 -247.5t-236 -129.5v-6q100 -26 159.5 -96.5t59.5 -180.5q0 -229 -153 -353t-423 -124h-522zM412 256h180q117 0 183.5 58t66.5 161q0 162 -183 162h-165zM545 883h149q121 0 181.5 48.5t60.5 139.5 q0 137 -170 137h-152z" /> +<glyph unicode="C" horiz-adv-x="1253" d="M123 553q0 262 104 482.5t278 335t400 114.5q125 0 222 -22.5t208 -82.5l-118 -250q-106 59 -175 78t-137 19q-132 0 -237.5 -81t-169.5 -238.5t-64 -338.5q0 -167 68.5 -248t218.5 -81q146 0 338 77v-260q-199 -77 -400 -77q-254 0 -395 149.5t-141 423.5z" /> +<glyph unicode="D" horiz-adv-x="1386" d="M53 0l309 1462h396q270 0 417.5 -143t147.5 -410q0 -280 -98 -486.5t-283.5 -314.5t-437.5 -108h-451zM412 256h106q148 0 258 76t172 223.5t62 337.5q0 154 -72.5 234.5t-208.5 80.5h-115z" /> +<glyph unicode="E" horiz-adv-x="1110" d="M53 0l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512l-54 -256h-817z" /> +<glyph unicode="F" horiz-adv-x="1087" d="M53 0l309 1462h814l-54 -254h-508l-79 -377h473l-56 -253h-473l-121 -578h-305z" /> +<glyph unicode="G" horiz-adv-x="1413" d="M123 549q0 268 107 484.5t301 334t448 117.5q218 0 410 -99l-115 -251q-74 40 -148 64t-161 24q-153 0 -273.5 -83t-189 -236.5t-68.5 -330.5q0 -172 72.5 -252.5t222.5 -80.5q76 0 170 24l66 299h-267l56 258h563l-162 -762q-134 -46 -248.5 -62.5t-242.5 -16.5 q-259 0 -400 147t-141 422z" /> +<glyph unicode="H" horiz-adv-x="1434" d="M53 0l309 1462h306l-121 -573h471l121 573h305l-309 -1462h-306l134 631h-471l-134 -631h-305z" /> +<glyph unicode="I" horiz-adv-x="659" d="M53 0l312 1462h305l-312 -1462h-305z" /> +<glyph unicode="J" horiz-adv-x="678" d="M-322 -150q88 -20 164 -20q99 0 160.5 60.5t89.5 191.5l293 1380h305l-303 -1423q-52 -245 -175.5 -357t-346.5 -112q-94 0 -187 27v253z" /> +<glyph unicode="K" horiz-adv-x="1255" d="M53 0l309 1462h306l-152 -702l158 205l409 497h361l-594 -700l291 -762h-338l-211 592l-125 -70l-109 -522h-305z" /> +<glyph unicode="L" horiz-adv-x="1061" d="M53 0l309 1462h306l-256 -1206h512l-54 -256h-817z" /> +<glyph unicode="M" horiz-adv-x="1802" d="M53 0l309 1462h404l68 -1093h4l551 1093h423l-309 -1462h-280l145 692q53 247 105 441h-5l-569 -1133h-281l-61 1133h-4q-11 -88 -38 -231t-187 -902h-275z" /> +<glyph unicode="N" horiz-adv-x="1546" d="M53 0l309 1462h357l340 -1077h4q12 76 39 217t180 860h274l-309 -1462h-342l-356 1106h-6l-4 -32q-32 -216 -66 -386l-145 -688h-275z" /> +<glyph unicode="O" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5q-121 0 -222 -91.5 t-158.5 -251.5t-57.5 -347z" /> +<glyph unicode="P" horiz-adv-x="1188" d="M53 0l309 1462h338q242 0 366 -106.5t124 -319.5q0 -241 -169.5 -378.5t-467.5 -137.5h-86l-109 -520h-305zM522 774h56q142 0 223.5 69t81.5 185q0 180 -195 180h-74z" /> +<glyph unicode="Q" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -316 -122.5 -555.5t-334.5 -337.5l254 -393h-359l-178 328h-26q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5 q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347z" /> +<glyph unicode="R" horiz-adv-x="1247" d="M53 0l309 1462h359q237 0 356 -102t119 -299q0 -158 -83 -271.5t-239 -168.5l261 -621h-332l-207 561h-119l-119 -561h-305zM530 813h78q131 0 204 57t73 174q0 82 -47.5 123t-149.5 41h-74z" /> +<glyph unicode="S" horiz-adv-x="1085" d="M41 70v274q193 -108 358 -108q112 0 175 42.5t63 116.5q0 43 -13.5 75.5t-38.5 60.5t-124 102q-138 99 -194 196t-56 209q0 129 62 230.5t176.5 158t263.5 56.5q217 0 397 -99l-109 -233q-156 74 -288 74q-83 0 -136 -45t-53 -119q0 -61 33 -106.5t148 -120.5 q121 -80 181 -176.5t60 -225.5q0 -209 -148 -330.5t-401 -121.5q-221 0 -356 90z" /> +<glyph unicode="T" horiz-adv-x="1087" d="M168 1204l55 258h1010l-55 -258h-353l-254 -1204h-305l254 1204h-352z" /> +<glyph unicode="U" horiz-adv-x="1415" d="M141 401q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5z" /> +<glyph unicode="V" horiz-adv-x="1208" d="M184 1462h295l51 -880q4 -45 4 -133q-2 -103 -6 -150h7q78 221 110 283l432 880h316l-748 -1462h-334z" /> +<glyph unicode="W" horiz-adv-x="1831" d="M184 1462h287l6 -798q0 -52 -4 -173t-10 -174h6q22 64 67 180.5t60 145.5l369 819h270l21 -873q0 -146 -9 -272h6q43 129 131 349l330 796h309l-647 -1462h-346l-22 721l-2 139q0 88 4 158h-4q-46 -146 -115 -299l-324 -719h-338z" /> +<glyph unicode="X" horiz-adv-x="1241" d="M-117 0l576 764l-238 698h320l153 -518l363 518h344l-545 -725l268 -737h-331l-172 543l-396 -543h-342z" /> +<glyph unicode="Y" horiz-adv-x="1155" d="M186 1462h312l129 -592l374 592h342l-618 -903l-119 -559h-303l119 559z" /> +<glyph unicode="Z" horiz-adv-x="1098" d="M-61 0l38 201l777 1005h-543l53 256h936l-41 -202l-782 -1004h596l-53 -256h-981z" /> +<glyph unicode="[" horiz-adv-x="678" d="M-37 -324l381 1786h473l-45 -211h-215l-291 -1364h215l-45 -211h-473z" /> +<glyph unicode="\" horiz-adv-x="862" d="M221 1462h260l224 -1462h-267z" /> +<glyph unicode="]" horiz-adv-x="678" d="M-137 -324l45 211h213l291 1364h-215l45 211h473l-381 -1786h-471z" /> +<glyph unicode="^" horiz-adv-x="1081" d="M20 520l619 950h147l277 -950h-223l-174 633l-402 -633h-244z" /> +<glyph unicode="_" horiz-adv-x="819" d="M-186 -324l30 140h822l-31 -140h-821z" /> +<glyph unicode="`" horiz-adv-x="1135" d="M508 1548v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="a" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234z" /> +<glyph unicode="b" horiz-adv-x="1219" d="M37 0l330 1556h301l-62 -288q-41 -182 -84 -299h8q78 98 142.5 134t140.5 36q146 0 230.5 -108t84.5 -298t-68 -367.5t-187 -281.5t-263 -104q-194 0 -276 163h-8l-58 -143h-231zM420 399q0 -80 37 -128t102 -48q67 0 128 69t98.5 189.5t37.5 237.5q0 176 -131 176 q-68 0 -130 -65t-102 -180.5t-40 -250.5z" /> +<glyph unicode="c" horiz-adv-x="989" d="M90 391q0 212 74.5 385.5t209.5 268t308 94.5q182 0 328 -72l-92 -229q-54 23 -106 40t-118 17q-85 0 -153.5 -64t-107 -175.5t-38.5 -239.5q0 -96 45.5 -144.5t126.5 -48.5q76 0 141 23.5t134 58.5v-246q-152 -79 -336 -79q-201 0 -308.5 107.5t-107.5 303.5z" /> +<glyph unicode="d" horiz-adv-x="1217" d="M90 387q0 196 71.5 374.5t188.5 278t258 99.5q82 0 141.5 -37t112.5 -127h8l2 28q6 110 25 195l76 358h301l-330 -1556h-229l14 145h-4q-71 -87 -148.5 -126t-170.5 -39q-147 0 -231.5 107t-84.5 300zM395 399q0 -176 137 -176q66 0 128.5 68.5t100.5 182.5t38 245 q0 80 -37.5 128t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234z" /> +<glyph unicode="e" horiz-adv-x="1141" d="M90 412q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86q-210 0 -326 113t-116 319zM428 647h45q155 0 241.5 48.5 t86.5 131.5q0 95 -105 95q-88 0 -166 -80t-102 -195z" /> +<glyph unicode="f" horiz-adv-x="764" d="M-219 -225q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h219l-49 -229h-220l-215 -1010q-77 -371 -403 -371q-104 0 -174 25v242z" /> +<glyph unicode="g" horiz-adv-x="1108" d="M-115 -209q0 102 68.5 175.5t214.5 121.5q-74 47 -74 133q0 71 44.5 122.5t146.5 98.5q-65 49 -96 112t-31 153q0 199 125.5 315.5t341.5 116.5q83 0 166 -23h395l-35 -166l-174 -41q16 -52 16 -118q0 -195 -121 -308.5t-329 -113.5q-59 0 -99 10q-84 -27 -84 -78 q0 -34 30 -49t89 -23l137 -18q163 -21 237.5 -84.5t74.5 -183.5q0 -211 -156 -323t-446 -112q-208 0 -324.5 75.5t-116.5 207.5zM150 -172q0 -115 194 -115q151 0 228 45t77 127q0 39 -32.5 60t-137.5 35l-114 14q-106 -14 -160.5 -57t-54.5 -109zM442 680q0 -119 103 -119 q75 0 121.5 76.5t46.5 193.5t-99 117q-77 0 -124.5 -76.5t-47.5 -191.5z" /> +<glyph unicode="h" horiz-adv-x="1237" d="M37 0l330 1556h301q-39 -181 -60 -278t-86 -309h8q62 77 138 123.5t176 46.5q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180l-133 -637h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" /> +<glyph unicode="i" horiz-adv-x="608" d="M37 0l237 1118h301l-237 -1118h-301zM322 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" /> +<glyph unicode="j" horiz-adv-x="608" d="M-264 -225q61 -21 114 -21q137 0 173 170l253 1194h302l-265 -1239q-77 -371 -403 -371q-104 0 -174 25v242zM324 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" /> +<glyph unicode="k" horiz-adv-x="1163" d="M37 0l330 1556h301l-148 -694q-8 -41 -29 -117l-28 -102h4l453 475h344l-498 -504l285 -614h-336l-183 420l-120 -72l-74 -348h-301z" /> +<glyph unicode="l" horiz-adv-x="608" d="M37 0l330 1556h301l-330 -1556h-301z" /> +<glyph unicode="m" horiz-adv-x="1853" d="M37 0l237 1118h230l-21 -207h6q146 228 355 228q219 0 262 -228h6q68 110 160.5 169t197.5 59q136 0 207.5 -85t71.5 -237q0 -76 -23 -180l-133 -637h-301l138 653q16 68 16 119q0 123 -98 123q-92 0 -166.5 -112t-118.5 -318l-96 -465h-301l137 653q16 68 16 119 q0 123 -98 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" /> +<glyph unicode="n" horiz-adv-x="1237" d="M37 0l237 1118h230l-21 -207h6q146 228 355 228q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180l-133 -637h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" /> +<glyph unicode="o" horiz-adv-x="1198" d="M90 410q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118t114 -325q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5zM393 410q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5q0 197 -143 197q-75 0 -134.5 -61t-97 -179 t-37.5 -243z" /> +<glyph unicode="p" horiz-adv-x="1219" d="M-68 -492l342 1610h230l-17 -170h9q138 191 317 191q146 0 230.5 -107.5t84.5 -300.5q0 -191 -68.5 -367.5t-187.5 -280t-262 -103.5q-83 0 -143 37t-111 126h-8q-12 -159 -43 -295l-72 -340h-301zM420 399q0 -80 37 -128t102 -48q67 0 128 69t98.5 189.5t37.5 237.5 q0 176 -131 176q-68 0 -131.5 -67.5t-102 -180t-38.5 -248.5z" /> +<glyph unicode="q" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q86 0 152.5 -37.5t124.5 -126.5h8l57 143h232l-342 -1610h-301q47 218 73 337.5t84 304.5h-8q-72 -94 -143 -132t-154 -38q-88 0 -156 47.5t-106.5 138.5t-38.5 219zM395 399q0 -88 36.5 -132t103.5 -44q64 0 127.5 70t100 181 t36.5 245q0 80 -37.5 128t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234z" /> +<glyph unicode="r" horiz-adv-x="862" d="M37 0l237 1118h230l-21 -207h6q147 228 353 228q59 0 96 -11l-66 -290q-45 16 -100 16q-116 0 -203.5 -91.5t-124.5 -262.5l-106 -500h-301z" /> +<glyph unicode="s" horiz-adv-x="969" d="M23 45v248q157 -90 319 -90q80 0 131 32.5t51 88.5q0 43 -37 77t-131 86q-121 68 -169 135.5t-48 159.5q0 170 110.5 263.5t315.5 93.5q201 0 363 -95l-99 -215q-140 84 -258 84q-57 0 -92 -25.5t-35 -68.5q0 -39 32 -68.5t120 -74.5q123 -63 178 -137t55 -170 q0 -188 -124.5 -288.5t-346.5 -100.5q-107 0 -186.5 15t-148.5 50z" /> +<glyph unicode="t" horiz-adv-x="840" d="M94 889l29 147l196 84l132 236h194l-49 -238h283l-50 -229h-282l-115 -539q-6 -30 -6 -53q0 -74 88 -74q65 0 162 35v-225q-111 -53 -266 -53q-150 0 -220.5 63t-70.5 195q0 50 12 112l115 539h-152z" /> +<glyph unicode="u" horiz-adv-x="1237" d="M111 301q0 93 24 213l127 604h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5z" /> +<glyph unicode="v" horiz-adv-x="1049" d="M102 1118h295l45 -586q7 -133 7 -231h6q55 153 92 223l297 594h323l-604 -1118h-323z" /> +<glyph unicode="w" horiz-adv-x="1614" d="M125 1118h281l4 -495l-4 -167l-7 -171h4q6 20 14 41.5t51 136.5t46 119l231 536h328v-536q0 -142 -10 -297h6l28 80q73 208 95 258l219 495h307l-530 -1118h-330l-6 520q0 155 10 340h-6q-62 -178 -123 -319l-233 -541h-324z" /> +<glyph unicode="x" horiz-adv-x="1087" d="M-100 0l479 573l-225 545h321l115 -334l244 334h354l-467 -561l244 -557h-326l-125 342l-264 -342h-350z" /> +<glyph unicode="y" horiz-adv-x="1063" d="M-141 -233q68 -13 116 -13q84 0 147.5 48t117.5 149l26 49l-164 1118h295l56 -518q14 -122 14 -293h6q20 51 44 119.5t65 153.5l260 538h327l-680 -1278q-177 -332 -483 -332q-90 0 -147 19v240z" /> +<glyph unicode="z" horiz-adv-x="932" d="M-47 0l35 180l575 705h-397l51 233h750l-43 -200l-566 -685h439l-49 -233h-795z" /> +<glyph unicode="{" horiz-adv-x="727" d="M-8 459l45 229q122 0 192.5 41.5t92.5 138.5l61 285q38 170 131 239.5t270 69.5h84l-49 -225q-90 -2 -130.5 -34.5t-55.5 -106.5l-66 -297q-45 -207 -276 -236v-8q85 -26 126.5 -82.5t41.5 -134.5q0 -44 -15 -113l-36 -178q-7 -28 -7 -51q0 -54 33.5 -74t91.5 -20v-226 h-53q-167 0 -253.5 63.5t-86.5 184.5q0 57 14 125l39 184q15 69 15 86q0 140 -209 140z" /> +<glyph unicode="|" d="M455 -465v2015h219v-2015h-219z" /> +<glyph unicode="}" horiz-adv-x="727" d="M-100 -98q93 3 137 35.5t59 105.5l66 297q25 111 95 166t181 69v9q-168 51 -168 217q0 43 15 112l37 179q6 30 6 51q0 54 -36.5 74t-109.5 20l41 225h33q340 0 340 -248q0 -56 -14 -124l-39 -185q-15 -69 -15 -86q0 -139 209 -139l-45 -229q-122 0 -192.5 -42t-91.5 -139 l-62 -284q-37 -170 -130.5 -240t-270.5 -70h-45v226z" /> +<glyph unicode="~" d="M109 551v231q101 109 256 109q64 0 117 -14t139 -50q64 -27 111 -41t95 -14q51 0 112 30.5t122 90.5v-231q-103 -109 -256 -109q-59 0 -109 11.5t-147 51.5q-89 38 -127 47t-80 9q-54 0 -116.5 -33t-116.5 -88z" /> +<glyph unicode="&#xa1;" horiz-adv-x="586" d="M-74 -371l256 977h242l-158 -977h-340zM195 924q0 85 54 139.5t144 54.5q73 0 114.5 -37t41.5 -104q0 -92 -55.5 -145.5t-149.5 -53.5q-68 0 -108.5 38t-40.5 108z" /> +<glyph unicode="&#xa2;" d="M164 584q0 193 62.5 355t178 262.5t267.5 123.5l33 158h188l-35 -158q118 -14 225 -65l-92 -230q-53 23 -105 40t-118 17q-133 0 -216 -143t-83 -336q0 -96 45 -144t127 -48q75 0 140 23.5t134 58.5v-246q-136 -71 -299 -80l-41 -192h-188l49 210q-134 36 -203 136 t-69 258z" /> +<glyph unicode="&#xa3;" d="M-12 0l49 246q196 48 244 264l22 104h-192l45 220h192l49 247q41 197 162 300.5t313 103.5q195 0 369 -86l-113 -232q-141 68 -237 68q-75 0 -123 -39.5t-68 -132.5l-47 -229h299l-45 -220h-299l-18 -84q-42 -195 -209 -270h655l-55 -260h-993z" /> +<glyph unicode="&#xa4;" d="M115 1047l147 147l127 -127q91 53 197 53q105 0 196 -55l127 129l150 -143l-129 -129q53 -89 53 -199q0 -107 -53 -199l125 -125l-146 -145l-127 125q-95 -51 -196 -51q-115 0 -199 51l-125 -123l-145 145l127 125q-54 93 -54 197q0 102 54 197zM397 723 q0 -77 54.5 -132.5t134.5 -55.5q81 0 136.5 55t55.5 133q0 80 -56.5 135t-135.5 55q-78 0 -133.5 -56t-55.5 -134z" /> +<glyph unicode="&#xa5;" d="M88 221l37 178h252l29 138h-252l39 178h196l-192 747h297l114 -590l371 590h311l-506 -747h203l-39 -178h-252l-28 -138h252l-37 -178h-252l-47 -221h-291l47 221h-252z" /> +<glyph unicode="&#xa6;" d="M455 350h219v-815h-219v815zM455 735v815h219v-815h-219z" /> +<glyph unicode="&#xa7;" horiz-adv-x="995" d="M20 55v224q172 -105 345 -105q99 0 144.5 35t45.5 92q0 39 -33 72.5t-127 79.5q-117 57 -181 131t-64 176q0 89 47.5 163t154.5 142q-42 34 -70 84.5t-28 107.5q0 149 117 234.5t313 85.5q172 0 344 -88l-82 -193q-147 84 -282 84q-144 0 -144 -106q0 -43 40.5 -76 t127.5 -72q242 -106 242 -303q0 -188 -193 -303q38 -35 64 -85.5t26 -108.5q0 -161 -126 -253.5t-345 -92.5q-204 0 -336 75zM393 797q0 -54 43.5 -96.5t143.5 -88.5q49 31 75.5 78.5t26.5 95.5q0 109 -176 181q-51 -25 -82 -70.5t-31 -99.5z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1135" d="M397 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM799 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M125 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5 t-80.5 303.5t-222 223.5t-307.5 83q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304zM485 721q0 225 117.5 351t325.5 126q142 0 284 -72l-75 -174q-114 58 -205 58q-111 0 -163 -73t-52 -214q0 -134 55.5 -203t159.5 -69q43 0 108.5 15.5t124.5 43.5v-191q-131 -57 -262 -57 q-196 0 -307 122.5t-111 336.5z" /> +<glyph unicode="&#xaa;" horiz-adv-x="772" d="M152 1020q0 117 46 228t123 171t177 60q120 0 180 -103h6l39 90h154l-158 -702h-154l8 92h-2q-80 -104 -202 -104q-103 0 -160 70t-57 198zM356 1014q0 -111 86 -111q45 0 84 41.5t65.5 120t26.5 154.5q0 106 -88 106q-73 0 -123.5 -96t-50.5 -215z" /> +<glyph unicode="&#xab;" horiz-adv-x="1151" d="M72 551v18l401 463l191 -155l-279 -334l135 -350l-246 -103zM559 551v18l402 463l190 -155l-279 -334l136 -350l-246 -103z" /> +<glyph unicode="&#xac;" d="M109 612v219h952v-583h-219v364h-733z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M125 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5 t-80.5 303.5t-222 223.5t-307.5 83q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304zM571 293v874h308q173 0 265.5 -67.5t92.5 -200.5q0 -86 -44 -149.5t-130 -96.5l197 -360h-254l-138 297h-67v-297h-230zM801 758h51q72 0 113 31t41 92q0 59 -35.5 88.5t-116.5 29.5h-53 v-241z" /> +<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M-6 1556l45 201h1036l-45 -201h-1036z" /> +<glyph unicode="&#xb0;" horiz-adv-x="877" d="M164 1137q0 93 46.5 173.5t127.5 126.5t172 46q93 0 173.5 -47t126.5 -127t46 -172q0 -93 -46 -173t-126 -125.5t-174 -45.5q-93 0 -173 45t-126.5 125t-46.5 174zM354 1137q0 -63 45.5 -108.5t110.5 -45.5q66 0 111 46t45 108q0 63 -45.5 110t-110.5 47t-110.5 -47.5 t-45.5 -109.5z" /> +<glyph unicode="&#xb1;" d="M109 0v219h952v-219h-952zM109 674v219h366v369h219v-369h367v-219h-367v-365h-219v365h-366z" /> +<glyph unicode="&#xb2;" horiz-adv-x="776" d="M59 586l35 166l273 219q111 91 141 122t44.5 59t14.5 56q0 42 -25.5 62t-60.5 20q-86 0 -188 -82l-100 158q74 57 156 87t192 30q123 0 196.5 -63t73.5 -160q0 -70 -22 -123t-70 -103.5t-189 -152.5l-129 -95h347l-41 -200h-648z" /> +<glyph unicode="&#xb3;" horiz-adv-x="776" d="M92 625v192q125 -72 254 -72q76 0 125 30.5t49 88.5q0 37 -26 62.5t-88 25.5h-127l34 160h90q84 0 132.5 28t48.5 85q0 40 -26 60t-71 20q-86 0 -188 -66l-82 150q142 92 313 92q130 0 206.5 -55.5t76.5 -155.5q0 -87 -51 -145.5t-166 -88.5v-4q154 -33 154 -176 q0 -131 -107 -209t-285 -78q-75 0 -145.5 15.5t-120.5 40.5z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M483 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1249" d="M-68 -492l342 1610h301l-135 -645q-16 -70 -16 -125q0 -60 31.5 -92.5t79.5 -32.5q90 0 162.5 106.5t117.5 319.5l98 469h301l-237 -1118h-229l18 176h-6q-117 -196 -266 -196q-51 0 -89.5 19.5t-58.5 47.5h-6q-8 -66 -21.5 -139t-82.5 -400h-304z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M147 1042q0 256 107.5 385t343.5 129h604v-1816h-162v1616h-166v-1616h-161v819q-62 -18 -146 -18q-216 0 -318 125t-102 376z" /> +<glyph unicode="&#xb7;" horiz-adv-x="584" d="M131 695q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" /> +<glyph unicode="&#xb8;" horiz-adv-x="420" d="M-207 -301q63 -23 125 -23q102 0 102 82q0 34 -31 56.5t-110 31.5l96 154h185l-39 -72q141 -49 141 -178q0 -116 -83 -179t-234 -63q-86 0 -152 23v168z" /> +<glyph unicode="&#xb9;" horiz-adv-x="776" d="M129 1214l399 248h207l-186 -876h-246l84 397q24 109 55 207q-16 -15 -80 -60l-131 -81z" /> +<glyph unicode="&#xba;" horiz-adv-x="754" d="M162 1038q0 197 104 319t277 122q129 0 197.5 -73.5t68.5 -211.5q0 -128 -48.5 -232.5t-132.5 -157t-196 -52.5q-134 0 -202 75t-68 211zM371 1026q0 -111 80 -111q63 0 105 85.5t42 207.5q0 107 -76 107q-64 0 -107.5 -89.5t-43.5 -199.5z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1151" d="M0 227l279 334l-136 350l246 103l203 -461v-18l-402 -463zM487 227l279 334l-135 350l246 103l202 -461v-18l-401 -463z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1804" d="M177 0l1087 1462h236l-1084 -1462h-239zM97 1214l399 248h207l-186 -876h-246l84 397q24 109 55 207q-16 -15 -80 -60l-131 -81zM844 152l31 174l475 557h260l-121 -563h119l-35 -168h-119l-32 -151h-238l33 151h-373zM1078 320h174l58 231l22 74q-13 -20 -43 -58 t-211 -247z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1804" d="M940 1l35 166l273 219q111 91 141 122t44.5 59t14.5 56q0 42 -25.5 62t-60.5 20q-86 0 -188 -82l-100 158q74 57 156 87t192 30q123 0 196.5 -63t73.5 -160q0 -70 -22 -123t-70 -103.5t-189 -152.5l-129 -95h347l-41 -200h-648zM97 1214l399 248h207l-186 -876h-246 l84 397q24 109 55 207q-16 -15 -80 -60l-131 -81zM177 0l1087 1462h236l-1084 -1462h-239z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1804" d="M310 0l1087 1462h236l-1084 -1462h-239zM905 152l31 174l475 557h260l-121 -563h119l-35 -168h-119l-32 -151h-238l33 151h-373zM1139 320h174l58 231l22 74q-13 -20 -43 -58t-211 -247zM133 625v192q125 -72 254 -72q76 0 125 30.5t49 88.5q0 37 -26 62.5t-88 25.5h-127 l34 160h90q84 0 132.5 28t48.5 85q0 40 -26 60t-71 20q-86 0 -188 -66l-82 150q142 92 313 92q130 0 206.5 -55.5t76.5 -155.5q0 -87 -51 -145.5t-166 -88.5v-4q154 -33 154 -176q0 -131 -107 -209t-285 -78q-75 0 -145.5 15.5t-120.5 40.5z" /> +<glyph unicode="&#xbf;" horiz-adv-x="940" d="M-68 -59q0 82 28.5 148.5t83.5 124t189 146.5q93 62 128 106.5t51 106.5l8 33h258l-14 -78q-19 -105 -76.5 -180t-169.5 -151q-122 -83 -156.5 -126t-34.5 -98q0 -118 133 -118q50 0 106.5 16t201.5 84l92 -221q-221 -125 -445 -125q-177 0 -280 87.5t-103 244.5z M418 924q0 86 54.5 140t143.5 54q73 0 114.5 -37t41.5 -104q0 -92 -55.5 -145.5t-149.5 -53.5q-68 0 -108.5 38t-40.5 108z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254zM539 1886v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254zM735 1579v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254zM426 1579v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254zM448 1577q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309q-49 0 -86.5 16.5 t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254zM516 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM918 1720q0 78 42 118t120 40 q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254zM585 1565q0 109 68.5 173t179.5 64q110 0 182 -65t72 -170q0 -107 -70 -173.5t-184 -66.5q-110 0 -179 63.5t-69 174.5zM737 1565 q0 -45 24 -71t72 -26q42 0 69.5 26t27.5 71t-27.5 70.5t-69.5 25.5t-69 -25.5t-27 -70.5z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1833" d="M-123 0l922 1462h1104l-54 -254h-512l-67 -321h477l-55 -254h-478l-79 -377h512l-54 -256h-817l74 348h-426l-219 -348h-328zM588 608h317l127 600h-80z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1253" d="M123 553q0 262 104 482.5t278 335t400 114.5q125 0 222 -22.5t208 -82.5l-118 -250q-106 59 -175 78t-137 19q-132 0 -237.5 -81t-169.5 -238.5t-64 -338.5q0 -167 68.5 -248t218.5 -81q146 0 338 77v-260q-199 -77 -400 -77q-254 0 -395 149.5t-141 423.5zM356 -301 q63 -23 125 -23q102 0 102 82q0 34 -31 56.5t-110 31.5l96 154h185l-39 -72q141 -49 141 -178q0 -116 -83 -179t-234 -63q-86 0 -152 23v168z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1110" d="M53 0l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512l-54 -256h-817zM480 1886v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1110" d="M53 0l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512l-54 -256h-817zM608 1579v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xca;" horiz-adv-x="1110" d="M53 0l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512l-54 -256h-817zM368 1579v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1110" d="M53 0l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512l-54 -256h-817zM438 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM840 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5 t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xcc;" horiz-adv-x="659" d="M53 0l312 1462h305l-312 -1462h-305zM241 1886v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="&#xcd;" horiz-adv-x="659" d="M53 0l312 1462h305l-312 -1462h-305zM414 1579v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xce;" horiz-adv-x="659" d="M53 0l312 1462h305l-312 -1462h-305zM128 1579v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xcf;" horiz-adv-x="659" d="M53 0l312 1462h305l-312 -1462h-305zM222 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM624 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1386" d="M37 596l55 254h139l131 612h396q270 0 417.5 -143t147.5 -410q0 -280 -98 -486.5t-283.5 -314.5t-437.5 -108h-451l125 596h-141zM412 256h106q148 0 258 76t172 223.5t62 337.5q0 154 -72.5 234.5t-208.5 80.5h-115l-75 -358h237l-55 -254h-238z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1546" d="M53 0l309 1462h357l340 -1077h4q12 76 39 217t180 860h274l-309 -1462h-342l-356 1106h-6l-4 -32q-32 -216 -66 -386l-145 -688h-275zM563 1577q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309q-49 0 -86.5 16.5 t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5q-121 0 -222 -91.5 t-158.5 -251.5t-57.5 -347zM627 1886v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5q-121 0 -222 -91.5 t-158.5 -251.5t-57.5 -347zM753 1579v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5q-121 0 -222 -91.5 t-158.5 -251.5t-57.5 -347zM499 1579v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5q-121 0 -222 -91.5 t-158.5 -251.5t-57.5 -347zM520 1577q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5q-121 0 -222 -91.5 t-158.5 -251.5t-57.5 -347zM585 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM987 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xd7;" d="M129 1024l152 154l301 -299l305 299l153 -150l-305 -305l301 -303l-149 -152l-305 301l-301 -299l-150 152l297 301z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1495" d="M100 29l121 151q-98 138 -98 357q0 265 99 487.5t273 341.5t402 119q182 0 305 -76l105 131l151 -117l-117 -145q91 -134 91 -340q0 -283 -99 -506.5t-271 -337.5t-396 -114q-180 0 -304 71l-108 -137zM424 537q0 -32 8 -101l596 754q-69 43 -158 43q-126 0 -229 -91.5 t-160 -252.5t-57 -352zM539 270q59 -37 153 -37q124 0 226 89t158.5 247.5t56.5 360.5l-5 80z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1415" d="M141 401q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5zM576 1886v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5 t-103.5 153.5z" /> +<glyph unicode="&#xda;" horiz-adv-x="1415" d="M141 401q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5zM757 1579v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5 h-209z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1415" d="M141 401q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5zM475 1579v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5 v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1415" d="M141 401q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5zM565 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5 t-121 -43.5q-135 0 -135 110zM967 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1155" d="M186 1462h312l129 -592l374 592h342l-618 -903l-119 -559h-303l119 559zM606 1579v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xde;" horiz-adv-x="1188" d="M53 0l309 1462h306l-50 -229h35q242 0 366 -106.5t124 -319.5q0 -243 -170.5 -378.5t-466.5 -135.5h-86l-62 -293h-305zM475 547h55q139 0 222.5 66.5t83.5 185.5q0 180 -195 180h-74z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1350" d="M-260 -225q61 -21 115 -21q133 0 170 178l254 1207q47 224 182 326t385 102q208 0 331 -90t123 -240q0 -114 -49 -192t-178 -152q-73 -42 -96 -68.5t-23 -54.5q0 -23 22 -49.5t79 -69.5q107 -83 144.5 -150.5t37.5 -150.5q0 -170 -123.5 -270t-337.5 -100q-187 0 -297 61 v240q128 -78 258 -78q101 0 148 33t47 86q0 40 -26.5 75t-108.5 97q-94 72 -129 130t-35 126q0 84 45 145t162 127q66 37 104.5 76t38.5 96q0 62 -39.5 98.5t-124.5 36.5q-96 0 -156 -51.5t-85 -171.5l-254 -1219q-43 -198 -147 -288.5t-277 -90.5q-90 0 -160 25v242z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234zM443 1548v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234zM598 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234zM311 1240v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234zM333 1239q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234zM397 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM799 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234zM521 1477q0 109 68.5 173t179.5 64q110 0 182 -65t72 -170q0 -107 -70 -173.5t-184 -66.5q-110 0 -179 63.5t-69 174.5zM673 1477q0 -45 24 -71t72 -26q42 0 69.5 26t27.5 71t-27.5 70.5t-69.5 25.5t-69 -25.5t-27 -70.5z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1786" d="M90 385q0 200 68.5 375.5t185 277t258.5 101.5q96 0 160.5 -38.5t114.5 -125.5h6l57 143h188l-18 -90q44 49 120.5 80t168.5 31q157 0 246.5 -83.5t89.5 -221.5q0 -187 -167 -288.5t-476 -101.5h-52l-2 -19v-19q0 -96 55.5 -147.5t159.5 -51.5q66 0 152 23t162 63v-227 q-179 -86 -361 -86q-109 0 -179.5 27t-117.5 87l-16 -94h-188l14 145h-6q-71 -88 -146.5 -126.5t-167.5 -38.5q-146 0 -227.5 109t-81.5 296zM395 399q0 -84 32.5 -130t90.5 -46q72 0 134 68t99 184.5t37 243.5q0 80 -33 128t-102 48q-68 0 -128 -69t-95 -185.5t-35 -241.5z M1073 647h45q155 0 241.5 48.5t86.5 131.5q0 95 -105 95q-88 0 -166 -80t-102 -195z" /> +<glyph unicode="&#xe7;" horiz-adv-x="989" d="M90 391q0 212 74.5 385.5t209.5 268t308 94.5q182 0 328 -72l-92 -229q-54 23 -106 40t-118 17q-85 0 -153.5 -64t-107 -175.5t-38.5 -239.5q0 -96 45.5 -144.5t126.5 -48.5q76 0 141 23.5t134 58.5v-246q-152 -79 -336 -79q-201 0 -308.5 107.5t-107.5 303.5zM184 -301 q63 -23 125 -23q102 0 102 82q0 34 -31 56.5t-110 31.5l96 154h185l-39 -72q141 -49 141 -178q0 -116 -83 -179t-234 -63q-86 0 -152 23v168z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1141" d="M90 412q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86q-210 0 -326 113t-116 319zM428 647h45q155 0 241.5 48.5 t86.5 131.5q0 95 -105 95q-88 0 -166 -80t-102 -195zM423 1548v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1141" d="M90 412q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86q-210 0 -326 113t-116 319zM428 647h45q155 0 241.5 48.5 t86.5 131.5q0 95 -105 95q-88 0 -166 -80t-102 -195zM528 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xea;" horiz-adv-x="1141" d="M90 412q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86q-210 0 -326 113t-116 319zM428 647h45q155 0 241.5 48.5 t86.5 131.5q0 95 -105 95q-88 0 -166 -80t-102 -195zM292 1241v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1141" d="M90 412q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86q-210 0 -326 113t-116 319zM428 647h45q155 0 241.5 48.5 t86.5 131.5q0 95 -105 95q-88 0 -166 -80t-102 -195zM365 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM767 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xec;" horiz-adv-x="608" d="M37 0l237 1118h301l-237 -1118h-301zM153 1548v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="&#xed;" horiz-adv-x="608" d="M37 0l237 1118h301l-237 -1118h-301zM291 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xee;" horiz-adv-x="608" d="M37 0l237 1118h301l-237 -1118h-301zM36 1241v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xef;" horiz-adv-x="608" d="M37 0l237 1118h301l-237 -1118h-301zM126 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM528 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1182" d="M72 406q0 165 64.5 301t180.5 212t265 76q83 0 151.5 -31t114.5 -94h6q-20 213 -117 310l-231 -131l-88 147l200 113q-34 34 -124 80l118 186q134 -61 232 -139l237 131l76 -152l-192 -106q81 -107 113 -235t32 -279q0 -249 -69.5 -432.5t-203.5 -283t-323 -99.5 q-216 0 -329 110t-113 316zM375 377q0 -81 39 -126.5t114 -45.5q66 0 122.5 55.5t89 148.5t32.5 193q0 77 -38.5 122.5t-108.5 45.5q-73 0 -130 -53t-88.5 -143t-31.5 -197z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1237" d="M37 0l237 1118h230l-21 -207h6q146 228 355 228q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180l-133 -637h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301zM358 1239q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16 q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1198" d="M90 410q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118t114 -325q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5zM393 410q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5q0 197 -143 197q-75 0 -134.5 -61t-97 -179 t-37.5 -243zM419 1548v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1198" d="M90 410q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118t114 -325q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5zM393 410q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5q0 197 -143 197q-75 0 -134.5 -61t-97 -179 t-37.5 -243zM571 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1198" d="M90 410q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118t114 -325q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5zM393 410q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5q0 197 -143 197q-75 0 -134.5 -61t-97 -179 t-37.5 -243zM300 1241v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1198" d="M90 410q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118t114 -325q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5zM393 410q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5q0 197 -143 197q-75 0 -134.5 -61t-97 -179 t-37.5 -243zM314 1239q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1198" d="M90 410q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118t114 -325q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5zM393 410q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5q0 197 -143 197q-75 0 -134.5 -61t-97 -179 t-37.5 -243zM386 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM788 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xf7;" d="M109 612v219h952v-219h-952zM444 373q0 76 37 113.5t103 37.5t102.5 -39t36.5 -112q0 -70 -37 -111t-102 -41t-102.5 39t-37.5 113zM444 1071q0 75 37 113.5t103 38.5q67 0 103 -40.5t36 -111.5q0 -70 -37 -110.5t-102 -40.5t-102.5 39t-37.5 112z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1198" d="M43 6l119 148q-72 107 -72 256q0 213 71.5 379.5t206.5 258t316 91.5q131 0 227 -56l70 88l145 -110l-84 -105q66 -107 66 -260q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-123 0 -225 53l-109 -135zM385 426l365 453q-35 24 -88 24q-81 0 -144.5 -62.5t-98 -169.5 t-34.5 -233v-12zM457 238q11 -8 35.5 -15.5t50.5 -7.5q114 0 193 133t79 318v16z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1237" d="M111 301q0 93 24 213l127 604h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5zM419 1548v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5 t-103.5 153.5z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1237" d="M111 301q0 93 24 213l127 604h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5zM610 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5 h-209z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1237" d="M111 301q0 93 24 213l127 604h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5zM334 1241v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25 h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1237" d="M111 301q0 93 24 213l127 604h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5zM411 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5 t-121 -43.5q-135 0 -135 110zM813 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1063" d="M-141 -233q68 -13 116 -13q84 0 147.5 48t117.5 149l26 49l-164 1118h295l56 -518q14 -122 14 -293h6q20 51 44 119.5t65 153.5l260 538h327l-680 -1278q-177 -332 -483 -332q-90 0 -147 19v240zM497 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5 h-209z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1219" d="M-68 -492l435 2048h301l-66 -307q-29 -131 -80 -280h8q131 170 283 170q150 0 232.5 -106.5t82.5 -301.5q0 -199 -69 -381t-182 -276t-250 -94q-178 0 -271 163h-8q-12 -159 -43 -295l-72 -340h-301zM420 399q0 -80 33.5 -128t105.5 -48q69 0 129 65t97.5 183.5 t37.5 247.5q0 88 -37.5 132t-103.5 44q-71 0 -130 -65t-95.5 -184.5t-36.5 -246.5z" /> +<glyph unicode="&#xff;" horiz-adv-x="1063" d="M-141 -233q68 -13 116 -13q84 0 147.5 48t117.5 149l26 49l-164 1118h295l56 -518q14 -122 14 -293h6q20 51 44 119.5t65 153.5l260 538h327l-680 -1278q-177 -332 -483 -332q-90 0 -147 19v240zM310 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5 t-121 -43.5q-135 0 -135 110zM712 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" /> +<glyph unicode="&#x131;" horiz-adv-x="608" d="M37 0l237 1118h301l-237 -1118h-301z" /> +<glyph unicode="&#x152;" horiz-adv-x="1845" d="M123 537q0 265 99 487.5t273 341.5t402 119q140 0 209 -23h809l-53 -254h-512l-68 -321h477l-55 -254h-477l-80 -377h512l-53 -256h-760q-93 -20 -180 -20q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75q88 0 158 32l194 916q-62 39 -168 39 q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347z" /> +<glyph unicode="&#x153;" horiz-adv-x="1806" d="M90 414q0 216 69 380.5t200 254.5t309 90q209 0 313 -160q154 160 399 160q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-476 -101.5h-51l-2 -21v-20q0 -91 51 -143.5t147 -52.5q87 0 158 19t172 67v-227q-93 -46 -185.5 -66t-203.5 -20q-116 0 -208 38.5t-138 106.5 q-63 -68 -147 -106.5t-207 -38.5q-187 0 -297.5 117t-110.5 317zM393 414q0 -91 36.5 -140t109.5 -49q109 0 179 134.5t70 336.5q0 96 -37 146.5t-106 50.5q-71 0 -127 -60.5t-90.5 -176.5t-34.5 -242zM1094 647h45q155 0 241 48.5t86 131.5q0 95 -104 95 q-88 0 -165.5 -78.5t-102.5 -196.5z" /> +<glyph unicode="&#x178;" horiz-adv-x="1155" d="M186 1462h312l129 -592l374 592h342l-618 -903l-119 -559h-303l119 559zM432 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM834 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5 q-135 0 -135 110z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="1135" d="M311 1241v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25h-198q-63 53 -162 168q-105 -88 -232 -168h-217z" /> +<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M532 1477q0 109 68.5 173t179.5 64q110 0 182 -65t72 -170q0 -107 -70 -173.5t-184 -66.5q-110 0 -179 63.5t-69 174.5zM684 1477q0 -45 24 -71t72 -26q42 0 69.5 26t27.5 71t-27.5 70.5t-69.5 25.5t-69 -25.5t-27 -70.5z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="1135" d="M315 1239q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177z" /> +<glyph unicode="&#x2000;" horiz-adv-x="953" /> +<glyph unicode="&#x2001;" horiz-adv-x="1907" /> +<glyph unicode="&#x2002;" horiz-adv-x="953" /> +<glyph unicode="&#x2003;" horiz-adv-x="1907" /> +<glyph unicode="&#x2004;" horiz-adv-x="635" /> +<glyph unicode="&#x2005;" horiz-adv-x="476" /> +<glyph unicode="&#x2006;" horiz-adv-x="317" /> +<glyph unicode="&#x2007;" horiz-adv-x="317" /> +<glyph unicode="&#x2008;" horiz-adv-x="238" /> +<glyph unicode="&#x2009;" horiz-adv-x="381" /> +<glyph unicode="&#x200a;" horiz-adv-x="105" /> +<glyph unicode="&#x2010;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="&#x2011;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="&#x2012;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="&#x2013;" horiz-adv-x="983" d="M41 436l49 230h852l-49 -230h-852z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M41 436l49 230h1835l-49 -230h-1835z" /> +<glyph unicode="&#x2018;" horiz-adv-x="440" d="M115 983q103 227 262 479h225q-91 -213 -194 -501h-285z" /> +<glyph unicode="&#x2019;" horiz-adv-x="440" d="M106 961q89 206 195 501h285l8 -22q-103 -227 -262 -479h-226z" /> +<glyph unicode="&#x201a;" horiz-adv-x="569" d="M-102 -264q88 207 194 502h285l8 -23q-103 -227 -262 -479h-225z" /> +<glyph unicode="&#x201c;" horiz-adv-x="887" d="M115 983q103 227 262 479h225q-91 -213 -194 -501h-285zM561 983q103 227 262 479h226q-97 -227 -195 -501h-285z" /> +<glyph unicode="&#x201d;" horiz-adv-x="887" d="M106 961q89 206 195 501h285l8 -22q-103 -227 -262 -479h-226zM553 961q23 53 46.5 111t148.5 390h284l8 -22q-103 -227 -262 -479h-225z" /> +<glyph unicode="&#x201e;" horiz-adv-x="1018" d="M-102 -264q88 207 194 502h285l8 -23q-103 -227 -262 -479h-225zM346 -264q24 57 49 118.5t146 383.5h284l9 -23q-100 -221 -263 -479h-225z" /> +<glyph unicode="&#x2022;" horiz-adv-x="739" d="M104 686q0 106 42.5 194t120 136.5t182.5 48.5q120 0 182.5 -67t62.5 -191q0 -177 -91.5 -277t-248.5 -100q-117 0 -183.5 67t-66.5 189z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1706" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM586 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM1147 115q0 90 53.5 144t150.5 54q68 0 109 -38 t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" /> +<glyph unicode="&#x202f;" horiz-adv-x="381" /> +<glyph unicode="&#x2039;" horiz-adv-x="664" d="M72 551v18l401 463l191 -155l-279 -334l135 -350l-246 -103z" /> +<glyph unicode="&#x203a;" horiz-adv-x="664" d="M0 227l279 334l-136 350l246 103l203 -461v-18l-402 -463z" /> +<glyph unicode="&#x2044;" horiz-adv-x="256" d="M-532 0l1087 1462h236l-1084 -1462h-239z" /> +<glyph unicode="&#x205f;" horiz-adv-x="476" /> +<glyph unicode="&#x2074;" horiz-adv-x="776" d="M47 737l31 174l475 557h260l-121 -563h119l-35 -168h-119l-32 -151h-238l33 151h-373zM281 905h174l58 231l22 74q-13 -20 -43 -58t-211 -247z" /> +<glyph unicode="&#x20ac;" d="M41 481l37 178h127q9 67 22 115h-125l39 176h135q87 252 250.5 393.5t374.5 141.5q100 0 179 -23t165 -80l-125 -223q-87 49 -131 63.5t-90 14.5q-97 0 -176 -74.5t-135 -212.5h348l-39 -176h-360q-11 -34 -25 -115h299l-37 -178h-280q0 -120 44.5 -181.5t147.5 -61.5 q133 0 283 63v-258q-126 -63 -330 -63q-446 0 -446 501h-152z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M106 1313v149h564v-149h-199v-572h-168v572h-197zM715 741v721h248l159 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-141l-166 529h-7l5 -111v-418h-164z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1352" d="M-219 -225q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h219l-49 -229h-220l-215 -1010q-77 -371 -403 -371q-104 0 -174 25v242zM780 0 l237 1118h301l-237 -1118h-301zM1065 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" /> +<glyph unicode="&#xfb02;" horiz-adv-x="1352" d="M-219 -225q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h219l-49 -229h-220l-215 -1010q-77 -371 -403 -371q-104 0 -174 25v242zM780 0 l330 1556h301l-330 -1556h-301z" /> +<glyph unicode="&#xfb03;" horiz-adv-x="2048" d="M-219 -225q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h395l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-79 -224 q-69 31 -134 31q-57 0 -91.5 -40t-47.5 -105l-12 -62h219l-49 -229h-219l-215 -1010q-77 -371 -404 -371q-104 0 -174 25v242q61 -21 115 -21q136 0 172 170l205 965h-396l-215 -1010q-77 -371 -403 -371q-104 0 -174 25v242zM1477 0l237 1118h301l-237 -1118h-301z M1761 1380q0 87 48 131.5t135 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-152 0 -152 123z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="2048" d="M-219 -225q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h395l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-79 -224 q-69 31 -134 31q-57 0 -91.5 -40t-47.5 -105l-12 -62h219l-49 -229h-219l-215 -1010q-77 -371 -404 -371q-104 0 -174 25v242q61 -21 115 -21q136 0 172 170l205 965h-396l-215 -1010q-77 -371 -403 -371q-104 0 -174 25v242zM1477 0l329 1556h301l-329 -1556h-301z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.ttf new file mode 100644 index 000000000000..b3eb0d312b91 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.woff new file mode 100644 index 000000000000..1712e158f24f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-bolditalic-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.eot new file mode 100644 index 000000000000..0e88f02ed40a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.svg new file mode 100644 index 000000000000..c3d6642a2c76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.svg @@ -0,0 +1,251 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 2011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansExtrabold" horiz-adv-x="1200" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="594" d="M82 1462h432l-51 -946h-330zM86 166q0 91 54 141.5t157 50.5q102 0 154.5 -50.5t52.5 -141.5q0 -90 -54.5 -140.5t-152.5 -50.5q-99 0 -155 50.5t-56 140.5z" /> +<glyph unicode="&#x22;" horiz-adv-x="1073" d="M121 1462h356l-41 -528h-274zM596 1462h356l-41 -528h-274z" /> +<glyph unicode="#" horiz-adv-x="1356" d="M37 391v254h274l31 168h-238v260h287l72 389h268l-74 -389h166l72 389h268l-73 -389h229v-260h-277l-30 -168h243v-254h-290l-74 -391h-268l73 391h-168l-71 -391h-267l72 391h-225zM578 645h165l31 168h-166z" /> +<glyph unicode="$" d="M80 1044q0 165 106 258t318 115v137h207v-135q199 -11 401 -98l-119 -285q-209 94 -377 94q-80 0 -112.5 -19.5t-32.5 -57.5q0 -33 23.5 -54.5t81.5 -48t161 -61.5q209 -74 300 -168.5t91 -243.5q0 -168 -106.5 -273t-310.5 -130v-193h-207v187q-219 10 -422 98v332 q116 -59 252 -98.5t239 -39.5q85 0 124.5 20.5t39.5 68.5q0 33 -28.5 56t-95 52t-179.5 70q-127 47 -205 105.5t-113.5 131t-35.5 180.5zM613 1462z" /> +<glyph unicode="%" horiz-adv-x="1942" d="M37 1026q0 220 98 338.5t275 118.5q175 0 278 -123t103 -334q0 -220 -99 -340.5t-282 -120.5q-172 0 -272.5 124.5t-100.5 336.5zM338 1022q0 -115 19 -166t57 -51t56.5 50t18.5 167q0 115 -18.5 166t-56.5 51q-39 0 -57.5 -52t-18.5 -165zM412 0l811 1462h297 l-811 -1462h-297zM1149 444q0 220 98 338.5t275 118.5q175 0 278 -123t103 -334q0 -219 -99.5 -339.5t-281.5 -120.5q-172 0 -272.5 124.5t-100.5 335.5zM1450 440q0 -115 19 -166t57 -51q43 0 59.5 58.5t16.5 158.5t-16.5 158.5t-59.5 58.5q-39 0 -57.5 -52t-18.5 -165z " /> +<glyph unicode="&#x26;" horiz-adv-x="1636" d="M72 406q0 262 272 401q-62 70 -96.5 148.5t-34.5 177.5q0 160 123.5 254t339.5 94q211 0 328.5 -93.5t117.5 -254.5q0 -111 -63.5 -205.5t-200.5 -177.5l199 -189q75 115 104 260h406q-30 -138 -94.5 -276.5t-145.5 -237.5l320 -307h-506l-99 102q-90 -57 -147.5 -78.5 t-129 -32.5t-163.5 -11q-158 0 -279.5 54t-186 151t-64.5 221zM475 434q0 -63 45 -103t119 -40q57 0 100 15t66 34l-248 252q-82 -61 -82 -158zM565 1120q0 -75 88 -155q57 32 87 76.5t30 91.5q0 49 -28.5 70.5t-71.5 21.5q-42 0 -73.5 -25t-31.5 -80z" /> +<glyph unicode="'" horiz-adv-x="598" d="M121 1462h356l-41 -528h-274z" /> +<glyph unicode="(" horiz-adv-x="735" d="M74 582q0 290 71 523t209 398h326q-126 -175 -194 -412t-68 -507q0 -261 66 -495.5t194 -412.5h-324q-137 158 -208.5 388t-71.5 518zM493 1485z" /> +<glyph unicode=")" horiz-adv-x="735" d="M55 1503h326q139 -166 210 -402t71 -519t-71.5 -514.5t-209.5 -391.5h-324q126 172 193 408.5t67 499.5q0 265 -66 501.5t-196 417.5zM247 1485z" /> +<glyph unicode="*" horiz-adv-x="1100" d="M45 1014l45 291l348 -101l-39 352h303l-38 -352l356 101l37 -295l-314 -21l207 -278l-260 -138l-143 283l-123 -281l-272 136l206 278z" /> +<glyph unicode="+" horiz-adv-x="1159" d="M72 588v268h372v367h269v-367h372v-268h-372v-361h-269v361h-372z" /> +<glyph unicode="," horiz-adv-x="633" d="M57 -285q29 138 58.5 309.5t40.5 274.5h342l14 -23q-97 -381 -176 -561h-279z" /> +<glyph unicode="-" horiz-adv-x="651" d="M43 393v312h565v-312h-565z" /> +<glyph unicode="." horiz-adv-x="592" d="M86 166q0 92 54.5 142t158.5 50q99 0 152 -50t53 -142q0 -90 -54.5 -140.5t-150.5 -50.5q-99 0 -156 50t-57 141z" /> +<glyph unicode="/" horiz-adv-x="905" d="M10 -20l545 1503h346l-545 -1503h-346z" /> +<glyph unicode="0" d="M72 729q0 390 130 572t398 182q261 0 394.5 -189.5t133.5 -564.5q0 -388 -130 -568.5t-398 -180.5q-262 0 -395 188.5t-133 560.5zM465 729q0 -248 31 -341t104 -93q74 0 104.5 96t30.5 338q0 243 -31 340.5t-104 97.5t-104 -94t-31 -344z" /> +<glyph unicode="1" d="M84 1053l502 409h356v-1462h-401v774q0 141 6 258q-37 -45 -92 -94l-166 -137z" /> +<glyph unicode="2" d="M45 1249q113 101 190 144.5t167.5 66.5t203.5 23q142 0 253.5 -50t173 -142.5t61.5 -207.5q0 -86 -21.5 -159t-66.5 -143.5t-119.5 -148.5t-317.5 -296v-10h553v-326h-1061v260l357 361q153 160 200 218.5t65.5 100.5t18.5 88q0 57 -37 90t-104 33q-69 0 -139.5 -39.5 t-159.5 -116.5z" /> +<glyph unicode="3" d="M70 59v328q96 -49 195.5 -72.5t183.5 -23.5q130 0 189.5 36.5t59.5 114.5q0 60 -31 92.5t-100 49t-180 16.5h-90v297h92q301 0 301 154q0 58 -44.5 86t-119.5 28q-140 0 -290 -94l-164 264q116 80 237.5 114t278.5 34q227 0 356 -90t129 -248q0 -136 -83 -233.5 t-240 -141.5v-6q366 -46 366 -346q0 -204 -161.5 -321t-448.5 -117q-118 0 -218.5 17t-217.5 62z" /> +<glyph unicode="4" d="M35 283v290l608 889h365v-884h161v-295h-161v-283h-390v283h-583zM377 578h241v170q0 48 3.5 129.5t5.5 85.5h-11q-34 -77 -77 -144z" /> +<glyph unicode="5" d="M94 59v324q87 -40 196.5 -66t188.5 -26q110 0 169 46.5t59 137.5q0 84 -60 131t-182 47q-93 0 -201 -35l-145 72l55 772h834v-329h-498l-18 -193q78 15 111 16.5t61 1.5q126 0 227.5 -58.5t158 -165.5t56.5 -247q0 -245 -147.5 -376t-446.5 -131q-256 0 -418 79z" /> +<glyph unicode="6" d="M70 618q0 306 87.5 495.5t258 279.5t420.5 90q89 0 208 -17v-309q-100 19 -217 19q-198 0 -295 -87t-106 -284h12q90 170 289 170q195 0 302.5 -125.5t107.5 -349.5q0 -241 -136 -380.5t-380 -139.5q-259 0 -405 168t-146 470zM463 512q0 -96 41 -157.5t108 -61.5 q63 0 102.5 47.5t39.5 151.5q0 178 -138 178q-68 0 -110.5 -46t-42.5 -112z" /> +<glyph unicode="7" d="M78 1133v327h1055v-233l-515 -1227h-409l502 1133h-633z" /> +<glyph unicode="8" d="M68 385q0 127 61 216.5t205 162.5q-116 78 -169.5 167.5t-53.5 196.5q0 168 131 261.5t362 93.5t359.5 -93t128.5 -264q0 -116 -60.5 -203.5t-191.5 -152.5q162 -92 228.5 -183.5t66.5 -197.5q0 -195 -141 -302t-394 -107q-258 0 -395 104.5t-137 300.5zM430 401 q0 -62 44 -99.5t122 -37.5q176 0 176 129q0 49 -38.5 96.5t-137.5 106.5q-89 -47 -127.5 -94.5t-38.5 -100.5zM481 1092q0 -86 117 -152q71 41 97 75t26 77q0 48 -35 77t-84 29q-51 0 -86 -29.5t-35 -76.5z" /> +<glyph unicode="9" d="M53 958q0 243 138.5 381t379.5 138q268 0 415 -178t147 -506q0 -429 -185 -621t-592 -192q-134 0 -204 10v313q86 -16 172 -16q212 0 327 87.5t125 276.5h-12q-39 -72 -77 -104t-93 -49t-137 -17q-190 0 -297 127t-107 350zM436 963q0 -82 35 -130.5t107 -48.5 q65 0 113 47t48 113q0 89 -44.5 153t-112.5 64q-65 0 -105.5 -47t-40.5 -151z" /> +<glyph unicode=":" horiz-adv-x="592" d="M86 166q0 92 54.5 142t158.5 50q99 0 152 -50t53 -142q0 -90 -54.5 -140.5t-150.5 -50.5q-99 0 -156 50t-57 141zM86 956q0 91 55 141t158 50q99 0 152 -50t53 -141q0 -90 -54 -141t-151 -51q-102 0 -157.5 51t-55.5 141z" /> +<glyph unicode=";" horiz-adv-x="608" d="M57 -285q29 138 58.5 309.5t40.5 274.5h342l14 -23q-97 -381 -176 -561h-279zM92 956q0 91 53.5 141t157.5 50q100 0 153.5 -50.5t53.5 -140.5t-54 -141t-153 -51q-102 0 -156.5 50.5t-54.5 141.5z" /> +<glyph unicode="&#x3c;" horiz-adv-x="1159" d="M72 627v172l1011 506v-297l-620 -283l620 -252v-295z" /> +<glyph unicode="=" horiz-adv-x="1159" d="M72 358v271h1015v-271h-1015zM72 815v268h1015v-268h-1015z" /> +<glyph unicode="&#x3e;" horiz-adv-x="1159" d="M72 178v295l620 252l-620 283v297l1011 -506v-172z" /> +<glyph unicode="?" horiz-adv-x="1034" d="M0 1341q249 142 520 142q223 0 350 -98t127 -267q0 -121 -56.5 -209.5t-180.5 -167.5q-105 -68 -131.5 -99.5t-26.5 -74.5v-51h-307v86q0 98 40 165.5t142 131.5q81 51 116.5 92t35.5 94q0 42 -38 66.5t-99 24.5q-151 0 -353 -107zM252 166q0 92 53.5 142t157.5 50 q100 0 153.5 -50.5t53.5 -141.5t-55.5 -141t-151.5 -50q-99 0 -155 49.5t-56 141.5z" /> +<glyph unicode="@" horiz-adv-x="1837" d="M82 610q0 253 114.5 453.5t316 309t456.5 108.5q234 0 413.5 -89t276 -253.5t96.5 -382.5q0 -141 -48.5 -263t-134.5 -191t-196 -69q-79 0 -143 31.5t-100 87.5h-15q-107 -119 -260 -119q-183 0 -281 107t-98 299q0 141 62 249.5t179 167t271 58.5q81 0 178.5 -16.5 t178.5 -44.5l-21 -422l-2 -94q0 -86 49 -86q52 0 84.5 87t32.5 220q0 239 -135 369t-383 130q-190 0 -330.5 -79t-214.5 -226.5t-74 -345.5q0 -255 142.5 -393.5t402.5 -138.5q116 0 250.5 25t263.5 71v-229q-224 -95 -500 -95q-388 0 -609.5 202.5t-221.5 561.5zM760 641 q0 -100 36.5 -145t96.5 -45q77 0 113 62t47 220l10 156q-40 6 -68 6q-108 0 -171.5 -67t-63.5 -187z" /> +<glyph unicode="A" horiz-adv-x="1487" d="M0 0l477 1468h527l483 -1468h-432l-72 274h-475l-74 -274h-434zM590 598h311l-63 240q-22 80 -53.5 207t-41.5 182q-9 -51 -35.5 -168t-117.5 -461z" /> +<glyph unicode="B" horiz-adv-x="1380" d="M158 0v1462h510q298 0 442.5 -88.5t144.5 -275.5q0 -123 -63 -210t-166 -112v-10q136 -36 197 -120t61 -218q0 -199 -149.5 -313.5t-407.5 -114.5h-569zM553 305h139q185 0 185 156q0 73 -49.5 112t-143.5 39h-131v-307zM553 901h119q85 0 131.5 35t46.5 104 q0 123 -186 123h-111v-262z" /> +<glyph unicode="C" horiz-adv-x="1329" d="M104 727q0 227 85.5 399t246 264.5t377.5 92.5q237 0 453 -103l-121 -311q-81 38 -162 64t-174 26q-141 0 -220 -115.5t-79 -318.5q0 -422 321 -422q97 0 188 27t183 65v-334q-183 -81 -414 -81q-331 0 -507.5 192t-176.5 555z" /> +<glyph unicode="D" horiz-adv-x="1503" d="M158 0v1462h506q352 0 543.5 -180t191.5 -520q0 -366 -201.5 -564t-566.5 -198h-473zM553 324h88q180 0 264 104.5t84 319.5q0 201 -79.5 298t-241.5 97h-115v-819z" /> +<glyph unicode="E" horiz-adv-x="1124" d="M158 0v1462h868v-317h-473v-230h438v-317h-438v-276h473v-322h-868z" /> +<glyph unicode="F" horiz-adv-x="1104" d="M158 0v1462h864v-317h-475v-279h438v-317h-438v-549h-389z" /> +<glyph unicode="G" horiz-adv-x="1516" d="M104 735q0 354 202 551t566 197q138 0 260.5 -26t213.5 -66l-125 -310q-158 78 -347 78q-173 0 -267.5 -112.5t-94.5 -321.5q0 -205 85.5 -312.5t246.5 -107.5q88 0 162 17v229h-261v305h631v-788q-257 -88 -565 -88q-338 0 -522.5 196t-184.5 559z" /> +<glyph unicode="H" horiz-adv-x="1569" d="M158 0v1462h397v-542h459v542h397v-1462h-397v596h-459v-596h-397z" /> +<glyph unicode="I" horiz-adv-x="713" d="M158 0v1462h397v-1462h-397z" /> +<glyph unicode="J" horiz-adv-x="721" d="M-162 -131q32 -6 68 -13.5t78 -7.5q98 0 140 59t42 202v1353h397v-1319q0 -297 -130 -449.5t-390 -152.5q-108 0 -205 21v307z" /> +<glyph unicode="K" horiz-adv-x="1407" d="M158 0v1462h397v-635q30 59 121 187l307 448h432l-461 -655l453 -807h-446l-289 559l-117 -70v-489h-397z" /> +<glyph unicode="L" horiz-adv-x="1192" d="M158 0v1462h395v-1143h563v-319h-958z" /> +<glyph unicode="M" horiz-adv-x="1980" d="M158 0v1462h526l305 -1038h8l299 1038h527v-1462h-363v641q0 50 1.5 111t13.5 299h-9l-295 -1051h-376l-299 1053h-9q21 -269 21 -418v-635h-350z" /> +<glyph unicode="N" horiz-adv-x="1708" d="M158 0v1462h516l532 -1016h6q-14 221 -14 355v661h352v-1462h-518l-534 1030h-9q19 -243 19 -371v-659h-350z" /> +<glyph unicode="O" horiz-adv-x="1632" d="M104 735q0 365 182.5 557.5t530.5 192.5q349 0 529 -191t180 -561q0 -369 -181 -561t-530 -192q-344 0 -527.5 193t-183.5 562zM520 733q0 -424 295 -424q150 0 222.5 103t72.5 321q0 219 -73.5 323.5t-219.5 104.5q-297 0 -297 -428z" /> +<glyph unicode="P" horiz-adv-x="1294" d="M158 0v1462h506q277 0 416 -121t139 -344q0 -245 -144.5 -378.5t-410.5 -133.5h-111v-485h-395zM553 807h72q89 0 141.5 50t52.5 138q0 148 -164 148h-102v-336z" /> +<glyph unicode="Q" horiz-adv-x="1632" d="M104 735q0 365 182.5 557.5t530.5 192.5q349 0 529 -191t180 -561q0 -497 -316 -670l357 -411h-492l-258 325l-1 1v1l-1 1q-344 0 -527.5 193t-183.5 562zM520 733q0 -424 295 -424q150 0 222.5 103t72.5 321q0 219 -73.5 323.5t-219.5 104.5q-297 0 -297 -428z" /> +<glyph unicode="R" horiz-adv-x="1386" d="M158 0v1462h479q596 0 596 -432q0 -254 -248 -393l426 -637h-448l-310 532h-100v-532h-395zM553 829h74q207 0 207 183q0 151 -203 151h-78v-334z" /> +<glyph unicode="S" horiz-adv-x="1182" d="M90 72v352q113 -58 235 -90.5t224 -32.5q88 0 129 30.5t41 78.5q0 30 -16.5 52.5t-53 45.5t-194.5 94q-143 65 -214.5 126t-106 140t-34.5 187q0 202 147 315t404 113q227 0 463 -105l-121 -305q-205 94 -354 94q-77 0 -112 -27t-35 -67q0 -43 44.5 -77t241.5 -124 q189 -85 262.5 -182.5t73.5 -245.5q0 -136 -69 -241.5t-199 -164t-305 -58.5q-146 0 -245 20.5t-206 71.5z" /> +<glyph unicode="T" horiz-adv-x="1210" d="M51 1139v323h1108v-323h-356v-1139h-395v1139h-357z" /> +<glyph unicode="U" horiz-adv-x="1550" d="M150 573v889h397v-858q0 -155 58 -225t171 -70q121 0 175.5 69.5t54.5 227.5v856h395v-880q0 -287 -162.5 -444.5t-468.5 -157.5q-299 0 -459.5 153t-160.5 440z" /> +<glyph unicode="V" horiz-adv-x="1421" d="M0 1462h444l199 -741q62 -247 68 -344q7 70 28 175t37 165l203 745h442l-479 -1462h-465z" /> +<glyph unicode="W" horiz-adv-x="2128" d="M31 1462h381l159 -733q54 -243 74 -387q13 102 46.5 277t62.5 290l129 553h366l125 -553q32 -133 65 -307t44 -260q13 111 71 385l162 735h381l-360 -1462h-467l-140 637q-10 40 -31.5 159t-31.5 199q-8 -65 -26 -161.5t-35.5 -177.5t-145.5 -656h-467z" /> +<glyph unicode="X" horiz-adv-x="1481" d="M4 0l485 748l-456 714h438l264 -452l254 452h451l-463 -745l498 -717h-457l-285 457l-282 -457h-447z" /> +<glyph unicode="Y" horiz-adv-x="1360" d="M0 1462h430l250 -542l252 542h428l-481 -891v-571h-398v559z" /> +<glyph unicode="Z" horiz-adv-x="1251" d="M61 0v244l633 899h-618v319h1108v-243l-633 -900h649v-319h-1139z" /> +<glyph unicode="[" horiz-adv-x="664" d="M117 -344v1847h499v-254h-182v-1339h182v-254h-499zM355 1485z" /> +<glyph unicode="\" horiz-adv-x="905" d="M6 1483h346l545 -1503h-346z" /> +<glyph unicode="]" horiz-adv-x="664" d="M47 -90h182v1339h-182v254h500v-1847h-500v254zM317 1485z" /> +<glyph unicode="^" horiz-adv-x="1075" d="M-16 502l440 966h170l508 -966h-295l-289 577l-124 -291l-124 -286h-286z" /> +<glyph unicode="_" horiz-adv-x="1024" d="M-4 -133h1032v-246h-1032v246z" /> +<glyph unicode="`" horiz-adv-x="1225" d="M264 1548v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="a" horiz-adv-x="1276" d="M74 346q0 181 126 269.5t365 99.5l189 6v16q0 140 -138 140q-124 0 -315 -84l-113 258q198 102 500 102q218 0 337.5 -108t119.5 -302v-743h-271l-75 150h-8q-79 -98 -161 -134t-212 -36q-160 0 -252 96t-92 270zM473 360q0 -104 111 -104q71 0 121.5 45t50.5 117v88 l-90 -4q-193 -7 -193 -142z" /> +<glyph unicode="b" horiz-adv-x="1317" d="M135 0v1556h391v-352q0 -63 -14 -217h14q57 88 131.5 127t169.5 39q185 0 293.5 -155t108.5 -429q0 -276 -109.5 -432.5t-304.5 -156.5q-63 0 -112 13.5t-87.5 37.5t-89.5 80h-24l-62 -111h-305zM526 555q0 -139 38 -199.5t124 -60.5q69 0 106 70.5t37 207.5 q0 273 -147 273q-82 0 -120 -57t-38 -179v-55z" /> +<glyph unicode="c" horiz-adv-x="1104" d="M86 561q0 282 155 437t441 155q197 0 371 -86l-115 -289q-71 31 -131 49.5t-125 18.5q-95 0 -147 -74t-52 -209q0 -272 201 -272q172 0 330 100v-311q-151 -100 -363 -100q-278 0 -421.5 150t-143.5 431z" /> +<glyph unicode="d" horiz-adv-x="1317" d="M86 565q0 276 111 432t305 156q95 0 166.5 -38t130.5 -128h8q-19 133 -19 266v303h394v-1556h-295l-84 143h-15q-101 -163 -301 -163q-121 0 -211.5 69t-140 203t-49.5 313zM481 559q0 -132 43 -201t123 -69q94 0 132.5 59t41.5 182v31q0 150 -43 213.5t-135 63.5 q-77 0 -119.5 -72.5t-42.5 -206.5z" /> +<glyph unicode="e" horiz-adv-x="1266" d="M86 559q0 287 145 440.5t414 153.5q256 0 395.5 -133.5t139.5 -384.5v-174h-699q4 -95 69.5 -149t178.5 -54q103 0 189.5 19.5t187.5 66.5v-281q-92 -47 -190 -65t-234 -18q-283 0 -439.5 150.5t-156.5 428.5zM489 707h336q-2 82 -46.5 131t-119.5 49q-69 0 -115.5 -43.5 t-54.5 -136.5z" /> +<glyph unicode="f" horiz-adv-x="846" d="M45 840v192l158 96v19q0 224 91.5 322t293.5 98q78 0 147.5 -12t161.5 -42l-84 -253q-72 20 -141 20q-45 0 -65.5 -27.5t-20.5 -89.5v-30h241v-293h-241v-840h-391v840h-150z" /> +<glyph unicode="g" horiz-adv-x="1241" d="M20 -180q0 203 252 262q-52 22 -90.5 71t-38.5 97q0 53 29 93.5t121 96.5q-88 39 -138.5 122t-50.5 202q0 185 126 287t360 102q31 0 107 -7t112 -13h395v-189l-155 -57q32 -58 32 -135q0 -183 -128.5 -284t-383.5 -101q-63 0 -100 8q-14 -26 -14 -49q0 -29 47 -44.5 t123 -15.5h188q381 0 381 -321q0 -207 -176.5 -322t-495.5 -115q-241 0 -371.5 80.5t-130.5 231.5zM350 -141q0 -48 52 -77.5t139 -29.5q142 0 227.5 35.5t85.5 91.5q0 45 -52 63.5t-149 18.5h-153q-63 0 -106.5 -29.5t-43.5 -72.5zM473 762q0 -174 121 -174q56 0 86.5 43 t30.5 129q0 176 -117 176q-121 0 -121 -174z" /> +<glyph unicode="h" horiz-adv-x="1372" d="M135 0v1556h391v-221q0 -150 -16 -342h18q56 88 133 124t179 36q190 0 295.5 -109.5t105.5 -306.5v-737h-393v618q0 228 -135 228q-96 0 -141.5 -80.5t-45.5 -267.5v-498h-391z" /> +<glyph unicode="i" horiz-adv-x="666" d="M127 1415q0 88 49 131t158 43t159 -44t50 -130q0 -172 -209 -172q-207 0 -207 172zM137 0v1133h391v-1133h-391z" /> +<glyph unicode="j" horiz-adv-x="664" d="M-104 -162q64 -18 120 -18q119 0 119 170v1143h391v-1225q0 -187 -109.5 -293.5t-310.5 -106.5q-48 0 -110.5 7.5t-99.5 17.5v305zM125 1415q0 88 49 131t158 43t159 -44t50 -130q0 -172 -209 -172q-207 0 -207 172z" /> +<glyph unicode="k" horiz-adv-x="1350" d="M135 0v1556h393v-612q0 -157 -22 -307h8q71 113 121 176l254 320h436l-393 -482l418 -651h-447l-248 406l-127 -97v-309h-393z" /> +<glyph unicode="l" horiz-adv-x="662" d="M135 0v1556h391v-1556h-391z" /> +<glyph unicode="m" horiz-adv-x="2048" d="M135 0v1133h295l49 -140h23q45 78 130.5 119t194.5 41q245 0 344 -149h31q48 70 133.5 109.5t188.5 39.5q201 0 297 -103t96 -313v-737h-391v616q0 115 -31.5 172.5t-99.5 57.5q-90 0 -132 -77t-42 -241v-528h-392v616q0 115 -30 172.5t-97 57.5q-92 0 -134 -82t-42 -268 v-496h-391z" /> +<glyph unicode="n" horiz-adv-x="1372" d="M135 0v1133h295l49 -140h23q50 80 138.5 120t203.5 40q188 0 292.5 -109t104.5 -307v-737h-391v618q0 113 -32.5 170.5t-104.5 57.5q-99 0 -143 -79t-44 -271v-496h-391z" /> +<glyph unicode="o" horiz-adv-x="1305" d="M86 569q0 277 149.5 430.5t419.5 153.5q167 0 295 -71t197.5 -203.5t69.5 -309.5q0 -278 -149.5 -433.5t-418.5 -155.5q-258 0 -410.5 159t-152.5 430zM483 569q0 -146 39 -222.5t131 -76.5q91 0 128.5 76.5t37.5 222.5q0 145 -38 219t-130 74q-90 0 -129 -73.5 t-39 -219.5z" /> +<glyph unicode="p" horiz-adv-x="1317" d="M135 -492v1625h318l55 -144h18q109 164 301 164q188 0 295 -156t107 -428q0 -274 -111.5 -431.5t-302.5 -157.5q-86 0 -154 28.5t-135 102.5h-18q18 -119 18 -148v-455h-391zM526 571q0 -146 39 -211t123 -65q75 0 109 64.5t34 213.5q0 146 -34 209.5t-113 63.5 q-86 0 -120.5 -61.5t-37.5 -182.5v-31z" /> +<glyph unicode="q" horiz-adv-x="1317" d="M86 565q0 276 110.5 432t301.5 156q205 0 309 -160h8l29 140h338v-1625h-391v469q0 34 12 166h-12q-96 -163 -299 -163q-190 0 -298 156t-108 429zM483 559q0 -148 41 -212t127 -64q89 0 129.5 55t40.5 186v47q0 150 -41 214.5t-135 64.5q-162 0 -162 -291z" /> +<glyph unicode="r" horiz-adv-x="961" d="M135 0v1133h291l61 -181h19q49 90 136.5 145.5t176.5 55.5q51 0 97 -8l22 -4l-35 -369q-48 12 -133 12q-128 0 -186 -58.5t-58 -168.5v-557h-391z" /> +<glyph unicode="s" horiz-adv-x="1092" d="M119 819q0 158 122 246t345 88q112 0 210.5 -24.5t204.5 -71.5l-106 -252q-78 35 -165 59.5t-142 24.5q-96 0 -96 -47q0 -29 33.5 -49.5t193.5 -83.5q119 -49 177.5 -96t86 -110.5t27.5 -154.5q0 -182 -124 -275t-356 -93q-126 0 -219 13.5t-190 49.5v313 q91 -40 199.5 -66t193.5 -26q127 0 127 58q0 30 -35.5 53.5t-206.5 91.5q-156 64 -218 145.5t-62 206.5z" /> +<glyph unicode="t" horiz-adv-x="942" d="M53 840v159l174 123l101 238h256v-227h278v-293h-278v-441q0 -110 106 -110q79 0 189 39v-285q-79 -34 -150.5 -48.5t-167.5 -14.5q-197 0 -284 96.5t-87 296.5v467h-137z" /> +<glyph unicode="u" horiz-adv-x="1372" d="M133 395v738h391v-619q0 -111 31.5 -168t103.5 -57q101 0 144 79.5t43 268.5v496h391v-1133h-295l-49 141h-23q-49 -78 -136.5 -119.5t-205.5 -41.5q-187 0 -291 108.5t-104 306.5z" /> +<glyph unicode="v" horiz-adv-x="1251" d="M0 1133h408l192 -670q1 -5 4 -17t6 -28.5t5.5 -35t2.5 -34.5h7q0 52 18 113l201 672h407l-432 -1133h-387z" /> +<glyph unicode="w" horiz-adv-x="1864" d="M25 1133h385l92 -435q44 -224 51 -372h6q3 92 55 350l105 457h432l96 -463q46 -221 58 -344h6q6 76 20 189.5t31 182.5l100 435h377l-311 -1133h-418l-128 540l-30 163l-20 131h-6q-49 -280 -66 -353l-115 -481h-411z" /> +<glyph unicode="x" horiz-adv-x="1290" d="M10 0l365 578l-346 555h444l172 -318l176 318h445l-355 -555l369 -578h-444l-191 344l-190 -344h-445z" /> +<glyph unicode="y" horiz-adv-x="1249" d="M-2 1133h412l192 -650q14 -51 19 -123h8q8 69 24 121l197 652h399l-448 -1205q-86 -230 -211.5 -325t-327.5 -95q-78 0 -160 17v307q53 -12 121 -12q52 0 91 20t68 56.5t62 119.5z" /> +<glyph unicode="z" horiz-adv-x="1038" d="M49 0v223l469 611h-442v299h889v-242l-449 -592h471v-299h-938z" /> +<glyph unicode="{" horiz-adv-x="887" d="M61 418v301q115 0 180.5 44.5t65.5 125.5v254q0 139 49 208t159.5 100.5t305.5 31.5v-279q-89 -3 -120.5 -13.5t-50.5 -32.5t-19 -60v-271q0 -113 -56.5 -173.5t-183.5 -78.5v-12q128 -20 184 -79t56 -167v-276q0 -39 21 -61t56 -32.5t113 -13.5v-278q-197 0 -307 32 t-158.5 101.5t-48.5 210.5v248q0 80 -67 125t-179 45z" /> +<glyph unicode="|" horiz-adv-x="1042" d="M387 -446v2002h268v-2002h-268z" /> +<glyph unicode="}" horiz-adv-x="887" d="M66 -66q108 4 149 29.5t41 77.5v276q0 108 56 167t184 79v12q-127 18 -183.5 78.5t-56.5 173.5v271q0 39 -19.5 60.5t-50 32t-120.5 13.5v279q196 0 306 -31.5t159 -100.5t49 -208v-254q0 -81 65 -125.5t180 -44.5v-301q-111 0 -178 -45t-67 -125v-248q0 -140 -49 -210 t-159 -102t-306 -32v278z" /> +<glyph unicode="~" horiz-adv-x="1159" d="M72 526v281q104 108 264 108q69 0 130 -13.5t150 -49.5q131 -55 238 -55q50 0 112.5 32t118.5 89v-281q-105 -109 -264 -109q-71 0 -133.5 15t-146.5 49q-131 55 -236 55q-110 0 -233 -121z" /> +<glyph unicode="&#xa1;" horiz-adv-x="594" d="M82 -334l51 946h330l51 -946h-432zM92 963q0 90 54 140t153 50q101 0 156 -50.5t55 -139.5q0 -91 -53.5 -142t-157.5 -51q-102 0 -154.5 50.5t-52.5 142.5z" /> +<glyph unicode="&#xa2;" d="M129 739q0 240 113 388.5t323 189.5v166h207v-154q171 -9 324 -84l-115 -289q-71 31 -131 49.5t-125 18.5q-95 0 -147 -74t-52 -209q0 -272 201 -272q172 0 330 100v-311q-127 -82 -285 -98v-180h-207v186q-212 31 -324 176t-112 397z" /> +<glyph unicode="&#xa3;" d="M102 649v277h166v118q0 215 117 328t338 113q210 0 405 -82l-110 -289q-148 55 -252 55q-58 0 -85.5 -33t-27.5 -104v-106h344v-277h-344v-96q0 -150 -159 -227h671v-326h-1061v313q81 47 109.5 76.5t41.5 67.5t13 94v98h-166z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1159" d="M96 1018l180 182l123 -123q84 41 172 41q91 0 177 -45l120 127l185 -174l-127 -125q41 -76 41 -178q0 -94 -41 -176l121 -119l-179 -178l-120 119q-89 -39 -177 -39q-100 0 -176 37l-119 -115l-178 178l123 119q-41 82 -41 174q0 89 41 176zM436 723q0 -56 40.5 -95.5 t94.5 -39.5q58 0 100 38.5t42 96.5t-42 97.5t-100 39.5q-56 0 -95.5 -40.5t-39.5 -96.5z" /> +<glyph unicode="&#xa5;" d="M8 1462h400l192 -504l193 504h399l-363 -712h195v-211h-242v-117h242v-209h-242v-213h-364v213h-246v209h246v117h-246v211h190z" /> +<glyph unicode="&#xa6;" horiz-adv-x="1042" d="M387 393h268v-839h-268v839zM387 717v839h268v-839h-268z" /> +<glyph unicode="&#xa7;" horiz-adv-x="1024" d="M106 803q0 64 43 125t121 108q-141 102 -141 246q0 137 111 216t295 79q191 0 370 -86l-98 -221q-73 40 -146.5 63t-128.5 23q-108 0 -108 -74q0 -43 45.5 -79t128.5 -70q175 -71 252.5 -152t77.5 -178q0 -77 -32 -137.5t-116 -120.5q125 -94 125 -244 q0 -149 -116.5 -237.5t-319.5 -88.5q-204 0 -352 86v244q79 -44 182 -76t172 -32q139 0 139 96q0 42 -31 72.5t-139 78.5q-141 63 -205.5 112t-96.5 108t-32 139zM397 834q0 -51 44 -91t155 -98q41 47 41 107q0 57 -42 100t-140 84q-58 -32 -58 -102z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1233" d="M223 1413q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41t-46 115zM702 1413q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1688" d="M92 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM256 731q0 -158 79.5 -295.5t215.5 -215t293 -77.5q158 0 294 78.5t215 215t79 294.5 q0 157 -77.5 293t-214 215.5t-296.5 79.5q-158 0 -294.5 -78.5t-215 -215t-78.5 -294.5zM434 735q0 217 113 340t321 123q166 0 322 -78l-92 -205q-106 56 -211 56q-81 0 -126.5 -61t-45.5 -179q0 -128 43.5 -185t134.5 -57q138 0 258 68v-231q-126 -64 -272 -64 q-212 0 -328.5 124t-116.5 349z" /> +<glyph unicode="&#xaa;" horiz-adv-x="813" d="M49 967q0 116 77 171t267 64l88 4v6q0 41 -25.5 58.5t-76.5 17.5q-57 0 -107.5 -15t-103.5 -40l-76 166q108 51 180.5 65.5t163.5 14.5q139 0 218 -75.5t79 -213.5v-449h-162l-45 127q-48 -76 -104.5 -107.5t-138.5 -31.5q-109 0 -171.5 63.5t-62.5 174.5zM301 979 q0 -32 18 -50t52 -18q50 0 80 38.5t30 97.5v22l-84 -6q-96 -6 -96 -84z" /> +<glyph unicode="&#xab;" horiz-adv-x="1395" d="M74 561v27l389 483l280 -149l-272 -347l272 -348l-280 -147zM649 561v27l387 483l283 -149l-275 -347l275 -348l-283 -147z" /> +<glyph unicode="&#xac;" horiz-adv-x="1159" d="M72 588v268h1013v-618h-270v350h-743z" /> +<glyph unicode="&#xad;" horiz-adv-x="651" d="M43 393v312h565v-312h-565z" /> +<glyph unicode="&#xae;" horiz-adv-x="1688" d="M92 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM256 731q0 -158 79.5 -295.5t215.5 -215t293 -77.5q158 0 294 78.5t215 215t79 294.5 q0 157 -77.5 293t-214 215.5t-296.5 79.5q-158 0 -294.5 -78.5t-215 -215t-78.5 -294.5zM506 313v875h291q407 0 407 -270q0 -87 -33 -146.5t-108 -95.5l194 -363h-290l-146 320h-35v-320h-280zM786 809h11q58 0 91.5 21.5t33.5 76.5q0 47 -27.5 66.5t-95.5 19.5h-13v-184z " /> +<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M-6 1556v246h1036v-246h-1036z" /> +<glyph unicode="&#xb0;" horiz-adv-x="864" d="M63 1114q0 97 49 182.5t135 136t185 50.5t185 -50.5t135 -135.5t49 -183q0 -97 -48.5 -181t-134 -133.5t-186.5 -49.5q-99 0 -185 49t-135 133t-49 182zM301 1114q0 -50 38.5 -88.5t92.5 -38.5t92.5 39t38.5 88q0 52 -37.5 92.5t-93.5 40.5t-93.5 -40.5t-37.5 -92.5z" /> +<glyph unicode="&#xb1;" horiz-adv-x="1159" d="M72 0v268h1013v-268h-1013zM72 684v268h372v367h269v-367h372v-268h-372v-360h-269v360h-372z" /> +<glyph unicode="&#xb2;" horiz-adv-x="817" d="M61 1350q80 73 167.5 104t203.5 31q142 0 219.5 -63t77.5 -175q0 -46 -13 -87t-40.5 -84.5t-74.5 -91t-198 -173.5h347v-225h-674v207l215 213q84 84 116.5 129t32.5 79q0 58 -65 58q-81 0 -172 -88z" /> +<glyph unicode="&#xb3;" horiz-adv-x="817" d="M63 1366q149 115 343 115q146 0 232.5 -57.5t86.5 -157.5q0 -78 -37 -132.5t-125 -86.5v-9q97 -24 144 -76t47 -139q0 -120 -98 -187t-277 -67q-185 0 -309 70v233q117 -81 297 -81q116 0 116 67q0 41 -32.5 56.5t-102.5 15.5h-104v194h80q71 0 105 18.5t34 59.5 q0 25 -21 46.5t-71 21.5t-94 -17t-97 -57z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1225" d="M264 1241v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1376" d="M135 -492v1625h391v-615q0 -115 33.5 -172t112.5 -57q93 0 134.5 83t41.5 265v496h393v-1133h-293l-53 152h-16q-34 -88 -90.5 -130t-122.5 -42q-56 0 -90 20t-62 63q12 -90 12 -235v-320h-391z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1317" d="M102 1042q0 256 107.5 385t343.5 129h633v-1816h-191v1587h-157v-1587h-191v819q-54 -18 -125 -18q-216 0 -318 125t-102 376z" /> +<glyph unicode="&#xb7;" horiz-adv-x="592" d="M86 723q0 92 54.5 142t158.5 50q99 0 152 -50t53 -142q0 -90 -54.5 -141.5t-150.5 -51.5q-100 0 -156.5 51t-56.5 142z" /> +<glyph unicode="&#xb8;" horiz-adv-x="383" d="M-90 -258q83 -27 147 -27q52 0 52 47q0 33 -41 58.5t-107 40.5l72 139h203l-9 -29q96 -39 133 -92.5t37 -130.5q0 -109 -75 -174.5t-199 -65.5q-136 0 -213 29v205z" /> +<glyph unicode="&#xb9;" horiz-adv-x="817" d="M57 1188l340 274h219v-876h-282v356q0 35 3.5 118t6.5 99q-9 -19 -31.5 -43t-109.5 -98z" /> +<glyph unicode="&#xba;" horiz-adv-x="803" d="M49 1104q0 177 94.5 276t259.5 99q157 0 255 -103t98 -272q0 -174 -95.5 -274.5t-261.5 -100.5q-159 0 -254.5 102.5t-95.5 272.5zM301 1104q0 -87 24 -129.5t76 -42.5q99 0 99 172q0 174 -99 174q-100 0 -100 -174z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1395" d="M76 227l272 348l-272 347l282 149l387 -483v-27l-387 -481zM649 227l275 348l-275 347l285 149l387 -483v-27l-387 -481z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1919" d="M1028 140v188l350 555h295v-542h125v-201h-125v-139h-275v139h-370zM1241 341h157v166q0 69 7 135q-40 -100 -62 -133zM357 0l753 1462h302l-754 -1462h-301zM-12 1188l340 274h219v-876h-282v356q0 35 3.5 118t6.5 99q-9 -19 -31.5 -43t-109.5 -98z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1921" d="M1140 765q80 73 167.5 104t203.5 31q142 0 219.5 -63t77.5 -175q0 -46 -13 -87t-40.5 -84.5t-74.5 -91t-198 -173.5h347v-225h-674v207l215 213q84 84 116.5 129t32.5 79q0 58 -65 58q-81 0 -172 -88zM381 0l753 1462h302l-754 -1462h-301zM-12 1188l340 274h219v-876 h-282v356q0 35 3.5 118t6.5 99q-9 -19 -31.5 -43t-109.5 -98z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1921" d="M1100 140v188l350 555h295v-542h125v-201h-125v-139h-275v139h-370zM1313 341h157v166q0 69 7 135q-40 -100 -62 -133zM83 1366q149 115 343 115q146 0 232.5 -57.5t86.5 -157.5q0 -78 -37 -132.5t-125 -86.5v-9q97 -24 144 -76t47 -139q0 -120 -98 -187t-277 -67 q-185 0 -309 70v233q117 -81 297 -81q116 0 116 67q0 41 -32.5 56.5t-102.5 15.5h-104v194h80q71 0 105 18.5t34 59.5q0 25 -21 46.5t-71 21.5t-94 -17t-97 -57zM465 0l753 1462h302l-754 -1462h-301z" /> +<glyph unicode="&#xbf;" horiz-adv-x="1034" d="M37 10q0 120 55 208t182 169q100 64 129 97t29 77v51h307v-86q0 -98 -40 -165.5t-142 -131.5q-57 -36 -90 -66t-47 -55.5t-14 -64.5q0 -42 37.5 -66t99.5 -24q148 0 352 106l139 -272q-243 -141 -520 -141q-223 0 -350 98t-127 266zM365 963q0 90 54 140t152 50 q101 0 156 -49.5t55 -140.5q0 -93 -53 -143t-158 -50q-101 0 -153.5 50t-52.5 143z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1487" d="M0 0l477 1468h527l483 -1468h-432l-72 274h-475l-74 -274h-434zM590 598h311l-63 240q-22 80 -53.5 207t-41.5 182q-9 -51 -35.5 -168t-117.5 -461zM272 1886v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1487" d="M0 0l477 1468h527l483 -1468h-432l-72 274h-475l-74 -274h-434zM590 598h311l-63 240q-22 80 -53.5 207t-41.5 182q-9 -51 -35.5 -168t-117.5 -461zM532 1579v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1487" d="M0 0l477 1468h527l483 -1468h-432l-72 274h-475l-74 -274h-434zM590 598h311l-63 240q-22 80 -53.5 207t-41.5 182q-9 -51 -35.5 -168t-117.5 -461zM295 1579v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150q-125 -107 -194 -150h-258z " /> +<glyph unicode="&#xc3;" horiz-adv-x="1487" d="M0 0l477 1468h527l483 -1468h-432l-72 274h-475l-74 -274h-434zM590 598h311l-63 240q-22 80 -53.5 207t-41.5 182q-9 -51 -35.5 -168t-117.5 -461zM330 1575q11 175 72 258.5t180 83.5q38 0 81 -15t87 -33t87 -33t81 -15q29 0 46 25t26 73h182q-11 -167 -74 -254.5 t-172 -87.5q-45 0 -90.5 15t-89.5 33t-85.5 33t-78.5 15q-54 0 -72 -98h-180z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1487" d="M0 0l477 1468h527l483 -1468h-432l-72 274h-475l-74 -274h-434zM590 598h311l-63 240q-22 80 -53.5 207t-41.5 182q-9 -51 -35.5 -168t-117.5 -461zM352 1751q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41 t-46 115zM831 1751q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1487" d="M0 0l477 1468h527l483 -1468h-432l-72 274h-475l-74 -274h-434zM590 598h311l-63 240q-22 80 -53.5 207t-41.5 182q-9 -51 -35.5 -168t-117.5 -461zM475 1614q0 116 71.5 185t192.5 69q118 0 195 -70t77 -182q0 -113 -76 -183.5t-196 -70.5q-121 0 -192.5 68.5 t-71.5 183.5zM655 1614q0 -37 21 -60.5t63 -23.5q35 0 59.5 23.5t24.5 60.5q0 38 -24.5 61t-59.5 23t-59.5 -23t-24.5 -61z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1937" d="M-10 0l628 1462h1221v-317h-473v-230h438v-317h-438v-276h473v-322h-870v274h-437l-100 -274h-442zM653 602h316v526h-111z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1329" d="M104 727q0 227 85.5 399t246 264.5t377.5 92.5q237 0 453 -103l-121 -311q-81 38 -162 64t-174 26q-141 0 -220 -115.5t-79 -318.5q0 -422 321 -422q97 0 188 27t183 65v-334q-183 -81 -414 -81q-331 0 -507.5 192t-176.5 555zM477 -258q83 -27 147 -27q52 0 52 47 q0 33 -41 58.5t-107 40.5l72 139h203l-9 -29q96 -39 133 -92.5t37 -130.5q0 -109 -75 -174.5t-199 -65.5q-136 0 -213 29v205z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1124" d="M158 0v1462h868v-317h-473v-230h438v-317h-438v-276h473v-322h-868zM154 1886v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1124" d="M158 0v1462h868v-317h-473v-230h438v-317h-438v-276h473v-322h-868zM362 1579v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xca;" horiz-adv-x="1124" d="M158 0v1462h868v-317h-473v-230h438v-317h-438v-276h473v-322h-868zM151 1579v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1124" d="M158 0v1462h868v-317h-473v-230h438v-317h-438v-276h473v-322h-868zM187 1751q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41t-46 115zM666 1751q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5 t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#xcc;" horiz-adv-x="713" d="M158 0v1462h397v-1462h-397zM-116 1886v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="&#xcd;" horiz-adv-x="713" d="M158 0v1462h397v-1462h-397zM156 1579v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xce;" horiz-adv-x="713" d="M158 0v1462h397v-1462h-397zM-95 1579v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#xcf;" horiz-adv-x="713" d="M158 0v1462h397v-1462h-397zM-55 1751q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41t-46 115zM424 1751q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5 t-45.5 114.5z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1503" d="M31 563v320h127v579h506q352 0 543.5 -180t191.5 -520q0 -366 -201.5 -564t-566.5 -198h-473v563h-127zM553 324h88q180 0 264 104.5t84 319.5q0 201 -79.5 298t-241.5 97h-115v-260h211v-320h-211v-239z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1708" d="M158 0v1462h516l532 -1016h6q-14 221 -14 355v661h352v-1462h-518l-534 1030h-9q19 -243 19 -371v-659h-350zM434 1575q11 175 72 258.5t180 83.5q38 0 81 -15t87 -33t87 -33t81 -15q29 0 46 25t26 73h182q-11 -167 -74 -254.5t-172 -87.5q-45 0 -90.5 15t-89.5 33 t-85.5 33t-78.5 15q-54 0 -72 -98h-180z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1632" d="M104 735q0 365 182.5 557.5t530.5 192.5q349 0 529 -191t180 -561q0 -369 -181 -561t-530 -192q-344 0 -527.5 193t-183.5 562zM520 733q0 -424 295 -424q150 0 222.5 103t72.5 321q0 219 -73.5 323.5t-219.5 104.5q-297 0 -297 -428zM397 1886v21h430q52 -70 203 -233 l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1632" d="M104 735q0 365 182.5 557.5t530.5 192.5q349 0 529 -191t180 -561q0 -369 -181 -561t-530 -192q-344 0 -527.5 193t-183.5 562zM520 733q0 -424 295 -424q150 0 222.5 103t72.5 321q0 219 -73.5 323.5t-219.5 104.5q-297 0 -297 -428zM583 1579v29q154 165 195.5 213 t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1632" d="M104 735q0 365 182.5 557.5t530.5 192.5q349 0 529 -191t180 -561q0 -369 -181 -561t-530 -192q-344 0 -527.5 193t-183.5 562zM520 733q0 -424 295 -424q150 0 222.5 103t72.5 321q0 219 -73.5 323.5t-219.5 104.5q-297 0 -297 -428zM363 1579v29q69 65 144.5 153 t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1632" d="M104 735q0 365 182.5 557.5t530.5 192.5q349 0 529 -191t180 -561q0 -369 -181 -561t-530 -192q-344 0 -527.5 193t-183.5 562zM520 733q0 -424 295 -424q150 0 222.5 103t72.5 321q0 219 -73.5 323.5t-219.5 104.5q-297 0 -297 -428zM401 1575q11 175 72 258.5t180 83.5 q38 0 81 -15t87 -33t87 -33t81 -15q29 0 46 25t26 73h182q-11 -167 -74 -254.5t-172 -87.5q-45 0 -90.5 15t-89.5 33t-85.5 33t-78.5 15q-54 0 -72 -98h-180z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1632" d="M104 735q0 365 182.5 557.5t530.5 192.5q349 0 529 -191t180 -561q0 -369 -181 -561t-530 -192q-344 0 -527.5 193t-183.5 562zM520 733q0 -424 295 -424q150 0 222.5 103t72.5 321q0 219 -73.5 323.5t-219.5 104.5q-297 0 -297 -428zM403 1751q0 75 46 116.5t124 41.5 q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41t-46 115zM882 1751q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#xd7;" horiz-adv-x="1159" d="M121 991l182 189l270 -267l275 267l188 -183l-274 -274l270 -272l-184 -185l-275 271l-270 -269l-180 187l264 268z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1632" d="M104 735q0 365 182.5 557.5t530.5 192.5q191 0 330 -55l76 118l190 -114l-82 -125q195 -189 195 -576q0 -369 -181 -561t-530 -192q-177 0 -307 43l-84 -132l-193 125l84 125q-211 194 -211 594zM520 733q0 -155 29 -239l403 639q-68 28 -135 28q-297 0 -297 -428z M698 324q54 -15 117 -15q150 0 222.5 103t72.5 321q0 125 -18 211z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1550" d="M150 573v889h397v-858q0 -155 58 -225t171 -70q121 0 175.5 69.5t54.5 227.5v856h395v-880q0 -287 -162.5 -444.5t-468.5 -157.5q-299 0 -459.5 153t-160.5 440zM280 1886v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="&#xda;" horiz-adv-x="1550" d="M150 573v889h397v-858q0 -155 58 -225t171 -70q121 0 175.5 69.5t54.5 227.5v856h395v-880q0 -287 -162.5 -444.5t-468.5 -157.5q-299 0 -459.5 153t-160.5 440zM561 1579v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1550" d="M150 573v889h397v-858q0 -155 58 -225t171 -70q121 0 175.5 69.5t54.5 227.5v856h395v-880q0 -287 -162.5 -444.5t-468.5 -157.5q-299 0 -459.5 153t-160.5 440zM322 1579v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150 q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1550" d="M150 573v889h397v-858q0 -155 58 -225t171 -70q121 0 175.5 69.5t54.5 227.5v856h395v-880q0 -287 -162.5 -444.5t-468.5 -157.5q-299 0 -459.5 153t-160.5 440zM362 1751q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5 q-78 0 -124 41t-46 115zM841 1751q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1360" d="M0 1462h430l250 -542l252 542h428l-481 -891v-571h-398v559zM471 1579v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xde;" horiz-adv-x="1284" d="M158 0v1462h395v-213h111q277 0 416 -121t139 -344q0 -245 -144.5 -378.5t-410.5 -133.5h-111v-272h-395zM553 594h72q89 0 141.5 50t52.5 138q0 148 -164 148h-102v-336z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1536" d="M135 0v1100q0 215 167 341t446 126q276 0 433.5 -99.5t157.5 -277.5q0 -57 -20 -103.5t-49.5 -84t-64.5 -66.5t-64.5 -52t-49.5 -41t-20 -32q0 -23 24.5 -44t93.5 -58q169 -95 228.5 -173t59.5 -202q0 -174 -115 -264t-338 -90q-136 0 -221.5 12.5t-149.5 46.5v291 q49 -30 131.5 -55t147.5 -25q61 0 99 23.5t38 62.5q0 28 -14.5 47t-50.5 42.5t-121 68.5q-126 67 -175 124.5t-49 137.5q0 122 140 218q75 52 107 91.5t32 83.5q0 51 -49.5 85t-140.5 34q-222 0 -222 -209v-1059h-391z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1276" d="M74 346q0 181 126 269.5t365 99.5l189 6v16q0 140 -138 140q-124 0 -315 -84l-113 258q198 102 500 102q218 0 337.5 -108t119.5 -302v-743h-271l-75 150h-8q-79 -98 -161 -134t-212 -36q-160 0 -252 96t-92 270zM473 360q0 -104 111 -104q71 0 121.5 45t50.5 117v88 l-90 -4q-193 -7 -193 -142zM204 1548v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1276" d="M74 346q0 181 126 269.5t365 99.5l189 6v16q0 140 -138 140q-124 0 -315 -84l-113 258q198 102 500 102q218 0 337.5 -108t119.5 -302v-743h-271l-75 150h-8q-79 -98 -161 -134t-212 -36q-160 0 -252 96t-92 270zM473 360q0 -104 111 -104q71 0 121.5 45t50.5 117v88 l-90 -4q-193 -7 -193 -142zM434 1241v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1276" d="M74 346q0 181 126 269.5t365 99.5l189 6v16q0 140 -138 140q-124 0 -315 -84l-113 258q198 102 500 102q218 0 337.5 -108t119.5 -302v-743h-271l-75 150h-8q-79 -98 -161 -134t-212 -36q-160 0 -252 96t-92 270zM473 360q0 -104 111 -104q71 0 121.5 45t50.5 117v88 l-90 -4q-193 -7 -193 -142zM197 1238v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1276" d="M74 346q0 181 126 269.5t365 99.5l189 6v16q0 140 -138 140q-124 0 -315 -84l-113 258q198 102 500 102q218 0 337.5 -108t119.5 -302v-743h-271l-75 150h-8q-79 -98 -161 -134t-212 -36q-160 0 -252 96t-92 270zM473 360q0 -104 111 -104q71 0 121.5 45t50.5 117v88 l-90 -4q-193 -7 -193 -142zM244 1237q11 175 72 258.5t180 83.5q38 0 81 -15t87 -33t87 -33t81 -15q29 0 46 25t26 73h182q-11 -167 -74 -254.5t-172 -87.5q-45 0 -90.5 15t-89.5 33t-85.5 33t-78.5 15q-54 0 -72 -98h-180z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1276" d="M74 346q0 181 126 269.5t365 99.5l189 6v16q0 140 -138 140q-124 0 -315 -84l-113 258q198 102 500 102q218 0 337.5 -108t119.5 -302v-743h-271l-75 150h-8q-79 -98 -161 -134t-212 -36q-160 0 -252 96t-92 270zM473 360q0 -104 111 -104q71 0 121.5 45t50.5 117v88 l-90 -4q-193 -7 -193 -142zM268 1413q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41t-46 115zM747 1413q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5 t-45.5 114.5z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1276" d="M74 346q0 181 126 269.5t365 99.5l189 6v16q0 140 -138 140q-124 0 -315 -84l-113 258q198 102 500 102q218 0 337.5 -108t119.5 -302v-743h-271l-75 150h-8q-79 -98 -161 -134t-212 -36q-160 0 -252 96t-92 270zM473 360q0 -104 111 -104q71 0 121.5 45t50.5 117v88 l-90 -4q-193 -7 -193 -142zM389 1489q0 116 71.5 185t192.5 69q118 0 195 -70t77 -182q0 -113 -76 -183.5t-196 -70.5q-121 0 -192.5 68.5t-71.5 183.5zM569 1489q0 -37 21 -60.5t63 -23.5q35 0 59.5 23.5t24.5 60.5q0 38 -24.5 61t-59.5 23t-59.5 -23t-24.5 -61z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1915" d="M74 352q0 345 497 363l183 6v18q0 138 -136 138q-138 0 -313 -80l-110 256q190 100 454 100q201 0 336 -94q70 49 153 71.5t199 22.5q229 0 360.5 -136.5t131.5 -383.5v-172h-696q4 -90 74 -146.5t186 -56.5q194 0 364 86v-281q-94 -48 -191 -65.5t-225 -17.5 q-280 0 -430 190q-80 -83 -141.5 -120.5t-138.5 -53.5t-197 -16q-162 0 -261 101.5t-99 270.5zM473 356q0 -100 113 -100q69 0 119.5 45t50.5 117v88l-84 -4q-106 -4 -152.5 -38.5t-46.5 -107.5zM1139 707h340q-2 82 -48 131t-116 49q-162 0 -176 -180z" /> +<glyph unicode="&#xe7;" horiz-adv-x="1104" d="M86 561q0 282 155 437t441 155q197 0 371 -86l-115 -289q-71 31 -131 49.5t-125 18.5q-95 0 -147 -74t-52 -209q0 -272 201 -272q172 0 330 100v-311q-151 -100 -363 -100q-278 0 -421.5 150t-143.5 431zM361 -258q83 -27 147 -27q52 0 52 47q0 33 -41 58.5t-107 40.5 l72 139h203l-9 -29q96 -39 133 -92.5t37 -130.5q0 -109 -75 -174.5t-199 -65.5q-136 0 -213 29v205z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1266" d="M86 559q0 287 145 440.5t414 153.5q256 0 395.5 -133.5t139.5 -384.5v-174h-699q4 -95 69.5 -149t178.5 -54q103 0 189.5 19.5t187.5 66.5v-281q-92 -47 -190 -65t-234 -18q-283 0 -439.5 150.5t-156.5 428.5zM489 707h336q-2 82 -46.5 131t-119.5 49q-69 0 -115.5 -43.5 t-54.5 -136.5zM189 1548v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1266" d="M86 559q0 287 145 440.5t414 153.5q256 0 395.5 -133.5t139.5 -384.5v-174h-699q4 -95 69.5 -149t178.5 -54q103 0 189.5 19.5t187.5 66.5v-281q-92 -47 -190 -65t-234 -18q-283 0 -439.5 150.5t-156.5 428.5zM489 707h336q-2 82 -46.5 131t-119.5 49q-69 0 -115.5 -43.5 t-54.5 -136.5zM471 1241v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xea;" horiz-adv-x="1266" d="M86 559q0 287 145 440.5t414 153.5q256 0 395.5 -133.5t139.5 -384.5v-174h-699q4 -95 69.5 -149t178.5 -54q103 0 189.5 19.5t187.5 66.5v-281q-92 -47 -190 -65t-234 -18q-283 0 -439.5 150.5t-156.5 428.5zM489 707h336q-2 82 -46.5 131t-119.5 49q-69 0 -115.5 -43.5 t-54.5 -136.5zM205 1241v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1266" d="M86 559q0 287 145 440.5t414 153.5q256 0 395.5 -133.5t139.5 -384.5v-174h-699q4 -95 69.5 -149t178.5 -54q103 0 189.5 19.5t187.5 66.5v-281q-92 -47 -190 -65t-234 -18q-283 0 -439.5 150.5t-156.5 428.5zM489 707h336q-2 82 -46.5 131t-119.5 49q-69 0 -115.5 -43.5 t-54.5 -136.5zM252 1413q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41t-46 115zM731 1413q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#xec;" horiz-adv-x="666" d="M137 0v1133h391v-1133h-391zM-130 1548v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="&#xed;" horiz-adv-x="666" d="M137 0v1133h391v-1133h-391zM107 1241v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xee;" horiz-adv-x="666" d="M137 0v1133h391v-1133h-391zM-120 1241v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#xef;" horiz-adv-x="666" d="M137 0v1133h391v-1133h-391zM-61 1413q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41t-46 115zM418 1413q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5 t-45.5 114.5z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1313" d="M88 498q0 239 130.5 377.5t348.5 138.5q192 0 244 -84l8 4q-67 130 -143 207l-182 -119l-117 184l143 92l-149 93l108 182q174 -73 266 -135l209 137l115 -182l-145 -97q159 -157 226 -327.5t67 -388.5q0 -275 -152.5 -437.5t-415.5 -162.5q-259 0 -410 139t-151 379z M489 500q0 -242 164 -242q91 0 127.5 71t36.5 216q0 84 -45 136t-119 52q-92 0 -128 -56t-36 -177z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1372" d="M135 0v1133h295l49 -140h23q50 80 138.5 120t203.5 40q188 0 292.5 -109t104.5 -307v-737h-391v618q0 113 -32.5 170.5t-104.5 57.5q-99 0 -143 -79t-44 -271v-496h-391zM274 1237q11 175 72 258.5t180 83.5q38 0 81 -15t87 -33t87 -33t81 -15q29 0 46 25t26 73h182 q-11 -167 -74 -254.5t-172 -87.5q-45 0 -90.5 15t-89.5 33t-85.5 33t-78.5 15q-54 0 -72 -98h-180z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1305" d="M86 569q0 277 149.5 430.5t419.5 153.5q167 0 295 -71t197.5 -203.5t69.5 -309.5q0 -278 -149.5 -433.5t-418.5 -155.5q-258 0 -410.5 159t-152.5 430zM483 569q0 -146 39 -222.5t131 -76.5q91 0 128.5 76.5t37.5 222.5q0 145 -38 219t-130 74q-90 0 -129 -73.5 t-39 -219.5zM175 1548v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1305" d="M86 569q0 277 149.5 430.5t419.5 153.5q167 0 295 -71t197.5 -203.5t69.5 -309.5q0 -278 -149.5 -433.5t-418.5 -155.5q-258 0 -410.5 159t-152.5 430zM483 569q0 -146 39 -222.5t131 -76.5q91 0 128.5 76.5t37.5 222.5q0 145 -38 219t-130 74q-90 0 -129 -73.5 t-39 -219.5zM416 1241v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1305" d="M86 569q0 277 149.5 430.5t419.5 153.5q167 0 295 -71t197.5 -203.5t69.5 -309.5q0 -278 -149.5 -433.5t-418.5 -155.5q-258 0 -410.5 159t-152.5 430zM483 569q0 -146 39 -222.5t131 -76.5q91 0 128.5 76.5t37.5 222.5q0 145 -38 219t-130 74q-90 0 -129 -73.5 t-39 -219.5zM199 1241v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1305" d="M86 569q0 277 149.5 430.5t419.5 153.5q167 0 295 -71t197.5 -203.5t69.5 -309.5q0 -278 -149.5 -433.5t-418.5 -155.5q-258 0 -410.5 159t-152.5 430zM483 569q0 -146 39 -222.5t131 -76.5q91 0 128.5 76.5t37.5 222.5q0 145 -38 219t-130 74q-90 0 -129 -73.5 t-39 -219.5zM231 1237q11 175 72 258.5t180 83.5q38 0 81 -15t87 -33t87 -33t81 -15q29 0 46 25t26 73h182q-11 -167 -74 -254.5t-172 -87.5q-45 0 -90.5 15t-89.5 33t-85.5 33t-78.5 15q-54 0 -72 -98h-180z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1305" d="M86 569q0 277 149.5 430.5t419.5 153.5q167 0 295 -71t197.5 -203.5t69.5 -309.5q0 -278 -149.5 -433.5t-418.5 -155.5q-258 0 -410.5 159t-152.5 430zM483 569q0 -146 39 -222.5t131 -76.5q91 0 128.5 76.5t37.5 222.5q0 145 -38 219t-130 74q-90 0 -129 -73.5 t-39 -219.5zM239 1413q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41t-46 115zM718 1413q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#xf7;" horiz-adv-x="1159" d="M72 588v268h1013v-268h-1013zM422 332q0 82 39.5 126t116.5 44q75 0 116 -43.5t41 -126.5q0 -80 -43.5 -125t-113.5 -45q-71 0 -113.5 44t-42.5 126zM422 1112q0 82 39.5 126t116.5 44q75 0 116 -43.5t41 -126.5q0 -80 -43.5 -125t-113.5 -45q-71 0 -113.5 44t-42.5 126z " /> +<glyph unicode="&#xf8;" horiz-adv-x="1362" d="M86 569q0 277 157 430.5t441 153.5q125 0 234 -39l71 111l168 -105l-67 -104q184 -158 184 -447q0 -280 -156.5 -434.5t-439.5 -154.5q-125 0 -229 34l-84 -131l-170 107l79 123q-188 158 -188 456zM461 569q0 -99 12 -147l289 448q-36 13 -82 13q-114 0 -166.5 -74 t-52.5 -240zM606 258q27 -8 76 -8q114 0 165.5 73t51.5 246q0 86 -10 131z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1372" d="M133 395v738h391v-619q0 -111 31.5 -168t103.5 -57q101 0 144 79.5t43 268.5v496h391v-1133h-295l-49 141h-23q-49 -78 -136.5 -119.5t-205.5 -41.5q-187 0 -291 108.5t-104 306.5zM175 1548v21h430q52 -70 203 -233l59 -66v-29h-260q-69 44 -203.5 138.5t-228.5 168.5z " /> +<glyph unicode="&#xfa;" horiz-adv-x="1372" d="M133 395v738h391v-619q0 -111 31.5 -168t103.5 -57q101 0 144 79.5t43 268.5v496h391v-1133h-295l-49 141h-23q-49 -78 -136.5 -119.5t-205.5 -41.5q-187 0 -291 108.5t-104 306.5zM471 1241v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z " /> +<glyph unicode="&#xfb;" horiz-adv-x="1372" d="M133 395v738h391v-619q0 -111 31.5 -168t103.5 -57q101 0 144 79.5t43 268.5v496h391v-1133h-295l-49 141h-23q-49 -78 -136.5 -119.5t-205.5 -41.5q-187 0 -291 108.5t-104 306.5zM230 1241v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254 q-84 48 -201 150q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1372" d="M133 395v738h391v-619q0 -111 31.5 -168t103.5 -57q101 0 144 79.5t43 268.5v496h391v-1133h-295l-49 141h-23q-49 -78 -136.5 -119.5t-205.5 -41.5q-187 0 -291 108.5t-104 306.5zM272 1413q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5 t-125.5 -42.5q-78 0 -124 41t-46 115zM751 1413q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1249" d="M-2 1133h412l192 -650q14 -51 19 -123h8q8 69 24 121l197 652h399l-448 -1205q-86 -230 -211.5 -325t-327.5 -95q-78 0 -160 17v307q53 -12 121 -12q52 0 91 20t68 56.5t62 119.5zM401 1241v29q154 165 195.5 213t68.5 86h428v-21q-80 -64 -220 -163t-212 -144h-260z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1317" d="M135 -492v2048h391v-344q0 -106 -18 -225h18q43 78 122 122t179 44q185 0 293.5 -154t108.5 -430q0 -271 -111.5 -430t-304.5 -159q-173 0 -287 129h-14l7 -60l7 -92v-449h-391zM526 571q0 -146 39 -211t123 -65q80 0 111.5 70.5t31.5 207.5q0 134 -33 203.5t-116 69.5 q-85 0 -119 -61.5t-37 -184.5v-29z" /> +<glyph unicode="&#xff;" horiz-adv-x="1249" d="M-2 1133h412l192 -650q14 -51 19 -123h8q8 69 24 121l197 652h399l-448 -1205q-86 -230 -211.5 -325t-327.5 -95q-78 0 -160 17v307q53 -12 121 -12q52 0 91 20t68 56.5t62 119.5zM216 1413q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5 t-125.5 -42.5q-78 0 -124 41t-46 115zM695 1413q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#x131;" horiz-adv-x="666" d="M137 0v1133h391v-1133h-391z" /> +<glyph unicode="&#x152;" horiz-adv-x="1960" d="M104 735q0 359 175 554.5t497 195.5q67 0 143.5 -7t106.5 -16h836v-317h-473v-230h436v-317h-436v-276h473v-322h-844q-34 -8 -110.5 -14t-133.5 -6q-319 0 -494.5 200t-175.5 555zM520 733q0 -205 64.5 -314.5t191.5 -109.5q141 0 217 43v760q-34 23 -93 36t-122 13 q-125 0 -191.5 -109.5t-66.5 -318.5z" /> +<glyph unicode="&#x153;" horiz-adv-x="2007" d="M86 569q0 277 149.5 430.5t419.5 153.5q226 0 375 -127q155 127 400 127q227 0 359 -136t132 -384v-172h-696q4 -90 74 -146.5t186 -56.5q194 0 364 86v-281q-92 -47 -187 -65t-228 -18q-238 0 -383 137q-151 -137 -402 -137q-258 0 -410.5 159t-152.5 430zM485 569 q0 -146 38 -222.5t130 -76.5q91 0 128.5 76.5t37.5 222.5q0 145 -38 219t-130 74q-89 0 -127.5 -74t-38.5 -219zM1231 707h340q-2 82 -48 131t-116 49q-162 0 -176 -180z" /> +<glyph unicode="&#x178;" horiz-adv-x="1360" d="M0 1462h430l250 -542l252 542h428l-481 -891v-571h-398v559zM268 1751q0 75 46 116.5t124 41.5q79 0 125.5 -42.5t46.5 -115.5q0 -71 -46.5 -113.5t-125.5 -42.5q-78 0 -124 41t-46 115zM747 1751q0 75 46 116.5t126 41.5t126.5 -43t46.5 -115q0 -71 -46.5 -113.5 t-126.5 -42.5q-81 0 -126.5 41.5t-45.5 114.5z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="1237" d="M164 1241v29q69 65 144.5 153t113.5 146h393q94 -137 256 -299v-29h-254q-84 48 -201 150q-125 -107 -194 -150h-258z" /> +<glyph unicode="&#x2da;" horiz-adv-x="1120" d="M293 1489q0 116 71.5 185t192.5 69q118 0 195 -70t77 -182q0 -113 -76 -183.5t-196 -70.5q-121 0 -192.5 68.5t-71.5 183.5zM473 1489q0 -37 21 -60.5t63 -23.5q35 0 59.5 23.5t24.5 60.5q0 38 -24.5 61t-59.5 23t-59.5 -23t-24.5 -61z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="1225" d="M176 1237q11 175 72 258.5t180 83.5q38 0 81 -15t87 -33t87 -33t81 -15q29 0 46 25t26 73h182q-11 -167 -74 -254.5t-172 -87.5q-45 0 -90.5 15t-89.5 33t-85.5 33t-78.5 15q-54 0 -72 -98h-180z" /> +<glyph unicode="&#x2000;" horiz-adv-x="959" /> +<glyph unicode="&#x2001;" horiz-adv-x="1919" /> +<glyph unicode="&#x2002;" horiz-adv-x="959" /> +<glyph unicode="&#x2003;" horiz-adv-x="1919" /> +<glyph unicode="&#x2004;" horiz-adv-x="639" /> +<glyph unicode="&#x2005;" horiz-adv-x="479" /> +<glyph unicode="&#x2006;" horiz-adv-x="319" /> +<glyph unicode="&#x2007;" horiz-adv-x="319" /> +<glyph unicode="&#x2008;" horiz-adv-x="239" /> +<glyph unicode="&#x2009;" horiz-adv-x="383" /> +<glyph unicode="&#x200a;" horiz-adv-x="106" /> +<glyph unicode="&#x2010;" horiz-adv-x="651" d="M43 393v312h565v-312h-565z" /> +<glyph unicode="&#x2011;" horiz-adv-x="651" d="M43 393v312h565v-312h-565z" /> +<glyph unicode="&#x2012;" horiz-adv-x="651" d="M43 393v312h565v-312h-565z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M74 414v276h876v-276h-876z" /> +<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M74 414v276h1896v-276h-1896z" /> +<glyph unicode="&#x2018;" horiz-adv-x="512" d="M20 899q100 391 177 561h278q-67 -312 -98 -583h-342z" /> +<glyph unicode="&#x2019;" horiz-adv-x="512" d="M37 877q68 317 98 583h342l15 -22q-92 -366 -177 -561h-278z" /> +<glyph unicode="&#x201a;" horiz-adv-x="633" d="M57 -285q29 138 58.5 309.5t40.5 274.5h342l14 -23q-97 -381 -176 -561h-279z" /> +<glyph unicode="&#x201c;" horiz-adv-x="1022" d="M20 899q100 391 177 561h278q-67 -312 -98 -583h-342zM530 899q100 391 177 561h278q-67 -312 -98 -583h-342z" /> +<glyph unicode="&#x201d;" horiz-adv-x="1022" d="M37 877q68 317 98 583h342l15 -22q-92 -366 -177 -561h-278zM547 877q68 317 98 583h342l14 -22q-93 -371 -176 -561h-278z" /> +<glyph unicode="&#x201e;" horiz-adv-x="1143" d="M57 -285q29 138 58.5 309.5t40.5 274.5h342l14 -23q-97 -381 -176 -561h-279zM567 -285q29 138 58.5 309.5t40.5 274.5h342l14 -23q-97 -381 -176 -561h-279z" /> +<glyph unicode="&#x2022;" horiz-adv-x="803" d="M74 748q0 174 84.5 267t242.5 93t243 -94.5t85 -265.5q0 -172 -87 -266.5t-241 -94.5q-155 0 -241 93t-86 268zM668 1133z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1776" d="M86 166q0 92 54.5 142t158.5 50q99 0 152 -50t53 -142q0 -90 -54.5 -140.5t-150.5 -50.5q-99 0 -156 50t-57 141zM678 166q0 92 54.5 142t158.5 50q99 0 152 -50t53 -142q0 -90 -54.5 -140.5t-150.5 -50.5q-99 0 -156 50t-57 141zM1270 166q0 92 54.5 142t158.5 50 q99 0 152 -50t53 -142q0 -90 -54.5 -140.5t-150.5 -50.5q-99 0 -156 50t-57 141z" /> +<glyph unicode="&#x202f;" horiz-adv-x="383" /> +<glyph unicode="&#x2039;" horiz-adv-x="819" d="M74 561v27l389 483l280 -149l-272 -347l272 -348l-280 -147z" /> +<glyph unicode="&#x203a;" horiz-adv-x="819" d="M76 227l272 348l-272 347l282 149l387 -483v-27l-387 -481z" /> +<glyph unicode="&#x2044;" horiz-adv-x="188" d="M-434 0l753 1462h302l-754 -1462h-301z" /> +<glyph unicode="&#x205f;" horiz-adv-x="479" /> +<glyph unicode="&#x2074;" horiz-adv-x="817" d="M29 725v188l350 555h295v-542h125v-201h-125v-139h-275v139h-370zM242 926h157v166q0 69 7 135q-40 -100 -62 -133z" /> +<glyph unicode="&#x20ac;" d="M55 467v205h129l-2 21v22l2 43h-129v205h148q51 255 212.5 387.5t413.5 132.5q180 0 349 -76l-119 -299q-120 51 -230 51q-112 0 -171.5 -53.5t-71.5 -142.5h338v-205h-353l-2 -29v-14l2 -44v1h287v-205h-264q33 -164 260 -164q145 0 266 55v-323q-102 -55 -291 -55 q-253 0 -412 126t-206 361h-156z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1577" d="M37 1286v176h536v-176h-170v-545h-196v545h-170zM645 741v721h287l137 -479l150 479h276v-721h-195v400q0 68 7 110h-9l-151 -510h-164l-143 510h-9q7 -56 7 -110v-400h-193z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1135" d="M0 1135h1135v-1135h-1135v1135z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1511" d="M973 1415q0 88 49 131t158 43t159 -44t50 -130q0 -172 -209 -172q-207 0 -207 172zM983 0v1133h391v-1133h-391zM45 840v192l158 96v19q0 224 91.5 322t293.5 98q78 0 147.5 -12t161.5 -42l-84 -253q-72 20 -141 20q-45 0 -65.5 -27.5t-20.5 -89.5v-30h241v-293h-241 v-840h-391v840h-150z" /> +<glyph unicode="&#xfb02;" horiz-adv-x="1507" d="M981 0v1556h391v-1556h-391zM45 840v192l158 96v19q0 224 91.5 322t293.5 98q78 0 147.5 -12t161.5 -42l-84 -253q-72 20 -141 20q-45 0 -65.5 -27.5t-20.5 -89.5v-30h241v-293h-241v-840h-391v840h-150z" /> +<glyph unicode="&#xfb03;" horiz-adv-x="2357" d="M45 840v192l158 96v19q0 224 91.5 322t293.5 98q78 0 147.5 -12t161.5 -42l-84 -253q-72 20 -141 20q-45 0 -65.5 -27.5t-20.5 -89.5v-30h241v-293h-241v-840h-391v840h-150zM891 840v192l158 96v19q0 224 91.5 322t293.5 98q78 0 147.5 -12t161.5 -42l-84 -253 q-72 20 -141 20q-45 0 -65.5 -27.5t-20.5 -89.5v-30h241v-293h-241v-840h-391v840h-150zM1819 1415q0 88 49 131t158 43t159 -44t50 -130q0 -172 -209 -172q-207 0 -207 172zM1829 0v1133h391v-1133h-391z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="2353" d="M45 840v192l158 96v19q0 224 91.5 322t293.5 98q78 0 147.5 -12t161.5 -42l-84 -253q-72 20 -141 20q-45 0 -65.5 -27.5t-20.5 -89.5v-30h241v-293h-241v-840h-391v840h-150zM891 840v192l158 96v19q0 224 91.5 322t293.5 98q78 0 147.5 -12t161.5 -42l-84 -253 q-72 20 -141 20q-45 0 -65.5 -27.5t-20.5 -89.5v-30h241v-293h-241v-840h-391v840h-150zM1827 0v1556h391v-1556h-391z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.ttf new file mode 100644 index 000000000000..bec521d4688d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.woff new file mode 100644 index 000000000000..a24b2055f80e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-extrabold-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.eot new file mode 100644 index 000000000000..3593c12bed36 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.svg new file mode 100644 index 000000000000..537d20ca6ff8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.svg @@ -0,0 +1,251 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansItalic" horiz-adv-x="1128" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="530" d="M43 78q0 76 39.5 120t107.5 44q45 0 73 -27.5t28 -81.5q0 -68 -39 -115t-105 -47q-49 0 -76.5 28t-27.5 79zM172 403q49 307 176 1059h207l-274 -1059h-109z" /> +<glyph unicode="&#x22;" horiz-adv-x="791" d="M225 934l72 528h188l-153 -528h-107zM573 934l72 528h189l-154 -528h-107z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M63 430l13 129h284l101 340h-277l13 127h301l123 436h139l-125 -436h305l127 436h133l-125 -436h264l-12 -127h-291l-98 -340h285l-13 -129h-309l-125 -430h-139l129 430h-303l-127 -430h-133l121 430h-261zM500 559h303l96 340h-303z" /> +<glyph unicode="$" d="M72 176v154q82 -41 175.5 -63.5t166.5 -22.5l98 452q-139 49 -201.5 123.5t-62.5 188.5q0 159 108 255t299 113l39 176h133l-39 -178q159 -12 283 -76l-63 -135q-121 63 -248 72l-94 -440q149 -55 212.5 -125t63.5 -178q0 -162 -112.5 -263t-309.5 -123l-49 -225h-133 l49 223q-195 14 -315 72zM401 1010q0 -53 34.5 -97.5t107.5 -70.5l84 393q-108 -11 -167 -69t-59 -156zM549 250q107 13 170 75t63 154q0 54 -33 96t-114 74z" /> +<glyph unicode="%" horiz-adv-x="1624" d="M168 860q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -72t60 -205q0 -108 -32 -237.5t-82.5 -217.5t-120.5 -137t-157 -49q-109 0 -170 75t-61 220zM231 0l1086 1462h151l-1085 -1462h-152zM307 864q0 -172 107 -172q52 0 94 39.5t73.5 114t50.5 175t19 171.5 q0 166 -108 166q-66 0 -119 -63t-85 -187.5t-32 -243.5zM909 274q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -71.5t60 -204.5q0 -107 -31.5 -236t-82 -217.5t-121 -138t-156.5 -49.5q-110 0 -171 74.5t-61 219.5zM1049 279q0 -173 106 -173q65 0 117 65t86.5 198.5 t34.5 236.5q0 166 -109 166q-67 0 -119.5 -64.5t-84 -188.5t-31.5 -240z" /> +<glyph unicode="&#x26;" horiz-adv-x="1372" d="M66 342q0 148 90 257.5t303 211.5q-103 165 -103 309q0 164 106 264.5t281 100.5q149 0 236.5 -79t87.5 -212q0 -78 -32.5 -137t-87.5 -108t-127.5 -90t-153.5 -83l278 -389q127 110 199 295h168q-101 -236 -283 -412l203 -270h-201l-117 166q-120 -100 -230 -143 t-247 -43q-168 0 -269 96t-101 266zM229 354q0 -106 66.5 -170.5t175.5 -64.5q87 0 168 33t195 124l-306 433q-128 -67 -184 -116t-85.5 -107.5t-29.5 -131.5zM516 1118q0 -120 82 -235q139 71 191 110t83 85t31 104q0 77 -42.5 121.5t-123.5 44.5q-105 0 -163 -60t-58 -170 z" /> +<glyph unicode="'" horiz-adv-x="444" d="M225 934l72 528h188l-153 -528h-107z" /> +<glyph unicode="(" horiz-adv-x="584" d="M82 272q0 339 120 627t384 563h157q-246 -270 -371.5 -570t-125.5 -618q0 -339 114 -598h-131q-147 266 -147 596z" /> +<glyph unicode=")" horiz-adv-x="584" d="M-160 -324q496 551 496 1188q0 341 -113 598h131q146 -269 146 -598q0 -341 -121.5 -629.5t-382.5 -558.5h-156z" /> +<glyph unicode="*" horiz-adv-x="1130" d="M215 1194l55 154l371 -185l41 400l172 -35l-123 -383l422 18l-8 -157l-393 47l180 -383l-166 -52l-113 406l-258 -344l-116 121l309 284z" /> +<glyph unicode="+" d="M127 651v142h389v391h141v-391h390v-142h-390v-387h-141v387h-389z" /> +<glyph unicode="," horiz-adv-x="492" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129z" /> +<glyph unicode="-" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="." horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" /> +<glyph unicode="/" horiz-adv-x="717" d="M-94 0l813 1462h174l-813 -1462h-174z" /> +<glyph unicode="0" d="M121 477q0 270 82 514.5t216.5 369t307.5 124.5q365 0 365 -471q0 -295 -78.5 -539t-214 -369.5t-314.5 -125.5q-176 0 -270 127.5t-94 369.5zM293 479q0 -172 50 -264t161 -92q115 0 209 114t150.5 328t56.5 453q0 323 -203 323q-113 0 -209 -115.5t-155.5 -323 t-59.5 -423.5z" /> +<glyph unicode="1" d="M303 1178l449 284h149l-313 -1462h-172l196 913q59 261 88 359q-50 -53 -139 -111l-178 -110z" /> +<glyph unicode="2" d="M12 0l31 147l465 420q102 93 176.5 163.5t123 133t72 124t23.5 136.5q0 99 -60 157t-163 58q-77 0 -150.5 -28.5t-162.5 -96.5l-82 115q191 154 413 154q176 0 278.5 -88.5t102.5 -243.5q0 -111 -39.5 -204t-131 -197t-294.5 -281l-352 -307v-8h678l-29 -154h-899z" /> +<glyph unicode="3" d="M47 59v164q94 -49 199 -75.5t190 -26.5q162 0 252 79.5t90 217.5q0 131 -79 198.5t-220 67.5h-131l31 143h139q165 0 274 87t109 227q0 92 -58 146t-157 54q-80 0 -157 -27t-175 -93l-80 118q195 144 424 144q179 0 277 -87t98 -237q0 -156 -101 -264.5t-280 -140.5v-9 q124 -23 195 -106.5t71 -208.5q0 -133 -62 -234.5t-181 -158.5t-283 -57q-210 0 -385 79z" /> +<glyph unicode="4" d="M16 334l29 158l834 978h196l-207 -983h232l-33 -153h-233l-72 -334h-164l74 334h-656zM219 487h486q46 220 78 373t116 445h-8q-17 -29 -66.5 -96.5t-72.5 -96.5z" /> +<glyph unicode="5" d="M80 59v164q164 -102 334 -102q191 0 298 96t107 268q0 126 -73.5 199.5t-204.5 73.5q-48 0 -97 -6.5t-139 -30.5l-74 57l197 684h668l-33 -153h-522l-127 -439q87 23 184 23q182 0 289.5 -104.5t107.5 -282.5q0 -161 -73 -283t-204 -182.5t-308 -60.5q-193 0 -330 79z " /> +<glyph unicode="6" d="M133 424q0 209 60.5 415t163.5 351.5t246 219t327 73.5q111 0 184 -23l-35 -145q-68 22 -170 22q-212 0 -356.5 -149t-212.5 -443h8q59 79 146.5 126t193.5 47q154 0 244 -98.5t90 -270.5q0 -161 -66.5 -294.5t-180.5 -204t-261 -70.5q-182 0 -281.5 115t-99.5 329z M299 416q0 -137 60.5 -216t172.5 -79q94 0 167.5 54t114 149t40.5 208q0 248 -221 248q-66 0 -128 -28.5t-110 -76t-72 -104.5t-24 -155z" /> +<glyph unicode="7" d="M174 0l768 1313h-719l31 149h891l-27 -139l-764 -1323h-180z" /> +<glyph unicode="8" d="M96 346q0 148 95 256t296 184q-95 69 -135.5 144.5t-40.5 171.5q0 111 54.5 198.5t153.5 136t222 48.5q174 0 271.5 -86.5t97.5 -235.5q0 -129 -78 -225t-266 -176q127 -78 180 -165t53 -202q0 -122 -60 -217.5t-172.5 -146.5t-264.5 -51q-190 0 -298 98.5t-108 267.5z M270 354q0 -107 69 -170t181 -63q139 0 222 74t83 196q0 99 -52 174t-165 135q-185 -60 -261.5 -143.5t-76.5 -202.5zM479 1100q0 -82 39 -144t127 -116q161 60 228 131.5t67 173.5q0 90 -57.5 143t-153.5 53q-114 0 -182 -65.5t-68 -175.5z" /> +<glyph unicode="9" d="M98 14v158q134 -47 246 -47q202 0 327 141t189 441h-10q-51 -75 -132.5 -118.5t-180.5 -43.5q-169 0 -261 98.5t-92 288.5q0 153 64.5 280.5t180 199t259.5 71.5q180 0 279.5 -114.5t99.5 -334.5q0 -194 -56 -406.5t-147.5 -360t-221.5 -217.5t-302 -70q-136 0 -242 34z M350 938q0 -124 54.5 -190t162.5 -66q76 0 140 28.5t108.5 81.5t65 114t20.5 151q0 131 -59 207.5t-160 76.5q-150 0 -241 -113t-91 -290z" /> +<glyph unicode=":" horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" /> +<glyph unicode=";" horiz-adv-x="518" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" /> +<glyph unicode="&#x3c;" d="M121 664v98l919 479v-149l-747 -371l747 -328v-151z" /> +<glyph unicode="=" d="M127 444v142h920v-142h-920zM127 858v139h920v-139h-920z" /> +<glyph unicode="&#x3e;" d="M121 242v151l745 328l-745 371v149l919 -479v-98z" /> +<glyph unicode="?" horiz-adv-x="874" d="M158 74q0 77 40 122.5t111 45.5q44 0 70.5 -26t26.5 -79q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26t-27 77zM197 1382q92 51 192 76t182 25q167 0 259 -84t92 -238q0 -123 -65.5 -226.5t-225.5 -223.5q-125 -91 -169 -147.5t-67 -160.5h-135q22 130 72.5 213.5 t165.5 174.5q128 100 168 144t63 94t23 112q0 93 -51.5 143.5t-147.5 50.5q-81 0 -155 -25.5t-140 -56.5z" /> +<glyph unicode="@" horiz-adv-x="1735" d="M111 504q0 261 126.5 485.5t343.5 347.5t486 123q191 0 329 -75.5t210.5 -213.5t72.5 -319q0 -179 -55 -324t-155 -227t-222 -82q-197 0 -213 184h-8q-111 -184 -291 -184q-115 0 -180.5 75.5t-65.5 209.5q0 157 68 284t188.5 199t260.5 72q65 0 127.5 -12t150.5 -48 q-64 -242 -98 -368t-31 -172q0 -117 102 -117q78 0 141.5 67t100.5 183.5t37 243.5q0 239 -128 367t-370 128q-228 0 -406.5 -107t-277 -295.5t-98.5 -416.5q0 -270 143.5 -418.5t409.5 -148.5q197 0 420 86v-127q-219 -90 -443 -90q-314 0 -494.5 184.5t-180.5 505.5z M639 518q0 -93 33 -134.5t98 -41.5q187 0 272 315l70 258q-63 23 -127 23q-94 0 -174 -55t-126 -153t-46 -212z" /> +<glyph unicode="A" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474z" /> +<glyph unicode="B" horiz-adv-x="1225" d="M86 0l309 1462h375q432 0 432 -336q0 -141 -87 -238t-245 -126v-10q115 -32 176.5 -110.5t61.5 -188.5q0 -212 -152 -332.5t-407 -120.5h-463zM287 145h266q181 0 278 80.5t97 227.5q0 116 -74.5 177.5t-214.5 61.5h-236zM434 836h248q156 0 249 73t93 199 q0 104 -66.5 155.5t-209.5 51.5h-211z" /> +<glyph unicode="C" horiz-adv-x="1198" d="M150 537q0 261 105.5 485.5t283.5 342.5t403 118q197 0 348 -80l-69 -141q-138 69 -279 69q-174 0 -311.5 -97t-218 -284.5t-80.5 -408.5q0 -187 97.5 -298.5t268.5 -111.5q139 0 322 57v-149q-86 -31 -164 -45t-188 -14q-242 0 -380 149.5t-138 407.5z" /> +<glyph unicode="D" horiz-adv-x="1364" d="M86 0l309 1462h342q276 0 419.5 -149.5t143.5 -435.5q0 -261 -105 -461t-300 -308t-457 -108h-352zM287 147h162q202 0 355 91.5t234.5 258.5t81.5 382t-103 325.5t-302 110.5h-178z" /> +<glyph unicode="E" horiz-adv-x="1047" d="M86 0l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565l-33 -152h-735z" /> +<glyph unicode="F" horiz-adv-x="967" d="M86 0l309 1462h735l-30 -153h-568l-110 -533h528l-32 -153h-529l-131 -623h-172z" /> +<glyph unicode="G" horiz-adv-x="1386" d="M150 528q0 269 101.5 489.5t281.5 343t399 122.5q117 0 219.5 -20t206.5 -64l-66 -152q-77 34 -165.5 59t-194.5 25q-169 0 -307.5 -101.5t-215.5 -283.5t-77 -407q0 -190 102.5 -299t286.5 -109q154 0 260 39l96 444h-289l33 152h459l-154 -711q-216 -75 -419 -75 q-264 0 -410.5 144.5t-146.5 403.5z" /> +<glyph unicode="H" horiz-adv-x="1389" d="M86 0l309 1462h170l-131 -622h660l133 622h168l-310 -1462h-167l143 688h-660l-145 -688h-170z" /> +<glyph unicode="I" horiz-adv-x="559" d="M86 0l311 1462h168l-311 -1462h-168z" /> +<glyph unicode="J" horiz-adv-x="547" d="M-319 -360l6 147q69 -20 145 -20q100 0 165.5 62.5t90.5 182.5l307 1450h170l-309 -1468q-79 -379 -422 -379q-105 0 -153 25z" /> +<glyph unicode="K" horiz-adv-x="1141" d="M86 0l309 1462h170l-151 -710l700 710h209l-639 -637l350 -825h-186q-72 181 -146.5 359.5t-146.5 361.5l-174 -131l-125 -590h-170z" /> +<glyph unicode="L" horiz-adv-x="971" d="M86 0l309 1462h170l-276 -1308h565l-33 -154h-735z" /> +<glyph unicode="M" horiz-adv-x="1714" d="M84 0l309 1462h244l149 -1204h9l659 1204h266l-303 -1462h-174q126 590 193 905.5t94 392.5h-6l-717 -1298h-131l-166 1296h-8q-7 -72 -28.5 -197.5t-37.5 -199.5l-190 -899h-162z" /> +<glyph unicode="N" horiz-adv-x="1438" d="M84 0l309 1462h180l459 -1220h6q30 224 72 405l174 815h164l-309 -1462h-181l-460 1223h-6q-32 -221 -74 -418l-172 -805h-162z" /> +<glyph unicode="O" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403q0 199 -94 310.5t-261 111.5q-157 0 -281 -101 t-192.5 -281t-68.5 -398z" /> +<glyph unicode="P" horiz-adv-x="1159" d="M86 0l309 1462h330q214 0 324 -94.5t110 -282.5q0 -248 -164 -379t-481 -131h-135l-123 -575h-170zM410 721h133q216 0 328 91t112 267q0 125 -69.5 180.5t-213.5 55.5h-163z" /> +<glyph unicode="Q" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -333 -139 -576t-375 -321l274 -358h-219l-227 330l-17 -2h-16q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q158 0 279 100t187.5 280.5t66.5 399.5q0 199 -94 310.5 t-261 111.5q-157 0 -281 -101t-192.5 -281t-68.5 -398z" /> +<glyph unicode="R" horiz-adv-x="1165" d="M86 0l309 1462h320q446 0 446 -366q0 -348 -368 -449l239 -647h-186l-209 608h-252l-129 -608h-170zM416 754h168q193 0 297 85t104 244q0 121 -67.5 175.5t-219.5 54.5h-166q-102 -494 -116 -559z" /> +<glyph unicode="S" horiz-adv-x="1028" d="M39 43v170q162 -84 340 -84q162 0 257 75.5t95 207.5q0 78 -52.5 137.5t-195.5 140.5q-151 85 -209.5 170t-58.5 201q0 187 132 304.5t347 117.5q99 0 184.5 -19t180.5 -65l-66 -150q-66 38 -148 60t-151 22q-134 0 -215.5 -69.5t-81.5 -188.5q0 -54 17 -92.5t54 -72.5 t142 -95q147 -88 198.5 -138t78 -110.5t26.5 -140.5q0 -211 -140.5 -327.5t-395.5 -116.5q-106 0 -186.5 14.5t-151.5 48.5z" /> +<glyph unicode="T" horiz-adv-x="1020" d="M186 1311l33 151h985l-30 -151h-408l-279 -1311h-172l277 1311h-406z" /> +<glyph unicode="U" horiz-adv-x="1384" d="M164 383q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299z" /> +<glyph unicode="V" horiz-adv-x="1122" d="M188 1462h170l97 -930q20 -196 20 -335h4q61 144 162 338l479 927h191l-781 -1462h-180z" /> +<glyph unicode="W" horiz-adv-x="1745" d="M223 1462h170l31 -901l2 -88q0 -98 -10 -258h6q89 243 156 383l405 864h178l43 -860q9 -153 9 -304l-1 -83h9q75 224 131 354l387 893h182l-664 -1462h-170l-49 965q-8 136 -8 282h-6q-25 -72 -61 -154.5t-504 -1092.5h-174z" /> +<glyph unicode="X" horiz-adv-x="1063" d="M-104 0l596 776l-263 686h172l203 -563l443 563h186l-555 -694l278 -768h-180l-213 641l-481 -641h-186z" /> +<glyph unicode="Y" horiz-adv-x="1030" d="M188 1462h170l179 -747l489 747h193l-627 -921l-113 -541h-172l119 549z" /> +<glyph unicode="Z" horiz-adv-x="1087" d="M-16 0l28 137l924 1170h-655l32 155h858l-26 -139l-924 -1169h697l-33 -154h-901z" /> +<glyph unicode="[" horiz-adv-x="586" d="M-16 -324l381 1786h387l-31 -141h-227l-318 -1503h227l-32 -142h-387z" /> +<glyph unicode="\" horiz-adv-x="717" d="M221 1462h154l217 -1462h-154z" /> +<glyph unicode="]" horiz-adv-x="586" d="M-150 -324l31 142h225l320 1503h-227l30 141h389l-380 -1786h-388z" /> +<glyph unicode="^" horiz-adv-x="1059" d="M53 553l598 920h109l266 -920h-145l-201 747l-467 -747h-160z" /> +<glyph unicode="_" horiz-adv-x="807" d="M-188 -324l30 140h811l-30 -140h-811z" /> +<glyph unicode="`" horiz-adv-x="1135" d="M575 1548v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="a" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310z" /> +<glyph unicode="b" horiz-adv-x="1182" d="M59 0l330 1556h168q-51 -242 -78.5 -370.5t-75.5 -300.5h9q93 118 183.5 173.5t186.5 55.5q141 0 220 -99t79 -272q0 -209 -68.5 -386.5t-191 -277t-276.5 -99.5q-97 0 -170.5 51t-110.5 139h-10l-70 -170h-125zM319 346q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81 t137.5 230.5t52 317.5q0 227 -178 227q-96 0 -195.5 -95t-158 -239t-58.5 -295z" /> +<glyph unicode="c" horiz-adv-x="922" d="M98 389q0 200 74 369t204.5 263.5t293.5 94.5q137 0 268 -51l-47 -141q-120 51 -219 51q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -128 66.5 -199t183.5 -71q72 0 136 20t126 47v-143q-124 -63 -276 -63q-194 0 -301 107t-107 302z" /> +<glyph unicode="d" horiz-adv-x="1182" d="M98 350q0 214 72 392t194.5 275t274.5 97q194 0 281 -190h10q17 155 45 274l78 358h166l-330 -1556h-139l22 209h-8q-101 -125 -189 -177t-182 -52q-139 0 -217 98t-78 272zM270 346q0 -227 179 -227q94 0 194 93.5t158.5 239t58.5 296.5q0 111 -54 169t-157 58 q-101 0 -187.5 -82.5t-139 -232t-52.5 -314.5z" /> +<glyph unicode="e" horiz-adv-x="1010" d="M98 391q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5q-184 0 -289 109t-105 302zM299 618h12 q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35q-103 0 -193.5 -94t-138.5 -261z" /> +<glyph unicode="f" horiz-adv-x="641" d="M-229 -330q64 -22 112 -22q76 0 117 62t66 177l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h238l-25 -127h-237l-232 -1098q-39 -189 -120 -276 t-213 -87q-69 0 -125 21v141z" /> +<glyph unicode="g" horiz-adv-x="1026" d="M-127 -211q0 105 72 182t233 131q-78 41 -78 121q0 69 51 118.5t142 92.5q-63 32 -103 94.5t-40 145.5q0 194 119.5 318t305.5 124q78 0 154 -20h371l-25 -107l-211 -24q41 -62 41 -158q0 -191 -116.5 -304.5t-311.5 -113.5q-55 0 -84 8q-139 -53 -139 -131 q0 -41 33 -54.5t96 -21.5l117 -14q181 -22 262.5 -88t81.5 -194q0 -184 -146 -285t-411 -101q-194 0 -304 73.5t-110 207.5zM35 -195q0 -77 65 -122t193 -45q182 0 284.5 63.5t102.5 179.5q0 62 -54 98t-184 50l-159 16q-120 -25 -184 -88t-64 -152zM313 680 q0 -85 45 -129.5t125 -44.5q79 0 138 42t90.5 115.5t31.5 159.5q0 82 -44 125t-126 43q-78 0 -136.5 -40.5t-91 -113t-32.5 -157.5z" /> +<glyph unicode="h" horiz-adv-x="1182" d="M59 0l330 1556h168q-18 -82 -34.5 -159t-34 -156.5t-38 -166.5t-47.5 -189h11q94 123 185.5 176t191.5 53q131 0 202.5 -72t71.5 -204q0 -62 -23 -166q-39 -193 -145 -672h-168l148 692q18 94 18 135q0 148 -147 148q-89 0 -173.5 -59t-149 -171.5t-97.5 -271.5 l-101 -473h-168z" /> +<glyph unicode="i" horiz-adv-x="520" d="M59 0l234 1096h168l-234 -1096h-168zM340 1376q0 56 32 91.5t83 35.5q88 0 88 -90q0 -55 -33.5 -93t-77.5 -38q-40 0 -66 24.5t-26 69.5z" /> +<glyph unicode="j" horiz-adv-x="520" d="M-258 -330q61 -22 119 -22q125 0 168 205l264 1243h166l-266 -1258q-36 -171 -114.5 -250.5t-213.5 -79.5q-69 0 -123 21v141zM340 1376q0 56 32 91.5t83 35.5q86 0 86 -90q0 -55 -33.5 -93t-77.5 -38q-38 0 -64 24.5t-26 69.5z" /> +<glyph unicode="k" horiz-adv-x="999" d="M57 0l330 1556h170l-129 -602q-57 -266 -102 -395h4l526 537h201l-469 -467l295 -629h-187l-235 524l-152 -123l-82 -401h-170z" /> +<glyph unicode="l" horiz-adv-x="520" d="M57 0l332 1556h168l-332 -1556h-168z" /> +<glyph unicode="m" horiz-adv-x="1786" d="M59 0l234 1096h139l-22 -203h10q87 119 173.5 171t178.5 52q113 0 174 -65t72 -181h8q86 125 183 185.5t196 60.5q127 0 196.5 -68t69.5 -198q0 -68 -22 -178l-144 -672h-170l148 692q20 104 20 146q0 62 -34.5 99.5t-108.5 37.5q-81 0 -160 -58t-138.5 -164.5 t-90.5 -252.5l-107 -500h-168l148 692q18 94 18 135q0 70 -31 109t-106 39q-84 0 -163.5 -60t-140 -171.5t-93.5 -268.5l-101 -475h-168z" /> +<glyph unicode="n" horiz-adv-x="1182" d="M59 0l234 1096h139l-22 -203h10q96 122 185.5 172.5t185.5 50.5q127 0 200.5 -69.5t73.5 -194.5q0 -79 -23 -180l-143 -672h-170l148 692q20 104 20 144q0 63 -35.5 101t-113.5 38q-89 0 -173.5 -60t-149 -171t-97.5 -269l-101 -475h-168z" /> +<glyph unicode="o" horiz-adv-x="1149" d="M98 406q0 190 73 357.5t197 257t275 89.5q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309zM270 397q0 -131 63.5 -202.5t182.5 -71.5q104 0 187 73t129.5 207.5t46.5 307.5q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74 t-134 -205.5t-47.5 -292.5z" /> +<glyph unicode="p" horiz-adv-x="1182" d="M-43 -492l336 1588h139l-26 -209h8q179 227 372 227q137 0 216 -97.5t79 -273.5q0 -212 -69 -389t-191 -275.5t-276 -98.5q-97 0 -170 50t-113 140h-10l-4 -38q-3 -25 -10.5 -70t-114.5 -554h-166zM319 346q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81t137.5 230.5 t52 317.5q0 227 -178 227q-96 0 -195.5 -95t-158 -239t-58.5 -295z" /> +<glyph unicode="q" horiz-adv-x="1182" d="M98 350q0 212 72.5 392t196 277t274.5 97q94 0 165.5 -50.5t108.5 -141.5h13l67 172h125l-336 -1588h-166l101 480q9 45 57 221h-8q-95 -121 -185 -175t-186 -54q-140 0 -219.5 97.5t-79.5 272.5zM270 346q0 -227 179 -227q92 0 190 92t158.5 237t60.5 300 q0 105 -54.5 166t-152.5 61q-101 0 -189 -84.5t-140 -233t-52 -311.5z" /> +<glyph unicode="r" horiz-adv-x="811" d="M59 0l234 1096h139l-22 -203h10q72 95 119 136.5t98.5 64t114.5 22.5q69 0 120 -14l-36 -150q-53 13 -105 13q-91 0 -170.5 -60t-139 -166.5t-87.5 -236.5l-107 -502h-168z" /> +<glyph unicode="s" horiz-adv-x="877" d="M8 49v158q70 -42 151 -65t150 -23q126 0 190 50t64 128q0 57 -35 96t-151 107q-130 73 -184 143t-54 166q0 138 101 222.5t266 84.5q171 0 330 -74l-54 -137l-56 25q-101 43 -220 43q-93 0 -146 -43.5t-53 -112.5q0 -56 35.5 -96t146.5 -103q107 -60 153.5 -103 t69.5 -92.5t23 -111.5q0 -156 -110.5 -243.5t-311.5 -87.5q-169 0 -305 69z" /> +<glyph unicode="t" horiz-adv-x="664" d="M90 969l14 73l185 78l125 228h98l-55 -252h274l-26 -127h-273l-129 -604q-18 -87 -18 -132q0 -56 29 -86t81 -30q55 0 144 26v-129q-34 -14 -84 -24t-80 -10q-125 0 -191.5 59.5t-66.5 177.5q0 66 18 150l127 602h-172z" /> +<glyph unicode="u" horiz-adv-x="1182" d="M113 248q0 62 22 172l146 676h170l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5z" /> +<glyph unicode="v" horiz-adv-x="946" d="M98 1096h168l64 -613q24 -258 24 -362h6q127 275 179 371l325 604h178l-591 -1096h-228z" /> +<glyph unicode="w" horiz-adv-x="1468" d="M117 1096h164l18 -594v-88q0 -147 -8 -269h6q47 124 137 322l295 629h182l37 -594q6 -168 6 -262v-53l-2 -42h6q28 86 83 218.5t323 732.5h178l-506 -1096h-205l-32 602q-4 94 -4 172v156h-9l-50 -118l-83 -189l-291 -623h-202z" /> +<glyph unicode="x" horiz-adv-x="979" d="M-74 0l475 565l-239 531h170l174 -412l330 412h194l-455 -539l252 -557h-168l-192 434l-346 -434h-195z" /> +<glyph unicode="y" horiz-adv-x="946" d="M-197 -336q63 -18 131 -18q82 0 140.5 50.5t113.5 149.5l76 136l-166 1114h168l74 -545q10 -69 19.5 -203.5t9.5 -216.5h6q35 87 87 200t77 156l325 609h178l-696 -1282q-93 -172 -184 -239t-219 -67q-72 0 -140 21v135z" /> +<glyph unicode="z" horiz-adv-x="909" d="M-29 0l23 117l694 854h-479l27 125h657l-29 -140l-680 -831h531l-25 -125h-719z" /> +<glyph unicode="{" horiz-adv-x="715" d="M27 514l32 143q118 0 189.5 43.5t93.5 147.5l68 326q34 160 117.5 224t254.5 64h33l-31 -141q-105 0 -151 -36.5t-66 -123.5l-71 -321q-28 -123 -91 -184t-167 -78v-5q151 -41 151 -213q0 -59 -18 -131l-47 -211q-15 -58 -15 -98q0 -53 36.5 -77.5t119.5 -24.5v-142h-23 q-141 0 -216.5 52.5t-75.5 171.5q0 52 20 141q33 146 51.5 227.5t14.5 102.5q0 143 -209 143z" /> +<glyph unicode="|" d="M541 -496v2052h139v-2052h-139z" /> +<glyph unicode="}" horiz-adv-x="715" d="M-74 -182q115 0 167 36t71 123l72 322q25 117 88 179.5t170 80.5v6q-150 42 -150 211q0 59 18 131l50 213q14 65 14 99q0 53 -40.5 77.5t-139.5 24.5l28 141h11q144 0 220.5 -52.5t76.5 -170.5q0 -48 -21 -141l-49 -219q-16 -68 -16 -111q0 -143 209 -143l-33 -144 q-119 0 -190 -43t-93 -147l-67 -326q-36 -164 -119 -226.5t-264 -62.5h-13v142z" /> +<glyph unicode="~" d="M115 592v151q98 109 243 109q69 0 127 -14.5t144 -51.5q64 -27 112.5 -41t98.5 -14q55 0 119.5 33t115.5 88v-150q-100 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12q-54 0 -118.5 -34.5t-114.5 -86.5z" /> +<glyph unicode="&#xa1;" horiz-adv-x="530" d="M-14 -373l274 1057h109l-176 -1057h-207zM250 950q0 76 40.5 122t110.5 46q44 0 70.5 -26t26.5 -80q0 -71 -40.5 -117.5t-105.5 -46.5q-48 0 -75 25.5t-27 76.5z" /> +<glyph unicode="&#xa2;" d="M225 590q0 185 63.5 344t178.5 258.5t260 120.5l35 170h123l-37 -168q119 -9 217 -49l-47 -142q-109 52 -219 52q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -125 66 -198t184 -73q72 0 136 20t126 48v-143q-123 -62 -286 -66l-41 -198h-125l43 215 q-132 34 -203.5 137.5t-71.5 257.5z" /> +<glyph unicode="&#xa3;" d="M-23 0l27 141q205 46 258 289l47 221h-200l26 127h201l76 350q75 353 430 353q184 0 336 -86l-66 -133q-146 79 -278 79q-213 0 -263 -237l-69 -326h370l-26 -127h-371l-47 -219q-22 -98 -66 -166.5t-124 -111.5h725l-33 -154h-953z" /> +<glyph unicode="&#xa4;" d="M168 1067l92 92l127 -129q103 70 217 70t215 -70l129 129l92 -90l-129 -129q70 -104 70 -217q0 -119 -70 -217l127 -127l-90 -90l-129 127q-98 -68 -215 -68q-119 0 -217 70l-127 -127l-90 90l127 127q-68 96 -68 215q0 117 68 215zM358 723q0 -103 71.5 -174.5 t174.5 -71.5q104 0 177 71.5t73 174.5q0 104 -73 177t-177 73q-102 0 -174 -72.5t-72 -177.5z" /> +<glyph unicode="&#xa5;" d="M127 266l29 133h290l33 160h-291l29 133h225l-202 770h163l179 -747l491 747h187l-533 -770h231l-28 -133h-297l-33 -160h297l-29 -133h-295l-57 -266h-154l56 266h-291z" /> +<glyph unicode="&#xa6;" d="M541 281h139v-777h-139v777zM541 780v776h139v-776h-139z" /> +<glyph unicode="&#xa7;" horiz-adv-x="995" d="M59 53v148q56 -34 136.5 -56t156.5 -22q133 0 204 44.5t71 129.5q0 48 -50.5 89t-152.5 87q-138 61 -194 130.5t-56 166.5q0 201 238 307q-119 70 -119 203q0 127 103.5 206t279.5 79q189 0 321 -68l-53 -123q-148 60 -266 60q-102 0 -162.5 -40.5t-60.5 -109.5 q0 -49 38 -83.5t162 -90.5q100 -44 149 -83.5t75 -89.5t26 -114q0 -97 -61 -180t-172 -139q114 -71 114 -189q0 -152 -114 -237.5t-318 -85.5q-176 0 -295 61zM326 791q0 -70 50.5 -117t198.5 -111q80 44 127.5 107t47.5 131q0 60 -49.5 105.5t-186.5 103.5 q-82 -26 -135 -87.5t-53 -131.5z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1135" d="M457 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM821 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M139 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5 q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM520 733q0 208 110 330.5t300 122.5q130 0 248 -60l-60 -120q-106 53 -190 53q-125 0 -191.5 -87t-66.5 -241q0 -169 65 -249.5t193 -80.5q82 0 211 43v-122q-66 -28 -113 -38 t-104 -10q-192 0 -297 119.5t-105 339.5z" /> +<glyph unicode="&#xaa;" horiz-adv-x="686" d="M170 1014q0 127 41.5 234.5t116.5 169t170 61.5q114 0 153 -103h6l37 90h86l-139 -665h-92l14 117h-4q-40 -56 -90 -93t-123 -37q-77 0 -126.5 60t-49.5 166zM283 1030q0 -139 98 -139q61 0 112.5 49t86 137.5t34.5 167.5q0 62 -28.5 96.5t-85.5 34.5q-92 0 -154.5 -103 t-62.5 -243z" /> +<glyph unicode="&#xab;" horiz-adv-x="958" d="M88 555v29l391 374l78 -81l-297 -328l172 -387l-113 -49zM483 510v31l367 405l86 -69l-283 -365l158 -350l-113 -49z" /> +<glyph unicode="&#xac;" d="M127 651v142h920v-529h-140v387h-780z" /> +<glyph unicode="&#xad;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M139 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5 q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM645 291v880h229q163 0 241.5 -63t78.5 -193q0 -78 -47.5 -141t-132.5 -98l227 -385h-149l-207 352h-113v-352h-127zM772 762h92q195 0 195 149q0 76 -47.5 107t-149.5 31h-90v-287z " /> +<glyph unicode="&#xaf;" horiz-adv-x="782" d="M227 1556l33 132h787l-35 -132h-785z" /> +<glyph unicode="&#xb0;" horiz-adv-x="877" d="M215 1171q0 128 90.5 220t220.5 92q83 0 155.5 -41.5t114.5 -114t42 -156.5q0 -128 -90.5 -218.5t-221.5 -90.5t-221 90.5t-90 218.5zM328 1171q0 -80 58 -138t140 -58q83 0 140 58.5t57 137.5q0 82 -57.5 140.5t-139.5 58.5q-80 0 -139 -58.5t-59 -140.5z" /> +<glyph unicode="&#xb1;" d="M127 0v141h920v-141h-920zM127 643v141h389v392h141v-392h390v-141h-390v-387h-141v387h-389z" /> +<glyph unicode="&#xb2;" horiz-adv-x="717" d="M96 586l23 106l264 228q115 100 158.5 149.5t63.5 93t20 90.5q0 53 -31 85t-90 32q-90 0 -195 -80l-59 90q125 101 274 101q109 0 171.5 -56.5t62.5 -150.5q0 -99 -52.5 -179.5t-197.5 -205.5l-221 -187h395l-25 -116h-561z" /> +<glyph unicode="&#xb3;" horiz-adv-x="717" d="M119 625v127q125 -72 239 -72q205 0 205 170q0 137 -178 137h-90l22 107h95q97 0 155 41t58 112q0 60 -34.5 90.5t-93.5 30.5q-102 0 -196 -68l-55 93q109 88 268 88q114 0 178 -56t64 -151q0 -180 -207 -234v-4q69 -17 108 -68t39 -120q0 -132 -91 -205.5t-253 -73.5 q-125 0 -233 56z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M532 1241v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1194" d="M-43 -492l336 1588h168l-148 -695q-18 -92 -18 -135q0 -147 147 -147q89 0 172 59t148.5 171t99.5 269l105 478h163l-233 -1096h-139l24 205h-12q-93 -121 -183 -173t-188 -52q-112 0 -163 96h-9q-11 -78 -22.5 -148t-83.5 -420h-164z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M199 1042q0 260 109 387t341 127h557v-1816h-114v1661h-213v-1661h-115v819q-62 -18 -146 -18q-216 0 -317.5 125t-101.5 376z" /> +<glyph unicode="&#xb7;" horiz-adv-x="518" d="M170 690q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" /> +<glyph unicode="&#xb8;" horiz-adv-x="420" d="M-170 -383q38 -6 68 -6q174 0 174 110q0 46 -39 67.5t-99 29.5l101 182h106l-61 -121q131 -38 131 -155q0 -98 -81 -157t-214 -59q-41 0 -86 9v100z" /> +<glyph unicode="&#xb9;" horiz-adv-x="717" d="M258 1280l279 182h118l-186 -876h-135l112 526q25 103 58 225q-25 -25 -50 -46.5t-145 -100.5z" /> +<glyph unicode="&#xba;" horiz-adv-x="688" d="M168 1055q0 117 42 215.5t117.5 153.5t174.5 55q117 0 180 -67t63 -193q0 -191 -88.5 -311t-240.5 -120q-113 0 -180.5 71t-67.5 196zM281 1059q0 -85 38 -127.5t107 -42.5q94 0 152.5 88.5t58.5 232.5q0 166 -137 166q-102 0 -160.5 -87.5t-58.5 -229.5z" /> +<glyph unicode="&#xbb;" horiz-adv-x="958" d="M23 197l282 360l-158 354l113 50l217 -402v-31l-368 -401zM401 197l297 323l-172 391l113 50l233 -447v-29l-393 -370z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1518" d="M123 0l1085 1462h154l-1086 -1462h-153zM204 1280l279 182h118l-186 -876h-135l112 526q25 103 58 225q-25 -25 -50 -46.5t-145 -100.5zM706 203l23 101l481 579h133l-121 -563h127l-22 -117h-129l-43 -202h-127l43 202h-365zM870 320h225q69 322 90 395 q-20 -36 -110 -149z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1518" d="M148 1280l279 182h118l-186 -876h-135l112 526q25 103 58 225q-25 -25 -50 -46.5t-145 -100.5zM66 0l1085 1462h154l-1086 -1462h-153zM782 1l23 106l264 228q115 100 158.5 149.5t63.5 93t20 90.5q0 53 -31 85t-90 32q-90 0 -195 -80l-59 90q125 101 274 101 q109 0 171.5 -56.5t62.5 -150.5q0 -99 -52.5 -179.5t-197.5 -205.5l-221 -187h395l-25 -116h-561z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1565" d="M87 625v127q125 -72 239 -72q205 0 205 170q0 137 -178 137h-90l22 107h95q97 0 155 41t58 112q0 60 -34.5 90.5t-93.5 30.5q-102 0 -196 -68l-55 93q109 88 268 88q114 0 178 -56t64 -151q0 -180 -207 -234v-4q69 -17 108 -68t39 -120q0 -132 -91 -205.5t-253 -73.5 q-125 0 -233 56zM273 0l1085 1462h154l-1086 -1462h-153zM856 203l23 101l481 579h133l-121 -563h127l-22 -117h-129l-43 -202h-127l43 202h-365zM1020 320h225q69 322 90 395q-20 -36 -110 -149z" /> +<glyph unicode="&#xbf;" horiz-adv-x="874" d="M-4 -78q0 124 66 228t225 223q132 98 172.5 152.5t62.5 154.5h135q-22 -130 -72 -212t-165 -175l-95 -75q-159 -127 -159 -275q0 -93 51.5 -144t147.5 -51q80 0 154 25.5t140 56.5l62 -129q-90 -48 -189 -74t-186 -26q-168 0 -259 83.5t-91 237.5zM512 946q0 71 40 118.5 t107 47.5q47 0 74 -25.5t27 -76.5q0 -77 -40.5 -122.5t-111.5 -45.5q-43 0 -69.5 26t-26.5 78z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474zM535 1886v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474zM679 1579v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474zM465 1579v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189 h-109z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474zM432 1579q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258 q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474zM523 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM887 1716q0 46 28 79.5 t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474zM553 1583q0 94 62 152.5t157 58.5q101 0 160 -57t59 -152q0 -99 -60 -157t-159 -58q-101 0 -160 57.5t-59 155.5zM657 1583 q0 -54 29.5 -84.5t85.5 -30.5q51 0 83 30.5t32 84.5q0 53 -32 84t-83 31q-49 0 -82 -31t-33 -84z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1673" d="M-119 0l938 1462h938l-33 -153h-565l-100 -469h528l-28 -150h-529l-115 -538h566l-33 -152h-737l98 465h-438l-293 -465h-197zM469 621h371l147 688h-84z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1198" d="M150 537q0 261 105.5 485.5t283.5 342.5t403 118q197 0 348 -80l-69 -141q-138 69 -279 69q-174 0 -311.5 -97t-218 -284.5t-80.5 -408.5q0 -187 97.5 -298.5t268.5 -111.5q139 0 322 57v-149q-86 -31 -164 -45t-188 -14q-242 0 -380 149.5t-138 407.5zM377 -383 q38 -6 68 -6q174 0 174 110q0 46 -39 67.5t-99 29.5l101 182h106l-61 -121q131 -38 131 -155q0 -98 -81 -157t-214 -59q-41 0 -86 9v100z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1047" d="M86 0l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565l-33 -152h-735zM570 1886v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1047" d="M86 0l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565l-33 -152h-735zM657 1579v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xca;" horiz-adv-x="1047" d="M86 0l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565l-33 -152h-735zM469 1579v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1047" d="M86 0l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565l-33 -152h-735zM523 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM887 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34 q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xcc;" horiz-adv-x="559" d="M86 0l311 1462h168l-311 -1462h-168zM265 1886v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xcd;" horiz-adv-x="559" d="M86 0l311 1462h168l-311 -1462h-168zM412 1579v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xce;" horiz-adv-x="559" d="M86 0l311 1462h168l-311 -1462h-168zM193 1579v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#xcf;" horiz-adv-x="559" d="M86 0l311 1462h168l-311 -1462h-168zM265 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM629 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1364" d="M72 649l32 150h150l141 663h342q276 0 419.5 -149.5t143.5 -435.5q0 -261 -105 -461t-300 -308t-457 -108h-352l135 649h-149zM287 147h162q202 0 355 91.5t234.5 258.5t81.5 382t-103 325.5t-302 110.5h-178l-111 -516h330l-33 -150h-330z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1438" d="M84 0l309 1462h180l459 -1220h6q30 224 72 405l174 815h164l-309 -1462h-181l-460 1223h-6q-32 -221 -74 -418l-172 -805h-162zM600 1579q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258q-40 0 -77.5 17.5 t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403q0 199 -94 310.5t-261 111.5q-157 0 -281 -101 t-192.5 -281t-68.5 -398zM679 1886v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403q0 199 -94 310.5t-261 111.5q-157 0 -281 -101 t-192.5 -281t-68.5 -398zM821 1579v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403q0 199 -94 310.5t-261 111.5q-157 0 -281 -101 t-192.5 -281t-68.5 -398zM612 1579v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403q0 199 -94 310.5t-261 111.5q-157 0 -281 -101 t-192.5 -281t-68.5 -398zM565 1579q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403q0 199 -94 310.5t-261 111.5q-157 0 -281 -101 t-192.5 -281t-68.5 -398zM664 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM1028 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xd7;" d="M168 1044l98 99l320 -320l323 320l99 -96l-324 -324l322 -322l-97 -96l-323 320l-320 -318l-96 96l317 320z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1475" d="M119 8l137 170q-106 136 -106 371q0 264 96 482t263.5 336t377.5 118q99 0 178.5 -27t151.5 -84l131 166l114 -92l-149 -184q48 -62 73 -156t25 -201q0 -269 -88 -481.5t-252 -329t-379 -116.5q-200 0 -332 96l-129 -160zM332 553q0 -135 41 -227l737 919q-90 88 -236 88 q-157 0 -281 -101t-192.5 -281t-68.5 -398zM463 205q91 -74 233 -74q152 0 272.5 97.5t190.5 279.5t70 403q0 118 -33 205z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1384" d="M164 383q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299zM663 1886v21h181q43 -136 147 -303v-25h-104 q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xda;" horiz-adv-x="1384" d="M164 383q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299zM823 1579v27q56 60 125.5 151.5t106.5 149.5h190v-21 q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1384" d="M164 383q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299zM602 1579v27q145 133 204.5 197.5t82.5 103.5h158 q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1384" d="M164 383q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299zM643 1716q0 46 28 79.5t74 33.5q78 0 78 -80 q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM1007 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1030" d="M188 1462h170l179 -747l489 747h193l-627 -921l-113 -541h-172l119 549zM616 1579v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xde;" horiz-adv-x="1159" d="M86 0l309 1462h170l-53 -256h160q213 0 323.5 -95t110.5 -282q0 -248 -164 -379t-483 -131h-133l-70 -319h-170zM354 465h135q215 0 328 91t113 267q0 126 -70 181t-215 55h-166z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1182" d="M-256 -328q61 -22 111 -22q65 0 107 47.5t65 157.5l280 1314q43 200 156 299t307 99q162 0 252 -71t90 -196q0 -57 -21 -106.5t-61.5 -95t-178.5 -150.5q-110 -83 -110 -151q0 -56 95 -122q47 -34 101 -87.5t79.5 -110t25.5 -123.5q0 -175 -108.5 -274.5t-292.5 -99.5 q-175 0 -268 71v160q51 -41 118.5 -66.5t129.5 -25.5q113 0 181 58t68 159q0 40 -10.5 71t-33.5 59t-89 83q-88 69 -122.5 124t-34.5 115q0 53 18.5 96t49.5 78.5t124 104.5q80 56 111 87.5t48 65t17 70.5q0 64 -52.5 100.5t-141.5 36.5q-119 0 -186 -62.5t-95 -190.5 l-274 -1303q-40 -189 -121 -276t-211 -87q-69 0 -123 21v143z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310zM496 1548v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310zM600 1241v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310zM390 1241v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310zM354 1241q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310zM454 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM818 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310zM513 1454q0 94 62 152.5t157 58.5q101 0 160 -57t59 -152q0 -99 -60 -157t-159 -58q-101 0 -160 57.5t-59 155.5zM617 1454q0 -54 29.5 -84.5t85.5 -30.5q51 0 83 30.5t32 84.5q0 53 -32 84t-83 31q-49 0 -82 -31t-33 -84z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1669" d="M98 348q0 206 70.5 385t191.5 281t263 102q82 0 145 -48.5t102 -143.5h11l67 172h109l-31 -146q123 166 332 166q119 0 192.5 -68t73.5 -184q0 -182 -166.5 -283.5t-472.5 -101.5h-39l-4 -80q0 -131 62.5 -204.5t193.5 -73.5q55 0 116.5 16.5t178.5 67.5v-150 q-164 -75 -328 -75q-108 0 -189.5 39.5t-121.5 119.5l-31 -139h-114l26 209h-8q-109 -132 -191.5 -180.5t-177.5 -48.5q-122 0 -191 99t-69 269zM270 348q0 -114 37 -171.5t105 -57.5q95 0 188.5 91.5t153 240.5t59.5 299q0 103 -45.5 164t-122.5 61q-99 0 -187 -86.5 t-138 -231.5t-50 -309zM973 618h14q226 0 348.5 58.5t122.5 169.5q0 61 -35 94t-98 33q-117 0 -211 -94.5t-141 -260.5z" /> +<glyph unicode="&#xe7;" horiz-adv-x="922" d="M98 389q0 200 74 369t204.5 263.5t293.5 94.5q137 0 268 -51l-47 -141q-120 51 -219 51q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -128 66.5 -199t183.5 -71q72 0 136 20t126 47v-143q-124 -63 -276 -63q-194 0 -301 107t-107 302zM211 -383q38 -6 68 -6 q174 0 174 110q0 46 -39 67.5t-99 29.5l101 182h106l-61 -121q131 -38 131 -155q0 -98 -81 -157t-214 -59q-41 0 -86 9v100z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1010" d="M98 391q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5q-184 0 -289 109t-105 302zM299 618h12 q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35q-103 0 -193.5 -94t-138.5 -261zM449 1548v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1010" d="M98 391q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5q-184 0 -289 109t-105 302zM299 618h12 q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35q-103 0 -193.5 -94t-138.5 -261zM585 1241v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xea;" horiz-adv-x="1010" d="M98 391q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5q-184 0 -289 109t-105 302zM299 618h12 q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35q-103 0 -193.5 -94t-138.5 -261zM351 1241v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1010" d="M98 391q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5q-184 0 -289 109t-105 302zM299 618h12 q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35q-103 0 -193.5 -94t-138.5 -261zM413 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM777 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34 q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xec;" horiz-adv-x="520" d="M59 0l234 1096h168l-234 -1096h-168zM164 1548v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xed;" horiz-adv-x="520" d="M59 0l234 1096h168l-234 -1096h-168zM324 1241v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xee;" horiz-adv-x="520" d="M59 0l234 1096h168l-234 -1096h-168zM93 1241v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#xef;" horiz-adv-x="520" d="M59 0l234 1096h168l-234 -1096h-168zM161 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM525 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1165" d="M90 373q0 160 67.5 298t187 217t267.5 79q105 0 181.5 -45.5t111.5 -124.5l6 2v17q0 136 -36.5 240t-110.5 197l-270 -149l-56 108l238 131q-66 58 -146 113l95 117q118 -84 188 -154l260 146l64 -105l-240 -133q87 -115 126.5 -240.5t39.5 -269.5q0 -253 -71.5 -447 t-203 -292t-311.5 -98q-182 0 -284.5 104t-102.5 289zM262 377q0 -126 57.5 -191t167.5 -65q107 0 190 56t134 168t51 226q0 118 -65.5 187t-178.5 69q-109 0 -189 -57.5t-123.5 -161t-43.5 -231.5z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1182" d="M59 0l234 1096h139l-22 -203h10q96 122 185.5 172.5t185.5 50.5q127 0 200.5 -69.5t73.5 -194.5q0 -79 -23 -180l-143 -672h-170l148 692q20 104 20 144q0 63 -35.5 101t-113.5 38q-89 0 -173.5 -60t-149 -171t-97.5 -269l-101 -475h-168zM369 1241q58 258 231 258 q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1149" d="M98 406q0 190 73 357.5t197 257t275 89.5q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309zM270 397q0 -131 63.5 -202.5t182.5 -71.5q104 0 187 73t129.5 207.5t46.5 307.5q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74 t-134 -205.5t-47.5 -292.5zM470 1548v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1149" d="M98 406q0 190 73 357.5t197 257t275 89.5q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309zM270 397q0 -131 63.5 -202.5t182.5 -71.5q104 0 187 73t129.5 207.5t46.5 307.5q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74 t-134 -205.5t-47.5 -292.5zM589 1241v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1149" d="M98 406q0 190 73 357.5t197 257t275 89.5q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309zM270 397q0 -131 63.5 -202.5t182.5 -71.5q104 0 187 73t129.5 207.5t46.5 307.5q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74 t-134 -205.5t-47.5 -292.5zM382 1241v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1149" d="M98 406q0 190 73 357.5t197 257t275 89.5q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309zM270 397q0 -131 63.5 -202.5t182.5 -71.5q104 0 187 73t129.5 207.5t46.5 307.5q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74 t-134 -205.5t-47.5 -292.5zM342 1241q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1149" d="M98 406q0 190 73 357.5t197 257t275 89.5q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309zM270 397q0 -131 63.5 -202.5t182.5 -71.5q104 0 187 73t129.5 207.5t46.5 307.5q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74 t-134 -205.5t-47.5 -292.5zM433 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM797 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xf7;" d="M127 651v142h920v-142h-920zM475 373q0 121 111 121q53 0 82.5 -30.5t29.5 -90.5q0 -58 -30 -89.5t-82 -31.5t-81.5 31t-29.5 90zM475 1071q0 121 111 121q53 0 82.5 -30.5t29.5 -90.5q0 -58 -30 -89.5t-82 -31.5t-81.5 31t-29.5 90z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1149" d="M61 6l109 135q-68 103 -68 265q0 194 73.5 361t195.5 255t272 88q146 0 252 -68l104 129l105 -79l-119 -129q62 -97 62 -258q0 -189 -69.5 -360t-191.5 -266t-276 -95q-146 0 -246 65l-98 -125zM264 416q0 -92 17 -137l518 645q-54 47 -152 47q-108 0 -195.5 -73 t-137.5 -202t-50 -280zM358 166q57 -45 158 -45q103 0 188.5 71.5t133 200.5t47.5 295q0 84 -13 119z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1182" d="M113 248q0 62 22 172l146 676h170l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5zM472 1548v21h181q43 -136 147 -303v-25h-104 q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1182" d="M113 248q0 62 22 172l146 676h170l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5zM636 1241v27q56 60 125.5 151.5t106.5 149.5h190v-21 q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1182" d="M113 248q0 62 22 172l146 676h170l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5zM409 1241v27q145 133 204.5 197.5t82.5 103.5h158 q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1182" d="M113 248q0 62 22 172l146 676h170l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5zM457 1378q0 46 28 79.5t74 33.5q78 0 78 -80 q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM821 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#xfd;" horiz-adv-x="946" d="M-197 -336q63 -18 131 -18q82 0 140.5 50.5t113.5 149.5l76 136l-166 1114h168l74 -545q10 -69 19.5 -203.5t9.5 -216.5h6q35 87 87 200t77 156l325 609h178l-696 -1282q-93 -172 -184 -239t-219 -67q-72 0 -140 21v135zM500 1241v27q56 60 125.5 151.5t106.5 149.5h190 v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1182" d="M-43 -492l432 2048h168q-95 -441 -115 -522t-39 -149h9q101 125 189 177t183 52q139 0 218 -97.5t79 -273.5q0 -212 -69 -389t-191 -275.5t-276 -98.5q-98 0 -172 51t-113 139h-10q-8 -104 -25 -176l-102 -486h-166zM319 346q0 -110 55.5 -168.5t160.5 -58.5 q99 0 184.5 81t137.5 230.5t52 317.5q0 227 -178 227q-96 0 -195.5 -95t-158 -239t-58.5 -295z" /> +<glyph unicode="&#xff;" horiz-adv-x="946" d="M-197 -336q63 -18 131 -18q82 0 140.5 50.5t113.5 149.5l76 136l-166 1114h168l74 -545q10 -69 19.5 -203.5t9.5 -216.5h6q35 87 87 200t77 156l325 609h178l-696 -1282q-93 -172 -184 -239t-219 -67q-72 0 -140 21v135zM335 1378q0 46 28 79.5t74 33.5q78 0 78 -80 q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM699 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" /> +<glyph unicode="&#x131;" horiz-adv-x="520" d="M59 0l234 1096h168l-234 -1096h-168z" /> +<glyph unicode="&#x152;" horiz-adv-x="1751" d="M150 549q0 264 96 482t263.5 336t377.5 118q152 0 237 -23h709l-31 -153h-565l-100 -469h528l-31 -150h-528l-115 -538h565l-32 -152h-674q-78 -20 -158 -20q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q69 0 123 19l246 1161q-76 22 -191 22 q-157 0 -281 -101t-192.5 -281t-68.5 -398z" /> +<glyph unicode="&#x153;" horiz-adv-x="1769" d="M98 406q0 193 75 360t201 255.5t281 88.5q270 0 359 -225q75 109 177.5 170t221.5 61q139 0 217 -65.5t78 -186.5q0 -183 -164.5 -284t-468.5 -101h-41l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q75 0 145 24.5t150 59.5v-150q-162 -75 -326 -75q-270 0 -356 225 q-69 -107 -171.5 -164t-225.5 -57q-184 0 -292 114t-108 308zM270 410q0 -141 62 -214t172 -73q177 0 278 160.5t101 427.5q0 124 -59.5 191t-174.5 67q-109 0 -196 -73t-135 -202t-48 -284zM1053 618h18q231 0 351 61t120 177q0 48 -32 82.5t-97 34.5q-125 0 -220.5 -94.5 t-139.5 -260.5z" /> +<glyph unicode="&#x178;" horiz-adv-x="1030" d="M188 1462h170l179 -747l489 747h193l-627 -921l-113 -541h-172l119 549zM452 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM816 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22 t-23.5 62z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="1135" d="M399 1241v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27h-103q-57 48 -161 189q-134 -119 -242 -189h-109z" /> +<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M551 1454q0 94 62 152.5t157 58.5q101 0 160 -57t59 -152q0 -99 -60 -157t-159 -58q-101 0 -160 57.5t-59 155.5zM655 1454q0 -54 29.5 -84.5t85.5 -30.5q51 0 83 30.5t32 84.5q0 53 -32 84t-83 31q-49 0 -82 -31t-33 -84z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="1135" d="M336 1241q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100z" /> +<glyph unicode="&#x2000;" horiz-adv-x="953" /> +<glyph unicode="&#x2001;" horiz-adv-x="1907" /> +<glyph unicode="&#x2002;" horiz-adv-x="953" /> +<glyph unicode="&#x2003;" horiz-adv-x="1907" /> +<glyph unicode="&#x2004;" horiz-adv-x="635" /> +<glyph unicode="&#x2005;" horiz-adv-x="476" /> +<glyph unicode="&#x2006;" horiz-adv-x="317" /> +<glyph unicode="&#x2007;" horiz-adv-x="317" /> +<glyph unicode="&#x2008;" horiz-adv-x="238" /> +<glyph unicode="&#x2009;" horiz-adv-x="381" /> +<glyph unicode="&#x200a;" horiz-adv-x="105" /> +<glyph unicode="&#x2010;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="&#x2011;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="&#x2012;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="&#x2013;" horiz-adv-x="983" d="M55 469l35 160h823l-34 -160h-824z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M55 469l35 160h1806l-34 -160h-1807z" /> +<glyph unicode="&#x2018;" horiz-adv-x="348" d="M123 983q98 211 270 479h127q-147 -345 -203 -501h-188z" /> +<glyph unicode="&#x2019;" horiz-adv-x="348" d="M125 961q134 298 203 501h188l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129z" /> +<glyph unicode="&#x201a;" horiz-adv-x="492" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129z" /> +<glyph unicode="&#x201c;" horiz-adv-x="719" d="M123 983q98 211 270 479h127q-147 -345 -203 -501h-188zM492 983q80 181 272 479h127q-162 -379 -203 -501h-188z" /> +<glyph unicode="&#x201d;" horiz-adv-x="719" d="M125 961q134 298 203 501h188l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129zM494 961q57 126 115.5 272.5t86.5 228.5h189l10 -22q-94 -206 -274 -479h-127z" /> +<glyph unicode="&#x201e;" horiz-adv-x="858" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129zM268 -264q140 316 203 502h188l9 -23q-95 -205 -271 -479h-129z" /> +<glyph unicode="&#x2022;" horiz-adv-x="774" d="M199 684q0 145 73.5 231t198.5 86q92 0 139 -49t47 -141q0 -141 -74 -230t-202 -89q-89 0 -135.5 49.5t-46.5 142.5z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1563" d="M563 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM1085 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM43 74q0 77 40.5 122.5t111.5 45.5 q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" /> +<glyph unicode="&#x202f;" horiz-adv-x="381" /> +<glyph unicode="&#x2039;" horiz-adv-x="580" d="M88 549v29l391 380l78 -81l-297 -334l172 -381l-113 -49z" /> +<glyph unicode="&#x203a;" horiz-adv-x="580" d="M23 197l296 333l-172 381l113 50l232 -437v-28l-392 -381z" /> +<glyph unicode="&#x2044;" horiz-adv-x="268" d="M-487 0l1085 1462h154l-1086 -1462h-153z" /> +<glyph unicode="&#x205f;" horiz-adv-x="476" /> +<glyph unicode="&#x2074;" horiz-adv-x="717" d="M92 788l23 101l481 579h133l-121 -563h127l-22 -117h-129l-43 -202h-127l43 202h-365zM256 905h225q69 322 90 395q-20 -36 -110 -149z" /> +<glyph unicode="&#x20ac;" d="M63 504l27 131h154q8 80 30 164h-151l27 133h159q97 267 259.5 408t369.5 141q89 0 160 -21.5t141 -70.5l-80 -138q-113 78 -231 78q-140 0 -254 -99t-189 -298h426l-26 -133h-441q-21 -65 -32 -164h381l-29 -131h-361q0 -373 297 -373q123 0 256 55v-147 q-127 -59 -278 -59q-212 0 -328.5 133.5t-116.5 378.5v12h-170z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M121 1358v104h516v-104h-199v-617h-121v617h-196zM705 741v721h180l182 -557l193 557h170v-721h-121v430q0 73 4 121h-6l-197 -551h-96l-189 551h-6q4 -52 4 -121v-430h-118z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1165" d="M-229 -330q64 -22 112 -22q76 0 117 62t66 177l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h238l-25 -127h-237l-232 -1098q-39 -189 -120 -276 t-213 -87q-69 0 -125 21v141zM702 0l234 1096h168l-234 -1096h-168zM983 1376q0 56 32 91.5t83 35.5q88 0 88 -90q0 -55 -33.5 -93t-77.5 -38q-40 0 -66 24.5t-26 69.5z" /> +<glyph unicode="&#xfb02;" horiz-adv-x="1165" d="M-229 -330q64 -22 112 -22q76 0 117 62t66 177l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h238l-25 -127h-237l-232 -1098q-39 -189 -120 -276 t-213 -87q-69 0 -125 21v141zM700 0l332 1556h168l-332 -1556h-168z" /> +<glyph unicode="&#xfb03;" horiz-adv-x="1815" d="M-229 -330q64 -22 112 -22q70 0 114 58t69 181l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h482l24 108q45 197 126 280t243 83q41 0 97.5 -11 t92.5 -26l-45 -129q-76 29 -137 29q-89 0 -135 -51t-74 -175l-24 -108h239l-26 -127h-238l-231 -1098q-43 -195 -123.5 -279t-210.5 -84q-71 0 -125 21v141q61 -22 115 -22q68 0 111 57.5t69 181.5l227 1082h-481l-232 -1098q-39 -189 -120 -276t-213 -87q-69 0 -125 21v141 zM1354 0l233 1096h168l-233 -1096h-168zM1634 1376q0 54 32 90.5t83 36.5q88 0 88 -90q0 -55 -33.5 -93t-77.5 -38q-38 0 -65 24.5t-27 69.5z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="1815" d="M-229 -330q64 -22 112 -22q70 0 114 58t69 181l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h482l24 108q45 197 126 280t243 83q41 0 97.5 -11 t92.5 -26l-45 -129q-76 29 -137 29q-89 0 -135 -51t-74 -175l-24 -108h239l-26 -127h-238l-231 -1098q-43 -195 -123.5 -279t-210.5 -84q-71 0 -125 21v141q61 -22 115 -22q68 0 111 57.5t69 181.5l227 1082h-481l-232 -1098q-39 -189 -120 -276t-213 -87q-69 0 -125 21v141 zM1352 0l331 1556h168l-331 -1556h-168z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.ttf new file mode 100644 index 000000000000..ddc75c6ca97a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.woff new file mode 100644 index 000000000000..302cb00b0643 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-italic-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.eot new file mode 100644 index 000000000000..1c64986aabd9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.svg new file mode 100644 index 000000000000..ead219a56987 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.svg @@ -0,0 +1,252 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansRegular" horiz-adv-x="1171" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="547" d="M152 106q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5zM170 1462h207l-51 -1059h-105z" /> +<glyph unicode="&#x22;" horiz-adv-x="821" d="M133 1462h186l-40 -528h-105zM502 1462h186l-41 -528h-104z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M51 430v129h287l68 340h-277v127h299l82 436h139l-82 -436h305l84 436h134l-84 -436h264v-127h-289l-66 -340h283v-129h-307l-84 -430h-137l84 430h-303l-82 -430h-136l80 430h-262zM475 559h303l66 340h-303z" /> +<glyph unicode="$" d="M131 170v156q83 -37 191.5 -60.5t197.5 -23.5v440q-205 65 -287.5 151t-82.5 222q0 131 101.5 215t268.5 102v182h129v-180q184 -5 355 -74l-52 -131q-149 59 -303 70v-434q157 -50 235 -97.5t115 -109t37 -149.5q0 -136 -102 -224.5t-285 -111.5v-232h-129v223 q-112 0 -217 17.5t-172 48.5zM319 1057q0 -76 45 -122t156 -87v387q-99 -16 -150 -62.5t-51 -115.5zM649 252q217 30 217 184q0 72 -44.5 116.5t-172.5 88.5v-389z" /> +<glyph unicode="%" horiz-adv-x="1686" d="M104 1026q0 227 74.5 342t220.5 115q145 0 223 -119t78 -338q0 -228 -76.5 -344.5t-224.5 -116.5q-140 0 -217.5 119t-77.5 342zM242 1026q0 -170 37 -255t120 -85q164 0 164 340q0 338 -164 338q-83 0 -120 -84t-37 -254zM365 0l811 1462h147l-811 -1462h-147zM985 440 q0 227 74.5 342t220.5 115q142 0 221.5 -117.5t79.5 -339.5q0 -227 -76.5 -343.5t-224.5 -116.5q-142 0 -218.5 119t-76.5 341zM1122 440q0 -171 37 -255.5t121 -84.5t124 83.5t40 256.5q0 171 -40 253.5t-124 82.5t-121 -82.5t-37 -253.5z" /> +<glyph unicode="&#x26;" horiz-adv-x="1495" d="M113 379q0 130 69.5 230t249.5 202q-85 95 -115.5 144t-48.5 102t-18 110q0 150 98 234t273 84q162 0 255 -83.5t93 -232.5q0 -107 -68 -197.5t-225 -183.5l407 -391q56 62 89.5 145.5t56.5 182.5h168q-68 -286 -205 -434l299 -291h-229l-185 178q-118 -106 -240 -152 t-272 -46q-215 0 -333.5 106t-118.5 293zM285 383q0 -117 77.5 -185.5t206.5 -68.5q241 0 400 154l-437 424q-111 -68 -157 -112.5t-68 -95.5t-22 -116zM414 1171q0 -69 36 -131.5t123 -150.5q129 75 179.5 138.5t50.5 146.5q0 77 -51.5 125.5t-137.5 48.5q-89 0 -144.5 -48 t-55.5 -129z" /> +<glyph unicode="'" horiz-adv-x="453" d="M133 1462h186l-40 -528h-105z" /> +<glyph unicode="(" horiz-adv-x="606" d="M82 561q0 265 77.5 496t223.5 405h162q-144 -193 -216.5 -424t-72.5 -475q0 -240 74 -469t213 -418h-160q-147 170 -224 397t-77 488z" /> +<glyph unicode=")" horiz-adv-x="606" d="M61 1462h162q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-160q139 188 213 417.5t74 469.5q0 244 -72.5 475t-216.5 424z" /> +<glyph unicode="*" horiz-adv-x="1130" d="M86 1090l29 182l391 -111l-43 395h194l-43 -395l398 111l26 -182l-381 -31l248 -326l-172 -94l-176 362l-160 -362l-176 94l242 326z" /> +<glyph unicode="+" d="M104 653v138h410v428h139v-428h412v-138h-412v-426h-139v426h-410z" /> +<glyph unicode="," horiz-adv-x="502" d="M63 -264q27 104 59.5 257t45.5 245h182l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125z" /> +<glyph unicode="-" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="." horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" /> +<glyph unicode="/" horiz-adv-x="752" d="M20 0l545 1462h166l-545 -1462h-166z" /> +<glyph unicode="0" d="M102 733q0 382 119 567t363 185q238 0 361.5 -193t123.5 -559q0 -379 -119.5 -566t-365.5 -187q-236 0 -359 191.5t-123 561.5zM270 733q0 -319 75 -464.5t239 -145.5q166 0 240.5 147.5t74.5 462.5t-74.5 461.5t-240.5 146.5q-164 0 -239 -144.5t-75 -463.5z" /> +<glyph unicode="1" d="M188 1163l387 299h140v-1462h-162v1042q0 130 8 246q-21 -21 -47 -44t-238 -195z" /> +<glyph unicode="2" d="M100 0v143l385 387q176 178 232 254t84 148t28 155q0 117 -71 185.5t-197 68.5q-91 0 -172.5 -30t-181.5 -109l-88 113q202 168 440 168q206 0 323 -105.5t117 -283.5q0 -139 -78 -275t-292 -344l-320 -313v-8h752v-154h-961z" /> +<glyph unicode="3" d="M94 59v158q95 -47 202.5 -71.5t203.5 -24.5q379 0 379 297q0 266 -418 266h-144v143h146q171 0 271 75.5t100 209.5q0 107 -73.5 168t-199.5 61q-96 0 -181 -26t-194 -96l-84 112q90 71 207.5 111.5t247.5 40.5q213 0 331 -97.5t118 -267.5q0 -140 -78.5 -229 t-222.5 -119v-8q176 -22 261 -112t85 -236q0 -209 -145 -321.5t-412 -112.5q-116 0 -212.5 17.5t-187.5 61.5z" /> +<glyph unicode="4" d="M43 336v145l694 989h176v-983h217v-151h-217v-336h-159v336h-711zM209 487h545v486q0 143 10 323h-8q-48 -96 -90 -159z" /> +<glyph unicode="5" d="M133 59v160q70 -45 174 -70.5t205 -25.5q176 0 273.5 83t97.5 240q0 306 -375 306q-95 0 -254 -29l-86 55l55 684h727v-153h-585l-37 -439q115 23 229 23q231 0 363.5 -114.5t132.5 -313.5q0 -227 -144.5 -356t-398.5 -129q-247 0 -377 79z" /> +<glyph unicode="6" d="M117 625q0 431 167.5 644.5t495.5 213.5q113 0 178 -19v-143q-77 25 -176 25q-235 0 -359 -146.5t-136 -460.5h12q110 172 348 172q197 0 310.5 -119t113.5 -323q0 -228 -124.5 -358.5t-336.5 -130.5q-227 0 -360 170.5t-133 474.5zM287 506q0 -103 40 -192t113.5 -141 t167.5 -52q142 0 220.5 89.5t78.5 258.5q0 145 -73 228t-218 83q-90 0 -165 -37t-119.5 -102t-44.5 -135z" /> +<glyph unicode="7" d="M94 1309v153h973v-133l-598 -1329h-184l606 1309h-797z" /> +<glyph unicode="8" d="M104 373q0 251 306 391q-138 78 -198 168.5t-60 202.5q0 159 117.5 253.5t314.5 94.5q200 0 317 -93t117 -257q0 -108 -67 -197t-214 -162q178 -85 253 -178.5t75 -216.5q0 -182 -127 -290.5t-348 -108.5q-234 0 -360 102.5t-126 290.5zM268 369q0 -120 83.5 -187 t234.5 -67q149 0 232 70t83 192q0 97 -78 172.5t-272 146.5q-149 -64 -216 -141.5t-67 -185.5zM315 1128q0 -92 59 -158t218 -132q143 60 202.5 129t59.5 161q0 101 -72.5 160.5t-199.5 59.5q-125 0 -196 -60t-71 -160z" /> +<glyph unicode="9" d="M106 991q0 228 127.5 360t335.5 132q149 0 260.5 -76.5t171.5 -223t60 -345.5q0 -858 -664 -858q-116 0 -184 20v143q80 -26 182 -26q240 0 362.5 148.5t133.5 455.5h-12q-55 -83 -146 -126.5t-205 -43.5q-194 0 -308 116t-114 324zM270 993q0 -144 72 -226.5t219 -82.5 q91 0 167.5 37t120.5 101t44 134q0 105 -41 194t-114.5 140t-168.5 51q-143 0 -221 -92t-78 -256z" /> +<glyph unicode=":" horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM152 989q0 135 118 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" /> +<glyph unicode=";" horiz-adv-x="545" d="M63 -264q27 104 59.5 257t45.5 245h182l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125zM147 989q0 135 119 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-58 0 -88.5 35t-30.5 100z" /> +<glyph unicode="&#x3c;" d="M104 664v98l961 479v-149l-782 -371l782 -328v-151z" /> +<glyph unicode="=" d="M119 449v137h930v-137h-930zM119 858v137h930v-137h-930z" /> +<glyph unicode="&#x3e;" d="M104 242v151l783 326l-783 373v149l961 -479v-98z" /> +<glyph unicode="?" horiz-adv-x="879" d="M27 1384q189 99 395 99q191 0 297 -94t106 -265q0 -73 -19.5 -128.5t-57.5 -105t-164 -159.5q-101 -86 -133.5 -143t-32.5 -152v-33h-129v54q0 117 36 192.5t134 159.5q136 115 171.5 173t35.5 140q0 102 -65.5 157.5t-188.5 55.5q-79 0 -154 -18.5t-172 -67.5zM240 106 q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5z" /> +<glyph unicode="@" horiz-adv-x="1841" d="M121 571q0 260 107 463t305 314.5t454 111.5q215 0 382.5 -90.5t259 -257t91.5 -383.5q0 -142 -44 -260t-124 -183t-184 -65q-86 0 -145 52t-70 133h-8q-40 -87 -114.5 -136t-176.5 -49q-150 0 -234.5 102.5t-84.5 278.5q0 204 118 331.5t310 127.5q68 0 154 -12.5 t155 -34.5l-25 -470v-22q0 -178 133 -178q91 0 148 107.5t57 279.5q0 181 -74 317t-210.5 209.5t-313.5 73.5q-223 0 -388 -92.5t-252 -264t-87 -396.5q0 -305 161 -469t464 -164q210 0 436 86v-133q-192 -84 -436 -84q-363 0 -563.5 199.5t-200.5 557.5zM686 598 q0 -254 195 -254q207 0 225 313l14 261q-72 20 -157 20q-130 0 -203.5 -90t-73.5 -250z" /> +<glyph unicode="A" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211z" /> +<glyph unicode="B" horiz-adv-x="1327" d="M201 0v1462h413q291 0 421 -87t130 -275q0 -130 -72.5 -214.5t-211.5 -109.5v-10q333 -57 333 -350q0 -196 -132.5 -306t-370.5 -110h-510zM371 145h305q177 0 266.5 68.5t89.5 214.5q0 136 -91.5 200t-278.5 64h-291v-547zM371 836h280q180 0 259 56.5t79 190.5 q0 123 -88 177.5t-280 54.5h-250v-479z" /> +<glyph unicode="C" horiz-adv-x="1292" d="M125 733q0 226 84.5 396t244 262t375.5 92q230 0 402 -84l-72 -146q-166 78 -332 78q-241 0 -380.5 -160.5t-139.5 -439.5q0 -287 134.5 -443.5t383.5 -156.5q153 0 349 55v-149q-152 -57 -375 -57q-323 0 -498.5 196t-175.5 557z" /> +<glyph unicode="D" horiz-adv-x="1493" d="M201 0v1462h448q341 0 530 -189t189 -528q0 -362 -196.5 -553.5t-565.5 -191.5h-405zM371 147h207q304 0 457 149.5t153 442.5q0 286 -143.5 431t-426.5 145h-247v-1168z" /> +<glyph unicode="E" horiz-adv-x="1139" d="M201 0v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152h-815z" /> +<glyph unicode="F" horiz-adv-x="1057" d="M201 0v1462h815v-151h-645v-535h606v-151h-606v-625h-170z" /> +<glyph unicode="G" horiz-adv-x="1491" d="M125 731q0 228 91.5 399.5t263.5 262t403 90.5q234 0 436 -86l-66 -150q-198 84 -381 84q-267 0 -417 -159t-150 -441q0 -296 144.5 -449t424.5 -153q152 0 297 35v450h-327v152h497v-711q-116 -37 -236 -56t-278 -19q-332 0 -517 197.5t-185 553.5z" /> +<glyph unicode="H" horiz-adv-x="1511" d="M201 0v1462h170v-622h770v622h170v-1462h-170v688h-770v-688h-170z" /> +<glyph unicode="I" horiz-adv-x="571" d="M201 0v1462h170v-1462h-170z" /> +<glyph unicode="J" horiz-adv-x="547" d="M-160 -213q71 -20 148 -20q99 0 150.5 60t51.5 173v1462h170v-1448q0 -190 -96 -294.5t-276 -104.5q-94 0 -148 27v145z" /> +<glyph unicode="K" horiz-adv-x="1257" d="M201 0v1462h170v-725l663 725h201l-588 -635l610 -827h-200l-533 709l-153 -136v-573h-170z" /> +<glyph unicode="L" horiz-adv-x="1063" d="M201 0v1462h170v-1308h645v-154h-815z" /> +<glyph unicode="M" horiz-adv-x="1849" d="M201 0v1462h256l463 -1206h8l467 1206h254v-1462h-170v942q0 162 14 352h-8l-500 -1294h-137l-496 1296h-8q14 -154 14 -366v-930h-157z" /> +<glyph unicode="N" horiz-adv-x="1544" d="M201 0v1462h192l797 -1222h8q-2 28 -9 174q-5 114 -5 177v32v839h159v-1462h-194l-799 1227h-8q16 -216 16 -396v-831h-157z" /> +<glyph unicode="O" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5z" /> +<glyph unicode="P" horiz-adv-x="1233" d="M201 0v1462h379q548 0 548 -426q0 -222 -151.5 -341.5t-433.5 -119.5h-172v-575h-170zM371 721h153q226 0 327 73t101 234q0 145 -95 216t-296 71h-190v-594z" /> +<glyph unicode="Q" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -281 -113 -467t-319 -252l348 -362h-247l-285 330l-55 -2q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5 q-243 0 -369.5 -153.5t-126.5 -446.5z" /> +<glyph unicode="R" horiz-adv-x="1266" d="M201 0v1462h401q269 0 397.5 -103t128.5 -310q0 -290 -294 -392l397 -657h-201l-354 608h-305v-608h-170zM371 754h233q180 0 264 71.5t84 214.5q0 145 -85.5 209t-274.5 64h-221v-559z" /> +<glyph unicode="S" horiz-adv-x="1124" d="M106 47v164q90 -38 196 -60t210 -22q170 0 256 64.5t86 179.5q0 76 -30.5 124.5t-102 89.5t-217.5 93q-204 73 -291.5 173t-87.5 261q0 169 127 269t336 100q218 0 401 -80l-53 -148q-181 76 -352 76q-135 0 -211 -58t-76 -161q0 -76 28 -124.5t94.5 -89t203.5 -89.5 q230 -82 316.5 -176t86.5 -244q0 -193 -140 -301t-380 -108q-260 0 -400 67z" /> +<glyph unicode="T" horiz-adv-x="1133" d="M18 1311v151h1096v-151h-463v-1311h-170v1311h-463z" /> +<glyph unicode="U" horiz-adv-x="1491" d="M186 520v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396z" /> +<glyph unicode="V" horiz-adv-x="1219" d="M0 1462h180l336 -946q58 -163 92 -317q36 162 94 323l334 940h183l-527 -1462h-168z" /> +<glyph unicode="W" horiz-adv-x="1896" d="M27 1462h180l231 -903q48 -190 70 -344q27 183 80 358l262 889h180l275 -897q48 -155 81 -350q19 142 72 346l230 901h180l-391 -1462h-168l-295 979q-21 65 -47 164t-27 119q-22 -132 -70 -289l-286 -973h-168z" /> +<glyph unicode="X" horiz-adv-x="1182" d="M8 0l486 764l-453 698h188l363 -579l366 579h181l-453 -692l488 -770h-193l-393 643l-400 -643h-180z" /> +<glyph unicode="Y" horiz-adv-x="1147" d="M0 1462h186l387 -731l390 731h184l-488 -895v-567h-172v559z" /> +<glyph unicode="Z" horiz-adv-x="1169" d="M82 0v133l776 1176h-752v153h959v-133l-776 -1175h798v-154h-1005z" /> +<glyph unicode="[" horiz-adv-x="674" d="M166 -324v1786h457v-141h-289v-1503h289v-142h-457z" /> +<glyph unicode="\" horiz-adv-x="752" d="M23 1462h163l547 -1462h-166z" /> +<glyph unicode="]" horiz-adv-x="674" d="M51 -182h289v1503h-289v141h457v-1786h-457v142z" /> +<glyph unicode="^" horiz-adv-x="1110" d="M49 551l434 922h99l477 -922h-152l-372 745l-334 -745h-152z" /> +<glyph unicode="_" horiz-adv-x="918" d="M-4 -184h926v-131h-926v131z" /> +<glyph unicode="`" horiz-adv-x="1182" d="M393 1548v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="a" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5z" /> +<glyph unicode="b" horiz-adv-x="1255" d="M176 0v1556h166v-378q0 -127 -8 -228h8q116 164 344 164q216 0 335.5 -147.5t119.5 -417.5t-120.5 -419.5t-334.5 -149.5q-107 0 -195.5 39.5t-148.5 121.5h-12l-35 -141h-119zM342 549q0 -231 77 -330.5t247 -99.5q153 0 228 111.5t75 320.5q0 214 -75 319t-232 105 q-170 0 -245 -97.5t-75 -328.5z" /> +<glyph unicode="c" horiz-adv-x="975" d="M115 541q0 275 132.5 425t377.5 150q79 0 158 -17t124 -40l-51 -141q-55 22 -120 36.5t-115 14.5q-334 0 -334 -426q0 -202 81.5 -310t241.5 -108q137 0 281 59v-147q-110 -57 -277 -57q-238 0 -368.5 146.5t-130.5 414.5z" /> +<glyph unicode="d" horiz-adv-x="1255" d="M115 545q0 271 120 421t334 150q223 0 342 -162h13l-7 79l-4 77v446h166v-1556h-135l-22 147h-9q-115 -167 -344 -167q-215 0 -334.5 147t-119.5 418zM287 543q0 -210 77 -317t226 -107q170 0 246.5 92.5t76.5 298.5v35q0 233 -77.5 332.5t-247.5 99.5 q-146 0 -223.5 -113.5t-77.5 -320.5z" /> +<glyph unicode="e" horiz-adv-x="1149" d="M115 539q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5q-243 0 -383.5 148t-140.5 411zM291 653h573q0 157 -70 240.5t-200 83.5q-132 0 -210.5 -86t-92.5 -238z " /> +<glyph unicode="f" horiz-adv-x="694" d="M29 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129h-279v-967h-166v967h-196z" /> +<glyph unicode="g" horiz-adv-x="1122" d="M39 -186q0 100 64 173t180 99q-42 19 -70.5 59t-28.5 93q0 60 32 105t101 87q-85 35 -138.5 119t-53.5 192q0 180 108 277.5t306 97.5q86 0 155 -20h379v-105l-203 -24q28 -35 50 -91.5t22 -127.5q0 -161 -110 -257t-302 -96q-49 0 -92 8q-106 -56 -106 -141 q0 -45 37 -66.5t127 -21.5h194q178 0 273.5 -75t95.5 -218q0 -182 -146 -277.5t-426 -95.5q-215 0 -331.5 80t-116.5 226zM199 -184q0 -89 75 -135t215 -46q209 0 309.5 62.5t100.5 169.5q0 89 -55 123.5t-207 34.5h-199q-113 0 -176 -54t-63 -155zM289 745q0 -115 65 -174 t181 -59q243 0 243 236q0 247 -246 247q-117 0 -180 -63t-63 -187z" /> +<glyph unicode="h" horiz-adv-x="1257" d="M176 0v1556h166v-471q0 -85 -8 -141h10q49 79 139.5 124.5t206.5 45.5q201 0 301.5 -95.5t100.5 -303.5v-715h-166v709q0 134 -61 200t-191 66q-173 0 -252.5 -94t-79.5 -308v-573h-166z" /> +<glyph unicode="i" horiz-adv-x="518" d="M162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5zM176 0v1096h166v-1096h-166z" /> +<glyph unicode="j" horiz-adv-x="518" d="M-111 -332q69 -20 136 -20q78 0 114.5 42.5t36.5 129.5v1276h166v-1264q0 -324 -299 -324q-95 0 -154 25v135zM162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5z" /> +<glyph unicode="k" horiz-adv-x="1075" d="M176 0v1556h164v-825q0 -55 -8 -170h8q43 61 131 160l354 375h197l-444 -467l475 -629h-201l-387 518l-125 -108v-410h-164z" /> +<glyph unicode="l" horiz-adv-x="518" d="M176 0v1556h166v-1556h-166z" /> +<glyph unicode="m" horiz-adv-x="1905" d="M176 0v1096h135l27 -150h8q47 80 132.5 125t191.5 45q257 0 336 -186h8q49 86 142 136t212 50q186 0 278.5 -95.5t92.5 -305.5v-715h-166v713q0 131 -56 196.5t-174 65.5q-155 0 -229 -89t-74 -274v-612h-166v713q0 131 -56 196.5t-175 65.5q-156 0 -228.5 -93.5 t-72.5 -306.5v-575h-166z" /> +<glyph unicode="n" horiz-adv-x="1257" d="M176 0v1096h135l27 -150h8q51 81 143 125.5t205 44.5q198 0 298 -95.5t100 -305.5v-715h-166v709q0 134 -61 200t-191 66q-172 0 -252 -93t-80 -307v-575h-166z" /> +<glyph unicode="o" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z" /> +<glyph unicode="p" horiz-adv-x="1255" d="M176 -492v1588h135l23 -150h8q64 90 149 130t195 40q218 0 336.5 -149t118.5 -418q0 -270 -120.5 -419.5t-334.5 -149.5q-107 0 -195.5 39.5t-148.5 121.5h-12q12 -96 12 -182v-451h-166zM342 549q0 -231 77 -330.5t247 -99.5q142 0 222.5 115t80.5 317 q0 205 -80.5 314.5t-226.5 109.5q-168 0 -243 -93t-77 -296v-37z" /> +<glyph unicode="q" horiz-adv-x="1255" d="M115 545q0 269 120 420t334 151q225 0 346 -170h9l24 150h131v-1588h-166v469q0 100 11 170h-13q-115 -167 -346 -167q-212 0 -331 149t-119 416zM287 543q0 -207 76.5 -315.5t226.5 -108.5q166 0 242 89t81 300v37q0 230 -78 331t-247 101q-146 0 -223.5 -113.5 t-77.5 -320.5z" /> +<glyph unicode="r" horiz-adv-x="836" d="M176 0v1096h137l19 -203h8q61 107 147 165t189 58q73 0 131 -12l-23 -154q-68 15 -120 15q-133 0 -227.5 -108t-94.5 -269v-588h-166z" /> +<glyph unicode="s" horiz-adv-x="977" d="M106 827q0 134 109 211.5t299 77.5q177 0 346 -72l-59 -135q-165 68 -299 68q-118 0 -178 -37t-60 -102q0 -44 22.5 -75t72.5 -59t192 -81q195 -71 263.5 -143t68.5 -181q0 -153 -114 -236t-320 -83q-218 0 -340 69v154q79 -40 169.5 -63t174.5 -23q130 0 200 41.5 t70 126.5q0 64 -55.5 109.5t-216.5 107.5q-153 57 -217.5 99.5t-96 96.5t-31.5 129z" /> +<glyph unicode="t" horiz-adv-x="723" d="M31 967v80l157 69l70 234h96v-254h318v-129h-318v-645q0 -99 47 -152t129 -53q44 0 85 6.5t65 13.5v-127q-27 -13 -79.5 -21.5t-94.5 -8.5q-318 0 -318 335v652h-157z" /> +<glyph unicode="u" horiz-adv-x="1257" d="M164 379v717h168v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304z" /> +<glyph unicode="v" horiz-adv-x="1026" d="M0 1096h178l236 -650q80 -228 94 -296h8q11 53 69.5 219.5t262.5 726.5h178l-416 -1096h-194z" /> +<glyph unicode="w" horiz-adv-x="1593" d="M23 1096h174q106 -413 161.5 -629t63.5 -291h8q11 57 35.5 147.5t42.5 143.5l201 629h180l196 -629q56 -172 76 -289h8q4 36 21.5 111t208.5 807h172l-303 -1096h-197l-201 643q-19 59 -71 268h-8q-40 -175 -70 -270l-207 -641h-192z" /> +<glyph unicode="x" horiz-adv-x="1073" d="M39 0l401 561l-381 535h189l289 -420l288 420h187l-381 -535l401 -561h-188l-307 444l-310 -444h-188z" /> +<glyph unicode="y" horiz-adv-x="1032" d="M2 1096h178l240 -625q79 -214 98 -309h8q13 51 54.5 174.5t271.5 759.5h178l-471 -1248q-70 -185 -163.5 -262.5t-229.5 -77.5q-76 0 -150 17v133q55 -12 123 -12q171 0 244 192l61 156z" /> +<glyph unicode="z" horiz-adv-x="958" d="M82 0v113l598 854h-561v129h743v-129l-590 -838h605v-129h-795z" /> +<glyph unicode="{" horiz-adv-x="776" d="M61 498v141q130 2 188 48t58 142v306q0 155 108 241t290 86v-139q-230 -6 -230 -199v-295q0 -215 -223 -254v-12q223 -39 223 -254v-297q0 -102 58.5 -148t171.5 -48v-140q-190 2 -294 87t-104 239v303q0 104 -63 148.5t-183 44.5z" /> +<glyph unicode="|" horiz-adv-x="1128" d="M494 -496v2052h141v-2052h-141z" /> +<glyph unicode="}" horiz-adv-x="776" d="M72 -184q111 2 169 48t58 148v297q0 114 55 174t168 80v12q-223 39 -223 254v295q0 193 -227 199v139q184 0 289.5 -87t105.5 -240v-306q0 -97 59 -142.5t189 -47.5v-141q-122 0 -185 -44.5t-63 -148.5v-303q0 -153 -102.5 -238.5t-292.5 -87.5v140z" /> +<glyph unicode="~" d="M104 592v151q100 109 244 109q68 0 124.5 -14t145.5 -52q66 -28 115 -41.5t96 -13.5q54 0 118 32t118 89v-150q-102 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12q-53 0 -116.5 -33.5t-117.5 -87.5z" /> +<glyph unicode="&#xa1;" horiz-adv-x="547" d="M152 983q0 63 31.5 99t88.5 36q51 0 86 -32t35 -103q0 -135 -121 -135q-60 0 -90 35.5t-30 99.5zM168 -373l51 1057h105l51 -1057h-207z" /> +<glyph unicode="&#xa2;" d="M190 741q0 508 396 570v172h135v-164q75 -3 146 -19.5t120 -39.5l-49 -140q-133 51 -242 51q-172 0 -253 -105.5t-81 -322.5q0 -212 79.5 -313.5t246.5 -101.5q141 0 283 59v-147q-105 -54 -252 -60v-200h-133v206q-203 32 -299.5 168.5t-96.5 386.5z" /> +<glyph unicode="&#xa3;" d="M63 0v141q205 47 205 291v223h-198v127h198v316q0 178 112 280.5t302 102.5t360 -84l-61 -133q-154 77 -297 77q-123 0 -185.5 -62t-62.5 -202v-295h422v-127h-422v-221q0 -100 -32.5 -168t-106.5 -112h795v-154h-1029z" /> +<glyph unicode="&#xa4;" d="M123 1092l94 92l135 -133q104 73 234 73q127 0 229 -73l137 133l95 -92l-134 -138q74 -113 74 -231q0 -131 -74 -234l131 -135l-92 -92l-137 133q-102 -71 -229 -71q-134 0 -234 73l-135 -133l-92 92l133 136q-74 107 -74 231q0 122 74 229zM313 723q0 -112 78.5 -192 t194.5 -80t195 79.5t79 192.5q0 114 -80 195t-194 81q-116 0 -194.5 -82t-78.5 -194z" /> +<glyph unicode="&#xa5;" d="M31 1462h178l375 -727l379 727h174l-416 -770h262v-127h-317v-170h317v-127h-317v-268h-164v268h-316v127h316v170h-316v127h256z" /> +<glyph unicode="&#xa6;" horiz-adv-x="1128" d="M494 281h141v-777h-141v777zM494 780v776h141v-776h-141z" /> +<glyph unicode="&#xa7;" horiz-adv-x="1057" d="M123 57v148q78 -37 175 -59.5t179 -22.5q134 0 204.5 38t70.5 109q0 46 -24 75t-78 58t-169 72q-142 52 -209 97t-100 102t-33 135q0 86 43 154.5t121 105.5q-74 40 -116 95.5t-42 140.5q0 121 103.5 190.5t300.5 69.5q94 0 173.5 -14.5t176.5 -53.5l-53 -131 q-98 39 -165.5 52.5t-143.5 13.5q-116 0 -174 -29.5t-58 -93.5q0 -60 61.5 -102t215.5 -97q186 -68 261 -143.5t75 -182.5q0 -90 -41 -160.5t-115 -111.5q153 -81 153 -227q0 -140 -117 -216.5t-329 -76.5q-218 0 -346 65zM285 829q0 -77 66 -129.5t233 -113.5l49 -19 q137 80 137 191q0 83 -73.5 139t-258.5 113q-68 -19 -110.5 -69t-42.5 -112z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1182" d="M309 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM690 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323 t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM481 731q0 209 110.5 332t301.5 123q128 0 246 -60l-58 -118q-108 51 -188 51q-125 0 -192.5 -87t-67.5 -241q0 -168 63.5 -249t194.5 -81q86 0 211 45v-124q-48 -20 -98.5 -34t-120.5 -14 q-194 0 -298 120.5t-104 336.5z" /> +<glyph unicode="&#xaa;" horiz-adv-x="725" d="M70 989q0 102 77 154.5t242 58.5l117 4v39q0 133 -148 133q-100 0 -204 -51l-43 96q114 56 247 56q130 0 198.5 -52.5t68.5 -173.5v-452h-93l-24 84q-92 -97 -232 -97q-95 0 -150.5 49.5t-55.5 151.5zM193 989q0 -100 112 -100q201 0 201 180v49l-98 -4 q-112 -4 -163.5 -32.5t-51.5 -92.5z" /> +<glyph unicode="&#xab;" horiz-adv-x="1018" d="M82 524v27l342 407l119 -69l-289 -350l289 -351l-119 -71zM477 524v27l344 407l117 -69l-287 -350l287 -351l-117 -71z" /> +<glyph unicode="&#xac;" d="M104 653v138h961v-527h-137v389h-824z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323 t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM575 285v891h261q166 0 243.5 -65t77.5 -198q0 -80 -42.5 -141.5t-119.5 -91.5l238 -395h-168l-207 354h-135v-354h-148zM723 762h108q80 0 128.5 41.5t48.5 105.5q0 75 -43 107.5t-136 32.5h-106 v-287z" /> +<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M-6 1556v127h1036v-127h-1036z" /> +<glyph unicode="&#xb0;" horiz-adv-x="877" d="M127 1171q0 130 90.5 221t220.5 91t221 -90.5t91 -221.5q0 -84 -41 -155.5t-114 -113.5t-157 -42q-130 0 -220.5 90t-90.5 221zM242 1171q0 -82 58.5 -139t139.5 -57q80 0 137.5 56.5t57.5 139.5q0 84 -56.5 140.5t-138.5 56.5q-83 0 -140.5 -57t-57.5 -140z" /> +<glyph unicode="&#xb1;" d="M104 653v138h410v428h139v-428h412v-138h-412v-426h-139v426h-410zM104 1v138h961v-138h-961z" /> +<glyph unicode="&#xb2;" horiz-adv-x="711" d="M49 586v104l236 230q89 86 130 134.5t57.5 86.5t16.5 92q0 68 -40 102.5t-103 34.5q-52 0 -101 -19t-118 -69l-66 88q131 111 283 111q132 0 205.5 -65t73.5 -177q0 -80 -44.5 -155.5t-191.5 -213.5l-174 -165h440v-119h-604z" /> +<glyph unicode="&#xb3;" horiz-adv-x="711" d="M33 625v123q147 -68 270 -68q211 0 211 162q0 145 -231 145h-117v107h119q103 0 152.5 39.5t49.5 107.5q0 61 -40 95t-107 34q-66 0 -122 -21.5t-112 -56.5l-69 90q63 45 133 72t164 27q136 0 214.5 -59.5t78.5 -166.5q0 -80 -41 -131.5t-109 -74.5q176 -47 176 -209 q0 -128 -92 -199.5t-260 -71.5q-152 0 -268 56z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1182" d="M393 1241v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1268" d="M176 -492v1588h166v-715q0 -262 254 -262q171 0 250.5 94.5t79.5 306.5v576h166v-1096h-136l-26 147h-10q-111 -167 -340 -167q-150 0 -238 92h-10q10 -84 10 -244v-320h-166z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M113 1042q0 260 109 387t341 127h557v-1816h-114v1712h-213v-1712h-115v819q-62 -18 -146 -18q-216 0 -317.5 125t-101.5 376z" /> +<glyph unicode="&#xb7;" horiz-adv-x="545" d="M152 723q0 66 31 100.5t87 34.5q58 0 90.5 -34.5t32.5 -100.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" /> +<glyph unicode="&#xb8;" horiz-adv-x="465" d="M37 -377q45 -8 104 -8q79 0 119.5 20t40.5 74q0 43 -39.5 69.5t-148.5 43.5l88 178h110l-55 -115q180 -39 180 -174q0 -97 -76.5 -150t-226.5 -53q-51 0 -96 9v106z" /> +<glyph unicode="&#xb9;" horiz-adv-x="711" d="M76 1280l262 182h143v-876h-133v579q0 91 6 181q-22 -22 -49 -44.5t-162 -117.5z" /> +<glyph unicode="&#xba;" horiz-adv-x="768" d="M66 1135q0 163 84 253.5t235 90.5q152 0 234.5 -91t82.5 -253q0 -164 -85.5 -255.5t-235.5 -91.5q-146 0 -230.5 93t-84.5 254zM188 1135q0 -122 45.5 -183t149.5 -61q105 0 151 61t46 183q0 123 -46 182t-151 59q-103 0 -149 -59t-46 -182z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1018" d="M80 188l287 351l-287 350l117 69l344 -407v-27l-344 -407zM475 188l287 351l-287 350l117 69l344 -407v-27l-344 -407z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1597" d="M252 0l903 1462h143l-903 -1462h-143zM75 1280l262 182h143v-876h-133v579q0 91 6 181q-22 -22 -49 -44.5t-162 -117.5zM817 203v101l408 579h139v-563h125v-117h-125v-202h-145v202h-402zM957 320h262v195q0 134 6 209q-5 -12 -17 -31.5t-27 -41.5l-30 -46 q-15 -22 -26 -39z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1597" d="M184 0l903 1462h143l-903 -1462h-143zM46 1280l262 182h143v-876h-133v579q0 91 6 181q-22 -22 -49 -44.5t-162 -117.5zM895 1v104l236 230q89 86 130 134.5t57.5 86.5t16.5 92q0 68 -40 102.5t-103 34.5q-52 0 -101 -19t-118 -69l-66 88q131 111 283 111 q132 0 205.5 -65t73.5 -177q0 -80 -44.5 -155.5t-191.5 -213.5l-174 -165h440v-119h-604z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1597" d="M26 625v123q147 -68 270 -68q211 0 211 162q0 145 -231 145h-117v107h119q103 0 152.5 39.5t49.5 107.5q0 61 -40 95t-107 34q-66 0 -122 -21.5t-112 -56.5l-69 90q63 45 133 72t164 27q136 0 214.5 -59.5t78.5 -166.5q0 -80 -41 -131.5t-109 -74.5q176 -47 176 -209 q0 -128 -92 -199.5t-260 -71.5q-152 0 -268 56zM344 0l903 1462h143l-903 -1462h-143zM897 203v101l408 579h139v-563h125v-117h-125v-202h-145v202h-402zM1037 320h262v195q0 134 6 209q-5 -12 -17 -31.5t-27 -41.5l-30 -46q-15 -22 -26 -39z" /> +<glyph unicode="&#xbf;" horiz-adv-x="879" d="M51 -37q0 70 17.5 122.5t49.5 97t76.5 85.5t98.5 88q101 88 133.5 146t32.5 151v31h131v-51q0 -122 -37.5 -196t-134.5 -158q-121 -106 -151.5 -143.5t-43 -76t-12.5 -94.5q0 -100 66 -156.5t188 -56.5q80 0 155 19t173 67l59 -135q-197 -96 -395 -96q-190 0 -298 93 t-108 263zM397 983q0 64 33 99.5t88 35.5q51 0 86 -32t35 -103q0 -135 -121 -135q-59 0 -90 34.5t-31 100.5z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211zM331 1886v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211zM526 1579v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211zM303 1579v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211zM268 1579q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5 q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211zM364 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM745 1731q0 52 26.5 75 t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211zM424 1585q0 98 60.5 155.5t160.5 57.5q101 0 163 -59.5t62 -151.5q0 -98 -61.5 -157.5t-163.5 -59.5q-101 0 -161 58.5t-60 156.5zM528 1585 q0 -56 30 -86.5t87 -30.5q52 0 84.5 30.5t32.5 86.5t-33 86.5t-84 30.5t-84 -30.5t-33 -86.5z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1788" d="M-2 0l698 1462h969v-151h-580v-471h541v-150h-541v-538h580v-152h-750v465h-514l-227 -465h-176zM469 618h446v693h-118z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1292" d="M125 733q0 226 84.5 396t244 262t375.5 92q230 0 402 -84l-72 -146q-166 78 -332 78q-241 0 -380.5 -160.5t-139.5 -439.5q0 -287 134.5 -443.5t383.5 -156.5q153 0 349 55v-149q-152 -57 -375 -57q-323 0 -498.5 196t-175.5 557zM551 -377q45 -8 104 -8q79 0 119.5 20 t40.5 74q0 43 -39.5 69.5t-148.5 43.5l88 178h110l-55 -115q180 -39 180 -174q0 -97 -76.5 -150t-226.5 -53q-51 0 -96 9v106z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1139" d="M201 0v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152h-815zM320 1886v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1139" d="M201 0v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152h-815zM456 1579v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xca;" horiz-adv-x="1139" d="M201 0v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152h-815zM263 1579v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1139" d="M201 0v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152h-815zM327 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM708 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5 t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xcc;" horiz-adv-x="571" d="M201 0v1462h170v-1462h-170zM5 1886v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xcd;" horiz-adv-x="571" d="M201 0v1462h170v-1462h-170zM179 1579v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xce;" horiz-adv-x="571" d="M201 0v1462h170v-1462h-170zM-57 1579v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#xcf;" horiz-adv-x="571" d="M201 0v1462h170v-1462h-170zM5 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM386 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1479" d="M47 649v150h154v663h434q337 0 527 -187.5t190 -529.5q0 -362 -196.5 -553.5t-565.5 -191.5h-389v649h-154zM371 147h190q610 0 610 592q0 576 -569 576h-231v-516h379v-150h-379v-502z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1544" d="M201 0v1462h192l797 -1222h8q-2 28 -9 174q-5 114 -5 177v32v839h159v-1462h-194l-799 1227h-8q16 -216 16 -396v-831h-157zM411 1579q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5 q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM514 1886v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM659 1579v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM448 1579v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM418 1579q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM522 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM903 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xd7;" d="M133 1075l100 101l353 -355l354 355l96 -99l-352 -354l350 -352l-96 -99l-354 351l-348 -351l-101 99l350 352z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q209 0 366 -94l97 135l120 -80l-106 -148q192 -202 192 -565q0 -351 -177.5 -552t-493.5 -201q-235 0 -383 100l-101 -141l-120 79l108 154q-178 198 -178 563zM305 733q0 -262 101 -416l669 943q-106 73 -274 73 q-243 0 -369.5 -153.5t-126.5 -446.5zM508 211q115 -82 291 -82q243 0 367 153t124 451q0 272 -110 426z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1491" d="M186 520v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396zM463 1886v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xda;" horiz-adv-x="1491" d="M186 520v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396zM600 1579v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1491" d="M186 520v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396zM393 1579v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186 h-115z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1491" d="M186 520v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396zM461 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5z M842 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1147" d="M0 1462h186l387 -731l390 731h184l-488 -895v-567h-172v559zM442 1579v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xde;" horiz-adv-x="1251" d="M201 0v1462h170v-256h215q281 0 420 -103.5t139 -318.5q0 -227 -151.5 -346t-438.5 -119h-184v-319h-170zM371 465h168q226 0 327 71.5t101 235.5q0 149 -95 218t-297 69h-204v-594z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1274" d="M176 0v1202q0 178 110 271.5t332 93.5q206 0 318.5 -78.5t112.5 -222.5q0 -135 -143 -250q-88 -70 -116 -103.5t-28 -66.5q0 -32 13.5 -53t49 -49.5t113.5 -79.5q140 -95 191 -173.5t51 -179.5q0 -160 -97 -245.5t-276 -85.5q-188 0 -295 69v154q63 -39 141 -62.5 t150 -23.5q215 0 215 182q0 75 -41.5 128.5t-151.5 123.5q-127 82 -175 143.5t-48 145.5q0 63 34.5 116t105.5 106q75 57 107 102t32 98q0 80 -68 122.5t-195 42.5q-276 0 -276 -223v-1204h-166z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5zM279 1548v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5zM436 1241v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5zM228 1241v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5zM197 1241q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5q-43 0 -84 18.5t-80.5 41t-76 41 t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5zM279 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM660 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75 q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5zM358 1456q0 98 60.5 155.5t160.5 57.5q101 0 163 -59.5t62 -151.5q0 -98 -61.5 -157.5t-163.5 -59.5q-101 0 -161 58.5t-60 156.5zM462 1456q0 -56 30 -86.5t87 -30.5q52 0 84.5 30.5 t32.5 86.5t-33 86.5t-84 30.5t-84 -30.5t-33 -86.5z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1757" d="M94 303q0 161 124 250.5t378 97.5l184 6v68q0 129 -58 190.5t-177 61.5q-144 0 -307 -84l-52 127q74 41 173.5 67.5t197.5 26.5q130 0 212.5 -43.5t123.5 -138.5q53 88 138.5 136t195.5 48q192 0 308 -133.5t116 -355.5v-107h-701q8 -395 322 -395q91 0 169.5 17.5 t162.5 56.5v-148q-86 -38 -160.5 -54.5t-175.5 -16.5q-289 0 -414 233q-81 -127 -179.5 -180t-232.5 -53q-163 0 -255.5 85t-92.5 238zM268 301q0 -95 53.5 -139.5t141.5 -44.5q145 0 229 84.5t84 238.5v99l-158 -7q-186 -8 -268 -62.5t-82 -168.5zM954 653h519 q0 156 -64 240t-184 84q-121 0 -190.5 -83t-80.5 -241z" /> +<glyph unicode="&#xe7;" horiz-adv-x="975" d="M115 541q0 275 132.5 425t377.5 150q79 0 158 -17t124 -40l-51 -141q-55 22 -120 36.5t-115 14.5q-334 0 -334 -426q0 -202 81.5 -310t241.5 -108q137 0 281 59v-147q-110 -57 -277 -57q-238 0 -368.5 146.5t-130.5 414.5zM363 -377q45 -8 104 -8q79 0 119.5 20t40.5 74 q0 43 -39.5 69.5t-148.5 43.5l88 178h110l-55 -115q180 -39 180 -174q0 -97 -76.5 -150t-226.5 -53q-51 0 -96 9v106z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1149" d="M115 539q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5q-243 0 -383.5 148t-140.5 411zM291 653h573q0 157 -70 240.5t-200 83.5q-132 0 -210.5 -86t-92.5 -238z M318 1548v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1149" d="M115 539q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5q-243 0 -383.5 148t-140.5 411zM291 653h573q0 157 -70 240.5t-200 83.5q-132 0 -210.5 -86t-92.5 -238z M471 1241v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xea;" horiz-adv-x="1149" d="M115 539q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5q-243 0 -383.5 148t-140.5 411zM291 653h573q0 157 -70 240.5t-200 83.5q-132 0 -210.5 -86t-92.5 -238z M259 1241v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1149" d="M115 539q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5q-243 0 -383.5 148t-140.5 411zM291 653h573q0 157 -70 240.5t-200 83.5q-132 0 -210.5 -86t-92.5 -238z M319 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM700 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xec;" horiz-adv-x="518" d="M176 0v1096h166v-1096h-166zM-38 1548v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xed;" horiz-adv-x="518" d="M176 0v1096h166v-1096h-166zM169 1241v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xee;" horiz-adv-x="518" d="M176 0v1096h166v-1096h-166zM-77 1241v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#xef;" horiz-adv-x="518" d="M176 0v1096h166v-1096h-166zM-20 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM361 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1221" d="M113 475q0 230 131.5 361t351.5 131q226 0 326 -121l8 4q-57 214 -262 405l-271 -155l-73 108l233 133q-92 62 -186 111l69 117q156 -73 258 -148l238 138l76 -107l-207 -119q152 -143 234.5 -342t82.5 -428q0 -281 -130.5 -432t-377.5 -151q-222 0 -361.5 134.5 t-139.5 360.5zM281 469q0 -167 87.5 -258.5t249.5 -91.5q175 0 255.5 100.5t80.5 292.5q0 147 -90 232t-246 85q-337 0 -337 -360z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1257" d="M176 0v1096h135l27 -150h8q51 81 143 125.5t205 44.5q198 0 298 -95.5t100 -305.5v-715h-166v709q0 134 -61 200t-191 66q-172 0 -252 -93t-80 -307v-575h-166zM278 1241q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99 q-13 -121 -69.5 -189.5t-150.5 -68.5q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319zM349 1548v21 h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319zM479 1241v25 q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319zM282 1241v23 q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319zM249 1241 q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319zM336 1393 q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM717 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xf7;" d="M104 653v138h961v-138h-961zM471 373q0 60 29.5 90.5t83.5 30.5q52 0 81 -31.5t29 -89.5q0 -57 -29.5 -89t-80.5 -32q-52 0 -82.5 31.5t-30.5 89.5zM471 1071q0 60 29.5 90.5t83.5 30.5q52 0 81 -31.5t29 -89.5q0 -57 -29.5 -89t-80.5 -32q-52 0 -82.5 31.5t-30.5 89.5z " /> +<glyph unicode="&#xf8;" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q154 0 270 -76l84 119l117 -76l-97 -133q127 -152 127 -401q0 -268 -135 -418.5t-373 -150.5q-154 0 -266 69l-84 -117l-114 78l94 131q-129 152 -129 408zM287 549q0 -171 53 -273l465 646q-75 53 -189 53q-163 0 -246 -107t-83 -319 zM434 170q71 -51 184 -51q163 0 247.5 109.5t84.5 320.5q0 164 -51 264z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1257" d="M164 379v717h168v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304zM333 1548v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1257" d="M164 379v717h168v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304zM506 1241v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1257" d="M164 379v717h168v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304zM286 1241v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119 q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1257" d="M164 379v717h168v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304zM342 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5 q-37 0 -63.5 24.5t-26.5 74.5zM723 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1032" d="M2 1096h178l240 -625q79 -214 98 -309h8q13 51 54.5 174.5t271.5 759.5h178l-471 -1248q-70 -185 -163.5 -262.5t-229.5 -77.5q-76 0 -150 17v133q55 -12 123 -12q171 0 244 192l61 156zM411 1241v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111 z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1255" d="M176 -492v2048h166v-466q0 -52 -6 -142h8q66 89 151 128.5t191 39.5q215 0 335 -150t120 -417q0 -268 -120.5 -418.5t-334.5 -150.5q-222 0 -344 161h-12l4 -34q8 -77 8 -140v-459h-166zM342 549q0 -231 77 -330.5t247 -99.5q303 0 303 432q0 215 -74 319.5t-231 104.5 q-168 0 -244 -92t-78 -293v-41z" /> +<glyph unicode="&#xff;" horiz-adv-x="1032" d="M2 1096h178l240 -625q79 -214 98 -309h8q13 51 54.5 174.5t271.5 759.5h178l-471 -1248q-70 -185 -163.5 -262.5t-229.5 -77.5q-76 0 -150 17v133q55 -12 123 -12q171 0 244 192l61 156zM234 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5 t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM615 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#x131;" horiz-adv-x="518" d="M176 0v1096h166v-1096h-166z" /> +<glyph unicode="&#x152;" horiz-adv-x="1890" d="M125 735q0 360 174 555t494 195q102 0 192 -23h782v-151h-589v-471h551v-150h-551v-538h589v-152h-768q-102 -20 -194 -20q-327 0 -503.5 196.5t-176.5 558.5zM305 733q0 -297 128.5 -450.5t375.5 -153.5q112 0 199 33v1141q-87 30 -197 30q-249 0 -377.5 -152.5 t-128.5 -447.5z" /> +<glyph unicode="&#x153;" horiz-adv-x="1929" d="M113 549q0 265 131 415t366 150q131 0 233.5 -59.5t164.5 -173.5q58 112 154 172.5t222 60.5q201 0 320 -132.5t119 -358.5v-105h-729q8 -393 338 -393q94 0 174.5 17.5t167.5 56.5v-148q-88 -39 -164 -55t-180 -16q-293 0 -418 235q-62 -116 -166.5 -175.5t-241.5 -59.5 q-223 0 -357 152.5t-134 416.5zM287 549q0 -211 76 -320.5t243 -109.5q163 0 239.5 106.5t76.5 315.5q0 221 -77.5 327.5t-242.5 106.5q-166 0 -240.5 -108t-74.5 -318zM1098 653h544q0 158 -66 240t-194 82q-127 0 -199.5 -82t-84.5 -240z" /> +<glyph unicode="&#x178;" horiz-adv-x="1147" d="M0 1462h186l387 -731l390 731h184l-488 -895v-567h-172v559zM294 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM675 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5 t-63.5 24.5t-26.5 74.5z" /> +<glyph unicode="&#x2c6;" horiz-adv-x="1212" d="M268 1241v23q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115z" /> +<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M367 1456q0 98 60.5 155.5t160.5 57.5q101 0 163 -59.5t62 -151.5q0 -98 -61.5 -157.5t-163.5 -59.5q-101 0 -161 58.5t-60 156.5zM471 1456q0 -56 30 -86.5t87 -30.5q52 0 84.5 30.5t32.5 86.5t-33 86.5t-84 30.5t-84 -30.5t-33 -86.5z" /> +<glyph unicode="&#x2dc;" horiz-adv-x="1212" d="M264 1241q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98z" /> +<glyph unicode="&#x2000;" horiz-adv-x="953" /> +<glyph unicode="&#x2001;" horiz-adv-x="1907" /> +<glyph unicode="&#x2002;" horiz-adv-x="953" /> +<glyph unicode="&#x2003;" horiz-adv-x="1907" /> +<glyph unicode="&#x2004;" horiz-adv-x="635" /> +<glyph unicode="&#x2005;" horiz-adv-x="476" /> +<glyph unicode="&#x2006;" horiz-adv-x="317" /> +<glyph unicode="&#x2007;" horiz-adv-x="317" /> +<glyph unicode="&#x2008;" horiz-adv-x="238" /> +<glyph unicode="&#x2009;" horiz-adv-x="381" /> +<glyph unicode="&#x200a;" horiz-adv-x="105" /> +<glyph unicode="&#x2010;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="&#x2011;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="&#x2012;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 473v152h860v-152h-860z" /> +<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 473v152h1884v-152h-1884z" /> +<glyph unicode="&#x2018;" horiz-adv-x="348" d="M25 983q22 90 71 224t105 255h123q-66 -254 -103 -501h-184z" /> +<glyph unicode="&#x2019;" horiz-adv-x="348" d="M25 961q70 285 102 501h182l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122z" /> +<glyph unicode="&#x201a;" horiz-adv-x="502" d="M63 -264q27 104 59.5 257t45.5 245h182l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125z" /> +<glyph unicode="&#x201c;" horiz-adv-x="717" d="M25 983q22 90 71 224t105 255h123q-66 -254 -103 -501h-184zM391 983q56 215 178 479h123q-30 -115 -59.5 -259.5t-42.5 -241.5h-184z" /> +<glyph unicode="&#x201d;" horiz-adv-x="717" d="M25 961q70 285 102 501h182l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122zM391 961q26 100 59 254t46 247h182l14 -22q-24 -91 -72 -224t-104 -255h-125z" /> +<glyph unicode="&#x201e;" horiz-adv-x="829" d="M25 -263q70 285 102 501h182l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122zM391 -263q26 100 59 254t46 247h182l14 -22q-24 -91 -72 -224t-104 -255h-125z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M164 748q0 121 56.5 184t164.5 63q105 0 163 -62t58 -185q0 -119 -57.5 -183.5t-163.5 -64.5q-107 0 -164 65.5t-57 182.5z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1606" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM682 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM1213 106 q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" /> +<glyph unicode="&#x202f;" horiz-adv-x="381" /> +<glyph unicode="&#x2039;" horiz-adv-x="623" d="M82 524v27l342 407l119 -69l-289 -350l289 -351l-119 -71z" /> +<glyph unicode="&#x203a;" horiz-adv-x="623" d="M80 188l287 351l-287 350l117 69l344 -407v-27l-344 -407z" /> +<glyph unicode="&#x2044;" horiz-adv-x="266" d="M-391 0l903 1462h143l-903 -1462h-143z" /> +<glyph unicode="&#x205f;" horiz-adv-x="476" /> +<glyph unicode="&#x2074;" horiz-adv-x="711" d="M20 788v101l408 579h139v-563h125v-117h-125v-202h-145v202h-402zM160 905h262v195q0 134 6 209q-5 -12 -17 -31.5t-27 -41.5l-30 -46q-15 -22 -26 -39z" /> +<glyph unicode="&#x20ac;" horiz-adv-x="1208" d="M63 506v129h152l-2 42v44l2 80h-152v129h164q39 261 185 407t383 146q201 0 366 -97l-71 -139q-166 86 -295 86q-319 0 -398 -403h510v-129h-524l-2 -57v-64l2 -45h463v-129h-447q37 -180 138.5 -278.5t271.5 -98.5q156 0 309 66v-150q-146 -65 -317 -65 q-237 0 -381.5 134.5t-190.5 391.5h-166z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1589" d="M37 1356v106h543v-106h-211v-615h-123v615h-209zM647 741v721h187l196 -559l203 559h180v-721h-127v420l6 137h-8l-211 -557h-104l-201 559h-8l6 -129v-430h-119z" /> +<glyph unicode="&#x2212;" d="M104 653v138h961v-138h-961z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" /> +<glyph unicode="&#xfb01;" horiz-adv-x="1212" d="M29 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129h-279v-967h-166v967h-196zM856 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5zM870 0v1096h166 v-1096h-166z" /> +<glyph unicode="&#xfb02;" horiz-adv-x="1212" d="M29 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129h-279v-967h-166v967h-196zM870 0v1556h166v-1556h-166z" /> +<glyph unicode="&#xfb03;" horiz-adv-x="1909" d="M717 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129h-279v-967h-166v967h-196zM29 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129 h-279v-967h-166v967h-196zM1551 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5zM1565 0v1096h166v-1096h-166z" /> +<glyph unicode="&#xfb04;" horiz-adv-x="1909" d="M717 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129h-279v-967h-166v967h-196zM29 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129 h-279v-967h-166v967h-196zM1565 0v1556h166v-1556h-166z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.ttf new file mode 100644 index 000000000000..99a1ece2625e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.woff new file mode 100644 index 000000000000..826d6434cff9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/fonts/opensans-regular-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/bg-ramp.jpg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/bg-ramp.jpg new file mode 100644 index 000000000000..77385632b95e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/bg-ramp.jpg differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/blockquote-gfx-2x.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/blockquote-gfx-2x.png new file mode 100644 index 000000000000..993efd5a0c03 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/blockquote-gfx-2x.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/blockquote-gfx.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/blockquote-gfx.png new file mode 100644 index 000000000000..bd5be35022f1 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/blockquote-gfx.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/chevron-2x.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/chevron-2x.png new file mode 100644 index 000000000000..0ae935e2663c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/chevron-2x.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/chevron.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/chevron.png new file mode 100644 index 000000000000..65cfeda5fbea Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/chevron.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/download-fallback-bg.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/download-fallback-bg.png new file mode 100644 index 000000000000..aedafab7a659 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/download-fallback-bg.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/download-sprite.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/download-sprite.png new file mode 100644 index 000000000000..56eedc46dfff Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/download-sprite.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/footer-ramp.jpg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/footer-ramp.jpg new file mode 100644 index 000000000000..99accec91ec3 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/footer-ramp.jpg differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/fork-sprite.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/fork-sprite.png new file mode 100644 index 000000000000..0ce61b22b7fe Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/fork-sprite.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/hr-2x.jpg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/hr-2x.jpg new file mode 100644 index 000000000000..a883d5d6076e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/hr-2x.jpg differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/hr.jpg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/hr.jpg new file mode 100644 index 000000000000..2dc7cef7d71f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/hr.jpg differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/octocat-2x.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/octocat-2x.png new file mode 100644 index 000000000000..f995921f90d1 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/octocat-2x.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/octocat.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/octocat.png new file mode 100644 index 000000000000..7c55dfc985d5 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/octocat.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/ribbon-tail-sprite-2x.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/ribbon-tail-sprite-2x.png new file mode 100644 index 000000000000..46357a00bd82 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/ribbon-tail-sprite-2x.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/ribbon-tail-sprite.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/ribbon-tail-sprite.png new file mode 100644 index 000000000000..bd627d924770 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/ribbon-tail-sprite.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/shield-fallback.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/shield-fallback.png new file mode 100644 index 000000000000..be799b2853ba Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/shield-fallback.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/shield.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/shield.png new file mode 100644 index 000000000000..224425e1cbe9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/shield.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/site-2.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/site-2.png new file mode 100644 index 000000000000..7c55dfc985d5 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/site-2.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/small-ribbon-tail-sprite-2x.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/small-ribbon-tail-sprite-2x.png new file mode 100644 index 000000000000..482649d553b6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/small-ribbon-tail-sprite-2x.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/small-ribbon-tail-sprite.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/small-ribbon-tail-sprite.png new file mode 100644 index 000000000000..f717af616cb8 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/images/small-ribbon-tail-sprite.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/js/headsmart.min.js b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/js/headsmart.min.js new file mode 100644 index 000000000000..16da97ab6695 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/js/headsmart.min.js @@ -0,0 +1 @@ +(function(a){a.fn.headsmart=function(){var c=a(this);d();function d(){var e=[],g="";if(b("h1")){e.push("h1")}if(b("h2")){e.push("h2")}if(b("h3")){e.push("h3")}if(b("h4")){e.push("h4")}if(b("h5")){e.push("h5")}if(b("h6")){e.push("h6")}for(var f=0;f<e.length;f++){c.children(e[f]).addClass("header-level-"+(f+1))}}function b(f){return(c.children(f).length>0)?true:false}}})(jQuery); \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/js/modernizr.js b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/js/modernizr.js new file mode 100644 index 000000000000..434b0afc356d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-merlot-0.1.1/assets/js/modernizr.js @@ -0,0 +1,4 @@ +/* Modernizr 2.5.2 (Custom Build) | MIT & BSD + * Build: http://www.modernizr.com/download/#-fontface-borderradius-boxshadow-textshadow-cssgradients-shiv-cssclasses-teststyles-testprop-testallprops-prefixes-domprefixes-load + */ +;window.Modernizr=function(a,b,c){function z(a){j.cssText=a}function A(a,b){return z(m.join(a+";")+(b||""))}function B(a,b){return typeof a===b}function C(a,b){return!!~(""+a).indexOf(b)}function D(a,b){for(var d in a)if(j[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function E(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:B(f,"function")?f.bind(d||b):f}return!1}function F(a,b,c){var d=a.charAt(0).toUpperCase()+a.substr(1),e=(a+" "+o.join(d+" ")+d).split(" ");return B(b,"string")||B(b,"undefined")?D(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),E(e,b,c))}var d="2.5.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={},r={},s={},t=[],u=t.slice,v,w=function(a,c,d,e){var f,i,j,k=b.createElement("div"),l=b.body,m=l?l:b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),k.appendChild(j);return f=["&#173;","<style>",a,"</style>"].join(""),k.id=h,m.innerHTML+=f,m.appendChild(k),l||g.appendChild(m),i=c(k,a),l?k.parentNode.removeChild(k):m.parentNode.removeChild(m),!!i},x={}.hasOwnProperty,y;!B(x,"undefined")&&!B(x.call,"undefined")?y=function(a,b){return x.call(a,b)}:y=function(a,b){return b in a&&B(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=u.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(u.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(u.call(arguments)))};return e});var G=function(a,c){var d=a.join(""),f=c.length;w(d,function(a,c){var d=b.styleSheets[b.styleSheets.length-1],g=d?d.cssRules&&d.cssRules[0]?d.cssRules[0].cssText:d.cssText||"":"",h=a.childNodes,i={};while(f--)i[h[f].id]=h[f];e.fontface=/src/i.test(g)&&g.indexOf(c.split(" ")[0])===0},f,c)}(['@font-face {font-family:"font";src:url("https://")}'],["fontface"]);q.borderradius=function(){return F("borderRadius")},q.boxshadow=function(){return F("boxShadow")},q.textshadow=function(){return b.createElement("div").style.textShadow===""},q.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return z((a+"-webkit- ".split(" ").join(b+a)+m.join(c+a)).slice(0,-a.length)),C(j.backgroundImage,"gradient")},q.fontface=function(){return e.fontface};for(var H in q)y(q,H)&&(v=H.toLowerCase(),e[v]=q[H](),t.push((e[v]?"":"no-")+v));return z(""),i=k=null,function(a,b){function g(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function h(){var a=k.elements;return typeof a=="string"?a.split(" "):a}function i(a){function m(){var a=j.cloneNode(!1);return k.shivMethods?(i(a),a):a}function n(a){var b=(c[a]||(c[a]=e(a))).cloneNode(!1);return k.shivMethods&&!d.test(a)?j.appendChild(b):b}var b,c={},e=a.createElement,f=a.createDocumentFragment,g=h(),j=f(),l=g.length;while(l--)b=g[l],c[b]=e(b),j.createElement(b);a.createElement=n,a.createDocumentFragment=m}function j(a){var b;return a.documentShived?a:(k.shivCSS&&!e&&(b=!!g(a,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),k.shivMethods&&!f&&(b=!i(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|iframe|input|script|textarea)$/i,e,f;(function(){var c,d=b.createElement("a"),g=a.getComputedStyle,h=b.documentElement,i=b.body||(c=h.insertBefore(b.createElement("body"),h.firstChild));i.insertBefore(d,i.firstChild),d.hidden=!0,d.innerHTML="<xyz></xyz>",e=(d.currentStyle||g(d,null)).display=="none",f=d.childNodes.length==1||function(){try{b.createElement("a")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode=="undefined"||typeof c.createDocumentFragment=="undefined"||typeof c.createElement=="undefined"}(),i.removeChild(d),c&&h.removeChild(c)})();var k={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:j};a.html5=k,j(b)}(this,b),e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.testProp=function(a){return D([a])},e.testAllProps=F,e.testStyles=w,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+t.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return o.call(a)=="[object Function]"}function e(a){return typeof a=="string"}function f(){}function g(a){return!a||a=="loaded"||a=="complete"||a=="uninitialized"}function h(){var a=p.shift();q=1,a?a.t?m(function(){(a.t=="c"?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){a!="img"&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l={},o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};y[c]===1&&(r=1,y[c]=[],l=b.createElement(a)),a=="object"?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),a!="img"&&(r||y[c]===2?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i(b=="c"?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),p.length==1&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=!!b.attachEvent,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return o.call(a)=="[object Array]"},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,i){var j=b(a),l=j.autoCallback;j.url.split(".").pop().split("?").shift(),j.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]||h),j.instead?j.instead(a,e,f,g,i):(y[j.url]?j.noexec=!0:y[j.url]=1,f.load(j.url,j.forceCSS||!j.forceJS&&"css"==j.url.split(".").pop().split("?").shift()?"c":c,j.noexec,j.attrs,j.timeout),(d(e)||d(l))&&f.load(function(){k(),e&&e(j.origUrl,i,g),l&&l(j.origUrl,i,g),y[j.url]=2})))}function i(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var j,l,m=this.yepnope.loader;if(e(a))g(a,0,m,0);else if(w(a))for(j=0;j<a.length;j++)l=a[j],e(l)?g(l,0,m,0):w(l)?B(l):Object(l)===l&&i(l,m);else Object(a)===a&&i(a,m)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))}; \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/README.md new file mode 100644 index 000000000000..1cd7b57f21a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Midnight theme + +[![Build Status](https://travis-ci.org/pages-themes/midnight.svg?branch=master)](https://travis-ci.org/pages-themes/midnight) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-midnight.svg)](https://badge.fury.io/rb/jekyll-theme-midnight) + +*Midnight is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/midnight), or even [use it today](#usage).* + +![Thumbnail of Midnight](thumbnail.png) + +## Usage + +To use the Midnight theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-midnight + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Midnight will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/midnight/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/midnight/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/midnight/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Midnight theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Midnight? We'd love your help. Midnight is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/midnight`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..1d45b852ab73 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_layouts/default.html @@ -0,0 +1,60 @@ +<!doctype html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + +{% seo %} + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}"> + <script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script> + <script src="{{ '/assets/js/respond.js' | relative_url }}"></script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <!--[if lt IE 8]> + <link rel="stylesheet" href="{{ '/assets/css/ie.css' | relative_url }}"> + <![endif]--> + <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> + + </head> + <body> + <div id="header"> + <nav> + <li class="fork"><a href="{{ site.github.repository_url }}">View On GitHub</a></li> + {% if site.show_downloads %} + <li class="downloads"><a href="{{ site.github.zip_url }}">ZIP</a></li> + <li class="downloads"><a href="{{ site.github.tar_url }}">TAR</a></li> + <li class="title">DOWNLOADS</li> + {% endif %} + </nav> + </div><!-- end header --> + + <div class="wrapper"> + + <section> + <div id="title"> + <h1>{{ site.title | default: site.github.repository_name }}</h1> + <p>{{ site.description | default: site.github.project_tagline }}</p> + <hr> + <span class="credits left">Project maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></span> + <span class="credits right">Hosted on GitHub Pages &mdash; Theme by <a href="https://twitter.com/michigangraham">mattgraham</a></span> + </div> + + {{ content }} + + </section> + + </div> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/fonts.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/fonts.scss new file mode 100644 index 000000000000..e5f8006d7eb3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/fonts.scss @@ -0,0 +1,95 @@ +@font-face { + font-family: 'OpenSansLight'; + src: url('../fonts/OpenSans-Light-webfont.eot'); + src: url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Light-webfont.woff') format('woff'), + url('../fonts/OpenSans-Light-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Light-webfont.svg#OpenSansLight') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'OpenSansLightItalic'; + src: url('../fonts/OpenSans-LightItalic-webfont.eot'); + src: url('../fonts/OpenSans-LightItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-LightItalic-webfont.woff') format('woff'), + url('../fonts/OpenSans-LightItalic-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-LightItalic-webfont.svg#OpenSansLightItalic') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'OpenSansRegular'; + src: url('../fonts/OpenSans-Regular-webfont.eot'); + src: url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Regular-webfont.woff') format('woff'), + url('../fonts/OpenSans-Regular-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Regular-webfont.svg#OpenSansRegular') format('svg'); + font-weight: normal; + font-style: normal; + -webkit-font-smoothing:antialiased; +} + +@font-face { + font-family: 'OpenSansItalic'; + src: url('../fonts/OpenSans-Italic-webfont.eot'); + src: url('../fonts/OpenSans-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Italic-webfont.woff') format('woff'), + url('../fonts/OpenSans-Italic-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Italic-webfont.svg#OpenSansItalic') format('svg'); + font-weight: normal; + font-style: normal; + -webkit-font-smoothing:antialiased; +} + +@font-face { + font-family: 'OpenSansSemibold'; + src: url('../fonts/OpenSans-Semibold-webfont.eot'); + src: url('../fonts/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Semibold-webfont.woff') format('woff'), + url('../fonts/OpenSans-Semibold-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Semibold-webfont.svg#OpenSansSemibold') format('svg'); + font-weight: normal; + font-style: normal; + -webkit-font-smoothing:antialiased; +} + +@font-face { + font-family: 'OpenSansSemiboldItalic'; + src: url('../fonts/OpenSans-SemiboldItalic-webfont.eot'); + src: url('../fonts/OpenSans-SemiboldItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-SemiboldItalic-webfont.woff') format('woff'), + url('../fonts/OpenSans-SemiboldItalic-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-SemiboldItalic-webfont.svg#OpenSansSemiboldItalic') format('svg'); + font-weight: normal; + font-style: normal; + -webkit-font-smoothing:antialiased; +} + +@font-face { + font-family: 'OpenSansBold'; + src: url('../fonts/OpenSans-Bold-webfont.eot'); + src: url('../fonts/OpenSans-Bold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Bold-webfont.woff') format('woff'), + url('../fonts/OpenSans-Bold-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Bold-webfont.svg#OpenSansBold') format('svg'); + font-weight: normal; + font-style: normal; + -webkit-font-smoothing:antialiased; +} + +@font-face { + font-family: 'OpenSansBoldItalic'; + src: url('../fonts/OpenSans-BoldItalic-webfont.eot'); + src: url('../fonts/OpenSans-BoldItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-BoldItalic-webfont.woff') format('woff'), + url('../fonts/OpenSans-BoldItalic-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-BoldItalic-webfont.svg#OpenSansBoldItalic') format('svg'); + font-weight: normal; + font-style: normal; + -webkit-font-smoothing:antialiased; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/jekyll-theme-midnight.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/jekyll-theme-midnight.scss new file mode 100644 index 000000000000..c63278ca0ad1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/jekyll-theme-midnight.scss @@ -0,0 +1,308 @@ +@import "normalize"; +@import "fonts"; +@import "rouge-base16-dark.scss"; + +body { + padding:0px 0 20px 0px; + margin: 0px; + font:14px/1.5 "OpenSansRegular", "Helvetica Neue", Helvetica, Arial, sans-serif; + color:#f0e7d5; + font-weight: normal; + background: #252525; + background-attachment: fixed !important; + background: linear_gradient(#2a2a29, #1c1c1c); +} + +h1, h2, h3, h4, h5, h6 { + color:#e8e8e8; + margin:0 0 10px; + font-family: 'OpenSansRegular', "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; +} + +p, ul, ol, table, pre, dl { + margin:0 0 20px; +} + +h1, h2, h3 { + line-height:1.1; + +} + +h1 { + font-size:28px; +} + +h2 { + font-size: 24px; +} + +h4, h5, h6 { + color:#e8e8e8; +} + +h3 { + font-size: 18px; + line-height: 24px; + font-family: 'OpenSansRegular', "Helvetica Neue", Helvetica, Arial, sans-serif !important; + font-weight: normal; + color: #b6b6b6; +} + +a { + color:#ffcc00; + font-weight:400; + text-decoration:none; + + &:hover { + color: #ffeb9b; + } +} + +a small { + font-size:11px; + color:#666; + margin-top:-0.6em; + display:block; +} + +ul{ + list-style-image:url('../images/bullet.png'); +} + +strong { + font-family: 'OpenSansBold', "Helvetica Neue", Helvetica, Arial, sans-serif !important; + font-weight: normal; +} + +.wrapper { + max-width:650px; + margin:0 auto; + position:relative; + padding: 0 20px; +} + +section img { + max-width: 100%; +} + +blockquote { + border-left:3px solid #ffcc00; + margin:0; + padding:0 0 0 20px; + font-style:italic; +} + +code { + font-family: Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, monospace; + color:#efefef; + font-size:13px; + margin: 0 4px; + padding: 4px 6px; + border-radius: 2px; +} + +pre { + padding:8px 15px; + background: #191919; + border-radius: 2px; + border:1px solid #121212; + box-shadow: inset 0 1px 3px rgba(0,0,0,.3); + overflow: auto; + overflow-y: hidden; + + code { + color: #efefef; + text-shadow: 0px 1px 0px #000; + margin: 0; + padding: 0; + } +} + +table { + width:100%; + border-collapse:collapse; +} + +th { + text-align:left; + padding:5px 10px; + border-bottom:1px solid #434343; + color: #b6b6b6; + font-family: 'OpenSansSemibold', "Helvetica Neue", Helvetica, Arial, sans-serif !important; + font-weight: normal; +} + +td { + text-align:left; + padding:5px 10px; + border-bottom:1px solid #434343; +} + +hr { + border: 0; + outline: none; + height: 3px; + background: transparent url('../images/hr.gif') center center repeat-x; + margin: 0 0 20px; +} + +dt { + color:#F0E7D5; + font-family: 'OpenSansSemibold', "Helvetica Neue", Helvetica, Arial, sans-serif !important; + font-weight: normal; +} + + +#header { + z-index: 100; + left:0; + top: 0px; + height: 60px; + width: 100%; + position: fixed; + background: url(../images/nav-bg.gif) #353535; + border-bottom: 4px solid #434343; + box-shadow: 0px 1px 3px rgba(0,0,0,.25); + + nav { + max-width: 650px; + margin: 0 auto; + padding: 0 10px; + background: blue; + margin: 6px auto; + + li { + font-family: 'OpenSansLight', "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + list-style: none; + display: inline; + color: white; + line-height: 50px; + text-shadow: 0px 1px 0px rgba(0,0,0,.2); + font-size: 14px; + + a { + color: white; + border: 1px solid #5d910b; + background: linear_gradient(#93bd20, #659e10); + border-radius: 2px; + box-shadow: inset 0px 1px 0px rgba(255,255,255,.3), 0px 3px 7px rgba(0,0,0,.7); + + background-color: #93bd20; + padding: 10px 12px; + margin-top: 6px; + line-height:14px; + font-size:14px; + display:inline-block; + text-align:center; + + &:hover { + background: linear_gradient(#749619, #527f0e); + background-color: #659e10; + border: 1px solid #527f0e; + box-shadow: inset 0px 1px 1px rgba(0,0,0,.2), 0px 1px 0px rgba(0,0,0,.0); + } + } + + &.fork { + float: left; + margin-left: 0px; + } + + &.downloads { + float: right; + margin-left: 6px; + } + + &.title { + float: right; + margin-right: 10px; + font-size: 11px; + } + } + } +} + +section { + max-width:650px; + padding: 30px 0px 50px 0px; + margin: 20px 0; + margin-top: 70px; + + #title { + border: 0; + outline: none; + margin: 0 0 50px 0; + padding: 0 0 5px 0; + + h1 { + font-family: 'OpenSansLight', "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + font-size: 40px; + text-align: center; + line-height: 36px; + } + + p { + color: #d7cfbe; + font-family: 'OpenSansLight', "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + font-size: 18px; + text-align: center; + } + + .credits { + font-size: 11px; + font-family: 'OpenSansRegular', "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + color: #696969; + margin-top: -10px; + + &.left { + float: left; + } + + &.right { + float: right; + } + } + + } +} + +@media print, screen and (max-width: 720px) { + + #title { + .credits { + display: block; + width: 100%; + line-height: 30px; + text-align: center; + + .left { + float: none; + display: block; + } + + .right { + float: none; + display: block; + } + } + } +} + +@media print, screen and (max-width: 480px) { + + #header { + margin-top: -20px; + } + + section { + margin-top: 40px; + } + nav { + display: none; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/normalize.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/normalize.scss new file mode 100644 index 000000000000..2fa717f777f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/normalize.scss @@ -0,0 +1,492 @@ +/*! normalize.css 2012-02-07T12:37 UTC - https://github.com/necolas/normalize.css */ + +/* ============================================================================= + HTML5 display definitions + ========================================================================== */ + +/* + * Corrects block display not defined in IE6/7/8/9 & FF3 + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +summary { + display: block; +} + +/* + * Corrects inline-block display not defined in IE6/7/8/9 & FF3 + */ + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +/* + * Prevents modern browsers from displaying 'audio' without controls + */ + +audio:not([controls]) { + display: none; +} + +/* + * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4 + * Known issue: no IE6 support + */ + +[hidden] { + display: none; +} + + +/* ============================================================================= + Base + ========================================================================== */ + +/* + * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units + * http://clagnut.com/blog/348/#c790 + * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom + * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ + */ + +html { + font-size: 100%; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/* + * Addresses font-family inconsistency between 'textarea' and other form elements. + */ + +html, +button, +input, +select, +textarea { + font-family: sans-serif; +} + +/* + * Addresses margins handled incorrectly in IE6/7 + */ + +body { + margin: 0; +} + + +/* ============================================================================= + Links + ========================================================================== */ + +/* + * Addresses outline displayed oddly in Chrome + */ + +a:focus { + outline: thin dotted; +} + +/* + * Improves readability when focused and also mouse hovered in all browsers + * people.opera.com/patrickl/experiments/keyboard/test + */ + +a:hover, +a:active { + outline: 0; +} + + +/* ============================================================================= + Typography + ========================================================================== */ + +/* + * Addresses font sizes and margins set differently in IE6/7 + * Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5 + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.75em; + margin: 2.33em 0; +} + +/* + * Addresses styling not present in IE7/8/9, S5, Chrome + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/* + * Addresses style set to 'bolder' in FF3+, S4/5, Chrome +*/ + +b, +strong { + font-weight: bold; +} + +blockquote { + margin: 1em 40px; +} + +/* + * Addresses styling not present in S5, Chrome + */ + +dfn { + font-style: italic; +} + +/* + * Addresses styling not present in IE6/7/8/9 + */ + +mark { + background: #ff0; + color: #000; +} + +/* + * Addresses margins set differently in IE6/7 + */ + +p, +pre { + margin: 1em 0; +} + +/* + * Corrects font family set oddly in IE6, S4/5, Chrome + * en.wikipedia.org/wiki/User:Davidgothberg/Test59 + */ + +pre, +code, +kbd, +samp { + font-family: monospace, serif; + _font-family: 'courier new', monospace; + font-size: 1em; +} + +/* + * 1. Addresses CSS quotes not supported in IE6/7 + * 2. Addresses quote property not supported in S4 + */ + +/* 1 */ + +q { + quotes: none; +} + +/* 2 */ + +q:before, +q:after { + content: ''; + content: none; +} + +small { + font-size: 75%; +} + +/* + * Prevents sub and sup affecting line-height in all browsers + * gist.github.com/413930 + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + + +/* ============================================================================= + Lists + ========================================================================== */ + +/* + * Addresses margins set differently in IE6/7 + */ + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +/* + * Addresses paddings set differently in IE6/7 + */ + +menu, +ol, +ul { + padding: 0 0 0 40px; +} + +/* + * Corrects list images handled incorrectly in IE7 + */ + +nav ul, +nav ol { + list-style: none; + list-style-image: none; +} + + +/* ============================================================================= + Embedded content + ========================================================================== */ + +/* + * 1. Removes border when inside 'a' element in IE6/7/8/9, FF3 + * 2. Improves image quality when scaled in IE7 + * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ + */ + +img { + border: 0; /* 1 */ + -ms-interpolation-mode: bicubic; /* 2 */ +} + +/* + * Corrects overflow displayed oddly in IE9 + */ + +svg:not(:root) { + overflow: hidden; +} + + +/* ============================================================================= + Figures + ========================================================================== */ + +/* + * Addresses margin not present in IE6/7/8/9, S5, O11 + */ + +figure { + margin: 0; +} + + +/* ============================================================================= + Forms + ========================================================================== */ + +/* + * Corrects margin displayed oddly in IE6/7 + */ + +form { + margin: 0; +} + +/* + * Define consistent border, margin, and padding + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/* + * 1. Corrects color not being inherited in IE6/7/8/9 + * 2. Corrects text not wrapping in FF3 + * 3. Corrects alignment displayed oddly in IE6/7 + */ + +legend { + border: 0; /* 1 */ + padding: 0; + white-space: normal; /* 2 */ + *margin-left: -7px; /* 3 */ +} + +/* + * 1. Corrects font size not being inherited in all browsers + * 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome + * 3. Improves appearance and consistency in all browsers + */ + +button, +input, +select, +textarea { + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ + vertical-align: baseline; /* 3 */ + *vertical-align: middle; /* 3 */ +} + +/* + * Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet + */ + +button, +input { + line-height: normal; /* 1 */ +} + +/* + * 1. Improves usability and consistency of cursor style between image-type 'input' and others + * 2. Corrects inability to style clickable 'input' types in iOS + * 3. Removes inner spacing in IE7 without affecting normal text inputs + * Known issue: inner spacing remains in IE6 + */ + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; /* 1 */ + -webkit-appearance: button; /* 2 */ + *overflow: visible; /* 3 */ +} + +/* + * Re-set default cursor for disabled elements + */ + +button[disabled], +input[disabled] { + cursor: default; +} + +/* + * 1. Addresses box sizing set to content-box in IE8/9 + * 2. Removes excess padding in IE8/9 + * 3. Removes excess padding in IE7 + Known issue: excess padding remains in IE6 + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + *height: 13px; /* 3 */ + *width: 13px; /* 3 */ +} + +/* + * 1. Addresses appearance set to searchfield in S5, Chrome + * 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof) + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/* + * Removes inner padding and search cancel button in S5, Chrome on OS X + */ + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +/* + * Removes inner padding and border in FF3+ + * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/ + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* + * 1. Removes default vertical scrollbar in IE6/7/8/9 + * 2. Improves readability and alignment in all browsers + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + + +/* ============================================================================= + Tables + ========================================================================== */ + +/* + * Remove most spacing between table cells + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/rouge-base16-dark.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/rouge-base16-dark.scss new file mode 100644 index 000000000000..c303bd5847d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/_sass/rouge-base16-dark.scss @@ -0,0 +1,81 @@ +/* + generated by rouge http://rouge.jneen.net/ + original base16 by Chris Kempson (https://github.com/chriskempson/base16) +*/ + +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight, .highlight .w { + color: #d0d0d0; +} +.highlight .err { + color: #151515; + background-color: #ac4142; +} +.highlight .c, .highlight .cd, .highlight .cm, .highlight .c1, .highlight .cs { + color: #888; +} +.highlight .cp { + color: #f4bf75; +} +.highlight .nt { + color: #f4bf75; +} +.highlight .o, .highlight .ow { + color: #d0d0d0; +} +.highlight .p, .highlight .pi { + color: #d0d0d0; +} +.highlight .gi { + color: #90a959; +} +.highlight .gd { + color: #ac4142; +} +.highlight .gh { + color: #6a9fb5; + font-weight: bold; +} +.highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv { + color: #aa759f; +} +.highlight .kc { + color: #d28445; +} +.highlight .kt { + color: #d28445; +} +.highlight .kd { + color: #d28445; +} +.highlight .s, .highlight .sb, .highlight .sc, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 { + color: #90a959; +} +.highlight .sr { + color: #75b5aa; +} +.highlight .si { + color: #8f5536; +} +.highlight .se { + color: #8f5536; +} +.highlight .nn { + color: #f4bf75; +} +.highlight .nc { + color: #f4bf75; +} +.highlight .no { + color: #f4bf75; +} +.highlight .na { + color: #6a9fb5; +} +.highlight .m, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mb, .highlight .mx { + color: #90a959; +} +.highlight .ss { + color: #90a959; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/css/ie.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/css/ie.scss new file mode 100644 index 000000000000..eee54c1d98e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/css/ie.scss @@ -0,0 +1,3 @@ +nav { + display: none; + } \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..a21222f2ac02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import "jekyll-theme-midnight"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.eot new file mode 100644 index 000000000000..e1c7674430d0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.svg new file mode 100644 index 000000000000..364b3686781a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.svg @@ -0,0 +1,146 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansBold" horiz-adv-x="1169" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="586" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM121 1462h346l-51 -977h-244z" /> +<glyph unicode="&#x22;" horiz-adv-x="967" d="M133 1462h279l-41 -528h-197zM555 1462h279l-41 -528h-197z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M45 406v206h277l47 232h-252v209h289l77 407h219l-77 -407h198l78 407h215l-78 -407h240v-209h-279l-47 -232h258v-206h-297l-77 -406h-220l78 406h-194l-76 -406h-215l74 406h-238zM539 612h196l47 232h-196z" /> +<glyph unicode="$" d="M88 1049q0 145 113.5 238.5t316.5 113.5v153h137v-149q229 -10 414 -92l-94 -234q-156 64 -320 78v-295q195 -75 277.5 -130t121 -121t38.5 -154q0 -159 -115 -255.5t-322 -115.5v-205h-137v201q-244 5 -428 86v264q87 -43 209.5 -76t218.5 -39v310l-67 26 q-198 78 -280.5 169.5t-82.5 226.5zM389 1049q0 -44 30.5 -72.5t98.5 -58.5v235q-129 -19 -129 -104zM655 324q136 23 136 118q0 42 -34 71t-102 60v-249z" /> +<glyph unicode="%" horiz-adv-x="1845" d="M63 1026q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5q0 -230 -89 -345.5t-261 -115.5q-165 0 -255 118.5t-90 342.5zM315 1024q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5zM395 0l811 1462h240l-811 -1462h-240z M1087 442q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5q0 -229 -89 -344.5t-261 -115.5q-165 0 -255 118.5t-90 341.5zM1339 440q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5z" /> +<glyph unicode="&#x26;" horiz-adv-x="1536" d="M82 395q0 137 60.5 233.5t207.5 180.5q-75 86 -109 164.5t-34 171.5q0 152 116.5 245t311.5 93q186 0 297.5 -86.5t111.5 -231.5q0 -119 -69 -217.5t-223 -187.5l284 -277q71 117 123 301h318q-36 -135 -99 -263.5t-143 -227.5l301 -293h-377l-115 113 q-191 -133 -432 -133q-244 0 -387 112t-143 303zM403 424q0 -86 64.5 -137t165.5 -51q126 0 227 61l-332 330q-58 -44 -91.5 -92t-33.5 -111zM489 1124q0 -88 95 -194q86 48 132 94.5t46 108.5q0 53 -36 83.5t-93 30.5q-67 0 -105.5 -32t-38.5 -91z" /> +<glyph unicode="'" horiz-adv-x="545" d="M133 1462h279l-41 -528h-197z" /> +<glyph unicode="(" horiz-adv-x="694" d="M82 561q0 265 77.5 496t223.5 405h250q-141 -193 -213 -424t-72 -475q0 -245 73.5 -473.5t209.5 -413.5h-248q-147 170 -224 397t-77 488z" /> +<glyph unicode=")" horiz-adv-x="694" d="M61 1462h250q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-248q135 184 209 412.5t74 474.5q0 244 -72 475t-213 424z" /> +<glyph unicode="*" horiz-adv-x="1116" d="M63 1042l39 250l365 -104l-41 368h262l-41 -368l373 104l33 -252l-340 -24l223 -297l-227 -121l-156 313l-137 -311l-236 119l221 297z" /> +<glyph unicode="+" d="M88 612v219h387v390h219v-390h387v-219h-387v-385h-219v385h-387z" /> +<glyph unicode="," horiz-adv-x="594" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220z" /> +<glyph unicode="-" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="." horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" /> +<glyph unicode="/" horiz-adv-x="846" d="M14 0l545 1462h277l-545 -1462h-277z" /> +<glyph unicode="0" d="M74 731q0 387 125 570.5t385 183.5q253 0 382.5 -192t129.5 -562q0 -383 -125.5 -567t-386.5 -184q-253 0 -381.5 190t-128.5 561zM381 731q0 -269 46.5 -385.5t156.5 -116.5q108 0 156 118t48 384q0 269 -48.5 386.5t-155.5 117.5q-109 0 -156 -117.5t-47 -386.5z" /> +<glyph unicode="1" d="M121 1087l471 375h254v-1462h-309v846l3 139l5 152q-77 -77 -107 -101l-168 -135z" /> +<glyph unicode="2" d="M78 1274q108 92 179 130t155 58.5t188 20.5q137 0 242 -50t163 -140t58 -206q0 -101 -35.5 -189.5t-110 -181.5t-262.5 -265l-188 -177v-14h637v-260h-1022v215l367 371q163 167 213 231.5t72 119.5t22 114q0 88 -48.5 131t-129.5 43q-85 0 -165 -39t-167 -111z" /> +<glyph unicode="3" d="M78 59v263q85 -43 187 -70t202 -27q153 0 226 52t73 167q0 103 -84 146t-268 43h-111v237h113q170 0 248.5 44.5t78.5 152.5q0 166 -208 166q-72 0 -146.5 -24t-165.5 -83l-143 213q200 144 477 144q227 0 358.5 -92t131.5 -256q0 -137 -83 -233t-233 -132v-6 q177 -22 268 -107.5t91 -230.5q0 -211 -153 -328.5t-437 -117.5q-238 0 -422 79z" /> +<glyph unicode="4" d="M35 303v215l641 944h285v-919h176v-240h-176v-303h-302v303h-624zM307 543h352v248q0 62 5 180t8 137h-8q-37 -82 -89 -160z" /> +<glyph unicode="5" d="M100 59v267q79 -42 184 -68.5t199 -26.5q283 0 283 232q0 221 -293 221q-53 0 -117 -10.5t-104 -22.5l-123 66l55 745h793v-262h-522l-27 -287l35 7q61 14 151 14q212 0 337.5 -119t125.5 -326q0 -245 -151 -377t-432 -132q-244 0 -394 79z" /> +<glyph unicode="6" d="M72 621q0 434 183.5 646t549.5 212q125 0 196 -15v-247q-89 20 -176 20q-159 0 -259.5 -48t-150.5 -142t-59 -267h13q99 170 317 170q196 0 307 -123t111 -340q0 -234 -132 -370.5t-366 -136.5q-162 0 -282.5 75t-186 219t-65.5 347zM379 510q0 -119 62.5 -201t158.5 -82 q99 0 152 66.5t53 189.5q0 107 -49.5 168.5t-149.5 61.5q-94 0 -160.5 -61t-66.5 -142z" /> +<glyph unicode="7" d="M55 1200v260h1049v-194l-553 -1266h-324l549 1200h-721z" /> +<glyph unicode="8" d="M72 371q0 125 66.5 222t213.5 171q-125 79 -180 169t-55 197q0 157 130 254t339 97q210 0 338.5 -95.5t128.5 -257.5q0 -112 -62 -199.5t-200 -156.5q164 -88 235.5 -183.5t71.5 -209.5q0 -180 -141 -289.5t-371 -109.5q-240 0 -377 102t-137 289zM358 389q0 -86 60 -134 t164 -48q115 0 172 49.5t57 130.5q0 67 -56.5 125.5t-183.5 124.5q-213 -98 -213 -248zM408 1106q0 -60 38.5 -107.5t139.5 -97.5q98 46 137 94t39 111q0 69 -50 109t-128 40q-79 0 -127.5 -40.5t-48.5 -108.5z" /> +<glyph unicode="9" d="M66 971q0 235 133.5 371.5t363.5 136.5q162 0 283.5 -76t186.5 -220.5t65 -344.5q0 -432 -182 -645t-551 -213q-130 0 -197 14v248q84 -21 176 -21q155 0 255 45.5t153 143t61 268.5h-12q-58 -94 -134 -132t-190 -38q-191 0 -301 122.5t-110 340.5zM365 975 q0 -106 49 -168t149 -62q94 0 161 61.5t67 141.5q0 119 -62.5 201t-159.5 82q-96 0 -150 -66t-54 -190z" /> +<glyph unicode=":" horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" /> +<glyph unicode=";" horiz-adv-x="594" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" /> +<glyph unicode="&#x3c;" d="M88 641v143l993 496v-240l-684 -317l684 -281v-239z" /> +<glyph unicode="=" d="M88 418v219h993v-219h-993zM88 805v219h993v-219h-993z" /> +<glyph unicode="&#x3e;" d="M88 203v239l684 281l-684 317v240l993 -496v-143z" /> +<glyph unicode="?" horiz-adv-x="977" d="M6 1358q223 125 473 125q206 0 327.5 -99t121.5 -264q0 -110 -50 -190t-190 -180q-96 -71 -121.5 -108t-25.5 -97v-60h-265v74q0 96 41 167t150 151q105 75 138.5 122t33.5 105q0 65 -48 99t-134 34q-150 0 -342 -98zM244 143q0 84 45 127t131 43q83 0 128.5 -44 t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" /> +<glyph unicode="@" horiz-adv-x="1837" d="M102 602q0 247 108.5 448.5t309 316t461.5 114.5q220 0 393 -90t267 -256t94 -383q0 -144 -46 -263.5t-130 -187.5t-195 -68q-74 0 -131 35.5t-82 93.5h-16q-108 -129 -275 -129q-177 0 -279 106.5t-102 291.5q0 211 134 340t350 129q86 0 189.5 -16.5t170.5 -39.5 l-23 -489q0 -139 76 -139q64 0 102 93.5t38 244.5q0 161 -67 284.5t-188.5 188.5t-277.5 65q-202 0 -351 -83t-228.5 -239.5t-79.5 -361.5q0 -276 147.5 -423.5t427.5 -147.5q106 0 233 23.5t250 68.5v-192q-214 -91 -475 -91q-380 0 -592.5 200t-212.5 556zM711 627 q0 -211 172 -211q90 0 137 63.5t57 206.5l13 221q-51 11 -115 11q-125 0 -194.5 -78t-69.5 -213z" /> +<glyph unicode="A" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633z" /> +<glyph unicode="B" horiz-adv-x="1376" d="M184 0v1462h455q311 0 451.5 -88.5t140.5 -281.5q0 -131 -61.5 -215t-163.5 -101v-10q139 -31 200.5 -116t61.5 -226q0 -200 -144.5 -312t-392.5 -112h-547zM494 256h202q128 0 189 49t61 150q0 182 -260 182h-192v-381zM494 883h180q126 0 182.5 39t56.5 129 q0 84 -61.5 120.5t-194.5 36.5h-163v-325z" /> +<glyph unicode="C" horiz-adv-x="1305" d="M119 729q0 228 83 399.5t238.5 263t364.5 91.5q213 0 428 -103l-100 -252q-82 39 -165 68t-163 29q-175 0 -271 -131.5t-96 -366.5q0 -489 367 -489q154 0 373 77v-260q-180 -75 -402 -75q-319 0 -488 193.5t-169 555.5z" /> +<glyph unicode="D" horiz-adv-x="1516" d="M184 0v1462h459q358 0 556 -189t198 -528q0 -361 -205.5 -553t-593.5 -192h-414zM494 256h133q448 0 448 481q0 471 -416 471h-165v-952z" /> +<glyph unicode="E" horiz-adv-x="1147" d="M184 0v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256h-842z" /> +<glyph unicode="F" horiz-adv-x="1124" d="M184 0v1462h838v-254h-533v-377h496v-253h-496v-578h-305z" /> +<glyph unicode="G" horiz-adv-x="1483" d="M119 733q0 354 202.5 552t561.5 198q225 0 434 -90l-103 -248q-160 80 -333 80q-201 0 -322 -135t-121 -363q0 -238 97.5 -363.5t283.5 -125.5q97 0 197 20v305h-277v258h580v-758q-141 -46 -265.5 -64.5t-254.5 -18.5q-331 0 -505.5 194.5t-174.5 558.5z" /> +<glyph unicode="H" horiz-adv-x="1567" d="M184 0v1462h310v-573h579v573h309v-1462h-309v631h-579v-631h-310z" /> +<glyph unicode="I" horiz-adv-x="678" d="M184 0v1462h310v-1462h-310z" /> +<glyph unicode="J" horiz-adv-x="678" d="M-152 -150q80 -20 146 -20q102 0 146 63.5t44 198.5v1370h310v-1368q0 -256 -117 -390t-346 -134q-105 0 -183 22v258z" /> +<glyph unicode="K" horiz-adv-x="1360" d="M184 0v1462h310v-669l122 172l396 497h344l-510 -647l514 -815h-352l-383 616l-131 -94v-522h-310z" /> +<glyph unicode="L" horiz-adv-x="1157" d="M184 0v1462h310v-1206h593v-256h-903z" /> +<glyph unicode="M" horiz-adv-x="1931" d="M184 0v1462h422l346 -1118h6l367 1118h422v-1462h-289v692q0 49 1.5 113t13.5 340h-9l-377 -1145h-284l-352 1147h-9q19 -350 19 -467v-680h-277z" /> +<glyph unicode="N" horiz-adv-x="1665" d="M184 0v1462h391l635 -1095h7q-15 285 -15 403v692h279v-1462h-394l-636 1106h-9q19 -293 19 -418v-688h-277z" /> +<glyph unicode="O" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -363 -180 -558t-516 -195t-516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" /> +<glyph unicode="P" horiz-adv-x="1286" d="M184 0v1462h467q266 0 404.5 -114.5t138.5 -341.5q0 -236 -147.5 -361t-419.5 -125h-133v-520h-310zM494 774h102q143 0 214 56.5t71 164.5q0 109 -59.5 161t-186.5 52h-141v-434z" /> +<glyph unicode="Q" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -258 -91.5 -432.5t-268.5 -255.5l352 -393h-397l-268 328h-23q-336 0 -516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" /> +<glyph unicode="R" horiz-adv-x="1352" d="M184 0v1462h426q298 0 441 -108.5t143 -329.5q0 -129 -71 -229.5t-201 -157.5q330 -493 430 -637h-344l-349 561h-165v-561h-310zM494 813h100q147 0 217 49t70 154q0 104 -71.5 148t-221.5 44h-94v-395z" /> +<glyph unicode="S" horiz-adv-x="1128" d="M94 68v288q148 -66 250.5 -93t187.5 -27q102 0 156.5 39t54.5 116q0 43 -24 76.5t-70.5 64.5t-189.5 99q-134 63 -201 121t-107 135t-40 180q0 194 131.5 305t363.5 111q114 0 217.5 -27t216.5 -76l-100 -241q-117 48 -193.5 67t-150.5 19q-88 0 -135 -41t-47 -107 q0 -41 19 -71.5t60.5 -59t196.5 -102.5q205 -98 281 -196.5t76 -241.5q0 -198 -142.5 -312t-396.5 -114q-234 0 -414 88z" /> +<glyph unicode="T" horiz-adv-x="1186" d="M41 1204v258h1104v-258h-397v-1204h-310v1204h-397z" /> +<glyph unicode="U" horiz-adv-x="1548" d="M174 520v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5z" /> +<glyph unicode="V" horiz-adv-x="1331" d="M0 1462h313l275 -870q23 -77 47.5 -179.5t30.5 -142.5q11 92 75 322l277 870h313l-497 -1462h-338z" /> +<glyph unicode="W" horiz-adv-x="1980" d="M0 1462h305l187 -798q49 -221 71 -383q6 57 27.5 176.5t40.5 185.5l213 819h293l213 -819q14 -55 35 -168t32 -194q10 78 32 194.5t40 188.5l186 798h305l-372 -1462h-353l-198 768q-11 41 -37.5 169.5t-30.5 172.5q-6 -54 -30 -173.5t-37 -170.5l-197 -766h-352z" /> +<glyph unicode="X" horiz-adv-x="1366" d="M0 0l485 754l-454 708h342l315 -526l309 526h334l-459 -725l494 -737h-354l-340 553l-340 -553h-332z" /> +<glyph unicode="Y" horiz-adv-x="1278" d="M0 1462h336l303 -602l305 602h334l-485 -893v-569h-308v559z" /> +<glyph unicode="Z" horiz-adv-x="1186" d="M49 0v201l701 1005h-682v256h1050v-200l-700 -1006h719v-256h-1088z" /> +<glyph unicode="[" horiz-adv-x="678" d="M143 -324v1786h484v-211h-224v-1364h224v-211h-484z" /> +<glyph unicode="\" horiz-adv-x="846" d="M12 1462h277l545 -1462h-277z" /> +<glyph unicode="]" horiz-adv-x="678" d="M51 -113h223v1364h-223v211h484v-1786h-484v211z" /> +<glyph unicode="^" horiz-adv-x="1090" d="M8 520l438 950h144l495 -950h-239l-322 643l-280 -643h-236z" /> +<glyph unicode="_" horiz-adv-x="842" d="M-4 -184h850v-140h-850v140z" /> +<glyph unicode="`" horiz-adv-x="1243" d="M332 1548v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" /> +<glyph unicode="a" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134z" /> +<glyph unicode="b" horiz-adv-x="1296" d="M160 0v1556h305v-362q0 -69 -12 -221h12q107 166 317 166q198 0 310 -154.5t112 -423.5q0 -277 -115.5 -429t-314.5 -152q-197 0 -309 143h-21l-51 -123h-233zM465 563q0 -180 53.5 -258t169.5 -78q94 0 149.5 86.5t55.5 251.5t-56 247.5t-153 82.5q-113 0 -165 -69.5 t-54 -229.5v-33z" /> +<glyph unicode="c" horiz-adv-x="1053" d="M92 553q0 285 142 435.5t407 150.5q194 0 348 -76l-90 -236q-72 29 -134 47.5t-124 18.5q-238 0 -238 -338q0 -328 238 -328q88 0 163 23.5t150 73.5v-261q-74 -47 -149.5 -65t-190.5 -18q-522 0 -522 573z" /> +<glyph unicode="d" horiz-adv-x="1296" d="M92 557q0 275 114.5 428.5t315.5 153.5q211 0 322 -164h10q-23 125 -23 223v358h306v-1556h-234l-59 145h-13q-104 -165 -317 -165q-197 0 -309.5 153t-112.5 424zM401 553q0 -165 57 -247.5t163 -82.5q117 0 171.5 68t59.5 231v33q0 180 -55.5 258t-180.5 78 q-102 0 -158.5 -86.5t-56.5 -251.5z" /> +<glyph unicode="e" horiz-adv-x="1210" d="M92 551q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5q-270 0 -422 149t-152 422zM408 686h428q-2 113 -59 174.5t-154 61.5t-152 -61.5t-63 -174.5z" /> +<glyph unicode="f" horiz-adv-x="793" d="M41 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229h-264v-889h-305v889h-168z" /> +<glyph unicode="g" horiz-adv-x="1157" d="M6 -182q0 101 63 169t185 97q-47 20 -82 65.5t-35 96.5q0 64 37 106.5t107 83.5q-88 38 -139.5 122t-51.5 198q0 183 119 283t340 100q47 0 111.5 -8.5t82.5 -12.5h390v-155l-175 -45q48 -75 48 -168q0 -180 -125.5 -280.5t-348.5 -100.5l-55 3l-45 5q-47 -36 -47 -80 q0 -66 168 -66h190q184 0 280.5 -79t96.5 -232q0 -196 -163.5 -304t-469.5 -108q-234 0 -357.5 81.5t-123.5 228.5zM270 -158q0 -63 60.5 -99t169.5 -36q164 0 257 45t93 123q0 63 -55 87t-170 24h-158q-84 0 -140.5 -39.5t-56.5 -104.5zM381 752q0 -91 41.5 -144t126.5 -53 q86 0 126 53t40 144q0 202 -166 202q-168 0 -168 -202z" /> +<glyph unicode="h" horiz-adv-x="1346" d="M160 0v1556h305v-317q0 -37 -7 -174l-7 -90h16q102 164 324 164q197 0 299 -106t102 -304v-729h-305v653q0 242 -180 242q-128 0 -185 -87t-57 -282v-526h-305z" /> +<glyph unicode="i" horiz-adv-x="625" d="M147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150zM160 0v1118h305v-1118h-305z" /> +<glyph unicode="j" horiz-adv-x="625" d="M-131 -227q70 -19 143 -19q77 0 112.5 43t35.5 127v1194h305v-1239q0 -178 -103 -274.5t-292 -96.5q-117 0 -201 25v240zM147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150z" /> +<glyph unicode="k" horiz-adv-x="1270" d="M160 0v1556h305v-694l-16 -254h4l133 170l313 340h344l-444 -485l471 -633h-352l-322 453l-131 -105v-348h-305z" /> +<glyph unicode="l" horiz-adv-x="625" d="M160 0v1556h305v-1556h-305z" /> +<glyph unicode="m" horiz-adv-x="2011" d="M160 0v1118h233l41 -143h17q45 77 130 120.5t195 43.5q251 0 340 -164h27q45 78 132.5 121t197.5 43q190 0 287.5 -97.5t97.5 -312.5v-729h-306v653q0 121 -40.5 181.5t-127.5 60.5q-112 0 -167.5 -80t-55.5 -254v-561h-305v653q0 121 -40.5 181.5t-127.5 60.5 q-117 0 -170 -86t-53 -283v-526h-305z" /> +<glyph unicode="n" horiz-adv-x="1346" d="M160 0v1118h233l41 -143h17q51 81 140.5 122.5t203.5 41.5q195 0 296 -105.5t101 -304.5v-729h-305v653q0 121 -43 181.5t-137 60.5q-128 0 -185 -85.5t-57 -283.5v-526h-305z" /> +<glyph unicode="o" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5z" /> +<glyph unicode="p" horiz-adv-x="1296" d="M160 -492v1610h248l43 -145h14q107 166 317 166q198 0 310 -153t112 -425q0 -179 -52.5 -311t-149.5 -201t-228 -69q-197 0 -309 143h-16q16 -140 16 -162v-453h-305zM465 563q0 -180 53.5 -258t169.5 -78q205 0 205 338q0 165 -50.5 247.5t-158.5 82.5 q-113 0 -165 -69.5t-54 -229.5v-33z" /> +<glyph unicode="q" horiz-adv-x="1296" d="M92 557q0 274 114.5 428t313.5 154q106 0 185 -40t139 -124h8l27 143h258v-1610h-306v469q0 61 13 168h-13q-49 -81 -130 -123t-187 -42q-198 0 -310 152.5t-112 424.5zM403 553q0 -168 53.5 -251t166.5 -83q116 0 170 66.5t59 232.5v37q0 180 -55.5 258t-178.5 78 q-215 0 -215 -338z" /> +<glyph unicode="r" horiz-adv-x="930" d="M160 0v1118h231l45 -188h15q52 94 140.5 151.5t192.5 57.5q62 0 103 -9l-23 -286q-37 10 -90 10q-146 0 -227.5 -75t-81.5 -210v-569h-305z" /> +<glyph unicode="s" horiz-adv-x="1018" d="M92 827q0 149 115.5 230.5t327.5 81.5q202 0 393 -88l-92 -220q-84 36 -157 59t-149 23q-135 0 -135 -73q0 -41 43.5 -71t190.5 -89q131 -53 192 -99t90 -106t29 -143q0 -172 -119.5 -262t-357.5 -90q-122 0 -208 16.5t-161 48.5v252q85 -40 191.5 -67t187.5 -27 q166 0 166 96q0 36 -22 58.5t-76 51t-144 66.5q-129 54 -189.5 100t-88 105.5t-27.5 146.5z" /> +<glyph unicode="t" horiz-adv-x="889" d="M47 889v129l168 102l88 236h195v-238h313v-229h-313v-539q0 -65 36.5 -96t96.5 -31q80 0 192 35v-227q-114 -51 -280 -51q-183 0 -266.5 92.5t-83.5 277.5v539h-146z" /> +<glyph unicode="u" horiz-adv-x="1346" d="M154 389v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5z" /> +<glyph unicode="v" horiz-adv-x="1165" d="M0 1118h319l216 -637q36 -121 45 -229h6q5 96 45 229l215 637h319l-426 -1118h-313z" /> +<glyph unicode="w" horiz-adv-x="1753" d="M20 1118h304l129 -495q31 -133 63 -367h6q4 76 35 241l16 85l138 536h336l131 -536q4 -22 12.5 -65t16.5 -91.5t14.5 -95t7.5 -74.5h6q9 72 32 197.5t33 169.5l134 495h299l-322 -1118h-332l-86 391l-116 494h-7l-204 -885h-328z" /> +<glyph unicode="x" horiz-adv-x="1184" d="M10 0l379 571l-360 547h346l217 -356l219 356h346l-364 -547l381 -571h-347l-235 383l-236 -383h-346z" /> +<glyph unicode="y" horiz-adv-x="1165" d="M0 1118h334l211 -629q27 -82 37 -194h6q11 103 43 194l207 629h327l-473 -1261q-65 -175 -185.5 -262t-281.5 -87q-79 0 -155 17v242q55 -13 120 -13q81 0 141.5 49.5t94.5 149.5l18 55z" /> +<glyph unicode="z" horiz-adv-x="999" d="M55 0v180l518 705h-487v233h834v-198l-504 -687h522v-233h-883z" /> +<glyph unicode="{" horiz-adv-x="807" d="M31 449v239q126 0 191 44t65 126v8v318q0 153 97 215.5t341 62.5v-225q-99 -3 -136.5 -38t-37.5 -103v-299q-6 -188 -234 -222v-12q234 -35 234 -212v-9v-299q0 -68 37 -103t137 -38v-226q-244 0 -341 62.5t-97 216.5v315q0 87 -65.5 133t-190.5 46z" /> +<glyph unicode="|" horiz-adv-x="1128" d="M455 -465v2015h219v-2015h-219z" /> +<glyph unicode="}" horiz-adv-x="807" d="M82 -98q99 2 136.5 36t37.5 105v299v11q0 86 59 139.5t174 70.5v12q-227 34 -233 222v299q0 70 -37 104t-137 37v225q167 0 262 -26.5t135.5 -84t40.5 -167.5v-318v-10q0 -84 61.5 -126t194.5 -42v-239q-125 0 -190.5 -41t-65.5 -138v-315q0 -112 -41 -169t-135.5 -83.5 t-261.5 -26.5v226z" /> +<glyph unicode="~" d="M88 551v231q103 109 256 109q73 0 137.5 -16t139.5 -48q129 -55 227 -55q53 0 116 32t117 89v-231q-101 -109 -256 -109q-66 0 -126 13t-150 50q-131 56 -227 56q-55 0 -117.5 -33.5t-116.5 -87.5z" /> +<glyph unicode="&#xa2;" d="M143 741q0 261 104.5 403t315.5 173v166h178v-158q166 -9 299 -74l-90 -235q-72 29 -134 47t-124 18q-121 0 -179 -83.5t-58 -254.5q0 -327 237 -327q82 0 148 15.5t166 60.5v-254q-127 -61 -265 -70v-188h-178v196q-420 59 -420 565z" /> +<glyph unicode="&#xa3;" d="M82 0v248q103 44 141.5 101t38.5 157v145h-178v219h178v195q0 201 114.5 309.5t323.5 108.5q195 0 390 -82l-93 -230q-157 64 -272 64q-78 0 -120 -44.5t-42 -127.5v-193h375v-219h-375v-143q0 -170 -151 -248h718v-260h-1048z" /> +<glyph unicode="&#xa5;" d="M6 1462h316l262 -602l264 602h313l-383 -747h195v-178h-246v-138h246v-178h-246v-221h-287v221h-247v178h247v138h-247v178h190z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223 t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304zM461 733q0 220 110.5 342.5t309.5 122.5q149 0 305 -78l-74 -168q-113 58 -217 58q-97 0 -150 -74t-53 -205q0 -280 203 -280q57 0 123 15t123 44v-191q-120 -57 -252 -57q-204 0 -316 125t-112 346z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223 t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304zM543 272v916h264q181 0 265.5 -70t84.5 -213q0 -170 -143 -233l237 -400h-254l-178 338h-47v-338h-229zM772 778h31q66 0 94.5 28.5t28.5 94.5q0 65 -28 92t-97 27h-29v-242z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1243" d="M332 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" /> +<glyph unicode="&#x2000;" horiz-adv-x="784" /> +<glyph unicode="&#x2001;" horiz-adv-x="1569" /> +<glyph unicode="&#x2002;" horiz-adv-x="784" /> +<glyph unicode="&#x2003;" horiz-adv-x="1569" /> +<glyph unicode="&#x2004;" horiz-adv-x="523" /> +<glyph unicode="&#x2005;" horiz-adv-x="392" /> +<glyph unicode="&#x2006;" horiz-adv-x="261" /> +<glyph unicode="&#x2007;" horiz-adv-x="261" /> +<glyph unicode="&#x2008;" horiz-adv-x="196" /> +<glyph unicode="&#x2009;" horiz-adv-x="313" /> +<glyph unicode="&#x200a;" horiz-adv-x="87" /> +<glyph unicode="&#x2010;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="&#x2011;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="&#x2012;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 436v230h860v-230h-860z" /> +<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 436v230h1884v-230h-1884z" /> +<glyph unicode="&#x2018;" horiz-adv-x="444" d="M25 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" /> +<glyph unicode="&#x2019;" horiz-adv-x="444" d="M25 961q69 296 100 501h281l14 -22q-50 -197 -176 -479h-219z" /> +<glyph unicode="&#x201c;" horiz-adv-x="911" d="M25 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280zM492 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" /> +<glyph unicode="&#x201d;" horiz-adv-x="911" d="M25 961q69 296 100 501h281l14 -22q-50 -197 -176 -479h-219zM492 961q69 296 100 501h280l15 -22q-50 -197 -176 -479h-219z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M98 748q0 154 74 235.5t213 81.5q137 0 212 -82t75 -235q0 -152 -75.5 -235t-211.5 -83q-138 0 -212.5 83t-74.5 235z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1751" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM700 143q0 84 45 127t132 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-85 0 -131 44.5t-46 125.5zM1284 143q0 84 45 127t131 43 q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" /> +<glyph unicode="&#x202f;" horiz-adv-x="313" /> +<glyph unicode="&#x205f;" horiz-adv-x="392" /> +<glyph unicode="&#x20ac;" d="M66 481v178h118q-4 23 -4 62l2 53h-116v176h133q37 242 199 382.5t405 140.5q188 0 352 -82l-98 -232q-69 31 -129 48.5t-125 17.5q-122 0 -201 -70.5t-102 -204.5h403v-176h-418l-2 -35v-47l2 -33h355v-178h-338q51 -243 321 -243q143 0 275 57v-256q-116 -59 -293 -59 q-245 0 -403 133t-199 368h-137z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M16 1313v149h564v-149h-199v-572h-168v572h-197zM625 741v721h247l160 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-142l-165 529h-7l4 -111v-418h-163z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.ttf new file mode 100644 index 000000000000..2d94f0629db7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.woff new file mode 100644 index 000000000000..cd86852d0a0c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Bold-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.eot new file mode 100644 index 000000000000..f44ac9a331e5 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.svg new file mode 100644 index 000000000000..8392240a1da1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.svg @@ -0,0 +1,146 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansBoldItalic" horiz-adv-x="1128" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="586" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM150 485l157 977h340l-256 -977h-241z" /> +<glyph unicode="&#x22;" horiz-adv-x="928" d="M201 934l71 528h277l-152 -528h-196zM604 934l74 528h276l-151 -528h-199z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M41 408l18 206h277l70 232h-252l18 209h289l119 407h217l-117 -407h199l116 407h215l-116 -407h239l-18 -209h-279l-69 -232h258l-19 -206h-297l-116 -408h-220l117 408h-194l-115 -408h-215l113 408h-238zM553 614h197l69 232h-196z" /> +<glyph unicode="$" d="M51 168v266q198 -107 404 -117l71 322q-163 61 -241 151t-78 214q0 173 127 279.5t350 121.5l35 151h139l-33 -151q166 -22 295 -90l-106 -232q-132 65 -242 74l-63 -299q131 -51 195 -99.5t97 -113t33 -149.5q0 -184 -125.5 -291.5t-367.5 -124.5l-39 -199h-140l44 201 q-209 12 -355 86zM502 1022q0 -79 80 -111l51 246q-62 -7 -96.5 -41t-34.5 -94zM594 322q63 9 102 45t39 98q0 46 -24.5 75.5t-59.5 43.5z" /> +<glyph unicode="%" horiz-adv-x="1753" d="M115 885q0 169 55.5 311.5t148.5 214.5t216 72q137 0 211.5 -80t74.5 -238q0 -166 -56 -310t-151 -217t-217 -73q-139 0 -210.5 83.5t-71.5 236.5zM231 0l1088 1462h235l-1083 -1462h-240zM360 868q0 -96 56 -96q65 0 112 131t47 275q0 96 -57 96q-63 0 -110.5 -128.5 t-47.5 -277.5zM973 283q0 177 53 322.5t148 219.5t219 74q137 0 211.5 -78.5t74.5 -230.5q0 -167 -54 -313.5t-148 -220.5t-215 -74q-144 0 -216.5 78.5t-72.5 222.5zM1219 285q0 -97 55 -97q41 0 77 55t59.5 154.5t23.5 196.5q0 96 -58 96q-39 0 -75 -56t-59 -154t-23 -195 z" /> +<glyph unicode="&#x26;" horiz-adv-x="1450" d="M68 358q0 145 78.5 248.5t273.5 200.5q-76 130 -76 258q0 195 117.5 307.5t316.5 112.5q169 0 266 -82.5t97 -224.5q0 -280 -365 -426l195 -263q44 57 80.5 121.5t78.5 173.5h300q-133 -313 -310 -497l205 -287h-350l-72 98q-175 -118 -403 -118q-209 0 -320.5 97.5 t-111.5 280.5zM383 387q0 -65 45.5 -108t116.5 -43q115 0 221 59l-225 328q-88 -51 -123 -104.5t-35 -131.5zM621 1085q0 -46 12 -92t29 -73q113 59 155.5 111t42.5 112q0 57 -30 82.5t-70 25.5q-66 0 -102.5 -46.5t-36.5 -119.5z" /> +<glyph unicode="'" horiz-adv-x="522" d="M201 934l71 528h277l-152 -528h-196z" /> +<glyph unicode="(" horiz-adv-x="694" d="M74 281q0 339 122.5 626.5t381.5 554.5h262q-255 -278 -377.5 -573.5t-122.5 -618.5q0 -308 117 -594h-234q-149 266 -149 605z" /> +<glyph unicode=")" horiz-adv-x="694" d="M-147 -324q499 545 499 1192q0 307 -116 594h233q149 -264 149 -604q0 -342 -124 -630.5t-379 -551.5h-262z" /> +<glyph unicode="*" horiz-adv-x="1116" d="M172 1141l86 237l338 -174l33 369l256 -51l-113 -353l387 29l-18 -254l-338 43l160 -336l-246 -73l-90 337l-197 -278l-207 164l275 248z" /> +<glyph unicode="+" d="M109 612v219h366v369h219v-369h367v-219h-367v-364h-219v364h-366z" /> +<glyph unicode="," horiz-adv-x="569" d="M-102 -264q74 167 194 502h285l8 -23q-118 -255 -262 -479h-225z" /> +<glyph unicode="-" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="." horiz-adv-x="584" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" /> +<glyph unicode="/" horiz-adv-x="862" d="M-90 0l809 1462h295l-809 -1462h-295z" /> +<glyph unicode="0" d="M66 467q0 297 84 537t228 360.5t333 120.5q399 0 399 -473q0 -470 -168.5 -751t-472.5 -281q-198 0 -300.5 122t-102.5 365zM369 461q0 -115 27.5 -173.5t97.5 -58.5q81 0 150.5 106t116 301t46.5 386q0 111 -30.5 162t-92.5 51q-80 0 -149.5 -104t-117.5 -302t-48 -368z " /> +<glyph unicode="1" d="M182 1114l566 348h249l-309 -1462h-305l180 829q35 152 76 287q-9 -8 -61.5 -47t-262.5 -170z" /> +<glyph unicode="2" d="M-49 0l43 213l477 424q180 159 248.5 254.5t68.5 179.5q0 75 -41 114.5t-110 39.5q-66 0 -135.5 -33.5t-171.5 -118.5l-146 203q132 112 252 159.5t250 47.5q190 0 301 -98t111 -259q0 -107 -41 -201t-122.5 -188t-266.5 -245l-269 -222v-10h568l-54 -260h-962z" /> +<glyph unicode="3" d="M14 59v267q84 -50 182 -75.5t191 -25.5q158 0 243 63.5t85 176.5q0 172 -258 172h-138l46 221h73q167 0 263 62t96 172q0 67 -43 104t-121 37q-134 0 -287 -100l-127 204q124 81 232.5 113.5t246.5 32.5q190 0 298 -90.5t108 -243.5q0 -156 -94.5 -262t-261.5 -135v-4 q131 -26 198.5 -106.5t67.5 -201.5q0 -133 -74 -238t-212 -163.5t-327 -58.5q-239 0 -387 79z" /> +<glyph unicode="4" d="M-25 303l48 234l770 925h311l-195 -919h170l-51 -240h-170l-63 -303h-293l63 303h-590zM305 543h311l58 248q12 58 40 164t42 141h-6q-35 -63 -132 -181z" /> +<glyph unicode="5" d="M27 61v269q174 -99 352 -99q154 0 241 71t87 194q0 94 -57.5 141t-166.5 47q-102 0 -213 -33l-104 78l207 733h755l-55 -262h-489l-88 -293q72 15 127 15q183 0 289 -103t106 -287q0 -167 -71.5 -292t-208.5 -192.5t-330 -67.5q-117 0 -218.5 23t-162.5 58z" /> +<glyph unicode="6" d="M88 469q0 202 61 395.5t167.5 335t256.5 213.5t357 72q125 0 223 -27l-51 -246q-84 25 -191 25q-194 0 -313.5 -108t-185.5 -345h4q115 166 311 166q157 0 242.5 -97t85.5 -273q0 -169 -71 -313.5t-190.5 -215.5t-277.5 -71q-212 0 -320 127t-108 362zM383 422 q0 -91 40 -143t107 -52q99 0 161.5 94t62.5 236q0 71 -33.5 113.5t-102.5 42.5q-60 0 -114.5 -35.5t-87.5 -95.5t-33 -160z" /> +<glyph unicode="7" d="M78 0l737 1202h-629l56 260h975l-41 -194l-752 -1268h-346z" /> +<glyph unicode="8" d="M55 350q0 298 348 426q-165 132 -165 299q0 119 58 212.5t168 145.5t257 52q123 0 215.5 -42t141 -118t48.5 -174q0 -134 -80.5 -233.5t-230.5 -151.5q217 -141 217 -365q0 -122 -63.5 -218.5t-181 -149.5t-273.5 -53q-214 0 -336.5 100t-122.5 270zM352 383 q0 -81 50 -128.5t135 -47.5q93 0 147.5 53.5t54.5 138.5q0 73 -36.5 131.5t-120.5 112.5q-116 -45 -173 -107t-57 -153zM528 1094q0 -132 123 -201q185 72 185 221q0 68 -39.5 107t-102.5 39q-76 0 -121 -46.5t-45 -119.5z" /> +<glyph unicode="9" d="M86 12v256q111 -41 227 -41q121 0 207.5 49t144 138.5t99.5 257.5h-4q-111 -158 -295 -158q-163 0 -252.5 103.5t-89.5 285.5q0 166 73 305.5t196 208t286 68.5q203 0 308.5 -123t105.5 -361q0 -280 -99 -533t-264 -370.5t-403 -117.5q-128 0 -240 32zM424 928 q0 -87 37.5 -131.5t105.5 -44.5q60 0 111.5 36.5t82 100t30.5 158.5q0 84 -35.5 137t-110.5 53q-65 0 -115.5 -42t-78 -114t-27.5 -153z" /> +<glyph unicode=":" horiz-adv-x="584" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5z" /> +<glyph unicode=";" horiz-adv-x="584" d="M-102 -264q74 167 194 502h285l8 -23q-118 -255 -262 -479h-225zM207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5z" /> +<glyph unicode="&#x3c;" d="M109 641v143l952 496v-240l-643 -317l643 -281v-239z" /> +<glyph unicode="=" d="M109 418v219h952v-219h-952zM109 807v217h952v-217h-952z" /> +<glyph unicode="&#x3e;" d="M109 203v239l643 281l-643 317v240l952 -496v-143z" /> +<glyph unicode="?" horiz-adv-x="940" d="M166 115q0 91 55 144.5t150 53.5q68 0 108.5 -38t40.5 -107q0 -87 -55 -141t-143 -54q-74 0 -115 38t-41 104zM178 1358q230 125 445 125q177 0 280 -87.5t103 -244.5q0 -83 -28.5 -149.5t-82.5 -123t-190 -147.5q-64 -43 -96.5 -73t-52.5 -64.5t-38 -108.5h-258l14 78 q19 103 73.5 177t172.5 155q124 84 157.5 127t33.5 96q0 119 -133 119q-50 0 -106.5 -16t-201.5 -84z" /> +<glyph unicode="@" horiz-adv-x="1753" d="M92 500q0 279 120.5 497t343 341.5t497.5 123.5q318 0 499 -163.5t181 -458.5q0 -173 -64 -321t-177.5 -231t-254.5 -83q-88 0 -144.5 38.5t-72.5 108.5h-6q-50 -77 -113 -112t-147 -35q-127 0 -198 79.5t-71 229.5q0 147 67.5 276.5t187.5 205t268 75.5q185 0 327 -55 l-106 -420q-11 -44 -19 -76.5t-8 -64.5q0 -68 58 -68q66 0 124 64t92.5 171t34.5 214q0 213 -123.5 325.5t-359.5 112.5q-203 0 -366.5 -94t-255 -266t-91.5 -392q0 -243 134 -380.5t376 -137.5q117 0 219.5 20t221.5 66v-186q-230 -90 -465 -90q-217 0 -378 85.5 t-246 241.5t-85 359zM713 526q0 -65 24.5 -102t69.5 -37q141 0 213 270l57 222q-36 10 -82 10q-82 0 -145.5 -51.5t-100 -137t-36.5 -174.5z" /> +<glyph unicode="A" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254z" /> +<glyph unicode="B" horiz-adv-x="1270" d="M53 0l309 1462h426q229 0 346 -81.5t117 -243.5q0 -150 -83 -247.5t-236 -129.5v-6q100 -26 159.5 -96.5t59.5 -180.5q0 -229 -153 -353t-423 -124h-522zM412 256h180q117 0 183.5 58t66.5 161q0 162 -183 162h-165zM545 883h149q121 0 181.5 48.5t60.5 139.5 q0 137 -170 137h-152z" /> +<glyph unicode="C" horiz-adv-x="1253" d="M123 553q0 262 104 482.5t278 335t400 114.5q125 0 222 -22.5t208 -82.5l-118 -250q-106 59 -175 78t-137 19q-132 0 -237.5 -81t-169.5 -238.5t-64 -338.5q0 -167 68.5 -248t218.5 -81q146 0 338 77v-260q-199 -77 -400 -77q-254 0 -395 149.5t-141 423.5z" /> +<glyph unicode="D" horiz-adv-x="1386" d="M53 0l309 1462h396q270 0 417.5 -143t147.5 -410q0 -280 -98 -486.5t-283.5 -314.5t-437.5 -108h-451zM412 256h106q148 0 258 76t172 223.5t62 337.5q0 154 -72.5 234.5t-208.5 80.5h-115z" /> +<glyph unicode="E" horiz-adv-x="1110" d="M53 0l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512l-54 -256h-817z" /> +<glyph unicode="F" horiz-adv-x="1087" d="M53 0l309 1462h814l-54 -254h-508l-79 -377h473l-56 -253h-473l-121 -578h-305z" /> +<glyph unicode="G" horiz-adv-x="1413" d="M123 549q0 268 107 484.5t301 334t448 117.5q218 0 410 -99l-115 -251q-74 40 -148 64t-161 24q-153 0 -273.5 -83t-189 -236.5t-68.5 -330.5q0 -172 72.5 -252.5t222.5 -80.5q76 0 170 24l66 299h-267l56 258h563l-162 -762q-134 -46 -248.5 -62.5t-242.5 -16.5 q-259 0 -400 147t-141 422z" /> +<glyph unicode="H" horiz-adv-x="1434" d="M53 0l309 1462h306l-121 -573h471l121 573h305l-309 -1462h-306l134 631h-471l-134 -631h-305z" /> +<glyph unicode="I" horiz-adv-x="659" d="M53 0l312 1462h305l-312 -1462h-305z" /> +<glyph unicode="J" horiz-adv-x="678" d="M-322 -150q88 -20 164 -20q99 0 160.5 60.5t89.5 191.5l293 1380h305l-303 -1423q-52 -245 -175.5 -357t-346.5 -112q-94 0 -187 27v253z" /> +<glyph unicode="K" horiz-adv-x="1255" d="M53 0l309 1462h306l-152 -702l158 205l409 497h361l-594 -700l291 -762h-338l-211 592l-125 -70l-109 -522h-305z" /> +<glyph unicode="L" horiz-adv-x="1061" d="M53 0l309 1462h306l-256 -1206h512l-54 -256h-817z" /> +<glyph unicode="M" horiz-adv-x="1802" d="M53 0l309 1462h404l68 -1093h4l551 1093h423l-309 -1462h-280l145 692q53 247 105 441h-5l-569 -1133h-281l-61 1133h-4q-11 -88 -38 -231t-187 -902h-275z" /> +<glyph unicode="N" horiz-adv-x="1546" d="M53 0l309 1462h357l340 -1077h4q12 76 39 217t180 860h274l-309 -1462h-342l-356 1106h-6l-4 -32q-32 -216 -66 -386l-145 -688h-275z" /> +<glyph unicode="O" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5q-121 0 -222 -91.5 t-158.5 -251.5t-57.5 -347z" /> +<glyph unicode="P" horiz-adv-x="1188" d="M53 0l309 1462h338q242 0 366 -106.5t124 -319.5q0 -241 -169.5 -378.5t-467.5 -137.5h-86l-109 -520h-305zM522 774h56q142 0 223.5 69t81.5 185q0 180 -195 180h-74z" /> +<glyph unicode="Q" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -316 -122.5 -555.5t-334.5 -337.5l254 -393h-359l-178 328h-26q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5 q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347z" /> +<glyph unicode="R" horiz-adv-x="1247" d="M53 0l309 1462h359q237 0 356 -102t119 -299q0 -158 -83 -271.5t-239 -168.5l261 -621h-332l-207 561h-119l-119 -561h-305zM530 813h78q131 0 204 57t73 174q0 82 -47.5 123t-149.5 41h-74z" /> +<glyph unicode="S" horiz-adv-x="1085" d="M41 70v274q193 -108 358 -108q112 0 175 42.5t63 116.5q0 43 -13.5 75.5t-38.5 60.5t-124 102q-138 99 -194 196t-56 209q0 129 62 230.5t176.5 158t263.5 56.5q217 0 397 -99l-109 -233q-156 74 -288 74q-83 0 -136 -45t-53 -119q0 -61 33 -106.5t148 -120.5 q121 -80 181 -176.5t60 -225.5q0 -209 -148 -330.5t-401 -121.5q-221 0 -356 90z" /> +<glyph unicode="T" horiz-adv-x="1087" d="M168 1204l55 258h1010l-55 -258h-353l-254 -1204h-305l254 1204h-352z" /> +<glyph unicode="U" horiz-adv-x="1415" d="M141 401q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5z" /> +<glyph unicode="V" horiz-adv-x="1208" d="M184 1462h295l51 -880q4 -45 4 -133q-2 -103 -6 -150h7q78 221 110 283l432 880h316l-748 -1462h-334z" /> +<glyph unicode="W" horiz-adv-x="1831" d="M184 1462h287l6 -798q0 -52 -4 -173t-10 -174h6q22 64 67 180.5t60 145.5l369 819h270l21 -873q0 -146 -9 -272h6q43 129 131 349l330 796h309l-647 -1462h-346l-22 721l-2 139q0 88 4 158h-4q-46 -146 -115 -299l-324 -719h-338z" /> +<glyph unicode="X" horiz-adv-x="1241" d="M-117 0l576 764l-238 698h320l153 -518l363 518h344l-545 -725l268 -737h-331l-172 543l-396 -543h-342z" /> +<glyph unicode="Y" horiz-adv-x="1155" d="M186 1462h312l129 -592l374 592h342l-618 -903l-119 -559h-303l119 559z" /> +<glyph unicode="Z" horiz-adv-x="1098" d="M-61 0l38 201l777 1005h-543l53 256h936l-41 -202l-782 -1004h596l-53 -256h-981z" /> +<glyph unicode="[" horiz-adv-x="678" d="M-37 -324l381 1786h473l-45 -211h-215l-291 -1364h215l-45 -211h-473z" /> +<glyph unicode="\" horiz-adv-x="862" d="M221 1462h260l224 -1462h-267z" /> +<glyph unicode="]" horiz-adv-x="678" d="M-137 -324l45 211h213l291 1364h-215l45 211h473l-381 -1786h-471z" /> +<glyph unicode="^" horiz-adv-x="1081" d="M20 520l619 950h147l277 -950h-223l-174 633l-402 -633h-244z" /> +<glyph unicode="_" horiz-adv-x="819" d="M-186 -324l30 140h822l-31 -140h-821z" /> +<glyph unicode="`" horiz-adv-x="1135" d="M508 1548v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" /> +<glyph unicode="a" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234z" /> +<glyph unicode="b" horiz-adv-x="1219" d="M37 0l330 1556h301l-62 -288q-41 -182 -84 -299h8q78 98 142.5 134t140.5 36q146 0 230.5 -108t84.5 -298t-68 -367.5t-187 -281.5t-263 -104q-194 0 -276 163h-8l-58 -143h-231zM420 399q0 -80 37 -128t102 -48q67 0 128 69t98.5 189.5t37.5 237.5q0 176 -131 176 q-68 0 -130 -65t-102 -180.5t-40 -250.5z" /> +<glyph unicode="c" horiz-adv-x="989" d="M90 391q0 212 74.5 385.5t209.5 268t308 94.5q182 0 328 -72l-92 -229q-54 23 -106 40t-118 17q-85 0 -153.5 -64t-107 -175.5t-38.5 -239.5q0 -96 45.5 -144.5t126.5 -48.5q76 0 141 23.5t134 58.5v-246q-152 -79 -336 -79q-201 0 -308.5 107.5t-107.5 303.5z" /> +<glyph unicode="d" horiz-adv-x="1217" d="M90 387q0 196 71.5 374.5t188.5 278t258 99.5q82 0 141.5 -37t112.5 -127h8l2 28q6 110 25 195l76 358h301l-330 -1556h-229l14 145h-4q-71 -87 -148.5 -126t-170.5 -39q-147 0 -231.5 107t-84.5 300zM395 399q0 -176 137 -176q66 0 128.5 68.5t100.5 182.5t38 245 q0 80 -37.5 128t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234z" /> +<glyph unicode="e" horiz-adv-x="1141" d="M90 412q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86q-210 0 -326 113t-116 319zM428 647h45q155 0 241.5 48.5 t86.5 131.5q0 95 -105 95q-88 0 -166 -80t-102 -195z" /> +<glyph unicode="f" horiz-adv-x="764" d="M-219 -225q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h219l-49 -229h-220l-215 -1010q-77 -371 -403 -371q-104 0 -174 25v242z" /> +<glyph unicode="g" horiz-adv-x="1108" d="M-115 -209q0 102 68.5 175.5t214.5 121.5q-74 47 -74 133q0 71 44.5 122.5t146.5 98.5q-65 49 -96 112t-31 153q0 199 125.5 315.5t341.5 116.5q83 0 166 -23h395l-35 -166l-174 -41q16 -52 16 -118q0 -195 -121 -308.5t-329 -113.5q-59 0 -99 10q-84 -27 -84 -78 q0 -34 30 -49t89 -23l137 -18q163 -21 237.5 -84.5t74.5 -183.5q0 -211 -156 -323t-446 -112q-208 0 -324.5 75.5t-116.5 207.5zM150 -172q0 -115 194 -115q151 0 228 45t77 127q0 39 -32.5 60t-137.5 35l-114 14q-106 -14 -160.5 -57t-54.5 -109zM442 680q0 -119 103 -119 q75 0 121.5 76.5t46.5 193.5t-99 117q-77 0 -124.5 -76.5t-47.5 -191.5z" /> +<glyph unicode="h" horiz-adv-x="1237" d="M37 0l330 1556h301q-39 -181 -60 -278t-86 -309h8q62 77 138 123.5t176 46.5q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180l-133 -637h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" /> +<glyph unicode="i" horiz-adv-x="608" d="M37 0l237 1118h301l-237 -1118h-301zM322 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" /> +<glyph unicode="j" horiz-adv-x="608" d="M-264 -225q61 -21 114 -21q137 0 173 170l253 1194h302l-265 -1239q-77 -371 -403 -371q-104 0 -174 25v242zM324 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" /> +<glyph unicode="k" horiz-adv-x="1163" d="M37 0l330 1556h301l-148 -694q-8 -41 -29 -117l-28 -102h4l453 475h344l-498 -504l285 -614h-336l-183 420l-120 -72l-74 -348h-301z" /> +<glyph unicode="l" horiz-adv-x="608" d="M37 0l330 1556h301l-330 -1556h-301z" /> +<glyph unicode="m" horiz-adv-x="1853" d="M37 0l237 1118h230l-21 -207h6q146 228 355 228q219 0 262 -228h6q68 110 160.5 169t197.5 59q136 0 207.5 -85t71.5 -237q0 -76 -23 -180l-133 -637h-301l138 653q16 68 16 119q0 123 -98 123q-92 0 -166.5 -112t-118.5 -318l-96 -465h-301l137 653q16 68 16 119 q0 123 -98 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" /> +<glyph unicode="n" horiz-adv-x="1237" d="M37 0l237 1118h230l-21 -207h6q146 228 355 228q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180l-133 -637h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" /> +<glyph unicode="o" horiz-adv-x="1198" d="M90 410q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118t114 -325q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5zM393 410q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5q0 197 -143 197q-75 0 -134.5 -61t-97 -179 t-37.5 -243z" /> +<glyph unicode="p" horiz-adv-x="1219" d="M-68 -492l342 1610h230l-17 -170h9q138 191 317 191q146 0 230.5 -107.5t84.5 -300.5q0 -191 -68.5 -367.5t-187.5 -280t-262 -103.5q-83 0 -143 37t-111 126h-8q-12 -159 -43 -295l-72 -340h-301zM420 399q0 -80 37 -128t102 -48q67 0 128 69t98.5 189.5t37.5 237.5 q0 176 -131 176q-68 0 -131.5 -67.5t-102 -180t-38.5 -248.5z" /> +<glyph unicode="q" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q86 0 152.5 -37.5t124.5 -126.5h8l57 143h232l-342 -1610h-301q47 218 73 337.5t84 304.5h-8q-72 -94 -143 -132t-154 -38q-88 0 -156 47.5t-106.5 138.5t-38.5 219zM395 399q0 -88 36.5 -132t103.5 -44q64 0 127.5 70t100 181 t36.5 245q0 80 -37.5 128t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234z" /> +<glyph unicode="r" horiz-adv-x="862" d="M37 0l237 1118h230l-21 -207h6q147 228 353 228q59 0 96 -11l-66 -290q-45 16 -100 16q-116 0 -203.5 -91.5t-124.5 -262.5l-106 -500h-301z" /> +<glyph unicode="s" horiz-adv-x="969" d="M23 45v248q157 -90 319 -90q80 0 131 32.5t51 88.5q0 43 -37 77t-131 86q-121 68 -169 135.5t-48 159.5q0 170 110.5 263.5t315.5 93.5q201 0 363 -95l-99 -215q-140 84 -258 84q-57 0 -92 -25.5t-35 -68.5q0 -39 32 -68.5t120 -74.5q123 -63 178 -137t55 -170 q0 -188 -124.5 -288.5t-346.5 -100.5q-107 0 -186.5 15t-148.5 50z" /> +<glyph unicode="t" horiz-adv-x="840" d="M94 889l29 147l196 84l132 236h194l-49 -238h283l-50 -229h-282l-115 -539q-6 -30 -6 -53q0 -74 88 -74q65 0 162 35v-225q-111 -53 -266 -53q-150 0 -220.5 63t-70.5 195q0 50 12 112l115 539h-152z" /> +<glyph unicode="u" horiz-adv-x="1237" d="M111 301q0 93 24 213l127 604h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5z" /> +<glyph unicode="v" horiz-adv-x="1049" d="M102 1118h295l45 -586q7 -133 7 -231h6q55 153 92 223l297 594h323l-604 -1118h-323z" /> +<glyph unicode="w" horiz-adv-x="1614" d="M125 1118h281l4 -495l-4 -167l-7 -171h4q6 20 14 41.5t51 136.5t46 119l231 536h328v-536q0 -142 -10 -297h6l28 80q73 208 95 258l219 495h307l-530 -1118h-330l-6 520q0 155 10 340h-6q-62 -178 -123 -319l-233 -541h-324z" /> +<glyph unicode="x" horiz-adv-x="1087" d="M-100 0l479 573l-225 545h321l115 -334l244 334h354l-467 -561l244 -557h-326l-125 342l-264 -342h-350z" /> +<glyph unicode="y" horiz-adv-x="1063" d="M-141 -233q68 -13 116 -13q84 0 147.5 48t117.5 149l26 49l-164 1118h295l56 -518q14 -122 14 -293h6q20 51 44 119.5t65 153.5l260 538h327l-680 -1278q-177 -332 -483 -332q-90 0 -147 19v240z" /> +<glyph unicode="z" horiz-adv-x="932" d="M-47 0l35 180l575 705h-397l51 233h750l-43 -200l-566 -685h439l-49 -233h-795z" /> +<glyph unicode="{" horiz-adv-x="727" d="M-8 459l45 229q122 0 192.5 41.5t92.5 138.5l61 285q38 170 131 239.5t270 69.5h84l-49 -225q-90 -2 -130.5 -34.5t-55.5 -106.5l-66 -297q-45 -207 -276 -236v-8q85 -26 126.5 -82.5t41.5 -134.5q0 -44 -15 -113l-36 -178q-7 -28 -7 -51q0 -54 33.5 -74t91.5 -20v-226 h-53q-167 0 -253.5 63.5t-86.5 184.5q0 57 14 125l39 184q15 69 15 86q0 140 -209 140z" /> +<glyph unicode="|" d="M455 -465v2015h219v-2015h-219z" /> +<glyph unicode="}" horiz-adv-x="727" d="M-100 -98q93 3 137 35.5t59 105.5l66 297q25 111 95 166t181 69v9q-168 51 -168 217q0 43 15 112l37 179q6 30 6 51q0 54 -36.5 74t-109.5 20l41 225h33q340 0 340 -248q0 -56 -14 -124l-39 -185q-15 -69 -15 -86q0 -139 209 -139l-45 -229q-122 0 -192.5 -42t-91.5 -139 l-62 -284q-37 -170 -130.5 -240t-270.5 -70h-45v226z" /> +<glyph unicode="~" d="M109 551v231q101 109 256 109q64 0 117 -14t139 -50q64 -27 111 -41t95 -14q51 0 112 30.5t122 90.5v-231q-103 -109 -256 -109q-59 0 -109 11.5t-147 51.5q-89 38 -127 47t-80 9q-54 0 -116.5 -33t-116.5 -88z" /> +<glyph unicode="&#xa2;" d="M164 584q0 193 62.5 355t178 262.5t267.5 123.5l33 158h188l-35 -158q118 -14 225 -65l-92 -230q-53 23 -105 40t-118 17q-133 0 -216 -143t-83 -336q0 -96 45 -144t127 -48q75 0 140 23.5t134 58.5v-246q-136 -71 -299 -80l-41 -192h-188l49 210q-134 36 -203 136 t-69 258z" /> +<glyph unicode="&#xa3;" d="M-12 0l49 246q196 48 244 264l22 104h-192l45 220h192l49 247q41 197 162 300.5t313 103.5q195 0 369 -86l-113 -232q-141 68 -237 68q-75 0 -123 -39.5t-68 -132.5l-47 -229h299l-45 -220h-299l-18 -84q-42 -195 -209 -270h655l-55 -260h-993z" /> +<glyph unicode="&#xa5;" d="M88 221l37 178h252l29 138h-252l39 178h196l-192 747h297l114 -590l371 590h311l-506 -747h203l-39 -178h-252l-28 -138h252l-37 -178h-252l-47 -221h-291l47 221h-252z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M125 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5 t-80.5 303.5t-222 223.5t-307.5 83q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304zM485 721q0 225 117.5 351t325.5 126q142 0 284 -72l-75 -174q-114 58 -205 58q-111 0 -163 -73t-52 -214q0 -134 55.5 -203t159.5 -69q43 0 108.5 15.5t124.5 43.5v-191q-131 -57 -262 -57 q-196 0 -307 122.5t-111 336.5z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M125 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5 t-80.5 303.5t-222 223.5t-307.5 83q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304zM571 293v874h308q173 0 265.5 -67.5t92.5 -200.5q0 -86 -44 -149.5t-130 -96.5l197 -360h-254l-138 297h-67v-297h-230zM801 758h51q72 0 113 31t41 92q0 59 -35.5 88.5t-116.5 29.5h-53 v-241z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M483 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" /> +<glyph unicode="&#x2000;" horiz-adv-x="786" /> +<glyph unicode="&#x2001;" horiz-adv-x="1573" /> +<glyph unicode="&#x2002;" horiz-adv-x="786" /> +<glyph unicode="&#x2003;" horiz-adv-x="1573" /> +<glyph unicode="&#x2004;" horiz-adv-x="524" /> +<glyph unicode="&#x2005;" horiz-adv-x="393" /> +<glyph unicode="&#x2006;" horiz-adv-x="262" /> +<glyph unicode="&#x2007;" horiz-adv-x="262" /> +<glyph unicode="&#x2008;" horiz-adv-x="196" /> +<glyph unicode="&#x2009;" horiz-adv-x="314" /> +<glyph unicode="&#x200a;" horiz-adv-x="87" /> +<glyph unicode="&#x2010;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="&#x2011;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="&#x2012;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" /> +<glyph unicode="&#x2013;" horiz-adv-x="983" d="M41 436l49 230h852l-49 -230h-852z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M41 436l49 230h1835l-49 -230h-1835z" /> +<glyph unicode="&#x2018;" horiz-adv-x="440" d="M115 983q103 227 262 479h225q-91 -213 -194 -501h-285z" /> +<glyph unicode="&#x2019;" horiz-adv-x="440" d="M106 961q89 206 195 501h285l8 -22q-103 -227 -262 -479h-226z" /> +<glyph unicode="&#x201c;" horiz-adv-x="887" d="M115 983q103 227 262 479h225q-91 -213 -194 -501h-285zM561 983q103 227 262 479h226q-97 -227 -195 -501h-285z" /> +<glyph unicode="&#x201d;" horiz-adv-x="887" d="M106 961q89 206 195 501h285l8 -22q-103 -227 -262 -479h-226zM553 961q23 53 46.5 111t148.5 390h284l8 -22q-103 -227 -262 -479h-225z" /> +<glyph unicode="&#x2022;" horiz-adv-x="739" d="M104 686q0 106 42.5 194t120 136.5t182.5 48.5q120 0 182.5 -67t62.5 -191q0 -177 -91.5 -277t-248.5 -100q-117 0 -183.5 67t-66.5 189z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1706" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM586 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM1147 115q0 90 53.5 144t150.5 54q68 0 109 -38 t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" /> +<glyph unicode="&#x202f;" horiz-adv-x="314" /> +<glyph unicode="&#x205f;" horiz-adv-x="393" /> +<glyph unicode="&#x20ac;" d="M41 481l37 178h127q9 67 22 115h-125l39 176h135q87 252 250.5 393.5t374.5 141.5q100 0 179 -23t165 -80l-125 -223q-87 49 -131 63.5t-90 14.5q-97 0 -176 -74.5t-135 -212.5h348l-39 -176h-360q-11 -34 -25 -115h299l-37 -178h-280q0 -120 44.5 -181.5t147.5 -61.5 q133 0 283 63v-258q-126 -63 -330 -63q-446 0 -446 501h-152z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M106 1313v149h564v-149h-199v-572h-168v572h-197zM715 741v721h248l159 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-141l-166 529h-7l5 -111v-418h-164z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.ttf new file mode 100644 index 000000000000..f74e0e3ca7fc Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.woff new file mode 100644 index 000000000000..f3248c1142bc Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-BoldItalic-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.eot new file mode 100644 index 000000000000..277c1899cda9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.svg new file mode 100644 index 000000000000..29c7497fed85 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.svg @@ -0,0 +1,146 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansItalic" horiz-adv-x="1128" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="530" d="M43 78q0 76 39.5 120t107.5 44q45 0 73 -27.5t28 -81.5q0 -68 -39 -115t-105 -47q-49 0 -76.5 28t-27.5 79zM172 403q49 307 176 1059h207l-274 -1059h-109z" /> +<glyph unicode="&#x22;" horiz-adv-x="791" d="M225 934l72 528h188l-153 -528h-107zM573 934l72 528h189l-154 -528h-107z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M63 430l13 129h284l101 340h-277l13 127h301l123 436h139l-125 -436h305l127 436h133l-125 -436h264l-12 -127h-291l-98 -340h285l-13 -129h-309l-125 -430h-139l129 430h-303l-127 -430h-133l121 430h-261zM500 559h303l96 340h-303z" /> +<glyph unicode="$" d="M72 176v154q82 -41 175.5 -63.5t166.5 -22.5l98 452q-139 49 -201.5 123.5t-62.5 188.5q0 159 108 255t299 113l39 176h133l-39 -178q159 -12 283 -76l-63 -135q-121 63 -248 72l-94 -440q149 -55 212.5 -125t63.5 -178q0 -162 -112.5 -263t-309.5 -123l-49 -225h-133 l49 223q-195 14 -315 72zM401 1010q0 -53 34.5 -97.5t107.5 -70.5l84 393q-108 -11 -167 -69t-59 -156zM549 250q107 13 170 75t63 154q0 54 -33 96t-114 74z" /> +<glyph unicode="%" horiz-adv-x="1624" d="M168 860q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -72t60 -205q0 -108 -32 -237.5t-82.5 -217.5t-120.5 -137t-157 -49q-109 0 -170 75t-61 220zM231 0l1086 1462h151l-1085 -1462h-152zM307 864q0 -172 107 -172q52 0 94 39.5t73.5 114t50.5 175t19 171.5 q0 166 -108 166q-66 0 -119 -63t-85 -187.5t-32 -243.5zM909 274q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -71.5t60 -204.5q0 -107 -31.5 -236t-82 -217.5t-121 -138t-156.5 -49.5q-110 0 -171 74.5t-61 219.5zM1049 279q0 -173 106 -173q65 0 117 65t86.5 198.5 t34.5 236.5q0 166 -109 166q-67 0 -119.5 -64.5t-84 -188.5t-31.5 -240z" /> +<glyph unicode="&#x26;" horiz-adv-x="1372" d="M66 342q0 148 90 257.5t303 211.5q-103 165 -103 309q0 164 106 264.5t281 100.5q149 0 236.5 -79t87.5 -212q0 -78 -32.5 -137t-87.5 -108t-127.5 -90t-153.5 -83l278 -389q127 110 199 295h168q-101 -236 -283 -412l203 -270h-201l-117 166q-120 -100 -230 -143 t-247 -43q-168 0 -269 96t-101 266zM229 354q0 -106 66.5 -170.5t175.5 -64.5q87 0 168 33t195 124l-306 433q-128 -67 -184 -116t-85.5 -107.5t-29.5 -131.5zM516 1118q0 -120 82 -235q139 71 191 110t83 85t31 104q0 77 -42.5 121.5t-123.5 44.5q-105 0 -163 -60t-58 -170 z" /> +<glyph unicode="'" horiz-adv-x="444" d="M225 934l72 528h188l-153 -528h-107z" /> +<glyph unicode="(" horiz-adv-x="584" d="M82 272q0 339 120 627t384 563h157q-246 -270 -371.5 -570t-125.5 -618q0 -339 114 -598h-131q-147 266 -147 596z" /> +<glyph unicode=")" horiz-adv-x="584" d="M-160 -324q496 551 496 1188q0 341 -113 598h131q146 -269 146 -598q0 -341 -121.5 -629.5t-382.5 -558.5h-156z" /> +<glyph unicode="*" horiz-adv-x="1130" d="M215 1194l55 154l371 -185l41 400l172 -35l-123 -383l422 18l-8 -157l-393 47l180 -383l-166 -52l-113 406l-258 -344l-116 121l309 284z" /> +<glyph unicode="+" d="M127 651v142h389v391h141v-391h390v-142h-390v-387h-141v387h-389z" /> +<glyph unicode="," horiz-adv-x="492" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129z" /> +<glyph unicode="-" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="." horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" /> +<glyph unicode="/" horiz-adv-x="717" d="M-94 0l813 1462h174l-813 -1462h-174z" /> +<glyph unicode="0" d="M121 477q0 270 82 514.5t216.5 369t307.5 124.5q365 0 365 -471q0 -295 -78.5 -539t-214 -369.5t-314.5 -125.5q-176 0 -270 127.5t-94 369.5zM293 479q0 -172 50 -264t161 -92q115 0 209 114t150.5 328t56.5 453q0 323 -203 323q-113 0 -209 -115.5t-155.5 -323 t-59.5 -423.5z" /> +<glyph unicode="1" d="M303 1178l449 284h149l-313 -1462h-172l196 913q59 261 88 359q-50 -53 -139 -111l-178 -110z" /> +<glyph unicode="2" d="M12 0l31 147l465 420q102 93 176.5 163.5t123 133t72 124t23.5 136.5q0 99 -60 157t-163 58q-77 0 -150.5 -28.5t-162.5 -96.5l-82 115q191 154 413 154q176 0 278.5 -88.5t102.5 -243.5q0 -111 -39.5 -204t-131 -197t-294.5 -281l-352 -307v-8h678l-29 -154h-899z" /> +<glyph unicode="3" d="M47 59v164q94 -49 199 -75.5t190 -26.5q162 0 252 79.5t90 217.5q0 131 -79 198.5t-220 67.5h-131l31 143h139q165 0 274 87t109 227q0 92 -58 146t-157 54q-80 0 -157 -27t-175 -93l-80 118q195 144 424 144q179 0 277 -87t98 -237q0 -156 -101 -264.5t-280 -140.5v-9 q124 -23 195 -106.5t71 -208.5q0 -133 -62 -234.5t-181 -158.5t-283 -57q-210 0 -385 79z" /> +<glyph unicode="4" d="M16 334l29 158l834 978h196l-207 -983h232l-33 -153h-233l-72 -334h-164l74 334h-656zM219 487h486q46 220 78 373t116 445h-8q-17 -29 -66.5 -96.5t-72.5 -96.5z" /> +<glyph unicode="5" d="M80 59v164q164 -102 334 -102q191 0 298 96t107 268q0 126 -73.5 199.5t-204.5 73.5q-48 0 -97 -6.5t-139 -30.5l-74 57l197 684h668l-33 -153h-522l-127 -439q87 23 184 23q182 0 289.5 -104.5t107.5 -282.5q0 -161 -73 -283t-204 -182.5t-308 -60.5q-193 0 -330 79z " /> +<glyph unicode="6" d="M133 424q0 209 60.5 415t163.5 351.5t246 219t327 73.5q111 0 184 -23l-35 -145q-68 22 -170 22q-212 0 -356.5 -149t-212.5 -443h8q59 79 146.5 126t193.5 47q154 0 244 -98.5t90 -270.5q0 -161 -66.5 -294.5t-180.5 -204t-261 -70.5q-182 0 -281.5 115t-99.5 329z M299 416q0 -137 60.5 -216t172.5 -79q94 0 167.5 54t114 149t40.5 208q0 248 -221 248q-66 0 -128 -28.5t-110 -76t-72 -104.5t-24 -155z" /> +<glyph unicode="7" d="M174 0l768 1313h-719l31 149h891l-27 -139l-764 -1323h-180z" /> +<glyph unicode="8" d="M96 346q0 148 95 256t296 184q-95 69 -135.5 144.5t-40.5 171.5q0 111 54.5 198.5t153.5 136t222 48.5q174 0 271.5 -86.5t97.5 -235.5q0 -129 -78 -225t-266 -176q127 -78 180 -165t53 -202q0 -122 -60 -217.5t-172.5 -146.5t-264.5 -51q-190 0 -298 98.5t-108 267.5z M270 354q0 -107 69 -170t181 -63q139 0 222 74t83 196q0 99 -52 174t-165 135q-185 -60 -261.5 -143.5t-76.5 -202.5zM479 1100q0 -82 39 -144t127 -116q161 60 228 131.5t67 173.5q0 90 -57.5 143t-153.5 53q-114 0 -182 -65.5t-68 -175.5z" /> +<glyph unicode="9" d="M98 14v158q134 -47 246 -47q202 0 327 141t189 441h-10q-51 -75 -132.5 -118.5t-180.5 -43.5q-169 0 -261 98.5t-92 288.5q0 153 64.5 280.5t180 199t259.5 71.5q180 0 279.5 -114.5t99.5 -334.5q0 -194 -56 -406.5t-147.5 -360t-221.5 -217.5t-302 -70q-136 0 -242 34z M350 938q0 -124 54.5 -190t162.5 -66q76 0 140 28.5t108.5 81.5t65 114t20.5 151q0 131 -59 207.5t-160 76.5q-150 0 -241 -113t-91 -290z" /> +<glyph unicode=":" horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" /> +<glyph unicode=";" horiz-adv-x="518" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" /> +<glyph unicode="&#x3c;" d="M121 664v98l919 479v-149l-747 -371l747 -328v-151z" /> +<glyph unicode="=" d="M127 444v142h920v-142h-920zM127 858v139h920v-139h-920z" /> +<glyph unicode="&#x3e;" d="M121 242v151l745 328l-745 371v149l919 -479v-98z" /> +<glyph unicode="?" horiz-adv-x="874" d="M158 74q0 77 40 122.5t111 45.5q44 0 70.5 -26t26.5 -79q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26t-27 77zM197 1382q92 51 192 76t182 25q167 0 259 -84t92 -238q0 -123 -65.5 -226.5t-225.5 -223.5q-125 -91 -169 -147.5t-67 -160.5h-135q22 130 72.5 213.5 t165.5 174.5q128 100 168 144t63 94t23 112q0 93 -51.5 143.5t-147.5 50.5q-81 0 -155 -25.5t-140 -56.5z" /> +<glyph unicode="@" horiz-adv-x="1735" d="M111 504q0 261 126.5 485.5t343.5 347.5t486 123q191 0 329 -75.5t210.5 -213.5t72.5 -319q0 -179 -55 -324t-155 -227t-222 -82q-197 0 -213 184h-8q-111 -184 -291 -184q-115 0 -180.5 75.5t-65.5 209.5q0 157 68 284t188.5 199t260.5 72q65 0 127.5 -12t150.5 -48 q-64 -242 -98 -368t-31 -172q0 -117 102 -117q78 0 141.5 67t100.5 183.5t37 243.5q0 239 -128 367t-370 128q-228 0 -406.5 -107t-277 -295.5t-98.5 -416.5q0 -270 143.5 -418.5t409.5 -148.5q197 0 420 86v-127q-219 -90 -443 -90q-314 0 -494.5 184.5t-180.5 505.5z M639 518q0 -93 33 -134.5t98 -41.5q187 0 272 315l70 258q-63 23 -127 23q-94 0 -174 -55t-126 -153t-46 -212z" /> +<glyph unicode="A" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474z" /> +<glyph unicode="B" horiz-adv-x="1225" d="M86 0l309 1462h375q432 0 432 -336q0 -141 -87 -238t-245 -126v-10q115 -32 176.5 -110.5t61.5 -188.5q0 -212 -152 -332.5t-407 -120.5h-463zM287 145h266q181 0 278 80.5t97 227.5q0 116 -74.5 177.5t-214.5 61.5h-236zM434 836h248q156 0 249 73t93 199 q0 104 -66.5 155.5t-209.5 51.5h-211z" /> +<glyph unicode="C" horiz-adv-x="1198" d="M150 537q0 261 105.5 485.5t283.5 342.5t403 118q197 0 348 -80l-69 -141q-138 69 -279 69q-174 0 -311.5 -97t-218 -284.5t-80.5 -408.5q0 -187 97.5 -298.5t268.5 -111.5q139 0 322 57v-149q-86 -31 -164 -45t-188 -14q-242 0 -380 149.5t-138 407.5z" /> +<glyph unicode="D" horiz-adv-x="1364" d="M86 0l309 1462h342q276 0 419.5 -149.5t143.5 -435.5q0 -261 -105 -461t-300 -308t-457 -108h-352zM287 147h162q202 0 355 91.5t234.5 258.5t81.5 382t-103 325.5t-302 110.5h-178z" /> +<glyph unicode="E" horiz-adv-x="1047" d="M86 0l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565l-33 -152h-735z" /> +<glyph unicode="F" horiz-adv-x="967" d="M86 0l309 1462h735l-30 -153h-568l-110 -533h528l-32 -153h-529l-131 -623h-172z" /> +<glyph unicode="G" horiz-adv-x="1386" d="M150 528q0 269 101.5 489.5t281.5 343t399 122.5q117 0 219.5 -20t206.5 -64l-66 -152q-77 34 -165.5 59t-194.5 25q-169 0 -307.5 -101.5t-215.5 -283.5t-77 -407q0 -190 102.5 -299t286.5 -109q154 0 260 39l96 444h-289l33 152h459l-154 -711q-216 -75 -419 -75 q-264 0 -410.5 144.5t-146.5 403.5z" /> +<glyph unicode="H" horiz-adv-x="1389" d="M86 0l309 1462h170l-131 -622h660l133 622h168l-310 -1462h-167l143 688h-660l-145 -688h-170z" /> +<glyph unicode="I" horiz-adv-x="559" d="M86 0l311 1462h168l-311 -1462h-168z" /> +<glyph unicode="J" horiz-adv-x="547" d="M-319 -360l6 147q69 -20 145 -20q100 0 165.5 62.5t90.5 182.5l307 1450h170l-309 -1468q-79 -379 -422 -379q-105 0 -153 25z" /> +<glyph unicode="K" horiz-adv-x="1141" d="M86 0l309 1462h170l-151 -710l700 710h209l-639 -637l350 -825h-186q-72 181 -146.5 359.5t-146.5 361.5l-174 -131l-125 -590h-170z" /> +<glyph unicode="L" horiz-adv-x="971" d="M86 0l309 1462h170l-276 -1308h565l-33 -154h-735z" /> +<glyph unicode="M" horiz-adv-x="1714" d="M84 0l309 1462h244l149 -1204h9l659 1204h266l-303 -1462h-174q126 590 193 905.5t94 392.5h-6l-717 -1298h-131l-166 1296h-8q-7 -72 -28.5 -197.5t-37.5 -199.5l-190 -899h-162z" /> +<glyph unicode="N" horiz-adv-x="1438" d="M84 0l309 1462h180l459 -1220h6q30 224 72 405l174 815h164l-309 -1462h-181l-460 1223h-6q-32 -221 -74 -418l-172 -805h-162z" /> +<glyph unicode="O" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403q0 199 -94 310.5t-261 111.5q-157 0 -281 -101 t-192.5 -281t-68.5 -398z" /> +<glyph unicode="P" horiz-adv-x="1159" d="M86 0l309 1462h330q214 0 324 -94.5t110 -282.5q0 -248 -164 -379t-481 -131h-135l-123 -575h-170zM410 721h133q216 0 328 91t112 267q0 125 -69.5 180.5t-213.5 55.5h-163z" /> +<glyph unicode="Q" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -333 -139 -576t-375 -321l274 -358h-219l-227 330l-17 -2h-16q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q158 0 279 100t187.5 280.5t66.5 399.5q0 199 -94 310.5 t-261 111.5q-157 0 -281 -101t-192.5 -281t-68.5 -398z" /> +<glyph unicode="R" horiz-adv-x="1165" d="M86 0l309 1462h320q446 0 446 -366q0 -348 -368 -449l239 -647h-186l-209 608h-252l-129 -608h-170zM416 754h168q193 0 297 85t104 244q0 121 -67.5 175.5t-219.5 54.5h-166q-102 -494 -116 -559z" /> +<glyph unicode="S" horiz-adv-x="1028" d="M39 43v170q162 -84 340 -84q162 0 257 75.5t95 207.5q0 78 -52.5 137.5t-195.5 140.5q-151 85 -209.5 170t-58.5 201q0 187 132 304.5t347 117.5q99 0 184.5 -19t180.5 -65l-66 -150q-66 38 -148 60t-151 22q-134 0 -215.5 -69.5t-81.5 -188.5q0 -54 17 -92.5t54 -72.5 t142 -95q147 -88 198.5 -138t78 -110.5t26.5 -140.5q0 -211 -140.5 -327.5t-395.5 -116.5q-106 0 -186.5 14.5t-151.5 48.5z" /> +<glyph unicode="T" horiz-adv-x="1020" d="M186 1311l33 151h985l-30 -151h-408l-279 -1311h-172l277 1311h-406z" /> +<glyph unicode="U" horiz-adv-x="1384" d="M164 383q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299z" /> +<glyph unicode="V" horiz-adv-x="1122" d="M188 1462h170l97 -930q20 -196 20 -335h4q61 144 162 338l479 927h191l-781 -1462h-180z" /> +<glyph unicode="W" horiz-adv-x="1745" d="M223 1462h170l31 -901l2 -88q0 -98 -10 -258h6q89 243 156 383l405 864h178l43 -860q9 -153 9 -304l-1 -83h9q75 224 131 354l387 893h182l-664 -1462h-170l-49 965q-8 136 -8 282h-6q-25 -72 -61 -154.5t-504 -1092.5h-174z" /> +<glyph unicode="X" horiz-adv-x="1063" d="M-104 0l596 776l-263 686h172l203 -563l443 563h186l-555 -694l278 -768h-180l-213 641l-481 -641h-186z" /> +<glyph unicode="Y" horiz-adv-x="1030" d="M188 1462h170l179 -747l489 747h193l-627 -921l-113 -541h-172l119 549z" /> +<glyph unicode="Z" horiz-adv-x="1087" d="M-16 0l28 137l924 1170h-655l32 155h858l-26 -139l-924 -1169h697l-33 -154h-901z" /> +<glyph unicode="[" horiz-adv-x="586" d="M-16 -324l381 1786h387l-31 -141h-227l-318 -1503h227l-32 -142h-387z" /> +<glyph unicode="\" horiz-adv-x="717" d="M221 1462h154l217 -1462h-154z" /> +<glyph unicode="]" horiz-adv-x="586" d="M-150 -324l31 142h225l320 1503h-227l30 141h389l-380 -1786h-388z" /> +<glyph unicode="^" horiz-adv-x="1059" d="M53 553l598 920h109l266 -920h-145l-201 747l-467 -747h-160z" /> +<glyph unicode="_" horiz-adv-x="807" d="M-188 -324l30 140h811l-30 -140h-811z" /> +<glyph unicode="`" horiz-adv-x="1135" d="M575 1548v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" /> +<glyph unicode="a" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310z" /> +<glyph unicode="b" horiz-adv-x="1182" d="M59 0l330 1556h168q-51 -242 -78.5 -370.5t-75.5 -300.5h9q93 118 183.5 173.5t186.5 55.5q141 0 220 -99t79 -272q0 -209 -68.5 -386.5t-191 -277t-276.5 -99.5q-97 0 -170.5 51t-110.5 139h-10l-70 -170h-125zM319 346q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81 t137.5 230.5t52 317.5q0 227 -178 227q-96 0 -195.5 -95t-158 -239t-58.5 -295z" /> +<glyph unicode="c" horiz-adv-x="922" d="M98 389q0 200 74 369t204.5 263.5t293.5 94.5q137 0 268 -51l-47 -141q-120 51 -219 51q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -128 66.5 -199t183.5 -71q72 0 136 20t126 47v-143q-124 -63 -276 -63q-194 0 -301 107t-107 302z" /> +<glyph unicode="d" horiz-adv-x="1182" d="M98 350q0 214 72 392t194.5 275t274.5 97q194 0 281 -190h10q17 155 45 274l78 358h166l-330 -1556h-139l22 209h-8q-101 -125 -189 -177t-182 -52q-139 0 -217 98t-78 272zM270 346q0 -227 179 -227q94 0 194 93.5t158.5 239t58.5 296.5q0 111 -54 169t-157 58 q-101 0 -187.5 -82.5t-139 -232t-52.5 -314.5z" /> +<glyph unicode="e" horiz-adv-x="1010" d="M98 391q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5q-184 0 -289 109t-105 302zM299 618h12 q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35q-103 0 -193.5 -94t-138.5 -261z" /> +<glyph unicode="f" horiz-adv-x="641" d="M-229 -330q64 -22 112 -22q76 0 117 62t66 177l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h238l-25 -127h-237l-232 -1098q-39 -189 -120 -276 t-213 -87q-69 0 -125 21v141z" /> +<glyph unicode="g" horiz-adv-x="1026" d="M-127 -211q0 105 72 182t233 131q-78 41 -78 121q0 69 51 118.5t142 92.5q-63 32 -103 94.5t-40 145.5q0 194 119.5 318t305.5 124q78 0 154 -20h371l-25 -107l-211 -24q41 -62 41 -158q0 -191 -116.5 -304.5t-311.5 -113.5q-55 0 -84 8q-139 -53 -139 -131 q0 -41 33 -54.5t96 -21.5l117 -14q181 -22 262.5 -88t81.5 -194q0 -184 -146 -285t-411 -101q-194 0 -304 73.5t-110 207.5zM35 -195q0 -77 65 -122t193 -45q182 0 284.5 63.5t102.5 179.5q0 62 -54 98t-184 50l-159 16q-120 -25 -184 -88t-64 -152zM313 680 q0 -85 45 -129.5t125 -44.5q79 0 138 42t90.5 115.5t31.5 159.5q0 82 -44 125t-126 43q-78 0 -136.5 -40.5t-91 -113t-32.5 -157.5z" /> +<glyph unicode="h" horiz-adv-x="1182" d="M59 0l330 1556h168q-18 -82 -34.5 -159t-34 -156.5t-38 -166.5t-47.5 -189h11q94 123 185.5 176t191.5 53q131 0 202.5 -72t71.5 -204q0 -62 -23 -166q-39 -193 -145 -672h-168l148 692q18 94 18 135q0 148 -147 148q-89 0 -173.5 -59t-149 -171.5t-97.5 -271.5 l-101 -473h-168z" /> +<glyph unicode="i" horiz-adv-x="520" d="M59 0l234 1096h168l-234 -1096h-168zM340 1376q0 56 32 91.5t83 35.5q88 0 88 -90q0 -55 -33.5 -93t-77.5 -38q-40 0 -66 24.5t-26 69.5z" /> +<glyph unicode="j" horiz-adv-x="520" d="M-258 -330q61 -22 119 -22q125 0 168 205l264 1243h166l-266 -1258q-36 -171 -114.5 -250.5t-213.5 -79.5q-69 0 -123 21v141zM340 1376q0 56 32 91.5t83 35.5q86 0 86 -90q0 -55 -33.5 -93t-77.5 -38q-38 0 -64 24.5t-26 69.5z" /> +<glyph unicode="k" horiz-adv-x="999" d="M57 0l330 1556h170l-129 -602q-57 -266 -102 -395h4l526 537h201l-469 -467l295 -629h-187l-235 524l-152 -123l-82 -401h-170z" /> +<glyph unicode="l" horiz-adv-x="520" d="M57 0l332 1556h168l-332 -1556h-168z" /> +<glyph unicode="m" horiz-adv-x="1786" d="M59 0l234 1096h139l-22 -203h10q87 119 173.5 171t178.5 52q113 0 174 -65t72 -181h8q86 125 183 185.5t196 60.5q127 0 196.5 -68t69.5 -198q0 -68 -22 -178l-144 -672h-170l148 692q20 104 20 146q0 62 -34.5 99.5t-108.5 37.5q-81 0 -160 -58t-138.5 -164.5 t-90.5 -252.5l-107 -500h-168l148 692q18 94 18 135q0 70 -31 109t-106 39q-84 0 -163.5 -60t-140 -171.5t-93.5 -268.5l-101 -475h-168z" /> +<glyph unicode="n" horiz-adv-x="1182" d="M59 0l234 1096h139l-22 -203h10q96 122 185.5 172.5t185.5 50.5q127 0 200.5 -69.5t73.5 -194.5q0 -79 -23 -180l-143 -672h-170l148 692q20 104 20 144q0 63 -35.5 101t-113.5 38q-89 0 -173.5 -60t-149 -171t-97.5 -269l-101 -475h-168z" /> +<glyph unicode="o" horiz-adv-x="1149" d="M98 406q0 190 73 357.5t197 257t275 89.5q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309zM270 397q0 -131 63.5 -202.5t182.5 -71.5q104 0 187 73t129.5 207.5t46.5 307.5q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74 t-134 -205.5t-47.5 -292.5z" /> +<glyph unicode="p" horiz-adv-x="1182" d="M-43 -492l336 1588h139l-26 -209h8q179 227 372 227q137 0 216 -97.5t79 -273.5q0 -212 -69 -389t-191 -275.5t-276 -98.5q-97 0 -170 50t-113 140h-10l-4 -38q-3 -25 -10.5 -70t-114.5 -554h-166zM319 346q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81t137.5 230.5 t52 317.5q0 227 -178 227q-96 0 -195.5 -95t-158 -239t-58.5 -295z" /> +<glyph unicode="q" horiz-adv-x="1182" d="M98 350q0 212 72.5 392t196 277t274.5 97q94 0 165.5 -50.5t108.5 -141.5h13l67 172h125l-336 -1588h-166l101 480q9 45 57 221h-8q-95 -121 -185 -175t-186 -54q-140 0 -219.5 97.5t-79.5 272.5zM270 346q0 -227 179 -227q92 0 190 92t158.5 237t60.5 300 q0 105 -54.5 166t-152.5 61q-101 0 -189 -84.5t-140 -233t-52 -311.5z" /> +<glyph unicode="r" horiz-adv-x="811" d="M59 0l234 1096h139l-22 -203h10q72 95 119 136.5t98.5 64t114.5 22.5q69 0 120 -14l-36 -150q-53 13 -105 13q-91 0 -170.5 -60t-139 -166.5t-87.5 -236.5l-107 -502h-168z" /> +<glyph unicode="s" horiz-adv-x="877" d="M8 49v158q70 -42 151 -65t150 -23q126 0 190 50t64 128q0 57 -35 96t-151 107q-130 73 -184 143t-54 166q0 138 101 222.5t266 84.5q171 0 330 -74l-54 -137l-56 25q-101 43 -220 43q-93 0 -146 -43.5t-53 -112.5q0 -56 35.5 -96t146.5 -103q107 -60 153.5 -103 t69.5 -92.5t23 -111.5q0 -156 -110.5 -243.5t-311.5 -87.5q-169 0 -305 69z" /> +<glyph unicode="t" horiz-adv-x="664" d="M90 969l14 73l185 78l125 228h98l-55 -252h274l-26 -127h-273l-129 -604q-18 -87 -18 -132q0 -56 29 -86t81 -30q55 0 144 26v-129q-34 -14 -84 -24t-80 -10q-125 0 -191.5 59.5t-66.5 177.5q0 66 18 150l127 602h-172z" /> +<glyph unicode="u" horiz-adv-x="1182" d="M113 248q0 62 22 172l146 676h170l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5z" /> +<glyph unicode="v" horiz-adv-x="946" d="M98 1096h168l64 -613q24 -258 24 -362h6q127 275 179 371l325 604h178l-591 -1096h-228z" /> +<glyph unicode="w" horiz-adv-x="1468" d="M117 1096h164l18 -594v-88q0 -147 -8 -269h6q47 124 137 322l295 629h182l37 -594q6 -168 6 -262v-53l-2 -42h6q28 86 83 218.5t323 732.5h178l-506 -1096h-205l-32 602q-4 94 -4 172v156h-9l-50 -118l-83 -189l-291 -623h-202z" /> +<glyph unicode="x" horiz-adv-x="979" d="M-74 0l475 565l-239 531h170l174 -412l330 412h194l-455 -539l252 -557h-168l-192 434l-346 -434h-195z" /> +<glyph unicode="y" horiz-adv-x="946" d="M-197 -336q63 -18 131 -18q82 0 140.5 50.5t113.5 149.5l76 136l-166 1114h168l74 -545q10 -69 19.5 -203.5t9.5 -216.5h6q35 87 87 200t77 156l325 609h178l-696 -1282q-93 -172 -184 -239t-219 -67q-72 0 -140 21v135z" /> +<glyph unicode="z" horiz-adv-x="909" d="M-29 0l23 117l694 854h-479l27 125h657l-29 -140l-680 -831h531l-25 -125h-719z" /> +<glyph unicode="{" horiz-adv-x="715" d="M27 514l32 143q118 0 189.5 43.5t93.5 147.5l68 326q34 160 117.5 224t254.5 64h33l-31 -141q-105 0 -151 -36.5t-66 -123.5l-71 -321q-28 -123 -91 -184t-167 -78v-5q151 -41 151 -213q0 -59 -18 -131l-47 -211q-15 -58 -15 -98q0 -53 36.5 -77.5t119.5 -24.5v-142h-23 q-141 0 -216.5 52.5t-75.5 171.5q0 52 20 141q33 146 51.5 227.5t14.5 102.5q0 143 -209 143z" /> +<glyph unicode="|" d="M541 -496v2052h139v-2052h-139z" /> +<glyph unicode="}" horiz-adv-x="715" d="M-74 -182q115 0 167 36t71 123l72 322q25 117 88 179.5t170 80.5v6q-150 42 -150 211q0 59 18 131l50 213q14 65 14 99q0 53 -40.5 77.5t-139.5 24.5l28 141h11q144 0 220.5 -52.5t76.5 -170.5q0 -48 -21 -141l-49 -219q-16 -68 -16 -111q0 -143 209 -143l-33 -144 q-119 0 -190 -43t-93 -147l-67 -326q-36 -164 -119 -226.5t-264 -62.5h-13v142z" /> +<glyph unicode="~" d="M115 592v151q98 109 243 109q69 0 127 -14.5t144 -51.5q64 -27 112.5 -41t98.5 -14q55 0 119.5 33t115.5 88v-150q-100 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12q-54 0 -118.5 -34.5t-114.5 -86.5z" /> +<glyph unicode="&#xa2;" d="M225 590q0 185 63.5 344t178.5 258.5t260 120.5l35 170h123l-37 -168q119 -9 217 -49l-47 -142q-109 52 -219 52q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -125 66 -198t184 -73q72 0 136 20t126 48v-143q-123 -62 -286 -66l-41 -198h-125l43 215 q-132 34 -203.5 137.5t-71.5 257.5z" /> +<glyph unicode="&#xa3;" d="M-23 0l27 141q205 46 258 289l47 221h-200l26 127h201l76 350q75 353 430 353q184 0 336 -86l-66 -133q-146 79 -278 79q-213 0 -263 -237l-69 -326h370l-26 -127h-371l-47 -219q-22 -98 -66 -166.5t-124 -111.5h725l-33 -154h-953z" /> +<glyph unicode="&#xa5;" d="M127 266l29 133h290l33 160h-291l29 133h225l-202 770h163l179 -747l491 747h187l-533 -770h231l-28 -133h-297l-33 -160h297l-29 -133h-295l-57 -266h-154l56 266h-291z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M139 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5 q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM520 733q0 208 110 330.5t300 122.5q130 0 248 -60l-60 -120q-106 53 -190 53q-125 0 -191.5 -87t-66.5 -241q0 -169 65 -249.5t193 -80.5q82 0 211 43v-122q-66 -28 -113 -38 t-104 -10q-192 0 -297 119.5t-105 339.5z" /> +<glyph unicode="&#xad;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M139 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5 q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM645 291v880h229q163 0 241.5 -63t78.5 -193q0 -78 -47.5 -141t-132.5 -98l227 -385h-149l-207 352h-113v-352h-127zM772 762h92q195 0 195 149q0 76 -47.5 107t-149.5 31h-90v-287z " /> +<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M532 1241v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" /> +<glyph unicode="&#x2000;" horiz-adv-x="784" /> +<glyph unicode="&#x2001;" horiz-adv-x="1569" /> +<glyph unicode="&#x2002;" horiz-adv-x="784" /> +<glyph unicode="&#x2003;" horiz-adv-x="1569" /> +<glyph unicode="&#x2004;" horiz-adv-x="523" /> +<glyph unicode="&#x2005;" horiz-adv-x="392" /> +<glyph unicode="&#x2006;" horiz-adv-x="261" /> +<glyph unicode="&#x2007;" horiz-adv-x="261" /> +<glyph unicode="&#x2008;" horiz-adv-x="196" /> +<glyph unicode="&#x2009;" horiz-adv-x="313" /> +<glyph unicode="&#x200a;" horiz-adv-x="87" /> +<glyph unicode="&#x2010;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="&#x2011;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="&#x2012;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" /> +<glyph unicode="&#x2013;" horiz-adv-x="983" d="M55 469l35 160h823l-34 -160h-824z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M55 469l35 160h1806l-34 -160h-1807z" /> +<glyph unicode="&#x2018;" horiz-adv-x="348" d="M123 983q98 211 270 479h127q-147 -345 -203 -501h-188z" /> +<glyph unicode="&#x2019;" horiz-adv-x="348" d="M125 961q134 298 203 501h188l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129z" /> +<glyph unicode="&#x201c;" horiz-adv-x="719" d="M123 983q98 211 270 479h127q-147 -345 -203 -501h-188zM492 983q80 181 272 479h127q-162 -379 -203 -501h-188z" /> +<glyph unicode="&#x201d;" horiz-adv-x="719" d="M125 961q134 298 203 501h188l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129zM494 961q57 126 115.5 272.5t86.5 228.5h189l10 -22q-94 -206 -274 -479h-127z" /> +<glyph unicode="&#x2022;" horiz-adv-x="774" d="M199 684q0 145 73.5 231t198.5 86q92 0 139 -49t47 -141q0 -141 -74 -230t-202 -89q-89 0 -135.5 49.5t-46.5 142.5z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1563" d="M563 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM1085 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM43 74q0 77 40.5 122.5t111.5 45.5 q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" /> +<glyph unicode="&#x202f;" horiz-adv-x="313" /> +<glyph unicode="&#x205f;" horiz-adv-x="392" /> +<glyph unicode="&#x20ac;" d="M63 504l27 131h154q8 80 30 164h-151l27 133h159q97 267 259.5 408t369.5 141q89 0 160 -21.5t141 -70.5l-80 -138q-113 78 -231 78q-140 0 -254 -99t-189 -298h426l-26 -133h-441q-21 -65 -32 -164h381l-29 -131h-361q0 -373 297 -373q123 0 256 55v-147 q-127 -59 -278 -59q-212 0 -328.5 133.5t-116.5 378.5v12h-170z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M121 1358v104h516v-104h-199v-617h-121v617h-196zM705 741v721h180l182 -557l193 557h170v-721h-121v430q0 73 4 121h-6l-197 -551h-96l-189 551h-6q4 -52 4 -121v-430h-118z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.ttf new file mode 100644 index 000000000000..63f187e984b2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.woff new file mode 100644 index 000000000000..469a29bbfbcb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Italic-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.eot new file mode 100644 index 000000000000..837daab8df60 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.svg new file mode 100644 index 000000000000..bdb672653b99 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.svg @@ -0,0 +1,146 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansLight" horiz-adv-x="1169" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="492" d="M164 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM186 1462h119l-29 -1085h-61z" /> +<glyph unicode="&#x22;" horiz-adv-x="723" d="M133 1462h127l-33 -528h-61zM463 1462h127l-33 -528h-61z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M55 451v79h299l76 398h-297v80h311l86 454h91l-89 -454h365l88 454h86l-88 -454h285v-80h-301l-76 -398h303v-79h-320l-86 -451h-90l88 451h-360l-86 -451h-88l86 451h-283zM440 530h363l78 398h-363z" /> +<glyph unicode="$" d="M164 186v103q75 -36 179.5 -61t193.5 -25v508q-145 44 -215 88t-102 104t-32 146q0 124 94.5 208.5t254.5 104.5v192h81v-190q197 -9 351 -72l-33 -90q-141 62 -318 72v-486q213 -66 293 -144t80 -204q0 -133 -99 -217t-274 -106v-236h-81v232q-92 2 -200.5 22.5 t-172.5 50.5zM297 1049q0 -86 57 -141t183 -93v453q-119 -16 -179.5 -76t-60.5 -143zM618 209q122 13 192.5 75t70.5 160q0 85 -63 140.5t-200 95.5v-471z" /> +<glyph unicode="%" horiz-adv-x="1653" d="M113 1026q0 223 72 340t212 117q139 0 215 -120.5t76 -336.5q0 -226 -75 -343.5t-216 -117.5q-133 0 -208.5 120.5t-75.5 340.5zM211 1026q0 -186 45 -279.5t141 -93.5q193 0 193 373q0 184 -49.5 276.5t-143.5 92.5q-96 0 -141 -92.5t-45 -276.5zM373 0l811 1462h96 l-811 -1462h-96zM965 438q0 225 73.5 341t212.5 116q137 0 213 -120t76 -337q0 -226 -74 -343.5t-215 -117.5q-136 0 -211 121.5t-75 339.5zM1063 438q0 -185 45 -277.5t141 -92.5q193 0 193 370q0 369 -193 369q-96 0 -141 -91.5t-45 -277.5z" /> +<glyph unicode="&#x26;" horiz-adv-x="1460" d="M123 371q0 138 73.5 235t274.5 205l-75 82q-66 71 -98 139t-32 142q0 143 95.5 227t256.5 84q155 0 245.5 -81t90.5 -224q0 -105 -70 -192.5t-253 -194.5l452 -457q61 72 104 157t75 201h96q-63 -246 -209 -426l266 -268h-135l-193 197q-92 -90 -164 -131.5t-157.5 -63.5 t-194.5 -22q-209 0 -328.5 103t-119.5 288zM227 375q0 -143 93 -224t258 -81q128 0 234.5 43.5t209.5 146.5l-483 485q-136 -72 -196.5 -122.5t-88 -109.5t-27.5 -138zM373 1176q0 -79 40 -146t152 -174q159 85 221 159t62 169q0 94 -62 152.5t-168 58.5q-114 0 -179.5 -58 t-65.5 -161z" /> +<glyph unicode="'" horiz-adv-x="393" d="M133 1462h127l-33 -528h-61z" /> +<glyph unicode="(" horiz-adv-x="557" d="M82 561q0 265 77.5 496t223.5 405h113q-148 -182 -227 -412.5t-79 -486.5q0 -483 304 -887h-111q-147 170 -224 397t-77 488z" /> +<glyph unicode=")" horiz-adv-x="557" d="M61 1462h113q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-111q304 404 304 887q0 257 -79 487.5t-227 411.5z" /> +<glyph unicode="*" horiz-adv-x="1128" d="M104 1124l19 131l401 -104l-39 405h146l-37 -405l405 104l21 -131l-395 -39l247 -340l-124 -71l-191 379l-180 -379l-125 71l242 340z" /> +<glyph unicode="+" d="M111 682v82h432v434h82v-434h434v-82h-434v-432h-82v432h-432z" /> +<glyph unicode="," horiz-adv-x="440" d="M68 -264q77 275 110 502h117l12 -21q-75 -265 -174 -481h-65z" /> +<glyph unicode="-" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" /> +<glyph unicode="." horiz-adv-x="487" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" /> +<glyph unicode="/" horiz-adv-x="698" d="M25 0l544 1462h105l-545 -1462h-104z" /> +<glyph unicode="0" d="M115 735q0 382 115.5 566t351.5 184q231 0 352 -190.5t121 -559.5q0 -385 -117.5 -570t-355.5 -185q-229 0 -348 190.5t-119 564.5zM223 735q0 -340 89 -502.5t270 -162.5q189 0 275.5 168t86.5 497q0 324 -86.5 492t-275.5 168t-274 -168t-85 -492z" /> +<glyph unicode="1" d="M199 1165l397 297h86v-1462h-98v1065q0 145 12 301q-15 -15 -31 -29t-309 -243z" /> +<glyph unicode="2" d="M113 0v88l389 406q164 170 230 260t97 172t31 172q0 131 -86 213t-223 82q-183 0 -350 -133l-54 69q183 154 406 154q191 0 300.5 -102t109.5 -281q0 -145 -73.5 -280.5t-268.5 -334.5l-375 -385v-4h782v-96h-915z" /> +<glyph unicode="3" d="M94 63v99q84 -44 188.5 -69t196.5 -25q221 0 332 89.5t111 252.5q0 145 -113.5 223t-333.5 78h-158v96h160q182 0 288.5 86.5t106.5 234.5q0 122 -86.5 195.5t-226.5 73.5q-109 0 -199 -30.5t-202 -104.5l-49 67q85 71 205 112.5t243 41.5q202 0 312 -95.5t110 -269.5 q0 -136 -85.5 -229t-229.5 -119v-6q176 -22 268 -112t92 -242q0 -205 -139.5 -317.5t-401.5 -112.5q-223 0 -389 83z" /> +<glyph unicode="4" d="M43 373v67l725 1030h121v-1011h252v-86h-252v-373h-94v373h-752zM162 459h633v418q0 302 14 507h-8q-20 -37 -123 -188z" /> +<glyph unicode="5" d="M143 63v103q108 -55 192 -76.5t179 -21.5q192 0 308 101.5t116 274.5q0 163 -113 256t-307 93q-130 0 -272 -39l-60 39l58 669h704v-96h-610l-45 -516q156 29 244 29q234 0 368.5 -113t134.5 -311q0 -225 -140 -350t-386 -125q-109 0 -207 21.5t-164 61.5z" /> +<glyph unicode="6" d="M131 623q0 285 77.5 479.5t220 288.5t343.5 94q94 0 172 -23v-88q-73 27 -176 27q-247 0 -384.5 -178t-154.5 -518h13q76 98 174 148t207 50q205 0 320.5 -117t115.5 -323q0 -224 -121.5 -353.5t-327.5 -129.5q-222 0 -350.5 169.5t-128.5 473.5zM240 504 q0 -111 49.5 -213.5t134 -162.5t186.5 -60q164 0 255 103t91 294q0 168 -90 262t-245 94q-102 0 -189.5 -45t-139.5 -119.5t-52 -152.5z" /> +<glyph unicode="7" d="M109 1366v96h946v-73l-604 -1389h-117l602 1366h-827z" /> +<glyph unicode="8" d="M121 375q0 131 83 230t257 169q-161 76 -227 160.5t-66 202.5q0 105 53 184.5t148.5 122.5t212.5 43q186 0 299.5 -95t113.5 -257q0 -112 -70.5 -198t-228.5 -159q192 -79 270 -173t78 -228q0 -181 -126.5 -289t-339.5 -108q-221 0 -339 101t-118 294zM223 360 q0 -138 93.5 -214t261.5 -76q164 0 264 80.5t100 218.5q0 124 -78.5 201.5t-302.5 162.5q-184 -71 -261 -157t-77 -216zM268 1137q0 -70 31.5 -123.5t91 -97t199.5 -101.5q163 63 234 139t71 183q0 120 -84.5 190t-230.5 70q-141 0 -226.5 -69.5t-85.5 -190.5z" /> +<glyph unicode="9" d="M111 993q0 220 124.5 356t323.5 136q144 0 252 -75.5t166.5 -221.5t58.5 -346q0 -288 -75.5 -482t-220 -287t-349.5 -93q-104 0 -192 26v86q43 -14 103.5 -21.5t92.5 -7.5q247 0 387 178.5t156 520.5h-12q-73 -96 -174 -147.5t-211 -51.5q-203 0 -316.5 112t-113.5 318z M213 999q0 -174 87 -264t249 -90q101 0 188.5 45t139 119.5t51.5 151.5q0 117 -46.5 219t-130 159.5t-192.5 57.5q-158 0 -252 -106.5t-94 -291.5z" /> +<glyph unicode=":" horiz-adv-x="487" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM162 971q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" /> +<glyph unicode=";" horiz-adv-x="487" d="M76 -264q29 97 62 245.5t48 256.5h117l12 -21q-75 -265 -174 -481h-65zM162 971q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" /> +<glyph unicode="&#x3c;" d="M111 682v61l948 474v-95l-823 -405l823 -355v-96z" /> +<glyph unicode="=" d="M111 477v82h948v-82h-948zM111 885v82h948v-82h-948z" /> +<glyph unicode="&#x3e;" d="M111 266v96l823 355l-823 405v95l948 -474v-61z" /> +<glyph unicode="?" horiz-adv-x="862" d="M57 1403q110 48 184.5 64t153.5 16q183 0 288 -98.5t105 -270.5q0 -68 -18 -119t-50.5 -94.5t-78.5 -84t-102 -87.5q-64 -54 -98.5 -98.5t-50 -93.5t-15.5 -146v-14h-82v37q0 123 37.5 201t138.5 167l91 79q72 61 103 121t31 138q0 127 -83.5 202t-219.5 75 q-79 0 -148 -17.5t-149 -56.5zM260 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" /> +<glyph unicode="@" horiz-adv-x="1815" d="M113 561q0 256 108.5 460.5t307 317.5t448.5 113q215 0 380.5 -89t255 -254.5t89.5 -383.5q0 -228 -90.5 -366t-245.5 -138q-89 0 -144.5 54t-64.5 147h-4q-43 -100 -124 -150.5t-189 -50.5q-148 0 -229 96.5t-81 270.5q0 202 120.5 330.5t314.5 128.5q138 0 286 -41 l-22 -464v-30q0 -104 35 -156.5t116 -52.5q103 0 168.5 116.5t65.5 303.5q0 194 -79 340t-225.5 224.5t-334.5 78.5q-230 0 -405.5 -99.5t-270 -281.5t-94.5 -418q0 -322 167 -497.5t474 -175.5q93 0 188.5 18t231.5 70v-99q-203 -80 -414 -80q-349 0 -544 200.5t-195 557.5 zM633 590q0 -143 55 -215t174 -72q255 0 273 346l16 291q-79 27 -193 27q-149 0 -237 -102.5t-88 -274.5z" /> +<glyph unicode="A" horiz-adv-x="1229" d="M0 0l588 1468h65l576 -1468h-115l-203 516h-594l-204 -516h-113zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174z" /> +<glyph unicode="B" horiz-adv-x="1284" d="M207 0v1462h401q271 0 398 -92t127 -278q0 -127 -77.5 -211.5t-226.5 -108.5v-6q175 -26 257.5 -110.5t82.5 -235.5q0 -202 -134 -311t-380 -109h-448zM309 90h344q406 0 406 330q0 301 -428 301h-322v-631zM309 811h322q206 0 299.5 68.5t93.5 214.5t-105.5 212 t-314.5 66h-295v-561z" /> +<glyph unicode="C" horiz-adv-x="1272" d="M129 735q0 223 84.5 393t243 262.5t368.5 92.5q214 0 383 -80l-41 -92q-160 80 -336 80q-275 0 -433 -176t-158 -482q0 -313 149 -486t426 -173q184 0 338 47v-90q-145 -51 -362 -51q-308 0 -485 199t-177 556z" /> +<glyph unicode="D" horiz-adv-x="1446" d="M207 0v1462h395q350 0 532.5 -183t182.5 -534q0 -368 -193 -556.5t-567 -188.5h-350zM309 90h242q655 0 655 651q0 314 -159.5 472.5t-468.5 158.5h-269v-1282z" /> +<glyph unicode="E" horiz-adv-x="1130" d="M207 0v1462h799v-94h-697v-553h658v-94h-658v-627h697v-94h-799z" /> +<glyph unicode="F" horiz-adv-x="1028" d="M207 0v1462h801v-94h-699v-620h660v-95h-660v-653h-102z" /> +<glyph unicode="G" horiz-adv-x="1481" d="M129 729q0 223 91.5 395.5t262 266.5t391.5 94q239 0 429 -88l-41 -92q-190 88 -394 88q-289 0 -458.5 -178.5t-169.5 -481.5q0 -330 161 -496.5t473 -166.5q202 0 343 57v514h-435v96h539v-667q-212 -90 -477 -90q-346 0 -530.5 195.5t-184.5 553.5z" /> +<glyph unicode="H" horiz-adv-x="1473" d="M207 0v1462h102v-649h854v649h103v-1462h-103v719h-854v-719h-102z" /> +<glyph unicode="I" horiz-adv-x="516" d="M207 0v1462h102v-1462h-102z" /> +<glyph unicode="J" horiz-adv-x="506" d="M-184 -254q78 -20 149 -20q242 0 242 264v1472h102v-1462q0 -369 -342 -369q-92 0 -151 27v88z" /> +<glyph unicode="K" horiz-adv-x="1190" d="M207 0v1462h102v-760l162 162l573 598h130l-599 -618l615 -844h-125l-561 772l-195 -172v-600h-102z" /> +<glyph unicode="L" horiz-adv-x="1051" d="M207 0v1462h102v-1366h697v-96h-799z" /> +<glyph unicode="M" horiz-adv-x="1767" d="M207 0v1462h158l518 -1286h6l518 1286h154v-1462h-103v1108q0 116 12 240h-8l-547 -1348h-65l-545 1350h-8q8 -124 8 -254v-1096h-98z" /> +<glyph unicode="N" horiz-adv-x="1477" d="M207 0v1462h102l865 -1296h6q-9 180 -9 342v954h99v-1462h-103l-866 1298h-8q12 -232 12 -350v-948h-98z" /> +<glyph unicode="O" horiz-adv-x="1565" d="M129 735q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5q0 -348 -174 -550.5t-480 -202.5q-305 0 -479 202.5t-174 552.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5t-401.5 168.5q-261 0 -402.5 -170 t-141.5 -483z" /> +<glyph unicode="P" horiz-adv-x="1198" d="M207 0v1462h358q522 0 522 -420q0 -212 -144 -325t-408 -113h-226v-604h-102zM309 692h201q247 0 357 81.5t110 264.5q0 169 -104 250.5t-322 81.5h-242v-678z" /> +<glyph unicode="Q" horiz-adv-x="1565" d="M129 735q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5q0 -294 -126 -486.5t-349 -246.5l333 -348h-166l-282 330l-33 -2h-31q-305 0 -479 202.5t-174 552.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5 t-401.5 168.5q-261 0 -402.5 -170t-141.5 -483z" /> +<glyph unicode="R" horiz-adv-x="1217" d="M207 0v1462h348q272 0 402 -100.5t130 -302.5q0 -147 -77.5 -248t-235.5 -145l397 -666h-122l-377 637h-363v-637h-102zM309 725h279q185 0 287 82.5t102 243.5q0 167 -100 243t-326 76h-242v-645z" /> +<glyph unicode="S" horiz-adv-x="1116" d="M111 39v102q158 -67 403 -67q180 0 285.5 82.5t105.5 216.5q0 83 -35 137.5t-114 99.5t-232 97q-224 77 -309.5 166.5t-85.5 238.5q0 164 128.5 267.5t330.5 103.5q206 0 387 -78l-37 -88q-182 76 -348 76q-162 0 -258 -75t-96 -204q0 -81 29.5 -133t96.5 -93.5 t230 -99.5q171 -59 257 -114.5t125.5 -126t39.5 -170.5q0 -183 -134.5 -290t-357.5 -107q-268 0 -411 59z" /> +<glyph unicode="T" horiz-adv-x="1073" d="M10 1366v96h1053v-96h-475v-1366h-103v1366h-475z" /> +<glyph unicode="U" horiz-adv-x="1473" d="M190 520v942h103v-946q0 -211 117 -328.5t331 -117.5q209 0 324 115.5t115 320.5v956h102v-946q0 -252 -146 -394t-407 -142q-254 0 -396.5 142.5t-142.5 397.5z" /> +<glyph unicode="V" horiz-adv-x="1182" d="M0 1462h109l368 -995q84 -225 113 -338q20 75 79 233l402 1100h111l-547 -1462h-90z" /> +<glyph unicode="W" horiz-adv-x="1827" d="M51 1462h107l256 -942q15 -57 28 -105.5t23.5 -91t19 -82t15.5 -79.5q24 136 102 413l250 887h113l293 -1018q51 -176 73 -284q13 72 33.5 153t308.5 1149h103l-404 -1462h-84l-321 1128q-40 139 -60 228q-16 -87 -45.5 -200t-322.5 -1156h-86z" /> +<glyph unicode="X" horiz-adv-x="1102" d="M0 0l492 762l-447 700h115l395 -626l401 626h109l-453 -698l490 -764h-117l-432 682l-440 -682h-113z" /> +<glyph unicode="Y" horiz-adv-x="1081" d="M0 1462h117l426 -800l428 800h110l-487 -897v-565h-105v557z" /> +<glyph unicode="Z" horiz-adv-x="1180" d="M82 0v76l856 1290h-817v96h954v-76l-858 -1290h881v-96h-1016z" /> +<glyph unicode="[" horiz-adv-x="653" d="M174 -324v1786h428v-94h-330v-1597h330v-95h-428z" /> +<glyph unicode="\" horiz-adv-x="698" d="M25 1462h102l547 -1462h-103z" /> +<glyph unicode="]" horiz-adv-x="653" d="M51 -229h330v1597h-330v94h428v-1786h-428v95z" /> +<glyph unicode="^" d="M88 561l465 912h68l460 -912h-100l-395 791l-398 -791h-100z" /> +<glyph unicode="_" horiz-adv-x="842" d="M-4 -184h850v-82h-850v82z" /> +<glyph unicode="`" horiz-adv-x="1182" d="M393 1552v17h142q26 -48 98.5 -142t142.5 -170v-16h-69q-96 79 -188.5 171.5t-125.5 139.5z" /> +<glyph unicode="a" horiz-adv-x="1085" d="M98 289q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227zM203 285q0 -102 62.5 -158.5t176.5 -56.5 q174 0 274.5 99.5t100.5 276.5v107l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5z" /> +<glyph unicode="b" horiz-adv-x="1219" d="M182 0v1556h99v-391q0 -88 -4 -162l-3 -85h7q62 98 149.5 144t210.5 46q228 0 343.5 -143.5t115.5 -419.5q0 -271 -121.5 -418t-341.5 -147q-116 0 -209 48t-147 136h-9l-28 -164h-62zM281 528q0 -246 86.5 -353t269.5 -107q178 0 268 124.5t90 354.5q0 471 -356 471 q-192 0 -275 -110t-83 -363v-17z" /> +<glyph unicode="c" horiz-adv-x="973" d="M119 537q0 270 137 420.5t375 150.5q141 0 270 -49l-27 -88q-141 47 -245 47q-200 0 -303 -123.5t-103 -355.5q0 -220 103 -344.5t288 -124.5q148 0 275 53v-92q-104 -51 -273 -51q-233 0 -365 147t-132 410z" /> +<glyph unicode="d" horiz-adv-x="1219" d="M119 528q0 282 118 431t343 149q118 0 204 -43t154 -147h6q-6 126 -6 247v391h98v-1556h-65l-25 166h-8q-124 -186 -356 -186q-225 0 -344 140t-119 408zM223 530q0 -462 359 -462q184 0 270 107t86 353v17q0 252 -84.5 362.5t-273.5 110.5q-178 0 -267.5 -125 t-89.5 -363z" /> +<glyph unicode="e" horiz-adv-x="1124" d="M119 535q0 260 128 416.5t345 156.5q192 0 303 -134t111 -364v-80h-783q2 -224 104.5 -342t293.5 -118q93 0 163.5 13t178.5 56v-90q-92 -40 -170 -54.5t-172 -14.5q-237 0 -369.5 146t-132.5 409zM229 618h672q0 189 -82 295.5t-227 106.5q-157 0 -252 -103.5 t-111 -298.5z" /> +<glyph unicode="f" horiz-adv-x="614" d="M29 1001v58l202 37v84q0 200 73.5 293.5t240.5 93.5q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86h-256v-1001h-99v1001h-202z" /> +<glyph unicode="g" horiz-adv-x="1071" d="M45 -193q0 112 69.5 186t188.5 101q-49 21 -78.5 59.5t-29.5 88.5q0 109 139 192q-95 39 -148 122.5t-53 191.5q0 163 103.5 261.5t279.5 98.5q107 0 166 -21h348v-69l-225 -14q90 -112 90 -246q0 -157 -104.5 -254.5t-280.5 -97.5q-74 0 -104 6q-59 -31 -90 -73t-31 -89 q0 -52 39.5 -76t132.5 -24h190q177 0 271 -71.5t94 -211.5q0 -172 -139.5 -265.5t-397.5 -93.5q-205 0 -317.5 79t-112.5 220zM150 -184q0 -224 333 -224q428 0 428 273q0 98 -67 142t-217 44h-178q-299 0 -299 -235zM233 748q0 -126 76.5 -195.5t204.5 -69.5 q136 0 208.5 69t72.5 200q0 139 -74.5 208.5t-208.5 69.5q-130 0 -204.5 -74.5t-74.5 -207.5z" /> +<glyph unicode="h" horiz-adv-x="1208" d="M182 0v1556h99v-495l-5 -139h7q61 98 154 142t231 44q370 0 370 -397v-711h-98v705q0 164 -69 238.5t-214 74.5q-195 0 -285.5 -98.5t-90.5 -319.5v-600h-99z" /> +<glyph unicode="i" horiz-adv-x="463" d="M168 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71t-48.5 -26q-63 0 -63 97zM182 0v1087h99v-1087h-99z" /> +<glyph unicode="j" horiz-adv-x="463" d="M-98 -381q69 -20 129 -20q151 0 151 176v1312h99v-1298q0 -135 -63.5 -208t-180.5 -73q-80 0 -135 25v86zM168 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71t-48.5 -26q-63 0 -63 97z" /> +<glyph unicode="k" horiz-adv-x="991" d="M182 0v1556h99v-780l-7 -299h5l555 610h120l-428 -464l465 -623h-119l-413 549l-178 -162v-387h-99z" /> +<glyph unicode="l" horiz-adv-x="463" d="M182 0v1556h99v-1556h-99z" /> +<glyph unicode="m" horiz-adv-x="1808" d="M182 0v1087h82l21 -149h6q45 81 128 125.5t183 44.5q257 0 330 -193h4q53 93 142.5 143t203.5 50q178 0 267 -95t89 -302v-711h-98v713q0 159 -62 232t-190 73q-167 0 -247 -92t-80 -289v-637h-101v743q0 275 -252 275q-171 0 -249 -99.5t-78 -318.5v-600h-99z" /> +<glyph unicode="n" horiz-adv-x="1208" d="M182 0v1087h84l19 -149h6q106 170 377 170q370 0 370 -397v-711h-98v705q0 164 -69 238.5t-214 74.5q-195 0 -285.5 -98.5t-90.5 -319.5v-600h-99z" /> +<glyph unicode="o" horiz-adv-x="1200" d="M119 545q0 266 129 414.5t354 148.5q224 0 351.5 -150.5t127.5 -412.5q0 -266 -129 -415.5t-356 -149.5q-143 0 -252 69t-167 198t-58 298zM223 545q0 -224 98.5 -349.5t278.5 -125.5t278.5 125.5t98.5 349.5q0 225 -99.5 349t-279.5 124t-277.5 -123.5t-97.5 -349.5z " /> +<glyph unicode="p" horiz-adv-x="1219" d="M182 -492v1579h84l19 -155h6q112 176 358 176q220 0 335.5 -144.5t115.5 -420.5q0 -268 -121.5 -415.5t-331.5 -147.5q-251 0 -366 188h-7l3 -84q4 -74 4 -162v-414h-99zM281 541q0 -255 85.5 -364t278.5 -109q167 0 258.5 124t91.5 347q0 479 -346 479 q-190 0 -279 -104.5t-89 -340.5v-32z" /> +<glyph unicode="q" horiz-adv-x="1219" d="M119 532q0 275 118 425.5t338 150.5q236 0 353 -174h6l18 153h84v-1579h-98v414q0 122 6 248h-6q-118 -190 -369 -190q-214 0 -332 142t-118 410zM223 530q0 -229 89.5 -345.5t258.5 -116.5q198 0 282.5 109t84.5 366v12q0 245 -85 354t-271 109q-176 0 -267.5 -124 t-91.5 -364z" /> +<glyph unicode="r" horiz-adv-x="797" d="M182 0v1087h84l10 -196h7q67 120 143 168.5t184 48.5q69 0 148 -14l-19 -95q-68 17 -141 17q-139 0 -228 -118t-89 -298v-600h-99z" /> +<glyph unicode="s" horiz-adv-x="954" d="M84 47v107q164 -82 346 -82q161 0 244.5 53.5t83.5 142.5q0 82 -66.5 138t-218.5 110q-163 59 -229 101.5t-99.5 96t-33.5 130.5q0 122 102.5 193t286.5 71q176 0 334 -66l-37 -90q-160 66 -297 66q-133 0 -211 -44t-78 -122q0 -85 60.5 -136t236.5 -114 q147 -53 214 -95.5t100.5 -96.5t33.5 -127q0 -146 -111 -224.5t-315 -78.5q-218 0 -346 67z" /> +<glyph unicode="t" horiz-adv-x="686" d="M25 1001v58l161 45l50 246h51v-263h319v-86h-319v-688q0 -125 44 -185t138 -60t164 16v-80q-72 -24 -166 -24q-144 0 -212.5 77t-68.5 242v702h-161z" /> +<glyph unicode="u" horiz-adv-x="1208" d="M170 377v710h98v-704q0 -164 69 -238.5t214 -74.5q194 0 285.5 98t91.5 319v600h98v-1087h-84l-18 150h-6q-106 -170 -377 -170q-371 0 -371 397z" /> +<glyph unicode="v" horiz-adv-x="940" d="M0 1087h102l281 -739q56 -142 84 -248h6q41 136 84 250l281 737h102l-420 -1087h-100z" /> +<glyph unicode="w" horiz-adv-x="1481" d="M31 1087h106l174 -630q61 -234 80 -344h6q59 234 86 311l224 663h90l213 -661q72 -235 88 -311h6q8 65 80 348l166 624h100l-295 -1087h-104l-238 727q-23 74 -59 217h-6l-21 -74l-45 -145l-242 -725h-98z" /> +<glyph unicode="x" horiz-adv-x="1020" d="M55 0l394 559l-379 528h114l324 -458l321 458h109l-373 -528l400 -559h-115l-342 485l-344 -485h-109z" /> +<glyph unicode="y" horiz-adv-x="940" d="M0 1087h102l230 -610q105 -281 133 -379h6q42 129 137 385l230 604h102l-487 -1263q-59 -154 -99 -208t-93.5 -81t-129.5 -27q-57 0 -127 21v86q58 -16 125 -16q51 0 90 24t70.5 74.5t73 160t53.5 142.5z" /> +<glyph unicode="z" horiz-adv-x="944" d="M82 0v63l645 936h-598v88h727v-63l-649 -936h651v-88h-776z" /> +<glyph unicode="{" horiz-adv-x="723" d="M61 528v80q122 2 176 51t54 148v350q0 299 360 305v-90q-138 -5 -200 -58t-62 -157v-305q0 -130 -44 -194t-142 -85v-8q97 -20 141.5 -83.5t44.5 -186.5v-322q0 -102 59.5 -152.5t202.5 -53.5v-91q-195 0 -277.5 75t-82.5 231v337q0 205 -230 209z" /> +<glyph unicode="|" horiz-adv-x="1108" d="M508 -506v2067h92v-2067h-92z" /> +<glyph unicode="}" horiz-adv-x="723" d="M72 -233q141 2 201.5 52.5t60.5 153.5v322q0 123 44.5 186.5t141.5 83.5v8q-97 20 -141.5 84t-44.5 195v305q0 103 -61.5 156.5t-200.5 58.5v90q174 0 267 -77.5t93 -227.5v-350q0 -100 54.5 -148.5t175.5 -50.5v-80q-230 -4 -230 -209v-337q0 -155 -82.5 -230.5 t-277.5 -75.5v91z" /> +<glyph unicode="~" d="M111 625v94q108 110 233 110q61 0 115 -13.5t155 -57.5q126 -58 220 -58q56 0 109.5 30.5t115.5 94.5v-96q-48 -49 -104.5 -81t-129.5 -32q-116 0 -270 72q-124 57 -221 57q-49 0 -108 -30.5t-115 -89.5z" /> +<glyph unicode="&#xa2;" d="M211 745q0 232 102.5 381.5t288.5 182.5v174h82v-166h14q131 0 275 -55l-31 -84q-134 51 -237 51q-187 0 -288.5 -122.5t-101.5 -358.5q0 -225 100.5 -349.5t280.5 -124.5q131 0 267 58v-92q-110 -56 -267 -56h-12v-204h-82v210q-186 30 -288.5 175t-102.5 380z" /> +<glyph unicode="&#xa3;" d="M78 0v84q110 21 171.5 110t61.5 224v258h-211v82h211v297q0 204 98 315t281 111q175 0 330 -68l-35 -86q-157 66 -295 66q-141 0 -209.5 -81t-68.5 -253v-301h411v-82h-411v-256q0 -116 -35 -196t-113 -128h809v-96h-995z" /> +<glyph unicode="&#xa5;" d="M43 1462h117l426 -796l428 796h110l-432 -788h283v-82h-338v-205h338v-82h-338v-305h-105v305h-337v82h337v205h-337v82h278z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM193 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89t329.5 88.5t240.5 240.5t89 330q0 174 -85.5 325 t-239 243t-334.5 92q-176 0 -328.5 -88.5t-241.5 -242.5t-89 -329zM489 725q0 208 111 332.5t297 124.5q119 0 227 -52l-37 -83q-98 45 -190 45q-142 0 -222.5 -94.5t-80.5 -264.5q0 -186 74.5 -275t220.5 -89q84 0 198 43v-88q-102 -45 -208 -45q-187 0 -288.5 115 t-101.5 331z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM193 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89t329.5 88.5t240.5 240.5t89 330q0 174 -85.5 325 t-239 243t-334.5 92q-176 0 -328.5 -88.5t-241.5 -242.5t-89 -329zM608 291v880h211q143 0 222 -62t79 -191q0 -79 -38.5 -139.5t-110.5 -94.5l237 -393h-121l-210 360h-168v-360h-101zM709 731h112q91 0 143 46.5t52 135.5q0 172 -197 172h-110v-354z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1182" d="M393 1241v16q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70z" /> +<glyph unicode="&#x2000;" horiz-adv-x="784" /> +<glyph unicode="&#x2001;" horiz-adv-x="1569" /> +<glyph unicode="&#x2002;" horiz-adv-x="784" /> +<glyph unicode="&#x2003;" horiz-adv-x="1569" /> +<glyph unicode="&#x2004;" horiz-adv-x="523" /> +<glyph unicode="&#x2005;" horiz-adv-x="392" /> +<glyph unicode="&#x2006;" horiz-adv-x="261" /> +<glyph unicode="&#x2007;" horiz-adv-x="261" /> +<glyph unicode="&#x2008;" horiz-adv-x="196" /> +<glyph unicode="&#x2009;" horiz-adv-x="313" /> +<glyph unicode="&#x200a;" horiz-adv-x="87" /> +<glyph unicode="&#x2010;" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" /> +<glyph unicode="&#x2011;" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" /> +<glyph unicode="&#x2012;" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 512v82h860v-82h-860z" /> +<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 512v82h1884v-82h-1884z" /> +<glyph unicode="&#x2018;" horiz-adv-x="297" d="M29 981q32 112 81.5 251t92.5 230h65q-30 -101 -64.5 -257t-45.5 -244h-117z" /> +<glyph unicode="&#x2019;" horiz-adv-x="297" d="M29 961q29 96 61 241.5t49 259.5h117l12 -20q-75 -265 -174 -481h-65z" /> +<glyph unicode="&#x201c;" horiz-adv-x="614" d="M29 981q32 112 81.5 251t92.5 230h65q-30 -101 -64.5 -257t-45.5 -244h-117zM346 981q34 120 83 255t91 226h66q-30 -98 -63 -248.5t-48 -252.5h-117z" /> +<glyph unicode="&#x201d;" horiz-adv-x="614" d="M29 961q29 96 61 241.5t49 259.5h117l12 -20q-75 -265 -174 -481h-65zM346 961q30 98 63 248.5t48 252.5h116l13 -20q-36 -128 -85 -261t-89 -220h-66z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M231 748q0 89 40.5 134.5t113.5 45.5t113.5 -47t40.5 -133q0 -85 -41 -133t-113 -48t-113 47t-41 134z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1466" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM651 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM1141 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" /> +<glyph unicode="&#x202f;" horiz-adv-x="313" /> +<glyph unicode="&#x205f;" horiz-adv-x="392" /> +<glyph unicode="&#x20ac;" d="M74 528v82h172q-4 38 -4 113l4 102h-172v82h184q39 272 183 425t362 153q88 0 161 -17t148 -57l-39 -86q-132 72 -270 72q-174 0 -288 -125.5t-155 -364.5h502v-82h-510l-4 -104v-24q0 -65 4 -87h449v-82h-443q30 -217 147.5 -338.5t301.5 -121.5q148 0 287 65v-94 q-81 -34 -150.5 -46.5t-140.5 -12.5q-228 0 -367.5 140t-181.5 408h-180z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1485" d="M10 1384v78h522v-78h-219v-643h-86v643h-217zM608 741v721h125l221 -606l224 606h125v-721h-86v398l4 207h-7l-227 -605h-74l-221 609h-6l4 -201v-408h-82z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.ttf new file mode 100644 index 000000000000..b50ef9dcb5bc Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.woff new file mode 100644 index 000000000000..99514d1a8ab4 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Light-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.eot new file mode 100644 index 000000000000..f0ebf2c0ef82 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.svg new file mode 100644 index 000000000000..60765da83728 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.svg @@ -0,0 +1,146 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansLightItalic" horiz-adv-x="1128" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="502" d="M80 57q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-68 -34.5q-67 0 -67 73zM186 377l203 1085h119l-260 -1085h-62z" /> +<glyph unicode="&#x22;" horiz-adv-x="721" d="M248 934l80 528h127l-146 -528h-61zM578 934l79 528h127l-145 -528h-61z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M82 451l8 79h299l119 398h-297l8 80h311l134 454h90l-136 -454h365l135 454h86l-135 -454h285l-8 -80h-302l-118 -398h303l-8 -79h-320l-133 -451h-90l135 451h-360l-134 -451h-88l134 451h-283zM475 530h363l120 398h-362z" /> +<glyph unicode="$" d="M141 182v94q65 -34 153.5 -53.5t160.5 -19.5l110 512q-110 53 -153 91t-66.5 87.5t-23.5 116.5q0 155 105.5 250.5t272.5 99.5l41 192h80l-41 -192q149 -5 277 -68l-35 -78q-110 61 -256 70l-109 -514q124 -60 172.5 -99.5t73.5 -88.5t25 -115q0 -151 -110.5 -243 t-297.5 -103l-53 -240h-82l51 240q-79 2 -158 18t-137 43zM410 1018q0 -78 37 -128.5t137 -96.5l102 491q-134 -9 -205 -80t-71 -186zM537 203q142 7 223.5 74.5t81.5 183.5q0 76 -48 129.5t-157 97.5z" /> +<glyph unicode="%" horiz-adv-x="1556" d="M145 862q0 160 52 312t138 229.5t193 77.5q232 0 232 -283q0 -175 -50 -327t-136 -230t-197 -78q-112 0 -172 75.5t-60 223.5zM213 0l1135 1462h110l-1139 -1462h-106zM231 868q0 -115 41 -173t113 -58q84 0 148.5 72t102.5 204t38 277q0 109 -36 163t-114 54 q-79 0 -145 -71.5t-107 -203t-41 -264.5zM905 276q0 160 52 312t138 229.5t193 77.5q121 0 176.5 -71.5t55.5 -211.5q0 -175 -50 -327t-136 -230t-197 -78q-112 0 -172 75.5t-60 223.5zM991 283q0 -116 41 -174t113 -58q130 0 209.5 166.5t79.5 386.5q0 109 -36 163t-114 54 q-80 0 -146.5 -72.5t-106.5 -202.5t-40 -263z" /> +<glyph unicode="&#x26;" horiz-adv-x="1331" d="M78 324q0 162 99 277.5t325 215.5l-41 67q-78 128 -78 251q0 157 101 253.5t264 96.5q145 0 227 -76.5t82 -206.5q0 -85 -41 -154t-121 -128t-256 -138l330 -463q73 75 135.5 176.5t91.5 186.5h111q-102 -247 -285 -436l184 -246h-123l-131 184q-121 -108 -242 -156 t-266 -48q-167 0 -266.5 94t-99.5 250zM176 328q0 -119 78 -192t211 -73q108 0 211.5 42.5t222.5 146.5l-352 493q-164 -79 -232 -134.5t-103.5 -124t-35.5 -158.5zM485 1135q0 -132 109 -281q203 89 279.5 163.5t76.5 182.5q0 91 -56.5 143t-145.5 52q-125 0 -194 -68 t-69 -192z" /> +<glyph unicode="'" horiz-adv-x="403" d="M254 934l80 528h127l-146 -528h-61z" /> +<glyph unicode="(" horiz-adv-x="526" d="M104 270q0 343 122 633t382 559h105q-259 -276 -384.5 -568t-125.5 -618q0 -317 127 -600h-80q-146 262 -146 594z" /> +<glyph unicode=")" horiz-adv-x="526" d="M-156 -324q257 274 383.5 566.5t126.5 619.5q0 148 -28.5 294t-98.5 306h80q146 -262 146 -594q0 -345 -123.5 -636t-380.5 -556h-105z" /> +<glyph unicode="*" horiz-adv-x="1137" d="M233 1217l39 102l394 -168l47 408l121 -19l-109 -405l438 8l-8 -107l-416 29l181 -401l-115 -37l-135 417l-285 -348l-78 78l318 318z" /> +<glyph unicode="+" d="M162 672v100h401v404h101v-404h401v-100h-401v-400h-101v400h-401z" /> +<glyph unicode="," horiz-adv-x="451" d="M-90 -264q79 132 141 271t88 231h111l8 -23q-34 -92 -114 -233.5t-160 -245.5h-74z" /> +<glyph unicode="-" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" /> +<glyph unicode="." horiz-adv-x="485" d="M82 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73z" /> +<glyph unicode="/" horiz-adv-x="641" d="M-100 0l815 1462h112l-817 -1462h-110z" /> +<glyph unicode="0" d="M139 494q0 186 44.5 381.5t124 334t187 207t240.5 68.5q340 0 340 -469q0 -201 -41 -405t-116.5 -346t-183.5 -213.5t-242 -71.5q-176 0 -264.5 126.5t-88.5 387.5zM242 504q0 -222 62.5 -329t197.5 -107q139 0 244 112t166 337t61 489q0 199 -59.5 295t-190.5 96 q-134 0 -241.5 -113t-173.5 -329t-66 -451z" /> +<glyph unicode="1" d="M354 1204l406 258h90l-313 -1462h-105l225 1055q19 92 74 293q-42 -36 -75.5 -61t-249.5 -161z" /> +<glyph unicode="2" d="M39 0l22 104l449 402q198 177 284 276.5t126.5 186.5t40.5 180q0 112 -66 178t-197 66q-176 0 -333 -129l-54 73q180 146 394 146q173 0 268.5 -85t95.5 -237q0 -110 -43.5 -208.5t-141.5 -211.5t-311 -303l-383 -338v-4h736l-17 -96h-870z" /> +<glyph unicode="3" d="M55 53v101q172 -86 344 -86q197 0 303.5 89.5t106.5 252.5q0 145 -89 223t-247 78h-117l21 96h110q209 0 333 95.5t124 258.5q0 114 -63.5 175t-188.5 61q-167 0 -344 -131l-49 75q84 67 188 104.5t218 37.5q161 0 252.5 -82.5t91.5 -226.5q0 -162 -106 -275t-286 -143 v-4q117 -24 185.5 -115.5t68.5 -226.5q0 -134 -64 -233t-179.5 -148t-274.5 -49q-96 0 -184.5 20.5t-153.5 52.5z" /> +<glyph unicode="4" d="M23 371l20 96l881 1010h118l-215 -1018h265l-21 -88h-264l-80 -371h-96l80 371h-688zM150 459h579q79 369 119 558.5t86 354.5h-4q-66 -91 -129 -166z" /> +<glyph unicode="5" d="M88 51v107q170 -90 340 -90q208 0 328.5 114.5t120.5 313.5q0 140 -85 219.5t-225 79.5q-133 0 -243 -41l-66 49l193 659h624l-18 -96h-541l-149 -516q98 29 215 29q188 0 292.5 -102t104.5 -279q0 -237 -148 -377.5t-407 -140.5q-84 0 -177.5 20t-158.5 51z" /> +<glyph unicode="6" d="M170 428q0 283 105 544.5t269.5 385t383.5 123.5q123 0 182 -21l-18 -90q-86 23 -170 23q-233 0 -393.5 -174t-233.5 -502h8q68 94 164 143t211 49q161 0 250.5 -100.5t89.5 -282.5q0 -156 -60 -281t-171 -195t-257 -70q-171 0 -265.5 119t-94.5 329zM270 414 q0 -164 72.5 -255t200.5 -91q112 0 196.5 58.5t130 162t45.5 229.5q0 146 -67 224.5t-195 78.5q-81 0 -154 -31.5t-129 -87t-78 -115t-22 -173.5z" /> +<glyph unicode="7" d="M244 0l796 1366h-766l23 96h858l-20 -110l-779 -1352h-112z" /> +<glyph unicode="8" d="M98 326q0 159 100.5 268.5t321.5 187.5q-100 72 -144 152t-44 180q0 159 114 265t291 106q163 0 258 -85t95 -229q0 -138 -84 -234.5t-285 -172.5q130 -78 190 -170.5t60 -208.5t-58 -208t-165.5 -144.5t-260.5 -52.5q-178 0 -283.5 92.5t-105.5 253.5zM201 340 q0 -136 77.5 -206.5t219.5 -70.5q168 0 270 91t102 233q0 104 -62 189t-198 157q-218 -73 -313.5 -167.5t-95.5 -225.5zM428 1114q0 -91 41.5 -159t157.5 -142q192 62 279 144t87 206q0 109 -70.5 172.5t-195.5 63.5q-130 0 -214.5 -82t-84.5 -203z" /> +<glyph unicode="9" d="M115 2v90q87 -29 192 -29q474 0 627 674h-8q-140 -192 -367 -192q-162 0 -255 105t-93 284q0 155 59.5 281t170.5 196t257 70q174 0 267.5 -115.5t93.5 -333.5q0 -288 -101.5 -548t-263.5 -382t-393 -122q-114 0 -186 22zM313 942q0 -145 67.5 -225t192.5 -80 q83 0 157.5 32.5t129 87.5t76.5 114t22 176q0 166 -71 256t-201 90q-112 0 -197.5 -58.5t-130.5 -162.5t-45 -230z" /> +<glyph unicode=":" horiz-adv-x="485" d="M102 55q0 56 25.5 88.5t69.5 32.5q65 0 65 -72q0 -55 -25.5 -88.5t-66.5 -33.5q-68 0 -68 73zM260 989q0 57 25.5 89t68.5 32q66 0 66 -72q0 -55 -25 -89t-67 -34q-68 0 -68 74z" /> +<glyph unicode=";" horiz-adv-x="485" d="M-53 -264q79 132 141 271t88 231h111l8 -23q-35 -96 -118.5 -242t-156.5 -237h-73zM266 989q0 57 25.5 89t68.5 32q66 0 66 -72q0 -55 -25 -89t-67 -34q-68 0 -68 74z" /> +<glyph unicode="&#x3c;" d="M137 676v74l914 471v-103l-801 -399l801 -350v-107z" /> +<glyph unicode="=" d="M168 461v98h903v-98h-903zM168 885v100h903v-100h-903z" /> +<glyph unicode="&#x3e;" d="M170 262v107l801 350l-801 399v103l915 -471v-74z" /> +<glyph unicode="?" horiz-adv-x="799" d="M170 59q0 56 25 88.5t69 32.5q66 0 66 -71q0 -54 -24.5 -88.5t-67.5 -34.5q-68 0 -68 73zM182 1376q85 49 171.5 78t187.5 29q159 0 250.5 -84.5t91.5 -229.5q0 -127 -66 -234t-231 -226q-85 -61 -132.5 -108.5t-73 -95t-46.5 -143.5h-92l6 29q29 132 82 206.5t157 147.5 q118 84 175 145.5t86.5 127.5t29.5 141q0 108 -67.5 170t-182.5 62q-139 0 -307 -101z" /> +<glyph unicode="@" horiz-adv-x="1724" d="M125 508q0 276 121.5 493.5t337 337t473.5 119.5q189 0 330.5 -72.5t221 -213t79.5 -314.5q0 -179 -56 -323.5t-154.5 -227t-211.5 -82.5q-98 0 -154.5 55t-56.5 144h-4q-54 -97 -132.5 -148t-168.5 -51q-112 0 -178 73t-66 202q0 156 63 283t178 198.5t261 71.5 q122 0 252 -52l-84 -315q-39 -140 -39 -221q0 -71 34.5 -111.5t100.5 -40.5q86 0 160 73.5t117.5 198t43.5 251.5q0 156 -65 277t-187 188t-292 67q-235 0 -424.5 -108.5t-295.5 -304t-106 -439.5q0 -288 155 -449t435 -161q207 0 420 82v-90q-210 -82 -428 -82 q-203 0 -357.5 82.5t-238.5 239t-84 370.5zM610 506q0 -92 40.5 -142.5t113.5 -50.5q101 0 180.5 89t124.5 255l78 289q-66 23 -139 23q-113 0 -204.5 -59t-142.5 -165.5t-51 -238.5z" /> +<glyph unicode="A" horiz-adv-x="1059" d="M-111 0l822 1468h67l201 -1468h-105l-69 520h-512l-287 -520h-117zM344 612h449l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563z" /> +<glyph unicode="B" horiz-adv-x="1202" d="M102 0l310 1462h379q190 0 290.5 -84t100.5 -241q0 -153 -90 -249t-254 -124v-4q125 -31 188.5 -113.5t63.5 -204.5q0 -205 -140.5 -323.5t-390.5 -118.5h-457zM223 90h342q201 0 309.5 87.5t108.5 256.5q0 145 -90 216t-275 71h-260zM377 811h278q206 0 313 81t107 238 q0 119 -78 180.5t-229 61.5h-272z" /> +<glyph unicode="C" horiz-adv-x="1169" d="M170 535q0 266 104.5 488t284.5 341t402 119q177 0 307 -68l-45 -90q-55 30 -124.5 47t-137.5 17q-197 0 -351.5 -104.5t-245 -304.5t-90.5 -441q0 -225 110.5 -346t317.5 -121q140 0 304 51v-94q-156 -49 -316 -49q-252 0 -386 145t-134 410z" /> +<glyph unicode="D" horiz-adv-x="1350" d="M102 0l310 1462h305q282 0 426.5 -147.5t144.5 -435.5q0 -253 -109.5 -461.5t-300.5 -313t-446 -104.5h-330zM221 90h209q226 0 394.5 94.5t261 275.5t92.5 412q0 498 -476 498h-206z" /> +<glyph unicode="E" horiz-adv-x="1067" d="M102 0l310 1462h727l-21 -94h-624l-117 -553h590l-21 -94h-588l-135 -627h627l-21 -94h-727z" /> +<glyph unicode="F" horiz-adv-x="981" d="M102 0l310 1462h708l-20 -94h-604l-134 -620h570l-21 -95h-569l-137 -653h-103z" /> +<glyph unicode="G" horiz-adv-x="1374" d="M170 547q0 265 105 483.5t283.5 335.5t395.5 117q113 0 203 -19t184 -59l-38 -94q-110 46 -189.5 62t-167.5 16q-184 0 -339 -107.5t-244 -301.5t-89 -433q0 -229 114.5 -352t326.5 -123q155 0 309 47l117 526h-303l18 90h406l-150 -682q-211 -73 -405 -73 q-257 0 -397 146t-140 421z" /> +<glyph unicode="H" horiz-adv-x="1366" d="M102 0l310 1462h102l-139 -649h760l137 649h100l-309 -1462h-100l151 719h-760l-149 -719h-103z" /> +<glyph unicode="I" horiz-adv-x="504" d="M102 0l310 1462h98l-309 -1462h-99z" /> +<glyph unicode="J" horiz-adv-x="477" d="M-324 -336l11 92q57 -20 137 -20q213 0 262 241l309 1485h105l-314 -1491q-35 -170 -125 -250.5t-241 -80.5q-48 0 -88 8t-56 16z" /> +<glyph unicode="K" horiz-adv-x="1122" d="M102 0l310 1462h102l-158 -723l133 121l680 602h138l-699 -610l371 -852h-111l-342 788l-190 -153l-131 -635h-103z" /> +<glyph unicode="L" horiz-adv-x="938" d="M102 0l310 1462h102l-289 -1366h621l-23 -96h-721z" /> +<glyph unicode="M" horiz-adv-x="1669" d="M109 0l309 1462h143l205 -1257h6l733 1257h150l-301 -1462h-101l191 901q79 369 100 447h-6l-780 -1348h-51l-222 1348h-6q-20 -154 -78 -426l-196 -922h-96z" /> +<glyph unicode="N" horiz-adv-x="1372" d="M102 0l310 1462h80l522 -1294h8q23 176 74 416l188 878h94l-309 -1462h-86l-516 1284h-8q-23 -149 -48 -273t-214 -1011h-95z" /> +<glyph unicode="O" horiz-adv-x="1464" d="M172 559q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5q0 -255 -94 -481.5t-252 -338t-365 -111.5q-250 0 -385 149t-135 430zM276 573q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300t79 430.5q0 240 -104.5 364t-310.5 124 q-174 0 -308.5 -101t-214.5 -298t-80 -417z" /> +<glyph unicode="P" horiz-adv-x="1145" d="M102 0l310 1462h315q202 0 310 -92.5t108 -267.5q0 -500 -610 -500h-201l-129 -602h-103zM350 694h191q252 0 373.5 96.5t121.5 305.5q0 274 -329 274h-211z" /> +<glyph unicode="Q" horiz-adv-x="1464" d="M172 559q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5q0 -216 -70 -418t-186.5 -324t-274.5 -167l267 -350h-142l-231 332l-74 -4q-250 0 -385 149t-135 430zM276 573q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300t79 430.5 q0 240 -104.5 364t-310.5 124q-174 0 -308.5 -101t-214.5 -298t-80 -417z" /> +<glyph unicode="R" horiz-adv-x="1145" d="M102 0l310 1462h303q430 0 430 -360q0 -182 -103.5 -303t-281.5 -152q201 -591 221 -647h-111l-211 633h-323l-131 -633h-103zM358 725h252q208 0 317 95.5t109 281.5q0 268 -329 268h-211z" /> +<glyph unicode="S" horiz-adv-x="1020" d="M37 55v109q163 -92 348 -92q188 0 295.5 86.5t107.5 232.5q0 61 -17 104.5t-52.5 78.5t-91 68t-131.5 75q-150 76 -209.5 164t-59.5 206t59 207.5t165 139t237 49.5q99 0 180 -17.5t168 -60.5l-32 -94q-66 40 -151.5 63t-164.5 23q-163 0 -259.5 -82.5t-96.5 -218.5 q0 -103 49 -170t182 -133q154 -79 213.5 -130t89 -113t29.5 -147q0 -126 -65.5 -224.5t-179.5 -148.5t-269 -50q-88 0 -172.5 17t-171.5 58z" /> +<glyph unicode="T" horiz-adv-x="985" d="M193 1368l20 94h973l-19 -94h-440l-289 -1368h-102l289 1368h-432z" /> +<glyph unicode="U" horiz-adv-x="1370" d="M176 381q0 83 27 201l186 880h103l-193 -899q-20 -89 -20 -184q0 -309 342 -309q195 0 307.5 96.5t158.5 318.5l207 977h101l-207 -977q-58 -270 -197 -387.5t-375 -117.5q-440 0 -440 401z" /> +<glyph unicode="V" horiz-adv-x="1079" d="M201 1462h100l117 -950q26 -217 35 -365h4q51 111 124 247l572 1068h117l-799 -1462h-88z" /> +<glyph unicode="W" horiz-adv-x="1702" d="M238 1462h100l47 -1031l4 -165l-2 -86h6q85 226 170 398l434 884h105l61 -878q19 -266 19 -410h6q30 86 61.5 163t493.5 1125h108q-169 -365 -330.5 -731t-328.5 -731h-78l-78 1075q-11 142 -11 219l1 47h-8q-27 -76 -62 -153.5t-563 -1187.5h-82z" /> +<glyph unicode="X" horiz-adv-x="971" d="M-135 0l608 766l-272 696h106l240 -626l483 626h119l-555 -719l285 -743h-107l-254 678l-526 -678h-127z" /> +<glyph unicode="Y" horiz-adv-x="965" d="M193 1462h100l201 -817l544 817h117l-631 -932l-108 -530h-105l119 545z" /> +<glyph unicode="Z" d="M-12 0l22 92l1069 1276h-764l23 94h887l-19 -88l-1069 -1280h799l-23 -94h-925z" /> +<glyph unicode="[" horiz-adv-x="537" d="M-57 -324l376 1786h429l-19 -90h-330l-340 -1605h330l-20 -91h-426z" /> +<glyph unicode="\" horiz-adv-x="641" d="M209 1462h86l242 -1462h-82z" /> +<glyph unicode="]" horiz-adv-x="537" d="M-176 -324l18 91h330l340 1605h-330l21 90h426l-377 -1786h-428z" /> +<glyph unicode="^" horiz-adv-x="1047" d="M70 569l587 906h91l260 -906h-105l-217 809l-500 -809h-116z" /> +<glyph unicode="_" horiz-adv-x="801" d="M-182 -291l18 86h807l-18 -86h-807z" /> +<glyph unicode="`" horiz-adv-x="1135" d="M487 1548v21h115q46 -129 164 -303v-25h-66q-50 52 -114 144.5t-99 162.5z" /> +<glyph unicode="a" horiz-adv-x="1133" d="M102 354q0 197 75 376t200.5 276.5t277.5 97.5q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374zM205 365q0 -152 50 -223.5t151 -71.5q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5 q-124 0 -224 -82t-164 -245.5t-64 -325.5z" /> +<glyph unicode="b" horiz-adv-x="1151" d="M76 0l327 1556h95q-131 -628 -162 -751h6q93 156 199 229.5t231 73.5q281 0 281 -375q0 -203 -76 -380t-201 -273t-276 -96q-113 0 -186 59t-97 166h-6l-55 -209h-80zM268 346q0 -129 64 -202.5t166 -73.5q124 0 224 83t164 245t64 325q0 152 -49 223.5t-151 71.5 q-91 0 -180 -61.5t-160.5 -169.5t-106.5 -235t-35 -206z" /> +<glyph unicode="c" horiz-adv-x="887" d="M102 397q0 193 73.5 361.5t198.5 257t290 88.5q134 0 241 -43l-28 -90q-107 47 -218 47q-129 0 -232.5 -77t-162.5 -222t-59 -320q0 -158 73.5 -243.5t208.5 -85.5q71 0 131.5 13t131.5 46v-92q-116 -57 -273 -57q-174 0 -274.5 110.5t-100.5 306.5z" /> +<glyph unicode="d" horiz-adv-x="1133" d="M102 354q0 193 71.5 370t197.5 278.5t284 101.5q230 0 279 -219h4q12 66 143 671h99l-330 -1556h-82l45 274h-6q-173 -294 -424 -294q-281 0 -281 374zM205 365q0 -295 201 -295q89 0 178.5 62.5t160 168t106.5 231t36 209.5q0 126 -61.5 201.5t-168.5 75.5 q-124 0 -224 -83t-164 -242.5t-64 -327.5z" /> +<glyph unicode="e" horiz-adv-x="928" d="M102 395q0 181 71 347t195.5 264t274.5 98q114 0 182 -61t68 -166q0 -181 -163.5 -276t-485.5 -95h-33q-6 -44 -6 -98q0 -165 74 -251.5t213 -86.5q132 0 276 73v-94q-140 -69 -299 -69q-173 0 -270 109.5t-97 305.5zM225 594h49q517 0 517 270q0 67 -43.5 110.5 t-116.5 43.5q-131 0 -243.5 -115.5t-162.5 -308.5z" /> +<glyph unicode="f" horiz-adv-x="578" d="M-233 -383q53 -16 100 -16q88 0 134 53t75 186l246 1166h-205l14 67l205 14l35 160q35 168 116.5 244t227.5 76q73 0 166 -31l-25 -80q-87 27 -147 27q-96 0 -153.5 -53.5t-84.5 -178.5l-35 -164h248l-16 -81h-248l-252 -1190q-33 -161 -104 -234.5t-195 -73.5 q-48 0 -102 19v90z" /> +<glyph unicode="g" horiz-adv-x="1040" d="M-88 -217q0 236 309 334q-78 42 -78 123q0 123 191 202q-71 36 -110.5 105.5t-39.5 157.5q0 111 53.5 204t148 146t206.5 53q69 0 147 -21h361l-17 -79l-243 -11q26 -28 43.5 -84t17.5 -114q0 -109 -54.5 -206.5t-148 -145.5t-213.5 -48q-63 0 -77 9q-80 -33 -124 -73 t-44 -81t31.5 -64.5t113.5 -31.5l121 -11q346 -31 346 -264q0 -112 -65 -197.5t-187 -131.5t-291 -46q-186 0 -291.5 72t-105.5 203zM14 -207q0 -101 81 -150t224 -49q203 0 317 74.5t114 204.5q0 85 -62.5 130.5t-218.5 57.5l-160 15q-157 -45 -226 -114.5t-69 -168.5z M285 711q0 -112 58.5 -170t164.5 -58q88 0 154 37t102.5 114t36.5 169q0 104 -56 161.5t-157 57.5q-93 0 -161 -43t-105 -116t-37 -152z" /> +<glyph unicode="h" horiz-adv-x="1143" d="M76 0l332 1556h96l-86 -411q-44 -200 -66 -279h6q78 113 186.5 175.5t229.5 62.5q124 0 192 -65t68 -183q0 -70 -24 -182l-148 -674h-98l149 692q21 92 21 156q0 80 -43.5 125t-134.5 45q-112 0 -210.5 -67t-166 -188t-103.5 -286l-102 -477h-98z" /> +<glyph unicode="i" horiz-adv-x="475" d="M76 0l231 1087h96l-229 -1087h-98zM350 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5z" /> +<glyph unicode="j" horiz-adv-x="475" d="M-279 -381q47 -22 113 -22q82 0 128.5 51.5t72.5 177.5l266 1261h96l-268 -1271q-35 -165 -106.5 -236.5t-188.5 -71.5q-62 0 -113 19v92zM350 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5z" /> +<glyph unicode="k" horiz-adv-x="944" d="M76 0l330 1556h96l-166 -780l-70 -299h4l609 610h125l-474 -469l297 -618h-106l-264 559l-205 -188l-80 -371h-96z" /> +<glyph unicode="l" horiz-adv-x="475" d="M76 0l334 1556h94l-334 -1556h-94z" /> +<glyph unicode="m" horiz-adv-x="1751" d="M72 0l231 1087h80l-33 -210h6q80 113 181.5 170t212.5 57q106 0 163 -67t60 -195h6q77 129 181 195.5t222 66.5q117 0 182.5 -61.5t65.5 -176.5q0 -29 -2.5 -56.5t-19.5 -119.5l-152 -690h-100l149 680q25 120 25 176q0 77 -43 119.5t-119 42.5q-157 0 -277.5 -137.5 t-168.5 -362.5l-109 -518h-102l147 674q25 125 25 162q0 182 -154 182q-106 0 -200 -67.5t-159 -188.5t-100 -287l-100 -475h-98z" /> +<glyph unicode="n" horiz-adv-x="1143" d="M76 0l231 1087h82l-37 -221h6q164 238 416 238q130 0 195 -64t65 -184q0 -70 -24 -182l-148 -674h-98l149 692q21 92 21 156q0 80 -43.5 125t-134.5 45q-112 0 -210.5 -67t-166 -187.5t-103.5 -286.5l-102 -477h-98z" /> +<glyph unicode="o" horiz-adv-x="1124" d="M98 403q0 191 73 358t197 257t281 90q180 0 278.5 -108.5t98.5 -299.5q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-184 0 -279.5 109.5t-95.5 313.5zM201 408q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5q0 154 -73 237t-210 83q-124 0 -223 -78.5 t-158 -225t-59 -310.5z" /> +<glyph unicode="p" horiz-adv-x="1149" d="M-33 -492l336 1579h82l-45 -274h6q91 153 195.5 224t228.5 71q135 0 208 -92.5t73 -282.5q0 -195 -72 -371t-197.5 -277t-283.5 -101q-230 0 -279 219h-4q-13 -72 -149 -695h-99zM266 346q0 -125 61.5 -200.5t168.5 -75.5q124 0 225 84t164 243.5t63 325.5 q0 295 -200 295q-87 0 -174 -58.5t-161.5 -167.5t-110.5 -237.5t-36 -208.5z" /> +<glyph unicode="q" horiz-adv-x="1157" d="M98 354q0 201 75.5 379t200.5 274.5t277 96.5q109 0 183.5 -58t99.5 -167h6l55 208h80l-327 -1556h-95l98 470l64 282h-6q-93 -156 -199 -229.5t-231 -73.5q-281 0 -281 374zM201 365q0 -143 45.5 -219t154.5 -76q92 0 182 62.5t160.5 171.5t105 236.5t34.5 200.5 q0 130 -63.5 203.5t-166.5 73.5q-124 0 -224 -83t-164 -245t-64 -325z" /> +<glyph unicode="r" horiz-adv-x="752" d="M72 0l231 1087h80l-29 -204h6q73 94 123 135.5t106.5 64.5t123.5 23q69 0 123 -14l-21 -93q-47 15 -113 15q-94 0 -179 -64t-153 -192t-100 -277l-100 -481h-98z" /> +<glyph unicode="s" horiz-adv-x="827" d="M25 55v107q74 -46 153 -71t148 -25q138 0 211 57.5t73 163.5q0 42 -15.5 74t-50 61.5t-132.5 85.5q-148 80 -200 145.5t-52 159.5q0 128 98.5 209.5t259.5 81.5q75 0 158.5 -17.5t140.5 -46.5l-35 -88q-136 64 -264 64q-116 0 -186 -53t-70 -138q0 -55 17 -88t60.5 -68.5 t119.5 -76.5q114 -63 161.5 -103.5t70 -86.5t22.5 -107q0 -144 -103 -229.5t-280 -85.5q-173 0 -305 75z" /> +<glyph unicode="t" horiz-adv-x="616" d="M113 1006l14 67l184 17l97 253h55l-55 -256h286l-18 -81h-283l-135 -635q-22 -99 -22 -164q0 -139 126 -139q68 0 152 26v-86q-101 -28 -170 -28q-99 0 -153 54.5t-54 158.5q0 73 29 206l129 607h-182z" /> +<glyph unicode="u" horiz-adv-x="1143" d="M109 227q0 60 22 170l150 690h100l-152 -698q-22 -106 -22 -158q0 -74 47.5 -117.5t138.5 -43.5q110 0 207.5 65.5t164 187t99.5 279.5l105 485h98l-231 -1087h-80l28 205h-6q-167 -221 -403 -221q-131 0 -198.5 62t-67.5 181z" /> +<glyph unicode="v" horiz-adv-x="895" d="M104 1087h101l108 -735q26 -165 33 -254h6q51 115 129 256l406 733h102l-600 -1087h-113z" /> +<glyph unicode="w" horiz-adv-x="1393" d="M121 1087h92l13 -821l-3 -157h6q61 134 150 297l373 681h77l64 -681q14 -147 14 -297h6l24 61l101 236l320 681h96l-508 -1087h-108l-60 686q-14 224 -14 266h-6q-34 -92 -144 -290l-356 -662h-117z" /> +<glyph unicode="x" horiz-adv-x="922" d="M-72 0l471 559l-245 528h100l207 -462l373 462h120l-448 -534l258 -553h-98l-224 483l-393 -483h-121z" /> +<glyph unicode="y" horiz-adv-x="920" d="M-217 -379q71 -27 137 -27q80 0 147 49.5t130 164.5t100 184l-174 1095h100l82 -548q51 -351 55 -449h11q43 105 186 367l348 630h103l-713 -1290q-72 -127 -122.5 -178t-114 -81t-146.5 -30q-68 0 -129 21v92z" /> +<glyph unicode="z" horiz-adv-x="887" d="M-29 0l15 72l776 932h-543l17 83h659l-18 -83l-762 -920h602l-17 -84h-729z" /> +<glyph unicode="{" horiz-adv-x="709" d="M59 528l21 78q126 0 191 49t89 158l89 393q30 135 106 195.5t215 60.5h29l-17 -86q-86 -2 -129 -20.5t-69.5 -61.5t-44.5 -120l-74 -338q-30 -134 -91.5 -194.5t-164.5 -78.5v-4q68 -18 105.5 -68.5t37.5 -121.5q0 -52 -24 -164l-47 -225q-13 -58 -13 -101 q0 -61 37.5 -89t138.5 -28v-86h-20q-256 0 -256 199q0 45 16 115l56 252q18 90 18 127q0 159 -199 159z" /> +<glyph unicode="|" d="M584 -510v2071h100v-2071h-100z" /> +<glyph unicode="}" horiz-adv-x="709" d="M-41 -238q96 2 138 21t68.5 61t43.5 121l74 338q27 126 87.5 189.5t168.5 82.5v5q-75 20 -109.5 72.5t-34.5 117.5q0 55 18 131l54 258q12 61 12 101q0 44 -18 69t-54 36t-116 11l20 86h21q131 0 189.5 -51t58.5 -147q0 -41 -17 -115l-55 -252q-19 -95 -19 -127 q0 -77 49.5 -118.5t149.5 -41.5l-20 -78q-125 0 -191 -48.5t-90 -157.5l-88 -394q-32 -139 -108.5 -197.5t-213.5 -58.5h-18v86z" /> +<glyph unicode="~" d="M127 625v94q108 110 233 110q61 0 115 -13.5t156 -57.5q126 -58 219 -58q54 0 107.5 29t117.5 96v-96q-111 -113 -233 -113q-117 0 -271 72q-62 29 -112.5 43t-108.5 14q-49 0 -108 -30.5t-115 -89.5z" /> +<glyph unicode="&#xa2;" d="M250 600q0 184 63.5 341t178 253t256.5 111l36 178h90l-38 -176q116 -4 217 -43l-29 -90q-107 47 -217 47q-130 0 -233 -76t-162.5 -221t-59.5 -322q0 -164 74.5 -247t208.5 -83q127 0 264 60v-92q-118 -58 -281 -58l-40 -202h-93l45 215q-132 25 -206 132.5t-74 272.5z " /> +<glyph unicode="&#xa3;" d="M-4 0l16 84q93 11 165.5 95.5t107.5 236.5l57 260h-199l17 82h198l76 350q41 187 155 279t290 92q170 0 313 -78l-39 -84l-54 26q-108 50 -231 50q-134 0 -220.5 -74.5t-117.5 -220.5l-73 -340h409l-18 -82h-408l-57 -268q-50 -225 -188 -314h759l-20 -94h-938z" /> +<glyph unicode="&#xa5;" d="M166 289l18 84h299l41 190h-301l17 76h258l-215 823h100l201 -817l544 817h117l-559 -823h266l-16 -76h-315l-39 -190h317l-18 -84h-316l-59 -289h-105l64 289h-299z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M147 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM240 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89q174 0 325 85.5t243 239t92 334.5q0 178 -89 330 t-240.5 241t-330.5 89q-182 0 -335 -92t-238.5 -243t-85.5 -325zM537 725q0 207 110 332t297 125q119 0 227 -52l-36 -83q-99 45 -191 45q-142 0 -222.5 -94.5t-80.5 -264.5q0 -186 74.5 -275t220.5 -89q85 0 199 43v-88q-104 -45 -209 -45q-187 0 -288 116t-101 330z" /> +<glyph unicode="&#xad;" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M150 731q0 207 103.5 382t276.5 272.5t371 97.5q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-204 0 -376.5 100.5t-273.5 273t-101 377.5zM242 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89q174 0 325 85.5t243 239t92 334.5q0 178 -89 330 t-240.5 241t-330.5 89q-182 0 -335 -92t-238.5 -243t-85.5 -325zM657 291v880h211q143 0 222 -62t79 -191q0 -80 -39.5 -141t-109.5 -93l237 -393h-120l-211 360h-168v-360h-101zM758 731h112q93 0 144 46.5t51 135.5q0 172 -197 172h-110v-354z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M580 1241v21q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67z" /> +<glyph unicode="&#x2000;" horiz-adv-x="784" /> +<glyph unicode="&#x2001;" horiz-adv-x="1569" /> +<glyph unicode="&#x2002;" horiz-adv-x="784" /> +<glyph unicode="&#x2003;" horiz-adv-x="1569" /> +<glyph unicode="&#x2004;" horiz-adv-x="523" /> +<glyph unicode="&#x2005;" horiz-adv-x="392" /> +<glyph unicode="&#x2006;" horiz-adv-x="261" /> +<glyph unicode="&#x2007;" horiz-adv-x="261" /> +<glyph unicode="&#x2008;" horiz-adv-x="196" /> +<glyph unicode="&#x2009;" horiz-adv-x="313" /> +<glyph unicode="&#x200a;" horiz-adv-x="87" /> +<glyph unicode="&#x2010;" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" /> +<glyph unicode="&#x2011;" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" /> +<glyph unicode="&#x2012;" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" /> +<glyph unicode="&#x2013;" horiz-adv-x="983" d="M66 502l18 90h807l-17 -90h-808z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M68 502l18 90h1788l-16 -90h-1790z" /> +<glyph unicode="&#x2018;" horiz-adv-x="299" d="M129 983q41 100 116 231t161 248h73q-66 -106 -129.5 -242.5t-103.5 -258.5h-113z" /> +<glyph unicode="&#x2019;" horiz-adv-x="299" d="M129 961q66 106 129.5 242.5t103.5 258.5h113l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74z" /> +<glyph unicode="&#x201c;" horiz-adv-x="631" d="M129 983q41 100 116 231t161 248h73q-66 -106 -129.5 -242.5t-103.5 -258.5h-113zM463 983q43 104 120 238.5t156 240.5h74q-66 -106 -129.5 -242.5t-103.5 -258.5h-113z" /> +<glyph unicode="&#x201d;" horiz-adv-x="631" d="M129 961q66 106 129.5 242.5t103.5 258.5h113l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74zM463 961q66 106 129.5 242.5t103.5 258.5h113l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74z" /> +<glyph unicode="&#x2022;" horiz-adv-x="793" d="M248 682q0 137 63 213t172 76q76 0 116 -39.5t40 -118.5q0 -125 -66 -207t-176 -82q-149 0 -149 158z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1489" d="M69 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73zM569 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73zM1071 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73z" /> +<glyph unicode="&#x202f;" horiz-adv-x="313" /> +<glyph unicode="&#x205f;" horiz-adv-x="392" /> +<glyph unicode="&#x20ac;" d="M80 541l16 82h172q5 101 35 217h-170l19 82h174q95 273 270 417t399 144q166 0 287 -90l-53 -82q-102 78 -238 78q-186 0 -330.5 -120.5t-226.5 -346.5h457l-21 -82h-460q-30 -98 -39 -217h442l-20 -82h-424q0 -243 89 -356t265 -113q115 0 252 57v-94q-129 -55 -270 -55 q-209 0 -325 139.5t-116 394.5v27h-184z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M174 1384v78h522v-78h-219v-643h-86v643h-217zM772 741v721h125l221 -606l223 606h125v-721h-86v398l4 207h-6l-227 -605h-74l-221 609h-6l4 -201v-408h-82z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.ttf new file mode 100644 index 000000000000..5898c8c7818e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.woff new file mode 100644 index 000000000000..9c978dc30ceb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-LightItalic-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.eot new file mode 100644 index 000000000000..dd6fd2cb3af3 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.svg new file mode 100644 index 000000000000..01038bb1c79d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.svg @@ -0,0 +1,146 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansRegular" horiz-adv-x="1171" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="547" d="M152 106q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5zM170 1462h207l-51 -1059h-105z" /> +<glyph unicode="&#x22;" horiz-adv-x="821" d="M133 1462h186l-40 -528h-105zM502 1462h186l-41 -528h-104z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M51 430v129h287l68 340h-277v127h299l82 436h139l-82 -436h305l84 436h134l-84 -436h264v-127h-289l-66 -340h283v-129h-307l-84 -430h-137l84 430h-303l-82 -430h-136l80 430h-262zM475 559h303l66 340h-303z" /> +<glyph unicode="$" d="M131 170v156q83 -37 191.5 -60.5t197.5 -23.5v440q-205 65 -287.5 151t-82.5 222q0 131 101.5 215t268.5 102v182h129v-180q184 -5 355 -74l-52 -131q-149 59 -303 70v-434q157 -50 235 -97.5t115 -109t37 -149.5q0 -136 -102 -224.5t-285 -111.5v-232h-129v223 q-112 0 -217 17.5t-172 48.5zM319 1057q0 -76 45 -122t156 -87v387q-99 -16 -150 -62.5t-51 -115.5zM649 252q217 30 217 184q0 72 -44.5 116.5t-172.5 88.5v-389z" /> +<glyph unicode="%" horiz-adv-x="1686" d="M104 1026q0 227 74.5 342t220.5 115q145 0 223 -119t78 -338q0 -228 -76.5 -344.5t-224.5 -116.5q-140 0 -217.5 119t-77.5 342zM242 1026q0 -170 37 -255t120 -85q164 0 164 340q0 338 -164 338q-83 0 -120 -84t-37 -254zM365 0l811 1462h147l-811 -1462h-147zM985 440 q0 227 74.5 342t220.5 115q142 0 221.5 -117.5t79.5 -339.5q0 -227 -76.5 -343.5t-224.5 -116.5q-142 0 -218.5 119t-76.5 341zM1122 440q0 -171 37 -255.5t121 -84.5t124 83.5t40 256.5q0 171 -40 253.5t-124 82.5t-121 -82.5t-37 -253.5z" /> +<glyph unicode="&#x26;" horiz-adv-x="1495" d="M113 379q0 130 69.5 230t249.5 202q-85 95 -115.5 144t-48.5 102t-18 110q0 150 98 234t273 84q162 0 255 -83.5t93 -232.5q0 -107 -68 -197.5t-225 -183.5l407 -391q56 62 89.5 145.5t56.5 182.5h168q-68 -286 -205 -434l299 -291h-229l-185 178q-118 -106 -240 -152 t-272 -46q-215 0 -333.5 106t-118.5 293zM285 383q0 -117 77.5 -185.5t206.5 -68.5q241 0 400 154l-437 424q-111 -68 -157 -112.5t-68 -95.5t-22 -116zM414 1171q0 -69 36 -131.5t123 -150.5q129 75 179.5 138.5t50.5 146.5q0 77 -51.5 125.5t-137.5 48.5q-89 0 -144.5 -48 t-55.5 -129z" /> +<glyph unicode="'" horiz-adv-x="453" d="M133 1462h186l-40 -528h-105z" /> +<glyph unicode="(" horiz-adv-x="606" d="M82 561q0 265 77.5 496t223.5 405h162q-144 -193 -216.5 -424t-72.5 -475q0 -240 74 -469t213 -418h-160q-147 170 -224 397t-77 488z" /> +<glyph unicode=")" horiz-adv-x="606" d="M61 1462h162q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-160q139 188 213 417.5t74 469.5q0 244 -72.5 475t-216.5 424z" /> +<glyph unicode="*" horiz-adv-x="1130" d="M86 1090l29 182l391 -111l-43 395h194l-43 -395l398 111l26 -182l-381 -31l248 -326l-172 -94l-176 362l-160 -362l-176 94l242 326z" /> +<glyph unicode="+" d="M104 653v138h410v428h139v-428h412v-138h-412v-426h-139v426h-410z" /> +<glyph unicode="," horiz-adv-x="502" d="M63 -264q27 104 59.5 257t45.5 245h182l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125z" /> +<glyph unicode="-" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="." horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" /> +<glyph unicode="/" horiz-adv-x="752" d="M20 0l545 1462h166l-545 -1462h-166z" /> +<glyph unicode="0" d="M102 733q0 382 119 567t363 185q238 0 361.5 -193t123.5 -559q0 -379 -119.5 -566t-365.5 -187q-236 0 -359 191.5t-123 561.5zM270 733q0 -319 75 -464.5t239 -145.5q166 0 240.5 147.5t74.5 462.5t-74.5 461.5t-240.5 146.5q-164 0 -239 -144.5t-75 -463.5z" /> +<glyph unicode="1" d="M188 1163l387 299h140v-1462h-162v1042q0 130 8 246q-21 -21 -47 -44t-238 -195z" /> +<glyph unicode="2" d="M100 0v143l385 387q176 178 232 254t84 148t28 155q0 117 -71 185.5t-197 68.5q-91 0 -172.5 -30t-181.5 -109l-88 113q202 168 440 168q206 0 323 -105.5t117 -283.5q0 -139 -78 -275t-292 -344l-320 -313v-8h752v-154h-961z" /> +<glyph unicode="3" d="M94 59v158q95 -47 202.5 -71.5t203.5 -24.5q379 0 379 297q0 266 -418 266h-144v143h146q171 0 271 75.5t100 209.5q0 107 -73.5 168t-199.5 61q-96 0 -181 -26t-194 -96l-84 112q90 71 207.5 111.5t247.5 40.5q213 0 331 -97.5t118 -267.5q0 -140 -78.5 -229 t-222.5 -119v-8q176 -22 261 -112t85 -236q0 -209 -145 -321.5t-412 -112.5q-116 0 -212.5 17.5t-187.5 61.5z" /> +<glyph unicode="4" d="M43 336v145l694 989h176v-983h217v-151h-217v-336h-159v336h-711zM209 487h545v486q0 143 10 323h-8q-48 -96 -90 -159z" /> +<glyph unicode="5" d="M133 59v160q70 -45 174 -70.5t205 -25.5q176 0 273.5 83t97.5 240q0 306 -375 306q-95 0 -254 -29l-86 55l55 684h727v-153h-585l-37 -439q115 23 229 23q231 0 363.5 -114.5t132.5 -313.5q0 -227 -144.5 -356t-398.5 -129q-247 0 -377 79z" /> +<glyph unicode="6" d="M117 625q0 431 167.5 644.5t495.5 213.5q113 0 178 -19v-143q-77 25 -176 25q-235 0 -359 -146.5t-136 -460.5h12q110 172 348 172q197 0 310.5 -119t113.5 -323q0 -228 -124.5 -358.5t-336.5 -130.5q-227 0 -360 170.5t-133 474.5zM287 506q0 -103 40 -192t113.5 -141 t167.5 -52q142 0 220.5 89.5t78.5 258.5q0 145 -73 228t-218 83q-90 0 -165 -37t-119.5 -102t-44.5 -135z" /> +<glyph unicode="7" d="M94 1309v153h973v-133l-598 -1329h-184l606 1309h-797z" /> +<glyph unicode="8" d="M104 373q0 251 306 391q-138 78 -198 168.5t-60 202.5q0 159 117.5 253.5t314.5 94.5q200 0 317 -93t117 -257q0 -108 -67 -197t-214 -162q178 -85 253 -178.5t75 -216.5q0 -182 -127 -290.5t-348 -108.5q-234 0 -360 102.5t-126 290.5zM268 369q0 -120 83.5 -187 t234.5 -67q149 0 232 70t83 192q0 97 -78 172.5t-272 146.5q-149 -64 -216 -141.5t-67 -185.5zM315 1128q0 -92 59 -158t218 -132q143 60 202.5 129t59.5 161q0 101 -72.5 160.5t-199.5 59.5q-125 0 -196 -60t-71 -160z" /> +<glyph unicode="9" d="M106 991q0 228 127.5 360t335.5 132q149 0 260.5 -76.5t171.5 -223t60 -345.5q0 -858 -664 -858q-116 0 -184 20v143q80 -26 182 -26q240 0 362.5 148.5t133.5 455.5h-12q-55 -83 -146 -126.5t-205 -43.5q-194 0 -308 116t-114 324zM270 993q0 -144 72 -226.5t219 -82.5 q91 0 167.5 37t120.5 101t44 134q0 105 -41 194t-114.5 140t-168.5 51q-143 0 -221 -92t-78 -256z" /> +<glyph unicode=":" horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM152 989q0 135 118 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" /> +<glyph unicode=";" horiz-adv-x="545" d="M63 -264q27 104 59.5 257t45.5 245h182l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125zM147 989q0 135 119 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-58 0 -88.5 35t-30.5 100z" /> +<glyph unicode="&#x3c;" d="M104 664v98l961 479v-149l-782 -371l782 -328v-151z" /> +<glyph unicode="=" d="M119 449v137h930v-137h-930zM119 858v137h930v-137h-930z" /> +<glyph unicode="&#x3e;" d="M104 242v151l783 326l-783 373v149l961 -479v-98z" /> +<glyph unicode="?" horiz-adv-x="879" d="M27 1384q189 99 395 99q191 0 297 -94t106 -265q0 -73 -19.5 -128.5t-57.5 -105t-164 -159.5q-101 -86 -133.5 -143t-32.5 -152v-33h-129v54q0 117 36 192.5t134 159.5q136 115 171.5 173t35.5 140q0 102 -65.5 157.5t-188.5 55.5q-79 0 -154 -18.5t-172 -67.5zM240 106 q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5z" /> +<glyph unicode="@" horiz-adv-x="1841" d="M121 571q0 260 107 463t305 314.5t454 111.5q215 0 382.5 -90.5t259 -257t91.5 -383.5q0 -142 -44 -260t-124 -183t-184 -65q-86 0 -145 52t-70 133h-8q-40 -87 -114.5 -136t-176.5 -49q-150 0 -234.5 102.5t-84.5 278.5q0 204 118 331.5t310 127.5q68 0 154 -12.5 t155 -34.5l-25 -470v-22q0 -178 133 -178q91 0 148 107.5t57 279.5q0 181 -74 317t-210.5 209.5t-313.5 73.5q-223 0 -388 -92.5t-252 -264t-87 -396.5q0 -305 161 -469t464 -164q210 0 436 86v-133q-192 -84 -436 -84q-363 0 -563.5 199.5t-200.5 557.5zM686 598 q0 -254 195 -254q207 0 225 313l14 261q-72 20 -157 20q-130 0 -203.5 -90t-73.5 -250z" /> +<glyph unicode="A" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211z" /> +<glyph unicode="B" horiz-adv-x="1327" d="M201 0v1462h413q291 0 421 -87t130 -275q0 -130 -72.5 -214.5t-211.5 -109.5v-10q333 -57 333 -350q0 -196 -132.5 -306t-370.5 -110h-510zM371 145h305q177 0 266.5 68.5t89.5 214.5q0 136 -91.5 200t-278.5 64h-291v-547zM371 836h280q180 0 259 56.5t79 190.5 q0 123 -88 177.5t-280 54.5h-250v-479z" /> +<glyph unicode="C" horiz-adv-x="1292" d="M125 733q0 226 84.5 396t244 262t375.5 92q230 0 402 -84l-72 -146q-166 78 -332 78q-241 0 -380.5 -160.5t-139.5 -439.5q0 -287 134.5 -443.5t383.5 -156.5q153 0 349 55v-149q-152 -57 -375 -57q-323 0 -498.5 196t-175.5 557z" /> +<glyph unicode="D" horiz-adv-x="1493" d="M201 0v1462h448q341 0 530 -189t189 -528q0 -362 -196.5 -553.5t-565.5 -191.5h-405zM371 147h207q304 0 457 149.5t153 442.5q0 286 -143.5 431t-426.5 145h-247v-1168z" /> +<glyph unicode="E" horiz-adv-x="1139" d="M201 0v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152h-815z" /> +<glyph unicode="F" horiz-adv-x="1057" d="M201 0v1462h815v-151h-645v-535h606v-151h-606v-625h-170z" /> +<glyph unicode="G" horiz-adv-x="1491" d="M125 731q0 228 91.5 399.5t263.5 262t403 90.5q234 0 436 -86l-66 -150q-198 84 -381 84q-267 0 -417 -159t-150 -441q0 -296 144.5 -449t424.5 -153q152 0 297 35v450h-327v152h497v-711q-116 -37 -236 -56t-278 -19q-332 0 -517 197.5t-185 553.5z" /> +<glyph unicode="H" horiz-adv-x="1511" d="M201 0v1462h170v-622h770v622h170v-1462h-170v688h-770v-688h-170z" /> +<glyph unicode="I" horiz-adv-x="571" d="M201 0v1462h170v-1462h-170z" /> +<glyph unicode="J" horiz-adv-x="547" d="M-160 -213q71 -20 148 -20q99 0 150.5 60t51.5 173v1462h170v-1448q0 -190 -96 -294.5t-276 -104.5q-94 0 -148 27v145z" /> +<glyph unicode="K" horiz-adv-x="1257" d="M201 0v1462h170v-725l663 725h201l-588 -635l610 -827h-200l-533 709l-153 -136v-573h-170z" /> +<glyph unicode="L" horiz-adv-x="1063" d="M201 0v1462h170v-1308h645v-154h-815z" /> +<glyph unicode="M" horiz-adv-x="1849" d="M201 0v1462h256l463 -1206h8l467 1206h254v-1462h-170v942q0 162 14 352h-8l-500 -1294h-137l-496 1296h-8q14 -154 14 -366v-930h-157z" /> +<glyph unicode="N" horiz-adv-x="1544" d="M201 0v1462h192l797 -1222h8q-2 28 -9 174q-5 114 -5 177v32v839h159v-1462h-194l-799 1227h-8q16 -216 16 -396v-831h-157z" /> +<glyph unicode="O" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5z" /> +<glyph unicode="P" horiz-adv-x="1233" d="M201 0v1462h379q548 0 548 -426q0 -222 -151.5 -341.5t-433.5 -119.5h-172v-575h-170zM371 721h153q226 0 327 73t101 234q0 145 -95 216t-296 71h-190v-594z" /> +<glyph unicode="Q" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -281 -113 -467t-319 -252l348 -362h-247l-285 330l-55 -2q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5 q-243 0 -369.5 -153.5t-126.5 -446.5z" /> +<glyph unicode="R" horiz-adv-x="1266" d="M201 0v1462h401q269 0 397.5 -103t128.5 -310q0 -290 -294 -392l397 -657h-201l-354 608h-305v-608h-170zM371 754h233q180 0 264 71.5t84 214.5q0 145 -85.5 209t-274.5 64h-221v-559z" /> +<glyph unicode="S" horiz-adv-x="1124" d="M106 47v164q90 -38 196 -60t210 -22q170 0 256 64.5t86 179.5q0 76 -30.5 124.5t-102 89.5t-217.5 93q-204 73 -291.5 173t-87.5 261q0 169 127 269t336 100q218 0 401 -80l-53 -148q-181 76 -352 76q-135 0 -211 -58t-76 -161q0 -76 28 -124.5t94.5 -89t203.5 -89.5 q230 -82 316.5 -176t86.5 -244q0 -193 -140 -301t-380 -108q-260 0 -400 67z" /> +<glyph unicode="T" horiz-adv-x="1133" d="M18 1311v151h1096v-151h-463v-1311h-170v1311h-463z" /> +<glyph unicode="U" horiz-adv-x="1491" d="M186 520v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396z" /> +<glyph unicode="V" horiz-adv-x="1219" d="M0 1462h180l336 -946q58 -163 92 -317q36 162 94 323l334 940h183l-527 -1462h-168z" /> +<glyph unicode="W" horiz-adv-x="1896" d="M27 1462h180l231 -903q48 -190 70 -344q27 183 80 358l262 889h180l275 -897q48 -155 81 -350q19 142 72 346l230 901h180l-391 -1462h-168l-295 979q-21 65 -47 164t-27 119q-22 -132 -70 -289l-286 -973h-168z" /> +<glyph unicode="X" horiz-adv-x="1182" d="M8 0l486 764l-453 698h188l363 -579l366 579h181l-453 -692l488 -770h-193l-393 643l-400 -643h-180z" /> +<glyph unicode="Y" horiz-adv-x="1147" d="M0 1462h186l387 -731l390 731h184l-488 -895v-567h-172v559z" /> +<glyph unicode="Z" horiz-adv-x="1169" d="M82 0v133l776 1176h-752v153h959v-133l-776 -1175h798v-154h-1005z" /> +<glyph unicode="[" horiz-adv-x="674" d="M166 -324v1786h457v-141h-289v-1503h289v-142h-457z" /> +<glyph unicode="\" horiz-adv-x="752" d="M23 1462h163l547 -1462h-166z" /> +<glyph unicode="]" horiz-adv-x="674" d="M51 -182h289v1503h-289v141h457v-1786h-457v142z" /> +<glyph unicode="^" horiz-adv-x="1110" d="M49 551l434 922h99l477 -922h-152l-372 745l-334 -745h-152z" /> +<glyph unicode="_" horiz-adv-x="918" d="M-4 -184h926v-131h-926v131z" /> +<glyph unicode="`" horiz-adv-x="1182" d="M393 1548v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" /> +<glyph unicode="a" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5z" /> +<glyph unicode="b" horiz-adv-x="1255" d="M176 0v1556h166v-378q0 -127 -8 -228h8q116 164 344 164q216 0 335.5 -147.5t119.5 -417.5t-120.5 -419.5t-334.5 -149.5q-107 0 -195.5 39.5t-148.5 121.5h-12l-35 -141h-119zM342 549q0 -231 77 -330.5t247 -99.5q153 0 228 111.5t75 320.5q0 214 -75 319t-232 105 q-170 0 -245 -97.5t-75 -328.5z" /> +<glyph unicode="c" horiz-adv-x="975" d="M115 541q0 275 132.5 425t377.5 150q79 0 158 -17t124 -40l-51 -141q-55 22 -120 36.5t-115 14.5q-334 0 -334 -426q0 -202 81.5 -310t241.5 -108q137 0 281 59v-147q-110 -57 -277 -57q-238 0 -368.5 146.5t-130.5 414.5z" /> +<glyph unicode="d" horiz-adv-x="1255" d="M115 545q0 271 120 421t334 150q223 0 342 -162h13l-7 79l-4 77v446h166v-1556h-135l-22 147h-9q-115 -167 -344 -167q-215 0 -334.5 147t-119.5 418zM287 543q0 -210 77 -317t226 -107q170 0 246.5 92.5t76.5 298.5v35q0 233 -77.5 332.5t-247.5 99.5 q-146 0 -223.5 -113.5t-77.5 -320.5z" /> +<glyph unicode="e" horiz-adv-x="1149" d="M115 539q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5q-243 0 -383.5 148t-140.5 411zM291 653h573q0 157 -70 240.5t-200 83.5q-132 0 -210.5 -86t-92.5 -238z " /> +<glyph unicode="f" horiz-adv-x="694" d="M29 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129h-279v-967h-166v967h-196z" /> +<glyph unicode="g" horiz-adv-x="1122" d="M39 -186q0 100 64 173t180 99q-42 19 -70.5 59t-28.5 93q0 60 32 105t101 87q-85 35 -138.5 119t-53.5 192q0 180 108 277.5t306 97.5q86 0 155 -20h379v-105l-203 -24q28 -35 50 -91.5t22 -127.5q0 -161 -110 -257t-302 -96q-49 0 -92 8q-106 -56 -106 -141 q0 -45 37 -66.5t127 -21.5h194q178 0 273.5 -75t95.5 -218q0 -182 -146 -277.5t-426 -95.5q-215 0 -331.5 80t-116.5 226zM199 -184q0 -89 75 -135t215 -46q209 0 309.5 62.5t100.5 169.5q0 89 -55 123.5t-207 34.5h-199q-113 0 -176 -54t-63 -155zM289 745q0 -115 65 -174 t181 -59q243 0 243 236q0 247 -246 247q-117 0 -180 -63t-63 -187z" /> +<glyph unicode="h" horiz-adv-x="1257" d="M176 0v1556h166v-471q0 -85 -8 -141h10q49 79 139.5 124.5t206.5 45.5q201 0 301.5 -95.5t100.5 -303.5v-715h-166v709q0 134 -61 200t-191 66q-173 0 -252.5 -94t-79.5 -308v-573h-166z" /> +<glyph unicode="i" horiz-adv-x="518" d="M162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5zM176 0v1096h166v-1096h-166z" /> +<glyph unicode="j" horiz-adv-x="518" d="M-111 -332q69 -20 136 -20q78 0 114.5 42.5t36.5 129.5v1276h166v-1264q0 -324 -299 -324q-95 0 -154 25v135zM162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5z" /> +<glyph unicode="k" horiz-adv-x="1075" d="M176 0v1556h164v-825q0 -55 -8 -170h8q43 61 131 160l354 375h197l-444 -467l475 -629h-201l-387 518l-125 -108v-410h-164z" /> +<glyph unicode="l" horiz-adv-x="518" d="M176 0v1556h166v-1556h-166z" /> +<glyph unicode="m" horiz-adv-x="1905" d="M176 0v1096h135l27 -150h8q47 80 132.5 125t191.5 45q257 0 336 -186h8q49 86 142 136t212 50q186 0 278.5 -95.5t92.5 -305.5v-715h-166v713q0 131 -56 196.5t-174 65.5q-155 0 -229 -89t-74 -274v-612h-166v713q0 131 -56 196.5t-175 65.5q-156 0 -228.5 -93.5 t-72.5 -306.5v-575h-166z" /> +<glyph unicode="n" horiz-adv-x="1257" d="M176 0v1096h135l27 -150h8q51 81 143 125.5t205 44.5q198 0 298 -95.5t100 -305.5v-715h-166v709q0 134 -61 200t-191 66q-172 0 -252 -93t-80 -307v-575h-166z" /> +<glyph unicode="o" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z" /> +<glyph unicode="p" horiz-adv-x="1255" d="M176 -492v1588h135l23 -150h8q64 90 149 130t195 40q218 0 336.5 -149t118.5 -418q0 -270 -120.5 -419.5t-334.5 -149.5q-107 0 -195.5 39.5t-148.5 121.5h-12q12 -96 12 -182v-451h-166zM342 549q0 -231 77 -330.5t247 -99.5q142 0 222.5 115t80.5 317 q0 205 -80.5 314.5t-226.5 109.5q-168 0 -243 -93t-77 -296v-37z" /> +<glyph unicode="q" horiz-adv-x="1255" d="M115 545q0 269 120 420t334 151q225 0 346 -170h9l24 150h131v-1588h-166v469q0 100 11 170h-13q-115 -167 -346 -167q-212 0 -331 149t-119 416zM287 543q0 -207 76.5 -315.5t226.5 -108.5q166 0 242 89t81 300v37q0 230 -78 331t-247 101q-146 0 -223.5 -113.5 t-77.5 -320.5z" /> +<glyph unicode="r" horiz-adv-x="836" d="M176 0v1096h137l19 -203h8q61 107 147 165t189 58q73 0 131 -12l-23 -154q-68 15 -120 15q-133 0 -227.5 -108t-94.5 -269v-588h-166z" /> +<glyph unicode="s" horiz-adv-x="977" d="M106 827q0 134 109 211.5t299 77.5q177 0 346 -72l-59 -135q-165 68 -299 68q-118 0 -178 -37t-60 -102q0 -44 22.5 -75t72.5 -59t192 -81q195 -71 263.5 -143t68.5 -181q0 -153 -114 -236t-320 -83q-218 0 -340 69v154q79 -40 169.5 -63t174.5 -23q130 0 200 41.5 t70 126.5q0 64 -55.5 109.5t-216.5 107.5q-153 57 -217.5 99.5t-96 96.5t-31.5 129z" /> +<glyph unicode="t" horiz-adv-x="723" d="M31 967v80l157 69l70 234h96v-254h318v-129h-318v-645q0 -99 47 -152t129 -53q44 0 85 6.5t65 13.5v-127q-27 -13 -79.5 -21.5t-94.5 -8.5q-318 0 -318 335v652h-157z" /> +<glyph unicode="u" horiz-adv-x="1257" d="M164 379v717h168v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304z" /> +<glyph unicode="v" horiz-adv-x="1026" d="M0 1096h178l236 -650q80 -228 94 -296h8q11 53 69.5 219.5t262.5 726.5h178l-416 -1096h-194z" /> +<glyph unicode="w" horiz-adv-x="1593" d="M23 1096h174q106 -413 161.5 -629t63.5 -291h8q11 57 35.5 147.5t42.5 143.5l201 629h180l196 -629q56 -172 76 -289h8q4 36 21.5 111t208.5 807h172l-303 -1096h-197l-201 643q-19 59 -71 268h-8q-40 -175 -70 -270l-207 -641h-192z" /> +<glyph unicode="x" horiz-adv-x="1073" d="M39 0l401 561l-381 535h189l289 -420l288 420h187l-381 -535l401 -561h-188l-307 444l-310 -444h-188z" /> +<glyph unicode="y" horiz-adv-x="1032" d="M2 1096h178l240 -625q79 -214 98 -309h8q13 51 54.5 174.5t271.5 759.5h178l-471 -1248q-70 -185 -163.5 -262.5t-229.5 -77.5q-76 0 -150 17v133q55 -12 123 -12q171 0 244 192l61 156z" /> +<glyph unicode="z" horiz-adv-x="958" d="M82 0v113l598 854h-561v129h743v-129l-590 -838h605v-129h-795z" /> +<glyph unicode="{" horiz-adv-x="776" d="M61 498v141q130 2 188 48t58 142v306q0 155 108 241t290 86v-139q-230 -6 -230 -199v-295q0 -215 -223 -254v-12q223 -39 223 -254v-297q0 -102 58.5 -148t171.5 -48v-140q-190 2 -294 87t-104 239v303q0 104 -63 148.5t-183 44.5z" /> +<glyph unicode="|" horiz-adv-x="1128" d="M494 -496v2052h141v-2052h-141z" /> +<glyph unicode="}" horiz-adv-x="776" d="M72 -184q111 2 169 48t58 148v297q0 114 55 174t168 80v12q-223 39 -223 254v295q0 193 -227 199v139q184 0 289.5 -87t105.5 -240v-306q0 -97 59 -142.5t189 -47.5v-141q-122 0 -185 -44.5t-63 -148.5v-303q0 -153 -102.5 -238.5t-292.5 -87.5v140z" /> +<glyph unicode="~" d="M104 592v151q100 109 244 109q68 0 124.5 -14t145.5 -52q66 -28 115 -41.5t96 -13.5q54 0 118 32t118 89v-150q-102 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12q-53 0 -116.5 -33.5t-117.5 -87.5z" /> +<glyph unicode="&#xa2;" d="M190 741q0 508 396 570v172h135v-164q75 -3 146 -19.5t120 -39.5l-49 -140q-133 51 -242 51q-172 0 -253 -105.5t-81 -322.5q0 -212 79.5 -313.5t246.5 -101.5q141 0 283 59v-147q-105 -54 -252 -60v-200h-133v206q-203 32 -299.5 168.5t-96.5 386.5z" /> +<glyph unicode="&#xa3;" d="M63 0v141q205 47 205 291v223h-198v127h198v316q0 178 112 280.5t302 102.5t360 -84l-61 -133q-154 77 -297 77q-123 0 -185.5 -62t-62.5 -202v-295h422v-127h-422v-221q0 -100 -32.5 -168t-106.5 -112h795v-154h-1029z" /> +<glyph unicode="&#xa5;" d="M31 1462h178l375 -727l379 727h174l-416 -770h262v-127h-317v-170h317v-127h-317v-268h-164v268h-316v127h316v170h-316v127h256z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323 t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM481 731q0 209 110.5 332t301.5 123q128 0 246 -60l-58 -118q-108 51 -188 51q-125 0 -192.5 -87t-67.5 -241q0 -168 63.5 -249t194.5 -81q86 0 211 45v-124q-48 -20 -98.5 -34t-120.5 -14 q-194 0 -298 120.5t-104 336.5z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323 t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM575 285v891h261q166 0 243.5 -65t77.5 -198q0 -80 -42.5 -141.5t-119.5 -91.5l238 -395h-168l-207 354h-135v-354h-148zM723 762h108q80 0 128.5 41.5t48.5 105.5q0 75 -43 107.5t-136 32.5h-106 v-287z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1182" d="M393 1241v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" /> +<glyph unicode="&#x2000;" horiz-adv-x="784" /> +<glyph unicode="&#x2001;" horiz-adv-x="1569" /> +<glyph unicode="&#x2002;" horiz-adv-x="784" /> +<glyph unicode="&#x2003;" horiz-adv-x="1569" /> +<glyph unicode="&#x2004;" horiz-adv-x="523" /> +<glyph unicode="&#x2005;" horiz-adv-x="392" /> +<glyph unicode="&#x2006;" horiz-adv-x="261" /> +<glyph unicode="&#x2007;" horiz-adv-x="261" /> +<glyph unicode="&#x2008;" horiz-adv-x="196" /> +<glyph unicode="&#x2009;" horiz-adv-x="313" /> +<glyph unicode="&#x200a;" horiz-adv-x="87" /> +<glyph unicode="&#x2010;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="&#x2011;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="&#x2012;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 473v152h860v-152h-860z" /> +<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 473v152h1884v-152h-1884z" /> +<glyph unicode="&#x2018;" horiz-adv-x="348" d="M25 983q22 90 71 224t105 255h123q-66 -254 -103 -501h-184z" /> +<glyph unicode="&#x2019;" horiz-adv-x="348" d="M25 961q70 285 102 501h182l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122z" /> +<glyph unicode="&#x201c;" horiz-adv-x="717" d="M25 983q22 90 71 224t105 255h123q-66 -254 -103 -501h-184zM391 983q56 215 178 479h123q-30 -115 -59.5 -259.5t-42.5 -241.5h-184z" /> +<glyph unicode="&#x201d;" horiz-adv-x="717" d="M25 961q70 285 102 501h182l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122zM391 961q26 100 59 254t46 247h182l14 -22q-24 -91 -72 -224t-104 -255h-125z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M164 748q0 121 56.5 184t164.5 63q105 0 163 -62t58 -185q0 -119 -57.5 -183.5t-163.5 -64.5q-107 0 -164 65.5t-57 182.5z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1606" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM682 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM1213 106 q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" /> +<glyph unicode="&#x202f;" horiz-adv-x="313" /> +<glyph unicode="&#x205f;" horiz-adv-x="392" /> +<glyph unicode="&#x20ac;" horiz-adv-x="1208" d="M63 506v129h152l-2 42v44l2 80h-152v129h164q39 261 185 407t383 146q201 0 366 -97l-71 -139q-166 86 -295 86q-319 0 -398 -403h510v-129h-524l-2 -57v-64l2 -45h463v-129h-447q37 -180 138.5 -278.5t271.5 -98.5q156 0 309 66v-150q-146 -65 -317 -65 q-237 0 -381.5 134.5t-190.5 391.5h-166z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1589" d="M37 1356v106h543v-106h-211v-615h-123v615h-209zM647 741v721h187l196 -559l203 559h180v-721h-127v420l6 137h-8l-211 -557h-104l-201 559h-8l6 -129v-430h-119z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.ttf new file mode 100644 index 000000000000..05951e7b36b2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.woff new file mode 100644 index 000000000000..274664b28e8e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Regular-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.eot new file mode 100644 index 000000000000..289aade3e229 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.svg new file mode 100644 index 000000000000..cc2ca42755a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.svg @@ -0,0 +1,146 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 2011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansSemibold" horiz-adv-x="1169" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="565" d="M133 125q0 74 39 112.5t111 38.5q71 0 109 -40t38 -111t-38.5 -112.5t-108.5 -41.5q-71 0 -110.5 40t-39.5 114zM145 1462h277l-51 -1018h-174z" /> +<glyph unicode="&#x22;" horiz-adv-x="893" d="M133 1462h232l-41 -528h-150zM528 1462h232l-41 -528h-150z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M47 418v168h283l57 284h-264v168h293l80 422h180l-80 -422h252l80 422h174l-80 -422h252v-168h-285l-55 -284h270v-168h-303l-80 -418h-178l80 418h-248l-80 -418h-174l76 418h-250zM506 586h250l57 284h-250z" /> +<glyph unicode="$" d="M111 168v211q86 -42 201 -70.5t206 -29.5v374l-84 31q-164 63 -239.5 150.5t-75.5 216.5q0 138 107.5 227t291.5 108v168h133v-165q203 -7 385 -82l-73 -183q-157 62 -312 74v-364l76 -29q190 -73 263 -154t73 -198q0 -145 -106 -239t-306 -116v-217h-133v211 q-248 4 -407 76zM354 1053q0 -57 35.5 -95t128.5 -75v311q-80 -12 -122 -49t-42 -92zM651 287q176 27 176 151q0 58 -40.5 95.5t-135.5 72.5v-319z" /> +<glyph unicode="%" horiz-adv-x="1765" d="M84 1026q0 457 319 457q157 0 241.5 -118.5t84.5 -338.5q0 -230 -82.5 -345.5t-243.5 -115.5q-152 0 -235.5 119.5t-83.5 341.5zM279 1024q0 -149 29 -222t95 -73q132 0 132 295t-132 295q-66 0 -95 -73t-29 -222zM379 0l811 1462h194l-811 -1462h-194zM1036 440 q0 457 320 457q154 0 239.5 -118t85.5 -339q0 -230 -83 -345t-242 -115q-152 0 -236 118.5t-84 341.5zM1231 440q0 -149 29.5 -223t95.5 -74q131 0 131 297q0 293 -131 293q-66 0 -95.5 -72t-29.5 -221z" /> +<glyph unicode="&#x26;" horiz-adv-x="1516" d="M96 387q0 131 64 228.5t231 193.5q-95 111 -129.5 187.5t-34.5 158.5q0 152 108.5 240t291.5 88q177 0 278 -85.5t101 -230.5q0 -114 -67.5 -207t-225.5 -186l346 -334q81 107 135 314h242q-70 -284 -224 -463l301 -291h-303l-149 145q-102 -82 -217.5 -123.5 t-255.5 -41.5q-230 0 -361 109t-131 298zM344 403q0 -98 69.5 -159.5t186.5 -61.5q183 0 313 107l-383 377q-106 -68 -146 -127.5t-40 -135.5zM451 1147q0 -63 33.5 -119t93.5 -119q113 64 158.5 119.5t45.5 124.5q0 65 -43.5 104t-115.5 39q-79 0 -125.5 -40.5 t-46.5 -108.5z" /> +<glyph unicode="'" horiz-adv-x="498" d="M133 1462h232l-41 -528h-150z" /> +<glyph unicode="(" horiz-adv-x="649" d="M82 561q0 265 77.5 496t223.5 405h205q-139 -188 -213 -421.5t-74 -477.5t74 -473t211 -414h-203q-147 170 -224 397t-77 488z" /> +<glyph unicode=")" horiz-adv-x="649" d="M61 1462h205q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-203q138 187 211.5 415t73.5 472q0 245 -74 477.5t-213 421.5z" /> +<glyph unicode="*" horiz-adv-x="1122" d="M74 1065l35 217l376 -108l-41 382h228l-41 -382l385 108l28 -217l-360 -29l236 -311l-199 -107l-166 338l-149 -338l-205 107l231 311z" /> +<glyph unicode="+" d="M96 633v178h398v408h180v-408h399v-178h-399v-406h-180v406h-398z" /> +<glyph unicode="," horiz-adv-x="547" d="M63 -264q69 270 103 502h231l15 -23q-48 -186 -176 -479h-173z" /> +<glyph unicode="-" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" /> +<glyph unicode="." horiz-adv-x="563" d="M133 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" /> +<glyph unicode="/" horiz-adv-x="799" d="M16 0l545 1462h221l-544 -1462h-222z" /> +<glyph unicode="0" d="M88 731q0 387 122.5 570.5t373.5 183.5q245 0 371 -192t126 -562q0 -381 -122.5 -566t-374.5 -185q-244 0 -370 191t-126 560zM326 731q0 -299 61.5 -427t196.5 -128t197.5 130t62.5 425q0 294 -62.5 425.5t-197.5 131.5t-196.5 -129t-61.5 -428z" /> +<glyph unicode="1" d="M154 1124l430 338h196v-1462h-235v944q0 169 8 268q-23 -24 -56.5 -53t-224.5 -184z" /> +<glyph unicode="2" d="M90 0v178l377 379q167 171 221.5 242.5t79.5 134.5t25 135q0 99 -59.5 156t-164.5 57q-84 0 -162.5 -31t-181.5 -112l-127 155q122 103 237 146t245 43q204 0 327 -106.5t123 -286.5q0 -99 -35.5 -188t-109 -183.5t-244.5 -255.5l-254 -246v-10h694v-207h-991z" /> +<glyph unicode="3" d="M86 59v209q93 -46 197 -71t200 -25q170 0 254 63t84 195q0 117 -93 172t-292 55h-127v191h129q350 0 350 242q0 94 -61 145t-180 51q-83 0 -160 -23.5t-182 -91.5l-115 164q201 148 467 148q221 0 345 -95t124 -262q0 -139 -81 -231.5t-228 -124.5v-8q176 -22 264 -109.5 t88 -232.5q0 -211 -149 -325.5t-424 -114.5q-243 0 -410 79z" /> +<glyph unicode="4" d="M39 319v181l668 966h229v-952h197v-195h-197v-319h-229v319h-668zM258 514h449v367q0 196 10 321h-8q-28 -66 -88 -160z" /> +<glyph unicode="5" d="M117 59v213q81 -46 186 -71t195 -25q159 0 242 71t83 208q0 262 -334 262q-47 0 -116 -9.5t-121 -21.5l-105 62l56 714h760v-209h-553l-33 -362q35 6 85.5 14t123.5 8q221 0 350 -117t129 -319q0 -234 -146.5 -365.5t-416.5 -131.5q-245 0 -385 79z" /> +<glyph unicode="6" d="M94 623q0 858 699 858q110 0 186 -17v-196q-76 22 -176 22q-235 0 -353 -126t-128 -404h12q47 81 132 125.5t200 44.5q199 0 310 -122t111 -331q0 -230 -128.5 -363.5t-350.5 -133.5q-157 0 -273 75.5t-178.5 220t-62.5 347.5zM332 508q0 -141 76.5 -237.5t195.5 -96.5 q121 0 186.5 78t65.5 223q0 126 -61.5 198t-184.5 72q-76 0 -140 -32.5t-101 -89t-37 -115.5z" /> +<glyph unicode="7" d="M74 1253v207h1011v-164l-575 -1296h-254l578 1253h-760z" /> +<glyph unicode="8" d="M88 371q0 122 68.5 219.5t224.5 173.5q-134 80 -191 169t-57 200q0 159 125 253.5t326 94.5q208 0 329 -95.5t121 -255.5q0 -225 -270 -358q172 -86 244.5 -181t72.5 -212q0 -181 -133 -290t-360 -109q-238 0 -369 102t-131 289zM313 379q0 -104 73 -161.5t198 -57.5 q129 0 200.5 59.5t71.5 161.5q0 81 -66 148t-200 124l-29 13q-132 -58 -190 -127.5t-58 -159.5zM360 1116q0 -52 22 -93t64 -74.5t142 -80.5q120 53 169.5 111.5t49.5 136.5q0 85 -61.5 134.5t-163.5 49.5q-100 0 -161 -49.5t-61 -134.5z" /> +<glyph unicode="9" d="M86 981q0 229 128.5 364.5t350.5 135.5q156 0 272 -76t179 -220.5t63 -346.5q0 -432 -174 -645t-524 -213q-133 0 -191 16v197q89 -25 179 -25q238 0 355 128t128 402h-12q-59 -90 -142.5 -130t-195.5 -40q-194 0 -305 121t-111 332zM317 983q0 -125 60.5 -196.5 t183.5 -71.5q119 0 200 71t81 166q0 89 -34.5 166.5t-96.5 122.5t-142 45q-122 0 -187 -79.5t-65 -223.5z" /> +<glyph unicode=":" horiz-adv-x="563" d="M133 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113zM133 979q0 151 148 151q75 0 112 -40t37 -111t-38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" /> +<glyph unicode=";" horiz-adv-x="569" d="M63 -264q69 270 103 502h231l15 -23q-48 -186 -176 -479h-173zM131 979q0 151 148 151q75 0 112 -40t37 -111t-38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" /> +<glyph unicode="&#x3c;" d="M96 651v121l977 488v-195l-733 -344l733 -303v-197z" /> +<glyph unicode="=" d="M102 432v178h963v-178h-963zM102 831v179h963v-179h-963z" /> +<glyph unicode="&#x3e;" d="M96 221v197l733 303l-733 344v195l977 -488v-121z" /> +<glyph unicode="?" horiz-adv-x="928" d="M16 1370q203 113 435 113q196 0 311 -96t115 -265q0 -75 -22 -133.5t-66.5 -111.5t-153.5 -138q-93 -73 -124.5 -121t-31.5 -129v-45h-196v64q0 110 40 183t140 151q119 94 153.5 146t34.5 124q0 84 -56 129t-161 45q-95 0 -176 -27t-158 -65zM242 125q0 151 147 151 q72 0 110 -39.5t38 -111.5q0 -71 -38.5 -112.5t-109.5 -41.5t-109 40.5t-38 113.5z" /> +<glyph unicode="@" horiz-adv-x="1839" d="M111 586q0 261 112 464.5t310.5 311.5t449.5 108q217 0 386.5 -90t263 -256.5t93.5 -384.5q0 -143 -45 -261.5t-126.5 -184.5t-188.5 -66q-79 0 -137 42t-78 114h-12q-49 -78 -121 -117t-162 -39q-163 0 -256.5 105t-93.5 284q0 206 124 334.5t333 128.5 q76 0 168.5 -13.5t164.5 -37.5l-22 -465v-24q0 -160 104 -160q79 0 125.5 102t46.5 260q0 171 -70 300.5t-199 199.5t-296 70q-213 0 -370.5 -88t-240.5 -251.5t-83 -379.5q0 -290 155 -446t445 -156q221 0 461 90v-164q-210 -86 -457 -86q-370 0 -577 199.5t-207 556.5z M698 612q0 -233 183 -233q193 0 211 293l12 239q-63 17 -135 17q-128 0 -199.5 -85t-71.5 -231z" /> +<glyph unicode="A" horiz-adv-x="1354" d="M0 0l547 1468h260l547 -1468h-254l-146 406h-559l-143 -406h-252zM465 612h426l-137 398q-15 40 -41.5 126t-36.5 126q-27 -123 -79 -269z" /> +<glyph unicode="B" horiz-adv-x="1352" d="M193 0v1462h434q302 0 436.5 -88t134.5 -278q0 -128 -66 -213t-190 -107v-10q154 -29 226.5 -114.5t72.5 -231.5q0 -197 -137.5 -308.5t-382.5 -111.5h-528zM432 201h254q150 0 226.5 57.5t76.5 181.5q0 114 -78 169t-237 55h-242v-463zM432 858h230q150 0 219 47.5 t69 161.5q0 103 -74.5 149t-236.5 46h-207v-404z" /> +<glyph unicode="C" horiz-adv-x="1298" d="M121 731q0 228 83.5 399t241.5 262t371 91q224 0 414 -94l-86 -199q-74 35 -156.5 61.5t-173.5 26.5q-206 0 -324 -146t-118 -403q0 -269 113.5 -407t328.5 -138q93 0 180 18.5t181 47.5v-205q-172 -65 -390 -65q-321 0 -493 194.5t-172 556.5z" /> +<glyph unicode="D" horiz-adv-x="1503" d="M193 0v1462h452q349 0 543 -188t194 -529q0 -362 -201 -553.5t-579 -191.5h-409zM432 201h170q528 0 528 536q0 525 -491 525h-207v-1061z" /> +<glyph unicode="E" horiz-adv-x="1143" d="M193 0v1462h827v-202h-588v-398h551v-200h-551v-459h588v-203h-827z" /> +<glyph unicode="F" horiz-adv-x="1090" d="M193 0v1462h825v-202h-588v-457h551v-203h-551v-600h-237z" /> +<glyph unicode="G" horiz-adv-x="1487" d="M121 731q0 353 203 552.5t559 199.5q229 0 434 -88l-84 -199q-178 82 -356 82q-234 0 -370 -147t-136 -402q0 -268 122.5 -407.5t352.5 -139.5q116 0 248 29v377h-303v205h538v-734q-132 -43 -253.5 -61t-262.5 -18q-332 0 -512 196.5t-180 554.5z" /> +<glyph unicode="H" horiz-adv-x="1538" d="M193 0v1462h239v-598h674v598h240v-1462h-240v659h-674v-659h-239z" /> +<glyph unicode="I" horiz-adv-x="625" d="M193 0v1462h239v-1462h-239z" /> +<glyph unicode="J" horiz-adv-x="612" d="M-156 -182q84 -21 146 -21q196 0 196 248v1417h240v-1409q0 -224 -106.5 -342.5t-311.5 -118.5q-98 0 -164 25v201z" /> +<glyph unicode="K" horiz-adv-x="1309" d="M193 0v1462h239v-698q98 120 195 231l395 467h272q-383 -450 -549 -641l564 -821h-277l-459 662l-141 -115v-547h-239z" /> +<glyph unicode="L" horiz-adv-x="1110" d="M193 0v1462h239v-1257h619v-205h-858z" /> +<glyph unicode="M" horiz-adv-x="1890" d="M193 0v1462h337l406 -1163h6l418 1163h338v-1462h-230v723q0 109 5.5 284t9.5 212h-8l-439 -1219h-211l-424 1221h-8q17 -272 17 -510v-711h-217z" /> +<glyph unicode="N" horiz-adv-x="1604" d="M193 0v1462h290l717 -1159h6q-2 23 -8 167.5t-6 225.5v766h219v-1462h-293l-719 1165h-8l5 -65q14 -186 14 -340v-760h-217z" /> +<glyph unicode="O" horiz-adv-x="1612" d="M121 735q0 362 178.5 556t509.5 194q326 0 504 -197t178 -555q0 -357 -178.5 -555t-505.5 -198q-331 0 -508.5 196.5t-177.5 558.5zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139q-215 0 -324.5 -139t-109.5 -408z" /> +<glyph unicode="P" horiz-adv-x="1260" d="M193 0v1462h421q274 0 410.5 -112t136.5 -330q0 -229 -150 -351t-427 -122h-152v-547h-239zM432 748h127q184 0 270 64t86 200q0 126 -77 188t-240 62h-166v-514z" /> +<glyph unicode="Q" horiz-adv-x="1612" d="M121 735q0 362 178.5 556t509.5 194q326 0 504 -197t178 -555q0 -266 -101.5 -448t-295.5 -256l350 -377h-322l-276 328h-39q-331 0 -508.5 196.5t-177.5 558.5zM375 733q0 -270 109 -409.5t323 -139.5q213 0 321.5 138t108.5 411q0 269 -107.5 408t-320.5 139 q-215 0 -324.5 -139t-109.5 -408z" /> +<glyph unicode="R" horiz-adv-x="1309" d="M193 0v1462h413q283 0 419 -106t136 -320q0 -273 -284 -389l413 -647h-272l-350 584h-236v-584h-239zM432 782h166q167 0 242 62t75 184q0 124 -81 178t-244 54h-158v-478z" /> +<glyph unicode="S" horiz-adv-x="1126" d="M100 57v226q100 -47 212.5 -74t209.5 -27q142 0 209.5 54t67.5 145q0 82 -62 139t-256 135q-200 81 -282 185t-82 250q0 183 130 288t349 105q210 0 418 -92l-76 -195q-195 82 -348 82q-116 0 -176 -50.5t-60 -133.5q0 -57 24 -97.5t79 -76.5t198 -95q161 -67 236 -125 t110 -131t35 -172q0 -195 -141 -306t-389 -111t-406 77z" /> +<glyph unicode="T" horiz-adv-x="1159" d="M29 1257v205h1099v-205h-430v-1257h-239v1257h-430z" /> +<glyph unicode="U" horiz-adv-x="1520" d="M180 520v942h240v-925q0 -181 84 -267t258 -86q338 0 338 355v923h239v-946q0 -162 -69.5 -283.5t-201 -187t-314.5 -65.5q-272 0 -423 144t-151 396z" /> +<glyph unicode="V" horiz-adv-x="1274" d="M0 1462h246l305 -909q24 -65 51 -167.5t35 -152.5q13 76 40 176t44 148l305 905h248l-512 -1462h-252z" /> +<glyph unicode="W" horiz-adv-x="1937" d="M12 1462h244l209 -852q49 -205 70 -362q11 85 33 190t40 170l238 854h237l244 -858q35 -119 74 -356q15 143 72 364l208 850h242l-381 -1462h-260l-248 872q-16 57 -40 164.5t-29 149.5q-10 -64 -32.5 -166t-37.5 -152l-242 -868h-260l-189 732z" /> +<glyph unicode="X" horiz-adv-x="1274" d="M4 0l485 758l-454 704h266l338 -553l338 553h258l-457 -708l492 -754h-275l-366 598l-369 -598h-256z" /> +<glyph unicode="Y" horiz-adv-x="1212" d="M0 1462h260l346 -667l346 667h260l-487 -895v-567h-240v559z" /> +<glyph unicode="Z" horiz-adv-x="1178" d="M66 0v166l737 1091h-717v205h1006v-168l-740 -1089h760v-205h-1046z" /> +<glyph unicode="[" horiz-adv-x="676" d="M154 -324v1786h471v-176h-256v-1433h256v-177h-471z" /> +<glyph unicode="\" horiz-adv-x="799" d="M16 1462h222l544 -1462h-221z" /> +<glyph unicode="]" horiz-adv-x="676" d="M51 -147h256v1433h-256v176h469v-1786h-469v177z" /> +<glyph unicode="^" horiz-adv-x="1100" d="M29 535l436 935h121l485 -935h-194l-349 694l-307 -694h-192z" /> +<glyph unicode="_" horiz-adv-x="879" d="M-4 -184h887v-135h-887v135z" /> +<glyph unicode="`" horiz-adv-x="1212" d="M362 1548v21h273q38 -70 103.5 -161t109.5 -142v-25h-158q-69 52 -174.5 150.5t-153.5 156.5z" /> +<glyph unicode="a" horiz-adv-x="1188" d="M90 317q0 171 127 258t387 95l191 6v59q0 106 -49.5 158.5t-153.5 52.5q-85 0 -163 -25t-150 -59l-76 168q90 47 197 71.5t202 24.5q211 0 318.5 -92t107.5 -289v-745h-168l-47 154h-8q-80 -101 -161 -137.5t-208 -36.5q-163 0 -254.5 88t-91.5 249zM334 315 q0 -74 44 -114.5t132 -40.5q128 0 205.5 71.5t77.5 200.5v96l-142 -6q-166 -6 -241.5 -55.5t-75.5 -151.5z" /> +<glyph unicode="b" horiz-adv-x="1276" d="M168 0v1556h235v-370q0 -41 -4 -122t-6 -103h10q112 165 330 165q207 0 322.5 -150t115.5 -421q0 -272 -117 -423.5t-325 -151.5q-210 0 -326 151h-16l-43 -131h-176zM403 555q0 -202 64 -292.5t209 -90.5q125 0 189.5 99t64.5 286q0 377 -258 377q-142 0 -204.5 -83.5 t-64.5 -279.5v-16z" /> +<glyph unicode="c" horiz-adv-x="1014" d="M102 547q0 279 136.5 429t394.5 150q175 0 315 -65l-71 -189q-149 58 -246 58q-287 0 -287 -381q0 -186 71.5 -279.5t209.5 -93.5q157 0 297 78v-205q-63 -37 -134.5 -53t-173.5 -16q-251 0 -381.5 146.5t-130.5 420.5z" /> +<glyph unicode="d" horiz-adv-x="1276" d="M102 551q0 272 117.5 423.5t325.5 151.5q218 0 332 -161h12q-17 119 -17 188v403h236v-1556h-184l-41 145h-11q-113 -165 -331 -165q-207 0 -323 150t-116 421zM344 547q0 -184 65 -280.5t195 -96.5q145 0 211 81.5t68 264.5v33q0 209 -68 297t-213 88 q-124 0 -191 -100.5t-67 -286.5z" /> +<glyph unicode="e" horiz-adv-x="1180" d="M102 545q0 271 135 426t371 155q219 0 346 -133t127 -366v-127h-737q5 -161 87 -247.5t231 -86.5q98 0 182.5 18.5t181.5 61.5v-191q-86 -41 -174 -58t-201 -17q-258 0 -403.5 150.5t-145.5 414.5zM348 670h502q-2 137 -66 207.5t-176 70.5t-179.5 -71t-80.5 -207z" /> +<glyph unicode="f" horiz-adv-x="743" d="M35 928v110l182 72v72q0 196 92 290.5t281 94.5q124 0 244 -41l-62 -178q-87 28 -166 28q-80 0 -116.5 -49.5t-36.5 -148.5v-72h270v-178h-270v-928h-236v928h-182z" /> +<glyph unicode="g" horiz-adv-x="1139" d="M23 -184q0 102 64.5 171.5t180.5 96.5q-47 20 -77.5 64.5t-30.5 93.5q0 62 35 105t104 85q-86 37 -139.5 120.5t-53.5 195.5q0 180 113.5 279t323.5 99q47 0 98.5 -6.5t77.5 -13.5h383v-129l-189 -35q26 -35 43 -86t17 -108q0 -171 -118 -269t-325 -98q-53 0 -96 8 q-76 -47 -76 -110q0 -38 35.5 -57t130.5 -19h193q183 0 278 -78t95 -225q0 -188 -155 -290t-448 -102q-226 0 -345 80t-119 228zM233 -172q0 -76 68.5 -117t192.5 -41q192 0 286 55t94 146q0 72 -51.5 102.5t-191.5 30.5h-178q-101 0 -160.5 -47.5t-59.5 -128.5zM334 748 q0 -104 53.5 -160t153.5 -56q204 0 204 218q0 108 -50.5 166.5t-153.5 58.5q-102 0 -154.5 -58t-52.5 -169z" /> +<glyph unicode="h" horiz-adv-x="1300" d="M168 0v1556h235v-395q0 -95 -12 -203h15q48 80 133.5 124t199.5 44q402 0 402 -405v-721h-236v680q0 128 -51.5 191t-163.5 63q-148 0 -217.5 -88.5t-69.5 -296.5v-549h-235z" /> +<glyph unicode="i" horiz-adv-x="571" d="M154 1399q0 63 34.5 97t98.5 34q62 0 96.5 -34t34.5 -97q0 -60 -34.5 -94.5t-96.5 -34.5q-64 0 -98.5 34.5t-34.5 94.5zM168 0v1106h235v-1106h-235z" /> +<glyph unicode="j" horiz-adv-x="571" d="M-121 -281q68 -18 139 -18q150 0 150 170v1235h235v-1251q0 -171 -89.5 -259t-258.5 -88q-106 0 -176 25v186zM154 1399q0 63 34.5 97t98.5 34q62 0 96.5 -34t34.5 -97q0 -60 -34.5 -94.5t-96.5 -34.5q-64 0 -98.5 34.5t-34.5 94.5z" /> +<glyph unicode="k" horiz-adv-x="1171" d="M168 0v1556h233v-759l-12 -213h6l133 166l334 356h271l-445 -475l473 -631h-276l-355 485l-129 -106v-379h-233z" /> +<glyph unicode="l" horiz-adv-x="571" d="M168 0v1556h235v-1556h-235z" /> +<glyph unicode="m" horiz-adv-x="1958" d="M168 0v1106h184l33 -145h12q46 79 133.5 122t192.5 43q255 0 338 -174h16q49 82 138 128t204 46q198 0 288.5 -100t90.5 -305v-721h-235v682q0 127 -48.5 189.5t-150.5 62.5q-137 0 -200.5 -85.5t-63.5 -262.5v-586h-236v682q0 127 -48 189.5t-150 62.5 q-136 0 -199.5 -88.5t-63.5 -294.5v-551h-235z" /> +<glyph unicode="n" horiz-adv-x="1300" d="M168 0v1106h184l33 -145h12q50 79 142 122t204 43q398 0 398 -405v-721h-236v680q0 128 -51.5 191t-163.5 63q-149 0 -218 -88t-69 -295v-551h-235z" /> +<glyph unicode="o" horiz-adv-x="1251" d="M102 555q0 269 138 420t389 151q240 0 380 -154.5t140 -416.5q0 -271 -139 -423t-387 -152q-155 0 -274 70t-183 201t-64 304zM344 555q0 -383 283 -383q280 0 280 383q0 379 -282 379q-148 0 -214.5 -98t-66.5 -281z" /> +<glyph unicode="p" horiz-adv-x="1276" d="M168 -492v1598h190q8 -31 33 -148h12q110 168 330 168q207 0 322.5 -150t115.5 -421t-117.5 -423t-324.5 -152q-210 0 -326 151h-14q14 -140 14 -170v-453h-235zM403 555q0 -202 64 -292.5t209 -90.5q122 0 188 100t66 285q0 186 -65.5 281.5t-192.5 95.5 q-140 0 -204.5 -82t-64.5 -262v-35z" /> +<glyph unicode="q" horiz-adv-x="1276" d="M102 551q0 270 118 422.5t325 152.5q104 0 186.5 -38.5t147.5 -126.5h8l26 145h195v-1598h-236v469q0 44 4 93t7 75h-13q-104 -165 -331 -165q-205 0 -321 150.5t-116 420.5zM344 547q0 -379 262 -379q148 0 212.5 85.5t64.5 258.5v37q0 205 -66.5 295t-214.5 90 q-126 0 -192 -100t-66 -287z" /> +<glyph unicode="r" horiz-adv-x="883" d="M168 0v1106h184l31 -195h12q55 99 143.5 157t190.5 58q71 0 117 -10l-23 -219q-50 12 -104 12q-141 0 -228.5 -92t-87.5 -239v-578h-235z" /> +<glyph unicode="s" horiz-adv-x="997" d="M98 827q0 142 114.5 220.5t311.5 78.5q195 0 369 -79l-76 -177q-179 74 -301 74q-186 0 -186 -106q0 -52 48.5 -88t211.5 -99q137 -53 199 -97t92 -101.5t30 -137.5q0 -162 -118 -248.5t-338 -86.5q-221 0 -355 67v203q195 -90 363 -90q217 0 217 131q0 42 -24 70t-79 58 t-153 68q-191 74 -258.5 148t-67.5 192z" /> +<glyph unicode="t" horiz-adv-x="805" d="M39 928v104l162 86l80 234h145v-246h315v-178h-315v-592q0 -85 42.5 -125.5t111.5 -40.5q86 0 172 27v-177q-39 -17 -100.5 -28.5t-127.5 -11.5q-334 0 -334 352v596h-151z" /> +<glyph unicode="u" horiz-adv-x="1300" d="M158 383v723h237v-682q0 -127 52 -190.5t163 -63.5q148 0 217.5 88.5t69.5 296.5v551h236v-1106h-185l-33 145h-12q-49 -77 -139.5 -121t-206.5 -44q-201 0 -300 100t-99 303z" /> +<glyph unicode="v" horiz-adv-x="1096" d="M0 1106h248l225 -643q58 -162 70 -262h8q9 72 70 262l225 643h250l-422 -1106h-254z" /> +<glyph unicode="w" horiz-adv-x="1673" d="M20 1106h240l141 -545q48 -202 68 -346h6q10 73 30.5 167.5t35.5 141.5l168 582h258l163 -582q15 -49 37.5 -150t26.5 -157h8q15 123 70 344l143 545h236l-312 -1106h-264l-143 516q-26 82 -94 381h-9q-58 -270 -92 -383l-147 -514h-260z" /> +<glyph unicode="x" horiz-adv-x="1128" d="M25 0l389 565l-371 541h268l252 -387l254 387h266l-372 -541l391 -565h-266l-273 414l-272 -414h-266z" /> +<glyph unicode="y" horiz-adv-x="1098" d="M0 1106h256l225 -627q51 -134 68 -252h8q9 55 33 133.5t254 745.5h254l-473 -1253q-129 -345 -430 -345q-78 0 -152 17v186q53 -12 121 -12q170 0 239 197l41 104z" /> +<glyph unicode="z" horiz-adv-x="979" d="M68 0v145l559 781h-525v180h789v-164l-547 -762h563v-180h-839z" /> +<glyph unicode="{" horiz-adv-x="791" d="M45 473v191q135 0 200.5 45.5t65.5 138.5v311q0 156 108.5 229.5t325.5 73.5v-182q-114 -5 -165.5 -46.5t-51.5 -123.5v-297q0 -199 -229 -238v-12q229 -36 229 -237v-299q0 -82 51 -124t166 -44v-183q-231 2 -332.5 78.5t-101.5 247.5v285q0 186 -266 186z" /> +<glyph unicode="|" horiz-adv-x="1128" d="M473 -481v2033h180v-2033h-180z" /> +<glyph unicode="}" horiz-adv-x="760" d="M45 -141q95 1 148 38.5t53 129.5v262q0 121 53 187t176 87v12q-229 39 -229 238v297q0 82 -45.5 123.5t-155.5 46.5v182q223 0 320.5 -76.5t97.5 -250.5v-287q0 -100 63.5 -142t188.5 -42v-191q-123 0 -187.5 -42.5t-64.5 -143.5v-307q0 -156 -99.5 -229t-318.5 -75v183z " /> +<glyph unicode="~" d="M96 571v191q99 108 250 108q66 0 125 -13t147 -50q131 -55 220 -55q52 0 114.5 31t120.5 89v-190q-105 -111 -250 -111q-65 0 -127.5 15.5t-146.5 50.5q-127 55 -219 55q-50 0 -111.5 -30t-122.5 -91z" /> +<glyph unicode="&#xa2;" d="M166 741q0 254 100.5 397t306.5 175v170h158v-162q152 -5 283 -66l-70 -188q-146 59 -250 59q-146 0 -216 -95t-70 -288q0 -194 72 -283t210 -89q75 0 142.5 15t154.5 52v-200q-119 -59 -258 -64v-194h-156v200q-207 31 -307 171t-100 390z" /> +<glyph unicode="&#xa3;" d="M72 0v195q98 30 145 96t47 178v184h-188v172h188v256q0 188 113.5 294t312.5 106q194 0 375 -82l-76 -182q-162 71 -284 71q-205 0 -205 -219v-244h397v-172h-397v-182q0 -91 -33 -155t-113 -109h756v-207h-1038z" /> +<glyph unicode="&#xa5;" d="M18 1462h246l320 -665l321 665h244l-399 -760h227v-151h-281v-154h281v-153h-281v-244h-225v244h-283v153h283v154h-283v151h224z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM223 731q0 -170 84.5 -315.5t230.5 -229.5t314 -84q170 0 316 85.5t229.5 230t83.5 313.5q0 168 -84.5 314.5 t-231 230.5t-313.5 84q-168 0 -312.5 -83t-230.5 -229t-86 -317zM471 731q0 214 110 337.5t306 123.5q138 0 274 -70l-65 -143q-106 55 -203 55q-111 0 -171 -80.5t-60 -222.5q0 -147 54 -226t177 -79q55 0 118 15t109 36v-158q-115 -51 -235 -51q-197 0 -305.5 120.5 t-108.5 342.5z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM223 731q0 -170 84.5 -315.5t230.5 -229.5t314 -84q170 0 316 85.5t229.5 230t83.5 313.5q0 168 -84.5 314.5 t-231 230.5t-313.5 84q-168 0 -312.5 -83t-230.5 -229t-86 -317zM559 279v903h262q174 0 255 -68t81 -205q0 -171 -153 -233l237 -397h-211l-192 346h-90v-346h-189zM748 770h69q74 0 112 35t38 100q0 72 -36.5 100.5t-115.5 28.5h-67v-264z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1212" d="M362 1241v25q57 70 117.5 156t95.5 147h273v-21q-52 -61 -155.5 -157.5t-174.5 -149.5h-156z" /> +<glyph unicode="&#x2000;" horiz-adv-x="784" /> +<glyph unicode="&#x2001;" horiz-adv-x="1569" /> +<glyph unicode="&#x2002;" horiz-adv-x="784" /> +<glyph unicode="&#x2003;" horiz-adv-x="1569" /> +<glyph unicode="&#x2004;" horiz-adv-x="523" /> +<glyph unicode="&#x2005;" horiz-adv-x="392" /> +<glyph unicode="&#x2006;" horiz-adv-x="261" /> +<glyph unicode="&#x2007;" horiz-adv-x="261" /> +<glyph unicode="&#x2008;" horiz-adv-x="196" /> +<glyph unicode="&#x2009;" horiz-adv-x="313" /> +<glyph unicode="&#x200a;" horiz-adv-x="87" /> +<glyph unicode="&#x2010;" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" /> +<glyph unicode="&#x2011;" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" /> +<glyph unicode="&#x2012;" horiz-adv-x="659" d="M72 449v200h514v-200h-514z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 455v190h860v-190h-860z" /> +<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 455v190h1884v-190h-1884z" /> +<glyph unicode="&#x2018;" horiz-adv-x="395" d="M25 983q20 83 71 224t105 255h170q-64 -256 -101 -501h-233z" /> +<glyph unicode="&#x2019;" horiz-adv-x="395" d="M25 961q69 289 100 501h231l15 -22q-53 -209 -176 -479h-170z" /> +<glyph unicode="&#x201c;" horiz-adv-x="813" d="M25 983q20 83 71 224t105 255h170q-64 -256 -101 -501h-233zM440 983q53 203 178 479h170q-69 -296 -100 -501h-233z" /> +<glyph unicode="&#x201d;" horiz-adv-x="813" d="M25 961q69 289 100 501h231l15 -22q-53 -209 -176 -479h-170zM440 961q69 271 103 501h231l14 -22q-53 -209 -176 -479h-172z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M131 748q0 138 66 210t188 72q121 0 187.5 -72.5t66.5 -209.5q0 -135 -67 -209t-187 -74t-187 72.5t-67 210.5z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1677" d="M133 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113zM690 125q0 73 38 112t110 39q73 0 111 -40.5t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113zM1247 125q0 73 38 112t110 39q73 0 111 -40.5 t38 -110.5q0 -71 -38.5 -112.5t-110.5 -41.5t-110 41t-38 113z" /> +<glyph unicode="&#x202f;" horiz-adv-x="313" /> +<glyph unicode="&#x205f;" horiz-adv-x="392" /> +<glyph unicode="&#x20ac;" horiz-adv-x="1188" d="M63 494v153h136l-2 37v37l2 65h-136v154h150q38 251 191 394t395 143q200 0 358 -88l-84 -187q-154 76 -274 76q-141 0 -230.5 -84t-119.5 -254h456v-154h-471l-2 -45v-55l2 -39h408v-153h-391q64 -312 364 -312q143 0 293 62v-203q-131 -61 -305 -61q-241 0 -391.5 132 t-196.5 382h-152z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1561" d="M27 1333v129h553v-129h-205v-592h-146v592h-202zM635 741v721h217l178 -534l187 534h210v-721h-147v414l4 129h-6l-193 -543h-122l-185 543h-6l4 -119v-424h-141z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1105" d="M0 1105h1105v-1105h-1105v1105z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.ttf new file mode 100644 index 000000000000..6f15073125b8 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.woff new file mode 100644 index 000000000000..4e47cb1a69b2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-Semibold-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.eot new file mode 100644 index 000000000000..50a8a6f7558e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.svg new file mode 100644 index 000000000000..65b50e2a68a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.svg @@ -0,0 +1,146 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom +</metadata> +<defs> +<font id="OpenSansSemiboldItalic" horiz-adv-x="1128" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="532" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="&#x09;" horiz-adv-x="532" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="557" d="M33 96q0 80 45.5 130t130.5 50q57 0 91 -32.5t34 -93.5q0 -79 -47 -128t-123 -49q-62 0 -96.5 33.5t-34.5 89.5zM160 444l168 1018h272l-264 -1018h-176z" /> +<glyph unicode="&#x22;" horiz-adv-x="858" d="M213 934l72 528h231l-151 -528h-152zM588 934l74 528h231l-152 -528h-153z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M51 418l17 168h280l84 286h-264l16 168h295l121 422h178l-121 -422h252l121 422h174l-121 -422h252l-14 -168h-285l-84 -286h271l-15 -168h-303l-121 -418h-180l123 418h-248l-121 -418h-174l117 418h-250zM526 586h250l82 286h-250z" /> +<glyph unicode="$" d="M61 172v209q78 -42 179.5 -70t193.5 -30l84 387q-156 56 -223.5 138.5t-67.5 199.5q0 167 118.5 267.5t324.5 117.5l37 163h135l-35 -165q161 -16 289 -82l-86 -185q-134 66 -244 74l-80 -371q128 -51 186.5 -95t86.5 -101t28 -135q0 -172 -119.5 -277t-337.5 -125 l-45 -211h-135l45 211q-197 13 -334 80zM451 1016q0 -98 110 -139l68 319q-89 -11 -133.5 -57.5t-44.5 -122.5zM571 285q86 11 136.5 60t50.5 126q0 101 -115 145z" /> +<glyph unicode="%" horiz-adv-x="1688" d="M141 872q0 166 53 313.5t142.5 222.5t208.5 75q127 0 193.5 -76t66.5 -221q0 -160 -55.5 -313.5t-146.5 -230.5t-206 -77q-124 0 -190 79t-66 228zM231 0l1086 1462h194l-1085 -1462h-195zM334 866q0 -135 80 -135q52 0 95.5 58t73 175.5t29.5 219.5q0 131 -82 131 q-55 0 -99 -61t-70.5 -173t-26.5 -215zM940 279q0 171 53 320t142.5 223.5t207.5 74.5q127 0 195 -75t68 -218q0 -161 -55.5 -315.5t-146.5 -231.5t-204 -77q-127 0 -193.5 76.5t-66.5 222.5zM1133 281q0 -134 81 -134q52 0 96 58.5t73.5 174.5t29.5 220q0 131 -84 131 q-52 0 -95.5 -57.5t-72 -171t-28.5 -221.5z" /> +<glyph unicode="&#x26;" horiz-adv-x="1411" d="M66 350q0 147 85.5 254t286.5 205q-88 151 -88 283q0 180 112.5 286.5t297.5 106.5q160 0 252 -81t92 -218q0 -129 -89.5 -230t-293.5 -192l235 -326q109 112 181 295h233q-113 -270 -297 -454l205 -279h-277l-94 131q-106 -80 -211 -115.5t-229 -35.5 q-190 0 -295.5 97.5t-105.5 272.5zM305 371q0 -86 56 -140.5t147 -54.5q77 0 147 27t144 82l-264 381q-133 -74 -181.5 -141.5t-48.5 -153.5zM567 1102q0 -109 62 -201q147 75 199.5 133.5t52.5 126.5q0 66 -36 101.5t-97 35.5q-87 0 -134 -54t-47 -142z" /> +<glyph unicode="'" horiz-adv-x="483" d="M213 934l72 528h231l-151 -528h-152z" /> +<glyph unicode="(" horiz-adv-x="639" d="M78 276q0 343 124.5 632.5t379.5 553.5h209q-498 -548 -498 -1190q0 -329 115 -596h-183q-147 261 -147 600z" /> +<glyph unicode=")" horiz-adv-x="639" d="M-154 -324q498 548 498 1190q0 327 -115 596h183q147 -265 147 -602q0 -342 -123 -629.5t-381 -554.5h-209z" /> +<glyph unicode="*" horiz-adv-x="1122" d="M193 1167l71 195l354 -178l37 383l213 -43l-116 -367l403 23l-12 -205l-367 45l170 -361l-205 -61l-102 371l-227 -312l-162 144l293 266z" /> +<glyph unicode="+" d="M117 631v180h379v381h180v-381h377v-180h-377v-375h-180v375h-379z" /> +<glyph unicode="," horiz-adv-x="530" d="M-102 -264q105 238 200 502h236l8 -23q-125 -260 -266 -479h-178z" /> +<glyph unicode="-" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="." horiz-adv-x="551" d="M33 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5z" /> +<glyph unicode="/" horiz-adv-x="788" d="M-92 0l811 1462h233l-811 -1462h-233z" /> +<glyph unicode="0" d="M92 471q0 284 83 526t222.5 365t321.5 123q187 0 284 -118.5t97 -354.5q0 -306 -79 -546.5t-219 -363t-325 -122.5q-194 0 -289.5 127.5t-95.5 363.5zM330 469q0 -143 39 -218t129 -75q100 0 182.5 113.5t132 316.5t49.5 414q0 268 -162 268q-97 0 -180 -112 t-136.5 -312.5t-53.5 -394.5z" /> +<glyph unicode="1" d="M242 1145l508 317h198l-311 -1462h-238l189 870q28 150 82 324q-57 -55 -135 -102l-187 -117z" /> +<glyph unicode="2" d="M-18 0l36 180l471 422q176 159 238.5 231t90.5 133.5t28 131.5q0 85 -49.5 134.5t-139.5 49.5q-70 0 -139 -30t-170 -109l-115 160q120 97 231 138.5t228 41.5q181 0 288 -93t107 -251q0 -108 -39 -201t-123 -190.5t-284 -268.5l-311 -264v-8h622l-41 -207h-929z" /> +<glyph unicode="3" d="M31 59v215q84 -49 185.5 -75.5t195.5 -26.5q157 0 245 71.5t88 196.5q0 219 -278 219h-133l37 183h106q164 0 267.5 74.5t103.5 199.5q0 79 -49.5 124.5t-139.5 45.5q-72 0 -146.5 -25.5t-162.5 -84.5l-104 161q120 81 225.5 113.5t226.5 32.5q183 0 286 -88.5 t103 -241.5q0 -158 -99 -264t-269 -137v-7q127 -24 196.5 -106t69.5 -205q0 -133 -68 -236.5t-196.5 -160.5t-304.5 -57q-225 0 -385 79z" /> +<glyph unicode="4" d="M-4 317l37 197l803 952h254l-201 -952h201l-43 -197h-201l-68 -317h-229l69 317h-622zM262 514h397l68 309q31 136 100 377h-8q-51 -86 -135 -186z" /> +<glyph unicode="5" d="M53 59v217q167 -100 342 -100q173 0 270 83t97 230q0 105 -62 168.5t-188 63.5q-95 0 -225 -35l-88 68l200 708h713l-45 -209h-506l-106 -364q93 18 155 18q181 0 288.5 -103.5t107.5 -285.5q0 -161 -70 -283t-204 -188.5t-324 -66.5q-214 0 -355 79z" /> +<glyph unicode="6" d="M111 446q0 205 60.5 406t165 343t251 215t342.5 73q117 0 203 -25l-43 -194q-72 22 -181 22q-205 0 -337 -129.5t-197 -392.5h6q125 170 326 170q156 0 243.5 -99t87.5 -272q0 -162 -68.5 -301t-185.5 -210.5t-270 -71.5q-194 0 -298.5 120t-104.5 346zM340 418 q0 -110 49.5 -177t140.5 -67q81 0 143 48.5t96 134.5t34 188q0 200 -178 200q-51 0 -95.5 -19t-79 -48t-58.5 -64.5t-39 -82t-13 -113.5z" /> +<glyph unicode="7" d="M125 0l754 1257h-674l43 205h932l-33 -168l-758 -1294h-264z" /> +<glyph unicode="8" d="M76 348q0 297 368 432q-91 70 -130.5 145t-39.5 162q0 179 127 288.5t330 109.5q179 0 283 -89t104 -239q0 -132 -79 -229.5t-248 -163.5q120 -78 172.5 -165.5t52.5 -201.5q0 -121 -61.5 -216.5t-175.5 -148t-271 -52.5q-203 0 -317.5 100t-114.5 268zM311 369 q0 -93 59 -149t158 -56q115 0 184.5 64t69.5 167q0 91 -48.5 157.5t-139.5 119.5q-149 -54 -216 -126.5t-67 -176.5zM504 1096q0 -83 39 -137t104 -93q115 43 177.5 105t62.5 157q0 81 -48 126.5t-128 45.5q-93 0 -150 -56t-57 -148z" /> +<glyph unicode="9" d="M92 12v207q121 -43 236 -43q188 0 306 123t177 389h-6q-113 -160 -305 -160q-165 0 -255.5 102t-90.5 288q0 156 67 289t186.5 204.5t274.5 71.5q192 0 294.5 -119.5t102.5 -345.5q0 -205 -58 -414.5t-152.5 -349t-226 -207t-310.5 -67.5q-133 0 -240 32zM387 932 q0 -105 46 -160t134 -55q117 0 198 94t81 240q0 108 -48 172.5t-134 64.5q-82 0 -145.5 -47t-97.5 -130t-34 -179z" /> +<glyph unicode=":" horiz-adv-x="551" d="M33 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5zM205 948q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -79 -48.5 -130t-125.5 -51q-66 0 -96.5 35.5t-30.5 87.5z" /> +<glyph unicode=";" horiz-adv-x="551" d="M-100 -264q95 214 198 502h236l8 -23q-125 -260 -266 -479h-176zM205 948q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -79 -48.5 -130t-125.5 -51q-66 0 -96.5 35.5t-30.5 87.5z" /> +<glyph unicode="&#x3c;" d="M115 651v121l936 488v-195l-697 -344l697 -303v-197z" /> +<glyph unicode="=" d="M117 430v180h936v-180h-936zM117 831v179h936v-179h-936z" /> +<glyph unicode="&#x3e;" d="M115 221v197l694 303l-694 344v195l936 -488v-121z" /> +<glyph unicode="?" horiz-adv-x="907" d="M162 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -79 -49 -129t-125 -50q-66 0 -96.5 34.5t-30.5 86.5zM186 1370q207 113 410 113q171 0 269 -85.5t98 -242.5q0 -120 -63.5 -217.5t-231.5 -216.5q-104 -74 -150 -133t-61 -144h-197q18 133 71.5 220.5 t176.5 177.5q107 77 146.5 117t58 80.5t18.5 88.5q0 70 -42.5 114t-123.5 44q-77 0 -150 -27.5t-151 -64.5z" /> +<glyph unicode="@" horiz-adv-x="1743" d="M100 502q0 270 122.5 489t343 344t493.5 125q200 0 346 -74.5t223.5 -214.5t77.5 -325q0 -176 -59.5 -322.5t-166.5 -229.5t-239 -83q-98 0 -150.5 46t-64.5 120h-6q-101 -166 -277 -166q-123 0 -189.5 78.5t-66.5 218.5q0 151 67.5 279.5t188 203t263.5 74.5 q52 0 94.5 -5t79.5 -13t129 -39l-101 -392q-30 -114 -30 -159q0 -92 79 -92q72 0 134 66.5t97.5 174.5t35.5 230q0 228 -128.5 347.5t-363.5 119.5q-214 0 -385 -99.5t-266.5 -281.5t-95.5 -406q0 -259 140.5 -401t391.5 -142q200 0 430 86v-155q-219 -90 -454 -90 q-210 0 -367 83.5t-241.5 239.5t-84.5 365zM676 522q0 -157 112 -157q82 0 141.5 72t100.5 220l64 240q-53 16 -105 16q-86 0 -158.5 -53.5t-113.5 -144t-41 -193.5z" /> +<glyph unicode="A" horiz-adv-x="1210" d="M-121 0l783 1464h274l166 -1464h-234l-41 406h-485l-209 -406h-254zM446 614h365q-40 416 -45.5 503.5t-5.5 139.5q-55 -139 -142 -307z" /> +<glyph unicode="B" horiz-adv-x="1247" d="M70 0l309 1462h399q222 0 335.5 -84t113.5 -248q0 -146 -86.5 -243t-239.5 -127v-8q108 -28 167.5 -103.5t59.5 -183.5q0 -217 -150 -341t-417 -124h-491zM348 201h223q147 0 230.5 68t83.5 194q0 98 -60 149.5t-176 51.5h-200zM489 858h199q139 0 215 60.5t76 171.5 q0 172 -223 172h-181z" /> +<glyph unicode="C" horiz-adv-x="1225" d="M135 545q0 260 105.5 483t281.5 339t402 116q217 0 389 -92l-94 -195q-63 34 -134 58t-161 24q-154 0 -275 -89t-193.5 -259.5t-72.5 -374.5q0 -180 82.5 -275.5t243.5 -95.5q141 0 329 68v-205q-180 -67 -374 -67q-248 0 -388.5 148.5t-140.5 416.5z" /> +<glyph unicode="D" horiz-adv-x="1374" d="M70 0l309 1462h369q271 0 417 -145t146 -424q0 -271 -100 -473t-291 -311t-449 -109h-401zM348 201h135q177 0 309 86t202.5 242t70.5 356q0 184 -88 280.5t-256 96.5h-146z" /> +<glyph unicode="E" horiz-adv-x="1077" d="M70 0l309 1462h776l-43 -205h-539l-84 -395h502l-41 -203h-504l-96 -456h539l-43 -203h-776z" /> +<glyph unicode="F" horiz-adv-x="1026" d="M70 0l309 1462h774l-43 -205h-537l-96 -454h502l-45 -203h-500l-127 -600h-237z" /> +<glyph unicode="G" horiz-adv-x="1399" d="M135 539q0 264 102.5 483t290 340t426.5 121q111 0 213 -20.5t205 -69.5l-90 -203q-174 86 -334 86q-158 0 -287 -90.5t-203.5 -258t-74.5 -372.5q0 -183 89 -277t253 -94q109 0 215 33l80 371h-277l43 205h512l-157 -736q-112 -40 -218.5 -58.5t-238.5 -18.5 q-261 0 -405 146t-144 413z" /> +<glyph unicode="H" horiz-adv-x="1411" d="M70 0l309 1462h237l-127 -598h566l127 598h237l-309 -1462h-238l140 659h-566l-139 -659h-237z" /> +<glyph unicode="I" horiz-adv-x="608" d="M70 0l311 1462h235l-311 -1462h-235z" /> +<glyph unicode="J" horiz-adv-x="612" d="M-322 -383l5 201q84 -21 153 -21q201 0 254 250l299 1415h238l-305 -1446q-46 -217 -161.5 -320.5t-312.5 -103.5q-104 0 -170 25z" /> +<glyph unicode="K" horiz-adv-x="1198" d="M70 0l309 1462h237l-151 -706l141 166l492 540h284l-616 -669l321 -793h-262l-252 655l-149 -100l-117 -555h-237z" /> +<glyph unicode="L" horiz-adv-x="1016" d="M70 0l309 1462h237l-266 -1257h539l-43 -205h-776z" /> +<glyph unicode="M" horiz-adv-x="1757" d="M68 0l309 1462h323l109 -1149h6l606 1149h344l-305 -1462h-227l182 872q39 186 86 342h-6l-643 -1214h-205l-115 1214h-6q-9 -118 -55 -340l-184 -874h-219z" /> +<glyph unicode="N" horiz-adv-x="1491" d="M68 0l309 1462h268l399 -1149h7q6 54 31 192.5t40 203.5l160 753h219l-309 -1462h-260l-410 1163h-6l-10 -69q-24 -149 -35.5 -212.5t-183.5 -881.5h-219z" /> +<glyph unicode="O" horiz-adv-x="1485" d="M135 543q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414q0 -279 -95 -497t-261.5 -331.5t-386.5 -113.5q-259 0 -401 149.5t-142 413.5zM383 545q0 -173 81.5 -267t227.5 -94q138 0 248.5 95.5t172 265t61.5 375.5q0 170 -79 265t-223 95 q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5z" /> +<glyph unicode="P" horiz-adv-x="1174" d="M70 0l309 1462h334q229 0 345 -100.5t116 -300.5q0 -248 -169.5 -381t-472.5 -133h-110l-115 -547h-237zM465 748h94q178 0 275.5 79.5t97.5 225.5q0 109 -58.5 159t-179.5 50h-119z" /> +<glyph unicode="Q" horiz-adv-x="1485" d="M135 543q0 267 98.5 487.5t269.5 337.5t388 117q251 0 390.5 -149t139.5 -414q0 -322 -130 -563t-355 -332l264 -375h-289l-202 328h-31q-259 0 -401 149.5t-142 413.5zM383 545q0 -173 81.5 -267t227.5 -94q138 0 248.5 94t172 263.5t61.5 378.5q0 170 -79 265t-223 95 q-138 0 -250 -96t-175.5 -266.5t-63.5 -372.5z" /> +<glyph unicode="R" horiz-adv-x="1206" d="M70 0l309 1462h338q223 0 342 -94.5t119 -290.5q0 -165 -86.5 -278.5t-257.5 -165.5l249 -633h-260l-207 584h-186l-123 -584h-237zM473 782h123q170 0 254 75t84 206q0 105 -59 151t-183 46h-119z" /> +<glyph unicode="S" horiz-adv-x="1057" d="M39 55v224q173 -97 350 -97q137 0 216 58.5t79 162.5q0 69 -41 122.5t-172 136.5q-105 67 -155 122t-76.5 120.5t-26.5 144.5q0 128 61.5 227t174 153t253.5 54q205 0 381 -92l-86 -191q-161 78 -295 78q-109 0 -175 -58.5t-66 -152.5q0 -47 15 -82.5t46.5 -66 t134.5 -95.5q155 -97 214 -187.5t59 -207.5q0 -210 -144.5 -329t-398.5 -119q-210 0 -348 75z" /> +<glyph unicode="T" horiz-adv-x="1053" d="M176 1257l45 205h998l-43 -205h-381l-267 -1257h-237l264 1257h-379z" /> +<glyph unicode="U" horiz-adv-x="1399" d="M152 391q0 83 20 170l193 901h237l-192 -905q-21 -88 -21 -158q0 -102 59.5 -158.5t180.5 -56.5q145 0 230 80.5t124 261.5l199 936h237l-202 -956q-56 -267 -208 -396.5t-403 -129.5q-217 0 -335.5 106t-118.5 305z" /> +<glyph unicode="V" horiz-adv-x="1165" d="M186 1462h232l74 -905q9 -103 11 -233l-1 -76h4q70 178 137 309l455 905h254l-764 -1462h-258z" /> +<glyph unicode="W" horiz-adv-x="1788" d="M203 1462h229l19 -850q0 -136 -13 -346h6q83 221 142 355l387 841h225l31 -839l3 -169l-3 -188h8q28 88 70 197.5t61 152.5l358 846h246l-655 -1462h-258l-37 842l-6 185l4 106h-6q-47 -144 -117 -291l-385 -842h-256z" /> +<glyph unicode="X" horiz-adv-x="1151" d="M-111 0l586 770l-250 692h246l178 -540l402 540h266l-551 -710l274 -752h-256l-192 592l-438 -592h-265z" /> +<glyph unicode="Y" horiz-adv-x="1092" d="M186 1462h242l154 -669l432 669h266l-623 -913l-114 -549h-238l119 553z" /> +<glyph unicode="Z" horiz-adv-x="1092" d="M-39 0l33 168l850 1087h-598l43 207h897l-35 -172l-852 -1085h645l-43 -205h-940z" /> +<glyph unicode="[" horiz-adv-x="631" d="M-27 -324l381 1786h430l-39 -176h-221l-303 -1433h221l-39 -177h-430z" /> +<glyph unicode="\" horiz-adv-x="788" d="M221 1462h207l219 -1462h-209z" /> +<glyph unicode="]" horiz-adv-x="631" d="M-143 -324l37 177h219l305 1433h-221l39 176h430l-381 -1786h-428z" /> +<glyph unicode="^" horiz-adv-x="1069" d="M37 537l608 933h127l272 -933h-184l-188 690l-434 -690h-201z" /> +<glyph unicode="_" horiz-adv-x="813" d="M-188 -324l30 140h817l-30 -140h-817z" /> +<glyph unicode="`" horiz-adv-x="1135" d="M541 1548v21h245q47 -154 132 -303v-25h-144q-65 63 -132 151.5t-101 155.5z" /> +<glyph unicode="a" horiz-adv-x="1186" d="M94 367q0 202 69.5 378t191.5 278.5t268 102.5q97 0 167 -45.5t109 -132.5h10l62 158h180l-236 -1106h-182l21 176h-6q-158 -196 -349 -196q-141 0 -223 101.5t-82 285.5zM332 373q0 -102 40.5 -152.5t112.5 -50.5q82 0 161 77.5t130 207.5t51 284q0 88 -47 141.5 t-123 53.5q-85 0 -160 -77t-120 -209.5t-45 -274.5z" /> +<glyph unicode="b" horiz-adv-x="1200" d="M47 0l330 1556h235l-71 -333q-13 -63 -38 -156.5t-40 -140.5h8q90 113 165 156.5t161 43.5q145 0 226 -103.5t81 -285.5q0 -202 -69.5 -379.5t-190.5 -277.5t-266 -100q-98 0 -168.5 45t-110.5 131h-10l-64 -156h-178zM369 373q0 -96 46.5 -149.5t131.5 -53.5t159 78.5 t117 210t43 274.5q0 201 -155 201q-81 0 -162 -80t-130.5 -210.5t-49.5 -270.5z" /> +<glyph unicode="c" horiz-adv-x="954" d="M94 389q0 207 73.5 376.5t206.5 265t302 95.5q164 0 297 -61l-70 -184q-122 53 -221 53q-150 0 -250 -153.5t-100 -379.5q0 -111 56 -171t155 -60q74 0 138.5 22t129.5 54v-195q-140 -71 -305 -71q-196 0 -304 106t-108 303z" /> +<glyph unicode="d" horiz-adv-x="1198" d="M94 369q0 205 71.5 383t191.5 276t266 98q179 0 268 -178h8q13 146 37 250l76 358h233l-330 -1556h-184l19 176h-7q-88 -106 -170 -151t-174 -45q-143 0 -224 101.5t-81 287.5zM332 373q0 -203 157 -203q82 0 162.5 82t129 214t48.5 267q0 91 -43.5 146t-132.5 55 q-85 0 -159 -77t-118 -211t-44 -273z" /> +<glyph unicode="e" horiz-adv-x="1075" d="M94 401q0 198 77.5 368.5t210 263.5t296.5 93q161 0 250.5 -72.5t89.5 -205.5q0 -182 -166.5 -284.5t-474.5 -102.5h-43l-2 -31v-29q0 -111 56.5 -174t168.5 -63q72 0 143 19t168 65v-187q-96 -44 -176.5 -62.5t-179.5 -18.5q-197 0 -307.5 111t-110.5 310zM362 633h29 q188 0 294 53.5t106 151.5q0 51 -32 79.5t-95 28.5q-96 0 -180.5 -86t-121.5 -227z" /> +<glyph unicode="f" horiz-adv-x="702" d="M-225 -279q64 -20 114 -20q134 0 177 205l217 1022h-179l21 106l194 76l21 92q44 198 134.5 281.5t256.5 83.5q115 0 211 -43l-61 -176q-74 28 -136 28q-69 0 -110.5 -43t-63.5 -141l-18 -86h229l-37 -178h-229l-223 -1053q-40 -189 -131 -278t-238 -89q-90 0 -149 23 v190z" /> +<glyph unicode="g" horiz-adv-x="1067" d="M-121 -211q0 103 69.5 178t223.5 127q-76 45 -76 127q0 69 46.5 119.5t146.5 97.5q-135 81 -135 252q0 196 122.5 316t323.5 120q80 0 160 -20h383l-31 -137l-192 -33q28 -58 28 -137q0 -193 -119 -306.5t-319 -113.5q-52 0 -92 8q-111 -40 -111 -104q0 -38 31.5 -52 t91.5 -22l127 -16q176 -22 252 -87.5t76 -187.5q0 -196 -151 -303t-429 -107q-203 0 -314.5 75t-111.5 206zM92 -184q0 -65 55.5 -103.5t169.5 -38.5q163 0 255 54t92 155q0 51 -45 80t-158 41l-137 14q-112 -18 -172 -71t-60 -131zM377 680q0 -71 35.5 -109.5t101.5 -38.5 q65 0 112.5 39t74 107t26.5 149q0 142 -133 142q-65 0 -114 -38.5t-76 -105t-27 -145.5z" /> +<glyph unicode="h" horiz-adv-x="1208" d="M47 0l330 1556h235l-57 -262q-27 -126 -73 -293l-19 -75h8q84 106 168.5 153t177.5 47q136 0 208.5 -77.5t72.5 -221.5q0 -76 -23 -174l-139 -653h-234l142 672q18 90 18 127q0 135 -129 135q-112 0 -209.5 -125t-142.5 -342l-98 -467h-236z" /> +<glyph unicode="i" horiz-adv-x="563" d="M47 0l236 1106h235l-235 -1106h-236zM330 1378q0 68 39 110t110 42q53 0 86 -26.5t33 -80.5q0 -71 -40 -112t-105 -41q-53 0 -88 26t-35 82z" /> +<glyph unicode="j" horiz-adv-x="563" d="M-262 -279q64 -20 117 -20q131 0 170 186l260 1219h233l-266 -1247q-38 -181 -127.5 -266t-237.5 -85q-90 0 -149 23v190zM332 1378q0 68 38 110t109 42q54 0 86.5 -26.5t32.5 -80.5q0 -71 -40 -112t-105 -41q-53 0 -87 25.5t-34 82.5z" /> +<glyph unicode="k" horiz-adv-x="1081" d="M47 0l330 1556h235q-135 -627 -159.5 -729.5t-59.5 -226.5h4l490 506h272l-483 -485l291 -621h-262l-209 471l-136 -96l-77 -375h-236z" /> +<glyph unicode="l" horiz-adv-x="563" d="M47 0l330 1556h235l-331 -1556h-234z" /> +<glyph unicode="m" horiz-adv-x="1819" d="M47 0l236 1106h184l-21 -205h9q148 225 352 225q220 0 254 -235h8q75 116 170.5 175.5t198.5 59.5q133 0 202.5 -76.5t69.5 -215.5q0 -64 -22 -181l-140 -653h-235l143 672q19 95 19 133q0 129 -121 129q-108 0 -201.5 -124t-136.5 -329l-101 -481h-235l143 672 q17 82 17 127q0 135 -117 135q-110 0 -203.5 -127t-138.5 -338l-98 -469h-236z" /> +<glyph unicode="n" horiz-adv-x="1208" d="M47 0l236 1106h184l-21 -205h9q83 118 171 171.5t191 53.5q134 0 207.5 -76t73.5 -216q0 -69 -23 -181l-137 -653h-236l142 672q18 90 18 131q0 131 -129 131q-72 0 -142 -57t-126 -164.5t-84 -243.5l-98 -469h-236z" /> +<glyph unicode="o" horiz-adv-x="1174" d="M94 408q0 199 71.5 365t200.5 258.5t298 92.5q195 0 305 -116t110 -316q0 -202 -73 -367.5t-200.5 -254t-293.5 -88.5q-192 0 -305 114.5t-113 311.5zM332 403q0 -111 49.5 -170t146.5 -59q90 0 162 68t112 190.5t40 269.5q0 107 -49 167.5t-140 60.5q-93 0 -166.5 -71.5 t-114 -194t-40.5 -261.5z" /> +<glyph unicode="p" horiz-adv-x="1200" d="M-55 -492l338 1598h184l-21 -188h9q157 208 344 208q143 0 224 -103t81 -286q0 -204 -70 -381.5t-190.5 -276.5t-265.5 -99q-181 0 -269 176h-10q-7 -97 -25 -185l-96 -463h-233zM369 373q0 -96 46.5 -149.5t131.5 -53.5t159 78.5t117 210t43 274.5q0 201 -155 201 q-81 0 -161 -79.5t-130.5 -210.5t-50.5 -271z" /> +<glyph unicode="q" horiz-adv-x="1198" d="M94 367q0 208 73 387t192.5 275.5t265.5 96.5q183 0 274 -178h10l64 158h178l-340 -1598h-233l75 349q12 56 43.5 180t38.5 141h-8q-84 -108 -164 -153t-170 -45q-139 0 -219 102.5t-80 284.5zM332 373q0 -203 160 -203q80 0 159 81t127.5 213t48.5 269q0 94 -45.5 147.5 t-126.5 53.5q-86 0 -160 -77.5t-118.5 -209.5t-44.5 -274z" /> +<glyph unicode="r" horiz-adv-x="836" d="M47 0l236 1106h184l-21 -205h9q83 120 166 172.5t176 52.5q62 0 108 -12l-51 -219q-54 14 -102 14q-126 0 -225 -113t-138 -296l-106 -500h-236z" /> +<glyph unicode="s" horiz-adv-x="922" d="M14 47v203q153 -90 312 -90q97 0 157 40t60 109q0 51 -34.5 87.5t-141.5 97.5q-125 67 -176.5 136.5t-51.5 164.5q0 155 107 243t289 88q196 0 346 -84l-76 -176q-140 76 -266 76q-73 0 -118.5 -33t-45.5 -92q0 -45 33 -80t135 -90q105 -59 149 -101t67 -91.5t23 -114.5 q0 -173 -118 -266.5t-328 -93.5q-190 0 -322 67z" /> +<glyph unicode="t" horiz-adv-x="752" d="M92 928l21 110l190 82l129 232h146l-52 -246h279l-39 -178h-277l-122 -572q-13 -55 -13 -92q0 -43 25 -68.5t76 -25.5q68 0 151 31v-178q-35 -17 -95 -30t-120 -13q-274 0 -274 247q0 57 16 131l121 570h-162z" /> +<glyph unicode="u" horiz-adv-x="1208" d="M111 274q0 63 12 124.5t24 123.5l123 584h236l-129 -610q-31 -141 -31 -193q0 -133 127 -133q72 0 143 57t126 162.5t85 247.5l99 469h233l-233 -1106h-185l21 205h-8q-82 -116 -171 -170.5t-192 -54.5q-134 0 -207 76t-73 218z" /> +<glyph unicode="v" horiz-adv-x="997" d="M100 1106h232l55 -598q14 -159 14 -297h7q28 74 70 165t65 132l311 598h250l-598 -1106h-275z" /> +<glyph unicode="w" horiz-adv-x="1540" d="M121 1106h221l13 -646q-2 -87 -11 -245h6q66 176 109 272l278 619h254l19 -604l1 -53l-3 -234h6q17 50 57 158.5t63.5 163.5t251.5 569h244l-518 -1106h-268l-19 627l-1 70l3 200q-25 -62 -51.5 -125t-345.5 -772h-262z" /> +<glyph unicode="x" horiz-adv-x="1032" d="M-86 0l475 569l-231 537h245l144 -373l287 373h274l-461 -549l248 -557h-246l-160 387l-305 -387h-270z" /> +<glyph unicode="y" horiz-adv-x="1004" d="M-170 -285q75 -16 125 -16q74 0 134 43.5t124 155.5l51 92l-164 1116h232l63 -531q9 -62 16 -174.5t7 -181.5h6q86 215 135 313l293 574h254l-688 -1280q-90 -165 -196 -241.5t-249 -76.5q-76 0 -143 19v188z" /> +<glyph unicode="z" horiz-adv-x="920" d="M-39 0l29 147l635 781h-439l39 178h705l-37 -170l-623 -758h486l-37 -178h-758z" /> +<glyph unicode="{" horiz-adv-x="721" d="M8 485l39 187q120 0 191.5 42.5t93.5 143.5l59 275q28 134 73 201.5t120 97.5t198 30h60l-41 -184q-96 0 -139.5 -34t-61.5 -116l-70 -309q-24 -108 -87 -170.5t-179 -79.5v-6q160 -45 160 -215q0 -38 -16 -121l-43 -194q-11 -48 -11 -74q0 -51 32.5 -74.5t109.5 -23.5 v-185h-39q-316 0 -316 236q0 61 17 133l45 201q14 65 14 98q0 141 -209 141z" /> +<glyph unicode="|" d="M498 -481v2033h178v-2033h-178z" /> +<glyph unicode="}" horiz-adv-x="721" d="M-88 -141q106 2 152.5 36.5t64.5 114.5l70 309q24 109 87 170t179 78v6q-158 48 -158 215q0 55 17 121l43 197q10 44 10 74q0 58 -43 78t-121 20l35 184h22q318 0 318 -235q0 -61 -17 -133l-45 -203q-14 -65 -14 -98q0 -142 209 -142l-39 -186q-121 0 -192 -42t-93 -142 l-63 -306q-34 -165 -123.5 -232t-269.5 -67h-29v183z" /> +<glyph unicode="~" d="M111 571v191q100 108 249 108q64 0 118.5 -12t146.5 -51q70 -30 115 -42.5t94 -12.5q50 0 112.5 31t120.5 89v-190q-103 -111 -250 -111q-63 0 -124 16.5t-138 49.5q-76 32 -119.5 43.5t-91.5 11.5q-51 0 -112 -31t-121 -90z" /> +<glyph unicode="&#xa2;" d="M195 586q0 190 63.5 351t178 260.5t261.5 121.5l35 164h156l-37 -164q124 -12 221 -57l-69 -185q-125 53 -222 53q-99 0 -180 -71.5t-125.5 -194.5t-44.5 -266q0 -111 56 -171t155 -60q74 0 138.5 21.5t129.5 53.5v-194q-133 -69 -293 -74l-40 -194h-156l45 213 q-132 34 -202 134.5t-70 258.5z" /> +<glyph unicode="&#xa3;" d="M-18 0l38 193q200 45 250 276l35 164h-196l36 172h197l61 299q38 185 153 282t300 97q188 0 352 -86l-88 -183q-143 74 -258 74q-185 0 -227 -205l-57 -278h333l-34 -172h-336l-33 -152q-21 -98 -68.5 -165t-130.5 -109h690l-45 -207h-972z" /> +<glyph unicode="&#xa5;" d="M106 244l33 155h273l30 148h-272l35 155h211l-199 760h232l145 -669l432 669h248l-518 -760h217l-35 -155h-274l-31 -148h274l-33 -155h-272l-53 -244h-221l51 244h-273z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M131 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM254 731q0 -168 83 -312.5t229 -230.5t317 -86q173 0 319.5 87t227.5 231.5t81 310.5 q0 165 -82 310.5t-227.5 232t-318.5 86.5q-168 0 -314.5 -84.5t-230.5 -231t-84 -313.5zM502 727q0 216 113.5 340.5t312.5 124.5q138 0 266 -66l-68 -147q-106 55 -196 55q-113 0 -175.5 -76t-62.5 -231q0 -301 238 -301q47 0 112 16t109 35v-158q-117 -51 -240 -51 q-197 0 -303 123.5t-106 335.5z" /> +<glyph unicode="&#xad;" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M131 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM254 731q0 -168 83 -312.5t229 -230.5t317 -86q173 0 319.5 87t227.5 231.5t81 310.5 q0 165 -82 310.5t-227.5 232t-318.5 86.5q-168 0 -314.5 -84.5t-230.5 -231t-84 -313.5zM608 291v878h269q337 0 337 -262q0 -83 -45.5 -145t-130.5 -98l211 -373h-200l-172 325h-91v-325h-178zM786 760h72q84 0 129 36t45 99q0 73 -45.5 101t-128.5 28h-72v-264z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M508 1241v25q97 108 225 303h264v-19q-54 -66 -158 -161.5t-175 -147.5h-156z" /> +<glyph unicode="&#x2000;" horiz-adv-x="784" /> +<glyph unicode="&#x2001;" horiz-adv-x="1569" /> +<glyph unicode="&#x2002;" horiz-adv-x="784" /> +<glyph unicode="&#x2003;" horiz-adv-x="1569" /> +<glyph unicode="&#x2004;" horiz-adv-x="523" /> +<glyph unicode="&#x2005;" horiz-adv-x="392" /> +<glyph unicode="&#x2006;" horiz-adv-x="261" /> +<glyph unicode="&#x2007;" horiz-adv-x="261" /> +<glyph unicode="&#x2008;" horiz-adv-x="196" /> +<glyph unicode="&#x2009;" horiz-adv-x="313" /> +<glyph unicode="&#x200a;" horiz-adv-x="87" /> +<glyph unicode="&#x2010;" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="&#x2011;" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="&#x2012;" horiz-adv-x="649" d="M47 446l45 203h502l-45 -203h-502z" /> +<glyph unicode="&#x2013;" horiz-adv-x="983" d="M47 453l43 194h838l-43 -194h-838z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M47 453l43 194h1821l-43 -194h-1821z" /> +<glyph unicode="&#x2018;" horiz-adv-x="393" d="M119 983q34 76 106.5 209t159.5 270h176q-122 -286 -199 -501h-237z" /> +<glyph unicode="&#x2019;" horiz-adv-x="393" d="M115 961q43 95 106 255t92 246h238l8 -22q-37 -83 -110.5 -217.5t-155.5 -261.5h-178z" /> +<glyph unicode="&#x201c;" horiz-adv-x="803" d="M119 983q34 76 106.5 209t159.5 270h176q-122 -286 -199 -501h-237zM526 983q84 190 267 479h176q-122 -286 -199 -501h-235z" /> +<glyph unicode="&#x201d;" horiz-adv-x="803" d="M115 961q43 95 106 255t92 246h238l8 -22q-37 -83 -110.5 -217.5t-155.5 -261.5h-178zM522 961q51 114 109 261t90 240h237l9 -22q-98 -220 -269 -479h-176z" /> +<glyph unicode="&#x2022;" horiz-adv-x="756" d="M152 684q0 156 83.5 252t223.5 96q100 0 158.5 -54.5t58.5 -168.5q0 -156 -82 -252t-227 -96q-102 0 -158.5 57.5t-56.5 165.5z" /> +<glyph unicode="&#x2026;" horiz-adv-x="1634" d="M834 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5zM594 94q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5zM293 94 q0 83 47 132.5t131 49.5q56 0 89.5 -31.5t33.5 -92.5q0 -78 -47.5 -129.5t-124.5 -51.5q-66 0 -97.5 35.5t-31.5 87.5z" /> +<glyph unicode="&#x202f;" horiz-adv-x="313" /> +<glyph unicode="&#x205f;" horiz-adv-x="392" /> +<glyph unicode="&#x20ac;" d="M51 492l33 155h139q15 95 27 139h-137l32 154h148q92 260 255.5 401.5t371.5 141.5q88 0 164.5 -22t156.5 -77l-102 -180q-54 34 -107 56t-119 22q-118 0 -214.5 -87t-161.5 -255h387l-33 -154h-402q-18 -67 -28 -139h340l-33 -155h-319q0 -161 60.5 -234.5t195.5 -73.5 q120 0 258 60v-203q-129 -61 -306 -61q-216 0 -330 130t-114 382h-162z" /> +<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M113 1335v127h540v-127h-198v-594h-146v594h-196zM709 741v721h215l170 -534l182 534h205v-721h-146v418l4 121h-6l-184 -539h-119l-178 539h-6l4 -115v-424h-141z" /> +<glyph unicode="&#xe000;" horiz-adv-x="1105" d="M0 1105h1105v-1105h-1105v1105z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.ttf new file mode 100644 index 000000000000..55ba3120f765 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.woff new file mode 100644 index 000000000000..0adc6df1621c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/fonts/OpenSans-SemiboldItalic-webfont.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/images/bullet.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/images/bullet.png new file mode 100644 index 000000000000..0614eb65f947 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/images/bullet.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/images/hr.gif b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/images/hr.gif new file mode 100644 index 000000000000..bdb4168de55a Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/images/hr.gif differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/images/nav-bg.gif b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/images/nav-bg.gif new file mode 100644 index 000000000000..474396561daa Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/images/nav-bg.gif differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/js/respond.js b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/js/respond.js new file mode 100644 index 000000000000..76bc26048e1a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-midnight-0.1.1/assets/js/respond.js @@ -0,0 +1,779 @@ +if(typeof Object.create!=="function"){ +Object.create=function(o){ +function F(){ +}; +F.prototype=o; +return new F(); +}; +} +var ua={toString:function(){ +return navigator.userAgent; +},test:function(s){ +return this.toString().toLowerCase().indexOf(s.toLowerCase())>-1; +}}; +ua.version=(ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1]; +ua.webkit=ua.test("webkit"); +ua.gecko=ua.test("gecko")&&!ua.webkit; +ua.opera=ua.test("opera"); +ua.ie=ua.test("msie")&&!ua.opera; +ua.ie6=ua.ie&&document.compatMode&&typeof document.documentElement.style.maxHeight==="undefined"; +ua.ie7=ua.ie&&document.documentElement&&typeof document.documentElement.style.maxHeight!=="undefined"&&typeof XDomainRequest==="undefined"; +ua.ie8=ua.ie&&typeof XDomainRequest!=="undefined"; +var domReady=function(){ +var _1=[]; +var _2=function(){ +if(!arguments.callee.done){ +arguments.callee.done=true; +for(var i=0;i<_1.length;i++){ +_1[i](); +} +} +}; +if(document.addEventListener){ +document.addEventListener("DOMContentLoaded",_2,false); +} +if(ua.ie){ +(function(){ +try{ +document.documentElement.doScroll("left"); +} +catch(e){ +setTimeout(arguments.callee,50); +return; +} +_2(); +})(); +document.onreadystatechange=function(){ +if(document.readyState==="complete"){ +document.onreadystatechange=null; +_2(); +} +}; +} +if(ua.webkit&&document.readyState){ +(function(){ +if(document.readyState!=="loading"){ +_2(); +}else{ +setTimeout(arguments.callee,10); +} +})(); +} +window.onload=_2; +return function(fn){ +if(typeof fn==="function"){ +_1[_1.length]=fn; +} +return fn; +}; +}(); +var cssHelper=function(){ +var _3={BLOCKS:/[^\s{][^{]*\{(?:[^{}]*\{[^{}]*\}[^{}]*|[^{}]*)*\}/g,BLOCKS_INSIDE:/[^\s{][^{]*\{[^{}]*\}/g,DECLARATIONS:/[a-zA-Z\-]+[^;]*:[^;]+;/g,RELATIVE_URLS:/url\(['"]?([^\/\)'"][^:\)'"]+)['"]?\)/g,REDUNDANT_COMPONENTS:/(?:\/\*([^*\\\\]|\*(?!\/))+\*\/|@import[^;]+;)/g,REDUNDANT_WHITESPACE:/\s*(,|:|;|\{|\})\s*/g,MORE_WHITESPACE:/\s{2,}/g,FINAL_SEMICOLONS:/;\}/g,NOT_WHITESPACE:/\S+/g}; +var _4,_5=false; +var _6=[]; +var _7=function(fn){ +if(typeof fn==="function"){ +_6[_6.length]=fn; +} +}; +var _8=function(){ +for(var i=0;i<_6.length;i++){ +_6[i](_4); +} +}; +var _9={}; +var _a=function(n,v){ +if(_9[n]){ +var _b=_9[n].listeners; +if(_b){ +for(var i=0;i<_b.length;i++){ +_b[i](v); +} +} +} +}; +var _c=function(_d,_e,_f){ +if(ua.ie&&!window.XMLHttpRequest){ +window.XMLHttpRequest=function(){ +return new ActiveXObject("Microsoft.XMLHTTP"); +}; +} +if(!XMLHttpRequest){ +return ""; +} +var r=new XMLHttpRequest(); +try{ +r.open("get",_d,true); +r.setRequestHeader("X_REQUESTED_WITH","XMLHttpRequest"); +} +catch(e){ +_f(); +return; +} +var _10=false; +setTimeout(function(){ +_10=true; +},5000); +document.documentElement.style.cursor="progress"; +r.onreadystatechange=function(){ +if(r.readyState===4&&!_10){ +if(!r.status&&location.protocol==="file:"||(r.status>=200&&r.status<300)||r.status===304||navigator.userAgent.indexOf("Safari")>-1&&typeof r.status==="undefined"){ +_e(r.responseText); +}else{ +_f(); +} +document.documentElement.style.cursor=""; +r=null; +} +}; +r.send(""); +}; +var _11=function(_12){ +_12=_12.replace(_3.REDUNDANT_COMPONENTS,""); +_12=_12.replace(_3.REDUNDANT_WHITESPACE,"$1"); +_12=_12.replace(_3.MORE_WHITESPACE," "); +_12=_12.replace(_3.FINAL_SEMICOLONS,"}"); +return _12; +}; +var _13={mediaQueryList:function(s){ +var o={}; +var idx=s.indexOf("{"); +var lt=s.substring(0,idx); +s=s.substring(idx+1,s.length-1); +var mqs=[],rs=[]; +var qts=lt.toLowerCase().substring(7).split(","); +for(var i=0;i<qts.length;i++){ +mqs[mqs.length]=_13.mediaQuery(qts[i],o); +} +var rts=s.match(_3.BLOCKS_INSIDE); +if(rts!==null){ +for(i=0;i<rts.length;i++){ +rs[rs.length]=_13.rule(rts[i],o); +} +} +o.getMediaQueries=function(){ +return mqs; +}; +o.getRules=function(){ +return rs; +}; +o.getListText=function(){ +return lt; +}; +o.getCssText=function(){ +return s; +}; +return o; +},mediaQuery:function(s,mql){ +s=s||""; +var not=false,_14; +var exp=[]; +var _15=true; +var _16=s.match(_3.NOT_WHITESPACE); +for(var i=0;i<_16.length;i++){ +var _17=_16[i]; +if(!_14&&(_17==="not"||_17==="only")){ +if(_17==="not"){ +not=true; +} +}else{ +if(!_14){ +_14=_17; +}else{ +if(_17.charAt(0)==="("){ +var _18=_17.substring(1,_17.length-1).split(":"); +exp[exp.length]={mediaFeature:_18[0],value:_18[1]||null}; +} +} +} +} +return {getList:function(){ +return mql||null; +},getValid:function(){ +return _15; +},getNot:function(){ +return not; +},getMediaType:function(){ +return _14; +},getExpressions:function(){ +return exp; +}}; +},rule:function(s,mql){ +var o={}; +var idx=s.indexOf("{"); +var st=s.substring(0,idx); +var ss=st.split(","); +var ds=[]; +var dts=s.substring(idx+1,s.length-1).split(";"); +for(var i=0;i<dts.length;i++){ +ds[ds.length]=_13.declaration(dts[i],o); +} +o.getMediaQueryList=function(){ +return mql||null; +}; +o.getSelectors=function(){ +return ss; +}; +o.getSelectorText=function(){ +return st; +}; +o.getDeclarations=function(){ +return ds; +}; +o.getPropertyValue=function(n){ +for(var i=0;i<ds.length;i++){ +if(ds[i].getProperty()===n){ +return ds[i].getValue(); +} +} +return null; +}; +return o; +},declaration:function(s,r){ +var idx=s.indexOf(":"); +var p=s.substring(0,idx); +var v=s.substring(idx+1); +return {getRule:function(){ +return r||null; +},getProperty:function(){ +return p; +},getValue:function(){ +return v; +}}; +}}; +var _19=function(el){ +if(typeof el.cssHelperText!=="string"){ +return; +} +var o={mediaQueryLists:[],rules:[],selectors:{},declarations:[],properties:{}}; +var _1a=o.mediaQueryLists; +var ors=o.rules; +var _1b=el.cssHelperText.match(_3.BLOCKS); +if(_1b!==null){ +for(var i=0;i<_1b.length;i++){ +if(_1b[i].substring(0,7)==="@media "){ +_1a[_1a.length]=_13.mediaQueryList(_1b[i]); +ors=o.rules=ors.concat(_1a[_1a.length-1].getRules()); +}else{ +ors[ors.length]=_13.rule(_1b[i]); +} +} +} +var oss=o.selectors; +var _1c=function(r){ +var ss=r.getSelectors(); +for(var i=0;i<ss.length;i++){ +var n=ss[i]; +if(!oss[n]){ +oss[n]=[]; +} +oss[n][oss[n].length]=r; +} +}; +for(i=0;i<ors.length;i++){ +_1c(ors[i]); +} +var ods=o.declarations; +for(i=0;i<ors.length;i++){ +ods=o.declarations=ods.concat(ors[i].getDeclarations()); +} +var ops=o.properties; +for(i=0;i<ods.length;i++){ +var n=ods[i].getProperty(); +if(!ops[n]){ +ops[n]=[]; +} +ops[n][ops[n].length]=ods[i]; +} +el.cssHelperParsed=o; +_4[_4.length]=el; +return o; +}; +var _1d=function(el,s){ +el.cssHelperText=_11(s||el.innerHTML); +return _19(el); +}; +var _1e=function(){ +_5=true; +_4=[]; +var _1f=[]; +var _20=function(){ +for(var i=0;i<_1f.length;i++){ +_19(_1f[i]); +} +var _21=document.getElementsByTagName("style"); +for(i=0;i<_21.length;i++){ +_1d(_21[i]); +} +_5=false; +_8(); +}; +var _22=document.getElementsByTagName("link"); +for(var i=0;i<_22.length;i++){ +var _23=_22[i]; +if(_23.getAttribute("rel").indexOf("style")>-1&&_23.href&&_23.href.length!==0&&!_23.disabled){ +_1f[_1f.length]=_23; +} +} +if(_1f.length>0){ +var c=0; +var _24=function(){ +c++; +if(c===_1f.length){ +_20(); +} +}; +var _25=function(_26){ +var _27=_26.href; +_c(_27,function(_28){ +_28=_11(_28).replace(_3.RELATIVE_URLS,"url("+_27.substring(0,_27.lastIndexOf("/"))+"/$1)"); +_26.cssHelperText=_28; +_24(); +},_24); +}; +for(i=0;i<_1f.length;i++){ +_25(_1f[i]); +} +}else{ +_20(); +} +}; +var _29={mediaQueryLists:"array",rules:"array",selectors:"object",declarations:"array",properties:"object"}; +var _2a={mediaQueryLists:null,rules:null,selectors:null,declarations:null,properties:null}; +var _2b=function(_2c,v){ +if(_2a[_2c]!==null){ +if(_29[_2c]==="array"){ +return (_2a[_2c]=_2a[_2c].concat(v)); +}else{ +var c=_2a[_2c]; +for(var n in v){ +if(v.hasOwnProperty(n)){ +if(!c[n]){ +c[n]=v[n]; +}else{ +c[n]=c[n].concat(v[n]); +} +} +} +return c; +} +} +}; +var _2d=function(_2e){ +_2a[_2e]=(_29[_2e]==="array")?[]:{}; +for(var i=0;i<_4.length;i++){ +_2b(_2e,_4[i].cssHelperParsed[_2e]); +} +return _2a[_2e]; +}; +domReady(function(){ +var els=document.body.getElementsByTagName("*"); +for(var i=0;i<els.length;i++){ +els[i].checkedByCssHelper=true; +} +if(document.implementation.hasFeature("MutationEvents","2.0")||window.MutationEvent){ +document.body.addEventListener("DOMNodeInserted",function(e){ +var el=e.target; +if(el.nodeType===1){ +_a("DOMElementInserted",el); +el.checkedByCssHelper=true; +} +},false); +}else{ +setInterval(function(){ +var els=document.body.getElementsByTagName("*"); +for(var i=0;i<els.length;i++){ +if(!els[i].checkedByCssHelper){ +_a("DOMElementInserted",els[i]); +els[i].checkedByCssHelper=true; +} +} +},1000); +} +}); +var _2f=function(d){ +if(typeof window.innerWidth!="undefined"){ +return window["inner"+d]; +}else{ +if(typeof document.documentElement!="undefined"&&typeof document.documentElement.clientWidth!="undefined"&&document.documentElement.clientWidth!=0){ +return document.documentElement["client"+d]; +} +} +}; +return {addStyle:function(s,_30){ +var el=document.createElement("style"); +el.setAttribute("type","text/css"); +document.getElementsByTagName("head")[0].appendChild(el); +if(el.styleSheet){ +el.styleSheet.cssText=s; +}else{ +el.appendChild(document.createTextNode(s)); +} +el.addedWithCssHelper=true; +if(typeof _30==="undefined"||_30===true){ +cssHelper.parsed(function(_31){ +var o=_1d(el,s); +for(var n in o){ +if(o.hasOwnProperty(n)){ +_2b(n,o[n]); +} +} +_a("newStyleParsed",el); +}); +}else{ +el.parsingDisallowed=true; +} +return el; +},removeStyle:function(el){ +return el.parentNode.removeChild(el); +},parsed:function(fn){ +if(_5){ +_7(fn); +}else{ +if(typeof _4!=="undefined"){ +if(typeof fn==="function"){ +fn(_4); +} +}else{ +_7(fn); +_1e(); +} +} +},mediaQueryLists:function(fn){ +cssHelper.parsed(function(_32){ +fn(_2a.mediaQueryLists||_2d("mediaQueryLists")); +}); +},rules:function(fn){ +cssHelper.parsed(function(_33){ +fn(_2a.rules||_2d("rules")); +}); +},selectors:function(fn){ +cssHelper.parsed(function(_34){ +fn(_2a.selectors||_2d("selectors")); +}); +},declarations:function(fn){ +cssHelper.parsed(function(_35){ +fn(_2a.declarations||_2d("declarations")); +}); +},properties:function(fn){ +cssHelper.parsed(function(_36){ +fn(_2a.properties||_2d("properties")); +}); +},broadcast:_a,addListener:function(n,fn){ +if(typeof fn==="function"){ +if(!_9[n]){ +_9[n]={listeners:[]}; +} +_9[n].listeners[_9[n].listeners.length]=fn; +} +},removeListener:function(n,fn){ +if(typeof fn==="function"&&_9[n]){ +var ls=_9[n].listeners; +for(var i=0;i<ls.length;i++){ +if(ls[i]===fn){ +ls.splice(i,1); +i-=1; +} +} +} +},getViewportWidth:function(){ +return _2f("Width"); +},getViewportHeight:function(){ +return _2f("Height"); +}}; +}(); +domReady(function enableCssMediaQueries(){ +var _37; +var _38={LENGTH_UNIT:/[0-9]+(em|ex|px|in|cm|mm|pt|pc)$/,RESOLUTION_UNIT:/[0-9]+(dpi|dpcm)$/,ASPECT_RATIO:/^[0-9]+\/[0-9]+$/,ABSOLUTE_VALUE:/^[0-9]*(\.[0-9]+)*$/}; +var _39=[]; +var _3a=function(){ +var id="css3-mediaqueries-test"; +var el=document.createElement("div"); +el.id=id; +var _3b=cssHelper.addStyle("@media all and (width) { #"+id+" { width: 1px !important; } }",false); +document.body.appendChild(el); +var ret=el.offsetWidth===1; +_3b.parentNode.removeChild(_3b); +el.parentNode.removeChild(el); +_3a=function(){ +return ret; +}; +return ret; +}; +var _3c=function(){ +_37=document.createElement("div"); +_37.style.cssText="position:absolute;top:-9999em;left:-9999em;"+"margin:0;border:none;padding:0;width:1em;font-size:1em;"; +document.body.appendChild(_37); +if(_37.offsetWidth!==16){ +_37.style.fontSize=16/_37.offsetWidth+"em"; +} +_37.style.width=""; +}; +var _3d=function(_3e){ +_37.style.width=_3e; +var _3f=_37.offsetWidth; +_37.style.width=""; +return _3f; +}; +var _40=function(_41,_42){ +var l=_41.length; +var min=(_41.substring(0,4)==="min-"); +var max=(!min&&_41.substring(0,4)==="max-"); +if(_42!==null){ +var _43; +var _44; +if(_38.LENGTH_UNIT.exec(_42)){ +_43="length"; +_44=_3d(_42); +}else{ +if(_38.RESOLUTION_UNIT.exec(_42)){ +_43="resolution"; +_44=parseInt(_42,10); +var _45=_42.substring((_44+"").length); +}else{ +if(_38.ASPECT_RATIO.exec(_42)){ +_43="aspect-ratio"; +_44=_42.split("/"); +}else{ +if(_38.ABSOLUTE_VALUE){ +_43="absolute"; +_44=_42; +}else{ +_43="unknown"; +} +} +} +} +} +var _46,_47; +if("device-width"===_41.substring(l-12,l)){ +_46=screen.width; +if(_42!==null){ +if(_43==="length"){ +return ((min&&_46>=_44)||(max&&_46<_44)||(!min&&!max&&_46===_44)); +}else{ +return false; +} +}else{ +return _46>0; +} +}else{ +if("device-height"===_41.substring(l-13,l)){ +_47=screen.height; +if(_42!==null){ +if(_43==="length"){ +return ((min&&_47>=_44)||(max&&_47<_44)||(!min&&!max&&_47===_44)); +}else{ +return false; +} +}else{ +return _47>0; +} +}else{ +if("width"===_41.substring(l-5,l)){ +_46=document.documentElement.clientWidth||document.body.clientWidth; +if(_42!==null){ +if(_43==="length"){ +return ((min&&_46>=_44)||(max&&_46<_44)||(!min&&!max&&_46===_44)); +}else{ +return false; +} +}else{ +return _46>0; +} +}else{ +if("height"===_41.substring(l-6,l)){ +_47=document.documentElement.clientHeight||document.body.clientHeight; +if(_42!==null){ +if(_43==="length"){ +return ((min&&_47>=_44)||(max&&_47<_44)||(!min&&!max&&_47===_44)); +}else{ +return false; +} +}else{ +return _47>0; +} +}else{ +if("device-aspect-ratio"===_41.substring(l-19,l)){ +return _43==="aspect-ratio"&&screen.width*_44[1]===screen.height*_44[0]; +}else{ +if("color-index"===_41.substring(l-11,l)){ +var _48=Math.pow(2,screen.colorDepth); +if(_42!==null){ +if(_43==="absolute"){ +return ((min&&_48>=_44)||(max&&_48<_44)||(!min&&!max&&_48===_44)); +}else{ +return false; +} +}else{ +return _48>0; +} +}else{ +if("color"===_41.substring(l-5,l)){ +var _49=screen.colorDepth; +if(_42!==null){ +if(_43==="absolute"){ +return ((min&&_49>=_44)||(max&&_49<_44)||(!min&&!max&&_49===_44)); +}else{ +return false; +} +}else{ +return _49>0; +} +}else{ +if("resolution"===_41.substring(l-10,l)){ +var res; +if(_45==="dpcm"){ +res=_3d("1cm"); +}else{ +res=_3d("1in"); +} +if(_42!==null){ +if(_43==="resolution"){ +return ((min&&res>=_44)||(max&&res<_44)||(!min&&!max&&res===_44)); +}else{ +return false; +} +}else{ +return res>0; +} +}else{ +return false; +} +} +} +} +} +} +} +} +}; +var _4a=function(mq){ +var _4b=mq.getValid(); +var _4c=mq.getExpressions(); +var l=_4c.length; +if(l>0){ +for(var i=0;i<l&&_4b;i++){ +_4b=_40(_4c[i].mediaFeature,_4c[i].value); +} +var not=mq.getNot(); +return (_4b&&!not||not&&!_4b); +} +}; +var _4d=function(mql){ +var mqs=mql.getMediaQueries(); +var t={}; +for(var i=0;i<mqs.length;i++){ +if(_4a(mqs[i])){ +t[mqs[i].getMediaType()]=true; +} +} +var s=[],c=0; +for(var n in t){ +if(t.hasOwnProperty(n)){ +if(c>0){ +s[c++]=","; +} +s[c++]=n; +} +} +if(s.length>0){ +_39[_39.length]=cssHelper.addStyle("@media "+s.join("")+"{"+mql.getCssText()+"}",false); +} +}; +var _4e=function(_4f){ +for(var i=0;i<_4f.length;i++){ +_4d(_4f[i]); +} +if(ua.ie){ +document.documentElement.style.display="block"; +setTimeout(function(){ +document.documentElement.style.display=""; +},0); +setTimeout(function(){ +cssHelper.broadcast("cssMediaQueriesTested"); +},100); +}else{ +cssHelper.broadcast("cssMediaQueriesTested"); +} +}; +var _50=function(){ +for(var i=0;i<_39.length;i++){ +cssHelper.removeStyle(_39[i]); +} +_39=[]; +cssHelper.mediaQueryLists(_4e); +}; +var _51=0; +var _52=function(){ +var _53=cssHelper.getViewportWidth(); +var _54=cssHelper.getViewportHeight(); +if(ua.ie){ +var el=document.createElement("div"); +el.style.position="absolute"; +el.style.top="-9999em"; +el.style.overflow="scroll"; +document.body.appendChild(el); +_51=el.offsetWidth-el.clientWidth; +document.body.removeChild(el); +} +var _55; +var _56=function(){ +var vpw=cssHelper.getViewportWidth(); +var vph=cssHelper.getViewportHeight(); +if(Math.abs(vpw-_53)>_51||Math.abs(vph-_54)>_51){ +_53=vpw; +_54=vph; +clearTimeout(_55); +_55=setTimeout(function(){ +if(!_3a()){ +_50(); +}else{ +cssHelper.broadcast("cssMediaQueriesTested"); +} +},500); +} +}; +window.onresize=function(){ +var x=window.onresize||function(){ +}; +return function(){ +x(); +_56(); +}; +}(); +}; +var _57=document.documentElement; +_57.style.marginLeft="-32767px"; +setTimeout(function(){ +_57.style.marginTop=""; +},20000); +return function(){ +if(!_3a()){ +cssHelper.addListener("newStyleParsed",function(el){ +_4e(el.cssHelperParsed.mediaQueryLists); +}); +cssHelper.addListener("cssMediaQueriesTested",function(){ +if(ua.ie){ +_57.style.width="1px"; +} +setTimeout(function(){ +_57.style.width=""; +_57.style.marginLeft=""; +},0); +cssHelper.removeListener("cssMediaQueriesTested",arguments.callee); +}); +_3c(); +_50(); +}else{ +_57.style.marginLeft=""; +} +_52(); +}; +}()); +try{ +document.execCommand("BackgroundImageCache",false,true); +} +catch(e){ +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/README.md new file mode 100644 index 000000000000..c53707b7022b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/README.md @@ -0,0 +1,93 @@ +# The Minimal theme + +[![Build Status](https://travis-ci.org/pages-themes/minimal.svg?branch=master)](https://travis-ci.org/pages-themes/minimal) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-minimal.svg)](https://badge.fury.io/rb/jekyll-theme-minimal) + +*Minimal is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/minimal), or even [use it today](#usage).* + +![Thumbnail of minimal](thumbnail.png) + +## Usage + +To use the Minimal theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-minimal + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + + + +## Customizing + +### Configuration variables + +Minimal will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +logo: [Location of the logo] +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/minimal/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +## Roadmap + +See the [open issues](https://github.com/pages-themes/minimal/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Minimal theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Minimal? We'd love your help. Minimal is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/minimal`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..4ea2be12e24f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_layouts/default.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + +{% seo %} + <link rel="stylesheet" href="{{ "/assets/css/style.css?v=" | append: site.github.build_revision | relative_url }}"> + <!--[if lt IE 9]> + <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script> + <![endif]--> + </head> + <body> + <div class="wrapper"> + <header> + <h1><a href="{{ "/" | absolute_url }}">{{ site.title | default: site.github.repository_name }}</a></h1> + + {% if site.logo %} + <img src="{{site.logo | relative_url}}" alt="Logo" /> + {% endif %} + + <p>{{ site.description | default: site.github.project_tagline }}</p> + + {% if site.github.is_project_page %} + <p class="view"><a href="{{ site.github.repository_url }}">View the Project on GitHub <small>{{ site.github.repository_nwo }}</small></a></p> + {% endif %} + + {% if site.github.is_user_page %} + <p class="view"><a href="{{ site.github.owner_url }}">View My GitHub Profile</a></p> + {% endif %} + + {% if site.show_downloads %} + <ul> + <li><a href="{{ site.github.zip_url }}">Download <strong>ZIP File</strong></a></li> + <li><a href="{{ site.github.tar_url }}">Download <strong>TAR Ball</strong></a></li> + <li><a href="{{ site.github.repository_url }}">View On <strong>GitHub</strong></a></li> + </ul> + {% endif %} + </header> + <section> + + {{ content }} + + </section> + <footer> + {% if site.github.is_project_page %} + <p>This project is maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p> + {% endif %} + <p><small>Hosted on GitHub Pages &mdash; Theme by <a href="https://github.com/orderedlist">orderedlist</a></small></p> + </footer> + </div> + <script src="{{ "/assets/js/scale.fix.js" | relative_url }}"></script> + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_layouts/post.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_layouts/post.html new file mode 100644 index 000000000000..0676aff31c49 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_layouts/post.html @@ -0,0 +1,14 @@ +--- +layout: default +--- + +<small>{{ page.date | date: "%-d %B %Y" }}</small> +<h1>{{ page.title }}</h1> + +<p class="view">by {{ page.author | default: site.author }}</p> + +{{content}} + +{% if page.tags %} + <small>tags: <em>{{ page.tags | join: "</em> - <em>" }}</em></small> +{% endif %} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_sass/fonts.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_sass/fonts.scss new file mode 100644 index 000000000000..04c28e93515c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_sass/fonts.scss @@ -0,0 +1,55 @@ +@font-face { + font-family: 'Noto Sans'; + font-weight: 400; + font-style: normal; + src: url('../fonts/Noto-Sans-regular/Noto-Sans-regular.eot'); + src: url('../fonts/Noto-Sans-regular/Noto-Sans-regular.eot?#iefix') format('embedded-opentype'), + local('Noto Sans'), + local('Noto-Sans-regular'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.woff2') format('woff2'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.woff') format('woff'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.ttf') format('truetype'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.svg#NotoSans') format('svg'); +} + +@font-face { + font-family: 'Noto Sans'; + font-weight: 700; + font-style: normal; + src: url('../fonts/Noto-Sans-700/Noto-Sans-700.eot'); + src: url('../fonts/Noto-Sans-700/Noto-Sans-700.eot?#iefix') format('embedded-opentype'), + local('Noto Sans Bold'), + local('Noto-Sans-700'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.woff2') format('woff2'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.woff') format('woff'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.ttf') format('truetype'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.svg#NotoSans') format('svg'); +} + +@font-face { + font-family: 'Noto Sans'; + font-weight: 400; + font-style: italic; + src: url('../fonts/Noto-Sans-italic/Noto-Sans-italic.eot'); + src: url('../fonts/Noto-Sans-italic/Noto-Sans-italic.eot?#iefix') format('embedded-opentype'), + local('Noto Sans Italic'), + local('Noto-Sans-italic'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.woff2') format('woff2'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.woff') format('woff'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.ttf') format('truetype'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.svg#NotoSans') format('svg'); +} + +@font-face { + font-family: 'Noto Sans'; + font-weight: 700; + font-style: italic; + src: url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot'); + src: url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot?#iefix') format('embedded-opentype'), + local('Noto Sans Bold Italic'), + local('Noto-Sans-700italic'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2') format('woff2'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff') format('woff'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf') format('truetype'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg#NotoSans') format('svg'); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_sass/jekyll-theme-minimal.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_sass/jekyll-theme-minimal.scss new file mode 100644 index 000000000000..8f7a70e70854 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_sass/jekyll-theme-minimal.scss @@ -0,0 +1,272 @@ +@import "fonts"; +@import "rouge-github"; + +body { + background-color: #fff; + padding:50px; + font: 14px/1.5 "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + color:#727272; + font-weight:400; +} + +h1, h2, h3, h4, h5, h6 { + color:#222; + margin:0 0 20px; +} + +p, ul, ol, table, pre, dl { + margin:0 0 20px; +} + +h1, h2, h3 { + line-height:1.1; +} + +h1 { + font-size:28px; +} + +h2 { + color:#393939; +} + +h3, h4, h5, h6 { + color:#494949; +} + +a { + color:#267CB9; + text-decoration:none; +} + +a:hover, a:focus { + color:#069; + font-weight: bold; +} + +a small { + font-size:11px; + color:#777; + margin-top:-0.3em; + display:block; +} + +a:hover small { + color:#777; +} + +.wrapper { + width:860px; + margin:0 auto; +} + +blockquote { + border-left:1px solid #e5e5e5; + margin:0; + padding:0 0 0 20px; + font-style:italic; +} + +code, pre { + font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, Consolas, Liberation Mono, DejaVu Sans Mono, Courier New, monospace; + color:#333; +} + +pre { + padding:8px 15px; + background: #f8f8f8; + border-radius:5px; + border:1px solid #e5e5e5; + overflow-x: auto; +} + +table { + width:100%; + border-collapse:collapse; +} + +th, td { + text-align:left; + padding:5px 10px; + border-bottom:1px solid #e5e5e5; +} + +dt { + color:#444; + font-weight:700; +} + +th { + color:#444; +} + +img { + max-width:100%; +} + +header { + width:270px; + float:left; + position:fixed; + -webkit-font-smoothing:subpixel-antialiased; +} + +header ul { + list-style:none; + height:40px; + padding:0; + background: #f4f4f4; + border-radius:5px; + border:1px solid #e0e0e0; + width:270px; +} + +header li { + width:89px; + float:left; + border-right:1px solid #e0e0e0; + height:40px; +} + +header li:first-child a { + border-radius:5px 0 0 5px; +} + +header li:last-child a { + border-radius:0 5px 5px 0; +} + +header ul a { + line-height:1; + font-size:11px; + color:#676767; + display:block; + text-align:center; + padding-top:6px; + height:34px; +} + +header ul a:hover, header ul a:focus { + color:#675C5C; + font-weight:bold; +} + +header ul a:active { + background-color:#f0f0f0; +} + +strong { + color:#222; + font-weight:700; +} + +header ul li + li + li { + border-right:none; + width:89px; +} + +header ul a strong { + font-size:14px; + display:block; + color:#222; +} + +section { + width:500px; + float:right; + padding-bottom:50px; +} + +small { + font-size:11px; +} + +hr { + border:0; + background:#e5e5e5; + height:1px; + margin:0 0 20px; +} + +footer { + width:270px; + float:left; + position:fixed; + bottom:50px; + -webkit-font-smoothing:subpixel-antialiased; +} + +@media print, screen and (max-width: 960px) { + + div.wrapper { + width:auto; + margin:0; + } + + header, section, footer { + float:none; + position:static; + width:auto; + } + + header { + padding-right:320px; + } + + section { + border:1px solid #e5e5e5; + border-width:1px 0; + padding:20px 0; + margin:0 0 20px; + } + + header a small { + display:inline; + } + + header ul { + position:absolute; + right:50px; + top:52px; + } +} + +@media print, screen and (max-width: 720px) { + body { + word-wrap:break-word; + } + + header { + padding:0; + } + + header ul, header p.view { + position:static; + } + + pre, code { + word-wrap:normal; + } +} + +@media print, screen and (max-width: 480px) { + body { + padding:15px; + } + + header ul { + width:99%; + } + + header li, header ul li + li + li { + width:33%; + } +} + +@media print { + body { + padding:0.4in; + font-size:12pt; + color:#444; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_sass/rouge-github.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_sass/rouge-github.scss new file mode 100644 index 000000000000..daf76adee989 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/_sass/rouge-github.scss @@ -0,0 +1,209 @@ +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight .cm { + color: #999988; + font-style: italic; +} +.highlight .cp { + color: #999999; + font-weight: bold; +} +.highlight .c1 { + color: #999988; + font-style: italic; +} +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; +} +.highlight .c, .highlight .cd { + color: #999988; + font-style: italic; +} +.highlight .err { + color: #a61717; + background-color: #e3d2d2; +} +.highlight .gd { + color: #000000; + background-color: #ffdddd; +} +.highlight .ge { + color: #000000; + font-style: italic; +} +.highlight .gr { + color: #aa0000; +} +.highlight .gh { + color: #999999; +} +.highlight .gi { + color: #000000; + background-color: #ddffdd; +} +.highlight .go { + color: #888888; +} +.highlight .gp { + color: #555555; +} +.highlight .gs { + font-weight: bold; +} +.highlight .gu { + color: #aaaaaa; +} +.highlight .gt { + color: #aa0000; +} +.highlight .kc { + color: #000000; + font-weight: bold; +} +.highlight .kd { + color: #000000; + font-weight: bold; +} +.highlight .kn { + color: #000000; + font-weight: bold; +} +.highlight .kp { + color: #000000; + font-weight: bold; +} +.highlight .kr { + color: #000000; + font-weight: bold; +} +.highlight .kt { + color: #445588; + font-weight: bold; +} +.highlight .k, .highlight .kv { + color: #000000; + font-weight: bold; +} +.highlight .mf { + color: #009999; +} +.highlight .mh { + color: #009999; +} +.highlight .il { + color: #009999; +} +.highlight .mi { + color: #009999; +} +.highlight .mo { + color: #009999; +} +.highlight .m, .highlight .mb, .highlight .mx { + color: #009999; +} +.highlight .sb { + color: #d14; +} +.highlight .sc { + color: #d14; +} +.highlight .sd { + color: #d14; +} +.highlight .s2 { + color: #d14; +} +.highlight .se { + color: #d14; +} +.highlight .sh { + color: #d14; +} +.highlight .si { + color: #d14; +} +.highlight .sx { + color: #d14; +} +.highlight .sr { + color: #009926; +} +.highlight .s1 { + color: #d14; +} +.highlight .ss { + color: #990073; +} +.highlight .s { + color: #d14; +} +.highlight .na { + color: #008080; +} +.highlight .bp { + color: #999999; +} +.highlight .nb { + color: #0086B3; +} +.highlight .nc { + color: #445588; + font-weight: bold; +} +.highlight .no { + color: #008080; +} +.highlight .nd { + color: #3c5d5d; + font-weight: bold; +} +.highlight .ni { + color: #800080; +} +.highlight .ne { + color: #990000; + font-weight: bold; +} +.highlight .nf { + color: #990000; + font-weight: bold; +} +.highlight .nl { + color: #990000; + font-weight: bold; +} +.highlight .nn { + color: #555555; +} +.highlight .nt { + color: #000080; +} +.highlight .vc { + color: #008080; +} +.highlight .vg { + color: #008080; +} +.highlight .vi { + color: #008080; +} +.highlight .nv { + color: #008080; +} +.highlight .ow { + color: #000000; + font-weight: bold; +} +.highlight .o { + color: #000000; + font-weight: bold; +} +.highlight .w { + color: #bbbbbb; +} +.highlight { + background-color: #f8f8f8; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..0a14227a3e0f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import "jekyll-theme-minimal"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.eot new file mode 100644 index 000000000000..03bf93fec2a7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.svg new file mode 100644 index 000000000000..925fe47475a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.svg @@ -0,0 +1,336 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<defs > +<font id="NotoSans" horiz-adv-x="1254" ><font-face + font-family="Noto Sans" + units-per-em="2048" + panose-1="2 11 8 2 4 5 4 2 2 4" + ascent="2189" + descent="-600" + alphabetic="0" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="825" d="M570 485H326L275 1462H621L570 485ZM271 143Q271 190 284 222T322 275T378 304T447 313Q482 313 513 304T569 275T607 223T621 143Q621 98 607 66T569 13T514 -17T447 -27Q410 -27 378 -18T322 13T285 66T271 143Z" /> +<glyph unicode="&quot;" horiz-adv-x="1118" d="M502 1494L461 966H264L223 1494H502ZM924 1494L883 966H686L645 1494H924Z" /> +<glyph unicode="#" horiz-adv-x="1363" d="M1019 767L972 535H1217V329H933L871 0H651L714 329H520L459 0H244L303 329H79V535H342L389 767H151V976H426L486 1295H705L645 976H843L904 1295H1119L1058 976H1285V767H1019ZM559 535H755L802 767H606L559 535Z" /> +<glyph unicode="$" horiz-adv-x="1171" d="M1092 457Q1092 298 977 202T655 86V-119H518V82Q274 87 90 168V432Q177 389 299 356T518 317V627L451 653Q253 731 171 822T88 1049Q88 1194 201 1287T518 1401V1554H655V1405Q884 1395 1069 1313L975 1079Q819 1143 +655 1157V862Q850 787 932 732T1053 611T1092 457ZM791 442Q791 484 757 513T655 573V324Q791 347 791 442ZM389 1049Q389 1005 419 977T518 918V1153Q389 1134 389 1049Z" /> +<glyph unicode="%" horiz-adv-x="1842" d="M324 924Q324 842 349 802T429 761Q483 761 509 801T535 924Q535 1086 429 1086Q374 1086 349 1046T324 924ZM777 926Q777 839 757 770T693 653T584 580T427 554Q342 554 278 579T170 652T104 769T82 926Q82 1013 102 +1082T164 1198T272 1270T427 1295Q513 1295 578 1270T688 1198T754 1082T777 926ZM1434 1274L633 0H404L1205 1274H1434ZM1307 351Q1307 269 1332 229T1412 188Q1466 188 1492 228T1518 351Q1518 513 1412 513Q1357 513 1332 473T1307 351ZM1760 353Q1760 266 1740 +197T1676 81T1567 8T1410 -18Q1325 -18 1261 7T1154 80T1088 197T1066 353Q1066 440 1086 509T1148 625T1255 697T1410 722Q1496 722 1561 697T1671 625T1737 509T1760 353Z" /> +<glyph unicode="&amp;" horiz-adv-x="1536" d="M1536 0H1159L1044 113Q853 -20 612 -20Q368 -20 225 92T82 395Q82 532 142 628T350 809Q275 895 241 973T207 1145Q207 1297 323 1390T635 1483Q821 1483 932 1397T1044 1165Q1044 1046 975 948T752 760L1036 483Q1107 +600 1159 784H1477Q1441 649 1378 521T1235 293L1536 0ZM403 424Q403 338 467 287T633 236Q759 236 860 297L528 627Q470 583 437 535T403 424ZM762 1133Q762 1186 726 1216T633 1247Q566 1247 528 1215T489 1124Q489 1036 584 930Q670 978 716 1024T762 1133Z" +/> +<glyph unicode="&apos;" horiz-adv-x="696" d="M502 1493L461 965H264L223 1493H502Z" /> +<glyph unicode="(" horiz-adv-x="791" d="M135 673Q135 816 153 955T208 1225T301 1476T436 1703H686Q545 1482 473 1218T401 676Q401 540 419 405T473 141T562 -109T684 -338H436Q358 -235 302 -118T208 128T153 394T135 673Z" /> +<glyph unicode=")" horiz-adv-x="791" d="M656 692Q656 549 638 410T583 140T490 -111T355 -338H105Q246 -117 318 147T390 689Q390 825 372 960T318 1224T229 1474T107 1703H355Q433 1600 489 1483T583 1237T638 971T656 692Z" /> +<glyph unicode="*" horiz-adv-x="1243" d="M761 1525L720 1157L1093 1261L1126 1009L786 985L1009 688L782 567L626 880L489 569L253 688L474 985L136 1011L175 1261L540 1157L499 1525H761Z" /> +<glyph unicode="+" horiz-adv-x="1168" d="M475 552H108V771H475V1140H694V771H1060V552H694V188H475V552Z" /> +<glyph unicode="," horiz-adv-x="594" d="M444 288L459 264Q445 206 426 142T383 12T334 -119T283 -244H63Q78 -179 92 -109T120 30T145 165T163 288H444Z" /> +<glyph unicode="-" horiz-adv-x="749" d="M106 484V734H643V484H106Z" /> +<glyph unicode="." horiz-adv-x="584" d="M117 143Q117 190 130 222T168 275T224 304T293 313Q328 313 359 304T415 275T453 223T467 143Q467 98 453 66T415 13T360 -17T293 -27Q256 -27 224 -18T168 13T131 66T117 143Z" /> +<glyph unicode="/" horiz-adv-x="966" d="M894 1705L334 -339H72L632 1705H894Z" /> +<glyph unicode="0" horiz-adv-x="1128" d="M1065 731Q1065 554 1038 415T950 179T794 31T563 -20Q436 -20 342 31T186 179T94 415T63 731Q63 908 90 1048T178 1285T333 1433T563 1485Q689 1485 783 1434T940 1286T1034 1049T1065 731ZM371 731Q371 481 414 355T563 +229Q667 229 712 354T758 731Q758 982 713 1108T563 1235Q510 1235 474 1203T414 1108T381 951T371 731Z" /> +<glyph unicode="1" horiz-adv-x="1128" d="M817 0H508V846Q508 872 508 908T510 984T513 1064T516 1137Q511 1131 499 1119T472 1093T441 1063T410 1036L242 901L92 1087L563 1462H817V0Z" /> +<glyph unicode="2" horiz-adv-x="1128" d="M1063 0H82V215L426 586Q491 656 544 715T635 830T694 944T715 1069Q715 1143 671 1184T551 1225Q472 1225 399 1186T246 1075L78 1274Q123 1315 172 1352T280 1419T410 1465T569 1483Q674 1483 757 1454T900 1372T990 +1242T1022 1071Q1022 985 992 907T910 753T790 603T643 451L467 274V260H1063V0Z" /> +<glyph unicode="3" horiz-adv-x="1128" d="M1006 1135Q1006 1059 982 999T915 893T815 817T690 770V764Q867 742 958 657T1049 426Q1049 330 1015 249T909 107T729 14T473 -20Q355 -20 251 -1T57 59V322Q102 298 152 280T252 250T350 231T442 225Q528 225 585 +241T676 286T724 355T739 444Q739 489 721 525T661 587T552 627T387 641H283V858H385Q477 858 538 874T635 919T687 986T702 1067Q702 1145 654 1189T500 1233Q452 1233 411 1224T334 1200T269 1168T215 1133L59 1339Q101 1370 150 1396T258 1441T383 1472T526 +1483Q634 1483 722 1460T874 1392T971 1283T1006 1135Z" /> +<glyph unicode="4" horiz-adv-x="1128" d="M1085 303H909V0H608V303H4V518L625 1462H909V543H1085V303ZM608 543V791Q608 804 608 828T610 884T612 948T615 1011T618 1063T621 1096H612Q594 1054 572 1007T520 913L276 543H608Z" /> +<glyph unicode="5" horiz-adv-x="1128" d="M598 934Q692 934 773 905T914 820T1008 681T1042 489Q1042 370 1005 276T896 116T718 15T473 -20Q418 -20 364 -15T261 -1T167 24T86 59V326Q121 306 167 289T262 259T362 239T457 231Q591 231 661 286T731 463Q731 +571 663 627T451 684Q425 684 396 681T338 673T283 663T238 651L115 717L170 1462H942V1200H438L414 913Q446 920 488 927T598 934Z" /> +<glyph unicode="6" horiz-adv-x="1128" d="M76 621Q76 726 87 830T128 1029T208 1207T336 1349T522 1444T776 1479Q797 1479 822 1478T872 1476T922 1471T965 1464V1217Q927 1226 885 1231T799 1237Q664 1237 577 1204T439 1110T367 966T340 780H352Q372 816 400 +847T467 901T552 937T659 950Q754 950 830 919T958 829T1039 684T1067 487Q1067 368 1034 274T938 115T788 15T590 -20Q482 -20 388 18T225 136T116 335T76 621ZM584 227Q625 227 658 242T716 289T754 369T768 483Q768 590 724 651T588 713Q542 713 504 695T439 +648T398 583T383 510Q383 459 395 409T433 318T496 252T584 227Z" /> +<glyph unicode="7" horiz-adv-x="1128" d="M207 0L727 1200H55V1460H1063V1266L530 0H207Z" /> +<glyph unicode="8" horiz-adv-x="1128" d="M565 1481Q656 1481 737 1459T879 1393T976 1283T1012 1128Q1012 1062 992 1009T937 912T854 834T750 772Q808 741 863 703T962 618T1031 511T1057 379Q1057 288 1021 214T920 88T765 8T565 -20Q447 -20 355 7T200 84T105 +207T72 371Q72 446 94 506T154 614T243 699T352 764Q303 795 260 831T186 912T136 1011T117 1130Q117 1217 153 1282T252 1392T395 1459T565 1481ZM358 389Q358 349 371 316T409 258T473 221T561 207Q666 207 718 256T770 387Q770 429 753 462T708 524T645 577T575 +623L553 637Q509 615 473 590T412 534T372 467T358 389ZM563 1255Q530 1255 502 1245T453 1216T420 1169T408 1106Q408 1064 420 1034T454 980T504 938T565 901Q596 917 624 936T673 979T708 1035T721 1106Q721 1141 709 1169T676 1216T626 1245T563 1255Z" /> +<glyph unicode="9" horiz-adv-x="1128" d="M1055 838Q1055 733 1044 629T1003 429T923 252T795 109T609 15T354 -20Q333 -20 308 -19T258 -17T208 -13T166 -6V242Q203 232 245 227T332 221Q467 221 554 254T692 348T764 493T791 678H778Q758 642 730 611T664 557T578 +521T471 508Q376 508 300 539T172 629T91 774T63 971Q63 1090 96 1184T192 1343T342 1444T541 1479Q649 1479 743 1441T906 1323T1015 1123T1055 838ZM547 1231Q506 1231 472 1216T414 1170T376 1090T362 975Q362 869 407 807T543 745Q589 745 627 763T692 810T733 +875T748 948Q748 999 736 1049T698 1140T635 1206T547 1231Z" /> +<glyph unicode=":" horiz-adv-x="663" d="M156 143Q156 190 169 222T207 275T263 304T332 313Q367 313 398 304T454 275T492 223T506 143Q506 98 492 66T454 13T399 -17T332 -27Q295 -27 263 -18T207 13T170 66T156 143ZM156 969Q156 1016 169 1048T207 1101T263 +1130T332 1139Q367 1139 398 1130T454 1101T492 1049T506 969Q506 924 492 892T454 839T399 809T332 799Q295 799 263 808T207 838T170 891T156 969Z" /> +<glyph unicode=";" horiz-adv-x="663" d="M483 288L498 264Q484 206 465 142T422 12T373 -119T322 -244H102Q117 -179 131 -109T159 30T184 165T203 288H483ZM156 969Q156 1016 169 1048T207 1101T263 1130T332 1139Q367 1139 398 1130T454 1101T492 1049T506 +969Q506 924 492 892T454 839T399 809T332 799Q295 799 263 808T207 838T170 891T156 969Z" /> +<glyph unicode="&lt;" horiz-adv-x="1168" d="M1060 143L108 581V724L1060 1220V980L417 663L1060 382V143Z" /> +<glyph unicode="=" horiz-adv-x="1168" d="M108 747V964H1060V747H108ZM108 358V577H1060V358H108Z" /> +<glyph unicode="&gt;" horiz-adv-x="1168" d="M108 382L751 663L108 980V1220L1060 724V581L108 143V382Z" /> +<glyph unicode="?" horiz-adv-x="1114" d="M366 485V559Q366 610 376 651T408 730T464 803T546 877Q588 910 617 936T664 987T690 1041T698 1106Q698 1163 660 1200T542 1237Q473 1237 394 1208T229 1137L127 1358Q170 1383 220 1405T325 1445T436 1473T546 1483Q648 +1483 730 1459T869 1387T956 1273T987 1120Q987 1057 973 1008T932 916T863 834T766 750Q724 717 698 693T656 646T636 601T630 545V485H366ZM333 143Q333 190 346 222T384 275T440 304T510 313Q545 313 576 304T632 275T670 223T684 143Q684 98 670 66T632 13T577 +-17T510 -27Q473 -27 441 -18T384 13T347 66T333 143Z" /> +<glyph unicode="@" horiz-adv-x="1837" d="M1735 733Q1735 589 1689 469T1559 282T1364 215Q1290 215 1233 250T1151 344H1135Q1086 284 1016 250T860 215Q683 215 581 321T479 612Q479 821 611 951T963 1081Q1044 1081 1150 1066T1323 1026L1300 537Q1300 397 +1376 397Q1440 397 1478 490T1516 735Q1516 896 1450 1019T1262 1208T983 1274Q782 1274 632 1190T403 950T324 590Q324 313 471 166T899 18Q1011 18 1139 43T1382 111V-82Q1170 -172 907 -172Q527 -172 315 28T102 584Q102 831 211 1033T522 1348T981 1462Q1201 +1462 1374 1372T1641 1116T1735 733ZM711 608Q711 397 883 397Q972 397 1019 460T1077 668L1090 889Q1044 899 975 899Q850 899 781 821T711 608Z" /> +<glyph unicode="A" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899Z" /> +<glyph unicode="B" horiz-adv-x="1376" d="M184 1462H639Q950 1462 1090 1374T1231 1092Q1231 961 1170 877T1006 776V766Q1145 735 1206 650T1268 424Q1268 224 1124 112T731 0H184V1462ZM494 883H674Q800 883 856 922T913 1051Q913 1135 852 1171T657 1208H494V883ZM494 +637V256H696Q824 256 885 305T946 455Q946 637 686 637H494Z" /> +<glyph unicode="C" horiz-adv-x="1305" d="M805 1225Q630 1225 534 1094T438 727Q438 238 805 238Q959 238 1178 315V55Q998 -20 776 -20Q457 -20 288 173T119 729Q119 957 202 1128T440 1391T805 1483Q1018 1483 1233 1380L1133 1128Q1051 1167 968 1196T805 1225Z" /> +<glyph unicode="D" horiz-adv-x="1516" d="M1397 745Q1397 384 1192 192T598 0H184V1462H643Q1001 1462 1199 1273T1397 745ZM1075 737Q1075 1208 659 1208H494V256H627Q1075 256 1075 737Z" /> +<glyph unicode="E" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0Z" /> +<glyph unicode="F" horiz-adv-x="1124" d="M489 0H184V1462H1022V1208H489V831H985V578H489V0Z" /> +<glyph unicode="G" horiz-adv-x="1483" d="M739 821H1319V63Q1178 17 1054 -1T799 -20Q468 -20 294 174T119 733Q119 1087 321 1285T883 1483Q1108 1483 1317 1393L1214 1145Q1054 1225 881 1225Q680 1225 559 1090T438 727Q438 489 535 364T819 238Q916 238 1016 +258V563H739V821Z" /> +<glyph unicode="H" horiz-adv-x="1567" d="M1382 0H1073V631H494V0H184V1462H494V889H1073V1462H1382V0Z" /> +<glyph unicode="I" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0Z" /> +<glyph unicode="J" horiz-adv-x="678" d="M31 -430Q-74 -430 -152 -408V-150Q-72 -170 -6 -170Q96 -170 140 -107T184 92V1462H494V94Q494 -162 377 -296T31 -430Z" /> +<glyph unicode="K" horiz-adv-x="1360" d="M1360 0H1008L625 616L494 522V0H184V1462H494V793L616 965L1012 1462H1356L846 815L1360 0Z" /> +<glyph unicode="L" horiz-adv-x="1157" d="M184 0V1462H494V256H1087V0H184Z" /> +<glyph unicode="M" horiz-adv-x="1931" d="M803 0L451 1147H442Q461 797 461 680V0H184V1462H606L952 344H958L1325 1462H1747V0H1458V692Q1458 741 1459 805T1473 1145H1464L1087 0H803Z" /> +<glyph unicode="N" horiz-adv-x="1665" d="M1481 0H1087L451 1106H442Q461 813 461 688V0H184V1462H575L1210 367H1217Q1202 652 1202 770V1462H1481V0Z" /> +<glyph unicode="O" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 817 1227Q632 1227 538 1103T444 +733Z" /> +<glyph unicode="P" horiz-adv-x="1286" d="M494 774H596Q739 774 810 830T881 995Q881 1104 822 1156T635 1208H494V774ZM1194 1006Q1194 770 1047 645T627 520H494V0H184V1462H651Q917 1462 1055 1348T1194 1006Z" /> +<glyph unicode="Q" horiz-adv-x="1630" d="M1511 733Q1511 475 1420 301T1151 45L1503 -348H1106L838 -20H815Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 +817 1227Q632 1227 538 1103T444 733Z" /> +<glyph unicode="R" horiz-adv-x="1352" d="M494 813H594Q741 813 811 862T881 1016Q881 1120 810 1164T588 1208H494V813ZM494 561V0H184V1462H610Q908 1462 1051 1354T1194 1024Q1194 895 1123 795T922 637L1352 0H1008L659 561H494Z" /> +<glyph unicode="S" horiz-adv-x="1128" d="M1047 406Q1047 208 905 94T508 -20Q274 -20 94 68V356Q242 290 344 263T532 236Q634 236 688 275T743 391Q743 434 719 467T649 532T459 631Q325 694 258 752T151 887T111 1067Q111 1261 242 1372T606 1483Q720 1483 +823 1456T1040 1380L940 1139Q823 1187 747 1206T596 1225Q508 1225 461 1184T414 1077Q414 1036 433 1006T493 947T690 844Q895 746 971 648T1047 406Z" /> +<glyph unicode="T" horiz-adv-x="1186" d="M748 0H438V1204H41V1462H1145V1204H748V0Z" /> +<glyph unicode="U" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374Z" /> +<glyph unicode="V" horiz-adv-x="1331" d="M1018 1462H1331L834 0H496L0 1462H313L588 592Q611 515 635 413T666 270Q677 362 741 592L1018 1462Z" /> +<glyph unicode="W" horiz-adv-x="1980" d="M1608 0H1255L1057 768Q1046 809 1020 937T989 1110Q983 1056 959 937T922 766L725 0H373L0 1462H305L492 664Q541 443 563 281Q569 338 590 457T631 643L844 1462H1137L1350 643Q1364 588 1385 475T1417 281Q1427 359 +1449 475T1489 664L1675 1462H1980L1608 0Z" /> +<glyph unicode="X" horiz-adv-x="1366" d="M1366 0H1012L672 553L332 0H0L485 754L31 1462H373L688 936L997 1462H1331L872 737L1366 0Z" /> +<glyph unicode="Y" horiz-adv-x="1278" d="M639 860L944 1462H1278L793 569V0H485V559L0 1462H336L639 860Z" /> +<glyph unicode="Z" horiz-adv-x="1186" d="M1137 0H49V201L750 1206H68V1462H1118V1262L418 256H1137V0Z" /> +<glyph unicode="[" horiz-adv-x="798" d="M698 -339H214V1704H698V1493H474V-128H698V-339Z" /> +<glyph unicode="\" horiz-adv-x="966" d="M334 1705L894 -339H632L72 1705H334Z" /> +<glyph unicode="]" horiz-adv-x="798" d="M100 1704H584V-339H100V-128H324V1493H100V1704Z" /> +<glyph unicode="^" horiz-adv-x="1168" d="M45 520L483 1470H627L1122 520H883L561 1163Q492 1002 421 839T281 520H45Z" /> +<glyph unicode="_" horiz-adv-x="842" d="M846 -324H-4V-184H846V-324Z" /> +<glyph unicode="`" horiz-adv-x="1243" d="M707 1241Q644 1285 522 1383T332 1548V1569H674Q737 1468 909 1268V1241H707Z" /> +<glyph unicode="a" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 745V0H870ZM780 518L662 +514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518Z" /> +<glyph unicode="b" horiz-adv-x="1296" d="M782 1139Q980 1139 1092 985T1204 561Q1204 284 1089 132T774 -20Q577 -20 465 123H444L393 0H160V1556H465V1194Q465 1125 453 973H465Q572 1139 782 1139ZM684 895Q571 895 519 826T465 596V563Q465 383 518 305T688 +227Q782 227 837 313T893 565Q893 730 837 812T684 895Z" /> +<glyph unicode="c" horiz-adv-x="1053" d="M614 -20Q92 -20 92 553Q92 838 234 988T641 1139Q835 1139 989 1063L899 827Q827 856 765 874T641 893Q403 893 403 555Q403 227 641 227Q729 227 804 250T954 324V63Q880 16 805 -2T614 -20Z" /> +<glyph unicode="d" horiz-adv-x="1296" d="M514 -20Q317 -20 205 133T92 557Q92 832 206 985T522 1139Q733 1139 844 975H854Q831 1100 831 1198V1556H1137V0H903L844 145H831Q727 -20 514 -20ZM621 223Q738 223 792 291T852 522V555Q852 735 797 813T616 891Q514 +891 458 805T401 553Q401 388 458 306T621 223Z" /> +<glyph unicode="e" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 207Q781 207 871 228T1059 295V59Q979 +19 888 0T666 -20Z" /> +<glyph unicode="f" horiz-adv-x="793" d="M778 889H514V0H209V889H41V1036L209 1118V1200Q209 1391 303 1479T604 1567Q762 1567 885 1520L807 1296Q715 1325 637 1325Q572 1325 543 1287T514 1188V1118H778V889Z" /> +<glyph unicode="g" horiz-adv-x="1296" d="M623 219Q746 219 799 289T852 518V555Q852 734 797 812T618 891Q403 891 403 553Q403 385 456 302T623 219ZM1137 -2Q1137 -243 997 -367T578 -492Q333 -492 160 -426V-182Q363 -268 596 -268Q831 -268 831 -14V8L840 +145H831Q724 -20 514 -20Q313 -20 203 135T92 557Q92 832 206 985T522 1139Q728 1139 846 975H854L879 1118H1137V-2Z" /> +<glyph unicode="h" horiz-adv-x="1346" d="M1192 0H887V653Q887 895 707 895Q579 895 522 808T465 526V0H160V1556H465V1239Q465 1202 458 1065L451 975H467Q569 1139 791 1139Q988 1139 1090 1033T1192 729V0Z" /> +<glyph unicode="i" horiz-adv-x="625" d="M147 1407Q147 1556 313 1556Q479 1556 479 1407Q479 1336 438 1297T313 1257Q147 1257 147 1407ZM465 0H160V1118H465V0Z" /> +<glyph unicode="j" horiz-adv-x="625" d="M70 -492Q-47 -492 -131 -467V-227Q-61 -246 12 -246Q89 -246 124 -203T160 -76V1118H465V-121Q465 -299 362 -395T70 -492ZM147 1407Q147 1556 313 1556Q479 1556 479 1407Q479 1336 438 1297T313 1257Q147 1257 147 1407Z" /> +<glyph unicode="k" horiz-adv-x="1270" d="M453 608L586 778L899 1118H1243L799 633L1270 0H918L596 453L465 348V0H160V1556H465V862L449 608H453Z" /> +<glyph unicode="l" horiz-adv-x="625" d="M465 0H160V1556H465V0Z" /> +<glyph unicode="m" horiz-adv-x="2011" d="M1161 0H856V653Q856 774 816 834T688 895Q571 895 518 809T465 526V0H160V1118H393L434 975H451Q496 1052 581 1095T776 1139Q1027 1139 1116 975H1143Q1188 1053 1275 1096T1473 1139Q1663 1139 1760 1042T1858 729V0H1552V653Q1552 +774 1512 834T1384 895Q1272 895 1217 815T1161 561V0Z" /> +<glyph unicode="n" horiz-adv-x="1346" d="M1192 0H887V653Q887 774 844 834T707 895Q579 895 522 810T465 526V0H160V1118H393L434 975H451Q502 1056 591 1097T795 1139Q990 1139 1091 1034T1192 729V0Z" /> +<glyph unicode="o" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 235 987T637 1139Q798 1139 +921 1069T1110 868T1176 561Z" /> +<glyph unicode="p" horiz-adv-x="1296" d="M774 -20Q577 -20 465 123H449Q465 -17 465 -39V-492H160V1118H408L451 973H465Q572 1139 782 1139Q980 1139 1092 986T1204 561Q1204 382 1152 250T1002 49T774 -20ZM684 895Q571 895 519 826T465 596V563Q465 383 518 +305T688 227Q893 227 893 565Q893 730 843 812T684 895Z" /> +<glyph unicode="q" horiz-adv-x="1296" d="M623 219Q739 219 793 285T852 518V555Q852 735 797 813T618 891Q403 891 403 553Q403 385 456 302T623 219ZM514 -20Q316 -20 204 132T92 557Q92 831 206 985T520 1139Q626 1139 705 1099T844 975H852L879 1118H1137V-492H831V-23Q831 +38 844 145H831Q782 64 701 22T514 -20Z" /> +<glyph unicode="r" horiz-adv-x="930" d="M784 1139Q846 1139 887 1130L864 844Q827 854 774 854Q628 854 547 779T465 569V0H160V1118H391L436 930H451Q503 1024 591 1081T784 1139Z" /> +<glyph unicode="s" horiz-adv-x="1018" d="M940 332Q940 160 821 70T463 -20Q341 -20 255 -4T94 45V297Q179 257 285 230T473 203Q639 203 639 299Q639 335 617 357T541 408T397 475Q268 529 208 575T120 680T92 827Q92 976 207 1057T535 1139Q737 1139 928 1051L836 +831Q752 867 679 890T530 913Q395 913 395 840Q395 799 438 769T629 680Q760 627 821 581T911 475T940 332Z" /> +<glyph unicode="t" horiz-adv-x="889" d="M631 223Q711 223 823 258V31Q709 -20 543 -20Q360 -20 277 72T193 350V889H47V1018L215 1120L303 1356H498V1118H811V889H498V350Q498 285 534 254T631 223Z" /> +<glyph unicode="u" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952Z" /> +<glyph unicode="v" horiz-adv-x="1165" d="M426 0L0 1118H319L535 481Q568 377 578 252H586Q592 365 631 481L846 1118H1165L739 0H426Z" /> +<glyph unicode="w" horiz-adv-x="1753" d="M1079 0L993 391L879 885H870L666 0H338L20 1118H324L453 623Q475 535 514 256H522Q526 332 557 497L573 582L711 1118H1047L1178 582Q1190 527 1207 421T1227 256H1235Q1246 345 1266 458T1300 623L1434 1118H1733L1411 +0H1079Z" /> +<glyph unicode="x" horiz-adv-x="1184" d="M389 571L29 1118H375L592 762L811 1118H1157L793 571L1174 0H827L592 383L356 0H10L389 571Z" /> +<glyph unicode="y" horiz-adv-x="1165" d="M0 1118H334L545 489Q572 407 582 295H588Q599 398 631 489L838 1118H1165L692 -143Q627 -318 507 -405T225 -492Q146 -492 70 -475V-233Q125 -246 190 -246Q271 -246 331 -197T426 -47L444 8L0 1118Z" /> +<glyph unicode="z" horiz-adv-x="999" d="M938 0H55V180L573 885H86V1118H920V920L416 233H938V0Z" /> +<glyph unicode="{" horiz-adv-x="872" d="M78 562V801Q140 801 188 812T270 848T319 912T334 1008V1379Q334 1465 353 1526T421 1627T556 1684T772 1703V1478Q732 1477 700 1470T645 1444T610 1393T598 1310V953Q592 730 364 688V676Q479 656 540 590T598 412V55Q598 +4 610 -28T644 -78T699 -104T772 -113V-339Q641 -339 556 -321T422 -263T353 -162T334 -14V353Q334 466 269 514T78 562Z" /> +<glyph unicode="|" horiz-adv-x="1105" d="M443 1703H662V-339H443V1703Z" /> +<glyph unicode="}" horiz-adv-x="872" d="M794 563Q732 563 684 552T602 516T553 452T538 356V-15Q538 -101 519 -162T451 -263T316 -320T100 -339V-114Q140 -113 172 -106T227 -80T262 -29T274 54V411Q280 634 508 676V688Q393 708 332 774T274 952V1309Q274 +1360 262 1392T228 1442T173 1468T100 1477V1703Q231 1703 316 1685T450 1627T519 1526T538 1378V1011Q538 898 603 850T794 802V563Z" /> +<glyph unicode="~" horiz-adv-x="1168" d="M548 556Q511 572 483 583T431 600T386 609T342 612Q313 612 282 603T221 577T163 538T108 491V722Q159 776 222 803T364 831Q394 831 419 829T473 819T537 800T620 767Q658 751 686 741T739 724T784 715T827 712Q856 +712 887 721T948 747T1006 785T1060 833V602Q959 493 804 493Q774 493 749 495T695 504T631 523T548 556Z" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="&#xa1;" horiz-adv-x="586" d="M168 606H412L463 -369H117L168 606ZM467 948Q467 864 422 821T291 778Q208 778 163 822T117 948Q117 1029 163 1073T291 1118Q375 1118 421 1074T467 948Z" /> +<glyph unicode="&#xa2;" horiz-adv-x="1171" d="M563 176Q143 235 143 741Q143 1002 247 1144T563 1317V1483H741V1325Q907 1316 1040 1251L950 1016Q878 1045 816 1063T692 1081Q571 1081 513 998T455 743Q455 416 692 416Q774 416 840 431T1006 492V238Q879 +177 741 168V-20H563V176Z" /> +<glyph unicode="&#xa3;" horiz-adv-x="1171" d="M700 1483Q895 1483 1090 1401L997 1171Q840 1235 725 1235Q647 1235 605 1191T563 1063V870H938V651H563V508Q563 338 412 260H1130V0H82V248Q185 292 223 349T262 506V651H84V870H262V1065Q262 1266 376 1374T700 1483Z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1171" d="M188 723Q188 825 242 920L113 1047L260 1194L387 1067Q478 1120 584 1120Q689 1120 780 1065L907 1194L1057 1051L928 922Q981 833 981 723Q981 616 928 524L1053 399L907 254L780 379Q685 328 584 328Q469 328 +385 379L260 256L115 401L242 526Q188 619 188 723ZM395 723Q395 646 449 591T584 535Q665 535 720 590T776 723Q776 803 720 858T584 913Q506 913 451 857T395 723Z" /> +<glyph unicode="&#xa5;" horiz-adv-x="1171" d="M584 860L848 1462H1161L778 715H973V537H727V399H973V221H727V0H440V221H193V399H440V537H193V715H383L6 1462H322L584 860Z" /> +<glyph unicode="&#xa6;" horiz-adv-x="1128" d="M455 1550H674V735H455V1550ZM455 350H674V-465H455V350Z" /> +<glyph unicode="&#xa7;" horiz-adv-x="995" d="M121 801Q121 955 254 1049Q121 1133 121 1280Q121 1409 232 1488T526 1567Q696 1567 889 1483L807 1292Q701 1342 640 1359T520 1376Q439 1376 402 1354T365 1284Q365 1238 411 1202T578 1118Q746 1049 820 967T895 +780Q895 602 770 522Q832 482 863 430T895 303Q895 155 776 68T455 -20Q252 -20 106 59V266Q187 225 286 197T455 168Q649 168 649 285Q649 324 631 348T567 397T442 457Q256 532 189 609T121 801ZM344 823Q344 759 406 709T590 610Q668 667 668 754Q668 823 614 +869T434 961Q396 946 370 909T344 823Z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1243" d="M279 1405Q279 1470 316 1505T418 1540Q484 1540 521 1503T559 1405Q559 1345 521 1309T418 1272Q354 1272 317 1307T279 1405ZM682 1405Q682 1475 722 1507T823 1540Q888 1540 926 1504T965 1405Q965 1344 926 +1308T823 1272Q763 1272 723 1304T682 1405Z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M893 1055Q774 1055 707 970T639 731Q639 574 697 490T891 406Q986 406 1106 453V322Q1046 295 997 284T883 272Q690 272 585 392T479 731Q479 940 590 1064T891 1188Q1021 1188 1143 1126L1083 1001Q977 1055 893 +1055ZM100 731Q100 931 200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM209 731Q209 559 295 410T530 175T852 88Q1024 88 1173 174T1408 409T1495 731Q1495 903 1409 +1052T1174 1287T852 1374Q680 1374 531 1288T296 1053T209 731Z" /> +<glyph unicode="&#xaa;" horiz-adv-x="784" d="M561 764L530 874Q487 816 425 784T289 752Q172 752 110 810T47 975Q47 1084 129 1138T397 1202L496 1206Q496 1323 369 1323Q288 1323 152 1262L86 1397Q152 1429 231 1454T410 1479Q547 1479 621 1408T696 1206V764H561ZM252 +977Q252 939 275 921T330 903Q407 903 451 944T496 1051V1087L397 1081Q252 1071 252 977Z" /> +<glyph unicode="&#xab;" horiz-adv-x="1260" d="M82 573L453 1028L672 909L393 561L672 213L453 94L82 547V573ZM588 573L958 1028L1178 909L899 561L1178 213L958 94L588 547V573Z" /> +<glyph unicode="&#xac;" horiz-adv-x="1171" d="M1081 248H862V612H88V831H1081V248Z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M61 424V674H598V424H61Z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M727 764H829Q910 764 954 804T999 909Q999 982 958 1014T827 1047H727V764ZM1157 913Q1157 830 1114 770T997 680L1235 283H1059L854 637H727V283H571V1178H834Q1002 1178 1079 1113T1157 913ZM100 731Q100 931 +200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM209 731Q209 559 295 410T530 175T852 88Q1024 88 1173 174T1408 409T1495 731Q1495 903 1409 1052T1174 1287T852 1374Q680 +1374 531 1288T296 1053T209 731Z" /> +<glyph unicode="&#xaf;" horiz-adv-x="749" d="M106 484V734H643V484H106Z" /> +<glyph unicode="&#xb0;" horiz-adv-x="877" d="M92 1137Q92 1229 138 1309T264 1436T438 1483Q530 1483 610 1437T737 1310T784 1137Q784 1044 738 964T611 838T438 793Q293 793 193 892T92 1137ZM283 1137Q283 1073 327 1028T438 983Q504 983 549 1029T594 1137Q594 +1200 549 1247T438 1294Q374 1294 329 1248T283 1137Z" /> +<glyph unicode="&#xb1;" horiz-adv-x="1171" d="M475 674H88V893H475V1282H694V893H1081V674H694V289H475V674ZM88 0V219H1081V0H88Z" /> +<glyph unicode="&#xb2;" horiz-adv-x="776" d="M702 586H55V754L279 973Q381 1073 409 1117T438 1212Q438 1250 414 1270T350 1290Q269 1290 170 1202L47 1354Q194 1483 383 1483Q520 1483 599 1417T678 1233Q678 1148 631 1073T455 881L350 786H702V586Z" /> +<glyph unicode="&#xb3;" horiz-adv-x="776" d="M666 1249Q666 1106 496 1051V1038Q590 1018 642 963T694 829Q694 708 606 639T332 569Q189 569 59 639V829Q207 739 330 739Q473 739 473 846Q473 899 429 925T307 952H195V1112H287Q370 1112 410 1138T451 1221Q451 +1259 426 1284T350 1309Q303 1309 261 1290T162 1231L61 1372Q123 1419 198 1450T377 1481Q504 1481 585 1417T666 1249Z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1243" d="M332 1241V1268Q504 1468 567 1569H909V1548Q857 1496 732 1394T535 1241H332Z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1352" d="M465 465Q465 344 509 284T647 223Q773 223 830 309T887 592V1118H1192V0H961L918 150H903Q861 65 801 23T653 -20Q591 -20 539 3T455 70L460 -15L465 -172V-492H160V1118H465V465Z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1167 -260H1006V1356H840V-260H678V559Q616 541 532 541Q316 541 215 666T113 1042Q113 1302 222 1429T563 1556H1167V-260Z" /> +<glyph unicode="&#xb7;" horiz-adv-x="584" d="M117 723Q117 807 162 850T293 893Q376 893 421 849T467 723Q467 642 421 598T293 553Q209 553 163 597T117 723Z" /> +<glyph unicode="&#xb8;" horiz-adv-x="420" d="M418 -250Q418 -378 343 -435T109 -492Q31 -492 -37 -471V-303Q-10 -310 35 -317T106 -324Q178 -324 178 -262Q178 -179 12 -154L90 0H283L256 -61Q330 -85 374 -135T418 -250Z" /> +<glyph unicode="&#xb9;" horiz-adv-x="776" d="M584 586H346V1032L349 1144L354 1239Q327 1203 279 1161L201 1100L92 1227L393 1462H584V586Z" /> +<glyph unicode="&#xba;" horiz-adv-x="795" d="M737 1116Q737 945 646 849T395 752Q242 752 150 850T57 1116Q57 1285 146 1382T399 1479Q551 1479 644 1381T737 1116ZM260 1116Q260 1016 292 966T397 915Q469 915 500 965T532 1116Q532 1216 501 1265T397 1315Q325 +1315 293 1266T260 1116Z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1260" d="M1178 547L807 94L588 213L866 561L588 909L807 1028L1178 573V547ZM672 547L301 94L82 213L360 561L82 909L301 1028L672 573V547Z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1804" d="M794 586H556V1032L559 1144L564 1239Q537 1203 489 1161L411 1100L302 1227L603 1462H794V586ZM1370 1462L559 0H320L1131 1462H1370ZM1682 152H1557V1H1319V152H936V306L1321 883H1557V320H1682V152ZM1319 320V484Q1319 +570 1325 668Q1316 642 1290 588T1248 511L1121 320H1319Z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1804" d="M794 586H556V1032L559 1144L564 1239Q537 1203 489 1161L411 1100L302 1227L603 1462H794V586ZM1370 1462L559 0H320L1131 1462H1370ZM1716 1H1069V169L1293 388Q1395 488 1423 532T1452 627Q1452 665 1428 685T1364 +705Q1283 705 1184 617L1061 769Q1208 898 1397 898Q1534 898 1613 832T1692 648Q1692 563 1645 488T1469 296L1364 201H1716V1Z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1804" d="M697 1249Q697 1106 527 1051V1038Q621 1018 673 963T725 829Q725 708 637 639T363 569Q220 569 90 639V829Q238 739 361 739Q504 739 504 846Q504 899 460 925T338 952H226V1112H318Q401 1112 441 1138T482 1221Q482 +1259 457 1284T381 1309Q334 1309 292 1290T193 1231L92 1372Q154 1419 229 1450T408 1481Q535 1481 616 1417T697 1249ZM1441 1462L630 0H391L1202 1462H1441ZM1712 152H1587V1H1349V152H966V306L1351 883H1587V320H1712V152ZM1349 320V484Q1349 570 1355 668Q1346 +642 1320 588T1278 511L1151 320H1349Z" /> +<glyph unicode="&#xbf;" horiz-adv-x="977" d="M713 606V532Q713 434 669 363T516 215Q407 137 379 93T350 -14Q350 -71 393 -108T526 -145Q605 -145 695 -116T881 -45L983 -266Q885 -322 762 -356T532 -391Q312 -391 187 -295T61 -29Q61 79 109 158T301 342Q396 +412 422 449T449 547V606H713ZM745 948Q745 864 700 821T569 778Q486 778 441 822T395 948Q395 1029 441 1073T569 1118Q653 1118 699 1074T745 948Z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM713 1579Q650 1623 528 1721T338 1886V1907H680Q743 1806 915 1606V1579H713Z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM541 1579V1606Q713 1806 776 1907H1118V1886Q1066 1834 941 1732T744 1579H541Z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM938 1579Q781 1672 704 1755Q626 1674 475 1579H272V1606Q461 1795 528 1907H885Q916 1855 +992 1766T1141 1606V1579H938Z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM543 1684Q512 1684 484 1658T442 1577H293Q304 1722 375 1804T565 1886Q606 1886 645 1870T723 +1834T799 1798T872 1782Q903 1782 931 1808T973 1888H1122Q1111 1743 1039 1661T850 1579Q809 1579 770 1595T692 1631T616 1667T543 1684Z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1413" d="M1079 0L973 348H440L334 0H0L516 1468H895L1413 0H1079ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM365 1743Q365 1808 402 1843T504 1878Q570 1878 607 1841T645 1743Q645 1683 607 1647T504 +1610Q440 1610 403 1645T365 1743ZM768 1743Q768 1813 808 1845T909 1878Q974 1878 1012 1842T1051 1743Q1051 1682 1012 1646T909 1610Q849 1610 809 1642T768 1743Z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1413" d="M958 1567Q958 1478 911 1419L1413 0H1079L973 348H440L334 0H0L500 1419Q457 1477 457 1565Q457 1673 524 1737T705 1802Q814 1802 886 1738T958 1567ZM899 608Q752 1081 734 1143T707 1241Q674 1113 518 608H899ZM801 +1565Q801 1610 774 1635T705 1661Q663 1661 636 1636T608 1565Q608 1472 705 1468Q747 1468 774 1494T801 1565Z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1950" d="M1829 0H956V348H465L315 0H0L655 1462H1829V1208H1266V887H1792V633H1266V256H1829V0ZM578 608H956V1198H829L578 608Z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1305" d="M805 1225Q630 1225 534 1094T438 727Q438 238 805 238Q959 238 1178 315V55Q998 -20 776 -20Q457 -20 288 173T119 729Q119 957 202 1128T440 1391T805 1483Q1018 1483 1233 1380L1133 1128Q1051 1167 968 1196T805 +1225ZM959 -250Q959 -378 884 -435T650 -492Q572 -492 504 -471V-303Q531 -310 576 -317T647 -324Q719 -324 719 -262Q719 -179 553 -154L631 0H824L797 -61Q871 -85 915 -135T959 -250Z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM634 1579Q571 1623 449 1721T259 1886V1907H601Q664 1806 836 1606V1579H634Z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM424 1579V1606Q596 1806 659 1907H1001V1886Q949 1834 824 1732T627 1579H424Z" /> +<glyph unicode="&#xca;" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM841 1579Q684 1672 607 1755Q529 1674 378 1579H175V1606Q364 1795 431 1907H788Q819 1855 895 1766T1044 1606V1579H841Z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM272 1743Q272 1808 309 1843T411 1878Q477 1878 514 1841T552 1743Q552 1683 514 1647T411 1610Q347 1610 310 1645T272 1743ZM675 1743Q675 1813 +715 1845T816 1878Q881 1878 919 1842T958 1743Q958 1682 919 1646T816 1610Q756 1610 716 1642T675 1743Z" /> +<glyph unicode="&#xcc;" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0ZM417 1579Q354 1623 232 1721T42 1886V1907H384Q447 1806 619 1606V1579H417Z" /> +<glyph unicode="&#xcd;" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0ZM237 1579V1606Q409 1806 472 1907H814V1886Q762 1834 637 1732T440 1579H237Z" /> +<glyph unicode="&#xce;" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0ZM630 1579Q473 1672 396 1755Q318 1674 167 1579H-36V1606Q153 1795 220 1907H577Q608 1855 684 1766T833 1606V1579H630Z" /> +<glyph unicode="&#xcf;" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0ZM57 1743Q57 1808 94 1843T196 1878Q262 1878 299 1841T337 1743Q337 1683 299 1647T196 1610Q132 1610 95 1645T57 1743ZM460 1743Q460 +1813 500 1845T601 1878Q666 1878 704 1842T743 1743Q743 1682 704 1646T601 1610Q541 1610 501 1642T460 1743Z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1516" d="M47 850H184V1462H643Q1001 1462 1199 1273T1397 745Q1397 384 1192 192T598 0H184V596H47V850ZM1075 737Q1075 969 971 1088T657 1208H494V850H731V596H494V256H625Q1075 256 1075 737Z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1665" d="M1481 0H1087L451 1106H442Q461 813 461 688V0H184V1462H575L1210 367H1217Q1202 652 1202 770V1462H1481V0ZM668 1684Q637 1684 609 1658T567 1577H418Q429 1722 500 1804T690 1886Q731 1886 770 1870T848 1834T924 +1798T997 1782Q1028 1782 1056 1808T1098 1888H1247Q1236 1743 1164 1661T975 1579Q934 1579 895 1595T817 1631T741 1667T668 1684Z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 817 1227Q632 1227 +538 1103T444 733ZM824 1579Q761 1623 639 1721T449 1886V1907H791Q854 1806 1026 1606V1579H824Z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 817 1227Q632 1227 +538 1103T444 733ZM658 1579V1606Q830 1806 893 1907H1235V1886Q1183 1834 1058 1732T861 1579H658Z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 817 1227Q632 1227 +538 1103T444 733ZM1047 1579Q890 1672 813 1755Q735 1674 584 1579H381V1606Q570 1795 637 1907H994Q1025 1855 1101 1766T1250 1606V1579H1047Z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 817 1227Q632 1227 +538 1103T444 733ZM652 1684Q621 1684 593 1658T551 1577H402Q413 1722 484 1804T674 1886Q715 1886 754 1870T832 1834T908 1798T981 1782Q1012 1782 1040 1808T1082 1888H1231Q1220 1743 1148 1661T959 1579Q918 1579 879 1595T801 1631T725 1667T652 1684Z" +/> +<glyph unicode="&#xd6;" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q479 -20 299 175T119 735Q119 1100 299 1292T817 1485Q1154 1485 1332 1291T1511 733ZM444 733Q444 488 537 364T815 240Q1186 240 1186 733Q1186 1227 817 1227Q632 1227 +538 1103T444 733ZM474 1743Q474 1808 511 1843T613 1878Q679 1878 716 1841T754 1743Q754 1683 716 1647T613 1610Q549 1610 512 1645T474 1743ZM877 1743Q877 1813 917 1845T1018 1878Q1083 1878 1121 1842T1160 1743Q1160 1682 1121 1646T1018 1610Q958 1610 +918 1642T877 1743Z" /> +<glyph unicode="&#xd7;" horiz-adv-x="1168" d="M428 663L129 964L280 1118L581 819L886 1118L1040 968L735 663L1036 360L886 208L581 509L280 210L131 362L428 663Z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1630" d="M1511 733Q1511 370 1331 175T815 -20Q618 -20 479 45L389 -90L227 18L317 154Q119 348 119 735Q119 1100 299 1292T817 1485Q1015 1485 1161 1415L1245 1540L1405 1436L1317 1305Q1511 1111 1511 733ZM444 733Q444 +542 500 426L1006 1182Q922 1227 817 1227Q632 1227 538 1103T444 733ZM1186 733Q1186 913 1135 1030L635 279Q711 240 815 240Q1186 240 1186 733Z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374ZM750 1579Q687 1623 565 1721T375 1886V1907H717Q780 +1806 952 1606V1579H750Z" /> +<glyph unicode="&#xda;" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374ZM602 1579V1606Q774 1806 837 1907H1179V1886Q1127 1834 +1002 1732T805 1579H602Z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374ZM1006 1579Q849 1672 772 1755Q694 1674 543 1579H340V1606Q529 +1795 596 1907H953Q984 1855 1060 1766T1209 1606V1579H1006Z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1548" d="M1374 1462V516Q1374 354 1302 232T1092 45T768 -20Q486 -20 330 124T174 520V1462H483V567Q483 398 551 319T776 240Q928 240 996 319T1065 569V1462H1374ZM433 1743Q433 1808 470 1843T572 1878Q638 1878 675 +1841T713 1743Q713 1683 675 1647T572 1610Q508 1610 471 1645T433 1743ZM836 1743Q836 1813 876 1845T977 1878Q1042 1878 1080 1842T1119 1743Q1119 1682 1080 1646T977 1610Q917 1610 877 1642T836 1743Z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1278" d="M639 860L944 1462H1278L793 569V0H485V559L0 1462H336L639 860ZM461 1579V1606Q633 1806 696 1907H1038V1886Q986 1834 861 1732T664 1579H461Z" /> +<glyph unicode="&#xde;" horiz-adv-x="1286" d="M1194 770Q1194 541 1052 417T647 293H494V0H184V1462H494V1233H672Q926 1233 1060 1114T1194 770ZM494 543H594Q739 543 810 595T881 770Q881 877 818 929T618 981H494V543Z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1456" d="M1249 1241Q1249 1177 1228 1129T1175 1042T1106 975T1037 922T984 877T963 834Q963 807 989 781T1082 715Q1228 624 1280 575T1358 465T1384 326Q1384 154 1268 67T924 -20Q825 -20 753 -6T621 43V285Q674 249 +756 224T903 199Q1071 199 1071 322Q1071 363 1055 388T998 444T883 516Q757 588 708 647T659 788Q659 852 694 905T799 1007Q876 1062 907 1102T938 1188Q938 1248 875 1288T711 1329Q595 1329 530 1277T465 1128V0H160V1139Q160 1340 306 1453T711 1567Q955 1567 +1102 1479T1249 1241Z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 745V0H870ZM780 +518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM870 1241Q807 1285 685 1383T495 1548V1569H837Q900 1468 1072 1268V1241H870Z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 745V0H870ZM780 +518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM441 1241V1268Q613 1468 676 1569H1018V1548Q966 1496 841 1394T644 1241H441Z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 745V0H870ZM780 +518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM1099 1496Q942 1589 865 1672Q787 1591 636 1496H433V1523Q622 1712 689 1824H1046Q1077 1772 1153 1683T1302 1523V1496H1099Z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 745V0H870ZM780 +518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM467 1346Q436 1346 408 1320T366 1239H217Q228 1384 299 1466T489 1548Q530 1548 569 1532T647 1496T723 1460T796 1444Q827 1444 855 1470T897 1550H1046Q1035 1405 963 1323T774 +1241Q733 1241 694 1257T616 1293T540 1329T467 1346Z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 745V0H870ZM780 +518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM285 1405Q285 1470 322 1505T424 1540Q490 1540 527 1503T565 1405Q565 1345 527 1309T424 1272Q360 1272 323 1307T285 1405ZM688 1405Q688 1475 728 1507T829 1540Q894 1540 +932 1504T971 1405Q971 1344 932 1308T829 1272Q769 1272 729 1304T688 1405Z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1237" d="M870 0L811 152H803Q726 55 645 18T432 -20Q271 -20 179 72T86 334Q86 512 210 596T586 690L780 696V745Q780 915 606 915Q472 915 291 834L190 1040Q383 1141 618 1141Q843 1141 963 1043T1083 745V0H870ZM780 +518L662 514Q529 510 464 466T399 332Q399 203 547 203Q653 203 716 264T780 426V518ZM883 1479Q883 1371 812 1305T629 1239Q517 1239 449 1303T381 1477Q381 1585 448 1649T629 1714Q739 1714 811 1648T883 1479ZM725 1477Q725 1522 698 1547T629 1573Q587 1573 +560 1548T533 1477Q533 1432 557 1406T629 1380Q671 1380 698 1406T725 1477Z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1878" d="M1329 -20Q1192 -20 1080 30T895 186Q797 69 699 25T442 -20Q281 -20 184 74T86 334Q86 512 207 596T569 690L760 696V780Q760 849 716 882T594 915Q454 915 289 838L190 1040Q379 1141 612 1141Q839 1141 954 1010Q1020 +1074 1106 1106T1313 1139Q1534 1139 1662 1002T1790 631V483H1067Q1072 353 1144 280T1346 207Q1542 207 1726 295V59Q1647 20 1555 0T1329 -20ZM760 518L647 514Q523 510 461 467T399 332Q399 203 539 203Q640 203 700 264T760 426V518ZM1307 922Q1090 922 1073 +686H1503Q1501 798 1448 860T1307 922Z" /> +<glyph unicode="&#xe7;" horiz-adv-x="1053" d="M614 -20Q92 -20 92 553Q92 838 234 988T641 1139Q835 1139 989 1063L899 827Q827 856 765 874T641 893Q403 893 403 555Q403 227 641 227Q729 227 804 250T954 324V63Q880 16 805 -2T614 -20ZM805 -250Q805 -378 +730 -435T496 -492Q418 -492 350 -471V-303Q377 -310 422 -317T493 -324Q565 -324 565 -262Q565 -179 399 -154L477 0H670L643 -61Q717 -85 761 -135T805 -250Z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 207Q781 207 871 228T1059 +295V59Q979 19 888 0T666 -20ZM876 1241Q813 1285 691 1383T501 1548V1569H843Q906 1468 1078 1268V1241H876Z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 207Q781 207 871 228T1059 +295V59Q979 19 888 0T666 -20ZM447 1241V1268Q619 1468 682 1569H1024V1548Q972 1496 847 1394T650 1241H447Z" /> +<glyph unicode="&#xea;" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 207Q781 207 871 228T1059 +295V59Q979 19 888 0T666 -20ZM860 1241Q703 1334 626 1417Q548 1336 397 1241H194V1268Q383 1457 450 1569H807Q838 1517 914 1428T1063 1268V1241H860Z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1210" d="M623 922Q526 922 471 861T408 686H836Q834 799 777 860T623 922ZM666 -20Q396 -20 244 129T92 551Q92 832 232 985T621 1139Q858 1139 990 1004T1122 631V483H401Q406 353 478 280T680 207Q781 207 871 228T1059 +295V59Q979 19 888 0T666 -20ZM297 1405Q297 1470 334 1505T436 1540Q502 1540 539 1503T577 1405Q577 1345 539 1309T436 1272Q372 1272 335 1307T297 1405ZM700 1405Q700 1475 740 1507T841 1540Q906 1540 944 1504T983 1405Q983 1344 944 1308T841 1272Q781 +1272 741 1304T700 1405Z" /> +<glyph unicode="&#xec;" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM274 1241Q211 1285 89 1383T-101 1548V1569H241Q304 1468 476 1268V1241H274Z" /> +<glyph unicode="&#xed;" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM145 1241V1268Q317 1468 380 1569H722V1548Q670 1496 545 1394T348 1241H145Z" /> +<glyph unicode="&#xee;" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM544 1241Q387 1334 310 1417Q232 1336 81 1241H-122V1268Q67 1457 134 1569H491Q522 1517 598 1428T747 1268V1241H544Z" /> +<glyph unicode="&#xef;" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM-29 1405Q-29 1470 8 1505T110 1540Q176 1540 213 1503T251 1405Q251 1345 213 1309T110 1272Q46 1272 9 1307T-29 1405ZM374 1405Q374 1475 414 1507T515 1540Q580 1540 618 1504T657 1405Q657 +1344 618 1308T515 1272Q455 1272 415 1304T374 1405Z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1268" d="M510 1298Q421 1357 358 1391L459 1567Q607 1500 717 1425L942 1565L1042 1411L872 1307Q1028 1164 1102 985T1176 573Q1176 293 1031 137T631 -20Q386 -20 239 117T92 489Q92 722 222 858T573 995Q778 995 848 +897L856 901Q792 1056 664 1178L434 1036L334 1192L510 1298ZM864 532Q864 640 803 705T635 770Q514 770 459 702T403 487Q403 347 463 276T635 205Q758 205 811 287T864 532Z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1346" d="M1192 0H887V653Q887 774 844 834T707 895Q579 895 522 810T465 526V0H160V1118H393L434 975H451Q502 1056 591 1097T795 1139Q990 1139 1091 1034T1192 729V0ZM508 1346Q477 1346 449 1320T407 1239H258Q269 1384 +340 1466T530 1548Q571 1548 610 1532T688 1496T764 1460T837 1444Q868 1444 896 1470T938 1550H1087Q1076 1405 1004 1323T815 1241Q774 1241 735 1257T657 1293T581 1329T508 1346Z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 235 987T637 1139Q798 +1139 921 1069T1110 868T1176 561ZM868 1241Q805 1285 683 1383T493 1548V1569H835Q898 1468 1070 1268V1241H868Z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 235 987T637 1139Q798 +1139 921 1069T1110 868T1176 561ZM467 1241V1268Q639 1468 702 1569H1044V1548Q992 1496 867 1394T670 1241H467Z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 235 987T637 1139Q798 +1139 921 1069T1110 868T1176 561ZM864 1241Q707 1334 630 1417Q552 1336 401 1241H198V1268Q387 1457 454 1569H811Q842 1517 918 1428T1067 1268V1241H864Z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 235 987T637 1139Q798 +1139 921 1069T1110 868T1176 561ZM469 1346Q438 1346 410 1320T368 1239H219Q230 1384 301 1466T491 1548Q532 1548 571 1532T649 1496T725 1460T798 1444Q829 1444 857 1470T899 1550H1048Q1037 1405 965 1323T776 1241Q735 1241 696 1257T618 1293T542 1329T469 +1346Z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1268" d="M403 561Q403 395 457 310T635 225Q757 225 810 309T864 561Q864 727 810 810T633 893Q511 893 457 811T403 561ZM1176 561Q1176 288 1032 134T631 -20Q470 -20 347 50T158 253T92 561Q92 835 235 987T637 1139Q798 +1139 921 1069T1110 868T1176 561ZM291 1405Q291 1470 328 1505T430 1540Q496 1540 533 1503T571 1405Q571 1345 533 1309T430 1272Q366 1272 329 1307T291 1405ZM694 1405Q694 1475 734 1507T835 1540Q900 1540 938 1504T977 1405Q977 1344 938 1308T835 1272Q775 +1272 735 1304T694 1405Z" /> +<glyph unicode="&#xf7;" horiz-adv-x="1168" d="M108 552V771H1060V552H108ZM444 313Q444 355 455 384T485 430T529 456T583 464Q611 464 636 456T680 431T710 384T722 313Q722 273 711 244T680 197T636 170T583 161Q555 161 530 169T485 196T455 244T444 313ZM444 +1011Q444 1053 455 1082T485 1129T529 1155T583 1163Q611 1163 636 1155T680 1129T710 1082T722 1011Q722 971 711 943T680 896T636 869T583 860Q555 860 530 868T485 895T455 942T444 1011Z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1268" d="M1176 561Q1176 288 1032 134T631 -20Q505 -20 397 25L330 -76L176 29L244 129Q92 285 92 561Q92 835 235 987T637 1139Q769 1139 885 1087L940 1169L1092 1061L1034 977Q1176 822 1176 561ZM403 561Q403 467 422 +395L739 870Q696 893 633 893Q511 893 457 811T403 561ZM864 561Q864 642 852 702L543 240Q581 225 635 225Q757 225 810 309T864 561Z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952ZM876 1241Q813 1285 691 1383T501 1548V1569H843Q906 1468 +1078 1268V1241H876Z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952ZM498 1241V1268Q670 1468 733 1569H1075V1548Q1023 1496 898 +1394T701 1241H498Z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952ZM901 1241Q744 1334 667 1417Q589 1336 438 1241H235V1268Q424 +1457 491 1569H848Q879 1517 955 1428T1104 1268V1241H901Z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1346" d="M952 0L911 143H895Q846 65 756 23T551 -20Q354 -20 254 85T154 389V1118H459V465Q459 344 502 284T639 223Q767 223 824 308T881 592V1118H1186V0H952ZM326 1405Q326 1470 363 1505T465 1540Q531 1540 568 1503T606 +1405Q606 1345 568 1309T465 1272Q401 1272 364 1307T326 1405ZM729 1405Q729 1475 769 1507T870 1540Q935 1540 973 1504T1012 1405Q1012 1344 973 1308T870 1272Q810 1272 770 1304T729 1405Z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1165" d="M0 1118H334L545 489Q572 407 582 295H588Q599 398 631 489L838 1118H1165L692 -143Q627 -318 507 -405T225 -492Q146 -492 70 -475V-233Q125 -246 190 -246Q271 -246 331 -197T426 -47L444 8L0 1118ZM393 1241V1268Q565 +1468 628 1569H970V1548Q918 1496 793 1394T596 1241H393Z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1296" d="M465 973Q515 1054 596 1096T782 1139Q980 1139 1092 985T1204 561Q1204 288 1093 134T782 -20Q569 -20 465 117H451L458 55L465 -39V-492H160V1556H465V1165L458 1045L451 973H465ZM684 895Q571 895 519 826T465 +596V563Q465 383 518 305T688 227Q893 227 893 565Q893 730 843 812T684 895Z" /> +<glyph unicode="&#xff;" horiz-adv-x="1165" d="M0 1118H334L545 489Q572 407 582 295H588Q599 398 631 489L838 1118H1165L692 -143Q627 -318 507 -405T225 -492Q146 -492 70 -475V-233Q125 -246 190 -246Q271 -246 331 -197T426 -47L444 8L0 1118ZM499 1405Q499 +1470 536 1505T638 1540Q704 1540 741 1503T779 1405Q779 1345 741 1309T638 1272Q574 1272 537 1307T499 1405ZM902 1405Q902 1475 942 1507T1043 1540Q1108 1540 1146 1504T1185 1405Q1185 1344 1146 1308T1043 1272Q983 1272 943 1304T902 1405Z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 496V726H942V496H82Z" /> +<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 496V726H1966V496H82Z" /> +<glyph unicode="&#x2018;" horiz-adv-x="687" d="M159 1014Q173 1069 192 1129T235 1252T284 1376T335 1493H555Q540 1433 526 1367T498 1235T473 1107T454 992H174L159 1014Z" /> +<glyph unicode="&#x2019;" horiz-adv-x="686" d="M576 1471Q562 1416 543 1356T500 1233T451 1109T400 992H181Q195 1052 209 1118T237 1250T262 1378T281 1493H561L576 1471Z" /> +<glyph unicode="&#x201a;" horiz-adv-x="584" d="M459 215Q407 13 283 -264H63Q128 2 164 238H444L459 215Z" /> +<glyph unicode="&#x201c;" horiz-adv-x="1153" d="M626 1014Q640 1069 659 1129T702 1252T751 1376T802 1493H1021Q1007 1433 993 1367T965 1235T940 1107T921 992H641L626 1014ZM159 1014Q173 1069 192 1129T235 1252T284 1376T335 1493H555Q540 1433 526 1367T498 +1235T473 1107T454 992H174L159 1014Z" /> +<glyph unicode="&#x201d;" horiz-adv-x="1153" d="M576 1471Q562 1416 543 1356T500 1233T451 1109T400 992H181Q195 1052 209 1118T237 1250T262 1378T281 1493H561L576 1471ZM1043 1471Q1029 1416 1010 1356T967 1233T918 1109T867 992H647Q662 1052 676 1118T704 +1250T729 1378T748 1493H1028L1043 1471Z" /> +<glyph unicode="&#x201e;" horiz-adv-x="1051" d="M459 215Q407 13 283 -264H63Q128 2 164 238H444L459 215ZM926 215Q874 13 750 -264H530Q595 2 631 238H911L926 215Z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M98 748Q98 902 172 983T385 1065Q522 1065 597 983T672 748Q672 596 597 513T385 430Q247 430 173 513T98 748Z" /> +<glyph unicode="&#x2039;" horiz-adv-x="754" d="M82 573L453 1028L672 909L393 561L672 213L453 94L82 547V573Z" /> +<glyph unicode="&#x203a;" horiz-adv-x="754" d="M672 547L301 94L82 213L360 561L82 909L301 1028L672 573V547Z" /> +</font> +</defs> +</svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf new file mode 100644 index 000000000000..4599e3ca9af9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff new file mode 100644 index 000000000000..9d0b78df8119 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 new file mode 100644 index 000000000000..55fc44bcd125 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot new file mode 100644 index 000000000000..cb97b2b4dd54 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg new file mode 100644 index 000000000000..abdafc0f53b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg @@ -0,0 +1,334 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<defs > +<font id="NotoSans" horiz-adv-x="1222" ><font-face + font-family="Noto Sans" + units-per-em="2048" + panose-1="2 11 8 2 4 5 4 9 2 4" + ascent="2189" + descent="-600" + alphabetic="0" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="586" d="M391 485H150L307 1462H647L391 485ZM25 115Q25 205 78 259T229 313Q297 313 338 275T379 168Q379 81 324 27T180 -27Q107 -27 66 10T25 115Z" /> +<glyph unicode="&quot;" horiz-adv-x="928" d="M549 1462L397 934H201L272 1462H549ZM954 1462L803 934H604L678 1462H954Z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M1036 846L967 614H1225L1206 408H909L793 0H573L690 408H496L381 0H166L279 408H41L59 614H336L406 846H154L172 1055H461L580 1462H797L680 1055H879L995 1462H1210L1094 1055H1333L1315 846H1036ZM553 614H750L819 +846H623L553 614Z" /> +<glyph unicode="$" horiz-adv-x="1128" d="M1034 496Q1034 312 909 205T541 80L502 -119H362L406 82Q197 94 51 168V434Q249 327 455 317L526 639Q363 700 285 790T207 1004Q207 1177 334 1283T684 1405L719 1556H858L825 1405Q991 1383 1120 1315L1014 1083Q882 +1148 772 1157L709 858Q840 807 904 759T1001 646T1034 496ZM594 322Q657 331 696 367T735 465Q735 511 711 540T651 584L594 322ZM633 1157Q571 1150 537 1116T502 1022Q502 943 582 911L633 1157Z" /> +<glyph unicode="%" horiz-adv-x="1753" d="M518 1274Q455 1274 408 1146T360 868Q360 772 416 772Q481 772 528 903T575 1178Q575 1274 518 1274ZM821 1165Q821 999 765 855T614 638T397 565Q258 565 187 648T115 885Q115 1054 170 1196T319 1411T535 1483Q672 +1483 746 1403T821 1165ZM1554 1462L471 0H231L1319 1462H1554ZM1376 690Q1337 690 1301 634T1242 478T1219 285Q1219 188 1274 188Q1315 188 1351 243T1410 397T1434 594Q1434 690 1376 690ZM1679 590Q1679 423 1625 277T1477 56T1262 -18Q1118 -18 1046 60T973 +283Q973 460 1026 605T1173 824T1393 899Q1530 899 1604 821T1679 590Z" /> +<glyph unicode="&amp;" horiz-adv-x="1450" d="M1325 0H975L903 98Q728 -20 500 -20Q291 -20 180 77T68 358Q68 503 146 606T420 807Q344 937 344 1065Q344 1260 461 1372T778 1485Q947 1485 1044 1403T1141 1178Q1141 898 776 752L971 489Q1015 546 1051 610T1130 +784H1430Q1297 471 1120 287L1325 0ZM541 623Q453 572 418 519T383 387Q383 322 428 279T545 236Q660 236 766 295L541 623ZM662 920Q775 979 817 1031T860 1143Q860 1200 830 1225T760 1251Q694 1251 658 1205T621 1085Q621 1039 633 993T662 920Z" /> +<glyph unicode="&apos;" horiz-adv-x="522" d="M549 1462L397 934H201L272 1462H549Z" /> +<glyph unicode="(" horiz-adv-x="694" d="M74 281Q74 620 196 907T578 1462H840Q585 1184 463 889T340 270Q340 -38 457 -324H223Q74 -58 74 281Z" /> +<glyph unicode=")" horiz-adv-x="694" d="M618 858Q618 516 494 228T115 -324H-147Q352 221 352 868Q352 1175 236 1462H469Q618 1198 618 858Z" /> +<glyph unicode="*" horiz-adv-x="1116" d="M885 1522L772 1169L1159 1198L1141 944L803 987L963 651L717 578L627 915L430 637L223 801L498 1049L172 1141L258 1378L596 1204L629 1573L885 1522Z" /> +<glyph unicode="+" horiz-adv-x="1128" d="M475 612H109V831H475V1200H694V831H1061V612H694V248H475V612Z" /> +<glyph unicode="," horiz-adv-x="584" d="M377 238L385 215Q267 -40 123 -264H-102Q-28 -97 92 238H377Z" /> +<glyph unicode="-" horiz-adv-x="659" d="M41 424L94 674H618L565 424H41Z" /> +<glyph unicode="." horiz-adv-x="584" d="M25 115Q25 205 78 259T229 313Q297 313 338 275T379 168Q379 81 324 27T180 -27Q107 -27 66 10T25 115Z" /> +<glyph unicode="/" horiz-adv-x="862" d="M1014 1462L205 0H-90L719 1462H1014Z" /> +<glyph unicode="0" horiz-adv-x="1128" d="M1110 1012Q1110 704 1029 464T803 102T469 -20Q271 -20 169 102T66 467Q66 758 148 994T376 1357T711 1485Q1110 1485 1110 1012ZM684 1235Q604 1235 535 1131T417 829T369 461Q369 346 396 288T494 229Q576 229 645 +335T761 637T807 1022Q807 1133 777 1184T684 1235Z" /> +<glyph unicode="1" horiz-adv-x="1128" d="M688 0H383L563 829Q598 981 639 1116Q630 1108 578 1069T315 899L182 1114L748 1462H997L688 0Z" /> +<glyph unicode="2" horiz-adv-x="1128" d="M913 0H-49L-6 213L471 637Q651 796 719 891T788 1071Q788 1146 747 1185T637 1225Q571 1225 502 1192T330 1073L184 1276Q316 1388 436 1435T686 1483Q876 1483 987 1385T1098 1126Q1098 1019 1057 925T935 737T668 +492L399 270V260H967L913 0Z" /> +<glyph unicode="3" horiz-adv-x="1128" d="M1104 1149Q1104 995 1010 890T748 756V748Q879 722 946 642T1014 440Q1014 307 940 202T728 39T401 -20Q162 -20 14 59V326Q98 276 196 251T387 225Q545 225 630 288T715 465Q715 637 457 637H319L365 858H438Q605 858 +701 920T797 1092Q797 1159 754 1196T633 1233Q499 1233 346 1133L219 1337Q343 1418 451 1450T698 1483Q888 1483 996 1393T1104 1149Z" /> +<glyph unicode="4" horiz-adv-x="1128" d="M1028 303H858L795 0H502L565 303H-25L23 537L793 1462H1104L909 543H1079L1028 303ZM616 543L674 791Q686 849 714 955T756 1096H745Q699 1014 618 915L305 543H616Z" /> +<glyph unicode="5" horiz-adv-x="1128" d="M623 922Q806 922 912 819T1018 532Q1018 365 947 240T738 48T408 -20Q291 -20 190 3T27 61V330Q201 231 379 231Q533 231 620 302T707 496Q707 590 650 637T483 684Q381 684 270 651L166 729L373 1462H1128L1073 1200H584L496 +907Q568 922 623 922Z" /> +<glyph unicode="6" horiz-adv-x="1128" d="M88 469Q88 671 149 864T316 1199T573 1413T930 1485Q1055 1485 1153 1458L1102 1212Q1018 1237 911 1237Q713 1237 592 1126T408 784H416Q531 950 727 950Q884 950 969 853T1055 580Q1055 411 984 267T794 51T516 -20Q304 +-20 196 107T88 469ZM530 227Q629 227 691 321T754 557Q754 628 721 670T618 713Q558 713 504 678T416 582T383 422Q383 331 423 279T530 227Z" /> +<glyph unicode="7" horiz-adv-x="1128" d="M78 0L815 1202H186L242 1462H1217L1176 1268L424 0H78Z" /> +<glyph unicode="8" horiz-adv-x="1128" d="M721 1485Q844 1485 936 1443T1077 1325T1126 1151Q1126 1017 1046 918T815 766Q1032 625 1032 401Q1032 279 969 183T788 33T514 -20Q300 -20 178 80T55 350Q55 648 403 776Q238 908 238 1075Q238 1194 296 1287T464 +1433T721 1485ZM582 643Q466 598 409 536T352 383Q352 302 402 255T537 207Q630 207 684 260T739 399Q739 472 703 530T582 643ZM694 1260Q618 1260 573 1214T528 1094Q528 962 651 893Q836 965 836 1114Q836 1182 797 1221T694 1260Z" /> +<glyph unicode="9" horiz-adv-x="1128" d="M1092 1001Q1092 721 993 468T729 98T326 -20Q198 -20 86 12V268Q197 227 313 227Q487 227 596 329T768 672H760Q649 514 465 514Q302 514 213 617T123 903Q123 1069 196 1208T392 1416T678 1485Q881 1485 986 1362T1092 +1001ZM645 1237Q580 1237 530 1195T452 1081T424 928Q424 841 461 797T567 752Q627 752 678 788T760 888T791 1047Q791 1131 756 1184T645 1237Z" /> +<glyph unicode=":" horiz-adv-x="584" d="M25 115Q25 205 78 259T229 313Q297 313 338 275T379 168Q379 81 324 27T180 -27Q107 -27 66 10T25 115ZM207 940Q207 1032 262 1085T412 1139Q480 1139 520 1101T561 993Q561 907 507 853T362 799Q290 799 249 835T207 940Z" /> +<glyph unicode=";" horiz-adv-x="584" d="M385 215Q267 -40 123 -264H-102Q-28 -97 92 238H377L385 215ZM207 940Q207 1032 262 1085T412 1139Q480 1139 520 1101T561 993Q561 907 507 853T362 799Q290 799 249 835T207 940Z" /> +<glyph unicode="&lt;" horiz-adv-x="1128" d="M1061 203L109 641V784L1061 1280V1040L418 723L1061 442V203Z" /> +<glyph unicode="=" horiz-adv-x="1128" d="M109 418V637H1061V418H109ZM109 807V1024H1061V807H109Z" /> +<glyph unicode="&gt;" horiz-adv-x="1128" d="M109 442L752 723L109 1040V1280L1061 784V641L109 203V442Z" /> +<glyph unicode="?" horiz-adv-x="940" d="M260 485Q287 631 345 723T520 895Q644 979 677 1022T711 1118Q711 1237 578 1237Q528 1237 472 1221T270 1137L178 1358Q408 1483 623 1483Q800 1483 903 1396T1006 1151Q1006 1068 978 1002T895 879T705 731Q611 668 +575 620T518 485H260ZM166 115Q166 206 221 259T371 313Q439 313 479 275T520 168Q520 81 465 27T322 -27Q248 -27 207 11T166 115Z" /> +<glyph unicode="@" horiz-adv-x="1753" d="M1733 840Q1733 667 1669 519T1492 288T1237 205Q1149 205 1093 243T1020 352H1010Q958 272 896 239T754 205Q627 205 556 284T485 514Q485 661 552 790T740 995T1008 1071Q1193 1071 1335 1016L1229 596Q1218 552 1210 +520T1202 455Q1202 387 1260 387Q1326 387 1384 451T1476 622T1511 836Q1511 1049 1388 1161T1028 1274Q825 1274 662 1180T407 914T315 522Q315 279 449 142T825 4Q942 4 1044 24T1266 90V-96Q1036 -186 801 -186Q584 -186 423 -101T177 141T92 500Q92 779 212 +997T555 1338T1053 1462Q1371 1462 1552 1299T1733 840ZM995 889Q913 889 850 838T750 701T713 526Q713 461 737 424T807 387Q948 387 1020 657L1077 879Q1041 889 995 889Z" /> +<glyph unicode="A" horiz-adv-x="1286" d="M842 348H369L197 0H-123L643 1468H1016L1163 0H866L842 348ZM827 608L801 958L796 1091L793 1247H788Q734 1100 682 993L494 608H827Z" /> +<glyph unicode="B" horiz-adv-x="1270" d="M788 1462Q1017 1462 1134 1381T1251 1137Q1251 987 1168 891T932 762V754Q1032 728 1091 658T1151 477Q1151 248 998 124T575 0H53L362 1462H788ZM545 883H694Q815 883 875 931T936 1071Q936 1208 766 1208H614L545 +883ZM412 256H592Q709 256 775 314T842 475Q842 637 659 637H494L412 256Z" /> +<glyph unicode="C" horiz-adv-x="1253" d="M905 1227Q773 1227 668 1146T498 907T434 569Q434 402 502 321T721 240Q867 240 1059 317V57Q860 -20 659 -20Q405 -20 264 129T123 553Q123 815 227 1035T505 1370T905 1485Q1030 1485 1127 1463T1335 1380L1217 1130Q1111 +1189 1042 1208T905 1227Z" /> +<glyph unicode="D" horiz-adv-x="1386" d="M1323 909Q1323 629 1225 423T942 108T504 0H53L362 1462H758Q1028 1462 1175 1319T1323 909ZM518 256Q666 256 776 332T948 555T1010 893Q1010 1047 938 1127T729 1208H614L412 256H518Z" /> +<glyph unicode="E" horiz-adv-x="1110" d="M870 0H53L362 1462H1180L1126 1208H614L547 887H1024L969 633H492L412 256H924L870 0Z" /> +<glyph unicode="F" horiz-adv-x="1087" d="M358 0H53L362 1462H1176L1122 1208H614L535 831H1008L952 578H479L358 0Z" /> +<glyph unicode="G" horiz-adv-x="1413" d="M754 821H1317L1155 59Q1021 13 907 -3T664 -20Q405 -20 264 127T123 549Q123 815 228 1031T527 1366T979 1485Q1197 1485 1389 1386L1274 1135Q1200 1175 1126 1199T965 1223Q812 1223 692 1140T503 904T434 573Q434 +401 506 321T729 240Q805 240 899 264L965 563H698L754 821Z" /> +<glyph unicode="H" horiz-adv-x="1434" d="M1135 0H829L963 631H492L358 0H53L362 1462H668L547 889H1018L1139 1462H1444L1135 0Z" /> +<glyph unicode="I" horiz-adv-x="784" d="M588 0H-59L-23 176L164 258L365 1204L213 1286L250 1462H897L860 1286L670 1204L469 258L625 176L588 0Z" /> +<glyph unicode="J" horiz-adv-x="678" d="M-135 -430Q-229 -430 -322 -403V-150Q-234 -170 -158 -170Q-59 -170 2 -110T92 82L385 1462H690L387 39Q335 -206 212 -318T-135 -430Z" /> +<glyph unicode="K" horiz-adv-x="1255" d="M1141 0H803L592 592L467 522L358 0H53L362 1462H668L514 756L670 965L1083 1462H1444L850 762L1141 0Z" /> +<glyph unicode="L" horiz-adv-x="1061" d="M53 0L362 1462H668L412 256H924L870 0H53Z" /> +<glyph unicode="M" horiz-adv-x="1802" d="M840 369L1389 1462H1812L1503 0H1223L1368 692Q1404 861 1477 1133H1468L899 0H618L557 1133H549Q527 951 471 680L328 0H53L362 1462H766L831 369H840Z" /> +<glyph unicode="N" horiz-adv-x="1546" d="M1247 0H905L549 1106H539L531 1047Q504 833 473 688L328 0H53L362 1462H719L1059 385H1067Q1102 608 1135 770L1282 1462H1556L1247 0Z" /> +<glyph unicode="O" horiz-adv-x="1495" d="M1432 938Q1432 655 1333 432T1062 94T666 -20Q410 -20 267 127T123 537Q123 802 222 1024T495 1366T897 1485Q1152 1485 1292 1341T1432 938ZM872 1227Q751 1227 650 1136T492 884T434 537Q434 390 500 315T688 240Q809 +240 908 327T1064 573T1120 930Q1120 1072 1055 1149T872 1227Z" /> +<glyph unicode="P" horiz-adv-x="1249" d="M1260 1036Q1260 795 1091 658T623 520H467L358 0H53L362 1462H770Q1012 1462 1136 1355T1260 1036ZM522 774H647Q789 774 870 843T952 1028Q952 1121 904 1164T758 1208H614L522 774Z" /> +<glyph unicode="Q" horiz-adv-x="1495" d="M1432 938Q1432 622 1310 383T975 45L1229 -348H870L692 -20H666Q410 -20 267 127T123 537Q123 802 222 1024T495 1366T897 1485Q1152 1485 1292 1341T1432 938ZM872 1227Q751 1227 650 1136T492 884T434 537Q434 390 +500 315T688 240Q809 240 908 327T1064 573T1120 930Q1120 1072 1055 1149T872 1227Z" /> +<glyph unicode="R" horiz-adv-x="1247" d="M530 813H608Q739 813 812 870T885 1044Q885 1126 838 1167T688 1208H614L530 813ZM477 561L358 0H53L362 1462H721Q958 1462 1077 1360T1196 1061Q1196 903 1113 790T874 621L1135 0H803L596 561H477Z" /> +<glyph unicode="S" horiz-adv-x="1085" d="M946 432Q946 223 798 102T397 -20Q176 -20 41 70V344Q234 236 399 236Q511 236 574 278T637 395Q637 438 624 470T585 531T461 633Q323 732 267 829T211 1038Q211 1167 273 1268T449 1426T713 1483Q930 1483 1110 1384L1001 +1151Q845 1225 713 1225Q630 1225 577 1180T524 1061Q524 1000 557 955T705 834Q826 754 886 658T946 432Z" /> +<glyph unicode="T" horiz-adv-x="1087" d="M571 0H266L520 1204H168L223 1462H1233L1178 1204H825L571 0Z" /> +<glyph unicode="U" horiz-adv-x="1415" d="M1434 1462L1233 516Q1176 250 1015 115T596 -20Q384 -20 263 93T141 401Q141 473 156 539L352 1462H657L463 543Q446 469 446 418Q446 240 635 240Q758 240 830 316T934 545L1128 1462H1434Z" /> +<glyph unicode="V" horiz-adv-x="1208" d="M537 299L564 377Q615 525 645 582L1077 1462H1393L645 0H311L184 1462H479L530 582L532 529V465Q532 350 528 299H537Z" /> +<glyph unicode="W" horiz-adv-x="1831" d="M1004 1018Q952 855 891 719L567 0H229L184 1462H471L477 664Q477 612 473 491T463 317H471Q504 410 544 515T596 643L965 1462H1235L1256 589Q1256 443 1247 317H1255Q1308 476 1384 666L1714 1462H2023L1376 0H1030L1008 +721L1006 834Q1006 928 1012 1018H1004Z" /> +<glyph unicode="X" horiz-adv-x="1241" d="M1124 0H793L621 543L225 0H-117L459 764L221 1462H541L694 944L1057 1462H1401L856 737L1124 0Z" /> +<glyph unicode="Y" horiz-adv-x="1155" d="M627 870L1001 1462H1343L725 559L606 0H303L422 559L186 1462H498L627 870Z" /> +<glyph unicode="Z" horiz-adv-x="1098" d="M920 0H-61L-23 201L754 1206H211L264 1462H1200L1159 1260L377 256H973L920 0Z" /> +<glyph unicode="[" horiz-adv-x="678" d="M436 -324H-37L344 1462H817L772 1251H557L266 -113H481L436 -324Z" /> +<glyph unicode="\" horiz-adv-x="862" d="M481 1462L705 0H438L221 1462H481Z" /> +<glyph unicode="]" horiz-adv-x="678" d="M-92 -113H121L412 1251H197L242 1462H715L334 -324H-137L-92 -113Z" /> +<glyph unicode="^" horiz-adv-x="1128" d="M35 520L653 1470H801L1077 520H854L680 1153L279 520H35Z" /> +<glyph unicode="_" horiz-adv-x="819" d="M635 -324H-186L-156 -184H666L635 -324Z" /> +<glyph unicode="`" horiz-adv-x="1135" d="M934 1241H750Q679 1310 612 1394T508 1548V1569H819Q855 1421 934 1266V1241Z" /> +<glyph unicode="a" horiz-adv-x="1217" d="M406 -20Q259 -20 175 86T90 385Q90 583 162 762T351 1040T608 1139Q705 1139 775 1097T885 975H893L950 1118H1182L944 0H719L733 145H725Q591 -20 406 -20ZM524 223Q593 223 657 290T760 471T799 731Q799 802 761 848T659 +895Q591 895 530 823T432 633T395 399Q395 311 428 267T524 223Z" /> +<glyph unicode="b" horiz-adv-x="1219" d="M610 -20Q416 -20 334 143H326L268 0H37L367 1556H668L606 1268Q565 1086 522 969H530Q608 1067 672 1103T813 1139Q959 1139 1043 1031T1128 733Q1128 543 1060 366T873 84T610 -20ZM692 895Q618 895 558 830T459 641T420 +399Q420 319 457 271T559 223Q626 223 687 292T785 481T823 719Q823 895 692 895Z" /> +<glyph unicode="c" horiz-adv-x="989" d="M506 -20Q305 -20 198 87T90 391Q90 603 164 776T374 1044T682 1139Q864 1139 1010 1067L918 838Q864 861 812 878T694 895Q609 895 541 831T434 656T395 416Q395 320 440 272T567 223Q643 223 708 246T842 305V59Q690 +-20 506 -20Z" /> +<glyph unicode="d" horiz-adv-x="1217" d="M406 -20Q259 -20 175 87T90 387Q90 583 161 761T350 1039T608 1139Q690 1139 749 1102T862 975H870L872 1003Q878 1113 897 1198L973 1556H1274L944 0H715L733 145H725Q654 58 577 19T406 -20ZM532 223Q602 223 661 +286T759 476T799 719Q799 799 762 847T659 895Q591 895 530 823T432 633T395 399Q395 223 532 223Z" /> +<glyph unicode="e" horiz-adv-x="1141" d="M696 922Q608 922 530 842T428 647H473Q628 647 714 695T801 827Q801 922 696 922ZM532 -20Q322 -20 206 93T90 412Q90 619 172 789T396 1049T715 1139Q892 1139 991 1058T1090 834Q1090 647 923 546T446 444H395L393 +423V403Q393 312 444 260T592 207Q679 207 750 226T922 293V66Q750 -20 532 -20Z" /> +<glyph unicode="f" horiz-adv-x="764" d="M-45 -492Q-149 -492 -219 -467V-225Q-158 -246 -104 -246Q-43 -246 3 -206T68 -76L272 889H109L139 1034L322 1118L340 1202Q381 1392 478 1479T752 1567Q883 1567 987 1518L907 1294Q838 1325 774 1325Q717 1325 682 +1285T635 1180L623 1118H842L793 889H573L358 -121Q281 -492 -45 -492Z" /> +<glyph unicode="g" horiz-adv-x="1217" d="M950 1118H1182L938 -27Q886 -265 756 -378T391 -492Q287 -492 203 -477T27 -420V-158Q187 -244 375 -244Q479 -244 544 -197T638 -48T696 150H688Q616 56 545 18T391 -20Q252 -20 171 87T90 385Q90 581 160 758T348 +1037T602 1139Q692 1139 756 1105T885 975H893L950 1118ZM537 223Q605 223 663 287T760 472T799 719Q799 799 762 847T662 895Q591 895 529 823T431 635T395 399Q395 311 433 267T537 223Z" /> +<glyph unicode="h" horiz-adv-x="1237" d="M977 0H676L813 653Q829 721 829 772Q829 895 721 895Q629 895 554 781T436 463L338 0H37L367 1556H668Q629 1375 608 1278T522 969H530Q592 1046 668 1092T844 1139Q982 1139 1057 1056T1133 817Q1133 744 1110 637L977 0Z" /> +<glyph unicode="i" horiz-adv-x="608" d="M338 0H37L274 1118H575L338 0ZM322 1380Q322 1467 369 1511T504 1556Q577 1556 615 1525T653 1436Q653 1356 609 1307T473 1257Q322 1257 322 1380Z" /> +<glyph unicode="j" horiz-adv-x="608" d="M-90 -492Q-194 -492 -264 -467V-225Q-203 -246 -150 -246Q-13 -246 23 -76L276 1118H578L313 -121Q236 -492 -90 -492ZM324 1380Q324 1467 371 1511T506 1556Q579 1556 617 1525T655 1436Q655 1356 611 1307T475 1257Q324 +1257 324 1380Z" /> +<glyph unicode="k" horiz-adv-x="1163" d="M920 1118H1264L766 614L1051 0H715L532 420L412 348L338 0H37L367 1556H668L520 862Q509 805 472 687L459 643H467L920 1118Z" /> +<glyph unicode="l" horiz-adv-x="608" d="M338 0H37L367 1556H668L338 0Z" /> +<glyph unicode="m" horiz-adv-x="1853" d="M844 1139Q1063 1139 1106 911H1114Q1184 1023 1275 1081T1470 1139Q1606 1139 1677 1054T1749 817Q1749 741 1726 637L1593 0H1292L1430 653Q1446 721 1446 772Q1446 895 1348 895Q1254 895 1179 780T1063 465L967 0H666L803 +653Q819 721 819 772Q819 895 721 895Q629 895 554 781T436 463L338 0H37L274 1118H504L483 911H492Q638 1139 844 1139Z" /> +<glyph unicode="n" horiz-adv-x="1237" d="M977 0H676L813 653Q829 721 829 772Q829 895 721 895Q629 895 554 781T436 463L338 0H37L274 1118H504L483 911H492Q638 1139 844 1139Q982 1139 1057 1056T1133 817Q1133 744 1110 637L977 0Z" /> +<glyph unicode="o" horiz-adv-x="1198" d="M805 696Q805 893 662 893Q587 893 528 832T431 653T393 410Q393 225 543 225Q618 225 678 286T771 457T805 696ZM1108 696Q1108 485 1038 322T834 70T518 -20Q323 -20 207 97T90 410Q90 623 161 789T368 1047T684 1139Q880 +1139 994 1021T1108 696Z" /> +<glyph unicode="p" horiz-adv-x="1219" d="M813 1139Q959 1139 1043 1032T1128 731Q1128 540 1060 364T872 84T610 -20Q527 -20 467 17T356 143H348Q336 -16 305 -152L233 -492H-68L274 1118H504L487 948H496Q634 1139 813 1139ZM692 895Q618 895 558 830T459 +642T420 399Q420 319 457 271T559 223Q626 223 687 292T785 481T823 719Q823 895 692 895Z" /> +<glyph unicode="q" horiz-adv-x="1217" d="M391 -20Q303 -20 235 27T129 166T90 385Q90 583 162 762T351 1040T608 1139Q694 1139 760 1102T885 975H893L950 1118H1182L840 -492H539Q586 -274 612 -155T696 150H688Q616 56 545 18T391 -20ZM535 223Q605 223 663 +287T760 475T799 719Q799 799 762 847T659 895Q591 895 530 823T432 633T395 399Q395 311 431 267T535 223Z" /> +<glyph unicode="r" horiz-adv-x="862" d="M842 1139Q901 1139 938 1128L872 838Q827 854 772 854Q656 854 569 763T444 500L338 0H37L274 1118H504L483 911H494Q639 1139 842 1139Z" /> +<glyph unicode="s" horiz-adv-x="969" d="M829 369Q829 181 705 81T358 -20Q251 -20 172 -5T23 45V293Q180 203 342 203Q422 203 473 235T524 324Q524 367 487 401T356 487Q235 555 187 622T139 782Q139 952 249 1045T565 1139Q766 1139 928 1044L829 829Q689 +913 571 913Q514 913 479 888T444 819Q444 780 476 751T596 676Q719 613 774 539T829 369Z" /> +<glyph unicode="t" horiz-adv-x="840" d="M514 223Q579 223 676 258V33Q565 -20 410 -20Q260 -20 190 43T119 238Q119 288 131 350L246 889H94L123 1036L319 1120L451 1356H645L596 1118H879L829 889H547L432 350Q426 320 426 297Q426 223 514 223Z" /> +<glyph unicode="u" horiz-adv-x="1237" d="M262 1118H563L426 465Q410 397 410 346Q410 223 518 223Q610 223 685 337T803 655L901 1118H1202L965 0H735L756 207H745Q600 -20 395 -20Q257 -20 184 62T111 301Q111 394 135 514L262 1118Z" /> +<glyph unicode="v" horiz-adv-x="1049" d="M459 301Q523 478 547 524L844 1118H1167L563 0H240L102 1118H397L442 532Q449 399 449 301H459Z" /> +<glyph unicode="w" horiz-adv-x="1614" d="M850 860Q760 605 733 541L500 0H176L125 1118H406L410 623Q410 414 399 285H408Q420 329 454 425T514 582L745 1118H1073V582Q1073 389 1063 285H1073Q1154 535 1192 623L1411 1118H1718L1188 0H858L852 520Q852 675 +862 860H850Z" /> +<glyph unicode="x" horiz-adv-x="1087" d="M379 573L154 1118H475L590 784L834 1118H1188L721 557L965 0H639L514 342L250 0H-100L379 573Z" /> +<glyph unicode="y" horiz-adv-x="1063" d="M102 1118H397L453 600Q465 495 465 307H473Q493 358 517 426T582 580L842 1118H1169L489 -160Q312 -492 6 -492Q-84 -492 -141 -473V-233Q-73 -246 -25 -246Q59 -246 122 -198T240 -49L266 0L102 1118Z" /> +<glyph unicode="z" horiz-adv-x="932" d="M748 0H-47L-12 180L563 885H166L217 1118H967L924 918L358 233H797L748 0Z" /> +<glyph unicode="{" horiz-adv-x="727" d="M201 319Q201 459 -8 459L37 688Q159 688 229 729T322 868L383 1153Q421 1323 514 1392T784 1462H868L819 1237Q729 1235 689 1203T633 1096L567 799Q522 592 291 563V555Q376 529 417 473T459 338Q459 294 444 225L408 +47Q401 19 401 -4Q401 -58 434 -78T526 -98V-324H473Q306 -324 220 -261T133 -76Q133 -19 147 49L186 233Q201 302 201 319Z" /> +<glyph unicode="|" horiz-adv-x="1128" d="M455 1550H674V-465H455V1550Z" /> +<glyph unicode="}" horiz-adv-x="727" d="M256 1462Q596 1462 596 1214Q596 1158 582 1090L543 905Q528 836 528 819Q528 680 737 680L692 451Q570 451 500 409T408 270L346 -14Q309 -184 216 -254T-55 -324H-100V-98Q-7 -95 37 -63T96 43L162 340Q187 451 257 +506T438 575V584Q270 635 270 801Q270 844 285 913L322 1092Q328 1122 328 1143Q328 1197 292 1217T182 1237L223 1462H256Z" /> +<glyph unicode="~" horiz-adv-x="1128" d="M342 672Q288 672 226 639T109 551V782Q210 891 365 891Q429 891 482 877T621 827Q685 800 732 786T827 772Q878 772 939 802T1061 893V662Q958 553 805 553Q746 553 696 564T549 616Q460 654 422 663T342 672Z" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="&#xa1;" horiz-adv-x="586" d="M182 606H424L266 -371H-74L182 606ZM549 977Q549 885 494 832T344 778Q276 778 236 816T195 924Q195 1009 249 1063T393 1118Q466 1118 507 1081T549 977Z" /> +<glyph unicode="&#xa2;" horiz-adv-x="1128" d="M575 -20H387L436 190Q302 226 233 326T164 584Q164 777 226 939T404 1201T672 1325L705 1483H893L858 1325Q976 1311 1083 1260L991 1030Q938 1053 886 1070T768 1087Q685 1087 619 1028T511 855T469 608Q469 512 +514 464T641 416Q716 416 781 439T915 498V252Q779 181 616 172L575 -20Z" /> +<glyph unicode="&#xa3;" horiz-adv-x="1128" d="M872 1485Q1067 1485 1241 1399L1128 1167Q987 1235 891 1235Q816 1235 768 1196T700 1063L653 834H952L907 614H608L590 530Q548 335 381 260H1036L981 0H-12L37 246Q233 294 281 510L303 614H111L156 834H348L397 +1081Q438 1278 559 1381T872 1485Z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1128" d="M190 723Q190 825 244 920L115 1047L262 1194L389 1067Q480 1120 586 1120Q691 1120 782 1065L909 1194L1059 1051L930 922Q983 833 983 723Q983 616 930 524L1055 399L909 254L782 379Q687 328 586 328Q471 328 +387 379L262 256L117 401L244 526Q190 619 190 723ZM397 723Q397 646 451 591T586 535Q667 535 722 590T778 723Q778 803 722 858T586 913Q508 913 453 857T397 723Z" /> +<glyph unicode="&#xa5;" horiz-adv-x="1128" d="M608 872L979 1462H1290L784 715H987L948 537H696L668 399H920L883 221H631L584 0H293L340 221H88L125 399H377L406 537H154L193 715H389L197 1462H494L608 872Z" /> +<glyph unicode="&#xa6;" horiz-adv-x="1128" d="M455 1550H674V735H455V1550ZM455 350H674V-465H455V350Z" /> +<glyph unicode="&#xa7;" horiz-adv-x="995" d="M150 756Q150 841 196 914T352 1057Q310 1091 282 1141T254 1249Q254 1396 370 1481T684 1567Q856 1567 1028 1479L946 1286Q799 1370 664 1370Q601 1370 561 1345T520 1264Q520 1222 560 1189T688 1118Q810 1064 +870 991T930 819Q930 635 737 520Q775 485 801 435T827 326Q827 165 701 73T356 -20Q152 -20 20 55V279Q192 174 365 174Q464 174 509 209T555 301Q555 340 522 373T395 453Q278 510 214 583T150 756ZM506 958Q455 934 424 890T393 793Q393 742 435 700T580 612Q629 +643 655 689T682 782Q682 888 506 958Z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1135" d="M416 1382Q416 1460 455 1500T567 1540Q692 1540 692 1432Q692 1359 656 1316T543 1272Q416 1272 416 1382ZM799 1382Q799 1460 838 1500T950 1540Q1075 1540 1075 1432Q1075 1359 1039 1316T926 1272Q799 1272 799 1382Z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M928 1055Q806 1055 740 971T674 731Q674 406 928 406Q1021 406 1141 451V322Q1076 294 1027 283T920 272Q730 272 623 392T516 731Q516 940 626 1064T930 1188Q1056 1188 1182 1126L1120 1001Q1012 1055 928 1055ZM137 +731Q137 931 237 1106T512 1382T889 1483Q1086 1483 1259 1386T1536 1114T1640 731Q1640 527 1540 355T1267 81T889 -20Q682 -20 507 83T235 360T137 731ZM246 731Q246 559 332 410T567 175T889 88Q1062 88 1210 173T1446 407T1534 731Q1534 906 1447 1054T1211 +1288T889 1374Q717 1374 568 1288T333 1053T246 731Z" /> +<glyph unicode="&#xaa;" horiz-adv-x="772" d="M369 748Q266 748 209 818T152 1016Q152 1133 198 1244T321 1415T498 1475Q563 1475 605 1449T676 1372H684L723 1462H877L719 760H571L580 852H571Q491 748 369 748ZM442 899Q487 899 526 939T591 1060T618 1214Q618 +1321 530 1321Q457 1321 407 1225T356 1010Q356 899 442 899Z" /> +<glyph unicode="&#xab;" horiz-adv-x="1151" d="M72 569L473 1032L664 877L385 543L520 193L274 90L72 551V569ZM559 569L961 1032L1151 877L872 543L1008 193L762 90L559 551V569Z" /> +<glyph unicode="&#xac;" horiz-adv-x="1128" d="M1061 248H842V612H109V831H1061V248Z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M41 424L94 674H618L565 424H41Z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M137 731Q137 931 237 1106T512 1382T889 1483Q1086 1483 1259 1386T1536 1114T1640 731Q1640 527 1540 355T1267 81T889 -20Q682 -20 507 83T235 360T137 731ZM246 731Q246 559 332 410T567 175T889 88Q1062 88 +1210 173T1446 407T1534 731Q1534 906 1447 1054T1211 1288T889 1374Q717 1374 568 1288T333 1053T246 731ZM1198 913Q1198 836 1151 773T1018 674L1243 291H1083L883 639H774V291H639V1171H874Q1039 1171 1118 1107T1198 913ZM774 762H862Q1055 762 1055 909Q1055 +984 1007 1014T862 1044H774V762Z" /> +<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M1214 1556H178L223 1757H1260L1214 1556Z" /> +<glyph unicode="&#xb0;" horiz-adv-x="877" d="M164 1137Q164 1230 210 1310T338 1437T510 1483Q603 1483 683 1436T810 1309T856 1137Q856 1044 810 964T684 839T510 793Q417 793 337 838T211 963T164 1137ZM354 1137Q354 1074 399 1029T510 983Q576 983 621 +1029T666 1137Q666 1200 621 1247T510 1294Q445 1294 400 1247T354 1137Z" /> +<glyph unicode="&#xb1;" horiz-adv-x="1128" d="M475 674H109V893H475V1262H694V893H1061V674H694V309H475V674ZM109 0V219H1061V0H109Z" /> +<glyph unicode="&#xb2;" horiz-adv-x="776" d="M707 586H59L94 752L367 971Q478 1062 508 1093T552 1152T567 1208Q567 1250 542 1270T481 1290Q395 1290 293 1208L193 1366Q267 1423 349 1453T541 1483Q664 1483 737 1420T811 1260Q811 1190 789 1137T719 1034T530 +881L401 786H748L707 586Z" /> +<glyph unicode="&#xb3;" horiz-adv-x="776" d="M813 1270Q813 1184 762 1127T596 1038V1030Q750 997 750 856Q750 725 643 647T358 569Q283 569 213 584T92 625V817Q217 745 346 745Q422 745 471 775T520 864Q520 901 494 926T406 952H279L313 1112H403Q487 1112 +535 1140T584 1225Q584 1265 558 1285T487 1305Q401 1305 299 1239L217 1389Q359 1481 530 1481Q660 1481 736 1426T813 1270Z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M483 1266Q562 1354 705 1569H1040V1552Q994 1496 886 1400T692 1241H483V1266Z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1249" d="M424 348Q424 288 455 256T535 223Q625 223 697 329T815 649L913 1118H1214L977 0H752L770 176H760Q643 -20 494 -20Q443 -20 405 -1T346 47H336Q323 -58 316 -101T236 -492H-68L274 1118H575L440 473Q424 403 424 348Z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1202 -260H1040V1356H874V-260H713V559Q651 541 567 541Q351 541 249 666T147 1042Q147 1298 254 1427T598 1556H1202V-260Z" /> +<glyph unicode="&#xb7;" horiz-adv-x="584" d="M131 695Q131 785 184 839T335 893Q403 893 444 855T485 748Q485 661 430 607T286 553Q213 553 172 590T131 695Z" /> +<glyph unicode="&#xb8;" horiz-adv-x="420" d="M262 -250Q262 -366 179 -429T-55 -492Q-141 -492 -207 -469V-301Q-144 -324 -82 -324Q20 -324 20 -242Q20 -208 -11 -186T-121 -154L-25 0H160L121 -72Q262 -121 262 -250Z" /> +<glyph unicode="&#xb9;" horiz-adv-x="776" d="M528 1462H735L549 586H303L387 983Q411 1092 442 1190Q426 1175 362 1130L231 1049L129 1214L528 1462Z" /> +<glyph unicode="&#xba;" horiz-adv-x="754" d="M809 1190Q809 1062 761 958T628 801T432 748Q298 748 230 823T162 1034Q162 1231 266 1353T543 1475Q672 1475 740 1402T809 1190ZM522 1311Q458 1311 415 1222T371 1022Q371 911 451 911Q514 911 556 996T598 1204Q598 +1311 522 1311Z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1151" d="M1079 553L678 90L487 245L766 579L631 929L877 1032L1079 571V553ZM592 553L190 90L0 245L279 579L143 929L389 1032L592 571V553Z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1804" d="M1500 1462L416 0H177L1264 1462H1500ZM752 1462H959L773 586H527L611 983Q635 1092 666 1190Q650 1175 586 1130L455 1049L353 1214L752 1462ZM1573 152H1454L1422 1H1184L1217 152H844L875 326L1350 883H1610L1489 +320H1608L1573 152ZM1252 320L1310 551L1332 625Q1319 605 1289 567T1078 320H1252Z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1804" d="M1500 1462L416 0H177L1264 1462H1500ZM752 1462H959L773 586H527L611 983Q635 1092 666 1190Q650 1175 586 1130L455 1049L353 1214L752 1462ZM1588 1H940L975 167L1248 386Q1359 477 1389 508T1433 567T1448 623Q1448 +665 1423 685T1362 705Q1276 705 1174 623L1074 781Q1148 838 1230 868T1422 898Q1545 898 1618 835T1692 675Q1692 605 1670 552T1600 449T1411 296L1282 201H1629L1588 1Z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1804" d="M854 1270Q854 1184 803 1127T637 1038V1030Q791 997 791 856Q791 725 684 647T399 569Q324 569 254 584T133 625V817Q258 745 387 745Q463 745 512 775T561 864Q561 901 535 926T447 952H320L354 1112H444Q528 +1112 576 1140T625 1225Q625 1265 599 1285T528 1305Q442 1305 340 1239L258 1389Q400 1481 571 1481Q701 1481 777 1426T854 1270ZM1631 1462L547 0H308L1395 1462H1631ZM1634 152H1515L1483 1H1245L1278 152H905L936 326L1411 883H1671L1550 320H1669L1634 152ZM1313 +320L1371 551L1393 625Q1380 605 1350 567T1139 320H1313Z" /> +<glyph unicode="&#xbf;" horiz-adv-x="940" d="M678 606Q652 461 598 372T418 197Q296 114 262 71T227 -27Q227 -145 360 -145Q410 -145 466 -129T668 -45L760 -266Q539 -391 315 -391Q138 -391 35 -304T-68 -59Q-68 23 -40 89T44 213T233 360Q327 423 363 471T420 +606H678ZM772 977Q772 885 717 832T567 778Q499 778 459 816T418 924Q418 1010 472 1064T616 1118Q689 1118 730 1081T772 977Z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1286" d="M842 348H369L197 0H-123L643 1468H1016L1163 0H866L842 348ZM827 608L801 958L796 1091L793 1247H788Q734 1100 682 993L494 608H827ZM965 1579H781Q710 1648 643 1732T539 1886V1907H850Q886 1759 965 1604V1579Z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1286" d="M842 348H369L197 0H-123L643 1468H1016L1163 0H866L842 348ZM827 608L801 958L796 1091L793 1247H788Q734 1100 682 993L494 608H827ZM735 1604Q814 1692 957 1907H1292V1890Q1246 1834 1138 1738T944 1579H735V1604Z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1286" d="M842 348H369L197 0H-123L643 1468H1016L1163 0H866L842 348ZM827 608L801 958L796 1091L793 1247H788Q734 1100 682 993L494 608H827ZM1235 1579H1037Q974 1632 875 1747Q770 1659 643 1579H426V1604Q489 1661 +579 1751T721 1907H1059Q1081 1853 1133 1765T1235 1604V1579Z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1286" d="M842 348H369L197 0H-123L643 1468H1016L1163 0H866L842 348ZM827 608L801 958L796 1091L793 1247H788Q734 1100 682 993L494 608H827ZM999 1579Q950 1579 913 1595T843 1631T782 1667T719 1684Q688 1684 664 1656T625 +1577H448Q507 1886 729 1886Q778 1886 816 1870T888 1834T950 1798T1010 1782Q1044 1782 1068 1807T1114 1888H1286Q1220 1579 999 1579Z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1286" d="M842 348H369L197 0H-123L643 1468H1016L1163 0H866L842 348ZM827 608L801 958L796 1091L793 1247H788Q734 1100 682 993L494 608H827ZM535 1720Q535 1798 574 1838T686 1878Q811 1878 811 1770Q811 1697 775 1654T662 +1610Q535 1610 535 1720ZM918 1720Q918 1798 957 1838T1069 1878Q1194 1878 1194 1770Q1194 1697 1158 1654T1045 1610Q918 1610 918 1720Z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1286" d="M1087 1571Q1087 1468 1022 1403L1163 0H866L842 348H369L197 0H-123L623 1432Q586 1485 586 1569Q586 1677 653 1741T834 1806Q943 1806 1015 1742T1087 1571ZM827 608L801 958L796 1093L793 1247H788Q734 1100 +682 993L494 608H827ZM930 1569Q930 1614 903 1639T834 1665Q792 1665 765 1640T737 1569Q737 1524 761 1499T834 1473Q876 1473 903 1498T930 1569Z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1833" d="M1593 0H776L850 348H424L205 0H-123L799 1462H1903L1849 1208H1337L1270 887H1747L1692 633H1214L1135 256H1647L1593 0ZM905 608L1032 1208H952L588 608H905Z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1253" d="M905 1227Q773 1227 668 1146T498 907T434 569Q434 402 502 321T721 240Q867 240 1059 317V57Q860 -20 659 -20Q405 -20 264 129T123 553Q123 815 227 1035T505 1370T905 1485Q1030 1485 1127 1463T1335 1380L1217 +1130Q1111 1189 1042 1208T905 1227ZM825 -250Q825 -366 742 -429T508 -492Q422 -492 356 -469V-301Q419 -324 481 -324Q583 -324 583 -242Q583 -208 552 -186T442 -154L538 0H723L684 -72Q825 -121 825 -250Z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1110" d="M870 0H53L362 1462H1180L1126 1208H614L547 887H1024L969 633H492L412 256H924L870 0ZM906 1579H722Q651 1648 584 1732T480 1886V1907H791Q827 1759 906 1604V1579Z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1110" d="M870 0H53L362 1462H1180L1126 1208H614L547 887H1024L969 633H492L412 256H924L870 0ZM608 1604Q687 1692 830 1907H1165V1890Q1119 1834 1011 1738T817 1579H608V1604Z" /> +<glyph unicode="&#xca;" horiz-adv-x="1110" d="M870 0H53L362 1462H1180L1126 1208H614L547 887H1024L969 633H492L412 256H924L870 0ZM1177 1579H979Q916 1632 817 1747Q712 1659 585 1579H368V1604Q431 1661 521 1751T663 1907H1001Q1023 1853 1075 1765T1177 +1604V1579Z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1110" d="M870 0H53L362 1462H1180L1126 1208H614L547 887H1024L969 633H492L412 256H924L870 0ZM457 1720Q457 1798 496 1838T608 1878Q733 1878 733 1770Q733 1697 697 1654T584 1610Q457 1610 457 1720ZM840 1720Q840 +1798 879 1838T991 1878Q1116 1878 1116 1770Q1116 1697 1080 1654T967 1610Q840 1610 840 1720Z" /> +<glyph unicode="&#xcc;" horiz-adv-x="784" d="M588 0H-59L-23 176L164 258L365 1204L213 1286L250 1462H897L860 1286L670 1204L469 258L625 176L588 0ZM708 1579H524Q453 1648 386 1732T282 1886V1907H593Q629 1759 708 1604V1579Z" /> +<glyph unicode="&#xcd;" horiz-adv-x="784" d="M588 0H-59L-23 176L164 258L365 1204L213 1286L250 1462H897L860 1286L670 1204L469 258L625 176L588 0ZM455 1604Q534 1692 677 1907H1012V1890Q966 1834 858 1738T664 1579H455V1604Z" /> +<glyph unicode="&#xce;" horiz-adv-x="784" d="M588 0H-59L-23 176L164 258L365 1204L213 1286L250 1462H897L860 1286L670 1204L469 258L625 176L588 0ZM978 1579H780Q717 1632 618 1747Q513 1659 386 1579H169V1604Q232 1661 322 1751T464 1907H802Q824 1853 +876 1765T978 1604V1579Z" /> +<glyph unicode="&#xcf;" horiz-adv-x="784" d="M588 0H-59L-23 176L164 258L365 1204L213 1286L250 1462H897L860 1286L670 1204L469 258L625 176L588 0ZM282 1720Q282 1798 321 1838T433 1878Q558 1878 558 1770Q558 1697 522 1654T409 1610Q282 1610 282 1720ZM665 +1720Q665 1798 704 1838T816 1878Q941 1878 941 1770Q941 1697 905 1654T792 1610Q665 1610 665 1720Z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1386" d="M1323 909Q1323 629 1225 423T942 108T504 0H53L178 596H37L92 850H231L362 1462H758Q1028 1462 1175 1319T1323 909ZM518 256Q666 256 776 332T948 555T1010 893Q1010 1047 938 1127T729 1208H614L539 850H776L721 +596H483L412 256H518Z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1546" d="M1247 0H905L549 1106H539L531 1047Q504 833 473 688L328 0H53L362 1462H719L1059 385H1067Q1102 608 1135 770L1282 1462H1556L1247 0ZM1114 1579Q1065 1579 1028 1595T958 1631T897 1667T834 1684Q803 1684 779 +1656T740 1577H563Q622 1886 844 1886Q893 1886 931 1870T1003 1834T1065 1798T1125 1782Q1159 1782 1183 1807T1229 1888H1401Q1335 1579 1114 1579Z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1495" d="M1432 938Q1432 655 1333 432T1062 94T666 -20Q410 -20 267 127T123 537Q123 802 222 1024T495 1366T897 1485Q1152 1485 1292 1341T1432 938ZM872 1227Q751 1227 650 1136T492 884T434 537Q434 390 500 315T688 +240Q809 240 908 327T1064 573T1120 930Q1120 1072 1055 1149T872 1227ZM1053 1579H869Q798 1648 731 1732T627 1886V1907H938Q974 1759 1053 1604V1579Z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1495" d="M1432 938Q1432 655 1333 432T1062 94T666 -20Q410 -20 267 127T123 537Q123 802 222 1024T495 1366T897 1485Q1152 1485 1292 1341T1432 938ZM872 1227Q751 1227 650 1136T492 884T434 537Q434 390 500 315T688 +240Q809 240 908 327T1064 573T1120 930Q1120 1072 1055 1149T872 1227ZM753 1604Q832 1692 975 1907H1310V1890Q1264 1834 1156 1738T962 1579H753V1604Z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1495" d="M1432 938Q1432 655 1333 432T1062 94T666 -20Q410 -20 267 127T123 537Q123 802 222 1024T495 1366T897 1485Q1152 1485 1292 1341T1432 938ZM872 1227Q751 1227 650 1136T492 884T434 537Q434 390 500 315T688 +240Q809 240 908 327T1064 573T1120 930Q1120 1072 1055 1149T872 1227ZM1308 1579H1110Q1047 1632 948 1747Q843 1659 716 1579H499V1604Q562 1661 652 1751T794 1907H1132Q1154 1853 1206 1765T1308 1604V1579Z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1495" d="M1432 938Q1432 655 1333 432T1062 94T666 -20Q410 -20 267 127T123 537Q123 802 222 1024T495 1366T897 1485Q1152 1485 1292 1341T1432 938ZM872 1227Q751 1227 650 1136T492 884T434 537Q434 390 500 315T688 +240Q809 240 908 327T1064 573T1120 930Q1120 1072 1055 1149T872 1227ZM1071 1579Q1022 1579 985 1595T915 1631T854 1667T791 1684Q760 1684 736 1656T697 1577H520Q579 1886 801 1886Q850 1886 888 1870T960 1834T1022 1798T1082 1782Q1116 1782 1140 1807T1186 +1888H1358Q1292 1579 1071 1579Z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1495" d="M1432 938Q1432 655 1333 432T1062 94T666 -20Q410 -20 267 127T123 537Q123 802 222 1024T495 1366T897 1485Q1152 1485 1292 1341T1432 938ZM872 1227Q751 1227 650 1136T492 884T434 537Q434 390 500 315T688 +240Q809 240 908 327T1064 573T1120 930Q1120 1072 1055 1149T872 1227ZM604 1720Q604 1798 643 1838T755 1878Q880 1878 880 1770Q880 1697 844 1654T731 1610Q604 1610 604 1720ZM987 1720Q987 1798 1026 1838T1138 1878Q1263 1878 1263 1770Q1263 1697 1227 +1654T1114 1610Q987 1610 987 1720Z" /> +<glyph unicode="&#xd7;" horiz-adv-x="1128" d="M428 723L129 1024L281 1178L582 879L887 1178L1040 1028L735 723L1036 420L887 268L582 569L281 270L131 422L428 723Z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1495" d="M1432 938Q1432 655 1333 432T1062 94T666 -20Q486 -20 362 51L254 -86L100 29L221 180Q123 318 123 537Q123 802 222 1024T495 1366T897 1485Q1079 1485 1202 1409L1307 1540L1458 1423L1341 1278Q1432 1144 1432 +938ZM870 1233Q744 1233 641 1142T481 889T424 537Q424 505 432 436L1028 1190Q959 1233 870 1233ZM1133 930L1128 1010L539 270Q598 233 692 233Q816 233 918 322T1076 569T1133 930Z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1415" d="M1434 1462L1233 516Q1176 250 1015 115T596 -20Q384 -20 263 93T141 401Q141 473 156 539L352 1462H657L463 543Q446 469 446 418Q446 240 635 240Q758 240 830 316T934 545L1128 1462H1434ZM1002 1579H818Q747 +1648 680 1732T576 1886V1907H887Q923 1759 1002 1604V1579Z" /> +<glyph unicode="&#xda;" horiz-adv-x="1415" d="M1434 1462L1233 516Q1176 250 1015 115T596 -20Q384 -20 263 93T141 401Q141 473 156 539L352 1462H657L463 543Q446 469 446 418Q446 240 635 240Q758 240 830 316T934 545L1128 1462H1434ZM757 1604Q836 1692 +979 1907H1314V1890Q1268 1834 1160 1738T966 1579H757V1604Z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1415" d="M1434 1462L1233 516Q1176 250 1015 115T596 -20Q384 -20 263 93T141 401Q141 473 156 539L352 1462H657L463 543Q446 469 446 418Q446 240 635 240Q758 240 830 316T934 545L1128 1462H1434ZM1284 1579H1086Q1023 +1632 924 1747Q819 1659 692 1579H475V1604Q538 1661 628 1751T770 1907H1108Q1130 1853 1182 1765T1284 1604V1579Z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1415" d="M1434 1462L1233 516Q1176 250 1015 115T596 -20Q384 -20 263 93T141 401Q141 473 156 539L352 1462H657L463 543Q446 469 446 418Q446 240 635 240Q758 240 830 316T934 545L1128 1462H1434ZM584 1720Q584 1798 +623 1838T735 1878Q860 1878 860 1770Q860 1697 824 1654T711 1610Q584 1610 584 1720ZM967 1720Q967 1798 1006 1838T1118 1878Q1243 1878 1243 1770Q1243 1697 1207 1654T1094 1610Q967 1610 967 1720Z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1155" d="M627 870L1001 1462H1343L725 559L606 0H303L422 559L186 1462H498L627 870ZM606 1604Q685 1692 828 1907H1163V1890Q1117 1834 1009 1738T815 1579H606V1604Z" /> +<glyph unicode="&#xde;" horiz-adv-x="1241" d="M1192 807Q1192 564 1022 429T555 293H420L358 0H53L362 1462H668L618 1233H702Q944 1233 1068 1127T1192 807ZM475 547H580Q720 547 802 614T885 799Q885 979 690 979H567L475 547Z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1350" d="M846 1567Q1054 1567 1177 1477T1300 1237Q1300 1123 1251 1045T1073 893Q1000 851 977 825T954 770Q954 747 976 721T1055 651Q1162 568 1199 501T1237 350Q1237 180 1114 80T776 -20Q589 -20 479 41V281Q607 203 +737 203Q838 203 885 236T932 322Q932 362 906 397T797 494Q703 566 668 624T633 750Q633 834 678 895T840 1022Q906 1059 944 1098T983 1194Q983 1256 944 1292T819 1329Q723 1329 663 1278T578 1106L324 -113Q281 -311 177 -401T-100 -492Q-190 -492 -260 -467V-225Q-199 +-246 -145 -246Q-12 -246 25 -68L279 1139Q326 1363 461 1465T846 1567Z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1217" d="M406 -20Q259 -20 175 86T90 385Q90 583 162 762T351 1040T608 1139Q705 1139 775 1097T885 975H893L950 1118H1182L944 0H719L733 145H725Q591 -20 406 -20ZM524 223Q593 223 657 290T760 471T799 731Q799 802 +761 848T659 895Q591 895 530 823T432 633T395 399Q395 311 428 267T524 223ZM1125 1241H941Q870 1310 803 1394T699 1548V1569H1010Q1046 1421 1125 1266V1241Z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1217" d="M406 -20Q259 -20 175 86T90 385Q90 583 162 762T351 1040T608 1139Q705 1139 775 1097T885 975H893L950 1118H1182L944 0H719L733 145H725Q591 -20 406 -20ZM524 223Q593 223 657 290T760 471T799 731Q799 802 +761 848T659 895Q591 895 530 823T432 633T395 399Q395 311 428 267T524 223ZM598 1266Q677 1354 820 1569H1155V1552Q1109 1496 1001 1400T807 1241H598V1266Z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1217" d="M406 -20Q259 -20 175 86T90 385Q90 583 162 762T351 1040T608 1139Q705 1139 775 1097T885 975H893L950 1118H1182L944 0H719L733 145H725Q591 -20 406 -20ZM524 223Q593 223 657 290T760 471T799 731Q799 802 +761 848T659 895Q591 895 530 823T432 633T395 399Q395 311 428 267T524 223ZM1120 1241H922Q859 1294 760 1409Q655 1321 528 1241H311V1266Q374 1323 464 1413T606 1569H944Q966 1515 1018 1427T1120 1266V1241Z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1217" d="M406 -20Q259 -20 175 86T90 385Q90 583 162 762T351 1040T608 1139Q705 1139 775 1097T885 975H893L950 1118H1182L944 0H719L733 145H725Q591 -20 406 -20ZM524 223Q593 223 657 290T760 471T799 731Q799 802 +761 848T659 895Q591 895 530 823T432 633T395 399Q395 311 428 267T524 223ZM884 1241Q835 1241 798 1257T728 1293T667 1329T604 1346Q573 1346 549 1318T510 1239H333Q392 1548 614 1548Q663 1548 701 1532T773 1496T835 1460T895 1444Q929 1444 953 1469T999 +1550H1171Q1105 1241 884 1241Z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1217" d="M406 -20Q259 -20 175 86T90 385Q90 583 162 762T351 1040T608 1139Q705 1139 775 1097T885 975H893L950 1118H1182L944 0H719L733 145H725Q591 -20 406 -20ZM524 223Q593 223 657 290T760 471T799 731Q799 802 +761 848T659 895Q591 895 530 823T432 633T395 399Q395 311 428 267T524 223ZM416 1382Q416 1460 455 1500T567 1540Q692 1540 692 1432Q692 1359 656 1316T543 1272Q416 1272 416 1382ZM799 1382Q799 1460 838 1500T950 1540Q1075 1540 1075 1432Q1075 1359 1039 +1316T926 1272Q799 1272 799 1382Z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1217" d="M406 -20Q259 -20 175 86T90 385Q90 583 162 762T351 1040T608 1139Q705 1139 775 1097T885 975H893L950 1118H1182L944 0H719L733 145H725Q591 -20 406 -20ZM524 223Q593 223 657 290T760 471T799 731Q799 802 +761 848T659 895Q591 895 530 823T432 633T395 399Q395 311 428 267T524 223ZM1279 1479Q1279 1372 1209 1306T1025 1239Q915 1239 846 1302T777 1477Q777 1586 845 1650T1025 1714Q1135 1714 1207 1649T1279 1479ZM1122 1477Q1122 1522 1095 1547T1025 1573Q983 +1573 956 1548T929 1477Q929 1432 953 1406T1025 1380Q1067 1380 1094 1406T1122 1477Z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1786" d="M1206 -20Q1097 -20 1027 7T909 94L893 0H705L719 145H709Q635 53 561 17T399 -20Q253 -20 172 89T90 385Q90 585 158 760T343 1037T602 1139Q695 1139 758 1102T872 975H883L940 1118H1128L1110 1028Q1154 1077 +1230 1108T1399 1139Q1556 1139 1645 1056T1735 834Q1735 647 1568 546T1092 444H1040L1038 425V406Q1038 310 1093 259T1253 207Q1319 207 1405 230T1567 293V66Q1388 -20 1206 -20ZM518 223Q590 223 652 292T751 479T788 719Q788 799 755 847T653 895Q585 895 +525 826T430 641T395 399Q395 315 427 269T518 223ZM1341 922Q1253 922 1175 842T1073 647H1118Q1273 647 1359 695T1446 827Q1446 922 1341 922Z" /> +<glyph unicode="&#xe7;" horiz-adv-x="989" d="M506 -20Q305 -20 198 87T90 391Q90 603 164 776T374 1044T682 1139Q864 1139 1010 1067L918 838Q864 861 812 878T694 895Q609 895 541 831T434 656T395 416Q395 320 440 272T567 223Q643 223 708 246T842 305V59Q690 +-20 506 -20ZM653 -250Q653 -366 570 -429T336 -492Q250 -492 184 -469V-301Q247 -324 309 -324Q411 -324 411 -242Q411 -208 380 -186T270 -154L366 0H551L512 -72Q653 -121 653 -250Z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1141" d="M696 922Q608 922 530 842T428 647H473Q628 647 714 695T801 827Q801 922 696 922ZM532 -20Q322 -20 206 93T90 412Q90 619 172 789T396 1049T715 1139Q892 1139 991 1058T1090 834Q1090 647 923 546T446 444H395L393 +423V403Q393 312 444 260T592 207Q679 207 750 226T922 293V66Q750 -20 532 -20ZM1105 1241H921Q850 1310 783 1394T679 1548V1569H990Q1026 1421 1105 1266V1241Z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1141" d="M696 922Q608 922 530 842T428 647H473Q628 647 714 695T801 827Q801 922 696 922ZM532 -20Q322 -20 206 93T90 412Q90 619 172 789T396 1049T715 1139Q892 1139 991 1058T1090 834Q1090 647 923 546T446 444H395L393 +423V403Q393 312 444 260T592 207Q679 207 750 226T922 293V66Q750 -20 532 -20ZM528 1266Q607 1354 750 1569H1085V1552Q1039 1496 931 1400T737 1241H528V1266Z" /> +<glyph unicode="&#xea;" horiz-adv-x="1141" d="M696 922Q608 922 530 842T428 647H473Q628 647 714 695T801 827Q801 922 696 922ZM532 -20Q322 -20 206 93T90 412Q90 619 172 789T396 1049T715 1139Q892 1139 991 1058T1090 834Q1090 647 923 546T446 444H395L393 +423V403Q393 312 444 260T592 207Q679 207 750 226T922 293V66Q750 -20 532 -20ZM1357 1241H1159Q1096 1294 997 1409Q892 1321 765 1241H548V1266Q611 1323 701 1413T843 1569H1181Q1203 1515 1255 1427T1357 1266V1241Z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1141" d="M696 922Q608 922 530 842T428 647H473Q628 647 714 695T801 827Q801 922 696 922ZM532 -20Q322 -20 206 93T90 412Q90 619 172 789T396 1049T715 1139Q892 1139 991 1058T1090 834Q1090 647 923 546T446 444H395L393 +423V403Q393 312 444 260T592 207Q679 207 750 226T922 293V66Q750 -20 532 -20ZM640 1382Q640 1460 679 1500T791 1540Q916 1540 916 1432Q916 1359 880 1316T767 1272Q640 1272 640 1382ZM1023 1382Q1023 1460 1062 1500T1174 1540Q1299 1540 1299 1432Q1299 +1359 1263 1316T1150 1272Q1023 1272 1023 1382Z" /> +<glyph unicode="&#xec;" horiz-adv-x="608" d="M338 0H37L274 1118H575L338 0ZM579 1241H395Q324 1310 257 1394T153 1548V1569H464Q500 1421 579 1266V1241Z" /> +<glyph unicode="&#xed;" horiz-adv-x="608" d="M338 0H37L274 1118H575L338 0ZM291 1266Q370 1354 513 1569H848V1552Q802 1496 694 1400T500 1241H291V1266Z" /> +<glyph unicode="&#xee;" horiz-adv-x="608" d="M338 0H37L274 1118H575L338 0ZM845 1241H647Q584 1294 485 1409Q380 1321 253 1241H36V1266Q99 1323 189 1413T331 1569H669Q691 1515 743 1427T845 1266V1241Z" /> +<glyph unicode="&#xef;" horiz-adv-x="608" d="M338 0H37L274 1118H575L338 0ZM145 1382Q145 1460 184 1500T296 1540Q421 1540 421 1432Q421 1359 385 1316T272 1272Q145 1272 145 1382ZM528 1382Q528 1460 567 1500T679 1540Q804 1540 804 1432Q804 1359 768 +1316T655 1272Q528 1272 528 1382Z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1182" d="M618 1300Q580 1338 494 1380L612 1567Q750 1504 844 1427L1081 1559L1157 1407L965 1300Q1046 1194 1078 1070T1110 795Q1110 546 1041 363T837 80T514 -20Q298 -20 185 90T72 406Q72 571 136 707T317 919T582 +995Q754 995 844 870H854Q834 1077 737 1171L506 1040L418 1188L618 1300ZM528 205Q594 205 650 260T739 409T772 602Q772 679 734 724T625 770Q552 770 495 717T407 574T375 377Q375 296 414 251T528 205Z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1237" d="M977 0H676L813 653Q829 721 829 772Q829 895 721 895Q629 895 554 781T436 463L338 0H37L274 1118H504L483 911H492Q638 1139 844 1139Q982 1139 1057 1056T1133 817Q1133 744 1110 637L977 0ZM911 1241Q862 1241 +825 1257T755 1293T694 1329T631 1346Q600 1346 576 1318T537 1239H360Q419 1548 641 1548Q690 1548 728 1532T800 1496T862 1460T922 1444Q956 1444 980 1469T1026 1550H1198Q1132 1241 911 1241Z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1198" d="M805 696Q805 893 662 893Q587 893 528 832T431 653T393 410Q393 225 543 225Q618 225 678 286T771 457T805 696ZM1108 696Q1108 485 1038 322T834 70T518 -20Q323 -20 207 97T90 410Q90 623 161 789T368 1047T684 +1139Q880 1139 994 1021T1108 696ZM1101 1241H917Q846 1310 779 1394T675 1548V1569H986Q1022 1421 1101 1266V1241Z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1198" d="M805 696Q805 893 662 893Q587 893 528 832T431 653T393 410Q393 225 543 225Q618 225 678 286T771 457T805 696ZM1108 696Q1108 485 1038 322T834 70T518 -20Q323 -20 207 97T90 410Q90 623 161 789T368 1047T684 +1139Q880 1139 994 1021T1108 696ZM571 1266Q650 1354 793 1569H1128V1552Q1082 1496 974 1400T780 1241H571V1266Z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1198" d="M805 696Q805 893 662 893Q587 893 528 832T431 653T393 410Q393 225 543 225Q618 225 678 286T771 457T805 696ZM1108 696Q1108 485 1038 322T834 70T518 -20Q323 -20 207 97T90 410Q90 623 161 789T368 1047T684 +1139Q880 1139 994 1021T1108 696ZM1365 1241H1167Q1104 1294 1005 1409Q900 1321 773 1241H556V1266Q619 1323 709 1413T851 1569H1189Q1211 1515 1263 1427T1365 1266V1241Z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1198" d="M805 696Q805 893 662 893Q587 893 528 832T431 653T393 410Q393 225 543 225Q618 225 678 286T771 457T805 696ZM1108 696Q1108 485 1038 322T834 70T518 -20Q323 -20 207 97T90 410Q90 623 161 789T368 1047T684 +1139Q880 1139 994 1021T1108 696ZM1121 1241Q1072 1241 1035 1257T965 1293T904 1329T841 1346Q810 1346 786 1318T747 1239H570Q629 1548 851 1548Q900 1548 938 1532T1010 1496T1072 1460T1132 1444Q1166 1444 1190 1469T1236 1550H1408Q1342 1241 1121 1241Z" +/> +<glyph unicode="&#xf6;" horiz-adv-x="1198" d="M805 696Q805 893 662 893Q587 893 528 832T431 653T393 410Q393 225 543 225Q618 225 678 286T771 457T805 696ZM1108 696Q1108 485 1038 322T834 70T518 -20Q323 -20 207 97T90 410Q90 623 161 789T368 1047T684 +1139Q880 1139 994 1021T1108 696ZM661 1382Q661 1460 700 1500T812 1540Q937 1540 937 1432Q937 1359 901 1316T788 1272Q661 1272 661 1382ZM1044 1382Q1044 1460 1083 1500T1195 1540Q1320 1540 1320 1432Q1320 1359 1284 1316T1171 1272Q1044 1272 1044 1382Z" +/> +<glyph unicode="&#xf7;" horiz-adv-x="1128" d="M109 612V831H1061V612H109ZM444 373Q444 449 481 486T584 524Q650 524 686 485T723 373Q723 303 686 262T584 221Q519 221 482 260T444 373ZM444 1071Q444 1146 481 1184T584 1223Q651 1223 687 1183T723 1071Q723 +1001 686 961T584 920Q519 920 482 959T444 1071Z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1198" d="M1108 696Q1108 485 1038 322T834 70T518 -20Q395 -20 293 33L184 -102L43 6L162 154Q90 261 90 410Q90 623 161 789T368 1047T684 1139Q815 1139 911 1083L981 1171L1126 1061L1042 956Q1108 849 1108 696ZM662 +903Q580 903 519 846T421 674T385 426L750 879Q715 903 662 903ZM543 215Q616 215 675 270T773 437T815 682L457 238Q468 230 492 223T543 215Z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1237" d="M262 1118H563L426 465Q410 397 410 346Q410 223 518 223Q610 223 685 337T803 655L901 1118H1202L965 0H735L756 207H745Q600 -20 395 -20Q257 -20 184 62T111 301Q111 394 135 514L262 1118ZM1101 1241H917Q846 +1310 779 1394T675 1548V1569H986Q1022 1421 1101 1266V1241Z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1237" d="M262 1118H563L426 465Q410 397 410 346Q410 223 518 223Q610 223 685 337T803 655L901 1118H1202L965 0H735L756 207H745Q600 -20 395 -20Q257 -20 184 62T111 301Q111 394 135 514L262 1118ZM610 1266Q689 1354 +832 1569H1167V1552Q1121 1496 1013 1400T819 1241H610V1266Z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1237" d="M262 1118H563L426 465Q410 397 410 346Q410 223 518 223Q610 223 685 337T803 655L901 1118H1202L965 0H735L756 207H745Q600 -20 395 -20Q257 -20 184 62T111 301Q111 394 135 514L262 1118ZM1143 1241H945Q882 +1294 783 1409Q678 1321 551 1241H334V1266Q397 1323 487 1413T629 1569H967Q989 1515 1041 1427T1143 1266V1241Z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1237" d="M262 1118H563L426 465Q410 397 410 346Q410 223 518 223Q610 223 685 337T803 655L901 1118H1202L965 0H735L756 207H745Q600 -20 395 -20Q257 -20 184 62T111 301Q111 394 135 514L262 1118ZM430 1382Q430 1460 +469 1500T581 1540Q706 1540 706 1432Q706 1359 670 1316T557 1272Q430 1272 430 1382ZM813 1382Q813 1460 852 1500T964 1540Q1089 1540 1089 1432Q1089 1359 1053 1316T940 1272Q813 1272 813 1382Z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1063" d="M102 1118H397L453 600Q465 495 465 307H473Q493 358 517 426T582 580L842 1118H1169L489 -160Q312 -492 6 -492Q-84 -492 -141 -473V-233Q-73 -246 -25 -246Q59 -246 122 -198T240 -49L266 0L102 1118ZM497 1266Q576 +1354 719 1569H1054V1552Q1008 1496 900 1400T706 1241H497V1266Z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1219" d="M813 1139Q963 1139 1045 1033T1128 731Q1128 532 1059 350T877 74T627 -20Q449 -20 356 143H348Q336 -16 305 -152L233 -492H-68L367 1556H668L602 1249Q573 1118 522 969H530Q661 1139 813 1139ZM682 895Q611 +895 552 830T457 646T420 399Q420 319 453 271T559 223Q630 223 691 292T788 478T823 719Q823 807 786 851T682 895Z" /> +<glyph unicode="&#xff;" horiz-adv-x="1063" d="M102 1118H397L453 600Q465 495 465 307H473Q493 358 517 426T582 580L842 1118H1169L489 -160Q312 -492 6 -492Q-84 -492 -141 -473V-233Q-73 -246 -25 -246Q59 -246 122 -198T240 -49L266 0L102 1118ZM585 1382Q585 +1460 624 1500T736 1540Q861 1540 861 1432Q861 1359 825 1316T712 1272Q585 1272 585 1382ZM968 1382Q968 1460 1007 1500T1119 1540Q1244 1540 1244 1432Q1244 1359 1208 1316T1095 1272Q968 1272 968 1382Z" /> +<glyph unicode="&#x2013;" horiz-adv-x="983" d="M41 436L90 666H942L893 436H41Z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M41 436L90 666H1925L1876 436H41Z" /> +<glyph unicode="&#x2018;" horiz-adv-x="440" d="M123 961L115 983Q218 1210 377 1462H602Q511 1249 408 961H123Z" /> +<glyph unicode="&#x2019;" horiz-adv-x="440" d="M586 1462L594 1440Q491 1213 332 961H106Q195 1167 301 1462H586Z" /> +<glyph unicode="&#x201a;" horiz-adv-x="569" d="M377 238L385 215Q282 -12 123 -264H-102Q-14 -57 92 238H377Z" /> +<glyph unicode="&#x201c;" horiz-adv-x="887" d="M569 961L561 983Q664 1210 823 1462H1049Q952 1235 854 961H569ZM123 961L115 983Q218 1210 377 1462H602Q511 1249 408 961H123Z" /> +<glyph unicode="&#x201d;" horiz-adv-x="887" d="M586 1462L594 1440Q491 1213 332 961H106Q195 1167 301 1462H586ZM1032 1462L1040 1440Q937 1213 778 961H553Q576 1014 599 1072T748 1462H1032Z" /> +<glyph unicode="&#x201e;" horiz-adv-x="1018" d="M377 238L385 215Q282 -12 123 -264H-102Q-14 -57 92 238H377ZM825 238L834 215Q734 -6 571 -264H346Q370 -207 395 -146T541 238H825Z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M139 748Q139 902 213 983T426 1065Q563 1065 638 983T713 748Q713 596 638 513T426 430Q288 430 214 513T139 748Z" /> +<glyph unicode="&#x2039;" horiz-adv-x="664" d="M72 569L473 1032L664 877L385 543L520 193L274 90L72 551V569Z" /> +<glyph unicode="&#x203a;" horiz-adv-x="664" d="M592 553L190 90L0 245L279 579L143 929L389 1032L592 571V553Z" /> +</font> +</defs> +</svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf new file mode 100644 index 000000000000..6640dbeb333b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff new file mode 100644 index 000000000000..209739eeb092 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2 b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2 new file mode 100644 index 000000000000..f5525aa28bef Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2 differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.eot new file mode 100644 index 000000000000..a99734993528 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.svg new file mode 100644 index 000000000000..dcd8fc89dc98 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.svg @@ -0,0 +1,337 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<defs > +<font id="NotoSans" horiz-adv-x="1151" ><font-face + font-family="Noto Sans" + units-per-em="2048" + panose-1="2 11 5 2 4 5 4 9 2 4" + ascent="2189" + descent="-600" + alphabetic="0" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="535" d="M563 1462L291 412H170L344 1462H563ZM41 82Q41 157 83 202T195 248Q241 248 270 220T299 137Q299 67 259 19T150 -29Q97 -29 69 0T41 82Z" /> +<glyph unicode="&quot;" horiz-adv-x="803" d="M492 1462L338 934H223L295 1462H492ZM844 1462L690 934H575L647 1462H844Z" /> +<glyph unicode="#" horiz-adv-x="1323" d="M1036 895L940 563H1223L1210 428H901L778 0H631L760 428H465L340 0H199L319 428H61L74 563H358L457 895H182L195 1028H494L616 1462H764L639 1028H934L1061 1462H1200L1077 1028H1339L1325 895H1036ZM504 563H799L891 +895H598L504 563Z" /> +<glyph unicode="$" horiz-adv-x="1128" d="M950 492Q950 330 837 229T522 104L473 -119H340L389 102Q194 116 70 176V340Q144 301 238 277T418 250L514 690Q371 742 308 817T244 1008Q244 1168 354 1264T657 1378L696 1552H829L793 1376Q951 1364 1075 1300L1008 +1155Q888 1220 762 1229L670 801Q821 745 885 674T950 492ZM553 256Q657 269 717 328T778 477Q778 531 746 571T637 643L553 256ZM627 1229Q519 1215 465 1159T410 1012Q410 900 547 848L627 1229Z" /> +<glyph unicode="%" horiz-adv-x="1636" d="M541 1350Q476 1350 425 1289T343 1104T311 864Q311 700 414 700Q476 700 527 764T611 957T645 1190Q645 1350 541 1350ZM793 1202Q793 1094 762 966T679 750T557 614T399 565Q287 565 226 641T164 862Q164 1029 215 +1182T353 1409T553 1483Q671 1483 732 1411T793 1202ZM1477 1462L391 0H231L1317 1462H1477ZM1292 764Q1228 764 1178 703T1097 519T1065 279Q1065 115 1165 115Q1228 115 1278 177T1362 371T1397 604Q1397 764 1292 764ZM1546 618Q1546 510 1516 384T1434 169T1312 +30T1151 -20Q1038 -20 977 54T915 274Q915 444 966 594T1103 821T1305 897Q1423 897 1484 825T1546 618Z" /> +<glyph unicode="&amp;" horiz-adv-x="1378" d="M1239 0H1026L913 160Q792 62 682 21T442 -20Q269 -20 168 76T66 344Q66 491 155 600T455 811Q354 971 354 1116Q354 1281 461 1383T748 1485Q897 1485 985 1406T1073 1192Q1073 1109 1035 1043T925 921T676 774L946 +397Q1065 501 1141 692H1321Q1220 450 1036 272L1239 0ZM530 700Q414 640 358 592T273 487T244 356Q244 252 309 191T477 129Q563 129 644 162T827 279L530 700ZM604 887Q738 954 788 992T868 1076T899 1178Q899 1250 859 1294T739 1339Q637 1339 582 1280T526 +1116Q526 996 604 887Z" /> +<glyph unicode="&apos;" horiz-adv-x="451" d="M492 1462L338 934H223L295 1462H492Z" /> +<glyph unicode="(" horiz-adv-x="594" d="M82 272Q82 615 204 905T586 1462H752Q254 914 254 274Q254 -63 369 -324H229Q82 -65 82 272Z" /> +<glyph unicode=")" horiz-adv-x="594" d="M510 864Q510 518 388 230T6 -324H-158Q338 227 338 864Q338 1206 225 1462H365Q510 1195 510 864Z" /> +<glyph unicode="*" horiz-adv-x="1128" d="M856 1528L735 1147L1153 1167L1145 999L756 1047L934 668L762 614L651 1014L399 676L274 801L580 1081L211 1190L268 1350L637 1167L678 1563L856 1528Z" /> +<glyph unicode="+" horiz-adv-x="1128" d="M512 647H125V797H512V1186H662V797H1049V647H662V262H512V647Z" /> +<glyph unicode="," horiz-adv-x="524" d="M311 238L319 215Q221 4 49 -264H-88Q4 -56 115 238H311Z" /> +<glyph unicode="-" horiz-adv-x="641" d="M53 465L90 631H573L537 465H53Z" /> +<glyph unicode="." horiz-adv-x="524" d="M41 78Q41 154 83 201T199 248Q244 248 271 221T299 139Q299 67 258 19T147 -29Q96 -29 69 -1T41 78Z" /> +<glyph unicode="/" horiz-adv-x="729" d="M903 1462L92 0H-94L719 1462H903Z" /> +<glyph unicode="0" horiz-adv-x="1128" d="M1094 1014Q1094 722 1017 479T803 108T483 -20Q304 -20 211 109T117 477Q117 750 198 992T414 1360T725 1485Q1094 1485 1094 1014ZM715 1331Q605 1331 511 1218T358 895T299 477Q299 311 347 222T504 133Q614 133 704 +242T852 566T909 1018Q909 1331 715 1331Z" /> +<glyph unicode="1" horiz-adv-x="1128" d="M596 0H414L608 905Q653 1119 694 1257Q638 1199 557 1149L377 1036L293 1171L752 1462H909L596 0Z" /> +<glyph unicode="2" horiz-adv-x="1128" d="M911 0H6L39 154L504 573Q708 756 771 830T863 972T893 1120Q893 1216 835 1272T676 1329Q597 1329 524 1299T362 1202L276 1325Q471 1483 696 1483Q876 1483 978 1393T1081 1149Q1081 1043 1044 952T919 760T618 471L274 +172V164H942L911 0Z" /> +<glyph unicode="3" horiz-adv-x="1128" d="M1075 1159Q1075 1004 975 895T696 754V745Q824 721 893 637T963 430Q963 297 900 196T716 37T430 -20Q218 -20 45 59V233Q130 186 234 159T432 131Q593 131 682 209T772 422Q772 549 696 614T477 680H346L377 829H510Q676 +829 783 914T891 1137Q891 1225 836 1278T682 1331Q588 1331 510 1299T354 1212L270 1339Q465 1483 698 1483Q875 1483 975 1397T1075 1159Z" /> +<glyph unicode="4" horiz-adv-x="1128" d="M1063 332H836L764 0H590L662 332H12L43 496L868 1462H1075L872 492H1098L1063 332ZM696 492L770 842Q799 976 885 1278H877Q855 1242 808 1179T737 1087L227 492H696Z" /> +<glyph unicode="5" horiz-adv-x="1128" d="M600 895Q784 895 890 790T997 508Q997 348 924 225T720 41T410 -20Q210 -20 76 59V233Q240 131 410 131Q597 131 703 224T809 485Q809 609 737 680T535 752Q489 752 447 746T301 715L225 774L424 1462H1098L1063 1298H545L422 +874Q519 895 600 895Z" /> +<glyph unicode="6" horiz-adv-x="1128" d="M129 428Q129 637 190 845T358 1198T605 1413T930 1483Q1041 1483 1118 1460L1081 1305Q1007 1329 909 1329Q696 1329 555 1183T346 750H354Q413 827 499 873T692 920Q847 920 935 822T1024 551Q1024 390 957 255T775 +50T514 -20Q329 -20 229 96T129 428ZM532 131Q623 131 694 184T806 331T846 535Q846 774 631 774Q567 774 507 747T400 671T330 566T307 416Q307 282 366 207T532 131Z" /> +<glyph unicode="7" horiz-adv-x="1128" d="M166 0L930 1303H219L252 1462H1151L1124 1319L360 0H166Z" /> +<glyph unicode="8" horiz-adv-x="1128" d="M739 1485Q915 1485 1013 1398T1112 1161Q1112 1032 1033 936T770 762Q892 688 946 600T1001 395Q1001 273 941 178T769 31T504 -20Q312 -20 202 78T92 346Q92 492 185 600T479 786Q389 850 347 925T305 1100Q305 1214 +361 1302T516 1437T739 1485ZM606 694Q431 639 355 557T279 356Q279 252 345 191T522 129Q612 129 678 162T781 256T817 391Q817 490 766 562T606 694ZM725 1333Q615 1333 549 1270T483 1100Q483 1023 520 961T645 844Q796 900 863 971T930 1143Q930 1231 875 1282T725 +1333Z" /> +<glyph unicode="9" horiz-adv-x="1128" d="M1069 1032Q1069 838 1014 626T867 268T643 51T338 -20Q202 -20 96 14V180Q236 135 342 135Q542 135 665 272T852 702H842Q791 630 711 587T530 543Q360 543 269 642T178 930Q178 1082 243 1210T424 1410T688 1483Q868 +1483 968 1369T1069 1032ZM678 1331Q532 1331 444 1221T356 938Q356 817 409 753T567 688Q657 688 730 731T847 855T891 1057Q891 1184 834 1257T678 1331Z" /> +<glyph unicode=":" horiz-adv-x="524" d="M41 78Q41 154 83 201T199 248Q244 248 271 221T299 139Q299 67 258 19T147 -29Q96 -29 69 -1T41 78ZM203 954Q203 1032 245 1079T360 1126Q405 1126 433 1100T461 1018Q461 946 421 898T309 850Q258 850 231 877T203 954Z" /> +<glyph unicode=";" horiz-adv-x="524" d="M307 215Q209 4 37 -264H-100Q16 -2 102 238H299L307 215ZM203 954Q203 1032 245 1079T360 1126Q405 1126 433 1100T461 1018Q461 946 421 898T309 850Q258 850 231 877T203 954Z" /> +<glyph unicode="&lt;" horiz-adv-x="1128" d="M1042 238L119 662V764L1042 1245V1087L305 721L1042 397V238Z" /> +<glyph unicode="=" horiz-adv-x="1128" d="M125 817V965H1049V817H125ZM125 477V625H1049V477H125Z" /> +<glyph unicode="&gt;" horiz-adv-x="1128" d="M119 397L856 721L119 1087V1245L1042 764V662L119 238V397Z" /> +<glyph unicode="?" horiz-adv-x="881" d="M260 412Q282 545 335 629T500 801Q620 891 661 935T725 1028T748 1139Q748 1228 699 1277T555 1327Q477 1327 403 1301T260 1243L195 1380Q285 1428 384 1455T575 1483Q745 1483 837 1399T930 1161Q930 1039 867 938T637 +713Q509 619 469 566T406 412H260ZM158 78Q158 154 199 201T315 248Q360 248 388 221T416 139Q416 67 375 19T264 -29Q213 -29 186 -1T158 78Z" /> +<glyph unicode="@" horiz-adv-x="1737" d="M1683 850Q1683 671 1627 526T1471 299T1247 217Q1052 217 1032 399H1024Q919 217 737 217Q622 217 556 293T489 504Q489 659 556 786T743 987T1006 1061Q1073 1061 1136 1049T1288 1001L1192 635Q1159 521 1159 459Q1159 +346 1257 346Q1330 346 1392 407T1494 585T1534 836Q1534 1073 1406 1199T1038 1325Q815 1325 638 1221T361 928T262 512Q262 242 406 97T811 -49Q906 -49 1019 -26T1233 37V-96Q1016 -186 788 -186Q582 -186 428 -103T191 137T109 504Q109 770 236 993T581 1338T1065 +1460Q1258 1460 1397 1385T1609 1171T1683 850ZM985 934Q893 934 814 879T690 728T645 518Q645 346 774 346Q954 346 1040 657L1108 911Q1051 934 985 934Z" /> +<glyph unicode="A" d="M815 455H322L84 0H-117L678 1462H870L1051 0H870L815 455ZM797 618L764 924Q737 1151 737 1268Q705 1191 667 1114T410 618H797Z" /> +<glyph unicode="B" horiz-adv-x="1229" d="M772 1462Q987 1462 1096 1377T1206 1126Q1206 985 1121 889T877 762V752Q991 720 1051 643T1112 455Q1112 244 962 122T551 0H84L393 1462H772ZM444 840H684Q836 840 926 910T1016 1104Q1016 1201 954 1253T750 1305H543L444 +840ZM299 156H557Q731 156 825 233T920 455Q920 568 849 628T641 688H412L299 156Z" /> +<glyph unicode="C" horiz-adv-x="1202" d="M938 1321Q763 1321 629 1222T419 940T342 543Q342 356 437 249T700 141Q844 141 1024 201V41Q861 -20 668 -20Q423 -20 285 129T147 539Q147 796 251 1020T534 1364T938 1483Q1144 1483 1294 1401L1221 1249Q1082 1321 +938 1321Z" /> +<glyph unicode="D" horiz-adv-x="1366" d="M1303 879Q1303 617 1199 417T900 108T444 0H84L393 1462H739Q1015 1462 1159 1313T1303 879ZM455 158Q653 158 802 248T1030 503T1110 881Q1110 1090 1010 1197T717 1305H543L299 158H455Z" /> +<glyph unicode="E" horiz-adv-x="1053" d="M825 0H84L393 1462H1135L1100 1300H541L444 844H967L936 684H412L299 162H860L825 0Z" /> +<glyph unicode="F" horiz-adv-x="977" d="M266 0H84L393 1462H1135L1102 1300H541L432 780H956L922 618H397L266 0Z" /> +<glyph unicode="G" horiz-adv-x="1389" d="M815 770H1284L1128 55Q1007 13 908 -3T702 -20Q439 -20 293 125T147 530Q147 798 250 1019T533 1362T936 1483Q1053 1483 1154 1463T1360 1397L1290 1237Q1213 1271 1126 1296T934 1321Q768 1321 632 1221T419 943T342 +543Q342 354 441 248T721 141Q862 141 973 178L1067 610H780L815 770Z" /> +<glyph unicode="H" horiz-adv-x="1393" d="M1092 0H911L1055 682H412L268 0H86L395 1462H578L446 844H1090L1221 1462H1401L1092 0Z" /> +<glyph unicode="I" horiz-adv-x="664" d="M471 0H-41L-20 100L154 141L403 1321L248 1360L268 1462H780L760 1360L584 1321L334 141L492 100L471 0Z" /> +<glyph unicode="J" horiz-adv-x="559" d="M-164 -389Q-269 -389 -319 -365L-313 -207Q-244 -227 -168 -227Q36 -227 88 18L395 1462H578L268 -2Q186 -389 -164 -389Z" /> +<glyph unicode="K" d="M1044 0H844L559 709L389 584L266 0H84L393 1462H575L424 752L551 887L1112 1462H1333L698 819L1044 0Z" /> +<glyph unicode="L" horiz-adv-x="979" d="M84 0L393 1462H575L299 164H860L825 0H84Z" /> +<glyph unicode="M" horiz-adv-x="1722" d="M799 268L1448 1462H1729L1425 0H1241L1425 868Q1486 1152 1524 1284H1520L815 0H670L514 1282H506Q491 1127 440 879L254 0H82L391 1462H649L791 268H799Z" /> +<glyph unicode="N" horiz-adv-x="1448" d="M1149 0H954L502 1212H496Q475 1040 422 795L254 0H82L391 1462H586L1034 254H1040Q1053 347 1075 471T1112 657L1284 1462H1458L1149 0Z" /> +<glyph unicode="O" horiz-adv-x="1477" d="M1413 909Q1413 634 1322 421T1068 94T690 -20Q433 -20 290 129T147 547Q147 809 242 1027T506 1365T887 1485Q1134 1485 1273 1332T1413 909ZM874 1323Q720 1323 598 1224T409 947T342 551Q342 356 437 249T696 141Q844 +141 963 238T1150 515T1219 913Q1219 1105 1128 1214T874 1323Z" /> +<glyph unicode="P" horiz-adv-x="1161" d="M1161 1081Q1161 834 997 703T518 571H387L266 0H84L393 1462H723Q939 1462 1050 1367T1161 1081ZM420 725H547Q756 725 865 815T975 1075Q975 1197 907 1251T698 1305H543L420 725Z" /> +<glyph unicode="Q" horiz-adv-x="1477" d="M1413 909Q1413 580 1276 337T903 14L1178 -348H944L723 -18L706 -20H690Q433 -20 290 129T147 547Q147 809 242 1027T506 1365T887 1485Q1134 1485 1273 1332T1413 909ZM874 1323Q720 1323 598 1224T409 947T342 551Q342 +356 437 249T696 141Q847 141 964 236T1150 510T1219 913Q1219 1105 1128 1214T874 1323Z" /> +<glyph unicode="R" horiz-adv-x="1174" d="M426 760H586Q775 760 876 843T977 1079Q977 1196 912 1249T698 1303H543L426 760ZM393 604L266 0H84L393 1462H715Q1165 1462 1165 1092Q1165 748 801 645L1042 0H842L633 604H393Z" /> +<glyph unicode="S" horiz-adv-x="1034" d="M915 424Q915 215 775 98T379 -20Q175 -20 39 45V225Q206 139 381 139Q537 139 630 211T723 410Q723 486 674 544T481 684Q329 773 272 859T215 1059Q215 1184 276 1280T448 1430T696 1483Q895 1483 1063 1397L993 1241Q929 +1277 849 1299T696 1321Q567 1321 489 1254T410 1071Q410 993 449 942T618 815Q761 728 812 678T889 566T915 424Z" /> +<glyph unicode="T" horiz-adv-x="1026" d="M496 0H311L586 1300H184L219 1462H1206L1174 1300H772L496 0Z" /> +<glyph unicode="U" horiz-adv-x="1386" d="M1409 1462L1204 498Q1148 231 1003 106T614 -20Q385 -20 274 85T162 385Q162 462 186 580L375 1462H557L367 569Q358 533 351 478T344 387Q344 271 414 206T625 141Q794 141 887 227T1024 512L1227 1462H1409Z" /> +<glyph unicode="V" horiz-adv-x="1130" d="M483 207Q540 343 641 539L1116 1462H1319L541 0H346L188 1462H369L461 537Q480 362 480 247L479 207H483Z" /> +<glyph unicode="W" horiz-adv-x="1753" d="M1022 1227Q1003 1167 968 1084T469 0H281L219 1462H399L428 571L430 485Q430 381 420 225H426Q526 491 580 602L981 1462H1167L1208 606Q1218 446 1218 309L1217 225H1223Q1315 485 1354 578L1737 1462H1931L1268 0H1081L1036 +942Q1028 1078 1028 1227H1022Z" /> +<glyph unicode="X" horiz-adv-x="1079" d="M971 0H778L569 633L94 0H-106L489 774L229 1462H414L612 903L1047 1462H1247L694 766L971 0Z" /> +<glyph unicode="Y" horiz-adv-x="1042" d="M545 729L1024 1462H1231L604 543L492 0H307L426 549L188 1462H371L545 729Z" /> +<glyph unicode="Z" horiz-adv-x="1087" d="M889 0H-20L8 143L920 1298H274L309 1462H1174L1147 1317L236 164H922L889 0Z" /> +<glyph unicode="[" horiz-adv-x="594" d="M377 -324H-18L362 1462H758L725 1315H500L184 -176H410L377 -324Z" /> +<glyph unicode="\" horiz-adv-x="729" d="M385 1462L602 0H438L221 1462H385Z" /> +<glyph unicode="]" horiz-adv-x="594" d="M-117 -176H109L424 1315H199L231 1462H627L246 -324H-147L-117 -176Z" /> +<glyph unicode="^" horiz-adv-x="1128" d="M84 551L682 1473H795L1063 551H909L711 1286L250 551H84Z" /> +<glyph unicode="_" horiz-adv-x="809" d="M625 -324H-188L-158 -184H655L625 -324Z" /> +<glyph unicode="`" horiz-adv-x="1135" d="M905 1241H795Q729 1307 662 1400T569 1548V1569H762Q803 1434 905 1266V1241Z" /> +<glyph unicode="a" horiz-adv-x="1163" d="M395 -20Q258 -20 178 78T98 354Q98 559 168 736T363 1016T637 1118Q730 1118 800 1069T913 928H924L989 1098H1126L893 0H750L776 203H768Q595 -20 395 -20ZM455 129Q549 129 643 219T795 453T852 748Q852 846 798 906T655 +967Q554 967 468 883T332 655T283 350Q283 239 328 184T455 129Z" /> +<glyph unicode="b" horiz-adv-x="1186" d="M551 -20Q456 -20 382 29T270 168H260L193 0H57L387 1556H567L489 1188Q471 1099 446 1003T414 893H422Q524 1017 609 1066T784 1116Q926 1116 1005 1019T1085 743Q1085 536 1017 359T827 81T551 -20ZM727 967Q632 967 +536 873T384 636T328 350Q328 246 381 188T537 129Q635 129 719 211T852 438T901 745Q901 967 727 967Z" /> +<glyph unicode="c" horiz-adv-x="928" d="M506 -20Q312 -20 205 87T98 389Q98 592 171 760T375 1023T672 1118Q819 1118 944 1065L893 915Q778 967 674 967Q564 967 474 891T333 682T283 391Q283 266 346 198T524 129Q597 129 661 149T788 197V45Q660 -20 506 -20Z" /> +<glyph unicode="d" horiz-adv-x="1186" d="M395 -20Q257 -20 178 77T98 354Q98 563 168 741T361 1017T637 1116Q827 1116 913 928H924Q946 1099 969 1198L1044 1556H1223L893 0H745L768 203H760Q664 84 577 32T395 -20ZM457 129Q550 129 646 222T798 457T854 745Q854 +853 802 910T649 967Q550 967 466 884T333 656T283 350Q283 129 457 129Z" /> +<glyph unicode="e" horiz-adv-x="1022" d="M637 969Q534 969 443 873T311 621H326Q544 621 664 679T784 848Q784 901 748 935T637 969ZM496 -20Q310 -20 204 89T98 393Q98 581 171 752T370 1020T647 1118Q803 1118 882 1051T961 862Q961 680 793 578T319 475H285L281 +399Q281 273 341 201T528 129Q605 129 675 151T827 213V59Q728 13 654 -3T496 -20Z" /> +<glyph unicode="f" horiz-adv-x="651" d="M-98 -492Q-168 -492 -229 -471V-319Q-167 -342 -115 -342Q-45 -342 -2 -286T66 -109L291 961H100L115 1036L319 1104L342 1202Q388 1404 471 1485T715 1567Q812 1567 907 1528L860 1391Q786 1419 723 1419Q635 1419 591 +1369T522 1202L498 1098H733L707 961H471L242 -129Q202 -318 119 -405T-98 -492Z" /> +<glyph unicode="g" horiz-adv-x="1186" d="M457 129Q547 129 642 220T794 455T852 745Q852 967 651 967Q550 967 465 883T332 653T283 350Q283 129 457 129ZM381 -492Q184 -492 51 -422V-256Q114 -294 207 -318T375 -342Q508 -342 587 -278T698 -76L749 134L768 +203H760Q669 86 580 33T397 -20Q258 -20 178 78T98 354Q98 569 171 747T365 1022T637 1118Q828 1118 915 928H924L991 1098H1128L879 -63Q832 -283 711 -387T381 -492Z" /> +<glyph unicode="h" horiz-adv-x="1186" d="M905 0H725L870 688Q889 777 889 823Q889 967 745 967Q658 967 576 908T432 738T338 473L238 0H57L387 1556H567L479 1153Q467 1091 449 1025T414 893H424Q513 1010 603 1063T795 1116Q927 1116 999 1045T1071 836Q1071 +780 1049 668L905 0Z" /> +<glyph unicode="i" horiz-adv-x="528" d="M238 0H57L291 1098H471L238 0ZM338 1376Q338 1433 371 1470T459 1507Q553 1507 553 1415Q553 1355 518 1318T436 1280Q393 1280 366 1305T338 1376Z" /> +<glyph unicode="j" horiz-adv-x="528" d="M-131 -492Q-204 -492 -258 -471V-319Q-200 -342 -139 -342Q-14 -342 29 -141L291 1098H469L203 -158Q166 -334 85 -413T-131 -492ZM338 1376Q338 1433 371 1470T459 1507Q551 1507 551 1415Q551 1355 516 1318T434 1280Q392 +1280 365 1305T338 1376Z" /> +<glyph unicode="k" horiz-adv-x="1014" d="M862 1098H1075L604 627L897 0H698L467 514L319 397L238 0H55L385 1556H567Q479 1146 432 925T338 567H342L862 1098Z" /> +<glyph unicode="l" horiz-adv-x="528" d="M236 0H55L387 1556H567L236 0Z" /> +<glyph unicode="m" horiz-adv-x="1792" d="M778 1118Q891 1118 952 1054T1026 874H1034Q1202 1118 1411 1118Q1539 1118 1608 1049T1677 848Q1677 760 1655 668L1513 0H1331L1479 688Q1497 782 1497 831Q1497 893 1464 930T1358 967Q1280 967 1204 910T1069 746T979 +496L874 0H694L840 688Q858 782 858 823Q858 967 725 967Q643 967 566 908T430 738T338 473L238 0H57L291 1098H438L416 895H426Q494 985 543 1026T651 1092T778 1118Z" /> +<glyph unicode="n" horiz-adv-x="1186" d="M905 0H725L870 688Q891 787 891 829Q891 892 856 929T745 967Q659 967 578 908T433 738T338 473L238 0H57L291 1098H438L416 895H426Q493 981 546 1024T662 1092T795 1118Q924 1118 997 1048T1071 848Q1071 770 1049 +668L905 0Z" /> +<glyph unicode="o" horiz-adv-x="1153" d="M872 709Q872 824 812 893T649 963Q543 963 458 889T327 685T281 399Q281 271 342 202T518 133Q618 133 699 204T826 407T872 709ZM1057 688Q1057 498 985 332T789 75T508 -16Q316 -16 207 98T98 406Q98 598 172 766T369 +1023T647 1112Q838 1112 947 999T1057 688Z" /> +<glyph unicode="p" horiz-adv-x="1186" d="M788 1116Q930 1116 1007 1016T1085 741Q1085 528 1015 352T824 78T551 -20Q359 -20 270 168H260Q244 31 233 -18L133 -492H-45L291 1098H438L414 893H422Q517 1011 606 1063T788 1116ZM727 967Q634 967 539 876T386 +641T328 350Q328 246 381 188T537 129Q635 129 719 211T852 438T901 745Q901 967 727 967Z" /> +<glyph unicode="q" horiz-adv-x="1186" d="M397 -20Q256 -20 177 78T98 354Q98 561 168 740T361 1018T639 1118Q732 1118 802 1069T913 928H924L991 1098H1126L788 -492H610L709 -25Q733 80 768 203H760Q669 86 580 33T397 -20ZM457 129Q547 129 640 218T793 451T852 +745Q852 848 800 907T651 967Q554 967 470 886T335 660T283 350Q283 129 457 129Z" /> +<glyph unicode="r" horiz-adv-x="815" d="M760 1118Q830 1118 879 1104L840 942Q784 954 735 954Q645 954 566 896T429 732T344 502L238 0H57L291 1098H438L416 895H426Q499 991 546 1032T645 1095T760 1118Z" /> +<glyph unicode="s" horiz-adv-x="885" d="M743 317Q743 158 632 69T317 -20Q137 -20 10 49V215Q75 175 154 151T311 127Q433 127 496 174T559 299Q559 354 525 393T375 498Q246 570 193 641T139 807Q139 947 241 1032T512 1118Q682 1118 844 1042L786 899Q733 +924 667 945T512 967Q424 967 372 926T319 817Q319 762 355 724T500 625Q613 558 655 517T720 427T743 317Z" /> +<glyph unicode="t" horiz-adv-x="680" d="M406 127Q468 127 551 154V16Q523 2 471 -9T379 -20Q251 -20 184 40T117 219Q117 283 135 365L260 961H90L106 1042L291 1120L418 1348H524L469 1098H745L717 961H442L315 362Q297 281 297 240Q297 192 322 160T406 127Z" /> +<glyph unicode="u" horiz-adv-x="1186" d="M279 1098H461L313 408Q295 318 295 270Q295 129 438 129Q525 129 606 188T752 359T848 625L948 1098H1126L893 0H745L768 203H758Q668 85 577 33T387 -20Q259 -20 186 51T113 252Q113 316 135 428L279 1098Z" /> +<glyph unicode="v" horiz-adv-x="956" d="M369 137Q482 389 539 494L862 1098H1055L461 0H225L98 1098H279L340 487Q349 395 355 286T362 137H369Z" /> +<glyph unicode="w" horiz-adv-x="1481" d="M793 924L742 801L662 614L375 0H162L117 1098H293L311 410Q311 341 301 158H309Q320 188 359 285T433 457T731 1098H926L961 510L965 262V203L963 158H971Q1023 314 1128 559L1368 1098H1559L1051 0H834L803 594L801 +737V924H793Z" /> +<glyph unicode="x" horiz-adv-x="989" d="M399 565L162 1098H344L514 692L836 1098H1044L588 557L840 0H657L471 426L133 0H-76L399 565Z" /> +<glyph unicode="y" horiz-adv-x="956" d="M98 1098H279L350 555Q361 480 369 361T377 147H383Q409 213 461 326T543 496L862 1098H1055L358 -184Q268 -354 174 -423T-51 -492Q-130 -492 -193 -471V-326Q-130 -344 -61 -344Q21 -344 80 -293T193 -143L264 -16L98 1098Z" /> +<glyph unicode="z" horiz-adv-x="911" d="M696 0H-31L-6 123L676 963H205L233 1098H899L870 952L201 135H723L696 0Z" /> +<glyph unicode="{" horiz-adv-x="717" d="M231 367Q231 510 23 510L57 659Q175 659 246 702T340 850L408 1171Q441 1330 524 1396T782 1462H819L788 1313Q686 1313 640 1278T573 1155L502 836Q475 715 411 654T242 575V571Q395 531 395 358Q395 301 377 229L332 +20Q317 -45 317 -74Q317 -126 353 -150T471 -174V-324H444Q147 -324 147 -98Q147 -48 168 41L217 256Q231 331 231 367Z" /> +<glyph unicode="|" horiz-adv-x="1128" d="M532 1556H680V-494H532V1556Z" /> +<glyph unicode="}" horiz-adv-x="717" d="M283 1462Q584 1462 584 1237Q584 1187 563 1098L514 881Q498 796 498 772Q498 629 707 629L674 479Q555 479 484 436T391 289L324 -33Q289 -194 206 -259T-61 -324H-76V-174Q37 -174 88 -138T158 -16L229 303Q256 422 +319 482T489 561V567Q338 609 338 778Q338 835 356 907L403 1118Q418 1174 418 1212Q418 1264 377 1288T240 1313L270 1462H283Z" /> +<glyph unicode="~" horiz-adv-x="1128" d="M348 709Q294 709 230 675T115 588V748Q214 856 358 856Q428 856 488 841T629 791Q706 758 749 747T838 735Q893 735 957 768T1073 856V698Q973 588 829 588Q759 588 698 604T559 653Q482 686 440 697T348 709Z" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="&#xa1;" horiz-adv-x="535" d="M254 678H373L199 -373H-20L254 678ZM502 1008Q502 938 462 890T352 842Q301 842 274 869T246 948Q246 1024 288 1071T401 1118Q448 1118 475 1090T502 1008Z" /> +<glyph unicode="&#xa2;" horiz-adv-x="1128" d="M582 -20H451L494 195Q362 229 291 331T219 590Q219 775 282 934T461 1192T723 1315L756 1483H885L848 1315Q975 1304 1067 1266L1016 1116Q903 1167 797 1167Q687 1167 597 1092T455 883T403 592Q403 467 468 398T647 +328Q761 328 909 397V244Q786 182 623 178L582 -20Z" /> +<glyph unicode="&#xa3;" horiz-adv-x="1128" d="M844 1481Q1027 1481 1184 1395L1114 1253Q970 1331 840 1331Q734 1331 672 1273T584 1100L516 782H881L852 647H487L442 440Q421 338 376 272T250 164H969L934 0H-23L6 152Q211 198 264 438L309 647H109L137 782H338L410 +1124Q447 1297 555 1389T844 1481Z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1128" d="M225 723Q225 836 293 936L164 1065L260 1163L387 1034Q490 1102 602 1102Q714 1102 815 1034L944 1163L1042 1067L913 938Q981 830 981 723Q981 607 913 508L1040 381L944 285L815 412Q719 346 602 346Q486 346 +387 414L260 287L166 383L293 510Q225 606 225 723ZM362 723Q362 624 431 554T602 483Q705 483 776 552T848 723Q848 826 776 896T602 967Q502 967 432 895T362 723Z" /> +<glyph unicode="&#xa5;" horiz-adv-x="1128" d="M584 729L1065 1462H1262L733 694H961L932 557H639L606 399H899L870 262H580L522 0H356L412 262H123L154 399H440L473 557H184L215 694H438L236 1462H412L584 729Z" /> +<glyph unicode="&#xa6;" horiz-adv-x="1128" d="M532 1556H680V776H532V1556ZM532 287H680V-494H532V287Z" /> +<glyph unicode="&#xa7;" horiz-adv-x="995" d="M172 770Q172 970 406 1075Q289 1148 289 1278Q289 1406 394 1486T676 1567Q861 1567 999 1497L944 1368Q793 1430 676 1430Q579 1430 520 1391T461 1284Q461 1235 499 1200T657 1112Q794 1052 850 983T907 823Q907 +727 848 644T678 506Q791 432 791 315Q791 163 675 77T354 -10Q173 -10 55 53V207Q111 175 195 151T354 127Q484 127 552 171T621 297Q621 341 581 378T422 471Q289 529 231 598T172 770ZM514 1006Q436 982 384 922T332 791Q332 724 380 678T575 567Q652 609 697 +670T743 799Q743 861 691 907T514 1006Z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1135" d="M451 1378Q451 1429 480 1462T559 1495Q641 1495 641 1413Q641 1364 613 1328T539 1292Q500 1292 476 1314T451 1378ZM819 1378Q819 1430 849 1462T928 1495Q970 1495 990 1473T1010 1413Q1010 1361 980 1327T905 +1292Q868 1292 844 1314T819 1378Z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M928 1055Q806 1055 740 971T674 731Q674 406 928 406Q1021 406 1141 451V322Q1076 294 1027 283T920 272Q730 272 623 392T516 731Q516 940 626 1064T930 1188Q1056 1188 1182 1126L1120 1001Q1012 1055 928 1055ZM137 +731Q137 931 237 1106T512 1382T889 1483Q1086 1483 1259 1386T1536 1114T1640 731Q1640 527 1540 355T1267 81T889 -20Q682 -20 507 83T235 360T137 731ZM246 731Q246 559 332 410T567 175T889 88Q1062 88 1210 173T1446 407T1534 731Q1534 906 1447 1054T1211 +1288T889 1374Q717 1374 568 1288T333 1053T246 731Z" /> +<glyph unicode="&#xaa;" horiz-adv-x="694" d="M348 784Q268 784 218 846T168 1014Q168 1140 210 1248T327 1418T498 1479Q612 1479 651 1376H659L696 1466H788L647 797H551L565 911H559Q508 842 458 813T348 784ZM387 893Q447 893 498 939T581 1073T614 1243Q614 +1303 587 1337T502 1372Q443 1372 395 1326T318 1198T289 1028Q289 893 387 893Z" /> +<glyph unicode="&#xab;" horiz-adv-x="977" d="M86 582L479 965L567 877L272 549L440 164L315 111L86 555V582ZM489 543L860 954L956 877L674 514L829 164L705 111L489 514V543Z" /> +<glyph unicode="&#xac;" horiz-adv-x="1128" d="M1049 262H901V647H125V797H1049V262Z" /> +<glyph unicode="&#xad;" horiz-adv-x="641" d="M53 465L90 631H573L537 465H53Z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M137 731Q137 931 237 1106T512 1382T889 1483Q1086 1483 1259 1386T1536 1114T1640 731Q1640 527 1540 355T1267 81T889 -20Q682 -20 507 83T235 360T137 731ZM246 731Q246 559 332 410T567 175T889 88Q1062 88 +1210 173T1446 407T1534 731Q1534 906 1447 1054T1211 1288T889 1374Q717 1374 568 1288T333 1053T246 731ZM1198 913Q1198 836 1151 773T1018 674L1243 291H1083L883 639H774V291H639V1171H874Q1039 1171 1118 1107T1198 913ZM774 762H862Q1055 762 1055 909Q1055 +984 1007 1014T862 1044H774V762Z" /> +<glyph unicode="&#xaf;" horiz-adv-x="805" d="M1014 1556H207L240 1694H1049L1014 1556Z" /> +<glyph unicode="&#xb0;" horiz-adv-x="877" d="M211 1167Q211 1298 303 1390T524 1483Q608 1483 681 1441T797 1325T840 1167Q840 1038 747 947T524 856Q395 856 303 946T211 1167ZM330 1167Q330 1087 387 1031T524 975Q602 975 659 1031T717 1167Q717 1249 661 +1306T524 1364Q444 1364 387 1307T330 1167Z" /> +<glyph unicode="&#xb1;" horiz-adv-x="1128" d="M512 647H125V797H512V1186H662V797H1049V647H662V262H512V647ZM125 0V147H1049V0H125Z" /> +<glyph unicode="&#xb2;" horiz-adv-x="723" d="M662 586H92L117 698L381 924Q532 1055 575 1119T618 1249Q618 1300 589 1331T502 1362Q407 1362 307 1282L244 1378Q371 1481 526 1481Q634 1481 698 1424T762 1272Q762 1175 710 1093T510 889L297 711H688L662 586Z" /> +<glyph unicode="&#xb3;" horiz-adv-x="723" d="M762 1274Q762 1097 553 1042V1034Q624 1017 662 967T700 848Q700 718 608 644T352 569Q225 569 117 625V758Q242 686 356 686Q460 686 509 730T559 852Q559 983 387 983H293L317 1096H412Q506 1096 563 1135T621 +1245Q621 1304 588 1333T497 1362Q395 1362 301 1294L244 1393Q358 1481 516 1481Q633 1481 697 1425T762 1274Z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M528 1268Q579 1323 646 1411T758 1569H963V1548Q916 1491 815 1393T641 1241H528V1268Z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1198" d="M307 274Q307 129 451 129Q535 129 616 187T760 355T858 621L963 1098H1139L905 0H758L780 203H770Q676 81 589 31T408 -20Q295 -20 246 74H238L197 -176L131 -492H-45L291 1098H471L326 408Q307 320 307 274Z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1206 -260H1087V1397H879V-260H760V559Q698 541 614 541Q400 541 298 664T195 1042Q195 1302 304 1429T645 1556H1206V-260Z" /> +<glyph unicode="&#xb7;" horiz-adv-x="524" d="M166 690Q166 766 208 813T324 860Q369 860 396 833T424 751Q424 679 383 631T272 583Q221 583 194 611T166 690Z" /> +<glyph unicode="&#xb8;" horiz-adv-x="420" d="M215 -274Q215 -373 135 -432T-82 -492Q-137 -492 -174 -481V-375Q-142 -383 -100 -383Q68 -383 68 -274Q68 -237 38 -214T-70 -180L29 0H143L84 -117Q215 -155 215 -274Z" /> +<glyph unicode="&#xb9;" horiz-adv-x="723" d="M537 1462H664L477 586H332L440 1100L498 1323L410 1247L303 1178L246 1274L537 1462Z" /> +<glyph unicode="&#xba;" horiz-adv-x="694" d="M752 1217Q752 1093 712 994T596 840T418 784Q302 784 235 855T168 1053Q168 1172 210 1270T329 1423T506 1479Q625 1479 688 1410T752 1217ZM502 1370Q405 1370 347 1284T289 1057Q289 973 325 932T428 891Q521 +891 577 982T633 1210Q633 1370 502 1370Z" /> +<glyph unicode="&#xbb;" horiz-adv-x="977" d="M891 489L498 111L410 199L705 524L537 911L662 965L891 518V489ZM487 528L117 123L20 199L303 557L147 911L272 965L487 559V528Z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1544" d="M1374 1462L288 0H126L1212 1462H1374ZM741 1462H868L681 586H536L644 1100L702 1323L614 1247L507 1178L450 1274L741 1462ZM1350 199H1221L1180 1H1043L1084 199H719L742 306L1223 883H1368L1247 320H1372L1350 +199ZM1110 320Q1181 648 1198 707Q1170 655 1090 562L889 320H1110Z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1544" d="M1323 1462L237 0H75L1161 1462H1323ZM690 1462H817L630 586H485L593 1100L651 1323L563 1247L456 1178L399 1274L690 1462ZM1367 1H797L822 113L1086 339Q1237 470 1280 534T1323 664Q1323 715 1294 746T1207 777Q1112 +777 1012 697L949 793Q1076 896 1231 896Q1339 896 1403 839T1467 687Q1467 590 1415 508T1215 304L1002 126H1393L1367 1Z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1587" d="M992 1274Q992 1097 783 1042V1034Q854 1017 892 967T930 848Q930 718 838 644T582 569Q455 569 347 625V758Q472 686 586 686Q690 686 739 730T789 852Q789 983 617 983H523L547 1096H642Q736 1096 793 1135T851 +1245Q851 1304 818 1333T727 1362Q625 1362 531 1294L474 1393Q588 1481 746 1481Q863 1481 927 1425T992 1274ZM1522 1462L436 0H274L1360 1462H1522ZM1491 199H1362L1321 1H1184L1225 199H860L883 306L1364 883H1509L1388 320H1513L1491 199ZM1251 320Q1322 648 +1339 707Q1311 655 1231 562L1030 320H1251Z" /> +<glyph unicode="&#xbf;" horiz-adv-x="881" d="M659 674Q638 544 587 460T420 285Q371 246 326 210T247 135T193 49T172 -55Q172 -143 221 -192T365 -242Q426 -242 494 -223T659 -158L725 -297Q530 -399 344 -399Q176 -399 83 -316T-10 -76Q-10 47 56 150T283 +371Q407 462 448 515T512 674H659ZM762 1008Q762 929 720 883T604 836Q559 836 532 863T504 944Q504 1019 546 1065T655 1112Q705 1112 733 1086T762 1008Z" /> +<glyph unicode="&#xc0;" d="M815 455H322L84 0H-117L678 1462H870L1051 0H870L815 455ZM797 618L764 924Q737 1151 737 1268Q705 1191 667 1114T410 618H797ZM871 1579H761Q695 1645 628 1738T535 1886V1907H728Q769 1772 871 1604V1579Z" /> +<glyph unicode="&#xc1;" d="M815 455H322L84 0H-117L678 1462H870L1051 0H870L815 455ZM797 618L764 924Q737 1151 737 1268Q705 1191 667 1114T410 618H797ZM686 1606Q737 1661 804 1749T916 1907H1121V1886Q1074 1829 973 1731T799 1579H686V1606Z" /> +<glyph unicode="&#xc2;" d="M815 455H322L84 0H-117L678 1462H870L1051 0H870L815 455ZM797 618L764 924Q737 1151 737 1268Q705 1191 667 1114T410 618H797ZM1094 1579H981Q925 1627 820 1765Q693 1652 580 1579H461V1606Q699 1826 748 1907H922Q956 1815 1052 +1672L1094 1606V1579Z" /> +<glyph unicode="&#xc3;" d="M815 455H322L84 0H-117L678 1462H870L1051 0H870L815 455ZM797 618L764 924Q737 1151 737 1268Q705 1191 667 1114T410 618H797ZM940 1581Q899 1581 862 1598T790 1637T722 1676T655 1694Q612 1694 587 1665T540 1579H434Q491 1841 +669 1841Q714 1841 753 1824T828 1785T894 1747T952 1729Q994 1729 1020 1754T1071 1843H1179Q1109 1581 940 1581Z" /> +<glyph unicode="&#xc4;" d="M815 455H322L84 0H-117L678 1462H870L1051 0H870L815 455ZM797 618L764 924Q737 1151 737 1268Q705 1191 667 1114T410 618H797ZM521 1716Q521 1767 550 1800T629 1833Q711 1833 711 1751Q711 1702 683 1666T609 1630Q570 1630 546 +1652T521 1716ZM889 1716Q889 1768 919 1800T998 1833Q1040 1833 1060 1811T1080 1751Q1080 1699 1050 1665T975 1630Q938 1630 914 1652T889 1716Z" /> +<glyph unicode="&#xc5;" d="M999 1583Q999 1509 967 1459T879 1386L1051 0H870L815 455H322L84 0H-117L643 1401Q555 1455 555 1581Q555 1678 617 1736T776 1794Q876 1794 937 1737T999 1583ZM797 618Q747 1079 742 1146T737 1268Q705 1191 667 1114T410 618H797ZM891 +1581Q891 1634 859 1664T776 1694Q728 1694 696 1664T664 1581Q664 1528 693 1498T776 1468Q827 1468 859 1498T891 1581Z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1688" d="M1460 0H717L813 455H375L90 0H-119L817 1462H1769L1737 1300H1176L1077 844H1602L1571 684H1047L936 162H1495L1460 0ZM846 618L991 1300H907L479 618H846Z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1202" d="M938 1321Q763 1321 629 1222T419 940T342 543Q342 356 437 249T700 141Q844 141 1024 201V41Q861 -20 668 -20Q423 -20 285 129T147 539Q147 796 251 1020T534 1364T938 1483Q1144 1483 1294 1401L1221 1249Q1082 +1321 938 1321ZM764 -274Q764 -373 684 -432T467 -492Q412 -492 375 -481V-375Q407 -383 449 -383Q617 -383 617 -274Q617 -237 587 -214T479 -180L578 0H692L633 -117Q764 -155 764 -274Z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1053" d="M825 0H84L393 1462H1135L1100 1300H541L444 844H967L936 684H412L299 162H860L825 0ZM898 1579H788Q722 1645 655 1738T562 1886V1907H755Q796 1772 898 1604V1579Z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1053" d="M825 0H84L393 1462H1135L1100 1300H541L444 844H967L936 684H412L299 162H860L825 0ZM653 1606Q704 1661 771 1749T883 1907H1088V1886Q1041 1829 940 1731T766 1579H653V1606Z" /> +<glyph unicode="&#xca;" horiz-adv-x="1053" d="M825 0H84L393 1462H1135L1100 1300H541L444 844H967L936 684H412L299 162H860L825 0ZM1092 1579H979Q923 1627 818 1765Q691 1652 578 1579H459V1606Q697 1826 746 1907H920Q954 1815 1050 1672L1092 1606V1579Z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1053" d="M825 0H84L393 1462H1135L1100 1300H541L444 844H967L936 684H412L299 162H860L825 0ZM514 1716Q514 1767 543 1800T622 1833Q704 1833 704 1751Q704 1702 676 1666T602 1630Q563 1630 539 1652T514 1716ZM882 1716Q882 +1768 912 1800T991 1833Q1033 1833 1053 1811T1073 1751Q1073 1699 1043 1665T968 1630Q931 1630 907 1652T882 1716Z" /> +<glyph unicode="&#xcc;" horiz-adv-x="664" d="M471 0H-41L-20 100L154 141L403 1321L248 1360L268 1462H780L760 1360L584 1321L334 141L492 100L471 0ZM640 1579H530Q464 1645 397 1738T304 1886V1907H497Q538 1772 640 1604V1579Z" /> +<glyph unicode="&#xcd;" horiz-adv-x="664" d="M471 0H-41L-20 100L154 141L403 1321L248 1360L268 1462H780L760 1360L584 1321L334 141L492 100L471 0ZM453 1606Q504 1661 571 1749T683 1907H888V1886Q841 1829 740 1731T566 1579H453V1606Z" /> +<glyph unicode="&#xce;" horiz-adv-x="664" d="M471 0H-41L-20 100L154 141L403 1321L248 1360L268 1462H780L760 1360L584 1321L334 141L492 100L471 0ZM853 1579H740Q684 1627 579 1765Q452 1652 339 1579H220V1606Q458 1826 507 1907H681Q715 1815 811 1672L853 +1606V1579Z" /> +<glyph unicode="&#xcf;" horiz-adv-x="664" d="M471 0H-41L-20 100L154 141L403 1321L248 1360L268 1462H780L760 1360L584 1321L334 141L492 100L471 0ZM284 1716Q284 1767 313 1800T392 1833Q474 1833 474 1751Q474 1702 446 1666T372 1630Q333 1630 309 1652T284 +1716ZM652 1716Q652 1768 682 1800T761 1833Q803 1833 823 1811T843 1751Q843 1699 813 1665T738 1630Q701 1630 677 1652T652 1716Z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1366" d="M1303 879Q1303 617 1199 417T900 108T444 0H84L217 645H68L102 803H252L393 1462H739Q1015 1462 1159 1313T1303 879ZM455 158Q653 158 802 248T1030 503T1110 881Q1110 1090 1010 1197T717 1305H543L436 803H758L723 +645H401L299 158H455Z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1448" d="M1149 0H954L502 1212H496Q475 1040 422 795L254 0H82L391 1462H586L1034 254H1040Q1053 347 1075 471T1112 657L1284 1462H1458L1149 0ZM1102 1581Q1061 1581 1024 1598T952 1637T884 1676T817 1694Q774 1694 749 +1665T702 1579H596Q653 1841 831 1841Q876 1841 915 1824T990 1785T1056 1747T1114 1729Q1156 1729 1182 1754T1233 1843H1341Q1271 1581 1102 1581Z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1477" d="M1413 909Q1413 634 1322 421T1068 94T690 -20Q433 -20 290 129T147 547Q147 809 242 1027T506 1365T887 1485Q1134 1485 1273 1332T1413 909ZM874 1323Q720 1323 598 1224T409 947T342 551Q342 356 437 249T696 +141Q844 141 963 238T1150 515T1219 913Q1219 1105 1128 1214T874 1323ZM1011 1579H901Q835 1645 768 1738T675 1886V1907H868Q909 1772 1011 1604V1579Z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1477" d="M1413 909Q1413 634 1322 421T1068 94T690 -20Q433 -20 290 129T147 547Q147 809 242 1027T506 1365T887 1485Q1134 1485 1273 1332T1413 909ZM874 1323Q720 1323 598 1224T409 947T342 551Q342 356 437 249T696 +141Q844 141 963 238T1150 515T1219 913Q1219 1105 1128 1214T874 1323ZM815 1606Q866 1661 933 1749T1045 1907H1250V1886Q1203 1829 1102 1731T928 1579H815V1606Z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1477" d="M1413 909Q1413 634 1322 421T1068 94T690 -20Q433 -20 290 129T147 547Q147 809 242 1027T506 1365T887 1485Q1134 1485 1273 1332T1413 909ZM874 1323Q720 1323 598 1224T409 947T342 551Q342 356 437 249T696 +141Q844 141 963 238T1150 515T1219 913Q1219 1105 1128 1214T874 1323ZM1235 1579H1122Q1066 1627 961 1765Q834 1652 721 1579H602V1606Q840 1826 889 1907H1063Q1097 1815 1193 1672L1235 1606V1579Z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1477" d="M1413 909Q1413 634 1322 421T1068 94T690 -20Q433 -20 290 129T147 547Q147 809 242 1027T506 1365T887 1485Q1134 1485 1273 1332T1413 909ZM874 1323Q720 1323 598 1224T409 947T342 551Q342 356 437 249T696 +141Q844 141 963 238T1150 515T1219 913Q1219 1105 1128 1214T874 1323ZM1067 1581Q1026 1581 989 1598T917 1637T849 1676T782 1694Q739 1694 714 1665T667 1579H561Q618 1841 796 1841Q841 1841 880 1824T955 1785T1021 1747T1079 1729Q1121 1729 1147 1754T1198 +1843H1306Q1236 1581 1067 1581Z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1477" d="M1413 909Q1413 634 1322 421T1068 94T690 -20Q433 -20 290 129T147 547Q147 809 242 1027T506 1365T887 1485Q1134 1485 1273 1332T1413 909ZM874 1323Q720 1323 598 1224T409 947T342 551Q342 356 437 249T696 +141Q844 141 963 238T1150 515T1219 913Q1219 1105 1128 1214T874 1323ZM656 1716Q656 1767 685 1800T764 1833Q846 1833 846 1751Q846 1702 818 1666T744 1630Q705 1630 681 1652T656 1716ZM1024 1716Q1024 1768 1054 1800T1133 1833Q1175 1833 1195 1811T1215 +1751Q1215 1699 1185 1665T1110 1630Q1073 1630 1049 1652T1024 1716Z" /> +<glyph unicode="&#xd7;" horiz-adv-x="1128" d="M481 723L164 1042L268 1147L586 827L907 1147L1010 1044L688 723L1008 403L907 301L586 621L268 303L166 406L481 723Z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1477" d="M1413 909Q1413 634 1322 421T1068 94T690 -20Q495 -20 360 74L233 -84L117 10L252 178Q147 318 147 547Q147 809 242 1027T506 1365T887 1485Q1077 1485 1214 1378L1343 1540L1462 1446L1315 1266Q1363 1203 1388 +1110T1413 909ZM874 1325Q722 1325 599 1226T408 947T340 551Q340 424 379 336L1102 1241Q1010 1325 874 1325ZM1221 913Q1221 1022 1190 1106L469 211Q561 141 696 141Q848 141 968 241T1154 520T1221 913Z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1386" d="M1409 1462L1204 498Q1148 231 1003 106T614 -20Q385 -20 274 85T162 385Q162 462 186 580L375 1462H557L367 569Q358 533 351 478T344 387Q344 271 414 206T625 141Q794 141 887 227T1024 512L1227 1462H1409ZM991 +1579H881Q815 1645 748 1738T655 1886V1907H848Q889 1772 991 1604V1579Z" /> +<glyph unicode="&#xda;" horiz-adv-x="1386" d="M1409 1462L1204 498Q1148 231 1003 106T614 -20Q385 -20 274 85T162 385Q162 462 186 580L375 1462H557L367 569Q358 533 351 478T344 387Q344 271 414 206T625 141Q794 141 887 227T1024 512L1227 1462H1409ZM817 +1606Q868 1661 935 1749T1047 1907H1252V1886Q1205 1829 1104 1731T930 1579H817V1606Z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1386" d="M1409 1462L1204 498Q1148 231 1003 106T614 -20Q385 -20 274 85T162 385Q162 462 186 580L375 1462H557L367 569Q358 533 351 478T344 387Q344 271 414 206T625 141Q794 141 887 227T1024 512L1227 1462H1409ZM1223 +1579H1110Q1054 1627 949 1765Q822 1652 709 1579H590V1606Q828 1826 877 1907H1051Q1085 1815 1181 1672L1223 1606V1579Z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1386" d="M1409 1462L1204 498Q1148 231 1003 106T614 -20Q385 -20 274 85T162 385Q162 462 186 580L375 1462H557L367 569Q358 533 351 478T344 387Q344 271 414 206T625 141Q794 141 887 227T1024 512L1227 1462H1409ZM635 +1716Q635 1767 664 1800T743 1833Q825 1833 825 1751Q825 1702 797 1666T723 1630Q684 1630 660 1652T635 1716ZM1003 1716Q1003 1768 1033 1800T1112 1833Q1154 1833 1174 1811T1194 1751Q1194 1699 1164 1665T1089 1630Q1052 1630 1028 1652T1003 1716Z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1042" d="M545 729L1024 1462H1231L604 543L492 0H307L426 549L188 1462H371L545 729ZM616 1606Q667 1661 734 1749T846 1907H1051V1886Q1004 1829 903 1731T729 1579H616V1606Z" /> +<glyph unicode="&#xde;" horiz-adv-x="1161" d="M1110 827Q1110 579 946 448T463 317H334L266 0H84L393 1462H575L522 1208H670Q887 1208 998 1113T1110 827ZM365 473H494Q704 473 813 562T922 821Q922 944 853 997T645 1051H487L365 473Z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1196" d="M776 1567Q940 1567 1034 1495T1128 1294Q1128 1215 1086 1145T930 987L868 941Q760 861 760 795Q760 740 852 675Q955 602 1008 524T1061 354Q1061 179 951 80T653 -20Q478 -20 383 51V217Q426 182 493 155T631 +127Q746 127 811 183T877 334Q877 395 849 439T743 545Q656 612 620 667T584 784Q584 838 603 881T654 961T778 1063Q855 1115 886 1146T935 1210T952 1282Q952 1346 900 1382T760 1419Q641 1419 575 1356T483 1167L211 -127Q171 -317 89 -404T-131 -492Q-202 -492 +-256 -471V-317Q-204 -340 -145 -340Q-81 -340 -39 -294T27 -139L305 1167Q348 1370 462 1468T776 1567Z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1163" d="M395 -20Q258 -20 178 78T98 354Q98 559 168 736T363 1016T637 1118Q730 1118 800 1069T913 928H924L989 1098H1126L893 0H750L776 203H768Q595 -20 395 -20ZM455 129Q549 129 643 219T795 453T852 748Q852 846 +798 906T655 967Q554 967 468 883T332 655T283 350Q283 239 328 184T455 129ZM1084 1241H974Q908 1307 841 1400T748 1548V1569H941Q982 1434 1084 1266V1241Z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1163" d="M395 -20Q258 -20 178 78T98 354Q98 559 168 736T363 1016T637 1118Q730 1118 800 1069T913 928H924L989 1098H1126L893 0H750L776 203H768Q595 -20 395 -20ZM455 129Q549 129 643 219T795 453T852 748Q852 846 +798 906T655 967Q554 967 468 883T332 655T283 350Q283 239 328 184T455 129ZM600 1268Q651 1323 718 1411T830 1569H1035V1548Q988 1491 887 1393T713 1241H600V1268Z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1163" d="M395 -20Q258 -20 178 78T98 354Q98 559 168 736T363 1016T637 1118Q730 1118 800 1069T913 928H924L989 1098H1126L893 0H750L776 203H768Q595 -20 395 -20ZM455 129Q549 129 643 219T795 453T852 748Q852 846 +798 906T655 967Q554 967 468 883T332 655T283 350Q283 239 328 184T455 129ZM1271 1241H1158Q1102 1289 997 1427Q870 1314 757 1241H638V1268Q876 1488 925 1569H1099Q1133 1477 1229 1334L1271 1268V1241Z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1163" d="M395 -20Q258 -20 178 78T98 354Q98 559 168 736T363 1016T637 1118Q730 1118 800 1069T913 928H924L989 1098H1126L893 0H750L776 203H768Q595 -20 395 -20ZM455 129Q549 129 643 219T795 453T852 748Q852 846 +798 906T655 967Q554 967 468 883T332 655T283 350Q283 239 328 184T455 129ZM858 1243Q817 1243 780 1260T708 1299T640 1338T573 1356Q530 1356 505 1327T458 1241H352Q409 1503 587 1503Q632 1503 671 1486T746 1447T812 1409T870 1391Q912 1391 938 1416T989 +1505H1097Q1027 1243 858 1243Z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1163" d="M395 -20Q258 -20 178 78T98 354Q98 559 168 736T363 1016T637 1118Q730 1118 800 1069T913 928H924L989 1098H1126L893 0H750L776 203H768Q595 -20 395 -20ZM455 129Q549 129 643 219T795 453T852 748Q852 846 +798 906T655 967Q554 967 468 883T332 655T283 350Q283 239 328 184T455 129ZM704 1378Q704 1429 733 1462T812 1495Q894 1495 894 1413Q894 1364 866 1328T792 1292Q753 1292 729 1314T704 1378ZM1072 1378Q1072 1430 1102 1462T1181 1495Q1223 1495 1243 1473T1263 +1413Q1263 1361 1233 1327T1158 1292Q1121 1292 1097 1314T1072 1378Z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1163" d="M395 -20Q258 -20 178 78T98 354Q98 559 168 736T363 1016T637 1118Q730 1118 800 1069T913 928H924L989 1098H1126L893 0H750L776 203H768Q595 -20 395 -20ZM455 129Q549 129 643 219T795 453T852 748Q852 846 +798 906T655 967Q554 967 468 883T332 655T283 350Q283 239 328 184T455 129ZM1213 1458Q1213 1358 1151 1300T990 1241Q891 1241 830 1298T769 1456Q769 1553 831 1611T990 1669Q1090 1669 1151 1612T1213 1458ZM1105 1456Q1105 1509 1073 1539T990 1569Q942 1569 +910 1539T877 1456Q877 1403 906 1373T990 1343Q1041 1343 1073 1373T1105 1456Z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1679" d="M1169 -20Q1061 -20 981 18T858 135L829 0H709L733 203H725Q621 77 539 29T362 -20Q239 -20 169 78T98 352Q98 559 169 738T360 1017T621 1118Q790 1118 870 928H881L948 1098H1063L1034 956Q1089 1032 1173 1075T1362 +1118Q1484 1118 1559 1050T1634 862Q1634 679 1467 577T995 475H954L950 399Q950 273 1011 201T1202 129Q1261 129 1326 147T1499 213V55Q1335 -20 1169 -20ZM422 129Q514 129 605 218T753 454T811 748Q811 849 766 908T645 967Q547 967 464 882T332 654T283 352Q283 +240 319 185T422 129ZM1327 969Q1214 969 1121 877T981 621H999Q1216 621 1336 678T1456 844Q1456 901 1422 935T1327 969Z" /> +<glyph unicode="&#xe7;" horiz-adv-x="928" d="M506 -20Q312 -20 205 87T98 389Q98 592 171 760T375 1023T672 1118Q819 1118 944 1065L893 915Q778 967 674 967Q564 967 474 891T333 682T283 391Q283 266 346 198T524 129Q597 129 661 149T788 197V45Q660 -20 +506 -20ZM596 -274Q596 -373 516 -432T299 -492Q244 -492 207 -481V-375Q239 -383 281 -383Q449 -383 449 -274Q449 -237 419 -214T311 -180L410 0H524L465 -117Q596 -155 596 -274Z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1022" d="M637 969Q534 969 443 873T311 621H326Q544 621 664 679T784 848Q784 901 748 935T637 969ZM496 -20Q310 -20 204 89T98 393Q98 581 171 752T370 1020T647 1118Q803 1118 882 1051T961 862Q961 680 793 578T319 +475H285L281 399Q281 273 341 201T528 129Q605 129 675 151T827 213V59Q728 13 654 -3T496 -20ZM1039 1241H929Q863 1307 796 1400T703 1548V1569H896Q937 1434 1039 1266V1241Z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1022" d="M637 969Q534 969 443 873T311 621H326Q544 621 664 679T784 848Q784 901 748 935T637 969ZM496 -20Q310 -20 204 89T98 393Q98 581 171 752T370 1020T647 1118Q803 1118 882 1051T961 862Q961 680 793 578T319 +475H285L281 399Q281 273 341 201T528 129Q605 129 675 151T827 213V59Q728 13 654 -3T496 -20ZM581 1268Q632 1323 699 1411T811 1569H1016V1548Q969 1491 868 1393T694 1241H581V1268Z" /> +<glyph unicode="&#xea;" horiz-adv-x="1022" d="M637 969Q534 969 443 873T311 621H326Q544 621 664 679T784 848Q784 901 748 935T637 969ZM496 -20Q310 -20 204 89T98 393Q98 581 171 752T370 1020T647 1118Q803 1118 882 1051T961 862Q961 680 793 578T319 +475H285L281 399Q281 273 341 201T528 129Q605 129 675 151T827 213V59Q728 13 654 -3T496 -20ZM1234 1241H1121Q1065 1289 960 1427Q833 1314 720 1241H601V1268Q839 1488 888 1569H1062Q1096 1477 1192 1334L1234 1268V1241Z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1022" d="M637 969Q534 969 443 873T311 621H326Q544 621 664 679T784 848Q784 901 748 935T637 969ZM496 -20Q310 -20 204 89T98 393Q98 581 171 752T370 1020T647 1118Q803 1118 882 1051T961 862Q961 680 793 578T319 +475H285L281 399Q281 273 341 201T528 129Q605 129 675 151T827 213V59Q728 13 654 -3T496 -20ZM665 1378Q665 1429 694 1462T773 1495Q855 1495 855 1413Q855 1364 827 1328T753 1292Q714 1292 690 1314T665 1378ZM1033 1378Q1033 1430 1063 1462T1142 1495Q1184 +1495 1204 1473T1224 1413Q1224 1361 1194 1327T1119 1292Q1082 1292 1058 1314T1033 1378Z" /> +<glyph unicode="&#xec;" horiz-adv-x="528" d="M238 0H57L291 1098H471L238 0ZM498 1241H388Q322 1307 255 1400T162 1548V1569H355Q396 1434 498 1266V1241Z" /> +<glyph unicode="&#xed;" horiz-adv-x="528" d="M238 0H57L291 1098H471L238 0ZM322 1268Q373 1323 440 1411T552 1569H757V1548Q710 1491 609 1393T435 1241H322V1268Z" /> +<glyph unicode="&#xee;" horiz-adv-x="528" d="M238 0H57L291 1098H471L238 0ZM720 1241H607Q551 1289 446 1427Q319 1314 206 1241H87V1268Q325 1488 374 1569H548Q582 1477 678 1334L720 1268V1241Z" /> +<glyph unicode="&#xef;" horiz-adv-x="528" d="M238 0H57L291 1098H471L238 0ZM157 1378Q157 1429 186 1462T265 1495Q347 1495 347 1413Q347 1364 319 1328T245 1292Q206 1292 182 1314T157 1378ZM525 1378Q525 1430 555 1462T634 1495Q676 1495 696 1473T716 +1413Q716 1361 686 1327T611 1292Q574 1292 550 1314T525 1378Z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1167" d="M670 1333Q607 1390 526 1444L623 1567Q747 1484 815 1415L1073 1559L1139 1450L903 1319Q989 1206 1028 1082T1067 815Q1067 559 994 365T789 76T481 -20Q298 -20 193 82T88 375Q88 537 155 675T341 891T610 969Q713 +969 788 925T899 803L905 805V821Q905 950 871 1050T762 1241L496 1094L436 1204L670 1333ZM492 129Q595 129 674 183T804 348T854 573Q854 685 792 753T618 821Q512 821 434 764T314 604T272 377Q272 255 328 192T492 129Z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1186" d="M905 0H725L870 688Q891 787 891 829Q891 892 856 929T745 967Q659 967 578 908T433 738T338 473L238 0H57L291 1098H438L416 895H426Q493 981 546 1024T662 1092T795 1118Q924 1118 997 1048T1071 848Q1071 770 +1049 668L905 0ZM873 1243Q832 1243 795 1260T723 1299T655 1338T588 1356Q545 1356 520 1327T473 1241H367Q424 1503 602 1503Q647 1503 686 1486T761 1447T827 1409T885 1391Q927 1391 953 1416T1004 1505H1112Q1042 1243 873 1243Z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1153" d="M872 709Q872 824 812 893T649 963Q543 963 458 889T327 685T281 399Q281 271 342 202T518 133Q618 133 699 204T826 407T872 709ZM1057 688Q1057 498 985 332T789 75T508 -16Q316 -16 207 98T98 406Q98 598 172 +766T369 1023T647 1112Q838 1112 947 999T1057 688ZM1058 1241H948Q882 1307 815 1400T722 1548V1569H915Q956 1434 1058 1266V1241Z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1153" d="M872 709Q872 824 812 893T649 963Q543 963 458 889T327 685T281 399Q281 271 342 202T518 133Q618 133 699 204T826 407T872 709ZM1057 688Q1057 498 985 332T789 75T508 -16Q316 -16 207 98T98 406Q98 598 172 +766T369 1023T647 1112Q838 1112 947 999T1057 688ZM587 1268Q638 1323 705 1411T817 1569H1022V1548Q975 1491 874 1393T700 1241H587V1268Z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1153" d="M872 709Q872 824 812 893T649 963Q543 963 458 889T327 685T281 399Q281 271 342 202T518 133Q618 133 699 204T826 407T872 709ZM1057 688Q1057 498 985 332T789 75T508 -16Q316 -16 207 98T98 406Q98 598 172 +766T369 1023T647 1112Q838 1112 947 999T1057 688ZM1263 1241H1150Q1094 1289 989 1427Q862 1314 749 1241H630V1268Q868 1488 917 1569H1091Q1125 1477 1221 1334L1263 1268V1241Z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1153" d="M872 709Q872 824 812 893T649 963Q543 963 458 889T327 685T281 399Q281 271 342 202T518 133Q618 133 699 204T826 407T872 709ZM1057 688Q1057 498 985 332T789 75T508 -16Q316 -16 207 98T98 406Q98 598 172 +766T369 1023T647 1112Q838 1112 947 999T1057 688ZM846 1243Q805 1243 768 1260T696 1299T628 1338T561 1356Q518 1356 493 1327T446 1241H340Q397 1503 575 1503Q620 1503 659 1486T734 1447T800 1409T858 1391Q900 1391 926 1416T977 1505H1085Q1015 1243 846 +1243Z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1153" d="M872 709Q872 824 812 893T649 963Q543 963 458 889T327 685T281 399Q281 271 342 202T518 133Q618 133 699 204T826 407T872 709ZM1057 688Q1057 498 985 332T789 75T508 -16Q316 -16 207 98T98 406Q98 598 172 +766T369 1023T647 1112Q838 1112 947 999T1057 688ZM685 1378Q685 1429 714 1462T793 1495Q875 1495 875 1413Q875 1364 847 1328T773 1292Q734 1292 710 1314T685 1378ZM1053 1378Q1053 1430 1083 1462T1162 1495Q1204 1495 1224 1473T1244 1413Q1244 1361 1214 +1327T1139 1292Q1102 1292 1078 1314T1053 1378Z" /> +<glyph unicode="&#xf7;" horiz-adv-x="1128" d="M125 647V797H1049V647H125ZM473 373Q473 496 586 496Q639 496 669 466T700 373Q700 312 669 281T586 250Q538 250 506 278T473 373ZM473 1071Q473 1194 586 1194Q639 1194 669 1164T700 1071Q700 1010 669 979T586 +948Q538 948 506 976T473 1071Z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1153" d="M1053 705Q1053 507 979 335T783 73T510 -16Q367 -16 266 47L168 -78L59 6L170 143Q100 247 100 406Q100 596 172 764T368 1022T647 1112Q795 1112 897 1047L997 1171L1106 1090L991 963Q1053 866 1053 705ZM649 +965Q544 965 457 893T322 693T274 418Q274 331 291 293L795 920Q738 965 649 965ZM518 129Q618 129 701 200T832 400T879 686Q879 758 866 795L367 172Q420 129 518 129Z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1186" d="M279 1098H461L313 408Q295 318 295 270Q295 129 438 129Q525 129 606 188T752 359T848 625L948 1098H1126L893 0H745L768 203H758Q668 85 577 33T387 -20Q259 -20 186 51T113 252Q113 316 135 428L279 1098ZM1060 +1241H950Q884 1307 817 1400T724 1548V1569H917Q958 1434 1060 1266V1241Z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1186" d="M279 1098H461L313 408Q295 318 295 270Q295 129 438 129Q525 129 606 188T752 359T848 625L948 1098H1126L893 0H745L768 203H758Q668 85 577 33T387 -20Q259 -20 186 51T113 252Q113 316 135 428L279 1098ZM634 +1268Q685 1323 752 1411T864 1569H1069V1548Q1022 1491 921 1393T747 1241H634V1268Z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1186" d="M279 1098H461L313 408Q295 318 295 270Q295 129 438 129Q525 129 606 188T752 359T848 625L948 1098H1126L893 0H745L768 203H758Q668 85 577 33T387 -20Q259 -20 186 51T113 252Q113 316 135 428L279 1098ZM1036 +1241H923Q867 1289 762 1427Q635 1314 522 1241H403V1268Q641 1488 690 1569H864Q898 1477 994 1334L1036 1268V1241Z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1186" d="M279 1098H461L313 408Q295 318 295 270Q295 129 438 129Q525 129 606 188T752 359T848 625L948 1098H1126L893 0H745L768 203H758Q668 85 577 33T387 -20Q259 -20 186 51T113 252Q113 316 135 428L279 1098ZM453 +1378Q453 1429 482 1462T561 1495Q643 1495 643 1413Q643 1364 615 1328T541 1292Q502 1292 478 1314T453 1378ZM821 1378Q821 1430 851 1462T930 1495Q972 1495 992 1473T1012 1413Q1012 1361 982 1327T907 1292Q870 1292 846 1314T821 1378Z" /> +<glyph unicode="&#xfd;" horiz-adv-x="956" d="M98 1098H279L350 555Q361 480 369 361T377 147H383Q409 213 461 326T543 496L862 1098H1055L358 -184Q268 -354 174 -423T-51 -492Q-130 -492 -193 -471V-326Q-130 -344 -61 -344Q21 -344 80 -293T193 -143L264 +-16L98 1098ZM756 1268Q807 1323 874 1411T986 1569H1191V1548Q1144 1491 1043 1393T869 1241H756V1268Z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1186" d="M786 1116Q927 1116 1006 1017T1085 741Q1085 531 1015 352T823 77T553 -20Q460 -20 386 28T268 168H258Q251 63 233 -18L133 -492H-45L-9 -320L387 1556H567L489 1190Q449 1011 414 893H422Q522 1015 608 1065T786 +1116ZM727 967Q637 967 542 878T387 645T328 350Q328 244 381 187T537 129Q635 129 719 211T852 438T901 745Q901 967 727 967Z" /> +<glyph unicode="&#xff;" horiz-adv-x="956" d="M98 1098H279L350 555Q361 480 369 361T377 147H383Q409 213 461 326T543 496L862 1098H1055L358 -184Q268 -354 174 -423T-51 -492Q-130 -492 -193 -471V-326Q-130 -344 -61 -344Q21 -344 80 -293T193 -143L264 +-16L98 1098ZM589 1378Q589 1429 618 1462T697 1495Q779 1495 779 1413Q779 1364 751 1328T677 1292Q638 1292 614 1314T589 1378ZM957 1378Q957 1430 987 1462T1066 1495Q1108 1495 1128 1473T1148 1413Q1148 1361 1118 1327T1043 1292Q1006 1292 982 1314T957 +1378Z" /> +<glyph unicode="&#x2013;" horiz-adv-x="983" d="M53 467L90 633H915L881 467H53Z" /> +<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M53 467L90 633H1898L1864 467H53Z" /> +<glyph unicode="&#x2018;" horiz-adv-x="356" d="M129 961L123 983Q212 1184 391 1462H528Q387 1131 326 961H129Z" /> +<glyph unicode="&#x2019;" horiz-adv-x="356" d="M522 1462L530 1440Q490 1349 419 1222T260 961H123Q257 1259 326 1462H522Z" /> +<glyph unicode="&#x201a;" horiz-adv-x="498" d="M299 238L307 215Q209 4 37 -264H-100Q16 -2 102 238H299Z" /> +<glyph unicode="&#x201c;" horiz-adv-x="733" d="M506 961L498 983Q578 1164 770 1462H905Q758 1117 702 961H506ZM129 961L123 983Q212 1184 391 1462H528Q387 1131 326 961H129Z" /> +<glyph unicode="&#x201d;" horiz-adv-x="733" d="M522 1462L530 1440Q490 1349 419 1222T260 961H123Q257 1259 326 1462H522ZM899 1462L907 1440Q820 1242 635 961H500Q552 1077 616 1239T700 1462H899Z" /> +<glyph unicode="&#x201e;" horiz-adv-x="872" d="M299 238L307 215Q209 4 37 -264H-100Q16 -2 102 238H299ZM674 238L682 215Q592 21 414 -264H274Q414 52 477 238H674Z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M199 748Q199 870 257 935T426 1001Q536 1001 594 936T653 748Q653 626 594 560T426 494Q316 494 258 560T199 748Z" /> +<glyph unicode="&#x2039;" horiz-adv-x="588" d="M86 578L479 965L567 877L272 543L440 164L315 111L86 549V578Z" /> +<glyph unicode="&#x203a;" horiz-adv-x="588" d="M500 500L109 111L20 199L315 532L147 911L272 965L500 526V500Z" /> +</font> +</defs> +</svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf new file mode 100644 index 000000000000..7f75a2d90964 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff new file mode 100644 index 000000000000..6dce67cede18 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 new file mode 100644 index 000000000000..a9c14c492064 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.eot b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.eot new file mode 100644 index 000000000000..15fc8bfc91a9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.eot differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg new file mode 100644 index 000000000000..bd2894d6a271 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg @@ -0,0 +1,335 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<defs > +<font id="NotoSans" horiz-adv-x="1169" ><font-face + font-family="Noto Sans" + units-per-em="2048" + panose-1="2 11 5 2 4 5 4 2 2 4" + ascent="2189" + descent="-600" + alphabetic="0" /> +<glyph unicode=" " horiz-adv-x="532" /> +<glyph unicode="!" horiz-adv-x="785" d="M488 414H367L316 1462H539L488 414ZM299 111Q299 149 309 175T336 218T376 242T426 250Q452 250 475 243T516 219T543 176T553 111Q553 74 543 48T516 4T476 -21T426 -29Q399 -29 376 -21T336 4T309 47T299 111Z" /> +<glyph unicode="&quot;" horiz-adv-x="1028" d="M462 1493L411 965H286L235 1493H462ZM822 1493L771 965H647L596 1493H822Z" /> +<glyph unicode="#" horiz-adv-x="1337" d="M983 807L924 496H1196V361H897L828 0H684L755 361H470L400 0H259L325 361H70V496H351L413 807H144V941H437L505 1295H649L582 941H869L938 1295H1079L1010 941H1267V807H983ZM495 496H781L841 807H556L495 496Z" /> +<glyph unicode="$" horiz-adv-x="1171" d="M1040 449Q1040 312 939 222T649 109V-119H518V100Q404 102 300 119T127 168V336Q202 301 310 276T518 248V676Q313 741 228 828T143 1053Q143 1185 244 1270T518 1374V1554H649V1376Q839 1371 1010 1300L954 1159Q799 +1220 649 1231V809Q809 755 887 707T1003 598T1040 449ZM858 436Q858 508 811 550T649 633V258Q858 290 858 436ZM326 1055Q326 982 369 937T518 854V1227Q424 1211 375 1166T326 1055Z" /> +<glyph unicode="%" horiz-adv-x="1695" d="M265 925Q265 805 300 745T413 685Q566 685 566 925Q566 1165 413 1165Q335 1165 300 1105T265 925ZM714 925Q714 839 697 770T642 652T548 579T413 554Q340 554 285 579T192 652T136 769T117 925Q117 1012 134 1081T187 +1197T280 1269T413 1294Q487 1294 543 1270T637 1198T695 1081T714 925ZM1130 351Q1130 231 1165 172T1278 112Q1431 112 1431 351Q1431 591 1278 591Q1200 591 1165 532T1130 351ZM1578 351Q1578 264 1561 196T1507 79T1414 6T1278 -20Q1205 -20 1150 5T1057 79T1001 +195T982 351Q982 438 999 507T1053 623T1145 695T1278 720Q1353 720 1409 695T1502 623T1559 507T1578 351ZM1324 1274L535 0H375L1166 1274H1324Z" /> +<glyph unicode="&amp;" horiz-adv-x="1499" d="M422 1167Q422 1102 457 1037T573 893Q697 962 748 1025T799 1169Q799 1245 748 1291T616 1337Q527 1337 475 1290T422 1167ZM575 139Q802 139 958 285L532 698Q394 615 346 547T297 387Q297 274 374 207T575 139ZM109 +381Q109 511 176 609T424 811Q347 898 315 948T264 1052T246 1165Q246 1313 345 1399T623 1485Q788 1485 882 1401T977 1169Q977 1060 909 969T684 786L1079 406Q1172 514 1223 731H1405Q1336 446 1196 291L1495 0H1251L1073 172Q959 70 838 25T569 -20Q354 -20 +232 85T109 381Z" /> +<glyph unicode="&apos;" horiz-adv-x="668" d="M462 1493L411 965H286L235 1493H462Z" /> +<glyph unicode="(" horiz-adv-x="724" d="M140 691Q140 834 157 971T211 1236T303 1481T436 1703H602Q533 1594 479 1474T388 1224T333 960T315 689Q315 410 388 147T604 -338H436Q359 -232 304 -112T212 140T158 410T140 691Z" /> +<glyph unicode=")" horiz-adv-x="724" d="M584 674Q584 531 567 394T513 129T421 -116T288 -338H122Q191 -229 245 -109T336 141T391 405T409 676Q409 955 336 1218T120 1703H288Q365 1597 420 1477T512 1225T566 955T584 674Z" /> +<glyph unicode="*" horiz-adv-x="1243" d="M732 1525L689 1132L1086 1243L1112 1050L734 1022L979 696L801 600L625 958L467 600L283 696L525 1022L150 1050L179 1243L570 1132L527 1525H732Z" /> +<glyph unicode="+" horiz-adv-x="1128" d="M489 585H102V735H489V1123H639V735H1026V585H639V199H489V585Z" /> +<glyph unicode="," horiz-adv-x="512" d="M362 238L377 215Q363 161 344 100T301 -23T252 -146T201 -264H63Q78 -203 92 -137T120 -6T145 122T164 238H362Z" /> +<glyph unicode="-" horiz-adv-x="696" d="M100 524V692H596V524H100Z" /> +<glyph unicode="." horiz-adv-x="549" d="M147 111Q147 149 157 175T184 218T224 242T274 250Q300 250 323 243T364 219T391 176T401 111Q401 74 391 48T364 4T324 -21T274 -29Q247 -29 224 -21T184 4T157 47T147 111Z" /> +<glyph unicode="/" horiz-adv-x="879" d="M793 1705L256 -339H86L625 1705H793Z" /> +<glyph unicode="0" horiz-adv-x="1128" d="M1032 733Q1032 556 1007 416T925 179T779 31T563 -20Q445 -20 358 31T213 179T127 416T98 733Q98 910 123 1050T204 1286T348 1434T563 1485Q682 1485 770 1435T916 1288T1003 1051T1032 733ZM283 733Q283 583 298 471T346 +285T432 173T563 135Q640 135 694 172T782 283T832 469T848 733Q848 883 833 995T783 1181T694 1292T563 1329Q486 1329 433 1292T346 1181T298 995T283 733Z" /> +<glyph unicode="1" horiz-adv-x="1128" d="M711 0H535V913Q535 956 535 1005T537 1102T540 1195T543 1274Q526 1256 513 1243T487 1218T458 1193T422 1161L274 1040L178 1163L561 1462H711V0Z" /> +<glyph unicode="2" horiz-adv-x="1128" d="M1008 0H96V156L446 537Q521 618 580 685T680 816T744 944T766 1085Q766 1144 749 1189T701 1265T626 1313T530 1329Q435 1329 359 1291T213 1192L111 1311Q151 1347 197 1378T296 1433T408 1469T532 1483Q628 1483 705 +1456T837 1379T920 1256T950 1092Q950 1007 924 930T851 779T740 629T600 473L319 174V166H1008V0Z" /> +<glyph unicode="3" horiz-adv-x="1128" d="M961 1120Q961 1047 938 987T874 883T774 811T645 770V764Q822 742 914 652T1006 416Q1006 320 974 240T875 102T708 12T469 -20Q360 -20 264 -3T82 59V229Q169 183 270 158T465 133Q557 133 624 153T734 210T798 301T819 +422Q819 490 793 538T717 618T598 665T438 680H305V831H438Q519 831 582 851T687 908T752 996T774 1108Q774 1160 756 1201T705 1270T626 1314T524 1329Q417 1329 336 1296T180 1208L88 1333Q126 1364 172 1391T274 1438T391 1471T524 1483Q632 1483 713 1456T850 +1381T933 1266T961 1120Z" /> +<glyph unicode="4" horiz-adv-x="1128" d="M1087 328H874V0H698V328H23V487L686 1470H874V494H1087V328ZM698 494V850Q698 906 699 967T703 1087T707 1197T711 1282H702Q695 1262 685 1238T662 1189T636 1141T612 1102L201 494H698Z" /> +<glyph unicode="5" horiz-adv-x="1128" d="M545 897Q644 897 729 870T878 788T978 654T1014 469Q1014 355 980 264T879 110T714 14T487 -20Q436 -20 387 -15T292 -1T205 24T131 59V231Q164 208 208 190T302 160T400 142T492 135Q571 135 633 153T738 211T804 309T827 +449Q827 592 739 667T483 743Q456 743 425 741T362 734T302 726T252 717L162 774L217 1462H907V1296H375L336 877Q368 883 420 890T545 897Z" /> +<glyph unicode="6" horiz-adv-x="1128" d="M113 625Q113 730 123 834T160 1033T233 1211T350 1353T520 1448T752 1483Q771 1483 794 1482T840 1479T885 1473T924 1464V1309Q889 1321 845 1327T758 1333Q668 1333 600 1312T481 1251T398 1158T343 1039T312 899T299 +745H311Q331 781 359 812T426 866T511 902T618 915Q713 915 790 886T921 799T1004 660T1034 471Q1034 357 1003 266T914 112T774 14T590 -20Q490 -20 403 19T251 138T150 339T113 625ZM588 133Q648 133 697 153T783 215T838 320T858 471Q858 541 842 596T792 691T710 +751T594 772Q527 772 472 749T377 688T317 602T295 506Q295 439 313 373T368 253T460 167T588 133Z" /> +<glyph unicode="7" horiz-adv-x="1128" d="M281 0L844 1296H90V1462H1030V1317L475 0H281Z" /> +<glyph unicode="8" horiz-adv-x="1128" d="M565 1485Q649 1485 723 1463T854 1397T944 1287T977 1133Q977 1066 957 1012T902 915T819 837T715 774Q773 743 828 705T927 620T997 513T1024 381Q1024 289 991 215T897 88T752 8T565 -20Q455 -20 370 7T226 84T137 +208T106 373Q106 448 128 508T189 616T279 701T389 766Q340 797 297 833T223 915T173 1014T154 1135Q154 1222 187 1287T278 1397T409 1463T565 1485ZM285 371Q285 318 301 274T351 198T437 149T561 131Q631 131 684 148T774 198T828 277T846 379Q846 431 827 473T771 +551T683 619T569 682L539 696Q413 636 349 559T285 371ZM563 1333Q457 1333 395 1280T332 1126Q332 1069 349 1028T398 955T472 898T567 848Q615 870 657 896T731 955T781 1030T799 1126Q799 1227 736 1280T563 1333Z" /> +<glyph unicode="9" horiz-adv-x="1128" d="M1028 838Q1028 733 1018 629T981 429T908 252T791 109T621 15T389 -20Q370 -20 347 -19T301 -16T256 -10T217 -2V154Q252 141 296 135T383 129Q518 129 605 176T743 303T815 491T842 717H829Q809 681 781 650T715 596T629 +560T522 547Q427 547 350 576T219 663T136 802T106 991Q106 1105 137 1196T226 1351T366 1449T551 1483Q652 1483 739 1444T890 1325T991 1124T1028 838ZM553 1329Q493 1329 444 1309T358 1247T303 1142T283 991Q283 921 299 866T349 771T431 711T547 690Q615 690 +670 713T764 774T824 860T846 956Q846 1023 828 1089T773 1209T681 1296T553 1329Z" /> +<glyph unicode=":" horiz-adv-x="603" d="M175 111Q175 149 185 175T212 218T252 242T302 250Q328 250 351 243T392 219T419 176T429 111Q429 74 419 48T392 4T352 -21T302 -29Q275 -29 252 -21T212 4T185 47T175 111ZM175 987Q175 1026 185 1052T212 1095T252 +1119T302 1126Q328 1126 351 1119T392 1096T419 1053T429 987Q429 950 419 924T392 881T352 856T302 848Q275 848 252 856T212 881T185 924T175 987Z" /> +<glyph unicode=";" horiz-adv-x="603" d="M390 238L405 215Q391 161 372 100T329 -23T280 -146T229 -264H91Q106 -203 120 -137T148 -6T173 122T192 238H390ZM175 987Q175 1026 185 1052T212 1095T252 1119T302 1126Q328 1126 351 1119T392 1096T419 1053T429 +987Q429 950 419 924T392 881T352 856T302 848Q275 848 252 856T212 881T185 924T175 987Z" /> +<glyph unicode="&lt;" horiz-adv-x="1128" d="M1026 157L102 581V683L1026 1164V1004L291 640L1026 318V157Z" /> +<glyph unicode="=" horiz-adv-x="1128" d="M102 791V940H1026V791H102ZM102 381V531H1026V381H102Z" /> +<glyph unicode="&gt;" horiz-adv-x="1128" d="M102 318L838 640L102 1004V1164L1026 683V581L102 157V318Z" /> +<glyph unicode="?" horiz-adv-x="1060" d="M390 414V451Q390 508 397 554T424 640T477 718T560 799Q608 840 642 873T697 941T729 1015T740 1108Q740 1156 725 1195T682 1263T611 1307T512 1323Q429 1323 354 1297T209 1237L146 1382Q227 1424 321 1453T512 1483Q605 +1483 679 1458T806 1384T886 1267T914 1110Q914 1043 901 991T860 893T793 806T699 717Q647 672 614 639T562 574T536 509T529 432V414H390ZM342 111Q342 149 352 175T379 218T419 242T469 250Q495 250 518 243T559 219T586 176T596 111Q596 74 586 48T559 4T519 +-21T469 -29Q442 -29 419 -21T379 4T352 47T342 111Z" /> +<glyph unicode="@" horiz-adv-x="1841" d="M1722 731Q1722 591 1678 473T1553 289T1368 223Q1283 223 1225 272T1153 401H1143Q1104 318 1029 271T854 223Q702 223 615 324T528 604Q528 737 581 842T735 1006T963 1065Q1032 1065 1120 1053T1276 1016L1253 548V526Q1253 +350 1380 350Q1469 350 1524 455T1579 733Q1579 912 1506 1047T1297 1254T987 1327Q767 1327 604 1236T353 975T266 580Q266 278 425 116T887 -47Q1099 -47 1327 41V-98Q1127 -182 887 -182Q523 -182 321 17T119 573Q119 832 226 1035T532 1350T987 1462Q1202 1462 +1370 1371T1630 1113T1722 731ZM688 600Q688 350 881 350Q1086 350 1104 659L1116 915Q1043 936 965 936Q836 936 762 847T688 600Z" /> +<glyph unicode="A" horiz-adv-x="1309" d="M1116 0L940 453H360L186 0H0L571 1468H737L1307 0H1116ZM885 616L721 1059L651 1278Q621 1158 588 1059L422 616H885Z" /> +<glyph unicode="B" horiz-adv-x="1331" d="M199 1462H616Q910 1462 1040 1375T1171 1100Q1171 970 1100 886T893 776V766Q1062 737 1141 649T1221 416Q1221 220 1087 110T713 0H199V1462ZM383 840H653Q825 840 903 895T981 1079Q981 1199 896 1252T625 1305H383V840ZM383 +686V156H678Q854 156 939 224T1024 430Q1024 561 934 623T664 686H383Z" /> +<glyph unicode="C" horiz-adv-x="1294" d="M825 1321Q589 1321 454 1163T319 731Q319 448 450 295T823 141Q979 141 1174 199V39Q1081 5 995 -7T797 -20Q474 -20 300 176T125 733Q125 959 208 1129T451 1391T827 1483Q1059 1483 1231 1397L1157 1241Q982 1321 825 1321Z" /> +<glyph unicode="D" horiz-adv-x="1495" d="M1370 745Q1370 383 1173 192T606 0H199V1462H649Q990 1462 1180 1275T1370 745ZM1176 739Q1176 1018 1039 1161T623 1305H383V158H582Q1176 158 1176 739Z" /> +<glyph unicode="E" horiz-adv-x="1139" d="M1016 0H199V1462H1016V1300H383V844H979V684H383V162H1016V0Z" /> +<glyph unicode="F" horiz-adv-x="1063" d="M383 0H199V1462H1016V1300H383V782H977V621H383V0Z" /> +<glyph unicode="G" horiz-adv-x="1491" d="M834 772H1339V55Q1223 18 1103 -1T825 -20Q491 -20 308 178T125 731Q125 960 216 1131T478 1392T883 1483Q1117 1483 1319 1397L1249 1237Q1056 1321 872 1321Q611 1321 464 1163T317 731Q317 441 458 290T868 139Q1015 +139 1155 174V608H834V772Z" /> +<glyph unicode="H" horiz-adv-x="1518" d="M1317 0H1133V682H383V0H199V1462H383V844H1133V1462H1317V0Z" /> +<glyph unicode="I" horiz-adv-x="694" d="M610 0H82V106L254 145V1315L82 1356V1462H610V1356L438 1315V145L610 106V0Z" /> +<glyph unicode="J" horiz-adv-x="559" d="M-8 -389Q-102 -389 -160 -362V-207Q-89 -227 -12 -227Q88 -227 138 -167T188 8V1462H373V23Q373 -175 275 -282T-8 -389Z" /> +<glyph unicode="K" horiz-adv-x="1268" d="M1268 0H1051L532 698L383 567V0H199V1462H383V741L509 880L1030 1462H1245L666 825L1268 0Z" /> +<glyph unicode="L" horiz-adv-x="1073" d="M199 0V1462H383V164H1022V0H199Z" /> +<glyph unicode="M" horiz-adv-x="1858" d="M844 0L362 1282H354Q369 1122 369 887V0H199V1462H471L922 264H930L1389 1462H1659V0H1477V899Q1477 1049 1491 1280H1483L995 0H844Z" /> +<glyph unicode="N" horiz-adv-x="1556" d="M1358 0H1143L360 1214H352L357 1133Q369 951 369 817V0H199V1462H412L457 1391L937 649L1192 252H1200Q1198 276 1192 423T1186 637V1462H1358V0Z" /> +<glyph unicode="O" horiz-adv-x="1599" d="M1475 733Q1475 382 1298 181T801 -20Q478 -20 302 177T125 735Q125 1092 300 1288T803 1485Q1121 1485 1298 1286T1475 733ZM319 733Q319 443 442 291T801 139Q1036 139 1158 289T1280 733Q1280 1026 1159 1174T803 +1323Q565 1323 442 1173T319 733Z" /> +<glyph unicode="P" horiz-adv-x="1239" d="M1135 1032Q1135 808 982 689T551 569H383V0H199V1462H586Q1135 1462 1135 1032ZM383 727H530Q748 727 846 797T944 1024Q944 1165 853 1235T569 1305H383V727Z" /> +<glyph unicode="Q" horiz-adv-x="1599" d="M1475 733Q1475 456 1364 271T1049 16L1399 -348H1135L852 -18L801 -20Q478 -20 302 177T125 735Q125 1092 300 1288T803 1485Q1121 1485 1298 1286T1475 733ZM319 733Q319 443 442 291T801 139Q1036 139 1158 289T1280 +733Q1280 1026 1159 1174T803 1323Q565 1323 442 1173T319 733Z" /> +<glyph unicode="R" horiz-adv-x="1274" d="M383 760H602Q780 760 862 830T944 1038Q944 1176 861 1239T592 1303H383V760ZM383 604V0H199V1462H602Q874 1462 1004 1359T1135 1047Q1135 756 842 655L1243 0H1028L674 604H383Z" /> +<glyph unicode="S" horiz-adv-x="1124" d="M1028 391Q1028 200 890 90T506 -20Q246 -20 104 49V225Q197 185 307 162T514 139Q678 139 761 202T844 375Q844 448 814 495T714 583T500 676Q297 750 210 850T123 1110Q123 1281 251 1382T590 1483Q809 1483 993 1401L936 +1243Q748 1321 586 1321Q456 1321 383 1265T309 1108Q309 1036 337 989T429 902T629 813Q792 753 872 697T990 567T1028 391Z" /> +<glyph unicode="T" horiz-adv-x="1139" d="M662 0H477V1300H20V1462H1116V1300H662V0Z" /> +<glyph unicode="U" horiz-adv-x="1497" d="M1311 1462V516Q1311 266 1160 123T741 -20Q476 -20 330 124T184 520V1462H369V514Q369 335 464 237T752 139Q933 139 1030 236T1128 516V1462H1311Z" /> +<glyph unicode="V" horiz-adv-x="1229" d="M0 1462H193L522 524Q585 346 614 205Q639 331 707 528L1034 1462H1229L707 0H522L0 1462Z" /> +<glyph unicode="W" horiz-adv-x="1905" d="M1489 0H1303L1018 958Q955 1172 944 1247Q928 1132 874 952L598 0H412L25 1462H217L444 569Q490 394 514 221Q536 385 592 580L850 1462H1040L1309 573Q1361 400 1389 221Q1405 359 1460 571L1686 1462H1878L1489 0Z" /> +<glyph unicode="X" horiz-adv-x="1200" d="M1192 0H983L596 635L203 0H8L494 762L39 1462H244L602 889L963 1462H1157L705 766L1192 0Z" /> +<glyph unicode="Y" horiz-adv-x="1159" d="M580 743L961 1462H1159L672 567V0H487V559L0 1462H201L580 743Z" /> +<glyph unicode="Z" horiz-adv-x="1171" d="M1092 0H78V139L848 1298H102V1462H1071V1323L301 164H1092V0Z" /> +<glyph unicode="[" horiz-adv-x="729" d="M618 -339H221V1704H618V1561H386V-196H618V-339Z" /> +<glyph unicode="\" horiz-adv-x="879" d="M254 1703L793 -339H625L86 1703H254Z" /> +<glyph unicode="]" horiz-adv-x="729" d="M110 -196H341V1560H110V1703H508V-339H110V-196Z" /> +<glyph unicode="^" horiz-adv-x="1128" d="M60 549L519 1473H621L1068 549H907L570 1284L221 549H60Z" /> +<glyph unicode="_" horiz-adv-x="842" d="M846 -324H-4V-184H846V-324Z" /> +<glyph unicode="`" horiz-adv-x="1188" d="M799 1241H678Q603 1301 514 1396T387 1548V1569H602Q634 1503 693 1412T799 1266V1241Z" /> +<glyph unicode="a" horiz-adv-x="1149" d="M852 0L817 156H809Q727 53 646 17T440 -20Q278 -20 186 65T94 305Q94 639 621 655L807 662V727Q807 852 753 911T580 971Q493 971 416 945T270 887L215 1022Q298 1066 396 1091T590 1116Q789 1116 886 1028T983 748V0H852ZM481 +125Q632 125 718 206T805 438V537L643 530Q454 523 368 470T281 303Q281 217 333 171T481 125Z" /> +<glyph unicode="b" horiz-adv-x="1260" d="M694 1116Q911 1116 1029 967T1147 549Q1147 277 1027 129T694 -20Q583 -20 496 20T354 139H340Q309 19 303 0H174V1556H354V1178Q354 1065 344 952H354Q465 1116 694 1116ZM664 967Q498 967 426 873T354 555V547Q354 +322 427 226T668 129Q816 129 888 237T961 551Q961 759 888 863T664 967Z" /> +<glyph unicode="c" horiz-adv-x="983" d="M614 -20Q377 -20 245 125T113 543Q113 819 246 968T627 1118Q707 1118 785 1102T915 1059L860 909Q721 961 623 961Q457 961 378 857T299 545Q299 346 378 241T612 135Q757 135 897 199V39Q783 -20 614 -20Z" /> +<glyph unicode="d" horiz-adv-x="1260" d="M563 -20Q349 -20 231 128T113 547Q113 816 231 967T565 1118Q786 1118 905 956H918Q915 976 910 1036T905 1118V1556H1085V0H940L913 147H905Q790 -20 563 -20ZM592 129Q756 129 831 218T907 512V545Q907 774 831 871T590 +969Q451 969 375 859T299 543Q299 339 374 234T592 129Z" /> +<glyph unicode="e" horiz-adv-x="1155" d="M641 -20Q394 -20 254 129T113 541Q113 805 244 961T598 1118Q805 1118 928 985T1051 623V514H299Q304 327 394 230T649 133Q737 133 816 148T1001 209V51Q910 12 830 -4T641 -20ZM596 971Q467 971 392 888T303 657H862Q860 +811 791 891T596 971Z" /> +<glyph unicode="f" horiz-adv-x="705" d="M680 958H403V0H223V958H31V1042L223 1104V1167Q223 1367 310 1467T580 1567Q685 1567 793 1530L745 1389Q652 1419 582 1419Q491 1419 447 1359T403 1169V1098H680V958Z" /> +<glyph unicode="g" horiz-adv-x="1260" d="M592 127Q758 127 833 216T909 504V547Q909 767 833 867T588 967Q450 967 375 858T299 545Q299 341 372 234T592 127ZM907 10L913 145H905Q794 -20 565 -20Q352 -20 233 128T113 547Q113 812 233 965T563 1118Q786 1118 +907 952H918L942 1098H1085V-18Q1085 -254 966 -373T594 -492Q354 -492 199 -422V-256Q359 -342 604 -342Q744 -342 825 -260T907 -33V10Z" /> +<glyph unicode="h" horiz-adv-x="1266" d="M922 0V702Q922 836 863 901T676 967Q509 967 432 874T354 567V0H174V1556H354V1100Q354 1010 344 946H356Q405 1026 495 1071T698 1116Q898 1116 999 1021T1100 715V0H922Z" /> +<glyph unicode="i" horiz-adv-x="528" d="M354 0H174V1098H354V0ZM160 1395Q160 1455 190 1482T266 1509Q308 1509 339 1482T371 1395Q371 1336 340 1308T266 1280Q221 1280 191 1308T160 1395Z" /> +<glyph unicode="j" horiz-adv-x="528" d="M45 -492Q-49 -492 -113 -467V-322Q-44 -342 23 -342Q101 -342 137 -300T174 -170V1098H354V-164Q354 -328 276 -410T45 -492ZM160 1395Q160 1455 190 1482T266 1509Q308 1509 339 1482T371 1395Q371 1336 340 1308T266 +1280Q221 1280 191 1308T160 1395Z" /> +<glyph unicode="k" horiz-adv-x="1094" d="M352 565L413 643L483 727L834 1098H1044L600 629L1075 0H858L477 512L352 403V0H174V1556H352V743L344 565H352Z" /> +<glyph unicode="l" horiz-adv-x="528" d="M354 0H174V1556H354V0Z" /> +<glyph unicode="m" horiz-adv-x="1915" d="M1571 0V707Q1571 967 1348 967Q1195 967 1123 878T1051 606V0H872V707Q872 837 818 902T647 967Q495 967 425 874T354 569V0H174V1098H319L346 948H356Q403 1028 488 1073T680 1118Q938 1118 1016 934H1026Q1079 1022 +1170 1070T1378 1118Q1564 1118 1656 1022T1749 715V0H1571Z" /> +<glyph unicode="n" horiz-adv-x="1266" d="M922 0V702Q922 836 863 901T676 967Q507 967 431 874T354 569V0H174V1098H319L346 948H356Q407 1029 499 1073T702 1118Q904 1118 1002 1020T1100 715V0H922Z" /> +<glyph unicode="o" horiz-adv-x="1239" d="M1128 551Q1128 282 992 131T616 -20Q467 -20 352 49T175 249T113 551Q113 819 247 968T623 1118Q855 1118 991 966T1128 551ZM299 551Q299 344 380 237T621 129Q778 129 860 236T942 551Q942 758 860 862T618 967Q299 +967 299 551Z" /> +<glyph unicode="p" horiz-adv-x="1260" d="M694 -20Q473 -20 354 139H342L346 98Q354 20 354 -41V-492H174V1098H322L346 948H354Q418 1038 502 1078T696 1118Q910 1118 1028 970T1147 551Q1147 282 1028 131T694 -20ZM664 967Q501 967 429 875T354 586V551Q354 +328 428 229T668 129Q806 129 883 241T961 553Q961 754 884 860T664 967Z" /> +<glyph unicode="q" horiz-adv-x="1260" d="M594 129Q755 129 829 217T907 508V545Q907 772 831 870T590 969Q449 969 374 858T299 543Q299 342 373 236T594 129ZM559 -20Q347 -20 230 130T113 547Q113 815 232 966T565 1118Q790 1118 907 948H915L942 1098H1085V-492H905V-23Q905 +87 915 147H903Q788 -20 559 -20Z" /> +<glyph unicode="r" horiz-adv-x="846" d="M686 1118Q759 1118 815 1106L793 940Q732 954 674 954Q587 954 513 906T396 774T354 586V0H174V1098H322L342 897H350Q413 1006 499 1062T686 1118Z" /> +<glyph unicode="s" horiz-adv-x="981" d="M889 303Q889 149 774 65T451 -20Q234 -20 106 49V213Q287 125 455 125Q591 125 653 169T715 287Q715 352 656 397T444 500Q289 560 226 602T134 698T104 827Q104 962 214 1040T516 1118Q703 1118 866 1044L805 901Q638 +971 504 971Q392 971 334 936T276 838Q276 778 326 739T559 629Q696 578 761 534T858 435T889 303Z" /> +<glyph unicode="t" horiz-adv-x="739" d="M541 127Q576 127 623 134T694 150V12Q669 1 617 -9T510 -20Q188 -20 188 319V958H33V1044L190 1116L262 1350H369V1098H686V958H369V324Q369 229 414 178T541 127Z" /> +<glyph unicode="u" horiz-adv-x="1266" d="M344 1098V391Q344 258 403 194T588 129Q757 129 834 223T911 526V1098H1092V0H944L918 145H909Q860 66 770 23T561 -20Q363 -20 263 75T162 379V1098H344Z" /> +<glyph unicode="v" horiz-adv-x="1040" d="M416 0L0 1098H193L426 451Q495 256 514 160H522Q525 173 529 189T540 225T614 451L848 1098H1040L623 0H416Z" /> +<glyph unicode="w" horiz-adv-x="1610" d="M1071 0L883 618Q857 695 807 909H799Q757 714 725 616L528 0H324L23 1098H209Q313 693 367 482T432 184H440L454 246Q485 389 514 479L709 1098H905L1094 479Q1104 444 1115 405T1137 327T1155 252T1167 186H1176Q1185 +262 1249 512L1403 1098H1587L1282 0H1071Z" /> +<glyph unicode="x" horiz-adv-x="1083" d="M434 561L55 1098H260L543 684L823 1098H1026L647 561L1047 0H842L543 438L240 0H37L434 561Z" /> +<glyph unicode="y" horiz-adv-x="1044" d="M2 1098H195L432 473Q507 269 524 174H532Q541 211 573 312T627 475L850 1098H1044L571 -152Q502 -334 407 -413T172 -492Q97 -492 23 -475V-332Q73 -344 143 -344Q229 -344 289 -297T387 -150L444 -4L2 1098Z" /> +<glyph unicode="z" horiz-adv-x="963" d="M883 0H80V119L670 958H115V1098H868V963L287 139H883V0Z" /> +<glyph unicode="{" horiz-adv-x="800" d="M507 -37Q507 -84 520 -114T556 -161T614 -184T691 -192V-339Q615 -338 551 -322T441 -271T368 -182T341 -51V421Q341 522 277 564T90 606V758Q212 758 276 800T341 943V1416Q341 1492 367 1546T440 1634T551 1685T691 +1703V1557Q648 1556 614 1550T557 1526T520 1479T507 1402V931Q507 828 452 768T291 687V676Q397 656 452 597T507 433V-37Z" /> +<glyph unicode="|" horiz-adv-x="1105" d="M479 1703H626V-339H479V1703Z" /> +<glyph unicode="}" horiz-adv-x="770" d="M293 433Q293 537 348 596T510 676V687Q403 707 348 767T293 931V1402Q293 1449 281 1479T245 1526T187 1549T110 1557V1703Q185 1702 249 1686T360 1635T433 1546T460 1416V943Q460 892 476 857T524 800T603 768T711 +758V606Q588 606 524 564T460 421V-51Q460 -128 434 -182T361 -270T250 -321T110 -339V-192Q152 -191 186 -185T244 -161T280 -114T293 -37V433Z" /> +<glyph unicode="~" horiz-adv-x="1128" d="M530 590Q493 606 466 617T416 634T373 643T330 646Q302 646 272 637T213 611T155 572T102 525V687Q202 795 350 795Q379 795 404 793T456 784T517 765T598 732Q635 716 662 705T713 688T757 679T799 676Q827 676 857 +685T916 711T974 750T1026 797V635Q927 527 778 527Q749 527 724 529T672 538T611 557T530 590Z" /> +<glyph unicode="&#xa0;" horiz-adv-x="532" /> +<glyph unicode="&#xa1;" horiz-adv-x="551" d="M213 676H332L383 -373H162L213 676ZM401 979Q401 912 369 877T274 842Q212 842 180 876T147 979Q147 1045 181 1081T274 1118Q333 1118 367 1082T401 979Z" /> +<glyph unicode="&#xa2;" horiz-adv-x="1171" d="M975 240Q862 183 721 178V-20H584V184Q380 215 283 353T186 741Q186 1249 584 1311V1483H723V1319Q875 1313 993 1260L940 1110Q797 1163 696 1163Q529 1163 450 1059T371 743Q371 530 451 433T688 336Q777 336 +844 353T975 397V240Z" /> +<glyph unicode="&#xa3;" horiz-adv-x="1171" d="M684 1481Q874 1481 1047 1397L983 1253Q816 1331 688 1331Q571 1331 510 1271T449 1075V791H866V655H449V442Q449 346 417 278T309 164H1096V0H66V152Q268 199 268 440V655H72V791H268V1094Q268 1275 380 1378T684 1481Z" /> +<glyph unicode="&#xa4;" horiz-adv-x="1171" d="M184 723Q184 840 256 948L121 1087L221 1184L356 1053Q456 1124 586 1124Q707 1124 811 1053L948 1184L1047 1087L915 950Q987 839 987 723Q987 593 915 494L1044 358L948 262L811 393Q708 324 586 324Q454 324 +356 395L221 264L123 360L256 496Q184 604 184 723ZM322 723Q322 612 398 536T586 459Q697 459 774 535T852 723Q852 837 775 914T586 991Q476 991 399 914T322 723Z" /> +<glyph unicode="&#xa5;" horiz-adv-x="1171" d="M584 748L950 1462H1139L727 694H981V563H672V395H981V264H672V0H496V264H186V395H496V563H186V694H436L29 1462H219L584 748Z" /> +<glyph unicode="&#xa6;" horiz-adv-x="1128" d="M489 1556H639V776H489V1556ZM489 287H639V-494H489V287Z" /> +<glyph unicode="&#xa7;" horiz-adv-x="1051" d="M137 809Q137 896 180 963T299 1067Q225 1107 184 1163T143 1303Q143 1426 247 1496T547 1567Q639 1567 714 1553T897 1497L842 1360Q745 1399 677 1413T535 1427Q420 1427 366 1398T311 1307Q311 1251 369 1209T582 +1112Q764 1045 839 969T915 784Q915 604 762 512Q913 432 913 287Q913 145 795 68T467 -10Q257 -10 121 57V211Q208 172 303 150T475 127Q603 127 672 164T741 272Q741 333 688 372T477 473Q280 546 209 621T137 809ZM291 829Q291 778 318 741T405 668T629 571Q760 +647 760 758Q760 839 690 893T438 1006Q373 988 332 939T291 829Z" /> +<glyph unicode="&#xa8;" horiz-adv-x="1188" d="M305 1395Q305 1448 333 1471T401 1495Q440 1495 469 1472T498 1395Q498 1342 469 1317T401 1292Q361 1292 333 1317T305 1395ZM690 1395Q690 1448 718 1471T784 1495Q823 1495 852 1472T881 1395Q881 1342 852 +1317T784 1292Q746 1292 718 1317T690 1395Z" /> +<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M893 1055Q774 1055 707 970T639 731Q639 574 697 490T891 406Q986 406 1106 453V322Q1046 295 997 284T883 272Q690 272 585 392T479 731Q479 940 590 1064T891 1188Q1021 1188 1143 1126L1083 1001Q977 1055 893 +1055ZM100 731Q100 931 200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM209 731Q209 559 295 410T530 175T852 88Q1024 88 1173 174T1408 409T1495 731Q1495 903 1409 +1052T1174 1287T852 1374Q680 1374 531 1288T296 1053T209 731Z" /> +<glyph unicode="&#xaa;" horiz-adv-x="731" d="M535 797L510 883Q416 784 276 784Q179 784 123 834T66 987Q66 1090 145 1143T389 1202L504 1206V1251Q504 1312 465 1342T358 1372Q258 1372 152 1319Q126 1381 106 1419Q228 1479 362 1479Q496 1479 563 1424T631 +1247V797H535ZM197 987Q197 889 307 889Q504 889 504 1067V1114L406 1110Q295 1106 246 1078T197 987Z" /> +<glyph unicode="&#xab;" horiz-adv-x="1042" d="M82 553L426 965L555 891L268 541L555 190L426 115L82 526V553ZM487 553L836 965L963 891L676 541L963 190L836 115L487 526V553Z" /> +<glyph unicode="&#xac;" horiz-adv-x="1171" d="M1065 795V262H920V649H102V795H1065Z" /> +<glyph unicode="&#xad;" horiz-adv-x="659" d="M82 469V629H578V469H82Z" /> +<glyph unicode="&#xae;" horiz-adv-x="1704" d="M727 764H829Q910 764 954 804T999 909Q999 982 958 1014T827 1047H727V764ZM1157 913Q1157 830 1114 770T997 680L1235 283H1059L854 637H727V283H571V1178H834Q1002 1178 1079 1113T1157 913ZM100 731Q100 931 +200 1106T475 1382T852 1483Q1052 1483 1227 1383T1503 1108T1604 731Q1604 534 1507 361T1235 84T852 -20Q645 -20 470 83T198 360T100 731ZM209 731Q209 559 295 410T530 175T852 88Q1024 88 1173 174T1408 409T1495 731Q1495 903 1409 1052T1174 1287T852 1374Q680 +1374 531 1288T296 1053T209 731Z" /> +<glyph unicode="&#xaf;" horiz-adv-x="696" d="M100 524V692H596V524H100Z" /> +<glyph unicode="&#xb0;" horiz-adv-x="877" d="M123 1167Q123 1302 215 1392T438 1483Q571 1483 662 1391T754 1167Q754 1036 662 945T438 854Q308 854 216 943T123 1167ZM246 1167Q246 1088 303 1032T440 975Q521 975 576 1032T631 1167Q631 1247 576 1303T440 +1360Q360 1360 303 1304T246 1167Z" /> +<glyph unicode="&#xb1;" horiz-adv-x="1171" d="M657 801H1065V655H657V233H510V655H102V801H510V1225H657V801ZM102 0V145H1065V0H102Z" /> +<glyph unicode="&#xb2;" horiz-adv-x="717" d="M627 586H49V696L285 926Q412 1049 447 1105T483 1231Q483 1296 446 1329T346 1362Q284 1362 234 1338T131 1274L59 1368Q192 1481 348 1481Q480 1481 554 1416T629 1239Q629 1193 617 1154T578 1074T511 987T227 +713H627V586Z" /> +<glyph unicode="&#xb3;" horiz-adv-x="717" d="M631 1255Q631 1104 479 1047Q657 1003 657 838Q657 711 565 640T303 569Q151 569 35 627V756Q177 686 305 686Q510 686 510 842Q510 983 285 983H168V1096H285Q388 1096 435 1135T483 1239Q483 1298 445 1331T340 +1364Q236 1364 113 1286L39 1380Q113 1435 185 1458T338 1481Q474 1481 552 1421T631 1255Z" /> +<glyph unicode="&#xb4;" horiz-adv-x="1188" d="M387 1266Q425 1314 483 1402T582 1569H799V1548Q755 1484 662 1387T506 1241H387V1266Z" /> +<glyph unicode="&#xb5;" horiz-adv-x="1276" d="M354 389Q354 129 600 129Q769 129 845 222T922 526V1098H1102V0H956L928 147H918Q809 -20 588 -20Q442 -20 352 72H344Q354 -2 354 -172V-492H174V1098H354V389Z" /> +<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1124 -260H1006V1442H797V-260H678V559Q616 541 532 541Q316 541 215 666T113 1042Q113 1302 222 1429T563 1556H1124V-260Z" /> +<glyph unicode="&#xb7;" horiz-adv-x="549" d="M147 723Q147 788 179 825T272 862Q334 862 367 825T401 723Q401 659 367 622T272 584Q213 584 180 621T147 723Z" /> +<glyph unicode="&#xb8;" horiz-adv-x="461" d="M434 -285Q434 -384 359 -438T131 -492Q66 -492 29 -481V-369Q65 -379 137 -379Q212 -379 250 -360T289 -289Q289 -200 102 -176L190 0H309L256 -109Q434 -147 434 -285Z" /> +<glyph unicode="&#xb9;" horiz-adv-x="717" d="M342 1462H492V586H346V1151Q346 1218 354 1333Q323 1305 300 1286T147 1174L76 1274L342 1462Z" /> +<glyph unicode="&#xba;" horiz-adv-x="770" d="M707 1133Q707 970 621 877T383 784Q238 784 152 876T66 1133Q66 1298 150 1388T387 1479Q536 1479 621 1388T707 1133ZM195 1133Q195 1012 239 953T385 893Q485 893 530 952T575 1133Q575 1254 530 1312T385 1370Q285 +1370 240 1312T195 1133Z" /> +<glyph unicode="&#xbb;" horiz-adv-x="1042" d="M961 526L612 115L485 190L772 541L485 891L612 965L961 553V526ZM553 526L207 115L80 190L367 541L80 891L207 965L553 553V526Z" /> +<glyph unicode="&#xbc;" horiz-adv-x="1618" d="M1304 1462L411 0H258L1151 1462H1304ZM593 1462H743V586H597V1151Q597 1218 605 1333Q574 1305 551 1286T398 1174L327 1274L593 1462ZM1507 197H1382V1H1229V197H829V304L1233 883H1382V320H1507V197ZM1229 320V511Q1229 +618 1235 718Q1227 700 1137 560L973 320H1229Z" /> +<glyph unicode="&#xbd;" horiz-adv-x="1618" d="M1243 1462L350 0H197L1090 1462H1243ZM568 1462H718V586H572V1151Q572 1218 580 1333Q549 1305 526 1286T373 1174L302 1274L568 1462ZM1489 1H911V111L1147 341Q1274 464 1309 520T1345 646Q1345 711 1308 744T1208 +777Q1146 777 1096 753T993 689L921 783Q1054 896 1210 896Q1342 896 1416 831T1491 654Q1491 608 1479 569T1440 489T1373 402T1089 128H1489V1Z" /> +<glyph unicode="&#xbe;" horiz-adv-x="1618" d="M1394 1462L501 0H348L1241 1462H1394ZM1581 197H1456V1H1303V197H903V304L1307 883H1456V320H1581V197ZM1303 320V511Q1303 618 1309 718Q1301 700 1211 560L1047 320H1303ZM884 1255Q884 1104 732 1047Q910 1003 +910 838Q910 711 818 640T556 569Q404 569 288 627V756Q430 686 558 686Q763 686 763 842Q763 983 538 983H421V1096H538Q641 1096 688 1135T736 1239Q736 1298 698 1331T593 1364Q489 1364 366 1286L292 1380Q366 1435 438 1458T591 1481Q727 1481 805 1421T884 +1255Z" /> +<glyph unicode="&#xbf;" horiz-adv-x="889" d="M602 676V623Q602 506 565 431T428 272Q295 161 260 106T225 -33Q225 -129 288 -183T471 -238Q630 -238 801 -150L864 -295Q666 -393 465 -393Q271 -393 161 -300T51 -37Q51 36 71 92T132 200T293 354Q396 444 426 +499T457 643V676H602ZM649 979Q649 842 522 842Q460 842 429 877T397 979Q397 1052 433 1085T522 1118Q576 1118 612 1085T649 979Z" /> +<glyph unicode="&#xc0;" horiz-adv-x="1309" d="M1116 0L940 453H360L186 0H0L571 1468H737L1307 0H1116ZM885 616L721 1059L651 1278Q621 1158 588 1059L422 616H885ZM745 1579H624Q549 1639 460 1734T333 1886V1907H548Q580 1841 639 1750T745 1604V1579Z" /> +<glyph unicode="&#xc1;" horiz-adv-x="1309" d="M1116 0L940 453H360L186 0H0L571 1468H737L1307 0H1116ZM885 616L721 1059L651 1278Q621 1158 588 1059L422 616H885ZM526 1604Q564 1652 622 1740T721 1907H938V1886Q894 1822 801 1725T645 1579H526V1604Z" /> +<glyph unicode="&#xc2;" horiz-adv-x="1309" d="M1116 0L940 453H360L186 0H0L571 1468H737L1307 0H1116ZM885 616L721 1059L651 1278Q621 1158 588 1059L422 616H885ZM299 1602Q424 1736 475 1800T551 1907H735Q787 1806 991 1602V1579H864Q774 1632 641 1763Q510 +1635 422 1579H299V1602Z" /> +<glyph unicode="&#xc3;" horiz-adv-x="1309" d="M1116 0L940 453H360L186 0H0L571 1468H737L1307 0H1116ZM885 616L721 1059L651 1278Q621 1158 588 1059L422 616H885ZM798 1581Q755 1581 714 1599T634 1639T558 1679T487 1698Q438 1698 413 1669T374 1579H270Q282 +1701 340 1771T495 1841Q540 1841 582 1823T664 1783T739 1743T807 1724Q855 1724 879 1753T919 1843H1022Q1010 1724 952 1653T798 1581Z" /> +<glyph unicode="&#xc4;" horiz-adv-x="1309" d="M1116 0L940 453H360L186 0H0L571 1468H737L1307 0H1116ZM885 616L721 1059L651 1278Q621 1158 588 1059L422 616H885ZM362 1733Q362 1786 390 1809T458 1833Q497 1833 526 1810T555 1733Q555 1680 526 1655T458 +1630Q418 1630 390 1655T362 1733ZM747 1733Q747 1786 775 1809T841 1833Q880 1833 909 1810T938 1733Q938 1680 909 1655T841 1630Q803 1630 775 1655T747 1733Z" /> +<glyph unicode="&#xc5;" horiz-adv-x="1309" d="M877 1585Q877 1516 847 1467T766 1393L1307 0H1116L940 453H360L186 0H0L539 1386Q486 1411 456 1461T426 1583Q426 1681 486 1739T649 1798Q751 1798 814 1739T877 1585ZM885 616L721 1059L651 1278Q621 1158 +588 1059L422 616H885ZM764 1583Q764 1637 732 1667T649 1698Q600 1698 568 1668T535 1583Q535 1529 564 1499T649 1468Q700 1468 732 1498T764 1583Z" /> +<glyph unicode="&#xc6;" horiz-adv-x="1804" d="M1681 0H920V453H408L188 0H-2L692 1462H1681V1300H1104V844H1642V684H1104V162H1681V0ZM479 616H920V1298H801L479 616Z" /> +<glyph unicode="&#xc7;" horiz-adv-x="1294" d="M825 1321Q589 1321 454 1163T319 731Q319 448 450 295T823 141Q979 141 1174 199V39Q1081 5 995 -7T797 -20Q474 -20 300 176T125 733Q125 959 208 1129T451 1391T827 1483Q1059 1483 1231 1397L1157 1241Q982 +1321 825 1321ZM950 -285Q950 -384 875 -438T647 -492Q582 -492 545 -481V-369Q581 -379 653 -379Q728 -379 766 -360T805 -289Q805 -200 618 -176L706 0H825L772 -109Q950 -147 950 -285Z" /> +<glyph unicode="&#xc8;" horiz-adv-x="1139" d="M1016 0H199V1462H1016V1300H383V844H979V684H383V162H1016V0ZM726 1579H605Q530 1639 441 1734T314 1886V1907H529Q561 1841 620 1750T726 1604V1579Z" /> +<glyph unicode="&#xc9;" horiz-adv-x="1139" d="M1016 0H199V1462H1016V1300H383V844H979V684H383V162H1016V0ZM453 1604Q491 1652 549 1740T648 1907H865V1886Q821 1822 728 1725T572 1579H453V1604Z" /> +<glyph unicode="&#xca;" horiz-adv-x="1139" d="M1016 0H199V1462H1016V1300H383V844H979V684H383V162H1016V0ZM255 1602Q380 1736 431 1800T507 1907H691Q743 1806 947 1602V1579H820Q730 1632 597 1763Q466 1635 378 1579H255V1602Z" /> +<glyph unicode="&#xcb;" horiz-adv-x="1139" d="M1016 0H199V1462H1016V1300H383V844H979V684H383V162H1016V0ZM319 1733Q319 1786 347 1809T415 1833Q454 1833 483 1810T512 1733Q512 1680 483 1655T415 1630Q375 1630 347 1655T319 1733ZM704 1733Q704 1786 +732 1809T798 1833Q837 1833 866 1810T895 1733Q895 1680 866 1655T798 1630Q760 1630 732 1655T704 1733Z" /> +<glyph unicode="&#xcc;" horiz-adv-x="694" d="M610 0H82V106L254 145V1315L82 1356V1462H610V1356L438 1315V145L610 106V0ZM472 1579H351Q276 1639 187 1734T60 1886V1907H275Q307 1841 366 1750T472 1604V1579Z" /> +<glyph unicode="&#xcd;" horiz-adv-x="694" d="M610 0H82V106L254 145V1315L82 1356V1462H610V1356L438 1315V145L610 106V0ZM236 1604Q274 1652 332 1740T431 1907H648V1886Q604 1822 511 1725T355 1579H236V1604Z" /> +<glyph unicode="&#xce;" horiz-adv-x="694" d="M610 0H82V106L254 145V1315L82 1356V1462H610V1356L438 1315V145L610 106V0ZM-3 1602Q122 1736 173 1800T249 1907H433Q485 1806 689 1602V1579H562Q472 1632 339 1763Q208 1635 120 1579H-3V1602Z" /> +<glyph unicode="&#xcf;" horiz-adv-x="694" d="M610 0H82V106L254 145V1315L82 1356V1462H610V1356L438 1315V145L610 106V0ZM60 1733Q60 1786 88 1809T156 1833Q195 1833 224 1810T253 1733Q253 1680 224 1655T156 1630Q116 1630 88 1655T60 1733ZM445 1733Q445 +1786 473 1809T539 1833Q578 1833 607 1810T636 1733Q636 1680 607 1655T539 1630Q501 1630 473 1655T445 1733Z" /> +<glyph unicode="&#xd0;" horiz-adv-x="1495" d="M1370 745Q1370 386 1174 193T604 0H213V643H61V803H213V1462H649Q990 1462 1180 1274T1370 745ZM1176 739Q1176 1019 1037 1162T623 1305H397V803H762V643H397V158H582Q1176 158 1176 739Z" /> +<glyph unicode="&#xd1;" horiz-adv-x="1556" d="M1358 0H1143L360 1214H352L357 1133Q369 951 369 817V0H199V1462H412L457 1391L937 649L1192 252H1200Q1198 276 1192 423T1186 637V1462H1358V0ZM940 1581Q897 1581 856 1599T776 1639T700 1679T629 1698Q580 +1698 555 1669T516 1579H412Q424 1701 482 1771T637 1841Q682 1841 724 1823T806 1783T881 1743T949 1724Q997 1724 1021 1753T1061 1843H1164Q1152 1724 1094 1653T940 1581Z" /> +<glyph unicode="&#xd2;" horiz-adv-x="1599" d="M1475 733Q1475 382 1298 181T801 -20Q478 -20 302 177T125 735Q125 1092 300 1288T803 1485Q1121 1485 1298 1286T1475 733ZM319 733Q319 443 442 291T801 139Q1036 139 1158 289T1280 733Q1280 1026 1159 1174T803 +1323Q565 1323 442 1173T319 733ZM918 1579H797Q722 1639 633 1734T506 1886V1907H721Q753 1841 812 1750T918 1604V1579Z" /> +<glyph unicode="&#xd3;" horiz-adv-x="1599" d="M1475 733Q1475 382 1298 181T801 -20Q478 -20 302 177T125 735Q125 1092 300 1288T803 1485Q1121 1485 1298 1286T1475 733ZM319 733Q319 443 442 291T801 139Q1036 139 1158 289T1280 733Q1280 1026 1159 1174T803 +1323Q565 1323 442 1173T319 733ZM657 1604Q695 1652 753 1740T852 1907H1069V1886Q1025 1822 932 1725T776 1579H657V1604Z" /> +<glyph unicode="&#xd4;" horiz-adv-x="1599" d="M1475 733Q1475 382 1298 181T801 -20Q478 -20 302 177T125 735Q125 1092 300 1288T803 1485Q1121 1485 1298 1286T1475 733ZM319 733Q319 443 442 291T801 139Q1036 139 1158 289T1280 733Q1280 1026 1159 1174T803 +1323Q565 1323 442 1173T319 733ZM440 1602Q565 1736 616 1800T692 1907H876Q928 1806 1132 1602V1579H1005Q915 1632 782 1763Q651 1635 563 1579H440V1602Z" /> +<glyph unicode="&#xd5;" horiz-adv-x="1599" d="M1475 733Q1475 382 1298 181T801 -20Q478 -20 302 177T125 735Q125 1092 300 1288T803 1485Q1121 1485 1298 1286T1475 733ZM319 733Q319 443 442 291T801 139Q1036 139 1158 289T1280 733Q1280 1026 1159 1174T803 +1323Q565 1323 442 1173T319 733ZM944 1581Q901 1581 860 1599T780 1639T704 1679T633 1698Q584 1698 559 1669T520 1579H416Q428 1701 486 1771T641 1841Q686 1841 728 1823T810 1783T885 1743T953 1724Q1001 1724 1025 1753T1065 1843H1168Q1156 1724 1098 1653T944 +1581Z" /> +<glyph unicode="&#xd6;" horiz-adv-x="1599" d="M1475 733Q1475 382 1298 181T801 -20Q478 -20 302 177T125 735Q125 1092 300 1288T803 1485Q1121 1485 1298 1286T1475 733ZM319 733Q319 443 442 291T801 139Q1036 139 1158 289T1280 733Q1280 1026 1159 1174T803 +1323Q565 1323 442 1173T319 733ZM516 1733Q516 1786 544 1809T612 1833Q651 1833 680 1810T709 1733Q709 1680 680 1655T612 1630Q572 1630 544 1655T516 1733ZM901 1733Q901 1786 929 1809T995 1833Q1034 1833 1063 1810T1092 1733Q1092 1680 1063 1655T995 1630Q957 +1630 929 1655T901 1733Z" /> +<glyph unicode="&#xd7;" horiz-adv-x="1128" d="M459 658L141 977L246 1082L563 764L885 1082L989 979L668 658L987 338L885 236L563 553L246 238L143 341L459 658Z" /> +<glyph unicode="&#xd8;" horiz-adv-x="1599" d="M1475 733Q1475 382 1298 181T801 -20Q569 -20 422 76L324 -63L199 18L305 170Q125 368 125 735Q125 1092 300 1288T803 1485Q1007 1485 1167 1393L1262 1528L1386 1444L1282 1298Q1475 1095 1475 733ZM1280 733Q1280 +997 1176 1147L520 217Q634 139 801 139Q1036 139 1158 289T1280 733ZM319 733Q319 474 416 328L1069 1251Q960 1323 803 1323Q565 1323 442 1173T319 733Z" /> +<glyph unicode="&#xd9;" horiz-adv-x="1497" d="M1311 1462V516Q1311 266 1160 123T741 -20Q476 -20 330 124T184 520V1462H369V514Q369 335 464 237T752 139Q933 139 1030 236T1128 516V1462H1311ZM865 1579H744Q669 1639 580 1734T453 1886V1907H668Q700 1841 +759 1750T865 1604V1579Z" /> +<glyph unicode="&#xda;" horiz-adv-x="1497" d="M1311 1462V516Q1311 266 1160 123T741 -20Q476 -20 330 124T184 520V1462H369V514Q369 335 464 237T752 139Q933 139 1030 236T1128 516V1462H1311ZM600 1604Q638 1652 696 1740T795 1907H1012V1886Q968 1822 875 +1725T719 1579H600V1604Z" /> +<glyph unicode="&#xdb;" horiz-adv-x="1497" d="M1311 1462V516Q1311 266 1160 123T741 -20Q476 -20 330 124T184 520V1462H369V514Q369 335 464 237T752 139Q933 139 1030 236T1128 516V1462H1311ZM387 1602Q512 1736 563 1800T639 1907H823Q875 1806 1079 1602V1579H952Q862 +1632 729 1763Q598 1635 510 1579H387V1602Z" /> +<glyph unicode="&#xdc;" horiz-adv-x="1497" d="M1311 1462V516Q1311 266 1160 123T741 -20Q476 -20 330 124T184 520V1462H369V514Q369 335 464 237T752 139Q933 139 1030 236T1128 516V1462H1311ZM457 1733Q457 1786 485 1809T553 1833Q592 1833 621 1810T650 +1733Q650 1680 621 1655T553 1630Q513 1630 485 1655T457 1733ZM842 1733Q842 1786 870 1809T936 1833Q975 1833 1004 1810T1033 1733Q1033 1680 1004 1655T936 1630Q898 1630 870 1655T842 1733Z" /> +<glyph unicode="&#xdd;" horiz-adv-x="1159" d="M580 743L961 1462H1159L672 567V0H487V559L0 1462H201L580 743ZM442 1604Q480 1652 538 1740T637 1907H854V1886Q810 1822 717 1725T561 1579H442V1604Z" /> +<glyph unicode="&#xde;" horiz-adv-x="1239" d="M1135 782Q1135 556 985 437T549 317H383V0H199V1462H383V1208H580Q861 1208 998 1103T1135 782ZM383 473H530Q751 473 847 544T944 772Q944 916 853 983T565 1051H383V473Z" /> +<glyph unicode="&#xdf;" horiz-adv-x="1292" d="M1069 1264Q1069 1125 926 1013Q847 951 815 915T782 844Q782 804 814 771T963 662Q1100 570 1150 492T1200 313Q1200 152 1102 66T819 -20Q632 -20 522 49V211Q586 171 665 148T813 125Q1024 125 1024 301Q1024 +372 984 424T831 547Q713 622 661 684T608 834Q608 897 642 949T748 1055Q822 1110 854 1156T887 1253Q887 1331 821 1374T627 1417Q354 1417 354 1196V0H174V1196Q174 1377 288 1472T627 1567Q837 1567 953 1487T1069 1264Z" /> +<glyph unicode="&#xe0;" horiz-adv-x="1149" d="M852 0L817 156H809Q727 53 646 17T440 -20Q278 -20 186 65T94 305Q94 639 621 655L807 662V727Q807 852 753 911T580 971Q493 971 416 945T270 887L215 1022Q298 1066 396 1091T590 1116Q789 1116 886 1028T983 +748V0H852ZM481 125Q632 125 718 206T805 438V537L643 530Q454 523 368 470T281 303Q281 217 333 171T481 125ZM943 1241H822Q747 1301 658 1396T531 1548V1569H746Q778 1503 837 1412T943 1266V1241Z" /> +<glyph unicode="&#xe1;" horiz-adv-x="1149" d="M852 0L817 156H809Q727 53 646 17T440 -20Q278 -20 186 65T94 305Q94 639 621 655L807 662V727Q807 852 753 911T580 971Q493 971 416 945T270 887L215 1022Q298 1066 396 1091T590 1116Q789 1116 886 1028T983 +748V0H852ZM481 125Q632 125 718 206T805 438V537L643 530Q454 523 368 470T281 303Q281 217 333 171T481 125ZM436 1266Q474 1314 532 1402T631 1569H848V1548Q804 1484 711 1387T555 1241H436V1266Z" /> +<glyph unicode="&#xe2;" horiz-adv-x="1149" d="M852 0L817 156H809Q727 53 646 17T440 -20Q278 -20 186 65T94 305Q94 639 621 655L807 662V727Q807 852 753 911T580 971Q493 971 416 945T270 887L215 1022Q298 1066 396 1091T590 1116Q789 1116 886 1028T983 +748V0H852ZM481 125Q632 125 718 206T805 438V537L643 530Q454 523 368 470T281 303Q281 217 333 171T481 125ZM480 1264Q605 1398 656 1462T732 1569H916Q968 1468 1172 1264V1241H1045Q955 1294 822 1425Q691 1297 603 1241H480V1264Z" /> +<glyph unicode="&#xe3;" horiz-adv-x="1149" d="M852 0L817 156H809Q727 53 646 17T440 -20Q278 -20 186 65T94 305Q94 639 621 655L807 662V727Q807 852 753 911T580 971Q493 971 416 945T270 887L215 1022Q298 1066 396 1091T590 1116Q789 1116 886 1028T983 +748V0H852ZM481 125Q632 125 718 206T805 438V537L643 530Q454 523 368 470T281 303Q281 217 333 171T481 125ZM984 1243Q941 1243 900 1261T820 1301T744 1341T673 1360Q624 1360 599 1331T560 1241H456Q468 1363 526 1433T681 1503Q726 1503 768 1485T850 1445T925 +1405T993 1386Q1041 1386 1065 1415T1105 1505H1208Q1196 1386 1138 1315T984 1243Z" /> +<glyph unicode="&#xe4;" horiz-adv-x="1149" d="M852 0L817 156H809Q727 53 646 17T440 -20Q278 -20 186 65T94 305Q94 639 621 655L807 662V727Q807 852 753 911T580 971Q493 971 416 945T270 887L215 1022Q298 1066 396 1091T590 1116Q789 1116 886 1028T983 +748V0H852ZM481 125Q632 125 718 206T805 438V537L643 530Q454 523 368 470T281 303Q281 217 333 171T481 125ZM535 1395Q535 1448 563 1471T631 1495Q670 1495 699 1472T728 1395Q728 1342 699 1317T631 1292Q591 1292 563 1317T535 1395ZM920 1395Q920 1448 948 +1471T1014 1495Q1053 1495 1082 1472T1111 1395Q1111 1342 1082 1317T1014 1292Q976 1292 948 1317T920 1395Z" /> +<glyph unicode="&#xe5;" horiz-adv-x="1149" d="M852 0L817 156H809Q727 53 646 17T440 -20Q278 -20 186 65T94 305Q94 639 621 655L807 662V727Q807 852 753 911T580 971Q493 971 416 945T270 887L215 1022Q298 1066 396 1091T590 1116Q789 1116 886 1028T983 +748V0H852ZM481 125Q632 125 718 206T805 438V537L643 530Q454 523 368 470T281 303Q281 217 333 171T481 125ZM1068 1460Q1068 1359 1006 1300T841 1241Q738 1241 678 1299T618 1458Q618 1556 678 1614T841 1673Q942 1673 1005 1614T1068 1460ZM955 1458Q955 1512 +923 1542T841 1573Q791 1573 759 1543T726 1458Q726 1404 755 1374T841 1343Q892 1343 923 1373T955 1458Z" /> +<glyph unicode="&#xe6;" horiz-adv-x="1769" d="M94 305Q94 639 594 655L778 662V731Q778 853 722 912T549 971Q410 971 242 887L186 1022Q257 1062 358 1089T563 1116Q691 1116 773 1075T899 940Q953 1025 1038 1071T1235 1118Q1432 1118 1548 983T1665 627V516H963Q971 +133 1280 133Q1368 133 1445 149T1616 209V51Q1528 12 1452 -4T1274 -20Q983 -20 858 211Q776 87 677 34T442 -20Q278 -20 186 65T94 305ZM281 303Q281 211 333 168T471 125Q611 125 692 206T774 438V537L621 530Q444 523 363 470T281 303ZM1233 971Q1114 971 1046 +891T967 657H1475Q1475 809 1413 890T1233 971Z" /> +<glyph unicode="&#xe7;" horiz-adv-x="983" d="M614 -20Q377 -20 245 125T113 543Q113 819 246 968T627 1118Q707 1118 785 1102T915 1059L860 909Q721 961 623 961Q457 961 378 857T299 545Q299 346 378 241T612 135Q757 135 897 199V39Q783 -20 614 -20ZM766 +-285Q766 -384 691 -438T463 -492Q398 -492 361 -481V-369Q397 -379 469 -379Q544 -379 582 -360T621 -289Q621 -200 434 -176L522 0H641L588 -109Q766 -147 766 -285Z" /> +<glyph unicode="&#xe8;" horiz-adv-x="1155" d="M641 -20Q394 -20 254 129T113 541Q113 805 244 961T598 1118Q805 1118 928 985T1051 623V514H299Q304 327 394 230T649 133Q737 133 816 148T1001 209V51Q910 12 830 -4T641 -20ZM596 971Q467 971 392 888T303 +657H862Q860 811 791 891T596 971ZM980 1241H859Q784 1301 695 1396T568 1548V1569H783Q815 1503 874 1412T980 1266V1241Z" /> +<glyph unicode="&#xe9;" horiz-adv-x="1155" d="M641 -20Q394 -20 254 129T113 541Q113 805 244 961T598 1118Q805 1118 928 985T1051 623V514H299Q304 327 394 230T649 133Q737 133 816 148T1001 209V51Q910 12 830 -4T641 -20ZM596 971Q467 971 392 888T303 +657H862Q860 811 791 891T596 971ZM467 1266Q505 1314 563 1402T662 1569H879V1548Q835 1484 742 1387T586 1241H467V1266Z" /> +<glyph unicode="&#xea;" horiz-adv-x="1155" d="M641 -20Q394 -20 254 129T113 541Q113 805 244 961T598 1118Q805 1118 928 985T1051 623V514H299Q304 327 394 230T649 133Q737 133 816 148T1001 209V51Q910 12 830 -4T641 -20ZM596 971Q467 971 392 888T303 +657H862Q860 811 791 891T596 971ZM509 1264Q634 1398 685 1462T761 1569H945Q997 1468 1201 1264V1241H1074Q984 1294 851 1425Q720 1297 632 1241H509V1264Z" /> +<glyph unicode="&#xeb;" horiz-adv-x="1155" d="M641 -20Q394 -20 254 129T113 541Q113 805 244 961T598 1118Q805 1118 928 985T1051 623V514H299Q304 327 394 230T649 133Q737 133 816 148T1001 209V51Q910 12 830 -4T641 -20ZM596 971Q467 971 392 888T303 +657H862Q860 811 791 891T596 971ZM315 1395Q315 1448 343 1471T411 1495Q450 1495 479 1472T508 1395Q508 1342 479 1317T411 1292Q371 1292 343 1317T315 1395ZM700 1395Q700 1448 728 1471T794 1495Q833 1495 862 1472T891 1395Q891 1342 862 1317T794 1292Q756 +1292 728 1317T700 1395Z" /> +<glyph unicode="&#xec;" horiz-adv-x="528" d="M354 0H174V1098H354V0ZM368 1241H247Q172 1301 83 1396T-44 1548V1569H171Q203 1503 262 1412T368 1266V1241Z" /> +<glyph unicode="&#xed;" horiz-adv-x="528" d="M354 0H174V1098H354V0ZM167 1266Q205 1314 263 1402T362 1569H579V1548Q535 1484 442 1387T286 1241H167V1266Z" /> +<glyph unicode="&#xee;" horiz-adv-x="528" d="M354 0H174V1098H354V0ZM-81 1264Q44 1398 95 1462T171 1569H355Q407 1468 611 1264V1241H484Q394 1294 261 1425Q130 1297 42 1241H-81V1264Z" /> +<glyph unicode="&#xef;" horiz-adv-x="528" d="M354 0H174V1098H354V0ZM-22 1395Q-22 1448 6 1471T74 1495Q113 1495 142 1472T171 1395Q171 1342 142 1317T74 1292Q34 1292 6 1317T-22 1395ZM363 1395Q363 1448 391 1471T457 1495Q496 1495 525 1472T554 1395Q554 +1342 525 1317T457 1292Q419 1292 391 1317T363 1395Z" /> +<glyph unicode="&#xf0;" horiz-adv-x="1239" d="M1128 563Q1128 281 995 131T616 -20Q391 -20 252 115T113 477Q113 706 242 837T594 969Q819 969 913 850L922 854Q863 1068 668 1245L401 1092L324 1204L553 1335Q467 1393 369 1444L442 1567Q598 1494 700 1419L936 +1556L1014 1446L811 1329Q962 1189 1045 992T1128 563ZM946 514Q946 657 859 740T621 823Q455 823 375 737T295 471Q295 306 379 217T621 127Q790 127 868 226T946 514Z" /> +<glyph unicode="&#xf1;" horiz-adv-x="1266" d="M922 0V702Q922 836 863 901T676 967Q507 967 431 874T354 569V0H174V1098H319L346 948H356Q407 1029 499 1073T702 1118Q904 1118 1002 1020T1100 715V0H922ZM802 1243Q759 1243 718 1261T638 1301T562 1341T491 +1360Q442 1360 417 1331T378 1241H274Q286 1363 344 1433T499 1503Q544 1503 586 1485T668 1445T743 1405T811 1386Q859 1386 883 1415T923 1505H1026Q1014 1386 956 1315T802 1243Z" /> +<glyph unicode="&#xf2;" horiz-adv-x="1239" d="M1128 551Q1128 282 992 131T616 -20Q467 -20 352 49T175 249T113 551Q113 819 247 968T623 1118Q855 1118 991 966T1128 551ZM299 551Q299 344 380 237T621 129Q778 129 860 236T942 551Q942 758 860 862T618 967Q299 +967 299 551ZM1007 1241H886Q811 1301 722 1396T595 1548V1569H810Q842 1503 901 1412T1007 1266V1241Z" /> +<glyph unicode="&#xf3;" horiz-adv-x="1239" d="M1128 551Q1128 282 992 131T616 -20Q467 -20 352 49T175 249T113 551Q113 819 247 968T623 1118Q855 1118 991 966T1128 551ZM299 551Q299 344 380 237T621 129Q778 129 860 236T942 551Q942 758 860 862T618 967Q299 +967 299 551ZM477 1266Q515 1314 573 1402T672 1569H889V1548Q845 1484 752 1387T596 1241H477V1266Z" /> +<glyph unicode="&#xf4;" horiz-adv-x="1239" d="M1128 551Q1128 282 992 131T616 -20Q467 -20 352 49T175 249T113 551Q113 819 247 968T623 1118Q855 1118 991 966T1128 551ZM299 551Q299 344 380 237T621 129Q778 129 860 236T942 551Q942 758 860 862T618 967Q299 +967 299 551ZM272 1264Q397 1398 448 1462T524 1569H708Q760 1468 964 1264V1241H837Q747 1294 614 1425Q483 1297 395 1241H272V1264Z" /> +<glyph unicode="&#xf5;" horiz-adv-x="1239" d="M1128 551Q1128 282 992 131T616 -20Q467 -20 352 49T175 249T113 551Q113 819 247 968T623 1118Q855 1118 991 966T1128 551ZM299 551Q299 344 380 237T621 129Q778 129 860 236T942 551Q942 758 860 862T618 967Q299 +967 299 551ZM1031 1243Q988 1243 947 1261T867 1301T791 1341T720 1360Q671 1360 646 1331T607 1241H503Q515 1363 573 1433T728 1503Q773 1503 815 1485T897 1445T972 1405T1040 1386Q1088 1386 1112 1415T1152 1505H1255Q1243 1386 1185 1315T1031 1243Z" /> +<glyph unicode="&#xf6;" horiz-adv-x="1239" d="M1128 551Q1128 282 992 131T616 -20Q467 -20 352 49T175 249T113 551Q113 819 247 968T623 1118Q855 1118 991 966T1128 551ZM299 551Q299 344 380 237T621 129Q778 129 860 236T942 551Q942 758 860 862T618 967Q299 +967 299 551ZM330 1395Q330 1448 358 1471T426 1495Q465 1495 494 1472T523 1395Q523 1342 494 1317T426 1292Q386 1292 358 1317T330 1395ZM715 1395Q715 1448 743 1471T809 1495Q848 1495 877 1472T906 1395Q906 1342 877 1317T809 1292Q771 1292 743 1317T715 +1395Z" /> +<glyph unicode="&#xf7;" horiz-adv-x="1128" d="M102 585V735H1026V585H102ZM449 320Q449 355 458 378T482 417T518 438T563 445Q586 445 607 439T644 417T669 379T678 320Q678 287 669 264T644 225T607 202T563 195Q539 195 519 202T483 224T458 263T449 320ZM449 +1018Q449 1053 458 1076T482 1115T518 1136T563 1143Q586 1143 607 1137T644 1115T669 1077T678 1018Q678 985 669 962T644 923T607 900T563 893Q539 893 519 900T483 922T458 961T449 1018Z" /> +<glyph unicode="&#xf8;" horiz-adv-x="1239" d="M1128 551Q1128 282 992 131T616 -20Q465 -20 352 47L270 -68L152 12L244 139Q113 295 113 551Q113 819 247 968T623 1118Q774 1118 891 1044L971 1159L1092 1081L999 952Q1128 797 1128 551ZM299 551Q299 385 348 +289L799 915Q726 967 618 967Q299 967 299 551ZM942 551Q942 703 895 803L444 176Q513 129 621 129Q778 129 860 236T942 551Z" /> +<glyph unicode="&#xf9;" horiz-adv-x="1266" d="M344 1098V391Q344 258 403 194T588 129Q757 129 834 223T911 526V1098H1092V0H944L918 145H909Q860 66 770 23T561 -20Q363 -20 263 75T162 379V1098H344ZM993 1241H872Q797 1301 708 1396T581 1548V1569H796Q828 +1503 887 1412T993 1266V1241Z" /> +<glyph unicode="&#xfa;" horiz-adv-x="1266" d="M344 1098V391Q344 258 403 194T588 129Q757 129 834 223T911 526V1098H1092V0H944L918 145H909Q860 66 770 23T561 -20Q363 -20 263 75T162 379V1098H344ZM504 1266Q542 1314 600 1402T699 1569H916V1548Q872 1484 +779 1387T623 1241H504V1266Z" /> +<glyph unicode="&#xfb;" horiz-adv-x="1266" d="M344 1098V391Q344 258 403 194T588 129Q757 129 834 223T911 526V1098H1092V0H944L918 145H909Q860 66 770 23T561 -20Q363 -20 263 75T162 379V1098H344ZM280 1264Q405 1398 456 1462T532 1569H716Q768 1468 972 +1264V1241H845Q755 1294 622 1425Q491 1297 403 1241H280V1264Z" /> +<glyph unicode="&#xfc;" horiz-adv-x="1266" d="M344 1098V391Q344 258 403 194T588 129Q757 129 834 223T911 526V1098H1092V0H944L918 145H909Q860 66 770 23T561 -20Q363 -20 263 75T162 379V1098H344ZM338 1395Q338 1448 366 1471T434 1495Q473 1495 502 1472T531 +1395Q531 1342 502 1317T434 1292Q394 1292 366 1317T338 1395ZM723 1395Q723 1448 751 1471T817 1495Q856 1495 885 1472T914 1395Q914 1342 885 1317T817 1292Q779 1292 751 1317T723 1395Z" /> +<glyph unicode="&#xfd;" horiz-adv-x="1044" d="M2 1098H195L432 473Q507 269 524 174H532Q541 211 573 312T627 475L850 1098H1044L571 -152Q502 -334 407 -413T172 -492Q97 -492 23 -475V-332Q73 -344 143 -344Q229 -344 289 -297T387 -150L444 -4L2 1098ZM410 +1266Q448 1314 506 1402T605 1569H822V1548Q778 1484 685 1387T529 1241H410V1266Z" /> +<glyph unicode="&#xfe;" horiz-adv-x="1260" d="M356 950Q423 1041 506 1079T696 1118Q909 1118 1028 969T1147 551Q1147 282 1028 131T696 -20Q474 -20 354 139H342Q354 7 354 -33V-492H174V1556H354V1098Q354 1028 348 950H356ZM666 967Q505 967 431 878T354 +590V551Q354 328 428 229T668 129Q961 129 961 553Q961 761 890 864T666 967Z" /> +<glyph unicode="&#xff;" horiz-adv-x="1044" d="M2 1098H195L432 473Q507 269 524 174H532Q541 211 573 312T627 475L850 1098H1044L571 -152Q502 -334 407 -413T172 -492Q97 -492 23 -475V-332Q73 -344 143 -344Q229 -344 289 -297T387 -150L444 -4L2 1098ZM490 +1395Q490 1448 518 1471T586 1495Q625 1495 654 1472T683 1395Q683 1342 654 1317T586 1292Q546 1292 518 1317T490 1395ZM875 1395Q875 1448 903 1471T969 1495Q1008 1495 1037 1472T1066 1395Q1066 1342 1037 1317T969 1292Q931 1292 903 1317T875 1395Z" /> +<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 535V703H942V535H82Z" /> +<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 535V703H1966V535H82Z" /> +<glyph unicode="&#x2018;" horiz-adv-x="639" d="M182 992L168 1014Q182 1068 201 1129T244 1252T293 1375T344 1493H481Q466 1432 452 1366T424 1235T400 1107T381 992H182Z" /> +<glyph unicode="&#x2019;" horiz-adv-x="638" d="M465 1493L479 1471Q465 1416 446 1356T403 1233T354 1109T303 992H166Q180 1052 194 1118T222 1250T247 1378T266 1493H465Z" /> +<glyph unicode="&#x201a;" horiz-adv-x="512" d="M358 238L373 215Q325 29 197 -264H63Q130 -5 166 238H358Z" /> +<glyph unicode="&#x201c;" horiz-adv-x="1023" d="M568 992L554 1014Q568 1068 587 1129T630 1252T679 1375T730 1493H867Q852 1432 838 1366T810 1235T786 1107T767 992H568ZM183 992L169 1014Q183 1068 202 1129T245 1252T294 1375T345 1493H482Q467 1432 453 +1366T425 1235T401 1107T382 992H183Z" /> +<glyph unicode="&#x201d;" horiz-adv-x="1023" d="M465 1493L479 1471Q465 1416 446 1356T403 1233T354 1109T303 992H166Q180 1052 194 1118T222 1250T247 1378T266 1493H465ZM850 1493L864 1471Q850 1416 831 1356T788 1233T739 1109T688 992H551Q565 1052 579 +1118T607 1250T632 1378T651 1493H850Z" /> +<glyph unicode="&#x201e;" horiz-adv-x="852" d="M322 238L336 215Q288 29 160 -264H27Q92 -14 129 238H322ZM700 238L715 215Q667 29 539 -264H403Q430 -160 461 -13T508 238H700Z" /> +<glyph unicode="&#x2022;" horiz-adv-x="770" d="M158 748Q158 870 216 935T385 1001Q495 1001 553 936T612 748Q612 626 553 560T385 494Q275 494 217 560T158 748Z" /> +<glyph unicode="&#x2039;" horiz-adv-x="635" d="M82 553L426 965L555 891L268 541L555 190L426 115L82 526V553Z" /> +<glyph unicode="&#x203a;" horiz-adv-x="635" d="M553 526L207 115L80 190L367 541L80 891L207 965L553 553V526Z" /> +</font> +</defs> +</svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf new file mode 100644 index 000000000000..a83bbf9fc893 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff new file mode 100644 index 000000000000..17c85006d0de Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 new file mode 100644 index 000000000000..a87d9cd7c612 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/img/logo.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/img/logo.png new file mode 100644 index 000000000000..93e608e4a41b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/img/logo.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/js/scale.fix.js b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/js/scale.fix.js new file mode 100644 index 000000000000..911d33c33066 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-minimal-0.1.1/assets/js/scale.fix.js @@ -0,0 +1,27 @@ +(function(document) { + var metas = document.getElementsByTagName('meta'), + changeViewportContent = function(content) { + for (var i = 0; i < metas.length; i++) { + if (metas[i].name == "viewport") { + metas[i].content = content; + } + } + }, + initialize = function() { + changeViewportContent("width=device-width, minimum-scale=1.0, maximum-scale=1.0"); + }, + gestureStart = function() { + changeViewportContent("width=device-width, minimum-scale=0.25, maximum-scale=1.6"); + }, + gestureEnd = function() { + initialize(); + }; + + + if (navigator.userAgent.match(/iPhone/i)) { + initialize(); + + document.addEventListener("touchstart", gestureStart, false); + document.addEventListener("touchend", gestureEnd, false); + } +})(document); diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/README.md new file mode 100644 index 000000000000..b6df93f2bc60 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Modernist theme + +[![Build Status](https://travis-ci.org/pages-themes/modernist.svg?branch=master)](https://travis-ci.org/pages-themes/modernist) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-modernist.svg)](https://badge.fury.io/rb/jekyll-theme-modernist) + +*Modernist is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/modernist), or even [use it today](#usage).* + +![Thumbnail of Modernist](thumbnail.png) + +## Usage + +To use the Modernist theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-modernist + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Modernist will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/modernist/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/modernist/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/modernist/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Modernist theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Modernist? We'd love your help. Modernist is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/modernist`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..65e530256180 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/_layouts/default.html @@ -0,0 +1,58 @@ +<!doctype html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + +{% seo %} + + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}"> + <script src="{{ '/assets/js/scale.fix.js' | relative_url }}"></script> + <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> + + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + </head> + <body> + <div class="wrapper"> + <header {% unless site.description or site.github.project_tagline %} class="without-description" {% endunless %}> + <h1>{{ site.title | default: site.github.repository_name }}</h1> + {% if site.description or site.github.project_tagline %} + <p>{{ site.description | default: site.github.project_tagline }}</p> + {% endif %} + <p class="view"><a href="{{ site.github.repository_url }}">View the Project on GitHub <small>{{ github_name }}</small></a></p> + <ul> + {% if site.show_downloads %} + <li><a href="{{ site.github.zip_url }}">Download <strong>ZIP File</strong></a></li> + <li><a href="{{ site.github.tar_url }}">Download <strong>TAR Ball</strong></a></li> + {% endif %} + <li><a href="{{ site.github.repository_url }}">View On <strong>GitHub</strong></a></li> + </ul> + </header> + <section> + + {{ content }} + + </section> + </div> + <footer> + {% if site.github.is_project_page %} + <p>Project maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p> + {% endif %} + <p>Hosted on GitHub Pages &mdash; Theme by <a href="https://github.com/orderedlist">orderedlist</a></p> + </footer> + <!--[if !IE]><script>fixScale(document);</script><![endif]--> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/_sass/jekyll-theme-modernist.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/_sass/jekyll-theme-modernist.scss new file mode 100644 index 000000000000..e98419687ab7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/_sass/jekyll-theme-modernist.scss @@ -0,0 +1,329 @@ +@import "rouge-base16-dark"; +@import url('https://fonts.googleapis.com/css?family=Lato:300italic,700italic,300,700'); + +html { + background:#6C7989; + background: #6C7989 linear_gradient(#6C7989, #434B55) fixed; +} + +body { + padding:50px 0; + margin:0; + font:14px/1.5 Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; + color:#555; + font-weight:300; + background:inline-image('checker.png') fixed; +} + +.wrapper { + width:640px; + margin:0 auto; + background:#DEDEDE; + border-radius: 8px; + box-shadow: rgba(#000, 0.2) 0 0 0 1px, rgba(#000, 0.45) 0 3px 10px; +} + +header, section, footer { + display:block; +} + +a { + color:#069; + text-decoration:none; +} + +p { + margin:0 0 20px; + padding:0; +} + +strong { + color:#222; + font-weight:700; +} + +header { + border-radius: 8px 8px 0 0; + background:#C6EAFA; + background: linear_gradient(#DDFBFC, #C6EAFA); + position:relative; + padding:15px 20px; + border-bottom:1px solid #B2D2E1; + + h1 { + margin:0; + padding:0; + font-size:24px; + line-height:1.2; + color:#069; + text-shadow:rgba(#fff, 0.9) 0 1px 0; + } + + &.without-description h1 { + margin:10px 0; + } + + p { + margin:0; + color:#61778B; + width:300px; + font-size:13px; + + &.view { + display:none; + font-weight:700; + text-shadow:rgba(#fff, 0.9) 0 1px 0; + -webkit-font-smoothing:antialiased; + + a { + color:#06c; + } + + small { + font-weight:400; + } + } + } + + ul { + margin:0; + padding:0; + list-style:none; + position:absolute; + z-index:1; + right:20px; + top:20px; + height:38px; + padding:1px 0; + background:#5198DF; + background: linear_gradient(#77B9FB, #3782CD); + border-radius:5px; + box-shadow: inset rgba(#fff, 0.45) 0 1px 0, inset rgba(#000, 0.2) 0 -1px 0; + width:auto; + + &:before { + content:''; + position:absolute; + z-index:-1; + left:-5px; + top:-4px; + right:-5px; + bottom:-6px; + background:rgba(#000, 0.1); + border-radius: 8px; + box-shadow: rgba(#000, 0.2) 0 -1px 0, inset rgba(#fff, 0.7) 0 -1px 0; + } + + li { + width:79px; + float:left; + border-right:1px solid #3A7CBE; + height:38px; + + &.single { + border:none; + } + } + + li + li { + width:78px; + border-left:1px solid #8BBEF3; + } + + li + li + li { + border-right:none; + width:79px; + } + + a { + line-height:1; + font-size:11px; + color:#fff; + color:rgba(#fff, 0.8); + display:block; + text-align:center; + font-weight:400; + padding-top:6px; + height:40px; + text-shadow:rgba(#000, 0.4) 0 -1px 0; + + strong { + font-size:14px; + display:block; + color:#fff; + -webkit-font-smoothing:antialiased; + } + } + } +} + +section { + padding:15px 20px; + font-size:15px; + border-top:1px solid #fff; + background: linear_gradient(#fafafa, #DEDEDE 700px); + border-radius: 0 0 8px 8px; + position:relative; +} + +h1, h2, h3, h4, h5, h6 { + color:#222; + padding:0; + margin:0 0 20px; + line-height:1.2; +} + +p, ul, ol, table, pre, dl { + margin:0 0 20px; +} + +h1, h2, h3 { + line-height:1.1; +} + +h1 { + font-size:28px; +} + +h2 { + color:#393939; +} + +h3, h4, h5, h6 { + color:#494949; +} + +blockquote { + margin:0 -20px 20px; + padding:15px 20px 1px 40px; + font-style:italic; + background:#ccc; + background:rgba(#000, 0.06); + color:#222; +} + +img { + max-width:100%; +} + +code, pre { + font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal; + color:#333; + font-size:12px; + overflow-x:auto; +} + +pre { + padding:20px; + background: #3A3C42; + color:#f8f8f2; + margin:0 -20px 20px; + + code { + color:#f8f8f2; + } + + li & { + margin-left:-60px; + padding-left:60px; + } +} + +table { + width:100%; + border-collapse:collapse; +} + +th, td { + text-align:left; + padding:5px 10px; + border-bottom:1px solid #aaa; +} + +dt { + color:#222; + font-weight:700; +} + +th { + color:#222; +} + +small { + font-size:11px; +} + +hr { + border:0; + background:#aaa; + height:1px; + margin:0 0 20px; +} + +footer { + width:640px; + margin:0 auto; + padding:20px 0 0; + color:#ccc; + overflow:hidden; + + a { + color:#fff; + font-weight:bold; + } + + p { + float:left; + } + + p + p { + float:right; + } +} + +@media print, screen and (max-width: 740px) { + body { + padding:0; + } + + .wrapper { + border-radius: 0; + box-shadow: none; + width:100%; + } + + footer { + border-radius: 0; + padding:20px; + width:auto; + + p { + float:none; + margin:0; + } + + p + p { + float:none; + } + } +} + +@media print, screen and (max-width:580px) { + header ul { + display:none; + } + + header p.view { + display:block; + } + + header p { + width:100%; + } +} + +@media print { + header p.view a small:before { + content:'at https://github.com/'; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/_sass/rouge-base16-dark.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/_sass/rouge-base16-dark.scss new file mode 100644 index 000000000000..c303bd5847d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/_sass/rouge-base16-dark.scss @@ -0,0 +1,81 @@ +/* + generated by rouge http://rouge.jneen.net/ + original base16 by Chris Kempson (https://github.com/chriskempson/base16) +*/ + +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight, .highlight .w { + color: #d0d0d0; +} +.highlight .err { + color: #151515; + background-color: #ac4142; +} +.highlight .c, .highlight .cd, .highlight .cm, .highlight .c1, .highlight .cs { + color: #888; +} +.highlight .cp { + color: #f4bf75; +} +.highlight .nt { + color: #f4bf75; +} +.highlight .o, .highlight .ow { + color: #d0d0d0; +} +.highlight .p, .highlight .pi { + color: #d0d0d0; +} +.highlight .gi { + color: #90a959; +} +.highlight .gd { + color: #ac4142; +} +.highlight .gh { + color: #6a9fb5; + font-weight: bold; +} +.highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv { + color: #aa759f; +} +.highlight .kc { + color: #d28445; +} +.highlight .kt { + color: #d28445; +} +.highlight .kd { + color: #d28445; +} +.highlight .s, .highlight .sb, .highlight .sc, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 { + color: #90a959; +} +.highlight .sr { + color: #75b5aa; +} +.highlight .si { + color: #8f5536; +} +.highlight .se { + color: #8f5536; +} +.highlight .nn { + color: #f4bf75; +} +.highlight .nc { + color: #f4bf75; +} +.highlight .no { + color: #f4bf75; +} +.highlight .na { + color: #6a9fb5; +} +.highlight .m, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mb, .highlight .mx { + color: #90a959; +} +.highlight .ss { + color: #90a959; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..0c6fbca47e73 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import "jekyll-theme-modernist"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/assets/images/checker.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/assets/images/checker.png new file mode 100644 index 000000000000..7a65b2333db9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/assets/images/checker.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/assets/js/scale.fix.js b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/assets/js/scale.fix.js new file mode 100644 index 000000000000..08716c00605a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-modernist-0.1.1/assets/js/scale.fix.js @@ -0,0 +1,20 @@ +fixScale = function(doc) { + + var addEvent = 'addEventListener', + type = 'gesturestart', + qsa = 'querySelectorAll', + scales = [1, 1], + meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : []; + + function fix() { + meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1]; + doc.removeEventListener(type, fix, true); + } + + if ((meta = meta[meta.length - 1]) && addEvent in doc) { + fix(); + scales = [.25, 1.6]; + doc[addEvent](type, fix, true); + } + +}; \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/LICENSE.md new file mode 100644 index 000000000000..d96f51cc6dac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016-2017 GitHub, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/README.md new file mode 100644 index 000000000000..2496b1e84a1b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/README.md @@ -0,0 +1,91 @@ +# The Primer theme + +[![Build Status](https://travis-ci.org/pages-themes/primer.svg?branch=master)](https://travis-ci.org/pages-themes/primer) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-primer.svg)](https://badge.fury.io/rb/jekyll-theme-primer) + +*Primer is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/primer), or even [use it today](#usage).* + +## Usage + +> **_NOTE:_** Primer is now the default theme for GitHub Pages, but you can still specify the theme you're using as below. + +To use the Primer theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-primer + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + + + +## Customizing + +### Configuration variables + +Primer will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/primer/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +## Roadmap + +See the [open issues](https://github.com/pages-themes/primer/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Primer theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Primer? We'd love your help. Primer is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/primer`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_includes/.gitkeep b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_includes/.gitkeep new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_includes/.gitkeep @@ -0,0 +1 @@ + diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/default.html new file mode 100644 index 000000000000..b5a4363aa75e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/default.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + +{% seo %} + <link rel="stylesheet" href="{{ "/assets/css/style.css?v=" | append: site.github.build_revision | relative_url }}"> + </head> + <body> + <div class="container-lg px-3 my-5 markdown-body"> + {% if site.title and site.title != page.title %} + <h1><a href="{{ "/" | absolute_url }}">{{ site.title }}</a></h1> + {% endif %} + + {{ content }} + + {% if site.github.private != true and site.github.license %} + <div class="footer border-top border-gray-light mt-5 pt-3 text-right text-gray"> + This site is open source. {% github_edit_link "Improve this page" %}. + </div> + {% endif %} + </div> + <script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.1.0/anchor.min.js" integrity="sha256-lZaRhKri35AyJSypXXs4o6OPFTbTmUoltBbDCbdzegg=" crossorigin="anonymous"></script> + <script>anchors.add();</script> + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/home.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/home.html new file mode 100644 index 000000000000..4141e7293304 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/home.html @@ -0,0 +1,4 @@ +--- +layout: default +--- +{{ content }} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/page.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/page.html new file mode 100644 index 000000000000..4141e7293304 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/page.html @@ -0,0 +1,4 @@ +--- +layout: default +--- +{{ content }} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/post.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/post.html new file mode 100644 index 000000000000..4141e7293304 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_layouts/post.html @@ -0,0 +1,4 @@ +--- +layout: default +--- +{{ content }} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/jekyll-theme-primer.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/jekyll-theme-primer.scss new file mode 100644 index 000000000000..b523a9a4924b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/jekyll-theme-primer.scss @@ -0,0 +1,7 @@ + +@import "primer-support/index.scss"; +@import "primer-base/index.scss"; +@import "primer-utilities/index.scss"; +@import "primer-layout/index.scss"; +@import "primer-markdown/index.scss"; +@import "rouge"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/index.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/index.scss new file mode 100644 index 000000000000..2ce815d11ae8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/index.scss @@ -0,0 +1,5 @@ +@import "primer-support/index.scss"; + +@import "./lib/normalize.scss"; +@import "./lib/base.scss"; +@import "./lib/typography-base.scss"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/lib/base.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/lib/base.scss new file mode 100644 index 000000000000..21033a87c4be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/lib/base.scss @@ -0,0 +1,84 @@ +// stylelint-disable selector-max-type +* { + box-sizing: border-box; +} + +input, +select, +textarea, +button { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +body { + font-family: $body-font; + font-size: $body-font-size; + line-height: $body-line-height; + color: $text-gray-dark; + background-color: $bg-white; +} + +a { + color: $text-blue; + text-decoration: none; + + &:hover { + text-decoration: underline; + } +} + +b, +strong { + font-weight: $font-weight-bold; +} + +// Horizontal lines +// +// TODO-MDO: Remove `.rule` from everywhere and replace with `<hr>`s +hr, +.rule { + height: 0; + margin: 15px 0; + overflow: hidden; + background: transparent; + border: 0; + border-bottom: 1px solid lighten($gray-300, 5%); + @include clearfix(); +} + +// +// Remove most spacing between table cells. +// + +table { + border-spacing: 0; + border-collapse: collapse; +} + +td, +th { + padding: 0; +} + +button { + cursor: pointer; + // Remove border radius added by Chroma macOS + border-radius: 0; +} + +// increase the selector specificity for [hidden] +// so that it always overrides utility classes (.d-block, etc.) +[hidden][hidden] { + display: none !important; +} + +details { + summary { cursor: pointer; } + + &:not([open]) { + // Set details content hidden by default for browsers that don't do this + > *:not(summary) { display: none !important; } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/lib/normalize.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/lib/normalize.scss new file mode 100644 index 000000000000..56697de85a92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/lib/normalize.scss @@ -0,0 +1,421 @@ +// stylelint-disable +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */ + +/** + * 1. Change the default font family in all browsers (opinionated). + * 2. Prevent adjustments of font size after orientation changes in IE and iOS. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + * 2. Add the correct display in IE. + */ + +article, +aside, +details, /* 1 */ +figcaption, +figure, +footer, +header, +main, /* 2 */ +menu, +nav, +section { /* 1 */ + display: block; +} + +summary { + display: list-item; +} + +/** + * Add the correct display in IE 9-. + */ + +audio, +canvas, +progress, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Add the correct display in IE 10-. + * 1. Add the correct display in IE. + */ + +template, /* 1 */ +[hidden] { + display: none !important; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; /* 1 */ +} + +/** + * Remove the outline on focused links when they are also active or hovered + * in all browsers (opinionated). + */ + +a:active, +a:hover { + outline-width: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the bottom border in Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change font properties to `inherit` in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +select, +textarea { + font: inherit; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Restore the font weight unset by the previous rule. + */ + +optgroup { + font-weight: bold; +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Change the border, margin, and padding in all browsers (opinionated). + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on OS X. + */ + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Correct the text style of placeholders in Chrome, Edge, and Safari. + */ + +::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/lib/typography-base.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/lib/typography-base.scss new file mode 100644 index 000000000000..091a558e4866 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-base/lib/typography-base.scss @@ -0,0 +1,86 @@ +// Headings +// -------------------------------------------------- +// stylelint-disable selector-max-type +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 0; +} + +h1 { @include h1; } +h2 { @include h2; } +h3 { @include h3; } +h4 { @include h4; } +h5 { @include h5; } +h6 { @include h6; } + +// Body text +// -------------------------------------------------- + +p { + margin-top: 0; + margin-bottom: 10px; +} + +small { + font-size: 90%; +} + +blockquote { + margin: 0; +} + +// Lists +// -------------------------------------------------- + +ul, +ol { + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} + +ol ol, +ul ol { + list-style-type: lower-roman; +} + +ul ul ol, +ul ol ol, +ol ul ol, +ol ol ol { + list-style-type: lower-alpha; +} + +dd { + margin-left: 0; +} + +// Code +// -------------------------------------------------- + +tt, +code { + font-family: $mono-font; + font-size: $font-size-small; +} + +pre { + margin-top: 0; + margin-bottom: 0; + font-family: $mono-font; + font-size: $font-size-small; +} + +// Octicons +// -------------------------------------------------- + +// Move this over here as a temporary override to the octicons source repo +// instead of updating that upstream. +.octicon { + vertical-align: text-bottom; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/index.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/index.scss new file mode 100644 index 000000000000..43a0d3e59a61 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/index.scss @@ -0,0 +1,5 @@ +@import "primer-support/index.scss"; +@import "./lib/container.scss"; +@import "./lib/columns.scss"; +@import "./lib/grid.scss"; +@import "./lib/grid-offset.scss"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/columns.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/columns.scss new file mode 100644 index 000000000000..9f77abd07310 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/columns.scss @@ -0,0 +1,54 @@ +// Grid system +// +// Create rows with `.columns` to clear the floated columns and outdent the +// padding on `.column`s with negative margin for alignment. + +.columns { + margin-right: -$grid-gutter; + margin-left: -$grid-gutter; + @include clearfix; +} + +// Base class for every column (requires a column width from below) +.column { + float: left; + padding-right: $grid-gutter; + padding-left: $grid-gutter; +} + +// Column widths +.one-third { + width: 33.333333%; +} + +.two-thirds { + width: 66.666667%; +} + +.one-fourth { + width: 25%; +} + +.one-half { + width: 50%; +} + +.three-fourths { + width: 75%; +} + +.one-fifth { + width: 20%; +} + +.four-fifths { + width: 80%; +} + +// Centers content horizontally. Can be used inside or outside the grid. +.centered { + display: block; + float: none; + margin-right: auto; + margin-left: auto; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/container.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/container.scss new file mode 100644 index 000000000000..2f0f4dcc07ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/container.scss @@ -0,0 +1,30 @@ +// Fixed-width, centered column for site content. +// This will be deprecated and replaced with container-lg in future +.container { + width: $container-width; + margin-right: auto; + margin-left: auto; + @include clearfix; +} + +// Handy container styles that match our breakpoints +// 768px +.container-md { + max-width: $container-md; + margin-right: auto; + margin-left: auto; +} + +// 1004px - this matches the current fixed width: 980px + padding: px-3 +.container-lg { + max-width: $container-lg; + margin-right: auto; + margin-left: auto; +} + +// 1280px +.container-xl { + max-width: $container-xl; + margin-right: auto; + margin-left: auto; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/grid-offset.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/grid-offset.scss new file mode 100644 index 000000000000..bc2115d87fbb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/grid-offset.scss @@ -0,0 +1,19 @@ +// Optional offset options to work with grid.scss + +// Offset Columns + +@each $breakpoint, $variant in $responsive-variants { + @include breakpoint($breakpoint) { + .offset#{$variant}-1 { margin-left: (1 / 12 * 100%) !important; } + .offset#{$variant}-2 { margin-left: (2 / 12 * 100%) !important; } + .offset#{$variant}-3 { margin-left: (3 / 12 * 100%) !important; } + .offset#{$variant}-4 { margin-left: (4 / 12 * 100%) !important; } + .offset#{$variant}-5 { margin-left: (5 / 12 * 100%) !important; } + .offset#{$variant}-6 { margin-left: (6 / 12 * 100%) !important; } + .offset#{$variant}-7 { margin-left: (7 / 12 * 100%) !important; } + .offset#{$variant}-8 { margin-left: (8 / 12 * 100%) !important; } + .offset#{$variant}-9 { margin-left: (9 / 12 * 100%) !important; } + .offset#{$variant}-10 { margin-left: (10 / 12 * 100%) !important; } + .offset#{$variant}-11 { margin-left: (11 / 12 * 100%) !important; } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/grid.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/grid.scss new file mode 100644 index 000000000000..5126c6b10e1c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-layout/lib/grid.scss @@ -0,0 +1,64 @@ +// GRID + +// Columns +.col-1 { width: (1 / 12 * 100%); } +.col-2 { width: (2 / 12 * 100%); } +.col-3 { width: (3 / 12 * 100%); } +.col-4 { width: (4 / 12 * 100%); } +.col-5 { width: (5 / 12 * 100%); } +.col-6 { width: (6 / 12 * 100%); } +.col-7 { width: (7 / 12 * 100%); } +.col-8 { width: (8 / 12 * 100%); } +.col-9 { width: (9 / 12 * 100%); } +.col-10 { width: (10 / 12 * 100%); } +.col-11 { width: (11 / 12 * 100%); } +.col-12 { width: 100%; } + +@each $breakpoint in map-keys($breakpoints) { + @include breakpoint($breakpoint) { + .col-#{$breakpoint}-1 { width: ( 1 / 12 * 100%); } + .col-#{$breakpoint}-2 { width: ( 2 / 12 * 100%); } + .col-#{$breakpoint}-3 { width: ( 3 / 12 * 100%); } + .col-#{$breakpoint}-4 { width: ( 4 / 12 * 100%); } + .col-#{$breakpoint}-5 { width: ( 5 / 12 * 100%); } + .col-#{$breakpoint}-6 { width: ( 6 / 12 * 100%); } + .col-#{$breakpoint}-7 { width: ( 7 / 12 * 100%); } + .col-#{$breakpoint}-8 { width: ( 8 / 12 * 100%); } + .col-#{$breakpoint}-9 { width: ( 9 / 12 * 100%); } + .col-#{$breakpoint}-10 { width: ( 10 / 12 * 100%); } + .col-#{$breakpoint}-11 { width: ( 11 / 12 * 100%); } + .col-#{$breakpoint}-12 { width: 100%; } + } +} + +// Gutters +// Apply padding and a negative margin to the outside of the container +@mixin gutters ($gutter-width: $spacer-3) { + margin-right: -$gutter-width; + margin-left: -$gutter-width; + + > [class*="col-"] { + padding-right: $gutter-width !important; + padding-left: $gutter-width !important; + } +} + +.gutter { + @include gutters($spacer-3); +} + +.gutter-condensed { + @include gutters($spacer-2); +} + +.gutter-spacious { + @include gutters($spacer-4); +} + +@each $breakpoint in map-keys($breakpoints) { + @include breakpoint($breakpoint) { + .gutter-#{$breakpoint} { @include gutters($spacer-3); } + .gutter-#{$breakpoint}-condensed { @include gutters($spacer-2); } + .gutter-#{$breakpoint}-spacious { @include gutters($spacer-4); } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/index.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/index.scss new file mode 100644 index 000000000000..064e775d4145 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/index.scss @@ -0,0 +1,8 @@ +@import "primer-support/index.scss"; +@import "./lib/markdown-body.scss"; +@import "./lib/headings.scss"; +@import "./lib/lists.scss"; +@import "./lib/tables.scss"; +@import "./lib/images.scss"; +@import "./lib/code.scss"; +@import "./lib/blob-csv.scss"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/blob-csv.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/blob-csv.scss new file mode 100644 index 000000000000..5fa3c88c41ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/blob-csv.scss @@ -0,0 +1,27 @@ +// stylelint-disable selector-max-type +.markdown-body .csv-data { + td, + th { + padding: 5px; + overflow: hidden; + font-size: $font-size-small; + line-height: $lh-condensed-ultra; + text-align: left; + white-space: nowrap; + } + + .blob-num { + padding: 10px $spacer-2 9px; + text-align: right; + background: $bg-white; + border: 0; + } + + tr { border-top: 0; } + + th { + font-weight: $font-weight-bold; + background: $gray-100; + border-top: 0; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/code.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/code.scss new file mode 100644 index 000000000000..3cdd3f9bc43c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/code.scss @@ -0,0 +1,63 @@ +// stylelint-disable selector-max-type +.markdown-body { + // Inline code snippets + code, + tt { + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + background-color: rgba($black, 0.05); + border-radius: $border-radius; + + br { display: none; } + } + + del code { text-decoration: inherit; } + + pre { + word-wrap: normal; + + // Code tags within code blocks (<pre>s) + > code { + padding: 0; + margin: 0; + font-size: 100%; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; + } + } + + .highlight { + margin-bottom: $spacer-3; + + pre { + margin-bottom: 0; + word-break: normal; + } + } + + .highlight pre, + pre { + padding: $spacer-3; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: $gray-100; + border-radius: $border-radius; + } + + pre code, + pre tt { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/headings.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/headings.scss new file mode 100644 index 000000000000..49a03457113b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/headings.scss @@ -0,0 +1,65 @@ +// Needs refactoring +// stylelint-disable selector-max-compound-selectors, selector-max-specificity +// stylelint-disable selector-max-type +.markdown-body { + // Headings + h1, + h2, + h3, + h4, + h5, + h6 { + margin-top: $spacer-4; + margin-bottom: $spacer-3; + font-weight: $font-weight-bold; + line-height: $lh-condensed; + + .octicon-link { + color: $black; + vertical-align: middle; + visibility: hidden; + } + + &:hover .anchor { + text-decoration: none; + + .octicon-link { + visibility: visible; + } + } + + tt, + code { + font-size: inherit; + } + } + + h1 { + padding-bottom: 0.3em; + font-size: 2em; + border-bottom: 1px solid lighten($gray-200, 3%); + } + + h2 { + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid lighten($gray-200, 3%); + } + + h3 { + font-size: 1.25em; + } + + h4 { + font-size: 1em; + } + + h5 { + font-size: 0.875em; + } + + h6 { + font-size: 0.85em; + color: $gray-500; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/images.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/images.scss new file mode 100644 index 000000000000..3d70f8da6c3b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/images.scss @@ -0,0 +1,119 @@ +// Need to target base styles +// stylelint-disable selector-max-compound-selectors, selector-no-qualifying-type, primer/selector-no-utility +// stylelint-disable selector-max-type +.markdown-body { + // Images & Stuff + img { + max-width: 100%; + // because we put padding on the images to hide header lines, and some people + // specify the width of their images in their markdown. + box-sizing: content-box; + background-color: $bg-white; + + &[align=right] { + padding-left: 20px; + } + + &[align=left] { + padding-right: 20px; + } + } + + .emoji { + max-width: none; + vertical-align: text-top; + // Override `<img>` styles so Emjois don't clash with zebra striping in our tables + background-color: transparent; + } + + // Gollum Image Tags + + // Framed + span.frame { + display: block; + overflow: hidden; + + > span { + display: block; + float: left; + width: auto; + padding: 7px; + margin: 13px 0 0; + overflow: hidden; + border: 1px solid lighten($gray-300, 5%); + } + + span img { + display: block; + float: left; + } + + span span { + display: block; + padding: 5px 0 0; + clear: both; + color: $text-gray-dark; + } + } + + span.align-center { + display: block; + overflow: hidden; + clear: both; + + > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: center; + } + + span img { + margin: 0 auto; + text-align: center; + } + } + + span.align-right { + display: block; + overflow: hidden; + clear: both; + + > span { + display: block; + margin: 13px 0 0; + overflow: hidden; + text-align: right; + } + + span img { + margin: 0; + text-align: right; + } + } + + span.float-left { + display: block; + float: left; + margin-right: 13px; + overflow: hidden; + + span { + margin: 13px 0 0; + } + } + + span.float-right { + display: block; + float: right; + margin-left: 13px; + overflow: hidden; + + > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: right; + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/lists.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/lists.scss new file mode 100644 index 000000000000..c80cdfc3688a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/lists.scss @@ -0,0 +1,76 @@ +// Base styles +// stylelint-disable selector-no-qualifying-type +// stylelint-disable selector-max-type +.markdown-body { + + // Lists, Blockquotes & Such + ul, + ol { + padding-left: 2em; + + &.no-list { + padding: 0; + list-style-type: none; + } + } + + // Did someone complain about list spacing? Encourage them + // to create the spacing with their markdown formatting. + // List behavior should be controled by the markup, not the css. + // + // For lists with padding between items, use blank + // lines between items. This will generate paragraphs with + // padding to space things out. + // + // - item + // + // - item + // + // - item + // + // For list without padding, don't use blank lines. + // + // - item + // - item + // - item + // + // Modifying the css to emulate these behaviors merely brakes + // one case in the process of solving another. Don't change + // this unless it's really really a bug. + ul ul, + ul ol, + ol ol, + ol ul { + margin-top: 0; + margin-bottom: 0; + } + + li { + word-wrap: break-all; + } + + li > p { + margin-top: $spacer-3; + } + + li + li { + margin-top: $em-spacer-3; + } + + dl { + padding: 0; + + dt { + padding: 0; + margin-top: $spacer-3; + font-size: 1em; + font-style: italic; + font-weight: $font-weight-bold; + } + + dd { + padding: 0 $spacer-3; + margin-bottom: $spacer-3; + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/markdown-body.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/markdown-body.scss new file mode 100644 index 000000000000..697fab908f76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/markdown-body.scss @@ -0,0 +1,106 @@ +// All of our block level items should have the same margin +// stylelint-disable selector-max-type + +// This is styling for generic markdownized text. Anything you put in a +// container with .markdown-body on it should render generally well. It also +// includes some GitHub Flavored Markdown specific styling (like @mentions) +.markdown-body { + font-family: $body-font; + font-size: $h4-size; + line-height: $body-line-height; + word-wrap: break-word; + + // Clearfix on the markdown body + &::before { + display: table; + content: ""; + } + + &::after { + display: table; + clear: both; + content: ""; + } + + > *:first-child { + margin-top: 0 !important; + } + + > *:last-child { + margin-bottom: 0 !important; + } + + // Anchors like <a name="examples">. These sometimes end up wrapped around + // text when users mistakenly forget to close the tag or use self-closing tag + // syntax. We don't want them to appear like links. + // FIXME: a:not(:link):not(:visited) would be a little clearer here (and + // possibly faster to match), but it breaks styling of <a href> elements due + // to https://bugs.webkit.org/show_bug.cgi?id=142737. + a:not([href]) { + color: inherit; + text-decoration: none; + } + + // Link Colors + .absent { + color: $red-600; + } + + .anchor { + float: left; + padding-right: $spacer-1; + margin-left: -20px; + line-height: $lh-condensed-ultra; + + &:focus { + outline: none; + } + } + + p, + blockquote, + ul, + ol, + dl, + table, + pre { + margin-top: 0; + margin-bottom: $spacer-3; + } + + hr { + height: $em-spacer-3; + padding: 0; + margin: $spacer-4 0; + background-color: $gray-200; + border: 0; + } + + blockquote { + padding: 0 1em; + color: $gray-500; + border-left: 0.25em solid lighten($gray-300, 5%); + + > :first-child { + margin-top: 0; + } + + > :last-child { + margin-bottom: 0; + } + } + + kbd { + display: inline-block; + padding: 3px 5px; + font-size: 11px; + line-height: 10px; + color: $gray-700; + vertical-align: middle; + background-color: $gray-000; + border: solid 1px darken($gray-300, 4%); + border-bottom-color: $gray-400; + border-radius: 3px; + box-shadow: inset 0 -1px 0 $gray-400; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/tables.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/tables.scss new file mode 100644 index 000000000000..1f48119eabc2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-markdown/lib/tables.scss @@ -0,0 +1,33 @@ +// Needs refactoring +// stylelint-disable selector-max-type +.markdown-body { + // Tables + table { + display: block; + width: 100%; + overflow: auto; + + th { + font-weight: $font-weight-bold; + } + + th, + td { + padding: 6px 13px; + border: 1px solid lighten($gray-300, 5%); + } + + tr { + background-color: $bg-white; + border-top: 1px solid darken($gray-300, 4%); + + &:nth-child(2n) { + background-color: $gray-100; + } + } + + img { + background-color: transparent; + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/index.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/index.scss new file mode 100644 index 000000000000..1b5abdd8080d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/index.scss @@ -0,0 +1,11 @@ +// variables +@import "./lib/variables/typography.scss"; +@import "./lib/variables/colors.scss"; +@import "./lib/variables/layout.scss"; +@import "./lib/variables/misc.scss"; + +// mixins +@import "./lib/mixins/typography.scss"; +@import "./lib/mixins/layout.scss"; +@import "./lib/mixins/buttons.scss"; +@import "./lib/mixins/misc.scss"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/buttons.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/buttons.scss new file mode 100644 index 000000000000..8b0f30be001a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/buttons.scss @@ -0,0 +1,160 @@ +// stylelint-disable block-closing-brace-newline-after + +// Button color generator for primary and themed buttons + +// New button hotness +@mixin btn-solid($color, $bg, $bg2) { + color: $color; + background-color: $bg2; + background-image: linear-gradient(-180deg, $bg 0%, $bg2 90%); + + @if $bg == $gray-000 { + &:focus, + &.focus { + box-shadow: $btn-input-focus-shadow; + } + + &:hover, + &.hover { + background-color: darken($bg2, 3%); + background-image: linear-gradient(-180deg, darken($bg, 3%) 0%, darken($bg2, 3%) 90%); + background-position: 0 -$em-spacer-5; + border-color: rgba($black, 0.35); + } + + &:active, + &.selected, + [open] > & { + background-color: darken(desaturate($bg, 10%), 6%); + background-image: none; + border-color: rgba($black, 0.35); // repeat to avoid shift on click-drag off of button + box-shadow: $btn-active-shadow; + } + + &:disabled, + &.disabled { + color: rgba($color, 0.4); + background-color: $bg2; + background-image: none; + border-color: transparentize($black, 0.8); // back to default .btn + box-shadow: none; + } + + } @else { + &:focus, + &.focus { + box-shadow: 0 0 0 0.2em rgba($bg, 0.4); + } + + &:hover, + &.hover { + background-color: darken($bg2, 2%); + background-image: linear-gradient(-180deg, darken($bg, 2%) 0%, darken($bg2, 2%) 90%); + background-position: 0 -$em-spacer-5; + border-color: $black-fade-50; + } + + &:active, + &.selected, + [open] > & { + background-color: darken(mix($bg, $bg2, 50%), 7%); + background-image: none; + border-color: $black-fade-50; // repeat to avoid shift on click-drag off of button + box-shadow: $btn-active-shadow; + } + + &:disabled, + &.disabled { + color: rgba($color, 0.75); + background-color: mix($bg2, $white, 50%); + background-image: none; + border-color: transparentize($black, 0.8); // repeat .btn default to avoid shift on click-drag off of button + box-shadow: none; + } + + .Counter { + color: darken($bg, 8%); + background-color: $white; + } + } +} + +// Inverse button hover style +@mixin btn-inverse($color, $bg, $bg2) { + color: $color; + background-color: $bg; + background-image: linear-gradient(-180deg, $bg 0%, $bg2 90%); + + &:focus { + box-shadow: 0 0 0 0.2em rgba($color, 0.4); + } + + &:hover { + color: $text-white; + background-color: $color; + background-image: linear-gradient(-180deg, lighten($color, 10%) 0%, $color 90%); + border-color: $black-fade-50; + + .Counter { + color: $text-white; + } + } + + &:active, + &.selected, + [open] > & { + color: $text-white; + background-color: darken($color, 5%); + background-image: none; + border-color: $black-fade-50; + box-shadow: $btn-active-shadow; + } + + &:disabled, + &.disabled { + color: rgba($color, 0.4); + background-color: $bg2; + background-image: none; + border-color: transparentize($black, 0.8); // back to default .btn + box-shadow: none; + } +} + +// Outline color generator for btn-outline to make the hover state inverse the text and bg colors. +@mixin btn-outline($text-color: $text-blue, $bg-color: $bg-white) { + color: $text-color; + background-color: $bg-color; + background-image: none; + + .Counter { + background-color: rgba($black, 0.07); + } + + &:hover, + &:active, + &.selected, + [open] > & { + color: $bg-color; + background-color: $text-color; + background-image: none; + border-color: $text-color; + + .Counter { + color: $text-color; + background-color: $bg-color; + } + } + + &:focus { + border-color: $text-color; + box-shadow: 0 0 0 0.2em rgba($text-color, 0.4); + } + + &:disabled, + &.disabled { + color: $black-fade-30; + background-color: $bg-white; + border-color: $black-fade-15; + box-shadow: none; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/layout.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/layout.scss new file mode 100644 index 000000000000..a6d30cf1879e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/layout.scss @@ -0,0 +1,58 @@ +// Responsive media queries + +@mixin breakpoint($breakpoint) { + @if $breakpoint == "" { + @content; + } + + @else { + // Retrieves the value from the key + $value: map-get($breakpoints, $breakpoint); + + // If the key exists in the map + @if $value != null { + // Prints a media query based on the value + @media (min-width: $value) { + @content; + } + } + + // If the key doesn't exist in the map + @else { + @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. " + + "Please make sure it is defined in `$breakpoints` map."; + } + } +} + +// Retina media query + +@mixin retina-media-query { + @media + only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (min--moz-device-pixel-ratio: 2), + only screen and (-moz-min-device-pixel-ratio: 2), + only screen and (-o-min-device-pixel-ratio: 2/1), + only screen and (min-device-pixel-ratio: 2), + only screen and (min-resolution: 192dpi), + only screen and (min-resolution: 2dppx) { + @content; + } +} + +// Clearfix +// +// Clears floats via mixin. + +@mixin clearfix { + &::before { + display: table; + content: ""; + } + + &::after { + display: table; + clear: both; + content: ""; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/misc.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/misc.scss new file mode 100644 index 000000000000..ebdd32d04683 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/misc.scss @@ -0,0 +1,29 @@ +// Generate a two-color caret for any element. +@mixin double-caret($foreground: $text-white, $background: lighten($gray-300, 5%)) { + &::after, + &::before { + position: absolute; + top: 11px; + right: 100%; + left: -16px; + display: block; + width: 0; + height: 0; + pointer-events: none; + content: " "; + border-color: transparent; + border-style: solid solid outset; + } + + &::after { + margin-top: 1px; + margin-left: 2px; + border-width: 7px; + border-right-color: $foreground; + } + + &::before { + border-width: 8px; + border-right-color: $background; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/typography.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/typography.scss new file mode 100644 index 000000000000..d39aa44c1f5c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/mixins/typography.scss @@ -0,0 +1,84 @@ +// Text hiding for image based text replacement. +// Higher performance than -9999px because it only renders +// the size of the actual text, not a full 9999px box. +@mixin hide-text() { + overflow: hidden; + text-indent: 100%; + white-space: nowrap; +} + +// Heading mixins for use within components +// These match heading utilities in utilities/typography +@mixin h1 { + font-size: $h1-size; + font-weight: $font-weight-bold; +} + +@mixin h2 { + font-size: $h2-size; + font-weight: $font-weight-bold; +} + +@mixin h3 { + font-size: $h3-size; + font-weight: $font-weight-bold; +} + +@mixin h4 { + font-size: $h4-size; + font-weight: $font-weight-bold; +} + +@mixin h5 { + font-size: $h5-size; + font-weight: $font-weight-bold; +} + +@mixin h6 { + font-size: $h6-size; + font-weight: $font-weight-bold; +} + +// Responsive heading mixins +// There are no responsive mixins for h4—h6 because they are small +// and don't need to be smaller on mobile. +@mixin f1-responsive { + font-size: $h1-size-mobile; + + // 32px on desktop + @include breakpoint(md) { font-size: $h1-size; } + +} + +@mixin f2-responsive { + font-size: $h2-size-mobile; + + // 24px on desktop + @include breakpoint(md) { font-size: $h2-size; } +} + +@mixin f3-responsive { + font-size: $h3-size-mobile; + + // 20px on desktop + @include breakpoint(md) { font-size: $h3-size; } + +} + +// These use the mixins from above for responsive heading sizes. +// The following mixins can be used where it's convenient or necessary to +// couple the responsive font-size with the font-weight. +@mixin h1-responsive { + @include f1-responsive; + font-weight: $font-weight-bold; +} + +@mixin h2-responsive { + @include f2-responsive; + font-weight: $font-weight-bold; +} + +@mixin h3-responsive { + @include f3-responsive; + font-weight: $font-weight-bold; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/color-system.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/color-system.scss new file mode 100644 index 000000000000..0ea1a7116c02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/color-system.scss @@ -0,0 +1,114 @@ +// +// +// -------- Grays -------- +$gray-000: #fafbfc !default; +$gray-100: #f6f8fa !default; +$gray-200: #e1e4e8 !default; +$gray-300: #d1d5da !default; +$gray-400: #959da5 !default; +$gray-500: #6a737d !default; +$gray-600: #586069 !default; +$gray-700: #444d56 !default; +$gray-800: #2f363d !default; +$gray-900: #24292e !default; // body font color + +// -------- Blue -------- +$blue-000: #f1f8ff !default; +$blue-100: #dbedff !default; +$blue-200: #c8e1ff !default; +$blue-300: #79b8ff !default; +$blue-400: #2188ff !default; +$blue-500: #0366d6 !default; // Default: Passes AA with #fff +$blue-600: #005cc5 !default; +$blue-700: #044289 !default; +$blue-800: #032f62 !default; +$blue-900: #05264c !default; // Passes with 1/2/300 blues + +// -------- Green -------- +$green-000: #f0fff4 !default; +$green-100: #dcffe4 !default; +$green-200: #bef5cb !default; +$green-300: #85e89d !default; +$green-400: #34d058 !default; +$green-500: #28a745 !default; // Default. passes AA Large +$green-600: #22863a !default; // Text green, passes AA on #fff +$green-700: #176f2c !default; +$green-800: #165c26 !default; +$green-900: #144620 !default; + +// -------- Yellow -------- +$yellow-000: #fffdef !default; +$yellow-100: #fffbdd !default; +$yellow-200: #fff5b1 !default; +$yellow-300: #ffea7f !default; +$yellow-400: #ffdf5d !default; +$yellow-500: #ffd33d !default; +$yellow-600: #f9c513 !default; +$yellow-700: #dbab09 !default; +$yellow-800: #b08800 !default; +$yellow-900: #735c0f !default; + +// -------- Orange -------- +$orange-000: #fff8f2 !default; +$orange-100: #ffebda !default; +$orange-200: #ffd1ac !default; +$orange-300: #ffab70 !default; +$orange-400: #fb8532 !default; +$orange-500: #f66a0a !default; // Default. passes AA Large with #fff +$orange-600: #e36209 !default; +$orange-700: #d15704 !default; +$orange-800: #c24e00 !default; +$orange-900: #a04100 !default; + +// -------- Red -------- +$red-000: #ffeef0 !default; +$red-100: #ffdce0 !default; +$red-200: #fdaeb7 !default; +$red-300: #f97583 !default; +$red-400: #ea4a5a !default; +$red-500: #d73a49 !default; // Default. passes AA +$red-600: #cb2431 !default; +$red-700: #b31d28 !default; +$red-800: #9e1c23 !default; +$red-900: #86181d !default; + +// -------- Purple -------- +$purple-000: #f5f0ff !default; +$purple-100: #e6dcfd !default; +$purple-200: #d1bcf9 !default; +$purple-300: #b392f0 !default; +$purple-400: #8a63d2 !default; +$purple-500: #6f42c1 !default; // passes AA with #fff +$purple-600: #5a32a3 !default; +$purple-700: #4c2889 !default; +$purple-800: #3a1d6e !default; +$purple-900: #29134e !default; + +// -------- Fades -------- +// Black based on same hue as $gray-900 +$black: #1b1f23 !default; +$white: #fff !default; + +$black-fade-15: rgba($black, 0.15) !default; +$black-fade-30: rgba($black, 0.3) !default; +$black-fade-50: rgba($black, 0.5) !default; +$black-fade-70: rgba($black, 0.7) !default; +$black-fade-85: rgba($black, 0.85) !default; + +$white-fade-15: rgba($white, 0.15) !default; +$white-fade-30: rgba($white, 0.3) !default; +$white-fade-50: rgba($white, 0.5) !default; +$white-fade-70: rgba($white, 0.7) !default; +$white-fade-85: rgba($white, 0.85) !default; + +// -------- Color defaults -------- +$red: $red-500 !default; +$purple: $purple-500 !default; +$blue: $blue-500 !default; +$green: $green-500 !default; +$yellow: $yellow-500 !default; +$orange: $orange-500 !default; + +$gray-dark: $gray-900 !default; +$gray-light: $gray-400 !default; +$gray: $gray-500 !default; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/colors.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/colors.scss new file mode 100644 index 000000000000..36dc3c8a747a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/colors.scss @@ -0,0 +1,67 @@ +@import "color-system.scss"; +// Color variables +// stylelint-disable declaration-bang-space-before + +// State indicators. +$status-pending: desaturate($yellow-700, 15%) !default; + +// Repository type colors +// Should be able to deprecate these in future +$repo-private-text: $black-fade-70 !default; +$repo-private-bg: $yellow-000 !default; +$repo-private-icon: transparentize($yellow-900, 0.5) !default; + +// Highlight used for things like search +$highlight-yellow: rgba(255, 247, 140, 0.5); + +// Border colors +$border-black-fade: $black-fade-15 !default; + +$border-blue: $blue-500 !default; +$border-blue-light: $blue-200 !default; + +$border-green: $green-400 !default; +$border-green-light: desaturate($green-300, 40%) !default; + +$border-purple: $purple !default; + +$border-red: $red !default; +$border-red-light: desaturate($red-300, 60%) !default; + +$border-purple: $purple !default; + +$border-yellow: desaturate($yellow-300, 60%) !default; + +$border-gray-dark: $gray-300 !default; +$border-gray-darker: $gray-700 !default; +$border-gray-light: lighten($gray-200, 3%) !default; +$border-gray: $gray-200 !default; + +// Background colors +$bg-blue-light: $blue-000 !default; +$bg-blue: $blue-500 !default; +$bg-gray-dark: $gray-900 !default; +$bg-gray-light: $gray-000 !default; +$bg-gray: $gray-100 !default; +$bg-green: $green-500 !default; +$bg-green-light: $green-100 !default; +$bg-orange: $orange-700 !default; +$bg-purple: $purple-500 !default; +$bg-purple-light: $purple-000 !default; +$bg-red: $red-500 !default; +$bg-red-light: $red-100 !default; +$bg-white: $white !default; +$bg-yellow: $yellow-500 !default; +$bg-yellow-light: $yellow-200 !default; + +// Text colors +$text-blue: $blue-500 !default; +$text-gray-dark: $gray-900 !default; +$text-gray-light: $gray-500 !default; +$text-gray: $gray-600 !default; +$text-green: $green-500 !default; +$text-orange: $orange-900 !default; +$text-orange-light: $orange-600 !default; +$text-purple: $purple !default; +$text-red: $red-600 !default; +$text-white: $white !default; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/layout.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/layout.scss new file mode 100644 index 000000000000..284407a4655b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/layout.scss @@ -0,0 +1,72 @@ +// Layout variables +// stylelint-disable declaration-bang-space-before + +// These are our margin and padding utility spacers. The default step size we +// use is 8px. This gives us a key of: +// 0 => 0px +// 1 => 4px +// 2 => 8px +// 3 => 16px +// 4 => 24px +// 5 => 32px +// 6 => 40px +$spacer: 8px !default; +$spacers: ( + 0, + round($spacer / 2), + $spacer, + $spacer * 2, + $spacer * 3, + $spacer * 4, + $spacer * 5 +) !default; + +// Aliases for easy use +$spacer-0: nth($spacers, 1) !default; // 0 +$spacer-1: nth($spacers, 2) !default; // 4px +$spacer-2: nth($spacers, 3) !default; // 8px +$spacer-3: nth($spacers, 4) !default; // 16px +$spacer-4: nth($spacers, 5) !default; // 24px +$spacer-5: nth($spacers, 6) !default; // 32px +$spacer-6: nth($spacers, 7) !default; // 40px + +// Em spacer variables +$em-spacer-1: 0.0625em !default; // 1/16 +$em-spacer-2: 0.125em !default; // 1/8 +$em-spacer-3: 0.25em !default; // 1/4 +$em-spacer-4: 0.375em !default; // 3/8 +$em-spacer-5: 0.5em !default; // 1/2 +$em-spacer-6: 0.75em !default; // 3/4 + +// Fixed-width container variables +$container-width: 980px !default; +$grid-gutter: 10px !default; + +// Breakpoint widths +$width-xs: 0; +$width-sm: 544px; +$width-md: 768px; +$width-lg: 1012px; +$width-xl: 1280px; + +// Responsive container widths +$container-md: $width-md !default; +$container-lg: $width-lg !default; +$container-xl: $width-xl !default; + +// Breakpoints +$breakpoints: ( + // Small screen / phone + sm: $width-sm, + // Medium screen / tablet + md: $width-md, + // Large screen / desktop (980 + (16 * 2)) <= container + gutters + lg: $width-lg, + // Extra large screen / wide desktop + xl: $width-xl +) !default; + +$responsive-variants: ("": ""); +@each $key in map-keys($breakpoints) { + $responsive-variants: map-merge($responsive-variants, ($key: "-#{$key}")); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/misc.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/misc.scss new file mode 100644 index 000000000000..cd6414f533b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/misc.scss @@ -0,0 +1,40 @@ +// Miscellaneous variables +// stylelint-disable declaration-bang-space-before + +// Border size +$border-width: 1px !default; +$border-color: $border-gray !default; +$border-style: solid !default; +$border: $border-width $border-color $border-style !default; +$border-radius: 3px !default; + +// Custom explore grid border +$exploregrid-item-border-radius: 4px; + +// Box shadow +$box-shadow: 0 1px 1px rgba($black, 0.1) !default; +$box-shadow-medium: 0 1px 5px $black-fade-15 !default; +$box-shadow-large: 0 1px 15px $black-fade-15 !default; +$box-shadow-extra-large: 0 10px 50px rgba($black, 0.07) !default; + +// Tooltips +$tooltip-max-width: 250px !default; +$tooltip-background-color: $black; +$tooltip-text-color: $white !default; +$tooltip-delay: 0.4s !default; +$tooltip-duration: 0.1s !default; + +// Should be moved into custom github css +$stats-switcher-py: 10px; +// Future proof this `height` value by finding the computed line-height, then +// adding the total value of the vertical padding. This var is used to toggle +// between the stats bar and language breakdown. +$stats-viewport-height: ($body-font-size * $body-line-height) + ($stats-switcher-py * 2); + +$min_tab_size: 1; +$max_tab_size: 12; + +// Button and form variables +$form-control-shadow: inset 0 1px 2px rgba($black, 0.075); +$btn-input-focus-shadow: 0 0 0 0.2em rgba($blue, 0.3); +$btn-active-shadow: inset 0 0.15em 0.3em $black-fade-15; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/typography.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/typography.scss new file mode 100644 index 000000000000..c3d857317a0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-support/lib/variables/typography.scss @@ -0,0 +1,43 @@ +// Typography variables +// stylelint-disable declaration-bang-space-before + +// Heading sizes - mobile +// h4—h6 remain the same size on both mobile & desktop +$h00-size-mobile: 40px !default; +$h0-size-mobile: 32px !default; +$h1-size-mobile: 26px !default; +$h2-size-mobile: 22px !default; +$h3-size-mobile: 18px !default; + +// Heading sizes - desktop +$h00-size: 48px !default; +$h0-size: 40px !default; +$h1-size: 32px !default; +$h2-size: 24px !default; +$h3-size: 20px !default; +$h4-size: 16px !default; +$h5-size: 14px !default; +$h6-size: 12px !default; + +$font-size-small: 12px !default; + +// Font weights +$font-weight-bold: 600 !default; +$font-weight-semibold: 500 !default; +$font-weight-normal: 400 !default; +$font-weight-light: 300 !default; + +// Line heights +$lh-condensed-ultra: 1 !default; +$lh-condensed: 1.25 !default; +$lh-default: 1.5 !default; + +// Font stacks +$body-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default; + +// Monospace font stack +$mono-font: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace !default; + +// The base body size +$body-font-size: 14px !default; +$body-line-height: $lh-default !default; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/index.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/index.scss new file mode 100644 index 000000000000..307b6de06dfe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/index.scss @@ -0,0 +1,14 @@ +@import "primer-support/index.scss"; +// utilities +@import "./lib/animations.scss"; +@import "./lib/borders.scss"; +@import "./lib/box-shadow.scss"; +@import "./lib/colors.scss"; +@import "./lib/details.scss"; +@import "./lib/flexbox.scss"; +@import "./lib/layout.scss"; +@import "./lib/margin.scss"; +@import "./lib/padding.scss"; +@import "./lib/typography.scss"; +// Visibility and display should always come last in the imports so that they override other utilities with !important +@import "./lib/visibility-display.scss"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/animations.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/animations.scss new file mode 100644 index 000000000000..9b530d4fb3a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/animations.scss @@ -0,0 +1,184 @@ +// This file contains reusable animations for github. +// stylelint-disable primer/selector-no-utility + +/* Fade in an element */ +.anim-fade-in { + animation-name: fade-in; + animation-duration: 1s; + animation-timing-function: ease-in-out; + + &.fast { + animation-duration: 300ms; + } +} + +@keyframes fade-in { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +/* Fade out an element */ +.anim-fade-out { + animation-name: fade-out; + animation-duration: 1s; + animation-timing-function: ease-out; + + &.fast { + animation-duration: 0.3s; + } +} + +@keyframes fade-out { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +/* Fade in and slide up an element */ +.anim-fade-up { + opacity: 0; + animation-name: fade-up; + animation-duration: 0.3s; + animation-fill-mode: forwards; + animation-timing-function: ease-out; + animation-delay: 1s; +} + +@keyframes fade-up { + 0% { + opacity: 0.8; + transform: translateY(100%); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +/* Fade an element out and slide down */ +.anim-fade-down { + animation-name: fade-down; + animation-duration: 0.3s; + animation-fill-mode: forwards; + animation-timing-function: ease-in; +} + +@keyframes fade-down { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0.5; + transform: translateY(100%); + } +} + +/* Grow an element width from 0 to 100% */ +.anim-grow-x { + width: 0%; + animation-name: grow-x; + animation-duration: 0.3s; + animation-fill-mode: forwards; + animation-timing-function: ease; + animation-delay: 0.5s; +} + +@keyframes grow-x { + to { width: 100%; } +} + +/* Shrink an element from 100% to 0% */ +.anim-shrink-x { + animation-name: shrink-x; + animation-duration: 0.3s; + animation-fill-mode: forwards; + animation-timing-function: ease-in-out; + animation-delay: 0.5s; +} + +@keyframes shrink-x { + to { width: 0%; } +} + +/* Fade in an element and scale it fast */ +.anim-scale-in { + animation-name: scale-in; + animation-duration: 0.15s; + animation-timing-function: cubic-bezier(0.2, 0, 0.13, 1.5); +} + +@keyframes scale-in { + 0% { + opacity: 0; + transform: scale(0.5); + } + + 100% { + opacity: 1; + transform: scale(1); + } +} + +/* Pulse an element's opacity */ +.anim-pulse { + animation-name: pulse; + animation-duration: 2s; + animation-timing-function: linear; + animation-iteration-count: infinite; +} + +@keyframes pulse { + 0% { + opacity: 0.3; + } + + 10% { + opacity: 1; + } + + 100% { + opacity: 0.3; + } +} + +/* Pulse in an element */ +.anim-pulse-in { + animation-name: pulse-in; + animation-duration: 0.5s; +} + +@keyframes pulse-in { + 0% { + transform: scale3d(1, 1, 1); + } + + 50% { + transform: scale3d(1.1, 1.1, 1.1); + } + + 100% { + transform: scale3d(1, 1, 1); + } +} + +/* Increase scale of an element on hover */ +.hover-grow { + transition: transform 0.3s; + backface-visibility: hidden; + + &:hover { + transform: scale(1.025); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/borders.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/borders.scss new file mode 100644 index 000000000000..1b42ebd447fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/borders.scss @@ -0,0 +1,100 @@ +// Border utilities +// stylelint-disable block-opening-brace-space-before, primer/selector-no-utility, comment-empty-line-before + +/* Add a gray border on all sides */ +.border { border: $border !important; } + +/* Add a gray border to the left and right */ +.border-y { + border-top: $border !important; + border-bottom: $border !important; +} + +/* Remove borders from all sides */ +.border-0 { border: 0 !important; } + +.border-dashed { border-style: dashed !important; } + +/* Use with .border to turn the border blue */ +.border-blue { border-color: $border-blue !important; } +/* Use with .border to turn the border blue-light */ +.border-blue-light { border-color: $border-blue-light !important; } +/* Use with .border to turn the border green */ +.border-green { border-color: $border-green !important; } +/* Use with .border to turn the border green light */ +.border-green-light { border-color: $border-green-light !important; } +/* Use with .border to turn the border red */ +.border-red { border-color: $border-red !important; } +/* Use with .border to turn the border red-light */ +.border-red-light { border-color: $border-red-light !important; } +/* Use with .border to turn the border purple */ +.border-purple { border-color: $border-purple !important; } +/* Use with .border to turn the border yellow */ +.border-yellow { border-color: $border-yellow !important; } +/* Use with .border to turn the border gray-light */ +.border-gray-light { border-color: $border-gray-light !important; } +/* Use with .border to turn the border gray-dark */ +.border-gray-dark { border-color: $border-gray-dark !important; } +/* Use with .border to turn the border rgba black 0.15 */ +.border-black-fade { border-color: $border-black-fade !important; } + +$edges: ( + top: (top-left, top-right), + right: (top-right, bottom-right), + bottom: (bottom-right, bottom-left), + left: (bottom-left, top-left) +); + +@each $breakpoint, $variant in $responsive-variants { + @include breakpoint($breakpoint) { + /* Add a gray border */ + /* Add a gray border to the top */ + .border#{$variant}-top { border-top: $border !important; } + /* Add a gray border to the right */ + .border#{$variant}-right { border-right: $border !important; } + /* Add a gray border to the bottom */ + .border#{$variant}-bottom { border-bottom: $border !important; } + /* Add a gray border to the left */ + .border#{$variant}-left { border-left: $border !important; } + + /* Remove the top border */ + .border#{$variant}-top-0 { border-top: 0 !important; } + /* Remove the right border */ + .border#{$variant}-right-0 { border-right: 0 !important; } + /* Remove the bottom border */ + .border#{$variant}-bottom-0 { border-bottom: 0 !important; } + /* Remove the left border */ + .border#{$variant}-left-0 { border-left: 0 !important; } + + // Rounded corners + /* Remove the border-radius */ + .rounded#{$variant}-0 { border-radius: 0 !important; } + /* Add a border-radius to all corners */ + .rounded#{$variant}-1 { border-radius: $border-radius !important; } + /* Add a 2x border-radius to all corners */ + .rounded#{$variant}-2 { border-radius: $border-radius * 2 !important; } + + @each $edge, $corners in $edges { + .rounded#{$variant}-#{$edge}-0 { + @each $corner in $corners { + border-#{$corner}-radius: 0 !important; + } + } + + .rounded#{$variant}-#{$edge}-1 { + @each $corner in $corners { + border-#{$corner}-radius: $border-radius !important; + } + } + + .rounded#{$variant}-#{$edge}-2 { + @each $corner in $corners { + border-#{$corner}-radius: $border-radius * 2 !important; + } + } + } + } +} + +/* Add a 50% border-radius to make something into a circle */ +.circle { border-radius: 50% !important; } diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/box-shadow.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/box-shadow.scss new file mode 100644 index 000000000000..9093da305cfc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/box-shadow.scss @@ -0,0 +1,26 @@ +// Box shadow utilities +// stylelint-disable primer/selector-no-utility + +// Box shadows + +.box-shadow { + box-shadow: $box-shadow !important; +} + +.box-shadow-medium { + box-shadow: $box-shadow-medium !important; +} + +.box-shadow-large { + box-shadow: $box-shadow-large !important; +} + +.box-shadow-extra-large { + box-shadow: $box-shadow-extra-large !important; +} + +// Turn off box shadow + +.box-shadow-none { + box-shadow: none !important; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/colors.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/colors.scss new file mode 100644 index 000000000000..0f22a810d30e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/colors.scss @@ -0,0 +1,106 @@ +// Color utilities +// stylelint-disable block-opening-brace-space-before, primer/selector-no-utility +// stylelint-disable comment-empty-line-before + +// background colors +/* Set the background to $bg-white */ +.bg-white { background-color: $bg-white !important; } +/* Set the background to $bg-blue */ +.bg-blue { background-color: $bg-blue !important; } +/* Set the background to $bg-blue-light */ +.bg-blue-light { background-color: $bg-blue-light !important; } +/* Set the background to $bg-gray-dark */ +.bg-gray-dark { background-color: $bg-gray-dark !important; } +/* Set the background to $bg-gray */ +.bg-gray { background-color: $bg-gray !important; } +/* Set the background to $bg-gray-light */ +.bg-gray-light { background-color: $bg-gray-light !important; } +/* Set the background to $bg-green */ +.bg-green { background-color: $bg-green !important; } +/* Set the background to $bg-green-light */ +.bg-green-light { background-color: $bg-green-light !important; } +/* Set the background to $bg-red */ +.bg-red { background-color: $bg-red !important; } +/* Set the background to $bg-red-light */ +.bg-red-light { background-color: $bg-red-light !important; } +/* Set the background to $bg-yellow */ +.bg-yellow { background-color: $bg-yellow !important; } +/* Set the background to $bg-yellow-light */ +.bg-yellow-light { background-color: $bg-yellow-light !important; } +/* Set the background to $bg-purple */ +.bg-purple { background-color: $bg-purple !important; } +/* Set the background to $bg-purple-light */ +.bg-purple-light { background-color: $bg-purple-light !important; } + +.bg-shade-gradient { + background-image: linear-gradient(180deg, rgba($black, 0.065), rgba($black, 0)) !important; + background-repeat: no-repeat !important; + background-size: 100% 200px !important; +} + +// text colors +/* Set the text color to $text-blue */ +.text-blue { color: $text-blue !important; } +/* Set the text color to $text-red */ +.text-red { color: $text-red !important; } +/* Set the text color to $text-gray-light */ +.text-gray-light { color: $text-gray-light !important; } +/* Set the text color to $text-gray */ +.text-gray { color: $text-gray !important; } +/* Set the text color to $text-gray-dark */ +.text-gray-dark { color: $text-gray-dark !important; } +/* Set the text color to $text-green */ +.text-green { color: $text-green !important; } +/* Set the text color to $text-orange */ +.text-orange { color: $text-orange !important; } +/* Set the text color to $text-orange-light */ +.text-orange-light { color: $text-orange-light !important; } +/* Set the text color to $text-purple */ +.text-purple { color: $text-purple !important; } +/* Set the text color to $text-white */ +.text-white { color: $text-white !important; } +/* Set the text color to inherit */ +.text-inherit { color: inherit !important; } + +// Text states +// These can probably all be regular utilities +.text-pending { color: $yellow-800 !important; } +// Separate text and background colors in future to improve a11y +.bg-pending { color: $yellow-700 !important; } + +// Link colors +// Sets the links color to $text-gray and $text-blue on hover +.link-gray { + color: $text-gray !important; + + &:hover { + color: $text-blue !important; + } +} + +// Sets the links color to $text-gray-dark and $text-blue on hover +.link-gray-dark { + color: $text-gray-dark !important; + + &:hover { + color: $text-blue !important; + } +} + +/* Set the link color to $text-blue on hover + Useful when you want only part of a link to turn blue on hover */ +.link-hover-blue { + &:hover { + color: $text-blue !important; + } +} + +/* Make a link $text-gray, then $text-blue on hover and removes the underline */ +.muted-link { + color: $text-gray !important; + + &:hover { + color: $text-blue !important; + text-decoration: none; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/details.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/details.scss new file mode 100644 index 000000000000..32ad69eec2e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/details.scss @@ -0,0 +1,18 @@ +// stylelint-disable selector-max-type +.details-overlay[open] > summary::before { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 80; + display: block; + cursor: default; + content: " "; + background: transparent; +} + +.details-overlay-dark[open] > summary::before { + z-index: 99; + background: $black-fade-50; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/flexbox.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/flexbox.scss new file mode 100644 index 000000000000..63e5121f30d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/flexbox.scss @@ -0,0 +1,52 @@ +// Flex utility classes +// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before +// stylelint-disable comment-empty-line-before + +@each $breakpoint, $variant in $responsive-variants { + @include breakpoint($breakpoint) { + // Flexbox classes + // Container + .flex#{$variant}-row { flex-direction: row !important; } + .flex#{$variant}-row-reverse { flex-direction: row-reverse !important; } + .flex#{$variant}-column { flex-direction: column !important; } + + .flex#{$variant}-wrap { flex-wrap: wrap !important; } + .flex#{$variant}-nowrap { flex-wrap: nowrap !important; } + + .flex#{$variant}-justify-start { justify-content: flex-start !important; } + .flex#{$variant}-justify-end { justify-content: flex-end !important; } + .flex#{$variant}-justify-center { justify-content: center !important; } + .flex#{$variant}-justify-between { justify-content: space-between !important; } + .flex#{$variant}-justify-around { justify-content: space-around !important; } + + .flex#{$variant}-items-start { align-items: flex-start !important; } + .flex#{$variant}-items-end { align-items: flex-end !important; } + .flex#{$variant}-items-center { align-items: center !important; } + .flex#{$variant}-items-baseline { align-items: baseline !important; } + .flex#{$variant}-items-stretch { align-items: stretch !important; } + + .flex#{$variant}-content-start { align-content: flex-start !important; } + .flex#{$variant}-content-end { align-content: flex-end !important; } + .flex#{$variant}-content-center { align-content: center !important; } + .flex#{$variant}-content-between { align-content: space-between !important; } + .flex#{$variant}-content-around { align-content: space-around !important; } + .flex#{$variant}-content-stretch { align-content: stretch !important; } + + // Item + .flex#{$variant}-auto { flex: 1 1 auto !important; } + .flex#{$variant}-shrink-0 { flex-shrink: 0 !important; } + + .flex#{$variant}-self-auto { align-self: auto !important; } + .flex#{$variant}-self-start { align-self: flex-start !important; } + .flex#{$variant}-self-end { align-self: flex-end !important; } + .flex#{$variant}-self-center { align-self: center !important; } + .flex#{$variant}-self-baseline { align-self: baseline !important; } + .flex#{$variant}-self-stretch { align-self: stretch !important; } + + // Shorthand for equal width and height cols + .flex#{$variant}-item-equal { + flex-grow: 1; + flex-basis: 0; + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/layout.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/layout.scss new file mode 100644 index 000000000000..d5a4210c9f57 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/layout.scss @@ -0,0 +1,85 @@ +// Layout +// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before, primer/selector-no-utility +// stylelint-disable comment-empty-line-before + +/* Set position to static */ +.position-static { position: static !important; } +/* Set position to relative */ +.position-relative { position: relative !important; } +/* Set position to absolute */ +.position-absolute { position: absolute !important; } +/* Set position to fixed */ +.position-fixed { position: fixed !important; } + +/* Set top 0 */ +.top-0 { top: 0 !important; } +/* Set right 0 */ +.right-0 { right: 0 !important; } +/* Set bottom 0 */ +.bottom-0 { bottom: 0 !important; } +/* Set left 0 */ +.left-0 { left: 0 !important; } + +/* Vertical align middle */ +.v-align-middle { vertical-align: middle !important; } +/* Vertical align top */ +.v-align-top { vertical-align: top !important; } +/* Vertical align bottom */ +.v-align-bottom { vertical-align: bottom !important; } +/* Vertical align to the top of the text */ +.v-align-text-top { vertical-align: text-top !important; } +/* Vertical align to the bottom of the text */ +.v-align-text-bottom { vertical-align: text-bottom !important; } +/* Vertical align to the parent's baseline */ +.v-align-baseline { vertical-align: baseline !important; } + +// Overflow utilities +// overflow-hidden can also be used to create a new +// block formatting context or clear floats. +/* Set the overflow hidden */ +.overflow-hidden { overflow: hidden !important; } +/* Set the overflow scroll */ +.overflow-scroll { overflow: scroll !important; } +/* Set the overflow auto */ +.overflow-auto { overflow: auto !important; } + +// Clear floats +/* Clear floats around the element */ +.clearfix { + @include clearfix; +} + +// Floats +@each $breakpoint, $variant in $responsive-variants { + @include breakpoint($breakpoint) { + /* Float to the left */ + .float#{$variant}-left { float: left !important; } + /* Float to the right */ + .float#{$variant}-right { float: right !important; } + /* No float */ + .float#{$variant}-none { float: none !important; } + } +} + +// Width and height utilities, helpful in combination +// with display-table utilities and images +/* Max width 100% */ +.width-fit { max-width: 100% !important; } +/* Set the width to 100% */ +.width-full { width: 100% !important; } +/* Max height 100% */ +.height-fit { max-height: 100% !important; } +/* Set the height to 100% */ +.height-full { height: 100% !important; } + +/* Remove min-width from element */ +.min-width-0 { min-width: 0 !important; } + +@each $breakpoint, $variant in $responsive-variants { + @include breakpoint($breakpoint) { + /* Set the direction to rtl */ + .direction#{$variant}-rtl { direction: rtl !important; } + /* Set the direction to ltr */ + .direction#{$variant}-ltr { direction: ltr !important; } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/margin.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/margin.scss new file mode 100644 index 000000000000..c47fc14fbd25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/margin.scss @@ -0,0 +1,53 @@ +// Margin spacer utilities +// stylelint-disable block-opening-brace-space-before, declaration-colon-space-before, primer/selector-no-utility, comment-empty-line-before + +// Loop through the breakpoint values +@each $breakpoint, $variant in $responsive-variants { + @include breakpoint($breakpoint) { + // Loop through the spacer values + @for $i from 1 through length($spacers) { + $size: nth($spacers, $i); // sm, md, lg, xl + $scale: $i - 1; // 0, 1, 2, 3, 4, 5, 6 + + /* Set a $size margin to all sides at $breakpoint */ + .m#{$variant}-#{$scale} { margin: $size !important; } + /* Set a $size margin on the top at $breakpoint */ + .mt#{$variant}-#{$scale} { margin-top: $size !important; } + /* Set a $size margin on the right at $breakpoint */ + .mr#{$variant}-#{$scale} { margin-right: $size !important; } + /* Set a $size margin on the bottom at $breakpoint */ + .mb#{$variant}-#{$scale} { margin-bottom: $size !important; } + /* Set a $size margin on the left at $breakpoint */ + .ml#{$variant}-#{$scale} { margin-left: $size !important; } + + @if ($size != 0) { + /* Set a negative $size margin on top at $breakpoint */ + .mt#{$variant}-n#{$scale} { margin-top : -$size !important; } + /* Set a negative $size margin on the right at $breakpoint */ + .mr#{$variant}-n#{$scale} { margin-right : -$size !important; } + /* Set a negative $size margin on the bottom at $breakpoint */ + .mb#{$variant}-n#{$scale} { margin-bottom: -$size !important; } + /* Set a negative $size margin on the left at $breakpoint */ + .ml#{$variant}-n#{$scale} { margin-left : -$size !important; } + } + + /* Set a $size margin on the left & right at $breakpoint */ + .mx#{$variant}-#{$scale} { + margin-right: $size !important; + margin-left: $size !important; + } + + /* Set a $size margin on the top & bottom at $breakpoint */ + .my#{$variant}-#{$scale} { + margin-top: $size !important; + margin-bottom: $size !important; + } + } + + /* responsive horizontal auto margins */ + .mx#{$variant}-auto { + margin-right: auto !important; + margin-left: auto !important; + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/padding.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/padding.scss new file mode 100644 index 000000000000..bc3ba09c6dcc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/padding.scss @@ -0,0 +1,54 @@ +// Padding spacer utilities +// stylelint-disable block-opening-brace-space-before, declaration-colon-space-before +// stylelint-disable comment-empty-line-before + +// Responsive padding spacer utilities +@each $breakpoint, $variant in $responsive-variants { + @include breakpoint($breakpoint) { + // Loop through the spacer values + @for $i from 1 through length($spacers) { + $size: nth($spacers, $i); // xs, sm, md, lg, xl + $scale: $i - 1; // 0, 1, 2, 3, 4, 5, 6 + + /* Set a $size padding to all sides at $breakpoint */ + .p#{$variant}-#{$scale} { padding: $size !important; } + /* Set a $size padding to the top at $breakpoint */ + .pt#{$variant}-#{$scale} { padding-top: $size !important; } + /* Set a $size padding to the right at $breakpoint */ + .pr#{$variant}-#{$scale} { padding-right: $size !important; } + /* Set a $size padding to the bottom at $breakpoint */ + .pb#{$variant}-#{$scale} { padding-bottom: $size !important; } + /* Set a $size padding to the left at $breakpoint */ + .pl#{$variant}-#{$scale} { padding-left: $size !important; } + + /* Set a $size padding to the left & right at $breakpoint */ + .px#{$variant}-#{$scale} { + padding-right: $size !important; + padding-left: $size !important; + } + + /* Set a $size padding to the top & bottom at $breakpoint */ + .py#{$variant}-#{$scale} { + padding-top: $size !important; + padding-bottom: $size !important; + } + } + } +} + +// responsive padding for containers +// stylelint-disable-next-line primer/selector-no-utility +.p-responsive { + padding-right: $spacer-3 !important; + padding-left: $spacer-3 !important; + + @include breakpoint(sm) { + padding-right: $spacer-6 !important; + padding-left: $spacer-6 !important; + } + + @include breakpoint(lg) { + padding-right: $spacer-3 !important; + padding-left: $spacer-3 !important; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/typography.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/typography.scss new file mode 100644 index 000000000000..5d2fb03504a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/typography.scss @@ -0,0 +1,215 @@ +// stylelint-disable block-closing-brace-space-before, primer/selector-no-utility, selector-list-comma-newline-after +// stylelint-disable comment-empty-line-before +// Type scale variables found in primer-support/lib/variables.scss +// $h00-size-mobile: 40px; +// $h0-size-mobile: 32px; +// $h1-size-mobile: 26px; +// $h2-size-mobile: 22px; +// $h3-size-mobile: 18px; +// $h00-size: 48px; +// $h0-size: 40px; +// $h1-size: 32px; +// $h2-size: 24px; +// $h3-size: 20px; +// $h4-size: 16px; +// $h5-size: 14px; +// $h6-size: 12px; + +/* Set the font size to 26px */ +.h1 { + font-size: $h1-size-mobile !important; + + @include breakpoint(md) { font-size: $h1-size !important; } +} + +/* Set the font size to 22px */ +.h2 { + font-size: $h2-size-mobile !important; + + @include breakpoint(md) { font-size: $h2-size !important; } +} + +/* Set the font size to 18px */ +.h3 { + font-size: $h3-size-mobile !important; + + @include breakpoint(md) { font-size: $h3-size !important; } +} + +/* Set the font size to #{$h4-size} */ +.h4 { + font-size: $h4-size !important; +} + +/* Set the font size to #{$h5-size} */ +.h5 { font-size: $h5-size !important; } + +// Does not include color property like typography base +// styles, color should be applied with color utilities. +/* Set the font size to #{$h6-size} */ +.h6 { font-size: $h6-size !important; } + +// Heading utilities +.h1, .h2, .h3, .h4, .h5, .h6 { font-weight: $font-weight-bold !important; } + +// Type utilities that match type sale +/* Set the font size to 26px */ +.f1 { + font-size: $h1-size-mobile !important; + + @include breakpoint(md) { font-size: $h1-size !important; } +} + +/* Set the font size to 22px */ +.f2 { + font-size: $h2-size-mobile !important; + + @include breakpoint(md) { font-size: $h2-size !important; } +} + +/* Set the font size to 18px */ +.f3 { + font-size: $h3-size-mobile !important; + + @include breakpoint(md) { font-size: $h3-size !important; } +} + +/* Set the font size to #{$h4-size} */ +.f4 { + font-size: $h4-size !important; + + @include breakpoint(md) { font-size: $h4-size !important; } +} + +/* Set the font size to #{$h5-size} */ +.f5 { font-size: $h5-size !important; } +/* Set the font size to #{$h6-size} */ +.f6 { font-size: $h6-size !important; } + +// Type utils with light weight that match type scale +/* Set the font size to 40px and weight to light */ +.f00-light { + font-size: $h00-size-mobile !important; + font-weight: $font-weight-light !important; + + @include breakpoint(md) { font-size: $h00-size !important; } +} + +/* Set the font size to 32px and weight to light */ +.f0-light { + font-size: $h0-size-mobile !important; + font-weight: $font-weight-light !important; + + @include breakpoint(md) { font-size: $h0-size !important; } +} + +/* Set the font size to 26px and weight to light */ +.f1-light { + font-size: $h1-size-mobile !important; + font-weight: $font-weight-light !important; + + @include breakpoint(md) { font-size: $h1-size !important; } +} + +/* Set the font size to 22px and weight to light */ +.f2-light { + font-size: $h2-size-mobile !important; + font-weight: $font-weight-light !important; + + @include breakpoint(md) { font-size: $h2-size !important; } +} + +// Same size and weight as .lead but without color property +/* Set the font size to 18px and weight to light */ +.f3-light { + font-size: $h3-size-mobile !important; + font-weight: $font-weight-light !important; + + @include breakpoint(md) { font-size: $h3-size !important; } +} + +// Smallest text size +/* Set the font size to ${#h6-size} */ +.text-small { font-size: $h6-size !important; } // 12px + +/* Large leading paragraphs */ +.lead { + margin-bottom: 30px; + font-size: $h3-size; + font-weight: $font-weight-light; + color: $gray-600; +} + +// Line-height variations +// Close to commonly used line-heights. Most line-heights +// combined with type size equate to whole pixels. +// Will be improved with future typography scale updates. +/* Set the line height to ultra condensed */ +.lh-condensed-ultra { line-height: $lh-condensed-ultra !important; } +/* Set the line height to condensed */ +.lh-condensed { line-height: $lh-condensed !important; } +/* Set the line height to default */ +.lh-default { line-height: $lh-default !important; } +/* Set the line height to zero */ +.lh-0 { line-height: 0 !important; } + +// Text alignments +// Responsive text alignment +@each $breakpoint, $variant in $responsive-variants { + @include breakpoint($breakpoint) { + /* Text align to the right */ + .text#{$variant}-right { text-align: right !important; } + /* Text align to the left */ + .text#{$variant}-left { text-align: left !important; } + /* Text align to the center */ + .text#{$variant}-center { text-align: center !important; } + } +} + +// Text styles +/* Set the font weight to normal */ +.text-normal { font-weight: $font-weight-normal !important; } +/* Set the font weight to bold */ +.text-bold { font-weight: $font-weight-bold !important;} +/* Set the font to italic */ +.text-italic { font-style: italic !important; } +/* Make text uppercase */ +.text-uppercase { text-transform: uppercase !important; } +/* Underline text */ +.text-underline { text-decoration: underline !important; } +/* Don't underline text */ +.no-underline { text-decoration: none !important; } +/* Don't wrap white space */ +.no-wrap { white-space: nowrap !important; } +/* Normal white space */ +.ws-normal { white-space: normal !important; } +/* Allow long lines with no spaces to line break */ +.wb-break-all { word-break: break-all !important; } + +.text-emphasized { + font-weight: $font-weight-bold; + color: $text-gray-dark; +} + +// List styles +.list-style-none { list-style: none !important; } + +// Text Shadows +/* Add a dark text shadow */ +.text-shadow-dark { + text-shadow: 0 1px 1px rgba($black, 0.25), 0 1px 25px rgba($black, 0.75); +} +/* Add a light text shadow */ +.text-shadow-light { + text-shadow: 0 1px 0 rgba($white, 0.5); +} + +/* Set to monospace font */ +.text-mono { + font-family: $mono-font; +} + +/* Disallow user from selecting text */ +.user-select-none { + user-select: none !important; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/visibility-display.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/visibility-display.scss new file mode 100644 index 000000000000..879f7244a23c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/primer-utilities/lib/visibility-display.scss @@ -0,0 +1,87 @@ +// Visibility and display utilities +// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before, primer/selector-no-utility +// stylelint-disable comment-empty-line-before + +$display-values: ( + block, + flex, + inline, + inline-block, + inline-flex, + none, + table, + table-cell +); + +// Responsive display utilities +@each $breakpoint, $variant in $responsive-variants { + @include breakpoint($breakpoint) { + @each $display in $display-values { + .d#{$variant}-#{$display} { display: $display !important; } + } + } +} + +.v-hidden { visibility: hidden !important; } +.v-visible { visibility: visible !important; } + +// Hide utilities for each breakpoint +// Each hide utility only applies to one breakpoint range. +@media (max-width: $width-sm) { + .hide-sm { + display: none !important; + } +} + +@media (min-width: $width-sm) and (max-width: $width-md) { + .hide-md { + display: none !important; + } +} + +@media (min-width: $width-md) and (max-width: $width-lg) { + .hide-lg { + display: none !important; + } +} + +@media (min-width: $width-lg) { + .hide-xl { + display: none !important; + } +} + +/* Set the table-layout to fixed */ +.table-fixed { table-layout: fixed !important; } + +// Only display content to screen readers +// +// See: http://a11yproject.com/posts/how-to-hide-content/ +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + // Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1241631 + word-wrap: normal; + border: 0; +} + +// Only display content on focus +.show-on-focus { + position: absolute; + width: 1px; + height: 1px; + margin: 0; + overflow: hidden; + clip: rect(1px, 1px, 1px, 1px); + + &:focus { + z-index: 20; + width: auto; + height: auto; + clip: auto; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/rouge.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/rouge.scss new file mode 100644 index 000000000000..daf76adee989 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/_sass/rouge.scss @@ -0,0 +1,209 @@ +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight .cm { + color: #999988; + font-style: italic; +} +.highlight .cp { + color: #999999; + font-weight: bold; +} +.highlight .c1 { + color: #999988; + font-style: italic; +} +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; +} +.highlight .c, .highlight .cd { + color: #999988; + font-style: italic; +} +.highlight .err { + color: #a61717; + background-color: #e3d2d2; +} +.highlight .gd { + color: #000000; + background-color: #ffdddd; +} +.highlight .ge { + color: #000000; + font-style: italic; +} +.highlight .gr { + color: #aa0000; +} +.highlight .gh { + color: #999999; +} +.highlight .gi { + color: #000000; + background-color: #ddffdd; +} +.highlight .go { + color: #888888; +} +.highlight .gp { + color: #555555; +} +.highlight .gs { + font-weight: bold; +} +.highlight .gu { + color: #aaaaaa; +} +.highlight .gt { + color: #aa0000; +} +.highlight .kc { + color: #000000; + font-weight: bold; +} +.highlight .kd { + color: #000000; + font-weight: bold; +} +.highlight .kn { + color: #000000; + font-weight: bold; +} +.highlight .kp { + color: #000000; + font-weight: bold; +} +.highlight .kr { + color: #000000; + font-weight: bold; +} +.highlight .kt { + color: #445588; + font-weight: bold; +} +.highlight .k, .highlight .kv { + color: #000000; + font-weight: bold; +} +.highlight .mf { + color: #009999; +} +.highlight .mh { + color: #009999; +} +.highlight .il { + color: #009999; +} +.highlight .mi { + color: #009999; +} +.highlight .mo { + color: #009999; +} +.highlight .m, .highlight .mb, .highlight .mx { + color: #009999; +} +.highlight .sb { + color: #d14; +} +.highlight .sc { + color: #d14; +} +.highlight .sd { + color: #d14; +} +.highlight .s2 { + color: #d14; +} +.highlight .se { + color: #d14; +} +.highlight .sh { + color: #d14; +} +.highlight .si { + color: #d14; +} +.highlight .sx { + color: #d14; +} +.highlight .sr { + color: #009926; +} +.highlight .s1 { + color: #d14; +} +.highlight .ss { + color: #990073; +} +.highlight .s { + color: #d14; +} +.highlight .na { + color: #008080; +} +.highlight .bp { + color: #999999; +} +.highlight .nb { + color: #0086B3; +} +.highlight .nc { + color: #445588; + font-weight: bold; +} +.highlight .no { + color: #008080; +} +.highlight .nd { + color: #3c5d5d; + font-weight: bold; +} +.highlight .ni { + color: #800080; +} +.highlight .ne { + color: #990000; + font-weight: bold; +} +.highlight .nf { + color: #990000; + font-weight: bold; +} +.highlight .nl { + color: #990000; + font-weight: bold; +} +.highlight .nn { + color: #555555; +} +.highlight .nt { + color: #000080; +} +.highlight .vc { + color: #008080; +} +.highlight .vg { + color: #008080; +} +.highlight .vi { + color: #008080; +} +.highlight .nv { + color: #008080; +} +.highlight .ow { + color: #000000; + font-weight: bold; +} +.highlight .o { + color: #000000; + font-weight: bold; +} +.highlight .w { + color: #bbbbbb; +} +.highlight { + background-color: #f8f8f8; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/assets/css/style.scss new file mode 100644 index 000000000000..b3ff9eddde50 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-primer-0.5.4/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import "jekyll-theme-primer"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/README.md new file mode 100644 index 000000000000..f00ba4c4fd7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Slate theme + +[![Build Status](https://travis-ci.org/pages-themes/slate.svg?branch=master)](https://travis-ci.org/pages-themes/slate) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-slate.svg)](https://badge.fury.io/rb/jekyll-theme-slate) + +*Slate is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/slate), or even [use it today](#usage).* + +![Thumbnail of Slate](thumbnail.png) + +## Usage + +To use the Slate theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-slate + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Slate will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/slate/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/slate/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/slate/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Slate theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Slate? We'd love your help. Slate is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/slate`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..927a67f25f43 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/_layouts/default.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html lang="{{ site.lang | default: "en-US" }}"> + + <head> + <meta charset='utf-8'> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width,maximum-scale=2"> + <link rel="stylesheet" type="text/css" media="screen" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}"> + +{% seo %} + </head> + + <body> + + <!-- HEADER --> + <div id="header_wrap" class="outer"> + <header class="inner"> + <a id="forkme_banner" href="{{ site.github.repository_url }}">View on GitHub</a> + + <h1 id="project_title">{{ site.title | default: site.github.repository_name }}</h1> + <h2 id="project_tagline">{{ site.description | default: site.github.project_tagline }}</h2> + + {% if site.show_downloads %} + <section id="downloads"> + <a class="zip_download_link" href="{{ site.github.zip_url }}">Download this project as a .zip file</a> + <a class="tar_download_link" href="{{ site.github.tar_url }}">Download this project as a tar.gz file</a> + </section> + {% endif %} + </header> + </div> + + <!-- MAIN CONTENT --> + <div id="main_content_wrap" class="outer"> + <section id="main_content" class="inner"> + {{ content }} + </section> + </div> + + <!-- FOOTER --> + <div id="footer_wrap" class="outer"> + <footer class="inner"> + {% if site.github.is_project_page %} + <p class="copyright">{{ site.title | default: site.github.repository_name }} maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a></p> + {% endif %} + <p>Published with <a href="https://pages.github.com">GitHub Pages</a></p> + </footer> + </div> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/_sass/jekyll-theme-slate.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/_sass/jekyll-theme-slate.scss new file mode 100644 index 000000000000..f4cdc0d1afce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/_sass/jekyll-theme-slate.scss @@ -0,0 +1,474 @@ +@import "rouge-github"; + +/******************************************************************************* +MeyerWeb Reset +*******************************************************************************/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +ol, ul { + list-style: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/******************************************************************************* +Theme Styles +*******************************************************************************/ + +body { + box-sizing: border-box; + color:#373737; + background: #212121; + font-size: 16px; + font-family: 'Myriad Pro', Calibri, Helvetica, Arial, sans-serif; + line-height: 1.5; + -webkit-font-smoothing: antialiased; +} + +h1, h2, h3, h4, h5, h6 { + margin: 10px 0; + font-weight: 700; + color:#222222; + font-family: 'Lucida Grande', 'Calibri', Helvetica, Arial, sans-serif; + letter-spacing: -1px; +} + +h1 { + font-size: 36px; + font-weight: 700; +} + +h2 { + padding-bottom: 10px; + font-size: 32px; + background: url('../images/bg_hr.png') repeat-x bottom; +} + +h3 { + font-size: 24px; +} + +h4 { + font-size: 21px; +} + +h5 { + font-size: 18px; +} + +h6 { + font-size: 16px; +} + +p { + margin: 10px 0 15px 0; +} + +footer p { + color: #f2f2f2; +} + +a { + text-decoration: none; + color: #0F79D0; + text-shadow: none; + + transition: color 0.5s ease; + transition: text-shadow 0.5s ease; + -webkit-transition: color 0.5s ease; + -webkit-transition: text-shadow 0.5s ease; + -moz-transition: color 0.5s ease; + -moz-transition: text-shadow 0.5s ease; + -o-transition: color 0.5s ease; + -o-transition: text-shadow 0.5s ease; + -ms-transition: color 0.5s ease; + -ms-transition: text-shadow 0.5s ease; +} + +a:hover, a:focus { + text-decoration: underline; +} + +footer a { + color: #F2F2F2; + text-decoration: underline; +} + +em, cite { + font-style: italic; +} + +strong { + font-weight: bold; +} + +img { + position: relative; + margin: 0 auto; + max-width: 739px; + padding: 5px; + margin: 10px 0 10px 0; + border: 1px solid #ebebeb; + + box-shadow: 0 0 5px #ebebeb; + -webkit-box-shadow: 0 0 5px #ebebeb; + -moz-box-shadow: 0 0 5px #ebebeb; + -o-box-shadow: 0 0 5px #ebebeb; + -ms-box-shadow: 0 0 5px #ebebeb; +} + +p img { + display: inline; + margin: 0; + padding: 0; + vertical-align: middle; + text-align: center; + border: none; +} + +pre, code { + color: #222; + background-color: #fff; + + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + font-size: 14px; + + border-radius: 2px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} + +pre { + padding: 10px; + box-shadow: 0 0 10px rgba(0,0,0,.1); + overflow: auto; +} + +code { + padding: 3px; + margin: 0 3px; + box-shadow: 0 0 10px rgba(0,0,0,.1); +} + +pre code { + display: block; + box-shadow: none; +} + +blockquote { + color: #666; + margin-bottom: 20px; + padding: 0 0 0 20px; + border-left: 3px solid #bbb; +} + + +ul, ol, dl { + margin-bottom: 15px +} + +ul { + list-style-position: inside; + list-style: disc; + padding-left: 20px; +} + +ol { + list-style-position: inside; + list-style: decimal; + padding-left: 20px; +} + +dl dt { + font-weight: bold; +} + +dl dd { + padding-left: 20px; + font-style: italic; +} + +dl p { + padding-left: 20px; + font-style: italic; +} + +hr { + height: 1px; + margin-bottom: 5px; + border: none; + background: url('../images/bg_hr.png') repeat-x center; +} + +table { + border: 1px solid #373737; + margin-bottom: 20px; + text-align: left; + } + +th { + font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif; + padding: 10px; + background: #373737; + color: #fff; + } + +td { + padding: 10px; + border: 1px solid #373737; + } + +form { + background: #f2f2f2; + padding: 20px; +} + +/******************************************************************************* +Full-Width Styles +*******************************************************************************/ + +.outer { + width: 100%; +} + +.inner { + position: relative; + max-width: 640px; + padding: 20px 10px; + margin: 0 auto; +} + +#forkme_banner { + display: block; + position: absolute; + top:0; + right: 10px; + z-index: 10; + padding: 10px 50px 10px 10px; + color: #fff; + background: url('../images/blacktocat.png') #0090ff no-repeat 95% 50%; + font-weight: 700; + box-shadow: 0 0 10px rgba(0,0,0,.5); + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +#header_wrap { + background: #212121; + background: -moz-linear-gradient(top, #373737, #212121); + background: -webkit-linear-gradient(top, #373737, #212121); + background: -ms-linear-gradient(top, #373737, #212121); + background: -o-linear-gradient(top, #373737, #212121); + background: linear-gradient(to top, #373737, #212121); +} + +#header_wrap .inner { + padding: 50px 10px 30px 10px; +} + +#project_title { + margin: 0; + color: #fff; + font-size: 42px; + font-weight: 700; + text-shadow: #111 0px 0px 10px; +} + +#project_tagline { + color: #fff; + font-size: 24px; + font-weight: 300; + background: none; + text-shadow: #111 0px 0px 10px; +} + +#downloads { + position: absolute; + width: 210px; + z-index: 10; + bottom: -40px; + right: 0; + height: 70px; + background: url('../images/icon_download.png') no-repeat 0% 90%; +} + +.zip_download_link { + display: block; + float: right; + width: 90px; + height:70px; + text-indent: -5000px; + overflow: hidden; + background: url(../images/sprite_download.png) no-repeat bottom left; +} + +.tar_download_link { + display: block; + float: right; + width: 90px; + height:70px; + text-indent: -5000px; + overflow: hidden; + background: url(../images/sprite_download.png) no-repeat bottom right; + margin-left: 10px; +} + +.zip_download_link:hover { + background: url(../images/sprite_download.png) no-repeat top left; +} + +.tar_download_link:hover { + background: url(../images/sprite_download.png) no-repeat top right; +} + +#main_content_wrap { + background: #f2f2f2; + border-top: 1px solid #111; + border-bottom: 1px solid #111; +} + +#main_content { + padding-top: 40px; +} + +#footer_wrap { + background: #212121; +} + + + +/******************************************************************************* +Small Device Styles +*******************************************************************************/ + +@media screen and (max-width: 992px) { + img { + max-width: 100%; + } +} + +@media screen and (max-width: 480px) { + body { + font-size:14px; + } + + #downloads { + display: none; + } + + .inner { + min-width: 320px; + max-width: 480px; + } + + #project_title { + font-size: 32px; + } + + h1 { + font-size: 28px; + } + + h2 { + font-size: 24px; + } + + h3 { + font-size: 21px; + } + + h4 { + font-size: 18px; + } + + h5 { + font-size: 14px; + } + + h6 { + font-size: 12px; + } + + code, pre { + font-size: 11px; + } + +} + +@media screen and (max-width: 320px) { + body { + font-size:14px; + } + + #downloads { + display: none; + } + + .inner { + min-width: 240px; + max-width: 320px; + } + + #project_title { + font-size: 28px; + } + + h1 { + font-size: 24px; + } + + h2 { + font-size: 21px; + } + + h3 { + font-size: 18px; + } + + h4 { + font-size: 16px; + } + + h5 { + font-size: 14px; + } + + h6 { + font-size: 12px; + } + + code, pre { + min-width: 240px; + max-width: 320px; + font-size: 11px; + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/_sass/rouge-github.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/_sass/rouge-github.scss new file mode 100644 index 000000000000..bd7fc737cf46 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/_sass/rouge-github.scss @@ -0,0 +1,209 @@ +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight .cm { + color: #777772; + font-style: italic; +} +.highlight .cp { + color: #797676; + font-weight: bold; +} +.highlight .c1 { + color: #777772; + font-style: italic; +} +.highlight .cs { + color: #797676; + font-weight: bold; + font-style: italic; +} +.highlight .c, .highlight .cd { + color: #777772; + font-style: italic; +} +.highlight .err { + color: #a61717; + background-color: #e3d2d2; +} +.highlight .gd { + color: #000000; + background-color: #ffdddd; +} +.highlight .ge { + color: #000000; + font-style: italic; +} +.highlight .gr { + color: #aa0000; +} +.highlight .gh { + color: #797676; +} +.highlight .gi { + color: #000000; + background-color: #ddffdd; +} +.highlight .go { + color: #888888; +} +.highlight .gp { + color: #555555; +} +.highlight .gs { + font-weight: bold; +} +.highlight .gu { + color: #aaaaaa; +} +.highlight .gt { + color: #aa0000; +} +.highlight .kc { + color: #000000; + font-weight: bold; +} +.highlight .kd { + color: #000000; + font-weight: bold; +} +.highlight .kn { + color: #000000; + font-weight: bold; +} +.highlight .kp { + color: #000000; + font-weight: bold; +} +.highlight .kr { + color: #000000; + font-weight: bold; +} +.highlight .kt { + color: #445588; + font-weight: bold; +} +.highlight .k, .highlight .kv { + color: #000000; + font-weight: bold; +} +.highlight .mf { + color: #009999; +} +.highlight .mh { + color: #009999; +} +.highlight .il { + color: #009999; +} +.highlight .mi { + color: #009999; +} +.highlight .mo { + color: #009999; +} +.highlight .m, .highlight .mb, .highlight .mx { + color: #009999; +} +.highlight .sb { + color: #d14; +} +.highlight .sc { + color: #d14; +} +.highlight .sd { + color: #d14; +} +.highlight .s2 { + color: #d14; +} +.highlight .se { + color: #d14; +} +.highlight .sh { + color: #d14; +} +.highlight .si { + color: #d14; +} +.highlight .sx { + color: #d14; +} +.highlight .sr { + color: #009926; +} +.highlight .s1 { + color: #d14; +} +.highlight .ss { + color: #990073; +} +.highlight .s { + color: #d14; +} +.highlight .na { + color: #008080; +} +.highlight .bp { + color: #797676; +} +.highlight .nb { + color: #0086B3; +} +.highlight .nc { + color: #445588; + font-weight: bold; +} +.highlight .no { + color: #008080; +} +.highlight .nd { + color: #3c5d5d; + font-weight: bold; +} +.highlight .ni { + color: #800080; +} +.highlight .ne { + color: #990000; + font-weight: bold; +} +.highlight .nf { + color: #990000; + font-weight: bold; +} +.highlight .nl { + color: #990000; + font-weight: bold; +} +.highlight .nn { + color: #555555; +} +.highlight .nt { + color: #000080; +} +.highlight .vc { + color: #008080; +} +.highlight .vg { + color: #008080; +} +.highlight .vi { + color: #008080; +} +.highlight .nv { + color: #008080; +} +.highlight .ow { + color: #000000; + font-weight: bold; +} +.highlight .o { + color: #000000; + font-weight: bold; +} +.highlight .w { + color: #bbbbbb; +} +.highlight { + background-color: #f8f8f8; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..cdc2e1d200e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import "jekyll-theme-slate"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/bg_hr.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/bg_hr.png new file mode 100644 index 000000000000..514aee5056a3 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/bg_hr.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/blacktocat.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/blacktocat.png new file mode 100644 index 000000000000..e160053a5bfc Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/blacktocat.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/icon_download.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/icon_download.png new file mode 100644 index 000000000000..5a793f17688b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/icon_download.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/sprite_download.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/sprite_download.png new file mode 100644 index 000000000000..f9f8de24c1c4 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-slate-0.1.1/assets/images/sprite_download.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/README.md new file mode 100644 index 000000000000..f6d8d1ec1069 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Tactile theme + +[![Build Status](https://travis-ci.org/pages-themes/tactile.svg?branch=master)](https://travis-ci.org/pages-themes/tactile) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-tactile.svg)](https://badge.fury.io/rb/jekyll-theme-tactile) + +*Tactile is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/tactile), or even [use it today](#usage).* + +![Thumbnail of Tactile](thumbnail.png) + +## Usage + +To use the Tactile theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-tactile + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Tactile will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/tactile/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/tactile/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/tactile/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Tactile theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Tactile? We'd love your help. Tactile is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/tactile`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..395102d4759e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/_layouts/default.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html lang="{{ site.lang | default: "en-US" }}"> + <head> + <meta charset='utf-8'> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}"> + <link rel="stylesheet" type="text/css" href="{{ '/assets/css/print.css' | relative_url }}" media="print"> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + +{% seo %} + </head> + + <body> + <div id="container"> + <div class="inner"> + + <header> + <h1>{{ page.title | default: site.title | default: site.github.repository_name }}</h1> + <h2>{{ page.description | default: site.description | default: site.github.project_tagline }}</h2> + </header> + <section id="downloads" class="clearfix"> + {% if site.show_downloads %} + <a href="{{ site.github.zip_url }}" id="download-zip" class="button"><span>Download .zip</span></a> + <a href="{{ site.github.tar_url }}" id="download-tar-gz" class="button"><span>Download .tar.gz</span></a> + {% endif %} + {% if site.github.public %} + {% if site.github.is_project_page %} + <a href="{{ site.github.repository_url }}" id="view-on-github" class="button"><span>View on GitHub</span></a> + {% else %} + <a href="{{ site.github.owner_url }}" id="view-on-github" class="button"><span>View on GitHub</span></a> + {% endif %} + {% endif %} + </section> + <hr> + <section id="main_content"> + {{ content }} + </section> + + <footer> + {% if site.github.is_project_page %} + {{ site.title | default: site.github.repository_name }} is maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a><br> + {% endif %} + This page was generated by <a href="https://pages.github.com">GitHub Pages</a>. + </footer> + + </div> + </div> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/_sass/jekyll-theme-tactile.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/_sass/jekyll-theme-tactile.scss new file mode 100644 index 000000000000..c65fa878274f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/_sass/jekyll-theme-tactile.scss @@ -0,0 +1,376 @@ +@import "rouge-base16-dark"; +@import url('https://fonts.googleapis.com/css?family=Chivo:900'); + +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + padding: 0; + margin: 0; + font: inherit; + font-size: 100%; + vertical-align: baseline; + border: 0; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-spacing: 0; + border-collapse: collapse; +} + +/* LAYOUT STYLES */ +body { + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 1em; + line-height: 1.5; + color: #6d6d6d; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); + background: #e7e7e7 url(../images/body-bg.png) 0 0 repeat; +} + +a { + color: #d5000d; +} +a:hover { + color: #c5000c; +} + +header { + padding-top: 35px; + padding-bottom: 25px; +} + +header h1 { + font-family: 'Chivo', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 48px; font-weight: 900; + line-height: 1.2; + color: #303030; + letter-spacing: -1px; +} + +header h2 { + font-size: 24px; + font-weight: normal; + line-height: 1.3; + color: #aaa; + letter-spacing: -1px; +} + +#container { + min-height: 595px; + background: transparent url(../images/highlight-bg.jpg) 50% 0 no-repeat; +} + +.inner { + width: 620px; + margin: 0 auto; +} + +#container .inner img { + max-width: 100%; +} + +#downloads { + margin-bottom: 40px; +} + +a.button { + display: block; + float: left; + width: 179px; + padding: 12px 8px 12px 8px; + margin-right: 14px; + font-size: 15px; + font-weight: bold; + line-height: 25px; + color: #303030; + background: #fdfdfd; /* Old browsers */ + background: -moz-linear-gradient(top, #fdfdfd 0%, #f2f2f2 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f2f2f2)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* IE10+ */ + background: linear-gradient(to top, #fdfdfd 0%,#f2f2f2 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f2f2f2',GradientType=0 ); /* IE6-9 */ + border-top: solid 1px #cbcbcb; + border-right: solid 1px #b7b7b7; + border-bottom: solid 1px #b3b3b3; + border-left: solid 1px #b7b7b7; + border-radius: 30px; + -webkit-box-shadow: 10px 10px 5px #888; + -moz-box-shadow: 10px 10px 5px #888; + box-shadow: 0px 1px 5px #e8e8e8; + -moz-border-radius: 30px; + -webkit-border-radius: 30px; +} +a.button:hover { + background: #fafafa; /* Old browsers */ + background: -moz-linear-gradient(top, #fdfdfd 0%, #f6f6f6 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f6f6f6)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* IE10+ */ + background: linear-gradient(to top, #fdfdfd 0%,#f6f6f6, 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f6f6f6',GradientType=0 ); /* IE6-9 */ + border-top: solid 1px #b7b7b7; + border-right: solid 1px #b3b3b3; + border-bottom: solid 1px #b3b3b3; + border-left: solid 1px #b3b3b3; +} + +a.button span { + display: block; + height: 23px; + padding-left: 50px; +} + +#download-zip span { + background: transparent url(../images/zip-icon.png) 12px 50% no-repeat; +} +#download-tar-gz span { + background: transparent url(../images/tar-gz-icon.png) 12px 50% no-repeat; +} +#view-on-github span { + background: transparent url(../images/octocat-icon.png) 12px 50% no-repeat; +} +#view-on-github { + margin-right: 0; +} + +code, pre { + margin-bottom: 30px; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; + font-size: 14px; + color: #222; +} + +code { + padding: 0 3px; + background-color: #f2f2f2; + border: solid 1px #ddd; +} + +pre { + padding: 20px; + overflow: auto; + color: #f2f2f2; + text-shadow: none; + background: #303030; +} +pre code { + padding: 0; + color: #f2f2f2; + background-color: #303030; + border: none; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +hr { + height: 1px; + padding-bottom: 1em; + margin-top: 1em; + line-height: 1px; + background: transparent url('../images/hr.png') 50% 0 no-repeat; + border: none; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + font-weight: 300; + text-align: center; + border: 1px solid #ebebeb; +} + +form { + padding: 20px; + background: #f2f2f2; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +h1 { + font-size: 32px; +} + +h2 { + margin-bottom: 8px; + font-size: 22px; + font-weight: bold; + color: #303030; +} + +h3 { + margin-bottom: 8px; + font-size: 18px; + font-weight: bold; + color: #d5000d; +} + +h4 { + font-size: 16px; + font-weight: bold; + color: #303030; +} + +h5 { + font-size: 1em; + color: #303030; +} + +h6 { + font-size: .8em; + color: #303030; +} + +p { + margin-bottom: 20px; + font-weight: 300; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + padding: 0 0 0 30px; + margin-bottom: 20px; + font-size: 1.6em; + border-left: 10px solid #e9e9e9; +} + +ul li { + list-style-position: inside; + list-style: disc; + padding-left: 20px; +} + +ol li { + list-style-position: inside; + list-style: decimal; + padding-left: 3px; +} + +dl dt { + color: #303030; +} + +footer { + padding-top: 20px; + padding-bottom: 30px; + margin-top: 40px; + font-size: 13px; + color: #aaa; + background: transparent url('../images/hr.png') 0 0 no-repeat; +} + +footer a { + color: #666; +} +footer a:hover { + color: #444; +} + +/* MISC */ +.clearfix:after { + display: block; + height: 0; + clear: both; + visibility: hidden; + content: '.'; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} + +/* #Media Queries +================================================== */ + +/* Smaller than standard 960 (devices and browsers) */ +@media only screen and (max-width: 959px) { } + +/* Tablet Portrait size to standard 960 (devices and browsers) */ +@media only screen and (min-width: 768px) and (max-width: 959px) { } + +/* All Mobile Sizes (devices and browser) */ +@media only screen and (max-width: 767px) { + header { + padding-top: 10px; + padding-bottom: 10px; + } + #downloads { + margin-bottom: 25px; + } + #download-zip, #download-tar-gz { + display: none; + } + .inner { + width: 94%; + margin: 0 auto; + } +} + +/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ +@media only screen and (min-width: 480px) and (max-width: 767px) { } + +/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ +@media only screen and (max-width: 479px) { } diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/_sass/rouge-base16-dark.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/_sass/rouge-base16-dark.scss new file mode 100644 index 000000000000..c303bd5847d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/_sass/rouge-base16-dark.scss @@ -0,0 +1,81 @@ +/* + generated by rouge http://rouge.jneen.net/ + original base16 by Chris Kempson (https://github.com/chriskempson/base16) +*/ + +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight, .highlight .w { + color: #d0d0d0; +} +.highlight .err { + color: #151515; + background-color: #ac4142; +} +.highlight .c, .highlight .cd, .highlight .cm, .highlight .c1, .highlight .cs { + color: #888; +} +.highlight .cp { + color: #f4bf75; +} +.highlight .nt { + color: #f4bf75; +} +.highlight .o, .highlight .ow { + color: #d0d0d0; +} +.highlight .p, .highlight .pi { + color: #d0d0d0; +} +.highlight .gi { + color: #90a959; +} +.highlight .gd { + color: #ac4142; +} +.highlight .gh { + color: #6a9fb5; + font-weight: bold; +} +.highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv { + color: #aa759f; +} +.highlight .kc { + color: #d28445; +} +.highlight .kt { + color: #d28445; +} +.highlight .kd { + color: #d28445; +} +.highlight .s, .highlight .sb, .highlight .sc, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 { + color: #90a959; +} +.highlight .sr { + color: #75b5aa; +} +.highlight .si { + color: #8f5536; +} +.highlight .se { + color: #8f5536; +} +.highlight .nn { + color: #f4bf75; +} +.highlight .nc { + color: #f4bf75; +} +.highlight .no { + color: #f4bf75; +} +.highlight .na { + color: #6a9fb5; +} +.highlight .m, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mb, .highlight .mx { + color: #90a959; +} +.highlight .ss { + color: #90a959; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/css/print.css b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/css/print.css new file mode 100644 index 000000000000..4b19b67d136b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/css/print.css @@ -0,0 +1,228 @@ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + padding: 0; + margin: 0; + font: inherit; + font-size: 100%; + vertical-align: baseline; + border: 0; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +body { + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 13px; + line-height: 1.5; + color: #000; +} + +a { + font-weight: bold; + color: #d5000d; +} + +header { + padding-top: 35px; + padding-bottom: 10px; +} + +header h1 { + font-size: 48px; + font-weight: bold; + line-height: 1.2; + color: #303030; + letter-spacing: -1px; +} + +header h2 { + font-size: 24px; + font-weight: normal; + line-height: 1.3; + color: #aaa; + letter-spacing: -1px; +} +#downloads { + display: none; +} +#main_content { + padding-top: 20px; +} + +code, pre { + margin-bottom: 30px; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; + font-size: 12px; + color: #222; +} + +code { + padding: 0 3px; +} + +pre { + padding: 20px; + overflow: auto; + border: solid 1px #ddd; +} +pre code { + padding: 0; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + font-weight: 300; + text-align: center; + border: 1px solid #ebebeb; +} + +form { + padding: 20px; + background: #f2f2f2; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +h1 { + font-size: 2.8em; +} + +h2 { + margin-bottom: 8px; + font-size: 22px; + font-weight: bold; + color: #303030; +} + +h3 { + margin-bottom: 8px; + font-size: 18px; + font-weight: bold; + color: #d5000d; +} + +h4 { + font-size: 16px; + font-weight: bold; + color: #303030; +} + +h5 { + font-size: 1em; + color: #303030; +} + +h6 { + font-size: .8em; + color: #303030; +} + +p { + margin-bottom: 20px; + font-weight: 300; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + padding: 0 0 0 30px; + margin-bottom: 20px; + font-size: 1.6em; + border-left: 10px solid #e9e9e9; +} + +ul li { + list-style-position: inside; + list-style: disc; + padding-left: 20px; +} + +ol li { + list-style-position: inside; + list-style: decimal; + padding-left: 3px; +} + +dl dd { + font-style: italic; + font-weight: 100; +} + +footer { + padding-top: 20px; + padding-bottom: 30px; + margin-top: 40px; + font-size: 13px; + color: #aaa; +} + +footer a { + color: #666; +} + +/* MISC */ +.clearfix:after { + display: block; + height: 0; + clear: both; + visibility: hidden; + content: '.'; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..1b2dbbfb7d55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import "jekyll-theme-tactile"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/body-bg.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/body-bg.png new file mode 100644 index 000000000000..5e8c4c29f9d7 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/body-bg.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/highlight-bg.jpg b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/highlight-bg.jpg new file mode 100644 index 000000000000..355e089b2d7d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/highlight-bg.jpg differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/hr.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/hr.png new file mode 100644 index 000000000000..d32f689cf418 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/hr.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/octocat-icon.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/octocat-icon.png new file mode 100644 index 000000000000..24066080022d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/octocat-icon.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/tar-gz-icon.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/tar-gz-icon.png new file mode 100644 index 000000000000..502e67d46153 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/tar-gz-icon.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/zip-icon.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/zip-icon.png new file mode 100644 index 000000000000..732aced6031d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-tactile-0.1.1/assets/images/zip-icon.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/LICENSE new file mode 100644 index 000000000000..670154e35388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +<http://creativecommons.org/publicdomain/zero/1.0/> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/README.md new file mode 100644 index 000000000000..d711fd2f80e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/README.md @@ -0,0 +1,109 @@ +# The Time machine theme + +[![Build Status](https://travis-ci.org/pages-themes/time-machine.svg?branch=master)](https://travis-ci.org/pages-themes/time-machine) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-time-machine.svg)](https://badge.fury.io/rb/jekyll-theme-time-machine) + +*Time machine is a Jekyll theme for GitHub Pages. You can [preview the theme to see what it looks like](http://pages-themes.github.io/time-machine), or even [use it today](#usage).* + +![Thumbnail of Time machine](thumbnail.png) + +## Usage + +To use the Time machine theme: + +1. Add the following to your site's `_config.yml`: + + ```yml + theme: jekyll-theme-time-machine + ``` + +2. Optionally, if you'd like to preview your site on your computer, add the following to your site's `Gemfile`: + + ```ruby + gem "github-pages", group: :jekyll_plugins + ``` + +## Customizing + +### Configuration variables + +Time machine will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +show_downloads: ["true" or "false" to indicate whether to provide a download URL] +google_analytics: [Your Google Analytics tracking ID] +``` + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. [Copy the original template](https://github.com/pages-themes/time-machine/blob/master/_layouts/default.html) from the theme's repository<br />(*Pro-tip: click "raw" to make copying easier*) +2. Create a file called `/_layouts/default.html` in your site +3. Paste the default layout content copied in the first step +4. Customize the layout as you'd like + +### Overriding GitHub-generated URLs + +Templates often rely on URLs supplied by GitHub such as links to your repository or links to download your project. If you'd like to override one or more default URLs: + +1. Look at [the template source](https://github.com/pages-themes/time-machine/blob/master/_layouts/default.html) to determine the name of the variable. It will be in the form of `{{ site.github.zip_url }}`. +2. Specify the URL that you'd like the template to use in your site's `_config.yml`. For example, if the variable was `site.github.url`, you'd add the following: + ```yml + github: + zip_url: http://example.com/download.zip + another_url: another value + ``` +3. When your site is built, Jekyll will use the URL you specified, rather than the default one provided by GitHub. + +*Note: You must remove the `site.` prefix, and each variable name (after the `github.`) should be indent with two space below `github:`.* + +For more information, see [the Jekyll variables documentation](https://jekyllrb.com/docs/variables/). + +## Roadmap + +See the [open issues](https://github.com/pages-themes/time-machine/issues) for a list of proposed features (and known issues). + +## Project philosophy + +The Time machine theme is intended to make it quick and easy for GitHub Pages users to create their first (or 100th) website. The theme should meet the vast majority of users' needs out of the box, erring on the side of simplicity rather than flexibility, and provide users the opportunity to opt-in to additional complexity if they have specific needs or wish to further customize their experience (such as adding custom CSS or modifying the default layout). It should also look great, but that goes without saying. + +## Contributing + +Interested in contributing to Time machine? We'd love your help. Time machine is an open source project, built one contribution at a time by users like you. See [the CONTRIBUTING file](docs/CONTRIBUTING.md) for instructions on how to contribute. + +### Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/pages-themes/time-machine`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +### Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` one before the test script will work. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_layouts/default.html new file mode 100644 index 000000000000..3987eeb169d2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_layouts/default.html @@ -0,0 +1,75 @@ +<!doctype html> +<!-- The Time Machine GitHub pages theme was designed and developed by Jon Rohan, on Feb 7, 2012. --> +<!-- Follow him for fun. http://twitter.com/jonrohan. Tail his code on https://github.com/jonrohan --> +<html lang="{{ site.lang | default: "en-US" }}"> +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + + <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}"> + <script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script> + <script src="{{ '/assets/js/script.js' | relative_url }}"></script> + +{% seo %} + +</head> + +<body> + + <div class="wrapper"> + <header> + <h1 class="title">{{ site.title | default: site.github.repository_name }}</h1> + </header> + <div id="container"> + <p class="tagline">{{ site.description | default: site.github.project_tagline }}</p> + <div id="main" role="main"> + <div class="download-bar"> + <div class="inner"> + {% if site.show_downloads %} + <a href="{{ site.github.tar_url }}" class="download-button tar"><span>Download</span></a> + <a href="{{ site.github.zip_url }}" class="download-button zip"><span>Download</span></a> + {% endif %} + <a href="{{ site.github.repository_url }}" class="code">View {{ site.title | default: site.github.repository_name }} on GitHub</a> + </div> + <span class="blc"></span><span class="trc"></span> + </div> + <article class="markdown-body"> + {{ content }} + </article> + </div> + </div> + <footer> + <div class="owner"> + {% if site.github.is_project_page %} + <p><a href="{{ site.github.owner_url }}" class="avatar"><img src="{{ site.github.owner_gravatar_url }}" width="48" height="48"></a> <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a> maintains <a href="{{ site.github.repository_url }}">{{ site.title | default: site.github.repository_name }}</a></p> + {% endif %} + + {% if site.github.is_user_page %} + <p><a href="{{ site.github.owner_url }}" class="avatar"><img src="{{ site.github.owner_gravatar_url }}" width="48" height="48"></a>View <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a> on <a href="https://www.github.com">GitHub</a></p> + {% endif %} + + </div> + <div class="creds"> + <small>This page generated using <a href="https://pages.github.com/">GitHub Pages</a><br>theme by <a href="https://twitter.com/jonrohan/">Jon Rohan</a></small> + </div> + </footer> + </div> + <div class="current-section"> + <a href="#top">Scroll to top</a> + <a href="{{ site.github.tar_url }}" class="tar">tar</a><a href="{{ site.github.zip_url }}" class="zip">zip</a><a href="" class="code">source code</a> + <p class="name"></p> + </div> + + {% if site.google_analytics %} + <script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); + </script> + {% endif %} +</body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_sass/jekyll-theme-time-machine.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_sass/jekyll-theme-time-machine.scss new file mode 100644 index 000000000000..e868e57e3c66 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_sass/jekyll-theme-time-machine.scss @@ -0,0 +1,485 @@ +@import "normalize"; + +/* Style */ + +body { + font-size: 15px; + font-family: Arial, Arial, Helvetica, sans-serif; + line-height: 1.5; + background: #D1D1D1; +} + +a { + color: #63a52a; + text-decoration: none; + transition: opacity ease-in-out 0.3s; + -webkit-transition: opacity ease-in-out 0.3s; /* Safari <=6.1, Android <= 4.3 */ +} + +a:hover { + text-decoration: underline; + color: #90D355; +} + +code, pre { + font-family: 'Monaco', 'Lucida Console', monospace; +} + +h1.title { + margin: 30px 20px 10px; + font-size: 60px; + font-weight: bold; + font-style: italic; + font-family:Georgia, serif; + text-align: center; +} + +.wrapper { + width: 675px; + margin: 0 auto; +} + +#container { + border: 1px solid #2a2a2a; + background: #ddd url(../images/pattern.png); + box-shadow: 0 0 5px #b1b1b1; +} + +p.tagline { + padding: 20px 20px 0; + color: #fff; + font-size: 17px; +} + +#main { + margin-top: 20px; + padding: 0 20px 90px; + background-color: #fff; +} + +.download-bar { + background: #222; + border: 5px solid #444; + padding: 10px; + margin: 0 -35px 20px; + position: relative; +} + +.download-bar .inner { + overflow: hidden; +} + +.download-bar .watch-fork iframe { + display: block; + float: left; + border-right: 1px solid #ddd; + padding-right: 5px; +} +.download-bar .watch-fork iframe.last { + border-right: 0 none; + padding-right: 0; + padding-left: 5px; + border-left: 1px solid #fff; +} +.download-bar .watch-fork { + overflow: hidden; + float: right; + background-color: #eee; + padding: 5px; + border-radius: 3px; +} + +.download-bar .blc { + border: 10px solid black; + border-color: transparent transparent black; + width: 0; + height: 0; + display: block; + position: absolute; + bottom: -15px; + left: 0; + transform: rotate(45deg); + -ms-transform: rotate(45deg); /* IE9 */ + -webkit-transform: rotate(45deg); /* 2014 current */ +} + +.download-bar .trc { + border: 10px solid black; + border-color: black transparent transparent; + width: 0; + height: 0; + display: block; + position: absolute; + top: -15px; + right: 0; + transform: rotate(45deg); + -ms-transform: rotate(45deg); /* IE9 */ + -webkit-transform: rotate(45deg); /* 2014 current */ +} + +.download-bar .avatar { + border: 1px solid black; + display: block; + padding: 4px; + float: left; +} + +.download-bar .avatar img { + display: block; +} + +.download-bar a.code { + background: transparent url(../images/code.png) no-repeat 0 2px; + padding-left: 35px; + margin-top: 8px; + display: block; + float: left; + text-indent: 0; + width: auto; + height: auto; + opacity: 1; + filter:alpha(opacity=100); /* IE 5-7 */ +} + +.current-section { + position: fixed; + top: 0; + left: 50%; + width: 693px; + margin-left: -352px; + background: #222; + border: 5px solid #444; + color: #fff; + opacity: 0; + visibility: hidden; + transition: opacity ease-in-out 0.3s; + -webkit-transition: opacity ease-in-out 0.3s; /* Safari <=6.1, Android <= 4.3 */ +} + +.current-section p { + padding: 5px 27px; + font-size: 24px; + font-weight: bold; +} + +.current-section a { + float: right; + text-indent: -10000px; + background: transparent url(../images/top.png) no-repeat 0 0; + width: 20px; + height: 20px; + opacity: 0.8; + margin-right: 12px; + margin-top: 12px; + opacity: 0.8; + filter:alpha(opacity=80); /* IE 5-7 */ + transition: opacity ease-in-out 0.3s; + -webkit-transition: opacity ease-in-out 0.3s; /* Safari <=6.1, Android <= 4.3 */ +} + +.current-section a:hover { + opacity: 1; + filter:alpha(opacity=100); /* IE 5-7 */ +} + +.current-section a.zip { + margin-right: 8px; +} + +a.zip, +a.zip span { + background: transparent url(../images/zip.png) no-repeat 0 0; + width: 30px; + height: 21px; + display: inline-block; + text-indent: -10000px; + opacity: 0.8; + filter:alpha(opacity=80); /* IE 5-7 */ + transition: opacity ease-in-out 0.3s; + -webkit-transition: opacity ease-in-out 0.3s; /* Safari <=6.1, Android <= 4.3 */ +} + +a.tar, +a.tar span { + background: transparent url(../images/tar.png) no-repeat 0 0; + width: 30px; + height: 21px; + display: inline-block; + text-indent: -10000px; + opacity: 0.8; + filter:alpha(opacity=80); /* IE 5-7 */ + transition: opacity ease-in-out 0.3s; + -webkit-transition: opacity ease-in-out 0.3s; /* Safari <=6.1, Android <= 4.3 */ +} + +a.code { + background: transparent url(../images/code.png) no-repeat 0 2px; + width: 30px; + height: 21px; + display: block; + display: inline-block; + text-indent: -10000px; + opacity: 0.8; + filter:alpha(opacity=80); /* IE 5-7 */ + transition: opacity ease-in-out 0.3s; + -webkit-transition: opacity ease-in-out 0.3s; /* Safari <=6.1, Android <= 4.3 */ +} + +a.zip:hover, +a.tar:hover, +a.code:hover { + opacity: 1; + filter:alpha(opacity=100); +} + +a.download-button { + border: 1px solid black; + border-radius: 3px; + display: inline-block; + text-indent: 0!important; + width: auto; + float: right; + background: #999; /* for non-css3 browsers */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#37ADD4', endColorstr='#1B657E'); /* IE <= 9 */ + background: -webkit-gradient(linear, left top, left bottom, from(#37ADD4), to(#1B657E)); /* ancient webkit browsers */ + background: -webkit-linear-gradient(top, #37ADD4, #1B657E); /* Safari <=6.1, Android <= 4.3 */ + background: linear-gradient(to bottom, #37ADD4, #1B657E); + height: auto; + margin-left: 10px; +} + +a.download-button span { + background-position: 10px 5px; + width: auto; + height: auto; + padding: 5px 10px; + padding-left: 45px; + display: inline-block; + text-indent: 0!important; + color: #fff; +} + +footer { + margin-bottom: 60px; + padding-bottom: 60px; +} + +footer .owner { + background: #222; + border: 5px solid #444; + padding: 5px 15px; + margin: -67px -10px 35px; + color: #d6d6d6; +} + +footer .creds small { + float: right; + font-size: 10px; + text-align: right; + margin-left: 15px; +} + +footer .owner .avatar { + background-color: #666; + display: block; + margin: -19px 10px 0 0; + width: 60px; + float: left; +} + +footer .owner img { + display: block; + border: 1px solid #2a2a2a; + margin: 5px; +} + +footer .owner p { + font-family:Georgia, serif; +} + +footer .owner p a { + font-size: 16px; + font-style: italic; +} + +/* Markdown */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6, +.markdown-body p, +.markdown-body pre, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body blockquote { + margin-bottom: 20px; +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + font-weight: bold; +} + +.markdown-body h1 { + font-size: 28px; +} + +.markdown-body h2 { + font-size: 24px; + color: #557398; +} + +.markdown-body h3 { + font-size: 20px; +} + +.markdown-body h4 { + font-size: 18px; +} + +.markdown-body h5 { + font-size: 16px; +} + +.markdown-body pre { + padding: 10px 70px 10px 0; + margin-left: -20px; + margin-right: -20px; + font-family: 'Monaco', 'Lucida Console', monospace; + font-size: 13px; + line-height: 20px; + box-shadow: inset 0 0 5px #000; + word-wrap: break-word; + background-color:#3b3b3b; + color: #d6d6d6; +} + +.markdown-body pre.lines { + font-size: 12px; + margin:0 10px 0 -20px; + padding: 10px; + float: left; + display: block; + text-align: right; + box-shadow: none; + background-color:#2a2a2a; + color: #d6d6d6; +} + +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +.markdown-body ul { + list-style-type: disc; +} + +.markdown-body ol { + list-style-type: decimal; +} + +.markdown-body li, +.markdown-body li p, +.markdown-body dd, +.markdown-body dd p { + margin-bottom: 10px; +} + +.markdown-body li pre, +.markdown-body li pre.lines, +.markdown-body dd pre, +.markdown-body dd pre.lines { + margin-left: -35px; +} + +.markdown-body dt { + font-weight: bold; + font-style: italic; +} + +.markdown-body dd { + margin-left: 15px; +} + +.markdown-body table { + width: 673px; + margin-left: -20px; + margin-right: -20px; +} + +.markdown-body tbody { + border-top: 2px solid #557398; + border-bottom: 2px solid #557398; + background-color: #EBEFF4; +} + +.markdown-body table td * { + margin: 0; +} + +.markdown-body td { + border-right: 1px solid #557398; + border-bottom: 1px solid #557398; + padding: 5px; +} + +.markdown-body td:first-child, +.markdown-body th:first-child { + width: 30%; + padding-left: 20px; +} + +.markdown-body td:last-child { + border-right: 0 none; +} + +.markdown-body th { + font-size: 18px; + font-weight: bold; + text-align: left; + padding: 5px; +} + +.markdown-body tt { + background-color:#3b3b3b; + color: #d6d6d6; + padding: 2px 3px; +} + +.markdown-body blockquote { + font-style: italic; + font-family:Georgia, serif; + font-size: 17px; + border-top: 3px solid #333; + border-bottom: 3px solid #333; + padding: 10px 20px; + padding-left: 50px; +} + +.markdown-body blockquote:before { + font-style: italic; + font-family: Georgia, serif; + font-size: 90px; + height: 90px; + margin-left: -60px; + margin-top: -25px; + content: "‟"; + display: block; + float: left; +} + +.markdown-body img { + max-width: 100%; + box-sizing: border-box; +} + +@import "rouge-base16-dark"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_sass/normalize.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_sass/normalize.scss new file mode 100644 index 000000000000..30366a6e9837 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_sass/normalize.scss @@ -0,0 +1,424 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_sass/rouge-base16-dark.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_sass/rouge-base16-dark.scss new file mode 100644 index 000000000000..c303bd5847d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/_sass/rouge-base16-dark.scss @@ -0,0 +1,81 @@ +/* + generated by rouge http://rouge.jneen.net/ + original base16 by Chris Kempson (https://github.com/chriskempson/base16) +*/ + +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight, .highlight .w { + color: #d0d0d0; +} +.highlight .err { + color: #151515; + background-color: #ac4142; +} +.highlight .c, .highlight .cd, .highlight .cm, .highlight .c1, .highlight .cs { + color: #888; +} +.highlight .cp { + color: #f4bf75; +} +.highlight .nt { + color: #f4bf75; +} +.highlight .o, .highlight .ow { + color: #d0d0d0; +} +.highlight .p, .highlight .pi { + color: #d0d0d0; +} +.highlight .gi { + color: #90a959; +} +.highlight .gd { + color: #ac4142; +} +.highlight .gh { + color: #6a9fb5; + font-weight: bold; +} +.highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv { + color: #aa759f; +} +.highlight .kc { + color: #d28445; +} +.highlight .kt { + color: #d28445; +} +.highlight .kd { + color: #d28445; +} +.highlight .s, .highlight .sb, .highlight .sc, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 { + color: #90a959; +} +.highlight .sr { + color: #75b5aa; +} +.highlight .si { + color: #8f5536; +} +.highlight .se { + color: #8f5536; +} +.highlight .nn { + color: #f4bf75; +} +.highlight .nc { + color: #f4bf75; +} +.highlight .no { + color: #f4bf75; +} +.highlight .na { + color: #6a9fb5; +} +.highlight .m, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mb, .highlight .mx { + color: #90a959; +} +.highlight .ss { + color: #90a959; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/css/style.scss b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/css/style.scss new file mode 100644 index 000000000000..3c958cfb74ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/css/style.scss @@ -0,0 +1,4 @@ +--- +--- + +@import "jekyll-theme-time-machine"; diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/code.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/code.png new file mode 100644 index 000000000000..b414519861af Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/code.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/pattern.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/pattern.png new file mode 100644 index 000000000000..2357903ce560 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/pattern.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/tar.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/tar.png new file mode 100644 index 000000000000..1abbdf1ba3a2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/tar.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/top.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/top.png new file mode 100644 index 000000000000..9acb7f563349 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/top.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/zip.png b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/zip.png new file mode 100644 index 000000000000..6499b004cddc Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/images/zip.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/js/script.js b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/js/script.js new file mode 100644 index 000000000000..2f08550661d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-theme-time-machine-0.1.1/assets/js/script.js @@ -0,0 +1,52 @@ +(function($) { +$(document).ready(function(){ + + // putting lines by the pre blocks + $("pre").each(function(){ + var pre = $(this).text().split("\n"); + var lines = new Array(pre.length+1); + for(var i = 0; i < pre.length; i++) { + var wrap = Math.floor(pre[i].split("").length / 70) + if (pre[i]==""&&i==pre.length-1) { + lines.splice(i, 1); + } else { + lines[i] = i+1; + for(var j = 0; j < wrap; j++) { + lines[i] += "\n"; + } + } + } + $(this).before("<pre class='lines'>" + lines.join("\n") + "</pre>"); + }); + + var headings = []; + + var collectHeaders = function(){ + headings.push({"top":$(this).offset().top - 15,"text":$(this).text()}); + } + + if($(".markdown-body h1").length > 1) $(".markdown-body h1").each(collectHeaders) + else if($(".markdown-body h2").length > 1) $(".markdown-body h2").each(collectHeaders) + else if($(".markdown-body h3").length > 1) $(".markdown-body h3").each(collectHeaders) + + $(window).scroll(function(){ + if(headings.length==0) return true; + var scrolltop = $(window).scrollTop() || 0; + if(headings[0] && scrolltop < headings[0].top) { + $(".current-section").css({"opacity":0,"visibility":"hidden"}); + return false; + } + $(".current-section").css({"opacity":1,"visibility":"visible"}); + for(var i in headings) { + if(scrolltop >= headings[i].top) { + $(".current-section .name").text(headings[i].text); + } + } + }); + + $(".current-section a").click(function(){ + $(window).scrollTop(0); + return false; + }) +}); +})(jQuery) \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/LICENSE.md new file mode 100644 index 000000000000..f61aa0cebea4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Ben Balter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/README.md b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/README.md new file mode 100644 index 000000000000..60f61e5ddf1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/README.md @@ -0,0 +1,69 @@ +# Jekyll Titles from Headings + +*A Jekyll plugin to pull the page title from the first Markdown heading when none is specified.* + +[![Build Status](https://travis-ci.org/benbalter/jekyll-titles-from-headings.svg?branch=master)](https://travis-ci.org/benbalter/jekyll-titles-from-headings) + +## What it does + +If you have a Jekyll page that doesn't have a title specified in the YAML Front Matter, but the first non-whitespace line in the page is a Markdown H1 / H2 / H3, this plugin instructs Jekyll to use that first heading as the page's title. + +## Why + +Because lots of plugins and templates rely on `page.title`. + +If you're using a plugin like [Jekyll Optional Front Matter](https://github.com/benbalter/jekyll-optional-front-matter), you'd have to add Front Matter, just to get the title, which you're already specifying in the document. + +Additionally, this allows you to store the title semantically, in the document itself so that it's readable, both as Markdown and when rendered, as machine-readable for plugins like [Jekyll SEO Tag](https://github.com/benbalter/jekyll-seo-tag). + +## Usage + +1. Add the following to your site's Gemfile: + + ```ruby + gem 'jekyll-titles-from-headings' + ``` + +2. Add the following to your site's config file: + + ```yml + plugins: + - jekyll-titles-from-headings + ``` + Note: If you are using a Jekyll version less than 3.5.0, use the `gems` key instead of `plugins`. + +## Configuration + +Configuration options are optional and placed in `_config.yml` under the `titles_from_headings` key. They default to: + +```yml +titles_from_headings: + enabled: true + strip_title: false + collections: false +``` + +### Stripping titles + +If your theme renders titles based on `page.title`, you can remove the title from the content by setting `strip_title` to prevent rendering it twice. + +To limit this behavior to a certain layouts or paths, you can use [front matter defaults](https://jekyllrb.com/docs/configuration/#front-matter-defaults), e.g. + +```yml +defaults: + - scope: + path: some-path + layout: some_layout + values: + strip_title: true +``` + +### Processing Collections + +If you want to enable this plugin for collection items, set the `collections` option to `true`. + +Since collection items (including posts) already have a title inferred from their filename, this option changes the behavior of this plugin to override the inferred title. The inferred title is only used as a fallback in case the document doesn't start with a heading. + +### Disabling + +Even if the plugin is enabled (e.g., via the `:jekyll_plugins` group in your Gemfile) you can disable it by setting the `enabled` key to `false`. diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings.rb new file mode 100644 index 000000000000..0f03ef651b47 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require "jekyll" +require "jekyll-titles-from-headings/generator" + +module JekyllTitlesFromHeadings + autoload :Context, "jekyll-titles-from-headings/context" + autoload :Filters, "jekyll-titles-from-headings/filters" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/context.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/context.rb new file mode 100644 index 000000000000..d5bc757216e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/context.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module JekyllTitlesFromHeadings + class Context + attr_reader :site + + def initialize(site) + @site = site + end + + def registers + { :site => site } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/filters.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/filters.rb new file mode 100644 index 000000000000..f90f3a270659 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/filters.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module JekyllTitlesFromHeadings + class Filters + include Jekyll::Filters + include Liquid::StandardFilters + + def initialize(site) + @site = site + @context = JekyllTitlesFromHeadings::Context.new(site) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/generator.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/generator.rb new file mode 100644 index 000000000000..d7c31e7afebf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/generator.rb @@ -0,0 +1,133 @@ +# frozen_string_literal: true + +module JekyllTitlesFromHeadings + class Generator < Jekyll::Generator + attr_accessor :site + TITLE_REGEX = + %r! + \A\s* # Beginning and whitespace + (?: # either + \#{1,3}\s+(.*)(?:\s+\#{1,3})? # atx-style header + | # or + (.*)\r?\n[-=]+\s* # Setex-style header + )$ # end of line + !x.freeze + + CONVERTER_CLASS = Jekyll::Converters::Markdown + STRIP_MARKUP_FILTERS = [:markdownify, :strip_html, :normalize_whitespace].freeze + + # Regex to strip extra markup still present after markdownify + # (footnotes at the moment). + EXTRA_MARKUP_REGEX = %r!\[\^[^\]]*\]!.freeze + + CONFIG_KEY = "titles_from_headings" + ENABLED_KEY = "enabled" + STRIP_TITLE_KEY = "strip_title" + COLLECTIONS_KEY = "collections" + + safe true + priority :lowest + + def initialize(site) + @site = site + end + + def generate(site) + @site = site + return if disabled? + + documents = site.pages + documents = site.pages + site.docs_to_write if collections? + + documents.each do |document| + next unless should_add_title?(document) + next if document.is_a?(Jekyll::StaticFile) + + document.data["title"] = title_for(document) + strip_title!(document) if strip_title?(document) + end + end + + def should_add_title?(document) + markdown?(document) && !title?(document) + end + + def title?(document) + !inferred_title?(document) && !document.data["title"].nil? + end + + def markdown?(document) + markdown_converter.matches(document.extname) + end + + def markdown_converter + @markdown_converter ||= site.find_converter_instance(CONVERTER_CLASS) + end + + def title_for(document) + return document.data["title"] if title?(document) + + matches = document.content.to_s.match(TITLE_REGEX) + return strip_markup(matches[1] || matches[2]) if matches + + document.data["title"] # If we cant match a title, we use the inferred one. + rescue ArgumentError => e + raise e unless e.to_s.start_with?("invalid byte sequence in UTF-8") + end + + private + + def strip_markup(string) + STRIP_MARKUP_FILTERS.reduce(string) do |memo, method| + filters.public_send(method, memo) + end.gsub(EXTRA_MARKUP_REGEX, "") + end + + def option(key) + site.config[CONFIG_KEY] && site.config[CONFIG_KEY][key] + end + + def disabled? + option(ENABLED_KEY) == false + end + + def strip_title?(document) + if document.data.key?(STRIP_TITLE_KEY) + document.data[STRIP_TITLE_KEY] == true + else + option(STRIP_TITLE_KEY) == true + end + end + + def strip_title_excerpt?(document) + document.is_a?(Jekyll::Document) && + document.collection.label == "posts" && + document.generate_excerpt? + end + + def collections? + option(COLLECTIONS_KEY) == true + end + + # Documents (posts and collection items) have their title inferred from the filename. + # We want to override these titles, because they were not excplicitly set. + def inferred_title?(document) + document.is_a?(Jekyll::Document) + end + + def strip_title!(document) + if document.content + document.content = document.content.gsub(TITLE_REGEX, "").strip + strip_title_excerpt!(document) if strip_title_excerpt?(document) + end + end + + def strip_title_excerpt!(document) + document.data["excerpt"] = Jekyll::Excerpt.new(document) + end + + def filters + @filters ||= JekyllTitlesFromHeadings::Filters.new(site) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/version.rb new file mode 100644 index 000000000000..cf356713c9f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-titles-from-headings-0.5.3/lib/jekyll-titles-from-headings/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module JekyllTitlesFromHeadings + VERSION = "0.5.3" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll-watch.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll-watch.rb new file mode 100644 index 000000000000..8ec874eacc35 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll-watch.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require "jekyll-watch/version" +require_relative "jekyll/watcher" +require_relative "jekyll/commands/watch" diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll-watch/version.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll-watch/version.rb new file mode 100644 index 000000000000..ececd943f1bf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll-watch/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Jekyll + module Watch + VERSION = "2.2.1" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll/commands/watch.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll/commands/watch.rb new file mode 100644 index 000000000000..0cb6f0dcaf89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll/commands/watch.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Jekyll + module Commands + module Watch + extend self + + def init_with_program(prog); end + + # Build your jekyll site + # Continuously watch if `watch` is set to true in the config. + def process(options) + Jekyll.logger.log_level = :error if options["quiet"] + Jekyll::Watcher.watch(options) if options["watch"] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll/watcher.rb b/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll/watcher.rb new file mode 100644 index 000000000000..6ad1d6594213 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jekyll-watch-2.2.1/lib/jekyll/watcher.rb @@ -0,0 +1,137 @@ +# frozen_string_literal: true + +require "listen" + +module Jekyll + module Watcher + extend self + + # Public: Continuously watch for file changes and rebuild the site + # whenever a change is detected. + # + # If the optional site argument is populated, that site instance will be + # reused and the options Hash ignored. Otherwise, a new site instance will + # be instantiated from the options Hash and used. + # + # options - A Hash containing the site configuration + # site - The current site instance (populated starting with Jekyll 3.2) + # (optional, default: nil) + # + # Returns nothing. + def watch(options, site = nil) + ENV["LISTEN_GEM_DEBUGGING"] ||= "1" if options["verbose"] + + site ||= Jekyll::Site.new(options) + listener = build_listener(site, options) + listener.start + + Jekyll.logger.info "Auto-regeneration:", "enabled for '#{options["source"]}'" + + unless options["serving"] + trap("INT") do + listener.stop + Jekyll.logger.info "", "Halting auto-regeneration." + exit 0 + end + + sleep_forever + end + rescue ThreadError + # You pressed Ctrl-C, oh my! + end + + private + + def build_listener(site, options) + Listen.to( + options["source"], + :ignore => listen_ignore_paths(options), + :force_polling => options["force_polling"], + &listen_handler(site) + ) + end + + def listen_handler(site) + proc do |modified, added, removed| + t = Time.now + c = modified + added + removed + n = c.length + + Jekyll.logger.info "Regenerating:", + "#{n} file(s) changed at #{t.strftime("%Y-%m-%d %H:%M:%S")}" + + c.each { |path| Jekyll.logger.info "", path["#{site.source}/".length..-1] } + process(site, t) + end + end + + def normalize_encoding(obj, desired_encoding) + case obj + when Array + obj.map { |entry| entry.encode!(desired_encoding, entry.encoding) } + when String + obj.encode!(desired_encoding, obj.encoding) + end + end + + def custom_excludes(options) + Array(options["exclude"]).map { |e| Jekyll.sanitized_path(options["source"], e) } + end + + def config_files(options) + %w(yml yaml toml).map do |ext| + Jekyll.sanitized_path(options["source"], "_config.#{ext}") + end + end + + def to_exclude(options) + [ + config_files(options), + options["destination"], + custom_excludes(options), + ].flatten + end + + # Paths to ignore for the watch option + # + # options - A Hash of options passed to the command + # + # Returns a list of relative paths from source that should be ignored + def listen_ignore_paths(options) + source = Pathname.new(options["source"]).expand_path + paths = to_exclude(options) + + paths.map do |p| + absolute_path = Pathname.new(normalize_encoding(p, options["source"].encoding)).expand_path + next unless absolute_path.exist? + + begin + relative_path = absolute_path.relative_path_from(source).to_s + relative_path = File.join(relative_path, "") if absolute_path.directory? + unless relative_path.start_with?("../") + path_to_ignore = %r!^#{Regexp.escape(relative_path)}! + Jekyll.logger.debug "Watcher:", "Ignoring #{path_to_ignore}" + path_to_ignore + end + rescue ArgumentError + # Could not find a relative path + end + end.compact + [%r!^\.jekyll\-metadata!] + end + + def sleep_forever + loop { sleep 1000 } + end + + def process(site, time) + begin + site.process + Jekyll.logger.info "", "...done in #{Time.now - time} seconds." + rescue StandardError => e + Jekyll.logger.warn "Error:", e.message + Jekyll.logger.warn "Error:", "Run jekyll build --trace for more information." + end + Jekyll.logger.info "" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/jemoji-0.12.0/lib/jemoji.rb b/vendor/bundler/ruby/2.5.0/gems/jemoji-0.12.0/lib/jemoji.rb new file mode 100644 index 000000000000..b3fda5358f92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/jemoji-0.12.0/lib/jemoji.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +require "jekyll" +require "html/pipeline" + +module Jekyll + class Emoji + GITHUB_DOT_COM_ASSET_HOST_URL = "https://github.githubassets.com" + ASSET_PATH = "/images/icons/" + BODY_START_TAG = "<body" + OPENING_BODY_TAG_REGEX = %r!<body(.*?)>\s*!m.freeze + + class << self + def emojify(doc) + return unless doc.output&.match?(HTML::Pipeline::EmojiFilter.emoji_pattern) + + doc.output = if doc.output.include? BODY_START_TAG + replace_document_body(doc) + else + src = emoji_src(doc.site.config) + filter_with_emoji(src).call(doc.output)[:output].to_s + end + end + + # Public: Create or fetch the filter for the given {{src}} asset root. + # + # src - the asset root URL (e.g. https://github.githubassets.com/images/icons/) + # + # Returns an HTML::Pipeline instance for the given asset root. + def filter_with_emoji(src) + filters[src] ||= HTML::Pipeline.new([ + HTML::Pipeline::EmojiFilter, + ], :asset_root => src, :img_attrs => { :align => nil }) + end + + # Public: Filters hash where the key is the asset root source. + # Effectively a cache. + def filters + @filters ||= {} + end + + # Public: Calculate the asset root source for the given config. + # The custom emoji asset root can be defined in the config as + # emoji.src, and must be a valid URL (i.e. it must include a + # protocol and valid domain) + # + # config - the hash-like configuration of the document's site + # + # Returns a full URL to use as the asset root URL. Defaults to the root + # URL for assets provided by an ASSET_HOST_URL environment variable, + # otherwise the root URL for emoji assets at assets-cdn.github.com. + def emoji_src(config = {}) + if config.key?("emoji") && config["emoji"].key?("src") + config["emoji"]["src"] + else + default_asset_root + end + end + + # Public: Defines the conditions for a document to be emojiable. + # + # doc - the Jekyll::Document or Jekyll::Page + # + # Returns true if the doc is written & is HTML. + def emojiable?(doc) + (doc.is_a?(Jekyll::Page) || doc.write?) && + doc.output_ext == ".html" || (doc.permalink&.end_with?("/")) + end + + private + + def default_asset_root + if !ENV["ASSET_HOST_URL"].to_s.empty? + # Ensure that any trailing "/" is trimmed + asset_host_url = ENV["ASSET_HOST_URL"].chomp("/") + "#{asset_host_url}#{ASSET_PATH}" + else + "#{GITHUB_DOT_COM_ASSET_HOST_URL}#{ASSET_PATH}" + end + end + + def replace_document_body(doc) + src = emoji_src(doc.site.config) + head, opener, tail = doc.output.partition(OPENING_BODY_TAG_REGEX) + body_content, *rest = tail.partition("</body>") + processed_markup = filter_with_emoji(src).call(body_content)[:output].to_s + String.new(head) << opener << processed_markup << rest.join + end + end + end +end + +Jekyll::Hooks.register [:pages, :documents], :post_render do |doc| + Jekyll::Emoji.emojify(doc) if Jekyll::Emoji.emojiable?(doc) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/AUTHORS b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/AUTHORS new file mode 100644 index 000000000000..058359671d1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/AUTHORS @@ -0,0 +1 @@ +The author of kramdown is Thomas Leitner <t_leitner@gmx.at>. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/CONTRIBUTERS b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/CONTRIBUTERS new file mode 100644 index 000000000000..164aeb15ae5e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/CONTRIBUTERS @@ -0,0 +1,78 @@ + Count Name +======= ==== + 944 Thomas Leitner <t_leitner@gmx.at> + 18 Ashwin Maroli <ashmaroli@gmail.com> + 7 Christian Cornelssen <ccorn@1tein.de> + 6 Gioele Barabucci <gioele@svario.it> + 5 Gleb Mazovetskiy <glex.spb@gmail.com> + 4 Ted Pak <powerpak006@gmail.com> + 4 Shuanglei Tao <tsl0922@gmail.com> + 4 Dan Allen <dan.j.allen@gmail.com> + 4 Arne Brasseur <arne@arnebrasseur.net> + 3 Henning Perl <perl@fast-sicher.de> + 3 gettalong <t_leitner@gmx.at> + 3 Brandur <brandur@mutelight.org> + 3 Ben Armston <ben.armston@googlemail.com> + 3 Ashwin Maroli <ashmaroli@users.noreply.github.com> + 3 Alex Marandon <contact@alexmarandon.com> + 2 Tom Thorogood <me+github@tomthorogood.co.uk> + 2 Parker Moore <parkrmoore@gmail.com> + 2 Nathanael Jones <nathanael.jones@gmail.com> + 2 Max Meyer <dev@fedux.org> + 2 Jo Hund <jhund@clearcove.ca> + 2 Bran <m.versum@gmail.com> + 1 winniehell <git@winniehell.de> + 1 William <suttonwilliamd@gmail.com> + 1 Uwe Kubosch <donv@users.noreply.github.com> + 1 utenmiki <utenmiki@gmail.com> + 1 Trevor Wennblom <trevor@well.com> + 1 tomykaira <tomykaira@gmail.com> + 1 tom93 <tomlevy93@gmail.com> + 1 Tim Blair <tim@bla.ir> + 1 Tim Besard <tim.besard@gmail.com> + 1 Tim Bates <tim@rumpuslabs.com> + 1 Sun Yaozhu <yzyzsun@gmail.com> + 1 Stephen <stephengroat@users.noreply.github.com> + 1 Stephen Crosby <stevecrozz@gmail.com> + 1 Simon Lydell <simon.lydell@gmail.com> + 1 Simon Coffey <simon.coffey@futurelearn.com> + 1 Shusaku NAKAZATO <cu393uc@gmail.com> + 1 Sebastian Boehm <sebastian@sometimesfood.org> + 1 scherr <maximilianscherr@gmail.com> + 1 Postmodern <postmodern.mod3@gmail.com> + 1 Pete Michaud <michaudp@gmail.com> + 1 Noah Doersing <doersino@gmail.com> + 1 myqlarson <myqlarson@gmail.com> + 1 milo.simpson <milo.simpson@bazaarvoice.com> + 1 Michal Till <michal.till@gmail.com> + 1 Maxime Kjaer <maxime.kjaer@gmail.com> + 1 Matt Hickford <matt.hickford@gmail.com> + 1 Martyn Chamberlin <martyn@perfectioncoding.com> + 1 Marek Tuchowski <marek@tuchowski.com.pl> + 1 Marcus Stollsteimer <sto.mar@web.de> + 1 Luca Barbato <luca.barbato@gmail.com> + 1 l3kn <hello@l3kn.de> + 1 Kir Kolyshkin <kolyshkin@gmail.com> + 1 Jun Aruga <jaruga@redhat.com> + 1 Jonathan Hooper <jonathan.hooper@gsa.gov> + 1 John Croisant <jacius@gmail.com> + 1 Joe Fiorini <joe@faithfulgeek.org> + 1 Jens Kraemer <jk@jkraemer.net> + 1 Hirofumi Wakasugi <baenej@gmail.com> + 1 Hector Correa <hector@hectorcorrea.com> + 1 Florian Klampfer <f.klampfer@gmail.com> + 1 Floreal Morandat florealm@gmail.com <florealm@gmail.com> + 1 Fangyi Zhou <me@fangyi.io> + 1 Diego Galeota <diegobg123@gmail.com> + 1 David Rodríguez <deivid.rodriguez@riseup.net> + 1 Damien Pollet <damien.pollet@gmail.com> + 1 Christopher Jefferson <caj21@st-andrews.ac.uk> + 1 Cédric Boutillier <cedric.boutillier@gmail.com> + 1 Bob Lail <lail@squareup.com> + 1 Ashe Connor <ashe@kivikakk.ee> + 1 Antoine Cotten <hello@acotten.com> + 1 Andrew <andrew.dale.wylie@gmail.com> + 1 Alpha Chen <alpha.chen@gmail.com> + 1 Alex Tomlins <alex.tomlins@digital.cabinet-office.gov.uk> + 1 Alexey Vasiliev <le0pard@users.noreply.github.com> + 1 284km <k.furuhashi10@gmail.com> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/COPYING b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/COPYING new file mode 100644 index 000000000000..1c29282ea276 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/COPYING @@ -0,0 +1,30 @@ +kramdown - fast, pure-Ruby Markdown-superset converter +Copyright (C) 2009-2013 Thomas Leitner <t_leitner@gmx.at> + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Some test cases and the benchmark files are based on test cases from +the MDTest test suite: + + MDTest + Copyright (c) 2007 Michel Fortin + <http://www.michelf.com/> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/README.md b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/README.md new file mode 100644 index 000000000000..981c00447f0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/README.md @@ -0,0 +1,77 @@ +# kramdown + +## Readme first! + +kramdown was originally licensed under the GPL until the 1.0.0 release. However, due to the many +requests it is now released under the MIT license and therefore can easily be used in commercial +projects, too. + +However, if you use kramdown in a commercial setting, please consider **contributing back any +changes** for the benefit of the community and/or [**becoming a +sponsor**](https://github.com/sponsors/gettalong/) or [**a +patron**](https://www.patreon.com/gettalong) - thanks! + +Sponsors: + +* **GROSSWEBER** provides <a href="http://grossweber.com/b/kramdown" target="_blank">software + development consulting and training services</a>. + + +## Introduction + +kramdown is a fast, pure Ruby Markdown superset converter, using a strict syntax definition and +supporting several common extensions. + +The syntax definition for the kramdown syntax can be found in **doc/syntax.page** (or online at +<http://kramdown.gettalong.org/syntax.html>) and a quick reference is available in +**doc/quickref.page** or online at <http://kramdown.gettalong.org/quickref.html>. + +The kramdown library is mainly written to support the kramdown-to-HTML conversion chain. However, +due to its flexibility (by creating an internal AST) it supports other input and output formats as +well. Here is a list of the supported formats: + +* input formats: kramdown (a Markdown superset), Markdown, GFM, HTML +* output formats: HTML, kramdown, LaTeX (and therefore PDF), PDF via Prawn + +All the documentation on the available input and output formats is available in the **doc/** +directory and online at <http://kramdown.gettalong.org>. + +Starting from version 1.0.0 kramdown is using a versioning scheme with major, minor and patch parts +in the version number where the major number changes on backwards-incompatible changes, the minor +number on the introduction of new features and the patch number on everything else. + +For information about changes between versions, have a look at +<http://kramdown.gettalong.org/news.html> or the commit history! + + +## Usage + +kramdown has a very simple API, so using kramdown is as easy as + +```ruby +require 'kramdown' + +Kramdown::Document.new(text).to_html +``` + +For detailed information have a look at the API documentation of the `Kramdown::Document` class. + +The full API documentation is available at <http://kramdown.gettalong.org/rdoc/>, other sites with an +API documentation for kramdown probably don't provide the complete documentation! + +There are also some third-party libraries that extend the functionality of kramdown -- see the +kramdown Wiki at <https://github.com/gettalong/kramdown/wiki>. + + +## Development + +Just clone the git repository as described in **doc/installation.page** and you are good to go. You +probably want to install `rake` so that you can use the provided rake tasks. + +If you want to run the tests, the development dependencies are needed as well as some additional +programs like `tidy` and `latex`. See the `.travis.yml` file for more information. + + +## License + +MIT - see the **COPYING** file. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/VERSION b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/VERSION new file mode 100644 index 000000000000..276cbf9e2858 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/VERSION @@ -0,0 +1 @@ +2.3.0 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/bin/kramdown b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/bin/kramdown new file mode 100644 index 000000000000..e1128abe5393 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/bin/kramdown @@ -0,0 +1,132 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'optparse' +require 'rbconfig' +require 'yaml' +require 'kramdown' + +def add_kramdown_options(opts, parsed_options, banner: [], ignore: []) + banner_shown = false + defined_options = [] + Kramdown::Options.definitions.sort.each do |n, definition| + next if ignore.include?(n) + + unless banner_shown + opts.separator("") + banner.each {|part| opts.separator(part) } + opts.separator("") + banner_shown = true + end + + defined_options << n + no = n.to_s.tr('_', '-') + if definition.type == Kramdown::Options::Boolean + opts.on("--[no-]#{no}") {|v| parsed_options[n] = Kramdown::Options.parse(n, v) } + else + type = definition.type + type = String if type == Symbol || type == Object + opts.on("--#{no} ARG", type) {|v| parsed_options[n] = Kramdown::Options.parse(n, v) } + end + + definition.desc.split(/\n/).each do |line| + opts.separator opts.summary_indent + ' ' * 6 + line + end + opts.separator '' + end + defined_options +end + +config_file = nil +begin + config_dir = case RbConfig::CONFIG['host_os'] + when /bccwin|cygwin|djgpp|mingw|mswin|wince/i + File.expand_path((ENV['HOME'] || ENV['USERPROFILE'] || "~") + "/AppData/Local") + when /darwin|mac os/ + File.expand_path("~/Library/Preferences/") + else + File.expand_path(ENV['XDG_CONFIG_HOME'] || '~/.config') + end + config_file = File.join(config_dir, "kramdownrc") +rescue StandardError +end + +options = {} +format = ['html'] + +defined_options = [] +OptionParser.new do |opts| + opts.banner = "Usage: kramdown [options] [FILE FILE ...]" + opts.summary_indent = ' ' * 4 + + opts.separator "" + opts.separator "Command line options:" + opts.separator "" + + opts.on("-i", "--input ARG", "Specify the input format: kramdown (default), " \ + "html, or markdown") {|v| options[:input] = v } + opts.on("-o", "--output ARG", Array, "Specify one or more output formats separated by commas: " \ + "html (default),", "kramdown, latex, man or remove_html_tags") {|v| format = v } + opts.on("-x", "--extension EXT", Array, "Load one or more extensions (without the 'kramdown-' " \ + "prefix) separated", "by commas (e.g. parser-gfm,syntax-coderay)", + "Note: Use this option before other options!") do |exts| + exts.each do |ext| + begin + require "kramdown-#{ext}" + new_options = add_kramdown_options(opts, options, banner: ["#{ext} options:"], + ignore: defined_options) + defined_options.concat(new_options) + rescue LoadError + $stderr.puts "Couldn't load extension #{ext}, ignoring" + end + end + end + opts.separator "" + opts.on("--no-config-file", "Do not read any configuration file. Default behavior is to check " \ + "for a", "configuration file and read it if it exists.") { config_file = nil } + opts.on("--config-file FILE", "Specify the name of a configuration file with kramdown options " \ + "in YAML", "format, e.g. \"auto_id_prefix: ARG\" instead of \"--auto-id-prefix ARG\"", + "and \"auto_ids: false\" instead of \"--no-auto-ids\".", + "Default: #{config_file}") {|v| config_file = v } + opts.separator "" + opts.on("-v", "--version", "Show the version of kramdown") do + puts Kramdown::VERSION + exit + end + opts.on("-h", "--help", "Show the help") do + puts opts.summarize('', 5, 72) + exit + end + + new_options = add_kramdown_options(opts, options, banner: ["kramdown options:"]) + defined_options.concat(new_options) +end.parse! + +begin + if config_file && File.exist?(config_file) + config_file_options = YAML.safe_load(File.read(config_file), [Symbol]) + case config_file_options + when nil # empty configuration file except perhaps YAML header and comments + # Nothing to do + when Hash + options = config_file_options.merge(options) + else + raise Kramdown::Error, "No YAML map in configuration file \"#{config_file}\"" + end + end + doc = Kramdown::Document.new(ARGF.read, options) + result = '' + format.each {|f| result = doc.send("to_#{f}") } + puts result + doc.warnings.each {|warn| $stderr.puts "Warning: #{warn}" } +rescue Kramdown::Error => e + $stderr.puts "Error: #{e.message}" + exit(1) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/data/kramdown/document.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/data/kramdown/document.html new file mode 100644 index 000000000000..731d0ea915e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/data/kramdown/document.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> + <head> + <% if @converter.root.options[:encoding] %> + <meta http-equiv="Content-type" content="text/html;charset=<%= @converter.root.options[:encoding] %>"> + <% end %> +<% +extend ::Kramdown::Utils::Html +title = '' +h = @converter.root.children.find {|c| c.type == :header} +if h + collector = lambda {|c| c.children.collect {|cc| cc.type == :text ? escape_html(cc.value, :text) : collector.call(cc)}.join('')} + title = collector.call(h) +end +%> + <title><%= title %></title> + <meta name="generator" content="kramdown <%= ::Kramdown::VERSION %>" /> + </head> + <body> + <%= @body %> + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/data/kramdown/document.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/data/kramdown/document.latex new file mode 100644 index 000000000000..acdf346ab670 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/data/kramdown/document.latex @@ -0,0 +1,50 @@ +<% +encmap = { + 'UTF-8' => 'utf8x', + 'US-ASCII' => 'ascii', + 'ISO-8859-1' => 'latin1', + 'ISO-8859-2' => 'latin2', + 'ISO-8859-3' => 'latin3', + 'ISO-8859-4' => 'latin4', + 'ISO-8859-5' => 'latin5', + 'ISO-8859-9' => 'latin9', + 'ISO-8859-10' => 'latin10', + 'CP850' => 'cp850', + 'CP852' => 'cp852', + 'CP858' => 'cp858', + 'CP437' => 'cp437', + 'CP865' => 'cp865', + 'CP1250' => 'cp120', + 'CP1252' => 'cp1252', + 'CP1257' => 'cp1257' +} +%> +\documentclass{scrartcl} +<% if RUBY_VERSION >= '1.9' %> +\usepackage[<%= encmap[@body.encoding.name] %>]{inputenc} +<% else %> +\usepackage[mathletters]{ucs} +\usepackage[utf8x]{inputenc} +<% end %> +\usepackage[T1]{fontenc} +\usepackage{listings} +<% @converter.data[:packages].each {|pkg| %>\usepackage{<%= pkg %>} +<% } %> +\usepackage{hyperref} + +<% if @converter.data[:packages].include?('fancyvrb') %> +\VerbatimFootnotes +<% end %> + +<% if @converter.data[:packages].include?('acronym') %> +<% @converter.root.options[:abbrev_defs].each_pair do |k,v| %>\acrodef{<%= @converter.normalize_abbreviation_key(k) %>}[<%= k %>]{<%= @converter.escape(v) %>} +<% end %> +<% end %> + +\setcounter{footnote}{<%= @converter.options[:footnote_nr] - 1 %>} + +\hypersetup{colorlinks=true,urlcolor=blue} + +\begin{document} +<%= @body %> +\end{document} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown.rb new file mode 100644 index 000000000000..3700b9de47e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown.rb @@ -0,0 +1,10 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/document' diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter.rb new file mode 100644 index 000000000000..0055a1445cfa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter.rb @@ -0,0 +1,68 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/utils' + +module Kramdown + + # This module contains all available converters, i.e. classes that take a root Element and convert + # it to a specific output format. The result is normally a string. For example, the + # Converter::Html module converts an element tree into valid HTML. + # + # Converters use the Base class for common functionality (like applying a template to the output) + # \- see its API documentation for how to create a custom converter class. + module Converter + + autoload :Base, 'kramdown/converter/base' + autoload :Html, 'kramdown/converter/html' + autoload :Latex, 'kramdown/converter/latex' + autoload :Kramdown, 'kramdown/converter/kramdown' + autoload :Toc, 'kramdown/converter/toc' + autoload :RemoveHtmlTags, 'kramdown/converter/remove_html_tags' + autoload :HashAST, 'kramdown/converter/hash_ast' + autoload :HashAst, 'kramdown/converter/hash_ast' + autoload :Man, 'kramdown/converter/man' + + extend ::Kramdown::Utils::Configurable + + configurable(:syntax_highlighter) + + ['Minted', "Rouge"].each do |klass_name| + kn_down = klass_name.downcase.intern + add_syntax_highlighter(kn_down) do |converter, text, lang, type, opts| + require "kramdown/converter/syntax_highlighter/#{kn_down}" + klass = ::Kramdown::Utils.deep_const_get("::Kramdown::Converter::SyntaxHighlighter::#{klass_name}") + if !klass.const_defined?(:AVAILABLE) || klass::AVAILABLE + add_syntax_highlighter(kn_down, klass) + else + add_syntax_highlighter(kn_down) { nil } + end + syntax_highlighter(kn_down).call(converter, text, lang, type, opts) + end + end + + configurable(:math_engine) + + ["Mathjax"].each do |klass_name| + kn_down = klass_name.downcase.intern + add_math_engine(kn_down) do |converter, el, opts| + require "kramdown/converter/math_engine/#{kn_down}" + klass = ::Kramdown::Utils.deep_const_get("::Kramdown::Converter::MathEngine::#{klass_name}") + if !klass.const_defined?(:AVAILABLE) || klass::AVAILABLE + add_math_engine(kn_down, klass) + else + add_math_engine(kn_down) { nil } + end + math_engine(kn_down).call(converter, el, opts) + end + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/base.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/base.rb new file mode 100644 index 000000000000..66a85d64992a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/base.rb @@ -0,0 +1,257 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'erb' +require 'kramdown/utils' +require 'kramdown/document' + +module Kramdown + + module Converter + + # == \Base class for converters + # + # This class serves as base class for all converters. It provides methods that can/should be + # used by all converters (like #generate_id) as well as common functionality that is + # automatically applied to the result (for example, embedding the output into a template). + # + # A converter object is used as a throw-away object, i.e. it is only used for storing the needed + # state information during conversion. Therefore one can't instantiate a converter object + # directly but only use the Base::convert method. + # + # == Implementing a converter + # + # Implementing a new converter is rather easy: just derive a new class from this class and put + # it in the Kramdown::Converter module (the latter is only needed if auto-detection should work + # properly). Then you need to implement the #convert method which has to contain the conversion + # code for converting an element and has to return the conversion result. + # + # The actual transformation of the document tree can be done in any way. However, writing one + # method per element type is a straight forward way to do it - this is how the Html and Latex + # converters do the transformation. + # + # Have a look at the Base::convert method for additional information! + class Base + + # Can be used by a converter for storing arbitrary information during the conversion process. + attr_reader :data + + # The hash with the conversion options. + attr_reader :options + + # The root element that is converted. + attr_reader :root + + # The warnings array. + attr_reader :warnings + + # Initialize the converter with the given +root+ element and +options+ hash. + def initialize(root, options) + @options = options + @root = root + @data = {} + @warnings = [] + end + private_class_method(:new, :allocate) + + # Returns whether the template should be applied before the conversion of the tree. + # + # Defaults to false. + def apply_template_before? + false + end + + # Returns whether the template should be applied after the conversion of the tree. + # + # Defaults to true. + def apply_template_after? + true + end + + # Convert the element tree +tree+ and return the resulting conversion object (normally a + # string) and an array with warning messages. The parameter +options+ specifies the conversion + # options that should be used. + # + # Initializes a new instance of the calling class and then calls the #convert method with + # +tree+ as parameter. + # + # If the +template+ option is specified and non-empty, the template is evaluate with ERB + # before and/or after the tree conversion depending on the result of #apply_template_before? + # and #apply_template_after?. If the template is evaluated before, an empty string is used for + # the body; if evaluated after, the result is used as body. See ::apply_template. + # + # The template resolution is done in the following way (for the converter ConverterName): + # + # 1. Look in the current working directory for the template. + # + # 2. Append +.converter_name+ (e.g. +.html+) to the template name and look for the resulting + # file in the current working directory (the form +.convertername+ is deprecated). + # + # 3. Append +.converter_name+ to the template name and look for it in the kramdown data + # directory (the form +.convertername+ is deprecated). + # + # 4. Check if the template name starts with 'string://' and if so, strip this prefix away and + # use the rest as template. + def self.convert(tree, options = {}) + converter = new(tree, ::Kramdown::Options.merge(options.merge(tree.options[:options] || {}))) + + if !converter.options[:template].empty? && converter.apply_template_before? + apply_template(converter, '') + end + result = converter.convert(tree) + if result.respond_to?(:encode!) && result.encoding != Encoding::BINARY + result.encode!(tree.options[:encoding] || + (raise ::Kramdown::Error, "Missing encoding option on root element")) + end + if !converter.options[:template].empty? && converter.apply_template_after? + result = apply_template(converter, result) + end + + [result, converter.warnings] + end + + # Convert the element +el+ and return the resulting object. + # + # This is the only method that has to be implemented by sub-classes! + def convert(_el) + raise NotImplementedError + end + + # Apply the +template+ using +body+ as the body string. + # + # The template is evaluated using ERB and the body is available in the @body instance variable + # and the converter object in the @converter instance variable. + def self.apply_template(converter, body) # :nodoc: + erb = ERB.new(get_template(converter.options[:template])) + obj = Object.new + obj.instance_variable_set(:@converter, converter) + obj.instance_variable_set(:@body, body) + erb.result(obj.instance_eval { binding }) + end + + # Return the template specified by +template+. + def self.get_template(template) # :nodoc: + format_ext = '.' + ::Kramdown::Utils.snake_case(self.name.split(/::/).last) + shipped = File.join(::Kramdown.data_dir, template + format_ext) + if File.exist?(template) + File.read(template) + elsif File.exist?(template + format_ext) + File.read(template + format_ext) + elsif File.exist?(shipped) + File.read(shipped) + elsif template.start_with?('string://') + template.sub(/\Astring:\/\//, '') + else + raise "The specified template file #{template} does not exist" + end + end + + # Add the given warning +text+ to the warning array. + def warning(text) + @warnings << text + end + + # Return +true+ if the header element +el+ should be used for the table of contents (as + # specified by the +toc_levels+ option). + def in_toc?(el) + @options[:toc_levels].include?(el.options[:level]) && (el.attr['class'] || '') !~ /\bno_toc\b/ + end + + # Return the output header level given a level. + # + # Uses the +header_offset+ option for adjusting the header level. + def output_header_level(level) + [[level + @options[:header_offset], 6].min, 1].max + end + + # Extract the code block/span language from the attributes. + def extract_code_language(attr) + if attr['class'] && attr['class'] =~ /\blanguage-\S+/ + attr['class'].scan(/\blanguage-(\S+)/).first.first + end + end + + # See #extract_code_language + # + # *Warning*: This version will modify the given attributes if a language is present. + def extract_code_language!(attr) + lang = extract_code_language(attr) + attr['class'] = attr['class'].sub(/\blanguage-\S+/, '').strip if lang + attr.delete('class') if lang && attr['class'].empty? + lang + end + + # Highlight the given +text+ in the language +lang+ with the syntax highlighter configured + # through the option 'syntax_highlighter'. + def highlight_code(text, lang, type, opts = {}) + return nil unless @options[:syntax_highlighter] + + highlighter = ::Kramdown::Converter.syntax_highlighter(@options[:syntax_highlighter]) + if highlighter + highlighter.call(self, text, lang, type, opts) + else + warning("The configured syntax highlighter #{@options[:syntax_highlighter]} is not available.") + nil + end + end + + # Format the given math element with the math engine configured through the option + # 'math_engine'. + def format_math(el, opts = {}) + return nil unless @options[:math_engine] + + engine = ::Kramdown::Converter.math_engine(@options[:math_engine]) + if engine + engine.call(self, el, opts) + else + warning("The configured math engine #{@options[:math_engine]} is not available.") + nil + end + end + + # Generate an unique alpha-numeric ID from the the string +str+ for use as a header ID. + # + # Uses the option +auto_id_prefix+: the value of this option is prepended to every generated + # ID. + def generate_id(str) + str = ::Kramdown::Utils::Unidecoder.decode(str) if @options[:transliterated_header_ids] + gen_id = basic_generate_id(str) + gen_id = 'section' if gen_id.empty? + @used_ids ||= {} + if @used_ids.key?(gen_id) + gen_id += "-#{@used_ids[gen_id] += 1}" + else + @used_ids[gen_id] = 0 + end + @options[:auto_id_prefix] + gen_id + end + + # The basic version of the ID generator, without any special provisions for empty or unique + # IDs. + def basic_generate_id(str) + gen_id = str.gsub(/^[^a-zA-Z]+/, '') + gen_id.tr!('^a-zA-Z0-9 -', '') + gen_id.tr!(' ', '-') + gen_id.downcase! + gen_id + end + + SMART_QUOTE_INDICES = {lsquo: 0, rsquo: 1, ldquo: 2, rdquo: 3} # :nodoc: + + # Return the entity that represents the given smart_quote element. + def smart_quote_entity(el) + res = @options[:smart_quotes][SMART_QUOTE_INDICES[el.value]] + ::Kramdown::Utils::Entities.entity(res) + end + + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/hash_ast.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/hash_ast.rb new file mode 100644 index 000000000000..95714d4329fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/hash_ast.rb @@ -0,0 +1,38 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser' +require 'kramdown/converter' +require 'kramdown/utils' + +module Kramdown + + module Converter + + # Converts a Kramdown::Document to a nested hash for further processing or debug output. + class HashAST < Base + + def convert(el) + hash = {type: el.type} + hash[:attr] = el.attr unless el.attr.empty? + hash[:value] = el.value unless el.value.nil? + hash[:options] = el.options unless el.options.empty? + unless el.children.empty? + hash[:children] = [] + el.children.each {|child| hash[:children] << convert(child) } + end + hash + end + + end + + HashAst = HashAST + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/html.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/html.rb new file mode 100644 index 000000000000..9b4ceef1cb4d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/html.rb @@ -0,0 +1,537 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser' +require 'kramdown/converter' +require 'kramdown/utils' + +module Kramdown + + module Converter + + # Converts a Kramdown::Document to HTML. + # + # You can customize the HTML converter by sub-classing it and overriding the +convert_NAME+ + # methods. Each such method takes the following parameters: + # + # [+el+] The element of type +NAME+ to be converted. + # + # [+indent+] A number representing the current amount of spaces for indent (only used for + # block-level elements). + # + # The return value of such a method has to be a string containing the element +el+ formatted as + # HTML element. + class Html < Base + + include ::Kramdown::Utils::Html + include ::Kramdown::Parser::Html::Constants + + # The amount of indentation used when nesting HTML tags. + attr_accessor :indent + + # Initialize the HTML converter with the given Kramdown document +doc+. + def initialize(root, options) + super + @footnote_counter = @footnote_start = @options[:footnote_nr] + @footnotes = [] + @footnotes_by_name = {} + @footnote_location = nil + @toc = [] + @toc_code = nil + @indent = 2 + @stack = [] + + # stash string representation of symbol to avoid allocations from multiple interpolations. + @highlighter_class = " highlighter-#{options[:syntax_highlighter]}" + @dispatcher = Hash.new {|h, k| h[k] = :"convert_#{k}" } + end + + # Dispatch the conversion of the element +el+ to a +convert_TYPE+ method using the +type+ of + # the element. + def convert(el, indent = -@indent) + send(@dispatcher[el.type], el, indent) + end + + # Return the converted content of the children of +el+ as a string. The parameter +indent+ has + # to be the amount of indentation used for the element +el+. + # + # Pushes +el+ onto the @stack before converting the child elements and pops it from the stack + # afterwards. + def inner(el, indent) + result = +'' + indent += @indent + @stack.push(el) + el.children.each do |inner_el| + result << send(@dispatcher[inner_el.type], inner_el, indent) + end + @stack.pop + result + end + + def convert_blank(_el, _indent) + "\n" + end + + def convert_text(el, _indent) + escaped = escape_html(el.value, :text) + @options[:remove_line_breaks_for_cjk] ? fix_cjk_line_break(escaped) : escaped + end + + def convert_p(el, indent) + if el.options[:transparent] + inner(el, indent) + elsif el.children.size == 1 && el.children.first.type == :img && + el.children.first.options[:ial]&.[](:refs)&.include?('standalone') + convert_standalone_image(el, indent) + else + format_as_block_html("p", el.attr, inner(el, indent), indent) + end + end + + # Helper method used by +convert_p+ to convert a paragraph that only contains a single :img + # element. + def convert_standalone_image(el, indent) + figure_attr = el.attr.dup + image_attr = el.children.first.attr.dup + + figure_attr['class'] = image_attr.delete('class') if image_attr.key?('class') and not figure_attr.key?('class') + figure_attr['id'] = image_attr.delete('id') if image_attr.key?('id') and not figure_attr.key?('id') + + body = "#{' ' * (indent + @indent)}<img#{html_attributes(image_attr)} />\n" \ + "#{' ' * (indent + @indent)}<figcaption>#{image_attr['alt']}</figcaption>\n" + format_as_indented_block_html("figure", figure_attr, body, indent) + end + + def convert_codeblock(el, indent) + attr = el.attr.dup + lang = extract_code_language!(attr) + hl_opts = {} + highlighted_code = highlight_code(el.value, el.options[:lang] || lang, :block, hl_opts) + + if highlighted_code + add_syntax_highlighter_to_class_attr(attr, lang || hl_opts[:default_lang]) + "#{' ' * indent}<div#{html_attributes(attr)}>#{highlighted_code}#{' ' * indent}</div>\n" + else + result = escape_html(el.value) + result.chomp! + if el.attr['class'].to_s =~ /\bshow-whitespaces\b/ + result.gsub!(/(?:(^[ \t]+)|([ \t]+$)|([ \t]+))/) do |m| + suffix = ($1 ? '-l' : ($2 ? '-r' : '')) + m.scan(/./).map do |c| + case c + when "\t" then "<span class=\"ws-tab#{suffix}\">\t</span>" + when " " then "<span class=\"ws-space#{suffix}\">&#8901;</span>" + end + end.join('') + end + end + code_attr = {} + code_attr['class'] = "language-#{lang}" if lang + "#{' ' * indent}<pre#{html_attributes(attr)}>" \ + "<code#{html_attributes(code_attr)}>#{result}\n</code></pre>\n" + end + end + + def convert_blockquote(el, indent) + format_as_indented_block_html("blockquote", el.attr, inner(el, indent), indent) + end + + def convert_header(el, indent) + attr = el.attr.dup + if @options[:auto_ids] && !attr['id'] + attr['id'] = generate_id(el.options[:raw_text]) + end + @toc << [el.options[:level], attr['id'], el.children] if attr['id'] && in_toc?(el) + level = output_header_level(el.options[:level]) + format_as_block_html("h#{level}", attr, inner(el, indent), indent) + end + + def convert_hr(el, indent) + "#{' ' * indent}<hr#{html_attributes(el.attr)} />\n" + end + + ZERO_TO_ONETWENTYEIGHT = (0..128).to_a.freeze + private_constant :ZERO_TO_ONETWENTYEIGHT + + def convert_ul(el, indent) + if !@toc_code && el.options.dig(:ial, :refs)&.include?('toc') + @toc_code = [el.type, el.attr, ZERO_TO_ONETWENTYEIGHT.map { rand(36).to_s(36) }.join] + @toc_code.last + elsif !@footnote_location && el.options.dig(:ial, :refs)&.include?('footnotes') + @footnote_location = ZERO_TO_ONETWENTYEIGHT.map { rand(36).to_s(36) }.join + else + format_as_indented_block_html(el.type, el.attr, inner(el, indent), indent) + end + end + alias convert_ol convert_ul + + def convert_dl(el, indent) + format_as_indented_block_html("dl", el.attr, inner(el, indent), indent) + end + + def convert_li(el, indent) + output = ' ' * indent << "<#{el.type}" << html_attributes(el.attr) << ">" + res = inner(el, indent) + if el.children.empty? || (el.children.first.type == :p && el.children.first.options[:transparent]) + output << res << (res =~ /\n\Z/ ? ' ' * indent : '') + else + output << "\n" << res << ' ' * indent + end + output << "</#{el.type}>\n" + end + alias convert_dd convert_li + + def convert_dt(el, indent) + attr = el.attr.dup + @stack.last.options[:ial][:refs].each do |ref| + if ref =~ /\Aauto_ids(?:-([\w-]+))?/ + attr['id'] = "#{$1}#{basic_generate_id(el.options[:raw_text])}".lstrip + break + end + end if !attr['id'] && @stack.last.options[:ial] && @stack.last.options[:ial][:refs] + format_as_block_html("dt", attr, inner(el, indent), indent) + end + + def convert_html_element(el, indent) + res = inner(el, indent) + if el.options[:category] == :span + "<#{el.value}#{html_attributes(el.attr)}" + \ + (res.empty? && HTML_ELEMENTS_WITHOUT_BODY.include?(el.value) ? " />" : ">#{res}</#{el.value}>") + else + output = +'' + if @stack.last.type != :html_element || @stack.last.options[:content_model] != :raw + output << ' ' * indent + end + output << "<#{el.value}#{html_attributes(el.attr)}" + if el.options[:is_closed] && el.options[:content_model] == :raw + output << " />" + elsif !res.empty? && el.options[:content_model] != :block + output << ">#{res}</#{el.value}>" + elsif !res.empty? + output << ">\n#{res.chomp}\n" << ' ' * indent << "</#{el.value}>" + elsif HTML_ELEMENTS_WITHOUT_BODY.include?(el.value) + output << " />" + else + output << "></#{el.value}>" + end + output << "\n" if @stack.last.type != :html_element || @stack.last.options[:content_model] != :raw + output + end + end + + def convert_xml_comment(el, indent) + if el.options[:category] == :block && + (@stack.last.type != :html_element || @stack.last.options[:content_model] != :raw) + ' ' * indent << el.value << "\n" + else + el.value + end + end + alias convert_xml_pi convert_xml_comment + + def convert_table(el, indent) + format_as_indented_block_html(el.type, el.attr, inner(el, indent), indent) + end + alias convert_thead convert_table + alias convert_tbody convert_table + alias convert_tfoot convert_table + alias convert_tr convert_table + + ENTITY_NBSP = ::Kramdown::Utils::Entities.entity('nbsp') # :nodoc: + + def convert_td(el, indent) + res = inner(el, indent) + type = (@stack[-2].type == :thead ? :th : :td) + attr = el.attr + alignment = @stack[-3].options[:alignment][@stack.last.children.index(el)] + if alignment != :default + attr = el.attr.dup + attr['style'] = (attr.key?('style') ? "#{attr['style']}; " : '') + "text-align: #{alignment}" + end + format_as_block_html(type, attr, res.empty? ? entity_to_str(ENTITY_NBSP) : res, indent) + end + + def convert_comment(el, indent) + if el.options[:category] == :block + "#{' ' * indent}<!-- #{el.value} -->\n" + else + "<!-- #{el.value} -->" + end + end + + def convert_br(_el, _indent) + "<br />" + end + + def convert_a(el, indent) + format_as_span_html("a", el.attr, inner(el, indent)) + end + + def convert_img(el, _indent) + "<img#{html_attributes(el.attr)} />" + end + + def convert_codespan(el, _indent) + attr = el.attr.dup + lang = extract_code_language(attr) + hl_opts = {} + result = highlight_code(el.value, lang, :span, hl_opts) + if result + add_syntax_highlighter_to_class_attr(attr, hl_opts[:default_lang]) + else + result = escape_html(el.value) + end + + format_as_span_html('code', attr, result) + end + + def convert_footnote(el, _indent) + repeat = '' + name = @options[:footnote_prefix] + el.options[:name] + if (footnote = @footnotes_by_name[name]) + number = footnote[2] + repeat = ":#{footnote[3] += 1}" + else + number = @footnote_counter + @footnote_counter += 1 + @footnotes << [name, el.value, number, 0] + @footnotes_by_name[name] = @footnotes.last + end + "<sup id=\"fnref:#{name}#{repeat}\" role=\"doc-noteref\">" \ + "<a href=\"#fn:#{name}\" class=\"footnote\" rel=\"footnote\">" \ + "#{number}</a></sup>" + end + + def convert_raw(el, _indent) + if !el.options[:type] || el.options[:type].empty? || el.options[:type].include?('html') + el.value + (el.options[:category] == :block ? "\n" : '') + else + '' + end + end + + def convert_em(el, indent) + format_as_span_html(el.type, el.attr, inner(el, indent)) + end + alias convert_strong convert_em + + def convert_entity(el, _indent) + entity_to_str(el.value, el.options[:original]) + end + + TYPOGRAPHIC_SYMS = { + mdash: [::Kramdown::Utils::Entities.entity('mdash')], + ndash: [::Kramdown::Utils::Entities.entity('ndash')], + hellip: [::Kramdown::Utils::Entities.entity('hellip')], + laquo_space: [::Kramdown::Utils::Entities.entity('laquo'), + ::Kramdown::Utils::Entities.entity('nbsp')], + raquo_space: [::Kramdown::Utils::Entities.entity('nbsp'), + ::Kramdown::Utils::Entities.entity('raquo')], + laquo: [::Kramdown::Utils::Entities.entity('laquo')], + raquo: [::Kramdown::Utils::Entities.entity('raquo')], + } # :nodoc: + def convert_typographic_sym(el, _indent) + if (result = @options[:typographic_symbols][el.value]) + escape_html(result, :text) + else + TYPOGRAPHIC_SYMS[el.value].map {|e| entity_to_str(e) }.join('') + end + end + + def convert_smart_quote(el, _indent) + entity_to_str(smart_quote_entity(el)) + end + + def convert_math(el, indent) + if (result = format_math(el, indent: indent)) + result + else + attr = el.attr.dup + attr['class'] = "#{attr['class']} kdmath".lstrip + if el.options[:category] == :block + format_as_block_html('div', attr, "$$\n#{el.value}\n$$", indent) + else + format_as_span_html('span', attr, "$#{el.value}$") + end + end + end + + def convert_abbreviation(el, _indent) + title = @root.options[:abbrev_defs][el.value] + attr = @root.options[:abbrev_attr][el.value].dup + attr['title'] = title unless title.empty? + format_as_span_html("abbr", attr, el.value) + end + + def convert_root(el, indent) + result = inner(el, indent) + if @footnote_location + result.sub!(/#{@footnote_location}/, footnote_content.gsub(/\\/, "\\\\\\\\")) + else + result << footnote_content + end + if @toc_code + toc_tree = generate_toc_tree(@toc, @toc_code[0], @toc_code[1] || {}) + text = if !toc_tree.children.empty? + convert(toc_tree, 0) + else + '' + end + result.sub!(/#{@toc_code.last}/, text.gsub(/\\/, "\\\\\\\\")) + end + result + end + + # Format the given element as span HTML. + def format_as_span_html(name, attr, body) + "<#{name}#{html_attributes(attr)}>#{body}</#{name}>" + end + + # Format the given element as block HTML. + def format_as_block_html(name, attr, body, indent) + "#{' ' * indent}<#{name}#{html_attributes(attr)}>#{body}</#{name}>\n" + end + + # Format the given element as block HTML with a newline after the start tag and indentation + # before the end tag. + def format_as_indented_block_html(name, attr, body, indent) + "#{' ' * indent}<#{name}#{html_attributes(attr)}>\n#{body}#{' ' * indent}</#{name}>\n" + end + + # Add the syntax highlighter name to the 'class' attribute of the given attribute hash. And + # overwrites or add a "language-LANG" part using the +lang+ parameter if +lang+ is not nil. + def add_syntax_highlighter_to_class_attr(attr, lang = nil) + (attr['class'] = (attr['class'] || '') + @highlighter_class).lstrip! + attr['class'].sub!(/\blanguage-\S+|(^)/) { "language-#{lang}#{$1 ? ' ' : ''}" } if lang + end + + # Generate and return an element tree for the table of contents. + def generate_toc_tree(toc, type, attr) + sections = Element.new(type, nil, attr.dup) + sections.attr['id'] ||= 'markdown-toc' + stack = [] + toc.each do |level, id, children| + li = Element.new(:li, nil, nil, level: level) + li.children << Element.new(:p, nil, nil, transparent: true) + a = Element.new(:a, nil) + a.attr['href'] = "##{id}" + a.attr['id'] = "#{sections.attr['id']}-#{id}" + a.children.concat(fix_for_toc_entry(Marshal.load(Marshal.dump(children)))) + li.children.last.children << a + li.children << Element.new(type) + + success = false + until success + if stack.empty? + sections.children << li + stack << li + success = true + elsif stack.last.options[:level] < li.options[:level] + stack.last.children.last.children << li + stack << li + success = true + else + item = stack.pop + item.children.pop if item.children.last.children.empty? + end + end + end + until stack.empty? + item = stack.pop + item.children.pop if item.children.last.children.empty? + end + sections + end + + # Fixes the elements for use in a TOC entry. + def fix_for_toc_entry(elements) + remove_footnotes(elements) + unwrap_links(elements) + elements + end + + # Remove all link elements by unwrapping them. + def unwrap_links(elements) + elements.map! do |c| + unwrap_links(c.children) + c.type == :a ? c.children : c + end.flatten! + end + + # Remove all footnotes from the given elements. + def remove_footnotes(elements) + elements.delete_if do |c| + remove_footnotes(c.children) + c.type == :footnote + end + end + + # Obfuscate the +text+ by using HTML entities. + def obfuscate(text) + result = +'' + text.each_byte do |b| + result << (b > 128 ? b.chr : sprintf("&#%03d;", b)) + end + result.force_encoding(text.encoding) + result + end + + FOOTNOTE_BACKLINK_FMT = "%s<a href=\"#fnref:%s\" class=\"reversefootnote\" role=\"doc-backlink\">%s</a>" + + # Return an HTML ordered list with the footnote content for the used footnotes. + def footnote_content + ol = Element.new(:ol) + ol.attr['start'] = @footnote_start if @footnote_start != 1 + i = 0 + backlink_text = escape_html(@options[:footnote_backlink], :text) + while i < @footnotes.length + name, data, _, repeat = *@footnotes[i] + li = Element.new(:li, nil, 'id' => "fn:#{name}", 'role' => 'doc-endnote') + li.children = Marshal.load(Marshal.dump(data.children)) + + para = nil + if li.children.last.type == :p || @options[:footnote_backlink_inline] + parent = li + while !parent.children.empty? && ![:p, :header].include?(parent.children.last.type) + parent = parent.children.last + end + para = parent.children.last + insert_space = true + end + + unless para + li.children << (para = Element.new(:p)) + insert_space = false + end + + unless @options[:footnote_backlink].empty? + nbsp = entity_to_str(ENTITY_NBSP) + value = sprintf(FOOTNOTE_BACKLINK_FMT, (insert_space ? nbsp : ''), name, backlink_text) + para.children << Element.new(:raw, value) + (1..repeat).each do |index| + value = sprintf(FOOTNOTE_BACKLINK_FMT, nbsp, "#{name}:#{index}", + "#{backlink_text}<sup>#{index + 1}</sup>") + para.children << Element.new(:raw, value) + end + end + + ol.children << Element.new(:raw, convert(li, 4)) + i += 1 + end + if ol.children.empty? + '' + else + format_as_indented_block_html('div', {class: "footnotes", role: "doc-endnotes"}, convert(ol, 2), 0) + end + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/kramdown.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/kramdown.rb new file mode 100644 index 000000000000..ceaee5cde396 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/kramdown.rb @@ -0,0 +1,448 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/converter' +require 'kramdown/utils' + +module Kramdown + + module Converter + + # Converts an element tree to the kramdown format. + class Kramdown < Base + + # :stopdoc: + + include ::Kramdown::Utils::Html + + def initialize(root, options) + super + @linkrefs = [] + @footnotes = [] + @abbrevs = [] + @stack = [] + end + + def convert(el, opts = {indent: 0}) + res = send("convert_#{el.type}", el, opts) + res = res.dup if res.frozen? + if ![:html_element, :li, :dt, :dd, :td].include?(el.type) && (ial = ial_for_element(el)) + res << ial + res << "\n\n" if el.block? + elsif [:ul, :dl, :ol, :codeblock].include?(el.type) && opts[:next] && + ([el.type, :codeblock].include?(opts[:next].type) || + (opts[:next].type == :blank && opts[:nnext] && + [el.type, :codeblock].include?(opts[:nnext].type))) + res << "^\n\n" + elsif el.block? && + ![:li, :dd, :dt, :td, :th, :tr, :thead, :tbody, :tfoot, :blank].include?(el.type) && + (el.type != :html_element || @stack.last.type != :html_element) && + (el.type != :p || !el.options[:transparent]) + res << "\n" + end + res + end + + def inner(el, opts = {indent: 0}) + @stack.push(el) + result = +'' + el.children.each_with_index do |inner_el, index| + options = opts.dup + options[:index] = index + options[:prev] = (index == 0 ? nil : el.children[index - 1]) + options[:pprev] = (index <= 1 ? nil : el.children[index - 2]) + options[:next] = (index == el.children.length - 1 ? nil : el.children[index + 1]) + options[:nnext] = (index >= el.children.length - 2 ? nil : el.children[index + 2]) + result << convert(inner_el, options) + end + @stack.pop + result + end + + def convert_blank(_el, _opts) + "" + end + + ESCAPED_CHAR_RE = /(\$\$|[\\*_`\[\]\{"'|])|^[ ]{0,3}(:)/ + + def convert_text(el, opts) + if opts[:raw_text] + el.value + else + el.value.gsub(/\A\n/) do + opts[:prev] && opts[:prev].type == :br ? '' : "\n" + end.gsub(/\s+/, ' ').gsub(ESCAPED_CHAR_RE) { "\\#{$1 || $2}" } + end + end + + def convert_p(el, opts) + w = @options[:line_width] - opts[:indent].to_s.to_i + first, second, *rest = inner(el, opts).strip.gsub(/(.{1,#{w}})( +|$\n?)/, "\\1\n").split(/\n/) + first&.gsub!(/^(?:(#|>)|(\d+)\.|([+-]\s))/) { $1 || $3 ? "\\#{$1 || $3}" : "#{$2}\\." } + second&.gsub!(/^([=-]+\s*?)$/, "\\\1") + res = [first, second, *rest].compact.join("\n") + "\n" + if el.children.length == 1 && el.children.first.type == :math + res = "\\#{res}" + elsif res.start_with?('\$$') && res.end_with?("\\$$\n") + res.sub!(/^\\\$\$/, '\$\$') + end + res + end + + def convert_codeblock(el, _opts) + el.value.split(/\n/).map {|l| l.empty? ? " " : " #{l}" }.join("\n") + "\n" + end + + def convert_blockquote(el, opts) + opts[:indent] += 2 + inner(el, opts).chomp.split(/\n/).map {|l| "> #{l}" }.join("\n") << "\n" + end + + def convert_header(el, opts) + res = +'' + res << "#{'#' * output_header_level(el.options[:level])} #{inner(el, opts)}" + res[-1, 1] = "\\#" if res[-1] == '#' + res << " {##{el.attr['id']}}" if el.attr['id'] && !el.attr['id'].strip.empty? + res << "\n" + end + + def convert_hr(_el, _opts) + "* * *\n" + end + + def convert_ul(el, opts) + inner(el, opts).sub(/\n+\Z/, "\n") + end + alias convert_ol convert_ul + alias convert_dl convert_ul + + def convert_li(el, opts) + sym, width = if @stack.last.type == :ul + [+'* ', el.children.first && el.children.first.type == :codeblock ? 4 : 2] + else + ["#{opts[:index] + 1}.".ljust(4), 4] + end + if (ial = ial_for_element(el)) + sym << ial << " " + end + + opts[:indent] += width + text = inner(el, opts) + newlines = text.scan(/\n*\Z/).first + first, *last = text.split(/\n/) + last = last.map {|l| " " * width + l }.join("\n") + text = (first.nil? ? "\n" : first + (last.empty? ? "" : "\n") + last + newlines) + if el.children.first && el.children.first.type == :p && !el.children.first.options[:transparent] + res = +"#{sym}#{text}" + res << "^\n" if el.children.size == 1 && @stack.last.children.last == el && + (@stack.last.children.any? {|c| c.children.first.type != :p } || @stack.last.children.size == 1) + res + elsif el.children.first && el.children.first.type == :codeblock + "#{sym}\n #{text}" + else + "#{sym}#{text}" + end + end + + def convert_dd(el, opts) + sym, width = +": ", (el.children.first && el.children.first.type == :codeblock ? 4 : 2) + if (ial = ial_for_element(el)) + sym << ial << " " + end + + opts[:indent] += width + text = inner(el, opts) + newlines = text.scan(/\n*\Z/).first + first, *last = text.split(/\n/) + last = last.map {|l| " " * width + l }.join("\n") + text = first.to_s + (last.empty? ? "" : "\n") + last + newlines + text.chomp! if text =~ /\n\n\Z/ && opts[:next] && opts[:next].type == :dd + text << "\n" if text !~ /\n\n\Z/ && opts[:next] && opts[:next].type == :dt + text << "\n" if el.children.empty? + if el.children.first && el.children.first.type == :p && !el.children.first.options[:transparent] + "\n#{sym}#{text}" + elsif el.children.first && el.children.first.type == :codeblock + "#{sym}\n #{text}" + else + "#{sym}#{text}" + end + end + + def convert_dt(el, opts) + result = +'' + if (ial = ial_for_element(el)) + result << ial << " " + end + result << inner(el, opts) << "\n" + end + + HTML_TAGS_WITH_BODY = ['div', 'script', 'iframe', 'textarea', 'th', 'td'] + + HTML_ELEMENT_TYPES = [:entity, :text, :html_element].freeze + private_constant :HTML_ELEMENT_TYPES + + def convert_html_element(el, opts) + markdown_attr = el.options[:category] == :block && el.children.any? do |c| + c.type != :html_element && + (c.type != :p || !c.options[:transparent] || + c.children.any? {|t| !HTML_ELEMENT_TYPES.member?(t.type) }) && + c.block? + end + opts[:force_raw_text] = true if %w[script pre code].include?(el.value) + opts[:raw_text] = opts[:force_raw_text] || opts[:block_raw_text] || \ + (el.options[:category] != :span && !markdown_attr) + opts[:block_raw_text] = true if el.options[:category] == :block && opts[:raw_text] + res = inner(el, opts) + if el.options[:category] == :span + "<#{el.value}#{html_attributes(el.attr)}" + \ + (!res.empty? || HTML_TAGS_WITH_BODY.include?(el.value) ? ">#{res}</#{el.value}>" : " />") + else + output = +'' + attr = el.attr.dup + attr['markdown'] = '1' if markdown_attr + output << "<#{el.value}#{html_attributes(attr)}" + if !res.empty? && el.options[:content_model] != :block + output << ">#{res}</#{el.value}>" + elsif !res.empty? + output << ">\n#{res}" << "</#{el.value}>" + elsif HTML_TAGS_WITH_BODY.include?(el.value) + output << "></#{el.value}>" + else + output << " />" + end + output << "\n" if @stack.last.type != :html_element || @stack.last.options[:content_model] != :raw + output + end + end + + def convert_xml_comment(el, _opts) + if el.options[:category] == :block && + (@stack.last.type != :html_element || @stack.last.options[:content_model] != :raw) + el.value + "\n" + else + el.value.dup + end + end + alias convert_xml_pi convert_xml_comment + + def convert_table(el, opts) + opts[:alignment] = el.options[:alignment] + inner(el, opts) + end + + def convert_thead(el, opts) + rows = inner(el, opts) + if opts[:alignment].all? {|a| a == :default } + "#{rows}|#{'-' * 10}\n" + else + "#{rows}| " + opts[:alignment].map do |a| + case a + when :left then ":-" + when :right then "-:" + when :center then ":-:" + when :default then "-" + end + end.join(' ') << "\n" + end + end + + def convert_tbody(el, opts) + res = +'' + res << inner(el, opts) + res << '|' << '-' * 10 << "\n" if opts[:next] && opts[:next].type == :tbody + res + end + + def convert_tfoot(el, opts) + "|#{'=' * 10}\n#{inner(el, opts)}" + end + + def convert_tr(el, opts) + "| #{el.children.map {|c| convert(c, opts) }.join(' | ')} |\n" + end + + def convert_td(el, opts) + inner(el, opts) + end + + def convert_comment(el, _opts) + if el.options[:category] == :block + "{::comment}\n#{el.value}\n{:/}\n" + else + "{::comment}#{el.value}{:/}" + end + end + + def convert_br(_el, _opts) + " \n" + end + + def convert_a(el, opts) + if el.attr['href'].empty? + "[#{inner(el, opts)}]()" + elsif el.attr['href'] =~ /^(?:http|ftp)/ || el.attr['href'].count("()") > 0 + index = if (link_el = @linkrefs.find {|c| c.attr['href'] == el.attr['href'] }) + @linkrefs.index(link_el) + 1 + else + @linkrefs << el + @linkrefs.size + end + "[#{inner(el, opts)}][#{index}]" + else + title = parse_title(el.attr['title']) + "[#{inner(el, opts)}](#{el.attr['href']}#{title})" + end + end + + def convert_img(el, _opts) + alt_text = el.attr['alt'].to_s.gsub(ESCAPED_CHAR_RE) { $1 ? "\\#{$1}" : $2 } + src = el.attr['src'].to_s + if src.empty? + "![#{alt_text}]()" + else + title = parse_title(el.attr['title']) + link = if src.count("()") > 0 + "<#{src}>" + else + src + end + "![#{alt_text}](#{link}#{title})" + end + end + + def convert_codespan(el, _opts) + delim = (el.value.scan(/`+/).max || '') + '`' + "#{delim}#{' ' if delim.size > 1}#{el.value}#{' ' if delim.size > 1}#{delim}" + end + + def convert_footnote(el, _opts) + @footnotes << [el.options[:name], el.value] + "[^#{el.options[:name]}]" + end + + def convert_raw(el, _opts) + attr = (el.options[:type] || []).join(' ') + attr = " type=\"#{attr}\"" unless attr.empty? + if @stack.last.type == :html_element + el.value + elsif el.options[:category] == :block + "{::nomarkdown#{attr}}\n#{el.value}\n{:/}\n" + else + "{::nomarkdown#{attr}}#{el.value}{:/}" + end + end + + def convert_em(el, opts) + "*#{inner(el, opts)}*" + + (opts[:next] && [:em, :strong].include?(opts[:next].type) && !ial_for_element(el) ? '{::}' : '') + end + + def convert_strong(el, opts) + "**#{inner(el, opts)}**" + + (opts[:next] && [:em, :strong].include?(opts[:next].type) && !ial_for_element(el) ? '{::}' : '') + end + + def convert_entity(el, _opts) + entity_to_str(el.value, el.options[:original]) + end + + TYPOGRAPHIC_SYMS = { + mdash: '---', ndash: '--', hellip: '...', + laquo_space: '<< ', raquo_space: ' >>', + laquo: '<<', raquo: '>>' + } + def convert_typographic_sym(el, _opts) + TYPOGRAPHIC_SYMS[el.value] + end + + def convert_smart_quote(el, _opts) + el.value.to_s =~ /[rl]dquo/ ? "\"" : "'" + end + + def convert_math(el, _opts) + "$$#{el.value}$$" + (el.options[:category] == :block ? "\n" : '') + end + + def convert_abbreviation(el, _opts) + el.value + end + + def convert_root(el, opts) + res = inner(el, opts) + res << create_link_defs + res << create_footnote_defs + res << create_abbrev_defs + res + end + + def create_link_defs + res = +'' + res << "\n\n" unless @linkrefs.empty? + @linkrefs.each_with_index do |el, i| + title = parse_title(el.attr['title']) + res << "[#{i + 1}]: #{el.attr['href']}#{title}\n" + end + res + end + + def create_footnote_defs + res = +'' + @footnotes.each do |name, data| + res << "[^#{name}]:\n" + res << inner(data).chomp.split(/\n/).map {|l| " #{l}" }.join("\n") + "\n\n" + end + res + end + + def create_abbrev_defs + return '' unless @root.options[:abbrev_defs] + res = +'' + @root.options[:abbrev_defs].each do |name, text| + res << "*[#{name}]: #{text}\n" + res << ial_for_element(Element.new(:unused, nil, @root.options[:abbrev_attr][name])).to_s << "\n\n" + end + res + end + + # Return the IAL containing the attributes of the element +el+. + def ial_for_element(el) + res = el.attr.map do |k, v| + next if [:img, :a].include?(el.type) && ['href', 'src', 'alt', 'title'].include?(k) + next if el.type == :header && k == 'id' && !v.strip.empty? + if v.nil? + '' + elsif k == 'class' && !v.empty? && !v.index(/[\.#]/) + " " + v.split(/\s+/).map {|w| ".#{w}" }.join(" ") + elsif k == 'id' && !v.strip.empty? + " ##{v}" + else + " #{k}=\"#{v}\"" + end + end.compact.join('') + res = "toc" + (res.strip.empty? ? '' : " #{res}") if (el.type == :ul || el.type == :ol) && + el.options.dig(:ial, :refs)&.include?('toc') + res = "footnotes" + (res.strip.empty? ? '' : " #{res}") if (el.type == :ul || el.type == :ol) && + el.options.dig(:ial, :refs)&.include?('footnotes') + if el.type == :dl && el.options[:ial] && el.options[:ial][:refs] + auto_ids = el.options[:ial][:refs].select {|ref| ref.start_with?('auto_ids') }.join(" ") + res = auto_ids << (res.strip.empty? ? '' : " #{res}") unless auto_ids.empty? + end + res.strip.empty? ? nil : "{:#{res}}" + end + + def parse_title(attr) + attr.to_s.empty? ? '' : ' "' + attr.gsub(/"/, '&quot;') + '"' + end + + # :startdoc: + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/latex.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/latex.rb new file mode 100644 index 000000000000..25124d5f493e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/latex.rb @@ -0,0 +1,625 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'set' +require 'kramdown/converter' + +module Kramdown + + module Converter + + # Converts an element tree to LaTeX. + # + # This converter uses ideas from other Markdown-to-LaTeX converters like Pandoc and Maruku. + # + # You can customize this converter by sub-classing it and overriding the +convert_NAME+ methods. + # Each such method takes the following parameters: + # + # [+el+] The element of type +NAME+ to be converted. + # + # [+opts+] A hash containing processing options that are passed down from parent elements. The + # key :parent is always set and contains the parent element as value. + # + # The return value of such a method has to be a string containing the element +el+ formatted + # correctly as LaTeX markup. + class Latex < Base + + # Initialize the LaTeX converter with the +root+ element and the conversion +options+. + def initialize(root, options) + super + @data[:packages] = Set.new + end + + # Dispatch the conversion of the element +el+ to a +convert_TYPE+ method using the +type+ of + # the element. + def convert(el, opts = {}) + send("convert_#{el.type}", el, opts) + end + + # Return the converted content of the children of +el+ as a string. + def inner(el, opts) + result = +'' + options = opts.dup.merge(parent: el) + el.children.each_with_index do |inner_el, index| + options[:index] = index + options[:result] = result + result << send("convert_#{inner_el.type}", inner_el, options) + end + result + end + + def convert_root(el, opts) + inner(el, opts) + end + + def convert_blank(_el, opts) + opts[:result] =~ /\n\n\Z|\A\Z/ ? "" : "\n" + end + + def convert_text(el, _opts) + escape(el.value) + end + + def convert_p(el, opts) + if el.children.size == 1 && el.children.first.type == :img && + !(img = convert_img(el.children.first, opts)).empty? + convert_standalone_image(el, opts, img) + else + "#{latex_link_target(el)}#{inner(el, opts)}\n\n" + end + end + + # Helper method used by +convert_p+ to convert a paragraph that only contains a single :img + # element. + def convert_standalone_image(el, _opts, img) + attrs = attribute_list(el) + "\\begin{figure}#{attrs}\n\\begin{center}\n#{img}\n\\end{center}\n" \ + "\\caption{#{escape(el.children.first.attr['alt'])}}\n" \ + "#{latex_link_target(el, true)}\n\\end{figure}#{attrs}\n" + end + + def convert_codeblock(el, _opts) + show_whitespace = el.attr['class'].to_s =~ /\bshow-whitespaces\b/ + lang = extract_code_language(el.attr) + + if @options[:syntax_highlighter] == :minted && + (highlighted_code = highlight_code(el.value, lang, :block)) + @data[:packages] << 'minted' + "#{latex_link_target(el)}#{highlighted_code}\n" + elsif show_whitespace || lang + options = [] + options << (show_whitespace ? "showspaces=true,showtabs=true" : "showspaces=false,showtabs=false") + options << "language=#{lang}" if lang + options << "basicstyle=\\ttfamily\\footnotesize,columns=fixed,frame=tlbr" + id = el.attr['id'] + options << "label=#{id}" if id + attrs = attribute_list(el) + "#{latex_link_target(el)}\\begin{lstlisting}[#{options.join(',')}]\n" \ + "#{el.value}\n\\end{lstlisting}#{attrs}\n" + else + "#{latex_link_target(el)}\\begin{verbatim}#{el.value}\\end{verbatim}\n" + end + end + + def convert_blockquote(el, opts) + latex_environment(el.children.size > 1 ? 'quotation' : 'quote', el, inner(el, opts)) + end + + def convert_header(el, opts) + type = @options[:latex_headers][output_header_level(el.options[:level]) - 1] + if ((id = el.attr['id']) || + (@options[:auto_ids] && (id = generate_id(el.options[:raw_text])))) && in_toc?(el) + "\\#{type}{#{inner(el, opts)}}\\hypertarget{#{id}}{}\\label{#{id}}\n\n" + else + "\\#{type}*{#{inner(el, opts)}}\n\n" + end + end + + def convert_hr(el, _opts) + attrs = attribute_list(el) + "#{latex_link_target(el)}\\begin{center}#{attrs}\n\\rule{3in}{0.4pt}\n\\end{center}#{attrs}\n" + end + + def convert_ul(el, opts) + if !@data[:has_toc] && el.options.dig(:ial, :refs)&.include?('toc') + @data[:has_toc] = true + '\tableofcontents' + else + latex_environment(el.type == :ul ? 'itemize' : 'enumerate', el, inner(el, opts)) + end + end + alias convert_ol convert_ul + + def convert_dl(el, opts) + latex_environment('description', el, inner(el, opts)) + end + + def convert_li(el, opts) + "\\item{} #{latex_link_target(el, true)}#{inner(el, opts).sub(/\n+\Z/, '')}\n" + end + + def convert_dt(el, opts) + "\\item[#{inner(el, opts)}] " + end + + def convert_dd(el, opts) + "#{latex_link_target(el)}#{inner(el, opts)}\n\n" + end + + def convert_html_element(el, opts) + if el.value == 'i' || el.value == 'em' + "\\emph{#{inner(el, opts)}}" + elsif el.value == 'b' || el.value == 'strong' + "\\textbf{#{inner(el, opts)}}" + else + warning("Can't convert HTML element") + '' + end + end + + def convert_xml_comment(el, _opts) + el.value.split(/\n/).map {|l| "% #{l}" }.join("\n") + "\n" + end + + def convert_xml_pi(_el, _opts) + warning("Can't convert XML PI") + '' + end + + TABLE_ALIGNMENT_CHAR = {default: 'l', left: 'l', center: 'c', right: 'r'} # :nodoc: + + def convert_table(el, opts) + @data[:packages] << 'longtable' + align = el.options[:alignment].map {|a| TABLE_ALIGNMENT_CHAR[a] }.join('|') + attrs = attribute_list(el) + "#{latex_link_target(el)}\\begin{longtable}{|#{align}|}#{attrs}\n" \ + "\\hline\n#{inner(el, opts)}\\hline\n\\end{longtable}#{attrs}\n\n" + end + + def convert_thead(el, opts) + "#{inner(el, opts)}\\hline\n" + end + + def convert_tbody(el, opts) + inner(el, opts) + end + + def convert_tfoot(el, opts) + "\\hline \\hline \n#{inner(el, opts)}" + end + + def convert_tr(el, opts) + el.children.map {|c| send("convert_#{c.type}", c, opts) }.join(' & ') << "\\\\\n" + end + + def convert_td(el, opts) + inner(el, opts) + end + + def convert_comment(el, _opts) + el.value.split(/\n/).map {|l| "% #{l}" }.join("\n") << "\n" + end + + def convert_br(_el, opts) + res = +"\\newline" + res << "\n" if (c = opts[:parent].children[opts[:index] + 1]) && + (c.type != :text || c.value !~ /^\s*\n/) + res + end + + def convert_a(el, opts) + url = el.attr['href'] + if url.start_with?('#') + "\\hyperlink{#{url[1..-1].gsub('%', '\\%')}}{#{inner(el, opts)}}" + else + "\\href{#{url.gsub('%', '\\%')}}{#{inner(el, opts)}}" + end + end + + def convert_img(el, _opts) + line = el.options[:location] + if el.attr['src'] =~ /^(https?|ftps?):\/\// + warning("Cannot include non-local image#{line ? " (line #{line})" : ''}") + '' + elsif !el.attr['src'].empty? + @data[:packages] << 'graphicx' + "#{latex_link_target(el)}\\includegraphics{#{el.attr['src']}}" + else + warning("Cannot include image with empty path#{line ? " (line #{line})" : ''}") + '' + end + end + + def convert_codespan(el, _opts) + lang = extract_code_language(el.attr) + if @options[:syntax_highlighter] == :minted && + (highlighted_code = highlight_code(el.value, lang, :span)) + @data[:packages] << 'minted' + "#{latex_link_target(el)}#{highlighted_code}" + else + "\\texttt{#{latex_link_target(el)}#{escape(el.value)}}" + end + end + + def convert_footnote(el, opts) + @data[:packages] << 'fancyvrb' + "\\footnote{#{inner(el.value, opts).rstrip}}" + end + + def convert_raw(el, _opts) + if !el.options[:type] || el.options[:type].empty? || el.options[:type].include?('latex') + el.value + (el.options[:category] == :block ? "\n" : '') + else + '' + end + end + + def convert_em(el, opts) + "\\emph{#{latex_link_target(el)}#{inner(el, opts)}}" + end + + def convert_strong(el, opts) + "\\textbf{#{latex_link_target(el)}#{inner(el, opts)}}" + end + + # Inspired by Maruku: entity conversion table based on the one from htmltolatex + # (http://sourceforge.net/projects/htmltolatex/), with some small adjustments/additions + ENTITY_CONV_TABLE = { + 913 => ['$A$'], + 914 => ['$B$'], + 915 => ['$\Gamma$'], + 916 => ['$\Delta$'], + 917 => ['$E$'], + 918 => ['$Z$'], + 919 => ['$H$'], + 920 => ['$\Theta$'], + 921 => ['$I$'], + 922 => ['$K$'], + 923 => ['$\Lambda$'], + 924 => ['$M$'], + 925 => ['$N$'], + 926 => ['$\Xi$'], + 927 => ['$O$'], + 928 => ['$\Pi$'], + 929 => ['$P$'], + 931 => ['$\Sigma$'], + 932 => ['$T$'], + 933 => ['$Y$'], + 934 => ['$\Phi$'], + 935 => ['$X$'], + 936 => ['$\Psi$'], + 937 => ['$\Omega$'], + 945 => ['$\alpha$'], + 946 => ['$\beta$'], + 947 => ['$\gamma$'], + 948 => ['$\delta$'], + 949 => ['$\epsilon$'], + 950 => ['$\zeta$'], + 951 => ['$\eta$'], + 952 => ['$\theta$'], + 953 => ['$\iota$'], + 954 => ['$\kappa$'], + 955 => ['$\lambda$'], + 956 => ['$\mu$'], + 957 => ['$\nu$'], + 958 => ['$\xi$'], + 959 => ['$o$'], + 960 => ['$\pi$'], + 961 => ['$\rho$'], + 963 => ['$\sigma$'], + 964 => ['$\tau$'], + 965 => ['$\upsilon$'], + 966 => ['$\phi$'], + 967 => ['$\chi$'], + 968 => ['$\psi$'], + 969 => ['$\omega$'], + 962 => ['$\varsigma$'], + 977 => ['$\vartheta$'], + 982 => ['$\varpi$'], + 8230 => ['\ldots'], + 8242 => ['$\prime$'], + 8254 => ['-'], + 8260 => ['/'], + 8472 => ['$\wp$'], + 8465 => ['$\Im$'], + 8476 => ['$\Re$'], + 8501 => ['$\aleph$'], + 8226 => ['$\bullet$'], + 8482 => ['$^{\rm TM}$'], + 8592 => ['$\leftarrow$'], + 8594 => ['$\rightarrow$'], + 8593 => ['$\uparrow$'], + 8595 => ['$\downarrow$'], + 8596 => ['$\leftrightarrow$'], + 8629 => ['$\hookleftarrow$'], + 8657 => ['$\Uparrow$'], + 8659 => ['$\Downarrow$'], + 8656 => ['$\Leftarrow$'], + 8658 => ['$\Rightarrow$'], + 8660 => ['$\Leftrightarrow$'], + 8704 => ['$\forall$'], + 8706 => ['$\partial$'], + 8707 => ['$\exists$'], + 8709 => ['$\emptyset$'], + 8711 => ['$\nabla$'], + 8712 => ['$\in$'], + 8715 => ['$\ni$'], + 8713 => ['$\notin$'], + 8721 => ['$\sum$'], + 8719 => ['$\prod$'], + 8722 => ['$-$'], + 8727 => ['$\ast$'], + 8730 => ['$\surd$'], + 8733 => ['$\propto$'], + 8734 => ['$\infty$'], + 8736 => ['$\angle$'], + 8743 => ['$\wedge$'], + 8744 => ['$\vee$'], + 8745 => ['$\cap$'], + 8746 => ['$\cup$'], + 8747 => ['$\int$'], + 8756 => ['$\therefore$', 'amssymb'], + 8764 => ['$\sim$'], + 8776 => ['$\approx$'], + 8773 => ['$\cong$'], + 8800 => ['$\neq$'], + 8801 => ['$\equiv$'], + 8804 => ['$\leq$'], + 8805 => ['$\geq$'], + 8834 => ['$\subset$'], + 8835 => ['$\supset$'], + 8838 => ['$\subseteq$'], + 8839 => ['$\supseteq$'], + 8836 => ['$\nsubset$', 'amssymb'], + 8853 => ['$\oplus$'], + 8855 => ['$\otimes$'], + 8869 => ['$\perp$'], + 8901 => ['$\cdot$'], + 8968 => ['$\rceil$'], + 8969 => ['$\lceil$'], + 8970 => ['$\lfloor$'], + 8971 => ['$\rfloor$'], + 9001 => ['$\rangle$'], + 9002 => ['$\langle$'], + 9674 => ['$\lozenge$', 'amssymb'], + 9824 => ['$\spadesuit$'], + 9827 => ['$\clubsuit$'], + 9829 => ['$\heartsuit$'], + 9830 => ['$\diamondsuit$'], + 38 => ['\&'], + 34 => ['"'], + 39 => ['\''], + 169 => ['\copyright'], + 60 => ['\textless'], + 62 => ['\textgreater'], + 338 => ['\OE'], + 339 => ['\oe'], + 352 => ['\v{S}'], + 353 => ['\v{s}'], + 376 => ['\"Y'], + 710 => ['\textasciicircum'], + 732 => ['\textasciitilde'], + 8211 => ['--'], + 8212 => ['---'], + 8216 => ['`'], + 8217 => ['\''], + 8220 => ['``'], + 8221 => ['\'\''], + 8224 => ['\dag'], + 8225 => ['\ddag'], + 8240 => ['\permil', 'wasysym'], + 8364 => ['\euro', 'eurosym'], + 8249 => ['\guilsinglleft'], + 8250 => ['\guilsinglright'], + 8218 => ['\quotesinglbase', 'mathcomp'], + 8222 => ['\quotedblbase', 'mathcomp'], + 402 => ['\textflorin', 'mathcomp'], + 381 => ['\v{Z}'], + 382 => ['\v{z}'], + 160 => ['~'], + 161 => ['\textexclamdown'], + 163 => ['\pounds'], + 164 => ['\currency', 'wasysym'], + 165 => ['\textyen', 'textcomp'], + 166 => ['\brokenvert', 'wasysym'], + 167 => ['\S'], + 171 => ['\guillemotleft'], + 187 => ['\guillemotright'], + 174 => ['\textregistered'], + 170 => ['\textordfeminine'], + 172 => ['$\neg$'], + 173 => ['\-'], + 176 => ['$\degree$', 'mathabx'], + 177 => ['$\pm$'], + 180 => ['\''], + 181 => ['$\mu$'], + 182 => ['\P'], + 183 => ['$\cdot$'], + 186 => ['\textordmasculine'], + 162 => ['\cent', 'wasysym'], + 185 => ['$^1$'], + 178 => ['$^2$'], + 179 => ['$^3$'], + 189 => ['$\frac{1}{2}$'], + 188 => ['$\frac{1}{4}$'], + 190 => ['$\frac{3}{4}'], + 192 => ['\`A'], + 193 => ['\\\'A'], + 194 => ['\^A'], + 195 => ['\~A'], + 196 => ['\"A'], + 197 => ['\AA'], + 198 => ['\AE'], + 199 => ['\cC'], + 200 => ['\`E'], + 201 => ['\\\'E'], + 202 => ['\^E'], + 203 => ['\"E'], + 204 => ['\`I'], + 205 => ['\\\'I'], + 206 => ['\^I'], + 207 => ['\"I'], + 208 => ['$\eth$', 'amssymb'], + 209 => ['\~N'], + 210 => ['\`O'], + 211 => ['\\\'O'], + 212 => ['\^O'], + 213 => ['\~O'], + 214 => ['\"O'], + 215 => ['$\times$'], + 216 => ['\O'], + 217 => ['\`U'], + 218 => ['\\\'U'], + 219 => ['\^U'], + 220 => ['\"U'], + 221 => ['\\\'Y'], + 222 => ['\Thorn', 'wasysym'], + 223 => ['\ss'], + 224 => ['\`a'], + 225 => ['\\\'a'], + 226 => ['\^a'], + 227 => ['\~a'], + 228 => ['\"a'], + 229 => ['\aa'], + 230 => ['\ae'], + 231 => ['\cc'], + 232 => ['\`e'], + 233 => ['\\\'e'], + 234 => ['\^e'], + 235 => ['\"e'], + 236 => ['\`i'], + 237 => ['\\\'i'], + 238 => ['\^i'], + 239 => ['\"i'], + 240 => ['$\eth$'], + 241 => ['\~n'], + 242 => ['\`o'], + 243 => ['\\\'o'], + 244 => ['\^o'], + 245 => ['\~o'], + 246 => ['\"o'], + 247 => ['$\divide$'], + 248 => ['\o'], + 249 => ['\`u'], + 250 => ['\\\'u'], + 251 => ['\^u'], + 252 => ['\"u'], + 253 => ['\\\'y'], + 254 => ['\thorn', 'wasysym'], + 255 => ['\"y'], + 8201 => ['\thinspace'], + 8194 => ['\hskip .5em\relax'], + 8195 => ['\quad'], + } # :nodoc: + ENTITY_CONV_TABLE.each_value {|v| v[0] = "#{v[0]}{}" } + + def entity_to_latex(entity) + text, package = ENTITY_CONV_TABLE[entity.code_point] + if text + @data[:packages] << package if package + text + else + warning("Couldn't find entity with code #{entity.code_point} in substitution table!") + '' + end + end + + def convert_entity(el, _opts) + entity_to_latex(el.value) + end + + TYPOGRAPHIC_SYMS = { + mdash: '---', ndash: '--', hellip: '\ldots{}', + laquo_space: '\guillemotleft{}~', raquo_space: '~\guillemotright{}', + laquo: '\guillemotleft{}', raquo: '\guillemotright{}' + } # :nodoc: + def convert_typographic_sym(el, _opts) + if (result = @options[:typographic_symbols][el.value]) + escape(result) + else + TYPOGRAPHIC_SYMS[el.value] + end + end + + def convert_smart_quote(el, opts) + res = entity_to_latex(smart_quote_entity(el)).chomp('{}') + res << "{}" if ((nel = opts[:parent].children[opts[:index] + 1]) && nel.type == :smart_quote) || res =~ /\w$/ + res + end + + def convert_math(el, _opts) + @data[:packages] += %w[amssymb amsmath amsthm amsfonts] + if el.options[:category] == :block + if el.value =~ /\A\s*\\begin\{/ + el.value + else + latex_environment('displaymath', el, el.value) + end + else + "$#{el.value}$" + end + end + + def convert_abbreviation(el, _opts) + @data[:packages] += %w[acronym] + "\\ac{#{normalize_abbreviation_key(el.value)}}" + end + + # Normalize the abbreviation key so that it only contains allowed ASCII character + def normalize_abbreviation_key(key) + key.gsub(/\W/) {|m| m.unpack('H*').first } + end + + # Wrap the +text+ inside a LaTeX environment of type +type+. The element +el+ is passed on to + # the method #attribute_list -- the resulting string is appended to both the \\begin and the + # \\end lines of the LaTeX environment for easier post-processing of LaTeX environments. + def latex_environment(type, el, text) + attrs = attribute_list(el) + "\\begin{#{type}}#{latex_link_target(el)}#{attrs}\n#{text.rstrip}\n\\end{#{type}}#{attrs}\n" + end + + # Return a string containing a valid \hypertarget command if the element has an ID defined, or + # +nil+ otherwise. If the parameter +add_label+ is +true+, a \label command will also be used + # additionally to the \hypertarget command. + def latex_link_target(el, add_label = false) + if (id = el.attr['id']) + "\\hypertarget{#{id}}{}#{add_label ? "\\label{#{id}}" : ''}" + else + nil + end + end + + # Return a LaTeX comment containing all attributes as 'key="value"' pairs. + def attribute_list(el) + attrs = el.attr.map {|k, v| v.nil? ? '' : " #{k}=\"#{v}\"" }.compact.sort.join('') + attrs = " % #{attrs}" unless attrs.empty? + attrs + end + + ESCAPE_MAP = { + "^" => "\\^{}", + "\\" => "\\textbackslash{}", + "~" => "\\ensuremath{\\sim}", + "|" => "\\textbar{}", + "<" => "\\textless{}", + ">" => "\\textgreater{}", + "[" => "{[}", + "]" => "{]}", + }.merge(Hash[*("{}$%&_#".each_char.map {|c| [c, "\\#{c}"] }.flatten)]) # :nodoc: + ESCAPE_RE = Regexp.union(*ESCAPE_MAP.collect {|k, _v| k }) # :nodoc: + + # Escape the special LaTeX characters in the string +str+. + def escape(str) + str.gsub(ESCAPE_RE) {|m| ESCAPE_MAP[m] } + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/man.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/man.rb new file mode 100644 index 000000000000..28aa2a6eda33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/man.rb @@ -0,0 +1,300 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/converter' + +module Kramdown + + module Converter + + # Converts a Kramdown::Document to a manpage in groff format. See man(7), groff_man(7) and + # man-pages(7) for information regarding the output. + class Man < Base + + def convert(el, opts = {indent: 0, result: +''}) #:nodoc: + send("convert_#{el.type}", el, opts) + end + + private + + def inner(el, opts, use = :all) + arr = el.children.reject {|e| e.type == :blank } + arr.each_with_index do |inner_el, index| + next if use == :rest && index == 0 + break if use == :first && index > 0 + options = opts.dup + options[:parent] = el + options[:index] = index + options[:prev] = (index == 0 ? nil : arr[index - 1]) + options[:next] = (index == arr.length - 1 ? nil : arr[index + 1]) + convert(inner_el, options) + end + end + + def convert_root(el, opts) + @title_done = false + opts[:result] = +".\\\" generated by kramdown\n" + inner(el, opts) + opts[:result] + end + + def convert_blank(*) + end + alias convert_hr convert_blank + alias convert_xml_pi convert_blank + + def convert_p(el, opts) + if (opts[:index] != 0 && opts[:prev].type != :header) || + (opts[:parent].type == :blockquote && opts[:index] == 0) + opts[:result] << macro("P") + end + inner(el, opts) + newline(opts[:result]) + end + + def convert_header(el, opts) + return unless opts[:parent].type == :root + case el.options[:level] + when 1 + unless @title_done + @title_done = true + data = el.options[:raw_text].scan(/([^(]+)\s*\((\d\w*)\)(?:\s*-+\s*(.*))?/).first || + el.options[:raw_text].scan(/([^\s]+)\s*(?:-*\s+)?()(.*)/).first + return unless data && data[0] + name = data[0] + section = (data[1].to_s.empty? ? el.attr['data-section'] || '7' : data[1]) + description = (data[2].to_s.empty? ? nil : " - #{data[2]}") + date = el.attr['data-date'] ? quote(el.attr['data-date']) : nil + extra = (el.attr['data-extra'] ? quote(escape(el.attr['data-extra'].to_s)) : nil) + opts[:result] << macro("TH", quote(escape(name.upcase)), quote(section), date, extra) + if description + opts[:result] << macro("SH", "NAME") << escape("#{name}#{description}") << "\n" + end + end + when 2 + opts[:result] << macro("SH", quote(escape(el.options[:raw_text]))) + when 3 + opts[:result] << macro("SS", quote(escape(el.options[:raw_text]))) + else + warning("Header levels greater than three are not supported") + end + end + + def convert_codeblock(el, opts) + opts[:result] << macro("sp") << macro("RS", 4) << macro("EX") + opts[:result] << newline(escape(el.value, true)) + opts[:result] << macro("EE") << macro("RE") + end + + def convert_blockquote(el, opts) + opts[:result] << macro("RS") + inner(el, opts) + opts[:result] << macro("RE") + end + + def convert_ul(el, opts) + compact = (el.attr['class'] =~ /\bcompact\b/) + opts[:result] << macro("sp") << macro("PD", 0) if compact + inner(el, opts) + opts[:result] << macro("PD") if compact + end + alias convert_dl convert_ul + alias convert_ol convert_ul + + def convert_li(el, opts) + sym = (opts[:parent].type == :ul ? '\(bu' : "#{opts[:index] + 1}.") + opts[:result] << macro("IP", sym, 4) + inner(el, opts, :first) + if el.children.size > 1 + opts[:result] << macro("RS") + inner(el, opts, :rest) + opts[:result] << macro("RE") + end + end + + def convert_dt(el, opts) + opts[:result] << macro(opts[:prev] && opts[:prev].type == :dt ? "TQ" : "TP") + inner(el, opts) + opts[:result] << "\n" + end + + def convert_dd(el, opts) + inner(el, opts, :first) + if el.children.size > 1 + opts[:result] << macro("RS") + inner(el, opts, :rest) + opts[:result] << macro("RE") + end + opts[:result] << macro("sp") if opts[:next] && opts[:next].type == :dd + end + + TABLE_CELL_ALIGNMENT = {left: 'l', center: 'c', right: 'r', default: 'l'} + + def convert_table(el, opts) + opts[:alignment] = el.options[:alignment].map {|a| TABLE_CELL_ALIGNMENT[a] } + table_options = ["box"] + table_options << "center" if el.attr['class'] =~ /\bcenter\b/ + opts[:result] << macro("TS") << "#{table_options.join(' ')} ;\n" + inner(el, opts) + opts[:result] << macro("TE") << macro("sp") + end + + def convert_thead(el, opts) + opts[:result] << opts[:alignment].map {|a| "#{a}b" }.join(' ') << " .\n" + inner(el, opts) + opts[:result] << "=\n" + end + + def convert_tbody(el, opts) + opts[:result] << ".T&\n" if opts[:index] != 0 + opts[:result] << opts[:alignment].join(' ') << " .\n" + inner(el, opts) + opts[:result] << (opts[:next].type == :tfoot ? "=\n" : "_\n") if opts[:next] + end + + def convert_tfoot(el, opts) + inner(el, opts) + end + + def convert_tr(el, opts) + inner(el, opts) + opts[:result] << "\n" + end + + def convert_td(el, opts) + result = opts[:result] + opts[:result] = +'' + inner(el, opts) + if opts[:result] =~ /\n/ + warning("Table cells using links are not supported") + result << "\t" + else + result << opts[:result] << "\t" + end + end + + def convert_html_element(*) + warning("HTML elements are not supported") + end + + def convert_xml_comment(el, opts) + newline(opts[:result]) << ".\"#{escape(el.value, true).rstrip.gsub(/\n/, "\n.\"")}\n" + end + alias convert_comment convert_xml_comment + + def convert_a(el, opts) + if el.children.size == 1 && el.children[0].type == :text && + el.attr['href'] == el.children[0].value + newline(opts[:result]) << macro("UR", escape(el.attr['href'])) << macro("UE") + elsif el.attr['href'].start_with?('mailto:') + newline(opts[:result]) << macro("MT", escape(el.attr['href'].sub(/^mailto:/, ''))) << + macro("UE") + else + newline(opts[:result]) << macro("UR", escape(el.attr['href'])) + inner(el, opts) + newline(opts[:result]) << macro("UE") + end + end + + def convert_img(_el, _opts) + warning("Images are not supported") + end + + def convert_em(el, opts) + opts[:result] << '\fI' + inner(el, opts) + opts[:result] << '\fP' + end + + def convert_strong(el, opts) + opts[:result] << '\fB' + inner(el, opts) + opts[:result] << '\fP' + end + + def convert_codespan(el, opts) + opts[:result] << "\\fB#{escape(el.value)}\\fP" + end + + def convert_br(_el, opts) + newline(opts[:result]) << macro("br") + end + + def convert_abbreviation(el, opts) + opts[:result] << escape(el.value) + end + + def convert_math(el, opts) + if el.options[:category] == :block + convert_codeblock(el, opts) + else + convert_codespan(el, opts) + end + end + + def convert_footnote(*) + warning("Footnotes are not supported") + end + + def convert_raw(*) + warning("Raw content is not supported") + end + + def convert_text(el, opts) + text = escape(el.value) + text.lstrip! if opts[:result][-1] == "\n" + opts[:result] << text + end + + def convert_entity(el, opts) + opts[:result] << unicode_char(el.value.code_point) + end + + def convert_smart_quote(el, opts) + opts[:result] << unicode_char(::Kramdown::Utils::Entities.entity(el.value.to_s).code_point) + end + + TYPOGRAPHIC_SYMS_MAP = { + mdash: '\(em', ndash: '\(em', hellip: '\.\.\.', + laquo_space: '\[Fo]', raquo_space: '\[Fc]', laquo: '\[Fo]', raquo: '\[Fc]' + } + + def convert_typographic_sym(el, opts) + opts[:result] << TYPOGRAPHIC_SYMS_MAP[el.value] + end + + def macro(name, *args) + ".#{[name, *args].compact.join(' ')}\n" + end + + def newline(text) + text << "\n" unless text[-1] == "\n" + text + end + + def quote(text) + "\"#{text.gsub(/"/, '\\"')}\"" + end + + def escape(text, preserve_whitespace = false) + text = (preserve_whitespace ? text.dup : text.gsub(/\s+/, ' ')) + text.gsub!('\\', "\\e") + text.gsub!(/^\./, '\\\\&.') + text.gsub!(/[.'-]/) {|m| "\\#{m}" } + text + end + + def unicode_char(codepoint) + "\\[u#{codepoint.to_s(16).rjust(4, '0')}]" + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/math_engine/mathjax.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/math_engine/mathjax.rb new file mode 100644 index 000000000000..850f541db5f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/math_engine/mathjax.rb @@ -0,0 +1,32 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown::Converter::MathEngine + + # Uses the MathJax javascript library for displaying math. + # + # Note that the javascript library itself is not include or linked, this has to be done + # separately. Only the math content is marked up correctly. + module Mathjax + + def self.call(converter, el, opts) + value = converter.escape_html(el.value) + result = el.options[:category] == :block ? "\\[#{value}\\]\n" : "\\(#{value}\\)" + if el.attr.empty? + result + elsif el.options[:category] == :block + converter.format_as_block_html('div', el.attr, result, opts[:indent]) + else + converter.format_as_span_html('span', el.attr, "$#{el.value}$") + end + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/remove_html_tags.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/remove_html_tags.rb new file mode 100644 index 000000000000..e2256047b565 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/remove_html_tags.rb @@ -0,0 +1,57 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/converter' + +module Kramdown + + module Converter + + # Removes all block (and optionally span) level HTML tags from the element tree. + # + # This converter can be used on parsed HTML documents to get an element tree that will only + # contain native kramdown elements. + # + # *Note* that the returned element tree may not be fully conformant (i.e. the content models of + # *some elements may be violated)! + # + # This converter modifies the given tree in-place and returns it. + class RemoveHtmlTags < Base + + def initialize(root, options) + super + @options[:template] = '' + end + + def convert(el) + real_el, el = el, el.value if el.type == :footnote + + children = el.children.dup + index = 0 + while index < children.length + if [:xml_pi].include?(children[index].type) || + (children[index].type == :html_element && %w[style script].include?(children[index].value)) + children[index..index] = [] + elsif children[index].type == :html_element && + ((@options[:remove_block_html_tags] && children[index].options[:category] == :block) || + (@options[:remove_span_html_tags] && children[index].options[:category] == :span)) + children[index..index] = children[index].children + else + convert(children[index]) + index += 1 + end + end + el.children = children + real_el || el + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/syntax_highlighter.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/syntax_highlighter.rb new file mode 100644 index 000000000000..683acbff8baa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/syntax_highlighter.rb @@ -0,0 +1,56 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Converter + + # == Container for Syntax Highlighters + # + # This module serves as container for the syntax highlighters that can be used together with + # kramdown. + # + # A syntax highlighter should not store any data itself but should use the provided converter + # object to do so (See Kramdown::Converter::Base#data). + # + # == Implementing a Syntax Highlighter + # + # Implementing a new syntax highlighter is easy because it is just an object that needs to + # respond to #call. + # + # The method #call needs to take the following arguments: + # + # converter:: This argument contains the converter object that calls the syntax highlighter. It + # can be used, for example, to store data in Kramdown::Converter::Base#data for one + # conversion run. + # + # text:: The raw text that should be highlighted. + # + # lang:: The language that the text should be highlighted for (e.g. ruby, python, ...). + # + # type:: The type of text, either :span for span-level code or :block for a codeblock. + # + # opts:: A Hash with options that may be passed from the converter. + # + # The return value of the method should be the highlighted text, suitable for the given + # converter (e.g. HTML for the HTML converter). + # + # == Special Implementation Details + # + # HTML converter:: If the syntax highlighter is used with an HTML converter, it should return + # :block type text correctly wrapped (i.e. normally inside a pre-tag, but may + # also be a table-tag or just a div-tag) but :span type text *without* a + # code-tag! + # + # Also, a syntax highlighter should store the default highlighting language for + # the invocation in the +opts+ hash under the key :default_lang. + module SyntaxHighlighter + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/syntax_highlighter/minted.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/syntax_highlighter/minted.rb new file mode 100644 index 000000000000..2119f002aabe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/syntax_highlighter/minted.rb @@ -0,0 +1,35 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown::Converter::SyntaxHighlighter + + # Uses Minted to highlight code blocks and code spans. + module Minted + + def self.call(converter, text, lang, type, _opts) + opts = converter.options[:syntax_highlighter_opts] + + # Fallback to default language + lang ||= opts[:default_lang] + + options = [] + options << "breaklines" if opts[:wrap] + options << "linenos" if opts[:line_numbers] + options << "frame=#{opts[:frame]}" if opts[:frame] + + if lang && type == :block + "\\begin{minted}[#{options.join(',')}]{#{lang}}\n#{text}\n\\end{minted}" + elsif lang && type == :span + "\\mintinline{#{lang}}{#{text}}" + else + nil + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/syntax_highlighter/rouge.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/syntax_highlighter/rouge.rb new file mode 100644 index 000000000000..ed6a4f8348d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/syntax_highlighter/rouge.rb @@ -0,0 +1,85 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown::Converter::SyntaxHighlighter + + # Uses Rouge which is CSS-compatible to Pygments to highlight code blocks and code spans. + module Rouge + + begin + require 'rouge' + + # Highlighting via Rouge is available if this constant is +true+. + AVAILABLE = true + rescue LoadError, SyntaxError + AVAILABLE = false # :nodoc: + end + + def self.call(converter, text, lang, type, call_opts) + opts = options(converter, type) + call_opts[:default_lang] = opts[:default_lang] + return nil unless lang || opts[:default_lang] || opts[:guess_lang] + + lexer = ::Rouge::Lexer.find_fancy(lang || opts[:default_lang], text) + return nil if opts[:disable] || !lexer || (lexer.tag == "plaintext" && !opts[:guess_lang]) + + opts[:css_class] ||= 'highlight' # For backward compatibility when using Rouge 2.0 + formatter = formatter_class(opts).new(opts) + formatter.format(lexer.lex(text)) + end + + def self.options(converter, type) + prepare_options(converter) + converter.data[:syntax_highlighter_rouge][type] + end + + def self.prepare_options(converter) + return if converter.data.key?(:syntax_highlighter_rouge) + + cache = converter.data[:syntax_highlighter_rouge] = {} + + opts = converter.options[:syntax_highlighter_opts].dup + + span_opts = opts.delete(:span)&.dup || {} + block_opts = opts.delete(:block)&.dup || {} + normalize_keys(span_opts) + normalize_keys(block_opts) + + cache[:span] = opts.merge(span_opts) + cache[:span][:wrap] = false + + cache[:block] = opts.merge(block_opts) + end + + def self.normalize_keys(hash) + return if hash.empty? + + hash.keys.each do |k| + hash[k.kind_of?(String) ? Kramdown::Options.str_to_sym(k) : k] = hash.delete(k) + end + end + + def self.formatter_class(opts = {}) + case formatter = opts[:formatter] + when Class + formatter + when /\A[[:upper:]][[:alnum:]_]*\z/ + ::Rouge::Formatters.const_get(formatter, false) + else + # Available in Rouge 2.0 or later + ::Rouge::Formatters::HTMLLegacy + end + rescue NameError + # Fallback to Rouge 1.x + ::Rouge::Formatters::HTML + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/toc.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/toc.rb new file mode 100644 index 000000000000..7ffbc5d35ad7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/converter/toc.rb @@ -0,0 +1,69 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/converter' + +module Kramdown + + module Converter + + # Converts a Kramdown::Document to an element tree that represents the table of contents. + # + # The returned tree consists of Element objects of type :toc where the root element is just used + # as container object. Each :toc element contains as value the wrapped :header element and under + # the attribute key :id the header ID that should be used (note that this ID may not exist in + # the wrapped element). + # + # Since the TOC tree consists of special :toc elements, one cannot directly feed this tree to + # other converters! + class Toc < Base + + def initialize(root, options) + super + @toc = Element.new(:toc) + @stack = [] + @options[:template] = '' + end + + def convert(el) + if el.type == :header && in_toc?(el) + attr = el.attr.dup + attr['id'] = generate_id(el.options[:raw_text]) if @options[:auto_ids] && !attr['id'] + add_to_toc(el, attr['id']) if attr['id'] + else + el.children.each {|child| convert(child) } + end + @toc + end + + private + + def add_to_toc(el, id) + toc_element = Element.new(:toc, el, id: id) + + success = false + until success + if @stack.empty? + @toc.children << toc_element + @stack << toc_element + success = true + elsif @stack.last.value.options[:level] < el.options[:level] + @stack.last.children << toc_element + @stack << toc_element + success = true + else + @stack.pop + end + end + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/document.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/document.rb new file mode 100644 index 000000000000..8b75f84b4f04 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/document.rb @@ -0,0 +1,139 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# +# = kramdown +# +# kramdown is fast, pure Ruby Markdown superset converter, using a strict syntax definition and +# supporting several common extensions. +# +# The kramdown library is mainly written to support the kramdown-to-HTML conversion chain. However, +# due to its flexibility it supports other input and output formats as well. Here is a list of the +# supported formats: +# +# * input formats: kramdown (a Markdown superset), Markdown, GFM, HTML +# * output formats: HTML, kramdown, LaTeX (and therefore PDF), PDF via Prawn +# +# All the documentation on the available input and output formats is available at +# http://kramdown.gettalong.org. +# +# == Usage +# +# kramdown has a simple API, so using kramdown is as easy as +# +# require 'kramdown' +# +# Kramdown::Document.new(text).to_html +# +# For detailed information have a look at the *\Kramdown::Document* class. +# +# == License +# +# MIT - see the COPYING file. + +require 'kramdown/version' +require 'kramdown/element' +require 'kramdown/error' +require 'kramdown/parser' +require 'kramdown/converter' +require 'kramdown/options' +require 'kramdown/utils' + +module Kramdown + + # Return the data directory for kramdown. + def self.data_dir + unless defined?(@data_dir) + require 'rbconfig' + @data_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'kramdown')) + @data_dir = File.expand_path(File.join(RbConfig::CONFIG["datadir"], "kramdown")) unless File.exist?(@data_dir) + raise "kramdown data directory not found! This is a bug, please report it!" unless File.directory?(@data_dir) + end + @data_dir + end + + # The main interface to kramdown. + # + # This class provides a one-stop-shop for using kramdown to convert text into various output + # formats. Use it like this: + # + # require 'kramdown' + # doc = Kramdown::Document.new('This *is* some kramdown text') + # puts doc.to_html + # + # The #to_html method is a shortcut for using the Converter::Html class. See #method_missing for + # more information. + # + # The second argument to the ::new method is an options hash for customizing the behaviour of the + # used parser and the converter. See ::new for more information! + class Document + + # The root Element of the element tree. It is immediately available after the ::new method has + # been called. + attr_accessor :root + + # The options hash which holds the options for parsing/converting the Kramdown document. + attr_reader :options + + # An array of warning messages. It is filled with warnings during the parsing phase (i.e. in + # ::new) and the conversion phase. + attr_reader :warnings + + # Create a new Kramdown document from the string +source+ and use the provided +options+. The + # options that can be used are defined in the Options module. + # + # The special options key :input can be used to select the parser that should parse the + # +source+. It has to be the name of a class in the Kramdown::Parser module. For example, to + # select the kramdown parser, one would set the :input key to +Kramdown+. If this key is not + # set, it defaults to +Kramdown+. + # + # The +source+ is immediately parsed by the selected parser so that the root element is + # immediately available and the output can be generated. + def initialize(source, options = {}) + @options = Options.merge(options).freeze + parser = (@options[:input] || 'kramdown').to_s + parser = parser[0..0].upcase + parser[1..-1] + try_require('parser', parser) + if Parser.const_defined?(parser) + @root, @warnings = Parser.const_get(parser).parse(source, @options) + else + raise Kramdown::Error, "kramdown has no parser to handle the specified " \ + "input format: #{@options[:input]}" + end + end + + # Check if a method is invoked that begins with +to_+ and if so, try to instantiate a converter + # class (i.e. a class in the Kramdown::Converter module) and use it for converting the document. + # + # For example, +to_html+ would instantiate the Kramdown::Converter::Html class. + def method_missing(id, *attr, &block) + if id.to_s =~ /^to_(\w+)$/ && (name = Utils.camelize($1)) && + try_require('converter', name) && Converter.const_defined?(name) + output, warnings = Converter.const_get(name).convert(@root, @options) + @warnings.concat(warnings) + output + else + super + end + end + + def inspect #:nodoc: + "<KD:Document: options=#{@options.inspect} root=#{@root.inspect} warnings=#{@warnings.inspect}>" + end + + # Try requiring a parser or converter class and don't raise an error if the file is not found. + def try_require(type, name) + require("kramdown/#{type}/#{Utils.snake_case(name)}") + true + rescue LoadError + true + end + protected :try_require + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/element.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/element.rb new file mode 100644 index 000000000000..c1d1facd667c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/element.rb @@ -0,0 +1,551 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + + # Represents all elements in the element tree. + # + # kramdown only uses this one class for representing all available elements in an element tree + # (paragraphs, headers, emphasis, ...). The type of element can be set via the #type accessor. + # + # The root of a kramdown element tree has to be an element of type :root. It needs to have certain + # option keys set so that conversions work correctly. If only a part of a tree should be + # converted, duplicate the root node and assign the #children appropriately, e.g: + # + # root = doc.root + # new_root = root.dup + # new_root.children = [root.children[0]] # assign new array with elements to convert + # + # Following is a description of all supported element types. + # + # Note that the option :location may contain the start line number of an element in the source + # document. + # + # == Structural Elements + # + # === :root + # + # [Category] None + # [Usage context] As the root element of a document + # [Content model] Block-level elements + # + # Represents the root of a kramdown document. + # + # The root element contains the following option keys: + # + # :encoding:: When running on Ruby 1.9 this key has to be set to the encoding used for the text + # parts of the kramdown document. + # + # :abbrev_defs:: This key may be used to store the mapping of abbreviation to abbreviation + # definition. + # + # :abbrev_attr:: This key may be used to store the mapping of abbreviation to abbreviation + # attributes. + # + # :options:: This key may be used to store options that were set during parsing of the document. + # + # :footnote_count:: This key stores the number of actually referenced footnotes of the document. + # + # === :blank + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] Empty + # + # Represents one or more blank lines. It is not allowed to have two or more consecutive blank + # elements. + # + # The +value+ field may contain the original content of the blank lines. + # + # + # === :p + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] Span-level elements + # + # Represents a paragraph. + # + # If the option :transparent is +true+, this element just represents a block of text. I.e. this + # element just functions as a container for span-level elements. + # + # + # === :header + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] Span-level elements + # + # Represents a header. + # + # The option :level specifies the header level and has to contain a number between 1 and \6. The + # option :raw_text has to contain the raw header text. + # + # + # === :blockquote + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] Block-level elements + # + # Represents a blockquote. + # + # + # === :codeblock + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] Empty + # + # Represents a code block, i.e. a block of text that should be used as-is. + # + # The +value+ field has to contain the content of the code block. + # + # The option :lang specifies a highlighting language with possible HTML style options (e.g. + # php?start_inline=1) and should be used instead of a possibly also available language embedded in + # a class name of the form 'language-LANG'. + # + # + # === :ul + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] One or more :li elements + # + # Represents an unordered list. + # + # + # === :ol + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] One or more :li elements + # + # Represents an ordered list. + # + # + # === :li + # + # [Category] Block-level element + # [Usage context] Inside :ol and :ul elements + # [Content model] Block-level elements + # + # Represents a list item of an ordered or unordered list. + # + # Note that the first child of a list item must not be a :blank element! + # + # + # === :dl + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] One or more groups each consisting of one or more :dt elements followed by one + # or more :dd elements. + # + # Represents a definition list which contains groups consisting of terms and definitions for them. + # + # + # === :dt + # + # [Category] Block-level element + # [Usage context] Before :dt or :dd elements inside a :dl elment + # [Content model] Span-level elements + # + # Represents the term part of a term-definition group in a definition list. + # + # + # === :dd + # + # [Category] Block-level element + # [Usage context] After :dt or :dd elements inside a :dl elment + # [Content model] Block-level elements + # + # Represents the definition part of a term-definition group in a definition list. + # + # + # === :hr + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] None + # + # Represents a horizontal line. + # + # + # === :table + # + # [Category] Block-level element + # [Usage context] Where block-level elements are expected + # [Content model] Zero or one :thead elements, one or more :tbody elements, zero or one :tfoot + # elements + # + # Represents a table. Each table row (i.e. :tr element) of the table has to contain the same + # number of :td elements. + # + # The option :alignment has to be an array containing the alignment values, exactly one for each + # column of the table. The possible alignment values are :left, :center, :right and :default. + # + # + # === :thead + # + # [Category] None + # [Usage context] As first element inside a :table element + # [Content model] One or more :tr elements + # + # Represents the table header. + # + # + # === :tbody + # + # [Category] None + # [Usage context] After a :thead element but before a :tfoot element inside a :table element + # [Content model] One or more :tr elements + # + # Represents a table body. + # + # + # === :tfoot + # + # [Category] None + # [Usage context] As last element inside a :table element + # [Content model] One or more :tr elements + # + # Represents the table footer. + # + # + # === :tr + # + # [Category] None + # [Usage context] Inside :thead, :tbody and :tfoot elements + # [Content model] One or more :td elements + # + # Represents a table row. + # + # + # === :td + # + # [Category] Block-level element + # [Usage context] Inside :tr elements + # [Content model] As child of :thead/:tr span-level elements, as child of :tbody/:tr and + # :tfoot/:tr block-level elements + # + # Represents a table cell. + # + # + # === :math + # + # [Category] Block/span-level element + # [Usage context] Where block/span-level elements are expected + # [Content model] None + # + # Represents mathematical text that is written in LaTeX. + # + # The +value+ field has to contain the actual mathematical text. + # + # The option :category has to be set to either :span or :block depending on the context where the + # element is used. + # + # + # == Text Markup Elements + # + # === :text + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] None + # + # Represents text. + # + # The +value+ field has to contain the text itself. + # + # + # === :br + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] None + # + # Represents a hard line break. + # + # + # === :a + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] Span-level elements + # + # Represents a link to an URL. + # + # The attribute +href+ has to be set to the URL to which the link points. The attribute +title+ + # optionally contains the title of the link. + # + # + # === :img + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] None + # + # Represents an image. + # + # The attribute +src+ has to be set to the URL of the image. The attribute +alt+ has to contain a + # text description of the image. The attribute +title+ optionally contains the title of the image. + # + # + # === :codespan + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] None + # + # Represents verbatim text. + # + # The +value+ field has to contain the content of the code span. + # + # + # === :footnote + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] None + # + # Represents a footnote marker. + # + # The +value+ field has to contain an element whose children are the content of the footnote. The + # option :name has to contain a valid and unique footnote name. A valid footnote name consists of + # a word character or a digit and then optionally followed by other word characters, digits or + # dashes. + # + # + # === :em + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] Span-level elements + # + # Represents emphasis of its contents. + # + # + # === :strong + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] Span-level elements + # + # Represents strong importance for its contents. + # + # + # === :entity + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] None + # + # Represents an HTML entity. + # + # The +value+ field has to contain an instance of Kramdown::Utils::Entities::Entity. The option + # :original can be used to store the original representation of the entity. + # + # + # === :typographic_sym + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] None + # + # Represents a typographic symbol. + # + # The +value+ field needs to contain a Symbol representing the specific typographic symbol from + # the following list: + # + # :mdash:: An mdash character (---) + # :ndash:: An ndash character (--) + # :hellip:: An ellipsis (...) + # :laquo:: A left guillemet (<<) + # :raquo:: A right guillemet (>>) + # :laquo_space:: A left guillemet with a space (<< ) + # :raquo_space:: A right guillemet with a space ( >>) + # + # + # === :smart_quote + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] None + # + # Represents a quotation character. + # + # The +value+ field needs to contain a Symbol representing the specific quotation character: + # + # :lsquo:: Left single quote + # :rsquo:: Right single quote + # :ldquo:: Left double quote + # :rdquo:: Right double quote + # + # + # === :abbreviation + # + # [Category] Span-level element + # [Usage context] Where span-level elements are expected + # [Content model] None + # + # Represents a text part that is an abbreviation. + # + # The +value+ field has to contain the text part that is the abbreviation. The definition of the + # abbreviation is stored in the :root element of the document. + # + # + # == Other Elements + # + # === :html_element + # + # [Category] Block/span-level element + # [Usage context] Where block/span-level elements or raw HTML elements are expected + # [Content model] Depends on the element + # + # Represents an HTML element. + # + # The +value+ field has to contain the name of the HTML element the element is representing. + # + # The option :category has to be set to either :span or :block depending on the whether the + # element is a block-level or a span-level element. The option :content_model has to be set to the + # content model for the element (either :block if it contains block-level elements, :span if it + # contains span-level elements or :raw if it contains raw content). + # + # + # === :xml_comment + # + # [Category] Block/span-level element + # [Usage context] Where block/span-level elements are expected or in raw HTML elements + # [Content model] None + # + # Represents an XML/HTML comment. + # + # The +value+ field has to contain the whole XML/HTML comment including the delimiters. + # + # The option :category has to be set to either :span or :block depending on the context where the + # element is used. + # + # + # === :xml_pi + # + # [Category] Block/span-level element + # [Usage context] Where block/span-level elements are expected or in raw HTML elements + # [Content model] None + # + # Represents an XML/HTML processing instruction. + # + # The +value+ field has to contain the whole XML/HTML processing instruction including the + # delimiters. + # + # The option :category has to be set to either :span or :block depending on the context where the + # element is used. + # + # + # === :comment + # + # [Category] Block/span-level element + # [Usage context] Where block/span-level elements are expected + # [Content model] None + # + # Represents a comment. + # + # The +value+ field has to contain the comment. + # + # The option :category has to be set to either :span or :block depending on the context where the + # element is used. If it is set to :span, then no blank lines are allowed in the comment. + # + # + # === :raw + # + # [Category] Block/span-level element + # [Usage context] Where block/span-level elements are expected + # [Content model] None + # + # Represents a raw string that should not be modified. For example, the element could contain some + # HTML code that should be output as-is without modification and escaping. + # + # The +value+ field has to contain the actual raw text. + # + # The option :category has to be set to either :span or :block depending on the context where the + # element is used. If it is set to :span, then no blank lines are allowed in the raw text. + # + # The option :type can be set to an array of strings to define for which converters the raw string + # is valid. + # + class Element + + # A symbol representing the element type. For example, :p or :blockquote. + attr_accessor :type + + # The value of the element. The interpretation of this field depends on the type of the element. + # Many elements don't use this field. + attr_accessor :value + + # The child elements of this element. + attr_accessor :children + + # Create a new Element object of type +type+. The optional parameters +value+, +attr+ and + # +options+ can also be set in this constructor for convenience. + def initialize(type, value = nil, attr = nil, options = nil) + @type, @value, @attr, @options = type, value, attr, options + @children = [] + end + + # The attributes of the element. + def attr + @attr ||= {} + end + + # The options hash for the element. It is used for storing arbitray options. + def options + @options ||= {} + end + + def inspect #:nodoc: + "<kd:#{@type}" \ + "#{value.nil? ? '' : ' value=' + value.inspect}" \ + "#{attr.empty? ? '' : ' attr=' + attr.inspect}" \ + "#{options.empty? ? '' : ' options=' + options.inspect}" \ + "#{children.empty? ? '' : ' children=' + children.inspect}>" + end + + CATEGORY = {} # :nodoc: + [:blank, :p, :header, :blockquote, :codeblock, :ul, :ol, :li, :dl, :dt, :dd, + :table, :td, :hr].each {|b| CATEGORY[b] = :block } + [:text, :a, :br, :img, :codespan, :footnote, :em, :strong, :entity, :typographic_sym, + :smart_quote, :abbreviation].each {|b| CATEGORY[b] = :span } + + # Return the category of +el+ which can be :block, :span or +nil+. + # + # Most elements have a fixed category, however, some elements can either appear in a block-level + # or a span-level context. These elements need to have the option :category correctly set. + def self.category(el) + CATEGORY[el.type] || el.options[:category] + end + + # syntactic sugar to simplify calls such as +Kramdown::Element.category(el) == :block+ with + # +el.block?+. + # + # Returns boolean true or false. + def block? + (CATEGORY[type] || options[:category]) == :block + end + + # syntactic sugar to simplify calls such as +Kramdown::Element.category(el) == :span+ with + # +el.span?+. + # + # Returns boolean true or false. + def span? + (CATEGORY[type] || options[:category]) == :span + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/error.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/error.rb new file mode 100644 index 000000000000..81ffbc9d3f76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/error.rb @@ -0,0 +1,17 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + + # This error is raised when an error condition is encountered. + # + # *Note* that this error is only raised by the support framework for the parsers and converters. + class Error < RuntimeError; end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/options.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/options.rb new file mode 100644 index 000000000000..68a3ea8247ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/options.rb @@ -0,0 +1,608 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'yaml' + +module Kramdown + + # This module defines all options that are used by parsers and/or converters as well as providing + # methods to deal with the options. + module Options + + # Helper class introducing a boolean type for specifying boolean values (+true+ and +false+) as + # option types. + class Boolean + + # Return +true+ if +other+ is either +true+ or +false+ + def self.===(other) + FalseClass === other || TrueClass === other + end + + end + + # ---------------------------- + # :section: Option definitions + # + # This sections describes the methods that can be used on the Options module. + # ---------------------------- + + # Struct class for storing the definition of an option. + Definition = Struct.new(:name, :type, :default, :desc, :validator) + + # Allowed option types. + ALLOWED_TYPES = [String, Integer, Float, Symbol, Boolean, Object] + + @options = {} + @cached_defaults = nil + + # Define a new option called +name+ (a Symbol) with the given +type+ (String, Integer, Float, + # Symbol, Boolean, Object), default value +default+ and the description +desc+. If a block is + # specified, it should validate the value and either raise an error or return a valid value. + # + # The type 'Object' should only be used for complex types for which none of the other types + # suffices. A block needs to be specified when using type 'Object' and it has to cope with + # a value given as string and as the opaque type. + def self.define(name, type, default, desc, &block) + name = name.to_sym + raise ArgumentError, "Option name #{name} is already used" if @options.key?(name) + raise ArgumentError, "Invalid option type #{type} specified" unless ALLOWED_TYPES.include?(type) + raise ArgumentError, "Invalid type for default value" if !(type === default) && !default.nil? + raise ArgumentError, "Missing validator block" if type == Object && block.nil? + @options[name] = Definition.new(name, type, default, desc, block) + @cached_defaults = nil + end + + # Return all option definitions. + def self.definitions + @options + end + + # Return +true+ if an option called +name+ is defined. + def self.defined?(name) + @options.key?(name.to_sym) + end + + # Return a Hash with the default values for all options. + def self.defaults + @cached_defaults ||= begin + temp = {} + @options.each {|_n, o| temp[o.name] = o.default } + temp.freeze + end + end + + # Merge the #defaults Hash with the *parsed* options from the given Hash, i.e. only valid option + # names are considered and their value is run through the #parse method. + def self.merge(hash) + temp = defaults.dup + hash.each do |k, v| + k = k.to_sym + temp[k] = @options.key?(k) ? parse(k, v) : v + end + temp + end + + # Parse the given value +data+ as if it was a value for the option +name+ and return the parsed + # value with the correct type. + # + # If +data+ already has the correct type, it is just returned. Otherwise it is converted to a + # String and then to the correct type. + def self.parse(name, data) + name = name.to_sym + raise ArgumentError, "No option named #{name} defined" unless @options.key?(name) + unless @options[name].type === data + data = data.to_s + data = if @options[name].type == String + data + elsif @options[name].type == Integer + Integer(data) rescue raise Kramdown::Error, "Invalid integer value for option '#{name}': '#{data}'" + elsif @options[name].type == Float + Float(data) rescue raise Kramdown::Error, "Invalid float value for option '#{name}': '#{data}'" + elsif @options[name].type == Symbol + str_to_sym(data) + elsif @options[name].type == Boolean + data.downcase.strip != 'false' && !data.empty? + end + end + data = @options[name].validator[data] if @options[name].validator + data + end + + # Converts the given String +data+ into a Symbol or +nil+ with the + # following provisions: + # + # - A leading colon is stripped from the string. + # - An empty value or a value equal to "nil" results in +nil+. + def self.str_to_sym(data) + data = data.strip + data = data[1..-1] if data[0] == ':' + (data.empty? || data == 'nil' ? nil : data.to_sym) + end + + # ---------------------------- + # :section: Option Validators + # + # This sections contains all pre-defined option validators. + # ---------------------------- + + # Ensures that the option value +val+ for the option called +name+ is a valid array. The + # parameter +val+ can be + # + # - a comma separated string which is split into an array of values + # - or an array. + # + # Optionally, the array is checked for the correct size. + def self.simple_array_validator(val, name, size = nil) + if String === val + val = val.split(/,/) + elsif !(Array === val) + raise Kramdown::Error, "Invalid type #{val.class} for option #{name}" + end + if size && val.size != size + raise Kramdown::Error, "Option #{name} needs exactly #{size} values" + end + val + end + + # Ensures that the option value +val+ for the option called +name+ is a valid hash. The + # parameter +val+ can be + # + # - a hash in YAML format + # - or a Ruby Hash object. + def self.simple_hash_validator(val, name) + if String === val + begin + val = YAML.safe_load(val) + rescue RuntimeError, ArgumentError, SyntaxError + raise Kramdown::Error, "Invalid YAML value for option #{name}" + end + end + raise Kramdown::Error, "Invalid type #{val.class} for option #{name}" unless Hash === val + val + end + + # ---------------------------- + # :section: Option Definitions + # + # This sections contains all option definitions that are used by the included + # parsers/converters. + # ---------------------------- + + define(:template, String, '', <<~EOF) + The name of an ERB template file that should be used to wrap the output + or the ERB template itself. + + This is used to wrap the output in an environment so that the output can + be used as a stand-alone document. For example, an HTML template would + provide the needed header and body tags so that the whole output is a + valid HTML file. If no template is specified, the output will be just + the converted text. + + When resolving the template file, the given template name is used first. + If such a file is not found, the converter extension (the same as the + converter name) is appended. If the file still cannot be found, the + templates name is interpreted as a template name that is provided by + kramdown (without the converter extension). If the file is still not + found, the template name is checked if it starts with 'string://' and if + it does, this prefix is removed and the rest is used as template + content. + + kramdown provides a default template named 'document' for each converter. + + Default: '' + Used by: all converters + EOF + + define(:auto_ids, Boolean, true, <<~EOF) + Use automatic header ID generation + + If this option is `true`, ID values for all headers are automatically + generated if no ID is explicitly specified. + + Default: true + Used by: HTML/Latex converter + EOF + + define(:auto_id_stripping, Boolean, false, <<~EOF) + Strip all formatting from header text for automatic ID generation + + If this option is `true`, only the text elements of a header are used + for generating the ID later (in contrast to just using the raw header + text line). + + This option will be removed in version 2.0 because this will be the + default then. + + Default: false + Used by: kramdown parser + EOF + + define(:auto_id_prefix, String, '', <<~EOF) + Prefix used for automatically generated header IDs + + This option can be used to set a prefix for the automatically generated + header IDs so that there is no conflict when rendering multiple kramdown + documents into one output file separately. The prefix should only + contain characters that are valid in an ID! + + Default: '' + Used by: HTML/Latex converter + EOF + + define(:transliterated_header_ids, Boolean, false, <<~EOF) + Transliterate the header text before generating the ID + + Only ASCII characters are used in headers IDs. This is not good for + languages with many non-ASCII characters. By enabling this option + the header text is transliterated to ASCII as good as possible so that + the resulting header ID is more useful. + + The stringex library needs to be installed for this feature to work! + + Default: false + Used by: HTML/Latex converter + EOF + + define(:parse_block_html, Boolean, false, <<~EOF) + Process kramdown syntax in block HTML tags + + If this option is `true`, the kramdown parser processes the content of + block HTML tags as text containing block-level elements. Since this is + not wanted normally, the default is `false`. It is normally better to + selectively enable kramdown processing via the markdown attribute. + + Default: false + Used by: kramdown parser + EOF + + define(:parse_span_html, Boolean, true, <<~EOF) + Process kramdown syntax in span HTML tags + + If this option is `true`, the kramdown parser processes the content of + span HTML tags as text containing span-level elements. + + Default: true + Used by: kramdown parser + EOF + + define(:html_to_native, Boolean, false, <<~EOF) + Convert HTML elements to native elements + + If this option is `true`, the parser converts HTML elements to native + elements. For example, when parsing `<em>hallo</em>` the emphasis tag + would normally be converted to an `:html` element with tag type `:em`. + If `html_to_native` is `true`, then the emphasis would be converted to a + native `:em` element. + + This is useful for converters that cannot deal with HTML elements. + + Default: false + Used by: kramdown parser + EOF + + define(:link_defs, Object, {}, <<~EOF) do |val| + Pre-defines link definitions + + This option can be used to pre-define link definitions. The value needs + to be a Hash where the keys are the link identifiers and the values are + two element Arrays with the link URL and the link title. + + If the value is a String, it has to contain a valid YAML hash and the + hash has to follow the above guidelines. + + Default: {} + Used by: kramdown parser + EOF + val = simple_hash_validator(val, :link_defs) + val.each do |_k, v| + if !(Array === v) || v.size > 2 || v.empty? + raise Kramdown::Error, "Invalid structure for hash value of option #{name}" + end + v << nil if v.size == 1 + end + val + end + + define(:footnote_nr, Integer, 1, <<~EOF) + The number of the first footnote + + This option can be used to specify the number that is used for the first + footnote. + + Default: 1 + Used by: HTML converter + EOF + + define(:entity_output, Symbol, :as_char, <<~EOF) + Defines how entities are output + + The possible values are :as_input (entities are output in the same + form as found in the input), :numeric (entities are output in numeric + form), :symbolic (entities are output in symbolic form if possible) or + :as_char (entities are output as characters if possible, only available + on Ruby 1.9). + + Default: :as_char + Used by: HTML converter, kramdown converter + EOF + + TOC_LEVELS_RANGE = (1..6).freeze + TOC_LEVELS_ARRAY = TOC_LEVELS_RANGE.to_a.freeze + private_constant :TOC_LEVELS_RANGE, :TOC_LEVELS_ARRAY + + define(:toc_levels, Object, TOC_LEVELS_ARRAY, <<~EOF) do |val| + Defines the levels that are used for the table of contents + + The individual levels can be specified by separating them with commas + (e.g. 1,2,3) or by using the range syntax (e.g. 1..3). Only the + specified levels are used for the table of contents. + + Default: 1..6 + Used by: HTML/Latex converter + EOF + case val + when String + if val =~ /^(\d)\.\.(\d)$/ + val = Range.new($1.to_i, $2.to_i).to_a + elsif val =~ /^\d(?:,\d)*$/ + val = val.split(/,/).map(&:to_i).uniq + else + raise Kramdown::Error, "Invalid syntax for option toc_levels" + end + when Array + unless val.eql?(TOC_LEVELS_ARRAY) + val = val.map(&:to_i).uniq + end + when Range + if val.eql?(TOC_LEVELS_RANGE) + val = TOC_LEVELS_ARRAY + else + val = val.map(&:to_i).uniq + end + else + raise Kramdown::Error, "Invalid type #{val.class} for option toc_levels" + end + if val.any? {|i| !TOC_LEVELS_RANGE.cover?(i) } + raise Kramdown::Error, "Level numbers for option toc_levels have to be integers from 1 to 6" + end + val + end + + define(:line_width, Integer, 72, <<~EOF) + Defines the line width to be used when outputting a document + + Default: 72 + Used by: kramdown converter + EOF + + define(:latex_headers, Object, %w[section subsection subsubsection paragraph subparagraph subparagraph], <<~EOF) do |val| + Defines the LaTeX commands for different header levels + + The commands for the header levels one to six can be specified by + separating them with commas. + + Default: section,subsection,subsubsection,paragraph,subparagraph,subparagraph + Used by: Latex converter + EOF + simple_array_validator(val, :latex_headers, 6) + end + + SMART_QUOTES_ENTITIES = %w[lsquo rsquo ldquo rdquo].freeze + SMART_QUOTES_STR = SMART_QUOTES_ENTITIES.join(',').freeze + private_constant :SMART_QUOTES_ENTITIES, :SMART_QUOTES_STR + + define(:smart_quotes, Object, SMART_QUOTES_ENTITIES, <<~EOF) do |val| + Defines the HTML entity names or code points for smart quote output + + The entities identified by entity name or code point that should be + used for, in order, a left single quote, a right single quote, a left + double and a right double quote are specified by separating them with + commas. + + Default: lsquo,rsquo,ldquo,rdquo + Used by: HTML/Latex converter + EOF + if val == SMART_QUOTES_STR || val == SMART_QUOTES_ENTITIES + SMART_QUOTES_ENTITIES + else + val = simple_array_validator(val, :smart_quotes, 4) + val.map! {|v| Integer(v) rescue v } + val + end + end + + define(:typographic_symbols, Object, {}, <<~EOF) do |val| + Defines a mapping from typographical symbol to output characters + + Typographical symbols are normally output using their equivalent Unicode + codepoint. However, sometimes one wants to change the output, mostly to + fallback to a sequence of ASCII characters. + + This option allows this by specifying a mapping from typographical + symbol to its output string. For example, the mapping {hellip: ...} would + output the standard ASCII representation of an ellipsis. + + The available typographical symbol names are: + + * hellip: ellipsis + * mdash: em-dash + * ndash: en-dash + * laquo: left guillemet + * raquo: right guillemet + * laquo_space: left guillemet followed by a space + * raquo_space: right guillemet preceeded by a space + + Default: {} + Used by: HTML/Latex converter + EOF + val = simple_hash_validator(val, :typographic_symbols) + val.keys.each do |k| + val[k.kind_of?(String) ? str_to_sym(k) : k] = val.delete(k).to_s + end + val + end + + define(:remove_block_html_tags, Boolean, true, <<~EOF) + Remove block HTML tags + + If this option is `true`, the RemoveHtmlTags converter removes + block HTML tags. + + Default: true + Used by: RemoveHtmlTags converter + EOF + + define(:remove_span_html_tags, Boolean, false, <<~EOF) + Remove span HTML tags + + If this option is `true`, the RemoveHtmlTags converter removes + span HTML tags. + + Default: false + Used by: RemoveHtmlTags converter + EOF + + define(:header_offset, Integer, 0, <<~EOF) + Sets the output offset for headers + + If this option is c (may also be negative) then a header with level n + will be output as a header with level c+n. If c+n is lower than 1, + level 1 will be used. If c+n is greater than 6, level 6 will be used. + + Default: 0 + Used by: HTML converter, Kramdown converter, Latex converter + EOF + + define(:syntax_highlighter, Symbol, :rouge, <<~EOF) + Set the syntax highlighter + + Specifies the syntax highlighter that should be used for highlighting + code blocks and spans. If this option is set to +nil+, no syntax + highlighting is done. + + Options for the syntax highlighter can be set with the + syntax_highlighter_opts configuration option. + + Default: rouge + Used by: HTML/Latex converter + EOF + + define(:syntax_highlighter_opts, Object, {}, <<~EOF) do |val| + Set the syntax highlighter options + + Specifies options for the syntax highlighter set via the + syntax_highlighter configuration option. + + The value needs to be a hash with key-value pairs that are understood by + the used syntax highlighter. + + Default: {} + Used by: HTML/Latex converter + EOF + val = simple_hash_validator(val, :syntax_highlighter_opts) + val.keys.each do |k| + val[k.kind_of?(String) ? str_to_sym(k) : k] = val.delete(k) + end + val + end + + define(:math_engine, Symbol, :mathjax, <<~EOF) + Set the math engine + + Specifies the math engine that should be used for converting math + blocks/spans. If this option is set to +nil+, no math engine is used and + the math blocks/spans are output as is. + + Options for the selected math engine can be set with the + math_engine_opts configuration option. + + Default: mathjax + Used by: HTML converter + EOF + + define(:math_engine_opts, Object, {}, <<~EOF) do |val| + Set the math engine options + + Specifies options for the math engine set via the math_engine + configuration option. + + The value needs to be a hash with key-value pairs that are understood by + the used math engine. + + Default: {} + Used by: HTML converter + EOF + val = simple_hash_validator(val, :math_engine_opts) + val.keys.each do |k| + val[k.kind_of?(String) ? str_to_sym(k) : k] = val.delete(k) + end + val + end + + define(:footnote_backlink, String, '&#8617;', <<~EOF) + Defines the text that should be used for the footnote backlinks + + The footnote backlink is just text, so any special HTML characters will + be escaped. + + If the footnote backlint text is an empty string, no footnote backlinks + will be generated. + + Default: '&8617;' + Used by: HTML converter + EOF + + define(:footnote_backlink_inline, Boolean, false, <<~EOF) + Specifies whether the footnote backlink should always be inline + + With the default of false the footnote backlink is placed at the end of + the last paragraph if there is one, or an extra paragraph with only the + footnote backlink is created. + + Setting this option to true tries to place the footnote backlink in the + last, possibly nested paragraph or header. If this fails (e.g. in the + case of a table), an extra paragraph with only the footnote backlink is + created. + + Default: false + Used by: HTML converter + EOF + + define(:footnote_prefix, String, '', <<~EOF) + Prefix used for footnote IDs + + This option can be used to set a prefix for footnote IDs. This is useful + when rendering multiple documents into the same output file to avoid + duplicate IDs. The prefix should only contain characters that are valid + in an ID! + + Default: '' + Used by: HTML + EOF + + define(:remove_line_breaks_for_cjk, Boolean, false, <<~EOF) + Specifies whether line breaks should be removed between CJK characters + + Default: false + Used by: HTML converter + EOF + + define(:forbidden_inline_options, Object, %w[template], <<~EOF) do |val| + Defines the options that may not be set using the {::options} extension + + Default: template + Used by: HTML converter + EOF + val.map! {|item| item.kind_of?(String) ? str_to_sym(item) : item } + simple_array_validator(val, :forbidden_inline_options) + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser.rb new file mode 100644 index 000000000000..f77dcf6afc07 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser.rb @@ -0,0 +1,26 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + + # This module contains all available parsers. A parser takes an input string and converts the + # string to an element tree. + # + # New parsers should be derived from the Base class which provides common functionality - see its + # API documentation for how to create a custom converter class. + module Parser + + autoload :Base, 'kramdown/parser/base' + autoload :Kramdown, 'kramdown/parser/kramdown' + autoload :Html, 'kramdown/parser/html' + autoload :Markdown, 'kramdown/parser/markdown' + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/base.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/base.rb new file mode 100644 index 000000000000..71ced7ba1789 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/base.rb @@ -0,0 +1,131 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/utils' +require 'kramdown/parser' + +module Kramdown + + module Parser + + # == \Base class for parsers + # + # This class serves as base class for parsers. It provides common methods that can/should be + # used by all parsers, especially by those using StringScanner(Kramdown) for parsing. + # + # A parser object is used as a throw-away object, i.e. it is only used for storing the needed + # state information during parsing. Therefore one can't instantiate a parser object directly but + # only use the Base::parse method. + # + # == Implementing a parser + # + # Implementing a new parser is rather easy: just derive a new class from this class and put it + # in the Kramdown::Parser module -- the latter is needed so that the auto-detection of the new + # parser works correctly. Then you need to implement the +#parse+ method which has to contain + # the parsing code. + # + # Have a look at the Base::parse, Base::new and Base#parse methods for additional information! + class Base + + # The hash with the parsing options. + attr_reader :options + + # The array with the parser warnings. + attr_reader :warnings + + # The original source string. + attr_reader :source + + # The root element of element tree that is created from the source string. + attr_reader :root + + # Initialize the parser object with the +source+ string and the parsing +options+. + # + # The @root element, the @warnings array and @text_type (specifies the default type for newly + # created text nodes) are automatically initialized. + def initialize(source, options) + @source = source + @options = Kramdown::Options.merge(options) + @root = Element.new(:root, nil, nil, encoding: (source.encoding rescue nil), location: 1, + options: {}, abbrev_defs: {}, abbrev_attr: {}) + @warnings = [] + @text_type = :text + end + private_class_method(:new, :allocate) + + # Parse the +source+ string into an element tree, possibly using the parsing +options+, and + # return the root element of the element tree and an array with warning messages. + # + # Initializes a new instance of the calling class and then calls the +#parse+ method that must + # be implemented by each subclass. + def self.parse(source, options = {}) + parser = new(source, options) + parser.parse + [parser.root, parser.warnings] + end + + # Parse the source string into an element tree. + # + # The parsing code should parse the source provided in @source and build an element tree the + # root of which should be @root. + # + # This is the only method that has to be implemented by sub-classes! + def parse + raise NotImplementedError + end + + # Add the given warning +text+ to the warning array. + def warning(text) + @warnings << text + # TODO: add position information + end + + # Modify the string +source+ to be usable by the parser (unifies line ending characters to + # +\n+ and makes sure +source+ ends with a new line character). + def adapt_source(source) + unless source.valid_encoding? + raise "The source text contains invalid characters for the used encoding #{source.encoding}" + end + source = source.encode('UTF-8') + source.gsub!(/\r\n?/, "\n") + source.chomp! + source << "\n" + end + + # This helper method adds the given +text+ either to the last element in the +tree+ if it is a + # +type+ element or creates a new text element with the given +type+. + def add_text(text, tree = @tree, type = @text_type) + last = tree.children.last + if last && last.type == type + last.value << text + elsif !text.empty? + location = (last && last.options[:location] || tree.options[:location]) + tree.children << Element.new(type, text, nil, location: location) + end + end + + # Extract the part of the StringScanner +strscan+ backed string specified by the +range+. This + # method works correctly under Ruby 1.8 and Ruby 1.9. + def extract_string(range, strscan) + result = nil + begin + enc = strscan.string.encoding + strscan.string.force_encoding('ASCII-8BIT') + result = strscan.string[range].force_encoding(enc) + ensure + strscan.string.force_encoding(enc) + end + result + end + + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/html.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/html.rb new file mode 100644 index 000000000000..4c17fbe40579 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/html.rb @@ -0,0 +1,608 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'rexml/parsers/baseparser' +require 'strscan' +require 'kramdown/utils' +require 'kramdown/parser' + +module Kramdown + + module Parser + + # Used for parsing an HTML document. + # + # The parsing code is in the Parser module that can also be used by other parsers. + class Html < Base + + # Contains all constants that are used when parsing. + module Constants + + #:stopdoc: + # The following regexps are based on the ones used by REXML, with some slight modifications. + HTML_DOCTYPE_RE = /<!DOCTYPE.*?>/im + HTML_COMMENT_RE = /<!--(.*?)-->/m + HTML_INSTRUCTION_RE = /<\?(.*?)\?>/m + HTML_ATTRIBUTE_RE = /\s*(#{REXML::Parsers::BaseParser::UNAME_STR})(?:\s*=\s*(?:(\p{Word}+)|("|')(.*?)\3))?/m + HTML_TAG_RE = /<((?>#{REXML::Parsers::BaseParser::UNAME_STR}))\s*((?>\s+#{REXML::Parsers::BaseParser::UNAME_STR}(?:\s*=\s*(?:\p{Word}+|("|').*?\3))?)*)\s*(\/)?>/m + HTML_TAG_CLOSE_RE = /<\/(#{REXML::Parsers::BaseParser::UNAME_STR})\s*>/m + HTML_ENTITY_RE = /&([\w:][\-\w\.:]*);|&#(\d+);|&\#x([0-9a-fA-F]+);/ + + HTML_CONTENT_MODEL_BLOCK = %w[address applet article aside blockquote body + dd details div dl fieldset figure figcaption + footer form header hgroup iframe li main + map menu nav noscript object section summary td] + HTML_CONTENT_MODEL_SPAN = %w[a abbr acronym b bdo big button cite caption del dfn dt em + h1 h2 h3 h4 h5 h6 i ins label legend optgroup p q rb rbc + rp rt rtc ruby select small span strong sub sup th tt] + HTML_CONTENT_MODEL_RAW = %w[script style math option textarea pre code kbd samp var] + # The following elements are also parsed as raw since they need child elements that cannot + # be expressed using kramdown syntax: colgroup table tbody thead tfoot tr ul ol + + HTML_CONTENT_MODEL = Hash.new {|h, k| h[k] = :raw } + HTML_CONTENT_MODEL_BLOCK.each {|i| HTML_CONTENT_MODEL[i] = :block } + HTML_CONTENT_MODEL_SPAN.each {|i| HTML_CONTENT_MODEL[i] = :span } + HTML_CONTENT_MODEL_RAW.each {|i| HTML_CONTENT_MODEL[i] = :raw } + + # Some HTML elements like script belong to both categories (i.e. are valid in block and + # span HTML) and don't appear therefore! + # script, textarea + HTML_SPAN_ELEMENTS = %w[a abbr acronym b big bdo br button cite code del dfn em i img input + ins kbd label mark option q rb rbc rp rt rtc ruby samp select small + span strong sub sup tt u var] + HTML_BLOCK_ELEMENTS = %w[address article aside applet body blockquote caption col colgroup + dd div dl dt fieldset figcaption footer form h1 h2 h3 h4 h5 h6 + header hgroup hr html head iframe legend menu li main map nav ol + optgroup p pre section summary table tbody td th thead tfoot tr ul] + HTML_ELEMENTS_WITHOUT_BODY = %w[area base br col command embed hr img input keygen link + meta param source track wbr] + + HTML_ELEMENT = Hash.new(false) + (HTML_SPAN_ELEMENTS + HTML_BLOCK_ELEMENTS + HTML_ELEMENTS_WITHOUT_BODY + + HTML_CONTENT_MODEL.keys).each do |a| + HTML_ELEMENT[a] = true + end + end + + # Contains the parsing methods. This module can be mixed into any parser to get HTML parsing + # functionality. The only thing that must be provided by the class are instance variable + # @stack for storing the needed state and @src (instance of StringScanner) for the actual + # parsing. + module Parser + + include Constants + + # Process the HTML start tag that has already be scanned/checked via @src. + # + # Does the common processing steps and then yields to the caller for further processing + # (first parameter is the created element; the second parameter is +true+ if the HTML + # element is already closed, ie. contains no body; the third parameter specifies whether the + # body - and the end tag - need to be handled in case closed=false). + def handle_html_start_tag(line = nil) # :yields: el, closed, handle_body + name = @src[1] + name.downcase! if HTML_ELEMENT[name.downcase] + closed = !@src[4].nil? + attrs = parse_html_attributes(@src[2], line, HTML_ELEMENT[name]) + + el = Element.new(:html_element, name, attrs, category: :block) + el.options[:location] = line if line + @tree.children << el + + if !closed && HTML_ELEMENTS_WITHOUT_BODY.include?(el.value) + closed = true + end + if name == 'script' || name == 'style' + handle_raw_html_tag(name) + yield(el, false, false) + else + yield(el, closed, true) + end + end + + # Parses the given string for HTML attributes and returns the resulting hash. + # + # If the optional +line+ parameter is supplied, it is used in warning messages. + # + # If the optional +in_html_tag+ parameter is set to +false+, attributes are not modified to + # contain only lowercase letters. + def parse_html_attributes(str, line = nil, in_html_tag = true) + attrs = {} + str.scan(HTML_ATTRIBUTE_RE).each do |attr, val, _sep, quoted_val| + attr.downcase! if in_html_tag + if attrs.key?(attr) + warning("Duplicate HTML attribute '#{attr}' on line #{line || '?'} - overwriting previous one") + end + attrs[attr] = val || quoted_val || "" + end + attrs + end + + # Handle the raw HTML tag at the current position. + def handle_raw_html_tag(name) + curpos = @src.pos + if @src.scan_until(/(?=<\/#{name}\s*>)/mi) + add_text(extract_string(curpos...@src.pos, @src), @tree.children.last, :raw) + @src.scan(HTML_TAG_CLOSE_RE) + else + add_text(@src.rest, @tree.children.last, :raw) + @src.terminate + warning("Found no end tag for '#{name}' - auto-closing it") + end + end + + HTML_RAW_START = /(?=<(#{REXML::Parsers::BaseParser::UNAME_STR}|\/|!--|\?))/ # :nodoc: + + # Parse raw HTML from the current source position, storing the found elements in +el+. + # Parsing continues until one of the following criteria are fulfilled: + # + # - The end of the document is reached. + # - The matching end tag for the element +el+ is found (only used if +el+ is an HTML + # element). + # + # When an HTML start tag is found, processing is deferred to #handle_html_start_tag, + # providing the block given to this method. + def parse_raw_html(el, &block) + @stack.push(@tree) + @tree = el + + done = false + while !@src.eos? && !done + if (result = @src.scan_until(HTML_RAW_START)) + add_text(result, @tree, :text) + line = @src.current_line_number + if (result = @src.scan(HTML_COMMENT_RE)) + @tree.children << Element.new(:xml_comment, result, nil, category: :block, location: line) + elsif (result = @src.scan(HTML_INSTRUCTION_RE)) + @tree.children << Element.new(:xml_pi, result, nil, category: :block, location: line) + elsif @src.scan(HTML_TAG_RE) + if method(:handle_html_start_tag).arity.abs >= 1 + handle_html_start_tag(line, &block) + else + handle_html_start_tag(&block) # DEPRECATED: method needs to accept line number in 2.0 + end + elsif @src.scan(HTML_TAG_CLOSE_RE) + if @tree.value == (HTML_ELEMENT[@tree.value] ? @src[1].downcase : @src[1]) + done = true + else + add_text(@src.matched, @tree, :text) + warning("Found invalidly used HTML closing tag for '#{@src[1]}' on " \ + "line #{line} - ignoring it") + end + else + add_text(@src.getch, @tree, :text) + end + else + add_text(@src.rest, @tree, :text) + @src.terminate + if @tree.type == :html_element + warning("Found no end tag for '#{@tree.value}' on line " \ + "#{@tree.options[:location]} - auto-closing it") + end + done = true + end + end + + @tree = @stack.pop + end + + end + + # Converts HTML elements to native elements if possible. + class ElementConverter + + # :stopdoc: + + include Constants + include ::Kramdown::Utils::Entities + + REMOVE_TEXT_CHILDREN = %w[html head hgroup ol ul dl table colgroup tbody thead tfoot tr + select optgroup] + WRAP_TEXT_CHILDREN = %w[body section nav article aside header footer address div li dd + blockquote figure figcaption fieldset form] + REMOVE_WHITESPACE_CHILDREN = %w[body section nav article aside header footer address + div li dd blockquote figure figcaption td th fieldset form] + STRIP_WHITESPACE = %w[address article aside blockquote body caption dd div dl dt fieldset + figcaption form footer header h1 h2 h3 h4 h5 h6 legend li nav p + section td th] + SIMPLE_ELEMENTS = %w[em strong blockquote hr br img p thead tbody tfoot tr td th ul ol dl + li dl dt dd] + + def initialize(root) + @root = root + end + + def self.convert(root, el = root) + new(root).process(el) + end + + # Convert the element +el+ and its children. + def process(el, do_conversion = true, preserve_text = false, parent = nil) + case el.type + when :xml_comment, :xml_pi + ptype = if parent.nil? + 'div' + else + case parent.type + when :html_element then parent.value + when :code_span then 'code' + when :code_block then 'pre' + when :header then 'h1' + else parent.type.to_s + end + end + el.options.replace(category: (HTML_CONTENT_MODEL[ptype] == :span ? :span : :block)) + return + when :html_element + when :root + el.children.each {|c| process(c) } + remove_whitespace_children(el) + return + else return + end + + mname = "convert_#{el.value}" + if do_conversion && self.class.method_defined?(mname) + send(mname, el) + else + type = el.value + remove_text_children(el) if do_conversion && REMOVE_TEXT_CHILDREN.include?(type) + + if do_conversion && SIMPLE_ELEMENTS.include?(type) + set_basics(el, type.intern) + process_children(el, do_conversion, preserve_text) + else + process_html_element(el, do_conversion, preserve_text) + end + + if do_conversion + strip_whitespace(el) if STRIP_WHITESPACE.include?(type) + remove_whitespace_children(el) if REMOVE_WHITESPACE_CHILDREN.include?(type) + wrap_text_children(el) if WRAP_TEXT_CHILDREN.include?(type) + end + end + end + + def process_children(el, do_conversion = true, preserve_text = false) + el.children.map! do |c| + if c.type == :text + process_text(c.value, preserve_text || !do_conversion) + else + process(c, do_conversion, preserve_text, el) + c + end + end.flatten! + end + + # Process the HTML text +raw+: compress whitespace (if +preserve+ is +false+) and convert + # entities in entity elements. + def process_text(raw, preserve = false) + raw.gsub!(/\s+/, ' ') unless preserve + src = Kramdown::Utils::StringScanner.new(raw) + result = [] + until src.eos? + if (tmp = src.scan_until(/(?=#{HTML_ENTITY_RE})/o)) + result << Element.new(:text, tmp) + src.scan(HTML_ENTITY_RE) + val = src[1] || (src[2]&.to_i) || src[3].hex + result << if %w[lsquo rsquo ldquo rdquo].include?(val) + Element.new(:smart_quote, val.intern) + elsif %w[mdash ndash hellip laquo raquo].include?(val) + Element.new(:typographic_sym, val.intern) + else + begin + Element.new(:entity, entity(val), nil, original: src.matched) + rescue ::Kramdown::Error + src.pos -= src.matched_size - 1 + Element.new(:entity, ::Kramdown::Utils::Entities.entity('amp')) + end + end + else + result << Element.new(:text, src.rest) + src.terminate + end + end + result + end + + def process_html_element(el, do_conversion = true, preserve_text = false) + el.options.replace(category: HTML_SPAN_ELEMENTS.include?(el.value) ? :span : :block, + content_model: (do_conversion ? HTML_CONTENT_MODEL[el.value] : :raw)) + process_children(el, do_conversion, preserve_text) + end + + def remove_text_children(el) + el.children.delete_if {|c| c.type == :text } + end + + def wrap_text_children(el) + tmp = [] + last_is_p = false + el.children.each do |c| + if !c.block? || c.type == :text + unless last_is_p + tmp << Element.new(:p, nil, nil, transparent: true) + last_is_p = true + end + tmp.last.children << c + tmp + else + tmp << c + last_is_p = false + end + end + el.children = tmp + end + + def strip_whitespace(el) + return if el.children.empty? + if el.children.first.type == :text + el.children.first.value.lstrip! + end + if el.children.last.type == :text + el.children.last.value.rstrip! + end + end + + def remove_whitespace_children(el) + i = -1 + el.children = el.children.reject do |c| + i += 1 + c.type == :text && c.value.strip.empty? && + (i == 0 || i == el.children.length - 1 || ((el.children[i - 1]).block? && + (el.children[i + 1]).block?)) + end + end + + def set_basics(el, type, opts = {}) + el.type = type + el.options.replace(opts) + el.value = nil + end + + def extract_text(el, raw) + raw << el.value.to_s if el.type == :text + el.children.each {|c| extract_text(c, raw) } + end + + def convert_textarea(el) + process_html_element(el, true, true) + end + + def convert_a(el) + if el.attr['href'] + set_basics(el, :a) + process_children(el) + else + process_html_element(el, false) + end + end + + EMPHASIS_TYPE_MAP = {'em' => :em, 'i' => :em, 'strong' => :strong, 'b' => :strong} + def convert_em(el) + text = +'' + extract_text(el, text) + if text =~ /\A\s/ || text =~ /\s\z/ + process_html_element(el, false) + else + set_basics(el, EMPHASIS_TYPE_MAP[el.value]) + process_children(el) + end + end + %w[b strong i].each do |i| + alias_method("convert_#{i}".to_sym, :convert_em) + end + + def convert_h1(el) + set_basics(el, :header, level: el.value[1..1].to_i) + extract_text(el, el.options[:raw_text] = +'') + process_children(el) + end + %w[h2 h3 h4 h5 h6].each do |i| + alias_method("convert_#{i}".to_sym, :convert_h1) + end + + def convert_code(el) + raw = +'' + extract_text(el, raw) + result = process_text(raw, true) + begin + str = result.inject(+'') do |mem, c| + if c.type == :text + mem << c.value + elsif c.type == :entity + mem << if [60, 62, 34, 38].include?(c.value.code_point) + c.value.code_point.chr + else + c.value.char + end + elsif c.type == :smart_quote || c.type == :typographic_sym + mem << entity(c.value.to_s).char + else + raise "Bug - please report" + end + end + result.clear + result << Element.new(:text, str) + rescue StandardError + end + if result.length > 1 || result.first.type != :text + process_html_element(el, false, true) + else + if el.value == 'code' + set_basics(el, :codespan) + el.attr['class']&.gsub!(/\s+\bhighlighter-\w+\b|\bhighlighter-\w+\b\s*/, '') + else + set_basics(el, :codeblock) + if el.children.size == 1 && el.children.first.value == 'code' + value = (el.children.first.attr['class'] || '').scan(/\blanguage-\S+/).first + el.attr['class'] = "#{value} #{el.attr['class']}".rstrip if value + end + end + el.value = result.first.value + el.children.clear + end + end + alias convert_pre convert_code + + def convert_table(el) + unless is_simple_table?(el) + process_html_element(el, false) + return + end + remove_text_children(el) + process_children(el) + set_basics(el, :table) + + calc_alignment = lambda do |c| + if c.type == :tr + el.options[:alignment] = c.children.map do |td| + if td.attr['style'] + td.attr['style'].slice!(/(?:;\s*)?text-align:\s+(center|left|right)/) + td.attr.delete('style') if td.attr['style'].strip.empty? + $1 ? $1.to_sym : :default + else + :default + end + end + else + c.children.each {|cc| calc_alignment.call(cc) } + end + end + calc_alignment.call(el) + el.children.delete_if {|c| c.type == :html_element } + + change_th_type = lambda do |c| + if c.type == :th + c.type = :td + else + c.children.each {|cc| change_th_type.call(cc) } + end + end + change_th_type.call(el) + + if el.children.first.type == :tr + tbody = Element.new(:tbody) + tbody.children = el.children + el.children = [tbody] + end + end + + def is_simple_table?(el) + only_phrasing_content = lambda do |c| + c.children.all? do |cc| + (cc.type == :text || !HTML_BLOCK_ELEMENTS.include?(cc.value)) && only_phrasing_content.call(cc) + end + end + check_cells = proc do |c| + if c.value == 'th' || c.value == 'td' + return false unless only_phrasing_content.call(c) + else + c.children.each {|cc| check_cells.call(cc) } + end + end + check_cells.call(el) + + nr_cells = 0 + check_nr_cells = lambda do |t| + if t.value == 'tr' + count = t.children.select {|cc| cc.value == 'th' || cc.value == 'td' }.length + if count != nr_cells + if nr_cells == 0 + nr_cells = count + else + nr_cells = -1 + break + end + end + else + t.children.each {|cc| check_nr_cells.call(cc) } + end + end + check_nr_cells.call(el) + return false if nr_cells == -1 + + alignment = nil + check_alignment = proc do |t| + if t.value == 'tr' + cur_alignment = t.children.select {|cc| cc.value == 'th' || cc.value == 'td' }.map do |cell| + md = /text-align:\s+(center|left|right|justify|inherit)/.match(cell.attr['style'].to_s) + return false if md && (md[1] == 'justify' || md[1] == 'inherit') + md.nil? ? :default : md[1] + end + alignment = cur_alignment if alignment.nil? + return false if alignment != cur_alignment + else + t.children.each {|cc| check_alignment.call(cc) } + end + end + check_alignment.call(el) + + check_rows = lambda do |t, type| + t.children.all? {|r| (r.value == 'tr' || r.type == :text) && r.children.all? {|c| c.value == type || c.type == :text }} + end + check_rows.call(el, 'td') || + (el.children.all? do |t| + t.type == :text || (t.value == 'thead' && check_rows.call(t, 'th')) || + ((t.value == 'tfoot' || t.value == 'tbody') && check_rows.call(t, 'td')) + end && el.children.any? {|t| t.value == 'tbody' }) + end + + def convert_script(el) + if !is_math_tag?(el) + process_html_element(el) + else + handle_math_tag(el) + end + end + + def is_math_tag?(el) + el.attr['type'].to_s =~ /\bmath\/tex\b/ + end + + def handle_math_tag(el) + set_basics(el, :math, category: (el.attr['type'] =~ /mode=display/ ? :block : :span)) + el.value = el.children.shift.value.sub(/\A(?:%\s*)?<!\[CDATA\[\n?(.*?)(?:\s%)?\]\]>\z/m, '\1') + el.attr.delete('type') + end + + end + + include Parser + + # Parse the source string provided on initialization as HTML document. + def parse + @stack, @tree = [], @root + @src = Kramdown::Utils::StringScanner.new(adapt_source(source)) + + while true + if (result = @src.scan(/\s*#{HTML_INSTRUCTION_RE}/o)) + @tree.children << Element.new(:xml_pi, result.strip, nil, category: :block) + elsif (result = @src.scan(/\s*#{HTML_DOCTYPE_RE}/o)) + # ignore the doctype + elsif (result = @src.scan(/\s*#{HTML_COMMENT_RE}/o)) + @tree.children << Element.new(:xml_comment, result.strip, nil, category: :block) + else + break + end + end + + tag_handler = lambda do |c, closed, handle_body| + parse_raw_html(c, &tag_handler) if !closed && handle_body + end + parse_raw_html(@tree, &tag_handler) + + ElementConverter.convert(@tree) + end + + end + + end + +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown.rb new file mode 100644 index 000000000000..7205d58b3a55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown.rb @@ -0,0 +1,376 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'strscan' +require 'stringio' +require 'kramdown/parser' + +# TODO: use [[:alpha:]] in all regexp to allow parsing of international values in 1.9.1 +# NOTE: use @src.pre_match only before other check/match?/... operations, otherwise the content is changed + +module Kramdown + + module Parser + + # Used for parsing a document in kramdown format. + # + # If you want to extend the functionality of the parser, you need to do the following: + # + # * Create a new subclass + # * add the needed parser methods + # * modify the @block_parsers and @span_parsers variables and add the names of your parser + # methods + # + # Here is a small example for an extended parser class that parses ERB style tags as raw text if + # they are used as span-level elements (an equivalent block-level parser should probably also be + # made to handle the block case): + # + # require 'kramdown/parser/kramdown' + # + # class Kramdown::Parser::ERBKramdown < Kramdown::Parser::Kramdown + # + # def initialize(source, options) + # super + # @span_parsers.unshift(:erb_tags) + # end + # + # ERB_TAGS_START = /<%.*?%>/ + # + # def parse_erb_tags + # @src.pos += @src.matched_size + # @tree.children << Element.new(:raw, @src.matched) + # end + # define_parser(:erb_tags, ERB_TAGS_START, '<%') + # + # end + # + # The new parser can be used like this: + # + # require 'kramdown/document' + # # require the file with the above parser class + # + # Kramdown::Document.new(input_text, :input => 'ERBKramdown').to_html + # + class Kramdown < Base + + include ::Kramdown + + # Create a new Kramdown parser object with the given +options+. + def initialize(source, options) + super + + reset_env + + @alds = {} + @footnotes = {} + @link_defs = {} + update_link_definitions(@options[:link_defs]) + + @block_parsers = [:blank_line, :codeblock, :codeblock_fenced, :blockquote, :atx_header, + :horizontal_rule, :list, :definition_list, :block_html, :setext_header, + :block_math, :table, :footnote_definition, :link_definition, + :abbrev_definition, :block_extensions, :eob_marker, :paragraph] + @span_parsers = [:emphasis, :codespan, :autolink, :span_html, :footnote_marker, :link, + :smart_quotes, :inline_math, :span_extensions, :html_entity, + :typographic_syms, :line_break, :escaped_chars] + + @span_pattern_cache ||= Hash.new { |h, k| h[k] = {} } + end + private_class_method(:new, :allocate) + + # The source string provided on initialization is parsed into the @root element. + def parse + configure_parser + parse_blocks(@root, adapt_source(source)) + update_tree(@root) + correct_abbreviations_attributes + replace_abbreviations(@root) + @footnotes.each do |_name, data| + update_tree(data[:content]) + replace_abbreviations(data[:content]) + end + footnote_count = 0 + @footnotes.each do |name, data| + (footnote_count += 1; next) if data.key?(:marker) + line = data[:content].options[:location] + warning("Footnote definition for '#{name}' on line #{line} is unreferenced - ignoring") + end + @root.options[:footnote_count] = footnote_count + end + + protected + + # :doc: + # + # Update the parser specific link definitions with the data from +link_defs+ (the value of the + # :link_defs option). + # + # The parameter +link_defs+ is a hash where the keys are possibly unnormalized link IDs and + # the values are two element arrays consisting of the link target and a title (can be +nil+). + def update_link_definitions(link_defs) + link_defs.each {|k, v| @link_defs[normalize_link_id(k)] = v } + end + + # Adapt the object to allow parsing like specified in the options. + def configure_parser + @parsers = {} + (@block_parsers + @span_parsers).each do |name| + if self.class.has_parser?(name) + @parsers[name] = self.class.parser(name) + else + raise Kramdown::Error, "Unknown parser: #{name}" + end + end + @span_start, @span_start_re = span_parser_regexps + end + + # Create the needed span parser regexps. + def span_parser_regexps(parsers = @span_parsers) + span_start = /#{parsers.map {|name| @parsers[name].span_start }.join('|')}/ + [span_start, /(?=#{span_start})/] + end + + # Parse all block-level elements in +text+ into the element +el+. + def parse_blocks(el, text = nil) + @stack.push([@tree, @src, @block_ial]) + @tree, @block_ial = el, nil + @src = (text.nil? ? @src : ::Kramdown::Utils::StringScanner.new(text, el.options[:location])) + + status = catch(:stop_block_parsing) do + until @src.eos? + @block_parsers.any? do |name| + if @src.check(@parsers[name].start_re) + send(@parsers[name].method) + else + false + end + end || begin + warning('Warning: this should not occur - no block parser handled the line') + add_text(@src.scan(/.*\n/)) + end + end + end + + @tree, @src, @block_ial = *@stack.pop + status + end + + # Update the tree by parsing all :+raw_text+ elements with the span-level parser (resets the + # environment) and by updating the attributes from the IALs. + def update_tree(element) + last_blank = nil + element.children.map! do |child| + if child.type == :raw_text + last_blank = nil + reset_env(src: ::Kramdown::Utils::StringScanner.new(child.value, element.options[:location]), + text_type: :text) + parse_spans(child) + child.children + elsif child.type == :eob + update_attr_with_ial(child.attr, child.options[:ial]) if child.options[:ial] + [] + elsif child.type == :blank + if last_blank + last_blank.value << child.value + [] + else + last_blank = child + child + end + else + last_blank = nil + update_tree(child) + update_attr_with_ial(child.attr, child.options[:ial]) if child.options[:ial] + # DEPRECATED: option auto_id_stripping will be removed in 2.0 because then this will be + # the default behaviour + if child.type == :dt || (child.type == :header && @options[:auto_id_stripping]) + update_raw_text(child) + end + child + end + end.flatten! + end + + def span_pattern_cache(stop_re, span_start) + @span_pattern_cache[stop_re][span_start] ||= /(?=#{Regexp.union(stop_re, span_start)})/ + end + private :span_pattern_cache + + # Parse all span-level elements in the source string of @src into +el+. + # + # If the parameter +stop_re+ (a regexp) is used, parsing is immediately stopped if the regexp + # matches and if no block is given or if a block is given and it returns +true+. + # + # The parameter +parsers+ can be used to specify the (span-level) parsing methods that should + # be used for parsing. + # + # The parameter +text_type+ specifies the type which should be used for created text nodes. + def parse_spans(el, stop_re = nil, parsers = nil, text_type = @text_type) + @stack.push([@tree, @text_type]) unless @tree.nil? + @tree, @text_type = el, text_type + + span_start = @span_start + span_start_re = @span_start_re + span_start, span_start_re = span_parser_regexps(parsers) if parsers + parsers ||= @span_parsers + + used_re = (stop_re.nil? ? span_start_re : span_pattern_cache(stop_re, span_start)) + stop_re_found = false + while !@src.eos? && !stop_re_found + if (result = @src.scan_until(used_re)) + add_text(result) + if stop_re && @src.check(stop_re) + stop_re_found = (block_given? ? yield : true) + end + processed = parsers.any? do |name| + if @src.check(@parsers[name].start_re) + send(@parsers[name].method) + true + else + false + end + end unless stop_re_found + add_text(@src.getch) if !processed && !stop_re_found + else + (add_text(@src.rest); @src.terminate) unless stop_re + break + end + end + + @tree, @text_type = @stack.pop + + stop_re_found + end + + # Reset the current parsing environment. The parameter +env+ can be used to set initial + # values for one or more environment variables. + def reset_env(opts = {}) + opts = {text_type: :raw_text, stack: []}.merge(opts) + @src = opts[:src] + @tree = opts[:tree] + @block_ial = opts[:block_ial] + @stack = opts[:stack] + @text_type = opts[:text_type] + end + + # Return the current parsing environment. + def save_env + [@src, @tree, @block_ial, @stack, @text_type] + end + + # Restore the current parsing environment. + def restore_env(env) + @src, @tree, @block_ial, @stack, @text_type = *env + end + + # Update the given attributes hash +attr+ with the information from the inline attribute list + # +ial+ and all referenced ALDs. + def update_attr_with_ial(attr, ial) + ial[:refs]&.each do |ref| + update_attr_with_ial(attr, ref) if (ref = @alds[ref]) + end + ial.each do |k, v| + if k == IAL_CLASS_ATTR + attr[k] = "#{attr[k]} #{v}".lstrip + elsif k.kind_of?(String) + attr[k] = v + end + end + end + + # Update the raw text for automatic ID generation. + def update_raw_text(item) + raw_text = +'' + + append_text = lambda do |child| + if child.type == :text + raw_text << child.value + else + child.children.each {|c| append_text.call(c) } + end + end + + append_text.call(item) + item.options[:raw_text] = raw_text + end + + # Create a new block-level element, taking care of applying a preceding block IAL if it + # exists. This method should always be used for creating a block-level element! + def new_block_el(*args) + el = Element.new(*args) + if @block_ial + el.options[:ial] = @block_ial + @block_ial = nil + end + el + end + + @@parsers = {} + + # Struct class holding all the needed data for one block/span-level parser method. + Data = Struct.new(:name, :start_re, :span_start, :method) + + # Add a parser method + # + # * with the given +name+, + # * using +start_re+ as start regexp + # * and, for span parsers, +span_start+ as a String that can be used in a regexp and + # which identifies the starting character(s) + # + # to the registry. The method name is automatically derived from the +name+ or can explicitly + # be set by using the +meth_name+ parameter. + def self.define_parser(name, start_re, span_start = nil, meth_name = "parse_#{name}") + raise "A parser with the name #{name} already exists!" if @@parsers.key?(name) + @@parsers[name] = Data.new(name, start_re, span_start, meth_name) + end + + # Return the Data structure for the parser +name+. + def self.parser(name = nil) + @@parsers[name] + end + + # Return +true+ if there is a parser called +name+. + def self.has_parser?(name) + @@parsers.key?(name) + end + + # Regexp for matching indentation (one tab or four spaces) + INDENT = /^(?:\t| {4})/ + # Regexp for matching the optional space (zero or up to three spaces) + OPT_SPACE = / {0,3}/ + + require 'kramdown/parser/kramdown/blank_line' + require 'kramdown/parser/kramdown/eob' + require 'kramdown/parser/kramdown/paragraph' + require 'kramdown/parser/kramdown/header' + require 'kramdown/parser/kramdown/blockquote' + require 'kramdown/parser/kramdown/table' + require 'kramdown/parser/kramdown/codeblock' + require 'kramdown/parser/kramdown/horizontal_rule' + require 'kramdown/parser/kramdown/list' + require 'kramdown/parser/kramdown/link' + require 'kramdown/parser/kramdown/extensions' + require 'kramdown/parser/kramdown/footnote' + require 'kramdown/parser/kramdown/html' + require 'kramdown/parser/kramdown/escaped_chars' + require 'kramdown/parser/kramdown/html_entity' + require 'kramdown/parser/kramdown/line_break' + require 'kramdown/parser/kramdown/typographic_symbol' + require 'kramdown/parser/kramdown/autolink' + require 'kramdown/parser/kramdown/codespan' + require 'kramdown/parser/kramdown/emphasis' + require 'kramdown/parser/kramdown/smart_quotes' + require 'kramdown/parser/kramdown/math' + require 'kramdown/parser/kramdown/abbreviation' + + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/abbreviation.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/abbreviation.rb new file mode 100644 index 000000000000..d1cd29080c13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/abbreviation.rb @@ -0,0 +1,78 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + ABBREV_DEFINITION_START = /^#{OPT_SPACE}\*\[(.+?)\]:(.*?)\n/ + + # Parse the link definition at the current location. + def parse_abbrev_definition + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + abbrev_id, abbrev_text = @src[1], @src[2] + abbrev_text.strip! + if @root.options[:abbrev_defs][abbrev_id] + warning("Duplicate abbreviation ID '#{abbrev_id}' on line #{start_line_number} " \ + "- overwriting") + end + @tree.children << new_block_el(:eob, :abbrev_def) + @root.options[:abbrev_defs][abbrev_id] = abbrev_text + @root.options[:abbrev_attr][abbrev_id] = @tree.children.last + true + end + define_parser(:abbrev_definition, ABBREV_DEFINITION_START) + + # Correct abbreviation attributes. + def correct_abbreviations_attributes + @root.options[:abbrev_attr].keys.each do |k| + @root.options[:abbrev_attr][k] = @root.options[:abbrev_attr][k].attr + end + end + + # Replace the abbreviation text with elements. + def replace_abbreviations(el, regexps = nil) + return if @root.options[:abbrev_defs].empty? + unless regexps + sorted_abbrevs = @root.options[:abbrev_defs].keys.sort {|a, b| b.length <=> a.length } + regexps = [Regexp.union(*sorted_abbrevs.map {|k| /#{Regexp.escape(k)}/ })] + regexps << /(?=(?:\W|^)#{regexps.first}(?!\w))/ # regexp should only match on word boundaries + end + el.children.map! do |child| + if child.type == :text && el.options[:content_model] != :raw + if child.value =~ regexps.first + result = [] + strscan = Kramdown::Utils::StringScanner.new(child.value, child.options[:location]) + text_lineno = strscan.current_line_number + while (temp = strscan.scan_until(regexps.last)) + abbr_lineno = strscan.current_line_number + abbr = strscan.scan(regexps.first) # begin of line case of abbr with \W char as first one + if abbr.nil? + temp << strscan.scan(/\W|^/) + abbr = strscan.scan(regexps.first) + end + result << Element.new(:text, temp, nil, location: text_lineno) + result << Element.new(:abbreviation, abbr, nil, location: abbr_lineno) + text_lineno = strscan.current_line_number + end + result << Element.new(:text, strscan.rest, nil, location: text_lineno) + else + child + end + else + replace_abbreviations(child, regexps) + child + end + end.flatten! + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/autolink.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/autolink.rb new file mode 100644 index 000000000000..8fa974e98a31 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/autolink.rb @@ -0,0 +1,31 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + ACHARS = '[[:alnum:]]-_.' + AUTOLINK_START_STR = "<((mailto|https?|ftps?):.+?|[#{ACHARS}]+?@[#{ACHARS}]+?)>" + AUTOLINK_START = /#{AUTOLINK_START_STR}/u + + # Parse the autolink at the current location. + def parse_autolink + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + href = (@src[2].nil? ? "mailto:#{@src[1]}" : @src[1]) + el = Element.new(:a, nil, {'href' => href}, location: start_line_number) + add_text(@src[1].sub(/^mailto:/, ''), el) + @tree.children << el + end + define_parser(:autolink, AUTOLINK_START, '<') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/blank_line.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/blank_line.rb new file mode 100644 index 000000000000..bb8989a67ed3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/blank_line.rb @@ -0,0 +1,30 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + BLANK_LINE = /(?>^\s*\n)+/ + + # Parse the blank line at the current postition. + def parse_blank_line + @src.pos += @src.matched_size + if (last_child = @tree.children.last) && last_child.type == :blank + last_child.value << @src.matched + else + @tree.children << new_block_el(:blank, @src.matched) + end + true + end + define_parser(:blank_line, BLANK_LINE) + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/block_boundary.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/block_boundary.rb new file mode 100644 index 000000000000..daa0884963b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/block_boundary.rb @@ -0,0 +1,34 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/extensions' +require 'kramdown/parser/kramdown/blank_line' +require 'kramdown/parser/kramdown/eob' + +module Kramdown + module Parser + class Kramdown + + BLOCK_BOUNDARY = /#{BLANK_LINE}|#{EOB_MARKER}|#{IAL_BLOCK_START}|\Z/ + + # Return +true+ if we are after a block boundary. + def after_block_boundary? + last_child = @tree.children.last + !last_child || last_child.type == :blank || + (last_child.type == :eob && last_child.value.nil?) || @block_ial + end + + # Return +true+ if we are before a block boundary. + def before_block_boundary? + @src.check(self.class::BLOCK_BOUNDARY) + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/blockquote.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/blockquote.rb new file mode 100644 index 000000000000..8934c5a25c74 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/blockquote.rb @@ -0,0 +1,38 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/blank_line' +require 'kramdown/parser/kramdown/extensions' +require 'kramdown/parser/kramdown/eob' + +module Kramdown + module Parser + class Kramdown + + BLOCKQUOTE_START = /^#{OPT_SPACE}> ?/ + + # Parse the blockquote at the current location. + def parse_blockquote + start_line_number = @src.current_line_number + result = @src.scan(PARAGRAPH_MATCH) + until @src.match?(self.class::LAZY_END) + result << @src.scan(PARAGRAPH_MATCH) + end + result.gsub!(BLOCKQUOTE_START, '') + + el = new_block_el(:blockquote, nil, nil, location: start_line_number) + @tree.children << el + parse_blocks(el, result) + true + end + define_parser(:blockquote, BLOCKQUOTE_START) + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/codeblock.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/codeblock.rb new file mode 100644 index 000000000000..b2b76d97a54c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/codeblock.rb @@ -0,0 +1,57 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/blank_line' +require 'kramdown/parser/kramdown/extensions' +require 'kramdown/parser/kramdown/eob' +require 'kramdown/parser/kramdown/paragraph' + +module Kramdown + module Parser + class Kramdown + + CODEBLOCK_START = INDENT + CODEBLOCK_MATCH = /(?:#{BLANK_LINE}?(?:#{INDENT}[ \t]*\S.*\n)+(?:(?!#{IAL_BLOCK_START}|#{EOB_MARKER}|^#{OPT_SPACE}#{LAZY_END_HTML_STOP}|^#{OPT_SPACE}#{LAZY_END_HTML_START})^[ \t]*\S.*\n)*)*/ + + # Parse the indented codeblock at the current location. + def parse_codeblock + start_line_number = @src.current_line_number + data = @src.scan(self.class::CODEBLOCK_MATCH) + data.gsub!(/\n( {0,3}\S)/, ' \\1') + data.gsub!(INDENT, '') + @tree.children << new_block_el(:codeblock, data, nil, location: start_line_number) + true + end + define_parser(:codeblock, CODEBLOCK_START) + + FENCED_CODEBLOCK_START = /^~{3,}/ + FENCED_CODEBLOCK_MATCH = /^((~){3,})\s*?((\S+?)(?:\?\S*)?)?\s*?\n(.*?)^\1\2*\s*?\n/m + + # Parse the fenced codeblock at the current location. + def parse_codeblock_fenced + if @src.check(self.class::FENCED_CODEBLOCK_MATCH) + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + el = new_block_el(:codeblock, @src[5], nil, location: start_line_number, fenced: true) + lang = @src[3].to_s.strip + unless lang.empty? + el.options[:lang] = lang + el.attr['class'] = "language-#{@src[4]}" + end + @tree.children << el + true + else + false + end + end + define_parser(:codeblock_fenced, FENCED_CODEBLOCK_START) + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/codespan.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/codespan.rb new file mode 100644 index 000000000000..0b5f9fb72082 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/codespan.rb @@ -0,0 +1,54 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + CODESPAN_DELIMITER = /`+/ + + # Parse the codespan at the current scanner location. + def parse_codespan + start_line_number = @src.current_line_number + result = @src.scan(CODESPAN_DELIMITER) + simple = (result.length == 1) + saved_pos = @src.save_pos + + if simple && @src.pre_match =~ /\s\Z|\A\Z/ && @src.match?(/\s/) + add_text(result) + return + end + + # assign static regex to avoid allocating the same on every instance + # where +result+ equals a single-backtick. Interpolate otherwise. + if result == '`' + scan_pattern = /`/ + str_sub_pattern = /`\Z/ + else + scan_pattern = /#{result}/ + str_sub_pattern = /#{result}\Z/ + end + + if (text = @src.scan_until(scan_pattern)) + text.sub!(str_sub_pattern, '') + unless simple + text = text[1..-1] if text[0..0] == ' ' + text = text[0..-2] if text[-1..-1] == ' ' + end + @tree.children << Element.new(:codespan, text, nil, location: start_line_number) + else + @src.revert_pos(saved_pos) + add_text(result) + end + end + define_parser(:codespan, CODESPAN_DELIMITER, '`') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/emphasis.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/emphasis.rb new file mode 100644 index 000000000000..becba248ac73 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/emphasis.rb @@ -0,0 +1,61 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + EMPHASIS_START = /(?:\*\*?|__?)/ + + # Parse the emphasis at the current location. + def parse_emphasis + start_line_number = @src.current_line_number + saved_pos = @src.save_pos + + result = @src.scan(EMPHASIS_START) + element = (result.length == 2 ? :strong : :em) + type = result[0..0] + + if (type == '_' && @src.pre_match =~ /[[:alpha:]]-?[[:alpha:]]*\z/) || @src.check(/\s/) || + @tree.type == element || @stack.any? {|el, _| el.type == element } + add_text(result) + return + end + + sub_parse = lambda do |delim, elem| + el = Element.new(elem, nil, nil, location: start_line_number) + stop_re = /#{Regexp.escape(delim)}/ + found = parse_spans(el, stop_re) do + (@src.pre_match[-1, 1] !~ /\s/) && + (elem != :em || !@src.match?(/#{Regexp.escape(delim * 2)}(?!#{Regexp.escape(delim)})/)) && + (type != '_' || !@src.match?(/#{Regexp.escape(delim)}[[:alnum:]]/)) && !el.children.empty? + end + [found, el, stop_re] + end + + found, el, stop_re = sub_parse.call(result, element) + if !found && element == :strong && @tree.type != :em + @src.revert_pos(saved_pos) + @src.pos += 1 + found, el, stop_re = sub_parse.call(type, :em) + end + if found + @src.scan(stop_re) + @tree.children << el + else + @src.revert_pos(saved_pos) + @src.pos += result.length + add_text(result) + end + end + define_parser(:emphasis, EMPHASIS_START, '\*|_') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/eob.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/eob.rb new file mode 100644 index 000000000000..f151a9a34c24 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/eob.rb @@ -0,0 +1,26 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + EOB_MARKER = /^\^\s*?\n/ + + # Parse the EOB marker at the current location. + def parse_eob_marker + @src.pos += @src.matched_size + @tree.children << new_block_el(:eob) + true + end + define_parser(:eob_marker, EOB_MARKER) + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/escaped_chars.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/escaped_chars.rb new file mode 100644 index 000000000000..46d8b000261d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/escaped_chars.rb @@ -0,0 +1,25 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + ESCAPED_CHARS = /\\([\\.*_+`<>()\[\]{}#!:|"'\$=-])/ + + # Parse the backslash-escaped character at the current location. + def parse_escaped_chars + @src.pos += @src.matched_size + add_text(@src[1]) + end + define_parser(:escaped_chars, ESCAPED_CHARS, '\\\\') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/extensions.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/extensions.rb new file mode 100644 index 000000000000..637d0fa8cc8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/extensions.rb @@ -0,0 +1,214 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + IAL_CLASS_ATTR = 'class' + + # Parse the string +str+ and extract all attributes and add all found attributes to the hash + # +opts+. + def parse_attribute_list(str, opts) + return if str.strip.empty? || str.strip == ':' + attrs = str.scan(ALD_TYPE_ANY) + attrs.each do |key, sep, val, ref, id_and_or_class, _, _| + if ref + (opts[:refs] ||= []) << ref + elsif id_and_or_class + id_and_or_class.scan(ALD_TYPE_ID_OR_CLASS).each do |id_attr, class_attr| + if class_attr + opts[IAL_CLASS_ATTR] = "#{opts[IAL_CLASS_ATTR]} #{class_attr}".lstrip + else + opts['id'] = id_attr + end + end + else + val.gsub!(/\\(\}|#{sep})/, "\\1") + opts[key] = val + end + end + warning("No or invalid attributes found in IAL/ALD content: #{str}") if attrs.empty? + end + + # Update the +ial+ with the information from the inline attribute list +opts+. + def update_ial_with_ial(ial, opts) + (ial[:refs] ||= []).concat(opts[:refs]) if opts.key?(:refs) + opts.each do |k, v| + if k == IAL_CLASS_ATTR + ial[k] = "#{ial[k]} #{v}".lstrip + elsif k.kind_of?(String) + ial[k] = v + end + end + end + + # Parse the generic extension at the current point. The parameter +type+ can either be :block + # or :span depending whether we parse a block or span extension tag. + def parse_extension_start_tag(type) + saved_pos = @src.save_pos + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + + error_block = lambda do |msg| + warning(msg) + @src.revert_pos(saved_pos) + add_text(@src.getch) if type == :span + false + end + + if @src[4] || @src.matched == '{:/}' + name = (@src[4] ? "for '#{@src[4]}' " : '') + return error_block.call("Invalid extension stop tag #{name} found on line " \ + "#{start_line_number} - ignoring it") + end + + ext = @src[1] + opts = {} + body = nil + parse_attribute_list(@src[2] || '', opts) + + unless @src[3] + stop_re = (type == :block ? /#{EXT_BLOCK_STOP_STR % ext}/ : /#{EXT_STOP_STR % ext}/) + if (result = @src.scan_until(stop_re)) + body = result.sub!(stop_re, '') + body.chomp! if type == :block + else + return error_block.call("No stop tag for extension '#{ext}' found on line " \ + "#{start_line_number} - ignoring it") + end + end + + if !handle_extension(ext, opts, body, type, start_line_number) + error_block.call("Invalid extension with name '#{ext}' specified on line " \ + "#{start_line_number} - ignoring it") + else + true + end + end + + def handle_extension(name, opts, body, type, line_no = nil) + case name + when 'comment' + if body.kind_of?(String) + @tree.children << Element.new(:comment, body, nil, category: type, location: line_no) + end + true + when 'nomarkdown' + if body.kind_of?(String) + @tree.children << Element.new(:raw, body, nil, category: type, + location: line_no, type: opts['type'].to_s.split(/\s+/)) + end + true + when 'options' + opts.select do |k, v| + k = k.to_sym + if Kramdown::Options.defined?(k) + if @options[:forbidden_inline_options].include?(k) || + k == :forbidden_inline_options + warning("Option #{k} may not be set inline") + next false + end + + begin + val = Kramdown::Options.parse(k, v) + @options[k] = val + (@root.options[:options] ||= {})[k] = val + rescue StandardError + end + false + else + true + end + end.each do |k, _v| + warning("Unknown kramdown option '#{k}'") + end + @tree.children << new_block_el(:eob, :extension) if type == :block + true + else + false + end + end + + ALD_ID_CHARS = /[\w-]/ + ALD_ANY_CHARS = /\\\}|[^\}]/ + ALD_ID_NAME = /\w#{ALD_ID_CHARS}*/ + ALD_CLASS_NAME = /[^\s\.#]+/ + ALD_TYPE_KEY_VALUE_PAIR = /(#{ALD_ID_NAME})=("|')((?:\\\}|\\\2|[^\}\2])*?)\2/ + ALD_TYPE_CLASS_NAME = /\.(#{ALD_CLASS_NAME})/ + ALD_TYPE_ID_NAME = /#([A-Za-z][\w:-]*)/ + ALD_TYPE_ID_OR_CLASS = /#{ALD_TYPE_ID_NAME}|#{ALD_TYPE_CLASS_NAME}/ + ALD_TYPE_ID_OR_CLASS_MULTI = /((?:#{ALD_TYPE_ID_NAME}|#{ALD_TYPE_CLASS_NAME})+)/ + ALD_TYPE_REF = /(#{ALD_ID_NAME})/ + ALD_TYPE_ANY = /(?:\A|\s)(?:#{ALD_TYPE_KEY_VALUE_PAIR}|#{ALD_TYPE_REF}|#{ALD_TYPE_ID_OR_CLASS_MULTI})(?=\s|\Z)/ + ALD_START = /^#{OPT_SPACE}\{:(#{ALD_ID_NAME}):(#{ALD_ANY_CHARS}+)\}\s*?\n/ + + EXT_STOP_STR = "\\{:/(%s)?\\}" + EXT_START_STR = "\\{::(\\w+)(?:\\s(#{ALD_ANY_CHARS}*?)|)(\\/)?\\}" + EXT_BLOCK_START = /^#{OPT_SPACE}(?:#{EXT_START_STR}|#{EXT_STOP_STR % ALD_ID_NAME})\s*?\n/ + EXT_BLOCK_STOP_STR = "^#{OPT_SPACE}#{EXT_STOP_STR}\s*?\n" + + IAL_BLOCK = /\{:(?!:|\/)(#{ALD_ANY_CHARS}+)\}\s*?\n/ + IAL_BLOCK_START = /^#{OPT_SPACE}#{IAL_BLOCK}/ + + BLOCK_EXTENSIONS_START = /^#{OPT_SPACE}\{:/ + + # Parse one of the block extensions (ALD, block IAL or generic extension) at the current + # location. + def parse_block_extensions + if @src.scan(ALD_START) + parse_attribute_list(@src[2], @alds[@src[1]] ||= {}) + @tree.children << new_block_el(:eob, :ald) + true + elsif @src.check(EXT_BLOCK_START) + parse_extension_start_tag(:block) + elsif @src.scan(IAL_BLOCK_START) + if (last_child = @tree.children.last) && last_child.type != :blank && + (last_child.type != :eob || + [:link_def, :abbrev_def, :footnote_def].include?(last_child.value)) + parse_attribute_list(@src[1], last_child.options[:ial] ||= {}) + @tree.children << new_block_el(:eob, :ial) unless @src.check(IAL_BLOCK_START) + else + parse_attribute_list(@src[1], @block_ial ||= {}) + end + true + else + false + end + end + define_parser(:block_extensions, BLOCK_EXTENSIONS_START) + + EXT_SPAN_START = /#{EXT_START_STR}|#{EXT_STOP_STR % ALD_ID_NAME}/ + IAL_SPAN_START = /\{:(#{ALD_ANY_CHARS}+)\}/ + SPAN_EXTENSIONS_START = /\{:/ + + # Parse the extension span at the current location. + def parse_span_extensions + if @src.check(EXT_SPAN_START) + parse_extension_start_tag(:span) + elsif @src.check(IAL_SPAN_START) + if (last_child = @tree.children.last) && last_child.type != :text + @src.pos += @src.matched_size + attr = {} + parse_attribute_list(@src[1], attr) + update_ial_with_ial(last_child.options[:ial] ||= {}, attr) + update_attr_with_ial(last_child.attr, attr) + else + warning("Found span IAL after text - ignoring it") + add_text(@src.getch) + end + else + add_text(@src.getch) + end + end + define_parser(:span_extensions, SPAN_EXTENSIONS_START, '\{:') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/footnote.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/footnote.rb new file mode 100644 index 000000000000..b45fc1217bbe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/footnote.rb @@ -0,0 +1,64 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/extensions' +require 'kramdown/parser/kramdown/blank_line' +require 'kramdown/parser/kramdown/codeblock' + +module Kramdown + module Parser + class Kramdown + + FOOTNOTE_DEFINITION_START = /^#{OPT_SPACE}\[\^(#{ALD_ID_NAME})\]:\s*?(.*?\n#{CODEBLOCK_MATCH})/ + + # Parse the foot note definition at the current location. + def parse_footnote_definition + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + + el = Element.new(:footnote_def, nil, nil, location: start_line_number) + parse_blocks(el, @src[2].gsub(INDENT, '')) + if @footnotes[@src[1]] + warning("Duplicate footnote name '#{@src[1]}' on line #{start_line_number} - overwriting") + end + @tree.children << new_block_el(:eob, :footnote_def) + (@footnotes[@src[1]] = {})[:content] = el + @footnotes[@src[1]][:eob] = @tree.children.last + true + end + define_parser(:footnote_definition, FOOTNOTE_DEFINITION_START) + + FOOTNOTE_MARKER_START = /\[\^(#{ALD_ID_NAME})\]/ + + # Parse the footnote marker at the current location. + def parse_footnote_marker + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + fn_def = @footnotes[@src[1]] + if fn_def + if fn_def[:eob] + update_attr_with_ial(fn_def[:eob].attr, fn_def[:eob].options[:ial] || {}) + fn_def[:attr] = fn_def[:eob].attr + fn_def[:options] = fn_def[:eob].options + fn_def.delete(:eob) + end + fn_def[:marker] ||= [] + fn_def[:marker].push(Element.new(:footnote, fn_def[:content], fn_def[:attr], + fn_def[:options].merge(name: @src[1], location: start_line_number))) + @tree.children << fn_def[:marker].last + else + warning("Footnote definition for '#{@src[1]}' not found on line #{start_line_number}") + add_text(@src.matched) + end + end + define_parser(:footnote_marker, FOOTNOTE_MARKER_START, '\[') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/header.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/header.rb new file mode 100644 index 000000000000..d490a464ba0e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/header.rb @@ -0,0 +1,70 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/block_boundary' +require 'rexml/xmltokens' + +module Kramdown + module Parser + class Kramdown + + SETEXT_HEADER_START = /^#{OPT_SPACE}(?<contents>[^ \t].*)\n(?<level>[-=])[-=]*[ \t\r\f\v]*\n/ + + # Parse the Setext header at the current location. + def parse_setext_header + return false unless after_block_boundary? + text, id = parse_header_contents + return false if text.empty? + add_header(@src["level"] == '-' ? 2 : 1, text, id) + true + end + define_parser(:setext_header, SETEXT_HEADER_START) + + ATX_HEADER_START = /^(?<level>\#{1,6})[\t ]*(?<contents>[^ \t].*)\n/ + + # Parse the Atx header at the current location. + def parse_atx_header + return false unless after_block_boundary? + text, id = parse_header_contents + text.sub!(/(?<!\\)#+\z/, '') && text.rstrip! + return false if text.empty? + add_header(@src["level"].length, text, id) + true + end + define_parser(:atx_header, ATX_HEADER_START) + + protected + + HEADER_ID = /[\t ]{#(?<id>#{REXML::XMLTokens::NAME_START_CHAR}#{REXML::XMLTokens::NAME_CHAR}*)}\z/ + + # Returns header text and optional ID. + def parse_header_contents + text = @src["contents"] + text.rstrip! + id_match = HEADER_ID.match(text) + if id_match + id = id_match["id"] + text = text[0...-id_match[0].length] + text.rstrip! + end + [text, id] + end + + def add_header(level, text, id) + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + el = new_block_el(:header, nil, nil, level: level, raw_text: text, location: start_line_number) + add_text(text, el) + el.attr['id'] = id if id + @tree.children << el + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/horizontal_rule.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/horizontal_rule.rb new file mode 100644 index 000000000000..73a936dc0226 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/horizontal_rule.rb @@ -0,0 +1,27 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + HR_START = /^#{OPT_SPACE}(\*|-|_)[ \t]*\1[ \t]*\1(\1|[ \t])*\n/ + + # Parse the horizontal rule at the current location. + def parse_horizontal_rule + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + @tree.children << new_block_el(:hr, nil, nil, location: start_line_number) + true + end + define_parser(:horizontal_rule, HR_START) + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/html.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/html.rb new file mode 100644 index 000000000000..03a336176d48 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/html.rb @@ -0,0 +1,162 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/html' + +module Kramdown + module Parser + class Kramdown + + include Kramdown::Parser::Html::Parser + + # Mapping of markdown attribute value to content model. I.e. :raw when "0", :default when "1" + # (use default content model for the HTML element), :span when "span", :block when block and + # for everything else +nil+ is returned. + HTML_MARKDOWN_ATTR_MAP = {"0" => :raw, "1" => :default, "span" => :span, "block" => :block} + + TRAILING_WHITESPACE = /[ \t]*\n/ + + def handle_kramdown_html_tag(el, closed, handle_body) + if @block_ial + el.options[:ial] = @block_ial + @block_ial = nil + end + + content_model = if @tree.type != :html_element || @tree.options[:content_model] != :raw + (@options[:parse_block_html] ? HTML_CONTENT_MODEL[el.value] : :raw) + else + :raw + end + if (val = HTML_MARKDOWN_ATTR_MAP[el.attr.delete('markdown')]) + content_model = (val == :default ? HTML_CONTENT_MODEL[el.value] : val) + end + + @src.scan(TRAILING_WHITESPACE) if content_model == :block + el.options[:content_model] = content_model + el.options[:is_closed] = closed + + if !closed && handle_body + if content_model == :block + unless parse_blocks(el) + warning("Found no end tag for '#{el.value}' (line #{el.options[:location]}) - auto-closing it") + end + elsif content_model == :span + curpos = @src.pos + if @src.scan_until(/(?=<\/#{el.value}\s*>)/mi) + add_text(extract_string(curpos...@src.pos, @src), el) + @src.scan(HTML_TAG_CLOSE_RE) + else + add_text(@src.rest, el) + @src.terminate + warning("Found no end tag for '#{el.value}' (line #{el.options[:location]}) - auto-closing it") + end + else + parse_raw_html(el, &method(:handle_kramdown_html_tag)) + end + unless @tree.type == :html_element && @tree.options[:content_model] == :raw + @src.scan(TRAILING_WHITESPACE) + end + end + end + + HTML_BLOCK_START = /^#{OPT_SPACE}<(#{REXML::Parsers::BaseParser::UNAME_STR}|!--|\/)/ + + # Parse the HTML at the current position as block-level HTML. + def parse_block_html + line = @src.current_line_number + if (result = @src.scan(HTML_COMMENT_RE)) + @tree.children << Element.new(:xml_comment, result, nil, category: :block, location: line) + @src.scan(TRAILING_WHITESPACE) + true + else + if @src.check(/^#{OPT_SPACE}#{HTML_TAG_RE}/o) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase) + @src.pos += @src.matched_size + handle_html_start_tag(line, &method(:handle_kramdown_html_tag)) + Kramdown::Parser::Html::ElementConverter.convert(@root, @tree.children.last) if @options[:html_to_native] + true + elsif @src.check(/^#{OPT_SPACE}#{HTML_TAG_CLOSE_RE}/o) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase) + name = @src[1].downcase + + if @tree.type == :html_element && @tree.value == name + @src.pos += @src.matched_size + throw :stop_block_parsing, :found + else + false + end + else + false + end + end + end + define_parser(:block_html, HTML_BLOCK_START) + + HTML_SPAN_START = /<(#{REXML::Parsers::BaseParser::UNAME_STR}|!--|\/)/ + + # Parse the HTML at the current position as span-level HTML. + def parse_span_html + line = @src.current_line_number + if (result = @src.scan(HTML_COMMENT_RE)) + @tree.children << Element.new(:xml_comment, result, nil, category: :span, location: line) + elsif (result = @src.scan(HTML_TAG_CLOSE_RE)) + warning("Found invalidly used HTML closing tag for '#{@src[1]}' on line #{line}") + add_text(result) + elsif (result = @src.scan(HTML_TAG_RE)) + tag_name = @src[1] + tag_name.downcase! if HTML_ELEMENT[tag_name.downcase] + if HTML_BLOCK_ELEMENTS.include?(tag_name) + warning("Found block HTML tag '#{tag_name}' in span-level text on line #{line}") + add_text(result) + return + end + + attrs = parse_html_attributes(@src[2], line, HTML_ELEMENT[tag_name]) + attrs.each_value {|value| value.gsub!(/\n+/, ' ') unless value.empty? } + + do_parsing = if HTML_CONTENT_MODEL[tag_name] == :raw || @tree.options[:content_model] == :raw + false + else + @options[:parse_span_html] + end + if (val = HTML_MARKDOWN_ATTR_MAP[attrs.delete('markdown')]) + if val == :block + warning("Cannot use block-level parsing in span-level HTML tag (line #{line}) " \ + "- using default mode") + elsif val == :span + do_parsing = true + elsif val == :default + do_parsing = HTML_CONTENT_MODEL[tag_name] != :raw + elsif val == :raw + do_parsing = false + end + end + + el = Element.new(:html_element, tag_name, attrs, category: :span, location: line, + content_model: (do_parsing ? :span : :raw), is_closed: !!@src[4]) + @tree.children << el + stop_re = /<\/#{Regexp.escape(tag_name)}\s*>/ + stop_re = Regexp.new(stop_re.source, Regexp::IGNORECASE) if HTML_ELEMENT[tag_name] + if !@src[4] && !HTML_ELEMENTS_WITHOUT_BODY.include?(el.value) + if parse_spans(el, stop_re, (do_parsing ? nil : [:span_html])) + @src.scan(stop_re) + else + warning("Found no end tag for '#{el.value}' (line #{line}) - auto-closing it") + add_text(@src.rest, el) + @src.terminate + end + end + Kramdown::Parser::Html::ElementConverter.convert(@root, el) if @options[:html_to_native] + else + add_text(@src.getch) + end + end + define_parser(:span_html, HTML_SPAN_START, '<') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/html_entity.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/html_entity.rb new file mode 100644 index 000000000000..c89c7baf857a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/html_entity.rb @@ -0,0 +1,34 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/html' + +module Kramdown + module Parser + class Kramdown + + # Parse the HTML entity at the current location. + def parse_html_entity + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + begin + value = ::Kramdown::Utils::Entities.entity(@src[1] || (@src[2]&.to_i) || @src[3].hex) + @tree.children << Element.new(:entity, value, + nil, original: @src.matched, location: start_line_number) + rescue ::Kramdown::Error + @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('amp'), + nil, location: start_line_number) + add_text(@src.matched[1..-1]) + end + end + define_parser(:html_entity, Kramdown::Parser::Html::Constants::HTML_ENTITY_RE, '&') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/line_break.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/line_break.rb new file mode 100644 index 000000000000..5f8542714ca9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/line_break.rb @@ -0,0 +1,25 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + LINE_BREAK = /( |\\\\)(?=\n)/ + + # Parse the line break at the current location. + def parse_line_break + @tree.children << Element.new(:br, nil, nil, location: @src.current_line_number) + @src.pos += @src.matched_size + end + define_parser(:line_break, LINE_BREAK, '( |\\\\)(?=\n)') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/link.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/link.rb new file mode 100644 index 000000000000..9906bdd63ab7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/link.rb @@ -0,0 +1,149 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/escaped_chars' + +module Kramdown + module Parser + class Kramdown + + # Normalize the link identifier. + def normalize_link_id(id) + id.gsub(/[\s]+/, ' ').downcase + end + + LINK_DEFINITION_START = /^#{OPT_SPACE}\[([^\n\]]+)\]:[ \t]*(?:<(.*?)>|([^\n]*?\S[^\n]*?))(?:(?:[ \t]*?\n|[ \t]+?)[ \t]*?(["'])(.+?)\4)?[ \t]*?\n/ + + # Parse the link definition at the current location. + def parse_link_definition + return false if @src[3].to_s =~ /[ \t]+["']/ + @src.pos += @src.matched_size + link_id, link_url, link_title = normalize_link_id(@src[1]), @src[2] || @src[3], @src[5] + if @link_defs[link_id] + warning("Duplicate link ID '#{link_id}' on line #{@src.current_line_number} - overwriting") + end + @tree.children << new_block_el(:eob, :link_def) + @link_defs[link_id] = [link_url, link_title, @tree.children.last] + true + end + define_parser(:link_definition, LINK_DEFINITION_START) + + # This helper methods adds the approriate attributes to the element +el+ of type +a+ or +img+ + # and the element itself to the @tree. + def add_link(el, href, title, alt_text = nil, ial = nil) + el.options[:ial] = ial + update_attr_with_ial(el.attr, ial) if ial + if el.type == :a + el.attr['href'] = href + else + el.attr['src'] = href + el.attr['alt'] = alt_text + el.children.clear + end + el.attr['title'] = title if title + @tree.children << el + end + + LINK_BRACKET_STOP_RE = /(\])|!?\[/ + LINK_PAREN_STOP_RE = /(\()|(\))|\s(?=['"])/ + LINK_INLINE_ID_RE = /\s*?\[([^\]]+)?\]/ + LINK_INLINE_TITLE_RE = /\s*?(["'])(.+?)\1\s*?\)/m + LINK_START = /!?\[(?=[^^])/ + + # Parse the link at the current scanner position. This method is used to parse normal links as + # well as image links. + def parse_link + start_line_number = @src.current_line_number + result = @src.scan(LINK_START) + cur_pos = @src.pos + saved_pos = @src.save_pos + + link_type = (result =~ /^!/ ? :img : :a) + + # no nested links allowed + if link_type == :a && (@tree.type == :img || @tree.type == :a || + @stack.any? {|t, _| t && (t.type == :img || t.type == :a) }) + add_text(result) + return + end + el = Element.new(link_type, nil, nil, location: start_line_number) + + count = 1 + found = parse_spans(el, LINK_BRACKET_STOP_RE) do + count += (@src[1] ? -1 : 1) + count - el.children.select {|c| c.type == :img }.size == 0 + end + unless found + @src.revert_pos(saved_pos) + add_text(result) + return + end + alt_text = extract_string(cur_pos...@src.pos, @src).gsub(ESCAPED_CHARS, '\1') + @src.scan(LINK_BRACKET_STOP_RE) + + # reference style link or no link url + if @src.scan(LINK_INLINE_ID_RE) || !@src.check(/\(/) + emit_warning = !@src[1] + link_id = normalize_link_id(@src[1] || alt_text) + if @link_defs.key?(link_id) + link_def = @link_defs[link_id] + add_link(el, link_def[0], link_def[1], alt_text, + link_def[2] && link_def[2].options[:ial]) + else + if emit_warning + warning("No link definition for link ID '#{link_id}' found on line #{start_line_number}") + end + @src.revert_pos(saved_pos) + add_text(result) + end + return + end + + # link url in parentheses + if @src.scan(/\(<(.*?)>/) + link_url = @src[1] + if @src.scan(/\)/) + add_link(el, link_url, nil, alt_text) + return + end + else + link_url = +'' + nr_of_brackets = 0 + while (temp = @src.scan_until(LINK_PAREN_STOP_RE)) + link_url << temp + if @src[2] + nr_of_brackets -= 1 + break if nr_of_brackets == 0 + elsif @src[1] + nr_of_brackets += 1 + else + break + end + end + link_url = link_url[1..-2] + link_url.strip! + + if nr_of_brackets == 0 + add_link(el, link_url, nil, alt_text) + return + end + end + + if @src.scan(LINK_INLINE_TITLE_RE) + add_link(el, link_url, @src[2], alt_text) + else + @src.revert_pos(saved_pos) + add_text(result) + end + end + define_parser(:link, LINK_START, '!?\[') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/list.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/list.rb new file mode 100644 index 000000000000..ea5bf84b9953 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/list.rb @@ -0,0 +1,284 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/blank_line' +require 'kramdown/parser/kramdown/eob' +require 'kramdown/parser/kramdown/horizontal_rule' +require 'kramdown/parser/kramdown/extensions' + +module Kramdown + module Parser + class Kramdown + + LIST_ITEM_IAL = /^\s*(?:\{:(?!(?:#{ALD_ID_NAME})?:|\/)(#{ALD_ANY_CHARS}+)\})\s*/ + LIST_ITEM_IAL_CHECK = /^#{LIST_ITEM_IAL}?\s*\n/ + + PARSE_FIRST_LIST_LINE_REGEXP_CACHE = Hash.new do |h, indentation| + indent_re = /^ {#{indentation}}/ + content_re = /^(?:(?:\t| {4}){#{indentation / 4}} {#{indentation % 4}}|(?:\t| {4}){#{indentation / 4 + 1}}).*\S.*\n/ + lazy_re = /(?!^ {0,#{[indentation, 3].min}}(?:#{IAL_BLOCK}|#{LAZY_END_HTML_STOP}|#{LAZY_END_HTML_START})).*\S.*\n/ + + h[indentation] = [content_re, lazy_re, indent_re] + end + + # Used for parsing the first line of a list item or a definition, i.e. the line with list item + # marker or the definition marker. + def parse_first_list_line(indentation, content) + if content =~ self.class::LIST_ITEM_IAL_CHECK + indentation = 4 + else + while content =~ /^ *\t/ + temp = content.scan(/^ */).first.length + indentation + content.sub!(/^( *)(\t+)/) { $1 << " " * (4 - (temp % 4) + ($2.length - 1) * 4) } + end + indentation += content[/^ */].length + end + content.sub!(/^\s*/, '') + + [content, indentation, *PARSE_FIRST_LIST_LINE_REGEXP_CACHE[indentation]] + end + + PATTERN_TAIL = /[\t| ].*?\n/ + + LIST_START_UL = /^(#{OPT_SPACE}[+*-])(#{PATTERN_TAIL})/ + LIST_START_OL = /^(#{OPT_SPACE}\d+\.)(#{PATTERN_TAIL})/ + LIST_START = /#{LIST_START_UL}|#{LIST_START_OL}/ + + # Parse the ordered or unordered list at the current location. + def parse_list + start_line_number = @src.current_line_number + type, list_start_re = (@src.check(LIST_START_UL) ? [:ul, LIST_START_UL] : [:ol, LIST_START_OL]) + list = new_block_el(type, nil, nil, location: start_line_number) + + item = nil + content_re, lazy_re, indent_re = nil + eob_found = false + nested_list_found = false + last_is_blank = false + until @src.eos? + start_line_number = @src.current_line_number + if last_is_blank && @src.check(HR_START) + break + elsif @src.scan(EOB_MARKER) + eob_found = true + break + elsif @src.scan(list_start_re) + item = Element.new(:li, nil, nil, location: start_line_number) + item.value, indentation, content_re, lazy_re, indent_re = + parse_first_list_line(@src[1].length, @src[2]) + list.children << item + + item.value.sub!(self.class::LIST_ITEM_IAL) do + parse_attribute_list($1, item.options[:ial] ||= {}) + '' + end + + list_start_re = fetch_pattern(type, indentation) + nested_list_found = (item.value =~ LIST_START) + last_is_blank = false + item.value = [item.value] + elsif (result = @src.scan(content_re)) || (!last_is_blank && (result = @src.scan(lazy_re))) + result.sub!(/^(\t+)/) { " " * 4 * $1.length } + indentation_found = result.sub!(indent_re, '') + if !nested_list_found && indentation_found && result =~ LIST_START + item.value << +'' + nested_list_found = true + elsif nested_list_found && !indentation_found && result =~ LIST_START + result = " " * (indentation + 4) << result + end + item.value.last << result + last_is_blank = false + elsif (result = @src.scan(BLANK_LINE)) + nested_list_found = true + last_is_blank = true + item.value.last << result + else + break + end + end + + @tree.children << list + + last = nil + list.children.each do |it| + temp = Element.new(:temp, nil, nil, location: it.options[:location]) + + env = save_env + location = it.options[:location] + it.value.each do |val| + @src = ::Kramdown::Utils::StringScanner.new(val, location) + parse_blocks(temp) + location = @src.current_line_number + end + restore_env(env) + + it.children = temp.children + it.value = nil + + it_children = it.children + next if it_children.empty? + + # Handle the case where an EOB marker is inserted by a block IAL for the first paragraph + it_children.delete_at(1) if it_children.first.type == :p && + it_children.length >= 2 && it_children[1].type == :eob && it_children.first.options[:ial] + + if it_children.first.type == :p && + (it_children.length < 2 || it_children[1].type != :blank || + (it == list.children.last && it_children.length == 2 && !eob_found)) && + (list.children.last != it || list.children.size == 1 || + list.children[0..-2].any? {|cit| !cit.children.first || cit.children.first.type != :p || cit.children.first.options[:transparent] }) + it_children.first.children.first.value << "\n" if it_children.size > 1 && it_children[1].type != :blank + it_children.first.options[:transparent] = true + end + + last = (it_children.last.type == :blank ? it_children.pop : nil) + end + + @tree.children << last if !last.nil? && !eob_found + + true + end + define_parser(:list, LIST_START) + + DEFINITION_LIST_START = /^(#{OPT_SPACE}:)(#{PATTERN_TAIL})/ + + # Parse the ordered or unordered list at the current location. + def parse_definition_list + children = @tree.children + if !children.last || (children.length == 1 && children.last.type != :p) || + (children.length >= 2 && children[-1].type != :p && + (children[-1].type != :blank || children[-1].value != "\n" || children[-2].type != :p)) + return false + end + + first_as_para = false + deflist = new_block_el(:dl) + para = @tree.children.pop + if para.type == :blank + para = @tree.children.pop + first_as_para = true + end + # take location from preceding para which is the first definition term + deflist.options[:location] = para.options[:location] + para.children.first.value.split(/\n/).each do |term| + el = Element.new(:dt, nil, nil, location: @src.current_line_number) + term.sub!(self.class::LIST_ITEM_IAL) do + parse_attribute_list($1, el.options[:ial] ||= {}) + '' + end + el.options[:raw_text] = term + el.children << Element.new(:raw_text, term) + deflist.children << el + end + deflist.options[:ial] = para.options[:ial] + + item = nil + content_re, lazy_re, indent_re = nil + def_start_re = DEFINITION_LIST_START + last_is_blank = false + until @src.eos? + start_line_number = @src.current_line_number + if @src.scan(def_start_re) + item = Element.new(:dd, nil, nil, location: start_line_number) + item.options[:first_as_para] = first_as_para + item.value, indentation, content_re, lazy_re, indent_re = + parse_first_list_line(@src[1].length, @src[2]) + deflist.children << item + + item.value.sub!(self.class::LIST_ITEM_IAL) do |_match| + parse_attribute_list($1, item.options[:ial] ||= {}) + '' + end + + def_start_re = fetch_pattern(:dl, indentation) + first_as_para = false + last_is_blank = false + elsif @src.check(EOB_MARKER) + break + elsif (result = @src.scan(content_re)) || (!last_is_blank && (result = @src.scan(lazy_re))) + result.sub!(/^(\t+)/) { " " * ($1 ? 4 * $1.length : 0) } + result.sub!(indent_re, '') + item.value << result + first_as_para = false + last_is_blank = false + elsif (result = @src.scan(BLANK_LINE)) + first_as_para = true + item.value << result + last_is_blank = true + else + break + end + end + + last = nil + deflist.children.each do |it| + next if it.type == :dt + + parse_blocks(it, it.value) + it.value = nil + it_children = it.children + next if it_children.empty? + + last = (it_children.last.type == :blank ? it_children.pop : nil) + + if it_children.first && it_children.first.type == :p && !it.options.delete(:first_as_para) + it_children.first.children.first.value << "\n" if it_children.size > 1 + it_children.first.options[:transparent] = true + end + end + + children = @tree.children + if children.length >= 1 && children.last.type == :dl + children[-1].children.concat(deflist.children) + elsif children.length >= 2 && children[-1].type == :blank && + children[-2].type == :dl + children.pop + children[-1].children.concat(deflist.children) + else + children << deflist + end + + children << last if last + + true + end + define_parser(:definition_list, DEFINITION_LIST_START) + + private + + # precomputed patterns for indentations 1..4 and fallback expression + # to compute pattern when indentation is outside the 1..4 range. + def fetch_pattern(type, indentation) + if type == :ul + case indentation + when 1 then %r/^( {0}[+*-])(#{PATTERN_TAIL})/o + when 2 then %r/^( {0,1}[+*-])(#{PATTERN_TAIL})/o + when 3 then %r/^( {0,2}[+*-])(#{PATTERN_TAIL})/o + else %r/^( {0,3}[+*-])(#{PATTERN_TAIL})/o + end + elsif type == :ol + case indentation + when 1 then %r/^( {0}\d+\.)(#{PATTERN_TAIL})/o + when 2 then %r/^( {0,1}\d+\.)(#{PATTERN_TAIL})/o + when 3 then %r/^( {0,2}\d+\.)(#{PATTERN_TAIL})/o + else %r/^( {0,3}\d+\.)(#{PATTERN_TAIL})/o + end + elsif type == :dl + case indentation + when 1 then %r/^( {0}:)(#{PATTERN_TAIL})/o + when 2 then %r/^( {0,1}:)(#{PATTERN_TAIL})/o + when 3 then %r/^( {0,2}:)(#{PATTERN_TAIL})/o + else %r/^( {0,3}:)(#{PATTERN_TAIL})/o + end + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/math.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/math.rb new file mode 100644 index 000000000000..32c87bfcbe7b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/math.rb @@ -0,0 +1,53 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/block_boundary' + +module Kramdown + module Parser + class Kramdown + + BLOCK_MATH_START = /^#{OPT_SPACE}(\\)?\$\$(.*?)\$\$(\s*?\n)?/m + + # Parse the math block at the current location. + def parse_block_math + start_line_number = @src.current_line_number + if !after_block_boundary? + return false + elsif @src[1] + @src.scan(/^#{OPT_SPACE}\\/o) if @src[3] + return false + end + + saved_pos = @src.save_pos + @src.pos += @src.matched_size + data = @src[2].strip + if before_block_boundary? + @tree.children << new_block_el(:math, data, nil, category: :block, location: start_line_number) + true + else + @src.revert_pos(saved_pos) + false + end + end + define_parser(:block_math, BLOCK_MATH_START) + + INLINE_MATH_START = /\$\$(.*?)\$\$/m + + # Parse the inline math at the current location. + def parse_inline_math + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + @tree.children << Element.new(:math, @src[1].strip, nil, category: :span, location: start_line_number) + end + define_parser(:inline_math, INLINE_MATH_START, '\$') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/paragraph.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/paragraph.rb new file mode 100644 index 000000000000..d89e6a24cc04 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/paragraph.rb @@ -0,0 +1,62 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/blank_line' +require 'kramdown/parser/kramdown/extensions' +require 'kramdown/parser/kramdown/eob' +require 'kramdown/parser/kramdown/list' +require 'kramdown/parser/kramdown/html' + +module Kramdown + module Parser + class Kramdown + + LAZY_END_HTML_SPAN_ELEMENTS = HTML_SPAN_ELEMENTS + %w[script] + LAZY_END_HTML_START = /<(?>(?!(?:#{LAZY_END_HTML_SPAN_ELEMENTS.join('|')})\b)#{REXML::Parsers::BaseParser::UNAME_STR})/ + LAZY_END_HTML_STOP = /<\/(?!(?:#{LAZY_END_HTML_SPAN_ELEMENTS.join('|')})\b)#{REXML::Parsers::BaseParser::UNAME_STR}\s*>/m + + LAZY_END = /#{BLANK_LINE}|#{IAL_BLOCK_START}|#{EOB_MARKER}|^#{OPT_SPACE}#{LAZY_END_HTML_STOP}|^#{OPT_SPACE}#{LAZY_END_HTML_START}|\Z/ + + PARAGRAPH_START = /^#{OPT_SPACE}[^ \t].*?\n/ + PARAGRAPH_MATCH = /^.*?\n/ + PARAGRAPH_END = /#{LAZY_END}|#{DEFINITION_LIST_START}/ + + # Parse the paragraph at the current location. + def parse_paragraph + pos = @src.pos + start_line_number = @src.current_line_number + result = @src.scan(PARAGRAPH_MATCH) + until @src.match?(paragraph_end) + result << @src.scan(PARAGRAPH_MATCH) + end + result.rstrip! + if (last_child = @tree.children.last) && last_child.type == :p + last_item_in_para = last_child.children.last + if last_item_in_para && last_item_in_para.type == @text_type + joiner = (extract_string((pos - 3)...pos, @src) == " \n" ? " \n" : "\n") + last_item_in_para.value << joiner << result + else + add_text(result, last_child) + end + else + @tree.children << new_block_el(:p, nil, nil, location: start_line_number) + result.lstrip! + add_text(result, @tree.children.last) + end + true + end + define_parser(:paragraph, PARAGRAPH_START) + + def paragraph_end + self.class::PARAGRAPH_END + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/smart_quotes.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/smart_quotes.rb new file mode 100644 index 000000000000..5c1701399ae0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/smart_quotes.rb @@ -0,0 +1,174 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# +#-- +# Parts of this file are based on code from RubyPants: +# +# = RubyPants -- SmartyPants ported to Ruby +# +# Ported by Christian Neukirchen <mailto:chneukirchen@gmail.com> +# Copyright (C) 2004 Christian Neukirchen +# +# Incooporates ideas, comments and documentation by Chad Miller +# Copyright (C) 2004 Chad Miller +# +# Original SmartyPants by John Gruber +# Copyright (C) 2003 John Gruber +# +# +# = RubyPants -- SmartyPants ported to Ruby +# +# +# [snip] +# +# == Authors +# +# John Gruber did all of the hard work of writing this software in +# Perl for Movable Type and almost all of this useful documentation. +# Chad Miller ported it to Python to use with Pyblosxom. +# +# Christian Neukirchen provided the Ruby port, as a general-purpose +# library that follows the *Cloth API. +# +# +# == Copyright and License +# +# === SmartyPants license: +# +# Copyright (c) 2003 John Gruber +# (http://daringfireball.net) +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# * Neither the name "SmartyPants" nor the names of its contributors +# may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# This software is provided by the copyright holders and contributors +# "as is" and any express or implied warranties, including, but not +# limited to, the implied warranties of merchantability and fitness +# for a particular purpose are disclaimed. In no event shall the +# copyright owner or contributors be liable for any direct, indirect, +# incidental, special, exemplary, or consequential damages (including, +# but not limited to, procurement of substitute goods or services; +# loss of use, data, or profits; or business interruption) however +# caused and on any theory of liability, whether in contract, strict +# liability, or tort (including negligence or otherwise) arising in +# any way out of the use of this software, even if advised of the +# possibility of such damage. +# +# === RubyPants license +# +# RubyPants is a derivative work of SmartyPants and smartypants.py. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# This software is provided by the copyright holders and contributors +# "as is" and any express or implied warranties, including, but not +# limited to, the implied warranties of merchantability and fitness +# for a particular purpose are disclaimed. In no event shall the +# copyright owner or contributors be liable for any direct, indirect, +# incidental, special, exemplary, or consequential damages (including, +# but not limited to, procurement of substitute goods or services; +# loss of use, data, or profits; or business interruption) however +# caused and on any theory of liability, whether in contract, strict +# liability, or tort (including negligence or otherwise) arising in +# any way out of the use of this software, even if advised of the +# possibility of such damage. +# +# == Links +# +# John Gruber:: http://daringfireball.net +# SmartyPants:: http://daringfireball.net/projects/smartypants +# +# Chad Miller:: http://web.chad.org +# +# Christian Neukirchen:: http://kronavita.de/chris +# +#++ +# + +module Kramdown + module Parser + class Kramdown + + SQ_PUNCT = '[!"#\$\%\'()*+,\-.\/:;<=>?\@\[\\\\\]\^_`{|}~]' + SQ_CLOSE = %![^\ \\\\\t\r\n\\[{(-]! + + SQ_RULES = [ + [/("|')(?=[_*]{1,2}\S)/, [:lquote1]], + [/("|')(?=#{SQ_PUNCT}(?!\.\.)\B)/, [:rquote1]], + # Special case for double sets of quotes, e.g.: + # <p>He said, "'Quoted' words in a larger quote."</p> + [/(\s?)"'(?=\w)/, [1, :ldquo, :lsquo]], + [/(\s?)'"(?=\w)/, [1, :lsquo, :ldquo]], + # Special case for decade abbreviations (the '80s): + [/(\s?)'(?=\d\ds)/, [1, :rsquo]], + + # Get most opening single/double quotes: + [/(\s)('|")(?=\w)/, [1, :lquote2]], + # Single/double closing quotes: + [/(#{SQ_CLOSE})('|")/, [1, :rquote2]], + # Special case for e.g. "<i>Custer</i>'s Last Stand." + [/("|')(?=\s|s\b|$)/, [:rquote1]], + # Any remaining single quotes should be opening ones: + [/(.?)'/m, [1, :lsquo]], + [/(.?)"/m, [1, :ldquo]], + ] # '" + + SQ_SUBSTS = { + [:rquote1, '"'] => :rdquo, + [:rquote1, "'"] => :rsquo, + [:rquote2, '"'] => :rdquo, + [:rquote2, "'"] => :rsquo, + [:lquote1, '"'] => :ldquo, + [:lquote1, "'"] => :lsquo, + [:lquote2, '"'] => :ldquo, + [:lquote2, "'"] => :lsquo, + } + SMART_QUOTES_RE = /[^\\]?["']/ + + # Parse the smart quotes at current location. + def parse_smart_quotes + start_line_number = @src.current_line_number + substs = SQ_RULES.find {|reg, _subst| @src.scan(reg) }[1] + substs.each do |subst| + if subst.kind_of?(Integer) + add_text(@src[subst]) + else + val = SQ_SUBSTS[[subst, @src[subst.to_s[-1, 1].to_i]]] || subst + @tree.children << Element.new(:smart_quote, val, nil, location: start_line_number) + end + end + end + define_parser(:smart_quotes, SMART_QUOTES_RE, '[^\\\\]?["\']') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/table.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/table.rb new file mode 100644 index 000000000000..68be6b4cb89e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/table.rb @@ -0,0 +1,171 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser/kramdown/block_boundary' + +module Kramdown + module Parser + class Kramdown + + TABLE_SEP_LINE = /^([+|: \t-]*?-[+|: \t-]*?)[ \t]*\n/ + TABLE_HSEP_ALIGN = /[ \t]?(:?)-+(:?)[ \t]?/ + TABLE_FSEP_LINE = /^[+|: \t=]*?=[+|: \t=]*?[ \t]*\n/ + TABLE_ROW_LINE = /^(.*?)[ \t]*\n/ + TABLE_PIPE_CHECK = /(?:\||.*?[^\\\n]\|)/ + TABLE_LINE = /#{TABLE_PIPE_CHECK}.*?\n/ + TABLE_START = /^#{OPT_SPACE}(?=\S)#{TABLE_LINE}/ + + # Parse the table at the current location. + def parse_table + return false unless after_block_boundary? + + saved_pos = @src.save_pos + orig_pos = @src.pos + table = new_block_el(:table, nil, nil, alignment: [], location: @src.current_line_number) + leading_pipe = (@src.check(TABLE_LINE) =~ /^\s*\|/) + @src.scan(TABLE_SEP_LINE) + + rows = [] + has_footer = false + columns = 0 + + add_container = lambda do |type, force| + if !has_footer || type != :tbody || force + cont = Element.new(type) + cont.children, rows = rows, [] + table.children << cont + end + end + + until @src.eos? + break unless @src.check(TABLE_LINE) + if @src.scan(TABLE_SEP_LINE) + if rows.empty? + # nothing to do, ignoring multiple consecutive separator lines + elsif table.options[:alignment].empty? && !has_footer + add_container.call(:thead, false) + table.options[:alignment] = @src[1].scan(TABLE_HSEP_ALIGN).map do |left, right| + (left.empty? && right.empty? && :default) || (right.empty? && :left) || + (left.empty? && :right) || :center + end + else # treat as normal separator line + add_container.call(:tbody, false) + end + elsif @src.scan(TABLE_FSEP_LINE) + add_container.call(:tbody, true) unless rows.empty? + has_footer = true + elsif @src.scan(TABLE_ROW_LINE) + trow = Element.new(:tr) + + # parse possible code spans on the line and correctly split the line into cells + env = save_env + cells = [] + @src[1].split(/(<code.*?>.*?<\/code>)/).each_with_index do |str, i| + if i.odd? + (cells.empty? ? cells : cells.last) << str + else + reset_env(src: Kramdown::Utils::StringScanner.new(str, @src.current_line_number)) + root = Element.new(:root) + parse_spans(root, nil, [:codespan]) + + root.children.each do |c| + if c.type == :raw_text + f, *l = c.value.split(/(?<!\\)\|/, -1).map {|t| t.gsub(/\\\|/, '|') } + (cells.empty? ? cells : cells.last) << f + cells.concat(l) + else + delim = (c.value.scan(/`+/).max || '') + '`' + tmp = +"#{delim}#{' ' if delim.size > 1}#{c.value}#{' ' if delim.size > 1}#{delim}" + (cells.empty? ? cells : cells.last) << tmp + end + end + end + end + restore_env(env) + + cells.shift if leading_pipe && cells.first.strip.empty? + cells.pop if cells.last.strip.empty? + cells.each do |cell_text| + tcell = Element.new(:td) + tcell.children << Element.new(:raw_text, cell_text.strip) + trow.children << tcell + end + columns = [columns, cells.length].max + rows << trow + else + break + end + end + + unless before_block_boundary? + @src.revert_pos(saved_pos) + return false + end + + # Parse all lines of the table with the code span parser + env = save_env + l_src = ::Kramdown::Utils::StringScanner.new(extract_string(orig_pos...(@src.pos - 1), @src), + @src.current_line_number) + reset_env(src: l_src) + root = Element.new(:root) + parse_spans(root, nil, [:codespan, :span_html]) + restore_env(env) + + # Check if each line has at least one unescaped pipe that is not inside a code span/code + # HTML element + # Note: It doesn't matter that we parse *all* span HTML elements because the row splitting + # algorithm above only takes <code> elements into account! + pipe_on_line = false + while (c = root.children.shift) + next unless (lines = c.value) + lines = lines.split("\n") + if c.type == :codespan + if lines.size > 2 || (lines.size == 2 && !pipe_on_line) + break + elsif lines.size == 2 && pipe_on_line + pipe_on_line = false + end + else + break if lines.size > 1 && !pipe_on_line && lines.first !~ /^#{TABLE_PIPE_CHECK}/o + pipe_on_line = (lines.size > 1 ? false : pipe_on_line) || (lines.last =~ /^#{TABLE_PIPE_CHECK}/o) + end + end + @src.revert_pos(saved_pos) and return false unless pipe_on_line + + add_container.call(has_footer ? :tfoot : :tbody, false) unless rows.empty? + + if table.children.none? {|el| el.type == :tbody } + warning("Found table without body on line #{table.options[:location]} - ignoring it") + @src.revert_pos(saved_pos) + return false + end + + # adjust all table rows to have equal number of columns, same for alignment defs + table.children.each do |kind| + kind.children.each do |row| + (columns - row.children.length).times do + row.children << Element.new(:td) + end + end + end + if table.options[:alignment].length > columns + table.options[:alignment] = table.options[:alignment][0...columns] + else + table.options[:alignment] += [:default] * (columns - table.options[:alignment].length) + end + + @tree.children << table + + true + end + define_parser(:table, TABLE_START) + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/typographic_symbol.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/typographic_symbol.rb new file mode 100644 index 000000000000..095c8d53dde6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/kramdown/typographic_symbol.rb @@ -0,0 +1,44 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Parser + class Kramdown + + TYPOGRAPHIC_SYMS = [['---', :mdash], ['--', :ndash], ['...', :hellip], + ['\\<<', '&lt;&lt;'], ['\\>>', '&gt;&gt;'], + ['<< ', :laquo_space], [' >>', :raquo_space], + ['<<', :laquo], ['>>', :raquo]] + TYPOGRAPHIC_SYMS_SUBST = Hash[*TYPOGRAPHIC_SYMS.flatten] + TYPOGRAPHIC_SYMS_RE = /#{TYPOGRAPHIC_SYMS.map {|k, _v| Regexp.escape(k) }.join('|')}/ + + # Parse the typographic symbols at the current location. + def parse_typographic_syms + start_line_number = @src.current_line_number + @src.pos += @src.matched_size + val = TYPOGRAPHIC_SYMS_SUBST[@src.matched] + if val.kind_of?(Symbol) + @tree.children << Element.new(:typographic_sym, val, nil, location: start_line_number) + elsif @src.matched == '\\<<' + @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('lt'), + nil, location: start_line_number) + @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('lt'), + nil, location: start_line_number) + else + @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('gt'), + nil, location: start_line_number) + @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('gt'), + nil, location: start_line_number) + end + end + define_parser(:typographic_syms, TYPOGRAPHIC_SYMS_RE, '--|\\.\\.\\.|(?:\\\\| )?(?:<<|>>)') + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/markdown.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/markdown.rb new file mode 100644 index 000000000000..9f36758a2a61 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/parser/markdown.rb @@ -0,0 +1,57 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'kramdown/parser' + +module Kramdown + + module Parser + + # Used for parsing a document in Markdown format. + # + # This parser is based on the kramdown parser and removes the parser methods for the additional + # non-Markdown features. However, since some things are handled differently by the kramdown + # parser methods (like deciding when a list item contains just text), this parser differs from + # real Markdown parsers in some respects. + # + # Note, though, that the parser basically fails just one of the Markdown test cases (some others + # also fail but those failures are negligible). + class Markdown < Kramdown + + # Array with all the parsing methods that should be removed from the standard kramdown parser. + EXTENDED = [:codeblock_fenced, :table, :definition_list, :footnote_definition, + :abbrev_definition, :block_math, :block_extensions, + :footnote_marker, :smart_quotes, :inline_math, :span_extensions, :typographic_syms] + + def initialize(source, options) # :nodoc: + super + @block_parsers.delete_if {|i| EXTENDED.include?(i) } + @span_parsers.delete_if {|i| EXTENDED.include?(i) } + end + + # :stopdoc: + + BLOCK_BOUNDARY = /#{BLANK_LINE}|#{EOB_MARKER}|\Z/ + LAZY_END = /#{BLANK_LINE}|#{EOB_MARKER}|^#{OPT_SPACE}#{LAZY_END_HTML_STOP}| + ^#{OPT_SPACE}#{LAZY_END_HTML_START}|\Z/x + CODEBLOCK_MATCH = /(?:#{BLANK_LINE}?(?:#{INDENT}[ \t]*\S.*\n)+)*/ + PARAGRAPH_END = LAZY_END + + IAL_RAND_CHARS = (('a'..'z').to_a + ('0'..'9').to_a) + IAL_RAND_STRING = (1..20).collect { IAL_RAND_CHARS[rand(IAL_RAND_CHARS.size)] }.join + LIST_ITEM_IAL = /^\s*(#{IAL_RAND_STRING})?\s*\n/ + IAL_SPAN_START = LIST_ITEM_IAL + + # :startdoc: + + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils.rb new file mode 100644 index 000000000000..5928def61b30 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils.rb @@ -0,0 +1,45 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + + # == \Utils Module + # + # This module contains utility class/modules/methods that can be used by both parsers and + # converters. + module Utils + + autoload :Entities, 'kramdown/utils/entities' + autoload :Html, 'kramdown/utils/html' + autoload :Unidecoder, 'kramdown/utils/unidecoder' + autoload :StringScanner, 'kramdown/utils/string_scanner' + autoload :Configurable, 'kramdown/utils/configurable' + autoload :LRUCache, 'kramdown/utils/lru_cache' + + # Treat +name+ as if it were snake cased (e.g. snake_case) and camelize it (e.g. SnakeCase). + def self.camelize(name) + name.split('_').inject(+'') {|s, x| s << x[0..0].upcase << x[1..-1] } + end + + # Treat +name+ as if it were camelized (e.g. CamelizedName) and snake-case it (e.g. camelized_name). + def self.snake_case(name) + name = name.dup + name.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2') + name.gsub!(/([a-z])([A-Z])/, '\1_\2') + name.downcase! + name + end + + def self.deep_const_get(str) + ::Object.const_get(str) + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/configurable.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/configurable.rb new file mode 100644 index 000000000000..2989493fc38c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/configurable.rb @@ -0,0 +1,45 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Utils + + # Methods for registering configurable extensions. + module Configurable + + # Create a new configurable extension called +name+. + # + # Three methods will be defined on the calling object which allow to use this configurable + # extension: + # + # configurables:: Returns a hash of hashes that is used to store all configurables of the + # object. + # + # <name>(ext_name):: Return the configured extension +ext_name+. + # + # add_<name>(ext_name, data=nil, &block):: Define an extension +ext_name+ by specifying either + # the data as argument or by using a block. + def configurable(name) + unless respond_to?(:configurables) + singleton_class.send(:define_method, :configurables) do + @_configurables ||= Hash.new {|h, k| h[k] = {} } + end + end + singleton_class.send(:define_method, name) do |data| + configurables[name][data] + end + singleton_class.send(:define_method, "add_#{name}".intern) do |data, *args, &block| + configurables[name][data] = args.first || block + end + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/entities.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/entities.rb new file mode 100644 index 000000000000..e0cc8a0ea729 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/entities.rb @@ -0,0 +1,344 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + + module Utils + + # Provides convenience methods for handling named and numeric entities. + module Entities + + # Represents an entity that has a +code_point+ and +name+. + Entity = Struct.new(:code_point, :name) do + # Return the UTF8 representation of the entity. + def char + [code_point].pack('U*') rescue nil + end + end + + # Array of arrays. Each sub-array specifies a code point and the associated name. + # + # This table is not used directly -- Entity objects are automatically created from it and put + # into a Hash map when this file is loaded. + ENTITY_TABLE = [ + [913, 'Alpha'], + [914, 'Beta'], + [915, 'Gamma'], + [916, 'Delta'], + [917, 'Epsilon'], + [918, 'Zeta'], + [919, 'Eta'], + [920, 'Theta'], + [921, 'Iota'], + [922, 'Kappa'], + [923, 'Lambda'], + [924, 'Mu'], + [925, 'Nu'], + [926, 'Xi'], + [927, 'Omicron'], + [928, 'Pi'], + [929, 'Rho'], + [931, 'Sigma'], + [932, 'Tau'], + [933, 'Upsilon'], + [934, 'Phi'], + [935, 'Chi'], + [936, 'Psi'], + [937, 'Omega'], + [945, 'alpha'], + [946, 'beta'], + [947, 'gamma'], + [948, 'delta'], + [949, 'epsilon'], + [950, 'zeta'], + [951, 'eta'], + [952, 'theta'], + [953, 'iota'], + [954, 'kappa'], + [955, 'lambda'], + [956, 'mu'], + [957, 'nu'], + [958, 'xi'], + [959, 'omicron'], + [960, 'pi'], + [961, 'rho'], + [963, 'sigma'], + [964, 'tau'], + [965, 'upsilon'], + [966, 'phi'], + [967, 'chi'], + [968, 'psi'], + [969, 'omega'], + [962, 'sigmaf'], + [977, 'thetasym'], + [978, 'upsih'], + [982, 'piv'], + [8204, 'zwnj'], + [8205, 'zwj'], + [8206, 'lrm'], + [8207, 'rlm'], + [8230, 'hellip'], + [8242, 'prime'], + [8243, 'Prime'], + [8254, 'oline'], + [8260, 'frasl'], + [8472, 'weierp'], + [8465, 'image'], + [8476, 'real'], + [8501, 'alefsym'], + [8226, 'bull'], + [8482, 'trade'], + [8592, 'larr'], + [8594, 'rarr'], + [8593, 'uarr'], + [8595, 'darr'], + [8596, 'harr'], + [8629, 'crarr'], + [8657, 'uArr'], + [8659, 'dArr'], + [8656, 'lArr'], + [8658, 'rArr'], + [8660, 'hArr'], + [8704, 'forall'], + [8706, 'part'], + [8707, 'exist'], + [8709, 'empty'], + [8711, 'nabla'], + [8712, 'isin'], + [8715, 'ni'], + [8713, 'notin'], + [8721, 'sum'], + [8719, 'prod'], + [8722, 'minus'], + [8727, 'lowast'], + [8730, 'radic'], + [8733, 'prop'], + [8734, 'infin'], + [8736, 'ang'], + [8743, 'and'], + [8744, 'or'], + [8745, 'cap'], + [8746, 'cup'], + [8747, 'int'], + [8756, 'there4'], + [8764, 'sim'], + [8776, 'asymp'], + [8773, 'cong'], + [8800, 'ne'], + [8801, 'equiv'], + [8804, 'le'], + [8805, 'ge'], + [8834, 'sub'], + [8835, 'sup'], + [8838, 'sube'], + [8839, 'supe'], + [8836, 'nsub'], + [8853, 'oplus'], + [8855, 'otimes'], + [8869, 'perp'], + [8901, 'sdot'], + [8942, 'vellip'], + [8968, 'rceil'], + [8969, 'lceil'], + [8970, 'lfloor'], + [8971, 'rfloor'], + [9001, 'rang'], + [9002, 'lang'], + [9674, 'loz'], + [9824, 'spades'], + [9827, 'clubs'], + [9829, 'hearts'], + [9830, 'diams'], + [38, 'amp'], + [34, 'quot'], + [39, 'apos'], + [169, 'copy'], + [60, 'lt'], + [62, 'gt'], + [338, 'OElig'], + [339, 'oelig'], + [352, 'Scaron'], + [353, 'scaron'], + [376, 'Yuml'], + [710, 'circ'], + [732, 'tilde'], + [8211, 'ndash'], + [8212, 'mdash'], + [8216, 'lsquo'], + [8217, 'rsquo'], + [8220, 'ldquo'], + [8221, 'rdquo'], + [8224, 'dagger'], + [8225, 'Dagger'], + [8240, 'permil'], + [8364, 'euro'], + [8249, 'lsaquo'], + [8250, 'rsaquo'], + [160, 'nbsp'], + [161, 'iexcl'], + [163, 'pound'], + [164, 'curren'], + [165, 'yen'], + [166, 'brvbar'], + [167, 'sect'], + [168, 'uml'], + [171, 'laquo'], + [187, 'raquo'], + [174, 'reg'], + [170, 'ordf'], + [172, 'not'], + [173, 'shy'], + [175, 'macr'], + [176, 'deg'], + [177, 'plusmn'], + [180, 'acute'], + [181, 'micro'], + [182, 'para'], + [183, 'middot'], + [184, 'cedil'], + [186, 'ordm'], + [162, 'cent'], + [185, 'sup1'], + [178, 'sup2'], + [179, 'sup3'], + [189, 'frac12'], + [188, 'frac14'], + [190, 'frac34'], + [191, 'iquest'], + [192, 'Agrave'], + [193, 'Aacute'], + [194, 'Acirc'], + [195, 'Atilde'], + [196, 'Auml'], + [197, 'Aring'], + [198, 'AElig'], + [199, 'Ccedil'], + [200, 'Egrave'], + [201, 'Eacute'], + [202, 'Ecirc'], + [203, 'Euml'], + [204, 'Igrave'], + [205, 'Iacute'], + [206, 'Icirc'], + [207, 'Iuml'], + [208, 'ETH'], + [209, 'Ntilde'], + [210, 'Ograve'], + [211, 'Oacute'], + [212, 'Ocirc'], + [213, 'Otilde'], + [214, 'Ouml'], + [215, 'times'], + [216, 'Oslash'], + [217, 'Ugrave'], + [218, 'Uacute'], + [219, 'Ucirc'], + [220, 'Uuml'], + [221, 'Yacute'], + [222, 'THORN'], + [223, 'szlig'], + [224, 'agrave'], + [225, 'aacute'], + [226, 'acirc'], + [227, 'atilde'], + [228, 'auml'], + [229, 'aring'], + [230, 'aelig'], + [231, 'ccedil'], + [232, 'egrave'], + [233, 'eacute'], + [234, 'ecirc'], + [235, 'euml'], + [236, 'igrave'], + [237, 'iacute'], + [238, 'icirc'], + [239, 'iuml'], + [240, 'eth'], + [241, 'ntilde'], + [242, 'ograve'], + [243, 'oacute'], + [244, 'ocirc'], + [245, 'otilde'], + [246, 'ouml'], + [247, 'divide'], + [248, 'oslash'], + [249, 'ugrave'], + [250, 'uacute'], + [251, 'ucirc'], + [252, 'uuml'], + [253, 'yacute'], + [254, 'thorn'], + [255, 'yuml'], + + [8218, 'sbquo'], + [402, 'fnof'], + [8222, 'bdquo'], + + [128, 8364], + [130, 8218], + [131, 402], + [132, 8222], + [133, 8230], + [134, 8224], + [135, 8225], + [136, 710], + [137, 8240], + [138, 352], + [139, 8249], + [140, 338], + [142, 381], + [145, 8216], + [146, 8217], + [147, 8220], + [148, 8221], + [149, 8226], + [150, 8211], + [151, 8212], + [152, 732], + [153, 8482], + [154, 353], + [155, 8250], + [156, 339], + [158, 382], + [159, 376], + + [8194, 'ensp'], + [8195, 'emsp'], + [8201, 'thinsp'], + ] + + # Contains the mapping of code point (or name) to the actual Entity object. + ENTITY_MAP = Hash.new do |h, k| + if k.kind_of?(Integer) + h[k] = Entity.new(k, nil) + else + raise Kramdown::Error, "Can't handle generic non-integer character reference '#{k}'" + end + end + + ENTITY_TABLE.each do |code_point, data| + if data.kind_of?(String) + ENTITY_MAP[code_point] = ENTITY_MAP[data] = Entity.new(code_point, data) + else + ENTITY_MAP[code_point] = ENTITY_MAP[data] + end + end + + # Return the entity for the given code point or name +point_or_name+. + def entity(point_or_name) + ENTITY_MAP[point_or_name] + end + + module_function :entity + + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/html.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/html.rb new file mode 100644 index 000000000000..5f2cd9b6c961 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/html.rb @@ -0,0 +1,84 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'rexml/parsers/baseparser' + +module Kramdown + + module Utils + + # Provides convenience methods for HTML related tasks. + # + # *Note* that this module has to be mixed into a class that has a @root (containing an element + # of type :root) and an @options (containing an options hash) instance variable so that some of + # the methods can work correctly. + module Html + + # Convert the entity +e+ to a string. The optional parameter +original+ may contain the + # original representation of the entity. + # + # This method uses the option +entity_output+ to determine the output form for the entity. + def entity_to_str(e, original = nil) + entity_output = @options[:entity_output] + + if entity_output == :as_char && + (c = e.char.encode(@root.options[:encoding]) rescue nil) && + ((c = e.char) == '"' || !ESCAPE_MAP.key?(c)) + c + elsif (entity_output == :as_input || entity_output == :as_char) && original + original + elsif (entity_output == :symbolic || ESCAPE_MAP.key?(e.char)) && !e.name.nil? + "&#{e.name};" + else # default to :numeric + "&##{e.code_point};" + end + end + + # Return the HTML representation of the attributes +attr+. + def html_attributes(attr) + return '' if attr.empty? + + attr.map do |k, v| + v.nil? || (k == 'id' && v.strip.empty?) ? '' : " #{k}=\"#{escape_html(v.to_s, :attribute)}\"" + end.join('') + end + + # :stopdoc: + ESCAPE_MAP = { + '<' => '&lt;', + '>' => '&gt;', + '&' => '&amp;', + '"' => '&quot;', + } + ESCAPE_ALL_RE = /<|>|&/ + ESCAPE_TEXT_RE = Regexp.union(REXML::Parsers::BaseParser::REFERENCE_RE, /<|>|&/) + ESCAPE_ATTRIBUTE_RE = Regexp.union(REXML::Parsers::BaseParser::REFERENCE_RE, /<|>|&|"/) + ESCAPE_RE_FROM_TYPE = {all: ESCAPE_ALL_RE, text: ESCAPE_TEXT_RE, attribute: ESCAPE_ATTRIBUTE_RE} + # :startdoc: + + # Escape the special HTML characters in the string +str+. The parameter +type+ specifies what + # is escaped: :all - all special HTML characters except the quotation mark as well as + # entities, :text - all special HTML characters except the quotation mark but no entities and + # :attribute - all special HTML characters including the quotation mark but no entities. + def escape_html(str, type = :all) + str.gsub(ESCAPE_RE_FROM_TYPE[type]) {|m| ESCAPE_MAP[m] || m } + end + + REDUNDANT_LINE_BREAK_REGEX = /([\p{Han}\p{Hiragana}\p{Katakana}]+)\n([\p{Han}\p{Hiragana}\p{Katakana}]+)/u + def fix_cjk_line_break(str) + while str.gsub!(REDUNDANT_LINE_BREAK_REGEX, '\1\2') + end + str + end + + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/lru_cache.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/lru_cache.rb new file mode 100644 index 000000000000..32549fbaba96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/lru_cache.rb @@ -0,0 +1,41 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + module Utils + + # A simple least recently used (LRU) cache. + # + # The cache relies on the fact that Ruby's Hash class maintains insertion order. So deleting + # and re-inserting a key-value pair on access moves the key to the last position. When an + # entry is added and the cache is full, the first entry is removed. + class LRUCache + + # Creates a new LRUCache that can hold +size+ entries. + def initialize(size) + @size = size + @cache = {} + end + + # Returns the stored value for +key+ or +nil+ if no value was stored under the key. + def [](key) + (val = @cache.delete(key)).nil? ? nil : @cache[key] = val + end + + # Stores the +value+ under the +key+. + def []=(key, value) + @cache.delete(key) + @cache[key] = value + @cache.shift if @cache.length > @size + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/string_scanner.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/string_scanner.rb new file mode 100644 index 000000000000..2ef194ef8630 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/string_scanner.rb @@ -0,0 +1,81 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'strscan' + +module Kramdown + module Utils + + # This patched StringScanner adds line number information for current scan position and a + # start_line_number override for nested StringScanners. + class StringScanner < ::StringScanner + + # The start line number. Used for nested StringScanners that scan a sub-string of the source + # document. The kramdown parser uses this, e.g., for span level parsers. + attr_reader :start_line_number + + # Takes the start line number as optional second argument. + # + # Note: The original second argument is no longer used so this should be safe. + def initialize(string, start_line_number = 1) + super(string) + @start_line_number = start_line_number || 1 + @previous_pos = 0 + @previous_line_number = @start_line_number + end + + # Sets the byte position of the scan pointer. + # + # Note: This also resets some internal variables, so always use pos= when setting the position + # and don't use any other method for that! + def pos=(pos) + if self.pos > pos + @previous_line_number = @start_line_number + @previous_pos = 0 + end + super + end + + # Return information needed to revert the byte position of the string scanner in a performant + # way. + # + # The returned data can be fed to #revert_pos to revert the position to the saved one. + # + # Note: Just saving #pos won't be enough. + def save_pos + [pos, @previous_pos, @previous_line_number] + end + + # Revert the position to one saved by #save_pos. + def revert_pos(data) + self.pos = data[0] + @previous_pos, @previous_line_number = data[1], data[2] + end + + # Returns the line number for current charpos. + # + # NOTE: Requires that all line endings are normalized to '\n' + # + # NOTE: Normally we'd have to add one to the count of newlines to get the correct line number. + # However we add the one indirectly by using a one-based start_line_number. + def current_line_number + # Not using string[@previous_pos..best_pos].count('\n') because it is slower + strscan = ::StringScanner.new(string) + strscan.pos = @previous_pos + old_pos = pos + 1 + @previous_line_number += 1 while strscan.skip_until(/\n/) && strscan.pos <= old_pos + + @previous_pos = (eos? ? pos : pos + 1) + @previous_line_number + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/unidecoder.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/unidecoder.rb new file mode 100644 index 000000000000..6b196a91f687 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/utils/unidecoder.rb @@ -0,0 +1,50 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# +# This file is based on code originally from the Stringex library and needs the data files from +# Stringex to work correctly. + +module Kramdown + module Utils + + # Provides the ability to tranliterate Unicode strings into plain ASCII ones. + module Unidecoder + + gem 'stringex' + path = $:.find do |dir| + File.directory?(File.join(File.expand_path(dir), "stringex", "unidecoder_data")) + end + + if !path + def self.decode(string) + string + end + else + + CODEPOINTS = Hash.new do |h, k| + h[k] = YAML.load_file(File.join(path, "stringex", "unidecoder_data", "#{k}.yml")) + end + + # Transliterate string from Unicode into ASCII. + def self.decode(string) + string.gsub(/[^\x00-\x7f]/u) do |codepoint| + begin + unpacked = codepoint.unpack("U")[0] + CODEPOINTS[sprintf("x%02x", unpacked >> 8)][unpacked & 255] + rescue StandardError + "?" + end + end + end + + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/version.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/version.rb new file mode 100644 index 000000000000..9d9bffe4357f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/lib/kramdown/version.rb @@ -0,0 +1,15 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +module Kramdown + + # The kramdown version. + VERSION = '2.3.1' + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/man/man1/kramdown.1 b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/man/man1/kramdown.1 new file mode 100644 index 000000000000..2af9e5c331d0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/man/man1/kramdown.1 @@ -0,0 +1,346 @@ +.\" generated by kramdown +.TH "KRAMDOWN" "1" "January 2019" +.SH NAME +kramdown \- a fast, pure\-Ruby Markdown\-superset converter +.SH "SYNOPSIS" +\fBkramdown\fP [\fIoptions\fP] [\fIFILE\fP\.\.\.] +.SH "DESCRIPTION" +kramdown is primarily used for parsing a superset of Markdown and converting it to different output formats\. It supports standard Markdown (with some minor modifications) and various extensions like tables and definition lists\. Due to its modular architecture it also allows other input formats than Markdown, for example, HTML or Github Flavored Markdown\. +.P +If \fIFILE\fP is not specified, kramdown reads from the standard input\. The result is written to the standard output\. +.P +There are two sets of options that kramdown accepts: The first one includes the options that are used directly by the kramdown binary\. The second set of options controls how kramdown parses and converts its input\. +.P +Default values for this second set can be set using YAML via the configuration file \fBkramdownrc\fP\&\. Note that configuration option names use underscores, not dashes (dashes are just used in the CLI options names), and boolean options do not have a \fBno\fP variant but a value of \fBtrue\fP or \fBfalse\fP\&\. This file has to be in XDG_CONFIG_HOME on Linux/Unix, ~/Library/Preferences on macOS and ~/AppData/Local on Windows\. +.SH "CLI\-ONLY OPTIONS" +.TP +\fB\-i\fP \fIFORMAT\fP, \fB\-\-input\fP \fIFORMAT\fP +Specify the input format\. Available input formats: \fIkramdown\fP (this is the default), \fImarkdown\fP, or \fIhtml\fP\&\. The input format \fIGFM\fP is available through the \fBkramdown\-parser\-gfm\fP gem\. +.TP +\fB\-o\fP \fIFORMAT\fP, \fB\-\-output\fP \fIFORMAT\fP +Specify one or more output formats separated by commas: \fIhtml\fP (default), \fIkramdown\fP, \fIlatex\fP, \fIman\fP or \fIremove_html_tags\fP\&\. The converter \fIpdf\fP is available through the \fBkramdown\-converter\-pdf\fP gem\. +.TP +\fB\-x\fP \fIEXT\fP, \fB\-\-extension\fP \fIEXT\fP +Load one or more extensions\. The name of the extension should not include the \fBkramdown\-\fP prefix, e\.g\. just \fBparser\-gfm\fP\&\. Multiple extensions can be loaded by separating them with commas\. +.RS +.P +Note: This option has to be used before any other options that rely on the extension already being loaded\. +.RE +.TP +\fB\-\-no\-config\-file\fP +Do not read any configuration file\. Default behavior is to check for a configuration file and read it if it exists\. +.TP +\fB\-\-config\-file\fP \fIFILE\fP +Override the default path and name of the configuration file\. +.TP +\fB\-v\fP, \fB\-\-version\fP +Show the version of kramdown\. +.TP +\fB\-h\fP, \fB\-\-help\fP +Show the help\. +.SH "KRAMDOWN OPTIONS" +.TP +\fB\-\-auto\-id\-prefix\fP \fIARG\fP +Prefix used for automatically generated header IDs +.RS +.P +This option can be used to set a prefix for the automatically generated header IDs so that there is no conflict when rendering multiple kramdown documents into one output file separately\. The prefix should only contain characters that are valid in an ID! +.P +Default: \[u2018]\[u2019] Used by: HTML/Latex converter +.RE +.TP +\fB\-\-[no\-]auto\-id\-stripping\fP +Strip all formatting from header text for automatic ID generation +.RS +.P +If this option is \fBtrue\fP, only the text elements of a header are used for generating the ID later (in contrast to just using the raw header text line)\. +.P +This option will be removed in version 2\.0 because this will be the default then\. +.P +Default: false Used by: kramdown parser +.RE +.TP +\fB\-\-[no\-]auto\-ids\fP +Use automatic header ID generation +.RS +.P +If this option is \fBtrue\fP, ID values for all headers are automatically generated if no ID is explicitly specified\. +.P +Default: true Used by: HTML/Latex converter +.RE +.TP +\fB\-\-entity\-output\fP \fIARG\fP +Defines how entities are output +.RS +.P +The possible values are :as_input (entities are output in the same form as found in the input), :numeric (entities are output in numeric form), :symbolic (entities are output in symbolic form if possible) or :as_char (entities are output as characters if possible, only available on Ruby 1\.9)\. +.P +Default: :as_char Used by: HTML converter, kramdown converter +.RE +.TP +\fB\-\-footnote\-backlink\fP \fIARG\fP +Defines the text that should be used for the footnote backlinks +.RS +.P +The footnote backlink is just text, so any special HTML characters will be escaped\. +.P +If the footnote backlint text is an empty string, no footnote backlinks will be generated\. +.P +Default: \[u2018]\[u0026]8617;\[u2019] Used by: HTML converter +.RE +.TP +\fB\-\-[no\-]footnote\-backlink\-inline\fP +Specifies whether the footnote backlink should always be inline +.RS +.P +With the default of false the footnote backlink is placed at the end of the last paragraph if there is one, or an extra paragraph with only the footnote backlink is created\. +.P +Setting this option to true tries to place the footnote backlink in the last, possibly nested paragraph or header\. If this fails (e\.g\. in the case of a table), an extra paragraph with only the footnote backlink is created\. +.P +Default: false Used by: HTML converter +.RE +.TP +\fB\-\-footnote\-nr\fP \fIARG\fP +The number of the first footnote +.RS +.P +This option can be used to specify the number that is used for the first footnote\. +.P +Default: 1 Used by: HTML converter +.RE +.TP +\fB\-\-footnote\-prefix\fP \fIARG\fP +Prefix used for footnote IDs +.RS +.P +This option can be used to set a prefix for footnote IDs\. This is useful when rendering multiple documents into the same output file to avoid duplicate IDs\. The prefix should only contain characters that are valid in an ID! +.P +Default: \[u2018]\[u2019] Used by: HTML +.RE +.TP +\fB\-\-forbidden\-inline\-options\fP \fIARG\fP +Defines the options that may not be set using the {::options} extension +.RS +.P +Default: template Used by: HTML converter +.RE +.TP +\fB\-\-header\-offset\fP \fIARG\fP +Sets the output offset for headers +.RS +.P +If this option is c (may also be negative) then a header with level n will be output as a header with level c+n\. If c+n is lower than 1, level 1 will be used\. If c+n is greater than 6, level 6 will be used\. +.P +Default: 0 Used by: HTML converter, Kramdown converter, Latex converter +.RE +.TP +\fB\-\-[no\-]html\-to\-native\fP +Convert HTML elements to native elements +.RS +.P +If this option is \fBtrue\fP, the parser converts HTML elements to native elements\. For example, when parsing \fB<em>hallo</em>\fP the emphasis tag would normally be converted to an \fB:html\fP element with tag type \fB:em\fP\&\. If \fBhtml_to_native\fP is \fBtrue\fP, then the emphasis would be converted to a native \fB:em\fP element\. +.P +This is useful for converters that cannot deal with HTML elements\. +.P +Default: false Used by: kramdown parser +.RE +.TP +\fB\-\-latex\-headers\fP \fIARG\fP +Defines the LaTeX commands for different header levels +.RS +.P +The commands for the header levels one to six can be specified by separating them with commas\. +.P +Default: section,subsection,subsubsection,paragraph,subparagraph,subparagraph Used by: Latex converter +.RE +.TP +\fB\-\-line\-width\fP \fIARG\fP +Defines the line width to be used when outputting a document +.RS +.P +Default: 72 Used by: kramdown converter +.RE +.TP +\fB\-\-link\-defs\fP \fIARG\fP +Pre\-defines link definitions +.RS +.P +This option can be used to pre\-define link definitions\. The value needs to be a Hash where the keys are the link identifiers and the values are two element Arrays with the link URL and the link title\. +.P +If the value is a String, it has to contain a valid YAML hash and the hash has to follow the above guidelines\. +.P +Default: {} Used by: kramdown parser +.RE +.TP +\fB\-\-math\-engine\fP \fIARG\fP +Set the math engine +.RS +.P +Specifies the math engine that should be used for converting math blocks/spans\. If this option is set to +nil+, no math engine is used and the math blocks/spans are output as is\. +.P +Options for the selected math engine can be set with the math_engine_opts configuration option\. +.P +Default: mathjax Used by: HTML converter +.RE +.TP +\fB\-\-math\-engine\-opts\fP \fIARG\fP +Set the math engine options +.RS +.P +Specifies options for the math engine set via the math_engine configuration option\. +.P +The value needs to be a hash with key\-value pairs that are understood by the used math engine\. +.P +Default: {} Used by: HTML converter +.RE +.TP +\fB\-\-[no\-]parse\-block\-html\fP +Process kramdown syntax in block HTML tags +.RS +.P +If this option is \fBtrue\fP, the kramdown parser processes the content of block HTML tags as text containing block\-level elements\. Since this is not wanted normally, the default is \fBfalse\fP\&\. It is normally better to selectively enable kramdown processing via the markdown attribute\. +.P +Default: false Used by: kramdown parser +.RE +.TP +\fB\-\-[no\-]parse\-span\-html\fP +Process kramdown syntax in span HTML tags +.RS +.P +If this option is \fBtrue\fP, the kramdown parser processes the content of span HTML tags as text containing span\-level elements\. +.P +Default: true Used by: kramdown parser +.RE +.TP +\fB\-\-[no\-]remove\-block\-html\-tags\fP +Remove block HTML tags +.RS +.P +If this option is \fBtrue\fP, the RemoveHtmlTags converter removes block HTML tags\. +.P +Default: true Used by: RemoveHtmlTags converter +.RE +.TP +\fB\-\-[no\-]remove\-line\-breaks\-for\-cjk\fP +Specifies whether line breaks should be removed between CJK characters +.RS +.P +Default: false Used by: HTML converter +.RE +.TP +\fB\-\-[no\-]remove\-span\-html\-tags\fP +Remove span HTML tags +.RS +.P +If this option is \fBtrue\fP, the RemoveHtmlTags converter removes span HTML tags\. +.P +Default: false Used by: RemoveHtmlTags converter +.RE +.TP +\fB\-\-smart\-quotes\fP \fIARG\fP +Defines the HTML entity names or code points for smart quote output +.RS +.P +The entities identified by entity name or code point that should be used for, in order, a left single quote, a right single quote, a left double and a right double quote are specified by separating them with commas\. +.P +Default: lsquo,rsquo,ldquo,rdquo Used by: HTML/Latex converter +.RE +.TP +\fB\-\-syntax\-highlighter\fP \fIARG\fP +Set the syntax highlighter +.RS +.P +Specifies the syntax highlighter that should be used for highlighting code blocks and spans\. If this option is set to +nil+, no syntax highlighting is done\. +.P +Options for the syntax highlighter can be set with the syntax_highlighter_opts configuration option\. +.P +Default: rouge Used by: HTML/Latex converter +.RE +.TP +\fB\-\-syntax\-highlighter\-opts\fP \fIARG\fP +Set the syntax highlighter options +.RS +.P +Specifies options for the syntax highlighter set via the syntax_highlighter configuration option\. +.P +The value needs to be a hash with key\-value pairs that are understood by the used syntax highlighter\. +.P +Default: {} Used by: HTML/Latex converter +.RE +.TP +\fB\-\-template\fP \fIARG\fP +The name of an ERB template file that should be used to wrap the output or the ERB template itself\. +.RS +.P +This is used to wrap the output in an environment so that the output can be used as a stand\-alone document\. For example, an HTML template would provide the needed header and body tags so that the whole output is a valid HTML file\. If no template is specified, the output will be just the converted text\. +.P +When resolving the template file, the given template name is used first\. If such a file is not found, the converter extension (the same as the converter name) is appended\. If the file still cannot be found, the templates name is interpreted as a template name that is provided by kramdown (without the converter extension)\. If the file is still not found, the template name is checked if it starts with \[u2018]string://\[u2019] and if it does, this prefix is removed and the rest is used as template content\. +.P +kramdown provides a default template named \[u2018]document\[u2019] for each converter\. +.P +Default: \[u2018]\[u2019] Used by: all converters +.RE +.TP +\fB\-\-toc\-levels\fP \fIARG\fP +Defines the levels that are used for the table of contents +.RS +.P +The individual levels can be specified by separating them with commas (e\.g\. 1,2,3) or by using the range syntax (e\.g\. 1\.\.3)\. Only the specified levels are used for the table of contents\. +.P +Default: 1\.\.6 Used by: HTML/Latex converter +.RE +.TP +\fB\-\-[no\-]transliterated\-header\-ids\fP +Transliterate the header text before generating the ID +.RS +.P +Only ASCII characters are used in headers IDs\. This is not good for languages with many non\-ASCII characters\. By enabling this option the header text is transliterated to ASCII as good as possible so that the resulting header ID is more useful\. +.P +The stringex library needs to be installed for this feature to work! +.P +Default: false Used by: HTML/Latex converter +.RE +.TP +\fB\-\-typographic\-symbols\fP \fIARG\fP +Defines a mapping from typographical symbol to output characters +.RS +.P +Typographical symbols are normally output using their equivalent Unicode codepoint\. However, sometimes one wants to change the output, mostly to fallback to a sequence of ASCII characters\. +.P +This option allows this by specifying a mapping from typographical symbol to its output string\. For example, the mapping {hellip: \.\.\.} would output the standard ASCII representation of an ellipsis\. +.P +The available typographical symbol names are: +.IP \(bu 4 +hellip: ellipsis +.IP \(bu 4 +mdash: em\-dash +.IP \(bu 4 +ndash: en\-dash +.IP \(bu 4 +laquo: left guillemet +.IP \(bu 4 +raquo: right guillemet +.IP \(bu 4 +laquo_space: left guillemet followed by a space +.IP \(bu 4 +raquo_space: right guillemet preceeded by a space +.P +Default: {} Used by: HTML/Latex converter +.RE +.SH "EXIT STATUS" +The exit status is 0 if no error happened\. Otherwise it is 1\. +.SH "SEE ALSO" +The kramdown website +.UR http://kramdown\.gettalong\.org +.UE +for more information, especially on the supported input syntax\. +.SH "AUTHOR" +kramdown was written by Thomas Leitner +.MT t_leitner@gmx\.at +.UE +\&\. +.P +This manual page was written by Thomas Leitner +.MT t_leitner@gmx\.at +.UE +\&\. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/run_tests.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/run_tests.rb new file mode 100644 index 000000000000..abda502182be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/run_tests.rb @@ -0,0 +1,46 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +$:.unshift File.dirname(__FILE__) + '/../lib' +require 'kramdown' +require 'test/unit/assertions' +require 'yaml' + +include Test::Unit::Assertions + +arg = ARGV[0] || File.join(File.dirname(__FILE__), 'testcases') + +arg = if File.directory?(arg) + File.join(arg, '**/*.text') + else + arg + '.text' + end + +width = ((size = `stty size 2>/dev/null`).length > 0 ? size.split.last.to_i : 72) rescue 72 +width -= 8 +fwidth = 0 +Dir[arg].each {|f| fwidth = [fwidth, f.length + 10].max }.each do |file| + print(('Testing ' + file + ' ').ljust([fwidth, width].min)) + $stdout.flush + + html_file = file.sub('.text', '.html') + opts_file = file.sub('.text', '.options') + opts_file = File.join(File.dirname(file), 'options') unless File.exist?(opts_file) + options = File.exist?(opts_file) ? YAML.safe_load(File.read(opts_file)) : {auto_ids: false, footnote_nr: 1} + doc = Kramdown::Document.new(File.read(file), options) + begin + assert_equal(File.read(html_file), doc.to_html) + puts 'PASSED' + rescue StandardError + puts ' FAILED' + puts $!.message if $VERBOSE + puts $!.backtrace if $DEBUG + end + puts "Warnings:\n" + doc.warnings.join("\n") if !doc.warnings.empty? && $VERBOSE +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/test_files.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/test_files.rb new file mode 100644 index 000000000000..7e2ccad3c6f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/test_files.rb @@ -0,0 +1,302 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'minitest/autorun' +require 'kramdown' +require 'yaml' +require 'tmpdir' +require 'open3' + +begin + require 'kramdown/converter/syntax_highlighter/rouge' + + Kramdown::Converter::SyntaxHighlighter::Rouge.formatter_class.send(:define_method, :format) do |tokens, &b| + super(tokens, &b).sub(/<\/code><\/pre>\n?/, "</code></pre>\n") + end + + # custom formatter for tests + module Rouge + module Formatters + class RougeHTMLFormatters < Kramdown::Converter::SyntaxHighlighter::Rouge.formatter_class + + tag 'rouge_html_formatters' + + def stream(tokens, &b) + yield %(<div class="custom-class">) + super + yield %(</div>) + end + + end + end + end +rescue LoadError, SyntaxError, NameError +end + +Encoding.default_external = 'utf-8' + +class TestFiles < Minitest::Test + + EXCLUDE_KD_FILES = [].compact + + # Generate test methods for kramdown-to-xxx conversion + Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file| + next if EXCLUDE_KD_FILES.any? {|f| text_file =~ /#{f}/ } + basename = text_file.sub(/\.text$/, '') + opts_file = text_file.sub(/\.text$/, '.options') + (Dir[basename + ".*"] - [text_file, opts_file]).each do |output_file| + output_format = File.extname(output_file)[1..-1] + next unless Kramdown::Converter.const_defined?(output_format[0..0].upcase + output_format[1..-1]) + define_method('test_' + text_file.tr('.', '_') + "_to_#{output_format}") do + opts_file = File.join(File.dirname(text_file), 'options') unless File.exist?(opts_file) + options = File.exist?(opts_file) ? YAML.load(File.read(opts_file)) : {auto_ids: false, footnote_nr: 1} + doc = Kramdown::Document.new(File.read(text_file), options) + assert_equal(File.read(output_file), doc.send("to_#{output_format}")) + end + end + end + + # Generate test methods for html-to-{html,kramdown} conversion + `tidy -v 2>&1` + if $?.exitstatus != 0 + warn("Skipping html-to-{html,kramdown} tests because tidy executable is missing") + else + EXCLUDE_HTML_FILES = [ + 'test/testcases/block/06_codeblock/whitespace.html', # bc of span inside pre + 'test/testcases/block/09_html/simple.html', # bc of xml elements + 'test/testcases/span/03_codespan/highlighting.html', # bc of span elements inside code element + 'test/testcases/block/04_header/with_auto_ids.html', # bc of auto_ids=true option + 'test/testcases/block/04_header/header_type_offset.html', # bc of header_offset option + 'test/testcases/block/06_codeblock/rouge/simple.html', # bc of double surrounding <div> + 'test/testcases/block/06_codeblock/rouge/multiple.html', # bc of double surrounding <div> + 'test/testcases/block/06_codeblock/highlighting.html', # bc of span elements inside code element + 'test/testcases/block/06_codeblock/highlighting-opts.html', # bc of span elements inside code element + 'test/testcases/block/06_codeblock/guess_lang_css_class.html', # bc of double surrounding <div> + 'test/testcases/block/12_extension/options3.html', # bc of rouge + 'test/testcases/block/14_table/empty_tag_in_cell.html', # bc of tidy + 'test/testcases/block/15_math/mathjax_preview.html', # bc of mathjax preview + 'test/testcases/block/15_math/mathjax_preview_simple.html', # bc of mathjax preview + 'test/testcases/block/15_math/mathjax_preview_as_code.html', # bc of mathjax preview + 'test/testcases/span/05_html/mark_element.html', # bc of tidy + 'test/testcases/block/09_html/xml.html', # bc of tidy + 'test/testcases/span/05_html/xml.html', # bc of tidy + ].compact + EXCLUDE_HTML_TEXT_FILES = [ + 'test/testcases/block/09_html/parse_as_span.htmlinput', + 'test/testcases/block/09_html/parse_as_raw.htmlinput', + ].compact + Dir[File.dirname(__FILE__) + '/testcases/**/*.{html,htmlinput}'].each do |html_file| + next if EXCLUDE_HTML_FILES.any? {|f| html_file =~ /#{f}/ } + + out_files = [] + out_files << [(html_file =~ /\.htmlinput$/ ? html_file.sub(/input$/, '') : html_file), :to_html] + if html_file =~ /\.htmlinput$/ && EXCLUDE_HTML_TEXT_FILES.none? {|f| html_file =~ /#{f}/ } + out_files << [html_file.sub(/htmlinput$/, 'text'), :to_kramdown] + end + out_files.select {|f, _| File.exist?(f) }.each do |out_file, out_method| + define_method('test_' + html_file.tr('.', '_') + "_to_#{File.extname(out_file)}") do + opts_file = html_file.sub(/\.html(input)?$/, '.options') + opts_file = File.join(File.dirname(html_file), 'options') unless File.exist?(opts_file) + options = File.exist?(opts_file) ? YAML.load(File.read(opts_file)) : {auto_ids: false, footnote_nr: 1} + doc = Kramdown::Document.new(File.read(html_file), options.merge(input: 'html')) + if out_method == :to_html + assert_equal(tidy_output(File.read(out_file)), tidy_output(doc.send(out_method))) + else + assert_equal(File.read(out_file), doc.send(out_method)) + end + end + end + end + end + + def tidy_output(out) + cmd = "tidy -q --doctype omit -utf8" + result, error, status = Open3.capture3(cmd, stdin_data: out) + if status.exitstatus == 2 + raise "Problem using tidy: #{error}" + end + result + end + + # Generate test methods for text-to-latex conversion and compilation + `latex -v 2>&1` + if $?.exitstatus != 0 + warn("Skipping latex compilation tests because latex executable is missing") + else + EXCLUDE_LATEX_FILES = [ + 'test/testcases/span/01_link/image_in_a.text', # bc of image link + 'test/testcases/span/01_link/imagelinks.text', # bc of image links + 'test/testcases/span/01_link/empty_title.text', + 'test/testcases/span/04_footnote/markers.text', # bc of footnote in header + 'test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text', + 'test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text', + 'test/testcases/block/03_paragraph/standalone_image.text', # bc of standalone image + 'test/testcases/cjk-line-break.text', # latex unicode support + ].compact + Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file| + next if EXCLUDE_LATEX_FILES.any? {|f| text_file =~ /#{f}$/ } + define_method('test_' + text_file.tr('.', '_') + "_to_latex_compilation") do + latex = Kramdown::Document.new(File.read(text_file), auto_ids: false, footnote_nr: 1, + template: 'document').to_latex + Dir.mktmpdir do |tmpdir| + result = IO.popen("latex -output-directory='#{tmpdir}' 2>/dev/null", 'r+') do |io| + io.write(latex) + io.close_write + io.read + end + assert($?.exitstatus == 0, result.scan(/^!(.*\n.*)/).join("\n")) + end + end + end + end + + # Generate test methods for text->kramdown->html conversion + `tidy -v 2>&1` + if $?.exitstatus != 0 + warn("Skipping text->kramdown->html tests because tidy executable is missing") + else + EXCLUDE_TEXT_FILES = [ + 'test/testcases/span/05_html/markdown_attr.text', # bc of markdown attr + 'test/testcases/block/09_html/markdown_attr.text', # bc of markdown attr + 'test/testcases/span/extension/options.text', # bc of parse_span_html option + 'test/testcases/block/12_extension/options.text', # bc of options option + 'test/testcases/block/12_extension/options3.text', # bc of options option + 'test/testcases/block/09_html/content_model/tables.text', # bc of parse_block_html option + 'test/testcases/block/09_html/html_to_native/header.text', # bc of auto_ids option that interferes + 'test/testcases/block/09_html/html_to_native/table_simple.text', # bc of tr style attr getting removed + 'test/testcases/block/09_html/simple.text', # bc of webgen:block elements + 'test/testcases/block/11_ial/simple.text', # bc of change of ordering of attributes in header + 'test/testcases/span/extension/comment.text', # bc of comment text modifications (can this be avoided?) + 'test/testcases/block/04_header/header_type_offset.text', # bc of header_offset being applied twice + 'test/testcases/block/06_codeblock/rouge/simple.text', + 'test/testcases/block/06_codeblock/rouge/multiple.text', # check, what document contain more, than one code block + 'test/testcases/block/14_table/empty_tag_in_cell.text', # bc of tidy + 'test/testcases/span/01_link/link_defs_with_ial.text', # bc of attribute ordering + 'test/testcases/span/05_html/mark_element.text', # bc of tidy + 'test/testcases/block/09_html/xml.text', # bc of tidy + 'test/testcases/span/05_html/xml.text', # bc of tidy + 'test/testcases/block/03_paragraph/standalone_image.text', # bc of standalone image + 'test/testcases/cjk-line-break.text', + 'test/testcases/block/09_html/standalone_image_in_div.html', # bc of standalone image + 'test/testcases/span/abbreviations/abbrev_in_html.text', # bc of invalid abbr tag in SVG + ].compact + Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file| + next if EXCLUDE_TEXT_FILES.any? {|f| text_file =~ /#{f}$/ } + html_file = text_file.sub(/\.text$/, '.html') + next unless File.exist?(html_file) + define_method('test_' + text_file.tr('.', '_') + "_to_kramdown_to_html") do + opts_file = text_file.sub(/\.text$/, '.options') + opts_file = File.join(File.dirname(text_file), 'options') unless File.exist?(opts_file) + options = File.exist?(opts_file) ? YAML.load(File.read(opts_file)) : {auto_ids: false, footnote_nr: 1} + kdtext = Kramdown::Document.new(File.read(text_file), options).to_kramdown + html = Kramdown::Document.new(kdtext, options).to_html + assert_equal(tidy_output(File.read(html_file)), tidy_output(html)) + end + end + end + + # Generate test methods for html-to-kramdown-to-html conversion + `tidy -v 2>&1` + if $?.exitstatus != 0 + warn("Skipping html-to-kramdown-to-html tests because tidy executable is missing") + else + EXCLUDE_HTML_KD_FILES = [ + 'test/testcases/span/extension/options.html', # bc of parse_span_html option + 'test/testcases/span/05_html/normal.html', # bc of br tag before closing p tag + 'test/testcases/block/12_extension/nomarkdown.html', # bc of nomarkdown extension + 'test/testcases/block/12_extension/options3.html', # bc of rouge + 'test/testcases/block/09_html/simple.html', # bc of webgen:block elements + 'test/testcases/block/09_html/markdown_attr.html', # bc of markdown attr + 'test/testcases/block/09_html/html_to_native/table_simple.html', # bc of invalidly converted simple table + 'test/testcases/block/06_codeblock/whitespace.html', # bc of entity to char conversion + 'test/testcases/block/06_codeblock/rouge/simple.html', # bc of double surrounding <div> + 'test/testcases/block/06_codeblock/rouge/multiple.html', # bc of double surrounding <div> + 'test/testcases/block/06_codeblock/guess_lang_css_class.html', # bc of double surrounding <div> + 'test/testcases/block/06_codeblock/highlighting.html', # bc of span elements inside code element + 'test/testcases/block/06_codeblock/highlighting-opts.html', # bc of span elements inside code element + 'test/testcases/block/11_ial/simple.html', # bc of change of ordering of attributes in header + 'test/testcases/span/03_codespan/highlighting.html', # bc of span elements inside code element + 'test/testcases/block/04_header/with_auto_ids.html', # bc of auto_ids=true option + 'test/testcases/block/04_header/header_type_offset.html', # bc of header_offset option + 'test/testcases/block/16_toc/toc_exclude.html', # bc of different attribute ordering + 'test/testcases/span/autolinks/url_links.html', # bc of quot entity being converted to char + 'test/testcases/block/14_table/empty_tag_in_cell.html', # bc of tidy + 'test/testcases/span/01_link/link_defs_with_ial.html', # bc of attribute ordering + 'test/testcases/span/05_html/mark_element.html', # bc of tidy + 'test/testcases/block/09_html/xml.html', # bc of tidy + 'test/testcases/span/05_html/xml.html', # bc of tidy + 'test/testcases/block/03_paragraph/standalone_image.html', # bc of standalone image + 'test/testcases/block/15_math/normal.html', # bc of mathjax and HTML parser + 'test/testcases/block/15_math/gh_128.html', # bc of mathjax and HTML parser + 'test/testcases/span/04_footnote/backlink_inline.html', # bc of mathjax + 'test/testcases/block/09_html/standalone_image_in_div.html', # bc of standalone image + 'test/testcases/block/09_html/processing_instruction.html', # bc of PI + ].compact + Dir[File.dirname(__FILE__) + '/testcases/**/*.html'].each do |html_file| + next if EXCLUDE_HTML_KD_FILES.any? {|f| html_file =~ /#{f}$/ } + define_method('test_' + html_file.tr('.', '_') + "_to_kramdown_to_html") do + kd = Kramdown::Document.new(File.read(html_file), input: 'html', + auto_ids: false, footnote_nr: 1).to_kramdown + opts_file = html_file.sub(/\.html$/, '.options') + opts_file = File.join(File.dirname(html_file), 'options') unless File.exist?(opts_file) + options = File.exist?(opts_file) ? YAML.load(File.read(opts_file)) : {auto_ids: false, footnote_nr: 1} + doc = Kramdown::Document.new(kd, options) + assert_equal(tidy_output(File.read(html_file)), tidy_output(doc.to_html)) + end + end + end + + # Generate test methods for text-manpage conversion + Dir[File.dirname(__FILE__) + '/testcases/man/**/*.text'].each do |text_file| + define_method('test_' + text_file.tr('.', '_') + "_to_man") do + man_file = text_file.sub(/\.text$/, '.man') + doc = Kramdown::Document.new(File.read(text_file)) + assert_equal(File.read(man_file), doc.to_man) + end + end + + EXCLUDE_MODIFY = [ + 'test/testcases/block/06_codeblock/rouge/multiple.text', # bc of HTMLFormater in options + ].compact + + # Generate test methods for asserting that converters don't modify the document tree. + Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file| + opts_file = text_file.sub(/\.text$/, '.options') + options = File.exist?(opts_file) ? YAML.load(File.read(opts_file)) : {auto_ids: false, footnote_nr: 1} + (Kramdown::Converter.constants.map(&:to_sym) - + [:Base, :RemoveHtmlTags, :MathEngine, :SyntaxHighlighter]).each do |conv_class| + next if EXCLUDE_MODIFY.any? {|f| text_file =~ /#{f}$/ } + define_method("test_whether_#{conv_class}_modifies_tree_with_file_#{text_file.tr('.', '_')}") do + doc = Kramdown::Document.new(File.read(text_file), options) + options_before = Marshal.load(Marshal.dump(doc.options)) + tree_before = Marshal.load(Marshal.dump(doc.root)) + Kramdown::Converter.const_get(conv_class).convert(doc.root, doc.options) + assert_equal(options_before, doc.options) + assert_tree_not_changed(tree_before, doc.root) + end + end + end + + def assert_tree_not_changed(old, new) + assert_equal(old.type, new.type, "type mismatch") + if old.value.kind_of?(Kramdown::Element) + assert_tree_not_changed(old.value, new.value) + else + assert(old.value == new.value, "value mismatch") + end + assert_equal(old.attr, new.attr, "attr mismatch") + assert_equal(old.options, new.options, "options mismatch") + assert_equal(old.children.length, new.children.length, "children count mismatch") + + old.children.each_with_index do |child, index| + assert_tree_not_changed(child, new.children[index]) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/test_location.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/test_location.rb new file mode 100644 index 000000000000..d2642c78ece3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/test_location.rb @@ -0,0 +1,216 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'minitest/autorun' +require 'kramdown' + +Encoding.default_external = 'utf-8' + +describe 'location' do + # checks that +element+'s :location option corresponds to the location stored + # in the element.attr['class'] + def check_element_for_location(element) + if (match = /^line-(\d+)/.match(element.attr['class'] || '')) + expected_line = match[1].to_i + assert_equal(expected_line, element.options[:location]) + end + element.children.each do |child| + check_element_for_location(child) + end + end + + # Test cases consist of a kramdown string that uses IALs to specify the expected + # line numbers for a given element. + test_cases = { + 'autolink' => %(testing autolinks\n\n<http://kramdown.org>{:.line-3}), + 'blockquote' => %( + > block quote1 + > + > * {:.line-3} list item in block quote + > * {:.line-4} list item in block quote + > {:.line-3} + {:.line-1} + + > block quote2 + {:.line-8} + ), + 'codeblock' => %(\na para\n\n~~~~\ntest code 1\n~~~~\n{:.line-3}\n\n test code 2\n{:.line-8}\n), + 'codespan' => %(a para\n\nanother para `<code>`{:.line-3} with code\n), + 'emphasis' => %( + para *span*{:.line-1} + {:.line-1} + + ## header *span*{:.line-4} + {:.line-4} + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum *short span on single line*{:.line-11} + dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non + *long span over multiple lines - proident, sunt in culpa qui officia deserunt + mollit anim id est laborum.*{:.line-13} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + `code span`{:.line-18} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + {:.line-7} + ), + 'header' => %( + # header1 + {:.line-1} + + ## header2 + {:.line-4} + + ## header3 + {:.line-7} + + header4 + ======= + {:.line-10} + + ^ + + header5 + ------- + {:.line-16} + ), + 'horizontal_rule' => %(\na para\n\n----\n{:.line-3}\n), + 'html_entity' => "a para\n\nanother para with &amp;{:.line-3} html entity.\n", + 'link' => %( + a para + + This is [a link](http://rubyforge.org){:.line-3} to a page. + + Here comes a ![smiley](../images/smiley.png){:.line-5} + ), + 'list' => %( + * {:.line-1} list item + * {:.line-2} list item + * {:.line-3} list item + {:.line-1} + + {:.line-7} + 1. {:.line-7} list item + 2. {:.line-8} list item + 3. {:.line-9} list item + + {:.line-12} + definition term 1 + : {:.line-13} definition definition 1 + definition term 2 + : {:.line-15} definition definition 2 + ), + 'math_block' => %(\na para\n\n$$5+5$$\n{:.line-3}\n), + 'math_inline' => %(\na para\n\nanother para with inline math $$5+5$${:.line-3}\n), + 'paragraph' => %( + para1 + {:.line-1} + + para2 + {:.line-4} + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + {:.line-7} + + {:.line-14} + para with leading IAL + ), + 'table' => %( + a para + + |first|second|third| + |-----|------|-----| + |a |b |c | + {:.line-3} + ), + 'typographic_symbol' => %( + a para + + another para ---{:.line-3} + + another para ...{:.line-5} + ), + 'gh issue 129' => %( + `|` + {:.line-1} + ), + 'gh issue 131' => %( + * {:.line-1} test + line 2 + * {:.line-3} second + * {:.line-4} third + * {:.line-5} * {:.line-5} one + * {:.line-6} two + ), + 'gh issue 158' => %( + 😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁 + {:.line-1} + + - {:.line-4} T + {:.line-4} + + # T + {:.line-7} + ), + 'gh issue 243 - HTML raw elements' => %( + <ul class="line-1"> + <li class="line-2">Test</li> + </ul> + ), + } + test_cases.each do |name, test_string| + it "Handles #{name}" do + doc = Kramdown::Document.new(test_string.gsub(/^ /, '').strip) + check_element_for_location(doc.root) + end + end + + it 'adds location info to duplicate abbreviation definition warnings' do + test_string = %(This snippet contains a duplicate abbreviation definition + +*[duplicate]: The first definition +*[duplicate]: The second definition + ) + doc = Kramdown::Document.new(test_string.strip) + assert_equal(["Duplicate abbreviation ID 'duplicate' on line 4 - overwriting"], doc.warnings) + end + + it 'handles abbreviations' do + str = "This *is* ABC and\n**and** ABC second\nanother ABC\nas ABC as\nABC at the end.\n\n*[ABC]: ABC" + doc = Kramdown::Document.new(str) + doc.root.children.first.children.select {|e| e.type == :abbreviation }.each_with_index do |e, i| + assert_equal(i + 1, e.options[:location]) + end + end + + it 'handles line breaks' do + str = "First \nsecond\\\\\nthird \n" + doc = Kramdown::Document.new(str) + doc.root.children.first.children.select {|e| e.type == :br }.each_with_index do |e, i| + assert_equal(i + 1, e.options[:location]) + end + end + + it 'handles smart quotes' do + str = "This is 'first'\nand 'second' and\n'third'" + doc = Kramdown::Document.new(str) + doc.root.children.first.children.select {|e| e.type == :smart_quote }.each_with_index do |e, i| + assert_equal(((i + 1) / 2.0).ceil, e.options[:location]) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/test_string_scanner_kramdown.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/test_string_scanner_kramdown.rb new file mode 100644 index 000000000000..713c03c43357 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/test_string_scanner_kramdown.rb @@ -0,0 +1,27 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown which is licensed under the MIT. +#++ +# + +require 'minitest/autorun' +require 'kramdown/utils/string_scanner' + +describe Kramdown::Utils::StringScanner do + [ + ["...........X............", [/X/], 1], + ["1\n2\n3\n4\n5\n6X", [/X/], 6], + ["1\n2\n3\n4\n5\n6X\n7\n8X", [/X/, /X/], 8], + [(".\n" * 1000) + 'X', [/X/], 1001], + ].each_with_index do |test_data, i| + test_string, scan_regexes, expect = test_data + it "computes the correct current_line_number for example ##{i + 1}" do + str_sc = Kramdown::Utils::StringScanner.new(test_string) + scan_regexes.each {|scan_re| str_sc.scan_until(scan_re) } + assert_equal(expect, str_sc.current_line_number) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/spaces.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/spaces.html new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/spaces.html @@ -0,0 +1 @@ + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/spaces.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/spaces.text new file mode 100644 index 000000000000..2cbdaa62d0c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/spaces.text @@ -0,0 +1,3 @@ + + + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/tabs.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/tabs.html new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/tabs.html @@ -0,0 +1 @@ + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/tabs.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/tabs.text new file mode 100644 index 000000000000..69d6a470eb7f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/01_blank_line/tabs.text @@ -0,0 +1,6 @@ + + + + + + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/beginning.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/beginning.html new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/beginning.html @@ -0,0 +1 @@ + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/beginning.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/beginning.text new file mode 100644 index 000000000000..8d1580261d04 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/beginning.text @@ -0,0 +1,3 @@ +^ + + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/end.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/end.html new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/end.html @@ -0,0 +1 @@ + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/end.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/end.text new file mode 100644 index 000000000000..db56ec3b8cbc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/end.text @@ -0,0 +1,3 @@ + + +^ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/middle.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/middle.html new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/middle.html @@ -0,0 +1 @@ + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/middle.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/middle.text new file mode 100644 index 000000000000..87210a142387 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/02_eob/middle.text @@ -0,0 +1,5 @@ + + +^ + + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/indented.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/indented.html new file mode 100644 index 000000000000..810cfc091971 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/indented.html @@ -0,0 +1,18 @@ +<p>This is a para.</p> + +<p>This is a para.</p> + +<p>This is a para.</p> + +<p>This is a para.</p> + +<pre><code>This is a code block. +</code></pre> + +<p>And this is another.</p> + +<p>A para + with + mixed +indents. + and with much indent</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/indented.html.gfm b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/indented.html.gfm new file mode 100644 index 000000000000..4440c62e81b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/indented.html.gfm @@ -0,0 +1,18 @@ +<p>This is a para.</p> + +<p>This is a para.</p> + +<p>This is a para.</p> + +<p>This is a para.</p> + +<pre><code>This is a code block. +</code></pre> + +<p>And this is another.</p> + +<p>A para +<br /> with +<br /> mixed +<br />indents. +<br /> and with much indent</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/indented.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/indented.text new file mode 100644 index 000000000000..5849f5b73144 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/indented.text @@ -0,0 +1,19 @@ +This is a para. + + This is a para. + + This is a para. + + This is a para. + + This is a code block. + + + +And this is another. + +A para + with + mixed +indents. + and with much indent diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/line_break_last_line.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/line_break_last_line.html new file mode 100644 index 000000000000..9bc47dbfc834 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/line_break_last_line.html @@ -0,0 +1,9 @@ +<p>First line<br /> +<a href="https://example.com">https://example.com</a></p> + +<p>First line<br /> +<a href="https://example.com">https://example.com</a></p> + +<p>Last Line</p> + +<p>Last Line\</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/line_break_last_line.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/line_break_last_line.text new file mode 100644 index 000000000000..bbc4cc537e79 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/line_break_last_line.text @@ -0,0 +1,9 @@ +First line +<https://example.com> + +First line\\ +<https://example.com> + +Last Line + +Last Line\\ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/no_newline_at_end.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/no_newline_at_end.html new file mode 100644 index 000000000000..6a209e216686 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/no_newline_at_end.html @@ -0,0 +1,5 @@ +<p>One paragraph +over + multiple lines.</p> + +<p>Second one without newline.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/no_newline_at_end.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/no_newline_at_end.text new file mode 100644 index 000000000000..7f1169d6cc55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/no_newline_at_end.text @@ -0,0 +1,5 @@ + One paragraph +over + multiple lines. + +Second one without newline. \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/one_para.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/one_para.html new file mode 100644 index 000000000000..0d20e1752a14 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/one_para.html @@ -0,0 +1 @@ +<p>This is just a normal paragraph.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/one_para.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/one_para.text new file mode 100644 index 000000000000..0b01324f5951 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/one_para.text @@ -0,0 +1 @@ +This is just a normal paragraph. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/standalone_image.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/standalone_image.html new file mode 100644 index 000000000000..7faa971fbed6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/standalone_image.html @@ -0,0 +1,13 @@ +<p>para</p> + +<figure class="class" id="id"> + <img src="some.jpg" alt="standalone image" key="value" /> + <figcaption>standalone image</figcaption> +</figure> + +<figure id="block-id" class="block-class" block-key="block-value"> + <img src="some.jpg" alt="standalone image" id="id" class="class" key="value" /> + <figcaption>standalone image</figcaption> +</figure> + +<p>para</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/standalone_image.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/standalone_image.text new file mode 100644 index 000000000000..3010140c9941 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/standalone_image.text @@ -0,0 +1,9 @@ +para +{:standalone} + +![standalone image](some.jpg){:#id .class key="value" standalone} + +![standalone image](some.jpg){:#id .class key="value" standalone} +{:#block-id .block-class block-key="block-value"} + +para diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/two_para.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/two_para.html new file mode 100644 index 000000000000..d6194ea92099 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/two_para.html @@ -0,0 +1,4 @@ +<p>This is just a normal paragraph. +That goes on to the second line.</p> + +<p>Another paragraph.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/two_para.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/two_para.text new file mode 100644 index 000000000000..b0c730dbb0f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/two_para.text @@ -0,0 +1,4 @@ +This is just a normal paragraph. +That goes on to the second line. + +Another paragraph. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/with_html_to_native.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/with_html_to_native.html new file mode 100644 index 000000000000..a8831e66259d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/with_html_to_native.html @@ -0,0 +1 @@ +<p><img src="http://example.com/image.png" alt="" /> some text</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/with_html_to_native.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/with_html_to_native.options new file mode 100644 index 000000000000..63936b9955ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/with_html_to_native.options @@ -0,0 +1 @@ +:html_to_native: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/with_html_to_native.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/with_html_to_native.text new file mode 100644 index 000000000000..e5fe18a66b9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/03_paragraph/with_html_to_native.text @@ -0,0 +1 @@ +<p><img src="http://example.com/image.png" alt="" /></p> some text diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header.html new file mode 100644 index 000000000000..07041072457f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header.html @@ -0,0 +1,57 @@ +<h1>This is a header</h1> + +<h2>This is a header</h2> + +<h3>This is a header</h3> + +<h4>This is a header</h4> + +<h5>This is a header</h5> + +<h6>This is a header</h6> + +<h1>Header</h1> +<h1>Header</h1> + +<h2>Header</h2> +<blockquote> + <p>blockquote</p> +</blockquote> + +<h6>header</h6> +<p>paragraph</p> + +<blockquote> + <p>blockquote +### not a header</p> +</blockquote> + +<h1>header</h1> + +<h1>header</h1> + +<h1>header</h1> + +<h1>header #</h1> + +<h1>header</h1> + +<p>#</p> + +<p>#</p> + +<h3 id="id">Header</h3> + +<h3 id="Id">Header</h3> + +<h3 id="id">Header</h3> + +<h3 id="A-Za-z0-9_:t">Header</h3> + +<h3>Header {#9ab}</h3> + +<h3>Header{#noid}</h3> + +<h3>Header ##{#noid}</h3> + +<h3>Last</h3> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header.text new file mode 100644 index 000000000000..392b3f690e8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header.text @@ -0,0 +1,54 @@ +# This is a header + +## This is a header + +### This is a header + +#### This is a header + +##### This is a header + +###### This is a header + +# Header +^ +# Header + +##Header ##### +> blockquote + +###### header +paragraph + +> blockquote +### not a header + +# header # + +# header# + +#header# + +# header \# + +# header + +# + +# + +### Header {#id} + +### Header ## {#Id} + +### Header ## {#id} + +### Header {#A-Za-z0-9_:t} + +### Header {#9ab} + +### Header{#noid} + +### Header ##{#noid} + +### Last diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header_no_newline_at_end.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header_no_newline_at_end.html new file mode 100644 index 000000000000..9f49c3bf87f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header_no_newline_at_end.html @@ -0,0 +1 @@ +<h1>header</h1> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header_no_newline_at_end.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header_no_newline_at_end.text new file mode 100644 index 000000000000..7b74be4ddd8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/atx_header_no_newline_at_end.text @@ -0,0 +1 @@ +# header \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.html new file mode 100644 index 000000000000..e031b9a6c198 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.html @@ -0,0 +1,11 @@ +<h2>Lorem ipsum</h2> + +<h3>Lorem ipsum</h3> + +<h4>Lorem ipsum</h4> + +<h6>Lorem ipsum</h6> + +<h2>Lorem ipsum</h2> + +<h3>Lorem ipsum</h3> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.kramdown b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.kramdown new file mode 100644 index 000000000000..a77deb9b4e4e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.kramdown @@ -0,0 +1,12 @@ +## Lorem ipsum + +### Lorem ipsum + +#### Lorem ipsum + +###### Lorem ipsum + +## Lorem ipsum + +### Lorem ipsum + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.latex new file mode 100644 index 000000000000..c9017e6eae24 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.latex @@ -0,0 +1,12 @@ +\subsection*{Lorem ipsum} + +\subsubsection*{Lorem ipsum} + +\paragraph*{Lorem ipsum} + +\subparagraph*{Lorem ipsum} + +\subsection*{Lorem ipsum} + +\subsubsection*{Lorem ipsum} + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.options new file mode 100644 index 000000000000..a8050358d5a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.options @@ -0,0 +1,2 @@ +:header_offset: 1 +:auto_ids: false \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.text new file mode 100644 index 000000000000..bfaefa2837de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/header_type_offset.text @@ -0,0 +1,13 @@ +# Lorem ipsum + +## Lorem ipsum + +### Lorem ipsum + +###### Lorem ipsum + +Lorem ipsum +=========== + +Lorem ipsum +----------- diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header.html new file mode 100644 index 000000000000..147c34516715 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header.html @@ -0,0 +1,32 @@ +<h2>test</h2> + +<h1>test2</h1> + +<h2>test</h2> +<p>para</p> + +<pre><code> header = +</code></pre> + +<p>=</p> + +<p>This is a para. +With two lines. +And not a header. +=================</p> + +<blockquote> + <p>Blockquote. +Not a Header +-</p> +</blockquote> + +<h2 id="id">header</h2> + +<h1 id="Id">header</h1> + +<h2 id="A-Za-z0-9_:">header</h2> + +<h2>header{#noid}</h2> + +<h2>header</h2> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header.text new file mode 100644 index 000000000000..ae94ecd87782 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header.text @@ -0,0 +1,39 @@ +test +- + +test2 +========= + +test +- +para + + header += + + += + +This is a para. +With two lines. +And not a header. +================= + +> Blockquote. +Not a Header +- + +header {#id} +------------ + +header {#Id} +====== + +header {#A-Za-z0-9_:} +------ + +header{#noid} +----- + +header +------ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header_no_newline_at_end.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header_no_newline_at_end.html new file mode 100644 index 000000000000..9f49c3bf87f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header_no_newline_at_end.html @@ -0,0 +1 @@ +<h1>header</h1> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header_no_newline_at_end.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header_no_newline_at_end.text new file mode 100644 index 000000000000..0f00750a23cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/setext_header_no_newline_at_end.text @@ -0,0 +1,2 @@ +header +====== \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_prefix.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_prefix.html new file mode 100644 index 000000000000..724d391baf35 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_prefix.html @@ -0,0 +1,3 @@ +<h1 id="hallo_header-1">Header 1</h1> + +<h1 id="hallo_section">123</h1> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_prefix.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_prefix.options new file mode 100644 index 000000000000..83305cbe4564 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_prefix.options @@ -0,0 +1,2 @@ +:auto_ids: true +:auto_id_prefix: hallo_ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_prefix.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_prefix.text new file mode 100644 index 000000000000..acf09fe446f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_prefix.text @@ -0,0 +1,3 @@ +# Header 1 + +# 123 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_stripping.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_stripping.html new file mode 100644 index 000000000000..1d342cd62f31 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_stripping.html @@ -0,0 +1 @@ +<h1 id="this-is-a-header"><em class="none">This is a header</em></h1> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_stripping.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_stripping.options new file mode 100644 index 000000000000..68800f69d905 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_stripping.options @@ -0,0 +1 @@ +:auto_id_stripping: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_stripping.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_stripping.text new file mode 100644 index 000000000000..2b57bc8daf37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_id_stripping.text @@ -0,0 +1 @@ +# <em class="none">This is a header</em> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_ids.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_ids.html new file mode 100644 index 000000000000..af8126d5967e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_ids.html @@ -0,0 +1,21 @@ +<h1 id="this-is-a-header">This is a header</h1> + +<h2 id="another-one-1-here">12. Another one-1-here</h2> + +<h3 id="do--it-now">Do ^&amp; it now</h3> + +<h1 id="hallo">Hallo</h1> + +<h2 id="not-now">Not now</h2> + +<h1 id="hallo-1">Hallo</h1> + +<h1 id="section">23232</h1> + +<h1 id="section-1">33333</h1> + +<h2 id="hallo-2">hallO</h2> + +<h1>Header without ID</h1> + +<h1 id="transliterated-day-la-vi-du">Transliterated: Đây-là-ví-dụ</h1> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_ids.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_ids.options new file mode 100644 index 000000000000..0a1fec87e6d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_ids.options @@ -0,0 +1,2 @@ +:auto_ids: true +:transliterated_header_ids: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_ids.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_ids.text new file mode 100644 index 000000000000..f4cd91b3246b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/04_header/with_auto_ids.text @@ -0,0 +1,24 @@ +# This is a header + +## 12. Another one-1-here + +### Do ^& it now + +Hallo +===== + +Not now +------- + +# Hallo + +# 23232 + +# 33333 + +## hallO + +# Header without ID +{: id=""} + +# Transliterated: Đây-là-ví-dụ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/indented.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/indented.html new file mode 100644 index 000000000000..734bb7a12709 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/indented.html @@ -0,0 +1,25 @@ +<blockquote> + <p>A normal blockquote.</p> +</blockquote> + +<blockquote> + <p>A normal blockquote.</p> +</blockquote> + +<blockquote> + <p>A normal blockquote.</p> +</blockquote> + +<blockquote> + <p>A normal blockquote.</p> +</blockquote> + +<pre><code>&gt; A codeblock +</code></pre> + +<blockquote> + <p>Blockquote +with +mixed +indents.</p> +</blockquote> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/indented.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/indented.text new file mode 100644 index 000000000000..70850b0d35b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/indented.text @@ -0,0 +1,14 @@ +> A normal blockquote. + + > A normal blockquote. + + > A normal blockquote. + + > A normal blockquote. + + > A codeblock + +> Blockquote + > with + >mixed +> indents. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/lazy.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/lazy.html new file mode 100644 index 000000000000..00a21024239c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/lazy.html @@ -0,0 +1,34 @@ +<blockquote> + <p>This is a long +long line.</p> +</blockquote> + +<blockquote> + <blockquote> + <p>Nested quote +inside +still inside</p> + </blockquote> +</blockquote> + +<blockquote> + <blockquote> + <p>This is a subquote. +over multipline lines. +continuing +here</p> + </blockquote> +</blockquote> + +<blockquote> + <p>This is a quote + no code</p> +</blockquote> + +<blockquote id="id"> + <p>This is a quote</p> +</blockquote> + +<blockquote> + <p>This is a quote</p> +</blockquote> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/lazy.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/lazy.text new file mode 100644 index 000000000000..adde6a673368 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/lazy.text @@ -0,0 +1,20 @@ +> This is a long +long line. + +> > Nested quote +inside +> still inside + +> > This is a subquote. +> > over multipline lines. +> continuing +here + +> This is a quote + no code + +> This is a quote +{: #id} + +> This is a quote +^ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/nested.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/nested.html new file mode 100644 index 000000000000..4bc94f087996 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/nested.html @@ -0,0 +1,10 @@ +<blockquote> + <p>foo</p> + + <blockquote> + <p>bar + baz</p> + </blockquote> + + <p>foo</p> +</blockquote> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/nested.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/nested.text new file mode 100644 index 000000000000..2176882cc0cc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/nested.text @@ -0,0 +1,6 @@ +> foo +> +> > bar +>> baz +> +> foo diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/no_newline_at_end.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/no_newline_at_end.html new file mode 100644 index 000000000000..1de4a60f5ebb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/no_newline_at_end.html @@ -0,0 +1,4 @@ +<blockquote> + <p>This is a block quote +with no newline.</p> +</blockquote> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/no_newline_at_end.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/no_newline_at_end.text new file mode 100644 index 000000000000..402648ad2cf2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/no_newline_at_end.text @@ -0,0 +1,2 @@ +> This is a block quote +> with no newline. \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/very_long_line.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/very_long_line.html new file mode 100644 index 000000000000..4a9aaf5e0ab4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/very_long_line.html @@ -0,0 +1,3 @@ +<blockquote> + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> +</blockquote> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/very_long_line.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/very_long_line.text new file mode 100644 index 000000000000..a2b33bdfeadb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/very_long_line.text @@ -0,0 +1 @@ +> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/with_code_blocks.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/with_code_blocks.html new file mode 100644 index 000000000000..30abd99eb5b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/with_code_blocks.html @@ -0,0 +1,15 @@ +<blockquote> + <p>Example:</p> + + <pre><code>sub status { + print "working"; +} +</code></pre> + + <p>Or:</p> + + <pre><code>sub status { + return "working"; +} +</code></pre> +</blockquote> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/with_code_blocks.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/with_code_blocks.text new file mode 100644 index 000000000000..3b188dd4d506 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/05_blockquote/with_code_blocks.text @@ -0,0 +1,11 @@ +>Example: +> +> sub status { +> print "working"; +> } +> +> Or: +> +> sub status { +> return "working"; +> } diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/disable-highlighting.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/disable-highlighting.html new file mode 100644 index 000000000000..142a5d344c91 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/disable-highlighting.html @@ -0,0 +1,4 @@ +<pre><code>x = Class.new +</code></pre> +<pre lang="html"><code>&lt;a&gt;href&lt;/a&gt; +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/disable-highlighting.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/disable-highlighting.options new file mode 100644 index 000000000000..72e9bc1eecc8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/disable-highlighting.options @@ -0,0 +1 @@ +:enable_coderay: false diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/disable-highlighting.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/disable-highlighting.text new file mode 100644 index 000000000000..af4d0bdebfb2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/disable-highlighting.text @@ -0,0 +1,4 @@ + x = Class.new +^ + <a>href</a> +{: lang="html"} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/error.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/error.html new file mode 100644 index 000000000000..d9f9da32a8c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/error.html @@ -0,0 +1,4 @@ +<p>Some para</p> + +<p>~~~~~~ +not codeblock</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/error.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/error.text new file mode 100644 index 000000000000..60ea366c3d09 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/error.text @@ -0,0 +1,4 @@ +Some para + +~~~~~~ +not codeblock diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/guess_lang_css_class.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/guess_lang_css_class.html new file mode 100644 index 000000000000..066e909ff2ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/guess_lang_css_class.html @@ -0,0 +1,15 @@ +<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>class Foo + def bar + puts 'Hello' + end +end +</code></pre> +</div></div> + +<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>class Foo + def bar + puts 'Hello' + end +end +</code></pre> +</div></div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/guess_lang_css_class.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/guess_lang_css_class.options new file mode 100644 index 000000000000..bfc92f456394 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/guess_lang_css_class.options @@ -0,0 +1,2 @@ +:syntax_highlighter_opts: + guess_lang: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/guess_lang_css_class.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/guess_lang_css_class.text new file mode 100644 index 000000000000..4b074a8af220 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/guess_lang_css_class.text @@ -0,0 +1,13 @@ +~~~ +class Foo + def bar + puts 'Hello' + end +end +~~~ + + class Foo + def bar + puts 'Hello' + end + end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted-with-opts.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted-with-opts.latex new file mode 100644 index 000000000000..a092a1f60a8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted-with-opts.latex @@ -0,0 +1,9 @@ +\begin{minted}[breaklines,linenos]{ruby} +x = Class.new + +\end{minted} + +\begin{minted}[breaklines,linenos]{html} +<a>this is a reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, long link</a> + +\end{minted} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted-with-opts.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted-with-opts.options new file mode 100644 index 000000000000..b773fc8f2785 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted-with-opts.options @@ -0,0 +1,4 @@ +:syntax_highlighter: minted +:syntax_highlighter_opts: + wrap: true + line_numbers: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted-with-opts.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted-with-opts.text new file mode 100644 index 000000000000..26365189ef58 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted-with-opts.text @@ -0,0 +1,5 @@ + x = Class.new +{: .language-ruby} + + <a>this is a reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, long link</a> +{: .language-html} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted.latex new file mode 100644 index 000000000000..354d6ab90b6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted.latex @@ -0,0 +1,8 @@ +\begin{minted}[]{ruby} +x = Class.new + +\end{minted} +\begin{minted}[]{html} +<a>href</a> + +\end{minted} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted.options new file mode 100644 index 000000000000..b2ee189a95ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted.options @@ -0,0 +1,3 @@ +:syntax_highlighter: minted +:syntax_highlighter_opts: + default_lang: ruby diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted.text new file mode 100644 index 000000000000..5ac474608e65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-minted.text @@ -0,0 +1,4 @@ + x = Class.new +^ + <a>href</a> +{: .language-html} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-opts.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-opts.html new file mode 100644 index 000000000000..b694d3759a34 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-opts.html @@ -0,0 +1,6 @@ +<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span> +</code></pre> +</div></div> +<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;a&gt;</span>href<span class="nt">&lt;/a&gt;</span> +</code></pre> +</div></div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-opts.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-opts.options new file mode 100644 index 000000000000..be21a32e0732 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-opts.options @@ -0,0 +1,7 @@ +:syntax_highlighter_opts: + block: + css: class + default_lang: ruby + wrap: span + line_numbers: null + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-opts.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-opts.text new file mode 100644 index 000000000000..5ac474608e65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting-opts.text @@ -0,0 +1,4 @@ + x = Class.new +^ + <a>href</a> +{: .language-html} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting.html new file mode 100644 index 000000000000..33dd015ad325 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting.html @@ -0,0 +1,5 @@ +<pre><code>x = Class.new +</code></pre> +<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;a&gt;</span>href<span class="nt">&lt;/a&gt;</span> +</code></pre> +</div></div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting.options new file mode 100644 index 000000000000..8133537dc24d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting.options @@ -0,0 +1,5 @@ +:coderay_default_lang: ruby +:coderay_wrap: span +:coderay_line_numbers: ~ +:coderay_css: class + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting.text new file mode 100644 index 000000000000..5ac474608e65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/highlighting.text @@ -0,0 +1,4 @@ + x = Class.new +^ + <a>href</a> +{: .language-html} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/issue_gh45.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/issue_gh45.html new file mode 100644 index 000000000000..b096a9ed2e02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/issue_gh45.html @@ -0,0 +1,164 @@ + +<p>B</p> + +<pre><code> BBBBBBBB. + + + + BBBB BB BBBBBBBB BBBBB. BBBBBBB BB BBBBB BB BBB BBBB BBBBB BBB BBB BBBB BBB BBBBBBB BBB BBBBBBB. B BBB'B BBBBB BBBB BBB BBBB BBBBBBB BBBB BBBB BBBB BBBBBBBB. + + + BBB BBBBB BBBBB BBB BBBB BBBB BBBB, BBB BBBBB BB BBBBB BBB BB BBBBBB BBBB BBB BBBBB BBBB BB. BBBBB BBB BBBBB BBBBB BBB BBBB BB BBBB BBBB BBBBB. + + + BBBB BBBBB, BBBBB, BBBBBBBB? + + BB BBB BB BBBB BBB BBBB BBB BBBBBB /BBB BB BBBBBBBBB BBBB BBBBBBB BBBBBB BB BBB. + + + BBBB BBBBBBBB BBB BBBB BB BBBBB BBB BBBBBB BBBB BBBBB BBBBBB BBBBBBBBB BBBB BB BBBBB...................................................................... + + + + + + + + + + + + + + + + + + + + + + BBBBB B'B BBB BBBBB. BBBB BBBBB BBBBB. ( B BBBBB BBBBBBBBBB BBBBB BBBB'B BBBBB BBBBB. BBB BBBB BBBBB BBBB BBBB. BBBBBBB BBB BB BBBBBBB BBB BBB B BBBB BBBBBBBBBBBB. BBBBB BBBBB.) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BBBB'B BB +</code></pre> + +<p>.</p> + +<pre><code> B BBB BBB BBB ? B. B BBB BBBBBB BBBB BBB BBBB. BBBBBBB BB BBBBBBB B BBBB BBBB BBB BBBBBB. + + + + + + + + + + + + + + BBBB BB 'BBBB' BBBB BBBBB. + + + BBBBBBBB B BBBB BBBBBB BB BBBBBBBB BBB BBBBBBB BBBBBBB BBBBBBB. + + + B BBBB BB BBBB. BBBBB BBBBBBBB. BBB BB BB. BB BB BBBB BB BBBBBBBBBB. BB BBBBBBBB BB BBBBBBBBB. + + + BBBBBBBB BB BBBB. BBBBBBB BBB BBBBB BBBBB BBBBB. B'BB BBBBBBB BB BBBBB BBBBB BBBBBBB BBB BBBBB. BBBB. + + B BBBBBB BBBB BB BBBB BBB. (BB BBB BBBBB BBBBB...............B) + + + + BBBB! + + + + BBBB BB BBB BBBBBBB BBBBBB. B +</code></pre> + +<p>B</p> + +<pre><code> BBBBB BB/BBB BBBBB! BBBB BBBB BBBBBBBBBBB 'BBB'B BBBBBB.' + + + + + + + + + + + + + + + BBBB BBBBBBB BBBB BB BBB BBBBBBBB BB BBBB BBBBBB BBB BBBBBBBBB BBBB. BBBBBBBB BBBBBBB BBBB BBBB BBBB BB BBBB BB BBBB BB BBBB B BBB BB BBBBB BBBBBB. B BBBB BBBBBBB BB BBBB BBBBB B BBB BBBBBBB BB BBBBB BBBB. BBB BBBBBBB BBBB. B BBB BBBB BBBB B BBBB BBBBBB BBB B BBBBBB BBBBBB. BBB BB BBBBBB BBBBBB BBBBBBBBBB BB...BBBBB BBBB BBBB BB BBBBB. (BBBBBBB BBB BBBBBB BBB'B BBBB BBB BBBBB BBB BB BBBBB BBBBBBBBBBB BBBBB B BBBB BBBB BBBBB. + + + + + + + + + +BBBBB BB BB BBBB B'B BBBB BBBBB BBBBB BBB BB BBBBBB/BBB (BBBBB) BBBBBB BB. + BBBBBBBB. B BBB BBBB BB BB BBB/BBBBBB BBBBBB BBB BBBB BBBBBBBB BB BB B BBBBBB BBBBBB BBBBB. (BBB/B BBB BBBB BBBB...BBB BBB BBB BBBB BB BB B BBBB BB BBB BB? BBBBBBB B BBB B BBBB BBBBBBBB BBB B BBB BBB BBBBB BBBB BBB BBBB BB B BBBBBBBB BB BBBBB BB BB BBB BBBBB BBB BB BBBBB BBBBBBB B BBB BBBBBBB. BBBBBB (BBBBB) BBBB BBBBB BBBBBBB BBBBB BBBB BBBB BBB. 100 BBBBBB BB BBBBB. BBBB BBB BBB BBBBBB BBB BB. BBB BBBB BB BBB BBBBB! BBB BB BBBBBB BBBBB B BBB'B BBBBBBBBB BBBB BBB BBB. (BBBBBB BBBBBBB BB BBBB BBBBB (BBBBBB BBBBB BBBBB BBBBB.)) + + + BBB B BBBBBBBBBBB BBBB BBB BB BBB. BBBBB BBB BBBBB B BBBB BBBBBB BBBBB BBB. BB BBBBBB BBB BBBB B BBB BB BBBBBBBB BBBBBB BBBB BBB B BBBBBB BBBB BBBBBB BBBBBBB BBBB BBBB BBB BBBBBBBB. + + + + + + + + + + + + BBBBB!!!!!!! + + + B BBB BBBB BBBBBB BBBB BBBB BBBB B BBB BBBBB BBB BBBBB B BBBB BBBBBBB BB BB BBBB BBBBBBBBB. B BBBB BBBBBB BBBBBBB BBBB BBBB BBB BBBB. + + BB BB, BB BBBBBB BBBB, (BBBBBB BB BBB BBBB . BBBBB BB BBBB BBBB BB BB BBBB BBBB B BBBB BB BB (BB BBBB BB BBB BBBBBBB BB BBBBBBB. )) BB'BB BBB BBB'B BB BB BBBB BB B BBBB B BBBBB (BB BBBBBB BB BBB B'BB BBBBBBBB BB BBBB BBBB.) + + + B BBBBB B'BB BBB BB BBBB BBB BBB. +</code></pre> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/issue_gh45.test b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/issue_gh45.test new file mode 100644 index 000000000000..1bf89010b814 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/issue_gh45.test @@ -0,0 +1,188 @@ + + + B + + + + + BBBBBBBB. + + + + BBBB BB BBBBBBBB BBBBB. BBBBBBB BB BBBBB BB BBB BBBB BBBBB BBB BBB BBBB BBB BBBBBBB BBB BBBBBBB. B BBB'B BBBBB BBBB BBB BBBB BBBBBBB BBBB BBBB BBBB BBBBBBBB. + + + BBB BBBBB BBBBB BBB BBBB BBBB BBBB, BBB BBBBB BB BBBBB BBB BB BBBBBB BBBB BBB BBBBB BBBB BB. BBBBB BBB BBBBB BBBBB BBB BBBB BB BBBB BBBB BBBBB. + + + BBBB BBBBB, BBBBB, BBBBBBBB? + + BB BBB BB BBBB BBB BBBB BBB BBBBBB /BBB BB BBBBBBBBB BBBB BBBBBBB BBBBBB BB BBB. + + + BBBB BBBBBBBB BBB BBBB BB BBBBB BBB BBBBBB BBBB BBBBB BBBBBB BBBBBBBBB BBBB BB BBBBB...................................................................... + + + + + + + + + + + + + + + + + + + + + + BBBBB B'B BBB BBBBB. BBBB BBBBB BBBBB. ( B BBBBB BBBBBBBBBB BBBBB BBBB'B BBBBB BBBBB. BBB BBBB BBBBB BBBB BBBB. BBBBBBB BBB BB BBBBBBB BBB BBB B BBBB BBBBBBBBBBBB. BBBBB BBBBB.) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BBBB'B BB + + + + + + + + + + + + + + + + + + +. + + B BBB BBB BBB ? B. B BBB BBBBBB BBBB BBB BBBB. BBBBBBB BB BBBBBBB B BBBB BBBB BBB BBBBBB. + + + + + + + + + + + + + + BBBB BB 'BBBB' BBBB BBBBB. + + + BBBBBBBB B BBBB BBBBBB BB BBBBBBBB BBB BBBBBBB BBBBBBB BBBBBBB. + + + B BBBB BB BBBB. BBBBB BBBBBBBB. BBB BB BB. BB BB BBBB BB BBBBBBBBBB. BB BBBBBBBB BB BBBBBBBBB. + + + BBBBBBBB BB BBBB. BBBBBBB BBB BBBBB BBBBB BBBBB. B'BB BBBBBBB BB BBBBB BBBBB BBBBBBB BBB BBBBB. BBBB. + + B BBBBBB BBBB BB BBBB BBB. (BB BBB BBBBB BBBBB...............B) + + + + BBBB! + + + + BBBB BB BBB BBBBBBB BBBBBB. +B + +B + + + + BBBBB BB/BBB BBBBB! BBBB BBBB BBBBBBBBBBB 'BBB'B BBBBBB.' + + + + + + + + + + + + + + + BBBB BBBBBBB BBBB BB BBB BBBBBBBB BB BBBB BBBBBB BBB BBBBBBBBB BBBB. BBBBBBBB BBBBBBB BBBB BBBB BBBB BB BBBB BB BBBB BB BBBB B BBB BB BBBBB BBBBBB. B BBBB BBBBBBB BB BBBB BBBBB B BBB BBBBBBB BB BBBBB BBBB. BBB BBBBBBB BBBB. B BBB BBBB BBBB B BBBB BBBBBB BBB B BBBBBB BBBBBB. BBB BB BBBBBB BBBBBB BBBBBBBBBB BB...BBBBB BBBB BBBB BB BBBBB. (BBBBBBB BBB BBBBBB BBB'B BBBB BBB BBBBB BBB BB BBBBB BBBBBBBBBBB BBBBB B BBBB BBBB BBBBB. + + + + + + + + + + BBBBB BB BB BBBB B'B BBBB BBBBB BBBBB BBB BB BBBBBB/BBB (BBBBB) BBBBBB BB. + BBBBBBBB. B BBB BBBB BB BB BBB/BBBBBB BBBBBB BBB BBBB BBBBBBBB BB BB B BBBBBB BBBBBB BBBBB. (BBB/B BBB BBBB BBBB...BBB BBB BBB BBBB BB BB B BBBB BB BBB BB? BBBBBBB B BBB B BBBB BBBBBBBB BBB B BBB BBB BBBBB BBBB BBB BBBB BB B BBBBBBBB BB BBBBB BB BB BBB BBBBB BBB BB BBBBB BBBBBBB B BBB BBBBBBB. BBBBBB (BBBBB) BBBB BBBBB BBBBBBB BBBBB BBBB BBBB BBB. 100 BBBBBB BB BBBBB. BBBB BBB BBB BBBBBB BBB BB. BBB BBBB BB BBB BBBBB! BBB BB BBBBBB BBBBB B BBB'B BBBBBBBBB BBBB BBB BBB. (BBBBBB BBBBBBB BB BBBB BBBBB (BBBBBB BBBBB BBBBB BBBBB.)) + + + BBB B BBBBBBBBBBB BBBB BBB BB BBB. BBBBB BBB BBBBB B BBBB BBBBBB BBBBB BBB. BB BBBBBB BBB BBBB B BBB BB BBBBBBBB BBBBBB BBBB BBB B BBBBBB BBBB BBBBBB BBBBBBB BBBB BBBB BBB BBBBBBBB. + + + + + + + + + + + + BBBBB!!!!!!! + + + B BBB BBBB BBBBBB BBBB BBBB BBBB B BBB BBBBB BBB BBBBB B BBBB BBBBBBB BB BB BBBB BBBBBBBBB. B BBBB BBBBBB BBBBBBB BBBB BBBB BBB BBBB. + + BB BB, BB BBBBBB BBBB, (BBBBBB BB BBB BBBB . BBBBB BB BBBB BBBB BB BB BBBB BBBB B BBBB BB BB (BB BBBB BB BBB BBBBBBB BB BBBBBBB. )) BB'BB BBB BBB'B BB BB BBBB BB B BBBB B BBBBB (BB BBBBBB BB BBB B'BB BBBBBBBB BB BBBB BBBB.) + + + B BBBBB B'BB BBB BB BBBB BBB BBB. + + + + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/lazy.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/lazy.html new file mode 100644 index 000000000000..47188f2e09ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/lazy.html @@ -0,0 +1,4 @@ +<pre><code>This is some code + +This is some other code +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/lazy.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/lazy.text new file mode 100644 index 000000000000..2a95de65f626 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/lazy.text @@ -0,0 +1,5 @@ + This is some +code + + This is some + other code diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end.html new file mode 100644 index 000000000000..7a003b286747 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end.html @@ -0,0 +1,2 @@ +<pre><code>test +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end.text new file mode 100644 index 000000000000..b64563f63c10 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end.text @@ -0,0 +1 @@ + test \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end_1.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end_1.html new file mode 100644 index 000000000000..005870eb9378 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end_1.html @@ -0,0 +1,2 @@ +<pre><code>test test +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end_1.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end_1.text new file mode 100644 index 000000000000..65df71e8577d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/no_newline_at_end_1.text @@ -0,0 +1,2 @@ + test +test diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/normal.html new file mode 100644 index 000000000000..0bd2c1f46ae9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/normal.html @@ -0,0 +1,13 @@ +<pre><code>starting code +</code></pre> + +<p>paragraph</p> + +<pre><code>other code +with samples +</code></pre> + +<p>paragraph</p> + +<pre><code> ending code +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/normal.text new file mode 100644 index 000000000000..40ea7023f3ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/normal.text @@ -0,0 +1,10 @@ + starting code + +paragraph + + other code + with samples + +paragraph + + ending code diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/disabled.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/disabled.html new file mode 100644 index 000000000000..2cc34d300f53 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/disabled.html @@ -0,0 +1,2 @@ +<pre><code>x = Class.new +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/disabled.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/disabled.options new file mode 100644 index 000000000000..5688828cfb40 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/disabled.options @@ -0,0 +1,4 @@ +:syntax_highlighter: rouge +:syntax_highlighter_opts: + block: + disable: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/disabled.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/disabled.text new file mode 100644 index 000000000000..0e50b41c8184 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/disabled.text @@ -0,0 +1 @@ + x = Class.new diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/multiple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/multiple.html new file mode 100644 index 000000000000..6ece54320366 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/multiple.html @@ -0,0 +1,11 @@ +<div class="language-ruby highlighter-rouge"><div class="custom-class"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Hello"</span> +</code></pre> +</div></div></div> + +<div class="language-ruby highlighter-rouge"><div class="custom-class"><div class="highlight"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"World"</span> +</code></pre> +</div></div></div> + +<div class="language-php highlighter-rouge"><div class="custom-class"><div class="highlight"><pre class="highlight"><code><span class="nv">$foo</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Bar</span><span class="p">;</span> +</code></pre> +</div></div></div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/multiple.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/multiple.options new file mode 100644 index 000000000000..b910f756b8ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/multiple.options @@ -0,0 +1,4 @@ +:syntax_highlighter: rouge +:syntax_highlighter_opts: + default_lang: ruby + formatter: RougeHTMLFormatters diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/multiple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/multiple.text new file mode 100644 index 000000000000..d1dd283b9f42 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/multiple.text @@ -0,0 +1,11 @@ +~~~ ruby +puts "Hello" +~~~ + +~~~ ruby +puts "World" +~~~ + +~~~ php?start_inline=1 +$foo = new Bar; +~~~ \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/simple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/simple.html new file mode 100644 index 000000000000..1c2259afbace --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/simple.html @@ -0,0 +1,10 @@ +<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span> +</code></pre> +</div></div> +<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;a&gt;</span>href<span class="nt">&lt;/a&gt;</span> +</code></pre> +</div></div> + +<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$foo</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Bar</span><span class="p">;</span> +</code></pre> +</div></div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/simple.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/simple.options new file mode 100644 index 000000000000..f59e0ff816f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/simple.options @@ -0,0 +1,3 @@ +:syntax_highlighter: rouge +:syntax_highlighter_opts: + default_lang: ruby diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/simple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/simple.text new file mode 100644 index 000000000000..6c740e53a98d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/rouge/simple.text @@ -0,0 +1,9 @@ + x = Class.new +^ + <a>href</a> +{: .language-html} + + +~~~ php?start_inline=1 +$foo = new Bar; +~~~ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/tilde_syntax.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/tilde_syntax.html new file mode 100644 index 000000000000..1ddd91e95f08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/tilde_syntax.html @@ -0,0 +1,7 @@ +<pre><code>Here comes some code. +</code></pre> + +<pre><code>~~~~~~~ +code with tildes +~~~~~~~~ +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/tilde_syntax.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/tilde_syntax.text new file mode 100644 index 000000000000..7625a1bdb35c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/tilde_syntax.text @@ -0,0 +1,9 @@ +~~~~~~~~ +Here comes some code. +~~~~~~~~ + +~~~~~~~~~~~~ +~~~~~~~ +code with tildes +~~~~~~~~ +~~~~~~~~~~~~~~~~~~ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/whitespace.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/whitespace.html new file mode 100644 index 000000000000..dcbb40f3ca44 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/whitespace.html @@ -0,0 +1,3 @@ +<pre class="show-whitespaces"><code>This<span class="ws-tab"> </span>is<span class="ws-space">&#8901;</span>some<span class="ws-space-r">&#8901;</span><span class="ws-space-r">&#8901;</span> +<span class="ws-space-l">&#8901;</span><span class="ws-space-l">&#8901;</span><span class="ws-space-l">&#8901;</span><span class="ws-space-l">&#8901;</span>whitespace<span class="ws-space-r">&#8901;</span><span class="ws-space-r">&#8901;</span> +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/whitespace.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/whitespace.text new file mode 100644 index 000000000000..b15c9c9ab6a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/whitespace.text @@ -0,0 +1,3 @@ + This is some + whitespace +{:.show-whitespaces} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_blank_line.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_blank_line.html new file mode 100644 index 000000000000..f7c20b2b1f62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_blank_line.html @@ -0,0 +1,13 @@ +<p>paragraph</p> + +<pre><code>code block + +continued here +</code></pre> + +<p>ended</p> + +<pre><code>next blank line has 4 spaces +</code></pre> + +<p>paragraph</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_blank_line.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_blank_line.text new file mode 100644 index 000000000000..e51dfa53c534 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_blank_line.text @@ -0,0 +1,12 @@ +paragraph + + code block + + continued here + + +ended + + next blank line has 4 spaces + +paragraph diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_eob_marker.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_eob_marker.html new file mode 100644 index 000000000000..cca17a202bf0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_eob_marker.html @@ -0,0 +1,6 @@ +<pre><code>code block + +continued here +</code></pre> +<pre><code>new block here +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_eob_marker.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_eob_marker.text new file mode 100644 index 000000000000..834c768f75d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_eob_marker.text @@ -0,0 +1,5 @@ + code block + + continued here +^ + new block here diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_ial.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_ial.html new file mode 100644 index 000000000000..77085b30d635 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_ial.html @@ -0,0 +1,6 @@ +<pre class="cls"><code>code block + +continued here +</code></pre> +<pre><code>new block here +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_ial.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_ial.text new file mode 100644 index 000000000000..4489f2d9ecec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_ial.text @@ -0,0 +1,5 @@ + code block + + continued here +{:.cls} + new block here diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block.html new file mode 100644 index 000000000000..f5872c308316 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block.html @@ -0,0 +1,24 @@ +<pre><code class="language-ruby">def what? + 42 +end +</code></pre> + +<pre class="class1"><code class="language-ruby">def what? + 42 +end +</code></pre> + +<pre><code class="language-ruby">def what? + 42 +end +</code></pre> + +<pre class="language-python"><code class="language-ruby">def what? + 42 +end +</code></pre> + +<pre class="language-python"><code class="language-ruby">def what? + 42 +end +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options new file mode 100644 index 000000000000..e2e91dbad9f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options @@ -0,0 +1,2 @@ +:syntax_highlighter: null + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block.text new file mode 100644 index 000000000000..07f437e7dcdb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block.text @@ -0,0 +1,33 @@ +~~~ ruby +def what? + 42 +end +~~~ + +~~~ ruby +def what? + 42 +end +~~~ +{:.class1} + +~~~ +def what? + 42 +end +~~~ +{: .language-ruby} + +~~~ ruby +def what? + 42 +end +~~~ +{: .language-python} + +~~~ ruby +def what? + 42 +end +~~~ +{: class="language-python"} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.html new file mode 100644 index 000000000000..2530b1e0fcfe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.html @@ -0,0 +1,8 @@ +<pre><code class="language-asn.1">text +</code></pre> + +<pre><code class="language-asn#w1">text +</code></pre> + +<pre><code class="language-русский">text +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.options new file mode 100644 index 000000000000..871923cabe1a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.options @@ -0,0 +1,2 @@ +:enable_coderay: false + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text new file mode 100644 index 000000000000..60424a0293d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text @@ -0,0 +1,11 @@ +~~~ asn.1 +text +~~~ + +~~~ asn#w1 +text +~~~ + +~~~ русский +text +~~~ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.html new file mode 100644 index 000000000000..aa4b60f29a74 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.html @@ -0,0 +1,3 @@ +<pre><code class="language-act-iii">s1'dim'a'500'm'500'q'500'' +index'j'j+1'j-1'' +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.options new file mode 100644 index 000000000000..871923cabe1a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.options @@ -0,0 +1,2 @@ +:enable_coderay: false + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text new file mode 100644 index 000000000000..423d5b735543 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text @@ -0,0 +1,4 @@ +~~~ act-iii +s1'dim'a'500'm'500'q'500'' +index'j'j+1'j-1'' +~~~ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/error.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/error.html new file mode 100644 index 000000000000..068811c0e1c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/error.html @@ -0,0 +1,7 @@ +<p>_ * _</p> + +<p>— * * *</p> + +<p>_ - *</p> + +<p>———————————————- test</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/error.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/error.text new file mode 100644 index 000000000000..a024710d7bdd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/error.text @@ -0,0 +1,7 @@ +_ * _ + +--- * * * + +_ - * + +---------------------------------------------- test diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/normal.html new file mode 100644 index 000000000000..e74b6e6c1dbb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/normal.html @@ -0,0 +1,19 @@ +<hr /> +<hr /> +<hr /> + +<p>d- -</p> + +<hr /> +<hr /> +<hr /> + +<h2>para</h2> +<p>text</p> + +<hr /> + +<pre><code>- - - +</code></pre> + +<hr class="test" /> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/normal.text new file mode 100644 index 000000000000..986101ab4021 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/normal.text @@ -0,0 +1,20 @@ +*** +* * * +- - - + +d- - + +--- +___ +*** + +para +----------- +text + +* * * + + - - - + +* * * +{:.test} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/sepspaces.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/sepspaces.html new file mode 100644 index 000000000000..dbb86e580a6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/sepspaces.html @@ -0,0 +1,3 @@ +<hr /> +<hr /> +<hr /> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/sepspaces.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/sepspaces.text new file mode 100644 index 000000000000..a5798b29268c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/sepspaces.text @@ -0,0 +1,3 @@ +- - - +* * * +_ _ _ _ _ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/septabs.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/septabs.html new file mode 100644 index 000000000000..dbb86e580a6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/septabs.html @@ -0,0 +1,3 @@ +<hr /> +<hr /> +<hr /> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/septabs.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/septabs.text new file mode 100644 index 000000000000..464fe20cb58e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/07_horizontal_rule/septabs.text @@ -0,0 +1,3 @@ +- - - +* * * +_ _ _ _ _ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/brackets_in_item.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/brackets_in_item.latex new file mode 100644 index 000000000000..e71fde2ab2de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/brackets_in_item.latex @@ -0,0 +1,3 @@ +\begin{itemize} +\item{} {[}and{]} another +\end{itemize} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/brackets_in_item.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/brackets_in_item.text new file mode 100644 index 000000000000..515e3a7dfe2a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/brackets_in_item.text @@ -0,0 +1 @@ +* \[and\] another diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/escaping.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/escaping.html new file mode 100644 index 000000000000..afc795c6f1a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/escaping.html @@ -0,0 +1,17 @@ +<p>I have read the book +1984. It was great +- other say that, too!</p> + +<p>I have read the book +1984. It was great +- other say that, too!</p> + +<p>I have read the book + 1984. It was great.</p> + +<p>I have read the book 1984. + - it was great!</p> + +<p>1984. Was great!</p> + +<p>- This too!</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/escaping.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/escaping.text new file mode 100644 index 000000000000..c3b1c598d09d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/escaping.text @@ -0,0 +1,17 @@ +I have read the book +1984. It was great +- other say that, too! + +I have read the book +1984\. It was great +\- other say that, too! + +I have read the book + 1984. It was great. + +I have read the book 1984. + - it was great! + +1984\. Was great! + +\- This too! diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/item_ial.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/item_ial.html new file mode 100644 index 000000000000..e6dfd3a5da13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/item_ial.html @@ -0,0 +1,10 @@ +<ul> + <li class="cls">IAL at first +continued</li> + <li>another {:.cls}</li> + <li class="cls">IAL at last + code</li> + <li>X + test</li> + <li>X OK</li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/item_ial.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/item_ial.text new file mode 100644 index 000000000000..67bee706a261 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/item_ial.text @@ -0,0 +1,8 @@ +* {:.cls} IAL at first + continued +* another {:.cls} +* {:.cls} IAL at last + code +* {::nomarkdown type="html"}X{:/nomarkdown} + test +* {::nomarkdown type="html"}X{:/nomarkdown} OK diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy.html new file mode 100644 index 000000000000..01a5f9ddbec9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy.html @@ -0,0 +1,39 @@ +<ul> + <li>This is a simple +list item</li> + <li> + <p>Followed by another +list item</p> + </li> + <li> + <p>Followed by</p> + + <p>a para list item +continued here</p> + </li> + <li>and a normal one</li> + <li> + <p>and</p> + + <p>a para +continued here</p> + </li> +</ul> + +<p>para</p> + +<ul> + <li>multi line +list item</li> +</ul> + +<p>para</p> + +<ul> + <li>list item line1 + one line + two lines</li> + <li>list item line2 +one line +two lines</li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy.text new file mode 100644 index 000000000000..f372422a1d20 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy.text @@ -0,0 +1,29 @@ +* This is a simple +list item +* Followed by another +list item + + +* Followed by + + a para list item +continued here +* and a normal one +* and + + a para +continued here + +para + +* multi line +list item + +para + +* list item line1 + one line + two lines +* list item line2 + one line +two lines diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy_and_nested.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy_and_nested.html new file mode 100644 index 000000000000..90c7447efaa1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy_and_nested.html @@ -0,0 +1,9 @@ +<ol> + <li>Root level + * Second level + <ul> + <li>Third level + * Back to second level</li> + </ul> + </li> +</ol> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy_and_nested.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy_and_nested.text new file mode 100644 index 000000000000..97a775584fe5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/lazy_and_nested.text @@ -0,0 +1,4 @@ +1. Root level + * Second level + * Third level + * Back to second level diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_hr.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_hr.html new file mode 100644 index 000000000000..ecf51c76bf62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_hr.html @@ -0,0 +1,9 @@ +<ul> + <li>Starting a list</li> +</ul> + +<hr /> + +<ul> + <li>Starting a new list</li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_hr.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_hr.text new file mode 100644 index 000000000000..c7fcd47b5e3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_hr.text @@ -0,0 +1,5 @@ +* Starting a list + +* * * + +* Starting a new list diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_others.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_others.html new file mode 100644 index 000000000000..672428ed32c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_others.html @@ -0,0 +1,40 @@ +<ul> + <li>list item</li> +</ul> + +<blockquote> + <p>blockquote</p> +</blockquote> + +<p>para +* * * +para + - no list</p> + +<ul> + <li> + <p>item</p> + + <blockquote> + <p>block</p> + </blockquote> + + <h2>header</h2> + </li> + <li> + <p>test</p> + + <pre><code>codeblock +</code></pre> + + <p>test</p> + </li> + <li> + <p>test</p> + + <pre><code>codeblock +</code></pre> + + <p>test</p> + </li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_others.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_others.text new file mode 100644 index 000000000000..f680262cd754 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/list_and_others.text @@ -0,0 +1,26 @@ +* list item + +> blockquote + +para +* * * +para + - no list + ++ item + + > block + + ## header + +* test + + codeblock + + test + +* test + + codeblock + + test diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/mixed.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/mixed.html new file mode 100644 index 000000000000..9bc47e3b85d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/mixed.html @@ -0,0 +1,117 @@ +<p>With tabs/spaces, no paras:</p> + +<ul> + <li>item1</li> + <li>item2</li> + <li>item3</li> +</ul> + +<p>With tabs/spaces, paras:</p> + +<ul> + <li> + <p>item1</p> + </li> + <li> + <p>item2</p> + </li> + <li> + <p>item3</p> + </li> +</ul> + +<p>With tabs/spaces, no paras:</p> + +<ol> + <li>item1</li> + <li>item2</li> + <li>item3</li> +</ol> + +<p>With tabs/spaces, paras:</p> + +<ol> + <li> + <p>item1</p> + </li> + <li> + <p>item2</p> + </li> + <li> + <p>item3</p> + </li> +</ol> + +<p>Nested, without paras:</p> + +<ul> + <li>item1 + <ul> + <li>item2 + <ul> + <li>item3</li> + </ul> + </li> + </ul> + </li> +</ul> + +<p>Nested, with paras:</p> + +<ul> + <li> + <p>item1</p> + + <ul> + <li>item2 + <ul> + <li>item3 (level 3)</li> + </ul> + </li> + </ul> + </li> +</ul> + +<p>Ordered, without paras:</p> + +<ol> + <li>item1</li> + <li>item2 + <ul> + <li>do</li> + <li>it</li> + <li>now</li> + </ul> + </li> + <li>item3</li> +</ol> + +<p>Ordered, with paras:</p> + +<ol> + <li> + <p>item1</p> + </li> + <li> + <p>item2</p> + + <ul> + <li>do</li> + <li>it</li> + <li>now</li> + </ul> + </li> + <li> + <p>item3</p> + </li> +</ol> + +<p>Mixed tabs and spaces:</p> + +<ul> + <li>some text + <ul> + <li>nested</li> + </ul> + </li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/mixed.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/mixed.text new file mode 100644 index 000000000000..22b578df2682 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/mixed.text @@ -0,0 +1,66 @@ +With tabs/spaces, no paras: + +* item1 ++ item2 +- item3 + +With tabs/spaces, paras: + +- item1 + +* item2 + ++ item3 + +With tabs/spaces, no paras: + +1. item1 +20. item2 +3. item3 + +With tabs/spaces, paras: + +1. item1 + +2. item2 + +3. item3 + +Nested, without paras: + +* item1 + * item2 + * item3 + +Nested, with paras: + ++ item1 + + * item2 + * item3 (level 3) + +Ordered, without paras: + +1. item1 +2. item2 + * do + * it + * now +3. item3 + +Ordered, with paras: + +1. item1 + +2. item2 + + * do + * it + * now + +3. item3 + +Mixed tabs and spaces: + +* some text + * nested diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/nested.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/nested.html new file mode 100644 index 000000000000..1921ee9de3e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/nested.html @@ -0,0 +1,17 @@ +<ul> + <li>some item + <ul> + <li>nested</li> + </ul> + </li> + <li>last item</li> +</ul> +<ul> + <li> + <p>some text</p> + + <ul> + <li>nested</li> + </ul> + </li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/nested.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/nested.text new file mode 100644 index 000000000000..c71d864b334e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/nested.text @@ -0,0 +1,7 @@ +* some item + * nested +* last item +^ +* some text + + * nested diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/other_first_element.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/other_first_element.html new file mode 100644 index 000000000000..3f4cd0f8ccb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/other_first_element.html @@ -0,0 +1,39 @@ +<ul> + <li> + <pre><code>This is a code block. +</code></pre> + </li> + <li> + <blockquote> + <p>This is a blockquote.</p> + </blockquote> + </li> + <li> + <h2>A header</h2> + </li> +</ul> +<ul> + <li> + <pre><code>This is a code block. +</code></pre> + </li> + <li> + <blockquote> + <p>This is a blockquote. +continued by some para.</p> + </blockquote> + </li> + <li> + <h1>A header</h1> + <p>a para</p> + </li> +</ul> +<ul> + <li> + <ul> + <li>nested list</li> + <li>other nested item</li> + </ul> + </li> + <li>item 2</li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/other_first_element.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/other_first_element.text new file mode 100644 index 000000000000..321cef6444e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/other_first_element.text @@ -0,0 +1,18 @@ +* + This is a code block. +* > This is a blockquote. +* ## A header +^ +* + This is a code block. + +* > This is a blockquote. + continued by some para. + +* A header + ========= + a para +^ +* * nested list + * other nested item +* item 2 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ol.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ol.html new file mode 100644 index 000000000000..84e5a6ba1d8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ol.html @@ -0,0 +1,19 @@ +<ol> + <li>This is a simple list item</li> + <li> + <p>Followed by another</p> + </li> + <li> + <p>Followed by</p> + + <p>a para list item</p> + </li> + <li>and a normal one</li> + <li> + <p>and</p> + + <p>a para</p> + </li> +</ol> + +<p>para</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ol.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ol.text new file mode 100644 index 000000000000..aaf7dae8ad96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ol.text @@ -0,0 +1,13 @@ +1. This is a simple list item +3. Followed by another + + +10. Followed by + + a para list item +1. and a normal one +2. and + + a para + +para diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ul.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ul.html new file mode 100644 index 000000000000..68db05e539ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ul.html @@ -0,0 +1,48 @@ +<ul> + <li>This is a simple list item</li> + <li> + <p>Followed by another</p> + </li> + <li> + <p>Followed by</p> + + <p>a para list item</p> + </li> + <li>and a normal one</li> + <li> + <p>and</p> + + <p>a para</p> + </li> +</ul> + +<p>para</p> + +<ul> + <li>multi line +list item</li> +</ul> + +<p>para</p> + +<ul> + <li>list item line1 +one line +two lines</li> + <li>list item line2 +one line +two lines</li> +</ul> + +<p>para</p> + +<ul> + <li>list item line3 +one line +two lines</li> + <li>list item line4 + one line + two lines</li> +</ul> + +<p>para</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ul.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ul.text new file mode 100644 index 000000000000..ccd25c35f973 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/simple_ul.text @@ -0,0 +1,36 @@ +* This is a simple list item +* Followed by another + + +* Followed by + + a para list item +* and a normal one +* and + + a para + +para + +* multi line + list item + +para + +* list item line1 + one line + two lines +* list item line2 + one line + two lines + +para + +* list item line3 + one line + two lines +* list item line4 + one line + two lines + +para diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/single_item.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/single_item.html new file mode 100644 index 000000000000..e0794614734a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/single_item.html @@ -0,0 +1,3 @@ +<ul> + <li>single</li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/single_item.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/single_item.text new file mode 100644 index 000000000000..877d36998a0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/single_item.text @@ -0,0 +1 @@ +* single diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/special_cases.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/special_cases.html new file mode 100644 index 000000000000..fbc775ae4e2a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/special_cases.html @@ -0,0 +1,62 @@ +<ul> + <li> + <p>not a para +here</p> + + <blockquote> + <p>blockquote</p> + </blockquote> + </li> + <li> + <p>and not + here</p> + + <blockquote> + <p>blockquote</p> + </blockquote> + </li> + <li> + <p>this is a para</p> + </li> + <li> + <blockquote> + <p>blockquote</p> + </blockquote> + </li> + <li> + <p>this too</p> + </li> +</ul> + +<p>A paragraph + 1. followed not by ol +- followed not by ul</p> + +<p>A compact list:</p> + +<ul> + <li>compact</li> + <li>list</li> + <li>items</li> +</ul> + +<p>A normal list:</p> + +<ul> + <li> + <p>not</p> + </li> + <li> + <p>compact</p> + </li> + <li> + <p>but here</p> + </li> +</ul> + +<p>List item without content:</p> + +<ul> + <li></li> + <li>a</li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/special_cases.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/special_cases.text new file mode 100644 index 000000000000..7406305da9fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/08_list/special_cases.text @@ -0,0 +1,40 @@ +* not a para + here + + > blockquote + +* and not + here + + >blockquote + +* this is a para + +* > blockquote + +* this too + +^ + +A paragraph + 1. followed not by ol +- followed not by ul + +A compact list: + +* compact +* list +* items + +A normal list: + +* not + +* compact + +* but here + +List item without content: + +* +* a diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/comment.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/comment.html new file mode 100644 index 000000000000..8d31bd4e955b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/comment.html @@ -0,0 +1,18 @@ +<!--comment--> + +<p>para1</p> + +<!-- Comment --> + +<p>para2</p> + +<!-- +Blah +Blah +--> +<p>para</p> + +<blockquote> + <p>This is +<!-- a comment --></p> +</blockquote> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/comment.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/comment.text new file mode 100644 index 000000000000..b632bf29bc58 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/comment.text @@ -0,0 +1,15 @@ +<!--comment--> + +para1 + +<!-- Comment --> + +para2 + +<!-- +Blah +Blah +--> para + +> This is +> <!-- a comment --> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/deflists.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/deflists.html new file mode 100644 index 000000000000..587d55afc6d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/deflists.html @@ -0,0 +1,6 @@ +<dl> + <dt><em>text</em></dt> + <dd> + <p>para</p> + </dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/deflists.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/deflists.options new file mode 100644 index 000000000000..a660da25c12f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/deflists.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/deflists.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/deflists.text new file mode 100644 index 000000000000..1e381d1fdb48 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/deflists.text @@ -0,0 +1,6 @@ +<dl> +<dt>*text*</dt> +<dd> +para +</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/tables.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/tables.html new file mode 100644 index 000000000000..e11dc14b353a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/tables.html @@ -0,0 +1,14 @@ +<table class="examples"> +<tr> + <th><em>Usage</em></th> + <th> +Output + </th> +</tr> +<tr> + <td>Some <em>data</em></td> + <td> + <h1 id="some-more">Some more</h1> + </td> +</tr> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/tables.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/tables.options new file mode 100644 index 000000000000..a660da25c12f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/tables.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/tables.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/tables.text new file mode 100644 index 000000000000..c0cf2e7d1a0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/content_model/tables.text @@ -0,0 +1,14 @@ +<table class="examples"> +<tr> + <th markdown="span">*Usage*</th> + <th> +Output + </th> +</tr> +<tr> + <td markdown="span">Some *data*</td> + <td markdown="1"> +# Some more + </td> +</tr> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html5_attributes.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html5_attributes.html new file mode 100644 index 000000000000..743c8224df74 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html5_attributes.html @@ -0,0 +1,15 @@ +<p lang="en" style="nothing" class="">paragraph</p> + +<p lang="en" style="nothing" class="">paragraph</p> + +<p lang="en" style="nothing" class="">paragraph</p> + +<p lang="en" class="" style="nothing">paragraph</p> + +<p class="" lang="en" style="nothing">paragraph</p> + +<p lang="en">paragraph</p> + +<p class="">paragraph</p> + +<p class="">paragraph</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html5_attributes.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html5_attributes.text new file mode 100644 index 000000000000..44a060d32cfd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html5_attributes.text @@ -0,0 +1,15 @@ +<p lang="en" style='nothing' class>paragraph</p> + +<p lang='en' style="nothing" class>paragraph</p> + +<p lang='en' style="nothing" class >paragraph</p> + +<p lang='en' class style="nothing">paragraph</p> + +<p class lang='en' style="nothing">paragraph</p> + +<p lang=en>paragraph</p> + +<p cLaSs>paragraph</p> + +<p class >paragraph</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_after_block.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_after_block.html new file mode 100644 index 000000000000..f51c75bbc63f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_after_block.html @@ -0,0 +1,7 @@ +<p>Para</p> +<div class="test">division</div> + +<blockquote> + <p>Quote</p> +</blockquote> +<div class="test">division</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_after_block.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_after_block.text new file mode 100644 index 000000000000..cdcbff6cbb48 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_after_block.text @@ -0,0 +1,5 @@ +Para +<div class="test">division</div> + +> Quote +<div class="test">division</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_codeblocks.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_codeblocks.html new file mode 100644 index 000000000000..93d695aa1ea2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_codeblocks.html @@ -0,0 +1,15 @@ +<p>para</p> + +<pre><code>codeblock +</code></pre> + +<div> + <p>test</p> +</div> + +<pre><code>&lt;p&gt;codeblock&lt;/p&gt; +</code></pre> + +<div> + <p>test</p> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_codeblocks.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_codeblocks.options new file mode 100644 index 000000000000..a660da25c12f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_codeblocks.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_codeblocks.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_codeblocks.text new file mode 100644 index 000000000000..a3cfda74fd86 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_codeblocks.text @@ -0,0 +1,13 @@ +para + + codeblock + +<div> + test +</div> + + <p>codeblock</p> + +<div> + test +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_headers.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_headers.html new file mode 100644 index 000000000000..65cb7e2b10b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_headers.html @@ -0,0 +1,5 @@ +<h1>header</h1> + +<div> +====== +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_headers.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_headers.text new file mode 100644 index 000000000000..64dc477eb873 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_and_headers.text @@ -0,0 +1,6 @@ +header +====== + +<div> +====== +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/code.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/code.html new file mode 100644 index 000000000000..f4b322104289 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/code.html @@ -0,0 +1,10 @@ +<p>This is a <code>code span with &lt;entities&gt; that should be preserved</code>. +This is a <code>simple code</code> span.</p> + +<p>Some <code>&lt;</code></p> + +<pre><code>Some very important &lt; thing +</code></pre> + +<pre><code>Some code&lt;&lt; +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/code.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/code.text new file mode 100644 index 000000000000..fda7db546769 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/code.text @@ -0,0 +1,9 @@ +This is a <code>code span <b>with</b> &lt;entities&gt; that should be preserved</code>. +This is a <code>simple code</code> span. + +<p>Some <code>&lt;</code></p> + +<pre>Some very important <b>&lt;</b> thing</pre> + +<pre><code>Some code<span>&lt;</span>&lt; +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/comment.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/comment.html new file mode 100644 index 000000000000..dacd437371ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/comment.html @@ -0,0 +1,7 @@ +<div> + <!--comment--> + <!-- +Blah +Blah +--> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/comment.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/comment.text new file mode 100644 index 000000000000..1788630cdb07 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/comment.text @@ -0,0 +1,8 @@ +<div> + <!--comment--> + + <!-- +Blah +Blah +--> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/emphasis.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/emphasis.html new file mode 100644 index 000000000000..e4389c069fce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/emphasis.html @@ -0,0 +1,6 @@ +<p>This is <em>sized<strong>hallo</strong></em>.</p> + +<p>This is <strong>strong<em>italic</em>, yes!</strong>.</p> + +<p>This is <em> not</em> converted, as <em>is +</em> this.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/emphasis.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/emphasis.text new file mode 100644 index 000000000000..7c75930c1343 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/emphasis.text @@ -0,0 +1,6 @@ +This is <em>sized<strong>hallo</strong></em>. + +This is <b>strong<i>italic</i>, yes!</b>. + +This is <em> not</em> converted, as <em>is +</em> this. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/entity.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/entity.html new file mode 100644 index 000000000000..5c80ce6bf350 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/entity.html @@ -0,0 +1 @@ +<p>This is *raw* HTML text containing &lt; entities!</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/entity.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/entity.text new file mode 100644 index 000000000000..5c80ce6bf350 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/entity.text @@ -0,0 +1 @@ +<p>This is *raw* HTML text containing &lt; entities!</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/header.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/header.html new file mode 100644 index 000000000000..aebb20657f9b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/header.html @@ -0,0 +1,6 @@ +<h1 id="some-headerhere">Some <em class="cls">header</em>here!</h1> +<h2 id="test">hallo</h2> +<h3 id="hallo">hallo</h3> +<h4 id="hallo-1">hallo</h4> +<h5 id="hallo-2">hallo</h5> +<h6 id="hallo-3">hallo</h6> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/header.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/header.options new file mode 100644 index 000000000000..987b4d9931da --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/header.options @@ -0,0 +1,2 @@ +:auto_ids: true +:html_to_native: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/header.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/header.text new file mode 100644 index 000000000000..27eed3b07a51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/header.text @@ -0,0 +1,6 @@ +<h1>Some <em class='cls'>header</em>here!</h1> +<h2 id="test">hallo</h2> +<h3>hallo</h3> +<h4>hallo</h4> +<h5>hallo</h5> +<h6>hallo</h6> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_dl.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_dl.html new file mode 100644 index 000000000000..6eaccfe39255 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_dl.html @@ -0,0 +1,8 @@ +<dl> + <dt>kram</dt> + <dd>down</dd> + <dt>kram</dt> + <dd>down</dd> + <dt>kram</dt> + <dd>down</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_dl.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_dl.text new file mode 100644 index 000000000000..6eaccfe39255 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_dl.text @@ -0,0 +1,8 @@ +<dl> + <dt>kram</dt> + <dd>down</dd> + <dt>kram</dt> + <dd>down</dd> + <dt>kram</dt> + <dd>down</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ol.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ol.html new file mode 100644 index 000000000000..eeebdfbe064a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ol.html @@ -0,0 +1,15 @@ +<ol> + <li>This is a simple list item</li> + <li> + <p>Followed by another</p> + </li> + <li> + <p>Followed by</p> + <p>a para list item</p> + </li> + <li>and a normal one</li> + <li> + <p>and</p> + <p>a para</p> + </li> +</ol> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ol.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ol.text new file mode 100644 index 000000000000..41246dfbbde1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ol.text @@ -0,0 +1,17 @@ +<ol> + <li>This is a simple list item</li> + <li> + <p>Followed by another</p> + </li> + <li> + <p>Followed by</p> + + <p>a para list item</p> + </li> + <li>and a normal one</li> + <li> + <p>and</p> + + <p>a para</p> + </li> +</ol> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ul.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ul.html new file mode 100644 index 000000000000..c9b38d082cc0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ul.html @@ -0,0 +1,19 @@ +<ul> + <li>This is a simple list item</li> + <li> + <p>Followed by another</p> + </li> + <li> + <p>Followed by</p> + <p>a para list item</p> + </li> + <li>and a normal one</li> + <li> + <p>and</p> + <p>a para</p> + </li> +</ul> + +<ul> + <li>multi line list item</li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ul.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ul.text new file mode 100644 index 000000000000..5a2d68e7b3b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/list_ul.text @@ -0,0 +1,22 @@ +<ul> + <li>This is a simple list item</li> + <li> + <p>Followed by another</p> + </li> + <li> + <p>Followed by</p> + + <p>a para list item</p> + </li> + <li>and a normal one</li> + <li> + <p>and</p> + + <p>a para</p> + </li> +</ul> + +<ul> + <li>multi line +list item</li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/options new file mode 100644 index 000000000000..63936b9955ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/options @@ -0,0 +1 @@ +:html_to_native: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/paragraph.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/paragraph.html new file mode 100644 index 000000000000..a276b1ca1585 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/paragraph.html @@ -0,0 +1,3 @@ +<p>Some text here<span> and </span>end</p> + +<p>Some other text here</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/paragraph.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/paragraph.text new file mode 100644 index 000000000000..b10035cd86f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/paragraph.text @@ -0,0 +1,4 @@ +<p>Some text here<span> and </span>end +</p> + +<p>Some other text here</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_normal.html new file mode 100644 index 000000000000..bdd79ee7cb45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_normal.html @@ -0,0 +1,12 @@ +<table class="examples"> +<tr> + <th>Usage</th> + <th>Other</th> +</tr> +<tr> + <td>Some *data*</td> + <td> + <p>Some more</p> + </td> +</tr> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_normal.text new file mode 100644 index 000000000000..bdd79ee7cb45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_normal.text @@ -0,0 +1,12 @@ +<table class="examples"> +<tr> + <th>Usage</th> + <th>Other</th> +</tr> +<tr> + <td>Some *data*</td> + <td> + <p>Some more</p> + </td> +</tr> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_simple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_simple.html new file mode 100644 index 000000000000..88d9e6c3fd89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_simple.html @@ -0,0 +1,61 @@ +<table class="examples"> + <tbody> + <tr> + <td>Usage</td> + <td>Output</td> + </tr> + <tr> + <td>Some *data*</td> + <td>Some more</td> + </tr> + </tbody> +</table> + +<table class="examples"> + <thead> + <tr> + <th>Usage</th> + <th>Output</th> + </tr> + </thead> + <tbody> + <tr> + <td>Some *data*</td> + <td>Some more</td> + </tr> + </tbody> + <tfoot> + <tr> + <td>foot</td> + <td>locker</td> + </tr> + </tfoot> +</table> + +<table class="examples"> + <tbody> + <tr> + <td style="text-align: left">Usage</td> + <td style="width: 10em">Output</td> + </tr> + <tr> + <td style="text-align: left">Some *data*</td> + <td>Some more</td> + </tr> + </tbody> +</table> + +<table class="examples"> +<tr> + <th>Usage</th> + <th> +Output + </th> +</tr> +<tr> + <td>Some *data*</td> + <td> +Some more + </td> +</tr> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_simple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_simple.text new file mode 100644 index 000000000000..ae7852b1f5b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/table_simple.text @@ -0,0 +1,71 @@ +<table class="examples"> +<tr> + <td>Usage</td> + <td> +Output + </td> +</tr> +<tr> + <td>Some *data*</td> + <td> +Some more + </td> +</tr> +</table> + +<table class="examples"> +<thead> +<tr> + <th>Usage</th> + <th> +Output + </th> +</tr> +</thead> +<tbody> +<tr> + <td>Some *data*</td> + <td> +Some more + </td> +</tr> +</tbody> +<tfoot> +<tr> + <td>foot</td> + <td> +locker + </td> +</tr> +</tfoot> +</table> + +<table class="examples"> +<tr> + <td style="text-align: left">Usage</td> + <td style="width: 10em"> +Output + </td> +</tr> +<tr> + <td style="text-align: left">Some *data*</td> + <td> +Some more + </td> +</tr> +</table> + +<table class="examples"> +<tr> + <th>Usage</th> + <th> +Output + </th> +</tr> +<tr> + <td>Some *data*</td> + <td> +Some more + </td> +</tr> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/typography.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/typography.html new file mode 100644 index 000000000000..244396505085 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/typography.html @@ -0,0 +1 @@ +<p>This is … something “to remember”!</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/typography.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/typography.text new file mode 100644 index 000000000000..ee33c5cee966 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/html_to_native/typography.text @@ -0,0 +1 @@ +<p>This is &hellip; something &ldquo;to remember&rdquo;!</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_1.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_1.html new file mode 100644 index 000000000000..77e0d78a0b9e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_1.html @@ -0,0 +1,5 @@ +<p>para</p> + +<p>&lt;/div&gt;</p> + +<p>para</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_1.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_1.text new file mode 100644 index 000000000000..f2fc834a3ead --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_1.text @@ -0,0 +1,5 @@ +para + +</div> + +para diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_2.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_2.html new file mode 100644 index 000000000000..b5da12fe7f7d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_2.html @@ -0,0 +1,5 @@ +<p>para</p> + +<hr /> + +<p>para</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_2.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_2.text new file mode 100644 index 000000000000..675c94f680a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/invalid_html_2.text @@ -0,0 +1,5 @@ +para + +<hr> + +para diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/markdown_attr.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/markdown_attr.html new file mode 100644 index 000000000000..930b8f41c1ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/markdown_attr.html @@ -0,0 +1,38 @@ +<div> + <p><em>para</em></p> +</div> + +<div> +<em>para</em> +</div> + +<div> + <p><em>para</em></p> +</div> + +<div> +*para* +</div> + +<p> + <p><em>para</em></p> +</p> + +<p> +<em>para</em> +</p> + +<p> +<em>para</em> +</p> + +<p> +*para* +</p> + +<dl> + <dt><em>emphasize</em></dt> + <dd> + <p>para</p> + </dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/markdown_attr.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/markdown_attr.text new file mode 100644 index 000000000000..12e5aee65cbe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/markdown_attr.text @@ -0,0 +1,38 @@ +<div markdown="block"> +*para* +</div> + +<div markdown="span"> +*para* +</div> + +<div markdown="1"> +*para* +</div> + +<div markdown="0"> +*para* +</div> + +<p markdown="block"> +*para* +</p> + +<p markdown="span"> +*para* +</p> + +<p markdown="1"> +*para* +</p> + +<p markdown="0"> +*para* +</p> + +<dl> + <dt markdown="1">*emphasize*</dt> + <dd markdown="1"> +para +</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/not_parsed.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/not_parsed.html new file mode 100644 index 000000000000..90bda0344217 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/not_parsed.html @@ -0,0 +1,24 @@ +<div> +This is some text +</div> + +<div><div> +This is some text +</div></div> + +<div> +&lt;/p&gt; +</div> + +<div> +<p><a href="/">Foo</a></p> +</div> + +<p>This is some +text</p> + +<p><a href="http://example.com">http://example.com</a></p> + +<div> +&lt;http://example.com&gt; +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/not_parsed.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/not_parsed.text new file mode 100644 index 000000000000..1d1c71ca13a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/not_parsed.text @@ -0,0 +1,24 @@ +<div> +This is some text +</div> + +<div><div> +This is some text +</div></div> + +<div> +</p> +</div> + +<div> +<p><a href="/">Foo</a></p> +</div> + +<p>This is some +text</p> + +<http://example.com> + +<div> +<http://example.com> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.html new file mode 100644 index 000000000000..860f9b2fb4e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.html @@ -0,0 +1,35 @@ +<p>baz { |qux| quux }</p> + +<p>This is some para. +<script type="javascript"> +This *text* must not be converted. + </script></p> + +<script>Not *parsed* here</script> + +<script>*not*</script> +<p><em>parsed</em> +This too +</p> + +<script>*not*<p>*parsed* +This too +</p></script> + +<script>something<p>*not*</p></script> + +<script></script> + +<script> +This should be output +<p> *as* is +</p> and nothing should be done +about it +</not> +</p> +</script> + +<p><a href="http://example.com">http://example.com</a></p> + +<style> body > * { background-color: Red; } </style> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.htmlinput b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.htmlinput new file mode 100644 index 000000000000..22b9ea5c1b04 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.htmlinput @@ -0,0 +1,34 @@ +<p>baz { |qux| quux }</p> + +<p>This is some para. +<script type="javascript"> +This *text* must not be converted. + </SCRIPT></p> + +<script>Not *parsed* here</script> + +<sCRIpt>*not*</script> +<p><em>parsed</em> +This too +</p> + +<script>*not*<p>*parsed* +This too +</p></script> + +<sCRIpt>something<p>*not*</p></scrIPt> + +<script></script> + +<script> +This should be output +<p> *as* is +</p> and nothing should be done +about it +</not> +</p> +</script> + +<p><a href="http://example.com">http://example.com</a></p> + +<style> body > * { background-color: Red; } </style> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.options new file mode 100644 index 000000000000..a660da25c12f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.text new file mode 100644 index 000000000000..e0617c416968 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_raw.text @@ -0,0 +1,33 @@ +<p>baz { |qux| quux }</p> + +This is some para. +<script type="javascript"> +This *text* must not be converted. + </SCRIPT> + +<script>Not *parsed* here</script> + +<script>*not*</script><p>*parsed* +This too +</p> + +<script>*not*<p>*parsed* +This too +</p></script> + +<script>something<p>*not*</p></script> + +<script></script> + +<script> +This should be output +<p> *as* is +</p> and nothing should be done +about it +</not> +</p> +</script> + +<http://example.com> + +<style> body > * { background-color: Red; } </style> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.html new file mode 100644 index 000000000000..2a6191fb489e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.html @@ -0,0 +1,12 @@ +<p>This <em>text +should</em> be parsed +as span +</p> + +<p>This produces `</p> +<p>` an unwanted result.&lt;/p&gt;</p> + +<p>This <em>text</em> too</p> +<p> +some text +</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.htmlinput b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.htmlinput new file mode 100644 index 000000000000..4199b8b2f324 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.htmlinput @@ -0,0 +1,12 @@ +<P>This <EM>text +should</em> be parsed +as span +</p> + +<p>This produces `</p> +<p>` an unwanted result.&lt;/p&gt;</p> + +<p>This <em>text</EM> too</P> +<p> +some text +</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.options new file mode 100644 index 000000000000..a660da25c12f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.text new file mode 100644 index 000000000000..d07cf6d88392 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_as_span.text @@ -0,0 +1,9 @@ +<p>This *text +should* be parsed +as span +</P> + +<p>This produces `</p>` an unwanted result.</p> + +<p>This *text* too</p><p> +some text diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_block_html.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_block_html.html new file mode 100644 index 000000000000..8de78c049bcc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_block_html.html @@ -0,0 +1,21 @@ +<div> + <p>test</p> +</div> + +<div> + <pre><code>test +</code></pre> + <div> + <pre><code>test +</code></pre> + </div> +</div> + +<div> + <pre><code>code block with &lt;/div&gt; +</code></pre> +</div> + +<div> + <p>No matching end tag</p> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_block_html.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_block_html.options new file mode 100644 index 000000000000..a660da25c12f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_block_html.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_block_html.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_block_html.text new file mode 100644 index 000000000000..b8b18453e81f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/parse_block_html.text @@ -0,0 +1,17 @@ +<DIV> + test +</diV> + +<div> + test + <div> + test + </div> +</div> + +<div> + code block with </div> +</div> + +<div> +No matching end tag diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/processing_instruction.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/processing_instruction.html new file mode 100644 index 000000000000..939b996bd5d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/processing_instruction.html @@ -0,0 +1,12 @@ +<p>&lt;?xml version=”1.0”?&gt;</p> + +<p>para</p> + +<p>&lt;? test ?&gt; para</p> + +<p>other</p> + +<p>&lt;? +multiline <em>text</em> +is allowed +?&gt;</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/processing_instruction.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/processing_instruction.text new file mode 100644 index 000000000000..fcb866ffa064 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/processing_instruction.text @@ -0,0 +1,12 @@ +<?xml version="1.0"?> + +para + +<? test ?> para + +other + +<? +multiline *text* +is allowed +?> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/simple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/simple.html new file mode 100644 index 000000000000..0d926c5d32e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/simple.html @@ -0,0 +1,60 @@ +<div> + <p>test</p> +</div> + +<p> +para2 +</p> + +<div id="test"> + <p>tes</p> + + <p>test +weiter +</p> +</div> + +<p>para4</p> + +<div> + <div> + <div> + <p>foo</p> + </div> + <div style="&nbsp;"></div> + </div> + <div> + <p>bar </p> + </div> +</div> + +<p>para5</p> + +<div> + <p>id</p> +</div> +<p>test</p> + +<div> + <p>hallo</p> +</div> +<div> + <p>hallo</p> +</div> + +<p>para6</p> + +<div> + <div class="clear"></div> + <p>Another para.</p> +</div> + +<p><em>Test</em></p> + +<p><em>Test</em></p> + +<p><em>Test +</em> +</p> + +<iframe></iframe> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/simple.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/simple.options new file mode 100644 index 000000000000..a660da25c12f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/simple.options @@ -0,0 +1 @@ +:parse_block_html: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/simple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/simple.text new file mode 100644 index 000000000000..a2ffe25ebd94 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/simple.text @@ -0,0 +1,55 @@ + <div> +test +</div> + +<p> +para2 +</p> + +<div id='test'> + <p>tes</p> + + <p>test +weiter +</p> +</div> + +para4 + +<div> +<div> +<div> +foo +</div> + <div style="&nbsp;"></div> +</div> +<div>bar&nbsp; +</div> +</div> + +para5 + +<div>id +</div> test + +<div> +hallo +</div> <div> +hallo +</div> + +para6 + +<div><DiV cLASs="clear"></dIv> +Another para. +</div> + +<em>Test</em> + +<p><em>Test</em></p> + +<p><em>Test +</em> +</p> + +<iframe></iframe> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/standalone_image_in_div.htmlinput b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/standalone_image_in_div.htmlinput new file mode 100644 index 000000000000..72ff453912dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/standalone_image_in_div.htmlinput @@ -0,0 +1,7 @@ +<div class="example-1"> + <img src="src.png" alt="inside" /> +</div> + +<div class="example-2"> + <a href="website.html">text</a> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/standalone_image_in_div.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/standalone_image_in_div.text new file mode 100644 index 000000000000..7f0d12cfd7f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/standalone_image_in_div.text @@ -0,0 +1,8 @@ +<div class="example-1" markdown="1"> +![inside](src.png) +</div> + +<div class="example-2" markdown="1"> +[text](website.html) +</div> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/table.kramdown b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/table.kramdown new file mode 100644 index 000000000000..f8d6802e903f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/table.kramdown @@ -0,0 +1,8 @@ +<table> +<tr> +<th>test</th> +<th></th> +<td></td> +</tr> +</table> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/table.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/table.text new file mode 100644 index 000000000000..32e01da5a503 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/table.text @@ -0,0 +1,7 @@ +<table> +<tr> +<th>test</th> +<th></th> +<td></td> +</tr> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/textarea.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/textarea.html new file mode 100644 index 000000000000..6f5693edea05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/textarea.html @@ -0,0 +1,8 @@ +<p>This is a <textarea>inline</textarea></p> + +<textarea>This +is + +some +text +</textarea> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/textarea.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/textarea.text new file mode 100644 index 000000000000..a240f5c48c71 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/textarea.text @@ -0,0 +1,8 @@ +This is a <textarea>inline</textarea> + +<textarea>This +is + +some +text +</textarea> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/xml.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/xml.html new file mode 100644 index 000000000000..d941bc098f66 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/xml.html @@ -0,0 +1,8 @@ +<webgen:block name="test" /> + +<some:url name:spac="hallo">doit</some:url> + +<SoMe:UrL NamE:SpAC="test">doit</SoMe:UrL> + +<SoMe>doit&lt;/some&gt; +</SoMe> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/xml.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/xml.text new file mode 100644 index 000000000000..6427fae321d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/09_html/xml.text @@ -0,0 +1,7 @@ +<webgen:block name="test" /> + +<some:url name:spac='hallo'>doit</some:url> + +<SoMe:UrL NamE:SpAC='test'>doit</SoMe:UrL> + +<SoMe>doit</some> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/10_ald/simple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/10_ald/simple.html new file mode 100644 index 000000000000..74b03d58f4ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/10_ald/simple.html @@ -0,0 +1,2 @@ +<p>Some paragraph</p> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/10_ald/simple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/10_ald/simple.text new file mode 100644 index 000000000000..f58768a37f54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/10_ald/simple.text @@ -0,0 +1,8 @@ +Some paragraph + +{:id: ref1} +{:id: .class1} + {:id: #id} + {:id: key="value"} + {:id: .class2 .class3 ref2 #id-with key="value" key='value' key='dfsd\}' } +{:test: k ey=value} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/auto_id_and_ial.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/auto_id_and_ial.html new file mode 100644 index 000000000000..9857a0380fd5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/auto_id_and_ial.html @@ -0,0 +1 @@ +<h2 id="myid" class="cls">A header</h2> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/auto_id_and_ial.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/auto_id_and_ial.options new file mode 100644 index 000000000000..8776b5524dfb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/auto_id_and_ial.options @@ -0,0 +1 @@ +:auto_ids: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/auto_id_and_ial.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/auto_id_and_ial.text new file mode 100644 index 000000000000..f521fb0fc211 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/auto_id_and_ial.text @@ -0,0 +1,2 @@ +## A header +{:#myid .cls} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/nested.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/nested.html new file mode 100644 index 000000000000..84cc368d3003 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/nested.html @@ -0,0 +1,11 @@ +<div class="cls" id="id"> +test +</div> + +<div class="cls" id="id"> + <p>test</p> +</div> + +<blockquote class="cls" id="id"> + <p>para</p> +</blockquote> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/nested.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/nested.text new file mode 100644 index 000000000000..827645cc9258 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/nested.text @@ -0,0 +1,15 @@ +{:.cls} +<div> +test +</div> +{:#id} + +{:.cls} +<div markdown="1"> +test +</div> +{:#id} + +{:.cls} +> para +{:#id} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/simple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/simple.html new file mode 100644 index 000000000000..1086f0cfc109 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/simple.html @@ -0,0 +1,29 @@ +<p key1="val&quot;" key2="val'" class="other-class myclass class -class" id="other" key="val">Some paragraph.</p> + +<p class="cls1 cls2" id="id">Some paragraph.</p> + +<blockquote id="id" class="class"> + <p>quote</p> +</blockquote> + +<ul key="val"> + <li>list</li> +</ul> + +<pre id="other"><code>code block +</code></pre> + +<pre><code>other code block +</code></pre> + +<h2 id="myid">A header</h2> + +<p class="cls">Some paragraph here</p> + +<p class="cls1 cls2">Some paragraph here</p> + +<p class="cls">Paragraph</p> +<p>Paragraph</p> + +<h1 class="class" id="other">Another header</h1> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/simple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/simple.text new file mode 100644 index 000000000000..b97eef3fbd57 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/11_ial/simple.text @@ -0,0 +1,41 @@ +Some paragraph. +{:.class .-class id key="val"} + +Some paragraph. +{:.cls1#id.cls2} + +> quote +{: #id} + {: .class} + +* list +{: key="val"} + + code block +{: #other} + + other code block + +## A header +{:#myid} + +{:.cls} +Some paragraph here + +{:.cls1} +{:.cls2} +Some paragraph here + +Paragraph +{:.cls} +Paragraph + +Another header +============== +{: .class #other} + +{:id: #id key="valo"} +{:id: #other .myclass other} +{:other: key1="val\"" - ig.nored as_is#this key2='val\'' .other-class} + +{:.invalid} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/comment.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/comment.html new file mode 100644 index 000000000000..20b4c662c2bd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/comment.html @@ -0,0 +1,8 @@ +<p>This is a simple paragraph.</p> + +<!-- This is a comment {:/}which is {:/comment} ignored. --> + +<p>And another paragraph</p> + +<p>{::comment} +Another paragraph</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/comment.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/comment.text new file mode 100644 index 000000000000..2dfc91971214 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/comment.text @@ -0,0 +1,12 @@ +This is a simple paragraph. + +{::comment} +This is a comment {:/}which is {:/comment} ignored. +{:/comment} + +And another paragraph + +{::comment this='is' .ignore /} + +{::comment} +Another paragraph diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/ignored.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/ignored.html new file mode 100644 index 000000000000..17aae5cd5abd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/ignored.html @@ -0,0 +1,8 @@ +<p>paragraph</p> + +<p>{::something} +anotherthing +{:/something}</p> + +<p>{::something/} +paragraph</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/ignored.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/ignored.text new file mode 100644 index 000000000000..ae94a8fe36b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/ignored.text @@ -0,0 +1,8 @@ +paragraph + +{::something} +anotherthing +{:/something} + +{::something/} +paragraph diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.html new file mode 100644 index 000000000000..7fe58d504a12 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.html @@ -0,0 +1,10 @@ +<p>This is a simple paragraph.</p> + +This *is* not processed + +<p>And another paragraph</p> + +<em>bold</em> + +<p>{::nomarkdown} +Another paragraph</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.kramdown b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.kramdown new file mode 100644 index 000000000000..2cee51226000 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.kramdown @@ -0,0 +1,20 @@ +This is a simple paragraph. + +{::nomarkdown} +This *is* not processed +{:/} + +And another paragraph + +{::nomarkdown type="html"} +<em>bold</em> +{:/} + +{::nomarkdown type="latex"} +\begin{itemize} +\item[Yes] YESSSS! +\end{itemize} +{:/} + +\{::nomarkdown} Another paragraph + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.latex new file mode 100644 index 000000000000..5af0263cdcfa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.latex @@ -0,0 +1,13 @@ +This is a simple paragraph. + +This *is* not processed + +And another paragraph + +\begin{itemize} +\item[Yes] YESSSS! +\end{itemize} + +\{::nomarkdown\} +Another paragraph + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.text new file mode 100644 index 000000000000..43d441dfce83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/nomarkdown.text @@ -0,0 +1,21 @@ +This is a simple paragraph. + +{::nomarkdown} +This *is* not processed + {:/nomarkdown} + +And another paragraph + +{::nomarkdown this='is' .ignore /} + +{::nomarkdown type='html'} +<em>bold</em> +{:/} +{::nomarkdown type="latex"} +\begin{itemize} +\item[Yes] YESSSS! +\end{itemize} +{:/} + +{::nomarkdown} +Another paragraph diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options.html new file mode 100644 index 000000000000..364a77a5c57d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options.html @@ -0,0 +1,21 @@ +<h1>No header id</h1> + +<h1>without header id</h1> + +<div> +some <span>*para*</span> +</div> + +<div> + <p>some <span><em>para</em></span></p> +</div> + +<p>Some text<sup id="fnref:ab" role="doc-noteref"><a href="#fn:ab" class="footnote" rel="footnote">10</a></sup>.</p> + +<div class="footnotes" role="doc-endnotes"> + <ol start="10"> + <li id="fn:ab" role="doc-endnote"> + <p>Some text. <a href="#fnref:ab" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options.text new file mode 100644 index 000000000000..b63f34b52a28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options.text @@ -0,0 +1,23 @@ +# No header id + +{::options unusedvar="val" /} + +# without header id + +<div> +some <span>*para*</span> +</div> + +{::options parse_block_html="true" parse_span_html="true" /} + +<div> +some <span>*para*</span> +</div> + +{::options footnote_nr="10" /} + +Some text[^ab]. + +[^ab]: Some text. + +{::options template="/etc/passwd" /} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options2.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options2.html new file mode 100644 index 000000000000..afe4e13e0deb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options2.html @@ -0,0 +1,10 @@ + +<p>Some text<sup id="fnref:ab" role="doc-noteref"><a href="#fn:ab" class="footnote" rel="footnote">1</a></sup>.</p> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:ab" role="doc-endnote"> + <p>Some text. <a href="#fnref:ab" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options2.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options2.text new file mode 100644 index 000000000000..78abfbeeacab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options2.text @@ -0,0 +1,5 @@ +{::options footnote_nr="da10" /} + +Some text[^ab]. + +[^ab]: Some text. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options3.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options3.html new file mode 100644 index 000000000000..d5a5ad6b5899 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options3.html @@ -0,0 +1,8 @@ +<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span> +</code></pre> +</div></div> + +<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span> +</code></pre> +</div></div> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options3.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options3.text new file mode 100644 index 000000000000..f37839b2b988 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/12_extension/options3.text @@ -0,0 +1,7 @@ + x = Class.new +{: .language-ruby} + +{::options syntax_highlighter_opts="{default_lang: ruby\}" /} + + x = Class.new + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/auto_ids.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/auto_ids.html new file mode 100644 index 000000000000..398628ab6066 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/auto_ids.html @@ -0,0 +1,15 @@ +<dl> + <dt id="item">item</dt> + <dd>def</dd> + <dt id="item2">item2</dt> + <dd>def</dd> +</dl> + +<dl> + <dt id="prefix-item">item</dt> + <dd>def</dd> + <dt id="prefix-item2">item2</dt> + <dd>def</dd> + <dt id="id">item3</dt> + <dd>def</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/auto_ids.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/auto_ids.text new file mode 100644 index 000000000000..f1797a746fee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/auto_ids.text @@ -0,0 +1,18 @@ +{:auto_ids} +item +: def + +item2 +: def + +^ + +{:auto_ids-prefix-} +item +: def + +item2 +: def + +{:#id} item3 +: def diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/definition_at_beginning.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/definition_at_beginning.html new file mode 100644 index 000000000000..7c5cc04831a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/definition_at_beginning.html @@ -0,0 +1 @@ +<p>: no definition</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/definition_at_beginning.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/definition_at_beginning.text new file mode 100644 index 000000000000..cd3671b9e4b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/definition_at_beginning.text @@ -0,0 +1 @@ +: no definition diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/deflist_ial.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/deflist_ial.html new file mode 100644 index 000000000000..3090b1ef137e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/deflist_ial.html @@ -0,0 +1,4 @@ +<dl class="dl-horizontal dl-other"> + <dt>item</dt> + <dd>definition</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/deflist_ial.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/deflist_ial.text new file mode 100644 index 000000000000..587c3b07bf38 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/deflist_ial.text @@ -0,0 +1,4 @@ +{:.dl-horizontal} +item +: definition +{:.dl-other} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/item_ial.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/item_ial.html new file mode 100644 index 000000000000..0ed1197f8e65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/item_ial.html @@ -0,0 +1,17 @@ +<dl> + <dt>item</dt> + <dd class="cls">definition +continued</dd> + <dd>another {:.cls}</dd> + <dd class="class"> + <pre><code>code +</code></pre> + </dd> + <dd class="cls">IAL at last + no code bc of text</dd> + <dt class="class">term</dt> + <dd>definition</dd> + <dt class="class1">term1</dt> + <dt class="class2">term2</dt> + <dd>definition</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/item_ial.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/item_ial.text new file mode 100644 index 000000000000..2058d7497bc4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/item_ial.text @@ -0,0 +1,16 @@ +item +: {:.cls} definition + continued +: another {:.cls} +: {:.class} + code +: {:.cls} IAL at last + no code bc of text + + +{:.class} term +: definition + +{:.class1} term1 +{:.class2} term2 +: definition diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/multiple_terms.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/multiple_terms.html new file mode 100644 index 000000000000..e2e089b37de3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/multiple_terms.html @@ -0,0 +1,13 @@ +<dl> + <dt>kram</dt> + <dt><em>down</em></dt> + <dt>now</dt> + <dd>definition 1</dd> + <dd>definition 2</dd> + <dd> + <p>definition 3</p> + </dd> + <dd> + <p>definition 4</p> + </dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/multiple_terms.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/multiple_terms.text new file mode 100644 index 000000000000..b834258b7a00 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/multiple_terms.text @@ -0,0 +1,10 @@ +kram +*down* +now +: definition 1 +: definition 2 + +: definition 3 + + +: definition 4 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/no_def_list.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/no_def_list.html new file mode 100644 index 000000000000..c16f96238104 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/no_def_list.html @@ -0,0 +1,2 @@ +<p>This is a para +: and not a definition list</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/no_def_list.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/no_def_list.text new file mode 100644 index 000000000000..98b52b3744fe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/no_def_list.text @@ -0,0 +1,2 @@ +This is a para +\: and not a definition list diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/para_wrapping.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/para_wrapping.html new file mode 100644 index 000000000000..5f28fdf8a2d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/para_wrapping.html @@ -0,0 +1,10 @@ +<dl> + <dt>term</dt> + <dd> + <p>definition</p> + </dd> + <dd>definition</dd> + <dd> + <p>definition</p> + </dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/para_wrapping.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/para_wrapping.text new file mode 100644 index 000000000000..280fa4746c28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/para_wrapping.text @@ -0,0 +1,6 @@ +term + +: definition +: definition + +: definition diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/separated_by_eob.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/separated_by_eob.html new file mode 100644 index 000000000000..0a1c4dc2b057 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/separated_by_eob.html @@ -0,0 +1,8 @@ +<dl> + <dt>kram</dt> + <dd>down</dd> +</dl> +<dl> + <dt>kram</dt> + <dd>down</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/separated_by_eob.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/separated_by_eob.text new file mode 100644 index 000000000000..56fedf16a6b1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/separated_by_eob.text @@ -0,0 +1,5 @@ +kram +: down +^ +kram +: down diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/simple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/simple.html new file mode 100644 index 000000000000..791f14515ac9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/simple.html @@ -0,0 +1,10 @@ +<dl> + <dt>kram</dt> + <dd>down</dd> + <dt>novalue</dt> + <dd></dd> + <dt>kram</dt> + <dd>down +kram</dd> + <dd>down</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/simple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/simple.text new file mode 100644 index 000000000000..e3bf730eb04b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/simple.text @@ -0,0 +1,10 @@ +kram +: down + +novalue +: + +kram +: down +kram +: down diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/styled_terms.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/styled_terms.html new file mode 100644 index 000000000000..cf7d7859a042 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/styled_terms.html @@ -0,0 +1,4 @@ +<dl> + <dt><em>kram</em></dt> + <dd>down</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/styled_terms.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/styled_terms.text new file mode 100644 index 000000000000..76eb3553f873 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/styled_terms.text @@ -0,0 +1,2 @@ +*kram* +: down diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/too_much_space.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/too_much_space.html new file mode 100644 index 000000000000..b4df8780770d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/too_much_space.html @@ -0,0 +1,3 @@ +<p>para</p> + +<p>: no definition</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/too_much_space.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/too_much_space.text new file mode 100644 index 000000000000..30ab445c8a92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/too_much_space.text @@ -0,0 +1,4 @@ +para + + +: no definition diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/with_blocks.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/with_blocks.html new file mode 100644 index 000000000000..45b58656ed4e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/with_blocks.html @@ -0,0 +1,38 @@ +<dl> + <dt>kram</dt> + <dd>this is some +text</dd> + <dd> + <p>this is some +more text</p> + </dd> + <dt>kram</dt> + <dd> + <blockquote> + <p>blockquote</p> + </blockquote> + </dd> + <dt>kram</dt> + <dd> + <pre><code>code +</code></pre> + </dd> + <dt>kram</dt> + <dd> + <dl> + <dt>kram</dt> + <dd>down</dd> + </dl> + </dd> + <dt>kram</dt> + <dd> + <h1>header</h1> + </dd> + <dt>kram</dt> + <dd> + <ul> + <li>list</li> + <li>items</li> + </ul> + </dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/with_blocks.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/with_blocks.text new file mode 100644 index 000000000000..15195ce3f393 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/13_definition_list/with_blocks.text @@ -0,0 +1,24 @@ +kram +: this is some + text + + : this is some + more text + +kram +: > blockquote + +kram +: + code + +kram +: kram + : down + +kram +: # header + +kram +: * list + * items diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/empty_tag_in_cell.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/empty_tag_in_cell.html new file mode 100644 index 000000000000..af9b3e5f5a15 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/empty_tag_in_cell.html @@ -0,0 +1,8 @@ +<table> + <tbody> + <tr> + <td>first line of cell<br />second line of cell</td> + <td>another cell</td> + </tr> + </tbody> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/empty_tag_in_cell.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/empty_tag_in_cell.options new file mode 100644 index 000000000000..63936b9955ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/empty_tag_in_cell.options @@ -0,0 +1 @@ +:html_to_native: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/empty_tag_in_cell.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/empty_tag_in_cell.text new file mode 100644 index 000000000000..60fec0b40a3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/empty_tag_in_cell.text @@ -0,0 +1 @@ +| first line of cell<br>second line of cell | another cell | diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/errors.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/errors.html new file mode 100644 index 000000000000..302e97aedcdc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/errors.html @@ -0,0 +1,12 @@ +<p>No table body</p> + +<p>|-|-|-</p> + +<p>|no|table|here|</p> + +<p>|no|table|here| +paragraph</p> + +<p>|-|-| +|-|-|</p> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/errors.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/errors.text new file mode 100644 index 000000000000..3565d5b826bd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/errors.text @@ -0,0 +1,13 @@ +No table body + +|-|-|- + +[5]: test +|no|table|here| + +|no|table|here| +paragraph + +|-|-| +|-|-| + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/escaping.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/escaping.html new file mode 100644 index 000000000000..b4528a17dc28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/escaping.html @@ -0,0 +1,52 @@ +<p><code>cell 1 | cell 2</code></p> + +<p>cell 1 | cell 2</p> + +<table> + <tbody> + <tr> + <td>cell 1</td> + <td>cell 2 | continued</td> + </tr> + </tbody> +</table> + +<table> + <tbody> + <tr> + <td>cell 1</td> + <td>cell <code>2</code></td> + </tr> + </tbody> +</table> + +<table> + <tbody> + <tr> + <td>cell 1</td> + <td><code>code | span</code></td> + </tr> + </tbody> +</table> + +<p>cell 1 <code>code | span</code></p> + +<p>cell 1 | <code>code | span</code></p> + +<table> + <tbody> + <tr> + <td>cell 1</td> + <td>cell `2</td> + <td>cell 3</td> + </tr> + <tr> + <td>cell 1`</td> + <td>cell 2</td> + <td>cell 3</td> + </tr> + </tbody> +</table> + +<p>cell 1 | cell <code>2 | cell 3 +cell 1</code> | cell 2 | cell 3</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/escaping.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/escaping.text new file mode 100644 index 000000000000..a8a24d6a3029 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/escaping.text @@ -0,0 +1,19 @@ +`cell 1 | cell 2` + +cell 1 \| cell 2 + +cell 1 | cell 2 \| continued + +cell 1 | cell `2` + +cell 1 | `code | span` + +cell 1 `code | span` + +cell 1 \| `code | span` + +cell 1 | cell `2 | cell 3 +cell 1` | cell 2 | cell 3 + +cell 1 \| cell `2 | cell 3 +cell 1` | cell 2 | cell 3 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/footer.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/footer.html new file mode 100644 index 000000000000..e6596ed5eb0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/footer.html @@ -0,0 +1,65 @@ +<p>Simple footer</p> + +<table> + <tbody> + <tr> + <td>cell1</td> + <td>cell2</td> + </tr> + </tbody> + <tfoot> + <tr> + <td>cell3</td> + <td>cell4</td> + </tr> + </tfoot> +</table> + +<p>Full footer</p> + +<table> + <tbody> + <tr> + <td>cell1</td> + <td>cell2</td> + </tr> + </tbody> + <tfoot> + <tr> + <td>cell3</td> + <td>cell4</td> + </tr> + </tfoot> +</table> + +<p>Footer with separator lines</p> + +<table> + <tbody> + <tr> + <td>cell1</td> + <td>cell2</td> + </tr> + </tbody> + <tfoot> + <tr> + <td>cell3</td> + <td>cell4</td> + </tr> + <tr> + <td>cell5</td> + <td>cell6</td> + </tr> + </tfoot> +</table> + +<p>Empty footer</p> + +<table> + <tbody> + <tr> + <td>cell1</td> + <td>cell2</td> + </tr> + </tbody> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/footer.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/footer.text new file mode 100644 index 000000000000..faaed8d9fb5c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/footer.text @@ -0,0 +1,25 @@ +Simple footer + +| cell1 | cell2 +|= +| cell3 | cell4 + +Full footer + +| cell1 | cell2 +|=======|=======| +| cell3 | cell4 + +Footer with separator lines + +| cell1 | cell2 +|=======|=======| +| cell3 | cell4 +|--- +| cell5 | cell6 +|--- + +Empty footer + +| cell1 | cell2 +|= diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/header.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/header.html new file mode 100644 index 000000000000..647f2c48fb39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/header.html @@ -0,0 +1,117 @@ +<p>Simple header</p> + +<table> + <thead> + <tr> + <th>cell1</th> + <th>cell2</th> + </tr> + </thead> + <tbody> + <tr> + <td>cell3</td> + <td>cell4</td> + </tr> + </tbody> +</table> + +<p>Full header</p> + +<table> + <thead> + <tr> + <th>cell1</th> + <th>cell2</th> + </tr> + </thead> + <tbody> + <tr> + <td>cell3</td> + <td>cell4</td> + </tr> + </tbody> +</table> + +<p>With alignment and superfluous alignment defs</p> + +<table> + <thead> + <tr> + <th>default</th> + <th style="text-align: left">left</th> + <th style="text-align: center">center</th> + <th style="text-align: right">right</th> + <th>default</th> + </tr> + </thead> + <tbody> + <tr> + <td>cell1</td> + <td style="text-align: left">cell2</td> + <td style="text-align: center">cell3</td> + <td style="text-align: right">cell4</td> + <td>cell5</td> + </tr> + </tbody> +</table> + +<p>With leading sep line</p> + +<table> + <thead> + <tr> + <th>cell1</th> + <th>cell2</th> + </tr> + </thead> + <tbody> + <tr> + <td>cell3</td> + <td>cell4</td> + </tr> + </tbody> +</table> + +<p>Multiple bodies</p> + +<table> + <thead> + <tr> + <th style="text-align: center">cell1</th> + <th>cell2</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: center">cell3</td> + <td>cell4</td> + </tr> + </tbody> + <tbody> + <tr> + <td style="text-align: center">cell5</td> + <td>cell6</td> + </tr> + </tbody> +</table> + +<p>Sep line with tab</p> + +<table> + <thead> + <tr> + <th style="text-align: right">right</th> + <th style="text-align: center">center</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: right">cell1</td> + <td style="text-align: center">cell2</td> + </tr> + <tr> + <td style="text-align: right">cell3</td> + <td style="text-align: center">cell4</td> + </tr> + </tbody> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/header.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/header.text new file mode 100644 index 000000000000..6961bfb9d9c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/header.text @@ -0,0 +1,39 @@ +Simple header + +| cell1 | cell2 +|----- +| cell3 | cell4 + +Full header + +| cell1 | cell2 +|-------|-------| +| cell3 | cell4 + +With alignment and superfluous alignment defs + +| default | left | center | right | default +|-| :- |:-: | -: | - | :-: | :- +| cell1 | cell2 | cell3 | cell4 | cell5 + +With leading sep line + +|:-:|-:| +| cell1 | cell2 +|-------|-------| +| cell3 | cell4 + +Multiple bodies + +| cell1 | cell2 ++ :-: | +| cell3 | cell4 +|----||| +| cell5 | cell6 + +Sep line with tab + +right | center +---: | :---: +cell1 | cell2 +cell3 | cell4 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/no_table.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/no_table.html new file mode 100644 index 000000000000..dce46b1d3123 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/no_table.html @@ -0,0 +1,3 @@ +<p>No table</p> + +<p>| Some | thing | here</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/no_table.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/no_table.text new file mode 100644 index 000000000000..90f90b3d9af1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/no_table.text @@ -0,0 +1,3 @@ +No table + +\| Some \| thing \| here diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/simple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/simple.html new file mode 100644 index 000000000000..506b44217601 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/simple.html @@ -0,0 +1,192 @@ +<table> + <tbody> + <tr> + <td>cell1</td> + <td>cell2</td> + </tr> + <tr> + <td>cell3</td> + <td>cell4</td> + </tr> + <tr> + <td>cell5</td> + <td>cell6 |</td> + </tr> + <tr> + <td>cell7</td> + <td>cell8</td> + </tr> + </tbody> +</table> + +<p>Missing cells at end</p> + +<table> + <tbody> + <tr> + <td>cell1</td> + <td>cell2</td> + <td>cell3</td> + </tr> + <tr> + <td>cell1</td> + <td> </td> + <td> </td> + </tr> + <tr> + <td> </td> + <td>cell2</td> + <td>cell3</td> + </tr> + </tbody> +</table> + +<p>Escaped pipe characters</p> + +<table> + <tbody> + <tr> + <td>cell1 | cell1</td> + <td>cell2</td> + </tr> + <tr> + <td>cell1</td> + <td>cell2 |</td> + </tr> + <tr> + <td>cell1 <code>|</code> con</td> + <td>cell2</td> + </tr> + </tbody> +</table> + +<p>Table with code elements</p> + +<table> + <tbody> + <tr> + <td>This is a <code>span | with</code> a pipe.</td> + <td> </td> + <td> </td> + <td> </td> + </tr> + <tr> + <td>Some <em>span</em></td> + <td>&lt;/em&gt; here</td> + <td>a <code>span | with</code> a</td> + <td>pipe.</td> + </tr> + </tbody> +</table> + +<p>Special cases regarding codespan syntax</p> + +<table> + <tbody> + <tr> + <td>a</td> + <td><code>b</code></td> + </tr> + </tbody> +</table> + +<table> + <tbody> + <tr> + <td><code>a</code></td> + </tr> + </tbody> +</table> + +<table class="cls"> + <tbody> + <tr> + <td>table</td> + <td>with</td> + <td>ial</td> + </tr> + </tbody> +</table> + +<table class="cls"> + <tbody> + <tr> + <td>table</td> + <td>with</td> + <td>ial</td> + </tr> + </tbody> +</table> + +<p>not starting with a bar</p> + +<table> + <tbody> + <tr> + <td>simple</td> + <td>table</td> + </tr> + </tbody> +</table> + +<table> + <thead> + <tr> + <th>head1</th> + <th>head2</th> + </tr> + </thead> + <tbody> + <tr> + <td>cell1</td> + <td>cell2</td> + </tr> + </tbody> +</table> + +<table> + <thead> + <tr> + <th>head1</th> + <th>head2</th> + </tr> + </thead> + <tbody> + <tr> + <td> </td> + <td>cell2</td> + </tr> + </tbody> +</table> + +<table> + <tbody> + <tr> + <td>a</td> + <td>b</td> + </tr> + <tr> + <td>c</td> + <td>d</td> + </tr> + <tr> + <td>e</td> + <td>f</td> + </tr> + </tbody> +</table> + +<table> + <thead> + <tr> + <th>Key</th> + <th>Value type</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>Type</code></td> + <td><code>"GROUP"</code>|<code>"UNKNOWN"</code></td> + </tr> + </tbody> +</table> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/simple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/simple.text new file mode 100644 index 000000000000..0f225a4ee182 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/simple.text @@ -0,0 +1,53 @@ +| cell1 | cell2 | +|cell3 | cell4| +|cell5|cell6 \| +| cell7|cell8 + +Missing cells at end + +| cell1 | cell2 | cell3 | +| cell1 || +|| cell2 | cell3 + +Escaped pipe characters + +| cell1 \| cell1 | cell2 | +| cell1 | cell2 \| +| cell1 `|` con | cell2 + +Table with code elements + +| This is a <code>span | with</code> a pipe. +| Some <em>span | </em> here | a <code>span | with</code> a | pipe. + +Special cases regarding codespan syntax + +|a|`b` + +|`a` + +{:.cls} +| table | with | ial + +| table | with | ial +{:.cls} + +not starting with a bar + +simple | table + +head1 | head2 +------|------ +cell1 | cell2 + + head1 | head2 +-------|------ + | cell2 + +| a | b | + c | d +| e | f | + +| Key | Value type | +|--------|------------------------| +| `Type` | `"GROUP"`\|`"UNKNOWN"` | diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/table_with_footnote.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/table_with_footnote.html new file mode 100644 index 000000000000..7da4f9b37a00 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/table_with_footnote.html @@ -0,0 +1,25 @@ +<table> + <tbody> + <tr> + <td>this is <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></td> + <td>a table</td> + </tr> + <tr> + <td>with a</td> + <td>footnote</td> + </tr> + </tbody> +</table> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:1" role="doc-endnote"> + <p>Something</p> + + <blockquote> + <p>special here</p> + </blockquote> + <p><a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/table_with_footnote.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/table_with_footnote.latex new file mode 100644 index 000000000000..99b5312f3333 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/table_with_footnote.latex @@ -0,0 +1,11 @@ +\begin{longtable}{|l|l|} +\hline +this is \footnote{Something + +\begin{quote} +special here +\end{quote}} & a table\\ +with a & footnote\\ +\hline +\end{longtable} + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/table_with_footnote.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/table_with_footnote.text new file mode 100644 index 000000000000..345fc5d3088a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/14_table/table_with_footnote.text @@ -0,0 +1,6 @@ +| this is [^1] | a table +| with a | footnote + +[^1]: Something + + > special here diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/gh_128.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/gh_128.html new file mode 100644 index 000000000000..9b2c12797c31 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/gh_128.html @@ -0,0 +1 @@ +\[&lt;script&gt;alert('a')&lt;/script&gt; &lt;script&gt;alert('b&lt;')&lt;/script&gt;\] diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/gh_128.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/gh_128.text new file mode 100644 index 000000000000..95252a76e4eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/gh_128.text @@ -0,0 +1 @@ +$$ <script>alert('a')</script> <script>alert('b<')</script> $$ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/no_engine.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/no_engine.html new file mode 100644 index 000000000000..5d6b343e812d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/no_engine.html @@ -0,0 +1,3 @@ +<div id="math-id" class="kdmath">$$ +5+5 +$$</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/no_engine.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/no_engine.options new file mode 100644 index 000000000000..06d559e5459d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/no_engine.options @@ -0,0 +1 @@ +:math_engine: ~ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/no_engine.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/no_engine.text new file mode 100644 index 000000000000..fdee5cfbea55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/no_engine.text @@ -0,0 +1,2 @@ +{: #math-id} +$$5+5$$ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/normal.html new file mode 100644 index 000000000000..f80d56b679b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/normal.html @@ -0,0 +1,30 @@ +<p>This is a para. +\(\text{LaTeX} \lambda_5\)</p> + +\[\lambda_5 = \alpha + 4\] + +<p>\(\lambda_\alpha &gt; 5\) +This is a para.</p> + +\[\begin{align*} +&amp;=5 \\ +&amp;=6 \\ +\end{align*}\] + +\[5+5\] + +\[5+5\] + +\[5+5\] + +\[5+5\] + +<pre><code>$$5+5$$ +</code></pre> + +<div class="cls">\[5+5\] +</div> +<div class="cls">\[5+5\] +</div> + +\[|x| = 5\] diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/normal.text new file mode 100644 index 000000000000..aa5984a2c923 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/15_math/normal.text @@ -0,0 +1,30 @@ +This is a para. +$$ \text{LaTeX} \lambda_5 $$ + +$$\lambda_5 = \alpha + 4$$ + +$$\lambda_\alpha > 5$$ +This is a para. + +$$\begin{align*} +&=5 \\ +&=6 \\ +\end{align*}$$ + +$$5+5$$ + + $$5+5$$ + + $$5+5$$ + + $$5+5$$ + + $$5+5$$ + +{:.cls} +$$5+5$$ +^ +$$5+5$$ +{:.cls} + +$$|x| = 5$$ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/no_toc.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/no_toc.html new file mode 100644 index 000000000000..bbb831e93b67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/no_toc.html @@ -0,0 +1,14 @@ + +<h1>Header level 1</h1> + +<h2>Header level 2</h2> + +<h3>Header level 3</h3> + +<h4>Header level 4</h4> + +<h1>Other header level 1</h1> + +<h2>Other header level 2</h2> + +<h3>Other header level 3</h3> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/no_toc.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/no_toc.text new file mode 100644 index 000000000000..11ad82916c67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/no_toc.text @@ -0,0 +1,16 @@ +* Here comes the table of content +{:toc} + +# Header level 1 + +## Header level 2 + +### Header level 3 + +#### Header level 4 + +# Other header level 1 + +## Other header level 2 + +### Other header level 3 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_exclude.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_exclude.html new file mode 100644 index 000000000000..d35268469d3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_exclude.html @@ -0,0 +1,35 @@ +<h1 class="no_toc" id="contents">Contents</h1> + +<ul id="markdown-toc"> + <li><a href="#header-level-1" id="markdown-toc-header-level-1">Header level 1</a> <ul> + <li><a href="#header-level-2" id="markdown-toc-header-level-2">Header level 2</a> <ul> + <li><a href="#header-level-3" id="markdown-toc-header-level-3">Header level 3</a> <ul> + <li><a href="#header-level-4" id="markdown-toc-header-level-4">Header level 4</a></li> + </ul> + </li> + </ul> + </li> + </ul> + </li> + <li><a href="#other-header-level-1" id="markdown-toc-other-header-level-1">Other header level 1</a> <ul> + <li><a href="#other-header-level-2" id="markdown-toc-other-header-level-2">Other header level 2</a> <ul> + <li><a href="#other-header-level-3" id="markdown-toc-other-header-level-3">Other header level 3</a></li> + </ul> + </li> + </ul> + </li> +</ul> + +<h1 id="header-level-1">Header level 1</h1> + +<h2 id="header-level-2">Header level 2</h2> + +<h3 id="header-level-3">Header level 3</h3> + +<h4 id="header-level-4">Header level 4</h4> + +<h1 id="other-header-level-1">Other header level 1</h1> + +<h2 id="other-header-level-2">Other header level 2</h2> + +<h3 id="other-header-level-3">Other header level 3</h3> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_exclude.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_exclude.options new file mode 100644 index 000000000000..8776b5524dfb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_exclude.options @@ -0,0 +1 @@ +:auto_ids: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_exclude.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_exclude.text new file mode 100644 index 000000000000..d8f0b863fd37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_exclude.text @@ -0,0 +1,19 @@ +# Contents +{:.no_toc} + +* Here comes the table of content +{:toc} + +# Header level 1 + +## Header level 2 + +### Header level 3 + +#### Header level 4 + +# Other header level 1 + +## Other header level 2 + +### Other header level 3 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_levels.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_levels.html new file mode 100644 index 000000000000..e50a07c4d5b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_levels.html @@ -0,0 +1,24 @@ +<ul id="markdown-toc"> + <li><a href="#header--level-2" id="markdown-toc-header--level-2">Header \` level 2</a> <ul> + <li><a href="#header-level-3" id="markdown-toc-header-level-3">Header level 3</a></li> + </ul> + </li> + <li><a href="#other-header-level-2" id="markdown-toc-other-header-level-2">Other header level 2</a> <ul> + <li><a href="#other-header-level-3" id="markdown-toc-other-header-level-3">Other header level 3</a></li> + </ul> + </li> +</ul> + +<h1 id="header-level-1">Header level 1</h1> + +<h2 id="header--level-2">Header \` level 2</h2> + +<h3 id="header-level-3">Header level 3</h3> + +<h4 id="header-level-4">Header level 4</h4> + +<h1 id="other-header-level-1">Other header level 1</h1> + +<h2 id="other-header-level-2">Other header level 2</h2> + +<h3 id="other-header-level-3">Other header level 3</h3> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_levels.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_levels.options new file mode 100644 index 000000000000..bdfbeba1ac27 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_levels.options @@ -0,0 +1,2 @@ +:toc_levels: 2..3 +:auto_ids: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_levels.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_levels.text new file mode 100644 index 000000000000..1a62dea2f665 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_levels.text @@ -0,0 +1,16 @@ +* Here comes the table of content +{:toc} + +# Header level 1 + +## Header \\\` level 2 + +### Header level 3 + +#### Header level 4 + +# Other header level 1 + +## Other header level 2 + +### Other header level 3 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_footnotes.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_footnotes.html new file mode 100644 index 000000000000..0a3e199ab5a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_footnotes.html @@ -0,0 +1,13 @@ +<ul id="markdown-toc"> + <li><a href="#header1-level-1" id="markdown-toc-header1-level-1">Header level 1</a></li> +</ul> + +<h1 id="header1-level-1">Header<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> level 1</h1> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:1" role="doc-endnote"> + <p>Some footnote content here <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_footnotes.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_footnotes.options new file mode 100644 index 000000000000..8776b5524dfb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_footnotes.options @@ -0,0 +1 @@ +:auto_ids: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_footnotes.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_footnotes.text new file mode 100644 index 000000000000..5879ed576135 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_footnotes.text @@ -0,0 +1,6 @@ +* Here comes the table of content +{:toc} + +# Header[^1] level 1 + +[^1]: Some footnote content here diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_links.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_links.html new file mode 100644 index 000000000000..ebde543b7213 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_links.html @@ -0,0 +1,8 @@ +<h1 id="header"><a href="test.html">Header</a></h1> + +<h1 id="header-1"><a href="test.html">Header</a></h1> + +<ul id="markdown-toc"> + <li><a href="#header" id="markdown-toc-header">Header</a></li> + <li><a href="#header-1" id="markdown-toc-header-1">Header</a></li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_links.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_links.options new file mode 100644 index 000000000000..36c20f5ad28e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_links.options @@ -0,0 +1,2 @@ +:auto_ids: true +:auto_id_stripping: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_links.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_links.text new file mode 100644 index 000000000000..9b4ac0739bc4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/block/16_toc/toc_with_links.text @@ -0,0 +1,8 @@ +# [Header] + +# [Header] + +[header]: test.html + +* toc +{:toc} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/cjk-line-break.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/cjk-line-break.html new file mode 100644 index 000000000000..829931635cf8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/cjk-line-break.html @@ -0,0 +1,4 @@ +<p>一二三四五</p> + +<p>あいうえお</p> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/cjk-line-break.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/cjk-line-break.options new file mode 100644 index 000000000000..4c86d365b517 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/cjk-line-break.options @@ -0,0 +1 @@ +:remove_line_breaks_for_cjk: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/cjk-line-break.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/cjk-line-break.text new file mode 100644 index 000000000000..969c04cac635 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/cjk-line-break.text @@ -0,0 +1,12 @@ +一 +二 +三 +四 +五 + +あ +い +う +え +お + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/encoding.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/encoding.html new file mode 100644 index 000000000000..0339347f2f89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/encoding.html @@ -0,0 +1,46 @@ +<p>Das ist gewöhnlich <em>ein</em> <a href="http://example.org">Über-Problem</a> mit manchen<br /> +Sälen <a href="http://example.org">http://example.org</a> und <span id="test">anderen Dinge</span>. Siehe +<img src="http://example.org" alt="Über mich" />!</p> + +<blockquote class="test"> + <p>Vielleicht <em class="red">höre</em> ich nicht richtig?</p> +</blockquote> + +<ul> + <li>Sollten wir uns das überl<em>egen</em>? <em>Verhöhne</em> mich nicht!</li> + <li>Ho ho höher! Sind *wir* da?</li> +</ul> + +<h1>Titel sind urschön</h1> + +<h2 id="hot">Manche mögens <em>ärmer</em></h2> + +<pre><code>öha +was nun? +</code></pre> + +<dl> + <dt>Töne</dt> + <dd>Laute Geräusche</dd> + <dd>vielleicht noch was ä<em>hnliches</em></dd> +</dl> + +<table> + <thead> + <tr> + <th>hoch</th> + <th>höher</th> + <th>am höchsten</th> + </tr> + </thead> + <tbody> + <tr> + <td>über</td> + <td>drüber</td> + <td>müde</td> + </tr> + </tbody> +</table> + +<p>Das ist schön +gemacht</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/encoding.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/encoding.text new file mode 100644 index 000000000000..65edf4b02df5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/encoding.text @@ -0,0 +1,28 @@ +Das ist gewöhnlich *ein* [Über-Problem](http://example.org) mit manchen +Sälen <http://example.org> und <span id='test'>anderen Dinge</span>. Siehe +![Über mich](http://example.org)! + +> Vielleicht *höre*{:.red} ich nicht richtig? +{:.test} + +* Sollten wir uns das überl*egen*? *Verhöhne* mich nicht! +* Ho ho höher! Sind \*wir\* da? + +Titel sind urschön +================== + +## Manche mögens *ärmer* {#hot} + + öha + was nun? + +Töne +: Laute Geräusche +: vielleicht noch was ä*hnliches* + +| hoch | höher | am höchsten | +|----------------------------| +| über | drüber | müde | + +<p markdown='1'>Das ist schön +gemacht</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/example.man b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/example.man new file mode 100644 index 000000000000..b1afee784562 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/example.man @@ -0,0 +1,123 @@ +.\" generated by kramdown +.TH "NAME" "1" "November 2016" "Some extra data" +.SH NAME +name \- description +.SH "SYNOPSIS" +\fBname\fP [\fBOPTIONS\fP] \fIarguments\fP\.\.\. +.SH "DESCRIPTION" +This is a normal paragraph\. +.sp +.PD 0 +.IP \(bu 4 +A +.IP \(bu 4 +compact +.IP \(bu 4 +list +.IP \(bu 4 +with multiple +.RS +.IP \(bu 4 +items and +.RS +.IP \(bu 4 +nested +.RE +.RE +.IP \(bu 4 +as well +.PD +.RS +.P +blockquotes are fine +.IP 1. 4 +numbered lists +.IP 2. 4 +work too +.RS +.IP 1. 4 +and they +.IP 2. 4 +can be +.RS +.IP 1. 4 +nested +.RE +.RE +.IP 3. 4 +again +.RE +.sp +.RS 4 +.EX +Some fancy code + going + on + here +.EE +.RE +.TP +\fB\-o\fP +.TQ +\fB\-\-option\fP +Description lists +.sp +are useful as well +.P +And compact definition lists: +.sp +.PD 0 +.TP +\fBo\fP +Option +.TP +\fBk\fP +Key +.TP +\fBv\fP +Value +.PD +.TS +box center ; +l l l l . +tables can be centered +.TE +.sp +.TS +box ; +lb lb cb rb . +Default aligned Left aligned Center aligned Right aligned += +.T& +l l c r . +First body part Second cell Third cell fourth cell +Second \fIline\fP foo \fBstrong\fP baz +Third line \fBquux\fP baz bar +_ +.T& +l l c r . +Second body +2nd line += +Footer row one +Footer row two +.TE +.sp +.P +Inline formatting like \fIemphasis\fP, \fBstrong\fP and \fBcode span\fP work as ususal\. +.UR are_well\.html +Links +.UE +work, too! As do +.br +line breaks\. +.P +Abbreviations like MD can be used but the abbreviation title is ignored\. +.P +Math elements work \fB\el = 5\fP inline and in block form: +.sp +.RS 4 +.EX +\elambda_5 = \ealpha + 4 +.EE +.RE diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/example.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/example.text new file mode 100644 index 000000000000..12b011bb01d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/example.text @@ -0,0 +1,85 @@ +# name(1) - description +{: data-date="November 2016" data-extra="Some extra data"} + +## SYNOPSIS + +`name` \[`OPTIONS`\] *arguments*... + +## DESCRIPTION + +This is a normal paragraph. + +* A +* compact +* list +* with multiple + * items and + * nested +* as well +{:.compact} + +> blockquotes are fine +> +> 1. numbered lists +> +> 2. work too +> 1. and they +> 2. can be +> 1. nested +> +> 3. again + +~~~ +Some fancy code + going + on + here +~~~ + +`-o` +`--option` +: Description lists +: are useful as well + +And compact definition lists: + +`o` +: Option + +`k` +: Key + +`v` +: Value +{:.compact} + +| tables | can | be | centered | +{:.center} + +|-----------------+------------+-----------------+----------------| +| Default aligned |Left aligned| Center aligned | Right aligned | +|-----------------|:-----------|:---------------:|---------------:| +| First body part |Second cell | Third cell | fourth cell | +| Second *line* |foo | **strong** | baz | +| Third line |`quux` | baz | bar | +|-----------------+------------+-----------------+----------------| +| Second body | | | | +| 2nd line | | | | +|=================+============+=================+================| +| Footer row one | | | | +| Footer row two | | | | +|-----------------+------------+-----------------+----------------| + + +Inline formatting like *emphasis*, **strong** and `code span` work +as ususal. [Links](are_well.html) work, too! As do\\ +line breaks. + +Abbreviations like MD can be used but the abbreviation title is +ignored. + +*[MD]: Markdown + +Math elements work $$\l = 5$$ inline and in block form: + +$$\lambda_5 = \alpha + 4$$ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-dash-description.man b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-dash-description.man new file mode 100644 index 000000000000..8e47527e1b09 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-dash-description.man @@ -0,0 +1,4 @@ +.\" generated by kramdown +.TH "NAME" "7" +.SH NAME +name \- description diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-dash-description.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-dash-description.text new file mode 100644 index 000000000000..832c92139d1f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-dash-description.text @@ -0,0 +1 @@ +# name -- description diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-description.man b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-description.man new file mode 100644 index 000000000000..e59dc5ecea76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-description.man @@ -0,0 +1,4 @@ +.\" generated by kramdown +.TH "NAME" "1" "November 2016" "Something extra" +.SH NAME +name \- description diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-description.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-description.text new file mode 100644 index 000000000000..941482c1173c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-description.text @@ -0,0 +1,2 @@ +# name description +{: data-section="1" data-date="November 2016" data-extra="Something extra"} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section-description.man b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section-description.man new file mode 100644 index 000000000000..8df4ff711620 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section-description.man @@ -0,0 +1,4 @@ +.\" generated by kramdown +.TH "NAME" "1" +.SH NAME +name \- description diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section-description.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section-description.text new file mode 100644 index 000000000000..5f3e765b1456 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section-description.text @@ -0,0 +1 @@ +# name(1) -- description diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section.man b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section.man new file mode 100644 index 000000000000..7ca87574057c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section.man @@ -0,0 +1,2 @@ +.\" generated by kramdown +.TH "NAME" "1" diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section.text new file mode 100644 index 000000000000..da98dbdacb62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name-section.text @@ -0,0 +1 @@ +# name(1) diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name.man b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name.man new file mode 100644 index 000000000000..8488496fd061 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name.man @@ -0,0 +1,2 @@ +.\" generated by kramdown +.TH "NAME" "7" diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name.text new file mode 100644 index 000000000000..5f4656ae181b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/heading-name.text @@ -0,0 +1 @@ +# name diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/sections.man b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/sections.man new file mode 100644 index 000000000000..14ab2336fb62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/sections.man @@ -0,0 +1,4 @@ +.\" generated by kramdown +.SH "NAME" +works +.SS "Sub section" diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/sections.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/sections.text new file mode 100644 index 000000000000..d1f5f86426da --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/sections.text @@ -0,0 +1,11 @@ +## NAME + +works + +### Sub section + +#### Ignored + +##### Ignored + +###### Ignored diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/text-escaping.man b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/text-escaping.man new file mode 100644 index 000000000000..710a4f14c18b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/text-escaping.man @@ -0,0 +1,8 @@ +.\" generated by kramdown +\&\. at the start of the line +.P +line with \efB backslash symbol +.P +some \. other \- escaped \' symbols +.P +\&\. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/text-escaping.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/text-escaping.text new file mode 100644 index 000000000000..052b94f5c66f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/man/text-escaping.text @@ -0,0 +1,7 @@ +. at the start of the line + +line with \fB backslash symbol + +some . other - escaped \' symbols + +. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty.html new file mode 100644 index 000000000000..a1102eadbb16 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty.html @@ -0,0 +1,5 @@ +<p>This is [] empty.</p> + +<p>This is [][] empty.</p> + +<p>This is <a href="test.html"></a> empty.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty.text new file mode 100644 index 000000000000..cca5de5f642f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty.text @@ -0,0 +1,5 @@ +This is [] empty. + +This is [][] empty. + +This is [](test.html) empty. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty_title.htmlinput b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty_title.htmlinput new file mode 100644 index 000000000000..b95b2cc7a007 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty_title.htmlinput @@ -0,0 +1,3 @@ +<p>Image with empty title: <img src="/images/other.png" alt="alt text" title="" /></p> + +<p>Link <a href="http://example.tld" title="">reference</a> with empty title.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty_title.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty_title.text new file mode 100644 index 000000000000..baabe7da191c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/empty_title.text @@ -0,0 +1,7 @@ +Image with empty title: ![alt text](/images/other.png) + +Link [reference][1] with empty title. + + + +[1]: http://example.tld diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/image_in_a.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/image_in_a.html new file mode 100644 index 000000000000..e1f4ade52d17 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/image_in_a.html @@ -0,0 +1,5 @@ +<p>Simple: <a href="local.html">Some <img src="/images/other.png" alt="alt text" /></a></p> + +<p>Nested: <a href="local.html">Some <img src="/images/other.png" alt="alt ![img](text.png) text" /></a></p> + +<p>Simple: <a href="local.html">Some <em>text <img src="/images/other.png" alt="alt text" /> text</em></a></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/image_in_a.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/image_in_a.text new file mode 100644 index 000000000000..bdbfb65ee154 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/image_in_a.text @@ -0,0 +1,5 @@ +Simple: [Some ![alt text](/images/other.png)](local.html) + +Nested: [Some ![alt ![img](text.png) text](/images/other.png)](local.html) + +Simple: [Some *text ![alt text](/images/other.png) text*](local.html) diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/imagelinks.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/imagelinks.html new file mode 100644 index 000000000000..565d36f70ab2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/imagelinks.html @@ -0,0 +1,15 @@ +<p>Simple: <img src="/images/other.png" alt="alt text" /></p> + +<p>Simple with title: <img src="/images/other.png" alt="alt text" title="title" /></p> + +<p>Empty img link: <img src="" alt="alt text" /></p> + +<p>Reference style: <img src="other.png" alt="alt text" /></p> + +<p>Reference style with title: <img src="other.png" alt="alt text" title="Title" /></p> + +<p>No alt text: <img src="other.png" alt="" /></p> + +<p>No id: <img src="other.png" alt="imgo" title="Title" /></p> + +<p>With escaped pipe: <img src="other.png" alt="an | pipe" /></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/imagelinks.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/imagelinks.text new file mode 100644 index 000000000000..05050a24be3b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/imagelinks.text @@ -0,0 +1,18 @@ +Simple: ![alt text](/images/other.png) + +Simple with title: ![alt text](/images/other.png "title") + +Empty img link: ![alt text]() + +Reference style: ![alt text][img] + +Reference style with title: ![alt text][imgo] + +No alt text: ![](other.png) + +No id: ![imgo] + +[img]: other.png +[imgo]: other.png "Title" + +With escaped pipe: ![an \| pipe](other.png) diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/inline.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/inline.html new file mode 100644 index 000000000000..8d00efa9efd5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/inline.html @@ -0,0 +1,46 @@ +<p>simple <a href="">URL</a></p> + +<p>simple <a href="something.html">URL</a></p> + +<p>simple <a href="something.html">URL <em>with</em> formatting</a></p> + +<p>simple <a href="something.html" title="a t&quot;itle">URL with single quoted title</a></p> + +<p>simple <a href="something.html" title="a t'itle">URL with double quoted title</a></p> + +<p>simple <a href="something.html">URL [with ] escaped</a></p> + +<p>simple <a href="something.html">URL with ] escaped</a></p> + +<p>simple <a href="something.html">URL [with] nested</a></p> + +<p>simple <a href="something.html">URL with [no](link.html) inside</a></p> + +<p>simple <a href="/something/to(do)">URL with parens</a></p> + +<p>simple <a href="/something/to(do" title="doit">URL with parens</a></p> + +<p>simple <a href="something.html" title="title">URL broken +on line</a></p> + +<p>simple <a href="with spaces.html">URL with spaces</a></p> + +<p>simple <a href="with spaces.html" title="title">URL with spaces</a></p> + +<p>simple <a href="with (spaces).html">URL with spaces</a></p> + +<p>simple <a href="spaces.html">leading/trailing spaces</a></p> + +<p>simple <a href="spaces.html">leading/trailing spaces</a></p> + +<p>simple <a href="spaces.html">leading/trailing spaces</a></p> + +<p>bad [URL <a href="something.html">not</a></p> + +<p>bad [URL with parens](something(new.html)</p> + +<p>bad [URL with empty title](something.html ‘’)</p> + +<p>bad [URL](</p> + +<p>bad [URL](no</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/inline.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/inline.text new file mode 100644 index 000000000000..c70576466ec8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/inline.text @@ -0,0 +1,48 @@ +simple [URL]() + +simple [URL](something.html) + +simple [URL *with* formatting](something.html) + +simple [URL with single quoted title](something.html 'a t"itle') + +simple [URL with double quoted title](something.html "a t'itle") + +simple [URL \[with \] escaped](something.html) + +simple [URL with \] escaped](something.html) + +simple [URL [with] nested](something.html) + +simple [URL with [no](link.html) inside](something.html) + +simple [URL with parens](/something/to(do)) + +simple [URL with parens](/something/to(do "doit") + +simple [URL broken +on line](something.html +"title") + +simple [URL with spaces](with spaces.html) + +simple [URL with spaces](with spaces.html 'title') + +simple [URL with spaces](with (spaces).html) + +simple [leading/trailing spaces]( spaces.html) + +simple [leading/trailing spaces](spaces.html ) + +simple [leading/trailing spaces]( spaces.html ) + + +bad [URL [not](something.html) + +bad [URL with parens](something(new.html) + +bad [URL with empty title](something.html '') + +bad [URL]( + +bad [URL](no diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/latex_escaping.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/latex_escaping.latex new file mode 100644 index 000000000000..63e58e74eef0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/latex_escaping.latex @@ -0,0 +1,6 @@ +\href{https://example.com/~tilde/}{https://example.com/\ensuremath{\sim}tilde/} + +\href{http://example.com/percent\%20percent}{http://example.com/percent\%20percent} + +\href{http://example.com/hash#hash}{http://example.com/hash\#hash} + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/latex_escaping.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/latex_escaping.text new file mode 100644 index 000000000000..9b27ae86b691 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/latex_escaping.text @@ -0,0 +1,5 @@ +<https://example.com/~tilde/> + +<http://example.com/percent%20percent> + +<http://example.com/hash#hash> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs.html new file mode 100644 index 000000000000..15e2ca71a314 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs.html @@ -0,0 +1,9 @@ +<p>This is a para. +[id]: http://www.example.com/</p> + +<pre><code>[4]: nourl +</code></pre> + +<p>Points to <a href="one.url">1</a> and <a href="two.url">2</a> and <a href="three.url">3</a> but not [4]</p> + +<p>Points to <a href="http://example.com">_.:,;!?-</a> and <a href="test.html#'test'" title="title">otherid8</a></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs.text new file mode 100644 index 000000000000..16a25b5b9ac8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs.text @@ -0,0 +1,27 @@ +This is a para. +[id]: http://www.example.com/ + +[otherid1]: http://wwww.example.com/ "title 1" +[otherid2]: http://wwww.example.com/ 'title 2' +[otherid3]: <some spaces.html> +[otherid4]: <some spaces.html> 'title' +[otherid5]: some spaces.html +[otherid6]: some spaces.html 'title' +[otherid7]: some spaces + "title" +[otherid8]:test.html#'test' 'title' + +[break]: http://www.example.com/test/asdf.html + 'Another title' + +[1]: ignored.url + [1]: one.url + [2]: two.url + [3]: three.url + [4]: nourl + +Points to [1] and [2] and [3] but not [4] + +[_.:,;!?-]: http://example.com + +Points to [_.:,;!?-] and [otherid8] diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs_with_ial.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs_with_ial.html new file mode 100644 index 000000000000..f56d77ded6b1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs_with_ial.html @@ -0,0 +1,4 @@ +<p>Link def with <a hreflang="en" class="test" href="http://example.com" title="title">attr</a> and <a hreflang="en" class="test" href="http://example.com" title="title">attr 2</a> and <a class="test" href="http://example.com">attr 3</a> and <a hreflang="en" class="test" href="http://example.com">attr before</a></p> + +<p>test</p> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs_with_ial.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs_with_ial.text new file mode 100644 index 000000000000..59398a3ab74d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/link_defs_with_ial.text @@ -0,0 +1,16 @@ +Link def with [attr] and [attr 2] and [attr 3] and [attr before] + +[attr]: http://example.com 'title' +{: hreflang="en" .test} + +[attr 2]: http://example.com 'title' +{: hreflang="en"} +{: .test} + +[attr 3]: http://example.com +{: .test} +test + +{: hreflang="en"} +{: .test} +[attr before]: http://example.com diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/links_with_angle_brackets.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/links_with_angle_brackets.html new file mode 100644 index 000000000000..ecaa31e562b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/links_with_angle_brackets.html @@ -0,0 +1,3 @@ +<p>This is a <a href="with angle.html">link</a>.</p> + +<p>This is a <a href="with angle.html" title="and title">link</a>.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/links_with_angle_brackets.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/links_with_angle_brackets.text new file mode 100644 index 000000000000..2cf0ececeb90 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/links_with_angle_brackets.text @@ -0,0 +1,3 @@ +This is a [link](<with angle.html>). + +This is a [link](<with angle.html> 'and title'). diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/reference.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/reference.html new file mode 100644 index 000000000000..f6fed181eb78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/reference.html @@ -0,0 +1,37 @@ + +<p>simple <a href="otherurl.html">URL</a> and <a href="someurl.html">URL</a></p> + +<p>simple <a href="otherurl.html">URL</a> and <a href="someurl.html">URL</a></p> + +<p>simple <a href="otherurl.html">1</a> and <a href="someurl.html">isurl</a></p> + +<p>simple <a href="otherurl.html">1</a> and <a href="someurl.html">isurl</a></p> + +<p>this is [a holy <a href="someurl.html">isurl</a>]</p> + +<p>no [resolution][] here and [here]</p> + +<p>with a <a href="url.html">break in +the text</a></p> + +<p>this not [isurl] and not [isurl]</p> + +<p>a <a href="letters.html" title="This is the title">Link with_BIG</a> letters</p> + +<p>bad [no URL] d <a href="someurl.html">isurl</a></p> + +<p>[no url] invalid.html +[no url]:</p> + +<p>“title”</p> + +<p>test <a href="invalid.html">url but no title</a> +test [urldef]</p> + +<p>[urldef]: some.url ‘title”</p> + +<p>some <a href="with spaces.html" title="title">with spaces</a></p> + +<p>this <a href="occasion.html">is a ‘special’ occasion for /all/ of us</a></p> + +<p>this is <a href="predefined.html">predefined</a> for <a href="uri.html" title="My URI">URI</a></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/reference.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/reference.options new file mode 100644 index 000000000000..efb4b0184caf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/reference.options @@ -0,0 +1,3 @@ +:link_defs: + predefined: [predefined.html] + URI: [uri.html, My URI] diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/reference.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/reference.text new file mode 100644 index 000000000000..9f39fa70ea4d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/01_link/reference.text @@ -0,0 +1,53 @@ +[isurl]: someurl.html + [1]: otherurl.html + +simple [URL][1] and [URL][isurl] + +simple [URL] [1] and [URL] +[isurl] + +simple [1][] and [isurl][] + +simple [1] and [isurl] + +this is [a holy [isurl]] + +no [resolution][] here and [here] + +with a [break in +the text] + + [break in the text]: url.html + +this not \[isurl] and not [isurl\] + +a [Link with_BIG] letters + + [link WITH_big]: letters.html + 'This is the title' + +bad [no URL] d [isurl] + +[no url] invalid.html +[no url]: + +[URL but no title]: invalid.html + + "title" + +test [url but no title] +test [urldef] + +[urldef]: some.url 'title" + + +some [with spaces] + +[with spaces]: with spaces.html "title" + +this [is a 'special' occasion for /all/ of us] + +[is a 'special' occasion for /all/ of us]: occasion.html + + +this is [predefined] for [URI] diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/empty.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/empty.html new file mode 100644 index 000000000000..127e69437a52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/empty.html @@ -0,0 +1,3 @@ +<p>This __is **empty.</p> + +<p>This <em>**</em>is empty.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/empty.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/empty.text new file mode 100644 index 000000000000..c99d053f42c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/empty.text @@ -0,0 +1,3 @@ +This __is **empty. + +This ****is empty. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/errors.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/errors.html new file mode 100644 index 000000000000..e62f03fd1c26 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/errors.html @@ -0,0 +1,9 @@ +<p>This is a *star.</p> + +<p>This is a **star.</p> + +<p>This is <em>*a *star</em>.</p> + +<p>This is *a star*.</p> + +<p>This** is** a star.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/errors.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/errors.text new file mode 100644 index 000000000000..e80e5eb477d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/errors.text @@ -0,0 +1,9 @@ +This is a *star. + +This is a **star. + +This is **a *star*. + +This is *a star\*. + +This** is** a star. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/nesting.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/nesting.html new file mode 100644 index 000000000000..3d34cee16801 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/nesting.html @@ -0,0 +1,41 @@ +<ul> + <li><strong><em>test test</em></strong></li> + <li><strong><em>test test</em></strong></li> + <li><em>test <strong>test</strong></em></li> + <li><strong>test <em>test</em></strong></li> + <li><strong><em>test</em> test</strong></li> + <li><em><strong>test</strong> test</em></li> + <li><strong><em>test</em> test</strong></li> + <li><strong>test <em>test</em></strong></li> + <li><em>test <strong>test</strong></em></li> + <li><em>test <strong>test</strong></em></li> + <li><strong>test <em>test</em></strong></li> + <li><strong><em>test</em> test</strong></li> + <li><em><strong>test</strong> test</em></li> + <li><strong><em>test</em> test</strong></li> + <li><strong>test <em>test</em></strong></li> + <li><em>test <strong>test</strong></em></li> +</ul> +<ul> + <li><em>a</em>b</li> + <li>a<em>b</em></li> + <li>a<em>b</em>c</li> + <li><strong>a</strong>b</li> + <li>a<strong>b</strong></li> + <li>a<strong>b</strong>c</li> +</ul> +<ul> + <li>_a_b</li> + <li>a_b_</li> + <li>a_b_c</li> + <li>__a__b</li> + <li>a__b__</li> + <li>a__b__c</li> + <li>a__2__c</li> + <li>a__2__3</li> + <li>1__2__3</li> +</ul> +<ul> + <li><em>a _b_ c</em></li> + <li><strong>a __b__ c</strong></li> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/nesting.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/nesting.text new file mode 100644 index 000000000000..ba67e84b71b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/nesting.text @@ -0,0 +1,36 @@ +- ***test test*** +- ___test test___ +- *test **test*** +- **test *test*** +- ***test* test** +- ***test** test* +- ***test* test** +- **test *test*** +- *test **test*** +- _test __test___ +- __test _test___ +- ___test_ test__ +- ___test__ test_ +- ___test_ test__ +- __test _test___ +- _test __test___ +^ +- *a*b +- a*b* +- a*b*c +- **a**b +- a**b** +- a**b**c +^ +- _a_b +- a_b_ +- a_b_c +- __a__b +- a__b__ +- a__b__c +- a__2__c +- a__2__3 +- 1__2__3 +^ +- *a _b_ c* +- **a __b__ c** diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/normal.html new file mode 100644 index 000000000000..89774f43e004 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/normal.html @@ -0,0 +1,65 @@ +<p>This <em>is</em> so <strong>hard</strong>.</p> + +<p>This <em>is</em> so <strong>hard</strong> too.</p> + +<p><em>At</em> start +<em>At</em> start</p> + +<p>At <em>end</em> +At <em>end</em></p> + +<p><em>At</em> start +<em>At</em> start</p> + +<p>At <em>end</em> +At <em>end</em></p> + +<p>And <em>nest<strong>ed</strong></em>.</p> + +<p>And <em>nest**ed</em>.</p> + +<p>And *nest<strong>ed* like</strong> this.</p> + +<p>And <em>not_nest_ed</em>.</p> + +<p>And <strong><em>nested</em></strong>.</p> + +<p>And <strong><em>nested</em></strong>.</p> + +<p>And <strong>nest<em>e</em></strong>.</p> + +<p>And lonely * here*.</p> + +<p>And lonely ** here**.</p> + +<p>And <strong>lonely ** here</strong>.</p> + +<p>** and here**.</p> + +<p>And <strong>compli*cated *</strong> here</p> + +<p>Some<em>**what</em> more * <em>**he</em>re</p> + +<p>Do it <em>*this*</em> way +Or this *<em>this</em>* way +Or that <em>*that</em>* way +Or that *<em>that*</em> way</p> + +<p><a href="http://blah.com/blah_%28">http://blah.com/blah_%28</a></p> + +<p><a href="A_-B">A-_B</a></p> + +<ul> + <li><em>test</em></li> + <li>&#8216;<em>test</em>&#8217;</li> + <li>&#8220;<em>test</em>&#8221;</li> + <li>(&#8220;<em>test</em>&#8221;)</li> + <li>(<em>test</em>)</li> + <li>“<em>test</em>”</li> + <li>`<em>test</em>&#8217;</li> + <li>„<em>test</em>“</li> +</ul> + +<p>it&#8211;by design&#8211;<em>cannot have side-effects</em>.</p> + +<p>it&#8212;by design&#8212;<em>cannot have side-effects</em>.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/normal.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/normal.options new file mode 100644 index 000000000000..2e6e0a12061d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/normal.options @@ -0,0 +1 @@ +:entity_output: :numeric diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/normal.text new file mode 100644 index 000000000000..1e04b87a5fc9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/02_emphasis/normal.text @@ -0,0 +1,63 @@ +This *is* so **hard**. + +This _is_ so __hard__ too. + +*At* start +*At* start + +At *end* +At *end* + +_At_ start +_At_ start + +At _end_ +At _end_ + +And *nest**ed***. + +And *nest**ed*. + +And *nest**ed* like** this. + +And *not_nest_ed*. + +And ***nested***. + +And ___nested___. + +And **nest*e***. + +And lonely * here*. + +And lonely ** here**. + +And **lonely ** here**. + +** and here**. + +And **compli*cated \*** here + +Some***what* more * ***he*re + +Do it *\*this\** way +Or this \**this*\* way +Or that *\*that*\* way +Or that \**that\** way + +[http://blah.com/blah_%28](http://blah.com/blah_%28) + +[A-_B](A_-B) + +- _test_ +- '_test_' +- "_test_" +- ("_test_") +- (_test_) +- “_test_” +- \`_test_' +- „_test_“ + +it--by design--_cannot have side-effects_. + +it---by design---_cannot have side-effects_. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/empty.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/empty.html new file mode 100644 index 000000000000..20c505195065 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/empty.html @@ -0,0 +1,5 @@ +<p>This is `` empty.</p> + +<p>This is ``empty.</p> + +<p>This is ````empty.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/empty.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/empty.text new file mode 100644 index 000000000000..cbb91529d49d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/empty.text @@ -0,0 +1,5 @@ +This is `` empty. + +This is ``empty. + +This is ````empty. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/errors.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/errors.html new file mode 100644 index 000000000000..1d341a8f41d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/errors.html @@ -0,0 +1 @@ +<p>Not ended `span.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/errors.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/errors.text new file mode 100644 index 000000000000..7a948b41ea23 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/errors.text @@ -0,0 +1 @@ +Not ended `span. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting-minted.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting-minted.latex new file mode 100644 index 000000000000..a1f84d90cadf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting-minted.latex @@ -0,0 +1,2 @@ +You can say \mintinline{ruby}{x = Class.new}, for example. + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting-minted.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting-minted.options new file mode 100644 index 000000000000..c11ebb6a406d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting-minted.options @@ -0,0 +1 @@ +:syntax_highlighter: minted diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting-minted.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting-minted.text new file mode 100644 index 000000000000..737329093308 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting-minted.text @@ -0,0 +1 @@ +You can say `x = Class.new`{:.language-ruby}, for example. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting.html new file mode 100644 index 000000000000..4294542d80b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting.html @@ -0,0 +1 @@ +<p>You can say <code class="language-ruby highlighter-rouge"><span class="n">x</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span></code>, for example.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting.text new file mode 100644 index 000000000000..737329093308 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/highlighting.text @@ -0,0 +1 @@ +You can say `x = Class.new`{:.language-ruby}, for example. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal-css-class.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal-css-class.html new file mode 100644 index 000000000000..ec21686c429f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal-css-class.html @@ -0,0 +1 @@ +<p>This is a <code class="highlighter-rouge">code-span</code></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal-css-class.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal-css-class.options new file mode 100644 index 000000000000..bfc92f456394 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal-css-class.options @@ -0,0 +1,2 @@ +:syntax_highlighter_opts: + guess_lang: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal-css-class.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal-css-class.text new file mode 100644 index 000000000000..f704439a5e21 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal-css-class.text @@ -0,0 +1 @@ +This is a `code-span` diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal.html new file mode 100644 index 000000000000..6de2257f11d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal.html @@ -0,0 +1,20 @@ +<p>This is <code>a</code> simple span.</p> + +<p>With <code>some&lt;ht&gt;&amp;ml</code> in it.</p> + +<p>And <code>`</code> backticks.</p> + +<p>And <code>``some``</code> more.</p> + +<p>With backslash <code>in\</code> it.</p> + +<p>This is a ` literal backtick. +As `are` these!</p> + +<p>No <code>literal backtick</code>.</p> + +<p><code>something</code></p> + +<p>` `</p> + +<p>a ` `</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal.text new file mode 100644 index 000000000000..c1889595bdd2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/normal.text @@ -0,0 +1,20 @@ +This is `a` simple span. + +With `some<ht>&ml` in it. + +And `` ` `` backticks. + +And ``` ``some`` ``` more. + +With backslash `in\` it. + +This is a ` literal backtick. +As \`are\` these! + +No `` literal backtick``. + +`something` + +` ` + +a ` ` diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/disabled.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/disabled.html new file mode 100644 index 000000000000..7822f7884dea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/disabled.html @@ -0,0 +1 @@ +<p>You can say <code class="language-ruby">Class</code>.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/disabled.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/disabled.options new file mode 100644 index 000000000000..34094e96bbe6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/disabled.options @@ -0,0 +1,4 @@ +:syntax_highlighter: rouge +:syntax_highlighter_opts: + span: + disable: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/disabled.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/disabled.text new file mode 100644 index 000000000000..d958d9149aa9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/disabled.text @@ -0,0 +1 @@ +You can say `Class`{:.language-ruby}. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/simple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/simple.html new file mode 100644 index 000000000000..4294542d80b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/simple.html @@ -0,0 +1 @@ +<p>You can say <code class="language-ruby highlighter-rouge"><span class="n">x</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span></code>, for example.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/simple.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/simple.options new file mode 100644 index 000000000000..9ac61e7e4378 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/simple.options @@ -0,0 +1 @@ +:syntax_highlighter: rouge diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/simple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/simple.text new file mode 100644 index 000000000000..737329093308 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/03_codespan/rouge/simple.text @@ -0,0 +1 @@ +You can say `x = Class.new`{:.language-ruby}, for example. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_inline.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_inline.html new file mode 100644 index 000000000000..cbb88914ac22 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_inline.html @@ -0,0 +1,79 @@ +<p>This is <sup id="fnref:paragraph" role="doc-noteref"><a href="#fn:paragraph" class="footnote" rel="footnote">1</a></sup><sup id="fnref:header" role="doc-noteref"><a href="#fn:header" class="footnote" rel="footnote">2</a></sup><sup id="fnref:blockquote" role="doc-noteref"><a href="#fn:blockquote" class="footnote" rel="footnote">3</a></sup><sup id="fnref:codeblock" role="doc-noteref"><a href="#fn:codeblock" class="footnote" rel="footnote">4</a></sup><sup id="fnref:list" role="doc-noteref"><a href="#fn:list" class="footnote" rel="footnote">5</a></sup><sup id="fnref:table" role="doc-noteref"><a href="#fn:table" class="footnote" rel="footnote">6</a></sup><sup id="fnref:hrule" role="doc-noteref"><a href="#fn:hrule" class="footnote" rel="footnote">7</a></sup><sup id="fnref:mathblock" role="doc-noteref"><a href="#fn:mathblock" class="footnote" rel="footnote">8</a></sup><sup id="fnref:html" role="doc-noteref"><a href="#fn:html" class="footnote" rel="footnote">9</a></sup></p> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:paragraph" role="doc-endnote"> + + <p>A paragraph <a href="#fnref:paragraph" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:header" role="doc-endnote"> + + <h1 id="a-header">A header <a href="#fnref:header" class="reversefootnote" role="doc-backlink">&#8617;</a></h1> + </li> + <li id="fn:blockquote" role="doc-endnote"> + + <blockquote> + <p>blockquote</p> + + <p>paragraph <a href="#fnref:blockquote" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </blockquote> + </li> + <li id="fn:codeblock" role="doc-endnote"> + + <pre><code>codeblock +</code></pre> + <p><a href="#fnref:codeblock" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:list" role="doc-endnote"> + + <ul> + <li>item 1</li> + <li>item 2 + <ul> + <li> + <p>sub item</p> + + <blockquote> + <p>blockquote</p> + + <h1 id="header">header <a href="#fnref:list" class="reversefootnote" role="doc-backlink">&#8617;</a></h1> + </blockquote> + </li> + </ul> + </li> + </ul> + </li> + <li id="fn:table" role="doc-endnote"> + + <table> + <tbody> + <tr> + <td>a</td> + <td>b</td> + </tr> + <tr> + <td>c</td> + <td>d</td> + </tr> + </tbody> + </table> + <p><a href="#fnref:table" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:hrule" role="doc-endnote"> + + <hr /> + <p><a href="#fnref:hrule" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:mathblock" role="doc-endnote"> + +\[x + 2\] + <p><a href="#fnref:mathblock" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:html" role="doc-endnote"> + + <div>test +</div> + <p><a href="#fnref:html" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_inline.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_inline.options new file mode 100644 index 000000000000..ac54fc0de6f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_inline.options @@ -0,0 +1 @@ +footnote_backlink_inline: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_inline.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_inline.text new file mode 100644 index 000000000000..55f94a347711 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_inline.text @@ -0,0 +1,38 @@ +This is [^paragraph][^header][^blockquote][^codeblock][^list][^table][^hrule][^mathblock][^html] + +[^paragraph]: + A paragraph + +[^header]: + # A header + +[^blockquote]: + > blockquote + > + > paragraph + +[^codeblock]: + codeblock + +[^list]: + * item 1 + * item 2 + * sub item + + > blockquote + > + > # header + +[^table]: + | a | b | + | c | d | + +[^hrule]: + *** + +[^mathblock]: + $$x + 2$$ + +[^html]: + <div>test + </div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_text.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_text.html new file mode 100644 index 000000000000..b10570db7521 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_text.html @@ -0,0 +1,9 @@ +<p>Some footnote here<sup id="fnref:fn" role="doc-noteref"><a href="#fn:fn" class="footnote" rel="footnote">1</a></sup></p> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:fn" role="doc-endnote"> + <p>Some text here <a href="#fnref:fn" class="reversefootnote" role="doc-backlink">text &8617; &lt;img /&gt;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_text.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_text.options new file mode 100644 index 000000000000..4c677eff1383 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_text.options @@ -0,0 +1 @@ +:footnote_backlink: 'text &8617; <img />' diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_text.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_text.text new file mode 100644 index 000000000000..41a6f9844974 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/backlink_text.text @@ -0,0 +1,3 @@ +Some footnote here[^fn] + +[^fn]: Some text here diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/definitions.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/definitions.html new file mode 100644 index 000000000000..9012cc069ce1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/definitions.html @@ -0,0 +1,17 @@ +<p>Some para.</p> + +<blockquote> + <p>blockquote</p> +</blockquote> + +<ul> + <li>a list +with some text</li> +</ul> + +<ul> + <li>other list</li> +</ul> +<pre><code>code +</code></pre> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/definitions.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/definitions.latex new file mode 100644 index 000000000000..965653c8ee56 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/definitions.latex @@ -0,0 +1,17 @@ +Some para. + +\begin{quote} +blockquote +\end{quote} + +\begin{itemize} +\item{} a list +with some text +\end{itemize} + +\begin{itemize} +\item{} other list +\end{itemize} +\begin{verbatim}code +\end{verbatim} + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/definitions.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/definitions.text new file mode 100644 index 000000000000..44b52e00bf0e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/definitions.text @@ -0,0 +1,24 @@ +Some para. + +[^footnote]: ignored definition +[^footnote]: Some footnote text + +> blockquote + +[^other]: some + foot + + note text + +* a list + with some text + +[^tnote]: foot note + +* other list +^ + code + +[^1]: + > a blockquote + and some para diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.html new file mode 100644 index 000000000000..7eedecba1eb4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.html @@ -0,0 +1,12 @@ +<p>This is a footnote<sup id="fnref:ab" role="doc-noteref"><a href="#fn:ab" class="footnote" rel="footnote">35</a></sup>. And another<sup id="fnref:bc" role="doc-noteref"><a href="#fn:bc" class="footnote" rel="footnote">36</a></sup>.</p> + +<div class="footnotes" role="doc-endnotes"> + <ol start="35"> + <li id="fn:ab" role="doc-endnote"> + <p>Some text. <a href="#fnref:ab" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:bc" role="doc-endnote"> + <p>Some other text. <a href="#fnref:bc" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.latex new file mode 100644 index 000000000000..8f07dde0a4d7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.latex @@ -0,0 +1,2 @@ +This is a footnote\footnote{Some text.}. And another\footnote{Some other text.}. + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.options new file mode 100644 index 000000000000..f606ecfa7e76 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.options @@ -0,0 +1 @@ +:footnote_nr: 35 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.text new file mode 100644 index 000000000000..cad29357b539 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_nr.text @@ -0,0 +1,4 @@ +This is a footnote[^ab]. And another[^bc]. + +[^ab]: Some text. +[^bc]: Some other text. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_prefix.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_prefix.html new file mode 100644 index 000000000000..4d6cb956f729 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_prefix.html @@ -0,0 +1,12 @@ +<p>This is a<sup id="fnref:adf123-ab" role="doc-noteref"><a href="#fn:adf123-ab" class="footnote" rel="footnote">1</a></sup> footnote<sup id="fnref:adf123-ab:1" role="doc-noteref"><a href="#fn:adf123-ab" class="footnote" rel="footnote">1</a></sup>. And another<sup id="fnref:adf123-bc" role="doc-noteref"><a href="#fn:adf123-bc" class="footnote" rel="footnote">2</a></sup>.</p> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:adf123-ab" role="doc-endnote"> + <p>Some text. <a href="#fnref:adf123-ab" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:adf123-ab:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p> + </li> + <li id="fn:adf123-bc" role="doc-endnote"> + <p>Some other text. <a href="#fnref:adf123-bc" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_prefix.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_prefix.options new file mode 100644 index 000000000000..51d78bc109c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_prefix.options @@ -0,0 +1 @@ +:footnote_prefix: adf123- diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_prefix.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_prefix.text new file mode 100644 index 000000000000..884053e8c1f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/footnote_prefix.text @@ -0,0 +1,4 @@ +This is a[^ab] footnote[^ab]. And another[^bc]. + +[^ab]: Some text. +[^bc]: Some other text. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/inside_footnote.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/inside_footnote.html new file mode 100644 index 000000000000..21c2560406dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/inside_footnote.html @@ -0,0 +1,17 @@ +<p>Lorem ipsum<sup id="fnref:first" role="doc-noteref"><a href="#fn:first" class="footnote" rel="footnote">1</a></sup> dolor sit amet.</p> + +<p>Lorem ipsum<sup id="fnref:second" role="doc-noteref"><a href="#fn:second" class="footnote" rel="footnote">2</a></sup> dolor sit amet.</p> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:first" role="doc-endnote"> + <p>Consecutur adisping.<sup id="fnref:third" role="doc-noteref"><a href="#fn:third" class="footnote" rel="footnote">3</a></sup> <a href="#fnref:first" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:second" role="doc-endnote"> + <p>Sed ut perspiciatis unde omnis. <a href="#fnref:second" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:third" role="doc-endnote"> + <p>Sed ut. <a href="#fnref:third" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/inside_footnote.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/inside_footnote.text new file mode 100644 index 000000000000..f4f91e93989c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/inside_footnote.text @@ -0,0 +1,9 @@ +Lorem ipsum[^first] dolor sit amet. + +Lorem ipsum[^second] dolor sit amet. + +[^first]: Consecutur adisping.[^third] + +[^second]: Sed ut perspiciatis unde omnis. + +[^third]: Sed ut. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.html new file mode 100644 index 000000000000..0c103f48b8c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.html @@ -0,0 +1,46 @@ +<p>This is some *ref.<sup id="fnref:fn" role="doc-noteref"><a href="#fn:fn" class="footnote" rel="footnote">1</a></sup></p> + +<blockquote> + <p>a blockquote <sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">2</a></sup></p> +</blockquote> + +<ul> + <li>and a list item <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">3</a></sup></li> +</ul> + +<h1>And a header<sup id="fnref:now" role="doc-noteref"><a href="#fn:now" class="footnote" rel="footnote">4</a></sup></h1> + +<p>A marker without a definition [^without].</p> + +<p>A marker <sup id="fnref:empty" role="doc-noteref"><a href="#fn:empty" class="footnote" rel="footnote">5</a></sup> used twice<sup id="fnref:fn:1" role="doc-noteref"><a href="#fn:fn" class="footnote" rel="footnote">1</a></sup> and thrice<sup id="fnref:fn:2" role="doc-noteref"><a href="#fn:fn" class="footnote" rel="footnote">1</a></sup>.</p> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:fn" role="doc-endnote"> + <p>Some foot note text&nbsp;<a href="#fnref:fn" class="reversefootnote" role="doc-backlink">&#8617;</a>&nbsp;<a href="#fnref:fn:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a>&nbsp;<a href="#fnref:fn:2" class="reversefootnote" role="doc-backlink">&#8617;<sup>3</sup></a></p> + </li> + <li id="fn:3" role="doc-endnote"> + <p>other text +with more lines</p> + + <blockquote> + <p>and a quote</p> + </blockquote> + <p><a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:1" role="doc-endnote"> + <p>some <em>text</em>&nbsp;<a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:now" role="doc-endnote"> + + <pre><code>code block +continued here +</code></pre> + <p><a href="#fnref:now" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + <li id="fn:empty" role="doc-endnote"> + + <p><a href="#fnref:empty" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.latex new file mode 100644 index 000000000000..8f406b8665df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.latex @@ -0,0 +1,23 @@ +This is some *ref.\footnote{Some foot note text} + +\begin{quote} +a blockquote \footnote{other text +with more lines + +\begin{quote} +and a quote +\end{quote}} +\end{quote} + +\begin{itemize} +\item{} and a list item \footnote{some \emph{text}} +\end{itemize} + +\section*{And a header\footnote{\begin{verbatim}code block +continued here +\end{verbatim}}} + +A marker without a definition {[}\^{}without{]}. + +A marker \footnote{} used twice\footnote{Some foot note text} and thrice\footnote{Some foot note text}. + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.options new file mode 100644 index 000000000000..5cfe2502a82a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.options @@ -0,0 +1,2 @@ +:auto_ids: false +:entity_output: :symbolic diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.text new file mode 100644 index 000000000000..42b77fb54430 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/markers.text @@ -0,0 +1,27 @@ +This is some *ref.[^fn] + +[^fn]: Some foot note text +{: .class} + +> a blockquote [^3] + +* and a list item [^1] + +# And a header[^now] + +[^1]:some *text* +[^3]: other text + with more lines + + > and a quote + +A marker without a definition [^without]. + +A marker [^empty] used twice[^fn] and thrice[^fn]. + +[^now]: + + code block + continued here + +[^empty]: diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/placement.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/placement.html new file mode 100644 index 000000000000..9acf8a019bc4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/placement.html @@ -0,0 +1,11 @@ +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:1" role="doc-endnote"> + <p>Footnote \` text&#160;<a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> + +<p>Some para with a<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> footnote.</p> + +<p>And another para.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/placement.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/placement.options new file mode 100644 index 000000000000..2e6e0a12061d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/placement.options @@ -0,0 +1 @@ +:entity_output: :numeric diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/placement.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/placement.text new file mode 100644 index 000000000000..97c0ab1a0889 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/placement.text @@ -0,0 +1,8 @@ +* footnotes will be placed here +{:footnotes} + +Some para with a[^1] footnote. + +[^1]: Footnote \\\` text + +And another para. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/regexp_problem.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/regexp_problem.html new file mode 100644 index 000000000000..ff1b3203e0e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/regexp_problem.html @@ -0,0 +1,14 @@ +<h1>Something</h1> +<p>something<sup id="fnref:note1" role="doc-noteref"><a href="#fn:note1" class="footnote" rel="footnote">1</a></sup>.</p> + +<h1>Footnotes</h1> + +<h1>Test</h1> +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:note1" role="doc-endnote"> + + <p>A note&nbsp;<a href="#fnref:note1" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/regexp_problem.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/regexp_problem.options new file mode 100644 index 000000000000..5cfe2502a82a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/regexp_problem.options @@ -0,0 +1,2 @@ +:auto_ids: false +:entity_output: :symbolic diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/regexp_problem.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/regexp_problem.text new file mode 100644 index 000000000000..6a60c6126495 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/regexp_problem.text @@ -0,0 +1,52 @@ +# Something +something[^note1]. + +# Footnotes +[^note1]: + A note + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Test diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/without_backlink.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/without_backlink.html new file mode 100644 index 000000000000..77f8e0d5b0ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/without_backlink.html @@ -0,0 +1,9 @@ +<p>Some footnote here<sup id="fnref:fn" role="doc-noteref"><a href="#fn:fn" class="footnote" rel="footnote">1</a></sup></p> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:fn" role="doc-endnote"> + <p>Some text here</p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/without_backlink.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/without_backlink.options new file mode 100644 index 000000000000..0512dd6da03f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/without_backlink.options @@ -0,0 +1 @@ +:footnote_backlink: '' diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/without_backlink.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/without_backlink.text new file mode 100644 index 000000000000..41a6f9844974 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/04_footnote/without_backlink.text @@ -0,0 +1,3 @@ +Some footnote here[^fn] + +[^fn]: Some text here diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/across_lines.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/across_lines.html new file mode 100644 index 000000000000..e7cec40f8080 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/across_lines.html @@ -0,0 +1 @@ +<p>Link: <a href="test foo">test</a></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/across_lines.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/across_lines.text new file mode 100644 index 000000000000..8f39d9599eb4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/across_lines.text @@ -0,0 +1,2 @@ +Link: <a href="test +foo">test</a> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/button.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/button.html new file mode 100644 index 000000000000..c49bb52f695a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/button.html @@ -0,0 +1,7 @@ +<p><button>Some Text</button></p> + +<p>First some text and then a <button>here</button></p> + +<p><button>A button</button> and then text.</p> + +<p>A <button>with <strong>some</strong> <code>code</code> in <img src="image.png" alt="alt" /></button> it.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/button.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/button.text new file mode 100644 index 000000000000..e0a7783c808c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/button.text @@ -0,0 +1,7 @@ +<button>Some Text</button> + +First some text and then a <button>here</button> + +<button>A button</button> and then text. + +A <button>with **some** `code` in ![alt](image.png)</button> it. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/invalid.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/invalid.html new file mode 100644 index 000000000000..030552fc8660 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/invalid.html @@ -0,0 +1 @@ +<p>This is <span>some text</span></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/invalid.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/invalid.text new file mode 100644 index 000000000000..383f0a83f6d2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/invalid.text @@ -0,0 +1 @@ +This is <span>some text diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/link_with_mailto.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/link_with_mailto.html new file mode 100644 index 000000000000..7d0d6ad6a44a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/link_with_mailto.html @@ -0,0 +1 @@ +<p>Link: <a href="mailto:test@example.com">text</a></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/link_with_mailto.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/link_with_mailto.text new file mode 100644 index 000000000000..fb01619621ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/link_with_mailto.text @@ -0,0 +1 @@ +Link: <a href="mailto:test@example.com">text</a> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/mark_element.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/mark_element.html new file mode 100644 index 000000000000..b6989b7f281c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/mark_element.html @@ -0,0 +1,3 @@ +<p>Lorem ipsum.</p> + +<p><mark>Test</mark></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/mark_element.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/mark_element.text new file mode 100644 index 000000000000..6ae30e039c9f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/mark_element.text @@ -0,0 +1,3 @@ +Lorem ipsum. + +<mark>Test</mark> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/markdown_attr.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/markdown_attr.html new file mode 100644 index 000000000000..44158c3b9ee7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/markdown_attr.html @@ -0,0 +1,6 @@ +<p>This is <span><em>text</em></span> +This is <span>*text*</span> +This is <span><em>text</em></span> +This is <span><em>text</em></span> +This is <span>*nothing* <strong>to <em>fear</em></strong> about</span>. +This is <span>&lt;http://example.com&gt;</span>.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/markdown_attr.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/markdown_attr.text new file mode 100644 index 000000000000..dcc10ff83544 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/markdown_attr.text @@ -0,0 +1,6 @@ +This is <span markdown="1">*text*</span> +This is <span markdown="0">*text*</span> +This is <span markdown="span">*text*</span> +This is <span markdown="block">*text*</span> +This is <span markdown="0">*nothing* <strong markdown="1">to *fear*</strong> about</span>. +This is <span markdown="0"><http://example.com></span>. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/normal.html new file mode 100644 index 000000000000..3cdc646df002 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/normal.html @@ -0,0 +1,43 @@ +<p>Empty <a name="anchor" id="anchor" class=""></a>!</p> + +<p><a href="test">title</a> is a title.</p> + +<p>This is &lt;? a PI ?&gt;.</p> + +<p>This is <!-- a --> comment.</p> + +<p>This is <!-- a +--> multiline comment.</p> + +<p>This is <span>tag +now </span>.</p> + +<p>This is <span>tag +</span> now.</p> + +<p>This is an empty <span></span> tag.</p> + +<p>This is <em>something<span test="do_it"></span> strange</em>.</p> + +<p>Auto-closing: <br /></p> + +<p>Expanding: <textarea></textarea></p> + +<p>An invalid tag: &lt;hR&gt;</p> + +<p>A &lt;p&gt;block tag&lt;/p&gt;.</p> + +<p>An invalid &lt;/closing&gt; tag.</p> + +<p>A <script>*not*</script> tag.</p> + +<p>An <span>unclosed <em>tag.</em></span></p> + +<p>Some <code>element with | pipe symbol</code></p> + +<p>Some <span><code>element with | pipe symbol</code></span></p> + +<p>Some <code>element with | pipe +symbol|</code></p> + +<p><u>underlined</u></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/normal.text new file mode 100644 index 000000000000..0156d7c05bd5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/normal.text @@ -0,0 +1,43 @@ +Empty <a NaMe="anchor" ID="anchor" cLaSs></A>! + +<a href="test">title</a> is a title. + +This is <? a PI ?>. + +This is <!-- a --> comment. + +This is <!-- a +--> multiline comment. + +This is <span>tag +now </span>. + +This is <sPAn>tag +</SPAN> now. + +This is an empty <span></span> tag. + +This is _something<span test="do_it" /> strange_. + +Auto-closing: <br> + +Expanding: <textarea></textarea> + +An invalid tag: <hR> + +A <p>block tag</p>. + +An invalid </closing> tag. + +A <script>*not*</script> tag. + +An <span>unclosed *tag.* + +Some <code>element with | pipe symbol</code> + +Some <span><code>element with | pipe symbol</code></span> + +Some <code>element with | pipe +symbol|</code> + +<u>underlined</u> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/raw_span_elements.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/raw_span_elements.html new file mode 100644 index 000000000000..808f1dbf3aa6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/raw_span_elements.html @@ -0,0 +1,2 @@ +<p>This is raw <kbd>--version</kbd> and <samp>--version</samp> and <var>--version</var> and +<code>---version</code>.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/raw_span_elements.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/raw_span_elements.text new file mode 100644 index 000000000000..5b128fcbe9c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/raw_span_elements.text @@ -0,0 +1,2 @@ +This is raw <kbd>--version</kbd> and <samp>--version</samp> and <var>--version</var> and +<code>---version</code>. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/xml.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/xml.html new file mode 100644 index 000000000000..00b43c12478a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/xml.html @@ -0,0 +1,5 @@ +<p>This <some:url name:spac="hallo">doit</some:url> test</p> + +<p>This <SoMe:UrL NamE:SpAC="test">doit</SoMe:UrL> test</p> + +<p>This <SoMe>doit&lt;/some&gt; test</SoMe></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/xml.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/xml.text new file mode 100644 index 000000000000..bc234de42bdf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/05_html/xml.text @@ -0,0 +1,5 @@ +This <some:url name:spac='hallo'>doit</some:url> test + +This <SoMe:UrL NamE:SpAC='test'>doit</SoMe:UrL> test + +This <SoMe>doit</some> test diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev.html new file mode 100644 index 000000000000..f247c538da78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev.html @@ -0,0 +1,21 @@ +<p>This <abbr title="It is, yes">is some</abbr> text.</p> + +<p>There <em><abbr title="It is, yes">is some</abbr> real</em> concern about <abbr title="This &amp; that">OtHeR!</abbr></p> + +<p><abbr title="It is, yes">is some</abbr> Think <abbr>empty</abbr> about <abbr title="Very nice country">Oesterreich</abbr>. <abbr title="Cascading">CSS</abbr> und <abbr title="Cascading 3">CSS3</abbr></p> + +<p>no abbrev here because there is someone and kulis some</p> + +<ul> + <li><abbr title="(eXtensible) HyperText Markup Language">(X)HTML</abbr> test</li> + <li>line two</li> +</ul> + +<p><a href="http://en.wikipedia.org/wiki/Xhtml"><abbr title="(eXtensible) HyperText Markup Language">(X)HTML</abbr></a></p> + +<ul> + <li>test <abbr title="(eXtensible) HyperText Markup Language">(X)HTML</abbr></li> +</ul> + +<p>This is <abbr class="testit test" title="Some text here">awesome</abbr>.</p> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev.text new file mode 100644 index 000000000000..1aa8100c5979 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev.text @@ -0,0 +1,34 @@ +This is some text. + +*[is some]: Yes it is +*[OtHeR!]: This & that + +*[is some]: It is, yes +*[empty]: + +There *is some real* concern about OtHeR! + +is some Think empty about Oesterreich. CSS und CSS3 + +no abbrev here because there is someone and kulis some + +*[Oesterreich]: Very nice country + +*[CSS]: Cascading +*[CSS3]: Cascading 3 + +* (X)HTML test +* line two + +[(X)HTML](http://en.wikipedia.org/wiki/Xhtml) + +* test (X)HTML + +*[(X)HTML]: (eXtensible) HyperText Markup Language + + +This is awesome. + +{:.testit} +*[awesome]: Some text here +{:.test} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_defs.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_defs.html new file mode 100644 index 000000000000..108fcfcea836 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_defs.html @@ -0,0 +1,2 @@ +<pre><code>*[4]: noabbrev +</code></pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_defs.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_defs.text new file mode 100644 index 000000000000..3f3a0e5b6d0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_defs.text @@ -0,0 +1,5 @@ +*[ABBR]: Some abbreviations + *[one abbr]: one abbrev + *[2 and other]: another + *[3]: yet another + *[4]: noabbrev diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_in_html.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_in_html.html new file mode 100644 index 000000000000..6da3ca4ed246 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_in_html.html @@ -0,0 +1,9 @@ +<p>This is <em>some <abbr title="This Escapes SVG Text.">TEST</abbr></em> to check.</p> + +<svg width="100" height="30" viewBox="0 0 100 30" xmlns="http://www.w3.org/2000/svg"> + <text x="20" y="20">This TEST fails.</text> +</svg> +<svg width="100" height="30" viewBox="0 0 100 30" xmlns="http://www.w3.org/2000/svg"> + <text x="20" y="20">This <abbr title="This Escapes SVG Text.">TEST</abbr> fails.</text> +</svg> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_in_html.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_in_html.text new file mode 100644 index 000000000000..e0a0e88142f3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/abbrev_in_html.text @@ -0,0 +1,10 @@ +This is <em>some TEST</em> to check. + +<svg width="100" height="30" viewBox="0 0 100 30" xmlns="http://www.w3.org/2000/svg"> + <text x="20" y="20">This TEST fails.</text> +</svg> +<svg width="100" height="30" viewBox="0 0 100 30" xmlns="http://www.w3.org/2000/svg"> + <text x="20" y="20" markdown="span">This TEST fails.</text> +</svg> + +*[TEST]: This Escapes SVG Text. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/in_footnote.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/in_footnote.html new file mode 100644 index 000000000000..4b6a97f846f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/in_footnote.html @@ -0,0 +1,9 @@ +<p>There is a <abbr title="Text File">TXT</abbr> file here. <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p> + +<div class="footnotes" role="doc-endnotes"> + <ol> + <li id="fn:1" role="doc-endnote"> + <p>A <abbr title="Text File">TXT</abbr> file. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p> + </li> + </ol> +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/in_footnote.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/in_footnote.text new file mode 100644 index 000000000000..e7709cb96df9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/abbreviations/in_footnote.text @@ -0,0 +1,5 @@ +There is a TXT file here. [^1] + +*[TXT]: Text File + +[^1]: A TXT file. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/autolinks/url_links.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/autolinks/url_links.html new file mode 100644 index 000000000000..90eae7d58d0e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/autolinks/url_links.html @@ -0,0 +1,15 @@ +<p>This should be a <a href="http://www.example.com/">http://www.example.com/</a> link. +This should be a <a href="mailto:john.doe@example.com">john.doe@example.com</a> link. +As should <a href="mailto:john.doe@example.com">john.doe@example.com</a> this. +As should <a href="mailto:john_doe@example.com">john_doe@example.com</a> this. +As should <a href="mailto:CSS@example.com"><abbr title="Cascading">CSS</abbr>@example.com</a> this. +Another ampersand <a href="http://www.example.com/?doit&amp;x=y">http://www.example.com/?doit&amp;x=y</a> link. +More entities <a href="http://www.example.com/?doit&amp;x=&quot;y&amp;z=y">http://www.example.com/?doit&amp;x=&quot;y&amp;z=y</a>.</p> + +<p>Email international <a href="mailto:übung@macht.den.meister.de">übung@macht.den.meister.de</a>, <a href="mailto:ü.äß@hülse.de">ü.äß@hülse.de</a> +Email invalid: &lt;<a href="mailtos:me@example.com">me@example.com</a>&gt;</p> + +<p>Autolink with underscore: <a href="http://www.example.com/with_under_score">http://www.example.com/with_under_score</a></p> + +<p><a href="http://www.example.com/">http://www.example.com/</a></p> + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/autolinks/url_links.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/autolinks/url_links.text new file mode 100644 index 000000000000..033e8af43bd4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/autolinks/url_links.text @@ -0,0 +1,16 @@ +This should be a <http://www.example.com/> link. +This should be a <mailto:john.doe@example.com> link. +As should <john.doe@example.com> this. +As should <john_doe@example.com> this. +As should <CSS@example.com> this. +Another ampersand <http://www.example.com/?doit&x=y> link. +More entities <http://www.example.com/?doit&amp;x=&quot;y&z=y>. + +Email international <übung@macht.den.meister.de>, <ü.äß@hülse.de> +Email invalid: <[me@example.com](mailtos:me@example.com)> + +Autolink with underscore: <http://www.example.com/with_under_score> + +<http://www.example.com/> + +*[CSS]: Cascading diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/escaped_chars/normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/escaped_chars/normal.html new file mode 100644 index 000000000000..015d5948281c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/escaped_chars/normal.html @@ -0,0 +1,47 @@ +<p>\</p> + +<p>.</p> + +<p>*</p> + +<p>_</p> + +<p>+</p> + +<p>-</p> + +<p>`</p> + +<p>(</p> + +<p>)</p> + +<p>[</p> + +<p>]</p> + +<p>{</p> + +<p>}</p> + +<p>#</p> + +<p>!</p> + +<p>&lt;&lt;</p> + +<p>&gt;&gt;</p> + +<p>:</p> + +<p>|</p> + +<p>"</p> + +<p>'</p> + +<p>=</p> + +<p>&gt;</p> + +<p>&lt;</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/escaped_chars/normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/escaped_chars/normal.text new file mode 100644 index 000000000000..1c47104acf3d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/escaped_chars/normal.text @@ -0,0 +1,47 @@ +\\ + +\. + +\* + +\_ + +\+ + +\- + +\` + +\( + +\) + +\[ + +\] + +\{ + +\} + +\# + +\! + +\<< + +\>> + +\: + +\| + +\" + +\' + +\= + +\> + +\< diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/comment.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/comment.html new file mode 100644 index 000000000000..3544d49fb79c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/comment.html @@ -0,0 +1,6 @@ +<p>This is a <!-- simple --> paragraph. +This is a <!-- simple --> paragraph. +This is a <!-- simple {:/other} paragraph -->. +This is a paragraph. +This is a {:/comment} simple {:/} paragraph. +This is a {::comment} paragraph.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/comment.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/comment.text new file mode 100644 index 000000000000..8b9e8d362de1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/comment.text @@ -0,0 +1,6 @@ +This is a {::comment}simple{:/} paragraph. +This is a {::comment}simple{:/comment} paragraph. +This is a {::comment}simple {:/other} paragraph{:/comment}. +This is a {::comment/} paragraph. +This is a {:/comment} simple {:/} paragraph. +This is a {::comment} paragraph. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/ignored.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/ignored.html new file mode 100644 index 000000000000..63c2c404c698 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/ignored.html @@ -0,0 +1 @@ +<p>This is {::something}paragraph{:/}</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/ignored.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/ignored.text new file mode 100644 index 000000000000..a7e77375f9f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/ignored.text @@ -0,0 +1 @@ +This is {::something}paragraph{:/} diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/nomarkdown.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/nomarkdown.html new file mode 100644 index 000000000000..83de93125f48 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/nomarkdown.html @@ -0,0 +1 @@ +<p>This is *some* text.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/nomarkdown.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/nomarkdown.text new file mode 100644 index 000000000000..57c4b38fd63f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/nomarkdown.text @@ -0,0 +1 @@ +This is {::nomarkdown}*some*{:/} text. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/options.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/options.html new file mode 100644 index 000000000000..48e3076a96db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/options.html @@ -0,0 +1 @@ +<p>This is an option <span>*true*</span>!</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/options.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/options.text new file mode 100644 index 000000000000..e289491ef752 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/extension/options.text @@ -0,0 +1 @@ +This is an {::options parse_span_html="false" /} option <span>*true*</span>! diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/ial/simple.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/ial/simple.html new file mode 100644 index 000000000000..c0f3a4757bf0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/ial/simple.html @@ -0,0 +1,6 @@ +<p>This is a <code class="hund" id="dog">span</code>.</p> + +<p>This is a <code class="hund katz" id="dog" key="val">span</code>.</p> + +<p>This is an{: .ignored} span ial. +This is an{: .escaped} span ial.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/ial/simple.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/ial/simple.text new file mode 100644 index 000000000000..8945602b21d7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/ial/simple.text @@ -0,0 +1,6 @@ +This is a `span`{: .hund #dog}. + +This is a `span`{: .hund #dog}{: .katz key='val'}. + +This is an{: .ignored} span ial. +This is an\{: .escaped} span ial. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/line_breaks/normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/line_breaks/normal.html new file mode 100644 index 000000000000..11066a509f33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/line_breaks/normal.html @@ -0,0 +1,11 @@ +<p>This is a line<br /> +with a line break.</p> + +<p>This is a line +without a line break.</p> + +<p>This is a line <br /> +with a line\ <br /> +break.</p> + +<p>Line break on last line.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/line_breaks/normal.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/line_breaks/normal.latex new file mode 100644 index 000000000000..a62ff56167e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/line_breaks/normal.latex @@ -0,0 +1,12 @@ +This is a line\newline +with a line break. + +This is a line +without a line break. + +This is a line \newline +with a line\textbackslash{} \newline +break. + +Line break on last line. + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/line_breaks/normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/line_breaks/normal.text new file mode 100644 index 000000000000..92f866f2e18d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/line_breaks/normal.text @@ -0,0 +1,11 @@ +This is a line +with a line break. + +This is a line +without a line break. + +This is a line \\ +with a line\\ +break. + +Line break on last line. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/no_engine.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/no_engine.html new file mode 100644 index 000000000000..3b93c542fbd2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/no_engine.html @@ -0,0 +1 @@ +<p><span class="kdmath">$5+5$</span> inline math</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/no_engine.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/no_engine.options new file mode 100644 index 000000000000..06d559e5459d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/no_engine.options @@ -0,0 +1 @@ +:math_engine: ~ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/no_engine.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/no_engine.text new file mode 100644 index 000000000000..a22f9fd4585b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/no_engine.text @@ -0,0 +1 @@ +$$5+5$$ inline math diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/normal.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/normal.html new file mode 100644 index 000000000000..459d03f3b53f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/normal.html @@ -0,0 +1,10 @@ +<p>This is \(\lambda_\alpha &gt; 5\) some math. With \(1 ++ 1\) new line characters in between.</p> + +<p>\(5+5\) inline math, $5.00 $$no math$$</p> + +<p>$$5+5$$ inline math</p> + +<p>\(5+5\)</p> + +<p>$$5+5$$</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/normal.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/normal.text new file mode 100644 index 000000000000..e37a00789293 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/math/normal.text @@ -0,0 +1,10 @@ +This is $$\lambda_\alpha > 5$$ some math. With $$1 ++ 1$$ new line characters in between. + +$$5+5$$ inline math, $5.00 \$$no math$$ + +\$\$5+5$$ inline math + +\$$5+5$$ + +\$\$5+5$$ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities.html new file mode 100644 index 000000000000..21a290336c0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities.html @@ -0,0 +1,6 @@ +<p>This is the A&amp;O. &copy; 2008 by me +As well \&amp; as this. Some &#343; other +values may &#xAF; may also show but +not st. like &amp;#xYZ;.</p> + +<p>This &lt;span&gt; is BS&amp;T; done!</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities.options new file mode 100644 index 000000000000..036c561983f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities.options @@ -0,0 +1 @@ +:entity_output: :as_input diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities.text new file mode 100644 index 000000000000..7ef42c7b0aa5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities.text @@ -0,0 +1,6 @@ +This is the A&O. &copy; 2008 by me +As well \& as this. Some &#343; other +values may &#xAF; may also show but +not st. like &#xYZ;. + +This &lt;span&gt; is BS&T; done! diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_char.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_char.html new file mode 100644 index 000000000000..ed2817bbeb77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_char.html @@ -0,0 +1 @@ +<p>This "is" 'the' A&amp;O. © 2008 by me ŗ and λ</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_char.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_char.options new file mode 100644 index 000000000000..32a751e36ff0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_char.options @@ -0,0 +1,2 @@ +:entity_output: :as_char +:smart_quotes: apos,apos,quot,quot diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_char.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_char.text new file mode 100644 index 000000000000..279b51152385 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_char.text @@ -0,0 +1 @@ +This "is" 'the' A&O. &copy; 2008 by me &#343; and &#x3bb; diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_input.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_input.html new file mode 100644 index 000000000000..d2eec9dd614f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_input.html @@ -0,0 +1 @@ +<p>This is the A&amp;O. &copy; 2008 by me &#343; and &#x3bb;</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_input.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_input.options new file mode 100644 index 000000000000..036c561983f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_input.options @@ -0,0 +1 @@ +:entity_output: :as_input diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_input.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_input.text new file mode 100644 index 000000000000..1ddf7cdd9214 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_as_input.text @@ -0,0 +1 @@ +This is the A&O. &copy; 2008 by me &#343; and &#x3bb; diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_numeric.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_numeric.html new file mode 100644 index 000000000000..d04613ee95d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_numeric.html @@ -0,0 +1 @@ +<p>This is the A&amp;O. &#169; 2008 by me &#343; and &#955;</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_numeric.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_numeric.options new file mode 100644 index 000000000000..2e6e0a12061d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_numeric.options @@ -0,0 +1 @@ +:entity_output: :numeric diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_numeric.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_numeric.text new file mode 100644 index 000000000000..1ddf7cdd9214 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_numeric.text @@ -0,0 +1 @@ +This is the A&O. &copy; 2008 by me &#343; and &#x3bb; diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_symbolic.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_symbolic.html new file mode 100644 index 000000000000..258ba147a400 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_symbolic.html @@ -0,0 +1 @@ +<p>This is the A&amp;O. &copy; 2008 by me &#343; and &lambda;</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_symbolic.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_symbolic.options new file mode 100644 index 000000000000..c195785fba1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_symbolic.options @@ -0,0 +1 @@ +:entity_output: :symbolic diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_symbolic.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_symbolic.text new file mode 100644 index 000000000000..1ddf7cdd9214 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/entities_symbolic.text @@ -0,0 +1 @@ +This is the A&O. &copy; 2008 by me &#343; and &#x3bb; diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/greaterthan.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/greaterthan.html new file mode 100644 index 000000000000..dcce4cc381cf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/greaterthan.html @@ -0,0 +1 @@ +<p>2 &gt; 1 &gt; 0</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/greaterthan.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/greaterthan.text new file mode 100644 index 000000000000..7dfb7f123cb3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/greaterthan.text @@ -0,0 +1 @@ +2 > 1 > 0 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/lowerthan.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/lowerthan.html new file mode 100644 index 000000000000..8ebac2370672 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/lowerthan.html @@ -0,0 +1 @@ +<p>0 &lt; 1 &lt; 2</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/lowerthan.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/lowerthan.text new file mode 100644 index 000000000000..038df8bb46a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/lowerthan.text @@ -0,0 +1 @@ +0 < 1 < 2 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography.html new file mode 100644 index 000000000000..02d1dbce2e46 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography.html @@ -0,0 +1,40 @@ +<p>This is&hellip; something&mdash;this too&ndash;!</p> + +<p>This &laquo;is&raquo; some text, &laquo;&nbsp;this&nbsp;&raquo; too!</p> + +<p>&ldquo;Fancy quotes&rdquo; are &lsquo;cool&rsquo;, even in the &rsquo;80s! +Je t&rsquo; aime. You&rsquo;re a funny one! Thomas&rsquo; name +Mark&rsquo;s name. &ldquo;&hellip;you&rdquo; +&ldquo;&lsquo;Nested&rsquo; quotes are &lsquo;possible&rsquo;&rdquo;, too! +&lsquo;&ldquo;Otherway&rdquo; is &ldquo;round&rdquo;&rsquo;!</p> + +<p>&lsquo;Opening now!&rsquo;</p> + +<p>&rsquo;80s are really cool.</p> + +<p><em>Cluster</em>&rsquo;s Last Stand.</p> + +<p>Nam liber tempor +&ldquo;&hellip;At vero eos et accusam&rdquo;</p> + +<p>&ldquo;<em>Single underscores</em> should work.&rdquo;</p> + +<p>&ldquo;<em>Single asterisks</em> should work.&rdquo;</p> + +<p>&lsquo;<strong>Double underscores</strong> should work.&rsquo;</p> + +<p>&lsquo;<strong>Double asterisks</strong> should work.&rsquo;</p> + +<p>&ldquo;<em>Hurrah!</em>&rdquo;</p> + +<p>&lsquo;<strong>Absolutely</strong>.&rsquo;</p> + +<p>&ldquo;&hellip;some Text&rdquo;</p> + +<p>&ldquo;&hellip; some Text&rdquo;</p> + +<p>This: &ldquo;&hellip;some Text&rdquo;</p> + +<p>This: &ldquo;&hellip; some Text&rdquo;</p> + +<p>&rdquo;[foo]&rdquo; &ldquo;[foo]&rdquo; d &ldquo;[foo]&rdquo;</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography.options new file mode 100644 index 000000000000..4f1c17c63e10 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography.options @@ -0,0 +1 @@ +:entity_output: symbolic diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography.text new file mode 100644 index 000000000000..27e090e902b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography.text @@ -0,0 +1,40 @@ +This is... something---this too--! + +This <<is>> some text, << this >> too! + +"Fancy quotes" are 'cool', even in the '80s! +Je t' aime. You're a funny one! Thomas' name +Mark's name. "...you" +"'Nested' quotes are 'possible'", too! +'"Otherway" is "round"'! + +'Opening now!' + +'80s are really cool. + +<em>Cluster</em>'s Last Stand. + +Nam liber tempor +"...At vero eos et accusam" + +"_Single underscores_ should work." + +"*Single asterisks* should work." + +'__Double underscores__ should work.' + +'**Double asterisks** should work.' + +"_Hurrah!_" + +'__Absolutely__.' + +"...some Text" + +"... some Text" + +This: "...some Text" + +This: "... some Text" + +"\[foo]" "\[foo]" d "\[foo]" diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.html new file mode 100644 index 000000000000..4a6c2260d8ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.html @@ -0,0 +1,3 @@ +<p>This ... something---this too--!</p> + +<p>This &lt;&lt;is&gt;&gt; some text, &lt;&lt; this &gt;&gt; too!</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.latex b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.latex new file mode 100644 index 000000000000..c7d9ba59a425 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.latex @@ -0,0 +1,4 @@ +This ... something---this too--! + +This \textless{}\textless{}is\textgreater{}\textgreater{} some text, \textless{}\textless{} this \textgreater{}\textgreater{} too! + diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.options new file mode 100644 index 000000000000..d0a031322dbd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.options @@ -0,0 +1,8 @@ +typographic_symbols: + hellip: '...' + mdash: '---' + ndash: '--' + laquo: '<<' + raquo: '>>' + laquo_space: '<< ' + raquo_space: ' >>' diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.text new file mode 100644 index 000000000000..a3d59b378622 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-2.3.1/test/testcases/span/text_substitutions/typography_subst.text @@ -0,0 +1,3 @@ +This ... something---this too--! + +This <<is>> some text, << this >> too! diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/CONTRIBUTERS b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/CONTRIBUTERS new file mode 100644 index 000000000000..262ad48ceecd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/CONTRIBUTERS @@ -0,0 +1,4 @@ +Count Name +======= ==== + 15 Ashwin Maroli <ashmaroli@gmail.com> + 5 Thomas Leitner <t_leitner@gmx.at> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/COPYING b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/COPYING new file mode 100644 index 000000000000..417fb2ce4fba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/COPYING @@ -0,0 +1,21 @@ +kramdown-parser-gfm +Copyright (C) 2019 Thomas Leitner <t_leitner@gmx.at> + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/VERSION b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/VERSION new file mode 100644 index 000000000000..9084fa2f716a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/VERSION @@ -0,0 +1 @@ +1.1.0 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/lib/kramdown-parser-gfm.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/lib/kramdown-parser-gfm.rb new file mode 100644 index 000000000000..3861bcaaab9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/lib/kramdown-parser-gfm.rb @@ -0,0 +1,10 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown-parser-gfm which is licensed under the MIT. +#++ +# + +require_relative 'kramdown/parser/gfm' diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/lib/kramdown/parser/gfm.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/lib/kramdown/parser/gfm.rb new file mode 100644 index 000000000000..c803e12e4b9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/lib/kramdown/parser/gfm.rb @@ -0,0 +1,220 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown-parser-gfm which is licensed under the MIT. +#++ +# + +require 'kramdown/options' +require 'kramdown/parser/kramdown' + +require_relative 'gfm/options' + +module Kramdown + module Parser + + # This class provides a parser implementation for the GFM dialect of Markdown. + class GFM < Kramdown::Parser::Kramdown + + VERSION = '1.1.0' + + attr_reader :paragraph_end + + def initialize(source, options) + super + @options[:auto_id_stripping] = true + @id_counter = Hash.new(-1) + + @span_parsers.delete(:line_break) if @options[:hard_wrap] + @span_parsers.delete(:typographic_syms) if @options[:gfm_quirks].include?(:no_auto_typographic) + + if @options[:gfm_quirks].include?(:paragraph_end) + atx_header_parser = :atx_header_gfm_quirk + @paragraph_end = self.class::PARAGRAPH_END_GFM + else + atx_header_parser = :atx_header_gfm + @paragraph_end = self.class::PARAGRAPH_END + end + + {codeblock_fenced: :codeblock_fenced_gfm, + atx_header: atx_header_parser}.each do |current, replacement| + i = @block_parsers.index(current) + @block_parsers.delete(current) + @block_parsers.insert(i, replacement) + end + + i = @span_parsers.index(:escaped_chars) + @span_parsers[i] = :escaped_chars_gfm if i + @span_parsers << :strikethrough_gfm + + @hard_line_break = "#{@options[:hard_wrap] ? '' : '\\'}\n" + end + + def parse + super + update_elements(@root) + end + + def update_elements(element) + element.children.map! do |child| + if child.type == :text && child.value.include?(@hard_line_break) + update_text_type(element, child) + elsif child.type == :html_element + child + elsif child.type == :header && @options[:auto_ids] && !child.attr.key?('id') + child.attr['id'] = generate_gfm_header_id(child.options[:raw_text]) + child + else + update_elements(child) + child + end + end.flatten! + end + + # Update the raw text for automatic ID generation. + def update_raw_text(item) + raw_text = +'' + + append_text = lambda do |child| + case child.type + when :text, :codespan, :math + raw_text << child.value + when :entity + raw_text << child.value.char + when :smart_quote + raw_text << ::Kramdown::Utils::Entities.entity(child.value.to_s).char + when :typographic_sym + raw_text << case child.value + when :laquo_space + "« " + when :raquo_space + " »" + else + ::Kramdown::Utils::Entities.entity(child.value.to_s).char + end + else + child.children.each { |c| append_text.call(c) } + end + end + + append_text.call(item) + item.options[:raw_text] = raw_text + end + + NON_WORD_RE = /[^\p{Word}\- \t]/.freeze + + def generate_gfm_header_id(text) + result = text.downcase + result.gsub!(NON_WORD_RE, '') + result.tr!(" \t", '-') + + @id_counter[result] += 1 + counter_result = @id_counter[result] + result << "-#{counter_result}" if counter_result > 0 + + @options[:auto_id_prefix] + result + end + + ATX_HEADER_START = /^(?<level>\#{1,6})[\t ]+(?<contents>.*)\n/.freeze + define_parser(:atx_header_gfm, ATX_HEADER_START, nil, 'parse_atx_header') + define_parser(:atx_header_gfm_quirk, ATX_HEADER_START) + + # Copied from kramdown/parser/kramdown/header.rb, removed the first line + def parse_atx_header_gfm_quirk + text, id = parse_header_contents + text.sub!(/[\t ]#+\z/, '') && text.rstrip! + return false if text.empty? + + add_header(@src["level"].length, text, id) + true + end + + FENCED_CODEBLOCK_START = /^[ ]{0,3}[~`]{3,}/.freeze + FENCED_CODEBLOCK_MATCH = /^[ ]{0,3}(([~`]){3,})\s*?((\S+?)(?:\?\S*)?)?\s*?\n(.*?)^[ ]{0,3}\1\2*\s*?\n/m.freeze + define_parser(:codeblock_fenced_gfm, FENCED_CODEBLOCK_START, nil, 'parse_codeblock_fenced') + + STRIKETHROUGH_DELIM = /~~/.freeze + STRIKETHROUGH_MATCH = /#{STRIKETHROUGH_DELIM}(?!\s|~).*?[^\s~]#{STRIKETHROUGH_DELIM}/m.freeze + define_parser(:strikethrough_gfm, STRIKETHROUGH_MATCH, '~~') + + def parse_strikethrough_gfm + line_number = @src.current_line_number + + @src.pos += @src.matched_size + el = Element.new(:html_element, 'del', {}, category: :span, line: line_number) + @tree.children << el + + env = save_env + reset_env(src: Kramdown::Utils::StringScanner.new(@src.matched[2..-3], line_number), + text_type: :text) + parse_spans(el) + restore_env(env) + + el + end + + LIST_TYPES = [:ul, :ol].freeze + + # To handle task-lists we override the parse method for lists, converting matching text into + # checkbox input elements where necessary (as well as applying classes to the ul/ol and li + # elements). + def parse_list + super + current_list = @tree.children.select { |element| LIST_TYPES.include?(element.type) }.last + + is_tasklist = false + box_unchecked = '<input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />' + box_checked = '<input type="checkbox" class="task-list-item-checkbox" ' \ + 'disabled="disabled" checked="checked" />' + + current_list.children.each do |li| + list_items = li.children + next unless !list_items.empty? && list_items[0].type == :p + + # li -> p -> raw_text + descendant = list_items[0].children[0].value + checked = descendant.gsub!(/\A\s*\[ \]\s+/, box_unchecked) + unchecked = descendant.gsub!(/\A\s*\[x\]\s+/i, box_checked) + is_tasklist ||= checked || unchecked + + li.attr['class'] = 'task-list-item' if is_tasklist + end + + current_list.attr['class'] = 'task-list' if is_tasklist + + true + end + + ESCAPED_CHARS_GFM = /\\([\\.*_+`<>()\[\]{}#!:\|"'\$=\-~])/.freeze + define_parser(:escaped_chars_gfm, ESCAPED_CHARS_GFM, '\\\\', :parse_escaped_chars) + + PARAGRAPH_END_GFM = Regexp.union( + LAZY_END, LIST_START, ATX_HEADER_START, DEFINITION_LIST_START, + BLOCKQUOTE_START, FENCED_CODEBLOCK_START + ) + + private + + def update_text_type(element, child) + children = [] + lines = child.value.split(@hard_line_break, -1) + omit_trailing_br = (lines[-1].empty? && Kramdown::Element.category(element) == :block && + element.children[-1] == child) + + lines.each_with_index do |line, index| + new_element_options = {location: child.options[:location] + index} + children << Element.new(:text, (index > 0 ? "\n#{line}" : line), nil, new_element_options) + + if index < lines.size - 2 || (index == lines.size - 2 && !omit_trailing_br) + children << Element.new(:br, nil, nil, new_element_options) + end + end + + children + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/lib/kramdown/parser/gfm/options.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/lib/kramdown/parser/gfm/options.rb new file mode 100644 index 000000000000..2fcd78776242 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/lib/kramdown/parser/gfm/options.rb @@ -0,0 +1,60 @@ +# -*- coding: utf-8; frozen_string_literal: true -*- +# +#-- +# Copyright (C) 2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown-parser-gfm which is licensed under the MIT. +#++ +# + +module Kramdown + module Options + + define(:hard_wrap, Boolean, true, <<~EOF) + Interprets line breaks literally + + Insert HTML `<br />` tags inside paragraphs where the original Markdown + document had newlines (by default, Markdown ignores these newlines). + + Default: true + Used by: GFM parser + EOF + + define(:gfm_quirks, Object, [:paragraph_end], <<~EOF) do |val| + Enables a set of GFM specific quirks + + The way how GFM is transformed on Github often differs from the way + kramdown does things. Many of these differences are negligible but + others are not. + + This option allows one to enable/disable certain GFM quirks, i.e. ways + in which GFM parsing differs from kramdown parsing. + + The value has to be a list of quirk names that should be enabled, + separated by commas. Possible names are: + + * paragraph_end + + Disables the kramdown restriction that at least one blank line has to + be used after a paragraph before a new block element can be started. + + Note that if this quirk is used, lazy line wrapping does not fully + work anymore! + + * no_auto_typographic + + Disables automatic conversion of some characters into their + corresponding typographic symbols (like `--` to em-dash etc). + This helps to achieve results closer to what GitHub Flavored + Markdown produces. + + Default: paragraph_end + Used by: GFM parser + EOF + val = simple_array_validator(val, :gfm_quirks) + val.map! { |v| str_to_sym(v.to_s) } + val + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/test_files.rb b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/test_files.rb new file mode 100644 index 000000000000..664f13ddc3f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/test_files.rb @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# +#-- +# Copyright (C) 2019 Thomas Leitner <t_leitner@gmx.at> +# +# This file is part of kramdown-parser-gfm which is licensed under the MIT. +#++ +# + +require 'minitest/autorun' +require 'kramdown' +require 'kramdown/parser/gfm' +require 'yaml' +require 'tmpdir' + +Encoding.default_external = 'utf-8' + +class TestFiles < Minitest::Test + + # Generate test methods for gfm-to-html conversion + Dir[__dir__ + '/testcases/**/*.text'].each do |text_file| + basename = text_file.sub(/\.text$/, '') + + html_file = basename + '.html' + next unless File.exist?(html_file) + + define_method('test_gfm_' + File.basename(text_file, '.*') + '_to_html') do + opts_file = basename + '.options' + opts_file = File.join(File.dirname(html_file), 'options') if !File.exist?(opts_file) + options = File.exist?(opts_file) ? YAML::load(File.read(opts_file)) : {auto_ids: false, footnote_nr: 1} + doc = Kramdown::Document.new(File.read(text_file), options.merge(input: 'GFM')) + assert_equal(File.read(html_file), doc.to_html) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/atx_header.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/atx_header.html new file mode 100644 index 000000000000..776d7a15ac98 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/atx_header.html @@ -0,0 +1,3 @@ +<h1>header</h1> + +<p>#no header</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/atx_header.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/atx_header.text new file mode 100644 index 000000000000..5e70e2b139af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/atx_header.text @@ -0,0 +1,3 @@ +# header + +#no header diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/backticks_syntax.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/backticks_syntax.html new file mode 100644 index 000000000000..305f4c5f3413 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/backticks_syntax.html @@ -0,0 +1,14 @@ +<pre><code>Three backticks +</code></pre> + +<pre><code>Four backticks +</code></pre> + +<pre><code>Unbalanced bottom heavy +</code></pre> + +<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">language</span> <span class="n">no</span> <span class="n">space</span> +</code></pre></div></div> + +<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">language</span> <span class="n">with</span> <span class="n">space</span> +</code></pre></div></div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/backticks_syntax.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/backticks_syntax.options new file mode 100644 index 000000000000..72e9bc1eecc8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/backticks_syntax.options @@ -0,0 +1 @@ +:enable_coderay: false diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/backticks_syntax.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/backticks_syntax.text new file mode 100644 index 000000000000..fb5c6111f9fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/backticks_syntax.text @@ -0,0 +1,19 @@ +``` +Three backticks +``` + +```` +Four backticks +```` + +``` +Unbalanced bottom heavy +`````` + +````ruby +language no space +```` + +```` ruby +language with space +```` diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/codeblock_fenced.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/codeblock_fenced.html new file mode 100644 index 000000000000..5ededae18f18 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/codeblock_fenced.html @@ -0,0 +1,20 @@ +<p>normal</p> + +<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">require</span> <span class="s1">'kramdown'</span> + +<span class="no">Kramdown</span><span class="o">::</span><span class="no">Document</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">text</span><span class="p">).</span><span class="nf">to_html</span> +</code></pre></div></div> + +<p>indent with tab</p> + +<pre><code>```ruby +require 'kramdown' + +Kramdown::Document.new(text).to_html +``` +</code></pre> + +<p>indent with 2 spaces</p> + +<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"hello"</span><span class="p">);</span> +</code></pre></div></div> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/codeblock_fenced.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/codeblock_fenced.options new file mode 100644 index 000000000000..72e9bc1eecc8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/codeblock_fenced.options @@ -0,0 +1 @@ +:enable_coderay: false diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/codeblock_fenced.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/codeblock_fenced.text new file mode 100644 index 000000000000..5e3e192cdee8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/codeblock_fenced.text @@ -0,0 +1,21 @@ +normal + +```ruby +require 'kramdown' + +Kramdown::Document.new(text).to_html +``` + +indent with tab + + ```ruby + require 'kramdown' + + Kramdown::Document.new(text).to_html + ``` + +indent with 2 spaces + + ```js + console.log("hello"); + ``` diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks.html new file mode 100644 index 000000000000..1dfb2f08d911 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks.html @@ -0,0 +1,3 @@ +<p>one<br /> +<em>two</em><br /> +three</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks.text new file mode 100644 index 000000000000..f1287bde8178 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks.text @@ -0,0 +1,3 @@ +one +_two_ +three diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks_off.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks_off.html new file mode 100644 index 000000000000..4b34619e9eef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks_off.html @@ -0,0 +1,5 @@ +<p>This is just a normal paragraph.<br /> +Containing a manual line break above.</p> + +<p>It was the best of times,<br /> +it was the worst of times.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks_off.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks_off.options new file mode 100644 index 000000000000..f2da68328b0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks_off.options @@ -0,0 +1 @@ +:hard_wrap: false diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks_off.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks_off.text new file mode 100644 index 000000000000..29e1d4850415 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/hard_line_breaks_off.text @@ -0,0 +1,5 @@ +This is just a normal paragraph. +Containing a manual line break above. + +It was the best of times,\ +it was the worst of times. diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids.html new file mode 100644 index 000000000000..b45fe8f36778 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids.html @@ -0,0 +1,27 @@ +<h3 id="myid">test</h3> + +<h3 id="variable_name">variable_name</h3> + +<h3 id="abc-def-öúß">abc def öúß</h3> + +<h3 id="192-abc-192">192 abc 192</h3> + +<h3>;.;;</h3> + +<h3 id="variable_name-1">variable_name</h3> + +<h3 id="variable_name-2">variable_name</h3> + +<h3 id="-1">;;</h3> + +<h3 id="before--after-tab">before after tab</h3> + +<h3 id="with-code">with <code>code</code></h3> + +<h3 id="with-äspace">with  ä space</h3> + +<h3 id="with-smart-quotes">With “smart” quotes</h3> + +<h3 id="with--typographic--symbols">with — « typographic » … symbols</h3> + +<h3 id="with-m5">with <script type="math/tex">m=5</script></h3> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids.options new file mode 100644 index 000000000000..8776b5524dfb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids.options @@ -0,0 +1 @@ +:auto_ids: true diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids.text new file mode 100644 index 000000000000..0a89c0b4eeb8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids.text @@ -0,0 +1,27 @@ +### test {#myid} + +### variable_name + +### abc def öúß + +### 192 abc 192 + +### ;.;; + +### variable_name + +### variable_name + +### ;; + +### before after tab + +### with `code` + +### with &nbsp;&auml;&nbsp;space + +### With "smart" quotes + +### with --- << typographic >> ... symbols + +### with $$m=5$$ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids_with_prefix.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids_with_prefix.html new file mode 100644 index 000000000000..4aab0728ef20 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids_with_prefix.html @@ -0,0 +1,3 @@ +<h1 id="hallo-header-1">Header 1</h1> + +<h1 id="hallo-123">123</h1> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids_with_prefix.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids_with_prefix.options new file mode 100644 index 000000000000..f37255d52b8c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids_with_prefix.options @@ -0,0 +1,2 @@ +:auto_ids: true +:auto_id_prefix: hallo- diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids_with_prefix.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids_with_prefix.text new file mode 100644 index 000000000000..acf09fe446f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/header_ids_with_prefix.text @@ -0,0 +1,3 @@ +# Header 1 + +# 123 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/no_typographic.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/no_typographic.html new file mode 100644 index 000000000000..beecad4c3cee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/no_typographic.html @@ -0,0 +1,3 @@ +<h3 id="header-with---ndash">Header with --ndash</h3> + +<h3 id="with------typographic---symbols">with --- &lt;&lt; typographic &gt;&gt; ... symbols</h3> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/no_typographic.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/no_typographic.options new file mode 100644 index 000000000000..4a83cd1bb922 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/no_typographic.options @@ -0,0 +1 @@ +:gfm_quirks: [no_auto_typographic] diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/no_typographic.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/no_typographic.text new file mode 100644 index 000000000000..f57965114e49 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/no_typographic.text @@ -0,0 +1,3 @@ +### Header with --ndash + +### with --- << typographic >> ... symbols diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end-disabled.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end-disabled.html new file mode 100644 index 000000000000..41dfb3a6a5eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end-disabled.html @@ -0,0 +1,31 @@ +<p>A<br /> + - b</p> + +<p>This is a list<br /> +- or is it</p> + +<p>blockquote<br /> +&gt; text</p> + +<p>header<br /> +# text</p> + +<p>codeblock fenced<br /> +<code> +puts hello world +</code></p> + +<ul> + <li> + <p>level 1<br /> +some text</p> + + <p>begin level 2<br /> +* level 2<br /> +* level 2</p> + </li> +</ul> + +<h1 id="h1">h1</h1> +<p>## h2<br /> +### h3</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end-disabled.options b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end-disabled.options new file mode 100644 index 000000000000..704f643d0f78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end-disabled.options @@ -0,0 +1 @@ +:gfm_quirks: [] diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end-disabled.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end-disabled.text new file mode 100644 index 000000000000..4e09e0391a34 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end-disabled.text @@ -0,0 +1,27 @@ +A + - b + +This is a list +- or is it + +blockquote +> text + +header +# text + +codeblock fenced +``` +puts hello world +``` + +* level 1 + some text + + begin level 2 + * level 2 + * level 2 + +# h1 +## h2 +### h3 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end.html new file mode 100644 index 000000000000..c337d61d9607 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end.html @@ -0,0 +1,38 @@ +<p>A</p> +<ul> + <li>b</li> +</ul> + +<p>This is a list</p> +<ul> + <li>or is it</li> +</ul> + +<p>blockquote</p> +<blockquote> + <p>text</p> +</blockquote> + +<p>header</p> +<h1>text</h1> + +<p>codeblock fenced</p> +<pre><code>puts hello world +</code></pre> + +<ul> + <li> + <p>level 1<br /> +some text</p> + + <p>begin level 2</p> + <ul> + <li>level 2</li> + <li>level 2</li> + </ul> + </li> +</ul> + +<h1>h1</h1> +<h2>h2</h2> +<h3>h3</h3> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end.text new file mode 100644 index 000000000000..4e09e0391a34 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/paragraph_end.text @@ -0,0 +1,27 @@ +A + - b + +This is a list +- or is it + +blockquote +> text + +header +# text + +codeblock fenced +``` +puts hello world +``` + +* level 1 + some text + + begin level 2 + * level 2 + * level 2 + +# h1 +## h2 +### h3 diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/strikethrough.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/strikethrough.html new file mode 100644 index 000000000000..d35158fc7edf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/strikethrough.html @@ -0,0 +1,33 @@ +<p><del>This is a test</del></p> + +<p>~<del>This is another test</del>~</p> + +<p><del>This is yet another test</del>~</p> + +<p>~~ This is a test of it NOT working ~~</p> + +<p>~~<br /> +This<br /> +is<br /> +a<br /> +<strong>multiline</strong><br /> +test<br /> +~~</p> + +<p>This is an <del><em>inline</em> <strong>strikethrough</strong></del> test</p> + +<p>This is an ~~escaped~~ strikethrough.</p> + +<p>This is a <del>strikethrough with a ~ in the middle</del></p> + +<p>I <del>don’t even</del>~ have an extra tilde.</p> + +<p>This should ~~not be struck.</p> + +<p>This <del>is a complex <em>strike</em> through *test ~~with nesting</del> involved* here~~.</p> + +<p>This <del>is a complex <em>strike</em> through *test</del> with apparent nesting <del>involved* here</del>.</p> + +<p><del>中文</del></p> + +<p><del>a</del></p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/strikethrough.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/strikethrough.text new file mode 100644 index 000000000000..0984200c8c1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/strikethrough.text @@ -0,0 +1,33 @@ +~~This is a test~~ + +~~~This is another test~~~ + +~~This is yet another test~~~ + +~~ This is a test of it NOT working ~~ + +~~ +This +is +a +**multiline** +test +~~ + +This is an ~~_inline_ **strikethrough**~~ test + +This is an \~~escaped~~ strikethrough. + +This is a ~~strikethrough with a ~ in the middle~~ + +I ~~don't even~~~ have an extra tilde. + +This should ~~not be struck. + +This ~~is a complex *strike* through *test ~~with nesting~~ involved* here~~. + +This ~~is a complex *strike* through *test~~ with apparent nesting ~~involved* here~~. + +~~中文~~ + +~~a~~ diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/task_list.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/task_list.html new file mode 100644 index 000000000000..a11b553b36aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/task_list.html @@ -0,0 +1,40 @@ +<p>unordered task list</p> + +<ul class="task-list"> + <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />first ul task item</li> + <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />second ul task item</li> + <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />third ul task item</li> + <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />fourth ul task item [ ] next</li> +</ul> + +<p>unordered list</p> + +<ul> + <li> + <blockquote> + <p>first ul item</p> + </blockquote> + </li> + <li></li> + <li> + <pre><code>test +</code></pre> + </li> + <li>second ul item</li> +</ul> + +<p>ordered list</p> + +<ol> + <li>first ol item</li> + <li>second ol item</li> +</ol> + +<p>ordered task list</p> + +<ol class="task-list"> + <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />first ol task item</li> + <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />second ol task item</li> + <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />third ol task item</li> + <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />fourth ol task item</li> +</ol> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/task_list.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/task_list.text new file mode 100644 index 000000000000..f6ade2faf16c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/task_list.text @@ -0,0 +1,26 @@ +unordered task list + +- [ ] first ul task item +- [x] second ul task item +- [X] third ul task item +- [ ] fourth ul task item [ ] next + +unordered list + +- > first ul item +- +- + test +- second ul item + +ordered list + +1. first ol item +2. second ol item + +ordered task list + +1. [ ] first ol task item +2. [x] second ol task item +3. [X] third ol task item +4. [ ] fourth ol task item diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/two_para_hard_line_breaks.html b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/two_para_hard_line_breaks.html new file mode 100644 index 000000000000..d5ba2e41f9d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/two_para_hard_line_breaks.html @@ -0,0 +1,4 @@ +<p>This is just a normal paragraph. <br /> +Containing a line break.</p> + +<p>Another paragraph.</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/two_para_hard_line_breaks.text b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/two_para_hard_line_breaks.text new file mode 100644 index 000000000000..6b3d7c55c597 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/kramdown-parser-gfm-1.1.0/test/testcases/two_para_hard_line_breaks.text @@ -0,0 +1,4 @@ +This is just a normal paragraph. +Containing a line break. + +Another paragraph. diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/History.md b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/History.md new file mode 100644 index 000000000000..9a82faabab72 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/History.md @@ -0,0 +1,288 @@ +# Liquid Change Log + +## 4.0.3 / 2019-03-12 + +### Fixed +* Fix break and continue tags inside included templates in loops (#1072) [Justin Li] + +## 4.0.2 / 2019-03-08 + +### Changed +* Add `where` filter (#1026) [Samuel Doiron] +* Add `ParseTreeVisitor` to iterate the Liquid AST (#1025) [Stephen Paul Weber] +* Improve `strip_html` performance (#1032) [printercu] + +### Fixed +* Add error checking for invalid combinations of inputs to sort, sort_natural, where, uniq, map, compact filters (#1059) [Garland Zhang] +* Validate the character encoding in url_decode (#1070) [Clayton Smith] + +## 4.0.1 / 2018-10-09 + +### Changed +* Add benchmark group in Gemfile (#855) [Jerry Liu] +* Allow benchmarks to benchmark render by itself (#851) [Jerry Liu] +* Avoid calling `line_number` on String node when rescuing a render error. (#860) [Dylan Thacker-Smith] +* Avoid duck typing to detect whether to call render on a node. [Dylan Thacker-Smith] +* Clarify spelling of `reversed` on `for` block tag (#843) [Mark Crossfield] +* Replace recursion with loop to avoid potential stack overflow from malicious input (#891, #892) [Dylan Thacker-Smith] +* Limit block tag nesting to 100 (#894) [Dylan Thacker-Smith] +* Replace `assert_equal nil` with `assert_nil` (#895) [Dylan Thacker-Smith] +* Remove Spy Gem (#896) [Dylan Thacker-Smith] +* Add `collection_name` and `variable_name` reader to `For` block (#909) +* Symbols render as strings (#920) [Justin Li] +* Remove default value from Hash objects (#932) [Maxime Bedard] +* Remove one level of nesting (#944) [Dylan Thacker-Smith] +* Update Rubocop version (#952) [Justin Li] +* Add `at_least` and `at_most` filters (#954, #958) [Nithin Bekal] +* Add a regression test for a liquid-c trim mode bug (#972) [Dylan Thacker-Smith] +* Use https rather than git protocol to fetch liquid-c [Dylan Thacker-Smith] +* Add tests against Ruby 2.4 (#963) and 2.5 (#981) +* Replace RegExp literals with constants (#988) [Ashwin Maroli] +* Replace unnecessary `#each_with_index` with `#each` (#992) [Ashwin Maroli] +* Improve the unexpected end delimiter message for block tags. (#1003) [Dylan Thacker-Smith] +* Refactor and optimize rendering (#1005) [Christopher Aue] +* Add installation instruction (#1006) [Ben Gift] +* Remove Circle CI (#1010) +* Rename deprecated `BigDecimal.new` to `BigDecimal` (#1024) [Koichi ITO] +* Rename deprecated Rubocop name (#1027) [Justin Li] + +### Fixed +* Handle `join` filter on non String joiners (#857) [Richard Monette] +* Fix duplicate inclusion condition logic error of `Liquid::Strainer.add_filter` method (#861) +* Fix `escape`, `url_encode`, `url_decode` not handling non-string values (#898) [Thierry Joyal] +* Fix raise when variable is defined but nil when using `strict_variables` [Pascal Betz] +* Fix `sort` and `sort_natural` to handle arrays with nils (#930) [Eric Chan] + +## 4.0.0 / 2016-12-14 / branch "4-0-stable" + +### Changed +* Render an opaque internal error by default for non-Liquid::Error (#835) [Dylan Thacker-Smith] +* Ruby 2.0 support dropped (#832) [Dylan Thacker-Smith] +* Add to_number Drop method to allow custom drops to work with number filters (#731) +* Add strict_variables and strict_filters options to detect undefined references (#691) +* Improve loop performance (#681) [Florian Weingarten] +* Rename Drop method `before_method` to `liquid_method_missing` (#661) [Thierry Joyal] +* Add url_decode filter to invert url_encode (#645) [Larry Archer] +* Add global_filter to apply a filter to all output (#610) [Loren Hale] +* Add compact filter (#600) [Carson Reinke] +* Rename deprecated "has_key?" and "has_interrupt?" methods (#593) [Florian Weingarten] +* Include template name with line numbers in render errors (574) [Dylan Thacker-Smith] +* Add sort_natural filter (#554) [Martin Hanzel] +* Add forloop.parentloop as a reference to the parent loop (#520) [Justin Li] +* Block parsing moved to BlockBody class (#458) [Dylan Thacker-Smith] +* Add concat filter to concatenate arrays (#429) [Diogo Beato] +* Ruby 1.9 support dropped (#491) [Justin Li] +* Liquid::Template.file_system's read_template_file method is no longer passed the context. (#441) [James Reid-Smith] +* Remove `liquid_methods` (See https://github.com/Shopify/liquid/pull/568 for replacement) +* Liquid::Template.register_filter raises when the module overrides registered public methods as private or protected (#705) [Gaurav Chande] + +### Fixed + +* Fix variable names being detected as an operator when starting with contains (#788) [Michael Angell] +* Fix include tag used with strict_variables (#828) [QuickPay] +* Fix map filter when value is a Proc (#672) [Guillaume Malette] +* Fix truncate filter when value is not a string (#672) [Guillaume Malette] +* Fix behaviour of escape filter when input is nil (#665) [Tanel Jakobsoo] +* Fix sort filter behaviour with empty array input (#652) [Marcel Cary] +* Fix test failure under certain timezones (#631) [Dylan Thacker-Smith] +* Fix bug in uniq filter (#595) [Florian Weingarten] +* Fix bug when "blank" and "empty" are used as variable names (#592) [Florian Weingarten] +* Fix condition parse order in strict mode (#569) [Justin Li] +* Fix naming of the "context variable" when dynamically including a template (#559) [Justin Li] +* Gracefully accept empty strings in the date filter (#555) [Loren Hale] +* Fix capturing into variables with a hyphen in the name (#505) [Florian Weingarten] +* Fix case sensitivity regression in date standard filter (#499) [Kelley Reynolds] +* Disallow filters with no variable in strict mode (#475) [Justin Li] +* Disallow variable names in the strict parser that are not valid in the lax parser (#463) [Justin Li] +* Fix BlockBody#warnings taking exponential time to compute (#486) [Justin Li] + +## 3.0.5 / 2015-07-23 / branch "3-0-stable" + +* Fix test failure under certain timezones [Dylan Thacker-Smith] + +## 3.0.4 / 2015-07-17 + +* Fix chained access to multi-dimensional hashes [Florian Weingarten] + +## 3.0.3 / 2015-05-28 + +* Fix condition parse order in strict mode (#569) [Justin Li] + +## 3.0.2 / 2015-04-24 + +* Expose VariableLookup private members (#551) [Justin Li] +* Documentation fixes + +## 3.0.1 / 2015-01-23 + +* Remove duplicate `index0` key in TableRow tag (#502) [Alfred Xing] + +## 3.0.0 / 2014-11-12 + +* Removed Block#end_tag. Instead, override parse with `super` followed by your code. See #446 [Dylan Thacker-Smith] +* Fixed condition with wrong data types (#423) [Bogdan Gusiev] +* Add url_encode to standard filters (#421) [Derrick Reimer] +* Add uniq to standard filters [Florian Weingarten] +* Add exception_handler feature (#397) and #254 [Bogdan Gusiev, Florian Weingarten] +* Optimize variable parsing to avoid repeated regex evaluation during template rendering #383 [Jason Hiltz-Laforge] +* Optimize checking for block interrupts to reduce object allocation #380 [Jason Hiltz-Laforge] +* Properly set context rethrow_errors on render! #349 [Thierry Joyal] +* Fix broken rendering of variables which are equal to false (#345) [Florian Weingarten] +* Remove ActionView template handler [Dylan Thacker-Smith] +* Freeze lots of string literals for new Ruby 2.1 optimization (#297) [Florian Weingarten] +* Allow newlines in tags and variables (#324) [Dylan Thacker-Smith] +* Tag#parse is called after initialize, which now takes options instead of tokens as the 3rd argument. See #321 [Dylan Thacker-Smith] +* Raise `Liquid::ArgumentError` instead of `::ArgumentError` when filter has wrong number of arguments #309 [Bogdan Gusiev] +* Add a to_s default for liquid drops (#306) [Adam Doeler] +* Add strip, lstrip, and rstrip to standard filters [Florian Weingarten] +* Make if, for & case tags return complete and consistent nodelists (#250) [Nick Jones] +* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith] +* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl] +* Fix resource counting bug with respond_to?(:length) (#263) [Florian Weingarten] +* Allow specifying custom patterns for template filenames (#284) [Andrei Gladkyi] +* Allow drops to optimize loading a slice of elements (#282) [Tom Burns] +* Support for passing variables to snippets in subdirs (#271) [Joost Hietbrink] +* Add a class cache to avoid runtime extend calls (#249) [James Tucker] +* Remove some legacy Ruby 1.8 compatibility code (#276) [Florian Weingarten] +* Add default filter to standard filters (#267) [Derrick Reimer] +* Add optional strict parsing and warn parsing (#235) [Tristan Hume] +* Add I18n syntax error translation (#241) [Simon Hørup Eskildsen, Sirupsen] +* Make sort filter work on enumerable drops (#239) [Florian Weingarten] +* Fix clashing method names in enumerable drops (#238) [Florian Weingarten] +* Make map filter work on enumerable drops (#233) [Florian Weingarten] +* Improved whitespace stripping for blank blocks, related to #216 [Florian Weingarten] + +## 2.6.3 / 2015-07-23 / branch "2-6-stable" + +* Fix test failure under certain timezones [Dylan Thacker-Smith] + +## 2.6.2 / 2015-01-23 + +* Remove duplicate hash key [Parker Moore] + +## 2.6.1 / 2014-01-10 + +Security fix, cherry-picked from master (4e14a65): +* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl] +* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith] + +## 2.6.0 / 2013-11-25 + +IMPORTANT: Liquid 2.6 is going to be the last version of Liquid which maintains explicit Ruby 1.8 compatability. +The following releases will only be tested against Ruby 1.9 and Ruby 2.0 and are likely to break on Ruby 1.8. + +* Bugfix for #106: fix example servlet [gnowoel] +* Bugfix for #97: strip_html filter supports multi-line tags [Jo Liss] +* Bugfix for #114: strip_html filter supports style tags [James Allardice] +* Bugfix for #117: 'now' support for date filter in Ruby 1.9 [Notre Dame Webgroup] +* Bugfix for #166: truncate filter on UTF-8 strings with Ruby 1.8 [Florian Weingarten] +* Bugfix for #204: 'raw' parsing bug [Florian Weingarten] +* Bugfix for #150: 'for' parsing bug [Peter Schröder] +* Bugfix for #126: Strip CRLF in strip_newline [Peter Schröder] +* Bugfix for #174, "can't convert Fixnum into String" for "replace" [jsw0528] +* Allow a Liquid::Drop to be passed into Template#render [Daniel Huckstep] +* Resource limits [Florian Weingarten] +* Add reverse filter [Jay Strybis] +* Add utf-8 support +* Use array instead of Hash to keep the registered filters [Tasos Stathopoulos] +* Cache tokenized partial templates [Tom Burns] +* Avoid warnings in Ruby 1.9.3 [Marcus Stollsteimer] +* Better documentation for 'include' tag (closes #163) [Peter Schröder] +* Use of BigDecimal on filters to have better precision (closes #155) [Arthur Nogueira Neves] + +## 2.5.5 / 2014-01-10 / branch "2-5-stable" + +Security fix, cherry-picked from master (4e14a65): +* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl] +* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith] + +## 2.5.4 / 2013-11-11 + +* Fix "can't convert Fixnum into String" for "replace" (#173), [jsw0528] + +## 2.5.3 / 2013-10-09 + +* #232, #234, #237: Fix map filter bugs [Florian Weingarten] + +## 2.5.2 / 2013-09-03 / deleted + +Yanked from rubygems, as it contained too many changes that broke compatibility. Those changes will be on following major releases. + +## 2.5.1 / 2013-07-24 + +* #230: Fix security issue with map filter, Use invoke_drop in map filter [Florian Weingarten] + +## 2.5.0 / 2013-03-06 + +* Prevent Object methods from being called on drops +* Avoid symbol injection from liquid +* Added break and continue statements +* Fix filter parser for args without space separators +* Add support for filter keyword arguments + + +## 2.4.0 / 2012-08-03 + +* Performance improvements +* Allow filters in `assign` +* Add `modulo` filter +* Ruby 1.8, 1.9, and Rubinius compatibility fixes +* Add support for `quoted['references']` in `tablerow` +* Add support for Enumerable to `tablerow` +* `strip_html` filter removes html comments + + +## 2.3.0 / 2011-10-16 + +* Several speed/memory improvements +* Numerous bug fixes +* Added support for MRI 1.9, Rubinius, and JRuby +* Added support for integer drop parameters +* Added epoch support to `date` filter +* New `raw` tag that suppresses parsing +* Added `else` option to `for` tag +* New `increment` tag +* New `split` filter + + +## 2.2.1 / 2010-08-23 + +* Added support for literal tags + + +## 2.2.0 / 2010-08-22 + +* Compatible with Ruby 1.8.7, 1.9.1 and 1.9.2-p0 +* Merged some changed made by the community + + +## 1.9.0 / 2008-03-04 + +* Fixed gem install rake task +* Improve Error encapsulation in liquid by maintaining a own set of exceptions instead of relying on ruby build ins + + +## Before 1.9.0 + +* Added If with or / and expressions +* Implemented .to_liquid for all objects which can be passed to liquid like Strings Arrays Hashes Numerics and Booleans. To export new objects to liquid just implement .to_liquid on them and return objects which themselves have .to_liquid methods. +* Added more tags to standard library +* Added include tag ( like partials in rails ) +* [...] Gazillion of detail improvements +* Added strainers as filter hosts for better security [Tobias Luetke] +* Fixed that rails integration would call filter with the wrong "self" [Michael Geary] +* Fixed bad error reporting when a filter called a method which doesn't exist. Liquid told you that it couldn't find the filter which was obviously misleading [Tobias Luetke] +* Removed count helper from standard lib. use size [Tobias Luetke] +* Fixed bug with string filter parameters failing to tolerate commas in strings. [Paul Hammond] +* Improved filter parameters. Filter parameters are now context sensitive; Types are resolved according to the rules of the context. Multiple parameters are now separated by the Liquid::ArgumentSeparator: , by default [Paul Hammond] + {{ 'Typo' | link_to: 'http://typo.leetsoft.com', 'Typo - a modern weblog engine' }} +* Added Liquid::Drop. A base class which you can use for exporting proxy objects to liquid which can acquire more data when used in liquid. [Tobias Luetke] + + class ProductDrop < Liquid::Drop + def top_sales + Shop.current.products.find(:all, :order => 'sales', :limit => 10 ) + end + end + t = Liquid::Template.parse( ' {% for product in product.top_sales %} {{ product.name }} {% endfor %} ' ) + t.render('product' => ProductDrop.new ) +* Added filter parameters support. Example: {{ date | format_date: "%Y" }} [Paul Hammond] diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/LICENSE b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/LICENSE new file mode 100644 index 000000000000..926b04eb5881 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2005, 2006 Tobias Luetke + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/README.md b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/README.md new file mode 100644 index 000000000000..77e9ff435d95 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/README.md @@ -0,0 +1,108 @@ +[![Build Status](https://api.travis-ci.org/Shopify/liquid.svg?branch=master)](http://travis-ci.org/Shopify/liquid) +[![Inline docs](http://inch-ci.org/github/Shopify/liquid.svg?branch=master)](http://inch-ci.org/github/Shopify/liquid) + +# Liquid template engine + +* [Contributing guidelines](CONTRIBUTING.md) +* [Version history](History.md) +* [Liquid documentation from Shopify](http://docs.shopify.com/themes/liquid-basics) +* [Liquid Wiki at GitHub](https://github.com/Shopify/liquid/wiki) +* [Website](http://liquidmarkup.org/) + +## Introduction + +Liquid is a template engine which was written with very specific requirements: + +* It has to have beautiful and simple markup. Template engines which don't produce good looking markup are no fun to use. +* It needs to be non evaling and secure. Liquid templates are made so that users can edit them. You don't want to run code on your server which your users wrote. +* It has to be stateless. Compile and render steps have to be separate so that the expensive parsing and compiling can be done once and later on you can just render it passing in a hash with local variables and objects. + +## Why you should use Liquid + +* You want to allow your users to edit the appearance of your application but don't want them to run **insecure code on your server**. +* You want to render templates directly from the database. +* You like smarty (PHP) style template engines. +* You need a template engine which does HTML just as well as emails. +* You don't like the markup of your current templating engine. + +## What does it look like? + +```html +<ul id="products"> + {% for product in products %} + <li> + <h2>{{ product.name }}</h2> + Only {{ product.price | price }} + + {{ product.description | prettyprint | paragraph }} + </li> + {% endfor %} +</ul> +``` + +## How to use Liquid + +Install Liquid by adding `gem 'liquid'` to your gemfile. + +Liquid supports a very simple API based around the Liquid::Template class. +For standard use you can just pass it the content of a file and call render with a parameters hash. + +```ruby +@template = Liquid::Template.parse("hi {{name}}") # Parses and compiles the template +@template.render('name' => 'tobi') # => "hi tobi" +``` + +### Error Modes + +Setting the error mode of Liquid lets you specify how strictly you want your templates to be interpreted. +Normally the parser is very lax and will accept almost anything without error. Unfortunately this can make +it very hard to debug and can lead to unexpected behaviour. + +Liquid also comes with a stricter parser that can be used when editing templates to give better error messages +when templates are invalid. You can enable this new parser like this: + +```ruby +Liquid::Template.error_mode = :strict # Raises a SyntaxError when invalid syntax is used +Liquid::Template.error_mode = :warn # Adds errors to template.errors but continues as normal +Liquid::Template.error_mode = :lax # The default mode, accepts almost anything. +``` + +If you want to set the error mode only on specific templates you can pass `:error_mode` as an option to `parse`: +```ruby +Liquid::Template.parse(source, :error_mode => :strict) +``` +This is useful for doing things like enabling strict mode only in the theme editor. + +It is recommended that you enable `:strict` or `:warn` mode on new apps to stop invalid templates from being created. +It is also recommended that you use it in the template editors of existing apps to give editors better error messages. + +### Undefined variables and filters + +By default, the renderer doesn't raise or in any other way notify you if some variables or filters are missing, i.e. not passed to the `render` method. +You can improve this situation by passing `strict_variables: true` and/or `strict_filters: true` options to the `render` method. +When one of these options is set to true, all errors about undefined variables and undefined filters will be stored in `errors` array of a `Liquid::Template` instance. +Here are some examples: + +```ruby +template = Liquid::Template.parse("{{x}} {{y}} {{z.a}} {{z.b}}") +template.render({ 'x' => 1, 'z' => { 'a' => 2 } }, { strict_variables: true }) +#=> '1 2 ' # when a variable is undefined, it's rendered as nil +template.errors +#=> [#<Liquid::UndefinedVariable: Liquid error: undefined variable y>, #<Liquid::UndefinedVariable: Liquid error: undefined variable b>] +``` + +```ruby +template = Liquid::Template.parse("{{x | filter1 | upcase}}") +template.render({ 'x' => 'foo' }, { strict_filters: true }) +#=> '' # when at least one filter in the filter chain is undefined, a whole expression is rendered as nil +template.errors +#=> [#<Liquid::UndefinedFilter: Liquid error: undefined filter filter1>] +``` + +If you want to raise on a first exception instead of pushing all of them in `errors`, you can use `render!` method: + +```ruby +template = Liquid::Template.parse("{{x}} {{y}}") +template.render!({ 'x' => 1}, { strict_variables: true }) +#=> Liquid::UndefinedVariable: Liquid error: undefined variable y +``` diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid.rb new file mode 100644 index 000000000000..770d2f911d02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid.rb @@ -0,0 +1,80 @@ +# Copyright (c) 2005 Tobias Luetke +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Liquid + FilterSeparator = /\|/ + ArgumentSeparator = ','.freeze + FilterArgumentSeparator = ':'.freeze + VariableAttributeSeparator = '.'.freeze + WhitespaceControl = '-'.freeze + TagStart = /\{\%/ + TagEnd = /\%\}/ + VariableSignature = /\(?[\w\-\.\[\]]\)?/ + VariableSegment = /[\w\-]/ + VariableStart = /\{\{/ + VariableEnd = /\}\}/ + VariableIncompleteEnd = /\}\}?/ + QuotedString = /"[^"]*"|'[^']*'/ + QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/o + TagAttributes = /(\w+)\s*\:\s*(#{QuotedFragment})/o + AnyStartingTag = /#{TagStart}|#{VariableStart}/o + PartialTemplateParser = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd}/om + TemplateParser = /(#{PartialTemplateParser}|#{AnyStartingTag})/om + VariableParser = /\[[^\]]+\]|#{VariableSegment}+\??/o + + singleton_class.send(:attr_accessor, :cache_classes) + self.cache_classes = true +end + +require "liquid/version" +require 'liquid/parse_tree_visitor' +require 'liquid/lexer' +require 'liquid/parser' +require 'liquid/i18n' +require 'liquid/drop' +require 'liquid/tablerowloop_drop' +require 'liquid/forloop_drop' +require 'liquid/extensions' +require 'liquid/errors' +require 'liquid/interrupts' +require 'liquid/strainer' +require 'liquid/expression' +require 'liquid/context' +require 'liquid/parser_switching' +require 'liquid/tag' +require 'liquid/block' +require 'liquid/block_body' +require 'liquid/document' +require 'liquid/variable' +require 'liquid/variable_lookup' +require 'liquid/range_lookup' +require 'liquid/file_system' +require 'liquid/resource_limits' +require 'liquid/template' +require 'liquid/standardfilters' +require 'liquid/condition' +require 'liquid/utils' +require 'liquid/tokenizer' +require 'liquid/parse_context' + +# Load all the tags of the standard library +# +Dir["#{__dir__}/liquid/tags/*.rb"].each { |f| require f } diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/block.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/block.rb new file mode 100644 index 000000000000..00c59b2d118e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/block.rb @@ -0,0 +1,77 @@ +module Liquid + class Block < Tag + MAX_DEPTH = 100 + + def initialize(tag_name, markup, options) + super + @blank = true + end + + def parse(tokens) + @body = BlockBody.new + while parse_body(@body, tokens) + end + end + + def render(context) + @body.render(context) + end + + def blank? + @blank + end + + def nodelist + @body.nodelist + end + + def unknown_tag(tag, _params, _tokens) + if tag == 'else'.freeze + raise SyntaxError.new(parse_context.locale.t("errors.syntax.unexpected_else".freeze, + block_name: block_name)) + elsif tag.start_with?('end'.freeze) + raise SyntaxError.new(parse_context.locale.t("errors.syntax.invalid_delimiter".freeze, + tag: tag, + block_name: block_name, + block_delimiter: block_delimiter)) + else + raise SyntaxError.new(parse_context.locale.t("errors.syntax.unknown_tag".freeze, tag: tag)) + end + end + + def block_name + @tag_name + end + + def block_delimiter + @block_delimiter ||= "end#{block_name}" + end + + protected + + def parse_body(body, tokens) + if parse_context.depth >= MAX_DEPTH + raise StackLevelError, "Nesting too deep".freeze + end + parse_context.depth += 1 + begin + body.parse(tokens, parse_context) do |end_tag_name, end_tag_params| + @blank &&= body.blank? + + return false if end_tag_name == block_delimiter + unless end_tag_name + raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_never_closed".freeze, block_name: block_name)) + end + + # this tag is not registered with the system + # pass it to the current block for special handling or error reporting + unknown_tag(end_tag_name, end_tag_params, tokens) + end + ensure + parse_context.depth -= 1 + end + + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/block_body.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/block_body.rb new file mode 100644 index 000000000000..ba294155d51d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/block_body.rb @@ -0,0 +1,143 @@ +module Liquid + class BlockBody + FullToken = /\A#{TagStart}#{WhitespaceControl}?\s*(\w+)\s*(.*?)#{WhitespaceControl}?#{TagEnd}\z/om + ContentOfVariable = /\A#{VariableStart}#{WhitespaceControl}?(.*?)#{WhitespaceControl}?#{VariableEnd}\z/om + WhitespaceOrNothing = /\A\s*\z/ + TAGSTART = "{%".freeze + VARSTART = "{{".freeze + + attr_reader :nodelist + + def initialize + @nodelist = [] + @blank = true + end + + def parse(tokenizer, parse_context) + parse_context.line_number = tokenizer.line_number + while token = tokenizer.shift + next if token.empty? + case + when token.start_with?(TAGSTART) + whitespace_handler(token, parse_context) + unless token =~ FullToken + raise_missing_tag_terminator(token, parse_context) + end + tag_name = $1 + markup = $2 + # fetch the tag from registered blocks + unless tag = registered_tags[tag_name] + # end parsing if we reach an unknown tag and let the caller decide + # determine how to proceed + return yield tag_name, markup + end + new_tag = tag.parse(tag_name, markup, tokenizer, parse_context) + @blank &&= new_tag.blank? + @nodelist << new_tag + when token.start_with?(VARSTART) + whitespace_handler(token, parse_context) + @nodelist << create_variable(token, parse_context) + @blank = false + else + if parse_context.trim_whitespace + token.lstrip! + end + parse_context.trim_whitespace = false + @nodelist << token + @blank &&= !!(token =~ WhitespaceOrNothing) + end + parse_context.line_number = tokenizer.line_number + end + + yield nil, nil + end + + def whitespace_handler(token, parse_context) + if token[2] == WhitespaceControl + previous_token = @nodelist.last + if previous_token.is_a? String + previous_token.rstrip! + end + end + parse_context.trim_whitespace = (token[-3] == WhitespaceControl) + end + + def blank? + @blank + end + + def render(context) + output = [] + context.resource_limits.render_score += @nodelist.length + + idx = 0 + while node = @nodelist[idx] + case node + when String + check_resources(context, node) + output << node + when Variable + render_node_to_output(node, output, context) + when Block + render_node_to_output(node, output, context, node.blank?) + break if context.interrupt? # might have happened in a for-block + when Continue, Break + # If we get an Interrupt that means the block must stop processing. An + # Interrupt is any command that stops block execution such as {% break %} + # or {% continue %} + context.push_interrupt(node.interrupt) + break + else # Other non-Block tags + render_node_to_output(node, output, context) + break if context.interrupt? # might have happened through an include + end + idx += 1 + end + + output.join + end + + private + + def render_node_to_output(node, output, context, skip_output = false) + node_output = node.render(context) + node_output = node_output.is_a?(Array) ? node_output.join : node_output.to_s + check_resources(context, node_output) + output << node_output unless skip_output + rescue MemoryError => e + raise e + rescue UndefinedVariable, UndefinedDropMethod, UndefinedFilter => e + context.handle_error(e, node.line_number) + output << nil + rescue ::StandardError => e + line_number = node.is_a?(String) ? nil : node.line_number + output << context.handle_error(e, line_number) + end + + def check_resources(context, node_output) + context.resource_limits.render_length += node_output.length + return unless context.resource_limits.reached? + raise MemoryError.new("Memory limits exceeded".freeze) + end + + def create_variable(token, parse_context) + token.scan(ContentOfVariable) do |content| + markup = content.first + return Variable.new(markup, parse_context) + end + raise_missing_variable_terminator(token, parse_context) + end + + def raise_missing_tag_terminator(token, parse_context) + raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_termination".freeze, token: token, tag_end: TagEnd.inspect)) + end + + def raise_missing_variable_terminator(token, parse_context) + raise SyntaxError.new(parse_context.locale.t("errors.syntax.variable_termination".freeze, token: token, tag_end: VariableEnd.inspect)) + end + + def registered_tags + Template.tags + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/condition.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/condition.rb new file mode 100644 index 000000000000..3b51682e4b67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/condition.rb @@ -0,0 +1,151 @@ +module Liquid + # Container for liquid nodes which conveniently wraps decision making logic + # + # Example: + # + # c = Condition.new(1, '==', 1) + # c.evaluate #=> true + # + class Condition #:nodoc: + @@operators = { + '=='.freeze => ->(cond, left, right) { cond.send(:equal_variables, left, right) }, + '!='.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) }, + '<>'.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) }, + '<'.freeze => :<, + '>'.freeze => :>, + '>='.freeze => :>=, + '<='.freeze => :<=, + 'contains'.freeze => lambda do |cond, left, right| + if left && right && left.respond_to?(:include?) + right = right.to_s if left.is_a?(String) + left.include?(right) + else + false + end + end + } + + def self.operators + @@operators + end + + attr_reader :attachment, :child_condition + attr_accessor :left, :operator, :right + + def initialize(left = nil, operator = nil, right = nil) + @left = left + @operator = operator + @right = right + @child_relation = nil + @child_condition = nil + end + + def evaluate(context = Context.new) + condition = self + result = nil + loop do + result = interpret_condition(condition.left, condition.right, condition.operator, context) + + case condition.child_relation + when :or + break if result + when :and + break unless result + else + break + end + condition = condition.child_condition + end + result + end + + def or(condition) + @child_relation = :or + @child_condition = condition + end + + def and(condition) + @child_relation = :and + @child_condition = condition + end + + def attach(attachment) + @attachment = attachment + end + + def else? + false + end + + def inspect + "#<Condition #{[@left, @operator, @right].compact.join(' '.freeze)}>" + end + + protected + + attr_reader :child_relation + + private + + def equal_variables(left, right) + if left.is_a?(Liquid::Expression::MethodLiteral) + if right.respond_to?(left.method_name) + return right.send(left.method_name) + else + return nil + end + end + + if right.is_a?(Liquid::Expression::MethodLiteral) + if left.respond_to?(right.method_name) + return left.send(right.method_name) + else + return nil + end + end + + left == right + end + + def interpret_condition(left, right, op, context) + # If the operator is empty this means that the decision statement is just + # a single variable. We can just poll this variable from the context and + # return this as the result. + return context.evaluate(left) if op.nil? + + left = context.evaluate(left) + right = context.evaluate(right) + + operation = self.class.operators[op] || raise(Liquid::ArgumentError.new("Unknown operator #{op}")) + + if operation.respond_to?(:call) + operation.call(self, left, right) + elsif left.respond_to?(operation) && right.respond_to?(operation) && !left.is_a?(Hash) && !right.is_a?(Hash) + begin + left.send(operation, right) + rescue ::ArgumentError => e + raise Liquid::ArgumentError.new(e.message) + end + end + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + [ + @node.left, @node.right, + @node.child_condition, @node.attachment + ].compact + end + end + end + + class ElseCondition < Condition + def else? + true + end + + def evaluate(_context) + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/context.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/context.rb new file mode 100644 index 000000000000..2dcc6af8cda1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/context.rb @@ -0,0 +1,226 @@ +module Liquid + # Context keeps the variable stack and resolves variables, as well as keywords + # + # context['variable'] = 'testing' + # context['variable'] #=> 'testing' + # context['true'] #=> true + # context['10.2232'] #=> 10.2232 + # + # context.stack do + # context['bob'] = 'bobsen' + # end + # + # context['bob'] #=> nil class Context + class Context + attr_reader :scopes, :errors, :registers, :environments, :resource_limits + attr_accessor :exception_renderer, :template_name, :partial, :global_filter, :strict_variables, :strict_filters + + def initialize(environments = {}, outer_scope = {}, registers = {}, rethrow_errors = false, resource_limits = nil) + @environments = [environments].flatten + @scopes = [(outer_scope || {})] + @registers = registers + @errors = [] + @partial = false + @strict_variables = false + @resource_limits = resource_limits || ResourceLimits.new(Template.default_resource_limits) + squash_instance_assigns_with_environments + + @this_stack_used = false + + self.exception_renderer = Template.default_exception_renderer + if rethrow_errors + self.exception_renderer = ->(e) { raise } + end + + @interrupts = [] + @filters = [] + @global_filter = nil + end + + def warnings + @warnings ||= [] + end + + def strainer + @strainer ||= Strainer.create(self, @filters) + end + + # Adds filters to this context. + # + # Note that this does not register the filters with the main Template object. see <tt>Template.register_filter</tt> + # for that + def add_filters(filters) + filters = [filters].flatten.compact + @filters += filters + @strainer = nil + end + + def apply_global_filter(obj) + global_filter.nil? ? obj : global_filter.call(obj) + end + + # are there any not handled interrupts? + def interrupt? + !@interrupts.empty? + end + + # push an interrupt to the stack. this interrupt is considered not handled. + def push_interrupt(e) + @interrupts.push(e) + end + + # pop an interrupt from the stack + def pop_interrupt + @interrupts.pop + end + + def handle_error(e, line_number = nil) + e = internal_error unless e.is_a?(Liquid::Error) + e.template_name ||= template_name + e.line_number ||= line_number + errors.push(e) + exception_renderer.call(e).to_s + end + + def invoke(method, *args) + strainer.invoke(method, *args).to_liquid + end + + # Push new local scope on the stack. use <tt>Context#stack</tt> instead + def push(new_scope = {}) + @scopes.unshift(new_scope) + raise StackLevelError, "Nesting too deep".freeze if @scopes.length > Block::MAX_DEPTH + end + + # Merge a hash of variables in the current local scope + def merge(new_scopes) + @scopes[0].merge!(new_scopes) + end + + # Pop from the stack. use <tt>Context#stack</tt> instead + def pop + raise ContextError if @scopes.size == 1 + @scopes.shift + end + + # Pushes a new local scope on the stack, pops it at the end of the block + # + # Example: + # context.stack do + # context['var'] = 'hi' + # end + # + # context['var] #=> nil + def stack(new_scope = nil) + old_stack_used = @this_stack_used + if new_scope + push(new_scope) + @this_stack_used = true + else + @this_stack_used = false + end + + yield + ensure + pop if @this_stack_used + @this_stack_used = old_stack_used + end + + def clear_instance_assigns + @scopes[0] = {} + end + + # Only allow String, Numeric, Hash, Array, Proc, Boolean or <tt>Liquid::Drop</tt> + def []=(key, value) + unless @this_stack_used + @this_stack_used = true + push({}) + end + @scopes[0][key] = value + end + + # Look up variable, either resolve directly after considering the name. We can directly handle + # Strings, digits, floats and booleans (true,false). + # If no match is made we lookup the variable in the current scope and + # later move up to the parent blocks to see if we can resolve the variable somewhere up the tree. + # Some special keywords return symbols. Those symbols are to be called on the rhs object in expressions + # + # Example: + # products == empty #=> products.empty? + def [](expression) + evaluate(Expression.parse(expression)) + end + + def key?(key) + self[key] != nil + end + + def evaluate(object) + object.respond_to?(:evaluate) ? object.evaluate(self) : object + end + + # Fetches an object starting at the local scope and then moving up the hierachy + def find_variable(key, raise_on_not_found: true) + # This was changed from find() to find_index() because this is a very hot + # path and find_index() is optimized in MRI to reduce object allocation + index = @scopes.find_index { |s| s.key?(key) } + scope = @scopes[index] if index + + variable = nil + + if scope.nil? + @environments.each do |e| + variable = lookup_and_evaluate(e, key, raise_on_not_found: raise_on_not_found) + # When lookup returned a value OR there is no value but the lookup also did not raise + # then it is the value we are looking for. + if !variable.nil? || @strict_variables && raise_on_not_found + scope = e + break + end + end + end + + scope ||= @environments.last || @scopes.last + variable ||= lookup_and_evaluate(scope, key, raise_on_not_found: raise_on_not_found) + + variable = variable.to_liquid + variable.context = self if variable.respond_to?(:context=) + + variable + end + + def lookup_and_evaluate(obj, key, raise_on_not_found: true) + if @strict_variables && raise_on_not_found && obj.respond_to?(:key?) && !obj.key?(key) + raise Liquid::UndefinedVariable, "undefined variable #{key}" + end + + value = obj[key] + + if value.is_a?(Proc) && obj.respond_to?(:[]=) + obj[key] = (value.arity == 0) ? value.call : value.call(self) + else + value + end + end + + private + + def internal_error + # raise and catch to set backtrace and cause on exception + raise Liquid::InternalError, 'internal' + rescue Liquid::InternalError => exc + exc + end + + def squash_instance_assigns_with_environments + @scopes.last.each_key do |k| + @environments.each do |env| + if env.key?(k) + scopes.last[k] = lookup_and_evaluate(env, k) + break + end + end + end + end # squash_instance_assigns_with_environments + end # Context +end # Liquid diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/document.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/document.rb new file mode 100644 index 000000000000..d035dd466eaa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/document.rb @@ -0,0 +1,27 @@ +module Liquid + class Document < BlockBody + def self.parse(tokens, parse_context) + doc = new + doc.parse(tokens, parse_context) + doc + end + + def parse(tokens, parse_context) + super do |end_tag_name, end_tag_params| + unknown_tag(end_tag_name, parse_context) if end_tag_name + end + rescue SyntaxError => e + e.line_number ||= parse_context.line_number + raise + end + + def unknown_tag(tag, parse_context) + case tag + when 'else'.freeze, 'end'.freeze + raise SyntaxError.new(parse_context.locale.t("errors.syntax.unexpected_outer_tag".freeze, tag: tag)) + else + raise SyntaxError.new(parse_context.locale.t("errors.syntax.unknown_tag".freeze, tag: tag)) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/drop.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/drop.rb new file mode 100644 index 000000000000..6b5aa99330b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/drop.rb @@ -0,0 +1,78 @@ +require 'set' + +module Liquid + # A drop in liquid is a class which allows you to export DOM like things to liquid. + # Methods of drops are callable. + # The main use for liquid drops is to implement lazy loaded objects. + # If you would like to make data available to the web designers which you don't want loaded unless needed then + # a drop is a great way to do that. + # + # Example: + # + # class ProductDrop < Liquid::Drop + # def top_sales + # Shop.current.products.find(:all, :order => 'sales', :limit => 10 ) + # end + # end + # + # tmpl = Liquid::Template.parse( ' {% for product in product.top_sales %} {{ product.name }} {%endfor%} ' ) + # tmpl.render('product' => ProductDrop.new ) # will invoke top_sales query. + # + # Your drop can either implement the methods sans any parameters + # or implement the liquid_method_missing(name) method which is a catch all. + class Drop + attr_writer :context + + # Catch all for the method + def liquid_method_missing(method) + return nil unless @context && @context.strict_variables + raise Liquid::UndefinedDropMethod, "undefined method #{method}" + end + + # called by liquid to invoke a drop + def invoke_drop(method_or_key) + if self.class.invokable?(method_or_key) + send(method_or_key) + else + liquid_method_missing(method_or_key) + end + end + + def key?(_name) + true + end + + def inspect + self.class.to_s + end + + def to_liquid + self + end + + def to_s + self.class.name + end + + alias_method :[], :invoke_drop + + # Check for method existence without invoking respond_to?, which creates symbols + def self.invokable?(method_name) + invokable_methods.include?(method_name.to_s) + end + + def self.invokable_methods + @invokable_methods ||= begin + blacklist = Liquid::Drop.public_instance_methods + [:each] + + if include?(Enumerable) + blacklist += Enumerable.public_instance_methods + blacklist -= [:sort, :count, :first, :min, :max, :include?] + end + + whitelist = [:to_liquid] + (public_instance_methods - blacklist) + Set.new(whitelist.map(&:to_s)) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/errors.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/errors.rb new file mode 100644 index 000000000000..defa5ea97f05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/errors.rb @@ -0,0 +1,56 @@ +module Liquid + class Error < ::StandardError + attr_accessor :line_number + attr_accessor :template_name + attr_accessor :markup_context + + def to_s(with_prefix = true) + str = "" + str << message_prefix if with_prefix + str << super() + + if markup_context + str << " " + str << markup_context + end + + str + end + + private + + def message_prefix + str = "" + if is_a?(SyntaxError) + str << "Liquid syntax error" + else + str << "Liquid error" + end + + if line_number + str << " (" + str << template_name << " " if template_name + str << "line " << line_number.to_s << ")" + end + + str << ": " + str + end + end + + ArgumentError = Class.new(Error) + ContextError = Class.new(Error) + FileSystemError = Class.new(Error) + StandardError = Class.new(Error) + SyntaxError = Class.new(Error) + StackLevelError = Class.new(Error) + TaintedError = Class.new(Error) + MemoryError = Class.new(Error) + ZeroDivisionError = Class.new(Error) + FloatDomainError = Class.new(Error) + UndefinedVariable = Class.new(Error) + UndefinedDropMethod = Class.new(Error) + UndefinedFilter = Class.new(Error) + MethodOverrideError = Class.new(Error) + InternalError = Class.new(Error) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/expression.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/expression.rb new file mode 100644 index 000000000000..98be6db646ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/expression.rb @@ -0,0 +1,49 @@ +module Liquid + class Expression + class MethodLiteral + attr_reader :method_name, :to_s + + def initialize(method_name, to_s) + @method_name = method_name + @to_s = to_s + end + + def to_liquid + to_s + end + end + + LITERALS = { + nil => nil, 'nil'.freeze => nil, 'null'.freeze => nil, ''.freeze => nil, + 'true'.freeze => true, + 'false'.freeze => false, + 'blank'.freeze => MethodLiteral.new(:blank?, '').freeze, + 'empty'.freeze => MethodLiteral.new(:empty?, '').freeze + }.freeze + + SINGLE_QUOTED_STRING = /\A'(.*)'\z/m + DOUBLE_QUOTED_STRING = /\A"(.*)"\z/m + INTEGERS_REGEX = /\A(-?\d+)\z/ + FLOATS_REGEX = /\A(-?\d[\d\.]+)\z/ + RANGES_REGEX = /\A\((\S+)\.\.(\S+)\)\z/ + + def self.parse(markup) + if LITERALS.key?(markup) + LITERALS[markup] + else + case markup + when SINGLE_QUOTED_STRING, DOUBLE_QUOTED_STRING + $1 + when INTEGERS_REGEX + $1.to_i + when RANGES_REGEX + RangeLookup.parse($1, $2) + when FLOATS_REGEX + $1.to_f + else + VariableLookup.parse(markup) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/extensions.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/extensions.rb new file mode 100644 index 000000000000..0907819302f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/extensions.rb @@ -0,0 +1,74 @@ +require 'time' +require 'date' + +class String # :nodoc: + def to_liquid + self + end +end + +class Symbol # :nodoc: + def to_liquid + to_s + end +end + +class Array # :nodoc: + def to_liquid + self + end +end + +class Hash # :nodoc: + def to_liquid + self + end +end + +class Numeric # :nodoc: + def to_liquid + self + end +end + +class Range # :nodoc: + def to_liquid + self + end +end + +class Time # :nodoc: + def to_liquid + self + end +end + +class DateTime < Date # :nodoc: + def to_liquid + self + end +end + +class Date # :nodoc: + def to_liquid + self + end +end + +class TrueClass + def to_liquid # :nodoc: + self + end +end + +class FalseClass + def to_liquid # :nodoc: + self + end +end + +class NilClass + def to_liquid # :nodoc: + self + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/file_system.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/file_system.rb new file mode 100644 index 000000000000..13f1f46060ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/file_system.rb @@ -0,0 +1,73 @@ +module Liquid + # A Liquid file system is a way to let your templates retrieve other templates for use with the include tag. + # + # You can implement subclasses that retrieve templates from the database, from the file system using a different + # path structure, you can provide them as hard-coded inline strings, or any manner that you see fit. + # + # You can add additional instance variables, arguments, or methods as needed. + # + # Example: + # + # Liquid::Template.file_system = Liquid::LocalFileSystem.new(template_path) + # liquid = Liquid::Template.parse(template) + # + # This will parse the template with a LocalFileSystem implementation rooted at 'template_path'. + class BlankFileSystem + # Called by Liquid to retrieve a template file + def read_template_file(_template_path) + raise FileSystemError, "This liquid context does not allow includes." + end + end + + # This implements an abstract file system which retrieves template files named in a manner similar to Rails partials, + # ie. with the template name prefixed with an underscore. The extension ".liquid" is also added. + # + # For security reasons, template paths are only allowed to contain letters, numbers, and underscore. + # + # Example: + # + # file_system = Liquid::LocalFileSystem.new("/some/path") + # + # file_system.full_path("mypartial") # => "/some/path/_mypartial.liquid" + # file_system.full_path("dir/mypartial") # => "/some/path/dir/_mypartial.liquid" + # + # Optionally in the second argument you can specify a custom pattern for template filenames. + # The Kernel::sprintf format specification is used. + # Default pattern is "_%s.liquid". + # + # Example: + # + # file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html") + # + # file_system.full_path("index") # => "/some/path/index.html" + # + class LocalFileSystem + attr_accessor :root + + def initialize(root, pattern = "_%s.liquid".freeze) + @root = root + @pattern = pattern + end + + def read_template_file(template_path) + full_path = full_path(template_path) + raise FileSystemError, "No such template '#{template_path}'" unless File.exist?(full_path) + + File.read(full_path) + end + + def full_path(template_path) + raise FileSystemError, "Illegal template name '#{template_path}'" unless template_path =~ /\A[^.\/][a-zA-Z0-9_\/]+\z/ + + full_path = if template_path.include?('/'.freeze) + File.join(root, File.dirname(template_path), @pattern % File.basename(template_path)) + else + File.join(root, @pattern % template_path) + end + + raise FileSystemError, "Illegal template path '#{File.expand_path(full_path)}'" unless File.expand_path(full_path).start_with?(File.expand_path(root)) + + full_path + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/forloop_drop.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/forloop_drop.rb new file mode 100644 index 000000000000..81b2d1a28133 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/forloop_drop.rb @@ -0,0 +1,42 @@ +module Liquid + class ForloopDrop < Drop + def initialize(name, length, parentloop) + @name = name + @length = length + @parentloop = parentloop + @index = 0 + end + + attr_reader :name, :length, :parentloop + + def index + @index + 1 + end + + def index0 + @index + end + + def rindex + @length - @index + end + + def rindex0 + @length - @index - 1 + end + + def first + @index == 0 + end + + def last + @index == @length - 1 + end + + protected + + def increment! + @index += 1 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/i18n.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/i18n.rb new file mode 100644 index 000000000000..2671507e8d66 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/i18n.rb @@ -0,0 +1,39 @@ +require 'yaml' + +module Liquid + class I18n + DEFAULT_LOCALE = File.join(File.expand_path(__dir__), "locales", "en.yml") + + TranslationError = Class.new(StandardError) + + attr_reader :path + + def initialize(path = DEFAULT_LOCALE) + @path = path + end + + def translate(name, vars = {}) + interpolate(deep_fetch_translation(name), vars) + end + alias_method :t, :translate + + def locale + @locale ||= YAML.load_file(@path) + end + + private + + def interpolate(name, vars) + name.gsub(/%\{(\w+)\}/) do + # raise TranslationError, "Undefined key #{$1} for interpolation in translation #{name}" unless vars[$1.to_sym] + (vars[$1.to_sym]).to_s + end + end + + def deep_fetch_translation(name) + name.split('.'.freeze).reduce(locale) do |level, cur| + level[cur] or raise TranslationError, "Translation for #{name} does not exist in locale #{path}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/interrupts.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/interrupts.rb new file mode 100644 index 000000000000..41359d787587 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/interrupts.rb @@ -0,0 +1,16 @@ +module Liquid + # An interrupt is any command that breaks processing of a block (ex: a for loop). + class Interrupt + attr_reader :message + + def initialize(message = nil) + @message = message || "interrupt".freeze + end + end + + # Interrupt that is thrown whenever a {% break %} is called. + class BreakInterrupt < Interrupt; end + + # Interrupt that is thrown whenever a {% continue %} is called. + class ContinueInterrupt < Interrupt; end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/lexer.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/lexer.rb new file mode 100644 index 000000000000..f290744d3fea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/lexer.rb @@ -0,0 +1,55 @@ +require "strscan" +module Liquid + class Lexer + SPECIALS = { + '|'.freeze => :pipe, + '.'.freeze => :dot, + ':'.freeze => :colon, + ','.freeze => :comma, + '['.freeze => :open_square, + ']'.freeze => :close_square, + '('.freeze => :open_round, + ')'.freeze => :close_round, + '?'.freeze => :question, + '-'.freeze => :dash + }.freeze + IDENTIFIER = /[a-zA-Z_][\w-]*\??/ + SINGLE_STRING_LITERAL = /'[^\']*'/ + DOUBLE_STRING_LITERAL = /"[^\"]*"/ + NUMBER_LITERAL = /-?\d+(\.\d+)?/ + DOTDOT = /\.\./ + COMPARISON_OPERATOR = /==|!=|<>|<=?|>=?|contains(?=\s)/ + WHITESPACE_OR_NOTHING = /\s*/ + + def initialize(input) + @ss = StringScanner.new(input) + end + + def tokenize + @output = [] + + until @ss.eos? + @ss.skip(WHITESPACE_OR_NOTHING) + break if @ss.eos? + tok = case + when t = @ss.scan(COMPARISON_OPERATOR) then [:comparison, t] + when t = @ss.scan(SINGLE_STRING_LITERAL) then [:string, t] + when t = @ss.scan(DOUBLE_STRING_LITERAL) then [:string, t] + when t = @ss.scan(NUMBER_LITERAL) then [:number, t] + when t = @ss.scan(IDENTIFIER) then [:id, t] + when t = @ss.scan(DOTDOT) then [:dotdot, t] + else + c = @ss.getch + if s = SPECIALS[c] + [s, c] + else + raise SyntaxError, "Unexpected character #{c}" + end + end + @output << tok + end + + @output << [:end_of_string] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/locales/en.yml b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/locales/en.yml new file mode 100644 index 000000000000..48b3b1d8394e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/locales/en.yml @@ -0,0 +1,26 @@ +--- + errors: + syntax: + tag_unexpected_args: "Syntax Error in '%{tag}' - Valid syntax: %{tag}" + assign: "Syntax Error in 'assign' - Valid syntax: assign [var] = [source]" + capture: "Syntax Error in 'capture' - Valid syntax: capture [var]" + case: "Syntax Error in 'case' - Valid syntax: case [condition]" + case_invalid_when: "Syntax Error in tag 'case' - Valid when condition: {% when [condition] [or condition2...] %}" + case_invalid_else: "Syntax Error in tag 'case' - Valid else condition: {% else %} (no parameters) " + cycle: "Syntax Error in 'cycle' - Valid syntax: cycle [name :] var [, var2, var3 ...]" + for: "Syntax Error in 'for loop' - Valid syntax: for [item] in [collection]" + for_invalid_in: "For loops require an 'in' clause" + for_invalid_attribute: "Invalid attribute in for loop. Valid attributes are limit and offset" + if: "Syntax Error in tag 'if' - Valid syntax: if [expression]" + include: "Error in tag 'include' - Valid syntax: include '[template]' (with|for) [object|collection]" + unknown_tag: "Unknown tag '%{tag}'" + invalid_delimiter: "'%{tag}' is not a valid delimiter for %{block_name} tags. use %{block_delimiter}" + unexpected_else: "%{block_name} tag does not expect 'else' tag" + unexpected_outer_tag: "Unexpected outer '%{tag}' tag" + tag_termination: "Tag '%{token}' was not properly terminated with regexp: %{tag_end}" + variable_termination: "Variable '%{token}' was not properly terminated with regexp: %{tag_end}" + tag_never_closed: "'%{block_name}' tag was never closed" + meta_syntax_error: "Liquid syntax error: #{e.message}" + table_row: "Syntax Error in 'table_row loop' - Valid syntax: table_row [item] in [collection] cols=3" + argument: + include: "Argument error in tag 'include' - Illegal template name" diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parse_context.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parse_context.rb new file mode 100644 index 000000000000..abcdaeba8564 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parse_context.rb @@ -0,0 +1,38 @@ +module Liquid + class ParseContext + attr_accessor :locale, :line_number, :trim_whitespace, :depth + attr_reader :partial, :warnings, :error_mode + + def initialize(options = {}) + @template_options = options ? options.dup : {} + @locale = @template_options[:locale] ||= I18n.new + @warnings = [] + self.depth = 0 + self.partial = false + end + + def [](option_key) + @options[option_key] + end + + def partial=(value) + @partial = value + @options = value ? partial_options : @template_options + @error_mode = @options[:error_mode] || Template.error_mode + value + end + + def partial_options + @partial_options ||= begin + dont_pass = @template_options[:include_options_blacklist] + if dont_pass == true + { locale: locale } + elsif dont_pass.is_a?(Array) + @template_options.reject { |k, v| dont_pass.include?(k) } + else + @template_options + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parse_tree_visitor.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parse_tree_visitor.rb new file mode 100644 index 000000000000..74f5563afe92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parse_tree_visitor.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Liquid + class ParseTreeVisitor + def self.for(node, callbacks = Hash.new(proc {})) + if defined?(node.class::ParseTreeVisitor) + node.class::ParseTreeVisitor + else + self + end.new(node, callbacks) + end + + def initialize(node, callbacks) + @node = node + @callbacks = callbacks + end + + def add_callback_for(*classes, &block) + callback = block + callback = ->(node, _) { yield node } if block.arity.abs == 1 + callback = ->(_, _) { yield } if block.arity.zero? + classes.each { |klass| @callbacks[klass] = callback } + self + end + + def visit(context = nil) + children.map do |node| + item, new_context = @callbacks[node.class].call(node, context) + [ + item, + ParseTreeVisitor.for(node, @callbacks).visit(new_context || context) + ] + end + end + + protected + + def children + @node.respond_to?(:nodelist) ? Array(@node.nodelist) : [] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parser.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parser.rb new file mode 100644 index 000000000000..69543434205d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parser.rb @@ -0,0 +1,90 @@ +module Liquid + class Parser + def initialize(input) + l = Lexer.new(input) + @tokens = l.tokenize + @p = 0 # pointer to current location + end + + def jump(point) + @p = point + end + + def consume(type = nil) + token = @tokens[@p] + if type && token[0] != type + raise SyntaxError, "Expected #{type} but found #{@tokens[@p].first}" + end + @p += 1 + token[1] + end + + # Only consumes the token if it matches the type + # Returns the token's contents if it was consumed + # or false otherwise. + def consume?(type) + token = @tokens[@p] + return false unless token && token[0] == type + @p += 1 + token[1] + end + + # Like consume? Except for an :id token of a certain name + def id?(str) + token = @tokens[@p] + return false unless token && token[0] == :id + return false unless token[1] == str + @p += 1 + token[1] + end + + def look(type, ahead = 0) + tok = @tokens[@p + ahead] + return false unless tok + tok[0] == type + end + + def expression + token = @tokens[@p] + if token[0] == :id + variable_signature + elsif [:string, :number].include? token[0] + consume + elsif token.first == :open_round + consume + first = expression + consume(:dotdot) + last = expression + consume(:close_round) + "(#{first}..#{last})" + else + raise SyntaxError, "#{token} is not a valid expression" + end + end + + def argument + str = "" + # might be a keyword argument (identifier: expression) + if look(:id) && look(:colon, 1) + str << consume << consume << ' '.freeze + end + + str << expression + str + end + + def variable_signature + str = consume(:id) + while look(:open_square) + str << consume + str << expression + str << consume(:close_square) + end + if look(:dot) + str << consume + str << variable_signature + end + str + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parser_switching.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parser_switching.rb new file mode 100644 index 000000000000..3aa664abee32 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/parser_switching.rb @@ -0,0 +1,31 @@ +module Liquid + module ParserSwitching + def parse_with_selected_parser(markup) + case parse_context.error_mode + when :strict then strict_parse_with_error_context(markup) + when :lax then lax_parse(markup) + when :warn + begin + return strict_parse_with_error_context(markup) + rescue SyntaxError => e + parse_context.warnings << e + return lax_parse(markup) + end + end + end + + private + + def strict_parse_with_error_context(markup) + strict_parse(markup) + rescue SyntaxError => e + e.line_number = line_number + e.markup_context = markup_context(markup) + raise e + end + + def markup_context(markup) + "in \"#{markup.strip}\"" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/profiler.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/profiler.rb new file mode 100644 index 000000000000..dc9db60a7847 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/profiler.rb @@ -0,0 +1,158 @@ +require 'liquid/profiler/hooks' + +module Liquid + # Profiler enables support for profiling template rendering to help track down performance issues. + # + # To enable profiling, first require 'liquid/profiler'. + # Then, to profile a parse/render cycle, pass the <tt>profile: true</tt> option to <tt>Liquid::Template.parse</tt>. + # After <tt>Liquid::Template#render</tt> is called, the template object makes available an instance of this + # class via the <tt>Liquid::Template#profiler</tt> method. + # + # template = Liquid::Template.parse(template_content, profile: true) + # output = template.render + # profile = template.profiler + # + # This object contains all profiling information, containing information on what tags were rendered, + # where in the templates these tags live, and how long each tag took to render. + # + # This is a tree structure that is Enumerable all the way down, and keeps track of tags and rendering times + # inside of <tt>{% include %}</tt> tags. + # + # profile.each do |node| + # # Access to the node itself + # node.code + # + # # Which template and line number of this node. + # # If top level, this will be "<root>". + # node.partial + # node.line_number + # + # # Render time in seconds of this node + # node.render_time + # + # # If the template used {% include %}, this node will also have children. + # node.children.each do |child2| + # # ... + # end + # end + # + # Profiler also exposes the total time of the template's render in <tt>Liquid::Profiler#total_render_time</tt>. + # + # All render times are in seconds. There is a small performance hit when profiling is enabled. + # + class Profiler + include Enumerable + + class Timing + attr_reader :code, :partial, :line_number, :children + + def initialize(node, partial) + @code = node.respond_to?(:raw) ? node.raw : node + @partial = partial + @line_number = node.respond_to?(:line_number) ? node.line_number : nil + @children = [] + end + + def self.start(node, partial) + new(node, partial).tap(&:start) + end + + def start + @start_time = Time.now + end + + def finish + @end_time = Time.now + end + + def render_time + @end_time - @start_time + end + end + + def self.profile_node_render(node) + if Profiler.current_profile && node.respond_to?(:render) + Profiler.current_profile.start_node(node) + output = yield + Profiler.current_profile.end_node(node) + output + else + yield + end + end + + def self.profile_children(template_name) + if Profiler.current_profile + Profiler.current_profile.push_partial(template_name) + output = yield + Profiler.current_profile.pop_partial + output + else + yield + end + end + + def self.current_profile + Thread.current[:liquid_profiler] + end + + def initialize + @partial_stack = ["<root>"] + + @root_timing = Timing.new("", current_partial) + @timing_stack = [@root_timing] + + @render_start_at = Time.now + @render_end_at = @render_start_at + end + + def start + Thread.current[:liquid_profiler] = self + @render_start_at = Time.now + end + + def stop + Thread.current[:liquid_profiler] = nil + @render_end_at = Time.now + end + + def total_render_time + @render_end_at - @render_start_at + end + + def each(&block) + @root_timing.children.each(&block) + end + + def [](idx) + @root_timing.children[idx] + end + + def length + @root_timing.children.length + end + + def start_node(node) + @timing_stack.push(Timing.start(node, current_partial)) + end + + def end_node(_node) + timing = @timing_stack.pop + timing.finish + + @timing_stack.last.children << timing + end + + def current_partial + @partial_stack.last + end + + def push_partial(partial_name) + @partial_stack.push(partial_name) + end + + def pop_partial + @partial_stack.pop + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/profiler/hooks.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/profiler/hooks.rb new file mode 100644 index 000000000000..cb11cd7e9a99 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/profiler/hooks.rb @@ -0,0 +1,23 @@ +module Liquid + class BlockBody + def render_node_with_profiling(node, output, context, skip_output = false) + Profiler.profile_node_render(node) do + render_node_without_profiling(node, output, context, skip_output) + end + end + + alias_method :render_node_without_profiling, :render_node_to_output + alias_method :render_node_to_output, :render_node_with_profiling + end + + class Include < Tag + def render_with_profiling(context) + Profiler.profile_children(context.evaluate(@template_name_expr).to_s) do + render_without_profiling(context) + end + end + + alias_method :render_without_profiling, :render + alias_method :render, :render_with_profiling + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/range_lookup.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/range_lookup.rb new file mode 100644 index 000000000000..93bb420c1d28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/range_lookup.rb @@ -0,0 +1,37 @@ +module Liquid + class RangeLookup + def self.parse(start_markup, end_markup) + start_obj = Expression.parse(start_markup) + end_obj = Expression.parse(end_markup) + if start_obj.respond_to?(:evaluate) || end_obj.respond_to?(:evaluate) + new(start_obj, end_obj) + else + start_obj.to_i..end_obj.to_i + end + end + + def initialize(start_obj, end_obj) + @start_obj = start_obj + @end_obj = end_obj + end + + def evaluate(context) + start_int = to_integer(context.evaluate(@start_obj)) + end_int = to_integer(context.evaluate(@end_obj)) + start_int..end_int + end + + private + + def to_integer(input) + case input + when Integer + input + when NilClass, String + input.to_i + else + Utils.to_integer(input) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/resource_limits.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/resource_limits.rb new file mode 100644 index 000000000000..08b359bab5e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/resource_limits.rb @@ -0,0 +1,23 @@ +module Liquid + class ResourceLimits + attr_accessor :render_length, :render_score, :assign_score, + :render_length_limit, :render_score_limit, :assign_score_limit + + def initialize(limits) + @render_length_limit = limits[:render_length_limit] + @render_score_limit = limits[:render_score_limit] + @assign_score_limit = limits[:assign_score_limit] + reset + end + + def reached? + (@render_length_limit && @render_length > @render_length_limit) || + (@render_score_limit && @render_score > @render_score_limit) || + (@assign_score_limit && @assign_score > @assign_score_limit) + end + + def reset + @render_length = @render_score = @assign_score = 0 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/standardfilters.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/standardfilters.rb new file mode 100644 index 000000000000..0bddfa97893b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/standardfilters.rb @@ -0,0 +1,506 @@ +require 'cgi' +require 'bigdecimal' + +module Liquid + module StandardFilters + HTML_ESCAPE = { + '&'.freeze => '&amp;'.freeze, + '>'.freeze => '&gt;'.freeze, + '<'.freeze => '&lt;'.freeze, + '"'.freeze => '&quot;'.freeze, + "'".freeze => '&#39;'.freeze + }.freeze + HTML_ESCAPE_ONCE_REGEXP = /["><']|&(?!([a-zA-Z]+|(#\d+));)/ + STRIP_HTML_BLOCKS = Regexp.union( + /<script.*?<\/script>/m, + /<!--.*?-->/m, + /<style.*?<\/style>/m + ) + STRIP_HTML_TAGS = /<.*?>/m + + # Return the size of an array or of an string + def size(input) + input.respond_to?(:size) ? input.size : 0 + end + + # convert an input string to DOWNCASE + def downcase(input) + input.to_s.downcase + end + + # convert an input string to UPCASE + def upcase(input) + input.to_s.upcase + end + + # capitalize words in the input centence + def capitalize(input) + input.to_s.capitalize + end + + def escape(input) + CGI.escapeHTML(input.to_s).untaint unless input.nil? + end + alias_method :h, :escape + + def escape_once(input) + input.to_s.gsub(HTML_ESCAPE_ONCE_REGEXP, HTML_ESCAPE) + end + + def url_encode(input) + CGI.escape(input.to_s) unless input.nil? + end + + def url_decode(input) + return if input.nil? + + result = CGI.unescape(input.to_s) + raise Liquid::ArgumentError, "invalid byte sequence in #{result.encoding}" unless result.valid_encoding? + + result + end + + def slice(input, offset, length = nil) + offset = Utils.to_integer(offset) + length = length ? Utils.to_integer(length) : 1 + + if input.is_a?(Array) + input.slice(offset, length) || [] + else + input.to_s.slice(offset, length) || '' + end + end + + # Truncate a string down to x characters + def truncate(input, length = 50, truncate_string = "...".freeze) + return if input.nil? + input_str = input.to_s + length = Utils.to_integer(length) + truncate_string_str = truncate_string.to_s + l = length - truncate_string_str.length + l = 0 if l < 0 + input_str.length > length ? input_str[0...l] + truncate_string_str : input_str + end + + def truncatewords(input, words = 15, truncate_string = "...".freeze) + return if input.nil? + wordlist = input.to_s.split + words = Utils.to_integer(words) + l = words - 1 + l = 0 if l < 0 + wordlist.length > l ? wordlist[0..l].join(" ".freeze) + truncate_string.to_s : input + end + + # Split input string into an array of substrings separated by given pattern. + # + # Example: + # <div class="summary">{{ post | split '//' | first }}</div> + # + def split(input, pattern) + input.to_s.split(pattern.to_s) + end + + def strip(input) + input.to_s.strip + end + + def lstrip(input) + input.to_s.lstrip + end + + def rstrip(input) + input.to_s.rstrip + end + + def strip_html(input) + empty = ''.freeze + result = input.to_s.gsub(STRIP_HTML_BLOCKS, empty) + result.gsub!(STRIP_HTML_TAGS, empty) + result + end + + # Remove all newlines from the string + def strip_newlines(input) + input.to_s.gsub(/\r?\n/, ''.freeze) + end + + # Join elements of the array with certain character between them + def join(input, glue = ' '.freeze) + InputIterator.new(input).join(glue) + end + + # Sort elements of the array + # provide optional property with which to sort an array of hashes or drops + def sort(input, property = nil) + ary = InputIterator.new(input) + + return [] if ary.empty? + + if property.nil? + ary.sort do |a, b| + nil_safe_compare(a, b) + end + elsif ary.all? { |el| el.respond_to?(:[]) } + begin + ary.sort { |a, b| nil_safe_compare(a[property], b[property]) } + rescue TypeError + raise_property_error(property) + end + end + end + + # Sort elements of an array ignoring case if strings + # provide optional property with which to sort an array of hashes or drops + def sort_natural(input, property = nil) + ary = InputIterator.new(input) + + return [] if ary.empty? + + if property.nil? + ary.sort do |a, b| + nil_safe_casecmp(a, b) + end + elsif ary.all? { |el| el.respond_to?(:[]) } + begin + ary.sort { |a, b| nil_safe_casecmp(a[property], b[property]) } + rescue TypeError + raise_property_error(property) + end + end + end + + # Filter the elements of an array to those with a certain property value. + # By default the target is any truthy value. + def where(input, property, target_value = nil) + ary = InputIterator.new(input) + + if ary.empty? + [] + elsif ary.first.respond_to?(:[]) && target_value.nil? + begin + ary.select { |item| item[property] } + rescue TypeError + raise_property_error(property) + end + elsif ary.first.respond_to?(:[]) + begin + ary.select { |item| item[property] == target_value } + rescue TypeError + raise_property_error(property) + end + end + end + + # Remove duplicate elements from an array + # provide optional property with which to determine uniqueness + def uniq(input, property = nil) + ary = InputIterator.new(input) + + if property.nil? + ary.uniq + elsif ary.empty? # The next two cases assume a non-empty array. + [] + elsif ary.first.respond_to?(:[]) + begin + ary.uniq { |a| a[property] } + rescue TypeError + raise_property_error(property) + end + end + end + + # Reverse the elements of an array + def reverse(input) + ary = InputIterator.new(input) + ary.reverse + end + + # map/collect on a given property + def map(input, property) + InputIterator.new(input).map do |e| + e = e.call if e.is_a?(Proc) + + if property == "to_liquid".freeze + e + elsif e.respond_to?(:[]) + r = e[property] + r.is_a?(Proc) ? r.call : r + end + end + rescue TypeError + raise_property_error(property) + end + + # Remove nils within an array + # provide optional property with which to check for nil + def compact(input, property = nil) + ary = InputIterator.new(input) + + if property.nil? + ary.compact + elsif ary.empty? # The next two cases assume a non-empty array. + [] + elsif ary.first.respond_to?(:[]) + begin + ary.reject { |a| a[property].nil? } + rescue TypeError + raise_property_error(property) + end + end + end + + # Replace occurrences of a string with another + def replace(input, string, replacement = ''.freeze) + input.to_s.gsub(string.to_s, replacement.to_s) + end + + # Replace the first occurrences of a string with another + def replace_first(input, string, replacement = ''.freeze) + input.to_s.sub(string.to_s, replacement.to_s) + end + + # remove a substring + def remove(input, string) + input.to_s.gsub(string.to_s, ''.freeze) + end + + # remove the first occurrences of a substring + def remove_first(input, string) + input.to_s.sub(string.to_s, ''.freeze) + end + + # add one string to another + def append(input, string) + input.to_s + string.to_s + end + + def concat(input, array) + unless array.respond_to?(:to_ary) + raise ArgumentError.new("concat filter requires an array argument") + end + InputIterator.new(input).concat(array) + end + + # prepend a string to another + def prepend(input, string) + string.to_s + input.to_s + end + + # Add <br /> tags in front of all newlines in input string + def newline_to_br(input) + input.to_s.gsub(/\n/, "<br />\n".freeze) + end + + # Reformat a date using Ruby's core Time#strftime( string ) -> string + # + # %a - The abbreviated weekday name (``Sun'') + # %A - The full weekday name (``Sunday'') + # %b - The abbreviated month name (``Jan'') + # %B - The full month name (``January'') + # %c - The preferred local date and time representation + # %d - Day of the month (01..31) + # %H - Hour of the day, 24-hour clock (00..23) + # %I - Hour of the day, 12-hour clock (01..12) + # %j - Day of the year (001..366) + # %m - Month of the year (01..12) + # %M - Minute of the hour (00..59) + # %p - Meridian indicator (``AM'' or ``PM'') + # %s - Number of seconds since 1970-01-01 00:00:00 UTC. + # %S - Second of the minute (00..60) + # %U - Week number of the current year, + # starting with the first Sunday as the first + # day of the first week (00..53) + # %W - Week number of the current year, + # starting with the first Monday as the first + # day of the first week (00..53) + # %w - Day of the week (Sunday is 0, 0..6) + # %x - Preferred representation for the date alone, no time + # %X - Preferred representation for the time alone, no date + # %y - Year without a century (00..99) + # %Y - Year with century + # %Z - Time zone name + # %% - Literal ``%'' character + # + # See also: http://www.ruby-doc.org/core/Time.html#method-i-strftime + def date(input, format) + return input if format.to_s.empty? + + return input unless date = Utils.to_date(input) + + date.strftime(format.to_s) + end + + # Get the first element of the passed in array + # + # Example: + # {{ product.images | first | to_img }} + # + def first(array) + array.first if array.respond_to?(:first) + end + + # Get the last element of the passed in array + # + # Example: + # {{ product.images | last | to_img }} + # + def last(array) + array.last if array.respond_to?(:last) + end + + # absolute value + def abs(input) + result = Utils.to_number(input).abs + result.is_a?(BigDecimal) ? result.to_f : result + end + + # addition + def plus(input, operand) + apply_operation(input, operand, :+) + end + + # subtraction + def minus(input, operand) + apply_operation(input, operand, :-) + end + + # multiplication + def times(input, operand) + apply_operation(input, operand, :*) + end + + # division + def divided_by(input, operand) + apply_operation(input, operand, :/) + rescue ::ZeroDivisionError => e + raise Liquid::ZeroDivisionError, e.message + end + + def modulo(input, operand) + apply_operation(input, operand, :%) + rescue ::ZeroDivisionError => e + raise Liquid::ZeroDivisionError, e.message + end + + def round(input, n = 0) + result = Utils.to_number(input).round(Utils.to_number(n)) + result = result.to_f if result.is_a?(BigDecimal) + result = result.to_i if n == 0 + result + rescue ::FloatDomainError => e + raise Liquid::FloatDomainError, e.message + end + + def ceil(input) + Utils.to_number(input).ceil.to_i + rescue ::FloatDomainError => e + raise Liquid::FloatDomainError, e.message + end + + def floor(input) + Utils.to_number(input).floor.to_i + rescue ::FloatDomainError => e + raise Liquid::FloatDomainError, e.message + end + + def at_least(input, n) + min_value = Utils.to_number(n) + + result = Utils.to_number(input) + result = min_value if min_value > result + result.is_a?(BigDecimal) ? result.to_f : result + end + + def at_most(input, n) + max_value = Utils.to_number(n) + + result = Utils.to_number(input) + result = max_value if max_value < result + result.is_a?(BigDecimal) ? result.to_f : result + end + + def default(input, default_value = ''.freeze) + if !input || input.respond_to?(:empty?) && input.empty? + default_value + else + input + end + end + + private + + def raise_property_error(property) + raise Liquid::ArgumentError.new("cannot select the property '#{property}'") + end + + def apply_operation(input, operand, operation) + result = Utils.to_number(input).send(operation, Utils.to_number(operand)) + result.is_a?(BigDecimal) ? result.to_f : result + end + + def nil_safe_compare(a, b) + if !a.nil? && !b.nil? + a <=> b + else + a.nil? ? 1 : -1 + end + end + + def nil_safe_casecmp(a, b) + if !a.nil? && !b.nil? + a.to_s.casecmp(b.to_s) + else + a.nil? ? 1 : -1 + end + end + + class InputIterator + include Enumerable + + def initialize(input) + @input = if input.is_a?(Array) + input.flatten + elsif input.is_a?(Hash) + [input] + elsif input.is_a?(Enumerable) + input + else + Array(input) + end + end + + def join(glue) + to_a.join(glue.to_s) + end + + def concat(args) + to_a.concat(args) + end + + def reverse + reverse_each.to_a + end + + def uniq(&block) + to_a.uniq(&block) + end + + def compact + to_a.compact + end + + def empty? + @input.each { return false } + true + end + + def each + @input.each do |e| + yield(e.respond_to?(:to_liquid) ? e.to_liquid : e) + end + end + end + end + + Template.register_filter(StandardFilters) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/strainer.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/strainer.rb new file mode 100644 index 000000000000..76d56d23127f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/strainer.rb @@ -0,0 +1,66 @@ +require 'set' + +module Liquid + # Strainer is the parent class for the filters system. + # New filters are mixed into the strainer class which is then instantiated for each liquid template render run. + # + # The Strainer only allows method calls defined in filters given to it via Strainer.global_filter, + # Context#add_filters or Template.register_filter + class Strainer #:nodoc: + @@global_strainer = Class.new(Strainer) do + @filter_methods = Set.new + end + @@strainer_class_cache = Hash.new do |hash, filters| + hash[filters] = Class.new(@@global_strainer) do + @filter_methods = @@global_strainer.filter_methods.dup + filters.each { |f| add_filter(f) } + end + end + + def initialize(context) + @context = context + end + + class << self + attr_reader :filter_methods + end + + def self.add_filter(filter) + raise ArgumentError, "Expected module but got: #{filter.class}" unless filter.is_a?(Module) + unless self.include?(filter) + invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) } + if invokable_non_public_methods.any? + raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}" + else + send(:include, filter) + @filter_methods.merge(filter.public_instance_methods.map(&:to_s)) + end + end + end + + def self.global_filter(filter) + @@strainer_class_cache.clear + @@global_strainer.add_filter(filter) + end + + def self.invokable?(method) + @filter_methods.include?(method.to_s) + end + + def self.create(context, filters = []) + @@strainer_class_cache[filters].new(context) + end + + def invoke(method, *args) + if self.class.invokable?(method) + send(method, *args) + elsif @context && @context.strict_filters + raise Liquid::UndefinedFilter, "undefined filter #{method}" + else + args.first + end + rescue ::ArgumentError => e + raise Liquid::ArgumentError, e.message, e.backtrace + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tablerowloop_drop.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tablerowloop_drop.rb new file mode 100644 index 000000000000..cda4a1ed43ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tablerowloop_drop.rb @@ -0,0 +1,62 @@ +module Liquid + class TablerowloopDrop < Drop + def initialize(length, cols) + @length = length + @row = 1 + @col = 1 + @cols = cols + @index = 0 + end + + attr_reader :length, :col, :row + + def index + @index + 1 + end + + def index0 + @index + end + + def col0 + @col - 1 + end + + def rindex + @length - @index + end + + def rindex0 + @length - @index - 1 + end + + def first + @index == 0 + end + + def last + @index == @length - 1 + end + + def col_first + @col == 1 + end + + def col_last + @col == @cols + end + + protected + + def increment! + @index += 1 + + if @col == @cols + @col = 1 + @row += 1 + else + @col += 1 + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tag.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tag.rb new file mode 100644 index 000000000000..06970c18b01d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tag.rb @@ -0,0 +1,43 @@ +module Liquid + class Tag + attr_reader :nodelist, :tag_name, :line_number, :parse_context + alias_method :options, :parse_context + include ParserSwitching + + class << self + def parse(tag_name, markup, tokenizer, options) + tag = new(tag_name, markup, options) + tag.parse(tokenizer) + tag + end + + private :new + end + + def initialize(tag_name, markup, parse_context) + @tag_name = tag_name + @markup = markup + @parse_context = parse_context + @line_number = parse_context.line_number + end + + def parse(_tokens) + end + + def raw + "#{@tag_name} #{@markup}" + end + + def name + self.class.name.downcase + end + + def render(_context) + ''.freeze + end + + def blank? + false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/assign.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/assign.rb new file mode 100644 index 000000000000..c8d0574adca4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/assign.rb @@ -0,0 +1,59 @@ +module Liquid + # Assign sets a variable in your template. + # + # {% assign foo = 'monkey' %} + # + # You can then use the variable later in the page. + # + # {{ foo }} + # + class Assign < Tag + Syntax = /(#{VariableSignature}+)\s*=\s*(.*)\s*/om + + attr_reader :to, :from + + def initialize(tag_name, markup, options) + super + if markup =~ Syntax + @to = $1 + @from = Variable.new($2, options) + else + raise SyntaxError.new options[:locale].t("errors.syntax.assign".freeze) + end + end + + def render(context) + val = @from.render(context) + context.scopes.last[@to] = val + context.resource_limits.assign_score += assign_score_of(val) + ''.freeze + end + + def blank? + true + end + + private + + def assign_score_of(val) + if val.instance_of?(String) + val.length + elsif val.instance_of?(Array) || val.instance_of?(Hash) + sum = 1 + # Uses #each to avoid extra allocations. + val.each { |child| sum += assign_score_of(child) } + sum + else + 1 + end + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + [@node.from] + end + end + end + + Template.register_tag('assign'.freeze, Assign) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/break.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/break.rb new file mode 100644 index 000000000000..6fe0969ba764 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/break.rb @@ -0,0 +1,18 @@ +module Liquid + # Break tag to be used to break out of a for loop. + # + # == Basic Usage: + # {% for item in collection %} + # {% if item.condition %} + # {% break %} + # {% endif %} + # {% endfor %} + # + class Break < Tag + def interrupt + BreakInterrupt.new + end + end + + Template.register_tag('break'.freeze, Break) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/capture.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/capture.rb new file mode 100644 index 000000000000..86743567332f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/capture.rb @@ -0,0 +1,38 @@ +module Liquid + # Capture stores the result of a block into a variable without rendering it inplace. + # + # {% capture heading %} + # Monkeys! + # {% endcapture %} + # ... + # <h1>{{ heading }}</h1> + # + # Capture is useful for saving content for use later in your template, such as + # in a sidebar or footer. + # + class Capture < Block + Syntax = /(#{VariableSignature}+)/o + + def initialize(tag_name, markup, options) + super + if markup =~ Syntax + @to = $1 + else + raise SyntaxError.new(options[:locale].t("errors.syntax.capture")) + end + end + + def render(context) + output = super + context.scopes.last[@to] = output + context.resource_limits.assign_score += output.length + ''.freeze + end + + def blank? + true + end + end + + Template.register_tag('capture'.freeze, Capture) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/case.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/case.rb new file mode 100644 index 000000000000..5036b279af2f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/case.rb @@ -0,0 +1,94 @@ +module Liquid + class Case < Block + Syntax = /(#{QuotedFragment})/o + WhenSyntax = /(#{QuotedFragment})(?:(?:\s+or\s+|\s*\,\s*)(#{QuotedFragment}.*))?/om + + attr_reader :blocks, :left + + def initialize(tag_name, markup, options) + super + @blocks = [] + + if markup =~ Syntax + @left = Expression.parse($1) + else + raise SyntaxError.new(options[:locale].t("errors.syntax.case".freeze)) + end + end + + def parse(tokens) + body = BlockBody.new + while parse_body(body, tokens) + body = @blocks.last.attachment + end + end + + def nodelist + @blocks.map(&:attachment) + end + + def unknown_tag(tag, markup, tokens) + case tag + when 'when'.freeze + record_when_condition(markup) + when 'else'.freeze + record_else_condition(markup) + else + super + end + end + + def render(context) + context.stack do + execute_else_block = true + + output = '' + @blocks.each do |block| + if block.else? + return block.attachment.render(context) if execute_else_block + elsif block.evaluate(context) + execute_else_block = false + output << block.attachment.render(context) + end + end + output + end + end + + private + + def record_when_condition(markup) + body = BlockBody.new + + while markup + unless markup =~ WhenSyntax + raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_when".freeze)) + end + + markup = $2 + + block = Condition.new(@left, '=='.freeze, Expression.parse($1)) + block.attach(body) + @blocks << block + end + end + + def record_else_condition(markup) + unless markup.strip.empty? + raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_else".freeze)) + end + + block = ElseCondition.new + block.attach(BlockBody.new) + @blocks << block + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + [@node.left] + @node.blocks + end + end + end + + Template.register_tag('case'.freeze, Case) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/comment.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/comment.rb new file mode 100644 index 000000000000..c57c9cd65380 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/comment.rb @@ -0,0 +1,16 @@ +module Liquid + class Comment < Block + def render(_context) + ''.freeze + end + + def unknown_tag(_tag, _markup, _tokens) + end + + def blank? + true + end + end + + Template.register_tag('comment'.freeze, Comment) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/continue.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/continue.rb new file mode 100644 index 000000000000..9c81ec2c7172 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/continue.rb @@ -0,0 +1,18 @@ +module Liquid + # Continue tag to be used to break out of a for loop. + # + # == Basic Usage: + # {% for item in collection %} + # {% if item.condition %} + # {% continue %} + # {% endif %} + # {% endfor %} + # + class Continue < Tag + def interrupt + ContinueInterrupt.new + end + end + + Template.register_tag('continue'.freeze, Continue) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/cycle.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/cycle.rb new file mode 100644 index 000000000000..17aa860d6cb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/cycle.rb @@ -0,0 +1,65 @@ +module Liquid + # Cycle is usually used within a loop to alternate between values, like colors or DOM classes. + # + # {% for item in items %} + # <div class="{% cycle 'red', 'green', 'blue' %}"> {{ item }} </div> + # {% end %} + # + # <div class="red"> Item one </div> + # <div class="green"> Item two </div> + # <div class="blue"> Item three </div> + # <div class="red"> Item four </div> + # <div class="green"> Item five</div> + # + class Cycle < Tag + SimpleSyntax = /\A#{QuotedFragment}+/o + NamedSyntax = /\A(#{QuotedFragment})\s*\:\s*(.*)/om + + attr_reader :variables + + def initialize(tag_name, markup, options) + super + case markup + when NamedSyntax + @variables = variables_from_string($2) + @name = Expression.parse($1) + when SimpleSyntax + @variables = variables_from_string(markup) + @name = @variables.to_s + else + raise SyntaxError.new(options[:locale].t("errors.syntax.cycle".freeze)) + end + end + + def render(context) + context.registers[:cycle] ||= {} + + context.stack do + key = context.evaluate(@name) + iteration = context.registers[:cycle][key].to_i + result = context.evaluate(@variables[iteration]) + iteration += 1 + iteration = 0 if iteration >= @variables.size + context.registers[:cycle][key] = iteration + result + end + end + + private + + def variables_from_string(markup) + markup.split(',').collect do |var| + var =~ /\s*(#{QuotedFragment})\s*/o + $1 ? Expression.parse($1) : nil + end.compact + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + Array(@node.variables) + end + end + end + + Template.register_tag('cycle', Cycle) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/decrement.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/decrement.rb new file mode 100644 index 000000000000..b5cdaaa6ad96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/decrement.rb @@ -0,0 +1,35 @@ +module Liquid + # decrement is used in a place where one needs to insert a counter + # into a template, and needs the counter to survive across + # multiple instantiations of the template. + # NOTE: decrement is a pre-decrement, --i, + # while increment is post: i++. + # + # (To achieve the survival, the application must keep the context) + # + # if the variable does not exist, it is created with value 0. + + # Hello: {% decrement variable %} + # + # gives you: + # + # Hello: -1 + # Hello: -2 + # Hello: -3 + # + class Decrement < Tag + def initialize(tag_name, markup, options) + super + @variable = markup.strip + end + + def render(context) + value = context.environments.first[@variable] ||= 0 + value -= 1 + context.environments.first[@variable] = value + value.to_s + end + end + + Template.register_tag('decrement'.freeze, Decrement) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/for.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/for.rb new file mode 100644 index 000000000000..b69aa78cd1a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/for.rb @@ -0,0 +1,203 @@ +module Liquid + # "For" iterates over an array or collection. + # Several useful variables are available to you within the loop. + # + # == Basic usage: + # {% for item in collection %} + # {{ forloop.index }}: {{ item.name }} + # {% endfor %} + # + # == Advanced usage: + # {% for item in collection %} + # <div {% if forloop.first %}class="first"{% endif %}> + # Item {{ forloop.index }}: {{ item.name }} + # </div> + # {% else %} + # There is nothing in the collection. + # {% endfor %} + # + # You can also define a limit and offset much like SQL. Remember + # that offset starts at 0 for the first item. + # + # {% for item in collection limit:5 offset:10 %} + # {{ item.name }} + # {% end %} + # + # To reverse the for loop simply use {% for item in collection reversed %} (note that the flag's spelling is different to the filter `reverse`) + # + # == Available variables: + # + # forloop.name:: 'item-collection' + # forloop.length:: Length of the loop + # forloop.index:: The current item's position in the collection; + # forloop.index starts at 1. + # This is helpful for non-programmers who start believe + # the first item in an array is 1, not 0. + # forloop.index0:: The current item's position in the collection + # where the first item is 0 + # forloop.rindex:: Number of items remaining in the loop + # (length - index) where 1 is the last item. + # forloop.rindex0:: Number of items remaining in the loop + # where 0 is the last item. + # forloop.first:: Returns true if the item is the first item. + # forloop.last:: Returns true if the item is the last item. + # forloop.parentloop:: Provides access to the parent loop, if present. + # + class For < Block + Syntax = /\A(#{VariableSegment}+)\s+in\s+(#{QuotedFragment}+)\s*(reversed)?/o + + attr_reader :collection_name, :variable_name, :limit, :from + + def initialize(tag_name, markup, options) + super + @from = @limit = nil + parse_with_selected_parser(markup) + @for_block = BlockBody.new + @else_block = nil + end + + def parse(tokens) + return unless parse_body(@for_block, tokens) + parse_body(@else_block, tokens) + end + + def nodelist + @else_block ? [@for_block, @else_block] : [@for_block] + end + + def unknown_tag(tag, markup, tokens) + return super unless tag == 'else'.freeze + @else_block = BlockBody.new + end + + def render(context) + segment = collection_segment(context) + + if segment.empty? + render_else(context) + else + render_segment(context, segment) + end + end + + protected + + def lax_parse(markup) + if markup =~ Syntax + @variable_name = $1 + collection_name = $2 + @reversed = !!$3 + @name = "#{@variable_name}-#{collection_name}" + @collection_name = Expression.parse(collection_name) + markup.scan(TagAttributes) do |key, value| + set_attribute(key, value) + end + else + raise SyntaxError.new(options[:locale].t("errors.syntax.for".freeze)) + end + end + + def strict_parse(markup) + p = Parser.new(markup) + @variable_name = p.consume(:id) + raise SyntaxError.new(options[:locale].t("errors.syntax.for_invalid_in".freeze)) unless p.id?('in'.freeze) + collection_name = p.expression + @name = "#{@variable_name}-#{collection_name}" + @collection_name = Expression.parse(collection_name) + @reversed = p.id?('reversed'.freeze) + + while p.look(:id) && p.look(:colon, 1) + unless attribute = p.id?('limit'.freeze) || p.id?('offset'.freeze) + raise SyntaxError.new(options[:locale].t("errors.syntax.for_invalid_attribute".freeze)) + end + p.consume + set_attribute(attribute, p.expression) + end + p.consume(:end_of_string) + end + + private + + def collection_segment(context) + offsets = context.registers[:for] ||= {} + + from = if @from == :continue + offsets[@name].to_i + else + context.evaluate(@from).to_i + end + + collection = context.evaluate(@collection_name) + collection = collection.to_a if collection.is_a?(Range) + + limit = context.evaluate(@limit) + to = limit ? limit.to_i + from : nil + + segment = Utils.slice_collection(collection, from, to) + segment.reverse! if @reversed + + offsets[@name] = from + segment.length + + segment + end + + def render_segment(context, segment) + for_stack = context.registers[:for_stack] ||= [] + length = segment.length + + result = '' + + context.stack do + loop_vars = Liquid::ForloopDrop.new(@name, length, for_stack[-1]) + + for_stack.push(loop_vars) + + begin + context['forloop'.freeze] = loop_vars + + segment.each do |item| + context[@variable_name] = item + result << @for_block.render(context) + loop_vars.send(:increment!) + + # Handle any interrupts if they exist. + if context.interrupt? + interrupt = context.pop_interrupt + break if interrupt.is_a? BreakInterrupt + next if interrupt.is_a? ContinueInterrupt + end + end + ensure + for_stack.pop + end + end + + result + end + + def set_attribute(key, expr) + case key + when 'offset'.freeze + @from = if expr == 'continue'.freeze + :continue + else + Expression.parse(expr) + end + when 'limit'.freeze + @limit = Expression.parse(expr) + end + end + + def render_else(context) + @else_block ? @else_block.render(context) : ''.freeze + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + (super + [@node.limit, @node.from, @node.collection_name]).compact + end + end + end + + Template.register_tag('for'.freeze, For) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/if.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/if.rb new file mode 100644 index 000000000000..02da42b79ef8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/if.rb @@ -0,0 +1,122 @@ +module Liquid + # If is the conditional block + # + # {% if user.admin %} + # Admin user! + # {% else %} + # Not admin user + # {% endif %} + # + # There are {% if count < 5 %} less {% else %} more {% endif %} items than you need. + # + class If < Block + Syntax = /(#{QuotedFragment})\s*([=!<>a-z_]+)?\s*(#{QuotedFragment})?/o + ExpressionsAndOperators = /(?:\b(?:\s?and\s?|\s?or\s?)\b|(?:\s*(?!\b(?:\s?and\s?|\s?or\s?)\b)(?:#{QuotedFragment}|\S+)\s*)+)/o + BOOLEAN_OPERATORS = %w(and or).freeze + + attr_reader :blocks + + def initialize(tag_name, markup, options) + super + @blocks = [] + push_block('if'.freeze, markup) + end + + def nodelist + @blocks.map(&:attachment) + end + + def parse(tokens) + while parse_body(@blocks.last.attachment, tokens) + end + end + + def unknown_tag(tag, markup, tokens) + if ['elsif'.freeze, 'else'.freeze].include?(tag) + push_block(tag, markup) + else + super + end + end + + def render(context) + context.stack do + @blocks.each do |block| + if block.evaluate(context) + return block.attachment.render(context) + end + end + ''.freeze + end + end + + private + + def push_block(tag, markup) + block = if tag == 'else'.freeze + ElseCondition.new + else + parse_with_selected_parser(markup) + end + + @blocks.push(block) + block.attach(BlockBody.new) + end + + def lax_parse(markup) + expressions = markup.scan(ExpressionsAndOperators) + raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop =~ Syntax + + condition = Condition.new(Expression.parse($1), $2, Expression.parse($3)) + + until expressions.empty? + operator = expressions.pop.to_s.strip + + raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop.to_s =~ Syntax + + new_condition = Condition.new(Expression.parse($1), $2, Expression.parse($3)) + raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless BOOLEAN_OPERATORS.include?(operator) + new_condition.send(operator, condition) + condition = new_condition + end + + condition + end + + def strict_parse(markup) + p = Parser.new(markup) + condition = parse_binary_comparisons(p) + p.consume(:end_of_string) + condition + end + + def parse_binary_comparisons(p) + condition = parse_comparison(p) + first_condition = condition + while op = (p.id?('and'.freeze) || p.id?('or'.freeze)) + child_condition = parse_comparison(p) + condition.send(op, child_condition) + condition = child_condition + end + first_condition + end + + def parse_comparison(p) + a = Expression.parse(p.expression) + if op = p.consume?(:comparison) + b = Expression.parse(p.expression) + Condition.new(a, op, b) + else + Condition.new(a) + end + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + @node.blocks + end + end + end + + Template.register_tag('if'.freeze, If) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/ifchanged.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/ifchanged.rb new file mode 100644 index 000000000000..d70cbe1f3a53 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/ifchanged.rb @@ -0,0 +1,18 @@ +module Liquid + class Ifchanged < Block + def render(context) + context.stack do + output = super + + if output != context.registers[:ifchanged] + context.registers[:ifchanged] = output + output + else + ''.freeze + end + end + end + end + + Template.register_tag('ifchanged'.freeze, Ifchanged) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/include.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/include.rb new file mode 100644 index 000000000000..c9f2a2881706 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/include.rb @@ -0,0 +1,124 @@ +module Liquid + # Include allows templates to relate with other templates + # + # Simply include another template: + # + # {% include 'product' %} + # + # Include a template with a local variable: + # + # {% include 'product' with products[0] %} + # + # Include a template for a collection: + # + # {% include 'product' for products %} + # + class Include < Tag + Syntax = /(#{QuotedFragment}+)(\s+(?:with|for)\s+(#{QuotedFragment}+))?/o + + attr_reader :template_name_expr, :variable_name_expr, :attributes + + def initialize(tag_name, markup, options) + super + + if markup =~ Syntax + + template_name = $1 + variable_name = $3 + + @variable_name_expr = variable_name ? Expression.parse(variable_name) : nil + @template_name_expr = Expression.parse(template_name) + @attributes = {} + + markup.scan(TagAttributes) do |key, value| + @attributes[key] = Expression.parse(value) + end + + else + raise SyntaxError.new(options[:locale].t("errors.syntax.include".freeze)) + end + end + + def parse(_tokens) + end + + def render(context) + template_name = context.evaluate(@template_name_expr) + raise ArgumentError.new(options[:locale].t("errors.argument.include")) unless template_name + + partial = load_cached_partial(template_name, context) + context_variable_name = template_name.split('/'.freeze).last + + variable = if @variable_name_expr + context.evaluate(@variable_name_expr) + else + context.find_variable(template_name, raise_on_not_found: false) + end + + old_template_name = context.template_name + old_partial = context.partial + begin + context.template_name = template_name + context.partial = true + context.stack do + @attributes.each do |key, value| + context[key] = context.evaluate(value) + end + + if variable.is_a?(Array) + variable.collect do |var| + context[context_variable_name] = var + partial.render(context) + end + else + context[context_variable_name] = variable + partial.render(context) + end + end + ensure + context.template_name = old_template_name + context.partial = old_partial + end + end + + private + + alias_method :parse_context, :options + private :parse_context + + def load_cached_partial(template_name, context) + cached_partials = context.registers[:cached_partials] || {} + + if cached = cached_partials[template_name] + return cached + end + source = read_template_from_file_system(context) + begin + parse_context.partial = true + partial = Liquid::Template.parse(source, parse_context) + ensure + parse_context.partial = false + end + cached_partials[template_name] = partial + context.registers[:cached_partials] = cached_partials + partial + end + + def read_template_from_file_system(context) + file_system = context.registers[:file_system] || Liquid::Template.file_system + + file_system.read_template_file(context.evaluate(@template_name_expr)) + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + [ + @node.template_name_expr, + @node.variable_name_expr + ] + @node.attributes.values + end + end + end + + Template.register_tag('include'.freeze, Include) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/increment.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/increment.rb new file mode 100644 index 000000000000..baa0cbb62ad0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/increment.rb @@ -0,0 +1,31 @@ +module Liquid + # increment is used in a place where one needs to insert a counter + # into a template, and needs the counter to survive across + # multiple instantiations of the template. + # (To achieve the survival, the application must keep the context) + # + # if the variable does not exist, it is created with value 0. + # + # Hello: {% increment variable %} + # + # gives you: + # + # Hello: 0 + # Hello: 1 + # Hello: 2 + # + class Increment < Tag + def initialize(tag_name, markup, options) + super + @variable = markup.strip + end + + def render(context) + value = context.environments.first[@variable] ||= 0 + context.environments.first[@variable] = value + 1 + value.to_s + end + end + + Template.register_tag('increment'.freeze, Increment) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/raw.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/raw.rb new file mode 100644 index 000000000000..6b461bdb5ea4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/raw.rb @@ -0,0 +1,47 @@ +module Liquid + class Raw < Block + Syntax = /\A\s*\z/ + FullTokenPossiblyInvalid = /\A(.*)#{TagStart}\s*(\w+)\s*(.*)?#{TagEnd}\z/om + + def initialize(tag_name, markup, parse_context) + super + + ensure_valid_markup(tag_name, markup, parse_context) + end + + def parse(tokens) + @body = '' + while token = tokens.shift + if token =~ FullTokenPossiblyInvalid + @body << $1 if $1 != "".freeze + return if block_delimiter == $2 + end + @body << token unless token.empty? + end + + raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_never_closed".freeze, block_name: block_name)) + end + + def render(_context) + @body + end + + def nodelist + [@body] + end + + def blank? + @body.empty? + end + + protected + + def ensure_valid_markup(tag_name, markup, parse_context) + unless markup =~ Syntax + raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_unexpected_args".freeze, tag: tag_name)) + end + end + end + + Template.register_tag('raw'.freeze, Raw) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/table_row.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/table_row.rb new file mode 100644 index 000000000000..7f391cf05392 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/table_row.rb @@ -0,0 +1,62 @@ +module Liquid + class TableRow < Block + Syntax = /(\w+)\s+in\s+(#{QuotedFragment}+)/o + + attr_reader :variable_name, :collection_name, :attributes + + def initialize(tag_name, markup, options) + super + if markup =~ Syntax + @variable_name = $1 + @collection_name = Expression.parse($2) + @attributes = {} + markup.scan(TagAttributes) do |key, value| + @attributes[key] = Expression.parse(value) + end + else + raise SyntaxError.new(options[:locale].t("errors.syntax.table_row".freeze)) + end + end + + def render(context) + collection = context.evaluate(@collection_name) or return ''.freeze + + from = @attributes.key?('offset'.freeze) ? context.evaluate(@attributes['offset'.freeze]).to_i : 0 + to = @attributes.key?('limit'.freeze) ? from + context.evaluate(@attributes['limit'.freeze]).to_i : nil + + collection = Utils.slice_collection(collection, from, to) + + length = collection.length + + cols = context.evaluate(@attributes['cols'.freeze]).to_i + + result = "<tr class=\"row1\">\n" + context.stack do + tablerowloop = Liquid::TablerowloopDrop.new(length, cols) + context['tablerowloop'.freeze] = tablerowloop + + collection.each do |item| + context[@variable_name] = item + + result << "<td class=\"col#{tablerowloop.col}\">" << super << '</td>' + + if tablerowloop.col_last && !tablerowloop.last + result << "</tr>\n<tr class=\"row#{tablerowloop.row + 1}\">" + end + + tablerowloop.send(:increment!) + end + end + result << "</tr>\n" + result + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + super + @node.attributes.values + [@node.collection_name] + end + end + end + + Template.register_tag('tablerow'.freeze, TableRow) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/unless.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/unless.rb new file mode 100644 index 000000000000..1d4280dbf9fd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tags/unless.rb @@ -0,0 +1,30 @@ +require_relative 'if' + +module Liquid + # Unless is a conditional just like 'if' but works on the inverse logic. + # + # {% unless x < 0 %} x is greater than zero {% endunless %} + # + class Unless < If + def render(context) + context.stack do + # First condition is interpreted backwards ( if not ) + first_block = @blocks.first + unless first_block.evaluate(context) + return first_block.attachment.render(context) + end + + # After the first condition unless works just like if + @blocks[1..-1].each do |block| + if block.evaluate(context) + return block.attachment.render(context) + end + end + + ''.freeze + end + end + end + + Template.register_tag('unless'.freeze, Unless) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/template.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/template.rb new file mode 100644 index 000000000000..31a67e49e4c5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/template.rb @@ -0,0 +1,254 @@ +module Liquid + # Templates are central to liquid. + # Interpretating templates is a two step process. First you compile the + # source code you got. During compile time some extensive error checking is performed. + # your code should expect to get some SyntaxErrors. + # + # After you have a compiled template you can then <tt>render</tt> it. + # You can use a compiled template over and over again and keep it cached. + # + # Example: + # + # template = Liquid::Template.parse(source) + # template.render('user_name' => 'bob') + # + class Template + attr_accessor :root + attr_reader :resource_limits, :warnings + + @@file_system = BlankFileSystem.new + + class TagRegistry + include Enumerable + + def initialize + @tags = {} + @cache = {} + end + + def [](tag_name) + return nil unless @tags.key?(tag_name) + return @cache[tag_name] if Liquid.cache_classes + + lookup_class(@tags[tag_name]).tap { |o| @cache[tag_name] = o } + end + + def []=(tag_name, klass) + @tags[tag_name] = klass.name + @cache[tag_name] = klass + end + + def delete(tag_name) + @tags.delete(tag_name) + @cache.delete(tag_name) + end + + def each(&block) + @tags.each(&block) + end + + private + + def lookup_class(name) + name.split("::").reject(&:empty?).reduce(Object) { |scope, const| scope.const_get(const) } + end + end + + attr_reader :profiler + + class << self + # Sets how strict the parser should be. + # :lax acts like liquid 2.5 and silently ignores malformed tags in most cases. + # :warn is the default and will give deprecation warnings when invalid syntax is used. + # :strict will enforce correct syntax. + attr_writer :error_mode + + # Sets how strict the taint checker should be. + # :lax is the default, and ignores the taint flag completely + # :warn adds a warning, but does not interrupt the rendering + # :error raises an error when tainted output is used + attr_writer :taint_mode + + attr_accessor :default_exception_renderer + Template.default_exception_renderer = lambda do |exception| + exception + end + + def file_system + @@file_system + end + + def file_system=(obj) + @@file_system = obj + end + + def register_tag(name, klass) + tags[name.to_s] = klass + end + + def tags + @tags ||= TagRegistry.new + end + + def error_mode + @error_mode ||= :lax + end + + def taint_mode + @taint_mode ||= :lax + end + + # Pass a module with filter methods which should be available + # to all liquid views. Good for registering the standard library + def register_filter(mod) + Strainer.global_filter(mod) + end + + def default_resource_limits + @default_resource_limits ||= {} + end + + # creates a new <tt>Template</tt> object from liquid source code + # To enable profiling, pass in <tt>profile: true</tt> as an option. + # See Liquid::Profiler for more information + def parse(source, options = {}) + template = Template.new + template.parse(source, options) + end + end + + def initialize + @rethrow_errors = false + @resource_limits = ResourceLimits.new(self.class.default_resource_limits) + end + + # Parse source code. + # Returns self for easy chaining + def parse(source, options = {}) + @options = options + @profiling = options[:profile] + @line_numbers = options[:line_numbers] || @profiling + parse_context = options.is_a?(ParseContext) ? options : ParseContext.new(options) + @root = Document.parse(tokenize(source), parse_context) + @warnings = parse_context.warnings + self + end + + def registers + @registers ||= {} + end + + def assigns + @assigns ||= {} + end + + def instance_assigns + @instance_assigns ||= {} + end + + def errors + @errors ||= [] + end + + # Render takes a hash with local variables. + # + # if you use the same filters over and over again consider registering them globally + # with <tt>Template.register_filter</tt> + # + # if profiling was enabled in <tt>Template#parse</tt> then the resulting profiling information + # will be available via <tt>Template#profiler</tt> + # + # Following options can be passed: + # + # * <tt>filters</tt> : array with local filters + # * <tt>registers</tt> : hash with register variables. Those can be accessed from + # filters and tags and might be useful to integrate liquid more with its host application + # + def render(*args) + return ''.freeze if @root.nil? + + context = case args.first + when Liquid::Context + c = args.shift + + if @rethrow_errors + c.exception_renderer = ->(e) { raise } + end + + c + when Liquid::Drop + drop = args.shift + drop.context = Context.new([drop, assigns], instance_assigns, registers, @rethrow_errors, @resource_limits) + when Hash + Context.new([args.shift, assigns], instance_assigns, registers, @rethrow_errors, @resource_limits) + when nil + Context.new(assigns, instance_assigns, registers, @rethrow_errors, @resource_limits) + else + raise ArgumentError, "Expected Hash or Liquid::Context as parameter" + end + + case args.last + when Hash + options = args.pop + + registers.merge!(options[:registers]) if options[:registers].is_a?(Hash) + + apply_options_to_context(context, options) + when Module, Array + context.add_filters(args.pop) + end + + # Retrying a render resets resource usage + context.resource_limits.reset + + begin + # render the nodelist. + # for performance reasons we get an array back here. join will make a string out of it. + result = with_profiling(context) do + @root.render(context) + end + result.respond_to?(:join) ? result.join : result + rescue Liquid::MemoryError => e + context.handle_error(e) + ensure + @errors = context.errors + end + end + + def render!(*args) + @rethrow_errors = true + render(*args) + end + + private + + def tokenize(source) + Tokenizer.new(source, @line_numbers) + end + + def with_profiling(context) + if @profiling && !context.partial + raise "Profiler not loaded, require 'liquid/profiler' first" unless defined?(Liquid::Profiler) + + @profiler = Profiler.new + @profiler.start + + begin + yield + ensure + @profiler.stop + end + else + yield + end + end + + def apply_options_to_context(context, options) + context.add_filters(options[:filters]) if options[:filters] + context.global_filter = options[:global_filter] if options[:global_filter] + context.exception_renderer = options[:exception_renderer] if options[:exception_renderer] + context.strict_variables = options[:strict_variables] if options[:strict_variables] + context.strict_filters = options[:strict_filters] if options[:strict_filters] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tokenizer.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tokenizer.rb new file mode 100644 index 000000000000..d03657e8436c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/tokenizer.rb @@ -0,0 +1,31 @@ +module Liquid + class Tokenizer + attr_reader :line_number + + def initialize(source, line_numbers = false) + @source = source + @line_number = line_numbers ? 1 : nil + @tokens = tokenize + end + + def shift + token = @tokens.shift + @line_number += token.count("\n") if @line_number && token + token + end + + private + + def tokenize + @source = @source.source if @source.respond_to?(:source) + return [] if @source.to_s.empty? + + tokens = @source.split(TemplateParser) + + # removes the rogue empty element at the beginning of the array + tokens.shift if tokens[0] && tokens[0].empty? + + tokens + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/truffle.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/truffle.rb new file mode 100644 index 000000000000..ef0620a260be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/truffle.rb @@ -0,0 +1,5 @@ +module Liquid + module Truffle + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/utils.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/utils.rb new file mode 100644 index 000000000000..516ac0cfcca4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/utils.rb @@ -0,0 +1,83 @@ +module Liquid + module Utils + def self.slice_collection(collection, from, to) + if (from != 0 || !to.nil?) && collection.respond_to?(:load_slice) + collection.load_slice(from, to) + else + slice_collection_using_each(collection, from, to) + end + end + + def self.slice_collection_using_each(collection, from, to) + segments = [] + index = 0 + + # Maintains Ruby 1.8.7 String#each behaviour on 1.9 + if collection.is_a?(String) + return collection.empty? ? [] : [collection] + end + return [] unless collection.respond_to?(:each) + + collection.each do |item| + if to && to <= index + break + end + + if from <= index + segments << item + end + + index += 1 + end + + segments + end + + def self.to_integer(num) + return num if num.is_a?(Integer) + num = num.to_s + begin + Integer(num) + rescue ::ArgumentError + raise Liquid::ArgumentError, "invalid integer" + end + end + + def self.to_number(obj) + case obj + when Float + BigDecimal(obj.to_s) + when Numeric + obj + when String + (obj.strip =~ /\A-?\d+\.\d+\z/) ? BigDecimal(obj) : obj.to_i + else + if obj.respond_to?(:to_number) + obj.to_number + else + 0 + end + end + end + + def self.to_date(obj) + return obj if obj.respond_to?(:strftime) + + if obj.is_a?(String) + return nil if obj.empty? + obj = obj.downcase + end + + case obj + when 'now'.freeze, 'today'.freeze + Time.now + when /\A\d+\z/, Integer + Time.at(obj.to_i) + when String + Time.parse(obj) + end + rescue ::ArgumentError + nil + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/variable.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/variable.rb new file mode 100644 index 000000000000..c31bffe5bca5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/variable.rb @@ -0,0 +1,148 @@ +module Liquid + # Holds variables. Variables are only loaded "just in time" + # and are not evaluated as part of the render stage + # + # {{ monkey }} + # {{ user.name }} + # + # Variables can be combined with filters: + # + # {{ user | link }} + # + class Variable + FilterMarkupRegex = /#{FilterSeparator}\s*(.*)/om + FilterParser = /(?:\s+|#{QuotedFragment}|#{ArgumentSeparator})+/o + FilterArgsRegex = /(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o + JustTagAttributes = /\A#{TagAttributes}\z/o + MarkupWithQuotedFragment = /(#{QuotedFragment})(.*)/om + + attr_accessor :filters, :name, :line_number + attr_reader :parse_context + alias_method :options, :parse_context + + include ParserSwitching + + def initialize(markup, parse_context) + @markup = markup + @name = nil + @parse_context = parse_context + @line_number = parse_context.line_number + + parse_with_selected_parser(markup) + end + + def raw + @markup + end + + def markup_context(markup) + "in \"{{#{markup}}}\"" + end + + def lax_parse(markup) + @filters = [] + return unless markup =~ MarkupWithQuotedFragment + + name_markup = $1 + filter_markup = $2 + @name = Expression.parse(name_markup) + if filter_markup =~ FilterMarkupRegex + filters = $1.scan(FilterParser) + filters.each do |f| + next unless f =~ /\w+/ + filtername = Regexp.last_match(0) + filterargs = f.scan(FilterArgsRegex).flatten + @filters << parse_filter_expressions(filtername, filterargs) + end + end + end + + def strict_parse(markup) + @filters = [] + p = Parser.new(markup) + + @name = Expression.parse(p.expression) + while p.consume?(:pipe) + filtername = p.consume(:id) + filterargs = p.consume?(:colon) ? parse_filterargs(p) : [] + @filters << parse_filter_expressions(filtername, filterargs) + end + p.consume(:end_of_string) + end + + def parse_filterargs(p) + # first argument + filterargs = [p.argument] + # followed by comma separated others + filterargs << p.argument while p.consume?(:comma) + filterargs + end + + def render(context) + obj = @filters.inject(context.evaluate(@name)) do |output, (filter_name, filter_args, filter_kwargs)| + filter_args = evaluate_filter_expressions(context, filter_args, filter_kwargs) + context.invoke(filter_name, output, *filter_args) + end + + obj = context.apply_global_filter(obj) + + taint_check(context, obj) + + obj + end + + private + + def parse_filter_expressions(filter_name, unparsed_args) + filter_args = [] + keyword_args = {} + unparsed_args.each do |a| + if matches = a.match(JustTagAttributes) + keyword_args[matches[1]] = Expression.parse(matches[2]) + else + filter_args << Expression.parse(a) + end + end + result = [filter_name, filter_args] + result << keyword_args unless keyword_args.empty? + result + end + + def evaluate_filter_expressions(context, filter_args, filter_kwargs) + parsed_args = filter_args.map{ |expr| context.evaluate(expr) } + if filter_kwargs + parsed_kwargs = {} + filter_kwargs.each do |key, expr| + parsed_kwargs[key] = context.evaluate(expr) + end + parsed_args << parsed_kwargs + end + parsed_args + end + + def taint_check(context, obj) + return unless obj.tainted? + return if Template.taint_mode == :lax + + @markup =~ QuotedFragment + name = Regexp.last_match(0) + + error = TaintedError.new("variable '#{name}' is tainted and was not escaped") + error.line_number = line_number + error.template_name = context.template_name + + case Template.taint_mode + when :warn + context.warnings << error + when :error + raise error + end + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + [@node.name] + @node.filters.flatten + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/variable_lookup.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/variable_lookup.rb new file mode 100644 index 000000000000..62f4877c7f14 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/variable_lookup.rb @@ -0,0 +1,88 @@ +module Liquid + class VariableLookup + SQUARE_BRACKETED = /\A\[(.*)\]\z/m + COMMAND_METHODS = ['size'.freeze, 'first'.freeze, 'last'.freeze].freeze + + attr_reader :name, :lookups + + def self.parse(markup) + new(markup) + end + + def initialize(markup) + lookups = markup.scan(VariableParser) + + name = lookups.shift + if name =~ SQUARE_BRACKETED + name = Expression.parse($1) + end + @name = name + + @lookups = lookups + @command_flags = 0 + + @lookups.each_index do |i| + lookup = lookups[i] + if lookup =~ SQUARE_BRACKETED + lookups[i] = Expression.parse($1) + elsif COMMAND_METHODS.include?(lookup) + @command_flags |= 1 << i + end + end + end + + def evaluate(context) + name = context.evaluate(@name) + object = context.find_variable(name) + + @lookups.each_index do |i| + key = context.evaluate(@lookups[i]) + + # If object is a hash- or array-like object we look for the + # presence of the key and if its available we return it + if object.respond_to?(:[]) && + ((object.respond_to?(:key?) && object.key?(key)) || + (object.respond_to?(:fetch) && key.is_a?(Integer))) + + # if its a proc we will replace the entry with the proc + res = context.lookup_and_evaluate(object, key) + object = res.to_liquid + + # Some special cases. If the part wasn't in square brackets and + # no key with the same name was found we interpret following calls + # as commands and call them on the current object + elsif @command_flags & (1 << i) != 0 && object.respond_to?(key) + object = object.send(key).to_liquid + + # No key was present with the desired value and it wasn't one of the directly supported + # keywords either. The only thing we got left is to return nil or + # raise an exception if `strict_variables` option is set to true + else + return nil unless context.strict_variables + raise Liquid::UndefinedVariable, "undefined variable #{key}" + end + + # If we are dealing with a drop here we have to + object.context = context if object.respond_to?(:context=) + end + + object + end + + def ==(other) + self.class == other.class && state == other.state + end + + protected + + def state + [@name, @lookups, @command_flags] + end + + class ParseTreeVisitor < Liquid::ParseTreeVisitor + def children + @node.lookups + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/version.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/version.rb new file mode 100644 index 000000000000..da01c476e558 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/version.rb @@ -0,0 +1,5 @@ +# encoding: utf-8 + +module Liquid + VERSION = "4.0.3".freeze +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/fixtures/en_locale.yml b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/fixtures/en_locale.yml new file mode 100644 index 000000000000..0b113c676e9b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/fixtures/en_locale.yml @@ -0,0 +1,9 @@ +--- + simple: "less is more" + whatever: "something %{something}" + errors: + i18n: + undefined_interpolation: "undefined key %{key}" + unknown_translation: "translation '%{name}' wasn't found" + syntax: + oops: "something wasn't right" diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/assign_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/assign_test.rb new file mode 100644 index 000000000000..550228999981 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/assign_test.rb @@ -0,0 +1,48 @@ +require 'test_helper' + +class AssignTest < Minitest::Test + include Liquid + + def test_assign_with_hyphen_in_variable_name + template_source = <<-END_TEMPLATE + {% assign this-thing = 'Print this-thing' %} + {{ this-thing }} + END_TEMPLATE + template = Template.parse(template_source) + rendered = template.render! + assert_equal "Print this-thing", rendered.strip + end + + def test_assigned_variable + assert_template_result('.foo.', + '{% assign foo = values %}.{{ foo[0] }}.', + 'values' => %w(foo bar baz)) + + assert_template_result('.bar.', + '{% assign foo = values %}.{{ foo[1] }}.', + 'values' => %w(foo bar baz)) + end + + def test_assign_with_filter + assert_template_result('.bar.', + '{% assign foo = values | split: "," %}.{{ foo[1] }}.', + 'values' => "foo,bar,baz") + end + + def test_assign_syntax_error + assert_match_syntax_error(/assign/, + '{% assign foo not values %}.', + 'values' => "foo,bar,baz") + end + + def test_assign_uses_error_mode + with_error_mode(:strict) do + assert_raises(SyntaxError) do + Template.parse("{% assign foo = ('X' | downcase) %}") + end + end + with_error_mode(:lax) do + assert Template.parse("{% assign foo = ('X' | downcase) %}") + end + end +end # AssignTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/blank_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/blank_test.rb new file mode 100644 index 000000000000..e9b56df13c50 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/blank_test.rb @@ -0,0 +1,106 @@ +require 'test_helper' + +class FoobarTag < Liquid::Tag + def render(*args) + " " + end + + Liquid::Template.register_tag('foobar', FoobarTag) +end + +class BlankTestFileSystem + def read_template_file(template_path) + template_path + end +end + +class BlankTest < Minitest::Test + include Liquid + N = 10 + + def wrap_in_for(body) + "{% for i in (1..#{N}) %}#{body}{% endfor %}" + end + + def wrap_in_if(body) + "{% if true %}#{body}{% endif %}" + end + + def wrap(body) + wrap_in_for(body) + wrap_in_if(body) + end + + def test_new_tags_are_not_blank_by_default + assert_template_result(" " * N, wrap_in_for("{% foobar %}")) + end + + def test_loops_are_blank + assert_template_result("", wrap_in_for(" ")) + end + + def test_if_else_are_blank + assert_template_result("", "{% if true %} {% elsif false %} {% else %} {% endif %}") + end + + def test_unless_is_blank + assert_template_result("", wrap("{% unless true %} {% endunless %}")) + end + + def test_mark_as_blank_only_during_parsing + assert_template_result(" " * (N + 1), wrap(" {% if false %} this never happens, but still, this block is not blank {% endif %}")) + end + + def test_comments_are_blank + assert_template_result("", wrap(" {% comment %} whatever {% endcomment %} ")) + end + + def test_captures_are_blank + assert_template_result("", wrap(" {% capture foo %} whatever {% endcapture %} ")) + end + + def test_nested_blocks_are_blank_but_only_if_all_children_are + assert_template_result("", wrap(wrap(" "))) + assert_template_result("\n but this is not " * (N + 1), + wrap('{% if true %} {% comment %} this is blank {% endcomment %} {% endif %} + {% if true %} but this is not {% endif %}')) + end + + def test_assigns_are_blank + assert_template_result("", wrap(' {% assign foo = "bar" %} ')) + end + + def test_whitespace_is_blank + assert_template_result("", wrap(" ")) + assert_template_result("", wrap("\t")) + end + + def test_whitespace_is_not_blank_if_other_stuff_is_present + body = " x " + assert_template_result(body * (N + 1), wrap(body)) + end + + def test_increment_is_not_blank + assert_template_result(" 0" * 2 * (N + 1), wrap("{% assign foo = 0 %} {% increment foo %} {% decrement foo %}")) + end + + def test_cycle_is_not_blank + assert_template_result(" " * ((N + 1) / 2) + " ", wrap("{% cycle ' ', ' ' %}")) + end + + def test_raw_is_not_blank + assert_template_result(" " * (N + 1), wrap(" {% raw %} {% endraw %}")) + end + + def test_include_is_blank + Liquid::Template.file_system = BlankTestFileSystem.new + assert_template_result "foobar" * (N + 1), wrap("{% include 'foobar' %}") + assert_template_result " foobar " * (N + 1), wrap("{% include ' foobar ' %}") + assert_template_result " " * (N + 1), wrap(" {% include ' ' %} ") + end + + def test_case_is_blank + assert_template_result("", wrap(" {% assign foo = 'bar' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} ")) + assert_template_result("", wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} ")) + assert_template_result(" x " * (N + 1), wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} x {% endcase %} ")) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/block_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/block_test.rb new file mode 100644 index 000000000000..0824530163d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/block_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class BlockTest < Minitest::Test + include Liquid + + def test_unexpected_end_tag + exc = assert_raises(SyntaxError) do + Template.parse("{% if true %}{% endunless %}") + end + assert_equal exc.message, "Liquid syntax error: 'endunless' is not a valid delimiter for if tags. use endif" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/capture_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/capture_test.rb new file mode 100644 index 000000000000..8d965b35e711 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/capture_test.rb @@ -0,0 +1,50 @@ +require 'test_helper' + +class CaptureTest < Minitest::Test + include Liquid + + def test_captures_block_content_in_variable + assert_template_result("test string", "{% capture 'var' %}test string{% endcapture %}{{var}}", {}) + end + + def test_capture_with_hyphen_in_variable_name + template_source = <<-END_TEMPLATE + {% capture this-thing %}Print this-thing{% endcapture %} + {{ this-thing }} + END_TEMPLATE + template = Template.parse(template_source) + rendered = template.render! + assert_equal "Print this-thing", rendered.strip + end + + def test_capture_to_variable_from_outer_scope_if_existing + template_source = <<-END_TEMPLATE + {% assign var = '' %} + {% if true %} + {% capture var %}first-block-string{% endcapture %} + {% endif %} + {% if true %} + {% capture var %}test-string{% endcapture %} + {% endif %} + {{var}} + END_TEMPLATE + template = Template.parse(template_source) + rendered = template.render! + assert_equal "test-string", rendered.gsub(/\s/, '') + end + + def test_assigning_from_capture + template_source = <<-END_TEMPLATE + {% assign first = '' %} + {% assign second = '' %} + {% for number in (1..3) %} + {% capture first %}{{number}}{% endcapture %} + {% assign second = first %} + {% endfor %} + {{ first }}-{{ second }} + END_TEMPLATE + template = Template.parse(template_source) + rendered = template.render! + assert_equal "3-3", rendered.gsub(/\s/, '') + end +end # CaptureTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/context_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/context_test.rb new file mode 100644 index 000000000000..2d109bb75f4b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/context_test.rb @@ -0,0 +1,32 @@ +require 'test_helper' + +class ContextTest < Minitest::Test + include Liquid + + def test_override_global_filter + global = Module.new do + def notice(output) + "Global #{output}" + end + end + + local = Module.new do + def notice(output) + "Local #{output}" + end + end + + with_global_filter(global) do + assert_equal 'Global test', Template.parse("{{'test' | notice }}").render! + assert_equal 'Local test', Template.parse("{{'test' | notice }}").render!({}, filters: [local]) + end + end + + def test_has_key_will_not_add_an_error_for_missing_keys + with_error_mode :strict do + context = Context.new + context.key?('unknown') + assert_empty context.errors + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/document_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/document_test.rb new file mode 100644 index 000000000000..bcc4a21c3636 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/document_test.rb @@ -0,0 +1,19 @@ +require 'test_helper' + +class DocumentTest < Minitest::Test + include Liquid + + def test_unexpected_outer_tag + exc = assert_raises(SyntaxError) do + Template.parse("{% else %}") + end + assert_equal exc.message, "Liquid syntax error: Unexpected outer 'else' tag" + end + + def test_unknown_tag + exc = assert_raises(SyntaxError) do + Template.parse("{% foo %}") + end + assert_equal exc.message, "Liquid syntax error: Unknown tag 'foo'" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/drop_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/drop_test.rb new file mode 100644 index 000000000000..2de4a5a1539a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/drop_test.rb @@ -0,0 +1,273 @@ +require 'test_helper' + +class ContextDrop < Liquid::Drop + def scopes + @context.scopes.size + end + + def scopes_as_array + (1..@context.scopes.size).to_a + end + + def loop_pos + @context['forloop.index'] + end + + def liquid_method_missing(method) + @context[method] + end +end + +class ProductDrop < Liquid::Drop + class TextDrop < Liquid::Drop + def array + ['text1', 'text2'] + end + + def text + 'text1' + end + end + + class CatchallDrop < Liquid::Drop + def liquid_method_missing(method) + 'catchall_method: ' << method.to_s + end + end + + def texts + TextDrop.new + end + + def catchall + CatchallDrop.new + end + + def context + ContextDrop.new + end + + def user_input + "foo".taint + end + + protected + + def callmenot + "protected" + end +end + +class EnumerableDrop < Liquid::Drop + def liquid_method_missing(method) + method + end + + def size + 3 + end + + def first + 1 + end + + def count + 3 + end + + def min + 1 + end + + def max + 3 + end + + def each + yield 1 + yield 2 + yield 3 + end +end + +class RealEnumerableDrop < Liquid::Drop + include Enumerable + + def liquid_method_missing(method) + method + end + + def each + yield 1 + yield 2 + yield 3 + end +end + +class DropsTest < Minitest::Test + include Liquid + + def test_product_drop + tpl = Liquid::Template.parse(' ') + assert_equal ' ', tpl.render!('product' => ProductDrop.new) + end + + def test_rendering_raises_on_tainted_attr + with_taint_mode(:error) do + tpl = Liquid::Template.parse('{{ product.user_input }}') + assert_raises TaintedError do + tpl.render!('product' => ProductDrop.new) + end + end + end + + def test_rendering_warns_on_tainted_attr + with_taint_mode(:warn) do + tpl = Liquid::Template.parse('{{ product.user_input }}') + context = Context.new('product' => ProductDrop.new) + tpl.render!(context) + assert_equal [Liquid::TaintedError], context.warnings.map(&:class) + assert_equal "variable 'product.user_input' is tainted and was not escaped", context.warnings.first.to_s(false) + end + end + + def test_rendering_doesnt_raise_on_escaped_tainted_attr + with_taint_mode(:error) do + tpl = Liquid::Template.parse('{{ product.user_input | escape }}') + tpl.render!('product' => ProductDrop.new) + end + end + + def test_drop_does_only_respond_to_whitelisted_methods + assert_equal "", Liquid::Template.parse("{{ product.inspect }}").render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse("{{ product.pretty_inspect }}").render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse("{{ product.whatever }}").render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse('{{ product | map: "inspect" }}').render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse('{{ product | map: "pretty_inspect" }}').render!('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse('{{ product | map: "whatever" }}').render!('product' => ProductDrop.new) + end + + def test_drops_respond_to_to_liquid + assert_equal "text1", Liquid::Template.parse("{{ product.to_liquid.texts.text }}").render!('product' => ProductDrop.new) + assert_equal "text1", Liquid::Template.parse('{{ product | map: "to_liquid" | map: "texts" | map: "text" }}').render!('product' => ProductDrop.new) + end + + def test_text_drop + output = Liquid::Template.parse(' {{ product.texts.text }} ').render!('product' => ProductDrop.new) + assert_equal ' text1 ', output + end + + def test_catchall_unknown_method + output = Liquid::Template.parse(' {{ product.catchall.unknown }} ').render!('product' => ProductDrop.new) + assert_equal ' catchall_method: unknown ', output + end + + def test_catchall_integer_argument_drop + output = Liquid::Template.parse(' {{ product.catchall[8] }} ').render!('product' => ProductDrop.new) + assert_equal ' catchall_method: 8 ', output + end + + def test_text_array_drop + output = Liquid::Template.parse('{% for text in product.texts.array %} {{text}} {% endfor %}').render!('product' => ProductDrop.new) + assert_equal ' text1 text2 ', output + end + + def test_context_drop + output = Liquid::Template.parse(' {{ context.bar }} ').render!('context' => ContextDrop.new, 'bar' => "carrot") + assert_equal ' carrot ', output + end + + def test_nested_context_drop + output = Liquid::Template.parse(' {{ product.context.foo }} ').render!('product' => ProductDrop.new, 'foo' => "monkey") + assert_equal ' monkey ', output + end + + def test_protected + output = Liquid::Template.parse(' {{ product.callmenot }} ').render!('product' => ProductDrop.new) + assert_equal ' ', output + end + + def test_object_methods_not_allowed + [:dup, :clone, :singleton_class, :eval, :class_eval, :inspect].each do |method| + output = Liquid::Template.parse(" {{ product.#{method} }} ").render!('product' => ProductDrop.new) + assert_equal ' ', output + end + end + + def test_scope + assert_equal '1', Liquid::Template.parse('{{ context.scopes }}').render!('context' => ContextDrop.new) + assert_equal '2', Liquid::Template.parse('{%for i in dummy%}{{ context.scopes }}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1]) + assert_equal '3', Liquid::Template.parse('{%for i in dummy%}{%for i in dummy%}{{ context.scopes }}{%endfor%}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1]) + end + + def test_scope_though_proc + assert_equal '1', Liquid::Template.parse('{{ s }}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }) + assert_equal '2', Liquid::Template.parse('{%for i in dummy%}{{ s }}{%endfor%}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }, 'dummy' => [1]) + assert_equal '3', Liquid::Template.parse('{%for i in dummy%}{%for i in dummy%}{{ s }}{%endfor%}{%endfor%}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }, 'dummy' => [1]) + end + + def test_scope_with_assigns + assert_equal 'variable', Liquid::Template.parse('{% assign a = "variable"%}{{a}}').render!('context' => ContextDrop.new) + assert_equal 'variable', Liquid::Template.parse('{% assign a = "variable"%}{%for i in dummy%}{{a}}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1]) + assert_equal 'test', Liquid::Template.parse('{% assign header_gif = "test"%}{{header_gif}}').render!('context' => ContextDrop.new) + assert_equal 'test', Liquid::Template.parse("{% assign header_gif = 'test'%}{{header_gif}}").render!('context' => ContextDrop.new) + end + + def test_scope_from_tags + assert_equal '1', Liquid::Template.parse('{% for i in context.scopes_as_array %}{{i}}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1]) + assert_equal '12', Liquid::Template.parse('{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1]) + assert_equal '123', Liquid::Template.parse('{%for a in dummy%}{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1]) + end + + def test_access_context_from_drop + assert_equal '123', Liquid::Template.parse('{%for a in dummy%}{{ context.loop_pos }}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1, 2, 3]) + end + + def test_enumerable_drop + assert_equal '123', Liquid::Template.parse('{% for c in collection %}{{c}}{% endfor %}').render!('collection' => EnumerableDrop.new) + end + + def test_enumerable_drop_size + assert_equal '3', Liquid::Template.parse('{{collection.size}}').render!('collection' => EnumerableDrop.new) + end + + def test_enumerable_drop_will_invoke_liquid_method_missing_for_clashing_method_names + ["select", "each", "map", "cycle"].each do |method| + assert_equal method.to_s, Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => EnumerableDrop.new) + assert_equal method.to_s, Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => EnumerableDrop.new) + assert_equal method.to_s, Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => RealEnumerableDrop.new) + assert_equal method.to_s, Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => RealEnumerableDrop.new) + end + end + + def test_some_enumerable_methods_still_get_invoked + [ :count, :max ].each do |method| + assert_equal "3", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => RealEnumerableDrop.new) + assert_equal "3", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => RealEnumerableDrop.new) + assert_equal "3", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => EnumerableDrop.new) + assert_equal "3", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => EnumerableDrop.new) + end + + assert_equal "yes", Liquid::Template.parse("{% if collection contains 3 %}yes{% endif %}").render!('collection' => RealEnumerableDrop.new) + + [ :min, :first ].each do |method| + assert_equal "1", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => RealEnumerableDrop.new) + assert_equal "1", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => RealEnumerableDrop.new) + assert_equal "1", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => EnumerableDrop.new) + assert_equal "1", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => EnumerableDrop.new) + end + end + + def test_empty_string_value_access + assert_equal '', Liquid::Template.parse('{{ product[value] }}').render!('product' => ProductDrop.new, 'value' => '') + end + + def test_nil_value_access + assert_equal '', Liquid::Template.parse('{{ product[value] }}').render!('product' => ProductDrop.new, 'value' => nil) + end + + def test_default_to_s_on_drops + assert_equal 'ProductDrop', Liquid::Template.parse("{{ product }}").render!('product' => ProductDrop.new) + assert_equal 'EnumerableDrop', Liquid::Template.parse('{{ collection }}').render!('collection' => EnumerableDrop.new) + end +end # DropsTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/error_handling_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/error_handling_test.rb new file mode 100644 index 000000000000..b2d186cf1c53 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/error_handling_test.rb @@ -0,0 +1,260 @@ +require 'test_helper' + +class ErrorHandlingTest < Minitest::Test + include Liquid + + def test_templates_parsed_with_line_numbers_renders_them_in_errors + template = <<-LIQUID + Hello, + + {{ errors.standard_error }} will raise a standard error. + + Bla bla test. + + {{ errors.syntax_error }} will raise a syntax error. + + This is an argument error: {{ errors.argument_error }} + + Bla. + LIQUID + + expected = <<-TEXT + Hello, + + Liquid error (line 3): standard error will raise a standard error. + + Bla bla test. + + Liquid syntax error (line 7): syntax error will raise a syntax error. + + This is an argument error: Liquid error (line 9): argument error + + Bla. + TEXT + + output = Liquid::Template.parse(template, line_numbers: true).render('errors' => ErrorDrop.new) + assert_equal expected, output + end + + def test_standard_error + template = Liquid::Template.parse(' {{ errors.standard_error }} ') + assert_equal ' Liquid error: standard error ', template.render('errors' => ErrorDrop.new) + + assert_equal 1, template.errors.size + assert_equal StandardError, template.errors.first.class + end + + def test_syntax + template = Liquid::Template.parse(' {{ errors.syntax_error }} ') + assert_equal ' Liquid syntax error: syntax error ', template.render('errors' => ErrorDrop.new) + + assert_equal 1, template.errors.size + assert_equal SyntaxError, template.errors.first.class + end + + def test_argument + template = Liquid::Template.parse(' {{ errors.argument_error }} ') + assert_equal ' Liquid error: argument error ', template.render('errors' => ErrorDrop.new) + + assert_equal 1, template.errors.size + assert_equal ArgumentError, template.errors.first.class + end + + def test_missing_endtag_parse_time_error + assert_raises(Liquid::SyntaxError) do + Liquid::Template.parse(' {% for a in b %} ... ') + end + end + + def test_unrecognized_operator + with_error_mode(:strict) do + assert_raises(SyntaxError) do + Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ') + end + end + end + + def test_lax_unrecognized_operator + template = Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ', error_mode: :lax) + assert_equal ' Liquid error: Unknown operator =! ', template.render + assert_equal 1, template.errors.size + assert_equal Liquid::ArgumentError, template.errors.first.class + end + + def test_with_line_numbers_adds_numbers_to_parser_errors + err = assert_raises(SyntaxError) do + Liquid::Template.parse(%q( + foobar + + {% "cat" | foobar %} + + bla + ), + line_numbers: true + ) + end + + assert_match(/Liquid syntax error \(line 4\)/, err.message) + end + + def test_with_line_numbers_adds_numbers_to_parser_errors_with_whitespace_trim + err = assert_raises(SyntaxError) do + Liquid::Template.parse(%q( + foobar + + {%- "cat" | foobar -%} + + bla + ), + line_numbers: true + ) + end + + assert_match(/Liquid syntax error \(line 4\)/, err.message) + end + + def test_parsing_warn_with_line_numbers_adds_numbers_to_lexer_errors + template = Liquid::Template.parse(' + foobar + + {% if 1 =! 2 %}ok{% endif %} + + bla + ', + error_mode: :warn, + line_numbers: true + ) + + assert_equal ['Liquid syntax error (line 4): Unexpected character = in "1 =! 2"'], + template.warnings.map(&:message) + end + + def test_parsing_strict_with_line_numbers_adds_numbers_to_lexer_errors + err = assert_raises(SyntaxError) do + Liquid::Template.parse(' + foobar + + {% if 1 =! 2 %}ok{% endif %} + + bla + ', + error_mode: :strict, + line_numbers: true + ) + end + + assert_equal 'Liquid syntax error (line 4): Unexpected character = in "1 =! 2"', err.message + end + + def test_syntax_errors_in_nested_blocks_have_correct_line_number + err = assert_raises(SyntaxError) do + Liquid::Template.parse(' + foobar + + {% if 1 != 2 %} + {% foo %} + {% endif %} + + bla + ', + line_numbers: true + ) + end + + assert_equal "Liquid syntax error (line 5): Unknown tag 'foo'", err.message + end + + def test_strict_error_messages + err = assert_raises(SyntaxError) do + Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ', error_mode: :strict) + end + assert_equal 'Liquid syntax error: Unexpected character = in "1 =! 2"', err.message + + err = assert_raises(SyntaxError) do + Liquid::Template.parse('{{%%%}}', error_mode: :strict) + end + assert_equal 'Liquid syntax error: Unexpected character % in "{{%%%}}"', err.message + end + + def test_warnings + template = Liquid::Template.parse('{% if ~~~ %}{{%%%}}{% else %}{{ hello. }}{% endif %}', error_mode: :warn) + assert_equal 3, template.warnings.size + assert_equal 'Unexpected character ~ in "~~~"', template.warnings[0].to_s(false) + assert_equal 'Unexpected character % in "{{%%%}}"', template.warnings[1].to_s(false) + assert_equal 'Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].to_s(false) + assert_equal '', template.render + end + + def test_warning_line_numbers + template = Liquid::Template.parse("{% if ~~~ %}\n{{%%%}}{% else %}\n{{ hello. }}{% endif %}", error_mode: :warn, line_numbers: true) + assert_equal 'Liquid syntax error (line 1): Unexpected character ~ in "~~~"', template.warnings[0].message + assert_equal 'Liquid syntax error (line 2): Unexpected character % in "{{%%%}}"', template.warnings[1].message + assert_equal 'Liquid syntax error (line 3): Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].message + assert_equal 3, template.warnings.size + assert_equal [1, 2, 3], template.warnings.map(&:line_number) + end + + # Liquid should not catch Exceptions that are not subclasses of StandardError, like Interrupt and NoMemoryError + def test_exceptions_propagate + assert_raises Exception do + template = Liquid::Template.parse('{{ errors.exception }}') + template.render('errors' => ErrorDrop.new) + end + end + + def test_default_exception_renderer_with_internal_error + template = Liquid::Template.parse('This is a runtime error: {{ errors.runtime_error }}', line_numbers: true) + + output = template.render({ 'errors' => ErrorDrop.new }) + + assert_equal 'This is a runtime error: Liquid error (line 1): internal', output + assert_equal [Liquid::InternalError], template.errors.map(&:class) + end + + def test_setting_default_exception_renderer + old_exception_renderer = Liquid::Template.default_exception_renderer + exceptions = [] + Liquid::Template.default_exception_renderer = ->(e) { exceptions << e; '' } + template = Liquid::Template.parse('This is a runtime error: {{ errors.argument_error }}') + + output = template.render({ 'errors' => ErrorDrop.new }) + + assert_equal 'This is a runtime error: ', output + assert_equal [Liquid::ArgumentError], template.errors.map(&:class) + ensure + Liquid::Template.default_exception_renderer = old_exception_renderer if old_exception_renderer + end + + def test_exception_renderer_exposing_non_liquid_error + template = Liquid::Template.parse('This is a runtime error: {{ errors.runtime_error }}', line_numbers: true) + exceptions = [] + handler = ->(e) { exceptions << e; e.cause } + + output = template.render({ 'errors' => ErrorDrop.new }, exception_renderer: handler) + + assert_equal 'This is a runtime error: runtime error', output + assert_equal [Liquid::InternalError], exceptions.map(&:class) + assert_equal exceptions, template.errors + assert_equal '#<RuntimeError: runtime error>', exceptions.first.cause.inspect + end + + class TestFileSystem + def read_template_file(template_path) + "{{ errors.argument_error }}" + end + end + + def test_included_template_name_with_line_numbers + old_file_system = Liquid::Template.file_system + + begin + Liquid::Template.file_system = TestFileSystem.new + template = Liquid::Template.parse("Argument error:\n{% include 'product' %}", line_numbers: true) + page = template.render('errors' => ErrorDrop.new) + ensure + Liquid::Template.file_system = old_file_system + end + assert_equal "Argument error:\nLiquid error (product line 1): argument error", page + assert_equal "product", template.errors.first.template_name + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/filter_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/filter_test.rb new file mode 100644 index 000000000000..d3c880e83349 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/filter_test.rb @@ -0,0 +1,178 @@ +require 'test_helper' + +module MoneyFilter + def money(input) + sprintf(' %d$ ', input) + end + + def money_with_underscore(input) + sprintf(' %d$ ', input) + end +end + +module CanadianMoneyFilter + def money(input) + sprintf(' %d$ CAD ', input) + end +end + +module SubstituteFilter + def substitute(input, params = {}) + input.gsub(/%\{(\w+)\}/) { |match| params[$1] } + end +end + +class FiltersTest < Minitest::Test + include Liquid + + module OverrideObjectMethodFilter + def tap(input) + "tap overridden" + end + end + + def setup + @context = Context.new + end + + def test_local_filter + @context['var'] = 1000 + @context.add_filters(MoneyFilter) + + assert_equal ' 1000$ ', Template.parse("{{var | money}}").render(@context) + end + + def test_underscore_in_filter_name + @context['var'] = 1000 + @context.add_filters(MoneyFilter) + assert_equal ' 1000$ ', Template.parse("{{var | money_with_underscore}}").render(@context) + end + + def test_second_filter_overwrites_first + @context['var'] = 1000 + @context.add_filters(MoneyFilter) + @context.add_filters(CanadianMoneyFilter) + + assert_equal ' 1000$ CAD ', Template.parse("{{var | money}}").render(@context) + end + + def test_size + @context['var'] = 'abcd' + @context.add_filters(MoneyFilter) + + assert_equal '4', Template.parse("{{var | size}}").render(@context) + end + + def test_join + @context['var'] = [1, 2, 3, 4] + + assert_equal "1 2 3 4", Template.parse("{{var | join}}").render(@context) + end + + def test_sort + @context['value'] = 3 + @context['numbers'] = [2, 1, 4, 3] + @context['words'] = ['expected', 'as', 'alphabetic'] + @context['arrays'] = ['flower', 'are'] + @context['case_sensitive'] = ['sensitive', 'Expected', 'case'] + + assert_equal '1 2 3 4', Template.parse("{{numbers | sort | join}}").render(@context) + assert_equal 'alphabetic as expected', Template.parse("{{words | sort | join}}").render(@context) + assert_equal '3', Template.parse("{{value | sort}}").render(@context) + assert_equal 'are flower', Template.parse("{{arrays | sort | join}}").render(@context) + assert_equal 'Expected case sensitive', Template.parse("{{case_sensitive | sort | join}}").render(@context) + end + + def test_sort_natural + @context['words'] = ['case', 'Assert', 'Insensitive'] + @context['hashes'] = [{ 'a' => 'A' }, { 'a' => 'b' }, { 'a' => 'C' }] + @context['objects'] = [TestObject.new('A'), TestObject.new('b'), TestObject.new('C')] + + # Test strings + assert_equal 'Assert case Insensitive', Template.parse("{{words | sort_natural | join}}").render(@context) + + # Test hashes + assert_equal 'A b C', Template.parse("{{hashes | sort_natural: 'a' | map: 'a' | join}}").render(@context) + + # Test objects + assert_equal 'A b C', Template.parse("{{objects | sort_natural: 'a' | map: 'a' | join}}").render(@context) + end + + def test_compact + @context['words'] = ['a', nil, 'b', nil, 'c'] + @context['hashes'] = [{ 'a' => 'A' }, { 'a' => nil }, { 'a' => 'C' }] + @context['objects'] = [TestObject.new('A'), TestObject.new(nil), TestObject.new('C')] + + # Test strings + assert_equal 'a b c', Template.parse("{{words | compact | join}}").render(@context) + + # Test hashes + assert_equal 'A C', Template.parse("{{hashes | compact: 'a' | map: 'a' | join}}").render(@context) + + # Test objects + assert_equal 'A C', Template.parse("{{objects | compact: 'a' | map: 'a' | join}}").render(@context) + end + + def test_strip_html + @context['var'] = "<b>bla blub</a>" + + assert_equal "bla blub", Template.parse("{{ var | strip_html }}").render(@context) + end + + def test_strip_html_ignore_comments_with_html + @context['var'] = "<!-- split and some <ul> tag --><b>bla blub</a>" + + assert_equal "bla blub", Template.parse("{{ var | strip_html }}").render(@context) + end + + def test_capitalize + @context['var'] = "blub" + + assert_equal "Blub", Template.parse("{{ var | capitalize }}").render(@context) + end + + def test_nonexistent_filter_is_ignored + @context['var'] = 1000 + + assert_equal '1000', Template.parse("{{ var | xyzzy }}").render(@context) + end + + def test_filter_with_keyword_arguments + @context['surname'] = 'john' + @context['input'] = 'hello %{first_name}, %{last_name}' + @context.add_filters(SubstituteFilter) + output = Template.parse(%({{ input | substitute: first_name: surname, last_name: 'doe' }})).render(@context) + assert_equal 'hello john, doe', output + end + + def test_override_object_method_in_filter + assert_equal "tap overridden", Template.parse("{{var | tap}}").render!({ 'var' => 1000 }, filters: [OverrideObjectMethodFilter]) + + # tap still treated as a non-existent filter + assert_equal "1000", Template.parse("{{var | tap}}").render!({ 'var' => 1000 }) + end +end + +class FiltersInTemplate < Minitest::Test + include Liquid + + def test_local_global + with_global_filter(MoneyFilter) do + assert_equal " 1000$ ", Template.parse("{{1000 | money}}").render!(nil, nil) + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, filters: CanadianMoneyFilter) + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, filters: [CanadianMoneyFilter]) + end + end + + def test_local_filter_with_deprecated_syntax + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, CanadianMoneyFilter) + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, [CanadianMoneyFilter]) + end +end # FiltersTest + +class TestObject < Liquid::Drop + attr_accessor :a + def initialize(a) + @a = a + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/hash_ordering_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/hash_ordering_test.rb new file mode 100644 index 000000000000..dfc1c29fc00c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/hash_ordering_test.rb @@ -0,0 +1,23 @@ +require 'test_helper' + +class HashOrderingTest < Minitest::Test + module MoneyFilter + def money(input) + sprintf(' %d$ ', input) + end + end + + module CanadianMoneyFilter + def money(input) + sprintf(' %d$ CAD ', input) + end + end + + include Liquid + + def test_global_register_order + with_global_filter(MoneyFilter, CanadianMoneyFilter) do + assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render(nil, nil) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/output_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/output_test.rb new file mode 100644 index 000000000000..b4cf9d707c8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/output_test.rb @@ -0,0 +1,123 @@ +require 'test_helper' + +module FunnyFilter + def make_funny(input) + 'LOL' + end + + def cite_funny(input) + "LOL: #{input}" + end + + def add_smiley(input, smiley = ":-)") + "#{input} #{smiley}" + end + + def add_tag(input, tag = "p", id = "foo") + %(<#{tag} id="#{id}">#{input}</#{tag}>) + end + + def paragraph(input) + "<p>#{input}</p>" + end + + def link_to(name, url) + %(<a href="#{url}">#{name}</a>) + end +end + +class OutputTest < Minitest::Test + include Liquid + + def setup + @assigns = { + 'best_cars' => 'bmw', + 'car' => { 'bmw' => 'good', 'gm' => 'bad' } + } + end + + def test_variable + text = %( {{best_cars}} ) + + expected = %( bmw ) + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_variable_traversing_with_two_brackets + text = %({{ site.data.menu[include.menu][include.locale] }}) + assert_equal "it works!", Template.parse(text).render!( + "site" => { "data" => { "menu" => { "foo" => { "bar" => "it works!" } } } }, + "include" => { "menu" => "foo", "locale" => "bar" } + ) + end + + def test_variable_traversing + text = %( {{car.bmw}} {{car.gm}} {{car.bmw}} ) + + expected = %( good bad good ) + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_variable_piping + text = %( {{ car.gm | make_funny }} ) + expected = %( LOL ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_input + text = %( {{ car.gm | cite_funny }} ) + expected = %( LOL: bad ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_args + text = %! {{ car.gm | add_smiley : ':-(' }} ! + expected = %| bad :-( | + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_no_args + text = %( {{ car.gm | add_smiley }} ) + expected = %| bad :-) | + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_multiple_variable_piping_with_args + text = %! {{ car.gm | add_smiley : ':-(' | add_smiley : ':-('}} ! + expected = %| bad :-( :-( | + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_multiple_args + text = %( {{ car.gm | add_tag : 'span', 'bar'}} ) + expected = %( <span id="bar">bad</span> ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_variable_piping_with_variable_args + text = %( {{ car.gm | add_tag : 'span', car.bmw}} ) + expected = %( <span id="good">bad</span> ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_multiple_pipings + text = %( {{ best_cars | cite_funny | paragraph }} ) + expected = %( <p>LOL: bmw</p> ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end + + def test_link_to + text = %( {{ 'Typo' | link_to: 'http://typo.leetsoft.com' }} ) + expected = %( <a href="http://typo.leetsoft.com">Typo</a> ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter]) + end +end # OutputTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/parse_tree_visitor_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/parse_tree_visitor_test.rb new file mode 100644 index 000000000000..6ad6a2d00f01 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/parse_tree_visitor_test.rb @@ -0,0 +1,247 @@ +# frozen_string_literal: true + +require 'test_helper' + +class ParseTreeVisitorTest < Minitest::Test + include Liquid + + def test_variable + assert_equal( + ["test"], + visit(%({{ test }})) + ) + end + + def test_varible_with_filter + assert_equal( + ["test", "infilter"], + visit(%({{ test | split: infilter }})) + ) + end + + def test_dynamic_variable + assert_equal( + ["test", "inlookup"], + visit(%({{ test[inlookup] }})) + ) + end + + def test_if_condition + assert_equal( + ["test"], + visit(%({% if test %}{% endif %})) + ) + end + + def test_complex_if_condition + assert_equal( + ["test"], + visit(%({% if 1 == 1 and 2 == test %}{% endif %})) + ) + end + + def test_if_body + assert_equal( + ["test"], + visit(%({% if 1 == 1 %}{{ test }}{% endif %})) + ) + end + + def test_unless_condition + assert_equal( + ["test"], + visit(%({% unless test %}{% endunless %})) + ) + end + + def test_complex_unless_condition + assert_equal( + ["test"], + visit(%({% unless 1 == 1 and 2 == test %}{% endunless %})) + ) + end + + def test_unless_body + assert_equal( + ["test"], + visit(%({% unless 1 == 1 %}{{ test }}{% endunless %})) + ) + end + + def test_elsif_condition + assert_equal( + ["test"], + visit(%({% if 1 == 1 %}{% elsif test %}{% endif %})) + ) + end + + def test_complex_elsif_condition + assert_equal( + ["test"], + visit(%({% if 1 == 1 %}{% elsif 1 == 1 and 2 == test %}{% endif %})) + ) + end + + def test_elsif_body + assert_equal( + ["test"], + visit(%({% if 1 == 1 %}{% elsif 2 == 2 %}{{ test }}{% endif %})) + ) + end + + def test_else_body + assert_equal( + ["test"], + visit(%({% if 1 == 1 %}{% else %}{{ test }}{% endif %})) + ) + end + + def test_case_left + assert_equal( + ["test"], + visit(%({% case test %}{% endcase %})) + ) + end + + def test_case_condition + assert_equal( + ["test"], + visit(%({% case 1 %}{% when test %}{% endcase %})) + ) + end + + def test_case_when_body + assert_equal( + ["test"], + visit(%({% case 1 %}{% when 2 %}{{ test }}{% endcase %})) + ) + end + + def test_case_else_body + assert_equal( + ["test"], + visit(%({% case 1 %}{% else %}{{ test }}{% endcase %})) + ) + end + + def test_for_in + assert_equal( + ["test"], + visit(%({% for x in test %}{% endfor %})) + ) + end + + def test_for_limit + assert_equal( + ["test"], + visit(%({% for x in (1..5) limit: test %}{% endfor %})) + ) + end + + def test_for_offset + assert_equal( + ["test"], + visit(%({% for x in (1..5) offset: test %}{% endfor %})) + ) + end + + def test_for_body + assert_equal( + ["test"], + visit(%({% for x in (1..5) %}{{ test }}{% endfor %})) + ) + end + + def test_tablerow_in + assert_equal( + ["test"], + visit(%({% tablerow x in test %}{% endtablerow %})) + ) + end + + def test_tablerow_limit + assert_equal( + ["test"], + visit(%({% tablerow x in (1..5) limit: test %}{% endtablerow %})) + ) + end + + def test_tablerow_offset + assert_equal( + ["test"], + visit(%({% tablerow x in (1..5) offset: test %}{% endtablerow %})) + ) + end + + def test_tablerow_body + assert_equal( + ["test"], + visit(%({% tablerow x in (1..5) %}{{ test }}{% endtablerow %})) + ) + end + + def test_cycle + assert_equal( + ["test"], + visit(%({% cycle test %})) + ) + end + + def test_assign + assert_equal( + ["test"], + visit(%({% assign x = test %})) + ) + end + + def test_capture + assert_equal( + ["test"], + visit(%({% capture x %}{{ test }}{% endcapture %})) + ) + end + + def test_include + assert_equal( + ["test"], + visit(%({% include test %})) + ) + end + + def test_include_with + assert_equal( + ["test"], + visit(%({% include "hai" with test %})) + ) + end + + def test_include_for + assert_equal( + ["test"], + visit(%({% include "hai" for test %})) + ) + end + + def test_preserve_tree_structure + assert_equal( + [[nil, [ + [nil, [[nil, [["other", []]]]]], + ["test", []], + ["xs", []] + ]]], + traversal(%({% for x in xs offset: test %}{{ other }}{% endfor %})).visit + ) + end + + private + + def traversal(template) + ParseTreeVisitor + .for(Template.parse(template).root) + .add_callback_for(VariableLookup, &:name) + end + + def visit(template) + traversal(template).visit.flatten.compact + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/parsing_quirks_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/parsing_quirks_test.rb new file mode 100644 index 000000000000..29cb6d6d5faa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/parsing_quirks_test.rb @@ -0,0 +1,122 @@ +require 'test_helper' + +class ParsingQuirksTest < Minitest::Test + include Liquid + + def test_parsing_css + text = " div { font-weight: bold; } " + assert_equal text, Template.parse(text).render! + end + + def test_raise_on_single_close_bracet + assert_raises(SyntaxError) do + Template.parse("text {{method} oh nos!") + end + end + + def test_raise_on_label_and_no_close_bracets + assert_raises(SyntaxError) do + Template.parse("TEST {{ ") + end + end + + def test_raise_on_label_and_no_close_bracets_percent + assert_raises(SyntaxError) do + Template.parse("TEST {% ") + end + end + + def test_error_on_empty_filter + assert Template.parse("{{test}}") + + with_error_mode(:lax) do + assert Template.parse("{{|test}}") + end + + with_error_mode(:strict) do + assert_raises(SyntaxError) { Template.parse("{{|test}}") } + assert_raises(SyntaxError) { Template.parse("{{test |a|b|}}") } + end + end + + def test_meaningless_parens_error + with_error_mode(:strict) do + assert_raises(SyntaxError) do + markup = "a == 'foo' or (b == 'bar' and c == 'baz') or false" + Template.parse("{% if #{markup} %} YES {% endif %}") + end + end + end + + def test_unexpected_characters_syntax_error + with_error_mode(:strict) do + assert_raises(SyntaxError) do + markup = "true && false" + Template.parse("{% if #{markup} %} YES {% endif %}") + end + assert_raises(SyntaxError) do + markup = "false || true" + Template.parse("{% if #{markup} %} YES {% endif %}") + end + end + end + + def test_no_error_on_lax_empty_filter + assert Template.parse("{{test |a|b|}}", error_mode: :lax) + assert Template.parse("{{test}}", error_mode: :lax) + assert Template.parse("{{|test|}}", error_mode: :lax) + end + + def test_meaningless_parens_lax + with_error_mode(:lax) do + assigns = { 'b' => 'bar', 'c' => 'baz' } + markup = "a == 'foo' or (b == 'bar' and c == 'baz') or false" + assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}", assigns) + end + end + + def test_unexpected_characters_silently_eat_logic_lax + with_error_mode(:lax) do + markup = "true && false" + assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}") + markup = "false || true" + assert_template_result('', "{% if #{markup} %} YES {% endif %}") + end + end + + def test_raise_on_invalid_tag_delimiter + assert_raises(Liquid::SyntaxError) do + Template.new.parse('{% end %}') + end + end + + def test_unanchored_filter_arguments + with_error_mode(:lax) do + assert_template_result('hi', "{{ 'hi there' | split$$$:' ' | first }}") + + assert_template_result('x', "{{ 'X' | downcase) }}") + + # After the messed up quotes a filter without parameters (reverse) should work + # but one with parameters (remove) shouldn't be detected. + assert_template_result('here', "{{ 'hi there' | split:\"t\"\" | reverse | first}}") + assert_template_result('hi ', "{{ 'hi there' | split:\"t\"\" | remove:\"i\" | first}}") + end + end + + def test_invalid_variables_work + with_error_mode(:lax) do + assert_template_result('bar', "{% assign 123foo = 'bar' %}{{ 123foo }}") + assert_template_result('123', "{% assign 123 = 'bar' %}{{ 123 }}") + end + end + + def test_extra_dots_in_ranges + with_error_mode(:lax) do + assert_template_result('12345', "{% for i in (1...5) %}{{ i }}{% endfor %}") + end + end + + def test_contains_in_id + assert_template_result(' YES ', '{% if containsallshipments == true %} YES {% endif %}', 'containsallshipments' => true) + end +end # ParsingQuirksTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/render_profiling_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/render_profiling_test.rb new file mode 100644 index 000000000000..d0111e77dce6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/render_profiling_test.rb @@ -0,0 +1,154 @@ +require 'test_helper' + +class RenderProfilingTest < Minitest::Test + include Liquid + + class ProfilingFileSystem + def read_template_file(template_path) + "Rendering template {% assign template_name = '#{template_path}'%}\n{{ template_name }}" + end + end + + def setup + Liquid::Template.file_system = ProfilingFileSystem.new + end + + def test_template_allows_flagging_profiling + t = Template.parse("{{ 'a string' | upcase }}") + t.render! + + assert_nil t.profiler + end + + def test_parse_makes_available_simple_profiling + t = Template.parse("{{ 'a string' | upcase }}", profile: true) + t.render! + + assert_equal 1, t.profiler.length + + node = t.profiler[0] + assert_equal " 'a string' | upcase ", node.code + end + + def test_render_ignores_raw_strings_when_profiling + t = Template.parse("This is raw string\nstuff\nNewline", profile: true) + t.render! + + assert_equal 0, t.profiler.length + end + + def test_profiling_includes_line_numbers_of_liquid_nodes + t = Template.parse("{{ 'a string' | upcase }}\n{% increment test %}", profile: true) + t.render! + assert_equal 2, t.profiler.length + + # {{ 'a string' | upcase }} + assert_equal 1, t.profiler[0].line_number + # {{ increment test }} + assert_equal 2, t.profiler[1].line_number + end + + def test_profiling_includes_line_numbers_of_included_partials + t = Template.parse("{% include 'a_template' %}", profile: true) + t.render! + + included_children = t.profiler[0].children + + # {% assign template_name = 'a_template' %} + assert_equal 1, included_children[0].line_number + # {{ template_name }} + assert_equal 2, included_children[1].line_number + end + + def test_profiling_times_the_rendering_of_tokens + t = Template.parse("{% include 'a_template' %}", profile: true) + t.render! + + node = t.profiler[0] + refute_nil node.render_time + end + + def test_profiling_times_the_entire_render + t = Template.parse("{% include 'a_template' %}", profile: true) + t.render! + + assert t.profiler.total_render_time >= 0, "Total render time was not calculated" + end + + def test_profiling_uses_include_to_mark_children + t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}", profile: true) + t.render! + + include_node = t.profiler[1] + assert_equal 2, include_node.children.length + end + + def test_profiling_marks_children_with_the_name_of_included_partial + t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}", profile: true) + t.render! + + include_node = t.profiler[1] + include_node.children.each do |child| + assert_equal "a_template", child.partial + end + end + + def test_profiling_supports_multiple_templates + t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}\n{% include 'b_template' %}", profile: true) + t.render! + + a_template = t.profiler[1] + a_template.children.each do |child| + assert_equal "a_template", child.partial + end + + b_template = t.profiler[2] + b_template.children.each do |child| + assert_equal "b_template", child.partial + end + end + + def test_profiling_supports_rendering_the_same_partial_multiple_times + t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}\n{% include 'a_template' %}", profile: true) + t.render! + + a_template1 = t.profiler[1] + a_template1.children.each do |child| + assert_equal "a_template", child.partial + end + + a_template2 = t.profiler[2] + a_template2.children.each do |child| + assert_equal "a_template", child.partial + end + end + + def test_can_iterate_over_each_profiling_entry + t = Template.parse("{{ 'a string' | upcase }}\n{% increment test %}", profile: true) + t.render! + + timing_count = 0 + t.profiler.each do |timing| + timing_count += 1 + end + + assert_equal 2, timing_count + end + + def test_profiling_marks_children_of_if_blocks + t = Template.parse("{% if true %} {% increment test %} {{ test }} {% endif %}", profile: true) + t.render! + + assert_equal 1, t.profiler.length + assert_equal 2, t.profiler[0].children.length + end + + def test_profiling_marks_children_of_for_blocks + t = Template.parse("{% for item in collection %} {{ item }} {% endfor %}", profile: true) + t.render!({ "collection" => ["one", "two"] }) + + assert_equal 1, t.profiler.length + # Will profile each invocation of the for block + assert_equal 2, t.profiler[0].children.length + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/security_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/security_test.rb new file mode 100644 index 000000000000..f603ff082fdc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/security_test.rb @@ -0,0 +1,80 @@ +require 'test_helper' + +module SecurityFilter + def add_one(input) + "#{input} + 1" + end +end + +class SecurityTest < Minitest::Test + include Liquid + + def setup + @assigns = {} + end + + def test_no_instance_eval + text = %( {{ '1+1' | instance_eval }} ) + expected = %( 1+1 ) + + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_no_existing_instance_eval + text = %( {{ '1+1' | __instance_eval__ }} ) + expected = %( 1+1 ) + + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_no_instance_eval_after_mixing_in_new_filter + text = %( {{ '1+1' | instance_eval }} ) + expected = %( 1+1 ) + + assert_equal expected, Template.parse(text).render!(@assigns) + end + + def test_no_instance_eval_later_in_chain + text = %( {{ '1+1' | add_one | instance_eval }} ) + expected = %( 1+1 + 1 ) + + assert_equal expected, Template.parse(text).render!(@assigns, filters: SecurityFilter) + end + + def test_does_not_add_filters_to_symbol_table + current_symbols = Symbol.all_symbols + + test = %( {{ "some_string" | a_bad_filter }} ) + + template = Template.parse(test) + assert_equal [], (Symbol.all_symbols - current_symbols) + + template.render! + assert_equal [], (Symbol.all_symbols - current_symbols) + end + + def test_does_not_add_drop_methods_to_symbol_table + current_symbols = Symbol.all_symbols + + assigns = { 'drop' => Drop.new } + assert_equal "", Template.parse("{{ drop.custom_method_1 }}", assigns).render! + assert_equal "", Template.parse("{{ drop.custom_method_2 }}", assigns).render! + assert_equal "", Template.parse("{{ drop.custom_method_3 }}", assigns).render! + + assert_equal [], (Symbol.all_symbols - current_symbols) + end + + def test_max_depth_nested_blocks_does_not_raise_exception + depth = Liquid::Block::MAX_DEPTH + code = "{% if true %}" * depth + "rendered" + "{% endif %}" * depth + assert_equal "rendered", Template.parse(code).render! + end + + def test_more_than_max_depth_nested_blocks_raises_exception + depth = Liquid::Block::MAX_DEPTH + 1 + code = "{% if true %}" * depth + "rendered" + "{% endif %}" * depth + assert_raises(Liquid::StackLevelError) do + Template.parse(code).render! + end + end +end # SecurityTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/standard_filter_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/standard_filter_test.rb new file mode 100644 index 000000000000..60909510d678 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/standard_filter_test.rb @@ -0,0 +1,776 @@ +# encoding: utf-8 + +require 'test_helper' + +class Filters + include Liquid::StandardFilters +end + +class TestThing + attr_reader :foo + + def initialize + @foo = 0 + end + + def to_s + "woot: #{@foo}" + end + + def [](whatever) + to_s + end + + def to_liquid + @foo += 1 + self + end +end + +class TestDrop < Liquid::Drop + def test + "testfoo" + end +end + +class TestEnumerable < Liquid::Drop + include Enumerable + + def each(&block) + [ { "foo" => 1, "bar" => 2 }, { "foo" => 2, "bar" => 1 }, { "foo" => 3, "bar" => 3 } ].each(&block) + end +end + +class NumberLikeThing < Liquid::Drop + def initialize(amount) + @amount = amount + end + + def to_number + @amount + end +end + +class StandardFiltersTest < Minitest::Test + include Liquid + + def setup + @filters = Filters.new + end + + def test_size + assert_equal 3, @filters.size([1, 2, 3]) + assert_equal 0, @filters.size([]) + assert_equal 0, @filters.size(nil) + end + + def test_downcase + assert_equal 'testing', @filters.downcase("Testing") + assert_equal '', @filters.downcase(nil) + end + + def test_upcase + assert_equal 'TESTING', @filters.upcase("Testing") + assert_equal '', @filters.upcase(nil) + end + + def test_slice + assert_equal 'oob', @filters.slice('foobar', 1, 3) + assert_equal 'oobar', @filters.slice('foobar', 1, 1000) + assert_equal '', @filters.slice('foobar', 1, 0) + assert_equal 'o', @filters.slice('foobar', 1, 1) + assert_equal 'bar', @filters.slice('foobar', 3, 3) + assert_equal 'ar', @filters.slice('foobar', -2, 2) + assert_equal 'ar', @filters.slice('foobar', -2, 1000) + assert_equal 'r', @filters.slice('foobar', -1) + assert_equal '', @filters.slice(nil, 0) + assert_equal '', @filters.slice('foobar', 100, 10) + assert_equal '', @filters.slice('foobar', -100, 10) + assert_equal 'oob', @filters.slice('foobar', '1', '3') + assert_raises(Liquid::ArgumentError) do + @filters.slice('foobar', nil) + end + assert_raises(Liquid::ArgumentError) do + @filters.slice('foobar', 0, "") + end + end + + def test_slice_on_arrays + input = 'foobar'.split(//) + assert_equal %w(o o b), @filters.slice(input, 1, 3) + assert_equal %w(o o b a r), @filters.slice(input, 1, 1000) + assert_equal %w(), @filters.slice(input, 1, 0) + assert_equal %w(o), @filters.slice(input, 1, 1) + assert_equal %w(b a r), @filters.slice(input, 3, 3) + assert_equal %w(a r), @filters.slice(input, -2, 2) + assert_equal %w(a r), @filters.slice(input, -2, 1000) + assert_equal %w(r), @filters.slice(input, -1) + assert_equal %w(), @filters.slice(input, 100, 10) + assert_equal %w(), @filters.slice(input, -100, 10) + end + + def test_truncate + assert_equal '1234...', @filters.truncate('1234567890', 7) + assert_equal '1234567890', @filters.truncate('1234567890', 20) + assert_equal '...', @filters.truncate('1234567890', 0) + assert_equal '1234567890', @filters.truncate('1234567890') + assert_equal "测试...", @filters.truncate("测试测试测试测试", 5) + assert_equal '12341', @filters.truncate("1234567890", 5, 1) + end + + def test_split + assert_equal ['12', '34'], @filters.split('12~34', '~') + assert_equal ['A? ', ' ,Z'], @filters.split('A? ~ ~ ~ ,Z', '~ ~ ~') + assert_equal ['A?Z'], @filters.split('A?Z', '~') + assert_equal [], @filters.split(nil, ' ') + assert_equal ['A', 'Z'], @filters.split('A1Z', 1) + end + + def test_escape + assert_equal '&lt;strong&gt;', @filters.escape('<strong>') + assert_equal '1', @filters.escape(1) + assert_equal '2001-02-03', @filters.escape(Date.new(2001, 2, 3)) + assert_nil @filters.escape(nil) + end + + def test_h + assert_equal '&lt;strong&gt;', @filters.h('<strong>') + assert_equal '1', @filters.h(1) + assert_equal '2001-02-03', @filters.h(Date.new(2001, 2, 3)) + assert_nil @filters.h(nil) + end + + def test_escape_once + assert_equal '&lt;strong&gt;Hulk&lt;/strong&gt;', @filters.escape_once('&lt;strong&gt;Hulk</strong>') + end + + def test_url_encode + assert_equal 'foo%2B1%40example.com', @filters.url_encode('foo+1@example.com') + assert_equal '1', @filters.url_encode(1) + assert_equal '2001-02-03', @filters.url_encode(Date.new(2001, 2, 3)) + assert_nil @filters.url_encode(nil) + end + + def test_url_decode + assert_equal 'foo bar', @filters.url_decode('foo+bar') + assert_equal 'foo bar', @filters.url_decode('foo%20bar') + assert_equal 'foo+1@example.com', @filters.url_decode('foo%2B1%40example.com') + assert_equal '1', @filters.url_decode(1) + assert_equal '2001-02-03', @filters.url_decode(Date.new(2001, 2, 3)) + assert_nil @filters.url_decode(nil) + exception = assert_raises Liquid::ArgumentError do + @filters.url_decode('%ff') + end + assert_equal 'Liquid error: invalid byte sequence in UTF-8', exception.message + end + + def test_truncatewords + assert_equal 'one two three', @filters.truncatewords('one two three', 4) + assert_equal 'one two...', @filters.truncatewords('one two three', 2) + assert_equal 'one two three', @filters.truncatewords('one two three') + assert_equal 'Two small (13&#8221; x 5.5&#8221; x 10&#8221; high) baskets fit inside one large basket (13&#8221;...', @filters.truncatewords('Two small (13&#8221; x 5.5&#8221; x 10&#8221; high) baskets fit inside one large basket (13&#8221; x 16&#8221; x 10.5&#8221; high) with cover.', 15) + assert_equal "测试测试测试测试", @filters.truncatewords('测试测试测试测试', 5) + assert_equal 'one two1', @filters.truncatewords("one two three", 2, 1) + end + + def test_strip_html + assert_equal 'test', @filters.strip_html("<div>test</div>") + assert_equal 'test', @filters.strip_html("<div id='test'>test</div>") + assert_equal '', @filters.strip_html("<script type='text/javascript'>document.write('some stuff');</script>") + assert_equal '', @filters.strip_html("<style type='text/css'>foo bar</style>") + assert_equal 'test', @filters.strip_html("<div\nclass='multiline'>test</div>") + assert_equal 'test', @filters.strip_html("<!-- foo bar \n test -->test") + assert_equal '', @filters.strip_html(nil) + + # Quirk of the existing implementation + assert_equal 'foo;', @filters.strip_html("<<<script </script>script>foo;</script>") + end + + def test_join + assert_equal '1 2 3 4', @filters.join([1, 2, 3, 4]) + assert_equal '1 - 2 - 3 - 4', @filters.join([1, 2, 3, 4], ' - ') + assert_equal '1121314', @filters.join([1, 2, 3, 4], 1) + end + + def test_sort + assert_equal [1, 2, 3, 4], @filters.sort([4, 3, 2, 1]) + assert_equal [{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], @filters.sort([{ "a" => 4 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a") + end + + def test_sort_with_nils + assert_equal [1, 2, 3, 4, nil], @filters.sort([nil, 4, 3, 2, 1]) + assert_equal [{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }, {}], @filters.sort([{ "a" => 4 }, { "a" => 3 }, {}, { "a" => 1 }, { "a" => 2 }], "a") + end + + def test_sort_when_property_is_sometimes_missing_puts_nils_last + input = [ + { "price" => 4, "handle" => "alpha" }, + { "handle" => "beta" }, + { "price" => 1, "handle" => "gamma" }, + { "handle" => "delta" }, + { "price" => 2, "handle" => "epsilon" } + ] + expectation = [ + { "price" => 1, "handle" => "gamma" }, + { "price" => 2, "handle" => "epsilon" }, + { "price" => 4, "handle" => "alpha" }, + { "handle" => "delta" }, + { "handle" => "beta" } + ] + assert_equal expectation, @filters.sort(input, "price") + end + + def test_sort_natural + assert_equal ["a", "B", "c", "D"], @filters.sort_natural(["c", "D", "a", "B"]) + assert_equal [{ "a" => "a" }, { "a" => "B" }, { "a" => "c" }, { "a" => "D" }], @filters.sort_natural([{ "a" => "D" }, { "a" => "c" }, { "a" => "a" }, { "a" => "B" }], "a") + end + + def test_sort_natural_with_nils + assert_equal ["a", "B", "c", "D", nil], @filters.sort_natural([nil, "c", "D", "a", "B"]) + assert_equal [{ "a" => "a" }, { "a" => "B" }, { "a" => "c" }, { "a" => "D" }, {}], @filters.sort_natural([{ "a" => "D" }, { "a" => "c" }, {}, { "a" => "a" }, { "a" => "B" }], "a") + end + + def test_sort_natural_when_property_is_sometimes_missing_puts_nils_last + input = [ + { "price" => "4", "handle" => "alpha" }, + { "handle" => "beta" }, + { "price" => "1", "handle" => "gamma" }, + { "handle" => "delta" }, + { "price" => 2, "handle" => "epsilon" } + ] + expectation = [ + { "price" => "1", "handle" => "gamma" }, + { "price" => 2, "handle" => "epsilon" }, + { "price" => "4", "handle" => "alpha" }, + { "handle" => "delta" }, + { "handle" => "beta" } + ] + assert_equal expectation, @filters.sort_natural(input, "price") + end + + def test_sort_natural_case_check + input = [ + { "key" => "X" }, + { "key" => "Y" }, + { "key" => "Z" }, + { "fake" => "t" }, + { "key" => "a" }, + { "key" => "b" }, + { "key" => "c" } + ] + expectation = [ + { "key" => "a" }, + { "key" => "b" }, + { "key" => "c" }, + { "key" => "X" }, + { "key" => "Y" }, + { "key" => "Z" }, + { "fake" => "t" } + ] + assert_equal expectation, @filters.sort_natural(input, "key") + assert_equal ["a", "b", "c", "X", "Y", "Z"], @filters.sort_natural(["X", "Y", "Z", "a", "b", "c"]) + end + + def test_sort_empty_array + assert_equal [], @filters.sort([], "a") + end + + def test_sort_invalid_property + foo = [ + [1], + [2], + [3] + ] + + assert_raises Liquid::ArgumentError do + @filters.sort(foo, "bar") + end + end + + def test_sort_natural_empty_array + assert_equal [], @filters.sort_natural([], "a") + end + + def test_sort_natural_invalid_property + foo = [ + [1], + [2], + [3] + ] + + assert_raises Liquid::ArgumentError do + @filters.sort_natural(foo, "bar") + end + end + + def test_legacy_sort_hash + assert_equal [{ a: 1, b: 2 }], @filters.sort({ a: 1, b: 2 }) + end + + def test_numerical_vs_lexicographical_sort + assert_equal [2, 10], @filters.sort([10, 2]) + assert_equal [{ "a" => 2 }, { "a" => 10 }], @filters.sort([{ "a" => 10 }, { "a" => 2 }], "a") + assert_equal ["10", "2"], @filters.sort(["10", "2"]) + assert_equal [{ "a" => "10" }, { "a" => "2" }], @filters.sort([{ "a" => "10" }, { "a" => "2" }], "a") + end + + def test_uniq + assert_equal ["foo"], @filters.uniq("foo") + assert_equal [1, 3, 2, 4], @filters.uniq([1, 1, 3, 2, 3, 1, 4, 3, 2, 1]) + assert_equal [{ "a" => 1 }, { "a" => 3 }, { "a" => 2 }], @filters.uniq([{ "a" => 1 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a") + testdrop = TestDrop.new + assert_equal [testdrop], @filters.uniq([testdrop, TestDrop.new], 'test') + end + + def test_uniq_empty_array + assert_equal [], @filters.uniq([], "a") + end + + def test_uniq_invalid_property + foo = [ + [1], + [2], + [3] + ] + + assert_raises Liquid::ArgumentError do + @filters.uniq(foo, "bar") + end + end + + def test_compact_empty_array + assert_equal [], @filters.compact([], "a") + end + + def test_compact_invalid_property + foo = [ + [1], + [2], + [3] + ] + + assert_raises Liquid::ArgumentError do + @filters.compact(foo, "bar") + end + end + + def test_reverse + assert_equal [4, 3, 2, 1], @filters.reverse([1, 2, 3, 4]) + end + + def test_legacy_reverse_hash + assert_equal [{ a: 1, b: 2 }], @filters.reverse(a: 1, b: 2) + end + + def test_map + assert_equal [1, 2, 3, 4], @filters.map([{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], 'a') + assert_template_result 'abc', "{{ ary | map:'foo' | map:'bar' }}", + 'ary' => [{ 'foo' => { 'bar' => 'a' } }, { 'foo' => { 'bar' => 'b' } }, { 'foo' => { 'bar' => 'c' } }] + end + + def test_map_doesnt_call_arbitrary_stuff + assert_template_result "", '{{ "foo" | map: "__id__" }}' + assert_template_result "", '{{ "foo" | map: "inspect" }}' + end + + def test_map_calls_to_liquid + t = TestThing.new + assert_template_result "woot: 1", '{{ foo | map: "whatever" }}', "foo" => [t] + end + + def test_map_on_hashes + assert_template_result "4217", '{{ thing | map: "foo" | map: "bar" }}', + "thing" => { "foo" => [ { "bar" => 42 }, { "bar" => 17 } ] } + end + + def test_legacy_map_on_hashes_with_dynamic_key + template = "{% assign key = 'foo' %}{{ thing | map: key | map: 'bar' }}" + hash = { "foo" => { "bar" => 42 } } + assert_template_result "42", template, "thing" => hash + end + + def test_sort_calls_to_liquid + t = TestThing.new + Liquid::Template.parse('{{ foo | sort: "whatever" }}').render("foo" => [t]) + assert t.foo > 0 + end + + def test_map_over_proc + drop = TestDrop.new + p = proc{ drop } + templ = '{{ procs | map: "test" }}' + assert_template_result "testfoo", templ, "procs" => [p] + end + + def test_map_over_drops_returning_procs + drops = [ + { + "proc" => ->{ "foo" }, + }, + { + "proc" => ->{ "bar" }, + }, + ] + templ = '{{ drops | map: "proc" }}' + assert_template_result "foobar", templ, "drops" => drops + end + + def test_map_works_on_enumerables + assert_template_result "123", '{{ foo | map: "foo" }}', "foo" => TestEnumerable.new + end + + def test_map_returns_empty_on_2d_input_array + foo = [ + [1], + [2], + [3] + ] + + assert_raises Liquid::ArgumentError do + @filters.map(foo, "bar") + end + end + + def test_map_returns_empty_with_no_property + foo = [ + [1], + [2], + [3] + ] + assert_raises Liquid::ArgumentError do + @filters.map(foo, nil) + end + end + + def test_sort_works_on_enumerables + assert_template_result "213", '{{ foo | sort: "bar" | map: "foo" }}', "foo" => TestEnumerable.new + end + + def test_first_and_last_call_to_liquid + assert_template_result 'foobar', '{{ foo | first }}', 'foo' => [ThingWithToLiquid.new] + assert_template_result 'foobar', '{{ foo | last }}', 'foo' => [ThingWithToLiquid.new] + end + + def test_truncate_calls_to_liquid + assert_template_result "wo...", '{{ foo | truncate: 5 }}', "foo" => TestThing.new + end + + def test_date + assert_equal 'May', @filters.date(Time.parse("2006-05-05 10:00:00"), "%B") + assert_equal 'June', @filters.date(Time.parse("2006-06-05 10:00:00"), "%B") + assert_equal 'July', @filters.date(Time.parse("2006-07-05 10:00:00"), "%B") + + assert_equal 'May', @filters.date("2006-05-05 10:00:00", "%B") + assert_equal 'June', @filters.date("2006-06-05 10:00:00", "%B") + assert_equal 'July', @filters.date("2006-07-05 10:00:00", "%B") + + assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", "") + assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", "") + assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", "") + assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", nil) + + assert_equal '07/05/2006', @filters.date("2006-07-05 10:00:00", "%m/%d/%Y") + + assert_equal "07/16/2004", @filters.date("Fri Jul 16 01:00:00 2004", "%m/%d/%Y") + assert_equal Date.today.year.to_s, @filters.date('now', '%Y') + assert_equal Date.today.year.to_s, @filters.date('today', '%Y') + assert_equal Date.today.year.to_s, @filters.date('Today', '%Y') + + assert_nil @filters.date(nil, "%B") + + assert_equal '', @filters.date('', "%B") + + with_timezone("UTC") do + assert_equal "07/05/2006", @filters.date(1152098955, "%m/%d/%Y") + assert_equal "07/05/2006", @filters.date("1152098955", "%m/%d/%Y") + end + end + + def test_first_last + assert_equal 1, @filters.first([1, 2, 3]) + assert_equal 3, @filters.last([1, 2, 3]) + assert_nil @filters.first([]) + assert_nil @filters.last([]) + end + + def test_replace + assert_equal '2 2 2 2', @filters.replace('1 1 1 1', '1', 2) + assert_equal '2 2 2 2', @filters.replace('1 1 1 1', 1, 2) + assert_equal '2 1 1 1', @filters.replace_first('1 1 1 1', '1', 2) + assert_equal '2 1 1 1', @filters.replace_first('1 1 1 1', 1, 2) + assert_template_result '2 1 1 1', "{{ '1 1 1 1' | replace_first: '1', 2 }}" + end + + def test_remove + assert_equal ' ', @filters.remove("a a a a", 'a') + assert_equal ' ', @filters.remove("1 1 1 1", 1) + assert_equal 'a a a', @filters.remove_first("a a a a", 'a ') + assert_equal ' 1 1 1', @filters.remove_first("1 1 1 1", 1) + assert_template_result 'a a a', "{{ 'a a a a' | remove_first: 'a ' }}" + end + + def test_pipes_in_string_arguments + assert_template_result 'foobar', "{{ 'foo|bar' | remove: '|' }}" + end + + def test_strip + assert_template_result 'ab c', "{{ source | strip }}", 'source' => " ab c " + assert_template_result 'ab c', "{{ source | strip }}", 'source' => " \tab c \n \t" + end + + def test_lstrip + assert_template_result 'ab c ', "{{ source | lstrip }}", 'source' => " ab c " + assert_template_result "ab c \n \t", "{{ source | lstrip }}", 'source' => " \tab c \n \t" + end + + def test_rstrip + assert_template_result " ab c", "{{ source | rstrip }}", 'source' => " ab c " + assert_template_result " \tab c", "{{ source | rstrip }}", 'source' => " \tab c \n \t" + end + + def test_strip_newlines + assert_template_result 'abc', "{{ source | strip_newlines }}", 'source' => "a\nb\nc" + assert_template_result 'abc', "{{ source | strip_newlines }}", 'source' => "a\r\nb\nc" + end + + def test_newlines_to_br + assert_template_result "a<br />\nb<br />\nc", "{{ source | newline_to_br }}", 'source' => "a\nb\nc" + end + + def test_plus + assert_template_result "2", "{{ 1 | plus:1 }}" + assert_template_result "2.0", "{{ '1' | plus:'1.0' }}" + + assert_template_result "5", "{{ price | plus:'2' }}", 'price' => NumberLikeThing.new(3) + end + + def test_minus + assert_template_result "4", "{{ input | minus:operand }}", 'input' => 5, 'operand' => 1 + assert_template_result "2.3", "{{ '4.3' | minus:'2' }}" + + assert_template_result "5", "{{ price | minus:'2' }}", 'price' => NumberLikeThing.new(7) + end + + def test_abs + assert_template_result "17", "{{ 17 | abs }}" + assert_template_result "17", "{{ -17 | abs }}" + assert_template_result "17", "{{ '17' | abs }}" + assert_template_result "17", "{{ '-17' | abs }}" + assert_template_result "0", "{{ 0 | abs }}" + assert_template_result "0", "{{ '0' | abs }}" + assert_template_result "17.42", "{{ 17.42 | abs }}" + assert_template_result "17.42", "{{ -17.42 | abs }}" + assert_template_result "17.42", "{{ '17.42' | abs }}" + assert_template_result "17.42", "{{ '-17.42' | abs }}" + end + + def test_times + assert_template_result "12", "{{ 3 | times:4 }}" + assert_template_result "0", "{{ 'foo' | times:4 }}" + assert_template_result "6", "{{ '2.1' | times:3 | replace: '.','-' | plus:0}}" + assert_template_result "7.25", "{{ 0.0725 | times:100 }}" + assert_template_result "-7.25", '{{ "-0.0725" | times:100 }}' + assert_template_result "7.25", '{{ "-0.0725" | times: -100 }}' + assert_template_result "4", "{{ price | times:2 }}", 'price' => NumberLikeThing.new(2) + end + + def test_divided_by + assert_template_result "4", "{{ 12 | divided_by:3 }}" + assert_template_result "4", "{{ 14 | divided_by:3 }}" + + assert_template_result "5", "{{ 15 | divided_by:3 }}" + assert_equal "Liquid error: divided by 0", Template.parse("{{ 5 | divided_by:0 }}").render + + assert_template_result "0.5", "{{ 2.0 | divided_by:4 }}" + assert_raises(Liquid::ZeroDivisionError) do + assert_template_result "4", "{{ 1 | modulo: 0 }}" + end + + assert_template_result "5", "{{ price | divided_by:2 }}", 'price' => NumberLikeThing.new(10) + end + + def test_modulo + assert_template_result "1", "{{ 3 | modulo:2 }}" + assert_raises(Liquid::ZeroDivisionError) do + assert_template_result "4", "{{ 1 | modulo: 0 }}" + end + + assert_template_result "1", "{{ price | modulo:2 }}", 'price' => NumberLikeThing.new(3) + end + + def test_round + assert_template_result "5", "{{ input | round }}", 'input' => 4.6 + assert_template_result "4", "{{ '4.3' | round }}" + assert_template_result "4.56", "{{ input | round: 2 }}", 'input' => 4.5612 + assert_raises(Liquid::FloatDomainError) do + assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | round }}" + end + + assert_template_result "5", "{{ price | round }}", 'price' => NumberLikeThing.new(4.6) + assert_template_result "4", "{{ price | round }}", 'price' => NumberLikeThing.new(4.3) + end + + def test_ceil + assert_template_result "5", "{{ input | ceil }}", 'input' => 4.6 + assert_template_result "5", "{{ '4.3' | ceil }}" + assert_raises(Liquid::FloatDomainError) do + assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | ceil }}" + end + + assert_template_result "5", "{{ price | ceil }}", 'price' => NumberLikeThing.new(4.6) + end + + def test_floor + assert_template_result "4", "{{ input | floor }}", 'input' => 4.6 + assert_template_result "4", "{{ '4.3' | floor }}" + assert_raises(Liquid::FloatDomainError) do + assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | floor }}" + end + + assert_template_result "5", "{{ price | floor }}", 'price' => NumberLikeThing.new(5.4) + end + + def test_at_most + assert_template_result "4", "{{ 5 | at_most:4 }}" + assert_template_result "5", "{{ 5 | at_most:5 }}" + assert_template_result "5", "{{ 5 | at_most:6 }}" + + assert_template_result "4.5", "{{ 4.5 | at_most:5 }}" + assert_template_result "5", "{{ width | at_most:5 }}", 'width' => NumberLikeThing.new(6) + assert_template_result "4", "{{ width | at_most:5 }}", 'width' => NumberLikeThing.new(4) + assert_template_result "4", "{{ 5 | at_most: width }}", 'width' => NumberLikeThing.new(4) + end + + def test_at_least + assert_template_result "5", "{{ 5 | at_least:4 }}" + assert_template_result "5", "{{ 5 | at_least:5 }}" + assert_template_result "6", "{{ 5 | at_least:6 }}" + + assert_template_result "5", "{{ 4.5 | at_least:5 }}" + assert_template_result "6", "{{ width | at_least:5 }}", 'width' => NumberLikeThing.new(6) + assert_template_result "5", "{{ width | at_least:5 }}", 'width' => NumberLikeThing.new(4) + assert_template_result "6", "{{ 5 | at_least: width }}", 'width' => NumberLikeThing.new(6) + end + + def test_append + assigns = { 'a' => 'bc', 'b' => 'd' } + assert_template_result('bcd', "{{ a | append: 'd'}}", assigns) + assert_template_result('bcd', "{{ a | append: b}}", assigns) + end + + def test_concat + assert_equal [1, 2, 3, 4], @filters.concat([1, 2], [3, 4]) + assert_equal [1, 2, 'a'], @filters.concat([1, 2], ['a']) + assert_equal [1, 2, 10], @filters.concat([1, 2], [10]) + + assert_raises(Liquid::ArgumentError, "concat filter requires an array argument") do + @filters.concat([1, 2], 10) + end + end + + def test_prepend + assigns = { 'a' => 'bc', 'b' => 'a' } + assert_template_result('abc', "{{ a | prepend: 'a'}}", assigns) + assert_template_result('abc', "{{ a | prepend: b}}", assigns) + end + + def test_default + assert_equal "foo", @filters.default("foo", "bar") + assert_equal "bar", @filters.default(nil, "bar") + assert_equal "bar", @filters.default("", "bar") + assert_equal "bar", @filters.default(false, "bar") + assert_equal "bar", @filters.default([], "bar") + assert_equal "bar", @filters.default({}, "bar") + end + + def test_cannot_access_private_methods + assert_template_result('a', "{{ 'a' | to_number }}") + end + + def test_date_raises_nothing + assert_template_result('', "{{ '' | date: '%D' }}") + assert_template_result('abc', "{{ 'abc' | date: '%D' }}") + end + + def test_where + input = [ + { "handle" => "alpha", "ok" => true }, + { "handle" => "beta", "ok" => false }, + { "handle" => "gamma", "ok" => false }, + { "handle" => "delta", "ok" => true } + ] + + expectation = [ + { "handle" => "alpha", "ok" => true }, + { "handle" => "delta", "ok" => true } + ] + + assert_equal expectation, @filters.where(input, "ok", true) + assert_equal expectation, @filters.where(input, "ok") + end + + def test_where_no_key_set + input = [ + { "handle" => "alpha", "ok" => true }, + { "handle" => "beta" }, + { "handle" => "gamma" }, + { "handle" => "delta", "ok" => true } + ] + + expectation = [ + { "handle" => "alpha", "ok" => true }, + { "handle" => "delta", "ok" => true } + ] + + assert_equal expectation, @filters.where(input, "ok", true) + assert_equal expectation, @filters.where(input, "ok") + end + + def test_where_non_array_map_input + assert_equal [{ "a" => "ok" }], @filters.where({ "a" => "ok" }, "a", "ok") + assert_equal [], @filters.where({ "a" => "not ok" }, "a", "ok") + end + + def test_where_indexable_but_non_map_value + assert_raises(Liquid::ArgumentError) { @filters.where(1, "ok", true) } + assert_raises(Liquid::ArgumentError) { @filters.where(1, "ok") } + end + + def test_where_non_boolean_value + input = [ + { "message" => "Bonjour!", "language" => "French" }, + { "message" => "Hello!", "language" => "English" }, + { "message" => "Hallo!", "language" => "German" } + ] + + assert_equal [{ "message" => "Bonjour!", "language" => "French" }], @filters.where(input, "language", "French") + assert_equal [{ "message" => "Hallo!", "language" => "German" }], @filters.where(input, "language", "German") + assert_equal [{ "message" => "Hello!", "language" => "English" }], @filters.where(input, "language", "English") + end + + def test_where_array_of_only_unindexable_values + assert_nil @filters.where([nil], "ok", true) + assert_nil @filters.where([nil], "ok") + end + + def test_where_no_target_value + input = [ + { "foo" => false }, + { "foo" => true }, + { "foo" => "for sure" }, + { "bar" => true } + ] + + assert_equal [{ "foo" => true }, { "foo" => "for sure" }], @filters.where(input, "foo") + end + + private + + def with_timezone(tz) + old_tz = ENV['TZ'] + ENV['TZ'] = tz + yield + ensure + ENV['TZ'] = old_tz + end +end # StandardFiltersTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/break_tag_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/break_tag_test.rb new file mode 100644 index 000000000000..0fbde837628b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/break_tag_test.rb @@ -0,0 +1,15 @@ +require 'test_helper' + +class BreakTagTest < Minitest::Test + include Liquid + + # tests that no weird errors are raised if break is called outside of a + # block + def test_break_with_no_block + assigns = { 'i' => 1 } + markup = '{% break %}' + expected = '' + + assert_template_result(expected, markup, assigns) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/continue_tag_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/continue_tag_test.rb new file mode 100644 index 000000000000..ce4c158b00f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/continue_tag_test.rb @@ -0,0 +1,15 @@ +require 'test_helper' + +class ContinueTagTest < Minitest::Test + include Liquid + + # tests that no weird errors are raised if continue is called outside of a + # block + def test_continue_with_no_block + assigns = {} + markup = '{% continue %}' + expected = '' + + assert_template_result(expected, markup, assigns) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/for_tag_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/for_tag_test.rb new file mode 100644 index 000000000000..cb7a822d602c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/for_tag_test.rb @@ -0,0 +1,410 @@ +require 'test_helper' + +class ThingWithValue < Liquid::Drop + def value + 3 + end +end + +class ForTagTest < Minitest::Test + include Liquid + + def test_for + assert_template_result(' yo yo yo yo ', '{%for item in array%} yo {%endfor%}', 'array' => [1, 2, 3, 4]) + assert_template_result('yoyo', '{%for item in array%}yo{%endfor%}', 'array' => [1, 2]) + assert_template_result(' yo ', '{%for item in array%} yo {%endfor%}', 'array' => [1]) + assert_template_result('', '{%for item in array%}{%endfor%}', 'array' => [1, 2]) + expected = <<HERE + + yo + + yo + + yo + +HERE + template = <<HERE +{%for item in array%} + yo +{%endfor%} +HERE + assert_template_result(expected, template, 'array' => [1, 2, 3]) + end + + def test_for_reversed + assigns = { 'array' => [ 1, 2, 3] } + assert_template_result('321', '{%for item in array reversed %}{{item}}{%endfor%}', assigns) + end + + def test_for_with_range + assert_template_result(' 1 2 3 ', '{%for item in (1..3) %} {{item}} {%endfor%}') + + assert_raises(Liquid::ArgumentError) do + Template.parse('{% for i in (a..2) %}{% endfor %}').render!("a" => [1, 2]) + end + + assert_template_result(' 0 1 2 3 ', '{% for item in (a..3) %} {{item}} {% endfor %}', "a" => "invalid integer") + end + + def test_for_with_variable_range + assert_template_result(' 1 2 3 ', '{%for item in (1..foobar) %} {{item}} {%endfor%}', "foobar" => 3) + end + + def test_for_with_hash_value_range + foobar = { "value" => 3 } + assert_template_result(' 1 2 3 ', '{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar) + end + + def test_for_with_drop_value_range + foobar = ThingWithValue.new + assert_template_result(' 1 2 3 ', '{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar) + end + + def test_for_with_variable + assert_template_result(' 1 2 3 ', '{%for item in array%} {{item}} {%endfor%}', 'array' => [1, 2, 3]) + assert_template_result('123', '{%for item in array%}{{item}}{%endfor%}', 'array' => [1, 2, 3]) + assert_template_result('123', '{% for item in array %}{{item}}{% endfor %}', 'array' => [1, 2, 3]) + assert_template_result('abcd', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', 'b', 'c', 'd']) + assert_template_result('a b c', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', ' ', 'b', ' ', 'c']) + assert_template_result('abc', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', '', 'b', '', 'c']) + end + + def test_for_helpers + assigns = { 'array' => [1, 2, 3] } + assert_template_result(' 1/3 2/3 3/3 ', + '{%for item in array%} {{forloop.index}}/{{forloop.length}} {%endfor%}', + assigns) + assert_template_result(' 1 2 3 ', '{%for item in array%} {{forloop.index}} {%endfor%}', assigns) + assert_template_result(' 0 1 2 ', '{%for item in array%} {{forloop.index0}} {%endfor%}', assigns) + assert_template_result(' 2 1 0 ', '{%for item in array%} {{forloop.rindex0}} {%endfor%}', assigns) + assert_template_result(' 3 2 1 ', '{%for item in array%} {{forloop.rindex}} {%endfor%}', assigns) + assert_template_result(' true false false ', '{%for item in array%} {{forloop.first}} {%endfor%}', assigns) + assert_template_result(' false false true ', '{%for item in array%} {{forloop.last}} {%endfor%}', assigns) + end + + def test_for_and_if + assigns = { 'array' => [1, 2, 3] } + assert_template_result('+--', + '{%for item in array%}{% if forloop.first %}+{% else %}-{% endif %}{%endfor%}', + assigns) + end + + def test_for_else + assert_template_result('+++', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => [1, 2, 3]) + assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => []) + assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => nil) + end + + def test_limiting + assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } + assert_template_result('12', '{%for i in array limit:2 %}{{ i }}{%endfor%}', assigns) + assert_template_result('1234', '{%for i in array limit:4 %}{{ i }}{%endfor%}', assigns) + assert_template_result('3456', '{%for i in array limit:4 offset:2 %}{{ i }}{%endfor%}', assigns) + assert_template_result('3456', '{%for i in array limit: 4 offset: 2 %}{{ i }}{%endfor%}', assigns) + end + + def test_dynamic_variable_limiting + assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } + assigns['limit'] = 2 + assigns['offset'] = 2 + + assert_template_result('34', '{%for i in array limit: limit offset: offset %}{{ i }}{%endfor%}', assigns) + end + + def test_nested_for + assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] } + assert_template_result('123456', '{%for item in array%}{%for i in item%}{{ i }}{%endfor%}{%endfor%}', assigns) + end + + def test_offset_only + assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } + assert_template_result('890', '{%for i in array offset:7 %}{{ i }}{%endfor%}', assigns) + end + + def test_pause_resume + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } } + markup = <<-MKUP + {%for i in array.items limit: 3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit: 3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit: 3 %}{{i}}{%endfor%} + MKUP + expected = <<-XPCTD + 123 + next + 456 + next + 789 + XPCTD + assert_template_result(expected, markup, assigns) + end + + def test_pause_resume_limit + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } } + markup = <<-MKUP + {%for i in array.items limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:1 %}{{i}}{%endfor%} + MKUP + expected = <<-XPCTD + 123 + next + 456 + next + 7 + XPCTD + assert_template_result(expected, markup, assigns) + end + + def test_pause_resume_big_limit + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } } + markup = <<-MKUP + {%for i in array.items limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:1000 %}{{i}}{%endfor%} + MKUP + expected = <<-XPCTD + 123 + next + 456 + next + 7890 + XPCTD + assert_template_result(expected, markup, assigns) + end + + def test_pause_resume_big_offset + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } } + markup = '{%for i in array.items limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%} + next + {%for i in array.items offset:continue limit:3 offset:1000 %}{{i}}{%endfor%}' + expected = '123 + next + 456 + next + ' + assert_template_result(expected, markup, assigns) + end + + def test_for_with_break + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } } + + markup = '{% for i in array.items %}{% break %}{% endfor %}' + expected = "" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{{ i }}{% break %}{% endfor %}' + expected = "1" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{% break %}{{ i }}{% endfor %}' + expected = "" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{{ i }}{% if i > 3 %}{% break %}{% endif %}{% endfor %}' + expected = "1234" + assert_template_result(expected, markup, assigns) + + # tests to ensure it only breaks out of the local for loop + # and not all of them. + assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] } + markup = '{% for item in array %}' \ + '{% for i in item %}' \ + '{% if i == 1 %}' \ + '{% break %}' \ + '{% endif %}' \ + '{{ i }}' \ + '{% endfor %}' \ + '{% endfor %}' + expected = '3456' + assert_template_result(expected, markup, assigns) + + # test break does nothing when unreached + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } } + markup = '{% for i in array.items %}{% if i == 9999 %}{% break %}{% endif %}{{ i }}{% endfor %}' + expected = '12345' + assert_template_result(expected, markup, assigns) + end + + def test_for_with_continue + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } } + + markup = '{% for i in array.items %}{% continue %}{% endfor %}' + expected = "" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{{ i }}{% continue %}{% endfor %}' + expected = "12345" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{% continue %}{{ i }}{% endfor %}' + expected = "" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{% if i > 3 %}{% continue %}{% endif %}{{ i }}{% endfor %}' + expected = "123" + assert_template_result(expected, markup, assigns) + + markup = '{% for i in array.items %}{% if i == 3 %}{% continue %}{% else %}{{ i }}{% endif %}{% endfor %}' + expected = "1245" + assert_template_result(expected, markup, assigns) + + # tests to ensure it only continues the local for loop and not all of them. + assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] } + markup = '{% for item in array %}' \ + '{% for i in item %}' \ + '{% if i == 1 %}' \ + '{% continue %}' \ + '{% endif %}' \ + '{{ i }}' \ + '{% endfor %}' \ + '{% endfor %}' + expected = '23456' + assert_template_result(expected, markup, assigns) + + # test continue does nothing when unreached + assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } } + markup = '{% for i in array.items %}{% if i == 9999 %}{% continue %}{% endif %}{{ i }}{% endfor %}' + expected = '12345' + assert_template_result(expected, markup, assigns) + end + + def test_for_tag_string + # ruby 1.8.7 "String".each => Enumerator with single "String" element. + # ruby 1.9.3 no longer supports .each on String though we mimic + # the functionality for backwards compatibility + + assert_template_result('test string', + '{%for val in string%}{{val}}{%endfor%}', + 'string' => "test string") + + assert_template_result('test string', + '{%for val in string limit:1%}{{val}}{%endfor%}', + 'string' => "test string") + + assert_template_result('val-string-1-1-0-1-0-true-true-test string', + '{%for val in string%}' \ + '{{forloop.name}}-' \ + '{{forloop.index}}-' \ + '{{forloop.length}}-' \ + '{{forloop.index0}}-' \ + '{{forloop.rindex}}-' \ + '{{forloop.rindex0}}-' \ + '{{forloop.first}}-' \ + '{{forloop.last}}-' \ + '{{val}}{%endfor%}', + 'string' => "test string") + end + + def test_for_parentloop_references_parent_loop + assert_template_result('1.1 1.2 1.3 2.1 2.2 2.3 ', + '{% for inner in outer %}{% for k in inner %}' \ + '{{ forloop.parentloop.index }}.{{ forloop.index }} ' \ + '{% endfor %}{% endfor %}', + 'outer' => [[1, 1, 1], [1, 1, 1]]) + end + + def test_for_parentloop_nil_when_not_present + assert_template_result('.1 .2 ', + '{% for inner in outer %}' \ + '{{ forloop.parentloop.index }}.{{ forloop.index }} ' \ + '{% endfor %}', + 'outer' => [[1, 1, 1], [1, 1, 1]]) + end + + def test_inner_for_over_empty_input + assert_template_result 'oo', '{% for a in (1..2) %}o{% for b in empty %}{% endfor %}{% endfor %}' + end + + def test_blank_string_not_iterable + assert_template_result('', "{% for char in characters %}I WILL NOT BE OUTPUT{% endfor %}", 'characters' => '') + end + + def test_bad_variable_naming_in_for_loop + assert_raises(Liquid::SyntaxError) do + Liquid::Template.parse('{% for a/b in x %}{% endfor %}') + end + end + + def test_spacing_with_variable_naming_in_for_loop + expected = '12345' + template = '{% for item in items %}{{item}}{% endfor %}' + assigns = { 'items' => [1, 2, 3, 4, 5] } + assert_template_result(expected, template, assigns) + end + + class LoaderDrop < Liquid::Drop + attr_accessor :each_called, :load_slice_called + + def initialize(data) + @data = data + end + + def each + @each_called = true + @data.each { |el| yield el } + end + + def load_slice(from, to) + @load_slice_called = true + @data[(from..to - 1)] + end + end + + def test_iterate_with_each_when_no_limit_applied + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + assigns = { 'items' => loader } + expected = '12345' + template = '{% for item in items %}{{item}}{% endfor %}' + assert_template_result(expected, template, assigns) + assert loader.each_called + assert !loader.load_slice_called + end + + def test_iterate_with_load_slice_when_limit_applied + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + assigns = { 'items' => loader } + expected = '1' + template = '{% for item in items limit:1 %}{{item}}{% endfor %}' + assert_template_result(expected, template, assigns) + assert !loader.each_called + assert loader.load_slice_called + end + + def test_iterate_with_load_slice_when_limit_and_offset_applied + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + assigns = { 'items' => loader } + expected = '34' + template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}' + assert_template_result(expected, template, assigns) + assert !loader.each_called + assert loader.load_slice_called + end + + def test_iterate_with_load_slice_returns_same_results_as_without + loader = LoaderDrop.new([1, 2, 3, 4, 5]) + loader_assigns = { 'items' => loader } + array_assigns = { 'items' => [1, 2, 3, 4, 5] } + expected = '34' + template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}' + assert_template_result(expected, template, loader_assigns) + assert_template_result(expected, template, array_assigns) + end + + def test_for_cleans_up_registers + context = Context.new(ErrorDrop.new) + + assert_raises(StandardError) do + Liquid::Template.parse('{% for i in (1..2) %}{{ standard_error }}{% endfor %}').render!(context) + end + + assert context.registers[:for_stack].empty? + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/if_else_tag_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/if_else_tag_test.rb new file mode 100644 index 000000000000..45a5d3ac9d1e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/if_else_tag_test.rb @@ -0,0 +1,188 @@ +require 'test_helper' + +class IfElseTagTest < Minitest::Test + include Liquid + + def test_if + assert_template_result(' ', ' {% if false %} this text should not go into the output {% endif %} ') + assert_template_result(' this text should go into the output ', + ' {% if true %} this text should go into the output {% endif %} ') + assert_template_result(' you rock ?', '{% if false %} you suck {% endif %} {% if true %} you rock {% endif %}?') + end + + def test_literal_comparisons + assert_template_result(' NO ', '{% assign v = false %}{% if v %} YES {% else %} NO {% endif %}') + assert_template_result(' YES ', '{% assign v = nil %}{% if v == nil %} YES {% else %} NO {% endif %}') + end + + def test_if_else + assert_template_result(' YES ', '{% if false %} NO {% else %} YES {% endif %}') + assert_template_result(' YES ', '{% if true %} YES {% else %} NO {% endif %}') + assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}') + end + + def test_if_boolean + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true) + end + + def test_if_or + assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => true) + assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => false) + assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => true) + assert_template_result('', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => false) + + assert_template_result(' YES ', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => true) + assert_template_result('', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => false) + end + + def test_if_or_with_operators + assert_template_result(' YES ', '{% if a == true or b == true %} YES {% endif %}', 'a' => true, 'b' => true) + assert_template_result(' YES ', '{% if a == true or b == false %} YES {% endif %}', 'a' => true, 'b' => true) + assert_template_result('', '{% if a == false or b == false %} YES {% endif %}', 'a' => true, 'b' => true) + end + + def test_comparison_of_strings_containing_and_or_or + awful_markup = "a == 'and' and b == 'or' and c == 'foo and bar' and d == 'bar or baz' and e == 'foo' and foo and bar" + assigns = { 'a' => 'and', 'b' => 'or', 'c' => 'foo and bar', 'd' => 'bar or baz', 'e' => 'foo', 'foo' => true, 'bar' => true } + assert_template_result(' YES ', "{% if #{awful_markup} %} YES {% endif %}", assigns) + end + + def test_comparison_of_expressions_starting_with_and_or_or + assigns = { 'order' => { 'items_count' => 0 }, 'android' => { 'name' => 'Roy' } } + assert_template_result("YES", + "{% if android.name == 'Roy' %}YES{% endif %}", + assigns) + assert_template_result("YES", + "{% if order.items_count == 0 %}YES{% endif %}", + assigns) + end + + def test_if_and + assert_template_result(' YES ', '{% if true and true %} YES {% endif %}') + assert_template_result('', '{% if false and true %} YES {% endif %}') + assert_template_result('', '{% if false and true %} YES {% endif %}') + end + + def test_hash_miss_generates_false + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {}) + end + + def test_if_from_variable + assert_template_result('', '{% if var %} NO {% endif %}', 'var' => false) + assert_template_result('', '{% if var %} NO {% endif %}', 'var' => nil) + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => { 'bar' => false }) + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {}) + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => nil) + assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => true) + + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => "text") + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true) + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => 1) + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => {}) + assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => []) + assert_template_result(' YES ', '{% if "foo" %} YES {% endif %}') + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => true }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => "text" }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => 1 }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => {} }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => [] }) + + assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => false) + assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => nil) + assert_template_result(' YES ', '{% if var %} YES {% else %} NO {% endif %}', 'var' => true) + assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}', 'var' => "text") + + assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'bar' => false }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => true }) + assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => "text" }) + assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'notbar' => true }) + assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => {}) + assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'notfoo' => { 'bar' => true }) + end + + def test_nested_if + assert_template_result('', '{% if false %}{% if false %} NO {% endif %}{% endif %}') + assert_template_result('', '{% if false %}{% if true %} NO {% endif %}{% endif %}') + assert_template_result('', '{% if true %}{% if false %} NO {% endif %}{% endif %}') + assert_template_result(' YES ', '{% if true %}{% if true %} YES {% endif %}{% endif %}') + + assert_template_result(' YES ', '{% if true %}{% if true %} YES {% else %} NO {% endif %}{% else %} NO {% endif %}') + assert_template_result(' YES ', '{% if true %}{% if false %} NO {% else %} YES {% endif %}{% else %} NO {% endif %}') + assert_template_result(' YES ', '{% if false %}{% if true %} NO {% else %} NONO {% endif %}{% else %} YES {% endif %}') + end + + def test_comparisons_on_null + assert_template_result('', '{% if null < 10 %} NO {% endif %}') + assert_template_result('', '{% if null <= 10 %} NO {% endif %}') + assert_template_result('', '{% if null >= 10 %} NO {% endif %}') + assert_template_result('', '{% if null > 10 %} NO {% endif %}') + + assert_template_result('', '{% if 10 < null %} NO {% endif %}') + assert_template_result('', '{% if 10 <= null %} NO {% endif %}') + assert_template_result('', '{% if 10 >= null %} NO {% endif %}') + assert_template_result('', '{% if 10 > null %} NO {% endif %}') + end + + def test_else_if + assert_template_result('0', '{% if 0 == 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}') + assert_template_result('1', '{% if 0 != 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}') + assert_template_result('2', '{% if 0 != 0 %}0{% elsif 1 != 1%}1{% else %}2{% endif %}') + + assert_template_result('elsif', '{% if false %}if{% elsif true %}elsif{% endif %}') + end + + def test_syntax_error_no_variable + assert_raises(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}') } + end + + def test_syntax_error_no_expression + assert_raises(SyntaxError) { assert_template_result('', '{% if %}') } + end + + def test_if_with_custom_condition + original_op = Condition.operators['contains'] + Condition.operators['contains'] = :[] + + assert_template_result('yes', %({% if 'bob' contains 'o' %}yes{% endif %})) + assert_template_result('no', %({% if 'bob' contains 'f' %}yes{% else %}no{% endif %})) + ensure + Condition.operators['contains'] = original_op + end + + def test_operators_are_ignored_unless_isolated + original_op = Condition.operators['contains'] + Condition.operators['contains'] = :[] + + assert_template_result('yes', + %({% if 'gnomeslab-and-or-liquid' contains 'gnomeslab-and-or-liquid' %}yes{% endif %})) + ensure + Condition.operators['contains'] = original_op + end + + def test_operators_are_whitelisted + assert_raises(SyntaxError) do + assert_template_result('', %({% if 1 or throw or or 1 %}yes{% endif %})) + end + end + + def test_multiple_conditions + tpl = "{% if a or b and c %}true{% else %}false{% endif %}" + + tests = { + [true, true, true] => true, + [true, true, false] => true, + [true, false, true] => true, + [true, false, false] => true, + [false, true, true] => true, + [false, true, false] => false, + [false, false, true] => false, + [false, false, false] => false, + } + + tests.each do |vals, expected| + a, b, c = vals + assigns = { 'a' => a, 'b' => b, 'c' => c } + assert_template_result expected.to_s, tpl, assigns, assigns.to_s + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/include_tag_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/include_tag_test.rb new file mode 100644 index 000000000000..9c188d572c9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/include_tag_test.rb @@ -0,0 +1,253 @@ +require 'test_helper' + +class TestFileSystem + def read_template_file(template_path) + case template_path + when "product" + "Product: {{ product.title }} " + + when "locale_variables" + "Locale: {{echo1}} {{echo2}}" + + when "variant" + "Variant: {{ variant.title }}" + + when "nested_template" + "{% include 'header' %} {% include 'body' %} {% include 'footer' %}" + + when "body" + "body {% include 'body_detail' %}" + + when "nested_product_template" + "Product: {{ nested_product_template.title }} {%include 'details'%} " + + when "recursively_nested_template" + "-{% include 'recursively_nested_template' %}" + + when "pick_a_source" + "from TestFileSystem" + + when 'assignments' + "{% assign foo = 'bar' %}" + + when 'break' + "{% break %}" + + else + template_path + end + end +end + +class OtherFileSystem + def read_template_file(template_path) + 'from OtherFileSystem' + end +end + +class CountingFileSystem + attr_reader :count + def read_template_file(template_path) + @count ||= 0 + @count += 1 + 'from CountingFileSystem' + end +end + +class CustomInclude < Liquid::Tag + Syntax = /(#{Liquid::QuotedFragment}+)(\s+(?:with|for)\s+(#{Liquid::QuotedFragment}+))?/o + + def initialize(tag_name, markup, tokens) + markup =~ Syntax + @template_name = $1 + super + end + + def parse(tokens) + end + + def render(context) + @template_name[1..-2] + end +end + +class IncludeTagTest < Minitest::Test + include Liquid + + def setup + Liquid::Template.file_system = TestFileSystem.new + end + + def test_include_tag_looks_for_file_system_in_registers_first + assert_equal 'from OtherFileSystem', + Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: OtherFileSystem.new }) + end + + def test_include_tag_with + assert_template_result "Product: Draft 151cm ", + "{% include 'product' with products[0] %}", "products" => [ { 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' } ] + end + + def test_include_tag_with_default_name + assert_template_result "Product: Draft 151cm ", + "{% include 'product' %}", "product" => { 'title' => 'Draft 151cm' } + end + + def test_include_tag_for + assert_template_result "Product: Draft 151cm Product: Element 155cm ", + "{% include 'product' for products %}", "products" => [ { 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' } ] + end + + def test_include_tag_with_local_variables + assert_template_result "Locale: test123 ", "{% include 'locale_variables' echo1: 'test123' %}" + end + + def test_include_tag_with_multiple_local_variables + assert_template_result "Locale: test123 test321", + "{% include 'locale_variables' echo1: 'test123', echo2: 'test321' %}" + end + + def test_include_tag_with_multiple_local_variables_from_context + assert_template_result "Locale: test123 test321", + "{% include 'locale_variables' echo1: echo1, echo2: more_echos.echo2 %}", + 'echo1' => 'test123', 'more_echos' => { "echo2" => 'test321' } + end + + def test_included_templates_assigns_variables + assert_template_result "bar", "{% include 'assignments' %}{{ foo }}" + end + + def test_nested_include_tag + assert_template_result "body body_detail", "{% include 'body' %}" + + assert_template_result "header body body_detail footer", "{% include 'nested_template' %}" + end + + def test_nested_include_with_variable + assert_template_result "Product: Draft 151cm details ", + "{% include 'nested_product_template' with product %}", "product" => { "title" => 'Draft 151cm' } + + assert_template_result "Product: Draft 151cm details Product: Element 155cm details ", + "{% include 'nested_product_template' for products %}", "products" => [{ "title" => 'Draft 151cm' }, { "title" => 'Element 155cm' }] + end + + def test_recursively_included_template_does_not_produce_endless_loop + infinite_file_system = Class.new do + def read_template_file(template_path) + "-{% include 'loop' %}" + end + end + + Liquid::Template.file_system = infinite_file_system.new + + assert_raises(Liquid::StackLevelError) do + Template.parse("{% include 'loop' %}").render! + end + end + + def test_dynamically_choosen_template + assert_template_result "Test123", "{% include template %}", "template" => 'Test123' + assert_template_result "Test321", "{% include template %}", "template" => 'Test321' + + assert_template_result "Product: Draft 151cm ", "{% include template for product %}", + "template" => 'product', 'product' => { 'title' => 'Draft 151cm' } + end + + def test_include_tag_caches_second_read_of_same_partial + file_system = CountingFileSystem.new + assert_equal 'from CountingFileSystemfrom CountingFileSystem', + Template.parse("{% include 'pick_a_source' %}{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system }) + assert_equal 1, file_system.count + end + + def test_include_tag_doesnt_cache_partials_across_renders + file_system = CountingFileSystem.new + assert_equal 'from CountingFileSystem', + Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system }) + assert_equal 1, file_system.count + + assert_equal 'from CountingFileSystem', + Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system }) + assert_equal 2, file_system.count + end + + def test_include_tag_within_if_statement + assert_template_result "foo_if_true", "{% if true %}{% include 'foo_if_true' %}{% endif %}" + end + + def test_custom_include_tag + original_tag = Liquid::Template.tags['include'] + Liquid::Template.tags['include'] = CustomInclude + begin + assert_equal "custom_foo", + Template.parse("{% include 'custom_foo' %}").render! + ensure + Liquid::Template.tags['include'] = original_tag + end + end + + def test_custom_include_tag_within_if_statement + original_tag = Liquid::Template.tags['include'] + Liquid::Template.tags['include'] = CustomInclude + begin + assert_equal "custom_foo_if_true", + Template.parse("{% if true %}{% include 'custom_foo_if_true' %}{% endif %}").render! + ensure + Liquid::Template.tags['include'] = original_tag + end + end + + def test_does_not_add_error_in_strict_mode_for_missing_variable + Liquid::Template.file_system = TestFileSystem.new + + a = Liquid::Template.parse(' {% include "nested_template" %}') + a.render! + assert_empty a.errors + end + + def test_passing_options_to_included_templates + assert_raises(Liquid::SyntaxError) do + Template.parse("{% include template %}", error_mode: :strict).render!("template" => '{{ "X" || downcase }}') + end + with_error_mode(:lax) do + assert_equal 'x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: true).render!("template" => '{{ "X" || downcase }}') + end + assert_raises(Liquid::SyntaxError) do + Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:locale]).render!("template" => '{{ "X" || downcase }}') + end + with_error_mode(:lax) do + assert_equal 'x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:error_mode]).render!("template" => '{{ "X" || downcase }}') + end + end + + def test_render_raise_argument_error_when_template_is_undefined + assert_raises(Liquid::ArgumentError) do + template = Liquid::Template.parse('{% include undefined_variable %}') + template.render! + end + assert_raises(Liquid::ArgumentError) do + template = Liquid::Template.parse('{% include nil %}') + template.render! + end + end + + def test_including_via_variable_value + assert_template_result "from TestFileSystem", "{% assign page = 'pick_a_source' %}{% include page %}" + + assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page %}", "product" => { 'title' => 'Draft 151cm' } + + assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page for foo %}", "foo" => { 'title' => 'Draft 151cm' } + end + + def test_including_with_strict_variables + template = Liquid::Template.parse("{% include 'simple' %}", error_mode: :warn) + template.render(nil, strict_variables: true) + + assert_equal [], template.errors + end + + def test_break_through_include + assert_template_result "1", "{% for i in (1..3) %}{{ i }}{% break %}{{ i }}{% endfor %}" + assert_template_result "1", "{% for i in (1..3) %}{{ i }}{% include 'break' %}{{ i }}{% endfor %}" + end +end # IncludeTagTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/increment_tag_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/increment_tag_test.rb new file mode 100644 index 000000000000..97c51ac5bcd5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/increment_tag_test.rb @@ -0,0 +1,23 @@ +require 'test_helper' + +class IncrementTagTest < Minitest::Test + include Liquid + + def test_inc + assert_template_result('0', '{%increment port %}', {}) + assert_template_result('0 1', '{%increment port %} {%increment port%}', {}) + assert_template_result('0 0 1 2 1', + '{%increment port %} {%increment starboard%} ' \ + '{%increment port %} {%increment port%} ' \ + '{%increment starboard %}', {}) + end + + def test_dec + assert_template_result('9', '{%decrement port %}', { 'port' => 10 }) + assert_template_result('-1 -2', '{%decrement port %} {%decrement port%}', {}) + assert_template_result('1 5 2 2 5', + '{%increment port %} {%increment starboard%} ' \ + '{%increment port %} {%decrement port%} ' \ + '{%decrement starboard %}', { 'port' => 1, 'starboard' => 5 }) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/raw_tag_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/raw_tag_test.rb new file mode 100644 index 000000000000..634d052d1e23 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/raw_tag_test.rb @@ -0,0 +1,31 @@ +require 'test_helper' + +class RawTagTest < Minitest::Test + include Liquid + + def test_tag_in_raw + assert_template_result '{% comment %} test {% endcomment %}', + '{% raw %}{% comment %} test {% endcomment %}{% endraw %}' + end + + def test_output_in_raw + assert_template_result '{{ test }}', '{% raw %}{{ test }}{% endraw %}' + end + + def test_open_tag_in_raw + assert_template_result ' Foobar {% invalid ', '{% raw %} Foobar {% invalid {% endraw %}' + assert_template_result ' Foobar invalid %} ', '{% raw %} Foobar invalid %} {% endraw %}' + assert_template_result ' Foobar {{ invalid ', '{% raw %} Foobar {{ invalid {% endraw %}' + assert_template_result ' Foobar invalid }} ', '{% raw %} Foobar invalid }} {% endraw %}' + assert_template_result ' Foobar {% invalid {% {% endraw ', '{% raw %} Foobar {% invalid {% {% endraw {% endraw %}' + assert_template_result ' Foobar {% {% {% ', '{% raw %} Foobar {% {% {% {% endraw %}' + assert_template_result ' test {% raw %} {% endraw %}', '{% raw %} test {% raw %} {% {% endraw %}endraw %}' + assert_template_result ' Foobar {{ invalid 1', '{% raw %} Foobar {{ invalid {% endraw %}{{ 1 }}' + end + + def test_invalid_raw + assert_match_syntax_error(/tag was never closed/, '{% raw %} foo') + assert_match_syntax_error(/Valid syntax/, '{% raw } foo {% endraw %}') + assert_match_syntax_error(/Valid syntax/, '{% raw } foo %}{% endraw %}') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/standard_tag_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/standard_tag_test.rb new file mode 100644 index 000000000000..4b4703a6f737 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/standard_tag_test.rb @@ -0,0 +1,296 @@ +require 'test_helper' + +class StandardTagTest < Minitest::Test + include Liquid + + def test_no_transform + assert_template_result('this text should come out of the template without change...', + 'this text should come out of the template without change...') + + assert_template_result('blah', 'blah') + assert_template_result('<blah>', '<blah>') + assert_template_result('|,.:', '|,.:') + assert_template_result('', '') + + text = %(this shouldnt see any transformation either but has multiple lines + as you can clearly see here ...) + assert_template_result(text, text) + end + + def test_has_a_block_which_does_nothing + assert_template_result(%(the comment block should be removed .. right?), + %(the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?)) + + assert_template_result('', '{%comment%}{%endcomment%}') + assert_template_result('', '{%comment%}{% endcomment %}') + assert_template_result('', '{% comment %}{%endcomment%}') + assert_template_result('', '{% comment %}{% endcomment %}') + assert_template_result('', '{%comment%}comment{%endcomment%}') + assert_template_result('', '{% comment %}comment{% endcomment %}') + assert_template_result('', '{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}') + + assert_template_result('', '{%comment%}{%blabla%}{%endcomment%}') + assert_template_result('', '{% comment %}{% blabla %}{% endcomment %}') + assert_template_result('', '{%comment%}{% endif %}{%endcomment%}') + assert_template_result('', '{% comment %}{% endwhatever %}{% endcomment %}') + assert_template_result('', '{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}') + + assert_template_result('foobar', 'foo{%comment%}comment{%endcomment%}bar') + assert_template_result('foobar', 'foo{% comment %}comment{% endcomment %}bar') + assert_template_result('foobar', 'foo{%comment%} comment {%endcomment%}bar') + assert_template_result('foobar', 'foo{% comment %} comment {% endcomment %}bar') + + assert_template_result('foo bar', 'foo {%comment%} {%endcomment%} bar') + assert_template_result('foo bar', 'foo {%comment%}comment{%endcomment%} bar') + assert_template_result('foo bar', 'foo {%comment%} comment {%endcomment%} bar') + + assert_template_result('foobar', 'foo{%comment%} + {%endcomment%}bar') + end + + def test_hyphenated_assign + assigns = { 'a-b' => '1' } + assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns) + end + + def test_assign_with_colon_and_spaces + assigns = { 'var' => { 'a:b c' => { 'paged' => '1' } } } + assert_template_result('var2: 1', '{%assign var2 = var["a:b c"].paged %}var2: {{var2}}', assigns) + end + + def test_capture + assigns = { 'var' => 'content' } + assert_template_result('content foo content foo ', + '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', + assigns) + end + + def test_capture_detects_bad_syntax + assert_raises(SyntaxError) do + assert_template_result('content foo content foo ', + '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}', + { 'var' => 'content' }) + end + end + + def test_case + assigns = { 'condition' => 2 } + assert_template_result(' its 2 ', + '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', + assigns) + + assigns = { 'condition' => 1 } + assert_template_result(' its 1 ', + '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', + assigns) + + assigns = { 'condition' => 3 } + assert_template_result('', + '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}', + assigns) + + assigns = { 'condition' => "string here" } + assert_template_result(' hit ', + '{% case condition %}{% when "string here" %} hit {% endcase %}', + assigns) + + assigns = { 'condition' => "bad string here" } + assert_template_result('', + '{% case condition %}{% when "string here" %} hit {% endcase %}',\ + assigns) + end + + def test_case_with_else + assigns = { 'condition' => 5 } + assert_template_result(' hit ', + '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', + assigns) + + assigns = { 'condition' => 6 } + assert_template_result(' else ', + '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}', + assigns) + + assigns = { 'condition' => 6 } + assert_template_result(' else ', + '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}', + assigns) + end + + def test_case_on_size + assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => []) + assert_template_result('1', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1]) + assert_template_result('2', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1]) + assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1]) + assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1, 1]) + assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1, 1, 1]) + end + + def test_case_on_size_with_else + assert_template_result('else', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => []) + + assert_template_result('1', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1]) + + assert_template_result('2', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1]) + + assert_template_result('else', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1, 1]) + + assert_template_result('else', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1, 1, 1]) + + assert_template_result('else', + '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}', + 'a' => [1, 1, 1, 1, 1]) + end + + def test_case_on_length_with_else + assert_template_result('else', + '{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', + {}) + + assert_template_result('false', + '{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', + {}) + + assert_template_result('true', + '{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', + {}) + + assert_template_result('else', + '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}', + {}) + end + + def test_assign_from_case + # Example from the shopify forums + code = "{% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }}" + template = Liquid::Template.parse(code) + assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-jackets' }) + assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-t-shirts' }) + assert_equal "womenswear", template.render!("collection" => { 'handle' => 'x' }) + assert_equal "womenswear", template.render!("collection" => { 'handle' => 'y' }) + assert_equal "womenswear", template.render!("collection" => { 'handle' => 'z' }) + end + + def test_case_when_or + code = '{% case condition %}{% when 1 or 2 or 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 }) + assert_template_result(' its 4 ', code, { 'condition' => 4 }) + assert_template_result('', code, { 'condition' => 5 }) + + code = '{% case condition %}{% when 1 or "string" or null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil }) + assert_template_result('', code, { 'condition' => 'something else' }) + end + + def test_case_when_comma + code = '{% case condition %}{% when 1, 2, 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 }) + assert_template_result(' its 4 ', code, { 'condition' => 4 }) + assert_template_result('', code, { 'condition' => 5 }) + + code = '{% case condition %}{% when 1, "string", null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}' + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' }) + assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil }) + assert_template_result('', code, { 'condition' => 'something else' }) + end + + def test_assign + assert_template_result 'variable', '{% assign a = "variable"%}{{a}}' + end + + def test_assign_unassigned + assigns = { 'var' => 'content' } + assert_template_result('var2: var2:content', 'var2:{{var2}} {%assign var2 = var%} var2:{{var2}}', assigns) + end + + def test_assign_an_empty_string + assert_template_result '', '{% assign a = ""%}{{a}}' + end + + def test_assign_is_global + assert_template_result 'variable', '{%for i in (1..2) %}{% assign a = "variable"%}{% endfor %}{{a}}' + end + + def test_case_detects_bad_syntax + assert_raises(SyntaxError) do + assert_template_result('', '{% case false %}{% when %}true{% endcase %}', {}) + end + + assert_raises(SyntaxError) do + assert_template_result('', '{% case false %}{% huh %}true{% endcase %}', {}) + end + end + + def test_cycle + assert_template_result('one', '{%cycle "one", "two"%}') + assert_template_result('one two', '{%cycle "one", "two"%} {%cycle "one", "two"%}') + assert_template_result(' two', '{%cycle "", "two"%} {%cycle "", "two"%}') + + assert_template_result('one two one', '{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}') + + assert_template_result('text-align: left text-align: right', + '{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}') + end + + def test_multiple_cycles + assert_template_result('1 2 1 1 2 3 1', + '{%cycle 1,2%} {%cycle 1,2%} {%cycle 1,2%} {%cycle 1,2,3%} {%cycle 1,2,3%} {%cycle 1,2,3%} {%cycle 1,2,3%}') + end + + def test_multiple_named_cycles + assert_template_result('one one two two one one', + '{%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %} {%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %} {%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %}') + end + + def test_multiple_named_cycles_with_names_from_context + assigns = { "var1" => 1, "var2" => 2 } + assert_template_result('one one two two one one', + '{%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %}', assigns) + end + + def test_size_of_array + assigns = { "array" => [1, 2, 3, 4] } + assert_template_result('array has 4 elements', "array has {{ array.size }} elements", assigns) + end + + def test_size_of_hash + assigns = { "hash" => { a: 1, b: 2, c: 3, d: 4 } } + assert_template_result('hash has 4 elements', "hash has {{ hash.size }} elements", assigns) + end + + def test_illegal_symbols + assert_template_result('', '{% if true == empty %}?{% endif %}', {}) + assert_template_result('', '{% if true == null %}?{% endif %}', {}) + assert_template_result('', '{% if empty == true %}?{% endif %}', {}) + assert_template_result('', '{% if null == true %}?{% endif %}', {}) + end + + def test_ifchanged + assigns = { 'array' => [ 1, 1, 2, 2, 3, 3] } + assert_template_result('123', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns) + + assigns = { 'array' => [ 1, 1, 1, 1] } + assert_template_result('1', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns) + end + + def test_multiline_tag + assert_template_result '0 1 2 3', "0{%\nfor i in (1..3)\n%} {{\ni\n}}{%\nendfor\n%}" + end +end # StandardTagTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/statements_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/statements_test.rb new file mode 100644 index 000000000000..eeff166f5b5a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/statements_test.rb @@ -0,0 +1,111 @@ +require 'test_helper' + +class StatementsTest < Minitest::Test + include Liquid + + def test_true_eql_true + text = ' {% if true == true %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_true_not_eql_true + text = ' {% if true != true %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text + end + + def test_true_lq_true + text = ' {% if 0 > 0 %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text + end + + def test_one_lq_zero + text = ' {% if 1 > 0 %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_zero_lq_one + text = ' {% if 0 < 1 %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_zero_lq_or_equal_one + text = ' {% if 0 <= 0 %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_zero_lq_or_equal_one_involving_nil + text = ' {% if null <= 0 %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text + + text = ' {% if 0 <= null %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text + end + + def test_zero_lqq_or_equal_one + text = ' {% if 0 >= 0 %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text + end + + def test_strings + text = " {% if 'test' == 'test' %} true {% else %} false {% endif %} " + assert_template_result ' true ', text + end + + def test_strings_not_equal + text = " {% if 'test' != 'test' %} true {% else %} false {% endif %} " + assert_template_result ' false ', text + end + + def test_var_strings_equal + text = ' {% if var == "hello there!" %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => 'hello there!' + end + + def test_var_strings_are_not_equal + text = ' {% if "hello there!" == var %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => 'hello there!' + end + + def test_var_and_long_string_are_equal + text = " {% if var == 'hello there!' %} true {% else %} false {% endif %} " + assert_template_result ' true ', text, 'var' => 'hello there!' + end + + def test_var_and_long_string_are_equal_backwards + text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} " + assert_template_result ' true ', text, 'var' => 'hello there!' + end + + # def test_is_nil + # text = %| {% if var != nil %} true {% else %} false {% end %} | + # @template.assigns = { 'var' => 'hello there!'} + # expected = %| true | + # assert_equal expected, @template.parse(text) + # end + + def test_is_collection_empty + text = ' {% if array == empty %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'array' => [] + end + + def test_is_not_collection_empty + text = ' {% if array == empty %} true {% else %} false {% endif %} ' + assert_template_result ' false ', text, 'array' => [1, 2, 3] + end + + def test_nil + text = ' {% if var == nil %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => nil + + text = ' {% if var == null %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => nil + end + + def test_not_nil + text = ' {% if var != nil %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => 1 + + text = ' {% if var != null %} true {% else %} false {% endif %} ' + assert_template_result ' true ', text, 'var' => 1 + end +end # StatementsTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/table_row_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/table_row_test.rb new file mode 100644 index 000000000000..d7bc14cf4b8c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/table_row_test.rb @@ -0,0 +1,64 @@ +require 'test_helper' + +class TableRowTest < Minitest::Test + include Liquid + + class ArrayDrop < Liquid::Drop + include Enumerable + + def initialize(array) + @array = array + end + + def each(&block) + @array.each(&block) + end + end + + def test_table_row + assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n", + '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', + 'numbers' => [1, 2, 3, 4, 5, 6]) + + assert_template_result("<tr class=\"row1\">\n</tr>\n", + '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', + 'numbers' => []) + end + + def test_table_row_with_different_cols + assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td><td class=\"col4\"> 4 </td><td class=\"col5\"> 5 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 6 </td></tr>\n", + '{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}', + 'numbers' => [1, 2, 3, 4, 5, 6]) + end + + def test_table_col_counter + assert_template_result("<tr class=\"row1\">\n<td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row2\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row3\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n", + '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}', + 'numbers' => [1, 2, 3, 4, 5, 6]) + end + + def test_quoted_fragment + assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n", + "{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}", + 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] }) + assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n", + "{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}", + 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] }) + end + + def test_enumerable_drop + assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n", + '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}', + 'numbers' => ArrayDrop.new([1, 2, 3, 4, 5, 6])) + end + + def test_offset_and_limit + assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n", + '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}', + 'numbers' => [0, 1, 2, 3, 4, 5, 6, 7]) + end + + def test_blank_string_not_iterable + assert_template_result("<tr class=\"row1\">\n</tr>\n", "{% tablerow char in characters cols:3 %}I WILL NOT BE OUTPUT{% endtablerow %}", 'characters' => '') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/unless_else_tag_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/unless_else_tag_test.rb new file mode 100644 index 000000000000..c414a715b442 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/tags/unless_else_tag_test.rb @@ -0,0 +1,26 @@ +require 'test_helper' + +class UnlessElseTagTest < Minitest::Test + include Liquid + + def test_unless + assert_template_result(' ', ' {% unless true %} this text should not go into the output {% endunless %} ') + assert_template_result(' this text should go into the output ', + ' {% unless false %} this text should go into the output {% endunless %} ') + assert_template_result(' you rock ?', '{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?') + end + + def test_unless_else + assert_template_result(' YES ', '{% unless true %} NO {% else %} YES {% endunless %}') + assert_template_result(' YES ', '{% unless false %} YES {% else %} NO {% endunless %}') + assert_template_result(' YES ', '{% unless "foo" %} NO {% else %} YES {% endunless %}') + end + + def test_unless_in_loop + assert_template_result '23', '{% for i in choices %}{% unless i %}{{ forloop.index }}{% endunless %}{% endfor %}', 'choices' => [1, nil, false] + end + + def test_unless_else_in_loop + assert_template_result ' TRUE 2 3 ', '{% for i in choices %}{% unless i %} {{ forloop.index }} {% else %} TRUE {% endunless %}{% endfor %}', 'choices' => [1, nil, false] + end +end # UnlessElseTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/template_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/template_test.rb new file mode 100644 index 000000000000..d10e1c5e7a35 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/template_test.rb @@ -0,0 +1,332 @@ +require 'test_helper' +require 'timeout' + +class TemplateContextDrop < Liquid::Drop + def liquid_method_missing(method) + method + end + + def foo + 'fizzbuzz' + end + + def baz + @context.registers['lulz'] + end +end + +class SomethingWithLength < Liquid::Drop + def length + nil + end +end + +class ErroneousDrop < Liquid::Drop + def bad_method + raise 'ruby error in drop' + end +end + +class DropWithUndefinedMethod < Liquid::Drop + def foo + 'foo' + end +end + +class TemplateTest < Minitest::Test + include Liquid + + def test_instance_assigns_persist_on_same_template_object_between_parses + t = Template.new + assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render! + assert_equal 'from instance assigns', t.parse("{{ foo }}").render! + end + + def test_warnings_is_not_exponential_time + str = "false" + 100.times do + str = "{% if true %}true{% else %}#{str}{% endif %}" + end + + t = Template.parse(str) + assert_equal [], Timeout.timeout(1) { t.warnings } + end + + def test_instance_assigns_persist_on_same_template_parsing_between_renders + t = Template.new.parse("{{ foo }}{% assign foo = 'foo' %}{{ foo }}") + assert_equal 'foo', t.render! + assert_equal 'foofoo', t.render! + end + + def test_custom_assigns_do_not_persist_on_same_template + t = Template.new + assert_equal 'from custom assigns', t.parse("{{ foo }}").render!('foo' => 'from custom assigns') + assert_equal '', t.parse("{{ foo }}").render! + end + + def test_custom_assigns_squash_instance_assigns + t = Template.new + assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render! + assert_equal 'from custom assigns', t.parse("{{ foo }}").render!('foo' => 'from custom assigns') + end + + def test_persistent_assigns_squash_instance_assigns + t = Template.new + assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render! + t.assigns['foo'] = 'from persistent assigns' + assert_equal 'from persistent assigns', t.parse("{{ foo }}").render! + end + + def test_lambda_is_called_once_from_persistent_assigns_over_multiple_parses_and_renders + t = Template.new + t.assigns['number'] = -> { @global ||= 0; @global += 1 } + assert_equal '1', t.parse("{{number}}").render! + assert_equal '1', t.parse("{{number}}").render! + assert_equal '1', t.render! + @global = nil + end + + def test_lambda_is_called_once_from_custom_assigns_over_multiple_parses_and_renders + t = Template.new + assigns = { 'number' => -> { @global ||= 0; @global += 1 } } + assert_equal '1', t.parse("{{number}}").render!(assigns) + assert_equal '1', t.parse("{{number}}").render!(assigns) + assert_equal '1', t.render!(assigns) + @global = nil + end + + def test_resource_limits_works_with_custom_length_method + t = Template.parse("{% assign foo = bar %}") + t.resource_limits.render_length_limit = 42 + assert_equal "", t.render!("bar" => SomethingWithLength.new) + end + + def test_resource_limits_render_length + t = Template.parse("0123456789") + t.resource_limits.render_length_limit = 5 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t.resource_limits.render_length_limit = 10 + assert_equal "0123456789", t.render! + refute_nil t.resource_limits.render_length + end + + def test_resource_limits_render_score + t = Template.parse("{% for a in (1..10) %} {% for a in (1..10) %} foo {% endfor %} {% endfor %}") + t.resource_limits.render_score_limit = 50 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t = Template.parse("{% for a in (1..100) %} foo {% endfor %}") + t.resource_limits.render_score_limit = 50 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t.resource_limits.render_score_limit = 200 + assert_equal (" foo " * 100), t.render! + refute_nil t.resource_limits.render_score + end + + def test_resource_limits_assign_score + t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}") + t.resource_limits.assign_score_limit = 1 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t.resource_limits.assign_score_limit = 2 + assert_equal "", t.render! + refute_nil t.resource_limits.assign_score + end + + def test_resource_limits_assign_score_nested + t = Template.parse("{% assign foo = 'aaaa' | reverse %}") + + t.resource_limits.assign_score_limit = 3 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + + t.resource_limits.assign_score_limit = 5 + assert_equal "", t.render! + end + + def test_resource_limits_aborts_rendering_after_first_error + t = Template.parse("{% for a in (1..100) %} foo1 {% endfor %} bar {% for a in (1..100) %} foo2 {% endfor %}") + t.resource_limits.render_score_limit = 50 + assert_equal "Liquid error: Memory limits exceeded", t.render + assert t.resource_limits.reached? + end + + def test_resource_limits_hash_in_template_gets_updated_even_if_no_limits_are_set + t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}") + t.render! + assert t.resource_limits.assign_score > 0 + assert t.resource_limits.render_score > 0 + assert t.resource_limits.render_length > 0 + end + + def test_render_length_persists_between_blocks + t = Template.parse("{% if true %}aaaa{% endif %}") + t.resource_limits.render_length_limit = 7 + assert_equal "Liquid error: Memory limits exceeded", t.render + t.resource_limits.render_length_limit = 8 + assert_equal "aaaa", t.render + + t = Template.parse("{% if true %}aaaa{% endif %}{% if true %}bbb{% endif %}") + t.resource_limits.render_length_limit = 13 + assert_equal "Liquid error: Memory limits exceeded", t.render + t.resource_limits.render_length_limit = 14 + assert_equal "aaaabbb", t.render + + t = Template.parse("{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}") + t.resource_limits.render_length_limit = 5 + assert_equal "Liquid error: Memory limits exceeded", t.render + t.resource_limits.render_length_limit = 11 + assert_equal "Liquid error: Memory limits exceeded", t.render + t.resource_limits.render_length_limit = 12 + assert_equal "ababab", t.render + end + + def test_default_resource_limits_unaffected_by_render_with_context + context = Context.new + t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}") + t.render!(context) + assert context.resource_limits.assign_score > 0 + assert context.resource_limits.render_score > 0 + assert context.resource_limits.render_length > 0 + end + + def test_can_use_drop_as_context + t = Template.new + t.registers['lulz'] = 'haha' + drop = TemplateContextDrop.new + assert_equal 'fizzbuzz', t.parse('{{foo}}').render!(drop) + assert_equal 'bar', t.parse('{{bar}}').render!(drop) + assert_equal 'haha', t.parse("{{baz}}").render!(drop) + end + + def test_render_bang_force_rethrow_errors_on_passed_context + context = Context.new({ 'drop' => ErroneousDrop.new }) + t = Template.new.parse('{{ drop.bad_method }}') + + e = assert_raises RuntimeError do + t.render!(context) + end + assert_equal 'ruby error in drop', e.message + end + + def test_exception_renderer_that_returns_string + exception = nil + handler = ->(e) { exception = e; '<!-- error -->' } + + output = Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_renderer: handler) + + assert exception.is_a?(Liquid::ZeroDivisionError) + assert_equal '<!-- error -->', output + end + + def test_exception_renderer_that_raises + exception = nil + assert_raises(Liquid::ZeroDivisionError) do + Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_renderer: ->(e) { exception = e; raise }) + end + assert exception.is_a?(Liquid::ZeroDivisionError) + end + + def test_global_filter_option_on_render + global_filter_proc = ->(output) { "#{output} filtered" } + rendered_template = Template.parse("{{name}}").render({ "name" => "bob" }, global_filter: global_filter_proc) + + assert_equal 'bob filtered', rendered_template + end + + def test_global_filter_option_when_native_filters_exist + global_filter_proc = ->(output) { "#{output} filtered" } + rendered_template = Template.parse("{{name | upcase}}").render({ "name" => "bob" }, global_filter: global_filter_proc) + + assert_equal 'BOB filtered', rendered_template + end + + def test_undefined_variables + t = Template.parse("{{x}} {{y}} {{z.a}} {{z.b}} {{z.c.d}}") + result = t.render({ 'x' => 33, 'z' => { 'a' => 32, 'c' => { 'e' => 31 } } }, { strict_variables: true }) + + assert_equal '33 32 ', result + assert_equal 3, t.errors.count + assert_instance_of Liquid::UndefinedVariable, t.errors[0] + assert_equal 'Liquid error: undefined variable y', t.errors[0].message + assert_instance_of Liquid::UndefinedVariable, t.errors[1] + assert_equal 'Liquid error: undefined variable b', t.errors[1].message + assert_instance_of Liquid::UndefinedVariable, t.errors[2] + assert_equal 'Liquid error: undefined variable d', t.errors[2].message + end + + def test_nil_value_does_not_raise + Liquid::Template.error_mode = :strict + t = Template.parse("some{{x}}thing") + result = t.render!({ 'x' => nil }, strict_variables: true) + + assert_equal 0, t.errors.count + assert_equal 'something', result + end + + def test_undefined_variables_raise + t = Template.parse("{{x}} {{y}} {{z.a}} {{z.b}} {{z.c.d}}") + + assert_raises UndefinedVariable do + t.render!({ 'x' => 33, 'z' => { 'a' => 32, 'c' => { 'e' => 31 } } }, { strict_variables: true }) + end + end + + def test_undefined_drop_methods + d = DropWithUndefinedMethod.new + t = Template.new.parse('{{ foo }} {{ woot }}') + result = t.render(d, { strict_variables: true }) + + assert_equal 'foo ', result + assert_equal 1, t.errors.count + assert_instance_of Liquid::UndefinedDropMethod, t.errors[0] + end + + def test_undefined_drop_methods_raise + d = DropWithUndefinedMethod.new + t = Template.new.parse('{{ foo }} {{ woot }}') + + assert_raises UndefinedDropMethod do + t.render!(d, { strict_variables: true }) + end + end + + def test_undefined_filters + t = Template.parse("{{a}} {{x | upcase | somefilter1 | somefilter2 | somefilter3}}") + filters = Module.new do + def somefilter3(v) + "-#{v}-" + end + end + result = t.render({ 'a' => 123, 'x' => 'foo' }, { filters: [filters], strict_filters: true }) + + assert_equal '123 ', result + assert_equal 1, t.errors.count + assert_instance_of Liquid::UndefinedFilter, t.errors[0] + assert_equal 'Liquid error: undefined filter somefilter1', t.errors[0].message + end + + def test_undefined_filters_raise + t = Template.parse("{{x | somefilter1 | upcase | somefilter2}}") + + assert_raises UndefinedFilter do + t.render!({ 'x' => 'foo' }, { strict_filters: true }) + end + end + + def test_using_range_literal_works_as_expected + t = Template.parse("{% assign foo = (x..y) %}{{ foo }}") + result = t.render({ 'x' => 1, 'y' => 5 }) + assert_equal '1..5', result + + t = Template.parse("{% assign nums = (x..y) %}{% for num in nums %}{{ num }}{% endfor %}") + result = t.render({ 'x' => 1, 'y' => 5 }) + assert_equal '12345', result + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/trim_mode_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/trim_mode_test.rb new file mode 100644 index 000000000000..52248cff6b1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/trim_mode_test.rb @@ -0,0 +1,529 @@ +require 'test_helper' + +class TrimModeTest < Minitest::Test + include Liquid + + # Make sure the trim isn't applied to standard output + def test_standard_output + text = <<-END_TEMPLATE + <div> + <p> + {{ 'John' }} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> + John + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_variable_output_with_multiple_blank_lines + text = <<-END_TEMPLATE + <div> + <p> + + + {{- 'John' -}} + + + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p>John</p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_tag_output_with_multiple_blank_lines + text = <<-END_TEMPLATE + <div> + <p> + + + {%- if true -%} + yes + {%- endif -%} + + + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p>yes</p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + # Make sure the trim isn't applied to standard tags + def test_standard_tags + whitespace = ' ' + text = <<-END_TEMPLATE + <div> + <p> + {% if true %} + yes + {% endif %} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> +#{whitespace} + yes +#{whitespace} + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE + <div> + <p> + {% if false %} + no + {% endif %} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> +#{whitespace} + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + # Make sure the trim isn't too agressive + def test_no_trim_output + text = '<p>{{- \'John\' -}}</p>' + expected = '<p>John</p>' + assert_template_result(expected, text) + end + + # Make sure the trim isn't too agressive + def test_no_trim_tags + text = '<p>{%- if true -%}yes{%- endif -%}</p>' + expected = '<p>yes</p>' + assert_template_result(expected, text) + + text = '<p>{%- if false -%}no{%- endif -%}</p>' + expected = '<p></p>' + assert_template_result(expected, text) + end + + def test_single_line_outer_tag + text = '<p> {%- if true %} yes {% endif -%} </p>' + expected = '<p> yes </p>' + assert_template_result(expected, text) + + text = '<p> {%- if false %} no {% endif -%} </p>' + expected = '<p></p>' + assert_template_result(expected, text) + end + + def test_single_line_inner_tag + text = '<p> {% if true -%} yes {%- endif %} </p>' + expected = '<p> yes </p>' + assert_template_result(expected, text) + + text = '<p> {% if false -%} no {%- endif %} </p>' + expected = '<p> </p>' + assert_template_result(expected, text) + end + + def test_single_line_post_tag + text = '<p> {% if true -%} yes {% endif -%} </p>' + expected = '<p> yes </p>' + assert_template_result(expected, text) + + text = '<p> {% if false -%} no {% endif -%} </p>' + expected = '<p> </p>' + assert_template_result(expected, text) + end + + def test_single_line_pre_tag + text = '<p> {%- if true %} yes {%- endif %} </p>' + expected = '<p> yes </p>' + assert_template_result(expected, text) + + text = '<p> {%- if false %} no {%- endif %} </p>' + expected = '<p> </p>' + assert_template_result(expected, text) + end + + def test_pre_trim_output + text = <<-END_TEMPLATE + <div> + <p> + {{- 'John' }} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p>John + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_pre_trim_tags + text = <<-END_TEMPLATE + <div> + <p> + {%- if true %} + yes + {%- endif %} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> + yes + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE + <div> + <p> + {%- if false %} + no + {%- endif %} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_post_trim_output + text = <<-END_TEMPLATE + <div> + <p> + {{ 'John' -}} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> + John</p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_post_trim_tags + text = <<-END_TEMPLATE + <div> + <p> + {% if true -%} + yes + {% endif -%} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> + yes + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE + <div> + <p> + {% if false -%} + no + {% endif -%} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_pre_and_post_trim_tags + text = <<-END_TEMPLATE + <div> + <p> + {%- if true %} + yes + {% endif -%} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> + yes + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE + <div> + <p> + {%- if false %} + no + {% endif -%} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p></p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_post_and_pre_trim_tags + text = <<-END_TEMPLATE + <div> + <p> + {% if true -%} + yes + {%- endif %} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> + yes + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + + whitespace = ' ' + text = <<-END_TEMPLATE + <div> + <p> + {% if false -%} + no + {%- endif %} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p> +#{whitespace} + </p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_trim_output + text = <<-END_TEMPLATE + <div> + <p> + {{- 'John' -}} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p>John</p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_trim_tags + text = <<-END_TEMPLATE + <div> + <p> + {%- if true -%} + yes + {%- endif -%} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p>yes</p> + </div> + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE + <div> + <p> + {%- if false -%} + no + {%- endif -%} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p></p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_whitespace_trim_output + text = <<-END_TEMPLATE + <div> + <p> + {{- 'John' -}}, + {{- '30' -}} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p>John,30</p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_whitespace_trim_tags + text = <<-END_TEMPLATE + <div> + <p> + {%- if true -%} + yes + {%- endif -%} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p>yes</p> + </div> + END_EXPECTED + assert_template_result(expected, text) + + text = <<-END_TEMPLATE + <div> + <p> + {%- if false -%} + no + {%- endif -%} + </p> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p></p> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_complex_trim_output + text = <<-END_TEMPLATE + <div> + <p> + {{- 'John' -}} + {{- '30' -}} + </p> + <b> + {{ 'John' -}} + {{- '30' }} + </b> + <i> + {{- 'John' }} + {{ '30' -}} + </i> + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> + <p>John30</p> + <b> + John30 + </b> + <i>John + 30</i> + </div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_complex_trim + text = <<-END_TEMPLATE + <div> + {%- if true -%} + {%- if true -%} + <p> + {{- 'John' -}} + </p> + {%- endif -%} + {%- endif -%} + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div><p>John</p></div> + END_EXPECTED + assert_template_result(expected, text) + end + + def test_right_trim_followed_by_tag + assert_template_result('ab c', '{{ "a" -}}{{ "b" }} c') + end + + def test_raw_output + whitespace = ' ' + text = <<-END_TEMPLATE + <div> + {% raw %} + {%- if true -%} + <p> + {{- 'John' -}} + </p> + {%- endif -%} + {% endraw %} + </div> + END_TEMPLATE + expected = <<-END_EXPECTED + <div> +#{whitespace} + {%- if true -%} + <p> + {{- 'John' -}} + </p> + {%- endif -%} +#{whitespace} + </div> + END_EXPECTED + assert_template_result(expected, text) + end +end # TrimModeTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/variable_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/variable_test.rb new file mode 100644 index 000000000000..abd6e70c6734 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/integration/variable_test.rb @@ -0,0 +1,96 @@ +require 'test_helper' + +class VariableTest < Minitest::Test + include Liquid + + def test_simple_variable + template = Template.parse(%({{test}})) + assert_equal 'worked', template.render!('test' => 'worked') + assert_equal 'worked wonderfully', template.render!('test' => 'worked wonderfully') + end + + def test_variable_render_calls_to_liquid + assert_template_result 'foobar', '{{ foo }}', 'foo' => ThingWithToLiquid.new + end + + def test_simple_with_whitespaces + template = Template.parse(%( {{ test }} )) + assert_equal ' worked ', template.render!('test' => 'worked') + assert_equal ' worked wonderfully ', template.render!('test' => 'worked wonderfully') + end + + def test_ignore_unknown + template = Template.parse(%({{ test }})) + assert_equal '', template.render! + end + + def test_using_blank_as_variable_name + template = Template.parse("{% assign foo = blank %}{{ foo }}") + assert_equal '', template.render! + end + + def test_using_empty_as_variable_name + template = Template.parse("{% assign foo = empty %}{{ foo }}") + assert_equal '', template.render! + end + + def test_hash_scoping + template = Template.parse(%({{ test.test }})) + assert_equal 'worked', template.render!('test' => { 'test' => 'worked' }) + end + + def test_false_renders_as_false + assert_equal 'false', Template.parse("{{ foo }}").render!('foo' => false) + assert_equal 'false', Template.parse("{{ false }}").render! + end + + def test_nil_renders_as_empty_string + assert_equal '', Template.parse("{{ nil }}").render! + assert_equal 'cat', Template.parse("{{ nil | append: 'cat' }}").render! + end + + def test_preset_assigns + template = Template.parse(%({{ test }})) + template.assigns['test'] = 'worked' + assert_equal 'worked', template.render! + end + + def test_reuse_parsed_template + template = Template.parse(%({{ greeting }} {{ name }})) + template.assigns['greeting'] = 'Goodbye' + assert_equal 'Hello Tobi', template.render!('greeting' => 'Hello', 'name' => 'Tobi') + assert_equal 'Hello ', template.render!('greeting' => 'Hello', 'unknown' => 'Tobi') + assert_equal 'Hello Brian', template.render!('greeting' => 'Hello', 'name' => 'Brian') + assert_equal 'Goodbye Brian', template.render!('name' => 'Brian') + assert_equal({ 'greeting' => 'Goodbye' }, template.assigns) + end + + def test_assigns_not_polluted_from_template + template = Template.parse(%({{ test }}{% assign test = 'bar' %}{{ test }})) + template.assigns['test'] = 'baz' + assert_equal 'bazbar', template.render! + assert_equal 'bazbar', template.render! + assert_equal 'foobar', template.render!('test' => 'foo') + assert_equal 'bazbar', template.render! + end + + def test_hash_with_default_proc + template = Template.parse(%(Hello {{ test }})) + assigns = Hash.new { |h, k| raise "Unknown variable '#{k}'" } + assigns['test'] = 'Tobi' + assert_equal 'Hello Tobi', template.render!(assigns) + assigns.delete('test') + e = assert_raises(RuntimeError) do + template.render!(assigns) + end + assert_equal "Unknown variable 'test'", e.message + end + + def test_multiline_variable + assert_equal 'worked', Template.parse("{{\ntest\n}}").render!('test' => 'worked') + end + + def test_render_symbol + assert_template_result 'bar', '{{ foo }}', 'foo' => :bar + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/test_helper.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/test_helper.rb new file mode 100644 index 000000000000..ac5ab53d0049 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/test_helper.rb @@ -0,0 +1,116 @@ +#!/usr/bin/env ruby + +ENV["MT_NO_EXPECTATIONS"] = "1" +require 'minitest/autorun' + +$LOAD_PATH.unshift(File.join(File.expand_path(__dir__), '..', 'lib')) +require 'liquid.rb' +require 'liquid/profiler' + +mode = :strict +if env_mode = ENV['LIQUID_PARSER_MODE'] + puts "-- #{env_mode.upcase} ERROR MODE" + mode = env_mode.to_sym +end +Liquid::Template.error_mode = mode + +if ENV['LIQUID-C'] == '1' + puts "-- LIQUID C" + require 'liquid/c' +end + +if Minitest.const_defined?('Test') + # We're on Minitest 5+. Nothing to do here. +else + # Minitest 4 doesn't have Minitest::Test yet. + Minitest::Test = MiniTest::Unit::TestCase +end + +module Minitest + class Test + def fixture(name) + File.join(File.expand_path(__dir__), "fixtures", name) + end + end + + module Assertions + include Liquid + + def assert_template_result(expected, template, assigns = {}, message = nil) + assert_equal expected, Template.parse(template).render!(assigns), message + end + + def assert_template_result_matches(expected, template, assigns = {}, message = nil) + return assert_template_result(expected, template, assigns, message) unless expected.is_a? Regexp + + assert_match expected, Template.parse(template).render!(assigns), message + end + + def assert_match_syntax_error(match, template, assigns = {}) + exception = assert_raises(Liquid::SyntaxError) do + Template.parse(template).render(assigns) + end + assert_match match, exception.message + end + + def with_global_filter(*globals) + original_global_strainer = Liquid::Strainer.class_variable_get(:@@global_strainer) + Liquid::Strainer.class_variable_set(:@@global_strainer, Class.new(Liquid::Strainer) do + @filter_methods = Set.new + end) + Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear + + globals.each do |global| + Liquid::Template.register_filter(global) + end + yield + ensure + Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear + Liquid::Strainer.class_variable_set(:@@global_strainer, original_global_strainer) + end + + def with_taint_mode(mode) + old_mode = Liquid::Template.taint_mode + Liquid::Template.taint_mode = mode + yield + ensure + Liquid::Template.taint_mode = old_mode + end + + def with_error_mode(mode) + old_mode = Liquid::Template.error_mode + Liquid::Template.error_mode = mode + yield + ensure + Liquid::Template.error_mode = old_mode + end + end +end + +class ThingWithToLiquid + def to_liquid + 'foobar' + end +end + +class ErrorDrop < Liquid::Drop + def standard_error + raise Liquid::StandardError, 'standard error' + end + + def argument_error + raise Liquid::ArgumentError, 'argument error' + end + + def syntax_error + raise Liquid::SyntaxError, 'syntax error' + end + + def runtime_error + raise 'runtime error' + end + + def exception + raise Exception, 'exception' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/truffle/truffle_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/truffle/truffle_test.rb new file mode 100644 index 000000000000..47c4270373a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/truffle/truffle_test.rb @@ -0,0 +1,9 @@ +require 'test_helper' + +class TruffleTest < Minitest::Test + include Liquid + + def test_truffle_works + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/block_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/block_unit_test.rb new file mode 100644 index 000000000000..6a27a7d42aa9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/block_unit_test.rb @@ -0,0 +1,58 @@ +require 'test_helper' + +class BlockUnitTest < Minitest::Test + include Liquid + + def test_blankspace + template = Liquid::Template.parse(" ") + assert_equal [" "], template.root.nodelist + end + + def test_variable_beginning + template = Liquid::Template.parse("{{funk}} ") + assert_equal 2, template.root.nodelist.size + assert_equal Variable, template.root.nodelist[0].class + assert_equal String, template.root.nodelist[1].class + end + + def test_variable_end + template = Liquid::Template.parse(" {{funk}}") + assert_equal 2, template.root.nodelist.size + assert_equal String, template.root.nodelist[0].class + assert_equal Variable, template.root.nodelist[1].class + end + + def test_variable_middle + template = Liquid::Template.parse(" {{funk}} ") + assert_equal 3, template.root.nodelist.size + assert_equal String, template.root.nodelist[0].class + assert_equal Variable, template.root.nodelist[1].class + assert_equal String, template.root.nodelist[2].class + end + + def test_variable_many_embedded_fragments + template = Liquid::Template.parse(" {{funk}} {{so}} {{brother}} ") + assert_equal 7, template.root.nodelist.size + assert_equal [String, Variable, String, Variable, String, Variable, String], + block_types(template.root.nodelist) + end + + def test_with_block + template = Liquid::Template.parse(" {% comment %} {% endcomment %} ") + assert_equal [String, Comment, String], block_types(template.root.nodelist) + assert_equal 3, template.root.nodelist.size + end + + def test_with_custom_tag + Liquid::Template.register_tag("testtag", Block) + assert Liquid::Template.parse("{% testtag %} {% endtesttag %}") + ensure + Liquid::Template.tags.delete('testtag') + end + + private + + def block_types(nodelist) + nodelist.collect(&:class) + end +end # VariableTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/condition_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/condition_unit_test.rb new file mode 100644 index 000000000000..b3b90e8835a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/condition_unit_test.rb @@ -0,0 +1,166 @@ +require 'test_helper' + +class ConditionUnitTest < Minitest::Test + include Liquid + + def setup + @context = Liquid::Context.new + end + + def test_basic_condition + assert_equal false, Condition.new(1, '==', 2).evaluate + assert_equal true, Condition.new(1, '==', 1).evaluate + end + + def test_default_operators_evalute_true + assert_evaluates_true 1, '==', 1 + assert_evaluates_true 1, '!=', 2 + assert_evaluates_true 1, '<>', 2 + assert_evaluates_true 1, '<', 2 + assert_evaluates_true 2, '>', 1 + assert_evaluates_true 1, '>=', 1 + assert_evaluates_true 2, '>=', 1 + assert_evaluates_true 1, '<=', 2 + assert_evaluates_true 1, '<=', 1 + # negative numbers + assert_evaluates_true 1, '>', -1 + assert_evaluates_true -1, '<', 1 + assert_evaluates_true 1.0, '>', -1.0 + assert_evaluates_true -1.0, '<', 1.0 + end + + def test_default_operators_evalute_false + assert_evaluates_false 1, '==', 2 + assert_evaluates_false 1, '!=', 1 + assert_evaluates_false 1, '<>', 1 + assert_evaluates_false 1, '<', 0 + assert_evaluates_false 2, '>', 4 + assert_evaluates_false 1, '>=', 3 + assert_evaluates_false 2, '>=', 4 + assert_evaluates_false 1, '<=', 0 + assert_evaluates_false 1, '<=', 0 + end + + def test_contains_works_on_strings + assert_evaluates_true 'bob', 'contains', 'o' + assert_evaluates_true 'bob', 'contains', 'b' + assert_evaluates_true 'bob', 'contains', 'bo' + assert_evaluates_true 'bob', 'contains', 'ob' + assert_evaluates_true 'bob', 'contains', 'bob' + + assert_evaluates_false 'bob', 'contains', 'bob2' + assert_evaluates_false 'bob', 'contains', 'a' + assert_evaluates_false 'bob', 'contains', '---' + end + + def test_invalid_comparation_operator + assert_evaluates_argument_error 1, '~~', 0 + end + + def test_comparation_of_int_and_str + assert_evaluates_argument_error '1', '>', 0 + assert_evaluates_argument_error '1', '<', 0 + assert_evaluates_argument_error '1', '>=', 0 + assert_evaluates_argument_error '1', '<=', 0 + end + + def test_hash_compare_backwards_compatibility + assert_nil Condition.new({}, '>', 2).evaluate + assert_nil Condition.new(2, '>', {}).evaluate + assert_equal false, Condition.new({}, '==', 2).evaluate + assert_equal true, Condition.new({ 'a' => 1 }, '==', { 'a' => 1 }).evaluate + assert_equal true, Condition.new({ 'a' => 2 }, 'contains', 'a').evaluate + end + + def test_contains_works_on_arrays + @context = Liquid::Context.new + @context['array'] = [1, 2, 3, 4, 5] + array_expr = VariableLookup.new("array") + + assert_evaluates_false array_expr, 'contains', 0 + assert_evaluates_true array_expr, 'contains', 1 + assert_evaluates_true array_expr, 'contains', 2 + assert_evaluates_true array_expr, 'contains', 3 + assert_evaluates_true array_expr, 'contains', 4 + assert_evaluates_true array_expr, 'contains', 5 + assert_evaluates_false array_expr, 'contains', 6 + assert_evaluates_false array_expr, 'contains', "1" + end + + def test_contains_returns_false_for_nil_operands + @context = Liquid::Context.new + assert_evaluates_false VariableLookup.new('not_assigned'), 'contains', '0' + assert_evaluates_false 0, 'contains', VariableLookup.new('not_assigned') + end + + def test_contains_return_false_on_wrong_data_type + assert_evaluates_false 1, 'contains', 0 + end + + def test_contains_with_string_left_operand_coerces_right_operand_to_string + assert_evaluates_true ' 1 ', 'contains', 1 + assert_evaluates_false ' 1 ', 'contains', 2 + end + + def test_or_condition + condition = Condition.new(1, '==', 2) + + assert_equal false, condition.evaluate + + condition.or Condition.new(2, '==', 1) + + assert_equal false, condition.evaluate + + condition.or Condition.new(1, '==', 1) + + assert_equal true, condition.evaluate + end + + def test_and_condition + condition = Condition.new(1, '==', 1) + + assert_equal true, condition.evaluate + + condition.and Condition.new(2, '==', 2) + + assert_equal true, condition.evaluate + + condition.and Condition.new(2, '==', 1) + + assert_equal false, condition.evaluate + end + + def test_should_allow_custom_proc_operator + Condition.operators['starts_with'] = proc { |cond, left, right| left =~ %r{^#{right}} } + + assert_evaluates_true 'bob', 'starts_with', 'b' + assert_evaluates_false 'bob', 'starts_with', 'o' + ensure + Condition.operators.delete 'starts_with' + end + + def test_left_or_right_may_contain_operators + @context = Liquid::Context.new + @context['one'] = @context['another'] = "gnomeslab-and-or-liquid" + + assert_evaluates_true VariableLookup.new("one"), '==', VariableLookup.new("another") + end + + private + + def assert_evaluates_true(left, op, right) + assert Condition.new(left, op, right).evaluate(@context), + "Evaluated false: #{left} #{op} #{right}" + end + + def assert_evaluates_false(left, op, right) + assert !Condition.new(left, op, right).evaluate(@context), + "Evaluated true: #{left} #{op} #{right}" + end + + def assert_evaluates_argument_error(left, op, right) + assert_raises(Liquid::ArgumentError) do + Condition.new(left, op, right).evaluate(@context) + end + end +end # ConditionTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/context_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/context_unit_test.rb new file mode 100644 index 000000000000..fab19b84ab64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/context_unit_test.rb @@ -0,0 +1,489 @@ +require 'test_helper' + +class HundredCentes + def to_liquid + 100 + end +end + +class CentsDrop < Liquid::Drop + def amount + HundredCentes.new + end + + def non_zero? + true + end +end + +class ContextSensitiveDrop < Liquid::Drop + def test + @context['test'] + end +end + +class Category < Liquid::Drop + attr_accessor :name + + def initialize(name) + @name = name + end + + def to_liquid + CategoryDrop.new(self) + end +end + +class CategoryDrop + attr_accessor :category, :context + def initialize(category) + @category = category + end +end + +class CounterDrop < Liquid::Drop + def count + @count ||= 0 + @count += 1 + end +end + +class ArrayLike + def fetch(index) + end + + def [](index) + @counts ||= [] + @counts[index] ||= 0 + @counts[index] += 1 + end + + def to_liquid + self + end +end + +class ContextUnitTest < Minitest::Test + include Liquid + + def setup + @context = Liquid::Context.new + end + + def test_variables + @context['string'] = 'string' + assert_equal 'string', @context['string'] + + @context['num'] = 5 + assert_equal 5, @context['num'] + + @context['time'] = Time.parse('2006-06-06 12:00:00') + assert_equal Time.parse('2006-06-06 12:00:00'), @context['time'] + + @context['date'] = Date.today + assert_equal Date.today, @context['date'] + + now = DateTime.now + @context['datetime'] = now + assert_equal now, @context['datetime'] + + @context['bool'] = true + assert_equal true, @context['bool'] + + @context['bool'] = false + assert_equal false, @context['bool'] + + @context['nil'] = nil + assert_nil @context['nil'] + assert_nil @context['nil'] + end + + def test_variables_not_existing + assert_nil @context['does_not_exist'] + end + + def test_scoping + @context.push + @context.pop + + assert_raises(Liquid::ContextError) do + @context.pop + end + + assert_raises(Liquid::ContextError) do + @context.push + @context.pop + @context.pop + end + end + + def test_length_query + @context['numbers'] = [1, 2, 3, 4] + + assert_equal 4, @context['numbers.size'] + + @context['numbers'] = { 1 => 1, 2 => 2, 3 => 3, 4 => 4 } + + assert_equal 4, @context['numbers.size'] + + @context['numbers'] = { 1 => 1, 2 => 2, 3 => 3, 4 => 4, 'size' => 1000 } + + assert_equal 1000, @context['numbers.size'] + end + + def test_hyphenated_variable + @context['oh-my'] = 'godz' + assert_equal 'godz', @context['oh-my'] + end + + def test_add_filter + filter = Module.new do + def hi(output) + output + ' hi!' + end + end + + context = Context.new + context.add_filters(filter) + assert_equal 'hi? hi!', context.invoke(:hi, 'hi?') + + context = Context.new + assert_equal 'hi?', context.invoke(:hi, 'hi?') + + context.add_filters(filter) + assert_equal 'hi? hi!', context.invoke(:hi, 'hi?') + end + + def test_only_intended_filters_make_it_there + filter = Module.new do + def hi(output) + output + ' hi!' + end + end + + context = Context.new + assert_equal "Wookie", context.invoke("hi", "Wookie") + + context.add_filters(filter) + assert_equal "Wookie hi!", context.invoke("hi", "Wookie") + end + + def test_add_item_in_outer_scope + @context['test'] = 'test' + @context.push + assert_equal 'test', @context['test'] + @context.pop + assert_equal 'test', @context['test'] + end + + def test_add_item_in_inner_scope + @context.push + @context['test'] = 'test' + assert_equal 'test', @context['test'] + @context.pop + assert_nil @context['test'] + end + + def test_hierachical_data + @context['hash'] = { "name" => 'tobi' } + assert_equal 'tobi', @context['hash.name'] + assert_equal 'tobi', @context['hash["name"]'] + end + + def test_keywords + assert_equal true, @context['true'] + assert_equal false, @context['false'] + end + + def test_digits + assert_equal 100, @context['100'] + assert_equal 100.00, @context['100.00'] + end + + def test_strings + assert_equal "hello!", @context['"hello!"'] + assert_equal "hello!", @context["'hello!'"] + end + + def test_merge + @context.merge({ "test" => "test" }) + assert_equal 'test', @context['test'] + @context.merge({ "test" => "newvalue", "foo" => "bar" }) + assert_equal 'newvalue', @context['test'] + assert_equal 'bar', @context['foo'] + end + + def test_array_notation + @context['test'] = [1, 2, 3, 4, 5] + + assert_equal 1, @context['test[0]'] + assert_equal 2, @context['test[1]'] + assert_equal 3, @context['test[2]'] + assert_equal 4, @context['test[3]'] + assert_equal 5, @context['test[4]'] + end + + def test_recoursive_array_notation + @context['test'] = { 'test' => [1, 2, 3, 4, 5] } + + assert_equal 1, @context['test.test[0]'] + + @context['test'] = [{ 'test' => 'worked' }] + + assert_equal 'worked', @context['test[0].test'] + end + + def test_hash_to_array_transition + @context['colors'] = { + 'Blue' => ['003366', '336699', '6699CC', '99CCFF'], + 'Green' => ['003300', '336633', '669966', '99CC99'], + 'Yellow' => ['CC9900', 'FFCC00', 'FFFF99', 'FFFFCC'], + 'Red' => ['660000', '993333', 'CC6666', 'FF9999'] + } + + assert_equal '003366', @context['colors.Blue[0]'] + assert_equal 'FF9999', @context['colors.Red[3]'] + end + + def test_try_first + @context['test'] = [1, 2, 3, 4, 5] + + assert_equal 1, @context['test.first'] + assert_equal 5, @context['test.last'] + + @context['test'] = { 'test' => [1, 2, 3, 4, 5] } + + assert_equal 1, @context['test.test.first'] + assert_equal 5, @context['test.test.last'] + + @context['test'] = [1] + assert_equal 1, @context['test.first'] + assert_equal 1, @context['test.last'] + end + + def test_access_hashes_with_hash_notation + @context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] } + @context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] } + + assert_equal 5, @context['products["count"]'] + assert_equal 'deepsnow', @context['products["tags"][0]'] + assert_equal 'deepsnow', @context['products["tags"].first'] + assert_equal 'draft151cm', @context['product["variants"][0]["title"]'] + assert_equal 'element151cm', @context['product["variants"][1]["title"]'] + assert_equal 'draft151cm', @context['product["variants"][0]["title"]'] + assert_equal 'element151cm', @context['product["variants"].last["title"]'] + end + + def test_access_variable_with_hash_notation + @context['foo'] = 'baz' + @context['bar'] = 'foo' + + assert_equal 'baz', @context['["foo"]'] + assert_equal 'baz', @context['[bar]'] + end + + def test_access_hashes_with_hash_access_variables + @context['var'] = 'tags' + @context['nested'] = { 'var' => 'tags' } + @context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] } + + assert_equal 'deepsnow', @context['products[var].first'] + assert_equal 'freestyle', @context['products[nested.var].last'] + end + + def test_hash_notation_only_for_hash_access + @context['array'] = [1, 2, 3, 4, 5] + @context['hash'] = { 'first' => 'Hello' } + + assert_equal 1, @context['array.first'] + assert_nil @context['array["first"]'] + assert_equal 'Hello', @context['hash["first"]'] + end + + def test_first_can_appear_in_middle_of_callchain + @context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] } + + assert_equal 'draft151cm', @context['product.variants[0].title'] + assert_equal 'element151cm', @context['product.variants[1].title'] + assert_equal 'draft151cm', @context['product.variants.first.title'] + assert_equal 'element151cm', @context['product.variants.last.title'] + end + + def test_cents + @context.merge("cents" => HundredCentes.new) + assert_equal 100, @context['cents'] + end + + def test_nested_cents + @context.merge("cents" => { 'amount' => HundredCentes.new }) + assert_equal 100, @context['cents.amount'] + + @context.merge("cents" => { 'cents' => { 'amount' => HundredCentes.new } }) + assert_equal 100, @context['cents.cents.amount'] + end + + def test_cents_through_drop + @context.merge("cents" => CentsDrop.new) + assert_equal 100, @context['cents.amount'] + end + + def test_nested_cents_through_drop + @context.merge("vars" => { "cents" => CentsDrop.new }) + assert_equal 100, @context['vars.cents.amount'] + end + + def test_drop_methods_with_question_marks + @context.merge("cents" => CentsDrop.new) + assert @context['cents.non_zero?'] + end + + def test_context_from_within_drop + @context.merge("test" => '123', "vars" => ContextSensitiveDrop.new) + assert_equal '123', @context['vars.test'] + end + + def test_nested_context_from_within_drop + @context.merge("test" => '123', "vars" => { "local" => ContextSensitiveDrop.new }) + assert_equal '123', @context['vars.local.test'] + end + + def test_ranges + @context.merge("test" => '5') + assert_equal (1..5), @context['(1..5)'] + assert_equal (1..5), @context['(1..test)'] + assert_equal (5..5), @context['(test..test)'] + end + + def test_cents_through_drop_nestedly + @context.merge("cents" => { "cents" => CentsDrop.new }) + assert_equal 100, @context['cents.cents.amount'] + + @context.merge("cents" => { "cents" => { "cents" => CentsDrop.new } }) + assert_equal 100, @context['cents.cents.cents.amount'] + end + + def test_drop_with_variable_called_only_once + @context['counter'] = CounterDrop.new + + assert_equal 1, @context['counter.count'] + assert_equal 2, @context['counter.count'] + assert_equal 3, @context['counter.count'] + end + + def test_drop_with_key_called_only_once + @context['counter'] = CounterDrop.new + + assert_equal 1, @context['counter["count"]'] + assert_equal 2, @context['counter["count"]'] + assert_equal 3, @context['counter["count"]'] + end + + def test_proc_as_variable + @context['dynamic'] = proc { 'Hello' } + + assert_equal 'Hello', @context['dynamic'] + end + + def test_lambda_as_variable + @context['dynamic'] = proc { 'Hello' } + + assert_equal 'Hello', @context['dynamic'] + end + + def test_nested_lambda_as_variable + @context['dynamic'] = { "lambda" => proc { 'Hello' } } + + assert_equal 'Hello', @context['dynamic.lambda'] + end + + def test_array_containing_lambda_as_variable + @context['dynamic'] = [1, 2, proc { 'Hello' }, 4, 5] + + assert_equal 'Hello', @context['dynamic[2]'] + end + + def test_lambda_is_called_once + @context['callcount'] = proc { @global ||= 0; @global += 1; @global.to_s } + + assert_equal '1', @context['callcount'] + assert_equal '1', @context['callcount'] + assert_equal '1', @context['callcount'] + + @global = nil + end + + def test_nested_lambda_is_called_once + @context['callcount'] = { "lambda" => proc { @global ||= 0; @global += 1; @global.to_s } } + + assert_equal '1', @context['callcount.lambda'] + assert_equal '1', @context['callcount.lambda'] + assert_equal '1', @context['callcount.lambda'] + + @global = nil + end + + def test_lambda_in_array_is_called_once + @context['callcount'] = [1, 2, proc { @global ||= 0; @global += 1; @global.to_s }, 4, 5] + + assert_equal '1', @context['callcount[2]'] + assert_equal '1', @context['callcount[2]'] + assert_equal '1', @context['callcount[2]'] + + @global = nil + end + + def test_access_to_context_from_proc + @context.registers[:magic] = 345392 + + @context['magic'] = proc { @context.registers[:magic] } + + assert_equal 345392, @context['magic'] + end + + def test_to_liquid_and_context_at_first_level + @context['category'] = Category.new("foobar") + assert_kind_of CategoryDrop, @context['category'] + assert_equal @context, @context['category'].context + end + + def test_interrupt_avoids_object_allocations + assert_no_object_allocations do + @context.interrupt? + end + end + + def test_context_initialization_with_a_proc_in_environment + contx = Context.new([test: ->(c) { c['poutine'] }], { test: :foo }) + + assert contx + assert_nil contx['poutine'] + end + + def test_apply_global_filter + global_filter_proc = ->(output) { "#{output} filtered" } + + context = Context.new + context.global_filter = global_filter_proc + + assert_equal 'hi filtered', context.apply_global_filter('hi') + end + + def test_apply_global_filter_when_no_global_filter_exist + context = Context.new + assert_equal 'hi', context.apply_global_filter('hi') + end + + private + + def assert_no_object_allocations + unless RUBY_ENGINE == 'ruby' + skip "stackprof needed to count object allocations" + end + require 'stackprof' + + profile = StackProf.run(mode: :object) do + yield + end + assert_equal 0, profile[:samples] + end +end # ContextTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/file_system_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/file_system_unit_test.rb new file mode 100644 index 000000000000..2c7250ba0f52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/file_system_unit_test.rb @@ -0,0 +1,35 @@ +require 'test_helper' + +class FileSystemUnitTest < Minitest::Test + include Liquid + + def test_default + assert_raises(FileSystemError) do + BlankFileSystem.new.read_template_file("dummy") + end + end + + def test_local + file_system = Liquid::LocalFileSystem.new("/some/path") + assert_equal "/some/path/_mypartial.liquid", file_system.full_path("mypartial") + assert_equal "/some/path/dir/_mypartial.liquid", file_system.full_path("dir/mypartial") + + assert_raises(FileSystemError) do + file_system.full_path("../dir/mypartial") + end + + assert_raises(FileSystemError) do + file_system.full_path("/dir/../../dir/mypartial") + end + + assert_raises(FileSystemError) do + file_system.full_path("/etc/passwd") + end + end + + def test_custom_template_filename_patterns + file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html") + assert_equal "/some/path/mypartial.html", file_system.full_path("mypartial") + assert_equal "/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial") + end +end # FileSystemTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/i18n_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/i18n_unit_test.rb new file mode 100644 index 000000000000..b57500e3ac9a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/i18n_unit_test.rb @@ -0,0 +1,37 @@ +require 'test_helper' + +class I18nUnitTest < Minitest::Test + include Liquid + + def setup + @i18n = I18n.new(fixture("en_locale.yml")) + end + + def test_simple_translate_string + assert_equal "less is more", @i18n.translate("simple") + end + + def test_nested_translate_string + assert_equal "something wasn't right", @i18n.translate("errors.syntax.oops") + end + + def test_single_string_interpolation + assert_equal "something different", @i18n.translate("whatever", something: "different") + end + + # def test_raises_translation_error_on_undefined_interpolation_key + # assert_raises I18n::TranslationError do + # @i18n.translate("whatever", :oopstypos => "yes") + # end + # end + + def test_raises_unknown_translation + assert_raises I18n::TranslationError do + @i18n.translate("doesnt_exist") + end + end + + def test_sets_default_path_to_en + assert_equal I18n::DEFAULT_LOCALE, I18n.new.path + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/lexer_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/lexer_unit_test.rb new file mode 100644 index 000000000000..5adcf2bddf2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/lexer_unit_test.rb @@ -0,0 +1,51 @@ +require 'test_helper' + +class LexerUnitTest < Minitest::Test + include Liquid + + def test_strings + tokens = Lexer.new(%( 'this is a test""' "wat 'lol'")).tokenize + assert_equal [[:string, %('this is a test""')], [:string, %("wat 'lol'")], [:end_of_string]], tokens + end + + def test_integer + tokens = Lexer.new('hi 50').tokenize + assert_equal [[:id, 'hi'], [:number, '50'], [:end_of_string]], tokens + end + + def test_float + tokens = Lexer.new('hi 5.0').tokenize + assert_equal [[:id, 'hi'], [:number, '5.0'], [:end_of_string]], tokens + end + + def test_comparison + tokens = Lexer.new('== <> contains ').tokenize + assert_equal [[:comparison, '=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens + end + + def test_specials + tokens = Lexer.new('| .:').tokenize + assert_equal [[:pipe, '|'], [:dot, '.'], [:colon, ':'], [:end_of_string]], tokens + tokens = Lexer.new('[,]').tokenize + assert_equal [[:open_square, '['], [:comma, ','], [:close_square, ']'], [:end_of_string]], tokens + end + + def test_fancy_identifiers + tokens = Lexer.new('hi five?').tokenize + assert_equal [[:id, 'hi'], [:id, 'five?'], [:end_of_string]], tokens + + tokens = Lexer.new('2foo').tokenize + assert_equal [[:number, '2'], [:id, 'foo'], [:end_of_string]], tokens + end + + def test_whitespace + tokens = Lexer.new("five|\n\t ==").tokenize + assert_equal [[:id, 'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens + end + + def test_unexpected_character + assert_raises(SyntaxError) do + Lexer.new("%").tokenize + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/parser_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/parser_unit_test.rb new file mode 100644 index 000000000000..9f23337af0ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/parser_unit_test.rb @@ -0,0 +1,82 @@ +require 'test_helper' + +class ParserUnitTest < Minitest::Test + include Liquid + + def test_consume + p = Parser.new("wat: 7") + assert_equal 'wat', p.consume(:id) + assert_equal ':', p.consume(:colon) + assert_equal '7', p.consume(:number) + end + + def test_jump + p = Parser.new("wat: 7") + p.jump(2) + assert_equal '7', p.consume(:number) + end + + def test_consume? + p = Parser.new("wat: 7") + assert_equal 'wat', p.consume?(:id) + assert_equal false, p.consume?(:dot) + assert_equal ':', p.consume(:colon) + assert_equal '7', p.consume?(:number) + end + + def test_id? + p = Parser.new("wat 6 Peter Hegemon") + assert_equal 'wat', p.id?('wat') + assert_equal false, p.id?('endgame') + assert_equal '6', p.consume(:number) + assert_equal 'Peter', p.id?('Peter') + assert_equal false, p.id?('Achilles') + end + + def test_look + p = Parser.new("wat 6 Peter Hegemon") + assert_equal true, p.look(:id) + assert_equal 'wat', p.consume(:id) + assert_equal false, p.look(:comparison) + assert_equal true, p.look(:number) + assert_equal true, p.look(:id, 1) + assert_equal false, p.look(:number, 1) + end + + def test_expressions + p = Parser.new("hi.there hi?[5].there? hi.there.bob") + assert_equal 'hi.there', p.expression + assert_equal 'hi?[5].there?', p.expression + assert_equal 'hi.there.bob', p.expression + + p = Parser.new("567 6.0 'lol' \"wut\"") + assert_equal '567', p.expression + assert_equal '6.0', p.expression + assert_equal "'lol'", p.expression + assert_equal '"wut"', p.expression + end + + def test_ranges + p = Parser.new("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)") + assert_equal '(5..7)', p.expression + assert_equal '(1.5..9.6)', p.expression + assert_equal '(young..old)', p.expression + assert_equal '(hi[5].wat..old)', p.expression + end + + def test_arguments + p = Parser.new("filter: hi.there[5], keyarg: 7") + assert_equal 'filter', p.consume(:id) + assert_equal ':', p.consume(:colon) + assert_equal 'hi.there[5]', p.argument + assert_equal ',', p.consume(:comma) + assert_equal 'keyarg: 7', p.argument + end + + def test_invalid_expression + assert_raises(SyntaxError) do + p = Parser.new("==") + p.expression + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/regexp_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/regexp_unit_test.rb new file mode 100644 index 000000000000..0821229f3132 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/regexp_unit_test.rb @@ -0,0 +1,44 @@ +require 'test_helper' + +class RegexpUnitTest < Minitest::Test + include Liquid + + def test_empty + assert_equal [], ''.scan(QuotedFragment) + end + + def test_quote + assert_equal ['"arg 1"'], '"arg 1"'.scan(QuotedFragment) + end + + def test_words + assert_equal ['arg1', 'arg2'], 'arg1 arg2'.scan(QuotedFragment) + end + + def test_tags + assert_equal ['<tr>', '</tr>'], '<tr> </tr>'.scan(QuotedFragment) + assert_equal ['<tr></tr>'], '<tr></tr>'.scan(QuotedFragment) + assert_equal ['<style', 'class="hello">', '</style>'], %(<style class="hello">' </style>).scan(QuotedFragment) + end + + def test_double_quoted_words + assert_equal ['arg1', 'arg2', '"arg 3"'], 'arg1 arg2 "arg 3"'.scan(QuotedFragment) + end + + def test_single_quoted_words + assert_equal ['arg1', 'arg2', "'arg 3'"], 'arg1 arg2 \'arg 3\''.scan(QuotedFragment) + end + + def test_quoted_words_in_the_middle + assert_equal ['arg1', 'arg2', '"arg 3"', 'arg4'], 'arg1 arg2 "arg 3" arg4 '.scan(QuotedFragment) + end + + def test_variable_parser + assert_equal ['var'], 'var'.scan(VariableParser) + assert_equal ['var', 'method'], 'var.method'.scan(VariableParser) + assert_equal ['var', '[method]'], 'var[method]'.scan(VariableParser) + assert_equal ['var', '[method]', '[0]'], 'var[method][0]'.scan(VariableParser) + assert_equal ['var', '["method"]', '[0]'], 'var["method"][0]'.scan(VariableParser) + assert_equal ['var', '[method]', '[0]', 'method'], 'var[method][0].method'.scan(VariableParser) + end +end # RegexpTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/strainer_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/strainer_unit_test.rb new file mode 100644 index 000000000000..5ce2100415b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/strainer_unit_test.rb @@ -0,0 +1,164 @@ +require 'test_helper' + +class StrainerUnitTest < Minitest::Test + include Liquid + + module AccessScopeFilters + def public_filter + "public" + end + + def private_filter + "private" + end + private :private_filter + end + + Strainer.global_filter(AccessScopeFilters) + + def test_strainer + strainer = Strainer.create(nil) + assert_equal 5, strainer.invoke('size', 'input') + assert_equal "public", strainer.invoke("public_filter") + end + + def test_stainer_raises_argument_error + strainer = Strainer.create(nil) + assert_raises(Liquid::ArgumentError) do + strainer.invoke("public_filter", 1) + end + end + + def test_stainer_argument_error_contains_backtrace + strainer = Strainer.create(nil) + begin + strainer.invoke("public_filter", 1) + rescue Liquid::ArgumentError => e + assert_match( + /\ALiquid error: wrong number of arguments \((1 for 0|given 1, expected 0)\)\z/, + e.message) + assert_equal e.backtrace[0].split(':')[0], __FILE__ + end + end + + def test_strainer_only_invokes_public_filter_methods + strainer = Strainer.create(nil) + assert_equal false, strainer.class.invokable?('__test__') + assert_equal false, strainer.class.invokable?('test') + assert_equal false, strainer.class.invokable?('instance_eval') + assert_equal false, strainer.class.invokable?('__send__') + assert_equal true, strainer.class.invokable?('size') # from the standard lib + end + + def test_strainer_returns_nil_if_no_filter_method_found + strainer = Strainer.create(nil) + assert_nil strainer.invoke("private_filter") + assert_nil strainer.invoke("undef_the_filter") + end + + def test_strainer_returns_first_argument_if_no_method_and_arguments_given + strainer = Strainer.create(nil) + assert_equal "password", strainer.invoke("undef_the_method", "password") + end + + def test_strainer_only_allows_methods_defined_in_filters + strainer = Strainer.create(nil) + assert_equal "1 + 1", strainer.invoke("instance_eval", "1 + 1") + assert_equal "puts", strainer.invoke("__send__", "puts", "Hi Mom") + assert_equal "has_method?", strainer.invoke("invoke", "has_method?", "invoke") + end + + def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation + a = Module.new + b = Module.new + strainer = Strainer.create(nil, [a, b]) + assert_kind_of Strainer, strainer + assert_kind_of a, strainer + assert_kind_of b, strainer + assert_kind_of Liquid::StandardFilters, strainer + end + + def test_add_filter_when_wrong_filter_class + c = Context.new + s = c.strainer + wrong_filter = ->(v) { v.reverse } + + assert_raises ArgumentError do + s.class.add_filter(wrong_filter) + end + end + + module PrivateMethodOverrideFilter + private + + def public_filter + "overriden as private" + end + end + + def test_add_filter_raises_when_module_privately_overrides_registered_public_methods + strainer = Context.new.strainer + + error = assert_raises(Liquid::MethodOverrideError) do + strainer.class.add_filter(PrivateMethodOverrideFilter) + end + assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message + end + + module ProtectedMethodOverrideFilter + protected + + def public_filter + "overriden as protected" + end + end + + def test_add_filter_raises_when_module_overrides_registered_public_method_as_protected + strainer = Context.new.strainer + + error = assert_raises(Liquid::MethodOverrideError) do + strainer.class.add_filter(ProtectedMethodOverrideFilter) + end + assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message + end + + module PublicMethodOverrideFilter + def public_filter + "public" + end + end + + def test_add_filter_does_not_raise_when_module_overrides_previously_registered_method + strainer = Context.new.strainer + strainer.class.add_filter(PublicMethodOverrideFilter) + assert strainer.class.filter_methods.include?('public_filter') + end + + module LateAddedFilter + def late_added_filter(input) + "filtered" + end + end + + def test_global_filter_clears_cache + assert_equal 'input', Strainer.create(nil).invoke('late_added_filter', 'input') + Strainer.global_filter(LateAddedFilter) + assert_equal 'filtered', Strainer.create(nil).invoke('late_added_filter', 'input') + end + + def test_add_filter_does_not_include_already_included_module + mod = Module.new do + class << self + attr_accessor :include_count + def included(mod) + self.include_count += 1 + end + end + self.include_count = 0 + end + strainer = Context.new.strainer + strainer.class.add_filter(mod) + strainer.class.add_filter(mod) + assert_equal 1, mod.include_count + end +end # StrainerTest diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tag_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tag_unit_test.rb new file mode 100644 index 000000000000..c4b901b11f0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tag_unit_test.rb @@ -0,0 +1,21 @@ +require 'test_helper' + +class TagUnitTest < Minitest::Test + include Liquid + + def test_tag + tag = Tag.parse('tag', "", Tokenizer.new(""), ParseContext.new) + assert_equal 'liquid::tag', tag.name + assert_equal '', tag.render(Context.new) + end + + def test_return_raw_text_of_tag + tag = Tag.parse("long_tag", "param1, param2, param3", Tokenizer.new(""), ParseContext.new) + assert_equal("long_tag param1, param2, param3", tag.raw) + end + + def test_tag_name_should_return_name_of_the_tag + tag = Tag.parse("some_tag", "", Tokenizer.new(""), ParseContext.new) + assert_equal 'some_tag', tag.tag_name + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tags/case_tag_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tags/case_tag_unit_test.rb new file mode 100644 index 000000000000..711030817152 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tags/case_tag_unit_test.rb @@ -0,0 +1,10 @@ +require 'test_helper' + +class CaseTagUnitTest < Minitest::Test + include Liquid + + def test_case_nodelist + template = Liquid::Template.parse('{% case var %}{% when true %}WHEN{% else %}ELSE{% endcase %}') + assert_equal ['WHEN', 'ELSE'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tags/for_tag_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tags/for_tag_unit_test.rb new file mode 100644 index 000000000000..b8fc520698dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tags/for_tag_unit_test.rb @@ -0,0 +1,13 @@ +require 'test_helper' + +class ForTagUnitTest < Minitest::Test + def test_for_nodelist + template = Liquid::Template.parse('{% for item in items %}FOR{% endfor %}') + assert_equal ['FOR'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten + end + + def test_for_else_nodelist + template = Liquid::Template.parse('{% for item in items %}FOR{% else %}ELSE{% endfor %}') + assert_equal ['FOR', 'ELSE'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tags/if_tag_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tags/if_tag_unit_test.rb new file mode 100644 index 000000000000..7ecfc409c03d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tags/if_tag_unit_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class IfTagUnitTest < Minitest::Test + def test_if_nodelist + template = Liquid::Template.parse('{% if true %}IF{% else %}ELSE{% endif %}') + assert_equal ['IF', 'ELSE'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/template_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/template_unit_test.rb new file mode 100644 index 000000000000..6328be531c20 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/template_unit_test.rb @@ -0,0 +1,78 @@ +require 'test_helper' + +class TemplateUnitTest < Minitest::Test + include Liquid + + def test_sets_default_localization_in_document + t = Template.new + t.parse('{%comment%}{%endcomment%}') + assert_instance_of I18n, t.root.nodelist[0].options[:locale] + end + + def test_sets_default_localization_in_context_with_quick_initialization + t = Template.new + t.parse('{%comment%}{%endcomment%}', locale: I18n.new(fixture("en_locale.yml"))) + + locale = t.root.nodelist[0].options[:locale] + assert_instance_of I18n, locale + assert_equal fixture("en_locale.yml"), locale.path + end + + def test_with_cache_classes_tags_returns_the_same_class + original_cache_setting = Liquid.cache_classes + Liquid.cache_classes = true + + original_klass = Class.new + Object.send(:const_set, :CustomTag, original_klass) + Template.register_tag('custom', CustomTag) + + Object.send(:remove_const, :CustomTag) + + new_klass = Class.new + Object.send(:const_set, :CustomTag, new_klass) + + assert Template.tags['custom'].equal?(original_klass) + ensure + Object.send(:remove_const, :CustomTag) + Template.tags.delete('custom') + Liquid.cache_classes = original_cache_setting + end + + def test_without_cache_classes_tags_reloads_the_class + original_cache_setting = Liquid.cache_classes + Liquid.cache_classes = false + + original_klass = Class.new + Object.send(:const_set, :CustomTag, original_klass) + Template.register_tag('custom', CustomTag) + + Object.send(:remove_const, :CustomTag) + + new_klass = Class.new + Object.send(:const_set, :CustomTag, new_klass) + + assert Template.tags['custom'].equal?(new_klass) + ensure + Object.send(:remove_const, :CustomTag) + Template.tags.delete('custom') + Liquid.cache_classes = original_cache_setting + end + + class FakeTag; end + + def test_tags_delete + Template.register_tag('fake', FakeTag) + assert_equal FakeTag, Template.tags['fake'] + + Template.tags.delete('fake') + assert_nil Template.tags['fake'] + end + + def test_tags_can_be_looped_over + Template.register_tag('fake', FakeTag) + result = Template.tags.map { |name, klass| [name, klass] } + assert result.include?(["fake", "TemplateUnitTest::FakeTag"]) + ensure + Template.tags.delete('fake') + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tokenizer_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tokenizer_unit_test.rb new file mode 100644 index 000000000000..de84c1fb0133 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/tokenizer_unit_test.rb @@ -0,0 +1,55 @@ +require 'test_helper' + +class TokenizerTest < Minitest::Test + def test_tokenize_strings + assert_equal [' '], tokenize(' ') + assert_equal ['hello world'], tokenize('hello world') + end + + def test_tokenize_variables + assert_equal ['{{funk}}'], tokenize('{{funk}}') + assert_equal [' ', '{{funk}}', ' '], tokenize(' {{funk}} ') + assert_equal [' ', '{{funk}}', ' ', '{{so}}', ' ', '{{brother}}', ' '], tokenize(' {{funk}} {{so}} {{brother}} ') + assert_equal [' ', '{{ funk }}', ' '], tokenize(' {{ funk }} ') + end + + def test_tokenize_blocks + assert_equal ['{%comment%}'], tokenize('{%comment%}') + assert_equal [' ', '{%comment%}', ' '], tokenize(' {%comment%} ') + + assert_equal [' ', '{%comment%}', ' ', '{%endcomment%}', ' '], tokenize(' {%comment%} {%endcomment%} ') + assert_equal [' ', '{% comment %}', ' ', '{% endcomment %}', ' '], tokenize(" {% comment %} {% endcomment %} ") + end + + def test_calculate_line_numbers_per_token_with_profiling + assert_equal [1], tokenize_line_numbers("{{funk}}") + assert_equal [1, 1, 1], tokenize_line_numbers(" {{funk}} ") + assert_equal [1, 2, 2], tokenize_line_numbers("\n{{funk}}\n") + assert_equal [1, 1, 3], tokenize_line_numbers(" {{\n funk \n}} ") + end + + private + + def tokenize(source) + tokenizer = Liquid::Tokenizer.new(source) + tokens = [] + while t = tokenizer.shift + tokens << t + end + tokens + end + + def tokenize_line_numbers(source) + tokenizer = Liquid::Tokenizer.new(source, true) + line_numbers = [] + loop do + line_number = tokenizer.line_number + if tokenizer.shift + line_numbers << line_number + else + break + end + end + line_numbers + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/variable_unit_test.rb b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/variable_unit_test.rb new file mode 100644 index 000000000000..5a21ace8ca22 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/liquid-4.0.3/test/unit/variable_unit_test.rb @@ -0,0 +1,162 @@ +require 'test_helper' + +class VariableUnitTest < Minitest::Test + include Liquid + + def test_variable + var = create_variable('hello') + assert_equal VariableLookup.new('hello'), var.name + end + + def test_filters + var = create_variable('hello | textileze') + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['textileze', []]], var.filters + + var = create_variable('hello | textileze | paragraph') + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['textileze', []], ['paragraph', []]], var.filters + + var = create_variable(%( hello | strftime: '%Y')) + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['strftime', ['%Y']]], var.filters + + var = create_variable(%( 'typo' | link_to: 'Typo', true )) + assert_equal 'typo', var.name + assert_equal [['link_to', ['Typo', true]]], var.filters + + var = create_variable(%( 'typo' | link_to: 'Typo', false )) + assert_equal 'typo', var.name + assert_equal [['link_to', ['Typo', false]]], var.filters + + var = create_variable(%( 'foo' | repeat: 3 )) + assert_equal 'foo', var.name + assert_equal [['repeat', [3]]], var.filters + + var = create_variable(%( 'foo' | repeat: 3, 3 )) + assert_equal 'foo', var.name + assert_equal [['repeat', [3, 3]]], var.filters + + var = create_variable(%( 'foo' | repeat: 3, 3, 3 )) + assert_equal 'foo', var.name + assert_equal [['repeat', [3, 3, 3]]], var.filters + + var = create_variable(%( hello | strftime: '%Y, okay?')) + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['strftime', ['%Y, okay?']]], var.filters + + var = create_variable(%( hello | things: "%Y, okay?", 'the other one')) + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['things', ['%Y, okay?', 'the other one']]], var.filters + end + + def test_filter_with_date_parameter + var = create_variable(%( '2006-06-06' | date: "%m/%d/%Y")) + assert_equal '2006-06-06', var.name + assert_equal [['date', ['%m/%d/%Y']]], var.filters + end + + def test_filters_without_whitespace + var = create_variable('hello | textileze | paragraph') + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['textileze', []], ['paragraph', []]], var.filters + + var = create_variable('hello|textileze|paragraph') + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['textileze', []], ['paragraph', []]], var.filters + + var = create_variable("hello|replace:'foo','bar'|textileze") + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['replace', ['foo', 'bar']], ['textileze', []]], var.filters + end + + def test_symbol + var = create_variable("http://disney.com/logo.gif | image: 'med' ", error_mode: :lax) + assert_equal VariableLookup.new('http://disney.com/logo.gif'), var.name + assert_equal [['image', ['med']]], var.filters + end + + def test_string_to_filter + var = create_variable("'http://disney.com/logo.gif' | image: 'med' ") + assert_equal 'http://disney.com/logo.gif', var.name + assert_equal [['image', ['med']]], var.filters + end + + def test_string_single_quoted + var = create_variable(%( "hello" )) + assert_equal 'hello', var.name + end + + def test_string_double_quoted + var = create_variable(%( 'hello' )) + assert_equal 'hello', var.name + end + + def test_integer + var = create_variable(%( 1000 )) + assert_equal 1000, var.name + end + + def test_float + var = create_variable(%( 1000.01 )) + assert_equal 1000.01, var.name + end + + def test_dashes + assert_equal VariableLookup.new('foo-bar'), create_variable('foo-bar').name + assert_equal VariableLookup.new('foo-bar-2'), create_variable('foo-bar-2').name + + with_error_mode :strict do + assert_raises(Liquid::SyntaxError) { create_variable('foo - bar') } + assert_raises(Liquid::SyntaxError) { create_variable('-foo') } + assert_raises(Liquid::SyntaxError) { create_variable('2foo') } + end + end + + def test_string_with_special_chars + var = create_variable(%( 'hello! $!@.;"ddasd" ' )) + assert_equal 'hello! $!@.;"ddasd" ', var.name + end + + def test_string_dot + var = create_variable(%( test.test )) + assert_equal VariableLookup.new('test.test'), var.name + end + + def test_filter_with_keyword_arguments + var = create_variable(%( hello | things: greeting: "world", farewell: 'goodbye')) + assert_equal VariableLookup.new('hello'), var.name + assert_equal [['things', [], { 'greeting' => 'world', 'farewell' => 'goodbye' }]], var.filters + end + + def test_lax_filter_argument_parsing + var = create_variable(%( number_of_comments | pluralize: 'comment': 'comments' ), error_mode: :lax) + assert_equal VariableLookup.new('number_of_comments'), var.name + assert_equal [['pluralize', ['comment', 'comments']]], var.filters + end + + def test_strict_filter_argument_parsing + with_error_mode(:strict) do + assert_raises(SyntaxError) do + create_variable(%( number_of_comments | pluralize: 'comment': 'comments' )) + end + end + end + + def test_output_raw_source_of_variable + var = create_variable(%( name_of_variable | upcase )) + assert_equal " name_of_variable | upcase ", var.raw + end + + def test_variable_lookup_interface + lookup = VariableLookup.new('a.b.c') + assert_equal 'a', lookup.name + assert_equal ['b', 'c'], lookup.lookups + end + + private + + def create_variable(markup, options = {}) + Variable.new(markup, ParseContext.new(options)) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/CHANGELOG.md new file mode 100644 index 000000000000..232adbd8908a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/CHANGELOG.md @@ -0,0 +1 @@ +# Moved to [GitHub releases](https://github.com/guard/listen/releases) page. diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/CONTRIBUTING.md b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/CONTRIBUTING.md new file mode 100644 index 000000000000..7e5b197cf676 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/CONTRIBUTING.md @@ -0,0 +1,45 @@ +Contribute to Listen +=================== + +File an issue +------------- + +If you haven't already, first see [TROUBLESHOOTING](https://github.com/guard/listen/blob/master/README.md#Issues-and-Troubleshooting) for known issues, solutions and workarounds. + +You can report bugs and feature requests to [GitHub Issues](https://github.com/guard/listen/issues). + +**Please don't ask question in the issue tracker**, instead ask them in our +[Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net). + +Try to figure out where the issue belongs to: Is it an issue with Listen itself or with Guard? + + +**It's most likely that your bug gets resolved faster if you provide as much information as possible!** + +The MOST useful information is debugging output from Listen (`LISTEN_GEM_DEBUGGING=1`) - see [TROUBLESHOOTING](https://github.com/guard/listen/blob/master/README.md#Issues-and-Troubleshooting) for details. + + +Development +----------- + +* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames). +* Source hosted at [GitHub](https://github.com/guard/listen). + +Pull requests are very welcome! Please try to follow these simple rules if applicable: + +* Please create a topic branch for every separate change you make. +* Make sure your patches are well tested. All specs run with `rake spec` must pass. +* Update the [Yard](http://yardoc.org/) documentation. +* Update the [README](https://github.com/guard/listen/blob/master/README.md). +* Please **do not change** the version number. + +The title of your PR will automatically be included in the release notes for the next version of the gem. A maintainer can add one of the following GitHub labels to the PR to automatically categorize it when the release notes are generated: + +- ⚠️ Breaking +- ✨ Feature +- 🐛 Bug Fix +- 📚 Docs +- 🏠 Housekeeping + +For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on +`#guard` (irc.freenode.net). diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/LICENSE.txt new file mode 100644 index 000000000000..b5f71c8b7b64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2013 Thibaud Guillaume-Gentil + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/README.md b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/README.md new file mode 100644 index 000000000000..340b7c37a85e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/README.md @@ -0,0 +1,464 @@ +# Listen + +The `listen` gem listens to file modifications and notifies you about the changes. + +[![Development Status](https://github.com/guard/listen/workflows/Development/badge.svg)](https://github.com/guard/listen/actions?workflow=Development) +[![Gem Version](https://badge.fury.io/rb/listen.svg)](http://badge.fury.io/rb/listen) +[![Code Climate](https://codeclimate.com/github/guard/listen.svg)](https://codeclimate.com/github/guard/listen) +[![Coverage Status](https://coveralls.io/repos/guard/listen/badge.svg?branch=master)](https://coveralls.io/r/guard/listen) + +## Features + +* OS-optimized adapters on MRI for Mac OS X 10.6+, Linux, \*BSD and Windows, [more info](#listen-adapters) below. +* Detects file modification, addition and removal. +* You can watch multiple directories. +* Regexp-patterns for ignoring paths for more accuracy and speed +* Increased change detection accuracy on OS X HFS and VFAT volumes. +* Continuous Integration: tested on selected Ruby environments via [Github Workflows](https:///github.com/guard/listen/master/.github/workflows). + +## Issues / limitations + +* Limited support for symlinked directories ([#279](https://github.com/guard/listen/issues/279)): + * Symlinks are always followed ([#25](https://github.com/guard/listen/issues/25)). + * Symlinked directories pointing within a watched directory are not supported ([#273](https://github.com/guard/listen/pull/273). +* No directory/adapter-specific configuration options. +* Support for plugins planned for future. +* TCP functionality was removed in `listen` [3.0.0](https://github.com/guard/listen/releases/tag/v3.0.0) ([#319](https://github.com/guard/listen/issues/319), [#218](https://github.com/guard/listen/issues/218)). There are plans to extract this feature to separate gems ([#258](https://github.com/guard/listen/issues/258)), until this is finished, you can use by locking the `listen` gem to version `'~> 2.10'`. +* Some filesystems won't work without polling (VM/Vagrant Shared folders, NFS, Samba, sshfs, etc.). +* Specs suite on JRuby and Rubinius aren't reliable on Travis CI, but should work. +* Windows and \*BSD adapter aren't continuously and automatically tested. +* OSX adapter has some performance limitations ([#342](https://github.com/guard/listen/issues/342)). +* FreeBSD users need patched version of rb-kqueue (as of 2020/11). See #475 for the issue, mat813/rb-kqueue#12 for the patch, and Bug 250432 in bugzilla. +* Listeners do not notify across forked processes, if you wish for multiple processes to receive change notifications you must [listen inside of each process](https://github.com/guard/listen/issues/398#issuecomment-223957952). + +Pull requests or help is very welcome for these. + +## Install + +The simplest way to install `listen` is to use [Bundler](http://bundler.io). + +```ruby +gem 'listen' +``` + +## Complete Example +Here is a complete example of using the `listen` gem: +```ruby +require 'listen' + +listener = Listen.to('/srv/app') do |modified, added, removed| + puts(modified: modified, added: added, removed: removed) +end +listener.start +sleep +``` +Running the above in the background, you can see the callback block being called in response to each command: +``` +$ cd /srv/app +$ touch a.txt +{:modified=>[], :added=>["/srv/app/a.txt"], :removed=>[]} + +$ echo more >> a.txt +{:modified=>["/srv/app/a.txt"], :added=>[], :removed=>[]} + +$ mv a.txt b.txt +{:modified=>[], :added=>["/srv/app/b.txt"], :removed=>["/srv/app/a.txt"]} + +$ vi b.txt +# add a line to this new file and press ZZ to save and exit +{:modified=>["/srv/app/b.txt"], :added=>[], :removed=>[]} + +$ vi c.txt +# add a line and press ZZ to save and exit +{:modified=>[], :added=>["/srv/app/c.txt"], :removed=>[]} + +$ rm b.txt c.txt +{:modified=>[], :added=>[], :removed=>["/srv/app/b.txt", "/srv/app/c.txt"]} +``` + +## Usage + +Call `Listen.to` with one or more directories and the "changes" callback passed as a block. + +``` ruby +listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed| + puts "modified absolute path array: #{modified}" + puts "added absolute path array: #{added}" + puts "removed absolute path array: #{removed}" +end +listener.start # starts a listener thread--does not block + +# do whatever you want here...just don't exit the process :) + +sleep +``` +## Changes Callback + +Changes to the listened-to directories are reported by the listener thread in a callback. +The callback receives **three** array parameters: `modified`, `added` and `removed`, in that order. +Each of these three is always an array with 0 or more entries. +Each array entry is an absolute path. + +### Pause / unpause / stop + +Listeners can also be easily paused/unpaused: + +``` ruby +listener = Listen.to('dir/path/to/listen') { |modified, added, removed| puts 'handle changes here...' } + +listener.start +listener.paused? # => false +listener.processing? # => true + +listener.pause # stops processing changes (but keeps on collecting them) +listener.paused? # => true +listener.processing? # => false + +listener.unpause # resumes processing changes ("start" would do the same) +listener.stop # stop both listening to changes and processing them +``` + + Note: While paused, `listen` keeps on collecting changes in the background - to clear them, call `stop`. + + Note: You should keep track of all started listeners and `stop` them properly on finish. + +### Ignore / ignore! + +`Listen` ignores some directories and extensions by default (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer). +You can add ignoring patterns with the `ignore` option/method or overwrite default with `ignore!` option/method. + +``` ruby +listener = Listen.to('dir/path/to/listen', ignore: /\.txt/) { |modified, added, removed| # ... } +listener.start +listener.ignore! /\.pkg/ # overwrite all patterns and only ignore pkg extension. +listener.ignore /\.rb/ # ignore rb extension in addition of pkg. +sleep +``` + +Note: `:ignore` regexp patterns are evaluated against relative paths. + +Note: Ignoring paths does not improve performance, except when Polling ([#274](https://github.com/guard/listen/issues/274)). + +### Only + +`Listen` watches all files (less the ignored ones) by default. If you want to only listen to a specific type of file (i.e., just `.rb` extension), you should use the `only` option/method. + +``` ruby +listener = Listen.to('dir/path/to/listen', only: /\.rb$/) { |modified, added, removed| # ... } +listener.start +listener.only /_spec\.rb$/ # overwrite all existing only patterns. +sleep +``` + +Note: `:only` regexp patterns are evaluated only against relative **file** paths. + + +## Options + +All the following options can be set through the `Listen.to` after the directory path(s) params. + +```ruby +ignore: [%r{/foo/bar}, /\.pid$/, /\.coffee$/] # Ignore a list of paths + # default: See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer + +ignore!: %r{/foo/bar} # Same as ignore options, but overwrite default ignored paths. + +only: %r{.rb$} # Only listen to specific files + # default: none + +latency: 0.5 # Set the delay (**in seconds**) between checking for changes + # default: 0.25 sec (1.0 sec for polling) + +wait_for_delay: 4 # Set the delay (**in seconds**) between calls to the callback when changes exist + # default: 0.10 sec + +force_polling: true # Force the use of the polling adapter + # default: none + +relative: false # Whether changes should be relative to current dir or not + # default: false + +polling_fallback_message: 'custom message' # Set a custom polling fallback message (or disable it with false) + # default: "Listen will be polling for changes. Learn more at https://github.com/guard/listen#listen-adapters." +``` + +## Logging and Debugging + +`Listen` logs its activity to `Listen.logger`. +This is the primary method of debugging. + +### Custom Logger +You can call `Listen.logger =` to set a custom `listen` logger for the process. For example: +``` +Listen.logger = Rails.logger +``` + +### Default Logger +If no custom logger is set, a default `listen` logger which logs to to `STDERR` will be created and assigned to `Listen.logger`. + +The default logger defaults to the `error` logging level (severity). +You can override the logging level by setting the environment variable `LISTEN_GEM_DEBUGGING=<level>`. +For `<level>`, all standard `::Logger` levels are supported, with any mix of upper-/lower-case: +``` +export LISTEN_GEM_DEBUGGING=debug # or 2 [deprecated] +export LISTEN_GEM_DEBUGGING=info # or 1 or true or yes [deprecated] +export LISTEN_GEM_DEBUGGING=warn +export LISTEN_GEM_DEBUGGING=fatal +export LISTEN_GEM_DEBUGGING=error +``` +The default of `error` will be used if an unsupported value is set. + +Note: The alternate values `1`, `2`, `true` and `yes` shown above are deprecated and will be removed from `listen` v4.0. + +### Disabling Logging +If you want to disable `listen` logging, set +``` +Listen.logger = ::Logger.new('/dev/null') +``` +## Listen Adapters + +The `Listen` gem has a set of adapters to notify it when there are changes. + +There are 4 OS-specific adapters to support Darwin, Linux, \*BSD and Windows. +These adapters are fast as they use some system-calls to implement the notifying function. + +There is also a polling adapter - although it's much slower than other adapters, +it works on every platform/system and scenario (including network filesystems such as VM shared folders). + +The Darwin and Linux adapters are dependencies of the `listen` gem so they work out of the box. For other adapters a specific gem will have to be added to your Gemfile, please read below. + +The `listen` gem will choose the best adapter automatically, if present. If you +want to force the use of the polling adapter, use the `:force_polling` option +while initializing the listener. + +### On Windows + +If you are on Windows, it's recommended to use the [`wdm`](https://github.com/Maher4Ever/wdm) adapter instead of polling. + +Please add the following to your Gemfile: + +```ruby +gem 'wdm', '>= 0.1.0', platforms: [:mingw, :mswin, :x64_mingw, :jruby] +``` + +### On \*BSD + +If you are on \*BSD you can try to use the [`rb-kqueue`](https://github.com/mat813/rb-kqueue) adapter instead of polling. + +Please add the following to your Gemfile: + +```ruby +require 'rbconfig' +if RbConfig::CONFIG['target_os'] =~ /bsd|dragonfly/i + gem 'rb-kqueue', '>= 0.2' +end + +``` + +### Getting the [polling fallback message](#options)? + +If you see: +``` +Listen will be polling for changes. +``` + +This means the Listen gem can’t find an optimized adapter. Typically this is caused by: + +- You’re on Windows and WDM gem isn’t installed. +- You’re running the app without Bundler or RubyGems. +- Using Sass which includes an ancient (the “dinosaur” type of ancient) version of the Listen gem. + +Possible solutions: + +1. Suppress the message by using the :force_polling option. Or, you could just ignore the message since it’s harmless. +2. Windows users: Install the WDM gem. +3. Upgrade Ruby (use RubyInstaller for Windows or RVM/rbenv for Mac) and RubyGems. +3. Run your apps using Bundler. +4. Sass users: Install the latest version of Listen and try again. + +#### Simplified Bundler and Sass example +Create a Gemfile with these lines: +``` +source 'https://rubygems.org' +gem 'listen' +gem 'sass' +``` +Next, use Bundler to update gems: +``` +$ bundle update +$ bundle exec sass --watch # ... or whatever app is using Listen. +``` + +### Increasing the amount of inotify watchers + +If you are running Debian, RedHat, or another similar Linux distribution, run the following in a terminal: +``` +$ sudo sh -c "echo fs.inotify.max_user_watches=524288 >> /etc/sysctl.conf" +$ sudo sysctl -p +``` +If you are running ArchLinux, search the `/etc/sysctl.d/` directory for config files with the setting: +``` +$ grep -H -s "fs.inotify.max_user_watches" /etc/sysctl.d/* +/etc/sysctl.d/40-max_user_watches.conf:fs.inotify.max_user_watches=100000 +``` +Then change the setting in the file you found above to a higher value (see [here](https://www.archlinux.org/news/deprecation-of-etcsysctlconf/) for why): +``` +$ sudo sh -c "echo fs.inotify.max_user_watches=524288 > /etc/sysctl.d/40-max-user-watches.conf" +$ sudo sysctl --system +``` + +#### The technical details +Listen uses `inotify` by default on Linux to monitor directories for changes. +It's not uncommon to encounter a system limit on the number of files you can monitor. +For example, Ubuntu Lucid's (64bit) `inotify` limit is set to 8192. + +You can get your current inotify file watch limit by executing: +``` +$ cat /proc/sys/fs/inotify/max_user_watches +``` +When this limit is not enough to monitor all files inside a directory, the limit must be increased for Listen to work properly. + +You can set a new limit temporarily with: +``` +$ sudo sysctl fs.inotify.max_user_watches=524288 +$ sudo sysctl -p +``` +If you like to make your limit permanent, use: +``` +$ sudo sh -c "echo fs.inotify.max_user_watches=524288 >> /etc/sysctl.conf" +$ sudo sysctl -p +``` +You may also need to pay attention to the values of `max_queued_events` and `max_user_instances` if Listen keeps on complaining. + +#### More info +Man page for [inotify(7)](https://linux.die.net/man/7/inotify). +Blog post: [limit of inotify](https://blog.sorah.jp/2012/01/24/inotify-limitation). + +### Issues and Troubleshooting + +If the gem doesn't work as expected, start by setting `LISTEN_GEM_DEBUGGING=debug` or `LISTEN_GEM_DEBUGGING=info` as described above in [Logging and Debugging](#logging-and-debugging). + +*NOTE: without providing the output after setting the `LISTEN_GEM_DEBUGGING=debug` environment variable, it is usually impossible to guess why `listen` is not working as expected.* + +#### 3 steps before you start diagnosing problems +These 3 steps will: + +- help quickly troubleshoot obscure problems (trust me, most of them are obscure) +- help quickly identify the area of the problem (a full list is below) +- help you get familiar with listen's diagnostic mode (it really comes in handy, trust me) +- help you create relevant output before you submit an issue (so we can respond with answers instead of tons of questions) + +Step 1 - The most important option in Listen +For effective troubleshooting set the `LISTEN_GEM_DEBUGGING=info` variable before starting `listen`. + +Step 2 - Verify polling works +Polling has to work ... or something is really wrong (and we need to know that before anything else). + +(see force_polling option). + +After starting `listen`, you should see something like: +``` +INFO -- : Record.build(): 0.06773114204406738 seconds +``` +Step 3 - Trigger some changes directly without using editors or apps +Make changes e.g. touch foo or echo "a" >> foo (for troubleshooting, avoid using an editor which could generate too many misleading events). + +You should see something like: +``` +INFO -- : listen: raw changes: [[:added, "/home/me/foo"]] +INFO -- : listen: final changes: {:modified=>[], :added=>["/home/me/foo"], :removed=>[]} +``` +"raw changes" contains changes collected during the :wait_for_delay and :latency intervals, while "final changes" is what listen decided are relevant changes (for better editor support). + +## Performance + +If `listen` seems slow or unresponsive, make sure you're not using the Polling adapter (you should see a warning upon startup if you are). + +Also, if the directories you're watching contain many files, make sure you're: + +* not using Polling (ideally) +* using `:ignore` and `:only` options to avoid tracking directories you don't care about (important with Polling and on MacOS) +* running `listen` with the `:latency` and `:wait_for_delay` options not too small or too big (depends on needs) +* not watching directories with log files, database files or other frequently changing files +* not using a version of `listen` prior to 2.7.7 +* not getting silent crashes within `listen` (see `LISTEN_GEM_DEBUGGING=debug`) +* not running multiple instances of `listen` in the background +* using a file system with atime modification disabled (ideally) +* not using a filesystem with inaccurate file modification times (ideally), e.g. HFS, VFAT +* not buffering to a slow terminal (e.g. transparency + fancy font + slow gfx card + lots of output) +* ideally not running a slow encryption stack, e.g. btrfs + ecryptfs + +When in doubt, `LISTEN_GEM_DEBUGGING=debug` can help discover the actual events and time they happened. + +## Tips and Techniques +- Watch only directories you're interested in. +- Set your editor to save quickly (e.g. without backup files, without atomic-save) +- Tweak the `:latency` and `:wait_for_delay` options until you get good results (see [options](#options)). +- Add `:ignore` rules to silence all events you don't care about (reduces a lot of noise, especially if you use it on directories) + +## Development + +* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames). +* Source hosted at [GitHub](https://github.com/guard/listen). + +Pull requests are very welcome! Please try to follow these simple rules if applicable: + +* Please create a topic branch for every separate change you make. +* Make sure your patches are well tested. All specs must pass on [Travis CI](https://travis-ci.org/guard/listen). +* Update the [Yard](http://yardoc.org/) documentation. +* Update the [README](https://github.com/guard/listen/blob/master/README.md). +* Please **do not change** the version number. + +For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on +`#guard` (irc.freenode.net). + +## Releasing + +### Prerequisites + +* You must have commit rights to the GitHub repository. +* You must have push rights for rubygems.org. + +### How to release + +1. Run `bundle install` to make sure that you have all the gems necessary for testing and releasing. +2. **Ensure all tests are passing by running `bundle exec rake`.** +3. Determine which would be the correct next version number according to [semver](http://semver.org/). +4. Update the version in `./lib/listen/version.rb`. +5. Update the version in the Install section of `./README.md` (`gem 'listen', '~> X.Y'`). +6. Commit the version in a single commit, the message should be "Preparing vX.Y.Z" +7. Run `bundle exec rake release:full`; this will tag, push to GitHub, and publish to rubygems.org. +8. Update and publish the release notes on the [GitHub releases page](https://github.com/guard/listen/releases) if necessary + +## Acknowledgments + +* [Michael Kessler (netzpirat)][] for having written the [initial specs](https://github.com/guard/listen/commit/1e457b13b1bb8a25d2240428ce5ed488bafbed1f). +* [Travis Tilley (ttilley)][] for this awesome work on [fssm][] & [rb-fsevent][]. +* [Natalie Weizenbaum (nex3)][] for [rb-inotify][], a thorough inotify wrapper. +* [Mathieu Arnold (mat813)][] for [rb-kqueue][], a simple kqueue wrapper. +* [Maher Sallam][] for [wdm][], windows support wouldn't exist without him. +* [Yehuda Katz (wycats)][] for [vigilo][], that has been a great source of inspiration. + +## Author + +[Thibaud Guillaume-Gentil](https://github.com/thibaudgg) ([@thibaudgg](https://twitter.com/thibaudgg)) + +## Contributors + +[https://github.com/guard/listen/graphs/contributors](https://github.com/guard/listen/graphs/contributors) + +[Thibaud Guillaume-Gentil (thibaudgg)]: https://github.com/thibaudgg +[Maher Sallam]: https://github.com/Maher4Ever +[Michael Kessler (netzpirat)]: https://github.com/netzpirat +[Travis Tilley (ttilley)]: https://github.com/ttilley +[fssm]: https://github.com/ttilley/fssm +[rb-fsevent]: https://github.com/thibaudgg/rb-fsevent +[Mathieu Arnold (mat813)]: https://github.com/mat813 +[Natalie Weizenbaum (nex3)]: https://github.com/nex3 +[rb-inotify]: https://github.com/nex3/rb-inotify +[stereobooster]: https://github.com/stereobooster +[rb-fchange]: https://github.com/stereobooster/rb-fchange +[rb-kqueue]: https://github.com/mat813/rb-kqueue +[Yehuda Katz (wycats)]: https://github.com/wycats +[vigilo]: https://github.com/wycats/vigilo +[wdm]: https://github.com/Maher4Ever/wdm diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/bin/listen b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/bin/listen new file mode 100644 index 000000000000..59ade96dcf21 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/bin/listen @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'listen' +require 'listen/cli' + +if !defined?(JRUBY_VERSION) && Signal.list.keys.include?('INT') + Signal.trap('INT') { Thread.new { Listen.stop } } +end + +Listen::CLI.start diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen.rb new file mode 100644 index 000000000000..03857fe40c51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'logger' +require 'weakref' +require 'listen/logger' +require 'listen/listener' + +# Won't print anything by default because of level - unless you've set +# LISTEN_GEM_DEBUGGING or provided your own logger with a high enough level +Listen.logger.info "Listen loglevel set to: #{Listen.logger.level}" +Listen.logger.info "Listen version: #{Listen::VERSION}" + +module Listen + @listeners = Queue.new + + class << self + # Listens to file system modifications on a either single directory or + # multiple directories. + # + # @param (see Listen::Listener#new) + # + # @yield [modified, added, removed] the changed files + # @yieldparam [Array<String>] modified the list of modified files + # @yieldparam [Array<String>] added the list of added files + # @yieldparam [Array<String>] removed the list of removed files + # + # @return [Listen::Listener] the listener + # + def to(*args, &block) + Listener.new(*args, &block).tap do |listener| + @listeners.enq(WeakRef.new(listener)) + end + end + + # This is used by the `listen` binary to handle Ctrl-C + # + def stop + while (listener = @listeners.deq(true)) + begin + listener.stop + rescue WeakRef::RefError + end + end + rescue ThreadError + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter.rb new file mode 100644 index 000000000000..f3083810fa0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'listen/adapter/base' +require 'listen/adapter/bsd' +require 'listen/adapter/darwin' +require 'listen/adapter/linux' +require 'listen/adapter/polling' +require 'listen/adapter/windows' + +module Listen + module Adapter + OPTIMIZED_ADAPTERS = [Darwin, Linux, BSD, Windows].freeze + POLLING_FALLBACK_MESSAGE = 'Listen will be polling for changes.'\ + 'Learn more at https://github.com/guard/listen#listen-adapters.' + + class << self + def select(options = {}) + Listen.logger.debug 'Adapter: considering polling ...' + return Polling if options[:force_polling] + Listen.logger.debug 'Adapter: considering optimized backend...' + return _usable_adapter_class if _usable_adapter_class + Listen.logger.debug 'Adapter: falling back to polling...' + _warn_polling_fallback(options) + Polling + rescue + Listen.logger.warn format('Adapter: failed: %s:%s', $ERROR_POSITION.inspect, + $ERROR_POSITION * "\n") + raise + end + + private + + def _usable_adapter_class + OPTIMIZED_ADAPTERS.find(&:usable?) + end + + def _warn_polling_fallback(options) + msg = options.fetch(:polling_fallback_message, POLLING_FALLBACK_MESSAGE) + Kernel.warn "[Listen warning]:\n #{msg}" if msg + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/base.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/base.rb new file mode 100644 index 000000000000..3e1b19d02a5c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/base.rb @@ -0,0 +1,129 @@ +# frozen_string_literal: true + +require 'listen/options' +require 'listen/record' +require 'listen/change' +require 'listen/thread' + +module Listen + module Adapter + class Base + attr_reader :options, :config + + # TODO: only used by tests + DEFAULTS = {}.freeze + + def initialize(config) + @started = false + @config = config + + @configured = nil + + fail 'No directories to watch!' if config.directories.empty? + + defaults = self.class.const_get('DEFAULTS') + @options = Listen::Options.new(config.adapter_options, defaults) + rescue + _log_exception 'adapter config failed: %s:%s called from: %s', caller + raise + end + + # TODO: it's a separate method as a temporary workaround for tests + # rubocop:disable Metrics/MethodLength + def configure + if @configured + Listen.logger.warn('Adapter already configured!') + return + end + + @configured = true + + @callbacks ||= {} + config.directories.each do |dir| + callback = @callbacks[dir] || lambda do |event| + _process_event(dir, event) + end + @callbacks[dir] = callback + _configure(dir, &callback) + end + + @snapshots ||= {} + # TODO: separate config per directory (some day maybe) + change_config = Change::Config.new(config.queue, config.silencer) + config.directories.each do |dir| + record = Record.new(dir) + snapshot = Change.new(change_config, record) + @snapshots[dir] = snapshot + end + end + # rubocop:enable Metrics/MethodLength + + def started? + @started + end + + def start + configure + + if started? + Listen.logger.warn('Adapter already started!') + return + end + + @started = true + + @run_thread = Listen::Thread.new("run_thread") do + @snapshots.each_value do |snapshot| + _timed('Record.build()') { snapshot.record.build } + end + _run + end + end + + def stop + _stop + config.queue.close # this causes queue.pop to return `nil` to the front-end + end + + private + + def _stop + @run_thread&.kill + @run_thread = nil + end + + def _timed(title) + start = MonotonicTime.now + yield + diff = MonotonicTime.now - start + Listen.logger.info format('%s: %.05f seconds', title, diff) + rescue + Listen.logger.warn "#{title} crashed: #{$ERROR_INFO.inspect}" + raise + end + + # TODO: allow backend adapters to pass specific invalidation objects + # e.g. Darwin -> DirRescan, INotify -> MoveScan, etc. + def _queue_change(type, dir, rel_path, options) + @snapshots[dir].invalidate(type, rel_path, options) + end + + def _log_exception(msg, caller_stack) + formatted = format( + msg, + $ERROR_INFO, + $ERROR_POSITION * "\n", + caller_stack * "\n" + ) + + Listen.logger.error(formatted) + end + + class << self + def usable? + const_get('OS_REGEXP') =~ RbConfig::CONFIG['target_os'] + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/bsd.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/bsd.rb new file mode 100644 index 000000000000..04a6958ddb3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/bsd.rb @@ -0,0 +1,107 @@ +# frozen_string_literal: true + +# Listener implementation for BSD's `kqueue`. +# @see http://www.freebsd.org/cgi/man.cgi?query=kqueue +# @see https://github.com/mat813/rb-kqueue/blob/master/lib/rb-kqueue/queue.rb +# +module Listen + module Adapter + class BSD < Base + OS_REGEXP = /bsd|dragonfly/i.freeze + + DEFAULTS = { + events: [ + :delete, + :write, + :extend, + :attrib, + :rename + # :link, :revoke + ] + }.freeze + + BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '') + Please add the following to your Gemfile to avoid polling for changes: + require 'rbconfig' + if RbConfig::CONFIG['target_os'] =~ /#{OS_REGEXP}/ + gem 'rb-kqueue', '>= 0.2' + end + EOS + + def self.usable? + return false unless super + require 'rb-kqueue' + require 'find' + true + rescue LoadError + Kernel.warn BUNDLER_DECLARE_GEM + false + end + + private + + def _configure(directory, &callback) + @worker ||= KQueue::Queue.new + @callback = callback + # use Record to make a snapshot of dir, so we + # can detect new files + _find(directory.to_s) { |path| _watch_file(path, @worker) } + end + + def _run + @worker.run + end + + def _process_event(dir, event) + full_path = _event_path(event) + if full_path.directory? + # Force dir content tracking to kick in, or we won't have + # names of added files + _queue_change(:dir, dir, '.', recursive: true) + elsif full_path.exist? + path = full_path.relative_path_from(dir) + _queue_change(:file, dir, path.to_s, change: _change(event.flags)) + end + + # If it is a directory, and it has a write flag, it means a + # file has been added so find out which and deal with it. + # No need to check for removed files, kqueue will forget them + # when the vfs does. + _watch_for_new_file(event) if full_path.directory? + end + + def _change(event_flags) + { modified: [:attrib, :extend], + added: [:write], + removed: [:rename, :delete] }.each do |change, flags| + return change unless (flags & event_flags).empty? + end + nil + end + + def _event_path(event) + Pathname.new(event.watcher.path) + end + + def _watch_for_new_file(event) + queue = event.watcher.queue + _find(_event_path(event).to_s) do |file_path| + unless queue.watchers.find { |_, v| v.path == file_path.to_s } + _watch_file(file_path, queue) + end + end + end + + def _watch_file(path, queue) + queue.watch_file(path, *options.events, &@callback) + rescue Errno::ENOENT => e + Listen.logger.warn "kqueue: watch file failed: #{e.message}" + end + + # Quick rubocop workaround + def _find(*paths, &block) + Find.send(:find, *paths, &block) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/config.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/config.rb new file mode 100644 index 000000000000..e33b13efdf50 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/config.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require 'pathname' + +module Listen + module Adapter + class Config + attr_reader :directories, :silencer, :queue, :adapter_options + + def initialize(directories, queue, silencer, adapter_options) + # Default to current directory if no directories are supplied + directories = [Dir.pwd] if directories.to_a.empty? + + # TODO: fix (flatten, array, compact?) + @directories = directories.map do |directory| + Pathname.new(directory.to_s).realpath + end + + @silencer = silencer + @queue = queue + @adapter_options = adapter_options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/darwin.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/darwin.rb new file mode 100644 index 000000000000..6106a145d342 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/darwin.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +require 'listen/thread' + +module Listen + module Adapter + # Adapter implementation for Mac OS X `FSEvents`. + # + class Darwin < Base + OS_REGEXP = /darwin(?<major_version>(1|2)\d+)/i.freeze + + # The default delay between checking for changes. + DEFAULTS = { latency: 0.1 }.freeze + + INCOMPATIBLE_GEM_VERSION = <<-EOS.gsub(/^ {8}/, '') + rb-fsevent > 0.9.4 no longer supports OS X 10.6 through 10.8. + + Please add the following to your Gemfile to avoid polling for changes: + require 'rbconfig' + if RbConfig::CONFIG['target_os'] =~ /darwin(1[0-3])/i + gem 'rb-fsevent', '<= 0.9.4' + end + EOS + + def self.usable? + version = RbConfig::CONFIG['target_os'][OS_REGEXP, :major_version] + return false unless version + return true if version.to_i >= 13 # darwin13 is OS X 10.9 + + require 'rb-fsevent' + fsevent_version = Gem::Version.new(FSEvent::VERSION) + return true if fsevent_version <= Gem::Version.new('0.9.4') + Kernel.warn INCOMPATIBLE_GEM_VERSION + false + end + + private + + def _configure(dir, &callback) + @callbacks[dir] = callback + end + + def _run + require 'rb-fsevent' + worker = FSEvent.new + dirs_to_watch = @callbacks.keys.map(&:to_s) + Listen.logger.info { "fsevent: watching: #{dirs_to_watch.inspect}" } + worker.watch(dirs_to_watch, { latency: options.latency }, &method(:_process_changes)) + @worker_thread = Listen::Thread.new("worker_thread") { worker.run } + end + + def _process_changes(dirs) + dirs.each do |dir| + dir = Pathname.new(dir.sub(%r{/$}, '')) + + @callbacks.each do |watched_dir, callback| + if watched_dir.eql?(dir) || Listen::Directory.ascendant_of?(watched_dir, dir) + callback.call(dir) + end + end + end + end + + def _process_event(dir, path) + Listen.logger.debug { "fsevent: processing path: #{path.inspect}" } + # TODO: does this preserve symlinks? + rel_path = path.relative_path_from(dir).to_s + _queue_change(:dir, dir, rel_path, recursive: true) + end + + def _stop + @worker_thread&.kill + super + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/linux.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/linux.rb new file mode 100644 index 000000000000..af7324917e51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/linux.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true + +module Listen + module Adapter + # @see https://github.com/nex3/rb-inotify + class Linux < Base + OS_REGEXP = /linux/i.freeze + + DEFAULTS = { + events: [ + :recursive, + :attrib, + :create, + :modify, + :delete, + :move, + :close_write + ], + wait_for_delay: 0.1 + }.freeze + + private + + README_URL = 'https://github.com/guard/listen'\ + '/blob/master/README.md#increasing-the-amount-of-inotify-watchers' + + INOTIFY_LIMIT_MESSAGE = <<-EOS + FATAL: Listen error: unable to monitor directories for changes. + Visit #{README_URL} for info on how to fix this. + EOS + + def _configure(directory, &callback) + require 'rb-inotify' + @worker ||= ::INotify::Notifier.new + @worker.watch(directory.to_s, *options.events, &callback) + rescue Errno::ENOSPC + abort(INOTIFY_LIMIT_MESSAGE) + end + + def _run + @worker.run + end + + # rubocop:disable Metrics/MethodLength + def _process_event(dir, event) + # NOTE: avoid using event.absolute_name since new API + # will need to have a custom recursion implemented + # to properly match events to configured directories + path = Pathname.new(event.watcher.path) + event.name + rel_path = path.relative_path_from(dir).to_s + + Listen.logger.debug { "inotify: #{rel_path} (#{event.flags.inspect})" } + + if /1|true/ =~ ENV['LISTEN_GEM_SIMULATE_FSEVENT'] + if (event.flags & [:moved_to, :moved_from]) || _dir_event?(event) + rel_path = path.dirname.relative_path_from(dir).to_s + end + _queue_change(:dir, dir, rel_path, {}) + return + end + + return if _skip_event?(event) + + cookie_params = event.cookie.zero? ? {} : { cookie: event.cookie } + + # Note: don't pass options to force rescanning the directory, so we can + # detect moving/deleting a whole tree + if _dir_event?(event) + _queue_change(:dir, dir, rel_path, cookie_params) + return + end + + params = cookie_params.merge(change: _change(event.flags)) + + _queue_change(:file, dir, rel_path, params) + end + # rubocop:enable Metrics/MethodLength + + def _skip_event?(event) + # Event on root directory + return true if event.name == '' + # INotify reports changes to files inside directories as events + # on the directories themselves too. + # + # @see http://linux.die.net/man/7/inotify + _dir_event?(event) && (event.flags & [:close, :modify]).any? + end + + def _change(event_flags) + { modified: [:attrib, :close_write], + moved_to: [:moved_to], + moved_from: [:moved_from], + added: [:create], + removed: [:delete] }.each do |change, flags| + return change unless (flags & event_flags).empty? + end + nil + end + + def _dir_event?(event) + event.flags.include?(:isdir) + end + + def _stop + @worker&.close + + super + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/polling.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/polling.rb new file mode 100644 index 000000000000..9d281af6d1c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/polling.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module Listen + module Adapter + # Polling Adapter that works cross-platform and + # has no dependencies. This is the adapter that + # uses the most CPU processing power and has higher + # file IO than the other implementations. + # + class Polling < Base + OS_REGEXP = //.freeze # match every OS + + DEFAULTS = { latency: 1.0, wait_for_delay: 0.05 }.freeze + + private + + def _configure(_, &callback) + @polling_callbacks ||= [] + @polling_callbacks << callback + end + + def _run + loop do + start = MonotonicTime.now + @polling_callbacks.each do |callback| + callback.call(nil) + if (nap_time = options.latency - (MonotonicTime.now - start)) > 0 + # TODO: warn if nap_time is negative (polling too slow) + sleep(nap_time) + end + end + end + end + + def _process_event(dir, _) + _queue_change(:dir, dir, '.', recursive: true) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/windows.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/windows.rb new file mode 100644 index 000000000000..252cb798ecdd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/adapter/windows.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +module Listen + module Adapter + # Adapter implementation for Windows `wdm`. + # + class Windows < Base + OS_REGEXP = /mswin|mingw|cygwin/i.freeze + + BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '') + Please add the following to your Gemfile to avoid polling for changes: + gem 'wdm', '>= 0.1.0' if Gem.win_platform? + EOS + + def self.usable? + return false unless super + require 'wdm' + true + rescue LoadError + Listen.logger.debug format('wdm - load failed: %s:%s', $ERROR_INFO, + $ERROR_POSITION * "\n") + + Kernel.warn BUNDLER_DECLARE_GEM + false + end + + private + + def _configure(dir) + require 'wdm' + Listen.logger.debug 'wdm - starting...' + @worker ||= WDM::Monitor.new + @worker.watch_recursively(dir.to_s, :files) do |change| + yield([:file, change]) + end + + @worker.watch_recursively(dir.to_s, :directories) do |change| + yield([:dir, change]) + end + + @worker.watch_recursively(dir.to_s, :attributes, :last_write) do |change| + yield([:attr, change]) + end + end + + def _run + @worker.run! + end + + # rubocop:disable Metrics/MethodLength + def _process_event(dir, event) + Listen.logger.debug "wdm - callback: #{event.inspect}" + + type, change = event + + full_path = Pathname(change.path) + + rel_path = full_path.relative_path_from(dir).to_s + + options = { change: _change(change.type) } + + case type + when :file + _queue_change(:file, dir, rel_path, options) + when :attr + unless full_path.directory? + _queue_change(:file, dir, rel_path, options) + end + when :dir + case change.type + when :removed + # TODO: check if watched dir? + _queue_change(:dir, dir, Pathname(rel_path).dirname.to_s, {}) + when :added + _queue_change(:dir, dir, rel_path, {}) + # do nothing - changed directory means either: + # - removed subdirs (handled above) + # - added subdirs (handled above) + # - removed files (handled by _file_callback) + # - added files (handled by _file_callback) + # so what's left? + end + end + end + # rubocop:enable Metrics/MethodLength + + def _change(type) + { modified: [:modified, :attrib], # TODO: is attrib really passed? + added: [:added, :renamed_new_file], + removed: [:removed, :renamed_old_file] }.find do |change, types| + types.include?(type) and break change + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/backend.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/backend.rb new file mode 100644 index 000000000000..cab286c1a122 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/backend.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'listen/adapter' +require 'listen/adapter/base' +require 'listen/adapter/config' + +require 'forwardable' + +# This class just aggregates configuration object to avoid Listener specs +# from exploding with huge test setup blocks +module Listen + class Backend + extend Forwardable + + def initialize(directories, queue, silencer, config) + adapter_select_opts = config.adapter_select_options + + adapter_class = Adapter.select(adapter_select_opts) + + # Use default from adapter if possible + @min_delay_between_events = config.min_delay_between_events + @min_delay_between_events ||= adapter_class::DEFAULTS[:wait_for_delay] + @min_delay_between_events ||= 0.1 + + adapter_opts = config.adapter_instance_options(adapter_class) + + aconfig = Adapter::Config.new(directories, queue, silencer, adapter_opts) + @adapter = adapter_class.new(aconfig) + end + + delegate start: :adapter + delegate stop: :adapter + + attr_reader :min_delay_between_events + + private + + attr_reader :adapter + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/change.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/change.rb new file mode 100644 index 000000000000..c19b90012338 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/change.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require 'listen/file' +require 'listen/directory' + +module Listen + # TODO: rename to Snapshot + class Change + # TODO: test this class for coverage + class Config + def initialize(queue, silencer) + @queue = queue + @silencer = silencer + end + + def silenced?(path, type) + @silencer.silenced?(Pathname(path), type) + end + + def queue(*args) + @queue << args + end + end + + attr_reader :record + + def initialize(config, record) + @config = config + @record = record + end + + # Invalidate some part of the snapshot/record (dir, file, subtree, etc.) + # rubocop:disable Metrics/MethodLength + # rubocop:disable Metrics/CyclomaticComplexity + # rubocop:disable Metrics/PerceivedComplexity + def invalidate(type, rel_path, options) + watched_dir = Pathname.new(record.root) + + change = options[:change] + cookie = options[:cookie] + + if !cookie && @config.silenced?(rel_path, type) + Listen.logger.debug { "(silenced): #{rel_path.inspect}" } + return + end + + path = watched_dir + rel_path + + Listen.logger.debug do + log_details = options[:silence] && 'recording' || change || 'unknown' + "#{log_details}: #{type}:#{path} (#{options.inspect})" + end + + if change + options = cookie ? { cookie: cookie } : {} + @config.queue(type, change, watched_dir, rel_path, options) + elsif type == :dir + # NOTE: POSSIBLE RECURSION + # TODO: fix - use a queue instead + Directory.scan(self, rel_path, options) + elsif (change = File.change(record, rel_path)) && !options[:silence] + @config.queue(:file, change, watched_dir, rel_path) + end + end + # rubocop:enable Metrics/MethodLength + # rubocop:enable Metrics/CyclomaticComplexity + # rubocop:enable Metrics/PerceivedComplexity + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/cli.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/cli.rb new file mode 100644 index 000000000000..6fcfbe4656b1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/cli.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +require 'thor' +require 'listen' +require 'logger' + +module Listen + class CLI < Thor + default_task :start + + desc 'start', 'Starts Listen' + + class_option :verbose, + type: :boolean, + default: false, + aliases: '-v', + banner: 'Verbose' + + class_option :directory, + type: :array, + default: '.', + aliases: '-d', + banner: 'The directory to listen to' + + class_option :relative, + type: :boolean, + default: false, + aliases: '-r', + banner: 'Convert paths relative to current directory' + + def start + Listen::Forwarder.new(options).start + end + end + + class Forwarder + attr_reader :logger + + def initialize(options) + @options = options + @logger = ::Logger.new(STDOUT, level: ::Logger::INFO) + @logger.formatter = proc { |_, _, _, msg| "#{msg}\n" } + end + + def start + logger.info 'Starting listen...' + + directory = @options[:directory] + relative = @options[:relative] + callback = proc do |modified, added, removed| + if @options[:verbose] + logger.info "+ #{added}" unless added.empty? + logger.info "- #{removed}" unless removed.empty? + logger.info "> #{modified}" unless modified.empty? + end + end + + listener = Listen.to(directory, relative: relative, &callback) + + listener.start + + sleep 0.5 while listener.processing? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/directory.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/directory.rb new file mode 100644 index 000000000000..840c88636023 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/directory.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +require 'set' + +module Listen + # TODO: refactor (turn it into a normal object, cache the stat, etc) + class Directory + # rubocop:disable Metrics/MethodLength + def self.scan(snapshot, rel_path, options) + record = snapshot.record + dir = Pathname.new(record.root) + previous = record.dir_entries(rel_path) + + record.add_dir(rel_path) + + # TODO: use children(with_directory: false) + path = dir + rel_path + current = Set.new(_children(path)) + + Listen.logger.debug do + format('%s: %s(%s): %s -> %s', + (options[:silence] ? 'Recording' : 'Scanning'), + rel_path, options.inspect, previous.inspect, current.inspect) + end + + begin + current.each do |full_path| + type = ::File.lstat(full_path.to_s).directory? ? :dir : :file + item_rel_path = full_path.relative_path_from(dir).to_s + _change(snapshot, type, item_rel_path, options) + end + rescue Errno::ENOENT + # The directory changed meanwhile, so rescan it + current = Set.new(_children(path)) + retry + end + + # TODO: this is not tested properly + previous = previous.reject { |entry, _| current.include? path + entry } + + _async_changes(snapshot, Pathname.new(rel_path), previous, options) + rescue Errno::ENOENT, Errno::EHOSTDOWN + record.unset_path(rel_path) + _async_changes(snapshot, Pathname.new(rel_path), previous, options) + rescue Errno::ENOTDIR + # TODO: path not tested + record.unset_path(rel_path) + _async_changes(snapshot, path, previous, options) + _change(snapshot, :file, rel_path, options) + rescue + Listen.logger.warn { format('scan DIED: %s:%s', $ERROR_INFO, $ERROR_POSITION * "\n") } + raise + end + # rubocop:enable Metrics/MethodLength + + def self.ascendant_of?(base, other) + other.ascend do |ascendant| + break true if base == ascendant + end + end + + def self._async_changes(snapshot, path, previous, options) + fail "Not a Pathname: #{path.inspect}" unless path.respond_to?(:children) + previous.each do |entry, data| + # TODO: this is a hack with insufficient testing + type = data.key?(:mtime) ? :file : :dir + rel_path_s = (path + entry).to_s + _change(snapshot, type, rel_path_s, options) + end + end + + def self._change(snapshot, type, path, options) + return snapshot.invalidate(type, path, options) if type == :dir + + # Minor param cleanup for tests + # TODO: use a dedicated Event class + opts = options.dup + opts.delete(:recursive) + snapshot.invalidate(type, path, opts) + end + + def self._children(path) + return path.children unless RUBY_ENGINE == 'jruby' + + # JRuby inconsistency workaround, see: + # https://github.com/jruby/jruby/issues/3840 + exists = path.exist? + directory = path.directory? + exists && !directory and raise Errno::ENOTDIR, path.to_s + path.children + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/error.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/error.rb new file mode 100644 index 000000000000..e3c3a27c0b78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/error.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +# Besides programming error exceptions like ArgumentError, +# all public interface exceptions should be declared here and inherit from Listen::Error. +module Listen + class Error < RuntimeError + class NotStarted < Error; end + class SymlinkLoop < Error; end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/config.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/config.rb new file mode 100644 index 000000000000..c83ee37b8fcd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/config.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module Listen + module Event + class Config + attr_reader :listener, :event_queue, :min_delay_between_events + + def initialize( + listener, + event_queue, + queue_optimizer, + wait_for_delay, + &block + ) + + @listener = listener + @event_queue = event_queue + @queue_optimizer = queue_optimizer + @min_delay_between_events = wait_for_delay + @block = block + end + + def sleep(seconds) + Kernel.sleep(seconds) + end + + def call(*args) + @block&.call(*args) + end + + def callable? + @block + end + + def optimize_changes(changes) + @queue_optimizer.smoosh_changes(changes) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/loop.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/loop.rb new file mode 100644 index 000000000000..dd071f013438 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/loop.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +require 'thread' + +require 'timeout' +require 'listen/event/processor' +require 'listen/thread' +require 'listen/error' + +module Listen + module Event + class Loop + include Listen::FSM + + Error = ::Listen::Error + NotStarted = ::Listen::Error::NotStarted # for backward compatibility + + start_state :pre_start + state :pre_start + state :starting + state :started + state :stopped + + def initialize(config) + @config = config + @wait_thread = nil + @reasons = ::Queue.new + initialize_fsm + end + + def wakeup_on_event + if started? && @wait_thread&.alive? + _wakeup(:event) + end + end + + def started? + state == :started + end + + MAX_STARTUP_SECONDS = 5.0 + + # @raises Error::NotStarted if background thread hasn't started in MAX_STARTUP_SECONDS + def start + # TODO: use a Fiber instead? + return unless state == :pre_start + + transition! :starting + + @wait_thread = Listen::Thread.new("wait_thread") do + _process_changes + end + + Listen.logger.debug("Waiting for processing to start...") + + wait_for_state(:started, timeout: MAX_STARTUP_SECONDS) or + raise Error::NotStarted, "thread didn't start in #{MAX_STARTUP_SECONDS} seconds (in state: #{state.inspect})" + + Listen.logger.debug('Processing started.') + end + + def pause + # TODO: works? + # fail NotImplementedError + end + + def stop + transition! :stopped + + @wait_thread&.join + @wait_thread = nil + end + + def stopped? + state == :stopped + end + + private + + def _process_changes + processor = Event::Processor.new(@config, @reasons) + + transition! :started + + processor.loop_for(@config.min_delay_between_events) + end + + def _wakeup(reason) + @reasons << reason + @wait_thread.wakeup + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/processor.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/processor.rb new file mode 100644 index 000000000000..57656cbe30d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/processor.rb @@ -0,0 +1,126 @@ +# frozen_string_literal: true + +require 'listen/monotonic_time' + +module Listen + module Event + class Processor + def initialize(config, reasons) + @config = config + @listener = config.listener + @reasons = reasons + _reset_no_unprocessed_events + end + + # TODO: implement this properly instead of checking the state at arbitrary + # points in time + def loop_for(latency) + @latency = latency + + loop do + event = _wait_until_events + _check_stopped + _wait_until_events_calm_down + _wait_until_no_longer_paused + _process_changes(event) + end + rescue Stopped + Listen.logger.debug('Processing stopped') + end + + private + + class Stopped < RuntimeError + end + + def _wait_until_events_calm_down + loop do + now = MonotonicTime.now + + # Assure there's at least latency between callbacks to allow + # for accumulating changes + diff = _deadline - now + break if diff <= 0 + + # give events a bit of time to accumulate so they can be + # compressed/optimized + _sleep(diff) + end + end + + def _wait_until_no_longer_paused + @listener.wait_for_state(*(Listener.states.keys - [:paused])) + end + + def _check_stopped + if @listener.stopped? + _flush_wakeup_reasons + raise Stopped + end + end + + def _sleep(seconds) + _check_stopped + config.sleep(seconds) + _check_stopped + + _flush_wakeup_reasons do |reason| + if reason == :event && !@listener.paused? + _remember_time_of_first_unprocessed_event + end + end + end + + def _remember_time_of_first_unprocessed_event + @_remember_time_of_first_unprocessed_event ||= MonotonicTime.now + end + + def _reset_no_unprocessed_events + @_remember_time_of_first_unprocessed_event = nil + end + + def _deadline + @_remember_time_of_first_unprocessed_event + @latency + end + + # blocks until event is popped + # returns the event or `nil` when the event_queue is closed + def _wait_until_events + config.event_queue.pop.tap do |_event| + @_remember_time_of_first_unprocessed_event ||= MonotonicTime.now + end + end + + def _flush_wakeup_reasons + until @reasons.empty? + reason = @reasons.pop + yield reason if block_given? + end + end + + # for easier testing without sleep loop + def _process_changes(event) + _reset_no_unprocessed_events + + changes = [event] + changes << config.event_queue.pop until config.event_queue.empty? + + return unless config.callable? + + hash = config.optimize_changes(changes) + result = [hash[:modified], hash[:added], hash[:removed]] + return if result.all?(&:empty?) + + block_start = MonotonicTime.now + exception_note = " (exception)" + ::Listen::Thread.rescue_and_log('_process_changes') do + config.call(*result) + exception_note = nil + end + Listen.logger.debug "Callback#{exception_note} took #{MonotonicTime.now - block_start} sec" + end + + attr_reader :config + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/queue.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/queue.rb new file mode 100644 index 000000000000..ffcd67c587ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/event/queue.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require 'thread' + +require 'forwardable' + +module Listen + module Event + class Queue + extend Forwardable + + class Config + def initialize(relative) + @relative = relative + end + + def relative? + @relative + end + end + + def initialize(config) + @event_queue = ::Queue.new + @config = config + end + + def <<(args) + type, change, dir, path, options = *args + fail "Invalid type: #{type.inspect}" unless [:dir, :file].include? type + fail "Invalid change: #{change.inspect}" unless change.is_a?(Symbol) + fail "Invalid path: #{path.inspect}" unless path.is_a?(String) + + dir = if @config.relative? + _safe_relative_from_cwd(dir) + else + dir + end + @event_queue << [type, change, dir, path, options] + end + + delegate empty?: :@event_queue + delegate pop: :@event_queue + delegate close: :@event_queue + + private + + def _safe_relative_from_cwd(dir) + dir.relative_path_from(Pathname.pwd) + rescue ArgumentError + dir + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/file.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/file.rb new file mode 100644 index 000000000000..3f4a700c4d21 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/file.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +require 'digest/md5' + +module Listen + class File + # rubocop:disable Metrics/MethodLength + # rubocop:disable Metrics/CyclomaticComplexity + # rubocop:disable Metrics/PerceivedComplexity + def self.change(record, rel_path) + path = Pathname.new(record.root) + rel_path + lstat = path.lstat + + data = { mtime: lstat.mtime.to_f, mode: lstat.mode, size: lstat.size } + + record_data = record.file_data(rel_path) + + if record_data.empty? + record.update_file(rel_path, data) + return :added + end + + if data[:mode] != record_data[:mode] + record.update_file(rel_path, data) + return :modified + end + + if data[:mtime] != record_data[:mtime] + record.update_file(rel_path, data) + return :modified + end + + if data[:size] != record_data[:size] + record.update_file(rel_path, data) + return :modified + end + + return if /1|true/ =~ ENV['LISTEN_GEM_DISABLE_HASHING'] + return unless inaccurate_mac_time?(lstat) + + # Check if change happened within 1 second (maybe it's even + # too much, e.g. 0.3-0.5 could be sufficient). + # + # With rb-fsevent, there's a (configurable) latency between + # when file was changed and when the event was triggered. + # + # If a file is saved at ???14.998, by the time the event is + # actually received by Listen, the time could already be e.g. + # ???15.7. + # + # And since Darwin adapter uses directory scanning, the file + # mtime may be the same (e.g. file was changed at ???14.001, + # then at ???14.998, but the fstat time would be ???14.0 in + # both cases). + # + # If change happend at ???14.999997, the mtime is 14.0, so for + # an mtime=???14.0 we assume it could even be almost ???15.0 + # + # So if Time.now.to_f is ???15.999998 and stat reports mtime + # at ???14.0, then event was due to that file'd change when: + # + # ???15.999997 - ???14.999998 < 1.0s + # + # So the "2" is "1 + 1" (1s to cover rb-fsevent latency + + # 1s maximum difference between real mtime and that recorded + # in the file system) + # + return if data[:mtime].to_i + 2 <= Time.now.to_f + + md5 = Digest::MD5.file(path).digest + record.update_file(rel_path, data.merge(md5: md5)) + :modified if record_data[:md5] && md5 != record_data[:md5] + rescue SystemCallError + record.unset_path(rel_path) + :removed + rescue + Listen.logger.debug "lstat failed for: #{rel_path} (#{$ERROR_INFO})" + raise + end + # rubocop:enable Metrics/MethodLength + # rubocop:enable Metrics/CyclomaticComplexity + # rubocop:enable Metrics/PerceivedComplexity + + def self.inaccurate_mac_time?(stat) + # 'mac' means Modified/Accessed/Created + + # Since precision depends on mounted FS (e.g. you can have a FAT partiion + # mounted on Linux), check for fields with a remainder to detect this + + [stat.mtime, stat.ctime, stat.atime].map(&:usec).all?(&:zero?) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/fsm.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/fsm.rb new file mode 100644 index 000000000000..154ad2b3ba62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/fsm.rb @@ -0,0 +1,133 @@ +# frozen_string_literal: true + +# Code copied from https://github.com/celluloid/celluloid-fsm + +require 'thread' + +module Listen + module FSM + # Included hook to extend class methods + def self.included(klass) + klass.send :extend, ClassMethods + end + + module ClassMethods + # Obtain or set the start state + # Passing a state name sets the start state + def start_state(new_start_state = nil) + if new_start_state + new_start_state.is_a?(Symbol) or raise ArgumentError, "state name must be a Symbol (got #{new_start_state.inspect})" + @start_state = new_start_state + else + defined?(@start_state) or raise ArgumentError, "`start_state :<state>` must be declared before `new`" + @start_state + end + end + + # The valid states for this FSM, as a hash with state name symbols as keys and State objects as values. + def states + @states ||= {} + end + + # Declare an FSM state and optionally provide a callback block to fire on state entry + # Options: + # * to: a state or array of states this state can transition to + def state(state_name, to: nil, &block) + state_name.is_a?(Symbol) or raise ArgumentError, "state name must be a Symbol (got #{state_name.inspect})" + states[state_name] = State.new(state_name, to, &block) + end + end + + # Note: including classes must call initialize_fsm from their initialize method. + def initialize_fsm + @fsm_initialized = true + @state = self.class.start_state + @mutex = ::Mutex.new + @state_changed = ::ConditionVariable.new + end + + # Current state of the FSM, stored as a symbol + attr_reader :state + + # checks for one of the given states to wait for + # if not already, waits for a state change (up to timeout seconds--`nil` means infinite) + # returns truthy iff the transition to one of the desired state has occurred + def wait_for_state(*wait_for_states, timeout: nil) + wait_for_states.each do |state| + state.is_a?(Symbol) or raise ArgumentError, "states must be symbols (got #{state.inspect})" + end + @mutex.synchronize do + if !wait_for_states.include?(@state) + @state_changed.wait(@mutex, timeout) + end + wait_for_states.include?(@state) + end + end + + private + + def transition(new_state_name) + new_state_name.is_a?(Symbol) or raise ArgumentError, "state name must be a Symbol (got #{new_state_name.inspect})" + if (new_state = validate_and_sanitize_new_state(new_state_name)) + transition_with_callbacks!(new_state) + end + end + + # Low-level, immediate state transition with no checks or callbacks. + def transition!(new_state_name) + new_state_name.is_a?(Symbol) or raise ArgumentError, "state name must be a Symbol (got #{new_state_name.inspect})" + @fsm_initialized or raise ArgumentError, "FSM not initialized. You must call initialize_fsm from initialize!" + @mutex.synchronize do + yield if block_given? + @state = new_state_name + @state_changed.broadcast + end + end + + def validate_and_sanitize_new_state(new_state_name) + return nil if @state == new_state_name + + if current_state && !current_state.valid_transition?(new_state_name) + valid = current_state.transitions.map(&:to_s).join(', ') + msg = "#{self.class} can't change state from '#{@state}' to '#{new_state_name}', only to: #{valid}" + raise ArgumentError, msg + end + + unless (new_state = self.class.states[new_state_name]) + new_state_name == self.class.start_state or raise ArgumentError, "invalid state for #{self.class}: #{new_state_name}" + end + + new_state + end + + def transition_with_callbacks!(new_state) + transition! new_state.name + new_state.call(self) + end + + def current_state + self.class.states[@state] + end + + class State + attr_reader :name, :transitions + + def initialize(name, transitions, &block) + @name = name + @block = block + @transitions = if transitions + Array(transitions).map(&:to_sym) + end + end + + def call(obj) + obj.instance_eval(&@block) if @block + end + + def valid_transition?(new_state) + # All transitions are allowed if none are expressly declared + !@transitions || @transitions.include?(new_state.to_sym) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/listener.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/listener.rb new file mode 100644 index 000000000000..d886fdb41ac9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/listener.rb @@ -0,0 +1,136 @@ +# frozen_string_literal: true + +require 'English' + +require 'listen/version' + +require 'listen/backend' + +require 'listen/silencer' +require 'listen/silencer/controller' + +require 'listen/queue_optimizer' + +require 'listen/fsm' + +require 'listen/event/loop' +require 'listen/event/queue' +require 'listen/event/config' + +require 'listen/listener/config' + +module Listen + class Listener + include Listen::FSM + + # Initializes the directories listener. + # + # @param [String] directory the directories to listen to + # @param [Hash] options the listen options (see Listen::Listener::Options) + # + # @yield [modified, added, removed] the changed files + # @yieldparam [Array<String>] modified the list of modified files + # @yieldparam [Array<String>] added the list of added files + # @yieldparam [Array<String>] removed the list of removed files + # + # rubocop:disable Metrics/MethodLength + def initialize(*dirs, &block) + options = dirs.last.is_a?(Hash) ? dirs.pop : {} + + @config = Config.new(options) + + eq_config = Event::Queue::Config.new(@config.relative?) + queue = Event::Queue.new(eq_config) + + silencer = Silencer.new + rules = @config.silencer_rules + @silencer_controller = Silencer::Controller.new(silencer, rules) + + @backend = Backend.new(dirs, queue, silencer, @config) + + optimizer_config = QueueOptimizer::Config.new(@backend, silencer) + + pconfig = Event::Config.new( + self, + queue, + QueueOptimizer.new(optimizer_config), + @backend.min_delay_between_events, + &block) + + @processor = Event::Loop.new(pconfig) + + initialize_fsm + end + # rubocop:enable Metrics/MethodLength + + start_state :initializing + + state :initializing, to: [:backend_started, :stopped] + + state :backend_started, to: [:processing_events, :stopped] do + @backend.start + end + + state :processing_events, to: [:paused, :stopped] do + @processor.start + end + + state :paused, to: [:processing_events, :stopped] do + @processor.pause + end + + state :stopped, to: [:backend_started] do + @backend.stop # halt events ASAP + @processor.stop + end + + # Starts processing events and starts adapters + # or resumes invoking callbacks if paused + def start + case state + when :initializing + transition :backend_started + transition :processing_events + when :paused + transition :processing_events + else + raise ArgumentError, "cannot start from state #{state.inspect}" + end + end + + # Stops both listening for events and processing them + def stop + transition :stopped + end + + # Stops invoking callbacks (messages pile up) + def pause + transition :paused + end + + # processing means callbacks are called + def processing? + state == :processing_events + end + + def paused? + state == :paused + end + + def stopped? + state == :stopped + end + + def ignore(regexps) + @silencer_controller.append_ignores(regexps) + end + + def ignore!(regexps) + @silencer_controller.replace_with_bang_ignores(regexps) + end + + def only(regexps) + @silencer_controller.replace_with_only(regexps) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/listener/config.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/listener/config.rb new file mode 100644 index 000000000000..56e4b7c90821 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/listener/config.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module Listen + class Listener + class Config + DEFAULTS = { + # Listener options + debug: false, # TODO: is this broken? + wait_for_delay: nil, # NOTE: should be provided by adapter if possible + relative: false, + + # Backend selecting options + force_polling: false, + polling_fallback_message: nil + }.freeze + + def initialize(opts) + @options = DEFAULTS.merge(opts) + @relative = @options[:relative] + @min_delay_between_events = @options[:wait_for_delay] + @silencer_rules = @options # silencer will extract what it needs + end + + def relative? + @relative + end + + attr_reader :min_delay_between_events, :silencer_rules + + def adapter_instance_options(klass) + valid_keys = klass.const_get('DEFAULTS').keys + Hash[@options.select { |key, _| valid_keys.include?(key) }] + end + + def adapter_select_options + valid_keys = %w[force_polling polling_fallback_message].map(&:to_sym) + Hash[@options.select { |key, _| valid_keys.include?(key) }] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/logger.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/logger.rb new file mode 100644 index 000000000000..e839c02d8b45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/logger.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Listen + @logger = nil + + # Listen.logger will always be present. + # If you don't want logging, set Listen.logger = ::Logger.new('/dev/null', level: ::Logger::UNKNOWN) + + class << self + attr_writer :logger + + def logger + @logger ||= default_logger + end + + private + + def default_logger + level = + case ENV['LISTEN_GEM_DEBUGGING'].to_s + when /debug|2/i + ::Logger::DEBUG + when /info|true|yes|1/i + ::Logger::INFO + when /warn/i + ::Logger::WARN + when /fatal/i + ::Logger::FATAL + else + ::Logger::ERROR + end + + ::Logger.new(STDERR, level: level) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/monotonic_time.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/monotonic_time.rb new file mode 100644 index 000000000000..51b0fc9d75f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/monotonic_time.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module Listen + module MonotonicTime + class << self + if defined?(Process::CLOCK_MONOTONIC) + + def now + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + + elsif defined?(Process::CLOCK_MONOTONIC_RAW) + + def now + Process.clock_gettime(Process::CLOCK_MONOTONIC_RAW) + end + + else + + def now + Time.now.to_f + end + + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/options.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/options.rb new file mode 100644 index 000000000000..0f1abb1ac970 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/options.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module Listen + class Options + def initialize(opts, defaults) + @options = {} + given_options = opts.dup + defaults.each_key do |key| + @options[key] = given_options.delete(key) || defaults[key] + end + + given_options.empty? or raise ArgumentError, "Unknown options: #{given_options.inspect}" + end + + # rubocop:disable Lint/MissingSuper + def respond_to_missing?(name, *_) + @options.has_key?(name) + end + + def method_missing(name, *_) + respond_to_missing?(name) or raise NameError, "Bad option: #{name.inspect} (valid:#{@options.keys.inspect})" + @options[name] + end + # rubocop:enable Lint/MissingSuper + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/queue_optimizer.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/queue_optimizer.rb new file mode 100644 index 000000000000..2ccf4cd466f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/queue_optimizer.rb @@ -0,0 +1,129 @@ +# frozen_string_literal: true + +module Listen + class QueueOptimizer + class Config + def initialize(adapter_class, silencer) + @adapter_class = adapter_class + @silencer = silencer + end + + def exist?(path) + Pathname(path).exist? + end + + def silenced?(path, type) + @silencer.silenced?(path, type) + end + + def debug(*args, &block) + Listen.logger.debug(*args, &block) + end + end + + def smoosh_changes(changes) + # TODO: adapter could be nil at this point (shutdown) + cookies = changes.group_by do |_, _, _, _, options| + (options || {})[:cookie] + end + _squash_changes(_reinterpret_related_changes(cookies)) + end + + def initialize(config) + @config = config + end + + private + + attr_reader :config + + # groups changes into the expected structure expected by + # clients + def _squash_changes(changes) + # We combine here for backward compatibility + # Newer clients should receive dir and path separately + changes = changes.map { |change, dir, path| [change, dir + path] } + + actions = changes.group_by(&:last).map do |path, action_list| + [_logical_action_for(path, action_list.map(&:first)), path.to_s] + end + + config.debug("listen: raw changes: #{actions.inspect}") + + { modified: [], added: [], removed: [] }.tap do |squashed| + actions.each do |type, path| + squashed[type] << path unless type.nil? + end + config.debug("listen: final changes: #{squashed.inspect}") + end + end + + def _logical_action_for(path, actions) + actions << :added if actions.delete(:moved_to) + actions << :removed if actions.delete(:moved_from) + + modified = actions.find { |x| x == :modified } + _calculate_add_remove_difference(actions, path, modified) + end + + def _calculate_add_remove_difference(actions, path, default_if_exists) + added = actions.count { |x| x == :added } + removed = actions.count { |x| x == :removed } + diff = added - removed + + # TODO: avoid checking if path exists and instead assume the events are + # in order (if last is :removed, it doesn't exist, etc.) + if config.exist?(path) + if diff > 0 + :added + elsif diff.zero? && added > 0 + :modified + else + default_if_exists + end + else + diff < 0 ? :removed : nil + end + end + + # remove extraneous rb-inotify events, keeping them only if it's a possible + # editor rename() call (e.g. Kate and Sublime) + def _reinterpret_related_changes(cookies) + table = { moved_to: :added, moved_from: :removed } + cookies.flat_map do |_, changes| + if (editor_modified = editor_modified?(changes)) + [[:modified, *editor_modified]] + else + not_silenced = changes.reject do |type, _, _, path, _| + config.silenced?(Pathname(path), type) + end + not_silenced.map do |_, change, dir, path, _| + [table.fetch(change, change), dir, path] + end + end + end + end + + def editor_modified?(changes) + return unless changes.size == 2 + + from_type = from = nil + to_type = to_dir = to = nil + + changes.each do |data| + case data[1] + when :moved_from + from_type, _from_change, _, from, = data + when :moved_to + to_type, _to_change, to_dir, to, = data + end + end + + # Expect an ignored moved_from and non-ignored moved_to + # to qualify as an "editor modify" + if from && to && config.silenced?(Pathname(from), from_type) && !config.silenced?(Pathname(to), to_type) + [to_dir, to] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/record.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/record.rb new file mode 100644 index 000000000000..4f8fedf0eec3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/record.rb @@ -0,0 +1,117 @@ +# frozen_string_literal: true + +require 'thread' +require 'listen/record/entry' +require 'listen/record/symlink_detector' + +module Listen + class Record + # TODO: one Record object per watched directory? + # TODO: deprecate + + attr_reader :root + + def initialize(directory) + @tree = _auto_hash + @root = directory.to_s + end + + def add_dir(rel_path) + if ![nil, '', '.'].include?(rel_path) + @tree[rel_path] ||= {} + end + end + + def update_file(rel_path, data) + dirname, basename = Pathname(rel_path).split.map(&:to_s) + _fast_update_file(dirname, basename, data) + end + + def unset_path(rel_path) + dirname, basename = Pathname(rel_path).split.map(&:to_s) + _fast_unset_path(dirname, basename) + end + + def file_data(rel_path) + dirname, basename = Pathname(rel_path).split.map(&:to_s) + if [nil, '', '.'].include? dirname + @tree[basename] ||= {} + @tree[basename].dup + else + @tree[dirname] ||= {} + @tree[dirname][basename] ||= {} + @tree[dirname][basename].dup + end + end + + def dir_entries(rel_path) + subtree = if ['', '.'].include? rel_path.to_s + @tree + else + @tree[rel_path.to_s] ||= _auto_hash + @tree[rel_path.to_s] + end + + subtree.transform_values do |values| + # only get data for file entries + values.key?(:mtime) ? values : {} + end + end + + def build + @tree = _auto_hash + # TODO: test with a file name given + # TODO: test other permissions + # TODO: test with mixed encoding + symlink_detector = SymlinkDetector.new + remaining = ::Queue.new + remaining << Entry.new(root, nil, nil) + _fast_build_dir(remaining, symlink_detector) until remaining.empty? + end + + private + + def _auto_hash + Hash.new { |h, k| h[k] = {} } + end + + def _fast_update_file(dirname, basename, data) + if [nil, '', '.'].include?(dirname) + @tree[basename] = (@tree[basename] || {}).merge(data) + else + @tree[dirname] ||= {} + @tree[dirname][basename] = (@tree[dirname][basename] || {}).merge(data) + end + end + + def _fast_unset_path(dirname, basename) + # this may need to be reworked to properly remove + # entries from a tree, without adding non-existing dirs to the record + if [nil, '', '.'].include?(dirname) + if @tree.key?(basename) + @tree.delete(basename) + end + elsif @tree.key?(dirname) + @tree[dirname].delete(basename) + end + end + + def _fast_build_dir(remaining, symlink_detector) + entry = remaining.pop + children = entry.children # NOTE: children() implicitly tests if dir + symlink_detector.verify_unwatched!(entry) + children.each { |child| remaining << child } + add_dir(entry.record_dir_key) + rescue Errno::ENOTDIR + _fast_try_file(entry) + rescue SystemCallError, SymlinkDetector::Error + _fast_unset_path(entry.relative, entry.name) + end + + def _fast_try_file(entry) + _fast_update_file(entry.relative, entry.name, entry.meta) + rescue SystemCallError + _fast_unset_path(entry.relative, entry.name) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/record/entry.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/record/entry.rb new file mode 100644 index 000000000000..a01a159260cf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/record/entry.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +module Listen + # @private api + class Record + # Represents a directory entry (dir or file) + class Entry + # file: "/home/me/watched_dir", "app/models", "foo.rb" + # dir, "/home/me/watched_dir", "." + def initialize(root, relative, name = nil) + @root = root + @relative = relative + @name = name + end + + attr_reader :root, :relative, :name + + def children + child_relative = _join + (_entries(sys_path) - %w[. ..]).map do |name| + Entry.new(@root, child_relative, name) + end + end + + def meta + lstat = ::File.lstat(sys_path) + { mtime: lstat.mtime.to_f, mode: lstat.mode, size: lstat.size } + end + + # record hash is e.g. + # if @record["/home/me/watched_dir"]["project/app/models"]["foo.rb"] + # if @record["/home/me/watched_dir"]["project/app"]["models"] + # record_dir_key is "project/app/models" + def record_dir_key + ::File.join(*[@relative, @name].compact) + end + + def sys_path + # Use full path in case someone uses chdir + ::File.join(*[@root, @relative, @name].compact) + end + + def real_path + @real_path ||= ::File.realpath(sys_path) + end + + private + + def _join + args = [@relative, @name].compact + args.empty? ? nil : ::File.join(*args) + end + + def _entries(dir) + return Dir.entries(dir) unless RUBY_ENGINE == 'jruby' + + # JRuby inconsistency workaround, see: + # https://github.com/jruby/jruby/issues/3840 + exists = ::File.exist?(dir) + directory = ::File.directory?(dir) + return Dir.entries(dir) unless exists && !directory + raise Errno::ENOTDIR, dir + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/record/symlink_detector.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/record/symlink_detector.rb new file mode 100644 index 000000000000..cce877396307 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/record/symlink_detector.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'set' +require 'listen/error' + +module Listen + # @private api + class Record + class SymlinkDetector + README_URL = 'https://github.com/guard/listen/blob/master/README.md' + + SYMLINK_LOOP_ERROR = <<-EOS + ** ERROR: directory is already being watched! ** + + Directory: %s + + is already being watched through: %s + + MORE INFO: #{README_URL} + EOS + + Error = ::Listen::Error # for backward compatibility + + def initialize + @real_dirs = Set.new + end + + def verify_unwatched!(entry) + real_path = entry.real_path + @real_dirs.add?(real_path) or _fail(entry.sys_path, real_path) + end + + private + + def _fail(symlinked, real_path) + warn(format(SYMLINK_LOOP_ERROR, symlinked, real_path)) + raise ::Listen::Error::SymlinkLoop, 'Failed due to looped symlinks' + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/silencer.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/silencer.rb new file mode 100644 index 000000000000..1f17bbcedde3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/silencer.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +module Listen + class Silencer + # The default list of directories that get ignored. + DEFAULT_IGNORED_DIRECTORIES = %r{^(?: + \.git + | \.svn + | \.hg + | \.rbx + | \.bundle + | bundle + | vendor/bundle + | log + | tmp + |vendor/ruby + )(/|$)}x.freeze + + # The default list of files that get ignored. + DEFAULT_IGNORED_EXTENSIONS = %r{(?: + # Kate's tmp\/swp files + \..*\d+\.new + | \.kate-swp + + # Gedit tmp files + | \.goutputstream-.{6} + + # Intellij files + | ___jb_bak___ + | ___jb_old___ + + # Vim swap files and write test + | \.sw[px] + | \.swpx + | ^4913 + + # Sed temporary files - but without actual words, like 'sedatives' + | (?:^ + sed + + (?: + [a-zA-Z0-9]{0}[A-Z]{1}[a-zA-Z0-9]{5} | + [a-zA-Z0-9]{1}[A-Z]{1}[a-zA-Z0-9]{4} | + [a-zA-Z0-9]{2}[A-Z]{1}[a-zA-Z0-9]{3} | + [a-zA-Z0-9]{3}[A-Z]{1}[a-zA-Z0-9]{2} | + [a-zA-Z0-9]{4}[A-Z]{1}[a-zA-Z0-9]{1} | + [a-zA-Z0-9]{5}[A-Z]{1}[a-zA-Z0-9]{0} + ) + ) + + # Mutagen sync temporary files + | \.mutagen-temporary.* + + # other files + | \.DS_Store + | \.tmp + | ~ + )$}x.freeze + + attr_accessor :only_patterns, :ignore_patterns + + def initialize + configure({}) + end + + def configure(options) + @only_patterns = options[:only] ? Array(options[:only]) : nil + @ignore_patterns = _init_ignores(options[:ignore], options[:ignore!]) + end + + # Note: relative_path is temporarily expected to be a relative Pathname to + # make refactoring easier (ideally, it would take a string) + + # TODO: switch type and path places - and verify + def silenced?(relative_path, type) + path = relative_path.to_s + + _ignore?(path) || (only_patterns && type == :file && !_only?(path)) + end + + private + + def _ignore?(path) + ignore_patterns.any? { |pattern| path =~ pattern } + end + + def _only?(path) + only_patterns.any? { |pattern| path =~ pattern } + end + + def _init_ignores(ignores, overrides) + patterns = [] + unless overrides + patterns << DEFAULT_IGNORED_DIRECTORIES + patterns << DEFAULT_IGNORED_EXTENSIONS + end + + patterns << ignores + patterns << overrides + + patterns.compact.flatten + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/silencer/controller.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/silencer/controller.rb new file mode 100644 index 000000000000..bb94d4bfaefb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/silencer/controller.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module Listen + class Silencer + class Controller + def initialize(silencer, default_options) + @silencer = silencer + + opts = default_options + + @prev_silencer_options = {} + rules = [:only, :ignore, :ignore!].map do |option| + [option, opts[option]] if opts.key? option + end + + _reconfigure_silencer(Hash[rules.compact]) + end + + def append_ignores(*regexps) + prev_ignores = Array(@prev_silencer_options[:ignore]) + _reconfigure_silencer(ignore: [prev_ignores + regexps]) + end + + def replace_with_bang_ignores(regexps) + _reconfigure_silencer(ignore!: regexps) + end + + def replace_with_only(regexps) + _reconfigure_silencer(only: regexps) + end + + private + + def _reconfigure_silencer(extra_options) + opts = extra_options.dup + opts = opts.map do |key, value| + [key, Array(value).flatten.compact] + end + opts = Hash[opts] + + if opts.key?(:ignore) && opts[:ignore].empty? + opts.delete(:ignore) + end + + @prev_silencer_options = opts + @silencer.configure(@prev_silencer_options.dup.freeze) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/thread.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/thread.rb new file mode 100644 index 000000000000..a1e6b3b60033 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/thread.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require 'thread' + +require_relative 'logger' + +module Listen + module Thread + class << self + # Creates a new thread with the given name. + # Any exceptions raised by the thread will be logged with the thread name and complete backtrace. + # rubocop:disable Style/MultilineBlockChain + def new(name, &block) + thread_name = "listen-#{name}" + caller_stack = caller + + ::Thread.new do + rescue_and_log(thread_name, caller_stack: caller_stack, &block) + end.tap do |thread| + thread.name = thread_name + end + end + # rubocop:enable Style/MultilineBlockChain + + def rescue_and_log(method_name, *args, caller_stack: nil) + yield(*args) + rescue => exception + _log_exception(exception, method_name, caller_stack: caller_stack) + end + + private + + def _log_exception(exception, thread_name, caller_stack: nil) + complete_backtrace = if caller_stack + [*exception.backtrace, "--- Thread.new ---", *caller_stack] + else + exception.backtrace + end + message = "Exception rescued in #{thread_name}:\n#{_exception_with_causes(exception)}\n#{complete_backtrace * "\n"}" + Listen.logger.error(message) + end + + def _exception_with_causes(exception) + result = +"#{exception.class}: #{exception}" + if exception.cause + result << "\n" + result << "--- Caused by: ---\n" + result << _exception_with_causes(exception.cause) + end + result + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/version.rb b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/version.rb new file mode 100644 index 000000000000..2ee4822522b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/listen-3.5.1/lib/listen/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Listen + VERSION = '3.5.1' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/.gitignore b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/.gitignore new file mode 100644 index 000000000000..d87d4be66f45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/.gitignore @@ -0,0 +1,17 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/.rspec b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/.rspec new file mode 100644 index 000000000000..5f1647637a0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/.rspec @@ -0,0 +1,2 @@ +--color +--format progress diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/.travis.yml new file mode 100644 index 000000000000..d7c261d30b20 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/.travis.yml @@ -0,0 +1,15 @@ +language: ruby +rvm: + - 1.9.3 + - 2.0.0 + - 2.1 +sudo: false +cache: bundler +before_script: bundle update +script: "./script/cibuild" +notifications: + email: + recipients: + - mercenary@jekyllrb.com + on_success: change + on_failure: change diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/Gemfile b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/Gemfile new file mode 100644 index 000000000000..50c90dbd84cb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in mercenary.gemspec +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/History.markdown b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/History.markdown new file mode 100644 index 000000000000..360b83f7d643 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/History.markdown @@ -0,0 +1,109 @@ +## 0.3.6 / 2016-04-07 + +### Bug Fixes + + * Presenter: Options should include those from parent command (#42) + +## 0.3.5 / 2014-11-12 + +### Bug Fixes + + * Capture `OptionsParser::InvalidOption` and show a nice error message (#38) + * Absolute paths for requires and autoloads (#39) + +### Development Fixes + + * Bump to RSpec 3 (#40) + +## 0.3.4 / 2014-07-11 + +### Bug Fixes + + * Use option object as key in the command's `@map` hash (#35) + +## 0.3.3 / 2014-05-07 + +### Bug Fixes + + * The `--version` flag should not exit with code 1, but instead code 0. (#33) + +## 0.3.2 / 2014-03-18 + +### Bug Fixes + + * Remove duplicate commands from help output; show aliases w/command names (#29) + +## 0.3.1 / 2014-02-21 + +### Minor Enhancements + + * Add `-t/--trace` to list of options in help message (#19) + +### Bug Fixes + + * `Mercenary::Option` now accepts return values in the form of Class constants (#22) + +## 0.3.0 / 2014-02-20 + +### Major Enhancements + + * Officially drop 1.8.7 support (#14) + * Allow Commands to set their own versions (#17) + * Show subcommands, options and usage in help and attach to all commands (#18) + * Add `-t, --trace` to allow full exception backtrace to print, otherwise print just the error message (#19) + +### Minor Enhancements + + * Logging state is maintained throughout process (#12) + * Tidy up Command#logger output (#21) + +### Development Fixes + + * Added specs for `Program` (#13) + +## 0.2.1 / 2013-12-25 + +### Bug Fixes + + * Added missing comma to fix '-v' and '--version' options (#9) + +## 0.2.0 / 2013-11-30 + +### Major Enhancements + + * Add `Command#default_command` to specify a default command if none is given by the user at runtime (#7) + +### Minor Enhancements + + * Add `Command#execute` to execute the actions of a command (#6) + +### Development Fixes + + * Add standard GitHub bootstrap and cibuild scripts to `script/` (#2) + +## 0.1.0 / 2013-11-08 + +### Major Enhancements + + * It works! + +### Minor Enhancements + + * Add a logger to `Command` + * Add `--version` switch to all programs + +### Bug Fixes + + * Fix `Command#syntax` and `Command#description`'s handing of setting vs getting + * Fix load path problem in `lib/mercenary.rb` + +### Development Fixes + + * Add TomDoc to everything + * Add a couple starter specs + * Add TravisCI badge + * Add Travis configuration + +## 0.0.1 / 2013-11-06 + + * Birthday! diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/LICENSE.txt new file mode 100644 index 000000000000..354c0b20e0c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2013-2014 Parker Moore + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/README.md b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/README.md new file mode 100644 index 000000000000..ed9b1a1b2630 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/README.md @@ -0,0 +1,250 @@ +# Mercenary + +Lightweight and flexible library for writing command-line apps in Ruby. + +[![Build Status](https://secure.travis-ci.org/jekyll/mercenary.png)](https://travis-ci.org/jekyll/mercenary) + +## Installation + +Add this line to your application's Gemfile: + + gem 'mercenary' + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install mercenary + +**Note: Mercenary may not work with Ruby < 1.9.3.** + +## Usage + +Creating programs and commands with Mercenary is easy: + +```ruby +Mercenary.program(:jekyll) do |p| + p.version Jekyll::VERSION + p.description 'Jekyll is a blog-aware, static site generator in Ruby' + p.syntax "jekyll <subcommand> [options]" + + p.command(:new) do |c| + c.syntax "new PATH" # do not include the program name or super commands + c.description "Creates a new Jekyll site scaffold in PATH" + c.option 'blank', '--blank', 'Initialize the new site without any content.' + + c.action do |args, options| + Jekyll::Commands::New.process(args, blank: options['blank']) + end + end + + p.command(:build) do |c| + c.syntax "build [options]" + c.description "Builds your Jekyll site" + + c.option 'safe', '--safe', 'Run in safe mode' + c.option 'source', '--source DIR', 'From where to collect the source files' + c.option 'destination', '--dest DIR', 'To where the compiled files should be written' + + c.action do |_, options| + Jekyll::Commands::Build.process(options) + end + end + + # Bring in command bundled in external gem + begin + require "jekyll-import" + JekyllImport.init_with_program(p) + rescue LoadError + end + + p.default_command(:build) +end +``` + +All commands have the following default options: + +- `-h/--help` - show a help message +- `-v/--version` - show the program version +- `-t/--trace` - show the full backtrace when an error occurs + +## API + +### `Mercenary` + +#### `.program` + +Creates and executes a program. Accepts two arguments: + +- `name` - program name as a Symbol +- `block` - the specification for the program, passed the program instance as an + argument. + +Example is above, under the heading [Usage](#usage). + +### `Program` + +`Program` is a subclass of `Command`, so it has all of the methods documented +below as well as those for `Command`. + +#### `#config` + +Fetches the program configuration hash. + +### `Command` + +#### `#new` + +Create a new command. Accepts two arguments: + +- `name` - the name of your command, as a symbol +- `parent` - (optional) the parent Command + +#### `#version` + +Sets or gets the version of the command. Accepts an optional argument: + +- `version` - (optional) the version to set for the command. If present, this + becomes the new version for the command and persists. + +#### `#syntax` + +Sets or gets the syntax of the command. Built on parent syntaxes if a parent +exists. Accepts one optional argument: + +- `syntax` - (optional) the syntax to set for the command. Will inherit from the + parent commands or program. Usually in the form of + `"command_name <SUBCOMMAND> [OPTIONS]"` + +When a parent command exists, say `supercommand`, with syntax set as +`supercommand <SUBCOMMAND> [OPTIONS]`, the syntax of the command in question +will be `supercommand command_name <SUBCOMMAND> [OPTIONS]` with both +`<SUBCOMMAND>` and `[OPTIONS]` stripped out. Any text between `<` and `>` or +between `[` and `]` will be stripped from parent command syntaxes. The purpose +of this chaining is to reduce redundancy. + +#### `#description` + +Sets or gets the description of the command. Accepts one optional argument: + +- `desc` - (optional) the description to set for the command. If + provided, will override any previous description set for the command. + +#### `#default_command` + +Sets or gets the default subcommand of the command to execute in the event no +subcommand is passed during execution. Accepts one optional argument: + +- `command_name` - (optional) the `Symbol` name of the subcommand to be + executed. Raises an `ArgumentError` if the subcommand doesn't exist. + Overwrites previously-set default commands. + +#### `#option` + +Adds a new option to the command. Accepts many arguments: + +- `config_key` - the configuration key that the value of this option maps to. +- `*options` - all the options, globbed, to be passed to `OptionParser`, namely the + switches and the option description. Usually in the format + `"-s", "--switch", "Sets the 'switch' flag"`. + +Valid option calls: + +```ruby +cmd.option 'config_key', '-c', 'Sets the "config" flag' +cmd.option 'config_key', '--config', 'Sets the "config" flag' +cmd.option 'config_key', '-c', '--config', 'Sets the "config" flag.' +cmd.option 'config_key', '-c FILE', '--config FILE', 'The config file.' +cmd.option 'config_key', '-c FILE1[,FILE2[,FILE3...]]', '--config FILE1[,FILE2[,FILE3...]]', Array, 'The config files.' +``` + +Notice that you can specify either a short switch, a long switch, or both. If +you want to accept an argument, you have to specify it in the switch strings. +The class of the argument defaults to `String`, but you can optionally set a +different class to create, e.g. `Array`, if you are expecting a particular class +in your code from this option's value. The description is also optional, but +it's highly recommended to include a description. + +#### `#alias` + +Specifies an alias for this command such that the alias may be used in place of +the command during execution. Accepts one argument: + +- `cmd_name` - the alias name for this command as a `Symbol` + +Example: + +```ruby +cmd.alias(:my_alias) +# Now `cmd` is now also executable via "my_alias" +``` + +#### `#action` + +Specifies a block to be executed in the event the command is specified at +runtime. The block is given two arguments: + +- `args` - the non-switch arguments given from the command-line +- `options` - the options hash built via the switches passed + +**Note that actions are additive**, meaning any new call to `#action` will +result in another action to be executed at runtime. Actions will be executed in +the order they are specified in. + +Example: + +```ruby +cmd.action do |args, options| + # do something! +end +``` + +#### `#logger` + +Access the logger for this command. Useful for outputting information to STDOUT. +Accepts one optional argument: + +- `level` - (optional) the severity threshold at which to begin logging. Uses + Ruby's built-in + [`Logger`](http://www.ruby-doc.org/stdlib-2.1.0/libdoc/logger/rdoc/Logger.html) + levels. + +Log level defaults to `Logger::INFO`. + +Examples: + +```ruby +cmd.logger(Logger::DEBUG) +cmd.logger.debug "My debug message." +cmd.logger.info "My informative message." +cmd.logger.warn "ACHTUNG!!" +cmd.logger.error "Something terrible has happened." +cmd.logger.fatal "I can't continue doing what I'm doing." +``` + +#### `#command` + +Creates a new subcommand for the current command. Accepts two arguments: + +- `cmd_name` - the command name, as a Symbol +- `block` - the specification of the subcommand in a block + +Example: + +```ruby +my_command.command(:my_subcommand) do |subcmd| + subcmd.description 'My subcommand' + subcmd.syntax 'my_subcommand [OPTIONS]' + # ... +end +``` + +## Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/Rakefile b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/Rakefile new file mode 100644 index 000000000000..29955274e0d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/Rakefile @@ -0,0 +1 @@ +require "bundler/gem_tasks" diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/examples/help_dialogue.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/examples/help_dialogue.rb new file mode 100644 index 000000000000..807e58784860 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/examples/help_dialogue.rb @@ -0,0 +1,46 @@ +#!/usr/bin/env ruby + +$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) + +require "mercenary" + +# This example sets the logging mode of mercenary to +# debug. Logging messages from "p.logger.debug" will +# be output to STDOUT. + +Mercenary.program(:help_dialogue) do |p| + + p.version "2.0.1" + p.description 'An example of the help dialogue in Mercenary' + p.syntax 'help_dialogue <subcommand>' + + p.command(:some_subcommand) do |c| + c.version '1.4.2' + c.syntax 'some_subcommand <subcommand> [options]' + c.description 'Some subcommand to do something' + c.option 'an_option', '-o', '--option', 'Some option' + c.alias(:blah) + + c.command(:yet_another_sub) do |f| + f.syntax 'yet_another_sub [options]' + f.description 'Do amazing things' + f.option 'blah', '-b', '--blah', 'Trigger blah flag' + f.option 'heh', '-H ARG', '--heh ARG', 'Give a heh' + + f.action do |args, options| + print "Args: " + p args + print "Opts: " + p options + end + end + end + + p.command(:another_subcommand) do |c| + c.syntax 'another_subcommand <subcommand> [options]' + c.description 'Another subcommand to do something different.' + c.option 'an_option', '-O', '--option', 'Some option' + c.option 'another_options', '--pluginzzz', 'Set where the plugins should be found from' + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/examples/logging.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/examples/logging.rb new file mode 100644 index 000000000000..2cb867a5a636 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/examples/logging.rb @@ -0,0 +1,39 @@ +#!/usr/bin/env ruby + +$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) + +require "mercenary" + +# This example sets the logging mode of mercenary to +# debug. Logging messages from "p.logger.debug" will +# be output to STDOUT. + +Mercenary.program(:logger_output) do |p| + + p.version "5.2.6" + p.description 'An example of turning on logging for Mercenary.' + p.syntax 'logger_output' + + + p.logger.info "The default log level is INFO. So this will output." + p.logger.debug "Since DEBUG is below INFO, this will not output." + + p.logger(Logger::DEBUG) + p.logger.debug "Logger level now set to DEBUG. So everything will output." + + p.logger.debug "Example of DEBUG level message." + p.logger.info "Example of INFO level message." + p.logger.warn "Example of WARN level message." + p.logger.error "Example of ERROR level message." + p.logger.fatal "Example of FATAL level message." + p.logger.unknown "Example of UNKNOWN level message." + + p.action do |args, options| + + p.logger(Logger::INFO) + p.logger.debug "Logger level back to INFO. This line will not output." + p.logger.info "This INFO message will output." + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/examples/trace.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/examples/trace.rb new file mode 100644 index 000000000000..0aaa3655061d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/examples/trace.rb @@ -0,0 +1,21 @@ +#!/usr/bin/env ruby + +$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) + +require "mercenary" + +# This example sets the logging mode of mercenary to +# debug. Logging messages from "p.logger.debug" will +# be output to STDOUT. + +Mercenary.program(:trace) do |p| + + p.version "2.0.1" + p.description 'An example of traces in Mercenary' + p.syntax 'trace <subcommand>' + + p.action do |_, _| + raise ArgumentError.new("YOU DID SOMETHING TERRIBLE YOU BUFFOON") + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary.rb new file mode 100644 index 000000000000..1c4be62a748d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary.rb @@ -0,0 +1,21 @@ +require File.expand_path("../mercenary/version", __FILE__) +require "optparse" +require "logger" + +module Mercenary + autoload :Command, File.expand_path("../mercenary/command", __FILE__) + autoload :Option, File.expand_path("../mercenary/option", __FILE__) + autoload :Presenter, File.expand_path("../mercenary/presenter", __FILE__) + autoload :Program, File.expand_path("../mercenary/program", __FILE__) + + # Public: Instantiate a new program and execute. + # + # name - the name of your program + # + # Returns nothing. + def self.program(name) + program = Program.new(name) + yield program + program.go(ARGV) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/command.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/command.rb new file mode 100644 index 000000000000..0bcc4dd08920 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/command.rb @@ -0,0 +1,280 @@ +module Mercenary + class Command + attr_reader :name + attr_reader :description + attr_reader :syntax + attr_accessor :options + attr_accessor :commands + attr_accessor :actions + attr_reader :map + attr_accessor :parent + attr_reader :trace + attr_reader :aliases + + # Public: Creates a new Command + # + # name - the name of the command + # parent - (optional) the instancce of Mercenary::Command which you wish to + # be the parent of this command + # + # Returns nothing + def initialize(name, parent = nil) + @name = name + @options = [] + @commands = {} + @actions = [] + @map = {} + @parent = parent + @trace = false + @aliases = [] + end + + # Public: Sets or gets the command version + # + # version - the command version (optional) + # + # Returns the version and sets it if an argument is non-nil + def version(version = nil) + @version = version if version + @version + end + + # Public: Sets or gets the syntax string + # + # syntax - the string which describes this command's usage syntax (optional) + # + # Returns the syntax string and sets it if an argument is present + def syntax(syntax = nil) + @syntax = syntax if syntax + syntax_list = [] + if parent + syntax_list << parent.syntax.to_s.gsub(/<[\w\s-]+>/, '').gsub(/\[[\w\s-]+\]/, '').strip + end + syntax_list << (@syntax || name.to_s) + syntax_list.join(" ") + end + + # Public: Sets or gets the command description + # + # description - the description of what the command does (optional) + # + # Returns the description and sets it if an argument is present + def description(desc = nil) + @description = desc if desc + @description + end + + # Public: Sets the default command + # + # command_name - the command name to be executed in the event no args are + # present + # + # Returns the default command if there is one, `nil` otherwise + def default_command(command_name = nil) + if command_name + if commands.has_key?(command_name) + @default_command = commands[command_name] if command_name + @default_command + else + raise ArgumentError.new("'#{command_name}' couldn't be found in this command's list of commands.") + end + else + @default_command + end + end + + # Public: Adds an option switch + # + # sym - the variable key which is used to identify the value of the switch + # at runtime in the options hash + # + # Returns nothing + def option(sym, *options) + new_option = Option.new(sym, options) + @options << new_option + @map[new_option] = sym + end + + # Public: Adds a subcommand + # + # cmd_name - the name of the command + # block - a block accepting the new instance of Mercenary::Command to be + # modified (optional) + # + # Returns nothing + def command(cmd_name) + cmd = Command.new(cmd_name, self) + yield cmd + @commands[cmd_name] = cmd + end + + # Public: Add an alias for this command's name to be attached to the parent + # + # cmd_name - the name of the alias + # + # Returns nothing + def alias(cmd_name) + logger.debug "adding alias to parent for self: '#{cmd_name}'" + aliases << cmd_name + @parent.commands[cmd_name] = self + end + + # Public: Add an action Proc to be executed at runtime + # + # block - the Proc to be executed at runtime + # + # Returns nothing + def action(&block) + @actions << block + end + + # Public: Fetch a Logger (stdlib) + # + # level - the logger level (a Logger constant, see docs for more info) + # + # Returns the instance of Logger + def logger(level = nil) + unless @logger + @logger = Logger.new(STDOUT) + @logger.level = level || Logger::INFO + @logger.formatter = proc do |severity, datetime, progname, msg| + "#{identity} | " << "#{severity.downcase.capitalize}:".ljust(7) << " #{msg}\n" + end + end + + @logger.level = level unless level.nil? + @logger + end + + # Public: Run the command + # + # argv - an array of string args + # opts - the instance of OptionParser + # config - the output config hash + # + # Returns the command to be executed + def go(argv, opts, config) + opts.banner = "Usage: #{syntax}" + process_options(opts, config) + add_default_options(opts) + + if argv[0] && cmd = commands[argv[0].to_sym] + logger.debug "Found subcommand '#{cmd.name}'" + argv.shift + cmd.go(argv, opts, config) + else + logger.debug "No additional command found, time to exec" + self + end + end + + # Public: Add this command's options to OptionParser and set a default + # action of setting the value of the option to the inputted hash + # + # opts - instance of OptionParser + # config - the Hash in which the option values should be placed + # + # Returns nothing + def process_options(opts, config) + options.each do |option| + opts.on(*option.for_option_parser) do |x| + config[map[option]] = x + end + end + end + + # Public: Add version and help options to the command + # + # opts - instance of OptionParser + # + # Returns nothing + def add_default_options(opts) + option 'show_help', '-h', '--help', 'Show this message' + option 'show_version', '-v', '--version', 'Print the name and version' + option 'show_backtrace', '-t', '--trace', 'Show the full backtrace when an error occurs' + opts.on("-v", "--version", "Print the version") do + puts "#{name} #{version}" + exit(0) + end + + opts.on('-t', '--trace', 'Show full backtrace if an error occurs') do + @trace = true + end + + opts.on_tail("-h", "--help", "Show this message") do + puts self + exit + end + end + + # Public: Execute all actions given the inputted args and options + # + # argv - (optional) command-line args (sans opts) + # config - (optional) the Hash configuration of string key to value + # + # Returns nothing + def execute(argv = [], config = {}) + if actions.empty? && !default_command.nil? + default_command.execute + else + actions.each { |a| a.call(argv, config) } + end + end + + # Public: Check if this command has a subcommand + # + # sub_command - the name of the subcommand + # + # Returns true if this command is the parent of a command of name + # 'sub_command' and false otherwise + def has_command?(sub_command) + commands.keys.include?(sub_command) + end + + # Public: Identify this command + # + # Returns a string which identifies this command + def ident + "<Command name=#{identity}>" + end + + # Public: Get the full identity (name & version) of this command + # + # Returns a string containing the name and version if it exists + def identity + "#{full_name} #{version if version}".strip + end + + # Public: Get the name of the current command plus that of + # its parent commands + # + # Returns the full name of the command + def full_name + the_name = [] + the_name << parent.full_name if parent && parent.full_name + the_name << name + the_name.join(" ") + end + + # Public: Return all the names and aliases for this command. + # + # Returns a comma-separated String list of the name followed by its aliases + def names_and_aliases + ([name.to_s] + aliases).compact.join(", ") + end + + # Public: Build a string containing a summary of the command + # + # Returns a one-line summary of the command. + def summarize + " #{names_and_aliases.ljust(20)} #{description}" + end + + # Public: Build a string containing the command name, options and any subcommands + # + # Returns the string identifying this command, its options and its subcommands + def to_s + Presenter.new(self).print_command + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/option.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/option.rb new file mode 100644 index 000000000000..56a49b62430d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/option.rb @@ -0,0 +1,87 @@ +module Mercenary + class Option + attr_reader :config_key, :description, :short, :long, :return_type + + # Public: Create a new Option + # + # config_key - the key in the config hash to which the value of this option + # will map + # info - an array containing first the switches, then an optional + # return type (e.g. Array), then a description of the option + # + # Returns nothing + def initialize(config_key, info) + @config_key = config_key + while arg = info.shift + begin + @return_type = Object.const_get("#{arg}") + next + rescue NameError + end + if arg.start_with?("-") + if arg.start_with?("--") + @long = arg + else + @short = arg + end + next + end + @description = arg + end + end + + # Public: Fetch the array containing the info OptionParser is interested in + # + # Returns the array which OptionParser#on wants + def for_option_parser + [short, long, return_type, description].flatten.reject{ |o| o.to_s.empty? } + end + + # Public: Build a string representation of this option including the + # switches and description + # + # Returns a string representation of this option + def to_s + "#{formatted_switches} #{description}" + end + + # Public: Build a beautifully-formatted string representation of the switches + # + # Returns a formatted string representation of the switches + def formatted_switches + [ + switches.first.rjust(10), + switches.last.ljust(13) + ].join(", ").gsub(/ , /, ' ').gsub(/, /, ' ') + end + + # Public: Hash based on the hash value of instance variables + # + # Returns a Fixnum which is unique to this Option based on the instance variables + def hash + instance_variables.map do |var| + instance_variable_get(var).hash + end.reduce(:^) + end + + # Public: Check equivalence of two Options based on equivalence of their + # instance variables + # + # Returns true if all the instance variables are equal, false otherwise + def eql?(other) + return false unless self.class.eql?(other.class) + instance_variables.map do |var| + instance_variable_get(var).eql?(other.instance_variable_get(var)) + end.all? + end + + # Public: Fetch an array of switches, including the short and long versions + # + # Returns an array of two strings. An empty string represents no switch in + # that position. + def switches + [short, long].map(&:to_s) + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb new file mode 100644 index 000000000000..0521ee01a677 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb @@ -0,0 +1,94 @@ +module Mercenary + class Presenter + attr_accessor :command + + # Public: Make a new Presenter + # + # command - a Mercenary::Command to present + # + # Returns nothing + def initialize(command) + @command = command + end + + # Public: Builds a string representation of the command usage + # + # Returns the string representation of the command usage + def usage_presentation + " #{command.syntax}" + end + + # Public: Builds a string representation of the options + # + # Returns the string representation of the options + def options_presentation + return nil unless command_options_presentation || parent_command_options_presentation + [command_options_presentation, parent_command_options_presentation].compact.join("\n") + end + + def command_options_presentation + return nil unless command.options.size > 0 + command.options.map(&:to_s).join("\n") + end + + # Public: Builds a string representation of the options for parent + # commands + # + # Returns the string representation of the options for parent commands + def parent_command_options_presentation + return nil unless command.parent + Presenter.new(command.parent).options_presentation + end + + # Public: Builds a string representation of the subcommands + # + # Returns the string representation of the subcommands + def subcommands_presentation + return nil unless command.commands.size > 0 + command.commands.values.uniq.map(&:summarize).join("\n") + end + + # Public: Builds the command header, including the command identity and description + # + # Returns the command header as a String + def command_header + header = "#{command.identity}" + header << " -- #{command.description}" if command.description + header + end + + # Public: Builds a string representation of the whole command + # + # Returns the string representation of the whole command + def command_presentation + msg = [] + msg << command_header + msg << "Usage:" + msg << usage_presentation + + if opts = options_presentation + msg << "Options:\n#{opts}" + end + if subcommands = subcommands_presentation + msg << "Subcommands:\n#{subcommands_presentation}" + end + msg.join("\n\n") + end + + # Public: Turn a print_* into a *_presentation or freak out + # + # meth - the method being called + # args - an array of arguments passed to the missing method + # block - the block passed to the missing method + # + # Returns the value of whatever function is called + def method_missing(meth, *args, &block) + if meth.to_s =~ /^print_(.+)$/ + send("#{$1.downcase}_presentation") + else + super # You *must* call super if you don't handle the method, + # otherwise you'll mess up Ruby's method lookup. + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/program.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/program.rb new file mode 100644 index 000000000000..53591c01208b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/program.rb @@ -0,0 +1,53 @@ +module Mercenary + class Program < Command + attr_reader :optparse + attr_reader :config + + # Public: Creates a new Program + # + # name - the name of the program + # + # Returns nothing + def initialize(name) + @config = {} + super(name) + end + + # Public: Run the program + # + # argv - an array of string args (usually ARGV) + # + # Returns nothing + def go(argv) + logger.debug("Using args passed in: #{argv.inspect}") + + cmd = nil + + @optparse = OptionParser.new do |opts| + cmd = super(argv, opts, @config) + end + + begin + @optparse.parse!(argv) + rescue OptionParser::InvalidOption => e + logger.error "Whoops, we can't understand your command." + logger.error "#{e.message}" + logger.error "Run your command again with the --help switch to see available options." + abort + end + + logger.debug("Parsed config: #{@config.inspect}") + + begin + cmd.execute(argv, @config) + rescue => e + if cmd.trace + raise e + else + logger.error e.message + abort + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/version.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/version.rb new file mode 100644 index 000000000000..296046bb378b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/lib/mercenary/version.rb @@ -0,0 +1,3 @@ +module Mercenary + VERSION = "0.3.6" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/mercenary.gemspec b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/mercenary.gemspec new file mode 100644 index 000000000000..e9f829477293 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/mercenary.gemspec @@ -0,0 +1,24 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'mercenary/version' + +Gem::Specification.new do |spec| + spec.name = "mercenary" + spec.version = Mercenary::VERSION + spec.authors = ["Tom Preston-Werner", "Parker Moore"] + spec.email = ["tom@mojombo.com", "parkrmoore@gmail.com"] + spec.description = %q{Lightweight and flexible library for writing command-line apps in Ruby.} + spec.summary = %q{Lightweight and flexible library for writing command-line apps in Ruby.} + spec.homepage = "https://github.com/jekyll/mercenary" + spec.license = "MIT" + + spec.files = `git ls-files`.split($/) + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ["lib"] + + spec.add_development_dependency "bundler", "~> 1.3" + spec.add_development_dependency "rake" + spec.add_development_dependency "rspec", "~> 3.0" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/bootstrap new file mode 100644 index 000000000000..a0cf262eea96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/bootstrap @@ -0,0 +1,7 @@ +#! /bin/sh + +set -e + +echo "Time to get set up." +bundle install +echo "Boom." diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/cibuild b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/cibuild new file mode 100644 index 000000000000..260e363876e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/cibuild @@ -0,0 +1,6 @@ +#! /bin/sh + +set -ex + +bundle exec rspec +./script/examples diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/console b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/console new file mode 100644 index 000000000000..27ed279ef2a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/console @@ -0,0 +1,3 @@ +#! /bin/bash + +irb -r./lib/mercenary.rb diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/examples b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/examples new file mode 100644 index 000000000000..a722ab32fb75 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/script/examples @@ -0,0 +1,18 @@ +#! /bin/bash + +set -e + +function run () { + echo "+ ruby ./examples/$@" + ruby -e "puts '=' * 79" + ruby ./examples/$@ + ruby -e "puts '=' * 79" +} + +run logging.rb +run logging.rb -v +run help_dialogue.rb -h +run help_dialogue.rb some_subcommand -h +run help_dialogue.rb another_subcommand -h +run help_dialogue.rb some_subcommand yet_another_sub -h +run help_dialogue.rb some_subcommand yet_another_sub -b diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/command_spec.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/command_spec.rb new file mode 100644 index 000000000000..e1c029aab4b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/command_spec.rb @@ -0,0 +1,98 @@ +require "spec_helper" + +describe(Mercenary::Command) do + + context "a basic command" do + let(:command) { Mercenary::Command.new(:my_name) } + let(:parent) { Mercenary::Command.new(:my_parent) } + let(:with_sub) do + c = Mercenary::Command.new(:i_have_subcommand) + add_sub.call(c) + c + end + let(:command_with_parent) do + Mercenary::Command.new( + :i_have_parent, + parent + ) + end + let(:add_sub) do + Proc.new do |c| + c.command(:sub_command) { |p| } + end + end + + it "can be created with just a name" do + expect(command.name).to eql(:my_name) + end + + it "can hold a parent command" do + expect(command_with_parent.parent).to eql(parent) + end + + it "can create subcommands" do + expect(add_sub.call(command)).to be_a(Mercenary::Command) + expect(add_sub.call(command).parent).to eq(command) + end + + it "can set its version" do + version = "1.4.2" + command.version version + expect(command.version).to eq(version) + end + + it "can set its syntax" do + syntax_string = "my_name [options]" + cmd = described_class.new(:my_name) + cmd.syntax syntax_string + expect(cmd.syntax).to eq(syntax_string) + end + + it "can set its description" do + desc = "run all the things" + command.description desc + expect(command.description).to eq(desc) + end + + it "can set its options" do + name = "show_drafts" + opts = ['--drafts', 'Render posts in the _drafts folder'] + option = Mercenary::Option.new(name, opts) + command.option name, *opts + expect(command.options).to eql([option]) + expect(command.map.values).to include(name) + end + + it "knows its full name" do + expect(command_with_parent.full_name).to eql("my_parent i_have_parent") + end + + it "knows its identity" do + command_with_parent.version '1.8.7' + expect(command_with_parent.identity).to eql("my_parent i_have_parent 1.8.7") + end + + it "raises an ArgumentError if I specify a default_command that isn't there" do + c = command # some weird NameError with the block below? + expect { c.default_command(:nope) }.to raise_error(ArgumentError) + end + + it "sets the default_command" do + expect(with_sub.default_command(:sub_command).name).to eq(:sub_command) + end + + context "with an alias" do + before(:each) do + command_with_parent.alias(:an_alias) + end + it "shows the alias in the summary" do + expect(command_with_parent.summarize).to eql(" i_have_parent, an_alias ") + end + + it "its names_and_aliases method reports both the name and alias" do + expect(command_with_parent.names_and_aliases).to eql("i_have_parent, an_alias") + end + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/option_spec.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/option_spec.rb new file mode 100644 index 000000000000..83e58fd94727 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/option_spec.rb @@ -0,0 +1,83 @@ +require 'spec_helper' + +describe(Mercenary::Option) do + let(:config_key) { "largo" } + let(:description) { "This is a description" } + let(:switches) { ['-l', '--largo'] } + let(:option) { described_class.new(config_key, [switches, description].flatten.reject(&:nil?)) } + + it "knows its config key" do + expect(option.config_key).to eql(config_key) + end + + it "knows its description" do + expect(option.description).to eql(description) + end + + it "knows its switches" do + expect(option.switches).to eql(switches) + end + + it "knows how to present itself" do + expect(option.to_s).to eql(" -l, --largo #{description}") + end + + it "has an OptionParser representation" do + expect(option.for_option_parser).to eql([switches, description].flatten) + end + + it "compares itself with other options well" do + new_option = described_class.new(config_key, ['-l', '--largo', description]) + expect(option.eql?(new_option)).to be(true) + expect(option.hash.eql?(new_option.hash)).to be(true) + end + + it "has a custom #hash" do + expect(option.hash.to_s).to match(/\d+/) + end + + context "with just the long switch" do + let(:switches) { ['--largo'] } + + it "adds an empty string in place of the short switch" do + expect(option.switches).to eql(['', '--largo']) + end + + it "sets its description properly" do + expect(option.description).to eql(description) + end + + it "knows how to present the switch" do + expect(option.formatted_switches).to eql(" --largo ") + end + end + + context "with just the short switch" do + let(:switches) { ['-l'] } + + it "adds an empty string in place of the long switch" do + expect(option.switches).to eql(['-l', '']) + end + + it "sets its description properly" do + expect(option.description).to eql(description) + end + + it "knows how to present the switch" do + expect(option.formatted_switches).to eql(" -l ") + end + end + + context "without a description" do + let(:description) { nil } + + it "knows there is no description" do + expect(option.description).to be(nil) + end + + it "knows both inputs are switches" do + expect(option.switches).to eql(switches) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/presenter_spec.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/presenter_spec.rb new file mode 100644 index 000000000000..f61ed45b5098 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/presenter_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' + +describe(Mercenary::Presenter) do + let(:supercommand) { Mercenary::Command.new(:script_name) } + let(:command) { Mercenary::Command.new(:subcommand, supercommand) } + let(:presenter) { described_class.new(command) } + + before(:each) do + command.version '1.4.2' + command.description 'Do all the things.' + command.option 'one', '-1', '--one', 'The first option' + command.option 'two', '-2', '--two', 'The second option' + command.alias :cmd + supercommand.commands[command.name] = command + end + + it "knows how to present the command" do + expect(presenter.command_presentation).to eql("script_name subcommand 1.4.2 -- Do all the things.\n\nUsage:\n\n script_name subcommand\n\nOptions:\n -1, --one The first option\n -2, --two The second option") + end + + it "knows how to present the subcommands, without duplicates for aliases" do + expect(described_class.new(supercommand).subcommands_presentation).to eql(" subcommand, cmd Do all the things.") + end + + it "knows how to present the usage" do + expect(presenter.usage_presentation).to eql(" script_name subcommand") + end + + it "knows how to present the options" do + expect(presenter.options_presentation).to eql(" -1, --one The first option\n -2, --two The second option") + end + + it "allows you to say print_* instead of *_presentation" do + expect(presenter.print_usage).to eql(presenter.usage_presentation) + expect(presenter.print_subcommands).to eql(presenter.subcommands_presentation) + expect(presenter.print_options).to eql(presenter.options_presentation) + expect(presenter.print_command).to eql(presenter.command_presentation) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/program_spec.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/program_spec.rb new file mode 100644 index 000000000000..f5d961e15a1c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/program_spec.rb @@ -0,0 +1,19 @@ +require "spec_helper" + +describe(Mercenary::Program) do + + context "a basic program" do + let(:program) { Mercenary::Program.new(:my_name) } + + it "can be created with just a name" do + expect(program.name).to eql(:my_name) + end + + it "can set its version" do + version = Mercenary::VERSION + program.version version + expect(program.version).to eq(version) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/spec_helper.rb new file mode 100644 index 000000000000..c3799855ddef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mercenary-0.3.6/spec/spec_helper.rb @@ -0,0 +1,14 @@ +lib = File.expand_path('../../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'mercenary' + +RSpec.configure do |config| + config.run_all_when_everything_filtered = true + config.filter_run :focus + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = 'random' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/.github/FUNDING.yml b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/.github/FUNDING.yml new file mode 100644 index 000000000000..13e218cbfdc1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/.github/FUNDING.yml @@ -0,0 +1 @@ +tidelift: "rubygems/mini_portile2" diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/.github/workflows/ci.yml b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/.github/workflows/ci.yml new file mode 100644 index 000000000000..cd56838db451 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/.github/workflows/ci.yml @@ -0,0 +1,62 @@ +name: Continuous Integration + +on: + push: + branches: [main] + pull_request: + types: [opened, synchronize] + branches: [main] + schedule: + - cron: "0 8 * * 5" # At 08:00 on Friday # https://crontab.guru/#0_8_*_*_5 + workflow_dispatch: + +jobs: + test-unit: + env: + MAKEFLAGS: -j2 + strategy: + matrix: + platform: [ubuntu-latest, windows-latest] + ruby: ["2.5", "2.6", "2.7", "3.0"] + runs-on: ${{ matrix.platform }} + steps: + - name: configure git crlf on windows + if: matrix.platform == 'windows-latest' + run: | + git config --system core.autocrlf false + git config --system core.eol lf + - uses: actions/checkout@v2 + - uses: MSP-Greg/setup-ruby-pkgs@v1 + with: + apt-get: _update_ build-essential cmake + mingw: _upgrade_ cmake + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - run: bundle exec rake test:unit + + test-examples: + env: + MAKEFLAGS: -j2 + strategy: + matrix: + platform: [ubuntu-latest, windows-latest] + ruby: ["3.0"] + runs-on: ${{ matrix.platform }} + steps: + - name: configure git crlf on windows + if: matrix.platform == 'windows-latest' + run: | + git config --system core.autocrlf false + git config --system core.eol lf + - uses: actions/checkout@v2 + - uses: MSP-Greg/setup-ruby-pkgs@v1 + with: + apt-get: _update_ build-essential cmake + mingw: _upgrade_ cmake + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - uses: actions/cache@v2 + with: + path: examples/ports/archives + key: ${{ matrix.platform }}-examples-${{ hashFiles('examples/Rakefile') }} + - run: bundle exec rake test:examples diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/.gitignore b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/.gitignore new file mode 100644 index 000000000000..fc3791fcaf02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/.gitignore @@ -0,0 +1,5 @@ +.bundle +Gemfile.lock +pkg +ports +tmp diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/CHANGELOG.md new file mode 100644 index 000000000000..8cc12d3fc8ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/CHANGELOG.md @@ -0,0 +1,230 @@ +## mini_portile changelog + +### 2.5.1 / 2021-04-28 + +#### Dependencies + +This release ends support for ruby < 2.3.0. If you're on 2.2.x or earlier, we strongly suggest that you find the time to upgrade, because [official support for Ruby 2.2 ended on 2018-03-31](https://www.ruby-lang.org/en/news/2018/06/20/support-of-ruby-2-2-has-ended/). + +#### Enhancements + +* `MiniPortile.execute` now takes an optional `:env` hash, which is merged into the environment variables for the subprocess. Likely this is only useful for specialized use cases. [#99] +* Experimental support for cmake-based projects extended to Windows. (Thanks, @larskanis!) + + +### 2.5.0 / 2020-02-24 + +#### Enhancements + +* When verifying GPG signatures, remove all imported pubkeys from keyring [#90] (Thanks, @hanazuki!) + + +### 2.4.0 / 2018-12-02 + +#### Enhancements + +* Skip progress report when Content-Length is unavailable. [#85] (Thanks, @eagletmt!) + + +### 2.3.0 / 2017-09-13 + +#### Enhancements + +* Verify checksums of files at extraction time (in addition to at download time). (#56) +* Clarify error message if a `tar` command can't be found. (#81) + + +### 2.2.0 / 2017-06-04 + +#### Enhancements + +* Remove MD5 hashing of configure options, not avialbale in FIPS mode. (#78) +* Add experimental support for cmake-based projects. +* Retry on HTTP failures during downloads. [#63] (Thanks, @jtarchie and @jvshahid!) +* Support Ruby 2.4 frozen string literals. +* Support applying patches for users with misconfigured git worktree. [#69] +* Support gpg signature verification of download resources. + + +### 2.1.0 / 2016-01-06 + +#### Enhancements + +* Add support for `file:` protocol for tarballs + + +#### Bugfixes + +* Raise exception on unsupported URI protocols +* Ignore git whitespace config when patching (Thanks, @e2!) (#67) + + +### 2.0.0 / 2015-11-30 + +Many thanks to @larskanis, @knu, and @kirikak2, who all contributed +code, ideas, or both to this release. + +Note that the 0.7.0.rc* series was not released as 0.7.0 final, and +instead became 2.0.0 due to backwards-incompatible behavioral changes +which can appear because rubygems doesn't enforce loading the declared +dependency version at installation-time (only run-time). + +If you use MiniPortile in an `extconf.rb` file, please make sure you're +setting a gem version constraint before `require "mini_portile2"` . + +Note also that 2.0.0 doesn't include the backwards-compatible "escaped +string" behavior from 0.7.0.rc3. + + +#### Enhancements + +* In patch task, use git(1) or patch(1), whichever is available. +* Append outputs to patch.log instead of clobbering it for every patch command. +* Take `configure_options` literally without running a subshell. + This changes allows for embedded spaces in a path, among other things. + Please unescape `configure_options` where you have been doing it yourself. +* Print last 20 lines of the given log file, for convenience. +* Allow SHA1, SHA256 and MD5 hash verification of downloads + + +#### Bugfixes + +* Fix issue when proxy username/password use escaped characters. +* Fix use of https and ftp proxy. + + +### 0.7.0.rc4 / 2015-08-24 + +* Updated tests for Windows. No functional change. Final release candidate? + + +### 0.7.0.rc3 / 2015-08-24 + +* Restore backwards-compatible behavior with respect to escaped strings. + + +### 0.7.0.rc2 / 2015-08-24 + +* Restore support for Ruby 1.9.2 +* Add Ruby 2.0.0 and Ruby 2.1.x to Appveyor suite + + +### 0.7.0.rc1 / 2015-08-24 + +Many thanks to @larskanis, @knu, and @kirikak2, who all contributed +code, ideas, or both to this release. + +#### Enhancements + +* In patch task, use git(1) or patch(1), whichever is available. +* Append outputs to patch.log instead of clobbering it for every patch command. +* Take `configure_options` literally without running a subshell. + This changes allows for embedded spaces in a path, among other things. + Please unescape `configure_options` where you have been doing it yourself. +* Print last 20 lines of the given log file, for convenience. +* Allow SHA1, SHA256 and MD5 hash verification of downloads + + +#### Bugfixes + +* Fix issue when proxy username/password use escaped characters. +* Fix use of https and ftp proxy. + + +### 0.6.2 / 2014-12-30 + +* Updated gemspec, license and README to reflect new maintainer. + + +### 0.6.1 / 2014-08-03 + +* Enhancements: + * Expand path to logfile to easier debugging on failures. + Pull #33 [marvin2k] + +### 0.6.0 / 2014-04-18 + +* Enhancements: + * Add default cert store and custom certs from `SSL_CERT_FILE` if present. + This increases compatibility with Ruby 1.8.7. + +* Bugfixes: + * Specify Accept-Encoding to make sure a raw file content is downloaded. + Pull #30. [knu] + +* Internal: + * Improve examples and use them as test harness. + +### 0.5.3 / 2014-03-24 + +* Bugfixes: + * Shell escape paths in tar command. Pull #29. [quickshiftin] + * Support older versions of tar that cannot auto-detect + the compression type. Pull #27. Closes #21. [b-dean] + * Try RbConfig's CC before fall back to 'gcc'. Ref #28. + +### 0.5.2 / 2013-10-23 + +* Bugfixes: + * Change tar detection order to support NetBSD 'gtar'. Closes #24 + * Trick 'git-apply' when applying patches on nested Git checkouts. [larskanis] + * Respect ENV's MAKE before fallback to 'make'. [larskanis] + * Respect ENV's CC variable before fallback to 'gcc'. + * Avoid non-ASCII output of GCC cause host detection issues. Closes #22 + +### 0.5.1 / 2013-07-07 + +* Bugfixes: + * Detect tar executable without shelling out. [jtimberman] + +### 0.5.0 / 2012-11-17 + +* Enhancements: + * Allow patching extracted files using `git apply`. [metaskills] + +### 0.4.1 / 2012-10-24 + +* Bugfixes: + * Syntax to process FTp binary chunks differs between Ruby 1.8.7 and 1.9.x + +### 0.4.0 / 2012-10-24 + +* Enhancements: + * Allow fetching of FTP URLs along HTTP ones. [metaskills] + +### 0.3.0 / 2012-03-23 + +* Enhancements: + * Use `gcc -v` to determine original host (platform) instead of Ruby one. + +* Deprecations: + * Dropped support for Rubies older than 1.8.7 + +### 0.2.2 / 2011-04-11 + +* Minor enhancements: + * Use LDFLAGS when activating recipes for cross-compilation. Closes #6 + +* Bugfixes: + * Remove memoization of *_path helpers. Closes #7 + +### 0.2.1 / 2011-04-06 + +* Minor enhancements: + * Provide MiniPortile#path to obtain full path to installation directory. Closes GH-5 + +### 0.2.0 / 2011-04-05 + +* Enhancements: + * Improve tar detection + * Improve and refactor configure_options + * Detect configure_options changes. Closes GH-1 + * Add recipe examples + +* Bugfixes: + * MiniPortile#target can be changed now. Closes GH-2 + * Always redirect tar output properly + +### 0.1.0 / 2011-03-08 + +* Initial release. Welcome to this world! diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/Gemfile b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/Gemfile new file mode 100644 index 000000000000..27e5e85385ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in mini_portile2.gemspec +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/LICENSE.txt new file mode 100644 index 000000000000..dcfca68578b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2011-2016 Luis Lavena and Mike Dalessio + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/README.md b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/README.md new file mode 100644 index 000000000000..0f18c13692da --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/README.md @@ -0,0 +1,261 @@ +# MiniPortile + +This documents versions 2 and up, for which the require file was +renamed to `mini_portile2`. For mini_portile versions 0.6.x and +previous, please visit +[the v0.6.x branch](https://github.com/flavorjones/mini_portile/tree/v0.6.x). + +[![Continuous Integration](https://github.com/flavorjones/mini_portile/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/flavorjones/mini_portile/actions/workflows/ci.yml) +[![Tidelift dependencies](https://tidelift.com/badges/package/rubygems/mini_portile2)](https://tidelift.com/subscription/pkg/rubygems-mini.portile2?utm_source=undefined&utm_medium=referral&utm_campaign=readme) + +* Documentation: http://www.rubydoc.info/github/flavorjones/mini_portile +* Source Code: https://github.com/flavorjones/mini_portile +* Bug Reports: https://github.com/flavorjones/mini_portile/issues + +This project is a minimalistic implementation of a port/recipe system +**for developers**. + +Because _"Works on my machine"_ is unacceptable for a library maintainer. + + +## Not Another Package Management System + +`mini_portile2` is not a general package management system. It is not +aimed to replace apt, macports or homebrew. + +It's intended primarily to make sure that you, as the developer of a +library, can reproduce a user's dependencies and environment by +specifying a specific version of an underlying dependency that you'd +like to use. + +So, if a user says, "This bug happens on my system that uses libiconv +1.13.1", `mini_portile2` should make it easy for you to download, +compile and link against libiconv 1.13.1; and run your test suite +against it. + +This scenario might be simplified with something like this: + +``` +rake compile LIBICONV_VERSION=1.13.1 +``` + +(For your homework, you can make libiconv version be taken from the +appropriate `ENV` variables.) + + + +## Sounds easy, but where's the catch? + +At this time `mini_portile2` only supports **autoconf**- or +**configure**-based projects. (That is, it assumes the library you +want to build contains a `configure` script, which all the +autoconf-based libraries do.) + +As of v2.2.0, there is experimental support for **CMake**-based +projects. We welcome your feedback on this, particularly for Windows +platforms. + + +### How to use (for autoconf projects) + +Now that you know the catch, and you're still reading this, here is a +quick example: + +```ruby +gem "mini_portile2", "~> 2.0.0" # NECESSARY if used in extconf.rb. see below. +require "mini_portile2" +recipe = MiniPortile.new("libiconv", "1.13.1") +recipe.files = ["http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz"] +recipe.cook +recipe.activate +``` + +The gem version constraint makes sure that your extconf.rb is +protected against possible backwards-incompatible changes to +`mini_portile2`. This constraint is REQUIRED if you're using +`mini_portile2` within a gem installation process (e.g., extconf.rb), +because Bundler doesn't enforce gem version constraints at +install-time (only at run-time. + +`#cook` will download, extract, patch, configure and compile the +library into a namespaced structure. + +`#activate` ensures GCC will find this library and prefer it over a +system-wide installation. + + +### How to use (for cmake projects) + +Same as above, but instead of `MiniPortile.new`, call `MiniPortileCMake.new`. + + +### Directory Structure Conventions + +`mini_portile2` follows the principle of **convention over configuration** and +established a folder structure where is going to place files and perform work. + +Take the above example, and let's draw some picture: + +``` +mylib + |-- ports + | |-- archives + | | `-- libiconv-1.13.1.tar.gz + | `-- <platform> + | `-- libiconv + | `-- 1.13.1 + | |-- bin + | |-- include + | `-- lib + `-- tmp + `-- <platform> + `-- ports +``` + +In above structure, `<platform>` refers to the architecture that +represents the operating system you're using (e.g. i686-linux, +i386-mingw32, etc). + +Inside the platform folder, `mini_portile2` will store the artifacts +that result from the compilation process. The library is versioned so +you can keep multiple versions around on disk without clobbering +anything. + +`archives` is where downloaded source files are cached. It is +recommended you avoid trashing that folder to avoid downloading the +same file multiple times (save bandwidth, save the world). + +`tmp` is where compilation is performed and can be safely discarded. + +Use the recipe's `#path` to obtain the full path to the installation +directory: + +```ruby +recipe.cook +recipe.path # => /home/luis/projects/myapp/ports/i686-linux/libiconv/1.13.1 +``` + +### How can I combine this with my compilation task? + +In the simplest case, your rake `compile` task will depend on +`mini_portile2` compilation and most important, activation. + +Example: + +```ruby +task :libiconv do + recipe = MiniPortile.new("libiconv", "1.13.1") + recipe.files << { + url: "http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz"], + sha256: "55a36168306089009d054ccdd9d013041bfc3ab26be7033d107821f1c4949a49" + } + checkpoint = ".#{recipe.name}-#{recipe.version}.installed" + + unless File.exist?(checkpoint) + recipe.cook + touch checkpoint + end + + recipe.activate +end + +task :compile => [:libiconv] do + # ... your library's compilation task ... +end +``` + +The above example will: + +* **download** and verify integrity the sources only once +* **compile** the library only once (using a timestamp file) +* ensure compiled library is **activated** +* make the compile task depend upon compiled library activation + +As an exercise for the reader, you could specify the libiconv version +in an environment variable or a configuration file. + +### Download verification +MiniPortile supports HTTPS, HTTP, FTP and FILE sources for download. +The integrity of the downloaded file can be verified per hash value or PGP signature. +This is particular important for untrusted sources (non-HTTPS). + +#### Hash digest verification +MiniPortile can verify the integrity of the downloaded file per SHA256, SHA1 or MD5 hash digest. + +```ruby + recipe.files << { + url: "http://your.host/file.tar.bz2", + sha256: "<32 byte hex value>", + } +``` + +#### PGP signature verification +MiniPortile can also verify the integrity of the downloaded file per PGP signature. + +```ruby + public_key = <<-EOT + -----BEGIN PGP PUBLIC KEY BLOCK----- + Version: GnuPG v1 + + mQENBE7SKu8BCADQo6x4ZQfAcPlJMLmL8zBEBUS6GyKMMMDtrTh3Yaq481HB54oR + [...] + -----END PGP PUBLIC KEY BLOCK----- + EOT + + recipe.files << { + url: "http://your.host/file.tar.bz2", + gpg: { + key: public_key, + signature_url: "http://your.host/file.tar.bz2.sig" + } + } +``` + +Please note, that the `gpg` executable is required to verify the signature. +It is therefore recommended to use the hash verification method instead of PGP, when used in `extconf.rb` while `gem install`. + +### Native and/or Cross Compilation + +The above example covers the normal use case: compiling dependencies +natively. + +`MiniPortile` also covers another use case, which is the +cross-compilation of the dependencies to be used as part of a binary +gem compilation. + +It is the perfect complementary tool for +[`rake-compiler`](https://github.com/rake-compiler/rake-compiler) and +its `cross` rake task. + +Depending on your usage of `rake-compiler`, you will need to use +`host` to match the installed cross-compiler toolchain. + +Please refer to the examples directory for simplified and practical usage. + + +### Supported Scenarios + +As mentioned before, `MiniPortile` requires a GCC compiler +toolchain. This has been tested against Ubuntu, OSX and even Windows +(RubyInstaller with DevKit) + + +## Support + +The bug tracker is available here: + +* https://github.com/flavorjones/mini_portile/issues + +Consider subscribing to [Tidelift][tidelift] which provides license assurances and timely security notifications for your open source dependencies, including Loofah. [Tidelift][tidelift] subscriptions also help the Loofah maintainers fund our [automated testing](https://ci.nokogiri.org) which in turn allows us to ship releases, bugfixes, and security updates more often. + + [tidelift]: https://tidelift.com/subscription/pkg/rubygems-mini.portile2?utm_source=rubygems-mini.portile2&utm_medium=referral&utm_campaign=enterprise + + +## Security + +See [`SECURITY.md`](SECURITY.md) for vulnerability reporting details. + + +## License + +This library is licensed under MIT license. Please see LICENSE.txt for details. diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/Rakefile b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/Rakefile new file mode 100644 index 000000000000..87949adc8663 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/Rakefile @@ -0,0 +1,25 @@ +require "rake/clean" +require "bundler/gem_tasks" + +namespace :test do + desc "Test MiniPortile by running unit tests" + task :unit do + sh "ruby -w -W2 -I. -Ilib -e \"#{Dir["test/test_*.rb"].map { |f| "require '#{f}';" }.join}\" -- #{ENV["TESTOPTS"]} -v" + end + + desc "Test MiniPortile by compiling examples" + task :examples do + Dir.chdir("examples") do + sh "rake ports:all" + end + end +end + +task :clean do + FileUtils.rm_rf ["examples/ports", "examples/tmp"], :verbose => true +end + +desc "Run all tests" +task :test => ["test:unit", "test:examples"] + +task :default => [:test] diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/SECURITY.md b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/SECURITY.md new file mode 100644 index 000000000000..f8022d0b0002 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/SECURITY.md @@ -0,0 +1,13 @@ +# Security and Vulnerability Reporting + +The mini_portile core contributors take security very seriously and investigate all reported vulnerabilities. + +If you would like to report a vulnerablity or have a security concern regarding mini_portile, please [report it via Tidelift](https://tidelift.com/security). + +Your report will be acknowledged within 48 hours, and you'll receive a more detailed response within 96 hours indicating next steps in handling your report. + +If you have not received a reply to your submission within 96 hours, Contact the current security coordinator, Mike Dalessio <mike.dalessio@gmail.com>. + +The information you share with the mini_portile core contributors as part of this process will be kept confidential within the team, unless or until we need to share information upstream with our dependent libraries' core teams, at which point we will notify you. + +If a vulnerability is first reported by you, we will credit you with the discovery in the public disclosure. diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2.rb new file mode 100644 index 000000000000..8617ba892b03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2.rb @@ -0,0 +1,3 @@ +require "mini_portile2/version" +require "mini_portile2/mini_portile" +require "mini_portile2/mini_portile_cmake" diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2/mini_portile.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2/mini_portile.rb new file mode 100644 index 000000000000..5bd9052aaeb3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2/mini_portile.rb @@ -0,0 +1,581 @@ +require 'rbconfig' +require 'net/http' +require 'net/https' +require 'net/ftp' +require 'fileutils' +require 'tempfile' +require 'digest' +require 'open-uri' +require 'cgi' +require 'rbconfig' +require 'shellwords' + +# Monkey patch for Net::HTTP by ruby open-uri fix: +# https://github.com/ruby/ruby/commit/58835a9 +class Net::HTTP + private + remove_method(:edit_path) + def edit_path(path) + if proxy? + if path.start_with?("ftp://") || use_ssl? + path + else + "http://#{addr_port}#{path}" + end + else + path + end + end +end + +class MiniPortile + attr_reader :name, :version, :original_host + attr_writer :configure_options + attr_accessor :host, :files, :patch_files, :target, :logger + + def self.windows? + RbConfig::CONFIG['target_os'] =~ /mswin|mingw/ + end + + # GNU MinGW compiled Ruby? + def self.mingw? + RbConfig::CONFIG['target_os'] =~ /mingw/ + end + + # MS Visual-C compiled Ruby? + def self.mswin? + RbConfig::CONFIG['target_os'] =~ /mswin/ + end + + def initialize(name, version) + @name = name + @version = version + @target = 'ports' + @files = [] + @patch_files = [] + @log_files = {} + @logger = STDOUT + + @original_host = @host = detect_host + end + + def download + files_hashs.each do |file| + download_file(file[:url], file[:local_path]) + verify_file(file) + end + end + + def extract + files_hashs.each do |file| + verify_file(file) + extract_file(file[:local_path], tmp_path) + end + end + + def apply_patch(patch_file) + ( + # Not a class variable because closures will capture self. + @apply_patch ||= + case + when which('git') + lambda { |file| + message "Running git apply with #{file}... " + # By --work-tree=. git-apply uses the current directory as + # the project root and will not search upwards for .git. + execute('patch', ["git", "--git-dir=.", "--work-tree=.", "apply", "--whitespace=warn", file], :initial_message => false) + } + when which('patch') + lambda { |file| + message "Running patch with #{file}... " + execute('patch', ["patch", "-p1", "-i", file], :initial_message => false) + } + else + raise "Failed to complete patch task; patch(1) or git(1) is required." + end + ).call(patch_file) + end + + def patch + @patch_files.each do |full_path| + next unless File.exist?(full_path) + apply_patch(full_path) + end + end + + def configure_options + @configure_options ||= configure_defaults + end + + def configure + return if configured? + + cache_file = File.join(tmp_path, 'configure.options_cache') + File.open(cache_file, "w") { |f| f.write computed_options.to_s } + + if RUBY_PLATFORM=~/mingw|mswin/ + # Windows doesn't recognize the shebang. + execute('configure', %w(sh ./configure) + computed_options) + else + execute('configure', %w(./configure) + computed_options) + end + end + + def compile + execute('compile', make_cmd) + end + + def install + return if installed? + execute('install', %Q(#{make_cmd} install)) + end + + def downloaded? + missing = files_hashs.detect do |file| + !File.exist?(file[:local_path]) + end + + missing ? false : true + end + + def configured? + configure = File.join(work_path, 'configure') + makefile = File.join(work_path, 'Makefile') + cache_file = File.join(tmp_path, 'configure.options_cache') + + stored_options = File.exist?(cache_file) ? File.read(cache_file) : "" + current_options = computed_options.to_s + + (current_options == stored_options) && newer?(makefile, configure) + end + + def installed? + makefile = File.join(work_path, 'Makefile') + target_dir = Dir.glob("#{port_path}/*").find { |d| File.directory?(d) } + + newer?(target_dir, makefile) + end + + def cook + download unless downloaded? + extract + patch + configure unless configured? + compile + install unless installed? + + return true + end + + def activate + lib_path = File.join(port_path, "lib") + vars = { + 'PATH' => File.join(port_path, 'bin'), + 'CPATH' => File.join(port_path, 'include'), + 'LIBRARY_PATH' => lib_path + }.reject { |env, path| !File.directory?(path) } + + output "Activating #{@name} #{@version} (from #{port_path})..." + vars.each do |var, path| + full_path = File.expand_path(path) + + # turn into a valid Windows path (if required) + full_path.gsub!(File::SEPARATOR, File::ALT_SEPARATOR) if File::ALT_SEPARATOR + + # save current variable value + old_value = ENV[var] || '' + + unless old_value.include?(full_path) + ENV[var] = "#{full_path}#{File::PATH_SEPARATOR}#{old_value}" + end + end + + # rely on LDFLAGS when cross-compiling + if File.exist?(lib_path) && (@host != @original_host) + full_path = File.expand_path(lib_path) + + old_value = ENV.fetch("LDFLAGS", "") + + unless old_value.include?(full_path) + ENV["LDFLAGS"] = "-L#{full_path} #{old_value}".strip + end + end + end + + def path + File.expand_path(port_path) + end + +private + + def tmp_path + "tmp/#{@host}/ports/#{@name}/#{@version}" + end + + def port_path + "#{@target}/#{@host}/#{@name}/#{@version}" + end + + def archives_path + "#{@target}/archives" + end + + def work_path + Dir.glob("#{tmp_path}/*").find { |d| File.directory?(d) } + end + + def configure_defaults + [ + "--host=#{@host}", # build for specific target (host) + "--enable-static", # build static library + "--disable-shared" # disable generation of shared object + ] + end + + def configure_prefix + "--prefix=#{File.expand_path(port_path)}" + end + + def computed_options + [ + configure_options, # customized or default options + configure_prefix, # installation target + ].flatten + end + + def files_hashs + @files.map do |file| + hash = case file + when String + { :url => file } + when Hash + file.dup + else + raise ArgumentError, "files must be an Array of Stings or Hashs" + end + + url = hash.fetch(:url){ raise ArgumentError, "no url given" } + filename = File.basename(url) + hash[:local_path] = File.join(archives_path, filename) + hash + end + end + + KEYRING_NAME = "mini_portile_keyring.gpg" + + def verify_file(file) + if file.has_key?(:gpg) + gpg = file[:gpg] + + signature_url = gpg[:signature_url] || "#{file[:url]}.asc" + signature_file = file[:local_path] + ".asc" + # download the signature file + download_file(signature_url, signature_file) + + gpg_exe = which('gpg2') || which('gpg') || raise("Neither GPG nor GPG2 is installed") + + # import the key into our own keyring + gpg_status = IO.popen([gpg_exe, "--status-fd", "1", "--no-default-keyring", "--keyring", KEYRING_NAME, "--import"], "w+") do |io| + io.write gpg[:key] + io.close_write + io.read + end + key_ids = gpg_status.scan(/\[GNUPG:\] IMPORT_OK \d+ (?<key_id>[0-9a-f]+)/i).map(&:first) + raise "invalid gpg key provided" if key_ids.empty? + + # verify the signature against our keyring + gpg_status = IO.popen([gpg_exe, "--status-fd", "1", "--no-default-keyring", "--keyring", KEYRING_NAME, "--verify", signature_file, file[:local_path]], &:read) + + # remove the key from our keyring + key_ids.each do |key_id| + IO.popen([gpg_exe, "--batch", "--yes", "--no-default-keyring", "--keyring", KEYRING_NAME, "--delete-keys", key_id], &:read) + raise "unable to delete the imported key" unless $?.exitstatus==0 + end + + raise "signature mismatch" unless gpg_status.match(/^\[GNUPG:\] VALIDSIG/) + + else + digest = case + when exp=file[:sha256] then Digest::SHA256 + when exp=file[:sha1] then Digest::SHA1 + when exp=file[:md5] then Digest::MD5 + end + if digest + is = digest.file(file[:local_path]).hexdigest + unless is == exp.downcase + raise "Downloaded file '#{file[:local_path]}' has wrong hash: expected: #{exp} is: #{is}" + end + end + end + end + + def log_file(action) + @log_files[action] ||= + File.expand_path("#{action}.log", tmp_path).tap { |file| + File.unlink(file) if File.exist?(file) + } + end + + TAR_EXECUTABLES = %w[gtar bsdtar tar basic-bsdtar] + def tar_exe + @@tar_exe ||= begin + TAR_EXECUTABLES.find { |c| + which(c) + } or raise("tar not found - please make sure that one of the following commands is in the PATH: #{TAR_EXECUTABLES.join(", ")}") + end + end + + def tar_compression_switch(filename) + case File.extname(filename) + when '.gz', '.tgz' + 'z' + when '.bz2', '.tbz2' + 'j' + when '.Z' + 'Z' + else + '' + end + end + + # From: http://stackoverflow.com/a/5471032/7672 + # Thanks, Mislav! + # + # Cross-platform way of finding an executable in the $PATH. + # + # which('ruby') #=> /usr/bin/ruby + def which(cmd) + exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] + ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| + exts.each { |ext| + exe = File.join(path, "#{cmd}#{ext}") + return exe if File.executable? exe + } + end + return nil + end + + def detect_host + return @detect_host if defined?(@detect_host) + + begin + ENV["LC_ALL"], old_lc_all = "C", ENV["LC_ALL"] + + output = `#{gcc_cmd} -v 2>&1` + if m = output.match(/^Target\: (.*)$/) + @detect_host = m[1] + end + + @detect_host + ensure + ENV["LC_ALL"] = old_lc_all + end + end + + def extract_file(file, target) + filename = File.basename(file) + FileUtils.mkdir_p target + + message "Extracting #{filename} into #{target}... " + execute('extract', [tar_exe, "#{tar_compression_switch(filename)}xf", file, "-C", target], {:cd => Dir.pwd, :initial_message => false}) + end + + # command could be an array of args, or one string containing a command passed to the shell. See + # Process.spawn for more information. + def execute(action, command, command_opts={}) + opt_message = command_opts.fetch(:initial_message, true) + opt_debug = command_opts.fetch(:debug, false) + opt_cd = command_opts.fetch(:cd) { work_path } + opt_env = command_opts.fetch(:env) { Hash.new } + + log_out = log_file(action) + + Dir.chdir(opt_cd) do + output "DEBUG: env is #{opt_env.inspect}" if opt_debug + output "DEBUG: command is #{command.inspect}" if opt_debug + message "Running '#{action}' for #{@name} #{@version}... " if opt_message + + if Process.respond_to?(:spawn) && ! RbConfig.respond_to?(:java) + options = {[:out, :err]=>[log_out, "a"]} + output "DEBUG: options are #{options.inspect}" if opt_debug + args = [opt_env, command, options].flatten + pid = spawn(*args) + Process.wait(pid) + else + env_args = opt_env.map { |k,v| "#{k}=#{v}".shellescape }.join(" ") + c = if command.kind_of?(Array) + command.map(&:shellescape).join(" ") + else + command + end + redirected = %Q{env #{env_args} #{c} > #{log_out.shellescape} 2>&1} + output "DEBUG: final command is #{redirected.inspect}" if opt_debug + system redirected + end + + if $?.success? + output "OK" + return true + else + if File.exist? log_out + output "ERROR, review '#{log_out}' to see what happened. Last lines are:" + output("=" * 72) + log_lines = File.readlines(log_out) + output(log_lines[-[log_lines.length, 20].min .. -1]) + output("=" * 72) + end + raise "Failed to complete #{action} task" + end + end + end + + def newer?(target, checkpoint) + if (target && File.exist?(target)) && (checkpoint && File.exist?(checkpoint)) + File.mtime(target) > File.mtime(checkpoint) + else + false + end + end + + # print out a message with the logger + def message(text) + @logger.print text + @logger.flush + end + + # print out a message using the logger but return to a new line + def output(text = "") + @logger.puts text + @logger.flush + end + + # Slighly modified from RubyInstaller uri_ext, Rubinius configure + # and adaptations of Wayne's RailsInstaller + def download_file(url, full_path, count = 3) + return if File.exist?(full_path) + uri = URI.parse(url) + + case uri.scheme.downcase + when /ftp/ + download_file_ftp(uri, full_path) + when /http|https/ + download_file_http(url, full_path, count) + when /file/ + download_file_file(uri, full_path) + else + raise ArgumentError.new("Unsupported protocol for #{url}") + end + rescue Exception => e + File.unlink full_path if File.exist?(full_path) + raise e + end + + def download_file_http(url, full_path, count = 3) + filename = File.basename(full_path) + with_tempfile(filename, full_path) do |temp_file| + progress = 0 + total = 0 + params = { + "Accept-Encoding" => 'identity', + :content_length_proc => lambda{|length| total = length }, + :progress_proc => lambda{|bytes| + if total + new_progress = (bytes * 100) / total + message "\rDownloading %s (%3d%%) " % [filename, new_progress] + progress = new_progress + else + # Content-Length is unavailable because Transfer-Encoding is chunked + message "\rDownloading %s " % [filename] + end + } + } + proxy_uri = URI.parse(url).scheme.downcase == 'https' ? + ENV["https_proxy"] : + ENV["http_proxy"] + if proxy_uri + _, userinfo, _p_host, _p_port = URI.split(proxy_uri) + if userinfo + proxy_user, proxy_pass = userinfo.split(/:/).map{|s| CGI.unescape(s) } + params[:proxy_http_basic_authentication] = + [proxy_uri, proxy_user, proxy_pass] + end + end + + begin + OpenURI.open_uri(url, 'rb', params) do |io| + temp_file << io.read + end + output + rescue OpenURI::HTTPRedirect => redirect + raise "Too many redirections for the original URL, halting." if count <= 0 + count = count - 1 + return download_file(redirect.url, full_path, count-1) + rescue => e + count = count - 1 + puts "#{count} retrie(s) left for #{filename}" + if count > 0 + sleep 1 + return download_file_http(url, full_path, count) + end + + output e.message + return false + end + end + end + + def download_file_file(uri, full_path) + FileUtils.mkdir_p File.dirname(full_path) + FileUtils.cp uri.path, full_path + end + + def download_file_ftp(uri, full_path) + filename = File.basename(uri.path) + with_tempfile(filename, full_path) do |temp_file| + progress = 0 + total = 0 + params = { + :content_length_proc => lambda{|length| total = length }, + :progress_proc => lambda{|bytes| + new_progress = (bytes * 100) / total + message "\rDownloading %s (%3d%%) " % [filename, new_progress] + progress = new_progress + } + } + if ENV["ftp_proxy"] + _, userinfo, _p_host, _p_port = URI.split(ENV['ftp_proxy']) + if userinfo + proxy_user, proxy_pass = userinfo.split(/:/).map{|s| CGI.unescape(s) } + params[:proxy_http_basic_authentication] = + [ENV['ftp_proxy'], proxy_user, proxy_pass] + end + end + OpenURI.open_uri(uri, 'rb', params) do |io| + temp_file << io.read + end + output + end + rescue Net::FTPError + return false + end + + def with_tempfile(filename, full_path) + temp_file = Tempfile.new("download-#{filename}") + temp_file.binmode + yield temp_file + temp_file.close + File.unlink full_path if File.exist?(full_path) + FileUtils.mkdir_p File.dirname(full_path) + FileUtils.mv temp_file.path, full_path, :force => true + end + + def gcc_cmd + cc = ENV["CC"] || RbConfig::CONFIG["CC"] || "gcc" + return cc.dup + end + + def make_cmd + m = ENV['MAKE'] || ENV['make'] || 'make' + return m.dup + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2/mini_portile_cmake.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2/mini_portile_cmake.rb new file mode 100644 index 000000000000..ca903f763c41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2/mini_portile_cmake.rb @@ -0,0 +1,42 @@ +require 'mini_portile2/mini_portile' + +class MiniPortileCMake < MiniPortile + def configure_prefix + "-DCMAKE_INSTALL_PREFIX=#{File.expand_path(port_path)}" + end + + def configure_defaults + if MiniPortile.mswin? + ['-G', 'NMake Makefiles'] + elsif MiniPortile.mingw? + ['-G', 'MSYS Makefiles'] + else + [] + end + end + + def configure + return if configured? + + cache_file = File.join(tmp_path, 'configure.options_cache') + File.open(cache_file, "w") { |f| f.write computed_options.to_s } + + execute('configure', %w(cmake) + computed_options + ["."]) + end + + def configured? + configure = File.join(work_path, 'configure') + makefile = File.join(work_path, 'CMakefile') + cache_file = File.join(tmp_path, 'configure.options_cache') + + stored_options = File.exist?(cache_file) ? File.read(cache_file) : "" + current_options = computed_options.to_s + + (current_options == stored_options) && newer?(makefile, configure) + end + + def make_cmd + return "nmake" if MiniPortile.mswin? + super + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2/version.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2/version.rb new file mode 100644 index 000000000000..b50dfd475acb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/lib/mini_portile2/version.rb @@ -0,0 +1,3 @@ +class MiniPortile + VERSION = "2.5.1" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/mini_portile2.gemspec b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/mini_portile2.gemspec new file mode 100644 index 000000000000..ce41c995189d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/mini_portile2.gemspec @@ -0,0 +1,42 @@ +# coding: utf-8 +lib = File.expand_path("../lib", __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require "mini_portile2/version" + +Gem::Specification.new do |spec| + spec.name = "mini_portile2" + spec.version = MiniPortile::VERSION + + spec.authors = ["Luis Lavena", "Mike Dalessio", "Lars Kanis"] + spec.email = "mike.dalessio@gmail.com" + + spec.summary = "Simplistic port-like solution for developers" + spec.description = "Simplistic port-like solution for developers. It provides a standard and simplified way to compile against dependency libraries without messing up your system." + + spec.homepage = "https://github.com/flavorjones/mini_portile" + spec.licenses = ["MIT"] + + begin + spec.files = `git ls-files -z`.split("\x0") + rescue Exception => e + warn "WARNING: could not set spec.files: #{e.class}: #{e}" + end + + # omit the `examples` directory from the gem, because it's large and + # not necessary to be packaged in the gem. + example_files = spec.files.grep(%r{^examples/}) + spec.files -= example_files + + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r{^(test|spec|features|examples)/}) + spec.require_paths = ["lib"] + + spec.add_development_dependency "bundler", "~> 2.1" + spec.add_development_dependency "minitar", "~> 0.7" + spec.add_development_dependency "minitest", "~> 5.11" + spec.add_development_dependency "minitest-hooks", "~> 1.5.0" + spec.add_development_dependency "rake", "~> 13.0" + spec.add_development_dependency "webrick", "~> 1.0" + + spec.required_ruby_version = ">= 2.3.0" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/git/config b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/git/config new file mode 100644 index 000000000000..c788a7c51dd1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/git/config @@ -0,0 +1,4 @@ +[core] + whitespace=tab-in-indent,-indent-with-non-tab +[apply] + whitespace=fix diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/gpg-fixtures/data b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/gpg-fixtures/data new file mode 100644 index 000000000000..9daeafb9864c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/gpg-fixtures/data @@ -0,0 +1 @@ +test diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/gpg-fixtures/data.asc b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/gpg-fixtures/data.asc new file mode 100644 index 000000000000..ab689110e6ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/gpg-fixtures/data.asc @@ -0,0 +1,9 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1 + +iJwEAAECAAYFAlcFOD8ACgkQZeg+SWTDcLNIswP/XvVRoJ+eQ2u2v+WjXdBBKBSW +pzM216aJPRBxPl98xNUUKjqga+tjKmIHJn5T4CIxHqis1toPxtE5tKnc6cVO1aqY +bCUfkWyt/A3qRHQuniRUWSBKZWdk+j3AopTpd3i/r/s0pDj3bMHJ7bDOTsEskNcM +KpgFfNM1ieFRQmIWPWg= +=kbKc +-----END PGP SIGNATURE----- diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/gpg-fixtures/data.invalid.asc b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/gpg-fixtures/data.invalid.asc new file mode 100644 index 000000000000..16b2613e026f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/gpg-fixtures/data.invalid.asc @@ -0,0 +1,9 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1 + +iJwEAQECAAYFAlcFLEgACgkQZeg+SWTDcLPVwgQAg8KTI91Ryx38YplzgWV9tUPj +o7J7IEzb8faE7m2mgtq8m62DvA4h/PJzmbh1EJJ4VkO+A4O2LVh/bTgnyYXv+kMu +sEmvK35PnAC8r7pv98VSbMEXyV/rK3+uGhTvnXZYkULvMVYkN/EHIh2bCQJ3R14X +MY8El95QST8/dR/yBkw= +=qbod +-----END PGP SIGNATURE----- diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/patch 1.diff b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/patch 1.diff new file mode 100644 index 000000000000..8a2a62e1323e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/patch 1.diff @@ -0,0 +1,7 @@ +diff --git "a/patch 1.txt" "b/patch 1.txt" +new file mode 100644 +index 0000000..70885e4 +--- /dev/null ++++ "b/patch 1.txt" +@@ -0,0 +1 @@ ++ change 1 diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test mini portile-1.0.0/configure b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test mini portile-1.0.0/configure new file mode 100644 index 000000000000..f12b178c1ce9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test mini portile-1.0.0/configure @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +ruby -e "p ARGV" -- "$@" > configure.txt + +cat <<EOT >Makefile +all: + ruby -e "p ARGV" -- "\$@" > compile.txt +install: + ruby -e "p ARGV" -- "\$@" > install.txt +EOT diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test-cmake-1.0/CMakeLists.txt b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test-cmake-1.0/CMakeLists.txt new file mode 100644 index 000000000000..551efbd8b076 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test-cmake-1.0/CMakeLists.txt @@ -0,0 +1,7 @@ +# CMakeLists files in this project can +# refer to the root source directory of the project as ${HELLO_SOURCE_DIR} and +# to the root binary directory of the project as ${HELLO_BINARY_DIR}. +cmake_minimum_required (VERSION 2.8.7) +project (HELLO) +add_executable (hello hello.c) +install (TARGETS hello DESTINATION bin) diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test-cmake-1.0/hello.c b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test-cmake-1.0/hello.c new file mode 100644 index 000000000000..770f4dd077c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test-cmake-1.0/hello.c @@ -0,0 +1,4 @@ +int main(int argc, char** argv) +{ + return 0 ; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test-download-archive.tar.gz b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test-download-archive.tar.gz new file mode 100644 index 000000000000..fafd745150eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/assets/test-download-archive.tar.gz @@ -0,0 +1 @@ +TEST FILE diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/helper.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/helper.rb new file mode 100644 index 000000000000..df72306b0031 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/helper.rb @@ -0,0 +1,60 @@ +require 'minitest/autorun' +require 'minitest/unit' +require 'minitest/spec' +require 'minitest/hooks/test' +require 'webrick' +require 'fileutils' +require 'zlib' +require 'archive/tar/minitar' +require 'fileutils' +require 'erb' +require 'mini_portile2' + +class TestCase < Minitest::Test + include Minitest::Hooks + + HTTP_PORT = 23523 + + attr_accessor :webrick + + def start_webrick(path) + @webrick = WEBrick::HTTPServer.new(:Port => HTTP_PORT, :DocumentRoot => path).tap do |w| + Thread.new do + w.start + end + until w.status==:Running + sleep 0.1 + end + end + end + + def stop_webrick + if w=@webrick + w.shutdown + until w.status==:Stop + sleep 0.1 + end + end + end + + def create_tar(tar_path, assets_path, directory) + FileUtils.mkdir_p(File.dirname(tar_path)) + Zlib::GzipWriter.open(tar_path) do |fdtgz| + Dir.chdir(assets_path) do + Archive::Tar::Minitar.pack(directory, fdtgz) + end + end + end + + def work_dir(r=recipe) + "tmp/#{r.host}/ports/#{r.name}/#{r.version}/#{r.name}-#{r.version}" + end + + def with_custom_git_dir(dir) + old = ENV['GIT_DIR'] + ENV['GIT_DIR'] = dir + yield + ensure + ENV['GIT_DIR'] = old + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_cmake.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_cmake.rb new file mode 100644 index 000000000000..ca40f552a460 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_cmake.rb @@ -0,0 +1,60 @@ +require File.expand_path('../helper', __FILE__) + +class TestCMake < TestCase + attr_accessor :assets_path, :tar_path, :recipe + + def before_all + super + @assets_path = File.expand_path("../assets", __FILE__) + @tar_path = File.expand_path("../../tmp/test-cmake-1.0.tar.gz", __FILE__) + + # remove any previous test files + FileUtils.rm_rf("tmp") + + create_tar(@tar_path, @assets_path, "test-cmake-1.0") + start_webrick(File.dirname(@tar_path)) + + @recipe = MiniPortileCMake.new("test-cmake", "1.0").tap do |recipe| + recipe.files << "http://localhost:#{HTTP_PORT}/#{ERB::Util.url_encode(File.basename(@tar_path))}" + recipe.patch_files << File.join(@assets_path, "patch 1.diff") + git_dir = File.join(@assets_path, "git") + with_custom_git_dir(git_dir) do + recipe.cook + end + end + end + + def after_all + super + stop_webrick + # leave test files for inspection + end + + def exe_name + case + when MiniPortile.windows? then "hello.exe" + else "hello" + end + end + + def test_cmake_inherits_from_base + assert(MiniPortileCMake <= MiniPortile) + end + + def test_configure + cmakecache = File.join(work_dir, "CMakeCache.txt") + assert File.exist?(cmakecache), cmakecache + + assert_includes(IO.read(cmakecache), "CMAKE_INSTALL_PREFIX:PATH=#{recipe.path}") + end + + def test_compile + binary = File.join(work_dir, exe_name) + assert File.exist?(binary), binary + end + + def test_install + binary = File.join(recipe.path, "bin", exe_name) + assert File.exist?(binary), binary + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_cook.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_cook.rb new file mode 100644 index 000000000000..ecec6287e5de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_cook.rb @@ -0,0 +1,115 @@ +require File.expand_path('../helper', __FILE__) + +class TestCook < TestCase + attr_accessor :assets_path, :tar_path, :recipe + + def before_all + super + @assets_path = File.expand_path("../assets", __FILE__) + @tar_path = File.expand_path("../../tmp/test mini portile-1.0.0.tar.gz", __FILE__) + + FileUtils.rm_rf("tmp") # remove any previous test files + + create_tar(@tar_path, @assets_path, "test mini portile-1.0.0") + start_webrick(File.dirname(@tar_path)) + + @recipe = MiniPortile.new("test mini portile", "1.0.0").tap do |recipe| + recipe.files << "http://localhost:#{HTTP_PORT}/#{ERB::Util.url_encode(File.basename(@tar_path))}" + recipe.patch_files << File.join(@assets_path, "patch 1.diff") + recipe.configure_options << "--option=\"path with 'space'\"" + git_dir = File.join(@assets_path, "git") + with_custom_git_dir(git_dir) do + recipe.cook + end + end + end + + def after_all + super + stop_webrick + FileUtils.rm_rf("tmp") # remove test files + end + + def test_download + download = "ports/archives/test%20mini%20portile-1.0.0.tar.gz" + assert File.exist?(download), download + end + + def test_untar + configure = File.join(work_dir, "configure") + assert File.exist?(configure), configure + assert_match( /^#!\/bin\/sh/, IO.read(configure) ) + end + + def test_patch + patch1 = File.join(work_dir, "patch 1.txt") + assert File.exist?(patch1), patch1 + assert_match( /^\tchange 1/, IO.read(patch1) ) + end + + def test_configure + txt = File.join(work_dir, "configure.txt") + assert File.exist?(txt), txt + opts = recipe.configure_options + ["--prefix=#{recipe.path}"] + assert_equal( opts.inspect, IO.read(txt).chomp ) + end + + def test_compile + txt = File.join(work_dir, "compile.txt") + assert File.exist?(txt), txt + assert_equal( ["all"].inspect, IO.read(txt).chomp ) + end + + def test_install + txt = File.join(work_dir, "install.txt") + assert File.exist?(txt), txt + assert_equal( ["install"].inspect, IO.read(txt).chomp ) + end +end + +class TestCookWithBrokenGitDir < TestCase + # + # this is a test for #69 + # https://github.com/flavorjones/mini_portile/issues/69 + # + attr_accessor :assets_path, :tar_path, :recipe + + def before_all + super + @assets_path = File.expand_path("../assets", __FILE__) + @tar_path = File.expand_path("../../tmp/test-mini-portile-1.0.0.tar.gz", __FILE__) + + @git_dir = File.join(@assets_path, "git-broken") + FileUtils.rm_rf @git_dir + FileUtils.mkdir_p @git_dir + Dir.chdir(@git_dir) do + File.open ".git", "w" do |f| + f.write "gitdir: /nonexistent" + end + end + + create_tar(@tar_path, @assets_path, "test mini portile-1.0.0") + + @recipe = MiniPortile.new("test mini portile", "1.0.0").tap do |recipe| + recipe.files << "file://#{@tar_path}" + recipe.patch_files << File.join(@assets_path, "patch 1.diff") + recipe.configure_options << "--option=\"path with 'space'\"" + end + + Dir.chdir(@git_dir) do + @recipe.cook + end + end + + def after_all + FileUtils.rm_rf @git_dir + end + + def test_patch + Dir.chdir(@git_dir) do + patch1 = File.join(work_dir, "patch 1.txt") + assert File.exist?(patch1), patch1 + assert_match( /^\tchange 1/, IO.read(patch1) ) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_digest.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_digest.rb new file mode 100644 index 000000000000..c7c272ef73a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_digest.rb @@ -0,0 +1,215 @@ +require File.expand_path('../helper', __FILE__) + +class TestDigest < TestCase + attr :assets_path, :tar_path, :recipe + + def before_all + super + @assets_path = File.expand_path("../assets", __FILE__) + @tar_path = File.expand_path("../../tmp/test-digest-1.0.0.tar.gz", __FILE__) + + # remove any previous test files + FileUtils.rm_rf("tmp") + + create_tar(@tar_path, @assets_path, "test mini portile-1.0.0") + start_webrick(File.dirname(@tar_path)) + end + + def after_all + super + stop_webrick + # leave test files for inspection + end + + def setup + super + FileUtils.rm_rf("ports/archives") + @recipe = MiniPortile.new("test-digest", "1.0.0") + end + + def download_with_digest(key, klass) + @recipe.files << { + :url => "http://localhost:#{webrick.config[:Port]}/#{ERB::Util.url_encode(File.basename(tar_path))}", + key => klass.file(tar_path).hexdigest, + } + @recipe.download + end + + def download_with_wrong_digest(key) + @recipe.files << { + :url => "http://localhost:#{webrick.config[:Port]}/#{ERB::Util.url_encode(File.basename(tar_path))}", + key => "0011223344556677", + } + assert_raises(RuntimeError){ @recipe.download } + end + + def test_sha256 + download_with_digest(:sha256, Digest::SHA256) + end + + def test_wrong_sha256 + download_with_wrong_digest(:sha256) + end + + def test_sha1 + download_with_digest(:sha1, Digest::SHA1) + end + + def test_wrong_sha1 + download_with_wrong_digest(:sha1) + end + + def test_md5 + download_with_digest(:md5, Digest::MD5) + end + + def test_wrong_md5 + download_with_wrong_digest(:md5) + end + + def public_key + <<-KEY +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mI0EVwUhJQEEAMYxFhgaAdM2Ul5r+XfpqAaI7SOxB14eRjhFjhchy4ylgVxetyLq +di3zeANXBIHsLBl7quYTlnmhJr/+GQRkCnXWiUp0tJsBVzGM3puK7c534gakEUH6 +AlDtj5p3IeygzSyn8u7KORv+ainXfhwkvTO04mJmxAb2uT8ngKYFdPa1ABEBAAG0 +J1Rlc3QgTWluaXBvcnRpbGUgPHRlc3RAbWluaXBvcnRpbGUub3JnPoi4BBMBAgAi +BQJXBSElAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBl6D5JZMNwswAK +A/90Cdb+PX21weBR2Q6uR06M/alPexuXXyJL8ZcwbQMJ/pBBgcS5/h1+rQkBI/CN +qpXdDlw2Xys2k0sNwdjIw3hmYRzBrddXlCSW3Sifq/hS+kfPZ1snQmIjCgy1Xky5 +QGCcPUxBUxzmra88LakkDO+euKK3hcrfeFIi611lTum1NLiNBFcFISUBBADoyY6z +2PwH3RWUbqv0VX1s3/JO3v3xMjCRKPlFwsNwLTBtZoWfR6Ao1ajeCuZKfzNKIQ2I +rn86Rcqyrq4hTj+7BTWjkIPOBthjiL1YqbEBtX7jcYRkYvdQz/IG2F4zVV6X4AAR +Twx7qaXNt67ArzbHCe5gLNRUK6e6OArkahMv7QARAQABiJ8EGAECAAkFAlcFISUC +GwwACgkQZeg+SWTDcLNFiwP/TR33ClqWOz0mpjt0xPEoZ0ORmV6fo4sjjzgQoHH/ +KTdsabJbGp8oLQGW/mx3OxgbsAkyZymb5H5cjaF4HtSd4cxI5t1C9ZS/ytN8pqfR +e29SBje8DAAJn2l57s2OddXLPQ0DUwCcdNEaqgHwSk/Swxc7K+IpfvjLKHKUZZBP +4Ko= +=SVWi +-----END PGP PUBLIC KEY BLOCK----- +KEY + end + + def test_with_valid_gpg_signature + data_file = File.expand_path(File.join(File.dirname(__FILE__), 'assets', 'gpg-fixtures', 'data')) + + @recipe.files << { + :url => "file://#{data_file}", + :gpg => { + :key => public_key, + :signature_url => "file://#{data_file}.asc" + } + } + @recipe.download + end + + def test_optional_gpg_signature_url + data_file = File.expand_path(File.join(File.dirname(__FILE__), 'assets', 'gpg-fixtures', 'data')) + + @recipe.files << { + :url => "file://#{data_file}", + :gpg => { + :key => public_key + } + } + @recipe.download + end + + def test_with_invalid_gpg_signature + data_file = File.expand_path(File.join(File.dirname(__FILE__), 'assets', 'gpg-fixtures', 'data')) + + @recipe.files << { + :url => "file://#{data_file}", + :gpg => { + :key => public_key, + :signature_url => "file://#{data_file}.invalid.asc" + } + } + exception = assert_raises(RuntimeError){ + @recipe.download + } + assert_equal("signature mismatch", exception.message) + end + + def test_with_invalid_key + data_file = File.expand_path(File.join(File.dirname(__FILE__), 'assets', 'gpg-fixtures', 'data')) + + @recipe.files << { + :url => "file://#{data_file}", + :gpg => { + :key => "thisisaninvalidkey", + :signature_url => "file://#{data_file}.asc" + } + } + exception = assert_raises(RuntimeError){ @recipe.download } + assert_equal("invalid gpg key provided", exception.message) + end + + def test_with_different_key_than_one_used_to_sign + puts "################" + + key = <<-KEY +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQENBE7SKu8BCADQo6x4ZQfAcPlJMLmL8zBEBUS6GyKMMMDtrTh3Yaq481HB54oR +0cpKL05Ff9upjrIzLD5TJUCzYYM9GQOhguDUP8+ZU9JpSz3yO2TvH7WBbUZ8FADf +hblmmUBLNgOWgLo3W+FYhl3mz1GFS2Fvid6Tfn02L8CBAj7jxbjL1Qj/OA/WmLLc +m6BMTqI7IBlYW2vyIOIHasISGiAwZfp0ucMeXXvTtt14LGa8qXVcFnJTdwbf03AS +ljhYrQnKnpl3VpDAoQt8C68YCwjaNJW59hKqWB+XeIJ9CW98+EOAxLAFszSyGanp +rCqPd0numj9TIddjcRkTA/ZbmCWK+xjpVBGXABEBAAG0IU1heGltIERvdW5pbiA8 +bWRvdW5pbkBtZG91bmluLnJ1PohGBBARAgAGBQJO01Y/AAoJEOzw6QssFyCDVyQA +n3qwTZlcZgyyzWu9Cs8gJ0CXREaSAJ92QjGLT9DijTcbB+q9OS/nl16Z/IhGBBAR +AgAGBQJO02JDAAoJEKk3YTmlJMU+P64AnjCKEXFelSVMtgefJk3+vpyt3QX1AKCH +9M3MbTWPeDUL+MpULlfdyfvjj4heBBARCAAGBQJRCTwgAAoJEFGFCWhsfl6CzF0B +AJsQ3DJbtGcZ+0VIcM2a06RRQfBvIHqm1A/1WSYmObLGAP90lxWlNjSugvUUlqTk +YEEgRTGozgixSyMWGJrNwqgMYokBOAQTAQIAIgUCTtIq7wIbAwYLCQgHAwIGFQgC +CQoLBBYCAwECHgECF4AACgkQUgqZk6HAUvj+iwf/b4FS6zVzJ5T0v1vcQGD4ZzXe +D5xMC4BJW414wVMU15rfX7aCdtoCYBNiApPxEd7SwiyxWRhRA9bikUq87JEgmnyV +0iYbHZvCvc1jOkx4WR7E45t1Mi29KBoPaFXA9X5adZkYcOQLDxa2Z8m6LGXnlF6N +tJkxQ8APrjZsdrbDvo3HxU9muPcq49ydzhgwfLwpUs11LYkwB0An9WRPuv3jporZ +/XgI6RfPMZ5NIx+FRRCjn6DnfHboY9rNF6NzrOReJRBhXCi6I+KkHHEnMoyg8XET +9lVkfHTOl81aIZqrAloX3/00TkYWyM2zO9oYpOg6eUFCX/Lw4MJZsTcT5EKVxIkC +HAQQAQIABgUCVJ1r4wAKCRDrF/Z0x5pAovwnD/9m8aiSDoUo9IbDSx0345a7IsmN +KlEqtz4AQxbqxXV3yTANBbhWWnsX6e7PLbJfzpNE9aoa72upwTcStpk6vlPea0AV +ed83FdVsfxwXm/Sf5iySZKy93PexAZfw7KvXu0ETWxi1YZjFNtNsdUIiuJ4upLNo +h3urG8NC9uIQYgZef9NPTztmj77saerUrdXt3PQmnYp8ti0NWElE3KzgjoC1fIEZ +Na4LZSbEnzdadtuWDehQs1JFxuX/lZhHuVdKgagaMn35j4xubDgy6S9iqRsgJ2Jo +U5o/4B+n5h53uAek4eXAEi0MX3k3RxgAf+ofKiri+oG6zIZcoSpUzj+bOUtVSZwt +3lsOahDNx5Hd+Atx9iZsylqa/l9iowb+lHfzFAx/58jFhBumn69rNpe9JnJa+vCb +YIsKTiKoJirFSGEgAkcTVXAvo/aD+XiWzc/QP/l+B2X4e5mqR7dF7xLZ5uFbXA0j +AfWMyBtvy/XwBT1SxROXpmCt7J0C9wX5l+3vmTpo6BH6S78BYM+eN/NNZW6eJwAG +km0y3hI1um7pwmzsaE9Pi1xCYEhn6lcLrwPaGXUBCeoTDnO47mrBMAFOmSe8uoRf +6nYd/TPvXV2Zw0YhjvBzlIfkl5MlJ+j4AZy1hn7Mqe1O//bRd0KKLjjhMQ6tjR6Y +sbUJgKqfgA+W9qxUcLkBDQRO0irvAQgA0LjCc8S6oZzjiap2MjRNhRFA5BYjXZRZ +BdKF2VP74avt2/RELq8GW0n7JWmKn6vvrXabEGLyfkCngAhTq9tJ/K7LPx/bmlO5 ++jboO/1inH2BTtLiHjAXvicXZk3oaZt2Sotx5mMI3yzpFQRVqZXsi0LpUTPJEh3o +S8IdYRjslQh1A7P5hfCZwtzwb/hKm8upODe/ITUMuXeWfLuQj/uEU6wMzmfMHb+j +lYMWtb+v98aJa2FODeKPmWCXLa7bliXp1SSeBOEfIgEAmjM6QGlDx5sZhr2Ss2xS +PRdZ8DqD7oiRVzmstX1YoxEzC0yXfaefC7SgM0nMnaTvYEOYJ9CH3wARAQABiQEf +BBgBAgAJBQJO0irvAhsMAAoJEFIKmZOhwFL4844H/jo8icCcS6eOWvnen7lg0FcC +o1fIm4wW3tEmkQdchSHECJDq7pgTloN65pwB5tBoT47cyYNZA9eTfJVgRc74q5ce +xKOYrMC3KuAqWbwqXhkVs0nkWxnOIidTHSXvBZfDFA4Idwte94Thrzf8Pn8UESud +TiqrWoCBXk2UyVsl03gJblSJAeJGYPPeo+Yj6m63OWe2+/S2VTgmbPS/RObn0Aeg +7yuff0n5+ytEt2KL51gOQE2uIxTCawHr12PsllPkbqPk/PagIttfEJqn9b0CrqPC +3HREePb2aMJ/Ctw/76COwn0mtXeIXLCTvBmznXfaMKllsqbsy2nCJ2P2uJjOntw= +=4JAR +-----END PGP PUBLIC KEY BLOCK----- +KEY + + data_file = File.expand_path(File.join(File.dirname(__FILE__), 'assets', 'gpg-fixtures', 'data')) + + @recipe.files << { + :url => "file://#{data_file}", + :gpg => { + :key => key, + :signature_url => "file://#{data_file}.asc" + } + } + exception = assert_raises(RuntimeError){ @recipe.download } + assert_equal("signature mismatch", exception.message) + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_download.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_download.rb new file mode 100644 index 000000000000..173789b0cda5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_download.rb @@ -0,0 +1,71 @@ +require File.expand_path('../helper', __FILE__) + +describe "recipe download" do + include Minitest::Hooks + + attr :recipe + + def server_must_receive_connection(connections = 3, &block) + request_count = 0 + + server = TCPServer.open('localhost', TestCase::HTTP_PORT) + thread = Thread.new do + connections.times do + conn = server.accept + request_count += 1 + conn.puts "CONNECTION SUCESSFULLY MADE" rescue SystemCallError + conn.close + end + end + + block.call + + thread.kill + server.close + + request_count.must_be :>, 0 + end + + before do + @request_count = 0 + @recipe = MiniPortile.new("test-download", "1.1.1") + end + + describe "urls" do + it "ftp" do + @recipe.files << "ftp://localhost:#{TestCase::HTTP_PORT}/foo" + server_must_receive_connection 1 do + @recipe.download + end + end + + it "handles http" do + @recipe.files << "http://localhost:#{TestCase::HTTP_PORT}/foo" + server_must_receive_connection 3 do + @recipe.download + end + end + + it "handles https" do + @recipe.files << "https://localhost:#{TestCase::HTTP_PORT}/foo" + server_must_receive_connection 3 do + @recipe.download + end + end + + it "file" do + dest = "ports/archives/test-download-archive.tar.gz" + FileUtils.rm_f dest + path = File.expand_path(File.join(File.dirname(__FILE__), "assets", "test-download-archive.tar.gz")) + @recipe.files << "file://#{path}" + @recipe.download + assert File.exist?(dest) + Digest::MD5.file(dest).hexdigest.must_equal "5deffb997041bbb5f11bdcafdbb47975" + end + + it "other" do + @recipe.files << "foo://foo" + proc { @recipe.download }.must_raise ArgumentError + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_execute.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_execute.rb new file mode 100644 index 000000000000..1564d53e3e13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_execute.rb @@ -0,0 +1,39 @@ +require_relative "helper" + +class TestExecute < TestCase + def setup + super + @env = {"TEST_ENV_VAR1" => "VAR1_VALUE", "TEST_ENV_VAR2" => "VAR2_VALUE"} + @recipe = MiniPortile.new("test_execute", "1.0.0") + @log_path = @recipe.send(:tmp_path) + FileUtils.mkdir_p File.join(@log_path, "subdir") # normally created by `download` + end + + def test_execute_one_big_string_arg + class << @recipe + def execute_with_env(env) + execute("testenv1", + %Q(ruby -e "puts ENV['TEST_ENV_VAR1'].inspect ; exit 0"), + {:env => env, :initial_message => false, :debug => true}) + end + end + + @recipe.execute_with_env(@env) + + assert_equal("VAR1_VALUE".inspect, IO.read(File.join(@log_path, "testenv1.log")).chomp) + end + + def test_execute_array_args + class << @recipe + def execute_with_env(env) + execute("testenv2", + ["ruby", "-e", "puts ENV['TEST_ENV_VAR2'].inspect"], + {:env => env, :initial_message => false, :debug => true}) + end + end + + @recipe.execute_with_env(@env) + + assert_equal("VAR2_VALUE".inspect, IO.read(File.join(@log_path, "testenv2.log")).chomp) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_proxy.rb b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_proxy.rb new file mode 100644 index 000000000000..3bb47390aa60 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/mini_portile2-2.5.1/test/test_proxy.rb @@ -0,0 +1,121 @@ +# Encoding: utf-8 + +require File.expand_path('../helper', __FILE__) +require 'socket' + +class TestProxy < TestCase + def with_dummy_proxy(username=nil, password=nil) + gs = TCPServer.open('localhost', 0) + th = Thread.new do + s = gs.accept + gs.close + begin + req = ''.dup + while (l=s.gets) && !l.chomp.empty? + req << l + end + req + ensure + s.close + end + end + + if username && password + yield "http://#{ERB::Util.url_encode(username)}:#{ERB::Util.url_encode(password)}@localhost:#{gs.addr[1]}" + else + yield "http://localhost:#{gs.addr[1]}" + end + + # Set timeout for reception of the request + Thread.new do + sleep 1 + th.kill + end + th.value + end + + def setup + # remove any download files + FileUtils.rm_rf("port/archives") + end + + def assert_proxy_auth(expected, request) + if request =~ /^Proxy-Authorization: Basic (.*)/ + assert_equal 'user: @name:@12: üMp', $1.unpack("m")[0].force_encoding(__ENCODING__) + else + flunk "No authentication request" + end + end + + def test_http_proxy + recipe = MiniPortile.new("test http_proxy", "1.0.0") + recipe.files << "http://myserver/path/to/tar.gz" + request = with_dummy_proxy do |url, thread| + ENV['http_proxy'] = url + recipe.download rescue RuntimeError + ENV.delete('http_proxy') + end + assert_match(/GET http:\/\/myserver\/path\/to\/tar.gz/, request) + end + + def test_http_proxy_with_basic_auth + recipe = MiniPortile.new("test http_proxy", "1.0.0") + recipe.files << "http://myserver/path/to/tar.gz" + request = with_dummy_proxy('user: @name', '@12: üMp') do |url, thread| + ENV['http_proxy'] = url + recipe.download rescue RuntimeError + ENV.delete('http_proxy') + end + + assert_match(/GET http:\/\/myserver\/path\/to\/tar.gz/, request) + assert_proxy_auth 'user: @name:@12: üMp', request + end + + def test_https_proxy + recipe = MiniPortile.new("test https_proxy", "1.0.0") + recipe.files << "https://myserver/path/to/tar.gz" + request = with_dummy_proxy do |url, thread| + ENV['https_proxy'] = url + recipe.download rescue RuntimeError + ENV.delete('https_proxy') + end + assert_match(/CONNECT myserver:443/, request) + end + + def test_https_proxy_with_basic_auth + recipe = MiniPortile.new("test https_proxy", "1.0.0") + recipe.files << "https://myserver/path/to/tar.gz" + request = with_dummy_proxy('user: @name', '@12: üMp') do |url, thread| + ENV['https_proxy'] = url + recipe.download rescue RuntimeError + ENV.delete('https_proxy') + end + + assert_match(/CONNECT myserver:443/, request) + assert_proxy_auth 'user: @name:@12: üMp', request + end + + def test_ftp_proxy + recipe = MiniPortile.new("test ftp_proxy", "1.0.0") + recipe.files << "ftp://myserver/path/to/tar.gz" + request = with_dummy_proxy do |url, thread| + ENV['ftp_proxy'] = url + recipe.download rescue RuntimeError + ENV.delete('ftp_proxy') + end + assert_match(/GET ftp:\/\/myserver\/path\/to\/tar.gz/, request) + end + + def test_ftp_proxy_with_basic_auth + recipe = MiniPortile.new("test ftp_proxy", "1.0.0") + recipe.files << "ftp://myserver/path/to/tar.gz" + request = with_dummy_proxy('user: @name', '@12: üMp') do |url, thread| + ENV['ftp_proxy'] = url + recipe.download rescue RuntimeError + ENV.delete('ftp_proxy') + end + + assert_match(/GET ftp:\/\/myserver\/path\/to\/tar.gz/, request) + assert_proxy_auth 'user: @name:@12: üMp', request + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/LICENSE.txt new file mode 100644 index 000000000000..0e7ecd8b35fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016-present Parker Moore and the minima contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/README.md b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/README.md new file mode 100644 index 000000000000..0bfd20d88c87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/README.md @@ -0,0 +1,218 @@ +# minima + +*Minima is a one-size-fits-all Jekyll theme for writers*. It's Jekyll's default (and first) theme. It's what you get when you run `jekyll new`. + +[Theme preview](https://jekyll.github.io/minima/) + +![minima theme preview](/screenshot.png) + +## Installation + +Add this line to your Jekyll site's Gemfile: + +```ruby +gem "minima" +``` + +And add this line to your Jekyll site: + +```yaml +theme: minima +``` + +And then execute: + + $ bundle + + +## Contents At-A-Glance + +Minima has been scaffolded by the `jekyll new-theme` command and therefore has all the necessary files and directories to have a new Jekyll site up and running with zero-configuration. + +### Layouts + +Refers to files within the `_layouts` directory, that define the markup for your theme. + + - `default.html` &mdash; The base layout that lays the foundation for subsequent layouts. The derived layouts inject their contents into this file at the line that says ` {{ content }} ` and are linked to this file via [FrontMatter](https://jekyllrb.com/docs/frontmatter/) declaration `layout: default`. + - `home.html` &mdash; The layout for your landing-page / home-page / index-page. [[More Info.](#home-layout)] + - `page.html` &mdash; The layout for your documents that contain FrontMatter, but are not posts. + - `post.html` &mdash; The layout for your posts. + +### Includes + +Refers to snippets of code within the `_includes` directory that can be inserted in multiple layouts (and another include-file as well) within the same theme-gem. + + - `disqus_comments.html` &mdash; Code to markup disqus comment box. + - `footer.html` &mdash; Defines the site's footer section. + - `google-analytics.html` &mdash; Inserts Google Analytics module (active only in production environment). + - `head.html` &mdash; Code-block that defines the `<head></head>` in *default* layout. + - `header.html` &mdash; Defines the site's main header section. By default, pages with a defined `title` attribute will have links displayed here. + +### Sass + +Refers to `.scss` files within the `_sass` directory that define the theme's styles. + + - `minima.scss` &mdash; The core file imported by preprocessed `main.scss`, it defines the variable defaults for the theme and also further imports sass partials to supplement itself. + - `minima/_base.scss` &mdash; Resets and defines base styles for various HTML elements. + - `minima/_layout.scss` &mdash; Defines the visual style for various layouts. + - `minima/_syntax-highlighting.scss` &mdash; Defines the styles for syntax-highlighting. + +### Assets + +Refers to various asset files within the `assets` directory. +Contains the `main.scss` that imports sass files from within the `_sass` directory. This `main.scss` is what gets processed into the theme's main stylesheet `main.css` called by `_layouts/default.html` via `_includes/head.html`. + +This directory can include sub-directories to manage assets of similar type, and will be copied over as is, to the final transformed site directory. + +### Plugins + +Minima comes with [`jekyll-seo-tag`](https://github.com/jekyll/jekyll-seo-tag) plugin preinstalled to make sure your website gets the most useful meta tags. See [usage](https://github.com/jekyll/jekyll-seo-tag#usage) to know how to set it up. + +## Usage + +### Home Layout + +`home.html` is a flexible HTML layout for the site's landing-page / home-page / index-page. <br/> + +#### Main Heading and Content-injection + +From Minima v2.2 onwards, the *home* layout will inject all content from your `index.md` / `index.html` **before** the **`Posts`** heading. This will allow you to include non-posts related content to be published on the landing page under a dedicated heading. *We recommended that you title this section with a Heading2 (`##`)*. + +Usually the `site.title` itself would suffice as the implicit 'main-title' for a landing-page. But, if your landing-page would like a heading to be explicitly displayed, then simply define a `title` variable in the document's front matter and it will be rendered with an `<h1>` tag. + +#### Post Listing + +This section is optional from Minima v2.2 onwards.<br/> +It will be automatically included only when your site contains one or more valid posts or drafts (if the site is configured to `show_drafts`). + +The title for this section is `Posts` by default and rendered with an `<h2>` tag. You can customize this heading by defining a `list_title` variable in the document's front matter. + +-- + +### Customization + +To override the default structure and style of minima, simply create the concerned directory at the root of your site, copy the file you wish to customize to that directory, and then edit the file. +e.g., to override the [`_includes/head.html `](_includes/head.html) file to specify a custom style path, create an `_includes` directory, copy `_includes/head.html` from minima gem folder to `<yoursite>/_includes` and start editing that file. + +The site's default CSS has now moved to a new place within the gem itself, [`assets/main.scss`](assets/main.scss). To **override the default CSS**, the file has to exist at your site source. Do either of the following: +- Create a new instance of `main.scss` at site source. + - Create a new file `main.scss` at `<your-site>/assets/` + - Add the frontmatter dashes, and + - Add `@import "minima";`, to `<your-site>/assets/main.scss` + - Add your custom CSS. +- Download the file from this repo + - Create a new file `main.scss` at `<your-site>/assets/` + - Copy the contents at [assets/main.scss](assets/main.scss) onto the `main.scss` you just created, and edit away! +- Copy directly from Minima 2.0 gem + - Go to your local minima gem installation directory ( run `bundle show minima` to get the path to it ). + - Copy the `assets/` folder from there into the root of `<your-site>` + - Change whatever values you want, inside `<your-site>/assets/main.scss` + +-- + +### Customize navigation links + +This allows you to set which pages you want to appear in the navigation area and configure order of the links. + +For instance, to only link to the `about` and the `portfolio` page, add the following to you `_config.yml`: + +```yaml +header_pages: + - about.md + - portfolio.md +``` + +-- + +### Change default date format + +You can change the default date format by specifying `site.minima.date_format` +in `_config.yml`. + +``` +# Minima date format +# refer to http://shopify.github.io/liquid/filters/date/ if you want to customize this +minima: + date_format: "%b %-d, %Y" +``` + +-- + +### Enabling comments (via Disqus) + +Optionally, if you have a Disqus account, you can tell Jekyll to use it to show a comments section below each post. + +To enable it, add the following lines to your Jekyll site: + +```yaml + disqus: + shortname: my_disqus_shortname +``` + +You can find out more about Disqus' shortnames [here](https://help.disqus.com/customer/portal/articles/466208). + +Comments are enabled by default and will only appear in production, i.e., `JEKYLL_ENV=production` + +If you don't want to display comments for a particular post you can disable them by adding `comments: false` to that post's YAML Front Matter. + +-- + +### Social networks + +You can add links to the accounts you have on other sites, with respective icon, by adding one or more of the following options in your config: + +```yaml +twitter_username: jekyllrb +github_username: jekyll +dribbble_username: jekyll +facebook_username: jekyll +flickr_username: jekyll +instagram_username: jekyll +linkedin_username: jekyll +pinterest_username: jekyll +youtube_username: jekyll +googleplus_username: +jekyll +rss: rss + +mastodon: + - username: jekyll + instance: example.com + - username: jekyll2 + instance: example.com +``` + +-- + +### Enabling Google Analytics + +To enable Google Analytics, add the following lines to your Jekyll site: + +```yaml + google_analytics: UA-NNNNNNNN-N +``` + +Google Analytics will only appear in production, i.e., `JEKYLL_ENV=production` + +-- + +### Enabling Excerpts on the Home Page + +To display post-excerpts on the Home Page, simply add the following to your `_config.yml`: + +```yaml +show_excerpts: true +``` + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/jekyll/minima. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. + +## Development + +To set up your environment to develop this theme, run `script/bootstrap`. + +To test your theme, run `script/server` (or `bundle exec jekyll serve`) and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme and the contents. As you make modifications, your site will regenerate and you should see the changes in the browser after a refresh. + +## License + +The theme is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/disqus_comments.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/disqus_comments.html new file mode 100644 index 000000000000..d9400f2de194 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/disqus_comments.html @@ -0,0 +1,20 @@ +{%- if page.comments != false and jekyll.environment == "production" -%} + + <div id="disqus_thread"></div> + <script> + var disqus_config = function () { + this.page.url = '{{ page.url | absolute_url }}'; + this.page.identifier = '{{ page.url | absolute_url }}'; + }; + + (function() { + var d = document, s = d.createElement('script'); + + s.src = 'https://{{ site.disqus.shortname }}.disqus.com/embed.js'; + + s.setAttribute('data-timestamp', +new Date()); + (d.head || d.body).appendChild(s); + })(); + </script> + <noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript> +{%- endif -%} diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/footer.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/footer.html new file mode 100644 index 000000000000..db72885e91f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/footer.html @@ -0,0 +1,35 @@ +<footer class="site-footer h-card"> + <data class="u-url" href="{{ "/" | relative_url }}"></data> + + <div class="wrapper"> + + <h2 class="footer-heading">{{ site.title | escape }}</h2> + + <div class="footer-col-wrapper"> + <div class="footer-col footer-col-1"> + <ul class="contact-list"> + <li class="p-name"> + {%- if site.author -%} + {{ site.author | escape }} + {%- else -%} + {{ site.title | escape }} + {%- endif -%} + </li> + {%- if site.email -%} + <li><a class="u-email" href="mailto:{{ site.email }}">{{ site.email }}</a></li> + {%- endif -%} + </ul> + </div> + + <div class="footer-col footer-col-2"> + {%- include social.html -%} + </div> + + <div class="footer-col footer-col-3"> + <p>{{- site.description | escape -}}</p> + </div> + </div> + + </div> + +</footer> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/google-analytics.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/google-analytics.html new file mode 100644 index 000000000000..e9afb2093b55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/google-analytics.html @@ -0,0 +1,12 @@ +<script> +if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) { + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + + ga('create', '{{ site.google_analytics }}', 'auto'); + ga('send', 'pageview'); +} +</script> + diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/head.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/head.html new file mode 100644 index 000000000000..899e96e446ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/head.html @@ -0,0 +1,11 @@ +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + {%- seo -%} + <link rel="stylesheet" href="{{ "/assets/main.css" | relative_url }}"> + {%- feed_meta -%} + {%- if jekyll.environment == 'production' and site.google_analytics -%} + {%- include google-analytics.html -%} + {%- endif -%} +</head> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/header.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/header.html new file mode 100644 index 000000000000..658531d86991 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/header.html @@ -0,0 +1,30 @@ +<header class="site-header" role="banner"> + + <div class="wrapper"> + {%- assign default_paths = site.pages | map: "path" -%} + {%- assign page_paths = site.header_pages | default: default_paths -%} + <a class="site-title" rel="author" href="{{ "/" | relative_url }}">{{ site.title | escape }}</a> + + {%- if page_paths -%} + <nav class="site-nav"> + <input type="checkbox" id="nav-trigger" class="nav-trigger" /> + <label for="nav-trigger"> + <span class="menu-icon"> + <svg viewBox="0 0 18 15" width="18px" height="15px"> + <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/> + </svg> + </span> + </label> + + <div class="trigger"> + {%- for path in page_paths -%} + {%- assign my_page = site.pages | where: "path", path | first -%} + {%- if my_page.title -%} + <a class="page-link" href="{{ my_page.url | relative_url }}">{{ my_page.title | escape }}</a> + {%- endif -%} + {%- endfor -%} + </div> + </nav> + {%- endif -%} + </div> +</header> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-github.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-github.html new file mode 100644 index 000000000000..e501a16b1878 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-github.html @@ -0,0 +1 @@ +<a href="https://github.com/{{ include.username }}"><span class="icon icon--github">{% include icon-github.svg %}</span><span class="username">{{ include.username }}</span></a> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-github.svg b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-github.svg new file mode 100644 index 000000000000..e6c5f6dfd6c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-github.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 16 16" width="16px" height="16px"><path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/></svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-twitter.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-twitter.html new file mode 100644 index 000000000000..e623dbd6efc5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-twitter.html @@ -0,0 +1 @@ +<a href="https://twitter.com/{{ include.username }}"><span class="icon icon--twitter">{% include icon-twitter.svg %}</span><span class="username">{{ include.username }}</span></a> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-twitter.svg b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-twitter.svg new file mode 100644 index 000000000000..efc0ecf6781d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/icon-twitter.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 16 16" width="16px" height="16px"><path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/></svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/social.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/social.html new file mode 100644 index 000000000000..44046b866538 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_includes/social.html @@ -0,0 +1,14 @@ +<ul class="social-media-list"> + {%- if site.dribbble_username -%}<li><a href="https://dribbble.com/{{ site.dribbble_username| cgi_escape | escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#dribbble' | relative_url }}"></use></svg> <span class="username">{{ site.dribbble_username| escape }}</span></a></li>{%- endif -%} + {%- if site.facebook_username -%}<li><a href="https://www.facebook.com/{{ site.facebook_username| cgi_escape | escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#facebook' | relative_url }}"></use></svg> <span class="username">{{ site.facebook_username| escape }}</span></a></li>{%- endif -%} + {%- if site.flickr_username -%}<li><a href="https://www.flickr.com/photos/{{ site.flickr_username| cgi_escape | escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#flickr' | relative_url }}"></use></svg> <span class="username">{{ site.flickr_username| escape }}</span></a></li>{%- endif -%} + {%- if site.github_username -%}<li><a href="https://github.com/{{ site.github_username| cgi_escape | escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#github' | relative_url }}"></use></svg> <span class="username">{{ site.github_username| escape }}</span></a></li>{%- endif -%} + {%- if site.instagram_username -%}<li><a href="https://instagram.com/{{ site.instagram_username| cgi_escape | escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#instagram' | relative_url }}"></use></svg> <span class="username">{{ site.instagram_username| escape }}</span></a></li>{%- endif -%} + {%- if site.linkedin_username -%}<li><a href="https://www.linkedin.com/in/{{ site.linkedin_username| cgi_escape | escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#linkedin' | relative_url }}"></use></svg> <span class="username">{{ site.linkedin_username| escape }}</span></a></li>{%- endif -%} + {%- if site.pinterest_username -%}<li><a href="https://www.pinterest.com/{{ site.pinterest_username| cgi_escape | escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#pinterest' | relative_url }}"></use></svg> <span class="username">{{ site.pinterest_username| escape }}</span></a></li>{%- endif -%} + {%- for mst in site.mastodon -%}{%- if mst.username and mst.instance -%}<li><a href="https://{{ mst.instance| cgi_escape | escape}}/@{{mst.username}}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#mastodon' | relative_url }}"></use></svg> <span class="username">{{ mst.username|escape }}</span></a></li>{%- endif -%}{%- endfor -%} + {%- if site.twitter_username -%}<li><a href="https://www.twitter.com/{{ site.twitter_username| cgi_escape | escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#twitter' | relative_url }}"></use></svg> <span class="username">{{ site.twitter_username| escape }}</span></a></li>{%- endif -%} + {%- if site.youtube_username -%}<li><a href="https://youtube.com/{{ site.youtube_username| cgi_escape | escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#youtube' | relative_url }}"></use></svg> <span class="username">{{ site.youtube_username| escape }}</span></a></li>{%- endif -%} + {%- if site.googleplus_username -%}<li><a href="https://plus.google.com/{{ site.googleplus_username| escape }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#googleplus' | relative_url }}"></use></svg> <span class="username">{{ site.googleplus_username| escape }}</span></a></li>{%- endif -%} + {%- if site.rss -%}<li><a href="{{ 'feed.xml' | relative_url }}"><svg class="svg-icon"><use xlink:href="{{ '/assets/minima-social-icons.svg#rss' | relative_url }}"></use></svg> <span>{{ site.rss | escape }}</span></a></li>{%- endif -%} +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/default.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/default.html new file mode 100644 index 000000000000..58e141b746bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/default.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html lang="{{ page.lang | default: site.lang | default: "en" }}"> + + {%- include head.html -%} + + <body> + + {%- include header.html -%} + + <main class="page-content" aria-label="Content"> + <div class="wrapper"> + {{ content }} + </div> + </main> + + {%- include footer.html -%} + + </body> + +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/home.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/home.html new file mode 100644 index 000000000000..8f8ac79cf649 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/home.html @@ -0,0 +1,34 @@ +--- +layout: default +--- + +<div class="home"> + {%- if page.title -%} + <h1 class="page-heading">{{ page.title }}</h1> + {%- endif -%} + + {{ content }} + + {%- if site.posts.size > 0 -%} + <h2 class="post-list-heading">{{ page.list_title | default: "Posts" }}</h2> + <ul class="post-list"> + {%- for post in site.posts -%} + <li> + {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%} + <span class="post-meta">{{ post.date | date: date_format }}</span> + <h3> + <a class="post-link" href="{{ post.url | relative_url }}"> + {{ post.title | escape }} + </a> + </h3> + {%- if site.show_excerpts -%} + {{ post.excerpt }} + {%- endif -%} + </li> + {%- endfor -%} + </ul> + + <p class="rss-subscribe">subscribe <a href="{{ "/feed.xml" | relative_url }}">via RSS</a></p> + {%- endif -%} + +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/page.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/page.html new file mode 100644 index 000000000000..01e4b2a93b8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/page.html @@ -0,0 +1,14 @@ +--- +layout: default +--- +<article class="post"> + + <header class="post-header"> + <h1 class="post-title">{{ page.title | escape }}</h1> + </header> + + <div class="post-content"> + {{ content }} + </div> + +</article> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/post.html b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/post.html new file mode 100644 index 000000000000..abf9696da787 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_layouts/post.html @@ -0,0 +1,27 @@ +--- +layout: default +--- +<article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting"> + + <header class="post-header"> + <h1 class="post-title p-name" itemprop="name headline">{{ page.title | escape }}</h1> + <p class="post-meta"> + <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished"> + {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%} + {{ page.date | date: date_format }} + </time> + {%- if page.author -%} + • <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span class="p-author h-card" itemprop="name">{{ page.author }}</span></span> + {%- endif -%}</p> + </header> + + <div class="post-content e-content" itemprop="articleBody"> + {{ content }} + </div> + + {%- if site.disqus.shortname -%} + {%- include disqus_comments.html -%} + {%- endif -%} + + <a class="u-url" href="{{ page.url | relative_url }}" hidden></a> +</article> diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima.scss b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima.scss new file mode 100644 index 000000000000..cb0865b1a27a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima.scss @@ -0,0 +1,51 @@ +@charset "utf-8"; + +// Define defaults for each variable. + +$base-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default; +$base-font-size: 16px !default; +$base-font-weight: 400 !default; +$small-font-size: $base-font-size * 0.875 !default; +$base-line-height: 1.5 !default; + +$spacing-unit: 30px !default; + +$text-color: #111 !default; +$background-color: #fdfdfd !default; +$brand-color: #2a7ae2 !default; + +$grey-color: #828282 !default; +$grey-color-light: lighten($grey-color, 40%) !default; +$grey-color-dark: darken($grey-color, 25%) !default; + +$table-text-align: left !default; + +// Width of the content area +$content-width: 800px !default; + +$on-palm: 600px !default; +$on-laptop: 800px !default; + +// Use media queries like this: +// @include media-query($on-palm) { +// .wrapper { +// padding-right: $spacing-unit / 2; +// padding-left: $spacing-unit / 2; +// } +// } +@mixin media-query($device) { + @media screen and (max-width: $device) { + @content; + } +} + +@mixin relative-font-size($ratio) { + font-size: $base-font-size * $ratio; +} + +// Import partials. +@import + "minima/base", + "minima/layout", + "minima/syntax-highlighting" +; diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima/_base.scss b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima/_base.scss new file mode 100644 index 000000000000..e61b0be3f0cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima/_base.scss @@ -0,0 +1,254 @@ +/** + * Reset some basic elements + */ +body, h1, h2, h3, h4, h5, h6, +p, blockquote, pre, hr, +dl, dd, ol, ul, figure { + margin: 0; + padding: 0; +} + + + +/** + * Basic styling + */ +body { + font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family; + color: $text-color; + background-color: $background-color; + -webkit-text-size-adjust: 100%; + -webkit-font-feature-settings: "kern" 1; + -moz-font-feature-settings: "kern" 1; + -o-font-feature-settings: "kern" 1; + font-feature-settings: "kern" 1; + font-kerning: normal; + display: flex; + min-height: 100vh; + flex-direction: column; +} + + + +/** + * Set `margin-bottom` to maintain vertical rhythm + */ +h1, h2, h3, h4, h5, h6, +p, blockquote, pre, +ul, ol, dl, figure, +%vertical-rhythm { + margin-bottom: $spacing-unit / 2; +} + + + +/** + * `main` element + */ +main { + display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */ +} + + + +/** + * Images + */ +img { + max-width: 100%; + vertical-align: middle; +} + + + +/** + * Figures + */ +figure > img { + display: block; +} + +figcaption { + font-size: $small-font-size; +} + + + +/** + * Lists + */ +ul, ol { + margin-left: $spacing-unit; +} + +li { + > ul, + > ol { + margin-bottom: 0; + } +} + + + +/** + * Headings + */ +h1, h2, h3, h4, h5, h6 { + font-weight: $base-font-weight; +} + + + +/** + * Links + */ +a { + color: $brand-color; + text-decoration: none; + + &:visited { + color: darken($brand-color, 15%); + } + + &:hover { + color: $text-color; + text-decoration: underline; + } + + .social-media-list &:hover { + text-decoration: none; + + .username { + text-decoration: underline; + } + } +} + + +/** + * Blockquotes + */ +blockquote { + color: $grey-color; + border-left: 4px solid $grey-color-light; + padding-left: $spacing-unit / 2; + @include relative-font-size(1.125); + letter-spacing: -1px; + font-style: italic; + + > :last-child { + margin-bottom: 0; + } +} + + + +/** + * Code formatting + */ +pre, +code { + @include relative-font-size(0.9375); + border: 1px solid $grey-color-light; + border-radius: 3px; + background-color: #eef; +} + +code { + padding: 1px 5px; +} + +pre { + padding: 8px 12px; + overflow-x: auto; + + > code { + border: 0; + padding-right: 0; + padding-left: 0; + } +} + + + +/** + * Wrapper + */ +.wrapper { + max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2)); + max-width: calc(#{$content-width} - (#{$spacing-unit} * 2)); + margin-right: auto; + margin-left: auto; + padding-right: $spacing-unit; + padding-left: $spacing-unit; + @extend %clearfix; + + @include media-query($on-laptop) { + max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit})); + max-width: calc(#{$content-width} - (#{$spacing-unit})); + padding-right: $spacing-unit / 2; + padding-left: $spacing-unit / 2; + } +} + + + +/** + * Clearfix + */ +%clearfix:after { + content: ""; + display: table; + clear: both; +} + + + +/** + * Icons + */ + +.svg-icon { + width: 16px; + height: 16px; + display: inline-block; + fill: #{$grey-color}; + padding-right: 5px; + vertical-align: text-top; +} + +.social-media-list { + li + li { + padding-top: 5px; + } +} + + + +/** + * Tables + */ +table { + margin-bottom: $spacing-unit; + width: 100%; + text-align: $table-text-align; + color: lighten($text-color, 18%); + border-collapse: collapse; + border: 1px solid $grey-color-light; + tr { + &:nth-child(even) { + background-color: lighten($grey-color-light, 6%); + } + } + th, td { + padding: ($spacing-unit / 3) ($spacing-unit / 2); + } + th { + background-color: lighten($grey-color-light, 3%); + border: 1px solid darken($grey-color-light, 4%); + border-bottom-color: darken($grey-color-light, 12%); + } + td { + border: 1px solid $grey-color-light; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima/_layout.scss b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima/_layout.scss new file mode 100644 index 000000000000..c69af11fa2b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima/_layout.scss @@ -0,0 +1,255 @@ +/** + * Site header + */ +.site-header { + border-top: 5px solid $grey-color-dark; + border-bottom: 1px solid $grey-color-light; + min-height: $spacing-unit * 1.865; + + // Positioning context for the mobile navigation icon + position: relative; +} + +.site-title { + @include relative-font-size(1.625); + font-weight: 300; + line-height: $base-line-height * $base-font-size * 2.25; + letter-spacing: -1px; + margin-bottom: 0; + float: left; + + &, + &:visited { + color: $grey-color-dark; + } +} + +.site-nav { + float: right; + line-height: $base-line-height * $base-font-size * 2.25; + + .nav-trigger { + display: none; + } + + .menu-icon { + display: none; + } + + .page-link { + color: $text-color; + line-height: $base-line-height; + + // Gaps between nav items, but not on the last one + &:not(:last-child) { + margin-right: 20px; + } + } + + @include media-query($on-palm) { + position: absolute; + top: 9px; + right: $spacing-unit / 2; + background-color: $background-color; + border: 1px solid $grey-color-light; + border-radius: 5px; + text-align: right; + + label[for="nav-trigger"] { + display: block; + float: right; + width: 36px; + height: 36px; + z-index: 2; + cursor: pointer; + } + + .menu-icon { + display: block; + float: right; + width: 36px; + height: 26px; + line-height: 0; + padding-top: 10px; + text-align: center; + + > svg { + fill: $grey-color-dark; + } + } + + input ~ .trigger { + clear: both; + display: none; + } + + input:checked ~ .trigger { + display: block; + padding-bottom: 5px; + } + + .page-link { + display: block; + padding: 5px 10px; + + &:not(:last-child) { + margin-right: 0; + } + margin-left: 20px; + } + } +} + + + +/** + * Site footer + */ +.site-footer { + border-top: 1px solid $grey-color-light; + padding: $spacing-unit 0; +} + +.footer-heading { + @include relative-font-size(1.125); + margin-bottom: $spacing-unit / 2; +} + +.contact-list, +.social-media-list { + list-style: none; + margin-left: 0; +} + +.footer-col-wrapper { + @include relative-font-size(0.9375); + color: $grey-color; + margin-left: -$spacing-unit / 2; + @extend %clearfix; +} + +.footer-col { + float: left; + margin-bottom: $spacing-unit / 2; + padding-left: $spacing-unit / 2; +} + +.footer-col-1 { + width: -webkit-calc(35% - (#{$spacing-unit} / 2)); + width: calc(35% - (#{$spacing-unit} / 2)); +} + +.footer-col-2 { + width: -webkit-calc(20% - (#{$spacing-unit} / 2)); + width: calc(20% - (#{$spacing-unit} / 2)); +} + +.footer-col-3 { + width: -webkit-calc(45% - (#{$spacing-unit} / 2)); + width: calc(45% - (#{$spacing-unit} / 2)); +} + +@include media-query($on-laptop) { + .footer-col-1, + .footer-col-2 { + width: -webkit-calc(50% - (#{$spacing-unit} / 2)); + width: calc(50% - (#{$spacing-unit} / 2)); + } + + .footer-col-3 { + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } +} + +@include media-query($on-palm) { + .footer-col { + float: none; + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } +} + + + +/** + * Page content + */ +.page-content { + padding: $spacing-unit 0; + flex: 1; +} + +.page-heading { + @include relative-font-size(2); +} + +.post-list-heading { + @include relative-font-size(1.75); +} + +.post-list { + margin-left: 0; + list-style: none; + + > li { + margin-bottom: $spacing-unit; + } +} + +.post-meta { + font-size: $small-font-size; + color: $grey-color; +} + +.post-link { + display: block; + @include relative-font-size(1.5); +} + + + +/** + * Posts + */ +.post-header { + margin-bottom: $spacing-unit; +} + +.post-title { + @include relative-font-size(2.625); + letter-spacing: -1px; + line-height: 1; + + @include media-query($on-laptop) { + @include relative-font-size(2.25); + } +} + +.post-content { + margin-bottom: $spacing-unit; + + h2 { + @include relative-font-size(2); + + @include media-query($on-laptop) { + @include relative-font-size(1.75); + } + } + + h3 { + @include relative-font-size(1.625); + + @include media-query($on-laptop) { + @include relative-font-size(1.375); + } + } + + h4 { + @include relative-font-size(1.25); + + @include media-query($on-laptop) { + @include relative-font-size(1.125); + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima/_syntax-highlighting.scss b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima/_syntax-highlighting.scss new file mode 100644 index 000000000000..bccdb8995361 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/_sass/minima/_syntax-highlighting.scss @@ -0,0 +1,71 @@ +/** + * Syntax highlighting styles + */ +.highlight { + background: #fff; + @extend %vertical-rhythm; + + .highlighter-rouge & { + background: #eef; + } + + .c { color: #998; font-style: italic } // Comment + .err { color: #a61717; background-color: #e3d2d2 } // Error + .k { font-weight: bold } // Keyword + .o { font-weight: bold } // Operator + .cm { color: #998; font-style: italic } // Comment.Multiline + .cp { color: #999; font-weight: bold } // Comment.Preproc + .c1 { color: #998; font-style: italic } // Comment.Single + .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special + .gd { color: #000; background-color: #fdd } // Generic.Deleted + .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific + .ge { font-style: italic } // Generic.Emph + .gr { color: #a00 } // Generic.Error + .gh { color: #999 } // Generic.Heading + .gi { color: #000; background-color: #dfd } // Generic.Inserted + .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific + .go { color: #888 } // Generic.Output + .gp { color: #555 } // Generic.Prompt + .gs { font-weight: bold } // Generic.Strong + .gu { color: #aaa } // Generic.Subheading + .gt { color: #a00 } // Generic.Traceback + .kc { font-weight: bold } // Keyword.Constant + .kd { font-weight: bold } // Keyword.Declaration + .kp { font-weight: bold } // Keyword.Pseudo + .kr { font-weight: bold } // Keyword.Reserved + .kt { color: #458; font-weight: bold } // Keyword.Type + .m { color: #099 } // Literal.Number + .s { color: #d14 } // Literal.String + .na { color: #008080 } // Name.Attribute + .nb { color: #0086B3 } // Name.Builtin + .nc { color: #458; font-weight: bold } // Name.Class + .no { color: #008080 } // Name.Constant + .ni { color: #800080 } // Name.Entity + .ne { color: #900; font-weight: bold } // Name.Exception + .nf { color: #900; font-weight: bold } // Name.Function + .nn { color: #555 } // Name.Namespace + .nt { color: #000080 } // Name.Tag + .nv { color: #008080 } // Name.Variable + .ow { font-weight: bold } // Operator.Word + .w { color: #bbb } // Text.Whitespace + .mf { color: #099 } // Literal.Number.Float + .mh { color: #099 } // Literal.Number.Hex + .mi { color: #099 } // Literal.Number.Integer + .mo { color: #099 } // Literal.Number.Oct + .sb { color: #d14 } // Literal.String.Backtick + .sc { color: #d14 } // Literal.String.Char + .sd { color: #d14 } // Literal.String.Doc + .s2 { color: #d14 } // Literal.String.Double + .se { color: #d14 } // Literal.String.Escape + .sh { color: #d14 } // Literal.String.Heredoc + .si { color: #d14 } // Literal.String.Interpol + .sx { color: #d14 } // Literal.String.Other + .sr { color: #009926 } // Literal.String.Regex + .s1 { color: #d14 } // Literal.String.Single + .ss { color: #990073 } // Literal.String.Symbol + .bp { color: #999 } // Name.Builtin.Pseudo + .vc { color: #008080 } // Name.Variable.Class + .vg { color: #008080 } // Name.Variable.Global + .vi { color: #008080 } // Name.Variable.Instance + .il { color: #099 } // Literal.Number.Integer.Long +} diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/assets/main.scss b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/assets/main.scss new file mode 100644 index 000000000000..c60ebe425abf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/assets/main.scss @@ -0,0 +1,5 @@ +--- +# Only the main Sass file needs front matter (the dashes are enough) +--- + +@import "minima"; diff --git a/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/assets/minima-social-icons.svg b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/assets/minima-social-icons.svg new file mode 100644 index 000000000000..fa7399fe2509 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minima-2.5.1/assets/minima-social-icons.svg @@ -0,0 +1,33 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + +<symbol id="dribbble" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8 16c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm6.747-6.905c-.234-.074-2.115-.635-4.257-.292.894 2.456 1.258 4.456 1.328 4.872 1.533-1.037 2.624-2.68 2.93-4.58zM10.67 14.3c-.102-.6-.5-2.688-1.46-5.18l-.044.014C5.312 10.477 3.93 13.15 3.806 13.4c1.158.905 2.614 1.444 4.194 1.444.947 0 1.85-.194 2.67-.543zm-7.747-1.72c.155-.266 2.03-3.37 5.555-4.51.09-.03.18-.056.27-.08-.173-.39-.36-.778-.555-1.16-3.413 1.02-6.723.977-7.023.97l-.003.208c0 1.755.665 3.358 1.756 4.57zM1.31 6.61c.307.005 3.122.017 6.318-.832-1.132-2.012-2.353-3.705-2.533-3.952-1.912.902-3.34 2.664-3.784 4.785zM6.4 1.368c.188.253 1.43 1.943 2.548 4 2.43-.91 3.46-2.293 3.582-2.468C11.323 1.827 9.736 1.176 8 1.176c-.55 0-1.087.066-1.6.19zm6.89 2.322c-.145.194-1.29 1.662-3.816 2.694.16.325.31.656.453.99.05.117.1.235.147.352 2.274-.286 4.533.172 4.758.22-.015-1.613-.59-3.094-1.543-4.257z"/></symbol> + +<symbol id="facebook" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M15.117 0H.883C.395 0 0 .395 0 .883v14.234c0 .488.395.883.883.883h7.663V9.804H6.46V7.39h2.086V5.607c0-2.066 1.262-3.19 3.106-3.19.883 0 1.642.064 1.863.094v2.16h-1.28c-1 0-1.195.48-1.195 1.18v1.54h2.39l-.31 2.42h-2.08V16h4.077c.488 0 .883-.395.883-.883V.883C16 .395 15.605 0 15.117 0" fill-rule="nonzero"/></symbol> + +<symbol id="flickr" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M0 8c0 2.05 1.662 3.71 3.71 3.71 2.05 0 3.713-1.66 3.713-3.71S5.76 4.29 3.71 4.29C1.663 4.29 0 5.95 0 8zm8.577 0c0 2.05 1.662 3.71 3.712 3.71C14.33 11.71 16 10.05 16 8s-1.662-3.71-3.71-3.71c-2.05 0-3.713 1.66-3.713 3.71z"/></symbol> + +<symbol id="github" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8 0C3.58 0 0 3.582 0 8c0 3.535 2.292 6.533 5.47 7.59.4.075.547-.172.547-.385 0-.19-.007-.693-.01-1.36-2.226.483-2.695-1.073-2.695-1.073-.364-.924-.89-1.17-.89-1.17-.725-.496.056-.486.056-.486.803.056 1.225.824 1.225.824.714 1.223 1.873.87 2.33.665.072-.517.278-.87.507-1.07-1.777-.2-3.644-.888-3.644-3.953 0-.873.31-1.587.823-2.147-.09-.202-.36-1.015.07-2.117 0 0 .67-.215 2.2.82.64-.178 1.32-.266 2-.27.68.004 1.36.092 2 .27 1.52-1.035 2.19-.82 2.19-.82.43 1.102.16 1.915.08 2.117.51.56.82 1.274.82 2.147 0 3.073-1.87 3.75-3.65 3.947.28.24.54.73.54 1.48 0 1.07-.01 1.93-.01 2.19 0 .21.14.46.55.38C13.71 14.53 16 11.53 16 8c0-4.418-3.582-8-8-8"/></symbol> + +<symbol id="googleplus" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M5.09 7.273v1.745h2.89c-.116.75-.873 2.197-2.887 2.197-1.737 0-3.155-1.44-3.155-3.215S3.353 4.785 5.09 4.785c.99 0 1.652.422 2.03.786l1.382-1.33c-.887-.83-2.037-1.33-3.41-1.33C2.275 2.91 0 5.19 0 8s2.276 5.09 5.09 5.09c2.94 0 4.888-2.065 4.888-4.974 0-.334-.036-.59-.08-.843H5.09zm10.91 0h-1.455V5.818H13.09v1.455h-1.454v1.454h1.455v1.455h1.46V8.727H16"/></symbol> + +<symbol id="instagram" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8 0C5.827 0 5.555.01 4.702.048 3.85.088 3.27.222 2.76.42c-.526.204-.973.478-1.417.923-.445.444-.72.89-.923 1.417-.198.51-.333 1.09-.372 1.942C.008 5.555 0 5.827 0 8s.01 2.445.048 3.298c.04.852.174 1.433.372 1.942.204.526.478.973.923 1.417.444.445.89.72 1.417.923.51.198 1.09.333 1.942.372.853.04 1.125.048 3.298.048s2.445-.01 3.298-.048c.852-.04 1.433-.174 1.942-.372.526-.204.973-.478 1.417-.923.445-.444.72-.89.923-1.417.198-.51.333-1.09.372-1.942.04-.853.048-1.125.048-3.298s-.01-2.445-.048-3.298c-.04-.852-.174-1.433-.372-1.942-.204-.526-.478-.973-.923-1.417-.444-.445-.89-.72-1.417-.923-.51-.198-1.09-.333-1.942-.372C10.445.008 10.173 0 8 0zm0 1.44c2.136 0 2.39.01 3.233.048.78.036 1.203.166 1.485.276.374.145.64.318.92.598.28.28.453.546.598.92.11.282.24.705.276 1.485.038.844.047 1.097.047 3.233s-.01 2.39-.05 3.233c-.04.78-.17 1.203-.28 1.485-.15.374-.32.64-.6.92-.28.28-.55.453-.92.598-.28.11-.71.24-1.49.276-.85.038-1.1.047-3.24.047s-2.39-.01-3.24-.05c-.78-.04-1.21-.17-1.49-.28-.38-.15-.64-.32-.92-.6-.28-.28-.46-.55-.6-.92-.11-.28-.24-.71-.28-1.49-.03-.84-.04-1.1-.04-3.23s.01-2.39.04-3.24c.04-.78.17-1.21.28-1.49.14-.38.32-.64.6-.92.28-.28.54-.46.92-.6.28-.11.7-.24 1.48-.28.85-.03 1.1-.04 3.24-.04zm0 2.452c-2.27 0-4.108 1.84-4.108 4.108 0 2.27 1.84 4.108 4.108 4.108 2.27 0 4.108-1.84 4.108-4.108 0-2.27-1.84-4.108-4.108-4.108zm0 6.775c-1.473 0-2.667-1.194-2.667-2.667 0-1.473 1.194-2.667 2.667-2.667 1.473 0 2.667 1.194 2.667 2.667 0 1.473-1.194 2.667-2.667 2.667zm5.23-6.937c0 .53-.43.96-.96.96s-.96-.43-.96-.96.43-.96.96-.96.96.43.96.96z"/></symbol> + +<symbol id="linkedin" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M13.632 13.635h-2.37V9.922c0-.886-.018-2.025-1.234-2.025-1.235 0-1.424.964-1.424 1.96v3.778h-2.37V6H8.51v1.04h.03c.318-.6 1.092-1.233 2.247-1.233 2.4 0 2.845 1.58 2.845 3.637v4.188zM3.558 4.955c-.762 0-1.376-.617-1.376-1.377 0-.758.614-1.375 1.376-1.375.76 0 1.376.617 1.376 1.375 0 .76-.617 1.377-1.376 1.377zm1.188 8.68H2.37V6h2.376v7.635zM14.816 0H1.18C.528 0 0 .516 0 1.153v13.694C0 15.484.528 16 1.18 16h13.635c.652 0 1.185-.516 1.185-1.153V1.153C16 .516 15.467 0 14.815 0z" fill-rule="nonzero"/></symbol> + +<symbol id="pinterest" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8 0C3.582 0 0 3.582 0 8c0 3.39 2.108 6.285 5.084 7.45-.07-.633-.133-1.604.028-2.295.146-.625.938-3.977.938-3.977s-.24-.48-.24-1.188c0-1.11.646-1.943 1.448-1.943.683 0 1.012.513 1.012 1.127 0 .687-.436 1.713-.662 2.664-.19.797.4 1.445 1.185 1.445 1.42 0 2.514-1.498 2.514-3.662 0-1.91-1.376-3.25-3.342-3.25-2.276 0-3.61 1.71-3.61 3.47 0 .69.263 1.43.593 1.83.066.08.075.15.057.23-.06.25-.196.8-.223.91-.035.15-.115.18-.268.11C3.516 10.46 2.89 9 2.89 7.82c0-2.52 1.834-4.84 5.287-4.84 2.774 0 4.932 1.98 4.932 4.62 0 2.76-1.74 4.98-4.16 4.98-.81 0-1.57-.42-1.84-.92l-.5 1.9c-.18.698-.67 1.57-1 2.1.75.23 1.54.357 2.37.357 4.41 0 8-3.58 8-8s-3.59-8-8-8z" fill-rule="nonzero"/></symbol> + +<symbol id="rss" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M12.8 16C12.8 8.978 7.022 3.2 0 3.2V0c8.777 0 16 7.223 16 16h-3.2zM2.194 11.61c1.21 0 2.195.985 2.195 2.196 0 1.21-.99 2.194-2.2 2.194C.98 16 0 15.017 0 13.806c0-1.21.983-2.195 2.194-2.195zM10.606 16h-3.11c0-4.113-3.383-7.497-7.496-7.497v-3.11c5.818 0 10.606 4.79 10.606 10.607z"/></symbol> + +<symbol id="stackoverflow" class="svg-icon" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M12.658 14.577v-4.27h1.423V16H1.23v-5.693h1.42v4.27h10.006zm-8.583-1.423h7.16V11.73h-7.16v1.424zm.173-3.235l6.987 1.46.3-1.38L4.55 8.54l-.302 1.38zm.906-3.37l6.47 3.02.602-1.3-6.47-3.02-.602 1.29zm1.81-3.19l5.478 4.57.906-1.08L7.87 2.28l-.9 1.078zM10.502 0L9.338.863l4.27 5.735 1.164-.862L10.5 0z"/></symbol> + +<symbol id="twitter" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 3.038c-.59.26-1.22.437-1.885.517.677-.407 1.198-1.05 1.443-1.816-.634.37-1.337.64-2.085.79-.598-.64-1.45-1.04-2.396-1.04-1.812 0-3.282 1.47-3.282 3.28 0 .26.03.51.085.75-2.728-.13-5.147-1.44-6.766-3.42C.83 2.58.67 3.14.67 3.75c0 1.14.58 2.143 1.46 2.732-.538-.017-1.045-.165-1.487-.41v.04c0 1.59 1.13 2.918 2.633 3.22-.276.074-.566.114-.865.114-.21 0-.41-.02-.61-.058.42 1.304 1.63 2.253 3.07 2.28-1.12.88-2.54 1.404-4.07 1.404-.26 0-.52-.015-.78-.045 1.46.93 3.18 1.474 5.04 1.474 6.04 0 9.34-5 9.34-9.33 0-.14 0-.28-.01-.42.64-.46 1.2-1.04 1.64-1.7z" fill-rule="nonzero"/></symbol> + +<symbol id="youtube" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M0 7.345c0-1.294.16-2.59.16-2.59s.156-1.1.636-1.587c.608-.637 1.408-.617 1.764-.684C3.84 2.36 8 2.324 8 2.324s3.362.004 5.6.166c.314.038.996.04 1.604.678.48.486.636 1.588.636 1.588S16 6.05 16 7.346v1.258c0 1.296-.16 2.59-.16 2.59s-.156 1.102-.636 1.588c-.608.638-1.29.64-1.604.678-2.238.162-5.6.166-5.6.166s-4.16-.037-5.44-.16c-.356-.067-1.156-.047-1.764-.684-.48-.487-.636-1.587-.636-1.587S0 9.9 0 8.605v-1.26zm6.348 2.73V5.58l4.323 2.255-4.32 2.24z"/></symbol> + +<symbol id="mastodon" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"> + <path transform="scale(0.07)" d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915"/> + <path transform="scale(0.07)" fill="#FFF" d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675"/> +</symbol> + + +</svg> diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/.autotest b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/.autotest new file mode 100644 index 000000000000..b6fbce536563 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/.autotest @@ -0,0 +1,34 @@ +# -*- ruby -*- + +require 'autotest/restart' +require 'autotest/rcov' if ENV['RCOV'] + +Autotest.add_hook :initialize do |at| + at.testlib = 'minitest/autorun' + + bench_tests = %w(TestMinitestBenchmark) + mock_tests = %w(TestMinitestMock TestMinitestStub) + spec_tests = %w(TestMinitestReporter TestMetaStatic TestMeta + TestSpecInTestCase) + unit_tests = %w(TestMinitestGuard TestMinitestRunnable + TestMinitestRunner TestMinitestTest TestMinitestUnit + TestMinitestUnitInherited TestMinitestUnitOrder + TestMinitestUnitRecording TestMinitestUnitTestCase) + + { + bench_tests => "test/minitest/test_minitest_benchmark.rb", + mock_tests => "test/minitest/test_minitest_mock.rb", + spec_tests => "test/minitest/test_minitest_reporter.rb", + unit_tests => "test/minitest/test_minitest_unit.rb", + }.each do |klasses, file| + klasses.each do |klass| + at.extra_class_map[klass] = file + end + end + + at.add_exception 'coverage.info' + at.add_exception 'coverage' +end + +# require 'autotest/rcov' +# Autotest::RCov.command = 'rcov_info' diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/History.rdoc b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/History.rdoc new file mode 100644 index 000000000000..951b934af4c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/History.rdoc @@ -0,0 +1,1409 @@ +=== 5.14.4 / 2021-02-23 + +* 1 bug fix: + + * Fixed deprecation warning using stub with methods using keyword arguments. (Nakilon) + +=== 5.14.3 / 2021-01-05 + +* 1 bug fix: + + * Bumped require_ruby_version to < 4 (trunk = 3.1). + +=== 5.14.2 / 2020-08-31 + +* 1 bug fix: + + * Bumped ruby version to include 3.0 (trunk). + +=== 5.14.1 / 2020-05-15 + +* 3 minor enhancements: + + * Minitest.filter_backtrace returns original backtrace if filter comes back empty. + * Minitest::BacktraceFilter now returns entire backtrace if $MT_DEBUG set in env. + * Return true on a successful refute. (jusleg) + +* 1 bug fix: + + * Fixed expectation doco to not use global expectations. + +=== 5.14.0 / 2020-01-11 + +* 2 minor enhancements: + + * Block-assertions (eg assert_output) now error if raised inside the block. (casperisfine) + * Changed assert_raises to only catch Assertion since that covers Skip and friends. + +* 3 bug fixes: + + * Added example for value wrapper with block to Expectations module. (stomar) + * Fixed use of must/wont_be_within_delta on Expectation instance. (stomar) + * Renamed UnexpectedError#exception to #error to avoid problems with reraising. (casperisfine) + +=== 5.13.0 / 2019-10-29 + +* 9 minor enhancements: + + * Added Minitest::Guard#osx? + * Added examples to documentation for assert_raises. (lxxxvi) + * Added expectations #path_must_exist and #path_wont_exist. Not thrilled with the names. + * Added fail_after(year, month, day, msg) to allow time-bombing after a deadline. + * Added skip_until(year, month, day, msg) to allow deferring until a deadline. + * Deprecated Minitest::Guard#maglev? + * Deprecated Minitest::Guard#rubinius? + * Finally added assert_path_exists and refute_path_exists. (deivid-rodriguez) + * Refactored and pulled Assertions#things_to_diff out of #diff. (BurdetteLamar) + +* 3 bug fixes: + + * Fix autorun bug that affects fork exit status in tests. (dylanahsmith/jhawthorn) + * Improved documentation for _/value/expect, especially for blocks. (svoop) + * Support new Proc#to_s format. (ko1) + +=== 5.12.2 / 2019-09-28 + +* 1 bug fix: + + * After chatting w/ @y-yagi and others, decided to lower support to include ruby 2.2. + +=== 5.12.1 / 2019-09-28 + +* 1 minor enhancement: + + * Added documentation for Reporter classes. (sshaw) + +* 3 bug fixes: + + * Avoid using 'match?' to support older ruby versions. (y-yagi) + * Fixed broken link to reference on goodness-of-fit testing. (havenwood) + * Update requirements in readme and Rakefile/hoe spec. + +=== 5.12.0 / 2019-09-22 + +* 8 minor enhancements: + + * Added a descriptive error if assert_output or assert_raises called without a block. (okuramasafumi) + * Changed mu_pp_for_diff to make having both \n and \\n easier to debug. + * Deprecated $N for specifying number of parallel test runners. Use MT_CPU. + * Deprecated use of global expectations. To be removed from MT6. + * Extended Assertions#mu_pp to encoding validity output for strings to improve diffs. + * Extended Assertions#mu_pp to output encoding and validity if invalid to improve diffs. + * Extended Assertions#mu_pp_for_diff to make escaped newlines more obvious in diffs. + * Fail gracefully when expectation used outside of `it`. + +* 3 bug fixes: + + * Check `option[:filter]` klass before match. Fixes 2.6 warning. (y-yagi) + * Fixed Assertions#diff from recalculating if set to nil + * Fixed spec section of readme to not use deprecated global expectations. (CheezItMan) + +=== 5.11.3 / 2018-01-26 + +* 1 bug fix: + + * Pushed #error? up to Reportable module. (composerinteralia) + +=== 5.11.2 / 2018-01-25 + +* 1 minor enhancement: + + * Reversed Test < Result. Back to < Runnable and using Reportable for shared code. + +* 2 bug fixes: + + * Fixed Result#location for instances of Test. (alexisbernard) + * Fixed deprecation message for Runnable#marshal_dump. (y-yagi) + +=== 5.11.1 / 2018-01-02 + +* 1 bug fix: + + * Fixed Result (a superclass of Test) overriding Runnable's name accessors. (y-yagi, MSP-Greg) + +=== 5.11.0 / 2018-01-01 + +* 2 major enhancements: + + * Added Minitest::Result and Minitest::Result.from(runnable). + * Changed Minitest::Test to subclass Result and refactored methods up. + +* 7 minor enhancements: + + * Added --no-plugins and MT_NO_PLUGINS to bypass MT plugin autoloading. Helps with bad actors installed globally. + * Added bench_performance_{logarithmic,power} for spec-style benchmarks. (rickhull) + * Added deprecation warning for Runnable#marshal_dump. + * Minitest.run_one_method now checks for instance of Result, not exact same class. + * Minitest::Test.run returns a Result version of self, not self. + * ProgressReporter#prerecord now explicitly prints klass.name. Allows for fakers. + +* 4 bug fixes: + + * Object.stub no longer calls the passed block if stubbed with a callable. + * Object.stub now passes blocks down to the callable result. + * Pushed Minitest::Test#time & #time_it up to Runnable. + * Test nil equality directly in assert_equal. Fixes #679. (voxik) + +=== 5.11.0b1 / 2017-12-20 + +* 2 major enhancements: + + * Added Minitest::Result and Minitest::Result.from(runnable). + * Changed Minitest::Test to subclass Result and refactored methods up. + +* 6 minor enhancements: + + * Added --no-plugins and MT_NO_PLUGINS to bypass MT plugin autoloading. Helps with bad actors installed globally. + * Added bench_performance_{logarithmic,power} for spec-style benchmarks. (rickhull) + * Minitest.run_one_method now checks for instance of Result, not exact same class. + * Minitest::Test.run returns a Result version of self, not self. + * ProgressReporter#prerecord now explicitly prints klass.name. Allows for fakers. + * Removed Runnable.marshal_dump/load. + +* 4 bug fixes: + + * Object.stub no longer calls the passed block if stubbed with a callable. + * Object.stub now passes blocks down to the callable result. + * Pushed Minitest::Test#time & #time_it up to Runnable. + * Test nil equality directly in assert_equal. Fixes #679. (voxik) + +=== 5.10.3 / 2017-07-21 + +* 1 minor enhancement: + + * Extended documentation for Mock#expect for multiple calls to mock object. (insti) + +* 2 bug fixes: + + * Finished off missing doco. + * Fixed verbose output on parallelize_me! classes. (chanks) + +=== 5.10.2 / 2017-05-09 + +* 1 minor enhancement: + + * Added suggestion in minitest/hell to install minitest/proveit. + +* 7 bug fixes: + + * Expand MT6 to Minitest 6. (xaviershay) + * Fixed location of assert_send deprecation. (rab) + * Fixed location of nil assert_equal deprecation to work with expectations. (jeremyevans) + * Fixed minitest/hell to use parallelize_me! (azul) + * Made deprecation use warn so -W0 will silence it. + * Workaround for rdoc nodoc generation bug that totally f'd up minitest doco. (Paxa) + * Write aggregated_results directly to the IO object to avoid mixed encoding errors. (tenderlove) + +=== 5.10.1 / 2016-12-01 + +* 1 bug fix: + + * Added a hack/kludge to deal with missing #prerecord on reporters that aren't properly subclassing AbstractReporter (I'm looking at you minitest-reporters) + +=== 5.10.0 / 2016-11-30 + +* 1 major enhancement: + + * Deprecated ruby 1.8, 1.9, possibly 2.0, assert_send, & old MiniTest namespace. + +* 3 minor enhancements: + + * Warn if assert_equal expects a nil. This will fail in minitest 6+. (tenderlove) + * Added AbstractReporter#prerecord and extended ProgressReporter and CompositeReporter to use it. + * Minor optimization: remove runnables with no runnable methods before run. + +* 3 bug fixes: + + * Fix assert_throw rescuing any NameError and ArgumentError. (waldyr) + * Clean up (most of the) last remaining vestiges of minitest/unit. + * 2.4: removed deprecation warnings when referring to Fixnum. + +=== 5.9.1 / 2016-09-25 + +* 2 bug fixes: + + * Re-release to refresh gem certificate signing. ugh. + * Fixed hoe/minitest to not augment load path if we're actually testing minitest. + +=== 5.9.0 / 2016-05-16 + +* 8 minor enhancements: + + * Added Minitest.info_signal accessors to customize signal for test run info. (nate) + * Added assert_mock to make it more clear that you're testing w/ them. + * Added negative filter by test name. (utilum) + * Added warning to README that 1.8 and 1.9 support will be dropped in minitest 6. + * Automatically activate minitest/hell if $MT_HELL is defined. + * Improved default error messages for assert and refute. (bhenderson) + * minitest/hell now tries to require minitest/proveit + * mu_pp for strings prints out non-standard encodings to improve assert_equal diffs. + +* 1 bug fix: + + * Removed Interrupt from PASSTHROUGH_EXCEPTIONS (already handled). (waldyr) + +=== 5.8.5 / 2016-09-25 + +* 2 bug fixes: + + * Re-release to refresh gem certificate signing. ugh. + * Fixed hoe/minitest to not augment load path if we're actually testing minitest. + +=== 5.8.4 / 2016-01-21 + +* 1 bug fix: + + * Allow Minitest::Assertion to pass through assert_raises so inner failures are dealt with first. + +=== 5.8.3 / 2015-11-17 + +* 1 minor enhancement: + + * Added extra note about mocks and threads to readme. (zamith) + +* 1 bug fix: + + * Fixed bug in Mock#verify. (pithub/zamith) + +=== 5.8.2 / 2015-10-26 + +* 1 bug fix: + + * Fixed using parallelize_me! and capture_io (or any locking io). (arlt/tenderlove) + +=== 5.8.1 / 2015-09-23 + +* 1 minor enhancement: + + * Refactor assert_raises to be cleaner and to pass SystemExit and SignalException. (bhenderson) + +=== 5.8.0 / 2015-08-06 + +* 2 minor enhancements: + + * Add optional delegation mechanism to extend object with a mock. (zamith) + * Return early if there are no filtered methods. (jeremyevans) + +* 1 bug fix: + + * Don't extend io with pride if io is not a tty. (toy) + +=== 5.7.0 / 2015-05-27 + +* 1 major enhancement: + + * assert_raises now matches subclasses of the expected exception types. (jeremyevans) + +* 3 minor enhancements: + + * Added :block type for minitest/spec's #infect_an_assertion. (jeremyevans) + * Inline verification error messages in minitest/mock for GC performance. (zamith) + * assert_raises defaults to RuntimeError if not specified. (jeremyevans) + +* 4 bug fixes: + + * Added 'class' to minitest/mock's overridden_methods list. (zamith) + * Added file/line to infect_an_assertion's class_eval call. (jeremyevans) + * Cleared UnexpectedError's mesg w/ generic string. + * Fixed non-proc-oriented expectations when used on proc target. (jeremyevans) + +=== 5.6.1 / 2015-04-27 + +* 2 bug fixes: + + * Added Minitest.clock_time and switched all Time.now to it. (tenderlove) + * Moved Minitest::Expectations#_ into Minitest::Spec::DSL. + +=== 5.6.0 / 2015-04-13 + +* 4 major enhancements: + + * Added Minitest::Expectation value monad. + * Added Minitest::Expectations#_ that returns an Expectation. Aliased to value. + * All expectations are added to Minitest::Expectation. + * At some point, the methods on Object will be deprecated and then removed. + +* 4 minor enhancements: + + * Added a note about bundle exec pitfall in ruby 2.2+. (searls) + * Lazily start the parallel executor. (tenderlove) + * Make mocks more debugger-friendly (edward) + * Print out the current test run on interrupt. (riffraff) + +* 3 bug fixes: + + * Fix failing test under Windows. (kimhmadsen) + * Record mocked calls before they happen so mocks can raise exceptions easier (tho I'm not a fan). (corecode) + * Tried to clarify mocks vs stubs terminology better. (kkirsche) + +=== 5.5.1 / 2015-01-09 + +* 1 bug fix: + + * Fixed doco problems. (zzak) + +=== 5.5.0 / 2014-12-12 // mri 2.2.0 (as a real gem) + +* 1 minor enhancement: + + * Allow seed to be given via ENV for rake test loader sadness: eg rake SEED=42. + +=== 5.4.3 / 2014-11-11 + +* 2 bug fixes: + + * Clarified requirements for ruby are now 1.8.7 or better. + * Force encode error output in case mal-encoded exception is raised. (jasonrclark) + +=== 5.4.2 / 2014-09-26 + +* 2 minor enhancements: + + * Extract teardown method list. + * Thanks to minitest-gcstats got a 5-10% speedup via reduced GC! + +=== 5.4.1 / 2014-08-28 + +* 1 bug fix: + + * Fixed specs hidden by nesting/ordering bug (blowmage/apotonick) + +=== 5.4.0 / 2014-07-07 + +* 2 minor enhancements: + + * Kernel#describe extended to splat additional_desc. + * Spec#spec_type extended to take a splat of additional items, passed to matcher procs. + +* 1 bug fix: + + * minitest/spec should require minitest/test, not minitest/unit. (doudou) + +=== 5.3.5 / 2014-06-17 + +* 1 minor enhancement: + + * Spit and polish (mostly spit). + +=== 5.3.4 / 2014-05-15 + +* 1 minor enhancement: + + * Test classes are randomized before running. (judofyr) + +=== 5.3.3 / 2014-04-14 + +* 1 bug fix: + + * Fixed using expectations w/ DSL in Test class w/o describe. (blowmage+others) + +=== 5.3.2 / 2014-04-02 + +* 1 bug fix: + + * Fixed doco on Assertions.assertions. (xaviershay) + +=== 5.3.1 / 2014-03-14 + +* 1 minor enhancement: + + * Modified verbage on bad 'let' names to be more helpful. (Archytaus) + +* 1 bug fix: + + * Fixed 2 cases still using MiniTest. (mikesea) + +=== 5.3.0 / 2014-02-25 + +* 1 minor enhancement: + + * Mocked methods can take a block to verify state. Seattle.rb 12 bday present from ernie! Thanks!! + +=== 5.2.3 / 2014-02-10 + +* 1 bug fix: + + * Fixed Spec#let check to allow overriding of other lets. (mvz) + +=== 5.2.2 / 2014-01-22 + +* 1 minor enhancement: + + * Spec#let raises ArgumentError if you override _any_ instance method (except subject). (rynr) + +* 1 bug fix: + + * Fixed up benchmark spec doco and added a test to demonstrate. (bhenderson) + +=== 5.2.1 / 2014-01-07 + +* 1 bug fix: + + * Properly deal with horrible mix of runtime load errors + other at_exit handlers. (dougo/chqr) + +=== 5.2.0 / 2013-12-13 + +* 1 minor enhancement: + + * Change expectations to allow calling most on procs (but not calling the proc). (bhenderson+others) + +=== 5.1.0 / 2013-12-05 + +* 1 minor enhancement: + + * Use a Queue for scheduling parallel tests. (tenderlove) + +* 1 bug fix: + + * Fixed misspelling in doco. (amatsuda) + +=== 5.0.8 / 2013-09-20 + +* 1 bug fix: + + * Fixed siginfo handler by rearranging reporters and fixing to_s. (tenderlove) + +=== 5.0.7 / 2013-09-05 + +* 2 minor enhancements: + + * Added clarification about the use of thread local variables in expectations. (jemc) + * Added extra message about skipped tests, if any. Disable globally with $MT_NO_SKIP_MSG. + +* 2 bug fixes: + + * Only require minitest, not minitest/autorun in pride_plugin. (judofyr) + * Require rubygems in load_plugins in case you're not using minitest/autorun. + +=== 5.0.6 / 2013-06-28 + +* 3 minor enhancements: + + * Allow stub to pass args to blocks. (swindsor) + * Improved warning message about minitest/autorun to address 1.9's minitest/autorun. + * Made minitest/test require minitest as needed. For lib writers. (erikh) + +* 1 bug fix: + + * Fixed missing require in minitest/test. (erikh) + +=== 4.7.5 / 2013-06-21 // mri 2.1.1 + +* 2 bug fixes: + + * Fix Spec#describe_stack to be thread local. + * Fix multithreaded test failures by defining Time local to mock test namespace + +=== 5.0.5 / 2013-06-20 + +* 6 bug fixes: + + * DOH! Fixed the rest of the new casing on Minitest. (splattael) + * Fixed typo on minitest/mock rdoc. (mrgilman/guiceolin) + * Make Spec::DSL.describe_stack thread local to avoid failing on my own tests. + * Make a fake Time.now local to the tests so they won't interfere with real reporter timings. + * Make everything mockable by wrapping all 'special' methods in a smarter wrapper. (bestie) + * Raise ArgumentError if let name starts with 'test'. (johnmaxwell) + +=== 5.0.4 / 2013-06-07 + +* 5 minor enhancements: + + * Added AbstractReporter, defining required Reporter API to quack properly. + * Added doco for writing reporters. + * Refactored Reporter into ProgressReporter and SummaryReporter. (idea: phiggins, code:me+scotch) + * Refactored SummaryReporter pushing up to StatisticsReporter. (phiggins) + * Removed Reporter#run_and_report... cleaner, but doesn't "fit" in the API. + +=== 5.0.3 / 2013-05-29 + +* 4 minor enhancements: + + * Added Runnable.with_info_handler and Runnable.on_signal. + * Moved io.sync restore to Reporter#run_and_report. + * Refactored inner loop of Reporter#report to #to_s. Callable for status updates. + * Restored MT4's mid-run report (^t). (tenderlove). + +=== 5.0.2 / 2013-05-20 + +* 3 bug fixes: + + * Gem.find_files is smarter than I remember... cause I wrote it that way. *sigh* I'm getting old. + * Pride wasn't doing puts through its #io. (tmiller/tenderlove) + * Replaced Runnable#dup and Test#dup with marshal_dump/load. Too many problems cropping up on untested rails code. (tenderlove/rubys) + +=== 5.0.1 / 2013-05-14 + +* 2 bug fixes: + + * Documented Assertions' need for @assertions to be defined by the includer. + * Only load one plugin version per name. Tries for latest. + +=== 5.0.0 / 2013-05-10 + +Oh god... here we go... + +Minitest 5: + +* 4 deaths in the family: + + * MiniTest.runner is dead. No more manager objects. + * MiniTest::Unit#record is dead. Use a Reporter instance instead. + * MiniTest::Unit._run_* is dead. Runnable things are responsible for their own runs. + * MiniTest::Unit.output is dead. No more centralized IO. + +* 12 major (oft incompatible) changes: + + * Renamed MiniTest to Minitest. Your pinkies will thank me. (aliased to MiniTest) + * Removed MiniTest::Unit entirely. No more manager objects. + * Added Minitest::Runnable. Everything minitest can run subclasses this. + * Renamed MiniTest::Unit::TestCase to Minitest::Test (subclassing Runnable). + * Added Minitest::Benchmark. + * Your benchmarks need to move to their own subclass. + * Benchmarks using the spec DSL have to have "Bench" somewhere in their describe. + * MiniTest::Unit.after_tests moved to Minitest.after_tests + * MiniTest::Unit.autorun is now Minitest.autorun. Just require minitest/autorun pls. + * Removed ParallelEach#grep since it isn't used anywhere. + * Renamed Runnable#__name__ to Runnable#name (but uses @NAME internally). + * Runnable#run needs to return self. Allows for swapping of results as needed. + +* 8 minor moves: + + * Moved Assertions module to minitest/assertions.rb + * Moved Expectations module to minitest/expectations.rb + * Moved Test to minitest/test.rb + * Moved everything else in minitest/unit.rb to minitest.rb + * minitest/unit.rb is now just a small (user-test only) compatibility layer. + * Moved most of minitest/pride into minitest/pride_plugin. + * minitest/pride now just activates pride. + * Moved ParallelEach under Minitest. + +* 9 additions: + + * Added a plugin system that can extend command-line options. + * Added Minitest.extensions. + * Added Minitest.reporter (only available during startup). + * Added Minitest.run(args). This is the very top of any Minitest run. + * Added Minitest::Reporter. Everything minitest can report goes through here. + * Minitest.reporter is a composite so you can add your own. + * Added Minitest::CompositeReporter. Much easier to extend with your own reporters. + * Added UnexpectedError, an Assertion subclass, to wrap up errors. + * Minitest::Test#run is now freakin' beautiful. 47 -> 17 loc + +* 11 other: + + * Removed Object.infect_with_assertions (it was already dead code). + * Runnables are responsible for knowing their result_code (eg "." or "F"). + * Minitest.autorun now returns boolean, not exit code. + * Added FAQ entry for extending via modules. (phiggins) + * Implement Runnable#dup to cleanse state back to test results. Helps with serialization. pair:tenderlove + * Moved ParallelEach under Minitest. + * Runnable#run needs to return self. Allows for swapping of results as needed. + * Minitest.init_plugins passes down options. + * Minitest.load_plugins only loads once. + * Fixed minitest/pride to work with rake test loader again. (tmiller) + * Added count/size to ParallelEach to fix use w/in stdlib's test/unit. :( (btaitelb) + +* 5 voodoo: + + * Removed mutex from minitest.rb (phiggins) + * Removed mutex from test.rb (phiggins) + * Removed Minitest::Reporter.synchronize (phiggins) + * Removed Minitest::Test.synchronize (phiggins) + * Upon loading minitest/parallel_each, record, capture_io and capture_subprocess_io are doped with synchronization code. (phiggins) + +=== 4.7.4 / 2013-05-01 + +This is probably the last release of the 4.x series. It will be merged +to ruby and will be put into maintenance mode there. + +I'm not set in stone on this, but at this point further development of +minitest (5+) will be gem-only. It is just too hard to work w/in +ruby-core w/ test-unit compatibility holding minitest development +back. + +* 2 minor enhancements: + + * Added count/size to ParallelEach to fix use w/in stdlib's test/unit. :( (btaitelb) + * Allow disabling of info_signal handler in runner. (erikh) + +=== 4.7.3 / 2013-04-20 + +* 1 bug fix: + + * Reverted stubbing of module methods change. Stub the user, not the impl. (ab9/tyabe) + +=== 4.7.2 / 2013-04-18 + +* 2 bug fixes: + + * Fixed inconsistency in refute_in_delta/epsilon. I double negatived my logic. (nettsundere) + * Fixed stubbing of module methods (eg Kernel#sleep). (steveklabnik) + +=== 4.7.1 / 2013-04-09 + +* 1 minor enhancement: + + * Added FAQ section to README + +* 1 bug fix: + + * Fixed bug where guard runs tests bypassing minitest/autorun and an ivar isn't set right. (darrencauthon) + +=== 4.7.0 / 2013-03-18 + +* 1 major enhancement: + + * Refactored MiniTest::Spec into MiniTest::Spec::DSL. + +* 1 bug fix: + + * Removed $DEBUG handler that detected when test/unit and minitest were both loaded. (tenderlove) + +=== 4.6.2 / 2013-02-27 + +* 1 minor enhancement: + + * Change error output to match Class#method, making it easier to use -n filter. + +=== 4.6.1 / 2013-02-14 + +* 1 bug fix: + + * Fixed an option processing bug caused by test/unit's irresponsibly convoluted code. (floehopper) + +=== 4.6.0 / 2013-02-07 + +* 3 major enhancements: + + * Removed ::reset_setup_teardown_hooks + * Removed the long deprecated assert_block + * Removed the long deprecated lifecycle hooks: add_(setup|teardown)_hook + +* 1 minor enhancement: + + * Allow filtering tests by suite name as well as test name. (lazyatom) + +* 2 bug fixes: + + * Made hex handling (eg object_ids) in mu_pp_for_diff more specific. (maxim) + * nodoc top-level module. (zzak) + +=== 4.5.0 / 2013-01-22 + +* 1 major enhancement: + + * Rearranged minitest/unit.rb so NO parallelization code is loaded/used until you opt-in. + +* 4 minor enhancements: + + * Added TestCase#skipped? for teardown guards + * Added maglev? guard + * Document that record can be sent twice if teardown fails or errors (randycoulman) + * Errors in teardown are now recorded. (randycoulman) + +* 3 bug fixes: + + * Added hacks and skips to get clean test runs on maglev + * Modified float tests for maglev float output differences. Not sure this is right. Not sure I care. + * Test for existance of diff.exe instead of assuming they have devkit. (blowmage/Cumbayah) + +=== 4.4.0 / 2013-01-07 + +* 3 minor enhancements: + + * Added fit_logarithic and assert_performance_logarithmic. (ktheory) + * Merge processed options so others can mess with defaults. (tenderlove) + * TestCase#message can now take another proc to defer custom message cost. (ordinaryzelig/bhenderson) + +* 1 bug fix: + + * TestCase#passed? now true if test is skipped. (qanhd) + +=== 4.3.3 / 2012-12-06 + +* 1 bug fix: + + * Updated information about stubbing. (daviddavis) + +=== 4.3.2 / 2012-11-27 // mri 2.0.0 + +* 1 minor enhancement: + + * Improved assert_equals error message to point you at #== of member objects. (kcurtin) + +=== 4.3.1 / 2012-11-23 + +* 1 bug fix: + + * Moved test_children to serial testcase to prevent random failures. + +=== 4.3.0 / 2012-11-17 + +* 4 minor enhancements: + + * Allow #autorun to run even if loaded with other test libs that call exit. (sunaku) + * Do not include Expectations in Object if $MT_NO_EXPECTATIONS is set (experimental?) + * Gave some much needed love to assert_raises. + * Mock#expect can take a block to custom-validate args. (gmoothart) + +=== 4.2.0 / 2012-11-02 + +* 4 major enhancements: + + * Added minitest/hell - run all your tests through the ringer! + * Added support for :parallel test_order to run test cases in parallel. + * Removed last_error and refactored runner code to be threadsafe. + * _run_suites now runs suites in parallel if they opt-in. + +* 4 minor enhancements: + + * Added TestCase#synchronize + * Added TestCase.make_my_diffs_pretty! + * Added TestCase.parallelize_me! + * Lock on capture_io for thread safety (tenderlove) + +=== 4.1.0 / 2012-10-05 + +* 2 minor enhancements: + + * Added skip example to readme. (dissolved) + * Extracted backtrace filter to object. (tenderlove) + +* 1 bug fix: + + * OMG I'm so dumb. Fixed access to deprecated hook class methods. I hate ruby modules. (route) + +=== 4.0.0 / 2012-09-28 + +* 1 major enhancement: + + * The names of a privately-used undocumented constants are Super Important™. + +* 1 minor enhancement: + + * Support stubbing methods that would be handled via method_missing. (jhsu) + +* 3 bug fixes: + + * Add include_private param to MiniTest::Mock#respond_to? (rf-) + * Fixed use of minitest/pride with --help. (zw963) + * Made 'No visible difference.' message more clear. (ckrailo) + +=== 3.5.0 / 2012-09-21 + +* 1 minor enhancement: + + * Added #capture_subprocess_io. (route) + +=== 3.4.0 / 2012-09-05 + +* 2 minor enhancements: + + * assert_output can now take regexps for expected values. (suggested by stomar) + * Clarified that ruby 1.9/2.0's phony gems cause serious confusion for rubygems. + +=== 3.3.0 / 2012-07-26 + +* 1 major enhancement: + + * Deprecated add_(setup|teardown)_hook in favor of (before|after)_(setup|teardown) [2013-01-01] + +* 4 minor enhancements: + + * Refactored deprecated hook system into a module. + * Refactored lifecycle hooks into a module. + * Removed after_setup/before_teardown + run_X_hooks from Spec. + * Spec#before/after now do a simple define_method and call super. DUR. + +* 2 bug fixes: + + * Fixed #passed? when used against a test that called flunk. (floehopper) + * Fixed rdoc bug preventing doco for some expectations. (stomar). + +=== 3.2.0 / 2012-06-26 + +* 1 minor enhancement: + + * Stubs now yield self. (peterhellberg) + +* 1 bug fix: + + * Fixed verbose test that only fails when run in verbose mode. mmmm irony. + +=== 3.1.0 / 2012-06-13 + +* 2 minor enhancements: + + * Removed LONG deprecated Unit.out accessor + * Removed generated method name munging from minitest/spec. (ordinaryzelig/tenderlove) + +=== 3.0.1 / 2012-05-24 + +* 1 bug fix: + + * I'm a dumbass and refactored into Mock#call. Renamed to #__call so you can mock #call. (mschuerig) + +=== 3.0.0 / 2012-05-08 + +* 3 major enhancements: + + * Added Object#stub (in minitest/mock.rb). + * Mock#expect mocks are used in the order they're given. + * Mock#verify now strictly compares against expect calls. + +* 3 minor enhancements: + + * Added caller to deprecation message. + * Mock error messages are much prettier. + * Removed String check for RHS of assert/refute_match. This lets #to_str work properly. + +* 1 bug fix: + + * Support drive letter on Windows. Patch provided from MRI by Usaku NAKAMURA. (ayumin) + +=== 2.12.1 / 2012-04-10 + +* 1 minor enhancement: + + * Added ruby releases to History.txt to make it easier to see what you're missing + +* 1 bug fix: + + * Rolled my own deprecate msg to allow MT to work with rubygems < 1.7 + +=== 2.12.0 / 2012-04-03 + +* 4 minor enhancements: + + * ::it returns test method name (wojtekmach) + * Added #record method to runner so runner subclasses can cleanly gather data. + * Added Minitest alias for MiniTest because even I forget. + * Deprecated assert_block!! Yay!!! + +* 1 bug fix: + + * Fixed warning in i_suck_and_my_tests_are_order_dependent! (phiggins) + +=== 2.11.4 / 2012-03-20 + +* 2 minor enhancements: + + * Updated known extensions + * You got your unicode in my tests! You got your tests in my unicode! (fl00r) + +* 1 bug fix: + + * Fixed MiniTest::Mock example in the readme. (conradwt) + +=== 2.11.3 / 2012-02-29 + +* 2 bug fixes: + + * Clarified that assert_raises returns the exception for further testing + * Fixed assert_in_epsilon when both args are negative. (tamc) + +=== 2.11.2 / 2012-02-14 + +* 1 minor enhancement: + + * Display failures/errors on SIGINFO. (tenderlove) + +* 1 bug fix: + + * Fixed MiniTest::Unit.after_tests for Ruby 1.9.3. (ysbaddaden) + +=== 2.11.1 / 2012-02-01 + +* 3 bug fixes: + + * Improved description for --name argument. (drd) + * Ensure Mock#expect's expected args is an Array. (mperham) + * Ensure Mock#verify verifies multiple expects of the same method. (chastell) + +=== 2.11.0 / 2012-01-25 + +* 2 minor enhancements: + + * Added before / after hooks for setup and teardown. (tenderlove) + * Pushed run_setup_hooks down to Spec. (tenderlove) + +=== 2.10.1 / 2012-01-17 + +* 1 bug fix: + + * Fixed stupid 1.9 path handling grumble grumble. (graaff) + +=== 2.10.0 / 2011-12-20 + +* 3 minor enhancements: + + * Added specs for must/wont be_empty/respond_to/be_kind_of and others. + * Added tests for assert/refute predicate. + * Split minitest/excludes.rb out to its own gem. + +* 1 bug fix: + + * Fixed must_be_empty and wont_be_empty argument handling. (mrsimo) + +=== 2.9.1 / 2011-12-13 + +* 4 minor enhancements: + + * Added a ton of tests on spec error message output. + * Cleaned up consistency of msg handling on unary expectations. + * Improved error messages on assert/refute_in_delta. + * infect_an_assertion no longer checks arity and better handles args. + +* 1 bug fix: + + * Fixed error message on specs when 2+ args and custom message provided. (chastell) + +=== 2.9.0 / 2011-12-07 + +* 4 minor enhancements: + + * Added TestCase.exclude and load_excludes for programmatic filtering of tests. + * Added guard methods so you can cleanly skip based on platform/impl + * Holy crap! 100% doco! `rdoc -C` ftw + * Switch assert_output to test stderr before stdout to possibly improve debugging + +=== 2.8.1 / 2011-11-17 + +* 1 bug fix: + + * Ugh. 1.9's test/unit violates my internals. Added const_missing. + +=== 2.8.0 / 2011-11-08 + +* 2 minor enhancements: + + * Add a method so that code can be run around a particular test case (tenderlove) + * Turn off backtrace filtering if we're running inside a ruby checkout. (drbrain) + +* 2 bug fixes: + + * Fixed 2 typos and 2 doc glitches. (splattael) + * Remove unused block arguments to avoid creating Proc objects. (k-tsj) + +=== 2.7.0 / 2011-10-25 + +* 2 minor enhancements: + + * Include failed values in the expected arg output in MockExpectationError. (nono) + * Make minitest/pride work with other 256 color capable terms. (sunaku) + +* 2 bug fixes: + + * Clarified the documentation of minitest/benchmark (eregon) + * Fixed using expectations in regular unit tests. (sunaku) + +=== 2.6.2 / 2011-10-19 + +* 1 minor enhancement: + + * Added link to vim bundle. (sunaku) + +* 2 bug fixes: + + * Force gem activation in hoe minitest plugin + * Support RUBY_VERSION='2.0.0' (nagachika) + +=== 2.6.1 / 2011-09-27 + +* 2 bug fixes: + + * Alias Spec.name from Spec.to_s so it works when @name is nil (nathany) + * Fixed assert and refute_operator where second object has a bad == method. + +=== 2.6.0 / 2011-09-13 + +* 2 minor enhancements: + + * Added specify alias for it and made desc optional. + * Spec#must_be and #wont_be can be used with predicates (metaskills) + +* 1 bug fix: + + * Fixed Mock.respond_to?(var) to work with strings. (holli) + +=== 2.5.1 / 2011-08-27 // ruby 1.9.3: p0, p125, p34579 + +* 2 minor enhancements: + + * Added gem activation for minitest in minitest/autoload to help out 1.9 users + * Extended Spec.register_spec_type to allow for procs instead of just regexps. + +=== 2.5.0 / 2011-08-18 + +* 4 minor enhancements: + + * Added 2 more arguments against rspec: let & subject in 9 loc! (emmanuel/luis) + * Added TestCase.i_suck_and_my_tests_are_order_dependent! + * Extended describe to take an optional method name (2 line change!). (emmanuel) + * Refactored and extended minitest/pride to do full 256 color support. (lolcat) + +* 1 bug fix: + + * Doc fixes. (chastell) + +=== 2.4.0 / 2011-08-09 + +* 4 minor enhancements: + + * Added simple examples for all expectations. + * Improved Mock error output when args mismatch. + * Moved all expectations from Object to MiniTest::Expectations. + * infect_with_assertions has been removed due to excessive clever + +* 4 bug fixes: + + * Fix Assertions#mu_pp to deal with immutable encoded strings. (ferrous26) + * Fix minitest/pride for MacRuby (ferrous26) + * Made error output less fancy so it is more readable + * Mock shouldn't undef === and inspect. (dgraham) + +=== 2.3.1 / 2011-06-22 + +* 1 bug fix: + + * Fixed minitest hoe plugin to be a spermy dep and not depend on itself. + +=== 2.3.0 / 2011-06-15 + +* 5 minor enhancements: + + * Add setup and teardown hooks to MiniTest::TestCase. (phiggins) + * Added nicer error messages for MiniTest::Mock. (phiggins) + * Allow for less specific expected arguments in Mock. (bhenderson/phiggins) + * Made MiniTest::Mock a blank slate. (phiggins) + * Refactored minitest/spec to use the hooks instead of define_inheritable_method. (phiggins) + +* 2 bug fixes: + + * Fixed TestCase's inherited hook. (dchelimsky/phiggins/jamis, the 'good' neighbor) + * MiniTest::Assertions#refute_empty should use mu_pp in the default message. (whatthejeff) + +=== 2.2.2 / 2011-06-01 + +* 2 bug fixes: + + * Got rid of the trailing period in message for assert_equal. (tenderlove) + * Windows needs more flushing. (Akio Tajima) + +=== 2.2.1 / 2011-05-31 + +* 1 bug fix: + + * My _ONE_ non-rubygems-using minitest user goes to Seattle.rb! + +=== 2.2.0 / 2011-05-29 + +* 6 minor enhancements: + + * assert_equal (and must_equal) now tries to diff output where it makes sense. + * Added Assertions#diff(exp, act) to be used by assert_equal. + * Added Assertions#mu_pp_for_diff + * Added Assertions.diff and diff= + * Moved minitest hoe-plugin from hoe-seattlerb. (erikh) + * Skipped tests only output details in verbose mode. (tenderlove+zenspider=xoxo) + +=== 2.1.0 / 2011-04-11 + +* 5 minor enhancements: + + * Added MiniTest::Spec.register_spec_type(matcher, klass) and spec_type(desc) + * Added ability for specs to share code via subclassing of Spec. (metaskills) + * Clarified (or tried to) bench_performance_linear's use of threshold. + * MiniTest::Unit.runner=(runner) provides an easy way of creating custom test runners for specialized needs. (justinweiss) + * Reverse order of inheritance in teardowns of specs. (deepfryed) + +* 3 bug fixes: + + * FINALLY fixed problems of inheriting specs in describe/it/describe scenario. (MGPalmer) + * Fixed a new warning in 1.9.3. + * Fixed assert_block's message handling. (nobu) + +=== 2.0.2 / 2010-12-24 + +* 1 minor enhancement: + + * Completed doco on minitest/benchmark for specs. + +* 1 bug fix: + + * Benchmarks in specs that didn't call bench_range would die. (zzak). + +=== 2.0.1 / 2010-12-15 + +* 4 minor enhancements: + + * Do not filter backtrace if $DEBUG + * Exit autorun via nested at_exit handler, in case other libs call exit + * Make options accesor lazy. + * Split printing of test name and its time. (nurse) + +* 1 bug fix: + + * Fix bug when ^T is hit before runner start + +=== 2.0.0 / 2010-11-11 + +* 3 major enhancements: + + * Added minitest/benchmark! Assert your performance! YAY! + * Refactored runner to allow for more extensibility. See minitest/benchmark. + * This makes the runner backwards incompatible in some ways! + +* 9 minor enhancements: + + * Added MiniTest::Unit.after_tests { ... } + * Improved output by adding test rates and a more sortable verbose format + * Improved readme based on feedback from others + * Added io method to TestCase. If used, it'll supplant '.EF' output. + * Refactored IO in MiniTest::Unit. + * Refactored _run_anything to _run_suite to make it easier to wrap (ngauthier) + * Spec class names are now the unmunged descriptions (btakita) + * YAY for not having redundant rdoc/readmes! + * Help output is now generated from the flags you passed straight up. + +* 4 bug fixes: + + * Fixed scoping issue on minitest/mock (srbaker/prosperity) + * Fixed some of the assertion default messages + * Fixes autorun when on windows with ruby install on different drive (larsch) + * Fixed rdoc output bug in spec.rb + +=== 1.7.2 / 2010-09-23 + +* 3 bug fixes: + + * Fixed doco for expectations and Spec. + * Fixed test_capture_io on 1.9.3+ (sora_h) + * assert_raises now lets MiniTest::Skip through. (shyouhei) + +=== 1.7.1 / 2010-09-01 + +* 1 bug fix: + + * 1.9.2 fixes for spec tests + +=== 1.7.0 / 2010-07-15 + +* 5 minor enhancements: + + * Added assert_output (mapped to must_output). + * Added assert_silent (mapped to must_be_silent). + * Added examples to readme (Mike Dalessio) + * Added options output at the top of the run, for fatal run debugging (tenderlove) + * Spec's describe method returns created class + +=== 1.6.0 / 2010-03-27 // ruby 1.9.2-p290 + +* 10 minor enhancements: + + * Added --seed argument so you can reproduce a random order for debugging. + * Added documentation for assertions + * Added more rdoc and tons of :nodoc: + * Added output to give you all the options you need to reproduce that run. + * Added proper argument parsing to minitest. + * Added unique serial # to spec names so order can be preserved (needs tests). (phrogz) + * Empty 'it' fails with default msg. (phrogz) + * Remove previous method on expect to remove 1.9 warnings + * Spec#it is now order-proof wrt subclasses/nested describes. + * assert_same error message now reports in decimal, eg: oid=123. (mattkent) + +* 2 bug fixes: + + * Fixed message on refute_same to be consistent with assert_same. + * Fixed method randomization to be stable for testing. + +=== 1.5.0 / 2010-01-06 + +* 4 minor enhancements: + + * Added ability to specify what assertions should have their args flipped. + * Don't flip arguments on *include and *respond_to assertions. + * Refactored Module.infect_an_assertion from Module.infect_with_assertions. + * before/after :all now bitches and acts like :each + +* 3 bug fixes: + + * Nested describes now map to nested test classes to avoid namespace collision. + * Using undef_method instead of remove_method to clean out inherited specs. + * assert_raises was ignoring passed in message. + +=== 1.4.2 / 2009-06-25 + +* 1 bug fix: + + * Fixed info handler for systems that don't have siginfo. + +=== 1.4.1 / 2009-06-23 + +* 1 major enhancement: + + * Handle ^C and other fatal exceptions by failing + +* 1 minor enhancement: + + * Added something to catch mixed use of test/unit and minitest if $DEBUG + +* 1 bug fix: + + * Added SIGINFO handler for finding slow tests without verbose + +=== 1.4.0 / 2009-06-18 + +* 5 minor enhancement: + + * Added clarification doco. + * Added specs and mocks to autorun. + * Changed spec test class creation to be non-destructive. + * Updated rakefile for new hoe capabilities. + * describes are nestable (via subclass). before/after/def inherits, specs don't. + +* 3 bug fixes: + + * Fixed location on must/wont. + * Switched to __name__ to avoid common ivar name. + * Fixed indentation in test file (1.9). + +=== 1.3.1 / 2009-01-20 // ruby 1.9.1-p431 + +* 1 minor enhancement: + + * Added miniunit/autorun.rb as replacement for test/unit.rb's autorun. + +* 16 bug fixes: + + * 1.9 test fixes. + * Bug fixes from nobu and akira for really odd scenarios. They run ruby funny. + * Fixed (assert|refute)_match's argument order. + * Fixed LocalJumpError in autorun if exception thrown before at_exit. + * Fixed assert_in_delta (should be >=, not >). + * Fixed assert_raises to match Modules. + * Fixed capture_io to not dup IOs. + * Fixed indentation of capture_io for ruby 1.9 warning. + * Fixed location to deal better with custom assertions and load paths. (Yuki) + * Fixed order of (must|wont)_include in MiniTest::Spec. + * Fixed skip's backtrace. + * Got arg order wrong in *_match in tests, message wrong as a result. + * Made describe private. For some reason I thought that an attribute of Kernel. + * Removed disable_autorun method, added autorun.rb instead. + * assert_match escapes if passed string for pattern. + * instance_of? is different from ===, use instance_of. + +=== 1.3.0 / 2008-10-09 + +* 2 major enhancements: + + * renamed to minitest and pulled out test/unit compatibility. + * mini/test.rb is now minitest/unit.rb, everything else maps directly. + +* 12 minor enhancements: + + * assert_match now checks that act can call =~ and converts exp to a + regexp only if needed. + * Added assert_send... seems useless to me tho. + * message now forces to string... ruby-core likes to pass classes and arrays :( + * Added -v handling and switched to @verbose from $DEBUG. + * Verbose output now includes test class name and adds a sortable running time! + * Switched message generation into procs for message deferment. + * Added skip and renamed fail to flunk. + * Improved output failure messages for assert_instance_of, assert_kind_of + * Improved output for assert_respond_to, assert_same. + * at_exit now exits false instead of errors+failures. + * Made the tests happier and more readable imhfo. + * Switched index(s) == 0 to rindex(s, 0) on nobu's suggestion. Faster. + +* 5 bug fixes: + + * 1.9: Added encoding normalization in mu_pp. + * 1.9: Fixed backtrace filtering (BTs are expanded now) + * Added back exception_details to assert_raises. DOH. + * Fixed shadowed variable in mock.rb + * Fixed stupid muscle memory message bug in assert_send. + +=== 1.2.1 / 2008-06-10 + +* 7 minor enhancements: + + * Added deprecations everywhere in test/unit. + * Added test_order to TestCase. :random on mini, :sorted on test/unit (for now). + * Big cleanup in test/unit for rails. Thanks Jeremy Kemper! + * Minor readability cleanup. + * Pushed setup/run/teardown down to testcase allowing specialized testcases. + * Removed pp. Tests run 2x faster. :/ + * Renamed deprecation methods and moved to test/unit/deprecate.rb. + +=== 1.2.0 / 2008-06-09 + +* 2 major enhancements: + + * Added Mini::Spec. + * Added Mini::Mock. Thanks Steven Baker!! + +* 23 minor enhancements: + + * Added bin/use_miniunit to make it easy to test out miniunit. + * Added -n filtering, thanks to Phil Hagelberg! + * Added args argument to #run, takes ARGV from at_exit. + * Added test name output if $DEBUG. + * Added a refute (was deny) for every assert. + * Added capture_io and a bunch of nice assertions from zentest. + * Added deprecation mechanism for assert_no/not methods to test/unit/assertions. + * Added pp output when available. + * Added tests for all assertions. Pretty much maxed out coverage. + * Added tests to verify consistency and good naming. + * Aliased and deprecated all ugly assertions. + * Cleaned out test/unit. Moved autorun there. + * Code cleanup to make extensions easier. Thanks Chad! + * Got spec args reversed in all but a couple assertions. Much more readable. + * Improved error messages across the board. Adds your message to the default. + * Moved into Mini namespace, renamed to Mini::Test and Mini::Spec. + * Pulled the assertions into their own module... + * Removed as much code as I could while still maintaining full functionality. + * Moved filter_backtrace into MiniTest. + * Removed MiniTest::Unit::run. Unnecessary. + * Removed location_of_failure. Unnecessary. + * Rewrote test/unit's filter_backtrace. Flog from 37.0 to 18.1 + * Removed assert_send. Google says it is never used. + * Renamed MiniTest::Unit.autotest to #run. + * Renamed deny to refute. + * Rewrote some ugly/confusing default assertion messages. + * assert_in_delta now defaults to 0.001 precision. Makes specs prettier. + +* 9 bug fixes: + + * Fixed assert_raises to raise outside of the inner-begin/rescue. + * Fixed for ruby 1.9 and rubinius. + * No longer exits 0 if exception in code PRE-test run causes early exit. + * Removed implementors method list from mini/test.rb - too stale. + * assert_nothing_raised takes a class as an arg. wtf? STUPID + * ".EF" output is now unbuffered. + * Bunch of changes to get working with rails... UGH. + * Added stupid hacks to deal with rails not requiring their dependencies. + * Now bitch loudly if someone defines one of my classes instead of requiring. + * Fixed infect method to work better on 1.9. + * Fixed all shadowed variable warnings in 1.9. + +=== 1.1.0 / 2007-11-08 + +* 4 major enhancements: + + * Finished writing all missing assertions. + * Output matches original test/unit. + * Documented every method needed by language implementor. + * Fully switched over to self-testing setup. + +* 2 minor enhancements: + + * Added deny (assert ! test), our favorite extension to test/unit. + * Added .autotest and fairly complete unit tests. (thanks Chad for help here) + +=== 1.0.0 / 2006-10-30 + +* 1 major enhancement + + * Birthday! diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/Manifest.txt b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/Manifest.txt new file mode 100644 index 000000000000..8e096ff4df8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/Manifest.txt @@ -0,0 +1,27 @@ +.autotest +History.rdoc +Manifest.txt +README.rdoc +Rakefile +design_rationale.rb +lib/hoe/minitest.rb +lib/minitest.rb +lib/minitest/assertions.rb +lib/minitest/autorun.rb +lib/minitest/benchmark.rb +lib/minitest/expectations.rb +lib/minitest/hell.rb +lib/minitest/mock.rb +lib/minitest/parallel.rb +lib/minitest/pride.rb +lib/minitest/pride_plugin.rb +lib/minitest/spec.rb +lib/minitest/test.rb +lib/minitest/unit.rb +test/minitest/metametameta.rb +test/minitest/test_minitest_assertions.rb +test/minitest/test_minitest_benchmark.rb +test/minitest/test_minitest_mock.rb +test/minitest/test_minitest_reporter.rb +test/minitest/test_minitest_spec.rb +test/minitest/test_minitest_test.rb diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/README.rdoc b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/README.rdoc new file mode 100644 index 000000000000..f75e977ee792 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/README.rdoc @@ -0,0 +1,800 @@ += minitest/{test,spec,mock,benchmark} + +home :: https://github.com/seattlerb/minitest +bugs :: https://github.com/seattlerb/minitest/issues +rdoc :: http://docs.seattlerb.org/minitest +vim :: https://github.com/sunaku/vim-ruby-minitest +emacs:: https://github.com/arthurnn/minitest-emacs + +== DESCRIPTION: + +minitest provides a complete suite of testing facilities supporting +TDD, BDD, mocking, and benchmarking. + + "I had a class with Jim Weirich on testing last week and we were + allowed to choose our testing frameworks. Kirk Haines and I were + paired up and we cracked open the code for a few test + frameworks... + + I MUST say that minitest is *very* readable / understandable + compared to the 'other two' options we looked at. Nicely done and + thank you for helping us keep our mental sanity." + + -- Wayne E. Seguin + +minitest/test is a small and incredibly fast unit testing framework. +It provides a rich set of assertions to make your tests clean and +readable. + +minitest/spec is a functionally complete spec engine. It hooks onto +minitest/test and seamlessly bridges test assertions over to spec +expectations. + +minitest/benchmark is an awesome way to assert the performance of your +algorithms in a repeatable manner. Now you can assert that your newb +co-worker doesn't replace your linear algorithm with an exponential +one! + +minitest/mock by Steven Baker, is a beautifully tiny mock (and stub) +object framework. + +minitest/pride shows pride in testing and adds coloring to your test +output. I guess it is an example of how to write IO pipes too. :P + +minitest/test is meant to have a clean implementation for language +implementors that need a minimal set of methods to bootstrap a working +test suite. For example, there is no magic involved for test-case +discovery. + + "Again, I can't praise enough the idea of a testing/specing + framework that I can actually read in full in one sitting!" + + -- Piotr Szotkowski + +Comparing to rspec: + + rspec is a testing DSL. minitest is ruby. + + -- Adam Hawkins, "Bow Before MiniTest" + +minitest doesn't reinvent anything that ruby already provides, like: +classes, modules, inheritance, methods. This means you only have to +learn ruby to use minitest and all of your regular OO practices like +extract-method refactorings still apply. + +== FEATURES/PROBLEMS: + +* minitest/autorun - the easy and explicit way to run all your tests. +* minitest/test - a very fast, simple, and clean test system. +* minitest/spec - a very fast, simple, and clean spec system. +* minitest/mock - a simple and clean mock/stub system. +* minitest/benchmark - an awesome way to assert your algorithm's performance. +* minitest/pride - show your pride in testing! +* Incredibly small and fast runner, but no bells and whistles. +* Written by squishy human beings. Software can never be perfect. We will all eventually die. + +== RATIONALE: + +See design_rationale.rb to see how specs and tests work in minitest. + +== SYNOPSIS: + +Given that you'd like to test the following class: + + class Meme + def i_can_has_cheezburger? + "OHAI!" + end + + def will_it_blend? + "YES!" + end + end + +=== Unit tests + +Define your tests as methods beginning with +test_+. + + require "minitest/autorun" + + class TestMeme < Minitest::Test + def setup + @meme = Meme.new + end + + def test_that_kitty_can_eat + assert_equal "OHAI!", @meme.i_can_has_cheezburger? + end + + def test_that_it_will_not_blend + refute_match /^no/i, @meme.will_it_blend? + end + + def test_that_will_be_skipped + skip "test this later" + end + end + +=== Specs + + require "minitest/autorun" + + describe Meme do + before do + @meme = Meme.new + end + + describe "when asked about cheeseburgers" do + it "must respond positively" do + _(@meme.i_can_has_cheezburger?).must_equal "OHAI!" + end + end + + describe "when asked about blending possibilities" do + it "won't say no" do + _(@meme.will_it_blend?).wont_match /^no/i + end + end + end + +For matchers support check out: + +* https://github.com/wojtekmach/minitest-matchers +* https://github.com/rmm5t/minitest-matchers_vaccine + +=== Benchmarks + +Add benchmarks to your tests. + + # optionally run benchmarks, good for CI-only work! + require "minitest/benchmark" if ENV["BENCH"] + + class TestMeme < Minitest::Benchmark + # Override self.bench_range or default range is [1, 10, 100, 1_000, 10_000] + def bench_my_algorithm + assert_performance_linear 0.9999 do |n| # n is a range value + @obj.my_algorithm(n) + end + end + end + +Or add them to your specs. If you make benchmarks optional, you'll +need to wrap your benchmarks in a conditional since the methods won't +be defined. In minitest 5, the describe name needs to match +<tt>/Bench(mark)?$/</tt>. + + describe "Meme Benchmark" do + if ENV["BENCH"] then + bench_performance_linear "my_algorithm", 0.9999 do |n| + 100.times do + @obj.my_algorithm(n) + end + end + end + end + +outputs something like: + + # Running benchmarks: + + TestBlah 100 1000 10000 + bench_my_algorithm 0.006167 0.079279 0.786993 + bench_other_algorithm 0.061679 0.792797 7.869932 + +Output is tab-delimited to make it easy to paste into a spreadsheet. + +=== Mocks + +Mocks and stubs defined using terminology by Fowler & Meszaros at +http://www.martinfowler.com/bliki/TestDouble.html: + +"Mocks are pre-programmed with expectations which form a specification +of the calls they are expected to receive. They can throw an exception +if they receive a call they don't expect and are checked during +verification to ensure they got all the calls they were expecting." + + class MemeAsker + def initialize(meme) + @meme = meme + end + + def ask(question) + method = question.tr(" ", "_") + "?" + @meme.__send__(method) + end + end + + require "minitest/autorun" + + describe MemeAsker, :ask do + describe "when passed an unpunctuated question" do + it "should invoke the appropriate predicate method on the meme" do + @meme = Minitest::Mock.new + @meme_asker = MemeAsker.new @meme + @meme.expect :will_it_blend?, :return_value + + @meme_asker.ask "will it blend" + + @meme.verify + end + end + end + +==== Multi-threading and Mocks + +Minitest mocks do not support multi-threading. If it works, fine, if it doesn't +you can use regular ruby patterns and facilities like local variables. Here's +an example of asserting that code inside a thread is run: + + def test_called_inside_thread + called = false + pr = Proc.new { called = true } + thread = Thread.new(&pr) + thread.join + assert called, "proc not called" + end + +=== Stubs + +Mocks and stubs are defined using terminology by Fowler & Meszaros at +http://www.martinfowler.com/bliki/TestDouble.html: + +"Stubs provide canned answers to calls made during the test". + +Minitest's stub method overrides a single method for the duration of +the block. + + def test_stale_eh + obj_under_test = Something.new + + refute obj_under_test.stale? + + Time.stub :now, Time.at(0) do # stub goes away once the block is done + assert obj_under_test.stale? + end + end + +A note on stubbing: In order to stub a method, the method must +actually exist prior to stubbing. Use a singleton method to create a +new non-existing method: + + def obj_under_test.fake_method + ... + end + +=== Running Your Tests + +Ideally, you'll use a rake task to run your tests, either piecemeal or +all at once. Both rake and rails ship with rake tasks for running your +tests. BUT! You don't have to: + + % ruby -Ilib:test test/minitest/test_minitest_test.rb + Run options: --seed 37685 + + # Running: + + ...................................................................... (etc) + + Finished in 0.107130s, 1446.8403 runs/s, 2959.0217 assertions/s. + + 155 runs, 317 assertions, 0 failures, 0 errors, 0 skips + +There are runtime options available, both from minitest itself, and also +provided via plugins. To see them, simply run with +--help+: + + % ruby -Ilib:test test/minitest/test_minitest_test.rb --help + minitest options: + -h, --help Display this help. + -s, --seed SEED Sets random seed. Also via env. Eg: SEED=n rake + -v, --verbose Verbose. Show progress processing files. + -n, --name PATTERN Filter run on /regexp/ or string. + -e, --exclude PATTERN Exclude /regexp/ or string from run. + + Known extensions: pride, autotest + -p, --pride Pride. Show your testing pride! + -a, --autotest Connect to autotest server. + +You can set up a rake task to run all your tests by adding this to your Rakefile: + + require "rake/testtask" + + Rake::TestTask.new(:test) do |t| + t.libs << "test" + t.libs << "lib" + t.test_files = FileList["test/**/test_*.rb"] + end + + task :default => :test + +== Writing Extensions + +To define a plugin, add a file named minitest/XXX_plugin.rb to your +project/gem. That file must be discoverable via ruby's LOAD_PATH (via +rubygems or otherwise). Minitest will find and require that file using +Gem.find_files. It will then try to call +plugin_XXX_init+ during +startup. The option processor will also try to call +plugin_XXX_options+ +passing the OptionParser instance and the current options hash. This +lets you register your own command-line options. Here's a totally +bogus example: + + # minitest/bogus_plugin.rb: + + module Minitest + def self.plugin_bogus_options(opts, options) + opts.on "--myci", "Report results to my CI" do + options[:myci] = true + options[:myci_addr] = get_myci_addr + options[:myci_port] = get_myci_port + end + end + + def self.plugin_bogus_init(options) + self.reporter << MyCI.new(options) if options[:myci] + end + end + +=== Adding custom reporters + +Minitest uses composite reporter to output test results using multiple +reporter instances. You can add new reporters to the composite during +the init_plugins phase. As we saw in +plugin_bogus_init+ above, you +simply add your reporter instance to the composite via <tt><<</tt>. + ++AbstractReporter+ defines the API for reporters. You may subclass it +and override any method you want to achieve your desired behavior. + +start :: Called when the run has started. +record :: Called for each result, passed or otherwise. +report :: Called at the end of the run. +passed? :: Called to see if you detected any problems. + +Using our example above, here is how we might implement MyCI: + + # minitest/bogus_plugin.rb + + module Minitest + class MyCI < AbstractReporter + attr_accessor :results, :addr, :port + + def initialize options + self.results = [] + self.addr = options[:myci_addr] + self.port = options[:myci_port] + end + + def record result + self.results << result + end + + def report + CI.connect(addr, port).send_results self.results + end + end + + # code from above... + end + +== FAQ + +=== What versions are compatible with what? Or what versions are supported? + +Minitest is a dependency of rails, which until fairly recently had an +overzealous backwards compatibility policy. As such, I'm stuck +supporting versions of ruby that are long past EOL. Once rails 5.2 is +dropped (hopefully April 2021), I get to drop a bunch of versions of +ruby that I have to currently test against. + +(As of 2021-01-31) + +Current versions of rails: (https://endoflife.date/rails) + + | rails | min ruby | rec ruby | minitest | status | + |-------+----------+----------+----------+----------| + | 7.0 | >= 2.7 | 3.0 | >= 5.1 | Future | + | 6.1 | >= 2.5 | 3.0 | >= 5.1 | Current | + | 6.0 | >= 2.5 | 2.6 | >= 5.1 | Security | + | 5.2 | >= 2.2.2 | 2.5 | ~> 5.1 | Security | EOL @railsconf 2021? + +Current versions of ruby: (https://endoflife.date/ruby) + + | ruby | Status | EOL Date | + |------+---------+------------| + | 3.0 | Current | 2024-03-31 | + | 2.7 | Maint | 2023-03-31 | + | 2.6 | Maint | 2022-03-31 | + | 2.5 | Maint* | 2021-03-31 | + | 2.4 | EOL | 2020-03-31 | + | 2.3 | EOL | 2019-03-31 | + | 2.2 | EOL | 2018-03-31 | + +See also: + +* https://www.fastruby.io/blog/ruby/rails/versions/compatibility-table.html +* https://jamesjeffersconsulting.com/ruby-rails-version-matrix/ + +=== How to test SimpleDelegates? + +The following implementation and test: + + class Worker < SimpleDelegator + def work + end + end + + describe Worker do + before do + @worker = Worker.new(Object.new) + end + + it "must respond to work" do + _(@worker).must_respond_to :work + end + end + +outputs a failure: + + 1) Failure: + Worker#test_0001_must respond to work [bug11.rb:16]: + Expected #<Object:0x007f9e7184f0a0> (Object) to respond to #work. + +Worker is a SimpleDelegate which in 1.9+ is a subclass of BasicObject. +Expectations are put on Object (one level down) so the Worker +(SimpleDelegate) hits +method_missing+ and delegates down to the ++Object.new+ instance. That object doesn't respond to work so the test +fails. + +You can bypass <tt>SimpleDelegate#method_missing</tt> by extending the worker +with <tt>Minitest::Expectations</tt>. You can either do that in your setup at +the instance level, like: + + before do + @worker = Worker.new(Object.new) + @worker.extend Minitest::Expectations + end + +or you can extend the Worker class (within the test file!), like: + + class Worker + include ::Minitest::Expectations + end + +=== How to share code across test classes? + +Use a module. That's exactly what they're for: + + module UsefulStuff + def useful_method + # ... + end + end + + describe Blah do + include UsefulStuff + + def test_whatever + # useful_method available here + end + end + +Remember, +describe+ simply creates test classes. It's just ruby at +the end of the day and all your normal Good Ruby Rules (tm) apply. If +you want to extend your test using setup/teardown via a module, just +make sure you ALWAYS call super. before/after automatically call super +for you, so make sure you don't do it twice. + +=== How to run code before a group of tests? + +Use a constant with begin...end like this: + + describe Blah do + SETUP = begin + # ... this runs once when describe Blah starts + end + # ... + end + +This can be useful for expensive initializations or sharing state. +Remember, this is just ruby code, so you need to make sure this +technique and sharing state doesn't interfere with your tests. + +=== Why am I seeing <tt>uninitialized constant MiniTest::Test (NameError)</tt>? + +Are you running the test with Bundler (e.g. via <tt>bundle exec</tt> )? If so, +in order to require minitest, you must first add the <tt>gem 'minitest'</tt> +to your Gemfile and run +bundle+. Once it's installed, you should be +able to require minitest and run your tests. + +== Prominent Projects using Minitest: + +* arel +* journey +* mime-types +* nokogiri +* rails (active_support et al) +* rake +* rdoc +* ...and of course, everything from seattle.rb... + +== Developing Minitest: + +Minitest requires {Hoe}[https://rubygems.org/gems/hoe]. + +=== Minitest's own tests require UTF-8 external encoding. + +This is a common problem in Windows, where the default external Encoding is +often CP850, but can affect any platform. +Minitest can run test suites using any Encoding, but to run Minitest's +own tests you must have a default external Encoding of UTF-8. + +If your encoding is wrong, you'll see errors like: + + --- expected + +++ actual + @@ -1,2 +1,3 @@ + # encoding: UTF-8 + -"Expected /\\w+/ to not match \"blah blah blah\"." + +"Expected /\\w+/ to not match # encoding: UTF-8 + +\"blah blah blah\"." + +To check your current encoding, run: + + ruby -e 'puts Encoding.default_external' + +If your output is something other than UTF-8, you can set the RUBYOPTS +env variable to a value of '-Eutf-8'. Something like: + + RUBYOPT='-Eutf-8' ruby -e 'puts Encoding.default_external' + +Check your OS/shell documentation for the precise syntax (the above +will not work on a basic Windows CMD prompt, look for the SET command). +Once you've got it successfully outputing UTF-8, use the same setting +when running rake in Minitest. + +=== Minitest's own tests require GNU (or similar) diff. + +This is also a problem primarily affecting Windows developers. PowerShell +has a command called diff, but it is not suitable for use with Minitest. + +If you see failures like either of these, you are probably missing diff tool: + + 4) Failure: + TestMinitestUnitTestCase#test_assert_equal_different_long [D:/ruby/seattlerb/minitest/test/minitest/test_minitest_test.rb:936]: + Expected: "--- expected\n+++ actual\n@@ -1 +1 @@\n-\"hahahahahahahahahahahahahahahahahahahaha\"\n+\"blahblahblahblahblahblahblahblahblahblah\"\n" + Actual: "Expected: \"hahahahahahahahahahahahahahahahahahahaha\"\n Actual: \"blahblahblahblahblahblahblahblahblahblah\"" + + + 5) Failure: + TestMinitestUnitTestCase#test_assert_equal_different_collection_hash_hex_invisible [D:/ruby/seattlerb/minitest/test/minitest/test_minitest_test.rb:845]: + Expected: "No visible difference in the Hash#inspect output.\nYou should look at the implementation of #== on Hash or its members.\n + {1=>#<Object:0xXXXXXX>}" + Actual: "Expected: {1=>#<Object:0x00000003ba0470>}\n Actual: {1=>#<Object:0x00000003ba0448>}" + + +If you use Cygwin or MSYS2 or similar there are packages that include a +GNU diff for Windows. If you don't, you can download GNU diffutils from +http://gnuwin32.sourceforge.net/packages/diffutils.htm +(make sure to add it to your PATH). + +You can make sure it's installed and path is configured properly with: + + diff.exe -v + +There are multiple lines of output, the first should be something like: + + diff (GNU diffutils) 2.8.1 + +If you are using PowerShell make sure you run diff.exe, not just diff, +which will invoke the PowerShell built in function. + +== Known Extensions: + +capybara_minitest_spec :: Bridge between Capybara RSpec matchers and + Minitest::Spec expectations (e.g. + <tt>page.must_have_content("Title")</tt>). +color_pound_spec_reporter :: Test names print Ruby Object types in color with + your Minitest Spec style tests. +minispec-metadata :: Metadata for describe/it blocks & CLI tag filter. + E.g. <tt>it "requires JS driver", js: true do</tt> & + <tt>ruby test.rb --tag js</tt> runs tests tagged :js. +minispec-rails :: Minimal support to use Spec style in Rails 5+. +mini-apivore :: for swagger based automated API testing. +minitest-around :: Around block for minitest. An alternative to + setup/teardown dance. +minitest-assert_errors :: Adds Minitest assertions to test for errors raised + or not raised by Minitest itself. +minitest-autotest :: autotest is a continuous testing facility meant to + be used during development. +minitest-bacon :: minitest-bacon extends minitest with bacon-like + functionality. +minitest-bang :: Adds support for RSpec-style let! to immediately + invoke let statements before each test. +minitest-bisect :: Helps you isolate and debug random test failures. +minitest-blink1_reporter :: Display test results with a Blink1. +minitest-capistrano :: Assertions and expectations for testing + Capistrano recipes. +minitest-capybara :: Capybara matchers support for minitest unit and + spec. +minitest-chef-handler :: Run Minitest suites as Chef report handlers +minitest-ci :: CI reporter plugin for Minitest. +minitest-context :: Defines contexts for code reuse in Minitest + specs that share common expectations. +minitest-debugger :: Wraps assert so failed assertions drop into + the ruby debugger. +minitest-display :: Patches Minitest to allow for an easily + configurable output. +minitest-documentation :: Minimal documentation format inspired by rspec's. +minitest-doc_reporter :: Detailed output inspired by rspec's documentation + format. +minitest-emoji :: Print out emoji for your test passes, fails, and + skips. +minitest-english :: Semantically symmetric aliases for assertions and + expectations. +minitest-excludes :: Clean API for excluding certain tests you + don't want to run under certain conditions. +minitest-fail-fast :: Reimplements RSpec's "fail fast" feature +minitest-filecontent :: Support unit tests with expectation results in files. + Differing results will be stored again in files. +minitest-filesystem :: Adds assertion and expectation to help testing + filesystem contents. +minitest-firemock :: Makes your Minitest mocks more resilient. +minitest-focus :: Focus on one test at a time. +minitest-gcstats :: A minitest plugin that adds a report of the top + tests by number of objects allocated. +minitest-global_expectations:: Support minitest expectation methods for all objects +minitest-great_expectations :: Generally useful additions to minitest's + assertions and expectations. +minitest-growl :: Test notifier for minitest via growl. +minitest-happy :: GLOBALLY ACTIVATE MINITEST PRIDE! RAWR! +minitest-have_tag :: Adds Minitest assertions to test for the existence of + HTML tags, including contents, within a provided string. +minitest-hooks :: Around and before_all/after_all/around_all hooks +minitest-hyper :: Pretty, single-page HTML reports for your Minitest runs +minitest-implicit-subject :: Implicit declaration of the test subject. +minitest-instrument :: Instrument ActiveSupport::Notifications when + test method is executed. +minitest-instrument-db :: Store information about speed of test execution + provided by minitest-instrument in database. +minitest-junit :: JUnit-style XML reporter for minitest. +minitest-keyword :: Use Minitest assertions with keyword arguments. +minitest-libnotify :: Test notifier for minitest via libnotify. +minitest-line :: Run test at line number. +minitest-logger :: Define assert_log and enable minitest to test log messages. + Supports Logger and Log4r::Logger. +minitest-macruby :: Provides extensions to minitest for macruby UI + testing. +minitest-matchers :: Adds support for RSpec-style matchers to + minitest. +minitest-matchers_vaccine :: Adds assertions that adhere to the matcher spec, + but without any expectation infections. +minitest-metadata :: Annotate tests with metadata (key-value). +minitest-mock_expectations :: Provides method call assertions for minitest. +minitest-mongoid :: Mongoid assertion matchers for Minitest. +minitest-must_not :: Provides must_not as an alias for wont in + Minitest. +minitest-optional_retry :: Automatically retry failed test to help with flakiness. +minitest-osx :: Reporter for the Mac OS X notification center. +minitest-parallel_fork :: Fork-based parallelization +minitest-parallel-db :: Run tests in parallel with a single database. +minitest-power_assert :: PowerAssert for Minitest. +minitest-predicates :: Adds support for .predicate? methods. +minitest-profile :: List the 10 slowest tests in your suite. +minitest-rails :: Minitest integration for Rails 3.x. +minitest-rails-capybara :: Capybara integration for Minitest::Rails. +minitest-reporters :: Create customizable Minitest output formats. +minitest-rg :: Colored red/green output for Minitest. +minitest-rspec_mocks :: Use RSpec Mocks with Minitest. +minitest-server :: minitest-server provides a client/server setup + with your minitest process, allowing your test + run to send its results directly to a handler. +minitest-sequel :: Minitest assertions to speed-up development and + testing of Ruby Sequel database setups. +minitest-shared_description :: Support for shared specs and shared spec + subclasses +minitest-should_syntax :: RSpec-style <tt>x.should == y</tt> assertions for + Minitest. +minitest-shouldify :: Adding all manner of shoulds to Minitest (bad + idea) +minitest-snail :: Print a list of tests that take too long +minitest-spec-context :: Provides rspec-ish context method to + Minitest::Spec. +minitest-spec-expect :: Expect syntax for Minitest::Spec (e.g. + expect(sequences).to_include :celery_man). +minitest-spec-magic :: Minitest::Spec extensions for Rails and beyond. +minitest-spec-rails :: Drop in Minitest::Spec superclass for + ActiveSupport::TestCase. +minitest-sprint :: Runs (Get it? It's fast!) your tests and makes + it easier to rerun individual failures. +minitest-stately :: Find leaking state between tests +minitest-stub_any_instance :: Stub any instance of a method on the given class + for the duration of a block. +minitest-stub-const :: Stub constants for the duration of a block. +minitest-tags :: Add tags for minitest. +minitest-unordered :: Adds a new assertion to minitest for checking the + contents of a collection, ignoring element order. +minitest-vcr :: Automatic cassette managment with Minitest::Spec + and VCR. +minitest_log :: Adds structured logging, data explication, and verdicts. +minitest_owrapper :: Get tests results as a TestResult object. +minitest_should :: Shoulda style syntax for minitest test::unit. +minitest_tu_shim :: Bridges between test/unit and minitest. +mongoid-minitest :: Minitest matchers for Mongoid. +mutant-minitest :: Minitest integration for mutant. +pry-rescue :: A pry plugin w/ minitest support. See + pry-rescue/minitest.rb. +rspec2minitest :: Easily translate any RSpec matchers to Minitest + assertions and expectations. + +== Unknown Extensions: + +Authors... Please send me a pull request with a description of your minitest extension. + +* assay-minitest +* detroit-minitest +* em-minitest-spec +* flexmock-minitest +* guard-minitest +* guard-minitest-decisiv +* minitest-activemodel +* minitest-ar-assertions +* minitest-capybara-unit +* minitest-colorer +* minitest-deluxe +* minitest-extra-assertions +* minitest-rails-shoulda +* minitest-spec +* minitest-spec-should +* minitest-sugar +* spork-minitest + +== Minitest related goods + +* minitest/pride fabric: http://www.spoonflower.com/fabric/3928730-again-by-katie_allen + +== REQUIREMENTS: + +* Ruby 2.3+. No magic is involved. I hope. + +== INSTALL: + + sudo gem install minitest + +On 1.9, you already have it. To get newer candy you can still install +the gem, and then requiring "minitest/autorun" should automatically +pull it in. If not, you'll need to do it yourself: + + gem "minitest" # ensures you"re using the gem, and not the built-in MT + require "minitest/autorun" + + # ... usual testing stuffs ... + +DO NOTE: There is a serious problem with the way that ruby 1.9/2.0 +packages their own gems. They install a gem specification file, but +don't install the gem contents in the gem path. This messes up +Gem.find_files and many other things (gem which, gem contents, etc). + +Just install minitest as a gem for real and you'll be happier. + +== LICENSE: + +(The MIT License) + +Copyright (c) Ryan Davis, seattle.rb + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/Rakefile b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/Rakefile new file mode 100644 index 000000000000..a09f9a6659af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/Rakefile @@ -0,0 +1,74 @@ +# -*- ruby -*- + +require "rubygems" +require "hoe" + +Hoe.plugin :seattlerb +Hoe.plugin :rdoc + +Hoe.spec "minitest" do + developer "Ryan Davis", "ryand-ruby@zenspider.com" + + license "MIT" + + require_ruby_version [">= 2.2", "< 4.0"] +end + +desc "Find missing expectations" +task :specs do + $:.unshift "lib" + require "minitest/test" + require "minitest/spec" + + pos_prefix, neg_prefix = "must", "wont" + skip_re = /^(must|wont)$|wont_(throw)|must_(block|not?_|nothing|send|raise$)/x + dont_flip_re = /(must|wont)_(include|respond_to)/ + + map = { + /(must_throw)s/ => '\1', + /(?!not)_same/ => "_be_same_as", + /_in_/ => "_be_within_", + /_operator/ => "_be", + /_includes/ => "_include", + /(must|wont)_(.*_of|nil|silent|empty)/ => '\1_be_\2', + /must_raises/ => "must_raise", + /(must|wont)_predicate/ => '\1_be', + /(must|wont)_path_exists/ => 'path_\1_exist', + } + + expectations = Minitest::Expectations.public_instance_methods.map(&:to_s) + assertions = Minitest::Assertions.public_instance_methods.map(&:to_s) + + assertions.sort.each do |assertion| + expectation = case assertion + when /^assert/ then + assertion.sub(/^assert/, pos_prefix.to_s) + when /^refute/ then + assertion.sub(/^refute/, neg_prefix.to_s) + end + + next unless expectation + next if expectation =~ skip_re + + regexp, replacement = map.find { |re, _| expectation =~ re } + expectation.sub! regexp, replacement if replacement + + next if expectations.include? expectation + + args = [assertion, expectation].map(&:to_sym).map(&:inspect) + args << :reverse if expectation =~ dont_flip_re + + puts + puts "##" + puts "# :method: #{expectation}" + puts "# See Minitest::Assertions##{assertion}" + puts + puts "infect_an_assertion #{args.join ", "}" + end +end + +task :bugs do + sh "for f in bug*.rb ; do echo $f; echo; #{Gem.ruby} -Ilib $f && rm $f ; done" +end + +# vim: syntax=Ruby diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/design_rationale.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/design_rationale.rb new file mode 100644 index 000000000000..a3fcc378c2ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/design_rationale.rb @@ -0,0 +1,52 @@ +# Specs: # Equivalent Unit Tests: +############################################################################### +describe Thingy do # class TestThingy < Minitest::Test + before do # def setup + do_some_setup # super + end # do_some_setup + # end + it "should do the first thing" do # + 1.must_equal 1 # def test_first_thing + end # assert_equal 1, 1 + # end + describe SubThingy do # end + before do # + do_more_setup # class TestSubThingy < TestThingy + end # def setup + # super + it "should do the second thing" do # do_more_setup + 2.must_equal 2 # end + end # + end # def test_second_thing +end # assert_equal 2, 2 + # end + # end +############################################################################### +# runs 2 specs # runs 3 tests +############################################################################### +# The specs generate: + +class ThingySpec < Minitest::Spec + def setup + super + do_some_setup + end + + def test_should_do_the_first_thing + assert_equal 1, 1 + end +end + +class SubThingySpec < ThingySpec + def setup + super + do_more_setup + end + + # because only setup/teardown is inherited, not specs + remove_method :test_should_do_the_first_thing + + def test_should_do_the_second_thing + assert_equal 2, 2 + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/hoe/minitest.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/hoe/minitest.rb new file mode 100644 index 000000000000..6c045a5f4361 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/hoe/minitest.rb @@ -0,0 +1,32 @@ +# :stopdoc: + +class Hoe +end + +module Hoe::Minitest + def minitest? + self.name == "minitest" + end + + def initialize_minitest + unless minitest? then + dir = "../../minitest/dev/lib" + Hoe.add_include_dirs dir if File.directory? dir + end + + gem "minitest" + require "minitest" + version = Minitest::VERSION.split(/\./).first(2).join(".") + + dependency "minitest", "~> #{version}", :development unless + minitest? or ENV["MT_NO_ISOLATE"] + end + + def define_minitest_tasks + self.testlib = :minitest + + # make sure we use the gemmed minitest on 1.9 + self.test_prelude = 'gem "minitest"' unless + minitest? or ENV["MT_NO_ISOLATE"] + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest.rb new file mode 100644 index 000000000000..932be50ba3c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest.rb @@ -0,0 +1,1056 @@ +require "optparse" +require "thread" +require "mutex_m" +require "minitest/parallel" +require "stringio" + +## +# :include: README.rdoc + +module Minitest + VERSION = "5.14.4" # :nodoc: + ENCS = "".respond_to? :encoding # :nodoc: + + @@installed_at_exit ||= false + @@after_run = [] + @extensions = [] + + mc = (class << self; self; end) + + ## + # Parallel test executor + + mc.send :attr_accessor, :parallel_executor + + warn "DEPRECATED: use MT_CPU instead of N for parallel test runs" if ENV["N"] + n_threads = (ENV["MT_CPU"] || ENV["N"] || 2).to_i + self.parallel_executor = Parallel::Executor.new n_threads + + ## + # Filter object for backtraces. + + mc.send :attr_accessor, :backtrace_filter + + ## + # Reporter object to be used for all runs. + # + # NOTE: This accessor is only available during setup, not during runs. + + mc.send :attr_accessor, :reporter + + ## + # Names of known extension plugins. + + mc.send :attr_accessor, :extensions + + ## + # The signal to use for dumping information to STDERR. Defaults to "INFO". + + mc.send :attr_accessor, :info_signal + self.info_signal = "INFO" + + ## + # Registers Minitest to run at process exit + + def self.autorun + at_exit { + next if $! and not ($!.kind_of? SystemExit and $!.success?) + + exit_code = nil + + pid = Process.pid + at_exit { + next if Process.pid != pid + @@after_run.reverse_each(&:call) + exit exit_code || false + } + + exit_code = Minitest.run ARGV + } unless @@installed_at_exit + @@installed_at_exit = true + end + + ## + # A simple hook allowing you to run a block of code after everything + # is done running. Eg: + # + # Minitest.after_run { p $debugging_info } + + def self.after_run &block + @@after_run << block + end + + def self.init_plugins options # :nodoc: + self.extensions.each do |name| + msg = "plugin_#{name}_init" + send msg, options if self.respond_to? msg + end + end + + def self.load_plugins # :nodoc: + return unless self.extensions.empty? + + seen = {} + + require "rubygems" unless defined? Gem + + Gem.find_files("minitest/*_plugin.rb").each do |plugin_path| + name = File.basename plugin_path, "_plugin.rb" + + next if seen[name] + seen[name] = true + + require plugin_path + self.extensions << name + end + end + + ## + # This is the top-level run method. Everything starts from here. It + # tells each Runnable sub-class to run, and each of those are + # responsible for doing whatever they do. + # + # The overall structure of a run looks like this: + # + # Minitest.autorun + # Minitest.run(args) + # Minitest.__run(reporter, options) + # Runnable.runnables.each + # runnable.run(reporter, options) + # self.runnable_methods.each + # self.run_one_method(self, runnable_method, reporter) + # Minitest.run_one_method(klass, runnable_method) + # klass.new(runnable_method).run + + def self.run args = [] + self.load_plugins unless args.delete("--no-plugins") || ENV["MT_NO_PLUGINS"] + + options = process_args args + + reporter = CompositeReporter.new + reporter << SummaryReporter.new(options[:io], options) + reporter << ProgressReporter.new(options[:io], options) + + self.reporter = reporter # this makes it available to plugins + self.init_plugins options + self.reporter = nil # runnables shouldn't depend on the reporter, ever + + self.parallel_executor.start if parallel_executor.respond_to?(:start) + reporter.start + begin + __run reporter, options + rescue Interrupt + warn "Interrupted. Exiting..." + end + self.parallel_executor.shutdown + reporter.report + + reporter.passed? + end + + ## + # Internal run method. Responsible for telling all Runnable + # sub-classes to run. + + def self.__run reporter, options + suites = Runnable.runnables.reject { |s| s.runnable_methods.empty? }.shuffle + parallel, serial = suites.partition { |s| s.test_order == :parallel } + + # If we run the parallel tests before the serial tests, the parallel tests + # could run in parallel with the serial tests. This would be bad because + # the serial tests won't lock around Reporter#record. Run the serial tests + # first, so that after they complete, the parallel tests will lock when + # recording results. + serial.map { |suite| suite.run reporter, options } + + parallel.map { |suite| suite.run reporter, options } + end + + def self.process_args args = [] # :nodoc: + options = { + :io => $stdout, + } + orig_args = args.dup + + OptionParser.new do |opts| + opts.banner = "minitest options:" + opts.version = Minitest::VERSION + + opts.on "-h", "--help", "Display this help." do + puts opts + exit + end + + opts.on "--no-plugins", "Bypass minitest plugin auto-loading (or set $MT_NO_PLUGINS)." + + desc = "Sets random seed. Also via env. Eg: SEED=n rake" + opts.on "-s", "--seed SEED", Integer, desc do |m| + options[:seed] = m.to_i + end + + opts.on "-v", "--verbose", "Verbose. Show progress processing files." do + options[:verbose] = true + end + + opts.on "-n", "--name PATTERN", "Filter run on /regexp/ or string." do |a| + options[:filter] = a + end + + opts.on "-e", "--exclude PATTERN", "Exclude /regexp/ or string from run." do |a| + options[:exclude] = a + end + + unless extensions.empty? + opts.separator "" + opts.separator "Known extensions: #{extensions.join(", ")}" + + extensions.each do |meth| + msg = "plugin_#{meth}_options" + send msg, opts, options if self.respond_to?(msg) + end + end + + begin + opts.parse! args + rescue OptionParser::InvalidOption => e + puts + puts e + puts + puts opts + exit 1 + end + + orig_args -= args + end + + unless options[:seed] then + srand + options[:seed] = (ENV["SEED"] || srand).to_i % 0xFFFF + orig_args << "--seed" << options[:seed].to_s + end + + srand options[:seed] + + options[:args] = orig_args.map { |s| + s =~ /[\s|&<>$()]/ ? s.inspect : s + }.join " " + + options + end + + def self.filter_backtrace bt # :nodoc: + result = backtrace_filter.filter bt + result = bt.dup if result.empty? + result + end + + ## + # Represents anything "runnable", like Test, Spec, Benchmark, or + # whatever you can dream up. + # + # Subclasses of this are automatically registered and available in + # Runnable.runnables. + + class Runnable + ## + # Number of assertions executed in this run. + + attr_accessor :assertions + + ## + # An assertion raised during the run, if any. + + attr_accessor :failures + + ## + # The time it took to run. + + attr_accessor :time + + def time_it # :nodoc: + t0 = Minitest.clock_time + + yield + ensure + self.time = Minitest.clock_time - t0 + end + + ## + # Name of the run. + + def name + @NAME + end + + ## + # Set the name of the run. + + def name= o + @NAME = o + end + + ## + # Returns all instance methods matching the pattern +re+. + + def self.methods_matching re + public_instance_methods(true).grep(re).map(&:to_s) + end + + def self.reset # :nodoc: + @@runnables = [] + end + + reset + + ## + # Responsible for running all runnable methods in a given class, + # each in its own instance. Each instance is passed to the + # reporter to record. + + def self.run reporter, options = {} + filter = options[:filter] || "/./" + filter = Regexp.new $1 if filter.is_a?(String) && filter =~ %r%/(.*)/% + + filtered_methods = self.runnable_methods.find_all { |m| + filter === m || filter === "#{self}##{m}" + } + + exclude = options[:exclude] + exclude = Regexp.new $1 if exclude =~ %r%/(.*)/% + + filtered_methods.delete_if { |m| + exclude === m || exclude === "#{self}##{m}" + } + + return if filtered_methods.empty? + + with_info_handler reporter do + filtered_methods.each do |method_name| + run_one_method self, method_name, reporter + end + end + end + + ## + # Runs a single method and has the reporter record the result. + # This was considered internal API but is factored out of run so + # that subclasses can specialize the running of an individual + # test. See Minitest::ParallelTest::ClassMethods for an example. + + def self.run_one_method klass, method_name, reporter + reporter.prerecord klass, method_name + reporter.record Minitest.run_one_method(klass, method_name) + end + + def self.with_info_handler reporter, &block # :nodoc: + handler = lambda do + unless reporter.passed? then + warn "Current results:" + warn "" + warn reporter.reporters.first + warn "" + end + end + + on_signal ::Minitest.info_signal, handler, &block + end + + SIGNALS = Signal.list # :nodoc: + + def self.on_signal name, action # :nodoc: + supported = SIGNALS[name] + + old_trap = trap name do + old_trap.call if old_trap.respond_to? :call + action.call + end if supported + + yield + ensure + trap name, old_trap if supported + end + + ## + # Each subclass of Runnable is responsible for overriding this + # method to return all runnable methods. See #methods_matching. + + def self.runnable_methods + raise NotImplementedError, "subclass responsibility" + end + + ## + # Returns all subclasses of Runnable. + + def self.runnables + @@runnables + end + + @@marshal_dump_warned = false + + def marshal_dump # :nodoc: + unless @@marshal_dump_warned then + warn ["Minitest::Runnable#marshal_dump is deprecated.", + "You might be violating internals. From", caller.first].join " " + @@marshal_dump_warned = true + end + + [self.name, self.failures, self.assertions, self.time] + end + + def marshal_load ary # :nodoc: + self.name, self.failures, self.assertions, self.time = ary + end + + def failure # :nodoc: + self.failures.first + end + + def initialize name # :nodoc: + self.name = name + self.failures = [] + self.assertions = 0 + end + + ## + # Runs a single method. Needs to return self. + + def run + raise NotImplementedError, "subclass responsibility" + end + + ## + # Did this run pass? + # + # Note: skipped runs are not considered passing, but they don't + # cause the process to exit non-zero. + + def passed? + raise NotImplementedError, "subclass responsibility" + end + + ## + # Returns a single character string to print based on the result + # of the run. One of <tt>"."</tt>, <tt>"F"</tt>, + # <tt>"E"</tt> or <tt>"S"</tt>. + + def result_code + raise NotImplementedError, "subclass responsibility" + end + + ## + # Was this run skipped? See #passed? for more information. + + def skipped? + raise NotImplementedError, "subclass responsibility" + end + end + + ## + # Shared code for anything that can get passed to a Reporter. See + # Minitest::Test & Minitest::Result. + + module Reportable + ## + # Did this run pass? + # + # Note: skipped runs are not considered passing, but they don't + # cause the process to exit non-zero. + + def passed? + not self.failure + end + + ## + # The location identifier of this test. Depends on a method + # existing called class_name. + + def location + loc = " [#{self.failure.location}]" unless passed? or error? + "#{self.class_name}##{self.name}#{loc}" + end + + def class_name # :nodoc: + raise NotImplementedError, "subclass responsibility" + end + + ## + # Returns ".", "F", or "E" based on the result of the run. + + def result_code + self.failure and self.failure.result_code or "." + end + + ## + # Was this run skipped? + + def skipped? + self.failure and Skip === self.failure + end + + ## + # Did this run error? + + def error? + self.failures.any? { |f| UnexpectedError === f } + end + end + + ## + # This represents a test result in a clean way that can be + # marshalled over a wire. Tests can do anything they want to the + # test instance and can create conditions that cause Marshal.dump to + # blow up. By using Result.from(a_test) you can be reasonably sure + # that the test result can be marshalled. + + class Result < Runnable + include Minitest::Reportable + + undef_method :marshal_dump + undef_method :marshal_load + + ## + # The class name of the test result. + + attr_accessor :klass + + ## + # The location of the test method. + + attr_accessor :source_location + + ## + # Create a new test result from a Runnable instance. + + def self.from runnable + o = runnable + + r = self.new o.name + r.klass = o.class.name + r.assertions = o.assertions + r.failures = o.failures.dup + r.time = o.time + + r.source_location = o.method(o.name).source_location rescue ["unknown", -1] + + r + end + + def class_name # :nodoc: + self.klass # for Minitest::Reportable + end + + def to_s # :nodoc: + return location if passed? and not skipped? + + failures.map { |failure| + "#{failure.result_label}:\n#{self.location}:\n#{failure.message}\n" + }.join "\n" + end + end + + ## + # Defines the API for Reporters. Subclass this and override whatever + # you want. Go nuts. + + class AbstractReporter + include Mutex_m + + ## + # Starts reporting on the run. + + def start + end + + ## + # About to start running a test. This allows a reporter to show + # that it is starting or that we are in the middle of a test run. + + def prerecord klass, name + end + + ## + # Output and record the result of the test. Call + # {result#result_code}[rdoc-ref:Runnable#result_code] to get the + # result character string. Stores the result of the run if the run + # did not pass. + + def record result + end + + ## + # Outputs the summary of the run. + + def report + end + + ## + # Did this run pass? + + def passed? + true + end + end + + class Reporter < AbstractReporter # :nodoc: + ## + # The IO used to report. + + attr_accessor :io + + ## + # Command-line options for this run. + + attr_accessor :options + + def initialize io = $stdout, options = {} # :nodoc: + super() + self.io = io + self.options = options + end + end + + ## + # A very simple reporter that prints the "dots" during the run. + # + # This is added to the top-level CompositeReporter at the start of + # the run. If you want to change the output of minitest via a + # plugin, pull this out of the composite and replace it with your + # own. + + class ProgressReporter < Reporter + def prerecord klass, name #:nodoc: + if options[:verbose] then + io.print "%s#%s = " % [klass.name, name] + io.flush + end + end + + def record result # :nodoc: + io.print "%.2f s = " % [result.time] if options[:verbose] + io.print result.result_code + io.puts if options[:verbose] + end + end + + ## + # A reporter that gathers statistics about a test run. Does not do + # any IO because meant to be used as a parent class for a reporter + # that does. + # + # If you want to create an entirely different type of output (eg, + # CI, HTML, etc), this is the place to start. + # + # Example: + # + # class JenkinsCIReporter < StatisticsReporter + # def report + # super # Needed to calculate some statistics + # + # print "<testsuite " + # print "tests='#{count}' " + # print "failures='#{failures}' " + # # Remaining XML... + # end + # end + + class StatisticsReporter < Reporter + ## + # Total number of assertions. + + attr_accessor :assertions + + ## + # Total number of test cases. + + attr_accessor :count + + ## + # An +Array+ of test cases that failed or were skipped. + + attr_accessor :results + + ## + # Time the test run started. If available, the monotonic clock is + # used and this is a +Float+, otherwise it's an instance of + # +Time+. + + attr_accessor :start_time + + ## + # Test run time. If available, the monotonic clock is used and + # this is a +Float+, otherwise it's an instance of +Time+. + + attr_accessor :total_time + + ## + # Total number of tests that failed. + + attr_accessor :failures + + ## + # Total number of tests that erred. + + attr_accessor :errors + + ## + # Total number of tests that where skipped. + + attr_accessor :skips + + def initialize io = $stdout, options = {} # :nodoc: + super + + self.assertions = 0 + self.count = 0 + self.results = [] + self.start_time = nil + self.total_time = nil + self.failures = nil + self.errors = nil + self.skips = nil + end + + def passed? # :nodoc: + results.all?(&:skipped?) + end + + def start # :nodoc: + self.start_time = Minitest.clock_time + end + + def record result # :nodoc: + self.count += 1 + self.assertions += result.assertions + + results << result if not result.passed? or result.skipped? + end + + ## + # Report on the tracked statistics. + + def report + aggregate = results.group_by { |r| r.failure.class } + aggregate.default = [] # dumb. group_by should provide this + + self.total_time = Minitest.clock_time - start_time + self.failures = aggregate[Assertion].size + self.errors = aggregate[UnexpectedError].size + self.skips = aggregate[Skip].size + end + end + + ## + # A reporter that prints the header, summary, and failure details at + # the end of the run. + # + # This is added to the top-level CompositeReporter at the start of + # the run. If you want to change the output of minitest via a + # plugin, pull this out of the composite and replace it with your + # own. + + class SummaryReporter < StatisticsReporter + # :stopdoc: + attr_accessor :sync + attr_accessor :old_sync + # :startdoc: + + def start # :nodoc: + super + + io.puts "Run options: #{options[:args]}" + io.puts + io.puts "# Running:" + io.puts + + self.sync = io.respond_to? :"sync=" # stupid emacs + self.old_sync, io.sync = io.sync, true if self.sync + end + + def report # :nodoc: + super + + io.sync = self.old_sync + + io.puts unless options[:verbose] # finish the dots + io.puts + io.puts statistics + aggregated_results io + io.puts summary + end + + def statistics # :nodoc: + "Finished in %.6fs, %.4f runs/s, %.4f assertions/s." % + [total_time, count / total_time, assertions / total_time] + end + + def aggregated_results io # :nodoc: + filtered_results = results.dup + filtered_results.reject!(&:skipped?) unless options[:verbose] + + filtered_results.each_with_index { |result, i| + io.puts "\n%3d) %s" % [i+1, result] + } + io.puts + io + end + + def to_s # :nodoc: + aggregated_results(StringIO.new(binary_string)).string + end + + def summary # :nodoc: + extra = "" + + extra = "\n\nYou have skipped tests. Run with --verbose for details." if + results.any?(&:skipped?) unless options[:verbose] or ENV["MT_NO_SKIP_MSG"] + + "%d runs, %d assertions, %d failures, %d errors, %d skips%s" % + [count, assertions, failures, errors, skips, extra] + end + + private + + if '<3'.respond_to? :b + def binary_string; ''.b; end + else + def binary_string; ''.force_encoding(Encoding::ASCII_8BIT); end + end + end + + ## + # Dispatch to multiple reporters as one. + + class CompositeReporter < AbstractReporter + ## + # The list of reporters to dispatch to. + + attr_accessor :reporters + + def initialize *reporters # :nodoc: + super() + self.reporters = reporters + end + + def io # :nodoc: + reporters.first.io + end + + ## + # Add another reporter to the mix. + + def << reporter + self.reporters << reporter + end + + def passed? # :nodoc: + self.reporters.all?(&:passed?) + end + + def start # :nodoc: + self.reporters.each(&:start) + end + + def prerecord klass, name # :nodoc: + self.reporters.each do |reporter| + # TODO: remove conditional for minitest 6 + reporter.prerecord klass, name if reporter.respond_to? :prerecord + end + end + + def record result # :nodoc: + self.reporters.each do |reporter| + reporter.record result + end + end + + def report # :nodoc: + self.reporters.each(&:report) + end + end + + ## + # Represents run failures. + + class Assertion < Exception + def error # :nodoc: + self + end + + ## + # Where was this run before an assertion was raised? + + def location + last_before_assertion = "" + self.backtrace.reverse_each do |s| + break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/ + last_before_assertion = s + end + last_before_assertion.sub(/:in .*$/, "") + end + + def result_code # :nodoc: + result_label[0, 1] + end + + def result_label # :nodoc: + "Failure" + end + end + + ## + # Assertion raised when skipping a run. + + class Skip < Assertion + def result_label # :nodoc: + "Skipped" + end + end + + ## + # Assertion wrapping an unexpected error that was raised during a run. + + class UnexpectedError < Assertion + # TODO: figure out how to use `cause` instead + attr_accessor :error # :nodoc: + + def initialize error # :nodoc: + super "Unexpected exception" + self.error = error + end + + def backtrace # :nodoc: + self.error.backtrace + end + + def message # :nodoc: + bt = Minitest.filter_backtrace(self.backtrace).join "\n " + "#{self.error.class}: #{self.error.message}\n #{bt}" + end + + def result_label # :nodoc: + "Error" + end + end + + ## + # Provides a simple set of guards that you can use in your tests + # to skip execution if it is not applicable. These methods are + # mixed into Test as both instance and class methods so you + # can use them inside or outside of the test methods. + # + # def test_something_for_mri + # skip "bug 1234" if jruby? + # # ... + # end + # + # if windows? then + # # ... lots of test methods ... + # end + + module Guard + + ## + # Is this running on jruby? + + def jruby? platform = RUBY_PLATFORM + "java" == platform + end + + ## + # Is this running on maglev? + + def maglev? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE + where = Minitest.filter_backtrace(caller).first + where = where.split(/:in /, 2).first # clean up noise + warn "DEPRECATED: `maglev?` called from #{where}. This will fail in Minitest 6." + "maglev" == platform + end + + ## + # Is this running on mri? + + def mri? platform = RUBY_DESCRIPTION + /^ruby/ =~ platform + end + + ## + # Is this running on macOS? + + def osx? platform = RUBY_PLATFORM + /darwin/ =~ platform + end + + ## + # Is this running on rubinius? + + def rubinius? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE + where = Minitest.filter_backtrace(caller).first + where = where.split(/:in /, 2).first # clean up noise + warn "DEPRECATED: `rubinius?` called from #{where}. This will fail in Minitest 6." + "rbx" == platform + end + + ## + # Is this running on windows? + + def windows? platform = RUBY_PLATFORM + /mswin|mingw/ =~ platform + end + end + + ## + # The standard backtrace filter for minitest. + # + # See Minitest.backtrace_filter=. + + class BacktraceFilter + + MT_RE = %r%lib/minitest% #:nodoc: + + ## + # Filter +bt+ to something useful. Returns the whole thing if + # $DEBUG (ruby) or $MT_DEBUG (env). + + def filter bt + return ["No backtrace"] unless bt + + return bt.dup if $DEBUG || ENV["MT_DEBUG"] + + new_bt = bt.take_while { |line| line !~ MT_RE } + new_bt = bt.select { |line| line !~ MT_RE } if new_bt.empty? + new_bt = bt.dup if new_bt.empty? + + new_bt + end + end + + self.backtrace_filter = BacktraceFilter.new + + def self.run_one_method klass, method_name # :nodoc: + result = klass.new(method_name).run + raise "#{klass}#run _must_ return a Result" unless Result === result + result + end + + # :stopdoc: + + if defined? Process::CLOCK_MONOTONIC # :nodoc: + def self.clock_time + Process.clock_gettime Process::CLOCK_MONOTONIC + end + else + def self.clock_time + Time.now + end + end + + class Runnable # re-open + def self.inherited klass # :nodoc: + self.runnables << klass + super + end + end + + # :startdoc: +end + +require "minitest/test" diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/assertions.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/assertions.rb new file mode 100644 index 000000000000..5935daf6709e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/assertions.rb @@ -0,0 +1,807 @@ +# encoding: UTF-8 + +require "rbconfig" +require "tempfile" +require "stringio" + +module Minitest + ## + # Minitest Assertions. All assertion methods accept a +msg+ which is + # printed if the assertion fails. + # + # Protocol: Nearly everything here boils up to +assert+, which + # expects to be able to increment an instance accessor named + # +assertions+. This is not provided by Assertions and must be + # provided by the thing including Assertions. See Minitest::Runnable + # for an example. + + module Assertions + UNDEFINED = Object.new # :nodoc: + + def UNDEFINED.inspect # :nodoc: + "UNDEFINED" # again with the rdoc bugs... :( + end + + ## + # Returns the diff command to use in #diff. Tries to intelligently + # figure out what diff to use. + + def self.diff + return @diff if defined? @diff + + @diff = if (RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ && + system("diff.exe", __FILE__, __FILE__)) then + "diff.exe -u" + elsif system("gdiff", __FILE__, __FILE__) + "gdiff -u" # solaris and kin suck + elsif system("diff", __FILE__, __FILE__) + "diff -u" + else + nil + end + end + + ## + # Set the diff command to use in #diff. + + def self.diff= o + @diff = o + end + + ## + # Returns a diff between +exp+ and +act+. If there is no known + # diff command or if it doesn't make sense to diff the output + # (single line, short output), then it simply returns a basic + # comparison between the two. + # + # See +things_to_diff+ for more info. + + def diff exp, act + result = nil + + expect, butwas = things_to_diff(exp, act) + + return "Expected: #{mu_pp exp}\n Actual: #{mu_pp act}" unless + expect + + Tempfile.open("expect") do |a| + a.puts expect + a.flush + + Tempfile.open("butwas") do |b| + b.puts butwas + b.flush + + result = `#{Minitest::Assertions.diff} #{a.path} #{b.path}` + result.sub!(/^\-\-\- .+/, "--- expected") + result.sub!(/^\+\+\+ .+/, "+++ actual") + + if result.empty? then + klass = exp.class + result = [ + "No visible difference in the #{klass}#inspect output.\n", + "You should look at the implementation of #== on ", + "#{klass} or its members.\n", + expect, + ].join + end + end + end + + result + end + + ## + # Returns things to diff [expect, butwas], or [nil, nil] if nothing to diff. + # + # Criterion: + # + # 1. Strings include newlines or escaped newlines, but not both. + # 2. or: String lengths are > 30 characters. + # 3. or: Strings are equal to each other (but maybe different encodings?). + # 4. and: we found a diff executable. + + def things_to_diff exp, act + expect = mu_pp_for_diff exp + butwas = mu_pp_for_diff act + + e1, e2 = expect.include?("\n"), expect.include?("\\n") + b1, b2 = butwas.include?("\n"), butwas.include?("\\n") + + need_to_diff = + (e1 ^ e2 || + b1 ^ b2 || + expect.size > 30 || + butwas.size > 30 || + expect == butwas) && + Minitest::Assertions.diff + + need_to_diff && [expect, butwas] + end + + ## + # This returns a human-readable version of +obj+. By default + # #inspect is called. You can override this to use #pretty_inspect + # if you want. + # + # See Minitest::Test.make_my_diffs_pretty! + + def mu_pp obj + s = obj.inspect + + if defined? Encoding then + s = s.encode Encoding.default_external + + if String === obj && (obj.encoding != Encoding.default_external || + !obj.valid_encoding?) then + enc = "# encoding: #{obj.encoding}" + val = "# valid: #{obj.valid_encoding?}" + s = "#{enc}\n#{val}\n#{s}" + end + end + + s + end + + ## + # This returns a diff-able more human-readable version of +obj+. + # This differs from the regular mu_pp because it expands escaped + # newlines and makes hex-values (like object_ids) generic. This + # uses mu_pp to do the first pass and then cleans it up. + + def mu_pp_for_diff obj + str = mu_pp obj + + # both '\n' & '\\n' (_after_ mu_pp (aka inspect)) + single = !!str.match(/(?<!\\|^)\\n/) + double = !!str.match(/(?<=\\|^)\\n/) + + process = + if single ^ double then + if single then + lambda { |s| s == "\\n" ? "\n" : s } # unescape + else + lambda { |s| s == "\\\\n" ? "\\n\n" : s } # unescape a bit, add nls + end + else + :itself # leave it alone + end + + str. + gsub(/\\?\\n/, &process). + gsub(/:0x[a-fA-F0-9]{4,}/m, ":0xXXXXXX") # anonymize hex values + end + + ## + # Fails unless +test+ is truthy. + + def assert test, msg = nil + self.assertions += 1 + unless test then + msg ||= "Expected #{mu_pp test} to be truthy." + msg = msg.call if Proc === msg + raise Minitest::Assertion, msg + end + true + end + + def _synchronize # :nodoc: + yield + end + + ## + # Fails unless +obj+ is empty. + + def assert_empty obj, msg = nil + msg = message(msg) { "Expected #{mu_pp(obj)} to be empty" } + assert_respond_to obj, :empty? + assert obj.empty?, msg + end + + E = "" # :nodoc: + + ## + # Fails unless <tt>exp == act</tt> printing the difference between + # the two, if possible. + # + # If there is no visible difference but the assertion fails, you + # should suspect that your #== is buggy, or your inspect output is + # missing crucial details. For nicer structural diffing, set + # Minitest::Test.make_my_diffs_pretty! + # + # For floats use assert_in_delta. + # + # See also: Minitest::Assertions.diff + + def assert_equal exp, act, msg = nil + msg = message(msg, E) { diff exp, act } + result = assert exp == act, msg + + if nil == exp then + if Minitest::VERSION =~ /^6/ then + refute_nil exp, "Use assert_nil if expecting nil." + else + where = Minitest.filter_backtrace(caller).first + where = where.split(/:in /, 2).first # clean up noise + + warn "DEPRECATED: Use assert_nil if expecting nil from #{where}. This will fail in Minitest 6." + end + end + + result + end + + ## + # For comparing Floats. Fails unless +exp+ and +act+ are within +delta+ + # of each other. + # + # assert_in_delta Math::PI, (22.0 / 7.0), 0.01 + + def assert_in_delta exp, act, delta = 0.001, msg = nil + n = (exp - act).abs + msg = message(msg) { + "Expected |#{exp} - #{act}| (#{n}) to be <= #{delta}" + } + assert delta >= n, msg + end + + ## + # For comparing Floats. Fails unless +exp+ and +act+ have a relative + # error less than +epsilon+. + + def assert_in_epsilon exp, act, epsilon = 0.001, msg = nil + assert_in_delta exp, act, [exp.abs, act.abs].min * epsilon, msg + end + + ## + # Fails unless +collection+ includes +obj+. + + def assert_includes collection, obj, msg = nil + msg = message(msg) { + "Expected #{mu_pp(collection)} to include #{mu_pp(obj)}" + } + assert_respond_to collection, :include? + assert collection.include?(obj), msg + end + + ## + # Fails unless +obj+ is an instance of +cls+. + + def assert_instance_of cls, obj, msg = nil + msg = message(msg) { + "Expected #{mu_pp(obj)} to be an instance of #{cls}, not #{obj.class}" + } + + assert obj.instance_of?(cls), msg + end + + ## + # Fails unless +obj+ is a kind of +cls+. + + def assert_kind_of cls, obj, msg = nil + msg = message(msg) { + "Expected #{mu_pp(obj)} to be a kind of #{cls}, not #{obj.class}" } + + assert obj.kind_of?(cls), msg + end + + ## + # Fails unless +matcher+ <tt>=~</tt> +obj+. + + def assert_match matcher, obj, msg = nil + msg = message(msg) { "Expected #{mu_pp matcher} to match #{mu_pp obj}" } + assert_respond_to matcher, :"=~" + matcher = Regexp.new Regexp.escape matcher if String === matcher + assert matcher =~ obj, msg + end + + ## + # Fails unless +obj+ is nil + + def assert_nil obj, msg = nil + msg = message(msg) { "Expected #{mu_pp(obj)} to be nil" } + assert obj.nil?, msg + end + + ## + # For testing with binary operators. Eg: + # + # assert_operator 5, :<=, 4 + + def assert_operator o1, op, o2 = UNDEFINED, msg = nil + return assert_predicate o1, op, msg if UNDEFINED == o2 + msg = message(msg) { "Expected #{mu_pp(o1)} to be #{op} #{mu_pp(o2)}" } + assert o1.__send__(op, o2), msg + end + + ## + # Fails if stdout or stderr do not output the expected results. + # Pass in nil if you don't care about that streams output. Pass in + # "" if you require it to be silent. Pass in a regexp if you want + # to pattern match. + # + # assert_output(/hey/) { method_with_output } + # + # NOTE: this uses #capture_io, not #capture_subprocess_io. + # + # See also: #assert_silent + + def assert_output stdout = nil, stderr = nil + flunk "assert_output requires a block to capture output." unless + block_given? + + out, err = capture_io do + yield + end + + err_msg = Regexp === stderr ? :assert_match : :assert_equal if stderr + out_msg = Regexp === stdout ? :assert_match : :assert_equal if stdout + + y = send err_msg, stderr, err, "In stderr" if err_msg + x = send out_msg, stdout, out, "In stdout" if out_msg + + (!stdout || x) && (!stderr || y) + rescue Assertion + raise + rescue => e + raise UnexpectedError, e + end + + ## + # Fails unless +path+ exists. + + def assert_path_exists path, msg = nil + msg = message(msg) { "Expected path '#{path}' to exist" } + assert File.exist?(path), msg + end + + ## + # For testing with predicates. Eg: + # + # assert_predicate str, :empty? + # + # This is really meant for specs and is front-ended by assert_operator: + # + # str.must_be :empty? + + def assert_predicate o1, op, msg = nil + msg = message(msg) { "Expected #{mu_pp(o1)} to be #{op}" } + assert o1.__send__(op), msg + end + + ## + # Fails unless the block raises one of +exp+. Returns the + # exception matched so you can check the message, attributes, etc. + # + # +exp+ takes an optional message on the end to help explain + # failures and defaults to StandardError if no exception class is + # passed. Eg: + # + # assert_raises(CustomError) { method_with_custom_error } + # + # With custom error message: + # + # assert_raises(CustomError, 'This should have raised CustomError') { method_with_custom_error } + # + # Using the returned object: + # + # error = assert_raises(CustomError) do + # raise CustomError, 'This is really bad' + # end + # + # assert_equal 'This is really bad', error.message + + def assert_raises *exp + flunk "assert_raises requires a block to capture errors." unless + block_given? + + msg = "#{exp.pop}.\n" if String === exp.last + exp << StandardError if exp.empty? + + begin + yield + rescue *exp => e + pass # count assertion + return e + rescue Minitest::Assertion # incl Skip & UnexpectedError + # don't count assertion + raise + rescue SignalException, SystemExit + raise + rescue Exception => e + flunk proc { + exception_details(e, "#{msg}#{mu_pp(exp)} exception expected, not") + } + end + + exp = exp.first if exp.size == 1 + + flunk "#{msg}#{mu_pp(exp)} expected but nothing was raised." + end + + ## + # Fails unless +obj+ responds to +meth+. + + def assert_respond_to obj, meth, msg = nil + msg = message(msg) { + "Expected #{mu_pp(obj)} (#{obj.class}) to respond to ##{meth}" + } + assert obj.respond_to?(meth), msg + end + + ## + # Fails unless +exp+ and +act+ are #equal? + + def assert_same exp, act, msg = nil + msg = message(msg) { + data = [mu_pp(act), act.object_id, mu_pp(exp), exp.object_id] + "Expected %s (oid=%d) to be the same as %s (oid=%d)" % data + } + assert exp.equal?(act), msg + end + + ## + # +send_ary+ is a receiver, message and arguments. + # + # Fails unless the call returns a true value + + def assert_send send_ary, m = nil + where = Minitest.filter_backtrace(caller).first + where = where.split(/:in /, 2).first # clean up noise + warn "DEPRECATED: assert_send. From #{where}" + + recv, msg, *args = send_ary + m = message(m) { + "Expected #{mu_pp(recv)}.#{msg}(*#{mu_pp(args)}) to return true" } + assert recv.__send__(msg, *args), m + end + + ## + # Fails if the block outputs anything to stderr or stdout. + # + # See also: #assert_output + + def assert_silent + assert_output "", "" do + yield + end + end + + ## + # Fails unless the block throws +sym+ + + def assert_throws sym, msg = nil + default = "Expected #{mu_pp(sym)} to have been thrown" + caught = true + catch(sym) do + begin + yield + rescue ThreadError => e # wtf?!? 1.8 + threads == suck + default += ", not \:#{e.message[/uncaught throw \`(\w+?)\'/, 1]}" + rescue ArgumentError => e # 1.9 exception + raise e unless e.message.include?("uncaught throw") + default += ", not #{e.message.split(/ /).last}" + rescue NameError => e # 1.8 exception + raise e unless e.name == sym + default += ", not #{e.name.inspect}" + end + caught = false + end + + assert caught, message(msg) { default } + rescue Assertion + raise + rescue => e + raise UnexpectedError, e + end + + ## + # Captures $stdout and $stderr into strings: + # + # out, err = capture_io do + # puts "Some info" + # warn "You did a bad thing" + # end + # + # assert_match %r%info%, out + # assert_match %r%bad%, err + # + # NOTE: For efficiency, this method uses StringIO and does not + # capture IO for subprocesses. Use #capture_subprocess_io for + # that. + + def capture_io + _synchronize do + begin + captured_stdout, captured_stderr = StringIO.new, StringIO.new + + orig_stdout, orig_stderr = $stdout, $stderr + $stdout, $stderr = captured_stdout, captured_stderr + + yield + + return captured_stdout.string, captured_stderr.string + ensure + $stdout = orig_stdout + $stderr = orig_stderr + end + end + end + + ## + # Captures $stdout and $stderr into strings, using Tempfile to + # ensure that subprocess IO is captured as well. + # + # out, err = capture_subprocess_io do + # system "echo Some info" + # system "echo You did a bad thing 1>&2" + # end + # + # assert_match %r%info%, out + # assert_match %r%bad%, err + # + # NOTE: This method is approximately 10x slower than #capture_io so + # only use it when you need to test the output of a subprocess. + + def capture_subprocess_io + _synchronize do + begin + require "tempfile" + + captured_stdout, captured_stderr = Tempfile.new("out"), Tempfile.new("err") + + orig_stdout, orig_stderr = $stdout.dup, $stderr.dup + $stdout.reopen captured_stdout + $stderr.reopen captured_stderr + + yield + + $stdout.rewind + $stderr.rewind + + return captured_stdout.read, captured_stderr.read + ensure + captured_stdout.unlink + captured_stderr.unlink + $stdout.reopen orig_stdout + $stderr.reopen orig_stderr + + orig_stdout.close + orig_stderr.close + captured_stdout.close + captured_stderr.close + end + end + end + + ## + # Returns details for exception +e+ + + def exception_details e, msg + [ + "#{msg}", + "Class: <#{e.class}>", + "Message: <#{e.message.inspect}>", + "---Backtrace---", + "#{Minitest.filter_backtrace(e.backtrace).join("\n")}", + "---------------", + ].join "\n" + end + + ## + # Fails after a given date (in the local time zone). This allows + # you to put time-bombs in your tests if you need to keep + # something around until a later date lest you forget about it. + + def fail_after y,m,d,msg + flunk msg if Time.now > Time.local(y, m, d) + end + + ## + # Fails with +msg+. + + def flunk msg = nil + msg ||= "Epic Fail!" + assert false, msg + end + + ## + # Returns a proc that will output +msg+ along with the default message. + + def message msg = nil, ending = nil, &default + proc { + msg = msg.call.chomp(".") if Proc === msg + custom_message = "#{msg}.\n" unless msg.nil? or msg.to_s.empty? + "#{custom_message}#{default.call}#{ending || "."}" + } + end + + ## + # used for counting assertions + + def pass _msg = nil + assert true + end + + ## + # Fails if +test+ is truthy. + + def refute test, msg = nil + msg ||= message { "Expected #{mu_pp(test)} to not be truthy" } + assert !test, msg + end + + ## + # Fails if +obj+ is empty. + + def refute_empty obj, msg = nil + msg = message(msg) { "Expected #{mu_pp(obj)} to not be empty" } + assert_respond_to obj, :empty? + refute obj.empty?, msg + end + + ## + # Fails if <tt>exp == act</tt>. + # + # For floats use refute_in_delta. + + def refute_equal exp, act, msg = nil + msg = message(msg) { + "Expected #{mu_pp(act)} to not be equal to #{mu_pp(exp)}" + } + refute exp == act, msg + end + + ## + # For comparing Floats. Fails if +exp+ is within +delta+ of +act+. + # + # refute_in_delta Math::PI, (22.0 / 7.0) + + def refute_in_delta exp, act, delta = 0.001, msg = nil + n = (exp - act).abs + msg = message(msg) { + "Expected |#{exp} - #{act}| (#{n}) to not be <= #{delta}" + } + refute delta >= n, msg + end + + ## + # For comparing Floats. Fails if +exp+ and +act+ have a relative error + # less than +epsilon+. + + def refute_in_epsilon a, b, epsilon = 0.001, msg = nil + refute_in_delta a, b, a * epsilon, msg + end + + ## + # Fails if +collection+ includes +obj+. + + def refute_includes collection, obj, msg = nil + msg = message(msg) { + "Expected #{mu_pp(collection)} to not include #{mu_pp(obj)}" + } + assert_respond_to collection, :include? + refute collection.include?(obj), msg + end + + ## + # Fails if +obj+ is an instance of +cls+. + + def refute_instance_of cls, obj, msg = nil + msg = message(msg) { + "Expected #{mu_pp(obj)} to not be an instance of #{cls}" + } + refute obj.instance_of?(cls), msg + end + + ## + # Fails if +obj+ is a kind of +cls+. + + def refute_kind_of cls, obj, msg = nil + msg = message(msg) { "Expected #{mu_pp(obj)} to not be a kind of #{cls}" } + refute obj.kind_of?(cls), msg + end + + ## + # Fails if +matcher+ <tt>=~</tt> +obj+. + + def refute_match matcher, obj, msg = nil + msg = message(msg) { "Expected #{mu_pp matcher} to not match #{mu_pp obj}" } + assert_respond_to matcher, :"=~" + matcher = Regexp.new Regexp.escape matcher if String === matcher + refute matcher =~ obj, msg + end + + ## + # Fails if +obj+ is nil. + + def refute_nil obj, msg = nil + msg = message(msg) { "Expected #{mu_pp(obj)} to not be nil" } + refute obj.nil?, msg + end + + ## + # Fails if +o1+ is not +op+ +o2+. Eg: + # + # refute_operator 1, :>, 2 #=> pass + # refute_operator 1, :<, 2 #=> fail + + def refute_operator o1, op, o2 = UNDEFINED, msg = nil + return refute_predicate o1, op, msg if UNDEFINED == o2 + msg = message(msg) { "Expected #{mu_pp(o1)} to not be #{op} #{mu_pp(o2)}" } + refute o1.__send__(op, o2), msg + end + + ## + # Fails if +path+ exists. + + def refute_path_exists path, msg = nil + msg = message(msg) { "Expected path '#{path}' to not exist" } + refute File.exist?(path), msg + end + + ## + # For testing with predicates. + # + # refute_predicate str, :empty? + # + # This is really meant for specs and is front-ended by refute_operator: + # + # str.wont_be :empty? + + def refute_predicate o1, op, msg = nil + msg = message(msg) { "Expected #{mu_pp(o1)} to not be #{op}" } + refute o1.__send__(op), msg + end + + ## + # Fails if +obj+ responds to the message +meth+. + + def refute_respond_to obj, meth, msg = nil + msg = message(msg) { "Expected #{mu_pp(obj)} to not respond to #{meth}" } + + refute obj.respond_to?(meth), msg + end + + ## + # Fails if +exp+ is the same (by object identity) as +act+. + + def refute_same exp, act, msg = nil + msg = message(msg) { + data = [mu_pp(act), act.object_id, mu_pp(exp), exp.object_id] + "Expected %s (oid=%d) to not be the same as %s (oid=%d)" % data + } + refute exp.equal?(act), msg + end + + ## + # Skips the current run. If run in verbose-mode, the skipped run + # gets listed at the end of the run but doesn't cause a failure + # exit code. + + def skip msg = nil, bt = caller + msg ||= "Skipped, no message given" + @skip = true + raise Minitest::Skip, msg, bt + end + + ## + # Skips the current run until a given date (in the local time + # zone). This allows you to put some fixes on hold until a later + # date, but still holds you accountable and prevents you from + # forgetting it. + + def skip_until y,m,d,msg + skip msg if Time.now < Time.local(y, m, d) + where = caller.first.split(/:/, 3).first(2).join ":" + warn "Stale skip_until %p at %s" % [msg, where] + end + + ## + # Was this testcase skipped? Meant for #teardown. + + def skipped? + defined?(@skip) and @skip + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/autorun.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/autorun.rb new file mode 100644 index 000000000000..9409b04b25c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/autorun.rb @@ -0,0 +1,13 @@ +begin + require "rubygems" + gem "minitest" +rescue Gem::LoadError + # do nothing +end + +require "minitest" +require "minitest/spec" +require "minitest/mock" +require "minitest/hell" if ENV["MT_HELL"] + +Minitest.autorun diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/benchmark.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/benchmark.rb new file mode 100644 index 000000000000..f2b2465eb73b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/benchmark.rb @@ -0,0 +1,455 @@ +require "minitest/test" +require "minitest/spec" + +module Minitest + ## + # Subclass Benchmark to create your own benchmark runs. Methods + # starting with "bench_" get executed on a per-class. + # + # See Minitest::Assertions + + class Benchmark < Test + def self.io # :nodoc: + @io + end + + def io # :nodoc: + self.class.io + end + + def self.run reporter, options = {} # :nodoc: + @io = reporter.io + super + end + + def self.runnable_methods # :nodoc: + methods_matching(/^bench_/) + end + + ## + # Returns a set of ranges stepped exponentially from +min+ to + # +max+ by powers of +base+. Eg: + # + # bench_exp(2, 16, 2) # => [2, 4, 8, 16] + + def self.bench_exp min, max, base = 10 + min = (Math.log10(min) / Math.log10(base)).to_i + max = (Math.log10(max) / Math.log10(base)).to_i + + (min..max).map { |m| base ** m }.to_a + end + + ## + # Returns a set of ranges stepped linearly from +min+ to +max+ by + # +step+. Eg: + # + # bench_linear(20, 40, 10) # => [20, 30, 40] + + def self.bench_linear min, max, step = 10 + (min..max).step(step).to_a + rescue LocalJumpError # 1.8.6 + r = []; (min..max).step(step) { |n| r << n }; r + end + + ## + # Specifies the ranges used for benchmarking for that class. + # Defaults to exponential growth from 1 to 10k by powers of 10. + # Override if you need different ranges for your benchmarks. + # + # See also: ::bench_exp and ::bench_linear. + + def self.bench_range + bench_exp 1, 10_000 + end + + ## + # Runs the given +work+, gathering the times of each run. Range + # and times are then passed to a given +validation+ proc. Outputs + # the benchmark name and times in tab-separated format, making it + # easy to paste into a spreadsheet for graphing or further + # analysis. + # + # Ranges are specified by ::bench_range. + # + # Eg: + # + # def bench_algorithm + # validation = proc { |x, y| ... } + # assert_performance validation do |n| + # @obj.algorithm(n) + # end + # end + + def assert_performance validation, &work + range = self.class.bench_range + + io.print "#{self.name}" + + times = [] + + range.each do |x| + GC.start + t0 = Minitest.clock_time + instance_exec(x, &work) + t = Minitest.clock_time - t0 + + io.print "\t%9.6f" % t + times << t + end + io.puts + + validation[range, times] + end + + ## + # Runs the given +work+ and asserts that the times gathered fit to + # match a constant rate (eg, linear slope == 0) within a given + # +threshold+. Note: because we're testing for a slope of 0, R^2 + # is not a good determining factor for the fit, so the threshold + # is applied against the slope itself. As such, you probably want + # to tighten it from the default. + # + # See https://www.graphpad.com/guides/prism/8/curve-fitting/reg_intepretingnonlinr2.htm + # for more details. + # + # Fit is calculated by #fit_linear. + # + # Ranges are specified by ::bench_range. + # + # Eg: + # + # def bench_algorithm + # assert_performance_constant 0.9999 do |n| + # @obj.algorithm(n) + # end + # end + + def assert_performance_constant threshold = 0.99, &work + validation = proc do |range, times| + a, b, rr = fit_linear range, times + assert_in_delta 0, b, 1 - threshold + [a, b, rr] + end + + assert_performance validation, &work + end + + ## + # Runs the given +work+ and asserts that the times gathered fit to + # match a exponential curve within a given error +threshold+. + # + # Fit is calculated by #fit_exponential. + # + # Ranges are specified by ::bench_range. + # + # Eg: + # + # def bench_algorithm + # assert_performance_exponential 0.9999 do |n| + # @obj.algorithm(n) + # end + # end + + def assert_performance_exponential threshold = 0.99, &work + assert_performance validation_for_fit(:exponential, threshold), &work + end + + ## + # Runs the given +work+ and asserts that the times gathered fit to + # match a logarithmic curve within a given error +threshold+. + # + # Fit is calculated by #fit_logarithmic. + # + # Ranges are specified by ::bench_range. + # + # Eg: + # + # def bench_algorithm + # assert_performance_logarithmic 0.9999 do |n| + # @obj.algorithm(n) + # end + # end + + def assert_performance_logarithmic threshold = 0.99, &work + assert_performance validation_for_fit(:logarithmic, threshold), &work + end + + ## + # Runs the given +work+ and asserts that the times gathered fit to + # match a straight line within a given error +threshold+. + # + # Fit is calculated by #fit_linear. + # + # Ranges are specified by ::bench_range. + # + # Eg: + # + # def bench_algorithm + # assert_performance_linear 0.9999 do |n| + # @obj.algorithm(n) + # end + # end + + def assert_performance_linear threshold = 0.99, &work + assert_performance validation_for_fit(:linear, threshold), &work + end + + ## + # Runs the given +work+ and asserts that the times gathered curve + # fit to match a power curve within a given error +threshold+. + # + # Fit is calculated by #fit_power. + # + # Ranges are specified by ::bench_range. + # + # Eg: + # + # def bench_algorithm + # assert_performance_power 0.9999 do |x| + # @obj.algorithm + # end + # end + + def assert_performance_power threshold = 0.99, &work + assert_performance validation_for_fit(:power, threshold), &work + end + + ## + # Takes an array of x/y pairs and calculates the general R^2 value. + # + # See: http://en.wikipedia.org/wiki/Coefficient_of_determination + + def fit_error xys + y_bar = sigma(xys) { |_, y| y } / xys.size.to_f + ss_tot = sigma(xys) { |_, y| (y - y_bar) ** 2 } + ss_err = sigma(xys) { |x, y| (yield(x) - y) ** 2 } + + 1 - (ss_err / ss_tot) + end + + ## + # To fit a functional form: y = ae^(bx). + # + # Takes x and y values and returns [a, b, r^2]. + # + # See: http://mathworld.wolfram.com/LeastSquaresFittingExponential.html + + def fit_exponential xs, ys + n = xs.size + xys = xs.zip(ys) + sxlny = sigma(xys) { |x, y| x * Math.log(y) } + slny = sigma(xys) { |_, y| Math.log(y) } + sx2 = sigma(xys) { |x, _| x * x } + sx = sigma xs + + c = n * sx2 - sx ** 2 + a = (slny * sx2 - sx * sxlny) / c + b = ( n * sxlny - sx * slny ) / c + + return Math.exp(a), b, fit_error(xys) { |x| Math.exp(a + b * x) } + end + + ## + # To fit a functional form: y = a + b*ln(x). + # + # Takes x and y values and returns [a, b, r^2]. + # + # See: http://mathworld.wolfram.com/LeastSquaresFittingLogarithmic.html + + def fit_logarithmic xs, ys + n = xs.size + xys = xs.zip(ys) + slnx2 = sigma(xys) { |x, _| Math.log(x) ** 2 } + slnx = sigma(xys) { |x, _| Math.log(x) } + sylnx = sigma(xys) { |x, y| y * Math.log(x) } + sy = sigma(xys) { |_, y| y } + + c = n * slnx2 - slnx ** 2 + b = ( n * sylnx - sy * slnx ) / c + a = (sy - b * slnx) / n + + return a, b, fit_error(xys) { |x| a + b * Math.log(x) } + end + + ## + # Fits the functional form: a + bx. + # + # Takes x and y values and returns [a, b, r^2]. + # + # See: http://mathworld.wolfram.com/LeastSquaresFitting.html + + def fit_linear xs, ys + n = xs.size + xys = xs.zip(ys) + sx = sigma xs + sy = sigma ys + sx2 = sigma(xs) { |x| x ** 2 } + sxy = sigma(xys) { |x, y| x * y } + + c = n * sx2 - sx**2 + a = (sy * sx2 - sx * sxy) / c + b = ( n * sxy - sx * sy ) / c + + return a, b, fit_error(xys) { |x| a + b * x } + end + + ## + # To fit a functional form: y = ax^b. + # + # Takes x and y values and returns [a, b, r^2]. + # + # See: http://mathworld.wolfram.com/LeastSquaresFittingPowerLaw.html + + def fit_power xs, ys + n = xs.size + xys = xs.zip(ys) + slnxlny = sigma(xys) { |x, y| Math.log(x) * Math.log(y) } + slnx = sigma(xs) { |x | Math.log(x) } + slny = sigma(ys) { | y| Math.log(y) } + slnx2 = sigma(xs) { |x | Math.log(x) ** 2 } + + b = (n * slnxlny - slnx * slny) / (n * slnx2 - slnx ** 2) + a = (slny - b * slnx) / n + + return Math.exp(a), b, fit_error(xys) { |x| (Math.exp(a) * (x ** b)) } + end + + ## + # Enumerates over +enum+ mapping +block+ if given, returning the + # sum of the result. Eg: + # + # sigma([1, 2, 3]) # => 1 + 2 + 3 => 6 + # sigma([1, 2, 3]) { |n| n ** 2 } # => 1 + 4 + 9 => 14 + + def sigma enum, &block + enum = enum.map(&block) if block + enum.inject { |sum, n| sum + n } + end + + ## + # Returns a proc that calls the specified fit method and asserts + # that the error is within a tolerable threshold. + + def validation_for_fit msg, threshold + proc do |range, times| + a, b, rr = send "fit_#{msg}", range, times + assert_operator rr, :>=, threshold + [a, b, rr] + end + end + end +end + +module Minitest + ## + # The spec version of Minitest::Benchmark. + + class BenchSpec < Benchmark + extend Minitest::Spec::DSL + + ## + # This is used to define a new benchmark method. You usually don't + # use this directly and is intended for those needing to write new + # performance curve fits (eg: you need a specific polynomial fit). + # + # See ::bench_performance_linear for an example of how to use this. + + def self.bench name, &block + define_method "bench_#{name.gsub(/\W+/, "_")}", &block + end + + ## + # Specifies the ranges used for benchmarking for that class. + # + # bench_range do + # bench_exp(2, 16, 2) + # end + # + # See Minitest::Benchmark#bench_range for more details. + + def self.bench_range &block + return super unless block + + meta = (class << self; self; end) + meta.send :define_method, "bench_range", &block + end + + ## + # Create a benchmark that verifies that the performance is linear. + # + # describe "my class Bench" do + # bench_performance_linear "fast_algorithm", 0.9999 do |n| + # @obj.fast_algorithm(n) + # end + # end + + def self.bench_performance_linear name, threshold = 0.99, &work + bench name do + assert_performance_linear threshold, &work + end + end + + ## + # Create a benchmark that verifies that the performance is constant. + # + # describe "my class Bench" do + # bench_performance_constant "zoom_algorithm!" do |n| + # @obj.zoom_algorithm!(n) + # end + # end + + def self.bench_performance_constant name, threshold = 0.99, &work + bench name do + assert_performance_constant threshold, &work + end + end + + ## + # Create a benchmark that verifies that the performance is exponential. + # + # describe "my class Bench" do + # bench_performance_exponential "algorithm" do |n| + # @obj.algorithm(n) + # end + # end + + def self.bench_performance_exponential name, threshold = 0.99, &work + bench name do + assert_performance_exponential threshold, &work + end + end + + + ## + # Create a benchmark that verifies that the performance is logarithmic. + # + # describe "my class Bench" do + # bench_performance_logarithmic "algorithm" do |n| + # @obj.algorithm(n) + # end + # end + + def self.bench_performance_logarithmic name, threshold = 0.99, &work + bench name do + assert_performance_logarithmic threshold, &work + end + end + + ## + # Create a benchmark that verifies that the performance is power. + # + # describe "my class Bench" do + # bench_performance_power "algorithm" do |n| + # @obj.algorithm(n) + # end + # end + + def self.bench_performance_power name, threshold = 0.99, &work + bench name do + assert_performance_power threshold, &work + end + end + end + + Minitest::Spec.register_spec_type(/Bench(mark)?$/, Minitest::BenchSpec) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/expectations.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/expectations.rb new file mode 100644 index 000000000000..fb4ec4d93117 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/expectations.rb @@ -0,0 +1,303 @@ +## +# It's where you hide your "assertions". +# +# Please note, because of the way that expectations are implemented, +# all expectations (eg must_equal) are dependent upon a thread local +# variable +:current_spec+. If your specs rely on mixing threads into +# the specs themselves, you're better off using assertions or the new +# _(value) wrapper. For example: +# +# it "should still work in threads" do +# my_threaded_thingy do +# (1+1).must_equal 2 # bad +# assert_equal 2, 1+1 # good +# _(1 + 1).must_equal 2 # good +# value(1 + 1).must_equal 2 # good, also #expect +# _ { 1 + "1" }.must_raise TypeError # good +# end +# end + +module Minitest::Expectations + + ## + # See Minitest::Assertions#assert_empty. + # + # _(collection).must_be_empty + # + # :method: must_be_empty + + infect_an_assertion :assert_empty, :must_be_empty, :unary + + ## + # See Minitest::Assertions#assert_equal + # + # _(a).must_equal b + # + # :method: must_equal + + infect_an_assertion :assert_equal, :must_equal + + ## + # See Minitest::Assertions#assert_in_delta + # + # _(n).must_be_close_to m [, delta] + # + # :method: must_be_close_to + + infect_an_assertion :assert_in_delta, :must_be_close_to + + infect_an_assertion :assert_in_delta, :must_be_within_delta # :nodoc: + + ## + # See Minitest::Assertions#assert_in_epsilon + # + # _(n).must_be_within_epsilon m [, epsilon] + # + # :method: must_be_within_epsilon + + infect_an_assertion :assert_in_epsilon, :must_be_within_epsilon + + ## + # See Minitest::Assertions#assert_includes + # + # _(collection).must_include obj + # + # :method: must_include + + infect_an_assertion :assert_includes, :must_include, :reverse + + ## + # See Minitest::Assertions#assert_instance_of + # + # _(obj).must_be_instance_of klass + # + # :method: must_be_instance_of + + infect_an_assertion :assert_instance_of, :must_be_instance_of + + ## + # See Minitest::Assertions#assert_kind_of + # + # _(obj).must_be_kind_of mod + # + # :method: must_be_kind_of + + infect_an_assertion :assert_kind_of, :must_be_kind_of + + ## + # See Minitest::Assertions#assert_match + # + # _(a).must_match b + # + # :method: must_match + + infect_an_assertion :assert_match, :must_match + + ## + # See Minitest::Assertions#assert_nil + # + # _(obj).must_be_nil + # + # :method: must_be_nil + + infect_an_assertion :assert_nil, :must_be_nil, :unary + + ## + # See Minitest::Assertions#assert_operator + # + # _(n).must_be :<=, 42 + # + # This can also do predicates: + # + # _(str).must_be :empty? + # + # :method: must_be + + infect_an_assertion :assert_operator, :must_be, :reverse + + ## + # See Minitest::Assertions#assert_output + # + # _ { ... }.must_output out_or_nil [, err] + # + # :method: must_output + + infect_an_assertion :assert_output, :must_output, :block + + ## + # See Minitest::Assertions#assert_raises + # + # _ { ... }.must_raise exception + # + # :method: must_raise + + infect_an_assertion :assert_raises, :must_raise, :block + + ## + # See Minitest::Assertions#assert_respond_to + # + # _(obj).must_respond_to msg + # + # :method: must_respond_to + + infect_an_assertion :assert_respond_to, :must_respond_to, :reverse + + ## + # See Minitest::Assertions#assert_same + # + # _(a).must_be_same_as b + # + # :method: must_be_same_as + + infect_an_assertion :assert_same, :must_be_same_as + + ## + # See Minitest::Assertions#assert_silent + # + # _ { ... }.must_be_silent + # + # :method: must_be_silent + + infect_an_assertion :assert_silent, :must_be_silent, :block + + ## + # See Minitest::Assertions#assert_throws + # + # _ { ... }.must_throw sym + # + # :method: must_throw + + infect_an_assertion :assert_throws, :must_throw, :block + + ## + # See Minitest::Assertions#assert_path_exists + # + # _(some_path).path_must_exist + # + # :method: path_must_exist + + infect_an_assertion :assert_path_exists, :path_must_exist, :unary + + ## + # See Minitest::Assertions#refute_path_exists + # + # _(some_path).path_wont_exist + # + # :method: path_wont_exist + + infect_an_assertion :refute_path_exists, :path_wont_exist, :unary + + ## + # See Minitest::Assertions#refute_empty + # + # _(collection).wont_be_empty + # + # :method: wont_be_empty + + infect_an_assertion :refute_empty, :wont_be_empty, :unary + + ## + # See Minitest::Assertions#refute_equal + # + # _(a).wont_equal b + # + # :method: wont_equal + + infect_an_assertion :refute_equal, :wont_equal + + ## + # See Minitest::Assertions#refute_in_delta + # + # _(n).wont_be_close_to m [, delta] + # + # :method: wont_be_close_to + + infect_an_assertion :refute_in_delta, :wont_be_close_to + + infect_an_assertion :refute_in_delta, :wont_be_within_delta # :nodoc: + + ## + # See Minitest::Assertions#refute_in_epsilon + # + # _(n).wont_be_within_epsilon m [, epsilon] + # + # :method: wont_be_within_epsilon + + infect_an_assertion :refute_in_epsilon, :wont_be_within_epsilon + + ## + # See Minitest::Assertions#refute_includes + # + # _(collection).wont_include obj + # + # :method: wont_include + + infect_an_assertion :refute_includes, :wont_include, :reverse + + ## + # See Minitest::Assertions#refute_instance_of + # + # _(obj).wont_be_instance_of klass + # + # :method: wont_be_instance_of + + infect_an_assertion :refute_instance_of, :wont_be_instance_of + + ## + # See Minitest::Assertions#refute_kind_of + # + # _(obj).wont_be_kind_of mod + # + # :method: wont_be_kind_of + + infect_an_assertion :refute_kind_of, :wont_be_kind_of + + ## + # See Minitest::Assertions#refute_match + # + # _(a).wont_match b + # + # :method: wont_match + + infect_an_assertion :refute_match, :wont_match + + ## + # See Minitest::Assertions#refute_nil + # + # _(obj).wont_be_nil + # + # :method: wont_be_nil + + infect_an_assertion :refute_nil, :wont_be_nil, :unary + + ## + # See Minitest::Assertions#refute_operator + # + # _(n).wont_be :<=, 42 + # + # This can also do predicates: + # + # str.wont_be :empty? + # + # :method: wont_be + + infect_an_assertion :refute_operator, :wont_be, :reverse + + ## + # See Minitest::Assertions#refute_respond_to + # + # _(obj).wont_respond_to msg + # + # :method: wont_respond_to + + infect_an_assertion :refute_respond_to, :wont_respond_to, :reverse + + ## + # See Minitest::Assertions#refute_same + # + # _(a).wont_be_same_as b + # + # :method: wont_be_same_as + + infect_an_assertion :refute_same, :wont_be_same_as +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/hell.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/hell.rb new file mode 100644 index 000000000000..73c88acd741d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/hell.rb @@ -0,0 +1,11 @@ +require "minitest/parallel" + +class Minitest::Test + parallelize_me! +end + +begin + require "minitest/proveit" +rescue LoadError + warn "NOTE: `gem install minitest-proveit` for even more hellish tests" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/mock.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/mock.rb new file mode 100644 index 000000000000..ddfc788da4e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/mock.rb @@ -0,0 +1,244 @@ +class MockExpectationError < StandardError; end # :nodoc: + +module Minitest # :nodoc: + + ## + # A simple and clean mock object framework. + # + # All mock objects are an instance of Mock + + class Mock + alias :__respond_to? :respond_to? + + overridden_methods = %w[ + === + class + inspect + instance_eval + instance_variables + object_id + public_send + respond_to_missing? + send + to_s + ] + + instance_methods.each do |m| + undef_method m unless overridden_methods.include?(m.to_s) || m =~ /^__/ + end + + overridden_methods.map(&:to_sym).each do |method_id| + define_method method_id do |*args, &b| + if @expected_calls.key? method_id then + method_missing(method_id, *args, &b) + else + super(*args, &b) + end + end + end + + def initialize delegator = nil # :nodoc: + @delegator = delegator + @expected_calls = Hash.new { |calls, name| calls[name] = [] } + @actual_calls = Hash.new { |calls, name| calls[name] = [] } + end + + ## + # Expect that method +name+ is called, optionally with +args+ or a + # +blk+, and returns +retval+. + # + # @mock.expect(:meaning_of_life, 42) + # @mock.meaning_of_life # => 42 + # + # @mock.expect(:do_something_with, true, [some_obj, true]) + # @mock.do_something_with(some_obj, true) # => true + # + # @mock.expect(:do_something_else, true) do |a1, a2| + # a1 == "buggs" && a2 == :bunny + # end + # + # +args+ is compared to the expected args using case equality (ie, the + # '===' operator), allowing for less specific expectations. + # + # @mock.expect(:uses_any_string, true, [String]) + # @mock.uses_any_string("foo") # => true + # @mock.verify # => true + # + # @mock.expect(:uses_one_string, true, ["foo"]) + # @mock.uses_one_string("bar") # => raises MockExpectationError + # + # If a method will be called multiple times, specify a new expect for each one. + # They will be used in the order you define them. + # + # @mock.expect(:ordinal_increment, 'first') + # @mock.expect(:ordinal_increment, 'second') + # + # @mock.ordinal_increment # => 'first' + # @mock.ordinal_increment # => 'second' + # @mock.ordinal_increment # => raises MockExpectationError "No more expects available for :ordinal_increment" + # + + def expect name, retval, args = [], &blk + name = name.to_sym + + if block_given? + raise ArgumentError, "args ignored when block given" unless args.empty? + @expected_calls[name] << { :retval => retval, :block => blk } + else + raise ArgumentError, "args must be an array" unless Array === args + @expected_calls[name] << { :retval => retval, :args => args } + end + self + end + + def __call name, data # :nodoc: + case data + when Hash then + "#{name}(#{data[:args].inspect[1..-2]}) => #{data[:retval].inspect}" + else + data.map { |d| __call name, d }.join ", " + end + end + + ## + # Verify that all methods were called as expected. Raises + # +MockExpectationError+ if the mock object was not called as + # expected. + + def verify + @expected_calls.each do |name, expected| + actual = @actual_calls.fetch(name, nil) + raise MockExpectationError, "expected #{__call name, expected[0]}" unless actual + raise MockExpectationError, "expected #{__call name, expected[actual.size]}, got [#{__call name, actual}]" if + actual.size < expected.size + end + true + end + + def method_missing sym, *args, &block # :nodoc: + unless @expected_calls.key?(sym) then + if @delegator && @delegator.respond_to?(sym) + return @delegator.public_send(sym, *args, &block) + else + raise NoMethodError, "unmocked method %p, expected one of %p" % + [sym, @expected_calls.keys.sort_by(&:to_s)] + end + end + + index = @actual_calls[sym].length + expected_call = @expected_calls[sym][index] + + unless expected_call then + raise MockExpectationError, "No more expects available for %p: %p" % + [sym, args] + end + + expected_args, retval, val_block = + expected_call.values_at(:args, :retval, :block) + + if val_block then + # keep "verify" happy + @actual_calls[sym] << expected_call + + raise MockExpectationError, "mocked method %p failed block w/ %p" % + [sym, args] unless val_block.call(*args, &block) + + return retval + end + + if expected_args.size != args.size then + raise ArgumentError, "mocked method %p expects %d arguments, got %d" % + [sym, expected_args.size, args.size] + end + + zipped_args = expected_args.zip(args) + fully_matched = zipped_args.all? { |mod, a| + mod === a or mod == a + } + + unless fully_matched then + raise MockExpectationError, "mocked method %p called with unexpected arguments %p" % + [sym, args] + end + + @actual_calls[sym] << { + :retval => retval, + :args => zipped_args.map! { |mod, a| mod === a ? mod : a }, + } + + retval + end + + def respond_to? sym, include_private = false # :nodoc: + return true if @expected_calls.key? sym.to_sym + return true if @delegator && @delegator.respond_to?(sym, include_private) + __respond_to?(sym, include_private) + end + end +end + +module Minitest::Assertions + ## + # Assert that the mock verifies correctly. + + def assert_mock mock + assert mock.verify + end +end + +## +# Object extensions for Minitest::Mock. + +class Object + + ## + # Add a temporary stubbed method replacing +name+ for the duration + # of the +block+. If +val_or_callable+ responds to #call, then it + # returns the result of calling it, otherwise returns the value + # as-is. If stubbed method yields a block, +block_args+ will be + # passed along. Cleans up the stub at the end of the +block+. The + # method +name+ must exist before stubbing. + # + # def test_stale_eh + # obj_under_test = Something.new + # refute obj_under_test.stale? + # + # Time.stub :now, Time.at(0) do + # assert obj_under_test.stale? + # end + # end + #-- + # NOTE: keyword args in callables are NOT checked for correctness + # against the existing method. Too many edge cases to be worth it. + + def stub name, val_or_callable, *block_args + new_name = "__minitest_stub__#{name}" + + metaclass = class << self; self; end + + if respond_to? name and not methods.map(&:to_s).include? name.to_s then + metaclass.send :define_method, name do |*args| + super(*args) + end + end + + metaclass.send :alias_method, new_name, name + + metaclass.send :define_method, name do |*args, &blk| + if val_or_callable.respond_to? :call then + val_or_callable.call(*args, &blk) + else + blk.call(*block_args) if blk + val_or_callable + end + end + + metaclass.send(:ruby2_keywords, name) if metaclass.respond_to?(:ruby2_keywords, true) + + yield self + ensure + metaclass.send :undef_method, name + metaclass.send :alias_method, name, new_name + metaclass.send :undef_method, new_name + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/parallel.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/parallel.rb new file mode 100644 index 000000000000..40ac709a3502 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/parallel.rb @@ -0,0 +1,70 @@ +module Minitest + module Parallel #:nodoc: + + ## + # The engine used to run multiple tests in parallel. + + class Executor + + ## + # The size of the pool of workers. + + attr_reader :size + + ## + # Create a parallel test executor of with +size+ workers. + + def initialize size + @size = size + @queue = Queue.new + @pool = nil + end + + ## + # Start the executor + + def start + @pool = size.times.map { + Thread.new(@queue) do |queue| + Thread.current.abort_on_exception = true + while (job = queue.pop) + klass, method, reporter = job + reporter.synchronize { reporter.prerecord klass, method } + result = Minitest.run_one_method klass, method + reporter.synchronize { reporter.record result } + end + end + } + end + + ## + # Add a job to the queue + + def << work; @queue << work; end + + ## + # Shuts down the pool of workers by signalling them to quit and + # waiting for them all to finish what they're currently working + # on. + + def shutdown + size.times { @queue << nil } + @pool.each(&:join) + end + end + + module Test # :nodoc: + def _synchronize; Minitest::Test.io_lock.synchronize { yield }; end # :nodoc: + + module ClassMethods # :nodoc: + def run_one_method klass, method_name, reporter + Minitest.parallel_executor << [klass, method_name, reporter] + end + + def test_order + :parallel + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/pride.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/pride.rb new file mode 100644 index 000000000000..f3b8e474f21c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/pride.rb @@ -0,0 +1,4 @@ +require "minitest" + +Minitest.load_plugins +Minitest::PrideIO.pride! diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/pride_plugin.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/pride_plugin.rb new file mode 100644 index 000000000000..aeef2b9c88ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/pride_plugin.rb @@ -0,0 +1,142 @@ +require "minitest" + +module Minitest + def self.plugin_pride_options opts, _options # :nodoc: + opts.on "-p", "--pride", "Pride. Show your testing pride!" do + PrideIO.pride! + end + end + + def self.plugin_pride_init options # :nodoc: + if PrideIO.pride? then + klass = ENV["TERM"] =~ /^xterm|-256color$/ ? PrideLOL : PrideIO + io = klass.new options[:io] + + self.reporter.reporters.grep(Minitest::Reporter).each do |rep| + rep.io = io if rep.io.tty? + end + end + end + + ## + # Show your testing pride! + + class PrideIO + ## + # Activate the pride plugin. Called from both -p option and minitest/pride + + def self.pride! + @pride = true + end + + ## + # Are we showing our testing pride? + + def self.pride? + @pride ||= false + end + + # Start an escape sequence + ESC = "\e[" + + # End the escape sequence + NND = "#{ESC}0m" + + # The IO we're going to pipe through. + attr_reader :io + + def initialize io # :nodoc: + @io = io + # stolen from /System/Library/Perl/5.10.0/Term/ANSIColor.pm + # also reference http://en.wikipedia.org/wiki/ANSI_escape_code + @colors ||= (31..36).to_a + @size = @colors.size + @index = 0 + end + + ## + # Wrap print to colorize the output. + + def print o + case o + when "." then + io.print pride o + when "E", "F" then + io.print "#{ESC}41m#{ESC}37m#{o}#{NND}" + when "S" then + io.print pride o + else + io.print o + end + end + + def puts *o # :nodoc: + o.map! { |s| + s.to_s.sub(/Finished/) { + @index = 0 + "Fabulous run".split(//).map { |c| + pride(c) + }.join + } + } + + io.puts(*o) + end + + ## + # Color a string. + + def pride string + string = "*" if string == "." + c = @colors[@index % @size] + @index += 1 + "#{ESC}#{c}m#{string}#{NND}" + end + + def method_missing msg, *args # :nodoc: + io.send(msg, *args) + end + end + + ## + # If you thought the PrideIO was colorful... + # + # (Inspired by lolcat, but with clean math) + + class PrideLOL < PrideIO + PI_3 = Math::PI / 3 # :nodoc: + + def initialize io # :nodoc: + # walk red, green, and blue around a circle separated by equal thirds. + # + # To visualize, type this into wolfram-alpha: + # + # plot (3*sin(x)+3), (3*sin(x+2*pi/3)+3), (3*sin(x+4*pi/3)+3) + + # 6 has wide pretty gradients. 3 == lolcat, about half the width + @colors = (0...(6 * 7)).map { |n| + n *= 1.0 / 6 + r = (3 * Math.sin(n ) + 3).to_i + g = (3 * Math.sin(n + 2 * PI_3) + 3).to_i + b = (3 * Math.sin(n + 4 * PI_3) + 3).to_i + + # Then we take rgb and encode them in a single number using base 6. + # For some mysterious reason, we add 16... to clear the bottom 4 bits? + # Yes... they're ugly. + + 36 * r + 6 * g + b + 16 + } + + super + end + + ## + # Make the string even more colorful. Damnit. + + def pride string + c = @colors[@index % @size] + @index += 1 + "#{ESC}38;5;#{c}m#{string}#{NND}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/spec.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/spec.rb new file mode 100644 index 000000000000..12f1975cf92d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/spec.rb @@ -0,0 +1,342 @@ +require "minitest/test" + +class Module # :nodoc: + def infect_an_assertion meth, new_name, dont_flip = false # :nodoc: + block = dont_flip == :block + dont_flip = false if block + + # warn "%-22p -> %p %p" % [meth, new_name, dont_flip] + self.class_eval <<-EOM, __FILE__, __LINE__ + 1 + def #{new_name} *args + where = Minitest.filter_backtrace(caller).first + where = where.split(/:in /, 2).first # clean up noise + warn "DEPRECATED: global use of #{new_name} from #\{where}. Use _(obj).#{new_name} instead. This will fail in Minitest 6." + Minitest::Expectation.new(self, Minitest::Spec.current).#{new_name}(*args) + end + EOM + + Minitest::Expectation.class_eval <<-EOM, __FILE__, __LINE__ + 1 + def #{new_name} *args + raise "Calling ##{new_name} outside of test." unless ctx + case + when #{!!dont_flip} then + ctx.#{meth}(target, *args) + when #{block} && Proc === target then + ctx.#{meth}(*args, &target) + else + ctx.#{meth}(args.first, target, *args[1..-1]) + end + end + EOM + end +end + +Minitest::Expectation = Struct.new :target, :ctx # :nodoc: + +## +# Kernel extensions for minitest + +module Kernel + ## + # Describe a series of expectations for a given target +desc+. + # + # Defines a test class subclassing from either Minitest::Spec or + # from the surrounding describe's class. The surrounding class may + # subclass Minitest::Spec manually in order to easily share code: + # + # class MySpec < Minitest::Spec + # # ... shared code ... + # end + # + # class TestStuff < MySpec + # it "does stuff" do + # # shared code available here + # end + # describe "inner stuff" do + # it "still does stuff" do + # # ...and here + # end + # end + # end + # + # For more information on getting started with writing specs, see: + # + # http://www.rubyinside.com/a-minitestspec-tutorial-elegant-spec-style-testing-that-comes-with-ruby-5354.html + # + # For some suggestions on how to improve your specs, try: + # + # http://betterspecs.org + # + # but do note that several items there are debatable or specific to + # rspec. + # + # For more information about expectations, see Minitest::Expectations. + + def describe desc, *additional_desc, &block # :doc: + stack = Minitest::Spec.describe_stack + name = [stack.last, desc, *additional_desc].compact.join("::") + sclas = stack.last || if Class === self && kind_of?(Minitest::Spec::DSL) then + self + else + Minitest::Spec.spec_type desc, *additional_desc + end + + cls = sclas.create name, desc + + stack.push cls + cls.class_eval(&block) + stack.pop + cls + end + private :describe +end + +## +# Minitest::Spec -- The faster, better, less-magical spec framework! +# +# For a list of expectations, see Minitest::Expectations. + +class Minitest::Spec < Minitest::Test + + def self.current # :nodoc: + Thread.current[:current_spec] + end + + def initialize name # :nodoc: + super + Thread.current[:current_spec] = self + end + + ## + # Oh look! A Minitest::Spec::DSL module! Eat your heart out DHH. + + module DSL + ## + # Contains pairs of matchers and Spec classes to be used to + # calculate the superclass of a top-level describe. This allows for + # automatically customizable spec types. + # + # See: register_spec_type and spec_type + + TYPES = [[//, Minitest::Spec]] + + ## + # Register a new type of spec that matches the spec's description. + # This method can take either a Regexp and a spec class or a spec + # class and a block that takes the description and returns true if + # it matches. + # + # Eg: + # + # register_spec_type(/Controller$/, Minitest::Spec::Rails) + # + # or: + # + # register_spec_type(Minitest::Spec::RailsModel) do |desc| + # desc.superclass == ActiveRecord::Base + # end + + def register_spec_type *args, &block + if block then + matcher, klass = block, args.first + else + matcher, klass = *args + end + TYPES.unshift [matcher, klass] + end + + ## + # Figure out the spec class to use based on a spec's description. Eg: + # + # spec_type("BlahController") # => Minitest::Spec::Rails + + def spec_type desc, *additional + TYPES.find { |matcher, _klass| + if matcher.respond_to? :call then + matcher.call desc, *additional + else + matcher === desc.to_s + end + }.last + end + + def describe_stack # :nodoc: + Thread.current[:describe_stack] ||= [] + end + + def children # :nodoc: + @children ||= [] + end + + def nuke_test_methods! # :nodoc: + self.public_instance_methods.grep(/^test_/).each do |name| + self.send :undef_method, name + end + end + + ## + # Define a 'before' action. Inherits the way normal methods should. + # + # NOTE: +type+ is ignored and is only there to make porting easier. + # + # Equivalent to Minitest::Test#setup. + + def before _type = nil, &block + define_method :setup do + super() + self.instance_eval(&block) + end + end + + ## + # Define an 'after' action. Inherits the way normal methods should. + # + # NOTE: +type+ is ignored and is only there to make porting easier. + # + # Equivalent to Minitest::Test#teardown. + + def after _type = nil, &block + define_method :teardown do + self.instance_eval(&block) + super() + end + end + + ## + # Define an expectation with name +desc+. Name gets morphed to a + # proper test method name. For some freakish reason, people who + # write specs don't like class inheritance, so this goes way out of + # its way to make sure that expectations aren't inherited. + # + # This is also aliased to #specify and doesn't require a +desc+ arg. + # + # Hint: If you _do_ want inheritance, use minitest/test. You can mix + # and match between assertions and expectations as much as you want. + + def it desc = "anonymous", &block + block ||= proc { skip "(no tests defined)" } + + @specs ||= 0 + @specs += 1 + + name = "test_%04d_%s" % [ @specs, desc ] + + undef_klasses = self.children.reject { |c| c.public_method_defined? name } + + define_method name, &block + + undef_klasses.each do |undef_klass| + undef_klass.send :undef_method, name + end + + name + end + + ## + # Essentially, define an accessor for +name+ with +block+. + # + # Why use let instead of def? I honestly don't know. + + def let name, &block + name = name.to_s + pre, post = "let '#{name}' cannot ", ". Please use another name." + methods = Minitest::Spec.instance_methods.map(&:to_s) - %w[subject] + raise ArgumentError, "#{pre}begin with 'test'#{post}" if + name =~ /\Atest/ + raise ArgumentError, "#{pre}override a method in Minitest::Spec#{post}" if + methods.include? name + + define_method name do + @_memoized ||= {} + @_memoized.fetch(name) { |k| @_memoized[k] = instance_eval(&block) } + end + end + + ## + # Another lazy man's accessor generator. Made even more lazy by + # setting the name for you to +subject+. + + def subject &block + let :subject, &block + end + + def create name, desc # :nodoc: + cls = Class.new(self) do + @name = name + @desc = desc + + nuke_test_methods! + end + + children << cls + + cls + end + + def name # :nodoc: + defined?(@name) ? @name : super + end + + def to_s # :nodoc: + name # Can't alias due to 1.8.7, not sure why + end + + attr_reader :desc # :nodoc: + alias :specify :it + + ## + # Rdoc... why are you so dumb? + + module InstanceMethods + ## + # Takes a value or a block and returns a value monad that has + # all of Expectations methods available to it. + # + # _(1 + 1).must_equal 2 + # + # And for blocks: + # + # _ { 1 + "1" }.must_raise TypeError + # + # This method of expectation-based testing is preferable to + # straight-expectation methods (on Object) because it stores its + # test context, bypassing our hacky use of thread-local variables. + # + # NOTE: At some point, the methods on Object will be deprecated + # and then removed. + # + # It is also aliased to #value and #expect for your aesthetic + # pleasure: + # + # _(1 + 1).must_equal 2 + # value(1 + 1).must_equal 2 + # expect(1 + 1).must_equal 2 + + def _ value = nil, &block + Minitest::Expectation.new block || value, self + end + + alias value _ + alias expect _ + + def before_setup # :nodoc: + super + Thread.current[:current_spec] = self + end + end + + def self.extended obj # :nodoc: + obj.send :include, InstanceMethods + end + end + + extend DSL + + TYPES = DSL::TYPES # :nodoc: +end + +require "minitest/expectations" + +class Object # :nodoc: + include Minitest::Expectations unless ENV["MT_NO_EXPECTATIONS"] +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/test.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/test.rb new file mode 100644 index 000000000000..0993bc491574 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/test.rb @@ -0,0 +1,220 @@ +require "minitest" unless defined? Minitest::Runnable + +module Minitest + ## + # Subclass Test to create your own tests. Typically you'll want a + # Test subclass per implementation class. + # + # See Minitest::Assertions + + class Test < Runnable + require "minitest/assertions" + include Minitest::Assertions + include Minitest::Reportable + + def class_name # :nodoc: + self.class.name # for Minitest::Reportable + end + + PASSTHROUGH_EXCEPTIONS = [NoMemoryError, SignalException, SystemExit] # :nodoc: + + # :stopdoc: + class << self; attr_accessor :io_lock; end + self.io_lock = Mutex.new + # :startdoc: + + ## + # Call this at the top of your tests when you absolutely + # positively need to have ordered tests. In doing so, you're + # admitting that you suck and your tests are weak. + + def self.i_suck_and_my_tests_are_order_dependent! + class << self + undef_method :test_order if method_defined? :test_order + define_method :test_order do :alpha end + end + end + + ## + # Make diffs for this Test use #pretty_inspect so that diff + # in assert_equal can have more details. NOTE: this is much slower + # than the regular inspect but much more usable for complex + # objects. + + def self.make_my_diffs_pretty! + require "pp" + + define_method :mu_pp, &:pretty_inspect + end + + ## + # Call this at the top of your tests when you want to run your + # tests in parallel. In doing so, you're admitting that you rule + # and your tests are awesome. + + def self.parallelize_me! + include Minitest::Parallel::Test + extend Minitest::Parallel::Test::ClassMethods + end + + ## + # Returns all instance methods starting with "test_". Based on + # #test_order, the methods are either sorted, randomized + # (default), or run in parallel. + + def self.runnable_methods + methods = methods_matching(/^test_/) + + case self.test_order + when :random, :parallel then + max = methods.size + methods.sort.sort_by { rand max } + when :alpha, :sorted then + methods.sort + else + raise "Unknown test_order: #{self.test_order.inspect}" + end + end + + ## + # Defines the order to run tests (:random by default). Override + # this or use a convenience method to change it for your tests. + + def self.test_order + :random + end + + TEARDOWN_METHODS = %w[ before_teardown teardown after_teardown ] # :nodoc: + + ## + # Runs a single test with setup/teardown hooks. + + def run + with_info_handler do + time_it do + capture_exceptions do + before_setup; setup; after_setup + + self.send self.name + end + + TEARDOWN_METHODS.each do |hook| + capture_exceptions do + self.send hook + end + end + end + end + + Result.from self # per contract + end + + ## + # Provides before/after hooks for setup and teardown. These are + # meant for library writers, NOT for regular test authors. See + # #before_setup for an example. + + module LifecycleHooks + + ## + # Runs before every test, before setup. This hook is meant for + # libraries to extend minitest. It is not meant to be used by + # test developers. + # + # As a simplistic example: + # + # module MyMinitestPlugin + # def before_setup + # super + # # ... stuff to do before setup is run + # end + # + # def after_setup + # # ... stuff to do after setup is run + # super + # end + # + # def before_teardown + # super + # # ... stuff to do before teardown is run + # end + # + # def after_teardown + # # ... stuff to do after teardown is run + # super + # end + # end + # + # class MiniTest::Test + # include MyMinitestPlugin + # end + + def before_setup; end + + ## + # Runs before every test. Use this to set up before each test + # run. + + def setup; end + + ## + # Runs before every test, after setup. This hook is meant for + # libraries to extend minitest. It is not meant to be used by + # test developers. + # + # See #before_setup for an example. + + def after_setup; end + + ## + # Runs after every test, before teardown. This hook is meant for + # libraries to extend minitest. It is not meant to be used by + # test developers. + # + # See #before_setup for an example. + + def before_teardown; end + + ## + # Runs after every test. Use this to clean up after each test + # run. + + def teardown; end + + ## + # Runs after every test, after teardown. This hook is meant for + # libraries to extend minitest. It is not meant to be used by + # test developers. + # + # See #before_setup for an example. + + def after_teardown; end + end # LifecycleHooks + + def capture_exceptions # :nodoc: + yield + rescue *PASSTHROUGH_EXCEPTIONS + raise + rescue Assertion => e + self.failures << e + rescue Exception => e + self.failures << UnexpectedError.new(e) + end + + def with_info_handler &block # :nodoc: + t0 = Minitest.clock_time + + handler = lambda do + warn "\nCurrent: %s#%s %.2fs" % [self.class, self.name, Minitest.clock_time - t0] + end + + self.class.on_signal ::Minitest.info_signal, handler, &block + end + + include LifecycleHooks + include Guard + extend Guard + end # Test +end + +require "minitest/unit" unless defined?(MiniTest) # compatibility layer only diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/unit.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/unit.rb new file mode 100644 index 000000000000..9a4eadff1dfb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/lib/minitest/unit.rb @@ -0,0 +1,45 @@ +# :stopdoc: + +unless defined?(Minitest) then + # all of this crap is just to avoid circular requires and is only + # needed if a user requires "minitest/unit" directly instead of + # "minitest/autorun", so we also warn + + from = caller.reject { |s| s =~ /rubygems/ }.join("\n ") + warn "Warning: you should require 'minitest/autorun' instead." + warn %(Warning: or add 'gem "minitest"' before 'require "minitest/autorun"') + warn "From:\n #{from}" + + module Minitest; end + MiniTest = Minitest # prevents minitest.rb from requiring back to us + require "minitest" +end + +MiniTest = Minitest unless defined?(MiniTest) + +module Minitest + class Unit + VERSION = Minitest::VERSION + class TestCase < Minitest::Test + def self.inherited klass # :nodoc: + from = caller.first + warn "MiniTest::Unit::TestCase is now Minitest::Test. From #{from}" + super + end + end + + def self.autorun # :nodoc: + from = caller.first + warn "MiniTest::Unit.autorun is now Minitest.autorun. From #{from}" + Minitest.autorun + end + + def self.after_tests &b # :nodoc: + from = caller.first + warn "MiniTest::Unit.after_tests is now Minitest.after_run. From #{from}" + Minitest.after_run(&b) + end + end +end + +# :startdoc: diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/metametameta.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/metametameta.rb new file mode 100644 index 000000000000..6e75b9d21690 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/metametameta.rb @@ -0,0 +1,136 @@ +require "tempfile" +require "stringio" +require "minitest/autorun" + +class Minitest::Test + def clean s + s.gsub(/^ {6}/, "") + end + + def with_empty_backtrace_filter + original = Minitest.backtrace_filter + + obj = Minitest::BacktraceFilter.new + def obj.filter _bt + [] + end + + Minitest::Test.io_lock.synchronize do # try not to trounce in parallel + begin + Minitest.backtrace_filter = obj + yield + ensure + Minitest.backtrace_filter = original + end + end + end +end + + +class FakeNamedTest < Minitest::Test + @@count = 0 + + def self.name + @fake_name ||= begin + @@count += 1 + "FakeNamedTest%02d" % @@count + end + end +end + +module MyModule; end +class AnError < StandardError; include MyModule; end + +class MetaMetaMetaTestCase < Minitest::Test + attr_accessor :reporter, :output, :tu + + def with_stderr err + old = $stderr + $stderr = err + yield + ensure + $stderr = old + end + + def run_tu_with_fresh_reporter flags = %w[--seed 42] + options = Minitest.process_args flags + + @output = StringIO.new("".encode('UTF-8')) + + self.reporter = Minitest::CompositeReporter.new + reporter << Minitest::SummaryReporter.new(@output, options) + reporter << Minitest::ProgressReporter.new(@output, options) + + with_stderr @output do + reporter.start + + yield(reporter) if block_given? + + @tus ||= [@tu] + @tus.each do |tu| + Minitest::Runnable.runnables.delete tu + + tu.run reporter, options + end + + reporter.report + end + end + + def first_reporter + reporter.reporters.first + end + + def assert_report expected, flags = %w[--seed 42], &block + header = clean <<-EOM + Run options: #{flags.map { |s| s =~ /\|/ ? s.inspect : s }.join " "} + + # Running: + + EOM + + run_tu_with_fresh_reporter flags, &block + + output = normalize_output @output.string.dup + + assert_equal header + expected, output + end + + def normalize_output output + output.sub!(/Finished in .*/, "Finished in 0.00") + output.sub!(/Loaded suite .*/, "Loaded suite blah") + + output.gsub!(/FakeNamedTest\d+/, "FakeNamedTestXX") + output.gsub!(/ = \d+.\d\d s = /, " = 0.00 s = ") + output.gsub!(/0x[A-Fa-f0-9]+/, "0xXXX") + output.gsub!(/ +$/, "") + + if windows? then + output.gsub!(/\[(?:[A-Za-z]:)?[^\]:]+:\d+\]/, "[FILE:LINE]") + output.gsub!(/^(\s+)(?:[A-Za-z]:)?[^:]+:\d+:in/, '\1FILE:LINE:in') + else + output.gsub!(/\[[^\]:]+:\d+\]/, "[FILE:LINE]") + output.gsub!(/^(\s+)[^:]+:\d+:in/, '\1FILE:LINE:in') + end + + output.gsub!(/( at )[^:]+:\d+/, '\1[FILE:LINE]') + + output + end + + def restore_env + old_value = ENV["MT_NO_SKIP_MSG"] + ENV.delete "MT_NO_SKIP_MSG" + + yield + ensure + ENV["MT_NO_SKIP_MSG"] = old_value + end + + def setup + super + srand 42 + Minitest::Test.reset + @tu = nil + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_assertions.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_assertions.rb new file mode 100644 index 000000000000..5bc456f94890 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_assertions.rb @@ -0,0 +1,1575 @@ +# encoding: UTF-8 + +require "minitest/autorun" + +if defined? Encoding then + e = Encoding.default_external + if e != Encoding::UTF_8 then + warn "" + warn "" + warn "NOTE: External encoding #{e} is not UTF-8. Tests WILL fail." + warn " Run tests with `RUBYOPT=-Eutf-8 rake` to avoid errors." + warn "" + warn "" + end +end + +SomeError = Class.new Exception + +unless defined? MyModule then + module MyModule; end + class AnError < StandardError; include MyModule; end +end + +class TestMinitestAssertions < Minitest::Test + # do not call parallelize_me! - teardown accesses @tc._assertions + # which is not threadsafe. Nearly every method in here is an + # assertion test so it isn't worth splitting it out further. + + RUBY18 = !defined? Encoding + + class DummyTest + include Minitest::Assertions + # include Minitest::Reportable # TODO: why do I really need this? + + attr_accessor :assertions, :failure + + def initialize + self.assertions = 0 + self.failure = nil + end + end + + def setup + super + + Minitest::Test.reset + + @tc = DummyTest.new + @zomg = "zomg ponies!" # TODO: const + @assertion_count = 1 + end + + def teardown + assert_equal(@assertion_count, @tc.assertions, + "expected #{@assertion_count} assertions to be fired during the test, not #{@tc.assertions}") + end + + def assert_deprecated name + dep = /DEPRECATED: #{name}. From #{__FILE__}:\d+(?::.*)?/ + dep = "" if $-w.nil? + + assert_output nil, dep do + yield + end + end + + def assert_triggered expected, klass = Minitest::Assertion + e = assert_raises klass do + yield + end + + msg = e.message.sub(/(---Backtrace---).*/m, '\1') + msg.gsub!(/\(oid=[-0-9]+\)/, "(oid=N)") + msg.gsub!(/(\d\.\d{6})\d+/, '\1xxx') # normalize: ruby version, impl, platform + + assert_msg = Regexp === expected ? :assert_match : :assert_equal + self.send assert_msg, expected, msg + end + + def assert_unexpected expected + expected = Regexp.new expected if String === expected + + assert_triggered expected, Minitest::UnexpectedError do + yield + end + end + + def clean s + s.gsub(/^ {6,10}/, "") + end + + def non_verbose + orig_verbose = $VERBOSE + $VERBOSE = false + + yield + ensure + $VERBOSE = orig_verbose + end + + def test_assert + @assertion_count = 2 + + @tc.assert_equal true, @tc.assert(true), "returns true on success" + end + + def test_assert__triggered + assert_triggered "Expected false to be truthy." do + @tc.assert false + end + end + + def test_assert__triggered_message + assert_triggered @zomg do + @tc.assert false, @zomg + end + end + + def test_assert__triggered_lambda + assert_triggered "whoops" do + @tc.assert false, lambda { "whoops" } + end + end + + def test_assert_empty + @assertion_count = 2 + + @tc.assert_empty [] + end + + def test_assert_empty_triggered + @assertion_count = 2 + + assert_triggered "Expected [1] to be empty." do + @tc.assert_empty [1] + end + end + + def test_assert_equal + @tc.assert_equal 1, 1 + end + + def test_assert_equal_different_collection_array_hex_invisible + object1 = Object.new + object2 = Object.new + msg = "No visible difference in the Array#inspect output. + You should look at the implementation of #== on Array or its members. + [#<Object:0xXXXXXX>]".gsub(/^ +/, "") + assert_triggered msg do + @tc.assert_equal [object1], [object2] + end + end + + def test_assert_equal_different_collection_hash_hex_invisible + h1, h2 = {}, {} + h1[1] = Object.new + h2[1] = Object.new + msg = "No visible difference in the Hash#inspect output. + You should look at the implementation of #== on Hash or its members. + {1=>#<Object:0xXXXXXX>}".gsub(/^ +/, "") + + assert_triggered msg do + @tc.assert_equal h1, h2 + end + end + + def test_assert_equal_different_diff_deactivated + without_diff do + assert_triggered util_msg("haha" * 10, "blah" * 10) do + o1 = "haha" * 10 + o2 = "blah" * 10 + + @tc.assert_equal o1, o2 + end + end + end + + def test_assert_equal_different_message + assert_triggered "whoops.\nExpected: 1\n Actual: 2" do + @tc.assert_equal 1, 2, message { "whoops" } + end + end + + def test_assert_equal_different_lambda + assert_triggered "whoops.\nExpected: 1\n Actual: 2" do + @tc.assert_equal 1, 2, lambda { "whoops" } + end + end + + def test_assert_equal_different_hex + c = Class.new do + def initialize s; @name = s; end + end + + o1 = c.new "a" + o2 = c.new "b" + msg = clean <<-EOS + --- expected + +++ actual + @@ -1 +1 @@ + -#<#<Class:0xXXXXXX>:0xXXXXXX @name=\"a\"> + +#<#<Class:0xXXXXXX>:0xXXXXXX @name=\"b\"> + EOS + + assert_triggered msg do + @tc.assert_equal o1, o2 + end + end + + def test_assert_equal_different_hex_invisible + o1 = Object.new + o2 = Object.new + + msg = "No visible difference in the Object#inspect output. + You should look at the implementation of #== on Object or its members. + #<Object:0xXXXXXX>".gsub(/^ +/, "") + + assert_triggered msg do + @tc.assert_equal o1, o2 + end + end + + def test_assert_equal_different_long + msg = "--- expected + +++ actual + @@ -1 +1 @@ + -\"hahahahahahahahahahahahahahahahahahahaha\" + +\"blahblahblahblahblahblahblahblahblahblah\" + ".gsub(/^ +/, "") + + assert_triggered msg do + o1 = "haha" * 10 + o2 = "blah" * 10 + + @tc.assert_equal o1, o2 + end + end + + def test_assert_equal_different_long_invisible + msg = "No visible difference in the String#inspect output. + You should look at the implementation of #== on String or its members. + \"blahblahblahblahblahblahblahblahblahblah\"".gsub(/^ +/, "") + + assert_triggered msg do + o1 = "blah" * 10 + o2 = "blah" * 10 + def o1.== _ + false + end + @tc.assert_equal o1, o2 + end + end + + def test_assert_equal_different_long_msg + msg = "message. + --- expected + +++ actual + @@ -1 +1 @@ + -\"hahahahahahahahahahahahahahahahahahahaha\" + +\"blahblahblahblahblahblahblahblahblahblah\" + ".gsub(/^ +/, "") + + assert_triggered msg do + o1 = "haha" * 10 + o2 = "blah" * 10 + @tc.assert_equal o1, o2, "message" + end + end + + def test_assert_equal_different_short + assert_triggered util_msg(1, 2) do + @tc.assert_equal 1, 2 + end + end + + def test_assert_equal_different_short_msg + assert_triggered util_msg(1, 2, "message") do + @tc.assert_equal 1, 2, "message" + end + end + + def test_assert_equal_different_short_multiline + msg = "--- expected\n+++ actual\n@@ -1,2 +1,2 @@\n \"a\n-b\"\n+c\"\n" + assert_triggered msg do + @tc.assert_equal "a\nb", "a\nc" + end + end + + def test_assert_equal_does_not_allow_lhs_nil + if Minitest::VERSION =~ /^6/ then + warn "Time to strip the MT5 test" + + @assertion_count += 1 + assert_triggered(/Use assert_nil if expecting nil/) do + @tc.assert_equal nil, nil + end + else + err_re = /Use assert_nil if expecting nil from .*test_minitest_\w+.rb/ + err_re = "" if $-w.nil? + + assert_output "", err_re do + @tc.assert_equal nil, nil + end + end + end + + def test_assert_equal_does_not_allow_lhs_nil_triggered + assert_triggered "Expected: nil\n Actual: false" do + @tc.assert_equal nil, false + end + end + + def test_assert_equal_string_bug791 + exp = <<-'EOF'.gsub(/^ {10}/, "") # note single quotes + --- expected + +++ actual + @@ -1,2 +1 @@ + -"\\n + -" + +"\\\" + EOF + + exp = "Expected: \"\\\\n\"\n Actual: \"\\\\\"" + assert_triggered exp do + @tc.assert_equal "\\n", "\\" + end + end + + def test_assert_equal_string_both_escaped_unescaped_newlines + msg = <<-EOM.gsub(/^ {10}/, "") + --- expected + +++ actual + @@ -1,2 +1 @@ + -\"A\\n + -B\" + +\"A\\n\\\\nB\" + EOM + + assert_triggered msg do + exp = "A\\nB" + act = "A\n\\nB" + + @tc.assert_equal exp, act + end + end + + def test_assert_equal_string_encodings + msg = <<-EOM.gsub(/^ {10}/, "") + --- expected + +++ actual + @@ -1,3 +1,3 @@ + -# encoding: UTF-8 + -# valid: false + +# encoding: ASCII-8BIT + +# valid: true + "bad-utf8-\\xF1.txt" + EOM + + assert_triggered msg do + x = "bad-utf8-\xF1.txt" + y = x.dup.force_encoding "binary" # TODO: switch to .b when 1.9 dropped + @tc.assert_equal x, y + end + end unless RUBY18 + + def test_assert_equal_string_encodings_both_different + msg = <<-EOM.gsub(/^ {10}/, "") + --- expected + +++ actual + @@ -1,3 +1,3 @@ + -# encoding: US-ASCII + -# valid: false + +# encoding: ASCII-8BIT + +# valid: true + "bad-utf8-\\xF1.txt" + EOM + + assert_triggered msg do + x = "bad-utf8-\xF1.txt".force_encoding "ASCII" + y = x.dup.force_encoding "binary" # TODO: switch to .b when 1.9 dropped + @tc.assert_equal x, y + end + end unless RUBY18 + + def test_assert_equal_unescape_newlines + msg = <<-'EOM'.gsub(/^ {10}/, "") # NOTE single quotes on heredoc + --- expected + +++ actual + @@ -1,2 +1,2 @@ + -"hello + +"hello\n + world" + EOM + + assert_triggered msg do + exp = "hello\nworld" + act = 'hello\nworld' # notice single quotes + + @tc.assert_equal exp, act + end + end + + def test_assert_in_delta + @tc.assert_in_delta 0.0, 1.0 / 1000, 0.1 + end + + def test_assert_in_delta_triggered + x = "1.0e-06" + assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= #{x}." do + @tc.assert_in_delta 0.0, 1.0 / 1000, 0.000001 + end + end + + def test_assert_in_epsilon + @assertion_count = 10 + + @tc.assert_in_epsilon 10_000, 9991 + @tc.assert_in_epsilon 9991, 10_000 + @tc.assert_in_epsilon 1.0, 1.001 + @tc.assert_in_epsilon 1.001, 1.0 + + @tc.assert_in_epsilon 10_000, 9999.1, 0.0001 + @tc.assert_in_epsilon 9999.1, 10_000, 0.0001 + @tc.assert_in_epsilon 1.0, 1.0001, 0.0001 + @tc.assert_in_epsilon 1.0001, 1.0, 0.0001 + + @tc.assert_in_epsilon(-1, -1) + @tc.assert_in_epsilon(-10_000, -9991) + end + + def test_assert_in_epsilon_triggered + assert_triggered "Expected |10000 - 9990| (10) to be <= 9.99." do + @tc.assert_in_epsilon 10_000, 9990 + end + end + + def test_assert_in_epsilon_triggered_negative_case + x = (RUBY18 and not maglev?) ? "0.1" : "0.100000xxx" + y = "0.1" + assert_triggered "Expected |-1.1 - -1| (#{x}) to be <= #{y}." do + @tc.assert_in_epsilon(-1.1, -1, 0.1) + end + end + + def test_assert_includes + @assertion_count = 2 + + @tc.assert_includes [true], true + end + + def test_assert_includes_triggered + @assertion_count = 3 + + e = @tc.assert_raises Minitest::Assertion do + @tc.assert_includes [true], false + end + + expected = "Expected [true] to include false." + assert_equal expected, e.message + end + + def test_assert_instance_of + @tc.assert_instance_of String, "blah" + end + + def test_assert_instance_of_triggered + assert_triggered 'Expected "blah" to be an instance of Array, not String.' do + @tc.assert_instance_of Array, "blah" + end + end + + def test_assert_kind_of + @tc.assert_kind_of String, "blah" + end + + def test_assert_kind_of_triggered + assert_triggered 'Expected "blah" to be a kind of Array, not String.' do + @tc.assert_kind_of Array, "blah" + end + end + + def test_assert_match + @assertion_count = 2 + @tc.assert_match(/\w+/, "blah blah blah") + end + + def test_assert_match_matchee_to_str + @assertion_count = 2 + + obj = Object.new + def obj.to_str; "blah" end + + @tc.assert_match "blah", obj + end + + def test_assert_match_matcher_object + @assertion_count = 2 + + pattern = Object.new + def pattern.=~ _; true end + + @tc.assert_match pattern, 5 + end + + def test_assert_match_object_triggered + @assertion_count = 2 + + pattern = Object.new + def pattern.=~ _; false end + def pattern.inspect; "[Object]" end + + assert_triggered "Expected [Object] to match 5." do + @tc.assert_match pattern, 5 + end + end + + def test_assert_match_triggered + @assertion_count = 2 + assert_triggered 'Expected /\d+/ to match "blah blah blah".' do + @tc.assert_match(/\d+/, "blah blah blah") + end + end + + def test_assert_nil + @tc.assert_nil nil + end + + def test_assert_nil_triggered + assert_triggered "Expected 42 to be nil." do + @tc.assert_nil 42 + end + end + + def test_assert_operator + @tc.assert_operator 2, :>, 1 + end + + def test_assert_operator_bad_object + bad = Object.new + def bad.== _; true end + + @tc.assert_operator bad, :equal?, bad + end + + def test_assert_operator_triggered + assert_triggered "Expected 2 to be < 1." do + @tc.assert_operator 2, :<, 1 + end + end + + def test_assert_output_both + @assertion_count = 2 + + @tc.assert_output "yay", "blah" do + print "yay" + $stderr.print "blah" + end + end + + def test_assert_output_both_regexps + @assertion_count = 4 + + @tc.assert_output(/y.y/, /bl.h/) do + print "yay" + $stderr.print "blah" + end + end + + def test_assert_output_err + @tc.assert_output nil, "blah" do + $stderr.print "blah" + end + end + + def test_assert_output_neither + @assertion_count = 0 + + @tc.assert_output do + # do nothing + end + end + + def test_assert_output_out + @tc.assert_output "blah" do + print "blah" + end + end + + def test_assert_output_triggered_both + assert_triggered util_msg("blah", "blah blah", "In stderr") do + @tc.assert_output "yay", "blah" do + print "boo" + $stderr.print "blah blah" + end + end + end + + def test_assert_output_triggered_err + assert_triggered util_msg("blah", "blah blah", "In stderr") do + @tc.assert_output nil, "blah" do + $stderr.print "blah blah" + end + end + end + + def test_assert_output_triggered_out + assert_triggered util_msg("blah", "blah blah", "In stdout") do + @tc.assert_output "blah" do + print "blah blah" + end + end + end + + def test_assert_output_no_block + assert_triggered "assert_output requires a block to capture output." do + @tc.assert_output "blah" + end + end + + def test_assert_output_nested_assert_uncaught + @assertion_count = 1 + + assert_triggered "Epic Fail!" do + @tc.assert_output "blah\n" do + puts "blah" + @tc.flunk + end + end + end + + def test_assert_output_nested_raise + @assertion_count = 2 + + @tc.assert_output "blah\n" do + @tc.assert_raises RuntimeError do + puts "blah" + raise "boom!" + end + end + end + + def test_assert_output_nested_raise_bad + @assertion_count = 0 + + assert_unexpected "boom!" do + @tc.assert_raises do # 2) bypassed via UnexpectedError + @tc.assert_output "blah\n" do # 1) captures and raises UnexpectedError + puts "not_blah" + raise "boom!" + end + end + end + end + + def test_assert_output_nested_raise_mismatch + # this test is redundant, but illustrative + @assertion_count = 0 + + assert_unexpected "boom!" do + @tc.assert_raises RuntimeError do # 2) bypassed via UnexpectedError + @tc.assert_output "blah\n" do # 1) captures and raises UnexpectedError + puts "not_blah" + raise ArgumentError, "boom!" + end + end + end + end + + def test_assert_output_nested_throw_caught + @assertion_count = 2 + + @tc.assert_output "blah\n" do + @tc.assert_throws :boom! do + puts "blah" + throw :boom! + end + end + end + + def test_assert_output_nested_throw_caught_bad + @assertion_count = 1 # want 0; can't prevent throw from escaping :( + + @tc.assert_throws :boom! do # 2) captured via catch + @tc.assert_output "blah\n" do # 1) bypassed via throw + puts "not_blah" + throw :boom! + end + end + end + + def test_assert_output_nested_throw_mismatch + @assertion_count = 0 + + assert_unexpected "uncaught throw :boom!" do + @tc.assert_throws :not_boom! do # 2) captured via assert_throws+rescue + @tc.assert_output "blah\n" do # 1) bypassed via throw + puts "not_blah" + throw :boom! + end + end + end + end + + def test_assert_output_uncaught_raise + @assertion_count = 0 + + assert_unexpected "RuntimeError: boom!" do + @tc.assert_output "blah\n" do + puts "not_blah" + raise "boom!" + end + end + end + + def test_assert_output_uncaught_throw + @assertion_count = 0 + + assert_unexpected "uncaught throw :boom!" do + @tc.assert_output "blah\n" do + puts "not_blah" + throw :boom! + end + end + end + def test_assert_predicate + @tc.assert_predicate "", :empty? + end + + def test_assert_predicate_triggered + assert_triggered 'Expected "blah" to be empty?.' do + @tc.assert_predicate "blah", :empty? + end + end + + def test_assert_raises + @tc.assert_raises RuntimeError do + raise "blah" + end + end + + def test_assert_raises_default + @tc.assert_raises do + raise StandardError, "blah" + end + end + + def test_assert_raises_default_triggered + e = assert_raises Minitest::Assertion do + @tc.assert_raises do + raise SomeError, "blah" + end + end + + expected = clean <<-EOM.chomp + [StandardError] exception expected, not + Class: <SomeError> + Message: <\"blah\"> + ---Backtrace--- + FILE:LINE:in \`test_assert_raises_default_triggered\' + --------------- + EOM + + actual = e.message.gsub(/^.+:\d+/, "FILE:LINE") + actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0" + + assert_equal expected, actual + end + + def test_assert_raises_exit + @tc.assert_raises SystemExit do + exit 1 + end + end + + def test_assert_raises_module + @tc.assert_raises MyModule do + raise AnError + end + end + + def test_assert_raises_signals + @tc.assert_raises SignalException do + raise SignalException, :INT + end + end + + def test_assert_raises_throw_nested_bad + @assertion_count = 0 + + assert_unexpected "RuntimeError: boom!" do + @tc.assert_raises do + @tc.assert_throws :blah do + raise "boom!" + throw :not_blah + end + end + end + end + + ## + # *sigh* This is quite an odd scenario, but it is from real (albeit + # ugly) test code in ruby-core: + + # http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29259 + + def test_assert_raises_skip + @assertion_count = 0 + + assert_triggered "skipped", Minitest::Skip do + @tc.assert_raises ArgumentError do + begin + raise "blah" + rescue + skip "skipped" + end + end + end + end + + def test_assert_raises_subclass + @tc.assert_raises StandardError do + raise AnError + end + end + + def test_assert_raises_subclass_triggered + e = assert_raises Minitest::Assertion do + @tc.assert_raises SomeError do + raise AnError, "some message" + end + end + + expected = clean <<-EOM + [SomeError] exception expected, not + Class: <AnError> + Message: <\"some message\"> + ---Backtrace--- + FILE:LINE:in \`test_assert_raises_subclass_triggered\' + --------------- + EOM + + actual = e.message.gsub(/^.+:\d+/, "FILE:LINE") + actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0" + + assert_equal expected.chomp, actual + end + + def test_assert_raises_triggered_different + e = assert_raises Minitest::Assertion do + @tc.assert_raises RuntimeError do + raise SyntaxError, "icky" + end + end + + expected = clean <<-EOM.chomp + [RuntimeError] exception expected, not + Class: <SyntaxError> + Message: <\"icky\"> + ---Backtrace--- + FILE:LINE:in \`test_assert_raises_triggered_different\' + --------------- + EOM + + actual = e.message.gsub(/^.+:\d+/, "FILE:LINE") + actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0" + + assert_equal expected, actual + end + + def test_assert_raises_triggered_different_msg + e = assert_raises Minitest::Assertion do + @tc.assert_raises RuntimeError, "XXX" do + raise SyntaxError, "icky" + end + end + + expected = clean <<-EOM + XXX. + [RuntimeError] exception expected, not + Class: <SyntaxError> + Message: <\"icky\"> + ---Backtrace--- + FILE:LINE:in \`test_assert_raises_triggered_different_msg\' + --------------- + EOM + + actual = e.message.gsub(/^.+:\d+/, "FILE:LINE") + actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0" + + assert_equal expected.chomp, actual + end + + def test_assert_raises_triggered_none + e = assert_raises Minitest::Assertion do + @tc.assert_raises Minitest::Assertion do + # do nothing + end + end + + expected = "Minitest::Assertion expected but nothing was raised." + + assert_equal expected, e.message + end + + def test_assert_raises_triggered_none_msg + e = assert_raises Minitest::Assertion do + @tc.assert_raises Minitest::Assertion, "XXX" do + # do nothing + end + end + + expected = "XXX.\nMinitest::Assertion expected but nothing was raised." + + assert_equal expected, e.message + end + + def test_assert_raises_without_block + assert_triggered "assert_raises requires a block to capture errors." do + @tc.assert_raises StandardError + end + end + + def test_assert_respond_to + @tc.assert_respond_to "blah", :empty? + end + + def test_assert_respond_to_triggered + assert_triggered 'Expected "blah" (String) to respond to #rawr!.' do + @tc.assert_respond_to "blah", :rawr! + end + end + + def test_assert_same + @assertion_count = 3 + + o = "blah" + @tc.assert_same 1, 1 + @tc.assert_same :blah, :blah + @tc.assert_same o, o + end + + def test_assert_same_triggered + @assertion_count = 2 + + assert_triggered "Expected 2 (oid=N) to be the same as 1 (oid=N)." do + @tc.assert_same 1, 2 + end + + s1 = "blah" + s2 = "blah" + + assert_triggered 'Expected "blah" (oid=N) to be the same as "blah" (oid=N).' do + @tc.assert_same s1, s2 + end + end + + def test_assert_send + assert_deprecated :assert_send do + @tc.assert_send [1, :<, 2] + end + end + + def test_assert_send_bad + assert_deprecated :assert_send do + assert_triggered "Expected 1.>(*[2]) to return true." do + @tc.assert_send [1, :>, 2] + end + end + end + + def test_assert_silent + @assertion_count = 2 + + @tc.assert_silent do + # do nothing + end + end + + def test_assert_silent_triggered_err + assert_triggered util_msg("", "blah blah", "In stderr") do + @tc.assert_silent do + $stderr.print "blah blah" + end + end + end + + def test_assert_silent_triggered_out + @assertion_count = 2 + + assert_triggered util_msg("", "blah blah", "In stdout") do + @tc.assert_silent do + print "blah blah" + end + end + end + + def test_assert_throws + @tc.assert_throws :blah do + throw :blah + end + end + + def test_assert_throws_argument_exception + @assertion_count = 0 + + assert_unexpected "ArgumentError" do + @tc.assert_throws :blah do + raise ArgumentError + end + end + end + + def test_assert_throws_different + assert_triggered "Expected :blah to have been thrown, not :not_blah." do + @tc.assert_throws :blah do + throw :not_blah + end + end + end + + def test_assert_throws_name_error + @assertion_count = 0 + + assert_unexpected "NameError" do + @tc.assert_throws :blah do + raise NameError + end + end + end + + def test_assert_throws_unthrown + assert_triggered "Expected :blah to have been thrown." do + @tc.assert_throws :blah do + # do nothing + end + end + end + + def test_assert_path_exists + @tc.assert_path_exists __FILE__ + end + + def test_assert_path_exists_triggered + assert_triggered "Expected path 'blah' to exist." do + @tc.assert_path_exists "blah" + end + end + + def test_capture_io + @assertion_count = 0 + + non_verbose do + out, err = capture_io do + puts "hi" + $stderr.puts "bye!" + end + + assert_equal "hi\n", out + assert_equal "bye!\n", err + end + end + + def test_capture_subprocess_io + @assertion_count = 0 + + non_verbose do + out, err = capture_subprocess_io do + system("echo hi") + system("echo bye! 1>&2") + end + + assert_equal "hi\n", out + assert_equal "bye!", err.strip + end + end + + def test_class_asserts_match_refutes + @assertion_count = 0 + + methods = Minitest::Assertions.public_instance_methods + methods.map!(&:to_s) if Symbol === methods.first + + # These don't have corresponding refutes _on purpose_. They're + # useless and will never be added, so don't bother. + ignores = %w[assert_output assert_raises assert_send + assert_silent assert_throws assert_mock] + + # These are test/unit methods. I'm not actually sure why they're still here + ignores += %w[assert_no_match assert_not_equal assert_not_nil + assert_not_same assert_nothing_raised + assert_nothing_thrown assert_raise] + + asserts = methods.grep(/^assert/).sort - ignores + refutes = methods.grep(/^refute/).sort - ignores + + assert_empty refutes.map { |n| n.sub(/^refute/, "assert") } - asserts + assert_empty asserts.map { |n| n.sub(/^assert/, "refute") } - refutes + end + + def test_delta_consistency + @assertion_count = 2 + + @tc.assert_in_delta 0, 1, 1 + + assert_triggered "Expected |0 - 1| (1) to not be <= 1." do + @tc.refute_in_delta 0, 1, 1 + end + end + + def test_epsilon_consistency + @assertion_count = 2 + + @tc.assert_in_epsilon 1.0, 1.001 + + msg = "Expected |1.0 - 1.001| (0.000999xxx) to not be <= 0.001." + assert_triggered msg do + @tc.refute_in_epsilon 1.0, 1.001 + end + end + + def assert_fail_after t + @tc.fail_after t.year, t.month, t.day, "remove the deprecations" + end + + def test_fail_after + d0 = Time.now + d1 = d0 + 86_400 # I am an idiot + + assert_silent do + assert_fail_after d1 + end + + assert_triggered "remove the deprecations" do + assert_fail_after d0 + end + end + + def test_flunk + assert_triggered "Epic Fail!" do + @tc.flunk + end + end + + def test_flunk_message + assert_triggered @zomg do + @tc.flunk @zomg + end + end + + def test_pass + @tc.pass + end + + def test_refute + @assertion_count = 2 + + @tc.assert_equal true, @tc.refute(false), "returns true on success" + end + + def test_refute_empty + @assertion_count = 2 + + @tc.refute_empty [1] + end + + def test_refute_empty_triggered + @assertion_count = 2 + + assert_triggered "Expected [] to not be empty." do + @tc.refute_empty [] + end + end + + def test_refute_equal + @tc.refute_equal "blah", "yay" + end + + def test_refute_equal_triggered + assert_triggered 'Expected "blah" to not be equal to "blah".' do + @tc.refute_equal "blah", "blah" + end + end + + def test_refute_in_delta + @tc.refute_in_delta 0.0, 1.0 / 1000, 0.000001 + end + + def test_refute_in_delta_triggered + x = "0.1" + assert_triggered "Expected |0.0 - 0.001| (0.001) to not be <= #{x}." do + @tc.refute_in_delta 0.0, 1.0 / 1000, 0.1 + end + end + + def test_refute_in_epsilon + @tc.refute_in_epsilon 10_000, 9990-1 + end + + def test_refute_in_epsilon_triggered + assert_triggered "Expected |10000 - 9990| (10) to not be <= 10.0." do + @tc.refute_in_epsilon 10_000, 9990 + flunk + end + end + + def test_refute_includes + @assertion_count = 2 + + @tc.refute_includes [true], false + end + + def test_refute_includes_triggered + @assertion_count = 3 + + e = @tc.assert_raises Minitest::Assertion do + @tc.refute_includes [true], true + end + + expected = "Expected [true] to not include true." + assert_equal expected, e.message + end + + def test_refute_instance_of + @tc.refute_instance_of Array, "blah" + end + + def test_refute_instance_of_triggered + assert_triggered 'Expected "blah" to not be an instance of String.' do + @tc.refute_instance_of String, "blah" + end + end + + def test_refute_kind_of + @tc.refute_kind_of Array, "blah" + end + + def test_refute_kind_of_triggered + assert_triggered 'Expected "blah" to not be a kind of String.' do + @tc.refute_kind_of String, "blah" + end + end + + def test_refute_match + @assertion_count = 2 + @tc.refute_match(/\d+/, "blah blah blah") + end + + def test_refute_match_matcher_object + @assertion_count = 2 + pattern = Object.new + def pattern.=~ _; false end + @tc.refute_match pattern, 5 + end + + def test_refute_match_object_triggered + @assertion_count = 2 + + pattern = Object.new + def pattern.=~ _; true end + def pattern.inspect; "[Object]" end + + assert_triggered "Expected [Object] to not match 5." do + @tc.refute_match pattern, 5 + end + end + + def test_refute_match_triggered + @assertion_count = 2 + assert_triggered 'Expected /\w+/ to not match "blah blah blah".' do + @tc.refute_match(/\w+/, "blah blah blah") + end + end + + def test_refute_nil + @tc.refute_nil 42 + end + + def test_refute_nil_triggered + assert_triggered "Expected nil to not be nil." do + @tc.refute_nil nil + end + end + + def test_refute_operator + @tc.refute_operator 2, :<, 1 + end + + def test_refute_operator_bad_object + bad = Object.new + def bad.== _; true end + + @tc.refute_operator true, :equal?, bad + end + + def test_refute_operator_triggered + assert_triggered "Expected 2 to not be > 1." do + @tc.refute_operator 2, :>, 1 + end + end + + def test_refute_predicate + @tc.refute_predicate "42", :empty? + end + + def test_refute_predicate_triggered + assert_triggered 'Expected "" to not be empty?.' do + @tc.refute_predicate "", :empty? + end + end + + def test_refute_respond_to + @tc.refute_respond_to "blah", :rawr! + end + + def test_refute_respond_to_triggered + assert_triggered 'Expected "blah" to not respond to empty?.' do + @tc.refute_respond_to "blah", :empty? + end + end + + def test_refute_same + @tc.refute_same 1, 2 + end + + def test_refute_same_triggered + assert_triggered "Expected 1 (oid=N) to not be the same as 1 (oid=N)." do + @tc.refute_same 1, 1 + end + end + + def test_refute_path_exists + @tc.refute_path_exists "blah" + end + + def test_refute_path_exists_triggered + assert_triggered "Expected path '#{__FILE__}' to not exist." do + @tc.refute_path_exists __FILE__ + end + end + + def test_skip + @assertion_count = 0 + + assert_triggered "haha!", Minitest::Skip do + @tc.skip "haha!" + end + end + + def assert_skip_until t, msg + @tc.skip_until t.year, t.month, t.day, msg + end + + def test_skip_until + @assertion_count = 0 + + d0 = Time.now + d1 = d0 + 86_400 # I am an idiot + + assert_output "", /Stale skip_until \"not yet\" at .*?:\d+$/ do + assert_skip_until d0, "not yet" + end + + assert_triggered "not ready yet", Minitest::Skip do + assert_skip_until d1, "not ready yet" + end + end + + def util_msg exp, act, msg = nil + s = "Expected: #{exp.inspect}\n Actual: #{act.inspect}" + s = "#{msg}.\n#{s}" if msg + s + end + + def without_diff + old_diff = Minitest::Assertions.diff + Minitest::Assertions.diff = nil + + yield + ensure + Minitest::Assertions.diff = old_diff + end +end + +class TestMinitestAssertionHelpers < Minitest::Test + def assert_mu_pp exp, input, raw = false + act = mu_pp input + + if String === input && !raw then + assert_equal "\"#{exp}\"", act + else + assert_equal exp, act + end + end + + def assert_mu_pp_for_diff exp, input, raw = false + act = mu_pp_for_diff input + + if String === input && !raw then + assert_equal "\"#{exp}\"", act + else + assert_equal exp, act + end + end + + def test_diff_equal + msg = "No visible difference in the String#inspect output. + You should look at the implementation of #== on String or its members. + \"blahblahblahblahblahblahblahblahblahblah\"".gsub(/^ +/, "") + + o1 = "blah" * 10 + o2 = "blah" * 10 + def o1.== _ + false + end + + assert_equal msg, diff(o1, o2) + end + + def test_diff_str_mixed + msg = <<-'EOM'.gsub(/^ {10}/, "") # NOTE single quotes on heredoc + --- expected + +++ actual + @@ -1 +1 @@ + -"A\\n\nB" + +"A\n\\nB" + EOM + + exp = "A\\n\nB" + act = "A\n\\nB" + + assert_equal msg, diff(exp, act) + end + + def test_diff_str_multiline + msg = <<-'EOM'.gsub(/^ {10}/, "") # NOTE single quotes on heredoc + --- expected + +++ actual + @@ -1,2 +1,2 @@ + "A + -B" + +C" + EOM + + exp = "A\nB" + act = "A\nC" + + assert_equal msg, diff(exp, act) + end + + def test_diff_str_simple + msg = <<-'EOM'.gsub(/^ {10}/, "").chomp # NOTE single quotes on heredoc + Expected: "A" + Actual: "B" + EOM + + exp = "A" + act = "B" + + assert_equal msg, diff(exp, act) + end + + def test_message + assert_equal "blah2.", message { "blah2" }.call + assert_equal "blah2.", message("") { "blah2" }.call + assert_equal "blah1.\nblah2.", message(:blah1) { "blah2" }.call + assert_equal "blah1.\nblah2.", message("blah1") { "blah2" }.call + + message = proc { "blah1" } + assert_equal "blah1.\nblah2.", message(message) { "blah2" }.call + + message = message { "blah1" } + assert_equal "blah1.\nblah2.", message(message) { "blah2" }.call + end + + def test_message_deferred + var = nil + + msg = message { var = "blah" } + + assert_nil var + + msg.call + + assert_equal "blah", var + end + + def test_mu_pp + assert_mu_pp 42.inspect, 42 + assert_mu_pp %w[a b c].inspect, %w[a b c] + assert_mu_pp "A B", "A B" + assert_mu_pp "A\\nB", "A\nB" + assert_mu_pp "A\\\\nB", 'A\nB' # notice single quotes + end + + def test_mu_pp_for_diff + assert_mu_pp_for_diff "#<Object:0xXXXXXX>", Object.new + assert_mu_pp_for_diff "A B", "A B" + assert_mu_pp_for_diff [1, 2, 3].inspect, [1, 2, 3] + assert_mu_pp_for_diff "A\nB", "A\nB" + end + + def test_mu_pp_for_diff_str_bad_encoding + str = "\666".force_encoding Encoding::UTF_8 + exp = "# encoding: UTF-8\n# valid: false\n\"\\xB6\"" + + assert_mu_pp_for_diff exp, str, :raw + end + + def test_mu_pp_for_diff_str_bad_encoding_both + str = "\666A\\n\nB".force_encoding Encoding::UTF_8 + exp = "# encoding: UTF-8\n# valid: false\n\"\\xB6A\\\\n\\nB\"" + + assert_mu_pp_for_diff exp, str, :raw + end + + def test_mu_pp_for_diff_str_encoding + str = "A\nB".b + exp = "# encoding: ASCII-8BIT\n# valid: true\n\"A\nB\"" + + assert_mu_pp_for_diff exp, str, :raw + end + + def test_mu_pp_for_diff_str_encoding_both + str = "A\\n\nB".b + exp = "# encoding: ASCII-8BIT\n# valid: true\n\"A\\\\n\\nB\"" + + assert_mu_pp_for_diff exp, str, :raw + end + + def test_mu_pp_for_diff_str_nerd + assert_mu_pp_for_diff "A\\nB\\\\nC", "A\nB\\nC" + assert_mu_pp_for_diff "\\nB\\\\nC", "\nB\\nC" + assert_mu_pp_for_diff "\\nB\\\\n", "\nB\\n" + assert_mu_pp_for_diff "\\n\\\\n", "\n\\n" + assert_mu_pp_for_diff "\\\\n\\n", "\\n\n" + assert_mu_pp_for_diff "\\\\nB\\n", "\\nB\n" + assert_mu_pp_for_diff "\\\\nB\\nC", "\\nB\nC" + assert_mu_pp_for_diff "A\\\\n\\nB", "A\\n\nB" + assert_mu_pp_for_diff "A\\n\\\\nB", "A\n\\nB" + assert_mu_pp_for_diff "\\\\n\\n", "\\n\n" + assert_mu_pp_for_diff "\\n\\\\n", "\n\\n" + end + + def test_mu_pp_for_diff_str_normal + assert_mu_pp_for_diff "", "" + assert_mu_pp_for_diff "A\\n\n", "A\\n" + assert_mu_pp_for_diff "A\\n\nB", "A\\nB" + assert_mu_pp_for_diff "A\n", "A\n" + assert_mu_pp_for_diff "A\nB", "A\nB" + assert_mu_pp_for_diff "\\n\n", "\\n" + assert_mu_pp_for_diff "\n", "\n" + assert_mu_pp_for_diff "\\n\nA", "\\nA" + assert_mu_pp_for_diff "\nA", "\nA" + end + + def test_mu_pp_str_bad_encoding + str = "\666".force_encoding Encoding::UTF_8 + exp = "# encoding: UTF-8\n# valid: false\n\"\\xB6\"" + + assert_mu_pp exp, str, :raw + end + + def test_mu_pp_str_encoding + str = "A\nB".b + exp = "# encoding: ASCII-8BIT\n# valid: true\n\"A\\nB\"" + + assert_mu_pp exp, str, :raw + end + + def test_mu_pp_str_immutable + printer = Class.new { extend Minitest::Assertions } + str = "test".freeze + assert_equal '"test"', printer.mu_pp(str) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_benchmark.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_benchmark.rb new file mode 100644 index 000000000000..88abf77c148d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_benchmark.rb @@ -0,0 +1,137 @@ +require "minitest/autorun" +require "minitest/benchmark" + +## +# Used to verify data: +# http://www.wolframalpha.com/examples/RegressionAnalysis.html + +class TestMinitestBenchmark < Minitest::Test + def test_cls_bench_exp + assert_equal [2, 4, 8, 16, 32], Minitest::Benchmark.bench_exp(2, 32, 2) + end + + def test_cls_bench_linear + assert_equal [2, 4, 6, 8, 10], Minitest::Benchmark.bench_linear(2, 10, 2) + end + + def test_cls_runnable_methods + assert_equal [], Minitest::Benchmark.runnable_methods + + c = Class.new(Minitest::Benchmark) do + def bench_blah + end + end + + assert_equal ["bench_blah"], c.runnable_methods + end + + def test_cls_bench_range + assert_equal [1, 10, 100, 1_000, 10_000], Minitest::Benchmark.bench_range + end + + def test_fit_exponential_clean + x = [1.0, 2.0, 3.0, 4.0, 5.0] + y = x.map { |n| 1.1 * Math.exp(2.1 * n) } + + assert_fit :exponential, x, y, 1.0, 1.1, 2.1 + end + + def test_fit_exponential_noisy + x = [1.0, 1.9, 2.6, 3.4, 5.0] + y = [12, 10, 8.2, 6.9, 5.9] + + # verified with Numbers and R + assert_fit :exponential, x, y, 0.95, 13.81148, -0.1820 + end + + def test_fit_logarithmic_clean + x = [1.0, 2.0, 3.0, 4.0, 5.0] + y = x.map { |n| 1.1 + 2.1 * Math.log(n) } + + assert_fit :logarithmic, x, y, 1.0, 1.1, 2.1 + end + + def test_fit_logarithmic_noisy + x = [1.0, 2.0, 3.0, 4.0, 5.0] + # Generated with + # y = x.map { |n| jitter = 0.999 + 0.002 * rand; (Math.log(n) ) * jitter } + y = [0.0, 0.6935, 1.0995, 1.3873, 1.6097] + + assert_fit :logarithmic, x, y, 0.95, 0, 1 + end + + def test_fit_constant_clean + x = (1..5).to_a + y = [5.0, 5.0, 5.0, 5.0, 5.0] + + assert_fit :linear, x, y, nil, 5.0, 0 + end + + def test_fit_constant_noisy + x = (1..5).to_a + y = [1.0, 1.2, 1.0, 0.8, 1.0] + + # verified in numbers and R + assert_fit :linear, x, y, nil, 1.12, -0.04 + end + + def test_fit_linear_clean + # y = m * x + b where m = 2.2, b = 3.1 + x = (1..5).to_a + y = x.map { |n| 2.2 * n + 3.1 } + + assert_fit :linear, x, y, 1.0, 3.1, 2.2 + end + + def test_fit_linear_noisy + x = [ 60, 61, 62, 63, 65] + y = [3.1, 3.6, 3.8, 4.0, 4.1] + + # verified in numbers and R + assert_fit :linear, x, y, 0.8315, -7.9635, 0.1878 + end + + def test_fit_power_clean + # y = A x ** B, where B = b and A = e ** a + # if, A = 1, B = 2, then + + x = [1.0, 2.0, 3.0, 4.0, 5.0] + y = [1.0, 4.0, 9.0, 16.0, 25.0] + + assert_fit :power, x, y, 1.0, 1.0, 2.0 + end + + def test_fit_power_noisy + # from www.engr.uidaho.edu/thompson/courses/ME330/lecture/least_squares.html + x = [10, 12, 15, 17, 20, 22, 25, 27, 30, 32, 35] + y = [95, 105, 125, 141, 173, 200, 253, 298, 385, 459, 602] + + # verified in numbers + assert_fit :power, x, y, 0.90, 2.6217, 1.4556 + + # income to % of households below income amount + # http://library.wolfram.com/infocenter/Conferences/6461/PowerLaws.nb + x = [15_000, 25_000, 35_000, 50_000, 75_000, 100_000] + y = [0.154, 0.283, 0.402, 0.55, 0.733, 0.843] + + # verified in numbers + assert_fit :power, x, y, 0.96, 3.119e-5, 0.8959 + end + + def assert_fit msg, x, y, fit, exp_a, exp_b + bench = Minitest::Benchmark.new :blah + + a, b, rr = bench.send "fit_#{msg}", x, y + + assert_operator rr, :>=, fit if fit + assert_in_delta exp_a, a + assert_in_delta exp_b, b + end +end + +describe "my class Bench" do + klass = self + it "should provide bench methods" do + klass.must_respond_to :bench + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_mock.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_mock.rb new file mode 100644 index 000000000000..3dfcbbdd37f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_mock.rb @@ -0,0 +1,884 @@ +require "minitest/autorun" + +class TestMinitestMock < Minitest::Test + parallelize_me! + + def setup + @mock = Minitest::Mock.new.expect(:foo, nil) + @mock.expect(:meaning_of_life, 42) + end + + def test_create_stub_method + assert_nil @mock.foo + end + + def test_allow_return_value_specification + assert_equal 42, @mock.meaning_of_life + end + + def test_blow_up_if_not_called + @mock.foo + + util_verify_bad "expected meaning_of_life() => 42" + end + + def test_not_blow_up_if_everything_called + @mock.foo + @mock.meaning_of_life + + assert_mock @mock + end + + def test_allow_expectations_to_be_added_after_creation + @mock.expect(:bar, true) + assert @mock.bar + end + + def test_not_verify_if_new_expected_method_is_not_called + @mock.foo + @mock.meaning_of_life + @mock.expect(:bar, true) + + util_verify_bad "expected bar() => true" + end + + def test_blow_up_on_wrong_number_of_arguments + @mock.foo + @mock.meaning_of_life + @mock.expect(:sum, 3, [1, 2]) + + e = assert_raises ArgumentError do + @mock.sum + end + + assert_equal "mocked method :sum expects 2 arguments, got 0", e.message + end + + def test_return_mock_does_not_raise + retval = Minitest::Mock.new + mock = Minitest::Mock.new + mock.expect(:foo, retval) + mock.foo + + assert_mock mock + end + + def test_mock_args_does_not_raise + arg = Minitest::Mock.new + mock = Minitest::Mock.new + mock.expect(:foo, nil, [arg]) + mock.foo(arg) + + assert_mock mock + end + + def test_set_expectation_on_special_methods + mock = Minitest::Mock.new + + mock.expect :object_id, "received object_id" + assert_equal "received object_id", mock.object_id + + mock.expect :respond_to_missing?, "received respond_to_missing?" + assert_equal "received respond_to_missing?", mock.respond_to_missing? + + mock.expect :===, "received ===" + assert_equal "received ===", mock.=== + + mock.expect :inspect, "received inspect" + assert_equal "received inspect", mock.inspect + + mock.expect :to_s, "received to_s" + assert_equal "received to_s", mock.to_s + + mock.expect :public_send, "received public_send" + assert_equal "received public_send", mock.public_send + + mock.expect :send, "received send" + assert_equal "received send", mock.send + + assert_mock mock + end + + def test_expectations_can_be_satisfied_via_send + @mock.send :foo + @mock.send :meaning_of_life + + assert_mock @mock + end + + def test_expectations_can_be_satisfied_via_public_send + skip "Doesn't run on 1.8" if RUBY_VERSION < "1.9" + + @mock.public_send :foo + @mock.public_send :meaning_of_life + + assert_mock @mock + end + + def test_blow_up_on_wrong_arguments + @mock.foo + @mock.meaning_of_life + @mock.expect(:sum, 3, [1, 2]) + + e = assert_raises MockExpectationError do + @mock.sum(2, 4) + end + + exp = "mocked method :sum called with unexpected arguments [2, 4]" + assert_equal exp, e.message + end + + def test_expect_with_non_array_args + e = assert_raises ArgumentError do + @mock.expect :blah, 3, false + end + + assert_equal "args must be an array", e.message + end + + def test_respond_appropriately + assert @mock.respond_to?(:foo) + assert @mock.respond_to?(:foo, true) + assert @mock.respond_to?("foo") + assert !@mock.respond_to?(:bar) + end + + def test_no_method_error_on_unexpected_methods + e = assert_raises NoMethodError do + @mock.bar + end + + expected = "unmocked method :bar, expected one of [:foo, :meaning_of_life]" + + assert_equal expected, e.message + end + + def test_assign_per_mock_return_values + a = Minitest::Mock.new + b = Minitest::Mock.new + + a.expect(:foo, :a) + b.expect(:foo, :b) + + assert_equal :a, a.foo + assert_equal :b, b.foo + end + + def test_do_not_create_stub_method_on_new_mocks + a = Minitest::Mock.new + a.expect(:foo, :a) + + assert !Minitest::Mock.new.respond_to?(:foo) + end + + def test_mock_is_a_blank_slate + @mock.expect :kind_of?, true, [String] + @mock.expect :==, true, [1] + + assert @mock.kind_of?(String), "didn't mock :kind_of\?" + assert @mock == 1, "didn't mock :==" + end + + def test_verify_allows_called_args_to_be_loosely_specified + mock = Minitest::Mock.new + mock.expect :loose_expectation, true, [Integer] + mock.loose_expectation 1 + + assert_mock mock + end + + def test_verify_raises_with_strict_args + mock = Minitest::Mock.new + mock.expect :strict_expectation, true, [2] + + e = assert_raises MockExpectationError do + mock.strict_expectation 1 + end + + exp = "mocked method :strict_expectation called with unexpected arguments [1]" + assert_equal exp, e.message + end + + def test_method_missing_empty + mock = Minitest::Mock.new + + mock.expect :a, nil + + mock.a + + e = assert_raises MockExpectationError do + mock.a + end + + assert_equal "No more expects available for :a: []", e.message + end + + def test_same_method_expects_are_verified_when_all_called + mock = Minitest::Mock.new + mock.expect :foo, nil, [:bar] + mock.expect :foo, nil, [:baz] + + mock.foo :bar + mock.foo :baz + + assert_mock mock + end + + def test_same_method_expects_blow_up_when_not_all_called + mock = Minitest::Mock.new + mock.expect :foo, nil, [:bar] + mock.expect :foo, nil, [:baz] + + mock.foo :bar + + e = assert_raises(MockExpectationError) { mock.verify } + + exp = "expected foo(:baz) => nil, got [foo(:bar) => nil]" + + assert_equal exp, e.message + end + + def test_same_method_expects_with_same_args_blow_up_when_not_all_called + mock = Minitest::Mock.new + mock.expect :foo, nil, [:bar] + mock.expect :foo, nil, [:bar] + + mock.foo :bar + + e = assert_raises(MockExpectationError) { mock.verify } + + exp = "expected foo(:bar) => nil, got [foo(:bar) => nil]" + + assert_equal exp, e.message + end + + def test_verify_passes_when_mock_block_returns_true + mock = Minitest::Mock.new + mock.expect :foo, nil do + true + end + + mock.foo + + assert_mock mock + end + + def test_mock_block_is_passed_function_params + arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" } + mock = Minitest::Mock.new + mock.expect :foo, nil do |a1, a2, a3| + a1 == arg1 && a2 == arg2 && a3 == arg3 + end + + mock.foo arg1, arg2, arg3 + + assert_mock mock + end + + def test_mock_block_is_passed_function_block + mock = Minitest::Mock.new + block = proc { "bar" } + mock.expect :foo, nil do |arg, &blk| + arg == "foo" && + blk == block + end + mock.foo "foo", &block + assert_mock mock + end + + def test_verify_fails_when_mock_block_returns_false + mock = Minitest::Mock.new + mock.expect :foo, nil do + false + end + + e = assert_raises(MockExpectationError) { mock.foo } + exp = "mocked method :foo failed block w/ []" + + assert_equal exp, e.message + end + + def test_mock_block_throws_if_args_passed + mock = Minitest::Mock.new + + e = assert_raises(ArgumentError) do + mock.expect :foo, nil, [:a, :b, :c] do + true + end + end + + exp = "args ignored when block given" + + assert_equal exp, e.message + end + + def test_mock_returns_retval_when_called_with_block + mock = Minitest::Mock.new + mock.expect(:foo, 32) do + true + end + + rs = mock.foo + + assert_equal rs, 32 + end + + def util_verify_bad exp + e = assert_raises MockExpectationError do + @mock.verify + end + + assert_equal exp, e.message + end + + def test_mock_called_via_send + mock = Minitest::Mock.new + mock.expect(:foo, true) + + mock.send :foo + assert_mock mock + end + + def test_mock_called_via___send__ + mock = Minitest::Mock.new + mock.expect(:foo, true) + + mock.__send__ :foo + assert_mock mock + end + + def test_mock_called_via_send_with_args + mock = Minitest::Mock.new + mock.expect(:foo, true, [1, 2, 3]) + + mock.send(:foo, 1, 2, 3) + assert_mock mock + end + +end + +require "minitest/metametameta" + +class TestMinitestStub < Minitest::Test + # Do not parallelize since we're calling stub on class methods + + def setup + super + Minitest::Test.reset + + @tc = Minitest::Test.new "fake tc" + @assertion_count = 1 + end + + def teardown + super + assert_equal @assertion_count, @tc.assertions if self.passed? + end + + class Time + def self.now + 24 + end + end + + def assert_stub val_or_callable + @assertion_count += 1 + + t = Time.now.to_i + + Time.stub :now, val_or_callable do + @tc.assert_equal 42, Time.now + end + + @tc.assert_operator Time.now.to_i, :>=, t + end + + def test_stub_private_module_method + @assertion_count += 1 + + t0 = Time.now + + self.stub :sleep, nil do + @tc.assert_nil sleep(10) + end + + @tc.assert_operator Time.now - t0, :<=, 1 + end + + def test_stub_private_module_method_indirect + @assertion_count += 1 + + fail_clapper = Class.new do + def fail_clap + raise + :clap + end + end.new + + fail_clapper.stub :raise, nil do |safe_clapper| + @tc.assert_equal :clap, safe_clapper.fail_clap # either form works + @tc.assert_equal :clap, fail_clapper.fail_clap # yay closures + end + end + + def test_stub_public_module_method + Math.stub :log10, :stubbed do + @tc.assert_equal :stubbed, Math.log10(1000) + end + end + + def test_stub_value + assert_stub 42 + end + + def test_stub_block + assert_stub lambda { 42 } + end + + def test_stub_block_args + @assertion_count += 1 + + t = Time.now.to_i + + Time.stub :now, lambda { |n| n * 2 } do + @tc.assert_equal 42, Time.now(21) + end + + @tc.assert_operator Time.now.to_i, :>=, t + end + + def test_stub_callable + obj = Object.new + + def obj.call + 42 + end + + assert_stub obj + end + + def test_stub_yield_self + obj = "foo" + + val = obj.stub :to_s, "bar" do |s| + s.to_s + end + + @tc.assert_equal "bar", val + end + + def test_dynamic_method + @assertion_count = 2 + + dynamic = Class.new do + def self.respond_to? meth + meth == :found + end + + def self.method_missing meth, *args, &block + if meth == :found + false + else + super + end + end + end + + val = dynamic.stub(:found, true) do |s| + s.found + end + + @tc.assert_equal true, val + @tc.assert_equal false, dynamic.found + end + + def test_stub_NameError + e = @tc.assert_raises NameError do + Time.stub :nope_nope_nope, 42 do + # do nothing + end + end + + exp = /undefined method `nope_nope_nope' for( class)? `#{self.class}::Time'/ + assert_match exp, e.message + end + + def test_mock_with_yield + mock = Minitest::Mock.new + mock.expect(:write, true) do + true + end + rs = nil + + File.stub :open, true, mock do + File.open "foo.txt", "r" do |f| + rs = f.write + end + end + @tc.assert_equal true, rs + end + + alias test_stub_value__old test_stub_value # TODO: remove/rename + + ## Permutation Sets: + + # [:value, :lambda] + # [:*, :block, :block_call] + # [:**, :block_args] + # + # Where: + # + # :value = a normal value + # :lambda = callable or lambda + # :* = no block + # :block = normal block + # :block_call = :lambda invokes the block (N/A for :value) + # :** = no args + # :args = args passed to stub + + ## Permutations + + # [:call, :*, :**] =>5 callable+block FIX: CALL BOTH (bug) + # [:call, :*, :**] =>6 callable + + # [:lambda, :*, :**] => lambda result + + # [:lambda, :*, :args] => lambda result NO ARGS + + # [:lambda, :block, :**] =>5 lambda result FIX: CALL BOTH (bug) + # [:lambda, :block, :**] =>6 lambda result + + # [:lambda, :block, :args] =>5 lambda result FIX: CALL BOTH (bug) + # [:lambda, :block, :args] =>6 lambda result + # [:lambda, :block, :args] =>7 raise ArgumentError + + # [:lambda, :block_call, :**] =>5 lambda FIX: BUG!-not passed block to lambda + # [:lambda, :block_call, :**] =>6 lambda+block result + + # [:lambda, :block_call, :args] =>5 lambda FIX: BUG!-not passed block to lambda + # [:lambda, :block_call, :args] =>6 lambda+block result + + # [:value, :*, :**] => value + + # [:value, :*, :args] => value, ignore args + + # [:value, :block, :**] =>5 value, call block + # [:value, :block, :**] =>6 value + + # [:value, :block, :args] =>5 value, call block w/ args + # [:value, :block, :args] =>6 value, call block w/ args, deprecated + # [:value, :block, :args] =>7 raise ArgumentError + + # [:value, :block_call, :**] => N/A + + # [:value, :block_call, :args] => N/A + + class Bar + def call + puts "hi" + end + end + + class Foo + def self.blocking + yield + end + end + + class Thingy + def self.identity arg + arg + end + end + + class Keywords + def self.args req, kw1:, kw2:24 + [req, kw1, kw2] + end + end + + def test_stub_callable_keyword_args + Keywords.stub :args, ->(*args, **kws) { [args, kws] } do + @tc.assert_equal [["woot"], { kw1: 42 }], Keywords.args("woot", kw1: 42) + end + end + + def test_stub_callable_block_5 # from tenderlove + @assertion_count += 1 + Foo.stub5 :blocking, Bar.new do + @tc.assert_output "hi\n", "" do + Foo.blocking do + @tc.flunk "shouldn't ever hit this" + end + end + end + end + + def test_stub_callable_block_6 # from tenderlove + skip_stub6 + + @assertion_count += 1 + Foo.stub6 :blocking, Bar.new do + @tc.assert_output "hi\n", "" do + Foo.blocking do + @tc.flunk "shouldn't ever hit this" + end + end + end + end + + def test_stub_lambda + Thread.stub :new, lambda { 21+21 } do + @tc.assert_equal 42, Thread.new + end + end + + def test_stub_lambda_args + Thread.stub :new, lambda { 21+21 }, :wtf do + @tc.assert_equal 42, Thread.new + end + end + + def test_stub_lambda_block_5 + Thread.stub5 :new, lambda { 21+21 } do + result = Thread.new do + @tc.flunk "shouldn't ever hit this" + end + @tc.assert_equal 42, result + end + end + + def test_stub_lambda_block_6 + skip_stub6 + + Thread.stub6 :new, lambda { 21+21 } do + result = Thread.new do + @tc.flunk "shouldn't ever hit this" + end + @tc.assert_equal 42, result + end + end + + def test_stub_lambda_block_args_5 + @assertion_count += 1 + Thingy.stub5 :identity, lambda { |y| @tc.assert_equal :nope, y; 21+21 }, :WTF? do + result = Thingy.identity :nope do |x| + @tc.flunk "shouldn't reach this" + end + @tc.assert_equal 42, result + end + end + + def test_stub_lambda_block_args_6 + skip_stub6 + + @assertion_count += 1 + Thingy.stub6 :identity, lambda { |y| @tc.assert_equal :nope, y; 21+21 }, :WTF? do + result = Thingy.identity :nope do |x| + @tc.flunk "shouldn't reach this" + end + @tc.assert_equal 42, result + end + end + + def test_stub_lambda_block_args_6_2 + skip_stub6 + + @tc.assert_raises ArgumentError do + Thingy.stub6_2 :identity, lambda { |y| :__not_run__ }, :WTF? do + # doesn't matter + end + end + end + + def test_stub_lambda_block_call_5 + @assertion_count += 1 + rs = nil + io = StringIO.new "", "w" + File.stub5 :open, lambda { |p, m, &blk| blk and blk.call io } do + File.open "foo.txt", "r" do |f| + rs = f && f.write("woot") + end + end + @tc.assert_equal 4, rs + @tc.assert_equal "woot", io.string + end + + def test_stub_lambda_block_call_6 + skip_stub6 + + @assertion_count += 1 + rs = nil + io = StringIO.new "", "w" + File.stub6 :open, lambda { |p, m, &blk| blk.call io } do + File.open "foo.txt", "r" do |f| + rs = f.write("woot") + end + end + @tc.assert_equal 4, rs + @tc.assert_equal "woot", io.string + end + + def test_stub_lambda_block_call_args_5 + @assertion_count += 1 + rs = nil + io = StringIO.new "", "w" + File.stub5(:open, lambda { |p, m, &blk| blk and blk.call io }, :WTF?) do + File.open "foo.txt", "r" do |f| + rs = f.write("woot") + end + end + @tc.assert_equal 4, rs + @tc.assert_equal "woot", io.string + end + + def test_stub_lambda_block_call_args_6 + skip_stub6 + + @assertion_count += 1 + rs = nil + io = StringIO.new "", "w" + File.stub6(:open, lambda { |p, m, &blk| blk.call io }, :WTF?) do + File.open "foo.txt", "r" do |f| + rs = f.write("woot") + end + end + @tc.assert_equal 4, rs + @tc.assert_equal "woot", io.string + end + + def test_stub_lambda_block_call_args_6_2 + skip_stub6 + + @assertion_count += 2 + rs = nil + io = StringIO.new "", "w" + @tc.assert_raises ArgumentError do + File.stub6_2(:open, lambda { |p, m, &blk| blk.call io }, :WTF?) do + File.open "foo.txt", "r" do |f| + rs = f.write("woot") + end + end + end + @tc.assert_nil rs + @tc.assert_equal "", io.string + end + + def test_stub_value + Thread.stub :new, 42 do + result = Thread.new + @tc.assert_equal 42, result + end + end + + def test_stub_value_args + Thread.stub :new, 42, :WTF? do + result = Thread.new + @tc.assert_equal 42, result + end + end + + def test_stub_value_block_5 + @assertion_count += 1 + Thread.stub5 :new, 42 do + result = Thread.new do + @tc.assert true + end + @tc.assert_equal 42, result + end + end + + def test_stub_value_block_6 + skip_stub6 + + Thread.stub6 :new, 42 do + result = Thread.new do + @tc.flunk "shouldn't hit this" + end + @tc.assert_equal 42, result + end + end + + def test_stub_value_block_args_5 + @assertion_count += 2 + rs = nil + io = StringIO.new "", "w" + File.stub5 :open, :value, io do + result = File.open "foo.txt", "r" do |f| + rs = f.write("woot") + end + @tc.assert_equal :value, result + end + @tc.assert_equal 4, rs + @tc.assert_equal "woot", io.string + end + + def test_stub_value_block_args_5__break_if_not_passed + e = @tc.assert_raises NoMethodError do + File.stub5 :open, :return_value do # intentionally bad setup w/ no args + File.open "foo.txt", "r" do |f| + f.write "woot" + end + end + end + exp = "undefined method `write' for nil:NilClass" + assert_equal exp, e.message + end + + def test_stub_value_block_args_6 + skip_stub6 + + @assertion_count += 2 + rs = nil + io = StringIO.new "", "w" + assert_deprecated do + File.stub6 :open, :value, io do + result = File.open "foo.txt", "r" do |f| + rs = f.write("woot") + end + @tc.assert_equal :value, result + end + end + @tc.assert_equal 4, rs + @tc.assert_equal "woot", io.string + end + + def test_stub_value_block_args_6_2 + skip_stub6 + + @assertion_count += 2 + rs = nil + io = StringIO.new "", "w" + @tc.assert_raises ArgumentError do + File.stub6_2 :open, :value, io do + result = File.open "foo.txt", "r" do |f| + @tc.flunk "shouldn't hit this" + end + @tc.assert_equal :value, result + end + end + @tc.assert_nil rs + @tc.assert_equal "", io.string + end + + def assert_deprecated re = /deprecated/ + assert_output "", re do + yield + end + end + + def skip_stub6 + skip "not yet" unless STUB6 + end +end + +STUB6 = ENV["STUB6"] + +if STUB6 then + require "minitest/mock6" if STUB6 +else + class Object + alias stub5 stub + alias stub6 stub + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_reporter.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_reporter.rb new file mode 100644 index 000000000000..6619d03d404e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_reporter.rb @@ -0,0 +1,299 @@ +require "minitest/autorun" +require "minitest/metametameta" + +class Runnable + def woot + assert true + end +end + +class TestMinitestReporter < MetaMetaMetaTestCase + + attr_accessor :r, :io + + def new_composite_reporter + reporter = Minitest::CompositeReporter.new + reporter << Minitest::SummaryReporter.new(self.io) + reporter << Minitest::ProgressReporter.new(self.io) + + def reporter.first + reporters.first + end + + def reporter.results + first.results + end + + def reporter.count + first.count + end + + def reporter.assertions + first.assertions + end + + reporter + end + + def setup + self.io = StringIO.new("") + self.r = new_composite_reporter + end + + def error_test + unless defined? @et then + @et = Minitest::Test.new(:woot) + @et.failures << Minitest::UnexpectedError.new(begin + raise "no" + rescue => e + e + end) + @et = Minitest::Result.from @et + end + @et + end + + def fail_test + unless defined? @ft then + @ft = Minitest::Test.new(:woot) + @ft.failures << begin + raise Minitest::Assertion, "boo" + rescue Minitest::Assertion => e + e + end + @ft = Minitest::Result.from @ft + end + @ft + end + + def passing_test + @pt ||= Minitest::Result.from Minitest::Test.new(:woot) + end + + def skip_test + unless defined? @st then + @st = Minitest::Test.new(:woot) + @st.failures << begin + raise Minitest::Skip + rescue Minitest::Assertion => e + e + end + @st = Minitest::Result.from @st + end + @st + end + + def test_to_s + r.record passing_test + r.record fail_test + assert_match "woot", r.first.to_s + end + + def test_passed_eh_empty + assert_predicate r, :passed? + end + + def test_passed_eh_failure + r.results << fail_test + + refute_predicate r, :passed? + end + + SKIP_MSG = "\n\nYou have skipped tests. Run with --verbose for details." + + def test_passed_eh_error + r.start + + r.results << error_test + + refute_predicate r, :passed? + + r.report + + refute_match SKIP_MSG, io.string + end + + def test_passed_eh_skipped + r.start + r.results << skip_test + assert r.passed? + + restore_env do + r.report + end + + assert_match SKIP_MSG, io.string + end + + def test_passed_eh_skipped_verbose + r.first.options[:verbose] = true + + r.start + r.results << skip_test + assert r.passed? + r.report + + refute_match SKIP_MSG, io.string + end + + def test_start + r.start + + exp = "Run options: \n\n# Running:\n\n" + + assert_equal exp, io.string + end + + def test_record_pass + r.record passing_test + + assert_equal ".", io.string + assert_empty r.results + assert_equal 1, r.count + assert_equal 0, r.assertions + end + + def test_record_fail + fail_test = self.fail_test + r.record fail_test + + assert_equal "F", io.string + assert_equal [fail_test], r.results + assert_equal 1, r.count + assert_equal 0, r.assertions + end + + def test_record_error + error_test = self.error_test + r.record error_test + + assert_equal "E", io.string + assert_equal [error_test], r.results + assert_equal 1, r.count + assert_equal 0, r.assertions + end + + def test_record_skip + skip_test = self.skip_test + r.record skip_test + + assert_equal "S", io.string + assert_equal [skip_test], r.results + assert_equal 1, r.count + assert_equal 0, r.assertions + end + + def test_report_empty + r.start + r.report + + exp = clean <<-EOM + Run options: + + # Running: + + + + Finished in 0.00 + + 0 runs, 0 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_equal exp, normalize_output(io.string) + end + + def test_report_passing + r.start + r.record passing_test + r.report + + exp = clean <<-EOM + Run options: + + # Running: + + . + + Finished in 0.00 + + 1 runs, 0 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_equal exp, normalize_output(io.string) + end + + def test_report_failure + r.start + r.record fail_test + r.report + + exp = clean <<-EOM + Run options: + + # Running: + + F + + Finished in 0.00 + + 1) Failure: + Minitest::Test#woot [FILE:LINE]: + boo + + 1 runs, 0 assertions, 1 failures, 0 errors, 0 skips + EOM + + assert_equal exp, normalize_output(io.string) + end + + def test_report_error + r.start + r.record error_test + r.report + + exp = clean <<-EOM + Run options: + + # Running: + + E + + Finished in 0.00 + + 1) Error: + Minitest::Test#woot: + RuntimeError: no + FILE:LINE:in `error_test' + FILE:LINE:in `test_report_error' + + 1 runs, 0 assertions, 0 failures, 1 errors, 0 skips + EOM + + assert_equal exp, normalize_output(io.string) + end + + def test_report_skipped + r.start + r.record skip_test + + restore_env do + r.report + end + + exp = clean <<-EOM + Run options: + + # Running: + + S + + Finished in 0.00 + + 1 runs, 0 assertions, 0 failures, 0 errors, 1 skips + + You have skipped tests. Run with --verbose for details. + EOM + + assert_equal exp, normalize_output(io.string) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_spec.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_spec.rb new file mode 100644 index 000000000000..fe4710d940e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_spec.rb @@ -0,0 +1,1061 @@ +# encoding: utf-8 +require "minitest/metametameta" +require "stringio" + +class MiniSpecA < Minitest::Spec; end +class MiniSpecB < Minitest::Test; extend Minitest::Spec::DSL; end +class MiniSpecC < MiniSpecB; end +class NamedExampleA < MiniSpecA; end +class NamedExampleB < MiniSpecB; end +class NamedExampleC < MiniSpecC; end +class ExampleA; end +class ExampleB < ExampleA; end + +describe Minitest::Spec do + # helps to deal with 2.4 deprecation of Fixnum for Integer + Int = 1.class + + # do not parallelize this suite... it just can"t handle it. + + def assert_triggered expected = "blah", klass = Minitest::Assertion + @assertion_count += 1 + + e = assert_raises(klass) do + yield + end + + msg = e.message.sub(/(---Backtrace---).*/m, '\1') + msg.gsub!(/\(oid=[-0-9]+\)/, "(oid=N)") + msg.gsub!(/(\d\.\d{6})\d+/, '\1xxx') # normalize: ruby version, impl, platform + msg.gsub!(/:0x[Xa-fA-F0-9]{4,}[ @].+?>/, ":0xXXXXXX@PATH>") + + if expected + @assertion_count += 1 + case expected + when String then + assert_equal expected, msg + when Regexp then + @assertion_count += 1 + assert_match expected, msg + else + flunk "Unknown: #{expected.inspect}" + end + end + end + + def assert_success spec + assert_equal true, spec + end + + before do + @assertion_count = 4 + end + + after do + _(self.assertions).must_equal @assertion_count if passed? and not skipped? + end + + it "needs to be able to catch a Minitest::Assertion exception" do + @assertion_count = 1 + + assert_triggered "Expected 1 to not be equal to 1." do + _(1).wont_equal 1 + end + end + + it "needs to check for file existence" do + @assertion_count = 3 + + assert_success _(__FILE__).path_must_exist + + assert_triggered "Expected path 'blah' to exist." do + _("blah").path_must_exist + end + end + + it "needs to check for file non-existence" do + @assertion_count = 3 + + assert_success _("blah").path_wont_exist + + assert_triggered "Expected path '#{__FILE__}' to not exist." do + _(__FILE__).path_wont_exist + end + end + + it "needs to be sensible about must_include order" do + @assertion_count += 3 # must_include is 2 assertions + + assert_success _([1, 2, 3]).must_include(2) + + assert_triggered "Expected [1, 2, 3] to include 5." do + _([1, 2, 3]).must_include 5 + end + + assert_triggered "msg.\nExpected [1, 2, 3] to include 5." do + _([1, 2, 3]).must_include 5, "msg" + end + end + + it "needs to be sensible about wont_include order" do + @assertion_count += 3 # wont_include is 2 assertions + + assert_success _([1, 2, 3]).wont_include(5) + + assert_triggered "Expected [1, 2, 3] to not include 2." do + _([1, 2, 3]).wont_include 2 + end + + assert_triggered "msg.\nExpected [1, 2, 3] to not include 2." do + _([1, 2, 3]).wont_include 2, "msg" + end + end + + it "needs to catch an expected exception" do + @assertion_count = 2 + + expect { raise "blah" }.must_raise RuntimeError + expect { raise Minitest::Assertion }.must_raise Minitest::Assertion + end + + it "needs to catch an unexpected exception" do + @assertion_count -= 2 # no positive + + msg = <<-EOM.gsub(/^ {6}/, "").chomp + [RuntimeError] exception expected, not + Class: <StandardError> + Message: <"woot"> + ---Backtrace--- + EOM + + assert_triggered msg do + expect { raise StandardError, "woot" }.must_raise RuntimeError + end + + assert_triggered "msg.\n#{msg}" do + expect { raise StandardError, "woot" }.must_raise RuntimeError, "msg" + end + end + + it "needs to ensure silence" do + @assertion_count -= 1 # no msg + @assertion_count += 2 # assert_output is 2 assertions + + assert_success expect {}.must_be_silent + + assert_triggered "In stdout.\nExpected: \"\"\n Actual: \"xxx\"" do + expect { print "xxx" }.must_be_silent + end + end + + it "needs to have all methods named well" do + skip "N/A" if ENV["MT_NO_EXPECTATIONS"] + + @assertion_count = 2 + + methods = Minitest::Expectations.public_instance_methods.grep(/must|wont/) + methods.map!(&:to_s) if Symbol === methods.first + + musts, wonts = methods.sort.partition { |m| m =~ /must/ } + + expected_musts = %w[must_be + must_be_close_to + must_be_empty + must_be_instance_of + must_be_kind_of + must_be_nil + must_be_same_as + must_be_silent + must_be_within_delta + must_be_within_epsilon + must_equal + must_include + must_match + must_output + must_raise + must_respond_to + must_throw + path_must_exist] + + bad = %w[not raise throw send output be_silent] + + expected_wonts = expected_musts.map { |m| m.sub(/must/, "wont") }.sort + expected_wonts.reject! { |m| m =~ /wont_#{Regexp.union(*bad)}/ } + + _(musts).must_equal expected_musts + _(wonts).must_equal expected_wonts + end + + it "needs to raise if an expected exception is not raised" do + @assertion_count -= 2 # no positive test + + assert_triggered "RuntimeError expected but nothing was raised." do + expect { 42 }.must_raise RuntimeError + end + + assert_triggered "msg.\nRuntimeError expected but nothing was raised." do + expect { 42 }.must_raise RuntimeError, "msg" + end + end + + it "needs to verify binary messages" do + assert_success _(42).wont_be(:<, 24) + + assert_triggered "Expected 24 to not be < 42." do + _(24).wont_be :<, 42 + end + + assert_triggered "msg.\nExpected 24 to not be < 42." do + _(24).wont_be :<, 42, "msg" + end + end + + it "needs to verify emptyness" do + @assertion_count += 3 # empty is 2 assertions + + assert_success _([]).must_be_empty + + assert_triggered "Expected [42] to be empty." do + _([42]).must_be_empty + end + + assert_triggered "msg.\nExpected [42] to be empty." do + _([42]).must_be_empty "msg" + end + end + + it "needs to verify equality" do + @assertion_count += 1 + + assert_success _(6 * 7).must_equal(42) + + assert_triggered "Expected: 42\n Actual: 54" do + _(6 * 9).must_equal 42 + end + + assert_triggered "msg.\nExpected: 42\n Actual: 54" do + _(6 * 9).must_equal 42, "msg" + end + + assert_triggered(/^-42\n\+#<Proc:0xXXXXXX[ @]PATH>\n/) do + _(proc { 42 }).must_equal 42 # proc isn't called, so expectation fails + end + end + + it "needs to warn on equality with nil" do + @assertion_count += 1 # extra test + + out, err = capture_io do + assert_success _(nil).must_equal(nil) + end + + exp = "DEPRECATED: Use assert_nil if expecting nil from #{__FILE__}:#{__LINE__-3}. " \ + "This will fail in Minitest 6.\n" + exp = "" if $-w.nil? + + assert_empty out + assert_equal exp, err + end + + it "needs to verify floats outside a delta" do + @assertion_count += 1 # extra test + + assert_success _(24).wont_be_close_to(42) + + assert_triggered "Expected |42 - 42.0| (0.0) to not be <= 0.001." do + _(6 * 7.0).wont_be_close_to 42 + end + + x = "1.0e-05" + assert_triggered "Expected |42 - 42.0| (0.0) to not be <= #{x}." do + _(6 * 7.0).wont_be_close_to 42, 0.00001 + end + + assert_triggered "msg.\nExpected |42 - 42.0| (0.0) to not be <= #{x}." do + _(6 * 7.0).wont_be_close_to 42, 0.00001, "msg" + end + end + + it "needs to verify floats outside an epsilon" do + @assertion_count += 1 # extra test + + assert_success _(24).wont_be_within_epsilon(42) + + x = "0.042" + assert_triggered "Expected |42 - 42.0| (0.0) to not be <= #{x}." do + _(6 * 7.0).wont_be_within_epsilon 42 + end + + x = "0.00042" + assert_triggered "Expected |42 - 42.0| (0.0) to not be <= #{x}." do + _(6 * 7.0).wont_be_within_epsilon 42, 0.00001 + end + + assert_triggered "msg.\nExpected |42 - 42.0| (0.0) to not be <= #{x}." do + _(6 * 7.0).wont_be_within_epsilon 42, 0.00001, "msg" + end + end + + it "needs to verify floats within a delta" do + @assertion_count += 1 # extra test + + assert_success _(6.0 * 7).must_be_close_to(42.0) + + assert_triggered "Expected |0.0 - 0.01| (0.01) to be <= 0.001." do + _(1.0 / 100).must_be_close_to 0.0 + end + + x = "1.0e-06" + assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= #{x}." do + _(1.0 / 1000).must_be_close_to 0.0, 0.000001 + end + + assert_triggered "msg.\nExpected |0.0 - 0.001| (0.001) to be <= #{x}." do + _(1.0 / 1000).must_be_close_to 0.0, 0.000001, "msg" + end + end + + it "needs to verify floats within an epsilon" do + @assertion_count += 1 # extra test + + assert_success _(6.0 * 7).must_be_within_epsilon(42.0) + + assert_triggered "Expected |0.0 - 0.01| (0.01) to be <= 0.0." do + _(1.0 / 100).must_be_within_epsilon 0.0 + end + + assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= 0.0." do + _(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001 + end + + assert_triggered "msg.\nExpected |0.0 - 0.001| (0.001) to be <= 0.0." do + _(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001, "msg" + end + end + + it "needs to verify identity" do + assert_success _(1).must_be_same_as(1) + + assert_triggered "Expected 1 (oid=N) to be the same as 2 (oid=N)." do + _(1).must_be_same_as 2 + end + + assert_triggered "msg.\nExpected 1 (oid=N) to be the same as 2 (oid=N)." do + _(1).must_be_same_as 2, "msg" + end + end + + it "needs to verify inequality" do + @assertion_count += 2 + assert_success _(42).wont_equal(6 * 9) + assert_success _(proc {}).wont_equal(42) + + assert_triggered "Expected 1 to not be equal to 1." do + _(1).wont_equal 1 + end + + assert_triggered "msg.\nExpected 1 to not be equal to 1." do + _(1).wont_equal 1, "msg" + end + end + + it "needs to verify instances of a class" do + assert_success _(42).wont_be_instance_of(String) + + assert_triggered "Expected 42 to not be a kind of #{Int.name}." do + _(42).wont_be_kind_of Int + end + + assert_triggered "msg.\nExpected 42 to not be an instance of #{Int.name}." do + _(42).wont_be_instance_of Int, "msg" + end + end + + it "needs to verify kinds of a class" do + @assertion_count += 2 + + assert_success _(42).wont_be_kind_of(String) + assert_success _(proc {}).wont_be_kind_of(String) + + assert_triggered "Expected 42 to not be a kind of #{Int.name}." do + _(42).wont_be_kind_of Int + end + + assert_triggered "msg.\nExpected 42 to not be a kind of #{Int.name}." do + _(42).wont_be_kind_of Int, "msg" + end + end + + it "needs to verify kinds of objects" do + @assertion_count += 3 # extra test + + assert_success _(6 * 7).must_be_kind_of(Int) + assert_success _(6 * 7).must_be_kind_of(Numeric) + + assert_triggered "Expected 42 to be a kind of String, not #{Int.name}." do + _(6 * 7).must_be_kind_of String + end + + assert_triggered "msg.\nExpected 42 to be a kind of String, not #{Int.name}." do + _(6 * 7).must_be_kind_of String, "msg" + end + + exp = "Expected #<Proc:0xXXXXXX@PATH> to be a kind of String, not Proc." + assert_triggered exp do + _(proc {}).must_be_kind_of String + end + end + + it "needs to verify mismatch" do + @assertion_count += 3 # match is 2 + + assert_success _("blah").wont_match(/\d+/) + + assert_triggered "Expected /\\w+/ to not match \"blah\"." do + _("blah").wont_match(/\w+/) + end + + assert_triggered "msg.\nExpected /\\w+/ to not match \"blah\"." do + _("blah").wont_match(/\w+/, "msg") + end + end + + it "needs to verify nil" do + assert_success _(nil).must_be_nil + + assert_triggered "Expected 42 to be nil." do + _(42).must_be_nil + end + + assert_triggered "msg.\nExpected 42 to be nil." do + _(42).must_be_nil "msg" + end + end + + it "needs to verify non-emptyness" do + @assertion_count += 3 # empty is 2 assertions + + assert_success _(["some item"]).wont_be_empty + + assert_triggered "Expected [] to not be empty." do + _([]).wont_be_empty + end + + assert_triggered "msg.\nExpected [] to not be empty." do + _([]).wont_be_empty "msg" + end + end + + it "needs to verify non-identity" do + assert_success _(1).wont_be_same_as(2) + + assert_triggered "Expected 1 (oid=N) to not be the same as 1 (oid=N)." do + _(1).wont_be_same_as 1 + end + + assert_triggered "msg.\nExpected 1 (oid=N) to not be the same as 1 (oid=N)." do + _(1).wont_be_same_as 1, "msg" + end + end + + it "needs to verify non-nil" do + assert_success _(42).wont_be_nil + + assert_triggered "Expected nil to not be nil." do + _(nil).wont_be_nil + end + + assert_triggered "msg.\nExpected nil to not be nil." do + _(nil).wont_be_nil "msg" + end + end + + it "needs to verify objects not responding to a message" do + assert_success _("").wont_respond_to(:woot!) + + assert_triggered "Expected \"\" to not respond to to_s." do + _("").wont_respond_to :to_s + end + + assert_triggered "msg.\nExpected \"\" to not respond to to_s." do + _("").wont_respond_to :to_s, "msg" + end + end + + it "needs to verify output in stderr" do + @assertion_count -= 1 # no msg + + assert_success expect { $stderr.print "blah" }.must_output(nil, "blah") + + assert_triggered "In stderr.\nExpected: \"blah\"\n Actual: \"xxx\"" do + expect { $stderr.print "xxx" }.must_output(nil, "blah") + end + end + + it "needs to verify output in stdout" do + @assertion_count -= 1 # no msg + + assert_success expect { print "blah" }.must_output("blah") + + assert_triggered "In stdout.\nExpected: \"blah\"\n Actual: \"xxx\"" do + expect { print "xxx" }.must_output("blah") + end + end + + it "needs to verify regexp matches" do + @assertion_count += 3 # must_match is 2 assertions + + assert_success _("blah").must_match(/\w+/) + + assert_triggered "Expected /\\d+/ to match \"blah\"." do + _("blah").must_match(/\d+/) + end + + assert_triggered "msg.\nExpected /\\d+/ to match \"blah\"." do + _("blah").must_match(/\d+/, "msg") + end + end + + describe "expect" do + before do + @assertion_count -= 3 + end + + it "can use expect" do + _(1 + 1).must_equal 2 + end + + it "can use expect with a lambda" do + _ { raise "blah" }.must_raise RuntimeError + end + + it "can use expect in a thread" do + Thread.new { _(1 + 1).must_equal 2 }.join + end + + it "can NOT use must_equal in a thread. It must use expect in a thread" do + skip "N/A" if ENV["MT_NO_EXPECTATIONS"] + assert_raises RuntimeError do + capture_io do + Thread.new { (1 + 1).must_equal 2 }.join + end + end + end + + it "fails gracefully when expectation used outside of `it`" do + skip "N/A" if ENV["MT_NO_EXPECTATIONS"] + + @assertion_count += 1 + + e = assert_raises RuntimeError do + capture_io do + Thread.new { # forces ctx to be nil + describe("woot") do + (1 + 1).must_equal 2 + end + }.join + end + end + + assert_equal "Calling #must_equal outside of test.", e.message + end + + it "deprecates expectation used without _" do + skip "N/A" if ENV["MT_NO_EXPECTATIONS"] + + @assertion_count += 3 + + exp = /DEPRECATED: global use of must_equal from/ + + assert_output "", exp do + (1 + 1).must_equal 2 + end + end + + # https://github.com/seattlerb/minitest/issues/837 + # https://github.com/rails/rails/pull/39304 + it "deprecates expectation used without _ with empty backtrace_filter" do + skip "N/A" if ENV["MT_NO_EXPECTATIONS"] + + @assertion_count += 3 + + exp = /DEPRECATED: global use of must_equal from/ + + with_empty_backtrace_filter do + assert_output "", exp do + (1 + 1).must_equal 2 + end + end + end + end + + it "needs to verify throw" do + @assertion_count += 2 # 2 extra tests + + assert_success expect { throw :blah }.must_throw(:blah) + + assert_triggered "Expected :blah to have been thrown." do + expect {}.must_throw :blah + end + + assert_triggered "Expected :blah to have been thrown, not :xxx." do + expect { throw :xxx }.must_throw :blah + end + + assert_triggered "msg.\nExpected :blah to have been thrown." do + expect {}.must_throw :blah, "msg" + end + + assert_triggered "msg.\nExpected :blah to have been thrown, not :xxx." do + expect { throw :xxx }.must_throw :blah, "msg" + end + end + + it "needs to verify types of objects" do + assert_success _(6 * 7).must_be_instance_of(Int) + + exp = "Expected 42 to be an instance of String, not #{Int.name}." + + assert_triggered exp do + _(6 * 7).must_be_instance_of String + end + + assert_triggered "msg.\n#{exp}" do + _(6 * 7).must_be_instance_of String, "msg" + end + end + + it "needs to verify using any (negative) predicate" do + @assertion_count -= 1 # doesn"t take a message + + assert_success _("blah").wont_be(:empty?) + + assert_triggered "Expected \"\" to not be empty?." do + _("").wont_be :empty? + end + end + + it "needs to verify using any binary operator" do + @assertion_count -= 1 # no msg + + assert_success _(41).must_be(:<, 42) + + assert_triggered "Expected 42 to be < 41." do + _(42).must_be(:<, 41) + end + end + + it "needs to verify using any predicate" do + @assertion_count -= 1 # no msg + + assert_success _("").must_be(:empty?) + + assert_triggered "Expected \"blah\" to be empty?." do + _("blah").must_be :empty? + end + end + + it "needs to verify using respond_to" do + assert_success _(42).must_respond_to(:+) + + assert_triggered "Expected 42 (#{Int.name}) to respond to #clear." do + _(42).must_respond_to :clear + end + + assert_triggered "msg.\nExpected 42 (#{Int.name}) to respond to #clear." do + _(42).must_respond_to :clear, "msg" + end + end +end + +describe Minitest::Spec, :let do + i_suck_and_my_tests_are_order_dependent! + + def _count + $let_count ||= 0 + end + + let :count do + $let_count += 1 + $let_count + end + + it "is evaluated once per example" do + _(_count).must_equal 0 + + _(count).must_equal 1 + _(count).must_equal 1 + + _(_count).must_equal 1 + end + + it "is REALLY evaluated once per example" do + _(_count).must_equal 1 + + _(count).must_equal 2 + _(count).must_equal 2 + + _(_count).must_equal 2 + end + + it 'raises an error if the name begins with "test"' do + expect { self.class.let(:test_value) { true } }.must_raise ArgumentError + end + + it "raises an error if the name shadows a normal instance method" do + expect { self.class.let(:message) { true } }.must_raise ArgumentError + end + + it "doesn't raise an error if it is just another let" do + v = proc do + describe :outer do + let(:bar) + describe :inner do + let(:bar) + end + end + :good + end.call + _(v).must_equal :good + end + + it "procs come after dont_flip" do + p = proc {} + assert_respond_to p, :call + _(p).must_respond_to :call + end +end + +describe Minitest::Spec, :subject do + attr_reader :subject_evaluation_count + + subject do + @subject_evaluation_count ||= 0 + @subject_evaluation_count += 1 + @subject_evaluation_count + end + + it "is evaluated once per example" do + _(subject).must_equal 1 + _(subject).must_equal 1 + _(subject_evaluation_count).must_equal 1 + end +end + +class TestMetaStatic < Minitest::Test + def test_children + Minitest::Spec.children.clear # prevents parallel run + + y = z = nil + x = describe "top-level thingy" do + y = describe "first thingy" do end + + it "top-level-it" do end + + z = describe "second thingy" do end + end + + assert_equal [x], Minitest::Spec.children + assert_equal [y, z], x.children + assert_equal [], y.children + assert_equal [], z.children + end + + def test_it_wont_remove_existing_child_test_methods + Minitest::Spec.children.clear # prevents parallel run + + inner = nil + outer = describe "outer" do + inner = describe "inner" do + it do + assert true + end + end + it do + assert true + end + end + + assert_equal 1, outer.public_instance_methods.grep(/^test_/).count + assert_equal 1, inner.public_instance_methods.grep(/^test_/).count + end + + def test_it_wont_add_test_methods_to_children + Minitest::Spec.children.clear # prevents parallel run + + inner = nil + outer = describe "outer" do + inner = describe "inner" do end + it do + assert true + end + end + + assert_equal 1, outer.public_instance_methods.grep(/^test_/).count + assert_equal 0, inner.public_instance_methods.grep(/^test_/).count + end +end + +class TestMeta < MetaMetaMetaTestCase + # do not call parallelize_me! here because specs use register_spec_type globally + + def util_structure + y = z = nil + before_list = [] + after_list = [] + x = describe "top-level thingy" do + before { before_list << 1 } + after { after_list << 1 } + + it "top-level-it" do end + + y = describe "inner thingy" do + before { before_list << 2 } + after { after_list << 2 } + it "inner-it" do end + + z = describe "very inner thingy" do + before { before_list << 3 } + after { after_list << 3 } + it "inner-it" do end + + it { } # ignore me + specify { } # anonymous it + end + end + end + + return x, y, z, before_list, after_list + end + + def test_register_spec_type + original_types = Minitest::Spec::TYPES.dup + + assert_includes Minitest::Spec::TYPES, [//, Minitest::Spec] + + Minitest::Spec.register_spec_type(/woot/, TestMeta) + + p = lambda do |_| true end + Minitest::Spec.register_spec_type TestMeta, &p + + keys = Minitest::Spec::TYPES.map(&:first) + + assert_includes keys, /woot/ + assert_includes keys, p + ensure + Minitest::Spec::TYPES.replace original_types + end + + def test_spec_type + original_types = Minitest::Spec::TYPES.dup + + Minitest::Spec.register_spec_type(/A$/, MiniSpecA) + Minitest::Spec.register_spec_type MiniSpecB do |desc| + desc.superclass == ExampleA + end + Minitest::Spec.register_spec_type MiniSpecC do |_desc, *addl| + addl.include? :woot + end + + assert_equal MiniSpecA, Minitest::Spec.spec_type(ExampleA) + assert_equal MiniSpecB, Minitest::Spec.spec_type(ExampleB) + assert_equal MiniSpecC, Minitest::Spec.spec_type(ExampleB, :woot) + ensure + Minitest::Spec::TYPES.replace original_types + end + + def test_bug_dsl_expectations + spec_class = Class.new MiniSpecB do + it "should work" do + _(0).must_equal 0 + end + end + + test_name = spec_class.instance_methods.sort.grep(/test/).first + + spec = spec_class.new test_name + + result = spec.run + + assert spec.passed? + assert result.passed? + assert_equal 1, result.assertions + end + + def test_name + spec_a = describe ExampleA do; end + spec_b = describe ExampleB, :random_method do; end + spec_c = describe ExampleB, :random_method, :addl_context do; end + + assert_equal "ExampleA", spec_a.name + assert_equal "ExampleB::random_method", spec_b.name + assert_equal "ExampleB::random_method::addl_context", spec_c.name + end + + def test_name2 + assert_equal "NamedExampleA", NamedExampleA.name + assert_equal "NamedExampleB", NamedExampleB.name + assert_equal "NamedExampleC", NamedExampleC.name + + spec_a = describe ExampleA do; end + spec_b = describe ExampleB, :random_method do; end + + assert_equal "ExampleA", spec_a.name + assert_equal "ExampleB::random_method", spec_b.name + end + + def test_structure + x, y, z, * = util_structure + + assert_equal "top-level thingy", x.to_s + assert_equal "top-level thingy::inner thingy", y.to_s + assert_equal "top-level thingy::inner thingy::very inner thingy", z.to_s + + assert_equal "top-level thingy", x.desc + assert_equal "inner thingy", y.desc + assert_equal "very inner thingy", z.desc + + top_methods = %w[setup teardown test_0001_top-level-it] + inner_methods1 = %w[setup teardown test_0001_inner-it] + inner_methods2 = inner_methods1 + + %w[test_0002_anonymous test_0003_anonymous] + + assert_equal top_methods, x.instance_methods(false).sort.map(&:to_s) + assert_equal inner_methods1, y.instance_methods(false).sort.map(&:to_s) + assert_equal inner_methods2, z.instance_methods(false).sort.map(&:to_s) + end + + def test_structure_postfix_it + z = nil + y = describe "outer" do + # NOT here, below the inner-describe! + # it "inner-it" do end + + z = describe "inner" do + it "inner-it" do end + end + + # defined AFTER inner describe means we'll try to wipe out the inner-it + it "inner-it" do end + end + + assert_equal %w[test_0001_inner-it], y.instance_methods(false).map(&:to_s) + assert_equal %w[test_0001_inner-it], z.instance_methods(false).map(&:to_s) + end + + def test_setup_teardown_behavior + _, _, z, before_list, after_list = util_structure + + @tu = z + + run_tu_with_fresh_reporter + + size = z.runnable_methods.size + assert_equal [1, 2, 3] * size, before_list + assert_equal [3, 2, 1] * size, after_list + end + + def test_describe_first_structure + x1 = x2 = y = z = nil + x = describe "top-level thingy" do + y = describe "first thingy" do end + + x1 = it "top level it" do end + x2 = it "не латинские &いった α, β, γ, δ, ε hello!!! world" do end + + z = describe "second thingy" do end + end + + test_methods = ["test_0001_top level it", + "test_0002_не латинские &いった α, β, γ, δ, ε hello!!! world", + ].sort + + assert_equal test_methods, [x1, x2] + assert_equal test_methods, x.instance_methods.grep(/^test/).map(&:to_s).sort + assert_equal [], y.instance_methods.grep(/^test/) + assert_equal [], z.instance_methods.grep(/^test/) + end + + def test_structure_subclasses + z = nil + x = Class.new Minitest::Spec do + def xyz; end + end + y = Class.new x do + z = describe("inner") { } + end + + assert_respond_to x.new(nil), "xyz" + assert_respond_to y.new(nil), "xyz" + assert_respond_to z.new(nil), "xyz" + end +end + +class TestSpecInTestCase < MetaMetaMetaTestCase + def setup + super + + Thread.current[:current_spec] = self + @tc = self + @assertion_count = 2 + end + + def assert_triggered expected, klass = Minitest::Assertion + @assertion_count += 1 + + e = assert_raises klass do + yield + end + + msg = e.message.sub(/(---Backtrace---).*/m, "\1") + msg.gsub!(/\(oid=[-0-9]+\)/, "(oid=N)") + + assert_equal expected, msg + end + + def teardown + msg = "expected #{@assertion_count} assertions, not #{@tc.assertions}" + assert_equal @assertion_count, @tc.assertions, msg + end + + def test_expectation + @tc.assert_equal true, _(1).must_equal(1) + end + + def test_expectation_triggered + assert_triggered "Expected: 2\n Actual: 1" do + _(1).must_equal 2 + end + end + + include Minitest::Spec::DSL::InstanceMethods + + def test_expectation_with_a_message + assert_triggered "woot.\nExpected: 2\n Actual: 1" do + _(1).must_equal 2, "woot" + end + end +end + +class ValueMonadTest < Minitest::Test + attr_accessor :struct + + def setup + @struct = { :_ => "a", :value => "b", :expect => "c" } + def @struct.method_missing k # think openstruct + self[k] + end + end + + def test_value_monad_method + assert_equal "a", struct._ + end + + def test_value_monad_value_alias + assert_equal "b", struct.value + end + + def test_value_monad_expect_alias + assert_equal "c", struct.expect + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_test.rb b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_test.rb new file mode 100644 index 000000000000..89ba8125c06b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/minitest-5.14.4/test/minitest/test_minitest_test.rb @@ -0,0 +1,1084 @@ +# encoding: UTF-8 + +require "pathname" +require "minitest/metametameta" + +if defined? Encoding then + e = Encoding.default_external + if e != Encoding::UTF_8 then + warn "" + warn "" + warn "NOTE: External encoding #{e} is not UTF-8. Tests WILL fail." + warn " Run tests with `RUBYOPT=-Eutf-8 rake` to avoid errors." + warn "" + warn "" + end +end + +class Minitest::Runnable + def whatever # faked for testing + assert true + end +end + +class TestMinitestUnit < MetaMetaMetaTestCase + parallelize_me! + + pwd = Pathname.new File.expand_path Dir.pwd + basedir = Pathname.new(File.expand_path "lib/minitest") + "mini" + basedir = basedir.relative_path_from(pwd).to_s + MINITEST_BASE_DIR = basedir[/\A\./] ? basedir : "./#{basedir}" + BT_MIDDLE = ["#{MINITEST_BASE_DIR}/test.rb:161:in `each'", + "#{MINITEST_BASE_DIR}/test.rb:158:in `each'", + "#{MINITEST_BASE_DIR}/test.rb:139:in `run'", + "#{MINITEST_BASE_DIR}/test.rb:106:in `run'"] + + def test_filter_backtrace + # this is a semi-lame mix of relative paths. + # I cheated by making the autotest parts not have ./ + bt = (["lib/autotest.rb:571:in `add_exception'", + "test/test_autotest.rb:62:in `test_add_exception'", + "#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] + + BT_MIDDLE + + ["#{MINITEST_BASE_DIR}/test.rb:29", + "test/test_autotest.rb:422"]) + bt = util_expand_bt bt + + ex = ["lib/autotest.rb:571:in `add_exception'", + "test/test_autotest.rb:62:in `test_add_exception'"] + ex = util_expand_bt ex + + fu = Minitest.filter_backtrace(bt) + + assert_equal ex, fu + end + + def test_filter_backtrace_all_unit + bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] + + BT_MIDDLE + + ["#{MINITEST_BASE_DIR}/test.rb:29"]) + ex = bt.clone + fu = Minitest.filter_backtrace(bt) + assert_equal ex, fu + end + + def test_filter_backtrace_unit_starts + bt = (["#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] + + BT_MIDDLE + + ["#{MINITEST_BASE_DIR}/mini/test.rb:29", + "-e:1"]) + + bt = util_expand_bt bt + + ex = ["-e:1"] + fu = Minitest.filter_backtrace bt + assert_equal ex, fu + end + + def test_filter_backtrace__empty + with_empty_backtrace_filter do + bt = %w[first second third] + fu = Minitest.filter_backtrace bt.dup + assert_equal bt, fu + end + end + + def test_infectious_binary_encoding + @tu = Class.new FakeNamedTest do + def test_this_is_not_ascii_assertion + assert_equal "ЁЁЁ", "ёёё" + end + + def test_this_is_non_ascii_failure_message + fail 'ЁЁЁ'.force_encoding('ASCII-8BIT') + end + end + + expected = clean <<-EOM + EF + + Finished in 0.00 + + 1) Error: + FakeNamedTestXX#test_this_is_non_ascii_failure_message: + RuntimeError: ЁЁЁ + FILE:LINE:in `test_this_is_non_ascii_failure_message' + + 2) Failure: + FakeNamedTestXX#test_this_is_not_ascii_assertion [FILE:LINE]: + Expected: \"ЁЁЁ\" + Actual: \"ёёё\" + + 2 runs, 1 assertions, 1 failures, 1 errors, 0 skips + EOM + + assert_report expected + end + + def test_passed_eh_teardown_good + test_class = Class.new FakeNamedTest do + def teardown; assert true; end + def test_omg; assert true; end + end + + test = test_class.new :test_omg + test.run + + refute_predicate test, :error? + assert_predicate test, :passed? + refute_predicate test, :skipped? + end + + def test_passed_eh_teardown_skipped + test_class = Class.new FakeNamedTest do + def teardown; assert true; end + def test_omg; skip "bork"; end + end + + test = test_class.new :test_omg + test.run + + refute_predicate test, :error? + refute_predicate test, :passed? + assert_predicate test, :skipped? + end + + def test_passed_eh_teardown_flunked + test_class = Class.new FakeNamedTest do + def teardown; flunk; end + def test_omg; assert true; end + end + + test = test_class.new :test_omg + test.run + + refute_predicate test, :error? + refute_predicate test, :passed? + refute_predicate test, :skipped? + end + + def util_expand_bt bt + if RUBY_VERSION >= "1.9.0" then + bt.map { |f| (f =~ /^\./) ? File.expand_path(f) : f } + else + bt + end + end +end + +class TestMinitestUnitInherited < MetaMetaMetaTestCase + def with_overridden_include + Class.class_eval do + def inherited_with_hacks _klass + throw :inherited_hook + end + + alias inherited_without_hacks inherited + alias inherited inherited_with_hacks + alias IGNORE_ME! inherited # 1.8 bug. god I love venture bros + end + + yield + ensure + Class.class_eval do + alias inherited inherited_without_hacks + + undef_method :inherited_with_hacks + undef_method :inherited_without_hacks + end + + refute_respond_to Class, :inherited_with_hacks + refute_respond_to Class, :inherited_without_hacks + end + + def test_inherited_hook_plays_nice_with_others + with_overridden_include do + assert_throws :inherited_hook do + Class.new FakeNamedTest + end + end + end +end + +class TestMinitestRunner < MetaMetaMetaTestCase + # do not parallelize this suite... it just can't handle it. + + def test_class_runnables + @assertion_count = 0 + + tc = Class.new(Minitest::Test) + + assert_equal 1, Minitest::Test.runnables.size + assert_equal [tc], Minitest::Test.runnables + end + + def test_run_test + @tu = + Class.new FakeNamedTest do + attr_reader :foo + + def run + @foo = "hi mom!" + r = super + @foo = "okay" + + r + end + + def test_something + assert_equal "hi mom!", foo + end + end + + expected = clean <<-EOM + . + + Finished in 0.00 + + 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_report expected + end + + def test_run_error + @tu = + Class.new FakeNamedTest do + def test_something + assert true + end + + def test_error + raise "unhandled exception" + end + end + + expected = clean <<-EOM + E. + + Finished in 0.00 + + 1) Error: + FakeNamedTestXX#test_error: + RuntimeError: unhandled exception + FILE:LINE:in \`test_error\' + + 2 runs, 1 assertions, 0 failures, 1 errors, 0 skips + EOM + + assert_report expected + end + + def test_run_error_teardown + @tu = + Class.new FakeNamedTest do + def test_something + assert true + end + + def teardown + raise "unhandled exception" + end + end + + expected = clean <<-EOM + E + + Finished in 0.00 + + 1) Error: + FakeNamedTestXX#test_something: + RuntimeError: unhandled exception + FILE:LINE:in \`teardown\' + + 1 runs, 1 assertions, 0 failures, 1 errors, 0 skips + EOM + + assert_report expected + end + + def test_run_failing + setup_basic_tu + + expected = clean <<-EOM + F. + + Finished in 0.00 + + 1) Failure: + FakeNamedTestXX#test_failure [FILE:LINE]: + Expected false to be truthy. + + 2 runs, 2 assertions, 1 failures, 0 errors, 0 skips + EOM + + assert_report expected + end + + def setup_basic_tu + @tu = + Class.new FakeNamedTest do + def test_something + assert true + end + + def test_failure + assert false + end + end + end + + def test_run_failing_filtered + setup_basic_tu + + expected = clean <<-EOM + . + + Finished in 0.00 + + 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_report expected, %w[--name /some|thing/ --seed 42] + end + + def assert_filtering filter, name, expected, a = false + args = %W[--#{filter} #{name} --seed 42] + + alpha = Class.new FakeNamedTest do + define_method :test_something do + assert a + end + end + Object.const_set(:Alpha, alpha) + + beta = Class.new FakeNamedTest do + define_method :test_something do + assert true + end + end + Object.const_set(:Beta, beta) + + @tus = [alpha, beta] + + assert_report expected, args + ensure + Object.send :remove_const, :Alpha + Object.send :remove_const, :Beta + end + + def test_run_filtered_including_suite_name + expected = clean <<-EOM + . + + Finished in 0.00 + + 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_filtering "name", "/Beta#test_something/", expected + end + + def test_run_filtered_including_suite_name_string + expected = clean <<-EOM + . + + Finished in 0.00 + + 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_filtering "name", "Beta#test_something", expected + end + + def test_run_filtered_string_method_only + expected = clean <<-EOM + .. + + Finished in 0.00 + + 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_filtering "name", "test_something", expected, :pass + end + + def test_run_failing_excluded + setup_basic_tu + + expected = clean <<-EOM + . + + Finished in 0.00 + + 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_report expected, %w[--exclude /failure/ --seed 42] + end + + def test_run_filtered_excluding_suite_name + expected = clean <<-EOM + . + + Finished in 0.00 + + 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_filtering "exclude", "/Alpha#test_something/", expected + end + + def test_run_filtered_excluding_suite_name_string + expected = clean <<-EOM + . + + Finished in 0.00 + + 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_filtering "exclude", "Alpha#test_something", expected + end + + def test_run_filtered_excluding_string_method_only + expected = clean <<-EOM + + + Finished in 0.00 + + 0 runs, 0 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_filtering "exclude", "test_something", expected, :pass + end + + def test_run_passing + @tu = + Class.new FakeNamedTest do + def test_something + assert true + end + end + + expected = clean <<-EOM + . + + Finished in 0.00 + + 1 runs, 1 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_report expected + end + + def test_run_skip + @tu = + Class.new FakeNamedTest do + def test_something + assert true + end + + def test_skip + skip "not yet" + end + end + + expected = clean <<-EOM + S. + + Finished in 0.00 + + 2 runs, 1 assertions, 0 failures, 0 errors, 1 skips + + You have skipped tests. Run with --verbose for details. + EOM + + restore_env do + assert_report expected + end + end + + def test_run_skip_verbose + @tu = + Class.new FakeNamedTest do + def test_something + assert true + end + + def test_skip + skip "not yet" + end + end + + expected = clean <<-EOM + FakeNamedTestXX#test_skip = 0.00 s = S + FakeNamedTestXX#test_something = 0.00 s = . + + Finished in 0.00 + + 1) Skipped: + FakeNamedTestXX#test_skip [FILE:LINE]: + not yet + + 2 runs, 1 assertions, 0 failures, 0 errors, 1 skips + EOM + + assert_report expected, %w[--seed 42 --verbose] + end + + def test_run_with_other_runner + @tu = + Class.new FakeNamedTest do + def self.run reporter, options = {} + @reporter = reporter + before_my_suite + super + end + + def self.name; "wacky!" end + + def self.before_my_suite + @reporter.io.puts "Running #{self.name} tests" + @@foo = 1 + end + + def test_something + assert_equal 1, @@foo + end + + def test_something_else + assert_equal 1, @@foo + end + end + + expected = clean <<-EOM + Running wacky! tests + .. + + Finished in 0.00 + + 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_report expected + end + + require "monitor" + + class Latch + def initialize count = 1 + @count = count + @lock = Monitor.new + @cv = @lock.new_cond + end + + def release + @lock.synchronize do + @count -= 1 if @count > 0 + @cv.broadcast if @count == 0 + end + end + + def await + @lock.synchronize { @cv.wait_while { @count > 0 } } + end + end + + def test_run_parallel + test_count = 2 + test_latch = Latch.new test_count + wait_latch = Latch.new test_count + main_latch = Latch.new + + thread = Thread.new { + Thread.current.abort_on_exception = true + + # This latch waits until both test latches have been released. Both + # latches can't be released unless done in separate threads because + # `main_latch` keeps the test method from finishing. + test_latch.await + main_latch.release + } + + @tu = + Class.new FakeNamedTest do + parallelize_me! + + test_count.times do |i| + define_method :"test_wait_on_main_thread_#{i}" do + test_latch.release + + # This latch blocks until the "main thread" releases it. The main + # thread can't release this latch until both test latches have + # been released. This forces the latches to be released in separate + # threads. + main_latch.await + assert true + end + end + end + + expected = clean <<-EOM + .. + + Finished in 0.00 + + 2 runs, 2 assertions, 0 failures, 0 errors, 0 skips + EOM + + assert_report(expected) do |reporter| + reporter.extend(Module.new { + define_method("record") do |result| + super(result) + wait_latch.release + end + + define_method("report") do + wait_latch.await + super() + end + }) + end + assert thread.join + end +end + +class TestMinitestUnitOrder < MetaMetaMetaTestCase + # do not parallelize this suite... it just can't handle it. + + def test_before_setup + call_order = [] + @tu = + Class.new FakeNamedTest do + define_method :setup do + super() + call_order << :setup + end + + define_method :before_setup do + call_order << :before_setup + end + + def test_omg; assert true; end + end + + run_tu_with_fresh_reporter + + expected = [:before_setup, :setup] + assert_equal expected, call_order + end + + def test_after_teardown + call_order = [] + @tu = + Class.new FakeNamedTest do + define_method :teardown do + super() + call_order << :teardown + end + + define_method :after_teardown do + call_order << :after_teardown + end + + def test_omg; assert true; end + end + + run_tu_with_fresh_reporter + + expected = [:teardown, :after_teardown] + assert_equal expected, call_order + end + + def test_all_teardowns_are_guaranteed_to_run + call_order = [] + @tu = + Class.new FakeNamedTest do + define_method :after_teardown do + super() + call_order << :after_teardown + raise + end + + define_method :teardown do + super() + call_order << :teardown + raise + end + + define_method :before_teardown do + super() + call_order << :before_teardown + raise + end + + def test_omg; assert true; end + end + + run_tu_with_fresh_reporter + + expected = [:before_teardown, :teardown, :after_teardown] + assert_equal expected, call_order + end + + def test_setup_and_teardown_survive_inheritance + call_order = [] + + @tu = Class.new FakeNamedTest do + define_method :setup do + call_order << :setup_method + end + + define_method :teardown do + call_order << :teardown_method + end + + define_method :test_something do + call_order << :test + end + end + + run_tu_with_fresh_reporter + + @tu = Class.new @tu + run_tu_with_fresh_reporter + + # Once for the parent class, once for the child + expected = [:setup_method, :test, :teardown_method] * 2 + + assert_equal expected, call_order + end +end + +class TestMinitestRunnable < Minitest::Test + def setup_marshal klass + tc = klass.new "whatever" + tc.assertions = 42 + tc.failures << "a failure" + + yield tc if block_given? + + def tc.setup + @blah = "blah" + end + tc.setup + + @tc = Minitest::Result.from tc + end + + def assert_marshal expected_ivars + new_tc = Marshal.load Marshal.dump @tc + + ivars = new_tc.instance_variables.map(&:to_s).sort + assert_equal expected_ivars, ivars + assert_equal "whatever", new_tc.name + assert_equal 42, new_tc.assertions + assert_equal ["a failure"], new_tc.failures + + yield new_tc if block_given? + end + + def test_marshal + setup_marshal Minitest::Runnable + + assert_marshal %w[@NAME @assertions @failures @klass @source_location @time] + end + + def test_spec_marshal + klass = describe("whatever") { it("passes") { assert true } } + rm = klass.runnable_methods.first + + # Run the test + @tc = klass.new(rm).run + + assert_kind_of Minitest::Result, @tc + + # Pass it over the wire + over_the_wire = Marshal.load Marshal.dump @tc + + assert_equal @tc.time, over_the_wire.time + assert_equal @tc.name, over_the_wire.name + assert_equal @tc.assertions, over_the_wire.assertions + assert_equal @tc.failures, over_the_wire.failures + assert_equal @tc.klass, over_the_wire.klass + end +end + +class TestMinitestTest < TestMinitestRunnable + def test_dup + setup_marshal Minitest::Test do |tc| + tc.time = 3.14 + end + + assert_marshal %w[@NAME @assertions @failures @klass @source_location @time] do |new_tc| + assert_in_epsilon 3.14, new_tc.time + end + end +end + +class TestMinitestUnitTestCase < Minitest::Test + # do not call parallelize_me! - teardown accesses @tc._assertions + # which is not threadsafe. Nearly every method in here is an + # assertion test so it isn't worth splitting it out further. + + RUBY18 = !defined? Encoding + + def setup + super + + Minitest::Test.reset + + @tc = Minitest::Test.new "fake tc" + @zomg = "zomg ponies!" + @assertion_count = 1 + end + + def teardown + assert_equal(@assertion_count, @tc.assertions, + "expected #{@assertion_count} assertions to be fired during the test, not #{@tc.assertions}") if @tc.passed? + end + + def non_verbose + orig_verbose = $VERBOSE + $VERBOSE = false + + yield + ensure + $VERBOSE = orig_verbose + end + + def test_runnable_methods_random + @assertion_count = 0 + + sample_test_case = Class.new FakeNamedTest do + def self.test_order; :random; end + def test_test1; assert "does not matter" end + def test_test2; assert "does not matter" end + def test_test3; assert "does not matter" end + end + + srand 42 + expected = %w[test_test2 test_test1 test_test3] + assert_equal expected, sample_test_case.runnable_methods + end + + def test_runnable_methods_sorted + @assertion_count = 0 + + sample_test_case = Class.new FakeNamedTest do + def self.test_order; :sorted end + def test_test3; assert "does not matter" end + def test_test2; assert "does not matter" end + def test_test1; assert "does not matter" end + end + + expected = %w[test_test1 test_test2 test_test3] + assert_equal expected, sample_test_case.runnable_methods + end + + def test_i_suck_and_my_tests_are_order_dependent_bang_sets_test_order_alpha + @assertion_count = 0 + + shitty_test_case = Class.new FakeNamedTest + + shitty_test_case.i_suck_and_my_tests_are_order_dependent! + + assert_equal :alpha, shitty_test_case.test_order + end + + def test_i_suck_and_my_tests_are_order_dependent_bang_does_not_warn + @assertion_count = 0 + + shitty_test_case = Class.new FakeNamedTest + + def shitty_test_case.test_order; :lol end + + assert_silent do + shitty_test_case.i_suck_and_my_tests_are_order_dependent! + end + end + + def test_autorun_does_not_affect_fork_success_status + @assertion_count = 0 + skip "windows doesn't have skip" unless Process.respond_to?(:fork) + Process.waitpid(fork {}) + assert_equal true, $?.success? + end + + def test_autorun_does_not_affect_fork_exit_status + @assertion_count = 0 + skip "windows doesn't have skip" unless Process.respond_to?(:fork) + Process.waitpid(fork { exit 42 }) + assert_equal 42, $?.exitstatus + end +end + +class TestMinitestGuard < Minitest::Test + parallelize_me! + + def test_mri_eh + assert self.class.mri? "ruby blah" + assert self.mri? "ruby blah" + end + + def test_jruby_eh + assert self.class.jruby? "java" + assert self.jruby? "java" + end + + def test_rubinius_eh + assert_output "", /DEPRECATED/ do + assert self.class.rubinius? "rbx" + end + assert_output "", /DEPRECATED/ do + assert self.rubinius? "rbx" + end + end + + def test_maglev_eh + assert_output "", /DEPRECATED/ do + assert self.class.maglev? "maglev" + end + assert_output "", /DEPRECATED/ do + assert self.maglev? "maglev" + end + end + + def test_osx_eh + assert self.class.osx? "darwin" + assert self.osx? "darwin" + end + + def test_windows_eh + assert self.class.windows? "mswin" + assert self.windows? "mswin" + end +end + +class TestMinitestUnitRecording < MetaMetaMetaTestCase + # do not parallelize this suite... it just can't handle it. + + def assert_run_record *expected, &block + @tu = Class.new FakeNamedTest, &block + + run_tu_with_fresh_reporter + + recorded = first_reporter.results.map(&:failures).flatten.map { |f| f.error.class } + + assert_equal expected, recorded + end + + def test_run_with_bogus_reporter + # https://github.com/seattlerb/minitest/issues/659 + # TODO: remove test for minitest 6 + @tu = Class.new FakeNamedTest do + def test_method + assert true + end + end + + bogus_reporter = Class.new do # doesn't subclass AbstractReporter + def start; @success = false; end + # def prerecord klass, name; end # doesn't define full API + def record result; @success = true; end + def report; end + def passed?; end + def results; end + def success?; @success; end + end.new + + self.reporter = Minitest::CompositeReporter.new + reporter << bogus_reporter + + Minitest::Runnable.runnables.delete @tu + + @tu.run reporter, {} + + assert_predicate bogus_reporter, :success? + end + + def test_record_passing + assert_run_record do + def test_method + assert true + end + end + end + + def test_record_failing + assert_run_record Minitest::Assertion do + def test_method + assert false + end + end + end + + def test_record_error + assert_run_record RuntimeError do + def test_method + raise "unhandled exception" + end + end + end + + def test_record_error_teardown + assert_run_record RuntimeError do + def test_method + assert true + end + + def teardown + raise "unhandled exception" + end + end + end + + def test_record_error_in_test_and_teardown + assert_run_record AnError, RuntimeError do + def test_method + raise AnError + end + + def teardown + raise "unhandled exception" + end + end + end + + def test_to_s_error_in_test_and_teardown + @tu = Class.new FakeNamedTest do + def test_method + raise AnError + end + + def teardown + raise "unhandled exception" + end + end + + run_tu_with_fresh_reporter + + exp = clean " + Error: + FakeNamedTestXX#test_method: + AnError: AnError + FILE:LINE:in `test_method' + + Error: + FakeNamedTestXX#test_method: + RuntimeError: unhandled exception + FILE:LINE:in `teardown' + " + + assert_equal exp.strip, normalize_output(first_reporter.results.first.to_s).strip + end + + def test_record_skip + assert_run_record Minitest::Skip do + def test_method + skip "not yet" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.gitignore b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.gitignore new file mode 100644 index 000000000000..c02a1419a2a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.gitignore @@ -0,0 +1,6 @@ +doc +pkg +*~ +*.swo +*.swp +/Gemfile.lock diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.rspec b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.rspec new file mode 100644 index 000000000000..744a412ad528 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.rspec @@ -0,0 +1,5 @@ +--color +--format documentation +--backtrace +--require spec_helper +--warnings diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.travis.yml new file mode 100644 index 000000000000..e8052cf2d8de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.travis.yml @@ -0,0 +1,20 @@ +language: ruby +cache: bundler + +rvm: + - 2.0 + - 2.1 + - 2.2 + - 2.3 + - 2.4 + - 2.5 + - 2.6 + - ruby-head + - jruby-head + - truffleruby + +matrix: + allow_failures: + - rvm: ruby-head + - rvm: jruby-head + - rvm: truffleruby diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.yardopts b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.yardopts new file mode 100644 index 000000000000..12595ba6a735 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/.yardopts @@ -0,0 +1,6 @@ +--no-private +lib/**/*.rb +- +History.txt +LICENSE +README.md diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/Gemfile b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/Gemfile new file mode 100644 index 000000000000..0c1a0003d2f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' +gemspec + +group :development, :test do + gem 'rake' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/History.txt b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/History.txt new file mode 100644 index 000000000000..85ef2a3e0389 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/History.txt @@ -0,0 +1,64 @@ +<!-- +# @markup rdoc +# @title CHANGELOG +--> + +=== 2.0.0 / 2013-12-21 + +- Drop Ruby 1.8 compatibility +- GH #21: Fix FilePart length calculation for Ruby 1.9 when filename contains + multibyte characters (hexfet) +- GH #20: Ensure upload responds to both #content_type and #original_filename + (Steven Davidovitz) +- GH #31: Support setting headers on any part of the request (Socrates Vicente) +- GH #30: Support array values for params (Gustav Ernberg) +- GH #32: Fix respond_to? signature (Leo Cassarani) +- GH #33: Update README to markdown (Jagtesh Chadha) +- GH #35: Improved handling of array-type parameters (Steffen Grunwald) + +=== 1.2.0 / 2013-02-25 + +- #25: Ruby 2 compatibility (thanks mislav) + +=== 1.1.5 / 2012-02-12 + +- Fix length/bytesize of parts in 1.9 (#7, #14) (Jason Moore) +- Allow CompositeIO objects to be re-read by rewinding, like other IO + objects. (Luke Redpath) + +=== 1.1.4 / 2011-11-23 + +- Non-functional changes in release (switch to Bundler gem tasks) + +=== 1.1.3 / 2011-07-25 + +- More configurable header specification for parts (Gerrit Riessen) + +=== 1.1.2 / 2011-05-24 + +- Fix CRLF file part miscalculation (Johannes Wagener) +- Fix Epilogue CRLF issue (suggestion by Neil Spring) + +=== 1.1.1 / 2011-05-13 + +- GH# 9: Fixed Ruby 1.9.2 StringIO bug (thanks Alex Koppel) + +=== 1.1.0 / 2011-01-11 + +- API CHANGE: UploadIO.convert! removed in favor of UploadIO.new + (Jeff Hodges) + +=== 1.0.1 / 2010-04-27 + +- Doc updates, make gemspec based on more modern Rubygems + +=== 1.0 / 2009-02-12 + +- Many fixes from mlooney, seems to work now. Putting the 0.9 seal of + approval on it. + +=== 0.1 / 2008-08-12 + +* 1 major enhancement + + * Birthday! diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/LICENSE b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/LICENSE new file mode 100644 index 000000000000..ce550a310561 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2007-2013 Nick Sieger nick@nicksieger.com +Copyright, 2017, by Samuel G. D. Williams. + +MIT license. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/Manifest.txt b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/Manifest.txt new file mode 100644 index 000000000000..109d8f092203 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/Manifest.txt @@ -0,0 +1,9 @@ +lib/composite_io.rb +lib/multipartable.rb +lib/parts.rb +lib/net/http/post/multipart.rb +Manifest.txt +Rakefile +README.txt +test/test_composite_io.rb +test/net/http/post/test_multipart.rb diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/README.md b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/README.md new file mode 100644 index 000000000000..427a804b2627 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/README.md @@ -0,0 +1,127 @@ +# Multipart::Post + +Adds a streamy multipart form post capability to `Net::HTTP`. Also supports other +methods besides `POST`. + +[![Build Status](https://secure.travis-ci.org/socketry/multipart-post.svg)](http://travis-ci.org/socketry/multipart-post) + +## Features/Problems + +* Appears to actually work. A good feature to have. +* Encapsulates posting of file/binary parts and name/value parameter parts, similar to + most browsers' file upload forms. +* Provides an `UploadIO` helper class to prepare IO objects for inclusion in the params + hash of the multipart post object. + +## Installation + + gem install multipart-post + +or in your Gemfile + + gem 'multipart-post' + +## Usage + +```ruby +require 'net/http/post/multipart' + +url = URI.parse('http://www.example.com/upload') +File.open("./image.jpg") do |jpg| + req = Net::HTTP::Post::Multipart.new url.path, + "file" => UploadIO.new(jpg, "image/jpeg", "image.jpg") + res = Net::HTTP.start(url.host, url.port) do |http| + http.request(req) + end +end +``` + +To post multiple files or attachments, simply include multiple parameters with +`UploadIO` values: + +```ruby +require 'net/http/post/multipart' + +url = URI.parse('http://www.example.com/upload') +req = Net::HTTP::Post::Multipart.new url.path, + "file1" => UploadIO.new(File.new("./image.jpg"), "image/jpeg", "image.jpg"), + "file2" => UploadIO.new(File.new("./image2.jpg"), "image/jpeg", "image2.jpg") +res = Net::HTTP.start(url.host, url.port) do |http| + http.request(req) +end +``` + +To post files with other normal, non-file params such as input values, you need to pass hashes to the `Multipart.new` method. + +In Rails 4 for example: + +```ruby +def model_params + require_params = params.require(:model).permit(:param_one, :param_two, :param_three, :avatar) + require_params[:avatar] = model_params[:avatar].present? ? UploadIO.new(model_params[:avatar].tempfile, model_params[:avatar].content_type, model_params[:avatar].original_filename) : nil + require_params +end + +require 'net/http/post/multipart' + +url = URI.parse('http://www.example.com/upload') +Net::HTTP.start(url.host, url.port) do |http| + req = Net::HTTP::Post::Multipart.new(url, model_params) + key = "authorization_key" + req.add_field("Authorization", key) #add to Headers + http.use_ssl = (url.scheme == "https") + http.request(req) +end +``` + +Or in plain ruby: + +```ruby +def params(file) + params = { "description" => "A nice picture!" } + params[:datei] = UploadIO.new(file, "image/jpeg", "image.jpg") + params +end + +url = URI.parse('http://www.example.com/upload') +File.open("./image.jpg") do |file| + req = Net::HTTP::Post::Multipart.new(url.path, params(file)) + res = Net::HTTP.start(url.host, url.port) do |http| + return http.request(req).body + end +end +``` + +### Debugging + +You can debug requests and responses (e.g. status codes) for all requests by adding the following code: + +```ruby +http = Net::HTTP.new(uri.host, uri.port) +http.set_debug_output($stdout) +``` + +## License + +Released under the MIT license. + +Copyright (c) 2007-2013 Nick Sieger <nick@nicksieger.com> +Copyright, 2017, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/Rakefile b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/Rakefile new file mode 100644 index 000000000000..f5cbbfd6f01d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/Rakefile @@ -0,0 +1,6 @@ +require "bundler/gem_tasks" +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new(:test) + +task :default => :test diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/composite_io.rb b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/composite_io.rb new file mode 100644 index 000000000000..7fcdc701c805 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/composite_io.rb @@ -0,0 +1,108 @@ +#-- +# Copyright (c) 2007-2012 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +# Concatenate together multiple IO objects into a single, composite IO object +# for purposes of reading as a single stream. +# +# @example +# crio = CompositeReadIO.new(StringIO.new('one'), +# StringIO.new('two'), +# StringIO.new('three')) +# puts crio.read # => "onetwothree" +class CompositeReadIO + # Create a new composite-read IO from the arguments, all of which should + # respond to #read in a manner consistent with IO. + def initialize(*ios) + @ios = ios.flatten + @index = 0 + end + + # Read from IOs in order until `length` bytes have been received. + def read(length = nil, outbuf = nil) + got_result = false + outbuf = outbuf ? outbuf.replace("") : "" + + while io = current_io + if result = io.read(length) + got_result ||= !result.nil? + result.force_encoding("BINARY") if result.respond_to?(:force_encoding) + outbuf << result + length -= result.length if length + break if length == 0 + end + advance_io + end + (!got_result && length) ? nil : outbuf + end + + def rewind + @ios.each { |io| io.rewind } + @index = 0 + end + + private + + def current_io + @ios[@index] + end + + def advance_io + @index += 1 + end +end + +# Convenience methods for dealing with files and IO that are to be uploaded. +class UploadIO + attr_reader :content_type, :original_filename, :local_path, :io, :opts + + # Create an upload IO suitable for including in the params hash of a + # Net::HTTP::Post::Multipart. + # + # Can take two forms. The first accepts a filename and content type, and + # opens the file for reading (to be closed by finalizer). + # + # The second accepts an already-open IO, but also requires a third argument, + # the filename from which it was opened (particularly useful/recommended if + # uploading directly from a form in a framework, which often save the file to + # an arbitrarily named RackMultipart file in /tmp). + # + # @example + # UploadIO.new("file.txt", "text/plain") + # UploadIO.new(file_io, "text/plain", "file.txt") + def initialize(filename_or_io, content_type, filename = nil, opts = {}) + io = filename_or_io + local_path = "" + if io.respond_to? :read + # in Ruby 1.9.2, StringIOs no longer respond to path + # (since they respond to :length, so we don't need their local path, see parts.rb:41) + local_path = filename_or_io.respond_to?(:path) ? filename_or_io.path : "local.path" + else + io = File.open(filename_or_io) + local_path = filename_or_io + end + filename ||= local_path + + @content_type = content_type + @original_filename = File.basename(filename) + @local_path = local_path + @io = io + @opts = opts + end + + def self.convert!(io, content_type, original_filename, local_path) + raise ArgumentError, "convert! has been removed. You must now wrap IOs " \ + "using:\nUploadIO.new(filename_or_io, content_type, " \ + "filename=nil)\nPlease update your code." + end + + def method_missing(*args) + @io.send(*args) + end + + def respond_to?(meth, include_all = false) + @io.respond_to?(meth, include_all) || super(meth, include_all) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/multipart_post.rb b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/multipart_post.rb new file mode 100644 index 000000000000..3a91cdefb571 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/multipart_post.rb @@ -0,0 +1,9 @@ +#-- +# Copyright (c) 2007-2013 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +module MultipartPost + VERSION = "2.1.1" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/multipartable.rb b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/multipartable.rb new file mode 100644 index 000000000000..6a96575bb11c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/multipartable.rb @@ -0,0 +1,48 @@ +#-- +# Copyright (c) 2007-2013 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +require 'parts' +require 'securerandom' + +module Multipartable + def self.secure_boundary + # https://tools.ietf.org/html/rfc7230 + # tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" + # / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + # / DIGIT / ALPHA + + # https://tools.ietf.org/html/rfc2046 + # bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / + # "+" / "_" / "," / "-" / "." / + # "/" / ":" / "=" / "?" + + "--#{SecureRandom.uuid}" + end + + def initialize(path, params, headers={}, boundary = Multipartable.secure_boundary) + headers = headers.clone # don't want to modify the original variable + parts_headers = headers.delete(:parts) || {} + super(path, headers) + parts = params.map do |k,v| + case v + when Array + v.map {|item| Parts::Part.new(boundary, k, item, parts_headers[k]) } + else + Parts::Part.new(boundary, k, v, parts_headers[k]) + end + end.flatten + parts << Parts::EpiloguePart.new(boundary) + ios = parts.map {|p| p.to_io } + self.set_content_type(headers["Content-Type"] || "multipart/form-data", + { "boundary" => boundary }) + self.content_length = parts.inject(0) {|sum,i| sum + i.length } + self.body_stream = CompositeReadIO.new(*ios) + + @boundary = boundary + end + + attr :boundary +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/net/http/post/multipart.rb b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/net/http/post/multipart.rb new file mode 100644 index 000000000000..dc5359922903 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/net/http/post/multipart.rb @@ -0,0 +1,28 @@ +#-- +# Copyright (c) 2007-2012 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +require 'net/http' +require 'stringio' +require 'cgi' +require 'composite_io' +require 'multipartable' +require 'parts' + +module Net + class HTTP + class Put + class Multipart < Put + include Multipartable + end + end + + class Post + class Multipart < Post + include Multipartable + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/parts.rb b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/parts.rb new file mode 100644 index 000000000000..ee46c72a2f39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/lib/parts.rb @@ -0,0 +1,126 @@ +#-- +# Copyright (c) 2007-2013 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +module Parts + module Part + def self.new(boundary, name, value, headers = {}) + headers ||= {} # avoid nil values + if file?(value) + FilePart.new(boundary, name, value, headers) + else + ParamPart.new(boundary, name, value, headers) + end + end + + def self.file?(value) + value.respond_to?(:content_type) && value.respond_to?(:original_filename) + end + + def length + @part.length + end + + def to_io + @io + end + end + + # Represents a parametric part to be filled with given value. + class ParamPart + include Part + + # @param boundary [String] + # @param name [#to_s] + # @param value [String] + # @param headers [Hash] Content-Type is used, if present. + def initialize(boundary, name, value, headers = {}) + @part = build_part(boundary, name, value, headers) + @io = StringIO.new(@part) + end + + def length + @part.bytesize + end + + # @param boundary [String] + # @param name [#to_s] + # @param value [String] + # @param headers [Hash] Content-Type is used, if present. + def build_part(boundary, name, value, headers = {}) + part = '' + part << "--#{boundary}\r\n" + part << "Content-Disposition: form-data; name=\"#{name.to_s}\"\r\n" + part << "Content-Type: #{headers["Content-Type"]}\r\n" if headers["Content-Type"] + part << "\r\n" + part << "#{value}\r\n" + end + end + + # Represents a part to be filled from file IO. + class FilePart + include Part + + attr_reader :length + + # @param boundary [String] + # @param name [#to_s] + # @param io [IO] + # @param headers [Hash] + def initialize(boundary, name, io, headers = {}) + file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path) + @head = build_head(boundary, name, io.original_filename, io.content_type, file_length, + io.respond_to?(:opts) ? io.opts.merge(headers) : headers) + @foot = "\r\n" + @length = @head.bytesize + file_length + @foot.length + @io = CompositeReadIO.new(StringIO.new(@head), io, StringIO.new(@foot)) + end + + # @param boundary [String] + # @param name [#to_s] + # @param filename [String] + # @param type [String] + # @param content_len [Integer] + # @param opts [Hash] + def build_head(boundary, name, filename, type, content_len, opts = {}) + opts = opts.clone + + trans_encoding = opts.delete("Content-Transfer-Encoding") || "binary" + content_disposition = opts.delete("Content-Disposition") || "form-data" + + part = '' + part << "--#{boundary}\r\n" + part << "Content-Disposition: #{content_disposition}; name=\"#{name.to_s}\"; filename=\"#{filename}\"\r\n" + part << "Content-Length: #{content_len}\r\n" + if content_id = opts.delete("Content-ID") + part << "Content-ID: #{content_id}\r\n" + end + + if opts["Content-Type"] != nil + part << "Content-Type: " + opts["Content-Type"] + "\r\n" + else + part << "Content-Type: #{type}\r\n" + end + + part << "Content-Transfer-Encoding: #{trans_encoding}\r\n" + + opts.each do |k, v| + part << "#{k}: #{v}\r\n" + end + + part << "\r\n" + end + end + + # Represents the epilogue or closing boundary. + class EpiloguePart + include Part + + def initialize(boundary) + @part = "--#{boundary}--\r\n" + @io = StringIO.new(@part) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/multipart-post.gemspec b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/multipart-post.gemspec new file mode 100644 index 000000000000..a3377f59467d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/multipart-post.gemspec @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +$:.push File.expand_path("../lib", __FILE__) +require "multipart_post" + +Gem::Specification.new do |spec| + spec.name = "multipart-post" + spec.version = MultipartPost::VERSION + spec.authors = ["Nick Sieger", "Samuel Williams"] + spec.email = ["nick@nicksieger.com", "samuel.williams@oriontransfer.co.nz"] + spec.homepage = "https://github.com/nicksieger/multipart-post" + spec.summary = %q{A multipart form post accessory for Net::HTTP.} + spec.license = "MIT" + spec.description = %q{Use with Net::HTTP to do multipart form postspec. IO values that have #content_type, #original_filename, and #local_path will be posted as a binary file.} + + spec.files = `git ls-files`.split("\n") + spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + spec.require_paths = ["lib"] + + spec.add_development_dependency 'bundler', ['>= 1.3', '< 3'] + spec.add_development_dependency 'rspec', '~> 3.4' + spec.add_development_dependency 'rake' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/composite_io_spec.rb b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/composite_io_spec.rb new file mode 100644 index 000000000000..c9409b31f5ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/composite_io_spec.rb @@ -0,0 +1,138 @@ +# Copyright, 2012, by Nick Sieger. +# Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com> +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +require 'composite_io' +require 'stringio' +require 'timeout' + +RSpec.shared_context "composite io" do + it "test_full_read_from_several_ios" do + expect(subject.read).to be == 'the quick brown fox' + end + + it "test_partial_read" do + expect(subject.read(9)).to be == 'the quick' + end + + it "test_partial_read_to_boundary" do + expect(subject.read(10)).to be == 'the quick ' + end + + it "test_read_with_size_larger_than_available" do + expect(subject.read(32)).to be == 'the quick brown fox' + end + + it "test_read_into_buffer" do + buf = '' + subject.read(nil, buf) + expect(buf).to be == 'the quick brown fox' + end + + it "test_multiple_reads" do + expect(subject.read(4)).to be == 'the ' + expect(subject.read(4)).to be == 'quic' + expect(subject.read(4)).to be == 'k br' + expect(subject.read(4)).to be == 'own ' + expect(subject.read(4)).to be == 'fox' + end + + it "test_read_after_end" do + subject.read + expect(subject.read).to be == "" + end + + it "test_read_after_end_with_amount" do + subject.read(32) + expect(subject.read(32)).to be_nil + end + + it "test_second_full_read_after_rewinding" do + subject.read + subject.rewind + expect(subject.read).to be == 'the quick brown fox' + end + + # Was apparently broken on JRuby due to http://jira.codehaus.org/browse/JRUBY-7109 + it "test_compatible_with_copy_stream" do + target_io = StringIO.new + Timeout.timeout(1) do # Not sure why we need this in the spec? + IO.copy_stream(subject, target_io) + end + expect(target_io.string).to be == "the quick brown fox" + end +end + +RSpec.describe CompositeReadIO do + describe "generic io" do + subject {StringIO.new('the quick brown fox')} + + include_context "composite io" + end + + describe "composite io" do + subject {CompositeReadIO.new(StringIO.new('the '), StringIO.new('quick '), StringIO.new('brown '), StringIO.new('fox'))} + + include_context "composite io" + end + + describe "nested composite io" do + subject {CompositeReadIO.new(CompositeReadIO.new(StringIO.new('the '), StringIO.new('quick ')), StringIO.new('brown '), StringIO.new('fox'))} + + include_context "composite io" + end + + describe "unicode composite io" do + let(:utf8_io) {File.open(File.dirname(__FILE__)+'/multibyte.txt')} + let(:binary_io) {StringIO.new("\x86")} + + subject {CompositeReadIO.new(binary_io, utf8_io)} + + it "test_read_from_multibyte" do + expect(subject.read).to be == "\x86\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\n".b + end + end + + it "test_convert_error" do + expect do + UploadIO.convert!('tmp.txt', 'text/plain', 'tmp.txt', 'tmp.txt') + end.to raise_error(ArgumentError, /convert! has been removed/) + end + + it "test_empty" do + expect(subject.read).to be == "" + end + + it "test_empty_limited" do + expect(subject.read(1)).to be_nil + end + + it "test_empty_parts" do + io = CompositeReadIO.new(StringIO.new, StringIO.new('the '), StringIO.new, StringIO.new('quick')) + expect(io.read(3)).to be == "the" + expect(io.read(3)).to be == " qu" + expect(io.read(3)).to be == "ick" + end + + it "test_all_empty_parts" do + io = CompositeReadIO.new(StringIO.new, StringIO.new) + expect(io.read(1)).to be_nil + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/multibyte.txt b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/multibyte.txt new file mode 100644 index 000000000000..24a84b0457db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/multibyte.txt @@ -0,0 +1 @@ +ファイル diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/net/http/post/multipart_spec.rb b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/net/http/post/multipart_spec.rb new file mode 100644 index 000000000000..a19ea04d13df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/net/http/post/multipart_spec.rb @@ -0,0 +1,123 @@ +#-- +# Copyright (c) 2007-2013 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +require 'net/http/post/multipart' + +RSpec.shared_context "net http multipart" do + let(:temp_file) {"temp.txt"} + let(:http_post) do + Struct.new("HTTPPost", :content_length, :body_stream, :content_type) do + def set_content_type(type, params = {}) + self.content_type = type + params.map{|k,v|"; #{k}=#{v}"}.join('') + end + end + end + + after(:each) do + File.delete(temp_file) rescue nil + end + + def assert_results(post) + expect(post.content_length).to be > 0 + expect(post.body_stream).to_not be_nil + + expect(post['content-type']).to be == "multipart/form-data; boundary=#{post.boundary}" + + body = post.body_stream.read + boundary_regex = Regexp.quote(post.boundary) + + expect(body).to be =~ /1234567890/ + + # ensure there is at least one boundary + expect(body).to be =~ /^--#{boundary_regex}\r\n/ + + # ensure there is an epilogue + expect(body).to be =~ /^--#{boundary_regex}--\r\n/ + expect(body).to be =~ /text\/plain/ + + if (body =~ /multivalueParam/) + expect(body.scan(/^.*multivalueParam.*$/).size).to be == 2 + end + end + + def assert_additional_headers_added(post, parts_headers) + post.body_stream.rewind + body = post.body_stream.read + parts_headers.each do |part, headers| + headers.each do |k,v| + expect(body).to be =~ /#{k}: #{v}/ + end + end + end +end + +RSpec.describe Net::HTTP::Post::Multipart do + include_context "net http multipart" + + it "test_form_multipart_body" do + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + @io = File.open(TEMP_FILE) + @io = UploadIO.new @io, "text/plain", TEMP_FILE + assert_results Net::HTTP::Post::Multipart.new("/foo/bar", :foo => 'bar', :file => @io) + end + + it "test_form_multipart_body_with_stringio" do + @io = StringIO.new("1234567890") + @io = UploadIO.new @io, "text/plain", TEMP_FILE + assert_results Net::HTTP::Post::Multipart.new("/foo/bar", :foo => 'bar', :file => @io) + end + + it "test_form_multiparty_body_with_parts_headers" do + @io = StringIO.new("1234567890") + @io = UploadIO.new @io, "text/plain", TEMP_FILE + parts = { :text => 'bar', :file => @io } + headers = { + :parts => { + :text => { "Content-Type" => "part/type" }, + :file => { "Content-Transfer-Encoding" => "part-encoding" } + } + } + + request = Net::HTTP::Post::Multipart.new("/foo/bar", parts, headers) + assert_results request + assert_additional_headers_added(request, headers[:parts]) + end + + it "test_form_multipart_body_with_array_value" do + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + @io = File.open(TEMP_FILE) + @io = UploadIO.new @io, "text/plain", TEMP_FILE + params = {:foo => ['bar', 'quux'], :file => @io} + headers = { :parts => { + :foo => { "Content-Type" => "application/json; charset=UTF-8" } } } + post = Net::HTTP::Post::Multipart.new("/foo/bar", params, headers) + + expect(post.content_length).to be > 0 + expect(post.body_stream).to_not be_nil + + body = post.body_stream.read + expect(body.lines.grep(/name="foo"/).length).to be == 2 + expect(body).to be =~ /Content-Type: application\/json; charset=UTF-8/ + end + + it "test_form_multipart_body_with_arrayparam" do + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + @io = File.open(TEMP_FILE) + @io = UploadIO.new @io, "text/plain", TEMP_FILE + assert_results Net::HTTP::Post::Multipart.new("/foo/bar", :multivalueParam => ['bar','bah'], :file => @io) + end +end + +RSpec.describe Net::HTTP::Put::Multipart do + include_context "net http multipart" + + it "test_form_multipart_body_put" do + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + @io = File.open(TEMP_FILE) + @io = UploadIO.new @io, "text/plain", TEMP_FILE + assert_results Net::HTTP::Put::Multipart.new("/foo/bar", :foo => 'bar', :file => @io) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/parts_spec.rb b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/parts_spec.rb new file mode 100644 index 000000000000..ceaab6e1b3dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/parts_spec.rb @@ -0,0 +1,102 @@ +# Copyright, 2012, by Nick Sieger. +# Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com> +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +require 'parts' +require 'stringio' +require 'composite_io' +require 'tempfile' + +MULTIBYTE = File.dirname(__FILE__)+'/multibyte.txt' +TEMP_FILE = "temp.txt" + +module AssertPartLength + def assert_part_length(part) + bytes = part.to_io.read + bytesize = bytes.respond_to?(:bytesize) ? bytes.bytesize : bytes.length + expect(bytesize).to be == part.length + end +end + +RSpec.describe Parts do + let(:string_with_content_type) do + Class.new(String) do + def content_type; 'application/data'; end + end + end + + it "test_file_with_upload_io" do + expect(Parts::Part.file?(UploadIO.new(__FILE__, "text/plain"))).to be true + end + + it "test_file_with_modified_string" do + expect(Parts::Part.file?(string_with_content_type.new("Hello"))).to be false + end + + it "test_new_with_modified_string" do + expect(Parts::Part.new("boundary", "multibyte", string_with_content_type.new("Hello"))).to be_kind_of(Parts::ParamPart) + end +end + +RSpec.describe Parts::FilePart do + include AssertPartLength + + before(:each) do + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + io = UploadIO.new(TEMP_FILE, "text/plain") + @part = Parts::FilePart.new("boundary", "afile", io) + end + + after(:each) do + File.delete(TEMP_FILE) rescue nil + end + + it "test_correct_length" do + assert_part_length @part + end + + it "test_multibyte_file_length" do + assert_part_length Parts::FilePart.new("boundary", "multibyte", UploadIO.new(MULTIBYTE, "text/plain")) + end + + it "test_multibyte_filename" do + name = File.read(MULTIBYTE, 300) + file = Tempfile.new(name.respond_to?(:force_encoding) ? name.force_encoding("UTF-8") : name) + assert_part_length Parts::FilePart.new("boundary", "multibyte", UploadIO.new(file, "text/plain")) + file.close + end + + it "test_force_content_type_header" do + part = Parts::FilePart.new("boundary", "afile", UploadIO.new(TEMP_FILE, "text/plain"), { "Content-Type" => "application/pdf" }) + expect(part.to_io.read).to match(/Content-Type: application\/pdf/) + end +end + +RSpec.describe Parts::ParamPart do + include AssertPartLength + + before(:each) do + @part = Parts::ParamPart.new("boundary", "multibyte", File.read(MULTIBYTE)) + end + + it "test_correct_length" do + assert_part_length @part + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/spec_helper.rb new file mode 100644 index 000000000000..c52cf78007c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/multipart-post-2.1.1/spec/spec_helper.rb @@ -0,0 +1,29 @@ + +if ENV['COVERAGE'] + begin + require 'simplecov' + + SimpleCov.start do + add_filter "/spec/" + end + + if ENV['TRAVIS'] + require 'coveralls' + Coveralls.wear! + end + rescue LoadError + warn "Could not load simplecov: #{$!}" + end +end + +require "bundler/setup" +require "multipart_post" + +RSpec.configure do |config| + # Enable flags like --only-failures and --next-failure + config.example_status_persistence_file_path = ".rspec_status" + + config.expect_with :rspec do |c| + c.syntax = :expect + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/Gemfile b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/Gemfile new file mode 100644 index 000000000000..b4e2a20bb606 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/LICENSE-DEPENDENCIES.md b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/LICENSE-DEPENDENCIES.md new file mode 100644 index 000000000000..f220b44def66 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/LICENSE-DEPENDENCIES.md @@ -0,0 +1,1682 @@ +# Vendored Dependency Licenses + +Nokogiri ships with some third party dependencies, which are listed here along with their licenses. + +Note that this document is broken into multiple sections, each of which describes the dependencies of a different "platform release" of Nokogiri. + +<!-- toc --> + +- [Default platform release ("ruby")](#default-platform-release-ruby) +- [Native LinuxⓇ platform releases ("x86_64-linux" and "arm64-linux")](#native-linux%E2%93%A1-platform-releases-x86_64-linux-and-arm64-linux) +- [Native Darwin (macOSⓇ) platform releases ("x86_64-darwin" and "arm64-darwin")](#native-darwin-macos%E2%93%A1-platform-releases-x86_64-darwin-and-arm64-darwin) +- [Native WindowsⓇ platform releases ("x86-mingw32" and "x64-mingw32")](#native-windows%E2%93%A1-platform-releases-x86-mingw32-and-x64-mingw32) +- [JavaⓇ (JRuby) platform release ("java")](#java%E2%93%A1-jruby-platform-release-java) +- [Appendix: Dependencies' License Texts](#appendix-dependencies-license-texts) + * [libxml2](#libxml2) + * [libxslt](#libxslt) + * [zlib](#zlib) + * [libiconv](#libiconv) + * [isorelax](#isorelax) + * [jing](#jing) + * [nekodtd](#nekodtd) + * [nekohtml](#nekohtml) + * [xalan](#xalan) + * [xerces](#xerces) + * [xml-apis](#xml-apis) + +<!-- tocstop --> + +It's encouraged for anyone consuming this file via license-tracking software to understand which gem file you're downloading and using, so as not to misinterpret the contents of this file and the licenses of the software being distributed. + +You can double-check the dependencies in your gem file by examining the output of `nokogiri -v` after installation, which will emit the complete set of libraries in use (for versions `>= 1.11.0.rc4`). + +In particular, I'm sure somebody's lawyer, somewhere, is going to freak out that the LGPL appears in this file; and so I'd like to take special note that the dependency covered by LGPL, `libiconv`, is only being redistributed in the native Windows and native Darwin platform releases. It's not present in default, JavaⓇ, or native LinuxⓇ releases. + + +## Default platform release ("ruby") + +The default platform release distributes the following dependencies in source form: + +- [libxml2](#libxml2) +- [libxslt](#libxslt) + +This distribution can be identified by inspecting the included Gem::Specification, which will have the value "ruby" for its "platform" attribute. + + +## Native LinuxⓇ platform releases ("x86_64-linux" and "arm64-linux") + +The native LinuxⓇ platform release distributes the following dependencies in source form: + +- [libxml2](#libxml2) +- [libxslt](#libxslt) +- [zlib](#zlib) + +This distribution can be identified by inspecting the included Gem::Specification, which will have a value similar to "x86_64-linux" or "x86-linux" for its "platform.cpu" attribute. + + +## Native Darwin (macOSⓇ) platform releases ("x86_64-darwin" and "arm64-darwin") + +The native Darwin platform release distributes the following dependencies in source form: + +- [libxml2](#libxml2) +- [libxslt](#libxslt) +- [zlib](#zlib) +- [libiconv](#libiconv) + +This distribution can be identified by inspecting the included Gem::Specification, which will have a value similar to "x86_64-darwin" or "arm64-darwin" for its "platform.cpu" attribute. Darwin is also known more familiarly as "OSX" or "macOSⓇ" and is the operating system for many AppleⓇ computers. + + +## Native WindowsⓇ platform releases ("x86-mingw32" and "x64-mingw32") + +The native WindowsⓇ platform release distributes the following dependencies in source form: + +- [libxml2](#libxml2) +- [libxslt](#libxslt) +- [zlib](#zlib) +- [libiconv](#libiconv) + +This distribution can be identified by inspecting the included Gem::Specification, which will have a value similar to "x64-mingw32" or "x86-mingw32" for its "platform.cpu" attribute. + + +## JavaⓇ (JRuby) platform release ("java") + +The Java platform release distributes the following dependencies as compiled jar files: + +- [isorelax](#isorelax) +- [jing](#jing) +- [nekodtd](#nekodtd) +- [nekohtml](#nekohtml) +- [xalan](#xalan) +- [xerces](#xerces) +- [xml-apis](#xml-apis) + +This distribution can be identified by inspecting the included Gem::Specification, which will have the value "java" for its "platform.os" attribute. + + +## Appendix: Dependencies' License Texts + +This section contains a subsection for each potentially-distributed dependency, which includes the name of the license and the license text. + +Please see previous sections to understand which of these potential dependencies is actually distributed in the gem file you're downloading and using. + +### libxml2 + +MIT + +http://xmlsoft.org/ + + Except where otherwise noted in the source code (e.g. the files hash.c, + list.c and the trio files, which are covered by a similar licence but + with different Copyright notices) all the files are: + + Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is fur- + nished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- + NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + +### libxslt + +MIT + +http://xmlsoft.org/libxslt/ + + Licence for libxslt except libexslt + ---------------------------------------------------------------------- + Copyright (C) 2001-2002 Daniel Veillard. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is fur- + nished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- + NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- + NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of Daniel Veillard shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from him. + + ---------------------------------------------------------------------- + + Licence for libexslt + ---------------------------------------------------------------------- + Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard. + All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is fur- + nished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- + NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- + NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the authors shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from him. + ---------------------------------------------------------------------- + + +### zlib + +zlib license + +http://www.zlib.net/zlib_license.html + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + +### libiconv + +LGPL + +https://www.gnu.org/software/libiconv/ + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + [This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + Licenses are intended to guarantee your freedom to share and change + free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some + specially designated Free Software Foundation software, and to any + other libraries whose authors decide to use it. You can use it for + your libraries, too. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + this service if you wish), that you receive source code or can get it + if you want it, that you can change the software or use pieces of it + in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid + anyone to deny you these rights or to ask you to surrender the rights. + These restrictions translate to certain responsibilities for you if + you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis + or for a fee, you must give the recipients all the rights that we gave + you. You must make sure that they, too, receive or can get the source + code. If you link a program with the library, you must provide + complete object files to the recipients so that they can relink them + with the library, after making changes to the library and recompiling + it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright + the library, and (2) offer you this license which gives you legal + permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain + that everyone understands that there is no warranty for this free + library. If the library is modified by someone else and passed on, we + want its recipients to know that what they have is not the original + version, so that any problems introduced by others will not reflect on + the original authors' reputations. + + Finally, any free program is threatened constantly by software + patents. We wish to avoid the danger that companies distributing free + software will individually obtain patent licenses, thus in effect + transforming the program into proprietary software. To prevent this, + we have made it clear that any patent must be licensed for everyone's + free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary + GNU General Public License, which was designed for utility programs. This + license, the GNU Library General Public License, applies to certain + designated libraries. This license is quite different from the ordinary + one; be sure to read it in full, and don't assume that anything in it is + the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that + they blur the distinction we usually make between modifying or adding to a + program and simply using it. Linking a program with a library, without + changing the library, is in some sense simply using the library, and is + analogous to running a utility program or application program. However, in + a textual and legal sense, the linked executable is a combined work, a + derivative of the original library, and the ordinary General Public License + treats it as such. + + Because of this blurred distinction, using the ordinary General + Public License for libraries did not effectively promote software + sharing, because most developers did not use the libraries. We + concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the + users of those programs of all benefit from the free status of the + libraries themselves. This Library General Public License is intended to + permit developers of non-free programs to use free libraries, while + preserving your freedom as a user of such programs to change the free + libraries that are incorporated in them. (We have not seen how to achieve + this as regards changes in header files, but we have achieved it as regards + changes in the actual functions of the Library.) The hope is that this + will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and + modification follow. Pay close attention to the difference between a + "work based on the library" and a "work that uses the library". The + former contains code derived from the library, while the latter only + works together with the library. + + Note that it is possible for a library to be covered by the ordinary + General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which + contains a notice placed by the copyright holder or other authorized + party saying it may be distributed under the terms of this Library + General Public License (also called "this License"). Each licensee is + addressed as "you". + + A "library" means a collection of software functions and/or data + prepared so as to be conveniently linked with application programs + (which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work + which has been distributed under these terms. A "work based on the + Library" means either the Library or any derivative work under + copyright law: that is to say, a work containing the Library or a + portion of it, either verbatim or with modifications and/or translated + straightforwardly into another language. (Hereinafter, translation is + included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for + making modifications to it. For a library, complete source code means + all the source code for all modules it contains, plus any associated + interface definition files, plus the scripts used to control compilation + and installation of the library. + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of + running a program using the Library is not restricted, and output from + such a program is covered only if its contents constitute a work based + on the Library (independent of the use of the Library in a tool for + writing it). Whether that is true depends on what the Library does + and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's + complete source code as you receive it, in any medium, provided that + you conspicuously and appropriately publish on each copy an + appropriate copyright notice and disclaimer of warranty; keep intact + all the notices that refer to this License and to the absence of any + warranty; and distribute a copy of this License along with the + Library. + + You may charge a fee for the physical act of transferring a copy, + and you may at your option offer warranty protection in exchange for a + fee. + + 2. You may modify your copy or copies of the Library or any portion + of it, thus forming a work based on the Library, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Library, + and can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based + on the Library, the distribution of the whole must be on the terms of + this License, whose permissions for other licensees extend to the + entire whole, and thus to each and every part regardless of who wrote + it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Library. + + In addition, mere aggregation of another work not based on the Library + with the Library (or with a work based on the Library) on a volume of + a storage or distribution medium does not bring the other work under + the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public + License instead of this License to a given copy of the Library. To do + this, you must alter all the notices that refer to this License, so + that they refer to the ordinary GNU General Public License, version 2, + instead of to this License. (If a newer version than version 2 of the + ordinary GNU General Public License has appeared, then you can specify + that version instead if you wish.) Do not make any other change in + these notices. + + Once this change is made in a given copy, it is irreversible for + that copy, so the ordinary GNU General Public License applies to all + subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of + the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or + derivative of it, under Section 2) in object code or executable form + under the terms of Sections 1 and 2 above provided that you accompany + it with the complete corresponding machine-readable source code, which + must be distributed under the terms of Sections 1 and 2 above on a + medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy + from a designated place, then offering equivalent access to copy the + source code from the same place satisfies the requirement to + distribute the source code, even though third parties are not + compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the + Library, but is designed to work with the Library by being compiled or + linked with it, is called a "work that uses the Library". Such a + work, in isolation, is not a derivative work of the Library, and + therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library + creates an executable that is a derivative of the Library (because it + contains portions of the Library), rather than a "work that uses the + library". The executable is therefore covered by this License. + Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file + that is part of the Library, the object code for the work may be a + derivative work of the Library even though the source code is not. + Whether this is true is especially significant if the work can be + linked without the Library, or if the work is itself a library. The + threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data + structure layouts and accessors, and small macros and small inline + functions (ten lines or less in length), then the use of the object + file is unrestricted, regardless of whether it is legally a derivative + work. (Executables containing this object code plus portions of the + Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may + distribute the object code for the work under the terms of Section 6. + Any executables containing that work also fall under Section 6, + whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or + link a "work that uses the Library" with the Library to produce a + work containing portions of the Library, and distribute that work + under terms of your choice, provided that the terms permit + modification of the work for the customer's own use and reverse + engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the + Library is used in it and that the Library and its use are covered by + this License. You must supply a copy of this License. If the work + during execution displays copyright notices, you must include the + copyright notice for the Library among them, as well as a reference + directing the user to the copy of this License. Also, you must do one + of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the + Library" must include any data and utility programs needed for + reproducing the executable from it. However, as a special exception, + the source code distributed need not include anything that is normally + distributed (in either source or binary form) with the major + components (compiler, kernel, and so on) of the operating system on + which the executable runs, unless that component itself accompanies + the executable. + + It may happen that this requirement contradicts the license + restrictions of other proprietary libraries that do not normally + accompany the operating system. Such a contradiction means you cannot + use both them and the Library together in an executable that you + distribute. + + 7. You may place library facilities that are a work based on the + Library side-by-side in a single library together with other library + facilities not covered by this License, and distribute such a combined + library, provided that the separate distribution of the work based on + the Library and of the other library facilities is otherwise + permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute + the Library except as expressly provided under this License. Any + attempt otherwise to copy, modify, sublicense, link with, or + distribute the Library is void, and will automatically terminate your + rights under this License. However, parties who have received copies, + or rights, from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Library or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Library (or any work based on the + Library), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the + Library), the recipient automatically receives a license from the + original licensor to copy, distribute, link with or modify the Library + subject to these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + You are not responsible for enforcing compliance by third parties to + this License. + + 11. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Library at all. For example, if a patent + license would not permit royalty-free redistribution of the Library by + all those who receive copies directly or indirectly through you, then + the only way you could satisfy both it and this License would be to + refrain entirely from distribution of the Library. + + If any portion of this section is held invalid or unenforceable under any + particular circumstance, the balance of the section is intended to apply, + and the section as a whole is intended to apply in other circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is willing + to distribute software through any other system and a licensee cannot + impose that choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Library under this License may add + an explicit geographical distribution limitation excluding those countries, + so that distribution is permitted only in or among countries not thus + excluded. In such case, this License incorporates the limitation as if + written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new + versions of the Library General Public License from time to time. + Such new versions will be similar in spirit to the present version, + but may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the Library + specifies a version number of this License which applies to it and + "any later version", you have the option of following the terms and + conditions either of that version or of any later version published by + the Free Software Foundation. If the Library does not specify a + license version number, you may choose any version ever published by + the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free + programs whose distribution conditions are incompatible with these, + write to the author to ask for permission. For software which is + copyrighted by the Free Software Foundation, write to the Free + Software Foundation; we sometimes make exceptions for this. Our + decision will be guided by the two goals of preserving the free status + of all derivatives of our free software and of promoting the sharing + and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR + OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE + LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME + THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY + AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU + FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE + LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING + RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A + FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF + SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest + possible use to the public, we recommend making it free software that + everyone can redistribute and change. You can do so by permitting + redistribution under these terms (or, alternatively, under the terms of the + ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is + safest to attach them to the start of each source file to most effectively + convey the exclusion of warranty; and each file should have at least the + "copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA + + Also add information on how to contact you by electronic and paper mail. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the library, if + necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + + That's all there is to it! + + +### isorelax + +MIT + +http://iso-relax.sourceforge.net/ + + Copyright (c) 2001-2002, SourceForge ISO-RELAX Project (ASAMI + Tomoharu, Daisuke Okajima, Kohsuke Kawaguchi, and MURATA Makoto) + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +### jing + +BSD-3-Clause + +http://www.thaiopensource.com/relaxng/jing.html + + Copyright (c) 2001-2003 Thai Open Source Software Center Ltd + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the Thai Open Source Software Center Ltd nor + the names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + +### nekodtd + +Apache 1.0-derived + +https://people.apache.org/~andyc/neko/doc/dtd/ + + The CyberNeko Software License, Version 1.0 + + (C) Copyright 2002-2005, Andy Clark. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. The end-user documentation included with the redistribution, + if any, must include the following acknowledgment: + "This product includes software developed by Andy Clark." + Alternately, this acknowledgment may appear in the software itself, + if and wherever such third-party acknowledgments normally appear. + + 4. The names "CyberNeko" and "NekoHTML" must not be used to endorse + or promote products derived from this software without prior + written permission. For written permission, please contact + andyc@cyberneko.net. + + 5. Products derived from this software may not be called "CyberNeko", + nor may "CyberNeko" appear in their name, without prior written + permission of the author. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ==================================================================== + + This license is based on the Apache Software License, version 1.1. + +### nekohtml + +Apache 2.0 + +http://nekohtml.sourceforge.net/ + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +### xalan + +Apache 2.0 + +https://xml.apache.org/xalan-j/ + +covers xalan.jar and serializer.jar + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +### xerces + +Apache 2.0 + +https://xerces.apache.org/xerces2-j/ + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +### xml-apis + +Apache 2.0 + +https://xerces.apache.org/xml-commons/ + + Unless otherwise noted all files in XML Commons are covered under the + Apache License Version 2.0. Please read the LICENSE and NOTICE files. + + XML Commons contains some software and documentation that is covered + under a number of different licenses. This applies particularly to the + xml-commons/java/external/ directory. Most files under + xml-commons/java/external/ are covered under their respective + LICENSE.*.txt files; see the matching README.*.txt files for + descriptions. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/LICENSE.md new file mode 100644 index 000000000000..50b773dd8ceb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/LICENSE.md @@ -0,0 +1,9 @@ +The MIT License + +Copyright 2008 -- 2021 by Mike Dalessio, Aaron Patterson, Yoko Harada, Akinori MUSHA, John Shahid, Karol Bucek, Lars Kanis, Sergio Arbeo, Timothy Elliott, Nobuyoshi Nakada, Charles Nutter, Patrick Mahoney. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/README.md b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/README.md new file mode 100644 index 000000000000..1844ed6821ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/README.md @@ -0,0 +1,277 @@ +<div><img src="https://nokogiri.org/images/nokogiri-serif-black.png" align="right"/></div> + +# Nokogiri + +Nokogiri (鋸) makes it easy and painless to work with XML and HTML from Ruby. It provides a sensible, easy-to-understand API for reading, writing, modifying, and querying documents. It is fast and standards-compliant by relying on native parsers like libxml2 (C) and xerces (Java). + +## Guiding Principles + +Some guiding principles Nokogiri tries to follow: + +- be secure-by-default by treating all documents as **untrusted** by default +- be a **thin-as-reasonable layer** on top of the underlying parsers, and don't attempt to fix behavioral differences between the parsers + + +## Features Overview + +- DOM Parser for XML and HTML4 +- SAX Parser for XML and HTML4 +- Push Parser for XML and HTML4 +- Document search via XPath 1.0 +- Document search via CSS3 selectors, with some jquery-like extensions +- XSD Schema validation +- XSLT transformation +- "Builder" DSL for XML and HTML documents + + +## Status + +[![Concourse CI](https://ci.nokogiri.org/api/v1/teams/nokogiri-core/pipelines/nokogiri/jobs/cruby-2.7/badge)](https://ci.nokogiri.org/teams/nokogiri-core/pipelines/nokogiri) +[![Appveyor CI](https://ci.appveyor.com/api/projects/status/xj2pqwvlxwuwgr06/branch/main?svg=true)](https://ci.appveyor.com/project/flavorjones/nokogiri/branch/main) +[![Code Climate](https://codeclimate.com/github/sparklemotion/nokogiri.svg)](https://codeclimate.com/github/sparklemotion/nokogiri) +[![Test Coverage](https://api.codeclimate.com/v1/badges/59c67b0e8976027a45ad/test_coverage)](https://codeclimate.com/github/sparklemotion/nokogiri/test_coverage) + +[![Gem Version](https://badge.fury.io/rb/nokogiri.svg)](https://rubygems.org/gems/nokogiri) +[![SemVer compatibility](https://api.dependabot.com/badges/compatibility_score?dependency-name=nokogiri&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score/?dependency-name=nokogiri&package-manager=bundler) +[![Tidelift dependencies](https://tidelift.com/badges/package/rubygems/nokogiri)](https://tidelift.com/subscription/pkg/rubygems-nokogiri?utm_source=rubygems-nokogiri&utm_medium=referral&utm_campaign=readme) + + +## Support, Getting Help, and Reporting Issues + +All official documentation is posted at https://nokogiri.org (the source for which is at https://github.com/sparklemotion/nokogiri.org/, and we welcome contributions). + +Consider subscribing to [Tidelift][tidelift] which provides license assurances and timely security notifications for your open source dependencies, including Nokogiri. [Tidelift][tidelift] subscriptions also help the Nokogiri maintainers fund our [automated testing](https://ci.nokogiri.org) which in turn allows us to ship releases, bugfixes, and security updates more often. + + [tidelift]: https://tidelift.com/subscription/pkg/rubygems-nokogiri?utm_source=rubygems-nokogiri&utm_medium=referral&utm_campaign=readme + +### Reading + +Your first stops for learning more about Nokogiri should be: + +- [API Documentation](https://nokogiri.org/rdoc/index.html) +- [Tutorials](https://nokogiri.org/tutorials/toc.html) +- An excellent community-maintained [Cheat Sheet](https://github.com/sparklemotion/nokogiri/wiki/Cheat-sheet) + + +### Ask For Help + +There are a few ways to ask exploratory questions: + +- The Ruby Discord chat server is active at https://discord.gg/UyQnKrT +- The Nokogiri mailing list is active at https://groups.google.com/group/nokogiri-talk +- Open an issue using the "Help Request" template at https://github.com/sparklemotion/nokogiri/issues + +Please do not mail the maintainers at their personal addresses. + + +### Report A Bug + +The Nokogiri bug tracker is at https://github.com/sparklemotion/nokogiri/issues + +Please use the "Bug Report" or "Installation Difficulties" templates. + + +### Security and Vulnerability Reporting + +Please report vulnerabilities at https://hackerone.com/nokogiri + +Full information and description of our security policy is in [`SECURITY.md`](SECURITY.md) + + +### Semantic Versioning Policy + +Nokogiri follows [Semantic Versioning](https://semver.org/) (since 2017 or so). [![Dependabot's SemVer compatibility score for Nokogiri](https://api.dependabot.com/badges/compatibility_score?dependency-name=nokogiri&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score/?dependency-name=nokogiri&package-manager=bundler) + +We bump `Major.Minor.Patch` versions following this guidance: + +`Major`: (we've never done this) + +- Significant backwards-incompatible changes to the public API that would require rewriting existing application code. +- Some examples of backwards-incompatible changes we might someday consider for a Major release are at [`ROADMAP.md`](ROADMAP.md). + +`Minor`: + +- Features and bugfixes. +- Updating packaged libraries for non-security-related reasons. +- Dropping support for EOLed Ruby versions. [Some folks find this objectionable](https://github.com/sparklemotion/nokogiri/issues/1568), but [SemVer says this is OK if the public API hasn't changed](https://semver.org/#what-should-i-do-if-i-update-my-own-dependencies-without-changing-the-public-api). +- Backwards-incompatible changes to internal or private methods and constants. These are detailed in the "Changes" section of each changelog entry. + +`Patch`: + +- Bugfixes. +- Security updates. +- Updating packaged libraries for security-related reasons. + + +## Installation + +Requirements: + +- Ruby >= 2.5 +- JRuby >= 9.2.0.0 + + +### Native Gems: Faster, more reliable installation + +"Native gems" contain pre-compiled libraries for a specific machine architecture. On supported platforms, this removes the need for compiling the C extension and the packaged libraries, or for system dependencies to exist. This results in **much faster installation** and **more reliable installation**, which as you probably know are the biggest headaches for Nokogiri users. + +### Supported Platforms + +As of v1.11.0, Nokogiri ships pre-compiled, "native" gems for the following platforms: + +- Linux: `x86-linux` and `x86_64-linux` (req: `glibc >= 2.17`), including musl platforms like Alpine +- Darwin/MacOS: `x86_64-darwin` and `arm64-darwin` +- Windows: `x86-mingw32` and `x64-mingw32` +- Java: any platform running JRuby 9.2 or higher + +To determine whether your system supports one of these gems, look at the output of `bundle platform` or `ruby -e 'puts Gem::Platform.local.to_s'`. + +If you're on a supported platform, either `gem install` or `bundle install` should install a native gem without any additional action on your part. This installation should only take a few seconds, and your output should look something like: + +``` sh +$ gem install nokogiri +Fetching nokogiri-1.11.0-x86_64-linux.gem +Successfully installed nokogiri-1.11.0-x86_64-linux +1 gem installed +``` + + +### Other Installation Options + +Because Nokogiri is a C extension, it requires that you have a C compiler toolchain, Ruby development header files, and some system dependencies installed. + +The following may work for you if you have an appropriately-configured system: + +``` bash +gem install nokogiri +``` + +If you have any issues, please visit [Installing Nokogiri](https://nokogiri.org/tutorials/installing_nokogiri.html) for more complete instructions and troubleshooting. + + +## How To Use Nokogiri + +Nokogiri is a large library, and so it's challenging to briefly summarize it. We've tried to provide long, real-world examples at [Tutorials](https://nokogiri.org/tutorials/toc.html). + +### Parsing and Querying + +Here is example usage for parsing and querying a document: + +```ruby +#! /usr/bin/env ruby + +require 'nokogiri' +require 'open-uri' + +# Fetch and parse HTML document +doc = Nokogiri::HTML(URI.open('https://nokogiri.org/tutorials/installing_nokogiri.html')) + +# Search for nodes by css +doc.css('nav ul.menu li a', 'article h2').each do |link| + puts link.content +end + +# Search for nodes by xpath +doc.xpath('//nav//ul//li/a', '//article//h2').each do |link| + puts link.content +end + +# Or mix and match +doc.search('nav ul.menu li a', '//article//h2').each do |link| + puts link.content +end +``` + + +### Encoding + +Strings are always stored as UTF-8 internally. Methods that return +text values will always return UTF-8 encoded strings. Methods that +return a string containing markup (like `to_xml`, `to_html` and +`inner_html`) will return a string encoded like the source document. + +__WARNING__ + +Some documents declare one encoding, but actually use a different +one. In these cases, which encoding should the parser choose? + +Data is just a stream of bytes. Humans add meaning to that stream. Any +particular set of bytes could be valid characters in multiple +encodings, so detecting encoding with 100% accuracy is not +possible. `libxml2` does its best, but it can't be right all the time. + +If you want Nokogiri to handle the document encoding properly, your +best bet is to explicitly set the encoding. Here is an example of +explicitly setting the encoding to EUC-JP on the parser: + +```ruby + doc = Nokogiri.XML('<foo><bar /></foo>', nil, 'EUC-JP') +``` + + +## Technical Overview + +### Guiding Principles + +As noted above, two guiding principles of the software are: + +- be secure-by-default by treating all documents as **untrusted** by default +- be a **thin-as-reasonable layer** on top of the underlying parsers, and don't attempt to fix behavioral differences between the parsers + +Notably, despite all parsers being standards-compliant, there are behavioral inconsistencies between the parsers used in the CRuby and JRuby implementations, and Nokogiri does not and should not attempt to remove these inconsistencies. Instead, we surface these differences in the test suite when they are important/semantic; or we intentionally write tests to depend only on the important/semantic bits (omitting whitespace from regex matchers on results, for example). + + +### CRuby + +The Ruby (a.k.a., CRuby, MRI, YARV) implementation is a C extension that depends on libxml2 and libxslt (which in turn depend on zlib and possibly libiconv). + +These dependencies are met by default by Nokogiri's packaged versions of the libxml2 and libxslt source code, but a configuration option `--use-system-libraries` is provided to allow specification of alternative library locations. See [Installing Nokogiri](https://nokogiri.org/tutorials/installing_nokogiri.html) for full documentation. + +We provide native gems by pre-compiling libxml2 and libxslt (and potentially zlib and libiconv) and packaging them into the gem file. In this case, no compilation is necessary at installation time, which leads to faster and more reliable installation. + +See [`LICENSE-DEPENDENCIES.md`](LICENSE-DEPENDENCIES.md) for more information on which dependencies are provided in which native and source gems. + + +### JRuby + +The Java (a.k.a. JRuby) implementation is a Java extension that depends primarily on Xerces and NekoHTML for parsing, though additional dependencies are on `isorelax`, `nekodtd`, `jing`, `serializer`, `xalan-j`, and `xml-apis`. + +These dependencies are provided by pre-compiled jar files packaged in the `java` platform gem. + +See [`LICENSE-DEPENDENCIES.md`](LICENSE-DEPENDENCIES.md) for more information on which dependencies are provided in which native and source gems. + + +## Contributing + +See [`CONTRIBUTING.md`](CONTRIBUTING.md) for an intro guide to developing Nokogiri. + + +## Code of Conduct + +We've adopted the Contributor Covenant code of conduct, which you can read in full in [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). + + +## License + +This project is licensed under the terms of the MIT license. + +See this license at [`LICENSE.md`](LICENSE.md). + + +### Dependencies + +Some additional libraries may be distributed with your version of Nokogiri. Please see [`LICENSE-DEPENDENCIES.md`](LICENSE-DEPENDENCIES.md) for a discussion of the variations as well as the licenses thereof. + + +## Authors + +- Mike Dalessio +- Aaron Patterson +- Yoko Harada +- Akinori MUSHA +- John Shahid +- Karol Bucek +- Lars Kanis +- Sergio Arbeo +- Timothy Elliott +- Nobuyoshi Nakada diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/bin/nokogiri b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/bin/nokogiri new file mode 100644 index 000000000000..60b1eb3cea7c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/bin/nokogiri @@ -0,0 +1,118 @@ +#!/usr/bin/env ruby +require 'optparse' +require 'open-uri' +require 'uri' +require 'rubygems' +require 'nokogiri' +autoload :IRB, 'irb' + +parse_class = Nokogiri +encoding = nil + +# This module provides some tunables with the nokogiri CLI for use in +# your ~/.nokogirirc. +module Nokogiri::CLI + class << self + # Specify the console engine, defaulted to IRB. + # + # call-seq: + # require 'pry' + # Nokogiri::CLI.console = Pry + attr_writer :console + + def console + case @console + when Symbol + Kernel.const_get(@console) + else + @console + end + end + + attr_accessor :rcfile + end + + self.rcfile = File.expand_path('~/.nokogirirc') + self.console = :IRB +end + +opts = OptionParser.new do |opts| + opts.banner = "Nokogiri: an HTML, XML, SAX, and Reader parser" + opts.define_head "Usage: nokogiri <uri|path> [options]" + opts.separator "" + opts.separator "Examples:" + opts.separator " nokogiri https://www.ruby-lang.org/" + opts.separator " nokogiri ./public/index.html" + opts.separator " curl -s http://www.nokogiri.org | nokogiri -e'p $_.css(\"h1\").length'" + opts.separator "" + opts.separator "Options:" + + opts.on("--type type", "Parse as type: xml or html (default: auto)", [:xml, :html]) do |v| + parse_class = {:xml => Nokogiri::XML, :html => Nokogiri::HTML}[v] + end + + opts.on("-C file", "Specifies initialization file to load (default #{Nokogiri::CLI.rcfile})") do |v| + Nokogiri::CLI.rcfile = v + end + + opts.on("-E", "--encoding encoding", "Read as encoding (default: #{encoding || 'none'})") do |v| + encoding = v + end + + opts.on("-e command", "Specifies script from command-line.") do |v| + @script = v + end + + opts.on("--rng <uri|path>", "Validate using this rng file.") do |v| + @rng = open(v) {|f| Nokogiri::XML::RelaxNG(f)} + end + + opts.on_tail("-?", "--help", "Show this message") do + puts opts + exit + end + + opts.on_tail("-v", "--version", "Show version") do + puts Nokogiri::VersionInfo.instance.to_markdown + exit + end +end +opts.parse! + +url = ARGV.shift + +if url.to_s.strip.empty? && $stdin.tty? + puts opts + exit 1 +end + +if File.file?(Nokogiri::CLI.rcfile) + load Nokogiri::CLI.rcfile +end + +if url || $stdin.tty? + case uri = (URI(url) rescue url) + when URI::HTTP + @doc = parse_class.parse(uri.read, url, encoding) + else + @doc = parse_class.parse(open(url).read, nil, encoding) + end +else + @doc = parse_class.parse($stdin, nil, encoding) +end + +$_ = @doc + +if @rng + @rng.validate(@doc).each do |error| + puts error.message + end +else + if @script + eval @script, binding, '<main>' + else + puts "Your document is stored in @doc..." + Nokogiri::CLI.console.start + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/dependencies.yml b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/dependencies.yml new file mode 100644 index 000000000000..c24658bf0e2c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/dependencies.yml @@ -0,0 +1,74 @@ +libxml2: + version: "2.9.12" + sha256: "c8d6681e38c56f172892c85ddc0852e1fd4b53b4209e7f4ebf17f7e2eae71d92" + # manually verified checksum: + # + # $ gpg --verify libxml2-2.9.12.tar.gz.asc ports/archives/libxml2-2.9.12.tar.gz + # gpg: Signature made Thu 13 May 2021 02:59:16 PM EDT + # gpg: using RSA key DB46681BB91ADCEA170FA2D415588B26596BEA5D + # gpg: Good signature from "Daniel Veillard (Red Hat work email) <veillard@redhat.com>" [unknown] + # gpg: aka "Daniel Veillard <Daniel.Veillard@w3.org>" [unknown] + # gpg: WARNING: This key is not certified with a trusted signature! + # gpg: There is no indication that the signature belongs to the owner. + # Primary key fingerprint: C744 15BA 7C9C 7F78 F02E 1DC3 4606 B8A5 DE95 BC1F + # Subkey fingerprint: DB46 681B B91A DCEA 170F A2D4 1558 8B26 596B EA5D + # + # using this pgp signature: + # + # -----BEGIN PGP SIGNATURE----- + # + # iQEzBAABCAAdFiEE20ZoG7ka3OoXD6LUFViLJllr6l0FAmCddwQACgkQFViLJllr + # 6l11LQgAioRTdfmcC+uK/7+6HPtF/3c5zkX6j8VGYuvFBwZ0jayqMRBAl++fcpjE + # JUU/JKebSZ/KCYjzyeOWK/i3Gq77iqm3UbZFB85rqu4a5P3gmj/4STWVyAx0KU3z + # G3jKqDhJOt7c0acXb5lh2DngfDa1dn/VGcQcIXsqplNxNr4ET7MnSJjZ3nlxYfW2 + # E5vWBdPCMUeXDBl6MjYvw9XnGGBLUAaEJWoFToG6jKmVf4GAd9nza20jj5dtbcJq + # QEOaSDKDr+f9h2NS8haOhJ9vOpy52PdeGzaFlbRkXarGXuAr8kITgATVs8FAqcgv + # MoVhmrO5r2hJf0dCM9fZoYqzpMfmNA== + # =KfJ9 + # -----END PGP SIGNATURE----- + # + +libxslt: + version: "1.1.34" + sha256: "98b1bd46d6792925ad2dfe9a87452ea2adebf69dcb9919ffd55bf926a7f93f7f" + # manually verified checksum: + # + # $ gpg --verify ~/Downloads/libxslt-1.1.34.tar.gz.asc ports/archives/libxslt-1.1.34.tar.gz + # gpg: Signature made Wed 30 Oct 2019 04:02:48 PM EDT + # gpg: using RSA key DB46681BB91ADCEA170FA2D415588B26596BEA5D + # gpg: Good signature from "Daniel Veillard (Red Hat work email) <veillard@redhat.com>" [unknown] + # gpg: aka "Daniel Veillard <Daniel.Veillard@w3.org>" [unknown] + # gpg: WARNING: This key is not certified with a trusted signature! + # gpg: There is no indication that the signature belongs to the owner. + # Primary key fingerprint: C744 15BA 7C9C 7F78 F02E 1DC3 4606 B8A5 DE95 BC1F + # Subkey fingerprint: DB46 681B B91A DCEA 170F A2D4 1558 8B26 596B EA5D + # + # using this pgp signature: + # + # -----BEGIN PGP SIGNATURE----- + # + # iQEzBAABCAAdFiEE20ZoG7ka3OoXD6LUFViLJllr6l0FAl257GgACgkQFViLJllr + # 6l2vVggAjJEHmASiS56SxhPOsGqbfBihM66gQFoIymQfMu2430N1GSTkLsfbkJO8 + # 8yBX11NjzK/m9uxwshMW3rVCU7EpL3PUimN3reXdPiQj9hAOAWF1V3BZNevbQC2E + # FCIraioukaidf8sjUG4/sGpK/gOcP/3hYoN0HUoBigCNJjDqhijxM3M3GJJtCASp + # jL4CQbs2OmxW8ixOZbuWEESvFFHUgYRsdZjRVN+GRfSOvJjxypurmYwQ3RjO7JxL + # 2FY8qKQ+xpeID8NV8F5OUEvWBjk1QS133VTqBZNlONdnEtV/og6jNu5k0O/Kvhup + # caR+8TMErOcLr9OgDklO6DoYyAsf9Q== + # =g4i4 + # -----END PGP SIGNATURE----- + # + +zlib: + version: "1.2.11" + sha256: "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1" + # SHA-256 hash provided on http://zlib.net/ + +libiconv: + version: "1.15" + sha256: "ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc8913178" + # gpg: Signature made Fri Feb 3 00:38:12 2017 CET + # gpg: using RSA key 4F494A942E4616C2 + # gpg: Good signature from "Bruno Haible (Open Source Development) <bruno@clisp.org>" [unknown] + # gpg: WARNING: This key is not certified with a trusted signature! + # gpg: There is no indication that the signature belongs to the owner. + # Primary key fingerprint: 68D9 4D8A AEEA D48A E7DC 5B90 4F49 4A94 2E46 16C2 diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/depend b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/depend new file mode 100644 index 000000000000..61659f78644a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/depend @@ -0,0 +1,37 @@ +# -*-makefile-*- +# DO NOT DELETE + +html_document.o: ./nokogiri.h +html_element_description.o: ./nokogiri.h +html_entity_lookup.o: ./nokogiri.h +html_sax_parser_context.o: ./nokogiri.h +html_sax_push_parser.o: ./nokogiri.h +libxml2_backwards_compat.o: ./nokogiri.h +nokogiri.o: ./nokogiri.h +test_global_handlers.o: ./nokogiri.h +xml_attr.o: ./nokogiri.h +xml_attribute_decl.o: ./nokogiri.h +xml_cdata.o: ./nokogiri.h +xml_comment.o: ./nokogiri.h +xml_document.o: ./nokogiri.h +xml_document_fragment.o: ./nokogiri.h +xml_dtd.o: ./nokogiri.h +xml_element_content.o: ./nokogiri.h +xml_element_decl.o: ./nokogiri.h +xml_encoding_handler.o: ./nokogiri.h +xml_entity_decl.o: ./nokogiri.h +xml_entity_reference.o: ./nokogiri.h +xml_namespace.o: ./nokogiri.h +xml_node.o: ./nokogiri.h +xml_node_set.o: ./nokogiri.h +xml_processing_instruction.o: ./nokogiri.h +xml_reader.o: ./nokogiri.h +xml_relax_ng.o: ./nokogiri.h +xml_sax_parser.o: ./nokogiri.h +xml_sax_parser_context.o: ./nokogiri.h +xml_sax_push_parser.o: ./nokogiri.h +xml_schema.o: ./nokogiri.h +xml_syntax_error.o: ./nokogiri.h +xml_text.o: ./nokogiri.h +xml_xpath_context.o: ./nokogiri.h +xslt_stylesheet.o: ./nokogiri.h diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/extconf.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/extconf.rb new file mode 100644 index 000000000000..b08c3ced1fdc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/extconf.rb @@ -0,0 +1,906 @@ +# frozen_string_literal: true +ENV['RC_ARCHS'] = '' if RUBY_PLATFORM =~ /darwin/ + +require "mkmf" +require "rbconfig" +require "fileutils" +require "shellwords" +require "pathname" + +# helpful constants +PACKAGE_ROOT_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..', '..')) +REQUIRED_LIBXML_VERSION = "2.6.21" +RECOMMENDED_LIBXML_VERSION = "2.9.3" + +# The gem version constraint in the Rakefile is not respected at install time. +# Keep this version in sync with the one in the Rakefile ! +REQUIRED_MINI_PORTILE_VERSION = "~> 2.5.0" +REQUIRED_PKG_CONFIG_VERSION = "~> 1.1" + +# Keep track of what versions of what libraries we build against +OTHER_LIBRARY_VERSIONS = {} + +NOKOGIRI_HELP_MESSAGE = <<~HELP + USAGE: ruby #{$0} [options] + + Flags that are always valid: + + --use-system-libraries + --enable-system-libraries + Use system libraries instead of building and using the packaged libraries. + + --disable-system-libraries + Use the packaged libraries, and ignore the system libraries. This is the default on most + platforms, and overrides `--use-system-libraries` and the environment variable + `NOKOGIRI_USE_SYSTEM_LIBRARIES`. + + --disable-clean + Do not clean out intermediate files after successful build. + + --prevent-strip + Take steps to prevent stripping the symbol table and debugging info from the shared + library, potentially overriding RbConfig's CFLAGS/LDFLAGS/DLDFLAGS. + + + Flags only used when using system libraries: + + General: + + --with-opt-dir=DIRECTORY + Look for headers and libraries in DIRECTORY. + + --with-opt-lib=DIRECTORY + Look for libraries in DIRECTORY. + + --with-opt-include=DIRECTORY + Look for headers in DIRECTORY. + + + Related to zlib: + + --with-zlib-dir=DIRECTORY + Look for zlib headers and library in DIRECTORY. + + --with-zlib-lib=DIRECTORY + Look for zlib library in DIRECTORY. + + --with-zlib-include=DIRECTORY + Look for zlib headers in DIRECTORY. + + + Related to iconv: + + --with-iconv-dir=DIRECTORY + Look for iconv headers and library in DIRECTORY. + + --with-iconv-lib=DIRECTORY + Look for iconv library in DIRECTORY. + + --with-iconv-include=DIRECTORY + Look for iconv headers in DIRECTORY. + + + Related to libxml2: + + --with-xml2-dir=DIRECTORY + Look for xml2 headers and library in DIRECTORY. + + --with-xml2-lib=DIRECTORY + Look for xml2 library in DIRECTORY. + + --with-xml2-include=DIRECTORY + Look for xml2 headers in DIRECTORY. + + + Related to libxslt: + + --with-xslt-dir=DIRECTORY + Look for xslt headers and library in DIRECTORY. + + --with-xslt-lib=DIRECTORY + Look for xslt library in DIRECTORY. + + --with-xslt-include=DIRECTORY + Look for xslt headers in DIRECTORY. + + + Related to libexslt: + + --with-exslt-dir=DIRECTORY + Look for exslt headers and library in DIRECTORY. + + --with-exslt-lib=DIRECTORY + Look for exslt library in DIRECTORY. + + --with-exslt-include=DIRECTORY + Look for exslt headers in DIRECTORY. + + + Flags only used when building and using the packaged libraries: + + --disable-static + Do not statically link packaged libraries, instead use shared libraries. + + --enable-cross-build + Enable cross-build mode. (You probably do not want to set this manually.) + + + Environment variables used: + + NOKOGIRI_USE_SYSTEM_LIBRARIES + Equivalent to `--enable-system-libraries` when set, even if nil or blank. + + CC + Use this path to invoke the compiler instead of `RbConfig::CONFIG['CC']` + + CPPFLAGS + If this string is accepted by the C preprocessor, add it to the flags passed to the C preprocessor + + CFLAGS + If this string is accepted by the compiler, add it to the flags passed to the compiler + + LDFLAGS + If this string is accepted by the linker, add it to the flags passed to the linker + + LIBS + Add this string to the flags passed to the linker +HELP + +# +# utility functions +# +def config_clean? + enable_config('clean', true) +end + +def config_static? + default_static = !truffle? + enable_config("static", default_static) +end + +def config_cross_build? + enable_config("cross-build") +end + +def config_system_libraries? + enable_config("system-libraries", ENV.key?("NOKOGIRI_USE_SYSTEM_LIBRARIES")) do |_, default| + arg_config('--use-system-libraries', default) + end +end + +def windows? + RbConfig::CONFIG['target_os'] =~ /mingw32|mswin/ +end + +def solaris? + RbConfig::CONFIG['target_os'] =~ /solaris/ +end + +def darwin? + RbConfig::CONFIG['target_os'] =~ /darwin/ +end + +def openbsd? + RbConfig::CONFIG['target_os'] =~ /openbsd/ +end + +def aix? + RbConfig::CONFIG["target_os"] =~ /aix/ +end + +def nix? + !(windows? || solaris? || darwin?) +end + +def truffle? + ::RUBY_ENGINE == 'truffleruby' +end + +def concat_flags(*args) + args.compact.join(" ") +end + +def local_have_library(lib, func = nil, headers = nil) + have_library(lib, func, headers) || have_library("lib#{lib}", func, headers) +end + +LOCAL_PACKAGE_RESPONSE = Object.new +def LOCAL_PACKAGE_RESPONSE.%(package) + package ? "yes: #{package}" : "no" +end + +# wrapper around MakeMakefil#pkg_config and the PKGConfig gem +def try_package_configuration(pc) + unless ENV.key?("NOKOGIRI_TEST_PKG_CONFIG_GEM") + # try MakeMakefile#pkg_config, which uses the system utility `pkg-config`. + return if checking_for("#{pc} using `pkg_config`", LOCAL_PACKAGE_RESPONSE) do + pkg_config(pc) + end + end + + # `pkg-config` probably isn't installed, which appears to be the case for lots of freebsd systems. + # let's fall back to the pkg-config gem, which knows how to parse .pc files, and wrap it with the + # same logic as MakeMakefile#pkg_config + begin + require 'rubygems' + gem('pkg-config', REQUIRED_PKG_CONFIG_VERSION) + require 'pkg-config' + + checking_for("#{pc} using pkg-config gem version #{PKGConfig::VERSION}", LOCAL_PACKAGE_RESPONSE) do + if PKGConfig.have_package(pc) + cflags = PKGConfig.cflags(pc) + ldflags = PKGConfig.libs_only_L(pc) + libs = PKGConfig.libs_only_l(pc) + + Logging.message("pkg-config gem found package configuration for %s\n", pc) + Logging.message("cflags: %s\nldflags: %s\nlibs: %s\n\n", cflags, ldflags, libs) + + [cflags, ldflags, libs] + end + end + rescue LoadError + message("Please install either the `pkg-config` utility or the `pkg-config` rubygem.\n") + end +end + +# set up mkmf to link against the library if we can find it +def have_package_configuration(opt: nil, pc: nil, lib:, func:, headers:) + if opt + dir_config(opt) + dir_config("opt") + end + + # see if we have enough path info to do this without trying any harder + unless ENV.key?("NOKOGIRI_TEST_PKG_CONFIG") + return true if local_have_library(lib, func, headers) + end + + try_package_configuration(pc) if pc + + # verify that we can compile and link against the library + local_have_library(lib, func, headers) +end + +def ensure_package_configuration(opt: nil, pc: nil, lib:, func:, headers:) + have_package_configuration(opt: opt, pc: pc, lib: lib, func: func, headers: headers) || + abort_could_not_find_library(lib) +end + +def ensure_func(func, headers = nil) + have_func(func, headers) || abort_could_not_find_library(func) +end + +def preserving_globals + values = [$arg_config, $INCFLAGS, $CFLAGS, $CPPFLAGS, $LDFLAGS, $DLDFLAGS, $LIBPATH, $libs].map(&:dup) + yield +ensure + $arg_config, $INCFLAGS, $CFLAGS, $CPPFLAGS, $LDFLAGS, $DLDFLAGS, $LIBPATH, $libs = values +end + +def abort_could_not_find_library(lib) + abort("-----\n#{caller[0]}\n#{lib} is missing. Please locate mkmf.log to investigate how it is failing.\n-----") +end + +def chdir_for_build + # When using rake-compiler-dock on Windows, the underlying Virtualbox shared + # folders don't support symlinks, but libiconv expects it for a build on + # Linux. We work around this limitation by using the temp dir for cooking. + build_dir = ENV['RCD_HOST_RUBY_PLATFORM'].to_s =~ /mingw|mswin|cygwin/ ? '/tmp' : '.' + Dir.chdir(build_dir) do + yield + end +end + +def sh_export_path(path) + # because libxslt 1.1.29 configure.in uses AC_PATH_TOOL which treats ":" + # as a $PATH separator, we need to convert windows paths from + # + # C:/path/to/foo + # + # to + # + # /C/path/to/foo + # + # which is sh-compatible, in order to find things properly during + # configuration + return path unless windows? + + match = Regexp.new("^([A-Z]):(/.*)").match(path) + if match && match.length == 3 + return File.join("/", match[1], match[2]) + end + + path +end + +def libflag_to_filename(ldflag) + case ldflag + when /\A-l(.+)/ + "lib#{Regexp.last_match(1)}.#{$LIBEXT}" + end +end + +def have_libxml_headers?(version = nil) + source = if version.nil? + <<~SRC + #include <libxml/xmlversion.h> + SRC + else + version_int = format("%d%2.2d%2.2d", *version.split(".")) + <<~SRC + #include <libxml/xmlversion.h> + #if LIBXML_VERSION < #{version_int} + # error libxml2 is older than #{version} + #endif + SRC + end + + try_cpp(source) +end + +def try_link_iconv(using = nil) + checking_for(using ? "iconv using #{using}" : 'iconv') do + ['', '-liconv'].any? do |opt| + preserving_globals do + yield if block_given? + + try_link(<<~'SRC', opt) + #include <stdlib.h> + #include <iconv.h> + int main(void) + { + iconv_t cd = iconv_open("", ""); + iconv(cd, NULL, NULL, NULL, NULL); + return EXIT_SUCCESS; + } + SRC + end + end + end +end + +def iconv_configure_flags + # give --with-iconv-dir and --with-opt-dir first priority + ["iconv", "opt"].each do |target| + config = preserving_globals { dir_config(target) } + next unless config.any? && try_link_iconv("--with-#{target}-* flags") { dir_config(target) } + idirs, ldirs = config.map do |dirs| + Array(dirs).flat_map do |dir| + dir.split(File::PATH_SEPARATOR) + end if dirs + end + + return [ + '--with-iconv=yes', + *("CPPFLAGS=#{idirs.map { |dir| '-I' + dir }.join(' ')}" if idirs), + *("LDFLAGS=#{ldirs.map { |dir| '-L' + dir }.join(' ')}" if ldirs), + ] + end + + if try_link_iconv + return ['--with-iconv=yes'] + end + + config = preserving_globals { have_package_configuration('libiconv') } + if config && try_link_iconv('pkg-config libiconv') { have_package_configuration('libiconv') } + cflags, ldflags, libs = config + + return [ + '--with-iconv=yes', + "CPPFLAGS=#{cflags}", + "LDFLAGS=#{ldflags}", + "LIBS=#{libs}", + ] + end + + abort_could_not_find_library("libiconv") +end + +def process_recipe(name, version, static_p, cross_p) + require 'rubygems' + gem('mini_portile2', REQUIRED_MINI_PORTILE_VERSION) + require 'mini_portile2' + message("Using mini_portile version #{MiniPortile::VERSION}\n") + + if name != "libxml2" && name != "libxslt" + OTHER_LIBRARY_VERSIONS[name] = version + end + + MiniPortile.new(name, version).tap do |recipe| + recipe.target = File.join(PACKAGE_ROOT_DIR, "ports") + # Prefer host_alias over host in order to use i586-mingw32msvc as + # correct compiler prefix for cross build, but use host if not set. + recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"] + recipe.patch_files = Dir[File.join(PACKAGE_ROOT_DIR, "patches", name, "*.patch")].sort + recipe.configure_options << "--libdir=#{File.join(recipe.path, 'lib')}" + + yield recipe + + env = Hash.new do |hash, key| + hash[key] = (ENV[key]).to_s + end + + recipe.configure_options.flatten! + + recipe.configure_options.delete_if do |option| + case option + when /\A(\w+)=(.*)\z/ + env[Regexp.last_match(1)] = if env.key?(Regexp.last_match(1)) + concat_flags(env[Regexp.last_match(1)], Regexp.last_match(2)) + else + Regexp.last_match(2) + end + true + else + false + end + end + + if static_p + recipe.configure_options += [ + "--disable-shared", + "--enable-static", + ] + env["CFLAGS"] = concat_flags(env["CFLAGS"], "-fPIC") + else + recipe.configure_options += [ + "--enable-shared", + "--disable-static", + ] + end + + if cross_p + recipe.configure_options += [ + "--target=#{recipe.host}", + "--host=#{recipe.host}", + ] + end + + if RbConfig::CONFIG['target_cpu'] == 'universal' + %w[CFLAGS LDFLAGS].each do |key| + unless env[key].include?('-arch') + env[key] = concat_flags(env[key], RbConfig::CONFIG['ARCH_FLAG']) + end + end + end + + recipe.configure_options += env.map do |key, value| + "#{key}=#{value.strip}" + end + + checkpoint = "#{recipe.target}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed" + if File.exist?(checkpoint) + message("Building Nokogiri with a packaged version of #{name}-#{version}.\n") + else + message(<<~EOM) + ---------- IMPORTANT NOTICE ---------- + Building Nokogiri with a packaged version of #{name}-#{version}. + Configuration options: #{recipe.configure_options.shelljoin} + EOM + + unless recipe.patch_files.empty? + message("The following patches are being applied:\n") + + recipe.patch_files.each do |patch| + message(" - %s\n" % File.basename(patch)) + end + end + + message(<<~EOM) + + The Nokogiri maintainers intend to provide timely security updates, but if + this is a concern for you and want to use your OS/distro system library + instead, then abort this installation process and install nokogiri as + instructed at: + + https://nokogiri.org/tutorials/installing_nokogiri.html#installing-using-standard-system-libraries + + EOM + + message(<<~EOM) if name == 'libxml2' + Note, however, that nokogiri cannot guarantee compatiblity with every + version of libxml2 that may be provided by OS/package vendors. + + EOM + + chdir_for_build do + recipe.cook + end + FileUtils.touch(checkpoint) + end + recipe.activate + end +end + +def copy_packaged_libraries_headers(to_path:, from_recipes:) + FileUtils.rm_rf(to_path, secure: true) + FileUtils.mkdir(to_path) + from_recipes.each do |recipe| + FileUtils.cp_r(Dir[File.join(recipe.path, 'include/*')], to_path) + end +end + +def do_help + print(NOKOGIRI_HELP_MESSAGE) + exit!(0) +end + +def do_clean + root = Pathname(PACKAGE_ROOT_DIR) + pwd = Pathname(Dir.pwd) + + # Skip if this is a development work tree + unless (root + '.git').exist? + message("Cleaning files only used during build.\n") + + # (root + 'tmp') cannot be removed at this stage because + # nokogiri.so is yet to be copied to lib. + + # clean the ports build directory + Pathname.glob(pwd.join('tmp', '*', 'ports')) do |dir| + FileUtils.rm_rf(dir, verbose: true) + end + + if config_static? + # ports installation can be safely removed if statically linked. + FileUtils.rm_rf(root + 'ports', verbose: true) + else + FileUtils.rm_rf(root + 'ports' + 'archives', verbose: true) + end + end + + exit!(0) +end + +# +# main +# +do_help if arg_config('--help') +do_clean if arg_config('--clean') + +if openbsd? && !config_system_libraries? + if %x(#{ENV['CC'] || '/usr/bin/cc'} -v 2>&1) !~ /clang/ + (ENV['CC'] ||= find_executable('egcc')) || + abort("Please install gcc 4.9+ from ports using `pkg_add -v gcc`") + end + append_cppflags "-I/usr/local/include" +end + +if ENV['CC'] + RbConfig::CONFIG['CC'] = RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] +end + +# use same c compiler for libxml and libxslt +ENV['CC'] = RbConfig::CONFIG['CC'] + +if arg_config('--prevent-strip') + old_cflags = $CFLAGS.split.join(" ") + old_ldflags = $LDFLAGS.split.join(" ") + old_dldflags = $DLDFLAGS.split.join(" ") + $CFLAGS = $CFLAGS.split.reject { |flag| flag == "-s" }.join(" ") + $LDFLAGS = $LDFLAGS.split.reject { |flag| flag == "-s" }.join(" ") + $DLDFLAGS = $DLDFLAGS.split.reject { |flag| flag == "-s" }.join(" ") + puts "Prevent stripping by removing '-s' from $CFLAGS" if old_cflags != $CFLAGS + puts "Prevent stripping by removing '-s' from $LDFLAGS" if old_ldflags != $LDFLAGS + puts "Prevent stripping by removing '-s' from $DLDFLAGS" if old_dldflags != $DLDFLAGS +end + +# adopt environment config +append_cflags(ENV["CFLAGS"].split) unless ENV["CFLAGS"].nil? +append_cppflags(ENV["CPPFLAGS"].split) unless ENV["CPPFLAGS"].nil? +append_ldflags(ENV["LDFLAGS"].split) unless ENV["LDFLAGS"].nil? +$LIBS = concat_flags($LIBS, ENV["LIBS"]) + +# always include debugging information +append_cflags("-g") + +# we use at least one inline function in the C extension +append_cflags("-Winline") + +# good to have no matter what Ruby was compiled with +append_cflags("-Wmissing-noreturn") + +# handle clang variations, see #1101 +append_cflags("-Wno-error=unused-command-line-argument-hard-error-in-future") if darwin? + +# these tend to be noisy, but on occasion useful during development +# append_cflags(["-Wcast-qual", "-Wwrite-strings"]) + +# Add SDK-specific include path for macOS and brew versions before v2.2.12 (2020-04-08) [#1851, #1801] +macos_mojave_sdk_include_path = "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libxml2" +if config_system_libraries? && darwin? && Dir.exist?(macos_mojave_sdk_include_path) + append_cppflags("-I#{macos_mojave_sdk_include_path}") +end + +# Work around a character escaping bug in MSYS by passing an arbitrary double-quoted parameter to gcc. +# See https://sourceforge.net/p/mingw/bugs/2142 +append_cppflags(' "-Idummypath"') if windows? + +if config_system_libraries? + message "Building nokogiri using system libraries.\n" + ensure_package_configuration(opt: "zlib", pc: "zlib", lib: "z", + headers: "zlib.h", func: "gzdopen") + ensure_package_configuration(opt: "xml2", pc: "libxml-2.0", lib: "xml2", + headers: "libxml/parser.h", func: "xmlParseDoc") + ensure_package_configuration(opt: "xslt", pc: "libxslt", lib: "xslt", + headers: "libxslt/xslt.h", func: "xsltParseStylesheetDoc") + ensure_package_configuration(opt: "exslt", pc: "libexslt", lib: "exslt", + headers: "libexslt/exslt.h", func: "exsltFuncRegister") + + have_libxml_headers?(REQUIRED_LIBXML_VERSION) || + abort("ERROR: libxml2 version #{REQUIRED_LIBXML_VERSION} or later is required!") + have_libxml_headers?(RECOMMENDED_LIBXML_VERSION) || + warn("WARNING: libxml2 version #{RECOMMENDED_LIBXML_VERSION} or later is highly recommended, but proceeding anyway.") + +else + message "Building nokogiri using packaged libraries.\n" + + static_p = config_static? + message "Static linking is #{static_p ? 'enabled' : 'disabled'}.\n" + + cross_build_p = config_cross_build? + message "Cross build is #{cross_build_p ? 'enabled' : 'disabled'}.\n" + + require 'yaml' + dependencies = YAML.load_file(File.join(PACKAGE_ROOT_DIR, "dependencies.yml")) + + dir_config('zlib') + + if cross_build_p || windows? + zlib_recipe = process_recipe("zlib", dependencies["zlib"]["version"], static_p, cross_build_p) do |recipe| + recipe.files = [{ + url: "http://zlib.net/fossils/#{recipe.name}-#{recipe.version}.tar.gz", + sha256: dependencies["zlib"]["sha256"], + }] + if windows? + class << recipe + attr_accessor :cross_build_p + + def configure + Dir.chdir(work_path) do + mk = File.read('win32/Makefile.gcc') + File.open('win32/Makefile.gcc', 'wb') do |f| + f.puts "BINARY_PATH = #{path}/bin" + f.puts "LIBRARY_PATH = #{path}/lib" + f.puts "INCLUDE_PATH = #{path}/include" + mk.sub!(/^PREFIX\s*=\s*$/, "PREFIX = #{host}-") if cross_build_p + f.puts mk + end + end + end + + def configured? + Dir.chdir(work_path) do + !!(File.read('win32/Makefile.gcc') =~ /^BINARY_PATH/) + end + end + + def compile + execute("compile", "make -f win32/Makefile.gcc") + end + + def install + execute("install", "make -f win32/Makefile.gcc install") + end + end + recipe.cross_build_p = cross_build_p + else + class << recipe + def configure + cflags = concat_flags(ENV["CFLAGS"], "-fPIC", "-g") + execute("configure", +["env", "CHOST=#{host}", "CFLAGS=#{cflags}", "./configure", "--static", configure_prefix]) + end + + def compile + if host =~ /darwin/ + execute("compile", "make AR=#{host}-libtool") + else + super + end + end + end + end + end + + unless nix? + libiconv_recipe = process_recipe("libiconv", dependencies["libiconv"]["version"], static_p, +cross_build_p) do |recipe| + recipe.files = [{ + url: "http://ftp.gnu.org/pub/gnu/libiconv/#{recipe.name}-#{recipe.version}.tar.gz", + sha256: dependencies["libiconv"]["sha256"], + }] + + cflags = concat_flags(ENV["CFLAGS"], "-O2", "-U_FORTIFY_SOURCE", "-g") + + recipe.configure_options += [ + "CPPFLAGS=-Wall", + "CFLAGS=#{cflags}", + "CXXFLAGS=#{cflags}", + "LDFLAGS=", + ] + end + end + elsif darwin? && !have_header('iconv.h') + abort(<<~EOM.chomp) + ----- + The file "iconv.h" is missing in your build environment, + which means you haven't installed Xcode Command Line Tools properly. + + To install Command Line Tools, try running `xcode-select --install` on + terminal and follow the instructions. If it fails, open Xcode.app, + select from the menu "Xcode" - "Open Developer Tool" - "More Developer + Tools" to open the developer site, download the installer for your OS + version and run it. + ----- + EOM + end + + unless windows? + preserving_globals { local_have_library('z', 'gzdopen', 'zlib.h') } || + abort('zlib is missing; necessary for building libxml2') + end + + libxml2_recipe = process_recipe("libxml2", dependencies["libxml2"]["version"], static_p, cross_build_p) do |recipe| + recipe.files = [{ + url: "http://xmlsoft.org/sources/#{recipe.name}-#{recipe.version}.tar.gz", + sha256: dependencies["libxml2"]["sha256"], + }] + + cflags = concat_flags(ENV["CFLAGS"], "-O2", "-U_FORTIFY_SOURCE", "-g") + + if zlib_recipe + recipe.configure_options << "--with-zlib=#{zlib_recipe.path}" + cflags = concat_flags(cflags, "-I#{zlib_recipe.path}/include") + end + + if libiconv_recipe + recipe.configure_options << "--with-iconv=#{libiconv_recipe.path}" + else + recipe.configure_options += iconv_configure_flags + end + + if darwin? && !cross_build_p + recipe.configure_options += ["RANLIB=/usr/bin/ranlib", "AR=/usr/bin/ar"] + end + + if windows? + cflags = concat_flags(cflags, "-ULIBXML_STATIC", "-DIN_LIBXML") + end + + recipe.configure_options += [ + "--without-python", + "--without-readline", + "--with-c14n", + "--with-debug", + "--with-threads", + "CFLAGS=#{cflags}", + ] + end + + libxslt_recipe = process_recipe("libxslt", dependencies["libxslt"]["version"], static_p, cross_build_p) do |recipe| + recipe.files = [{ + url: "http://xmlsoft.org/sources/#{recipe.name}-#{recipe.version}.tar.gz", + sha256: dependencies["libxslt"]["sha256"], + }] + + cflags = concat_flags(ENV["CFLAGS"], "-O2", "-U_FORTIFY_SOURCE", "-g") + + if darwin? && !cross_build_p + recipe.configure_options += ["RANLIB=/usr/bin/ranlib", "AR=/usr/bin/ar"] + end + + recipe.configure_options += [ + "--without-python", + "--without-crypto", + "--with-debug", + "--with-libxml-prefix=#{sh_export_path(libxml2_recipe.path)}", + "CFLAGS=#{cflags}", + ] + end + + append_cppflags("-DNOKOGIRI_PACKAGED_LIBRARIES") + append_cppflags("-DNOKOGIRI_PRECOMPILED_LIBRARIES") if cross_build_p + + $LIBPATH = ["#{zlib_recipe.path}/lib"] | $LIBPATH if zlib_recipe + $LIBPATH = ["#{libiconv_recipe.path}/lib"] | $LIBPATH if libiconv_recipe + + $libs = $libs.shellsplit.tap do |libs| + [libxml2_recipe, libxslt_recipe].each do |recipe| + libname = recipe.name[/\Alib(.+)\z/, 1] + File.join(recipe.path, "bin", "#{libname}-config").tap do |config| + # call config scripts explicit with 'sh' for compat with Windows + $CPPFLAGS = %x(sh #{config} --cflags).strip << ' ' << $CPPFLAGS + %x(sh #{config} --libs).strip.shellsplit.each do |arg| + case arg + when /\A-L(.+)\z/ + # Prioritize ports' directories + $LIBPATH = if Regexp.last_match(1).start_with?(PACKAGE_ROOT_DIR + '/') + [Regexp.last_match(1)] | $LIBPATH + else + $LIBPATH | [Regexp.last_match(1)] + end + when /\A-l./ + libs.unshift(arg) + else + $LDFLAGS << ' ' << arg.shellescape + end + end + end + + patches_string = recipe.patch_files.map { |path| File.basename(path) }.join(' ') + append_cppflags(%[-DNOKOGIRI_#{recipe.name.upcase}_PATCHES="\\\"#{patches_string}\\\""]) + + case libname + when 'xml2' + # xslt-config --libs or pkg-config libxslt --libs does not include + # -llzma, so we need to add it manually when linking statically. + if static_p && preserving_globals { local_have_library('lzma') } + # Add it at the end; GH #988 + libs << '-llzma' + end + when 'xslt' + # xslt-config does not have a flag to emit options including + # -lexslt, so add it manually. + libs.unshift('-lexslt') + end + end + end.shelljoin + + if static_p + $libs = $libs.shellsplit.map do |arg| + case arg + when '-lxml2' + File.join(libxml2_recipe.path, 'lib', libflag_to_filename(arg)) + when '-lxslt', '-lexslt' + File.join(libxslt_recipe.path, 'lib', libflag_to_filename(arg)) + else + arg + end + end.shelljoin + end + + ensure_func("xmlParseDoc", "libxml/parser.h") + ensure_func("xsltParseStylesheetDoc", "libxslt/xslt.h") + ensure_func("exsltFuncRegister", "libexslt/exslt.h") +end + +have_func('xmlHasFeature') || abort("xmlHasFeature() is missing.") # introduced in libxml 2.6.21 +have_func('xmlFirstElementChild') # introduced in libxml 2.7.3 +have_func('xmlRelaxNGSetParserStructuredErrors') # introduced in libxml 2.6.24 +have_func('xmlRelaxNGSetValidStructuredErrors') # introduced in libxml 2.6.21 +have_func('xmlSchemaSetValidStructuredErrors') # introduced in libxml 2.6.23 +have_func('xmlSchemaSetParserStructuredErrors') # introduced in libxml 2.6.23 + +have_func('vasprintf') + +other_library_versions_string = OTHER_LIBRARY_VERSIONS.map { |k, v| [k, v].join(":") }.join(",") +append_cppflags(%[-DNOKOGIRI_OTHER_LIBRARY_VERSIONS="\\\"#{other_library_versions_string}\\\""]) + +unless config_system_libraries? + if cross_build_p + # When precompiling native gems, copy packaged libraries' headers to ext/nokogiri/include + # These are packaged up by the cross-compiling callback in the ExtensionTask + copy_packaged_libraries_headers(to_path: File.join(PACKAGE_ROOT_DIR, "ext/nokogiri/include"), + from_recipes: [libxml2_recipe, libxslt_recipe]) + else + # When compiling during installation, install packaged libraries' header files into ext/nokogiri/include + copy_packaged_libraries_headers(to_path: "include", + from_recipes: [libxml2_recipe, libxslt_recipe]) + $INSTALLFILES << ["include/**/*.h", "$(rubylibdir)"] + end +end + +create_makefile('nokogiri/nokogiri') + +if config_clean? + # Do not clean if run in a development work tree. + File.open('Makefile', 'at') do |mk| + mk.print(<<~EOF) + + all: clean-ports + clean-ports: $(DLLIB) + \t-$(Q)$(RUBY) $(srcdir)/extconf.rb --clean --#{static_p ? 'enable' : 'disable'}-static + EOF + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_document.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_document.c new file mode 100644 index 000000000000..7462f854ef78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_document.c @@ -0,0 +1,166 @@ +#include <nokogiri.h> + +VALUE cNokogiriHtmlDocument ; + +static ID id_encoding_found; +static ID id_to_s; + +/* + * call-seq: + * new + * + * Create a new document + */ +static VALUE +rb_html_document_s_new(int argc, VALUE *argv, VALUE klass) +{ + VALUE uri, external_id, rest, rb_doc; + htmlDocPtr doc; + + rb_scan_args(argc, argv, "0*", &rest); + uri = rb_ary_entry(rest, (long)0); + external_id = rb_ary_entry(rest, (long)1); + + doc = htmlNewDoc( + RTEST(uri) ? (const xmlChar *)StringValueCStr(uri) : NULL, + RTEST(external_id) ? (const xmlChar *)StringValueCStr(external_id) : NULL + ); + rb_doc = noko_xml_document_wrap_with_init_args(klass, doc, argc, argv); + return rb_doc ; +} + +/* + * call-seq: + * read_io(io, url, encoding, options) + * + * Read the HTML document from +io+ with given +url+, +encoding+, + * and +options+. See Nokogiri::HTML.parse + */ +static VALUE +rb_html_document_s_read_io(VALUE klass, VALUE rb_io, VALUE rb_url, VALUE rb_encoding, VALUE rb_options) +{ + VALUE rb_doc; + VALUE rb_error_list = rb_ary_new(); + htmlDocPtr c_doc; + const char *c_url = NIL_P(rb_url) ? NULL : StringValueCStr(rb_url); + const char *c_encoding = NIL_P(rb_encoding) ? NULL : StringValueCStr(rb_encoding); + int options = NUM2INT(rb_options); + + xmlSetStructuredErrorFunc((void *)rb_error_list, Nokogiri_error_array_pusher); + + c_doc = htmlReadIO(noko_io_read, noko_io_close, (void *)rb_io, c_url, c_encoding, options); + + xmlSetStructuredErrorFunc(NULL, NULL); + + /* + * If EncodingFound has occurred in EncodingReader, make sure to do + * a cleanup and propagate the error. + */ + if (rb_respond_to(rb_io, id_encoding_found)) { + VALUE encoding_found = rb_funcall(rb_io, id_encoding_found, 0); + if (!NIL_P(encoding_found)) { + xmlFreeDoc(c_doc); + rb_exc_raise(encoding_found); + } + } + + if ((c_doc == NULL) || (!(options & XML_PARSE_RECOVER) && (RARRAY_LEN(rb_error_list) > 0))) { + VALUE rb_error ; + + xmlFreeDoc(c_doc); + + rb_error = rb_ary_entry(rb_error_list, 0); + if (rb_error == Qnil) { + rb_raise(rb_eRuntimeError, "Could not parse document"); + } else { + VALUE exception_message = rb_funcall(rb_error, id_to_s, 0); + exception_message = rb_str_concat(rb_str_new2("Parser without recover option encountered error or warning: "), + exception_message); + rb_exc_raise(rb_class_new_instance(1, &exception_message, cNokogiriXmlSyntaxError)); + } + + return Qnil; + } + + rb_doc = noko_xml_document_wrap(klass, c_doc); + rb_iv_set(rb_doc, "@errors", rb_error_list); + return rb_doc; +} + +/* + * call-seq: + * read_memory(string, url, encoding, options) + * + * Read the HTML document contained in +string+ with given +url+, +encoding+, + * and +options+. See Nokogiri::HTML.parse + */ +static VALUE +rb_html_document_s_read_memory(VALUE klass, VALUE rb_html, VALUE rb_url, VALUE rb_encoding, VALUE rb_options) +{ + VALUE rb_doc; + VALUE rb_error_list = rb_ary_new(); + htmlDocPtr c_doc; + const char *c_buffer = StringValuePtr(rb_html); + const char *c_url = NIL_P(rb_url) ? NULL : StringValueCStr(rb_url); + const char *c_encoding = NIL_P(rb_encoding) ? NULL : StringValueCStr(rb_encoding); + int html_len = (int)RSTRING_LEN(rb_html); + int options = NUM2INT(rb_options); + + xmlSetStructuredErrorFunc((void *)rb_error_list, Nokogiri_error_array_pusher); + + c_doc = htmlReadMemory(c_buffer, html_len, c_url, c_encoding, options); + + xmlSetStructuredErrorFunc(NULL, NULL); + + if ((c_doc == NULL) || (!(options & XML_PARSE_RECOVER) && (RARRAY_LEN(rb_error_list) > 0))) { + VALUE rb_error ; + + xmlFreeDoc(c_doc); + + rb_error = rb_ary_entry(rb_error_list, 0); + if (rb_error == Qnil) { + rb_raise(rb_eRuntimeError, "Could not parse document"); + } else { + VALUE exception_message = rb_funcall(rb_error, id_to_s, 0); + exception_message = rb_str_concat(rb_str_new2("Parser without recover option encountered error or warning: "), + exception_message); + rb_exc_raise(rb_class_new_instance(1, &exception_message, cNokogiriXmlSyntaxError)); + } + + return Qnil; + } + + rb_doc = noko_xml_document_wrap(klass, c_doc); + rb_iv_set(rb_doc, "@errors", rb_error_list); + return rb_doc; +} + +/* + * call-seq: + * type + * + * The type for this document + */ +static VALUE +rb_html_document_type(VALUE self) +{ + htmlDocPtr doc; + Data_Get_Struct(self, xmlDoc, doc); + return INT2NUM((long)doc->type); +} + +void +noko_init_html_document() +{ + assert(cNokogiriXmlDocument); + cNokogiriHtmlDocument = rb_define_class_under(mNokogiriHtml, "Document", cNokogiriXmlDocument); + + rb_define_singleton_method(cNokogiriHtmlDocument, "read_memory", rb_html_document_s_read_memory, 4); + rb_define_singleton_method(cNokogiriHtmlDocument, "read_io", rb_html_document_s_read_io, 4); + rb_define_singleton_method(cNokogiriHtmlDocument, "new", rb_html_document_s_new, -1); + + rb_define_method(cNokogiriHtmlDocument, "type", rb_html_document_type, 0); + + id_encoding_found = rb_intern("encoding_found"); + id_to_s = rb_intern("to_s"); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_element_description.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_element_description.c new file mode 100644 index 000000000000..2a5f82ed74bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_element_description.c @@ -0,0 +1,292 @@ +#include <nokogiri.h> + +VALUE cNokogiriHtmlElementDescription ; + +/* + * call-seq: + * required_attributes + * + * A list of required attributes for this element + */ +static VALUE +required_attributes(VALUE self) +{ + const htmlElemDesc *description; + VALUE list; + int i; + + Data_Get_Struct(self, htmlElemDesc, description); + + list = rb_ary_new(); + + if (NULL == description->attrs_req) { return list; } + + for (i = 0; description->attrs_depr[i]; i++) { + rb_ary_push(list, NOKOGIRI_STR_NEW2(description->attrs_req[i])); + } + + return list; +} + +/* + * call-seq: + * deprecated_attributes + * + * A list of deprecated attributes for this element + */ +static VALUE +deprecated_attributes(VALUE self) +{ + const htmlElemDesc *description; + VALUE list; + int i; + + Data_Get_Struct(self, htmlElemDesc, description); + + list = rb_ary_new(); + + if (NULL == description->attrs_depr) { return list; } + + for (i = 0; description->attrs_depr[i]; i++) { + rb_ary_push(list, NOKOGIRI_STR_NEW2(description->attrs_depr[i])); + } + + return list; +} + +/* + * call-seq: + * optional_attributes + * + * A list of optional attributes for this element + */ +static VALUE +optional_attributes(VALUE self) +{ + const htmlElemDesc *description; + VALUE list; + int i; + + Data_Get_Struct(self, htmlElemDesc, description); + + list = rb_ary_new(); + + if (NULL == description->attrs_opt) { return list; } + + for (i = 0; description->attrs_opt[i]; i++) { + rb_ary_push(list, NOKOGIRI_STR_NEW2(description->attrs_opt[i])); + } + + return list; +} + +/* + * call-seq: + * default_sub_element + * + * The default sub element for this element + */ +static VALUE +default_sub_element(VALUE self) +{ + const htmlElemDesc *description; + Data_Get_Struct(self, htmlElemDesc, description); + + if (description->defaultsubelt) { + return NOKOGIRI_STR_NEW2(description->defaultsubelt); + } + + return Qnil; +} + +/* + * call-seq: + * sub_elements + * + * A list of allowed sub elements for this element. + */ +static VALUE +sub_elements(VALUE self) +{ + const htmlElemDesc *description; + VALUE list; + int i; + + Data_Get_Struct(self, htmlElemDesc, description); + + list = rb_ary_new(); + + if (NULL == description->subelts) { return list; } + + for (i = 0; description->subelts[i]; i++) { + rb_ary_push(list, NOKOGIRI_STR_NEW2(description->subelts[i])); + } + + return list; +} + +/* + * call-seq: + * description + * + * The description for this element + */ +static VALUE +description(VALUE self) +{ + const htmlElemDesc *description; + Data_Get_Struct(self, htmlElemDesc, description); + + return NOKOGIRI_STR_NEW2(description->desc); +} + +/* + * call-seq: + * inline? + * + * Is this element an inline element? + */ +static VALUE +inline_eh(VALUE self) +{ + const htmlElemDesc *description; + Data_Get_Struct(self, htmlElemDesc, description); + + if (description->isinline) { return Qtrue; } + return Qfalse; +} + +/* + * call-seq: + * deprecated? + * + * Is this element deprecated? + */ +static VALUE +deprecated_eh(VALUE self) +{ + const htmlElemDesc *description; + Data_Get_Struct(self, htmlElemDesc, description); + + if (description->depr) { return Qtrue; } + return Qfalse; +} + +/* + * call-seq: + * empty? + * + * Is this an empty element? + */ +static VALUE +empty_eh(VALUE self) +{ + const htmlElemDesc *description; + Data_Get_Struct(self, htmlElemDesc, description); + + if (description->empty) { return Qtrue; } + return Qfalse; +} + +/* + * call-seq: + * save_end_tag? + * + * Should the end tag be saved? + */ +static VALUE +save_end_tag_eh(VALUE self) +{ + const htmlElemDesc *description; + Data_Get_Struct(self, htmlElemDesc, description); + + if (description->saveEndTag) { return Qtrue; } + return Qfalse; +} + +/* + * call-seq: + * implied_end_tag? + * + * Can the end tag be implied for this tag? + */ +static VALUE +implied_end_tag_eh(VALUE self) +{ + const htmlElemDesc *description; + Data_Get_Struct(self, htmlElemDesc, description); + + if (description->endTag) { return Qtrue; } + return Qfalse; +} + +/* + * call-seq: + * implied_start_tag? + * + * Can the start tag be implied for this tag? + */ +static VALUE +implied_start_tag_eh(VALUE self) +{ + const htmlElemDesc *description; + Data_Get_Struct(self, htmlElemDesc, description); + + if (description->startTag) { return Qtrue; } + return Qfalse; +} + +/* + * call-seq: + * name + * + * Get the tag name for this ElemementDescription + */ +static VALUE +name(VALUE self) +{ + const htmlElemDesc *description; + Data_Get_Struct(self, htmlElemDesc, description); + + if (NULL == description->name) { return Qnil; } + return NOKOGIRI_STR_NEW2(description->name); +} + +/* + * call-seq: + * [](tag_name) + * + * Get ElemementDescription for +tag_name+ + */ +static VALUE +get_description(VALUE klass, VALUE tag_name) +{ + const htmlElemDesc *description = htmlTagLookup( + (const xmlChar *)StringValueCStr(tag_name) + ); + + if (NULL == description) { return Qnil; } + return Data_Wrap_Struct(klass, 0, 0, (void *)(uintptr_t)description); +} + +void +noko_init_html_element_description() +{ + cNokogiriHtmlElementDescription = rb_define_class_under(mNokogiriHtml, "ElementDescription", rb_cObject); + + rb_define_singleton_method(cNokogiriHtmlElementDescription, "[]", get_description, 1); + + rb_define_method(cNokogiriHtmlElementDescription, "name", name, 0); + rb_define_method(cNokogiriHtmlElementDescription, "implied_start_tag?", implied_start_tag_eh, 0); + rb_define_method(cNokogiriHtmlElementDescription, "implied_end_tag?", implied_end_tag_eh, 0); + rb_define_method(cNokogiriHtmlElementDescription, "save_end_tag?", save_end_tag_eh, 0); + rb_define_method(cNokogiriHtmlElementDescription, "empty?", empty_eh, 0); + rb_define_method(cNokogiriHtmlElementDescription, "deprecated?", deprecated_eh, 0); + rb_define_method(cNokogiriHtmlElementDescription, "inline?", inline_eh, 0); + rb_define_method(cNokogiriHtmlElementDescription, "description", description, 0); + rb_define_method(cNokogiriHtmlElementDescription, "sub_elements", sub_elements, 0); + rb_define_method(cNokogiriHtmlElementDescription, "default_sub_element", default_sub_element, 0); + rb_define_method(cNokogiriHtmlElementDescription, "optional_attributes", optional_attributes, 0); + rb_define_method(cNokogiriHtmlElementDescription, "deprecated_attributes", deprecated_attributes, 0); + rb_define_method(cNokogiriHtmlElementDescription, "required_attributes", required_attributes, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_entity_lookup.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_entity_lookup.c new file mode 100644 index 000000000000..a63f58a52871 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_entity_lookup.c @@ -0,0 +1,37 @@ +#include <nokogiri.h> + +static VALUE cNokogiriHtmlEntityLookup; + +/* + * call-seq: + * get(key) + * + * Get the HTML::EntityDescription for +key+ + */ +static VALUE +get(VALUE _, VALUE rb_entity_name) +{ + VALUE cNokogiriHtmlEntityDescription; + const htmlEntityDesc *c_entity_desc; + VALUE rb_constructor_args[3]; + + c_entity_desc = htmlEntityLookup((const xmlChar *)StringValueCStr(rb_entity_name)); + if (NULL == c_entity_desc) { + return Qnil; + } + + rb_constructor_args[0] = INT2NUM((long)c_entity_desc->value); + rb_constructor_args[1] = NOKOGIRI_STR_NEW2(c_entity_desc->name); + rb_constructor_args[2] = NOKOGIRI_STR_NEW2(c_entity_desc->desc); + + cNokogiriHtmlEntityDescription = rb_const_get_at(mNokogiriHtml, rb_intern("EntityDescription")); + return rb_class_new_instance(3, rb_constructor_args, cNokogiriHtmlEntityDescription); +} + +void +noko_init_html_entity_lookup() +{ + cNokogiriHtmlEntityLookup = rb_define_class_under(mNokogiriHtml, "EntityLookup", rb_cObject); + + rb_define_method(cNokogiriHtmlEntityLookup, "get", get, 1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_sax_parser_context.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_sax_parser_context.c new file mode 100644 index 000000000000..eb3361b29633 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_sax_parser_context.c @@ -0,0 +1,119 @@ +#include <nokogiri.h> + +VALUE cNokogiriHtmlSaxParserContext ; + +static void +deallocate(xmlParserCtxtPtr ctxt) +{ + NOKOGIRI_DEBUG_START(ctxt); + + ctxt->sax = NULL; + + htmlFreeParserCtxt(ctxt); + + NOKOGIRI_DEBUG_END(ctxt); +} + +static VALUE +parse_memory(VALUE klass, VALUE data, VALUE encoding) +{ + htmlParserCtxtPtr ctxt; + + if (NIL_P(data)) { + rb_raise(rb_eArgError, "data cannot be nil"); + } + if (!(int)RSTRING_LEN(data)) { + rb_raise(rb_eRuntimeError, "data cannot be empty"); + } + + ctxt = htmlCreateMemoryParserCtxt(StringValuePtr(data), + (int)RSTRING_LEN(data)); + if (ctxt->sax) { + xmlFree(ctxt->sax); + ctxt->sax = NULL; + } + + if (RTEST(encoding)) { + xmlCharEncodingHandlerPtr enc = xmlFindCharEncodingHandler(StringValueCStr(encoding)); + if (enc != NULL) { + xmlSwitchToEncoding(ctxt, enc); + if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { + rb_raise(rb_eRuntimeError, "Unsupported encoding %s", + StringValueCStr(encoding)); + } + } + } + + return Data_Wrap_Struct(klass, NULL, deallocate, ctxt); +} + +static VALUE +parse_file(VALUE klass, VALUE filename, VALUE encoding) +{ + htmlParserCtxtPtr ctxt = htmlCreateFileParserCtxt( + StringValueCStr(filename), + StringValueCStr(encoding) + ); + return Data_Wrap_Struct(klass, NULL, deallocate, ctxt); +} + +static VALUE +parse_doc(VALUE ctxt_val) +{ + htmlParserCtxtPtr ctxt = (htmlParserCtxtPtr)ctxt_val; + htmlParseDocument(ctxt); + return Qnil; +} + +static VALUE +parse_doc_finalize(VALUE ctxt_val) +{ + htmlParserCtxtPtr ctxt = (htmlParserCtxtPtr)ctxt_val; + + if (ctxt->myDoc) { + xmlFreeDoc(ctxt->myDoc); + } + + NOKOGIRI_SAX_TUPLE_DESTROY(ctxt->userData); + return Qnil; +} + +static VALUE +parse_with(VALUE self, VALUE sax_handler) +{ + htmlParserCtxtPtr ctxt; + htmlSAXHandlerPtr sax; + + if (!rb_obj_is_kind_of(sax_handler, cNokogiriXmlSaxParser)) { + rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::SAX::Parser"); + } + + Data_Get_Struct(self, htmlParserCtxt, ctxt); + Data_Get_Struct(sax_handler, htmlSAXHandler, sax); + + /* Free the sax handler since we'll assign our own */ + if (ctxt->sax && ctxt->sax != (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) { + xmlFree(ctxt->sax); + } + + ctxt->sax = sax; + ctxt->userData = (void *)NOKOGIRI_SAX_TUPLE_NEW(ctxt, sax_handler); + + xmlSetStructuredErrorFunc(NULL, NULL); + + rb_ensure(parse_doc, (VALUE)ctxt, parse_doc_finalize, (VALUE)ctxt); + + return self; +} + +void +noko_init_html_sax_parser_context() +{ + assert(cNokogiriXmlSaxParserContext); + cNokogiriHtmlSaxParserContext = rb_define_class_under(mNokogiriHtmlSax, "ParserContext", cNokogiriXmlSaxParserContext); + + rb_define_singleton_method(cNokogiriHtmlSaxParserContext, "memory", parse_memory, 2); + rb_define_singleton_method(cNokogiriHtmlSaxParserContext, "file", parse_file, 2); + + rb_define_method(cNokogiriHtmlSaxParserContext, "parse_with", parse_with, 1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_sax_push_parser.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_sax_push_parser.c new file mode 100644 index 000000000000..30f3e18465c5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/html_sax_push_parser.c @@ -0,0 +1,95 @@ +#include <nokogiri.h> + +VALUE cNokogiriHtmlSaxPushParser; + +/* + * call-seq: + * native_write(chunk, last_chunk) + * + * Write +chunk+ to PushParser. +last_chunk+ triggers the end_document handle + */ +static VALUE +native_write(VALUE self, VALUE _chunk, VALUE _last_chunk) +{ + xmlParserCtxtPtr ctx; + const char *chunk = NULL; + int size = 0; + int status = 0; + libxmlStructuredErrorHandlerState handler_state; + + Data_Get_Struct(self, xmlParserCtxt, ctx); + + if (Qnil != _chunk) { + chunk = StringValuePtr(_chunk); + size = (int)RSTRING_LEN(_chunk); + } + + Nokogiri_structured_error_func_save_and_set(&handler_state, NULL, NULL); + + status = htmlParseChunk(ctx, chunk, size, Qtrue == _last_chunk ? 1 : 0); + + Nokogiri_structured_error_func_restore(&handler_state); + + if ((status != 0) && !(ctx->options & XML_PARSE_RECOVER)) { + // TODO: there appear to be no tests for this block + xmlErrorPtr e = xmlCtxtGetLastError(ctx); + Nokogiri_error_raise(NULL, e); + } + + return self; +} + +/* + * call-seq: + * initialize_native(xml_sax, filename) + * + * Initialize the push parser with +xml_sax+ using +filename+ + */ +static VALUE +initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename, + VALUE encoding) +{ + htmlSAXHandlerPtr sax; + const char *filename = NULL; + htmlParserCtxtPtr ctx; + xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; + + Data_Get_Struct(_xml_sax, xmlSAXHandler, sax); + + if (_filename != Qnil) { filename = StringValueCStr(_filename); } + + if (!NIL_P(encoding)) { + enc = xmlParseCharEncoding(StringValueCStr(encoding)); + if (enc == XML_CHAR_ENCODING_ERROR) { + rb_raise(rb_eArgError, "Unsupported Encoding"); + } + } + + ctx = htmlCreatePushParserCtxt( + sax, + NULL, + NULL, + 0, + filename, + enc + ); + if (ctx == NULL) { + rb_raise(rb_eRuntimeError, "Could not create a parser context"); + } + + ctx->userData = NOKOGIRI_SAX_TUPLE_NEW(ctx, self); + + ctx->sax2 = 1; + DATA_PTR(self) = ctx; + return self; +} + +void +noko_init_html_sax_push_parser() +{ + assert(cNokogiriXmlSaxPushParser); + cNokogiriHtmlSaxPushParser = rb_define_class_under(mNokogiriHtmlSax, "PushParser", cNokogiriXmlSaxPushParser); + + rb_define_private_method(cNokogiriHtmlSaxPushParser, "initialize_native", initialize_native, 3); + rb_define_private_method(cNokogiriHtmlSaxPushParser, "native_write", native_write, 2); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libexslt/exslt.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libexslt/exslt.h new file mode 100644 index 000000000000..21473080e0fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libexslt/exslt.h @@ -0,0 +1,102 @@ + +#ifndef __EXSLT_H__ +#define __EXSLT_H__ + +#include <libxml/tree.h> +#include <libxml/xpath.h> +#include "exsltexports.h" +#include <libexslt/exsltconfig.h> + +#ifdef __cplusplus +extern "C" { +#endif + +EXSLTPUBVAR const char *exsltLibraryVersion; +EXSLTPUBVAR const int exsltLibexsltVersion; +EXSLTPUBVAR const int exsltLibxsltVersion; +EXSLTPUBVAR const int exsltLibxmlVersion; + +/** + * EXSLT_COMMON_NAMESPACE: + * + * Namespace for EXSLT common functions + */ +#define EXSLT_COMMON_NAMESPACE ((const xmlChar *) "http://exslt.org/common") +/** + * EXSLT_CRYPTO_NAMESPACE: + * + * Namespace for EXSLT crypto functions + */ +#define EXSLT_CRYPTO_NAMESPACE ((const xmlChar *) "http://exslt.org/crypto") +/** + * EXSLT_MATH_NAMESPACE: + * + * Namespace for EXSLT math functions + */ +#define EXSLT_MATH_NAMESPACE ((const xmlChar *) "http://exslt.org/math") +/** + * EXSLT_SETS_NAMESPACE: + * + * Namespace for EXSLT set functions + */ +#define EXSLT_SETS_NAMESPACE ((const xmlChar *) "http://exslt.org/sets") +/** + * EXSLT_FUNCTIONS_NAMESPACE: + * + * Namespace for EXSLT functions extension functions + */ +#define EXSLT_FUNCTIONS_NAMESPACE ((const xmlChar *) "http://exslt.org/functions") +/** + * EXSLT_STRINGS_NAMESPACE: + * + * Namespace for EXSLT strings functions + */ +#define EXSLT_STRINGS_NAMESPACE ((const xmlChar *) "http://exslt.org/strings") +/** + * EXSLT_DATE_NAMESPACE: + * + * Namespace for EXSLT date functions + */ +#define EXSLT_DATE_NAMESPACE ((const xmlChar *) "http://exslt.org/dates-and-times") +/** + * EXSLT_DYNAMIC_NAMESPACE: + * + * Namespace for EXSLT dynamic functions + */ +#define EXSLT_DYNAMIC_NAMESPACE ((const xmlChar *) "http://exslt.org/dynamic") + +/** + * SAXON_NAMESPACE: + * + * Namespace for SAXON extensions functions + */ +#define SAXON_NAMESPACE ((const xmlChar *) "http://icl.com/saxon") + +EXSLTPUBFUN void EXSLTCALL exsltCommonRegister (void); +#ifdef EXSLT_CRYPTO_ENABLED +EXSLTPUBFUN void EXSLTCALL exsltCryptoRegister (void); +#endif +EXSLTPUBFUN void EXSLTCALL exsltMathRegister (void); +EXSLTPUBFUN void EXSLTCALL exsltSetsRegister (void); +EXSLTPUBFUN void EXSLTCALL exsltFuncRegister (void); +EXSLTPUBFUN void EXSLTCALL exsltStrRegister (void); +EXSLTPUBFUN void EXSLTCALL exsltDateRegister (void); +EXSLTPUBFUN void EXSLTCALL exsltSaxonRegister (void); +EXSLTPUBFUN void EXSLTCALL exsltDynRegister(void); + +EXSLTPUBFUN void EXSLTCALL exsltRegisterAll (void); + +EXSLTPUBFUN int EXSLTCALL exsltDateXpathCtxtRegister (xmlXPathContextPtr ctxt, + const xmlChar *prefix); +EXSLTPUBFUN int EXSLTCALL exsltMathXpathCtxtRegister (xmlXPathContextPtr ctxt, + const xmlChar *prefix); +EXSLTPUBFUN int EXSLTCALL exsltSetsXpathCtxtRegister (xmlXPathContextPtr ctxt, + const xmlChar *prefix); +EXSLTPUBFUN int EXSLTCALL exsltStrXpathCtxtRegister (xmlXPathContextPtr ctxt, + const xmlChar *prefix); + +#ifdef __cplusplus +} +#endif +#endif /* __EXSLT_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libexslt/exsltconfig.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libexslt/exsltconfig.h new file mode 100644 index 000000000000..890ca858133f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libexslt/exsltconfig.h @@ -0,0 +1,70 @@ +/* + * exsltconfig.h: compile-time version information for the EXSLT library + * + * See Copyright for the status of this software. + * + * daniel@veillard.com + */ + +#ifndef __XML_EXSLTCONFIG_H__ +#define __XML_EXSLTCONFIG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * LIBEXSLT_DOTTED_VERSION: + * + * the version string like "1.2.3" + */ +#define LIBEXSLT_DOTTED_VERSION "1.1.34" + +/** + * LIBEXSLT_VERSION: + * + * the version number: 1.2.3 value is 10203 + */ +#define LIBEXSLT_VERSION 820 + +/** + * LIBEXSLT_VERSION_STRING: + * + * the version number string, 1.2.3 value is "10203" + */ +#define LIBEXSLT_VERSION_STRING "820" + +/** + * LIBEXSLT_VERSION_EXTRA: + * + * extra version information, used to show a CVS compilation + */ +#define LIBEXSLT_VERSION_EXTRA "" + +/** + * WITH_CRYPTO: + * + * Whether crypto support is configured into exslt + */ +#if 0 +#define EXSLT_CRYPTO_ENABLED +#endif + +/** + * ATTRIBUTE_UNUSED: + * + * This macro is used to flag unused function parameters to GCC + */ +#ifdef __GNUC__ +#ifndef ATTRIBUTE_UNUSED +#define ATTRIBUTE_UNUSED __attribute__((unused)) +#endif +#else +#define ATTRIBUTE_UNUSED +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_EXSLTCONFIG_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libexslt/exsltexports.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libexslt/exsltexports.h new file mode 100644 index 000000000000..eee82220e9ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libexslt/exsltexports.h @@ -0,0 +1,140 @@ +/* + * exsltexports.h : macros for marking symbols as exportable/importable. + * + * See Copyright for the status of this software. + * + * igor@zlatkovic.com + */ + +#ifndef __EXSLT_EXPORTS_H__ +#define __EXSLT_EXPORTS_H__ + +/** + * EXSLTPUBFUN, EXSLTPUBVAR, EXSLTCALL + * + * Macros which declare an exportable function, an exportable variable and + * the calling convention used for functions. + * + * Please use an extra block for every platform/compiler combination when + * modifying this, rather than overlong #ifdef lines. This helps + * readability as well as the fact that different compilers on the same + * platform might need different definitions. + */ + +/** + * EXSLTPUBFUN: + * + * Macros which declare an exportable function + */ +#define EXSLTPUBFUN +/** + * EXSLTPUBVAR: + * + * Macros which declare an exportable variable + */ +#define EXSLTPUBVAR extern +/** + * EXSLTCALL: + * + * Macros which declare the called convention for exported functions + */ +#define EXSLTCALL + +/** DOC_DISABLE */ + +/* Windows platform with MS compiler */ +#if defined(_WIN32) && defined(_MSC_VER) + #undef EXSLTPUBFUN + #undef EXSLTPUBVAR + #undef EXSLTCALL + #if defined(IN_LIBEXSLT) && !defined(LIBEXSLT_STATIC) + #define EXSLTPUBFUN __declspec(dllexport) + #define EXSLTPUBVAR __declspec(dllexport) + #else + #define EXSLTPUBFUN + #if !defined(LIBEXSLT_STATIC) + #define EXSLTPUBVAR __declspec(dllimport) extern + #else + #define EXSLTPUBVAR extern + #endif + #endif + #define EXSLTCALL __cdecl + #if !defined _REENTRANT + #define _REENTRANT + #endif +#endif + +/* Windows platform with Borland compiler */ +#if defined(_WIN32) && defined(__BORLANDC__) + #undef EXSLTPUBFUN + #undef EXSLTPUBVAR + #undef EXSLTCALL + #if defined(IN_LIBEXSLT) && !defined(LIBEXSLT_STATIC) + #define EXSLTPUBFUN __declspec(dllexport) + #define EXSLTPUBVAR __declspec(dllexport) extern + #else + #define EXSLTPUBFUN + #if !defined(LIBEXSLT_STATIC) + #define EXSLTPUBVAR __declspec(dllimport) extern + #else + #define EXSLTPUBVAR extern + #endif + #endif + #define EXSLTCALL __cdecl + #if !defined _REENTRANT + #define _REENTRANT + #endif +#endif + +/* Windows platform with GNU compiler (Mingw) */ +#if defined(_WIN32) && defined(__MINGW32__) + #undef EXSLTPUBFUN + #undef EXSLTPUBVAR + #undef EXSLTCALL +/* + #if defined(IN_LIBEXSLT) && !defined(LIBEXSLT_STATIC) +*/ + #if !defined(LIBEXSLT_STATIC) + #define EXSLTPUBFUN __declspec(dllexport) + #define EXSLTPUBVAR __declspec(dllexport) extern + #else + #define EXSLTPUBFUN + #if !defined(LIBEXSLT_STATIC) + #define EXSLTPUBVAR __declspec(dllimport) extern + #else + #define EXSLTPUBVAR extern + #endif + #endif + #define EXSLTCALL __cdecl + #if !defined _REENTRANT + #define _REENTRANT + #endif +#endif + +/* Cygwin platform (does not define _WIN32), GNU compiler */ +#if defined(__CYGWIN__) + #undef EXSLTPUBFUN + #undef EXSLTPUBVAR + #undef EXSLTCALL + #if defined(IN_LIBEXSLT) && !defined(LIBEXSLT_STATIC) + #define EXSLTPUBFUN __declspec(dllexport) + #define EXSLTPUBVAR __declspec(dllexport) + #else + #define EXSLTPUBFUN + #if !defined(LIBEXSLT_STATIC) + #define EXSLTPUBVAR __declspec(dllimport) extern + #else + #define EXSLTPUBVAR extern + #endif + #endif + #define EXSLTCALL __cdecl +#endif + +/* Compatibility */ +#if !defined(LIBEXSLT_PUBLIC) +#define LIBEXSLT_PUBLIC EXSLTPUBVAR +#endif + +#endif /* __EXSLT_EXPORTS_H__ */ + + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/DOCBparser.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/DOCBparser.h new file mode 100644 index 000000000000..9394fa71bddc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/DOCBparser.h @@ -0,0 +1,96 @@ +/* + * Summary: old DocBook SGML parser + * Description: interface for a DocBook SGML non-verifying parser + * This code is DEPRECATED, and should not be used anymore. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __DOCB_PARSER_H__ +#define __DOCB_PARSER_H__ +#include <libxml/xmlversion.h> + +#ifdef LIBXML_DOCB_ENABLED + +#include <libxml/parser.h> +#include <libxml/parserInternals.h> + +#ifndef IN_LIBXML +#ifdef __GNUC__ +#warning "The DOCBparser module has been deprecated in libxml2-2.6.0" +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Most of the back-end structures from XML and SGML are shared. + */ +typedef xmlParserCtxt docbParserCtxt; +typedef xmlParserCtxtPtr docbParserCtxtPtr; +typedef xmlSAXHandler docbSAXHandler; +typedef xmlSAXHandlerPtr docbSAXHandlerPtr; +typedef xmlParserInput docbParserInput; +typedef xmlParserInputPtr docbParserInputPtr; +typedef xmlDocPtr docbDocPtr; + +/* + * There is only few public functions. + */ +XMLPUBFUN int XMLCALL + docbEncodeEntities(unsigned char *out, + int *outlen, + const unsigned char *in, + int *inlen, int quoteChar); + +XMLPUBFUN docbDocPtr XMLCALL + docbSAXParseDoc (xmlChar *cur, + const char *encoding, + docbSAXHandlerPtr sax, + void *userData); +XMLPUBFUN docbDocPtr XMLCALL + docbParseDoc (xmlChar *cur, + const char *encoding); +XMLPUBFUN docbDocPtr XMLCALL + docbSAXParseFile (const char *filename, + const char *encoding, + docbSAXHandlerPtr sax, + void *userData); +XMLPUBFUN docbDocPtr XMLCALL + docbParseFile (const char *filename, + const char *encoding); + +/** + * Interfaces for the Push mode. + */ +XMLPUBFUN void XMLCALL + docbFreeParserCtxt (docbParserCtxtPtr ctxt); +XMLPUBFUN docbParserCtxtPtr XMLCALL + docbCreatePushParserCtxt(docbSAXHandlerPtr sax, + void *user_data, + const char *chunk, + int size, + const char *filename, + xmlCharEncoding enc); +XMLPUBFUN int XMLCALL + docbParseChunk (docbParserCtxtPtr ctxt, + const char *chunk, + int size, + int terminate); +XMLPUBFUN docbParserCtxtPtr XMLCALL + docbCreateFileParserCtxt(const char *filename, + const char *encoding); +XMLPUBFUN int XMLCALL + docbParseDocument (docbParserCtxtPtr ctxt); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_DOCB_ENABLED */ + +#endif /* __DOCB_PARSER_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/HTMLparser.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/HTMLparser.h new file mode 100644 index 000000000000..1d4fec2f7343 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/HTMLparser.h @@ -0,0 +1,306 @@ +/* + * Summary: interface for an HTML 4.0 non-verifying parser + * Description: this module implements an HTML 4.0 non-verifying parser + * with API compatible with the XML parser ones. It should + * be able to parse "real world" HTML, even if severely + * broken from a specification point of view. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __HTML_PARSER_H__ +#define __HTML_PARSER_H__ +#include <libxml/xmlversion.h> +#include <libxml/parser.h> + +#ifdef LIBXML_HTML_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Most of the back-end structures from XML and HTML are shared. + */ +typedef xmlParserCtxt htmlParserCtxt; +typedef xmlParserCtxtPtr htmlParserCtxtPtr; +typedef xmlParserNodeInfo htmlParserNodeInfo; +typedef xmlSAXHandler htmlSAXHandler; +typedef xmlSAXHandlerPtr htmlSAXHandlerPtr; +typedef xmlParserInput htmlParserInput; +typedef xmlParserInputPtr htmlParserInputPtr; +typedef xmlDocPtr htmlDocPtr; +typedef xmlNodePtr htmlNodePtr; + +/* + * Internal description of an HTML element, representing HTML 4.01 + * and XHTML 1.0 (which share the same structure). + */ +typedef struct _htmlElemDesc htmlElemDesc; +typedef htmlElemDesc *htmlElemDescPtr; +struct _htmlElemDesc { + const char *name; /* The tag name */ + char startTag; /* Whether the start tag can be implied */ + char endTag; /* Whether the end tag can be implied */ + char saveEndTag; /* Whether the end tag should be saved */ + char empty; /* Is this an empty element ? */ + char depr; /* Is this a deprecated element ? */ + char dtd; /* 1: only in Loose DTD, 2: only Frameset one */ + char isinline; /* is this a block 0 or inline 1 element */ + const char *desc; /* the description */ + +/* NRK Jan.2003 + * New fields encapsulating HTML structure + * + * Bugs: + * This is a very limited representation. It fails to tell us when + * an element *requires* subelements (we only have whether they're + * allowed or not), and it doesn't tell us where CDATA and PCDATA + * are allowed. Some element relationships are not fully represented: + * these are flagged with the word MODIFIER + */ + const char** subelts; /* allowed sub-elements of this element */ + const char* defaultsubelt; /* subelement for suggested auto-repair + if necessary or NULL */ + const char** attrs_opt; /* Optional Attributes */ + const char** attrs_depr; /* Additional deprecated attributes */ + const char** attrs_req; /* Required attributes */ +}; + +/* + * Internal description of an HTML entity. + */ +typedef struct _htmlEntityDesc htmlEntityDesc; +typedef htmlEntityDesc *htmlEntityDescPtr; +struct _htmlEntityDesc { + unsigned int value; /* the UNICODE value for the character */ + const char *name; /* The entity name */ + const char *desc; /* the description */ +}; + +/* + * There is only few public functions. + */ +XMLPUBFUN const htmlElemDesc * XMLCALL + htmlTagLookup (const xmlChar *tag); +XMLPUBFUN const htmlEntityDesc * XMLCALL + htmlEntityLookup(const xmlChar *name); +XMLPUBFUN const htmlEntityDesc * XMLCALL + htmlEntityValueLookup(unsigned int value); + +XMLPUBFUN int XMLCALL + htmlIsAutoClosed(htmlDocPtr doc, + htmlNodePtr elem); +XMLPUBFUN int XMLCALL + htmlAutoCloseTag(htmlDocPtr doc, + const xmlChar *name, + htmlNodePtr elem); +XMLPUBFUN const htmlEntityDesc * XMLCALL + htmlParseEntityRef(htmlParserCtxtPtr ctxt, + const xmlChar **str); +XMLPUBFUN int XMLCALL + htmlParseCharRef(htmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + htmlParseElement(htmlParserCtxtPtr ctxt); + +XMLPUBFUN htmlParserCtxtPtr XMLCALL + htmlNewParserCtxt(void); + +XMLPUBFUN htmlParserCtxtPtr XMLCALL + htmlCreateMemoryParserCtxt(const char *buffer, + int size); + +XMLPUBFUN int XMLCALL + htmlParseDocument(htmlParserCtxtPtr ctxt); +XMLPUBFUN htmlDocPtr XMLCALL + htmlSAXParseDoc (const xmlChar *cur, + const char *encoding, + htmlSAXHandlerPtr sax, + void *userData); +XMLPUBFUN htmlDocPtr XMLCALL + htmlParseDoc (const xmlChar *cur, + const char *encoding); +XMLPUBFUN htmlDocPtr XMLCALL + htmlSAXParseFile(const char *filename, + const char *encoding, + htmlSAXHandlerPtr sax, + void *userData); +XMLPUBFUN htmlDocPtr XMLCALL + htmlParseFile (const char *filename, + const char *encoding); +XMLPUBFUN int XMLCALL + UTF8ToHtml (unsigned char *out, + int *outlen, + const unsigned char *in, + int *inlen); +XMLPUBFUN int XMLCALL + htmlEncodeEntities(unsigned char *out, + int *outlen, + const unsigned char *in, + int *inlen, int quoteChar); +XMLPUBFUN int XMLCALL + htmlIsScriptAttribute(const xmlChar *name); +XMLPUBFUN int XMLCALL + htmlHandleOmittedElem(int val); + +#ifdef LIBXML_PUSH_ENABLED +/** + * Interfaces for the Push mode. + */ +XMLPUBFUN htmlParserCtxtPtr XMLCALL + htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax, + void *user_data, + const char *chunk, + int size, + const char *filename, + xmlCharEncoding enc); +XMLPUBFUN int XMLCALL + htmlParseChunk (htmlParserCtxtPtr ctxt, + const char *chunk, + int size, + int terminate); +#endif /* LIBXML_PUSH_ENABLED */ + +XMLPUBFUN void XMLCALL + htmlFreeParserCtxt (htmlParserCtxtPtr ctxt); + +/* + * New set of simpler/more flexible APIs + */ +/** + * xmlParserOption: + * + * This is the set of XML parser options that can be passed down + * to the xmlReadDoc() and similar calls. + */ +typedef enum { + HTML_PARSE_RECOVER = 1<<0, /* Relaxed parsing */ + HTML_PARSE_NODEFDTD = 1<<2, /* do not default a doctype if not found */ + HTML_PARSE_NOERROR = 1<<5, /* suppress error reports */ + HTML_PARSE_NOWARNING= 1<<6, /* suppress warning reports */ + HTML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */ + HTML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */ + HTML_PARSE_NONET = 1<<11,/* Forbid network access */ + HTML_PARSE_NOIMPLIED= 1<<13,/* Do not add implied html/body... elements */ + HTML_PARSE_COMPACT = 1<<16,/* compact small text nodes */ + HTML_PARSE_IGNORE_ENC=1<<21 /* ignore internal document encoding hint */ +} htmlParserOption; + +XMLPUBFUN void XMLCALL + htmlCtxtReset (htmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + htmlCtxtUseOptions (htmlParserCtxtPtr ctxt, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlReadDoc (const xmlChar *cur, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlReadFile (const char *URL, + const char *encoding, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlReadMemory (const char *buffer, + int size, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlReadFd (int fd, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlReadIO (xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, + void *ioctx, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlCtxtReadDoc (xmlParserCtxtPtr ctxt, + const xmlChar *cur, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlCtxtReadFile (xmlParserCtxtPtr ctxt, + const char *filename, + const char *encoding, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlCtxtReadMemory (xmlParserCtxtPtr ctxt, + const char *buffer, + int size, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlCtxtReadFd (xmlParserCtxtPtr ctxt, + int fd, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN htmlDocPtr XMLCALL + htmlCtxtReadIO (xmlParserCtxtPtr ctxt, + xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, + void *ioctx, + const char *URL, + const char *encoding, + int options); + +/* NRK/Jan2003: further knowledge of HTML structure + */ +typedef enum { + HTML_NA = 0 , /* something we don't check at all */ + HTML_INVALID = 0x1 , + HTML_DEPRECATED = 0x2 , + HTML_VALID = 0x4 , + HTML_REQUIRED = 0xc /* VALID bit set so ( & HTML_VALID ) is TRUE */ +} htmlStatus ; + +/* Using htmlElemDesc rather than name here, to emphasise the fact + that otherwise there's a lookup overhead +*/ +XMLPUBFUN htmlStatus XMLCALL htmlAttrAllowed(const htmlElemDesc*, const xmlChar*, int) ; +XMLPUBFUN int XMLCALL htmlElementAllowedHere(const htmlElemDesc*, const xmlChar*) ; +XMLPUBFUN htmlStatus XMLCALL htmlElementStatusHere(const htmlElemDesc*, const htmlElemDesc*) ; +XMLPUBFUN htmlStatus XMLCALL htmlNodeStatus(const htmlNodePtr, int) ; +/** + * htmlDefaultSubelement: + * @elt: HTML element + * + * Returns the default subelement for this element + */ +#define htmlDefaultSubelement(elt) elt->defaultsubelt +/** + * htmlElementAllowedHereDesc: + * @parent: HTML parent element + * @elt: HTML element + * + * Checks whether an HTML element description may be a + * direct child of the specified element. + * + * Returns 1 if allowed; 0 otherwise. + */ +#define htmlElementAllowedHereDesc(parent,elt) \ + htmlElementAllowedHere((parent), (elt)->name) +/** + * htmlRequiredAttrs: + * @elt: HTML element + * + * Returns the attributes required for the specified element. + */ +#define htmlRequiredAttrs(elt) (elt)->attrs_req + + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_HTML_ENABLED */ +#endif /* __HTML_PARSER_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/HTMLtree.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/HTMLtree.h new file mode 100644 index 000000000000..c0e110330c5b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/HTMLtree.h @@ -0,0 +1,147 @@ +/* + * Summary: specific APIs to process HTML tree, especially serialization + * Description: this module implements a few function needed to process + * tree in an HTML specific way. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __HTML_TREE_H__ +#define __HTML_TREE_H__ + +#include <stdio.h> +#include <libxml/xmlversion.h> +#include <libxml/tree.h> +#include <libxml/HTMLparser.h> + +#ifdef LIBXML_HTML_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * HTML_TEXT_NODE: + * + * Macro. A text node in a HTML document is really implemented + * the same way as a text node in an XML document. + */ +#define HTML_TEXT_NODE XML_TEXT_NODE +/** + * HTML_ENTITY_REF_NODE: + * + * Macro. An entity reference in a HTML document is really implemented + * the same way as an entity reference in an XML document. + */ +#define HTML_ENTITY_REF_NODE XML_ENTITY_REF_NODE +/** + * HTML_COMMENT_NODE: + * + * Macro. A comment in a HTML document is really implemented + * the same way as a comment in an XML document. + */ +#define HTML_COMMENT_NODE XML_COMMENT_NODE +/** + * HTML_PRESERVE_NODE: + * + * Macro. A preserved node in a HTML document is really implemented + * the same way as a CDATA section in an XML document. + */ +#define HTML_PRESERVE_NODE XML_CDATA_SECTION_NODE +/** + * HTML_PI_NODE: + * + * Macro. A processing instruction in a HTML document is really implemented + * the same way as a processing instruction in an XML document. + */ +#define HTML_PI_NODE XML_PI_NODE + +XMLPUBFUN htmlDocPtr XMLCALL + htmlNewDoc (const xmlChar *URI, + const xmlChar *ExternalID); +XMLPUBFUN htmlDocPtr XMLCALL + htmlNewDocNoDtD (const xmlChar *URI, + const xmlChar *ExternalID); +XMLPUBFUN const xmlChar * XMLCALL + htmlGetMetaEncoding (htmlDocPtr doc); +XMLPUBFUN int XMLCALL + htmlSetMetaEncoding (htmlDocPtr doc, + const xmlChar *encoding); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + htmlDocDumpMemory (xmlDocPtr cur, + xmlChar **mem, + int *size); +XMLPUBFUN void XMLCALL + htmlDocDumpMemoryFormat (xmlDocPtr cur, + xmlChar **mem, + int *size, + int format); +XMLPUBFUN int XMLCALL + htmlDocDump (FILE *f, + xmlDocPtr cur); +XMLPUBFUN int XMLCALL + htmlSaveFile (const char *filename, + xmlDocPtr cur); +XMLPUBFUN int XMLCALL + htmlNodeDump (xmlBufferPtr buf, + xmlDocPtr doc, + xmlNodePtr cur); +XMLPUBFUN void XMLCALL + htmlNodeDumpFile (FILE *out, + xmlDocPtr doc, + xmlNodePtr cur); +XMLPUBFUN int XMLCALL + htmlNodeDumpFileFormat (FILE *out, + xmlDocPtr doc, + xmlNodePtr cur, + const char *encoding, + int format); +XMLPUBFUN int XMLCALL + htmlSaveFileEnc (const char *filename, + xmlDocPtr cur, + const char *encoding); +XMLPUBFUN int XMLCALL + htmlSaveFileFormat (const char *filename, + xmlDocPtr cur, + const char *encoding, + int format); + +XMLPUBFUN void XMLCALL + htmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, + xmlDocPtr doc, + xmlNodePtr cur, + const char *encoding, + int format); +XMLPUBFUN void XMLCALL + htmlDocContentDumpOutput(xmlOutputBufferPtr buf, + xmlDocPtr cur, + const char *encoding); +XMLPUBFUN void XMLCALL + htmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, + xmlDocPtr cur, + const char *encoding, + int format); +XMLPUBFUN void XMLCALL + htmlNodeDumpOutput (xmlOutputBufferPtr buf, + xmlDocPtr doc, + xmlNodePtr cur, + const char *encoding); + +#endif /* LIBXML_OUTPUT_ENABLED */ + +XMLPUBFUN int XMLCALL + htmlIsBooleanAttr (const xmlChar *name); + + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_HTML_ENABLED */ + +#endif /* __HTML_TREE_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/SAX.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/SAX.h new file mode 100644 index 000000000000..20093ceb6853 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/SAX.h @@ -0,0 +1,173 @@ +/* + * Summary: Old SAX version 1 handler, deprecated + * Description: DEPRECATED set of SAX version 1 interfaces used to + * build the DOM tree. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + + +#ifndef __XML_SAX_H__ +#define __XML_SAX_H__ + +#include <stdio.h> +#include <stdlib.h> +#include <libxml/xmlversion.h> +#include <libxml/parser.h> +#include <libxml/xlink.h> + +#ifdef LIBXML_LEGACY_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif +XMLPUBFUN const xmlChar * XMLCALL + getPublicId (void *ctx); +XMLPUBFUN const xmlChar * XMLCALL + getSystemId (void *ctx); +XMLPUBFUN void XMLCALL + setDocumentLocator (void *ctx, + xmlSAXLocatorPtr loc); + +XMLPUBFUN int XMLCALL + getLineNumber (void *ctx); +XMLPUBFUN int XMLCALL + getColumnNumber (void *ctx); + +XMLPUBFUN int XMLCALL + isStandalone (void *ctx); +XMLPUBFUN int XMLCALL + hasInternalSubset (void *ctx); +XMLPUBFUN int XMLCALL + hasExternalSubset (void *ctx); + +XMLPUBFUN void XMLCALL + internalSubset (void *ctx, + const xmlChar *name, + const xmlChar *ExternalID, + const xmlChar *SystemID); +XMLPUBFUN void XMLCALL + externalSubset (void *ctx, + const xmlChar *name, + const xmlChar *ExternalID, + const xmlChar *SystemID); +XMLPUBFUN xmlEntityPtr XMLCALL + getEntity (void *ctx, + const xmlChar *name); +XMLPUBFUN xmlEntityPtr XMLCALL + getParameterEntity (void *ctx, + const xmlChar *name); +XMLPUBFUN xmlParserInputPtr XMLCALL + resolveEntity (void *ctx, + const xmlChar *publicId, + const xmlChar *systemId); + +XMLPUBFUN void XMLCALL + entityDecl (void *ctx, + const xmlChar *name, + int type, + const xmlChar *publicId, + const xmlChar *systemId, + xmlChar *content); +XMLPUBFUN void XMLCALL + attributeDecl (void *ctx, + const xmlChar *elem, + const xmlChar *fullname, + int type, + int def, + const xmlChar *defaultValue, + xmlEnumerationPtr tree); +XMLPUBFUN void XMLCALL + elementDecl (void *ctx, + const xmlChar *name, + int type, + xmlElementContentPtr content); +XMLPUBFUN void XMLCALL + notationDecl (void *ctx, + const xmlChar *name, + const xmlChar *publicId, + const xmlChar *systemId); +XMLPUBFUN void XMLCALL + unparsedEntityDecl (void *ctx, + const xmlChar *name, + const xmlChar *publicId, + const xmlChar *systemId, + const xmlChar *notationName); + +XMLPUBFUN void XMLCALL + startDocument (void *ctx); +XMLPUBFUN void XMLCALL + endDocument (void *ctx); +XMLPUBFUN void XMLCALL + attribute (void *ctx, + const xmlChar *fullname, + const xmlChar *value); +XMLPUBFUN void XMLCALL + startElement (void *ctx, + const xmlChar *fullname, + const xmlChar **atts); +XMLPUBFUN void XMLCALL + endElement (void *ctx, + const xmlChar *name); +XMLPUBFUN void XMLCALL + reference (void *ctx, + const xmlChar *name); +XMLPUBFUN void XMLCALL + characters (void *ctx, + const xmlChar *ch, + int len); +XMLPUBFUN void XMLCALL + ignorableWhitespace (void *ctx, + const xmlChar *ch, + int len); +XMLPUBFUN void XMLCALL + processingInstruction (void *ctx, + const xmlChar *target, + const xmlChar *data); +XMLPUBFUN void XMLCALL + globalNamespace (void *ctx, + const xmlChar *href, + const xmlChar *prefix); +XMLPUBFUN void XMLCALL + setNamespace (void *ctx, + const xmlChar *name); +XMLPUBFUN xmlNsPtr XMLCALL + getNamespace (void *ctx); +XMLPUBFUN int XMLCALL + checkNamespace (void *ctx, + xmlChar *nameSpace); +XMLPUBFUN void XMLCALL + namespaceDecl (void *ctx, + const xmlChar *href, + const xmlChar *prefix); +XMLPUBFUN void XMLCALL + comment (void *ctx, + const xmlChar *value); +XMLPUBFUN void XMLCALL + cdataBlock (void *ctx, + const xmlChar *value, + int len); + +#ifdef LIBXML_SAX1_ENABLED +XMLPUBFUN void XMLCALL + initxmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr, + int warning); +#ifdef LIBXML_HTML_ENABLED +XMLPUBFUN void XMLCALL + inithtmlDefaultSAXHandler (xmlSAXHandlerV1 *hdlr); +#endif +#ifdef LIBXML_DOCB_ENABLED +XMLPUBFUN void XMLCALL + initdocbDefaultSAXHandler (xmlSAXHandlerV1 *hdlr); +#endif +#endif /* LIBXML_SAX1_ENABLED */ + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_LEGACY_ENABLED */ + +#endif /* __XML_SAX_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/SAX2.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/SAX2.h new file mode 100644 index 000000000000..a55212eb554d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/SAX2.h @@ -0,0 +1,178 @@ +/* + * Summary: SAX2 parser interface used to build the DOM tree + * Description: those are the default SAX2 interfaces used by + * the library when building DOM tree. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + + +#ifndef __XML_SAX2_H__ +#define __XML_SAX2_H__ + +#include <stdio.h> +#include <stdlib.h> +#include <libxml/xmlversion.h> +#include <libxml/parser.h> +#include <libxml/xlink.h> + +#ifdef __cplusplus +extern "C" { +#endif +XMLPUBFUN const xmlChar * XMLCALL + xmlSAX2GetPublicId (void *ctx); +XMLPUBFUN const xmlChar * XMLCALL + xmlSAX2GetSystemId (void *ctx); +XMLPUBFUN void XMLCALL + xmlSAX2SetDocumentLocator (void *ctx, + xmlSAXLocatorPtr loc); + +XMLPUBFUN int XMLCALL + xmlSAX2GetLineNumber (void *ctx); +XMLPUBFUN int XMLCALL + xmlSAX2GetColumnNumber (void *ctx); + +XMLPUBFUN int XMLCALL + xmlSAX2IsStandalone (void *ctx); +XMLPUBFUN int XMLCALL + xmlSAX2HasInternalSubset (void *ctx); +XMLPUBFUN int XMLCALL + xmlSAX2HasExternalSubset (void *ctx); + +XMLPUBFUN void XMLCALL + xmlSAX2InternalSubset (void *ctx, + const xmlChar *name, + const xmlChar *ExternalID, + const xmlChar *SystemID); +XMLPUBFUN void XMLCALL + xmlSAX2ExternalSubset (void *ctx, + const xmlChar *name, + const xmlChar *ExternalID, + const xmlChar *SystemID); +XMLPUBFUN xmlEntityPtr XMLCALL + xmlSAX2GetEntity (void *ctx, + const xmlChar *name); +XMLPUBFUN xmlEntityPtr XMLCALL + xmlSAX2GetParameterEntity (void *ctx, + const xmlChar *name); +XMLPUBFUN xmlParserInputPtr XMLCALL + xmlSAX2ResolveEntity (void *ctx, + const xmlChar *publicId, + const xmlChar *systemId); + +XMLPUBFUN void XMLCALL + xmlSAX2EntityDecl (void *ctx, + const xmlChar *name, + int type, + const xmlChar *publicId, + const xmlChar *systemId, + xmlChar *content); +XMLPUBFUN void XMLCALL + xmlSAX2AttributeDecl (void *ctx, + const xmlChar *elem, + const xmlChar *fullname, + int type, + int def, + const xmlChar *defaultValue, + xmlEnumerationPtr tree); +XMLPUBFUN void XMLCALL + xmlSAX2ElementDecl (void *ctx, + const xmlChar *name, + int type, + xmlElementContentPtr content); +XMLPUBFUN void XMLCALL + xmlSAX2NotationDecl (void *ctx, + const xmlChar *name, + const xmlChar *publicId, + const xmlChar *systemId); +XMLPUBFUN void XMLCALL + xmlSAX2UnparsedEntityDecl (void *ctx, + const xmlChar *name, + const xmlChar *publicId, + const xmlChar *systemId, + const xmlChar *notationName); + +XMLPUBFUN void XMLCALL + xmlSAX2StartDocument (void *ctx); +XMLPUBFUN void XMLCALL + xmlSAX2EndDocument (void *ctx); +#if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ + defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) || \ + defined(LIBXML_LEGACY_ENABLED) +XMLPUBFUN void XMLCALL + xmlSAX2StartElement (void *ctx, + const xmlChar *fullname, + const xmlChar **atts); +XMLPUBFUN void XMLCALL + xmlSAX2EndElement (void *ctx, + const xmlChar *name); +#endif /* LIBXML_SAX1_ENABLED or LIBXML_HTML_ENABLED or LIBXML_LEGACY_ENABLED */ +XMLPUBFUN void XMLCALL + xmlSAX2StartElementNs (void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *URI, + int nb_namespaces, + const xmlChar **namespaces, + int nb_attributes, + int nb_defaulted, + const xmlChar **attributes); +XMLPUBFUN void XMLCALL + xmlSAX2EndElementNs (void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *URI); +XMLPUBFUN void XMLCALL + xmlSAX2Reference (void *ctx, + const xmlChar *name); +XMLPUBFUN void XMLCALL + xmlSAX2Characters (void *ctx, + const xmlChar *ch, + int len); +XMLPUBFUN void XMLCALL + xmlSAX2IgnorableWhitespace (void *ctx, + const xmlChar *ch, + int len); +XMLPUBFUN void XMLCALL + xmlSAX2ProcessingInstruction (void *ctx, + const xmlChar *target, + const xmlChar *data); +XMLPUBFUN void XMLCALL + xmlSAX2Comment (void *ctx, + const xmlChar *value); +XMLPUBFUN void XMLCALL + xmlSAX2CDataBlock (void *ctx, + const xmlChar *value, + int len); + +#ifdef LIBXML_SAX1_ENABLED +XMLPUBFUN int XMLCALL + xmlSAXDefaultVersion (int version); +#endif /* LIBXML_SAX1_ENABLED */ + +XMLPUBFUN int XMLCALL + xmlSAXVersion (xmlSAXHandler *hdlr, + int version); +XMLPUBFUN void XMLCALL + xmlSAX2InitDefaultSAXHandler (xmlSAXHandler *hdlr, + int warning); +#ifdef LIBXML_HTML_ENABLED +XMLPUBFUN void XMLCALL + xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler *hdlr); +XMLPUBFUN void XMLCALL + htmlDefaultSAXHandlerInit (void); +#endif +#ifdef LIBXML_DOCB_ENABLED +XMLPUBFUN void XMLCALL + xmlSAX2InitDocbDefaultSAXHandler(xmlSAXHandler *hdlr); +XMLPUBFUN void XMLCALL + docbDefaultSAXHandlerInit (void); +#endif +XMLPUBFUN void XMLCALL + xmlDefaultSAXHandlerInit (void); +#ifdef __cplusplus +} +#endif +#endif /* __XML_SAX2_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/c14n.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/c14n.h new file mode 100644 index 000000000000..af93de63a4c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/c14n.h @@ -0,0 +1,128 @@ +/* + * Summary: Provide Canonical XML and Exclusive XML Canonicalization + * Description: the c14n modules provides a + * + * "Canonical XML" implementation + * http://www.w3.org/TR/xml-c14n + * + * and an + * + * "Exclusive XML Canonicalization" implementation + * http://www.w3.org/TR/xml-exc-c14n + + * Copy: See Copyright for the status of this software. + * + * Author: Aleksey Sanin <aleksey@aleksey.com> + */ +#ifndef __XML_C14N_H__ +#define __XML_C14N_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_C14N_ENABLED +#ifdef LIBXML_OUTPUT_ENABLED + +#include <libxml/tree.h> +#include <libxml/xpath.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* + * XML Canonicalization + * http://www.w3.org/TR/xml-c14n + * + * Exclusive XML Canonicalization + * http://www.w3.org/TR/xml-exc-c14n + * + * Canonical form of an XML document could be created if and only if + * a) default attributes (if any) are added to all nodes + * b) all character and parsed entity references are resolved + * In order to achieve this in libxml2 the document MUST be loaded with + * following global settings: + * + * xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; + * xmlSubstituteEntitiesDefault(1); + * + * or corresponding parser context setting: + * xmlParserCtxtPtr ctxt; + * + * ... + * ctxt->loadsubset = XML_DETECT_IDS | XML_COMPLETE_ATTRS; + * ctxt->replaceEntities = 1; + * ... + */ + +/* + * xmlC14NMode: + * + * Predefined values for C14N modes + * + */ +typedef enum { + XML_C14N_1_0 = 0, /* Original C14N 1.0 spec */ + XML_C14N_EXCLUSIVE_1_0 = 1, /* Exclusive C14N 1.0 spec */ + XML_C14N_1_1 = 2 /* C14N 1.1 spec */ +} xmlC14NMode; + +XMLPUBFUN int XMLCALL + xmlC14NDocSaveTo (xmlDocPtr doc, + xmlNodeSetPtr nodes, + int mode, /* a xmlC14NMode */ + xmlChar **inclusive_ns_prefixes, + int with_comments, + xmlOutputBufferPtr buf); + +XMLPUBFUN int XMLCALL + xmlC14NDocDumpMemory (xmlDocPtr doc, + xmlNodeSetPtr nodes, + int mode, /* a xmlC14NMode */ + xmlChar **inclusive_ns_prefixes, + int with_comments, + xmlChar **doc_txt_ptr); + +XMLPUBFUN int XMLCALL + xmlC14NDocSave (xmlDocPtr doc, + xmlNodeSetPtr nodes, + int mode, /* a xmlC14NMode */ + xmlChar **inclusive_ns_prefixes, + int with_comments, + const char* filename, + int compression); + + +/** + * This is the core C14N function + */ +/** + * xmlC14NIsVisibleCallback: + * @user_data: user data + * @node: the current node + * @parent: the parent node + * + * Signature for a C14N callback on visible nodes + * + * Returns 1 if the node should be included + */ +typedef int (*xmlC14NIsVisibleCallback) (void* user_data, + xmlNodePtr node, + xmlNodePtr parent); + +XMLPUBFUN int XMLCALL + xmlC14NExecute (xmlDocPtr doc, + xmlC14NIsVisibleCallback is_visible_callback, + void* user_data, + int mode, /* a xmlC14NMode */ + xmlChar **inclusive_ns_prefixes, + int with_comments, + xmlOutputBufferPtr buf); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LIBXML_OUTPUT_ENABLED */ +#endif /* LIBXML_C14N_ENABLED */ +#endif /* __XML_C14N_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/catalog.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/catalog.h new file mode 100644 index 000000000000..26b178dbbc9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/catalog.h @@ -0,0 +1,182 @@ +/** + * Summary: interfaces to the Catalog handling system + * Description: the catalog module implements the support for + * XML Catalogs and SGML catalogs + * + * SGML Open Technical Resolution TR9401:1997. + * http://www.jclark.com/sp/catalog.htm + * + * XML Catalogs Working Draft 06 August 2001 + * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_CATALOG_H__ +#define __XML_CATALOG_H__ + +#include <stdio.h> + +#include <libxml/xmlversion.h> +#include <libxml/xmlstring.h> +#include <libxml/tree.h> + +#ifdef LIBXML_CATALOG_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * XML_CATALOGS_NAMESPACE: + * + * The namespace for the XML Catalogs elements. + */ +#define XML_CATALOGS_NAMESPACE \ + (const xmlChar *) "urn:oasis:names:tc:entity:xmlns:xml:catalog" +/** + * XML_CATALOG_PI: + * + * The specific XML Catalog Processing Instruction name. + */ +#define XML_CATALOG_PI \ + (const xmlChar *) "oasis-xml-catalog" + +/* + * The API is voluntarily limited to general cataloging. + */ +typedef enum { + XML_CATA_PREFER_NONE = 0, + XML_CATA_PREFER_PUBLIC = 1, + XML_CATA_PREFER_SYSTEM +} xmlCatalogPrefer; + +typedef enum { + XML_CATA_ALLOW_NONE = 0, + XML_CATA_ALLOW_GLOBAL = 1, + XML_CATA_ALLOW_DOCUMENT = 2, + XML_CATA_ALLOW_ALL = 3 +} xmlCatalogAllow; + +typedef struct _xmlCatalog xmlCatalog; +typedef xmlCatalog *xmlCatalogPtr; + +/* + * Operations on a given catalog. + */ +XMLPUBFUN xmlCatalogPtr XMLCALL + xmlNewCatalog (int sgml); +XMLPUBFUN xmlCatalogPtr XMLCALL + xmlLoadACatalog (const char *filename); +XMLPUBFUN xmlCatalogPtr XMLCALL + xmlLoadSGMLSuperCatalog (const char *filename); +XMLPUBFUN int XMLCALL + xmlConvertSGMLCatalog (xmlCatalogPtr catal); +XMLPUBFUN int XMLCALL + xmlACatalogAdd (xmlCatalogPtr catal, + const xmlChar *type, + const xmlChar *orig, + const xmlChar *replace); +XMLPUBFUN int XMLCALL + xmlACatalogRemove (xmlCatalogPtr catal, + const xmlChar *value); +XMLPUBFUN xmlChar * XMLCALL + xmlACatalogResolve (xmlCatalogPtr catal, + const xmlChar *pubID, + const xmlChar *sysID); +XMLPUBFUN xmlChar * XMLCALL + xmlACatalogResolveSystem(xmlCatalogPtr catal, + const xmlChar *sysID); +XMLPUBFUN xmlChar * XMLCALL + xmlACatalogResolvePublic(xmlCatalogPtr catal, + const xmlChar *pubID); +XMLPUBFUN xmlChar * XMLCALL + xmlACatalogResolveURI (xmlCatalogPtr catal, + const xmlChar *URI); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + xmlACatalogDump (xmlCatalogPtr catal, + FILE *out); +#endif /* LIBXML_OUTPUT_ENABLED */ +XMLPUBFUN void XMLCALL + xmlFreeCatalog (xmlCatalogPtr catal); +XMLPUBFUN int XMLCALL + xmlCatalogIsEmpty (xmlCatalogPtr catal); + +/* + * Global operations. + */ +XMLPUBFUN void XMLCALL + xmlInitializeCatalog (void); +XMLPUBFUN int XMLCALL + xmlLoadCatalog (const char *filename); +XMLPUBFUN void XMLCALL + xmlLoadCatalogs (const char *paths); +XMLPUBFUN void XMLCALL + xmlCatalogCleanup (void); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + xmlCatalogDump (FILE *out); +#endif /* LIBXML_OUTPUT_ENABLED */ +XMLPUBFUN xmlChar * XMLCALL + xmlCatalogResolve (const xmlChar *pubID, + const xmlChar *sysID); +XMLPUBFUN xmlChar * XMLCALL + xmlCatalogResolveSystem (const xmlChar *sysID); +XMLPUBFUN xmlChar * XMLCALL + xmlCatalogResolvePublic (const xmlChar *pubID); +XMLPUBFUN xmlChar * XMLCALL + xmlCatalogResolveURI (const xmlChar *URI); +XMLPUBFUN int XMLCALL + xmlCatalogAdd (const xmlChar *type, + const xmlChar *orig, + const xmlChar *replace); +XMLPUBFUN int XMLCALL + xmlCatalogRemove (const xmlChar *value); +XMLPUBFUN xmlDocPtr XMLCALL + xmlParseCatalogFile (const char *filename); +XMLPUBFUN int XMLCALL + xmlCatalogConvert (void); + +/* + * Strictly minimal interfaces for per-document catalogs used + * by the parser. + */ +XMLPUBFUN void XMLCALL + xmlCatalogFreeLocal (void *catalogs); +XMLPUBFUN void * XMLCALL + xmlCatalogAddLocal (void *catalogs, + const xmlChar *URL); +XMLPUBFUN xmlChar * XMLCALL + xmlCatalogLocalResolve (void *catalogs, + const xmlChar *pubID, + const xmlChar *sysID); +XMLPUBFUN xmlChar * XMLCALL + xmlCatalogLocalResolveURI(void *catalogs, + const xmlChar *URI); +/* + * Preference settings. + */ +XMLPUBFUN int XMLCALL + xmlCatalogSetDebug (int level); +XMLPUBFUN xmlCatalogPrefer XMLCALL + xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer); +XMLPUBFUN void XMLCALL + xmlCatalogSetDefaults (xmlCatalogAllow allow); +XMLPUBFUN xmlCatalogAllow XMLCALL + xmlCatalogGetDefaults (void); + + +/* DEPRECATED interfaces */ +XMLPUBFUN const xmlChar * XMLCALL + xmlCatalogGetSystem (const xmlChar *sysID); +XMLPUBFUN const xmlChar * XMLCALL + xmlCatalogGetPublic (const xmlChar *pubID); + +#ifdef __cplusplus +} +#endif +#endif /* LIBXML_CATALOG_ENABLED */ +#endif /* __XML_CATALOG_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/chvalid.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/chvalid.h new file mode 100644 index 000000000000..fb43016982d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/chvalid.h @@ -0,0 +1,230 @@ +/* + * Summary: Unicode character range checking + * Description: this module exports interfaces for the character + * range validation APIs + * + * This file is automatically generated from the cvs source + * definition files using the genChRanges.py Python script + * + * Generation date: Mon Mar 27 11:09:48 2006 + * Sources: chvalid.def + * Author: William Brack <wbrack@mmm.com.hk> + */ + +#ifndef __XML_CHVALID_H__ +#define __XML_CHVALID_H__ + +#include <libxml/xmlversion.h> +#include <libxml/xmlstring.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Define our typedefs and structures + * + */ +typedef struct _xmlChSRange xmlChSRange; +typedef xmlChSRange *xmlChSRangePtr; +struct _xmlChSRange { + unsigned short low; + unsigned short high; +}; + +typedef struct _xmlChLRange xmlChLRange; +typedef xmlChLRange *xmlChLRangePtr; +struct _xmlChLRange { + unsigned int low; + unsigned int high; +}; + +typedef struct _xmlChRangeGroup xmlChRangeGroup; +typedef xmlChRangeGroup *xmlChRangeGroupPtr; +struct _xmlChRangeGroup { + int nbShortRange; + int nbLongRange; + const xmlChSRange *shortRange; /* points to an array of ranges */ + const xmlChLRange *longRange; +}; + +/** + * Range checking routine + */ +XMLPUBFUN int XMLCALL + xmlCharInRange(unsigned int val, const xmlChRangeGroup *group); + + +/** + * xmlIsBaseChar_ch: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsBaseChar_ch(c) (((0x41 <= (c)) && ((c) <= 0x5a)) || \ + ((0x61 <= (c)) && ((c) <= 0x7a)) || \ + ((0xc0 <= (c)) && ((c) <= 0xd6)) || \ + ((0xd8 <= (c)) && ((c) <= 0xf6)) || \ + (0xf8 <= (c))) + +/** + * xmlIsBaseCharQ: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsBaseCharQ(c) (((c) < 0x100) ? \ + xmlIsBaseChar_ch((c)) : \ + xmlCharInRange((c), &xmlIsBaseCharGroup)) + +XMLPUBVAR const xmlChRangeGroup xmlIsBaseCharGroup; + +/** + * xmlIsBlank_ch: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsBlank_ch(c) (((c) == 0x20) || \ + ((0x9 <= (c)) && ((c) <= 0xa)) || \ + ((c) == 0xd)) + +/** + * xmlIsBlankQ: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsBlankQ(c) (((c) < 0x100) ? \ + xmlIsBlank_ch((c)) : 0) + + +/** + * xmlIsChar_ch: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsChar_ch(c) (((0x9 <= (c)) && ((c) <= 0xa)) || \ + ((c) == 0xd) || \ + (0x20 <= (c))) + +/** + * xmlIsCharQ: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsCharQ(c) (((c) < 0x100) ? \ + xmlIsChar_ch((c)) :\ + (((0x100 <= (c)) && ((c) <= 0xd7ff)) || \ + ((0xe000 <= (c)) && ((c) <= 0xfffd)) || \ + ((0x10000 <= (c)) && ((c) <= 0x10ffff)))) + +XMLPUBVAR const xmlChRangeGroup xmlIsCharGroup; + +/** + * xmlIsCombiningQ: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsCombiningQ(c) (((c) < 0x100) ? \ + 0 : \ + xmlCharInRange((c), &xmlIsCombiningGroup)) + +XMLPUBVAR const xmlChRangeGroup xmlIsCombiningGroup; + +/** + * xmlIsDigit_ch: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsDigit_ch(c) (((0x30 <= (c)) && ((c) <= 0x39))) + +/** + * xmlIsDigitQ: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsDigitQ(c) (((c) < 0x100) ? \ + xmlIsDigit_ch((c)) : \ + xmlCharInRange((c), &xmlIsDigitGroup)) + +XMLPUBVAR const xmlChRangeGroup xmlIsDigitGroup; + +/** + * xmlIsExtender_ch: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsExtender_ch(c) (((c) == 0xb7)) + +/** + * xmlIsExtenderQ: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsExtenderQ(c) (((c) < 0x100) ? \ + xmlIsExtender_ch((c)) : \ + xmlCharInRange((c), &xmlIsExtenderGroup)) + +XMLPUBVAR const xmlChRangeGroup xmlIsExtenderGroup; + +/** + * xmlIsIdeographicQ: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsIdeographicQ(c) (((c) < 0x100) ? \ + 0 :\ + (((0x4e00 <= (c)) && ((c) <= 0x9fa5)) || \ + ((c) == 0x3007) || \ + ((0x3021 <= (c)) && ((c) <= 0x3029)))) + +XMLPUBVAR const xmlChRangeGroup xmlIsIdeographicGroup; +XMLPUBVAR const unsigned char xmlIsPubidChar_tab[256]; + +/** + * xmlIsPubidChar_ch: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsPubidChar_ch(c) (xmlIsPubidChar_tab[(c)]) + +/** + * xmlIsPubidCharQ: + * @c: char to validate + * + * Automatically generated by genChRanges.py + */ +#define xmlIsPubidCharQ(c) (((c) < 0x100) ? \ + xmlIsPubidChar_ch((c)) : 0) + +XMLPUBFUN int XMLCALL + xmlIsBaseChar(unsigned int ch); +XMLPUBFUN int XMLCALL + xmlIsBlank(unsigned int ch); +XMLPUBFUN int XMLCALL + xmlIsChar(unsigned int ch); +XMLPUBFUN int XMLCALL + xmlIsCombining(unsigned int ch); +XMLPUBFUN int XMLCALL + xmlIsDigit(unsigned int ch); +XMLPUBFUN int XMLCALL + xmlIsExtender(unsigned int ch); +XMLPUBFUN int XMLCALL + xmlIsIdeographic(unsigned int ch); +XMLPUBFUN int XMLCALL + xmlIsPubidChar(unsigned int ch); + +#ifdef __cplusplus +} +#endif +#endif /* __XML_CHVALID_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/debugXML.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/debugXML.h new file mode 100644 index 000000000000..5b3be13d8572 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/debugXML.h @@ -0,0 +1,217 @@ +/* + * Summary: Tree debugging APIs + * Description: Interfaces to a set of routines used for debugging the tree + * produced by the XML parser. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __DEBUG_XML__ +#define __DEBUG_XML__ +#include <stdio.h> +#include <libxml/xmlversion.h> +#include <libxml/tree.h> + +#ifdef LIBXML_DEBUG_ENABLED + +#include <libxml/xpath.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The standard Dump routines. + */ +XMLPUBFUN void XMLCALL + xmlDebugDumpString (FILE *output, + const xmlChar *str); +XMLPUBFUN void XMLCALL + xmlDebugDumpAttr (FILE *output, + xmlAttrPtr attr, + int depth); +XMLPUBFUN void XMLCALL + xmlDebugDumpAttrList (FILE *output, + xmlAttrPtr attr, + int depth); +XMLPUBFUN void XMLCALL + xmlDebugDumpOneNode (FILE *output, + xmlNodePtr node, + int depth); +XMLPUBFUN void XMLCALL + xmlDebugDumpNode (FILE *output, + xmlNodePtr node, + int depth); +XMLPUBFUN void XMLCALL + xmlDebugDumpNodeList (FILE *output, + xmlNodePtr node, + int depth); +XMLPUBFUN void XMLCALL + xmlDebugDumpDocumentHead(FILE *output, + xmlDocPtr doc); +XMLPUBFUN void XMLCALL + xmlDebugDumpDocument (FILE *output, + xmlDocPtr doc); +XMLPUBFUN void XMLCALL + xmlDebugDumpDTD (FILE *output, + xmlDtdPtr dtd); +XMLPUBFUN void XMLCALL + xmlDebugDumpEntities (FILE *output, + xmlDocPtr doc); + +/**************************************************************** + * * + * Checking routines * + * * + ****************************************************************/ + +XMLPUBFUN int XMLCALL + xmlDebugCheckDocument (FILE * output, + xmlDocPtr doc); + +/**************************************************************** + * * + * XML shell helpers * + * * + ****************************************************************/ + +XMLPUBFUN void XMLCALL + xmlLsOneNode (FILE *output, xmlNodePtr node); +XMLPUBFUN int XMLCALL + xmlLsCountNode (xmlNodePtr node); + +XMLPUBFUN const char * XMLCALL + xmlBoolToText (int boolval); + +/**************************************************************** + * * + * The XML shell related structures and functions * + * * + ****************************************************************/ + +#ifdef LIBXML_XPATH_ENABLED +/** + * xmlShellReadlineFunc: + * @prompt: a string prompt + * + * This is a generic signature for the XML shell input function. + * + * Returns a string which will be freed by the Shell. + */ +typedef char * (* xmlShellReadlineFunc)(char *prompt); + +/** + * xmlShellCtxt: + * + * A debugging shell context. + * TODO: add the defined function tables. + */ +typedef struct _xmlShellCtxt xmlShellCtxt; +typedef xmlShellCtxt *xmlShellCtxtPtr; +struct _xmlShellCtxt { + char *filename; + xmlDocPtr doc; + xmlNodePtr node; + xmlXPathContextPtr pctxt; + int loaded; + FILE *output; + xmlShellReadlineFunc input; +}; + +/** + * xmlShellCmd: + * @ctxt: a shell context + * @arg: a string argument + * @node: a first node + * @node2: a second node + * + * This is a generic signature for the XML shell functions. + * + * Returns an int, negative returns indicating errors. + */ +typedef int (* xmlShellCmd) (xmlShellCtxtPtr ctxt, + char *arg, + xmlNodePtr node, + xmlNodePtr node2); + +XMLPUBFUN void XMLCALL + xmlShellPrintXPathError (int errorType, + const char *arg); +XMLPUBFUN void XMLCALL + xmlShellPrintXPathResult(xmlXPathObjectPtr list); +XMLPUBFUN int XMLCALL + xmlShellList (xmlShellCtxtPtr ctxt, + char *arg, + xmlNodePtr node, + xmlNodePtr node2); +XMLPUBFUN int XMLCALL + xmlShellBase (xmlShellCtxtPtr ctxt, + char *arg, + xmlNodePtr node, + xmlNodePtr node2); +XMLPUBFUN int XMLCALL + xmlShellDir (xmlShellCtxtPtr ctxt, + char *arg, + xmlNodePtr node, + xmlNodePtr node2); +XMLPUBFUN int XMLCALL + xmlShellLoad (xmlShellCtxtPtr ctxt, + char *filename, + xmlNodePtr node, + xmlNodePtr node2); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + xmlShellPrintNode (xmlNodePtr node); +XMLPUBFUN int XMLCALL + xmlShellCat (xmlShellCtxtPtr ctxt, + char *arg, + xmlNodePtr node, + xmlNodePtr node2); +XMLPUBFUN int XMLCALL + xmlShellWrite (xmlShellCtxtPtr ctxt, + char *filename, + xmlNodePtr node, + xmlNodePtr node2); +XMLPUBFUN int XMLCALL + xmlShellSave (xmlShellCtxtPtr ctxt, + char *filename, + xmlNodePtr node, + xmlNodePtr node2); +#endif /* LIBXML_OUTPUT_ENABLED */ +#ifdef LIBXML_VALID_ENABLED +XMLPUBFUN int XMLCALL + xmlShellValidate (xmlShellCtxtPtr ctxt, + char *dtd, + xmlNodePtr node, + xmlNodePtr node2); +#endif /* LIBXML_VALID_ENABLED */ +XMLPUBFUN int XMLCALL + xmlShellDu (xmlShellCtxtPtr ctxt, + char *arg, + xmlNodePtr tree, + xmlNodePtr node2); +XMLPUBFUN int XMLCALL + xmlShellPwd (xmlShellCtxtPtr ctxt, + char *buffer, + xmlNodePtr node, + xmlNodePtr node2); + +/* + * The Shell interface. + */ +XMLPUBFUN void XMLCALL + xmlShell (xmlDocPtr doc, + char *filename, + xmlShellReadlineFunc input, + FILE *output); + +#endif /* LIBXML_XPATH_ENABLED */ + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_DEBUG_ENABLED */ +#endif /* __DEBUG_XML__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/dict.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/dict.h new file mode 100644 index 000000000000..cf54af1f252a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/dict.h @@ -0,0 +1,79 @@ +/* + * Summary: string dictionary + * Description: dictionary of reusable strings, just used to avoid allocation + * and freeing operations. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_DICT_H__ +#define __XML_DICT_H__ + +#include <stddef.h> +#include <libxml/xmlversion.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The dictionary. + */ +typedef struct _xmlDict xmlDict; +typedef xmlDict *xmlDictPtr; + +/* + * Initializer + */ +XMLPUBFUN int XMLCALL xmlInitializeDict(void); + +/* + * Constructor and destructor. + */ +XMLPUBFUN xmlDictPtr XMLCALL + xmlDictCreate (void); +XMLPUBFUN size_t XMLCALL + xmlDictSetLimit (xmlDictPtr dict, + size_t limit); +XMLPUBFUN size_t XMLCALL + xmlDictGetUsage (xmlDictPtr dict); +XMLPUBFUN xmlDictPtr XMLCALL + xmlDictCreateSub(xmlDictPtr sub); +XMLPUBFUN int XMLCALL + xmlDictReference(xmlDictPtr dict); +XMLPUBFUN void XMLCALL + xmlDictFree (xmlDictPtr dict); + +/* + * Lookup of entry in the dictionary. + */ +XMLPUBFUN const xmlChar * XMLCALL + xmlDictLookup (xmlDictPtr dict, + const xmlChar *name, + int len); +XMLPUBFUN const xmlChar * XMLCALL + xmlDictExists (xmlDictPtr dict, + const xmlChar *name, + int len); +XMLPUBFUN const xmlChar * XMLCALL + xmlDictQLookup (xmlDictPtr dict, + const xmlChar *prefix, + const xmlChar *name); +XMLPUBFUN int XMLCALL + xmlDictOwns (xmlDictPtr dict, + const xmlChar *str); +XMLPUBFUN int XMLCALL + xmlDictSize (xmlDictPtr dict); + +/* + * Cleanup function + */ +XMLPUBFUN void XMLCALL + xmlDictCleanup (void); + +#ifdef __cplusplus +} +#endif +#endif /* ! __XML_DICT_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/encoding.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/encoding.h new file mode 100644 index 000000000000..c875af6fb7c2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/encoding.h @@ -0,0 +1,245 @@ +/* + * Summary: interface for the encoding conversion functions + * Description: interface for the encoding conversion functions needed for + * XML basic encoding and iconv() support. + * + * Related specs are + * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies + * [ISO-10646] UTF-8 and UTF-16 in Annexes + * [ISO-8859-1] ISO Latin-1 characters codes. + * [UNICODE] The Unicode Consortium, "The Unicode Standard -- + * Worldwide Character Encoding -- Version 1.0", Addison- + * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is + * described in Unicode Technical Report #4. + * [US-ASCII] Coded Character Set--7-bit American Standard Code for + * Information Interchange, ANSI X3.4-1986. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_CHAR_ENCODING_H__ +#define __XML_CHAR_ENCODING_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_ICONV_ENABLED +#include <iconv.h> +#endif +#ifdef LIBXML_ICU_ENABLED +#include <unicode/ucnv.h> +#endif +#ifdef __cplusplus +extern "C" { +#endif + +/* + * xmlCharEncoding: + * + * Predefined values for some standard encodings. + * Libxml does not do beforehand translation on UTF8 and ISOLatinX. + * It also supports ASCII, ISO-8859-1, and UTF16 (LE and BE) by default. + * + * Anything else would have to be translated to UTF8 before being + * given to the parser itself. The BOM for UTF16 and the encoding + * declaration are looked at and a converter is looked for at that + * point. If not found the parser stops here as asked by the XML REC. A + * converter can be registered by the user using xmlRegisterCharEncodingHandler + * but the current form doesn't allow stateful transcoding (a serious + * problem agreed !). If iconv has been found it will be used + * automatically and allow stateful transcoding, the simplest is then + * to be sure to enable iconv and to provide iconv libs for the encoding + * support needed. + * + * Note that the generic "UTF-16" is not a predefined value. Instead, only + * the specific UTF-16LE and UTF-16BE are present. + */ +typedef enum { + XML_CHAR_ENCODING_ERROR= -1, /* No char encoding detected */ + XML_CHAR_ENCODING_NONE= 0, /* No char encoding detected */ + XML_CHAR_ENCODING_UTF8= 1, /* UTF-8 */ + XML_CHAR_ENCODING_UTF16LE= 2, /* UTF-16 little endian */ + XML_CHAR_ENCODING_UTF16BE= 3, /* UTF-16 big endian */ + XML_CHAR_ENCODING_UCS4LE= 4, /* UCS-4 little endian */ + XML_CHAR_ENCODING_UCS4BE= 5, /* UCS-4 big endian */ + XML_CHAR_ENCODING_EBCDIC= 6, /* EBCDIC uh! */ + XML_CHAR_ENCODING_UCS4_2143=7, /* UCS-4 unusual ordering */ + XML_CHAR_ENCODING_UCS4_3412=8, /* UCS-4 unusual ordering */ + XML_CHAR_ENCODING_UCS2= 9, /* UCS-2 */ + XML_CHAR_ENCODING_8859_1= 10,/* ISO-8859-1 ISO Latin 1 */ + XML_CHAR_ENCODING_8859_2= 11,/* ISO-8859-2 ISO Latin 2 */ + XML_CHAR_ENCODING_8859_3= 12,/* ISO-8859-3 */ + XML_CHAR_ENCODING_8859_4= 13,/* ISO-8859-4 */ + XML_CHAR_ENCODING_8859_5= 14,/* ISO-8859-5 */ + XML_CHAR_ENCODING_8859_6= 15,/* ISO-8859-6 */ + XML_CHAR_ENCODING_8859_7= 16,/* ISO-8859-7 */ + XML_CHAR_ENCODING_8859_8= 17,/* ISO-8859-8 */ + XML_CHAR_ENCODING_8859_9= 18,/* ISO-8859-9 */ + XML_CHAR_ENCODING_2022_JP= 19,/* ISO-2022-JP */ + XML_CHAR_ENCODING_SHIFT_JIS=20,/* Shift_JIS */ + XML_CHAR_ENCODING_EUC_JP= 21,/* EUC-JP */ + XML_CHAR_ENCODING_ASCII= 22 /* pure ASCII */ +} xmlCharEncoding; + +/** + * xmlCharEncodingInputFunc: + * @out: a pointer to an array of bytes to store the UTF-8 result + * @outlen: the length of @out + * @in: a pointer to an array of chars in the original encoding + * @inlen: the length of @in + * + * Take a block of chars in the original encoding and try to convert + * it to an UTF-8 block of chars out. + * + * Returns the number of bytes written, -1 if lack of space, or -2 + * if the transcoding failed. + * The value of @inlen after return is the number of octets consumed + * if the return value is positive, else unpredictiable. + * The value of @outlen after return is the number of octets consumed. + */ +typedef int (* xmlCharEncodingInputFunc)(unsigned char *out, int *outlen, + const unsigned char *in, int *inlen); + + +/** + * xmlCharEncodingOutputFunc: + * @out: a pointer to an array of bytes to store the result + * @outlen: the length of @out + * @in: a pointer to an array of UTF-8 chars + * @inlen: the length of @in + * + * Take a block of UTF-8 chars in and try to convert it to another + * encoding. + * Note: a first call designed to produce heading info is called with + * in = NULL. If stateful this should also initialize the encoder state. + * + * Returns the number of bytes written, -1 if lack of space, or -2 + * if the transcoding failed. + * The value of @inlen after return is the number of octets consumed + * if the return value is positive, else unpredictiable. + * The value of @outlen after return is the number of octets produced. + */ +typedef int (* xmlCharEncodingOutputFunc)(unsigned char *out, int *outlen, + const unsigned char *in, int *inlen); + + +/* + * Block defining the handlers for non UTF-8 encodings. + * If iconv is supported, there are two extra fields. + */ +#ifdef LIBXML_ICU_ENABLED +/* Size of pivot buffer, same as icu/source/common/ucnv.cpp CHUNK_SIZE */ +#define ICU_PIVOT_BUF_SIZE 1024 +struct _uconv_t { + UConverter *uconv; /* for conversion between an encoding and UTF-16 */ + UConverter *utf8; /* for conversion between UTF-8 and UTF-16 */ + UChar pivot_buf[ICU_PIVOT_BUF_SIZE]; + UChar *pivot_source; + UChar *pivot_target; +}; +typedef struct _uconv_t uconv_t; +#endif + +typedef struct _xmlCharEncodingHandler xmlCharEncodingHandler; +typedef xmlCharEncodingHandler *xmlCharEncodingHandlerPtr; +struct _xmlCharEncodingHandler { + char *name; + xmlCharEncodingInputFunc input; + xmlCharEncodingOutputFunc output; +#ifdef LIBXML_ICONV_ENABLED + iconv_t iconv_in; + iconv_t iconv_out; +#endif /* LIBXML_ICONV_ENABLED */ +#ifdef LIBXML_ICU_ENABLED + uconv_t *uconv_in; + uconv_t *uconv_out; +#endif /* LIBXML_ICU_ENABLED */ +}; + +#ifdef __cplusplus +} +#endif +#include <libxml/tree.h> +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Interfaces for encoding handlers. + */ +XMLPUBFUN void XMLCALL + xmlInitCharEncodingHandlers (void); +XMLPUBFUN void XMLCALL + xmlCleanupCharEncodingHandlers (void); +XMLPUBFUN void XMLCALL + xmlRegisterCharEncodingHandler (xmlCharEncodingHandlerPtr handler); +XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL + xmlGetCharEncodingHandler (xmlCharEncoding enc); +XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL + xmlFindCharEncodingHandler (const char *name); +XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL + xmlNewCharEncodingHandler (const char *name, + xmlCharEncodingInputFunc input, + xmlCharEncodingOutputFunc output); + +/* + * Interfaces for encoding names and aliases. + */ +XMLPUBFUN int XMLCALL + xmlAddEncodingAlias (const char *name, + const char *alias); +XMLPUBFUN int XMLCALL + xmlDelEncodingAlias (const char *alias); +XMLPUBFUN const char * XMLCALL + xmlGetEncodingAlias (const char *alias); +XMLPUBFUN void XMLCALL + xmlCleanupEncodingAliases (void); +XMLPUBFUN xmlCharEncoding XMLCALL + xmlParseCharEncoding (const char *name); +XMLPUBFUN const char * XMLCALL + xmlGetCharEncodingName (xmlCharEncoding enc); + +/* + * Interfaces directly used by the parsers. + */ +XMLPUBFUN xmlCharEncoding XMLCALL + xmlDetectCharEncoding (const unsigned char *in, + int len); + +XMLPUBFUN int XMLCALL + xmlCharEncOutFunc (xmlCharEncodingHandler *handler, + xmlBufferPtr out, + xmlBufferPtr in); + +XMLPUBFUN int XMLCALL + xmlCharEncInFunc (xmlCharEncodingHandler *handler, + xmlBufferPtr out, + xmlBufferPtr in); +XMLPUBFUN int XMLCALL + xmlCharEncFirstLine (xmlCharEncodingHandler *handler, + xmlBufferPtr out, + xmlBufferPtr in); +XMLPUBFUN int XMLCALL + xmlCharEncCloseFunc (xmlCharEncodingHandler *handler); + +/* + * Export a few useful functions + */ +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN int XMLCALL + UTF8Toisolat1 (unsigned char *out, + int *outlen, + const unsigned char *in, + int *inlen); +#endif /* LIBXML_OUTPUT_ENABLED */ +XMLPUBFUN int XMLCALL + isolat1ToUTF8 (unsigned char *out, + int *outlen, + const unsigned char *in, + int *inlen); +#ifdef __cplusplus +} +#endif + +#endif /* __XML_CHAR_ENCODING_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/entities.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/entities.h new file mode 100644 index 000000000000..47b4573eba65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/entities.h @@ -0,0 +1,151 @@ +/* + * Summary: interface for the XML entities handling + * Description: this module provides some of the entity API needed + * for the parser and applications. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_ENTITIES_H__ +#define __XML_ENTITIES_H__ + +#include <libxml/xmlversion.h> +#include <libxml/tree.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The different valid entity types. + */ +typedef enum { + XML_INTERNAL_GENERAL_ENTITY = 1, + XML_EXTERNAL_GENERAL_PARSED_ENTITY = 2, + XML_EXTERNAL_GENERAL_UNPARSED_ENTITY = 3, + XML_INTERNAL_PARAMETER_ENTITY = 4, + XML_EXTERNAL_PARAMETER_ENTITY = 5, + XML_INTERNAL_PREDEFINED_ENTITY = 6 +} xmlEntityType; + +/* + * An unit of storage for an entity, contains the string, the value + * and the linkind data needed for the linking in the hash table. + */ + +struct _xmlEntity { + void *_private; /* application data */ + xmlElementType type; /* XML_ENTITY_DECL, must be second ! */ + const xmlChar *name; /* Entity name */ + struct _xmlNode *children; /* First child link */ + struct _xmlNode *last; /* Last child link */ + struct _xmlDtd *parent; /* -> DTD */ + struct _xmlNode *next; /* next sibling link */ + struct _xmlNode *prev; /* previous sibling link */ + struct _xmlDoc *doc; /* the containing document */ + + xmlChar *orig; /* content without ref substitution */ + xmlChar *content; /* content or ndata if unparsed */ + int length; /* the content length */ + xmlEntityType etype; /* The entity type */ + const xmlChar *ExternalID; /* External identifier for PUBLIC */ + const xmlChar *SystemID; /* URI for a SYSTEM or PUBLIC Entity */ + + struct _xmlEntity *nexte; /* unused */ + const xmlChar *URI; /* the full URI as computed */ + int owner; /* does the entity own the childrens */ + int checked; /* was the entity content checked */ + /* this is also used to count entities + * references done from that entity + * and if it contains '<' */ +}; + +/* + * All entities are stored in an hash table. + * There is 2 separate hash tables for global and parameter entities. + */ + +typedef struct _xmlHashTable xmlEntitiesTable; +typedef xmlEntitiesTable *xmlEntitiesTablePtr; + +/* + * External functions: + */ + +#ifdef LIBXML_LEGACY_ENABLED +XMLPUBFUN void XMLCALL + xmlInitializePredefinedEntities (void); +#endif /* LIBXML_LEGACY_ENABLED */ + +XMLPUBFUN xmlEntityPtr XMLCALL + xmlNewEntity (xmlDocPtr doc, + const xmlChar *name, + int type, + const xmlChar *ExternalID, + const xmlChar *SystemID, + const xmlChar *content); +XMLPUBFUN xmlEntityPtr XMLCALL + xmlAddDocEntity (xmlDocPtr doc, + const xmlChar *name, + int type, + const xmlChar *ExternalID, + const xmlChar *SystemID, + const xmlChar *content); +XMLPUBFUN xmlEntityPtr XMLCALL + xmlAddDtdEntity (xmlDocPtr doc, + const xmlChar *name, + int type, + const xmlChar *ExternalID, + const xmlChar *SystemID, + const xmlChar *content); +XMLPUBFUN xmlEntityPtr XMLCALL + xmlGetPredefinedEntity (const xmlChar *name); +XMLPUBFUN xmlEntityPtr XMLCALL + xmlGetDocEntity (const xmlDoc *doc, + const xmlChar *name); +XMLPUBFUN xmlEntityPtr XMLCALL + xmlGetDtdEntity (xmlDocPtr doc, + const xmlChar *name); +XMLPUBFUN xmlEntityPtr XMLCALL + xmlGetParameterEntity (xmlDocPtr doc, + const xmlChar *name); +#ifdef LIBXML_LEGACY_ENABLED +XMLPUBFUN const xmlChar * XMLCALL + xmlEncodeEntities (xmlDocPtr doc, + const xmlChar *input); +#endif /* LIBXML_LEGACY_ENABLED */ +XMLPUBFUN xmlChar * XMLCALL + xmlEncodeEntitiesReentrant(xmlDocPtr doc, + const xmlChar *input); +XMLPUBFUN xmlChar * XMLCALL + xmlEncodeSpecialChars (const xmlDoc *doc, + const xmlChar *input); +XMLPUBFUN xmlEntitiesTablePtr XMLCALL + xmlCreateEntitiesTable (void); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN xmlEntitiesTablePtr XMLCALL + xmlCopyEntitiesTable (xmlEntitiesTablePtr table); +#endif /* LIBXML_TREE_ENABLED */ +XMLPUBFUN void XMLCALL + xmlFreeEntitiesTable (xmlEntitiesTablePtr table); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + xmlDumpEntitiesTable (xmlBufferPtr buf, + xmlEntitiesTablePtr table); +XMLPUBFUN void XMLCALL + xmlDumpEntityDecl (xmlBufferPtr buf, + xmlEntityPtr ent); +#endif /* LIBXML_OUTPUT_ENABLED */ +#ifdef LIBXML_LEGACY_ENABLED +XMLPUBFUN void XMLCALL + xmlCleanupPredefinedEntities(void); +#endif /* LIBXML_LEGACY_ENABLED */ + + +#ifdef __cplusplus +} +#endif + +# endif /* __XML_ENTITIES_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/globals.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/globals.h new file mode 100644 index 000000000000..5e41b7bb5f82 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/globals.h @@ -0,0 +1,508 @@ +/* + * Summary: interface for all global variables of the library + * Description: all the global variables and thread handling for + * those variables is handled by this module. + * + * The bottom of this file is automatically generated by build_glob.py + * based on the description file global.data + * + * Copy: See Copyright for the status of this software. + * + * Author: Gary Pennington <Gary.Pennington@uk.sun.com>, Daniel Veillard + */ + +#ifndef __XML_GLOBALS_H +#define __XML_GLOBALS_H + +#include <libxml/xmlversion.h> +#include <libxml/parser.h> +#include <libxml/xmlerror.h> +#include <libxml/SAX2.h> +#include <libxml/xmlmemory.h> + +#ifdef __cplusplus +extern "C" { +#endif + +XMLPUBFUN void XMLCALL xmlInitGlobals(void); +XMLPUBFUN void XMLCALL xmlCleanupGlobals(void); + +/** + * xmlParserInputBufferCreateFilenameFunc: + * @URI: the URI to read from + * @enc: the requested source encoding + * + * Signature for the function doing the lookup for a suitable input method + * corresponding to an URI. + * + * Returns the new xmlParserInputBufferPtr in case of success or NULL if no + * method was found. + */ +typedef xmlParserInputBufferPtr (*xmlParserInputBufferCreateFilenameFunc) (const char *URI, + xmlCharEncoding enc); + + +/** + * xmlOutputBufferCreateFilenameFunc: + * @URI: the URI to write to + * @enc: the requested target encoding + * + * Signature for the function doing the lookup for a suitable output method + * corresponding to an URI. + * + * Returns the new xmlOutputBufferPtr in case of success or NULL if no + * method was found. + */ +typedef xmlOutputBufferPtr (*xmlOutputBufferCreateFilenameFunc) (const char *URI, + xmlCharEncodingHandlerPtr encoder, + int compression); + +XMLPUBFUN xmlParserInputBufferCreateFilenameFunc +XMLCALL xmlParserInputBufferCreateFilenameDefault (xmlParserInputBufferCreateFilenameFunc func); +XMLPUBFUN xmlOutputBufferCreateFilenameFunc +XMLCALL xmlOutputBufferCreateFilenameDefault (xmlOutputBufferCreateFilenameFunc func); + +/* + * Externally global symbols which need to be protected for backwards + * compatibility support. + */ + +#undef docbDefaultSAXHandler +#undef htmlDefaultSAXHandler +#undef oldXMLWDcompatibility +#undef xmlBufferAllocScheme +#undef xmlDefaultBufferSize +#undef xmlDefaultSAXHandler +#undef xmlDefaultSAXLocator +#undef xmlDoValidityCheckingDefaultValue +#undef xmlFree +#undef xmlGenericError +#undef xmlStructuredError +#undef xmlGenericErrorContext +#undef xmlStructuredErrorContext +#undef xmlGetWarningsDefaultValue +#undef xmlIndentTreeOutput +#undef xmlTreeIndentString +#undef xmlKeepBlanksDefaultValue +#undef xmlLineNumbersDefaultValue +#undef xmlLoadExtDtdDefaultValue +#undef xmlMalloc +#undef xmlMallocAtomic +#undef xmlMemStrdup +#undef xmlParserDebugEntities +#undef xmlParserVersion +#undef xmlPedanticParserDefaultValue +#undef xmlRealloc +#undef xmlSaveNoEmptyTags +#undef xmlSubstituteEntitiesDefaultValue +#undef xmlRegisterNodeDefaultValue +#undef xmlDeregisterNodeDefaultValue +#undef xmlLastError +#undef xmlParserInputBufferCreateFilenameValue +#undef xmlOutputBufferCreateFilenameValue + +/** + * xmlRegisterNodeFunc: + * @node: the current node + * + * Signature for the registration callback of a created node + */ +typedef void (*xmlRegisterNodeFunc) (xmlNodePtr node); +/** + * xmlDeregisterNodeFunc: + * @node: the current node + * + * Signature for the deregistration callback of a discarded node + */ +typedef void (*xmlDeregisterNodeFunc) (xmlNodePtr node); + +typedef struct _xmlGlobalState xmlGlobalState; +typedef xmlGlobalState *xmlGlobalStatePtr; +struct _xmlGlobalState +{ + const char *xmlParserVersion; + + xmlSAXLocator xmlDefaultSAXLocator; + xmlSAXHandlerV1 xmlDefaultSAXHandler; + xmlSAXHandlerV1 docbDefaultSAXHandler; + xmlSAXHandlerV1 htmlDefaultSAXHandler; + + xmlFreeFunc xmlFree; + xmlMallocFunc xmlMalloc; + xmlStrdupFunc xmlMemStrdup; + xmlReallocFunc xmlRealloc; + + xmlGenericErrorFunc xmlGenericError; + xmlStructuredErrorFunc xmlStructuredError; + void *xmlGenericErrorContext; + + int oldXMLWDcompatibility; + + xmlBufferAllocationScheme xmlBufferAllocScheme; + int xmlDefaultBufferSize; + + int xmlSubstituteEntitiesDefaultValue; + int xmlDoValidityCheckingDefaultValue; + int xmlGetWarningsDefaultValue; + int xmlKeepBlanksDefaultValue; + int xmlLineNumbersDefaultValue; + int xmlLoadExtDtdDefaultValue; + int xmlParserDebugEntities; + int xmlPedanticParserDefaultValue; + + int xmlSaveNoEmptyTags; + int xmlIndentTreeOutput; + const char *xmlTreeIndentString; + + xmlRegisterNodeFunc xmlRegisterNodeDefaultValue; + xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue; + + xmlMallocFunc xmlMallocAtomic; + xmlError xmlLastError; + + xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue; + xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue; + + void *xmlStructuredErrorContext; +}; + +#ifdef __cplusplus +} +#endif +#include <libxml/threads.h> +#ifdef __cplusplus +extern "C" { +#endif + +XMLPUBFUN void XMLCALL xmlInitializeGlobalState(xmlGlobalStatePtr gs); + +XMLPUBFUN void XMLCALL xmlThrDefSetGenericErrorFunc(void *ctx, xmlGenericErrorFunc handler); + +XMLPUBFUN void XMLCALL xmlThrDefSetStructuredErrorFunc(void *ctx, xmlStructuredErrorFunc handler); + +XMLPUBFUN xmlRegisterNodeFunc XMLCALL xmlRegisterNodeDefault(xmlRegisterNodeFunc func); +XMLPUBFUN xmlRegisterNodeFunc XMLCALL xmlThrDefRegisterNodeDefault(xmlRegisterNodeFunc func); +XMLPUBFUN xmlDeregisterNodeFunc XMLCALL xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func); +XMLPUBFUN xmlDeregisterNodeFunc XMLCALL xmlThrDefDeregisterNodeDefault(xmlDeregisterNodeFunc func); + +XMLPUBFUN xmlOutputBufferCreateFilenameFunc XMLCALL + xmlThrDefOutputBufferCreateFilenameDefault(xmlOutputBufferCreateFilenameFunc func); +XMLPUBFUN xmlParserInputBufferCreateFilenameFunc XMLCALL + xmlThrDefParserInputBufferCreateFilenameDefault( + xmlParserInputBufferCreateFilenameFunc func); + +/** DOC_DISABLE */ +/* + * In general the memory allocation entry points are not kept + * thread specific but this can be overridden by LIBXML_THREAD_ALLOC_ENABLED + * - xmlMalloc + * - xmlMallocAtomic + * - xmlRealloc + * - xmlMemStrdup + * - xmlFree + */ + +#ifdef LIBXML_THREAD_ALLOC_ENABLED +#ifdef LIBXML_THREAD_ENABLED +XMLPUBFUN xmlMallocFunc * XMLCALL __xmlMalloc(void); +#define xmlMalloc \ +(*(__xmlMalloc())) +#else +XMLPUBVAR xmlMallocFunc xmlMalloc; +#endif + +#ifdef LIBXML_THREAD_ENABLED +XMLPUBFUN xmlMallocFunc * XMLCALL __xmlMallocAtomic(void); +#define xmlMallocAtomic \ +(*(__xmlMallocAtomic())) +#else +XMLPUBVAR xmlMallocFunc xmlMallocAtomic; +#endif + +#ifdef LIBXML_THREAD_ENABLED +XMLPUBFUN xmlReallocFunc * XMLCALL __xmlRealloc(void); +#define xmlRealloc \ +(*(__xmlRealloc())) +#else +XMLPUBVAR xmlReallocFunc xmlRealloc; +#endif + +#ifdef LIBXML_THREAD_ENABLED +XMLPUBFUN xmlFreeFunc * XMLCALL __xmlFree(void); +#define xmlFree \ +(*(__xmlFree())) +#else +XMLPUBVAR xmlFreeFunc xmlFree; +#endif + +#ifdef LIBXML_THREAD_ENABLED +XMLPUBFUN xmlStrdupFunc * XMLCALL __xmlMemStrdup(void); +#define xmlMemStrdup \ +(*(__xmlMemStrdup())) +#else +XMLPUBVAR xmlStrdupFunc xmlMemStrdup; +#endif + +#else /* !LIBXML_THREAD_ALLOC_ENABLED */ +XMLPUBVAR xmlMallocFunc xmlMalloc; +XMLPUBVAR xmlMallocFunc xmlMallocAtomic; +XMLPUBVAR xmlReallocFunc xmlRealloc; +XMLPUBVAR xmlFreeFunc xmlFree; +XMLPUBVAR xmlStrdupFunc xmlMemStrdup; +#endif /* LIBXML_THREAD_ALLOC_ENABLED */ + +#ifdef LIBXML_DOCB_ENABLED +XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __docbDefaultSAXHandler(void); +#ifdef LIBXML_THREAD_ENABLED +#define docbDefaultSAXHandler \ +(*(__docbDefaultSAXHandler())) +#else +XMLPUBVAR xmlSAXHandlerV1 docbDefaultSAXHandler; +#endif +#endif + +#ifdef LIBXML_HTML_ENABLED +XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __htmlDefaultSAXHandler(void); +#ifdef LIBXML_THREAD_ENABLED +#define htmlDefaultSAXHandler \ +(*(__htmlDefaultSAXHandler())) +#else +XMLPUBVAR xmlSAXHandlerV1 htmlDefaultSAXHandler; +#endif +#endif + +XMLPUBFUN xmlError * XMLCALL __xmlLastError(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlLastError \ +(*(__xmlLastError())) +#else +XMLPUBVAR xmlError xmlLastError; +#endif + +/* + * Everything starting from the line below is + * Automatically generated by build_glob.py. + * Do not modify the previous line. + */ + + +XMLPUBFUN int * XMLCALL __oldXMLWDcompatibility(void); +#ifdef LIBXML_THREAD_ENABLED +#define oldXMLWDcompatibility \ +(*(__oldXMLWDcompatibility())) +#else +XMLPUBVAR int oldXMLWDcompatibility; +#endif + +XMLPUBFUN xmlBufferAllocationScheme * XMLCALL __xmlBufferAllocScheme(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlBufferAllocScheme \ +(*(__xmlBufferAllocScheme())) +#else +XMLPUBVAR xmlBufferAllocationScheme xmlBufferAllocScheme; +#endif +XMLPUBFUN xmlBufferAllocationScheme XMLCALL + xmlThrDefBufferAllocScheme(xmlBufferAllocationScheme v); + +XMLPUBFUN int * XMLCALL __xmlDefaultBufferSize(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlDefaultBufferSize \ +(*(__xmlDefaultBufferSize())) +#else +XMLPUBVAR int xmlDefaultBufferSize; +#endif +XMLPUBFUN int XMLCALL xmlThrDefDefaultBufferSize(int v); + +XMLPUBFUN xmlSAXHandlerV1 * XMLCALL __xmlDefaultSAXHandler(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlDefaultSAXHandler \ +(*(__xmlDefaultSAXHandler())) +#else +XMLPUBVAR xmlSAXHandlerV1 xmlDefaultSAXHandler; +#endif + +XMLPUBFUN xmlSAXLocator * XMLCALL __xmlDefaultSAXLocator(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlDefaultSAXLocator \ +(*(__xmlDefaultSAXLocator())) +#else +XMLPUBVAR xmlSAXLocator xmlDefaultSAXLocator; +#endif + +XMLPUBFUN int * XMLCALL __xmlDoValidityCheckingDefaultValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlDoValidityCheckingDefaultValue \ +(*(__xmlDoValidityCheckingDefaultValue())) +#else +XMLPUBVAR int xmlDoValidityCheckingDefaultValue; +#endif +XMLPUBFUN int XMLCALL xmlThrDefDoValidityCheckingDefaultValue(int v); + +XMLPUBFUN xmlGenericErrorFunc * XMLCALL __xmlGenericError(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlGenericError \ +(*(__xmlGenericError())) +#else +XMLPUBVAR xmlGenericErrorFunc xmlGenericError; +#endif + +XMLPUBFUN xmlStructuredErrorFunc * XMLCALL __xmlStructuredError(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlStructuredError \ +(*(__xmlStructuredError())) +#else +XMLPUBVAR xmlStructuredErrorFunc xmlStructuredError; +#endif + +XMLPUBFUN void * * XMLCALL __xmlGenericErrorContext(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlGenericErrorContext \ +(*(__xmlGenericErrorContext())) +#else +XMLPUBVAR void * xmlGenericErrorContext; +#endif + +XMLPUBFUN void * * XMLCALL __xmlStructuredErrorContext(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlStructuredErrorContext \ +(*(__xmlStructuredErrorContext())) +#else +XMLPUBVAR void * xmlStructuredErrorContext; +#endif + +XMLPUBFUN int * XMLCALL __xmlGetWarningsDefaultValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlGetWarningsDefaultValue \ +(*(__xmlGetWarningsDefaultValue())) +#else +XMLPUBVAR int xmlGetWarningsDefaultValue; +#endif +XMLPUBFUN int XMLCALL xmlThrDefGetWarningsDefaultValue(int v); + +XMLPUBFUN int * XMLCALL __xmlIndentTreeOutput(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlIndentTreeOutput \ +(*(__xmlIndentTreeOutput())) +#else +XMLPUBVAR int xmlIndentTreeOutput; +#endif +XMLPUBFUN int XMLCALL xmlThrDefIndentTreeOutput(int v); + +XMLPUBFUN const char * * XMLCALL __xmlTreeIndentString(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlTreeIndentString \ +(*(__xmlTreeIndentString())) +#else +XMLPUBVAR const char * xmlTreeIndentString; +#endif +XMLPUBFUN const char * XMLCALL xmlThrDefTreeIndentString(const char * v); + +XMLPUBFUN int * XMLCALL __xmlKeepBlanksDefaultValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlKeepBlanksDefaultValue \ +(*(__xmlKeepBlanksDefaultValue())) +#else +XMLPUBVAR int xmlKeepBlanksDefaultValue; +#endif +XMLPUBFUN int XMLCALL xmlThrDefKeepBlanksDefaultValue(int v); + +XMLPUBFUN int * XMLCALL __xmlLineNumbersDefaultValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlLineNumbersDefaultValue \ +(*(__xmlLineNumbersDefaultValue())) +#else +XMLPUBVAR int xmlLineNumbersDefaultValue; +#endif +XMLPUBFUN int XMLCALL xmlThrDefLineNumbersDefaultValue(int v); + +XMLPUBFUN int * XMLCALL __xmlLoadExtDtdDefaultValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlLoadExtDtdDefaultValue \ +(*(__xmlLoadExtDtdDefaultValue())) +#else +XMLPUBVAR int xmlLoadExtDtdDefaultValue; +#endif +XMLPUBFUN int XMLCALL xmlThrDefLoadExtDtdDefaultValue(int v); + +XMLPUBFUN int * XMLCALL __xmlParserDebugEntities(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlParserDebugEntities \ +(*(__xmlParserDebugEntities())) +#else +XMLPUBVAR int xmlParserDebugEntities; +#endif +XMLPUBFUN int XMLCALL xmlThrDefParserDebugEntities(int v); + +XMLPUBFUN const char * * XMLCALL __xmlParserVersion(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlParserVersion \ +(*(__xmlParserVersion())) +#else +XMLPUBVAR const char * xmlParserVersion; +#endif + +XMLPUBFUN int * XMLCALL __xmlPedanticParserDefaultValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlPedanticParserDefaultValue \ +(*(__xmlPedanticParserDefaultValue())) +#else +XMLPUBVAR int xmlPedanticParserDefaultValue; +#endif +XMLPUBFUN int XMLCALL xmlThrDefPedanticParserDefaultValue(int v); + +XMLPUBFUN int * XMLCALL __xmlSaveNoEmptyTags(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlSaveNoEmptyTags \ +(*(__xmlSaveNoEmptyTags())) +#else +XMLPUBVAR int xmlSaveNoEmptyTags; +#endif +XMLPUBFUN int XMLCALL xmlThrDefSaveNoEmptyTags(int v); + +XMLPUBFUN int * XMLCALL __xmlSubstituteEntitiesDefaultValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlSubstituteEntitiesDefaultValue \ +(*(__xmlSubstituteEntitiesDefaultValue())) +#else +XMLPUBVAR int xmlSubstituteEntitiesDefaultValue; +#endif +XMLPUBFUN int XMLCALL xmlThrDefSubstituteEntitiesDefaultValue(int v); + +XMLPUBFUN xmlRegisterNodeFunc * XMLCALL __xmlRegisterNodeDefaultValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlRegisterNodeDefaultValue \ +(*(__xmlRegisterNodeDefaultValue())) +#else +XMLPUBVAR xmlRegisterNodeFunc xmlRegisterNodeDefaultValue; +#endif + +XMLPUBFUN xmlDeregisterNodeFunc * XMLCALL __xmlDeregisterNodeDefaultValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlDeregisterNodeDefaultValue \ +(*(__xmlDeregisterNodeDefaultValue())) +#else +XMLPUBVAR xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue; +#endif + +XMLPUBFUN xmlParserInputBufferCreateFilenameFunc * XMLCALL \ + __xmlParserInputBufferCreateFilenameValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlParserInputBufferCreateFilenameValue \ +(*(__xmlParserInputBufferCreateFilenameValue())) +#else +XMLPUBVAR xmlParserInputBufferCreateFilenameFunc xmlParserInputBufferCreateFilenameValue; +#endif + +XMLPUBFUN xmlOutputBufferCreateFilenameFunc * XMLCALL __xmlOutputBufferCreateFilenameValue(void); +#ifdef LIBXML_THREAD_ENABLED +#define xmlOutputBufferCreateFilenameValue \ +(*(__xmlOutputBufferCreateFilenameValue())) +#else +XMLPUBVAR xmlOutputBufferCreateFilenameFunc xmlOutputBufferCreateFilenameValue; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_GLOBALS_H */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/hash.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/hash.h new file mode 100644 index 000000000000..b682b6b9403a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/hash.h @@ -0,0 +1,236 @@ +/* + * Summary: Chained hash tables + * Description: This module implements the hash table support used in + * various places in the library. + * + * Copy: See Copyright for the status of this software. + * + * Author: Bjorn Reese <bjorn.reese@systematic.dk> + */ + +#ifndef __XML_HASH_H__ +#define __XML_HASH_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The hash table. + */ +typedef struct _xmlHashTable xmlHashTable; +typedef xmlHashTable *xmlHashTablePtr; + +#ifdef __cplusplus +} +#endif + +#include <libxml/xmlversion.h> +#include <libxml/parser.h> +#include <libxml/dict.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Recent version of gcc produce a warning when a function pointer is assigned + * to an object pointer, or vice versa. The following macro is a dirty hack + * to allow suppression of the warning. If your architecture has function + * pointers which are a different size than a void pointer, there may be some + * serious trouble within the library. + */ +/** + * XML_CAST_FPTR: + * @fptr: pointer to a function + * + * Macro to do a casting from an object pointer to a + * function pointer without encountering a warning from + * gcc + * + * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) + * This macro violated ISO C aliasing rules (gcc4 on s390 broke) + * so it is disabled now + */ + +#define XML_CAST_FPTR(fptr) fptr + + +/* + * function types: + */ +/** + * xmlHashDeallocator: + * @payload: the data in the hash + * @name: the name associated + * + * Callback to free data from a hash. + */ +typedef void (*xmlHashDeallocator)(void *payload, const xmlChar *name); +/** + * xmlHashCopier: + * @payload: the data in the hash + * @name: the name associated + * + * Callback to copy data from a hash. + * + * Returns a copy of the data or NULL in case of error. + */ +typedef void *(*xmlHashCopier)(void *payload, const xmlChar *name); +/** + * xmlHashScanner: + * @payload: the data in the hash + * @data: extra scanner data + * @name: the name associated + * + * Callback when scanning data in a hash with the simple scanner. + */ +typedef void (*xmlHashScanner)(void *payload, void *data, const xmlChar *name); +/** + * xmlHashScannerFull: + * @payload: the data in the hash + * @data: extra scanner data + * @name: the name associated + * @name2: the second name associated + * @name3: the third name associated + * + * Callback when scanning data in a hash with the full scanner. + */ +typedef void (*xmlHashScannerFull)(void *payload, void *data, + const xmlChar *name, const xmlChar *name2, + const xmlChar *name3); + +/* + * Constructor and destructor. + */ +XMLPUBFUN xmlHashTablePtr XMLCALL + xmlHashCreate (int size); +XMLPUBFUN xmlHashTablePtr XMLCALL + xmlHashCreateDict(int size, + xmlDictPtr dict); +XMLPUBFUN void XMLCALL + xmlHashFree (xmlHashTablePtr table, + xmlHashDeallocator f); +XMLPUBFUN void XMLCALL + xmlHashDefaultDeallocator(void *entry, + const xmlChar *name); + +/* + * Add a new entry to the hash table. + */ +XMLPUBFUN int XMLCALL + xmlHashAddEntry (xmlHashTablePtr table, + const xmlChar *name, + void *userdata); +XMLPUBFUN int XMLCALL + xmlHashUpdateEntry(xmlHashTablePtr table, + const xmlChar *name, + void *userdata, + xmlHashDeallocator f); +XMLPUBFUN int XMLCALL + xmlHashAddEntry2(xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *name2, + void *userdata); +XMLPUBFUN int XMLCALL + xmlHashUpdateEntry2(xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *name2, + void *userdata, + xmlHashDeallocator f); +XMLPUBFUN int XMLCALL + xmlHashAddEntry3(xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *name2, + const xmlChar *name3, + void *userdata); +XMLPUBFUN int XMLCALL + xmlHashUpdateEntry3(xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *name2, + const xmlChar *name3, + void *userdata, + xmlHashDeallocator f); + +/* + * Remove an entry from the hash table. + */ +XMLPUBFUN int XMLCALL + xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name, + xmlHashDeallocator f); +XMLPUBFUN int XMLCALL + xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, xmlHashDeallocator f); +XMLPUBFUN int XMLCALL + xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name, + const xmlChar *name2, const xmlChar *name3, + xmlHashDeallocator f); + +/* + * Retrieve the userdata. + */ +XMLPUBFUN void * XMLCALL + xmlHashLookup (xmlHashTablePtr table, + const xmlChar *name); +XMLPUBFUN void * XMLCALL + xmlHashLookup2 (xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *name2); +XMLPUBFUN void * XMLCALL + xmlHashLookup3 (xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *name2, + const xmlChar *name3); +XMLPUBFUN void * XMLCALL + xmlHashQLookup (xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *prefix); +XMLPUBFUN void * XMLCALL + xmlHashQLookup2 (xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *prefix, + const xmlChar *name2, + const xmlChar *prefix2); +XMLPUBFUN void * XMLCALL + xmlHashQLookup3 (xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *prefix, + const xmlChar *name2, + const xmlChar *prefix2, + const xmlChar *name3, + const xmlChar *prefix3); + +/* + * Helpers. + */ +XMLPUBFUN xmlHashTablePtr XMLCALL + xmlHashCopy (xmlHashTablePtr table, + xmlHashCopier f); +XMLPUBFUN int XMLCALL + xmlHashSize (xmlHashTablePtr table); +XMLPUBFUN void XMLCALL + xmlHashScan (xmlHashTablePtr table, + xmlHashScanner f, + void *data); +XMLPUBFUN void XMLCALL + xmlHashScan3 (xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *name2, + const xmlChar *name3, + xmlHashScanner f, + void *data); +XMLPUBFUN void XMLCALL + xmlHashScanFull (xmlHashTablePtr table, + xmlHashScannerFull f, + void *data); +XMLPUBFUN void XMLCALL + xmlHashScanFull3(xmlHashTablePtr table, + const xmlChar *name, + const xmlChar *name2, + const xmlChar *name3, + xmlHashScannerFull f, + void *data); +#ifdef __cplusplus +} +#endif +#endif /* ! __XML_HASH_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/list.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/list.h new file mode 100644 index 000000000000..3211c755247b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/list.h @@ -0,0 +1,137 @@ +/* + * Summary: lists interfaces + * Description: this module implement the list support used in + * various place in the library. + * + * Copy: See Copyright for the status of this software. + * + * Author: Gary Pennington <Gary.Pennington@uk.sun.com> + */ + +#ifndef __XML_LINK_INCLUDE__ +#define __XML_LINK_INCLUDE__ + +#include <libxml/xmlversion.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _xmlLink xmlLink; +typedef xmlLink *xmlLinkPtr; + +typedef struct _xmlList xmlList; +typedef xmlList *xmlListPtr; + +/** + * xmlListDeallocator: + * @lk: the data to deallocate + * + * Callback function used to free data from a list. + */ +typedef void (*xmlListDeallocator) (xmlLinkPtr lk); +/** + * xmlListDataCompare: + * @data0: the first data + * @data1: the second data + * + * Callback function used to compare 2 data. + * + * Returns 0 is equality, -1 or 1 otherwise depending on the ordering. + */ +typedef int (*xmlListDataCompare) (const void *data0, const void *data1); +/** + * xmlListWalker: + * @data: the data found in the list + * @user: extra user provided data to the walker + * + * Callback function used when walking a list with xmlListWalk(). + * + * Returns 0 to stop walking the list, 1 otherwise. + */ +typedef int (*xmlListWalker) (const void *data, void *user); + +/* Creation/Deletion */ +XMLPUBFUN xmlListPtr XMLCALL + xmlListCreate (xmlListDeallocator deallocator, + xmlListDataCompare compare); +XMLPUBFUN void XMLCALL + xmlListDelete (xmlListPtr l); + +/* Basic Operators */ +XMLPUBFUN void * XMLCALL + xmlListSearch (xmlListPtr l, + void *data); +XMLPUBFUN void * XMLCALL + xmlListReverseSearch (xmlListPtr l, + void *data); +XMLPUBFUN int XMLCALL + xmlListInsert (xmlListPtr l, + void *data) ; +XMLPUBFUN int XMLCALL + xmlListAppend (xmlListPtr l, + void *data) ; +XMLPUBFUN int XMLCALL + xmlListRemoveFirst (xmlListPtr l, + void *data); +XMLPUBFUN int XMLCALL + xmlListRemoveLast (xmlListPtr l, + void *data); +XMLPUBFUN int XMLCALL + xmlListRemoveAll (xmlListPtr l, + void *data); +XMLPUBFUN void XMLCALL + xmlListClear (xmlListPtr l); +XMLPUBFUN int XMLCALL + xmlListEmpty (xmlListPtr l); +XMLPUBFUN xmlLinkPtr XMLCALL + xmlListFront (xmlListPtr l); +XMLPUBFUN xmlLinkPtr XMLCALL + xmlListEnd (xmlListPtr l); +XMLPUBFUN int XMLCALL + xmlListSize (xmlListPtr l); + +XMLPUBFUN void XMLCALL + xmlListPopFront (xmlListPtr l); +XMLPUBFUN void XMLCALL + xmlListPopBack (xmlListPtr l); +XMLPUBFUN int XMLCALL + xmlListPushFront (xmlListPtr l, + void *data); +XMLPUBFUN int XMLCALL + xmlListPushBack (xmlListPtr l, + void *data); + +/* Advanced Operators */ +XMLPUBFUN void XMLCALL + xmlListReverse (xmlListPtr l); +XMLPUBFUN void XMLCALL + xmlListSort (xmlListPtr l); +XMLPUBFUN void XMLCALL + xmlListWalk (xmlListPtr l, + xmlListWalker walker, + void *user); +XMLPUBFUN void XMLCALL + xmlListReverseWalk (xmlListPtr l, + xmlListWalker walker, + void *user); +XMLPUBFUN void XMLCALL + xmlListMerge (xmlListPtr l1, + xmlListPtr l2); +XMLPUBFUN xmlListPtr XMLCALL + xmlListDup (const xmlListPtr old); +XMLPUBFUN int XMLCALL + xmlListCopy (xmlListPtr cur, + const xmlListPtr old); +/* Link operators */ +XMLPUBFUN void * XMLCALL + xmlLinkGetData (xmlLinkPtr lk); + +/* xmlListUnique() */ +/* xmlListSwap */ + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_LINK_INCLUDE__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/nanoftp.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/nanoftp.h new file mode 100644 index 000000000000..7335faf10751 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/nanoftp.h @@ -0,0 +1,163 @@ +/* + * Summary: minimal FTP implementation + * Description: minimal FTP implementation allowing to fetch resources + * like external subset. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __NANO_FTP_H__ +#define __NANO_FTP_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_FTP_ENABLED + +/* Needed for portability to Windows 64 bits */ +#if defined(_WIN32) && !defined(__CYGWIN__) +#include <winsock2.h> +#else +/** + * SOCKET: + * + * macro used to provide portability of code to windows sockets + */ +#define SOCKET int +/** + * INVALID_SOCKET: + * + * macro used to provide portability of code to windows sockets + * the value to be used when the socket is not valid + */ +#undef INVALID_SOCKET +#define INVALID_SOCKET (-1) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * ftpListCallback: + * @userData: user provided data for the callback + * @filename: the file name (including "->" when links are shown) + * @attrib: the attribute string + * @owner: the owner string + * @group: the group string + * @size: the file size + * @links: the link count + * @year: the year + * @month: the month + * @day: the day + * @hour: the hour + * @minute: the minute + * + * A callback for the xmlNanoFTPList command. + * Note that only one of year and day:minute are specified. + */ +typedef void (*ftpListCallback) (void *userData, + const char *filename, const char *attrib, + const char *owner, const char *group, + unsigned long size, int links, int year, + const char *month, int day, int hour, + int minute); +/** + * ftpDataCallback: + * @userData: the user provided context + * @data: the data received + * @len: its size in bytes + * + * A callback for the xmlNanoFTPGet command. + */ +typedef void (*ftpDataCallback) (void *userData, + const char *data, + int len); + +/* + * Init + */ +XMLPUBFUN void XMLCALL + xmlNanoFTPInit (void); +XMLPUBFUN void XMLCALL + xmlNanoFTPCleanup (void); + +/* + * Creating/freeing contexts. + */ +XMLPUBFUN void * XMLCALL + xmlNanoFTPNewCtxt (const char *URL); +XMLPUBFUN void XMLCALL + xmlNanoFTPFreeCtxt (void * ctx); +XMLPUBFUN void * XMLCALL + xmlNanoFTPConnectTo (const char *server, + int port); +/* + * Opening/closing session connections. + */ +XMLPUBFUN void * XMLCALL + xmlNanoFTPOpen (const char *URL); +XMLPUBFUN int XMLCALL + xmlNanoFTPConnect (void *ctx); +XMLPUBFUN int XMLCALL + xmlNanoFTPClose (void *ctx); +XMLPUBFUN int XMLCALL + xmlNanoFTPQuit (void *ctx); +XMLPUBFUN void XMLCALL + xmlNanoFTPScanProxy (const char *URL); +XMLPUBFUN void XMLCALL + xmlNanoFTPProxy (const char *host, + int port, + const char *user, + const char *passwd, + int type); +XMLPUBFUN int XMLCALL + xmlNanoFTPUpdateURL (void *ctx, + const char *URL); + +/* + * Rather internal commands. + */ +XMLPUBFUN int XMLCALL + xmlNanoFTPGetResponse (void *ctx); +XMLPUBFUN int XMLCALL + xmlNanoFTPCheckResponse (void *ctx); + +/* + * CD/DIR/GET handlers. + */ +XMLPUBFUN int XMLCALL + xmlNanoFTPCwd (void *ctx, + const char *directory); +XMLPUBFUN int XMLCALL + xmlNanoFTPDele (void *ctx, + const char *file); + +XMLPUBFUN SOCKET XMLCALL + xmlNanoFTPGetConnection (void *ctx); +XMLPUBFUN int XMLCALL + xmlNanoFTPCloseConnection(void *ctx); +XMLPUBFUN int XMLCALL + xmlNanoFTPList (void *ctx, + ftpListCallback callback, + void *userData, + const char *filename); +XMLPUBFUN SOCKET XMLCALL + xmlNanoFTPGetSocket (void *ctx, + const char *filename); +XMLPUBFUN int XMLCALL + xmlNanoFTPGet (void *ctx, + ftpDataCallback callback, + void *userData, + const char *filename); +XMLPUBFUN int XMLCALL + xmlNanoFTPRead (void *ctx, + void *dest, + int len); + +#ifdef __cplusplus +} +#endif +#endif /* LIBXML_FTP_ENABLED */ +#endif /* __NANO_FTP_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/nanohttp.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/nanohttp.h new file mode 100644 index 000000000000..22b8fb43381c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/nanohttp.h @@ -0,0 +1,81 @@ +/* + * Summary: minimal HTTP implementation + * Description: minimal HTTP implementation allowing to fetch resources + * like external subset. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __NANO_HTTP_H__ +#define __NANO_HTTP_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_HTTP_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif +XMLPUBFUN void XMLCALL + xmlNanoHTTPInit (void); +XMLPUBFUN void XMLCALL + xmlNanoHTTPCleanup (void); +XMLPUBFUN void XMLCALL + xmlNanoHTTPScanProxy (const char *URL); +XMLPUBFUN int XMLCALL + xmlNanoHTTPFetch (const char *URL, + const char *filename, + char **contentType); +XMLPUBFUN void * XMLCALL + xmlNanoHTTPMethod (const char *URL, + const char *method, + const char *input, + char **contentType, + const char *headers, + int ilen); +XMLPUBFUN void * XMLCALL + xmlNanoHTTPMethodRedir (const char *URL, + const char *method, + const char *input, + char **contentType, + char **redir, + const char *headers, + int ilen); +XMLPUBFUN void * XMLCALL + xmlNanoHTTPOpen (const char *URL, + char **contentType); +XMLPUBFUN void * XMLCALL + xmlNanoHTTPOpenRedir (const char *URL, + char **contentType, + char **redir); +XMLPUBFUN int XMLCALL + xmlNanoHTTPReturnCode (void *ctx); +XMLPUBFUN const char * XMLCALL + xmlNanoHTTPAuthHeader (void *ctx); +XMLPUBFUN const char * XMLCALL + xmlNanoHTTPRedir (void *ctx); +XMLPUBFUN int XMLCALL + xmlNanoHTTPContentLength( void * ctx ); +XMLPUBFUN const char * XMLCALL + xmlNanoHTTPEncoding (void *ctx); +XMLPUBFUN const char * XMLCALL + xmlNanoHTTPMimeType (void *ctx); +XMLPUBFUN int XMLCALL + xmlNanoHTTPRead (void *ctx, + void *dest, + int len); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN int XMLCALL + xmlNanoHTTPSave (void *ctxt, + const char *filename); +#endif /* LIBXML_OUTPUT_ENABLED */ +XMLPUBFUN void XMLCALL + xmlNanoHTTPClose (void *ctx); +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_HTTP_ENABLED */ +#endif /* __NANO_HTTP_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/parser.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/parser.h new file mode 100644 index 000000000000..0ba1c387a97d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/parser.h @@ -0,0 +1,1243 @@ +/* + * Summary: the core parser module + * Description: Interfaces, constants and types related to the XML parser + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_PARSER_H__ +#define __XML_PARSER_H__ + +#include <stdarg.h> + +#include <libxml/xmlversion.h> +#include <libxml/tree.h> +#include <libxml/dict.h> +#include <libxml/hash.h> +#include <libxml/valid.h> +#include <libxml/entities.h> +#include <libxml/xmlerror.h> +#include <libxml/xmlstring.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * XML_DEFAULT_VERSION: + * + * The default version of XML used: 1.0 + */ +#define XML_DEFAULT_VERSION "1.0" + +/** + * xmlParserInput: + * + * An xmlParserInput is an input flow for the XML processor. + * Each entity parsed is associated an xmlParserInput (except the + * few predefined ones). This is the case both for internal entities + * - in which case the flow is already completely in memory - or + * external entities - in which case we use the buf structure for + * progressive reading and I18N conversions to the internal UTF-8 format. + */ + +/** + * xmlParserInputDeallocate: + * @str: the string to deallocate + * + * Callback for freeing some parser input allocations. + */ +typedef void (* xmlParserInputDeallocate)(xmlChar *str); + +struct _xmlParserInput { + /* Input buffer */ + xmlParserInputBufferPtr buf; /* UTF-8 encoded buffer */ + + const char *filename; /* The file analyzed, if any */ + const char *directory; /* the directory/base of the file */ + const xmlChar *base; /* Base of the array to parse */ + const xmlChar *cur; /* Current char being parsed */ + const xmlChar *end; /* end of the array to parse */ + int length; /* length if known */ + int line; /* Current line */ + int col; /* Current column */ + /* + * NOTE: consumed is only tested for equality in the parser code, + * so even if there is an overflow this should not give troubles + * for parsing very large instances. + */ + unsigned long consumed; /* How many xmlChars already consumed */ + xmlParserInputDeallocate free; /* function to deallocate the base */ + const xmlChar *encoding; /* the encoding string for entity */ + const xmlChar *version; /* the version string for entity */ + int standalone; /* Was that entity marked standalone */ + int id; /* an unique identifier for the entity */ +}; + +/** + * xmlParserNodeInfo: + * + * The parser can be asked to collect Node information, i.e. at what + * place in the file they were detected. + * NOTE: This is off by default and not very well tested. + */ +typedef struct _xmlParserNodeInfo xmlParserNodeInfo; +typedef xmlParserNodeInfo *xmlParserNodeInfoPtr; + +struct _xmlParserNodeInfo { + const struct _xmlNode* node; + /* Position & line # that text that created the node begins & ends on */ + unsigned long begin_pos; + unsigned long begin_line; + unsigned long end_pos; + unsigned long end_line; +}; + +typedef struct _xmlParserNodeInfoSeq xmlParserNodeInfoSeq; +typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr; +struct _xmlParserNodeInfoSeq { + unsigned long maximum; + unsigned long length; + xmlParserNodeInfo* buffer; +}; + +/** + * xmlParserInputState: + * + * The parser is now working also as a state based parser. + * The recursive one use the state info for entities processing. + */ +typedef enum { + XML_PARSER_EOF = -1, /* nothing is to be parsed */ + XML_PARSER_START = 0, /* nothing has been parsed */ + XML_PARSER_MISC, /* Misc* before int subset */ + XML_PARSER_PI, /* Within a processing instruction */ + XML_PARSER_DTD, /* within some DTD content */ + XML_PARSER_PROLOG, /* Misc* after internal subset */ + XML_PARSER_COMMENT, /* within a comment */ + XML_PARSER_START_TAG, /* within a start tag */ + XML_PARSER_CONTENT, /* within the content */ + XML_PARSER_CDATA_SECTION, /* within a CDATA section */ + XML_PARSER_END_TAG, /* within a closing tag */ + XML_PARSER_ENTITY_DECL, /* within an entity declaration */ + XML_PARSER_ENTITY_VALUE, /* within an entity value in a decl */ + XML_PARSER_ATTRIBUTE_VALUE, /* within an attribute value */ + XML_PARSER_SYSTEM_LITERAL, /* within a SYSTEM value */ + XML_PARSER_EPILOG, /* the Misc* after the last end tag */ + XML_PARSER_IGNORE, /* within an IGNORED section */ + XML_PARSER_PUBLIC_LITERAL /* within a PUBLIC value */ +} xmlParserInputState; + +/** + * XML_DETECT_IDS: + * + * Bit in the loadsubset context field to tell to do ID/REFs lookups. + * Use it to initialize xmlLoadExtDtdDefaultValue. + */ +#define XML_DETECT_IDS 2 + +/** + * XML_COMPLETE_ATTRS: + * + * Bit in the loadsubset context field to tell to do complete the + * elements attributes lists with the ones defaulted from the DTDs. + * Use it to initialize xmlLoadExtDtdDefaultValue. + */ +#define XML_COMPLETE_ATTRS 4 + +/** + * XML_SKIP_IDS: + * + * Bit in the loadsubset context field to tell to not do ID/REFs registration. + * Used to initialize xmlLoadExtDtdDefaultValue in some special cases. + */ +#define XML_SKIP_IDS 8 + +/** + * xmlParserMode: + * + * A parser can operate in various modes + */ +typedef enum { + XML_PARSE_UNKNOWN = 0, + XML_PARSE_DOM = 1, + XML_PARSE_SAX = 2, + XML_PARSE_PUSH_DOM = 3, + XML_PARSE_PUSH_SAX = 4, + XML_PARSE_READER = 5 +} xmlParserMode; + +typedef struct _xmlStartTag xmlStartTag; + +/** + * xmlParserCtxt: + * + * The parser context. + * NOTE This doesn't completely define the parser state, the (current ?) + * design of the parser uses recursive function calls since this allow + * and easy mapping from the production rules of the specification + * to the actual code. The drawback is that the actual function call + * also reflect the parser state. However most of the parsing routines + * takes as the only argument the parser context pointer, so migrating + * to a state based parser for progressive parsing shouldn't be too hard. + */ +struct _xmlParserCtxt { + struct _xmlSAXHandler *sax; /* The SAX handler */ + void *userData; /* For SAX interface only, used by DOM build */ + xmlDocPtr myDoc; /* the document being built */ + int wellFormed; /* is the document well formed */ + int replaceEntities; /* shall we replace entities ? */ + const xmlChar *version; /* the XML version string */ + const xmlChar *encoding; /* the declared encoding, if any */ + int standalone; /* standalone document */ + int html; /* an HTML(1)/Docbook(2) document + * 3 is HTML after <head> + * 10 is HTML after <body> + */ + + /* Input stream stack */ + xmlParserInputPtr input; /* Current input stream */ + int inputNr; /* Number of current input streams */ + int inputMax; /* Max number of input streams */ + xmlParserInputPtr *inputTab; /* stack of inputs */ + + /* Node analysis stack only used for DOM building */ + xmlNodePtr node; /* Current parsed Node */ + int nodeNr; /* Depth of the parsing stack */ + int nodeMax; /* Max depth of the parsing stack */ + xmlNodePtr *nodeTab; /* array of nodes */ + + int record_info; /* Whether node info should be kept */ + xmlParserNodeInfoSeq node_seq; /* info about each node parsed */ + + int errNo; /* error code */ + + int hasExternalSubset; /* reference and external subset */ + int hasPErefs; /* the internal subset has PE refs */ + int external; /* are we parsing an external entity */ + + int valid; /* is the document valid */ + int validate; /* shall we try to validate ? */ + xmlValidCtxt vctxt; /* The validity context */ + + xmlParserInputState instate; /* current type of input */ + int token; /* next char look-ahead */ + + char *directory; /* the data directory */ + + /* Node name stack */ + const xmlChar *name; /* Current parsed Node */ + int nameNr; /* Depth of the parsing stack */ + int nameMax; /* Max depth of the parsing stack */ + const xmlChar * *nameTab; /* array of nodes */ + + long nbChars; /* unused */ + long checkIndex; /* used by progressive parsing lookup */ + int keepBlanks; /* ugly but ... */ + int disableSAX; /* SAX callbacks are disabled */ + int inSubset; /* Parsing is in int 1/ext 2 subset */ + const xmlChar * intSubName; /* name of subset */ + xmlChar * extSubURI; /* URI of external subset */ + xmlChar * extSubSystem; /* SYSTEM ID of external subset */ + + /* xml:space values */ + int * space; /* Should the parser preserve spaces */ + int spaceNr; /* Depth of the parsing stack */ + int spaceMax; /* Max depth of the parsing stack */ + int * spaceTab; /* array of space infos */ + + int depth; /* to prevent entity substitution loops */ + xmlParserInputPtr entity; /* used to check entities boundaries */ + int charset; /* encoding of the in-memory content + actually an xmlCharEncoding */ + int nodelen; /* Those two fields are there to */ + int nodemem; /* Speed up large node parsing */ + int pedantic; /* signal pedantic warnings */ + void *_private; /* For user data, libxml won't touch it */ + + int loadsubset; /* should the external subset be loaded */ + int linenumbers; /* set line number in element content */ + void *catalogs; /* document's own catalog */ + int recovery; /* run in recovery mode */ + int progressive; /* is this a progressive parsing */ + xmlDictPtr dict; /* dictionary for the parser */ + const xmlChar * *atts; /* array for the attributes callbacks */ + int maxatts; /* the size of the array */ + int docdict; /* use strings from dict to build tree */ + + /* + * pre-interned strings + */ + const xmlChar *str_xml; + const xmlChar *str_xmlns; + const xmlChar *str_xml_ns; + + /* + * Everything below is used only by the new SAX mode + */ + int sax2; /* operating in the new SAX mode */ + int nsNr; /* the number of inherited namespaces */ + int nsMax; /* the size of the arrays */ + const xmlChar * *nsTab; /* the array of prefix/namespace name */ + int *attallocs; /* which attribute were allocated */ + xmlStartTag *pushTab; /* array of data for push */ + xmlHashTablePtr attsDefault; /* defaulted attributes if any */ + xmlHashTablePtr attsSpecial; /* non-CDATA attributes if any */ + int nsWellFormed; /* is the document XML Namespace okay */ + int options; /* Extra options */ + + /* + * Those fields are needed only for streaming parsing so far + */ + int dictNames; /* Use dictionary names for the tree */ + int freeElemsNr; /* number of freed element nodes */ + xmlNodePtr freeElems; /* List of freed element nodes */ + int freeAttrsNr; /* number of freed attributes nodes */ + xmlAttrPtr freeAttrs; /* List of freed attributes nodes */ + + /* + * the complete error information for the last error. + */ + xmlError lastError; + xmlParserMode parseMode; /* the parser mode */ + unsigned long nbentities; /* number of entities references */ + unsigned long sizeentities; /* size of parsed entities */ + + /* for use by HTML non-recursive parser */ + xmlParserNodeInfo *nodeInfo; /* Current NodeInfo */ + int nodeInfoNr; /* Depth of the parsing stack */ + int nodeInfoMax; /* Max depth of the parsing stack */ + xmlParserNodeInfo *nodeInfoTab; /* array of nodeInfos */ + + int input_id; /* we need to label inputs */ + unsigned long sizeentcopy; /* volume of entity copy */ +}; + +/** + * xmlSAXLocator: + * + * A SAX Locator. + */ +struct _xmlSAXLocator { + const xmlChar *(*getPublicId)(void *ctx); + const xmlChar *(*getSystemId)(void *ctx); + int (*getLineNumber)(void *ctx); + int (*getColumnNumber)(void *ctx); +}; + +/** + * xmlSAXHandler: + * + * A SAX handler is bunch of callbacks called by the parser when processing + * of the input generate data or structure information. + */ + +/** + * resolveEntitySAXFunc: + * @ctx: the user data (XML parser context) + * @publicId: The public ID of the entity + * @systemId: The system ID of the entity + * + * Callback: + * The entity loader, to control the loading of external entities, + * the application can either: + * - override this resolveEntity() callback in the SAX block + * - or better use the xmlSetExternalEntityLoader() function to + * set up it's own entity resolution routine + * + * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour. + */ +typedef xmlParserInputPtr (*resolveEntitySAXFunc) (void *ctx, + const xmlChar *publicId, + const xmlChar *systemId); +/** + * internalSubsetSAXFunc: + * @ctx: the user data (XML parser context) + * @name: the root element name + * @ExternalID: the external ID + * @SystemID: the SYSTEM ID (e.g. filename or URL) + * + * Callback on internal subset declaration. + */ +typedef void (*internalSubsetSAXFunc) (void *ctx, + const xmlChar *name, + const xmlChar *ExternalID, + const xmlChar *SystemID); +/** + * externalSubsetSAXFunc: + * @ctx: the user data (XML parser context) + * @name: the root element name + * @ExternalID: the external ID + * @SystemID: the SYSTEM ID (e.g. filename or URL) + * + * Callback on external subset declaration. + */ +typedef void (*externalSubsetSAXFunc) (void *ctx, + const xmlChar *name, + const xmlChar *ExternalID, + const xmlChar *SystemID); +/** + * getEntitySAXFunc: + * @ctx: the user data (XML parser context) + * @name: The entity name + * + * Get an entity by name. + * + * Returns the xmlEntityPtr if found. + */ +typedef xmlEntityPtr (*getEntitySAXFunc) (void *ctx, + const xmlChar *name); +/** + * getParameterEntitySAXFunc: + * @ctx: the user data (XML parser context) + * @name: The entity name + * + * Get a parameter entity by name. + * + * Returns the xmlEntityPtr if found. + */ +typedef xmlEntityPtr (*getParameterEntitySAXFunc) (void *ctx, + const xmlChar *name); +/** + * entityDeclSAXFunc: + * @ctx: the user data (XML parser context) + * @name: the entity name + * @type: the entity type + * @publicId: The public ID of the entity + * @systemId: The system ID of the entity + * @content: the entity value (without processing). + * + * An entity definition has been parsed. + */ +typedef void (*entityDeclSAXFunc) (void *ctx, + const xmlChar *name, + int type, + const xmlChar *publicId, + const xmlChar *systemId, + xmlChar *content); +/** + * notationDeclSAXFunc: + * @ctx: the user data (XML parser context) + * @name: The name of the notation + * @publicId: The public ID of the entity + * @systemId: The system ID of the entity + * + * What to do when a notation declaration has been parsed. + */ +typedef void (*notationDeclSAXFunc)(void *ctx, + const xmlChar *name, + const xmlChar *publicId, + const xmlChar *systemId); +/** + * attributeDeclSAXFunc: + * @ctx: the user data (XML parser context) + * @elem: the name of the element + * @fullname: the attribute name + * @type: the attribute type + * @def: the type of default value + * @defaultValue: the attribute default value + * @tree: the tree of enumerated value set + * + * An attribute definition has been parsed. + */ +typedef void (*attributeDeclSAXFunc)(void *ctx, + const xmlChar *elem, + const xmlChar *fullname, + int type, + int def, + const xmlChar *defaultValue, + xmlEnumerationPtr tree); +/** + * elementDeclSAXFunc: + * @ctx: the user data (XML parser context) + * @name: the element name + * @type: the element type + * @content: the element value tree + * + * An element definition has been parsed. + */ +typedef void (*elementDeclSAXFunc)(void *ctx, + const xmlChar *name, + int type, + xmlElementContentPtr content); +/** + * unparsedEntityDeclSAXFunc: + * @ctx: the user data (XML parser context) + * @name: The name of the entity + * @publicId: The public ID of the entity + * @systemId: The system ID of the entity + * @notationName: the name of the notation + * + * What to do when an unparsed entity declaration is parsed. + */ +typedef void (*unparsedEntityDeclSAXFunc)(void *ctx, + const xmlChar *name, + const xmlChar *publicId, + const xmlChar *systemId, + const xmlChar *notationName); +/** + * setDocumentLocatorSAXFunc: + * @ctx: the user data (XML parser context) + * @loc: A SAX Locator + * + * Receive the document locator at startup, actually xmlDefaultSAXLocator. + * Everything is available on the context, so this is useless in our case. + */ +typedef void (*setDocumentLocatorSAXFunc) (void *ctx, + xmlSAXLocatorPtr loc); +/** + * startDocumentSAXFunc: + * @ctx: the user data (XML parser context) + * + * Called when the document start being processed. + */ +typedef void (*startDocumentSAXFunc) (void *ctx); +/** + * endDocumentSAXFunc: + * @ctx: the user data (XML parser context) + * + * Called when the document end has been detected. + */ +typedef void (*endDocumentSAXFunc) (void *ctx); +/** + * startElementSAXFunc: + * @ctx: the user data (XML parser context) + * @name: The element name, including namespace prefix + * @atts: An array of name/value attributes pairs, NULL terminated + * + * Called when an opening tag has been processed. + */ +typedef void (*startElementSAXFunc) (void *ctx, + const xmlChar *name, + const xmlChar **atts); +/** + * endElementSAXFunc: + * @ctx: the user data (XML parser context) + * @name: The element name + * + * Called when the end of an element has been detected. + */ +typedef void (*endElementSAXFunc) (void *ctx, + const xmlChar *name); +/** + * attributeSAXFunc: + * @ctx: the user data (XML parser context) + * @name: The attribute name, including namespace prefix + * @value: The attribute value + * + * Handle an attribute that has been read by the parser. + * The default handling is to convert the attribute into an + * DOM subtree and past it in a new xmlAttr element added to + * the element. + */ +typedef void (*attributeSAXFunc) (void *ctx, + const xmlChar *name, + const xmlChar *value); +/** + * referenceSAXFunc: + * @ctx: the user data (XML parser context) + * @name: The entity name + * + * Called when an entity reference is detected. + */ +typedef void (*referenceSAXFunc) (void *ctx, + const xmlChar *name); +/** + * charactersSAXFunc: + * @ctx: the user data (XML parser context) + * @ch: a xmlChar string + * @len: the number of xmlChar + * + * Receiving some chars from the parser. + */ +typedef void (*charactersSAXFunc) (void *ctx, + const xmlChar *ch, + int len); +/** + * ignorableWhitespaceSAXFunc: + * @ctx: the user data (XML parser context) + * @ch: a xmlChar string + * @len: the number of xmlChar + * + * Receiving some ignorable whitespaces from the parser. + * UNUSED: by default the DOM building will use characters. + */ +typedef void (*ignorableWhitespaceSAXFunc) (void *ctx, + const xmlChar *ch, + int len); +/** + * processingInstructionSAXFunc: + * @ctx: the user data (XML parser context) + * @target: the target name + * @data: the PI data's + * + * A processing instruction has been parsed. + */ +typedef void (*processingInstructionSAXFunc) (void *ctx, + const xmlChar *target, + const xmlChar *data); +/** + * commentSAXFunc: + * @ctx: the user data (XML parser context) + * @value: the comment content + * + * A comment has been parsed. + */ +typedef void (*commentSAXFunc) (void *ctx, + const xmlChar *value); +/** + * cdataBlockSAXFunc: + * @ctx: the user data (XML parser context) + * @value: The pcdata content + * @len: the block length + * + * Called when a pcdata block has been parsed. + */ +typedef void (*cdataBlockSAXFunc) ( + void *ctx, + const xmlChar *value, + int len); +/** + * warningSAXFunc: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format a warning messages, callback. + */ +typedef void (XMLCDECL *warningSAXFunc) (void *ctx, + const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); +/** + * errorSAXFunc: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format an error messages, callback. + */ +typedef void (XMLCDECL *errorSAXFunc) (void *ctx, + const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); +/** + * fatalErrorSAXFunc: + * @ctx: an XML parser context + * @msg: the message to display/transmit + * @...: extra parameters for the message display + * + * Display and format fatal error messages, callback. + * Note: so far fatalError() SAX callbacks are not used, error() + * get all the callbacks for errors. + */ +typedef void (XMLCDECL *fatalErrorSAXFunc) (void *ctx, + const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); +/** + * isStandaloneSAXFunc: + * @ctx: the user data (XML parser context) + * + * Is this document tagged standalone? + * + * Returns 1 if true + */ +typedef int (*isStandaloneSAXFunc) (void *ctx); +/** + * hasInternalSubsetSAXFunc: + * @ctx: the user data (XML parser context) + * + * Does this document has an internal subset. + * + * Returns 1 if true + */ +typedef int (*hasInternalSubsetSAXFunc) (void *ctx); + +/** + * hasExternalSubsetSAXFunc: + * @ctx: the user data (XML parser context) + * + * Does this document has an external subset? + * + * Returns 1 if true + */ +typedef int (*hasExternalSubsetSAXFunc) (void *ctx); + +/************************************************************************ + * * + * The SAX version 2 API extensions * + * * + ************************************************************************/ +/** + * XML_SAX2_MAGIC: + * + * Special constant found in SAX2 blocks initialized fields + */ +#define XML_SAX2_MAGIC 0xDEEDBEAF + +/** + * startElementNsSAX2Func: + * @ctx: the user data (XML parser context) + * @localname: the local name of the element + * @prefix: the element namespace prefix if available + * @URI: the element namespace name if available + * @nb_namespaces: number of namespace definitions on that node + * @namespaces: pointer to the array of prefix/URI pairs namespace definitions + * @nb_attributes: the number of attributes on that node + * @nb_defaulted: the number of defaulted attributes. The defaulted + * ones are at the end of the array + * @attributes: pointer to the array of (localname/prefix/URI/value/end) + * attribute values. + * + * SAX2 callback when an element start has been detected by the parser. + * It provides the namespace information for the element, as well as + * the new namespace declarations on the element. + */ + +typedef void (*startElementNsSAX2Func) (void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *URI, + int nb_namespaces, + const xmlChar **namespaces, + int nb_attributes, + int nb_defaulted, + const xmlChar **attributes); + +/** + * endElementNsSAX2Func: + * @ctx: the user data (XML parser context) + * @localname: the local name of the element + * @prefix: the element namespace prefix if available + * @URI: the element namespace name if available + * + * SAX2 callback when an element end has been detected by the parser. + * It provides the namespace information for the element. + */ + +typedef void (*endElementNsSAX2Func) (void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *URI); + + +struct _xmlSAXHandler { + internalSubsetSAXFunc internalSubset; + isStandaloneSAXFunc isStandalone; + hasInternalSubsetSAXFunc hasInternalSubset; + hasExternalSubsetSAXFunc hasExternalSubset; + resolveEntitySAXFunc resolveEntity; + getEntitySAXFunc getEntity; + entityDeclSAXFunc entityDecl; + notationDeclSAXFunc notationDecl; + attributeDeclSAXFunc attributeDecl; + elementDeclSAXFunc elementDecl; + unparsedEntityDeclSAXFunc unparsedEntityDecl; + setDocumentLocatorSAXFunc setDocumentLocator; + startDocumentSAXFunc startDocument; + endDocumentSAXFunc endDocument; + startElementSAXFunc startElement; + endElementSAXFunc endElement; + referenceSAXFunc reference; + charactersSAXFunc characters; + ignorableWhitespaceSAXFunc ignorableWhitespace; + processingInstructionSAXFunc processingInstruction; + commentSAXFunc comment; + warningSAXFunc warning; + errorSAXFunc error; + fatalErrorSAXFunc fatalError; /* unused error() get all the errors */ + getParameterEntitySAXFunc getParameterEntity; + cdataBlockSAXFunc cdataBlock; + externalSubsetSAXFunc externalSubset; + unsigned int initialized; + /* The following fields are extensions available only on version 2 */ + void *_private; + startElementNsSAX2Func startElementNs; + endElementNsSAX2Func endElementNs; + xmlStructuredErrorFunc serror; +}; + +/* + * SAX Version 1 + */ +typedef struct _xmlSAXHandlerV1 xmlSAXHandlerV1; +typedef xmlSAXHandlerV1 *xmlSAXHandlerV1Ptr; +struct _xmlSAXHandlerV1 { + internalSubsetSAXFunc internalSubset; + isStandaloneSAXFunc isStandalone; + hasInternalSubsetSAXFunc hasInternalSubset; + hasExternalSubsetSAXFunc hasExternalSubset; + resolveEntitySAXFunc resolveEntity; + getEntitySAXFunc getEntity; + entityDeclSAXFunc entityDecl; + notationDeclSAXFunc notationDecl; + attributeDeclSAXFunc attributeDecl; + elementDeclSAXFunc elementDecl; + unparsedEntityDeclSAXFunc unparsedEntityDecl; + setDocumentLocatorSAXFunc setDocumentLocator; + startDocumentSAXFunc startDocument; + endDocumentSAXFunc endDocument; + startElementSAXFunc startElement; + endElementSAXFunc endElement; + referenceSAXFunc reference; + charactersSAXFunc characters; + ignorableWhitespaceSAXFunc ignorableWhitespace; + processingInstructionSAXFunc processingInstruction; + commentSAXFunc comment; + warningSAXFunc warning; + errorSAXFunc error; + fatalErrorSAXFunc fatalError; /* unused error() get all the errors */ + getParameterEntitySAXFunc getParameterEntity; + cdataBlockSAXFunc cdataBlock; + externalSubsetSAXFunc externalSubset; + unsigned int initialized; +}; + + +/** + * xmlExternalEntityLoader: + * @URL: The System ID of the resource requested + * @ID: The Public ID of the resource requested + * @context: the XML parser context + * + * External entity loaders types. + * + * Returns the entity input parser. + */ +typedef xmlParserInputPtr (*xmlExternalEntityLoader) (const char *URL, + const char *ID, + xmlParserCtxtPtr context); + +#ifdef __cplusplus +} +#endif + +#include <libxml/encoding.h> +#include <libxml/xmlIO.h> +#include <libxml/globals.h> + +#ifdef __cplusplus +extern "C" { +#endif + + +/* + * Init/Cleanup + */ +XMLPUBFUN void XMLCALL + xmlInitParser (void); +XMLPUBFUN void XMLCALL + xmlCleanupParser (void); + +/* + * Input functions + */ +XMLPUBFUN int XMLCALL + xmlParserInputRead (xmlParserInputPtr in, + int len); +XMLPUBFUN int XMLCALL + xmlParserInputGrow (xmlParserInputPtr in, + int len); + +/* + * Basic parsing Interfaces + */ +#ifdef LIBXML_SAX1_ENABLED +XMLPUBFUN xmlDocPtr XMLCALL + xmlParseDoc (const xmlChar *cur); +XMLPUBFUN xmlDocPtr XMLCALL + xmlParseFile (const char *filename); +XMLPUBFUN xmlDocPtr XMLCALL + xmlParseMemory (const char *buffer, + int size); +#endif /* LIBXML_SAX1_ENABLED */ +XMLPUBFUN int XMLCALL + xmlSubstituteEntitiesDefault(int val); +XMLPUBFUN int XMLCALL + xmlKeepBlanksDefault (int val); +XMLPUBFUN void XMLCALL + xmlStopParser (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlPedanticParserDefault(int val); +XMLPUBFUN int XMLCALL + xmlLineNumbersDefault (int val); + +#ifdef LIBXML_SAX1_ENABLED +/* + * Recovery mode + */ +XMLPUBFUN xmlDocPtr XMLCALL + xmlRecoverDoc (const xmlChar *cur); +XMLPUBFUN xmlDocPtr XMLCALL + xmlRecoverMemory (const char *buffer, + int size); +XMLPUBFUN xmlDocPtr XMLCALL + xmlRecoverFile (const char *filename); +#endif /* LIBXML_SAX1_ENABLED */ + +/* + * Less common routines and SAX interfaces + */ +XMLPUBFUN int XMLCALL + xmlParseDocument (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlParseExtParsedEnt (xmlParserCtxtPtr ctxt); +#ifdef LIBXML_SAX1_ENABLED +XMLPUBFUN int XMLCALL + xmlSAXUserParseFile (xmlSAXHandlerPtr sax, + void *user_data, + const char *filename); +XMLPUBFUN int XMLCALL + xmlSAXUserParseMemory (xmlSAXHandlerPtr sax, + void *user_data, + const char *buffer, + int size); +XMLPUBFUN xmlDocPtr XMLCALL + xmlSAXParseDoc (xmlSAXHandlerPtr sax, + const xmlChar *cur, + int recovery); +XMLPUBFUN xmlDocPtr XMLCALL + xmlSAXParseMemory (xmlSAXHandlerPtr sax, + const char *buffer, + int size, + int recovery); +XMLPUBFUN xmlDocPtr XMLCALL + xmlSAXParseMemoryWithData (xmlSAXHandlerPtr sax, + const char *buffer, + int size, + int recovery, + void *data); +XMLPUBFUN xmlDocPtr XMLCALL + xmlSAXParseFile (xmlSAXHandlerPtr sax, + const char *filename, + int recovery); +XMLPUBFUN xmlDocPtr XMLCALL + xmlSAXParseFileWithData (xmlSAXHandlerPtr sax, + const char *filename, + int recovery, + void *data); +XMLPUBFUN xmlDocPtr XMLCALL + xmlSAXParseEntity (xmlSAXHandlerPtr sax, + const char *filename); +XMLPUBFUN xmlDocPtr XMLCALL + xmlParseEntity (const char *filename); +#endif /* LIBXML_SAX1_ENABLED */ + +#ifdef LIBXML_VALID_ENABLED +XMLPUBFUN xmlDtdPtr XMLCALL + xmlSAXParseDTD (xmlSAXHandlerPtr sax, + const xmlChar *ExternalID, + const xmlChar *SystemID); +XMLPUBFUN xmlDtdPtr XMLCALL + xmlParseDTD (const xmlChar *ExternalID, + const xmlChar *SystemID); +XMLPUBFUN xmlDtdPtr XMLCALL + xmlIOParseDTD (xmlSAXHandlerPtr sax, + xmlParserInputBufferPtr input, + xmlCharEncoding enc); +#endif /* LIBXML_VALID_ENABLE */ +#ifdef LIBXML_SAX1_ENABLED +XMLPUBFUN int XMLCALL + xmlParseBalancedChunkMemory(xmlDocPtr doc, + xmlSAXHandlerPtr sax, + void *user_data, + int depth, + const xmlChar *string, + xmlNodePtr *lst); +#endif /* LIBXML_SAX1_ENABLED */ +XMLPUBFUN xmlParserErrors XMLCALL + xmlParseInNodeContext (xmlNodePtr node, + const char *data, + int datalen, + int options, + xmlNodePtr *lst); +#ifdef LIBXML_SAX1_ENABLED +XMLPUBFUN int XMLCALL + xmlParseBalancedChunkMemoryRecover(xmlDocPtr doc, + xmlSAXHandlerPtr sax, + void *user_data, + int depth, + const xmlChar *string, + xmlNodePtr *lst, + int recover); +XMLPUBFUN int XMLCALL + xmlParseExternalEntity (xmlDocPtr doc, + xmlSAXHandlerPtr sax, + void *user_data, + int depth, + const xmlChar *URL, + const xmlChar *ID, + xmlNodePtr *lst); +#endif /* LIBXML_SAX1_ENABLED */ +XMLPUBFUN int XMLCALL + xmlParseCtxtExternalEntity(xmlParserCtxtPtr ctx, + const xmlChar *URL, + const xmlChar *ID, + xmlNodePtr *lst); + +/* + * Parser contexts handling. + */ +XMLPUBFUN xmlParserCtxtPtr XMLCALL + xmlNewParserCtxt (void); +XMLPUBFUN int XMLCALL + xmlInitParserCtxt (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlClearParserCtxt (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlFreeParserCtxt (xmlParserCtxtPtr ctxt); +#ifdef LIBXML_SAX1_ENABLED +XMLPUBFUN void XMLCALL + xmlSetupParserForBuffer (xmlParserCtxtPtr ctxt, + const xmlChar* buffer, + const char *filename); +#endif /* LIBXML_SAX1_ENABLED */ +XMLPUBFUN xmlParserCtxtPtr XMLCALL + xmlCreateDocParserCtxt (const xmlChar *cur); + +#ifdef LIBXML_LEGACY_ENABLED +/* + * Reading/setting optional parsing features. + */ +XMLPUBFUN int XMLCALL + xmlGetFeaturesList (int *len, + const char **result); +XMLPUBFUN int XMLCALL + xmlGetFeature (xmlParserCtxtPtr ctxt, + const char *name, + void *result); +XMLPUBFUN int XMLCALL + xmlSetFeature (xmlParserCtxtPtr ctxt, + const char *name, + void *value); +#endif /* LIBXML_LEGACY_ENABLED */ + +#ifdef LIBXML_PUSH_ENABLED +/* + * Interfaces for the Push mode. + */ +XMLPUBFUN xmlParserCtxtPtr XMLCALL + xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, + void *user_data, + const char *chunk, + int size, + const char *filename); +XMLPUBFUN int XMLCALL + xmlParseChunk (xmlParserCtxtPtr ctxt, + const char *chunk, + int size, + int terminate); +#endif /* LIBXML_PUSH_ENABLED */ + +/* + * Special I/O mode. + */ + +XMLPUBFUN xmlParserCtxtPtr XMLCALL + xmlCreateIOParserCtxt (xmlSAXHandlerPtr sax, + void *user_data, + xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, + void *ioctx, + xmlCharEncoding enc); + +XMLPUBFUN xmlParserInputPtr XMLCALL + xmlNewIOInputStream (xmlParserCtxtPtr ctxt, + xmlParserInputBufferPtr input, + xmlCharEncoding enc); + +/* + * Node infos. + */ +XMLPUBFUN const xmlParserNodeInfo* XMLCALL + xmlParserFindNodeInfo (const xmlParserCtxtPtr ctxt, + const xmlNodePtr node); +XMLPUBFUN void XMLCALL + xmlInitNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); +XMLPUBFUN void XMLCALL + xmlClearNodeInfoSeq (xmlParserNodeInfoSeqPtr seq); +XMLPUBFUN unsigned long XMLCALL + xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeqPtr seq, + const xmlNodePtr node); +XMLPUBFUN void XMLCALL + xmlParserAddNodeInfo (xmlParserCtxtPtr ctxt, + const xmlParserNodeInfoPtr info); + +/* + * External entities handling actually implemented in xmlIO. + */ + +XMLPUBFUN void XMLCALL + xmlSetExternalEntityLoader(xmlExternalEntityLoader f); +XMLPUBFUN xmlExternalEntityLoader XMLCALL + xmlGetExternalEntityLoader(void); +XMLPUBFUN xmlParserInputPtr XMLCALL + xmlLoadExternalEntity (const char *URL, + const char *ID, + xmlParserCtxtPtr ctxt); + +/* + * Index lookup, actually implemented in the encoding module + */ +XMLPUBFUN long XMLCALL + xmlByteConsumed (xmlParserCtxtPtr ctxt); + +/* + * New set of simpler/more flexible APIs + */ +/** + * xmlParserOption: + * + * This is the set of XML parser options that can be passed down + * to the xmlReadDoc() and similar calls. + */ +typedef enum { + XML_PARSE_RECOVER = 1<<0, /* recover on errors */ + XML_PARSE_NOENT = 1<<1, /* substitute entities */ + XML_PARSE_DTDLOAD = 1<<2, /* load the external subset */ + XML_PARSE_DTDATTR = 1<<3, /* default DTD attributes */ + XML_PARSE_DTDVALID = 1<<4, /* validate with the DTD */ + XML_PARSE_NOERROR = 1<<5, /* suppress error reports */ + XML_PARSE_NOWARNING = 1<<6, /* suppress warning reports */ + XML_PARSE_PEDANTIC = 1<<7, /* pedantic error reporting */ + XML_PARSE_NOBLANKS = 1<<8, /* remove blank nodes */ + XML_PARSE_SAX1 = 1<<9, /* use the SAX1 interface internally */ + XML_PARSE_XINCLUDE = 1<<10,/* Implement XInclude substitution */ + XML_PARSE_NONET = 1<<11,/* Forbid network access */ + XML_PARSE_NODICT = 1<<12,/* Do not reuse the context dictionary */ + XML_PARSE_NSCLEAN = 1<<13,/* remove redundant namespaces declarations */ + XML_PARSE_NOCDATA = 1<<14,/* merge CDATA as text nodes */ + XML_PARSE_NOXINCNODE= 1<<15,/* do not generate XINCLUDE START/END nodes */ + XML_PARSE_COMPACT = 1<<16,/* compact small text nodes; no modification of + the tree allowed afterwards (will possibly + crash if you try to modify the tree) */ + XML_PARSE_OLD10 = 1<<17,/* parse using XML-1.0 before update 5 */ + XML_PARSE_NOBASEFIX = 1<<18,/* do not fixup XINCLUDE xml:base uris */ + XML_PARSE_HUGE = 1<<19,/* relax any hardcoded limit from the parser */ + XML_PARSE_OLDSAX = 1<<20,/* parse using SAX2 interface before 2.7.0 */ + XML_PARSE_IGNORE_ENC= 1<<21,/* ignore internal document encoding hint */ + XML_PARSE_BIG_LINES = 1<<22 /* Store big lines numbers in text PSVI field */ +} xmlParserOption; + +XMLPUBFUN void XMLCALL + xmlCtxtReset (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlCtxtResetPush (xmlParserCtxtPtr ctxt, + const char *chunk, + int size, + const char *filename, + const char *encoding); +XMLPUBFUN int XMLCALL + xmlCtxtUseOptions (xmlParserCtxtPtr ctxt, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlReadDoc (const xmlChar *cur, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlReadFile (const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlReadMemory (const char *buffer, + int size, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlReadFd (int fd, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlReadIO (xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, + void *ioctx, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlCtxtReadDoc (xmlParserCtxtPtr ctxt, + const xmlChar *cur, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlCtxtReadFile (xmlParserCtxtPtr ctxt, + const char *filename, + const char *encoding, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlCtxtReadMemory (xmlParserCtxtPtr ctxt, + const char *buffer, + int size, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlCtxtReadFd (xmlParserCtxtPtr ctxt, + int fd, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlDocPtr XMLCALL + xmlCtxtReadIO (xmlParserCtxtPtr ctxt, + xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, + void *ioctx, + const char *URL, + const char *encoding, + int options); + +/* + * Library wide options + */ +/** + * xmlFeature: + * + * Used to examine the existence of features that can be enabled + * or disabled at compile-time. + * They used to be called XML_FEATURE_xxx but this clashed with Expat + */ +typedef enum { + XML_WITH_THREAD = 1, + XML_WITH_TREE = 2, + XML_WITH_OUTPUT = 3, + XML_WITH_PUSH = 4, + XML_WITH_READER = 5, + XML_WITH_PATTERN = 6, + XML_WITH_WRITER = 7, + XML_WITH_SAX1 = 8, + XML_WITH_FTP = 9, + XML_WITH_HTTP = 10, + XML_WITH_VALID = 11, + XML_WITH_HTML = 12, + XML_WITH_LEGACY = 13, + XML_WITH_C14N = 14, + XML_WITH_CATALOG = 15, + XML_WITH_XPATH = 16, + XML_WITH_XPTR = 17, + XML_WITH_XINCLUDE = 18, + XML_WITH_ICONV = 19, + XML_WITH_ISO8859X = 20, + XML_WITH_UNICODE = 21, + XML_WITH_REGEXP = 22, + XML_WITH_AUTOMATA = 23, + XML_WITH_EXPR = 24, + XML_WITH_SCHEMAS = 25, + XML_WITH_SCHEMATRON = 26, + XML_WITH_MODULES = 27, + XML_WITH_DEBUG = 28, + XML_WITH_DEBUG_MEM = 29, + XML_WITH_DEBUG_RUN = 30, + XML_WITH_ZLIB = 31, + XML_WITH_ICU = 32, + XML_WITH_LZMA = 33, + XML_WITH_NONE = 99999 /* just to be sure of allocation size */ +} xmlFeature; + +XMLPUBFUN int XMLCALL + xmlHasFeature (xmlFeature feature); + +#ifdef __cplusplus +} +#endif +#endif /* __XML_PARSER_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/parserInternals.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/parserInternals.h new file mode 100644 index 000000000000..1f26ce208100 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/parserInternals.h @@ -0,0 +1,644 @@ +/* + * Summary: internals routines and limits exported by the parser. + * Description: this module exports a number of internal parsing routines + * they are not really all intended for applications but + * can prove useful doing low level processing. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_PARSER_INTERNALS_H__ +#define __XML_PARSER_INTERNALS_H__ + +#include <libxml/xmlversion.h> +#include <libxml/parser.h> +#include <libxml/HTMLparser.h> +#include <libxml/chvalid.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlParserMaxDepth: + * + * arbitrary depth limit for the XML documents that we allow to + * process. This is not a limitation of the parser but a safety + * boundary feature, use XML_PARSE_HUGE option to override it. + */ +XMLPUBVAR unsigned int xmlParserMaxDepth; + +/** + * XML_MAX_TEXT_LENGTH: + * + * Maximum size allowed for a single text node when building a tree. + * This is not a limitation of the parser but a safety boundary feature, + * use XML_PARSE_HUGE option to override it. + * Introduced in 2.9.0 + */ +#define XML_MAX_TEXT_LENGTH 10000000 + +/** + * XML_MAX_NAME_LENGTH: + * + * Maximum size allowed for a markup identifier. + * This is not a limitation of the parser but a safety boundary feature, + * use XML_PARSE_HUGE option to override it. + * Note that with the use of parsing dictionaries overriding the limit + * may result in more runtime memory usage in face of "unfriendly' content + * Introduced in 2.9.0 + */ +#define XML_MAX_NAME_LENGTH 50000 + +/** + * XML_MAX_DICTIONARY_LIMIT: + * + * Maximum size allowed by the parser for a dictionary by default + * This is not a limitation of the parser but a safety boundary feature, + * use XML_PARSE_HUGE option to override it. + * Introduced in 2.9.0 + */ +#define XML_MAX_DICTIONARY_LIMIT 10000000 + +/** + * XML_MAX_LOOKUP_LIMIT: + * + * Maximum size allowed by the parser for ahead lookup + * This is an upper boundary enforced by the parser to avoid bad + * behaviour on "unfriendly' content + * Introduced in 2.9.0 + */ +#define XML_MAX_LOOKUP_LIMIT 10000000 + +/** + * XML_MAX_NAMELEN: + * + * Identifiers can be longer, but this will be more costly + * at runtime. + */ +#define XML_MAX_NAMELEN 100 + +/** + * INPUT_CHUNK: + * + * The parser tries to always have that amount of input ready. + * One of the point is providing context when reporting errors. + */ +#define INPUT_CHUNK 250 + +/************************************************************************ + * * + * UNICODE version of the macros. * + * * + ************************************************************************/ +/** + * IS_BYTE_CHAR: + * @c: an byte value (int) + * + * Macro to check the following production in the XML spec: + * + * [2] Char ::= #x9 | #xA | #xD | [#x20...] + * any byte character in the accepted range + */ +#define IS_BYTE_CHAR(c) xmlIsChar_ch(c) + +/** + * IS_CHAR: + * @c: an UNICODE value (int) + * + * Macro to check the following production in the XML spec: + * + * [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] + * | [#x10000-#x10FFFF] + * any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. + */ +#define IS_CHAR(c) xmlIsCharQ(c) + +/** + * IS_CHAR_CH: + * @c: an xmlChar (usually an unsigned char) + * + * Behaves like IS_CHAR on single-byte value + */ +#define IS_CHAR_CH(c) xmlIsChar_ch(c) + +/** + * IS_BLANK: + * @c: an UNICODE value (int) + * + * Macro to check the following production in the XML spec: + * + * [3] S ::= (#x20 | #x9 | #xD | #xA)+ + */ +#define IS_BLANK(c) xmlIsBlankQ(c) + +/** + * IS_BLANK_CH: + * @c: an xmlChar value (normally unsigned char) + * + * Behaviour same as IS_BLANK + */ +#define IS_BLANK_CH(c) xmlIsBlank_ch(c) + +/** + * IS_BASECHAR: + * @c: an UNICODE value (int) + * + * Macro to check the following production in the XML spec: + * + * [85] BaseChar ::= ... long list see REC ... + */ +#define IS_BASECHAR(c) xmlIsBaseCharQ(c) + +/** + * IS_DIGIT: + * @c: an UNICODE value (int) + * + * Macro to check the following production in the XML spec: + * + * [88] Digit ::= ... long list see REC ... + */ +#define IS_DIGIT(c) xmlIsDigitQ(c) + +/** + * IS_DIGIT_CH: + * @c: an xmlChar value (usually an unsigned char) + * + * Behaves like IS_DIGIT but with a single byte argument + */ +#define IS_DIGIT_CH(c) xmlIsDigit_ch(c) + +/** + * IS_COMBINING: + * @c: an UNICODE value (int) + * + * Macro to check the following production in the XML spec: + * + * [87] CombiningChar ::= ... long list see REC ... + */ +#define IS_COMBINING(c) xmlIsCombiningQ(c) + +/** + * IS_COMBINING_CH: + * @c: an xmlChar (usually an unsigned char) + * + * Always false (all combining chars > 0xff) + */ +#define IS_COMBINING_CH(c) 0 + +/** + * IS_EXTENDER: + * @c: an UNICODE value (int) + * + * Macro to check the following production in the XML spec: + * + * + * [89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | + * #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | + * [#x309D-#x309E] | [#x30FC-#x30FE] + */ +#define IS_EXTENDER(c) xmlIsExtenderQ(c) + +/** + * IS_EXTENDER_CH: + * @c: an xmlChar value (usually an unsigned char) + * + * Behaves like IS_EXTENDER but with a single-byte argument + */ +#define IS_EXTENDER_CH(c) xmlIsExtender_ch(c) + +/** + * IS_IDEOGRAPHIC: + * @c: an UNICODE value (int) + * + * Macro to check the following production in the XML spec: + * + * + * [86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029] + */ +#define IS_IDEOGRAPHIC(c) xmlIsIdeographicQ(c) + +/** + * IS_LETTER: + * @c: an UNICODE value (int) + * + * Macro to check the following production in the XML spec: + * + * + * [84] Letter ::= BaseChar | Ideographic + */ +#define IS_LETTER(c) (IS_BASECHAR(c) || IS_IDEOGRAPHIC(c)) + +/** + * IS_LETTER_CH: + * @c: an xmlChar value (normally unsigned char) + * + * Macro behaves like IS_LETTER, but only check base chars + * + */ +#define IS_LETTER_CH(c) xmlIsBaseChar_ch(c) + +/** + * IS_ASCII_LETTER: + * @c: an xmlChar value + * + * Macro to check [a-zA-Z] + * + */ +#define IS_ASCII_LETTER(c) (((0x41 <= (c)) && ((c) <= 0x5a)) || \ + ((0x61 <= (c)) && ((c) <= 0x7a))) + +/** + * IS_ASCII_DIGIT: + * @c: an xmlChar value + * + * Macro to check [0-9] + * + */ +#define IS_ASCII_DIGIT(c) ((0x30 <= (c)) && ((c) <= 0x39)) + +/** + * IS_PUBIDCHAR: + * @c: an UNICODE value (int) + * + * Macro to check the following production in the XML spec: + * + * + * [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] + */ +#define IS_PUBIDCHAR(c) xmlIsPubidCharQ(c) + +/** + * IS_PUBIDCHAR_CH: + * @c: an xmlChar value (normally unsigned char) + * + * Same as IS_PUBIDCHAR but for single-byte value + */ +#define IS_PUBIDCHAR_CH(c) xmlIsPubidChar_ch(c) + +/** + * SKIP_EOL: + * @p: and UTF8 string pointer + * + * Skips the end of line chars. + */ +#define SKIP_EOL(p) \ + if (*(p) == 0x13) { p++ ; if (*(p) == 0x10) p++; } \ + if (*(p) == 0x10) { p++ ; if (*(p) == 0x13) p++; } + +/** + * MOVETO_ENDTAG: + * @p: and UTF8 string pointer + * + * Skips to the next '>' char. + */ +#define MOVETO_ENDTAG(p) \ + while ((*p) && (*(p) != '>')) (p)++ + +/** + * MOVETO_STARTTAG: + * @p: and UTF8 string pointer + * + * Skips to the next '<' char. + */ +#define MOVETO_STARTTAG(p) \ + while ((*p) && (*(p) != '<')) (p)++ + +/** + * Global variables used for predefined strings. + */ +XMLPUBVAR const xmlChar xmlStringText[]; +XMLPUBVAR const xmlChar xmlStringTextNoenc[]; +XMLPUBVAR const xmlChar xmlStringComment[]; + +/* + * Function to finish the work of the macros where needed. + */ +XMLPUBFUN int XMLCALL xmlIsLetter (int c); + +/** + * Parser context. + */ +XMLPUBFUN xmlParserCtxtPtr XMLCALL + xmlCreateFileParserCtxt (const char *filename); +XMLPUBFUN xmlParserCtxtPtr XMLCALL + xmlCreateURLParserCtxt (const char *filename, + int options); +XMLPUBFUN xmlParserCtxtPtr XMLCALL + xmlCreateMemoryParserCtxt(const char *buffer, + int size); +XMLPUBFUN xmlParserCtxtPtr XMLCALL + xmlCreateEntityParserCtxt(const xmlChar *URL, + const xmlChar *ID, + const xmlChar *base); +XMLPUBFUN int XMLCALL + xmlSwitchEncoding (xmlParserCtxtPtr ctxt, + xmlCharEncoding enc); +XMLPUBFUN int XMLCALL + xmlSwitchToEncoding (xmlParserCtxtPtr ctxt, + xmlCharEncodingHandlerPtr handler); +XMLPUBFUN int XMLCALL + xmlSwitchInputEncoding (xmlParserCtxtPtr ctxt, + xmlParserInputPtr input, + xmlCharEncodingHandlerPtr handler); + +#ifdef IN_LIBXML +/* internal error reporting */ +XMLPUBFUN void XMLCALL + __xmlErrEncoding (xmlParserCtxtPtr ctxt, + xmlParserErrors xmlerr, + const char *msg, + const xmlChar * str1, + const xmlChar * str2) LIBXML_ATTR_FORMAT(3,0); +#endif + +/** + * Input Streams. + */ +XMLPUBFUN xmlParserInputPtr XMLCALL + xmlNewStringInputStream (xmlParserCtxtPtr ctxt, + const xmlChar *buffer); +XMLPUBFUN xmlParserInputPtr XMLCALL + xmlNewEntityInputStream (xmlParserCtxtPtr ctxt, + xmlEntityPtr entity); +XMLPUBFUN int XMLCALL + xmlPushInput (xmlParserCtxtPtr ctxt, + xmlParserInputPtr input); +XMLPUBFUN xmlChar XMLCALL + xmlPopInput (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlFreeInputStream (xmlParserInputPtr input); +XMLPUBFUN xmlParserInputPtr XMLCALL + xmlNewInputFromFile (xmlParserCtxtPtr ctxt, + const char *filename); +XMLPUBFUN xmlParserInputPtr XMLCALL + xmlNewInputStream (xmlParserCtxtPtr ctxt); + +/** + * Namespaces. + */ +XMLPUBFUN xmlChar * XMLCALL + xmlSplitQName (xmlParserCtxtPtr ctxt, + const xmlChar *name, + xmlChar **prefix); + +/** + * Generic production rules. + */ +XMLPUBFUN const xmlChar * XMLCALL + xmlParseName (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlParseNmtoken (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlParseEntityValue (xmlParserCtxtPtr ctxt, + xmlChar **orig); +XMLPUBFUN xmlChar * XMLCALL + xmlParseAttValue (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlParseSystemLiteral (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlParsePubidLiteral (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseCharData (xmlParserCtxtPtr ctxt, + int cdata); +XMLPUBFUN xmlChar * XMLCALL + xmlParseExternalID (xmlParserCtxtPtr ctxt, + xmlChar **publicID, + int strict); +XMLPUBFUN void XMLCALL + xmlParseComment (xmlParserCtxtPtr ctxt); +XMLPUBFUN const xmlChar * XMLCALL + xmlParsePITarget (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParsePI (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseNotationDecl (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseEntityDecl (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlParseDefaultDecl (xmlParserCtxtPtr ctxt, + xmlChar **value); +XMLPUBFUN xmlEnumerationPtr XMLCALL + xmlParseNotationType (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlEnumerationPtr XMLCALL + xmlParseEnumerationType (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlParseEnumeratedType (xmlParserCtxtPtr ctxt, + xmlEnumerationPtr *tree); +XMLPUBFUN int XMLCALL + xmlParseAttributeType (xmlParserCtxtPtr ctxt, + xmlEnumerationPtr *tree); +XMLPUBFUN void XMLCALL + xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlElementContentPtr XMLCALL + xmlParseElementMixedContentDecl + (xmlParserCtxtPtr ctxt, + int inputchk); +XMLPUBFUN xmlElementContentPtr XMLCALL + xmlParseElementChildrenContentDecl + (xmlParserCtxtPtr ctxt, + int inputchk); +XMLPUBFUN int XMLCALL + xmlParseElementContentDecl(xmlParserCtxtPtr ctxt, + const xmlChar *name, + xmlElementContentPtr *result); +XMLPUBFUN int XMLCALL + xmlParseElementDecl (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseMarkupDecl (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlParseCharRef (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlEntityPtr XMLCALL + xmlParseEntityRef (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseReference (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParsePEReference (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseDocTypeDecl (xmlParserCtxtPtr ctxt); +#ifdef LIBXML_SAX1_ENABLED +XMLPUBFUN const xmlChar * XMLCALL + xmlParseAttribute (xmlParserCtxtPtr ctxt, + xmlChar **value); +XMLPUBFUN const xmlChar * XMLCALL + xmlParseStartTag (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseEndTag (xmlParserCtxtPtr ctxt); +#endif /* LIBXML_SAX1_ENABLED */ +XMLPUBFUN void XMLCALL + xmlParseCDSect (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseContent (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseElement (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlParseVersionNum (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlParseVersionInfo (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlParseEncName (xmlParserCtxtPtr ctxt); +XMLPUBFUN const xmlChar * XMLCALL + xmlParseEncodingDecl (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlParseSDDecl (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseXMLDecl (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseTextDecl (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseMisc (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseExternalSubset (xmlParserCtxtPtr ctxt, + const xmlChar *ExternalID, + const xmlChar *SystemID); +/** + * XML_SUBSTITUTE_NONE: + * + * If no entities need to be substituted. + */ +#define XML_SUBSTITUTE_NONE 0 +/** + * XML_SUBSTITUTE_REF: + * + * Whether general entities need to be substituted. + */ +#define XML_SUBSTITUTE_REF 1 +/** + * XML_SUBSTITUTE_PEREF: + * + * Whether parameter entities need to be substituted. + */ +#define XML_SUBSTITUTE_PEREF 2 +/** + * XML_SUBSTITUTE_BOTH: + * + * Both general and parameter entities need to be substituted. + */ +#define XML_SUBSTITUTE_BOTH 3 + +XMLPUBFUN xmlChar * XMLCALL + xmlStringDecodeEntities (xmlParserCtxtPtr ctxt, + const xmlChar *str, + int what, + xmlChar end, + xmlChar end2, + xmlChar end3); +XMLPUBFUN xmlChar * XMLCALL + xmlStringLenDecodeEntities (xmlParserCtxtPtr ctxt, + const xmlChar *str, + int len, + int what, + xmlChar end, + xmlChar end2, + xmlChar end3); + +/* + * Generated by MACROS on top of parser.c c.f. PUSH_AND_POP. + */ +XMLPUBFUN int XMLCALL nodePush (xmlParserCtxtPtr ctxt, + xmlNodePtr value); +XMLPUBFUN xmlNodePtr XMLCALL nodePop (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL inputPush (xmlParserCtxtPtr ctxt, + xmlParserInputPtr value); +XMLPUBFUN xmlParserInputPtr XMLCALL inputPop (xmlParserCtxtPtr ctxt); +XMLPUBFUN const xmlChar * XMLCALL namePop (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL namePush (xmlParserCtxtPtr ctxt, + const xmlChar *value); + +/* + * other commodities shared between parser.c and parserInternals. + */ +XMLPUBFUN int XMLCALL xmlSkipBlankChars (xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL xmlStringCurrentChar (xmlParserCtxtPtr ctxt, + const xmlChar *cur, + int *len); +XMLPUBFUN void XMLCALL xmlParserHandlePEReference(xmlParserCtxtPtr ctxt); +XMLPUBFUN int XMLCALL xmlCheckLanguageID (const xmlChar *lang); + +/* + * Really core function shared with HTML parser. + */ +XMLPUBFUN int XMLCALL xmlCurrentChar (xmlParserCtxtPtr ctxt, + int *len); +XMLPUBFUN int XMLCALL xmlCopyCharMultiByte (xmlChar *out, + int val); +XMLPUBFUN int XMLCALL xmlCopyChar (int len, + xmlChar *out, + int val); +XMLPUBFUN void XMLCALL xmlNextChar (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL xmlParserInputShrink (xmlParserInputPtr in); + +#ifdef LIBXML_HTML_ENABLED +/* + * Actually comes from the HTML parser but launched from the init stuff. + */ +XMLPUBFUN void XMLCALL htmlInitAutoClose (void); +XMLPUBFUN htmlParserCtxtPtr XMLCALL htmlCreateFileParserCtxt(const char *filename, + const char *encoding); +#endif + +/* + * Specific function to keep track of entities references + * and used by the XSLT debugger. + */ +#ifdef LIBXML_LEGACY_ENABLED +/** + * xmlEntityReferenceFunc: + * @ent: the entity + * @firstNode: the fist node in the chunk + * @lastNode: the last nod in the chunk + * + * Callback function used when one needs to be able to track back the + * provenance of a chunk of nodes inherited from an entity replacement. + */ +typedef void (*xmlEntityReferenceFunc) (xmlEntityPtr ent, + xmlNodePtr firstNode, + xmlNodePtr lastNode); + +XMLPUBFUN void XMLCALL xmlSetEntityReferenceFunc (xmlEntityReferenceFunc func); + +XMLPUBFUN xmlChar * XMLCALL + xmlParseQuotedString (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlParseNamespace (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlNamespaceParseNSDef (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlScanName (xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlNamespaceParseNCName (xmlParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL xmlParserHandleReference(xmlParserCtxtPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlNamespaceParseQName (xmlParserCtxtPtr ctxt, + xmlChar **prefix); +/** + * Entities + */ +XMLPUBFUN xmlChar * XMLCALL + xmlDecodeEntities (xmlParserCtxtPtr ctxt, + int len, + int what, + xmlChar end, + xmlChar end2, + xmlChar end3); +XMLPUBFUN void XMLCALL + xmlHandleEntity (xmlParserCtxtPtr ctxt, + xmlEntityPtr entity); + +#endif /* LIBXML_LEGACY_ENABLED */ + +#ifdef IN_LIBXML +/* + * internal only + */ +XMLPUBFUN void XMLCALL + xmlErrMemory (xmlParserCtxtPtr ctxt, + const char *extra); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* __XML_PARSER_INTERNALS_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/pattern.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/pattern.h new file mode 100644 index 000000000000..97d2cd2bc085 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/pattern.h @@ -0,0 +1,100 @@ +/* + * Summary: pattern expression handling + * Description: allows to compile and test pattern expressions for nodes + * either in a tree or based on a parser state. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_PATTERN_H__ +#define __XML_PATTERN_H__ + +#include <libxml/xmlversion.h> +#include <libxml/tree.h> +#include <libxml/dict.h> + +#ifdef LIBXML_PATTERN_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlPattern: + * + * A compiled (XPath based) pattern to select nodes + */ +typedef struct _xmlPattern xmlPattern; +typedef xmlPattern *xmlPatternPtr; + +/** + * xmlPatternFlags: + * + * This is the set of options affecting the behaviour of pattern + * matching with this module + * + */ +typedef enum { + XML_PATTERN_DEFAULT = 0, /* simple pattern match */ + XML_PATTERN_XPATH = 1<<0, /* standard XPath pattern */ + XML_PATTERN_XSSEL = 1<<1, /* XPath subset for schema selector */ + XML_PATTERN_XSFIELD = 1<<2 /* XPath subset for schema field */ +} xmlPatternFlags; + +XMLPUBFUN void XMLCALL + xmlFreePattern (xmlPatternPtr comp); + +XMLPUBFUN void XMLCALL + xmlFreePatternList (xmlPatternPtr comp); + +XMLPUBFUN xmlPatternPtr XMLCALL + xmlPatterncompile (const xmlChar *pattern, + xmlDict *dict, + int flags, + const xmlChar **namespaces); +XMLPUBFUN int XMLCALL + xmlPatternMatch (xmlPatternPtr comp, + xmlNodePtr node); + +/* streaming interfaces */ +typedef struct _xmlStreamCtxt xmlStreamCtxt; +typedef xmlStreamCtxt *xmlStreamCtxtPtr; + +XMLPUBFUN int XMLCALL + xmlPatternStreamable (xmlPatternPtr comp); +XMLPUBFUN int XMLCALL + xmlPatternMaxDepth (xmlPatternPtr comp); +XMLPUBFUN int XMLCALL + xmlPatternMinDepth (xmlPatternPtr comp); +XMLPUBFUN int XMLCALL + xmlPatternFromRoot (xmlPatternPtr comp); +XMLPUBFUN xmlStreamCtxtPtr XMLCALL + xmlPatternGetStreamCtxt (xmlPatternPtr comp); +XMLPUBFUN void XMLCALL + xmlFreeStreamCtxt (xmlStreamCtxtPtr stream); +XMLPUBFUN int XMLCALL + xmlStreamPushNode (xmlStreamCtxtPtr stream, + const xmlChar *name, + const xmlChar *ns, + int nodeType); +XMLPUBFUN int XMLCALL + xmlStreamPush (xmlStreamCtxtPtr stream, + const xmlChar *name, + const xmlChar *ns); +XMLPUBFUN int XMLCALL + xmlStreamPushAttr (xmlStreamCtxtPtr stream, + const xmlChar *name, + const xmlChar *ns); +XMLPUBFUN int XMLCALL + xmlStreamPop (xmlStreamCtxtPtr stream); +XMLPUBFUN int XMLCALL + xmlStreamWantsAnyNode (xmlStreamCtxtPtr stream); +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_PATTERN_ENABLED */ + +#endif /* __XML_PATTERN_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/relaxng.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/relaxng.h new file mode 100644 index 000000000000..f269c9ec0db2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/relaxng.h @@ -0,0 +1,217 @@ +/* + * Summary: implementation of the Relax-NG validation + * Description: implementation of the Relax-NG validation + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_RELAX_NG__ +#define __XML_RELAX_NG__ + +#include <libxml/xmlversion.h> +#include <libxml/hash.h> +#include <libxml/xmlstring.h> + +#ifdef LIBXML_SCHEMAS_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _xmlRelaxNG xmlRelaxNG; +typedef xmlRelaxNG *xmlRelaxNGPtr; + + +/** + * xmlRelaxNGValidityErrorFunc: + * @ctx: the validation context + * @msg: the message + * @...: extra arguments + * + * Signature of an error callback from a Relax-NG validation + */ +typedef void (XMLCDECL *xmlRelaxNGValidityErrorFunc) (void *ctx, + const char *msg, + ...) LIBXML_ATTR_FORMAT(2,3); + +/** + * xmlRelaxNGValidityWarningFunc: + * @ctx: the validation context + * @msg: the message + * @...: extra arguments + * + * Signature of a warning callback from a Relax-NG validation + */ +typedef void (XMLCDECL *xmlRelaxNGValidityWarningFunc) (void *ctx, + const char *msg, + ...) LIBXML_ATTR_FORMAT(2,3); + +/** + * A schemas validation context + */ +typedef struct _xmlRelaxNGParserCtxt xmlRelaxNGParserCtxt; +typedef xmlRelaxNGParserCtxt *xmlRelaxNGParserCtxtPtr; + +typedef struct _xmlRelaxNGValidCtxt xmlRelaxNGValidCtxt; +typedef xmlRelaxNGValidCtxt *xmlRelaxNGValidCtxtPtr; + +/* + * xmlRelaxNGValidErr: + * + * List of possible Relax NG validation errors + */ +typedef enum { + XML_RELAXNG_OK = 0, + XML_RELAXNG_ERR_MEMORY, + XML_RELAXNG_ERR_TYPE, + XML_RELAXNG_ERR_TYPEVAL, + XML_RELAXNG_ERR_DUPID, + XML_RELAXNG_ERR_TYPECMP, + XML_RELAXNG_ERR_NOSTATE, + XML_RELAXNG_ERR_NODEFINE, + XML_RELAXNG_ERR_LISTEXTRA, + XML_RELAXNG_ERR_LISTEMPTY, + XML_RELAXNG_ERR_INTERNODATA, + XML_RELAXNG_ERR_INTERSEQ, + XML_RELAXNG_ERR_INTEREXTRA, + XML_RELAXNG_ERR_ELEMNAME, + XML_RELAXNG_ERR_ATTRNAME, + XML_RELAXNG_ERR_ELEMNONS, + XML_RELAXNG_ERR_ATTRNONS, + XML_RELAXNG_ERR_ELEMWRONGNS, + XML_RELAXNG_ERR_ATTRWRONGNS, + XML_RELAXNG_ERR_ELEMEXTRANS, + XML_RELAXNG_ERR_ATTREXTRANS, + XML_RELAXNG_ERR_ELEMNOTEMPTY, + XML_RELAXNG_ERR_NOELEM, + XML_RELAXNG_ERR_NOTELEM, + XML_RELAXNG_ERR_ATTRVALID, + XML_RELAXNG_ERR_CONTENTVALID, + XML_RELAXNG_ERR_EXTRACONTENT, + XML_RELAXNG_ERR_INVALIDATTR, + XML_RELAXNG_ERR_DATAELEM, + XML_RELAXNG_ERR_VALELEM, + XML_RELAXNG_ERR_LISTELEM, + XML_RELAXNG_ERR_DATATYPE, + XML_RELAXNG_ERR_VALUE, + XML_RELAXNG_ERR_LIST, + XML_RELAXNG_ERR_NOGRAMMAR, + XML_RELAXNG_ERR_EXTRADATA, + XML_RELAXNG_ERR_LACKDATA, + XML_RELAXNG_ERR_INTERNAL, + XML_RELAXNG_ERR_ELEMWRONG, + XML_RELAXNG_ERR_TEXTWRONG +} xmlRelaxNGValidErr; + +/* + * xmlRelaxNGParserFlags: + * + * List of possible Relax NG Parser flags + */ +typedef enum { + XML_RELAXNGP_NONE = 0, + XML_RELAXNGP_FREE_DOC = 1, + XML_RELAXNGP_CRNG = 2 +} xmlRelaxNGParserFlag; + +XMLPUBFUN int XMLCALL + xmlRelaxNGInitTypes (void); +XMLPUBFUN void XMLCALL + xmlRelaxNGCleanupTypes (void); + +/* + * Interfaces for parsing. + */ +XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL + xmlRelaxNGNewParserCtxt (const char *URL); +XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL + xmlRelaxNGNewMemParserCtxt (const char *buffer, + int size); +XMLPUBFUN xmlRelaxNGParserCtxtPtr XMLCALL + xmlRelaxNGNewDocParserCtxt (xmlDocPtr doc); + +XMLPUBFUN int XMLCALL + xmlRelaxParserSetFlag (xmlRelaxNGParserCtxtPtr ctxt, + int flag); + +XMLPUBFUN void XMLCALL + xmlRelaxNGFreeParserCtxt (xmlRelaxNGParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, + xmlRelaxNGValidityErrorFunc err, + xmlRelaxNGValidityWarningFunc warn, + void *ctx); +XMLPUBFUN int XMLCALL + xmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt, + xmlRelaxNGValidityErrorFunc *err, + xmlRelaxNGValidityWarningFunc *warn, + void **ctx); +XMLPUBFUN void XMLCALL + xmlRelaxNGSetParserStructuredErrors( + xmlRelaxNGParserCtxtPtr ctxt, + xmlStructuredErrorFunc serror, + void *ctx); +XMLPUBFUN xmlRelaxNGPtr XMLCALL + xmlRelaxNGParse (xmlRelaxNGParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlRelaxNGFree (xmlRelaxNGPtr schema); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + xmlRelaxNGDump (FILE *output, + xmlRelaxNGPtr schema); +XMLPUBFUN void XMLCALL + xmlRelaxNGDumpTree (FILE * output, + xmlRelaxNGPtr schema); +#endif /* LIBXML_OUTPUT_ENABLED */ +/* + * Interfaces for validating + */ +XMLPUBFUN void XMLCALL + xmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGValidityErrorFunc err, + xmlRelaxNGValidityWarningFunc warn, + void *ctx); +XMLPUBFUN int XMLCALL + xmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt, + xmlRelaxNGValidityErrorFunc *err, + xmlRelaxNGValidityWarningFunc *warn, + void **ctx); +XMLPUBFUN void XMLCALL + xmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt, + xmlStructuredErrorFunc serror, void *ctx); +XMLPUBFUN xmlRelaxNGValidCtxtPtr XMLCALL + xmlRelaxNGNewValidCtxt (xmlRelaxNGPtr schema); +XMLPUBFUN void XMLCALL + xmlRelaxNGFreeValidCtxt (xmlRelaxNGValidCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlRelaxNGValidateDoc (xmlRelaxNGValidCtxtPtr ctxt, + xmlDocPtr doc); +/* + * Interfaces for progressive validation when possible + */ +XMLPUBFUN int XMLCALL + xmlRelaxNGValidatePushElement (xmlRelaxNGValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem); +XMLPUBFUN int XMLCALL + xmlRelaxNGValidatePushCData (xmlRelaxNGValidCtxtPtr ctxt, + const xmlChar *data, + int len); +XMLPUBFUN int XMLCALL + xmlRelaxNGValidatePopElement (xmlRelaxNGValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem); +XMLPUBFUN int XMLCALL + xmlRelaxNGValidateFullElement (xmlRelaxNGValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_SCHEMAS_ENABLED */ + +#endif /* __XML_RELAX_NG__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/schemasInternals.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/schemasInternals.h new file mode 100644 index 000000000000..c521d1c184cc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/schemasInternals.h @@ -0,0 +1,958 @@ +/* + * Summary: internal interfaces for XML Schemas + * Description: internal interfaces for the XML Schemas handling + * and schema validity checking + * The Schemas development is a Work In Progress. + * Some of those interfaces are not guaranteed to be API or ABI stable ! + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + + +#ifndef __XML_SCHEMA_INTERNALS_H__ +#define __XML_SCHEMA_INTERNALS_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_SCHEMAS_ENABLED + +#include <libxml/xmlregexp.h> +#include <libxml/hash.h> +#include <libxml/dict.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + XML_SCHEMAS_UNKNOWN = 0, + XML_SCHEMAS_STRING = 1, + XML_SCHEMAS_NORMSTRING = 2, + XML_SCHEMAS_DECIMAL = 3, + XML_SCHEMAS_TIME = 4, + XML_SCHEMAS_GDAY = 5, + XML_SCHEMAS_GMONTH = 6, + XML_SCHEMAS_GMONTHDAY = 7, + XML_SCHEMAS_GYEAR = 8, + XML_SCHEMAS_GYEARMONTH = 9, + XML_SCHEMAS_DATE = 10, + XML_SCHEMAS_DATETIME = 11, + XML_SCHEMAS_DURATION = 12, + XML_SCHEMAS_FLOAT = 13, + XML_SCHEMAS_DOUBLE = 14, + XML_SCHEMAS_BOOLEAN = 15, + XML_SCHEMAS_TOKEN = 16, + XML_SCHEMAS_LANGUAGE = 17, + XML_SCHEMAS_NMTOKEN = 18, + XML_SCHEMAS_NMTOKENS = 19, + XML_SCHEMAS_NAME = 20, + XML_SCHEMAS_QNAME = 21, + XML_SCHEMAS_NCNAME = 22, + XML_SCHEMAS_ID = 23, + XML_SCHEMAS_IDREF = 24, + XML_SCHEMAS_IDREFS = 25, + XML_SCHEMAS_ENTITY = 26, + XML_SCHEMAS_ENTITIES = 27, + XML_SCHEMAS_NOTATION = 28, + XML_SCHEMAS_ANYURI = 29, + XML_SCHEMAS_INTEGER = 30, + XML_SCHEMAS_NPINTEGER = 31, + XML_SCHEMAS_NINTEGER = 32, + XML_SCHEMAS_NNINTEGER = 33, + XML_SCHEMAS_PINTEGER = 34, + XML_SCHEMAS_INT = 35, + XML_SCHEMAS_UINT = 36, + XML_SCHEMAS_LONG = 37, + XML_SCHEMAS_ULONG = 38, + XML_SCHEMAS_SHORT = 39, + XML_SCHEMAS_USHORT = 40, + XML_SCHEMAS_BYTE = 41, + XML_SCHEMAS_UBYTE = 42, + XML_SCHEMAS_HEXBINARY = 43, + XML_SCHEMAS_BASE64BINARY = 44, + XML_SCHEMAS_ANYTYPE = 45, + XML_SCHEMAS_ANYSIMPLETYPE = 46 +} xmlSchemaValType; + +/* + * XML Schemas defines multiple type of types. + */ +typedef enum { + XML_SCHEMA_TYPE_BASIC = 1, /* A built-in datatype */ + XML_SCHEMA_TYPE_ANY, + XML_SCHEMA_TYPE_FACET, + XML_SCHEMA_TYPE_SIMPLE, + XML_SCHEMA_TYPE_COMPLEX, + XML_SCHEMA_TYPE_SEQUENCE = 6, + XML_SCHEMA_TYPE_CHOICE, + XML_SCHEMA_TYPE_ALL, + XML_SCHEMA_TYPE_SIMPLE_CONTENT, + XML_SCHEMA_TYPE_COMPLEX_CONTENT, + XML_SCHEMA_TYPE_UR, + XML_SCHEMA_TYPE_RESTRICTION, + XML_SCHEMA_TYPE_EXTENSION, + XML_SCHEMA_TYPE_ELEMENT, + XML_SCHEMA_TYPE_ATTRIBUTE, + XML_SCHEMA_TYPE_ATTRIBUTEGROUP, + XML_SCHEMA_TYPE_GROUP, + XML_SCHEMA_TYPE_NOTATION, + XML_SCHEMA_TYPE_LIST, + XML_SCHEMA_TYPE_UNION, + XML_SCHEMA_TYPE_ANY_ATTRIBUTE, + XML_SCHEMA_TYPE_IDC_UNIQUE, + XML_SCHEMA_TYPE_IDC_KEY, + XML_SCHEMA_TYPE_IDC_KEYREF, + XML_SCHEMA_TYPE_PARTICLE = 25, + XML_SCHEMA_TYPE_ATTRIBUTE_USE, + XML_SCHEMA_FACET_MININCLUSIVE = 1000, + XML_SCHEMA_FACET_MINEXCLUSIVE, + XML_SCHEMA_FACET_MAXINCLUSIVE, + XML_SCHEMA_FACET_MAXEXCLUSIVE, + XML_SCHEMA_FACET_TOTALDIGITS, + XML_SCHEMA_FACET_FRACTIONDIGITS, + XML_SCHEMA_FACET_PATTERN, + XML_SCHEMA_FACET_ENUMERATION, + XML_SCHEMA_FACET_WHITESPACE, + XML_SCHEMA_FACET_LENGTH, + XML_SCHEMA_FACET_MAXLENGTH, + XML_SCHEMA_FACET_MINLENGTH, + XML_SCHEMA_EXTRA_QNAMEREF = 2000, + XML_SCHEMA_EXTRA_ATTR_USE_PROHIB +} xmlSchemaTypeType; + +typedef enum { + XML_SCHEMA_CONTENT_UNKNOWN = 0, + XML_SCHEMA_CONTENT_EMPTY = 1, + XML_SCHEMA_CONTENT_ELEMENTS, + XML_SCHEMA_CONTENT_MIXED, + XML_SCHEMA_CONTENT_SIMPLE, + XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS, /* Obsolete */ + XML_SCHEMA_CONTENT_BASIC, + XML_SCHEMA_CONTENT_ANY +} xmlSchemaContentType; + +typedef struct _xmlSchemaVal xmlSchemaVal; +typedef xmlSchemaVal *xmlSchemaValPtr; + +typedef struct _xmlSchemaType xmlSchemaType; +typedef xmlSchemaType *xmlSchemaTypePtr; + +typedef struct _xmlSchemaFacet xmlSchemaFacet; +typedef xmlSchemaFacet *xmlSchemaFacetPtr; + +/** + * Annotation + */ +typedef struct _xmlSchemaAnnot xmlSchemaAnnot; +typedef xmlSchemaAnnot *xmlSchemaAnnotPtr; +struct _xmlSchemaAnnot { + struct _xmlSchemaAnnot *next; + xmlNodePtr content; /* the annotation */ +}; + +/** + * XML_SCHEMAS_ANYATTR_SKIP: + * + * Skip unknown attribute from validation + * Obsolete, not used anymore. + */ +#define XML_SCHEMAS_ANYATTR_SKIP 1 +/** + * XML_SCHEMAS_ANYATTR_LAX: + * + * Ignore validation non definition on attributes + * Obsolete, not used anymore. + */ +#define XML_SCHEMAS_ANYATTR_LAX 2 +/** + * XML_SCHEMAS_ANYATTR_STRICT: + * + * Apply strict validation rules on attributes + * Obsolete, not used anymore. + */ +#define XML_SCHEMAS_ANYATTR_STRICT 3 +/** + * XML_SCHEMAS_ANY_SKIP: + * + * Skip unknown attribute from validation + */ +#define XML_SCHEMAS_ANY_SKIP 1 +/** + * XML_SCHEMAS_ANY_LAX: + * + * Used by wildcards. + * Validate if type found, don't worry if not found + */ +#define XML_SCHEMAS_ANY_LAX 2 +/** + * XML_SCHEMAS_ANY_STRICT: + * + * Used by wildcards. + * Apply strict validation rules + */ +#define XML_SCHEMAS_ANY_STRICT 3 +/** + * XML_SCHEMAS_ATTR_USE_PROHIBITED: + * + * Used by wildcards. + * The attribute is prohibited. + */ +#define XML_SCHEMAS_ATTR_USE_PROHIBITED 0 +/** + * XML_SCHEMAS_ATTR_USE_REQUIRED: + * + * The attribute is required. + */ +#define XML_SCHEMAS_ATTR_USE_REQUIRED 1 +/** + * XML_SCHEMAS_ATTR_USE_OPTIONAL: + * + * The attribute is optional. + */ +#define XML_SCHEMAS_ATTR_USE_OPTIONAL 2 +/** + * XML_SCHEMAS_ATTR_GLOBAL: + * + * allow elements in no namespace + */ +#define XML_SCHEMAS_ATTR_GLOBAL 1 << 0 +/** + * XML_SCHEMAS_ATTR_NSDEFAULT: + * + * allow elements in no namespace + */ +#define XML_SCHEMAS_ATTR_NSDEFAULT 1 << 7 +/** + * XML_SCHEMAS_ATTR_INTERNAL_RESOLVED: + * + * this is set when the "type" and "ref" references + * have been resolved. + */ +#define XML_SCHEMAS_ATTR_INTERNAL_RESOLVED 1 << 8 +/** + * XML_SCHEMAS_ATTR_FIXED: + * + * the attribute has a fixed value + */ +#define XML_SCHEMAS_ATTR_FIXED 1 << 9 + +/** + * xmlSchemaAttribute: + * An attribute definition. + */ + +typedef struct _xmlSchemaAttribute xmlSchemaAttribute; +typedef xmlSchemaAttribute *xmlSchemaAttributePtr; +struct _xmlSchemaAttribute { + xmlSchemaTypeType type; + struct _xmlSchemaAttribute *next; /* the next attribute (not used?) */ + const xmlChar *name; /* the name of the declaration */ + const xmlChar *id; /* Deprecated; not used */ + const xmlChar *ref; /* Deprecated; not used */ + const xmlChar *refNs; /* Deprecated; not used */ + const xmlChar *typeName; /* the local name of the type definition */ + const xmlChar *typeNs; /* the ns URI of the type definition */ + xmlSchemaAnnotPtr annot; + + xmlSchemaTypePtr base; /* Deprecated; not used */ + int occurs; /* Deprecated; not used */ + const xmlChar *defValue; /* The initial value of the value constraint */ + xmlSchemaTypePtr subtypes; /* the type definition */ + xmlNodePtr node; + const xmlChar *targetNamespace; + int flags; + const xmlChar *refPrefix; /* Deprecated; not used */ + xmlSchemaValPtr defVal; /* The compiled value constraint */ + xmlSchemaAttributePtr refDecl; /* Deprecated; not used */ +}; + +/** + * xmlSchemaAttributeLink: + * Used to build a list of attribute uses on complexType definitions. + * WARNING: Deprecated; not used. + */ +typedef struct _xmlSchemaAttributeLink xmlSchemaAttributeLink; +typedef xmlSchemaAttributeLink *xmlSchemaAttributeLinkPtr; +struct _xmlSchemaAttributeLink { + struct _xmlSchemaAttributeLink *next;/* the next attribute link ... */ + struct _xmlSchemaAttribute *attr;/* the linked attribute */ +}; + +/** + * XML_SCHEMAS_WILDCARD_COMPLETE: + * + * If the wildcard is complete. + */ +#define XML_SCHEMAS_WILDCARD_COMPLETE 1 << 0 + +/** + * xmlSchemaCharValueLink: + * Used to build a list of namespaces on wildcards. + */ +typedef struct _xmlSchemaWildcardNs xmlSchemaWildcardNs; +typedef xmlSchemaWildcardNs *xmlSchemaWildcardNsPtr; +struct _xmlSchemaWildcardNs { + struct _xmlSchemaWildcardNs *next;/* the next constraint link ... */ + const xmlChar *value;/* the value */ +}; + +/** + * xmlSchemaWildcard. + * A wildcard. + */ +typedef struct _xmlSchemaWildcard xmlSchemaWildcard; +typedef xmlSchemaWildcard *xmlSchemaWildcardPtr; +struct _xmlSchemaWildcard { + xmlSchemaTypeType type; /* The kind of type */ + const xmlChar *id; /* Deprecated; not used */ + xmlSchemaAnnotPtr annot; + xmlNodePtr node; + int minOccurs; /* Deprecated; not used */ + int maxOccurs; /* Deprecated; not used */ + int processContents; + int any; /* Indicates if the ns constraint is of ##any */ + xmlSchemaWildcardNsPtr nsSet; /* The list of allowed namespaces */ + xmlSchemaWildcardNsPtr negNsSet; /* The negated namespace */ + int flags; +}; + +/** + * XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED: + * + * The attribute wildcard has been built. + */ +#define XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED 1 << 0 +/** + * XML_SCHEMAS_ATTRGROUP_GLOBAL: + * + * The attribute group has been defined. + */ +#define XML_SCHEMAS_ATTRGROUP_GLOBAL 1 << 1 +/** + * XML_SCHEMAS_ATTRGROUP_MARKED: + * + * Marks the attr group as marked; used for circular checks. + */ +#define XML_SCHEMAS_ATTRGROUP_MARKED 1 << 2 + +/** + * XML_SCHEMAS_ATTRGROUP_REDEFINED: + * + * The attr group was redefined. + */ +#define XML_SCHEMAS_ATTRGROUP_REDEFINED 1 << 3 +/** + * XML_SCHEMAS_ATTRGROUP_HAS_REFS: + * + * Whether this attr. group contains attr. group references. + */ +#define XML_SCHEMAS_ATTRGROUP_HAS_REFS 1 << 4 + +/** + * An attribute group definition. + * + * xmlSchemaAttribute and xmlSchemaAttributeGroup start of structures + * must be kept similar + */ +typedef struct _xmlSchemaAttributeGroup xmlSchemaAttributeGroup; +typedef xmlSchemaAttributeGroup *xmlSchemaAttributeGroupPtr; +struct _xmlSchemaAttributeGroup { + xmlSchemaTypeType type; /* The kind of type */ + struct _xmlSchemaAttribute *next;/* the next attribute if in a group ... */ + const xmlChar *name; + const xmlChar *id; + const xmlChar *ref; /* Deprecated; not used */ + const xmlChar *refNs; /* Deprecated; not used */ + xmlSchemaAnnotPtr annot; + + xmlSchemaAttributePtr attributes; /* Deprecated; not used */ + xmlNodePtr node; + int flags; + xmlSchemaWildcardPtr attributeWildcard; + const xmlChar *refPrefix; /* Deprecated; not used */ + xmlSchemaAttributeGroupPtr refItem; /* Deprecated; not used */ + const xmlChar *targetNamespace; + void *attrUses; +}; + +/** + * xmlSchemaTypeLink: + * Used to build a list of types (e.g. member types of + * simpleType with variety "union"). + */ +typedef struct _xmlSchemaTypeLink xmlSchemaTypeLink; +typedef xmlSchemaTypeLink *xmlSchemaTypeLinkPtr; +struct _xmlSchemaTypeLink { + struct _xmlSchemaTypeLink *next;/* the next type link ... */ + xmlSchemaTypePtr type;/* the linked type */ +}; + +/** + * xmlSchemaFacetLink: + * Used to build a list of facets. + */ +typedef struct _xmlSchemaFacetLink xmlSchemaFacetLink; +typedef xmlSchemaFacetLink *xmlSchemaFacetLinkPtr; +struct _xmlSchemaFacetLink { + struct _xmlSchemaFacetLink *next;/* the next facet link ... */ + xmlSchemaFacetPtr facet;/* the linked facet */ +}; + +/** + * XML_SCHEMAS_TYPE_MIXED: + * + * the element content type is mixed + */ +#define XML_SCHEMAS_TYPE_MIXED 1 << 0 +/** + * XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION: + * + * the simple or complex type has a derivation method of "extension". + */ +#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION 1 << 1 +/** + * XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION: + * + * the simple or complex type has a derivation method of "restriction". + */ +#define XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION 1 << 2 +/** + * XML_SCHEMAS_TYPE_GLOBAL: + * + * the type is global + */ +#define XML_SCHEMAS_TYPE_GLOBAL 1 << 3 +/** + * XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD: + * + * the complexType owns an attribute wildcard, i.e. + * it can be freed by the complexType + */ +#define XML_SCHEMAS_TYPE_OWNED_ATTR_WILDCARD 1 << 4 /* Obsolete. */ +/** + * XML_SCHEMAS_TYPE_VARIETY_ABSENT: + * + * the simpleType has a variety of "absent". + * TODO: Actually not necessary :-/, since if + * none of the variety flags occur then it's + * automatically absent. + */ +#define XML_SCHEMAS_TYPE_VARIETY_ABSENT 1 << 5 +/** + * XML_SCHEMAS_TYPE_VARIETY_LIST: + * + * the simpleType has a variety of "list". + */ +#define XML_SCHEMAS_TYPE_VARIETY_LIST 1 << 6 +/** + * XML_SCHEMAS_TYPE_VARIETY_UNION: + * + * the simpleType has a variety of "union". + */ +#define XML_SCHEMAS_TYPE_VARIETY_UNION 1 << 7 +/** + * XML_SCHEMAS_TYPE_VARIETY_ATOMIC: + * + * the simpleType has a variety of "union". + */ +#define XML_SCHEMAS_TYPE_VARIETY_ATOMIC 1 << 8 +/** + * XML_SCHEMAS_TYPE_FINAL_EXTENSION: + * + * the complexType has a final of "extension". + */ +#define XML_SCHEMAS_TYPE_FINAL_EXTENSION 1 << 9 +/** + * XML_SCHEMAS_TYPE_FINAL_RESTRICTION: + * + * the simpleType/complexType has a final of "restriction". + */ +#define XML_SCHEMAS_TYPE_FINAL_RESTRICTION 1 << 10 +/** + * XML_SCHEMAS_TYPE_FINAL_LIST: + * + * the simpleType has a final of "list". + */ +#define XML_SCHEMAS_TYPE_FINAL_LIST 1 << 11 +/** + * XML_SCHEMAS_TYPE_FINAL_UNION: + * + * the simpleType has a final of "union". + */ +#define XML_SCHEMAS_TYPE_FINAL_UNION 1 << 12 +/** + * XML_SCHEMAS_TYPE_FINAL_DEFAULT: + * + * the simpleType has a final of "default". + */ +#define XML_SCHEMAS_TYPE_FINAL_DEFAULT 1 << 13 +/** + * XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE: + * + * Marks the item as a builtin primitive. + */ +#define XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE 1 << 14 +/** + * XML_SCHEMAS_TYPE_MARKED: + * + * Marks the item as marked; used for circular checks. + */ +#define XML_SCHEMAS_TYPE_MARKED 1 << 16 +/** + * XML_SCHEMAS_TYPE_BLOCK_DEFAULT: + * + * the complexType did not specify 'block' so use the default of the + * <schema> item. + */ +#define XML_SCHEMAS_TYPE_BLOCK_DEFAULT 1 << 17 +/** + * XML_SCHEMAS_TYPE_BLOCK_EXTENSION: + * + * the complexType has a 'block' of "extension". + */ +#define XML_SCHEMAS_TYPE_BLOCK_EXTENSION 1 << 18 +/** + * XML_SCHEMAS_TYPE_BLOCK_RESTRICTION: + * + * the complexType has a 'block' of "restriction". + */ +#define XML_SCHEMAS_TYPE_BLOCK_RESTRICTION 1 << 19 +/** + * XML_SCHEMAS_TYPE_ABSTRACT: + * + * the simple/complexType is abstract. + */ +#define XML_SCHEMAS_TYPE_ABSTRACT 1 << 20 +/** + * XML_SCHEMAS_TYPE_FACETSNEEDVALUE: + * + * indicates if the facets need a computed value + */ +#define XML_SCHEMAS_TYPE_FACETSNEEDVALUE 1 << 21 +/** + * XML_SCHEMAS_TYPE_INTERNAL_RESOLVED: + * + * indicates that the type was typefixed + */ +#define XML_SCHEMAS_TYPE_INTERNAL_RESOLVED 1 << 22 +/** + * XML_SCHEMAS_TYPE_INTERNAL_INVALID: + * + * indicates that the type is invalid + */ +#define XML_SCHEMAS_TYPE_INTERNAL_INVALID 1 << 23 +/** + * XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE: + * + * a whitespace-facet value of "preserve" + */ +#define XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE 1 << 24 +/** + * XML_SCHEMAS_TYPE_WHITESPACE_REPLACE: + * + * a whitespace-facet value of "replace" + */ +#define XML_SCHEMAS_TYPE_WHITESPACE_REPLACE 1 << 25 +/** + * XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE: + * + * a whitespace-facet value of "collapse" + */ +#define XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE 1 << 26 +/** + * XML_SCHEMAS_TYPE_HAS_FACETS: + * + * has facets + */ +#define XML_SCHEMAS_TYPE_HAS_FACETS 1 << 27 +/** + * XML_SCHEMAS_TYPE_NORMVALUENEEDED: + * + * indicates if the facets (pattern) need a normalized value + */ +#define XML_SCHEMAS_TYPE_NORMVALUENEEDED 1 << 28 + +/** + * XML_SCHEMAS_TYPE_FIXUP_1: + * + * First stage of fixup was done. + */ +#define XML_SCHEMAS_TYPE_FIXUP_1 1 << 29 + +/** + * XML_SCHEMAS_TYPE_REDEFINED: + * + * The type was redefined. + */ +#define XML_SCHEMAS_TYPE_REDEFINED 1 << 30 +/** + * XML_SCHEMAS_TYPE_REDEFINING: + * + * The type redefines an other type. + */ +/* #define XML_SCHEMAS_TYPE_REDEFINING 1 << 31 */ + +/** + * _xmlSchemaType: + * + * Schemas type definition. + */ +struct _xmlSchemaType { + xmlSchemaTypeType type; /* The kind of type */ + struct _xmlSchemaType *next; /* the next type if in a sequence ... */ + const xmlChar *name; + const xmlChar *id ; /* Deprecated; not used */ + const xmlChar *ref; /* Deprecated; not used */ + const xmlChar *refNs; /* Deprecated; not used */ + xmlSchemaAnnotPtr annot; + xmlSchemaTypePtr subtypes; + xmlSchemaAttributePtr attributes; /* Deprecated; not used */ + xmlNodePtr node; + int minOccurs; /* Deprecated; not used */ + int maxOccurs; /* Deprecated; not used */ + + int flags; + xmlSchemaContentType contentType; + const xmlChar *base; /* Base type's local name */ + const xmlChar *baseNs; /* Base type's target namespace */ + xmlSchemaTypePtr baseType; /* The base type component */ + xmlSchemaFacetPtr facets; /* Local facets */ + struct _xmlSchemaType *redef; /* Deprecated; not used */ + int recurse; /* Obsolete */ + xmlSchemaAttributeLinkPtr *attributeUses; /* Deprecated; not used */ + xmlSchemaWildcardPtr attributeWildcard; + int builtInType; /* Type of built-in types. */ + xmlSchemaTypeLinkPtr memberTypes; /* member-types if a union type. */ + xmlSchemaFacetLinkPtr facetSet; /* All facets (incl. inherited) */ + const xmlChar *refPrefix; /* Deprecated; not used */ + xmlSchemaTypePtr contentTypeDef; /* Used for the simple content of complex types. + Could we use @subtypes for this? */ + xmlRegexpPtr contModel; /* Holds the automaton of the content model */ + const xmlChar *targetNamespace; + void *attrUses; +}; + +/* + * xmlSchemaElement: + * An element definition. + * + * xmlSchemaType, xmlSchemaFacet and xmlSchemaElement start of + * structures must be kept similar + */ +/** + * XML_SCHEMAS_ELEM_NILLABLE: + * + * the element is nillable + */ +#define XML_SCHEMAS_ELEM_NILLABLE 1 << 0 +/** + * XML_SCHEMAS_ELEM_GLOBAL: + * + * the element is global + */ +#define XML_SCHEMAS_ELEM_GLOBAL 1 << 1 +/** + * XML_SCHEMAS_ELEM_DEFAULT: + * + * the element has a default value + */ +#define XML_SCHEMAS_ELEM_DEFAULT 1 << 2 +/** + * XML_SCHEMAS_ELEM_FIXED: + * + * the element has a fixed value + */ +#define XML_SCHEMAS_ELEM_FIXED 1 << 3 +/** + * XML_SCHEMAS_ELEM_ABSTRACT: + * + * the element is abstract + */ +#define XML_SCHEMAS_ELEM_ABSTRACT 1 << 4 +/** + * XML_SCHEMAS_ELEM_TOPLEVEL: + * + * the element is top level + * obsolete: use XML_SCHEMAS_ELEM_GLOBAL instead + */ +#define XML_SCHEMAS_ELEM_TOPLEVEL 1 << 5 +/** + * XML_SCHEMAS_ELEM_REF: + * + * the element is a reference to a type + */ +#define XML_SCHEMAS_ELEM_REF 1 << 6 +/** + * XML_SCHEMAS_ELEM_NSDEFAULT: + * + * allow elements in no namespace + * Obsolete, not used anymore. + */ +#define XML_SCHEMAS_ELEM_NSDEFAULT 1 << 7 +/** + * XML_SCHEMAS_ELEM_INTERNAL_RESOLVED: + * + * this is set when "type", "ref", "substitutionGroup" + * references have been resolved. + */ +#define XML_SCHEMAS_ELEM_INTERNAL_RESOLVED 1 << 8 + /** + * XML_SCHEMAS_ELEM_CIRCULAR: + * + * a helper flag for the search of circular references. + */ +#define XML_SCHEMAS_ELEM_CIRCULAR 1 << 9 +/** + * XML_SCHEMAS_ELEM_BLOCK_ABSENT: + * + * the "block" attribute is absent + */ +#define XML_SCHEMAS_ELEM_BLOCK_ABSENT 1 << 10 +/** + * XML_SCHEMAS_ELEM_BLOCK_EXTENSION: + * + * disallowed substitutions are absent + */ +#define XML_SCHEMAS_ELEM_BLOCK_EXTENSION 1 << 11 +/** + * XML_SCHEMAS_ELEM_BLOCK_RESTRICTION: + * + * disallowed substitutions: "restriction" + */ +#define XML_SCHEMAS_ELEM_BLOCK_RESTRICTION 1 << 12 +/** + * XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION: + * + * disallowed substitutions: "substitution" + */ +#define XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION 1 << 13 +/** + * XML_SCHEMAS_ELEM_FINAL_ABSENT: + * + * substitution group exclusions are absent + */ +#define XML_SCHEMAS_ELEM_FINAL_ABSENT 1 << 14 +/** + * XML_SCHEMAS_ELEM_FINAL_EXTENSION: + * + * substitution group exclusions: "extension" + */ +#define XML_SCHEMAS_ELEM_FINAL_EXTENSION 1 << 15 +/** + * XML_SCHEMAS_ELEM_FINAL_RESTRICTION: + * + * substitution group exclusions: "restriction" + */ +#define XML_SCHEMAS_ELEM_FINAL_RESTRICTION 1 << 16 +/** + * XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD: + * + * the declaration is a substitution group head + */ +#define XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD 1 << 17 +/** + * XML_SCHEMAS_ELEM_INTERNAL_CHECKED: + * + * this is set when the elem decl has been checked against + * all constraints + */ +#define XML_SCHEMAS_ELEM_INTERNAL_CHECKED 1 << 18 + +typedef struct _xmlSchemaElement xmlSchemaElement; +typedef xmlSchemaElement *xmlSchemaElementPtr; +struct _xmlSchemaElement { + xmlSchemaTypeType type; /* The kind of type */ + struct _xmlSchemaType *next; /* Not used? */ + const xmlChar *name; + const xmlChar *id; /* Deprecated; not used */ + const xmlChar *ref; /* Deprecated; not used */ + const xmlChar *refNs; /* Deprecated; not used */ + xmlSchemaAnnotPtr annot; + xmlSchemaTypePtr subtypes; /* the type definition */ + xmlSchemaAttributePtr attributes; + xmlNodePtr node; + int minOccurs; /* Deprecated; not used */ + int maxOccurs; /* Deprecated; not used */ + + int flags; + const xmlChar *targetNamespace; + const xmlChar *namedType; + const xmlChar *namedTypeNs; + const xmlChar *substGroup; + const xmlChar *substGroupNs; + const xmlChar *scope; + const xmlChar *value; /* The original value of the value constraint. */ + struct _xmlSchemaElement *refDecl; /* This will now be used for the + substitution group affiliation */ + xmlRegexpPtr contModel; /* Obsolete for WXS, maybe used for RelaxNG */ + xmlSchemaContentType contentType; + const xmlChar *refPrefix; /* Deprecated; not used */ + xmlSchemaValPtr defVal; /* The compiled value constraint. */ + void *idcs; /* The identity-constraint defs */ +}; + +/* + * XML_SCHEMAS_FACET_UNKNOWN: + * + * unknown facet handling + */ +#define XML_SCHEMAS_FACET_UNKNOWN 0 +/* + * XML_SCHEMAS_FACET_PRESERVE: + * + * preserve the type of the facet + */ +#define XML_SCHEMAS_FACET_PRESERVE 1 +/* + * XML_SCHEMAS_FACET_REPLACE: + * + * replace the type of the facet + */ +#define XML_SCHEMAS_FACET_REPLACE 2 +/* + * XML_SCHEMAS_FACET_COLLAPSE: + * + * collapse the types of the facet + */ +#define XML_SCHEMAS_FACET_COLLAPSE 3 +/** + * A facet definition. + */ +struct _xmlSchemaFacet { + xmlSchemaTypeType type; /* The kind of type */ + struct _xmlSchemaFacet *next;/* the next type if in a sequence ... */ + const xmlChar *value; /* The original value */ + const xmlChar *id; /* Obsolete */ + xmlSchemaAnnotPtr annot; + xmlNodePtr node; + int fixed; /* XML_SCHEMAS_FACET_PRESERVE, etc. */ + int whitespace; + xmlSchemaValPtr val; /* The compiled value */ + xmlRegexpPtr regexp; /* The regex for patterns */ +}; + +/** + * A notation definition. + */ +typedef struct _xmlSchemaNotation xmlSchemaNotation; +typedef xmlSchemaNotation *xmlSchemaNotationPtr; +struct _xmlSchemaNotation { + xmlSchemaTypeType type; /* The kind of type */ + const xmlChar *name; + xmlSchemaAnnotPtr annot; + const xmlChar *identifier; + const xmlChar *targetNamespace; +}; + +/* +* TODO: Actually all those flags used for the schema should sit +* on the schema parser context, since they are used only +* during parsing an XML schema document, and not available +* on the component level as per spec. +*/ +/** + * XML_SCHEMAS_QUALIF_ELEM: + * + * Reflects elementFormDefault == qualified in + * an XML schema document. + */ +#define XML_SCHEMAS_QUALIF_ELEM 1 << 0 +/** + * XML_SCHEMAS_QUALIF_ATTR: + * + * Reflects attributeFormDefault == qualified in + * an XML schema document. + */ +#define XML_SCHEMAS_QUALIF_ATTR 1 << 1 +/** + * XML_SCHEMAS_FINAL_DEFAULT_EXTENSION: + * + * the schema has "extension" in the set of finalDefault. + */ +#define XML_SCHEMAS_FINAL_DEFAULT_EXTENSION 1 << 2 +/** + * XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION: + * + * the schema has "restriction" in the set of finalDefault. + */ +#define XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION 1 << 3 +/** + * XML_SCHEMAS_FINAL_DEFAULT_LIST: + * + * the schema has "list" in the set of finalDefault. + */ +#define XML_SCHEMAS_FINAL_DEFAULT_LIST 1 << 4 +/** + * XML_SCHEMAS_FINAL_DEFAULT_UNION: + * + * the schema has "union" in the set of finalDefault. + */ +#define XML_SCHEMAS_FINAL_DEFAULT_UNION 1 << 5 +/** + * XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION: + * + * the schema has "extension" in the set of blockDefault. + */ +#define XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION 1 << 6 +/** + * XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION: + * + * the schema has "restriction" in the set of blockDefault. + */ +#define XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION 1 << 7 +/** + * XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION: + * + * the schema has "substitution" in the set of blockDefault. + */ +#define XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION 1 << 8 +/** + * XML_SCHEMAS_INCLUDING_CONVERT_NS: + * + * the schema is currently including an other schema with + * no target namespace. + */ +#define XML_SCHEMAS_INCLUDING_CONVERT_NS 1 << 9 +/** + * _xmlSchema: + * + * A Schemas definition + */ +struct _xmlSchema { + const xmlChar *name; /* schema name */ + const xmlChar *targetNamespace; /* the target namespace */ + const xmlChar *version; + const xmlChar *id; /* Obsolete */ + xmlDocPtr doc; + xmlSchemaAnnotPtr annot; + int flags; + + xmlHashTablePtr typeDecl; + xmlHashTablePtr attrDecl; + xmlHashTablePtr attrgrpDecl; + xmlHashTablePtr elemDecl; + xmlHashTablePtr notaDecl; + + xmlHashTablePtr schemasImports; + + void *_private; /* unused by the library for users or bindings */ + xmlHashTablePtr groupDecl; + xmlDictPtr dict; + void *includes; /* the includes, this is opaque for now */ + int preserve; /* whether to free the document */ + int counter; /* used to give anonymous components unique names */ + xmlHashTablePtr idcDef; /* All identity-constraint defs. */ + void *volatiles; /* Obsolete */ +}; + +XMLPUBFUN void XMLCALL xmlSchemaFreeType (xmlSchemaTypePtr type); +XMLPUBFUN void XMLCALL xmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_SCHEMAS_ENABLED */ +#endif /* __XML_SCHEMA_INTERNALS_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/schematron.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/schematron.h new file mode 100644 index 000000000000..364eaecde6b1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/schematron.h @@ -0,0 +1,142 @@ +/* + * Summary: XML Schemastron implementation + * Description: interface to the XML Schematron validity checking. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + + +#ifndef __XML_SCHEMATRON_H__ +#define __XML_SCHEMATRON_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_SCHEMATRON_ENABLED + +#include <libxml/tree.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + XML_SCHEMATRON_OUT_QUIET = 1 << 0, /* quiet no report */ + XML_SCHEMATRON_OUT_TEXT = 1 << 1, /* build a textual report */ + XML_SCHEMATRON_OUT_XML = 1 << 2, /* output SVRL */ + XML_SCHEMATRON_OUT_ERROR = 1 << 3, /* output via xmlStructuredErrorFunc */ + XML_SCHEMATRON_OUT_FILE = 1 << 8, /* output to a file descriptor */ + XML_SCHEMATRON_OUT_BUFFER = 1 << 9, /* output to a buffer */ + XML_SCHEMATRON_OUT_IO = 1 << 10 /* output to I/O mechanism */ +} xmlSchematronValidOptions; + +/** + * The schemas related types are kept internal + */ +typedef struct _xmlSchematron xmlSchematron; +typedef xmlSchematron *xmlSchematronPtr; + +/** + * xmlSchematronValidityErrorFunc: + * @ctx: the validation context + * @msg: the message + * @...: extra arguments + * + * Signature of an error callback from a Schematron validation + */ +typedef void (*xmlSchematronValidityErrorFunc) (void *ctx, const char *msg, ...); + +/** + * xmlSchematronValidityWarningFunc: + * @ctx: the validation context + * @msg: the message + * @...: extra arguments + * + * Signature of a warning callback from a Schematron validation + */ +typedef void (*xmlSchematronValidityWarningFunc) (void *ctx, const char *msg, ...); + +/** + * A schemas validation context + */ +typedef struct _xmlSchematronParserCtxt xmlSchematronParserCtxt; +typedef xmlSchematronParserCtxt *xmlSchematronParserCtxtPtr; + +typedef struct _xmlSchematronValidCtxt xmlSchematronValidCtxt; +typedef xmlSchematronValidCtxt *xmlSchematronValidCtxtPtr; + +/* + * Interfaces for parsing. + */ +XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL + xmlSchematronNewParserCtxt (const char *URL); +XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL + xmlSchematronNewMemParserCtxt(const char *buffer, + int size); +XMLPUBFUN xmlSchematronParserCtxtPtr XMLCALL + xmlSchematronNewDocParserCtxt(xmlDocPtr doc); +XMLPUBFUN void XMLCALL + xmlSchematronFreeParserCtxt (xmlSchematronParserCtxtPtr ctxt); +/***** +XMLPUBFUN void XMLCALL + xmlSchematronSetParserErrors(xmlSchematronParserCtxtPtr ctxt, + xmlSchematronValidityErrorFunc err, + xmlSchematronValidityWarningFunc warn, + void *ctx); +XMLPUBFUN int XMLCALL + xmlSchematronGetParserErrors(xmlSchematronParserCtxtPtr ctxt, + xmlSchematronValidityErrorFunc * err, + xmlSchematronValidityWarningFunc * warn, + void **ctx); +XMLPUBFUN int XMLCALL + xmlSchematronIsValid (xmlSchematronValidCtxtPtr ctxt); + *****/ +XMLPUBFUN xmlSchematronPtr XMLCALL + xmlSchematronParse (xmlSchematronParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlSchematronFree (xmlSchematronPtr schema); +/* + * Interfaces for validating + */ +XMLPUBFUN void XMLCALL + xmlSchematronSetValidStructuredErrors( + xmlSchematronValidCtxtPtr ctxt, + xmlStructuredErrorFunc serror, + void *ctx); +/****** +XMLPUBFUN void XMLCALL + xmlSchematronSetValidErrors (xmlSchematronValidCtxtPtr ctxt, + xmlSchematronValidityErrorFunc err, + xmlSchematronValidityWarningFunc warn, + void *ctx); +XMLPUBFUN int XMLCALL + xmlSchematronGetValidErrors (xmlSchematronValidCtxtPtr ctxt, + xmlSchematronValidityErrorFunc *err, + xmlSchematronValidityWarningFunc *warn, + void **ctx); +XMLPUBFUN int XMLCALL + xmlSchematronSetValidOptions(xmlSchematronValidCtxtPtr ctxt, + int options); +XMLPUBFUN int XMLCALL + xmlSchematronValidCtxtGetOptions(xmlSchematronValidCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlSchematronValidateOneElement (xmlSchematronValidCtxtPtr ctxt, + xmlNodePtr elem); + *******/ + +XMLPUBFUN xmlSchematronValidCtxtPtr XMLCALL + xmlSchematronNewValidCtxt (xmlSchematronPtr schema, + int options); +XMLPUBFUN void XMLCALL + xmlSchematronFreeValidCtxt (xmlSchematronValidCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlSchematronValidateDoc (xmlSchematronValidCtxtPtr ctxt, + xmlDocPtr instance); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_SCHEMATRON_ENABLED */ +#endif /* __XML_SCHEMATRON_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/threads.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/threads.h new file mode 100644 index 000000000000..9969ae7cfd0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/threads.h @@ -0,0 +1,89 @@ +/** + * Summary: interfaces for thread handling + * Description: set of generic threading related routines + * should work with pthreads, Windows native or TLS threads + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_THREADS_H__ +#define __XML_THREADS_H__ + +#include <libxml/xmlversion.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * xmlMutex are a simple mutual exception locks. + */ +typedef struct _xmlMutex xmlMutex; +typedef xmlMutex *xmlMutexPtr; + +/* + * xmlRMutex are reentrant mutual exception locks. + */ +typedef struct _xmlRMutex xmlRMutex; +typedef xmlRMutex *xmlRMutexPtr; + +#ifdef __cplusplus +} +#endif +#include <libxml/globals.h> +#ifdef __cplusplus +extern "C" { +#endif +XMLPUBFUN xmlMutexPtr XMLCALL + xmlNewMutex (void); +XMLPUBFUN void XMLCALL + xmlMutexLock (xmlMutexPtr tok); +XMLPUBFUN void XMLCALL + xmlMutexUnlock (xmlMutexPtr tok); +XMLPUBFUN void XMLCALL + xmlFreeMutex (xmlMutexPtr tok); + +XMLPUBFUN xmlRMutexPtr XMLCALL + xmlNewRMutex (void); +XMLPUBFUN void XMLCALL + xmlRMutexLock (xmlRMutexPtr tok); +XMLPUBFUN void XMLCALL + xmlRMutexUnlock (xmlRMutexPtr tok); +XMLPUBFUN void XMLCALL + xmlFreeRMutex (xmlRMutexPtr tok); + +/* + * Library wide APIs. + */ +XMLPUBFUN void XMLCALL + xmlInitThreads (void); +XMLPUBFUN void XMLCALL + xmlLockLibrary (void); +XMLPUBFUN void XMLCALL + xmlUnlockLibrary(void); +XMLPUBFUN int XMLCALL + xmlGetThreadId (void); +XMLPUBFUN int XMLCALL + xmlIsMainThread (void); +XMLPUBFUN void XMLCALL + xmlCleanupThreads(void); +XMLPUBFUN xmlGlobalStatePtr XMLCALL + xmlGetGlobalState(void); + +#ifdef HAVE_PTHREAD_H +#elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) +#if defined(LIBXML_STATIC_FOR_DLL) +int XMLCALL +xmlDllMain(void *hinstDLL, unsigned long fdwReason, + void *lpvReserved); +#endif +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* __XML_THREADS_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/tree.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/tree.h new file mode 100644 index 000000000000..1e79be92ea9a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/tree.h @@ -0,0 +1,1311 @@ +/* + * Summary: interfaces for tree manipulation + * Description: this module describes the structures found in an tree resulting + * from an XML or HTML parsing, as well as the API provided for + * various processing on that tree + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_TREE_H__ +#define __XML_TREE_H__ + +#include <stdio.h> +#include <limits.h> +#include <libxml/xmlversion.h> +#include <libxml/xmlstring.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Some of the basic types pointer to structures: + */ +/* xmlIO.h */ +typedef struct _xmlParserInputBuffer xmlParserInputBuffer; +typedef xmlParserInputBuffer *xmlParserInputBufferPtr; + +typedef struct _xmlOutputBuffer xmlOutputBuffer; +typedef xmlOutputBuffer *xmlOutputBufferPtr; + +/* parser.h */ +typedef struct _xmlParserInput xmlParserInput; +typedef xmlParserInput *xmlParserInputPtr; + +typedef struct _xmlParserCtxt xmlParserCtxt; +typedef xmlParserCtxt *xmlParserCtxtPtr; + +typedef struct _xmlSAXLocator xmlSAXLocator; +typedef xmlSAXLocator *xmlSAXLocatorPtr; + +typedef struct _xmlSAXHandler xmlSAXHandler; +typedef xmlSAXHandler *xmlSAXHandlerPtr; + +/* entities.h */ +typedef struct _xmlEntity xmlEntity; +typedef xmlEntity *xmlEntityPtr; + +/** + * BASE_BUFFER_SIZE: + * + * default buffer size 4000. + */ +#define BASE_BUFFER_SIZE 4096 + +/** + * LIBXML_NAMESPACE_DICT: + * + * Defines experimental behaviour: + * 1) xmlNs gets an additional field @context (a xmlDoc) + * 2) when creating a tree, xmlNs->href is stored in the dict of xmlDoc. + */ +/* #define LIBXML_NAMESPACE_DICT */ + +/** + * xmlBufferAllocationScheme: + * + * A buffer allocation scheme can be defined to either match exactly the + * need or double it's allocated size each time it is found too small. + */ + +typedef enum { + XML_BUFFER_ALLOC_DOUBLEIT, /* double each time one need to grow */ + XML_BUFFER_ALLOC_EXACT, /* grow only to the minimal size */ + XML_BUFFER_ALLOC_IMMUTABLE, /* immutable buffer */ + XML_BUFFER_ALLOC_IO, /* special allocation scheme used for I/O */ + XML_BUFFER_ALLOC_HYBRID, /* exact up to a threshold, and doubleit thereafter */ + XML_BUFFER_ALLOC_BOUNDED /* limit the upper size of the buffer */ +} xmlBufferAllocationScheme; + +/** + * xmlBuffer: + * + * A buffer structure, this old construct is limited to 2GB and + * is being deprecated, use API with xmlBuf instead + */ +typedef struct _xmlBuffer xmlBuffer; +typedef xmlBuffer *xmlBufferPtr; +struct _xmlBuffer { + xmlChar *content; /* The buffer content UTF8 */ + unsigned int use; /* The buffer size used */ + unsigned int size; /* The buffer size */ + xmlBufferAllocationScheme alloc; /* The realloc method */ + xmlChar *contentIO; /* in IO mode we may have a different base */ +}; + +/** + * xmlBuf: + * + * A buffer structure, new one, the actual structure internals are not public + */ + +typedef struct _xmlBuf xmlBuf; + +/** + * xmlBufPtr: + * + * A pointer to a buffer structure, the actual structure internals are not + * public + */ + +typedef xmlBuf *xmlBufPtr; + +/* + * A few public routines for xmlBuf. As those are expected to be used + * mostly internally the bulk of the routines are internal in buf.h + */ +XMLPUBFUN xmlChar* XMLCALL xmlBufContent (const xmlBuf* buf); +XMLPUBFUN xmlChar* XMLCALL xmlBufEnd (xmlBufPtr buf); +XMLPUBFUN size_t XMLCALL xmlBufUse (const xmlBufPtr buf); +XMLPUBFUN size_t XMLCALL xmlBufShrink (xmlBufPtr buf, size_t len); + +/* + * LIBXML2_NEW_BUFFER: + * + * Macro used to express that the API use the new buffers for + * xmlParserInputBuffer and xmlOutputBuffer. The change was + * introduced in 2.9.0. + */ +#define LIBXML2_NEW_BUFFER + +/** + * XML_XML_NAMESPACE: + * + * This is the namespace for the special xml: prefix predefined in the + * XML Namespace specification. + */ +#define XML_XML_NAMESPACE \ + (const xmlChar *) "http://www.w3.org/XML/1998/namespace" + +/** + * XML_XML_ID: + * + * This is the name for the special xml:id attribute + */ +#define XML_XML_ID (const xmlChar *) "xml:id" + +/* + * The different element types carried by an XML tree. + * + * NOTE: This is synchronized with DOM Level1 values + * See http://www.w3.org/TR/REC-DOM-Level-1/ + * + * Actually this had diverged a bit, and now XML_DOCUMENT_TYPE_NODE should + * be deprecated to use an XML_DTD_NODE. + */ +typedef enum { + XML_ELEMENT_NODE= 1, + XML_ATTRIBUTE_NODE= 2, + XML_TEXT_NODE= 3, + XML_CDATA_SECTION_NODE= 4, + XML_ENTITY_REF_NODE= 5, + XML_ENTITY_NODE= 6, + XML_PI_NODE= 7, + XML_COMMENT_NODE= 8, + XML_DOCUMENT_NODE= 9, + XML_DOCUMENT_TYPE_NODE= 10, + XML_DOCUMENT_FRAG_NODE= 11, + XML_NOTATION_NODE= 12, + XML_HTML_DOCUMENT_NODE= 13, + XML_DTD_NODE= 14, + XML_ELEMENT_DECL= 15, + XML_ATTRIBUTE_DECL= 16, + XML_ENTITY_DECL= 17, + XML_NAMESPACE_DECL= 18, + XML_XINCLUDE_START= 19, + XML_XINCLUDE_END= 20 +#ifdef LIBXML_DOCB_ENABLED + ,XML_DOCB_DOCUMENT_NODE= 21 +#endif +} xmlElementType; + + +/** + * xmlNotation: + * + * A DTD Notation definition. + */ + +typedef struct _xmlNotation xmlNotation; +typedef xmlNotation *xmlNotationPtr; +struct _xmlNotation { + const xmlChar *name; /* Notation name */ + const xmlChar *PublicID; /* Public identifier, if any */ + const xmlChar *SystemID; /* System identifier, if any */ +}; + +/** + * xmlAttributeType: + * + * A DTD Attribute type definition. + */ + +typedef enum { + XML_ATTRIBUTE_CDATA = 1, + XML_ATTRIBUTE_ID, + XML_ATTRIBUTE_IDREF , + XML_ATTRIBUTE_IDREFS, + XML_ATTRIBUTE_ENTITY, + XML_ATTRIBUTE_ENTITIES, + XML_ATTRIBUTE_NMTOKEN, + XML_ATTRIBUTE_NMTOKENS, + XML_ATTRIBUTE_ENUMERATION, + XML_ATTRIBUTE_NOTATION +} xmlAttributeType; + +/** + * xmlAttributeDefault: + * + * A DTD Attribute default definition. + */ + +typedef enum { + XML_ATTRIBUTE_NONE = 1, + XML_ATTRIBUTE_REQUIRED, + XML_ATTRIBUTE_IMPLIED, + XML_ATTRIBUTE_FIXED +} xmlAttributeDefault; + +/** + * xmlEnumeration: + * + * List structure used when there is an enumeration in DTDs. + */ + +typedef struct _xmlEnumeration xmlEnumeration; +typedef xmlEnumeration *xmlEnumerationPtr; +struct _xmlEnumeration { + struct _xmlEnumeration *next; /* next one */ + const xmlChar *name; /* Enumeration name */ +}; + +/** + * xmlAttribute: + * + * An Attribute declaration in a DTD. + */ + +typedef struct _xmlAttribute xmlAttribute; +typedef xmlAttribute *xmlAttributePtr; +struct _xmlAttribute { + void *_private; /* application data */ + xmlElementType type; /* XML_ATTRIBUTE_DECL, must be second ! */ + const xmlChar *name; /* Attribute name */ + struct _xmlNode *children; /* NULL */ + struct _xmlNode *last; /* NULL */ + struct _xmlDtd *parent; /* -> DTD */ + struct _xmlNode *next; /* next sibling link */ + struct _xmlNode *prev; /* previous sibling link */ + struct _xmlDoc *doc; /* the containing document */ + + struct _xmlAttribute *nexth; /* next in hash table */ + xmlAttributeType atype; /* The attribute type */ + xmlAttributeDefault def; /* the default */ + const xmlChar *defaultValue; /* or the default value */ + xmlEnumerationPtr tree; /* or the enumeration tree if any */ + const xmlChar *prefix; /* the namespace prefix if any */ + const xmlChar *elem; /* Element holding the attribute */ +}; + +/** + * xmlElementContentType: + * + * Possible definitions of element content types. + */ +typedef enum { + XML_ELEMENT_CONTENT_PCDATA = 1, + XML_ELEMENT_CONTENT_ELEMENT, + XML_ELEMENT_CONTENT_SEQ, + XML_ELEMENT_CONTENT_OR +} xmlElementContentType; + +/** + * xmlElementContentOccur: + * + * Possible definitions of element content occurrences. + */ +typedef enum { + XML_ELEMENT_CONTENT_ONCE = 1, + XML_ELEMENT_CONTENT_OPT, + XML_ELEMENT_CONTENT_MULT, + XML_ELEMENT_CONTENT_PLUS +} xmlElementContentOccur; + +/** + * xmlElementContent: + * + * An XML Element content as stored after parsing an element definition + * in a DTD. + */ + +typedef struct _xmlElementContent xmlElementContent; +typedef xmlElementContent *xmlElementContentPtr; +struct _xmlElementContent { + xmlElementContentType type; /* PCDATA, ELEMENT, SEQ or OR */ + xmlElementContentOccur ocur; /* ONCE, OPT, MULT or PLUS */ + const xmlChar *name; /* Element name */ + struct _xmlElementContent *c1; /* first child */ + struct _xmlElementContent *c2; /* second child */ + struct _xmlElementContent *parent; /* parent */ + const xmlChar *prefix; /* Namespace prefix */ +}; + +/** + * xmlElementTypeVal: + * + * The different possibilities for an element content type. + */ + +typedef enum { + XML_ELEMENT_TYPE_UNDEFINED = 0, + XML_ELEMENT_TYPE_EMPTY = 1, + XML_ELEMENT_TYPE_ANY, + XML_ELEMENT_TYPE_MIXED, + XML_ELEMENT_TYPE_ELEMENT +} xmlElementTypeVal; + +#ifdef __cplusplus +} +#endif +#include <libxml/xmlregexp.h> +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlElement: + * + * An XML Element declaration from a DTD. + */ + +typedef struct _xmlElement xmlElement; +typedef xmlElement *xmlElementPtr; +struct _xmlElement { + void *_private; /* application data */ + xmlElementType type; /* XML_ELEMENT_DECL, must be second ! */ + const xmlChar *name; /* Element name */ + struct _xmlNode *children; /* NULL */ + struct _xmlNode *last; /* NULL */ + struct _xmlDtd *parent; /* -> DTD */ + struct _xmlNode *next; /* next sibling link */ + struct _xmlNode *prev; /* previous sibling link */ + struct _xmlDoc *doc; /* the containing document */ + + xmlElementTypeVal etype; /* The type */ + xmlElementContentPtr content; /* the allowed element content */ + xmlAttributePtr attributes; /* List of the declared attributes */ + const xmlChar *prefix; /* the namespace prefix if any */ +#ifdef LIBXML_REGEXP_ENABLED + xmlRegexpPtr contModel; /* the validating regexp */ +#else + void *contModel; +#endif +}; + + +/** + * XML_LOCAL_NAMESPACE: + * + * A namespace declaration node. + */ +#define XML_LOCAL_NAMESPACE XML_NAMESPACE_DECL +typedef xmlElementType xmlNsType; + +/** + * xmlNs: + * + * An XML namespace. + * Note that prefix == NULL is valid, it defines the default namespace + * within the subtree (until overridden). + * + * xmlNsType is unified with xmlElementType. + */ + +typedef struct _xmlNs xmlNs; +typedef xmlNs *xmlNsPtr; +struct _xmlNs { + struct _xmlNs *next; /* next Ns link for this node */ + xmlNsType type; /* global or local */ + const xmlChar *href; /* URL for the namespace */ + const xmlChar *prefix; /* prefix for the namespace */ + void *_private; /* application data */ + struct _xmlDoc *context; /* normally an xmlDoc */ +}; + +/** + * xmlDtd: + * + * An XML DTD, as defined by <!DOCTYPE ... There is actually one for + * the internal subset and for the external subset. + */ +typedef struct _xmlDtd xmlDtd; +typedef xmlDtd *xmlDtdPtr; +struct _xmlDtd { + void *_private; /* application data */ + xmlElementType type; /* XML_DTD_NODE, must be second ! */ + const xmlChar *name; /* Name of the DTD */ + struct _xmlNode *children; /* the value of the property link */ + struct _xmlNode *last; /* last child link */ + struct _xmlDoc *parent; /* child->parent link */ + struct _xmlNode *next; /* next sibling link */ + struct _xmlNode *prev; /* previous sibling link */ + struct _xmlDoc *doc; /* the containing document */ + + /* End of common part */ + void *notations; /* Hash table for notations if any */ + void *elements; /* Hash table for elements if any */ + void *attributes; /* Hash table for attributes if any */ + void *entities; /* Hash table for entities if any */ + const xmlChar *ExternalID; /* External identifier for PUBLIC DTD */ + const xmlChar *SystemID; /* URI for a SYSTEM or PUBLIC DTD */ + void *pentities; /* Hash table for param entities if any */ +}; + +/** + * xmlAttr: + * + * An attribute on an XML node. + */ +typedef struct _xmlAttr xmlAttr; +typedef xmlAttr *xmlAttrPtr; +struct _xmlAttr { + void *_private; /* application data */ + xmlElementType type; /* XML_ATTRIBUTE_NODE, must be second ! */ + const xmlChar *name; /* the name of the property */ + struct _xmlNode *children; /* the value of the property */ + struct _xmlNode *last; /* NULL */ + struct _xmlNode *parent; /* child->parent link */ + struct _xmlAttr *next; /* next sibling link */ + struct _xmlAttr *prev; /* previous sibling link */ + struct _xmlDoc *doc; /* the containing document */ + xmlNs *ns; /* pointer to the associated namespace */ + xmlAttributeType atype; /* the attribute type if validating */ + void *psvi; /* for type/PSVI information */ +}; + +/** + * xmlID: + * + * An XML ID instance. + */ + +typedef struct _xmlID xmlID; +typedef xmlID *xmlIDPtr; +struct _xmlID { + struct _xmlID *next; /* next ID */ + const xmlChar *value; /* The ID name */ + xmlAttrPtr attr; /* The attribute holding it */ + const xmlChar *name; /* The attribute if attr is not available */ + int lineno; /* The line number if attr is not available */ + struct _xmlDoc *doc; /* The document holding the ID */ +}; + +/** + * xmlRef: + * + * An XML IDREF instance. + */ + +typedef struct _xmlRef xmlRef; +typedef xmlRef *xmlRefPtr; +struct _xmlRef { + struct _xmlRef *next; /* next Ref */ + const xmlChar *value; /* The Ref name */ + xmlAttrPtr attr; /* The attribute holding it */ + const xmlChar *name; /* The attribute if attr is not available */ + int lineno; /* The line number if attr is not available */ +}; + +/** + * xmlNode: + * + * A node in an XML tree. + */ +typedef struct _xmlNode xmlNode; +typedef xmlNode *xmlNodePtr; +struct _xmlNode { + void *_private; /* application data */ + xmlElementType type; /* type number, must be second ! */ + const xmlChar *name; /* the name of the node, or the entity */ + struct _xmlNode *children; /* parent->childs link */ + struct _xmlNode *last; /* last child link */ + struct _xmlNode *parent; /* child->parent link */ + struct _xmlNode *next; /* next sibling link */ + struct _xmlNode *prev; /* previous sibling link */ + struct _xmlDoc *doc; /* the containing document */ + + /* End of common part */ + xmlNs *ns; /* pointer to the associated namespace */ + xmlChar *content; /* the content */ + struct _xmlAttr *properties;/* properties list */ + xmlNs *nsDef; /* namespace definitions on this node */ + void *psvi; /* for type/PSVI information */ + unsigned short line; /* line number */ + unsigned short extra; /* extra data for XPath/XSLT */ +}; + +/** + * XML_GET_CONTENT: + * + * Macro to extract the content pointer of a node. + */ +#define XML_GET_CONTENT(n) \ + ((n)->type == XML_ELEMENT_NODE ? NULL : (n)->content) + +/** + * XML_GET_LINE: + * + * Macro to extract the line number of an element node. + */ +#define XML_GET_LINE(n) \ + (xmlGetLineNo(n)) + +/** + * xmlDocProperty + * + * Set of properties of the document as found by the parser + * Some of them are linked to similarly named xmlParserOption + */ +typedef enum { + XML_DOC_WELLFORMED = 1<<0, /* document is XML well formed */ + XML_DOC_NSVALID = 1<<1, /* document is Namespace valid */ + XML_DOC_OLD10 = 1<<2, /* parsed with old XML-1.0 parser */ + XML_DOC_DTDVALID = 1<<3, /* DTD validation was successful */ + XML_DOC_XINCLUDE = 1<<4, /* XInclude substitution was done */ + XML_DOC_USERBUILT = 1<<5, /* Document was built using the API + and not by parsing an instance */ + XML_DOC_INTERNAL = 1<<6, /* built for internal processing */ + XML_DOC_HTML = 1<<7 /* parsed or built HTML document */ +} xmlDocProperties; + +/** + * xmlDoc: + * + * An XML document. + */ +typedef struct _xmlDoc xmlDoc; +typedef xmlDoc *xmlDocPtr; +struct _xmlDoc { + void *_private; /* application data */ + xmlElementType type; /* XML_DOCUMENT_NODE, must be second ! */ + char *name; /* name/filename/URI of the document */ + struct _xmlNode *children; /* the document tree */ + struct _xmlNode *last; /* last child link */ + struct _xmlNode *parent; /* child->parent link */ + struct _xmlNode *next; /* next sibling link */ + struct _xmlNode *prev; /* previous sibling link */ + struct _xmlDoc *doc; /* autoreference to itself */ + + /* End of common part */ + int compression;/* level of zlib compression */ + int standalone; /* standalone document (no external refs) + 1 if standalone="yes" + 0 if standalone="no" + -1 if there is no XML declaration + -2 if there is an XML declaration, but no + standalone attribute was specified */ + struct _xmlDtd *intSubset; /* the document internal subset */ + struct _xmlDtd *extSubset; /* the document external subset */ + struct _xmlNs *oldNs; /* Global namespace, the old way */ + const xmlChar *version; /* the XML version string */ + const xmlChar *encoding; /* external initial encoding, if any */ + void *ids; /* Hash table for ID attributes if any */ + void *refs; /* Hash table for IDREFs attributes if any */ + const xmlChar *URL; /* The URI for that document */ + int charset; /* Internal flag for charset handling, + actually an xmlCharEncoding */ + struct _xmlDict *dict; /* dict used to allocate names or NULL */ + void *psvi; /* for type/PSVI information */ + int parseFlags; /* set of xmlParserOption used to parse the + document */ + int properties; /* set of xmlDocProperties for this document + set at the end of parsing */ +}; + + +typedef struct _xmlDOMWrapCtxt xmlDOMWrapCtxt; +typedef xmlDOMWrapCtxt *xmlDOMWrapCtxtPtr; + +/** + * xmlDOMWrapAcquireNsFunction: + * @ctxt: a DOM wrapper context + * @node: the context node (element or attribute) + * @nsName: the requested namespace name + * @nsPrefix: the requested namespace prefix + * + * A function called to acquire namespaces (xmlNs) from the wrapper. + * + * Returns an xmlNsPtr or NULL in case of an error. + */ +typedef xmlNsPtr (*xmlDOMWrapAcquireNsFunction) (xmlDOMWrapCtxtPtr ctxt, + xmlNodePtr node, + const xmlChar *nsName, + const xmlChar *nsPrefix); + +/** + * xmlDOMWrapCtxt: + * + * Context for DOM wrapper-operations. + */ +struct _xmlDOMWrapCtxt { + void * _private; + /* + * The type of this context, just in case we need specialized + * contexts in the future. + */ + int type; + /* + * Internal namespace map used for various operations. + */ + void * namespaceMap; + /* + * Use this one to acquire an xmlNsPtr intended for node->ns. + * (Note that this is not intended for elem->nsDef). + */ + xmlDOMWrapAcquireNsFunction getNsForNodeFunc; +}; + +/** + * xmlChildrenNode: + * + * Macro for compatibility naming layer with libxml1. Maps + * to "children." + */ +#ifndef xmlChildrenNode +#define xmlChildrenNode children +#endif + +/** + * xmlRootNode: + * + * Macro for compatibility naming layer with libxml1. Maps + * to "children". + */ +#ifndef xmlRootNode +#define xmlRootNode children +#endif + +/* + * Variables. + */ + +/* + * Some helper functions + */ +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || \ + defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || \ + defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || \ + defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || \ + defined(LIBXML_DOCB_ENABLED) || defined(LIBXML_LEGACY_ENABLED) +XMLPUBFUN int XMLCALL + xmlValidateNCName (const xmlChar *value, + int space); +#endif + +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +XMLPUBFUN int XMLCALL + xmlValidateQName (const xmlChar *value, + int space); +XMLPUBFUN int XMLCALL + xmlValidateName (const xmlChar *value, + int space); +XMLPUBFUN int XMLCALL + xmlValidateNMToken (const xmlChar *value, + int space); +#endif + +XMLPUBFUN xmlChar * XMLCALL + xmlBuildQName (const xmlChar *ncname, + const xmlChar *prefix, + xmlChar *memory, + int len); +XMLPUBFUN xmlChar * XMLCALL + xmlSplitQName2 (const xmlChar *name, + xmlChar **prefix); +XMLPUBFUN const xmlChar * XMLCALL + xmlSplitQName3 (const xmlChar *name, + int *len); + +/* + * Handling Buffers, the old ones see @xmlBuf for the new ones. + */ + +XMLPUBFUN void XMLCALL + xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme); +XMLPUBFUN xmlBufferAllocationScheme XMLCALL + xmlGetBufferAllocationScheme(void); + +XMLPUBFUN xmlBufferPtr XMLCALL + xmlBufferCreate (void); +XMLPUBFUN xmlBufferPtr XMLCALL + xmlBufferCreateSize (size_t size); +XMLPUBFUN xmlBufferPtr XMLCALL + xmlBufferCreateStatic (void *mem, + size_t size); +XMLPUBFUN int XMLCALL + xmlBufferResize (xmlBufferPtr buf, + unsigned int size); +XMLPUBFUN void XMLCALL + xmlBufferFree (xmlBufferPtr buf); +XMLPUBFUN int XMLCALL + xmlBufferDump (FILE *file, + xmlBufferPtr buf); +XMLPUBFUN int XMLCALL + xmlBufferAdd (xmlBufferPtr buf, + const xmlChar *str, + int len); +XMLPUBFUN int XMLCALL + xmlBufferAddHead (xmlBufferPtr buf, + const xmlChar *str, + int len); +XMLPUBFUN int XMLCALL + xmlBufferCat (xmlBufferPtr buf, + const xmlChar *str); +XMLPUBFUN int XMLCALL + xmlBufferCCat (xmlBufferPtr buf, + const char *str); +XMLPUBFUN int XMLCALL + xmlBufferShrink (xmlBufferPtr buf, + unsigned int len); +XMLPUBFUN int XMLCALL + xmlBufferGrow (xmlBufferPtr buf, + unsigned int len); +XMLPUBFUN void XMLCALL + xmlBufferEmpty (xmlBufferPtr buf); +XMLPUBFUN const xmlChar* XMLCALL + xmlBufferContent (const xmlBuffer *buf); +XMLPUBFUN xmlChar* XMLCALL + xmlBufferDetach (xmlBufferPtr buf); +XMLPUBFUN void XMLCALL + xmlBufferSetAllocationScheme(xmlBufferPtr buf, + xmlBufferAllocationScheme scheme); +XMLPUBFUN int XMLCALL + xmlBufferLength (const xmlBuffer *buf); + +/* + * Creating/freeing new structures. + */ +XMLPUBFUN xmlDtdPtr XMLCALL + xmlCreateIntSubset (xmlDocPtr doc, + const xmlChar *name, + const xmlChar *ExternalID, + const xmlChar *SystemID); +XMLPUBFUN xmlDtdPtr XMLCALL + xmlNewDtd (xmlDocPtr doc, + const xmlChar *name, + const xmlChar *ExternalID, + const xmlChar *SystemID); +XMLPUBFUN xmlDtdPtr XMLCALL + xmlGetIntSubset (const xmlDoc *doc); +XMLPUBFUN void XMLCALL + xmlFreeDtd (xmlDtdPtr cur); +#ifdef LIBXML_LEGACY_ENABLED +XMLPUBFUN xmlNsPtr XMLCALL + xmlNewGlobalNs (xmlDocPtr doc, + const xmlChar *href, + const xmlChar *prefix); +#endif /* LIBXML_LEGACY_ENABLED */ +XMLPUBFUN xmlNsPtr XMLCALL + xmlNewNs (xmlNodePtr node, + const xmlChar *href, + const xmlChar *prefix); +XMLPUBFUN void XMLCALL + xmlFreeNs (xmlNsPtr cur); +XMLPUBFUN void XMLCALL + xmlFreeNsList (xmlNsPtr cur); +XMLPUBFUN xmlDocPtr XMLCALL + xmlNewDoc (const xmlChar *version); +XMLPUBFUN void XMLCALL + xmlFreeDoc (xmlDocPtr cur); +XMLPUBFUN xmlAttrPtr XMLCALL + xmlNewDocProp (xmlDocPtr doc, + const xmlChar *name, + const xmlChar *value); +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ + defined(LIBXML_SCHEMAS_ENABLED) +XMLPUBFUN xmlAttrPtr XMLCALL + xmlNewProp (xmlNodePtr node, + const xmlChar *name, + const xmlChar *value); +#endif +XMLPUBFUN xmlAttrPtr XMLCALL + xmlNewNsProp (xmlNodePtr node, + xmlNsPtr ns, + const xmlChar *name, + const xmlChar *value); +XMLPUBFUN xmlAttrPtr XMLCALL + xmlNewNsPropEatName (xmlNodePtr node, + xmlNsPtr ns, + xmlChar *name, + const xmlChar *value); +XMLPUBFUN void XMLCALL + xmlFreePropList (xmlAttrPtr cur); +XMLPUBFUN void XMLCALL + xmlFreeProp (xmlAttrPtr cur); +XMLPUBFUN xmlAttrPtr XMLCALL + xmlCopyProp (xmlNodePtr target, + xmlAttrPtr cur); +XMLPUBFUN xmlAttrPtr XMLCALL + xmlCopyPropList (xmlNodePtr target, + xmlAttrPtr cur); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN xmlDtdPtr XMLCALL + xmlCopyDtd (xmlDtdPtr dtd); +#endif /* LIBXML_TREE_ENABLED */ +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +XMLPUBFUN xmlDocPtr XMLCALL + xmlCopyDoc (xmlDocPtr doc, + int recursive); +#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */ +/* + * Creating new nodes. + */ +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewDocNode (xmlDocPtr doc, + xmlNsPtr ns, + const xmlChar *name, + const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewDocNodeEatName (xmlDocPtr doc, + xmlNsPtr ns, + xmlChar *name, + const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewNode (xmlNsPtr ns, + const xmlChar *name); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewNodeEatName (xmlNsPtr ns, + xmlChar *name); +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewChild (xmlNodePtr parent, + xmlNsPtr ns, + const xmlChar *name, + const xmlChar *content); +#endif +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewDocText (const xmlDoc *doc, + const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewText (const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewDocPI (xmlDocPtr doc, + const xmlChar *name, + const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewPI (const xmlChar *name, + const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewDocTextLen (xmlDocPtr doc, + const xmlChar *content, + int len); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewTextLen (const xmlChar *content, + int len); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewDocComment (xmlDocPtr doc, + const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewComment (const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewCDataBlock (xmlDocPtr doc, + const xmlChar *content, + int len); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewCharRef (xmlDocPtr doc, + const xmlChar *name); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewReference (const xmlDoc *doc, + const xmlChar *name); +XMLPUBFUN xmlNodePtr XMLCALL + xmlCopyNode (xmlNodePtr node, + int recursive); +XMLPUBFUN xmlNodePtr XMLCALL + xmlDocCopyNode (xmlNodePtr node, + xmlDocPtr doc, + int recursive); +XMLPUBFUN xmlNodePtr XMLCALL + xmlDocCopyNodeList (xmlDocPtr doc, + xmlNodePtr node); +XMLPUBFUN xmlNodePtr XMLCALL + xmlCopyNodeList (xmlNodePtr node); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewTextChild (xmlNodePtr parent, + xmlNsPtr ns, + const xmlChar *name, + const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewDocRawNode (xmlDocPtr doc, + xmlNsPtr ns, + const xmlChar *name, + const xmlChar *content); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNewDocFragment (xmlDocPtr doc); +#endif /* LIBXML_TREE_ENABLED */ + +/* + * Navigating. + */ +XMLPUBFUN long XMLCALL + xmlGetLineNo (const xmlNode *node); +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) +XMLPUBFUN xmlChar * XMLCALL + xmlGetNodePath (const xmlNode *node); +#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED) */ +XMLPUBFUN xmlNodePtr XMLCALL + xmlDocGetRootElement (const xmlDoc *doc); +XMLPUBFUN xmlNodePtr XMLCALL + xmlGetLastChild (const xmlNode *parent); +XMLPUBFUN int XMLCALL + xmlNodeIsText (const xmlNode *node); +XMLPUBFUN int XMLCALL + xmlIsBlankNode (const xmlNode *node); + +/* + * Changing the structure. + */ +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) +XMLPUBFUN xmlNodePtr XMLCALL + xmlDocSetRootElement (xmlDocPtr doc, + xmlNodePtr root); +#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */ +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN void XMLCALL + xmlNodeSetName (xmlNodePtr cur, + const xmlChar *name); +#endif /* LIBXML_TREE_ENABLED */ +XMLPUBFUN xmlNodePtr XMLCALL + xmlAddChild (xmlNodePtr parent, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL + xmlAddChildList (xmlNodePtr parent, + xmlNodePtr cur); +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) +XMLPUBFUN xmlNodePtr XMLCALL + xmlReplaceNode (xmlNodePtr old, + xmlNodePtr cur); +#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED) */ +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \ + defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) +XMLPUBFUN xmlNodePtr XMLCALL + xmlAddPrevSibling (xmlNodePtr cur, + xmlNodePtr elem); +#endif /* LIBXML_TREE_ENABLED || LIBXML_HTML_ENABLED || LIBXML_SCHEMAS_ENABLED */ +XMLPUBFUN xmlNodePtr XMLCALL + xmlAddSibling (xmlNodePtr cur, + xmlNodePtr elem); +XMLPUBFUN xmlNodePtr XMLCALL + xmlAddNextSibling (xmlNodePtr cur, + xmlNodePtr elem); +XMLPUBFUN void XMLCALL + xmlUnlinkNode (xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL + xmlTextMerge (xmlNodePtr first, + xmlNodePtr second); +XMLPUBFUN int XMLCALL + xmlTextConcat (xmlNodePtr node, + const xmlChar *content, + int len); +XMLPUBFUN void XMLCALL + xmlFreeNodeList (xmlNodePtr cur); +XMLPUBFUN void XMLCALL + xmlFreeNode (xmlNodePtr cur); +XMLPUBFUN void XMLCALL + xmlSetTreeDoc (xmlNodePtr tree, + xmlDocPtr doc); +XMLPUBFUN void XMLCALL + xmlSetListDoc (xmlNodePtr list, + xmlDocPtr doc); +/* + * Namespaces. + */ +XMLPUBFUN xmlNsPtr XMLCALL + xmlSearchNs (xmlDocPtr doc, + xmlNodePtr node, + const xmlChar *nameSpace); +XMLPUBFUN xmlNsPtr XMLCALL + xmlSearchNsByHref (xmlDocPtr doc, + xmlNodePtr node, + const xmlChar *href); +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || \ + defined(LIBXML_SCHEMAS_ENABLED) +XMLPUBFUN xmlNsPtr * XMLCALL + xmlGetNsList (const xmlDoc *doc, + const xmlNode *node); +#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) */ + +XMLPUBFUN void XMLCALL + xmlSetNs (xmlNodePtr node, + xmlNsPtr ns); +XMLPUBFUN xmlNsPtr XMLCALL + xmlCopyNamespace (xmlNsPtr cur); +XMLPUBFUN xmlNsPtr XMLCALL + xmlCopyNamespaceList (xmlNsPtr cur); + +/* + * Changing the content. + */ +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || \ + defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) +XMLPUBFUN xmlAttrPtr XMLCALL + xmlSetProp (xmlNodePtr node, + const xmlChar *name, + const xmlChar *value); +XMLPUBFUN xmlAttrPtr XMLCALL + xmlSetNsProp (xmlNodePtr node, + xmlNsPtr ns, + const xmlChar *name, + const xmlChar *value); +#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || \ + defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED) */ +XMLPUBFUN xmlChar * XMLCALL + xmlGetNoNsProp (const xmlNode *node, + const xmlChar *name); +XMLPUBFUN xmlChar * XMLCALL + xmlGetProp (const xmlNode *node, + const xmlChar *name); +XMLPUBFUN xmlAttrPtr XMLCALL + xmlHasProp (const xmlNode *node, + const xmlChar *name); +XMLPUBFUN xmlAttrPtr XMLCALL + xmlHasNsProp (const xmlNode *node, + const xmlChar *name, + const xmlChar *nameSpace); +XMLPUBFUN xmlChar * XMLCALL + xmlGetNsProp (const xmlNode *node, + const xmlChar *name, + const xmlChar *nameSpace); +XMLPUBFUN xmlNodePtr XMLCALL + xmlStringGetNodeList (const xmlDoc *doc, + const xmlChar *value); +XMLPUBFUN xmlNodePtr XMLCALL + xmlStringLenGetNodeList (const xmlDoc *doc, + const xmlChar *value, + int len); +XMLPUBFUN xmlChar * XMLCALL + xmlNodeListGetString (xmlDocPtr doc, + const xmlNode *list, + int inLine); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN xmlChar * XMLCALL + xmlNodeListGetRawString (const xmlDoc *doc, + const xmlNode *list, + int inLine); +#endif /* LIBXML_TREE_ENABLED */ +XMLPUBFUN void XMLCALL + xmlNodeSetContent (xmlNodePtr cur, + const xmlChar *content); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN void XMLCALL + xmlNodeSetContentLen (xmlNodePtr cur, + const xmlChar *content, + int len); +#endif /* LIBXML_TREE_ENABLED */ +XMLPUBFUN void XMLCALL + xmlNodeAddContent (xmlNodePtr cur, + const xmlChar *content); +XMLPUBFUN void XMLCALL + xmlNodeAddContentLen (xmlNodePtr cur, + const xmlChar *content, + int len); +XMLPUBFUN xmlChar * XMLCALL + xmlNodeGetContent (const xmlNode *cur); + +XMLPUBFUN int XMLCALL + xmlNodeBufGetContent (xmlBufferPtr buffer, + const xmlNode *cur); +XMLPUBFUN int XMLCALL + xmlBufGetNodeContent (xmlBufPtr buf, + const xmlNode *cur); + +XMLPUBFUN xmlChar * XMLCALL + xmlNodeGetLang (const xmlNode *cur); +XMLPUBFUN int XMLCALL + xmlNodeGetSpacePreserve (const xmlNode *cur); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN void XMLCALL + xmlNodeSetLang (xmlNodePtr cur, + const xmlChar *lang); +XMLPUBFUN void XMLCALL + xmlNodeSetSpacePreserve (xmlNodePtr cur, + int val); +#endif /* LIBXML_TREE_ENABLED */ +XMLPUBFUN xmlChar * XMLCALL + xmlNodeGetBase (const xmlDoc *doc, + const xmlNode *cur); +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) +XMLPUBFUN void XMLCALL + xmlNodeSetBase (xmlNodePtr cur, + const xmlChar *uri); +#endif + +/* + * Removing content. + */ +XMLPUBFUN int XMLCALL + xmlRemoveProp (xmlAttrPtr cur); +#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +XMLPUBFUN int XMLCALL + xmlUnsetNsProp (xmlNodePtr node, + xmlNsPtr ns, + const xmlChar *name); +XMLPUBFUN int XMLCALL + xmlUnsetProp (xmlNodePtr node, + const xmlChar *name); +#endif /* defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) */ + +/* + * Internal, don't use. + */ +XMLPUBFUN void XMLCALL + xmlBufferWriteCHAR (xmlBufferPtr buf, + const xmlChar *string); +XMLPUBFUN void XMLCALL + xmlBufferWriteChar (xmlBufferPtr buf, + const char *string); +XMLPUBFUN void XMLCALL + xmlBufferWriteQuotedString(xmlBufferPtr buf, + const xmlChar *string); + +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void xmlAttrSerializeTxtContent(xmlBufferPtr buf, + xmlDocPtr doc, + xmlAttrPtr attr, + const xmlChar *string); +#endif /* LIBXML_OUTPUT_ENABLED */ + +#ifdef LIBXML_TREE_ENABLED +/* + * Namespace handling. + */ +XMLPUBFUN int XMLCALL + xmlReconciliateNs (xmlDocPtr doc, + xmlNodePtr tree); +#endif + +#ifdef LIBXML_OUTPUT_ENABLED +/* + * Saving. + */ +XMLPUBFUN void XMLCALL + xmlDocDumpFormatMemory (xmlDocPtr cur, + xmlChar **mem, + int *size, + int format); +XMLPUBFUN void XMLCALL + xmlDocDumpMemory (xmlDocPtr cur, + xmlChar **mem, + int *size); +XMLPUBFUN void XMLCALL + xmlDocDumpMemoryEnc (xmlDocPtr out_doc, + xmlChar **doc_txt_ptr, + int * doc_txt_len, + const char *txt_encoding); +XMLPUBFUN void XMLCALL + xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, + xmlChar **doc_txt_ptr, + int * doc_txt_len, + const char *txt_encoding, + int format); +XMLPUBFUN int XMLCALL + xmlDocFormatDump (FILE *f, + xmlDocPtr cur, + int format); +XMLPUBFUN int XMLCALL + xmlDocDump (FILE *f, + xmlDocPtr cur); +XMLPUBFUN void XMLCALL + xmlElemDump (FILE *f, + xmlDocPtr doc, + xmlNodePtr cur); +XMLPUBFUN int XMLCALL + xmlSaveFile (const char *filename, + xmlDocPtr cur); +XMLPUBFUN int XMLCALL + xmlSaveFormatFile (const char *filename, + xmlDocPtr cur, + int format); +XMLPUBFUN size_t XMLCALL + xmlBufNodeDump (xmlBufPtr buf, + xmlDocPtr doc, + xmlNodePtr cur, + int level, + int format); +XMLPUBFUN int XMLCALL + xmlNodeDump (xmlBufferPtr buf, + xmlDocPtr doc, + xmlNodePtr cur, + int level, + int format); + +XMLPUBFUN int XMLCALL + xmlSaveFileTo (xmlOutputBufferPtr buf, + xmlDocPtr cur, + const char *encoding); +XMLPUBFUN int XMLCALL + xmlSaveFormatFileTo (xmlOutputBufferPtr buf, + xmlDocPtr cur, + const char *encoding, + int format); +XMLPUBFUN void XMLCALL + xmlNodeDumpOutput (xmlOutputBufferPtr buf, + xmlDocPtr doc, + xmlNodePtr cur, + int level, + int format, + const char *encoding); + +XMLPUBFUN int XMLCALL + xmlSaveFormatFileEnc (const char *filename, + xmlDocPtr cur, + const char *encoding, + int format); + +XMLPUBFUN int XMLCALL + xmlSaveFileEnc (const char *filename, + xmlDocPtr cur, + const char *encoding); + +#endif /* LIBXML_OUTPUT_ENABLED */ +/* + * XHTML + */ +XMLPUBFUN int XMLCALL + xmlIsXHTML (const xmlChar *systemID, + const xmlChar *publicID); + +/* + * Compression. + */ +XMLPUBFUN int XMLCALL + xmlGetDocCompressMode (const xmlDoc *doc); +XMLPUBFUN void XMLCALL + xmlSetDocCompressMode (xmlDocPtr doc, + int mode); +XMLPUBFUN int XMLCALL + xmlGetCompressMode (void); +XMLPUBFUN void XMLCALL + xmlSetCompressMode (int mode); + +/* +* DOM-wrapper helper functions. +*/ +XMLPUBFUN xmlDOMWrapCtxtPtr XMLCALL + xmlDOMWrapNewCtxt (void); +XMLPUBFUN void XMLCALL + xmlDOMWrapFreeCtxt (xmlDOMWrapCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlDOMWrapReconcileNamespaces(xmlDOMWrapCtxtPtr ctxt, + xmlNodePtr elem, + int options); +XMLPUBFUN int XMLCALL + xmlDOMWrapAdoptNode (xmlDOMWrapCtxtPtr ctxt, + xmlDocPtr sourceDoc, + xmlNodePtr node, + xmlDocPtr destDoc, + xmlNodePtr destParent, + int options); +XMLPUBFUN int XMLCALL + xmlDOMWrapRemoveNode (xmlDOMWrapCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr node, + int options); +XMLPUBFUN int XMLCALL + xmlDOMWrapCloneNode (xmlDOMWrapCtxtPtr ctxt, + xmlDocPtr sourceDoc, + xmlNodePtr node, + xmlNodePtr *clonedNode, + xmlDocPtr destDoc, + xmlNodePtr destParent, + int deep, + int options); + +#ifdef LIBXML_TREE_ENABLED +/* + * 5 interfaces from DOM ElementTraversal, but different in entities + * traversal. + */ +XMLPUBFUN unsigned long XMLCALL + xmlChildElementCount (xmlNodePtr parent); +XMLPUBFUN xmlNodePtr XMLCALL + xmlNextElementSibling (xmlNodePtr node); +XMLPUBFUN xmlNodePtr XMLCALL + xmlFirstElementChild (xmlNodePtr parent); +XMLPUBFUN xmlNodePtr XMLCALL + xmlLastElementChild (xmlNodePtr parent); +XMLPUBFUN xmlNodePtr XMLCALL + xmlPreviousElementSibling (xmlNodePtr node); +#endif +#ifdef __cplusplus +} +#endif +#ifndef __XML_PARSER_H__ +#include <libxml/xmlmemory.h> +#endif + +#endif /* __XML_TREE_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/uri.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/uri.h new file mode 100644 index 000000000000..db48262b136f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/uri.h @@ -0,0 +1,94 @@ +/** + * Summary: library of generic URI related routines + * Description: library of generic URI related routines + * Implements RFC 2396 + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_URI_H__ +#define __XML_URI_H__ + +#include <libxml/xmlversion.h> +#include <libxml/tree.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlURI: + * + * A parsed URI reference. This is a struct containing the various fields + * as described in RFC 2396 but separated for further processing. + * + * Note: query is a deprecated field which is incorrectly unescaped. + * query_raw takes precedence over query if the former is set. + * See: http://mail.gnome.org/archives/xml/2007-April/thread.html#00127 + */ +typedef struct _xmlURI xmlURI; +typedef xmlURI *xmlURIPtr; +struct _xmlURI { + char *scheme; /* the URI scheme */ + char *opaque; /* opaque part */ + char *authority; /* the authority part */ + char *server; /* the server part */ + char *user; /* the user part */ + int port; /* the port number */ + char *path; /* the path string */ + char *query; /* the query string (deprecated - use with caution) */ + char *fragment; /* the fragment identifier */ + int cleanup; /* parsing potentially unclean URI */ + char *query_raw; /* the query string (as it appears in the URI) */ +}; + +/* + * This function is in tree.h: + * xmlChar * xmlNodeGetBase (xmlDocPtr doc, + * xmlNodePtr cur); + */ +XMLPUBFUN xmlURIPtr XMLCALL + xmlCreateURI (void); +XMLPUBFUN xmlChar * XMLCALL + xmlBuildURI (const xmlChar *URI, + const xmlChar *base); +XMLPUBFUN xmlChar * XMLCALL + xmlBuildRelativeURI (const xmlChar *URI, + const xmlChar *base); +XMLPUBFUN xmlURIPtr XMLCALL + xmlParseURI (const char *str); +XMLPUBFUN xmlURIPtr XMLCALL + xmlParseURIRaw (const char *str, + int raw); +XMLPUBFUN int XMLCALL + xmlParseURIReference (xmlURIPtr uri, + const char *str); +XMLPUBFUN xmlChar * XMLCALL + xmlSaveUri (xmlURIPtr uri); +XMLPUBFUN void XMLCALL + xmlPrintURI (FILE *stream, + xmlURIPtr uri); +XMLPUBFUN xmlChar * XMLCALL + xmlURIEscapeStr (const xmlChar *str, + const xmlChar *list); +XMLPUBFUN char * XMLCALL + xmlURIUnescapeString (const char *str, + int len, + char *target); +XMLPUBFUN int XMLCALL + xmlNormalizeURIPath (char *path); +XMLPUBFUN xmlChar * XMLCALL + xmlURIEscape (const xmlChar *str); +XMLPUBFUN void XMLCALL + xmlFreeURI (xmlURIPtr uri); +XMLPUBFUN xmlChar* XMLCALL + xmlCanonicPath (const xmlChar *path); +XMLPUBFUN xmlChar* XMLCALL + xmlPathToURI (const xmlChar *path); + +#ifdef __cplusplus +} +#endif +#endif /* __XML_URI_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/valid.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/valid.h new file mode 100644 index 000000000000..2bc7b380c1ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/valid.h @@ -0,0 +1,458 @@ +/* + * Summary: The DTD validation + * Description: API for the DTD handling and the validity checking + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + + +#ifndef __XML_VALID_H__ +#define __XML_VALID_H__ + +#include <libxml/xmlversion.h> +#include <libxml/xmlerror.h> +#include <libxml/tree.h> +#include <libxml/list.h> +#include <libxml/xmlautomata.h> +#include <libxml/xmlregexp.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Validation state added for non-determinist content model. + */ +typedef struct _xmlValidState xmlValidState; +typedef xmlValidState *xmlValidStatePtr; + +/** + * xmlValidityErrorFunc: + * @ctx: usually an xmlValidCtxtPtr to a validity error context, + * but comes from ctxt->userData (which normally contains such + * a pointer); ctxt->userData can be changed by the user. + * @msg: the string to format *printf like vararg + * @...: remaining arguments to the format + * + * Callback called when a validity error is found. This is a message + * oriented function similar to an *printf function. + */ +typedef void (XMLCDECL *xmlValidityErrorFunc) (void *ctx, + const char *msg, + ...) LIBXML_ATTR_FORMAT(2,3); + +/** + * xmlValidityWarningFunc: + * @ctx: usually an xmlValidCtxtPtr to a validity error context, + * but comes from ctxt->userData (which normally contains such + * a pointer); ctxt->userData can be changed by the user. + * @msg: the string to format *printf like vararg + * @...: remaining arguments to the format + * + * Callback called when a validity warning is found. This is a message + * oriented function similar to an *printf function. + */ +typedef void (XMLCDECL *xmlValidityWarningFunc) (void *ctx, + const char *msg, + ...) LIBXML_ATTR_FORMAT(2,3); + +#ifdef IN_LIBXML +/** + * XML_CTXT_FINISH_DTD_0: + * + * Special value for finishDtd field when embedded in an xmlParserCtxt + */ +#define XML_CTXT_FINISH_DTD_0 0xabcd1234 +/** + * XML_CTXT_FINISH_DTD_1: + * + * Special value for finishDtd field when embedded in an xmlParserCtxt + */ +#define XML_CTXT_FINISH_DTD_1 0xabcd1235 +#endif + +/* + * xmlValidCtxt: + * An xmlValidCtxt is used for error reporting when validating. + */ +typedef struct _xmlValidCtxt xmlValidCtxt; +typedef xmlValidCtxt *xmlValidCtxtPtr; +struct _xmlValidCtxt { + void *userData; /* user specific data block */ + xmlValidityErrorFunc error; /* the callback in case of errors */ + xmlValidityWarningFunc warning; /* the callback in case of warning */ + + /* Node analysis stack used when validating within entities */ + xmlNodePtr node; /* Current parsed Node */ + int nodeNr; /* Depth of the parsing stack */ + int nodeMax; /* Max depth of the parsing stack */ + xmlNodePtr *nodeTab; /* array of nodes */ + + unsigned int finishDtd; /* finished validating the Dtd ? */ + xmlDocPtr doc; /* the document */ + int valid; /* temporary validity check result */ + + /* state state used for non-determinist content validation */ + xmlValidState *vstate; /* current state */ + int vstateNr; /* Depth of the validation stack */ + int vstateMax; /* Max depth of the validation stack */ + xmlValidState *vstateTab; /* array of validation states */ + +#ifdef LIBXML_REGEXP_ENABLED + xmlAutomataPtr am; /* the automata */ + xmlAutomataStatePtr state; /* used to build the automata */ +#else + void *am; + void *state; +#endif +}; + +/* + * ALL notation declarations are stored in a table. + * There is one table per DTD. + */ + +typedef struct _xmlHashTable xmlNotationTable; +typedef xmlNotationTable *xmlNotationTablePtr; + +/* + * ALL element declarations are stored in a table. + * There is one table per DTD. + */ + +typedef struct _xmlHashTable xmlElementTable; +typedef xmlElementTable *xmlElementTablePtr; + +/* + * ALL attribute declarations are stored in a table. + * There is one table per DTD. + */ + +typedef struct _xmlHashTable xmlAttributeTable; +typedef xmlAttributeTable *xmlAttributeTablePtr; + +/* + * ALL IDs attributes are stored in a table. + * There is one table per document. + */ + +typedef struct _xmlHashTable xmlIDTable; +typedef xmlIDTable *xmlIDTablePtr; + +/* + * ALL Refs attributes are stored in a table. + * There is one table per document. + */ + +typedef struct _xmlHashTable xmlRefTable; +typedef xmlRefTable *xmlRefTablePtr; + +/* Notation */ +XMLPUBFUN xmlNotationPtr XMLCALL + xmlAddNotationDecl (xmlValidCtxtPtr ctxt, + xmlDtdPtr dtd, + const xmlChar *name, + const xmlChar *PublicID, + const xmlChar *SystemID); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN xmlNotationTablePtr XMLCALL + xmlCopyNotationTable (xmlNotationTablePtr table); +#endif /* LIBXML_TREE_ENABLED */ +XMLPUBFUN void XMLCALL + xmlFreeNotationTable (xmlNotationTablePtr table); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + xmlDumpNotationDecl (xmlBufferPtr buf, + xmlNotationPtr nota); +XMLPUBFUN void XMLCALL + xmlDumpNotationTable (xmlBufferPtr buf, + xmlNotationTablePtr table); +#endif /* LIBXML_OUTPUT_ENABLED */ + +/* Element Content */ +/* the non Doc version are being deprecated */ +XMLPUBFUN xmlElementContentPtr XMLCALL + xmlNewElementContent (const xmlChar *name, + xmlElementContentType type); +XMLPUBFUN xmlElementContentPtr XMLCALL + xmlCopyElementContent (xmlElementContentPtr content); +XMLPUBFUN void XMLCALL + xmlFreeElementContent (xmlElementContentPtr cur); +/* the new versions with doc argument */ +XMLPUBFUN xmlElementContentPtr XMLCALL + xmlNewDocElementContent (xmlDocPtr doc, + const xmlChar *name, + xmlElementContentType type); +XMLPUBFUN xmlElementContentPtr XMLCALL + xmlCopyDocElementContent(xmlDocPtr doc, + xmlElementContentPtr content); +XMLPUBFUN void XMLCALL + xmlFreeDocElementContent(xmlDocPtr doc, + xmlElementContentPtr cur); +XMLPUBFUN void XMLCALL + xmlSnprintfElementContent(char *buf, + int size, + xmlElementContentPtr content, + int englob); +#ifdef LIBXML_OUTPUT_ENABLED +/* DEPRECATED */ +XMLPUBFUN void XMLCALL + xmlSprintfElementContent(char *buf, + xmlElementContentPtr content, + int englob); +#endif /* LIBXML_OUTPUT_ENABLED */ +/* DEPRECATED */ + +/* Element */ +XMLPUBFUN xmlElementPtr XMLCALL + xmlAddElementDecl (xmlValidCtxtPtr ctxt, + xmlDtdPtr dtd, + const xmlChar *name, + xmlElementTypeVal type, + xmlElementContentPtr content); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN xmlElementTablePtr XMLCALL + xmlCopyElementTable (xmlElementTablePtr table); +#endif /* LIBXML_TREE_ENABLED */ +XMLPUBFUN void XMLCALL + xmlFreeElementTable (xmlElementTablePtr table); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + xmlDumpElementTable (xmlBufferPtr buf, + xmlElementTablePtr table); +XMLPUBFUN void XMLCALL + xmlDumpElementDecl (xmlBufferPtr buf, + xmlElementPtr elem); +#endif /* LIBXML_OUTPUT_ENABLED */ + +/* Enumeration */ +XMLPUBFUN xmlEnumerationPtr XMLCALL + xmlCreateEnumeration (const xmlChar *name); +XMLPUBFUN void XMLCALL + xmlFreeEnumeration (xmlEnumerationPtr cur); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN xmlEnumerationPtr XMLCALL + xmlCopyEnumeration (xmlEnumerationPtr cur); +#endif /* LIBXML_TREE_ENABLED */ + +/* Attribute */ +XMLPUBFUN xmlAttributePtr XMLCALL + xmlAddAttributeDecl (xmlValidCtxtPtr ctxt, + xmlDtdPtr dtd, + const xmlChar *elem, + const xmlChar *name, + const xmlChar *ns, + xmlAttributeType type, + xmlAttributeDefault def, + const xmlChar *defaultValue, + xmlEnumerationPtr tree); +#ifdef LIBXML_TREE_ENABLED +XMLPUBFUN xmlAttributeTablePtr XMLCALL + xmlCopyAttributeTable (xmlAttributeTablePtr table); +#endif /* LIBXML_TREE_ENABLED */ +XMLPUBFUN void XMLCALL + xmlFreeAttributeTable (xmlAttributeTablePtr table); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + xmlDumpAttributeTable (xmlBufferPtr buf, + xmlAttributeTablePtr table); +XMLPUBFUN void XMLCALL + xmlDumpAttributeDecl (xmlBufferPtr buf, + xmlAttributePtr attr); +#endif /* LIBXML_OUTPUT_ENABLED */ + +/* IDs */ +XMLPUBFUN xmlIDPtr XMLCALL + xmlAddID (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + const xmlChar *value, + xmlAttrPtr attr); +XMLPUBFUN void XMLCALL + xmlFreeIDTable (xmlIDTablePtr table); +XMLPUBFUN xmlAttrPtr XMLCALL + xmlGetID (xmlDocPtr doc, + const xmlChar *ID); +XMLPUBFUN int XMLCALL + xmlIsID (xmlDocPtr doc, + xmlNodePtr elem, + xmlAttrPtr attr); +XMLPUBFUN int XMLCALL + xmlRemoveID (xmlDocPtr doc, + xmlAttrPtr attr); + +/* IDREFs */ +XMLPUBFUN xmlRefPtr XMLCALL + xmlAddRef (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + const xmlChar *value, + xmlAttrPtr attr); +XMLPUBFUN void XMLCALL + xmlFreeRefTable (xmlRefTablePtr table); +XMLPUBFUN int XMLCALL + xmlIsRef (xmlDocPtr doc, + xmlNodePtr elem, + xmlAttrPtr attr); +XMLPUBFUN int XMLCALL + xmlRemoveRef (xmlDocPtr doc, + xmlAttrPtr attr); +XMLPUBFUN xmlListPtr XMLCALL + xmlGetRefs (xmlDocPtr doc, + const xmlChar *ID); + +/** + * The public function calls related to validity checking. + */ +#ifdef LIBXML_VALID_ENABLED +/* Allocate/Release Validation Contexts */ +XMLPUBFUN xmlValidCtxtPtr XMLCALL + xmlNewValidCtxt(void); +XMLPUBFUN void XMLCALL + xmlFreeValidCtxt(xmlValidCtxtPtr); + +XMLPUBFUN int XMLCALL + xmlValidateRoot (xmlValidCtxtPtr ctxt, + xmlDocPtr doc); +XMLPUBFUN int XMLCALL + xmlValidateElementDecl (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlElementPtr elem); +XMLPUBFUN xmlChar * XMLCALL + xmlValidNormalizeAttributeValue(xmlDocPtr doc, + xmlNodePtr elem, + const xmlChar *name, + const xmlChar *value); +XMLPUBFUN xmlChar * XMLCALL + xmlValidCtxtNormalizeAttributeValue(xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem, + const xmlChar *name, + const xmlChar *value); +XMLPUBFUN int XMLCALL + xmlValidateAttributeDecl(xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlAttributePtr attr); +XMLPUBFUN int XMLCALL + xmlValidateAttributeValue(xmlAttributeType type, + const xmlChar *value); +XMLPUBFUN int XMLCALL + xmlValidateNotationDecl (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNotationPtr nota); +XMLPUBFUN int XMLCALL + xmlValidateDtd (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlDtdPtr dtd); +XMLPUBFUN int XMLCALL + xmlValidateDtdFinal (xmlValidCtxtPtr ctxt, + xmlDocPtr doc); +XMLPUBFUN int XMLCALL + xmlValidateDocument (xmlValidCtxtPtr ctxt, + xmlDocPtr doc); +XMLPUBFUN int XMLCALL + xmlValidateElement (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem); +XMLPUBFUN int XMLCALL + xmlValidateOneElement (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem); +XMLPUBFUN int XMLCALL + xmlValidateOneAttribute (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem, + xmlAttrPtr attr, + const xmlChar *value); +XMLPUBFUN int XMLCALL + xmlValidateOneNamespace (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem, + const xmlChar *prefix, + xmlNsPtr ns, + const xmlChar *value); +XMLPUBFUN int XMLCALL + xmlValidateDocumentFinal(xmlValidCtxtPtr ctxt, + xmlDocPtr doc); +#endif /* LIBXML_VALID_ENABLED */ + +#if defined(LIBXML_VALID_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +XMLPUBFUN int XMLCALL + xmlValidateNotationUse (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + const xmlChar *notationName); +#endif /* LIBXML_VALID_ENABLED or LIBXML_SCHEMAS_ENABLED */ + +XMLPUBFUN int XMLCALL + xmlIsMixedElement (xmlDocPtr doc, + const xmlChar *name); +XMLPUBFUN xmlAttributePtr XMLCALL + xmlGetDtdAttrDesc (xmlDtdPtr dtd, + const xmlChar *elem, + const xmlChar *name); +XMLPUBFUN xmlAttributePtr XMLCALL + xmlGetDtdQAttrDesc (xmlDtdPtr dtd, + const xmlChar *elem, + const xmlChar *name, + const xmlChar *prefix); +XMLPUBFUN xmlNotationPtr XMLCALL + xmlGetDtdNotationDesc (xmlDtdPtr dtd, + const xmlChar *name); +XMLPUBFUN xmlElementPtr XMLCALL + xmlGetDtdQElementDesc (xmlDtdPtr dtd, + const xmlChar *name, + const xmlChar *prefix); +XMLPUBFUN xmlElementPtr XMLCALL + xmlGetDtdElementDesc (xmlDtdPtr dtd, + const xmlChar *name); + +#ifdef LIBXML_VALID_ENABLED + +XMLPUBFUN int XMLCALL + xmlValidGetPotentialChildren(xmlElementContent *ctree, + const xmlChar **names, + int *len, + int max); + +XMLPUBFUN int XMLCALL + xmlValidGetValidElements(xmlNode *prev, + xmlNode *next, + const xmlChar **names, + int max); +XMLPUBFUN int XMLCALL + xmlValidateNameValue (const xmlChar *value); +XMLPUBFUN int XMLCALL + xmlValidateNamesValue (const xmlChar *value); +XMLPUBFUN int XMLCALL + xmlValidateNmtokenValue (const xmlChar *value); +XMLPUBFUN int XMLCALL + xmlValidateNmtokensValue(const xmlChar *value); + +#ifdef LIBXML_REGEXP_ENABLED +/* + * Validation based on the regexp support + */ +XMLPUBFUN int XMLCALL + xmlValidBuildContentModel(xmlValidCtxtPtr ctxt, + xmlElementPtr elem); + +XMLPUBFUN int XMLCALL + xmlValidatePushElement (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem, + const xmlChar *qname); +XMLPUBFUN int XMLCALL + xmlValidatePushCData (xmlValidCtxtPtr ctxt, + const xmlChar *data, + int len); +XMLPUBFUN int XMLCALL + xmlValidatePopElement (xmlValidCtxtPtr ctxt, + xmlDocPtr doc, + xmlNodePtr elem, + const xmlChar *qname); +#endif /* LIBXML_REGEXP_ENABLED */ +#endif /* LIBXML_VALID_ENABLED */ +#ifdef __cplusplus +} +#endif +#endif /* __XML_VALID_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xinclude.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xinclude.h new file mode 100644 index 000000000000..863ab25ad9fe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xinclude.h @@ -0,0 +1,129 @@ +/* + * Summary: implementation of XInclude + * Description: API to handle XInclude processing, + * implements the + * World Wide Web Consortium Last Call Working Draft 10 November 2003 + * http://www.w3.org/TR/2003/WD-xinclude-20031110 + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XINCLUDE_H__ +#define __XML_XINCLUDE_H__ + +#include <libxml/xmlversion.h> +#include <libxml/tree.h> + +#ifdef LIBXML_XINCLUDE_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * XINCLUDE_NS: + * + * Macro defining the Xinclude namespace: http://www.w3.org/2003/XInclude + */ +#define XINCLUDE_NS (const xmlChar *) "http://www.w3.org/2003/XInclude" +/** + * XINCLUDE_OLD_NS: + * + * Macro defining the draft Xinclude namespace: http://www.w3.org/2001/XInclude + */ +#define XINCLUDE_OLD_NS (const xmlChar *) "http://www.w3.org/2001/XInclude" +/** + * XINCLUDE_NODE: + * + * Macro defining "include" + */ +#define XINCLUDE_NODE (const xmlChar *) "include" +/** + * XINCLUDE_FALLBACK: + * + * Macro defining "fallback" + */ +#define XINCLUDE_FALLBACK (const xmlChar *) "fallback" +/** + * XINCLUDE_HREF: + * + * Macro defining "href" + */ +#define XINCLUDE_HREF (const xmlChar *) "href" +/** + * XINCLUDE_PARSE: + * + * Macro defining "parse" + */ +#define XINCLUDE_PARSE (const xmlChar *) "parse" +/** + * XINCLUDE_PARSE_XML: + * + * Macro defining "xml" + */ +#define XINCLUDE_PARSE_XML (const xmlChar *) "xml" +/** + * XINCLUDE_PARSE_TEXT: + * + * Macro defining "text" + */ +#define XINCLUDE_PARSE_TEXT (const xmlChar *) "text" +/** + * XINCLUDE_PARSE_ENCODING: + * + * Macro defining "encoding" + */ +#define XINCLUDE_PARSE_ENCODING (const xmlChar *) "encoding" +/** + * XINCLUDE_PARSE_XPOINTER: + * + * Macro defining "xpointer" + */ +#define XINCLUDE_PARSE_XPOINTER (const xmlChar *) "xpointer" + +typedef struct _xmlXIncludeCtxt xmlXIncludeCtxt; +typedef xmlXIncludeCtxt *xmlXIncludeCtxtPtr; + +/* + * standalone processing + */ +XMLPUBFUN int XMLCALL + xmlXIncludeProcess (xmlDocPtr doc); +XMLPUBFUN int XMLCALL + xmlXIncludeProcessFlags (xmlDocPtr doc, + int flags); +XMLPUBFUN int XMLCALL + xmlXIncludeProcessFlagsData(xmlDocPtr doc, + int flags, + void *data); +XMLPUBFUN int XMLCALL + xmlXIncludeProcessTreeFlagsData(xmlNodePtr tree, + int flags, + void *data); +XMLPUBFUN int XMLCALL + xmlXIncludeProcessTree (xmlNodePtr tree); +XMLPUBFUN int XMLCALL + xmlXIncludeProcessTreeFlags(xmlNodePtr tree, + int flags); +/* + * contextual processing + */ +XMLPUBFUN xmlXIncludeCtxtPtr XMLCALL + xmlXIncludeNewContext (xmlDocPtr doc); +XMLPUBFUN int XMLCALL + xmlXIncludeSetFlags (xmlXIncludeCtxtPtr ctxt, + int flags); +XMLPUBFUN void XMLCALL + xmlXIncludeFreeContext (xmlXIncludeCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlXIncludeProcessNode (xmlXIncludeCtxtPtr ctxt, + xmlNodePtr tree); +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_XINCLUDE_ENABLED */ + +#endif /* __XML_XINCLUDE_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xlink.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xlink.h new file mode 100644 index 000000000000..04e4b32c015f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xlink.h @@ -0,0 +1,189 @@ +/* + * Summary: unfinished XLink detection module + * Description: unfinished XLink detection module + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XLINK_H__ +#define __XML_XLINK_H__ + +#include <libxml/xmlversion.h> +#include <libxml/tree.h> + +#ifdef LIBXML_XPTR_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Various defines for the various Link properties. + * + * NOTE: the link detection layer will try to resolve QName expansion + * of namespaces. If "foo" is the prefix for "http://foo.com/" + * then the link detection layer will expand role="foo:myrole" + * to "http://foo.com/:myrole". + * NOTE: the link detection layer will expand URI-References found on + * href attributes by using the base mechanism if found. + */ +typedef xmlChar *xlinkHRef; +typedef xmlChar *xlinkRole; +typedef xmlChar *xlinkTitle; + +typedef enum { + XLINK_TYPE_NONE = 0, + XLINK_TYPE_SIMPLE, + XLINK_TYPE_EXTENDED, + XLINK_TYPE_EXTENDED_SET +} xlinkType; + +typedef enum { + XLINK_SHOW_NONE = 0, + XLINK_SHOW_NEW, + XLINK_SHOW_EMBED, + XLINK_SHOW_REPLACE +} xlinkShow; + +typedef enum { + XLINK_ACTUATE_NONE = 0, + XLINK_ACTUATE_AUTO, + XLINK_ACTUATE_ONREQUEST +} xlinkActuate; + +/** + * xlinkNodeDetectFunc: + * @ctx: user data pointer + * @node: the node to check + * + * This is the prototype for the link detection routine. + * It calls the default link detection callbacks upon link detection. + */ +typedef void (*xlinkNodeDetectFunc) (void *ctx, xmlNodePtr node); + +/* + * The link detection module interact with the upper layers using + * a set of callback registered at parsing time. + */ + +/** + * xlinkSimpleLinkFunk: + * @ctx: user data pointer + * @node: the node carrying the link + * @href: the target of the link + * @role: the role string + * @title: the link title + * + * This is the prototype for a simple link detection callback. + */ +typedef void +(*xlinkSimpleLinkFunk) (void *ctx, + xmlNodePtr node, + const xlinkHRef href, + const xlinkRole role, + const xlinkTitle title); + +/** + * xlinkExtendedLinkFunk: + * @ctx: user data pointer + * @node: the node carrying the link + * @nbLocators: the number of locators detected on the link + * @hrefs: pointer to the array of locator hrefs + * @roles: pointer to the array of locator roles + * @nbArcs: the number of arcs detected on the link + * @from: pointer to the array of source roles found on the arcs + * @to: pointer to the array of target roles found on the arcs + * @show: array of values for the show attributes found on the arcs + * @actuate: array of values for the actuate attributes found on the arcs + * @nbTitles: the number of titles detected on the link + * @title: array of titles detected on the link + * @langs: array of xml:lang values for the titles + * + * This is the prototype for a extended link detection callback. + */ +typedef void +(*xlinkExtendedLinkFunk)(void *ctx, + xmlNodePtr node, + int nbLocators, + const xlinkHRef *hrefs, + const xlinkRole *roles, + int nbArcs, + const xlinkRole *from, + const xlinkRole *to, + xlinkShow *show, + xlinkActuate *actuate, + int nbTitles, + const xlinkTitle *titles, + const xmlChar **langs); + +/** + * xlinkExtendedLinkSetFunk: + * @ctx: user data pointer + * @node: the node carrying the link + * @nbLocators: the number of locators detected on the link + * @hrefs: pointer to the array of locator hrefs + * @roles: pointer to the array of locator roles + * @nbTitles: the number of titles detected on the link + * @title: array of titles detected on the link + * @langs: array of xml:lang values for the titles + * + * This is the prototype for a extended link set detection callback. + */ +typedef void +(*xlinkExtendedLinkSetFunk) (void *ctx, + xmlNodePtr node, + int nbLocators, + const xlinkHRef *hrefs, + const xlinkRole *roles, + int nbTitles, + const xlinkTitle *titles, + const xmlChar **langs); + +/** + * This is the structure containing a set of Links detection callbacks. + * + * There is no default xlink callbacks, if one want to get link + * recognition activated, those call backs must be provided before parsing. + */ +typedef struct _xlinkHandler xlinkHandler; +typedef xlinkHandler *xlinkHandlerPtr; +struct _xlinkHandler { + xlinkSimpleLinkFunk simple; + xlinkExtendedLinkFunk extended; + xlinkExtendedLinkSetFunk set; +}; + +/* + * The default detection routine, can be overridden, they call the default + * detection callbacks. + */ + +XMLPUBFUN xlinkNodeDetectFunc XMLCALL + xlinkGetDefaultDetect (void); +XMLPUBFUN void XMLCALL + xlinkSetDefaultDetect (xlinkNodeDetectFunc func); + +/* + * Routines to set/get the default handlers. + */ +XMLPUBFUN xlinkHandlerPtr XMLCALL + xlinkGetDefaultHandler (void); +XMLPUBFUN void XMLCALL + xlinkSetDefaultHandler (xlinkHandlerPtr handler); + +/* + * Link detection module itself. + */ +XMLPUBFUN xlinkType XMLCALL + xlinkIsLink (xmlDocPtr doc, + xmlNodePtr node); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_XPTR_ENABLED */ + +#endif /* __XML_XLINK_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlIO.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlIO.h new file mode 100644 index 000000000000..095b2f56d96c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlIO.h @@ -0,0 +1,368 @@ +/* + * Summary: interface for the I/O interfaces used by the parser + * Description: interface for the I/O interfaces used by the parser + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_IO_H__ +#define __XML_IO_H__ + +#include <stdio.h> +#include <libxml/xmlversion.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Those are the functions and datatypes for the parser input + * I/O structures. + */ + +/** + * xmlInputMatchCallback: + * @filename: the filename or URI + * + * Callback used in the I/O Input API to detect if the current handler + * can provide input functionality for this resource. + * + * Returns 1 if yes and 0 if another Input module should be used + */ +typedef int (XMLCALL *xmlInputMatchCallback) (char const *filename); +/** + * xmlInputOpenCallback: + * @filename: the filename or URI + * + * Callback used in the I/O Input API to open the resource + * + * Returns an Input context or NULL in case or error + */ +typedef void * (XMLCALL *xmlInputOpenCallback) (char const *filename); +/** + * xmlInputReadCallback: + * @context: an Input context + * @buffer: the buffer to store data read + * @len: the length of the buffer in bytes + * + * Callback used in the I/O Input API to read the resource + * + * Returns the number of bytes read or -1 in case of error + */ +typedef int (XMLCALL *xmlInputReadCallback) (void * context, char * buffer, int len); +/** + * xmlInputCloseCallback: + * @context: an Input context + * + * Callback used in the I/O Input API to close the resource + * + * Returns 0 or -1 in case of error + */ +typedef int (XMLCALL *xmlInputCloseCallback) (void * context); + +#ifdef LIBXML_OUTPUT_ENABLED +/* + * Those are the functions and datatypes for the library output + * I/O structures. + */ + +/** + * xmlOutputMatchCallback: + * @filename: the filename or URI + * + * Callback used in the I/O Output API to detect if the current handler + * can provide output functionality for this resource. + * + * Returns 1 if yes and 0 if another Output module should be used + */ +typedef int (XMLCALL *xmlOutputMatchCallback) (char const *filename); +/** + * xmlOutputOpenCallback: + * @filename: the filename or URI + * + * Callback used in the I/O Output API to open the resource + * + * Returns an Output context or NULL in case or error + */ +typedef void * (XMLCALL *xmlOutputOpenCallback) (char const *filename); +/** + * xmlOutputWriteCallback: + * @context: an Output context + * @buffer: the buffer of data to write + * @len: the length of the buffer in bytes + * + * Callback used in the I/O Output API to write to the resource + * + * Returns the number of bytes written or -1 in case of error + */ +typedef int (XMLCALL *xmlOutputWriteCallback) (void * context, const char * buffer, + int len); +/** + * xmlOutputCloseCallback: + * @context: an Output context + * + * Callback used in the I/O Output API to close the resource + * + * Returns 0 or -1 in case of error + */ +typedef int (XMLCALL *xmlOutputCloseCallback) (void * context); +#endif /* LIBXML_OUTPUT_ENABLED */ + +#ifdef __cplusplus +} +#endif + +#include <libxml/globals.h> +#include <libxml/tree.h> +#include <libxml/parser.h> +#include <libxml/encoding.h> + +#ifdef __cplusplus +extern "C" { +#endif +struct _xmlParserInputBuffer { + void* context; + xmlInputReadCallback readcallback; + xmlInputCloseCallback closecallback; + + xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */ + + xmlBufPtr buffer; /* Local buffer encoded in UTF-8 */ + xmlBufPtr raw; /* if encoder != NULL buffer for raw input */ + int compressed; /* -1=unknown, 0=not compressed, 1=compressed */ + int error; + unsigned long rawconsumed;/* amount consumed from raw */ +}; + + +#ifdef LIBXML_OUTPUT_ENABLED +struct _xmlOutputBuffer { + void* context; + xmlOutputWriteCallback writecallback; + xmlOutputCloseCallback closecallback; + + xmlCharEncodingHandlerPtr encoder; /* I18N conversions to UTF-8 */ + + xmlBufPtr buffer; /* Local buffer encoded in UTF-8 or ISOLatin */ + xmlBufPtr conv; /* if encoder != NULL buffer for output */ + int written; /* total number of byte written */ + int error; +}; +#endif /* LIBXML_OUTPUT_ENABLED */ + +/* + * Interfaces for input + */ +XMLPUBFUN void XMLCALL + xmlCleanupInputCallbacks (void); + +XMLPUBFUN int XMLCALL + xmlPopInputCallbacks (void); + +XMLPUBFUN void XMLCALL + xmlRegisterDefaultInputCallbacks (void); +XMLPUBFUN xmlParserInputBufferPtr XMLCALL + xmlAllocParserInputBuffer (xmlCharEncoding enc); + +XMLPUBFUN xmlParserInputBufferPtr XMLCALL + xmlParserInputBufferCreateFilename (const char *URI, + xmlCharEncoding enc); +XMLPUBFUN xmlParserInputBufferPtr XMLCALL + xmlParserInputBufferCreateFile (FILE *file, + xmlCharEncoding enc); +XMLPUBFUN xmlParserInputBufferPtr XMLCALL + xmlParserInputBufferCreateFd (int fd, + xmlCharEncoding enc); +XMLPUBFUN xmlParserInputBufferPtr XMLCALL + xmlParserInputBufferCreateMem (const char *mem, int size, + xmlCharEncoding enc); +XMLPUBFUN xmlParserInputBufferPtr XMLCALL + xmlParserInputBufferCreateStatic (const char *mem, int size, + xmlCharEncoding enc); +XMLPUBFUN xmlParserInputBufferPtr XMLCALL + xmlParserInputBufferCreateIO (xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, + void *ioctx, + xmlCharEncoding enc); +XMLPUBFUN int XMLCALL + xmlParserInputBufferRead (xmlParserInputBufferPtr in, + int len); +XMLPUBFUN int XMLCALL + xmlParserInputBufferGrow (xmlParserInputBufferPtr in, + int len); +XMLPUBFUN int XMLCALL + xmlParserInputBufferPush (xmlParserInputBufferPtr in, + int len, + const char *buf); +XMLPUBFUN void XMLCALL + xmlFreeParserInputBuffer (xmlParserInputBufferPtr in); +XMLPUBFUN char * XMLCALL + xmlParserGetDirectory (const char *filename); + +XMLPUBFUN int XMLCALL + xmlRegisterInputCallbacks (xmlInputMatchCallback matchFunc, + xmlInputOpenCallback openFunc, + xmlInputReadCallback readFunc, + xmlInputCloseCallback closeFunc); + +xmlParserInputBufferPtr + __xmlParserInputBufferCreateFilename(const char *URI, + xmlCharEncoding enc); + +#ifdef LIBXML_OUTPUT_ENABLED +/* + * Interfaces for output + */ +XMLPUBFUN void XMLCALL + xmlCleanupOutputCallbacks (void); +XMLPUBFUN int XMLCALL + xmlPopOutputCallbacks (void); +XMLPUBFUN void XMLCALL + xmlRegisterDefaultOutputCallbacks(void); +XMLPUBFUN xmlOutputBufferPtr XMLCALL + xmlAllocOutputBuffer (xmlCharEncodingHandlerPtr encoder); + +XMLPUBFUN xmlOutputBufferPtr XMLCALL + xmlOutputBufferCreateFilename (const char *URI, + xmlCharEncodingHandlerPtr encoder, + int compression); + +XMLPUBFUN xmlOutputBufferPtr XMLCALL + xmlOutputBufferCreateFile (FILE *file, + xmlCharEncodingHandlerPtr encoder); + +XMLPUBFUN xmlOutputBufferPtr XMLCALL + xmlOutputBufferCreateBuffer (xmlBufferPtr buffer, + xmlCharEncodingHandlerPtr encoder); + +XMLPUBFUN xmlOutputBufferPtr XMLCALL + xmlOutputBufferCreateFd (int fd, + xmlCharEncodingHandlerPtr encoder); + +XMLPUBFUN xmlOutputBufferPtr XMLCALL + xmlOutputBufferCreateIO (xmlOutputWriteCallback iowrite, + xmlOutputCloseCallback ioclose, + void *ioctx, + xmlCharEncodingHandlerPtr encoder); + +/* Couple of APIs to get the output without digging into the buffers */ +XMLPUBFUN const xmlChar * XMLCALL + xmlOutputBufferGetContent (xmlOutputBufferPtr out); +XMLPUBFUN size_t XMLCALL + xmlOutputBufferGetSize (xmlOutputBufferPtr out); + +XMLPUBFUN int XMLCALL + xmlOutputBufferWrite (xmlOutputBufferPtr out, + int len, + const char *buf); +XMLPUBFUN int XMLCALL + xmlOutputBufferWriteString (xmlOutputBufferPtr out, + const char *str); +XMLPUBFUN int XMLCALL + xmlOutputBufferWriteEscape (xmlOutputBufferPtr out, + const xmlChar *str, + xmlCharEncodingOutputFunc escaping); + +XMLPUBFUN int XMLCALL + xmlOutputBufferFlush (xmlOutputBufferPtr out); +XMLPUBFUN int XMLCALL + xmlOutputBufferClose (xmlOutputBufferPtr out); + +XMLPUBFUN int XMLCALL + xmlRegisterOutputCallbacks (xmlOutputMatchCallback matchFunc, + xmlOutputOpenCallback openFunc, + xmlOutputWriteCallback writeFunc, + xmlOutputCloseCallback closeFunc); + +xmlOutputBufferPtr + __xmlOutputBufferCreateFilename(const char *URI, + xmlCharEncodingHandlerPtr encoder, + int compression); + +#ifdef LIBXML_HTTP_ENABLED +/* This function only exists if HTTP support built into the library */ +XMLPUBFUN void XMLCALL + xmlRegisterHTTPPostCallbacks (void ); +#endif /* LIBXML_HTTP_ENABLED */ + +#endif /* LIBXML_OUTPUT_ENABLED */ + +XMLPUBFUN xmlParserInputPtr XMLCALL + xmlCheckHTTPInput (xmlParserCtxtPtr ctxt, + xmlParserInputPtr ret); + +/* + * A predefined entity loader disabling network accesses + */ +XMLPUBFUN xmlParserInputPtr XMLCALL + xmlNoNetExternalEntityLoader (const char *URL, + const char *ID, + xmlParserCtxtPtr ctxt); + +/* + * xmlNormalizeWindowsPath is obsolete, don't use it. + * Check xmlCanonicPath in uri.h for a better alternative. + */ +XMLPUBFUN xmlChar * XMLCALL + xmlNormalizeWindowsPath (const xmlChar *path); + +XMLPUBFUN int XMLCALL + xmlCheckFilename (const char *path); +/** + * Default 'file://' protocol callbacks + */ +XMLPUBFUN int XMLCALL + xmlFileMatch (const char *filename); +XMLPUBFUN void * XMLCALL + xmlFileOpen (const char *filename); +XMLPUBFUN int XMLCALL + xmlFileRead (void * context, + char * buffer, + int len); +XMLPUBFUN int XMLCALL + xmlFileClose (void * context); + +/** + * Default 'http://' protocol callbacks + */ +#ifdef LIBXML_HTTP_ENABLED +XMLPUBFUN int XMLCALL + xmlIOHTTPMatch (const char *filename); +XMLPUBFUN void * XMLCALL + xmlIOHTTPOpen (const char *filename); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void * XMLCALL + xmlIOHTTPOpenW (const char * post_uri, + int compression ); +#endif /* LIBXML_OUTPUT_ENABLED */ +XMLPUBFUN int XMLCALL + xmlIOHTTPRead (void * context, + char * buffer, + int len); +XMLPUBFUN int XMLCALL + xmlIOHTTPClose (void * context); +#endif /* LIBXML_HTTP_ENABLED */ + +/** + * Default 'ftp://' protocol callbacks + */ +#ifdef LIBXML_FTP_ENABLED +XMLPUBFUN int XMLCALL + xmlIOFTPMatch (const char *filename); +XMLPUBFUN void * XMLCALL + xmlIOFTPOpen (const char *filename); +XMLPUBFUN int XMLCALL + xmlIOFTPRead (void * context, + char * buffer, + int len); +XMLPUBFUN int XMLCALL + xmlIOFTPClose (void * context); +#endif /* LIBXML_FTP_ENABLED */ + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_IO_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlautomata.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlautomata.h new file mode 100644 index 000000000000..bf1b131c6534 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlautomata.h @@ -0,0 +1,146 @@ +/* + * Summary: API to build regexp automata + * Description: the API to build regexp automata + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_AUTOMATA_H__ +#define __XML_AUTOMATA_H__ + +#include <libxml/xmlversion.h> +#include <libxml/tree.h> + +#ifdef LIBXML_REGEXP_ENABLED +#ifdef LIBXML_AUTOMATA_ENABLED +#include <libxml/xmlregexp.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlAutomataPtr: + * + * A libxml automata description, It can be compiled into a regexp + */ +typedef struct _xmlAutomata xmlAutomata; +typedef xmlAutomata *xmlAutomataPtr; + +/** + * xmlAutomataStatePtr: + * + * A state int the automata description, + */ +typedef struct _xmlAutomataState xmlAutomataState; +typedef xmlAutomataState *xmlAutomataStatePtr; + +/* + * Building API + */ +XMLPUBFUN xmlAutomataPtr XMLCALL + xmlNewAutomata (void); +XMLPUBFUN void XMLCALL + xmlFreeAutomata (xmlAutomataPtr am); + +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataGetInitState (xmlAutomataPtr am); +XMLPUBFUN int XMLCALL + xmlAutomataSetFinalState (xmlAutomataPtr am, + xmlAutomataStatePtr state); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewState (xmlAutomataPtr am); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewTransition (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + const xmlChar *token, + void *data); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewTransition2 (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + const xmlChar *token, + const xmlChar *token2, + void *data); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewNegTrans (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + const xmlChar *token, + const xmlChar *token2, + void *data); + +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewCountTrans (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + const xmlChar *token, + int min, + int max, + void *data); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewCountTrans2 (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + const xmlChar *token, + const xmlChar *token2, + int min, + int max, + void *data); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewOnceTrans (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + const xmlChar *token, + int min, + int max, + void *data); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewOnceTrans2 (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + const xmlChar *token, + const xmlChar *token2, + int min, + int max, + void *data); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewAllTrans (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + int lax); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewEpsilon (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewCountedTrans (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + int counter); +XMLPUBFUN xmlAutomataStatePtr XMLCALL + xmlAutomataNewCounterTrans (xmlAutomataPtr am, + xmlAutomataStatePtr from, + xmlAutomataStatePtr to, + int counter); +XMLPUBFUN int XMLCALL + xmlAutomataNewCounter (xmlAutomataPtr am, + int min, + int max); + +XMLPUBFUN xmlRegexpPtr XMLCALL + xmlAutomataCompile (xmlAutomataPtr am); +XMLPUBFUN int XMLCALL + xmlAutomataIsDeterminist (xmlAutomataPtr am); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_AUTOMATA_ENABLED */ +#endif /* LIBXML_REGEXP_ENABLED */ + +#endif /* __XML_AUTOMATA_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlerror.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlerror.h new file mode 100644 index 000000000000..c1019971f247 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlerror.h @@ -0,0 +1,945 @@ +/* + * Summary: error handling + * Description: the API used to report errors + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#include <libxml/parser.h> + +#ifndef __XML_ERROR_H__ +#define __XML_ERROR_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlErrorLevel: + * + * Indicates the level of an error + */ +typedef enum { + XML_ERR_NONE = 0, + XML_ERR_WARNING = 1, /* A simple warning */ + XML_ERR_ERROR = 2, /* A recoverable error */ + XML_ERR_FATAL = 3 /* A fatal error */ +} xmlErrorLevel; + +/** + * xmlErrorDomain: + * + * Indicates where an error may have come from + */ +typedef enum { + XML_FROM_NONE = 0, + XML_FROM_PARSER, /* The XML parser */ + XML_FROM_TREE, /* The tree module */ + XML_FROM_NAMESPACE, /* The XML Namespace module */ + XML_FROM_DTD, /* The XML DTD validation with parser context*/ + XML_FROM_HTML, /* The HTML parser */ + XML_FROM_MEMORY, /* The memory allocator */ + XML_FROM_OUTPUT, /* The serialization code */ + XML_FROM_IO, /* The Input/Output stack */ + XML_FROM_FTP, /* The FTP module */ + XML_FROM_HTTP, /* The HTTP module */ + XML_FROM_XINCLUDE, /* The XInclude processing */ + XML_FROM_XPATH, /* The XPath module */ + XML_FROM_XPOINTER, /* The XPointer module */ + XML_FROM_REGEXP, /* The regular expressions module */ + XML_FROM_DATATYPE, /* The W3C XML Schemas Datatype module */ + XML_FROM_SCHEMASP, /* The W3C XML Schemas parser module */ + XML_FROM_SCHEMASV, /* The W3C XML Schemas validation module */ + XML_FROM_RELAXNGP, /* The Relax-NG parser module */ + XML_FROM_RELAXNGV, /* The Relax-NG validator module */ + XML_FROM_CATALOG, /* The Catalog module */ + XML_FROM_C14N, /* The Canonicalization module */ + XML_FROM_XSLT, /* The XSLT engine from libxslt */ + XML_FROM_VALID, /* The XML DTD validation with valid context */ + XML_FROM_CHECK, /* The error checking module */ + XML_FROM_WRITER, /* The xmlwriter module */ + XML_FROM_MODULE, /* The dynamically loaded module module*/ + XML_FROM_I18N, /* The module handling character conversion */ + XML_FROM_SCHEMATRONV,/* The Schematron validator module */ + XML_FROM_BUFFER, /* The buffers module */ + XML_FROM_URI /* The URI module */ +} xmlErrorDomain; + +/** + * xmlError: + * + * An XML Error instance. + */ + +typedef struct _xmlError xmlError; +typedef xmlError *xmlErrorPtr; +struct _xmlError { + int domain; /* What part of the library raised this error */ + int code; /* The error code, e.g. an xmlParserError */ + char *message;/* human-readable informative error message */ + xmlErrorLevel level;/* how consequent is the error */ + char *file; /* the filename */ + int line; /* the line number if available */ + char *str1; /* extra string information */ + char *str2; /* extra string information */ + char *str3; /* extra string information */ + int int1; /* extra number information */ + int int2; /* error column # or 0 if N/A (todo: rename field when we would brk ABI) */ + void *ctxt; /* the parser context if available */ + void *node; /* the node in the tree */ +}; + +/** + * xmlParserError: + * + * This is an error that the XML (or HTML) parser can generate + */ +typedef enum { + XML_ERR_OK = 0, + XML_ERR_INTERNAL_ERROR, /* 1 */ + XML_ERR_NO_MEMORY, /* 2 */ + XML_ERR_DOCUMENT_START, /* 3 */ + XML_ERR_DOCUMENT_EMPTY, /* 4 */ + XML_ERR_DOCUMENT_END, /* 5 */ + XML_ERR_INVALID_HEX_CHARREF, /* 6 */ + XML_ERR_INVALID_DEC_CHARREF, /* 7 */ + XML_ERR_INVALID_CHARREF, /* 8 */ + XML_ERR_INVALID_CHAR, /* 9 */ + XML_ERR_CHARREF_AT_EOF, /* 10 */ + XML_ERR_CHARREF_IN_PROLOG, /* 11 */ + XML_ERR_CHARREF_IN_EPILOG, /* 12 */ + XML_ERR_CHARREF_IN_DTD, /* 13 */ + XML_ERR_ENTITYREF_AT_EOF, /* 14 */ + XML_ERR_ENTITYREF_IN_PROLOG, /* 15 */ + XML_ERR_ENTITYREF_IN_EPILOG, /* 16 */ + XML_ERR_ENTITYREF_IN_DTD, /* 17 */ + XML_ERR_PEREF_AT_EOF, /* 18 */ + XML_ERR_PEREF_IN_PROLOG, /* 19 */ + XML_ERR_PEREF_IN_EPILOG, /* 20 */ + XML_ERR_PEREF_IN_INT_SUBSET, /* 21 */ + XML_ERR_ENTITYREF_NO_NAME, /* 22 */ + XML_ERR_ENTITYREF_SEMICOL_MISSING, /* 23 */ + XML_ERR_PEREF_NO_NAME, /* 24 */ + XML_ERR_PEREF_SEMICOL_MISSING, /* 25 */ + XML_ERR_UNDECLARED_ENTITY, /* 26 */ + XML_WAR_UNDECLARED_ENTITY, /* 27 */ + XML_ERR_UNPARSED_ENTITY, /* 28 */ + XML_ERR_ENTITY_IS_EXTERNAL, /* 29 */ + XML_ERR_ENTITY_IS_PARAMETER, /* 30 */ + XML_ERR_UNKNOWN_ENCODING, /* 31 */ + XML_ERR_UNSUPPORTED_ENCODING, /* 32 */ + XML_ERR_STRING_NOT_STARTED, /* 33 */ + XML_ERR_STRING_NOT_CLOSED, /* 34 */ + XML_ERR_NS_DECL_ERROR, /* 35 */ + XML_ERR_ENTITY_NOT_STARTED, /* 36 */ + XML_ERR_ENTITY_NOT_FINISHED, /* 37 */ + XML_ERR_LT_IN_ATTRIBUTE, /* 38 */ + XML_ERR_ATTRIBUTE_NOT_STARTED, /* 39 */ + XML_ERR_ATTRIBUTE_NOT_FINISHED, /* 40 */ + XML_ERR_ATTRIBUTE_WITHOUT_VALUE, /* 41 */ + XML_ERR_ATTRIBUTE_REDEFINED, /* 42 */ + XML_ERR_LITERAL_NOT_STARTED, /* 43 */ + XML_ERR_LITERAL_NOT_FINISHED, /* 44 */ + XML_ERR_COMMENT_NOT_FINISHED, /* 45 */ + XML_ERR_PI_NOT_STARTED, /* 46 */ + XML_ERR_PI_NOT_FINISHED, /* 47 */ + XML_ERR_NOTATION_NOT_STARTED, /* 48 */ + XML_ERR_NOTATION_NOT_FINISHED, /* 49 */ + XML_ERR_ATTLIST_NOT_STARTED, /* 50 */ + XML_ERR_ATTLIST_NOT_FINISHED, /* 51 */ + XML_ERR_MIXED_NOT_STARTED, /* 52 */ + XML_ERR_MIXED_NOT_FINISHED, /* 53 */ + XML_ERR_ELEMCONTENT_NOT_STARTED, /* 54 */ + XML_ERR_ELEMCONTENT_NOT_FINISHED, /* 55 */ + XML_ERR_XMLDECL_NOT_STARTED, /* 56 */ + XML_ERR_XMLDECL_NOT_FINISHED, /* 57 */ + XML_ERR_CONDSEC_NOT_STARTED, /* 58 */ + XML_ERR_CONDSEC_NOT_FINISHED, /* 59 */ + XML_ERR_EXT_SUBSET_NOT_FINISHED, /* 60 */ + XML_ERR_DOCTYPE_NOT_FINISHED, /* 61 */ + XML_ERR_MISPLACED_CDATA_END, /* 62 */ + XML_ERR_CDATA_NOT_FINISHED, /* 63 */ + XML_ERR_RESERVED_XML_NAME, /* 64 */ + XML_ERR_SPACE_REQUIRED, /* 65 */ + XML_ERR_SEPARATOR_REQUIRED, /* 66 */ + XML_ERR_NMTOKEN_REQUIRED, /* 67 */ + XML_ERR_NAME_REQUIRED, /* 68 */ + XML_ERR_PCDATA_REQUIRED, /* 69 */ + XML_ERR_URI_REQUIRED, /* 70 */ + XML_ERR_PUBID_REQUIRED, /* 71 */ + XML_ERR_LT_REQUIRED, /* 72 */ + XML_ERR_GT_REQUIRED, /* 73 */ + XML_ERR_LTSLASH_REQUIRED, /* 74 */ + XML_ERR_EQUAL_REQUIRED, /* 75 */ + XML_ERR_TAG_NAME_MISMATCH, /* 76 */ + XML_ERR_TAG_NOT_FINISHED, /* 77 */ + XML_ERR_STANDALONE_VALUE, /* 78 */ + XML_ERR_ENCODING_NAME, /* 79 */ + XML_ERR_HYPHEN_IN_COMMENT, /* 80 */ + XML_ERR_INVALID_ENCODING, /* 81 */ + XML_ERR_EXT_ENTITY_STANDALONE, /* 82 */ + XML_ERR_CONDSEC_INVALID, /* 83 */ + XML_ERR_VALUE_REQUIRED, /* 84 */ + XML_ERR_NOT_WELL_BALANCED, /* 85 */ + XML_ERR_EXTRA_CONTENT, /* 86 */ + XML_ERR_ENTITY_CHAR_ERROR, /* 87 */ + XML_ERR_ENTITY_PE_INTERNAL, /* 88 */ + XML_ERR_ENTITY_LOOP, /* 89 */ + XML_ERR_ENTITY_BOUNDARY, /* 90 */ + XML_ERR_INVALID_URI, /* 91 */ + XML_ERR_URI_FRAGMENT, /* 92 */ + XML_WAR_CATALOG_PI, /* 93 */ + XML_ERR_NO_DTD, /* 94 */ + XML_ERR_CONDSEC_INVALID_KEYWORD, /* 95 */ + XML_ERR_VERSION_MISSING, /* 96 */ + XML_WAR_UNKNOWN_VERSION, /* 97 */ + XML_WAR_LANG_VALUE, /* 98 */ + XML_WAR_NS_URI, /* 99 */ + XML_WAR_NS_URI_RELATIVE, /* 100 */ + XML_ERR_MISSING_ENCODING, /* 101 */ + XML_WAR_SPACE_VALUE, /* 102 */ + XML_ERR_NOT_STANDALONE, /* 103 */ + XML_ERR_ENTITY_PROCESSING, /* 104 */ + XML_ERR_NOTATION_PROCESSING, /* 105 */ + XML_WAR_NS_COLUMN, /* 106 */ + XML_WAR_ENTITY_REDEFINED, /* 107 */ + XML_ERR_UNKNOWN_VERSION, /* 108 */ + XML_ERR_VERSION_MISMATCH, /* 109 */ + XML_ERR_NAME_TOO_LONG, /* 110 */ + XML_ERR_USER_STOP, /* 111 */ + XML_NS_ERR_XML_NAMESPACE = 200, + XML_NS_ERR_UNDEFINED_NAMESPACE, /* 201 */ + XML_NS_ERR_QNAME, /* 202 */ + XML_NS_ERR_ATTRIBUTE_REDEFINED, /* 203 */ + XML_NS_ERR_EMPTY, /* 204 */ + XML_NS_ERR_COLON, /* 205 */ + XML_DTD_ATTRIBUTE_DEFAULT = 500, + XML_DTD_ATTRIBUTE_REDEFINED, /* 501 */ + XML_DTD_ATTRIBUTE_VALUE, /* 502 */ + XML_DTD_CONTENT_ERROR, /* 503 */ + XML_DTD_CONTENT_MODEL, /* 504 */ + XML_DTD_CONTENT_NOT_DETERMINIST, /* 505 */ + XML_DTD_DIFFERENT_PREFIX, /* 506 */ + XML_DTD_ELEM_DEFAULT_NAMESPACE, /* 507 */ + XML_DTD_ELEM_NAMESPACE, /* 508 */ + XML_DTD_ELEM_REDEFINED, /* 509 */ + XML_DTD_EMPTY_NOTATION, /* 510 */ + XML_DTD_ENTITY_TYPE, /* 511 */ + XML_DTD_ID_FIXED, /* 512 */ + XML_DTD_ID_REDEFINED, /* 513 */ + XML_DTD_ID_SUBSET, /* 514 */ + XML_DTD_INVALID_CHILD, /* 515 */ + XML_DTD_INVALID_DEFAULT, /* 516 */ + XML_DTD_LOAD_ERROR, /* 517 */ + XML_DTD_MISSING_ATTRIBUTE, /* 518 */ + XML_DTD_MIXED_CORRUPT, /* 519 */ + XML_DTD_MULTIPLE_ID, /* 520 */ + XML_DTD_NO_DOC, /* 521 */ + XML_DTD_NO_DTD, /* 522 */ + XML_DTD_NO_ELEM_NAME, /* 523 */ + XML_DTD_NO_PREFIX, /* 524 */ + XML_DTD_NO_ROOT, /* 525 */ + XML_DTD_NOTATION_REDEFINED, /* 526 */ + XML_DTD_NOTATION_VALUE, /* 527 */ + XML_DTD_NOT_EMPTY, /* 528 */ + XML_DTD_NOT_PCDATA, /* 529 */ + XML_DTD_NOT_STANDALONE, /* 530 */ + XML_DTD_ROOT_NAME, /* 531 */ + XML_DTD_STANDALONE_WHITE_SPACE, /* 532 */ + XML_DTD_UNKNOWN_ATTRIBUTE, /* 533 */ + XML_DTD_UNKNOWN_ELEM, /* 534 */ + XML_DTD_UNKNOWN_ENTITY, /* 535 */ + XML_DTD_UNKNOWN_ID, /* 536 */ + XML_DTD_UNKNOWN_NOTATION, /* 537 */ + XML_DTD_STANDALONE_DEFAULTED, /* 538 */ + XML_DTD_XMLID_VALUE, /* 539 */ + XML_DTD_XMLID_TYPE, /* 540 */ + XML_DTD_DUP_TOKEN, /* 541 */ + XML_HTML_STRUCURE_ERROR = 800, + XML_HTML_UNKNOWN_TAG, /* 801 */ + XML_RNGP_ANYNAME_ATTR_ANCESTOR = 1000, + XML_RNGP_ATTR_CONFLICT, /* 1001 */ + XML_RNGP_ATTRIBUTE_CHILDREN, /* 1002 */ + XML_RNGP_ATTRIBUTE_CONTENT, /* 1003 */ + XML_RNGP_ATTRIBUTE_EMPTY, /* 1004 */ + XML_RNGP_ATTRIBUTE_NOOP, /* 1005 */ + XML_RNGP_CHOICE_CONTENT, /* 1006 */ + XML_RNGP_CHOICE_EMPTY, /* 1007 */ + XML_RNGP_CREATE_FAILURE, /* 1008 */ + XML_RNGP_DATA_CONTENT, /* 1009 */ + XML_RNGP_DEF_CHOICE_AND_INTERLEAVE, /* 1010 */ + XML_RNGP_DEFINE_CREATE_FAILED, /* 1011 */ + XML_RNGP_DEFINE_EMPTY, /* 1012 */ + XML_RNGP_DEFINE_MISSING, /* 1013 */ + XML_RNGP_DEFINE_NAME_MISSING, /* 1014 */ + XML_RNGP_ELEM_CONTENT_EMPTY, /* 1015 */ + XML_RNGP_ELEM_CONTENT_ERROR, /* 1016 */ + XML_RNGP_ELEMENT_EMPTY, /* 1017 */ + XML_RNGP_ELEMENT_CONTENT, /* 1018 */ + XML_RNGP_ELEMENT_NAME, /* 1019 */ + XML_RNGP_ELEMENT_NO_CONTENT, /* 1020 */ + XML_RNGP_ELEM_TEXT_CONFLICT, /* 1021 */ + XML_RNGP_EMPTY, /* 1022 */ + XML_RNGP_EMPTY_CONSTRUCT, /* 1023 */ + XML_RNGP_EMPTY_CONTENT, /* 1024 */ + XML_RNGP_EMPTY_NOT_EMPTY, /* 1025 */ + XML_RNGP_ERROR_TYPE_LIB, /* 1026 */ + XML_RNGP_EXCEPT_EMPTY, /* 1027 */ + XML_RNGP_EXCEPT_MISSING, /* 1028 */ + XML_RNGP_EXCEPT_MULTIPLE, /* 1029 */ + XML_RNGP_EXCEPT_NO_CONTENT, /* 1030 */ + XML_RNGP_EXTERNALREF_EMTPY, /* 1031 */ + XML_RNGP_EXTERNAL_REF_FAILURE, /* 1032 */ + XML_RNGP_EXTERNALREF_RECURSE, /* 1033 */ + XML_RNGP_FORBIDDEN_ATTRIBUTE, /* 1034 */ + XML_RNGP_FOREIGN_ELEMENT, /* 1035 */ + XML_RNGP_GRAMMAR_CONTENT, /* 1036 */ + XML_RNGP_GRAMMAR_EMPTY, /* 1037 */ + XML_RNGP_GRAMMAR_MISSING, /* 1038 */ + XML_RNGP_GRAMMAR_NO_START, /* 1039 */ + XML_RNGP_GROUP_ATTR_CONFLICT, /* 1040 */ + XML_RNGP_HREF_ERROR, /* 1041 */ + XML_RNGP_INCLUDE_EMPTY, /* 1042 */ + XML_RNGP_INCLUDE_FAILURE, /* 1043 */ + XML_RNGP_INCLUDE_RECURSE, /* 1044 */ + XML_RNGP_INTERLEAVE_ADD, /* 1045 */ + XML_RNGP_INTERLEAVE_CREATE_FAILED, /* 1046 */ + XML_RNGP_INTERLEAVE_EMPTY, /* 1047 */ + XML_RNGP_INTERLEAVE_NO_CONTENT, /* 1048 */ + XML_RNGP_INVALID_DEFINE_NAME, /* 1049 */ + XML_RNGP_INVALID_URI, /* 1050 */ + XML_RNGP_INVALID_VALUE, /* 1051 */ + XML_RNGP_MISSING_HREF, /* 1052 */ + XML_RNGP_NAME_MISSING, /* 1053 */ + XML_RNGP_NEED_COMBINE, /* 1054 */ + XML_RNGP_NOTALLOWED_NOT_EMPTY, /* 1055 */ + XML_RNGP_NSNAME_ATTR_ANCESTOR, /* 1056 */ + XML_RNGP_NSNAME_NO_NS, /* 1057 */ + XML_RNGP_PARAM_FORBIDDEN, /* 1058 */ + XML_RNGP_PARAM_NAME_MISSING, /* 1059 */ + XML_RNGP_PARENTREF_CREATE_FAILED, /* 1060 */ + XML_RNGP_PARENTREF_NAME_INVALID, /* 1061 */ + XML_RNGP_PARENTREF_NO_NAME, /* 1062 */ + XML_RNGP_PARENTREF_NO_PARENT, /* 1063 */ + XML_RNGP_PARENTREF_NOT_EMPTY, /* 1064 */ + XML_RNGP_PARSE_ERROR, /* 1065 */ + XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME, /* 1066 */ + XML_RNGP_PAT_ATTR_ATTR, /* 1067 */ + XML_RNGP_PAT_ATTR_ELEM, /* 1068 */ + XML_RNGP_PAT_DATA_EXCEPT_ATTR, /* 1069 */ + XML_RNGP_PAT_DATA_EXCEPT_ELEM, /* 1070 */ + XML_RNGP_PAT_DATA_EXCEPT_EMPTY, /* 1071 */ + XML_RNGP_PAT_DATA_EXCEPT_GROUP, /* 1072 */ + XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE, /* 1073 */ + XML_RNGP_PAT_DATA_EXCEPT_LIST, /* 1074 */ + XML_RNGP_PAT_DATA_EXCEPT_ONEMORE, /* 1075 */ + XML_RNGP_PAT_DATA_EXCEPT_REF, /* 1076 */ + XML_RNGP_PAT_DATA_EXCEPT_TEXT, /* 1077 */ + XML_RNGP_PAT_LIST_ATTR, /* 1078 */ + XML_RNGP_PAT_LIST_ELEM, /* 1079 */ + XML_RNGP_PAT_LIST_INTERLEAVE, /* 1080 */ + XML_RNGP_PAT_LIST_LIST, /* 1081 */ + XML_RNGP_PAT_LIST_REF, /* 1082 */ + XML_RNGP_PAT_LIST_TEXT, /* 1083 */ + XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME, /* 1084 */ + XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME, /* 1085 */ + XML_RNGP_PAT_ONEMORE_GROUP_ATTR, /* 1086 */ + XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR, /* 1087 */ + XML_RNGP_PAT_START_ATTR, /* 1088 */ + XML_RNGP_PAT_START_DATA, /* 1089 */ + XML_RNGP_PAT_START_EMPTY, /* 1090 */ + XML_RNGP_PAT_START_GROUP, /* 1091 */ + XML_RNGP_PAT_START_INTERLEAVE, /* 1092 */ + XML_RNGP_PAT_START_LIST, /* 1093 */ + XML_RNGP_PAT_START_ONEMORE, /* 1094 */ + XML_RNGP_PAT_START_TEXT, /* 1095 */ + XML_RNGP_PAT_START_VALUE, /* 1096 */ + XML_RNGP_PREFIX_UNDEFINED, /* 1097 */ + XML_RNGP_REF_CREATE_FAILED, /* 1098 */ + XML_RNGP_REF_CYCLE, /* 1099 */ + XML_RNGP_REF_NAME_INVALID, /* 1100 */ + XML_RNGP_REF_NO_DEF, /* 1101 */ + XML_RNGP_REF_NO_NAME, /* 1102 */ + XML_RNGP_REF_NOT_EMPTY, /* 1103 */ + XML_RNGP_START_CHOICE_AND_INTERLEAVE, /* 1104 */ + XML_RNGP_START_CONTENT, /* 1105 */ + XML_RNGP_START_EMPTY, /* 1106 */ + XML_RNGP_START_MISSING, /* 1107 */ + XML_RNGP_TEXT_EXPECTED, /* 1108 */ + XML_RNGP_TEXT_HAS_CHILD, /* 1109 */ + XML_RNGP_TYPE_MISSING, /* 1110 */ + XML_RNGP_TYPE_NOT_FOUND, /* 1111 */ + XML_RNGP_TYPE_VALUE, /* 1112 */ + XML_RNGP_UNKNOWN_ATTRIBUTE, /* 1113 */ + XML_RNGP_UNKNOWN_COMBINE, /* 1114 */ + XML_RNGP_UNKNOWN_CONSTRUCT, /* 1115 */ + XML_RNGP_UNKNOWN_TYPE_LIB, /* 1116 */ + XML_RNGP_URI_FRAGMENT, /* 1117 */ + XML_RNGP_URI_NOT_ABSOLUTE, /* 1118 */ + XML_RNGP_VALUE_EMPTY, /* 1119 */ + XML_RNGP_VALUE_NO_CONTENT, /* 1120 */ + XML_RNGP_XMLNS_NAME, /* 1121 */ + XML_RNGP_XML_NS, /* 1122 */ + XML_XPATH_EXPRESSION_OK = 1200, + XML_XPATH_NUMBER_ERROR, /* 1201 */ + XML_XPATH_UNFINISHED_LITERAL_ERROR, /* 1202 */ + XML_XPATH_START_LITERAL_ERROR, /* 1203 */ + XML_XPATH_VARIABLE_REF_ERROR, /* 1204 */ + XML_XPATH_UNDEF_VARIABLE_ERROR, /* 1205 */ + XML_XPATH_INVALID_PREDICATE_ERROR, /* 1206 */ + XML_XPATH_EXPR_ERROR, /* 1207 */ + XML_XPATH_UNCLOSED_ERROR, /* 1208 */ + XML_XPATH_UNKNOWN_FUNC_ERROR, /* 1209 */ + XML_XPATH_INVALID_OPERAND, /* 1210 */ + XML_XPATH_INVALID_TYPE, /* 1211 */ + XML_XPATH_INVALID_ARITY, /* 1212 */ + XML_XPATH_INVALID_CTXT_SIZE, /* 1213 */ + XML_XPATH_INVALID_CTXT_POSITION, /* 1214 */ + XML_XPATH_MEMORY_ERROR, /* 1215 */ + XML_XPTR_SYNTAX_ERROR, /* 1216 */ + XML_XPTR_RESOURCE_ERROR, /* 1217 */ + XML_XPTR_SUB_RESOURCE_ERROR, /* 1218 */ + XML_XPATH_UNDEF_PREFIX_ERROR, /* 1219 */ + XML_XPATH_ENCODING_ERROR, /* 1220 */ + XML_XPATH_INVALID_CHAR_ERROR, /* 1221 */ + XML_TREE_INVALID_HEX = 1300, + XML_TREE_INVALID_DEC, /* 1301 */ + XML_TREE_UNTERMINATED_ENTITY, /* 1302 */ + XML_TREE_NOT_UTF8, /* 1303 */ + XML_SAVE_NOT_UTF8 = 1400, + XML_SAVE_CHAR_INVALID, /* 1401 */ + XML_SAVE_NO_DOCTYPE, /* 1402 */ + XML_SAVE_UNKNOWN_ENCODING, /* 1403 */ + XML_REGEXP_COMPILE_ERROR = 1450, + XML_IO_UNKNOWN = 1500, + XML_IO_EACCES, /* 1501 */ + XML_IO_EAGAIN, /* 1502 */ + XML_IO_EBADF, /* 1503 */ + XML_IO_EBADMSG, /* 1504 */ + XML_IO_EBUSY, /* 1505 */ + XML_IO_ECANCELED, /* 1506 */ + XML_IO_ECHILD, /* 1507 */ + XML_IO_EDEADLK, /* 1508 */ + XML_IO_EDOM, /* 1509 */ + XML_IO_EEXIST, /* 1510 */ + XML_IO_EFAULT, /* 1511 */ + XML_IO_EFBIG, /* 1512 */ + XML_IO_EINPROGRESS, /* 1513 */ + XML_IO_EINTR, /* 1514 */ + XML_IO_EINVAL, /* 1515 */ + XML_IO_EIO, /* 1516 */ + XML_IO_EISDIR, /* 1517 */ + XML_IO_EMFILE, /* 1518 */ + XML_IO_EMLINK, /* 1519 */ + XML_IO_EMSGSIZE, /* 1520 */ + XML_IO_ENAMETOOLONG, /* 1521 */ + XML_IO_ENFILE, /* 1522 */ + XML_IO_ENODEV, /* 1523 */ + XML_IO_ENOENT, /* 1524 */ + XML_IO_ENOEXEC, /* 1525 */ + XML_IO_ENOLCK, /* 1526 */ + XML_IO_ENOMEM, /* 1527 */ + XML_IO_ENOSPC, /* 1528 */ + XML_IO_ENOSYS, /* 1529 */ + XML_IO_ENOTDIR, /* 1530 */ + XML_IO_ENOTEMPTY, /* 1531 */ + XML_IO_ENOTSUP, /* 1532 */ + XML_IO_ENOTTY, /* 1533 */ + XML_IO_ENXIO, /* 1534 */ + XML_IO_EPERM, /* 1535 */ + XML_IO_EPIPE, /* 1536 */ + XML_IO_ERANGE, /* 1537 */ + XML_IO_EROFS, /* 1538 */ + XML_IO_ESPIPE, /* 1539 */ + XML_IO_ESRCH, /* 1540 */ + XML_IO_ETIMEDOUT, /* 1541 */ + XML_IO_EXDEV, /* 1542 */ + XML_IO_NETWORK_ATTEMPT, /* 1543 */ + XML_IO_ENCODER, /* 1544 */ + XML_IO_FLUSH, /* 1545 */ + XML_IO_WRITE, /* 1546 */ + XML_IO_NO_INPUT, /* 1547 */ + XML_IO_BUFFER_FULL, /* 1548 */ + XML_IO_LOAD_ERROR, /* 1549 */ + XML_IO_ENOTSOCK, /* 1550 */ + XML_IO_EISCONN, /* 1551 */ + XML_IO_ECONNREFUSED, /* 1552 */ + XML_IO_ENETUNREACH, /* 1553 */ + XML_IO_EADDRINUSE, /* 1554 */ + XML_IO_EALREADY, /* 1555 */ + XML_IO_EAFNOSUPPORT, /* 1556 */ + XML_XINCLUDE_RECURSION=1600, + XML_XINCLUDE_PARSE_VALUE, /* 1601 */ + XML_XINCLUDE_ENTITY_DEF_MISMATCH, /* 1602 */ + XML_XINCLUDE_NO_HREF, /* 1603 */ + XML_XINCLUDE_NO_FALLBACK, /* 1604 */ + XML_XINCLUDE_HREF_URI, /* 1605 */ + XML_XINCLUDE_TEXT_FRAGMENT, /* 1606 */ + XML_XINCLUDE_TEXT_DOCUMENT, /* 1607 */ + XML_XINCLUDE_INVALID_CHAR, /* 1608 */ + XML_XINCLUDE_BUILD_FAILED, /* 1609 */ + XML_XINCLUDE_UNKNOWN_ENCODING, /* 1610 */ + XML_XINCLUDE_MULTIPLE_ROOT, /* 1611 */ + XML_XINCLUDE_XPTR_FAILED, /* 1612 */ + XML_XINCLUDE_XPTR_RESULT, /* 1613 */ + XML_XINCLUDE_INCLUDE_IN_INCLUDE, /* 1614 */ + XML_XINCLUDE_FALLBACKS_IN_INCLUDE, /* 1615 */ + XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE, /* 1616 */ + XML_XINCLUDE_DEPRECATED_NS, /* 1617 */ + XML_XINCLUDE_FRAGMENT_ID, /* 1618 */ + XML_CATALOG_MISSING_ATTR = 1650, + XML_CATALOG_ENTRY_BROKEN, /* 1651 */ + XML_CATALOG_PREFER_VALUE, /* 1652 */ + XML_CATALOG_NOT_CATALOG, /* 1653 */ + XML_CATALOG_RECURSION, /* 1654 */ + XML_SCHEMAP_PREFIX_UNDEFINED = 1700, + XML_SCHEMAP_ATTRFORMDEFAULT_VALUE, /* 1701 */ + XML_SCHEMAP_ATTRGRP_NONAME_NOREF, /* 1702 */ + XML_SCHEMAP_ATTR_NONAME_NOREF, /* 1703 */ + XML_SCHEMAP_COMPLEXTYPE_NONAME_NOREF, /* 1704 */ + XML_SCHEMAP_ELEMFORMDEFAULT_VALUE, /* 1705 */ + XML_SCHEMAP_ELEM_NONAME_NOREF, /* 1706 */ + XML_SCHEMAP_EXTENSION_NO_BASE, /* 1707 */ + XML_SCHEMAP_FACET_NO_VALUE, /* 1708 */ + XML_SCHEMAP_FAILED_BUILD_IMPORT, /* 1709 */ + XML_SCHEMAP_GROUP_NONAME_NOREF, /* 1710 */ + XML_SCHEMAP_IMPORT_NAMESPACE_NOT_URI, /* 1711 */ + XML_SCHEMAP_IMPORT_REDEFINE_NSNAME, /* 1712 */ + XML_SCHEMAP_IMPORT_SCHEMA_NOT_URI, /* 1713 */ + XML_SCHEMAP_INVALID_BOOLEAN, /* 1714 */ + XML_SCHEMAP_INVALID_ENUM, /* 1715 */ + XML_SCHEMAP_INVALID_FACET, /* 1716 */ + XML_SCHEMAP_INVALID_FACET_VALUE, /* 1717 */ + XML_SCHEMAP_INVALID_MAXOCCURS, /* 1718 */ + XML_SCHEMAP_INVALID_MINOCCURS, /* 1719 */ + XML_SCHEMAP_INVALID_REF_AND_SUBTYPE, /* 1720 */ + XML_SCHEMAP_INVALID_WHITE_SPACE, /* 1721 */ + XML_SCHEMAP_NOATTR_NOREF, /* 1722 */ + XML_SCHEMAP_NOTATION_NO_NAME, /* 1723 */ + XML_SCHEMAP_NOTYPE_NOREF, /* 1724 */ + XML_SCHEMAP_REF_AND_SUBTYPE, /* 1725 */ + XML_SCHEMAP_RESTRICTION_NONAME_NOREF, /* 1726 */ + XML_SCHEMAP_SIMPLETYPE_NONAME, /* 1727 */ + XML_SCHEMAP_TYPE_AND_SUBTYPE, /* 1728 */ + XML_SCHEMAP_UNKNOWN_ALL_CHILD, /* 1729 */ + XML_SCHEMAP_UNKNOWN_ANYATTRIBUTE_CHILD, /* 1730 */ + XML_SCHEMAP_UNKNOWN_ATTR_CHILD, /* 1731 */ + XML_SCHEMAP_UNKNOWN_ATTRGRP_CHILD, /* 1732 */ + XML_SCHEMAP_UNKNOWN_ATTRIBUTE_GROUP, /* 1733 */ + XML_SCHEMAP_UNKNOWN_BASE_TYPE, /* 1734 */ + XML_SCHEMAP_UNKNOWN_CHOICE_CHILD, /* 1735 */ + XML_SCHEMAP_UNKNOWN_COMPLEXCONTENT_CHILD, /* 1736 */ + XML_SCHEMAP_UNKNOWN_COMPLEXTYPE_CHILD, /* 1737 */ + XML_SCHEMAP_UNKNOWN_ELEM_CHILD, /* 1738 */ + XML_SCHEMAP_UNKNOWN_EXTENSION_CHILD, /* 1739 */ + XML_SCHEMAP_UNKNOWN_FACET_CHILD, /* 1740 */ + XML_SCHEMAP_UNKNOWN_FACET_TYPE, /* 1741 */ + XML_SCHEMAP_UNKNOWN_GROUP_CHILD, /* 1742 */ + XML_SCHEMAP_UNKNOWN_IMPORT_CHILD, /* 1743 */ + XML_SCHEMAP_UNKNOWN_LIST_CHILD, /* 1744 */ + XML_SCHEMAP_UNKNOWN_NOTATION_CHILD, /* 1745 */ + XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD, /* 1746 */ + XML_SCHEMAP_UNKNOWN_REF, /* 1747 */ + XML_SCHEMAP_UNKNOWN_RESTRICTION_CHILD, /* 1748 */ + XML_SCHEMAP_UNKNOWN_SCHEMAS_CHILD, /* 1749 */ + XML_SCHEMAP_UNKNOWN_SEQUENCE_CHILD, /* 1750 */ + XML_SCHEMAP_UNKNOWN_SIMPLECONTENT_CHILD, /* 1751 */ + XML_SCHEMAP_UNKNOWN_SIMPLETYPE_CHILD, /* 1752 */ + XML_SCHEMAP_UNKNOWN_TYPE, /* 1753 */ + XML_SCHEMAP_UNKNOWN_UNION_CHILD, /* 1754 */ + XML_SCHEMAP_ELEM_DEFAULT_FIXED, /* 1755 */ + XML_SCHEMAP_REGEXP_INVALID, /* 1756 */ + XML_SCHEMAP_FAILED_LOAD, /* 1757 */ + XML_SCHEMAP_NOTHING_TO_PARSE, /* 1758 */ + XML_SCHEMAP_NOROOT, /* 1759 */ + XML_SCHEMAP_REDEFINED_GROUP, /* 1760 */ + XML_SCHEMAP_REDEFINED_TYPE, /* 1761 */ + XML_SCHEMAP_REDEFINED_ELEMENT, /* 1762 */ + XML_SCHEMAP_REDEFINED_ATTRGROUP, /* 1763 */ + XML_SCHEMAP_REDEFINED_ATTR, /* 1764 */ + XML_SCHEMAP_REDEFINED_NOTATION, /* 1765 */ + XML_SCHEMAP_FAILED_PARSE, /* 1766 */ + XML_SCHEMAP_UNKNOWN_PREFIX, /* 1767 */ + XML_SCHEMAP_DEF_AND_PREFIX, /* 1768 */ + XML_SCHEMAP_UNKNOWN_INCLUDE_CHILD, /* 1769 */ + XML_SCHEMAP_INCLUDE_SCHEMA_NOT_URI, /* 1770 */ + XML_SCHEMAP_INCLUDE_SCHEMA_NO_URI, /* 1771 */ + XML_SCHEMAP_NOT_SCHEMA, /* 1772 */ + XML_SCHEMAP_UNKNOWN_MEMBER_TYPE, /* 1773 */ + XML_SCHEMAP_INVALID_ATTR_USE, /* 1774 */ + XML_SCHEMAP_RECURSIVE, /* 1775 */ + XML_SCHEMAP_SUPERNUMEROUS_LIST_ITEM_TYPE, /* 1776 */ + XML_SCHEMAP_INVALID_ATTR_COMBINATION, /* 1777 */ + XML_SCHEMAP_INVALID_ATTR_INLINE_COMBINATION, /* 1778 */ + XML_SCHEMAP_MISSING_SIMPLETYPE_CHILD, /* 1779 */ + XML_SCHEMAP_INVALID_ATTR_NAME, /* 1780 */ + XML_SCHEMAP_REF_AND_CONTENT, /* 1781 */ + XML_SCHEMAP_CT_PROPS_CORRECT_1, /* 1782 */ + XML_SCHEMAP_CT_PROPS_CORRECT_2, /* 1783 */ + XML_SCHEMAP_CT_PROPS_CORRECT_3, /* 1784 */ + XML_SCHEMAP_CT_PROPS_CORRECT_4, /* 1785 */ + XML_SCHEMAP_CT_PROPS_CORRECT_5, /* 1786 */ + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1, /* 1787 */ + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1, /* 1788 */ + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2, /* 1789 */ + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2, /* 1790 */ + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3, /* 1791 */ + XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER, /* 1792 */ + XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE, /* 1793 */ + XML_SCHEMAP_UNION_NOT_EXPRESSIBLE, /* 1794 */ + XML_SCHEMAP_SRC_IMPORT_3_1, /* 1795 */ + XML_SCHEMAP_SRC_IMPORT_3_2, /* 1796 */ + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1, /* 1797 */ + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2, /* 1798 */ + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3, /* 1799 */ + XML_SCHEMAP_COS_CT_EXTENDS_1_3, /* 1800 */ + XML_SCHEMAV_NOROOT = 1801, + XML_SCHEMAV_UNDECLAREDELEM, /* 1802 */ + XML_SCHEMAV_NOTTOPLEVEL, /* 1803 */ + XML_SCHEMAV_MISSING, /* 1804 */ + XML_SCHEMAV_WRONGELEM, /* 1805 */ + XML_SCHEMAV_NOTYPE, /* 1806 */ + XML_SCHEMAV_NOROLLBACK, /* 1807 */ + XML_SCHEMAV_ISABSTRACT, /* 1808 */ + XML_SCHEMAV_NOTEMPTY, /* 1809 */ + XML_SCHEMAV_ELEMCONT, /* 1810 */ + XML_SCHEMAV_HAVEDEFAULT, /* 1811 */ + XML_SCHEMAV_NOTNILLABLE, /* 1812 */ + XML_SCHEMAV_EXTRACONTENT, /* 1813 */ + XML_SCHEMAV_INVALIDATTR, /* 1814 */ + XML_SCHEMAV_INVALIDELEM, /* 1815 */ + XML_SCHEMAV_NOTDETERMINIST, /* 1816 */ + XML_SCHEMAV_CONSTRUCT, /* 1817 */ + XML_SCHEMAV_INTERNAL, /* 1818 */ + XML_SCHEMAV_NOTSIMPLE, /* 1819 */ + XML_SCHEMAV_ATTRUNKNOWN, /* 1820 */ + XML_SCHEMAV_ATTRINVALID, /* 1821 */ + XML_SCHEMAV_VALUE, /* 1822 */ + XML_SCHEMAV_FACET, /* 1823 */ + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, /* 1824 */ + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2, /* 1825 */ + XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3, /* 1826 */ + XML_SCHEMAV_CVC_TYPE_3_1_1, /* 1827 */ + XML_SCHEMAV_CVC_TYPE_3_1_2, /* 1828 */ + XML_SCHEMAV_CVC_FACET_VALID, /* 1829 */ + XML_SCHEMAV_CVC_LENGTH_VALID, /* 1830 */ + XML_SCHEMAV_CVC_MINLENGTH_VALID, /* 1831 */ + XML_SCHEMAV_CVC_MAXLENGTH_VALID, /* 1832 */ + XML_SCHEMAV_CVC_MININCLUSIVE_VALID, /* 1833 */ + XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID, /* 1834 */ + XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID, /* 1835 */ + XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID, /* 1836 */ + XML_SCHEMAV_CVC_TOTALDIGITS_VALID, /* 1837 */ + XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID, /* 1838 */ + XML_SCHEMAV_CVC_PATTERN_VALID, /* 1839 */ + XML_SCHEMAV_CVC_ENUMERATION_VALID, /* 1840 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, /* 1841 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2, /* 1842 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, /* 1843 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_2_4, /* 1844 */ + XML_SCHEMAV_CVC_ELT_1, /* 1845 */ + XML_SCHEMAV_CVC_ELT_2, /* 1846 */ + XML_SCHEMAV_CVC_ELT_3_1, /* 1847 */ + XML_SCHEMAV_CVC_ELT_3_2_1, /* 1848 */ + XML_SCHEMAV_CVC_ELT_3_2_2, /* 1849 */ + XML_SCHEMAV_CVC_ELT_4_1, /* 1850 */ + XML_SCHEMAV_CVC_ELT_4_2, /* 1851 */ + XML_SCHEMAV_CVC_ELT_4_3, /* 1852 */ + XML_SCHEMAV_CVC_ELT_5_1_1, /* 1853 */ + XML_SCHEMAV_CVC_ELT_5_1_2, /* 1854 */ + XML_SCHEMAV_CVC_ELT_5_2_1, /* 1855 */ + XML_SCHEMAV_CVC_ELT_5_2_2_1, /* 1856 */ + XML_SCHEMAV_CVC_ELT_5_2_2_2_1, /* 1857 */ + XML_SCHEMAV_CVC_ELT_5_2_2_2_2, /* 1858 */ + XML_SCHEMAV_CVC_ELT_6, /* 1859 */ + XML_SCHEMAV_CVC_ELT_7, /* 1860 */ + XML_SCHEMAV_CVC_ATTRIBUTE_1, /* 1861 */ + XML_SCHEMAV_CVC_ATTRIBUTE_2, /* 1862 */ + XML_SCHEMAV_CVC_ATTRIBUTE_3, /* 1863 */ + XML_SCHEMAV_CVC_ATTRIBUTE_4, /* 1864 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_1, /* 1865 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, /* 1866 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, /* 1867 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_4, /* 1868 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_5_1, /* 1869 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_5_2, /* 1870 */ + XML_SCHEMAV_ELEMENT_CONTENT, /* 1871 */ + XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING, /* 1872 */ + XML_SCHEMAV_CVC_COMPLEX_TYPE_1, /* 1873 */ + XML_SCHEMAV_CVC_AU, /* 1874 */ + XML_SCHEMAV_CVC_TYPE_1, /* 1875 */ + XML_SCHEMAV_CVC_TYPE_2, /* 1876 */ + XML_SCHEMAV_CVC_IDC, /* 1877 */ + XML_SCHEMAV_CVC_WILDCARD, /* 1878 */ + XML_SCHEMAV_MISC, /* 1879 */ + XML_XPTR_UNKNOWN_SCHEME = 1900, + XML_XPTR_CHILDSEQ_START, /* 1901 */ + XML_XPTR_EVAL_FAILED, /* 1902 */ + XML_XPTR_EXTRA_OBJECTS, /* 1903 */ + XML_C14N_CREATE_CTXT = 1950, + XML_C14N_REQUIRES_UTF8, /* 1951 */ + XML_C14N_CREATE_STACK, /* 1952 */ + XML_C14N_INVALID_NODE, /* 1953 */ + XML_C14N_UNKNOW_NODE, /* 1954 */ + XML_C14N_RELATIVE_NAMESPACE, /* 1955 */ + XML_FTP_PASV_ANSWER = 2000, + XML_FTP_EPSV_ANSWER, /* 2001 */ + XML_FTP_ACCNT, /* 2002 */ + XML_FTP_URL_SYNTAX, /* 2003 */ + XML_HTTP_URL_SYNTAX = 2020, + XML_HTTP_USE_IP, /* 2021 */ + XML_HTTP_UNKNOWN_HOST, /* 2022 */ + XML_SCHEMAP_SRC_SIMPLE_TYPE_1 = 3000, + XML_SCHEMAP_SRC_SIMPLE_TYPE_2, /* 3001 */ + XML_SCHEMAP_SRC_SIMPLE_TYPE_3, /* 3002 */ + XML_SCHEMAP_SRC_SIMPLE_TYPE_4, /* 3003 */ + XML_SCHEMAP_SRC_RESOLVE, /* 3004 */ + XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE, /* 3005 */ + XML_SCHEMAP_SRC_LIST_ITEMTYPE_OR_SIMPLETYPE, /* 3006 */ + XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES, /* 3007 */ + XML_SCHEMAP_ST_PROPS_CORRECT_1, /* 3008 */ + XML_SCHEMAP_ST_PROPS_CORRECT_2, /* 3009 */ + XML_SCHEMAP_ST_PROPS_CORRECT_3, /* 3010 */ + XML_SCHEMAP_COS_ST_RESTRICTS_1_1, /* 3011 */ + XML_SCHEMAP_COS_ST_RESTRICTS_1_2, /* 3012 */ + XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1, /* 3013 */ + XML_SCHEMAP_COS_ST_RESTRICTS_1_3_2, /* 3014 */ + XML_SCHEMAP_COS_ST_RESTRICTS_2_1, /* 3015 */ + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1, /* 3016 */ + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2, /* 3017 */ + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1, /* 3018 */ + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2, /* 3019 */ + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3, /* 3020 */ + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4, /* 3021 */ + XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_5, /* 3022 */ + XML_SCHEMAP_COS_ST_RESTRICTS_3_1, /* 3023 */ + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1, /* 3024 */ + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2, /* 3025 */ + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2, /* 3026 */ + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1, /* 3027 */ + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3, /* 3028 */ + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4, /* 3029 */ + XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_5, /* 3030 */ + XML_SCHEMAP_COS_ST_DERIVED_OK_2_1, /* 3031 */ + XML_SCHEMAP_COS_ST_DERIVED_OK_2_2, /* 3032 */ + XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED, /* 3033 */ + XML_SCHEMAP_S4S_ELEM_MISSING, /* 3034 */ + XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, /* 3035 */ + XML_SCHEMAP_S4S_ATTR_MISSING, /* 3036 */ + XML_SCHEMAP_S4S_ATTR_INVALID_VALUE, /* 3037 */ + XML_SCHEMAP_SRC_ELEMENT_1, /* 3038 */ + XML_SCHEMAP_SRC_ELEMENT_2_1, /* 3039 */ + XML_SCHEMAP_SRC_ELEMENT_2_2, /* 3040 */ + XML_SCHEMAP_SRC_ELEMENT_3, /* 3041 */ + XML_SCHEMAP_P_PROPS_CORRECT_1, /* 3042 */ + XML_SCHEMAP_P_PROPS_CORRECT_2_1, /* 3043 */ + XML_SCHEMAP_P_PROPS_CORRECT_2_2, /* 3044 */ + XML_SCHEMAP_E_PROPS_CORRECT_2, /* 3045 */ + XML_SCHEMAP_E_PROPS_CORRECT_3, /* 3046 */ + XML_SCHEMAP_E_PROPS_CORRECT_4, /* 3047 */ + XML_SCHEMAP_E_PROPS_CORRECT_5, /* 3048 */ + XML_SCHEMAP_E_PROPS_CORRECT_6, /* 3049 */ + XML_SCHEMAP_SRC_INCLUDE, /* 3050 */ + XML_SCHEMAP_SRC_ATTRIBUTE_1, /* 3051 */ + XML_SCHEMAP_SRC_ATTRIBUTE_2, /* 3052 */ + XML_SCHEMAP_SRC_ATTRIBUTE_3_1, /* 3053 */ + XML_SCHEMAP_SRC_ATTRIBUTE_3_2, /* 3054 */ + XML_SCHEMAP_SRC_ATTRIBUTE_4, /* 3055 */ + XML_SCHEMAP_NO_XMLNS, /* 3056 */ + XML_SCHEMAP_NO_XSI, /* 3057 */ + XML_SCHEMAP_COS_VALID_DEFAULT_1, /* 3058 */ + XML_SCHEMAP_COS_VALID_DEFAULT_2_1, /* 3059 */ + XML_SCHEMAP_COS_VALID_DEFAULT_2_2_1, /* 3060 */ + XML_SCHEMAP_COS_VALID_DEFAULT_2_2_2, /* 3061 */ + XML_SCHEMAP_CVC_SIMPLE_TYPE, /* 3062 */ + XML_SCHEMAP_COS_CT_EXTENDS_1_1, /* 3063 */ + XML_SCHEMAP_SRC_IMPORT_1_1, /* 3064 */ + XML_SCHEMAP_SRC_IMPORT_1_2, /* 3065 */ + XML_SCHEMAP_SRC_IMPORT_2, /* 3066 */ + XML_SCHEMAP_SRC_IMPORT_2_1, /* 3067 */ + XML_SCHEMAP_SRC_IMPORT_2_2, /* 3068 */ + XML_SCHEMAP_INTERNAL, /* 3069 non-W3C */ + XML_SCHEMAP_NOT_DETERMINISTIC, /* 3070 non-W3C */ + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_1, /* 3071 */ + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_2, /* 3072 */ + XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3, /* 3073 */ + XML_SCHEMAP_MG_PROPS_CORRECT_1, /* 3074 */ + XML_SCHEMAP_MG_PROPS_CORRECT_2, /* 3075 */ + XML_SCHEMAP_SRC_CT_1, /* 3076 */ + XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3, /* 3077 */ + XML_SCHEMAP_AU_PROPS_CORRECT_2, /* 3078 */ + XML_SCHEMAP_A_PROPS_CORRECT_2, /* 3079 */ + XML_SCHEMAP_C_PROPS_CORRECT, /* 3080 */ + XML_SCHEMAP_SRC_REDEFINE, /* 3081 */ + XML_SCHEMAP_SRC_IMPORT, /* 3082 */ + XML_SCHEMAP_WARN_SKIP_SCHEMA, /* 3083 */ + XML_SCHEMAP_WARN_UNLOCATED_SCHEMA, /* 3084 */ + XML_SCHEMAP_WARN_ATTR_REDECL_PROH, /* 3085 */ + XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH, /* 3085 */ + XML_SCHEMAP_AG_PROPS_CORRECT, /* 3086 */ + XML_SCHEMAP_COS_CT_EXTENDS_1_2, /* 3087 */ + XML_SCHEMAP_AU_PROPS_CORRECT, /* 3088 */ + XML_SCHEMAP_A_PROPS_CORRECT_3, /* 3089 */ + XML_SCHEMAP_COS_ALL_LIMITED, /* 3090 */ + XML_SCHEMATRONV_ASSERT = 4000, /* 4000 */ + XML_SCHEMATRONV_REPORT, + XML_MODULE_OPEN = 4900, /* 4900 */ + XML_MODULE_CLOSE, /* 4901 */ + XML_CHECK_FOUND_ELEMENT = 5000, + XML_CHECK_FOUND_ATTRIBUTE, /* 5001 */ + XML_CHECK_FOUND_TEXT, /* 5002 */ + XML_CHECK_FOUND_CDATA, /* 5003 */ + XML_CHECK_FOUND_ENTITYREF, /* 5004 */ + XML_CHECK_FOUND_ENTITY, /* 5005 */ + XML_CHECK_FOUND_PI, /* 5006 */ + XML_CHECK_FOUND_COMMENT, /* 5007 */ + XML_CHECK_FOUND_DOCTYPE, /* 5008 */ + XML_CHECK_FOUND_FRAGMENT, /* 5009 */ + XML_CHECK_FOUND_NOTATION, /* 5010 */ + XML_CHECK_UNKNOWN_NODE, /* 5011 */ + XML_CHECK_ENTITY_TYPE, /* 5012 */ + XML_CHECK_NO_PARENT, /* 5013 */ + XML_CHECK_NO_DOC, /* 5014 */ + XML_CHECK_NO_NAME, /* 5015 */ + XML_CHECK_NO_ELEM, /* 5016 */ + XML_CHECK_WRONG_DOC, /* 5017 */ + XML_CHECK_NO_PREV, /* 5018 */ + XML_CHECK_WRONG_PREV, /* 5019 */ + XML_CHECK_NO_NEXT, /* 5020 */ + XML_CHECK_WRONG_NEXT, /* 5021 */ + XML_CHECK_NOT_DTD, /* 5022 */ + XML_CHECK_NOT_ATTR, /* 5023 */ + XML_CHECK_NOT_ATTR_DECL, /* 5024 */ + XML_CHECK_NOT_ELEM_DECL, /* 5025 */ + XML_CHECK_NOT_ENTITY_DECL, /* 5026 */ + XML_CHECK_NOT_NS_DECL, /* 5027 */ + XML_CHECK_NO_HREF, /* 5028 */ + XML_CHECK_WRONG_PARENT,/* 5029 */ + XML_CHECK_NS_SCOPE, /* 5030 */ + XML_CHECK_NS_ANCESTOR, /* 5031 */ + XML_CHECK_NOT_UTF8, /* 5032 */ + XML_CHECK_NO_DICT, /* 5033 */ + XML_CHECK_NOT_NCNAME, /* 5034 */ + XML_CHECK_OUTSIDE_DICT, /* 5035 */ + XML_CHECK_WRONG_NAME, /* 5036 */ + XML_CHECK_NAME_NOT_NULL, /* 5037 */ + XML_I18N_NO_NAME = 6000, + XML_I18N_NO_HANDLER, /* 6001 */ + XML_I18N_EXCESS_HANDLER, /* 6002 */ + XML_I18N_CONV_FAILED, /* 6003 */ + XML_I18N_NO_OUTPUT, /* 6004 */ + XML_BUF_OVERFLOW = 7000 +} xmlParserErrors; + +/** + * xmlGenericErrorFunc: + * @ctx: a parsing context + * @msg: the message + * @...: the extra arguments of the varargs to format the message + * + * Signature of the function to use when there is an error and + * no parsing or validity context available . + */ +typedef void (XMLCDECL *xmlGenericErrorFunc) (void *ctx, + const char *msg, + ...) LIBXML_ATTR_FORMAT(2,3); +/** + * xmlStructuredErrorFunc: + * @userData: user provided data for the error callback + * @error: the error being raised. + * + * Signature of the function to use when there is an error and + * the module handles the new error reporting mechanism. + */ +typedef void (XMLCALL *xmlStructuredErrorFunc) (void *userData, xmlErrorPtr error); + +/* + * Use the following function to reset the two global variables + * xmlGenericError and xmlGenericErrorContext. + */ +XMLPUBFUN void XMLCALL + xmlSetGenericErrorFunc (void *ctx, + xmlGenericErrorFunc handler); +XMLPUBFUN void XMLCALL + initGenericErrorDefaultFunc (xmlGenericErrorFunc *handler); + +XMLPUBFUN void XMLCALL + xmlSetStructuredErrorFunc (void *ctx, + xmlStructuredErrorFunc handler); +/* + * Default message routines used by SAX and Valid context for error + * and warning reporting. + */ +XMLPUBFUN void XMLCDECL + xmlParserError (void *ctx, + const char *msg, + ...) LIBXML_ATTR_FORMAT(2,3); +XMLPUBFUN void XMLCDECL + xmlParserWarning (void *ctx, + const char *msg, + ...) LIBXML_ATTR_FORMAT(2,3); +XMLPUBFUN void XMLCDECL + xmlParserValidityError (void *ctx, + const char *msg, + ...) LIBXML_ATTR_FORMAT(2,3); +XMLPUBFUN void XMLCDECL + xmlParserValidityWarning (void *ctx, + const char *msg, + ...) LIBXML_ATTR_FORMAT(2,3); +XMLPUBFUN void XMLCALL + xmlParserPrintFileInfo (xmlParserInputPtr input); +XMLPUBFUN void XMLCALL + xmlParserPrintFileContext (xmlParserInputPtr input); + +/* + * Extended error information routines + */ +XMLPUBFUN xmlErrorPtr XMLCALL + xmlGetLastError (void); +XMLPUBFUN void XMLCALL + xmlResetLastError (void); +XMLPUBFUN xmlErrorPtr XMLCALL + xmlCtxtGetLastError (void *ctx); +XMLPUBFUN void XMLCALL + xmlCtxtResetLastError (void *ctx); +XMLPUBFUN void XMLCALL + xmlResetError (xmlErrorPtr err); +XMLPUBFUN int XMLCALL + xmlCopyError (xmlErrorPtr from, + xmlErrorPtr to); + +#ifdef IN_LIBXML +/* + * Internal callback reporting routine + */ +XMLPUBFUN void XMLCALL + __xmlRaiseError (xmlStructuredErrorFunc schannel, + xmlGenericErrorFunc channel, + void *data, + void *ctx, + void *node, + int domain, + int code, + xmlErrorLevel level, + const char *file, + int line, + const char *str1, + const char *str2, + const char *str3, + int int1, + int col, + const char *msg, + ...) LIBXML_ATTR_FORMAT(16,17); +XMLPUBFUN void XMLCALL + __xmlSimpleError (int domain, + int code, + xmlNodePtr node, + const char *msg, + const char *extra) LIBXML_ATTR_FORMAT(4,0); +#endif +#ifdef __cplusplus +} +#endif +#endif /* __XML_ERROR_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlexports.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlexports.h new file mode 100644 index 000000000000..aceede5ec050 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlexports.h @@ -0,0 +1,77 @@ +/* + * Summary: macros for marking symbols as exportable/importable. + * Description: macros for marking symbols as exportable/importable. + * + * Copy: See Copyright for the status of this software. + */ + +#ifndef __XML_EXPORTS_H__ +#define __XML_EXPORTS_H__ + +#if defined(_WIN32) || defined(__CYGWIN__) +/** DOC_DISABLE */ + +#ifdef LIBXML_STATIC + #define XMLPUBLIC +#elif defined(IN_LIBXML) + #define XMLPUBLIC __declspec(dllexport) +#else + #define XMLPUBLIC __declspec(dllimport) +#endif + +#if defined(LIBXML_FASTCALL) + #define XMLCALL __fastcall +#else + #define XMLCALL __cdecl +#endif +#define XMLCDECL __cdecl + +/** DOC_ENABLE */ +#else /* not Windows */ + +/** + * XMLPUBLIC: + * + * Macro which declares a public symbol + */ +#define XMLPUBLIC + +/** + * XMLCALL: + * + * Macro which declares the calling convention for exported functions + */ +#define XMLCALL + +/** + * XMLCDECL: + * + * Macro which declares the calling convention for exported functions that + * use '...'. + */ +#define XMLCDECL + +#endif /* platform switch */ + +/* + * XMLPUBFUN: + * + * Macro which declares an exportable function + */ +#define XMLPUBFUN XMLPUBLIC + +/** + * XMLPUBVAR: + * + * Macro which declares an exportable variable + */ +#define XMLPUBVAR XMLPUBLIC extern + +/* Compatibility */ +#if !defined(LIBXML_DLL_IMPORT) +#define LIBXML_DLL_IMPORT XMLPUBVAR +#endif + +#endif /* __XML_EXPORTS_H__ */ + + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlmemory.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlmemory.h new file mode 100644 index 000000000000..17e375a3c9ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlmemory.h @@ -0,0 +1,224 @@ +/* + * Summary: interface for the memory allocator + * Description: provides interfaces for the memory allocator, + * including debugging capabilities. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + + +#ifndef __DEBUG_MEMORY_ALLOC__ +#define __DEBUG_MEMORY_ALLOC__ + +#include <stdio.h> +#include <libxml/xmlversion.h> + +/** + * DEBUG_MEMORY: + * + * DEBUG_MEMORY replaces the allocator with a collect and debug + * shell to the libc allocator. + * DEBUG_MEMORY should only be activated when debugging + * libxml i.e. if libxml has been configured with --with-debug-mem too. + */ +/* #define DEBUG_MEMORY_FREED */ +/* #define DEBUG_MEMORY_LOCATION */ + +#ifdef DEBUG +#ifndef DEBUG_MEMORY +#define DEBUG_MEMORY +#endif +#endif + +/** + * DEBUG_MEMORY_LOCATION: + * + * DEBUG_MEMORY_LOCATION should be activated only when debugging + * libxml i.e. if libxml has been configured with --with-debug-mem too. + */ +#ifdef DEBUG_MEMORY_LOCATION +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The XML memory wrapper support 4 basic overloadable functions. + */ +/** + * xmlFreeFunc: + * @mem: an already allocated block of memory + * + * Signature for a free() implementation. + */ +typedef void (XMLCALL *xmlFreeFunc)(void *mem); +/** + * xmlMallocFunc: + * @size: the size requested in bytes + * + * Signature for a malloc() implementation. + * + * Returns a pointer to the newly allocated block or NULL in case of error. + */ +typedef void *(LIBXML_ATTR_ALLOC_SIZE(1) XMLCALL *xmlMallocFunc)(size_t size); + +/** + * xmlReallocFunc: + * @mem: an already allocated block of memory + * @size: the new size requested in bytes + * + * Signature for a realloc() implementation. + * + * Returns a pointer to the newly reallocated block or NULL in case of error. + */ +typedef void *(XMLCALL *xmlReallocFunc)(void *mem, size_t size); + +/** + * xmlStrdupFunc: + * @str: a zero terminated string + * + * Signature for an strdup() implementation. + * + * Returns the copy of the string or NULL in case of error. + */ +typedef char *(XMLCALL *xmlStrdupFunc)(const char *str); + +/* + * The 4 interfaces used for all memory handling within libxml. +LIBXML_DLL_IMPORT xmlFreeFunc xmlFree; +LIBXML_DLL_IMPORT xmlMallocFunc xmlMalloc; +LIBXML_DLL_IMPORT xmlMallocFunc xmlMallocAtomic; +LIBXML_DLL_IMPORT xmlReallocFunc xmlRealloc; +LIBXML_DLL_IMPORT xmlStrdupFunc xmlMemStrdup; + */ + +/* + * The way to overload the existing functions. + * The xmlGc function have an extra entry for atomic block + * allocations useful for garbage collected memory allocators + */ +XMLPUBFUN int XMLCALL + xmlMemSetup (xmlFreeFunc freeFunc, + xmlMallocFunc mallocFunc, + xmlReallocFunc reallocFunc, + xmlStrdupFunc strdupFunc); +XMLPUBFUN int XMLCALL + xmlMemGet (xmlFreeFunc *freeFunc, + xmlMallocFunc *mallocFunc, + xmlReallocFunc *reallocFunc, + xmlStrdupFunc *strdupFunc); +XMLPUBFUN int XMLCALL + xmlGcMemSetup (xmlFreeFunc freeFunc, + xmlMallocFunc mallocFunc, + xmlMallocFunc mallocAtomicFunc, + xmlReallocFunc reallocFunc, + xmlStrdupFunc strdupFunc); +XMLPUBFUN int XMLCALL + xmlGcMemGet (xmlFreeFunc *freeFunc, + xmlMallocFunc *mallocFunc, + xmlMallocFunc *mallocAtomicFunc, + xmlReallocFunc *reallocFunc, + xmlStrdupFunc *strdupFunc); + +/* + * Initialization of the memory layer. + */ +XMLPUBFUN int XMLCALL + xmlInitMemory (void); + +/* + * Cleanup of the memory layer. + */ +XMLPUBFUN void XMLCALL + xmlCleanupMemory (void); +/* + * These are specific to the XML debug memory wrapper. + */ +XMLPUBFUN int XMLCALL + xmlMemUsed (void); +XMLPUBFUN int XMLCALL + xmlMemBlocks (void); +XMLPUBFUN void XMLCALL + xmlMemDisplay (FILE *fp); +XMLPUBFUN void XMLCALL + xmlMemDisplayLast(FILE *fp, long nbBytes); +XMLPUBFUN void XMLCALL + xmlMemShow (FILE *fp, int nr); +XMLPUBFUN void XMLCALL + xmlMemoryDump (void); +XMLPUBFUN void * XMLCALL + xmlMemMalloc (size_t size) LIBXML_ATTR_ALLOC_SIZE(1); +XMLPUBFUN void * XMLCALL + xmlMemRealloc (void *ptr,size_t size); +XMLPUBFUN void XMLCALL + xmlMemFree (void *ptr); +XMLPUBFUN char * XMLCALL + xmlMemoryStrdup (const char *str); +XMLPUBFUN void * XMLCALL + xmlMallocLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1); +XMLPUBFUN void * XMLCALL + xmlReallocLoc (void *ptr, size_t size, const char *file, int line); +XMLPUBFUN void * XMLCALL + xmlMallocAtomicLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1); +XMLPUBFUN char * XMLCALL + xmlMemStrdupLoc (const char *str, const char *file, int line); + + +#ifdef DEBUG_MEMORY_LOCATION +/** + * xmlMalloc: + * @size: number of bytes to allocate + * + * Wrapper for the malloc() function used in the XML library. + * + * Returns the pointer to the allocated area or NULL in case of error. + */ +#define xmlMalloc(size) xmlMallocLoc((size), __FILE__, __LINE__) +/** + * xmlMallocAtomic: + * @size: number of bytes to allocate + * + * Wrapper for the malloc() function used in the XML library for allocation + * of block not containing pointers to other areas. + * + * Returns the pointer to the allocated area or NULL in case of error. + */ +#define xmlMallocAtomic(size) xmlMallocAtomicLoc((size), __FILE__, __LINE__) +/** + * xmlRealloc: + * @ptr: pointer to the existing allocated area + * @size: number of bytes to allocate + * + * Wrapper for the realloc() function used in the XML library. + * + * Returns the pointer to the allocated area or NULL in case of error. + */ +#define xmlRealloc(ptr, size) xmlReallocLoc((ptr), (size), __FILE__, __LINE__) +/** + * xmlMemStrdup: + * @str: pointer to the existing string + * + * Wrapper for the strdup() function, xmlStrdup() is usually preferred. + * + * Returns the pointer to the allocated area or NULL in case of error. + */ +#define xmlMemStrdup(str) xmlMemStrdupLoc((str), __FILE__, __LINE__) + +#endif /* DEBUG_MEMORY_LOCATION */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#ifndef __XML_GLOBALS_H +#ifndef __XML_THREADS_H__ +#include <libxml/threads.h> +#include <libxml/globals.h> +#endif +#endif + +#endif /* __DEBUG_MEMORY_ALLOC__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlmodule.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlmodule.h new file mode 100644 index 000000000000..9667820070af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlmodule.h @@ -0,0 +1,57 @@ +/* + * Summary: dynamic module loading + * Description: basic API for dynamic module loading, used by + * libexslt added in 2.6.17 + * + * Copy: See Copyright for the status of this software. + * + * Author: Joel W. Reed + */ + +#ifndef __XML_MODULE_H__ +#define __XML_MODULE_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_MODULES_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlModulePtr: + * + * A handle to a dynamically loaded module + */ +typedef struct _xmlModule xmlModule; +typedef xmlModule *xmlModulePtr; + +/** + * xmlModuleOption: + * + * enumeration of options that can be passed down to xmlModuleOpen() + */ +typedef enum { + XML_MODULE_LAZY = 1, /* lazy binding */ + XML_MODULE_LOCAL= 2 /* local binding */ +} xmlModuleOption; + +XMLPUBFUN xmlModulePtr XMLCALL xmlModuleOpen (const char *filename, + int options); + +XMLPUBFUN int XMLCALL xmlModuleSymbol (xmlModulePtr module, + const char* name, + void **result); + +XMLPUBFUN int XMLCALL xmlModuleClose (xmlModulePtr module); + +XMLPUBFUN int XMLCALL xmlModuleFree (xmlModulePtr module); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_MODULES_ENABLED */ + +#endif /*__XML_MODULE_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlreader.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlreader.h new file mode 100644 index 000000000000..e8a8bcc9aab0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlreader.h @@ -0,0 +1,428 @@ +/* + * Summary: the XMLReader implementation + * Description: API of the XML streaming API based on C# interfaces. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XMLREADER_H__ +#define __XML_XMLREADER_H__ + +#include <libxml/xmlversion.h> +#include <libxml/tree.h> +#include <libxml/xmlIO.h> +#ifdef LIBXML_SCHEMAS_ENABLED +#include <libxml/relaxng.h> +#include <libxml/xmlschemas.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlParserSeverities: + * + * How severe an error callback is when the per-reader error callback API + * is used. + */ +typedef enum { + XML_PARSER_SEVERITY_VALIDITY_WARNING = 1, + XML_PARSER_SEVERITY_VALIDITY_ERROR = 2, + XML_PARSER_SEVERITY_WARNING = 3, + XML_PARSER_SEVERITY_ERROR = 4 +} xmlParserSeverities; + +#ifdef LIBXML_READER_ENABLED + +/** + * xmlTextReaderMode: + * + * Internal state values for the reader. + */ +typedef enum { + XML_TEXTREADER_MODE_INITIAL = 0, + XML_TEXTREADER_MODE_INTERACTIVE = 1, + XML_TEXTREADER_MODE_ERROR = 2, + XML_TEXTREADER_MODE_EOF =3, + XML_TEXTREADER_MODE_CLOSED = 4, + XML_TEXTREADER_MODE_READING = 5 +} xmlTextReaderMode; + +/** + * xmlParserProperties: + * + * Some common options to use with xmlTextReaderSetParserProp, but it + * is better to use xmlParserOption and the xmlReaderNewxxx and + * xmlReaderForxxx APIs now. + */ +typedef enum { + XML_PARSER_LOADDTD = 1, + XML_PARSER_DEFAULTATTRS = 2, + XML_PARSER_VALIDATE = 3, + XML_PARSER_SUBST_ENTITIES = 4 +} xmlParserProperties; + +/** + * xmlReaderTypes: + * + * Predefined constants for the different types of nodes. + */ +typedef enum { + XML_READER_TYPE_NONE = 0, + XML_READER_TYPE_ELEMENT = 1, + XML_READER_TYPE_ATTRIBUTE = 2, + XML_READER_TYPE_TEXT = 3, + XML_READER_TYPE_CDATA = 4, + XML_READER_TYPE_ENTITY_REFERENCE = 5, + XML_READER_TYPE_ENTITY = 6, + XML_READER_TYPE_PROCESSING_INSTRUCTION = 7, + XML_READER_TYPE_COMMENT = 8, + XML_READER_TYPE_DOCUMENT = 9, + XML_READER_TYPE_DOCUMENT_TYPE = 10, + XML_READER_TYPE_DOCUMENT_FRAGMENT = 11, + XML_READER_TYPE_NOTATION = 12, + XML_READER_TYPE_WHITESPACE = 13, + XML_READER_TYPE_SIGNIFICANT_WHITESPACE = 14, + XML_READER_TYPE_END_ELEMENT = 15, + XML_READER_TYPE_END_ENTITY = 16, + XML_READER_TYPE_XML_DECLARATION = 17 +} xmlReaderTypes; + +/** + * xmlTextReader: + * + * Structure for an xmlReader context. + */ +typedef struct _xmlTextReader xmlTextReader; + +/** + * xmlTextReaderPtr: + * + * Pointer to an xmlReader context. + */ +typedef xmlTextReader *xmlTextReaderPtr; + +/* + * Constructors & Destructor + */ +XMLPUBFUN xmlTextReaderPtr XMLCALL + xmlNewTextReader (xmlParserInputBufferPtr input, + const char *URI); +XMLPUBFUN xmlTextReaderPtr XMLCALL + xmlNewTextReaderFilename(const char *URI); + +XMLPUBFUN void XMLCALL + xmlFreeTextReader (xmlTextReaderPtr reader); + +XMLPUBFUN int XMLCALL + xmlTextReaderSetup(xmlTextReaderPtr reader, + xmlParserInputBufferPtr input, const char *URL, + const char *encoding, int options); + +/* + * Iterators + */ +XMLPUBFUN int XMLCALL + xmlTextReaderRead (xmlTextReaderPtr reader); + +#ifdef LIBXML_WRITER_ENABLED +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderReadInnerXml(xmlTextReaderPtr reader); + +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderReadOuterXml(xmlTextReaderPtr reader); +#endif + +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderReadString (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader); + +/* + * Attributes of the node + */ +XMLPUBFUN int XMLCALL + xmlTextReaderAttributeCount(xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderDepth (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderHasAttributes(xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderHasValue(xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderIsDefault (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderNodeType (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderQuoteChar (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderReadState (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader); + +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstBaseUri (xmlTextReaderPtr reader); +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstLocalName (xmlTextReaderPtr reader); +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstName (xmlTextReaderPtr reader); +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader); +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstPrefix (xmlTextReaderPtr reader); +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstXmlLang (xmlTextReaderPtr reader); +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstString (xmlTextReaderPtr reader, + const xmlChar *str); +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstValue (xmlTextReaderPtr reader); + +/* + * use the Const version of the routine for + * better performance and simpler code + */ +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderBaseUri (xmlTextReaderPtr reader); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderLocalName (xmlTextReaderPtr reader); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderName (xmlTextReaderPtr reader); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderNamespaceUri(xmlTextReaderPtr reader); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderPrefix (xmlTextReaderPtr reader); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderXmlLang (xmlTextReaderPtr reader); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderValue (xmlTextReaderPtr reader); + +/* + * Methods of the XmlTextReader + */ +XMLPUBFUN int XMLCALL + xmlTextReaderClose (xmlTextReaderPtr reader); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderGetAttributeNo (xmlTextReaderPtr reader, + int no); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderGetAttribute (xmlTextReaderPtr reader, + const xmlChar *name); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderGetAttributeNs (xmlTextReaderPtr reader, + const xmlChar *localName, + const xmlChar *namespaceURI); +XMLPUBFUN xmlParserInputBufferPtr XMLCALL + xmlTextReaderGetRemainder (xmlTextReaderPtr reader); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderLookupNamespace(xmlTextReaderPtr reader, + const xmlChar *prefix); +XMLPUBFUN int XMLCALL + xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader, + int no); +XMLPUBFUN int XMLCALL + xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader, + const xmlChar *name); +XMLPUBFUN int XMLCALL + xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader, + const xmlChar *localName, + const xmlChar *namespaceURI); +XMLPUBFUN int XMLCALL + xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderMoveToElement (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderNormalization (xmlTextReaderPtr reader); +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstEncoding (xmlTextReaderPtr reader); + +/* + * Extensions + */ +XMLPUBFUN int XMLCALL + xmlTextReaderSetParserProp (xmlTextReaderPtr reader, + int prop, + int value); +XMLPUBFUN int XMLCALL + xmlTextReaderGetParserProp (xmlTextReaderPtr reader, + int prop); +XMLPUBFUN xmlNodePtr XMLCALL + xmlTextReaderCurrentNode (xmlTextReaderPtr reader); + +XMLPUBFUN int XMLCALL + xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader); + +XMLPUBFUN int XMLCALL + xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader); + +XMLPUBFUN xmlNodePtr XMLCALL + xmlTextReaderPreserve (xmlTextReaderPtr reader); +#ifdef LIBXML_PATTERN_ENABLED +XMLPUBFUN int XMLCALL + xmlTextReaderPreservePattern(xmlTextReaderPtr reader, + const xmlChar *pattern, + const xmlChar **namespaces); +#endif /* LIBXML_PATTERN_ENABLED */ +XMLPUBFUN xmlDocPtr XMLCALL + xmlTextReaderCurrentDoc (xmlTextReaderPtr reader); +XMLPUBFUN xmlNodePtr XMLCALL + xmlTextReaderExpand (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderNext (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderNextSibling (xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderIsValid (xmlTextReaderPtr reader); +#ifdef LIBXML_SCHEMAS_ENABLED +XMLPUBFUN int XMLCALL + xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, + const char *rng); +XMLPUBFUN int XMLCALL + xmlTextReaderRelaxNGValidateCtxt(xmlTextReaderPtr reader, + xmlRelaxNGValidCtxtPtr ctxt, + int options); + +XMLPUBFUN int XMLCALL + xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, + xmlRelaxNGPtr schema); +XMLPUBFUN int XMLCALL + xmlTextReaderSchemaValidate (xmlTextReaderPtr reader, + const char *xsd); +XMLPUBFUN int XMLCALL + xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader, + xmlSchemaValidCtxtPtr ctxt, + int options); +XMLPUBFUN int XMLCALL + xmlTextReaderSetSchema (xmlTextReaderPtr reader, + xmlSchemaPtr schema); +#endif +XMLPUBFUN const xmlChar * XMLCALL + xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader); +XMLPUBFUN int XMLCALL + xmlTextReaderStandalone (xmlTextReaderPtr reader); + + +/* + * Index lookup + */ +XMLPUBFUN long XMLCALL + xmlTextReaderByteConsumed (xmlTextReaderPtr reader); + +/* + * New more complete APIs for simpler creation and reuse of readers + */ +XMLPUBFUN xmlTextReaderPtr XMLCALL + xmlReaderWalker (xmlDocPtr doc); +XMLPUBFUN xmlTextReaderPtr XMLCALL + xmlReaderForDoc (const xmlChar * cur, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlTextReaderPtr XMLCALL + xmlReaderForFile (const char *filename, + const char *encoding, + int options); +XMLPUBFUN xmlTextReaderPtr XMLCALL + xmlReaderForMemory (const char *buffer, + int size, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlTextReaderPtr XMLCALL + xmlReaderForFd (int fd, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN xmlTextReaderPtr XMLCALL + xmlReaderForIO (xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, + void *ioctx, + const char *URL, + const char *encoding, + int options); + +XMLPUBFUN int XMLCALL + xmlReaderNewWalker (xmlTextReaderPtr reader, + xmlDocPtr doc); +XMLPUBFUN int XMLCALL + xmlReaderNewDoc (xmlTextReaderPtr reader, + const xmlChar * cur, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN int XMLCALL + xmlReaderNewFile (xmlTextReaderPtr reader, + const char *filename, + const char *encoding, + int options); +XMLPUBFUN int XMLCALL + xmlReaderNewMemory (xmlTextReaderPtr reader, + const char *buffer, + int size, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN int XMLCALL + xmlReaderNewFd (xmlTextReaderPtr reader, + int fd, + const char *URL, + const char *encoding, + int options); +XMLPUBFUN int XMLCALL + xmlReaderNewIO (xmlTextReaderPtr reader, + xmlInputReadCallback ioread, + xmlInputCloseCallback ioclose, + void *ioctx, + const char *URL, + const char *encoding, + int options); +/* + * Error handling extensions + */ +typedef void * xmlTextReaderLocatorPtr; + +/** + * xmlTextReaderErrorFunc: + * @arg: the user argument + * @msg: the message + * @severity: the severity of the error + * @locator: a locator indicating where the error occurred + * + * Signature of an error callback from a reader parser + */ +typedef void (XMLCALL *xmlTextReaderErrorFunc)(void *arg, + const char *msg, + xmlParserSeverities severity, + xmlTextReaderLocatorPtr locator); +XMLPUBFUN int XMLCALL + xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator); +XMLPUBFUN xmlChar * XMLCALL + xmlTextReaderLocatorBaseURI (xmlTextReaderLocatorPtr locator); +XMLPUBFUN void XMLCALL + xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, + xmlTextReaderErrorFunc f, + void *arg); +XMLPUBFUN void XMLCALL + xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, + xmlStructuredErrorFunc f, + void *arg); +XMLPUBFUN void XMLCALL + xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, + xmlTextReaderErrorFunc *f, + void **arg); + +#endif /* LIBXML_READER_ENABLED */ + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XMLREADER_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlregexp.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlregexp.h new file mode 100644 index 000000000000..7009645a9252 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlregexp.h @@ -0,0 +1,222 @@ +/* + * Summary: regular expressions handling + * Description: basic API for libxml regular expressions handling used + * for XML Schemas and validation. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_REGEXP_H__ +#define __XML_REGEXP_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_REGEXP_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlRegexpPtr: + * + * A libxml regular expression, they can actually be far more complex + * thank the POSIX regex expressions. + */ +typedef struct _xmlRegexp xmlRegexp; +typedef xmlRegexp *xmlRegexpPtr; + +/** + * xmlRegExecCtxtPtr: + * + * A libxml progressive regular expression evaluation context + */ +typedef struct _xmlRegExecCtxt xmlRegExecCtxt; +typedef xmlRegExecCtxt *xmlRegExecCtxtPtr; + +#ifdef __cplusplus +} +#endif +#include <libxml/tree.h> +#include <libxml/dict.h> +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The POSIX like API + */ +XMLPUBFUN xmlRegexpPtr XMLCALL + xmlRegexpCompile (const xmlChar *regexp); +XMLPUBFUN void XMLCALL xmlRegFreeRegexp(xmlRegexpPtr regexp); +XMLPUBFUN int XMLCALL + xmlRegexpExec (xmlRegexpPtr comp, + const xmlChar *value); +XMLPUBFUN void XMLCALL + xmlRegexpPrint (FILE *output, + xmlRegexpPtr regexp); +XMLPUBFUN int XMLCALL + xmlRegexpIsDeterminist(xmlRegexpPtr comp); + +/** + * xmlRegExecCallbacks: + * @exec: the regular expression context + * @token: the current token string + * @transdata: transition data + * @inputdata: input data + * + * Callback function when doing a transition in the automata + */ +typedef void (*xmlRegExecCallbacks) (xmlRegExecCtxtPtr exec, + const xmlChar *token, + void *transdata, + void *inputdata); + +/* + * The progressive API + */ +XMLPUBFUN xmlRegExecCtxtPtr XMLCALL + xmlRegNewExecCtxt (xmlRegexpPtr comp, + xmlRegExecCallbacks callback, + void *data); +XMLPUBFUN void XMLCALL + xmlRegFreeExecCtxt (xmlRegExecCtxtPtr exec); +XMLPUBFUN int XMLCALL + xmlRegExecPushString(xmlRegExecCtxtPtr exec, + const xmlChar *value, + void *data); +XMLPUBFUN int XMLCALL + xmlRegExecPushString2(xmlRegExecCtxtPtr exec, + const xmlChar *value, + const xmlChar *value2, + void *data); + +XMLPUBFUN int XMLCALL + xmlRegExecNextValues(xmlRegExecCtxtPtr exec, + int *nbval, + int *nbneg, + xmlChar **values, + int *terminal); +XMLPUBFUN int XMLCALL + xmlRegExecErrInfo (xmlRegExecCtxtPtr exec, + const xmlChar **string, + int *nbval, + int *nbneg, + xmlChar **values, + int *terminal); +#ifdef LIBXML_EXPR_ENABLED +/* + * Formal regular expression handling + * Its goal is to do some formal work on content models + */ + +/* expressions are used within a context */ +typedef struct _xmlExpCtxt xmlExpCtxt; +typedef xmlExpCtxt *xmlExpCtxtPtr; + +XMLPUBFUN void XMLCALL + xmlExpFreeCtxt (xmlExpCtxtPtr ctxt); +XMLPUBFUN xmlExpCtxtPtr XMLCALL + xmlExpNewCtxt (int maxNodes, + xmlDictPtr dict); + +XMLPUBFUN int XMLCALL + xmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlExpCtxtNbCons(xmlExpCtxtPtr ctxt); + +/* Expressions are trees but the tree is opaque */ +typedef struct _xmlExpNode xmlExpNode; +typedef xmlExpNode *xmlExpNodePtr; + +typedef enum { + XML_EXP_EMPTY = 0, + XML_EXP_FORBID = 1, + XML_EXP_ATOM = 2, + XML_EXP_SEQ = 3, + XML_EXP_OR = 4, + XML_EXP_COUNT = 5 +} xmlExpNodeType; + +/* + * 2 core expressions shared by all for the empty language set + * and for the set with just the empty token + */ +XMLPUBVAR xmlExpNodePtr forbiddenExp; +XMLPUBVAR xmlExpNodePtr emptyExp; + +/* + * Expressions are reference counted internally + */ +XMLPUBFUN void XMLCALL + xmlExpFree (xmlExpCtxtPtr ctxt, + xmlExpNodePtr expr); +XMLPUBFUN void XMLCALL + xmlExpRef (xmlExpNodePtr expr); + +/* + * constructors can be either manual or from a string + */ +XMLPUBFUN xmlExpNodePtr XMLCALL + xmlExpParse (xmlExpCtxtPtr ctxt, + const char *expr); +XMLPUBFUN xmlExpNodePtr XMLCALL + xmlExpNewAtom (xmlExpCtxtPtr ctxt, + const xmlChar *name, + int len); +XMLPUBFUN xmlExpNodePtr XMLCALL + xmlExpNewOr (xmlExpCtxtPtr ctxt, + xmlExpNodePtr left, + xmlExpNodePtr right); +XMLPUBFUN xmlExpNodePtr XMLCALL + xmlExpNewSeq (xmlExpCtxtPtr ctxt, + xmlExpNodePtr left, + xmlExpNodePtr right); +XMLPUBFUN xmlExpNodePtr XMLCALL + xmlExpNewRange (xmlExpCtxtPtr ctxt, + xmlExpNodePtr subset, + int min, + int max); +/* + * The really interesting APIs + */ +XMLPUBFUN int XMLCALL + xmlExpIsNillable(xmlExpNodePtr expr); +XMLPUBFUN int XMLCALL + xmlExpMaxToken (xmlExpNodePtr expr); +XMLPUBFUN int XMLCALL + xmlExpGetLanguage(xmlExpCtxtPtr ctxt, + xmlExpNodePtr expr, + const xmlChar**langList, + int len); +XMLPUBFUN int XMLCALL + xmlExpGetStart (xmlExpCtxtPtr ctxt, + xmlExpNodePtr expr, + const xmlChar**tokList, + int len); +XMLPUBFUN xmlExpNodePtr XMLCALL + xmlExpStringDerive(xmlExpCtxtPtr ctxt, + xmlExpNodePtr expr, + const xmlChar *str, + int len); +XMLPUBFUN xmlExpNodePtr XMLCALL + xmlExpExpDerive (xmlExpCtxtPtr ctxt, + xmlExpNodePtr expr, + xmlExpNodePtr sub); +XMLPUBFUN int XMLCALL + xmlExpSubsume (xmlExpCtxtPtr ctxt, + xmlExpNodePtr expr, + xmlExpNodePtr sub); +XMLPUBFUN void XMLCALL + xmlExpDump (xmlBufferPtr buf, + xmlExpNodePtr expr); +#endif /* LIBXML_EXPR_ENABLED */ +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_REGEXP_ENABLED */ + +#endif /*__XML_REGEXP_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlsave.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlsave.h new file mode 100644 index 000000000000..fb329b22dbc2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlsave.h @@ -0,0 +1,88 @@ +/* + * Summary: the XML document serializer + * Description: API to save document or subtree of document + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XMLSAVE_H__ +#define __XML_XMLSAVE_H__ + +#include <libxml/xmlversion.h> +#include <libxml/tree.h> +#include <libxml/encoding.h> +#include <libxml/xmlIO.h> + +#ifdef LIBXML_OUTPUT_ENABLED +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlSaveOption: + * + * This is the set of XML save options that can be passed down + * to the xmlSaveToFd() and similar calls. + */ +typedef enum { + XML_SAVE_FORMAT = 1<<0, /* format save output */ + XML_SAVE_NO_DECL = 1<<1, /* drop the xml declaration */ + XML_SAVE_NO_EMPTY = 1<<2, /* no empty tags */ + XML_SAVE_NO_XHTML = 1<<3, /* disable XHTML1 specific rules */ + XML_SAVE_XHTML = 1<<4, /* force XHTML1 specific rules */ + XML_SAVE_AS_XML = 1<<5, /* force XML serialization on HTML doc */ + XML_SAVE_AS_HTML = 1<<6, /* force HTML serialization on XML doc */ + XML_SAVE_WSNONSIG = 1<<7 /* format with non-significant whitespace */ +} xmlSaveOption; + + +typedef struct _xmlSaveCtxt xmlSaveCtxt; +typedef xmlSaveCtxt *xmlSaveCtxtPtr; + +XMLPUBFUN xmlSaveCtxtPtr XMLCALL + xmlSaveToFd (int fd, + const char *encoding, + int options); +XMLPUBFUN xmlSaveCtxtPtr XMLCALL + xmlSaveToFilename (const char *filename, + const char *encoding, + int options); + +XMLPUBFUN xmlSaveCtxtPtr XMLCALL + xmlSaveToBuffer (xmlBufferPtr buffer, + const char *encoding, + int options); + +XMLPUBFUN xmlSaveCtxtPtr XMLCALL + xmlSaveToIO (xmlOutputWriteCallback iowrite, + xmlOutputCloseCallback ioclose, + void *ioctx, + const char *encoding, + int options); + +XMLPUBFUN long XMLCALL + xmlSaveDoc (xmlSaveCtxtPtr ctxt, + xmlDocPtr doc); +XMLPUBFUN long XMLCALL + xmlSaveTree (xmlSaveCtxtPtr ctxt, + xmlNodePtr node); + +XMLPUBFUN int XMLCALL + xmlSaveFlush (xmlSaveCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlSaveClose (xmlSaveCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlSaveSetEscape (xmlSaveCtxtPtr ctxt, + xmlCharEncodingOutputFunc escape); +XMLPUBFUN int XMLCALL + xmlSaveSetAttrEscape (xmlSaveCtxtPtr ctxt, + xmlCharEncodingOutputFunc escape); +#ifdef __cplusplus +} +#endif +#endif /* LIBXML_OUTPUT_ENABLED */ +#endif /* __XML_XMLSAVE_H__ */ + + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlschemas.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlschemas.h new file mode 100644 index 000000000000..b90e9d18c6e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlschemas.h @@ -0,0 +1,246 @@ +/* + * Summary: incomplete XML Schemas structure implementation + * Description: interface to the XML Schemas handling and schema validity + * checking, it is incomplete right now. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + + +#ifndef __XML_SCHEMA_H__ +#define __XML_SCHEMA_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_SCHEMAS_ENABLED + +#include <libxml/tree.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This error codes are obsolete; not used any more. + */ +typedef enum { + XML_SCHEMAS_ERR_OK = 0, + XML_SCHEMAS_ERR_NOROOT = 1, + XML_SCHEMAS_ERR_UNDECLAREDELEM, + XML_SCHEMAS_ERR_NOTTOPLEVEL, + XML_SCHEMAS_ERR_MISSING, + XML_SCHEMAS_ERR_WRONGELEM, + XML_SCHEMAS_ERR_NOTYPE, + XML_SCHEMAS_ERR_NOROLLBACK, + XML_SCHEMAS_ERR_ISABSTRACT, + XML_SCHEMAS_ERR_NOTEMPTY, + XML_SCHEMAS_ERR_ELEMCONT, + XML_SCHEMAS_ERR_HAVEDEFAULT, + XML_SCHEMAS_ERR_NOTNILLABLE, + XML_SCHEMAS_ERR_EXTRACONTENT, + XML_SCHEMAS_ERR_INVALIDATTR, + XML_SCHEMAS_ERR_INVALIDELEM, + XML_SCHEMAS_ERR_NOTDETERMINIST, + XML_SCHEMAS_ERR_CONSTRUCT, + XML_SCHEMAS_ERR_INTERNAL, + XML_SCHEMAS_ERR_NOTSIMPLE, + XML_SCHEMAS_ERR_ATTRUNKNOWN, + XML_SCHEMAS_ERR_ATTRINVALID, + XML_SCHEMAS_ERR_VALUE, + XML_SCHEMAS_ERR_FACET, + XML_SCHEMAS_ERR_, + XML_SCHEMAS_ERR_XXX +} xmlSchemaValidError; + +/* +* ATTENTION: Change xmlSchemaSetValidOptions's check +* for invalid values, if adding to the validation +* options below. +*/ +/** + * xmlSchemaValidOption: + * + * This is the set of XML Schema validation options. + */ +typedef enum { + XML_SCHEMA_VAL_VC_I_CREATE = 1<<0 + /* Default/fixed: create an attribute node + * or an element's text node on the instance. + */ +} xmlSchemaValidOption; + +/* + XML_SCHEMA_VAL_XSI_ASSEMBLE = 1<<1, + * assemble schemata using + * xsi:schemaLocation and + * xsi:noNamespaceSchemaLocation +*/ + +/** + * The schemas related types are kept internal + */ +typedef struct _xmlSchema xmlSchema; +typedef xmlSchema *xmlSchemaPtr; + +/** + * xmlSchemaValidityErrorFunc: + * @ctx: the validation context + * @msg: the message + * @...: extra arguments + * + * Signature of an error callback from an XSD validation + */ +typedef void (XMLCDECL *xmlSchemaValidityErrorFunc) + (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); + +/** + * xmlSchemaValidityWarningFunc: + * @ctx: the validation context + * @msg: the message + * @...: extra arguments + * + * Signature of a warning callback from an XSD validation + */ +typedef void (XMLCDECL *xmlSchemaValidityWarningFunc) + (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3); + +/** + * A schemas validation context + */ +typedef struct _xmlSchemaParserCtxt xmlSchemaParserCtxt; +typedef xmlSchemaParserCtxt *xmlSchemaParserCtxtPtr; + +typedef struct _xmlSchemaValidCtxt xmlSchemaValidCtxt; +typedef xmlSchemaValidCtxt *xmlSchemaValidCtxtPtr; + +/** + * xmlSchemaValidityLocatorFunc: + * @ctx: user provided context + * @file: returned file information + * @line: returned line information + * + * A schemas validation locator, a callback called by the validator. + * This is used when file or node information are not available + * to find out what file and line number are affected + * + * Returns: 0 in case of success and -1 in case of error + */ + +typedef int (XMLCDECL *xmlSchemaValidityLocatorFunc) (void *ctx, + const char **file, unsigned long *line); + +/* + * Interfaces for parsing. + */ +XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL + xmlSchemaNewParserCtxt (const char *URL); +XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL + xmlSchemaNewMemParserCtxt (const char *buffer, + int size); +XMLPUBFUN xmlSchemaParserCtxtPtr XMLCALL + xmlSchemaNewDocParserCtxt (xmlDocPtr doc); +XMLPUBFUN void XMLCALL + xmlSchemaFreeParserCtxt (xmlSchemaParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlSchemaSetParserErrors (xmlSchemaParserCtxtPtr ctxt, + xmlSchemaValidityErrorFunc err, + xmlSchemaValidityWarningFunc warn, + void *ctx); +XMLPUBFUN void XMLCALL + xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt, + xmlStructuredErrorFunc serror, + void *ctx); +XMLPUBFUN int XMLCALL + xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt, + xmlSchemaValidityErrorFunc * err, + xmlSchemaValidityWarningFunc * warn, + void **ctx); +XMLPUBFUN int XMLCALL + xmlSchemaIsValid (xmlSchemaValidCtxtPtr ctxt); + +XMLPUBFUN xmlSchemaPtr XMLCALL + xmlSchemaParse (xmlSchemaParserCtxtPtr ctxt); +XMLPUBFUN void XMLCALL + xmlSchemaFree (xmlSchemaPtr schema); +#ifdef LIBXML_OUTPUT_ENABLED +XMLPUBFUN void XMLCALL + xmlSchemaDump (FILE *output, + xmlSchemaPtr schema); +#endif /* LIBXML_OUTPUT_ENABLED */ +/* + * Interfaces for validating + */ +XMLPUBFUN void XMLCALL + xmlSchemaSetValidErrors (xmlSchemaValidCtxtPtr ctxt, + xmlSchemaValidityErrorFunc err, + xmlSchemaValidityWarningFunc warn, + void *ctx); +XMLPUBFUN void XMLCALL + xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt, + xmlStructuredErrorFunc serror, + void *ctx); +XMLPUBFUN int XMLCALL + xmlSchemaGetValidErrors (xmlSchemaValidCtxtPtr ctxt, + xmlSchemaValidityErrorFunc *err, + xmlSchemaValidityWarningFunc *warn, + void **ctx); +XMLPUBFUN int XMLCALL + xmlSchemaSetValidOptions (xmlSchemaValidCtxtPtr ctxt, + int options); +XMLPUBFUN void XMLCALL + xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt, + const char *filename); +XMLPUBFUN int XMLCALL + xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt); + +XMLPUBFUN xmlSchemaValidCtxtPtr XMLCALL + xmlSchemaNewValidCtxt (xmlSchemaPtr schema); +XMLPUBFUN void XMLCALL + xmlSchemaFreeValidCtxt (xmlSchemaValidCtxtPtr ctxt); +XMLPUBFUN int XMLCALL + xmlSchemaValidateDoc (xmlSchemaValidCtxtPtr ctxt, + xmlDocPtr instance); +XMLPUBFUN int XMLCALL + xmlSchemaValidateOneElement (xmlSchemaValidCtxtPtr ctxt, + xmlNodePtr elem); +XMLPUBFUN int XMLCALL + xmlSchemaValidateStream (xmlSchemaValidCtxtPtr ctxt, + xmlParserInputBufferPtr input, + xmlCharEncoding enc, + xmlSAXHandlerPtr sax, + void *user_data); +XMLPUBFUN int XMLCALL + xmlSchemaValidateFile (xmlSchemaValidCtxtPtr ctxt, + const char * filename, + int options); + +XMLPUBFUN xmlParserCtxtPtr XMLCALL + xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt); + +/* + * Interface to insert Schemas SAX validation in a SAX stream + */ +typedef struct _xmlSchemaSAXPlug xmlSchemaSAXPlugStruct; +typedef xmlSchemaSAXPlugStruct *xmlSchemaSAXPlugPtr; + +XMLPUBFUN xmlSchemaSAXPlugPtr XMLCALL + xmlSchemaSAXPlug (xmlSchemaValidCtxtPtr ctxt, + xmlSAXHandlerPtr *sax, + void **user_data); +XMLPUBFUN int XMLCALL + xmlSchemaSAXUnplug (xmlSchemaSAXPlugPtr plug); + + +XMLPUBFUN void XMLCALL + xmlSchemaValidateSetLocator (xmlSchemaValidCtxtPtr vctxt, + xmlSchemaValidityLocatorFunc f, + void *ctxt); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_SCHEMAS_ENABLED */ +#endif /* __XML_SCHEMA_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlschemastypes.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlschemastypes.h new file mode 100644 index 000000000000..35d48d414bea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlschemastypes.h @@ -0,0 +1,151 @@ +/* + * Summary: implementation of XML Schema Datatypes + * Description: module providing the XML Schema Datatypes implementation + * both definition and validity checking + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + + +#ifndef __XML_SCHEMA_TYPES_H__ +#define __XML_SCHEMA_TYPES_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_SCHEMAS_ENABLED + +#include <libxml/schemasInternals.h> +#include <libxml/xmlschemas.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + XML_SCHEMA_WHITESPACE_UNKNOWN = 0, + XML_SCHEMA_WHITESPACE_PRESERVE = 1, + XML_SCHEMA_WHITESPACE_REPLACE = 2, + XML_SCHEMA_WHITESPACE_COLLAPSE = 3 +} xmlSchemaWhitespaceValueType; + +XMLPUBFUN void XMLCALL + xmlSchemaInitTypes (void); +XMLPUBFUN void XMLCALL + xmlSchemaCleanupTypes (void); +XMLPUBFUN xmlSchemaTypePtr XMLCALL + xmlSchemaGetPredefinedType (const xmlChar *name, + const xmlChar *ns); +XMLPUBFUN int XMLCALL + xmlSchemaValidatePredefinedType (xmlSchemaTypePtr type, + const xmlChar *value, + xmlSchemaValPtr *val); +XMLPUBFUN int XMLCALL + xmlSchemaValPredefTypeNode (xmlSchemaTypePtr type, + const xmlChar *value, + xmlSchemaValPtr *val, + xmlNodePtr node); +XMLPUBFUN int XMLCALL + xmlSchemaValidateFacet (xmlSchemaTypePtr base, + xmlSchemaFacetPtr facet, + const xmlChar *value, + xmlSchemaValPtr val); +XMLPUBFUN int XMLCALL + xmlSchemaValidateFacetWhtsp (xmlSchemaFacetPtr facet, + xmlSchemaWhitespaceValueType fws, + xmlSchemaValType valType, + const xmlChar *value, + xmlSchemaValPtr val, + xmlSchemaWhitespaceValueType ws); +XMLPUBFUN void XMLCALL + xmlSchemaFreeValue (xmlSchemaValPtr val); +XMLPUBFUN xmlSchemaFacetPtr XMLCALL + xmlSchemaNewFacet (void); +XMLPUBFUN int XMLCALL + xmlSchemaCheckFacet (xmlSchemaFacetPtr facet, + xmlSchemaTypePtr typeDecl, + xmlSchemaParserCtxtPtr ctxt, + const xmlChar *name); +XMLPUBFUN void XMLCALL + xmlSchemaFreeFacet (xmlSchemaFacetPtr facet); +XMLPUBFUN int XMLCALL + xmlSchemaCompareValues (xmlSchemaValPtr x, + xmlSchemaValPtr y); +XMLPUBFUN xmlSchemaTypePtr XMLCALL + xmlSchemaGetBuiltInListSimpleTypeItemType (xmlSchemaTypePtr type); +XMLPUBFUN int XMLCALL + xmlSchemaValidateListSimpleTypeFacet (xmlSchemaFacetPtr facet, + const xmlChar *value, + unsigned long actualLen, + unsigned long *expectedLen); +XMLPUBFUN xmlSchemaTypePtr XMLCALL + xmlSchemaGetBuiltInType (xmlSchemaValType type); +XMLPUBFUN int XMLCALL + xmlSchemaIsBuiltInTypeFacet (xmlSchemaTypePtr type, + int facetType); +XMLPUBFUN xmlChar * XMLCALL + xmlSchemaCollapseString (const xmlChar *value); +XMLPUBFUN xmlChar * XMLCALL + xmlSchemaWhiteSpaceReplace (const xmlChar *value); +XMLPUBFUN unsigned long XMLCALL + xmlSchemaGetFacetValueAsULong (xmlSchemaFacetPtr facet); +XMLPUBFUN int XMLCALL + xmlSchemaValidateLengthFacet (xmlSchemaTypePtr type, + xmlSchemaFacetPtr facet, + const xmlChar *value, + xmlSchemaValPtr val, + unsigned long *length); +XMLPUBFUN int XMLCALL + xmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, + xmlSchemaValType valType, + const xmlChar *value, + xmlSchemaValPtr val, + unsigned long *length, + xmlSchemaWhitespaceValueType ws); +XMLPUBFUN int XMLCALL + xmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, + const xmlChar *value, + xmlSchemaValPtr *val, + xmlNodePtr node); +XMLPUBFUN int XMLCALL + xmlSchemaGetCanonValue (xmlSchemaValPtr val, + const xmlChar **retValue); +XMLPUBFUN int XMLCALL + xmlSchemaGetCanonValueWhtsp (xmlSchemaValPtr val, + const xmlChar **retValue, + xmlSchemaWhitespaceValueType ws); +XMLPUBFUN int XMLCALL + xmlSchemaValueAppend (xmlSchemaValPtr prev, + xmlSchemaValPtr cur); +XMLPUBFUN xmlSchemaValPtr XMLCALL + xmlSchemaValueGetNext (xmlSchemaValPtr cur); +XMLPUBFUN const xmlChar * XMLCALL + xmlSchemaValueGetAsString (xmlSchemaValPtr val); +XMLPUBFUN int XMLCALL + xmlSchemaValueGetAsBoolean (xmlSchemaValPtr val); +XMLPUBFUN xmlSchemaValPtr XMLCALL + xmlSchemaNewStringValue (xmlSchemaValType type, + const xmlChar *value); +XMLPUBFUN xmlSchemaValPtr XMLCALL + xmlSchemaNewNOTATIONValue (const xmlChar *name, + const xmlChar *ns); +XMLPUBFUN xmlSchemaValPtr XMLCALL + xmlSchemaNewQNameValue (const xmlChar *namespaceName, + const xmlChar *localName); +XMLPUBFUN int XMLCALL + xmlSchemaCompareValuesWhtsp (xmlSchemaValPtr x, + xmlSchemaWhitespaceValueType xws, + xmlSchemaValPtr y, + xmlSchemaWhitespaceValueType yws); +XMLPUBFUN xmlSchemaValPtr XMLCALL + xmlSchemaCopyValue (xmlSchemaValPtr val); +XMLPUBFUN xmlSchemaValType XMLCALL + xmlSchemaGetValType (xmlSchemaValPtr val); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_SCHEMAS_ENABLED */ +#endif /* __XML_SCHEMA_TYPES_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlstring.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlstring.h new file mode 100644 index 000000000000..2d0b2d1668eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlstring.h @@ -0,0 +1,140 @@ +/* + * Summary: set of routines to process strings + * Description: type and interfaces needed for the internal string handling + * of the library, especially UTF8 processing. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_STRING_H__ +#define __XML_STRING_H__ + +#include <stdarg.h> +#include <libxml/xmlversion.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xmlChar: + * + * This is a basic byte in an UTF-8 encoded string. + * It's unsigned allowing to pinpoint case where char * are assigned + * to xmlChar * (possibly making serialization back impossible). + */ +typedef unsigned char xmlChar; + +/** + * BAD_CAST: + * + * Macro to cast a string to an xmlChar * when one know its safe. + */ +#define BAD_CAST (xmlChar *) + +/* + * xmlChar handling + */ +XMLPUBFUN xmlChar * XMLCALL + xmlStrdup (const xmlChar *cur); +XMLPUBFUN xmlChar * XMLCALL + xmlStrndup (const xmlChar *cur, + int len); +XMLPUBFUN xmlChar * XMLCALL + xmlCharStrndup (const char *cur, + int len); +XMLPUBFUN xmlChar * XMLCALL + xmlCharStrdup (const char *cur); +XMLPUBFUN xmlChar * XMLCALL + xmlStrsub (const xmlChar *str, + int start, + int len); +XMLPUBFUN const xmlChar * XMLCALL + xmlStrchr (const xmlChar *str, + xmlChar val); +XMLPUBFUN const xmlChar * XMLCALL + xmlStrstr (const xmlChar *str, + const xmlChar *val); +XMLPUBFUN const xmlChar * XMLCALL + xmlStrcasestr (const xmlChar *str, + const xmlChar *val); +XMLPUBFUN int XMLCALL + xmlStrcmp (const xmlChar *str1, + const xmlChar *str2); +XMLPUBFUN int XMLCALL + xmlStrncmp (const xmlChar *str1, + const xmlChar *str2, + int len); +XMLPUBFUN int XMLCALL + xmlStrcasecmp (const xmlChar *str1, + const xmlChar *str2); +XMLPUBFUN int XMLCALL + xmlStrncasecmp (const xmlChar *str1, + const xmlChar *str2, + int len); +XMLPUBFUN int XMLCALL + xmlStrEqual (const xmlChar *str1, + const xmlChar *str2); +XMLPUBFUN int XMLCALL + xmlStrQEqual (const xmlChar *pref, + const xmlChar *name, + const xmlChar *str); +XMLPUBFUN int XMLCALL + xmlStrlen (const xmlChar *str); +XMLPUBFUN xmlChar * XMLCALL + xmlStrcat (xmlChar *cur, + const xmlChar *add); +XMLPUBFUN xmlChar * XMLCALL + xmlStrncat (xmlChar *cur, + const xmlChar *add, + int len); +XMLPUBFUN xmlChar * XMLCALL + xmlStrncatNew (const xmlChar *str1, + const xmlChar *str2, + int len); +XMLPUBFUN int XMLCALL + xmlStrPrintf (xmlChar *buf, + int len, + const char *msg, + ...) LIBXML_ATTR_FORMAT(3,4); +XMLPUBFUN int XMLCALL + xmlStrVPrintf (xmlChar *buf, + int len, + const char *msg, + va_list ap) LIBXML_ATTR_FORMAT(3,0); + +XMLPUBFUN int XMLCALL + xmlGetUTF8Char (const unsigned char *utf, + int *len); +XMLPUBFUN int XMLCALL + xmlCheckUTF8 (const unsigned char *utf); +XMLPUBFUN int XMLCALL + xmlUTF8Strsize (const xmlChar *utf, + int len); +XMLPUBFUN xmlChar * XMLCALL + xmlUTF8Strndup (const xmlChar *utf, + int len); +XMLPUBFUN const xmlChar * XMLCALL + xmlUTF8Strpos (const xmlChar *utf, + int pos); +XMLPUBFUN int XMLCALL + xmlUTF8Strloc (const xmlChar *utf, + const xmlChar *utfchar); +XMLPUBFUN xmlChar * XMLCALL + xmlUTF8Strsub (const xmlChar *utf, + int start, + int len); +XMLPUBFUN int XMLCALL + xmlUTF8Strlen (const xmlChar *utf); +XMLPUBFUN int XMLCALL + xmlUTF8Size (const xmlChar *utf); +XMLPUBFUN int XMLCALL + xmlUTF8Charcmp (const xmlChar *utf1, + const xmlChar *utf2); + +#ifdef __cplusplus +} +#endif +#endif /* __XML_STRING_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlunicode.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlunicode.h new file mode 100644 index 000000000000..01ac8b61f56a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlunicode.h @@ -0,0 +1,202 @@ +/* + * Summary: Unicode character APIs + * Description: API for the Unicode character APIs + * + * This file is automatically generated from the + * UCS description files of the Unicode Character Database + * http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html + * using the genUnicode.py Python script. + * + * Generation date: Mon Mar 27 11:09:52 2006 + * Sources: Blocks-4.0.1.txt UnicodeData-4.0.1.txt + * Author: Daniel Veillard + */ + +#ifndef __XML_UNICODE_H__ +#define __XML_UNICODE_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_UNICODE_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +XMLPUBFUN int XMLCALL xmlUCSIsAegeanNumbers (int code); +XMLPUBFUN int XMLCALL xmlUCSIsAlphabeticPresentationForms (int code); +XMLPUBFUN int XMLCALL xmlUCSIsArabic (int code); +XMLPUBFUN int XMLCALL xmlUCSIsArabicPresentationFormsA (int code); +XMLPUBFUN int XMLCALL xmlUCSIsArabicPresentationFormsB (int code); +XMLPUBFUN int XMLCALL xmlUCSIsArmenian (int code); +XMLPUBFUN int XMLCALL xmlUCSIsArrows (int code); +XMLPUBFUN int XMLCALL xmlUCSIsBasicLatin (int code); +XMLPUBFUN int XMLCALL xmlUCSIsBengali (int code); +XMLPUBFUN int XMLCALL xmlUCSIsBlockElements (int code); +XMLPUBFUN int XMLCALL xmlUCSIsBopomofo (int code); +XMLPUBFUN int XMLCALL xmlUCSIsBopomofoExtended (int code); +XMLPUBFUN int XMLCALL xmlUCSIsBoxDrawing (int code); +XMLPUBFUN int XMLCALL xmlUCSIsBraillePatterns (int code); +XMLPUBFUN int XMLCALL xmlUCSIsBuhid (int code); +XMLPUBFUN int XMLCALL xmlUCSIsByzantineMusicalSymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibility (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityForms (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityIdeographs (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCJKCompatibilityIdeographsSupplement (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCJKRadicalsSupplement (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCJKSymbolsandPunctuation (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographs (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographsExtensionA (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCJKUnifiedIdeographsExtensionB (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCherokee (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCombiningDiacriticalMarks (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCombiningDiacriticalMarksforSymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCombiningHalfMarks (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCombiningMarksforSymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsControlPictures (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCurrencySymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCypriotSyllabary (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCyrillic (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCyrillicSupplement (int code); +XMLPUBFUN int XMLCALL xmlUCSIsDeseret (int code); +XMLPUBFUN int XMLCALL xmlUCSIsDevanagari (int code); +XMLPUBFUN int XMLCALL xmlUCSIsDingbats (int code); +XMLPUBFUN int XMLCALL xmlUCSIsEnclosedAlphanumerics (int code); +XMLPUBFUN int XMLCALL xmlUCSIsEnclosedCJKLettersandMonths (int code); +XMLPUBFUN int XMLCALL xmlUCSIsEthiopic (int code); +XMLPUBFUN int XMLCALL xmlUCSIsGeneralPunctuation (int code); +XMLPUBFUN int XMLCALL xmlUCSIsGeometricShapes (int code); +XMLPUBFUN int XMLCALL xmlUCSIsGeorgian (int code); +XMLPUBFUN int XMLCALL xmlUCSIsGothic (int code); +XMLPUBFUN int XMLCALL xmlUCSIsGreek (int code); +XMLPUBFUN int XMLCALL xmlUCSIsGreekExtended (int code); +XMLPUBFUN int XMLCALL xmlUCSIsGreekandCoptic (int code); +XMLPUBFUN int XMLCALL xmlUCSIsGujarati (int code); +XMLPUBFUN int XMLCALL xmlUCSIsGurmukhi (int code); +XMLPUBFUN int XMLCALL xmlUCSIsHalfwidthandFullwidthForms (int code); +XMLPUBFUN int XMLCALL xmlUCSIsHangulCompatibilityJamo (int code); +XMLPUBFUN int XMLCALL xmlUCSIsHangulJamo (int code); +XMLPUBFUN int XMLCALL xmlUCSIsHangulSyllables (int code); +XMLPUBFUN int XMLCALL xmlUCSIsHanunoo (int code); +XMLPUBFUN int XMLCALL xmlUCSIsHebrew (int code); +XMLPUBFUN int XMLCALL xmlUCSIsHighPrivateUseSurrogates (int code); +XMLPUBFUN int XMLCALL xmlUCSIsHighSurrogates (int code); +XMLPUBFUN int XMLCALL xmlUCSIsHiragana (int code); +XMLPUBFUN int XMLCALL xmlUCSIsIPAExtensions (int code); +XMLPUBFUN int XMLCALL xmlUCSIsIdeographicDescriptionCharacters (int code); +XMLPUBFUN int XMLCALL xmlUCSIsKanbun (int code); +XMLPUBFUN int XMLCALL xmlUCSIsKangxiRadicals (int code); +XMLPUBFUN int XMLCALL xmlUCSIsKannada (int code); +XMLPUBFUN int XMLCALL xmlUCSIsKatakana (int code); +XMLPUBFUN int XMLCALL xmlUCSIsKatakanaPhoneticExtensions (int code); +XMLPUBFUN int XMLCALL xmlUCSIsKhmer (int code); +XMLPUBFUN int XMLCALL xmlUCSIsKhmerSymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLao (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLatin1Supplement (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedA (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedB (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLatinExtendedAdditional (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLetterlikeSymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLimbu (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLinearBIdeograms (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLinearBSyllabary (int code); +XMLPUBFUN int XMLCALL xmlUCSIsLowSurrogates (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMalayalam (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMathematicalAlphanumericSymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMathematicalOperators (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousMathematicalSymbolsA (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousMathematicalSymbolsB (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousSymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousSymbolsandArrows (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMiscellaneousTechnical (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMongolian (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMusicalSymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsMyanmar (int code); +XMLPUBFUN int XMLCALL xmlUCSIsNumberForms (int code); +XMLPUBFUN int XMLCALL xmlUCSIsOgham (int code); +XMLPUBFUN int XMLCALL xmlUCSIsOldItalic (int code); +XMLPUBFUN int XMLCALL xmlUCSIsOpticalCharacterRecognition (int code); +XMLPUBFUN int XMLCALL xmlUCSIsOriya (int code); +XMLPUBFUN int XMLCALL xmlUCSIsOsmanya (int code); +XMLPUBFUN int XMLCALL xmlUCSIsPhoneticExtensions (int code); +XMLPUBFUN int XMLCALL xmlUCSIsPrivateUse (int code); +XMLPUBFUN int XMLCALL xmlUCSIsPrivateUseArea (int code); +XMLPUBFUN int XMLCALL xmlUCSIsRunic (int code); +XMLPUBFUN int XMLCALL xmlUCSIsShavian (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSinhala (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSmallFormVariants (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSpacingModifierLetters (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSpecials (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSuperscriptsandSubscripts (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSupplementalArrowsA (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSupplementalArrowsB (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSupplementalMathematicalOperators (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSupplementaryPrivateUseAreaA (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSupplementaryPrivateUseAreaB (int code); +XMLPUBFUN int XMLCALL xmlUCSIsSyriac (int code); +XMLPUBFUN int XMLCALL xmlUCSIsTagalog (int code); +XMLPUBFUN int XMLCALL xmlUCSIsTagbanwa (int code); +XMLPUBFUN int XMLCALL xmlUCSIsTags (int code); +XMLPUBFUN int XMLCALL xmlUCSIsTaiLe (int code); +XMLPUBFUN int XMLCALL xmlUCSIsTaiXuanJingSymbols (int code); +XMLPUBFUN int XMLCALL xmlUCSIsTamil (int code); +XMLPUBFUN int XMLCALL xmlUCSIsTelugu (int code); +XMLPUBFUN int XMLCALL xmlUCSIsThaana (int code); +XMLPUBFUN int XMLCALL xmlUCSIsThai (int code); +XMLPUBFUN int XMLCALL xmlUCSIsTibetan (int code); +XMLPUBFUN int XMLCALL xmlUCSIsUgaritic (int code); +XMLPUBFUN int XMLCALL xmlUCSIsUnifiedCanadianAboriginalSyllabics (int code); +XMLPUBFUN int XMLCALL xmlUCSIsVariationSelectors (int code); +XMLPUBFUN int XMLCALL xmlUCSIsVariationSelectorsSupplement (int code); +XMLPUBFUN int XMLCALL xmlUCSIsYiRadicals (int code); +XMLPUBFUN int XMLCALL xmlUCSIsYiSyllables (int code); +XMLPUBFUN int XMLCALL xmlUCSIsYijingHexagramSymbols (int code); + +XMLPUBFUN int XMLCALL xmlUCSIsBlock (int code, const char *block); + +XMLPUBFUN int XMLCALL xmlUCSIsCatC (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatCc (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatCf (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatCo (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatCs (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatL (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatLl (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatLm (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatLo (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatLt (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatLu (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatM (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatMc (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatMe (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatMn (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatN (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatNd (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatNl (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatNo (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatP (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatPc (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatPd (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatPe (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatPf (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatPi (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatPo (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatPs (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatS (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatSc (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatSk (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatSm (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatSo (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatZ (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatZl (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatZp (int code); +XMLPUBFUN int XMLCALL xmlUCSIsCatZs (int code); + +XMLPUBFUN int XMLCALL xmlUCSIsCat (int code, const char *cat); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_UNICODE_ENABLED */ + +#endif /* __XML_UNICODE_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlversion.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlversion.h new file mode 100644 index 000000000000..e2dd875b78df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlversion.h @@ -0,0 +1,485 @@ +/* + * Summary: compile-time version information + * Description: compile-time version information for the XML library + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_VERSION_H__ +#define __XML_VERSION_H__ + +#include <libxml/xmlexports.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * use those to be sure nothing nasty will happen if + * your library and includes mismatch + */ +#ifndef LIBXML2_COMPILING_MSCCDEF +XMLPUBFUN void XMLCALL xmlCheckVersion(int version); +#endif /* LIBXML2_COMPILING_MSCCDEF */ + +/** + * LIBXML_DOTTED_VERSION: + * + * the version string like "1.2.3" + */ +#define LIBXML_DOTTED_VERSION "2.9.12" + +/** + * LIBXML_VERSION: + * + * the version number: 1.2.3 value is 10203 + */ +#define LIBXML_VERSION 20912 + +/** + * LIBXML_VERSION_STRING: + * + * the version number string, 1.2.3 value is "10203" + */ +#define LIBXML_VERSION_STRING "20912" + +/** + * LIBXML_VERSION_EXTRA: + * + * extra version information, used to show a CVS compilation + */ +#define LIBXML_VERSION_EXTRA "" + +/** + * LIBXML_TEST_VERSION: + * + * Macro to check that the libxml version in use is compatible with + * the version the software has been compiled against + */ +#define LIBXML_TEST_VERSION xmlCheckVersion(20912); + +#ifndef VMS +#if 0 +/** + * WITH_TRIO: + * + * defined if the trio support need to be configured in + */ +#define WITH_TRIO +#else +/** + * WITHOUT_TRIO: + * + * defined if the trio support should not be configured in + */ +#define WITHOUT_TRIO +#endif +#else /* VMS */ +/** + * WITH_TRIO: + * + * defined if the trio support need to be configured in + */ +#define WITH_TRIO 1 +#endif /* VMS */ + +/** + * LIBXML_THREAD_ENABLED: + * + * Whether the thread support is configured in + */ +#if 1 +#define LIBXML_THREAD_ENABLED +#endif + +/** + * LIBXML_THREAD_ALLOC_ENABLED: + * + * Whether the allocation hooks are per-thread + */ +#if 0 +#define LIBXML_THREAD_ALLOC_ENABLED +#endif + +/** + * LIBXML_TREE_ENABLED: + * + * Whether the DOM like tree manipulation API support is configured in + */ +#if 1 +#define LIBXML_TREE_ENABLED +#endif + +/** + * LIBXML_OUTPUT_ENABLED: + * + * Whether the serialization/saving support is configured in + */ +#if 1 +#define LIBXML_OUTPUT_ENABLED +#endif + +/** + * LIBXML_PUSH_ENABLED: + * + * Whether the push parsing interfaces are configured in + */ +#if 1 +#define LIBXML_PUSH_ENABLED +#endif + +/** + * LIBXML_READER_ENABLED: + * + * Whether the xmlReader parsing interface is configured in + */ +#if 1 +#define LIBXML_READER_ENABLED +#endif + +/** + * LIBXML_PATTERN_ENABLED: + * + * Whether the xmlPattern node selection interface is configured in + */ +#if 1 +#define LIBXML_PATTERN_ENABLED +#endif + +/** + * LIBXML_WRITER_ENABLED: + * + * Whether the xmlWriter saving interface is configured in + */ +#if 1 +#define LIBXML_WRITER_ENABLED +#endif + +/** + * LIBXML_SAX1_ENABLED: + * + * Whether the older SAX1 interface is configured in + */ +#if 1 +#define LIBXML_SAX1_ENABLED +#endif + +/** + * LIBXML_FTP_ENABLED: + * + * Whether the FTP support is configured in + */ +#if 1 +#define LIBXML_FTP_ENABLED +#endif + +/** + * LIBXML_HTTP_ENABLED: + * + * Whether the HTTP support is configured in + */ +#if 1 +#define LIBXML_HTTP_ENABLED +#endif + +/** + * LIBXML_VALID_ENABLED: + * + * Whether the DTD validation support is configured in + */ +#if 1 +#define LIBXML_VALID_ENABLED +#endif + +/** + * LIBXML_HTML_ENABLED: + * + * Whether the HTML support is configured in + */ +#if 1 +#define LIBXML_HTML_ENABLED +#endif + +/** + * LIBXML_LEGACY_ENABLED: + * + * Whether the deprecated APIs are compiled in for compatibility + */ +#if 1 +#define LIBXML_LEGACY_ENABLED +#endif + +/** + * LIBXML_C14N_ENABLED: + * + * Whether the Canonicalization support is configured in + */ +#if 1 +#define LIBXML_C14N_ENABLED +#endif + +/** + * LIBXML_CATALOG_ENABLED: + * + * Whether the Catalog support is configured in + */ +#if 1 +#define LIBXML_CATALOG_ENABLED +#endif + +/** + * LIBXML_DOCB_ENABLED: + * + * Whether the SGML Docbook support is configured in + */ +#if 1 +#define LIBXML_DOCB_ENABLED +#endif + +/** + * LIBXML_XPATH_ENABLED: + * + * Whether XPath is configured in + */ +#if 1 +#define LIBXML_XPATH_ENABLED +#endif + +/** + * LIBXML_XPTR_ENABLED: + * + * Whether XPointer is configured in + */ +#if 1 +#define LIBXML_XPTR_ENABLED +#endif + +/** + * LIBXML_XINCLUDE_ENABLED: + * + * Whether XInclude is configured in + */ +#if 1 +#define LIBXML_XINCLUDE_ENABLED +#endif + +/** + * LIBXML_ICONV_ENABLED: + * + * Whether iconv support is available + */ +#if 1 +#define LIBXML_ICONV_ENABLED +#endif + +/** + * LIBXML_ICU_ENABLED: + * + * Whether icu support is available + */ +#if 0 +#define LIBXML_ICU_ENABLED +#endif + +/** + * LIBXML_ISO8859X_ENABLED: + * + * Whether ISO-8859-* support is made available in case iconv is not + */ +#if 1 +#define LIBXML_ISO8859X_ENABLED +#endif + +/** + * LIBXML_DEBUG_ENABLED: + * + * Whether Debugging module is configured in + */ +#if 1 +#define LIBXML_DEBUG_ENABLED +#endif + +/** + * DEBUG_MEMORY_LOCATION: + * + * Whether the memory debugging is configured in + */ +#if 0 +#define DEBUG_MEMORY_LOCATION +#endif + +/** + * LIBXML_DEBUG_RUNTIME: + * + * Whether the runtime debugging is configured in + */ +#if 0 +#define LIBXML_DEBUG_RUNTIME +#endif + +/** + * LIBXML_UNICODE_ENABLED: + * + * Whether the Unicode related interfaces are compiled in + */ +#if 1 +#define LIBXML_UNICODE_ENABLED +#endif + +/** + * LIBXML_REGEXP_ENABLED: + * + * Whether the regular expressions interfaces are compiled in + */ +#if 1 +#define LIBXML_REGEXP_ENABLED +#endif + +/** + * LIBXML_AUTOMATA_ENABLED: + * + * Whether the automata interfaces are compiled in + */ +#if 1 +#define LIBXML_AUTOMATA_ENABLED +#endif + +/** + * LIBXML_EXPR_ENABLED: + * + * Whether the formal expressions interfaces are compiled in + * + * This code is unused and disabled unconditionally for now. + */ +#if 0 +#define LIBXML_EXPR_ENABLED +#endif + +/** + * LIBXML_SCHEMAS_ENABLED: + * + * Whether the Schemas validation interfaces are compiled in + */ +#if 1 +#define LIBXML_SCHEMAS_ENABLED +#endif + +/** + * LIBXML_SCHEMATRON_ENABLED: + * + * Whether the Schematron validation interfaces are compiled in + */ +#if 1 +#define LIBXML_SCHEMATRON_ENABLED +#endif + +/** + * LIBXML_MODULES_ENABLED: + * + * Whether the module interfaces are compiled in + */ +#if 1 +#define LIBXML_MODULES_ENABLED +/** + * LIBXML_MODULE_EXTENSION: + * + * the string suffix used by dynamic modules (usually shared libraries) + */ +#define LIBXML_MODULE_EXTENSION ".so" +#endif + +/** + * LIBXML_ZLIB_ENABLED: + * + * Whether the Zlib support is compiled in + */ +#if 1 +#define LIBXML_ZLIB_ENABLED +#endif + +/** + * LIBXML_LZMA_ENABLED: + * + * Whether the Lzma support is compiled in + */ +#if 0 +#define LIBXML_LZMA_ENABLED +#endif + +#ifdef __GNUC__ + +/** + * ATTRIBUTE_UNUSED: + * + * Macro used to signal to GCC unused function parameters + */ + +#ifndef ATTRIBUTE_UNUSED +# if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7))) +# define ATTRIBUTE_UNUSED __attribute__((unused)) +# else +# define ATTRIBUTE_UNUSED +# endif +#endif + +/** + * LIBXML_ATTR_ALLOC_SIZE: + * + * Macro used to indicate to GCC this is an allocator function + */ + +#ifndef LIBXML_ATTR_ALLOC_SIZE +# if (!defined(__clang__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))) +# define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x))) +# else +# define LIBXML_ATTR_ALLOC_SIZE(x) +# endif +#else +# define LIBXML_ATTR_ALLOC_SIZE(x) +#endif + +/** + * LIBXML_ATTR_FORMAT: + * + * Macro used to indicate to GCC the parameter are printf like + */ + +#ifndef LIBXML_ATTR_FORMAT +# if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3))) +# define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args))) +# else +# define LIBXML_ATTR_FORMAT(fmt,args) +# endif +#else +# define LIBXML_ATTR_FORMAT(fmt,args) +#endif + +#else /* ! __GNUC__ */ +/** + * ATTRIBUTE_UNUSED: + * + * Macro used to signal to GCC unused function parameters + */ +#define ATTRIBUTE_UNUSED +/** + * LIBXML_ATTR_ALLOC_SIZE: + * + * Macro used to indicate to GCC this is an allocator function + */ +#define LIBXML_ATTR_ALLOC_SIZE(x) +/** + * LIBXML_ATTR_FORMAT: + * + * Macro used to indicate to GCC the parameter are printf like + */ +#define LIBXML_ATTR_FORMAT(fmt,args) +#endif /* __GNUC__ */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif + + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlwriter.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlwriter.h new file mode 100644 index 000000000000..dd5add341668 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xmlwriter.h @@ -0,0 +1,488 @@ +/* + * Summary: text writing API for XML + * Description: text writing API for XML + * + * Copy: See Copyright for the status of this software. + * + * Author: Alfred Mickautsch <alfred@mickautsch.de> + */ + +#ifndef __XML_XMLWRITER_H__ +#define __XML_XMLWRITER_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_WRITER_ENABLED + +#include <stdarg.h> +#include <libxml/xmlIO.h> +#include <libxml/list.h> +#include <libxml/xmlstring.h> + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct _xmlTextWriter xmlTextWriter; + typedef xmlTextWriter *xmlTextWriterPtr; + +/* + * Constructors & Destructor + */ + XMLPUBFUN xmlTextWriterPtr XMLCALL + xmlNewTextWriter(xmlOutputBufferPtr out); + XMLPUBFUN xmlTextWriterPtr XMLCALL + xmlNewTextWriterFilename(const char *uri, int compression); + XMLPUBFUN xmlTextWriterPtr XMLCALL + xmlNewTextWriterMemory(xmlBufferPtr buf, int compression); + XMLPUBFUN xmlTextWriterPtr XMLCALL + xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt, int compression); + XMLPUBFUN xmlTextWriterPtr XMLCALL + xmlNewTextWriterDoc(xmlDocPtr * doc, int compression); + XMLPUBFUN xmlTextWriterPtr XMLCALL + xmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, + int compression); + XMLPUBFUN void XMLCALL xmlFreeTextWriter(xmlTextWriterPtr writer); + +/* + * Functions + */ + + +/* + * Document + */ + XMLPUBFUN int XMLCALL + xmlTextWriterStartDocument(xmlTextWriterPtr writer, + const char *version, + const char *encoding, + const char *standalone); + XMLPUBFUN int XMLCALL xmlTextWriterEndDocument(xmlTextWriterPtr + writer); + +/* + * Comments + */ + XMLPUBFUN int XMLCALL xmlTextWriterStartComment(xmlTextWriterPtr + writer); + XMLPUBFUN int XMLCALL xmlTextWriterEndComment(xmlTextWriterPtr writer); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer, + const char *format, ...) + LIBXML_ATTR_FORMAT(2,3); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer, + const char *format, + va_list argptr) + LIBXML_ATTR_FORMAT(2,0); + XMLPUBFUN int XMLCALL xmlTextWriterWriteComment(xmlTextWriterPtr + writer, + const xmlChar * + content); + +/* + * Elements + */ + XMLPUBFUN int XMLCALL + xmlTextWriterStartElement(xmlTextWriterPtr writer, + const xmlChar * name); + XMLPUBFUN int XMLCALL xmlTextWriterStartElementNS(xmlTextWriterPtr + writer, + const xmlChar * + prefix, + const xmlChar * name, + const xmlChar * + namespaceURI); + XMLPUBFUN int XMLCALL xmlTextWriterEndElement(xmlTextWriterPtr writer); + XMLPUBFUN int XMLCALL xmlTextWriterFullEndElement(xmlTextWriterPtr + writer); + +/* + * Elements conveniency functions + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, ...) + LIBXML_ATTR_FORMAT(3,4); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, + va_list argptr) + LIBXML_ATTR_FORMAT(3,0); + XMLPUBFUN int XMLCALL xmlTextWriterWriteElement(xmlTextWriterPtr + writer, + const xmlChar * name, + const xmlChar * + content); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer, + const xmlChar * prefix, + const xmlChar * name, + const xmlChar * namespaceURI, + const char *format, ...) + LIBXML_ATTR_FORMAT(5,6); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer, + const xmlChar * prefix, + const xmlChar * name, + const xmlChar * namespaceURI, + const char *format, + va_list argptr) + LIBXML_ATTR_FORMAT(5,0); + XMLPUBFUN int XMLCALL xmlTextWriterWriteElementNS(xmlTextWriterPtr + writer, + const xmlChar * + prefix, + const xmlChar * name, + const xmlChar * + namespaceURI, + const xmlChar * + content); + +/* + * Text + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, + const char *format, ...) + LIBXML_ATTR_FORMAT(2,3); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, + const char *format, va_list argptr) + LIBXML_ATTR_FORMAT(2,0); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteRawLen(xmlTextWriterPtr writer, + const xmlChar * content, int len); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteRaw(xmlTextWriterPtr writer, + const xmlChar * content); + XMLPUBFUN int XMLCALL xmlTextWriterWriteFormatString(xmlTextWriterPtr + writer, + const char + *format, ...) + LIBXML_ATTR_FORMAT(2,3); + XMLPUBFUN int XMLCALL xmlTextWriterWriteVFormatString(xmlTextWriterPtr + writer, + const char + *format, + va_list argptr) + LIBXML_ATTR_FORMAT(2,0); + XMLPUBFUN int XMLCALL xmlTextWriterWriteString(xmlTextWriterPtr writer, + const xmlChar * + content); + XMLPUBFUN int XMLCALL xmlTextWriterWriteBase64(xmlTextWriterPtr writer, + const char *data, + int start, int len); + XMLPUBFUN int XMLCALL xmlTextWriterWriteBinHex(xmlTextWriterPtr writer, + const char *data, + int start, int len); + +/* + * Attributes + */ + XMLPUBFUN int XMLCALL + xmlTextWriterStartAttribute(xmlTextWriterPtr writer, + const xmlChar * name); + XMLPUBFUN int XMLCALL xmlTextWriterStartAttributeNS(xmlTextWriterPtr + writer, + const xmlChar * + prefix, + const xmlChar * + name, + const xmlChar * + namespaceURI); + XMLPUBFUN int XMLCALL xmlTextWriterEndAttribute(xmlTextWriterPtr + writer); + +/* + * Attributes conveniency functions + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, ...) + LIBXML_ATTR_FORMAT(3,4); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, + va_list argptr) + LIBXML_ATTR_FORMAT(3,0); + XMLPUBFUN int XMLCALL xmlTextWriterWriteAttribute(xmlTextWriterPtr + writer, + const xmlChar * name, + const xmlChar * + content); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer, + const xmlChar * prefix, + const xmlChar * name, + const xmlChar * namespaceURI, + const char *format, ...) + LIBXML_ATTR_FORMAT(5,6); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer, + const xmlChar * prefix, + const xmlChar * name, + const xmlChar * namespaceURI, + const char *format, + va_list argptr) + LIBXML_ATTR_FORMAT(5,0); + XMLPUBFUN int XMLCALL xmlTextWriterWriteAttributeNS(xmlTextWriterPtr + writer, + const xmlChar * + prefix, + const xmlChar * + name, + const xmlChar * + namespaceURI, + const xmlChar * + content); + +/* + * PI's + */ + XMLPUBFUN int XMLCALL + xmlTextWriterStartPI(xmlTextWriterPtr writer, + const xmlChar * target); + XMLPUBFUN int XMLCALL xmlTextWriterEndPI(xmlTextWriterPtr writer); + +/* + * PI conveniency functions + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, + const xmlChar * target, + const char *format, ...) + LIBXML_ATTR_FORMAT(3,4); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer, + const xmlChar * target, + const char *format, va_list argptr) + LIBXML_ATTR_FORMAT(3,0); + XMLPUBFUN int XMLCALL + xmlTextWriterWritePI(xmlTextWriterPtr writer, + const xmlChar * target, + const xmlChar * content); + +/** + * xmlTextWriterWriteProcessingInstruction: + * + * This macro maps to xmlTextWriterWritePI + */ +#define xmlTextWriterWriteProcessingInstruction xmlTextWriterWritePI + +/* + * CDATA + */ + XMLPUBFUN int XMLCALL xmlTextWriterStartCDATA(xmlTextWriterPtr writer); + XMLPUBFUN int XMLCALL xmlTextWriterEndCDATA(xmlTextWriterPtr writer); + +/* + * CDATA conveniency functions + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, + const char *format, ...) + LIBXML_ATTR_FORMAT(2,3); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, + const char *format, va_list argptr) + LIBXML_ATTR_FORMAT(2,0); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteCDATA(xmlTextWriterPtr writer, + const xmlChar * content); + +/* + * DTD + */ + XMLPUBFUN int XMLCALL + xmlTextWriterStartDTD(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid); + XMLPUBFUN int XMLCALL xmlTextWriterEndDTD(xmlTextWriterPtr writer); + +/* + * DTD conveniency functions + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid, + const char *format, ...) + LIBXML_ATTR_FORMAT(5,6); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid, + const char *format, va_list argptr) + LIBXML_ATTR_FORMAT(5,0); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteDTD(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid, + const xmlChar * subset); + +/** + * xmlTextWriterWriteDocType: + * + * this macro maps to xmlTextWriterWriteDTD + */ +#define xmlTextWriterWriteDocType xmlTextWriterWriteDTD + +/* + * DTD element definition + */ + XMLPUBFUN int XMLCALL + xmlTextWriterStartDTDElement(xmlTextWriterPtr writer, + const xmlChar * name); + XMLPUBFUN int XMLCALL xmlTextWriterEndDTDElement(xmlTextWriterPtr + writer); + +/* + * DTD element definition conveniency functions + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, ...) + LIBXML_ATTR_FORMAT(3,4); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, + va_list argptr) + LIBXML_ATTR_FORMAT(3,0); + XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDElement(xmlTextWriterPtr + writer, + const xmlChar * + name, + const xmlChar * + content); + +/* + * DTD attribute list definition + */ + XMLPUBFUN int XMLCALL + xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, + const xmlChar * name); + XMLPUBFUN int XMLCALL xmlTextWriterEndDTDAttlist(xmlTextWriterPtr + writer); + +/* + * DTD attribute list definition conveniency functions + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, ...) + LIBXML_ATTR_FORMAT(3,4); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer, + const xmlChar * name, + const char *format, + va_list argptr) + LIBXML_ATTR_FORMAT(3,0); + XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr + writer, + const xmlChar * + name, + const xmlChar * + content); + +/* + * DTD entity definition + */ + XMLPUBFUN int XMLCALL + xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer, + int pe, const xmlChar * name); + XMLPUBFUN int XMLCALL xmlTextWriterEndDTDEntity(xmlTextWriterPtr + writer); + +/* + * DTD entity definition conveniency functions + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer, + int pe, + const xmlChar * name, + const char *format, ...) + LIBXML_ATTR_FORMAT(4,5); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer, + int pe, + const xmlChar * name, + const char *format, + va_list argptr) + LIBXML_ATTR_FORMAT(4,0); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer, + int pe, + const xmlChar * name, + const xmlChar * content); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer, + int pe, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid, + const xmlChar * ndataid); + XMLPUBFUN int XMLCALL + xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr + writer, + const xmlChar * pubid, + const xmlChar * sysid, + const xmlChar * + ndataid); + XMLPUBFUN int XMLCALL xmlTextWriterWriteDTDEntity(xmlTextWriterPtr + writer, int pe, + const xmlChar * name, + const xmlChar * + pubid, + const xmlChar * + sysid, + const xmlChar * + ndataid, + const xmlChar * + content); + +/* + * DTD notation definition + */ + XMLPUBFUN int XMLCALL + xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer, + const xmlChar * name, + const xmlChar * pubid, + const xmlChar * sysid); + +/* + * Indentation + */ + XMLPUBFUN int XMLCALL + xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent); + XMLPUBFUN int XMLCALL + xmlTextWriterSetIndentString(xmlTextWriterPtr writer, + const xmlChar * str); + + XMLPUBFUN int XMLCALL + xmlTextWriterSetQuoteChar(xmlTextWriterPtr writer, xmlChar quotechar); + + +/* + * misc + */ + XMLPUBFUN int XMLCALL xmlTextWriterFlush(xmlTextWriterPtr writer); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_WRITER_ENABLED */ + +#endif /* __XML_XMLWRITER_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xpath.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xpath.h new file mode 100644 index 000000000000..539593fa506b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xpath.h @@ -0,0 +1,564 @@ +/* + * Summary: XML Path Language implementation + * Description: API for the XML Path Language implementation + * + * XML Path Language implementation + * XPath is a language for addressing parts of an XML document, + * designed to be used by both XSLT and XPointer + * http://www.w3.org/TR/xpath + * + * Implements + * W3C Recommendation 16 November 1999 + * http://www.w3.org/TR/1999/REC-xpath-19991116 + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XPATH_H__ +#define __XML_XPATH_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_XPATH_ENABLED + +#include <libxml/xmlerror.h> +#include <libxml/tree.h> +#include <libxml/hash.h> +#endif /* LIBXML_XPATH_ENABLED */ + +#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +#ifdef __cplusplus +extern "C" { +#endif +#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED */ + +#ifdef LIBXML_XPATH_ENABLED + +typedef struct _xmlXPathContext xmlXPathContext; +typedef xmlXPathContext *xmlXPathContextPtr; +typedef struct _xmlXPathParserContext xmlXPathParserContext; +typedef xmlXPathParserContext *xmlXPathParserContextPtr; + +/** + * The set of XPath error codes. + */ + +typedef enum { + XPATH_EXPRESSION_OK = 0, + XPATH_NUMBER_ERROR, + XPATH_UNFINISHED_LITERAL_ERROR, + XPATH_START_LITERAL_ERROR, + XPATH_VARIABLE_REF_ERROR, + XPATH_UNDEF_VARIABLE_ERROR, + XPATH_INVALID_PREDICATE_ERROR, + XPATH_EXPR_ERROR, + XPATH_UNCLOSED_ERROR, + XPATH_UNKNOWN_FUNC_ERROR, + XPATH_INVALID_OPERAND, + XPATH_INVALID_TYPE, + XPATH_INVALID_ARITY, + XPATH_INVALID_CTXT_SIZE, + XPATH_INVALID_CTXT_POSITION, + XPATH_MEMORY_ERROR, + XPTR_SYNTAX_ERROR, + XPTR_RESOURCE_ERROR, + XPTR_SUB_RESOURCE_ERROR, + XPATH_UNDEF_PREFIX_ERROR, + XPATH_ENCODING_ERROR, + XPATH_INVALID_CHAR_ERROR, + XPATH_INVALID_CTXT, + XPATH_STACK_ERROR, + XPATH_FORBID_VARIABLE_ERROR, + XPATH_OP_LIMIT_EXCEEDED, + XPATH_RECURSION_LIMIT_EXCEEDED +} xmlXPathError; + +/* + * A node-set (an unordered collection of nodes without duplicates). + */ +typedef struct _xmlNodeSet xmlNodeSet; +typedef xmlNodeSet *xmlNodeSetPtr; +struct _xmlNodeSet { + int nodeNr; /* number of nodes in the set */ + int nodeMax; /* size of the array as allocated */ + xmlNodePtr *nodeTab; /* array of nodes in no particular order */ + /* @@ with_ns to check whether namespace nodes should be looked at @@ */ +}; + +/* + * An expression is evaluated to yield an object, which + * has one of the following four basic types: + * - node-set + * - boolean + * - number + * - string + * + * @@ XPointer will add more types ! + */ + +typedef enum { + XPATH_UNDEFINED = 0, + XPATH_NODESET = 1, + XPATH_BOOLEAN = 2, + XPATH_NUMBER = 3, + XPATH_STRING = 4, + XPATH_POINT = 5, + XPATH_RANGE = 6, + XPATH_LOCATIONSET = 7, + XPATH_USERS = 8, + XPATH_XSLT_TREE = 9 /* An XSLT value tree, non modifiable */ +} xmlXPathObjectType; + +typedef struct _xmlXPathObject xmlXPathObject; +typedef xmlXPathObject *xmlXPathObjectPtr; +struct _xmlXPathObject { + xmlXPathObjectType type; + xmlNodeSetPtr nodesetval; + int boolval; + double floatval; + xmlChar *stringval; + void *user; + int index; + void *user2; + int index2; +}; + +/** + * xmlXPathConvertFunc: + * @obj: an XPath object + * @type: the number of the target type + * + * A conversion function is associated to a type and used to cast + * the new type to primitive values. + * + * Returns -1 in case of error, 0 otherwise + */ +typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type); + +/* + * Extra type: a name and a conversion function. + */ + +typedef struct _xmlXPathType xmlXPathType; +typedef xmlXPathType *xmlXPathTypePtr; +struct _xmlXPathType { + const xmlChar *name; /* the type name */ + xmlXPathConvertFunc func; /* the conversion function */ +}; + +/* + * Extra variable: a name and a value. + */ + +typedef struct _xmlXPathVariable xmlXPathVariable; +typedef xmlXPathVariable *xmlXPathVariablePtr; +struct _xmlXPathVariable { + const xmlChar *name; /* the variable name */ + xmlXPathObjectPtr value; /* the value */ +}; + +/** + * xmlXPathEvalFunc: + * @ctxt: an XPath parser context + * @nargs: the number of arguments passed to the function + * + * An XPath evaluation function, the parameters are on the XPath context stack. + */ + +typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt, + int nargs); + +/* + * Extra function: a name and a evaluation function. + */ + +typedef struct _xmlXPathFunct xmlXPathFunct; +typedef xmlXPathFunct *xmlXPathFuncPtr; +struct _xmlXPathFunct { + const xmlChar *name; /* the function name */ + xmlXPathEvalFunc func; /* the evaluation function */ +}; + +/** + * xmlXPathAxisFunc: + * @ctxt: the XPath interpreter context + * @cur: the previous node being explored on that axis + * + * An axis traversal function. To traverse an axis, the engine calls + * the first time with cur == NULL and repeat until the function returns + * NULL indicating the end of the axis traversal. + * + * Returns the next node in that axis or NULL if at the end of the axis. + */ + +typedef xmlXPathObjectPtr (*xmlXPathAxisFunc) (xmlXPathParserContextPtr ctxt, + xmlXPathObjectPtr cur); + +/* + * Extra axis: a name and an axis function. + */ + +typedef struct _xmlXPathAxis xmlXPathAxis; +typedef xmlXPathAxis *xmlXPathAxisPtr; +struct _xmlXPathAxis { + const xmlChar *name; /* the axis name */ + xmlXPathAxisFunc func; /* the search function */ +}; + +/** + * xmlXPathFunction: + * @ctxt: the XPath interprestation context + * @nargs: the number of arguments + * + * An XPath function. + * The arguments (if any) are popped out from the context stack + * and the result is pushed on the stack. + */ + +typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs); + +/* + * Function and Variable Lookup. + */ + +/** + * xmlXPathVariableLookupFunc: + * @ctxt: an XPath context + * @name: name of the variable + * @ns_uri: the namespace name hosting this variable + * + * Prototype for callbacks used to plug variable lookup in the XPath + * engine. + * + * Returns the XPath object value or NULL if not found. + */ +typedef xmlXPathObjectPtr (*xmlXPathVariableLookupFunc) (void *ctxt, + const xmlChar *name, + const xmlChar *ns_uri); + +/** + * xmlXPathFuncLookupFunc: + * @ctxt: an XPath context + * @name: name of the function + * @ns_uri: the namespace name hosting this function + * + * Prototype for callbacks used to plug function lookup in the XPath + * engine. + * + * Returns the XPath function or NULL if not found. + */ +typedef xmlXPathFunction (*xmlXPathFuncLookupFunc) (void *ctxt, + const xmlChar *name, + const xmlChar *ns_uri); + +/** + * xmlXPathFlags: + * Flags for XPath engine compilation and runtime + */ +/** + * XML_XPATH_CHECKNS: + * + * check namespaces at compilation + */ +#define XML_XPATH_CHECKNS (1<<0) +/** + * XML_XPATH_NOVAR: + * + * forbid variables in expression + */ +#define XML_XPATH_NOVAR (1<<1) + +/** + * xmlXPathContext: + * + * Expression evaluation occurs with respect to a context. + * he context consists of: + * - a node (the context node) + * - a node list (the context node list) + * - a set of variable bindings + * - a function library + * - the set of namespace declarations in scope for the expression + * Following the switch to hash tables, this need to be trimmed up at + * the next binary incompatible release. + * The node may be modified when the context is passed to libxml2 + * for an XPath evaluation so you may need to initialize it again + * before the next call. + */ + +struct _xmlXPathContext { + xmlDocPtr doc; /* The current document */ + xmlNodePtr node; /* The current node */ + + int nb_variables_unused; /* unused (hash table) */ + int max_variables_unused; /* unused (hash table) */ + xmlHashTablePtr varHash; /* Hash table of defined variables */ + + int nb_types; /* number of defined types */ + int max_types; /* max number of types */ + xmlXPathTypePtr types; /* Array of defined types */ + + int nb_funcs_unused; /* unused (hash table) */ + int max_funcs_unused; /* unused (hash table) */ + xmlHashTablePtr funcHash; /* Hash table of defined funcs */ + + int nb_axis; /* number of defined axis */ + int max_axis; /* max number of axis */ + xmlXPathAxisPtr axis; /* Array of defined axis */ + + /* the namespace nodes of the context node */ + xmlNsPtr *namespaces; /* Array of namespaces */ + int nsNr; /* number of namespace in scope */ + void *user; /* function to free */ + + /* extra variables */ + int contextSize; /* the context size */ + int proximityPosition; /* the proximity position */ + + /* extra stuff for XPointer */ + int xptr; /* is this an XPointer context? */ + xmlNodePtr here; /* for here() */ + xmlNodePtr origin; /* for origin() */ + + /* the set of namespace declarations in scope for the expression */ + xmlHashTablePtr nsHash; /* The namespaces hash table */ + xmlXPathVariableLookupFunc varLookupFunc;/* variable lookup func */ + void *varLookupData; /* variable lookup data */ + + /* Possibility to link in an extra item */ + void *extra; /* needed for XSLT */ + + /* The function name and URI when calling a function */ + const xmlChar *function; + const xmlChar *functionURI; + + /* function lookup function and data */ + xmlXPathFuncLookupFunc funcLookupFunc;/* function lookup func */ + void *funcLookupData; /* function lookup data */ + + /* temporary namespace lists kept for walking the namespace axis */ + xmlNsPtr *tmpNsList; /* Array of namespaces */ + int tmpNsNr; /* number of namespaces in scope */ + + /* error reporting mechanism */ + void *userData; /* user specific data block */ + xmlStructuredErrorFunc error; /* the callback in case of errors */ + xmlError lastError; /* the last error */ + xmlNodePtr debugNode; /* the source node XSLT */ + + /* dictionary */ + xmlDictPtr dict; /* dictionary if any */ + + int flags; /* flags to control compilation */ + + /* Cache for reusal of XPath objects */ + void *cache; + + /* Resource limits */ + unsigned long opLimit; + unsigned long opCount; + int depth; +}; + +/* + * The structure of a compiled expression form is not public. + */ + +typedef struct _xmlXPathCompExpr xmlXPathCompExpr; +typedef xmlXPathCompExpr *xmlXPathCompExprPtr; + +/** + * xmlXPathParserContext: + * + * An XPath parser context. It contains pure parsing information, + * an xmlXPathContext, and the stack of objects. + */ +struct _xmlXPathParserContext { + const xmlChar *cur; /* the current char being parsed */ + const xmlChar *base; /* the full expression */ + + int error; /* error code */ + + xmlXPathContextPtr context; /* the evaluation context */ + xmlXPathObjectPtr value; /* the current value */ + int valueNr; /* number of values stacked */ + int valueMax; /* max number of values stacked */ + xmlXPathObjectPtr *valueTab; /* stack of values */ + + xmlXPathCompExprPtr comp; /* the precompiled expression */ + int xptr; /* it this an XPointer expression */ + xmlNodePtr ancestor; /* used for walking preceding axis */ + + int valueFrame; /* used to limit Pop on the stack */ +}; + +/************************************************************************ + * * + * Public API * + * * + ************************************************************************/ + +/** + * Objects and Nodesets handling + */ + +XMLPUBVAR double xmlXPathNAN; +XMLPUBVAR double xmlXPathPINF; +XMLPUBVAR double xmlXPathNINF; + +/* These macros may later turn into functions */ +/** + * xmlXPathNodeSetGetLength: + * @ns: a node-set + * + * Implement a functionality similar to the DOM NodeList.length. + * + * Returns the number of nodes in the node-set. + */ +#define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0) +/** + * xmlXPathNodeSetItem: + * @ns: a node-set + * @index: index of a node in the set + * + * Implements a functionality similar to the DOM NodeList.item(). + * + * Returns the xmlNodePtr at the given @index in @ns or NULL if + * @index is out of range (0 to length-1) + */ +#define xmlXPathNodeSetItem(ns, index) \ + ((((ns) != NULL) && \ + ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \ + (ns)->nodeTab[(index)] \ + : NULL) +/** + * xmlXPathNodeSetIsEmpty: + * @ns: a node-set + * + * Checks whether @ns is empty or not. + * + * Returns %TRUE if @ns is an empty node-set. + */ +#define xmlXPathNodeSetIsEmpty(ns) \ + (((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL)) + + +XMLPUBFUN void XMLCALL + xmlXPathFreeObject (xmlXPathObjectPtr obj); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathNodeSetCreate (xmlNodePtr val); +XMLPUBFUN void XMLCALL + xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj); +XMLPUBFUN void XMLCALL + xmlXPathFreeNodeSet (xmlNodeSetPtr obj); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathObjectCopy (xmlXPathObjectPtr val); +XMLPUBFUN int XMLCALL + xmlXPathCmpNodes (xmlNodePtr node1, + xmlNodePtr node2); +/** + * Conversion functions to basic types. + */ +XMLPUBFUN int XMLCALL + xmlXPathCastNumberToBoolean (double val); +XMLPUBFUN int XMLCALL + xmlXPathCastStringToBoolean (const xmlChar * val); +XMLPUBFUN int XMLCALL + xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns); +XMLPUBFUN int XMLCALL + xmlXPathCastToBoolean (xmlXPathObjectPtr val); + +XMLPUBFUN double XMLCALL + xmlXPathCastBooleanToNumber (int val); +XMLPUBFUN double XMLCALL + xmlXPathCastStringToNumber (const xmlChar * val); +XMLPUBFUN double XMLCALL + xmlXPathCastNodeToNumber (xmlNodePtr node); +XMLPUBFUN double XMLCALL + xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns); +XMLPUBFUN double XMLCALL + xmlXPathCastToNumber (xmlXPathObjectPtr val); + +XMLPUBFUN xmlChar * XMLCALL + xmlXPathCastBooleanToString (int val); +XMLPUBFUN xmlChar * XMLCALL + xmlXPathCastNumberToString (double val); +XMLPUBFUN xmlChar * XMLCALL + xmlXPathCastNodeToString (xmlNodePtr node); +XMLPUBFUN xmlChar * XMLCALL + xmlXPathCastNodeSetToString (xmlNodeSetPtr ns); +XMLPUBFUN xmlChar * XMLCALL + xmlXPathCastToString (xmlXPathObjectPtr val); + +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathConvertBoolean (xmlXPathObjectPtr val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathConvertNumber (xmlXPathObjectPtr val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathConvertString (xmlXPathObjectPtr val); + +/** + * Context handling. + */ +XMLPUBFUN xmlXPathContextPtr XMLCALL + xmlXPathNewContext (xmlDocPtr doc); +XMLPUBFUN void XMLCALL + xmlXPathFreeContext (xmlXPathContextPtr ctxt); +XMLPUBFUN int XMLCALL + xmlXPathContextSetCache(xmlXPathContextPtr ctxt, + int active, + int value, + int options); +/** + * Evaluation functions. + */ +XMLPUBFUN long XMLCALL + xmlXPathOrderDocElems (xmlDocPtr doc); +XMLPUBFUN int XMLCALL + xmlXPathSetContextNode (xmlNodePtr node, + xmlXPathContextPtr ctx); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathNodeEval (xmlNodePtr node, + const xmlChar *str, + xmlXPathContextPtr ctx); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathEval (const xmlChar *str, + xmlXPathContextPtr ctx); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathEvalExpression (const xmlChar *str, + xmlXPathContextPtr ctxt); +XMLPUBFUN int XMLCALL + xmlXPathEvalPredicate (xmlXPathContextPtr ctxt, + xmlXPathObjectPtr res); +/** + * Separate compilation/evaluation entry points. + */ +XMLPUBFUN xmlXPathCompExprPtr XMLCALL + xmlXPathCompile (const xmlChar *str); +XMLPUBFUN xmlXPathCompExprPtr XMLCALL + xmlXPathCtxtCompile (xmlXPathContextPtr ctxt, + const xmlChar *str); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathCompiledEval (xmlXPathCompExprPtr comp, + xmlXPathContextPtr ctx); +XMLPUBFUN int XMLCALL + xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp, + xmlXPathContextPtr ctxt); +XMLPUBFUN void XMLCALL + xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp); +#endif /* LIBXML_XPATH_ENABLED */ +#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) +XMLPUBFUN void XMLCALL + xmlXPathInit (void); +XMLPUBFUN int XMLCALL + xmlXPathIsNaN (double val); +XMLPUBFUN int XMLCALL + xmlXPathIsInf (double val); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED*/ +#endif /* ! __XML_XPATH_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xpathInternals.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xpathInternals.h new file mode 100644 index 000000000000..76a6b481572d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xpathInternals.h @@ -0,0 +1,632 @@ +/* + * Summary: internal interfaces for XML Path Language implementation + * Description: internal interfaces for XML Path Language implementation + * used to build new modules on top of XPath like XPointer and + * XSLT + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XPATH_INTERNALS_H__ +#define __XML_XPATH_INTERNALS_H__ + +#include <libxml/xmlversion.h> +#include <libxml/xpath.h> + +#ifdef LIBXML_XPATH_ENABLED + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************ + * * + * Helpers * + * * + ************************************************************************/ + +/* + * Many of these macros may later turn into functions. They + * shouldn't be used in #ifdef's preprocessor instructions. + */ +/** + * xmlXPathSetError: + * @ctxt: an XPath parser context + * @err: an xmlXPathError code + * + * Raises an error. + */ +#define xmlXPathSetError(ctxt, err) \ + { xmlXPatherror((ctxt), __FILE__, __LINE__, (err)); \ + if ((ctxt) != NULL) (ctxt)->error = (err); } + +/** + * xmlXPathSetArityError: + * @ctxt: an XPath parser context + * + * Raises an XPATH_INVALID_ARITY error. + */ +#define xmlXPathSetArityError(ctxt) \ + xmlXPathSetError((ctxt), XPATH_INVALID_ARITY) + +/** + * xmlXPathSetTypeError: + * @ctxt: an XPath parser context + * + * Raises an XPATH_INVALID_TYPE error. + */ +#define xmlXPathSetTypeError(ctxt) \ + xmlXPathSetError((ctxt), XPATH_INVALID_TYPE) + +/** + * xmlXPathGetError: + * @ctxt: an XPath parser context + * + * Get the error code of an XPath context. + * + * Returns the context error. + */ +#define xmlXPathGetError(ctxt) ((ctxt)->error) + +/** + * xmlXPathCheckError: + * @ctxt: an XPath parser context + * + * Check if an XPath error was raised. + * + * Returns true if an error has been raised, false otherwise. + */ +#define xmlXPathCheckError(ctxt) ((ctxt)->error != XPATH_EXPRESSION_OK) + +/** + * xmlXPathGetDocument: + * @ctxt: an XPath parser context + * + * Get the document of an XPath context. + * + * Returns the context document. + */ +#define xmlXPathGetDocument(ctxt) ((ctxt)->context->doc) + +/** + * xmlXPathGetContextNode: + * @ctxt: an XPath parser context + * + * Get the context node of an XPath context. + * + * Returns the context node. + */ +#define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node) + +XMLPUBFUN int XMLCALL + xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt); +XMLPUBFUN double XMLCALL + xmlXPathPopNumber (xmlXPathParserContextPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlXPathPopString (xmlXPathParserContextPtr ctxt); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt); +XMLPUBFUN void * XMLCALL + xmlXPathPopExternal (xmlXPathParserContextPtr ctxt); + +/** + * xmlXPathReturnBoolean: + * @ctxt: an XPath parser context + * @val: a boolean + * + * Pushes the boolean @val on the context stack. + */ +#define xmlXPathReturnBoolean(ctxt, val) \ + valuePush((ctxt), xmlXPathNewBoolean(val)) + +/** + * xmlXPathReturnTrue: + * @ctxt: an XPath parser context + * + * Pushes true on the context stack. + */ +#define xmlXPathReturnTrue(ctxt) xmlXPathReturnBoolean((ctxt), 1) + +/** + * xmlXPathReturnFalse: + * @ctxt: an XPath parser context + * + * Pushes false on the context stack. + */ +#define xmlXPathReturnFalse(ctxt) xmlXPathReturnBoolean((ctxt), 0) + +/** + * xmlXPathReturnNumber: + * @ctxt: an XPath parser context + * @val: a double + * + * Pushes the double @val on the context stack. + */ +#define xmlXPathReturnNumber(ctxt, val) \ + valuePush((ctxt), xmlXPathNewFloat(val)) + +/** + * xmlXPathReturnString: + * @ctxt: an XPath parser context + * @str: a string + * + * Pushes the string @str on the context stack. + */ +#define xmlXPathReturnString(ctxt, str) \ + valuePush((ctxt), xmlXPathWrapString(str)) + +/** + * xmlXPathReturnEmptyString: + * @ctxt: an XPath parser context + * + * Pushes an empty string on the stack. + */ +#define xmlXPathReturnEmptyString(ctxt) \ + valuePush((ctxt), xmlXPathNewCString("")) + +/** + * xmlXPathReturnNodeSet: + * @ctxt: an XPath parser context + * @ns: a node-set + * + * Pushes the node-set @ns on the context stack. + */ +#define xmlXPathReturnNodeSet(ctxt, ns) \ + valuePush((ctxt), xmlXPathWrapNodeSet(ns)) + +/** + * xmlXPathReturnEmptyNodeSet: + * @ctxt: an XPath parser context + * + * Pushes an empty node-set on the context stack. + */ +#define xmlXPathReturnEmptyNodeSet(ctxt) \ + valuePush((ctxt), xmlXPathNewNodeSet(NULL)) + +/** + * xmlXPathReturnExternal: + * @ctxt: an XPath parser context + * @val: user data + * + * Pushes user data on the context stack. + */ +#define xmlXPathReturnExternal(ctxt, val) \ + valuePush((ctxt), xmlXPathWrapExternal(val)) + +/** + * xmlXPathStackIsNodeSet: + * @ctxt: an XPath parser context + * + * Check if the current value on the XPath stack is a node set or + * an XSLT value tree. + * + * Returns true if the current object on the stack is a node-set. + */ +#define xmlXPathStackIsNodeSet(ctxt) \ + (((ctxt)->value != NULL) \ + && (((ctxt)->value->type == XPATH_NODESET) \ + || ((ctxt)->value->type == XPATH_XSLT_TREE))) + +/** + * xmlXPathStackIsExternal: + * @ctxt: an XPath parser context + * + * Checks if the current value on the XPath stack is an external + * object. + * + * Returns true if the current object on the stack is an external + * object. + */ +#define xmlXPathStackIsExternal(ctxt) \ + ((ctxt->value != NULL) && (ctxt->value->type == XPATH_USERS)) + +/** + * xmlXPathEmptyNodeSet: + * @ns: a node-set + * + * Empties a node-set. + */ +#define xmlXPathEmptyNodeSet(ns) \ + { while ((ns)->nodeNr > 0) (ns)->nodeTab[--(ns)->nodeNr] = NULL; } + +/** + * CHECK_ERROR: + * + * Macro to return from the function if an XPath error was detected. + */ +#define CHECK_ERROR \ + if (ctxt->error != XPATH_EXPRESSION_OK) return + +/** + * CHECK_ERROR0: + * + * Macro to return 0 from the function if an XPath error was detected. + */ +#define CHECK_ERROR0 \ + if (ctxt->error != XPATH_EXPRESSION_OK) return(0) + +/** + * XP_ERROR: + * @X: the error code + * + * Macro to raise an XPath error and return. + */ +#define XP_ERROR(X) \ + { xmlXPathErr(ctxt, X); return; } + +/** + * XP_ERROR0: + * @X: the error code + * + * Macro to raise an XPath error and return 0. + */ +#define XP_ERROR0(X) \ + { xmlXPathErr(ctxt, X); return(0); } + +/** + * CHECK_TYPE: + * @typeval: the XPath type + * + * Macro to check that the value on top of the XPath stack is of a given + * type. + */ +#define CHECK_TYPE(typeval) \ + if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ + XP_ERROR(XPATH_INVALID_TYPE) + +/** + * CHECK_TYPE0: + * @typeval: the XPath type + * + * Macro to check that the value on top of the XPath stack is of a given + * type. Return(0) in case of failure + */ +#define CHECK_TYPE0(typeval) \ + if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ + XP_ERROR0(XPATH_INVALID_TYPE) + +/** + * CHECK_ARITY: + * @x: the number of expected args + * + * Macro to check that the number of args passed to an XPath function matches. + */ +#define CHECK_ARITY(x) \ + if (ctxt == NULL) return; \ + if (nargs != (x)) \ + XP_ERROR(XPATH_INVALID_ARITY); \ + if (ctxt->valueNr < ctxt->valueFrame + (x)) \ + XP_ERROR(XPATH_STACK_ERROR); + +/** + * CAST_TO_STRING: + * + * Macro to try to cast the value on the top of the XPath stack to a string. + */ +#define CAST_TO_STRING \ + if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \ + xmlXPathStringFunction(ctxt, 1); + +/** + * CAST_TO_NUMBER: + * + * Macro to try to cast the value on the top of the XPath stack to a number. + */ +#define CAST_TO_NUMBER \ + if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \ + xmlXPathNumberFunction(ctxt, 1); + +/** + * CAST_TO_BOOLEAN: + * + * Macro to try to cast the value on the top of the XPath stack to a boolean. + */ +#define CAST_TO_BOOLEAN \ + if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \ + xmlXPathBooleanFunction(ctxt, 1); + +/* + * Variable Lookup forwarding. + */ + +XMLPUBFUN void XMLCALL + xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt, + xmlXPathVariableLookupFunc f, + void *data); + +/* + * Function Lookup forwarding. + */ + +XMLPUBFUN void XMLCALL + xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt, + xmlXPathFuncLookupFunc f, + void *funcCtxt); + +/* + * Error reporting. + */ +XMLPUBFUN void XMLCALL + xmlXPatherror (xmlXPathParserContextPtr ctxt, + const char *file, + int line, + int no); + +XMLPUBFUN void XMLCALL + xmlXPathErr (xmlXPathParserContextPtr ctxt, + int error); + +#ifdef LIBXML_DEBUG_ENABLED +XMLPUBFUN void XMLCALL + xmlXPathDebugDumpObject (FILE *output, + xmlXPathObjectPtr cur, + int depth); +XMLPUBFUN void XMLCALL + xmlXPathDebugDumpCompExpr(FILE *output, + xmlXPathCompExprPtr comp, + int depth); +#endif +/** + * NodeSet handling. + */ +XMLPUBFUN int XMLCALL + xmlXPathNodeSetContains (xmlNodeSetPtr cur, + xmlNodePtr val); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathDifference (xmlNodeSetPtr nodes1, + xmlNodeSetPtr nodes2); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathIntersection (xmlNodeSetPtr nodes1, + xmlNodeSetPtr nodes2); + +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathDistinctSorted (xmlNodeSetPtr nodes); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathDistinct (xmlNodeSetPtr nodes); + +XMLPUBFUN int XMLCALL + xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, + xmlNodeSetPtr nodes2); + +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, + xmlNodePtr node); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, + xmlNodeSetPtr nodes2); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathNodeLeading (xmlNodeSetPtr nodes, + xmlNodePtr node); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathLeading (xmlNodeSetPtr nodes1, + xmlNodeSetPtr nodes2); + +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, + xmlNodePtr node); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, + xmlNodeSetPtr nodes2); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathNodeTrailing (xmlNodeSetPtr nodes, + xmlNodePtr node); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathTrailing (xmlNodeSetPtr nodes1, + xmlNodeSetPtr nodes2); + + +/** + * Extending a context. + */ + +XMLPUBFUN int XMLCALL + xmlXPathRegisterNs (xmlXPathContextPtr ctxt, + const xmlChar *prefix, + const xmlChar *ns_uri); +XMLPUBFUN const xmlChar * XMLCALL + xmlXPathNsLookup (xmlXPathContextPtr ctxt, + const xmlChar *prefix); +XMLPUBFUN void XMLCALL + xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt); + +XMLPUBFUN int XMLCALL + xmlXPathRegisterFunc (xmlXPathContextPtr ctxt, + const xmlChar *name, + xmlXPathFunction f); +XMLPUBFUN int XMLCALL + xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt, + const xmlChar *name, + const xmlChar *ns_uri, + xmlXPathFunction f); +XMLPUBFUN int XMLCALL + xmlXPathRegisterVariable (xmlXPathContextPtr ctxt, + const xmlChar *name, + xmlXPathObjectPtr value); +XMLPUBFUN int XMLCALL + xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt, + const xmlChar *name, + const xmlChar *ns_uri, + xmlXPathObjectPtr value); +XMLPUBFUN xmlXPathFunction XMLCALL + xmlXPathFunctionLookup (xmlXPathContextPtr ctxt, + const xmlChar *name); +XMLPUBFUN xmlXPathFunction XMLCALL + xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt, + const xmlChar *name, + const xmlChar *ns_uri); +XMLPUBFUN void XMLCALL + xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathVariableLookup (xmlXPathContextPtr ctxt, + const xmlChar *name); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt, + const xmlChar *name, + const xmlChar *ns_uri); +XMLPUBFUN void XMLCALL + xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt); + +/** + * Utilities to extend XPath. + */ +XMLPUBFUN xmlXPathParserContextPtr XMLCALL + xmlXPathNewParserContext (const xmlChar *str, + xmlXPathContextPtr ctxt); +XMLPUBFUN void XMLCALL + xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt); + +/* TODO: remap to xmlXPathValuePop and Push. */ +XMLPUBFUN xmlXPathObjectPtr XMLCALL + valuePop (xmlXPathParserContextPtr ctxt); +XMLPUBFUN int XMLCALL + valuePush (xmlXPathParserContextPtr ctxt, + xmlXPathObjectPtr value); + +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathNewString (const xmlChar *val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathNewCString (const char *val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathWrapString (xmlChar *val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathWrapCString (char * val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathNewFloat (double val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathNewBoolean (int val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathNewNodeSet (xmlNodePtr val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathNewValueTree (xmlNodePtr val); +XMLPUBFUN int XMLCALL + xmlXPathNodeSetAdd (xmlNodeSetPtr cur, + xmlNodePtr val); +XMLPUBFUN int XMLCALL + xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur, + xmlNodePtr val); +XMLPUBFUN int XMLCALL + xmlXPathNodeSetAddNs (xmlNodeSetPtr cur, + xmlNodePtr node, + xmlNsPtr ns); +XMLPUBFUN void XMLCALL + xmlXPathNodeSetSort (xmlNodeSetPtr set); + +XMLPUBFUN void XMLCALL + xmlXPathRoot (xmlXPathParserContextPtr ctxt); +XMLPUBFUN void XMLCALL + xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlXPathParseName (xmlXPathParserContextPtr ctxt); +XMLPUBFUN xmlChar * XMLCALL + xmlXPathParseNCName (xmlXPathParserContextPtr ctxt); + +/* + * Existing functions. + */ +XMLPUBFUN double XMLCALL + xmlXPathStringEvalNumber (const xmlChar *str); +XMLPUBFUN int XMLCALL + xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt, + xmlXPathObjectPtr res); +XMLPUBFUN void XMLCALL + xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt); +XMLPUBFUN xmlNodeSetPtr XMLCALL + xmlXPathNodeSetMerge (xmlNodeSetPtr val1, + xmlNodeSetPtr val2); +XMLPUBFUN void XMLCALL + xmlXPathNodeSetDel (xmlNodeSetPtr cur, + xmlNodePtr val); +XMLPUBFUN void XMLCALL + xmlXPathNodeSetRemove (xmlNodeSetPtr cur, + int val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathNewNodeSetList (xmlNodeSetPtr val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathWrapNodeSet (xmlNodeSetPtr val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPathWrapExternal (void *val); + +XMLPUBFUN int XMLCALL xmlXPathEqualValues(xmlXPathParserContextPtr ctxt); +XMLPUBFUN int XMLCALL xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt); +XMLPUBFUN int XMLCALL xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict); +XMLPUBFUN void XMLCALL xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt); +XMLPUBFUN void XMLCALL xmlXPathAddValues(xmlXPathParserContextPtr ctxt); +XMLPUBFUN void XMLCALL xmlXPathSubValues(xmlXPathParserContextPtr ctxt); +XMLPUBFUN void XMLCALL xmlXPathMultValues(xmlXPathParserContextPtr ctxt); +XMLPUBFUN void XMLCALL xmlXPathDivValues(xmlXPathParserContextPtr ctxt); +XMLPUBFUN void XMLCALL xmlXPathModValues(xmlXPathParserContextPtr ctxt); + +XMLPUBFUN int XMLCALL xmlXPathIsNodeType(const xmlChar *name); + +/* + * Some of the axis navigation routines. + */ +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextSelf(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextChild(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextParent(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, + xmlNodePtr cur); +/* + * The official core of XPath functions. + */ +XMLPUBFUN void XMLCALL xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs); +XMLPUBFUN void XMLCALL xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs); + +/** + * Really internal functions + */ +XMLPUBFUN void XMLCALL xmlXPathNodeSetFreeNs(xmlNsPtr ns); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_XPATH_ENABLED */ +#endif /* ! __XML_XPATH_INTERNALS_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xpointer.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xpointer.h new file mode 100644 index 000000000000..b99112b87a10 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxml2/libxml/xpointer.h @@ -0,0 +1,114 @@ +/* + * Summary: API to handle XML Pointers + * Description: API to handle XML Pointers + * Base implementation was made accordingly to + * W3C Candidate Recommendation 7 June 2000 + * http://www.w3.org/TR/2000/CR-xptr-20000607 + * + * Added support for the element() scheme described in: + * W3C Proposed Recommendation 13 November 2002 + * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XPTR_H__ +#define __XML_XPTR_H__ + +#include <libxml/xmlversion.h> + +#ifdef LIBXML_XPTR_ENABLED + +#include <libxml/tree.h> +#include <libxml/xpath.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * A Location Set + */ +typedef struct _xmlLocationSet xmlLocationSet; +typedef xmlLocationSet *xmlLocationSetPtr; +struct _xmlLocationSet { + int locNr; /* number of locations in the set */ + int locMax; /* size of the array as allocated */ + xmlXPathObjectPtr *locTab;/* array of locations */ +}; + +/* + * Handling of location sets. + */ + +XMLPUBFUN xmlLocationSetPtr XMLCALL + xmlXPtrLocationSetCreate (xmlXPathObjectPtr val); +XMLPUBFUN void XMLCALL + xmlXPtrFreeLocationSet (xmlLocationSetPtr obj); +XMLPUBFUN xmlLocationSetPtr XMLCALL + xmlXPtrLocationSetMerge (xmlLocationSetPtr val1, + xmlLocationSetPtr val2); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrNewRange (xmlNodePtr start, + int startindex, + xmlNodePtr end, + int endindex); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrNewRangePoints (xmlXPathObjectPtr start, + xmlXPathObjectPtr end); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrNewRangeNodePoint (xmlNodePtr start, + xmlXPathObjectPtr end); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrNewRangePointNode (xmlXPathObjectPtr start, + xmlNodePtr end); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrNewRangeNodes (xmlNodePtr start, + xmlNodePtr end); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrNewLocationSetNodes (xmlNodePtr start, + xmlNodePtr end); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrNewLocationSetNodeSet(xmlNodeSetPtr set); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrNewRangeNodeObject (xmlNodePtr start, + xmlXPathObjectPtr end); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrNewCollapsedRange (xmlNodePtr start); +XMLPUBFUN void XMLCALL + xmlXPtrLocationSetAdd (xmlLocationSetPtr cur, + xmlXPathObjectPtr val); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrWrapLocationSet (xmlLocationSetPtr val); +XMLPUBFUN void XMLCALL + xmlXPtrLocationSetDel (xmlLocationSetPtr cur, + xmlXPathObjectPtr val); +XMLPUBFUN void XMLCALL + xmlXPtrLocationSetRemove (xmlLocationSetPtr cur, + int val); + +/* + * Functions. + */ +XMLPUBFUN xmlXPathContextPtr XMLCALL + xmlXPtrNewContext (xmlDocPtr doc, + xmlNodePtr here, + xmlNodePtr origin); +XMLPUBFUN xmlXPathObjectPtr XMLCALL + xmlXPtrEval (const xmlChar *str, + xmlXPathContextPtr ctx); +XMLPUBFUN void XMLCALL + xmlXPtrRangeToFunction (xmlXPathParserContextPtr ctxt, + int nargs); +XMLPUBFUN xmlNodePtr XMLCALL + xmlXPtrBuildNodeList (xmlXPathObjectPtr obj); +XMLPUBFUN void XMLCALL + xmlXPtrEvalRangePredicate (xmlXPathParserContextPtr ctxt); +#ifdef __cplusplus +} +#endif + +#endif /* LIBXML_XPTR_ENABLED */ +#endif /* __XML_XPTR_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/attributes.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/attributes.h new file mode 100644 index 000000000000..05b8a6e938ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/attributes.h @@ -0,0 +1,38 @@ +/* + * Summary: interface for the XSLT attribute handling + * Description: this module handles the specificities of attribute + * and attribute groups processing. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_ATTRIBUTES_H__ +#define __XML_XSLT_ATTRIBUTES_H__ + +#include <libxml/tree.h> +#include "xsltexports.h" + +#ifdef __cplusplus +extern "C" { +#endif + +XSLTPUBFUN void XSLTCALL + xsltParseStylesheetAttributeSet (xsltStylesheetPtr style, + xmlNodePtr cur); +XSLTPUBFUN void XSLTCALL + xsltFreeAttributeSetsHashes (xsltStylesheetPtr style); +XSLTPUBFUN void XSLTCALL + xsltApplyAttributeSet (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + const xmlChar *attributes); +XSLTPUBFUN void XSLTCALL + xsltResolveStylesheetAttributeSet(xsltStylesheetPtr style); +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_ATTRIBUTES_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/documents.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/documents.h new file mode 100644 index 000000000000..ae7c0ca24b93 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/documents.h @@ -0,0 +1,93 @@ +/* + * Summary: interface for the document handling + * Description: implements document loading and cache (multiple + * document() reference for the same resources must + * be equal. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_DOCUMENTS_H__ +#define __XML_XSLT_DOCUMENTS_H__ + +#include <libxml/tree.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +XSLTPUBFUN xsltDocumentPtr XSLTCALL + xsltNewDocument (xsltTransformContextPtr ctxt, + xmlDocPtr doc); +XSLTPUBFUN xsltDocumentPtr XSLTCALL + xsltLoadDocument (xsltTransformContextPtr ctxt, + const xmlChar *URI); +XSLTPUBFUN xsltDocumentPtr XSLTCALL + xsltFindDocument (xsltTransformContextPtr ctxt, + xmlDocPtr doc); +XSLTPUBFUN void XSLTCALL + xsltFreeDocuments (xsltTransformContextPtr ctxt); + +XSLTPUBFUN xsltDocumentPtr XSLTCALL + xsltLoadStyleDocument (xsltStylesheetPtr style, + const xmlChar *URI); +XSLTPUBFUN xsltDocumentPtr XSLTCALL + xsltNewStyleDocument (xsltStylesheetPtr style, + xmlDocPtr doc); +XSLTPUBFUN void XSLTCALL + xsltFreeStyleDocuments (xsltStylesheetPtr style); + +/* + * Hooks for document loading + */ + +/** + * xsltLoadType: + * + * Enum defining the kind of loader requirement. + */ +typedef enum { + XSLT_LOAD_START = 0, /* loading for a top stylesheet */ + XSLT_LOAD_STYLESHEET = 1, /* loading for a stylesheet include/import */ + XSLT_LOAD_DOCUMENT = 2 /* loading document at transformation time */ +} xsltLoadType; + +/** + * xsltDocLoaderFunc: + * @URI: the URI of the document to load + * @dict: the dictionary to use when parsing that document + * @options: parsing options, a set of xmlParserOption + * @ctxt: the context, either a stylesheet or a transformation context + * @type: the xsltLoadType indicating the kind of loading required + * + * An xsltDocLoaderFunc is a signature for a function which can be + * registered to load document not provided by the compilation or + * transformation API themselve, for example when an xsl:import, + * xsl:include is found at compilation time or when a document() + * call is made at runtime. + * + * Returns the pointer to the document (which will be modified and + * freed by the engine later), or NULL in case of error. + */ +typedef xmlDocPtr (*xsltDocLoaderFunc) (const xmlChar *URI, + xmlDictPtr dict, + int options, + void *ctxt, + xsltLoadType type); + +XSLTPUBFUN void XSLTCALL + xsltSetLoaderFunc (xsltDocLoaderFunc f); + +/* the loader may be needed by extension libraries so it is exported */ +XSLTPUBVAR xsltDocLoaderFunc xsltDocDefaultLoader; + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_DOCUMENTS_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/extensions.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/extensions.h new file mode 100644 index 000000000000..900779c34c03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/extensions.h @@ -0,0 +1,262 @@ +/* + * Summary: interface for the extension support + * Description: This provide the API needed for simple and module + * extension support. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_EXTENSION_H__ +#define __XML_XSLT_EXTENSION_H__ + +#include <libxml/xpath.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Extension Modules API. + */ + +/** + * xsltInitGlobals: + * + * Initialize the global variables for extensions + * + */ + +XSLTPUBFUN void XSLTCALL + xsltInitGlobals (void); + +/** + * xsltStyleExtInitFunction: + * @ctxt: an XSLT stylesheet + * @URI: the namespace URI for the extension + * + * A function called at initialization time of an XSLT extension module. + * + * Returns a pointer to the module specific data for this transformation. + */ +typedef void * (*xsltStyleExtInitFunction) (xsltStylesheetPtr style, + const xmlChar *URI); + +/** + * xsltStyleExtShutdownFunction: + * @ctxt: an XSLT stylesheet + * @URI: the namespace URI for the extension + * @data: the data associated to this module + * + * A function called at shutdown time of an XSLT extension module. + */ +typedef void (*xsltStyleExtShutdownFunction) (xsltStylesheetPtr style, + const xmlChar *URI, + void *data); + +/** + * xsltExtInitFunction: + * @ctxt: an XSLT transformation context + * @URI: the namespace URI for the extension + * + * A function called at initialization time of an XSLT extension module. + * + * Returns a pointer to the module specific data for this transformation. + */ +typedef void * (*xsltExtInitFunction) (xsltTransformContextPtr ctxt, + const xmlChar *URI); + +/** + * xsltExtShutdownFunction: + * @ctxt: an XSLT transformation context + * @URI: the namespace URI for the extension + * @data: the data associated to this module + * + * A function called at shutdown time of an XSLT extension module. + */ +typedef void (*xsltExtShutdownFunction) (xsltTransformContextPtr ctxt, + const xmlChar *URI, + void *data); + +XSLTPUBFUN int XSLTCALL + xsltRegisterExtModule (const xmlChar *URI, + xsltExtInitFunction initFunc, + xsltExtShutdownFunction shutdownFunc); +XSLTPUBFUN int XSLTCALL + xsltRegisterExtModuleFull + (const xmlChar * URI, + xsltExtInitFunction initFunc, + xsltExtShutdownFunction shutdownFunc, + xsltStyleExtInitFunction styleInitFunc, + xsltStyleExtShutdownFunction styleShutdownFunc); + +XSLTPUBFUN int XSLTCALL + xsltUnregisterExtModule (const xmlChar * URI); + +XSLTPUBFUN void * XSLTCALL + xsltGetExtData (xsltTransformContextPtr ctxt, + const xmlChar *URI); + +XSLTPUBFUN void * XSLTCALL + xsltStyleGetExtData (xsltStylesheetPtr style, + const xmlChar *URI); +#ifdef XSLT_REFACTORED +XSLTPUBFUN void * XSLTCALL + xsltStyleStylesheetLevelGetExtData( + xsltStylesheetPtr style, + const xmlChar * URI); +#endif +XSLTPUBFUN void XSLTCALL + xsltShutdownCtxtExts (xsltTransformContextPtr ctxt); + +XSLTPUBFUN void XSLTCALL + xsltShutdownExts (xsltStylesheetPtr style); + +XSLTPUBFUN xsltTransformContextPtr XSLTCALL + xsltXPathGetTransformContext + (xmlXPathParserContextPtr ctxt); + +/* + * extension functions +*/ +XSLTPUBFUN int XSLTCALL + xsltRegisterExtModuleFunction + (const xmlChar *name, + const xmlChar *URI, + xmlXPathFunction function); +XSLTPUBFUN xmlXPathFunction XSLTCALL + xsltExtModuleFunctionLookup (const xmlChar *name, + const xmlChar *URI); +XSLTPUBFUN int XSLTCALL + xsltUnregisterExtModuleFunction + (const xmlChar *name, + const xmlChar *URI); + +/* + * extension elements + */ +typedef xsltElemPreCompPtr (*xsltPreComputeFunction) + (xsltStylesheetPtr style, + xmlNodePtr inst, + xsltTransformFunction function); + +XSLTPUBFUN xsltElemPreCompPtr XSLTCALL + xsltNewElemPreComp (xsltStylesheetPtr style, + xmlNodePtr inst, + xsltTransformFunction function); +XSLTPUBFUN void XSLTCALL + xsltInitElemPreComp (xsltElemPreCompPtr comp, + xsltStylesheetPtr style, + xmlNodePtr inst, + xsltTransformFunction function, + xsltElemPreCompDeallocator freeFunc); + +XSLTPUBFUN int XSLTCALL + xsltRegisterExtModuleElement + (const xmlChar *name, + const xmlChar *URI, + xsltPreComputeFunction precomp, + xsltTransformFunction transform); +XSLTPUBFUN xsltTransformFunction XSLTCALL + xsltExtElementLookup (xsltTransformContextPtr ctxt, + const xmlChar *name, + const xmlChar *URI); +XSLTPUBFUN xsltTransformFunction XSLTCALL + xsltExtModuleElementLookup + (const xmlChar *name, + const xmlChar *URI); +XSLTPUBFUN xsltPreComputeFunction XSLTCALL + xsltExtModuleElementPreComputeLookup + (const xmlChar *name, + const xmlChar *URI); +XSLTPUBFUN int XSLTCALL + xsltUnregisterExtModuleElement + (const xmlChar *name, + const xmlChar *URI); + +/* + * top-level elements + */ +typedef void (*xsltTopLevelFunction) (xsltStylesheetPtr style, + xmlNodePtr inst); + +XSLTPUBFUN int XSLTCALL + xsltRegisterExtModuleTopLevel + (const xmlChar *name, + const xmlChar *URI, + xsltTopLevelFunction function); +XSLTPUBFUN xsltTopLevelFunction XSLTCALL + xsltExtModuleTopLevelLookup + (const xmlChar *name, + const xmlChar *URI); +XSLTPUBFUN int XSLTCALL + xsltUnregisterExtModuleTopLevel + (const xmlChar *name, + const xmlChar *URI); + + +/* These 2 functions are deprecated for use within modules. */ +XSLTPUBFUN int XSLTCALL + xsltRegisterExtFunction (xsltTransformContextPtr ctxt, + const xmlChar *name, + const xmlChar *URI, + xmlXPathFunction function); +XSLTPUBFUN int XSLTCALL + xsltRegisterExtElement (xsltTransformContextPtr ctxt, + const xmlChar *name, + const xmlChar *URI, + xsltTransformFunction function); + +/* + * Extension Prefix handling API. + * Those are used by the XSLT (pre)processor. + */ + +XSLTPUBFUN int XSLTCALL + xsltRegisterExtPrefix (xsltStylesheetPtr style, + const xmlChar *prefix, + const xmlChar *URI); +XSLTPUBFUN int XSLTCALL + xsltCheckExtPrefix (xsltStylesheetPtr style, + const xmlChar *URI); +XSLTPUBFUN int XSLTCALL + xsltCheckExtURI (xsltStylesheetPtr style, + const xmlChar *URI); +XSLTPUBFUN int XSLTCALL + xsltInitCtxtExts (xsltTransformContextPtr ctxt); +XSLTPUBFUN void XSLTCALL + xsltFreeCtxtExts (xsltTransformContextPtr ctxt); +XSLTPUBFUN void XSLTCALL + xsltFreeExts (xsltStylesheetPtr style); + +XSLTPUBFUN xsltElemPreCompPtr XSLTCALL + xsltPreComputeExtModuleElement + (xsltStylesheetPtr style, + xmlNodePtr inst); +/* + * Extension Infos access. + * Used by exslt initialisation + */ + +XSLTPUBFUN xmlHashTablePtr XSLTCALL + xsltGetExtInfo (xsltStylesheetPtr style, + const xmlChar *URI); + +/** + * Test module http://xmlsoft.org/XSLT/ + */ +XSLTPUBFUN void XSLTCALL + xsltRegisterTestModule (void); +XSLTPUBFUN void XSLTCALL + xsltDebugDumpExtensions (FILE * output); + + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_EXTENSION_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/extra.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/extra.h new file mode 100644 index 000000000000..e512fd03dd4b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/extra.h @@ -0,0 +1,72 @@ +/* + * Summary: interface for the non-standard features + * Description: implement some extension outside the XSLT namespace + * but not EXSLT with is in a different library. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_EXTRA_H__ +#define __XML_XSLT_EXTRA_H__ + +#include <libxml/xpath.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * XSLT_LIBXSLT_NAMESPACE: + * + * This is the libxslt namespace for specific extensions. + */ +#define XSLT_LIBXSLT_NAMESPACE ((xmlChar *) "http://xmlsoft.org/XSLT/namespace") + +/** + * XSLT_SAXON_NAMESPACE: + * + * This is Michael Kay's Saxon processor namespace for extensions. + */ +#define XSLT_SAXON_NAMESPACE ((xmlChar *) "http://icl.com/saxon") + +/** + * XSLT_XT_NAMESPACE: + * + * This is James Clark's XT processor namespace for extensions. + */ +#define XSLT_XT_NAMESPACE ((xmlChar *) "http://www.jclark.com/xt") + +/** + * XSLT_XALAN_NAMESPACE: + * + * This is the Apache project XALAN processor namespace for extensions. + */ +#define XSLT_XALAN_NAMESPACE ((xmlChar *) \ + "org.apache.xalan.xslt.extensions.Redirect") + + +XSLTPUBFUN void XSLTCALL + xsltFunctionNodeSet (xmlXPathParserContextPtr ctxt, + int nargs); +XSLTPUBFUN void XSLTCALL + xsltDebug (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); + + +XSLTPUBFUN void XSLTCALL + xsltRegisterExtras (xsltTransformContextPtr ctxt); +XSLTPUBFUN void XSLTCALL + xsltRegisterAllExtras (void); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_EXTRA_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/functions.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/functions.h new file mode 100644 index 000000000000..5455b7f47802 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/functions.h @@ -0,0 +1,78 @@ +/* + * Summary: interface for the XSLT functions not from XPath + * Description: a set of extra functions coming from XSLT but not in XPath + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard and Bjorn Reese <breese@users.sourceforge.net> + */ + +#ifndef __XML_XSLT_FUNCTIONS_H__ +#define __XML_XSLT_FUNCTIONS_H__ + +#include <libxml/xpath.h> +#include <libxml/xpathInternals.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * XSLT_REGISTER_FUNCTION_LOOKUP: + * + * Registering macro, not general purpose at all but used in different modules. + */ +#define XSLT_REGISTER_FUNCTION_LOOKUP(ctxt) \ + xmlXPathRegisterFuncLookup((ctxt)->xpathCtxt, \ + xsltXPathFunctionLookup, \ + (void *)(ctxt->xpathCtxt)); + +XSLTPUBFUN xmlXPathFunction XSLTCALL + xsltXPathFunctionLookup (void *vctxt, + const xmlChar *name, + const xmlChar *ns_uri); + +/* + * Interfaces for the functions implementations. + */ + +XSLTPUBFUN void XSLTCALL + xsltDocumentFunction (xmlXPathParserContextPtr ctxt, + int nargs); +XSLTPUBFUN void XSLTCALL + xsltKeyFunction (xmlXPathParserContextPtr ctxt, + int nargs); +XSLTPUBFUN void XSLTCALL + xsltUnparsedEntityURIFunction (xmlXPathParserContextPtr ctxt, + int nargs); +XSLTPUBFUN void XSLTCALL + xsltFormatNumberFunction (xmlXPathParserContextPtr ctxt, + int nargs); +XSLTPUBFUN void XSLTCALL + xsltGenerateIdFunction (xmlXPathParserContextPtr ctxt, + int nargs); +XSLTPUBFUN void XSLTCALL + xsltSystemPropertyFunction (xmlXPathParserContextPtr ctxt, + int nargs); +XSLTPUBFUN void XSLTCALL + xsltElementAvailableFunction (xmlXPathParserContextPtr ctxt, + int nargs); +XSLTPUBFUN void XSLTCALL + xsltFunctionAvailableFunction (xmlXPathParserContextPtr ctxt, + int nargs); + +/* + * And the registration + */ + +XSLTPUBFUN void XSLTCALL + xsltRegisterAllFunctions (xmlXPathContextPtr ctxt); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_FUNCTIONS_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/imports.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/imports.h new file mode 100644 index 000000000000..95e44e51da10 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/imports.h @@ -0,0 +1,75 @@ +/* + * Summary: interface for the XSLT import support + * Description: macros and fuctions needed to implement and + * access the import tree + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_IMPORTS_H__ +#define __XML_XSLT_IMPORTS_H__ + +#include <libxml/tree.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * XSLT_GET_IMPORT_PTR: + * + * A macro to import pointers from the stylesheet cascading order. + */ +#define XSLT_GET_IMPORT_PTR(res, style, name) { \ + xsltStylesheetPtr st = style; \ + res = NULL; \ + while (st != NULL) { \ + if (st->name != NULL) { res = st->name; break; } \ + st = xsltNextImport(st); \ + }} + +/** + * XSLT_GET_IMPORT_INT: + * + * A macro to import intergers from the stylesheet cascading order. + */ +#define XSLT_GET_IMPORT_INT(res, style, name) { \ + xsltStylesheetPtr st = style; \ + res = -1; \ + while (st != NULL) { \ + if (st->name != -1) { res = st->name; break; } \ + st = xsltNextImport(st); \ + }} + +/* + * Module interfaces + */ +XSLTPUBFUN int XSLTCALL + xsltParseStylesheetImport(xsltStylesheetPtr style, + xmlNodePtr cur); +XSLTPUBFUN int XSLTCALL + xsltParseStylesheetInclude + (xsltStylesheetPtr style, + xmlNodePtr cur); +XSLTPUBFUN xsltStylesheetPtr XSLTCALL + xsltNextImport (xsltStylesheetPtr style); +XSLTPUBFUN int XSLTCALL + xsltNeedElemSpaceHandling(xsltTransformContextPtr ctxt); +XSLTPUBFUN int XSLTCALL + xsltFindElemSpaceHandling(xsltTransformContextPtr ctxt, + xmlNodePtr node); +XSLTPUBFUN xsltTemplatePtr XSLTCALL + xsltFindTemplate (xsltTransformContextPtr ctxt, + const xmlChar *name, + const xmlChar *nameURI); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_IMPORTS_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/keys.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/keys.h new file mode 100644 index 000000000000..757d122463ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/keys.h @@ -0,0 +1,53 @@ +/* + * Summary: interface for the key matching used in key() and template matches. + * Description: implementation of the key mechanims. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_KEY_H__ +#define __XML_XSLT_KEY_H__ + +#include <libxml/xpath.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * NODE_IS_KEYED: + * + * check for bit 15 set + */ +#define NODE_IS_KEYED (1 >> 15) + +XSLTPUBFUN int XSLTCALL + xsltAddKey (xsltStylesheetPtr style, + const xmlChar *name, + const xmlChar *nameURI, + const xmlChar *match, + const xmlChar *use, + xmlNodePtr inst); +XSLTPUBFUN xmlNodeSetPtr XSLTCALL + xsltGetKey (xsltTransformContextPtr ctxt, + const xmlChar *name, + const xmlChar *nameURI, + const xmlChar *value); +XSLTPUBFUN void XSLTCALL + xsltInitCtxtKeys (xsltTransformContextPtr ctxt, + xsltDocumentPtr doc); +XSLTPUBFUN void XSLTCALL + xsltFreeKeys (xsltStylesheetPtr style); +XSLTPUBFUN void XSLTCALL + xsltFreeDocumentKeys (xsltDocumentPtr doc); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/namespaces.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/namespaces.h new file mode 100644 index 000000000000..fa2d3b4ce75c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/namespaces.h @@ -0,0 +1,68 @@ +/* + * Summary: interface for the XSLT namespace handling + * Description: set of function easing the processing and generation + * of namespace nodes in XSLT. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_NAMESPACES_H__ +#define __XML_XSLT_NAMESPACES_H__ + +#include <libxml/tree.h> +#include "xsltexports.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Used within nsAliases hashtable when the default namespace is required + * but it's not been explicitly defined + */ +/** + * UNDEFINED_DEFAULT_NS: + * + * Special value for undefined namespace, internal + */ +#define UNDEFINED_DEFAULT_NS (const xmlChar *) -1L + +XSLTPUBFUN void XSLTCALL + xsltNamespaceAlias (xsltStylesheetPtr style, + xmlNodePtr node); +XSLTPUBFUN xmlNsPtr XSLTCALL + xsltGetNamespace (xsltTransformContextPtr ctxt, + xmlNodePtr cur, + xmlNsPtr ns, + xmlNodePtr out); +XSLTPUBFUN xmlNsPtr XSLTCALL + xsltGetPlainNamespace (xsltTransformContextPtr ctxt, + xmlNodePtr cur, + xmlNsPtr ns, + xmlNodePtr out); +XSLTPUBFUN xmlNsPtr XSLTCALL + xsltGetSpecialNamespace (xsltTransformContextPtr ctxt, + xmlNodePtr cur, + const xmlChar *URI, + const xmlChar *prefix, + xmlNodePtr out); +XSLTPUBFUN xmlNsPtr XSLTCALL + xsltCopyNamespace (xsltTransformContextPtr ctxt, + xmlNodePtr elem, + xmlNsPtr ns); +XSLTPUBFUN xmlNsPtr XSLTCALL + xsltCopyNamespaceList (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNsPtr cur); +XSLTPUBFUN void XSLTCALL + xsltFreeNamespaceAliasHashes + (xsltStylesheetPtr style); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_NAMESPACES_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/numbersInternals.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/numbersInternals.h new file mode 100644 index 000000000000..8524592811ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/numbersInternals.h @@ -0,0 +1,73 @@ +/* + * Summary: Implementation of the XSLT number functions + * Description: Implementation of the XSLT number functions + * + * Copy: See Copyright for the status of this software. + * + * Author: Bjorn Reese <breese@users.sourceforge.net> and Daniel Veillard + */ + +#ifndef __XML_XSLT_NUMBERSINTERNALS_H__ +#define __XML_XSLT_NUMBERSINTERNALS_H__ + +#include <libxml/tree.h> +#include "xsltexports.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct _xsltCompMatch; + +/** + * xsltNumberData: + * + * This data structure is just a wrapper to pass xsl:number data in. + */ +typedef struct _xsltNumberData xsltNumberData; +typedef xsltNumberData *xsltNumberDataPtr; + +struct _xsltNumberData { + const xmlChar *level; + const xmlChar *count; + const xmlChar *from; + const xmlChar *value; + const xmlChar *format; + int has_format; + int digitsPerGroup; + int groupingCharacter; + int groupingCharacterLen; + xmlDocPtr doc; + xmlNodePtr node; + struct _xsltCompMatch *countPat; + struct _xsltCompMatch *fromPat; + + /* + * accelerators + */ +}; + +/** + * xsltFormatNumberInfo,: + * + * This data structure lists the various parameters needed to format numbers. + */ +typedef struct _xsltFormatNumberInfo xsltFormatNumberInfo; +typedef xsltFormatNumberInfo *xsltFormatNumberInfoPtr; + +struct _xsltFormatNumberInfo { + int integer_hash; /* Number of '#' in integer part */ + int integer_digits; /* Number of '0' in integer part */ + int frac_digits; /* Number of '0' in fractional part */ + int frac_hash; /* Number of '#' in fractional part */ + int group; /* Number of chars per display 'group' */ + int multiplier; /* Scaling for percent or permille */ + char add_decimal; /* Flag for whether decimal point appears in pattern */ + char is_multiplier_set; /* Flag to catch multiple occurences of percent/permille */ + char is_negative_pattern;/* Flag for processing -ve prefix/suffix */ +}; + +#ifdef __cplusplus +} +#endif +#endif /* __XML_XSLT_NUMBERSINTERNALS_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/pattern.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/pattern.h new file mode 100644 index 000000000000..a0991c0ce83e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/pattern.h @@ -0,0 +1,84 @@ +/* + * Summary: interface for the pattern matching used in template matches. + * Description: the implementation of the lookup of the right template + * for a given node must be really fast in order to keep + * decent performances. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_PATTERN_H__ +#define __XML_XSLT_PATTERN_H__ + +#include "xsltInternals.h" +#include "xsltexports.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xsltCompMatch: + * + * Data structure used for the implementation of patterns. + * It is kept private (in pattern.c). + */ +typedef struct _xsltCompMatch xsltCompMatch; +typedef xsltCompMatch *xsltCompMatchPtr; + +/* + * Pattern related interfaces. + */ + +XSLTPUBFUN xsltCompMatchPtr XSLTCALL + xsltCompilePattern (const xmlChar *pattern, + xmlDocPtr doc, + xmlNodePtr node, + xsltStylesheetPtr style, + xsltTransformContextPtr runtime); +XSLTPUBFUN void XSLTCALL + xsltFreeCompMatchList (xsltCompMatchPtr comp); +XSLTPUBFUN int XSLTCALL + xsltTestCompMatchList (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xsltCompMatchPtr comp); +XSLTPUBFUN void XSLTCALL + xsltCompMatchClearCache (xsltTransformContextPtr ctxt, + xsltCompMatchPtr comp); +XSLTPUBFUN void XSLTCALL + xsltNormalizeCompSteps (void *payload, + void *data, + const xmlChar *name); + +/* + * Template related interfaces. + */ +XSLTPUBFUN int XSLTCALL + xsltAddTemplate (xsltStylesheetPtr style, + xsltTemplatePtr cur, + const xmlChar *mode, + const xmlChar *modeURI); +XSLTPUBFUN xsltTemplatePtr XSLTCALL + xsltGetTemplate (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xsltStylesheetPtr style); +XSLTPUBFUN void XSLTCALL + xsltFreeTemplateHashes (xsltStylesheetPtr style); +XSLTPUBFUN void XSLTCALL + xsltCleanupTemplates (xsltStylesheetPtr style); + +#if 0 +int xsltMatchPattern (xsltTransformContextPtr ctxt, + xmlNodePtr node, + const xmlChar *pattern, + xmlDocPtr ctxtdoc, + xmlNodePtr ctxtnode); +#endif +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_PATTERN_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/preproc.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/preproc.h new file mode 100644 index 000000000000..caf464ad10f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/preproc.h @@ -0,0 +1,43 @@ +/* + * Summary: precomputing stylesheets + * Description: this is the compilation phase, where most of the + * stylesheet is "compiled" into faster to use data. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_PRECOMP_H__ +#define __XML_XSLT_PRECOMP_H__ + +#include <libxml/tree.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Interfaces + */ +extern const xmlChar *xsltExtMarker; + +XSLTPUBFUN xsltElemPreCompPtr XSLTCALL + xsltDocumentComp (xsltStylesheetPtr style, + xmlNodePtr inst, + xsltTransformFunction function); + +XSLTPUBFUN void XSLTCALL + xsltStylePreCompute (xsltStylesheetPtr style, + xmlNodePtr inst); +XSLTPUBFUN void XSLTCALL + xsltFreeStylePreComps (xsltStylesheetPtr style); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_PRECOMP_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/security.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/security.h new file mode 100644 index 000000000000..bab5c8c6b213 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/security.h @@ -0,0 +1,104 @@ +/* + * Summary: interface for the libxslt security framework + * Description: the libxslt security framework allow to restrict + * the access to new resources (file or URL) from + * the stylesheet at runtime. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_SECURITY_H__ +#define __XML_XSLT_SECURITY_H__ + +#include <libxml/tree.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * xsltSecurityPref: + * + * structure to indicate the preferences for security in the XSLT + * transformation. + */ +typedef struct _xsltSecurityPrefs xsltSecurityPrefs; +typedef xsltSecurityPrefs *xsltSecurityPrefsPtr; + +/** + * xsltSecurityOption: + * + * the set of option that can be configured + */ +typedef enum { + XSLT_SECPREF_READ_FILE = 1, + XSLT_SECPREF_WRITE_FILE, + XSLT_SECPREF_CREATE_DIRECTORY, + XSLT_SECPREF_READ_NETWORK, + XSLT_SECPREF_WRITE_NETWORK +} xsltSecurityOption; + +/** + * xsltSecurityCheck: + * + * User provided function to check the value of a string like a file + * path or an URL ... + */ +typedef int (*xsltSecurityCheck) (xsltSecurityPrefsPtr sec, + xsltTransformContextPtr ctxt, + const char *value); + +/* + * Module interfaces + */ +XSLTPUBFUN xsltSecurityPrefsPtr XSLTCALL + xsltNewSecurityPrefs (void); +XSLTPUBFUN void XSLTCALL + xsltFreeSecurityPrefs (xsltSecurityPrefsPtr sec); +XSLTPUBFUN int XSLTCALL + xsltSetSecurityPrefs (xsltSecurityPrefsPtr sec, + xsltSecurityOption option, + xsltSecurityCheck func); +XSLTPUBFUN xsltSecurityCheck XSLTCALL + xsltGetSecurityPrefs (xsltSecurityPrefsPtr sec, + xsltSecurityOption option); + +XSLTPUBFUN void XSLTCALL + xsltSetDefaultSecurityPrefs (xsltSecurityPrefsPtr sec); +XSLTPUBFUN xsltSecurityPrefsPtr XSLTCALL + xsltGetDefaultSecurityPrefs (void); + +XSLTPUBFUN int XSLTCALL + xsltSetCtxtSecurityPrefs (xsltSecurityPrefsPtr sec, + xsltTransformContextPtr ctxt); + +XSLTPUBFUN int XSLTCALL + xsltSecurityAllow (xsltSecurityPrefsPtr sec, + xsltTransformContextPtr ctxt, + const char *value); +XSLTPUBFUN int XSLTCALL + xsltSecurityForbid (xsltSecurityPrefsPtr sec, + xsltTransformContextPtr ctxt, + const char *value); +/* + * internal interfaces + */ +XSLTPUBFUN int XSLTCALL + xsltCheckWrite (xsltSecurityPrefsPtr sec, + xsltTransformContextPtr ctxt, + const xmlChar *URL); +XSLTPUBFUN int XSLTCALL + xsltCheckRead (xsltSecurityPrefsPtr sec, + xsltTransformContextPtr ctxt, + const xmlChar *URL); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_SECURITY_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/templates.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/templates.h new file mode 100644 index 000000000000..84a9de4d3596 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/templates.h @@ -0,0 +1,77 @@ +/* + * Summary: interface for the template processing + * Description: This set of routine encapsulates XPath calls + * and Attribute Value Templates evaluation. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_TEMPLATES_H__ +#define __XML_XSLT_TEMPLATES_H__ + +#include <libxml/xpath.h> +#include <libxml/xpathInternals.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +XSLTPUBFUN int XSLTCALL + xsltEvalXPathPredicate (xsltTransformContextPtr ctxt, + xmlXPathCompExprPtr comp, + xmlNsPtr *nsList, + int nsNr); +XSLTPUBFUN xmlChar * XSLTCALL + xsltEvalTemplateString (xsltTransformContextPtr ctxt, + xmlNodePtr contextNode, + xmlNodePtr inst); +XSLTPUBFUN xmlChar * XSLTCALL + xsltEvalAttrValueTemplate (xsltTransformContextPtr ctxt, + xmlNodePtr node, + const xmlChar *name, + const xmlChar *ns); +XSLTPUBFUN const xmlChar * XSLTCALL + xsltEvalStaticAttrValueTemplate (xsltStylesheetPtr style, + xmlNodePtr node, + const xmlChar *name, + const xmlChar *ns, + int *found); + +/* TODO: this is obviously broken ... the namespaces should be passed too ! */ +XSLTPUBFUN xmlChar * XSLTCALL + xsltEvalXPathString (xsltTransformContextPtr ctxt, + xmlXPathCompExprPtr comp); +XSLTPUBFUN xmlChar * XSLTCALL + xsltEvalXPathStringNs (xsltTransformContextPtr ctxt, + xmlXPathCompExprPtr comp, + int nsNr, + xmlNsPtr *nsList); + +XSLTPUBFUN xmlNodePtr * XSLTCALL + xsltTemplateProcess (xsltTransformContextPtr ctxt, + xmlNodePtr node); +XSLTPUBFUN xmlAttrPtr XSLTCALL + xsltAttrListTemplateProcess (xsltTransformContextPtr ctxt, + xmlNodePtr target, + xmlAttrPtr cur); +XSLTPUBFUN xmlAttrPtr XSLTCALL + xsltAttrTemplateProcess (xsltTransformContextPtr ctxt, + xmlNodePtr target, + xmlAttrPtr attr); +XSLTPUBFUN xmlChar * XSLTCALL + xsltAttrTemplateValueProcess (xsltTransformContextPtr ctxt, + const xmlChar* attr); +XSLTPUBFUN xmlChar * XSLTCALL + xsltAttrTemplateValueProcessNode(xsltTransformContextPtr ctxt, + const xmlChar* str, + xmlNodePtr node); +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_TEMPLATES_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/transform.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/transform.h new file mode 100644 index 000000000000..5a6f79591079 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/transform.h @@ -0,0 +1,207 @@ +/* + * Summary: the XSLT engine transformation part. + * Description: This module implements the bulk of the actual + * transformation processing. Most of the xsl: element + * constructs are implemented in this module. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_TRANSFORM_H__ +#define __XML_XSLT_TRANSFORM_H__ + +#include <libxml/parser.h> +#include <libxml/xmlIO.h> +#include "xsltexports.h" +#include <libxslt/xsltInternals.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * XInclude default processing. + */ +XSLTPUBFUN void XSLTCALL + xsltSetXIncludeDefault (int xinclude); +XSLTPUBFUN int XSLTCALL + xsltGetXIncludeDefault (void); + +/** + * Export context to users. + */ +XSLTPUBFUN xsltTransformContextPtr XSLTCALL + xsltNewTransformContext (xsltStylesheetPtr style, + xmlDocPtr doc); + +XSLTPUBFUN void XSLTCALL + xsltFreeTransformContext(xsltTransformContextPtr ctxt); + +XSLTPUBFUN xmlDocPtr XSLTCALL + xsltApplyStylesheetUser (xsltStylesheetPtr style, + xmlDocPtr doc, + const char **params, + const char *output, + FILE * profile, + xsltTransformContextPtr userCtxt); +XSLTPUBFUN void XSLTCALL + xsltProcessOneNode (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xsltStackElemPtr params); +/** + * Private Interfaces. + */ +XSLTPUBFUN void XSLTCALL + xsltApplyStripSpaces (xsltTransformContextPtr ctxt, + xmlNodePtr node); +XSLTPUBFUN xmlDocPtr XSLTCALL + xsltApplyStylesheet (xsltStylesheetPtr style, + xmlDocPtr doc, + const char **params); +XSLTPUBFUN xmlDocPtr XSLTCALL + xsltProfileStylesheet (xsltStylesheetPtr style, + xmlDocPtr doc, + const char **params, + FILE * output); +XSLTPUBFUN int XSLTCALL + xsltRunStylesheet (xsltStylesheetPtr style, + xmlDocPtr doc, + const char **params, + const char *output, + xmlSAXHandlerPtr SAX, + xmlOutputBufferPtr IObuf); +XSLTPUBFUN int XSLTCALL + xsltRunStylesheetUser (xsltStylesheetPtr style, + xmlDocPtr doc, + const char **params, + const char *output, + xmlSAXHandlerPtr SAX, + xmlOutputBufferPtr IObuf, + FILE * profile, + xsltTransformContextPtr userCtxt); +XSLTPUBFUN void XSLTCALL + xsltApplyOneTemplate (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr list, + xsltTemplatePtr templ, + xsltStackElemPtr params); +XSLTPUBFUN void XSLTCALL + xsltDocumentElem (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltSort (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltCopy (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltText (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltElement (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltComment (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltAttribute (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltProcessingInstruction(xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltCopyOf (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltValueOf (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltNumber (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltApplyImports (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltCallTemplate (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltApplyTemplates (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltChoose (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltIf (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltForEach (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); +XSLTPUBFUN void XSLTCALL + xsltRegisterAllElement (xsltTransformContextPtr ctxt); + +XSLTPUBFUN xmlNodePtr XSLTCALL + xsltCopyTextString (xsltTransformContextPtr ctxt, + xmlNodePtr target, + const xmlChar *string, + int noescape); + +/* Following 2 functions needed for libexslt/functions.c */ +XSLTPUBFUN void XSLTCALL + xsltLocalVariablePop (xsltTransformContextPtr ctxt, + int limitNr, + int level); +XSLTPUBFUN int XSLTCALL + xsltLocalVariablePush (xsltTransformContextPtr ctxt, + xsltStackElemPtr variable, + int level); +/* + * Hook for the debugger if activated. + */ +XSLTPUBFUN void XSLTCALL + xslHandleDebugger (xmlNodePtr cur, + xmlNodePtr node, + xsltTemplatePtr templ, + xsltTransformContextPtr ctxt); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_TRANSFORM_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/variables.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/variables.h new file mode 100644 index 000000000000..039288fbd504 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/variables.h @@ -0,0 +1,118 @@ +/* + * Summary: interface for the variable matching and lookup. + * Description: interface for the variable matching and lookup. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_VARIABLES_H__ +#define __XML_XSLT_VARIABLES_H__ + +#include <libxml/xpath.h> +#include <libxml/xpathInternals.h> +#include "xsltexports.h" +#include "xsltInternals.h" +#include "functions.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * XSLT_REGISTER_VARIABLE_LOOKUP: + * + * Registering macro, not general purpose at all but used in different modules. + */ + +#define XSLT_REGISTER_VARIABLE_LOOKUP(ctxt) \ + xmlXPathRegisterVariableLookup((ctxt)->xpathCtxt, \ + xsltXPathVariableLookup, (void *)(ctxt)); \ + xsltRegisterAllFunctions((ctxt)->xpathCtxt); \ + xsltRegisterAllElement(ctxt); \ + (ctxt)->xpathCtxt->extra = ctxt + +/* + * Flags for memory management of RVTs + */ + +/** + * XSLT_RVT_LOCAL: + * + * RVT is destroyed after the current instructions ends. + */ +#define XSLT_RVT_LOCAL ((void *)1) + +/** + * XSLT_RVT_FUNC_RESULT: + * + * RVT is part of results returned with func:result. The RVT won't be + * destroyed after exiting a template and will be reset to XSLT_RVT_LOCAL or + * XSLT_RVT_VARIABLE in the template that receives the return value. + */ +#define XSLT_RVT_FUNC_RESULT ((void *)2) + +/** + * XSLT_RVT_GLOBAL: + * + * RVT is part of a global variable. + */ +#define XSLT_RVT_GLOBAL ((void *)3) + +/* + * Interfaces for the variable module. + */ + +XSLTPUBFUN int XSLTCALL + xsltEvalGlobalVariables (xsltTransformContextPtr ctxt); +XSLTPUBFUN int XSLTCALL + xsltEvalUserParams (xsltTransformContextPtr ctxt, + const char **params); +XSLTPUBFUN int XSLTCALL + xsltQuoteUserParams (xsltTransformContextPtr ctxt, + const char **params); +XSLTPUBFUN int XSLTCALL + xsltEvalOneUserParam (xsltTransformContextPtr ctxt, + const xmlChar * name, + const xmlChar * value); +XSLTPUBFUN int XSLTCALL + xsltQuoteOneUserParam (xsltTransformContextPtr ctxt, + const xmlChar * name, + const xmlChar * value); + +XSLTPUBFUN void XSLTCALL + xsltParseGlobalVariable (xsltStylesheetPtr style, + xmlNodePtr cur); +XSLTPUBFUN void XSLTCALL + xsltParseGlobalParam (xsltStylesheetPtr style, + xmlNodePtr cur); +XSLTPUBFUN void XSLTCALL + xsltParseStylesheetVariable (xsltTransformContextPtr ctxt, + xmlNodePtr cur); +XSLTPUBFUN void XSLTCALL + xsltParseStylesheetParam (xsltTransformContextPtr ctxt, + xmlNodePtr cur); +XSLTPUBFUN xsltStackElemPtr XSLTCALL + xsltParseStylesheetCallerParam (xsltTransformContextPtr ctxt, + xmlNodePtr cur); +XSLTPUBFUN int XSLTCALL + xsltAddStackElemList (xsltTransformContextPtr ctxt, + xsltStackElemPtr elems); +XSLTPUBFUN void XSLTCALL + xsltFreeGlobalVariables (xsltTransformContextPtr ctxt); +XSLTPUBFUN xmlXPathObjectPtr XSLTCALL + xsltVariableLookup (xsltTransformContextPtr ctxt, + const xmlChar *name, + const xmlChar *ns_uri); +XSLTPUBFUN xmlXPathObjectPtr XSLTCALL + xsltXPathVariableLookup (void *ctxt, + const xmlChar *name, + const xmlChar *ns_uri); +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_VARIABLES_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xslt.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xslt.h new file mode 100644 index 000000000000..02f491a58ec0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xslt.h @@ -0,0 +1,110 @@ +/* + * Summary: Interfaces, constants and types related to the XSLT engine + * Description: Interfaces, constants and types related to the XSLT engine + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_H__ +#define __XML_XSLT_H__ + +#include <libxml/tree.h> +#include "xsltexports.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * XSLT_DEFAULT_VERSION: + * + * The default version of XSLT supported. + */ +#define XSLT_DEFAULT_VERSION "1.0" + +/** + * XSLT_DEFAULT_VENDOR: + * + * The XSLT "vendor" string for this processor. + */ +#define XSLT_DEFAULT_VENDOR "libxslt" + +/** + * XSLT_DEFAULT_URL: + * + * The XSLT "vendor" URL for this processor. + */ +#define XSLT_DEFAULT_URL "http://xmlsoft.org/XSLT/" + +/** + * XSLT_NAMESPACE: + * + * The XSLT specification namespace. + */ +#define XSLT_NAMESPACE ((const xmlChar *)"http://www.w3.org/1999/XSL/Transform") + +/** + * XSLT_PARSE_OPTIONS: + * + * The set of options to pass to an xmlReadxxx when loading files for + * XSLT consumption. + */ +#define XSLT_PARSE_OPTIONS \ + XML_PARSE_NOENT | XML_PARSE_DTDLOAD | XML_PARSE_DTDATTR | XML_PARSE_NOCDATA + +/** + * xsltMaxDepth: + * + * This value is used to detect templates loops. + */ +XSLTPUBVAR int xsltMaxDepth; + +/** + * * xsltMaxVars: + * * + * * This value is used to detect templates loops. + * */ +XSLTPUBVAR int xsltMaxVars; + +/** + * xsltEngineVersion: + * + * The version string for libxslt. + */ +XSLTPUBVAR const char *xsltEngineVersion; + +/** + * xsltLibxsltVersion: + * + * The version of libxslt compiled. + */ +XSLTPUBVAR const int xsltLibxsltVersion; + +/** + * xsltLibxmlVersion: + * + * The version of libxml libxslt was compiled against. + */ +XSLTPUBVAR const int xsltLibxmlVersion; + +/* + * Global initialization function. + */ + +XSLTPUBFUN void XSLTCALL + xsltInit (void); + +/* + * Global cleanup function. + */ +XSLTPUBFUN void XSLTCALL + xsltCleanupGlobals (void); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltInternals.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltInternals.h new file mode 100644 index 000000000000..14a971aaa308 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltInternals.h @@ -0,0 +1,1978 @@ +/* + * Summary: internal data structures, constants and functions + * Description: Internal data structures, constants and functions used + * by the XSLT engine. + * They are not part of the API or ABI, i.e. they can change + * without prior notice, use carefully. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLT_INTERNALS_H__ +#define __XML_XSLT_INTERNALS_H__ + +#include <libxml/tree.h> +#include <libxml/hash.h> +#include <libxml/xpath.h> +#include <libxml/xmlerror.h> +#include <libxml/dict.h> +#include <libxml/xmlstring.h> +#include <libxslt/xslt.h> +#include "xsltexports.h" +#include "xsltlocale.h" +#include "numbersInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* #define XSLT_DEBUG_PROFILE_CACHE */ + +/** + * XSLT_IS_TEXT_NODE: + * + * check if the argument is a text node + */ +#define XSLT_IS_TEXT_NODE(n) ((n != NULL) && \ + (((n)->type == XML_TEXT_NODE) || \ + ((n)->type == XML_CDATA_SECTION_NODE))) + + +/** + * XSLT_MARK_RES_TREE_FRAG: + * + * internal macro to set up tree fragments + */ +#define XSLT_MARK_RES_TREE_FRAG(n) \ + (n)->name = (char *) xmlStrdup(BAD_CAST " fake node libxslt"); + +/** + * XSLT_IS_RES_TREE_FRAG: + * + * internal macro to test tree fragments + */ +#define XSLT_IS_RES_TREE_FRAG(n) \ + ((n != NULL) && ((n)->type == XML_DOCUMENT_NODE) && \ + ((n)->name != NULL) && ((n)->name[0] == ' ')) + +/** + * XSLT_REFACTORED_KEYCOMP: + * + * Internal define to enable on-demand xsl:key computation. + * That's the only mode now but the define is kept for compatibility + */ +#define XSLT_REFACTORED_KEYCOMP + +/** + * XSLT_FAST_IF: + * + * Internal define to enable usage of xmlXPathCompiledEvalToBoolean() + * for XSLT "tests"; e.g. in <xsl:if test="/foo/bar"> + */ +#define XSLT_FAST_IF + +/** + * XSLT_REFACTORED: + * + * Internal define to enable the refactored parts of Libxslt. + */ +/* #define XSLT_REFACTORED */ +/* ==================================================================== */ + +/** + * XSLT_REFACTORED_VARS: + * + * Internal define to enable the refactored variable part of libxslt + */ +#define XSLT_REFACTORED_VARS + +#ifdef XSLT_REFACTORED + +extern const xmlChar *xsltXSLTAttrMarker; + + +/* TODO: REMOVE: #define XSLT_REFACTORED_EXCLRESNS */ + +/* TODO: REMOVE: #define XSLT_REFACTORED_NSALIAS */ + +/** + * XSLT_REFACTORED_XSLT_NSCOMP + * + * Internal define to enable the pointer-comparison of + * namespaces of XSLT elements. + */ +/* #define XSLT_REFACTORED_XSLT_NSCOMP */ + +#ifdef XSLT_REFACTORED_XSLT_NSCOMP + +extern const xmlChar *xsltConstNamespaceNameXSLT; + +/** + * IS_XSLT_ELEM_FAST: + * + * quick test to detect XSLT elements + */ +#define IS_XSLT_ELEM_FAST(n) \ + (((n) != NULL) && ((n)->ns != NULL) && \ + ((n)->ns->href == xsltConstNamespaceNameXSLT)) + +/** + * IS_XSLT_ATTR_FAST: + * + * quick test to detect XSLT attributes + */ +#define IS_XSLT_ATTR_FAST(a) \ + (((a) != NULL) && ((a)->ns != NULL) && \ + ((a)->ns->href == xsltConstNamespaceNameXSLT)) + +/** + * XSLT_HAS_INTERNAL_NSMAP: + * + * check for namespace mapping + */ +#define XSLT_HAS_INTERNAL_NSMAP(s) \ + (((s) != NULL) && ((s)->principal) && \ + ((s)->principal->principalData) && \ + ((s)->principal->principalData->nsMap)) + +/** + * XSLT_GET_INTERNAL_NSMAP: + * + * get pointer to namespace map + */ +#define XSLT_GET_INTERNAL_NSMAP(s) ((s)->principal->principalData->nsMap) + +#else /* XSLT_REFACTORED_XSLT_NSCOMP */ + +/** + * IS_XSLT_ELEM_FAST: + * + * quick check whether this is an xslt element + */ +#define IS_XSLT_ELEM_FAST(n) \ + (((n) != NULL) && ((n)->ns != NULL) && \ + (xmlStrEqual((n)->ns->href, XSLT_NAMESPACE))) + +/** + * IS_XSLT_ATTR_FAST: + * + * quick check for xslt namespace attribute + */ +#define IS_XSLT_ATTR_FAST(a) \ + (((a) != NULL) && ((a)->ns != NULL) && \ + (xmlStrEqual((a)->ns->href, XSLT_NAMESPACE))) + + +#endif /* XSLT_REFACTORED_XSLT_NSCOMP */ + + +/** + * XSLT_REFACTORED_MANDATORY_VERSION: + * + * TODO: Currently disabled to surpress regression test failures, since + * the old behaviour was that a missing version attribute + * produced a only a warning and not an error, which was incerrect. + * So the regression tests need to be fixed if this is enabled. + */ +/* #define XSLT_REFACTORED_MANDATORY_VERSION */ + +/** + * xsltPointerList: + * + * Pointer-list for various purposes. + */ +typedef struct _xsltPointerList xsltPointerList; +typedef xsltPointerList *xsltPointerListPtr; +struct _xsltPointerList { + void **items; + int number; + int size; +}; + +#endif + +/** + * XSLT_REFACTORED_PARSING: + * + * Internal define to enable the refactored parts of Libxslt + * related to parsing. + */ +/* #define XSLT_REFACTORED_PARSING */ + +/** + * XSLT_MAX_SORT: + * + * Max number of specified xsl:sort on an element. + */ +#define XSLT_MAX_SORT 15 + +/** + * XSLT_PAT_NO_PRIORITY: + * + * Specific value for pattern without priority expressed. + */ +#define XSLT_PAT_NO_PRIORITY -12345789 + +/** + * xsltRuntimeExtra: + * + * Extra information added to the transformation context. + */ +typedef struct _xsltRuntimeExtra xsltRuntimeExtra; +typedef xsltRuntimeExtra *xsltRuntimeExtraPtr; +struct _xsltRuntimeExtra { + void *info; /* pointer to the extra data */ + xmlFreeFunc deallocate; /* pointer to the deallocation routine */ + union { /* dual-purpose field */ + void *ptr; /* data not needing deallocation */ + int ival; /* integer value storage */ + } val; +}; + +/** + * XSLT_RUNTIME_EXTRA_LST: + * @ctxt: the transformation context + * @nr: the index + * + * Macro used to access extra information stored in the context + */ +#define XSLT_RUNTIME_EXTRA_LST(ctxt, nr) (ctxt)->extras[(nr)].info +/** + * XSLT_RUNTIME_EXTRA_FREE: + * @ctxt: the transformation context + * @nr: the index + * + * Macro used to free extra information stored in the context + */ +#define XSLT_RUNTIME_EXTRA_FREE(ctxt, nr) (ctxt)->extras[(nr)].deallocate +/** + * XSLT_RUNTIME_EXTRA: + * @ctxt: the transformation context + * @nr: the index + * + * Macro used to define extra information stored in the context + */ +#define XSLT_RUNTIME_EXTRA(ctxt, nr, typ) (ctxt)->extras[(nr)].val.typ + +/** + * xsltTemplate: + * + * The in-memory structure corresponding to an XSLT Template. + */ +typedef struct _xsltTemplate xsltTemplate; +typedef xsltTemplate *xsltTemplatePtr; +struct _xsltTemplate { + struct _xsltTemplate *next;/* chained list sorted by priority */ + struct _xsltStylesheet *style;/* the containing stylesheet */ + xmlChar *match; /* the matching string */ + float priority; /* as given from the stylesheet, not computed */ + const xmlChar *name; /* the local part of the name QName */ + const xmlChar *nameURI; /* the URI part of the name QName */ + const xmlChar *mode;/* the local part of the mode QName */ + const xmlChar *modeURI;/* the URI part of the mode QName */ + xmlNodePtr content; /* the template replacement value */ + xmlNodePtr elem; /* the source element */ + + /* + * TODO: @inheritedNsNr and @inheritedNs won't be used in the + * refactored code. + */ + int inheritedNsNr; /* number of inherited namespaces */ + xmlNsPtr *inheritedNs;/* inherited non-excluded namespaces */ + + /* Profiling information */ + int nbCalls; /* the number of time the template was called */ + unsigned long time; /* the time spent in this template */ + void *params; /* xsl:param instructions */ + + int templNr; /* Nb of templates in the stack */ + int templMax; /* Size of the templtes stack */ + xsltTemplatePtr *templCalledTab; /* templates called */ + int *templCountTab; /* .. and how often */ +}; + +/** + * xsltDecimalFormat: + * + * Data structure of decimal-format. + */ +typedef struct _xsltDecimalFormat xsltDecimalFormat; +typedef xsltDecimalFormat *xsltDecimalFormatPtr; +struct _xsltDecimalFormat { + struct _xsltDecimalFormat *next; /* chained list */ + xmlChar *name; + /* Used for interpretation of pattern */ + xmlChar *digit; + xmlChar *patternSeparator; + /* May appear in result */ + xmlChar *minusSign; + xmlChar *infinity; + xmlChar *noNumber; /* Not-a-number */ + /* Used for interpretation of pattern and may appear in result */ + xmlChar *decimalPoint; + xmlChar *grouping; + xmlChar *percent; + xmlChar *permille; + xmlChar *zeroDigit; + const xmlChar *nsUri; +}; + +/** + * xsltDocument: + * + * Data structure associated to a parsed document. + */ +typedef struct _xsltDocument xsltDocument; +typedef xsltDocument *xsltDocumentPtr; +struct _xsltDocument { + struct _xsltDocument *next; /* documents are kept in a chained list */ + int main; /* is this the main document */ + xmlDocPtr doc; /* the parsed document */ + void *keys; /* key tables storage */ + struct _xsltDocument *includes; /* subsidiary includes */ + int preproc; /* pre-processing already done */ + int nbKeysComputed; +}; + +/** + * xsltKeyDef: + * + * Representation of an xsl:key. + */ +typedef struct _xsltKeyDef xsltKeyDef; +typedef xsltKeyDef *xsltKeyDefPtr; +struct _xsltKeyDef { + struct _xsltKeyDef *next; + xmlNodePtr inst; + xmlChar *name; + xmlChar *nameURI; + xmlChar *match; + xmlChar *use; + xmlXPathCompExprPtr comp; + xmlXPathCompExprPtr usecomp; + xmlNsPtr *nsList; /* the namespaces in scope */ + int nsNr; /* the number of namespaces in scope */ +}; + +/** + * xsltKeyTable: + * + * Holds the computed keys for key definitions of the same QName. + * Is owned by an xsltDocument. + */ +typedef struct _xsltKeyTable xsltKeyTable; +typedef xsltKeyTable *xsltKeyTablePtr; +struct _xsltKeyTable { + struct _xsltKeyTable *next; + xmlChar *name; + xmlChar *nameURI; + xmlHashTablePtr keys; +}; + +/* + * The in-memory structure corresponding to an XSLT Stylesheet. + * NOTE: most of the content is simply linked from the doc tree + * structure, no specific allocation is made. + */ +typedef struct _xsltStylesheet xsltStylesheet; +typedef xsltStylesheet *xsltStylesheetPtr; + +typedef struct _xsltTransformContext xsltTransformContext; +typedef xsltTransformContext *xsltTransformContextPtr; + +/** + * xsltElemPreComp: + * + * The in-memory structure corresponding to element precomputed data, + * designed to be extended by extension implementors. + */ +typedef struct _xsltElemPreComp xsltElemPreComp; +typedef xsltElemPreComp *xsltElemPreCompPtr; + +/** + * xsltTransformFunction: + * @ctxt: the XSLT transformation context + * @node: the input node + * @inst: the stylesheet node + * @comp: the compiled information from the stylesheet + * + * Signature of the function associated to elements part of the + * stylesheet language like xsl:if or xsl:apply-templates. + */ +typedef void (*xsltTransformFunction) (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst, + xsltElemPreCompPtr comp); + +/** + * xsltSortFunc: + * @ctxt: a transformation context + * @sorts: the node-set to sort + * @nbsorts: the number of sorts + * + * Signature of the function to use during sorting + */ +typedef void (*xsltSortFunc) (xsltTransformContextPtr ctxt, xmlNodePtr *sorts, + int nbsorts); + +typedef enum { + XSLT_FUNC_COPY=1, + XSLT_FUNC_SORT, + XSLT_FUNC_TEXT, + XSLT_FUNC_ELEMENT, + XSLT_FUNC_ATTRIBUTE, + XSLT_FUNC_COMMENT, + XSLT_FUNC_PI, + XSLT_FUNC_COPYOF, + XSLT_FUNC_VALUEOF, + XSLT_FUNC_NUMBER, + XSLT_FUNC_APPLYIMPORTS, + XSLT_FUNC_CALLTEMPLATE, + XSLT_FUNC_APPLYTEMPLATES, + XSLT_FUNC_CHOOSE, + XSLT_FUNC_IF, + XSLT_FUNC_FOREACH, + XSLT_FUNC_DOCUMENT, + XSLT_FUNC_WITHPARAM, + XSLT_FUNC_PARAM, + XSLT_FUNC_VARIABLE, + XSLT_FUNC_WHEN, + XSLT_FUNC_EXTENSION +#ifdef XSLT_REFACTORED + , + XSLT_FUNC_OTHERWISE, + XSLT_FUNC_FALLBACK, + XSLT_FUNC_MESSAGE, + XSLT_FUNC_INCLUDE, + XSLT_FUNC_ATTRSET, + XSLT_FUNC_LITERAL_RESULT_ELEMENT, + XSLT_FUNC_UNKOWN_FORWARDS_COMPAT +#endif +} xsltStyleType; + +/** + * xsltElemPreCompDeallocator: + * @comp: the #xsltElemPreComp to free up + * + * Deallocates an #xsltElemPreComp structure. + */ +typedef void (*xsltElemPreCompDeallocator) (xsltElemPreCompPtr comp); + +/** + * xsltElemPreComp: + * + * The basic structure for compiled items of the AST of the XSLT processor. + * This structure is also intended to be extended by extension implementors. + * TODO: This is somehow not nice, since it has a "free" field, which + * derived stylesheet-structs do not have. + */ +struct _xsltElemPreComp { + xsltElemPreCompPtr next; /* next item in the global chained + list held by xsltStylesheet. */ + xsltStyleType type; /* type of the element */ + xsltTransformFunction func; /* handling function */ + xmlNodePtr inst; /* the node in the stylesheet's tree + corresponding to this item */ + + /* end of common part */ + xsltElemPreCompDeallocator free; /* the deallocator */ +}; + +/** + * xsltStylePreComp: + * + * The abstract basic structure for items of the XSLT processor. + * This includes: + * 1) compiled forms of XSLT instructions (xsl:if, xsl:attribute, etc.) + * 2) compiled forms of literal result elements + * 3) compiled forms of extension elements + */ +typedef struct _xsltStylePreComp xsltStylePreComp; +typedef xsltStylePreComp *xsltStylePreCompPtr; + +#ifdef XSLT_REFACTORED + +/* +* Some pointer-list utility functions. +*/ +XSLTPUBFUN xsltPointerListPtr XSLTCALL + xsltPointerListCreate (int initialSize); +XSLTPUBFUN void XSLTCALL + xsltPointerListFree (xsltPointerListPtr list); +XSLTPUBFUN void XSLTCALL + xsltPointerListClear (xsltPointerListPtr list); +XSLTPUBFUN int XSLTCALL + xsltPointerListAddSize (xsltPointerListPtr list, + void *item, + int initialSize); + +/************************************************************************ + * * + * Refactored structures * + * * + ************************************************************************/ + +typedef struct _xsltNsListContainer xsltNsListContainer; +typedef xsltNsListContainer *xsltNsListContainerPtr; +struct _xsltNsListContainer { + xmlNsPtr *list; + int totalNumber; + int xpathNumber; +}; + +/** + * XSLT_ITEM_COMPATIBILITY_FIELDS: + * + * Fields for API compatibility to the structure + * _xsltElemPreComp which is used for extension functions. + * Note that @next is used for storage; it does not reflect a next + * sibling in the tree. + * TODO: Evaluate if we really need such a compatibility. + */ +#define XSLT_ITEM_COMPATIBILITY_FIELDS \ + xsltElemPreCompPtr next;\ + xsltStyleType type;\ + xsltTransformFunction func;\ + xmlNodePtr inst; + +/** + * XSLT_ITEM_NAVIGATION_FIELDS: + * + * Currently empty. + * TODO: It is intended to hold navigational fields in the future. + */ +#define XSLT_ITEM_NAVIGATION_FIELDS +/* + xsltStylePreCompPtr parent;\ + xsltStylePreCompPtr children;\ + xsltStylePreCompPtr nextItem; +*/ + +/** + * XSLT_ITEM_NSINSCOPE_FIELDS: + * + * The in-scope namespaces. + */ +#define XSLT_ITEM_NSINSCOPE_FIELDS xsltNsListContainerPtr inScopeNs; + +/** + * XSLT_ITEM_COMMON_FIELDS: + * + * Common fields used for all items. + */ +#define XSLT_ITEM_COMMON_FIELDS \ + XSLT_ITEM_COMPATIBILITY_FIELDS \ + XSLT_ITEM_NAVIGATION_FIELDS \ + XSLT_ITEM_NSINSCOPE_FIELDS + +/** + * _xsltStylePreComp: + * + * The abstract basic structure for items of the XSLT processor. + * This includes: + * 1) compiled forms of XSLT instructions (e.g. xsl:if, xsl:attribute, etc.) + * 2) compiled forms of literal result elements + * 3) various properties for XSLT instructions (e.g. xsl:when, + * xsl:with-param) + * + * REVISIT TODO: Keep this structure equal to the fields + * defined by XSLT_ITEM_COMMON_FIELDS + */ +struct _xsltStylePreComp { + xsltElemPreCompPtr next; /* next item in the global chained + list held by xsltStylesheet */ + xsltStyleType type; /* type of the item */ + xsltTransformFunction func; /* handling function */ + xmlNodePtr inst; /* the node in the stylesheet's tree + corresponding to this item. */ + /* Currently no navigational fields. */ + xsltNsListContainerPtr inScopeNs; +}; + +/** + * xsltStyleBasicEmptyItem: + * + * Abstract structure only used as a short-cut for + * XSLT items with no extra fields. + * NOTE that it is intended that this structure looks the same as + * _xsltStylePreComp. + */ +typedef struct _xsltStyleBasicEmptyItem xsltStyleBasicEmptyItem; +typedef xsltStyleBasicEmptyItem *xsltStyleBasicEmptyItemPtr; + +struct _xsltStyleBasicEmptyItem { + XSLT_ITEM_COMMON_FIELDS +}; + +/** + * xsltStyleBasicExpressionItem: + * + * Abstract structure only used as a short-cut for + * XSLT items with just an expression. + */ +typedef struct _xsltStyleBasicExpressionItem xsltStyleBasicExpressionItem; +typedef xsltStyleBasicExpressionItem *xsltStyleBasicExpressionItemPtr; + +struct _xsltStyleBasicExpressionItem { + XSLT_ITEM_COMMON_FIELDS + + const xmlChar *select; /* TODO: Change this to "expression". */ + xmlXPathCompExprPtr comp; /* TODO: Change this to compExpr. */ +}; + +/************************************************************************ + * * + * XSLT-instructions/declarations * + * * + ************************************************************************/ + +/** + * xsltStyleItemElement: + * + * <!-- Category: instruction --> + * <xsl:element + * name = { qname } + * namespace = { uri-reference } + * use-attribute-sets = qnames> + * <!-- Content: template --> + * </xsl:element> + */ +typedef struct _xsltStyleItemElement xsltStyleItemElement; +typedef xsltStyleItemElement *xsltStyleItemElementPtr; + +struct _xsltStyleItemElement { + XSLT_ITEM_COMMON_FIELDS + + const xmlChar *use; + int has_use; + const xmlChar *name; + int has_name; + const xmlChar *ns; + const xmlChar *nsPrefix; + int has_ns; +}; + +/** + * xsltStyleItemAttribute: + * + * <!-- Category: instruction --> + * <xsl:attribute + * name = { qname } + * namespace = { uri-reference }> + * <!-- Content: template --> + * </xsl:attribute> + */ +typedef struct _xsltStyleItemAttribute xsltStyleItemAttribute; +typedef xsltStyleItemAttribute *xsltStyleItemAttributePtr; + +struct _xsltStyleItemAttribute { + XSLT_ITEM_COMMON_FIELDS + const xmlChar *name; + int has_name; + const xmlChar *ns; + const xmlChar *nsPrefix; + int has_ns; +}; + +/** + * xsltStyleItemText: + * + * <!-- Category: instruction --> + * <xsl:text + * disable-output-escaping = "yes" | "no"> + * <!-- Content: #PCDATA --> + * </xsl:text> + */ +typedef struct _xsltStyleItemText xsltStyleItemText; +typedef xsltStyleItemText *xsltStyleItemTextPtr; + +struct _xsltStyleItemText { + XSLT_ITEM_COMMON_FIELDS + int noescape; /* text */ +}; + +/** + * xsltStyleItemComment: + * + * <!-- Category: instruction --> + * <xsl:comment> + * <!-- Content: template --> + * </xsl:comment> + */ +typedef xsltStyleBasicEmptyItem xsltStyleItemComment; +typedef xsltStyleItemComment *xsltStyleItemCommentPtr; + +/** + * xsltStyleItemPI: + * + * <!-- Category: instruction --> + * <xsl:processing-instruction + * name = { ncname }> + * <!-- Content: template --> + * </xsl:processing-instruction> + */ +typedef struct _xsltStyleItemPI xsltStyleItemPI; +typedef xsltStyleItemPI *xsltStyleItemPIPtr; + +struct _xsltStyleItemPI { + XSLT_ITEM_COMMON_FIELDS + const xmlChar *name; + int has_name; +}; + +/** + * xsltStyleItemApplyImports: + * + * <!-- Category: instruction --> + * <xsl:apply-imports /> + */ +typedef xsltStyleBasicEmptyItem xsltStyleItemApplyImports; +typedef xsltStyleItemApplyImports *xsltStyleItemApplyImportsPtr; + +/** + * xsltStyleItemApplyTemplates: + * + * <!-- Category: instruction --> + * <xsl:apply-templates + * select = node-set-expression + * mode = qname> + * <!-- Content: (xsl:sort | xsl:with-param)* --> + * </xsl:apply-templates> + */ +typedef struct _xsltStyleItemApplyTemplates xsltStyleItemApplyTemplates; +typedef xsltStyleItemApplyTemplates *xsltStyleItemApplyTemplatesPtr; + +struct _xsltStyleItemApplyTemplates { + XSLT_ITEM_COMMON_FIELDS + + const xmlChar *mode; /* apply-templates */ + const xmlChar *modeURI; /* apply-templates */ + const xmlChar *select; /* sort, copy-of, value-of, apply-templates */ + xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ + /* TODO: with-params */ +}; + +/** + * xsltStyleItemCallTemplate: + * + * <!-- Category: instruction --> + * <xsl:call-template + * name = qname> + * <!-- Content: xsl:with-param* --> + * </xsl:call-template> + */ +typedef struct _xsltStyleItemCallTemplate xsltStyleItemCallTemplate; +typedef xsltStyleItemCallTemplate *xsltStyleItemCallTemplatePtr; + +struct _xsltStyleItemCallTemplate { + XSLT_ITEM_COMMON_FIELDS + + xsltTemplatePtr templ; /* call-template */ + const xmlChar *name; /* element, attribute, pi */ + int has_name; /* element, attribute, pi */ + const xmlChar *ns; /* element */ + int has_ns; /* element */ + /* TODO: with-params */ +}; + +/** + * xsltStyleItemCopy: + * + * <!-- Category: instruction --> + * <xsl:copy + * use-attribute-sets = qnames> + * <!-- Content: template --> + * </xsl:copy> + */ +typedef struct _xsltStyleItemCopy xsltStyleItemCopy; +typedef xsltStyleItemCopy *xsltStyleItemCopyPtr; + +struct _xsltStyleItemCopy { + XSLT_ITEM_COMMON_FIELDS + const xmlChar *use; /* copy, element */ + int has_use; /* copy, element */ +}; + +/** + * xsltStyleItemIf: + * + * <!-- Category: instruction --> + * <xsl:if + * test = boolean-expression> + * <!-- Content: template --> + * </xsl:if> + */ +typedef struct _xsltStyleItemIf xsltStyleItemIf; +typedef xsltStyleItemIf *xsltStyleItemIfPtr; + +struct _xsltStyleItemIf { + XSLT_ITEM_COMMON_FIELDS + + const xmlChar *test; /* if */ + xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ +}; + + +/** + * xsltStyleItemCopyOf: + * + * <!-- Category: instruction --> + * <xsl:copy-of + * select = expression /> + */ +typedef xsltStyleBasicExpressionItem xsltStyleItemCopyOf; +typedef xsltStyleItemCopyOf *xsltStyleItemCopyOfPtr; + +/** + * xsltStyleItemValueOf: + * + * <!-- Category: instruction --> + * <xsl:value-of + * select = string-expression + * disable-output-escaping = "yes" | "no" /> + */ +typedef struct _xsltStyleItemValueOf xsltStyleItemValueOf; +typedef xsltStyleItemValueOf *xsltStyleItemValueOfPtr; + +struct _xsltStyleItemValueOf { + XSLT_ITEM_COMMON_FIELDS + + const xmlChar *select; + xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ + int noescape; +}; + +/** + * xsltStyleItemNumber: + * + * <!-- Category: instruction --> + * <xsl:number + * level = "single" | "multiple" | "any" + * count = pattern + * from = pattern + * value = number-expression + * format = { string } + * lang = { nmtoken } + * letter-value = { "alphabetic" | "traditional" } + * grouping-separator = { char } + * grouping-size = { number } /> + */ +typedef struct _xsltStyleItemNumber xsltStyleItemNumber; +typedef xsltStyleItemNumber *xsltStyleItemNumberPtr; + +struct _xsltStyleItemNumber { + XSLT_ITEM_COMMON_FIELDS + xsltNumberData numdata; /* number */ +}; + +/** + * xsltStyleItemChoose: + * + * <!-- Category: instruction --> + * <xsl:choose> + * <!-- Content: (xsl:when+, xsl:otherwise?) --> + * </xsl:choose> + */ +typedef xsltStyleBasicEmptyItem xsltStyleItemChoose; +typedef xsltStyleItemChoose *xsltStyleItemChoosePtr; + +/** + * xsltStyleItemFallback: + * + * <!-- Category: instruction --> + * <xsl:fallback> + * <!-- Content: template --> + * </xsl:fallback> + */ +typedef xsltStyleBasicEmptyItem xsltStyleItemFallback; +typedef xsltStyleItemFallback *xsltStyleItemFallbackPtr; + +/** + * xsltStyleItemForEach: + * + * <!-- Category: instruction --> + * <xsl:for-each + * select = node-set-expression> + * <!-- Content: (xsl:sort*, template) --> + * </xsl:for-each> + */ +typedef xsltStyleBasicExpressionItem xsltStyleItemForEach; +typedef xsltStyleItemForEach *xsltStyleItemForEachPtr; + +/** + * xsltStyleItemMessage: + * + * <!-- Category: instruction --> + * <xsl:message + * terminate = "yes" | "no"> + * <!-- Content: template --> + * </xsl:message> + */ +typedef struct _xsltStyleItemMessage xsltStyleItemMessage; +typedef xsltStyleItemMessage *xsltStyleItemMessagePtr; + +struct _xsltStyleItemMessage { + XSLT_ITEM_COMMON_FIELDS + int terminate; +}; + +/** + * xsltStyleItemDocument: + * + * NOTE: This is not an instruction of XSLT 1.0. + */ +typedef struct _xsltStyleItemDocument xsltStyleItemDocument; +typedef xsltStyleItemDocument *xsltStyleItemDocumentPtr; + +struct _xsltStyleItemDocument { + XSLT_ITEM_COMMON_FIELDS + int ver11; /* assigned: in xsltDocumentComp; + read: nowhere; + TODO: Check if we need. */ + const xmlChar *filename; /* document URL */ + int has_filename; +}; + +/************************************************************************ + * * + * Non-instructions (actually properties of instructions/declarations) * + * * + ************************************************************************/ + +/** + * xsltStyleBasicItemVariable: + * + * Basic struct for xsl:variable, xsl:param and xsl:with-param. + * It's currently important to have equal fields, since + * xsltParseStylesheetCallerParam() is used with xsl:with-param from + * the xslt side and with xsl:param from the exslt side (in + * exsltFuncFunctionFunction()). + * + * FUTURE NOTE: In XSLT 2.0 xsl:param, xsl:variable and xsl:with-param + * have additional different fields. + */ +typedef struct _xsltStyleBasicItemVariable xsltStyleBasicItemVariable; +typedef xsltStyleBasicItemVariable *xsltStyleBasicItemVariablePtr; + +struct _xsltStyleBasicItemVariable { + XSLT_ITEM_COMMON_FIELDS + + const xmlChar *select; + xmlXPathCompExprPtr comp; + + const xmlChar *name; + int has_name; + const xmlChar *ns; + int has_ns; +}; + +/** + * xsltStyleItemVariable: + * + * <!-- Category: top-level-element --> + * <xsl:param + * name = qname + * select = expression> + * <!-- Content: template --> + * </xsl:param> + */ +typedef xsltStyleBasicItemVariable xsltStyleItemVariable; +typedef xsltStyleItemVariable *xsltStyleItemVariablePtr; + +/** + * xsltStyleItemParam: + * + * <!-- Category: top-level-element --> + * <xsl:param + * name = qname + * select = expression> + * <!-- Content: template --> + * </xsl:param> + */ +typedef struct _xsltStyleItemParam xsltStyleItemParam; +typedef xsltStyleItemParam *xsltStyleItemParamPtr; + +struct _xsltStyleItemParam { + XSLT_ITEM_COMMON_FIELDS + + const xmlChar *select; + xmlXPathCompExprPtr comp; + + const xmlChar *name; + int has_name; + const xmlChar *ns; + int has_ns; +}; + +/** + * xsltStyleItemWithParam: + * + * <xsl:with-param + * name = qname + * select = expression> + * <!-- Content: template --> + * </xsl:with-param> + */ +typedef xsltStyleBasicItemVariable xsltStyleItemWithParam; +typedef xsltStyleItemWithParam *xsltStyleItemWithParamPtr; + +/** + * xsltStyleItemSort: + * + * Reflects the XSLT xsl:sort item. + * Allowed parents: xsl:apply-templates, xsl:for-each + * <xsl:sort + * select = string-expression + * lang = { nmtoken } + * data-type = { "text" | "number" | qname-but-not-ncname } + * order = { "ascending" | "descending" } + * case-order = { "upper-first" | "lower-first" } /> + */ +typedef struct _xsltStyleItemSort xsltStyleItemSort; +typedef xsltStyleItemSort *xsltStyleItemSortPtr; + +struct _xsltStyleItemSort { + XSLT_ITEM_COMMON_FIELDS + + const xmlChar *stype; /* sort */ + int has_stype; /* sort */ + int number; /* sort */ + const xmlChar *order; /* sort */ + int has_order; /* sort */ + int descending; /* sort */ + const xmlChar *lang; /* sort */ + int has_lang; /* sort */ + xsltLocale locale; /* sort */ + const xmlChar *case_order; /* sort */ + int lower_first; /* sort */ + + const xmlChar *use; + int has_use; + + const xmlChar *select; /* sort, copy-of, value-of, apply-templates */ + + xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ +}; + + +/** + * xsltStyleItemWhen: + * + * <xsl:when + * test = boolean-expression> + * <!-- Content: template --> + * </xsl:when> + * Allowed parent: xsl:choose + */ +typedef struct _xsltStyleItemWhen xsltStyleItemWhen; +typedef xsltStyleItemWhen *xsltStyleItemWhenPtr; + +struct _xsltStyleItemWhen { + XSLT_ITEM_COMMON_FIELDS + + const xmlChar *test; + xmlXPathCompExprPtr comp; +}; + +/** + * xsltStyleItemOtherwise: + * + * Allowed parent: xsl:choose + * <xsl:otherwise> + * <!-- Content: template --> + * </xsl:otherwise> + */ +typedef struct _xsltStyleItemOtherwise xsltStyleItemOtherwise; +typedef xsltStyleItemOtherwise *xsltStyleItemOtherwisePtr; + +struct _xsltStyleItemOtherwise { + XSLT_ITEM_COMMON_FIELDS +}; + +typedef struct _xsltStyleItemInclude xsltStyleItemInclude; +typedef xsltStyleItemInclude *xsltStyleItemIncludePtr; + +struct _xsltStyleItemInclude { + XSLT_ITEM_COMMON_FIELDS + xsltDocumentPtr include; +}; + +/************************************************************************ + * * + * XSLT elements in forwards-compatible mode * + * * + ************************************************************************/ + +typedef struct _xsltStyleItemUknown xsltStyleItemUknown; +typedef xsltStyleItemUknown *xsltStyleItemUknownPtr; +struct _xsltStyleItemUknown { + XSLT_ITEM_COMMON_FIELDS +}; + + +/************************************************************************ + * * + * Extension elements * + * * + ************************************************************************/ + +/* + * xsltStyleItemExtElement: + * + * Reflects extension elements. + * + * NOTE: Due to the fact that the structure xsltElemPreComp is most + * probably already heavily in use out there by users, so we cannot + * easily change it, we'll create an intermediate structure which will + * hold an xsltElemPreCompPtr. + * BIG NOTE: The only problem I see here is that the user processes the + * content of the stylesheet tree, possibly he'll lookup the node->psvi + * fields in order to find subsequent extension functions. + * In this case, the user's code will break, since the node->psvi + * field will hold now the xsltStyleItemExtElementPtr and not + * the xsltElemPreCompPtr. + * However the place where the structure is anchored in the node-tree, + * namely node->psvi, has beed already once been moved from node->_private + * to node->psvi, so we have a precedent here, which, I think, should allow + * us to change such semantics without headaches. + */ +typedef struct _xsltStyleItemExtElement xsltStyleItemExtElement; +typedef xsltStyleItemExtElement *xsltStyleItemExtElementPtr; +struct _xsltStyleItemExtElement { + XSLT_ITEM_COMMON_FIELDS + xsltElemPreCompPtr item; +}; + +/************************************************************************ + * * + * Literal result elements * + * * + ************************************************************************/ + +typedef struct _xsltEffectiveNs xsltEffectiveNs; +typedef xsltEffectiveNs *xsltEffectiveNsPtr; +struct _xsltEffectiveNs { + xsltEffectiveNsPtr nextInStore; /* storage next */ + xsltEffectiveNsPtr next; /* next item in the list */ + const xmlChar *prefix; + const xmlChar *nsName; + /* + * Indicates if eclared on the literal result element; dunno if really + * needed. + */ + int holdByElem; +}; + +/* + * Info for literal result elements. + * This will be set on the elem->psvi field and will be + * shared by literal result elements, which have the same + * excluded result namespaces; i.e., this *won't* be created uniquely + * for every literal result element. + */ +typedef struct _xsltStyleItemLRElementInfo xsltStyleItemLRElementInfo; +typedef xsltStyleItemLRElementInfo *xsltStyleItemLRElementInfoPtr; +struct _xsltStyleItemLRElementInfo { + XSLT_ITEM_COMMON_FIELDS + /* + * @effectiveNs is the set of effective ns-nodes + * on the literal result element, which will be added to the result + * element if not already existing in the result tree. + * This means that excluded namespaces (via exclude-result-prefixes, + * extension-element-prefixes and the XSLT namespace) not added + * to the set. + * Namespace-aliasing was applied on the @effectiveNs. + */ + xsltEffectiveNsPtr effectiveNs; + +}; + +#ifdef XSLT_REFACTORED + +typedef struct _xsltNsAlias xsltNsAlias; +typedef xsltNsAlias *xsltNsAliasPtr; +struct _xsltNsAlias { + xsltNsAliasPtr next; /* next in the list */ + xmlNsPtr literalNs; + xmlNsPtr targetNs; + xmlDocPtr docOfTargetNs; +}; +#endif + +#ifdef XSLT_REFACTORED_XSLT_NSCOMP + +typedef struct _xsltNsMap xsltNsMap; +typedef xsltNsMap *xsltNsMapPtr; +struct _xsltNsMap { + xsltNsMapPtr next; /* next in the list */ + xmlDocPtr doc; + xmlNodePtr elem; /* the element holding the ns-decl */ + xmlNsPtr ns; /* the xmlNs structure holding the XML namespace name */ + const xmlChar *origNsName; /* the original XML namespace name */ + const xmlChar *newNsName; /* the mapped XML namespace name */ +}; +#endif + +/************************************************************************ + * * + * Compile-time structures for *internal* use only * + * * + ************************************************************************/ + +typedef struct _xsltPrincipalStylesheetData xsltPrincipalStylesheetData; +typedef xsltPrincipalStylesheetData *xsltPrincipalStylesheetDataPtr; + +typedef struct _xsltNsList xsltNsList; +typedef xsltNsList *xsltNsListPtr; +struct _xsltNsList { + xsltNsListPtr next; /* next in the list */ + xmlNsPtr ns; +}; + +/* +* xsltVarInfo: +* +* Used at compilation time for parameters and variables. +*/ +typedef struct _xsltVarInfo xsltVarInfo; +typedef xsltVarInfo *xsltVarInfoPtr; +struct _xsltVarInfo { + xsltVarInfoPtr next; /* next in the list */ + xsltVarInfoPtr prev; + int depth; /* the depth in the tree */ + const xmlChar *name; + const xmlChar *nsName; +}; + +/** + * xsltCompilerNodeInfo: + * + * Per-node information during compile-time. + */ +typedef struct _xsltCompilerNodeInfo xsltCompilerNodeInfo; +typedef xsltCompilerNodeInfo *xsltCompilerNodeInfoPtr; +struct _xsltCompilerNodeInfo { + xsltCompilerNodeInfoPtr next; + xsltCompilerNodeInfoPtr prev; + xmlNodePtr node; + int depth; + xsltTemplatePtr templ; /* The owning template */ + int category; /* XSLT element, LR-element or + extension element */ + xsltStyleType type; + xsltElemPreCompPtr item; /* The compiled information */ + /* The current in-scope namespaces */ + xsltNsListContainerPtr inScopeNs; + /* The current excluded result namespaces */ + xsltPointerListPtr exclResultNs; + /* The current extension instruction namespaces */ + xsltPointerListPtr extElemNs; + + /* The current info for literal result elements. */ + xsltStyleItemLRElementInfoPtr litResElemInfo; + /* + * Set to 1 if in-scope namespaces changed, + * or excluded result namespaces changed, + * or extension element namespaces changed. + * This will trigger creation of new infos + * for literal result elements. + */ + int nsChanged; + int preserveWhitespace; + int stripWhitespace; + int isRoot; /* whether this is the stylesheet's root node */ + int forwardsCompat; /* whether forwards-compatible mode is enabled */ + /* whether the content of an extension element was processed */ + int extContentHandled; + /* the type of the current child */ + xsltStyleType curChildType; +}; + +/** + * XSLT_CCTXT: + * + * get pointer to compiler context + */ +#define XSLT_CCTXT(style) ((xsltCompilerCtxtPtr) style->compCtxt) + +typedef enum { + XSLT_ERROR_SEVERITY_ERROR = 0, + XSLT_ERROR_SEVERITY_WARNING +} xsltErrorSeverityType; + +typedef struct _xsltCompilerCtxt xsltCompilerCtxt; +typedef xsltCompilerCtxt *xsltCompilerCtxtPtr; +struct _xsltCompilerCtxt { + void *errorCtxt; /* user specific error context */ + /* + * used for error/warning reports; e.g. XSLT_ERROR_SEVERITY_WARNING */ + xsltErrorSeverityType errSeverity; + int warnings; /* TODO: number of warnings found at + compilation */ + int errors; /* TODO: number of errors found at + compilation */ + xmlDictPtr dict; + xsltStylesheetPtr style; + int simplified; /* whether this is a simplified stylesheet */ + /* TODO: structured/unstructured error contexts. */ + int depth; /* Current depth of processing */ + + xsltCompilerNodeInfoPtr inode; + xsltCompilerNodeInfoPtr inodeList; + xsltCompilerNodeInfoPtr inodeLast; + xsltPointerListPtr tmpList; /* Used for various purposes */ + /* + * The XSLT version as specified by the stylesheet's root element. + */ + int isInclude; + int hasForwardsCompat; /* whether forwards-compatible mode was used + in a parsing episode */ + int maxNodeInfos; /* TEMP TODO: just for the interest */ + int maxLREs; /* TEMP TODO: just for the interest */ + /* + * In order to keep the old behaviour, applying strict rules of + * the spec can be turned off. This has effect only on special + * mechanisms like whitespace-stripping in the stylesheet. + */ + int strict; + xsltPrincipalStylesheetDataPtr psData; + xsltStyleItemUknownPtr unknownItem; + int hasNsAliases; /* Indicator if there was an xsl:namespace-alias. */ + xsltNsAliasPtr nsAliases; + xsltVarInfoPtr ivars; /* Storage of local in-scope variables/params. */ + xsltVarInfoPtr ivar; /* topmost local variable/param. */ +}; + +#else /* XSLT_REFACTORED */ +/* +* The old structures before refactoring. +*/ + +/** + * _xsltStylePreComp: + * + * The in-memory structure corresponding to XSLT stylesheet constructs + * precomputed data. + */ +struct _xsltStylePreComp { + xsltElemPreCompPtr next; /* chained list */ + xsltStyleType type; /* type of the element */ + xsltTransformFunction func; /* handling function */ + xmlNodePtr inst; /* the instruction */ + + /* + * Pre computed values. + */ + + const xmlChar *stype; /* sort */ + int has_stype; /* sort */ + int number; /* sort */ + const xmlChar *order; /* sort */ + int has_order; /* sort */ + int descending; /* sort */ + const xmlChar *lang; /* sort */ + int has_lang; /* sort */ + xsltLocale locale; /* sort */ + const xmlChar *case_order; /* sort */ + int lower_first; /* sort */ + + const xmlChar *use; /* copy, element */ + int has_use; /* copy, element */ + + int noescape; /* text */ + + const xmlChar *name; /* element, attribute, pi */ + int has_name; /* element, attribute, pi */ + const xmlChar *ns; /* element */ + int has_ns; /* element */ + + const xmlChar *mode; /* apply-templates */ + const xmlChar *modeURI; /* apply-templates */ + + const xmlChar *test; /* if */ + + xsltTemplatePtr templ; /* call-template */ + + const xmlChar *select; /* sort, copy-of, value-of, apply-templates */ + + int ver11; /* document */ + const xmlChar *filename; /* document URL */ + int has_filename; /* document */ + + xsltNumberData numdata; /* number */ + + xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ + xmlNsPtr *nsList; /* the namespaces in scope */ + int nsNr; /* the number of namespaces in scope */ +}; + +#endif /* XSLT_REFACTORED */ + + +/* + * The in-memory structure corresponding to an XSLT Variable + * or Param. + */ +typedef struct _xsltStackElem xsltStackElem; +typedef xsltStackElem *xsltStackElemPtr; +struct _xsltStackElem { + struct _xsltStackElem *next;/* chained list */ + xsltStylePreCompPtr comp; /* the compiled form */ + int computed; /* was the evaluation done */ + const xmlChar *name; /* the local part of the name QName */ + const xmlChar *nameURI; /* the URI part of the name QName */ + const xmlChar *select; /* the eval string */ + xmlNodePtr tree; /* the sequence constructor if no eval + string or the location */ + xmlXPathObjectPtr value; /* The value if computed */ + xmlDocPtr fragment; /* The Result Tree Fragments (needed for XSLT 1.0) + which are bound to the variable's lifetime. */ + int level; /* the depth in the tree; + -1 if persistent (e.g. a given xsl:with-param) */ + xsltTransformContextPtr context; /* The transformation context; needed to cache + the variables */ + int flags; +}; + +#ifdef XSLT_REFACTORED + +struct _xsltPrincipalStylesheetData { + /* + * Namespace dictionary for ns-prefixes and ns-names: + * TODO: Shared between stylesheets, and XPath mechanisms. + * Not used yet. + */ + xmlDictPtr namespaceDict; + /* + * Global list of in-scope namespaces. + */ + xsltPointerListPtr inScopeNamespaces; + /* + * Global list of information for [xsl:]excluded-result-prefixes. + */ + xsltPointerListPtr exclResultNamespaces; + /* + * Global list of information for [xsl:]extension-element-prefixes. + */ + xsltPointerListPtr extElemNamespaces; + xsltEffectiveNsPtr effectiveNs; +#ifdef XSLT_REFACTORED_XSLT_NSCOMP + /* + * Namespace name map to get rid of string comparison of namespace names. + */ + xsltNsMapPtr nsMap; +#endif +}; + + +#endif +/* + * Note that we added a @compCtxt field to anchor an stylesheet compilation + * context, since, due to historical reasons, various compile-time function + * take only the stylesheet as argument and not a compilation context. + */ +struct _xsltStylesheet { + /* + * The stylesheet import relation is kept as a tree. + */ + struct _xsltStylesheet *parent; + struct _xsltStylesheet *next; + struct _xsltStylesheet *imports; + + xsltDocumentPtr docList; /* the include document list */ + + /* + * General data on the style sheet document. + */ + xmlDocPtr doc; /* the parsed XML stylesheet */ + xmlHashTablePtr stripSpaces;/* the hash table of the strip-space and + preserve space elements */ + int stripAll; /* strip-space * (1) preserve-space * (-1) */ + xmlHashTablePtr cdataSection;/* the hash table of the cdata-section */ + + /* + * Global variable or parameters. + */ + xsltStackElemPtr variables; /* linked list of param and variables */ + + /* + * Template descriptions. + */ + xsltTemplatePtr templates; /* the ordered list of templates */ + void *templatesHash; /* hash table or wherever compiled templates + information is stored */ + void *rootMatch; /* template based on / */ + void *keyMatch; /* template based on key() */ + void *elemMatch; /* template based on * */ + void *attrMatch; /* template based on @* */ + void *parentMatch; /* template based on .. */ + void *textMatch; /* template based on text() */ + void *piMatch; /* template based on processing-instruction() */ + void *commentMatch; /* template based on comment() */ + + /* + * Namespace aliases. + * NOTE: Not used in the refactored code. + */ + xmlHashTablePtr nsAliases; /* the namespace alias hash tables */ + + /* + * Attribute sets. + */ + xmlHashTablePtr attributeSets;/* the attribute sets hash tables */ + + /* + * Namespaces. + * TODO: Eliminate this. + */ + xmlHashTablePtr nsHash; /* the set of namespaces in use: + ATTENTION: This is used for + execution of XPath expressions; unfortunately + it restricts the stylesheet to have distinct + prefixes. + TODO: We need to get rid of this. + */ + void *nsDefs; /* ATTENTION TODO: This is currently used to store + xsltExtDefPtr (in extensions.c) and + *not* xmlNsPtr. + */ + + /* + * Key definitions. + */ + void *keys; /* key definitions */ + + /* + * Output related stuff. + */ + xmlChar *method; /* the output method */ + xmlChar *methodURI; /* associated namespace if any */ + xmlChar *version; /* version string */ + xmlChar *encoding; /* encoding string */ + int omitXmlDeclaration; /* omit-xml-declaration = "yes" | "no" */ + + /* + * Number formatting. + */ + xsltDecimalFormatPtr decimalFormat; + int standalone; /* standalone = "yes" | "no" */ + xmlChar *doctypePublic; /* doctype-public string */ + xmlChar *doctypeSystem; /* doctype-system string */ + int indent; /* should output being indented */ + xmlChar *mediaType; /* media-type string */ + + /* + * Precomputed blocks. + */ + xsltElemPreCompPtr preComps;/* list of precomputed blocks */ + int warnings; /* number of warnings found at compilation */ + int errors; /* number of errors found at compilation */ + + xmlChar *exclPrefix; /* last excluded prefixes */ + xmlChar **exclPrefixTab; /* array of excluded prefixes */ + int exclPrefixNr; /* number of excluded prefixes in scope */ + int exclPrefixMax; /* size of the array */ + + void *_private; /* user defined data */ + + /* + * Extensions. + */ + xmlHashTablePtr extInfos; /* the extension data */ + int extrasNr; /* the number of extras required */ + + /* + * For keeping track of nested includes + */ + xsltDocumentPtr includes; /* points to last nested include */ + + /* + * dictionary: shared between stylesheet, context and documents. + */ + xmlDictPtr dict; + /* + * precompiled attribute value templates. + */ + void *attVTs; + /* + * if namespace-alias has an alias for the default stylesheet prefix + * NOTE: Not used in the refactored code. + */ + const xmlChar *defaultAlias; + /* + * bypass pre-processing (already done) (used in imports) + */ + int nopreproc; + /* + * all document text strings were internalized + */ + int internalized; + /* + * Literal Result Element as Stylesheet c.f. section 2.3 + */ + int literal_result; + /* + * The principal stylesheet + */ + xsltStylesheetPtr principal; +#ifdef XSLT_REFACTORED + /* + * Compilation context used during compile-time. + */ + xsltCompilerCtxtPtr compCtxt; /* TODO: Change this to (void *). */ + + xsltPrincipalStylesheetDataPtr principalData; +#endif + /* + * Forwards-compatible processing + */ + int forwards_compatible; + + xmlHashTablePtr namedTemplates; /* hash table of named templates */ + + xmlXPathContextPtr xpathCtxt; +}; + +typedef struct _xsltTransformCache xsltTransformCache; +typedef xsltTransformCache *xsltTransformCachePtr; +struct _xsltTransformCache { + xmlDocPtr RVT; + int nbRVT; + xsltStackElemPtr stackItems; + int nbStackItems; +#ifdef XSLT_DEBUG_PROFILE_CACHE + int dbgCachedRVTs; + int dbgReusedRVTs; + int dbgCachedVars; + int dbgReusedVars; +#endif +}; + +/* + * The in-memory structure corresponding to an XSLT Transformation. + */ +typedef enum { + XSLT_OUTPUT_XML = 0, + XSLT_OUTPUT_HTML, + XSLT_OUTPUT_TEXT +} xsltOutputType; + +typedef enum { + XSLT_STATE_OK = 0, + XSLT_STATE_ERROR, + XSLT_STATE_STOPPED +} xsltTransformState; + +struct _xsltTransformContext { + xsltStylesheetPtr style; /* the stylesheet used */ + xsltOutputType type; /* the type of output */ + + xsltTemplatePtr templ; /* the current template */ + int templNr; /* Nb of templates in the stack */ + int templMax; /* Size of the templtes stack */ + xsltTemplatePtr *templTab; /* the template stack */ + + xsltStackElemPtr vars; /* the current variable list */ + int varsNr; /* Nb of variable list in the stack */ + int varsMax; /* Size of the variable list stack */ + xsltStackElemPtr *varsTab; /* the variable list stack */ + int varsBase; /* the var base for current templ */ + + /* + * Extensions + */ + xmlHashTablePtr extFunctions; /* the extension functions */ + xmlHashTablePtr extElements; /* the extension elements */ + xmlHashTablePtr extInfos; /* the extension data */ + + const xmlChar *mode; /* the current mode */ + const xmlChar *modeURI; /* the current mode URI */ + + xsltDocumentPtr docList; /* the document list */ + + xsltDocumentPtr document; /* the current source document; can be NULL if an RTF */ + xmlNodePtr node; /* the current node being processed */ + xmlNodeSetPtr nodeList; /* the current node list */ + /* xmlNodePtr current; the node */ + + xmlDocPtr output; /* the resulting document */ + xmlNodePtr insert; /* the insertion node */ + + xmlXPathContextPtr xpathCtxt; /* the XPath context */ + xsltTransformState state; /* the current state */ + + /* + * Global variables + */ + xmlHashTablePtr globalVars; /* the global variables and params */ + + xmlNodePtr inst; /* the instruction in the stylesheet */ + + int xinclude; /* should XInclude be processed */ + + const char * outputFile; /* the output URI if known */ + + int profile; /* is this run profiled */ + long prof; /* the current profiled value */ + int profNr; /* Nb of templates in the stack */ + int profMax; /* Size of the templtaes stack */ + long *profTab; /* the profile template stack */ + + void *_private; /* user defined data */ + + int extrasNr; /* the number of extras used */ + int extrasMax; /* the number of extras allocated */ + xsltRuntimeExtraPtr extras; /* extra per runtime information */ + + xsltDocumentPtr styleList; /* the stylesheet docs list */ + void * sec; /* the security preferences if any */ + + xmlGenericErrorFunc error; /* a specific error handler */ + void * errctx; /* context for the error handler */ + + xsltSortFunc sortfunc; /* a ctxt specific sort routine */ + + /* + * handling of temporary Result Value Tree + * (XSLT 1.0 term: "Result Tree Fragment") + */ + xmlDocPtr tmpRVT; /* list of RVT without persistance */ + xmlDocPtr persistRVT; /* list of persistant RVTs */ + int ctxtflags; /* context processing flags */ + + /* + * Speed optimization when coalescing text nodes + */ + const xmlChar *lasttext; /* last text node content */ + int lasttsize; /* last text node size */ + int lasttuse; /* last text node use */ + /* + * Per Context Debugging + */ + int debugStatus; /* the context level debug status */ + unsigned long* traceCode; /* pointer to the variable holding the mask */ + + int parserOptions; /* parser options xmlParserOption */ + + /* + * dictionary: shared between stylesheet, context and documents. + */ + xmlDictPtr dict; + xmlDocPtr tmpDoc; /* Obsolete; not used in the library. */ + /* + * all document text strings are internalized + */ + int internalized; + int nbKeys; + int hasTemplKeyPatterns; + xsltTemplatePtr currentTemplateRule; /* the Current Template Rule */ + xmlNodePtr initialContextNode; + xmlDocPtr initialContextDoc; + xsltTransformCachePtr cache; + void *contextVariable; /* the current variable item */ + xmlDocPtr localRVT; /* list of local tree fragments; will be freed when + the instruction which created the fragment + exits */ + xmlDocPtr localRVTBase; /* Obsolete */ + int keyInitLevel; /* Needed to catch recursive keys issues */ + int depth; /* Needed to catch recursions */ + int maxTemplateDepth; + int maxTemplateVars; + unsigned long opLimit; + unsigned long opCount; +}; + +/** + * CHECK_STOPPED: + * + * Macro to check if the XSLT processing should be stopped. + * Will return from the function. + */ +#define CHECK_STOPPED if (ctxt->state == XSLT_STATE_STOPPED) return; + +/** + * CHECK_STOPPEDE: + * + * Macro to check if the XSLT processing should be stopped. + * Will goto the error: label. + */ +#define CHECK_STOPPEDE if (ctxt->state == XSLT_STATE_STOPPED) goto error; + +/** + * CHECK_STOPPED0: + * + * Macro to check if the XSLT processing should be stopped. + * Will return from the function with a 0 value. + */ +#define CHECK_STOPPED0 if (ctxt->state == XSLT_STATE_STOPPED) return(0); + +/* + * The macro XML_CAST_FPTR is a hack to avoid a gcc warning about + * possible incompatibilities between function pointers and object + * pointers. It is defined in libxml/hash.h within recent versions + * of libxml2, but is put here for compatibility. + */ +#ifndef XML_CAST_FPTR +/** + * XML_CAST_FPTR: + * @fptr: pointer to a function + * + * Macro to do a casting from an object pointer to a + * function pointer without encountering a warning from + * gcc + * + * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) + * This macro violated ISO C aliasing rules (gcc4 on s390 broke) + * so it is disabled now + */ + +#define XML_CAST_FPTR(fptr) fptr +#endif +/* + * Functions associated to the internal types +xsltDecimalFormatPtr xsltDecimalFormatGetByName(xsltStylesheetPtr sheet, + xmlChar *name); + */ +XSLTPUBFUN xsltStylesheetPtr XSLTCALL + xsltNewStylesheet (void); +XSLTPUBFUN xsltStylesheetPtr XSLTCALL + xsltParseStylesheetFile (const xmlChar* filename); +XSLTPUBFUN void XSLTCALL + xsltFreeStylesheet (xsltStylesheetPtr style); +XSLTPUBFUN int XSLTCALL + xsltIsBlank (xmlChar *str); +XSLTPUBFUN void XSLTCALL + xsltFreeStackElemList (xsltStackElemPtr elem); +XSLTPUBFUN xsltDecimalFormatPtr XSLTCALL + xsltDecimalFormatGetByName(xsltStylesheetPtr style, + xmlChar *name); +XSLTPUBFUN xsltDecimalFormatPtr XSLTCALL + xsltDecimalFormatGetByQName(xsltStylesheetPtr style, + const xmlChar *nsUri, + const xmlChar *name); + +XSLTPUBFUN xsltStylesheetPtr XSLTCALL + xsltParseStylesheetProcess(xsltStylesheetPtr ret, + xmlDocPtr doc); +XSLTPUBFUN void XSLTCALL + xsltParseStylesheetOutput(xsltStylesheetPtr style, + xmlNodePtr cur); +XSLTPUBFUN xsltStylesheetPtr XSLTCALL + xsltParseStylesheetDoc (xmlDocPtr doc); +XSLTPUBFUN xsltStylesheetPtr XSLTCALL + xsltParseStylesheetImportedDoc(xmlDocPtr doc, + xsltStylesheetPtr style); +XSLTPUBFUN int XSLTCALL + xsltParseStylesheetUser(xsltStylesheetPtr style, + xmlDocPtr doc); +XSLTPUBFUN xsltStylesheetPtr XSLTCALL + xsltLoadStylesheetPI (xmlDocPtr doc); +XSLTPUBFUN void XSLTCALL + xsltNumberFormat (xsltTransformContextPtr ctxt, + xsltNumberDataPtr data, + xmlNodePtr node); +XSLTPUBFUN xmlXPathError XSLTCALL + xsltFormatNumberConversion(xsltDecimalFormatPtr self, + xmlChar *format, + double number, + xmlChar **result); + +XSLTPUBFUN void XSLTCALL + xsltParseTemplateContent(xsltStylesheetPtr style, + xmlNodePtr templ); +XSLTPUBFUN int XSLTCALL + xsltAllocateExtra (xsltStylesheetPtr style); +XSLTPUBFUN int XSLTCALL + xsltAllocateExtraCtxt (xsltTransformContextPtr ctxt); +/* + * Extra functions for Result Value Trees + */ +XSLTPUBFUN xmlDocPtr XSLTCALL + xsltCreateRVT (xsltTransformContextPtr ctxt); +XSLTPUBFUN int XSLTCALL + xsltRegisterTmpRVT (xsltTransformContextPtr ctxt, + xmlDocPtr RVT); +XSLTPUBFUN int XSLTCALL + xsltRegisterLocalRVT (xsltTransformContextPtr ctxt, + xmlDocPtr RVT); +XSLTPUBFUN int XSLTCALL + xsltRegisterPersistRVT (xsltTransformContextPtr ctxt, + xmlDocPtr RVT); +XSLTPUBFUN int XSLTCALL + xsltExtensionInstructionResultRegister( + xsltTransformContextPtr ctxt, + xmlXPathObjectPtr obj); +XSLTPUBFUN int XSLTCALL + xsltExtensionInstructionResultFinalize( + xsltTransformContextPtr ctxt); +XSLTPUBFUN int XSLTCALL + xsltFlagRVTs( + xsltTransformContextPtr ctxt, + xmlXPathObjectPtr obj, + void *val); +XSLTPUBFUN void XSLTCALL + xsltFreeRVTs (xsltTransformContextPtr ctxt); +XSLTPUBFUN void XSLTCALL + xsltReleaseRVT (xsltTransformContextPtr ctxt, + xmlDocPtr RVT); +/* + * Extra functions for Attribute Value Templates + */ +XSLTPUBFUN void XSLTCALL + xsltCompileAttr (xsltStylesheetPtr style, + xmlAttrPtr attr); +XSLTPUBFUN xmlChar * XSLTCALL + xsltEvalAVT (xsltTransformContextPtr ctxt, + void *avt, + xmlNodePtr node); +XSLTPUBFUN void XSLTCALL + xsltFreeAVTList (void *avt); + +/* + * Extra function for successful xsltCleanupGlobals / xsltInit sequence. + */ + +XSLTPUBFUN void XSLTCALL + xsltUninit (void); + +/************************************************************************ + * * + * Compile-time functions for *internal* use only * + * * + ************************************************************************/ + +#ifdef XSLT_REFACTORED +XSLTPUBFUN void XSLTCALL + xsltParseSequenceConstructor( + xsltCompilerCtxtPtr cctxt, + xmlNodePtr start); +XSLTPUBFUN int XSLTCALL + xsltParseAnyXSLTElem (xsltCompilerCtxtPtr cctxt, + xmlNodePtr elem); +#ifdef XSLT_REFACTORED_XSLT_NSCOMP +XSLTPUBFUN int XSLTCALL + xsltRestoreDocumentNamespaces( + xsltNsMapPtr ns, + xmlDocPtr doc); +#endif +#endif /* XSLT_REFACTORED */ + +/************************************************************************ + * * + * Transformation-time functions for *internal* use only * + * * + ************************************************************************/ +XSLTPUBFUN int XSLTCALL + xsltInitCtxtKey (xsltTransformContextPtr ctxt, + xsltDocumentPtr doc, + xsltKeyDefPtr keyd); +XSLTPUBFUN int XSLTCALL + xsltInitAllDocKeys (xsltTransformContextPtr ctxt); +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLT_H__ */ + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltconfig.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltconfig.h new file mode 100644 index 000000000000..519629e10848 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltconfig.h @@ -0,0 +1,180 @@ +/* + * Summary: compile-time version information for the XSLT engine + * Description: compile-time version information for the XSLT engine + * this module is autogenerated. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLTCONFIG_H__ +#define __XML_XSLTCONFIG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * LIBXSLT_DOTTED_VERSION: + * + * the version string like "1.2.3" + */ +#define LIBXSLT_DOTTED_VERSION "1.1.34" + +/** + * LIBXSLT_VERSION: + * + * the version number: 1.2.3 value is 10203 + */ +#define LIBXSLT_VERSION 10134 + +/** + * LIBXSLT_VERSION_STRING: + * + * the version number string, 1.2.3 value is "10203" + */ +#define LIBXSLT_VERSION_STRING "10134" + +/** + * LIBXSLT_VERSION_EXTRA: + * + * extra version information, used to show a CVS compilation + */ +#define LIBXSLT_VERSION_EXTRA "" + +/** + * WITH_XSLT_DEBUG: + * + * Activate the compilation of the debug reporting. Speed penalty + * is insignifiant and being able to run xsltpoc -v is useful. On + * by default unless --without-debug is passed to configure + */ +#if 1 +#define WITH_XSLT_DEBUG +#endif + +#if 0 +/** + * DEBUG_MEMORY: + * + * should be activated only when debugging libxslt. It replaces the + * allocator with a collect and debug shell to the libc allocator. + * Use configure --with-mem-debug to activate it on both library + */ +#define DEBUG_MEMORY + +/** + * DEBUG_MEMORY_LOCATION: + * + * should be activated only when debugging libxslt. + * DEBUG_MEMORY_LOCATION should be activated only when libxml has + * been configured with --with-debug-mem too + */ +#define DEBUG_MEMORY_LOCATION +#endif + +/** + * XSLT_NEED_TRIO: + * + * should be activated if the existing libc library lacks some of the + * string formatting function, in that case reuse the Trio ones already + * compiled in the libxml2 library. + */ + +#if 0 +#define XSLT_NEED_TRIO +#endif +#ifdef __VMS +#define HAVE_MATH_H 1 +#define HAVE_SYS_STAT_H 1 +#ifndef XSLT_NEED_TRIO +#define XSLT_NEED_TRIO +#endif +#endif + +#ifdef XSLT_NEED_TRIO +#define TRIO_REPLACE_STDIO +#endif + +/** + * WITH_XSLT_DEBUGGER: + * + * Activate the compilation of the debugger support. Speed penalty + * is insignifiant. + * On by default unless --without-debugger is passed to configure + */ +#if 1 +#ifndef WITH_DEBUGGER +#define WITH_DEBUGGER +#endif +#endif + +/** + * WITH_PROFILER: + * + * Activate the compilation of the profiler. Speed penalty + * is insignifiant. + * On by default unless --without-profiler is passed to configure + */ +#if 1 +#ifndef WITH_PROFILER +#define WITH_PROFILER +#endif +#endif + +/** + * WITH_MODULES: + * + * Whether module support is configured into libxslt + * Note: no default module path for win32 platforms + */ +#if 0 +#ifndef WITH_MODULES +#define WITH_MODULES +#endif +#define LIBXSLT_DEFAULT_PLUGINS_PATH() "/home/flavorjones/code/oss/nokogiri/ports/x86_64-redhat-linux/libxslt/1.1.34/lib/libxslt-plugins" +#endif + +/** + * ATTRIBUTE_UNUSED: + * + * This macro is used to flag unused function parameters to GCC + */ +#ifdef __GNUC__ +#ifndef ATTRIBUTE_UNUSED +#define ATTRIBUTE_UNUSED __attribute__((unused)) +#endif +#else +#define ATTRIBUTE_UNUSED +#endif + +/** + * LIBXSLT_ATTR_FORMAT: + * + * This macro is used to indicate to GCC the parameters are printf-like + */ +#ifdef __GNUC__ +#define LIBXSLT_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args))) +#else +#define LIBXSLT_ATTR_FORMAT(fmt,args) +#endif + +/** + * LIBXSLT_PUBLIC: + * + * This macro is used to declare PUBLIC variables for Cygwin and for MSC on Windows + */ +#if !defined LIBXSLT_PUBLIC +#if (defined(__CYGWIN__) || defined _MSC_VER) && !defined IN_LIBXSLT && !defined LIBXSLT_STATIC +#define LIBXSLT_PUBLIC __declspec(dllimport) +#else +#define LIBXSLT_PUBLIC +#endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLTCONFIG_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltexports.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltexports.h new file mode 100644 index 000000000000..99b6ac387c1e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltexports.h @@ -0,0 +1,142 @@ +/* + * Summary: macros for marking symbols as exportable/importable. + * Description: macros for marking symbols as exportable/importable. + * + * Copy: See Copyright for the status of this software. + * + * Author: Igor Zlatkovic <igor@zlatkovic.com> + */ + +#ifndef __XSLT_EXPORTS_H__ +#define __XSLT_EXPORTS_H__ + +/** + * XSLTPUBFUN: + * XSLTPUBFUN, XSLTPUBVAR, XSLTCALL + * + * Macros which declare an exportable function, an exportable variable and + * the calling convention used for functions. + * + * Please use an extra block for every platform/compiler combination when + * modifying this, rather than overlong #ifdef lines. This helps + * readability as well as the fact that different compilers on the same + * platform might need different definitions. + */ + +/** + * XSLTPUBFUN: + * + * Macros which declare an exportable function + */ +#define XSLTPUBFUN +/** + * XSLTPUBVAR: + * + * Macros which declare an exportable variable + */ +#define XSLTPUBVAR extern +/** + * XSLTCALL: + * + * Macros which declare the called convention for exported functions + */ +#define XSLTCALL + +/** DOC_DISABLE */ + +/* Windows platform with MS compiler */ +#if defined(_WIN32) && defined(_MSC_VER) + #undef XSLTPUBFUN + #undef XSLTPUBVAR + #undef XSLTCALL + #if defined(IN_LIBXSLT) && !defined(LIBXSLT_STATIC) + #define XSLTPUBFUN __declspec(dllexport) + #define XSLTPUBVAR __declspec(dllexport) + #else + #define XSLTPUBFUN + #if !defined(LIBXSLT_STATIC) + #define XSLTPUBVAR __declspec(dllimport) extern + #else + #define XSLTPUBVAR extern + #endif + #endif + #define XSLTCALL __cdecl + #if !defined _REENTRANT + #define _REENTRANT + #endif +#endif + +/* Windows platform with Borland compiler */ +#if defined(_WIN32) && defined(__BORLANDC__) + #undef XSLTPUBFUN + #undef XSLTPUBVAR + #undef XSLTCALL + #if defined(IN_LIBXSLT) && !defined(LIBXSLT_STATIC) + #define XSLTPUBFUN __declspec(dllexport) + #define XSLTPUBVAR __declspec(dllexport) extern + #else + #define XSLTPUBFUN + #if !defined(LIBXSLT_STATIC) + #define XSLTPUBVAR __declspec(dllimport) extern + #else + #define XSLTPUBVAR extern + #endif + #endif + #define XSLTCALL __cdecl + #if !defined _REENTRANT + #define _REENTRANT + #endif +#endif + +/* Windows platform with GNU compiler (Mingw) */ +#if defined(_WIN32) && defined(__MINGW32__) + #undef XSLTPUBFUN + #undef XSLTPUBVAR + #undef XSLTCALL +/* + #if defined(IN_LIBXSLT) && !defined(LIBXSLT_STATIC) +*/ + #if !defined(LIBXSLT_STATIC) + #define XSLTPUBFUN __declspec(dllexport) + #define XSLTPUBVAR __declspec(dllexport) extern + #else + #define XSLTPUBFUN + #if !defined(LIBXSLT_STATIC) + #define XSLTPUBVAR __declspec(dllimport) extern + #else + #define XSLTPUBVAR extern + #endif + #endif + #define XSLTCALL __cdecl + #if !defined _REENTRANT + #define _REENTRANT + #endif +#endif + +/* Cygwin platform (does not define _WIN32), GNU compiler */ +#if defined(__CYGWIN__) + #undef XSLTPUBFUN + #undef XSLTPUBVAR + #undef XSLTCALL + #if defined(IN_LIBXSLT) && !defined(LIBXSLT_STATIC) + #define XSLTPUBFUN __declspec(dllexport) + #define XSLTPUBVAR __declspec(dllexport) + #else + #define XSLTPUBFUN + #if !defined(LIBXSLT_STATIC) + #define XSLTPUBVAR __declspec(dllimport) extern + #else + #define XSLTPUBVAR extern + #endif + #endif + #define XSLTCALL __cdecl +#endif + +/* Compatibility */ +#if !defined(LIBXSLT_PUBLIC) +#define LIBXSLT_PUBLIC XSLTPUBVAR +#endif + +#endif /* __XSLT_EXPORTS_H__ */ + + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltlocale.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltlocale.h new file mode 100644 index 000000000000..f3b9d6e0f2fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltlocale.h @@ -0,0 +1,76 @@ +/* + * Summary: Locale handling + * Description: Interfaces for locale handling. Needed for language dependent + * sorting. + * + * Copy: See Copyright for the status of this software. + * + * Author: Nick Wellnhofer + */ + +#ifndef __XML_XSLTLOCALE_H__ +#define __XML_XSLTLOCALE_H__ + +#include <libxml/xmlstring.h> +#include "xsltexports.h" + +#ifdef HAVE_STRXFRM_L + +/* + * XSLT_LOCALE_POSIX: + * Macro indicating to use POSIX locale extensions + */ +#define XSLT_LOCALE_POSIX + +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif +#ifdef HAVE_XLOCALE_H +#include <xlocale.h> +#endif + +typedef locale_t xsltLocale; +typedef xmlChar xsltLocaleChar; + +#elif defined(_WIN32) && !defined(__CYGWIN__) + +/* + * XSLT_LOCALE_WINAPI: + * Macro indicating to use WinAPI for extended locale support + */ +#define XSLT_LOCALE_WINAPI + +#include <windows.h> +#include <winnls.h> + +typedef LCID xsltLocale; +typedef wchar_t xsltLocaleChar; + +#else + +/* + * XSLT_LOCALE_NONE: + * Macro indicating that there's no extended locale support + */ +#define XSLT_LOCALE_NONE + +typedef void *xsltLocale; +typedef xmlChar xsltLocaleChar; + +#endif + +XSLTPUBFUN xsltLocale XSLTCALL + xsltNewLocale (const xmlChar *langName); +XSLTPUBFUN void XSLTCALL + xsltFreeLocale (xsltLocale locale); +XSLTPUBFUN xsltLocaleChar * XSLTCALL + xsltStrxfrm (xsltLocale locale, + const xmlChar *string); +XSLTPUBFUN int XSLTCALL + xsltLocaleStrcmp (xsltLocale locale, + const xsltLocaleChar *str1, + const xsltLocaleChar *str2); +XSLTPUBFUN void XSLTCALL + xsltFreeLocales (void); + +#endif /* __XML_XSLTLOCALE_H__ */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltutils.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltutils.h new file mode 100644 index 000000000000..ea6c3740540e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/include/libxslt/xsltutils.h @@ -0,0 +1,313 @@ +/* + * Summary: set of utilities for the XSLT engine + * Description: interfaces for the utilities module of the XSLT engine. + * things like message handling, profiling, and other + * generally useful routines. + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_XSLTUTILS_H__ +#define __XML_XSLTUTILS_H__ + +#include <libxslt/xsltconfig.h> +#ifdef HAVE_STDARG_H +#include <stdarg.h> +#endif +#include <libxml/xpath.h> +#include <libxml/dict.h> +#include <libxml/xmlerror.h> +#include "xsltexports.h" +#include "xsltInternals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * XSLT_TODO: + * + * Macro to flag unimplemented blocks. + */ +#define XSLT_TODO \ + xsltGenericError(xsltGenericErrorContext, \ + "Unimplemented block at %s:%d\n", \ + __FILE__, __LINE__); + +/** + * XSLT_STRANGE: + * + * Macro to flag that a problem was detected internally. + */ +#define XSLT_STRANGE \ + xsltGenericError(xsltGenericErrorContext, \ + "Internal error at %s:%d\n", \ + __FILE__, __LINE__); + +/** + * IS_XSLT_ELEM: + * + * Checks that the element pertains to XSLT namespace. + */ +#define IS_XSLT_ELEM(n) \ + (((n) != NULL) && ((n)->type == XML_ELEMENT_NODE) && \ + ((n)->ns != NULL) && (xmlStrEqual((n)->ns->href, XSLT_NAMESPACE))) + +/** + * IS_XSLT_NAME: + * + * Checks the value of an element in XSLT namespace. + */ +#define IS_XSLT_NAME(n, val) \ + (xmlStrEqual((n)->name, (const xmlChar *) (val))) + +/** + * IS_XSLT_REAL_NODE: + * + * Check that a node is a 'real' one: document, element, text or attribute. + */ +#define IS_XSLT_REAL_NODE(n) \ + (((n) != NULL) && \ + (((n)->type == XML_ELEMENT_NODE) || \ + ((n)->type == XML_TEXT_NODE) || \ + ((n)->type == XML_CDATA_SECTION_NODE) || \ + ((n)->type == XML_ATTRIBUTE_NODE) || \ + ((n)->type == XML_DOCUMENT_NODE) || \ + ((n)->type == XML_HTML_DOCUMENT_NODE) || \ + ((n)->type == XML_COMMENT_NODE) || \ + ((n)->type == XML_PI_NODE))) + +/* + * Our own version of namespaced attributes lookup. + */ +XSLTPUBFUN xmlChar * XSLTCALL + xsltGetNsProp (xmlNodePtr node, + const xmlChar *name, + const xmlChar *nameSpace); +XSLTPUBFUN const xmlChar * XSLTCALL + xsltGetCNsProp (xsltStylesheetPtr style, + xmlNodePtr node, + const xmlChar *name, + const xmlChar *nameSpace); +XSLTPUBFUN int XSLTCALL + xsltGetUTF8Char (const unsigned char *utf, + int *len); + +/* + * XSLT Debug Tracing Tracing Types + */ +typedef enum { + XSLT_TRACE_ALL = -1, + XSLT_TRACE_NONE = 0, + XSLT_TRACE_COPY_TEXT = 1<<0, + XSLT_TRACE_PROCESS_NODE = 1<<1, + XSLT_TRACE_APPLY_TEMPLATE = 1<<2, + XSLT_TRACE_COPY = 1<<3, + XSLT_TRACE_COMMENT = 1<<4, + XSLT_TRACE_PI = 1<<5, + XSLT_TRACE_COPY_OF = 1<<6, + XSLT_TRACE_VALUE_OF = 1<<7, + XSLT_TRACE_CALL_TEMPLATE = 1<<8, + XSLT_TRACE_APPLY_TEMPLATES = 1<<9, + XSLT_TRACE_CHOOSE = 1<<10, + XSLT_TRACE_IF = 1<<11, + XSLT_TRACE_FOR_EACH = 1<<12, + XSLT_TRACE_STRIP_SPACES = 1<<13, + XSLT_TRACE_TEMPLATES = 1<<14, + XSLT_TRACE_KEYS = 1<<15, + XSLT_TRACE_VARIABLES = 1<<16 +} xsltDebugTraceCodes; + +/** + * XSLT_TRACE: + * + * Control the type of xsl debugtrace messages emitted. + */ +#define XSLT_TRACE(ctxt,code,call) \ + if (ctxt->traceCode && (*(ctxt->traceCode) & code)) \ + call + +XSLTPUBFUN void XSLTCALL + xsltDebugSetDefaultTrace(xsltDebugTraceCodes val); +XSLTPUBFUN xsltDebugTraceCodes XSLTCALL + xsltDebugGetDefaultTrace(void); + +/* + * XSLT specific error and debug reporting functions. + */ +XSLTPUBVAR xmlGenericErrorFunc xsltGenericError; +XSLTPUBVAR void *xsltGenericErrorContext; +XSLTPUBVAR xmlGenericErrorFunc xsltGenericDebug; +XSLTPUBVAR void *xsltGenericDebugContext; + +XSLTPUBFUN void XSLTCALL + xsltPrintErrorContext (xsltTransformContextPtr ctxt, + xsltStylesheetPtr style, + xmlNodePtr node); +XSLTPUBFUN void XSLTCALL + xsltMessage (xsltTransformContextPtr ctxt, + xmlNodePtr node, + xmlNodePtr inst); +XSLTPUBFUN void XSLTCALL + xsltSetGenericErrorFunc (void *ctx, + xmlGenericErrorFunc handler); +XSLTPUBFUN void XSLTCALL + xsltSetGenericDebugFunc (void *ctx, + xmlGenericErrorFunc handler); +XSLTPUBFUN void XSLTCALL + xsltSetTransformErrorFunc (xsltTransformContextPtr ctxt, + void *ctx, + xmlGenericErrorFunc handler); +XSLTPUBFUN void XSLTCALL + xsltTransformError (xsltTransformContextPtr ctxt, + xsltStylesheetPtr style, + xmlNodePtr node, + const char *msg, + ...) LIBXSLT_ATTR_FORMAT(4,5); + +XSLTPUBFUN int XSLTCALL + xsltSetCtxtParseOptions (xsltTransformContextPtr ctxt, + int options); +/* + * Sorting. + */ + +XSLTPUBFUN void XSLTCALL + xsltDocumentSortFunction (xmlNodeSetPtr list); +XSLTPUBFUN void XSLTCALL + xsltSetSortFunc (xsltSortFunc handler); +XSLTPUBFUN void XSLTCALL + xsltSetCtxtSortFunc (xsltTransformContextPtr ctxt, + xsltSortFunc handler); +XSLTPUBFUN void XSLTCALL + xsltDefaultSortFunction (xsltTransformContextPtr ctxt, + xmlNodePtr *sorts, + int nbsorts); +XSLTPUBFUN void XSLTCALL + xsltDoSortFunction (xsltTransformContextPtr ctxt, + xmlNodePtr * sorts, + int nbsorts); +XSLTPUBFUN xmlXPathObjectPtr * XSLTCALL + xsltComputeSortResult (xsltTransformContextPtr ctxt, + xmlNodePtr sort); + +/* + * QNames handling. + */ + +XSLTPUBFUN const xmlChar * XSLTCALL + xsltSplitQName (xmlDictPtr dict, + const xmlChar *name, + const xmlChar **prefix); +XSLTPUBFUN const xmlChar * XSLTCALL + xsltGetQNameURI (xmlNodePtr node, + xmlChar **name); + +XSLTPUBFUN const xmlChar * XSLTCALL + xsltGetQNameURI2 (xsltStylesheetPtr style, + xmlNodePtr node, + const xmlChar **name); + +/* + * Output, reuse libxml I/O buffers. + */ +XSLTPUBFUN int XSLTCALL + xsltSaveResultTo (xmlOutputBufferPtr buf, + xmlDocPtr result, + xsltStylesheetPtr style); +XSLTPUBFUN int XSLTCALL + xsltSaveResultToFilename (const char *URI, + xmlDocPtr result, + xsltStylesheetPtr style, + int compression); +XSLTPUBFUN int XSLTCALL + xsltSaveResultToFile (FILE *file, + xmlDocPtr result, + xsltStylesheetPtr style); +XSLTPUBFUN int XSLTCALL + xsltSaveResultToFd (int fd, + xmlDocPtr result, + xsltStylesheetPtr style); +XSLTPUBFUN int XSLTCALL + xsltSaveResultToString (xmlChar **doc_txt_ptr, + int * doc_txt_len, + xmlDocPtr result, + xsltStylesheetPtr style); + +/* + * XPath interface + */ +XSLTPUBFUN xmlXPathCompExprPtr XSLTCALL + xsltXPathCompile (xsltStylesheetPtr style, + const xmlChar *str); +XSLTPUBFUN xmlXPathCompExprPtr XSLTCALL + xsltXPathCompileFlags (xsltStylesheetPtr style, + const xmlChar *str, + int flags); + +/* + * Profiling. + */ +XSLTPUBFUN void XSLTCALL + xsltSaveProfiling (xsltTransformContextPtr ctxt, + FILE *output); +XSLTPUBFUN xmlDocPtr XSLTCALL + xsltGetProfileInformation (xsltTransformContextPtr ctxt); + +XSLTPUBFUN long XSLTCALL + xsltTimestamp (void); +XSLTPUBFUN void XSLTCALL + xsltCalibrateAdjust (long delta); + +/** + * XSLT_TIMESTAMP_TICS_PER_SEC: + * + * Sampling precision for profiling + */ +#define XSLT_TIMESTAMP_TICS_PER_SEC 100000l + +/* + * Hooks for the debugger. + */ + +typedef enum { + XSLT_DEBUG_NONE = 0, /* no debugging allowed */ + XSLT_DEBUG_INIT, + XSLT_DEBUG_STEP, + XSLT_DEBUG_STEPOUT, + XSLT_DEBUG_NEXT, + XSLT_DEBUG_STOP, + XSLT_DEBUG_CONT, + XSLT_DEBUG_RUN, + XSLT_DEBUG_RUN_RESTART, + XSLT_DEBUG_QUIT +} xsltDebugStatusCodes; + +XSLTPUBVAR int xslDebugStatus; + +typedef void (*xsltHandleDebuggerCallback) (xmlNodePtr cur, xmlNodePtr node, + xsltTemplatePtr templ, xsltTransformContextPtr ctxt); +typedef int (*xsltAddCallCallback) (xsltTemplatePtr templ, xmlNodePtr source); +typedef void (*xsltDropCallCallback) (void); + +XSLTPUBFUN void XSLTCALL + xsltSetDebuggerStatus (int value); +XSLTPUBFUN int XSLTCALL + xsltGetDebuggerStatus (void); +XSLTPUBFUN int XSLTCALL + xsltSetDebuggerCallbacks (int no, void *block); +XSLTPUBFUN int XSLTCALL + xslAddCall (xsltTemplatePtr templ, + xmlNodePtr source); +XSLTPUBFUN void XSLTCALL + xslDropCall (void); + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_XSLTUTILS_H__ */ + + diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/libxml2_backwards_compat.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/libxml2_backwards_compat.c new file mode 100644 index 000000000000..2e084b923518 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/libxml2_backwards_compat.c @@ -0,0 +1,121 @@ +#ifndef HAVE_XMLFIRSTELEMENTCHILD +#include <nokogiri.h> +/** + * xmlFirstElementChild: + * @parent: the parent node + * + * Finds the first child node of that element which is a Element node + * Note the handling of entities references is different than in + * the W3C DOM element traversal spec since we don't have back reference + * from entities content to entities references. + * + * Returns the first element child or NULL if not available + */ +xmlNodePtr +xmlFirstElementChild(xmlNodePtr parent) +{ + xmlNodePtr cur = NULL; + + if (parent == NULL) { + return (NULL); + } + switch (parent->type) { + case XML_ELEMENT_NODE: + case XML_ENTITY_NODE: + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + cur = parent->children; + break; + default: + return (NULL); + } + while (cur != NULL) { + if (cur->type == XML_ELEMENT_NODE) { + return (cur); + } + cur = cur->next; + } + return (NULL); +} + +/** + * xmlNextElementSibling: + * @node: the current node + * + * Finds the first closest next sibling of the node which is an + * element node. + * Note the handling of entities references is different than in + * the W3C DOM element traversal spec since we don't have back reference + * from entities content to entities references. + * + * Returns the next element sibling or NULL if not available + */ +xmlNodePtr +xmlNextElementSibling(xmlNodePtr node) +{ + if (node == NULL) { + return (NULL); + } + switch (node->type) { + case XML_ELEMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + case XML_ENTITY_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_DTD_NODE: + case XML_XINCLUDE_START: + case XML_XINCLUDE_END: + node = node->next; + break; + default: + return (NULL); + } + while (node != NULL) { + if (node->type == XML_ELEMENT_NODE) { + return (node); + } + node = node->next; + } + return (NULL); +} + +/** + * xmlLastElementChild: + * @parent: the parent node + * + * Finds the last child node of that element which is a Element node + * Note the handling of entities references is different than in + * the W3C DOM element traversal spec since we don't have back reference + * from entities content to entities references. + * + * Returns the last element child or NULL if not available + */ +xmlNodePtr +xmlLastElementChild(xmlNodePtr parent) +{ + xmlNodePtr cur = NULL; + + if (parent == NULL) { + return (NULL); + } + switch (parent->type) { + case XML_ELEMENT_NODE: + case XML_ENTITY_NODE: + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + cur = parent->last; + break; + default: + return (NULL); + } + while (cur != NULL) { + if (cur->type == XML_ELEMENT_NODE) { + return (cur); + } + cur = cur->prev; + } + return (NULL); +} +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/nokogiri.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/nokogiri.c new file mode 100644 index 000000000000..fb255f03e3bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/nokogiri.c @@ -0,0 +1,246 @@ +#include <nokogiri.h> + +VALUE mNokogiri ; +VALUE mNokogiriHtml ; +VALUE mNokogiriHtmlSax ; +VALUE mNokogiriXml ; +VALUE mNokogiriXmlSax ; +VALUE mNokogiriXmlXpath ; +VALUE mNokogiriXslt ; + +VALUE cNokogiriSyntaxError; +VALUE cNokogiriXmlCharacterData; +VALUE cNokogiriXmlElement; +VALUE cNokogiriXmlXpathSyntaxError; + +void noko_init_xml_attr(); +void noko_init_xml_attribute_decl(); +void noko_init_xml_cdata(); +void noko_init_xml_comment(); +void noko_init_xml_document(); +void noko_init_xml_document_fragment(); +void noko_init_xml_dtd(); +void noko_init_xml_element_content(); +void noko_init_xml_element_decl(); +void noko_init_xml_encoding_handler(); +void noko_init_xml_entity_decl(); +void noko_init_xml_entity_reference(); +void noko_init_xml_namespace(); +void noko_init_xml_node(); +void noko_init_xml_node_set(); +void noko_init_xml_processing_instruction(); +void noko_init_xml_reader(); +void noko_init_xml_relax_ng(); +void noko_init_xml_sax_parser(); +void noko_init_xml_sax_parser_context(); +void noko_init_xml_sax_push_parser(); +void noko_init_xml_schema(); +void noko_init_xml_syntax_error(); +void noko_init_xml_text(); +void noko_init_xml_xpath_context(); +void noko_init_xslt_stylesheet(); +void noko_init_html_document(); +void noko_init_html_element_description(); +void noko_init_html_entity_lookup(); +void noko_init_html_sax_parser_context(); +void noko_init_html_sax_push_parser(); +void noko_init_test_global_handlers(); + +static ID id_read, id_write; + + +#ifndef HAVE_VASPRINTF +/* + * Thank you Geoffroy Couprie for this implementation of vasprintf! + */ +int +vasprintf(char **strp, const char *fmt, va_list ap) +{ + /* Mingw32/64 have a broken vsnprintf implementation that fails when + * using a zero-byte limit in order to retrieve the required size for malloc. + * So we use a one byte buffer instead. + */ + char tmp[1]; + int len = vsnprintf(tmp, 1, fmt, ap) + 1; + char *res = (char *)malloc((unsigned int)len); + if (res == NULL) { + return -1; + } + *strp = res; + return vsnprintf(res, (unsigned int)len, fmt, ap); +} +#endif + + +static VALUE +read_check(VALUE val) +{ + VALUE *args = (VALUE *)val; + return rb_funcall(args[0], id_read, 1, args[1]); +} + + +static VALUE +read_failed(VALUE arg, VALUE exc) +{ + return Qundef; +} + + +int +noko_io_read(void *ctx, char *buffer, int len) +{ + VALUE string, args[2]; + size_t str_len, safe_len; + + args[0] = (VALUE)ctx; + args[1] = INT2NUM(len); + + string = rb_rescue(read_check, (VALUE)args, read_failed, 0); + + if (NIL_P(string)) { return 0; } + if (string == Qundef) { return -1; } + if (TYPE(string) != T_STRING) { return -1; } + + str_len = (size_t)RSTRING_LEN(string); + safe_len = str_len > (size_t)len ? (size_t)len : str_len; + memcpy(buffer, StringValuePtr(string), safe_len); + + return (int)safe_len; +} + + +static VALUE +write_check(VALUE val) +{ + VALUE *args = (VALUE *)val; + return rb_funcall(args[0], id_write, 1, args[1]); +} + + +static VALUE +write_failed(VALUE arg, VALUE exc) +{ + return Qundef; +} + + +int +noko_io_write(void *ctx, char *buffer, int len) +{ + VALUE args[2], size; + + args[0] = (VALUE)ctx; + args[1] = rb_str_new(buffer, (long)len); + + size = rb_rescue(write_check, (VALUE)args, write_failed, 0); + + if (size == Qundef) { return -1; } + + return NUM2INT(size); +} + + +int +noko_io_close(void *ctx) +{ + return 0; +} + + +void +Init_nokogiri() +{ + mNokogiri = rb_define_module("Nokogiri"); + mNokogiriXml = rb_define_module_under(mNokogiri, "XML"); + mNokogiriHtml = rb_define_module_under(mNokogiri, "HTML"); + mNokogiriXslt = rb_define_module_under(mNokogiri, "XSLT"); + mNokogiriXmlXpath = rb_define_module_under(mNokogiriXml, "XPath"); + mNokogiriXmlSax = rb_define_module_under(mNokogiriXml, "SAX"); + mNokogiriHtmlSax = rb_define_module_under(mNokogiriHtml, "SAX"); + + rb_const_set(mNokogiri, rb_intern("LIBXML_COMPILED_VERSION"), NOKOGIRI_STR_NEW2(LIBXML_DOTTED_VERSION)); + rb_const_set(mNokogiri, rb_intern("LIBXML_LOADED_VERSION"), NOKOGIRI_STR_NEW2(xmlParserVersion)); + + rb_const_set(mNokogiri, rb_intern("LIBXSLT_COMPILED_VERSION"), NOKOGIRI_STR_NEW2(LIBXSLT_DOTTED_VERSION)); + rb_const_set(mNokogiri, rb_intern("LIBXSLT_LOADED_VERSION"), NOKOGIRI_STR_NEW2(xsltEngineVersion)); + +#ifdef NOKOGIRI_PACKAGED_LIBRARIES + rb_const_set(mNokogiri, rb_intern("PACKAGED_LIBRARIES"), Qtrue); +# ifdef NOKOGIRI_PRECOMPILED_LIBRARIES + rb_const_set(mNokogiri, rb_intern("PRECOMPILED_LIBRARIES"), Qtrue); +# else + rb_const_set(mNokogiri, rb_intern("PRECOMPILED_LIBRARIES"), Qfalse); +# endif + rb_const_set(mNokogiri, rb_intern("LIBXML2_PATCHES"), rb_str_split(NOKOGIRI_STR_NEW2(NOKOGIRI_LIBXML2_PATCHES), " ")); + rb_const_set(mNokogiri, rb_intern("LIBXSLT_PATCHES"), rb_str_split(NOKOGIRI_STR_NEW2(NOKOGIRI_LIBXSLT_PATCHES), " ")); +#else + rb_const_set(mNokogiri, rb_intern("PACKAGED_LIBRARIES"), Qfalse); + rb_const_set(mNokogiri, rb_intern("PRECOMPILED_LIBRARIES"), Qfalse); + rb_const_set(mNokogiri, rb_intern("LIBXML2_PATCHES"), Qnil); + rb_const_set(mNokogiri, rb_intern("LIBXSLT_PATCHES"), Qnil); +#endif + +#ifdef LIBXML_ICONV_ENABLED + rb_const_set(mNokogiri, rb_intern("LIBXML_ICONV_ENABLED"), Qtrue); +#else + rb_const_set(mNokogiri, rb_intern("LIBXML_ICONV_ENABLED"), Qfalse); +#endif + +#ifdef NOKOGIRI_OTHER_LIBRARY_VERSIONS + rb_const_set(mNokogiri, rb_intern("OTHER_LIBRARY_VERSIONS"), NOKOGIRI_STR_NEW2(NOKOGIRI_OTHER_LIBRARY_VERSIONS)); +#endif + + xmlMemSetup((xmlFreeFunc)ruby_xfree, (xmlMallocFunc)ruby_xmalloc, (xmlReallocFunc)ruby_xrealloc, ruby_strdup); + + xmlInitParser(); + + cNokogiriSyntaxError = rb_define_class_under(mNokogiri, "SyntaxError", rb_eStandardError); + noko_init_xml_syntax_error(); + assert(cNokogiriXmlSyntaxError); + cNokogiriXmlXpathSyntaxError = rb_define_class_under(mNokogiriXmlXpath, "SyntaxError", cNokogiriXmlSyntaxError); + + noko_init_xml_element_content(); + noko_init_xml_encoding_handler(); + noko_init_xml_namespace(); + noko_init_xml_node_set(); + noko_init_xml_reader(); + noko_init_xml_sax_parser(); + noko_init_xml_xpath_context(); + noko_init_xslt_stylesheet(); + noko_init_html_element_description(); + noko_init_html_entity_lookup(); + + noko_init_xml_schema(); + noko_init_xml_relax_ng(); + + noko_init_xml_sax_parser_context(); + noko_init_html_sax_parser_context(); + + noko_init_xml_sax_push_parser(); + noko_init_html_sax_push_parser(); + + noko_init_xml_node(); + noko_init_xml_attr(); + noko_init_xml_attribute_decl(); + noko_init_xml_dtd(); + noko_init_xml_element_decl(); + noko_init_xml_entity_decl(); + noko_init_xml_entity_reference(); + noko_init_xml_processing_instruction(); + assert(cNokogiriXmlNode); + cNokogiriXmlElement = rb_define_class_under(mNokogiriXml, "Element", cNokogiriXmlNode); + cNokogiriXmlCharacterData = rb_define_class_under(mNokogiriXml, "CharacterData", cNokogiriXmlNode); + noko_init_xml_comment(); + noko_init_xml_text(); + noko_init_xml_cdata(); + + noko_init_xml_document_fragment(); + noko_init_xml_document(); + noko_init_html_document(); + + noko_init_test_global_handlers(); + + id_read = rb_intern("read"); + id_write = rb_intern("write"); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/nokogiri.h b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/nokogiri.h new file mode 100644 index 000000000000..8b3cc9e845aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/nokogiri.h @@ -0,0 +1,213 @@ +#ifndef NOKOGIRI_NATIVE +#define NOKOGIRI_NATIVE + +#if _MSC_VER +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif /* WIN32_LEAN_AND_MEAN */ + +# ifndef WIN32 +# define WIN32 +# endif /* WIN32 */ + +# include <winsock2.h> +# include <ws2tcpip.h> +# include <windows.h> +#endif + +#if _WIN32 +# define NOKOPUBFUN __declspec(dllexport) +# define NOKOPUBVAR __declspec(dllexport) extern +#else +# define NOKOPUBFUN +# define NOKOPUBVAR extern +#endif + + +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <stdarg.h> +#include <stdio.h> + + +#include <libxml/parser.h> +#include <libxml/tree.h> +#include <libxml/entities.h> +#include <libxml/xpath.h> +#include <libxml/xmlreader.h> +#include <libxml/xmlsave.h> +#include <libxml/xmlschemas.h> +#include <libxml/HTMLparser.h> +#include <libxml/HTMLtree.h> +#include <libxml/relaxng.h> +#include <libxml/xinclude.h> +#include <libxml/c14n.h> +#include <libxml/parserInternals.h> +#include <libxml/xpathInternals.h> + +#include <libxslt/extensions.h> +#include <libxslt/xsltconfig.h> +#include <libxslt/xsltutils.h> +#include <libxslt/transform.h> +#include <libxslt/xsltInternals.h> + +#include <libexslt/exslt.h> + +/* libxml2_backwards_compat.c */ +#ifndef HAVE_XMLFIRSTELEMENTCHILD +xmlNodePtr xmlFirstElementChild(xmlNodePtr parent); +xmlNodePtr xmlNextElementSibling(xmlNodePtr node); +xmlNodePtr xmlLastElementChild(xmlNodePtr parent); +#endif + +#define XMLNS_PREFIX "xmlns" +#define XMLNS_PREFIX_LEN 6 /* including either colon or \0 */ + + +#include <ruby.h> +#include <ruby/st.h> +#include <ruby/encoding.h> +#include <ruby/util.h> + +#define NOKOGIRI_STR_NEW2(str) NOKOGIRI_STR_NEW(str, strlen((const char *)(str))) +#define NOKOGIRI_STR_NEW(str, len) rb_external_str_new_with_enc((const char *)(str), (long)(len), rb_utf8_encoding()) +#define RBSTR_OR_QNIL(_str) (_str ? NOKOGIRI_STR_NEW2(_str) : Qnil) + +#ifdef DEBUG +# define NOKOGIRI_DEBUG_START(p) if (getenv("NOKOGIRI_NO_FREE")) return ; if (getenv("NOKOGIRI_DEBUG")) fprintf(stderr,"nokogiri: %s:%d %p start\n", __FILE__, __LINE__, p); +# define NOKOGIRI_DEBUG_END(p) if (getenv("NOKOGIRI_DEBUG")) fprintf(stderr,"nokogiri: %s:%d %p end\n", __FILE__, __LINE__, p); +#else +# define NOKOGIRI_DEBUG_START(p) +# define NOKOGIRI_DEBUG_END(p) +#endif + +#ifndef NORETURN +# if defined(__GNUC__) +# define NORETURN(name) __attribute__((noreturn)) name +# else +# define NORETURN(name) name +# endif +#endif + + +NOKOPUBVAR VALUE mNokogiri ; +NOKOPUBVAR VALUE mNokogiriHtml ; +NOKOPUBVAR VALUE mNokogiriHtmlSax ; +NOKOPUBVAR VALUE mNokogiriXml ; +NOKOPUBVAR VALUE mNokogiriXmlSax ; +NOKOPUBVAR VALUE mNokogiriXslt ; + +NOKOPUBVAR VALUE cNokogiriSyntaxError; +NOKOPUBVAR VALUE cNokogiriXmlAttr; +NOKOPUBVAR VALUE cNokogiriXmlAttributeDecl; +NOKOPUBVAR VALUE cNokogiriXmlCData; +NOKOPUBVAR VALUE cNokogiriXmlCharacterData; +NOKOPUBVAR VALUE cNokogiriXmlComment; +NOKOPUBVAR VALUE cNokogiriXmlDocument ; +NOKOPUBVAR VALUE cNokogiriXmlDocumentFragment; +NOKOPUBVAR VALUE cNokogiriXmlDtd; +NOKOPUBVAR VALUE cNokogiriXmlElement ; +NOKOPUBVAR VALUE cNokogiriXmlElementContent; +NOKOPUBVAR VALUE cNokogiriXmlElementDecl; +NOKOPUBVAR VALUE cNokogiriXmlEntityDecl; +NOKOPUBVAR VALUE cNokogiriXmlEntityReference; +NOKOPUBVAR VALUE cNokogiriXmlNamespace ; +NOKOPUBVAR VALUE cNokogiriXmlNode ; +NOKOPUBVAR VALUE cNokogiriXmlNodeSet ; +NOKOPUBVAR VALUE cNokogiriXmlProcessingInstruction; +NOKOPUBVAR VALUE cNokogiriXmlReader; +NOKOPUBVAR VALUE cNokogiriXmlRelaxNG; +NOKOPUBVAR VALUE cNokogiriXmlSaxParser ; +NOKOPUBVAR VALUE cNokogiriXmlSaxParserContext; +NOKOPUBVAR VALUE cNokogiriXmlSaxPushParser ; +NOKOPUBVAR VALUE cNokogiriXmlSchema; +NOKOPUBVAR VALUE cNokogiriXmlSyntaxError; +NOKOPUBVAR VALUE cNokogiriXmlText ; +NOKOPUBVAR VALUE cNokogiriXmlXpathContext; +NOKOPUBVAR VALUE cNokogiriXmlXpathSyntaxError; +NOKOPUBVAR VALUE cNokogiriXsltStylesheet ; + +NOKOPUBVAR VALUE cNokogiriHtmlDocument ; +NOKOPUBVAR VALUE cNokogiriHtmlSaxPushParser ; +NOKOPUBVAR VALUE cNokogiriHtmlElementDescription ; +NOKOPUBVAR VALUE cNokogiriHtmlSaxParserContext; + +typedef struct _nokogiriTuple { + VALUE doc; + st_table *unlinkedNodes; + VALUE node_cache; +} nokogiriTuple; +typedef nokogiriTuple *nokogiriTuplePtr; + +typedef struct _nokogiriSAXTuple { + xmlParserCtxtPtr ctxt; + VALUE self; +} nokogiriSAXTuple; +typedef nokogiriSAXTuple *nokogiriSAXTuplePtr; + +typedef struct _libxmlStructuredErrorHandlerState { + void *user_data; + xmlStructuredErrorFunc handler; +} libxmlStructuredErrorHandlerState ; + +typedef struct _nokogiriXsltStylesheetTuple { + xsltStylesheetPtr ss; + VALUE func_instances; +} nokogiriXsltStylesheetTuple; + +int vasprintf(char **strp, const char *fmt, va_list ap); +void noko_xml_document_pin_node(xmlNodePtr); +void noko_xml_document_pin_namespace(xmlNsPtr, xmlDocPtr); + +int noko_io_read(void *ctx, char *buffer, int len); +int noko_io_write(void *ctx, char *buffer, int len); +int noko_io_close(void *ctx); + +VALUE noko_xml_node_wrap(VALUE klass, xmlNodePtr node) ; +VALUE noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set) ; +VALUE noko_xml_node_attrs(xmlNodePtr node) ; + +VALUE noko_xml_namespace_wrap(xmlNsPtr node, xmlDocPtr doc); +VALUE noko_xml_namespace_wrap_xpath_copy(xmlNsPtr node); + +VALUE noko_xml_element_content_wrap(VALUE doc, xmlElementContentPtr element); + +VALUE noko_xml_node_set_wrap(xmlNodeSetPtr node_set, VALUE document) ; + +VALUE noko_xml_document_wrap_with_init_args(VALUE klass, xmlDocPtr doc, int argc, VALUE *argv); +VALUE noko_xml_document_wrap(VALUE klass, xmlDocPtr doc); +NOKOPUBFUN VALUE Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc); /* deprecated. use noko_xml_document_wrap() instead. */ + +#define DOC_RUBY_OBJECT_TEST(x) ((nokogiriTuplePtr)(x->_private)) +#define DOC_RUBY_OBJECT(x) (((nokogiriTuplePtr)(x->_private))->doc) +#define DOC_UNLINKED_NODE_HASH(x) (((nokogiriTuplePtr)(x->_private))->unlinkedNodes) +#define DOC_NODE_CACHE(x) (((nokogiriTuplePtr)(x->_private))->node_cache) +#define NOKOGIRI_NAMESPACE_EH(node) ((node)->type == XML_NAMESPACE_DECL) + +#define NOKOGIRI_SAX_SELF(_ctxt) ((nokogiriSAXTuplePtr)(_ctxt))->self +#define NOKOGIRI_SAX_CTXT(_ctxt) ((nokogiriSAXTuplePtr)(_ctxt))->ctxt +#define NOKOGIRI_SAX_TUPLE_NEW(_ctxt, _self) nokogiri_sax_tuple_new(_ctxt, _self) +#define NOKOGIRI_SAX_TUPLE_DESTROY(_tuple) free(_tuple) + +void Nokogiri_structured_error_func_save(libxmlStructuredErrorHandlerState *handler_state); +void Nokogiri_structured_error_func_save_and_set(libxmlStructuredErrorHandlerState *handler_state, void *user_data, + xmlStructuredErrorFunc handler); +void Nokogiri_structured_error_func_restore(libxmlStructuredErrorHandlerState *handler_state); +VALUE Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error); +void Nokogiri_error_array_pusher(void *ctx, xmlErrorPtr error); +NORETURN(void Nokogiri_error_raise(void *ctx, xmlErrorPtr error)); +void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr ctx, int nargs, VALUE handler, + const char *function_name) ; + +static inline +nokogiriSAXTuplePtr +nokogiri_sax_tuple_new(xmlParserCtxtPtr ctxt, VALUE self) +{ + nokogiriSAXTuplePtr tuple = malloc(sizeof(nokogiriSAXTuple)); + tuple->self = self; + tuple->ctxt = ctxt; + return tuple; +} + +#endif /* NOKOGIRI_NATIVE */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/test_global_handlers.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/test_global_handlers.c new file mode 100644 index 000000000000..012bf745f6c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/test_global_handlers.c @@ -0,0 +1,40 @@ +#include <nokogiri.h> + +static VALUE foreign_error_handler_block = Qnil; + +static void +foreign_error_handler(void *user_data, xmlErrorPtr c_error) +{ + rb_funcall(foreign_error_handler_block, rb_intern("call"), 0); +} + +/* + * call-seq: + * __foreign_error_handler { ... } -> nil + * + * Override libxml2's global error handlers to call the block. This method thus has very little + * value except to test that Nokogiri is properly setting error handlers elsewhere in the code. See + * test/helper.rb for how this is being used. + */ +static VALUE +rb_foreign_error_handler(VALUE klass) +{ + rb_need_block(); + foreign_error_handler_block = rb_block_proc(); + xmlSetStructuredErrorFunc(NULL, foreign_error_handler); + return Qnil; +} + +/* + * Document-module: Nokogiri::Test + * + * The Nokogiri::Test module should only be used for testing Nokogiri. + * Do NOT use this outside of the Nokogiri test suite. + */ +void +noko_init_test_global_handlers() +{ + VALUE mNokogiriTest = rb_define_module_under(mNokogiri, "Test"); + + rb_define_singleton_method(mNokogiriTest, "__foreign_error_handler", rb_foreign_error_handler, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_attr.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_attr.c new file mode 100644 index 000000000000..63e5498b536c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_attr.c @@ -0,0 +1,103 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlAttr; + +/* + * call-seq: + * value=(content) + * + * Set the value for this Attr to +content+. Use `nil` to remove the value + * (e.g., a HTML boolean attribute). + */ +static VALUE +set_value(VALUE self, VALUE content) +{ + xmlAttrPtr attr; + xmlChar *value; + xmlNode *cur; + + Data_Get_Struct(self, xmlAttr, attr); + + if (attr->children) { + xmlFreeNodeList(attr->children); + } + attr->children = attr->last = NULL; + + if (content == Qnil) { + return content; + } + + value = xmlEncodeEntitiesReentrant(attr->doc, (unsigned char *)StringValueCStr(content)); + if (xmlStrlen(value) == 0) { + attr->children = xmlNewDocText(attr->doc, value); + } else { + attr->children = xmlStringGetNodeList(attr->doc, value); + } + xmlFree(value); + + for (cur = attr->children; cur; cur = cur->next) { + cur->parent = (xmlNode *)attr; + cur->doc = attr->doc; + if (cur->next == NULL) { + attr->last = cur; + } + } + + return content; +} + +/* + * call-seq: + * new(document, name) + * + * Create a new Attr element on the +document+ with +name+ + */ +static VALUE +new (int argc, VALUE *argv, VALUE klass) +{ + xmlDocPtr xml_doc; + VALUE document; + VALUE name; + VALUE rest; + xmlAttrPtr node; + VALUE rb_node; + + rb_scan_args(argc, argv, "2*", &document, &name, &rest); + + if (! rb_obj_is_kind_of(document, cNokogiriXmlDocument)) { + rb_raise(rb_eArgError, "parameter must be a Nokogiri::XML::Document"); + } + + Data_Get_Struct(document, xmlDoc, xml_doc); + + node = xmlNewDocProp( + xml_doc, + (const xmlChar *)StringValueCStr(name), + NULL + ); + + noko_xml_document_pin_node((xmlNodePtr)node); + + rb_node = noko_xml_node_wrap(klass, (xmlNodePtr)node); + rb_obj_call_init(rb_node, argc, argv); + + if (rb_block_given_p()) { + rb_yield(rb_node); + } + + return rb_node; +} + +void +noko_init_xml_attr() +{ + assert(cNokogiriXmlNode); + /* + * Attr represents a Attr node in an xml document. + */ + cNokogiriXmlAttr = rb_define_class_under(mNokogiriXml, "Attr", cNokogiriXmlNode); + + rb_define_singleton_method(cNokogiriXmlAttr, "new", new, -1); + + rb_define_method(cNokogiriXmlAttr, "value=", set_value, 1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_attribute_decl.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_attribute_decl.c new file mode 100644 index 000000000000..8603ff955301 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_attribute_decl.c @@ -0,0 +1,70 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlAttributeDecl; + +/* + * call-seq: + * attribute_type + * + * The attribute_type for this AttributeDecl + */ +static VALUE +attribute_type(VALUE self) +{ + xmlAttributePtr node; + Data_Get_Struct(self, xmlAttribute, node); + return INT2NUM((long)node->atype); +} + +/* + * call-seq: + * default + * + * The default value + */ +static VALUE +default_value(VALUE self) +{ + xmlAttributePtr node; + Data_Get_Struct(self, xmlAttribute, node); + + if (node->defaultValue) { return NOKOGIRI_STR_NEW2(node->defaultValue); } + return Qnil; +} + +/* + * call-seq: + * enumeration + * + * An enumeration of possible values + */ +static VALUE +enumeration(VALUE self) +{ + xmlAttributePtr node; + xmlEnumerationPtr enm; + VALUE list; + + Data_Get_Struct(self, xmlAttribute, node); + + list = rb_ary_new(); + enm = node->tree; + + while (enm) { + rb_ary_push(list, NOKOGIRI_STR_NEW2(enm->name)); + enm = enm->next; + } + + return list; +} + +void +noko_init_xml_attribute_decl() +{ + assert(cNokogiriXmlNode); + cNokogiriXmlAttributeDecl = rb_define_class_under(mNokogiriXml, "AttributeDecl", cNokogiriXmlNode); + + rb_define_method(cNokogiriXmlAttributeDecl, "attribute_type", attribute_type, 0); + rb_define_method(cNokogiriXmlAttributeDecl, "default", default_value, 0); + rb_define_method(cNokogiriXmlAttributeDecl, "enumeration", enumeration, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_cdata.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_cdata.c new file mode 100644 index 000000000000..954f3ab3e35d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_cdata.c @@ -0,0 +1,57 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlCData; + +/* + * call-seq: + * new(document, content) + * + * Create a new CDATA element on the +document+ with +content+ + * + * If +content+ cannot be implicitly converted to a string, this method will + * raise a TypeError exception. + */ +static VALUE +new (int argc, VALUE *argv, VALUE klass) +{ + xmlDocPtr xml_doc; + xmlNodePtr node; + VALUE doc; + VALUE content; + VALUE rest; + VALUE rb_node; + xmlChar *content_str = NULL; + int content_str_len = 0; + + rb_scan_args(argc, argv, "2*", &doc, &content, &rest); + + Data_Get_Struct(doc, xmlDoc, xml_doc); + + if (!NIL_P(content)) { + content_str = (xmlChar *)StringValuePtr(content); + content_str_len = RSTRING_LEN(content); + } + + node = xmlNewCDataBlock(xml_doc->doc, content_str, content_str_len); + + noko_xml_document_pin_node(node); + + rb_node = noko_xml_node_wrap(klass, node); + rb_obj_call_init(rb_node, argc, argv); + + if (rb_block_given_p()) { rb_yield(rb_node); } + + return rb_node; +} + +void +noko_init_xml_cdata() +{ + assert(cNokogiriXmlText); + /* + * CData represents a CData node in an xml document. + */ + cNokogiriXmlCData = rb_define_class_under(mNokogiriXml, "CDATA", cNokogiriXmlText); + + rb_define_singleton_method(cNokogiriXmlCData, "new", new, -1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_comment.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_comment.c new file mode 100644 index 000000000000..10ba10da4ae8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_comment.c @@ -0,0 +1,62 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlComment; + +static ID document_id ; + +/* + * call-seq: + * new(document_or_node, content) + * + * Create a new Comment element on the +document+ with +content+. + * Alternatively, if a +node+ is passed, the +node+'s document is used. + */ +static VALUE +new (int argc, VALUE *argv, VALUE klass) +{ + xmlDocPtr xml_doc; + xmlNodePtr node; + VALUE document; + VALUE content; + VALUE rest; + VALUE rb_node; + + rb_scan_args(argc, argv, "2*", &document, &content, &rest); + + if (rb_obj_is_kind_of(document, cNokogiriXmlNode)) { + document = rb_funcall(document, document_id, 0); + } else if (!rb_obj_is_kind_of(document, cNokogiriXmlDocument) + && !rb_obj_is_kind_of(document, cNokogiriXmlDocumentFragment)) { + rb_raise(rb_eArgError, "first argument must be a XML::Document or XML::Node"); + } + + Data_Get_Struct(document, xmlDoc, xml_doc); + + node = xmlNewDocComment( + xml_doc, + (const xmlChar *)StringValueCStr(content) + ); + + rb_node = noko_xml_node_wrap(klass, node); + rb_obj_call_init(rb_node, argc, argv); + + noko_xml_document_pin_node(node); + + if (rb_block_given_p()) { rb_yield(rb_node); } + + return rb_node; +} + +void +noko_init_xml_comment() +{ + assert(cNokogiriXmlCharacterData); + /* + * Comment represents a comment node in an xml document. + */ + cNokogiriXmlComment = rb_define_class_under(mNokogiriXml, "Comment", cNokogiriXmlCharacterData); + + rb_define_singleton_method(cNokogiriXmlComment, "new", new, -1); + + document_id = rb_intern("document"); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_document.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_document.c new file mode 100644 index 000000000000..c76842ef57f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_document.c @@ -0,0 +1,680 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlDocument ; + +static int +dealloc_node_i2(xmlNodePtr key, xmlNodePtr node, xmlDocPtr doc) +{ + switch (node->type) { + case XML_ATTRIBUTE_NODE: + xmlFreePropList((xmlAttrPtr)node); + break; + case XML_NAMESPACE_DECL: + xmlFreeNs((xmlNsPtr)node); + break; + case XML_DTD_NODE: + xmlFreeDtd((xmlDtdPtr)node); + break; + default: + if (node->parent == NULL) { + xmlAddChild((xmlNodePtr)doc, node); + } + } + return ST_CONTINUE; +} + +static int +dealloc_node_i(st_data_t key, st_data_t node, st_data_t doc) +{ + return dealloc_node_i2((xmlNodePtr)key, (xmlNodePtr)node, (xmlDocPtr)doc); +} + +static void +remove_private(xmlNodePtr node) +{ + xmlNodePtr child; + + for (child = node->children; child; child = child->next) { + remove_private(child); + } + + if ((node->type == XML_ELEMENT_NODE || + node->type == XML_XINCLUDE_START || + node->type == XML_XINCLUDE_END) && + node->properties) { + for (child = (xmlNodePtr)node->properties; child; child = child->next) { + remove_private(child); + } + } + + node->_private = NULL; +} + +static void +mark(xmlDocPtr doc) +{ + nokogiriTuplePtr tuple = (nokogiriTuplePtr)doc->_private; + if (tuple) { + rb_gc_mark(tuple->doc); + rb_gc_mark(tuple->node_cache); + } +} + +static void +dealloc(xmlDocPtr doc) +{ + st_table *node_hash; + + NOKOGIRI_DEBUG_START(doc); + + node_hash = DOC_UNLINKED_NODE_HASH(doc); + + st_foreach(node_hash, dealloc_node_i, (st_data_t)doc); + st_free_table(node_hash); + + free(doc->_private); + + /* When both Nokogiri and libxml-ruby are loaded, make sure that all nodes + * have their _private pointers cleared. This is to avoid libxml-ruby's + * xmlDeregisterNode callback from accessing VALUE pointers from ruby's GC + * free context, which can result in segfaults. + */ + if (xmlDeregisterNodeDefaultValue) { + remove_private((xmlNodePtr)doc); + } + + xmlFreeDoc(doc); + + NOKOGIRI_DEBUG_END(doc); +} + +static void +recursively_remove_namespaces_from_node(xmlNodePtr node) +{ + xmlNodePtr child ; + xmlAttrPtr property ; + + xmlSetNs(node, NULL); + + for (child = node->children ; child ; child = child->next) { + recursively_remove_namespaces_from_node(child); + } + + if (((node->type == XML_ELEMENT_NODE) || + (node->type == XML_XINCLUDE_START) || + (node->type == XML_XINCLUDE_END)) && + node->nsDef) { + xmlFreeNsList(node->nsDef); + node->nsDef = NULL; + } + + if (node->type == XML_ELEMENT_NODE && node->properties != NULL) { + property = node->properties ; + while (property != NULL) { + if (property->ns) { property->ns = NULL ; } + property = property->next ; + } + } +} + +/* + * call-seq: + * url + * + * Get the url name for this document. + */ +static VALUE +url(VALUE self) +{ + xmlDocPtr doc; + Data_Get_Struct(self, xmlDoc, doc); + + if (doc->URL) { return NOKOGIRI_STR_NEW2(doc->URL); } + + return Qnil; +} + +/* + * call-seq: + * root= + * + * Set the root element on this document + */ +static VALUE +rb_xml_document_root_set(VALUE self, VALUE rb_new_root) +{ + xmlDocPtr c_document; + xmlNodePtr c_new_root = NULL, c_current_root; + + Data_Get_Struct(self, xmlDoc, c_document); + + c_current_root = xmlDocGetRootElement(c_document); + if (c_current_root) { + xmlUnlinkNode(c_current_root); + noko_xml_document_pin_node(c_current_root); + } + + if (!NIL_P(rb_new_root)) { + if (!rb_obj_is_kind_of(rb_new_root, cNokogiriXmlNode)) { + rb_raise(rb_eArgError, + "expected Nokogiri::XML::Node but received %"PRIsVALUE, + rb_obj_class(rb_new_root)); + } + + Data_Get_Struct(rb_new_root, xmlNode, c_new_root); + + /* If the new root's document is not the same as the current document, + * then we need to dup the node in to this document. */ + if (c_new_root->doc != c_document) { + c_new_root = xmlDocCopyNode(c_new_root, c_document, 1); + if (!c_new_root) { + rb_raise(rb_eRuntimeError, "Could not reparent node (xmlDocCopyNode)"); + } + } + } + + xmlDocSetRootElement(c_document, c_new_root); + + return rb_new_root; +} + +/* + * call-seq: + * root + * + * Get the root node for this document. + */ +static VALUE +rb_xml_document_root(VALUE self) +{ + xmlDocPtr c_document; + xmlNodePtr c_root; + + Data_Get_Struct(self, xmlDoc, c_document); + + c_root = xmlDocGetRootElement(c_document); + if (!c_root) { + return Qnil; + } + + return noko_xml_node_wrap(Qnil, c_root) ; +} + +/* + * call-seq: + * encoding= encoding + * + * Set the encoding string for this Document + */ +static VALUE +set_encoding(VALUE self, VALUE encoding) +{ + xmlDocPtr doc; + Data_Get_Struct(self, xmlDoc, doc); + + if (doc->encoding) { + free((char *)(uintptr_t) doc->encoding); /* avoid gcc cast warning */ + } + + doc->encoding = xmlStrdup((xmlChar *)StringValueCStr(encoding)); + + return encoding; +} + +/* + * call-seq: + * encoding + * + * Get the encoding for this Document + */ +static VALUE +encoding(VALUE self) +{ + xmlDocPtr doc; + Data_Get_Struct(self, xmlDoc, doc); + + if (!doc->encoding) { return Qnil; } + return NOKOGIRI_STR_NEW2(doc->encoding); +} + +/* + * call-seq: + * version + * + * Get the XML version for this Document + */ +static VALUE +version(VALUE self) +{ + xmlDocPtr doc; + Data_Get_Struct(self, xmlDoc, doc); + + if (!doc->version) { return Qnil; } + return NOKOGIRI_STR_NEW2(doc->version); +} + +/* + * call-seq: + * read_io(io, url, encoding, options) + * + * Create a new document from an IO object + */ +static VALUE +read_io(VALUE klass, + VALUE io, + VALUE url, + VALUE encoding, + VALUE options) +{ + const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url); + const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding); + VALUE error_list = rb_ary_new(); + VALUE document; + xmlDocPtr doc; + + xmlResetLastError(); + xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher); + + doc = xmlReadIO( + (xmlInputReadCallback)noko_io_read, + (xmlInputCloseCallback)noko_io_close, + (void *)io, + c_url, + c_enc, + (int)NUM2INT(options) + ); + xmlSetStructuredErrorFunc(NULL, NULL); + + if (doc == NULL) { + xmlErrorPtr error; + + xmlFreeDoc(doc); + + error = xmlGetLastError(); + if (error) { + rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error)); + } else { + rb_raise(rb_eRuntimeError, "Could not parse document"); + } + + return Qnil; + } + + document = noko_xml_document_wrap(klass, doc); + rb_iv_set(document, "@errors", error_list); + return document; +} + +/* + * call-seq: + * read_memory(string, url, encoding, options) + * + * Create a new document from a String + */ +static VALUE +read_memory(VALUE klass, + VALUE string, + VALUE url, + VALUE encoding, + VALUE options) +{ + const char *c_buffer = StringValuePtr(string); + const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url); + const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding); + int len = (int)RSTRING_LEN(string); + VALUE error_list = rb_ary_new(); + VALUE document; + xmlDocPtr doc; + + xmlResetLastError(); + xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher); + doc = xmlReadMemory(c_buffer, len, c_url, c_enc, (int)NUM2INT(options)); + xmlSetStructuredErrorFunc(NULL, NULL); + + if (doc == NULL) { + xmlErrorPtr error; + + xmlFreeDoc(doc); + + error = xmlGetLastError(); + if (error) { + rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error)); + } else { + rb_raise(rb_eRuntimeError, "Could not parse document"); + } + + return Qnil; + } + + document = noko_xml_document_wrap(klass, doc); + rb_iv_set(document, "@errors", error_list); + return document; +} + +/* + * call-seq: + * dup + * + * Copy this Document. An optional depth may be passed in, but it defaults + * to a deep copy. 0 is a shallow copy, 1 is a deep copy. + */ +static VALUE +duplicate_document(int argc, VALUE *argv, VALUE self) +{ + xmlDocPtr doc, dup; + VALUE copy; + VALUE level; + + if (rb_scan_args(argc, argv, "01", &level) == 0) { + level = INT2NUM((long)1); + } + + Data_Get_Struct(self, xmlDoc, doc); + + dup = xmlCopyDoc(doc, (int)NUM2INT(level)); + + if (dup == NULL) { return Qnil; } + + dup->type = doc->type; + copy = noko_xml_document_wrap(rb_obj_class(self), dup); + rb_iv_set(copy, "@errors", rb_iv_get(self, "@errors")); + return copy ; +} + +/* + * call-seq: + * new(version = default) + * + * Create a new document with +version+ (defaults to "1.0") + */ +static VALUE +new (int argc, VALUE *argv, VALUE klass) +{ + xmlDocPtr doc; + VALUE version, rest, rb_doc ; + + rb_scan_args(argc, argv, "0*", &rest); + version = rb_ary_entry(rest, (long)0); + if (NIL_P(version)) { version = rb_str_new2("1.0"); } + + doc = xmlNewDoc((xmlChar *)StringValueCStr(version)); + rb_doc = noko_xml_document_wrap_with_init_args(klass, doc, argc, argv); + return rb_doc ; +} + +/* + * call-seq: + * remove_namespaces! + * + * Remove all namespaces from all nodes in the document. + * + * This could be useful for developers who either don't understand namespaces + * or don't care about them. + * + * The following example shows a use case, and you can decide for yourself + * whether this is a good thing or not: + * + * doc = Nokogiri::XML <<-EOXML + * <root> + * <car xmlns:part="http://general-motors.com/"> + * <part:tire>Michelin Model XGV</part:tire> + * </car> + * <bicycle xmlns:part="http://schwinn.com/"> + * <part:tire>I'm a bicycle tire!</part:tire> + * </bicycle> + * </root> + * EOXML + * + * doc.xpath("//tire").to_s # => "" + * doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => "<part:tire>Michelin Model XGV</part:tire>" + * doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => "<part:tire>I'm a bicycle tire!</part:tire>" + * + * doc.remove_namespaces! + * + * doc.xpath("//tire").to_s # => "<tire>Michelin Model XGV</tire><tire>I'm a bicycle tire!</tire>" + * doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => "" + * doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => "" + * + * For more information on why this probably is *not* a good thing in general, + * please direct your browser to + * http://tenderlovemaking.com/2009/04/23/namespaces-in-xml.html + */ +static VALUE +remove_namespaces_bang(VALUE self) +{ + xmlDocPtr doc ; + Data_Get_Struct(self, xmlDoc, doc); + + recursively_remove_namespaces_from_node((xmlNodePtr)doc); + return self; +} + +/* call-seq: doc.create_entity(name, type, external_id, system_id, content) + * + * Create a new entity named +name+. + * + * +type+ is an integer representing the type of entity to be created, and it + * defaults to Nokogiri::XML::EntityDecl::INTERNAL_GENERAL. See + * the constants on Nokogiri::XML::EntityDecl for more information. + * + * +external_id+, +system_id+, and +content+ set the External ID, System ID, + * and content respectively. All of these parameters are optional. + */ +static VALUE +create_entity(int argc, VALUE *argv, VALUE self) +{ + VALUE name; + VALUE type; + VALUE external_id; + VALUE system_id; + VALUE content; + xmlEntityPtr ptr; + xmlDocPtr doc ; + + Data_Get_Struct(self, xmlDoc, doc); + + rb_scan_args(argc, argv, "14", &name, &type, &external_id, &system_id, + &content); + + xmlResetLastError(); + ptr = xmlAddDocEntity( + doc, + (xmlChar *)(NIL_P(name) ? NULL : StringValueCStr(name)), + (int)(NIL_P(type) ? XML_INTERNAL_GENERAL_ENTITY : NUM2INT(type)), + (xmlChar *)(NIL_P(external_id) ? NULL : StringValueCStr(external_id)), + (xmlChar *)(NIL_P(system_id) ? NULL : StringValueCStr(system_id)), + (xmlChar *)(NIL_P(content) ? NULL : StringValueCStr(content)) + ); + + if (NULL == ptr) { + xmlErrorPtr error = xmlGetLastError(); + if (error) { + rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error)); + } else { + rb_raise(rb_eRuntimeError, "Could not create entity"); + } + + return Qnil; + } + + return noko_xml_node_wrap(cNokogiriXmlEntityDecl, (xmlNodePtr)ptr); +} + +static int +block_caller(void *ctx, xmlNodePtr c_node, xmlNodePtr c_parent_node) +{ + VALUE block = (VALUE)ctx; + VALUE rb_node; + VALUE rb_parent_node; + VALUE ret; + + if (c_node->type == XML_NAMESPACE_DECL) { + rb_node = noko_xml_namespace_wrap((xmlNsPtr)c_node, c_parent_node->doc); + } else { + rb_node = noko_xml_node_wrap(Qnil, c_node); + } + rb_parent_node = c_parent_node ? noko_xml_node_wrap(Qnil, c_parent_node) : Qnil; + + ret = rb_funcall(block, rb_intern("call"), 2, rb_node, rb_parent_node); + + return (Qfalse == ret || Qnil == ret) ? 0 : 1; +} + +/* call-seq: + * doc.canonicalize(mode=XML_C14N_1_0,inclusive_namespaces=nil,with_comments=false) + * doc.canonicalize { |obj, parent| ... } + * + * Canonicalize a document and return the results. Takes an optional block + * that takes two parameters: the +obj+ and that node's +parent+. + * The +obj+ will be either a Nokogiri::XML::Node, or a Nokogiri::XML::Namespace + * The block must return a non-nil, non-false value if the +obj+ passed in + * should be included in the canonicalized document. + */ +static VALUE +rb_xml_document_canonicalize(int argc, VALUE *argv, VALUE self) +{ + VALUE mode; + VALUE incl_ns; + VALUE with_comments; + xmlChar **ns; + long ns_len, i; + + xmlDocPtr doc; + xmlOutputBufferPtr buf; + xmlC14NIsVisibleCallback cb = NULL; + void *ctx = NULL; + + VALUE rb_cStringIO; + VALUE io; + + rb_scan_args(argc, argv, "03", &mode, &incl_ns, &with_comments); + + Data_Get_Struct(self, xmlDoc, doc); + + rb_cStringIO = rb_const_get_at(rb_cObject, rb_intern("StringIO")); + io = rb_class_new_instance(0, 0, rb_cStringIO); + buf = xmlAllocOutputBuffer(NULL); + + buf->writecallback = (xmlOutputWriteCallback)noko_io_write; + buf->closecallback = (xmlOutputCloseCallback)noko_io_close; + buf->context = (void *)io; + + if (rb_block_given_p()) { + cb = block_caller; + ctx = (void *)rb_block_proc(); + } + + if (NIL_P(incl_ns)) { + ns = NULL; + } else { + Check_Type(incl_ns, T_ARRAY); + ns_len = RARRAY_LEN(incl_ns); + ns = calloc((size_t)ns_len + 1, sizeof(xmlChar *)); + for (i = 0 ; i < ns_len ; i++) { + VALUE entry = rb_ary_entry(incl_ns, i); + ns[i] = (xmlChar *)StringValueCStr(entry); + } + } + + + xmlC14NExecute(doc, cb, ctx, + (int)(NIL_P(mode) ? 0 : NUM2INT(mode)), + ns, + (int) RTEST(with_comments), + buf); + + xmlOutputBufferClose(buf); + + return rb_funcall(io, rb_intern("string"), 0); +} + +VALUE +noko_xml_document_wrap_with_init_args(VALUE klass, xmlDocPtr c_document, int argc, VALUE *argv) +{ + VALUE rb_document; + nokogiriTuplePtr tuple; + + if (!klass) { + klass = cNokogiriXmlDocument; + } + + rb_document = Data_Wrap_Struct(klass, mark, dealloc, c_document); + + tuple = (nokogiriTuplePtr)malloc(sizeof(nokogiriTuple)); + tuple->doc = rb_document; + tuple->unlinkedNodes = st_init_numtable_with_size(128); + tuple->node_cache = rb_ary_new(); + + c_document->_private = tuple ; + + rb_iv_set(rb_document, "@decorators", Qnil); + rb_iv_set(rb_document, "@errors", Qnil); + rb_iv_set(rb_document, "@node_cache", tuple->node_cache); + + rb_obj_call_init(rb_document, argc, argv); + + return rb_document ; +} + + +/* deprecated. use noko_xml_document_wrap() instead. */ +VALUE +Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc) +{ + /* TODO: deprecate this method in v2.0 */ + return noko_xml_document_wrap_with_init_args(klass, doc, 0, NULL); +} + +VALUE +noko_xml_document_wrap(VALUE klass, xmlDocPtr doc) +{ + return noko_xml_document_wrap_with_init_args(klass, doc, 0, NULL); +} + + +void +noko_xml_document_pin_node(xmlNodePtr node) +{ + xmlDocPtr doc; + nokogiriTuplePtr tuple; + + doc = node->doc; + tuple = (nokogiriTuplePtr)doc->_private; + st_insert(tuple->unlinkedNodes, (st_data_t)node, (st_data_t)node); +} + + +void +noko_xml_document_pin_namespace(xmlNsPtr ns, xmlDocPtr doc) +{ + nokogiriTuplePtr tuple; + + tuple = (nokogiriTuplePtr)doc->_private; + st_insert(tuple->unlinkedNodes, (st_data_t)ns, (st_data_t)ns); +} + + +void +noko_init_xml_document() +{ + assert(cNokogiriXmlNode); + /* + * Nokogiri::XML::Document wraps an xml document. + */ + cNokogiriXmlDocument = rb_define_class_under(mNokogiriXml, "Document", cNokogiriXmlNode); + + rb_define_singleton_method(cNokogiriXmlDocument, "read_memory", read_memory, 4); + rb_define_singleton_method(cNokogiriXmlDocument, "read_io", read_io, 4); + rb_define_singleton_method(cNokogiriXmlDocument, "new", new, -1); + + rb_define_method(cNokogiriXmlDocument, "root", rb_xml_document_root, 0); + rb_define_method(cNokogiriXmlDocument, "root=", rb_xml_document_root_set, 1); + rb_define_method(cNokogiriXmlDocument, "encoding", encoding, 0); + rb_define_method(cNokogiriXmlDocument, "encoding=", set_encoding, 1); + rb_define_method(cNokogiriXmlDocument, "version", version, 0); + rb_define_method(cNokogiriXmlDocument, "canonicalize", rb_xml_document_canonicalize, -1); + rb_define_method(cNokogiriXmlDocument, "dup", duplicate_document, -1); + rb_define_method(cNokogiriXmlDocument, "url", url, 0); + rb_define_method(cNokogiriXmlDocument, "create_entity", create_entity, -1); + rb_define_method(cNokogiriXmlDocument, "remove_namespaces!", remove_namespaces_bang, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_document_fragment.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_document_fragment.c new file mode 100644 index 000000000000..f509815fda3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_document_fragment.c @@ -0,0 +1,46 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlDocumentFragment; + +/* + * call-seq: + * new(document) + * + * Create a new DocumentFragment element on the +document+ + */ +static VALUE +new (int argc, VALUE *argv, VALUE klass) +{ + xmlDocPtr xml_doc; + xmlNodePtr node; + VALUE document; + VALUE rest; + VALUE rb_node; + + rb_scan_args(argc, argv, "1*", &document, &rest); + + Data_Get_Struct(document, xmlDoc, xml_doc); + + node = xmlNewDocFragment(xml_doc->doc); + + noko_xml_document_pin_node(node); + + rb_node = noko_xml_node_wrap(klass, node); + rb_obj_call_init(rb_node, argc, argv); + + if (rb_block_given_p()) { rb_yield(rb_node); } + + return rb_node; +} + +void +noko_init_xml_document_fragment() +{ + assert(cNokogiriXmlNode); + /* + * DocumentFragment represents a DocumentFragment node in an xml document. + */ + cNokogiriXmlDocumentFragment = rb_define_class_under(mNokogiriXml, "DocumentFragment", cNokogiriXmlNode); + + rb_define_singleton_method(cNokogiriXmlDocumentFragment, "new", new, -1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_dtd.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_dtd.c new file mode 100644 index 000000000000..f9cb71fea6ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_dtd.c @@ -0,0 +1,208 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlDtd; + +static void +notation_copier(void *c_notation_ptr, void *rb_hash_ptr, const xmlChar *name) +{ + VALUE rb_hash = (VALUE)rb_hash_ptr; + xmlNotationPtr c_notation = (xmlNotationPtr)c_notation_ptr; + VALUE rb_notation; + VALUE cNokogiriXmlNotation; + VALUE rb_constructor_args[3]; + + rb_constructor_args[0] = (c_notation->name ? NOKOGIRI_STR_NEW2(c_notation->name) : Qnil); + rb_constructor_args[1] = (c_notation->PublicID ? NOKOGIRI_STR_NEW2(c_notation->PublicID) : Qnil); + rb_constructor_args[2] = (c_notation->SystemID ? NOKOGIRI_STR_NEW2(c_notation->SystemID) : Qnil); + + cNokogiriXmlNotation = rb_const_get_at(mNokogiriXml, rb_intern("Notation")); + rb_notation = rb_class_new_instance(3, rb_constructor_args, cNokogiriXmlNotation); + + rb_hash_aset(rb_hash, NOKOGIRI_STR_NEW2(name), rb_notation); +} + +static void +element_copier(void *c_node_ptr, void *rb_hash_ptr, const xmlChar *c_name) +{ + VALUE rb_hash = (VALUE)rb_hash_ptr; + xmlNodePtr c_node = (xmlNodePtr)c_node_ptr; + + VALUE rb_node = noko_xml_node_wrap(Qnil, c_node); + + rb_hash_aset(rb_hash, NOKOGIRI_STR_NEW2(c_name), rb_node); +} + +/* + * call-seq: + * entities + * + * Get a hash of the elements for this DTD. + */ +static VALUE +entities(VALUE self) +{ + xmlDtdPtr dtd; + VALUE hash; + + Data_Get_Struct(self, xmlDtd, dtd); + + if (!dtd->entities) { return Qnil; } + + hash = rb_hash_new(); + + xmlHashScan((xmlHashTablePtr)dtd->entities, element_copier, (void *)hash); + + return hash; +} + +/* + * call-seq: + * notations + * + * Get a hash of the notations for this DTD. + */ +static VALUE +notations(VALUE self) +{ + xmlDtdPtr dtd; + VALUE hash; + + Data_Get_Struct(self, xmlDtd, dtd); + + if (!dtd->notations) { return Qnil; } + + hash = rb_hash_new(); + + xmlHashScan((xmlHashTablePtr)dtd->notations, notation_copier, (void *)hash); + + return hash; +} + +/* + * call-seq: + * attributes + * + * Get a hash of the attributes for this DTD. + */ +static VALUE +attributes(VALUE self) +{ + xmlDtdPtr dtd; + VALUE hash; + + Data_Get_Struct(self, xmlDtd, dtd); + + hash = rb_hash_new(); + + if (!dtd->attributes) { return hash; } + + xmlHashScan((xmlHashTablePtr)dtd->attributes, element_copier, (void *)hash); + + return hash; +} + +/* + * call-seq: + * elements + * + * Get a hash of the elements for this DTD. + */ +static VALUE +elements(VALUE self) +{ + xmlDtdPtr dtd; + VALUE hash; + + Data_Get_Struct(self, xmlDtd, dtd); + + if (!dtd->elements) { return Qnil; } + + hash = rb_hash_new(); + + xmlHashScan((xmlHashTablePtr)dtd->elements, element_copier, (void *)hash); + + return hash; +} + +/* + * call-seq: + * validate(document) + * + * Validate +document+ returning a list of errors + */ +static VALUE +validate(VALUE self, VALUE document) +{ + xmlDocPtr doc; + xmlDtdPtr dtd; + xmlValidCtxtPtr ctxt; + VALUE error_list; + + Data_Get_Struct(self, xmlDtd, dtd); + Data_Get_Struct(document, xmlDoc, doc); + error_list = rb_ary_new(); + + ctxt = xmlNewValidCtxt(); + + xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher); + + xmlValidateDtd(ctxt, doc, dtd); + + xmlSetStructuredErrorFunc(NULL, NULL); + + xmlFreeValidCtxt(ctxt); + + return error_list; +} + +/* + * call-seq: + * system_id + * + * Get the System ID for this DTD + */ +static VALUE +system_id(VALUE self) +{ + xmlDtdPtr dtd; + Data_Get_Struct(self, xmlDtd, dtd); + + if (!dtd->SystemID) { return Qnil; } + + return NOKOGIRI_STR_NEW2(dtd->SystemID); +} + +/* + * call-seq: + * external_id + * + * Get the External ID for this DTD + */ +static VALUE +external_id(VALUE self) +{ + xmlDtdPtr dtd; + Data_Get_Struct(self, xmlDtd, dtd); + + if (!dtd->ExternalID) { return Qnil; } + + return NOKOGIRI_STR_NEW2(dtd->ExternalID); +} + +void +noko_init_xml_dtd() +{ + assert(cNokogiriXmlNode); + /* + * Nokogiri::XML::DTD wraps DTD nodes in an XML document + */ + cNokogiriXmlDtd = rb_define_class_under(mNokogiriXml, "DTD", cNokogiriXmlNode); + + rb_define_method(cNokogiriXmlDtd, "notations", notations, 0); + rb_define_method(cNokogiriXmlDtd, "elements", elements, 0); + rb_define_method(cNokogiriXmlDtd, "entities", entities, 0); + rb_define_method(cNokogiriXmlDtd, "validate", validate, 1); + rb_define_method(cNokogiriXmlDtd, "attributes", attributes, 0); + rb_define_method(cNokogiriXmlDtd, "system_id", system_id, 0); + rb_define_method(cNokogiriXmlDtd, "external_id", external_id, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_element_content.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_element_content.c new file mode 100644 index 000000000000..dc4debb2901c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_element_content.c @@ -0,0 +1,126 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlElementContent; + +/* + * call-seq: + * name + * + * Get the require element +name+ + */ +static VALUE +get_name(VALUE self) +{ + xmlElementContentPtr elem; + Data_Get_Struct(self, xmlElementContent, elem); + + if (!elem->name) { return Qnil; } + return NOKOGIRI_STR_NEW2(elem->name); +} + +/* + * call-seq: + * type + * + * Get the element content +type+. Possible values are PCDATA, ELEMENT, SEQ, + * or OR. + */ +static VALUE +get_type(VALUE self) +{ + xmlElementContentPtr elem; + Data_Get_Struct(self, xmlElementContent, elem); + + return INT2NUM((long)elem->type); +} + +/* + * call-seq: + * c1 + * + * Get the first child. + */ +static VALUE +get_c1(VALUE self) +{ + xmlElementContentPtr elem; + Data_Get_Struct(self, xmlElementContent, elem); + + if (!elem->c1) { return Qnil; } + return noko_xml_element_content_wrap(rb_iv_get(self, "@document"), elem->c1); +} + +/* + * call-seq: + * c2 + * + * Get the first child. + */ +static VALUE +get_c2(VALUE self) +{ + xmlElementContentPtr elem; + Data_Get_Struct(self, xmlElementContent, elem); + + if (!elem->c2) { return Qnil; } + return noko_xml_element_content_wrap(rb_iv_get(self, "@document"), elem->c2); +} + +/* + * call-seq: + * occur + * + * Get the element content +occur+ flag. Possible values are ONCE, OPT, MULT + * or PLUS. + */ +static VALUE +get_occur(VALUE self) +{ + xmlElementContentPtr elem; + Data_Get_Struct(self, xmlElementContent, elem); + + return INT2NUM((long)elem->ocur); +} + +/* + * call-seq: + * prefix + * + * Get the element content namespace +prefix+. + */ +static VALUE +get_prefix(VALUE self) +{ + xmlElementContentPtr elem; + Data_Get_Struct(self, xmlElementContent, elem); + + if (!elem->prefix) { return Qnil; } + + return NOKOGIRI_STR_NEW2(elem->prefix); +} + +VALUE +noko_xml_element_content_wrap(VALUE doc, xmlElementContentPtr element) +{ + VALUE elem = Data_Wrap_Struct(cNokogiriXmlElementContent, 0, 0, element); + + /* Setting the document is necessary so that this does not get GC'd until */ + /* the document is GC'd */ + rb_iv_set(elem, "@document", doc); + + return elem; +} + +void +noko_init_xml_element_content() +{ + cNokogiriXmlElementContent = rb_define_class_under(mNokogiriXml, "ElementContent", rb_cObject); + + rb_define_method(cNokogiriXmlElementContent, "name", get_name, 0); + rb_define_method(cNokogiriXmlElementContent, "type", get_type, 0); + rb_define_method(cNokogiriXmlElementContent, "occur", get_occur, 0); + rb_define_method(cNokogiriXmlElementContent, "prefix", get_prefix, 0); + + rb_define_private_method(cNokogiriXmlElementContent, "c1", get_c1, 0); + rb_define_private_method(cNokogiriXmlElementContent, "c2", get_c2, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_element_decl.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_element_decl.c new file mode 100644 index 000000000000..178c69b80d92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_element_decl.c @@ -0,0 +1,69 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlElementDecl; + +static ID id_document; + +/* + * call-seq: + * element_type + * + * The element_type + */ +static VALUE +element_type(VALUE self) +{ + xmlElementPtr node; + Data_Get_Struct(self, xmlElement, node); + return INT2NUM((long)node->etype); +} + +/* + * call-seq: + * content + * + * The allowed content for this ElementDecl + */ +static VALUE +content(VALUE self) +{ + xmlElementPtr node; + Data_Get_Struct(self, xmlElement, node); + + if (!node->content) { return Qnil; } + + return noko_xml_element_content_wrap( + rb_funcall(self, id_document, 0), + node->content + ); +} + +/* + * call-seq: + * prefix + * + * The namespace prefix for this ElementDecl + */ +static VALUE +prefix(VALUE self) +{ + xmlElementPtr node; + Data_Get_Struct(self, xmlElement, node); + + if (!node->prefix) { return Qnil; } + + return NOKOGIRI_STR_NEW2(node->prefix); +} + +void +noko_init_xml_element_decl() +{ + assert(cNokogiriXmlNode); + cNokogiriXmlElementDecl = rb_define_class_under(mNokogiriXml, "ElementDecl", cNokogiriXmlNode); + + rb_define_method(cNokogiriXmlElementDecl, "element_type", element_type, 0); + rb_define_method(cNokogiriXmlElementDecl, "content", content, 0); + rb_define_method(cNokogiriXmlElementDecl, "prefix", prefix, 0); + + id_document = rb_intern("document"); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_encoding_handler.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_encoding_handler.c new file mode 100644 index 000000000000..0202b3c27f78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_encoding_handler.c @@ -0,0 +1,85 @@ +#include <nokogiri.h> + +/* + * call-seq: Nokogiri::EncodingHandler.[](name) + * + * Get the encoding handler for +name+ + */ +static VALUE +get(VALUE klass, VALUE key) +{ + xmlCharEncodingHandlerPtr handler; + + handler = xmlFindCharEncodingHandler(StringValueCStr(key)); + if (handler) { + return Data_Wrap_Struct(klass, NULL, NULL, handler); + } + + return Qnil; +} + +/* + * call-seq: Nokogiri::EncodingHandler.delete(name) + * + * Delete the encoding alias named +name+ + */ +static VALUE +delete (VALUE klass, VALUE name) +{ + if (xmlDelEncodingAlias(StringValueCStr(name))) { return Qnil; } + + return Qtrue; +} + +/* + * call-seq: Nokogiri::EncodingHandler.alias(from, to) + * + * Alias encoding handler with name +from+ to name +to+ + */ +static VALUE +alias(VALUE klass, VALUE from, VALUE to) +{ + xmlAddEncodingAlias(StringValueCStr(from), StringValueCStr(to)); + + return to; +} + +/* + * call-seq: Nokogiri::EncodingHandler.clear_aliases! + * + * Remove all encoding aliases. + */ +static VALUE +clear_aliases(VALUE klass) +{ + xmlCleanupEncodingAliases(); + + return klass; +} + +/* + * call-seq: name + * + * Get the name of this EncodingHandler + */ +static VALUE +name(VALUE self) +{ + xmlCharEncodingHandlerPtr handler; + + Data_Get_Struct(self, xmlCharEncodingHandler, handler); + + return NOKOGIRI_STR_NEW2(handler->name); +} + +void +noko_init_xml_encoding_handler() +{ + VALUE klass = rb_define_class_under(mNokogiri, "EncodingHandler", rb_cObject); + + rb_define_singleton_method(klass, "[]", get, 1); + rb_define_singleton_method(klass, "delete", delete, 1); + rb_define_singleton_method(klass, "alias", alias, 2); + rb_define_singleton_method(klass, "clear_aliases!", clear_aliases, 0); + rb_define_method(klass, "name", name, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_entity_decl.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_entity_decl.c new file mode 100644 index 000000000000..50893d2da1c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_entity_decl.c @@ -0,0 +1,112 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlEntityDecl; + +/* + * call-seq: + * original_content + * + * Get the original_content before ref substitution + */ +static VALUE +original_content(VALUE self) +{ + xmlEntityPtr node; + Data_Get_Struct(self, xmlEntity, node); + + if (!node->orig) { return Qnil; } + + return NOKOGIRI_STR_NEW2(node->orig); +} + +/* + * call-seq: + * content + * + * Get the content + */ +static VALUE +get_content(VALUE self) +{ + xmlEntityPtr node; + Data_Get_Struct(self, xmlEntity, node); + + if (!node->content) { return Qnil; } + + return NOKOGIRI_STR_NEW(node->content, node->length); +} + +/* + * call-seq: + * entity_type + * + * Get the entity type + */ +static VALUE +entity_type(VALUE self) +{ + xmlEntityPtr node; + Data_Get_Struct(self, xmlEntity, node); + + return INT2NUM((int)node->etype); +} + +/* + * call-seq: + * external_id + * + * Get the external identifier for PUBLIC + */ +static VALUE +external_id(VALUE self) +{ + xmlEntityPtr node; + Data_Get_Struct(self, xmlEntity, node); + + if (!node->ExternalID) { return Qnil; } + + return NOKOGIRI_STR_NEW2(node->ExternalID); +} + +/* + * call-seq: + * system_id + * + * Get the URI for a SYSTEM or PUBLIC Entity + */ +static VALUE +system_id(VALUE self) +{ + xmlEntityPtr node; + Data_Get_Struct(self, xmlEntity, node); + + if (!node->SystemID) { return Qnil; } + + return NOKOGIRI_STR_NEW2(node->SystemID); +} + +void +noko_init_xml_entity_decl() +{ + assert(cNokogiriXmlNode); + cNokogiriXmlEntityDecl = rb_define_class_under(mNokogiriXml, "EntityDecl", cNokogiriXmlNode); + + rb_define_method(cNokogiriXmlEntityDecl, "original_content", original_content, 0); + rb_define_method(cNokogiriXmlEntityDecl, "content", get_content, 0); + rb_define_method(cNokogiriXmlEntityDecl, "entity_type", entity_type, 0); + rb_define_method(cNokogiriXmlEntityDecl, "external_id", external_id, 0); + rb_define_method(cNokogiriXmlEntityDecl, "system_id", system_id, 0); + + rb_const_set(cNokogiriXmlEntityDecl, rb_intern("INTERNAL_GENERAL"), + INT2NUM(XML_INTERNAL_GENERAL_ENTITY)); + rb_const_set(cNokogiriXmlEntityDecl, rb_intern("EXTERNAL_GENERAL_PARSED"), + INT2NUM(XML_EXTERNAL_GENERAL_PARSED_ENTITY)); + rb_const_set(cNokogiriXmlEntityDecl, rb_intern("EXTERNAL_GENERAL_UNPARSED"), + INT2NUM(XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)); + rb_const_set(cNokogiriXmlEntityDecl, rb_intern("INTERNAL_PARAMETER"), + INT2NUM(XML_INTERNAL_PARAMETER_ENTITY)); + rb_const_set(cNokogiriXmlEntityDecl, rb_intern("EXTERNAL_PARAMETER"), + INT2NUM(XML_EXTERNAL_PARAMETER_ENTITY)); + rb_const_set(cNokogiriXmlEntityDecl, rb_intern("INTERNAL_PREDEFINED"), + INT2NUM(XML_INTERNAL_PREDEFINED_ENTITY)); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_entity_reference.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_entity_reference.c new file mode 100644 index 000000000000..1415ece4f1da --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_entity_reference.c @@ -0,0 +1,50 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlEntityReference; + +/* + * call-seq: + * new(document, content) + * + * Create a new EntityReference element on the +document+ with +name+ + */ +static VALUE +new (int argc, VALUE *argv, VALUE klass) +{ + xmlDocPtr xml_doc; + xmlNodePtr node; + VALUE document; + VALUE name; + VALUE rest; + VALUE rb_node; + + rb_scan_args(argc, argv, "2*", &document, &name, &rest); + + Data_Get_Struct(document, xmlDoc, xml_doc); + + node = xmlNewReference( + xml_doc, + (const xmlChar *)StringValueCStr(name) + ); + + noko_xml_document_pin_node(node); + + rb_node = noko_xml_node_wrap(klass, node); + rb_obj_call_init(rb_node, argc, argv); + + if (rb_block_given_p()) { rb_yield(rb_node); } + + return rb_node; +} + +void +noko_init_xml_entity_reference() +{ + assert(cNokogiriXmlNode); + /* + * EntityReference represents an EntityReference node in an xml document. + */ + cNokogiriXmlEntityReference = rb_define_class_under(mNokogiriXml, "EntityReference", cNokogiriXmlNode); + + rb_define_singleton_method(cNokogiriXmlEntityReference, "new", new, -1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_namespace.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_namespace.c new file mode 100644 index 000000000000..f15bd57700c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_namespace.c @@ -0,0 +1,118 @@ +#include <nokogiri.h> + +/* + * The lifecycle of a Namespace node is more complicated than other Nodes, for two reasons: + * + * 1. the underlying C structure has a different layout than all the other node structs, with the + * `_private` member where we store a pointer to Ruby object data not being in first position. + * 2. xmlNs structures returned in an xmlNodeset from an XPath query are copies of the document's + * namespaces, and so do not share the same memory lifecycle as everything else in a document. + * + * As a result of 1, you may see special handling of XML_NAMESPACE_DECL node types throughout the + * Nokogiri C code, though I intend to wrap up that logic in ruby_object_{get,set} functions + * shortly. + * + * As a result of 2, you will see we have special handling in this file and in xml_node_set.c to + * carefully manage the memory lifecycle of xmlNs structs to match the Ruby object's GC + * lifecycle. In xml_node_set.c we have local versions of xmlXPathNodeSetDel() and + * xmlXPathFreeNodeSet() that avoid freeing xmlNs structs in the node set. In this file, we decide + * whether or not to call dealloc_namespace() depending on whether the xmlNs struct appears to be + * in an xmlNodeSet (and thus the result of an XPath query) or not. + * + * Yes, this is madness. + */ + +VALUE cNokogiriXmlNamespace ; + +static void +dealloc_namespace(xmlNsPtr ns) +{ + /* + * this deallocator is only used for namespace nodes that are part of an xpath + * node set. see noko_xml_namespace_wrap(). + */ + NOKOGIRI_DEBUG_START(ns) ; + if (ns->href) { + xmlFree((xmlChar *)(uintptr_t)ns->href); + } + if (ns->prefix) { + xmlFree((xmlChar *)(uintptr_t)ns->prefix); + } + xmlFree(ns); + NOKOGIRI_DEBUG_END(ns) ; +} + + +/* + * call-seq: + * prefix + * + * Get the prefix for this namespace. Returns +nil+ if there is no prefix. + */ +static VALUE +prefix(VALUE self) +{ + xmlNsPtr ns; + + Data_Get_Struct(self, xmlNs, ns); + if (!ns->prefix) { return Qnil; } + + return NOKOGIRI_STR_NEW2(ns->prefix); +} + +/* + * call-seq: + * href + * + * Get the href for this namespace + */ +static VALUE +href(VALUE self) +{ + xmlNsPtr ns; + + Data_Get_Struct(self, xmlNs, ns); + if (!ns->href) { return Qnil; } + + return NOKOGIRI_STR_NEW2(ns->href); +} + +VALUE +noko_xml_namespace_wrap(xmlNsPtr c_namespace, xmlDocPtr c_document) +{ + VALUE rb_namespace; + + if (c_namespace->_private) { + return (VALUE)c_namespace->_private; + } + + if (c_document) { + rb_namespace = Data_Wrap_Struct(cNokogiriXmlNamespace, 0, 0, c_namespace); + + if (DOC_RUBY_OBJECT_TEST(c_document)) { + rb_iv_set(rb_namespace, "@document", DOC_RUBY_OBJECT(c_document)); + rb_ary_push(DOC_NODE_CACHE(c_document), rb_namespace); + } + } else { + rb_namespace = Data_Wrap_Struct(cNokogiriXmlNamespace, 0, dealloc_namespace, c_namespace); + } + + c_namespace->_private = (void *)rb_namespace; + + return rb_namespace; +} + +VALUE +noko_xml_namespace_wrap_xpath_copy(xmlNsPtr c_namespace) +{ + return noko_xml_namespace_wrap(c_namespace, NULL); +} + +void +noko_init_xml_namespace() +{ + cNokogiriXmlNamespace = rb_define_class_under(mNokogiriXml, "Namespace", rb_cObject); + + rb_define_method(cNokogiriXmlNamespace, "prefix", prefix, 0); + rb_define_method(cNokogiriXmlNamespace, "href", href, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_node.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_node.c new file mode 100644 index 000000000000..93e37c35a674 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_node.c @@ -0,0 +1,1824 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlNode ; + +static ID id_decorate, id_decorate_bang; + +#ifdef DEBUG +static void +debug_node_dealloc(xmlNodePtr x) +{ + NOKOGIRI_DEBUG_START(x) + NOKOGIRI_DEBUG_END(x) +} +#else +# define debug_node_dealloc 0 +#endif + +static void +mark(xmlNodePtr node) +{ + xmlDocPtr doc = node->doc; + if (doc->type == XML_DOCUMENT_NODE || doc->type == XML_HTML_DOCUMENT_NODE) { + if (DOC_RUBY_OBJECT_TEST(doc)) { + rb_gc_mark(DOC_RUBY_OBJECT(doc)); + } + } else if (node->doc->_private) { + rb_gc_mark((VALUE)doc->_private); + } +} + +/* :nodoc: */ +typedef xmlNodePtr(*pivot_reparentee_func)(xmlNodePtr, xmlNodePtr); + +/* :nodoc: */ +static void +relink_namespace(xmlNodePtr reparented) +{ + xmlNodePtr child; + + if (reparented->type != XML_ATTRIBUTE_NODE && + reparented->type != XML_ELEMENT_NODE) { return; } + + if (reparented->ns == NULL || reparented->ns->prefix == NULL) { + xmlNsPtr ns = NULL; + xmlChar *name = NULL, *prefix = NULL; + + name = xmlSplitQName2(reparented->name, &prefix); + + if (reparented->type == XML_ATTRIBUTE_NODE) { + if (prefix == NULL || strcmp((char *)prefix, XMLNS_PREFIX) == 0) { + xmlFree(name); + xmlFree(prefix); + return; + } + } + + ns = xmlSearchNs(reparented->doc, reparented, prefix); + + if (ns != NULL) { + xmlNodeSetName(reparented, name); + xmlSetNs(reparented, ns); + } + + xmlFree(name); + xmlFree(prefix); + } + + /* Avoid segv when relinking against unlinked nodes. */ + if (reparented->type != XML_ELEMENT_NODE || !reparented->parent) { return; } + + /* Make sure that our reparented node has the correct namespaces */ + if (!reparented->ns && reparented->doc != (xmlDocPtr)reparented->parent) { + xmlSetNs(reparented, reparented->parent->ns); + } + + /* Search our parents for an existing definition */ + if (reparented->nsDef) { + xmlNsPtr curr = reparented->nsDef; + xmlNsPtr prev = NULL; + + while (curr) { + xmlNsPtr ns = xmlSearchNsByHref( + reparented->doc, + reparented->parent, + curr->href + ); + /* If we find the namespace is already declared, remove it from this + * definition list. */ + if (ns && ns != curr && xmlStrEqual(ns->prefix, curr->prefix)) { + if (prev) { + prev->next = curr->next; + } else { + reparented->nsDef = curr->next; + } + noko_xml_document_pin_namespace(curr, reparented->doc); + } else { + prev = curr; + } + curr = curr->next; + } + } + + /* + * Search our parents for an existing definition of current namespace, + * because the definition it's pointing to may have just been removed nsDef. + * + * And although that would technically probably be OK, I'd feel better if we + * referred to a namespace that's still present in a node's nsDef somewhere + * in the doc. + */ + if (reparented->ns) { + xmlNsPtr ns = xmlSearchNs(reparented->doc, reparented, reparented->ns->prefix); + if (ns + && ns != reparented->ns + && xmlStrEqual(ns->prefix, reparented->ns->prefix) + && xmlStrEqual(ns->href, reparented->ns->href) + ) { + xmlSetNs(reparented, ns); + } + } + + /* Only walk all children if there actually is a namespace we need to */ + /* reparent. */ + if (NULL == reparented->ns) { return; } + + /* When a node gets reparented, walk it's children to make sure that */ + /* their namespaces are reparented as well. */ + child = reparented->children; + while (NULL != child) { + relink_namespace(child); + child = child->next; + } + + if (reparented->type == XML_ELEMENT_NODE) { + child = (xmlNodePtr)((xmlElementPtr)reparented)->attributes; + while (NULL != child) { + relink_namespace(child); + child = child->next; + } + } +} + +/* :nodoc: */ +static xmlNodePtr +xmlReplaceNodeWrapper(xmlNodePtr pivot, xmlNodePtr new_node) +{ + xmlNodePtr retval ; + + retval = xmlReplaceNode(pivot, new_node) ; + + if (retval == pivot) { + retval = new_node ; /* return semantics for reparent_node_with */ + } + + /* work around libxml2 issue: https://bugzilla.gnome.org/show_bug.cgi?id=615612 */ + if (retval && retval->type == XML_TEXT_NODE) { + if (retval->prev && retval->prev->type == XML_TEXT_NODE) { + retval = xmlTextMerge(retval->prev, retval); + } + if (retval->next && retval->next->type == XML_TEXT_NODE) { + retval = xmlTextMerge(retval, retval->next); + } + } + + return retval ; +} + +/* :nodoc: */ +static VALUE +reparent_node_with(VALUE pivot_obj, VALUE reparentee_obj, pivot_reparentee_func prf) +{ + VALUE reparented_obj ; + xmlNodePtr reparentee, pivot, reparented, next_text, new_next_text, parent ; + int original_ns_prefix_is_default = 0 ; + + if (!rb_obj_is_kind_of(reparentee_obj, cNokogiriXmlNode)) { + rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node"); + } + if (rb_obj_is_kind_of(reparentee_obj, cNokogiriXmlDocument)) { + rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node"); + } + + Data_Get_Struct(reparentee_obj, xmlNode, reparentee); + Data_Get_Struct(pivot_obj, xmlNode, pivot); + + /* + * Check if nodes given are appropriate to have a parent-child + * relationship, based on the DOM specification. + * + * cf. http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-1590626202 + */ + if (prf == xmlAddChild) { + parent = pivot; + } else { + parent = pivot->parent; + } + + if (parent) { + switch (parent->type) { + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + switch (reparentee->type) { + case XML_ELEMENT_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_DOCUMENT_TYPE_NODE: + /* + * The DOM specification says no to adding text-like nodes + * directly to a document, but we allow it for compatibility. + */ + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + goto ok; + default: + break; + } + break; + case XML_DOCUMENT_FRAG_NODE: + case XML_ENTITY_REF_NODE: + case XML_ELEMENT_NODE: + switch (reparentee->type) { + case XML_ELEMENT_NODE: + case XML_PI_NODE: + case XML_COMMENT_NODE: + case XML_TEXT_NODE: + case XML_CDATA_SECTION_NODE: + case XML_ENTITY_REF_NODE: + goto ok; + default: + break; + } + break; + case XML_ATTRIBUTE_NODE: + switch (reparentee->type) { + case XML_TEXT_NODE: + case XML_ENTITY_REF_NODE: + goto ok; + default: + break; + } + break; + case XML_TEXT_NODE: + /* + * xmlAddChild() breaks the DOM specification in that it allows + * adding a text node to another, in which case text nodes are + * coalesced, but since our JRuby version does not support such + * operation, we should inhibit it. + */ + break; + default: + break; + } + + rb_raise(rb_eArgError, "cannot reparent %s there", rb_obj_classname(reparentee_obj)); + } + +ok: + xmlUnlinkNode(reparentee); + + if (reparentee->doc != pivot->doc || reparentee->type == XML_TEXT_NODE) { + /* + * if the reparentee is a text node, there's a very good chance it will be + * merged with an adjacent text node after being reparented, and in that case + * libxml will free the underlying C struct. + * + * since we clearly have a ruby object which references the underlying + * memory, we can't let the C struct get freed. let's pickle the original + * reparentee by rooting it; and then we'll reparent a duplicate of the + * node that we don't care about preserving. + * + * alternatively, if the reparentee is from a different document than the + * pivot node, libxml2 is going to get confused about which document's + * "dictionary" the node's strings belong to (this is an otherwise + * uninteresting libxml2 implementation detail). as a result, we cannot + * reparent the actual reparentee, so we reparent a duplicate. + */ + if (reparentee->type == XML_TEXT_NODE && reparentee->_private) { + /* + * additionally, since we know this C struct isn't going to be related to + * a Ruby object anymore, let's break the relationship on this end as + * well. + * + * this is not absolutely necessary unless libxml-ruby is also in effect, + * in which case its global callback `rxml_node_deregisterNode` will try + * to do things to our data. + * + * for more details on this particular (and particularly nasty) edge + * case, see: + * + * https://github.com/sparklemotion/nokogiri/issues/1426 + */ + reparentee->_private = NULL ; + } + + if (reparentee->ns != NULL && reparentee->ns->prefix == NULL) { + original_ns_prefix_is_default = 1; + } + + noko_xml_document_pin_node(reparentee); + + if (!(reparentee = xmlDocCopyNode(reparentee, pivot->doc, 1))) { + rb_raise(rb_eRuntimeError, "Could not reparent node (xmlDocCopyNode)"); + } + + if (original_ns_prefix_is_default && reparentee->ns != NULL && reparentee->ns->prefix != NULL) { + /* + * issue #391, where new node's prefix may become the string "default" + * see libxml2 tree.c xmlNewReconciliedNs which implements this behavior. + */ + xmlFree((xmlChar *)reparentee->ns->prefix); + reparentee->ns->prefix = NULL; + } + } + + if (prf != xmlAddPrevSibling && prf != xmlAddNextSibling + && reparentee->type == XML_TEXT_NODE && pivot->next && pivot->next->type == XML_TEXT_NODE) { + /* + * libxml merges text nodes in a right-to-left fashion, meaning that if + * there are two text nodes who would be adjacent, the right (or following, + * or next) node will be merged into the left (or preceding, or previous) + * node. + * + * and by "merged" I mean the string contents will be concatenated onto the + * left node's contents, and then the node will be freed. + * + * which means that if we have a ruby object wrapped around the right node, + * its memory would be freed out from under it. + * + * so, we detect this edge case and unlink-and-root the text node before it gets + * merged. then we dup the node and insert that duplicate back into the + * document where the real node was. + * + * yes, this is totally lame. + */ + next_text = pivot->next ; + new_next_text = xmlDocCopyNode(next_text, pivot->doc, 1) ; + + xmlUnlinkNode(next_text); + noko_xml_document_pin_node(next_text); + + xmlAddNextSibling(pivot, new_next_text); + } + + if (!(reparented = (*prf)(pivot, reparentee))) { + rb_raise(rb_eRuntimeError, "Could not reparent node"); + } + + /* + * make sure the ruby object is pointed at the just-reparented node, which + * might be a duplicate (see above) or might be the result of merging + * adjacent text nodes. + */ + DATA_PTR(reparentee_obj) = reparented ; + + relink_namespace(reparented); + + reparented_obj = noko_xml_node_wrap(Qnil, reparented); + + rb_funcall(reparented_obj, id_decorate_bang, 0); + + return reparented_obj ; +} + + +/* + * call-seq: + * document + * + * Get the document for this Node + */ +static VALUE +document(VALUE self) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + return DOC_RUBY_OBJECT(node->doc); +} + +/* + * call-seq: + * pointer_id + * + * Get the internal pointer number + */ +static VALUE +pointer_id(VALUE self) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + + return INT2NUM((long)(node)); +} + +/* + * call-seq: + * encode_special_chars(string) + * + * Encode any special characters in +string+ + */ +static VALUE +encode_special_chars(VALUE self, VALUE string) +{ + xmlNodePtr node; + xmlChar *encoded; + VALUE encoded_str; + + Data_Get_Struct(self, xmlNode, node); + encoded = xmlEncodeSpecialChars( + node->doc, + (const xmlChar *)StringValueCStr(string) + ); + + encoded_str = NOKOGIRI_STR_NEW2(encoded); + xmlFree(encoded); + + return encoded_str; +} + +/* + * call-seq: + * create_internal_subset(name, external_id, system_id) + * + * Create the internal subset of a document. + * + * doc.create_internal_subset("chapter", "-//OASIS//DTD DocBook XML//EN", "chapter.dtd") + * # => <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML//EN" "chapter.dtd"> + * + * doc.create_internal_subset("chapter", nil, "chapter.dtd") + * # => <!DOCTYPE chapter SYSTEM "chapter.dtd"> + */ +static VALUE +create_internal_subset(VALUE self, VALUE name, VALUE external_id, VALUE system_id) +{ + xmlNodePtr node; + xmlDocPtr doc; + xmlDtdPtr dtd; + + Data_Get_Struct(self, xmlNode, node); + + doc = node->doc; + + if (xmlGetIntSubset(doc)) { + rb_raise(rb_eRuntimeError, "Document already has an internal subset"); + } + + dtd = xmlCreateIntSubset( + doc, + NIL_P(name) ? NULL : (const xmlChar *)StringValueCStr(name), + NIL_P(external_id) ? NULL : (const xmlChar *)StringValueCStr(external_id), + NIL_P(system_id) ? NULL : (const xmlChar *)StringValueCStr(system_id) + ); + + if (!dtd) { return Qnil; } + + return noko_xml_node_wrap(Qnil, (xmlNodePtr)dtd); +} + +/* + * call-seq: + * create_external_subset(name, external_id, system_id) + * + * Create an external subset + */ +static VALUE +create_external_subset(VALUE self, VALUE name, VALUE external_id, VALUE system_id) +{ + xmlNodePtr node; + xmlDocPtr doc; + xmlDtdPtr dtd; + + Data_Get_Struct(self, xmlNode, node); + + doc = node->doc; + + if (doc->extSubset) { + rb_raise(rb_eRuntimeError, "Document already has an external subset"); + } + + dtd = xmlNewDtd( + doc, + NIL_P(name) ? NULL : (const xmlChar *)StringValueCStr(name), + NIL_P(external_id) ? NULL : (const xmlChar *)StringValueCStr(external_id), + NIL_P(system_id) ? NULL : (const xmlChar *)StringValueCStr(system_id) + ); + + if (!dtd) { return Qnil; } + + return noko_xml_node_wrap(Qnil, (xmlNodePtr)dtd); +} + +/* + * call-seq: + * external_subset + * + * Get the external subset + */ +static VALUE +external_subset(VALUE self) +{ + xmlNodePtr node; + xmlDocPtr doc; + xmlDtdPtr dtd; + + Data_Get_Struct(self, xmlNode, node); + + if (!node->doc) { return Qnil; } + + doc = node->doc; + dtd = doc->extSubset; + + if (!dtd) { return Qnil; } + + return noko_xml_node_wrap(Qnil, (xmlNodePtr)dtd); +} + +/* + * call-seq: + * internal_subset + * + * Get the internal subset + */ +static VALUE +internal_subset(VALUE self) +{ + xmlNodePtr node; + xmlDocPtr doc; + xmlDtdPtr dtd; + + Data_Get_Struct(self, xmlNode, node); + + if (!node->doc) { return Qnil; } + + doc = node->doc; + dtd = xmlGetIntSubset(doc); + + if (!dtd) { return Qnil; } + + return noko_xml_node_wrap(Qnil, (xmlNodePtr)dtd); +} + +/* + * call-seq: + * dup + * dup(depth) + * dup(depth, new_parent_doc) + * + * Copy this node. + * An optional depth may be passed in. 0 is a shallow copy, 1 (the default) is a deep copy. + * An optional new_parent_doc may also be passed in, which will be the new + * node's parent document. Defaults to the current node's document. + * current document. + */ +static VALUE +duplicate_node(int argc, VALUE *argv, VALUE self) +{ + VALUE r_level, r_new_parent_doc; + int level; + int n_args; + xmlDocPtr new_parent_doc; + xmlNodePtr node, dup; + + Data_Get_Struct(self, xmlNode, node); + + n_args = rb_scan_args(argc, argv, "02", &r_level, &r_new_parent_doc); + + if (n_args < 1) { + r_level = INT2NUM((long)1); + } + level = (int)NUM2INT(r_level); + + if (n_args < 2) { + new_parent_doc = node->doc; + } else { + Data_Get_Struct(r_new_parent_doc, xmlDoc, new_parent_doc); + } + + dup = xmlDocCopyNode(node, new_parent_doc, level); + if (dup == NULL) { return Qnil; } + + noko_xml_document_pin_node(dup); + + return noko_xml_node_wrap(rb_obj_class(self), dup); +} + +/* + * call-seq: + * unlink + * + * Unlink this node from its current context. + */ +static VALUE +unlink_node(VALUE self) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + xmlUnlinkNode(node); + noko_xml_document_pin_node(node); + return self; +} + +/* + * call-seq: + * blank? + * + * Is this node blank? + */ +static VALUE +blank_eh(VALUE self) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + return (1 == xmlIsBlankNode(node)) ? Qtrue : Qfalse ; +} + +/* + * call-seq: + * next_sibling + * + * Returns the next sibling node + */ +static VALUE +next_sibling(VALUE self) +{ + xmlNodePtr node, sibling; + Data_Get_Struct(self, xmlNode, node); + + sibling = node->next; + if (!sibling) { return Qnil; } + + return noko_xml_node_wrap(Qnil, sibling) ; +} + +/* + * call-seq: + * previous_sibling + * + * Returns the previous sibling node + */ +static VALUE +previous_sibling(VALUE self) +{ + xmlNodePtr node, sibling; + Data_Get_Struct(self, xmlNode, node); + + sibling = node->prev; + if (!sibling) { return Qnil; } + + return noko_xml_node_wrap(Qnil, sibling); +} + +/* + * call-seq: + * next_element + * + * Returns the next Nokogiri::XML::Element type sibling node. + */ +static VALUE +next_element(VALUE self) +{ + xmlNodePtr node, sibling; + Data_Get_Struct(self, xmlNode, node); + + sibling = xmlNextElementSibling(node); + if (!sibling) { return Qnil; } + + return noko_xml_node_wrap(Qnil, sibling); +} + +/* + * call-seq: + * previous_element + * + * Returns the previous Nokogiri::XML::Element type sibling node. + */ +static VALUE +previous_element(VALUE self) +{ + xmlNodePtr node, sibling; + Data_Get_Struct(self, xmlNode, node); + + /* + * note that we don't use xmlPreviousElementSibling here because it's buggy pre-2.7.7. + */ + sibling = node->prev; + if (!sibling) { return Qnil; } + + while (sibling && sibling->type != XML_ELEMENT_NODE) { + sibling = sibling->prev; + } + + return sibling ? noko_xml_node_wrap(Qnil, sibling) : Qnil ; +} + +/* :nodoc: */ +static VALUE +replace(VALUE self, VALUE new_node) +{ + VALUE reparent = reparent_node_with(self, new_node, xmlReplaceNodeWrapper); + + xmlNodePtr pivot; + Data_Get_Struct(self, xmlNode, pivot); + noko_xml_document_pin_node(pivot); + + return reparent; +} + +/* + * call-seq: + * children + * + * Get the list of children for this node as a NodeSet + */ +static VALUE +children(VALUE self) +{ + xmlNodePtr node; + xmlNodePtr child; + xmlNodeSetPtr set; + VALUE document; + VALUE node_set; + + Data_Get_Struct(self, xmlNode, node); + + child = node->children; + set = xmlXPathNodeSetCreate(child); + + document = DOC_RUBY_OBJECT(node->doc); + + if (!child) { return noko_xml_node_set_wrap(set, document); } + + child = child->next; + while (NULL != child) { + xmlXPathNodeSetAddUnique(set, child); + child = child->next; + } + + node_set = noko_xml_node_set_wrap(set, document); + + return node_set; +} + +/* + * call-seq: + * element_children + * + * Get the list of children for this node as a NodeSet. All nodes will be + * element nodes. + * + * Example: + * + * @doc.root.element_children.all? { |x| x.element? } # => true + */ +static VALUE +element_children(VALUE self) +{ + xmlNodePtr node; + xmlNodePtr child; + xmlNodeSetPtr set; + VALUE document; + VALUE node_set; + + Data_Get_Struct(self, xmlNode, node); + + child = xmlFirstElementChild(node); + set = xmlXPathNodeSetCreate(child); + + document = DOC_RUBY_OBJECT(node->doc); + + if (!child) { return noko_xml_node_set_wrap(set, document); } + + child = xmlNextElementSibling(child); + while (NULL != child) { + xmlXPathNodeSetAddUnique(set, child); + child = xmlNextElementSibling(child); + } + + node_set = noko_xml_node_set_wrap(set, document); + + return node_set; +} + +/* + * call-seq: + * child + * + * Returns the child node + */ +static VALUE +child(VALUE self) +{ + xmlNodePtr node, child; + Data_Get_Struct(self, xmlNode, node); + + child = node->children; + if (!child) { return Qnil; } + + return noko_xml_node_wrap(Qnil, child); +} + +/* + * call-seq: + * first_element_child + * + * Returns the first child node of this node that is an element. + * + * Example: + * + * @doc.root.first_element_child.element? # => true + */ +static VALUE +first_element_child(VALUE self) +{ + xmlNodePtr node, child; + Data_Get_Struct(self, xmlNode, node); + + child = xmlFirstElementChild(node); + if (!child) { return Qnil; } + + return noko_xml_node_wrap(Qnil, child); +} + +/* + * call-seq: + * last_element_child + * + * Returns the last child node of this node that is an element. + * + * Example: + * + * @doc.root.last_element_child.element? # => true + */ +static VALUE +last_element_child(VALUE self) +{ + xmlNodePtr node, child; + Data_Get_Struct(self, xmlNode, node); + + child = xmlLastElementChild(node); + if (!child) { return Qnil; } + + return noko_xml_node_wrap(Qnil, child); +} + +/* + * call-seq: + * key?(attribute) + * + * Returns true if +attribute+ is set + */ +static VALUE +key_eh(VALUE self, VALUE attribute) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + if (xmlHasProp(node, (xmlChar *)StringValueCStr(attribute))) { + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * namespaced_key?(attribute, namespace) + * + * Returns true if +attribute+ is set with +namespace+ + */ +static VALUE +namespaced_key_eh(VALUE self, VALUE attribute, VALUE namespace) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + if (xmlHasNsProp(node, (xmlChar *)StringValueCStr(attribute), + NIL_P(namespace) ? NULL : (xmlChar *)StringValueCStr(namespace))) { + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * []=(property, value) + * + * Set the +property+ to +value+ + */ +static VALUE +set(VALUE self, VALUE property, VALUE value) +{ + xmlNodePtr node, cur; + xmlAttrPtr prop; + Data_Get_Struct(self, xmlNode, node); + + /* If a matching attribute node already exists, then xmlSetProp will destroy + * the existing node's children. However, if Nokogiri has a node object + * pointing to one of those children, we are left with a broken reference. + * + * We can avoid this by unlinking these nodes first. + */ + if (node->type != XML_ELEMENT_NODE) { + return (Qnil); + } + prop = xmlHasProp(node, (xmlChar *)StringValueCStr(property)); + if (prop && prop->children) { + for (cur = prop->children; cur; cur = cur->next) { + if (cur->_private) { + noko_xml_document_pin_node(cur); + xmlUnlinkNode(cur); + } + } + } + + xmlSetProp(node, (xmlChar *)StringValueCStr(property), + (xmlChar *)StringValueCStr(value)); + + return value; +} + +/* + * call-seq: + * get(attribute) + * + * Get the value for +attribute+ + */ +static VALUE +get(VALUE self, VALUE rattribute) +{ + xmlNodePtr node; + xmlChar *value = 0; + VALUE rvalue; + xmlChar *colon; + xmlChar *attribute, *attr_name, *prefix; + xmlNsPtr ns; + + if (NIL_P(rattribute)) { return Qnil; } + + Data_Get_Struct(self, xmlNode, node); + attribute = xmlCharStrdup(StringValueCStr(rattribute)); + + colon = (xmlChar *)(uintptr_t)xmlStrchr(attribute, (const xmlChar)':'); + if (colon) { + /* split the attribute string into separate prefix and name by + * null-terminating the prefix at the colon */ + prefix = attribute; + attr_name = colon + 1; + (*colon) = 0; + + ns = xmlSearchNs(node->doc, node, prefix); + if (ns) { + value = xmlGetNsProp(node, attr_name, ns->href); + } else { + value = xmlGetProp(node, (xmlChar *)StringValueCStr(rattribute)); + } + } else { + value = xmlGetNoNsProp(node, attribute); + } + + xmlFree((void *)attribute); + if (!value) { return Qnil; } + + rvalue = NOKOGIRI_STR_NEW2(value); + xmlFree((void *)value); + + return rvalue ; +} + +/* + * call-seq: + * set_namespace(namespace) + * + * Set the namespace to +namespace+ + */ +static VALUE +set_namespace(VALUE self, VALUE namespace) +{ + xmlNodePtr node; + xmlNsPtr ns = NULL; + + Data_Get_Struct(self, xmlNode, node); + + if (!NIL_P(namespace)) { + Data_Get_Struct(namespace, xmlNs, ns); + } + + xmlSetNs(node, ns); + + return self; +} + +/* + * call-seq: + * attribute(name) + * + * Get the attribute node with +name+ + */ +static VALUE +attr(VALUE self, VALUE name) +{ + xmlNodePtr node; + xmlAttrPtr prop; + Data_Get_Struct(self, xmlNode, node); + prop = xmlHasProp(node, (xmlChar *)StringValueCStr(name)); + + if (! prop) { return Qnil; } + return noko_xml_node_wrap(Qnil, (xmlNodePtr)prop); +} + +/* + * call-seq: + * attribute_with_ns(name, namespace) + * + * Get the attribute node with +name+ and +namespace+ + */ +static VALUE +attribute_with_ns(VALUE self, VALUE name, VALUE namespace) +{ + xmlNodePtr node; + xmlAttrPtr prop; + Data_Get_Struct(self, xmlNode, node); + prop = xmlHasNsProp(node, (xmlChar *)StringValueCStr(name), + NIL_P(namespace) ? NULL : (xmlChar *)StringValueCStr(namespace)); + + if (! prop) { return Qnil; } + return noko_xml_node_wrap(Qnil, (xmlNodePtr)prop); +} + +/* + * @overload attribute_nodes() + * Get the attributes for a Node + * @return [Array<Nokogiri::XML::Attr>] containing the Node's attributes. + */ +static VALUE +attribute_nodes(VALUE rb_node) +{ + xmlNodePtr c_node; + + Data_Get_Struct(rb_node, xmlNode, c_node); + + return noko_xml_node_attrs(c_node); +} + + +/* + * call-seq: + * namespace() + * + * returns the namespace of the element or attribute node as a Namespace + * object, or nil if there is no namespace for the element or attribute. + */ +static VALUE +noko_xml_node_namespace(VALUE rb_node) +{ + xmlNodePtr c_node ; + Data_Get_Struct(rb_node, xmlNode, c_node); + + if (c_node->ns) { + return noko_xml_namespace_wrap(c_node->ns, c_node->doc); + } + + return Qnil ; +} + +/* + * call-seq: + * namespace_definitions() + * + * returns namespaces defined on self element directly, as an array of Namespace objects. Includes both a default namespace (as in"xmlns="), and prefixed namespaces (as in "xmlns:prefix="). + */ +static VALUE +namespace_definitions(VALUE rb_node) +{ + /* this code in the mode of xmlHasProp() */ + xmlNodePtr c_node ; + xmlNsPtr c_namespace; + VALUE definitions = rb_ary_new(); + + Data_Get_Struct(rb_node, xmlNode, c_node); + + c_namespace = c_node->nsDef; + if (!c_namespace) { + return definitions; + } + + while (c_namespace != NULL) { + rb_ary_push(definitions, noko_xml_namespace_wrap(c_namespace, c_node->doc)); + c_namespace = c_namespace->next; + } + + return definitions; +} + +/* + * call-seq: + * namespace_scopes() + * + * returns namespaces in scope for self -- those defined on self element + * directly or any ancestor node -- as an array of Namespace objects. Default + * namespaces ("xmlns=" style) for self are included in this array; Default + * namespaces for ancestors, however, are not. See also #namespaces + */ +static VALUE +namespace_scopes(VALUE rb_node) +{ + xmlNodePtr c_node ; + xmlNsPtr *namespaces; + VALUE scopes = rb_ary_new(); + int j; + + Data_Get_Struct(rb_node, xmlNode, c_node); + + namespaces = xmlGetNsList(c_node->doc, c_node); + if (!namespaces) { + return scopes; + } + + for (j = 0 ; namespaces[j] != NULL ; ++j) { + rb_ary_push(scopes, noko_xml_namespace_wrap(namespaces[j], c_node->doc)); + } + + xmlFree(namespaces); + return scopes; +} + +/* + * call-seq: + * node_type + * + * Get the type for this Node + */ +static VALUE +node_type(VALUE self) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + return INT2NUM((long)node->type); +} + +/* + * call-seq: + * content= + * + * Set the content for this Node + */ +static VALUE +set_native_content(VALUE self, VALUE content) +{ + xmlNodePtr node, child, next ; + Data_Get_Struct(self, xmlNode, node); + + child = node->children; + while (NULL != child) { + next = child->next ; + xmlUnlinkNode(child) ; + noko_xml_document_pin_node(child); + child = next ; + } + + xmlNodeSetContent(node, (xmlChar *)StringValueCStr(content)); + return content; +} + +/* + * call-seq: + * content + * + * Returns the plaintext content for this Node. Note that entities will always + * be expanded in the returned string. + */ +static VALUE +get_native_content(VALUE self) +{ + xmlNodePtr node; + xmlChar *content; + + Data_Get_Struct(self, xmlNode, node); + + content = xmlNodeGetContent(node); + if (content) { + VALUE rval = NOKOGIRI_STR_NEW2(content); + xmlFree(content); + return rval; + } + return Qnil; +} + +/* + * call-seq: + * lang= + * + * Set the language of a node, i.e. the values of the xml:lang attribute. + */ +static VALUE +set_lang(VALUE self_rb, VALUE lang_rb) +{ + xmlNodePtr self ; + xmlChar *lang ; + + Data_Get_Struct(self_rb, xmlNode, self); + lang = (xmlChar *)StringValueCStr(lang_rb); + + xmlNodeSetLang(self, lang); + + return Qnil ; +} + +/* + * call-seq: + * lang + * + * Searches the language of a node, i.e. the values of the xml:lang attribute or + * the one carried by the nearest ancestor. + */ +static VALUE +get_lang(VALUE self_rb) +{ + xmlNodePtr self ; + xmlChar *lang ; + VALUE lang_rb ; + + Data_Get_Struct(self_rb, xmlNode, self); + + lang = xmlNodeGetLang(self); + if (lang) { + lang_rb = NOKOGIRI_STR_NEW2(lang); + xmlFree(lang); + return lang_rb ; + } + + return Qnil ; +} + +/* :nodoc: */ +static VALUE +add_child(VALUE self, VALUE new_child) +{ + return reparent_node_with(self, new_child, xmlAddChild); +} + +/* + * call-seq: + * parent + * + * Get the parent Node for this Node + */ +static VALUE +get_parent(VALUE self) +{ + xmlNodePtr node, parent; + Data_Get_Struct(self, xmlNode, node); + + parent = node->parent; + if (!parent) { return Qnil; } + + return noko_xml_node_wrap(Qnil, parent) ; +} + +/* + * call-seq: + * name=(new_name) + * + * Set the name for this Node + */ +static VALUE +set_name(VALUE self, VALUE new_name) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + xmlNodeSetName(node, (xmlChar *)StringValueCStr(new_name)); + return new_name; +} + +/* + * call-seq: + * name + * + * Returns the name for this Node + */ +static VALUE +get_name(VALUE self) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + if (node->name) { + return NOKOGIRI_STR_NEW2(node->name); + } + return Qnil; +} + +/* + * call-seq: + * path + * + * Returns the path associated with this Node + */ +static VALUE +path(VALUE self) +{ + xmlNodePtr node; + xmlChar *path ; + VALUE rval; + + Data_Get_Struct(self, xmlNode, node); + + path = xmlGetNodePath(node); + rval = NOKOGIRI_STR_NEW2(path); + xmlFree(path); + return rval ; +} + +/* :nodoc: */ +static VALUE +add_next_sibling(VALUE self, VALUE new_sibling) +{ + return reparent_node_with(self, new_sibling, xmlAddNextSibling) ; +} + +/* :nodoc: */ +static VALUE +add_previous_sibling(VALUE self, VALUE new_sibling) +{ + return reparent_node_with(self, new_sibling, xmlAddPrevSibling) ; +} + +/* + * call-seq: + * native_write_to(io, encoding, options) + * + * Write this Node to +io+ with +encoding+ and +options+ + */ +static VALUE +native_write_to( + VALUE self, + VALUE io, + VALUE encoding, + VALUE indent_string, + VALUE options +) +{ + xmlNodePtr node; + const char *before_indent; + xmlSaveCtxtPtr savectx; + + Data_Get_Struct(self, xmlNode, node); + + xmlIndentTreeOutput = 1; + + before_indent = xmlTreeIndentString; + + xmlTreeIndentString = StringValueCStr(indent_string); + + savectx = xmlSaveToIO( + (xmlOutputWriteCallback)noko_io_write, + (xmlOutputCloseCallback)noko_io_close, + (void *)io, + RTEST(encoding) ? StringValueCStr(encoding) : NULL, + (int)NUM2INT(options) + ); + + xmlSaveTree(savectx, node); + xmlSaveClose(savectx); + + xmlTreeIndentString = before_indent; + return io; +} + +/* + * call-seq: + * line + * + * Returns the line for this Node + */ +static VALUE +line(VALUE self) +{ + xmlNodePtr node; + Data_Get_Struct(self, xmlNode, node); + + return INT2NUM(xmlGetLineNo(node)); +} + +/* + * call-seq: + * line=(num) + * + * Sets the line for this Node. num must be less than 65535. + */ +static VALUE +set_line(VALUE self, VALUE num) +{ + xmlNodePtr node; + int value = NUM2INT(num); + + Data_Get_Struct(self, xmlNode, node); + if (value < 65535) { + node->line = value; + } + + return num; +} + +/* + * call-seq: + * add_namespace_definition(prefix, href) + * + * Adds a namespace definition with +prefix+ using +href+ value. The result is + * as if parsed XML for this node had included an attribute + * 'xmlns:prefix=value'. A default namespace for this node ("xmlns=") can be + * added by passing 'nil' for prefix. Namespaces added this way will not + * show up in #attributes, but they will be included as an xmlns attribute + * when the node is serialized to XML. + */ +static VALUE +add_namespace_definition(VALUE rb_node, VALUE rb_prefix, VALUE rb_href) +{ + xmlNodePtr c_node, element; + xmlNsPtr c_namespace; + const xmlChar *c_prefix = (const xmlChar *)(NIL_P(rb_prefix) ? NULL : StringValueCStr(rb_prefix)); + + Data_Get_Struct(rb_node, xmlNode, c_node); + element = c_node ; + + c_namespace = xmlSearchNs(c_node->doc, c_node, c_prefix); + + if (!c_namespace) { + if (c_node->type != XML_ELEMENT_NODE) { + element = c_node->parent; + } + c_namespace = xmlNewNs(element, (const xmlChar *)StringValueCStr(rb_href), c_prefix); + } + + if (!c_namespace) { + return Qnil ; + } + + if (NIL_P(rb_prefix) || c_node != element) { + xmlSetNs(c_node, c_namespace); + } + + return noko_xml_namespace_wrap(c_namespace, c_node->doc); +} + +/* + * @overload new(name, document) + * Create a new node with +name+ sharing GC lifecycle with +document+. + * @param name [String] + * @param document [Nokogiri::XML::Document] + * @yieldparam node [Nokogiri::XML::Node] + * @return [Nokogiri::XML::Node] + * @see Nokogiri::XML::Node#initialize + */ +static VALUE +rb_xml_node_new(int argc, VALUE *argv, VALUE klass) +{ + xmlDocPtr doc; + xmlNodePtr node; + VALUE name; + VALUE document; + VALUE rest; + VALUE rb_node; + + rb_scan_args(argc, argv, "2*", &name, &document, &rest); + + Data_Get_Struct(document, xmlDoc, doc); + + node = xmlNewNode(NULL, (xmlChar *)StringValueCStr(name)); + node->doc = doc->doc; + noko_xml_document_pin_node(node); + + rb_node = noko_xml_node_wrap( + klass == cNokogiriXmlNode ? (VALUE)NULL : klass, + node + ); + rb_obj_call_init(rb_node, argc, argv); + + if (rb_block_given_p()) { rb_yield(rb_node); } + + return rb_node; +} + +/* + * call-seq: + * dump_html + * + * Returns the Node as html. + */ +static VALUE +dump_html(VALUE self) +{ + xmlBufferPtr buf ; + xmlNodePtr node ; + VALUE html; + + Data_Get_Struct(self, xmlNode, node); + + buf = xmlBufferCreate() ; + htmlNodeDump(buf, node->doc, node); + html = NOKOGIRI_STR_NEW2(buf->content); + xmlBufferFree(buf); + return html ; +} + +/* + * call-seq: + * compare(other) + * + * Compare this Node to +other+ with respect to their Document + */ +static VALUE +compare(VALUE self, VALUE _other) +{ + xmlNodePtr node, other; + Data_Get_Struct(self, xmlNode, node); + Data_Get_Struct(_other, xmlNode, other); + + return INT2NUM((long)xmlXPathCmpNodes(other, node)); +} + + +/* + * call-seq: + * process_xincludes(options) + * + * Loads and substitutes all xinclude elements below the node. The + * parser context will be initialized with +options+. + */ +static VALUE +process_xincludes(VALUE self, VALUE options) +{ + int rcode ; + xmlNodePtr node; + VALUE error_list = rb_ary_new(); + + Data_Get_Struct(self, xmlNode, node); + + xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher); + rcode = xmlXIncludeProcessTreeFlags(node, (int)NUM2INT(options)); + xmlSetStructuredErrorFunc(NULL, NULL); + + if (rcode < 0) { + xmlErrorPtr error; + + error = xmlGetLastError(); + if (error) { + rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error)); + } else { + rb_raise(rb_eRuntimeError, "Could not perform xinclude substitution"); + } + } + + return self; +} + + +/* TODO: DOCUMENT ME */ +static VALUE +in_context(VALUE self, VALUE _str, VALUE _options) +{ + xmlNodePtr node, list = 0, tmp, child_iter, node_children, doc_children; + xmlNodeSetPtr set; + xmlParserErrors error; + VALUE doc, err; + int doc_is_empty; + + Data_Get_Struct(self, xmlNode, node); + + doc = DOC_RUBY_OBJECT(node->doc); + err = rb_iv_get(doc, "@errors"); + doc_is_empty = (node->doc->children == NULL) ? 1 : 0; + node_children = node->children; + doc_children = node->doc->children; + + xmlSetStructuredErrorFunc((void *)err, Nokogiri_error_array_pusher); + + /* Twiddle global variable because of a bug in libxml2. + * http://git.gnome.org/browse/libxml2/commit/?id=e20fb5a72c83cbfc8e4a8aa3943c6be8febadab7 + */ +#ifndef HTML_PARSE_NOIMPLIED + htmlHandleOmittedElem(0); +#endif + + /* This function adds a fake node to the child of +node+. If the parser + * does not exit cleanly with XML_ERR_OK, the list is freed. This can + * leave the child pointers in a bad state if they were originally empty. + * + * http://git.gnome.org/browse/libxml2/tree/parser.c#n13177 + * */ + error = xmlParseInNodeContext(node, StringValuePtr(_str), + (int)RSTRING_LEN(_str), + (int)NUM2INT(_options), &list); + + /* xmlParseInNodeContext should not mutate the original document or node, + * so reassigning these pointers should be OK. The reason we're reassigning + * is because if there were errors, it's possible for the child pointers + * to be manipulated. */ + if (error != XML_ERR_OK) { + node->doc->children = doc_children; + node->children = node_children; + } + + /* make sure parent/child pointers are coherent so an unlink will work + * properly (#331) + */ + child_iter = node->doc->children ; + while (child_iter) { + if (child_iter->parent != (xmlNodePtr)node->doc) { + child_iter->parent = (xmlNodePtr)node->doc; + } + child_iter = child_iter->next; + } + +#ifndef HTML_PARSE_NOIMPLIED + htmlHandleOmittedElem(1); +#endif + + xmlSetStructuredErrorFunc(NULL, NULL); + + /* Workaround for a libxml2 bug where a parsing error may leave a broken + * node reference in node->doc->children. + * This workaround is limited to when a parse error occurs, the document + * went from having no children to having children, and the context node is + * part of a document fragment. + * https://bugzilla.gnome.org/show_bug.cgi?id=668155 + */ + if (error != XML_ERR_OK && doc_is_empty && node->doc->children != NULL) { + child_iter = node; + while (child_iter->parent) { + child_iter = child_iter->parent; + } + + if (child_iter->type == XML_DOCUMENT_FRAG_NODE) { + node->doc->children = NULL; + } + } + + /* FIXME: This probably needs to handle more constants... */ + switch (error) { + case XML_ERR_INTERNAL_ERROR: + case XML_ERR_NO_MEMORY: + rb_raise(rb_eRuntimeError, "error parsing fragment (%d)", error); + break; + default: + break; + } + + set = xmlXPathNodeSetCreate(NULL); + + while (list) { + tmp = list->next; + list->next = NULL; + xmlXPathNodeSetAddUnique(set, list); + noko_xml_document_pin_node(list); + list = tmp; + } + + return noko_xml_node_set_wrap(set, doc); +} + + +VALUE +noko_xml_node_wrap(VALUE rb_class, xmlNodePtr c_node) +{ + VALUE rb_document, rb_node_cache, rb_node; + nokogiriTuplePtr node_has_a_document; + xmlDocPtr c_doc; + void (*mark_method)(xmlNodePtr) = NULL ; + + assert(c_node); + + if (c_node->type == XML_DOCUMENT_NODE || c_node->type == XML_HTML_DOCUMENT_NODE) { + return DOC_RUBY_OBJECT(c_node->doc); + } + + /* It's OK if the node doesn't have a fully-realized document (as in XML::Reader). */ + /* see https://github.com/sparklemotion/nokogiri/issues/95 */ + /* and https://github.com/sparklemotion/nokogiri/issues/439 */ + c_doc = c_node->doc; + if (c_doc->type == XML_DOCUMENT_FRAG_NODE) { c_doc = c_doc->doc; } + node_has_a_document = DOC_RUBY_OBJECT_TEST(c_doc); + + if (c_node->_private && node_has_a_document) { + return (VALUE)c_node->_private; + } + + if (!RTEST(rb_class)) { + switch (c_node->type) { + case XML_ELEMENT_NODE: + rb_class = cNokogiriXmlElement; + break; + case XML_TEXT_NODE: + rb_class = cNokogiriXmlText; + break; + case XML_ATTRIBUTE_NODE: + rb_class = cNokogiriXmlAttr; + break; + case XML_ENTITY_REF_NODE: + rb_class = cNokogiriXmlEntityReference; + break; + case XML_COMMENT_NODE: + rb_class = cNokogiriXmlComment; + break; + case XML_DOCUMENT_FRAG_NODE: + rb_class = cNokogiriXmlDocumentFragment; + break; + case XML_PI_NODE: + rb_class = cNokogiriXmlProcessingInstruction; + break; + case XML_ENTITY_DECL: + rb_class = cNokogiriXmlEntityDecl; + break; + case XML_CDATA_SECTION_NODE: + rb_class = cNokogiriXmlCData; + break; + case XML_DTD_NODE: + rb_class = cNokogiriXmlDtd; + break; + case XML_ATTRIBUTE_DECL: + rb_class = cNokogiriXmlAttributeDecl; + break; + case XML_ELEMENT_DECL: + rb_class = cNokogiriXmlElementDecl; + break; + default: + rb_class = cNokogiriXmlNode; + } + } + + mark_method = node_has_a_document ? mark : NULL ; + + rb_node = Data_Wrap_Struct(rb_class, mark_method, debug_node_dealloc, c_node) ; + c_node->_private = (void *)rb_node; + + if (node_has_a_document) { + rb_document = DOC_RUBY_OBJECT(c_doc); + rb_node_cache = DOC_NODE_CACHE(c_doc); + rb_ary_push(rb_node_cache, rb_node); + rb_funcall(rb_document, id_decorate, 1, rb_node); + } + + return rb_node ; +} + + +/* + * return Array<Nokogiri::XML::Attr> containing the node's attributes + */ +VALUE +noko_xml_node_attrs(xmlNodePtr c_node) +{ + VALUE rb_properties = rb_ary_new(); + xmlAttrPtr c_property; + + c_property = c_node->properties ; + while (c_property != NULL) { + rb_ary_push(rb_properties, noko_xml_node_wrap(Qnil, (xmlNodePtr)c_property)); + c_property = c_property->next ; + } + + return rb_properties; +} + +void +noko_init_xml_node() +{ + cNokogiriXmlNode = rb_define_class_under(mNokogiriXml, "Node", rb_cObject); + + rb_define_singleton_method(cNokogiriXmlNode, "new", rb_xml_node_new, -1); + + rb_define_method(cNokogiriXmlNode, "add_namespace_definition", add_namespace_definition, 2); + rb_define_method(cNokogiriXmlNode, "node_name", get_name, 0); + rb_define_method(cNokogiriXmlNode, "document", document, 0); + rb_define_method(cNokogiriXmlNode, "node_name=", set_name, 1); + rb_define_method(cNokogiriXmlNode, "parent", get_parent, 0); + rb_define_method(cNokogiriXmlNode, "child", child, 0); + rb_define_method(cNokogiriXmlNode, "first_element_child", first_element_child, 0); + rb_define_method(cNokogiriXmlNode, "last_element_child", last_element_child, 0); + rb_define_method(cNokogiriXmlNode, "children", children, 0); + rb_define_method(cNokogiriXmlNode, "element_children", element_children, 0); + rb_define_method(cNokogiriXmlNode, "next_sibling", next_sibling, 0); + rb_define_method(cNokogiriXmlNode, "previous_sibling", previous_sibling, 0); + rb_define_method(cNokogiriXmlNode, "next_element", next_element, 0); + rb_define_method(cNokogiriXmlNode, "previous_element", previous_element, 0); + rb_define_method(cNokogiriXmlNode, "node_type", node_type, 0); + rb_define_method(cNokogiriXmlNode, "path", path, 0); + rb_define_method(cNokogiriXmlNode, "key?", key_eh, 1); + rb_define_method(cNokogiriXmlNode, "namespaced_key?", namespaced_key_eh, 2); + rb_define_method(cNokogiriXmlNode, "blank?", blank_eh, 0); + rb_define_method(cNokogiriXmlNode, "attribute_nodes", attribute_nodes, 0); + rb_define_method(cNokogiriXmlNode, "attribute", attr, 1); + rb_define_method(cNokogiriXmlNode, "attribute_with_ns", attribute_with_ns, 2); + rb_define_method(cNokogiriXmlNode, "namespace", noko_xml_node_namespace, 0); + rb_define_method(cNokogiriXmlNode, "namespace_definitions", namespace_definitions, 0); + rb_define_method(cNokogiriXmlNode, "namespace_scopes", namespace_scopes, 0); + rb_define_method(cNokogiriXmlNode, "encode_special_chars", encode_special_chars, 1); + rb_define_method(cNokogiriXmlNode, "dup", duplicate_node, -1); + rb_define_method(cNokogiriXmlNode, "unlink", unlink_node, 0); + rb_define_method(cNokogiriXmlNode, "internal_subset", internal_subset, 0); + rb_define_method(cNokogiriXmlNode, "external_subset", external_subset, 0); + rb_define_method(cNokogiriXmlNode, "create_internal_subset", create_internal_subset, 3); + rb_define_method(cNokogiriXmlNode, "create_external_subset", create_external_subset, 3); + rb_define_method(cNokogiriXmlNode, "pointer_id", pointer_id, 0); + rb_define_method(cNokogiriXmlNode, "line", line, 0); + rb_define_method(cNokogiriXmlNode, "line=", set_line, 1); + rb_define_method(cNokogiriXmlNode, "content", get_native_content, 0); + rb_define_method(cNokogiriXmlNode, "native_content=", set_native_content, 1); + rb_define_method(cNokogiriXmlNode, "lang", get_lang, 0); + rb_define_method(cNokogiriXmlNode, "lang=", set_lang, 1); + + rb_define_private_method(cNokogiriXmlNode, "process_xincludes", process_xincludes, 1); + rb_define_private_method(cNokogiriXmlNode, "in_context", in_context, 2); + rb_define_private_method(cNokogiriXmlNode, "add_child_node", add_child, 1); + rb_define_private_method(cNokogiriXmlNode, "add_previous_sibling_node", add_previous_sibling, 1); + rb_define_private_method(cNokogiriXmlNode, "add_next_sibling_node", add_next_sibling, 1); + rb_define_private_method(cNokogiriXmlNode, "replace_node", replace, 1); + rb_define_private_method(cNokogiriXmlNode, "dump_html", dump_html, 0); + rb_define_private_method(cNokogiriXmlNode, "native_write_to", native_write_to, 4); + rb_define_private_method(cNokogiriXmlNode, "get", get, 1); + rb_define_private_method(cNokogiriXmlNode, "set", set, 2); + rb_define_private_method(cNokogiriXmlNode, "set_namespace", set_namespace, 1); + rb_define_private_method(cNokogiriXmlNode, "compare", compare, 1); + + id_decorate = rb_intern("decorate"); + id_decorate_bang = rb_intern("decorate!"); +} + +/* vim: set noet sw=4 sws=4 */ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_node_set.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_node_set.c new file mode 100644 index 000000000000..1c17c2affdec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_node_set.c @@ -0,0 +1,498 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlNodeSet ; + +static ID decorate ; + +static void +Check_Node_Set_Node_Type(VALUE node) +{ + if (!(rb_obj_is_kind_of(node, cNokogiriXmlNode) || + rb_obj_is_kind_of(node, cNokogiriXmlNamespace))) { + rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace"); + } +} + + +static +VALUE +ruby_object_get(xmlNodePtr c_node) +{ + /* see xmlElementType in libxml2 tree.h */ + switch (c_node->type) { + case XML_NAMESPACE_DECL: + /* _private is later in the namespace struct */ + return (VALUE)(((xmlNsPtr)c_node)->_private); + + case XML_DOCUMENT_NODE: + case XML_HTML_DOCUMENT_NODE: + /* in documents we use _private to store a tuple */ + if (DOC_RUBY_OBJECT_TEST(((xmlDocPtr)c_node))) { + return DOC_RUBY_OBJECT((xmlDocPtr)c_node); + } + return (VALUE)NULL; + + default: + return (VALUE)(c_node->_private); + } +} + + +static void +mark(xmlNodeSetPtr node_set) +{ + VALUE rb_node; + int jnode; + + for (jnode = 0; jnode < node_set->nodeNr; jnode++) { + rb_node = ruby_object_get(node_set->nodeTab[jnode]); + if (rb_node) { + rb_gc_mark(rb_node); + } + } +} + +static void +xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val) +{ + /* + * For reasons outlined in xml_namespace.c, here we reproduce xmlXPathNodeSetDel() except for the + * offending call to xmlXPathNodeSetFreeNs(). + */ + int i; + + if (cur == NULL) { return; } + if (val == NULL) { return; } + + /* + * find node in nodeTab + */ + for (i = 0; i < cur->nodeNr; i++) + if (cur->nodeTab[i] == val) { break; } + + if (i >= cur->nodeNr) { /* not found */ + return; + } + cur->nodeNr--; + for (; i < cur->nodeNr; i++) { + cur->nodeTab[i] = cur->nodeTab[i + 1]; + } + cur->nodeTab[cur->nodeNr] = NULL; +} + + +static void +deallocate(xmlNodeSetPtr node_set) +{ + /* + * For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the + * offending call to xmlXPathNodeSetFreeNs(). + */ + NOKOGIRI_DEBUG_START(node_set) ; + if (node_set->nodeTab != NULL) { + xmlFree(node_set->nodeTab); + } + + xmlFree(node_set); + NOKOGIRI_DEBUG_END(node_set) ; +} + + +static VALUE +allocate(VALUE klass) +{ + return noko_xml_node_set_wrap(xmlXPathNodeSetCreate(NULL), Qnil); +} + + +/* + * call-seq: + * dup + * + * Duplicate this NodeSet. Note that the Nodes contained in the NodeSet are not + * duplicated (similar to how Array and other Enumerable classes work). + */ +static VALUE +duplicate(VALUE self) +{ + xmlNodeSetPtr node_set; + xmlNodeSetPtr dupl; + + Data_Get_Struct(self, xmlNodeSet, node_set); + + dupl = xmlXPathNodeSetMerge(NULL, node_set); + + return noko_xml_node_set_wrap(dupl, rb_iv_get(self, "@document")); +} + +/* + * call-seq: + * length + * + * Get the length of the node set + */ +static VALUE +length(VALUE self) +{ + xmlNodeSetPtr node_set; + + Data_Get_Struct(self, xmlNodeSet, node_set); + + return node_set ? INT2NUM(node_set->nodeNr) : INT2NUM(0); +} + +/* + * call-seq: + * push(node) + * + * Append +node+ to the NodeSet. + */ +static VALUE +push(VALUE self, VALUE rb_node) +{ + xmlNodeSetPtr node_set; + xmlNodePtr node; + + Check_Node_Set_Node_Type(rb_node); + + Data_Get_Struct(self, xmlNodeSet, node_set); + Data_Get_Struct(rb_node, xmlNode, node); + + xmlXPathNodeSetAdd(node_set, node); + + return self; +} + +/* + * call-seq: + * delete(node) + * + * Delete +node+ from the Nodeset, if it is a member. Returns the deleted node + * if found, otherwise returns nil. + */ +static VALUE +delete (VALUE self, VALUE rb_node) +{ + xmlNodeSetPtr node_set; + xmlNodePtr node; + + Check_Node_Set_Node_Type(rb_node); + + Data_Get_Struct(self, xmlNodeSet, node_set); + Data_Get_Struct(rb_node, xmlNode, node); + + if (xmlXPathNodeSetContains(node_set, node)) { + xpath_node_set_del(node_set, node); + return rb_node; + } + return Qnil ; +} + + +/* + * call-seq: + * &(node_set) + * + * Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets. + */ +static VALUE +intersection(VALUE self, VALUE rb_other) +{ + xmlNodeSetPtr node_set, other ; + xmlNodeSetPtr intersection; + + if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) { + rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet"); + } + + Data_Get_Struct(self, xmlNodeSet, node_set); + Data_Get_Struct(rb_other, xmlNodeSet, other); + + intersection = xmlXPathIntersection(node_set, other); + return noko_xml_node_set_wrap(intersection, rb_iv_get(self, "@document")); +} + + +/* + * call-seq: + * include?(node) + * + * Returns true if any member of node set equals +node+. + */ +static VALUE +include_eh(VALUE self, VALUE rb_node) +{ + xmlNodeSetPtr node_set; + xmlNodePtr node; + + Check_Node_Set_Node_Type(rb_node); + + Data_Get_Struct(self, xmlNodeSet, node_set); + Data_Get_Struct(rb_node, xmlNode, node); + + return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse); +} + + +/* + * call-seq: + * |(node_set) + * + * Returns a new set built by merging the set and the elements of the given + * set. + */ +static VALUE +rb_xml_node_set_union(VALUE rb_node_set, VALUE rb_other) +{ + xmlNodeSetPtr c_node_set, c_other; + xmlNodeSetPtr c_new_node_set; + + if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) { + rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet"); + } + + Data_Get_Struct(rb_node_set, xmlNodeSet, c_node_set); + Data_Get_Struct(rb_other, xmlNodeSet, c_other); + + c_new_node_set = xmlXPathNodeSetMerge(NULL, c_node_set); + c_new_node_set = xmlXPathNodeSetMerge(c_new_node_set, c_other); + + return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(rb_node_set, "@document")); +} + +/* + * call-seq: + * -(node_set) + * + * Difference - returns a new NodeSet that is a copy of this NodeSet, removing + * each item that also appears in +node_set+ + */ +static VALUE +minus(VALUE self, VALUE rb_other) +{ + xmlNodeSetPtr node_set, other; + xmlNodeSetPtr new; + int j ; + + if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) { + rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet"); + } + + Data_Get_Struct(self, xmlNodeSet, node_set); + Data_Get_Struct(rb_other, xmlNodeSet, other); + + new = xmlXPathNodeSetMerge(NULL, node_set); + for (j = 0 ; j < other->nodeNr ; ++j) { + xpath_node_set_del(new, other->nodeTab[j]); + } + + return noko_xml_node_set_wrap(new, rb_iv_get(self, "@document")); +} + + +static VALUE +index_at(VALUE self, long offset) +{ + xmlNodeSetPtr node_set; + + Data_Get_Struct(self, xmlNodeSet, node_set); + + if (offset >= node_set->nodeNr || abs((int)offset) > node_set->nodeNr) { + return Qnil; + } + + if (offset < 0) { offset += node_set->nodeNr ; } + + return noko_xml_node_wrap_node_set_result(node_set->nodeTab[offset], self); +} + +static VALUE +subseq(VALUE self, long beg, long len) +{ + long j; + xmlNodeSetPtr node_set; + xmlNodeSetPtr new_set ; + + Data_Get_Struct(self, xmlNodeSet, node_set); + + if (beg > node_set->nodeNr) { return Qnil ; } + if (beg < 0 || len < 0) { return Qnil ; } + + if ((beg + len) > node_set->nodeNr) { + len = node_set->nodeNr - beg ; + } + + new_set = xmlXPathNodeSetCreate(NULL); + for (j = beg ; j < beg + len ; ++j) { + xmlXPathNodeSetAddUnique(new_set, node_set->nodeTab[j]); + } + return noko_xml_node_set_wrap(new_set, rb_iv_get(self, "@document")); +} + +/* + * call-seq: + * [index] -> Node or nil + * [start, length] -> NodeSet or nil + * [range] -> NodeSet or nil + * slice(index) -> Node or nil + * slice(start, length) -> NodeSet or nil + * slice(range) -> NodeSet or nil + * + * Element reference - returns the node at +index+, or returns a NodeSet + * containing nodes starting at +start+ and continuing for +length+ elements, or + * returns a NodeSet containing nodes specified by +range+. Negative +indices+ + * count backward from the end of the +node_set+ (-1 is the last node). Returns + * nil if the +index+ (or +start+) are out of range. + */ +static VALUE +slice(int argc, VALUE *argv, VALUE self) +{ + VALUE arg ; + long beg, len ; + xmlNodeSetPtr node_set; + + Data_Get_Struct(self, xmlNodeSet, node_set); + + if (argc == 2) { + beg = NUM2LONG(argv[0]); + len = NUM2LONG(argv[1]); + if (beg < 0) { + beg += node_set->nodeNr ; + } + return subseq(self, beg, len); + } + + if (argc != 1) { + rb_scan_args(argc, argv, "11", NULL, NULL); + } + arg = argv[0]; + + if (FIXNUM_P(arg)) { + return index_at(self, FIX2LONG(arg)); + } + + /* if arg is Range */ + switch (rb_range_beg_len(arg, &beg, &len, (long)node_set->nodeNr, 0)) { + case Qfalse: + break; + case Qnil: + return Qnil; + default: + return subseq(self, beg, len); + } + + return index_at(self, NUM2LONG(arg)); +} + + +/* + * call-seq: + * to_a + * + * Return this list as an Array + */ +static VALUE +to_array(VALUE self) +{ + xmlNodeSetPtr node_set ; + VALUE list; + int i; + + Data_Get_Struct(self, xmlNodeSet, node_set); + + list = rb_ary_new2(node_set->nodeNr); + for (i = 0; i < node_set->nodeNr; i++) { + VALUE elt = noko_xml_node_wrap_node_set_result(node_set->nodeTab[i], self); + rb_ary_push(list, elt); + } + + return list; +} + +/* + * call-seq: + * unlink + * + * Unlink this NodeSet and all Node objects it contains from their current context. + */ +static VALUE +unlink_nodeset(VALUE self) +{ + xmlNodeSetPtr node_set; + int j, nodeNr ; + + Data_Get_Struct(self, xmlNodeSet, node_set); + + nodeNr = node_set->nodeNr ; + for (j = 0 ; j < nodeNr ; j++) { + if (! NOKOGIRI_NAMESPACE_EH(node_set->nodeTab[j])) { + VALUE node ; + xmlNodePtr node_ptr; + node = noko_xml_node_wrap(Qnil, node_set->nodeTab[j]); + rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */ + Data_Get_Struct(node, xmlNode, node_ptr); + node_set->nodeTab[j] = node_ptr ; + } + } + return self ; +} + + +VALUE +noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document) +{ + int j; + VALUE rb_node_set ; + + if (c_node_set == NULL) { + c_node_set = xmlXPathNodeSetCreate(NULL); + } + + rb_node_set = Data_Wrap_Struct(cNokogiriXmlNodeSet, mark, deallocate, c_node_set); + + if (!NIL_P(document)) { + rb_iv_set(rb_node_set, "@document", document); + rb_funcall(document, decorate, 1, rb_node_set); + } + + /* make sure we create ruby objects for all the results, so they'll be marked during the GC mark phase */ + for (j = 0 ; j < c_node_set->nodeNr ; j++) { + noko_xml_node_wrap_node_set_result(c_node_set->nodeTab[j], rb_node_set); + } + + return rb_node_set ; +} + +VALUE +noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set) +{ + if (NOKOGIRI_NAMESPACE_EH(node)) { + return noko_xml_namespace_wrap_xpath_copy((xmlNsPtr)node); + } else { + return noko_xml_node_wrap(Qnil, node); + } +} + + +void +noko_init_xml_node_set(void) +{ + cNokogiriXmlNodeSet = rb_define_class_under(mNokogiriXml, "NodeSet", rb_cObject); + + rb_define_alloc_func(cNokogiriXmlNodeSet, allocate); + + rb_define_method(cNokogiriXmlNodeSet, "length", length, 0); + rb_define_method(cNokogiriXmlNodeSet, "[]", slice, -1); + rb_define_method(cNokogiriXmlNodeSet, "slice", slice, -1); + rb_define_method(cNokogiriXmlNodeSet, "push", push, 1); + rb_define_method(cNokogiriXmlNodeSet, "|", rb_xml_node_set_union, 1); + rb_define_method(cNokogiriXmlNodeSet, "-", minus, 1); + rb_define_method(cNokogiriXmlNodeSet, "unlink", unlink_nodeset, 0); + rb_define_method(cNokogiriXmlNodeSet, "to_a", to_array, 0); + rb_define_method(cNokogiriXmlNodeSet, "dup", duplicate, 0); + rb_define_method(cNokogiriXmlNodeSet, "delete", delete, 1); + rb_define_method(cNokogiriXmlNodeSet, "&", intersection, 1); + rb_define_method(cNokogiriXmlNodeSet, "include?", include_eh, 1); + + decorate = rb_intern("decorate"); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_processing_instruction.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_processing_instruction.c new file mode 100644 index 000000000000..65a34f9d6333 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_processing_instruction.c @@ -0,0 +1,54 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlProcessingInstruction; + +/* + * call-seq: + * new(document, name, content) + * + * Create a new ProcessingInstruction element on the +document+ with +name+ + * and +content+ + */ +static VALUE +new (int argc, VALUE *argv, VALUE klass) +{ + xmlDocPtr xml_doc; + xmlNodePtr node; + VALUE document; + VALUE name; + VALUE content; + VALUE rest; + VALUE rb_node; + + rb_scan_args(argc, argv, "3*", &document, &name, &content, &rest); + + Data_Get_Struct(document, xmlDoc, xml_doc); + + node = xmlNewDocPI( + xml_doc, + (const xmlChar *)StringValueCStr(name), + (const xmlChar *)StringValueCStr(content) + ); + + noko_xml_document_pin_node(node); + + rb_node = noko_xml_node_wrap(klass, node); + rb_obj_call_init(rb_node, argc, argv); + + if (rb_block_given_p()) { rb_yield(rb_node); } + + return rb_node; +} + +void +noko_init_xml_processing_instruction() +{ + assert(cNokogiriXmlNode); + /* + * ProcessingInstruction represents a ProcessingInstruction node in an xml + * document. + */ + cNokogiriXmlProcessingInstruction = rb_define_class_under(mNokogiriXml, "ProcessingInstruction", cNokogiriXmlNode); + + rb_define_singleton_method(cNokogiriXmlProcessingInstruction, "new", new, -1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_reader.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_reader.c new file mode 100644 index 000000000000..d2c6a7f369f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_reader.c @@ -0,0 +1,691 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlReader; + +static void +dealloc(xmlTextReaderPtr reader) +{ + NOKOGIRI_DEBUG_START(reader); + xmlFreeTextReader(reader); + NOKOGIRI_DEBUG_END(reader); +} + +static int +has_attributes(xmlTextReaderPtr reader) +{ + /* + * this implementation of xmlTextReaderHasAttributes explicitly includes + * namespaces and properties, because some earlier versions ignore + * namespaces. + */ + xmlNodePtr node ; + node = xmlTextReaderCurrentNode(reader); + if (node == NULL) { + return (0); + } + + if ((node->type == XML_ELEMENT_NODE) && + ((node->properties != NULL) || (node->nsDef != NULL))) { + return (1); + } + return (0); +} + +static void +Nokogiri_xml_node_namespaces(xmlNodePtr node, VALUE attr_hash) +{ + xmlNsPtr ns; + VALUE key; + + if (node->type != XML_ELEMENT_NODE) { return ; } + + ns = node->nsDef; + while (ns != NULL) { + + key = rb_enc_str_new_cstr(XMLNS_PREFIX, rb_utf8_encoding()); + if (ns->prefix) { + rb_str_cat_cstr(key, ":"); + rb_str_cat_cstr(key, (const char *)ns->prefix); + } + + key = rb_str_conv_enc(key, rb_utf8_encoding(), rb_default_internal_encoding()); + rb_hash_aset(attr_hash, + key, + (ns->href ? NOKOGIRI_STR_NEW2(ns->href) : Qnil) + ); + ns = ns->next ; + } +} + + +/* + * call-seq: + * default? + * + * Was an attribute generated from the default value in the DTD or schema? + */ +static VALUE +default_eh(VALUE self) +{ + xmlTextReaderPtr reader; + int eh; + + Data_Get_Struct(self, xmlTextReader, reader); + eh = xmlTextReaderIsDefault(reader); + if (eh == 0) { return Qfalse; } + if (eh == 1) { return Qtrue; } + + return Qnil; +} + +/* + * call-seq: + * value? + * + * Does this node have a text value? + */ +static VALUE +value_eh(VALUE self) +{ + xmlTextReaderPtr reader; + int eh; + + Data_Get_Struct(self, xmlTextReader, reader); + eh = xmlTextReaderHasValue(reader); + if (eh == 0) { return Qfalse; } + if (eh == 1) { return Qtrue; } + + return Qnil; +} + +/* + * call-seq: + * attributes? + * + * Does this node have attributes? + */ +static VALUE +attributes_eh(VALUE self) +{ + xmlTextReaderPtr reader; + int eh; + + Data_Get_Struct(self, xmlTextReader, reader); + eh = has_attributes(reader); + if (eh == 0) { return Qfalse; } + if (eh == 1) { return Qtrue; } + + return Qnil; +} + +/* + * call-seq: + * namespaces + * + * Get a hash of namespaces for this Node + */ +static VALUE +namespaces(VALUE self) +{ + xmlTextReaderPtr reader; + xmlNodePtr ptr; + VALUE attr ; + + Data_Get_Struct(self, xmlTextReader, reader); + + attr = rb_hash_new() ; + + if (! has_attributes(reader)) { + return attr ; + } + + ptr = xmlTextReaderExpand(reader); + if (ptr == NULL) { return Qnil; } + + Nokogiri_xml_node_namespaces(ptr, attr); + + return attr ; +} + +/* + * @overload attribute_nodes() + * Get the attributes of the current node as an Array of Attr + * @return [Array<Nokogiri::XML::Attr>] + */ +static VALUE +rb_xml_reader_attribute_nodes(VALUE rb_reader) +{ + xmlTextReaderPtr c_reader; + xmlNodePtr c_node; + VALUE attr_nodes; + int j; + + Data_Get_Struct(rb_reader, xmlTextReader, c_reader); + + if (! has_attributes(c_reader)) { + return rb_ary_new() ; + } + + c_node = xmlTextReaderExpand(c_reader); + if (c_node == NULL) { + return Qnil; + } + + attr_nodes = noko_xml_node_attrs(c_node); + + /* ensure that the Reader won't be GCed as long as a node is referenced */ + for (j = 0 ; j < RARRAY_LEN(attr_nodes) ; j++) { + rb_iv_set(rb_ary_entry(attr_nodes, j), "@reader", rb_reader); + } + + return attr_nodes; +} + +/* + * call-seq: + * attribute_at(index) + * + * Get the value of attribute at +index+ + */ +static VALUE +attribute_at(VALUE self, VALUE index) +{ + xmlTextReaderPtr reader; + xmlChar *value; + VALUE rb_value; + + Data_Get_Struct(self, xmlTextReader, reader); + + if (NIL_P(index)) { return Qnil; } + index = rb_Integer(index); + + value = xmlTextReaderGetAttributeNo( + reader, + (int)NUM2INT(index) + ); + if (value == NULL) { return Qnil; } + + rb_value = NOKOGIRI_STR_NEW2(value); + xmlFree(value); + return rb_value; +} + +/* + * call-seq: + * attribute(name) + * + * Get the value of attribute named +name+ + */ +static VALUE +reader_attribute(VALUE self, VALUE name) +{ + xmlTextReaderPtr reader; + xmlChar *value ; + VALUE rb_value; + + Data_Get_Struct(self, xmlTextReader, reader); + + if (NIL_P(name)) { return Qnil; } + name = StringValue(name) ; + + value = xmlTextReaderGetAttribute(reader, (xmlChar *)StringValueCStr(name)); + if (value == NULL) { return Qnil; } + + rb_value = NOKOGIRI_STR_NEW2(value); + xmlFree(value); + return rb_value; +} + +/* + * call-seq: + * attribute_count + * + * Get the number of attributes for the current node + */ +static VALUE +attribute_count(VALUE self) +{ + xmlTextReaderPtr reader; + int count; + + Data_Get_Struct(self, xmlTextReader, reader); + count = xmlTextReaderAttributeCount(reader); + if (count == -1) { return Qnil; } + + return INT2NUM((long)count); +} + +/* + * call-seq: + * depth + * + * Get the depth of the node + */ +static VALUE +depth(VALUE self) +{ + xmlTextReaderPtr reader; + int depth; + + Data_Get_Struct(self, xmlTextReader, reader); + depth = xmlTextReaderDepth(reader); + if (depth == -1) { return Qnil; } + + return INT2NUM((long)depth); +} + +/* + * call-seq: + * xml_version + * + * Get the XML version of the document being read + */ +static VALUE +xml_version(VALUE self) +{ + xmlTextReaderPtr reader; + const char *version; + + Data_Get_Struct(self, xmlTextReader, reader); + version = (const char *)xmlTextReaderConstXmlVersion(reader); + if (version == NULL) { return Qnil; } + + return NOKOGIRI_STR_NEW2(version); +} + +/* + * call-seq: + * lang + * + * Get the xml:lang scope within which the node resides. + */ +static VALUE +lang(VALUE self) +{ + xmlTextReaderPtr reader; + const char *lang; + + Data_Get_Struct(self, xmlTextReader, reader); + lang = (const char *)xmlTextReaderConstXmlLang(reader); + if (lang == NULL) { return Qnil; } + + return NOKOGIRI_STR_NEW2(lang); +} + +/* + * call-seq: + * value + * + * Get the text value of the node if present. Returns a utf-8 encoded string. + */ +static VALUE +value(VALUE self) +{ + xmlTextReaderPtr reader; + const char *value; + + Data_Get_Struct(self, xmlTextReader, reader); + value = (const char *)xmlTextReaderConstValue(reader); + if (value == NULL) { return Qnil; } + + return NOKOGIRI_STR_NEW2(value); +} + +/* + * call-seq: + * prefix + * + * Get the shorthand reference to the namespace associated with the node. + */ +static VALUE +prefix(VALUE self) +{ + xmlTextReaderPtr reader; + const char *prefix; + + Data_Get_Struct(self, xmlTextReader, reader); + prefix = (const char *)xmlTextReaderConstPrefix(reader); + if (prefix == NULL) { return Qnil; } + + return NOKOGIRI_STR_NEW2(prefix); +} + +/* + * call-seq: + * namespace_uri + * + * Get the URI defining the namespace associated with the node + */ +static VALUE +namespace_uri(VALUE self) +{ + xmlTextReaderPtr reader; + const char *uri; + + Data_Get_Struct(self, xmlTextReader, reader); + uri = (const char *)xmlTextReaderConstNamespaceUri(reader); + if (uri == NULL) { return Qnil; } + + return NOKOGIRI_STR_NEW2(uri); +} + +/* + * call-seq: + * local_name + * + * Get the local name of the node + */ +static VALUE +local_name(VALUE self) +{ + xmlTextReaderPtr reader; + const char *name; + + Data_Get_Struct(self, xmlTextReader, reader); + name = (const char *)xmlTextReaderConstLocalName(reader); + if (name == NULL) { return Qnil; } + + return NOKOGIRI_STR_NEW2(name); +} + +/* + * call-seq: + * name + * + * Get the name of the node. Returns a utf-8 encoded string. + */ +static VALUE +name(VALUE self) +{ + xmlTextReaderPtr reader; + const char *name; + + Data_Get_Struct(self, xmlTextReader, reader); + name = (const char *)xmlTextReaderConstName(reader); + if (name == NULL) { return Qnil; } + + return NOKOGIRI_STR_NEW2(name); +} + +/* + * call-seq: + * base_uri + * + * Get the xml:base of the node + */ +static VALUE +base_uri(VALUE self) +{ + xmlTextReaderPtr reader; + const char *base_uri; + + Data_Get_Struct(self, xmlTextReader, reader); + base_uri = (const char *)xmlTextReaderBaseUri(reader); + if (base_uri == NULL) { return Qnil; } + + return NOKOGIRI_STR_NEW2(base_uri); +} + +/* + * call-seq: + * state + * + * Get the state of the reader + */ +static VALUE +state(VALUE self) +{ + xmlTextReaderPtr reader; + Data_Get_Struct(self, xmlTextReader, reader); + return INT2NUM((long)xmlTextReaderReadState(reader)); +} + +/* + * call-seq: + * node_type + * + * Get the type of readers current node + */ +static VALUE +node_type(VALUE self) +{ + xmlTextReaderPtr reader; + Data_Get_Struct(self, xmlTextReader, reader); + return INT2NUM((long)xmlTextReaderNodeType(reader)); +} + +/* + * call-seq: + * read + * + * Move the Reader forward through the XML document. + */ +static VALUE +read_more(VALUE self) +{ + xmlTextReaderPtr reader; + xmlErrorPtr error; + VALUE error_list; + int ret; + + Data_Get_Struct(self, xmlTextReader, reader); + + error_list = rb_funcall(self, rb_intern("errors"), 0); + + xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher); + ret = xmlTextReaderRead(reader); + xmlSetStructuredErrorFunc(NULL, NULL); + + if (ret == 1) { return self; } + if (ret == 0) { return Qnil; } + + error = xmlGetLastError(); + if (error) { + rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error)); + } else { + rb_raise(rb_eRuntimeError, "Error pulling: %d", ret); + } + + return Qnil; +} + +/* + * call-seq: + * inner_xml + * + * Read the contents of the current node, including child nodes and markup. + * Returns a utf-8 encoded string. + */ +static VALUE +inner_xml(VALUE self) +{ + xmlTextReaderPtr reader; + xmlChar *value; + VALUE str; + + Data_Get_Struct(self, xmlTextReader, reader); + + value = xmlTextReaderReadInnerXml(reader); + + str = Qnil; + if (value) { + str = NOKOGIRI_STR_NEW2((char *)value); + xmlFree(value); + } + + return str; +} + +/* + * call-seq: + * outer_xml + * + * Read the current node and its contents, including child nodes and markup. + * Returns a utf-8 encoded string. + */ +static VALUE +outer_xml(VALUE self) +{ + xmlTextReaderPtr reader; + xmlChar *value; + VALUE str = Qnil; + + Data_Get_Struct(self, xmlTextReader, reader); + + value = xmlTextReaderReadOuterXml(reader); + + if (value) { + str = NOKOGIRI_STR_NEW2((char *)value); + xmlFree(value); + } + return str; +} + +/* + * call-seq: + * from_memory(string, url = nil, encoding = nil, options = 0) + * + * Create a new reader that parses +string+ + */ +static VALUE +from_memory(int argc, VALUE *argv, VALUE klass) +{ + VALUE rb_buffer, rb_url, encoding, rb_options; + xmlTextReaderPtr reader; + const char *c_url = NULL; + const char *c_encoding = NULL; + int c_options = 0; + VALUE rb_reader, args[3]; + + rb_scan_args(argc, argv, "13", &rb_buffer, &rb_url, &encoding, &rb_options); + + if (!RTEST(rb_buffer)) { rb_raise(rb_eArgError, "string cannot be nil"); } + if (RTEST(rb_url)) { c_url = StringValueCStr(rb_url); } + if (RTEST(encoding)) { c_encoding = StringValueCStr(encoding); } + if (RTEST(rb_options)) { c_options = (int)NUM2INT(rb_options); } + + reader = xmlReaderForMemory( + StringValuePtr(rb_buffer), + (int)RSTRING_LEN(rb_buffer), + c_url, + c_encoding, + c_options + ); + + if (reader == NULL) { + xmlFreeTextReader(reader); + rb_raise(rb_eRuntimeError, "couldn't create a parser"); + } + + rb_reader = Data_Wrap_Struct(klass, NULL, dealloc, reader); + args[0] = rb_buffer; + args[1] = rb_url; + args[2] = encoding; + rb_obj_call_init(rb_reader, 3, args); + + return rb_reader; +} + +/* + * call-seq: + * from_io(io, url = nil, encoding = nil, options = 0) + * + * Create a new reader that parses +io+ + */ +static VALUE +from_io(int argc, VALUE *argv, VALUE klass) +{ + VALUE rb_io, rb_url, encoding, rb_options; + xmlTextReaderPtr reader; + const char *c_url = NULL; + const char *c_encoding = NULL; + int c_options = 0; + VALUE rb_reader, args[3]; + + rb_scan_args(argc, argv, "13", &rb_io, &rb_url, &encoding, &rb_options); + + if (!RTEST(rb_io)) { rb_raise(rb_eArgError, "io cannot be nil"); } + if (RTEST(rb_url)) { c_url = StringValueCStr(rb_url); } + if (RTEST(encoding)) { c_encoding = StringValueCStr(encoding); } + if (RTEST(rb_options)) { c_options = (int)NUM2INT(rb_options); } + + reader = xmlReaderForIO( + (xmlInputReadCallback)noko_io_read, + (xmlInputCloseCallback)noko_io_close, + (void *)rb_io, + c_url, + c_encoding, + c_options + ); + + if (reader == NULL) { + xmlFreeTextReader(reader); + rb_raise(rb_eRuntimeError, "couldn't create a parser"); + } + + rb_reader = Data_Wrap_Struct(klass, NULL, dealloc, reader); + args[0] = rb_io; + args[1] = rb_url; + args[2] = encoding; + rb_obj_call_init(rb_reader, 3, args); + + return rb_reader; +} + +/* + * call-seq: + * reader.empty_element? # => true or false + * + * Returns true if the current node is empty, otherwise false. + */ +static VALUE +empty_element_p(VALUE self) +{ + xmlTextReaderPtr reader; + + Data_Get_Struct(self, xmlTextReader, reader); + + if (xmlTextReaderIsEmptyElement(reader)) { + return Qtrue; + } + + return Qfalse; +} + +void +noko_init_xml_reader() +{ + /* + * The Reader parser allows you to effectively pull parse an XML document. + * Once instantiated, call Nokogiri::XML::Reader#each to iterate over each + * node. Note that you may only iterate over the document once! + */ + cNokogiriXmlReader = rb_define_class_under(mNokogiriXml, "Reader", rb_cObject); + + rb_define_singleton_method(cNokogiriXmlReader, "from_memory", from_memory, -1); + rb_define_singleton_method(cNokogiriXmlReader, "from_io", from_io, -1); + + rb_define_method(cNokogiriXmlReader, "attribute", reader_attribute, 1); + rb_define_method(cNokogiriXmlReader, "attribute_at", attribute_at, 1); + rb_define_method(cNokogiriXmlReader, "attribute_count", attribute_count, 0); + rb_define_method(cNokogiriXmlReader, "attribute_nodes", rb_xml_reader_attribute_nodes, 0); + rb_define_method(cNokogiriXmlReader, "attributes?", attributes_eh, 0); + rb_define_method(cNokogiriXmlReader, "base_uri", base_uri, 0); + rb_define_method(cNokogiriXmlReader, "default?", default_eh, 0); + rb_define_method(cNokogiriXmlReader, "depth", depth, 0); + rb_define_method(cNokogiriXmlReader, "empty_element?", empty_element_p, 0); + rb_define_method(cNokogiriXmlReader, "inner_xml", inner_xml, 0); + rb_define_method(cNokogiriXmlReader, "lang", lang, 0); + rb_define_method(cNokogiriXmlReader, "local_name", local_name, 0); + rb_define_method(cNokogiriXmlReader, "name", name, 0); + rb_define_method(cNokogiriXmlReader, "namespace_uri", namespace_uri, 0); + rb_define_method(cNokogiriXmlReader, "namespaces", namespaces, 0); + rb_define_method(cNokogiriXmlReader, "node_type", node_type, 0); + rb_define_method(cNokogiriXmlReader, "outer_xml", outer_xml, 0); + rb_define_method(cNokogiriXmlReader, "prefix", prefix, 0); + rb_define_method(cNokogiriXmlReader, "read", read_more, 0); + rb_define_method(cNokogiriXmlReader, "state", state, 0); + rb_define_method(cNokogiriXmlReader, "value", value, 0); + rb_define_method(cNokogiriXmlReader, "value?", value_eh, 0); + rb_define_method(cNokogiriXmlReader, "xml_version", xml_version, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_relax_ng.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_relax_ng.c new file mode 100644 index 000000000000..e55f54e4e7c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_relax_ng.c @@ -0,0 +1,185 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlRelaxNG; + +static void +dealloc(xmlRelaxNGPtr schema) +{ + NOKOGIRI_DEBUG_START(schema); + xmlRelaxNGFree(schema); + NOKOGIRI_DEBUG_END(schema); +} + +/* + * call-seq: + * validate_document(document) + * + * Validate a Nokogiri::XML::Document against this RelaxNG schema. + */ +static VALUE +validate_document(VALUE self, VALUE document) +{ + xmlDocPtr doc; + xmlRelaxNGPtr schema; + VALUE errors; + xmlRelaxNGValidCtxtPtr valid_ctxt; + + Data_Get_Struct(self, xmlRelaxNG, schema); + Data_Get_Struct(document, xmlDoc, doc); + + errors = rb_ary_new(); + + valid_ctxt = xmlRelaxNGNewValidCtxt(schema); + + if (NULL == valid_ctxt) { + /* we have a problem */ + rb_raise(rb_eRuntimeError, "Could not create a validation context"); + } + +#ifdef HAVE_XMLRELAXNGSETVALIDSTRUCTUREDERRORS + xmlRelaxNGSetValidStructuredErrors( + valid_ctxt, + Nokogiri_error_array_pusher, + (void *)errors + ); +#endif + + xmlRelaxNGValidateDoc(valid_ctxt, doc); + + xmlRelaxNGFreeValidCtxt(valid_ctxt); + + return errors; +} + +/* + * call-seq: + * read_memory(string) + * + * Create a new RelaxNG from the contents of +string+ + */ +static VALUE +read_memory(int argc, VALUE *argv, VALUE klass) +{ + VALUE content; + VALUE parse_options; + xmlRelaxNGParserCtxtPtr ctx; + xmlRelaxNGPtr schema; + VALUE errors; + VALUE rb_schema; + int scanned_args = 0; + + scanned_args = rb_scan_args(argc, argv, "11", &content, &parse_options); + if (scanned_args == 1) { + parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA")); + } + + ctx = xmlRelaxNGNewMemParserCtxt((const char *)StringValuePtr(content), (int)RSTRING_LEN(content)); + + errors = rb_ary_new(); + xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher); + +#ifdef HAVE_XMLRELAXNGSETPARSERSTRUCTUREDERRORS + xmlRelaxNGSetParserStructuredErrors( + ctx, + Nokogiri_error_array_pusher, + (void *)errors + ); +#endif + + schema = xmlRelaxNGParse(ctx); + + xmlSetStructuredErrorFunc(NULL, NULL); + xmlRelaxNGFreeParserCtxt(ctx); + + if (NULL == schema) { + xmlErrorPtr error = xmlGetLastError(); + if (error) { + Nokogiri_error_raise(NULL, error); + } else { + rb_raise(rb_eRuntimeError, "Could not parse document"); + } + + return Qnil; + } + + rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema); + rb_iv_set(rb_schema, "@errors", errors); + rb_iv_set(rb_schema, "@parse_options", parse_options); + + return rb_schema; +} + +/* + * call-seq: + * from_document(doc) + * + * Create a new RelaxNG schema from the Nokogiri::XML::Document +doc+ + */ +static VALUE +from_document(int argc, VALUE *argv, VALUE klass) +{ + VALUE document; + VALUE parse_options; + xmlDocPtr doc; + xmlRelaxNGParserCtxtPtr ctx; + xmlRelaxNGPtr schema; + VALUE errors; + VALUE rb_schema; + int scanned_args = 0; + + scanned_args = rb_scan_args(argc, argv, "11", &document, &parse_options); + + Data_Get_Struct(document, xmlDoc, doc); + doc = doc->doc; /* In case someone passes us a node. ugh. */ + + if (scanned_args == 1) { + parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA")); + } + + ctx = xmlRelaxNGNewDocParserCtxt(doc); + + errors = rb_ary_new(); + xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher); + +#ifdef HAVE_XMLRELAXNGSETPARSERSTRUCTUREDERRORS + xmlRelaxNGSetParserStructuredErrors( + ctx, + Nokogiri_error_array_pusher, + (void *)errors + ); +#endif + + schema = xmlRelaxNGParse(ctx); + + xmlSetStructuredErrorFunc(NULL, NULL); + xmlRelaxNGFreeParserCtxt(ctx); + + if (NULL == schema) { + xmlErrorPtr error = xmlGetLastError(); + if (error) { + Nokogiri_error_raise(NULL, error); + } else { + rb_raise(rb_eRuntimeError, "Could not parse document"); + } + + return Qnil; + } + + rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema); + rb_iv_set(rb_schema, "@errors", errors); + rb_iv_set(rb_schema, "@parse_options", parse_options); + + return rb_schema; +} + +void +noko_init_xml_relax_ng() +{ + assert(cNokogiriXmlSchema); + cNokogiriXmlRelaxNG = rb_define_class_under(mNokogiriXml, "RelaxNG", cNokogiriXmlSchema); + + rb_define_singleton_method(cNokogiriXmlRelaxNG, "read_memory", read_memory, -1); + rb_define_singleton_method(cNokogiriXmlRelaxNG, "from_document", from_document, -1); + + rb_define_private_method(cNokogiriXmlRelaxNG, "validate_document", validate_document, 1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_sax_parser.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_sax_parser.c new file mode 100644 index 000000000000..1e4a293ff089 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_sax_parser.c @@ -0,0 +1,310 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlSaxParser ; + +static ID id_start_document, id_end_document, id_start_element, id_end_element; +static ID id_start_element_namespace, id_end_element_namespace; +static ID id_comment, id_characters, id_xmldecl, id_error, id_warning; +static ID id_cdata_block; +static ID id_processing_instruction; + +static void +start_document(void *ctx) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + + xmlParserCtxtPtr ctxt = NOKOGIRI_SAX_CTXT(ctx); + + if (NULL != ctxt && ctxt->html != 1) { + if (ctxt->standalone != -1) { /* -1 means there was no declaration */ + VALUE encoding = Qnil ; + VALUE standalone = Qnil; + VALUE version; + if (ctxt->encoding) { + encoding = NOKOGIRI_STR_NEW2(ctxt->encoding) ; + } else if (ctxt->input && ctxt->input->encoding) { + encoding = NOKOGIRI_STR_NEW2(ctxt->input->encoding) ; + } + + version = ctxt->version ? NOKOGIRI_STR_NEW2(ctxt->version) : Qnil; + + switch (ctxt->standalone) { + case 0: + standalone = NOKOGIRI_STR_NEW2("no"); + break; + case 1: + standalone = NOKOGIRI_STR_NEW2("yes"); + break; + } + + rb_funcall(doc, id_xmldecl, 3, version, encoding, standalone); + } + } + + rb_funcall(doc, id_start_document, 0); +} + +static void +end_document(void *ctx) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + rb_funcall(doc, id_end_document, 0); +} + +static void +start_element(void *ctx, const xmlChar *name, const xmlChar **atts) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + VALUE attributes = rb_ary_new(); + const xmlChar *attr; + int i = 0; + if (atts) { + while ((attr = atts[i]) != NULL) { + const xmlChar *val = atts[i + 1]; + VALUE value = val != NULL ? NOKOGIRI_STR_NEW2(val) : Qnil; + rb_ary_push(attributes, rb_ary_new3(2, NOKOGIRI_STR_NEW2(attr), value)); + i += 2; + } + } + + rb_funcall(doc, + id_start_element, + 2, + NOKOGIRI_STR_NEW2(name), + attributes + ); +} + +static void +end_element(void *ctx, const xmlChar *name) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + rb_funcall(doc, id_end_element, 1, NOKOGIRI_STR_NEW2(name)); +} + +static VALUE +attributes_as_array(int attributes_len, const xmlChar **c_attributes) +{ + VALUE rb_array = rb_ary_new2((long)attributes_len); + VALUE cNokogiriXmlSaxParserAttribute; + + cNokogiriXmlSaxParserAttribute = rb_const_get_at(cNokogiriXmlSaxParser, rb_intern("Attribute")); + if (c_attributes) { + /* Each attribute is an array of [localname, prefix, URI, value, end] */ + int i; + for (i = 0; i < attributes_len * 5; i += 5) { + VALUE rb_constructor_args[4], rb_attribute; + + rb_constructor_args[0] = RBSTR_OR_QNIL(c_attributes[i + 0]); /* localname */ + rb_constructor_args[1] = RBSTR_OR_QNIL(c_attributes[i + 1]); /* prefix */ + rb_constructor_args[2] = RBSTR_OR_QNIL(c_attributes[i + 2]); /* URI */ + + /* value */ + rb_constructor_args[3] = NOKOGIRI_STR_NEW((const char *)c_attributes[i + 3], + (c_attributes[i + 4] - c_attributes[i + 3])); + + rb_attribute = rb_class_new_instance(4, rb_constructor_args, cNokogiriXmlSaxParserAttribute); + rb_ary_push(rb_array, rb_attribute); + } + } + + return rb_array; +} + +static void +start_element_ns( + void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *uri, + int nb_namespaces, + const xmlChar **namespaces, + int nb_attributes, + int nb_defaulted, + const xmlChar **attributes) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + + VALUE attribute_ary = attributes_as_array(nb_attributes, attributes); + + VALUE ns_list = rb_ary_new2((long)nb_namespaces); + + if (namespaces) { + int i; + for (i = 0; i < nb_namespaces * 2; i += 2) { + rb_ary_push(ns_list, + rb_ary_new3((long)2, + RBSTR_OR_QNIL(namespaces[i + 0]), + RBSTR_OR_QNIL(namespaces[i + 1]) + ) + ); + } + } + + rb_funcall(doc, + id_start_element_namespace, + 5, + NOKOGIRI_STR_NEW2(localname), + attribute_ary, + RBSTR_OR_QNIL(prefix), + RBSTR_OR_QNIL(uri), + ns_list + ); +} + +/** + * end_element_ns was borrowed heavily from libxml-ruby. + */ +static void +end_element_ns( + void *ctx, + const xmlChar *localname, + const xmlChar *prefix, + const xmlChar *uri) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + + rb_funcall(doc, id_end_element_namespace, 3, + NOKOGIRI_STR_NEW2(localname), + RBSTR_OR_QNIL(prefix), + RBSTR_OR_QNIL(uri) + ); +} + +static void +characters_func(void *ctx, const xmlChar *ch, int len) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + VALUE str = NOKOGIRI_STR_NEW(ch, len); + rb_funcall(doc, id_characters, 1, str); +} + +static void +comment_func(void *ctx, const xmlChar *value) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + VALUE str = NOKOGIRI_STR_NEW2(value); + rb_funcall(doc, id_comment, 1, str); +} + +static void +warning_func(void *ctx, const char *msg, ...) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + char *message; + VALUE ruby_message; + + va_list args; + va_start(args, msg); + vasprintf(&message, msg, args); + va_end(args); + + ruby_message = NOKOGIRI_STR_NEW2(message); + free(message); + rb_funcall(doc, id_warning, 1, ruby_message); +} + +static void +error_func(void *ctx, const char *msg, ...) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + char *message; + VALUE ruby_message; + + va_list args; + va_start(args, msg); + vasprintf(&message, msg, args); + va_end(args); + + ruby_message = NOKOGIRI_STR_NEW2(message); + free(message); + rb_funcall(doc, id_error, 1, ruby_message); +} + +static void +cdata_block(void *ctx, const xmlChar *value, int len) +{ + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + VALUE string = NOKOGIRI_STR_NEW(value, len); + rb_funcall(doc, id_cdata_block, 1, string); +} + +static void +processing_instruction(void *ctx, const xmlChar *name, const xmlChar *content) +{ + VALUE rb_content; + VALUE self = NOKOGIRI_SAX_SELF(ctx); + VALUE doc = rb_iv_get(self, "@document"); + + rb_content = content ? NOKOGIRI_STR_NEW2(content) : Qnil; + + rb_funcall(doc, + id_processing_instruction, + 2, + NOKOGIRI_STR_NEW2(name), + rb_content + ); +} + +static void +deallocate(xmlSAXHandlerPtr handler) +{ + NOKOGIRI_DEBUG_START(handler); + free(handler); + NOKOGIRI_DEBUG_END(handler); +} + +static VALUE +allocate(VALUE klass) +{ + xmlSAXHandlerPtr handler = calloc((size_t)1, sizeof(xmlSAXHandler)); + + handler->startDocument = start_document; + handler->endDocument = end_document; + handler->startElement = start_element; + handler->endElement = end_element; + handler->startElementNs = start_element_ns; + handler->endElementNs = end_element_ns; + handler->characters = characters_func; + handler->comment = comment_func; + handler->warning = warning_func; + handler->error = error_func; + handler->cdataBlock = cdata_block; + handler->processingInstruction = processing_instruction; + handler->initialized = XML_SAX2_MAGIC; + + return Data_Wrap_Struct(klass, NULL, deallocate, handler); +} + +void +noko_init_xml_sax_parser() +{ + cNokogiriXmlSaxParser = rb_define_class_under(mNokogiriXmlSax, "Parser", rb_cObject); + + rb_define_alloc_func(cNokogiriXmlSaxParser, allocate); + + id_start_document = rb_intern("start_document"); + id_end_document = rb_intern("end_document"); + id_start_element = rb_intern("start_element"); + id_end_element = rb_intern("end_element"); + id_comment = rb_intern("comment"); + id_characters = rb_intern("characters"); + id_xmldecl = rb_intern("xmldecl"); + id_error = rb_intern("error"); + id_warning = rb_intern("warning"); + id_cdata_block = rb_intern("cdata_block"); + id_start_element_namespace = rb_intern("start_element_namespace"); + id_end_element_namespace = rb_intern("end_element_namespace"); + id_processing_instruction = rb_intern("processing_instruction"); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_sax_parser_context.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_sax_parser_context.c new file mode 100644 index 000000000000..35b4f320e937 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_sax_parser_context.c @@ -0,0 +1,279 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlSaxParserContext ; + +static void +deallocate(xmlParserCtxtPtr ctxt) +{ + NOKOGIRI_DEBUG_START(ctxt); + + ctxt->sax = NULL; + + xmlFreeParserCtxt(ctxt); + + NOKOGIRI_DEBUG_END(ctxt); +} + +/* + * call-seq: + * parse_io(io, encoding) + * + * Parse +io+ object with +encoding+ + */ +static VALUE +parse_io(VALUE klass, VALUE io, VALUE encoding) +{ + xmlParserCtxtPtr ctxt; + xmlCharEncoding enc = (xmlCharEncoding)NUM2INT(encoding); + + ctxt = xmlCreateIOParserCtxt(NULL, NULL, + (xmlInputReadCallback)noko_io_read, + (xmlInputCloseCallback)noko_io_close, + (void *)io, enc); + if (ctxt->sax) { + xmlFree(ctxt->sax); + ctxt->sax = NULL; + } + + return Data_Wrap_Struct(klass, NULL, deallocate, ctxt); +} + +/* + * call-seq: + * parse_file(filename) + * + * Parse file given +filename+ + */ +static VALUE +parse_file(VALUE klass, VALUE filename) +{ + xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(StringValueCStr(filename)); + return Data_Wrap_Struct(klass, NULL, deallocate, ctxt); +} + +/* + * call-seq: + * parse_memory(data) + * + * Parse the XML stored in memory in +data+ + */ +static VALUE +parse_memory(VALUE klass, VALUE data) +{ + xmlParserCtxtPtr ctxt; + + if (NIL_P(data)) { + rb_raise(rb_eArgError, "data cannot be nil"); + } + if (!(int)RSTRING_LEN(data)) { + rb_raise(rb_eRuntimeError, "data cannot be empty"); + } + + ctxt = xmlCreateMemoryParserCtxt(StringValuePtr(data), + (int)RSTRING_LEN(data)); + if (ctxt->sax) { + xmlFree(ctxt->sax); + ctxt->sax = NULL; + } + + return Data_Wrap_Struct(klass, NULL, deallocate, ctxt); +} + +static VALUE +parse_doc(VALUE ctxt_val) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr)ctxt_val; + xmlParseDocument(ctxt); + return Qnil; +} + +static VALUE +parse_doc_finalize(VALUE ctxt_val) +{ + xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr)ctxt_val; + + if (NULL != ctxt->myDoc) { + xmlFreeDoc(ctxt->myDoc); + } + + NOKOGIRI_SAX_TUPLE_DESTROY(ctxt->userData); + return Qnil; +} + +/* + * call-seq: + * parse_with(sax_handler) + * + * Use +sax_handler+ and parse the current document + */ +static VALUE +parse_with(VALUE self, VALUE sax_handler) +{ + xmlParserCtxtPtr ctxt; + xmlSAXHandlerPtr sax; + + if (!rb_obj_is_kind_of(sax_handler, cNokogiriXmlSaxParser)) { + rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::SAX::Parser"); + } + + Data_Get_Struct(self, xmlParserCtxt, ctxt); + Data_Get_Struct(sax_handler, xmlSAXHandler, sax); + + /* Free the sax handler since we'll assign our own */ + if (ctxt->sax && ctxt->sax != (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) { + xmlFree(ctxt->sax); + } + + ctxt->sax = sax; + ctxt->userData = (void *)NOKOGIRI_SAX_TUPLE_NEW(ctxt, sax_handler); + + xmlSetStructuredErrorFunc(NULL, NULL); + + rb_ensure(parse_doc, (VALUE)ctxt, parse_doc_finalize, (VALUE)ctxt); + + return Qnil; +} + +/* + * call-seq: + * replace_entities=(boolean) + * + * Should this parser replace entities? &amp; will get converted to '&' if + * set to true + */ +static VALUE +set_replace_entities(VALUE self, VALUE value) +{ + xmlParserCtxtPtr ctxt; + Data_Get_Struct(self, xmlParserCtxt, ctxt); + + if (Qfalse == value) { + ctxt->replaceEntities = 0; + } else { + ctxt->replaceEntities = 1; + } + + return value; +} + +/* + * call-seq: + * replace_entities + * + * Should this parser replace entities? &amp; will get converted to '&' if + * set to true + */ +static VALUE +get_replace_entities(VALUE self) +{ + xmlParserCtxtPtr ctxt; + Data_Get_Struct(self, xmlParserCtxt, ctxt); + + if (0 == ctxt->replaceEntities) { + return Qfalse; + } else { + return Qtrue; + } +} + +/* + * call-seq: line + * + * Get the current line the parser context is processing. + */ +static VALUE +line(VALUE self) +{ + xmlParserCtxtPtr ctxt; + xmlParserInputPtr io; + + Data_Get_Struct(self, xmlParserCtxt, ctxt); + + io = ctxt->input; + if (io) { + return INT2NUM(io->line); + } + + return Qnil; +} + +/* + * call-seq: column + * + * Get the current column the parser context is processing. + */ +static VALUE +column(VALUE self) +{ + xmlParserCtxtPtr ctxt; + xmlParserInputPtr io; + + Data_Get_Struct(self, xmlParserCtxt, ctxt); + + io = ctxt->input; + if (io) { + return INT2NUM(io->col); + } + + return Qnil; +} + +/* + * call-seq: + * recovery=(boolean) + * + * Should this parser recover from structural errors? It will not stop processing + * file on structural errors if set to true + */ +static VALUE +set_recovery(VALUE self, VALUE value) +{ + xmlParserCtxtPtr ctxt; + Data_Get_Struct(self, xmlParserCtxt, ctxt); + + if (value == Qfalse) { + ctxt->recovery = 0; + } else { + ctxt->recovery = 1; + } + + return value; +} + +/* + * call-seq: + * recovery + * + * Should this parser recover from structural errors? It will not stop processing + * file on structural errors if set to true + */ +static VALUE +get_recovery(VALUE self) +{ + xmlParserCtxtPtr ctxt; + Data_Get_Struct(self, xmlParserCtxt, ctxt); + + if (ctxt->recovery == 0) { + return Qfalse; + } else { + return Qtrue; + } +} + +void +noko_init_xml_sax_parser_context() +{ + cNokogiriXmlSaxParserContext = rb_define_class_under(mNokogiriXmlSax, "ParserContext", rb_cObject); + + rb_define_singleton_method(cNokogiriXmlSaxParserContext, "io", parse_io, 2); + rb_define_singleton_method(cNokogiriXmlSaxParserContext, "memory", parse_memory, 1); + rb_define_singleton_method(cNokogiriXmlSaxParserContext, "file", parse_file, 1); + + rb_define_method(cNokogiriXmlSaxParserContext, "parse_with", parse_with, 1); + rb_define_method(cNokogiriXmlSaxParserContext, "replace_entities=", set_replace_entities, 1); + rb_define_method(cNokogiriXmlSaxParserContext, "replace_entities", get_replace_entities, 0); + rb_define_method(cNokogiriXmlSaxParserContext, "recovery=", set_recovery, 1); + rb_define_method(cNokogiriXmlSaxParserContext, "recovery", get_recovery, 0); + rb_define_method(cNokogiriXmlSaxParserContext, "line", line, 0); + rb_define_method(cNokogiriXmlSaxParserContext, "column", column, 0); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_sax_push_parser.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_sax_push_parser.c new file mode 100644 index 000000000000..20426ca891d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_sax_push_parser.c @@ -0,0 +1,168 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlSaxPushParser ; + +static void +deallocate(xmlParserCtxtPtr ctx) +{ + NOKOGIRI_DEBUG_START(ctx); + if (ctx != NULL) { + NOKOGIRI_SAX_TUPLE_DESTROY(ctx->userData); + xmlFreeParserCtxt(ctx); + } + NOKOGIRI_DEBUG_END(ctx); +} + +static VALUE +allocate(VALUE klass) +{ + return Data_Wrap_Struct(klass, NULL, deallocate, NULL); +} + +/* + * call-seq: + * native_write(chunk, last_chunk) + * + * Write +chunk+ to PushParser. +last_chunk+ triggers the end_document handle + */ +static VALUE +native_write(VALUE self, VALUE _chunk, VALUE _last_chunk) +{ + xmlParserCtxtPtr ctx; + const char *chunk = NULL; + int size = 0; + + + Data_Get_Struct(self, xmlParserCtxt, ctx); + + if (Qnil != _chunk) { + chunk = StringValuePtr(_chunk); + size = (int)RSTRING_LEN(_chunk); + } + + xmlSetStructuredErrorFunc(NULL, NULL); + + if (xmlParseChunk(ctx, chunk, size, Qtrue == _last_chunk ? 1 : 0)) { + if (!(ctx->options & XML_PARSE_RECOVER)) { + xmlErrorPtr e = xmlCtxtGetLastError(ctx); + Nokogiri_error_raise(NULL, e); + } + } + + return self; +} + +/* + * call-seq: + * initialize_native(xml_sax, filename) + * + * Initialize the push parser with +xml_sax+ using +filename+ + */ +static VALUE +initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename) +{ + xmlSAXHandlerPtr sax; + const char *filename = NULL; + xmlParserCtxtPtr ctx; + + Data_Get_Struct(_xml_sax, xmlSAXHandler, sax); + + if (_filename != Qnil) { filename = StringValueCStr(_filename); } + + ctx = xmlCreatePushParserCtxt( + sax, + NULL, + NULL, + 0, + filename + ); + if (ctx == NULL) { + rb_raise(rb_eRuntimeError, "Could not create a parser context"); + } + + ctx->userData = NOKOGIRI_SAX_TUPLE_NEW(ctx, self); + + ctx->sax2 = 1; + DATA_PTR(self) = ctx; + return self; +} + +static VALUE +get_options(VALUE self) +{ + xmlParserCtxtPtr ctx; + Data_Get_Struct(self, xmlParserCtxt, ctx); + + return INT2NUM(ctx->options); +} + +static VALUE +set_options(VALUE self, VALUE options) +{ + xmlParserCtxtPtr ctx; + Data_Get_Struct(self, xmlParserCtxt, ctx); + + if (xmlCtxtUseOptions(ctx, (int)NUM2INT(options)) != 0) { + rb_raise(rb_eRuntimeError, "Cannot set XML parser context options"); + } + + return Qnil; +} + +/* + * call-seq: + * replace_entities + * + * Should this parser replace entities? &amp; will get converted to '&' if + * set to true + */ +static VALUE +get_replace_entities(VALUE self) +{ + xmlParserCtxtPtr ctx; + Data_Get_Struct(self, xmlParserCtxt, ctx); + + if (0 == ctx->replaceEntities) { + return Qfalse; + } else { + return Qtrue; + } +} + +/* + * call-seq: + * replace_entities=(boolean) + * + * Should this parser replace entities? &amp; will get converted to '&' if + * set to true + */ +static VALUE +set_replace_entities(VALUE self, VALUE value) +{ + xmlParserCtxtPtr ctx; + Data_Get_Struct(self, xmlParserCtxt, ctx); + + if (Qfalse == value) { + ctx->replaceEntities = 0; + } else { + ctx->replaceEntities = 1; + } + + return value; +} + +void +noko_init_xml_sax_push_parser() +{ + cNokogiriXmlSaxPushParser = rb_define_class_under(mNokogiriXmlSax, "PushParser", rb_cObject); + + rb_define_alloc_func(cNokogiriXmlSaxPushParser, allocate); + + rb_define_method(cNokogiriXmlSaxPushParser, "options", get_options, 0); + rb_define_method(cNokogiriXmlSaxPushParser, "options=", set_options, 1); + rb_define_method(cNokogiriXmlSaxPushParser, "replace_entities", get_replace_entities, 0); + rb_define_method(cNokogiriXmlSaxPushParser, "replace_entities=", set_replace_entities, 1); + + rb_define_private_method(cNokogiriXmlSaxPushParser, "initialize_native", initialize_native, 2); + rb_define_private_method(cNokogiriXmlSaxPushParser, "native_write", native_write, 2); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_schema.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_schema.c new file mode 100644 index 000000000000..f0e980c878cf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_schema.c @@ -0,0 +1,282 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlSchema; + +static void +dealloc(xmlSchemaPtr schema) +{ + NOKOGIRI_DEBUG_START(schema); + xmlSchemaFree(schema); + NOKOGIRI_DEBUG_END(schema); +} + +/* + * call-seq: + * validate_document(document) + * + * Validate a Nokogiri::XML::Document against this Schema. + */ +static VALUE +validate_document(VALUE self, VALUE document) +{ + xmlDocPtr doc; + xmlSchemaPtr schema; + xmlSchemaValidCtxtPtr valid_ctxt; + VALUE errors; + + Data_Get_Struct(self, xmlSchema, schema); + Data_Get_Struct(document, xmlDoc, doc); + + errors = rb_ary_new(); + + valid_ctxt = xmlSchemaNewValidCtxt(schema); + + if (NULL == valid_ctxt) { + /* we have a problem */ + rb_raise(rb_eRuntimeError, "Could not create a validation context"); + } + +#ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS + xmlSchemaSetValidStructuredErrors( + valid_ctxt, + Nokogiri_error_array_pusher, + (void *)errors + ); +#endif + + xmlSchemaValidateDoc(valid_ctxt, doc); + + xmlSchemaFreeValidCtxt(valid_ctxt); + + return errors; +} + +/* + * call-seq: + * validate_file(filename) + * + * Validate a file against this Schema. + */ +static VALUE +validate_file(VALUE self, VALUE rb_filename) +{ + xmlSchemaPtr schema; + xmlSchemaValidCtxtPtr valid_ctxt; + const char *filename ; + VALUE errors; + + Data_Get_Struct(self, xmlSchema, schema); + filename = (const char *)StringValueCStr(rb_filename) ; + + errors = rb_ary_new(); + + valid_ctxt = xmlSchemaNewValidCtxt(schema); + + if (NULL == valid_ctxt) { + /* we have a problem */ + rb_raise(rb_eRuntimeError, "Could not create a validation context"); + } + +#ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS + xmlSchemaSetValidStructuredErrors( + valid_ctxt, + Nokogiri_error_array_pusher, + (void *)errors + ); +#endif + + xmlSchemaValidateFile(valid_ctxt, filename, 0); + + xmlSchemaFreeValidCtxt(valid_ctxt); + + return errors; +} + +/* + * call-seq: + * read_memory(string) + * + * Create a new Schema from the contents of +string+ + */ +static VALUE +read_memory(int argc, VALUE *argv, VALUE klass) +{ + VALUE content; + VALUE parse_options; + int parse_options_int; + xmlSchemaParserCtxtPtr ctx; + xmlSchemaPtr schema; + VALUE errors; + VALUE rb_schema; + int scanned_args = 0; + xmlExternalEntityLoader old_loader = 0; + + scanned_args = rb_scan_args(argc, argv, "11", &content, &parse_options); + if (scanned_args == 1) { + parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA")); + } + parse_options_int = (int)NUM2INT(rb_funcall(parse_options, rb_intern("to_i"), 0)); + + ctx = xmlSchemaNewMemParserCtxt((const char *)StringValuePtr(content), (int)RSTRING_LEN(content)); + + errors = rb_ary_new(); + xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher); + +#ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS + xmlSchemaSetParserStructuredErrors( + ctx, + Nokogiri_error_array_pusher, + (void *)errors + ); +#endif + + if (parse_options_int & XML_PARSE_NONET) { + old_loader = xmlGetExternalEntityLoader(); + xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader); + } + + schema = xmlSchemaParse(ctx); + + if (old_loader) { + xmlSetExternalEntityLoader(old_loader); + } + + xmlSetStructuredErrorFunc(NULL, NULL); + xmlSchemaFreeParserCtxt(ctx); + + if (NULL == schema) { + xmlErrorPtr error = xmlGetLastError(); + if (error) { + Nokogiri_error_raise(NULL, error); + } else { + rb_raise(rb_eRuntimeError, "Could not parse document"); + } + + return Qnil; + } + + rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema); + rb_iv_set(rb_schema, "@errors", errors); + rb_iv_set(rb_schema, "@parse_options", parse_options); + + return rb_schema; +} + +/* Schema creation will remove and deallocate "blank" nodes. + * If those blank nodes have been exposed to Ruby, they could get freed + * out from under the VALUE pointer. This function checks to see if any of + * those nodes have been exposed to Ruby, and if so we should raise an exception. + */ +static int +has_blank_nodes_p(VALUE cache) +{ + long i; + + if (NIL_P(cache)) { + return 0; + } + + for (i = 0; i < RARRAY_LEN(cache); i++) { + xmlNodePtr node; + VALUE element = rb_ary_entry(cache, i); + Data_Get_Struct(element, xmlNode, node); + if (xmlIsBlankNode(node)) { + return 1; + } + } + + return 0; +} + +/* + * call-seq: + * from_document(doc) + * + * Create a new Schema from the Nokogiri::XML::Document +doc+ + */ +static VALUE +from_document(int argc, VALUE *argv, VALUE klass) +{ + VALUE document; + VALUE parse_options; + int parse_options_int; + xmlDocPtr doc; + xmlSchemaParserCtxtPtr ctx; + xmlSchemaPtr schema; + VALUE errors; + VALUE rb_schema; + int scanned_args = 0; + xmlExternalEntityLoader old_loader = 0; + + scanned_args = rb_scan_args(argc, argv, "11", &document, &parse_options); + + Data_Get_Struct(document, xmlDoc, doc); + doc = doc->doc; /* In case someone passes us a node. ugh. */ + + if (scanned_args == 1) { + parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA")); + } + parse_options_int = (int)NUM2INT(rb_funcall(parse_options, rb_intern("to_i"), 0)); + + if (has_blank_nodes_p(DOC_NODE_CACHE(doc))) { + rb_raise(rb_eArgError, "Creating a schema from a document that has blank nodes exposed to Ruby is dangerous"); + } + + ctx = xmlSchemaNewDocParserCtxt(doc); + + errors = rb_ary_new(); + xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher); + +#ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS + xmlSchemaSetParserStructuredErrors( + ctx, + Nokogiri_error_array_pusher, + (void *)errors + ); +#endif + + if (parse_options_int & XML_PARSE_NONET) { + old_loader = xmlGetExternalEntityLoader(); + xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader); + } + + schema = xmlSchemaParse(ctx); + + if (old_loader) { + xmlSetExternalEntityLoader(old_loader); + } + + xmlSetStructuredErrorFunc(NULL, NULL); + xmlSchemaFreeParserCtxt(ctx); + + if (NULL == schema) { + xmlErrorPtr error = xmlGetLastError(); + if (error) { + Nokogiri_error_raise(NULL, error); + } else { + rb_raise(rb_eRuntimeError, "Could not parse document"); + } + + return Qnil; + } + + rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema); + rb_iv_set(rb_schema, "@errors", errors); + rb_iv_set(rb_schema, "@parse_options", parse_options); + + return rb_schema; + + return Qnil; +} + +void +noko_init_xml_schema() +{ + cNokogiriXmlSchema = rb_define_class_under(mNokogiriXml, "Schema", rb_cObject); + + rb_define_singleton_method(cNokogiriXmlSchema, "read_memory", read_memory, -1); + rb_define_singleton_method(cNokogiriXmlSchema, "from_document", from_document, -1); + + rb_define_private_method(cNokogiriXmlSchema, "validate_document", validate_document, 1); + rb_define_private_method(cNokogiriXmlSchema, "validate_file", validate_file, 1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_syntax_error.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_syntax_error.c new file mode 100644 index 000000000000..e7d3dd8acb05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_syntax_error.c @@ -0,0 +1,85 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlSyntaxError; + +void +Nokogiri_structured_error_func_save(libxmlStructuredErrorHandlerState *handler_state) +{ + /* this method is tightly coupled to the implementation of xmlSetStructuredErrorFunc */ + handler_state->user_data = xmlStructuredErrorContext; + handler_state->handler = xmlStructuredError; +} + +void +Nokogiri_structured_error_func_save_and_set(libxmlStructuredErrorHandlerState *handler_state, + void *user_data, + xmlStructuredErrorFunc handler) +{ + Nokogiri_structured_error_func_save(handler_state); + xmlSetStructuredErrorFunc(user_data, handler); +} + +void +Nokogiri_structured_error_func_restore(libxmlStructuredErrorHandlerState *handler_state) +{ + xmlSetStructuredErrorFunc(handler_state->user_data, handler_state->handler); +} + +void +Nokogiri_error_array_pusher(void *ctx, xmlErrorPtr error) +{ + VALUE list = (VALUE)ctx; + Check_Type(list, T_ARRAY); + rb_ary_push(list, Nokogiri_wrap_xml_syntax_error(error)); +} + +void +Nokogiri_error_raise(void *ctx, xmlErrorPtr error) +{ + rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error)); +} + +VALUE +Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error) +{ + VALUE msg, e, klass; + + klass = cNokogiriXmlSyntaxError; + + if (error && error->domain == XML_FROM_XPATH) { + klass = cNokogiriXmlXpathSyntaxError; + } + + msg = (error && error->message) ? NOKOGIRI_STR_NEW2(error->message) : Qnil; + + e = rb_class_new_instance( + 1, + &msg, + klass + ); + + if (error) { + rb_iv_set(e, "@domain", INT2NUM(error->domain)); + rb_iv_set(e, "@code", INT2NUM(error->code)); + rb_iv_set(e, "@level", INT2NUM((short)error->level)); + rb_iv_set(e, "@file", RBSTR_OR_QNIL(error->file)); + rb_iv_set(e, "@line", INT2NUM(error->line)); + rb_iv_set(e, "@str1", RBSTR_OR_QNIL(error->str1)); + rb_iv_set(e, "@str2", RBSTR_OR_QNIL(error->str2)); + rb_iv_set(e, "@str3", RBSTR_OR_QNIL(error->str3)); + rb_iv_set(e, "@int1", INT2NUM(error->int1)); + rb_iv_set(e, "@column", INT2NUM(error->int2)); + } + + return e; +} + +void +noko_init_xml_syntax_error() +{ + assert(cNokogiriSyntaxError); + /* + * The XML::SyntaxError is raised on parse errors + */ + cNokogiriXmlSyntaxError = rb_define_class_under(mNokogiriXml, "SyntaxError", cNokogiriSyntaxError); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_text.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_text.c new file mode 100644 index 000000000000..eb78e2373c3d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_text.c @@ -0,0 +1,48 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlText ; + +/* + * call-seq: + * new(content, document) + * + * Create a new Text element on the +document+ with +content+ + */ +static VALUE +new (int argc, VALUE *argv, VALUE klass) +{ + xmlDocPtr doc; + xmlNodePtr node; + VALUE string; + VALUE document; + VALUE rest; + VALUE rb_node; + + rb_scan_args(argc, argv, "2*", &string, &document, &rest); + + Data_Get_Struct(document, xmlDoc, doc); + + node = xmlNewText((xmlChar *)StringValueCStr(string)); + node->doc = doc->doc; + + noko_xml_document_pin_node(node); + + rb_node = noko_xml_node_wrap(klass, node) ; + rb_obj_call_init(rb_node, argc, argv); + + if (rb_block_given_p()) { rb_yield(rb_node); } + + return rb_node; +} + +void +noko_init_xml_text() +{ + assert(cNokogiriXmlCharacterData); + /* + * Wraps Text nodes. + */ + cNokogiriXmlText = rb_define_class_under(mNokogiriXml, "Text", cNokogiriXmlCharacterData); + + rb_define_singleton_method(cNokogiriXmlText, "new", new, -1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_xpath_context.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_xpath_context.c new file mode 100644 index 000000000000..805b1dd5070d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xml_xpath_context.c @@ -0,0 +1,381 @@ +#include <nokogiri.h> + +VALUE cNokogiriXmlXpathContext; + +/* + * these constants have matching declarations in + * ext/java/nokogiri/internals/NokogiriNamespaceContext.java + */ +static const xmlChar *NOKOGIRI_BUILTIN_PREFIX = (const xmlChar *)"nokogiri-builtin"; +static const xmlChar *NOKOGIRI_BUILTIN_URI = (const xmlChar *)"https://www.nokogiri.org/default_ns/ruby/builtins"; + +static void +deallocate(xmlXPathContextPtr ctx) +{ + NOKOGIRI_DEBUG_START(ctx); + xmlXPathFreeContext(ctx); + NOKOGIRI_DEBUG_END(ctx); +} + +/* find a CSS class in an HTML element's `class` attribute */ +static const xmlChar * +builtin_css_class(const xmlChar *str, const xmlChar *val) +{ + int val_len; + + if (str == NULL) { return (NULL); } + if (val == NULL) { return (NULL); } + + val_len = xmlStrlen(val); + if (val_len == 0) { return (str); } + + while (*str != 0) { + if ((*str == *val) && !xmlStrncmp(str, val, val_len)) { + const xmlChar *next_byte = str + val_len; + + /* only match if the next byte is whitespace or end of string */ + if ((*next_byte == 0) || (IS_BLANK_CH(*next_byte))) { + return ((const xmlChar *)str); + } + } + + /* advance str to whitespace */ + while ((*str != 0) && !IS_BLANK_CH(*str)) { + str++; + } + + /* advance str to start of next word or end of string */ + while ((*str != 0) && IS_BLANK_CH(*str)) { + str++; + } + } + + return (NULL); +} + +/* xmlXPathFunction to wrap builtin_css_class() */ +static void +xpath_builtin_css_class(xmlXPathParserContextPtr ctxt, int nargs) +{ + xmlXPathObjectPtr hay, needle; + + CHECK_ARITY(2); + + CAST_TO_STRING; + needle = valuePop(ctxt); + if ((needle == NULL) || (needle->type != XPATH_STRING)) { + xmlXPathFreeObject(needle); + XP_ERROR(XPATH_INVALID_TYPE); + } + + CAST_TO_STRING; + hay = valuePop(ctxt); + if ((hay == NULL) || (hay->type != XPATH_STRING)) { + xmlXPathFreeObject(hay); + xmlXPathFreeObject(needle); + XP_ERROR(XPATH_INVALID_TYPE); + } + + if (builtin_css_class(hay->stringval, needle->stringval)) { + valuePush(ctxt, xmlXPathNewBoolean(1)); + } else { + valuePush(ctxt, xmlXPathNewBoolean(0)); + } + + xmlXPathFreeObject(hay); + xmlXPathFreeObject(needle); +} + +/* + * call-seq: + * register_ns(prefix, uri) + * + * Register the namespace with +prefix+ and +uri+. + */ +static VALUE +register_ns(VALUE self, VALUE prefix, VALUE uri) +{ + xmlXPathContextPtr ctx; + Data_Get_Struct(self, xmlXPathContext, ctx); + + xmlXPathRegisterNs(ctx, + (const xmlChar *)StringValueCStr(prefix), + (const xmlChar *)StringValueCStr(uri) + ); + return self; +} + +/* + * call-seq: + * register_variable(name, value) + * + * Register the variable +name+ with +value+. + */ +static VALUE +register_variable(VALUE self, VALUE name, VALUE value) +{ + xmlXPathContextPtr ctx; + xmlXPathObjectPtr xmlValue; + Data_Get_Struct(self, xmlXPathContext, ctx); + + xmlValue = xmlXPathNewCString(StringValueCStr(value)); + + xmlXPathRegisterVariable(ctx, + (const xmlChar *)StringValueCStr(name), + xmlValue + ); + + return self; +} + +void +Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr ctx, int nargs, VALUE handler, + const char *function_name) +{ + int i; + VALUE result, doc; + VALUE *argv; + VALUE node_set = Qnil; + xmlNodeSetPtr xml_node_set = NULL; + xmlXPathObjectPtr obj; + + assert(ctx->context->doc); + assert(DOC_RUBY_OBJECT_TEST(ctx->context->doc)); + + argv = (VALUE *)calloc((size_t)nargs, sizeof(VALUE)); + for (i = 0 ; i < nargs ; ++i) { + rb_gc_register_address(&argv[i]); + } + + doc = DOC_RUBY_OBJECT(ctx->context->doc); + + if (nargs > 0) { + i = nargs - 1; + do { + obj = valuePop(ctx); + switch (obj->type) { + case XPATH_STRING: + argv[i] = NOKOGIRI_STR_NEW2(obj->stringval); + break; + case XPATH_BOOLEAN: + argv[i] = obj->boolval == 1 ? Qtrue : Qfalse; + break; + case XPATH_NUMBER: + argv[i] = rb_float_new(obj->floatval); + break; + case XPATH_NODESET: + argv[i] = noko_xml_node_set_wrap(obj->nodesetval, doc); + break; + default: + argv[i] = NOKOGIRI_STR_NEW2(xmlXPathCastToString(obj)); + } + xmlXPathFreeNodeSetList(obj); + } while (i-- > 0); + } + + result = rb_funcall2(handler, rb_intern((const char *)function_name), nargs, argv); + + for (i = 0 ; i < nargs ; ++i) { + rb_gc_unregister_address(&argv[i]); + } + free(argv); + + switch (TYPE(result)) { + case T_FLOAT: + case T_BIGNUM: + case T_FIXNUM: + xmlXPathReturnNumber(ctx, NUM2DBL(result)); + break; + case T_STRING: + xmlXPathReturnString( + ctx, + xmlCharStrdup(StringValueCStr(result)) + ); + break; + case T_TRUE: + xmlXPathReturnTrue(ctx); + break; + case T_FALSE: + xmlXPathReturnFalse(ctx); + break; + case T_NIL: + break; + case T_ARRAY: { + VALUE args[2]; + args[0] = doc; + args[1] = result; + node_set = rb_class_new_instance(2, args, cNokogiriXmlNodeSet); + Data_Get_Struct(node_set, xmlNodeSet, xml_node_set); + xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set)); + } + break; + case T_DATA: + if (rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) { + Data_Get_Struct(result, xmlNodeSet, xml_node_set); + /* Copy the node set, otherwise it will get GC'd. */ + xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set)); + break; + } + default: + rb_raise(rb_eRuntimeError, "Invalid return type"); + } +} + +static void +ruby_funcall(xmlXPathParserContextPtr ctx, int nargs) +{ + VALUE handler = Qnil; + const char *function = NULL ; + + assert(ctx); + assert(ctx->context); + assert(ctx->context->userData); + assert(ctx->context->function); + + handler = (VALUE)(ctx->context->userData); + function = (const char *)(ctx->context->function); + + Nokogiri_marshal_xpath_funcall_and_return_values(ctx, nargs, handler, function); +} + +static xmlXPathFunction +lookup(void *ctx, + const xmlChar *name, + const xmlChar *ns_uri) +{ + VALUE xpath_handler = (VALUE)ctx; + if (rb_respond_to(xpath_handler, rb_intern((const char *)name))) { + return ruby_funcall; + } + + return NULL; +} + +NORETURN(static void xpath_generic_exception_handler(void *ctx, const char *msg, ...)); +static void +xpath_generic_exception_handler(void *ctx, const char *msg, ...) +{ + char *message; + + va_list args; + va_start(args, msg); + vasprintf(&message, msg, args); + va_end(args); + + rb_raise(rb_eRuntimeError, "%s", message); +} + +/* + * call-seq: + * evaluate(search_path, handler = nil) + * + * Evaluate the +search_path+ returning an XML::XPath object. + */ +static VALUE +evaluate(int argc, VALUE *argv, VALUE self) +{ + VALUE search_path, xpath_handler; + VALUE thing = Qnil; + xmlXPathContextPtr ctx; + xmlXPathObjectPtr xpath; + xmlChar *query; + + Data_Get_Struct(self, xmlXPathContext, ctx); + + if (rb_scan_args(argc, argv, "11", &search_path, &xpath_handler) == 1) { + xpath_handler = Qnil; + } + + query = (xmlChar *)StringValueCStr(search_path); + + if (Qnil != xpath_handler) { + /* FIXME: not sure if this is the correct place to shove private data. */ + ctx->userData = (void *)xpath_handler; + xmlXPathRegisterFuncLookup(ctx, lookup, (void *)xpath_handler); + } + + xmlResetLastError(); + xmlSetStructuredErrorFunc(NULL, Nokogiri_error_raise); + + /* For some reason, xmlXPathEvalExpression will blow up with a generic error */ + /* when there is a non existent function. */ + xmlSetGenericErrorFunc(NULL, xpath_generic_exception_handler); + + xpath = xmlXPathEvalExpression(query, ctx); + xmlSetStructuredErrorFunc(NULL, NULL); + xmlSetGenericErrorFunc(NULL, NULL); + + if (xpath == NULL) { + xmlErrorPtr error = xmlGetLastError(); + rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error)); + } + + assert(ctx->doc); + assert(DOC_RUBY_OBJECT_TEST(ctx->doc)); + + switch (xpath->type) { + case XPATH_STRING: + thing = NOKOGIRI_STR_NEW2(xpath->stringval); + xmlFree(xpath->stringval); + break; + case XPATH_NODESET: + thing = noko_xml_node_set_wrap(xpath->nodesetval, + DOC_RUBY_OBJECT(ctx->doc)); + break; + case XPATH_NUMBER: + thing = rb_float_new(xpath->floatval); + break; + case XPATH_BOOLEAN: + thing = xpath->boolval == 1 ? Qtrue : Qfalse; + break; + default: + thing = noko_xml_node_set_wrap(NULL, DOC_RUBY_OBJECT(ctx->doc)); + } + + xmlXPathFreeNodeSetList(xpath); + + return thing; +} + +/* + * call-seq: + * new(node) + * + * Create a new XPathContext with +node+ as the reference point. + */ +static VALUE +new (VALUE klass, VALUE nodeobj) +{ + xmlNodePtr node; + xmlXPathContextPtr ctx; + VALUE self; + + Data_Get_Struct(nodeobj, xmlNode, node); + + xmlXPathInit(); + + ctx = xmlXPathNewContext(node->doc); + ctx->node = node; + + xmlXPathRegisterNs(ctx, NOKOGIRI_BUILTIN_PREFIX, NOKOGIRI_BUILTIN_URI); + xmlXPathRegisterFuncNS(ctx, (const xmlChar *)"css-class", NOKOGIRI_BUILTIN_URI, + xpath_builtin_css_class); + + self = Data_Wrap_Struct(klass, 0, deallocate, ctx); + return self; +} + +void +noko_init_xml_xpath_context(void) +{ + /* + * XPathContext is the entry point for searching a Document by using XPath. + */ + cNokogiriXmlXpathContext = rb_define_class_under(mNokogiriXml, "XPathContext", rb_cObject); + + rb_define_singleton_method(cNokogiriXmlXpathContext, "new", new, 1); + + rb_define_method(cNokogiriXmlXpathContext, "evaluate", evaluate, -1); + rb_define_method(cNokogiriXmlXpathContext, "register_variable", register_variable, 2); + rb_define_method(cNokogiriXmlXpathContext, "register_ns", register_ns, 2); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xslt_stylesheet.c b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xslt_stylesheet.c new file mode 100644 index 000000000000..146550f97b6d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/ext/nokogiri/xslt_stylesheet.c @@ -0,0 +1,263 @@ +#include <nokogiri.h> + +VALUE cNokogiriXsltStylesheet ; + +static void +mark(nokogiriXsltStylesheetTuple *wrapper) +{ + rb_gc_mark(wrapper->func_instances); +} + +static void +dealloc(nokogiriXsltStylesheetTuple *wrapper) +{ + xsltStylesheetPtr doc = wrapper->ss; + + NOKOGIRI_DEBUG_START(doc); + xsltFreeStylesheet(doc); /* commented out for now. */ + NOKOGIRI_DEBUG_END(doc); + + free(wrapper); +} + +static void +xslt_generic_error_handler(void *ctx, const char *msg, ...) +{ + char *message; + + va_list args; + va_start(args, msg); + vasprintf(&message, msg, args); + va_end(args); + + rb_str_cat2((VALUE)ctx, message); + + free(message); +} + +VALUE +Nokogiri_wrap_xslt_stylesheet(xsltStylesheetPtr ss) +{ + VALUE self; + nokogiriXsltStylesheetTuple *wrapper; + + self = Data_Make_Struct(cNokogiriXsltStylesheet, nokogiriXsltStylesheetTuple, + mark, dealloc, wrapper); + + ss->_private = (void *)self; + wrapper->ss = ss; + wrapper->func_instances = rb_ary_new(); + + return self; +} + +/* + * call-seq: + * parse_stylesheet_doc(document) + * + * Parse a stylesheet from +document+. + */ +static VALUE +parse_stylesheet_doc(VALUE klass, VALUE xmldocobj) +{ + xmlDocPtr xml, xml_cpy; + VALUE errstr, exception; + xsltStylesheetPtr ss ; + Data_Get_Struct(xmldocobj, xmlDoc, xml); + exsltRegisterAll(); + + errstr = rb_str_new(0, 0); + xsltSetGenericErrorFunc((void *)errstr, xslt_generic_error_handler); + + xml_cpy = xmlCopyDoc(xml, 1); /* 1 => recursive */ + ss = xsltParseStylesheetDoc(xml_cpy); + + xsltSetGenericErrorFunc(NULL, NULL); + + if (!ss) { + xmlFreeDoc(xml_cpy); + exception = rb_exc_new3(rb_eRuntimeError, errstr); + rb_exc_raise(exception); + } + + return Nokogiri_wrap_xslt_stylesheet(ss); +} + + +/* + * call-seq: + * serialize(document) + * + * Serialize +document+ to an xml string. + */ +static VALUE +serialize(VALUE self, VALUE xmlobj) +{ + xmlDocPtr xml ; + nokogiriXsltStylesheetTuple *wrapper; + xmlChar *doc_ptr ; + int doc_len ; + VALUE rval ; + + Data_Get_Struct(xmlobj, xmlDoc, xml); + Data_Get_Struct(self, nokogiriXsltStylesheetTuple, wrapper); + xsltSaveResultToString(&doc_ptr, &doc_len, xml, wrapper->ss); + rval = NOKOGIRI_STR_NEW(doc_ptr, doc_len); + xmlFree(doc_ptr); + return rval ; +} + +/* + * call-seq: + * transform(document, params = []) + * + * Apply an XSLT stylesheet to an XML::Document. + * +params+ is an array of strings used as XSLT parameters. + * returns Nokogiri::XML::Document + * + * Example: + * + * doc = Nokogiri::XML(File.read(ARGV[0])) + * xslt = Nokogiri::XSLT(File.read(ARGV[1])) + * puts xslt.transform(doc, ['key', 'value']) + * + */ +static VALUE +transform(int argc, VALUE *argv, VALUE self) +{ + VALUE xmldoc, paramobj, errstr, exception ; + xmlDocPtr xml ; + xmlDocPtr result ; + nokogiriXsltStylesheetTuple *wrapper; + const char **params ; + long param_len, j ; + int parse_error_occurred ; + + rb_scan_args(argc, argv, "11", &xmldoc, &paramobj); + if (NIL_P(paramobj)) { paramobj = rb_ary_new2(0L) ; } + if (!rb_obj_is_kind_of(xmldoc, cNokogiriXmlDocument)) { + rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::Document"); + } + + /* handle hashes as arguments. */ + if (T_HASH == TYPE(paramobj)) { + paramobj = rb_funcall(paramobj, rb_intern("to_a"), 0); + paramobj = rb_funcall(paramobj, rb_intern("flatten"), 0); + } + + Check_Type(paramobj, T_ARRAY); + + Data_Get_Struct(xmldoc, xmlDoc, xml); + Data_Get_Struct(self, nokogiriXsltStylesheetTuple, wrapper); + + param_len = RARRAY_LEN(paramobj); + params = calloc((size_t)param_len + 1, sizeof(char *)); + for (j = 0 ; j < param_len ; j++) { + VALUE entry = rb_ary_entry(paramobj, j); + const char *ptr = StringValueCStr(entry); + params[j] = ptr; + } + params[param_len] = 0 ; + + errstr = rb_str_new(0, 0); + xsltSetGenericErrorFunc((void *)errstr, xslt_generic_error_handler); + xmlSetGenericErrorFunc((void *)errstr, xslt_generic_error_handler); + + result = xsltApplyStylesheet(wrapper->ss, xml, params); + free(params); + + xsltSetGenericErrorFunc(NULL, NULL); + xmlSetGenericErrorFunc(NULL, NULL); + + parse_error_occurred = (Qfalse == rb_funcall(errstr, rb_intern("empty?"), 0)); + + if (parse_error_occurred) { + exception = rb_exc_new3(rb_eRuntimeError, errstr); + rb_exc_raise(exception); + } + + return noko_xml_document_wrap((VALUE)0, result) ; +} + +static void +method_caller(xmlXPathParserContextPtr ctxt, int nargs) +{ + VALUE handler; + const char *function_name; + xsltTransformContextPtr transform; + const xmlChar *functionURI; + + transform = xsltXPathGetTransformContext(ctxt); + functionURI = ctxt->context->functionURI; + handler = (VALUE)xsltGetExtData(transform, functionURI); + function_name = (const char *)(ctxt->context->function); + + Nokogiri_marshal_xpath_funcall_and_return_values(ctxt, nargs, handler, (const char *)function_name); +} + +static void * +initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri) +{ + VALUE modules = rb_iv_get(mNokogiriXslt, "@modules"); + VALUE obj = rb_hash_aref(modules, rb_str_new2((const char *)uri)); + VALUE args = { Qfalse }; + VALUE methods = rb_funcall(obj, rb_intern("instance_methods"), 1, args); + VALUE inst; + nokogiriXsltStylesheetTuple *wrapper; + int i; + + for (i = 0; i < RARRAY_LEN(methods); i++) { + VALUE method_name = rb_obj_as_string(rb_ary_entry(methods, i)); + xsltRegisterExtFunction(ctxt, + (unsigned char *)StringValueCStr(method_name), uri, method_caller); + } + + Data_Get_Struct((VALUE)ctxt->style->_private, nokogiriXsltStylesheetTuple, + wrapper); + inst = rb_class_new_instance(0, NULL, obj); + rb_ary_push(wrapper->func_instances, inst); + + return (void *)inst; +} + +static void +shutdownFunc(xsltTransformContextPtr ctxt, + const xmlChar *uri, void *data) +{ + nokogiriXsltStylesheetTuple *wrapper; + + Data_Get_Struct((VALUE)ctxt->style->_private, nokogiriXsltStylesheetTuple, + wrapper); + + rb_ary_clear(wrapper->func_instances); +} + +/* + * call-seq: + * register(uri, custom_handler_class) + * + * Register a class that implements custom XSLT transformation functions. + */ +static VALUE +registr(VALUE self, VALUE uri, VALUE obj) +{ + VALUE modules = rb_iv_get(self, "@modules"); + if (NIL_P(modules)) { rb_raise(rb_eRuntimeError, "wtf! @modules isn't set"); } + + rb_hash_aset(modules, uri, obj); + xsltRegisterExtModule((unsigned char *)StringValueCStr(uri), initFunc, shutdownFunc); + return self; +} + +void +noko_init_xslt_stylesheet() +{ + rb_define_singleton_method(mNokogiriXslt, "register", registr, 2); + rb_iv_set(mNokogiriXslt, "@modules", rb_hash_new()); + + cNokogiriXsltStylesheet = rb_define_class_under(mNokogiriXslt, "Stylesheet", rb_cObject); + + rb_define_singleton_method(cNokogiriXsltStylesheet, "parse_stylesheet_doc", parse_stylesheet_doc, 1); + rb_define_method(cNokogiriXsltStylesheet, "serialize", serialize, 1); + rb_define_method(cNokogiriXsltStylesheet, "transform", transform, -1); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri.rb new file mode 100644 index 000000000000..bf5663dad4f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri.rb @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +# frozen_string_literal: true +# Modify the PATH on windows so that the external DLLs will get loaded. + +require 'rbconfig' + +if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby" + require 'nokogiri/jruby/dependencies' +end + +require 'nokogiri/extension' + +require 'nokogiri/version' +require 'nokogiri/syntax_error' +require 'nokogiri/xml' +require 'nokogiri/xslt' +require 'nokogiri/html' +require 'nokogiri/decorators/slop' +require 'nokogiri/css' +require 'nokogiri/html/builder' + +# Nokogiri parses and searches XML/HTML very quickly, and also has +# correctly implemented CSS3 selector support as well as XPath 1.0 +# support. +# +# Parsing a document returns either a Nokogiri::XML::Document, or a +# Nokogiri::HTML::Document depending on the kind of document you parse. +# +# Here is an example: +# +# require 'nokogiri' +# require 'open-uri' +# +# # Get a Nokogiri::HTML:Document for the page we’re interested in... +# +# doc = Nokogiri::HTML(URI.open('http://www.google.com/search?q=tenderlove')) +# +# # Do funky things with it using Nokogiri::XML::Node methods... +# +# #### +# # Search for nodes by css +# doc.css('h3.r a.l').each do |link| +# puts link.content +# end +# +# See Nokogiri::XML::Searchable#css for more information about CSS searching. +# See Nokogiri::XML::Searchable#xpath for more information about XPath searching. +module Nokogiri + class << self + ### + # Parse an HTML or XML document. +string+ contains the document. + def parse string, url = nil, encoding = nil, options = nil + if string.respond_to?(:read) || + /^\s*<(?:!DOCTYPE\s+)?html[\s>]/i === string[0, 512] + # Expect an HTML indicator to appear within the first 512 + # characters of a document. (<?xml ?> + <?xml-stylesheet ?> + # shouldn't be that long) + Nokogiri.HTML(string, url, encoding, + options || XML::ParseOptions::DEFAULT_HTML) + else + Nokogiri.XML(string, url, encoding, + options || XML::ParseOptions::DEFAULT_XML) + end.tap { |doc| + yield doc if block_given? + } + end + + ### + # Create a new Nokogiri::XML::DocumentFragment + def make input = nil, opts = {}, &blk + if input + Nokogiri::HTML.fragment(input).children.first + else + Nokogiri(&blk) + end + end + + ### + # Parse a document and add the Slop decorator. The Slop decorator + # implements method_missing such that methods may be used instead of CSS + # or XPath. For example: + # + # doc = Nokogiri::Slop(<<-eohtml) + # <html> + # <body> + # <p>first</p> + # <p>second</p> + # </body> + # </html> + # eohtml + # assert_equal('second', doc.html.body.p[1].text) + # + def Slop(*args, &block) + Nokogiri(*args, &block).slop! + end + + def install_default_aliases + # Make sure to support some popular encoding aliases not known by + # all iconv implementations. + { + 'Windows-31J' => 'CP932', # Windows-31J is the IANA registered name of CP932. + }.each { |alias_name, name| + EncodingHandler.alias(name, alias_name) if EncodingHandler[alias_name].nil? + } + end + end + + Nokogiri.install_default_aliases +end + +### +# Parse a document contained in +args+. Nokogiri will try to guess what +# type of document you are attempting to parse. For more information, see +# Nokogiri.parse +# +# To specify the type of document, use Nokogiri.XML or Nokogiri.HTML. +def Nokogiri(*args, &block) + if block_given? + Nokogiri::HTML::Builder.new(&block).doc.root + else + Nokogiri.parse(*args) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/2.5/nokogiri.so b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/2.5/nokogiri.so new file mode 100644 index 000000000000..d11c23450d12 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/2.5/nokogiri.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/2.6/nokogiri.so b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/2.6/nokogiri.so new file mode 100644 index 000000000000..ed6f619a08b0 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/2.6/nokogiri.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/2.7/nokogiri.so b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/2.7/nokogiri.so new file mode 100644 index 000000000000..e6af1afc42c3 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/2.7/nokogiri.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/3.0/nokogiri.so b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/3.0/nokogiri.so new file mode 100644 index 000000000000..27a4c74ceabb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/3.0/nokogiri.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css.rb new file mode 100644 index 000000000000..786aa5e239c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true +require 'nokogiri/css/node' +require 'nokogiri/css/xpath_visitor' +x = $-w +$-w = false +require 'nokogiri/css/parser' +$-w = x + +require 'nokogiri/css/tokenizer' +require 'nokogiri/css/syntax_error' + +module Nokogiri + module CSS + class << self + ### + # Parse this CSS selector in +selector+. Returns an AST. + def parse selector + Parser.new.parse selector + end + + ### + # Get the XPath for +selector+. + def xpath_for selector, options={} + Parser.new(options[:ns] || {}).xpath_for selector, options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/node.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/node.rb new file mode 100644 index 000000000000..672518238d69 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/node.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true +module Nokogiri + module CSS + class Node + ALLOW_COMBINATOR_ON_SELF = [:DIRECT_ADJACENT_SELECTOR, :FOLLOWING_SELECTOR, :CHILD_SELECTOR] + + # Get the type of this node + attr_accessor :type + # Get the value of this node + attr_accessor :value + + # Create a new Node with +type+ and +value+ + def initialize type, value + @type = type + @value = value + end + + # Accept +visitor+ + def accept visitor + visitor.send(:"visit_#{type.to_s.downcase}", self) + end + + ### + # Convert this CSS node to xpath with +prefix+ using +visitor+ + def to_xpath prefix = '//', visitor = XPathVisitor.new + prefix = '.' if ALLOW_COMBINATOR_ON_SELF.include?(type) && value.first.nil? + prefix + visitor.accept(self) + end + + # Find a node by type using +types+ + def find_by_type types + matches = [] + matches << self if to_type == types + @value.each do |v| + matches += v.find_by_type(types) if v.respond_to?(:find_by_type) + end + matches + end + + # Convert to_type + def to_type + [@type] + @value.map { |n| + n.to_type if n.respond_to?(:to_type) + }.compact + end + + # Convert to array + def to_a + [@type] + @value.map { |n| n.respond_to?(:to_a) ? n.to_a : [n] } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/parser.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/parser.rb new file mode 100644 index 000000000000..52b96826c96a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/parser.rb @@ -0,0 +1,751 @@ +# frozen_string_literal: true +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.2 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + + +require 'nokogiri/css/parser_extras' + +module Nokogiri + module CSS + class Parser < Racc::Parser + + +def unescape_css_identifier(identifier) + identifier.gsub(/\\(?:([^0-9a-fA-F])|([0-9a-fA-F]{1,6})\s?)/){ |m| $1 || [$2.hex].pack('U') } +end + +def unescape_css_string(str) + str.gsub(/\\(?:([^0-9a-fA-F])|([0-9a-fA-F]{1,6})\s?)/) do |m| + if $1=="\n" + '' + else + $1 || [$2.hex].pack('U') + end + end +end +##### State transition tables begin ### + +racc_action_table = [ + 24, 93, 56, 57, 33, 55, 94, 23, 24, 22, + 12, 93, 33, 27, 35, 52, 44, 22, -23, 25, + 45, 98, 23, 33, 26, 18, 20, 25, 27, -23, + 23, 24, 26, 18, 20, 33, 27, 11, 39, 24, + 22, 23, 74, 33, 18, 91, 90, 27, 22, 12, + 25, 24, -23, 23, 85, 26, 18, 20, 25, 27, + 66, 23, 24, 26, 18, 20, 33, 27, 86, 88, + 51, 22, 89, 92, 24, 26, 56, 87, 95, 60, + 90, 25, 96, 46, 23, 49, 26, 18, 20, 99, + 27, 33, 33, 51, 103, 104, 56, 58, 26, 60, + 93, 106, 33, 33, 33, 109, 39, 39, 110, 23, + 23, nil, 18, 18, 20, 27, 27, 39, 39, 39, + 23, 23, 23, 18, 18, 18, 27, 27, 27, 33, + 33, 101, 100, nil, 102, 22, 56, 87, nil, 60, + 33, nil, nil, nil, 39, 39, nil, 23, 23, nil, + 18, 18, 20, 27, 27, 39, 82, 83, 23, 56, + 87, 18, 60, nil, 27, 82, 83, 78, 79, 80, + nil, 81, nil, nil, nil, 77, 78, 79, 80, nil, + 81, 4, 5, 10, 77, 4, 5, 43, nil, 56, + 87, 6, 60, 8, 7, 6, nil, 8, 7, 4, + 5, 10, nil, nil, nil, nil, nil, nil, nil, 6, + nil, 8, 7 ] + +racc_action_check = [ + 3, 58, 24, 24, 3, 24, 57, 15, 9, 3, + 64, 57, 9, 15, 11, 24, 18, 9, 58, 3, + 21, 64, 3, 14, 3, 3, 3, 9, 3, 22, + 9, 12, 9, 9, 9, 12, 9, 1, 14, 42, + 12, 14, 45, 42, 14, 55, 55, 14, 42, 1, + 12, 27, 46, 12, 49, 12, 12, 12, 42, 12, + 27, 42, 43, 42, 42, 42, 43, 42, 50, 53, + 27, 43, 54, 56, 23, 27, 51, 51, 59, 51, + 60, 43, 61, 23, 43, 23, 43, 43, 43, 75, + 43, 28, 25, 23, 84, 86, 25, 25, 23, 25, + 87, 91, 29, 30, 31, 94, 28, 25, 106, 28, + 25, nil, 28, 25, 25, 28, 25, 29, 30, 31, + 29, 30, 31, 29, 30, 31, 29, 30, 31, 32, + 39, 76, 76, nil, 76, 39, 90, 90, nil, 90, + 62, nil, nil, nil, 32, 39, nil, 32, 39, nil, + 32, 39, 39, 32, 39, 62, 47, 47, 62, 92, + 92, 62, 92, nil, 62, 48, 48, 47, 47, 47, + nil, 47, nil, nil, nil, 47, 48, 48, 48, nil, + 48, 0, 0, 0, 48, 17, 17, 17, nil, 93, + 93, 0, 93, 0, 0, 17, nil, 17, 17, 26, + 26, 26, nil, nil, nil, nil, nil, nil, nil, 26, + nil, 26, 26 ] + +racc_action_pointer = [ + 174, 37, nil, -2, nil, nil, nil, nil, nil, 6, + nil, 14, 29, nil, 17, -17, nil, 178, 5, nil, + nil, -9, 0, 72, -8, 86, 192, 49, 85, 96, + 97, 98, 123, nil, nil, nil, nil, nil, nil, 124, + nil, nil, 37, 60, nil, 31, 23, 153, 162, 29, + 39, 66, nil, 46, 49, 34, 61, -1, -11, 55, + 68, 59, 134, nil, -2, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 64, 121, nil, nil, nil, + nil, nil, nil, nil, 69, nil, 84, 88, nil, nil, + 126, 94, 149, 179, 92, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 95, nil, nil, nil, + nil ] + +racc_action_default = [ + -75, -76, -2, -24, -4, -5, -6, -7, -8, -24, + -74, -76, -24, -3, -47, -10, -13, -17, -76, -19, + -20, -76, -22, -24, -76, -24, -75, -76, -53, -54, + -55, -56, -57, -58, -14, 111, -1, -9, -46, -24, + -11, -12, -24, -24, -18, -76, -29, -62, -62, -76, + -76, -76, -30, -76, -76, -38, -39, -40, -22, -76, + -38, -76, -71, -73, -76, -44, -45, -48, -49, -50, + -51, -52, -15, -16, -21, -76, -76, -63, -64, -65, + -66, -67, -68, -69, -76, -27, -76, -40, -31, -32, + -76, -43, -76, -76, -76, -33, -70, -72, -34, -25, + -59, -60, -61, -26, -28, -35, -76, -36, -37, -42, + -41 ] + +racc_goto_table = [ + 53, 38, 13, 1, 42, 48, 62, 37, 34, 65, + 40, 36, 63, 75, 84, 67, 68, 69, 70, 71, + 62, 41, 50, 47, 54, nil, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 72, 73, nil, nil, nil, nil, nil, nil, 97, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 105, nil, 107, 108 ] + +racc_goto_check = [ + 18, 12, 2, 1, 5, 9, 7, 8, 2, 9, + 10, 2, 12, 17, 17, 12, 12, 12, 12, 12, + 7, 11, 15, 16, 19, nil, 12, nil, nil, 1, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 2, 2, nil, nil, nil, nil, nil, nil, 12, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 18, nil, 18, 18 ] + +racc_goto_pointer = [ + nil, 3, -1, nil, nil, -13, nil, -19, -7, -18, + -5, 6, -13, nil, nil, -1, 0, -34, -24, 0, + nil, nil, nil, nil ] + +racc_goto_default = [ + nil, nil, nil, 2, 3, 9, 17, 14, nil, 15, + 31, 30, 16, 29, 19, 21, nil, nil, 59, nil, + 28, 32, 76, 61 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 3, 32, :_reduce_1, + 1, 32, :_reduce_2, + 2, 32, :_reduce_3, + 1, 36, :_reduce_4, + 1, 36, :_reduce_5, + 1, 36, :_reduce_6, + 1, 36, :_reduce_7, + 1, 36, :_reduce_8, + 2, 37, :_reduce_9, + 1, 37, :_reduce_none, + 2, 37, :_reduce_11, + 2, 37, :_reduce_12, + 1, 37, :_reduce_13, + 2, 34, :_reduce_14, + 3, 33, :_reduce_15, + 3, 33, :_reduce_16, + 1, 33, :_reduce_none, + 2, 44, :_reduce_18, + 1, 38, :_reduce_none, + 1, 38, :_reduce_20, + 3, 45, :_reduce_21, + 1, 45, :_reduce_22, + 1, 46, :_reduce_23, + 0, 46, :_reduce_none, + 4, 42, :_reduce_25, + 4, 42, :_reduce_26, + 3, 42, :_reduce_27, + 3, 47, :_reduce_28, + 1, 47, :_reduce_29, + 2, 40, :_reduce_30, + 3, 40, :_reduce_31, + 3, 40, :_reduce_32, + 3, 40, :_reduce_33, + 3, 40, :_reduce_34, + 3, 49, :_reduce_35, + 3, 49, :_reduce_36, + 3, 49, :_reduce_37, + 1, 49, :_reduce_none, + 1, 49, :_reduce_none, + 1, 49, :_reduce_40, + 4, 50, :_reduce_41, + 3, 50, :_reduce_42, + 2, 50, :_reduce_43, + 2, 41, :_reduce_44, + 2, 41, :_reduce_45, + 1, 39, :_reduce_none, + 0, 39, :_reduce_none, + 2, 43, :_reduce_48, + 2, 43, :_reduce_49, + 2, 43, :_reduce_50, + 2, 43, :_reduce_51, + 2, 43, :_reduce_52, + 1, 43, :_reduce_none, + 1, 43, :_reduce_none, + 1, 43, :_reduce_none, + 1, 43, :_reduce_none, + 1, 43, :_reduce_none, + 1, 51, :_reduce_58, + 2, 48, :_reduce_59, + 2, 48, :_reduce_60, + 2, 48, :_reduce_61, + 0, 48, :_reduce_none, + 1, 53, :_reduce_63, + 1, 53, :_reduce_64, + 1, 53, :_reduce_65, + 1, 53, :_reduce_66, + 1, 53, :_reduce_67, + 1, 53, :_reduce_68, + 1, 53, :_reduce_69, + 3, 52, :_reduce_70, + 1, 54, :_reduce_none, + 2, 54, :_reduce_none, + 1, 54, :_reduce_none, + 1, 35, :_reduce_none, + 0, 35, :_reduce_none ] + +racc_reduce_n = 76 + +racc_shift_n = 111 + +racc_token_table = { + false => 0, + :error => 1, + :FUNCTION => 2, + :INCLUDES => 3, + :DASHMATCH => 4, + :LBRACE => 5, + :HASH => 6, + :PLUS => 7, + :GREATER => 8, + :S => 9, + :STRING => 10, + :IDENT => 11, + :COMMA => 12, + :NUMBER => 13, + :PREFIXMATCH => 14, + :SUFFIXMATCH => 15, + :SUBSTRINGMATCH => 16, + :TILDE => 17, + :NOT_EQUAL => 18, + :SLASH => 19, + :DOUBLESLASH => 20, + :NOT => 21, + :EQUAL => 22, + :RPAREN => 23, + :LSQUARE => 24, + :RSQUARE => 25, + :HAS => 26, + "." => 27, + "*" => 28, + "|" => 29, + ":" => 30 } + +racc_nt_base = 31 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "FUNCTION", + "INCLUDES", + "DASHMATCH", + "LBRACE", + "HASH", + "PLUS", + "GREATER", + "S", + "STRING", + "IDENT", + "COMMA", + "NUMBER", + "PREFIXMATCH", + "SUFFIXMATCH", + "SUBSTRINGMATCH", + "TILDE", + "NOT_EQUAL", + "SLASH", + "DOUBLESLASH", + "NOT", + "EQUAL", + "RPAREN", + "LSQUARE", + "RSQUARE", + "HAS", + "\".\"", + "\"*\"", + "\"|\"", + "\":\"", + "$start", + "selector", + "simple_selector_1toN", + "prefixless_combinator_selector", + "optional_S", + "combinator", + "simple_selector", + "element_name", + "hcap_0toN", + "function", + "pseudo", + "attrib", + "hcap_1toN", + "class", + "namespaced_ident", + "namespace", + "attrib_name", + "attrib_val_0or1", + "expr", + "nth", + "attribute_id", + "negation", + "eql_incl_dash", + "negation_arg" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +def _reduce_1(val, _values, result) + result = [val.first, val.last].flatten + + result +end + +def _reduce_2(val, _values, result) + result = val.flatten + result +end + +def _reduce_3(val, _values, result) + result = [val.last].flatten + result +end + +def _reduce_4(val, _values, result) + result = :DIRECT_ADJACENT_SELECTOR + result +end + +def _reduce_5(val, _values, result) + result = :CHILD_SELECTOR + result +end + +def _reduce_6(val, _values, result) + result = :FOLLOWING_SELECTOR + result +end + +def _reduce_7(val, _values, result) + result = :DESCENDANT_SELECTOR + result +end + +def _reduce_8(val, _values, result) + result = :CHILD_SELECTOR + result +end + +def _reduce_9(val, _values, result) + result = if val[1].nil? + val.first + else + Node.new(:CONDITIONAL_SELECTOR, [val.first, val[1]]) + end + + result +end + +# reduce 10 omitted + +def _reduce_11(val, _values, result) + result = Node.new(:CONDITIONAL_SELECTOR, val) + + result +end + +def _reduce_12(val, _values, result) + result = Node.new(:CONDITIONAL_SELECTOR, val) + + result +end + +def _reduce_13(val, _values, result) + result = Node.new(:CONDITIONAL_SELECTOR, + [Node.new(:ELEMENT_NAME, ['*']), val.first] + ) + + result +end + +def _reduce_14(val, _values, result) + result = Node.new(val.first, [nil, val.last]) + + result +end + +def _reduce_15(val, _values, result) + result = Node.new(val[1], [val.first, val.last]) + + result +end + +def _reduce_16(val, _values, result) + result = Node.new(:DESCENDANT_SELECTOR, [val.first, val.last]) + + result +end + +# reduce 17 omitted + +def _reduce_18(val, _values, result) + result = Node.new(:CLASS_CONDITION, [unescape_css_identifier(val[1])]) + result +end + +# reduce 19 omitted + +def _reduce_20(val, _values, result) + result = Node.new(:ELEMENT_NAME, val) + result +end + +def _reduce_21(val, _values, result) + result = Node.new(:ELEMENT_NAME, + [[val.first, val.last].compact.join(':')] + ) + + result +end + +def _reduce_22(val, _values, result) + name = @namespaces.key?('xmlns') ? "xmlns:#{val.first}" : val.first + result = Node.new(:ELEMENT_NAME, [name]) + + result +end + +def _reduce_23(val, _values, result) + result = val[0] + result +end + +# reduce 24 omitted + +def _reduce_25(val, _values, result) + result = Node.new(:ATTRIBUTE_CONDITION, + [val[1]] + (val[2] || []) + ) + + result +end + +def _reduce_26(val, _values, result) + result = Node.new(:ATTRIBUTE_CONDITION, + [val[1]] + (val[2] || []) + ) + + result +end + +def _reduce_27(val, _values, result) + # non-standard, from hpricot + result = Node.new(:PSEUDO_CLASS, + [Node.new(:FUNCTION, ['nth-child(', val[1]])] + ) + + result +end + +def _reduce_28(val, _values, result) + result = Node.new(:ELEMENT_NAME, + [[val.first, val.last].compact.join(':')] + ) + + result +end + +def _reduce_29(val, _values, result) + # Default namespace is not applied to attributes. + # So we don't add prefix "xmlns:" as in namespaced_ident. + result = Node.new(:ELEMENT_NAME, [val.first]) + + result +end + +def _reduce_30(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip]) + + result +end + +def _reduce_31(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + + result +end + +def _reduce_32(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + + result +end + +def _reduce_33(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + + result +end + +def _reduce_34(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + + result +end + +def _reduce_35(val, _values, result) + result = [val.first, val.last] + result +end + +def _reduce_36(val, _values, result) + result = [val.first, val.last] + result +end + +def _reduce_37(val, _values, result) + result = [val.first, val.last] + result +end + +# reduce 38 omitted + +# reduce 39 omitted + +def _reduce_40(val, _values, result) + case val[0] + when 'even' + result = Node.new(:NTH, ['2','n','+','0']) + when 'odd' + result = Node.new(:NTH, ['2','n','+','1']) + when 'n' + result = Node.new(:NTH, ['1','n','+','0']) + else + # non-standard to support custom functions: + # assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)')) + # assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)')) + # assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)')) + result = val + end + + result +end + +def _reduce_41(val, _values, result) + if val[1] == 'n' + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + + result +end + +def _reduce_42(val, _values, result) + # n+3, -n+3 + if val[0] == 'n' + val.unshift("1") + result = Node.new(:NTH, val) + elsif val[0] == '-n' + val[0] = 'n' + val.unshift("-1") + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + + result +end + +def _reduce_43(val, _values, result) + # 5n, -5n, 10n-1 + n = val[1] + if n[0, 2] == 'n-' + val[1] = 'n' + val << "-" + # b is contained in n as n is the string "n-b" + val << n[2, n.size] + result = Node.new(:NTH, val) + elsif n == 'n' + val << "+" + val << "0" + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + + result +end + +def _reduce_44(val, _values, result) + result = Node.new(:PSEUDO_CLASS, [val[1]]) + + result +end + +def _reduce_45(val, _values, result) + result = Node.new(:PSEUDO_CLASS, [val[1]]) + result +end + +# reduce 46 omitted + +# reduce 47 omitted + +def _reduce_48(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result +end + +def _reduce_49(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result +end + +def _reduce_50(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result +end + +def _reduce_51(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result +end + +def _reduce_52(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result +end + +# reduce 53 omitted + +# reduce 54 omitted + +# reduce 55 omitted + +# reduce 56 omitted + +# reduce 57 omitted + +def _reduce_58(val, _values, result) + result = Node.new(:ID, [unescape_css_identifier(val.first)]) + result +end + +def _reduce_59(val, _values, result) + result = [val.first, unescape_css_identifier(val[1])] + result +end + +def _reduce_60(val, _values, result) + result = [val.first, unescape_css_string(val[1])] + result +end + +def _reduce_61(val, _values, result) + result = [val.first, val[1]] + result +end + +# reduce 62 omitted + +def _reduce_63(val, _values, result) + result = :equal + result +end + +def _reduce_64(val, _values, result) + result = :prefix_match + result +end + +def _reduce_65(val, _values, result) + result = :suffix_match + result +end + +def _reduce_66(val, _values, result) + result = :substring_match + result +end + +def _reduce_67(val, _values, result) + result = :not_equal + result +end + +def _reduce_68(val, _values, result) + result = :includes + result +end + +def _reduce_69(val, _values, result) + result = :dash_match + result +end + +def _reduce_70(val, _values, result) + result = Node.new(:NOT, [val[1]]) + + result +end + +# reduce 71 omitted + +# reduce 72 omitted + +# reduce 73 omitted + +# reduce 74 omitted + +# reduce 75 omitted + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser + end # module CSS +end # module Nokogiri diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/parser.y b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/parser.y new file mode 100644 index 000000000000..4ac8f9d69b28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/parser.y @@ -0,0 +1,272 @@ +class Nokogiri::CSS::Parser + +token FUNCTION INCLUDES DASHMATCH LBRACE HASH PLUS GREATER S STRING IDENT +token COMMA NUMBER PREFIXMATCH SUFFIXMATCH SUBSTRINGMATCH TILDE NOT_EQUAL +token SLASH DOUBLESLASH NOT EQUAL RPAREN LSQUARE RSQUARE HAS + +rule + selector + : selector COMMA simple_selector_1toN { + result = [val.first, val.last].flatten + } + | prefixless_combinator_selector { result = val.flatten } + | optional_S simple_selector_1toN { result = [val.last].flatten } + ; + combinator + : PLUS { result = :DIRECT_ADJACENT_SELECTOR } + | GREATER { result = :CHILD_SELECTOR } + | TILDE { result = :FOLLOWING_SELECTOR } + | DOUBLESLASH { result = :DESCENDANT_SELECTOR } + | SLASH { result = :CHILD_SELECTOR } + ; + simple_selector + : element_name hcap_0toN { + result = if val[1].nil? + val.first + else + Node.new(:CONDITIONAL_SELECTOR, [val.first, val[1]]) + end + } + | function + | function pseudo { + result = Node.new(:CONDITIONAL_SELECTOR, val) + } + | function attrib { + result = Node.new(:CONDITIONAL_SELECTOR, val) + } + | hcap_1toN { + result = Node.new(:CONDITIONAL_SELECTOR, + [Node.new(:ELEMENT_NAME, ['*']), val.first] + ) + } + ; + prefixless_combinator_selector + : combinator simple_selector_1toN { + result = Node.new(val.first, [nil, val.last]) + } + ; + simple_selector_1toN + : simple_selector combinator simple_selector_1toN { + result = Node.new(val[1], [val.first, val.last]) + } + | simple_selector S simple_selector_1toN { + result = Node.new(:DESCENDANT_SELECTOR, [val.first, val.last]) + } + | simple_selector + ; + class + : '.' IDENT { result = Node.new(:CLASS_CONDITION, [unescape_css_identifier(val[1])]) } + ; + element_name + : namespaced_ident + | '*' { result = Node.new(:ELEMENT_NAME, val) } + ; + namespaced_ident + : namespace '|' IDENT { + result = Node.new(:ELEMENT_NAME, + [[val.first, val.last].compact.join(':')] + ) + } + | IDENT { + name = @namespaces.key?('xmlns') ? "xmlns:#{val.first}" : val.first + result = Node.new(:ELEMENT_NAME, [name]) + } + ; + namespace + : IDENT { result = val[0] } + | + ; + attrib + : LSQUARE attrib_name attrib_val_0or1 RSQUARE { + result = Node.new(:ATTRIBUTE_CONDITION, + [val[1]] + (val[2] || []) + ) + } + | LSQUARE function attrib_val_0or1 RSQUARE { + result = Node.new(:ATTRIBUTE_CONDITION, + [val[1]] + (val[2] || []) + ) + } + | LSQUARE NUMBER RSQUARE { + # non-standard, from hpricot + result = Node.new(:PSEUDO_CLASS, + [Node.new(:FUNCTION, ['nth-child(', val[1]])] + ) + } + ; + attrib_name + : namespace '|' IDENT { + result = Node.new(:ELEMENT_NAME, + [[val.first, val.last].compact.join(':')] + ) + } + | IDENT { + # Default namespace is not applied to attributes. + # So we don't add prefix "xmlns:" as in namespaced_ident. + result = Node.new(:ELEMENT_NAME, [val.first]) + } + ; + function + : FUNCTION RPAREN { + result = Node.new(:FUNCTION, [val.first.strip]) + } + | FUNCTION expr RPAREN { + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + } + | FUNCTION nth RPAREN { + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + } + | NOT expr RPAREN { + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + } + | HAS selector RPAREN { + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + } + ; + expr + : NUMBER COMMA expr { result = [val.first, val.last] } + | STRING COMMA expr { result = [val.first, val.last] } + | IDENT COMMA expr { result = [val.first, val.last] } + | NUMBER + | STRING + | IDENT # even, odd + { + case val[0] + when 'even' + result = Node.new(:NTH, ['2','n','+','0']) + when 'odd' + result = Node.new(:NTH, ['2','n','+','1']) + when 'n' + result = Node.new(:NTH, ['1','n','+','0']) + else + # non-standard to support custom functions: + # assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)')) + # assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)')) + # assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)')) + result = val + end + } + ; + nth + : NUMBER IDENT PLUS NUMBER # 5n+3 -5n+3 + { + if val[1] == 'n' + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + } + | IDENT PLUS NUMBER { # n+3, -n+3 + if val[0] == 'n' + val.unshift("1") + result = Node.new(:NTH, val) + elsif val[0] == '-n' + val[0] = 'n' + val.unshift("-1") + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + } + | NUMBER IDENT { # 5n, -5n, 10n-1 + n = val[1] + if n[0, 2] == 'n-' + val[1] = 'n' + val << "-" + # b is contained in n as n is the string "n-b" + val << n[2, n.size] + result = Node.new(:NTH, val) + elsif n == 'n' + val << "+" + val << "0" + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + } + ; + pseudo + : ':' function { + result = Node.new(:PSEUDO_CLASS, [val[1]]) + } + | ':' IDENT { result = Node.new(:PSEUDO_CLASS, [val[1]]) } + ; + hcap_0toN + : hcap_1toN + | + ; + hcap_1toN + : attribute_id hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | class hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | attrib hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | pseudo hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | negation hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | attribute_id + | class + | attrib + | pseudo + | negation + ; + attribute_id + : HASH { result = Node.new(:ID, [unescape_css_identifier(val.first)]) } + ; + attrib_val_0or1 + : eql_incl_dash IDENT { result = [val.first, unescape_css_identifier(val[1])] } + | eql_incl_dash STRING { result = [val.first, unescape_css_string(val[1])] } + | eql_incl_dash NUMBER { result = [val.first, val[1]] } + | + ; + eql_incl_dash + : EQUAL { result = :equal } + | PREFIXMATCH { result = :prefix_match } + | SUFFIXMATCH { result = :suffix_match } + | SUBSTRINGMATCH { result = :substring_match } + | NOT_EQUAL { result = :not_equal } + | INCLUDES { result = :includes } + | DASHMATCH { result = :dash_match } + ; + negation + : NOT negation_arg RPAREN { + result = Node.new(:NOT, [val[1]]) + } + ; + negation_arg + : element_name + | element_name hcap_1toN + | hcap_1toN + ; + optional_S + : S + | + ; +end + +---- header + +require 'nokogiri/css/parser_extras' + +---- inner + +def unescape_css_identifier(identifier) + identifier.gsub(/\\(?:([^0-9a-fA-F])|([0-9a-fA-F]{1,6})\s?)/){ |m| $1 || [$2.hex].pack('U') } +end + +def unescape_css_string(str) + str.gsub(/\\(?:([^0-9a-fA-F])|([0-9a-fA-F]{1,6})\s?)/) do |m| + if $1=="\n" + '' + else + $1 || [$2.hex].pack('U') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/parser_extras.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/parser_extras.rb new file mode 100644 index 000000000000..b83dfefb9a64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/parser_extras.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true +require "thread" + +module Nokogiri + module CSS + class Parser < Racc::Parser + CACHE_SWITCH_NAME = :nokogiri_css_parser_cache_is_off + + @cache = {} + @mutex = Mutex.new + + class << self + # Return a thread-local boolean indicating whether the CSS-to-XPath cache is active. (Default is `true`.) + def cache_on? + !Thread.current[CACHE_SWITCH_NAME] + end + + # Set a thread-local boolean to turn cacheing on and off. Truthy values turn the cache on, falsey values turn the cache off. + def set_cache(value) + Thread.current[CACHE_SWITCH_NAME] = !value + end + + # Get the css selector in +string+ from the cache + def [](string) + return unless cache_on? + @mutex.synchronize { @cache[string] } + end + + # Set the css selector in +string+ in the cache to +value+ + def []=(string, value) + return value unless cache_on? + @mutex.synchronize { @cache[string] = value } + end + + # Clear the cache + def clear_cache(create_new_object = false) + @mutex.synchronize do + if create_new_object + @cache = {} + else + @cache.clear + end + end + end + + # Execute +block+ without cache + def without_cache(&block) + original_cache_setting = cache_on? + set_cache false + block.call + ensure + set_cache original_cache_setting + end + end + + # Create a new CSS parser with respect to +namespaces+ + def initialize(namespaces = {}) + @tokenizer = Tokenizer.new + @namespaces = namespaces + super() + end + + def parse(string) + @tokenizer.scan_setup string + do_parse + end + + def next_token + @tokenizer.next_token + end + + # Get the xpath for +string+ using +options+ + def xpath_for(string, options = {}) + key = "#{string}#{options[:ns]}#{options[:prefix]}" + v = self.class[key] + return v if v + + args = [ + options[:prefix] || "//", + options[:visitor] || XPathVisitor.new, + ] + self.class[key] = parse(string).map { |ast| + ast.to_xpath(*args) + } + end + + # On CSS parser error, raise an exception + def on_error(error_token_id, error_value, value_stack) + after = value_stack.compact.last + raise SyntaxError.new("unexpected '#{error_value}' after '#{after}'") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/syntax_error.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/syntax_error.rb new file mode 100644 index 000000000000..db3e2e583e13 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/syntax_error.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +require 'nokogiri/syntax_error' +module Nokogiri + module CSS + class SyntaxError < ::Nokogiri::SyntaxError + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/tokenizer.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/tokenizer.rb new file mode 100644 index 000000000000..1aa9953b01ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/tokenizer.rb @@ -0,0 +1,154 @@ +# frozen_string_literal: true +#-- +# DO NOT MODIFY!!!! +# This file is automatically generated by rex 1.0.7 +# from lexical definition file "lib/nokogiri/css/tokenizer.rex". +#++ + +module Nokogiri +module CSS +class Tokenizer # :nodoc: + require 'strscan' + + class ScanError < StandardError ; end + + attr_reader :lineno + attr_reader :filename + attr_accessor :state + + def scan_setup(str) + @ss = StringScanner.new(str) + @lineno = 1 + @state = nil + end + + def action + yield + end + + def scan_str(str) + scan_setup(str) + do_parse + end + alias :scan :scan_str + + def load_file( filename ) + @filename = filename + File.open(filename, "r") do |f| + scan_setup(f.read) + end + end + + def scan_file( filename ) + load_file(filename) + do_parse + end + + + def next_token + return if @ss.eos? + + # skips empty actions + until token = _next_token or @ss.eos?; end + token + end + + def _next_token + text = @ss.peek(1) + @lineno += 1 if text == "\n" + token = case @state + when nil + case + when (text = @ss.scan(/has\([\s]*/)) + action { [:HAS, text] } + + when (text = @ss.scan(/[-@]?([_A-Za-z]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])([_A-Za-z0-9-]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])*\([\s]*/)) + action { [:FUNCTION, text] } + + when (text = @ss.scan(/[-@]?([_A-Za-z]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])([_A-Za-z0-9-]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])*/)) + action { [:IDENT, text] } + + when (text = @ss.scan(/\#([_A-Za-z0-9-]|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])+/)) + action { [:HASH, text] } + + when (text = @ss.scan(/[\s]*~=[\s]*/)) + action { [:INCLUDES, text] } + + when (text = @ss.scan(/[\s]*\|=[\s]*/)) + action { [:DASHMATCH, text] } + + when (text = @ss.scan(/[\s]*\^=[\s]*/)) + action { [:PREFIXMATCH, text] } + + when (text = @ss.scan(/[\s]*\$=[\s]*/)) + action { [:SUFFIXMATCH, text] } + + when (text = @ss.scan(/[\s]*\*=[\s]*/)) + action { [:SUBSTRINGMATCH, text] } + + when (text = @ss.scan(/[\s]*!=[\s]*/)) + action { [:NOT_EQUAL, text] } + + when (text = @ss.scan(/[\s]*=[\s]*/)) + action { [:EQUAL, text] } + + when (text = @ss.scan(/[\s]*\)/)) + action { [:RPAREN, text] } + + when (text = @ss.scan(/\[[\s]*/)) + action { [:LSQUARE, text] } + + when (text = @ss.scan(/[\s]*\]/)) + action { [:RSQUARE, text] } + + when (text = @ss.scan(/[\s]*\+[\s]*/)) + action { [:PLUS, text] } + + when (text = @ss.scan(/[\s]*>[\s]*/)) + action { [:GREATER, text] } + + when (text = @ss.scan(/[\s]*,[\s]*/)) + action { [:COMMA, text] } + + when (text = @ss.scan(/[\s]*~[\s]*/)) + action { [:TILDE, text] } + + when (text = @ss.scan(/\:not\([\s]*/)) + action { [:NOT, text] } + + when (text = @ss.scan(/-?([0-9]+|[0-9]*\.[0-9]+)/)) + action { [:NUMBER, text] } + + when (text = @ss.scan(/[\s]*\/\/[\s]*/)) + action { [:DOUBLESLASH, text] } + + when (text = @ss.scan(/[\s]*\/[\s]*/)) + action { [:SLASH, text] } + + when (text = @ss.scan(/U\+[0-9a-f?]{1,6}(-[0-9a-f]{1,6})?/)) + action {[:UNICODE_RANGE, text] } + + when (text = @ss.scan(/[\s]+/)) + action { [:S, text] } + + when (text = @ss.scan(/"([^\n\r\f"]|\n|\r\n|\r|\f|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])*(?<!\\)(?:\\{2})*"|'([^\n\r\f']|\n|\r\n|\r|\f|[^\0-\177]|\\[0-9A-Fa-f]{1,6}(\r\n|[\s])?|\\[^\n\r\f0-9A-Fa-f])*(?<!\\)(?:\\{2})*'/)) + action { [:STRING, text] } + + when (text = @ss.scan(/./)) + action { [text, text] } + + + else + text = @ss.string[@ss.pos .. -1] + raise ScanError, "can not match: '" + text + "'" + end # if + + else + raise ScanError, "undefined state: '" + state.to_s + "'" + end # case state + token + end # def _next_token + +end # class +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/tokenizer.rex b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/tokenizer.rex new file mode 100644 index 000000000000..a29c2e425554 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/tokenizer.rex @@ -0,0 +1,55 @@ +module Nokogiri +module CSS +class Tokenizer # :nodoc: + +macro + nl \n|\r\n|\r|\f + w [\s]* + nonascii [^\0-\177] + num -?([0-9]+|[0-9]*\.[0-9]+) + unicode \\[0-9A-Fa-f]{1,6}(\r\n|[\s])? + + escape {unicode}|\\[^\n\r\f0-9A-Fa-f] + nmchar [_A-Za-z0-9-]|{nonascii}|{escape} + nmstart [_A-Za-z]|{nonascii}|{escape} + ident [-@]?({nmstart})({nmchar})* + name ({nmchar})+ + string1 "([^\n\r\f"]|{nl}|{nonascii}|{escape})*(?<!\\)(?:\\{2})*" + string2 '([^\n\r\f']|{nl}|{nonascii}|{escape})*(?<!\\)(?:\\{2})*' + string {string1}|{string2} + +rule + +# [:state] pattern [actions] + + has\({w} { [:HAS, text] } + {ident}\({w} { [:FUNCTION, text] } + {ident} { [:IDENT, text] } + \#{name} { [:HASH, text] } + {w}~={w} { [:INCLUDES, text] } + {w}\|={w} { [:DASHMATCH, text] } + {w}\^={w} { [:PREFIXMATCH, text] } + {w}\$={w} { [:SUFFIXMATCH, text] } + {w}\*={w} { [:SUBSTRINGMATCH, text] } + {w}!={w} { [:NOT_EQUAL, text] } + {w}={w} { [:EQUAL, text] } + {w}\) { [:RPAREN, text] } + \[{w} { [:LSQUARE, text] } + {w}\] { [:RSQUARE, text] } + {w}\+{w} { [:PLUS, text] } + {w}>{w} { [:GREATER, text] } + {w},{w} { [:COMMA, text] } + {w}~{w} { [:TILDE, text] } + \:not\({w} { [:NOT, text] } + {num} { [:NUMBER, text] } + {w}\/\/{w} { [:DOUBLESLASH, text] } + {w}\/{w} { [:SLASH, text] } + + U\+[0-9a-f?]{1,6}(-[0-9a-f]{1,6})? {[:UNICODE_RANGE, text] } + + [\s]+ { [:S, text] } + {string} { [:STRING, text] } + . { [text, text] } +end +end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/xpath_visitor.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/xpath_visitor.rb new file mode 100644 index 000000000000..3adee29b2f6e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/css/xpath_visitor.rb @@ -0,0 +1,260 @@ +# frozen_string_literal: true +module Nokogiri + module CSS + class XPathVisitor # :nodoc: + def visit_function node + msg = :"visit_function_#{node.value.first.gsub(/[(]/, '')}" + return self.send(msg, node) if self.respond_to?(msg) + + case node.value.first + when /^text\(/ + 'child::text()' + when /^self\(/ + "self::#{node.value[1]}" + when /^eq\(/ + "position()=#{node.value[1]}" + when /^(nth|nth-of-type)\(/ + if node.value[1].is_a?(Nokogiri::CSS::Node) and node.value[1].type == :NTH + nth(node.value[1]) + else + "position()=#{node.value[1]}" + end + when /^nth-child\(/ + if node.value[1].is_a?(Nokogiri::CSS::Node) and node.value[1].type == :NTH + nth(node.value[1], :child => true) + else + "count(preceding-sibling::*)=#{node.value[1].to_i-1}" + end + when /^nth-last-of-type\(/ + if node.value[1].is_a?(Nokogiri::CSS::Node) and node.value[1].type == :NTH + nth(node.value[1], :last => true) + else + index = node.value[1].to_i - 1 + index == 0 ? "position()=last()" : "position()=last()-#{index}" + end + when /^nth-last-child\(/ + if node.value[1].is_a?(Nokogiri::CSS::Node) and node.value[1].type == :NTH + nth(node.value[1], :last => true, :child => true) + else + "count(following-sibling::*)=#{node.value[1].to_i-1}" + end + when /^(first|first-of-type)\(/ + "position()=1" + when /^(last|last-of-type)\(/ + "position()=last()" + when /^contains\(/ + "contains(.,#{node.value[1]})" + when /^gt\(/ + "position()>#{node.value[1]}" + when /^only-child\(/ + "last()=1" + when /^comment\(/ + "comment()" + when /^has\(/ + is_direct = node.value[1].value[0].nil? # e.g. "has(> a)", "has(~ a)", "has(+ a)" + ".#{"//" if !is_direct}#{node.value[1].accept(self)}" + else + # non-standard. this looks like a function call. + args = ['.'] + node.value[1..-1] + "#{node.value.first}#{args.join(',')})" + end + end + + def visit_not node + child = node.value.first + if :ELEMENT_NAME == child.type + "not(self::#{child.accept(self)})" + else + "not(#{child.accept(self)})" + end + end + + def visit_id node + node.value.first =~ /^#(.*)$/ + "@id='#{$1}'" + end + + def visit_attribute_condition node + attribute = if (node.value.first.type == :FUNCTION) or (node.value.first.value.first =~ /::/) + '' + else + '@' + end + attribute += node.value.first.accept(self) + + # non-standard. attributes starting with '@' + attribute.gsub!(/^@@/, '@') + + return attribute unless node.value.length == 3 + + value = node.value.last + value = "'#{value}'" if value !~ /^['"]/ + + # quoted values - see test_attribute_value_with_quotes in test/css/test_parser.rb + if (value[0]==value[-1]) && %q{"'}.include?(value[0]) + str_value = value[1..-2] + if str_value.include?(value[0]) + value = 'concat("' + str_value.split('"', -1).join(%q{",'"',"}) + '","")' + end + end + + case node.value[1] + when :equal + attribute + "=" + "#{value}" + when :not_equal + attribute + "!=" + "#{value}" + when :substring_match + "contains(#{attribute},#{value})" + when :prefix_match + "starts-with(#{attribute},#{value})" + when :dash_match + "#{attribute}=#{value} or starts-with(#{attribute},concat(#{value},'-'))" + when :includes + value = value[1..-2] # strip quotes + css_class(attribute, value) + when :suffix_match + "substring(#{attribute},string-length(#{attribute})-string-length(#{value})+1,string-length(#{value}))=#{value}" + else + attribute + " #{node.value[1]} " + "#{value}" + end + end + + def visit_pseudo_class node + if node.value.first.is_a?(Nokogiri::CSS::Node) and node.value.first.type == :FUNCTION + node.value.first.accept(self) + else + msg = :"visit_pseudo_class_#{node.value.first.gsub(/[(]/, '')}" + return self.send(msg, node) if self.respond_to?(msg) + + case node.value.first + when "first" then "position()=1" + when "first-child" then "count(preceding-sibling::*)=0" + when "last" then "position()=last()" + when "last-child" then "count(following-sibling::*)=0" + when "first-of-type" then "position()=1" + when "last-of-type" then "position()=last()" + when "only-child" then "count(preceding-sibling::*)=0 and count(following-sibling::*)=0" + when "only-of-type" then "last()=1" + when "empty" then "not(node())" + when "parent" then "node()" + when "root" then "not(parent::*)" + else + node.value.first + "(.)" + end + end + end + + def visit_class_condition node + css_class("@class", node.value.first) + end + + def visit_combinator node + if is_of_type_pseudo_class?(node.value.last) + "#{node.value.first.accept(self) if node.value.first}][#{node.value.last.accept(self)}" + else + "#{node.value.first.accept(self) if node.value.first} and #{node.value.last.accept(self)}" + end + end + + { + 'direct_adjacent_selector' => "/following-sibling::*[1]/self::", + 'following_selector' => "/following-sibling::", + 'descendant_selector' => '//', + 'child_selector' => '/', + }.each do |k,v| + class_eval %{ + def visit_#{k} node + "\#{node.value.first.accept(self) if node.value.first}#{v}\#{node.value.last.accept(self)}" + end + } + end + + def visit_conditional_selector node + node.value.first.accept(self) + '[' + + node.value.last.accept(self) + ']' + end + + def visit_element_name node + node.value.first + end + + def accept node + node.accept(self) + end + + private + + def nth node, options={} + raise ArgumentError, "expected an+b node to contain 4 tokens, but is #{node.value.inspect}" unless node.value.size == 4 + + a, b = read_a_and_positive_b node.value + position = if options[:child] + options[:last] ? "(count(following-sibling::*)+1)" : "(count(preceding-sibling::*)+1)" + else + options[:last] ? "(last()-position()+1)" : "position()" + end + + if b.zero? + "(#{position} mod #{a})=0" + else + compare = a < 0 ? "<=" : ">=" + if a.abs == 1 + "#{position}#{compare}#{b}" + else + "(#{position}#{compare}#{b}) and (((#{position}-#{b}) mod #{a.abs})=0)" + end + end + end + + def read_a_and_positive_b values + op = values[2] + if op == "+" + a = values[0].to_i + b = values[3].to_i + elsif op == "-" + a = values[0].to_i + b = a - (values[3].to_i % a) + else + raise ArgumentError, "expected an+b node to have either + or - as the operator, but is #{op.inspect}" + end + [a, b] + end + + def is_of_type_pseudo_class? node + if node.type==:PSEUDO_CLASS + if node.value[0].is_a?(Nokogiri::CSS::Node) and node.value[0].type == :FUNCTION + node.value[0].value[0] + else + node.value[0] + end =~ /(nth|first|last|only)-of-type(\()?/ + end + end + + # use only ordinary xpath functions + def css_class_standard(hay, needle) + "contains(concat(' ',normalize-space(#{hay}),' '),' #{needle} ')" + end + + # use the builtin implementation + def css_class_builtin(hay, needle) + "nokogiri-builtin:css-class(#{hay},'#{needle}')" + end + + alias_method :css_class, :css_class_standard + end + + class XPathVisitorAlwaysUseBuiltins < XPathVisitor # :nodoc: + private + alias_method :css_class, :css_class_builtin + end + + class XPathVisitorOptimallyUseBuiltins < XPathVisitor # :nodoc: + private + if Nokogiri.uses_libxml? + alias_method :css_class, :css_class_builtin + else + alias_method :css_class, :css_class_standard + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/decorators/slop.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/decorators/slop.rb new file mode 100644 index 000000000000..7c848dee8ff4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/decorators/slop.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true +module Nokogiri + module Decorators + ### + # The Slop decorator implements method missing such that a methods may be + # used instead of XPath or CSS. See Nokogiri.Slop + module Slop + # The default XPath search context for Slop + XPATH_PREFIX = "./" + + ### + # look for node with +name+. See Nokogiri.Slop + def method_missing name, *args, &block + if args.empty? + list = xpath("#{XPATH_PREFIX}#{name.to_s.sub(/^_/, '')}") + elsif args.first.is_a? Hash + hash = args.first + if hash[:css] + list = css("#{name}#{hash[:css]}") + elsif hash[:xpath] + conds = Array(hash[:xpath]).join(' and ') + list = xpath("#{XPATH_PREFIX}#{name}[#{conds}]") + end + else + CSS::Parser.without_cache do + list = xpath( + *CSS.xpath_for("#{name}#{args.first}", :prefix => XPATH_PREFIX) + ) + end + end + + super if list.empty? + list.length == 1 ? list.first : list + end + + def respond_to_missing? name, include_private = false + list = xpath("#{XPATH_PREFIX}#{name.to_s.sub(/^_/, '')}") + + !list.empty? + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/extension.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/extension.rb new file mode 100644 index 000000000000..b7de485bb530 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/extension.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +# load the C or Java extension +begin + ::RUBY_VERSION =~ /(\d+\.\d+)/ + require "nokogiri/#{Regexp.last_match(1)}/nokogiri" +rescue LoadError => e + if e.message =~ /GLIBC/ + warn(<<~EOM) + + ERROR: It looks like you're trying to use Nokogiri as a precompiled native gem on a system with glibc < 2.17: + + #{e.message} + + If that's the case, then please install Nokogiri via the `ruby` platform gem: + gem install nokogiri --platform=ruby + or: + bundle config set force_ruby_platform true + + Please visit https://nokogiri.org/tutorials/installing_nokogiri.html for more help. + + EOM + raise e + end + require 'nokogiri/nokogiri' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html.rb new file mode 100644 index 000000000000..21ce61a8dde8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true +require 'nokogiri/html/entity_lookup' +require 'nokogiri/html/document' +require 'nokogiri/html/document_fragment' +require 'nokogiri/html/sax/parser_context' +require 'nokogiri/html/sax/parser' +require 'nokogiri/html/sax/push_parser' +require 'nokogiri/html/element_description' +require 'nokogiri/html/element_description_defaults' + +module Nokogiri + class << self + ### + # Parse HTML. Convenience method for Nokogiri::HTML::Document.parse + def HTML thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block + Nokogiri::HTML::Document.parse(thing, url, encoding, options, &block) + end + end + + module HTML + class << self + ### + # Parse HTML. Convenience method for Nokogiri::HTML::Document.parse + def parse thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block + Document.parse(thing, url, encoding, options, &block) + end + + #### + # Parse a fragment from +string+ in to a NodeSet. + def fragment string, encoding = nil + HTML::DocumentFragment.parse string, encoding + end + end + + # Instance of Nokogiri::HTML::EntityLookup + NamedCharacters = EntityLookup.new + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/builder.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/builder.rb new file mode 100644 index 000000000000..098588ae87a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/builder.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true +module Nokogiri + module HTML + ### + # Nokogiri HTML builder is used for building HTML documents. It is very + # similar to the Nokogiri::XML::Builder. In fact, you should go read the + # documentation for Nokogiri::XML::Builder before reading this + # documentation. + # + # == Synopsis: + # + # Create an HTML document with a body that has an onload attribute, and a + # span tag with a class of "bold" that has content of "Hello world". + # + # builder = Nokogiri::HTML::Builder.new do |doc| + # doc.html { + # doc.body(:onload => 'some_func();') { + # doc.span.bold { + # doc.text "Hello world" + # } + # } + # } + # end + # puts builder.to_html + # + # The HTML builder inherits from the XML builder, so make sure to read the + # Nokogiri::XML::Builder documentation. + class Builder < Nokogiri::XML::Builder + ### + # Convert the builder to HTML + def to_html + @doc.to_html + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/document.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/document.rb new file mode 100644 index 000000000000..c54676c92ffa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/document.rb @@ -0,0 +1,322 @@ +# frozen_string_literal: true + +require 'pathname' + +module Nokogiri + module HTML + class Document < Nokogiri::XML::Document + ### + # Get the meta tag encoding for this document. If there is no meta tag, + # then nil is returned. + def meta_encoding + case + when meta = at('//meta[@charset]') + meta[:charset] + when meta = meta_content_type + meta['content'][/charset\s*=\s*([\w-]+)/i, 1] + end + end + + ### + # Set the meta tag encoding for this document. + # + # If an meta encoding tag is already present, its content is + # replaced with the given text. + # + # Otherwise, this method tries to create one at an appropriate + # place supplying head and/or html elements as necessary, which + # is inside a head element if any, and before any text node or + # content element (typically <body>) if any. + # + # The result when trying to set an encoding that is different + # from the document encoding is undefined. + # + # Beware in CRuby, that libxml2 automatically inserts a meta tag + # into a head element. + def meta_encoding= encoding + case + when meta = meta_content_type + meta['content'] = 'text/html; charset=%s' % encoding + encoding + when meta = at('//meta[@charset]') + meta['charset'] = encoding + else + meta = XML::Node.new('meta', self) + if dtd = internal_subset and dtd.html5_dtd? + meta['charset'] = encoding + else + meta['http-equiv'] = 'Content-Type' + meta['content'] = 'text/html; charset=%s' % encoding + end + + case + when head = at('//head') + head.prepend_child(meta) + else + set_metadata_element(meta) + end + encoding + end + end + + def meta_content_type + xpath('//meta[@http-equiv and boolean(@content)]').find { |node| + node['http-equiv'] =~ /\AContent-Type\z/i + } + end + private :meta_content_type + + ### + # Get the title string of this document. Return nil if there is + # no title tag. + def title + title = at('//title') and title.inner_text + end + + ### + # Set the title string of this document. + # + # If a title element is already present, its content is replaced + # with the given text. + # + # Otherwise, this method tries to create one at an appropriate + # place supplying head and/or html elements as necessary, which + # is inside a head element if any, right after a meta + # encoding/charset tag if any, and before any text node or + # content element (typically <body>) if any. + def title=(text) + tnode = XML::Text.new(text, self) + if title = at('//title') + title.children = tnode + return text + end + + title = XML::Node.new('title', self) << tnode + case + when head = at('//head') + head << title + when meta = at('//meta[@charset]') || meta_content_type + # better put after charset declaration + meta.add_next_sibling(title) + else + set_metadata_element(title) + end + text + end + + def set_metadata_element(element) + case + when head = at('//head') + head << element + when html = at('//html') + head = html.prepend_child(XML::Node.new('head', self)) + head.prepend_child(element) + when first = children.find { |node| + case node + when XML::Element, XML::Text + true + end + } + # We reach here only if the underlying document model + # allows <html>/<head> elements to be omitted and does not + # automatically supply them. + first.add_previous_sibling(element) + else + html = add_child(XML::Node.new('html', self)) + head = html.add_child(XML::Node.new('head', self)) + head.prepend_child(element) + end + end + private :set_metadata_element + + #### + # Serialize Node using +options+. Save options can also be set using a + # block. See SaveOptions. + # + # These two statements are equivalent: + # + # node.serialize(:encoding => 'UTF-8', :save_with => FORMAT | AS_XML) + # + # or + # + # node.serialize(:encoding => 'UTF-8') do |config| + # config.format.as_xml + # end + # + def serialize options = {} + options[:save_with] ||= XML::Node::SaveOptions::DEFAULT_HTML + super + end + + #### + # Create a Nokogiri::XML::DocumentFragment from +tags+ + def fragment tags = nil + DocumentFragment.new(self, tags, self.root) + end + + class << self + ### + # Parse HTML. +string_or_io+ may be a String, or any object that + # responds to _read_ and _close_ such as an IO, or StringIO. + # +url+ is resource where this document is located. +encoding+ is the + # encoding that should be used when processing the document. +options+ + # is a number that sets options in the parser, such as + # Nokogiri::XML::ParseOptions::RECOVER. See the constants in + # Nokogiri::XML::ParseOptions. + def parse string_or_io, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML + options = Nokogiri::XML::ParseOptions.new(options) if Integer === options + + yield options if block_given? + + url ||= string_or_io.respond_to?(:path) ? string_or_io.path : nil + + if string_or_io.respond_to?(:encoding) + unless string_or_io.encoding.name == "ASCII-8BIT" + encoding ||= string_or_io.encoding.name + end + end + + if string_or_io.respond_to?(:read) + if string_or_io.is_a?(Pathname) + # resolve the Pathname to the file and open it as an IO object, see #2110 + string_or_io = string_or_io.expand_path.open + url ||= string_or_io.path + end + + unless encoding + # Libxml2's parser has poor support for encoding + # detection. First, it does not recognize the HTML5 + # style meta charset declaration. Secondly, even if it + # successfully detects an encoding hint, it does not + # re-decode or re-parse the preceding part which may be + # garbled. + # + # EncodingReader aims to perform advanced encoding + # detection beyond what Libxml2 does, and to emulate + # rewinding of a stream and make Libxml2 redo parsing + # from the start when an encoding hint is found. + string_or_io = EncodingReader.new(string_or_io) + begin + return read_io(string_or_io, url, encoding, options.to_i) + rescue EncodingFound => e + encoding = e.found_encoding + end + end + return read_io(string_or_io, url, encoding, options.to_i) + end + + # read_memory pukes on empty docs + if string_or_io.nil? or string_or_io.empty? + return encoding ? new.tap { |i| i.encoding = encoding } : new + end + + encoding ||= EncodingReader.detect_encoding(string_or_io) + + read_memory(string_or_io, url, encoding, options.to_i) + end + end + + class EncodingFound < StandardError # :nodoc: + attr_reader :found_encoding + + def initialize(encoding) + @found_encoding = encoding + super("encoding found: %s" % encoding) + end + end + + class EncodingReader # :nodoc: + class SAXHandler < Nokogiri::XML::SAX::Document # :nodoc: + attr_reader :encoding + + def initialize + @encoding = nil + super() + end + + def start_element(name, attrs = []) + return unless name == 'meta' + attr = Hash[attrs] + charset = attr['charset'] and + @encoding = charset + http_equiv = attr['http-equiv'] and + http_equiv.match(/\AContent-Type\z/i) and + content = attr['content'] and + m = content.match(/;\s*charset\s*=\s*([\w-]+)/) and + @encoding = m[1] + end + end + + class JumpSAXHandler < SAXHandler + def initialize(jumptag) + @jumptag = jumptag + super() + end + + def start_element(name, attrs = []) + super + throw @jumptag, @encoding if @encoding + throw @jumptag, nil if name =~ /\A(?:div|h1|img|p|br)\z/ + end + end + + def self.detect_encoding(chunk) + m = chunk.match(/\A(<\?xml[ \t\r\n]+[^>]*>)/) and + return Nokogiri.XML(m[1]).encoding + + if Nokogiri.jruby? + m = chunk.match(/(<meta\s)(.*)(charset\s*=\s*([\w-]+))(.*)/i) and + return m[4] + catch(:encoding_found) { + Nokogiri::HTML::SAX::Parser.new(JumpSAXHandler.new(:encoding_found)).parse(chunk) + nil + } + else + handler = SAXHandler.new + parser = Nokogiri::HTML::SAX::PushParser.new(handler) + parser << chunk rescue Nokogiri::SyntaxError + handler.encoding + end + end + + def initialize(io) + @io = io + @firstchunk = nil + @encoding_found = nil + end + + # This method is used by the C extension so that + # Nokogiri::HTML::Document#read_io() does not leak memory when + # EncodingFound is raised. + attr_reader :encoding_found + + def read(len) + # no support for a call without len + + if !@firstchunk + @firstchunk = @io.read(len) or return nil + + # This implementation expects that the first call from + # htmlReadIO() is made with a length long enough (~1KB) to + # achieve advanced encoding detection. + if encoding = EncodingReader.detect_encoding(@firstchunk) + # The first chunk is stored for the next read in retry. + raise @encoding_found = EncodingFound.new(encoding) + end + end + @encoding_found = nil + + ret = @firstchunk.slice!(0, len) + if (len -= ret.length) > 0 + rest = @io.read(len) and ret << rest + end + if ret.empty? + nil + else + ret + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/document_fragment.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/document_fragment.rb new file mode 100644 index 000000000000..ce85cd78e337 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/document_fragment.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true +module Nokogiri + module HTML + class DocumentFragment < Nokogiri::XML::DocumentFragment + #### + # Create a Nokogiri::XML::DocumentFragment from +tags+, using +encoding+ + def self.parse(tags, encoding = nil) + doc = HTML::Document.new + + encoding ||= if tags.respond_to?(:encoding) + encoding = tags.encoding + if encoding == ::Encoding::ASCII_8BIT + 'UTF-8' + else + encoding.name + end + else + 'UTF-8' + end + + doc.encoding = encoding + + new(doc, tags) + end + + def initialize(document, tags = nil, ctx = nil) + return self unless tags + + if ctx + preexisting_errors = document.errors.dup + node_set = ctx.parse("<div>#{tags}</div>") + node_set.first.children.each { |child| child.parent = self } unless node_set.empty? + self.errors = document.errors - preexisting_errors + else + # This is a horrible hack, but I don't care + path = if /^\s*?<body/i.match?(tags) + "/html/body" + else + "/html/body/node()" + end + + temp_doc = HTML::Document.parse("<html><body>#{tags}", nil, document.encoding) + temp_doc.xpath(path).each { |child| child.parent = self } + self.errors = temp_doc.errors + end + children + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/element_description.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/element_description.rb new file mode 100644 index 000000000000..6c415774dac3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/element_description.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +module Nokogiri + module HTML + class ElementDescription + ### + # Is this element a block element? + def block? + !inline? + end + + ### + # Convert this description to a string + def to_s + "#{name}: #{description}" + end + + ### + # Inspection information + def inspect + "#<#{self.class.name}: #{name} #{description}>" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/element_description_defaults.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/element_description_defaults.rb new file mode 100644 index 000000000000..6763cd496ea6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/element_description_defaults.rb @@ -0,0 +1,672 @@ +# frozen_string_literal: true +module Nokogiri + module HTML + class ElementDescription + + # Methods are defined protected by method_defined? because at + # this point the C-library or Java library is already loaded, + # and we don't want to clobber any methods that have been + # defined there. + + Desc = Struct.new("HTMLElementDescription", :name, + :startTag, :endTag, :saveEndTag, + :empty, :depr, :dtd, :isinline, + :desc, + :subelts, :defaultsubelt, + :attrs_opt, :attrs_depr, :attrs_req) + + # This is filled in down below. + DefaultDescriptions = Hash.new() + + def default_desc + DefaultDescriptions[name.downcase] + end + private :default_desc + + unless method_defined? :implied_start_tag? + def implied_start_tag? + d = default_desc + d ? d.startTag : nil + end + end + + unless method_defined? :implied_end_tag? + def implied_end_tag? + d = default_desc + d ? d.endTag : nil + end + end + + unless method_defined? :save_end_tag? + def save_end_tag? + d = default_desc + d ? d.saveEndTag : nil + end + end + + unless method_defined? :deprecated? + def deprecated? + d = default_desc + d ? d.depr : nil + end + end + + unless method_defined? :description + def description + d = default_desc + d ? d.desc : nil + end + end + + unless method_defined? :default_sub_element + def default_sub_element + d = default_desc + d ? d.defaultsubelt : nil + end + end + + unless method_defined? :optional_attributes + def optional_attributes + d = default_desc + d ? d.attrs_opt : [] + end + end + + unless method_defined? :deprecated_attributes + def deprecated_attributes + d = default_desc + d ? d.attrs_depr : [] + end + end + + unless method_defined? :required_attributes + def required_attributes + d = default_desc + d ? d.attrs_req : [] + end + end + + ### + # Default Element Descriptions (HTML 4.0) copied from + # libxml2/HTMLparser.c and libxml2/include/libxml/HTMLparser.h + # + # The copyright notice for those files and the following list of + # element and attribute descriptions is reproduced here: + # + # Except where otherwise noted in the source code (e.g. the + # files hash.c, list.c and the trio files, which are covered by + # a similar licence but with different Copyright notices) all + # the files are: + # + # Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved. + # + # Permission is hereby granted, free of charge, to any person + # obtaining a copy of this software and associated documentation + # files (the "Software"), to deal in the Software without + # restriction, including without limitation the rights to use, + # copy, modify, merge, publish, distribute, sublicense, and/or + # sell copies of the Software, and to permit persons to whom the + # Software is fur- nished to do so, subject to the following + # conditions: + + # The above copyright notice and this permission notice shall be + # included in all copies or substantial portions of the + # Software. + + # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + # WARRANTIES OF MERCHANTABILITY, FIT- NESS FOR A PARTICULAR + # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE DANIEL + # VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + # FROM, OUT OF OR IN CON- NECTION WITH THE SOFTWARE OR THE USE + # OR OTHER DEALINGS IN THE SOFTWARE. + + # Except as contained in this notice, the name of Daniel + # Veillard shall not be used in advertising or otherwise to + # promote the sale, use or other deal- ings in this Software + # without prior written authorization from him. + + # Attributes defined and categorized + FONTSTYLE = ["tt", "i", "b", "u", "s", "strike", "big", "small"] + PHRASE = ['em', 'strong', 'dfn', 'code', 'samp', + 'kbd', 'var', 'cite', 'abbr', 'acronym'] + SPECIAL = ['a', 'img', 'applet', 'embed', 'object', 'font','basefont', + 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', + 'iframe'] + PCDATA = [] + HEADING = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] + LIST = ['ul', 'ol', 'dir', 'menu'] + FORMCTRL = ['input', 'select', 'textarea', 'label', 'button'] + BLOCK = [HEADING, LIST, 'pre', 'p', 'dl', 'div', 'center', 'noscript', + 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', + 'fieldset', 'address'] + INLINE = [PCDATA, FONTSTYLE, PHRASE, SPECIAL, FORMCTRL] + FLOW = [BLOCK, INLINE] + MODIFIER = [] + EMPTY = [] + + HTML_FLOW = FLOW + HTML_INLINE = INLINE + HTML_PCDATA = PCDATA + HTML_CDATA = HTML_PCDATA + + COREATTRS = ['id', 'class', 'style', 'title'] + I18N = ['lang', 'dir'] + EVENTS = ['onclick', 'ondblclick', 'onmousedown', 'onmouseup', + 'onmouseover', 'onmouseout', 'onkeypress', 'onkeydown', + 'onkeyup'] + ATTRS = [COREATTRS, I18N,EVENTS] + CELLHALIGN = ['align', 'char', 'charoff'] + CELLVALIGN = ['valign'] + + HTML_ATTRS = ATTRS + CORE_I18N_ATTRS = [COREATTRS, I18N] + CORE_ATTRS = COREATTRS + I18N_ATTRS = I18N + + + A_ATTRS = [ATTRS, 'charset', 'type', 'name', + 'href', 'hreflang', 'rel', 'rev', 'accesskey', 'shape', + 'coords', 'tabindex', 'onfocus', 'onblur'] + TARGET_ATTR = ['target'] + ROWS_COLS_ATTR = ['rows', 'cols'] + ALT_ATTR = ['alt'] + SRC_ALT_ATTRS = ['src', 'alt'] + HREF_ATTRS = ['href'] + CLEAR_ATTRS = ['clear'] + INLINE_P = [INLINE, 'p'] + + FLOW_PARAM = [FLOW, 'param'] + APPLET_ATTRS = [COREATTRS , 'codebase', + 'archive', 'alt', 'name', 'height', 'width', 'align', + 'hspace', 'vspace'] + AREA_ATTRS = ['shape', 'coords', 'href', 'nohref', + 'tabindex', 'accesskey', 'onfocus', 'onblur'] + BASEFONT_ATTRS = ['id', 'size', 'color', 'face'] + QUOTE_ATTRS = [ATTRS, 'cite'] + BODY_CONTENTS = [FLOW, 'ins', 'del'] + BODY_ATTRS = [ATTRS, 'onload', 'onunload'] + BODY_DEPR = ['background', 'bgcolor', 'text', + 'link', 'vlink', 'alink'] + BUTTON_ATTRS = [ATTRS, 'name', 'value', 'type', + 'disabled', 'tabindex', 'accesskey', 'onfocus', 'onblur'] + + + COL_ATTRS = [ATTRS, 'span', 'width', CELLHALIGN, CELLVALIGN] + COL_ELT = ['col'] + EDIT_ATTRS = [ATTRS, 'datetime', 'cite'] + COMPACT_ATTRS = [ATTRS, 'compact'] + DL_CONTENTS = ['dt', 'dd'] + COMPACT_ATTR = ['compact'] + LABEL_ATTR = ['label'] + FIELDSET_CONTENTS = [FLOW, 'legend' ] + FONT_ATTRS = [COREATTRS, I18N, 'size', 'color', 'face' ] + FORM_CONTENTS = [HEADING, LIST, INLINE, 'pre', 'p', 'div', 'center', + 'noscript', 'noframes', 'blockquote', 'isindex', 'hr', + 'table', 'fieldset', 'address'] + FORM_ATTRS = [ATTRS, 'method', 'enctype', 'accept', 'name', 'onsubmit', + 'onreset', 'accept-charset'] + FRAME_ATTRS = [COREATTRS, 'longdesc', 'name', 'src', 'frameborder', + 'marginwidth', 'marginheight', 'noresize', 'scrolling' ] + FRAMESET_ATTRS = [COREATTRS, 'rows', 'cols', 'onload', 'onunload'] + FRAMESET_CONTENTS = ['frameset', 'frame', 'noframes'] + HEAD_ATTRS = [I18N, 'profile'] + HEAD_CONTENTS = ['title', 'isindex', 'base', 'script', 'style', 'meta', + 'link', 'object'] + HR_DEPR = ['align', 'noshade', 'size', 'width'] + VERSION_ATTR = ['version'] + HTML_CONTENT = ['head', 'body', 'frameset'] + IFRAME_ATTRS = [COREATTRS, 'longdesc', 'name', 'src', 'frameborder', + 'marginwidth', 'marginheight', 'scrolling', 'align', + 'height', 'width'] + IMG_ATTRS = [ATTRS, 'longdesc', 'name', 'height', 'width', 'usemap', + 'ismap'] + EMBED_ATTRS = [COREATTRS, 'align', 'alt', 'border', 'code', 'codebase', + 'frameborder', 'height', 'hidden', 'hspace', 'name', + 'palette', 'pluginspace', 'pluginurl', 'src', 'type', + 'units', 'vspace', 'width'] + INPUT_ATTRS = [ATTRS, 'type', 'name', 'value', 'checked', 'disabled', + 'readonly', 'size', 'maxlength', 'src', 'alt', 'usemap', + 'ismap', 'tabindex', 'accesskey', 'onfocus', 'onblur', + 'onselect', 'onchange', 'accept'] + PROMPT_ATTRS = [COREATTRS, I18N, 'prompt'] + LABEL_ATTRS = [ATTRS, 'for', 'accesskey', 'onfocus', 'onblur'] + LEGEND_ATTRS = [ATTRS, 'accesskey'] + ALIGN_ATTR = ['align'] + LINK_ATTRS = [ATTRS, 'charset', 'href', 'hreflang', 'type', 'rel', 'rev', + 'media'] + MAP_CONTENTS = [BLOCK, 'area'] + NAME_ATTR = ['name'] + ACTION_ATTR = ['action'] + BLOCKLI_ELT = [BLOCK, 'li'] + META_ATTRS = [I18N, 'http-equiv', 'name', 'scheme'] + CONTENT_ATTR = ['content'] + TYPE_ATTR = ['type'] + NOFRAMES_CONTENT = ['body', FLOW, MODIFIER] + OBJECT_CONTENTS = [FLOW, 'param'] + OBJECT_ATTRS = [ATTRS, 'declare', 'classid', 'codebase', 'data', 'type', + 'codetype', 'archive', 'standby', 'height', 'width', + 'usemap', 'name', 'tabindex'] + OBJECT_DEPR = ['align', 'border', 'hspace', 'vspace'] + OL_ATTRS = ['type', 'compact', 'start'] + OPTION_ELT = ['option'] + OPTGROUP_ATTRS = [ATTRS, 'disabled'] + OPTION_ATTRS = [ATTRS, 'disabled', 'label', 'selected', 'value'] + PARAM_ATTRS = ['id', 'value', 'valuetype', 'type'] + WIDTH_ATTR = ['width'] + PRE_CONTENT = [PHRASE, 'tt', 'i', 'b', 'u', 's', 'strike', 'a', 'br', + 'script', 'map', 'q', 'span', 'bdo', 'iframe'] + SCRIPT_ATTRS = ['charset', 'src', 'defer', 'event', 'for'] + LANGUAGE_ATTR = ['language'] + SELECT_CONTENT = ['optgroup', 'option'] + SELECT_ATTRS = [ATTRS, 'name', 'size', 'multiple', 'disabled', 'tabindex', + 'onfocus', 'onblur', 'onchange'] + STYLE_ATTRS = [I18N, 'media', 'title'] + TABLE_ATTRS = [ATTRS, 'summary', 'width', 'border', 'frame', 'rules', + 'cellspacing', 'cellpadding', 'datapagesize'] + TABLE_DEPR = ['align', 'bgcolor'] + TABLE_CONTENTS = ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody', + 'tr'] + TR_ELT = ['tr'] + TALIGN_ATTRS = [ATTRS, CELLHALIGN, CELLVALIGN] + TH_TD_DEPR = ['nowrap', 'bgcolor', 'width', 'height'] + TH_TD_ATTR = [ATTRS, 'abbr', 'axis', 'headers', 'scope', 'rowspan', + 'colspan', CELLHALIGN, CELLVALIGN] + TEXTAREA_ATTRS = [ATTRS, 'name', 'disabled', 'readonly', 'tabindex', + 'accesskey', 'onfocus', 'onblur', 'onselect', + 'onchange'] + TR_CONTENTS = ['th', 'td'] + BGCOLOR_ATTR = ['bgcolor'] + LI_ELT = ['li'] + UL_DEPR = ['type', 'compact'] + DIR_ATTR = ['dir'] + + [ + ['a', false, false, false, false, false, :any, true, + 'anchor ', + HTML_INLINE, nil, A_ATTRS, TARGET_ATTR, [] + ], + ['abbr', false, false, false, false, false, :any, true, + 'abbreviated form', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['acronym', false, false, false, false, false, :any, true, '', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['address', false, false, false, false, false, :any, false, + 'information on author', + INLINE_P , nil, HTML_ATTRS, [], [] + ], + ['applet', false, false, false, false, true, :loose, true, + 'java applet ', + FLOW_PARAM, nil, [], APPLET_ATTRS, [] + ], + ['area', false, true, true, true, false, :any, false, + 'client-side image map area ', + EMPTY, nil, AREA_ATTRS, TARGET_ATTR, ALT_ATTR + ], + ['b', false, true, false, false, false, :any, true, + 'bold text style', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['base', false, true, true, true, false, :any, false, + 'document base uri ', + EMPTY, nil, [], TARGET_ATTR, HREF_ATTRS + ], + ['basefont', false, true, true, true, true, :loose, true, + 'base font size ', + EMPTY, nil, [], BASEFONT_ATTRS, [] + ], + ['bdo', false, false, false, false, false, :any, true, + 'i18n bidi over-ride ', + HTML_INLINE, nil, CORE_I18N_ATTRS, [], DIR_ATTR + ], + ['big', false, true, false, false, false, :any, true, + 'large text style', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['blockquote', false, false, false, false, false, :any, false, + 'long quotation ', + HTML_FLOW, nil, QUOTE_ATTRS, [], [] + ], + ['body', true, true, false, false, false, :any, false, + 'document body ', + BODY_CONTENTS, 'div', BODY_ATTRS, BODY_DEPR, [] + ], + ['br', false, true, true, true, false, :any, true, + 'forced line break ', + EMPTY, nil, CORE_ATTRS, CLEAR_ATTRS, [] + ], + ['button', false, false, false, false, false, :any, true, + 'push button ', + [HTML_FLOW, MODIFIER], nil, BUTTON_ATTRS, [], [] + ], + ['caption', false, false, false, false, false, :any, false, + 'table caption ', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['center', false, true, false, false, true, :loose, false, + 'shorthand for div align=center ', + HTML_FLOW, nil, [], HTML_ATTRS, [] + ], + ['cite', false, false, false, false, false, :any, true, 'citation', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['code', false, false, false, false, false, :any, true, + 'computer code fragment', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['col', false, true, true, true, false, :any, false, 'table column ', + EMPTY, nil, COL_ATTRS, [], [] + ], + ['colgroup', false, true, false, false, false, :any, false, + 'table column group ', + COL_ELT, 'col', COL_ATTRS, [], [] + ], + ['dd', false, true, false, false, false, :any, false, + 'definition description ', + HTML_FLOW, nil, HTML_ATTRS, [], [] + ], + ['del', false, false, false, false, false, :any, true, + 'deleted text ', + HTML_FLOW, nil, EDIT_ATTRS, [], [] + ], + ['dfn', false, false, false, false, false, :any, true, + 'instance definition', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['dir', false, false, false, false, true, :loose, false, + 'directory list', + BLOCKLI_ELT, 'li', [], COMPACT_ATTRS, [] + ], + ['div', false, false, false, false, false, :any, false, + 'generic language/style container', + HTML_FLOW, nil, HTML_ATTRS, ALIGN_ATTR, [] + ], + ['dl', false, false, false, false, false, :any, false, + 'definition list ', + DL_CONTENTS, 'dd', HTML_ATTRS, COMPACT_ATTR, [] + ], + ['dt', false, true, false, false, false, :any, false, + 'definition term ', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['em', false, true, false, false, false, :any, true, + 'emphasis', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['embed', false, true, false, false, true, :loose, true, + 'generic embedded object ', + EMPTY, nil, EMBED_ATTRS, [], [] + ], + ['fieldset', false, false, false, false, false, :any, false, + 'form control group ', + FIELDSET_CONTENTS, nil, HTML_ATTRS, [], [] + ], + ['font', false, true, false, false, true, :loose, true, + 'local change to font ', + HTML_INLINE, nil, [], FONT_ATTRS, [] + ], + ['form', false, false, false, false, false, :any, false, + 'interactive form ', + FORM_CONTENTS, 'fieldset', FORM_ATTRS, TARGET_ATTR, ACTION_ATTR + ], + ['frame', false, true, true, true, false, :frameset, false, + 'subwindow ', + EMPTY, nil, [], FRAME_ATTRS, [] + ], + ['frameset', false, false, false, false, false, :frameset, false, + 'window subdivision', + FRAMESET_CONTENTS, 'noframes', [], FRAMESET_ATTRS, [] + ], + ['htrue', false, false, false, false, false, :any, false, + 'heading ', + HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [] + ], + ['htrue', false, false, false, false, false, :any, false, + 'heading ', + HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [] + ], + ['htrue', false, false, false, false, false, :any, false, + 'heading ', + HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [] + ], + ['h4', false, false, false, false, false, :any, false, + 'heading ', + HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [] + ], + ['h5', false, false, false, false, false, :any, false, + 'heading ', + HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [] + ], + ['h6', false, false, false, false, false, :any, false, + 'heading ', + HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [] + ], + ['head', true, true, false, false, false, :any, false, + 'document head ', + HEAD_CONTENTS, nil, HEAD_ATTRS, [], [] + ], + ['hr', false, true, true, true, false, :any, false, + 'horizontal rule ', + EMPTY, nil, HTML_ATTRS, HR_DEPR, [] + ], + ['html', true, true, false, false, false, :any, false, + 'document root element ', + HTML_CONTENT, nil, I18N_ATTRS, VERSION_ATTR, [] + ], + ['i', false, true, false, false, false, :any, true, + 'italic text style', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['iframe', false, false, false, false, false, :any, true, + 'inline subwindow ', + HTML_FLOW, nil, [], IFRAME_ATTRS, [] + ], + ['img', false, true, true, true, false, :any, true, + 'embedded image ', + EMPTY, nil, IMG_ATTRS, ALIGN_ATTR, SRC_ALT_ATTRS + ], + ['input', false, true, true, true, false, :any, true, + 'form control ', + EMPTY, nil, INPUT_ATTRS, ALIGN_ATTR, [] + ], + ['ins', false, false, false, false, false, :any, true, + 'inserted text', + HTML_FLOW, nil, EDIT_ATTRS, [], [] + ], + ['isindex', false, true, true, true, true, :loose, false, + 'single line prompt ', + EMPTY, nil, [], PROMPT_ATTRS, [] + ], + ['kbd', false, false, false, false, false, :any, true, + 'text to be entered by the user', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['label', false, false, false, false, false, :any, true, + 'form field label text ', + [HTML_INLINE, MODIFIER], nil, LABEL_ATTRS, [], [] + ], + ['legend', false, false, false, false, false, :any, false, + 'fieldset legend ', + HTML_INLINE, nil, LEGEND_ATTRS, ALIGN_ATTR, [] + ], + ['li', false, true, true, false, false, :any, false, + 'list item ', + HTML_FLOW, nil, HTML_ATTRS, [], [] + ], + ['link', false, true, true, true, false, :any, false, + 'a media-independent link ', + EMPTY, nil, LINK_ATTRS, TARGET_ATTR, [] + ], + ['map', false, false, false, false, false, :any, true, + 'client-side image map ', + MAP_CONTENTS, nil, HTML_ATTRS, [], NAME_ATTR + ], + ['menu', false, false, false, false, true, :loose, false, + 'menu list ', + BLOCKLI_ELT, nil, [], COMPACT_ATTRS, [] + ], + ['meta', false, true, true, true, false, :any, false, + 'generic metainformation ', + EMPTY, nil, META_ATTRS, [], CONTENT_ATTR + ], + ['noframes', false, false, false, false, false, :frameset, false, + 'alternate content container for non frame-based rendering ', + NOFRAMES_CONTENT, 'body', HTML_ATTRS, [], [] + ], + ['noscript', false, false, false, false, false, :any, false, + 'alternate content container for non script-based rendering ', + HTML_FLOW, 'div', HTML_ATTRS, [], [] + ], + ['object', false, false, false, false, false, :any, true, + 'generic embedded object ', + OBJECT_CONTENTS, 'div', OBJECT_ATTRS, OBJECT_DEPR, [] + ], + ['ol', false, false, false, false, false, :any, false, + 'ordered list ', + LI_ELT, 'li', HTML_ATTRS, OL_ATTRS, [] + ], + ['optgroup', false, false, false, false, false, :any, false, + 'option group ', + OPTION_ELT, 'option', OPTGROUP_ATTRS, [], LABEL_ATTR + ], + ['option', false, true, false, false, false, :any, false, + 'selectable choice ', + HTML_PCDATA, nil, OPTION_ATTRS, [], [] + ], + ['p', false, true, false, false, false, :any, false, + 'paragraph ', + HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [] + ], + ['param', false, true, true, true, false, :any, false, + 'named property value ', + EMPTY, nil, PARAM_ATTRS, [], NAME_ATTR + ], + ['pre', false, false, false, false, false, :any, false, + 'preformatted text ', + PRE_CONTENT, nil, HTML_ATTRS, WIDTH_ATTR, [] + ], + ['q', false, false, false, false, false, :any, true, + 'short inline quotation ', + HTML_INLINE, nil, QUOTE_ATTRS, [], [] + ], + ['s', false, true, false, false, true, :loose, true, + 'strike-through text style', + HTML_INLINE, nil, [], HTML_ATTRS, [] + ], + ['samp', false, false, false, false, false, :any, true, + 'sample program output, scripts, etc.', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['script', false, false, false, false, false, :any, true, + 'script statements ', + HTML_CDATA, nil, SCRIPT_ATTRS, LANGUAGE_ATTR, TYPE_ATTR + ], + ['select', false, false, false, false, false, :any, true, + 'option selector ', + SELECT_CONTENT, nil, SELECT_ATTRS, [], [] + ], + ['small', false, true, false, false, false, :any, true, + 'small text style', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['span', false, false, false, false, false, :any, true, + 'generic language/style container ', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['strike', false, true, false, false, true, :loose, true, + 'strike-through text', + HTML_INLINE, nil, [], HTML_ATTRS, [] + ], + ['strong', false, true, false, false, false, :any, true, + 'strong emphasis', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['style', false, false, false, false, false, :any, false, + 'style info ', + HTML_CDATA, nil, STYLE_ATTRS, [], TYPE_ATTR + ], + ['sub', false, true, false, false, false, :any, true, + 'subscript', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['sup', false, true, false, false, false, :any, true, + 'superscript ', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['table', false, false, false, false, false, :any, false, + '', + TABLE_CONTENTS, 'tr', TABLE_ATTRS, TABLE_DEPR, [] + ], + ['tbody', true, false, false, false, false, :any, false, + 'table body ', + TR_ELT, 'tr', TALIGN_ATTRS, [], [] + ], + ['td', false, false, false, false, false, :any, false, + 'table data cell', + HTML_FLOW, nil, TH_TD_ATTR, TH_TD_DEPR, [] + ], + ['textarea', false, false, false, false, false, :any, true, + 'multi-line text field ', + HTML_PCDATA, nil, TEXTAREA_ATTRS, [], ROWS_COLS_ATTR + ], + ['tfoot', false, true, false, false, false, :any, false, + 'table footer ', + TR_ELT, 'tr', TALIGN_ATTRS, [], [] + ], + ['th', false, true, false, false, false, :any, false, + 'table header cell', + HTML_FLOW, nil, TH_TD_ATTR, TH_TD_DEPR, [] + ], + ['thead', false, true, false, false, false, :any, false, + 'table header ', + TR_ELT, 'tr', TALIGN_ATTRS, [], [] + ], + ['title', false, false, false, false, false, :any, false, + 'document title ', + HTML_PCDATA, nil, I18N_ATTRS, [], [] + ], + ['tr', false, false, false, false, false, :any, false, + 'table row ', + TR_CONTENTS, 'td', TALIGN_ATTRS, BGCOLOR_ATTR, [] + ], + ['tt', false, true, false, false, false, :any, true, + 'teletype or monospaced text style', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ], + ['u', false, true, false, false, true, :loose, true, + 'underlined text style', + HTML_INLINE, nil, [], HTML_ATTRS, [] + ], + ['ul', false, false, false, false, false, :any, false, + 'unordered list ', + LI_ELT, 'li', HTML_ATTRS, UL_DEPR, [] + ], + ['var', false, false, false, false, false, :any, true, + 'instance of a variable or program argument', + HTML_INLINE, nil, HTML_ATTRS, [], [] + ] + ].each do |descriptor| + name = descriptor[0] + + begin + d = Desc.new(*descriptor) + + # flatten all the attribute lists (Ruby1.9, *[a,b,c] can be + # used to flatten a literal list, but not in Ruby1.8). + d[:subelts] = d[:subelts].flatten + d[:attrs_opt] = d[:attrs_opt].flatten + d[:attrs_depr] = d[:attrs_depr].flatten + d[:attrs_req] = d[:attrs_req].flatten + rescue => e + p name + raise e + end + + DefaultDescriptions[name] = d + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/entity_lookup.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/entity_lookup.rb new file mode 100644 index 000000000000..bc66e41afe1e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/entity_lookup.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Nokogiri + module HTML + class EntityDescription < Struct.new(:value, :name, :description); end + + class EntityLookup + ### + # Look up entity with +name+ + def [] name + (val = get(name)) && val.value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/sax/parser.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/sax/parser.rb new file mode 100644 index 000000000000..16853e6957f6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/sax/parser.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true +module Nokogiri + module HTML + ### + # Nokogiri lets you write a SAX parser to process HTML but get HTML + # correction features. + # + # See Nokogiri::HTML::SAX::Parser for a basic example of using a + # SAX parser with HTML. + # + # For more information on SAX parsers, see Nokogiri::XML::SAX + module SAX + ### + # This class lets you perform SAX style parsing on HTML with HTML + # error correction. + # + # Here is a basic usage example: + # + # class MyDoc < Nokogiri::XML::SAX::Document + # def start_element name, attributes = [] + # puts "found a #{name}" + # end + # end + # + # parser = Nokogiri::HTML::SAX::Parser.new(MyDoc.new) + # parser.parse(File.read(ARGV[0], mode: 'rb')) + # + # For more information on SAX parsers, see Nokogiri::XML::SAX + class Parser < Nokogiri::XML::SAX::Parser + ### + # Parse html stored in +data+ using +encoding+ + def parse_memory data, encoding = 'UTF-8' + raise ArgumentError unless data + return unless data.length > 0 + ctx = ParserContext.memory(data, encoding) + yield ctx if block_given? + ctx.parse_with self + end + + ### + # Parse given +io+ + def parse_io io, encoding = 'UTF-8' + check_encoding(encoding) + @encoding = encoding + ctx = ParserContext.io(io, ENCODINGS[encoding]) + yield ctx if block_given? + ctx.parse_with self + end + + ### + # Parse a file with +filename+ + def parse_file filename, encoding = 'UTF-8' + raise ArgumentError unless filename + raise Errno::ENOENT unless File.exist?(filename) + raise Errno::EISDIR if File.directory?(filename) + ctx = ParserContext.file(filename, encoding) + yield ctx if block_given? + ctx.parse_with self + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/sax/parser_context.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/sax/parser_context.rb new file mode 100644 index 000000000000..5eb48ca3293f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/sax/parser_context.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +module Nokogiri + module HTML + module SAX + ### + # Context for HTML SAX parsers. This class is usually not instantiated + # by the user. Instead, you should be looking at + # Nokogiri::HTML::SAX::Parser + class ParserContext < Nokogiri::XML::SAX::ParserContext + def self.new thing, encoding = 'UTF-8' + [:read, :close].all? { |x| thing.respond_to?(x) } ? super : + memory(thing, encoding) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/sax/push_parser.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/sax/push_parser.rb new file mode 100644 index 000000000000..6054e00a271f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/html/sax/push_parser.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +module Nokogiri + module HTML + module SAX + class PushParser + + # The Nokogiri::HTML::SAX::Document on which the PushParser will be + # operating + attr_accessor :document + + def initialize(doc = HTML::SAX::Document.new, file_name = nil, encoding = 'UTF-8') + @document = doc + @encoding = encoding + @sax_parser = HTML::SAX::Parser.new(doc, @encoding) + + ## Create our push parser context + initialize_native(@sax_parser, file_name, encoding) + end + + ### + # Write a +chunk+ of HTML to the PushParser. Any callback methods + # that can be called will be called immediately. + def write chunk, last_chunk = false + native_write(chunk, last_chunk) + end + alias :<< :write + + ### + # Finish the parsing. This method is only necessary for + # Nokogiri::HTML::SAX::Document#end_document to be called. + def finish + write '', true + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/jruby/dependencies.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/jruby/dependencies.rb new file mode 100644 index 000000000000..f54b25fa4d8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/jruby/dependencies.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +# The line below caused a problem on non-GAE rack environment. +# unless defined?(JRuby::Rack::VERSION) || defined?(AppEngine::ApiProxy) +# +# However, simply cutting defined?(JRuby::Rack::VERSION) off resulted in +# an unable-to-load-nokogiri problem. Thus, now, Nokogiri checks the presense +# of appengine-rack.jar in $LOAD_PATH. If Nokogiri is on GAE, Nokogiri +# should skip loading xml jars. This is because those are in WEB-INF/lib and +# already set in the classpath. +unless $LOAD_PATH.to_s.include?("appengine-rack") + require 'stringio' + require 'isorelax.jar' + require 'jing.jar' + require 'nekohtml.jar' + require 'nekodtd.jar' + require 'xercesImpl.jar' + require 'serializer.jar' + require 'xalan.jar' + require 'xml-apis.jar' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/syntax_error.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/syntax_error.rb new file mode 100644 index 000000000000..ac0636f0725b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/syntax_error.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +module Nokogiri + class SyntaxError < ::StandardError + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/version.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/version.rb new file mode 100644 index 000000000000..1637b2ce51c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/version.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true +require_relative "version/constant" +require_relative "version/info" diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/version/constant.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/version/constant.rb new file mode 100644 index 000000000000..4add80694231 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/version/constant.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +module Nokogiri + # The version of Nokogiri you are using + VERSION = "1.11.4" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/version/info.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/version/info.rb new file mode 100644 index 000000000000..1bfea4290870 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/version/info.rb @@ -0,0 +1,205 @@ +# frozen_string_literal: true +require "singleton" +require "shellwords" + +module Nokogiri + class VersionInfo # :nodoc: + include Singleton + + def jruby? + ::JRUBY_VERSION if ::RUBY_PLATFORM == "java" + end + + def windows? + ::RUBY_PLATFORM =~ /mingw|mswin/ + end + + def ruby_minor + Gem::Version.new(::RUBY_VERSION).segments[0..1].join(".") + end + + def engine + defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : "mri" + end + + def loaded_libxml_version + Gem::Version.new(Nokogiri::LIBXML_LOADED_VERSION + .scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first + .collect(&:to_i) + .join(".")) + end + + def compiled_libxml_version + Gem::Version.new(Nokogiri::LIBXML_COMPILED_VERSION) + end + + def loaded_libxslt_version + Gem::Version.new(Nokogiri::LIBXSLT_LOADED_VERSION + .scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first + .collect(&:to_i) + .join(".")) + end + + def compiled_libxslt_version + Gem::Version.new(Nokogiri::LIBXSLT_COMPILED_VERSION) + end + + def libxml2? + defined?(Nokogiri::LIBXML_COMPILED_VERSION) + end + + def libxml2_has_iconv? + defined?(Nokogiri::LIBXML_ICONV_ENABLED) && Nokogiri::LIBXML_ICONV_ENABLED + end + + def libxml2_using_packaged? + libxml2? && Nokogiri::PACKAGED_LIBRARIES + end + + def libxml2_using_system? + libxml2? && !libxml2_using_packaged? + end + + def libxml2_precompiled? + libxml2_using_packaged? && Nokogiri::PRECOMPILED_LIBRARIES + end + + def warnings + warnings = [] + + if libxml2? + if compiled_libxml_version != loaded_libxml_version + warnings << "Nokogiri was built against libxml version #{compiled_libxml_version}, but has dynamically loaded #{loaded_libxml_version}" + end + + if compiled_libxslt_version != loaded_libxslt_version + warnings << "Nokogiri was built against libxslt version #{compiled_libxslt_version}, but has dynamically loaded #{loaded_libxslt_version}" + end + end + + warnings + end + + def to_hash + header_directory = File.expand_path(File.join(File.dirname(__FILE__), "../../../ext/nokogiri")) + + {}.tap do |vi| + vi["warnings"] = [] + vi["nokogiri"] = {}.tap do |nokogiri| + nokogiri["version"] = Nokogiri::VERSION + + unless jruby? + # enable gems like nokogumbo to build with the following in their extconf.rb: + # + # append_cflags(Nokogiri::VERSION_INFO["nokogiri"]["cppflags"]) + # append_ldflags(Nokogiri::VERSION_INFO["nokogiri"]["ldflags"]) + # + cppflags = ["-I#{header_directory.shellescape}"] + ldflags = [] + + if libxml2_using_packaged? + cppflags << "-I#{File.join(header_directory, 'include').shellescape}" + cppflags << "-I#{File.join(header_directory, 'include/libxml2').shellescape}" + + if windows? + # on windows, nokogumbo needs to link against nokogiri.so to resolve symbols. see #2167 + lib_directory = File.expand_path(File.join(File.dirname(__FILE__), "../#{ruby_minor}")) + unless File.exist?(lib_directory) + lib_directory = File.expand_path(File.join(File.dirname(__FILE__), "..")) + end + ldflags << "-L#{lib_directory.shellescape}" + ldflags << "-l:nokogiri.so" + end + end + + nokogiri["cppflags"] = cppflags + nokogiri["ldflags"] = ldflags + end + end + vi["ruby"] = {}.tap do |ruby| + ruby["version"] = ::RUBY_VERSION + ruby["platform"] = ::RUBY_PLATFORM + ruby["gem_platform"] = ::Gem::Platform.local.to_s + ruby["description"] = ::RUBY_DESCRIPTION + ruby["engine"] = engine + ruby["jruby"] = jruby? if jruby? + end + + if libxml2? + vi["libxml"] = {}.tap do |libxml| + if libxml2_using_packaged? + libxml["source"] = "packaged" + libxml["precompiled"] = libxml2_precompiled? + libxml["patches"] = Nokogiri::LIBXML2_PATCHES + + # this is for nokogumbo and shouldn't be forever + libxml["libxml2_path"] = header_directory + else + libxml["source"] = "system" + end + libxml["iconv_enabled"] = libxml2_has_iconv? + libxml["compiled"] = compiled_libxml_version.to_s + libxml["loaded"] = loaded_libxml_version.to_s + end + + vi["libxslt"] = {}.tap do |libxslt| + if libxml2_using_packaged? + libxslt["source"] = "packaged" + libxslt["precompiled"] = libxml2_precompiled? + libxslt["patches"] = Nokogiri::LIBXSLT_PATCHES + else + libxslt["source"] = "system" + end + libxslt["compiled"] = compiled_libxslt_version.to_s + libxslt["loaded"] = loaded_libxslt_version.to_s + end + + vi["warnings"] = warnings + end + + if defined?(Nokogiri::OTHER_LIBRARY_VERSIONS) + # see extconf for how this string is assembled: "lib1name:lib1version,lib2name:lib2version" + vi["other_libraries"] = Hash[*Nokogiri::OTHER_LIBRARY_VERSIONS.split(/[,:]/)] + elsif jruby? + vi["other_libraries"] = {}.tap do |ol| + ol["xerces"] = Nokogiri::XERCES_VERSION + ol["nekohtml"] = Nokogiri::NEKO_VERSION + end + end + end + end + + def to_markdown + begin + require "psych" + rescue LoadError + end + require "yaml" + "# Nokogiri (#{Nokogiri::VERSION})\n" + + YAML.dump(to_hash).each_line.map { |line| " #{line}" }.join + end + + instance.warnings.each do |warning| + warn "WARNING: #{warning}" + end + end + + def self.uses_libxml?(requirement = nil) # :nodoc: + return false unless VersionInfo.instance.libxml2? + return true unless requirement + Gem::Requirement.new(requirement).satisfied_by?(VersionInfo.instance.loaded_libxml_version) + end + + def self.jruby? # :nodoc: + VersionInfo.instance.jruby? + end + + # Ensure constants used in this file are loaded - see #1896 + if Nokogiri.jruby? + require "nokogiri/jruby/dependencies" + end + require "nokogiri/extension" + + # More complete version information about libxml + VERSION_INFO = VersionInfo.instance.to_hash +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml.rb new file mode 100644 index 000000000000..93a898b9517e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true +require 'nokogiri/xml/pp' +require 'nokogiri/xml/parse_options' +require 'nokogiri/xml/sax' +require 'nokogiri/xml/searchable' +require 'nokogiri/xml/node' +require 'nokogiri/xml/attribute_decl' +require 'nokogiri/xml/element_decl' +require 'nokogiri/xml/element_content' +require 'nokogiri/xml/character_data' +require 'nokogiri/xml/namespace' +require 'nokogiri/xml/attr' +require 'nokogiri/xml/dtd' +require 'nokogiri/xml/cdata' +require 'nokogiri/xml/text' +require 'nokogiri/xml/document' +require 'nokogiri/xml/document_fragment' +require 'nokogiri/xml/processing_instruction' +require 'nokogiri/xml/node_set' +require 'nokogiri/xml/syntax_error' +require 'nokogiri/xml/xpath' +require 'nokogiri/xml/xpath_context' +require 'nokogiri/xml/builder' +require 'nokogiri/xml/reader' +require 'nokogiri/xml/notation' +require 'nokogiri/xml/entity_decl' +require 'nokogiri/xml/entity_reference' +require 'nokogiri/xml/schema' +require 'nokogiri/xml/relax_ng' + +module Nokogiri + class << self + ### + # Parse XML. Convenience method for Nokogiri::XML::Document.parse + def XML thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_XML, &block + Nokogiri::XML::Document.parse(thing, url, encoding, options, &block) + end + end + + module XML + # Original C14N 1.0 spec canonicalization + XML_C14N_1_0 = 0 + # Exclusive C14N 1.0 spec canonicalization + XML_C14N_EXCLUSIVE_1_0 = 1 + # C14N 1.1 spec canonicalization + XML_C14N_1_1 = 2 + class << self + ### + # Parse an XML document using the Nokogiri::XML::Reader API. See + # Nokogiri::XML::Reader for mor information + def Reader string_or_io, url = nil, encoding = nil, options = ParseOptions::STRICT + + options = Nokogiri::XML::ParseOptions.new(options) if Integer === options + # Give the options to the user + yield options if block_given? + + if string_or_io.respond_to? :read + return Reader.from_io(string_or_io, url, encoding, options.to_i) + end + Reader.from_memory(string_or_io, url, encoding, options.to_i) + end + + ### + # Parse XML. Convenience method for Nokogiri::XML::Document.parse + def parse thing, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML, &block + Document.parse(thing, url, encoding, options, &block) + end + + #### + # Parse a fragment from +string+ in to a NodeSet. + def fragment string + XML::DocumentFragment.parse(string) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/attr.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/attr.rb new file mode 100644 index 000000000000..612ad4cdfb65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/attr.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class Attr < Node + alias :value :content + alias :to_s :content + alias :content= :value= + + private + def inspect_attributes + [:name, :namespace, :value] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/attribute_decl.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/attribute_decl.rb new file mode 100644 index 000000000000..934ce3ce934a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/attribute_decl.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true +module Nokogiri + module XML + ### + # Represents an attribute declaration in a DTD + class AttributeDecl < Nokogiri::XML::Node + undef_method :attribute_nodes + undef_method :attributes + undef_method :content + undef_method :namespace + undef_method :namespace_definitions + undef_method :line if method_defined?(:line) + + def inspect + "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{to_s.inspect}>" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/builder.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/builder.rb new file mode 100644 index 000000000000..1c7ed087fe8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/builder.rb @@ -0,0 +1,447 @@ +# frozen_string_literal: true +module Nokogiri + module XML + ### + # Nokogiri builder can be used for building XML and HTML documents. + # + # == Synopsis: + # + # builder = Nokogiri::XML::Builder.new do |xml| + # xml.root { + # xml.products { + # xml.widget { + # xml.id_ "10" + # xml.name "Awesome widget" + # } + # } + # } + # end + # puts builder.to_xml + # + # Will output: + # + # <?xml version="1.0"?> + # <root> + # <products> + # <widget> + # <id>10</id> + # <name>Awesome widget</name> + # </widget> + # </products> + # </root> + # + # + # === Builder scope + # + # The builder allows two forms. When the builder is supplied with a block + # that has a parameter, the outside scope is maintained. This means you + # can access variables that are outside your builder. If you don't need + # outside scope, you can use the builder without the "xml" prefix like + # this: + # + # builder = Nokogiri::XML::Builder.new do + # root { + # products { + # widget { + # id_ "10" + # name "Awesome widget" + # } + # } + # } + # end + # + # == Special Tags + # + # The builder works by taking advantage of method_missing. Unfortunately + # some methods are defined in ruby that are difficult or dangerous to + # remove. You may want to create tags with the name "type", "class", and + # "id" for example. In that case, you can use an underscore to + # disambiguate your tag name from the method call. + # + # Here is an example of using the underscore to disambiguate tag names from + # ruby methods: + # + # @objects = [Object.new, Object.new, Object.new] + # + # builder = Nokogiri::XML::Builder.new do |xml| + # xml.root { + # xml.objects { + # @objects.each do |o| + # xml.object { + # xml.type_ o.type + # xml.class_ o.class.name + # xml.id_ o.id + # } + # end + # } + # } + # end + # puts builder.to_xml + # + # The underscore may be used with any tag name, and the last underscore + # will just be removed. This code will output the following XML: + # + # <?xml version="1.0"?> + # <root> + # <objects> + # <object> + # <type>Object</type> + # <class>Object</class> + # <id>48390</id> + # </object> + # <object> + # <type>Object</type> + # <class>Object</class> + # <id>48380</id> + # </object> + # <object> + # <type>Object</type> + # <class>Object</class> + # <id>48370</id> + # </object> + # </objects> + # </root> + # + # == Tag Attributes + # + # Tag attributes may be supplied as method arguments. Here is our + # previous example, but using attributes rather than tags: + # + # @objects = [Object.new, Object.new, Object.new] + # + # builder = Nokogiri::XML::Builder.new do |xml| + # xml.root { + # xml.objects { + # @objects.each do |o| + # xml.object(:type => o.type, :class => o.class, :id => o.id) + # end + # } + # } + # end + # puts builder.to_xml + # + # === Tag Attribute Short Cuts + # + # A couple attribute short cuts are available when building tags. The + # short cuts are available by special method calls when building a tag. + # + # This example builds an "object" tag with the class attribute "classy" + # and the id of "thing": + # + # builder = Nokogiri::XML::Builder.new do |xml| + # xml.root { + # xml.objects { + # xml.object.classy.thing! + # } + # } + # end + # puts builder.to_xml + # + # Which will output: + # + # <?xml version="1.0"?> + # <root> + # <objects> + # <object class="classy" id="thing"/> + # </objects> + # </root> + # + # All other options are still supported with this syntax, including + # blocks and extra tag attributes. + # + # == Namespaces + # + # Namespaces are added similarly to attributes. Nokogiri::XML::Builder + # assumes that when an attribute starts with "xmlns", it is meant to be + # a namespace: + # + # builder = Nokogiri::XML::Builder.new { |xml| + # xml.root('xmlns' => 'default', 'xmlns:foo' => 'bar') do + # xml.tenderlove + # end + # } + # puts builder.to_xml + # + # Will output XML like this: + # + # <?xml version="1.0"?> + # <root xmlns:foo="bar" xmlns="default"> + # <tenderlove/> + # </root> + # + # === Referencing declared namespaces + # + # Tags that reference non-default namespaces (i.e. a tag "foo:bar") can be + # built by using the Nokogiri::XML::Builder#[] method. + # + # For example: + # + # builder = Nokogiri::XML::Builder.new do |xml| + # xml.root('xmlns:foo' => 'bar') { + # xml.objects { + # xml['foo'].object.classy.thing! + # } + # } + # end + # puts builder.to_xml + # + # Will output this XML: + # + # <?xml version="1.0"?> + # <root xmlns:foo="bar"> + # <objects> + # <foo:object class="classy" id="thing"/> + # </objects> + # </root> + # + # Note the "foo:object" tag. + # + # == Document Types + # + # To create a document type (DTD), access use the Builder#doc method to get + # the current context document. Then call Node#create_internal_subset to + # create the DTD node. + # + # For example, this Ruby: + # + # builder = Nokogiri::XML::Builder.new do |xml| + # xml.doc.create_internal_subset( + # 'html', + # "-//W3C//DTD HTML 4.01 Transitional//EN", + # "http://www.w3.org/TR/html4/loose.dtd" + # ) + # xml.root do + # xml.foo + # end + # end + # + # puts builder.to_xml + # + # Will output this xml: + # + # <?xml version="1.0"?> + # <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> + # <root> + # <foo/> + # </root> + # + class Builder + # The current Document object being built + attr_accessor :doc + + # The parent of the current node being built + attr_accessor :parent + + # A context object for use when the block has no arguments + attr_accessor :context + + attr_accessor :arity # :nodoc: + + ### + # Create a builder with an existing root object. This is for use when + # you have an existing document that you would like to augment with + # builder methods. The builder context created will start with the + # given +root+ node. + # + # For example: + # + # doc = Nokogiri::XML(File.read('somedoc.xml')) + # Nokogiri::XML::Builder.with(doc.at_css('some_tag')) do |xml| + # # ... Use normal builder methods here ... + # xml.awesome # add the "awesome" tag below "some_tag" + # end + # + def self.with(root, &block) + new({}, root, &block) + end + + ### + # Create a new Builder object. +options+ are sent to the top level + # Document that is being built. + # + # Building a document with a particular encoding for example: + # + # Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml| + # ... + # end + def initialize(options = {}, root = nil, &block) + if root + @doc = root.document + @parent = root + else + klassname = "::" + (self.class.name.split("::")[0..-2] + ["Document"]).join("::") + klass = begin + Object.const_get(klassname) + rescue NameError + Nokogiri::XML::Document + end + @parent = @doc = klass.new + end + + @context = nil + @arity = nil + @ns = nil + + options.each do |k, v| + @doc.send(:"#{k}=", v) + end + + return unless block_given? + + @arity = block.arity + if @arity <= 0 + @context = eval("self", block.binding) + instance_eval(&block) + else + yield self + end + + @parent = @doc + end + + ### + # Create a Text Node with content of +string+ + def text(string) + insert @doc.create_text_node(string) + end + + ### + # Create a CDATA Node with content of +string+ + def cdata(string) + insert doc.create_cdata(string) + end + + ### + # Create a Comment Node with content of +string+ + def comment(string) + insert doc.create_comment(string) + end + + ### + # Build a tag that is associated with namespace +ns+. Raises an + # ArgumentError if +ns+ has not been defined higher in the tree. + def [](ns) + if @parent != @doc + @ns = @parent.namespace_definitions.find { |x| x.prefix == ns.to_s } + end + return self if @ns + + @parent.ancestors.each do |a| + next if a == doc + @ns = a.namespace_definitions.find { |x| x.prefix == ns.to_s } + return self if @ns + end + + @ns = { :pending => ns.to_s } + return self + end + + ### + # Convert this Builder object to XML + def to_xml(*args) + if Nokogiri.jruby? + options = args.first.is_a?(Hash) ? args.shift : {} + if !options[:save_with] + options[:save_with] = Node::SaveOptions::AS_BUILDER + end + args.insert(0, options) + end + @doc.to_xml(*args) + end + + ### + # Append the given raw XML +string+ to the document + def <<(string) + @doc.fragment(string).children.each { |x| insert(x) } + end + + def method_missing(method, *args, &block) # :nodoc: + if @context && @context.respond_to?(method) + @context.send(method, *args, &block) + else + node = @doc.create_element(method.to_s.sub(/[_!]$/, ""), *args) { |n| + # Set up the namespace + if @ns.is_a? Nokogiri::XML::Namespace + n.namespace = @ns + @ns = nil + end + } + + if @ns.is_a? Hash + node.namespace = node.namespace_definitions.find { |x| x.prefix == @ns[:pending] } + if node.namespace.nil? + raise ArgumentError, "Namespace #{@ns[:pending]} has not been defined" + end + @ns = nil + end + + insert(node, &block) + end + end + + private + + ### + # Insert +node+ as a child of the current Node + def insert(node, &block) + node = @parent.add_child(node) + if block_given? + old_parent = @parent + @parent = node + @arity ||= block.arity + if @arity <= 0 + instance_eval(&block) + else + block.call(self) + end + @parent = old_parent + end + NodeBuilder.new(node, self) + end + + class NodeBuilder # :nodoc: + def initialize(node, doc_builder) + @node = node + @doc_builder = doc_builder + end + + def []=(k, v) + @node[k] = v + end + + def [](k) + @node[k] + end + + def method_missing(method, *args, &block) + opts = args.last.is_a?(Hash) ? args.pop : {} + case method.to_s + when /^(.*)!$/ + @node["id"] = $1 + @node.content = args.first if args.first + when /^(.*)=/ + @node[$1] = args.first + else + @node["class"] = + ((@node["class"] || "").split(/\s/) + [method.to_s]).join(" ") + @node.content = args.first if args.first + end + + # Assign any extra options + opts.each do |k, v| + @node[k.to_s] = ((@node[k.to_s] || "").split(/\s/) + [v]).join(" ") + end + + if block_given? + old_parent = @doc_builder.parent + @doc_builder.parent = @node + value = @doc_builder.instance_eval(&block) + @doc_builder.parent = old_parent + return value + end + self + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/cdata.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/cdata.rb new file mode 100644 index 000000000000..071c90ec745f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/cdata.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class CDATA < Nokogiri::XML::Text + ### + # Get the name of this CDATA node + def name + '#cdata-section' + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/character_data.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/character_data.rb new file mode 100644 index 000000000000..5de647e97be0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/character_data.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class CharacterData < Nokogiri::XML::Node + include Nokogiri::XML::PP::CharacterData + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/document.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/document.rb new file mode 100644 index 000000000000..d09c0e41aded --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/document.rb @@ -0,0 +1,336 @@ +# coding: utf-8 +# frozen_string_literal: true + +require 'pathname' + +module Nokogiri + module XML + ## + # Nokogiri::XML::Document is the main entry point for dealing with + # XML documents. The Document is created by parsing an XML document. + # See Nokogiri::XML::Document.parse() for more information on parsing. + # + # For searching a Document, see Nokogiri::XML::Searchable#css and + # Nokogiri::XML::Searchable#xpath + # + class Document < Nokogiri::XML::Node + # See http://www.w3.org/TR/REC-xml-names/#ns-decl for more details. Note that we're not + # attempting to handle unicode characters partly because libxml2 doesn't handle unicode + # characters in NCNAMEs. + NCNAME_START_CHAR = "A-Za-z_" + NCNAME_CHAR = NCNAME_START_CHAR + "\\-\\.0-9" + NCNAME_RE = /^xmlns(?::([#{NCNAME_START_CHAR}][#{NCNAME_CHAR}]*))?$/ + + ## + # Parse an XML file. + # + # +string_or_io+ may be a String, or any object that responds to + # _read_ and _close_ such as an IO, or StringIO. + # + # +url+ (optional) is the URI where this document is located. + # + # +encoding+ (optional) is the encoding that should be used when processing + # the document. + # + # +options+ (optional) is a configuration object that sets options during + # parsing, such as Nokogiri::XML::ParseOptions::RECOVER. See the + # Nokogiri::XML::ParseOptions for more information. + # + # +block+ (optional) is passed a configuration object on which + # parse options may be set. + # + # By default, Nokogiri treats documents as untrusted, and so + # does not attempt to load DTDs or access the network. See + # Nokogiri::XML::ParseOptions for a complete list of options; + # and that module's DEFAULT_XML constant for what's set (and not + # set) by default. + # + # Nokogiri.XML() is a convenience method which will call this method. + # + def self.parse string_or_io, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML + options = Nokogiri::XML::ParseOptions.new(options) if Integer === options + + yield options if block_given? + + url ||= string_or_io.respond_to?(:path) ? string_or_io.path : nil + + if empty_doc?(string_or_io) + if options.strict? + raise Nokogiri::XML::SyntaxError.new("Empty document") + else + return encoding ? new.tap { |i| i.encoding = encoding } : new + end + end + + doc = if string_or_io.respond_to?(:read) + if string_or_io.is_a?(Pathname) + # resolve the Pathname to the file and open it as an IO object, see #2110 + string_or_io = string_or_io.expand_path.open + url ||= string_or_io.path + end + + read_io(string_or_io, url, encoding, options.to_i) + else + # read_memory pukes on empty docs + read_memory(string_or_io, url, encoding, options.to_i) + end + + # do xinclude processing + doc.do_xinclude(options) if options.xinclude? + + return doc + end + + ## + # @!method wrap(java_document) + # @!scope class + # + # Create a {Document} using an existing Java DOM document object. + # + # The returned {Document} shares the same underlying data structure as the Java object, so + # changes in one are reflected in the other. + # + # @param java_document [Java::OrgW3cDom::Document] + # @return [Nokogiri::XML::Document] + # @note This method is only available when running JRuby. + # @note The class +Java::OrgW3cDom::Document+ is also accessible as +org.w3c.dom.Document+. + # @see #to_java + + ## + # @!method to_java() + # + # Returns the underlying Java DOM document object for the {Document}. + # + # The returned Java object shares the same underlying data structure as the {Document}, so + # changes in one are reflected in the other. + # + # @return [Java::OrgW3cDom::Document] + # @note This method is only available when running JRuby. + # @note The class +Java::OrgW3cDom::Document+ is also accessible as +org.w3c.dom.Document+. + # @see .wrap + + + # A list of Nokogiri::XML::SyntaxError found when parsing a document + attr_accessor :errors + + def initialize *args # :nodoc: + @errors = [] + @decorators = nil + end + + ## + # Create a new +Element+ with +name+ sharing GC lifecycle with the document, optionally + # setting contents or attributes. + # + # Arguments may be passed to initialize the element: + # - a +Hash+ argument will be used to set attributes + # - a non-Hash object that responds to +#to_s+ will be used to set the new node's contents + # + # A block may be passed to mutate the node. + # + # @param name [String] + # @param contents_or_attrs [#to_s,Hash] + # @yieldparam node [Nokogiri::XML::Element] + # @return [Nokogiri::XML::Element] + # + # @example An empty element without attributes + # doc.create_element("div") + # # => <div></div> + # + # @example An element with contents + # doc.create_element("div", "contents") + # # => <div>contents</div> + # + # @example An element with attributes + # doc.create_element("div", {"class" => "container"}) + # # => <div class='container'></div> + # + # @example An element with contents and attributes + # doc.create_element("div", "contents", {"class" => "container"}) + # # => <div class='container'>contents</div> + # + # @example Passing a block to mutate the element + # doc.create_element("div") { |node| node["class"] = "blue" if before_noon? } + # + def create_element(name, *contents_or_attrs, &block) + elm = Nokogiri::XML::Element.new(name, self, &block) + contents_or_attrs.each do |arg| + case arg + when Hash + arg.each do |k, v| + key = k.to_s + if key =~ NCNAME_RE + ns_name = Regexp.last_match(1) + elm.add_namespace_definition(ns_name, v) + else + elm[k.to_s] = v.to_s + end + end + else + elm.content = arg + end + end + if ns = elm.namespace_definitions.find { |n| n.prefix.nil? || (n.prefix == '') } + elm.namespace = ns + end + elm + end + + # Create a Text Node with +string+ + def create_text_node string, &block + Nokogiri::XML::Text.new string.to_s, self, &block + end + + # Create a CDATA Node containing +string+ + def create_cdata string, &block + Nokogiri::XML::CDATA.new self, string.to_s, &block + end + + # Create a Comment Node containing +string+ + def create_comment string, &block + Nokogiri::XML::Comment.new self, string.to_s, &block + end + + # The name of this document. Always returns "document" + def name + 'document' + end + + # A reference to +self+ + def document + self + end + + ## + # Recursively get all namespaces from this node and its subtree and + # return them as a hash. + # + # For example, given this document: + # + # <root xmlns:foo="bar"> + # <bar xmlns:hello="world" /> + # </root> + # + # This method will return: + # + # { 'xmlns:foo' => 'bar', 'xmlns:hello' => 'world' } + # + # WARNING: this method will clobber duplicate names in the keys. + # For example, given this document: + # + # <root xmlns:foo="bar"> + # <bar xmlns:foo="baz" /> + # </root> + # + # The hash returned will look like this: { 'xmlns:foo' => 'bar' } + # + # Non-prefixed default namespaces (as in "xmlns=") are not included + # in the hash. + # + # Note that this method does an xpath lookup for nodes with + # namespaces, and as a result the order may be dependent on the + # implementation of the underlying XML library. + # + def collect_namespaces + xpath("//namespace::*").inject({}) do |hash, ns| + hash[["xmlns",ns.prefix].compact.join(":")] = ns.href if ns.prefix != "xml" + hash + end + end + + # Get the list of decorators given +key+ + def decorators key + @decorators ||= Hash.new + @decorators[key] ||= [] + end + + ## + # Validate this Document against it's DTD. Returns a list of errors on + # the document or +nil+ when there is no DTD. + def validate + return nil unless internal_subset + internal_subset.validate self + end + + ## + # Explore a document with shortcut methods. See Nokogiri::Slop for details. + # + # Note that any nodes that have been instantiated before #slop! + # is called will not be decorated with sloppy behavior. So, if you're in + # irb, the preferred idiom is: + # + # irb> doc = Nokogiri::Slop my_markup + # + # and not + # + # irb> doc = Nokogiri::HTML my_markup + # ... followed by irb's implicit inspect (and therefore instantiation of every node) ... + # irb> doc.slop! + # ... which does absolutely nothing. + # + def slop! + unless decorators(XML::Node).include? Nokogiri::Decorators::Slop + decorators(XML::Node) << Nokogiri::Decorators::Slop + decorate! + end + + self + end + + ## + # Apply any decorators to +node+ + def decorate node + return unless @decorators + @decorators.each { |klass,list| + next unless node.is_a?(klass) + list.each { |moodule| node.extend(moodule) } + } + end + + alias :to_xml :serialize + alias :clone :dup + + # Get the hash of namespaces on the root Nokogiri::XML::Node + def namespaces + root ? root.namespaces : {} + end + + ## + # Create a Nokogiri::XML::DocumentFragment from +tags+ + # Returns an empty fragment if +tags+ is nil. + def fragment tags = nil + DocumentFragment.new(self, tags, self.root) + end + + undef_method :swap, :parent, :namespace, :default_namespace= + undef_method :add_namespace_definition, :attributes + undef_method :namespace_definitions, :line, :add_namespace + + def add_child node_or_tags + raise "A document may not have multiple root nodes." if (root && root.name != 'nokogiri_text_wrapper') && !(node_or_tags.comment? || node_or_tags.processing_instruction?) + node_or_tags = coerce(node_or_tags) + if node_or_tags.is_a?(XML::NodeSet) + raise "A document may not have multiple root nodes." if node_or_tags.size > 1 + super(node_or_tags.first) + else + super + end + end + alias :<< :add_child + + private + + def self.empty_doc? string_or_io + string_or_io.nil? || + (string_or_io.respond_to?(:empty?) && string_or_io.empty?) || + (string_or_io.respond_to?(:eof?) && string_or_io.eof?) + end + + IMPLIED_XPATH_CONTEXTS = [ '//'.freeze ].freeze # :nodoc: + + def inspect_attributes + [:name, :children] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/document_fragment.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/document_fragment.rb new file mode 100644 index 000000000000..b974da2c9cdd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/document_fragment.rb @@ -0,0 +1,159 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class DocumentFragment < Nokogiri::XML::Node + ## + # Create a new DocumentFragment from +tags+. + # + # If +ctx+ is present, it is used as a context node for the + # subtree created, e.g., namespaces will be resolved relative + # to +ctx+. + def initialize document, tags = nil, ctx = nil + return self unless tags + + children = if ctx + # Fix for issue#490 + if Nokogiri.jruby? + # fix for issue #770 + ctx.parse("<root #{namespace_declarations(ctx)}>#{tags}</root>").children + else + ctx.parse(tags) + end + else + XML::Document.parse("<root>#{tags}</root>") \ + .xpath("/root/node()") + end + children.each { |child| child.parent = self } + end + + if Nokogiri.uses_libxml? + def dup + new_document = document.dup + new_fragment = self.class.new(new_document) + children.each do |child| + child.dup(1, new_document).parent = new_fragment + end + new_fragment + end + end + + ### + # return the name for DocumentFragment + def name + '#document-fragment' + end + + ### + # Convert this DocumentFragment to a string + def to_s + children.to_s + end + + ### + # Convert this DocumentFragment to html + # See Nokogiri::XML::NodeSet#to_html + def to_html *args + if Nokogiri.jruby? + options = args.first.is_a?(Hash) ? args.shift : {} + if !options[:save_with] + options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML + end + args.insert(0, options) + end + children.to_html(*args) + end + + ### + # Convert this DocumentFragment to xhtml + # See Nokogiri::XML::NodeSet#to_xhtml + def to_xhtml *args + if Nokogiri.jruby? + options = args.first.is_a?(Hash) ? args.shift : {} + if !options[:save_with] + options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_XHTML + end + args.insert(0, options) + end + children.to_xhtml(*args) + end + + ### + # Convert this DocumentFragment to xml + # See Nokogiri::XML::NodeSet#to_xml + def to_xml *args + children.to_xml(*args) + end + + ### + # call-seq: css *rules, [namespace-bindings, custom-pseudo-class] + # + # Search this fragment for CSS +rules+. +rules+ must be one or more CSS + # selectors. For example: + # + # For more information see Nokogiri::XML::Searchable#css + def css *args + if children.any? + children.css(*args) # 'children' is a smell here + else + NodeSet.new(document) + end + end + + # + # NOTE that we don't delegate #xpath to children ... another smell. + # def xpath ; end + # + + ### + # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class] + # + # Search this fragment for +paths+. +paths+ must be one or more XPath or CSS queries. + # + # For more information see Nokogiri::XML::Searchable#search + def search *rules + rules, handler, ns, binds = extract_params(rules) + + rules.inject(NodeSet.new(document)) do |set, rule| + set += if rule =~ Searchable::LOOKS_LIKE_XPATH + xpath(*([rule, ns, handler, binds].compact)) + else + children.css(*([rule, ns, handler].compact)) # 'children' is a smell here + end + end + end + + alias :serialize :to_s + + class << self + #### + # Create a Nokogiri::XML::DocumentFragment from +tags+ + def parse tags + self.new(XML::Document.new, tags) + end + end + + # A list of Nokogiri::XML::SyntaxError found when parsing a document + def errors + document.errors + end + + def errors= things # :nodoc: + document.errors = things + end + + def fragment(data) + document.fragment(data) + end + + private + + # fix for issue 770 + def namespace_declarations ctx + ctx.namespace_scopes.map do |namespace| + prefix = namespace.prefix.nil? ? "" : ":#{namespace.prefix}" + %Q{xmlns#{prefix}="#{namespace.href}"} + end.join ' ' + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/dtd.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/dtd.rb new file mode 100644 index 000000000000..0b6fa8a2710d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/dtd.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class DTD < Nokogiri::XML::Node + undef_method :attribute_nodes + undef_method :values + undef_method :content + undef_method :namespace + undef_method :namespace_definitions + undef_method :line if method_defined?(:line) + + def keys + attributes.keys + end + + def each + attributes.each do |key, value| + yield([key, value]) + end + end + + def html_dtd? + name.casecmp('html').zero? + end + + def html5_dtd? + html_dtd? && + external_id.nil? && + (system_id.nil? || system_id == 'about:legacy-compat') + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/element_content.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/element_content.rb new file mode 100644 index 000000000000..e1c29963d8ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/element_content.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +module Nokogiri + module XML + ### + # Represents the allowed content in an Element Declaration inside a DTD: + # + # <?xml version="1.0"?><?TEST-STYLE PIDATA?> + # <!DOCTYPE staff SYSTEM "staff.dtd" [ + # <!ELEMENT div1 (head, (p | list | note)*, div2*)> + # ]> + # </root> + # + # ElementContent represents the tree inside the <!ELEMENT> tag shown above + # that lists the possible content for the div1 tag. + class ElementContent + # Possible definitions of type + PCDATA = 1 + ELEMENT = 2 + SEQ = 3 + OR = 4 + + # Possible content occurrences + ONCE = 1 + OPT = 2 + MULT = 3 + PLUS = 4 + + attr_reader :document + + ### + # Get the children of this ElementContent node + def children + [c1, c2].compact + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/element_decl.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/element_decl.rb new file mode 100644 index 000000000000..d3927be189af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/element_decl.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class ElementDecl < Nokogiri::XML::Node + undef_method :namespace + undef_method :namespace_definitions + undef_method :line if method_defined?(:line) + + def inspect + "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{to_s.inspect}>" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/entity_decl.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/entity_decl.rb new file mode 100644 index 000000000000..55ae00a4bece --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/entity_decl.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class EntityDecl < Nokogiri::XML::Node + undef_method :attribute_nodes + undef_method :attributes + undef_method :namespace + undef_method :namespace_definitions + undef_method :line if method_defined?(:line) + + def self.new name, doc, *args + doc.create_entity(name, *args) + end + + def inspect + "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{to_s.inspect}>" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/entity_reference.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/entity_reference.rb new file mode 100644 index 000000000000..1f3ffb24b9ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/entity_reference.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class EntityReference < Nokogiri::XML::Node + def children + # libxml2 will create a malformed child node for predefined + # entities. because any use of that child is likely to cause a + # segfault, we shall pretend that it doesn't exist. + # + # see https://github.com/sparklemotion/nokogiri/issues/1238 for details + NodeSet.new(document) + end + + def inspect_attributes + [:name] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/namespace.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/namespace.rb new file mode 100644 index 000000000000..e628bbd85bc1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/namespace.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class Namespace + include Nokogiri::XML::PP::Node + attr_reader :document + + private + def inspect_attributes + [:prefix, :href] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/node.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/node.rb new file mode 100644 index 000000000000..44f94ccd4957 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/node.rb @@ -0,0 +1,1237 @@ +# encoding: UTF-8 +# frozen_string_literal: true +require "stringio" +require "nokogiri/xml/node/save_options" + +module Nokogiri + module XML + ## + # {Nokogiri::XML::Node} is your window to the fun filled world of dealing with XML and HTML + # tags. A {Nokogiri::XML::Node} may be treated similarly to a hash with regard to attributes. For + # example: + # + # node = Nokogiri::XML::DocumentFragment.parse("<a href='#foo' id='link'>link</a>").at_css("a") + # node.to_html # => "<a href=\"#foo\" id=\"link\">link</a>" + # node['href'] # => "#foo" + # node.keys # => ["href", "id"] + # node.values # => ["#foo", "link"] + # node['class'] = 'green' # => "green" + # node.to_html # => "<a href=\"#foo\" id=\"link\" class=\"green\">link</a>" + # + # See the method group entitled "Working With Node Attributes" for the full set of methods. + # + # {Nokogiri::XML::Node} also has methods that let you move around your + # tree. For navigating your tree, see: + # + # * {#parent} + # * {#children} + # * {#next} + # * {#previous} + # + # When printing or otherwise emitting a document or a node (and + # its subtree), there are a few methods you might want to use: + # + # * {#content}, {#text}, {#inner_text}, {#to_str}: These methods will all <b>emit plaintext</b>, + # meaning that entities will be replaced (e.g., "&lt;" will be replaced with "<"), meaning + # that any sanitizing will likely be un-done in the output. + # + # * {#to_s}, {#to_xml}, {#to_html}, {#inner_html}: These methods will all <b>emit + # properly-escaped markup</b>, meaning that it's suitable for consumption by browsers, + # parsers, etc. + # + # You may search this node's subtree using {#xpath} and {#css} + # + class Node + include Nokogiri::XML::PP::Node + include Nokogiri::XML::Searchable + include Enumerable + + # Element node type, see {Nokogiri::XML::Node#element?} + ELEMENT_NODE = 1 + # Attribute node type + ATTRIBUTE_NODE = 2 + # Text node type, see {Nokogiri::XML::Node#text?} + TEXT_NODE = 3 + # CDATA node type, see {Nokogiri::XML::Node#cdata?} + CDATA_SECTION_NODE = 4 + # Entity reference node type + ENTITY_REF_NODE = 5 + # Entity node type + ENTITY_NODE = 6 + # PI node type + PI_NODE = 7 + # Comment node type, see {Nokogiri::XML::Node#comment?} + COMMENT_NODE = 8 + # Document node type, see {Nokogiri::XML::Node#xml?} + DOCUMENT_NODE = 9 + # Document type node type + DOCUMENT_TYPE_NODE = 10 + # Document fragment node type + DOCUMENT_FRAG_NODE = 11 + # Notation node type + NOTATION_NODE = 12 + # HTML document node type, see {Nokogiri::XML::Node#html?} + HTML_DOCUMENT_NODE = 13 + # DTD node type + DTD_NODE = 14 + # Element declaration type + ELEMENT_DECL = 15 + # Attribute declaration type + ATTRIBUTE_DECL = 16 + # Entity declaration type + ENTITY_DECL = 17 + # Namespace declaration type + NAMESPACE_DECL = 18 + # XInclude start type + XINCLUDE_START = 19 + # XInclude end type + XINCLUDE_END = 20 + # DOCB document node type + DOCB_DOCUMENT_NODE = 21 + + ## + # Create a new node with +name+ sharing GC lifecycle with +document+. + # @param name [String] + # @param document [Nokogiri::XML::Document] + # @yieldparam node [Nokogiri::XML::Node] + # @return [Nokogiri::XML::Node] + # @see Nokogiri::XML::Node.new + def initialize(name, document) + # This is intentionally empty. + end + + ### + # Decorate this node with the decorators set up in this node's Document + def decorate! + document.decorate(self) + end + + # @!group Searching via XPath or CSS Queries + + ### + # Search this node's immediate children using CSS selector +selector+ + def >(selector) + ns = document.root.namespaces + xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first + end + + # @!endgroup + + # @!group Manipulating Document Structure + + ### + # Add +node_or_tags+ as a child of this Node. + # +node_or_tags+ can be a Nokogiri::XML::Node, a ::DocumentFragment, a ::NodeSet, or a string containing markup. + # + # Returns the reparented node (if +node_or_tags+ is a Node), or NodeSet (if +node_or_tags+ is a DocumentFragment, NodeSet, or string). + # + # Also see related method +<<+. + def add_child(node_or_tags) + node_or_tags = coerce(node_or_tags) + if node_or_tags.is_a?(XML::NodeSet) + node_or_tags.each { |n| add_child_node_and_reparent_attrs n } + else + add_child_node_and_reparent_attrs node_or_tags + end + node_or_tags + end + + ### + # Add +node_or_tags+ as the first child of this Node. + # +node_or_tags+ can be a Nokogiri::XML::Node, a ::DocumentFragment, a ::NodeSet, or a string containing markup. + # + # Returns the reparented node (if +node_or_tags+ is a Node), or NodeSet (if +node_or_tags+ is a DocumentFragment, NodeSet, or string). + # + # Also see related method +add_child+. + def prepend_child(node_or_tags) + if first = children.first + # Mimic the error add_child would raise. + raise RuntimeError, "Document already has a root node" if document? && !(node_or_tags.comment? || node_or_tags.processing_instruction?) + first.__send__(:add_sibling, :previous, node_or_tags) + else + add_child(node_or_tags) + end + end + + ### + # Add html around this node + # + # Returns self + def wrap(html) + new_parent = document.parse(html).first + add_next_sibling(new_parent) + new_parent.add_child(self) + self + end + + ### + # Add +node_or_tags+ as a child of this Node. + # +node_or_tags+ can be a Nokogiri::XML::Node, a ::DocumentFragment, a ::NodeSet, or a string containing markup. + # + # Returns self, to support chaining of calls (e.g., root << child1 << child2) + # + # Also see related method +add_child+. + def <<(node_or_tags) + add_child node_or_tags + self + end + + ### + # Insert +node_or_tags+ before this Node (as a sibling). + # +node_or_tags+ can be a Nokogiri::XML::Node, a ::DocumentFragment, a ::NodeSet, or a string containing markup. + # + # Returns the reparented node (if +node_or_tags+ is a Node), or NodeSet (if +node_or_tags+ is a DocumentFragment, NodeSet, or string). + # + # Also see related method +before+. + def add_previous_sibling(node_or_tags) + raise ArgumentError.new("A document may not have multiple root nodes.") if (parent && parent.document?) && !(node_or_tags.comment? || node_or_tags.processing_instruction?) + + add_sibling :previous, node_or_tags + end + + ### + # Insert +node_or_tags+ after this Node (as a sibling). + # +node_or_tags+ can be a Nokogiri::XML::Node, a ::DocumentFragment, a ::NodeSet, or a string containing markup. + # + # Returns the reparented node (if +node_or_tags+ is a Node), or NodeSet (if +node_or_tags+ is a DocumentFragment, NodeSet, or string). + # + # Also see related method +after+. + def add_next_sibling(node_or_tags) + raise ArgumentError.new("A document may not have multiple root nodes.") if (parent && parent.document?) && !(node_or_tags.comment? || node_or_tags.processing_instruction?) + + add_sibling :next, node_or_tags + end + + #### + # Insert +node_or_tags+ before this node (as a sibling). + # +node_or_tags+ can be a Nokogiri::XML::Node, a ::DocumentFragment, a ::NodeSet, or a string containing markup. + # + # Returns self, to support chaining of calls. + # + # Also see related method +add_previous_sibling+. + def before(node_or_tags) + add_previous_sibling node_or_tags + self + end + + #### + # Insert +node_or_tags+ after this node (as a sibling). + # +node_or_tags+ can be a Nokogiri::XML::Node, a Nokogiri::XML::DocumentFragment, or a string containing markup. + # + # Returns self, to support chaining of calls. + # + # Also see related method +add_next_sibling+. + def after(node_or_tags) + add_next_sibling node_or_tags + self + end + + #### + # Set the inner html for this Node to +node_or_tags+ + # +node_or_tags+ can be a Nokogiri::XML::Node, a Nokogiri::XML::DocumentFragment, or a string containing markup. + # + # Returns self. + # + # Also see related method +children=+ + def inner_html=(node_or_tags) + self.children = node_or_tags + self + end + + #### + # Set the inner html for this Node +node_or_tags+ + # +node_or_tags+ can be a Nokogiri::XML::Node, a Nokogiri::XML::DocumentFragment, or a string containing markup. + # + # Returns the reparented node (if +node_or_tags+ is a Node), or NodeSet (if +node_or_tags+ is a DocumentFragment, NodeSet, or string). + # + # Also see related method +inner_html=+ + def children=(node_or_tags) + node_or_tags = coerce(node_or_tags) + children.unlink + if node_or_tags.is_a?(XML::NodeSet) + node_or_tags.each { |n| add_child_node_and_reparent_attrs n } + else + add_child_node_and_reparent_attrs node_or_tags + end + node_or_tags + end + + #### + # Replace this Node with +node_or_tags+. + # +node_or_tags+ can be a Nokogiri::XML::Node, a ::DocumentFragment, a ::NodeSet, or a string containing markup. + # + # Returns the reparented node (if +node_or_tags+ is a Node), or NodeSet (if +node_or_tags+ is a DocumentFragment, NodeSet, or string). + # + # Also see related method +swap+. + def replace(node_or_tags) + raise("Cannot replace a node with no parent") unless parent + + # We cannot replace a text node directly, otherwise libxml will return + # an internal error at parser.c:13031, I don't know exactly why + # libxml is trying to find a parent node that is an element or document + # so I can't tell if this is bug in libxml or not. issue #775. + if text? + replacee = Nokogiri::XML::Node.new "dummy", document + add_previous_sibling_node replacee + unlink + return replacee.replace node_or_tags + end + + node_or_tags = parent.coerce(node_or_tags) + + if node_or_tags.is_a?(XML::NodeSet) + node_or_tags.each { |n| add_previous_sibling n } + unlink + else + replace_node node_or_tags + end + node_or_tags + end + + #### + # Swap this Node for +node_or_tags+ + # +node_or_tags+ can be a Nokogiri::XML::Node, a ::DocumentFragment, a ::NodeSet, or a string containing markup. + # + # Returns self, to support chaining of calls. + # + # Also see related method +replace+. + def swap(node_or_tags) + replace node_or_tags + self + end + + #### + # Set the Node's content to a Text node containing +string+. The string gets XML escaped, not interpreted as markup. + def content=(string) + self.native_content = encode_special_chars(string.to_s) + end + + ### + # Set the parent Node for this Node + def parent=(parent_node) + parent_node.add_child(self) + parent_node + end + + ### + # Adds a default namespace supplied as a string +url+ href, to self. + # The consequence is as an xmlns attribute with supplied argument were + # present in parsed XML. A default namespace set with this method will + # now show up in #attributes, but when this node is serialized to XML an + # "xmlns" attribute will appear. See also #namespace and #namespace= + def default_namespace=(url) + add_namespace_definition(nil, url) + end + + ### + # Set the default namespace on this node (as would be defined with an + # "xmlns=" attribute in XML source), as a Namespace object +ns+. Note that + # a Namespace added this way will NOT be serialized as an xmlns attribute + # for this node. You probably want #default_namespace= instead, or perhaps + # #add_namespace_definition with a nil prefix argument. + def namespace=(ns) + return set_namespace(ns) unless ns + + unless Nokogiri::XML::Namespace === ns + raise TypeError, "#{ns.class} can't be coerced into Nokogiri::XML::Namespace" + end + if ns.document != document + raise ArgumentError, "namespace must be declared on the same document" + end + + set_namespace ns + end + + ### + # Do xinclude substitution on the subtree below node. If given a block, a + # Nokogiri::XML::ParseOptions object initialized from +options+, will be + # passed to it, allowing more convenient modification of the parser options. + def do_xinclude(options = XML::ParseOptions::DEFAULT_XML) + options = Nokogiri::XML::ParseOptions.new(options) if Integer === options + + # give options to user + yield options if block_given? + + # call c extension + process_xincludes(options.to_i) + end + + alias :next :next_sibling + alias :previous :previous_sibling + alias :next= :add_next_sibling + alias :previous= :add_previous_sibling + alias :remove :unlink + alias :name= :node_name= + alias :add_namespace :add_namespace_definition + + # @!endgroup + + alias :text :content + alias :inner_text :content + alias :name :node_name + alias :type :node_type + alias :to_str :text + alias :clone :dup + alias :elements :element_children + + # @!group Working With Node Attributes + + ### + # Get the attribute value for the attribute +name+ + def [](name) + get(name.to_s) + end + + ### + # Set the attribute value for the attribute +name+ to +value+ + def []=(name, value) + set name.to_s, value.to_s + end + + #### + # Returns a hash containing the node's attributes. The key is + # the attribute name without any namespace, the value is a Nokogiri::XML::Attr + # representing the attribute. + # If you need to distinguish attributes with the same name, with different namespaces + # use #attribute_nodes instead. + def attributes + attribute_nodes.each_with_object({}) do |node, hash| + hash[node.node_name] = node + end + end + + ### + # Get the attribute values for this Node. + def values + attribute_nodes.map(&:value) + end + + ### + # Does this Node's attributes include <value> + def value?(value) + values.include? value + end + + ### + # Get the attribute names for this Node. + def keys + attribute_nodes.map(&:node_name) + end + + ### + # Iterate over each attribute name and value pair for this Node. + def each + attribute_nodes.each { |node| + yield [node.node_name, node.value] + } + end + + ### + # Remove the attribute named +name+ + def remove_attribute(name) + attr = attributes[name].remove if key? name + clear_xpath_context if Nokogiri.jruby? + attr + end + + # Get the CSS class names of a Node. + # + # This is a convenience function and is equivalent to: + # node.kwattr_values("class") + # + # @see #kwattr_values + # @see #add_class + # @see #append_class + # @see #remove_class + # + # @return [Array<String>] + # + # The CSS classes present in the Node's +class+ attribute. If + # the attribute is empty or non-existent, the return value is + # an empty array. + # + # @example + # node # => <div class="section title header"></div> + # node.classes # => ["section", "title", "header"] + # + def classes + kwattr_values("class") + end + + # Ensure HTML CSS classes are present on a +Node+. Any CSS + # classes in +names+ that already exist in the +Node+'s +class+ + # attribute are _not_ added. Note that any existing duplicates + # in the +class+ attribute are not removed. Compare with + # {#append_class}. + # + # This is a convenience function and is equivalent to: + # node.kwattr_add("class", names) + # + # @see #kwattr_add + # @see #classes + # @see #append_class + # @see #remove_class + # + # @param names [String, Array<String>] + # + # CSS class names to be added to the Node's +class+ + # attribute. May be a string containing whitespace-delimited + # names, or an Array of String names. Any class names already + # present will not be added. Any class names not present will + # be added. If no +class+ attribute exists, one is created. + # + # @return [Node] Returns +self+ for ease of chaining method calls. + # + # @example Ensure that a +Node+ has CSS class "section" + # node # => <div></div> + # node.add_class("section") # => <div class="section"></div> + # node.add_class("section") # => <div class="section"></div> # duplicate not added + # + # @example Ensure that a +Node+ has CSS classes "section" and "header", via a String argument. + # node # => <div class="section section"></div> + # node.add_class("section header") # => <div class="section section header"></div> + # # Note that the CSS class "section" is not added because it is already present. + # # Note also that the pre-existing duplicate CSS class "section" is not removed. + # + # @example Ensure that a +Node+ has CSS classes "section" and "header", via an Array argument. + # node # => <div></div> + # node.add_class(["section", "header"]) # => <div class="section header"></div> + # + def add_class(names) + kwattr_add("class", names) + end + + # Add HTML CSS classes to a +Node+, regardless of + # duplication. Compare with {#add_class}. + # + # This is a convenience function and is equivalent to: + # node.kwattr_append("class", names) + # + # @see #kwattr_append + # @see #classes + # @see #add_class + # @see #remove_class + # + # @param names [String, Array<String>] + # + # CSS class names to be appended to the Node's +class+ + # attribute. May be a string containing whitespace-delimited + # names, or an Array of String names. All class names passed + # in will be appended to the +class+ attribute even if they + # are already present in the attribute value. If no +class+ + # attribute exists, one is created. + # + # @return [Node] Returns +self+ for ease of chaining method calls. + # + # @example Append "section" to a +Node+'s CSS +class+ attriubute + # node # => <div></div> + # node.append_class("section") # => <div class="section"></div> + # node.append_class("section") # => <div class="section section"></div> # duplicate added! + # + # @example Append "section" and "header" to a +Node+'s CSS +class+ attribute, via a String argument. + # node # => <div class="section section"></div> + # node.append_class("section header") # => <div class="section section section header"></div> + # # Note that the CSS class "section" is appended even though it is already present. + # + # @example Append "section" and "header" to a +Node+'s CSS +class+ attribute, via an Array argument. + # node # => <div></div> + # node.append_class(["section", "header"]) # => <div class="section header"></div> + # node.append_class(["section", "header"]) # => <div class="section header section header"></div> + # + def append_class(names) + kwattr_append("class", names) + end + + # Remove HTML CSS classes from a +Node+. Any CSS classes in +names+ that + # exist in the +Node+'s +class+ attribute are removed, including any + # multiple entries. + # + # If no CSS classes remain after this operation, or if +names+ is + # +nil+, the +class+ attribute is deleted from the node. + # + # This is a convenience function and is equivalent to: + # node.kwattr_remove("class", names) + # + # @see #kwattr_remove + # @see #classes + # @see #add_class + # @see #append_class + # + # @param names [String, Array<String>] + # + # CSS class names to be removed from the Node's +class+ attribute. May + # be a string containing whitespace-delimited names, or an Array of + # String names. Any class names already present will be removed. If no + # CSS classes remain, the +class+ attribute is deleted. + # + # @return [Node] Returns +self+ for ease of chaining method calls. + # + # @example + # node # => <div class="section header"></div> + # node.remove_class("section") # => <div class="header"></div> + # node.remove_class("header") # => <div></div> # attribute is deleted when empty + # + def remove_class(names = nil) + kwattr_remove("class", names) + end + + # Retrieve values from a keyword attribute of a Node. + # + # A "keyword attribute" is a node attribute that contains a set + # of space-delimited values. Perhaps the most familiar example + # of this is the HTML +class+ attribute used to contain CSS + # classes. But other keyword attributes exist, for instance + # [`rel`](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel). + # + # @see #classes + # @see #kwattr_add + # @see #kwattr_append + # @see #kwattr_remove + # + # @param attribute_name [String] The name of the keyword attribute to be inspected. + # + # @return [Array<String>] + # + # The values present in the Node's +attribute_name+ + # attribute. If the attribute is empty or non-existent, the + # return value is an empty array. + # + # @example + # node # => <a rel="nofollow noopener external">link</a> + # node.kwattr_values("rel") # => ["nofollow", "noopener", "external"] + # + # @since v1.11.0 + # + def kwattr_values(attribute_name) + keywordify(get_attribute(attribute_name) || []) + end + + # Ensure that values are present in a keyword attribute. + # + # Any values in +keywords+ that already exist in the +Node+'s + # attribute values are _not_ added. Note that any existing + # duplicates in the attribute values are not removed. Compare + # with {#kwattr_append}. + # + # A "keyword attribute" is a node attribute that contains a set + # of space-delimited values. Perhaps the most familiar example + # of this is the HTML +class+ attribute used to contain CSS + # classes. But other keyword attributes exist, for instance + # [`rel`](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel). + # + # @see #add_class + # @see #kwattr_values + # @see #kwattr_append + # @see #kwattr_remove + # + # @param attribute_name [String] The name of the keyword attribute to be modified. + # + # @param keywords [String, Array<String>] + # + # Keywords to be added to the attribute named + # +attribute_name+. May be a string containing + # whitespace-delimited values, or an Array of String + # values. Any values already present will not be added. Any + # values not present will be added. If the named attribute + # does not exist, it is created. + # + # @return [Node] Returns +self+ for ease of chaining method calls. + # + # @example Ensure that a +Node+ has "nofollow" in its +rel+ attribute. + # node # => <a></a> + # node.kwattr_add("rel", "nofollow") # => <a rel="nofollow"></a> + # node.kwattr_add("rel", "nofollow") # => <a rel="nofollow"></a> # duplicate not added + # + # @example Ensure that a +Node+ has "nofollow" and "noreferrer" in its +rel+ attribute, via a String argument. + # node # => <a rel="nofollow nofollow"></a> + # node.kwattr_add("rel", "nofollow noreferrer") # => <a rel="nofollow nofollow noreferrer"></a> + # # Note that "nofollow" is not added because it is already present. + # # Note also that the pre-existing duplicate "nofollow" is not removed. + # + # @example Ensure that a +Node+ has "nofollow" and "noreferrer" in its +rel+ attribute, via an Array argument. + # node # => <a></a> + # node.kwattr_add("rel", ["nofollow", "noreferrer"]) # => <a rel="nofollow noreferrer"></a> + # + # @since v1.11.0 + # + def kwattr_add(attribute_name, keywords) + keywords = keywordify(keywords) + current_kws = kwattr_values(attribute_name) + new_kws = (current_kws + (keywords - current_kws)).join(" ") + set_attribute(attribute_name, new_kws) + self + end + + # Add keywords to a Node's keyword attribute, regardless of + # duplication. Compare with {#kwattr_add}. + # + # A "keyword attribute" is a node attribute that contains a set + # of space-delimited values. Perhaps the most familiar example + # of this is the HTML +class+ attribute used to contain CSS + # classes. But other keyword attributes exist, for instance + # [`rel`](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel). + # + # @see #append_class + # @see #kwattr_values + # @see #kwattr_add + # @see #kwattr_remove + # + # @param attribute_name [String] The name of the keyword attribute to be modified. + # + # @param keywords [String, Array<String>] + # + # Keywords to be added to the attribute named + # +attribute_name+. May be a string containing + # whitespace-delimited values, or an Array of String + # values. All values passed in will be appended to the named + # attribute even if they are already present in the + # attribute. If the named attribute does not exist, it is + # created. + # + # @return [Node] Returns +self+ for ease of chaining method calls. + # + # @example Append "nofollow" to the +rel+ attribute. + # node # => <a></a> + # node.kwattr_append("rel", "nofollow") # => <a rel="nofollow"></a> + # node.kwattr_append("rel", "nofollow") # => <a rel="nofollow nofollow"></a> # duplicate added! + # + # @example Append "nofollow" and "noreferrer" to the +rel+ attribute, via a String argument. + # node # => <a rel="nofollow"></a> + # node.kwattr_append("rel", "nofollow noreferrer") # => <a rel="nofollow nofollow noreferrer"></a> + # # Note that "nofollow" is appended even though it is already present. + # + # @example Append "nofollow" and "noreferrer" to the +rel+ attribute, via an Array argument. + # node # => <a></a> + # node.kwattr_append("rel", ["nofollow", "noreferrer"]) # => <a rel="nofollow noreferrer"></a> + # + # @since v1.11.0 + # + def kwattr_append(attribute_name, keywords) + keywords = keywordify(keywords) + current_kws = kwattr_values(attribute_name) + new_kws = (current_kws + keywords).join(" ") + set_attribute(attribute_name, new_kws) + self + end + + # Remove keywords from a keyword attribute. Any matching + # keywords that exist in the named attribute are removed, + # including any multiple entries. + # + # If no keywords remain after this operation, or if +keywords+ + # is +nil+, the attribute is deleted from the node. + # + # A "keyword attribute" is a node attribute that contains a set + # of space-delimited values. Perhaps the most familiar example + # of this is the HTML +class+ attribute used to contain CSS + # classes. But other keyword attributes exist, for instance + # [`rel`](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel). + # + # @see #remove_class + # @see #kwattr_values + # @see #kwattr_add + # @see #kwattr_append + # + # @param attribute_name [String] The name of the keyword attribute to be modified. + # + # @param keywords [String, Array<String>] + # + # Keywords to be removed from the attribute named + # +attribute_name+. May be a string containing + # whitespace-delimited values, or an Array of String + # values. Any keywords present in the named attribute will be + # removed. If no keywords remain, or if +keywords+ is nil, the + # attribute is deleted. + # + # @return [Node] Returns +self+ for ease of chaining method calls. + # + # @example + # node # => <a rel="nofollow noreferrer">link</a> + # node.kwattr_remove("rel", "nofollow") # => <a rel="noreferrer">link</a> + # node.kwattr_remove("rel", "noreferrer") # => <a>link</a> # attribute is deleted when empty + # + # @since v1.11.0 + # + def kwattr_remove(attribute_name, keywords) + if keywords.nil? + remove_attribute(attribute_name) + return self + end + + keywords = keywordify(keywords) + current_kws = kwattr_values(attribute_name) + new_kws = current_kws - keywords + if new_kws.empty? + remove_attribute(attribute_name) + else + set_attribute(attribute_name, new_kws.join(" ")) + end + self + end + + alias :delete :remove_attribute + alias :get_attribute :[] + alias :attr :[] + alias :set_attribute :[]= + alias :has_attribute? :key? + + # @!endgroup + + ### + # Returns true if this Node matches +selector+ + def matches?(selector) + ancestors.last.search(selector).include?(self) + end + + ### + # Create a DocumentFragment containing +tags+ that is relative to _this_ + # context node. + def fragment(tags) + type = document.html? ? Nokogiri::HTML : Nokogiri::XML + type::DocumentFragment.new(document, tags, self) + end + + ### + # Parse +string_or_io+ as a document fragment within the context of + # *this* node. Returns a XML::NodeSet containing the nodes parsed from + # +string_or_io+. + def parse(string_or_io, options = nil) + ## + # When the current node is unparented and not an element node, use the + # document as the parsing context instead. Otherwise, the in-context + # parser cannot find an element or a document node. + # Document Fragments are also not usable by the in-context parser. + if !element? && !document? && (!parent || parent.fragment?) + return document.parse(string_or_io, options) + end + + options ||= (document.html? ? ParseOptions::DEFAULT_HTML : ParseOptions::DEFAULT_XML) + if Integer === options + options = Nokogiri::XML::ParseOptions.new(options) + end + # Give the options to the user + yield options if block_given? + + contents = string_or_io.respond_to?(:read) ? + string_or_io.read : + string_or_io + + return Nokogiri::XML::NodeSet.new(document) if contents.empty? + + # libxml2 does not obey the `recover` option after encountering errors during `in_context` + # parsing, and so this horrible hack is here to try to emulate recovery behavior. + # + # Unfortunately, this means we're no longer parsing "in context" and so namespaces that + # would have been inherited from the context node won't be handled correctly. This hack was + # written in 2010, and I regret it, because it's silently degrading functionality in a way + # that's not easily prevented (or even detected). + # + # I think preferable behavior would be to either: + # + # a. add an error noting that we "fell back" and pointing the user to turning off the `recover` option + # b. don't recover, but raise a sensible exception + # + # For context and background: https://github.com/sparklemotion/nokogiri/issues/313 + # FIXME bug report: https://github.com/sparklemotion/nokogiri/issues/2092 + error_count = document.errors.length + node_set = in_context(contents, options.to_i) + if (node_set.empty? && (document.errors.length > error_count)) + if options.recover? + fragment = Nokogiri::HTML::DocumentFragment.parse contents + node_set = fragment.children + else + raise document.errors[error_count] + end + end + node_set + end + + ### + # Returns a Hash of +{prefix => value}+ for all namespaces on this + # node and its ancestors. + # + # This method returns the same namespaces as #namespace_scopes. + # + # Returns namespaces in scope for self -- those defined on self + # element directly or any ancestor node -- as a Hash of + # attribute-name/value pairs. Note that the keys in this hash + # XML attributes that would be used to define this namespace, + # such as "xmlns:prefix", not just the prefix. Default namespace + # set on self will be included with key "xmlns". However, + # default namespaces set on ancestor will NOT be, even if self + # has no explicit default namespace. + def namespaces + namespace_scopes.each_with_object({}) do |ns, hash| + prefix = ns.prefix + key = prefix ? "xmlns:#{prefix}" : "xmlns" + hash[key] = ns.href + end + end + + # Returns true if this is a Comment + def comment? + type == COMMENT_NODE + end + + # Returns true if this is a CDATA + def cdata? + type == CDATA_SECTION_NODE + end + + # Returns true if this is an XML::Document node + def xml? + type == DOCUMENT_NODE + end + + # Returns true if this is an HTML::Document node + def html? + type == HTML_DOCUMENT_NODE + end + + # Returns true if this is a Document + def document? + is_a? XML::Document + end + + # Returns true if this is a ProcessingInstruction node + def processing_instruction? + type == PI_NODE + end + + # Returns true if this is a Text node + def text? + type == TEXT_NODE + end + + # Returns true if this is a DocumentFragment + def fragment? + type == DOCUMENT_FRAG_NODE + end + + ### + # Fetch the Nokogiri::HTML::ElementDescription for this node. Returns + # nil on XML documents and on unknown tags. + def description + return nil if document.xml? + Nokogiri::HTML::ElementDescription[name] + end + + ### + # Is this a read only node? + def read_only? + # According to gdome2, these are read-only node types + [NOTATION_NODE, ENTITY_NODE, ENTITY_DECL].include?(type) + end + + # Returns true if this is an Element node + def element? + type == ELEMENT_NODE + end + + alias :elem? :element? + + ### + # Turn this node in to a string. If the document is HTML, this method + # returns html. If the document is XML, this method returns XML. + def to_s + document.xml? ? to_xml : to_html + end + + # Get the inner_html for this node's Node#children + def inner_html(*args) + children.map { |x| x.to_html(*args) }.join + end + + # Get the path to this node as a CSS expression + def css_path + path.split(/\//).map { |part| + part.length == 0 ? nil : part.gsub(/\[(\d+)\]/, ':nth-of-type(\1)') + }.compact.join(" > ") + end + + ### + # Get a list of ancestor Node for this Node. If +selector+ is given, + # the ancestors must match +selector+ + def ancestors(selector = nil) + return NodeSet.new(document) unless respond_to?(:parent) + return NodeSet.new(document) unless parent + + parents = [parent] + + while parents.last.respond_to?(:parent) + break unless ctx_parent = parents.last.parent + parents << ctx_parent + end + + return NodeSet.new(document, parents) unless selector + + root = parents.last + search_results = root.search(selector) + + NodeSet.new(document, parents.find_all { |parent| + search_results.include?(parent) + }) + end + + #### + # Yields self and all children to +block+ recursively. + def traverse(&block) + children.each { |j| j.traverse(&block) } + block.call(self) + end + + ### + # Accept a visitor. This method calls "visit" on +visitor+ with self. + def accept(visitor) + visitor.visit(self) + end + + ### + # Test to see if this Node is equal to +other+ + def ==(other) + return false unless other + return false unless other.respond_to?(:pointer_id) + pointer_id == other.pointer_id + end + + ### + # Compare two Node objects with respect to their Document. Nodes from + # different documents cannot be compared. + def <=>(other) + return nil unless other.is_a?(Nokogiri::XML::Node) + return nil unless document == other.document + compare other + end + + # @!group Serialization and Generating Output + + ### + # Serialize Node using +options+. Save options can also be set using a + # block. See SaveOptions. + # + # These two statements are equivalent: + # + # node.serialize(:encoding => 'UTF-8', :save_with => FORMAT | AS_XML) + # + # or + # + # node.serialize(:encoding => 'UTF-8') do |config| + # config.format.as_xml + # end + # + def serialize(*args, &block) + options = args.first.is_a?(Hash) ? args.shift : { + :encoding => args[0], + :save_with => args[1], + } + + encoding = options[:encoding] || document.encoding + options[:encoding] = encoding + + outstring = String.new + outstring.force_encoding(Encoding.find(encoding || "utf-8")) + io = StringIO.new(outstring) + write_to io, options, &block + io.string + end + + ### + # Serialize this Node to HTML + # + # doc.to_html + # + # See Node#write_to for a list of +options+. For formatted output, + # use Node#to_xhtml instead. + def to_html(options = {}) + to_format SaveOptions::DEFAULT_HTML, options + end + + ### + # Serialize this Node to XML using +options+ + # + # doc.to_xml(:indent => 5, :encoding => 'UTF-8') + # + # See Node#write_to for a list of +options+ + def to_xml(options = {}) + options[:save_with] ||= SaveOptions::DEFAULT_XML + serialize(options) + end + + ### + # Serialize this Node to XHTML using +options+ + # + # doc.to_xhtml(:indent => 5, :encoding => 'UTF-8') + # + # See Node#write_to for a list of +options+ + def to_xhtml(options = {}) + to_format SaveOptions::DEFAULT_XHTML, options + end + + ### + # Write Node to +io+ with +options+. +options+ modify the output of + # this method. Valid options are: + # + # * +:encoding+ for changing the encoding + # * +:indent_text+ the indentation text, defaults to one space + # * +:indent+ the number of +:indent_text+ to use, defaults to 2 + # * +:save_with+ a combination of SaveOptions constants. + # + # To save with UTF-8 indented twice: + # + # node.write_to(io, :encoding => 'UTF-8', :indent => 2) + # + # To save indented with two dashes: + # + # node.write_to(io, :indent_text => '-', :indent => 2) + # + def write_to(io, *options) + options = options.first.is_a?(Hash) ? options.shift : {} + encoding = options[:encoding] || options[0] + if Nokogiri.jruby? + save_options = options[:save_with] || options[1] + indent_times = options[:indent] || 0 + else + save_options = options[:save_with] || options[1] || SaveOptions::FORMAT + indent_times = options[:indent] || 2 + end + indent_text = options[:indent_text] || " " + + # Any string times 0 returns an empty string. Therefore, use the same + # string instead of generating a new empty string for every node with + # zero indentation. + indentation = indent_times.zero? ? "" : (indent_text * indent_times) + + config = SaveOptions.new(save_options.to_i) + yield config if block_given? + + native_write_to(io, encoding, indentation, config.options) + end + + ### + # Write Node as HTML to +io+ with +options+ + # + # See Node#write_to for a list of +options+ + def write_html_to(io, options = {}) + write_format_to SaveOptions::DEFAULT_HTML, io, options + end + + ### + # Write Node as XHTML to +io+ with +options+ + # + # See Node#write_to for a list of +options+ + def write_xhtml_to(io, options = {}) + write_format_to SaveOptions::DEFAULT_XHTML, io, options + end + + ### + # Write Node as XML to +io+ with +options+ + # + # doc.write_xml_to io, :encoding => 'UTF-8' + # + # See Node#write_to for a list of options + def write_xml_to(io, options = {}) + options[:save_with] ||= SaveOptions::DEFAULT_XML + write_to io, options + end + + def canonicalize(mode = XML::XML_C14N_1_0, inclusive_namespaces = nil, with_comments = false) + c14n_root = self + document.canonicalize(mode, inclusive_namespaces, with_comments) do |node, parent| + tn = node.is_a?(XML::Node) ? node : parent + tn == c14n_root || tn.ancestors.include?(c14n_root) + end + end + + # @!endgroup + + protected + + def coerce(data) + case data + when XML::NodeSet + return data + when XML::DocumentFragment + return data.children + when String + return fragment(data).children + when Document, XML::Attr + # unacceptable + when XML::Node + return data + end + + raise ArgumentError, <<-EOERR +Requires a Node, NodeSet or String argument, and cannot accept a #{data.class}. +(You probably want to select a node from the Document with at() or search(), or create a new Node via Node.new().) + EOERR + end + + private + + def keywordify(keywords) + case keywords + when Enumerable + return keywords + when String + return keywords.scan(/\S+/) + else + raise ArgumentError.new("Keyword attributes must be passed as either a String or an Enumerable, but received #{keywords.class}") + end + end + + def add_sibling(next_or_previous, node_or_tags) + raise("Cannot add sibling to a node with no parent") unless parent + + impl = (next_or_previous == :next) ? :add_next_sibling_node : :add_previous_sibling_node + iter = (next_or_previous == :next) ? :reverse_each : :each + + node_or_tags = parent.coerce(node_or_tags) + if node_or_tags.is_a?(XML::NodeSet) + if text? + pivot = Nokogiri::XML::Node.new "dummy", document + send impl, pivot + else + pivot = self + end + node_or_tags.send(iter) { |n| pivot.send impl, n } + pivot.unlink if text? + else + send impl, node_or_tags + end + node_or_tags + end + + USING_LIBXML_WITH_BROKEN_SERIALIZATION = Nokogiri.uses_libxml?("~> 2.6.0").freeze + private_constant :USING_LIBXML_WITH_BROKEN_SERIALIZATION + + def to_format(save_option, options) + return dump_html if USING_LIBXML_WITH_BROKEN_SERIALIZATION + + options[:save_with] = save_option unless options[:save_with] + serialize(options) + end + + def write_format_to(save_option, io, options) + return (io << dump_html) if USING_LIBXML_WITH_BROKEN_SERIALIZATION + + options[:save_with] ||= save_option + write_to io, options + end + + def inspect_attributes + [:name, :namespace, :attribute_nodes, :children] + end + + # @private + IMPLIED_XPATH_CONTEXTS = [".//".freeze].freeze + + def add_child_node_and_reparent_attrs(node) + add_child_node node + node.attribute_nodes.find_all { |a| a.name =~ /:/ }.each do |attr_node| + attr_node.remove + node[attr_node.name] = attr_node.value + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/node/save_options.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/node/save_options.rb new file mode 100644 index 000000000000..6da00134bb4b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/node/save_options.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class Node + ### + # Save options for serializing nodes + class SaveOptions + # Format serialized xml + FORMAT = 1 + # Do not include declarations + NO_DECLARATION = 2 + # Do not include empty tags + NO_EMPTY_TAGS = 4 + # Do not save XHTML + NO_XHTML = 8 + # Save as XHTML + AS_XHTML = 16 + # Save as XML + AS_XML = 32 + # Save as HTML + AS_HTML = 64 + + if Nokogiri.jruby? + # Save builder created document + AS_BUILDER = 128 + # the default for XML documents + DEFAULT_XML = AS_XML # https://github.com/sparklemotion/nokogiri/issues/#issue/415 + # the default for HTML document + DEFAULT_HTML = NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML + else + # the default for XML documents + DEFAULT_XML = FORMAT | AS_XML + # the default for HTML document + DEFAULT_HTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML + end + # the default for XHTML document + DEFAULT_XHTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_XHTML + + # Integer representation of the SaveOptions + attr_reader :options + + # Create a new SaveOptions object with +options+ + def initialize options = 0; @options = options; end + + constants.each do |constant| + class_eval %{ + def #{constant.downcase} + @options |= #{constant} + self + end + + def #{constant.downcase}? + #{constant} & @options == #{constant} + end + } + end + + alias :to_i :options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/node_set.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/node_set.rb new file mode 100644 index 000000000000..695e78067f7f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/node_set.rb @@ -0,0 +1,372 @@ +# frozen_string_literal: true +module Nokogiri + module XML + #### + # A NodeSet contains a list of Nokogiri::XML::Node objects. Typically + # a NodeSet is return as a result of searching a Document via + # Nokogiri::XML::Searchable#css or Nokogiri::XML::Searchable#xpath + class NodeSet + include Nokogiri::XML::Searchable + include Enumerable + + # The Document this NodeSet is associated with + attr_accessor :document + + alias :clone :dup + + # Create a NodeSet with +document+ defaulting to +list+ + def initialize document, list = [] + @document = document + document.decorate(self) + list.each { |x| self << x } + yield self if block_given? + end + + ### + # Get the first element of the NodeSet. + def first n = nil + return self[0] unless n + list = [] + [n, length].min.times { |i| list << self[i] } + list + end + + ### + # Get the last element of the NodeSet. + def last + self[-1] + end + + ### + # Is this NodeSet empty? + def empty? + length == 0 + end + + ### + # Returns the index of the first node in self that is == to +node+ or meets the given block. Returns nil if no match is found. + def index(node = nil) + if node + warn "given block not used" if block_given? + each_with_index { |member, j| return j if member == node } + elsif block_given? + each_with_index { |member, j| return j if yield(member) } + end + nil + end + + ### + # Insert +datum+ before the first Node in this NodeSet + def before datum + first.before datum + end + + ### + # Insert +datum+ after the last Node in this NodeSet + def after datum + last.after datum + end + + alias :<< :push + alias :remove :unlink + + ### + # call-seq: css *rules, [namespace-bindings, custom-pseudo-class] + # + # Search this node set for CSS +rules+. +rules+ must be one or more CSS + # selectors. For example: + # + # For more information see Nokogiri::XML::Searchable#css + def css *args + rules, handler, ns, _ = extract_params(args) + paths = css_rules_to_xpath(rules, ns) + + inject(NodeSet.new(document)) do |set, node| + set + xpath_internal(node, paths, handler, ns, nil) + end + end + + ### + # call-seq: xpath *paths, [namespace-bindings, variable-bindings, custom-handler-class] + # + # Search this node set for XPath +paths+. +paths+ must be one or more XPath + # queries. + # + # For more information see Nokogiri::XML::Searchable#xpath + def xpath *args + paths, handler, ns, binds = extract_params(args) + + inject(NodeSet.new(document)) do |set, node| + set + xpath_internal(node, paths, handler, ns, binds) + end + end + + ### + # Search this NodeSet's nodes' immediate children using CSS selector +selector+ + def > selector + ns = document.root.namespaces + xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first + end + + ### + # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class] + # + # Search this object for +paths+, and return only the first + # result. +paths+ must be one or more XPath or CSS queries. + # + # See Searchable#search for more information. + # + # Or, if passed an integer, index into the NodeSet: + # + # node_set.at(3) # same as node_set[3] + # + def at *args + if args.length == 1 && args.first.is_a?(Numeric) + return self[args.first] + end + + super(*args) + end + alias :% :at + + ### + # Filter this list for nodes that match +expr+ + def filter expr + find_all { |node| node.matches?(expr) } + end + + ### + # Add the class attribute +name+ to all Node objects in the + # NodeSet. + # + # See Nokogiri::XML::Node#add_class for more information. + def add_class name + each do |el| + el.add_class(name) + end + self + end + + ### + # Append the class attribute +name+ to all Node objects in the + # NodeSet. + # + # See Nokogiri::XML::Node#append_class for more information. + def append_class name + each do |el| + el.append_class(name) + end + self + end + + ### + # Remove the class attribute +name+ from all Node objects in the + # NodeSet. + # + # See Nokogiri::XML::Node#remove_class for more information. + def remove_class name = nil + each do |el| + el.remove_class(name) + end + self + end + + ### + # Set attributes on each Node in the NodeSet, or get an + # attribute from the first Node in the NodeSet. + # + # To get an attribute from the first Node in a NodeSet: + # + # node_set.attr("href") # => "https://www.nokogiri.org" + # + # Note that an empty NodeSet will return nil when +#attr+ is called as a getter. + # + # To set an attribute on each node, +key+ can either be an + # attribute name, or a Hash of attribute names and values. When + # called as a setter, +#attr+ returns the NodeSet. + # + # If +key+ is an attribute name, then either +value+ or +block+ + # must be passed. + # + # If +key+ is a Hash then attributes will be set for each + # key/value pair: + # + # node_set.attr("href" => "https://www.nokogiri.org", "class" => "member") + # + # If +value+ is passed, it will be used as the attribute value + # for all nodes: + # + # node_set.attr("href", "https://www.nokogiri.org") + # + # If +block+ is passed, it will be called on each Node object in + # the NodeSet and the return value used as the attribute value + # for that node: + # + # node_set.attr("class") { |node| node.name } + # + def attr key, value = nil, &block + unless key.is_a?(Hash) || (key && (value || block)) + return first ? first.attribute(key) : nil + end + + hash = key.is_a?(Hash) ? key : { key => value } + + hash.each do |k,v| + each do |node| + node[k] = v || block.call(node) + end + end + + self + end + alias :set :attr + alias :attribute :attr + + ### + # Remove the attributed named +name+ from all Node objects in the NodeSet + def remove_attr name + each { |el| el.delete name } + self + end + alias remove_attribute remove_attr + + ### + # Iterate over each node, yielding to +block+ + def each + return to_enum unless block_given? + + 0.upto(length - 1) do |x| + yield self[x] + end + self + end + + ### + # Get the inner text of all contained Node objects + # + # Note: This joins the text of all Node objects in the NodeSet: + # + # doc = Nokogiri::XML('<xml><a><d>foo</d><d>bar</d></a></xml>') + # doc.css('d').text # => "foobar" + # + # Instead, if you want to return the text of all nodes in the NodeSet: + # + # doc.css('d').map(&:text) # => ["foo", "bar"] + # + # See Nokogiri::XML::Node#content for more information. + def inner_text + collect(&:inner_text).join('') + end + alias :text :inner_text + + ### + # Get the inner html of all contained Node objects + def inner_html *args + collect{|j| j.inner_html(*args) }.join('') + end + + ### + # Wrap this NodeSet with +html+ + def wrap html + map { |node| node.wrap html } + end + + ### + # Convert this NodeSet to a string. + def to_s + map(&:to_s).join + end + + ### + # Convert this NodeSet to HTML + def to_html *args + if Nokogiri.jruby? + options = args.first.is_a?(Hash) ? args.shift : {} + if !options[:save_with] + options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML + end + args.insert(0, options) + end + map { |x| x.to_html(*args) }.join + end + + ### + # Convert this NodeSet to XHTML + def to_xhtml *args + map { |x| x.to_xhtml(*args) }.join + end + + ### + # Convert this NodeSet to XML + def to_xml *args + map { |x| x.to_xml(*args) }.join + end + + alias :size :length + alias :to_ary :to_a + + ### + # Removes the last element from set and returns it, or +nil+ if + # the set is empty + def pop + return nil if length == 0 + delete last + end + + ### + # Returns the first element of the NodeSet and removes it. Returns + # +nil+ if the set is empty. + def shift + return nil if length == 0 + delete first + end + + ### + # Equality -- Two NodeSets are equal if the contain the same number + # of elements and if each element is equal to the corresponding + # element in the other NodeSet + def == other + return false unless other.is_a?(Nokogiri::XML::NodeSet) + return false unless length == other.length + each_with_index do |node, i| + return false unless node == other[i] + end + true + end + + ### + # Returns a new NodeSet containing all the children of all the nodes in + # the NodeSet + def children + node_set = NodeSet.new(document) + each do |node| + node.children.each { |n| node_set.push(n) } + end + node_set + end + + ### + # Returns a new NodeSet containing all the nodes in the NodeSet + # in reverse order + def reverse + node_set = NodeSet.new(document) + (length - 1).downto(0) do |x| + node_set.push self[x] + end + node_set + end + + ### + # Return a nicely formated string representation + def inspect + "[#{map(&:inspect).join ', '}]" + end + + alias :+ :| + + # @private + IMPLIED_XPATH_CONTEXTS = [ './/'.freeze, 'self::'.freeze ].freeze # :nodoc: + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/notation.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/notation.rb new file mode 100644 index 000000000000..1757fd96158b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/notation.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class Notation < Struct.new(:name, :public_id, :system_id) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/parse_options.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/parse_options.rb new file mode 100644 index 000000000000..a266d5ba073b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/parse_options.rb @@ -0,0 +1,127 @@ +# frozen_string_literal: true +module Nokogiri + module XML + ### + # Parse options for passing to Nokogiri.XML or Nokogiri.HTML + # + # == Building combinations of parse options + # You can build your own combinations of these parse options by using any of the following methods: + # *Note*: All examples attempt to set the +RECOVER+ & +NOENT+ options. + # [Ruby's bitwise operators] You can use the Ruby bitwise operators to set various combinations. + # Nokogiri.XML('<content>Chapter 1</content', nil, nil, Nokogiri::XML::ParseOptions.new((1 << 0) | (1 << 1))) + # [Method chaining] Every option has an equivalent method in lowercase. You can chain these methods together to set various combinations. + # Nokogiri.XML('<content>Chapter 1</content', nil, nil, Nokogiri::XML::ParseOptions.new.recover.noent) + # [Using Ruby Blocks] You can also setup parse combinations in the block passed to Nokogiri.XML or Nokogiri.HTML + # Nokogiri.XML('<content>Chapter 1</content') {|config| config.recover.noent} + # + # == Removing particular parse options + # You can also remove options from an instance of +ParseOptions+ dynamically. + # Every option has an equivalent <code>no{option}</code> method in lowercase. You can call these methods on an instance of +ParseOptions+ to remove the option. + # Note that this is not available for +STRICT+. + # + # # Setting the RECOVER & NOENT options... + # options = Nokogiri::XML::ParseOptions.new.recover.noent + # # later... + # options.norecover # Removes the Nokogiri::XML::ParseOptions::RECOVER option + # options.nonoent # Removes the Nokogiri::XML::ParseOptions::NOENT option + # + class ParseOptions + # Strict parsing + STRICT = 0 + # Recover from errors + RECOVER = 1 << 0 + # Substitute entities + NOENT = 1 << 1 + # Load external subsets + DTDLOAD = 1 << 2 + # Default DTD attributes + DTDATTR = 1 << 3 + # validate with the DTD + DTDVALID = 1 << 4 + # suppress error reports + NOERROR = 1 << 5 + # suppress warning reports + NOWARNING = 1 << 6 + # pedantic error reporting + PEDANTIC = 1 << 7 + # remove blank nodes + NOBLANKS = 1 << 8 + # use the SAX1 interface internally + SAX1 = 1 << 9 + # Implement XInclude substitution + XINCLUDE = 1 << 10 + # Forbid network access. Recommended for dealing with untrusted documents. + NONET = 1 << 11 + # Do not reuse the context dictionary + NODICT = 1 << 12 + # remove redundant namespaces declarations + NSCLEAN = 1 << 13 + # merge CDATA as text nodes + NOCDATA = 1 << 14 + # do not generate XINCLUDE START/END nodes + NOXINCNODE = 1 << 15 + # compact small text nodes; no modification of the tree allowed afterwards (will possibly crash if you try to modify the tree) + COMPACT = 1 << 16 + # parse using XML-1.0 before update 5 + OLD10 = 1 << 17 + # do not fixup XINCLUDE xml:base uris + NOBASEFIX = 1 << 18 + # relax any hardcoded limit from the parser + HUGE = 1 << 19 + + # the default options used for parsing XML documents + DEFAULT_XML = RECOVER | NONET + # the default options used for parsing HTML documents + DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET + # the default options used for parsing XML schemas + DEFAULT_SCHEMA = NONET + + attr_accessor :options + def initialize options = STRICT + @options = options + end + + constants.each do |constant| + next if constant.to_sym == :STRICT + class_eval %{ + def #{constant.downcase} + @options |= #{constant} + self + end + + def no#{constant.downcase} + @options &= ~#{constant} + self + end + + def #{constant.downcase}? + #{constant} & @options == #{constant} + end + } + end + + def strict + @options &= ~RECOVER + self + end + + def strict? + @options & RECOVER == STRICT + end + + def ==(other) + other.to_i == to_i + end + + alias :to_i :options + + def inspect + options = [] + self.class.constants.each do |k| + options << k.downcase if send(:"#{k.downcase}?") + end + super.sub(/>$/, " " + options.join(', ') + ">") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/pp.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/pp.rb new file mode 100644 index 000000000000..1b0f4df85024 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/pp.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true +require 'nokogiri/xml/pp/node' +require 'nokogiri/xml/pp/character_data' diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/pp/character_data.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/pp/character_data.rb new file mode 100644 index 000000000000..bc172c403d29 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/pp/character_data.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true +module Nokogiri + module XML + module PP + module CharacterData + def pretty_print pp # :nodoc: + nice_name = self.class.name.split('::').last + pp.group(2, "#(#{nice_name} ", ')') do + pp.pp text + end + end + + def inspect # :nodoc: + "#<#{self.class.name}:#{sprintf("0x%x",object_id)} #{text.inspect}>" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/pp/node.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/pp/node.rb new file mode 100644 index 000000000000..91fa70bbb7a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/pp/node.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true +module Nokogiri + module XML + module PP + module Node + def inspect # :nodoc: + attributes = inspect_attributes.reject { |x| + begin + attribute = send x + !attribute || (attribute.respond_to?(:empty?) && attribute.empty?) + rescue NoMethodError + true + end + }.map { |attribute| + "#{attribute.to_s.sub(/_\w+/, 's')}=#{send(attribute).inspect}" + }.join ' ' + "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{attributes}>" + end + + def pretty_print pp # :nodoc: + nice_name = self.class.name.split('::').last + pp.group(2, "#(#{nice_name}:#{sprintf("0x%x", object_id)} {", '})') do + + pp.breakable + attrs = inspect_attributes.map { |t| + [t, send(t)] if respond_to?(t) + }.compact.find_all { |x| + if x.last + if [:attribute_nodes, :children].include? x.first + !x.last.empty? + else + true + end + end + } + + pp.seplist(attrs) do |v| + if [:attribute_nodes, :children].include? v.first + pp.group(2, "#{v.first.to_s.sub(/_\w+$/, 's')} = [", "]") do + pp.breakable + pp.seplist(v.last) do |item| + pp.pp item + end + end + else + pp.text "#{v.first} = " + pp.pp v.last + end + end + pp.breakable + + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/processing_instruction.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/processing_instruction.rb new file mode 100644 index 000000000000..b7ae0067acf7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/processing_instruction.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class ProcessingInstruction < Node + def initialize document, name, content + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/reader.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/reader.rb new file mode 100644 index 000000000000..aeb133c74923 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/reader.rb @@ -0,0 +1,109 @@ +# frozen_string_literal: true +module Nokogiri + module XML + ### + # Nokogiri::XML::Reader parses an XML document similar to the way a cursor + # would move. The Reader is given an XML document, and yields nodes + # to an each block. + # + # Here is an example of usage: + # + # reader = Nokogiri::XML::Reader(<<-eoxml) + # <x xmlns:tenderlove='http://tenderlovemaking.com/'> + # <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo> + # </x> + # eoxml + # + # reader.each do |node| + # + # # node is an instance of Nokogiri::XML::Reader + # puts node.name + # + # end + # + # Note that Nokogiri::XML::Reader#each can only be called once!! Once + # the cursor moves through the entire document, you must parse the + # document again. So make sure that you capture any information you + # need during the first iteration. + # + # The Reader parser is good for when you need the speed of a SAX parser, + # but do not want to write a Document handler. + class Reader + include Enumerable + + TYPE_NONE = 0 + # Element node type + TYPE_ELEMENT = 1 + # Attribute node type + TYPE_ATTRIBUTE = 2 + # Text node type + TYPE_TEXT = 3 + # CDATA node type + TYPE_CDATA = 4 + # Entity Reference node type + TYPE_ENTITY_REFERENCE = 5 + # Entity node type + TYPE_ENTITY = 6 + # PI node type + TYPE_PROCESSING_INSTRUCTION = 7 + # Comment node type + TYPE_COMMENT = 8 + # Document node type + TYPE_DOCUMENT = 9 + # Document Type node type + TYPE_DOCUMENT_TYPE = 10 + # Document Fragment node type + TYPE_DOCUMENT_FRAGMENT = 11 + # Notation node type + TYPE_NOTATION = 12 + # Whitespace node type + TYPE_WHITESPACE = 13 + # Significant Whitespace node type + TYPE_SIGNIFICANT_WHITESPACE = 14 + # Element end node type + TYPE_END_ELEMENT = 15 + # Entity end node type + TYPE_END_ENTITY = 16 + # XML Declaration node type + TYPE_XML_DECLARATION = 17 + + # A list of errors encountered while parsing + attr_accessor :errors + + # The encoding for the document + attr_reader :encoding + + # The XML source + attr_reader :source + + alias :self_closing? :empty_element? + + def initialize source, url = nil, encoding = nil # :nodoc: + @source = source + @errors = [] + @encoding = encoding + end + private :initialize + + ### + # Get the attributes of the current node as a Hash + # @return [Hash<String, String>] Attribute names and values + def attributes + attrs_hash = attribute_nodes.each_with_object({}) do |node, hash| + hash[node.name] = node.to_s + end + ns = namespaces + attrs_hash.merge!(ns) if ns + attrs_hash + end + + ### + # Move the cursor through the document yielding the cursor to the block + def each + while cursor = self.read + yield cursor + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/relax_ng.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/relax_ng.rb new file mode 100644 index 000000000000..631dac29e32b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/relax_ng.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class << self + ### + # Create a new Nokogiri::XML::RelaxNG document from +string_or_io+. + # See Nokogiri::XML::RelaxNG for an example. + def RelaxNG(string_or_io, options = ParseOptions::DEFAULT_SCHEMA) + RelaxNG.new(string_or_io, options) + end + end + + ### + # Nokogiri::XML::RelaxNG is used for validating XML against a + # RelaxNG schema. + # + # == Synopsis + # + # Validate an XML document against a RelaxNG schema. Loop over the errors + # that are returned and print them out: + # + # schema = Nokogiri::XML::RelaxNG(File.open(ADDRESS_SCHEMA_FILE)) + # doc = Nokogiri::XML(File.open(ADDRESS_XML_FILE)) + # + # schema.validate(doc).each do |error| + # puts error.message + # end + # + # The list of errors are Nokogiri::XML::SyntaxError objects. + # + # NOTE: RelaxNG input is always treated as TRUSTED documents, meaning that they will cause the + # underlying parsing libraries to access network resources. This is counter to Nokogiri's + # "untrusted by default" security policy, but is a limitation of the underlying libraries. + class RelaxNG < Nokogiri::XML::Schema + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax.rb new file mode 100644 index 000000000000..e965f677b037 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true +require 'nokogiri/xml/sax/document' +require 'nokogiri/xml/sax/parser_context' +require 'nokogiri/xml/sax/parser' +require 'nokogiri/xml/sax/push_parser' diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/document.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/document.rb new file mode 100644 index 000000000000..0f32e8930af1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/document.rb @@ -0,0 +1,172 @@ +# frozen_string_literal: true +module Nokogiri + module XML + ### + # SAX Parsers are event driven parsers. Nokogiri provides two different + # event based parsers when dealing with XML. If you want to do SAX style + # parsing using HTML, check out Nokogiri::HTML::SAX. + # + # The basic way a SAX style parser works is by creating a parser, + # telling the parser about the events we're interested in, then giving + # the parser some XML to process. The parser will notify you when + # it encounters events you said you would like to know about. + # + # To register for events, you simply subclass Nokogiri::XML::SAX::Document, + # and implement the methods for which you would like notification. + # + # For example, if I want to be notified when a document ends, and when an + # element starts, I would write a class like this: + # + # class MyDocument < Nokogiri::XML::SAX::Document + # def end_document + # puts "the document has ended" + # end + # + # def start_element name, attributes = [] + # puts "#{name} started" + # end + # end + # + # Then I would instantiate a SAX parser with this document, and feed the + # parser some XML + # + # # Create a new parser + # parser = Nokogiri::XML::SAX::Parser.new(MyDocument.new) + # + # # Feed the parser some XML + # parser.parse(File.open(ARGV[0])) + # + # Now my document handler will be called when each node starts, and when + # then document ends. To see what kinds of events are available, take + # a look at Nokogiri::XML::SAX::Document. + # + # Two SAX parsers for XML are available, a parser that reads from a string + # or IO object as it feels necessary, and a parser that lets you spoon + # feed it XML. If you want to let Nokogiri deal with reading your XML, + # use the Nokogiri::XML::SAX::Parser. If you want to have fine grain + # control over the XML input, use the Nokogiri::XML::SAX::PushParser. + module SAX + ### + # This class is used for registering types of events you are interested + # in handling. All of the methods on this class are available as + # possible events while parsing an XML document. To register for any + # particular event, just subclass this class and implement the methods + # you are interested in knowing about. + # + # To only be notified about start and end element events, write a class + # like this: + # + # class MyDocument < Nokogiri::XML::SAX::Document + # def start_element name, attrs = [] + # puts "#{name} started!" + # end + # + # def end_element name + # puts "#{name} ended" + # end + # end + # + # You can use this event handler for any SAX style parser included with + # Nokogiri. See Nokogiri::XML::SAX, and Nokogiri::HTML::SAX. + class Document + ### + # Called when an XML declaration is parsed + def xmldecl version, encoding, standalone + end + + ### + # Called when document starts parsing + def start_document + end + + ### + # Called when document ends parsing + def end_document + end + + ### + # Called at the beginning of an element + # * +name+ is the name of the tag + # * +attrs+ are an assoc list of namespaces and attributes, e.g.: + # [ ["xmlns:foo", "http://sample.net"], ["size", "large"] ] + def start_element name, attrs = [] + end + + ### + # Called at the end of an element + # +name+ is the tag name + def end_element name + end + + ### + # Called at the beginning of an element + # +name+ is the element name + # +attrs+ is a list of attributes + # +prefix+ is the namespace prefix for the element + # +uri+ is the associated namespace URI + # +ns+ is a hash of namespace prefix:urls associated with the element + def start_element_namespace name, attrs = [], prefix = nil, uri = nil, ns = [] + ### + # Deal with SAX v1 interface + name = [prefix, name].compact.join(':') + attributes = ns.map { |ns_prefix,ns_uri| + [['xmlns', ns_prefix].compact.join(':'), ns_uri] + } + attrs.map { |attr| + [[attr.prefix, attr.localname].compact.join(':'), attr.value] + } + start_element name, attributes + end + + ### + # Called at the end of an element + # +name+ is the element's name + # +prefix+ is the namespace prefix associated with the element + # +uri+ is the associated namespace URI + def end_element_namespace name, prefix = nil, uri = nil + ### + # Deal with SAX v1 interface + end_element [prefix, name].compact.join(':') + end + + ### + # Characters read between a tag. This method might be called multiple + # times given one contiguous string of characters. + # + # +string+ contains the character data + def characters string + end + + ### + # Called when comments are encountered + # +string+ contains the comment data + def comment string + end + + ### + # Called on document warnings + # +string+ contains the warning + def warning string + end + + ### + # Called on document errors + # +string+ contains the error + def error string + end + + ### + # Called when cdata blocks are found + # +string+ contains the cdata content + def cdata_block string + end + + ### + # Called when processing instructions are found + # +name+ is the target of the instruction + # +content+ is the value of the instruction + def processing_instruction name, content + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/parser.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/parser.rb new file mode 100644 index 000000000000..e75e87f38663 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/parser.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true +module Nokogiri + module XML + module SAX + ### + # This parser is a SAX style parser that reads it's input as it + # deems necessary. The parser takes a Nokogiri::XML::SAX::Document, + # an optional encoding, then given an XML input, sends messages to + # the Nokogiri::XML::SAX::Document. + # + # Here is an example of using this parser: + # + # # Create a subclass of Nokogiri::XML::SAX::Document and implement + # # the events we care about: + # class MyDoc < Nokogiri::XML::SAX::Document + # def start_element name, attrs = [] + # puts "starting: #{name}" + # end + # + # def end_element name + # puts "ending: #{name}" + # end + # end + # + # # Create our parser + # parser = Nokogiri::XML::SAX::Parser.new(MyDoc.new) + # + # # Send some XML to the parser + # parser.parse(File.open(ARGV[0])) + # + # For more information about SAX parsers, see Nokogiri::XML::SAX. Also + # see Nokogiri::XML::SAX::Document for the available events. + class Parser + class Attribute < Struct.new(:localname, :prefix, :uri, :value) + end + + # Encodinds this parser supports + ENCODINGS = { + 'NONE' => 0, # No char encoding detected + 'UTF-8' => 1, # UTF-8 + 'UTF16LE' => 2, # UTF-16 little endian + 'UTF16BE' => 3, # UTF-16 big endian + 'UCS4LE' => 4, # UCS-4 little endian + 'UCS4BE' => 5, # UCS-4 big endian + 'EBCDIC' => 6, # EBCDIC uh! + 'UCS4-2143' => 7, # UCS-4 unusual ordering + 'UCS4-3412' => 8, # UCS-4 unusual ordering + 'UCS2' => 9, # UCS-2 + 'ISO-8859-1' => 10, # ISO-8859-1 ISO Latin 1 + 'ISO-8859-2' => 11, # ISO-8859-2 ISO Latin 2 + 'ISO-8859-3' => 12, # ISO-8859-3 + 'ISO-8859-4' => 13, # ISO-8859-4 + 'ISO-8859-5' => 14, # ISO-8859-5 + 'ISO-8859-6' => 15, # ISO-8859-6 + 'ISO-8859-7' => 16, # ISO-8859-7 + 'ISO-8859-8' => 17, # ISO-8859-8 + 'ISO-8859-9' => 18, # ISO-8859-9 + 'ISO-2022-JP' => 19, # ISO-2022-JP + 'SHIFT-JIS' => 20, # Shift_JIS + 'EUC-JP' => 21, # EUC-JP + 'ASCII' => 22, # pure ASCII + } + + # The Nokogiri::XML::SAX::Document where events will be sent. + attr_accessor :document + + # The encoding beings used for this document. + attr_accessor :encoding + + # Create a new Parser with +doc+ and +encoding+ + def initialize doc = Nokogiri::XML::SAX::Document.new, encoding = 'UTF-8' + @encoding = check_encoding(encoding) + @document = doc + @warned = false + end + + ### + # Parse given +thing+ which may be a string containing xml, or an + # IO object. + def parse thing, &block + if thing.respond_to?(:read) && thing.respond_to?(:close) + parse_io(thing, &block) + else + parse_memory(thing, &block) + end + end + + ### + # Parse given +io+ + def parse_io io, encoding = 'ASCII' + @encoding = check_encoding(encoding) + ctx = ParserContext.io(io, ENCODINGS[@encoding]) + yield ctx if block_given? + ctx.parse_with self + end + + ### + # Parse a file with +filename+ + def parse_file filename + raise ArgumentError unless filename + raise Errno::ENOENT unless File.exist?(filename) + raise Errno::EISDIR if File.directory?(filename) + ctx = ParserContext.file filename + yield ctx if block_given? + ctx.parse_with self + end + + def parse_memory data + ctx = ParserContext.memory data + yield ctx if block_given? + ctx.parse_with self + end + + private + def check_encoding(encoding) + encoding.upcase.tap do |enc| + raise ArgumentError.new("'#{enc}' is not a valid encoding") unless ENCODINGS[enc] + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/parser_context.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/parser_context.rb new file mode 100644 index 000000000000..c325a8cbd66f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/parser_context.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +module Nokogiri + module XML + module SAX + ### + # Context for XML SAX parsers. This class is usually not instantiated + # by the user. Instead, you should be looking at + # Nokogiri::XML::SAX::Parser + class ParserContext + def self.new thing, encoding = 'UTF-8' + [:read, :close].all? { |x| thing.respond_to?(x) } ? + io(thing, Parser::ENCODINGS[encoding]) : memory(thing) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/push_parser.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/push_parser.rb new file mode 100644 index 000000000000..d386695bb1e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/sax/push_parser.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true +module Nokogiri + module XML + module SAX + ### + # PushParser can parse a document that is fed to it manually. It + # must be given a SAX::Document object which will be called with + # SAX events as the document is being parsed. + # + # Calling PushParser#<< writes XML to the parser, calling any SAX + # callbacks it can. + # + # PushParser#finish tells the parser that the document is finished + # and calls the end_document SAX method. + # + # Example: + # + # parser = PushParser.new(Class.new(XML::SAX::Document) { + # def start_document + # puts "start document called" + # end + # }.new) + # parser << "<div>hello<" + # parser << "/div>" + # parser.finish + class PushParser + + # The Nokogiri::XML::SAX::Document on which the PushParser will be + # operating + attr_accessor :document + + ### + # Create a new PushParser with +doc+ as the SAX Document, providing + # an optional +file_name+ and +encoding+ + def initialize(doc = XML::SAX::Document.new, file_name = nil, encoding = 'UTF-8') + @document = doc + @encoding = encoding + @sax_parser = XML::SAX::Parser.new(doc) + + ## Create our push parser context + initialize_native(@sax_parser, file_name) + end + + ### + # Write a +chunk+ of XML to the PushParser. Any callback methods + # that can be called will be called immediately. + def write chunk, last_chunk = false + native_write(chunk, last_chunk) + end + alias :<< :write + + ### + # Finish the parsing. This method is only necessary for + # Nokogiri::XML::SAX::Document#end_document to be called. + def finish + write '', true + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/schema.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/schema.rb new file mode 100644 index 000000000000..904cf704f209 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/schema.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class << self + ### + # Create a new Nokogiri::XML::Schema object using a +string_or_io+ + # object. + def Schema(string_or_io, options = ParseOptions::DEFAULT_SCHEMA) + Schema.new(string_or_io, options) + end + end + + ### + # Nokogiri::XML::Schema is used for validating XML against a schema + # (usually from an xsd file). + # + # == Synopsis + # + # Validate an XML document against a Schema. Loop over the errors that + # are returned and print them out: + # + # xsd = Nokogiri::XML::Schema(File.read(PO_SCHEMA_FILE)) + # doc = Nokogiri::XML(File.read(PO_XML_FILE)) + # + # xsd.validate(doc).each do |error| + # puts error.message + # end + # + # The list of errors are Nokogiri::XML::SyntaxError objects. + # + # NOTE: As of v1.11.0, Schema treats inputs as UNTRUSTED by default, and so external entities + # are not resolved from the network (`http://` or `ftp://`). Previously, parsing treated + # documents as "trusted" by default which was counter to Nokogiri's "untrusted by default" + # security policy. If a document is trusted, then the caller may turn off the NONET option via + # the ParseOptions to re-enable external entity resolution over a network connection. + class Schema + # Errors while parsing the schema file + attr_accessor :errors + # The Nokogiri::XML::ParseOptions used to parse the schema + attr_accessor :parse_options + + ### + # Create a new Nokogiri::XML::Schema object using a +string_or_io+ + # object. + def self.new string_or_io, options = ParseOptions::DEFAULT_SCHEMA + from_document(Nokogiri::XML(string_or_io), options) + end + + ### + # Validate +thing+ against this schema. +thing+ can be a + # Nokogiri::XML::Document object, or a filename. An Array of + # Nokogiri::XML::SyntaxError objects found while validating the + # +thing+ is returned. + def validate thing + if thing.is_a?(Nokogiri::XML::Document) + validate_document(thing) + elsif File.file?(thing) + validate_file(thing) + else + raise ArgumentError, "Must provide Nokogiri::Xml::Document or the name of an existing file" + end + end + + ### + # Returns true if +thing+ is a valid Nokogiri::XML::Document or + # file. + def valid? thing + validate(thing).length == 0 + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/searchable.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/searchable.rb new file mode 100644 index 000000000000..b2999c5f69e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/searchable.rb @@ -0,0 +1,239 @@ +# frozen_string_literal: true +module Nokogiri + module XML + # + # The Searchable module declares the interface used for searching your DOM. + # + # It implements the public methods `search`, `css`, and `xpath`, + # as well as allowing specific implementations to specialize some + # of the important behaviors. + # + module Searchable + # Regular expression used by Searchable#search to determine if a query + # string is CSS or XPath + LOOKS_LIKE_XPATH = /^(\.\/|\/|\.\.|\.$)/ + + # @!group Searching via XPath or CSS Queries + + ### + # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class] + # + # Search this object for +paths+. +paths+ must be one or more XPath or CSS queries: + # + # node.search("div.employee", ".//title") + # + # A hash of namespace bindings may be appended: + # + # node.search('.//bike:tire', {'bike' => 'http://schwinn.com/'}) + # node.search('bike|tire', {'bike' => 'http://schwinn.com/'}) + # + # For XPath queries, a hash of variable bindings may also be + # appended to the namespace bindings. For example: + # + # node.search('.//address[@domestic=$value]', nil, {:value => 'Yes'}) + # + # Custom XPath functions and CSS pseudo-selectors may also be + # defined. To define custom functions create a class and + # implement the function you want to define. The first argument + # to the method will be the current matching NodeSet. Any other + # arguments are ones that you pass in. Note that this class may + # appear anywhere in the argument list. For example: + # + # node.search('.//title[regex(., "\w+")]', 'div.employee:regex("[0-9]+")' + # Class.new { + # def regex node_set, regex + # node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ } + # end + # }.new + # ) + # + # See Searchable#xpath and Searchable#css for further usage help. + def search(*args) + paths, handler, ns, binds = extract_params(args) + + xpaths = paths.map(&:to_s).map do |path| + (path =~ LOOKS_LIKE_XPATH) ? path : xpath_query_from_css_rule(path, ns) + end.flatten.uniq + + xpath(*(xpaths + [ns, handler, binds].compact)) + end + + alias :/ :search + + ### + # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class] + # + # Search this object for +paths+, and return only the first + # result. +paths+ must be one or more XPath or CSS queries. + # + # See Searchable#search for more information. + def at(*args) + search(*args).first + end + + alias :% :at + + ### + # call-seq: css *rules, [namespace-bindings, custom-pseudo-class] + # + # Search this object for CSS +rules+. +rules+ must be one or more CSS + # selectors. For example: + # + # node.css('title') + # node.css('body h1.bold') + # node.css('div + p.green', 'div#one') + # + # A hash of namespace bindings may be appended. For example: + # + # node.css('bike|tire', {'bike' => 'http://schwinn.com/'}) + # + # Custom CSS pseudo classes may also be defined. To define + # custom pseudo classes, create a class and implement the custom + # pseudo class you want defined. The first argument to the + # method will be the current matching NodeSet. Any other + # arguments are ones that you pass in. For example: + # + # node.css('title:regex("\w+")', Class.new { + # def regex node_set, regex + # node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ } + # end + # }.new) + # + # Note that the CSS query string is case-sensitive with regards + # to your document type. That is, if you're looking for "H1" in + # an HTML document, you'll never find anything, since HTML tags + # will match only lowercase CSS queries. However, "H1" might be + # found in an XML document, where tags names are case-sensitive + # (e.g., "H1" is distinct from "h1"). + # + def css(*args) + rules, handler, ns, _ = extract_params(args) + + css_internal self, rules, handler, ns + end + + ## + # call-seq: css *rules, [namespace-bindings, custom-pseudo-class] + # + # Search this object for CSS +rules+, and return only the first + # match. +rules+ must be one or more CSS selectors. + # + # See Searchable#css for more information. + def at_css(*args) + css(*args).first + end + + ### + # call-seq: xpath *paths, [namespace-bindings, variable-bindings, custom-handler-class] + # + # Search this node for XPath +paths+. +paths+ must be one or more XPath + # queries. + # + # node.xpath('.//title') + # + # A hash of namespace bindings may be appended. For example: + # + # node.xpath('.//foo:name', {'foo' => 'http://example.org/'}) + # node.xpath('.//xmlns:name', node.root.namespaces) + # + # A hash of variable bindings may also be appended to the namespace bindings. For example: + # + # node.xpath('.//address[@domestic=$value]', nil, {:value => 'Yes'}) + # + # Custom XPath functions may also be defined. To define custom + # functions create a class and implement the function you want + # to define. The first argument to the method will be the + # current matching NodeSet. Any other arguments are ones that + # you pass in. Note that this class may appear anywhere in the + # argument list. For example: + # + # node.xpath('.//title[regex(., "\w+")]', Class.new { + # def regex node_set, regex + # node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ } + # end + # }.new) + # + def xpath(*args) + paths, handler, ns, binds = extract_params(args) + + xpath_internal self, paths, handler, ns, binds + end + + ## + # call-seq: xpath *paths, [namespace-bindings, variable-bindings, custom-handler-class] + # + # Search this node for XPath +paths+, and return only the first + # match. +paths+ must be one or more XPath queries. + # + # See Searchable#xpath for more information. + def at_xpath(*args) + xpath(*args).first + end + + # @!endgroup + + private + + def css_internal(node, rules, handler, ns) + xpath_internal node, css_rules_to_xpath(rules, ns), handler, ns, nil + end + + def xpath_internal(node, paths, handler, ns, binds) + document = node.document + return NodeSet.new(document) unless document + + if paths.length == 1 + return xpath_impl(node, paths.first, handler, ns, binds) + end + + NodeSet.new(document) do |combined| + paths.each do |path| + xpath_impl(node, path, handler, ns, binds).each { |set| combined << set } + end + end + end + + def xpath_impl(node, path, handler, ns, binds) + ctx = XPathContext.new(node) + ctx.register_namespaces(ns) + path = path.gsub(/xmlns:/, " :") unless Nokogiri.uses_libxml? + + binds.each do |key, value| + ctx.register_variable key.to_s, value + end if binds + + ctx.evaluate(path, handler) + end + + def css_rules_to_xpath(rules, ns) + rules.map { |rule| xpath_query_from_css_rule(rule, ns) } + end + + def xpath_query_from_css_rule(rule, ns) + visitor = Nokogiri::CSS::XPathVisitorOptimallyUseBuiltins.new + self.class::IMPLIED_XPATH_CONTEXTS.map do |implied_xpath_context| + CSS.xpath_for(rule.to_s, {:prefix => implied_xpath_context, :ns => ns, + :visitor => visitor}) + end.join(" | ") + end + + def extract_params(params) # :nodoc: + handler = params.find do |param| + ![Hash, String, Symbol].include?(param.class) + end + params -= [handler] if handler + + hashes = [] + while Hash === params.last || params.last.nil? + hashes << params.pop + break if params.empty? + end + ns, binds = hashes.reverse + + ns ||= document.root ? document.root.namespaces : {} + + [params, handler, ns, binds] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/syntax_error.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/syntax_error.rb new file mode 100644 index 000000000000..e6fac7637fab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/syntax_error.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true +module Nokogiri + module XML + ### + # This class provides information about XML SyntaxErrors. These + # exceptions are typically stored on Nokogiri::XML::Document#errors. + class SyntaxError < ::Nokogiri::SyntaxError + attr_reader :domain + attr_reader :code + attr_reader :level + attr_reader :file + attr_reader :line + attr_reader :str1 + attr_reader :str2 + attr_reader :str3 + attr_reader :int1 + attr_reader :column + + ### + # return true if this is a non error + def none? + level == 0 + end + + ### + # return true if this is a warning + def warning? + level == 1 + end + + ### + # return true if this is an error + def error? + level == 2 + end + + ### + # return true if this error is fatal + def fatal? + level == 3 + end + + def to_s + message = super.chomp + [location_to_s, level_to_s, message]. + compact.join(": "). + force_encoding(message.encoding) + end + + private + + def level_to_s + case level + when 3 then "FATAL" + when 2 then "ERROR" + when 1 then "WARNING" + else nil + end + end + + def nil_or_zero?(attribute) + attribute.nil? || attribute.zero? + end + + def location_to_s + return nil if nil_or_zero?(line) && nil_or_zero?(column) + "#{line}:#{column}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/text.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/text.rb new file mode 100644 index 000000000000..df05e57a7b4a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/text.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class Text < Nokogiri::XML::CharacterData + def content=(string) + self.native_content = string.to_s + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/xpath.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/xpath.rb new file mode 100644 index 000000000000..e2f30fe0e47a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/xpath.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true +require 'nokogiri/xml/xpath/syntax_error' + +module Nokogiri + module XML + module XPath + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/xpath/syntax_error.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/xpath/syntax_error.rb new file mode 100644 index 000000000000..b4a2b6f0944c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/xpath/syntax_error.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +module Nokogiri + module XML + module XPath + class SyntaxError < XML::SyntaxError + def to_s + [super.chomp, str1].compact.join(': ') + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/xpath_context.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/xpath_context.rb new file mode 100644 index 000000000000..787e9aeecabb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xml/xpath_context.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +module Nokogiri + module XML + class XPathContext + + ### + # Register namespaces in +namespaces+ + def register_namespaces(namespaces) + namespaces.each do |k, v| + k = k.to_s.gsub(/.*:/,'') # strip off 'xmlns:' or 'xml:' + register_ns(k, v) + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xslt.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xslt.rb new file mode 100644 index 000000000000..50cdcaf9ae2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xslt.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true +require 'nokogiri/xslt/stylesheet' + +module Nokogiri + class << self + ### + # Create a Nokogiri::XSLT::Stylesheet with +stylesheet+. + # + # Example: + # + # xslt = Nokogiri::XSLT(File.read(ARGV[0])) + # + def XSLT stylesheet, modules = {} + XSLT.parse(stylesheet, modules) + end + end + + ### + # See Nokogiri::XSLT::Stylesheet for creating and manipulating + # Stylesheet object. + module XSLT + class << self + ### + # Parse the stylesheet in +string+, register any +modules+ + def parse string, modules = {} + modules.each do |url, klass| + XSLT.register url, klass + end + + if Nokogiri.jruby? + Stylesheet.parse_stylesheet_doc(XML.parse(string), string) + else + Stylesheet.parse_stylesheet_doc(XML.parse(string)) + end + end + + ### + # Quote parameters in +params+ for stylesheet safety + def quote_params params + parray = (params.instance_of?(Hash) ? params.to_a.flatten : params).dup + parray.each_with_index do |v,i| + if i % 2 > 0 + parray[i]= + if v =~ /'/ + "concat('#{ v.gsub(/'/, %q{', "'", '}) }')" + else + "'#{v}'"; + end + else + parray[i] = v.to_s + end + end + parray.flatten + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xslt/stylesheet.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xslt/stylesheet.rb new file mode 100644 index 000000000000..acdd9cb3f1b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/nokogiri/xslt/stylesheet.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true +module Nokogiri + module XSLT + ### + # A Stylesheet represents an XSLT Stylesheet object. Stylesheet creation + # is done through Nokogiri.XSLT. Here is an example of transforming + # an XML::Document with a Stylesheet: + # + # doc = Nokogiri::XML(File.read('some_file.xml')) + # xslt = Nokogiri::XSLT(File.read('some_transformer.xslt')) + # + # puts xslt.transform(doc) + # + # See Nokogiri::XSLT::Stylesheet#transform for more transformation + # information. + class Stylesheet + ### + # Apply an XSLT stylesheet to an XML::Document. + # +params+ is an array of strings used as XSLT parameters. + # returns serialized document + def apply_to document, params = [] + serialize(transform(document, params)) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/xsd/xmlparser/nokogiri.rb b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/xsd/xmlparser/nokogiri.rb new file mode 100644 index 000000000000..2bf543e97974 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/nokogiri-1.11.4-x86_64-linux/lib/xsd/xmlparser/nokogiri.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true +require 'nokogiri' + +module XSD # :nodoc: + module XMLParser # :nodoc: + ### + # Nokogiri XML parser for soap4r. + # + # Nokogiri may be used as the XML parser in soap4r. Simply require + # 'xsd/xmlparser/nokogiri' in your soap4r applications, and soap4r + # will use Nokogiri as it's XML parser. No other changes should be + # required to use Nokogiri as the XML parser. + # + # Example (using UW ITS Web Services): + # + # require 'rubygems' + # require 'nokogiri' + # gem 'soap4r' + # require 'defaultDriver' + # require 'xsd/xmlparser/nokogiri' + # + # obj = AvlPortType.new + # obj.getLatestByRoute(obj.getAgencies.first, 8).each do |bus| + # p "#{bus.routeID}, #{bus.longitude}, #{bus.latitude}" + # end + # + class Nokogiri < XSD::XMLParser::Parser + ### + # Create a new XSD parser with +host+ and +opt+ + def initialize host, opt = {} + super + @parser = ::Nokogiri::XML::SAX::Parser.new(self, @charset || 'UTF-8') + end + + ### + # Start parsing +string_or_readable+ + def do_parse string_or_readable + @parser.parse(string_or_readable) + end + + ### + # Handle the start_element event with +name+ and +attrs+ + def start_element name, attrs = [] + super(name, Hash[*attrs.flatten]) + end + + ### + # Handle the end_element event with +name+ + def end_element name + super + end + + ### + # Handle errors with message +msg+ + def error msg + raise ParseError.new(msg) + end + alias :warning :error + + ### + # Handle cdata_blocks containing +string+ + def cdata_block string + characters string + end + + ### + # Called at the beginning of an element + # +name+ is the element name + # +attrs+ is a list of attributes + # +prefix+ is the namespace prefix for the element + # +uri+ is the associated namespace URI + # +ns+ is a hash of namespace prefix:urls associated with the element + def start_element_namespace name, attrs = [], prefix = nil, uri = nil, ns = [] + ### + # Deal with SAX v1 interface + name = [prefix, name].compact.join(':') + attributes = ns.map { |ns_prefix,ns_uri| + [['xmlns', ns_prefix].compact.join(':'), ns_uri] + } + attrs.map { |attr| + [[attr.prefix, attr.localname].compact.join(':'), attr.value] + }.flatten + start_element name, attributes + end + + ### + # Called at the end of an element + # +name+ is the element's name + # +prefix+ is the namespace prefix associated with the element + # +uri+ is the associated namespace URI + def end_element_namespace name, prefix = nil, uri = nil + ### + # Deal with SAX v1 interface + end_element [prefix, name].compact.join(':') + end + + %w{ xmldecl start_document end_document comment }.each do |name| + class_eval %{ def #{name}(*args); end } + end + + add_factory(self) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/.document b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/.document new file mode 100644 index 000000000000..0ad1bde480e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/.document @@ -0,0 +1,5 @@ +lib/**/*.rb +bin/* +features/**/*.feature +- +LICENSE.md diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/CONTRIBUTING.md b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/CONTRIBUTING.md new file mode 100644 index 000000000000..669e8168fa7c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/CONTRIBUTING.md @@ -0,0 +1,23 @@ +## Submitting a Pull Request + +0. Read our [Code of Conduct](CODE_OF_CONDUCT.md). +1. Check out [Hacking on Octokit](README.md#hacking-on-octokitrb) in the + README for bootstrapping the project for local development. +2. [Fork the repository.][fork] +3. [Create a topic branch.][branch] +4. Add specs for your unimplemented feature or bug fix. +5. Run `script/test`. If your specs pass, return to step 3. +6. Implement your feature or bug fix. +7. Run `script/test`. If your specs fail, return to step 5. +8. Run `open coverage/index.html`. If your changes are not completely covered + by your tests, return to step 4. +9. Add documentation for your feature or bug fix. +10. Run `bundle exec rake doc:yard`. If your changes are not 100% documented, go + back to step 8. +11. Add, commit, and push your changes. For documentation-only fixes, please + add "[ci skip]" to your commit message to avoid needless CI builds. +12. [Submit a pull request.][pr] + +[fork]: https://help.github.com/articles/fork-a-repo +[branch]: https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/ +[pr]: https://help.github.com/articles/using-pull-requests diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/LICENSE.md new file mode 100644 index 000000000000..f19833128632 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/LICENSE.md @@ -0,0 +1,20 @@ +Copyright (c) 2009-2017 Wynn Netherland, Adam Stacoviak, Erik Michaels-Ober + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/README.md b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/README.md new file mode 100644 index 000000000000..1319148f2e69 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/README.md @@ -0,0 +1,793 @@ +# Octokit + +Ruby toolkit for the GitHub API. + +![logo](http://cl.ly/image/3Y013H0A2z3z/gundam-ruby.png) + +Upgrading? Check the [Upgrade Guide](#upgrading-guide) before bumping to a new +[major version][semver]. + +## Table of Contents + +1. [Philosophy](#philosophy) +2. [Quick start](#quick-start) +3. [Making requests](#making-requests) +4. [Consuming resources](#consuming-resources) +5. [Accessing HTTP responses](#accessing-http-responses) +6. [Authentication](#authentication) + 1. [Basic Authentication](#basic-authentication) + 2. [OAuth access tokens](#oauth-access-tokens) + 3. [Two-Factor Authentication](#two-factor-authentication) + 4. [Using a .netrc file](#using-a-netrc-file) + 5. [Application authentication](#application-authentication) +7. [Pagination](#pagination) + 1. [Auto pagination](#auto-pagination) +8. [Working with GitHub Enterprise](#working-with-github-enterprise) + 1. [Interacting with the GitHub.com APIs in GitHub Enterprise](#interacting-with-the-githubcom-apis-in-github-enterprise) + 2. [Interacting with the GitHub Enterprise Admin APIs](#interacting-with-the-github-enterprise-admin-apis) + 3. [Interacting with the GitHub Enterprise Management Console APIs](#interacting-with-the-github-enterprise-management-console-apis) +9. [SSL Connection Errors](#ssl-connection-errors) +10. [Configuration and defaults](#configuration-and-defaults) + 1. [Configuring module defaults](#configuring-module-defaults) + 2. [Using ENV variables](#using-env-variables) + 3. [Timeouts](#timeouts) +11. [Hypermedia agent](#hypermedia-agent) + 1. [Hypermedia in Octokit](#hypermedia-in-octokit) + 2. [URI templates](#uri-templates) + 3. [The Full Hypermedia Experience™](#the-full-hypermedia-experience) +12. [Upgrading guide](#upgrading-guide) + 1. [Upgrading from 1.x.x](#upgrading-from-1xx) +13. [Advanced usage](#advanced-usage) + 1. [Debugging](#debugging) + 2. [Caching](#caching) +14. [Hacking on Octokit.rb](#hacking-on-octokitrb) + 1. [Code of Conduct](#code-of-conduct) + 2. [Running and writing new tests](#running-and-writing-new-tests) +15. [Supported Ruby Versions](#supported-ruby-versions) +16. [Versioning](#versioning) +17. [Making Repeating Requests](#making-repeating-requests) +18. [License](#license) + +## Philosophy + +API wrappers [should reflect the idioms of the language in which they were +written][wrappers]. Octokit.rb wraps the [GitHub API][github-api] in a flat API +client that follows Ruby conventions and requires little knowledge of REST. +Most methods have positional arguments for required input and an options hash +for optional parameters, headers, or other options: + +```ruby +client = Octokit::Client.new + +# Fetch a README with Accept header for HTML format +client.readme 'al3x/sovereign', :accept => 'application/vnd.github.html' +``` + +[wrappers]: http://wynnnetherland.com/journal/what-makes-a-good-api-wrapper +[github-api]: https://developer.github.com/v3/ + +## Quick start + +Install via Rubygems + + gem install octokit + +... or add to your Gemfile + + gem "octokit", "~> 4.0" + +Access the library in Ruby: + + require 'octokit' + +### Making requests + +[API methods][] are available as client instance methods. + +```ruby +# Provide authentication credentials +client = Octokit::Client.new(:login => 'defunkt', :password => 'c0d3b4ssssss!') + +# Set access_token instead of login and password if you use personal access token +# client = Octokit::Client.new(:access_token => '[personal_access_token]!') + +# Fetch the current user +client.user +``` + +### Additional Query Parameters + +When passing additional parameters to GET based request use the following syntax: + +```ruby + # query: { parameter_name: 'value' } + # Example: Get repository listing by owner in ascending order + client.repos({}, query: {type: 'owner', sort: 'asc'}) + + # Example: Get contents of a repository by ref + # https://api.github.com/repos/octokit/octokit.rb/contents/path/to/file.rb?ref=some-other-branch + client.contents('octokit/octokit.rb', path: 'path/to/file.rb', query: {ref: 'some-other-branch'}) +``` + +[API methods]: http://octokit.github.io/octokit.rb/method_list.html + +### Consuming resources + +Most methods return a `Resource` object which provides dot notation and `[]` +access for fields returned in the API response. + +```ruby +client = Octokit::Client.new + +# Fetch a user +user = client.user 'jbarnette' +puts user.name +# => "John Barnette" +puts user.fields +# => <Set: {:login, :id, :gravatar_id, :type, :name, :company, :blog, :location, :email, :hireable, :bio, :public_repos, :followers, :following, :created_at, :updated_at, :public_gists}> +puts user[:company] +# => "GitHub" +user.rels[:gists].href +# => "https://api.github.com/users/jbarnette/gists" +``` + +**Note:** URL fields are culled into a separate `.rels` collection for easier +[Hypermedia](#hypermedia-agent) support. + +### Accessing HTTP responses + +While most methods return a `Resource` object or a Boolean, sometimes you may +need access to the raw HTTP response headers. You can access the last HTTP +response with `Client#last_response`: + +```ruby +user = client.user 'andrewpthorp' +response = client.last_response +etag = response.headers[:etag] +``` + +## Authentication + +Octokit supports the various [authentication methods supported by the GitHub +API][auth]: + +### Basic Authentication + +Using your GitHub username and password is the easiest way to get started +making authenticated requests: + +```ruby +client = Octokit::Client.new(:login => 'defunkt', :password => 'c0d3b4ssssss!') + +user = client.user +user.login +# => "defunkt" +``` +While Basic Authentication allows you to get started quickly, OAuth access +tokens are the preferred way to authenticate on behalf of users. + +### OAuth access tokens + +[OAuth access tokens][oauth] provide two main benefits over using your username +and password: + +* **Revokable access**. Access tokens can be revoked, removing access for only + that token without having to change your password everywhere. +* **Limited access**. Access tokens have [access scopes][] which allow for more + granular access to API resources. For instance, you can grant a third party + access to your gists but not your private repositories. + +To use an access token with the Octokit client, pass your token in the +`:access_token` options parameter in lieu of your username and password: + +```ruby +client = Octokit::Client.new(:access_token => "<your 40 char token>") + +user = client.user +user.login +# => "defunkt" +``` + +You can [create access tokens through your GitHub Account Settings](https://help.github.com/articles/creating-an-access-token-for-command-line-use) +or with a basic authenticated Octokit client: + +```ruby +client = Octokit::Client.new(:login => 'defunkt', :password => 'c0d3b4ssssss!') + +client.create_authorization(:scopes => ["user"], :note => "Name of token") +# => <your new oauth token> +``` + +### Two-Factor Authentication + +[Two-Factor Authentication](https://help.github.com/articles/about-two-factor-authentication) brings added security to the account by requiring more information to login. + +Using two-factor authentication for API calls is as simple as adding the [required header](http://developer.github.com/v3/auth/#working-with-two-factor-authentication) as an option: + +```ruby +client = Octokit::Client.new \ + :login => 'defunkt', + :password => 'c0d3b4ssssss!' + +user = client.user("defunkt", :headers => { "X-GitHub-OTP" => "<your 2FA token>" }) +``` + +As you can imagine, this gets annoying quick since two-factor auth tokens are very short lived. So it is recommended to create an oauth token for the user to communicate with the API: + +```ruby +client = Octokit::Client.new \ + :login => 'defunkt', + :password => 'c0d3b4ssssss!' + +client.create_authorization(:scopes => ["user"], :note => "Name of token", + :headers => { "X-GitHub-OTP" => "<your 2FA token>" }) +# => <your new oauth token> +``` + +### Using a .netrc file + +Octokit supports reading credentials from a netrc file (defaulting to +`~/.netrc`). Given these lines in your netrc: + +``` +machine api.github.com + login defunkt + password c0d3b4ssssss! +``` +You can now create a client with those credentials: + +```ruby +client = Octokit::Client.new(:netrc => true) +client.login +# => "defunkt" +``` +But _I want to use OAuth_ you say. Since the GitHub API supports using an OAuth +token as a Basic password, you totally can: + +``` +machine api.github.com + login defunkt + password <your 40 char token> +``` + +**Note:** Support for netrc requires adding the [netrc gem][] to your Gemfile +or `.gemspec`. + +### Application authentication + +Octokit also supports application-only authentication [using OAuth application client +credentials][app-creds]. Using application credentials will result in making +anonymous API calls on behalf of an application in order to take advantage of +the higher rate limit. + +```ruby +client = Octokit::Client.new \ + :client_id => "<your 20 char id>", + :client_secret => "<your 40 char secret>" + +user = client.user 'defunkt' +``` + +[auth]: http://developer.github.com/v3/#authentication +[oauth]: http://developer.github.com/v3/oauth/ +[access scopes]: http://developer.github.com/v3/oauth/#scopes +[app-creds]: http://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications + +## Default results per_page + +Default results from the GitHub API are 30, if you wish to add more you must do so during Octokit configuration. + +```ruby +Octokit::Client.new(access_token: "<your 40 char token>", per_page: 100) +``` + +## Pagination + +Many GitHub API resources are [paginated][]. While you may be tempted to start +adding `:page` parameters to your calls, the API returns links to the next, +previous, and last pages for you in the `Link` response header as [Hypermedia +link relations](#hypermedia-agent). + +```ruby +issues = client.issues 'rails/rails' +issues.concat client.get(client.last_response.rels[:next].href) +``` + +### Auto pagination + +For smallish resource lists, Octokit provides auto pagination. When this is +enabled, calls for paginated resources will fetch and concatenate the results +from every page into a single array: + +```ruby +client.auto_paginate = true +issues = client.issues 'rails/rails' +issues.length + +# => 702 +``` + +You can also enable auto pagination for all Octokit client instances: + +```ruby +Octokit.configure do |c| + c.auto_paginate = true +end +``` + +**Note:** While Octokit auto pagination will set the page size to the maximum +`100`, and seek to not overstep your rate limit, you probably want to use a +custom pattern for traversing large lists. + +[paginated]: http://developer.github.com/v3/#pagination + +## Working with GitHub Enterprise + +With a bit of setup, you can also use Octokit with your Github Enterprise instance. + +### Interacting with the GitHub.com APIs in GitHub Enterprise + +To interact with the "regular" GitHub.com APIs in GitHub Enterprise, simply configure the `api_endpoint` to match your hostname. For example: + +``` ruby +Octokit.configure do |c| + c.api_endpoint = "https://<hostname>/api/v3/" +end + +client = Octokit::Client.new(:access_token => "<your 40 char token>") +``` + +### Interacting with the GitHub Enterprise Admin APIs + +The GitHub Enterprise Admin APIs are under a different client: `EnterpriseAdminClient`. You'll need to have an administrator account in order to use these APIs. + +``` ruby +admin_client = Octokit::EnterpriseAdminClient.new( + :access_token => "<your 40 char token>", + :api_endpoint => "https://<hostname>/api/v3/" +) + +# or +Octokit.configure do |c| + c.api_endpoint = "https://<hostname>/api/v3/" + c.access_token = "<your 40 char token>" +end + +admin_client = Octokit.enterprise_admin_client.new +``` + +### Interacting with the GitHub Enterprise Management Console APIs + +The GitHub Enterprise Management Console APIs are also under a separate client: `EnterpriseManagementConsoleClient`. In order to use it, you'll need to provide both your management console password as well as the endpoint to your management console. This is different than the API endpoint provided above. + +``` ruby +management_console_client = Octokit::EnterpriseManagementConsoleClient.new( + :management_console_password => "secret", + :management_console_endpoint = "https://hostname:8633" +) + +# or +Octokit.configure do |c| + c.management_console_endpoint = "https://hostname:8633" + c.management_console_password = "secret" +end + +management_console_client = Octokit.enterprise_management_console_client.new +``` + +### SSL Connection Errors + +You *may* need to disable SSL temporarily while first setting up your GitHub Enterprise install. You can do that with the following configuration: + +``` ruby +client.connection_options[:ssl] = { :verify => false } +``` + +Do remember to turn `:verify` back to `true`, as it's important for secure communication. + +## Configuration and defaults + +While `Octokit::Client` accepts a range of options when creating a new client +instance, Octokit's configuration API allows you to set your configuration +options at the module level. This is particularly handy if you're creating a +number of client instances based on some shared defaults. Changing options +affects new instances only and will not modify existing `Octokit::Client` +instances created with previous options. + +### Configuring module defaults + +Every writable attribute in {Octokit::Configurable} can be set one at a time: + +```ruby +Octokit.api_endpoint = 'http://api.github.dev' +Octokit.web_endpoint = 'http://github.dev' +``` + +or in batch: + +```ruby +Octokit.configure do |c| + c.api_endpoint = 'http://api.github.dev' + c.web_endpoint = 'http://github.dev' +end +``` + +### Using ENV variables + +Default configuration values are specified in {Octokit::Default}. Many +attributes will look for a default value from the ENV before returning +Octokit's default. + +```ruby +# Given $OCTOKIT_API_ENDPOINT is "http://api.github.dev" +client.api_endpoint + +# => "http://api.github.dev" +``` + +Deprecation warnings and API endpoints in development preview warnings are +printed to STDOUT by default, these can be disabled by setting the ENV +`OCTOKIT_SILENT=true`. + +### Timeouts + +By default, Octokit does not timeout network requests. To set a timeout, pass in Faraday timeout settings to Octokit's `connection_options` setting. + +```ruby +Octokit.configure do |c| + c.api_endpoint = ENV.fetch('GITHUB_API_ENDPOINT', 'https://api.github.com/') + c.connection_options = { + request: { + open_timeout: 5, + timeout: 5 + } + } +end +``` +You should set a timeout in order to avoid Ruby’s Timeout module, which can hose your server. Here are some resources for more information on this: + +- [The Oldest Bug In Ruby - Why Rack::Timeout Might Hose your Server](https://www.schneems.com/2017/02/21/the-oldest-bug-in-ruby-why-racktimeout-might-hose-your-server/) +- [Timeout: Ruby's Most Dangerous API](https://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/) +- [The Ultimate Guide to Ruby Timeouts](https://github.com/ankane/the-ultimate-guide-to-ruby-timeouts) + +## Hypermedia agent + +Starting in version 2.0, Octokit is [hypermedia][]-enabled. Under the hood, +{Octokit::Client} uses [Sawyer][], a hypermedia client built on [Faraday][]. + +### Hypermedia in Octokit + +Resources returned by Octokit methods contain not only data but hypermedia +link relations: + +```ruby +user = client.user 'technoweenie' + +# Get the repos rel, returned from the API +# as repos_url in the resource +user.rels[:repos].href +# => "https://api.github.com/users/technoweenie/repos" + +repos = user.rels[:repos].get.data +repos.last.name +# => "faraday-zeromq" +``` + +When processing API responses, all `*_url` attributes are culled in to the link +relations collection. Any `url` attribute becomes `.rels[:self]`. + +### URI templates + +You might notice many link relations have variable placeholders. Octokit +supports [URI Templates][uri-templates] for parameterized URI expansion: + +```ruby +repo = client.repo 'pengwynn/pingwynn' +rel = repo.rels[:issues] +# => #<Sawyer::Relation: issues: get https://api.github.com/repos/pengwynn/pingwynn/issues{/number}> + +# Get a page of issues +rel.get.data + +# Get issue #2 +rel.get(:uri => {:number => 2}).data +``` + +### The Full Hypermedia Experience™ + +If you want to use Octokit as a pure hypermedia API client, you can start at +the API root and follow link relations from there: + +```ruby +root = client.root +root.rels[:repository].get :uri => {:owner => "octokit", :repo => "octokit.rb" } +root.rels[:user_repositories].get :uri => { :user => "octokit" }, + :query => { :type => "owner" } +``` + +Octokit 3.0 aims to be hypermedia-driven, removing the internal URL +construction currently used throughout the client. + +[hypermedia]: http://en.wikipedia.org/wiki/Hypermedia +[Sawyer]: https://github.com/lostisland/sawyer +[Faraday]: https://github.com/lostisland/faraday +[uri-templates]: http://tools.ietf.org/html/rfc6570 + +## Upgrading guide + +Version 4.0 + +- **removes support for a [long-deprecated overload][list-pulls] for +passing state as a positional argument** when listing pull requests. Instead, +pass `state` in the method options. +- **drops support for Ruby < 2.0**. +- adds support for new [Enterprise-only APIs](#working-with-github-enterprise). +- adds support for [Repository redirects][redirects]. + +[list-pulls]: https://github.com/octokit/octokit.rb/commit/e48e91f736d5fce51e3bf74d7c9022aaa52f5c5c +[redirects]: https://developer.github.com/changes/2015-05-26-repository-redirects-are-coming/ + +Version 3.0 includes a couple breaking changes when upgrading from v2.x.x: + +The [default media type][default-media-type] is now `v3` instead of `beta`. If +you need to request the older media type, you can set the default media type +for the client: + +```ruby +Octokit.default_media_type = "application/vnd.github.beta+json" +``` +or per-request + +```ruby +client.emails(:accept => "application/vnd.github.beta+json") +``` + +The long-deprecated `Octokit::Client#create_download` method has been removed. + +[default-media-type]: https://developer.github.com/changes/2014-01-07-upcoming-change-to-default-media-type/ + +### Upgrading from 1.x.x + +Version 2.0 includes a completely rewritten `Client` factory that now memoizes +client instances based on unique configuration options. Breaking changes also +include: + +* `:oauth_token` is now `:access_token` +* `:auto_traversal` is now `:auto_paginate` +* `Hashie::Mash` has been removed. Responses now return a `Sawyer::Resource` + object. This new type behaves mostly like a Ruby `Hash`, but does not fully + support the `Hashie::Mash` API. +* Two new client error types are raised where appropriate: + `Octokit::TooManyRequests` and `Octokit::TooManyLoginAttempts` +* The `search_*` methods from v1.x are now found at `legacy_search_*` +* Support for netrc requires including the [netrc gem][] in your Gemfile or + gemspec. +* DateTime fields are now proper `DateTime` objects. Previous versions outputted DateTime fields as 'String' objects. + +[netrc gem]: https://rubygems.org/gems/netrc + + +## Advanced usage + +Since Octokit employs [Faraday][faraday] under the hood, some behavior can be +extended via middleware. + +### Debugging + +Often, it helps to know what Octokit is doing under the hood. You can add a +logger to the middleware that enables you to peek into the underlying HTTP +traffic: + +```ruby +stack = Faraday::RackBuilder.new do |builder| + builder.use Faraday::Request::Retry, exceptions: [Octokit::ServerError] + builder.use Octokit::Middleware::FollowRedirects + builder.use Octokit::Response::RaiseError + builder.use Octokit::Response::FeedParser + builder.response :logger + builder.adapter Faraday.default_adapter +end +Octokit.middleware = stack + +client = Octokit::Client.new +client.user 'pengwynn' +``` +``` +I, [2013-08-22T15:54:38.583300 #88227] INFO -- : get https://api.github.com/users/pengwynn +D, [2013-08-22T15:54:38.583401 #88227] DEBUG -- request: Accept: "application/vnd.github.beta+json" +User-Agent: "Octokit Ruby Gem 2.0.0.rc4" +I, [2013-08-22T15:54:38.843313 #88227] INFO -- Status: 200 +D, [2013-08-22T15:54:38.843459 #88227] DEBUG -- response: server: "GitHub.com" +date: "Thu, 22 Aug 2013 20:54:40 GMT" +content-type: "application/json; charset=utf-8" +transfer-encoding: "chunked" +connection: "close" +status: "200 OK" +x-ratelimit-limit: "60" +x-ratelimit-remaining: "39" +x-ratelimit-reset: "1377205443" +... +``` + +See the [Faraday README][faraday] for more middleware magic. + +### Caching + +If you want to boost performance, stretch your API rate limit, or avoid paying +the hypermedia tax, you can use [Faraday Http Cache][cache]. + +Add the gem to your Gemfile + + gem 'faraday-http-cache' + +Next, construct your own Faraday middleware: + +```ruby +stack = Faraday::RackBuilder.new do |builder| + builder.use Faraday::HttpCache, serializer: Marshal, shared_cache: false + builder.use Octokit::Response::RaiseError + builder.adapter Faraday.default_adapter +end +Octokit.middleware = stack +``` + +Once configured, the middleware will store responses in cache based on ETag +fingerprint and serve those back up for future `304` responses for the same +resource. See the [project README][cache] for advanced usage. + + +[cache]: https://github.com/plataformatec/faraday-http-cache +[faraday]: https://github.com/lostisland/faraday + +## Hacking on Octokit.rb + +If you want to hack on Octokit locally, we try to make [bootstrapping the +project][bootstrapping] as painless as possible. To start hacking, clone and run: + + script/bootstrap + +This will install project dependencies and get you up and running. If you want +to run a Ruby console to poke on Octokit, you can crank one up with: + + script/console + +Using the scripts in `./script` instead of `bundle exec rspec`, `bundle +console`, etc. ensures your dependencies are up-to-date. + +### Code of Conduct + +We want both the Octokit.rb and larger Octokit communities to be an open +and welcoming environments. Please read and follow both in spirit and +letter [Code of Conduct](CODE_OF_CONDUCT.md). + +### Running and writing new tests + +Octokit uses [VCR][] for recording and playing back API fixtures during test +runs. These cassettes (fixtures) are part of the Git project in the `spec/cassettes` +folder. If you're not recording new cassettes you can run the specs with existing +cassettes with: + + script/test + +Octokit uses environmental variables for storing credentials used in testing. +If you are testing an API endpoint that doesn't require authentication, you +can get away without any additional configuration. For the most part, tests +use an authenticated client, using a token stored in `ENV['OCTOKIT_TEST_GITHUB_TOKEN']`. +There are several different authenticating method's used across the api. +Here is the full list of configurable environmental variables for testing +Octokit: + +ENV Variable | Description | +:-------------------|:-----------------| +`OCTOKIT_TEST_GITHUB_LOGIN`| GitHub login name (preferably one created specifically for testing against). +`OCTOKIT_TEST_GITHUB_PASSWORD`| Password for the test GitHub login. +`OCTOKIT_TEST_GITHUB_TOKEN` | [Personal Access Token](https://github.com/blog/1509-personal-api-tokens) for the test GitHub login. +`OCTOKIT_TEST_GITHUB_CLIENT_ID` | Test OAuth application client id. +`OCTOKIT_TEST_GITHUB_CLIENT_SECRET` | Test OAuth application client secret. +`OCTOKIT_TEST_GITHUB_REPOSITORY` | Test repository to perform destructive actions against, this should not be set to any repository of importance. **Automatically created by the test suite if nonexistent** Default: `api-sandbox` +`OCTOKIT_TEST_GITHUB_ORGANIZATION` | Test organization. +`OCTOKIT_TEST_GITHUB_ENTERPRISE_LOGIN` | GitHub Enterprise login name. +`OCTOKIT_TEST_GITHUB_ENTERPRISE_TOKEN` | GitHub Enterprise token. +`OCTOKIT_TEST_GITHUB_ENTERPRISE_MANAGEMENT_CONSOLE_PASSWORD` | GitHub Enterprise management console password. +`OCTOKIT_TEST_GITHUB_ENTERPRISE_ENDPOINT` | GitHub Enterprise hostname. +`OCTOKIT_TEST_GITHUB_ENTERPRISE_MANAGEMENT_CONSOLE_ENDPOINT` | GitHub Enterprise Management Console endpoint. +`OCTOKIT_TEST_GITHUB_INTEGRATION` | [GitHub Integration](https://developer.github.com/early-access/integrations/) owned by your test organization. +`OCTOKIT_TEST_GITHUB_INTEGRATION_INSTALLATION` | Installation of the GitHub Integration specified above. +`OCTOKIT_TEST_INTEGRATION_PEM_KEY` | File path to the private key generated from your integration. + +Since we periodically refresh our cassettes, please keep some points in mind +when writing new specs. + +* **Specs should be idempotent**. The HTTP calls made during a spec should be + able to be run over and over. This means deleting a known resource prior to + creating it if the name has to be unique. +* **Specs should be able to be run in random order.** If a spec depends on + another resource as a fixture, make sure that's created in the scope of the + spec and not depend on a previous spec to create the data needed. +* **Do not depend on authenticated user info.** Instead of asserting + actual values in resources, try to assert the existence of a key or that a + response is an Array. We're testing the client, not the API. + +[bootstrapping]: http://wynnnetherland.com/linked/2013012801/bootstrapping-consistency +[VCR]: https://github.com/vcr/vcr + +## Supported Ruby Versions + +This library aims to support and is [tested against][actions] the following Ruby +implementations: + +* Ruby 2.5 +* Ruby 2.6 +* Ruby 2.7 + +If something doesn't work on one of these Ruby versions, it's a bug. + +This library may inadvertently work (or seem to work) on other Ruby +implementations, but support will only be provided for the versions listed +above. + +If you would like this library to support another Ruby version, you may +volunteer to be a maintainer. Being a maintainer entails making sure all tests +run and pass on that implementation. When something breaks on your +implementation, you will be responsible for providing patches in a timely +fashion. If critical issues for a particular implementation exist at the time +of a major release, support for that Ruby version may be dropped. + +[actions]: https://github.com/octokit/octokit.rb/actions + +## Versioning + +This library aims to adhere to [Semantic Versioning 2.0.0][semver]. Violations +of this scheme should be reported as bugs. Specifically, if a minor or patch +version is released that breaks backward compatibility, that version should be +immediately yanked and/or a new version should be immediately released that +restores compatibility. Breaking changes to the public API will only be +introduced with new major versions. As a result of this policy, you can (and +should) specify a dependency on this gem using the [Pessimistic Version +Constraint][pvc] with two digits of precision. For example: + + spec.add_dependency 'octokit', '~> 3.0' + +The changes made between versions can be seen on the [project releases page][releases]. + +[semver]: http://semver.org/ +[pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint +[releases]: https://github.com/octokit/octokit.rb/releases + +## Making Repeating Requests +In most cases it would be best to use a [webhooks](https://developer.github.com/webhooks/), but sometimes webhooks don't provide all of the information needed. In those cases where one might need to poll for progress or retry a request on failure, we designed [Octopoller](https://github.com/octokit/octopoller.rb). Octopoller is a micro gem perfect for making repeating requests. + +```ruby +Octopoller.poll(timeout: 15.seconds) do + begin + client.request_progress # ex. request a long running job's status + rescue Error + :re_poll + end +end +``` + +This is useful when making requests for a long running job's progress (ex. requesting a [Source Import's progress](https://developer.github.com/v3/migrations/source_imports/#get-import-progress)). + +## License + +Copyright (c) 2009-2014 Wynn Netherland, Adam Stacoviak, Erik Michaels-Ober + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/Rakefile new file mode 100644 index 000000000000..fccd9d2260be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/Rakefile @@ -0,0 +1,22 @@ +require 'bundler' +Bundler::GemHelper.install_tasks + +require 'rspec/core/rake_task' +RSpec::Core::RakeTask.new(:spec) + +task :test => :spec +task :default => :spec + +namespace :doc do + begin + require 'yard' + YARD::Rake::YardocTask.new do |task| + task.files = ['README.md', 'LICENSE.md', 'lib/**/*.rb'] + task.options = [ + '--output-dir', 'doc/yard', + '--markup', 'markdown', + ] + end + rescue LoadError + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/ext/sawyer/relation.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/ext/sawyer/relation.rb new file mode 100644 index 000000000000..dd0665943148 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/ext/sawyer/relation.rb @@ -0,0 +1,10 @@ +require 'sawyer' + +patch = Module.new do + def href(options=nil) + # Temporary workaround for: https://github.com/octokit/octokit.rb/issues/727 + name.to_s == "ssh" ? @href : super + end +end + +Sawyer::Relation.send(:prepend, patch) diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit.rb new file mode 100644 index 000000000000..f093d2185ba6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit.rb @@ -0,0 +1,59 @@ +require 'octokit/client' +require 'octokit/enterprise_admin_client' +require 'octokit/enterprise_management_console_client' +require 'octokit/default' + +# Ruby toolkit for the GitHub API +module Octokit + + class << self + include Octokit::Configurable + + # API client based on configured options {Configurable} + # + # @return [Octokit::Client] API wrapper + def client + return @client if defined?(@client) && @client.same_options?(options) + @client = Octokit::Client.new(options) + end + + # EnterpriseAdminClient client based on configured options {Configurable} + # + # @return [Octokit::EnterpriseAdminClient] API wrapper + def enterprise_admin_client + return @enterprise_admin_client if defined?(@enterprise_admin_client) && @enterprise_admin_client.same_options?(options) + @enterprise_admin_client = Octokit::EnterpriseAdminClient.new(options) + end + + # EnterpriseManagementConsoleClient client based on configured options {Configurable} + # + # @return [Octokit::EnterpriseManagementConsoleClient] API wrapper + def enterprise_management_console_client + return @enterprise_management_console_client if defined?(@enterprise_management_console_client) && @enterprise_management_console_client.same_options?(options) + @enterprise_management_console_client = Octokit::EnterpriseManagementConsoleClient.new(options) + end + + private + + def respond_to_missing?(method_name, include_private=false) + client.respond_to?(method_name, include_private) || + enterprise_admin_client.respond_to?(method_name, include_private) || + enterprise_management_console_client.respond_to?(method_name, include_private) + end + + def method_missing(method_name, *args, &block) + if client.respond_to?(method_name) + return client.send(method_name, *args, &block) + elsif enterprise_admin_client.respond_to?(method_name) + return enterprise_admin_client.send(method_name, *args, &block) + elsif enterprise_management_console_client.respond_to?(method_name) + return enterprise_management_console_client.send(method_name, *args, &block) + end + + super + end + + end +end + +Octokit.setup diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/arguments.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/arguments.rb new file mode 100644 index 000000000000..961e3b98be56 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/arguments.rb @@ -0,0 +1,14 @@ +module Octokit + + # Extracts options from method arguments + # @private + class Arguments < Array + attr_reader :options + + def initialize(args) + @options = args.last.is_a?(::Hash) ? args.pop : {} + super(args) + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/authentication.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/authentication.rb new file mode 100644 index 000000000000..bed9be4f111e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/authentication.rb @@ -0,0 +1,73 @@ +module Octokit + + # Authentication methods for {Octokit::Client} + module Authentication + + # Indicates if the client was supplied Basic Auth + # username and password + # + # @see https://developer.github.com/v3/#authentication + # @return [Boolean] + def basic_authenticated? + !!(@login && @password) + end + + # Indicates if the client was supplied an OAuth + # access token + # + # @see https://developer.github.com/v3/#authentication + # @return [Boolean] + def token_authenticated? + !!@access_token + end + + # Indicates if the client was supplied a bearer token + # + # @see https://developer.github.com/early-access/integrations/authentication/#as-an-integration + # @return [Boolean] + def bearer_authenticated? + !!@bearer_token + end + + # Indicates if the client was supplied an OAuth + # access token or Basic Auth username and password + # + # @see https://developer.github.com/v3/#authentication + # @return [Boolean] + def user_authenticated? + basic_authenticated? || token_authenticated? + end + + # Indicates if the client has OAuth Application + # client_id and secret credentials to make anonymous + # requests at a higher rate limit + # + # @see https://developer.github.com/v3/#unauthenticated-rate-limited-requests + # @return [Boolean] + def application_authenticated? + !!(@client_id && @client_secret) + end + + private + + def login_from_netrc + return unless netrc? + + require 'netrc' + info = Netrc.read netrc_file + netrc_host = URI.parse(api_endpoint).host + creds = info[netrc_host] + if creds.nil? + # creds will be nil if there is no netrc for this end point + octokit_warn "Error loading credentials from netrc file for #{api_endpoint}" + else + creds = creds.to_a + self.login = creds.shift + self.password = creds.shift + end + rescue LoadError + octokit_warn "Please install netrc gem for .netrc support" + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client.rb new file mode 100644 index 000000000000..b6d4a480ff0f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client.rb @@ -0,0 +1,254 @@ +require 'octokit/connection' +require 'octokit/warnable' +require 'octokit/arguments' +require 'octokit/repo_arguments' +require 'octokit/configurable' +require 'octokit/authentication' +require 'octokit/gist' +require 'octokit/rate_limit' +require 'octokit/repository' +require 'octokit/user' +require 'octokit/organization' +require 'octokit/preview' +require 'octokit/client/actions_secrets' +require 'octokit/client/actions_workflows' +require 'octokit/client/actions_workflow_runs' +require 'octokit/client/apps' +require 'octokit/client/authorizations' +require 'octokit/client/checks' +require 'octokit/client/commits' +require 'octokit/client/commit_comments' +require 'octokit/client/commit_pulls' +require 'octokit/client/commit_branches' +require 'octokit/client/community_profile' +require 'octokit/client/contents' +require 'octokit/client/downloads' +require 'octokit/client/deployments' +require 'octokit/client/emojis' +require 'octokit/client/events' +require 'octokit/client/feeds' +require 'octokit/client/gists' +require 'octokit/client/gitignore' +require 'octokit/client/hooks' +require 'octokit/client/issues' +require 'octokit/client/labels' +require 'octokit/client/legacy_search' +require 'octokit/client/licenses' +require 'octokit/client/meta' +require 'octokit/client/markdown' +require 'octokit/client/marketplace' +require 'octokit/client/milestones' +require 'octokit/client/notifications' +require 'octokit/client/oauth_applications' +require 'octokit/client/objects' +require 'octokit/client/organizations' +require 'octokit/client/pages' +require 'octokit/client/projects' +require 'octokit/client/pub_sub_hubbub' +require 'octokit/client/pull_requests' +require 'octokit/client/rate_limit' +require 'octokit/client/reactions' +require 'octokit/client/refs' +require 'octokit/client/releases' +require 'octokit/client/repositories' +require 'octokit/client/repository_invitations' +require 'octokit/client/reviews' +require 'octokit/client/say' +require 'octokit/client/search' +require 'octokit/client/service_status' +require 'octokit/client/source_import' +require 'octokit/client/stats' +require 'octokit/client/statuses' +require 'octokit/client/traffic' +require 'octokit/client/users' +require 'ext/sawyer/relation' + +module Octokit + + # Client for the GitHub API + # + # @see https://developer.github.com + class Client + + include Octokit::Authentication + include Octokit::Configurable + include Octokit::Connection + include Octokit::Preview + include Octokit::Warnable + include Octokit::Client::ActionsSecrets + include Octokit::Client::Authorizations + include Octokit::Client::Checks + include Octokit::Client::Commits + include Octokit::Client::CommitComments + include Octokit::Client::CommitPulls + include Octokit::Client::CommitBranches + include Octokit::Client::CommunityProfile + include Octokit::Client::Contents + include Octokit::Client::Deployments + include Octokit::Client::Downloads + include Octokit::Client::Emojis + include Octokit::Client::Events + include Octokit::Client::Feeds + include Octokit::Client::Gists + include Octokit::Client::Gitignore + include Octokit::Client::Hooks + include Octokit::Client::ActionsWorkflows + include Octokit::Client::ActionsWorkflowRuns + include Octokit::Client::Apps + include Octokit::Client::Issues + include Octokit::Client::Labels + include Octokit::Client::LegacySearch + include Octokit::Client::Licenses + include Octokit::Client::Meta + include Octokit::Client::Markdown + include Octokit::Client::Marketplace + include Octokit::Client::Milestones + include Octokit::Client::Notifications + include Octokit::Client::OauthApplications + include Octokit::Client::Objects + include Octokit::Client::Organizations + include Octokit::Client::Pages + include Octokit::Client::Projects + include Octokit::Client::PubSubHubbub + include Octokit::Client::PullRequests + include Octokit::Client::RateLimit + include Octokit::Client::Reactions + include Octokit::Client::Refs + include Octokit::Client::Releases + include Octokit::Client::Repositories + include Octokit::Client::RepositoryInvitations + include Octokit::Client::Reviews + include Octokit::Client::Say + include Octokit::Client::Search + include Octokit::Client::ServiceStatus + include Octokit::Client::SourceImport + include Octokit::Client::Stats + include Octokit::Client::Statuses + include Octokit::Client::Traffic + include Octokit::Client::Users + + # Header keys that can be passed in options hash to {#get},{#head} + CONVENIENCE_HEADERS = Set.new([:accept, :content_type]) + + def initialize(options = {}) + # Use options passed in, but fall back to module defaults + Octokit::Configurable.keys.each do |key| + value = options.key?(key) ? options[key] : Octokit.instance_variable_get(:"@#{key}") + instance_variable_set(:"@#{key}", value) + end + + login_from_netrc unless user_authenticated? || application_authenticated? + end + + # Text representation of the client, masking tokens and passwords + # + # @return [String] + def inspect + inspected = super + + # mask password + inspected.gsub! @password, '*******' if @password + inspected.gsub! @management_console_password, '*******' if @management_console_password + inspected.gsub! @bearer_token, '********' if @bearer_token + # Only show last 4 of token, secret + inspected.gsub! @access_token, "#{'*'*36}#{@access_token[36..-1]}" if @access_token + inspected.gsub! @client_secret, "#{'*'*36}#{@client_secret[36..-1]}" if @client_secret + + inspected + end + + # Duplicate client using client_id and client_secret as + # Basic Authentication credentials. + # @example + # Octokit.client_id = "foo" + # Octokit.client_secret = "bar" + # + # # GET https://api.github.com/?client_id=foo&client_secret=bar + # Octokit.get "/" + # + # Octokit.client.as_app do |client| + # # GET https://foo:bar@api.github.com/ + # client.get "/" + # end + def as_app(key = client_id, secret = client_secret, &block) + if key.to_s.empty? || secret.to_s.empty? + raise ApplicationCredentialsRequired, "client_id and client_secret required" + end + app_client = self.dup + app_client.client_id = app_client.client_secret = nil + app_client.login = key + app_client.password = secret + + yield app_client if block_given? + end + + # Set username for authentication + # + # @param value [String] GitHub username + def login=(value) + reset_agent + @login = value + end + + # Set password for authentication + # + # @param value [String] GitHub password + def password=(value) + reset_agent + @password = value + end + + # Set OAuth access token for authentication + # + # @param value [String] 40 character GitHub OAuth access token + def access_token=(value) + reset_agent + @access_token = value + end + + # Set Bearer Token for authentication + # + # @param value [String] JWT + def bearer_token=(value) + reset_agent + @bearer_token = value + end + + # Set OAuth app client_id + # + # @param value [String] 20 character GitHub OAuth app client_id + def client_id=(value) + reset_agent + @client_id = value + end + + # Set OAuth app client_secret + # + # @param value [String] 40 character GitHub OAuth app client_secret + def client_secret=(value) + reset_agent + @client_secret = value + end + + def client_without_redirects(options = {}) + conn_opts = @connection_options + conn_opts[:url] = @api_endpoint + conn_opts[:builder] = @middleware.dup if @middleware + conn_opts[:proxy] = @proxy if @proxy + conn_opts[:ssl] = { :verify_mode => @ssl_verify_mode } if @ssl_verify_mode + conn = Faraday.new(conn_opts) do |http| + if basic_authenticated? + http.basic_auth(@login, @password) + elsif token_authenticated? + http.authorization 'token', @access_token + elsif bearer_authenticated? + http.authorization 'Bearer', @bearer_token + end + http.headers['accept'] = options[:accept] if options.key?(:accept) + end + conn.builder.delete(Octokit::Middleware::FollowRedirects) + + conn + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/actions_secrets.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/actions_secrets.rb new file mode 100644 index 000000000000..9407cbd57894 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/actions_secrets.rb @@ -0,0 +1,58 @@ +module Octokit + class Client + + # Methods for the Actions Secrets API + # + # @see https://developer.github.com/v3/actions/secrets/ + module ActionsSecrets + + # Get public key for secrets encryption + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Hash] key_id and key + # @see https://developer.github.com/v3/actions/secrets/#get-your-public-key + def get_public_key(repo) + get "#{Repository.path repo}/actions/secrets/public-key" + end + + + # List secrets + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Hash] total_count and list of secrets (each item is hash with name, created_at and updated_at) + # @see https://developer.github.com/v3/actions/secrets/#list-secrets-for-a-repository + def list_secrets(repo) + paginate "#{Repository.path repo}/actions/secrets" + end + + # Get a secret + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param name [String] Name of secret + # @return [Hash] name, created_at and updated_at + # @see https://developer.github.com/v3/actions/secrets/#get-a-secret + def get_secret(repo, name) + get "#{Repository.path repo}/actions/secrets/#{name}" + end + + # Create or update secrets + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param name [String] Name of secret + # @param options [Hash] encrypted_value and key_id + # @see https://developer.github.com/v3/actions/secrets/#create-or-update-a-secret-for-a-repository + def create_or_update_secret(repo, name, options) + put "#{Repository.path repo}/actions/secrets/#{name}", options + end + + # Delete a secret + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param name [String] Name of secret + # @see https://developer.github.com/v3/actions/secrets/#delete-a-secret-from-a-repository + def delete_secret(repo, name) + boolean_from_response :delete, "#{Repository.path repo}/actions/secrets/#{name}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/actions_workflow_runs.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/actions_workflow_runs.rb new file mode 100644 index 000000000000..5e0abf891296 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/actions_workflow_runs.rb @@ -0,0 +1,94 @@ +module Octokit + class Client + module ActionsWorkflowRuns + # List all runs for a repository workflow + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param workflow [Integer, String] Id or file name of the workflow + # @option options [String] :actor Optional filtering by a user + # @option options [String] :branch Optional filtering by a branch + # @option options [String] :event Optional filtering by the event type + # @option options [String] :status Optional filtering by a status or conclusion + # + # @return [Sawyer::Resource] the total count and an array of workflows + # @see https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs + def workflow_runs(repo, workflow, options = {}) + paginate "#{Repository.path repo}/actions/workflows/#{workflow}/runs", options + end + alias list_workflow_runs workflow_runs + + # List all workflow runs for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @option options [String] :actor Optional filtering by the login of a user + # @option options [String] :branch Optional filtering by a branch + # @option options [String] :event Optional filtering by the event type (e.g. push, pull_request, issue) + # @option options [String] :status Optional filtering by a status or conclusion (e.g. success, completed...) + # + # @return [Sawyer::Resource] the total count and an array of workflows + # @see https://developer.github.com/v3/actions/workflow-runs/#list-repository-workflow-runs + def repository_workflow_runs(repo, options = {}) + paginate "#{Repository.path repo}/actions/runs", options + end + alias list_repository_workflow_runs repository_workflow_runs + + # Get a workflow run + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer] Id of a workflow run + # + # @return [Sawyer::Resource] Run information + # @see https://developer.github.com/v3/actions/workflow-runs/#get-a-workflow-run + def workflow_run(repo, id, options = {}) + get "#{Repository.path repo}/actions/runs/#{id}", options + end + + # Re-runs a workflow run + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer] Id of a workflow run + # + # @return [Boolean] Returns true if the re-run request was accepted + # @see https://developer.github.com/v3/actions/workflow-runs/#re-run-a-workflow + def rerun_workflow_run(repo, id, options = {}) + boolean_from_response :post, "#{Repository.path repo}/actions/runs/#{id}/rerun", options + end + + # Cancels a workflow run + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer] Id of a workflow run + # + # @return [Boolean] Returns true if the cancellation was accepted + # @see https://developer.github.com/v3/actions/workflow-runs/#cancel-a-workflow-run + def cancel_workflow_run(repo, id, options = {}) + boolean_from_response :post, "#{Repository.path repo}/actions/runs/#{id}/cancel", options + end + + # Get a download url for archived log files of a workflow run + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer] Id of a workflow run + # + # @return [String] URL to the archived log files of the run + # @see https://developer.github.com/v3/actions/workflow-runs/#download-workflow-run-logs + def workflow_run_logs(repo, id, options = {}) + url = "#{Repository.path repo}/actions/runs/#{id}/logs" + + response = client_without_redirects.head(url, options) + response.headers['Location'] + end + + # Delets all log files of a workflow run + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer] Id of a workflow run + # + # @return [Boolean] Returns true if the logs are deleted + # @see https://developer.github.com/v3/actions/workflow-runs/#delete-workflow-run-logs + def delete_workflow_run_logs(repo, id, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/actions/runs/#{id}/logs", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/actions_workflows.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/actions_workflows.rb new file mode 100644 index 000000000000..ab3c0d59c8e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/actions_workflows.rb @@ -0,0 +1,43 @@ +module Octokit + class Client + # Methods for the Actions Workflows API + # + # @see https://developer.github.com/v3/actions/workflows + module ActionsWorkflows + + # Get the workflows in a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # + # @return [Sawyer::Resource] the total count and an array of workflows + # @see https://developer.github.com/v3/actions/workflows/#list-repository-workflows + def workflows(repo, options = {}) + paginate "#{Repository.path repo}/actions/workflows", options + end + alias list_workflows workflows + + # Get single workflow in a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer, String] Id or file name of the workflow + # + # @return [Sawyer::Resource] A single workflow + # @see https://developer.github.com/v3/actions/workflows/#get-a-workflow + def workflow(repo, id, options = {}) + get "#{Repository.path repo}/actions/workflows/#{id}", options + end + + # Create a workflow dispatch event + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer, String] Id or file name of the workflow + # @param ref [String] A SHA, branch name, or tag name + # + # @return [Boolean] True if event was dispatched, false otherwise + # @see https://docs.github.com/en/rest/reference/actions#create-a-workflow-dispatch-event + def workflow_dispatch(repo, id, ref, options = {}) + boolean_from_response :post, "#{Repository.path repo}/actions/workflows/#{id}/dispatches", options.merge({ ref: ref }) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/apps.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/apps.rb new file mode 100644 index 000000000000..46d8da9c6b65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/apps.rb @@ -0,0 +1,223 @@ +module Octokit + class Client + + # Methods for the Apps API + module Apps + + # Get the authenticated App + # + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/#get-the-authenticated-app + # + # @return [Sawyer::Resource] App information + def app(options = {}) + get "app", options + end + + # Find all installations that belong to an App + # + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/#list-installations + # + # @return [Array<Sawyer::Resource>] the total_count and an array of installations + def find_app_installations(options = {}) + paginate "app/installations", options + end + alias find_installations find_app_installations + + def find_integration_installations(options = {}) + octokit_warn( + "Deprecated: Octokit::Client::Apps#find_integration_installations "\ + "method is deprecated. Please update your call to use "\ + "Octokit::Client::Apps#find_app_installations before the next major "\ + "Octokit version update." + ) + find_app_installations(options) + end + + # Find all installations that are accessible to the authenticated user + # + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/installations/#list-installations-for-a-user + # + # @return [Sawyer::Resource] the total_count and an array of installations + def find_user_installations(options = {}) + paginate("user/installations", options) do |data, last_response| + data.installations.concat last_response.data.installations + end + end + + # Get a single installation + # + # @param id [Integer] Installation id + # + # @see https://developer.github.com/v3/apps/#get-an-installation + # + # @return [Sawyer::Resource] Installation information + def installation(id, options = {}) + get "app/installations/#{id}", options + end + + # Create a new installation token + # + # @param installation [Integer] The id of a GitHub App Installation + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/#create-a-new-installation-token + # + # @return [<Sawyer::Resource>] An installation token + def create_app_installation_access_token(installation, options = {}) + post "app/installations/#{installation}/access_tokens", options + end + alias create_installation_access_token create_app_installation_access_token + + def create_integration_installation_access_token(installation, options = {}) + octokit_warn( + "Deprecated: Octokit::Client::Apps#create_integration_installation_access_token "\ + "method is deprecated. Please update your call to use "\ + "Octokit::Client::Apps#create_app_installation_access_token before the next major "\ + "Octokit version update." + ) + create_app_installation_access_token(installation, options) + end + + # Enables an app to find the organization's installation information. + # + # @param organization [String] Organization GitHub login + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/#get-an-organization-installation + # + # @return [Sawyer::Resource] Installation information + def find_organization_installation(organization, options = {}) + get "#{Organization.path(organization)}/installation", options + end + + # Enables an app to find the repository's installation information. + # + # @param repo [String] A GitHub repository + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/#get-a-repository-installation + # + # @return [Sawyer::Resource] Installation information + def find_repository_installation(repo, options = {}) + get "#{Repository.path(repo)}/installation", options + end + + # Enables an app to find the user's installation information. + # + # @param user [String] GitHub user login + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/#get-a-user-installation + # + # @return [Sawyer::Resource] Installation information + def find_user_installation(user, options = {}) + get "#{User.path(user)}/installation", options + end + + # List repositories that are accessible to the authenticated installation + # + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/installations/#list-repositories + # + # @return [Sawyer::Resource] the total_count and an array of repositories + def list_app_installation_repositories(options = {}) + paginate("installation/repositories", options) do |data, last_response| + data.repositories.concat last_response.data.repositories + end + end + alias list_installation_repos list_app_installation_repositories + + def list_integration_installation_repositories(options = {}) + octokit_warn( + "Deprecated: Octokit::Client::Apps#list_integration_installation_repositories "\ + "method is deprecated. Please update your call to use "\ + "Octokit::Client::Apps#list_app_installation_repositories before the next major "\ + "Octokit version update." + ) + list_app_installation_repositories(options) + end + + # Add a single repository to an installation + # + # @param installation [Integer] The id of a GitHub App Installation + # @param repo [Integer] The id of the GitHub repository + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/installations/#add-repository-to-installation + # + # @return [Boolean] Success + def add_repository_to_app_installation(installation, repo, options = {}) + boolean_from_response :put, "user/installations/#{installation}/repositories/#{repo}", options + end + alias add_repo_to_installation add_repository_to_app_installation + + def add_repository_to_integration_installation(installation, repo, options = {}) + octokit_warn( + "Deprecated: Octokit::Client::Apps#add_repository_to_integration_installation "\ + "method is deprecated. Please update your call to use "\ + "Octokit::Client::Apps#add_repository_to_app_installation before the next major "\ + "Octokit version update." + ) + add_repository_to_app_installation(installation, repo, options) + end + + # Remove a single repository to an installation + # + # @param installation [Integer] The id of a GitHub App Installation + # @param repo [Integer] The id of the GitHub repository + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/installations/#remove-repository-from-installation + # + # @return [Boolean] Success + def remove_repository_from_app_installation(installation, repo, options = {}) + boolean_from_response :delete, "user/installations/#{installation}/repositories/#{repo}", options + end + alias remove_repo_from_installation remove_repository_from_app_installation + + def remove_repository_from_integration_installation(installation, repo, options = {}) + octokit_warn( + "Deprecated: Octokit::Client::Apps#remove_repository_from_integration_installation "\ + "method is deprecated. Please update your call to use "\ + "Octokit::Client::Apps#remove_repository_from_app_installation before the next major "\ + "Octokit version update." + ) + remove_repository_from_app_installation(installation, repo, options) + end + + # List repositories accessible to the user for an installation + # + # @param installation [Integer] The id of a GitHub App Installation + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/installations/#list-repositories-accessible-to-the-user-for-an-installation + # + # @return [Sawyer::Resource] the total_count and an array of repositories + def find_installation_repositories_for_user(installation, options = {}) + paginate("user/installations/#{installation}/repositories", options) do |data, last_response| + data.repositories.concat last_response.data.repositories + end + end + + # Delete an installation and uninstall a GitHub App + # + # @param installation [Integer] The id of a GitHub App Installation + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/#delete-an-installation + # + # @return [Boolean] Success + def delete_installation(installation, options = {}) + opts = ensure_api_media_type(:uninstall_github_app, options) + boolean_from_response :delete, "app/installations/#{installation}", opts + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/authorizations.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/authorizations.rb new file mode 100644 index 000000000000..3c678fed56a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/authorizations.rb @@ -0,0 +1,182 @@ +module Octokit + class Client + + # Methods for the Authorizations API + # + # @see https://developer.github.com/v3/oauth_authorizations/#oauth-authorizations-api + module Authorizations + + # List the authenticated user's authorizations + # + # API for users to manage their own tokens. + # You can only access your own tokens, and only through + # Basic Authentication. + # + # @return [Array<Sawyer::Resource>] A list of authorizations for the authenticated user + # @see https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations + # @example List authorizations for user ctshryock + # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret') + # client.authorizations + def authorizations(options = {}) + paginate 'authorizations', options + end + + # Get a single authorization for the authenticated user. + # + # You can only access your own tokens, and only through + # Basic Authentication. + # + # @return [Sawyer::Resource] A single authorization for the authenticated user + # @see https://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization + # @example Show authorization for user ctshryock's Travis auth + # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret') + # client.authorization(999999) + def authorization(number, options = {}) + get "authorizations/#{number}", options + end + + # Create an authorization for the authenticated user. + # + # You can create your own tokens, and only through + # Basic Authentication. + # + # @param options [Hash] A customizable set of options. + # @option options [Array] :scopes A list of scopes that this authorization is in. + # @option options [String] :note A note to remind you what the OAuth token is for. + # @option options [String] :note_url A URL to remind you what app the OAuth token is for. + # @option options [Boolean] :idempotent If true, will return an existing authorization if one has already been created. + # @option options [String] :client_id Client Id we received when our application was registered with GitHub. + # @option options [String] :client_secret Client Secret we received when our application was registered with GitHub. + # + # @return [Sawyer::Resource] A single authorization for the authenticated user + # @see https://developer.github.com/v3/oauth/#scopes Available scopes + # @see https://developer.github.com/v3/oauth_authorizations/#create-a-new-authorization + # @see https://developer.github.com/v3/oauth_authorizations/#get-or-create-an-authorization-for-a-specific-app + # @example Create a new authorization for user ctshryock's project Zoidberg + # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret') + # client.create_authorization({:scopes => ["public_repo", "gist"], :note => "Why not Zoidberg?", :note_url=> "https://en.wikipedia.org/wiki/Zoidberg"}) + # @example Create a new OR return an existing authorization to be used by a specific client for user ctshryock's project Zoidberg + # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret') + # client.create_authorization({:idempotent => true, :client_id => 'xxxx', :client_secret => 'yyyy', :scopes => ["user"]}) + def create_authorization(options = {}) + # Technically we can omit scopes as GitHub has a default, however the + # API will reject us if we send a POST request with an empty body. + options = options.dup + if options.delete :idempotent + client_id, client_secret = fetch_client_id_and_secret(options) + raise ArgumentError.new("Client ID and Secret required for idempotent authorizations") unless client_id && client_secret + + # Remove the client_id from the body otherwise + # this will result in a 422. + options.delete(:client_id) + + if (fingerprint = options.delete(:fingerprint)) + put "authorizations/clients/#{client_id}/#{fingerprint}", options.merge(:client_secret => client_secret) + else + put "authorizations/clients/#{client_id}", options.merge(:client_secret => client_secret) + end + + else + post 'authorizations', options + end + end + + # Update an authorization for the authenticated user. + # + # You can update your own tokens, but only through + # Basic Authentication. + # + # @param options [Hash] A customizable set of options. + # @option options [Array] :scopes Replace the authorization scopes with these. + # @option options [Array] :add_scopes A list of scopes to add to this authorization. + # @option options [Array] :remove_scopes A list of scopes to remove from this authorization. + # @option options [String] :note A note to remind you what the OAuth token is for. + # @option options [String] :note_url A URL to remind you what app the OAuth token is for. + # + # @return [Sawyer::Resource] A single (updated) authorization for the authenticated user + # @see https://developer.github.com/v3/oauth_authorizations/#update-an-existing-authorization + # @see https://developer.github.com/v3/oauth/#scopes for available scopes + # @example Update the authorization for user ctshryock's project Zoidberg + # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret') + # client.update_authorization(999999, {:add_scopes => ["gist", "repo"], :note => "Why not Zoidberg possibly?"}) + def update_authorization(number, options = {}) + patch "authorizations/#{number}", options + end + + # Delete an authorization for the authenticated user. + # + # You can delete your own tokens, and only through + # Basic Authentication. + # + # @param number [Number] An existing Authorization ID + # + # @return [Boolean] Success + # @see https://developer.github.com/v3/oauth_authorizations/#delete-an-authorization + # @example Delete an authorization + # client = Octokit::Client.new(:login => 'ctshryock', :password => 'secret') + # client.delete_authorization(999999) + def delete_authorization(number, options = {}) + boolean_from_response :delete, "authorizations/#{number}", options + end + + # Check scopes for a token + # + # @param token [String] GitHub OAuth token + # @param options [Hash] Header params for request + # @return [Array<String>] OAuth scopes + # @see https://developer.github.com/v3/oauth/#scopes + def scopes(token = @access_token, options = {}) + options= options.dup + raise ArgumentError.new("Access token required") if token.nil? + + auth = { "Authorization" => "token #{token}" } + headers = (options.delete(:headers) || {}).merge(auth) + + agent.call(:get, "user", :headers => headers). + headers['X-OAuth-Scopes']. + to_s. + split(','). + map(&:strip). + sort + end + + # Revoke all tokens for an app + # + # Applications can revoke all of their tokens in a single request + # + # @deprecated As of January 25th, 2016: https://developer.github.com/changes/2014-04-08-reset-api-tokens/ + # @return [Boolean] false + def revoke_all_application_authorizations(options = {}) + octokit_warn("Deprecated: If you need to revoke all tokens for your application, you can do so via the settings page for your application.") + false + end + + # Get the URL to authorize a user for an application via the web flow + # + # @param app_id [String] Client Id we received when our application was registered with GitHub. + # @option options [String] :redirect_uri The url to redirect to after authorizing. + # @option options [String] :scope The scopes to request from the user. + # @option options [String] :state A random string to protect against CSRF. + # @return [String] The url to redirect the user to authorize. + # @see Octokit::Client + # @see https://developer.github.com/v3/oauth/#web-application-flow + # @example + # @client.authorize_url('xxxx') + def authorize_url(app_id = client_id, options = {}) + opts = options.dup + if app_id.to_s.empty? + raise Octokit::ApplicationCredentialsRequired, "client_id required" + end + authorize_url = opts.delete(:endpoint) || Octokit.web_endpoint + authorize_url << "login/oauth/authorize?client_id=#{app_id}" + + require 'cgi' + opts.each do |key, value| + authorize_url << "&#{key}=#{CGI.escape value}" + end + + authorize_url + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/checks.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/checks.rb new file mode 100644 index 000000000000..9d661bb80edf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/checks.rb @@ -0,0 +1,211 @@ +module Octokit + class Client + + # Methods for the Checks API + # + # @see https://developer.github.com/v3/checks/ + module Checks + + # Methods for Check Runs + # + # @see https://developer.github.com/v3/checks/runs/ + + # Create a check run + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param name [String] The name of the check + # @param head_sha [String] The SHA of the commit to check + # @return [Sawyer::Resource] A hash representing the new check run + # @see https://developer.github.com/v3/checks/runs/#create-a-check-run + # @example Create a check run + # check_run = @client.create_check_run("octocat/Hello-World", "my-check", "7638417db6d59f3c431d3e1f261cc637155684cd") + # check_run.name # => "my-check" + # check_run.head_sha # => "7638417db6d59f3c431d3e1f261cc637155684cd" + # check_run.status # => "queued" + def create_check_run(repo, name, head_sha, options = {}) + ensure_api_media_type(:checks, options) + options[:name] = name + options[:head_sha] = head_sha + + post "#{Repository.path repo}/check-runs", options + end + + # Update a check run + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The ID of the check run + # @return [Sawyer::Resource] A hash representing the updated check run + # @see https://developer.github.com/v3/checks/runs/#update-a-check-run + # @example Update a check run + # check_run = @client.update_check_run("octocat/Hello-World", 51295429, status: "in_progress") + # check_run.id # => 51295429 + # check_run.status # => "in_progress" + def update_check_run(repo, id, options = {}) + ensure_api_media_type(:checks, options) + + patch "#{Repository.path repo}/check-runs/#{id}", options + end + + # List check runs for a specific ref + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param ref [String] A SHA, branch name, or tag name + # @param options [Hash] A set of optional filters + # @option options [String] :check_name Returns check runs with the specified <tt>name</tt> + # @option options [String] :status Returns check runs with the specified <tt>status</tt> + # @option options [String] :filter Filters check runs by their <tt>completed_at</tt> timestamp + # @return [Sawyer::Resource] A hash representing a collection of check runs + # @see https://developer.github.com/v3/checks/runs/#list-check-runs-for-a-specific-ref + # @example List check runs for a specific ref + # result = @client.check_runs_for_ref("octocat/Hello-World", "7638417db6d59f3c431d3e1f261cc637155684cd", status: "in_progress") + # result.total_count # => 1 + # result.check_runs.count # => 1 + # result.check_runs[0].id # => 51295429 + # result.check_runs[0].status # => "in_progress" + def check_runs_for_ref(repo, ref, options = {}) + ensure_api_media_type(:checks, options) + + get "#{Repository.path repo}/commits/#{ref}/check-runs", options + end + alias :list_check_runs_for_ref :check_runs_for_ref + + # List check runs in a check suite + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The ID of the check suite + # @param options [Hash] A set of optional filters + # @option options [String] :check_name Returns check runs with the specified <tt>name</tt> + # @option options [String] :status Returns check runs with the specified <tt>status</tt> + # @option options [String] :filter Filters check runs by their <tt>completed_at</tt> timestamp + # @return [Sawyer::Resource] A hash representing a collection of check runs + # @see https://developer.github.com/v3/checks/runs/#list-check-runs-in-a-check-suite + # @example List check runs in a check suite + # result = @client.check_runs_for_check_suite("octocat/Hello-World", 50440400, status: "in_progress") + # result.total_count # => 1 + # result.check_runs.count # => 1 + # result.check_runs[0].check_suite.id # => 50440400 + # result.check_runs[0].status # => "in_progress" + def check_runs_for_check_suite(repo, id, options = {}) + ensure_api_media_type(:checks, options) + + get "#{Repository.path repo}/check-suites/#{id}/check-runs", options + end + alias :list_check_runs_for_check_suite :check_runs_for_check_suite + + # Get a single check run + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The ID of the check run + # @return [Sawyer::Resource] A hash representing the check run + # @see https://developer.github.com/v3/checks/runs/#get-a-single-check-run + def check_run(repo, id, options = {}) + ensure_api_media_type(:checks, options) + + get "#{Repository.path repo}/check-runs/#{id}", options + end + + # List annotations for a check run + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The ID of the check run + # @return [Array<Sawyer::Resource>] An array of hashes representing check run annotations + # @see https://developer.github.com/v3/checks/runs/#list-annotations-for-a-check-run + # @example List annotations for a check run + # annotations = @client.check_run_annotations("octocat/Hello-World", 51295429) + # annotations.count # => 1 + # annotations[0].path # => "README.md" + # annotations[0].message # => "Looks good!" + def check_run_annotations(repo, id, options = {}) + ensure_api_media_type(:checks, options) + + get "#{Repository.path repo}/check-runs/#{id}/annotations", options + end + + # Methods for Check Suites + # + # @see https://developer.github.com/v3/checks/suites/ + + # Get a single check suite + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The ID of the check suite + # @return [Sawyer::Resource] A hash representing the check suite + # @see https://developer.github.com/v3/checks/suites/#get-a-single-check-suite + def check_suite(repo, id, options = {}) + ensure_api_media_type(:checks, options) + + get "#{Repository.path repo}/check-suites/#{id}", options + end + + # List check suites for a specific ref + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param ref [String] A SHA, branch name, or tag name + # @param options [Hash] A set of optional filters + # @option options [Integer] :app_id Filters check suites by GitHub App <tt>id</tt> + # @option options [String] :check_name Filters checks suites by the <tt>name</tt> of the check run + # @return [Sawyer::Resource] A hash representing a collection of check suites + # @see https://developer.github.com/v3/checks/suites/#list-check-suites-for-a-specific-ref + # @example List check suites for a specific ref + # result = @client.check_suites_for_ref("octocat/Hello-World", "7638417db6d59f3c431d3e1f261cc637155684cd", app_id: 76765) + # result.total_count # => 1 + # result.check_suites.count # => 1 + # result.check_suites[0].id # => 50440400 + # result.check_suites[0].app.id # => 76765 + def check_suites_for_ref(repo, ref, options = {}) + ensure_api_media_type(:checks, options) + + get "#{Repository.path repo}/commits/#{ref}/check-suites", options + end + alias :list_check_suites_for_ref :check_suites_for_ref + + # Set preferences for check suites on a repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param options [Hash] Preferences to set + # @return [Sawyer::Resource] A hash representing the repository's check suite preferences + # @see https://developer.github.com/v3/checks/suites/#set-preferences-for-check-suites-on-a-repository + # @example Set preferences for check suites on a repository + # result = @client.set_check_suite_preferences("octocat/Hello-World", auto_trigger_checks: [{ app_id: 76765, setting: false }]) + # result.preferences.auto_trigger_checks.count # => 1 + # result.preferences.auto_trigger_checks[0].app_id # => 76765 + # result.preferences.auto_trigger_checks[0].setting # => false + # result.repository.full_name # => "octocat/Hello-World" + def set_check_suite_preferences(repo, options = {}) + ensure_api_media_type(:checks, options) + + patch "#{Repository.path repo}/check-suites/preferences", options + end + + # Create a check suite + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param head_sha [String] The SHA of the commit to check + # @return [Sawyer::Resource] A hash representing the new check suite + # @see https://developer.github.com/v3/checks/suites/#create-a-check-suite + # @example Create a check suite + # check_suite = @client.create_check_suite("octocat/Hello-World", "7638417db6d59f3c431d3e1f261cc637155684cd") + # check_suite.head_sha # => "7638417db6d59f3c431d3e1f261cc637155684cd" + # check_suite.status # => "queued" + def create_check_suite(repo, head_sha, options = {}) + ensure_api_media_type(:checks, options) + options[:head_sha] = head_sha + + post "#{Repository.path repo}/check-suites", options + end + + # Rerequest check suite + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The ID of the check suite + # @return [Boolean] True if successful, raises an error otherwise + # @see https://developer.github.com/v3/checks/suites/#rerequest-check-suite + def rerequest_check_suite(repo, id, options = {}) + ensure_api_media_type(:checks, options) + + post "#{Repository.path repo}/check-suites/#{id}/rerequest", options + true + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commit_branches.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commit_branches.rb new file mode 100644 index 000000000000..9e253b6c4a86 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commit_branches.rb @@ -0,0 +1,20 @@ +module Octokit + class Client + + # Methods for the Branches for HEAD API + # + # @see https://developer.github.com/v3/repos/commits/ + module CommitBranches + + # List branches for a single HEAD commit + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param sha [String] The SHA of the commit whose branches will be fetched + # @return [Array] List of branches + # @see https://developer.github.com/v3/repos/commits/#list-branches-for-head-commit + def commit_branches(repo, sha, options = {}) + paginate "#{Repository.path repo}/commits/#{sha}/branches-where-head", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commit_comments.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commit_comments.rb new file mode 100644 index 000000000000..96341632dbb5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commit_comments.rb @@ -0,0 +1,95 @@ +module Octokit + class Client + + # Methods for the Commit Comments API + # + # @see https://developer.github.com/v3/repos/comments/ + module CommitComments + + # List all commit comments + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Array] List of commit comments + # @see https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository + def list_commit_comments(repo, options = {}) + paginate "#{Repository.path repo}/comments", options + end + + # List comments for a single commit + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param sha [String] The SHA of the commit whose comments will be fetched + # @return [Array] List of commit comments + # @see https://developer.github.com/v3/repos/comments/#list-comments-for-a-single-commit + def commit_comments(repo, sha, options = {}) + paginate "#{Repository.path repo}/commits/#{sha}/comments", options + end + + # Get a single commit comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [String] The ID of the comment to fetch + # @return [Sawyer::Resource] Commit comment + # @see https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment + def commit_comment(repo, id, options = {}) + get "#{Repository.path repo}/comments/#{id}", options + end + + # Create a commit comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param sha [String] Sha of the commit to comment on + # @param body [String] Message + # @param path [String] Relative path of file to comment on + # @param line [Integer] Line number in the file to comment on + # @param position [Integer] Line index in the diff to comment on + # @return [Sawyer::Resource] Commit comment + # @see https://developer.github.com/v3/repos/comments/#create-a-commit-comment + # @example Create a commit comment + # comment = Octokit.create_commit_comment("octocat/Hello-World", "827efc6d56897b048c772eb4087f854f46256132", "My comment message", "README.md", 10, 1) + # comment.commit_id # => "827efc6d56897b048c772eb4087f854f46256132" + # comment.id # => 54321 + # comment.body # => "My comment message" + # comment.path # => "README.md" + # comment.line # => 10 + # comment.position # => 1 + def create_commit_comment(repo, sha, body, path=nil, line=nil, position=nil, options = {}) + params = { + :body => body, + :path => path, + :line => line, + :position => position + } + post "#{Repository.path repo}/commits/#{sha}/comments", options.merge(params) + end + + # Update a commit comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [String] The ID of the comment to update + # @param body [String] Message + # @return [Sawyer::Resource] Updated commit comment + # @see https://developer.github.com/v3/repos/comments/#update-a-commit-comment + # @example Update a commit comment + # comment = Octokit.update_commit_comment("octocat/Hello-World", "860296", "Updated commit comment") + # comment.id # => 860296 + # comment.body # => "Updated commit comment" + def update_commit_comment(repo, id, body, options = {}) + params = { + :body => body + } + patch "#{Repository.path repo}/comments/#{id}", options.merge(params) + end + + # Delete a commit comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [String] The ID of the comment to delete + # @return [Boolean] Success + # @see https://developer.github.com/v3/repos/comments/#delete-a-commit-comment + def delete_commit_comment(repo, id, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/comments/#{id}", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commit_pulls.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commit_pulls.rb new file mode 100644 index 000000000000..38d56f8e96b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commit_pulls.rb @@ -0,0 +1,20 @@ +module Octokit + class Client + + # Methods for the Commit Pulls API + # + # @see https://developer.github.com/v3/repos/comments/ + module CommitPulls + + # List pulls for a single commit + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param sha [String] The SHA of the commit whose pulls will be fetched + # @return [Array] List of commit pulls + # @see https://developer.github.com/v3/repos/commits/#list-pull-requests-associated-with-commit + def commit_pulls(repo, sha, options = {}) + paginate "#{Repository.path repo}/commits/#{sha}/pulls", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commits.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commits.rb new file mode 100644 index 000000000000..c6c484b917d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/commits.rb @@ -0,0 +1,239 @@ +require 'date' + +module Octokit + class Client + + # Methods for the Commits API + # + # @see https://developer.github.com/v3/repos/commits/ + module Commits + + # List commits + # + # @overload commits(repo, sha_or_branch, options = {}) + # @deprecated + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param sha_or_branch [String] A commit SHA or branch name + # @param options [String] :sha Commit SHA or branch name from which to start the list + # @overload commits(repo, options = {}) + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param options [String] :sha Commit SHA or branch name from which to start the list + # @return [Array<Sawyer::Resource>] An array of hashes representing commits + # @see https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository + def commits(*args) + arguments = Octokit::RepoArguments.new(args) + sha_or_branch = arguments.pop + if sha_or_branch + arguments.options[:sha] = sha_or_branch + end + paginate "#{Repository.new(arguments.repo).path}/commits", arguments.options + end + alias :list_commits :commits + + # Get commits after a specified date + # + # @overload commits_since(repo, date, options = {}) + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param date [String] Date on which we want to compare + # @param options [String] :sha Commit SHA or branch name from which to start the list + # @overload commits_since(repo, date, sha_or_branch, options = {}) + # @deprecated + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param date [String] Date on which we want to compare + # @param sha_or_branch [String] A commit SHA or branch name + # @param options [String] :sha Commit SHA or branch name from which to start the list + # @return [Array<Sawyer::Resource>] An array of hashes representing commits + # @see https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository + # @example + # Octokit.commits_since('octokit/octokit.rb', '2012-10-01') + def commits_since(*args) + arguments = Octokit::RepoArguments.new(args) + date = parse_date(arguments.shift) + params = arguments.options + params.merge!(:since => iso8601(date)) + sha_or_branch = arguments.pop + if sha_or_branch + params[:sha] = sha_or_branch + end + commits(arguments.repo, params) + end + + # Get commits before a specified date + # + # @overload commits_before(repo, date, options = {}) + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param date [String] Date on which we want to compare + # @overload commits_before(repo, date, sha_or_branch, options = {}) + # @deprecated + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param date [String] Date on which we want to compare + # @param sha_or_branch [String] Commit SHA or branch name from which to start the list + # @return [Array<Sawyer::Resource>] An array of hashes representing commits + # @see https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository + # @example + # Octokit.commits_before('octokit/octokit.rb', '2012-10-01') + def commits_before(*args) + arguments = Octokit::RepoArguments.new(args) + date = parse_date(arguments.shift) + params = arguments.options + params.merge!(:until => iso8601(date)) + sha_or_branch = arguments.pop + if sha_or_branch + params[:sha] = sha_or_branch + end + commits(arguments.repo, params) + end + + # Get commits on a specified date + # + # @overload commits_on(repo, date, options = {}) + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param date [String] Date on which we want to compare + # @overload commits_on(repo, date, sha_or_branch, options = {}) + # @deprecated + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param date [String] Date on which we want to compare + # @param sha_or_branch [String] Commit SHA or branch name from which to start the list + # @return [Array<Sawyer::Resource>] An array of hashes representing commits + # @see https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository + # @example + # Octokit.commits_on('octokit/octokit.rb', '2012-10-01') + def commits_on(*args) + arguments = Octokit::RepoArguments.new(args) + date = parse_date(arguments.shift) + params = arguments.options + end_date = date + 1 + params.merge!(:since => iso8601(date), :until => iso8601(end_date)) + sha_or_branch = arguments.pop + if sha_or_branch + params[:sha] = sha_or_branch + end + commits(arguments.repo, params) + end + + # Get commits made between two nominated dates + # + # @overload commits_between(repo, start_date, end_date, options = {}) + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param start_date [String] Start Date on which we want to compare + # @param end_date [String] End Date on which we want to compare + # @overload commits_between(repo, start_date, end_date, sha_or_branch, options = {}) + # @deprecated + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param start_date [String] Start Date on which we want to compare + # @param end_date [String] End Date on which we want to compare + # @param sha_or_branch [String] Commit SHA or branch name from which to start the list + # @return [Array<Sawyer::Resource>] An array of hashes representing commits + # @see https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository + # @example + # Octokit.commits_between('octokit/octokit.rb', '2012-10-01', '2012-11-01') + def commits_between(*args) + arguments = Octokit::RepoArguments.new(args) + date = parse_date(arguments.shift) + end_date = parse_date(arguments.shift) + raise ArgumentError, "Start date #{date} does not precede #{end_date}" if date > end_date + + params = arguments.options + params.merge!(:since => iso8601(date), :until => iso8601(end_date)) + sha_or_branch = arguments.pop + if sha_or_branch + params[:sha] = sha_or_branch + end + commits(arguments.repo, params) + end + + # Get a single commit + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param sha [String] The SHA of the commit to fetch + # @return [Sawyer::Resource] A hash representing the commit + # @see https://developer.github.com/v3/repos/commits/#get-a-single-commit + def commit(repo, sha, options = {}) + get "#{Repository.path repo}/commits/#{sha}", options + end + + # Get a detailed git commit + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param sha [String] The SHA of the commit to fetch + # @return [Sawyer::Resource] A hash representing the commit + # @see https://developer.github.com/v3/git/commits/#get-a-commit + def git_commit(repo, sha, options = {}) + get "#{Repository.path repo}/git/commits/#{sha}", options + end + + # Create a commit + # + # Optionally pass <tt>author</tt> and <tt>committer</tt> hashes in <tt>options</tt> + # if you'd like manual control over those parameters. If absent, details will be + # inferred from the authenticated user. See <a href="http://developer.github.com/v3/git/commits/">GitHub's documentation</a> + # for details about how to format committer identities. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param message [String] The commit message + # @param tree [String] The SHA of the tree object the new commit will point to + # @param parents [String, Array] One SHA (for a normal commit) or an array of SHAs (for a merge) of the new commit's parent commits. If ommitted or empty, a root commit will be created + # @return [Sawyer::Resource] A hash representing the new commit + # @see https://developer.github.com/v3/git/commits/#create-a-commit + # @example Create a commit + # commit = Octokit.create_commit("octocat/Hello-World", "My commit message", "827efc6d56897b048c772eb4087f854f46256132", "7d1b31e74ee336d15cbd21741bc88a537ed063a0") + # commit.sha # => "7638417db6d59f3c431d3e1f261cc637155684cd" + # commit.tree.sha # => "827efc6d56897b048c772eb4087f854f46256132" + # commit.message # => "My commit message" + # commit.committer # => { "name" => "Wynn Netherland", "email" => "wynn@github.com", ... } + def create_commit(repo, message, tree, parents=nil, options = {}) + params = { :message => message, :tree => tree } + params[:parents] = [parents].flatten if parents + post "#{Repository.path repo}/git/commits", options.merge(params) + end + + # Compare two commits + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param start [String] The sha of the starting commit + # @param endd [String] The sha of the ending commit + # @return [Sawyer::Resource] A hash representing the comparison + # @see https://developer.github.com/v3/repos/commits/#compare-two-commits + def compare(repo, start, endd, options = {}) + get "#{Repository.path repo}/compare/#{start}...#{endd}", options + end + + # Merge a branch or sha + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param base [String] The name of the base branch to merge into + # @param head [String] The branch or SHA1 to merge + # @option options [String] :commit_message The commit message for the merge + # @return [Sawyer::Resource] A hash representing the comparison + # @see https://developer.github.com/v3/repos/merging/#perform-a-merge + def merge(repo, base, head, options = {}) + params = { + :base => base, + :head => head + }.merge(options) + post "#{Repository.path repo}/merges", params + end + + protected + + def iso8601(date) + if date.respond_to?(:iso8601) + date.iso8601 + else + date.strftime("%Y-%m-%dT%H:%M:%S%Z") + end + end + + # Parses the given string representation of a date, throwing a meaningful exception + # (containing the date that failed to parse) in case of failure. + # + # @param date [String] String representation of a date + # @return [DateTime] + def parse_date(date) + date = DateTime.parse(date.to_s) + rescue ArgumentError + raise ArgumentError, "#{date} is not a valid date" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/community_profile.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/community_profile.rb new file mode 100644 index 000000000000..608bc0c10439 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/community_profile.rb @@ -0,0 +1,22 @@ +module Octokit + class Client + + # Methods for the Community Profile API + # + # @see https://developer.github.com/v3/repos/community/ + module CommunityProfile + + # Get community profile metrics for a repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Sawyer::Resource] Community profile metrics + # @see https://developer.github.com/v3/repos/community/#retrieve-community-profile-metrics + # @example Get community profile metrics for octokit/octokit.rb + # @client.community_profile('octokit/octokit.rb') + def community_profile(repo, options = {}) + options = ensure_api_media_type(:community_profile, options) + get "#{Repository.path repo}/community/profile", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/contents.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/contents.rb new file mode 100644 index 000000000000..bfa4ad85ffe3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/contents.rb @@ -0,0 +1,168 @@ +require 'base64' + +module Octokit + class Client + + # Methods for the Repo Contents API + # + # @see https://developer.github.com/v3/repos/contents/ + module Contents + + # Receive the default Readme for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @option options [String] :ref name of the Commit/Branch/Tag. Defaults to “master”. + # @return [Sawyer::Resource] The detail of the readme + # @see https://developer.github.com/v3/repos/contents/#get-the-readme + # @example Get the readme file for a repo + # Octokit.readme("octokit/octokit.rb") + # @example Get the readme file for a particular branch of the repo + # Octokit.readme("octokit/octokit.rb", :query => {:ref => 'some-other-branch'}) + def readme(repo, options={}) + get "#{Repository.path repo}/readme", options + end + + # Receive a listing of a repository folder or the contents of a file + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @option options [String] :path A folder or file path + # @option options [String] :ref name of the Commit/Branch/Tag. Defaults to “master”. + # @return [Sawyer::Resource] The contents of a file or list of the files in the folder + # @see https://developer.github.com/v3/repos/contents/#get-contents + # @example List the contents of lib/octokit.rb + # Octokit.contents("octokit/octokit.rb", :path => 'lib/octokit.rb') + # @example Lists the contents of lib /octokit.rb on a particular branch + # Octokit.contents("octokit/octokit.rb", :path => 'lib/octokit.rb', :query => {:ref => 'some-other-branch'}) + def contents(repo, options={}) + options = options.dup + repo_path = options.delete :path + url = "#{Repository.path repo}/contents/#{repo_path}" + get url, options + end + alias :content :contents + + # Add content to a repository + # + # @overload create_contents(repo, path, message, content = nil, options = {}) + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param path [String] A path for the new content + # @param message [String] A commit message for adding the content + # @param optional content [String] The content for the file + # @option options [String] :branch The branch on which to add the content + # @option options [String] :file Path or Ruby File object for content + # @return [Sawyer::Resource] The contents and commit info for the addition + # @see https://developer.github.com/v3/repos/contents/#create-a-file + # @example Add content at lib/octokit.rb + # Octokit.create_contents("octokit/octokit.rb", + # "lib/octokit.rb", + # "Adding content", + # "File content", + # :branch => "my-new-feature") + def create_contents(*args) + args = args.map { |item| item && item.dup } + options = args.last.is_a?(Hash) ? args.pop : {} + repo = args.shift + path = args.shift + message = args.shift + content = args.shift + if content.nil? && file = options.delete(:file) + case file + when String + if File.exist?(file) + file = File.open(file, "r") + content = file.read + file.close + end + when File, Tempfile + content = file.read + file.close + end + end + raise ArgumentError.new("content or :file option required") if content.nil? + options[:content] = Base64.respond_to?(:strict_encode64) ? + Base64.strict_encode64(content) : + Base64.encode64(content).delete("\n") # Ruby 1.9.2 + options[:message] = message + url = "#{Repository.path repo}/contents/#{path}" + put url, options + end + alias :create_content :create_contents + alias :add_content :create_contents + alias :add_contents :create_contents + + # Update content in a repository + # + # @overload update_contents(repo, path, message, sha, content = nil, options = {}) + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param path [String] A path for the content to update + # @param message [String] A commit message for updating the content + # @param sha [String] The _blob sha_ of the content to update + # @param content [String] The content for the file + # @option options [String] :branch The branch on which to update the content + # @option options [String] :file Path or Ruby File object for content + # @return [Sawyer::Resource] The contents and commit info for the update + # @see https://developer.github.com/v3/repos/contents/#update-a-file + # @example Update content at lib/octokit.rb + # Octokit.update_contents("octokit/octokit.rb", + # "lib/octokit.rb", + # "Updating content", + # "7eb95f97e1a0636015df3837478d3f15184a5f49", + # "File content", + # :branch => "my-new-feature") + def update_contents(*args) + options = args.last.is_a?(Hash) ? args.pop : {} + repo = args.shift + path = args.shift + message = args.shift + sha = args.shift + content = args.shift + options.merge!(:sha => sha) + create_contents(repo, path, message, content, options) + end + alias :update_content :update_contents + + # Delete content in a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param path [String] A path for the content to delete + # @param message [String] A commit message for deleting the content + # @param sha [String] The _blob sha_ of the content to delete + # @option options [String] :branch The branch on which to delete the content + # @return [Sawyer::Resource] The commit info for the delete + # @see https://developer.github.com/v3/repos/contents/#delete-a-file + # @example Delete content at lib/octokit.rb + # Octokit.delete_contents("octokit/octokit.rb", + # "lib/octokit.rb", + # "Deleting content", + # "7eb95f97e1a0636015df3837478d3f15184a5f49", + # :branch => "my-new-feature") + def delete_contents(repo, path, message, sha, options = {}) + options[:message] = message + options[:sha] = sha + url = "#{Repository.path repo}/contents/#{path}" + delete url, options + end + alias :delete_content :delete_contents + alias :remove_content :delete_contents + alias :remove_contents :delete_contents + + # This method will provide a URL to download a tarball or zipball archive for a repository. + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository. + # @option options format [String] Either tarball (default) or zipball. + # @option options [String] :ref Optional valid Git reference, defaults to master. + # @return [String] Location of the download + # @see https://developer.github.com/v3/repos/contents/#get-archive-link + # @example Get archive link for octokit/octokit.rb + # Octokit.archive_link("octokit/octokit.rb") + def archive_link(repo, options={}) + repo_ref = options.delete :ref + format = (options.delete :format) || 'tarball' + url = "#{Repository.path repo}/#{format}/#{repo_ref}" + + response = client_without_redirects.head(url, options) + response.headers['Location'] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/deployments.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/deployments.rb new file mode 100644 index 000000000000..3d95885a3eaa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/deployments.rb @@ -0,0 +1,82 @@ +module Octokit + class Client + + # Methods for the Deployments API + # + # @see https://developer.github.com/v3/repos/commits/deployments/ + module Deployments + + # Fetch a single deployment for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param deployment_id [Integer, String, Repository, Hash] A GitHub repository + # @return <Sawyer::Resource> A single deployment + # @see https://developer.github.com/v3/repos/deployments/#get-a-single-deployment + def deployment(repo, deployment_id, options = {}) + get("#{Repository.path repo}/deployments/#{deployment_id}", options) + end + + # List all deployments for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] A list of deployments + # @see https://developer.github.com/v3/repos/deployments/#list-deployments + def deployments(repo, options = {}) + get("#{Repository.path repo}/deployments", options) + end + alias :list_deployments :deployments + + # Create a deployment for a ref + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param ref [String] The ref to deploy + # @option options [String] :task Used by the deployment system to allow different execution paths. Defaults to "deploy". + # @option options [String] :payload Meta info about the deployment + # @option options [Boolean] :auto_merge Optional parameter to merge the default branch into the requested deployment branch if necessary. Default: true + # @option options [Array<String>] :required_contexts Optional array of status contexts verified against commit status checks. + # @option options [String] :environment Optional name for the target deployment environment (e.g., production, staging, qa). Default: "production" + # @option options [String] :description Optional short description. + # @return [Sawyer::Resource] A deployment + # @see https://developer.github.com/v3/repos/deployments/#create-a-deployment + def create_deployment(repo, ref, options = {}) + options[:ref] = ref + post("#{Repository.path repo}/deployments", options) + end + + # Delete a Deployment + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param deployment_id [Integer, String, Repository, Hash] A GitHub repository + # @return [No Content] + # @see https://developer.github.com/v3/repos/deployments/#delete-a-deployment + def delete_deployment(repo, deployment_id, options = {}) + delete("#{Repository.path repo}/deployments/#{deployment_id}", options) + end + + # List all statuses for a Deployment + # + # @param deployment_url [String] A URL for a deployment resource + # @return [Array<Sawyer::Resource>] A list of deployment statuses + # @see https://developer.github.com/v3/repos/deployments/#list-deployment-statuses + def deployment_statuses(deployment_url, options = {}) + deployment = get(deployment_url, :accept => options[:accept]) + get(deployment.rels[:statuses].href, options) + end + alias :list_deployment_statuses :deployment_statuses + + # Create a deployment status for a Deployment + # + # @param deployment_url [String] A URL for a deployment resource + # @param state [String] The state: pending, success, failure, error + # @option options [String] :target_url The target URL to associate with this status. Default: "" + # @option options [String] :description A short description of the status. Maximum length of 140 characters. Default: "" + # @return [Sawyer::Resource] A deployment status + # @see https://developer.github.com/v3/repos/deployments/#create-a-deployment-status + def create_deployment_status(deployment_url, state, options = {}) + deployment = get(deployment_url, :accept => options[:accept]) + options[:state] = state.to_s.downcase + post(deployment.rels[:statuses].href, options) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/downloads.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/downloads.rb new file mode 100644 index 000000000000..5a81c0d02031 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/downloads.rb @@ -0,0 +1,50 @@ +module Octokit + class Client + + # Methods for the Repo Downloads API + # + # @see https://developer.github.com/v3/repos/downloads/ + module Downloads + + # List available downloads for a repository + # + # @param repo [Integer, String, Repository, Hash] A Github Repository + # @return [Array] A list of available downloads + # @deprecated As of December 11th, 2012: https://github.com/blog/1302-goodbye-uploads + # @see https://developer.github.com/v3/repos/downloads/#list-downloads-for-a-repository + # @example List all downloads for Github/Hubot + # Octokit.downloads("github/hubot") + def downloads(repo, options={}) + paginate "#{Repository.path repo}/downloads", options + end + alias :list_downloads :downloads + + # Get single download for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer] ID of the download + # @return [Sawyer::Resource] A single download from the repository + # @deprecated As of December 11th, 2012: https://github.com/blog/1302-goodbye-uploads + # @see https://developer.github.com/v3/repos/downloads/#get-a-single-download + # @example Get the "Robawt" download from Github/Hubot + # Octokit.download("github/hubot") + def download(repo, id, options={}) + get "#{Repository.path repo}/downloads/#{id}", options + end + + # Delete a single download for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer] ID of the download + # @deprecated As of December 11th, 2012: https://github.com/blog/1302-goodbye-uploads + # @see https://developer.github.com/v3/repos/downloads/#delete-a-download + # @return [Boolean] Status + # @example Get the "Robawt" download from Github/Hubot + # Octokit.delete_download("github/hubot", 1234) + def delete_download(repo, id, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/downloads/#{id}", options + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/emojis.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/emojis.rb new file mode 100644 index 000000000000..c5bd3be1e438 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/emojis.rb @@ -0,0 +1,18 @@ +module Octokit + class Client + + # Methods for the Emojis API + module Emojis + + # List all emojis used on GitHub + # + # @return [Sawyer::Resource] A list of all emojis on GitHub + # @see https://developer.github.com/v3/emojis/#emojis + # @example List all emojis + # Octokit.emojis + def emojis(options = {}) + get "emojis", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/events.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/events.rb new file mode 100644 index 000000000000..41b8e4742c58 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/events.rb @@ -0,0 +1,152 @@ +module Octokit + class Client + + # Method for the Events API + # + # @see https://developer.github.com/v3/activity/events/ + # @see https://developer.github.com/v3/issues/events/ + module Events + + # List all public events for GitHub + # + # @return [Array<Sawyer::Resource>] A list of all public events from GitHub + # @see https://developer.github.com/v3/activity/events/#list-public-events + # @example List all pubilc events + # Octokit.public_events + def public_events(options = {}) + paginate "events", options + end + + # List all user events + # + # @param user [Integer, String] GitHub user login or id. + # @return [Array<Sawyer::Resource>] A list of all user events + # @see https://developer.github.com/v3/activity/events/#list-events-performed-by-a-user + # @example List all user events + # Octokit.user_events("sferik") + def user_events(user, options = {}) + paginate "#{User.path user}/events", options + end + + # List public user events + # + # @param user [Integer, String] GitHub user login or id + # @return [Array<Sawyer::Resource>] A list of public user events + # @see https://developer.github.com/v3/activity/events/#list-public-events-performed-by-a-user + # @example List public user events + # Octokit.user_events("sferik") + def user_public_events(user, options = {}) + paginate "#{User.path user}/events/public", options + end + + # List events that a user has received + # + # @param user [Integer, String] GitHub user login or id + # @return [Array<Sawyer::Resource>] A list of all user received events + # @see https://developer.github.com/v3/activity/events/#list-events-that-a-user-has-received + # @example List all user received events + # Octokit.received_events("sferik") + def received_events(user, options = {}) + paginate "#{User.path user}/received_events", options + end + + # List public events a user has received + # + # @param user [Integer, String] GitHub user login or id + # @return [Array<Sawyer::Resource>] A list of public user received events + # @see https://developer.github.com/v3/activity/events/#list-public-events-that-a-user-has-received + # @example List public user received events + # Octokit.received_public_events("sferik") + def received_public_events(user, options = {}) + paginate "#{User.path user}/received_events/public", options + end + + # List events for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] A list of events for a repository + # @see https://developer.github.com/v3/activity/events/#list-repository-events + # @example List events for a repository + # Octokit.repository_events("sferik/rails_admin") + def repository_events(repo, options = {}) + paginate "#{Repository.path repo}/events", options + end + + # List public events for a repository's network + # + # @param repo [String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] A list of events for a repository's network + # @see https://developer.github.com/v3/activity/events/#list-public-events-for-a-network-of-repositories + # @example List events for a repository's network + # Octokit.repository_network_events("sferik/rails_admin") + def repository_network_events(repo, options = {}) + paginate "networks/#{Repository.new(repo)}/events", options + end + + # List all events for an organization + # + # Requires authenticated client. + # + # @param org [String] Organization GitHub handle + # @return [Array<Sawyer::Resource>] List of all events from a GitHub organization + # @see https://developer.github.com/v3/activity/events/#list-events-for-an-organization + # @example List events for the lostisland organization + # @client.organization_events("lostisland") + def organization_events(org, options = {}) + paginate "users/#{login}/events/orgs/#{org}", options + end + + # List an organization's public events + # + # @param org [String, Integer] Organization GitHub login or id. + # @return [Array<Sawyer::Resource>] List of public events from a GitHub organization + # @see https://developer.github.com/v3/activity/events/#list-public-events-for-an-organization + # @example List public events for GitHub + # Octokit.organization_public_events("GitHub") + def organization_public_events(org, options = {}) + paginate "#{Organization.path org}/events", options + end + + # Get all Issue Events for a given Repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # + # @return [Array<Sawyer::Resource>] Array of all Issue Events for this Repository + # @see https://developer.github.com/v3/issues/events/#list-events-for-a-repository + # @see https://developer.github.com/v3/activity/events/#list-issue-events-for-a-repository + # @example Get all Issue Events for Octokit + # Octokit.repository_issue_events("octokit/octokit.rb") + def repository_issue_events(repo, options = {}) + paginate "#{Repository.path repo}/issues/events", options + end + alias :repo_issue_events :repository_issue_events + + # List events for an Issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Issue number + # + # @return [Array<Sawyer::Resource>] Array of events for that issue + # @see https://developer.github.com/v3/issues/events/#list-events-for-an-issue + # @example List all issues events for issue #38 on octokit/octokit.rb + # Octokit.issue_events("octokit/octokit.rb", 38) + def issue_events(repo, number, options = {}) + options = ensure_api_media_type(:project_card_events, options) + paginate "#{Repository.path repo}/issues/#{number}/events", options + end + + # Get information on a single Issue Event + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Event number + # + # @return [Sawyer::Resource] A single Event for an Issue + # @see https://developer.github.com/v3/issues/events/#get-a-single-event + # @example Get Event information for ID 3094334 (a pull request was closed) + # Octokit.issue_event("octokit/octokit.rb", 3094334) + def issue_event(repo, number, options = {}) + paginate "#{Repository.path repo}/issues/events/#{number}", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/feeds.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/feeds.rb new file mode 100644 index 000000000000..1d6b4bad60d7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/feeds.rb @@ -0,0 +1,33 @@ +module Octokit + class Client + + # Methods for the Feeds API + # + # @see https://developer.github.com/v3/activity/feeds/ + module Feeds + + # List Feeds + # + # The feeds returned depend on authentication, see the GitHub API docs + # for more information. + # + # @return [Array<Sawyer::Resource>] list of feeds + # @see https://developer.github.com/v3/activity/feeds/#list-feeds + def feeds + get "feeds" + end + + # Get a Feed by name + # + # @param name [Symbol, String] Name of feed to retrieve. + # @return [Feed] Parsed feed in the format returned by the configured + # parser. + def feed(name, options = {}) + if rel = feeds._links[name] + get rel.href, :accept => rel.type, :options => options + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/gists.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/gists.rb new file mode 100644 index 000000000000..2078e81ccf3f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/gists.rb @@ -0,0 +1,234 @@ +module Octokit + class Client + + # Methods for the Gists API + # + # @see https://developer.github.com/v3/gists/ + module Gists + + # List gists for a user or all public gists + # + # @param user [String] An optional user to filter listing + # @return [Array<Sawyer::Resource>] A list of gists + # @example Fetch all gists for defunkt + # Octokit.gists('defunkt') + # @example Fetch all public gists + # Octokit.gists + # @see https://developer.github.com/v3/gists/#list-gists + def gists(user=nil, options = {}) + if user.nil? + paginate 'gists', options + else + paginate "#{User.path user}/gists", options + end + end + alias :list_gists :gists + + # List public gists + # + # @return [Array<Sawyer::Resource>] A list of gists + # @example Fetch all public gists + # Octokit.public_gists + # @see https://developer.github.com/v3/gists/#list-gists + def public_gists(options = {}) + paginate 'gists/public', options + end + + # List the authenticated user’s starred gists + # + # @return [Array<Sawyer::Resource>] A list of gists + # @see https://developer.github.com/v3/gists/#list-gists + def starred_gists(options = {}) + paginate 'gists/starred', options + end + + # Get a single gist + # + # @param gist [String] ID of gist to fetch + # @option options [String] :sha Specific gist revision SHA + # @return [Sawyer::Resource] Gist information + # @see https://developer.github.com/v3/gists/#get-a-single-gist + # @see https://developer.github.com/v3/gists/#get-a-specific-revision-of-a-gist + def gist(gist, options = {}) + options = options.dup + if sha = options.delete(:sha) + get "gists/#{Gist.new(gist)}/#{sha}", options + else + get "gists/#{Gist.new(gist)}", options + end + end + + # Create a gist + # + # @param options [Hash] Gist information. + # @option options [String] :description + # @option options [Boolean] :public Sets gist visibility + # @option options [Array<Hash>] :files Files that make up this gist. Keys + # should be the filename, the value a Hash with a :content key with text + # content of the Gist. + # @return [Sawyer::Resource] Newly created gist info + # @see https://developer.github.com/v3/gists/#create-a-gist + def create_gist(options = {}) + post 'gists', options + end + + # Edit a gist + # + # @param options [Hash] Gist information. + # @option options [String] :description + # @option options [Hash] :files Files that make up this gist. Keys + # should be the filename, the value a Hash with a :content key with text + # content of the Gist. + # + # NOTE: All files from the previous version of the + # gist are carried over by default if not included in the hash. Deletes + # can be performed by including the filename with a null hash. + # @return + # [Sawyer::Resource] Newly created gist info + # @see https://developer.github.com/v3/gists/#edit-a-gist + # @example Update a gist + # @client.edit_gist('some_id', { + # :files => {"boo.md" => {"content" => "updated stuff"}} + # }) + def edit_gist(gist, options = {}) + patch "gists/#{Gist.new(gist)}", options + end + + # List gist commits + # + # @param gist [String] Gist ID + # @return [Array] List of commits to the gist + # @see https://developer.github.com/v3/gists/#list-gist-commits + # @example List commits for a gist + # @client.gist_commits('some_id') + def gist_commits(gist, options = {}) + paginate "gists/#{Gist.new(gist)}/commits", options + end + + # + # Star a gist + # + # @param gist [String] Gist ID + # @return [Boolean] Indicates if gist is starred successfully + # @see https://developer.github.com/v3/gists/#star-a-gist + def star_gist(gist, options = {}) + boolean_from_response :put, "gists/#{Gist.new(gist)}/star", options + end + + # Unstar a gist + # + # @param gist [String] Gist ID + # @return [Boolean] Indicates if gist is unstarred successfully + # @see https://developer.github.com/v3/gists/#unstar-a-gist + def unstar_gist(gist, options = {}) + boolean_from_response :delete, "gists/#{Gist.new(gist)}/star", options + end + + # Check if a gist is starred + # + # @param gist [String] Gist ID + # @return [Boolean] Indicates if gist is starred + # @see https://developer.github.com/v3/gists/#check-if-a-gist-is-starred + def gist_starred?(gist, options = {}) + boolean_from_response :get, "gists/#{Gist.new(gist)}/star", options + end + + # Fork a gist + # + # @param gist [String] Gist ID + # @return [Sawyer::Resource] Data for the new gist + # @see https://developer.github.com/v3/gists/#fork-a-gist + def fork_gist(gist, options = {}) + post "gists/#{Gist.new(gist)}/forks", options + end + + # List gist forks + # + # @param gist [String] Gist ID + # @return [Array] List of gist forks + # @see https://developer.github.com/v3/gists/#list-gist-forks + # @example List gist forks + # @client.gist_forks('some-id') + def gist_forks(gist, options = {}) + paginate "gists/#{Gist.new(gist)}/forks", options + end + + # Delete a gist + # + # @param gist [String] Gist ID + # @return [Boolean] Indicating success of deletion + # @see https://developer.github.com/v3/gists/#delete-a-gist + def delete_gist(gist, options = {}) + boolean_from_response :delete, "gists/#{Gist.new(gist)}", options + end + + # List gist comments + # + # @param gist_id [String] Gist Id. + # @return [Array<Sawyer::Resource>] Array of hashes representing comments. + # @see https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist + # @example + # Octokit.gist_comments('3528ae645') + def gist_comments(gist_id, options = {}) + paginate "gists/#{gist_id}/comments", options + end + + # Get gist comment + # + # @param gist_id [String] Id of the gist. + # @param gist_comment_id [Integer] Id of the gist comment. + # @return [Sawyer::Resource] Hash representing gist comment. + # @see https://developer.github.com/v3/gists/comments/#get-a-single-comment + # @example + # Octokit.gist_comment('208sdaz3', 1451398) + def gist_comment(gist_id, gist_comment_id, options = {}) + get "gists/#{gist_id}/comments/#{gist_comment_id}", options + end + + # Create gist comment + # + # Requires authenticated client. + # + # @param gist_id [String] Id of the gist. + # @param comment [String] Comment contents. + # @return [Sawyer::Resource] Hash representing the new comment. + # @see https://developer.github.com/v3/gists/comments/#create-a-comment + # @example + # @client.create_gist_comment('3528645', 'This is very helpful.') + def create_gist_comment(gist_id, comment, options = {}) + options = options.merge({:body => comment}) + post "gists/#{gist_id}/comments", options + end + + # Update gist comment + # + # Requires authenticated client + # + # @param gist_id [String] Id of the gist. + # @param gist_comment_id [Integer] Id of the gist comment to update. + # @param comment [String] Updated comment contents. + # @return [Sawyer::Resource] Hash representing the updated comment. + # @see https://developer.github.com/v3/gists/comments/#edit-a-comment + # @example + # @client.update_gist_comment('208sdaz3', '3528645', ':heart:') + def update_gist_comment(gist_id, gist_comment_id, comment, options = {}) + options = options.merge({:body => comment}) + patch "gists/#{gist_id}/comments/#{gist_comment_id}", options + end + + # Delete gist comment + # + # Requires authenticated client. + # + # @param gist_id [String] Id of the gist. + # @param gist_comment_id [Integer] Id of the gist comment to delete. + # @return [Boolean] True if comment deleted, false otherwise. + # @see https://developer.github.com/v3/gists/comments/#delete-a-comment + # @example + # @client.delete_gist_comment('208sdaz3', '586399') + def delete_gist_comment(gist_id, gist_comment_id, options = {}) + boolean_from_response(:delete, "gists/#{gist_id}/comments/#{gist_comment_id}", options) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/gitignore.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/gitignore.rb new file mode 100644 index 000000000000..4206f626dd68 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/gitignore.rb @@ -0,0 +1,43 @@ +module Octokit + class Client + + # Methods for the Gitignore API + # + # @see https://developer.github.com/v3/gitignore/ + module Gitignore + + # Listing available gitignore templates. + # + # These templates can be passed option when creating a repository. + # + # @see https://developer.github.com/v3/gitignore/#listing-available-templates + # + # @return [Array<String>] List of templates. + # + # @example Git all the gitignore templates + # @client.gitignore_templates + def gitignore_templates(options = {}) + get "gitignore/templates", options + end + + # Get a gitignore template. + # + # Use the raw {http://developer.github.com/v3/media/ media type} to get + # the raw contents. + # + # @param template_name [String] Name of the template. Template names are + # case sensitive, make sure to use a valid name from the + # .gitignore_templates list. + # + # @see https://developer.github.com/v3/gitignore/#get-a-single-template + # + # @return [Sawyer::Resource] Gitignore template + # + # @example Get the Ruby gitignore template + # @client.gitignore_template('Ruby') + def gitignore_template(template_name, options = {}) + get "gitignore/templates/#{template_name}", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/hooks.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/hooks.rb new file mode 100644 index 000000000000..5229ffd6dbc7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/hooks.rb @@ -0,0 +1,297 @@ +module Octokit + class Client + + # Methods for the Hooks API + module Hooks + + # List all Service Hooks supported by GitHub + # + # @return [Sawyer::Resource] A list of all hooks on GitHub + # @see https://developer.github.com/v3/repos/hooks/#services + # @example List all hooks + # Octokit.available_hooks + def available_hooks(options = {}) + get "hooks", options + end + + # List repo hooks + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of hashes representing hooks. + # @see https://developer.github.com/v3/repos/hooks/#list-hooks + # @example + # @client.hooks('octokit/octokit.rb') + def hooks(repo, options = {}) + paginate "#{Repository.path repo}/hooks", options + end + + # Get single hook + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param id [Integer] Id of the hook to get. + # @return [Sawyer::Resource] Hash representing hook. + # @see https://developer.github.com/v3/repos/hooks/#get-single-hook + # @example + # @client.hook('octokit/octokit.rb', 100000) + def hook(repo, id, options = {}) + get "#{Repository.path repo}/hooks/#{id}", options + end + + # Create a hook + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param name [String] The name of the service that is being called. See + # {https://api.github.com/hooks Hooks} for the possible names. + # @param config [Hash] A Hash containing key/value pairs to provide + # settings for this hook. These settings vary between the services and + # are defined in the {https://github.com/github/github-services github-services} repo. + # @option options [Array<String>] :events ('["push"]') Determines what + # events the hook is triggered for. + # @option options [Boolean] :active Determines whether the hook is + # actually triggered on pushes. + # @return [Sawyer::Resource] Hook info for the new hook + # @see https://api.github.com/hooks + # @see https://github.com/github/github-services + # @see https://developer.github.com/v3/repos/hooks/#create-a-hook + # @example + # @client.create_hook( + # 'octokit/octokit.rb', + # 'web', + # { + # :url => 'http://something.com/webhook', + # :content_type => 'json' + # }, + # { + # :events => ['push', 'pull_request'], + # :active => true + # } + # ) + def create_hook(repo, name, config, options = {}) + options = {:name => name, :config => config, :events => ["push"], :active => true}.merge(options) + post "#{Repository.path repo}/hooks", options + end + + # Edit a hook + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param id [Integer] Id of the hook being updated. + # @param name [String] The name of the service that is being called. See + # {https://api.github.com/hooks Hooks} for the possible names. + # @param config [Hash] A Hash containing key/value pairs to provide + # settings for this hook. These settings vary between the services and + # are defined in the {https://github.com/github/github-services github-services} repo. + # @option options [Array<String>] :events ('["push"]') Determines what + # events the hook is triggered for. + # @option options [Array<String>] :add_events Determines a list of events + # to be added to the list of events that the Hook triggers for. + # @option options [Array<String>] :remove_events Determines a list of events + # to be removed from the list of events that the Hook triggers for. + # @option options [Boolean] :active Determines whether the hook is + # actually triggered on pushes. + # @return [Sawyer::Resource] Hook info for the updated hook + # @see https://api.github.com/hooks + # @see https://github.com/github/github-services + # @see https://developer.github.com/v3/repos/hooks/#edit-a-hook + # @example + # @client.edit_hook( + # 'octokit/octokit.rb', + # 100000, + # 'web', + # { + # :url => 'http://something.com/webhook', + # :content_type => 'json' + # }, + # { + # :add_events => ['status'], + # :remove_events => ['pull_request'], + # :active => true + # } + # ) + def edit_hook(repo, id, name, config, options = {}) + options = {:name => name, :config => config}.merge(options) + patch "#{Repository.path repo}/hooks/#{id}", options + end + + # Delete hook + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param id [Integer] Id of the hook to remove. + # @return [Boolean] True if hook removed, false otherwise. + # @see https://developer.github.com/v3/repos/hooks/#delete-a-hook + # @example + # @client.remove_hook('octokit/octokit.rb', 1000000) + def remove_hook(repo, id, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/hooks/#{id}", options + end + + # Test hook + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param id [Integer] Id of the hook to test. + # @return [Boolean] Success + # @see https://developer.github.com/v3/repos/hooks/#test-a-push-hook + # @example + # @client.test_hook('octokit/octokit.rb', 1000000) + def test_hook(repo, id, options = {}) + boolean_from_response :post, "#{Repository.path repo}/hooks/#{id}/tests", options + end + + # Ping hook + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param id [Integer] Id of the hook to send a ping. + # @return [Boolean] Ping requested? + # @see https://developer.github.com/v3/repos/hooks/#ping-a-hook + # @example + # @client.ping_hook('octokit/octokit.rb', 1000000) + def ping_hook(repo, id, options={}) + boolean_from_response :post, "#{Repository.path repo}/hooks/#{id}/pings", options + end + + # List org hooks + # + # Requires client authenticated as admin for the org. + # + # @param org [String, Integer] Organization GitHub login or id. + # @return [Array<Sawyer::Resource>] Array of hashes representing hooks. + # @see https://developer.github.com/v3/orgs/hooks/#list-hooks + # @example + # @client.org_hooks('octokit') + def org_hooks(org, options = {}) + paginate "#{Organization.path org}/hooks", options + end + alias :list_org_hooks :org_hooks + + # Get an org hook + # + # Requires client authenticated as admin for the org. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param id [Integer] Id of the hook to get. + # @return [Sawyer::Resource] Hash representing hook. + # @see https://developer.github.com/v3/orgs/hooks/#get-single-hook + # @example + # @client.org_hook('octokit', 123) + def org_hook(org, id, options = {}) + get "#{Organization.path org}/hooks/#{id}", options + end + + # Create an org hook + # + # Requires client authenticated as admin for the org. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param config [Hash] A Hash containing key/value pairs to provide + # settings for this hook. + # @option options [Array<String>] :events ('["push"]') Determines what + # events the hook is triggered for. + # @option options [Boolean] :active Determines whether the hook is + # actually triggered on pushes. + # @return [Sawyer::Resource] Hook info for the new hook + # @see https://api.github.com/hooks + # @see https://developer.github.com/v3/orgs/hooks/#create-a-hook + # @example + # @client.create_org_hook( + # 'octokit', + # { + # :url => 'http://something.com/webhook', + # :content_type => 'json' + # }, + # { + # :events => ['push', 'pull_request'], + # :active => true + # } + # ) + def create_org_hook(org, config, options = {}) + options = { :name => "web", :config => config }.merge(options) + post "#{Organization.path org}/hooks", options + end + + # Update an org hook + # + # Requires client authenticated as admin for the org. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param id [Integer] Id of the hook to update. + # @param config [Hash] A Hash containing key/value pairs to provide + # settings for this hook. + # @option options [Array<String>] :events ('["push"]') Determines what + # events the hook is triggered for. + # @option options [Boolean] :active Determines whether the hook is + # actually triggered on pushes. + # @return [Sawyer::Resource] Hook info for the new hook + # @see https://api.github.com/hooks + # @see https://developer.github.com/v3/orgs/hooks/#edit-a-hook + # @example + # @client.edit_org_hook( + # 'octokit', + # 123, + # { + # :url => 'http://something.com/webhook', + # :content_type => 'json' + # }, + # { + # :events => ['push', 'pull_request'], + # :active => true + # } + # ) + def edit_org_hook(org, id, config, options = {}) + options = { :config => config }.merge(options) + patch "#{Organization.path org}/hooks/#{id}", options + end + alias :update_org_hook :edit_org_hook + + # Ping org hook + # + # Requires client authenticated as admin for the org. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param id [Integer] Id of the hook to update. + # @return [Boolean] Success + # @see https://developer.github.com/v3/orgs/hooks/#ping-a-hook + # @example + # @client.ping_org_hook('octokit', 1000000) + def ping_org_hook(org, id, options = {}) + boolean_from_response :post, "#{Organization.path org}/hooks/#{id}/pings", options + end + + # Remove org hook + # + # Requires client authenticated as admin for the org. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param id [Integer] Id of the hook to update. + # @return [Boolean] True if hook removed, false otherwise. + # @see https://developer.github.com/v3/orgs/hooks/#delete-a-hook + # @example + # @client.remove_org_hook('octokit', 1000000) + def remove_org_hook(org, id, options = {}) + boolean_from_response :delete, "#{Organization.path org}/hooks/#{id}", options + end + + # Parse payload string + # + # @param payload_string [String] The payload + # @return [Sawyer::Resource] The payload object + # @see https://developer.github.com/v3/activity/events/types/ + def parse_payload(payload_string) + payload_hash = agent.class.decode payload_string + Sawyer::Resource.new agent, payload_hash + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/issues.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/issues.rb new file mode 100644 index 000000000000..bdf346bdab9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/issues.rb @@ -0,0 +1,368 @@ +module Octokit + class Client + + # Methods for the Issues API + # + # @see https://developer.github.com/v3/issues/ + module Issues + + # List issues for the authenticated user or repository + # + # @param repository [Integer, String, Repository, Hash] A GitHub repository. + # @param options [Sawyer::Resource] A customizable set of options. + # @option options [Integer] :milestone Milestone number. + # @option options [String] :state (open) State: <tt>open</tt>, <tt>closed</tt>, or <tt>all</tt>. + # @option options [String] :assignee User login. + # @option options [String] :creator User login. + # @option options [String] :mentioned User login. + # @option options [String] :labels List of comma separated Label names. Example: <tt>bug,ui,@high</tt>. + # @option options [String] :sort (created) Sort: <tt>created</tt>, <tt>updated</tt>, or <tt>comments</tt>. + # @option options [String] :direction (desc) Direction: <tt>asc</tt> or <tt>desc</tt>. + # @option options [Integer] :page (1) Page number. + # @return [Array<Sawyer::Resource>] A list of issues for a repository. + # @see https://developer.github.com/v3/issues/#list-issues-for-a-repository + # @see https://developer.github.com/v3/issues/#list-issues + # @example List issues for a repository + # Octokit.list_issues("sferik/rails_admin") + # @example List issues for the authenticated user across repositories + # @client = Octokit::Client.new(:login => 'foo', :password => 'bar') + # @client.list_issues + def list_issues(repository = nil, options = {}) + path = repository ? "#{Repository.new(repository).path}/issues" : "issues" + paginate path, options + end + alias :issues :list_issues + + # List all issues across owned and member repositories for the authenticated user + # + # @param options [Sawyer::Resource] A customizable set of options. + # @option options [String] :filter (assigned) State: <tt>assigned</tt>, <tt>created</tt>, <tt>mentioned</tt>, <tt>subscribed</tt> or <tt>closed</tt>. + # @option options [String] :state (open) State: <tt>open</tt>, <tt>closed</tt>, or <tt>all</tt>. + # @option options [Array<String>] :labels List of Label names. Example: <tt>['bug', 'ui', '@high']</tt>. + # @option options [String] :sort (created) Sort: <tt>created</tt>, <tt>updated</tt>, or <tt>comments</tt>. + # @option options [String] :direction (desc) Direction: <tt>asc</tt> or <tt>desc</tt>. + # @option options [Integer] :page (1) Page number. + # @option options [String] :since Timestamp in ISO 8601 + # format: YYYY-MM-DDTHH:MM:SSZ + # @return [Array<Sawyer::Resource>] A list of issues for a repository. + # @see https://developer.github.com/v3/issues/#list-issues + # @example List issues for the authenticated user across owned and member repositories + # @client = Octokit::Client.new(:login => 'foo', :password => 'bar') + # @client.user_issues + def user_issues(options = {}) + paginate 'user/issues', options + end + + # List all issues for a given organization for the authenticated user + # + # @param org [String, Integer] Organization GitHub login or id. + # @param options [Sawyer::Resource] A customizable set of options. + # @option options [String] :filter (assigned) State: <tt>assigned</tt>, <tt>created</tt>, <tt>mentioned</tt>, <tt>subscribed</tt> or <tt>closed</tt>. + # @option options [String] :state (open) State: <tt>open</tt>, <tt>closed</tt>, or <tt>all</tt>. + # @option options [Array<String>] :labels List of Label names. Example: <tt>['bug', 'ui', '@high']</tt>. + # @option options [String] :sort (created) Sort: <tt>created</tt>, <tt>updated</tt>, or <tt>comments</tt>. + # @option options [String] :direction (desc) Direction: <tt>asc</tt> or <tt>desc</tt>. + # @option options [Integer] :page (1) Page number. + # @option options [String] :since Timestamp in ISO 8601 + # format: YYYY-MM-DDTHH:MM:SSZ + # @return [Array<Sawyer::Resource>] A list of issues. + # @see https://developer.github.com/v3/issues/#list-issues + # @example List all issues for a given organization for the authenticated user + # @client = Octokit::Client.new(:login => 'foo', :password => 'bar') + # @client.org_issues("octokit") + def org_issues(org, options = {}) + paginate "#{Organization.path org}/issues", options + end + + # Create an issue for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param title [String] A descriptive title + # @param body [String] An optional concise description + # @param options [Hash] A customizable set of options. + # @option options [String] :assignee User login. + # @option options [Array<String>] :assignees User login. + # @option options [Integer] :milestone Milestone number. + # @option options [String] :labels List of comma separated Label names. Example: <tt>bug,ui,@high</tt>. + # @return [Sawyer::Resource] Your newly created issue + # @see https://developer.github.com/v3/issues/#create-an-issue + # @example Create a new Issues for a repository + # Octokit.create_issue("sferik/rails_admin", 'Updated Docs', 'Added some extra links') + def create_issue(repo, title, body = nil, options = {}) + options[:labels] = case options[:labels] + when String + options[:labels].split(",").map(&:strip) + when Array + options[:labels] + else + [] + end + parameters = { :title => title } + parameters[:body] = body unless body.nil? + post "#{Repository.path repo}/issues", options.merge(parameters) + end + alias :open_issue :create_issue + + # Get a single issue from a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @return [Sawyer::Resource] The issue you requested, if it exists + # @see https://developer.github.com/v3/issues/#get-a-single-issue + # @example Get issue #25 from octokit/octokit.rb + # Octokit.issue("octokit/octokit.rb", "25") + def issue(repo, number, options = {}) + get "#{Repository.path repo}/issues/#{number}", options + end + + # Close an issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @param options [Hash] A customizable set of options. + # @option options [String] :assignee User login. + # @option options [Array<String>] :assignees User login. + # @option options [Integer] :milestone Milestone number. + # @option options [Array<String>] :labels List of Label names. Example: <tt>['bug', 'ui', '@high']</tt>. + # @return [Sawyer::Resource] The updated Issue + # @see https://developer.github.com/v3/issues/#edit-an-issue + # @example Close Issue #25 from octokit/octokit.rb + # Octokit.close_issue("octokit/octokit.rb", "25") + def close_issue(repo, number, options = {}) + patch "#{Repository.path repo}/issues/#{number}", options.merge({:state => "closed"}) + end + + # Reopen an issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @param options [Hash] A customizable set of options. + # @option options [String] :assignee User login. + # @option options [Array<String>] :assignees User login. + # @option options [Integer] :milestone Milestone number. + # @option options [Array<String>] :labels List of Label names. Example: <tt>['bug', 'ui', '@high']</tt>. + # @return [Sawyer::Resource] The updated Issue + # @see https://developer.github.com/v3/issues/#edit-an-issue + # @example Reopen Issue #25 from octokit/octokit.rb + # Octokit.reopen_issue("octokit/octokit.rb", "25") + def reopen_issue(repo, number, options = {}) + patch "#{Repository.path repo}/issues/#{number}", options.merge({:state => "open"}) + end + + # Lock an issue's conversation, limiting it to collaborators + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @return [Boolean] Success + # @see https://developer.github.com/v3/issues/#lock-an-issue + # @example Lock Issue #25 from octokit/octokit.rb + # Octokit.lock_issue("octokit/octokit.rb", "25") + def lock_issue(repo, number, options = {}) + boolean_from_response :put, "#{Repository.path repo}/issues/#{number}/lock", options + end + + # Unlock an issue's conversation, opening it to all viewers + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @return [Boolean] Success + # @see https://developer.github.com/v3/issues/#unlock-an-issue + # @example Unlock Issue #25 from octokit/octokit.rb + # Octokit.close_issue("octokit/octokit.rb", "25") + def unlock_issue(repo, number, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/issues/#{number}/lock", options + end + + # Update an issue + # + # @overload update_issue(repo, number, title, body, options) + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @param title [String] Updated title for the issue + # @param body [String] Updated body of the issue + # @param options [Hash] A customizable set of options. + # @option options [String] :assignee User login. + # @option options [Array<String>] :assignees User login. + # @option options [Integer] :milestone Milestone number. + # @option options [String] :labels List of comma separated Label names. Example: <tt>bug,ui,@high</tt>. + # @option options [String] :state State of the issue. <tt>open</tt> or <tt>closed</tt> + # + # @overload update_issue(repo, number, options) + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @param options [Hash] A customizable set of options. + # @option options [String] :title Updated title for the issue + # @option options [String] :body Updated body of the issue + # @option options [String] :assignee User login. + # @option options [Array<String>] :assignees User login. + # @option options [Integer] :milestone Milestone number. + # @option options [Array<String>] :labels List of Label names. Example: <tt>['bug', 'ui', '@high']</tt>. + # @option options [String] :state State of the issue. <tt>open</tt> or <tt>closed</tt> + # @return [Sawyer::Resource] The updated Issue + # @see https://developer.github.com/v3/issues/#edit-an-issue + # + # @example Change the title of Issue #25 + # Octokit.update_issue("octokit/octokit.rb", "25", "A new title", "the same body") + # + # @example Change only the assignee of Issue #25 + # Octokit.update_issue("octokit/octokit.rb", "25", :assignee => "pengwynn") + def update_issue(repo, number, *args) + arguments = Arguments.new(args) + opts = arguments.options + + if arguments.length > 0 + opts[:title] = arguments.shift + opts[:body] = arguments.shift + end + + patch "#{Repository.path repo}/issues/#{number}", opts + end + + # Get all comments attached to issues for the repository + # + # By default, Issue Comments are ordered by ascending ID. + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param options [Hash] Optional parameters + # @option options [String] :sort created or updated + # @option options [String] :direction asc or desc. Ignored without sort + # parameter. + # @option options [String] :since Timestamp in ISO 8601 + # format: YYYY-MM-DDTHH:MM:SSZ + # + # @return [Array<Sawyer::Resource>] List of issues comments. + # + # @see https://developer.github.com/v3/issues/comments/#list-comments-in-a-repository + # + # @example Get the comments for issues in the octokit repository + # @client.issues_comments("octokit/octokit.rb") + # + # @example Get issues comments, sort by updated descending since a time + # @client.issues_comments("octokit/octokit.rb", { + # :sort => 'desc', + # :direction => 'asc', + # :since => '2010-05-04T23:45:02Z' + # }) + def issues_comments(repo, options = {}) + paginate "#{Repository.path repo}/issues/comments", options + end + + # Get all comments attached to an issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @return [Array<Sawyer::Resource>] Array of comments that belong to an issue + # @see https://developer.github.com/v3/issues/comments/#list-comments-on-an-issue + # @example Get comments for issue #25 from octokit/octokit.rb + # Octokit.issue_comments("octokit/octokit.rb", "25") + def issue_comments(repo, number, options = {}) + paginate "#{Repository.path repo}/issues/#{number}/comments", options + end + + # Get a single comment attached to an issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the comment + # @return [Sawyer::Resource] The specific comment in question + # @see https://developer.github.com/v3/issues/comments/#get-a-single-comment + # @example Get comment #1194549 from an issue on octokit/octokit.rb + # Octokit.issue_comment("octokit/octokit.rb", 1194549) + def issue_comment(repo, number, options = {}) + paginate "#{Repository.path repo}/issues/comments/#{number}", options + end + + # Add a comment to an issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Issue number + # @param comment [String] Comment to be added + # @return [Sawyer::Resource] Comment + # @see https://developer.github.com/v3/issues/comments/#create-a-comment + # @example Add the comment "Almost to v1" to Issue #23 on octokit/octokit.rb + # Octokit.add_comment("octokit/octokit.rb", 23, "Almost to v1") + def add_comment(repo, number, comment, options = {}) + post "#{Repository.path repo}/issues/#{number}/comments", options.merge({:body => comment}) + end + + # Update a single comment on an issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Comment number + # @param comment [String] Body of the comment which will replace the existing body. + # @return [Sawyer::Resource] Comment + # @see https://developer.github.com/v3/issues/comments/#edit-a-comment + # @example Update the comment #1194549 with body "I've started this on my 25-issue-comments-v3 fork" on an issue on octokit/octokit.rb + # Octokit.update_comment("octokit/octokit.rb", 1194549, "Almost to v1, added this on my fork") + def update_comment(repo, number, comment, options = {}) + patch "#{Repository.path repo}/issues/comments/#{number}", options.merge({:body => comment}) + end + + # Delete a single comment + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Comment number + # @return [Boolean] Success + # @see https://developer.github.com/v3/issues/comments/#delete-a-comment + # @example Delete the comment #1194549 on an issue on octokit/octokit.rb + # Octokit.delete_comment("octokit/octokit.rb", 1194549) + def delete_comment(repo, number, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/issues/comments/#{number}", options + end + + # Get the timeline for an issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the comment + # @return [Sawyer::Resource] The timeline for this issue + # @see https://developer.github.com/v3/issues/timeline/ + # @example Get timeline for issue #1435 on octokit/octokit.rb + # Octokit.issue_timeline("octokit/octokit.rb", 1435) + def issue_timeline(repo, number, options = {}) + options = ensure_api_media_type(:issue_timelines, options) + paginate "#{Repository.path repo}/issues/#{number}/timeline", options + end + + # Lists the available assignees for issues in a repository. + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] List of GitHub users. + # @see https://developer.github.com/v3/issues/assignees/#list-assignees + # @example Get available assignees on repository octokit/octokit.rb + # Octokit.list_assignees("octokit/octokit.rb") + def list_assignees(repo, options = {}) + paginate "#{Repository.path repo}/assignees", options + end + + # Add assignees to an issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Issue number + # @param assignees [Array<String>] Assignees to be added + # @return [Sawyer::Resource] Issue + # @see https://developer.github.com/v3/issues/assignees/#add-assignees-to-an-issue + # @example Add assignees "pengwynn" and "joeyw" to Issue #23 on octokit/octokit.rb + # Octokit.add_assignees("octokit/octokit.rb", 23, ["pengwynn", "joeyw"]) + def add_assignees(repo, number, assignees, options = {}) + post "#{Repository.path repo}/issues/#{number}/assignees", options.merge({:assignees => assignees}) + end + + # Remove assignees from an issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Issue number + # @param assignees [Array<String>] Assignees to be removed + # @param options [Hash] Header params for request + # @return [Sawyer::Resource] Issue + # @see https://developer.github.com/v3/issues/assignees/#remove-assignees-from-an-issue + # @example Remove assignees "pengwynn" and "joeyw" from Issue #23 on octokit/octokit.rb + # Octokit.remove_assignees("octokit/octokit.rb", 23, ["pengwynn", "joeyw"]) + # + # @example Remove assignees "pengwynn" from Issue #23 on octokit/octokit.rb + # Octokit.remove_assignees("octokit/octokit.rb", 23, ["pengwynn"], + # :accept => "application/vnd.github.v3+json") + def remove_assignees(repo, number, assignees, options = {}) + delete "#{Repository.path repo}/issues/#{number}/assignees", options.merge({:assignees => assignees}) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/labels.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/labels.rb new file mode 100644 index 000000000000..83134f1a9b86 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/labels.rb @@ -0,0 +1,156 @@ +require 'cgi' + +module Octokit + class Client + + # Methods for the Issue Labels API + # + # @see https://developer.github.com/v3/issues/labels/ + module Labels + + # List available labels for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] A list of the labels across the repository + # @see https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository + # @example List labels for octokit/octokit.rb + # Octokit.labels("octokit/octokit.rb") + def labels(repo, options = {}) + paginate "#{Repository.path repo}/labels", options + end + + # Get single label for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param name [String] Name of the label + # @return [Sawyer::Resource] A single label from the repository + # @see https://developer.github.com/v3/issues/labels/#get-a-single-label + # @example Get the "V3 Addition" label from octokit/octokit.rb + # Octokit.label("octokit/octokit.rb", "V3 Addition") + def label(repo, name, options = {}) + get "#{Repository.path repo}/labels/#{name}", options + end + + # Add a label to a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param label [String] A new label + # @param color [String] A color, in hex, without the leading # + # @return [Sawyer::Resource] The new label + # @see https://developer.github.com/v3/issues/labels/#create-a-label + # @example Add a new label "Version 1.0" with color "#cccccc" + # Octokit.add_label("octokit/octokit.rb", "Version 1.0", "cccccc") + def add_label(repo, label, color="ffffff", options = {}) + post "#{Repository.path repo}/labels", options.merge({:name => label, :color => color}) + end + + # Update a label + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param label [String] The name of the label which will be updated + # @param options [Hash] A customizable set of options. + # @option options [String] :name An updated label name + # @option options [String] :color An updated color value, in hex, without leading # + # @return [Sawyer::Resource] The updated label + # @see https://developer.github.com/v3/issues/labels/#update-a-label + # @example Update the label "Version 1.0" with new color "#cceeaa" + # Octokit.update_label("octokit/octokit.rb", "Version 1.0", {:color => "cceeaa"}) + def update_label(repo, label, options = {}) + patch "#{Repository.path repo}/labels/#{label}", options + end + + # Delete a label from a repository. + # + # This deletes the label from the repository, and removes it from all issues. + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param label [String] String name of the label + # @return [Boolean] Success + # @see https://developer.github.com/v3/issues/labels/#delete-a-label + # @example Delete the label "Version 1.0" from the repository. + # Octokit.delete_label!("octokit/octokit.rb", "Version 1.0") + def delete_label!(repo, label, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/labels/#{label}", options + end + + # Remove a label from an Issue + # + # This removes the label from the Issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @param label [String] String name of the label + # @return [Array<Sawyer::Resource>] A list of the labels currently on the issue + # @see https://developer.github.com/v3/issues/labels/#remove-a-label-from-an-issue + # @example Remove the label "Version 1.0" from the repository. + # Octokit.remove_label("octokit/octokit.rb", 23, "Version 1.0") + def remove_label(repo, number, label, options = {}) + delete "#{Repository.path repo}/issues/#{number}/labels/#{label}", options + end + + # Remove all label from an Issue + # + # This removes the label from the Issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @return [Boolean] Success of operation + # @see https://developer.github.com/v3/issues/labels/#remove-all-labels-from-an-issue + # @example Remove all labels from Issue #23 + # Octokit.remove_all_labels("octokit/octokit.rb", 23) + def remove_all_labels(repo, number, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/issues/#{number}/labels", options + end + + # List labels for a given issue + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the issue + # @return [Array<Sawyer::Resource>] A list of the labels currently on the issue + # @see https://developer.github.com/v3/issues/labels/#list-labels-on-an-issue + # @example List labels for octokit/octokit.rb, issue # 1 + # Octokit.labels_for_issue("octokit/octokit.rb", 1) + def labels_for_issue(repo, number, options = {}) + paginate "#{Repository.path repo}/issues/#{number}/labels", options + end + + # Add label(s) to an Issue + # + # @param repo [Integer, String, Repository, Hash] A Github repository + # @param number [Integer] Number ID of the issue + # @param labels [Array] An array of labels to apply to this Issue + # @return [Array<Sawyer::Resource>] A list of the labels currently on the issue + # @see https://developer.github.com/v3/issues/labels/#add-labels-to-an-issue + # @example Add two labels for octokit/octokit.rb + # Octokit.add_labels_to_an_issue("octokit/octokit.rb", 10, ['V3 Transition', 'Improvement']) + def add_labels_to_an_issue(repo, number, labels) + post "#{Repository.path repo}/issues/#{number}/labels", labels + end + + # Replace all labels on an Issue + # + # @param repo [Integer, String, Repository, Hash] A Github repository + # @param number [Integer] Number ID of the issue + # @param labels [Array] An array of labels to use as replacement + # @return [Array<Sawyer::Resource>] A list of the labels currently on the issue + # @see https://developer.github.com/v3/issues/labels/#replace-all-labels-for-an-issue + # @example Replace labels for octokit/octokit.rb Issue #10 + # Octokit.replace_all_labels("octokit/octokit.rb", 10, ['V3 Transition', 'Improvement']) + def replace_all_labels(repo, number, labels, options = {}) + put "#{Repository.path repo}/issues/#{number}/labels", labels + end + + # Get labels for every issue in a milestone + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param number [Integer] Number ID of the milestone + # @return [Array<Sawyer::Resource>] A list of the labels across the milestone + # @see http://developer.github.com/v3/issues/labels/#get-labels-for-every-issue-in-a-milestone + # @example List all labels for milestone #2 on octokit/octokit.rb + # Octokit.labels_for_milestone("octokit/octokit.rb", 2) + def labels_for_milestone(repo, number, options = {}) + paginate "#{Repository.path repo}/milestones/#{number}/labels", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/legacy_search.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/legacy_search.rb new file mode 100644 index 000000000000..947251659d43 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/legacy_search.rb @@ -0,0 +1,42 @@ +module Octokit + class Client + + # Methods for the Legacy Search API + # + # @see https://developer.github.com/v3/search/ + module LegacySearch + + # Legacy repository search + # + # @see https://developer.github.com/v3/search/#search-repositories + # @param q [String] Search keyword + # @return [Array<Sawyer::Resource>] List of repositories found + def legacy_search_repositories(q, options = {}) + get("legacy/repos/search/#{q}", options)['repositories'] + end + + # Legacy search issues within a repository + # + # @param repo [String, Repository, Hash] A GitHub repository + # @param search_term [String] The term to search for + # @param state [String] :state (open) <tt>open</tt> or <tt>closed</tt>. + # @return [Array<Sawyer::Resource>] A list of issues matching the search term and state + # @example Search for 'test' in the open issues for sferik/rails_admin + # Octokit.search_issues("sferik/rails_admin", 'test', 'open') + def legacy_search_issues(repo, search_term, state='open', options = {}) + get("legacy/issues/search/#{Repository.new(repo)}/#{state}/#{search_term}", options)['issues'] + end + + # Search for user. + # + # @param search [String] User to search for. + # @return [Array<Sawyer::Resource>] Array of hashes representing users. + # @see https://developer.github.com/v3/search/#search-users + # @example + # Octokit.search_users('pengwynn') + def legacy_search_users(search, options = {}) + get("legacy/user/search/#{search}", options)['users'] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/licenses.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/licenses.rb new file mode 100644 index 000000000000..a541609c832f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/licenses.rb @@ -0,0 +1,45 @@ +module Octokit + class Client + + # Methods for licenses API + # + module Licenses + + # List all licenses + # + # @see https://developer.github.com/v3/licenses/#list-all-licenses + # @return [Array<Sawyer::Resource>] A list of licenses + # @example + # Octokit.licenses + def licenses(options = {}) + options = ensure_api_media_type(:licenses, options) + paginate "licenses", options + end + + # List an individual license + # + # @see https://developer.github.com/v3/licenses/#get-an-individual-license + # @param license_name [String] The license name + # @return <Sawyer::Resource> An individual license + # @example + # Octokit.license 'mit' + def license(license_name, options = {}) + options = ensure_api_media_type(:licenses, options) + get "licenses/#{license_name}", options + end + + # Returns the contents of the repository’s license file, if one is detected. + # + # @see https://developer.github.com/v3/licenses/#get-the-contents-of-a-repositorys-license + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @option options [String] :ref name of the Commit/Branch/Tag. Defaults to 'master'. + # @return [Sawyer::Resource] The detail of the license file + # @example + # Octokit.repository_license_contents 'benbalter/licensee' + def repository_license_contents(repo, options = {}) + options = ensure_api_media_type(:licenses, options) + get "#{Repository.path repo}/license", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/markdown.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/markdown.rb new file mode 100644 index 000000000000..06b16287921d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/markdown.rb @@ -0,0 +1,27 @@ +module Octokit + class Client + + # Methods for the Markdown API + # + # @see https://developer.github.com/v3/markdown/ + module Markdown + + # Render an arbitrary Markdown document + # + # @param text [String] Markdown source + # @option options [String] (optional) :mode (`markdown` or `gfm`) + # @option options [String] (optional) :context Repo context + # @return [String] HTML renderization + # @see https://developer.github.com/v3/markdown/#render-an-arbitrary-markdown-document + # @example Render some GFM + # Octokit.markdown('Fixed in #111', :mode => "gfm", :context => "octokit/octokit.rb") + def markdown(text, options = {}) + options[:text] = text + options[:repo] = Repository.new(options[:repo]) if options[:repo] + options[:accept] = 'application/vnd.github.raw' + + post "markdown", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/marketplace.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/marketplace.rb new file mode 100644 index 000000000000..bf8ed2bff459 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/marketplace.rb @@ -0,0 +1,56 @@ +module Octokit + class Client + + # Methods for the Marketplace Listing API + # + # @see https://developer.github.com/v3/apps/marketplace/ + module Marketplace + + # List all plans for an app's marketplace listing + # + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/marketplace/#list-all-plans-for-your-marketplace-listing + # + # @return [Array<Sawyer::Resource>] A list of plans + def list_plans(options = {}) + paginate "/marketplace_listing/plans", options + end + + # List all GitHub accounts on a specific plan + # + # @param plan_id [Integer] The id of the GitHub plan + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/marketplace/#list-all-github-accounts-user-or-organization-on-a-specific-plan + # + # @return [Array<Sawyer::Resource>] A list of accounts + def list_accounts_for_plan(plan_id, options = {}) + paginate "/marketplace_listing/plans/#{plan_id}/accounts", options + end + + # Get the plan associated with a given GitHub account + # + # @param account_id [Integer] The id of the GitHub account + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/marketplace/#check-if-a-github-account-is-associated-with-any-marketplace-listing + # + # @return <Sawyer::Resource> Account with plan details, or nil + def plan_for_account(account_id, options = {}) + get "/marketplace_listing/accounts/#{account_id}", options + end + + # Get user's Marketplace purchases + # + # @param options [Hash] A customizable set of options + # + # @see https://developer.github.com/v3/apps/marketplace/#get-a-users-marketplace-purchases + # + # @return [Array<Sawyer::Resource>] A list of Marketplace purchases + def marketplace_purchases(options = {}) + get "/user/marketplace_purchases", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/meta.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/meta.rb new file mode 100644 index 000000000000..1dc56cf20abb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/meta.rb @@ -0,0 +1,21 @@ +module Octokit + class Client + + # Methods for the Meta API + # + # @see https://developer.github.com/v3/meta/ + module Meta + + # Get meta information about GitHub.com, the service. + # @see https://developer.github.com/v3/meta/#meta + # @return [Sawyer::Resource] Hash with meta information. + # @example Get GitHub meta information + # @client.github_meta + def meta(options = {}) + get "meta", options + end + alias :github_meta :meta + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/milestones.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/milestones.rb new file mode 100644 index 000000000000..340790c11110 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/milestones.rb @@ -0,0 +1,87 @@ +module Octokit + class Client + + # Methods for the Issues Milestones API + # + # @see https://developer.github.com/v3/issues/milestones/ + module Milestones + + # List milestones for a repository + # + # @param repository [Integer, String, Repository, Hash] A GitHub repository + # @param options [Hash] A customizable set of options. + # @option options [Integer] :milestone Milestone number. + # @option options [String] :state (open) State: <tt>open</tt>, <tt>closed</tt>, or <tt>all</tt>. + # @option options [String] :sort (created) Sort: <tt>created</tt>, <tt>updated</tt>, or <tt>comments</tt>. + # @option options [String] :direction (desc) Direction: <tt>asc</tt> or <tt>desc</tt>. + # @return [Array<Sawyer::Resource>] A list of milestones for a repository. + # @see https://developer.github.com/v3/issues/milestones/#list-milestones-for-a-repository + # @example List milestones for a repository + # Octokit.list_milestones("octokit/octokit.rb") + def list_milestones(repository, options = {}) + paginate "#{Repository.path repository}/milestones", options + end + alias :milestones :list_milestones + + # Get a single milestone for a repository + # + # @param repository [Integer, String, Repository, Hash] A GitHub repository + # @param options [Hash] A customizable set of options. + # @option options [Integer] :milestone Milestone number. + # @return [Sawyer::Resource] A single milestone from a repository. + # @see https://developer.github.com/v3/issues/milestones/#get-a-single-milestone + # @example Get a single milestone for a repository + # Octokit.milestone("octokit/octokit.rb", 1) + def milestone(repository, number, options = {}) + get "#{Repository.path repository}/milestones/#{number}", options + end + + # Create a milestone for a repository + # + # @param repository [Integer, String, Repository, Hash] A GitHub repository + # @param title [String] A unique title. + # @param options [Hash] A customizable set of options. + # @option options [String] :state (open) State: <tt>open</tt> or <tt>closed</tt>. + # @option options [String] :description A meaningful description + # @option options [Time] :due_on Set if the milestone has a due date + # @return [Sawyer::Resource] A single milestone object + # @see https://developer.github.com/v3/issues/milestones/#create-a-milestone + # @example Create a milestone for a repository + # Octokit.create_milestone("octokit/octokit.rb", "0.7.0", {:description => 'Add support for v3 of Github API'}) + def create_milestone(repository, title, options = {}) + post "#{Repository.path repository}/milestones", options.merge({:title => title}) + end + + # Update a milestone for a repository + # + # @param repository [Integer, String, Repository, Hash] A GitHub repository + # @param number [String, Integer] ID of the milestone + # @param options [Hash] A customizable set of options. + # @option options [String] :title A unique title. + # @option options [String] :state (open) State: <tt>open</tt> or <tt>closed</tt>. + # @option options [String] :description A meaningful description + # @option options [Time] :due_on Set if the milestone has a due date + # @return [Sawyer::Resource] A single milestone object + # @see https://developer.github.com/v3/issues/milestones/#update-a-milestone + # @example Update a milestone for a repository + # Octokit.update_milestone("octokit/octokit.rb", 1, {:description => 'Add support for v3 of Github API'}) + def update_milestone(repository, number, options = {}) + patch "#{Repository.path repository}/milestones/#{number}", options + end + alias :edit_milestone :update_milestone + + # Delete a single milestone for a repository + # + # @param repository [Integer, String, Repository, Hash] A GitHub repository + # @param options [Hash] A customizable set of options. + # @option options [Integer] :milestone Milestone number. + # @return [Boolean] Success + # @see https://developer.github.com/v3/issues/milestones/#delete-a-milestone + # @example Delete a single milestone from a repository + # Octokit.delete_milestone("octokit/octokit.rb", 1) + def delete_milestone(repository, number, options = {}) + boolean_from_response :delete, "#{Repository.path repository}/milestones/#{number}", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/notifications.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/notifications.rb new file mode 100644 index 000000000000..4b42ef579dae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/notifications.rb @@ -0,0 +1,167 @@ +module Octokit + class Client + + # Methods for the Notifications API + # + # @see https://developer.github.com/v3/activity/notifications/ + module Notifications + + # List your notifications + # + # @param options [Hash] Optional parameters + # @option options [Boolean] :all 'true' to show notifications marked as + # read. + # @option options [Boolean] :participating 'true' to show only + # notifications in which the user is directly participating or + # mentioned. + # @option options [String] :since Time filters out any notifications + # updated before the given time. The time should be passed in as UTC in + # the ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ. Ex. '2012-10-09T23:39:01Z' + # @return [Array<Sawyer::Resource>] Array of notifications. + # @see https://developer.github.com/v3/activity/notifications/#list-your-notifications + # @example Get users notifications + # @client.notifications + # @example Get all notifications since a certain time. + # @client.notifications({all: true, since: '2012-10-09T23:39:01Z'}) + def notifications(options = {}) + paginate "notifications", options + end + + # List your notifications in a repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param options [Hash] Optional parameters + # @option options [Boolean] :all 'true' to show notifications marked as + # read. + # @option options [Boolean] :participating 'true' to show only + # notifications in which the user is directly participating or + # mentioned. + # @option options [String] :since Time filters out any notifications + # updated before the given time. The time should be passed in as UTC in + # the ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ. Ex. '2012-10-09T23:39:01Z' + # @return [Array<Sawyer::Resource>] Array of notifications. + # @see https://developer.github.com/v3/activity/notifications/#list-your-notifications-in-a-repository + # @example Get your notifications for octokit/octokit.rb + # @client.repository_notifications('octokit/octokit.rb') + # @example Get your notifications for octokit/octokit.rb since a time. + # @client.repository_notifications({since: '2012-10-09T23:39:01Z'}) + def repository_notifications(repo, options = {}) + paginate "#{Repository.path repo}/notifications", options + end + alias :repo_notifications :repository_notifications + + # Mark notifications as read + # + # @param options [Hash] Optional parameters + # @option options [Boolean] :unread Changes the unread status of the + # threads. + # @option options [Boolean] :read Inverse of 'unread'. + # @option options [String] :last_read_at ('Now') Describes the last point + # that notifications were checked. Anything updated since this time + # will not be updated. The time should be passed in as UTC in the + # ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ. Ex. '2012-10-09T23:39:01Z' + # @return [Boolean] True if marked as read, false otherwise + # @see https://developer.github.com/v3/activity/notifications/#mark-as-read + # + # @example + # @client.mark_notifications_as_read + def mark_notifications_as_read(options = {}) + request :put, "notifications", options + + last_response.status == 205 + end + + # Mark notifications from a specific repository as read + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param options [Hash] Optional parameters + # @option options [Boolean] :unread Changes the unread status of the + # threads. + # @option options [Boolean] :read Inverse of 'unread'. + # @option options [String] :last_read_at ('Now') Describes the last point + # that notifications were checked. Anything updated since this time + # will not be updated. The time should be passed in as UTC in the + # ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ. Ex. '2012-10-09T23:39:01Z' + # @return [Boolean] True if marked as read, false otherwise + # @see https://developer.github.com/v3/activity/notifications/#mark-notifications-as-read-in-a-repository + # @example + # @client.mark_notifications_as_read("octokit/octokit.rb") + def mark_repository_notifications_as_read(repo, options = {}) + request :put, "#{Repository.path repo}/notifications", options + + last_response.status == 205 + end + alias :mark_repo_notifications_as_read :mark_repository_notifications_as_read + + # List notifications for a specific thread + # + # @param thread_id [Integer] Id of the thread. + # @return [Array<Sawyer::Resource>] Array of notifications. + # @see https://developer.github.com/v3/activity/notifications/#view-a-single-thread + # + # @example + # @client.notification_thread(1000) + def thread_notifications(thread_id, options = {}) + get "notifications/threads/#{thread_id}", options + end + + # Mark thread as read + # + # @param thread_id [Integer] Id of the thread to update. + # @return [Boolean] True if updated, false otherwise. + # @see https://developer.github.com/v3/activity/notifications/#mark-a-thread-as-read + # @example + # @client.mark_thread_as_read(1, :read => false) + def mark_thread_as_read(thread_id, options = {}) + request :patch, "notifications/threads/#{thread_id}", options + + last_response.status == 205 + end + + # Get thread subscription + # + # @param thread_id [Integer] Id of the thread. + # @return [Sawyer::Resource] Subscription. + # @see https://developer.github.com/v3/activity/notifications/#get-a-thread-subscription + # @example + # @client.thread_subscription(1) + def thread_subscription(thread_id, options = {}) + get "notifications/threads/#{thread_id}/subscription", options + end + + # Update thread subscription + # + # This lets you subscribe to a thread, or ignore it. Subscribing to a + # thread is unnecessary if the user is already subscribed to the + # repository. Ignoring a thread will mute all future notifications (until + # you comment or get @mentioned). + # + # @param thread_id [Integer] Id of the thread. + # @param options + # @option options [Boolean] :subscribed Determines if notifications + # should be received from this repository. + # @option options [Boolean] :ignored Deterimines if all notifications + # should be blocked from this repository. + # @return [Sawyer::Resource] Updated subscription. + # @see https://developer.github.com/v3/activity/notifications/#set-a-thread-subscription + # @example Subscribe to notifications + # @client.update_thread_subscription(1, :subscribed => true) + # @example Ignore notifications from a repo + # @client.update_thread_subscription(1, :ignored => true) + def update_thread_subscription(thread_id, options = {}) + put "notifications/threads/#{thread_id}/subscription", options + end + + # Delete a thread subscription + # + # @param thread_id [Integer] Id of the thread. + # @return [Boolean] True if delete successful, false otherwise. + # @see https://developer.github.com/v3/activity/notifications/#delete-a-thread-subscription + # @example + # @client.delete_thread_subscription(1) + def delete_thread_subscription(thread_id, options = {}) + boolean_from_response :delete, "notifications/threads/#{thread_id}/subscription", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/oauth_applications.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/oauth_applications.rb new file mode 100644 index 000000000000..a118e71fc80b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/oauth_applications.rb @@ -0,0 +1,122 @@ +# frozen_string_literal: true + +module Octokit + class Client + + # Methods for the OauthApplications API + # + # @see https://developer.github.com/v3/apps/oauth_applications + module OauthApplications + + # Check if a token is valid. + # + # Applications can check if a token is valid without rate limits. + # + # @param access_token [String] 40 character GitHub OAuth access token + # + # @return [Sawyer::Resource] A single authorization for the authenticated user + # @see https://developer.github.com/v3/apps/oauth_applications/#check-a-token + # + # @example + # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') + # client.check_token('deadbeef1234567890deadbeef987654321') + def check_token(access_token, options = {}) + options = ensure_api_media_type(:applications_api, options.dup) + options[:access_token] = access_token + + key = options.delete(:client_id) || client_id + secret = options.delete(:client_secret) || client_secret + + as_app(key, secret) do |app_client| + app_client.post "applications/#{client_id}/token", options + end + end + alias check_application_authorization check_token + + # Reset a token + # + # Applications can reset a token without requiring a user to re-authorize. + # + # @param access_token [String] 40 character GitHub OAuth access token + # + # @return [Sawyer::Resource] A single authorization for the authenticated user + # @see https://developer.github.com/v3/apps/oauth_applications/#reset-a-token + # + # @example + # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') + # client.reset_token('deadbeef1234567890deadbeef987654321') + def reset_token(access_token, options = {}) + options = ensure_api_media_type(:applications_api, options.dup) + options[:access_token] = access_token + + key = options.delete(:client_id) || client_id + secret = options.delete(:client_secret) || client_secret + + as_app(key, secret) do |app_client| + app_client.patch "applications/#{client_id}/token", options + end + end + alias reset_application_authorization reset_token + + # Delete an app token + # + # Applications can revoke (delete) a token + # + # @param access_token [String] 40 character GitHub OAuth access token + # + # @return [Boolean] Result + # @see https://developer.github.com/v3/apps/oauth_applications/#delete-an-app-token + # + # @example + # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') + # client.delete_token('deadbeef1234567890deadbeef987654321') + def delete_app_token(access_token, options = {}) + options = ensure_api_media_type(:applications_api, options.dup) + options[:access_token] = access_token + + key = options.delete(:client_id) || client_id + secret = options.delete(:client_secret) || client_secret + + begin + as_app(key, secret) do |app_client| + app_client.delete "applications/#{client_id}/token", options + app_client.last_response.status == 204 + end + rescue Octokit::NotFound + false + end + end + alias delete_application_authorization delete_app_token + alias revoke_application_authorization delete_app_token + + # Delete an app authorization + # + # OAuth application owners can revoke a grant for their OAuth application and a specific user. + # + # @param access_token [String] 40 character GitHub OAuth access token + # + # @return [Boolean] Result + # @see https://developer.github.com/v3/apps/oauth_applications/#delete-an-app-token + # + # @example + # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') + # client.delete_app_authorization('deadbeef1234567890deadbeef987654321') + def delete_app_authorization(access_token, options = {}) + options = ensure_api_media_type(:applications_api, options.dup) + options[:access_token] = access_token + + key = options.delete(:client_id) || client_id + secret = options.delete(:client_secret) || client_secret + + begin + as_app(key, secret) do |app_client| + app_client.delete "applications/#{client_id}/grant", options + app_client.last_response.status == 204 + end + rescue Octokit::NotFound + false + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/objects.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/objects.rb new file mode 100644 index 000000000000..bbb449e4e4a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/objects.rb @@ -0,0 +1,141 @@ +module Octokit + class Client + + # Methods for the Git Data API + # + # @see https://developer.github.com/v3/git/ + module Objects + + # Get a single tree, fetching information about its root-level objects + # + # Pass <tt>:recursive => true</tt> in <tt>options</tt> to fetch information about all of the tree's objects, including those in subdirectories. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param tree_sha [String] The SHA of the tree to fetch + # @return [Sawyer::Resource] A hash representing the fetched tree + # @see https://developer.github.com/v3/git/trees/#get-a-tree + # @see https://developer.github.com/v3/git/trees/#get-a-tree-recursively + # @example Fetch a tree and inspect the path of one of its files + # tree = Octokit.tree("octocat/Hello-World", "9fb037999f264ba9a7fc6274d15fa3ae2ab98312") + # tree.tree.first.path # => "file.rb" + # @example Fetch a tree recursively + # tree = Octokit.tree("octocat/Hello-World", "fc6274d15fa3ae2ab983129fb037999f264ba9a7", :recursive => true) + # tree.tree.first.path # => "subdir/file.txt" + def tree(repo, tree_sha, options = {}) + get "#{Repository.path repo}/git/trees/#{tree_sha}", options + end + + # Create a tree + # + # Pass <tt>:base_tree => "827efc6..."</tt> in <tt>options</tt> to update an existing tree with new data. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param tree [Array] An array of hashes representing a tree structure + # @return [Sawyer::Resource] A hash representing the new tree + # @see https://developer.github.com/v3/git/trees/#create-a-tree + # @example Create a tree containing one file + # tree = Octokit.create_tree("octocat/Hello-World", [ { :path => "file.rb", :mode => "100644", :type => "blob", :sha => "44b4fc6d56897b048c772eb4087f854f46256132" } ]) + # tree.sha # => "cd8274d15fa3ae2ab983129fb037999f264ba9a7" + # tree.tree.first.path # => "file.rb" + def create_tree(repo, tree, options = {}) + parameters = { :tree => tree } + post "#{Repository.path repo}/git/trees", options.merge(parameters) + end + + # Get a single blob, fetching its content and encoding + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param blob_sha [String] The SHA of the blob to fetch + # @return [Sawyer::Resource] A hash representing the fetched blob + # @see https://developer.github.com/v3/git/blobs/#get-a-blob + # @example Fetch a blob and inspect its contents + # blob = Octokit.blob("octocat/Hello-World", "827efc6d56897b048c772eb4087f854f46256132") + # blob.encoding # => "utf-8" + # blob.content # => "Foo bar baz" + # @example Fetch a base64-encoded blob and inspect its contents + # require "base64" + # blob = Octokit.blob("octocat/Hello-World", "827efc6d56897b048c772eb4087f854f46256132") + # blob.encoding # => "base64" + # blob.content # => "Rm9vIGJhciBiYXo=" + # Base64.decode64(blob.content) # => "Foo bar baz" + def blob(repo, blob_sha, options = {}) + get "#{Repository.path repo}/git/blobs/#{blob_sha}", options + end + + # Create a blob + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param content [String] Content of the blob + # @param encoding [String] The content's encoding. <tt>utf-8</tt> and <tt>base64</tt> are accepted. If your data cannot be losslessly sent as a UTF-8 string, you can base64 encode it + # @return [String] The new blob's SHA, e.g. <tt>827efc6d56897b048c772eb4087f854f46256132</tt> + # @see https://developer.github.com/v3/git/blobs/#create-a-blob + # @example Create a blob containing <tt>foo bar baz</tt> + # Octokit.create_blob("octocat/Hello-World", "foo bar baz") + # @example Create a blob containing <tt>foo bar baz</tt>, encoded using base64 + # require "base64" + # Octokit.create_blob("octocat/Hello-World", Base64.encode64("foo bar baz"), "base64") + def create_blob(repo, content, encoding="utf-8", options = {}) + parameters = { + :content => content, + :encoding => encoding + } + blob = post "#{Repository.path repo}/git/blobs", options.merge(parameters) + + blob.sha + end + + # Get a tag + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param tag_sha [String] The SHA of the tag to fetch. + # @return [Sawyer::Resource] Hash representing the tag. + # @see https://developer.github.com/v3/git/tags/#get-a-tag + # @example Fetch a tag + # Octokit.tag('octokit/octokit.rb', '23aad20633f4d2981b1c7209a800db3014774e96') + def tag(repo, tag_sha, options = {}) + get "#{Repository.path repo}/git/tags/#{tag_sha}", options + end + + # Create a tag + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param tag [String] Tag string. + # @param message [String] Tag message. + # @param object_sha [String] SHA of the git object this is tagging. + # @param type [String] Type of the object we're tagging. Normally this is + # a `commit` but it can also be a `tree` or a `blob`. + # @param tagger_name [String] Name of the author of the tag. + # @param tagger_email [String] Email of the author of the tag. + # @param tagger_date [string] Timestamp of when this object was tagged. + # @return [Sawyer::Resource] Hash representing new tag. + # @see https://developer.github.com/v3/git/tags/#create-a-tag-object + # @example + # @client.create_tag( + # "octokit/octokit.rb", + # "v9000.0.0", + # "Version 9000\n", + # "f4cdf6eb734f32343ce3f27670c17b35f54fd82e", + # "commit", + # "Wynn Netherland", + # "wynn.netherland@gmail.com", + # "2012-06-03T17:03:11-07:00" + # ) + def create_tag(repo, tag, message, object_sha, type, tagger_name, tagger_email, tagger_date, options = {}) + options.merge!( + :tag => tag, + :message => message, + :object => object_sha, + :type => type, + :tagger => { + :name => tagger_name, + :email => tagger_email, + :date => tagger_date + } + ) + post "#{Repository.path repo}/git/tags", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/organizations.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/organizations.rb new file mode 100644 index 000000000000..ec43bfca13e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/organizations.rb @@ -0,0 +1,806 @@ +module Octokit + class Client + + # Methods for the Organizations API + # + # @see https://developer.github.com/v3/orgs/ + module Organizations + + # Get an organization + # + # @param org [String, Integer] Organization GitHub login or id. + # @return [Sawyer::Resource] Hash representing GitHub organization. + # @see https://developer.github.com/v3/orgs/#get-an-organization + # @example + # Octokit.organization('github') + # @example + # Octokit.org('github') + def organization(org, options = {}) + get Organization.path(org), options + end + alias :org :organization + + # Update an organization. + # + # Requires authenticated client with proper organization permissions. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param values [Hash] The updated organization attributes. + # @option values [String] :billing_email Billing email address. This address is not publicized. + # @option values [String] :company Company name. + # @option values [String] :email Publicly visible email address. + # @option values [String] :location Location of organization. + # @option values [String] :name GitHub username for organization. + # @option values [String] :default_repository_permission The default permission members have on organization repositories. + # @option values [Boolean] :members_can_create_repositories Set true to allow members to create repositories on the organization. + # @return [Sawyer::Resource] Hash representing GitHub organization. + # @see https://developer.github.com/v3/orgs/#edit-an-organization + # @example + # @client.update_organization('github', { + # :billing_email => 'support@github.com', + # :company => 'GitHub', + # :email => 'support@github.com', + # :location => 'San Francisco', + # :name => 'github' + # }) + # @example + # @client.update_org('github', {:company => 'Unicorns, Inc.'}) + def update_organization(org, values, options = {}) + patch Organization.path(org), options.merge(values) + end + alias :update_org :update_organization + + # Get organizations for a user. + # + # Nonauthenticated calls to this method will return organizations that + # the user is a public member. + # + # Use an authenicated client to get both public and private organizations + # for a user. + # + # Calling this method on a `@client` will return that users organizations. + # Private organizations are included only if the `@client` is authenticated. + # + # @param user [Integer, String] GitHub user login or id of the user to get + # list of organizations. + # @return [Array<Sawyer::Resource>] Array of hashes representing organizations. + # @see https://developer.github.com/v3/orgs/#list-your-organizations + # @see https://developer.github.com/v3/orgs/#list-user-organizations + # @example + # Octokit.organizations('pengwynn') + # @example + # @client.organizations('pengwynn') + # @example + # Octokit.orgs('pengwynn') + # @example + # Octokit.list_organizations('pengwynn') + # @example + # Octokit.list_orgs('pengwynn') + # @example + # @client.organizations + def organizations(user=nil, options = {}) + paginate "#{User.path user}/orgs", options + end + alias :list_organizations :organizations + alias :list_orgs :organizations + alias :orgs :organizations + + # List all GitHub organizations + # + # This provides a list of every organization, in the order that they + # were created. + # + # @param options [Hash] Optional options. + # @option options [Integer] :since The integer ID of the last + # Organization that you’ve seen. + # + # @see https://developer.github.com/v3/orgs/#list-all-organizations + # + # @return [Array<Sawyer::Resource>] List of GitHub organizations. + def all_organizations(options = {}) + paginate "organizations", options + end + alias :all_orgs :all_organizations + + # List organization repositories + # + # Public repositories are available without authentication. Private repos + # require authenticated organization member. + # + # @param org [String, Integer] Organization GitHub login or id for which + # to list repos. + # @option options [String] :type ('all') Filter by repository type. + # `all`, `public`, `member`, `sources`, `forks`, or `private`. + # + # @return [Array<Sawyer::Resource>] List of repositories + # @see https://developer.github.com/v3/repos/#list-organization-repositories + # @example + # Octokit.organization_repositories('github') + # @example + # Octokit.org_repositories('github') + # @example + # Octokit.org_repos('github') + # @example + # @client.org_repos('github', {:type => 'private'}) + def organization_repositories(org, options = {}) + paginate "#{Organization.path org}/repos", options + end + alias :org_repositories :organization_repositories + alias :org_repos :organization_repositories + + # Get organization members + # + # Public members of the organization are returned by default. An + # authenticated client that is a member of the GitHub organization + # is required to get private members. + # + # @param org [String, Integer] Organization GitHub login or id. + # @return [Array<Sawyer::Resource>] Array of hashes representing users. + # @see https://developer.github.com/v3/orgs/members/#members-list + # @example + # Octokit.organization_members('github') + # @example + # Octokit.org_members('github') + def organization_members(org, options = {}) + options = options.dup + path = "public_" if options.delete(:public) + paginate "#{Organization.path org}/#{path}members", options + end + alias :org_members :organization_members + + # Get organization public members + # + # Lists the public members of an organization + # + # @param org [String] Organization GitHub username. + # @return [Array<Sawyer::Resource>] Array of hashes representing users. + # @see https://developer.github.com/v3/orgs/members/#public-members-list + # @example + # Octokit.organization_public_members('github') + # @example + # Octokit.org_public_members('github') + def organization_public_members(org, options = {}) + organization_members org, options.merge(:public => true) + end + alias :org_public_members :organization_public_members + + # Check if a user is a member of an organization. + # + # Use this to check if another user is a member of an organization that + # you are a member. If you are not in the organization you are checking, + # use .organization_public_member? instead. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param user [String] GitHub username of the user to check. + # + # @return [Boolean] Is a member? + # + # @see https://developer.github.com/v3/orgs/members/#check-membership + # + # @example Check if a user is in your organization + # @client.organization_member?('your_organization', 'pengwynn') + # => false + def organization_member?(org, user, options = {}) + result = boolean_from_response(:get, "#{Organization.path org}/members/#{user}", options) + if !result && last_response && last_response.status == 302 + boolean_from_response :get, last_response.headers['Location'] + else + result + end + end + alias :org_member? :organization_member? + + # Check if a user is a public member of an organization. + # + # If you are checking for membership of a user of an organization that + # you are in, use .organization_member? instead. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param user [String] GitHub username of the user to check. + # + # @return [Boolean] Is a public member? + # + # @see https://developer.github.com/v3/orgs/members/#check-public-membership + # + # @example Check if a user is a hubbernaut + # @client.organization_public_member?('github', 'pengwynn') + # => true + def organization_public_member?(org, user, options = {}) + boolean_from_response :get, "#{Organization.path org}/public_members/#{user}", options + end + alias :org_public_member? :organization_public_member? + + # List pending organization invitations + # + # Requires authenticated organization member. + # + # @param org [String, Integer] Organization GitHub login or id. + # @return [Array<Sawyer::Resource>] Array of hashes representing invitations. + # @see https://developer.github.com/v3/orgs/members/#list-pending-organization-invitations + # + # @example + # @client.organization_invitations('github') + def organization_invitations(org, options = {}) + get "#{Organization.path org}/invitations", options + end + alias :org_invitations :organization_invitations + + # List outside collaborators for an organization + # + # Requires authenticated organization members. + # + # @param org [String, Integer] Organization GitHub login or id. + # @return [Array<Sawyer::Resource>] Array of hashes representing users. + # @see https://developer.github.com/v3/orgs/outside_collaborators/#list-outside-collaborators + # + # @example + # @client.outside_collaborators('github') + def outside_collaborators(org, options={}) + paginate "#{Organization.path org}/outside_collaborators", options + end + + # Remove outside collaborator from an organization + # + # Requires authenticated organization members. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param user [String] GitHub username to be removed as outside collaborator + # @return [Boolean] Return true if outside collaborator removed from organization, false otherwise. + # @see https://developer.github.com/v3/orgs/outside-collaborators/#remove-outside-collaborator + # + # @example + # @client.remove_outside_collaborator('github', 'lizzhale') + def remove_outside_collaborator(org, user, options={}) + boolean_from_response :delete, "#{Organization.path org}/outside_collaborators/#{user}", options + end + + # Converts an organization member to an outside collaborator + # + # Requires authenticated organization members. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param user [String] GitHub username to be removed as outside collaborator + # @return [Boolean] Return true if outside collaborator removed from organization, false otherwise. + # @see https://developer.github.com/v3/orgs/outside-collaborators/#convert-member-to-outside-collaborator + # + # @example + # @client.convert_to_outside_collaborator('github', 'lizzhale') + def convert_to_outside_collaborator(org, user, options={}) + boolean_from_response :put, "#{Organization.path org}/outside_collaborators/#{user}", options + end + + # List teams + # + # Requires authenticated organization member. + # + # @param org [String, Integer] Organization GitHub login or id. + # @return [Array<Sawyer::Resource>] Array of hashes representing teams. + # @see https://developer.github.com/v3/orgs/teams/#list-teams + # @example + # @client.organization_teams('github') + # @example + # @client.org_teams('github') + def organization_teams(org, options = {}) + paginate "#{Organization.path org}/teams", options + end + alias :org_teams :organization_teams + + # Create team + # + # Requires authenticated organization owner. + # + # @param org [String, Integer] Organization GitHub login or id. + # @option options [String] :name Team name. + # @option options [Array<String>] :repo_names Repositories for the team. + # @option options [Array<String>] :maintainers Maintainers for the team. + # @option options [Integer] :parent_team_id ID of a team to set as the parent team. + # @return [Sawyer::Resource] Hash representing new team. + # @see https://developer.github.com/v3/orgs/teams/#create-team + # @example + # @client.create_team('github', { + # :name => 'Designers', + # :repo_names => ['github/dotfiles'] + # }) + def create_team(org, options = {}) + if options.key?(:permission) + octokit_warn "Deprecated: Passing :permission option to #create_team. Assign team repository permission by passing :permission to #add_team_repository instead." + end + if options.key?(:parent_team_id) + options = ensure_api_media_type(:nested_teams, options) + end + post "#{Organization.path org}/teams", options + end + + # Get team + # + # Requires authenticated organization member. + # + # @param team_id [Integer] Team id. + # @return [Sawyer::Resource] Hash representing team. + # @see https://developer.github.com/v3/orgs/teams/#get-team + # @example + # @client.team(100000) + def team(team_id, options = {}) + get "teams/#{team_id}", options + end + + # Get team by name and org + # + # Requires authenticated organization member. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param team_slug [String] Team slug. + # @return [Sawyer::Resource] Hash representing team. + # @see https://developer.github.com/v3/teams/#get-team-by-name + # @example + # @client.team_by_name("github", "justice-league") + def team_by_name(org, team_slug, options = {}) + get "#{Organization.path(org)}/teams/#{team_slug}", options + end + + # List child teams + # + # Requires authenticated organization member. + # + # @param team_id [Integer] Team id. + # @return [Sawyer::Resource] Hash representing team. + # @see https://developer.github.com/v3/orgs/teams/#list-child-teams + # @example + # @client.child_teams(100000, :accept => "application/vnd.github.hellcat-preview+json") + def child_teams(team_id, options = {}) + options = ensure_api_media_type(:nested_teams, options) + paginate "teams/#{team_id}/teams", options + end + + # Update team + # + # Requires authenticated organization owner. + # + # @param team_id [Integer] Team id. + # @option options [String] :name Team name. + # @option options [String] :permission Permissions the team has for team repositories. + # + # `pull` - team members can pull, but not push to or administer these repositories. + # `push` - team members can pull and push, but not administer these repositories. + # `admin` - team members can pull, push and administer these repositories. + # @option options [Integer] :parent_team_id ID of a team to set as the parent team. + # @return [Sawyer::Resource] Hash representing updated team. + # @see https://developer.github.com/v3/orgs/teams/#edit-team + # @example + # @client.update_team(100000, { + # :name => 'Front-end Designers', + # :permission => 'push' + # }) + def update_team(team_id, options = {}) + if options.key?(:parent_team_id) + options = ensure_api_media_type(:nested_teams, options) + end + patch "teams/#{team_id}", options + end + + # Delete team + # + # Requires authenticated organization owner. + # + # @param team_id [Integer] Team id. + # @return [Boolean] True if deletion successful, false otherwise. + # @see https://developer.github.com/v3/orgs/teams/#delete-team + # @example + # @client.delete_team(100000) + def delete_team(team_id, options = {}) + boolean_from_response :delete, "teams/#{team_id}", options + end + + # List team members + # + # Requires authenticated organization member. + # + # @param team_id [Integer] Team id. + # @return [Array<Sawyer::Resource>] Array of hashes representing users. + # @see https://developer.github.com/v3/orgs/teams/#list-team-members + # @example + # @client.team_members(100000) + def team_members(team_id, options = {}) + paginate "teams/#{team_id}/members", options + end + + # Add team member + # + # Requires authenticated organization owner or member with team + # `admin` permission. + # + # @param team_id [Integer] Team id. + # @param user [String] GitHub username of new team member. + # @return [Boolean] True on successful addition, false otherwise. + # @see https://developer.github.com/v3/orgs/teams/#add-team-member + # @example + # @client.add_team_member(100000, 'pengwynn') + # + # @example + # # Opt-in to future behavior for this endpoint. Adds the member to the + # # team if they're already an org member. If not, the method will return + # # 422 and indicate the user should call the new Team Membership endpoint. + # @client.add_team_member \ + # 100000, + # 'pengwynn', + # :accept => "application/vnd.github.the-wasp-preview+json" + # @see https://developer.github.com/changes/2014-08-05-team-memberships-api/ + def add_team_member(team_id, user, options = {}) + # There's a bug in this API call. The docs say to leave the body blank, + # but it fails if the body is both blank and the content-length header + # is not 0. + boolean_from_response :put, "teams/#{team_id}/members/#{user}", options.merge({:name => user}) + end + + # Remove team member + # + # Requires authenticated organization owner or member with team + # `admin` permission. + # + # @param team_id [Integer] Team id. + # @param user [String] GitHub username of the user to boot. + # @return [Boolean] True if user removed, false otherwise. + # @see https://developer.github.com/v3/orgs/teams/#remove-team-member + # @example + # @client.remove_team_member(100000, 'pengwynn') + def remove_team_member(team_id, user, options = {}) + boolean_from_response :delete, "teams/#{team_id}/members/#{user}", options + end + + # Check if a user is a member of a team. + # + # Use this to check if another user is a member of a team that + # you are a member. + # + # @param team_id [Integer] Team id. + # @param user [String] GitHub username of the user to check. + # + # @return [Boolean] Is a member? + # + # @see https://developer.github.com/v3/orgs/teams/#get-team-member + # + # @example Check if a user is in your team + # @client.team_member?(100000, 'pengwynn') + # => false + def team_member?(team_id, user, options = {}) + boolean_from_response :get, "teams/#{team_id}/members/#{user}", options + end + + # List pending team invitations + # + # Requires authenticated organization member. + # + # @param team_id [Integer] Team id. + # @return [Array<Sawyer::Resource>] Array of hashes representing invitations. + # @see https://developer.github.com/v3/orgs/teams/#list-pending-team-invitations + # + # @example + # @client.team_invitations('github') + def team_invitations(team_id, options = {}) + get "teams/#{team_id}/invitations", options + end + + # List team repositories + # + # Requires authenticated organization member. + # + # @param team_id [Integer] Team id. + # @return [Array<Sawyer::Resource>] Array of hashes representing repositories. + # @see https://developer.github.com/v3/orgs/teams/#list-team-repos + # @example + # @client.team_repositories(100000) + # @example + # @client.team_repos(100000) + def team_repositories(team_id, options = {}) + paginate "teams/#{team_id}/repos", options + end + alias :team_repos :team_repositories + + # Check if a repo is managed by a specific team + # + # @param team_id [Integer] Team ID. + # @param repo [String, Hash, Repository] A GitHub repository. + # @return [Boolean] True if managed by a team. False if not managed by + # the team OR the requesting user does not have authorization to access + # the team information. + # @see https://developer.github.com/v3/orgs/teams/#check-if-a-team-manages-a-repository + # @example + # @client.team_repository?(8675309, 'octokit/octokit.rb') + # @example + # @client.team_repo?(8675309, 'octokit/octokit.rb') + def team_repository?(team_id, repo, options = {}) + boolean_from_response :get, "teams/#{team_id}/repos/#{Repository.new(repo)}" + end + alias :team_repo? :team_repository? + + # Add team repository + # + # This can also be used to update the permission of an existing team + # + # Requires authenticated user to be an owner of the organization that the + # team is associated with. Also, the repo must be owned by the + # organization, or a direct form of a repo owned by the organization. + # + # @param team_id [Integer] Team id. + # @param repo [String, Hash, Repository] A GitHub repository. + # @option options [String] :permission The permission to grant the team. + # Only valid on organization-owned repositories. + # Can be one of: <tt>pull</tt>, <tt>push</tt>, or <tt>admin</tt>. + # If not specified, the team's <tt>permission</tt> attribute will be + # used to determine what permission to grant the team on this repository. + # @return [Boolean] True if successful, false otherwise. + # @see Octokit::Repository + # @see https://developer.github.com/v3/orgs/teams/#add-or-update-team-repository + # @example + # @client.add_team_repository(100000, 'github/developer.github.com') + # @example + # @client.add_team_repo(100000, 'github/developer.github.com') + # @example Add a team with admin permissions + # @client.add_team_repository(100000, 'github/developer.github.com', permission: 'admin') + def add_team_repository(team_id, repo, options = {}) + boolean_from_response :put, "teams/#{team_id}/repos/#{Repository.new(repo)}", options + end + alias :add_team_repo :add_team_repository + + # Remove team repository + # + # Removes repository from team. Does not delete the repository. + # + # Requires authenticated organization owner. + # + # @param team_id [Integer] Team id. + # @param repo [String, Hash, Repository] A GitHub repository. + # @return [Boolean] Return true if repo removed from team, false otherwise. + # @see Octokit::Repository + # @see https://developer.github.com/v3/orgs/teams/#remove-team-repository + # @example + # @client.remove_team_repository(100000, 'github/developer.github.com') + # @example + # @client.remove_team_repo(100000, 'github/developer.github.com') + def remove_team_repository(team_id, repo, options = {}) + boolean_from_response :delete, "teams/#{team_id}/repos/#{Repository.new(repo)}" + end + alias :remove_team_repo :remove_team_repository + + # Remove organization member + # + # Requires authenticated organization owner or member with team `admin` access. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param user [String] GitHub username of user to remove. + # @return [Boolean] True if removal is successful, false otherwise. + # @see https://developer.github.com/v3/orgs/members/#remove-a-member + # @example + # @client.remove_organization_member('github', 'pengwynn') + # @example + # @client.remove_org_member('github', 'pengwynn') + def remove_organization_member(org, user, options = {}) + # this is a synonym for: for team in org.teams: remove_team_member(team.id, user) + # provided in the GH API v3 + boolean_from_response :delete, "#{Organization.path org}/members/#{user}", options + end + alias :remove_org_member :remove_organization_member + + # Publicize a user's membership of an organization + # + # Requires authenticated organization owner. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param user [String] GitHub username of user to publicize. + # @return [Boolean] True if publicization successful, false otherwise. + # @see https://developer.github.com/v3/orgs/members/#publicize-a-users-membership + # @example + # @client.publicize_membership('github', 'pengwynn') + def publicize_membership(org, user, options = {}) + boolean_from_response :put, "#{Organization.path org}/public_members/#{user}", options + end + + # Conceal a user's membership of an organization. + # + # Requires authenticated organization owner. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param user [String] GitHub username of user to unpublicize. + # @return [Boolean] True of unpublicization successful, false otherwise. + # @see https://developer.github.com/v3/orgs/members/#conceal-a-users-membership + # @example + # @client.unpublicize_membership('github', 'pengwynn') + # @example + # @client.conceal_membership('github', 'pengwynn') + def unpublicize_membership(org, user, options = {}) + boolean_from_response :delete, "#{Organization.path org}/public_members/#{user}", options + end + alias :conceal_membership :unpublicize_membership + + # List all teams for the authenticated user across all their orgs + # + # @return [Array<Sawyer::Resource>] Array of team resources. + # @see https://developer.github.com/v3/orgs/teams/#list-user-teams + def user_teams(options = {}) + paginate "user/teams", options + end + + # Check if a user has a team membership. + # + # @param team_id [Integer] Team id. + # @param user [String] GitHub username of the user to check. + # + # @return [Sawyer::Resource] Hash of team membership info + # + # @see https://developer.github.com/v3/orgs/teams/#get-team-membership + # + # @example Check if a user has a membership for a team + # @client.team_membership(1234, 'pengwynn') + def team_membership(team_id, user, options = {}) + get "teams/#{team_id}/memberships/#{user}", options + end + + # Add or invite a user to a team + # + # @param team_id [Integer] Team id. + # @param user [String] GitHub username of the user to invite. + # + # @return [Sawyer::Resource] Hash of team membership info + # + # @see https://developer.github.com/v3/orgs/teams/#add-or-update-team-membership + # + # @example Check if a user has a membership for a team + # @client.add_team_membership(1234, 'pengwynn') + def add_team_membership(team_id, user, options = {}) + put "teams/#{team_id}/memberships/#{user}", options + end + + # Remove team membership + # + # @param team_id [Integer] Team id. + # @param user [String] GitHub username of the user to boot. + # @return [Boolean] True if user removed, false otherwise. + # @see https://developer.github.com/v3/orgs/teams/#remove-team-membership + # @example + # @client.remove_team_membership(100000, 'pengwynn') + def remove_team_membership(team_id, user, options = {}) + boolean_from_response :delete, "teams/#{team_id}/memberships/#{user}", options + end + + # List all organizations memberships for the authenticated user + # + # @return [Array<Sawyer::Resource>] Array of organizations memberships. + # @see https://developer.github.com/v3/orgs/members/#list-your-organization-memberships + def organization_memberships(options = {}) + paginate "user/memberships/orgs", options + end + alias :org_memberships :organization_memberships + + # Get an organization membership + # + # @param org [Integer, String] The GitHub Organization. + # @option options [String] :user The login of the user, otherwise authenticated user. + # @return [Sawyer::Resource] Hash representing the organization membership. + # @see https://developer.github.com/v3/orgs/members/#get-your-organization-membership + # @see https://developer.github.com/v3/orgs/members/#get-organization-membership + def organization_membership(org, options = {}) + options = options.dup + if user = options.delete(:user) + get "#{Organization.path(org)}/memberships/#{user}", options + else + get "user/memberships/orgs/#{org}", options + end + end + alias :org_membership :organization_membership + + # Edit an organization membership + # + # @param org [String, Integer] Organization GitHub login or id. + # @option options [String] :role The role of the user in the organization. + # @option options [String] :state The state that the membership should be in. + # @option options [String] :user The login of the user, otherwise authenticated user. + # @return [Sawyer::Resource] Hash representing the updated organization membership. + # @see https://developer.github.com/v3/orgs/members/#edit-your-organization-membership + # @see https://developer.github.com/v3/orgs/members/#add-or-update-organization-membership + def update_organization_membership(org, options = {}) + options = options.dup + if user = options.delete(:user) + options.delete(:state) + put "#{Organization.path(org)}/memberships/#{user}", options + else + options.delete(:role) + patch "user/memberships/orgs/#{org}", options + end + end + alias :update_org_membership :update_organization_membership + + # Remove an organization membership + # + # @param org [String, Integer] Organization GitHub login or id. + # @return [Boolean] Success + # @see https://developer.github.com/v3/orgs/members/#remove-organization-membership + def remove_organization_membership(org, options = {}) + options = options.dup + user = options.delete(:user) + user && boolean_from_response(:delete, "#{Organization.path(org)}/memberships/#{user}", options) + end + alias :remove_org_membership :remove_organization_membership + + # Initiates the generation of a migration archive. + # + # Requires authenticated organization owner. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param repositories [Array<String>] :repositories Repositories for the organization. + # @option options [Boolean, optional] :lock_repositories Indicates whether repositories should be locked during migration + # @return [Sawyer::Resource] Hash representing the new migration. + # @example + # @client.start_migration('github', ['github/dotfiles']) + # @see https://developer.github.com/v3/orgs/migrations/#start-a-migration + def start_migration(org, repositories, options = {}) + options = ensure_api_media_type(:migrations, options) + options[:repositories] = repositories + post "#{Organization.path(org)}/migrations", options + end + + # Lists the most recent migrations. + # + # Requires authenticated organization owner. + # + # @param org [String, Integer] Organization GitHub login or id. + # @return [Array<Sawyer::Resource>] Array of migration resources. + # @see https://developer.github.com/v3/orgs/migrations/#get-a-list-of-migrations + def migrations(org, options = {}) + options = ensure_api_media_type(:migrations, options) + paginate "#{Organization.path(org)}/migrations", options + end + + # Fetches the status of a migration. + # + # Requires authenticated organization owner. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param id [Integer] ID number of the migration. + # @see https://developer.github.com/v3/orgs/migrations/#get-the-status-of-a-migration + def migration_status(org, id, options = {}) + options = ensure_api_media_type(:migrations, options) + get "#{Organization.path(org)}/migrations/#{id}", options + end + + # Fetches the URL to a migration archive. + # + # Requires authenticated organization owner. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param id [Integer] ID number of the migration. + # @see https://developer.github.com/v3/orgs/migrations/#download-a-migration-archive + def migration_archive_url(org, id, options = {}) + options = ensure_api_media_type(:migrations, options) + url = "#{Organization.path(org)}/migrations/#{id}/archive" + + response = client_without_redirects(options).get(url) + response.headers['location'] + end + + # Deletes a previous migration archive. + # + # Requires authenticated organization owner. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param id [Integer] ID number of the migration. + # @see https://developer.github.com/v3/orgs/migrations/#delete-a-migration-archive + def delete_migration_archive(org, id, options = {}) + options = ensure_api_media_type(:migrations, options) + delete "#{Organization.path(org)}/migrations/#{id}/archive", options + end + + # Unlock a previous migration archive. + # + # Requires authenticated organization owner. + # + # @param org [String, Integer] Organization GitHub login or id. + # @param id [Integer] ID number of the migration. + # @param repo [String] Name of the repository. + # @see https://developer.github.com/v3/orgs/migrations/#unlock-a-repository + def unlock_repository(org, id, repo, options = {}) + options = ensure_api_media_type(:migrations, options) + delete "#{Organization.path(org)}/migrations/#{id}/repos/#{repo}/lock", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/pages.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/pages.rb new file mode 100644 index 000000000000..08f3f78c43ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/pages.rb @@ -0,0 +1,63 @@ +module Octokit + class Client + + # Methods for the Pages API + # + # @see https://developer.github.com/v3/repos/pages/ + module Pages + + # List Pages information for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return Sawyer::Resource A GitHub Pages resource + # @see https://developer.github.com/v3/repos/pages/#get-information-about-a-pages-site + def pages(repo, options = {}) + get "#{Repository.path repo}/pages", options + end + + # Get a specific Pages build by ID + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param id [Integer, String] Build ID + # @return [Sawyer::Resource] Pages build information + # @see https://developer.github.com/v3/repos/pages/#list-a-specific-pages-build + # @example + # Octokit.pages_build("github/developer.github.com", 5472601) + def pages_build(repo, id, options = {}) + opts = ensure_api_media_type(:pages, options) + get "#{Repository.path repo}/pages/builds/#{id}", opts + end + + # List Pages builds for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] A list of build history for a repository. + # @see https://developer.github.com/v3/repos/pages/#list-pages-builds + def pages_builds(repo, options = {}) + get "#{Repository.path repo}/pages/builds", options + end + alias :list_pages_builds :pages_builds + + # List the latest Pages build information for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return Sawyer::Resource A GitHub Pages resource about a build + # @see https://developer.github.com/v3/repos/pages/#list-latest-pages-build + def latest_pages_build(repo, options = {}) + get "#{Repository.path repo}/pages/builds/latest", options + end + + # Request a page build for the latest revision of the default branch + # + # You can only request builds for your repositories + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Sawyer::Resource] Request result + # @see https://developer.github.com/v3/repos/pages/#request-a-page-build + def request_page_build(repo, options = {}) + opts = ensure_api_media_type(:pages, options) + post "#{Repository.path repo}/pages/builds", opts + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/projects.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/projects.rb new file mode 100644 index 000000000000..2df3f8a041cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/projects.rb @@ -0,0 +1,314 @@ +module Octokit + class Client + + # Methods for Projects API + # + # @see https://developer.github.com/v3/repos/projects + module Projects + + # List projects for a repository + # + # Requires authenticated client + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] Repository projects + # @see https://developer.github.com/v3/projects/#list-repository-projects + # @example + # @client.projects('octokit/octokit.rb') + def projects(repo, options = {}) + opts = ensure_api_media_type(:projects, options) + paginate "#{Repository.path repo}/projects", opts + end + + # Create a project + # + # Requires authenticated client + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param name [String] Project name + # @option options [String] :body Body of the project + # @return [Sawyer::Resource] Fresh new project + # @see https://developer.github.com/v3/projects/#create-a-repository-project + # @example Create project with only a name + # @client.create_project('octokit/octokit.rb', 'implement new APIs') + # + # @example Create project with name and body + # @client.create_project('octokit/octokit.rb', 'bugs be gone', body: 'Fix all the bugs @joeyw creates') + def create_project(repo, name, options = {}) + opts = ensure_api_media_type(:projects, options) + opts[:name] = name + post "#{Repository.path repo}/projects", opts + end + + # List organization projects + # + # Requires authenticated client + # + # @param org [String] A GitHub organization + # @return [Array<Sawyer::Resource>] Organization projects + # @see https://developer.github.com/v3/projects/#list-organization-projects + # @example + # @client.org_projects("octokit") + def org_projects(org, options = {}) + opts = ensure_api_media_type(:projects, options) + paginate "orgs/#{org}/projects", opts + end + alias :organization_projects :org_projects + + # Create organization project + # + # Requires authenticated client + # + # @param org [String] A GitHub organization + # @param name [String] Project name + # @option options [String] :body Project body + # @return [Sawyer::Resource] Organization project + # @see https://developer.github.com/v3/projects/#create-an-organization-project + # @example Create with only a name + # @client.create_org_project("octocat", "make more octocats") + # @example Create a project with name and body + # @client.create_org_project("octokit", "octocan", body: 'Improve clients') + def create_org_project(org, name, options = {}) + opts = ensure_api_media_type(:projects, options) + opts[:name] = name + post "orgs/#{org}/projects", opts + end + alias :create_organization_project :create_org_project + + # Get a project by id + # + # @param id [Integer] Project id + # @return [Sawyer::Resource] Project + # @see https://developer.github.com/v3/projects/#get-a-project + # @example + # Octokit.project(123942) + def project(id, options = {}) + opts = ensure_api_media_type(:projects, options) + get "projects/#{id}", opts + end + + # Update a project + # + # Requires authenticated client + # + # @param id [Integer] Project id + # @option options [String] :name Project name + # @option options [String] :body Project body + # @return [Sawyer::Resource] Project + # @see https://developer.github.com/v3/projects/#update-a-project + # @example Update project name + # @client.update_project(123942, name: 'New name') + def update_project(id, options = {}) + opts = ensure_api_media_type(:projects, options) + patch "projects/#{id}", opts + end + + # Delete a project + # + # Requires authenticated client + # + # @param id [Integer] Project id + # @return [Boolean] Result of deletion + # @see https://developer.github.com/v3/projects/#delete-a-project + # @example + # @client.delete_project(123942) + def delete_project(id, options = {}) + opts = ensure_api_media_type(:projects, options) + boolean_from_response :delete, "projects/#{id}", opts + end + + # List project columns + # + # @param id [Integer] Project id + # @return [Array<Sawyer::Resource>] List of project columns + # @see https://developer.github.com/v3/projects/columns/#list-project-columns + # @example + # @client.project_columns(123942) + def project_columns(id, options = {}) + opts = ensure_api_media_type(:projects, options) + paginate "projects/#{id}/columns", opts + end + + # Create a project column + # + # Requires authenticated client + # + # @param id [Integer] Project column id + # @param name [String] New column name + # @return [Sawyer::Resource] Newly created column + # @see https://developer.github.com/v3/projects/columns/#create-a-project-column + # @example + # @client.create_project_column(123942, "To Dones") + def create_project_column(id, name, options = {}) + opts = ensure_api_media_type(:projects, options) + opts[:name] = name + post "projects/#{id}/columns", opts + end + + # Get a project column by ID + # + # @param id [Integer] Project column id + # @return [Sawyer::Resource] Project column + # @see https://developer.github.com/v3/projects/columns/#get-a-project-column + # @example + # Octokit.project_column(30294) + def project_column(id, options = {}) + opts = ensure_api_media_type(:projects, options) + get "projects/columns/#{id}", opts + end + + # Update a project column + # + # Requires authenticated client + # + # @param id [Integer] Project column id + # @param name [String] New column name + # @return [Sawyer::Resource] Updated column + # @see https://developer.github.com/v3/projects/columns/#update-a-project-column + # @example + # @client.update_project_column(30294, "new column name") + def update_project_column(id, name, options = {}) + opts = ensure_api_media_type(:projects, options) + opts[:name] = name + patch "projects/columns/#{id}", opts + end + + # Delete a project column + # + # Requires authenticated client + # + # @param id [Integer] Project column id + # @return [Boolean] Result of deletion request, true when deleted + # @see https://developer.github.com/v3/projects/columns/#delete-a-project-column + # @example + # @client.delete_project_column(30294) + def delete_project_column(id, options = {}) + opts = ensure_api_media_type(:projects, options) + boolean_from_response :delete, "projects/columns/#{id}", opts + end + + # Move a project column + # + # Requires authenticated client + # + # @param id [Integer] Project column id + # @param position [String] New position for the column. Can be one of + # <tt>first</tt>, <tt>last</tt>, or <tt>after:<column-id></tt>, where + # <tt><column-id></tt> is the id value of a column in the same project. + # @return [Sawyer::Resource] Result + # @see https://developer.github.com/v3/projects/columns/#move-a-project-column + # @example + # @client.move_project_column(30294, "last") + def move_project_column(id, position, options = {}) + opts = ensure_api_media_type(:projects, options) + opts[:position] = position + post "projects/columns/#{id}/moves", opts + end + + # List columns cards + # + # Requires authenticated client + # + # @param id [Integer] Project column id + # @return [Array<Sawyer::Resource>] Cards in the column + # @see https://developer.github.com/v3/projects/cards/#list-project-cards + # @example + # @client.column_cards(30294) + def column_cards(id, options = {}) + opts = ensure_api_media_type(:projects, options) + paginate "projects/columns/#{id}/cards", opts + end + + # Create project card + # + # Requires authenticated client + # + # @param id [Integer] Project column id + # @option options [String] :note Card contents for a note type + # @option options [Integer] :content_id Issue ID for the card contents + # @option options [String] :content_type Type of content to associate + # with the card. <tt>Issue</tt> is presently the only avaiable value + # @note If :note is supplied, :content_id and :content_type must be + # excluded. Similarly, if :content_id is supplied, :content_type must + # be set and :note must not be included. + # @return [Sawyer::Resource] Newly created card + # @see https://developer.github.com/v3/projects/cards/#create-a-project-card + # @example Create a project card with a note + # @client.create_project_card(123495, note: 'New note card') + # @example Create a project card for an repository issue + # @client.create_project_card(123495, content_id: 1, content_type: 'Issue') + def create_project_card(id, options = {}) + opts = ensure_api_media_type(:projects, options) + post "projects/columns/#{id}/cards", opts + end + + # Get a project card + # + # Requires authenticated client + # + # @param id [Integer] Project card id + # @return [Sawyer::Resource] Project card + # @see https://developer.github.com/v3/projects/cards/#get-a-project-card + # @example + # @client.project_card(123495) + def project_card(id, options = {}) + opts = ensure_api_media_type(:projects, options) + get "projects/columns/cards/#{id}", opts + end + + # Update a project card + # + # Requires authenticated client + # + # @param id [Integer] Project card id + # @option options [String] :note The card's note content. Only valid for + # cards without another type of content, so this cannot be specified if + # the card already has a content_id and content_type. + # @return [Sawyer::Resource] Updated project card + # @see https://developer.github.com/v3/projects/cards/#update-a-project-card + # @example + # @client.update_project_card(12345, note: 'new note') + def update_project_card(id, options = {}) + opts = ensure_api_media_type(:projects, options) + patch "projects/columns/cards/#{id}", opts + end + + # Move a project card + # + # Requires authenticated client + # + # @param id [Integer] Project card id + # @param position [String] Can be one of <tt>top</tt>, <tt>bottom</tt>, + # or <tt>after:<card-id></tt>, where <card-id> is the id value of a + # card in the same column, or in the new column specified by column_id. + # @option options [Integer] :column_id The column id to move the card to, + # must be column in same project + # @return [Sawyer::Resource] Empty sawyer resource + # @see https://developer.github.com/v3/projects/cards/#move-a-project-card + # @example Move a card to the bottom of the same column + # @client.move_project_card(123495, 'bottom') + # @example Move a card to the top of another column + # @client.move_project_card(123495, 'top', column_id: 59402) + def move_project_card(id, position, options = {}) + opts = ensure_api_media_type(:projects, options) + opts[:position] = position + post "projects/columns/cards/#{id}/moves", opts + end + + # Delete a project card + # + # Requires authenticated client + # + # @param id [Integer] Project card id + # @return [Boolean] True of deleted, false otherwise + # @see https://developer.github.com/v3/projects/cards/#delete-a-project-card + # @example + # @client.delete_project_card(123495) + def delete_project_card(id, options = {}) + opts = ensure_api_media_type(:projects, options) + boolean_from_response :delete, "projects/columns/cards/#{id}", opts + end + + end # Projects + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/pub_sub_hubbub.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/pub_sub_hubbub.rb new file mode 100644 index 000000000000..69ae334e0188 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/pub_sub_hubbub.rb @@ -0,0 +1,111 @@ +module Octokit + class Client + + # Methods for the PubSubHubbub API + # + # @see https://developer.github.com/v3/repos/hooks/#pubsubhubbub + module PubSubHubbub + + # Subscribe to a pubsub topic + # + # @param topic [String] A recoginized and supported pubsub topic + # @param callback [String] A callback url to be posted to when the topic event is fired + # @param secret [String] An optional shared secret used to generate a SHA1 HMAC of the outgoing body content + # @return [Boolean] true if the subscribe was successful, otherwise an error is raised + # @see https://developer.github.com/v3/repos/hooks/#subscribing + # @example Subscribe to push events from one of your repositories, having an email sent when fired + # client = Octokit::Client.new(:oauth_token = "token") + # client.subscribe("https://github.com/joshk/devise_imapable/events/push", "github://Email?address=josh.kalderimis@gmail.com") + def subscribe(topic, callback, secret = nil) + options = { + :"hub.callback" => callback, + :"hub.mode" => "subscribe", + :"hub.topic" => topic + } + options.merge!(:"hub.secret" => secret) unless secret.nil? + + response = pub_sub_hubbub_request(options) + + response.status == 204 + end + + # Unsubscribe from a pubsub topic + # + # @param topic [String] A recoginized pubsub topic + # @param callback [String] A callback url to be unsubscribed from + # @return [Boolean] true if the unsubscribe was successful, otherwise an error is raised + # @see https://developer.github.com/v3/repos/hooks/#subscribing + # @example Unsubscribe to push events from one of your repositories, no longer having an email sent when fired + # client = Octokit::Client.new(:oauth_token = "token") + # client.unsubscribe("https://github.com/joshk/devise_imapable/events/push", "github://Email?address=josh.kalderimis@gmail.com") + def unsubscribe(topic, callback) + options = { + :"hub.callback" => callback, + :"hub.mode" => "unsubscribe", + :"hub.topic" => topic + } + response = pub_sub_hubbub_request(options) + + response.status == 204 + end + + # Subscribe to a repository through pubsub + # + # @param repo [String, Repository, Hash] A GitHub repository + # @param service_name [String] service name owner + # @param service_arguments [Hash] params that will be passed by subscribed hook. + # List of services is available @ https://github.com/github/github-services/tree/master/docs. + # Please refer Data node for complete list of arguments. + # @param secret [String] An optional shared secret used to generate a SHA1 HMAC of the outgoing body content + # @return [Boolean] True if subscription successful, false otherwise + # @see https://developer.github.com/v3/repos/hooks/#subscribing + # @example Subscribe to push events to one of your repositories to Travis-CI + # client = Octokit::Client.new(:oauth_token = "token") + # client.subscribe_service_hook('joshk/device_imapable', 'Travis', { :token => "test", :domain => "domain", :user => "user" }) + def subscribe_service_hook(repo, service_name, service_arguments = {}, secret = nil) + topic = "#{Octokit.web_endpoint}#{Repository.new(repo)}/events/push" + callback = "github://#{service_name}?#{service_arguments.collect{ |k,v| [ k,v ].map{ |p| URI.encode_www_form_component(p) }.join("=") }.join("&") }" + subscribe(topic, callback, secret) + end + + # Unsubscribe repository through pubsub + # + # @param repo [String, Repository, Hash] A GitHub repository + # @param service_name [String] service name owner + # List of services is available @ https://github.com/github/github-services/tree/master/docs. + # @see https://developer.github.com/v3/repos/hooks/#subscribing + # @example Subscribe to push events to one of your repositories to Travis-CI + # client = Octokit::Client.new(:oauth_token = "token") + # client.unsubscribe_service_hook('joshk/device_imapable', 'Travis') + def unsubscribe_service_hook(repo, service_name) + topic = "#{Octokit.web_endpoint}#{Repository.new(repo)}/events/push" + callback = "github://#{service_name}" + unsubscribe(topic, callback) + end + + private + + def pub_sub_hubbub_request(options = {}) + # This method is janky, bypass normal stack so we don't + # serialize request as JSON + conn = Faraday.new(:url => @api_endpoint) do |http| + http.headers[:user_agent] = user_agent + if basic_authenticated? + http.basic_auth(@login, @password) + elsif token_authenticated? + http.authorization 'token', @access_token + end + http.request :url_encoded + http.use Octokit::Response::RaiseError + http.adapter Faraday.default_adapter + end + + conn.post do |req| + req.url "hub" + req.headers['Content-Type'] = 'application/x-www-form-urlencoded' + req.body = options + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/pull_requests.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/pull_requests.rb new file mode 100644 index 000000000000..d90bcd4b0ae2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/pull_requests.rb @@ -0,0 +1,303 @@ +module Octokit + class Client + + # Methods for the Pull Requests API + # + # @see https://developer.github.com/v3/pulls/ + module PullRequests + + # List pull requests for a repository + # + # @overload pull_requests(repo, options) + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param options [Hash] Method options + # @option options [String] :state `open` or `closed` or `all`. + # @return [Array<Sawyer::Resource>] Array of pulls + # @see https://developer.github.com/v3/pulls/#list-pull-requests + # @example + # Octokit.pull_requests('rails/rails', :state => 'closed') + def pull_requests(repo, options = {}) + paginate "#{Repository.path repo}/pulls", options + end + alias :pulls :pull_requests + + # Get a pull request + # + # @see https://developer.github.com/v3/pulls/#get-a-single-pull-request + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number of the pull request to fetch + # @return [Sawyer::Resource] Pull request info + # @example + # Octokit.pull_request('rails/rails', 42, :state => 'closed') + def pull_request(repo, number, options = {}) + get "#{Repository.path repo}/pulls/#{number}", options + end + alias :pull :pull_request + + # Create a pull request + # + # @see https://developer.github.com/v3/pulls/#create-a-pull-request + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param base [String] The branch (or git ref) you want your changes + # pulled into. This should be an existing branch on the current + # repository. You cannot submit a pull request to one repo that requests + # a merge to a base of another repo. + # @param head [String] The branch (or git ref) where your changes are implemented. + # @param title [String] Title for the pull request + # @param body [String] The body for the pull request (optional). Supports GFM. + # @return [Sawyer::Resource] The newly created pull request + # @example + # @client.create_pull_request("octokit/octokit.rb", "master", "feature-branch", + # "Pull Request title", "Pull Request body") + def create_pull_request(repo, base, head, title, body = nil, options = {}) + pull = { + :base => base, + :head => head, + :title => title, + } + pull[:body] = body unless body.nil? + post "#{Repository.path repo}/pulls", options.merge(pull) + end + + # Create a pull request from existing issue + # + # @see https://developer.github.com/v3/pulls/#alternative-input + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param base [String] The branch (or git ref) you want your changes + # pulled into. This should be an existing branch on the current + # repository. You cannot submit a pull request to one repo that requests + # a merge to a base of another repo. + # @param head [String] The branch (or git ref) where your changes are implemented. + # @param issue [Integer] Number of Issue on which to base this pull request + # @return [Sawyer::Resource] The newly created pull request + def create_pull_request_for_issue(repo, base, head, issue, options = {}) + pull = { + :base => base, + :head => head, + :issue => issue + } + post "#{Repository.path repo}/pulls", options.merge(pull) + end + + # Update a pull request + # @overload update_pull_request(repo, number, title=nil, body=nil, state=nil, options = {}) + # @deprecated + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param number [Integer] Number of pull request to update. + # @param title [String] Title for the pull request. + # @param body [String] Body content for pull request. Supports GFM. + # @param state [String] State of the pull request. `open` or `closed`. + # @overload update_pull_request(repo, number, options = {}) + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param number [Integer] Number of pull request to update. + # @option options [String] :title Title for the pull request. + # @option options [String] :body Body for the pull request. + # @option options [String] :state State for the pull request. + # @return [Sawyer::Resource] Hash representing updated pull request. + # @see https://developer.github.com/v3/pulls/#update-a-pull-request + # @example + # @client.update_pull_request('octokit/octokit.rb', 67, 'new title', 'updated body', 'closed') + # @example Passing nil for optional attributes to update specific attributes. + # @client.update_pull_request('octokit/octokit.rb', 67, nil, nil, 'open') + # @example Empty body by passing empty string + # @client.update_pull_request('octokit/octokit.rb', 67, nil, '') + def update_pull_request(*args) + arguments = Octokit::Arguments.new(args) + repo = arguments.shift + number = arguments.shift + patch "#{Repository.path repo}/pulls/#{number}", arguments.options + end + + # Close a pull request + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param number [Integer] Number of pull request to update. + # @return [Sawyer::Resource] Hash representing updated pull request. + # @see https://developer.github.com/v3/pulls/#update-a-pull-request + # @example + # @client.close_pull_request('octokit/octokit.rb', 67) + def close_pull_request(repo, number, options = {}) + options.merge! :state => 'closed' + update_pull_request(repo, number, options) + end + + # List commits on a pull request + # + # @see https://developer.github.com/v3/pulls/#list-commits-on-a-pull-request + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number of pull request + # @return [Array<Sawyer::Resource>] List of commits + def pull_request_commits(repo, number, options = {}) + paginate "#{Repository.path repo}/pulls/#{number}/commits", options + end + alias :pull_commits :pull_request_commits + + # List pull request comments for a repository + # + # By default, Review Comments are ordered by ascending ID. + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param options [Hash] Optional parameters + # @option options [String] :sort created or updated + # @option options [String] :direction asc or desc. Ignored without sort + # parameter. + # @option options [String] :since Timestamp in ISO 8601 + # format: YYYY-MM-DDTHH:MM:SSZ + # + # @return [Array] List of pull request review comments. + # + # @see https://developer.github.com/v3/pulls/comments/#list-comments-in-a-repository + # + # @example Get the pull request review comments in the octokit repository + # @client.issues_comments("octokit/octokit.rb") + # + # @example Get review comments, sort by updated asc since a time + # @client.pull_requests_comments("octokit/octokit.rb", { + # :sort => 'updated', + # :direction => 'asc', + # :since => '2010-05-04T23:45:02Z' + # }) + def pull_requests_comments(repo, options = {}) + paginate("#{Repository.path repo}/pulls/comments", options) + end + alias :pulls_comments :pull_requests_comments + alias :reviews_comments :pull_requests_comments + + # List comments on a pull request + # + # @see https://developer.github.com/v3/pulls/comments/#list-comments-on-a-pull-request + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number of pull request + # @return [Array<Sawyer::Resource>] List of comments + def pull_request_comments(repo, number, options = {}) + # return the comments for a pull request + paginate("#{Repository.path repo}/pulls/#{number}/comments", options) + end + alias :pull_comments :pull_request_comments + alias :review_comments :pull_request_comments + + # Get a pull request comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param comment_id [Integer] Id of comment to get + # @return [Sawyer::Resource] Hash representing the comment + # @see https://developer.github.com/v3/pulls/comments/#get-a-single-comment + # @example + # @client.pull_request_comment("pengwynn/octkit", 1903950) + def pull_request_comment(repo, comment_id, options = {}) + get "#{Repository.path repo}/pulls/comments/#{comment_id}", options + end + alias :pull_comment :pull_request_comment + alias :review_comment :pull_request_comment + + # Create a pull request comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param pull_id [Integer] Pull request id + # @param body [String] Comment content + # @param commit_id [String] Sha of the commit to comment on. + # @param path [String] Relative path of the file to comment on. + # @param position [Integer] Line index in the diff to comment on. + # @return [Sawyer::Resource] Hash representing the new comment + # @see https://developer.github.com/v3/pulls/comments/#create-a-comment + # @example + # @client.create_pull_request_comment("octokit/octokit.rb", 163, ":shipit:", + # "2d3201e4440903d8b04a5487842053ca4883e5f0", "lib/octokit/request.rb", 47) + def create_pull_request_comment(repo, pull_id, body, commit_id, path, position, options = {}) + options.merge!({ + :body => body, + :commit_id => commit_id, + :path => path, + :position => position + }) + post "#{Repository.path repo}/pulls/#{pull_id}/comments", options + end + alias :create_pull_comment :create_pull_request_comment + alias :create_view_comment :create_pull_request_comment + + # Create reply to a pull request comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param pull_id [Integer] Pull request id + # @param body [String] Comment contents + # @param comment_id [Integer] Comment id to reply to + # @return [Sawyer::Resource] Hash representing new comment + # @see https://developer.github.com/v3/pulls/comments/#create-a-comment + # @example + # @client.create_pull_request_comment_reply("octokit/octokit.rb", 163, "done.", 1903950) + def create_pull_request_comment_reply(repo, pull_id, body, comment_id, options = {}) + options.merge!({ + :body => body, + :in_reply_to => comment_id + }) + post "#{Repository.path repo}/pulls/#{pull_id}/comments", options + end + alias :create_pull_reply :create_pull_request_comment_reply + alias :create_review_reply :create_pull_request_comment_reply + + # Update pull request comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param comment_id [Integer] Id of the comment to update + # @param body [String] Updated comment content + # @return [Sawyer::Resource] Hash representing the updated comment + # @see https://developer.github.com/v3/pulls/comments/#edit-a-comment + # @example + # @client.update_pull_request_comment("octokit/octokit.rb", 1903950, ":shipit:") + def update_pull_request_comment(repo, comment_id, body, options = {}) + options.merge! :body => body + patch("#{Repository.path repo}/pulls/comments/#{comment_id}", options) + end + alias :update_pull_comment :update_pull_request_comment + alias :update_review_comment :update_pull_request_comment + + # Delete pull request comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param comment_id [Integer] Id of the comment to delete + # @return [Boolean] True if deleted, false otherwise + # @see https://developer.github.com/v3/pulls/comments/#delete-a-comment + # @example + # @client.delete_pull_request_comment("octokit/octokit.rb", 1902707) + def delete_pull_request_comment(repo, comment_id, options = {}) + boolean_from_response(:delete, "#{Repository.path repo}/pulls/comments/#{comment_id}", options) + end + alias :delete_pull_comment :delete_pull_request_comment + alias :delete_review_comment :delete_pull_request_comment + + # List files on a pull request + # + # @see https://developer.github.com/v3/pulls/#list-pull-requests-files + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number of pull request + # @return [Array<Sawyer::Resource>] List of files + def pull_request_files(repo, number, options = {}) + paginate "#{Repository.path repo}/pulls/#{number}/files", options + end + alias :pull_files :pull_request_files + + # Merge a pull request + # + # @see https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number of pull request + # @param commit_message [String] Optional commit message for the merge commit + # @return [Array<Sawyer::Resource>] Merge commit info if successful + def merge_pull_request(repo, number, commit_message='', options = {}) + put "#{Repository.path repo}/pulls/#{number}/merge", options.merge({:commit_message => commit_message}) + end + + # Check pull request merge status + # + # @see https://developer.github.com/v3/pulls/#get-if-a-pull-request-has-been-merged + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number of pull request + # @return [Boolean] True if the pull request has been merged + def pull_merged?(repo, number, options = {}) + boolean_from_response :get, "#{Repository.path repo}/pulls/#{number}/merge", options + end + alias :pull_request_merged? :pull_merged? + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/rate_limit.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/rate_limit.rb new file mode 100644 index 000000000000..8cdae88db3d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/rate_limit.rb @@ -0,0 +1,54 @@ +module Octokit + class Client + + # Methods for API rate limiting info + # + # @see https://developer.github.com/v3/#rate-limiting + module RateLimit + + # Get rate limit info from last response if available + # or make a new request to fetch rate limit + # + # @see https://developer.github.com/v3/rate_limit/#rate-limit + # @return [Octokit::RateLimit] Rate limit info + def rate_limit(options = {}) + return rate_limit! if last_response.nil? + + Octokit::RateLimit.from_response(last_response) + end + alias ratelimit rate_limit + + # Get number of rate limted requests remaining + # + # @see https://developer.github.com/v3/rate_limit/#rate-limit + # @return [Integer] Number of requests remaining in this period + def rate_limit_remaining(options = {}) + octokit_warn "Deprecated: Please use .rate_limit.remaining" + rate_limit.remaining + end + alias ratelimit_remaining rate_limit_remaining + + # Refresh rate limit info by making a new request + # + # @see https://developer.github.com/v3/rate_limit/#rate-limit + # @return [Octokit::RateLimit] Rate limit info + def rate_limit!(options = {}) + get "rate_limit" + Octokit::RateLimit.from_response(last_response) + end + alias ratelimit! rate_limit! + + # Refresh rate limit info and get number of rate limted requests remaining + # + # @see https://developer.github.com/v3/rate_limit/#rate-limit + # @return [Integer] Number of requests remaining in this period + def rate_limit_remaining!(options = {}) + octokit_warn "Deprecated: Please use .rate_limit!.remaining" + rate_limit!.remaining + end + alias ratelimit_remaining! rate_limit_remaining! + + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/reactions.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/reactions.rb new file mode 100644 index 000000000000..0d2965550098 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/reactions.rb @@ -0,0 +1,158 @@ +module Octokit + class Client + + # Methods for the Reacions API + # + # @see https://developer.github.com/v3/reactions/ + module Reactions + + # List reactions for a commit comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The id of the commit comment + # @see https://developer.github.com/v3/reactions/#list-reactions-for-a-commit-comment + # + # @example + # @client.commit_comment_reactions("octokit/octokit.rb", 1) + # + # @return [Array<Sawyer::Resource>] Array of Hashes representing the reactions. + def commit_comment_reactions(repo, id, options = {}) + options = ensure_api_media_type(:reactions, options) + get "#{Repository.path repo}/comments/#{id}/reactions", options + end + + # Create a reaction for a commit comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The id of the commit comment + # @param reaction [String] The Reaction + # @see https://developer.github.com/v3/reactions/#create-reaction-for-a-commit-comment + # @see https://developer.github.com/v3/reactions/#reaction-types + # + # @example + # @client.create_commit_comment_reactions("octokit/octokit.rb", 1) + # + # @return [<Sawyer::Resource>] Hash representing the reaction + def create_commit_comment_reaction(repo, id, reaction, options = {}) + options = ensure_api_media_type(:reactions, options.merge(:content => reaction)) + post "#{Repository.path repo}/comments/#{id}/reactions", options + end + + # List reactions for an issue + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] The Issue number + # @see https://developer.github.com/v3/reactions/#list-reactions-for-an-issue + # + # @example + # @client.issue_reactions("octokit/octokit.rb", 1) + # + # @return [Array<Sawyer::Resource>] Array of Hashes representing the reactions. + def issue_reactions(repo, number, options = {}) + options = ensure_api_media_type(:reactions, options) + get "#{Repository.path repo}/issues/#{number}/reactions", options + end + + # Create reaction for an issue + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] The Issue number + # @param reaction [String] The Reaction + # + # @see https://developer.github.com/v3/reactions/#create-reaction-for-an-issue + # @see https://developer.github.com/v3/reactions/#reaction-types + # + # @example + # @client.create_issue_reaction("octokit/octokit.rb", 1) + # + # @return [<Sawyer::Resource>] Hash representing the reaction. + def create_issue_reaction(repo, number, reaction, options = {}) + options = ensure_api_media_type(:reactions, options.merge(:content => reaction)) + post "#{Repository.path repo}/issues/#{number}/reactions", options + end + + # List reactions for an issue comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The Issue comment id + # + # @see https://developer.github.com/v3/reactions/#list-reactions-for-an-issue-comment + # + # @example + # @client.issue_comment_reactions("octokit/octokit.rb", 1) + # + # @return [Array<Sawyer::Resource>] Array of Hashes representing the reactions. + def issue_comment_reactions(repo, id, options = {}) + options = ensure_api_media_type(:reactions, options) + get "#{Repository.path repo}/issues/comments/#{id}/reactions", options + end + + # Create reaction for an issue comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The Issue comment id + # @param reaction [String] The Reaction + # + # @see https://developer.github.com/v3/reactions/#create-reaction-for-an-issue-comment + # @see https://developer.github.com/v3/reactions/#reaction-types + # + # @example + # @client.create_issue_comment_reaction("octokit/octokit.rb", 1) + # + # @return [<Sawyer::Resource>] Hashes representing the reaction. + def create_issue_comment_reaction(repo, id, reaction, options = {}) + options = ensure_api_media_type(:reactions, options.merge(:content => reaction)) + post "#{Repository.path repo}/issues/comments/#{id}/reactions", options + end + + # List reactions for a pull request review comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The Issue comment id + # + # @see https://developer.github.com/v3/reactions/#list-reactions-for-a-pull-request-review-comment + # + # @example + # @client.pull_request_review_comment_reactions("octokit/octokit.rb", 1) + # + # @return [Array<Sawyer::Resource>] Array of Hashes representing the reactions. + def pull_request_review_comment_reactions(repo, id, options = {}) + options = ensure_api_media_type(:reactions, options) + get "#{Repository.path repo}/pulls/comments/#{id}/reactions", options + end + + # Create reaction for a pull request review comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The Issue comment id + # @param reaction [String] The Reaction + # + # @see https://developer.github.com/v3/reactions/#create-reaction-for-a-pull-request-review-comment + # @see https://developer.github.com/v3/reactions/#reaction-types + # + # @example + # @client.create_pull_request_reiew_comment_reaction("octokit/octokit.rb", 1) + # + # @return [<Sawyer::Resource>] Hash representing the reaction. + def create_pull_request_review_comment_reaction(repo, id, reaction, options = {}) + options = ensure_api_media_type(:reactions, options.merge(:content => reaction)) + post "#{Repository.path repo}/pulls/comments/#{id}/reactions", options + end + + # Delete a reaction + # + # @param id [Integer] Reaction id + # + # @see https://developer.github.com/v3/reactions/#delete-a-reaction + # + # @example + # @client.delete_reaction(1) + # + # @return [Boolean] Return true if reaction was deleted, false otherwise. + def delete_reaction(id, options = {}) + options = ensure_api_media_type(:reactions, options) + boolean_from_response :delete, "reactions/#{id}", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/refs.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/refs.rb new file mode 100644 index 000000000000..38e8ce7f9102 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/refs.rb @@ -0,0 +1,122 @@ +module Octokit + class Client + + # Methods for References for Git Data API + # + # @see https://developer.github.com/v3/git/refs/ + module Refs + + # List all refs for a given user and repo + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param namespace [String] The ref namespace, e.g. <tt>tag</tt> or <tt>heads</tt> + # @return [Array<Sawyer::Resource>] A list of references matching the repo and the namespace + # @see https://developer.github.com/v3/git/refs/#get-all-references + # @example Fetch all refs for sferik/rails_admin + # Octokit.refs("sferik/rails_admin") + def refs(repo, namespace = nil, options = {}) + path = "#{Repository.path repo}/git/refs" + path += "/#{namespace}" unless namespace.nil? + paginate path, options + end + alias :list_refs :refs + alias :references :refs + alias :list_references :refs + + # Fetch a given reference + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param ref [String] The ref, e.g. <tt>tags/v0.0.3</tt> + # @return [Sawyer::Resource] The reference matching the given repo and the ref id + # @see https://developer.github.com/v3/git/refs/#get-a-reference + # @example Fetch tags/v0.0.3 for sferik/rails_admin + # Octokit.ref("sferik/rails_admin","tags/v0.0.3") + def ref(repo, ref, options = {}) + get "#{Repository.path repo}/git/refs/#{ref}", options + end + alias :reference :ref + + # Create a reference + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param ref [String] The ref, e.g. <tt>tags/v0.0.3</tt> + # @param sha [String] A SHA, e.g. <tt>827efc6d56897b048c772eb4087f854f46256132</tt> + # @return [Array<Sawyer::Resource>] The list of references, already containing the new one + # @see https://developer.github.com/v3/git/refs/#create-a-reference + # @example Create refs/heads/master for octocat/Hello-World with sha 827efc6d56897b048c772eb4087f854f46256132 + # Octokit.create_ref("octocat/Hello-World", "heads/master", "827efc6d56897b048c772eb4087f854f46256132") + def create_ref(repo, ref, sha, options = {}) + ref = "refs/#{ref}" unless ref =~ %r{refs/} + parameters = { + :ref => ref, + :sha => sha + } + post "#{Repository.path repo}/git/refs", options.merge(parameters) + end + alias :create_reference :create_ref + + # Update a reference + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param ref [String] The ref, e.g. <tt>tags/v0.0.3</tt> + # @param sha [String] A SHA, e.g. <tt>827efc6d56897b048c772eb4087f854f46256132</tt> + # @param force [Boolean] A flag indicating whether to force the update or to make sure the update is a fast-forward update. + # @return [Array<Sawyer::Resource>] The list of references updated + # @see https://developer.github.com/v3/git/refs/#update-a-reference + # @example Force update heads/sc/featureA for octocat/Hello-World with sha aa218f56b14c9653891f9e74264a383fa43fefbd + # Octokit.update_ref("octocat/Hello-World", "heads/sc/featureA", "aa218f56b14c9653891f9e74264a383fa43fefbd") + # @example Fast-forward update heads/sc/featureA for octocat/Hello-World with sha aa218f56b14c9653891f9e74264a383fa43fefbd + # Octokit.update_ref("octocat/Hello-World", "heads/sc/featureA", "aa218f56b14c9653891f9e74264a383fa43fefbd", false) + def update_ref(repo, ref, sha, force = true, options = {}) + parameters = { + :sha => sha, + :force => force + } + patch "#{Repository.path repo}/git/refs/#{ref}", options.merge(parameters) + end + alias :update_reference :update_ref + + # Update a branch + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param branch [String] The ref, e.g. <tt>feature/new-shiny</tt> + # @param sha [String] A SHA, e.g. <tt>827efc6d56897b048c772eb4087f854f46256132</tt> + # @param force [Boolean] A flag indicating whether to force the update or to make sure the update is a fast-forward update. + # @return [Array<Sawyer::Resource>] The list of references updated + # @see https://developer.github.com/v3/git/refs/#update-a-reference + # @example Force update heads/sc/featureA for octocat/Hello-World with sha aa218f56b14c9653891f9e74264a383fa43fefbd + # Octokit.update_branch("octocat/Hello-World", "sc/featureA", "aa218f56b14c9653891f9e74264a383fa43fefbd") + # @example Fast-forward update heads/sc/featureA for octocat/Hello-World with sha aa218f56b14c9653891f9e74264a383fa43fefbd + # Octokit.update_branch("octocat/Hello-World", "sc/featureA", "aa218f56b14c9653891f9e74264a383fa43fefbd", false) + def update_branch(repo, branch, sha, force = true, options = {}) + update_ref repo, "heads/#{branch}", sha, force, options + end + + # Delete a single branch + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param branch [String] The branch, e.g. <tt>fix-refs</tt> + # @return [Boolean] Success + # @see https://developer.github.com/v3/git/refs/#delete-a-reference + # @example Delete uritemplate for sigmavirus24/github3.py + # Octokit.delete_branch("sigmavirus24/github3.py", "uritemplate") + def delete_branch(repo, branch, options = {}) + delete_ref repo, "heads/#{branch}", options + end + + # Delete a single reference + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param ref [String] The ref, e.g. <tt>tags/v0.0.3</tt> + # @return [Boolean] Success + # @see https://developer.github.com/v3/git/refs/#delete-a-reference + # @example Delete tags/v0.0.3 for sferik/rails_admin + # Octokit.delete_ref("sferik/rails_admin","tags/v0.0.3") + def delete_ref(repo, ref, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/git/refs/#{ref}", options + end + alias :delete_reference :delete_ref + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/releases.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/releases.rb new file mode 100644 index 000000000000..fe41be75ecd5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/releases.rb @@ -0,0 +1,164 @@ +module Octokit + class Client + + # Methods for the Releases API + # + # @see https://developer.github.com/v3/repos/releases/ + module Releases + + # List releases for a repository + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] A list of releases + # @see https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository + def releases(repo, options = {}) + paginate "#{Repository.path repo}/releases", options + end + alias :list_releases :releases + + # Create a release + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param tag_name [String] Git tag from which to create release + # @option options [String] :target_commitish Specifies the commitish value that determines where the Git tag is created from. + # @option options [String] :name Name for the release + # @option options [String] :body Content for release notes + # @option options [Boolean] :draft Mark this release as a draft + # @option options [Boolean] :prerelease Mark this release as a pre-release + # @return [Sawyer::Resource] The release + # @see https://developer.github.com/v3/repos/releases/#create-a-release + def create_release(repo, tag_name, options = {}) + opts = options.merge(:tag_name => tag_name) + post "#{Repository.path repo}/releases", opts + end + + # Get a release + # + # @param url [String] URL for the release as returned from .releases + # @return [Sawyer::Resource] The release + # @see https://developer.github.com/v3/repos/releases/#get-a-single-release + def release(url, options = {}) + get url, options + end + + # Update a release + # + # @param url [String] URL for the release as returned from .releases + # @option options [String] :tag_name Git tag from which to create release + # @option options [String] :target_commitish Specifies the commitish value that determines where the Git tag is created from. + # @option options [String] :name Name for the release + # @option options [String] :body Content for release notes + # @option options [Boolean] :draft Mark this release as a draft + # @option options [Boolean] :prerelease Mark this release as a pre-release + # @return [Sawyer::Resource] The release + # @see https://developer.github.com/v3/repos/releases/#edit-a-release + def update_release(url, options = {}) + patch url, options + end + alias :edit_release :update_release + + # Delete a release + # + # @param url [String] URL for the release as returned from .releases + # @return [Boolean] Success or failure + # @see https://developer.github.com/v3/repos/releases/#delete-a-release + def delete_release(url, options = {}) + boolean_from_response(:delete, url, options) + end + + # List release assets + # + # @param release_url [String] URL for the release as returned from .releases + # @return [Array<Sawyer::Resource>] A list of release assets + # @see https://developer.github.com/v3/repos/releases/#list-assets-for-a-release + def release_assets(release_url, options = {}) + paginate release(release_url).rels[:assets].href, options + end + + # Upload a release asset + # + # @param release_url [String] URL for the release as returned from .releases + # @param path_or_file [String] Path to file to upload + # @option options [String] :content_type The MIME type for the file to upload + # @option options [String] :name The name for the file + # @return [Sawyer::Resource] The release asset + # @see https://developer.github.com/v3/repos/releases/#upload-a-release-asset + def upload_asset(release_url, path_or_file, options = {}) + file = path_or_file.respond_to?(:read) ? path_or_file : File.new(path_or_file, "rb") + options[:content_type] ||= content_type_from_file(file) + raise Octokit::MissingContentType.new if options[:content_type].nil? + unless name = options[:name] + name = File.basename(file.path) + end + upload_url = release(release_url).rels[:upload].href_template.expand(:name => name) + + request :post, upload_url, file.read, parse_query_and_convenience_headers(options) + ensure + file.close if file + end + + # Get a single release asset + # + # + # @param asset_url [String] URL for the asset as returned from .release_assets + # @return [Sawyer::Resource] The release asset + # @see https://developer.github.com/v3/repos/releases/#get-a-single-release-asset + def release_asset(asset_url, options = {}) + get(asset_url, options) + end + + # Update a release asset + # + # @param asset_url [String] URL for the asset as returned from .release_assets + # @option options [String] :name The name for the file + # @option options [String] :label The download text for the file + # @return [Sawyer::Resource] The release asset + # @see https://developer.github.com/v3/repos/releases/#edit-a-release-asset + def update_release_asset(asset_url, options = {}) + patch(asset_url, options) + end + alias :edit_release_asset :update_release_asset + + # Delete a release asset + # + # @param asset_url [String] URL for the asset as returned from .release_assets + # @return [Boolean] Success or failure + # @see https://developer.github.com/v3/repos/releases/#delete-a-release-asset + def delete_release_asset(asset_url, options = {}) + boolean_from_response(:delete, asset_url, options) + end + + # Get the release for a given tag + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param tag_name [String] the name for a tag + # @return [Sawyer::Resource] The release + # @see https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name + def release_for_tag(repo, tag_name, options = {}) + get "#{Repository.path repo}/releases/tags/#{tag_name}", options + end + + # Get the latest release + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Sawyer::Resource] The release + # @see https://developer.github.com/v3/repos/releases/#get-the-latest-release + def latest_release(repo, options = {}) + get "#{Repository.path repo}/releases/latest", options + end + + private + + def content_type_from_file(file) + require 'mime/types' + if mime_type = MIME::Types.type_for(file.path).first + mime_type.content_type + end + rescue LoadError + msg = "Please pass content_type or install mime-types gem to guess content type from file" + raise Octokit::MissingContentType.new(msg) + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/repositories.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/repositories.rb new file mode 100644 index 000000000000..b9057e942026 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/repositories.rb @@ -0,0 +1,781 @@ +module Octokit + class Client + + # Methods for the Repositories API + # + # @see https://developer.github.com/v3/repos/ + module Repositories + + # Check if a repository exists + # + # @see https://developer.github.com/v3/repos/#get + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Boolean] + def repository?(repo, options = {}) + !!repository(repo, options) + rescue Octokit::InvalidRepository + false + rescue Octokit::NotFound + false + end + + # Get a single repository + # + # @see https://developer.github.com/v3/repos/#get + # @see https://developer.github.com/v3/licenses/#get-a-repositorys-license + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Sawyer::Resource] Repository information + def repository(repo, options = {}) + get Repository.path(repo), options + end + alias :repo :repository + + # Edit a repository + # + # @see https://developer.github.com/v3/repos/#update-a-repository + # @param repo [String, Hash, Repository] A GitHub repository + # @param options [Hash] Repository information to update + # @option options [String] :name Name of the repo + # @option options [String] :description Description of the repo + # @option options [String] :homepage Home page of the repo + # @option options [String] :private `true` makes the repository private, and `false` makes it public. + # @option options [String] :has_issues `true` enables issues for this repo, `false` disables issues. + # @option options [String] :has_wiki `true` enables wiki for this repo, `false` disables wiki. + # @option options [Boolean] :is_template `true` makes the repository a template, `false` makes it not a template. + # @option options [String] :has_downloads `true` enables downloads for this repo, `false` disables downloads. + # @option options [String] :default_branch Update the default branch for this repository. + # @return [Sawyer::Resource] Repository information + def edit_repository(repo, options = {}) + repo = Repository.new(repo) + if options.include? :is_template + options = ensure_api_media_type(:template_repositories, options) + end + options[:name] ||= repo.name + patch "repos/#{repo}", options + end + alias :edit :edit_repository + alias :update_repository :edit_repository + alias :update :edit_repository + + # List user repositories + # + # If user is not supplied, repositories for the current + # authenticated user are returned. + # + # @note If the user provided is a GitHub organization, only the + # organization's public repositories will be listed. For retrieving + # organization repositories the {Organizations#organization_repositories} + # method should be used instead. + # @see https://developer.github.com/v3/repos/#list-your-repositories + # @see https://developer.github.com/v3/repos/#list-user-repositories + # @param user [Integer, String] Optional GitHub user login or id for which + # to list repos. + # @return [Array<Sawyer::Resource>] List of repositories + def repositories(user=nil, options = {}) + paginate "#{User.path user}/repos", options + end + alias :list_repositories :repositories + alias :list_repos :repositories + alias :repos :repositories + + # List all repositories + # + # This provides a dump of every repository, in the order that they were + # created. + # + # @see https://developer.github.com/v3/repos/#list-all-public-repositories + # + # @param options [Hash] Optional options + # @option options [Integer] :since The integer ID of the last Repository + # that you’ve seen. + # @return [Array<Sawyer::Resource>] List of repositories. + def all_repositories(options = {}) + paginate 'repositories', options + end + + # Star a repository + # + # @param repo [String, Hash, Repository] A GitHub repository + # @return [Boolean] `true` if successfully starred + # @see https://developer.github.com/v3/activity/starring/#star-a-repository + def star(repo, options = {}) + boolean_from_response :put, "user/starred/#{Repository.new(repo)}", options + end + + # Unstar a repository + # + # @param repo [String, Hash, Repository] A GitHub repository + # @return [Boolean] `true` if successfully unstarred + # @see https://developer.github.com/v3/activity/starring/#unstar-a-repository + def unstar(repo, options = {}) + boolean_from_response :delete, "user/starred/#{Repository.new(repo)}", options + end + + # Watch a repository + # + # @param repo [String, Hash, Repository] A GitHub repository + # @return [Boolean] `true` if successfully watched + # @deprecated Use #star instead + # @see https://developer.github.com/v3/activity/watching/#watch-a-repository-legacy + def watch(repo, options = {}) + boolean_from_response :put, "user/watched/#{Repository.new(repo)}", options + end + + # Unwatch a repository + # + # @param repo [String, Hash, Repository] A GitHub repository + # @return [Boolean] `true` if successfully unwatched + # @deprecated Use #unstar instead + # @see https://developer.github.com/v3/activity/watching/#stop-watching-a-repository-legacy + def unwatch(repo, options = {}) + boolean_from_response :delete, "user/watched/#{Repository.new(repo)}", options + end + + # Fork a repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Sawyer::Resource] Repository info for the new fork + # @see https://developer.github.com/v3/repos/forks/#create-a-fork + def fork(repo, options = {}) + post "#{Repository.path repo}/forks", options + end + + # Create a repository for a user or organization + # + # @param name [String] Name of the new repo + # @option options [String] :description Description of the repo + # @option options [String] :homepage Home page of the repo + # @option options [String] :private `true` makes the repository private, and `false` makes it public. + # @option options [String] :has_issues `true` enables issues for this repo, `false` disables issues. + # @option options [String] :has_wiki `true` enables wiki for this repo, `false` disables wiki. + # @option options [Boolean] :is_template `true` makes this repo available as a template repository, `false` to prevent it. + # @option options [String] :has_downloads `true` enables downloads for this repo, `false` disables downloads. + # @option options [String] :organization Short name for the org under which to create the repo. + # @option options [Integer] :team_id The id of the team that will be granted access to this repository. This is only valid when creating a repo in an organization. + # @option options [Boolean] :auto_init `true` to create an initial commit with empty README. Default is `false`. + # @option options [String] :gitignore_template Desired language or platform .gitignore template to apply. Ignored if auto_init parameter is not provided. + # @return [Sawyer::Resource] Repository info for the new repository + # @see https://developer.github.com/v3/repos/#create + def create_repository(name, options = {}) + opts = options.dup + organization = opts.delete :organization + opts.merge! :name => name + if opts.include? :is_template + opts = ensure_api_media_type(:template_repositories, opts) + end + + if organization.nil? + post 'user/repos', opts + else + post "#{Organization.path organization}/repos", opts + end + end + alias :create_repo :create_repository + alias :create :create_repository + + # Delete repository + # + # Note: If OAuth is used, 'delete_repo' scope is required + # + # @see https://developer.github.com/v3/repos/#delete-a-repository + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Boolean] `true` if repository was deleted + def delete_repository(repo, options = {}) + boolean_from_response :delete, Repository.path(repo), options + end + alias :delete_repo :delete_repository + + # Transfer repository + # + # Transfer a repository owned by your organization + # + # @see https://developer.github.com/v3/repos/#transfer-a-repository + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param new_owner [String] The username or organization name the repository will be transferred to. + # @param options [Array<Integer>] :team_ids ID of the team or teams to add to the repository. Teams can only be added to organization-owned repositories. + # @return [Sawyer::Resource] Repository info for the transferred repository + def transfer_repository(repo, new_owner, options = {}) + options = ensure_api_media_type(:transfer_repository, options) + post "#{Repository.path repo}/transfer", options.merge({ new_owner: new_owner }) + end + alias :transfer_repo :transfer_repository + + # Create a repository for a user or organization generated from a template repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub template repository + # @param name [String] Name of the new repo + # @option options [String] :owner Organization or user who the new repository will belong to. + # @option options [String] :description Description of the repo + # @option options [String] :private `true` makes the repository private, and `false` makes it public. + # @option options [Boolean] :include_all_branches `true` copies all branches from the template repository, `false` (default) makes it only copy the master branch. + # @return [Sawyer::Resource] Repository info for the new repository + def create_repository_from_template(repo, name, options = {}) + options.merge! :name => name + options = ensure_api_media_type(:template_repositories, options) + post "#{Repository.path repo}/generate", options + end + alias :create_repo_from_template :create_repository_from_template + + # Hide a public repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Sawyer::Resource] Updated repository info + def set_private(repo, options = {}) + # GitHub Api for setting private updated to use private attr, rather than public + update_repository repo, options.merge({ :private => true }) + end + + # Unhide a private repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Sawyer::Resource] Updated repository info + def set_public(repo, options = {}) + # GitHub Api for setting private updated to use private attr, rather than public + update_repository repo, options.merge({ :private => false }) + end + + # Get deploy keys on a repo + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @return [Array<Sawyer::Resource>] Array of hashes representing deploy keys. + # @see https://developer.github.com/v3/repos/keys/#list-deploy-keys + # @example + # @client.deploy_keys('octokit/octokit.rb') + # @example + # @client.list_deploy_keys('octokit/octokit.rb') + def deploy_keys(repo, options = {}) + paginate "#{Repository.path repo}/keys", options + end + alias :list_deploy_keys :deploy_keys + + # Get a single deploy key for a repo + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param id [Integer] Deploy key ID. + # @return [Sawyer::Resource] Deploy key. + # @see https://developer.github.com/v3/repos/keys/#get-a-deploy-key + # @example + # @client.deploy_key('octokit/octokit.rb', 8675309) + def deploy_key(repo, id, options={}) + get "#{Repository.path repo}/keys/#{id}", options + end + + # Add deploy key to a repo + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param title [String] Title reference for the deploy key. + # @param key [String] Public key. + # @return [Sawyer::Resource] Hash representing newly added key. + # @see https://developer.github.com/v3/repos/keys/#add-a-new-deploy-key + # @example + # @client.add_deploy_key('octokit/octokit.rb', 'Staging server', 'ssh-rsa AAA...') + def add_deploy_key(repo, title, key, options = {}) + post "#{Repository.path repo}/keys", options.merge(:title => title, :key => key) + end + + # Edit a deploy key + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param id [Integer] Deploy key ID. + # @param options [Hash] Attributes to edit. + # @option title [String] Key title. + # @option key [String] Public key. + # @return [Sawyer::Resource] Updated deploy key. + # @deprecated This method is no longer supported in the API + # @see https://developer.github.com/changes/2014-02-24-finer-grained-scopes-for-ssh-keys/ + # @see https://developer.github.com/v3/repos/keys/#edit-a-deploy-key + # @example Update the key for a deploy key. + # @client.edit_deploy_key('octokit/octokit.rb', 8675309, :key => 'ssh-rsa BBB...') + # @example + # @client.update_deploy_key('octokit/octokit.rb', 8675309, :title => 'Uber', :key => 'ssh-rsa BBB...')) + def edit_deploy_key(repo, id, options) + patch "#{Repository.path repo}/keys/#{id}", options + end + alias :update_deploy_key :edit_deploy_key + + # Remove deploy key from a repo + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param id [Integer] Id of the deploy key to remove. + # @return [Boolean] True if key removed, false otherwise. + # @see https://developer.github.com/v3/repos/keys/#remove-a-deploy-key + # @example + # @client.remove_deploy_key('octokit/octokit.rb', 100000) + def remove_deploy_key(repo, id, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/keys/#{id}", options + end + + # List collaborators + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @option options [String] :affiliation Filters the return array by affiliation. + # Can be one of: <tt>outside</tt>, <tt>direct</tt>, or <tt>all</tt>. + # If not specified, defaults to <tt>all</tt> + # @return [Array<Sawyer::Resource>] Array of hashes representing collaborating users. + # @see https://developer.github.com/v3/repos/collaborators/#list-collaborators + # @example + # Octokit.collaborators('octokit/octokit.rb') + # @example + # Octokit.collabs('octokit/octokit.rb') + # @example + # @client.collabs('octokit/octokit.rb') + def collaborators(repo, options = {}) + paginate "#{Repository.path repo}/collaborators", options + end + alias :collabs :collaborators + + # Add collaborator to repo + # + # This can also be used to update the permission of an existing collaborator + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param collaborator [String] Collaborator GitHub username to add. + # @option options [String] :permission The permission to grant the collaborator. + # Only valid on organization-owned repositories. + # Can be one of: <tt>pull</tt>, <tt>push</tt>, or <tt>admin</tt>. + # If not specified, defaults to <tt>push</tt> + # @return [Boolean] True if collaborator added, false otherwise. + # @see https://developer.github.com/v3/repos/collaborators/#add-user-as-a-collaborator + # @example + # @client.add_collaborator('octokit/octokit.rb', 'holman') + # @example + # @client.add_collab('octokit/octokit.rb', 'holman') + # @example Add a collaborator with admin permissions + # @client.add_collaborator('octokit/octokit.rb', 'holman', permission: 'admin') + def add_collaborator(repo, collaborator, options = {}) + boolean_from_response :put, "#{Repository.path repo}/collaborators/#{collaborator}", options + end + alias :add_collab :add_collaborator + + # Remove collaborator from repo. + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param collaborator [String] Collaborator GitHub username to remove. + # @return [Boolean] True if collaborator removed, false otherwise. + # @see https://developer.github.com/v3/repos/collaborators/#remove-user-as-a-collaborator + # @example + # @client.remove_collaborator('octokit/octokit.rb', 'holman') + # @example + # @client.remove_collab('octokit/octokit.rb', 'holman') + def remove_collaborator(repo, collaborator, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/collaborators/#{collaborator}", options + end + alias :remove_collab :remove_collaborator + + # Checks if a user is a collaborator for a repo. + # + # Requires authenticated client. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param collaborator [String] Collaborator GitHub username to check. + # @return [Boolean] True if user is a collaborator, false otherwise. + # @see https://developer.github.com/v3/repos/collaborators/#check-if-a-user-is-a-collaborator + # @example + # @client.collaborator?('octokit/octokit.rb', 'holman') + def collaborator?(repo, collaborator, options={}) + boolean_from_response :get, "#{Repository.path repo}/collaborators/#{collaborator}", options + end + + # Get a user's permission level for a repo. + # + # Requires authenticated client + # + # @return [Sawyer::Resource] Hash representing the user's permission level for the given repository + # @see https://developer.github.com/v3/repos/collaborators/#review-a-users-permission-level + # @example + # @client.permission_level('octokit/octokit.rb', 'lizzhale') + def permission_level(repo, collaborator, options={}) + get "#{Repository.path repo}/collaborators/#{collaborator}/permission", options + end + + # List teams for a repo + # + # Requires authenticated client that is an owner or collaborator of the repo. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of hashes representing teams. + # @see https://developer.github.com/v3/repos/#list-teams + # @example + # @client.repository_teams('octokit/pengwynn') + # @example + # @client.repo_teams('octokit/pengwynn') + # @example + # @client.teams('octokit/pengwynn') + def repository_teams(repo, options = {}) + paginate "#{Repository.path repo}/teams", options + end + alias :repo_teams :repository_teams + alias :teams :repository_teams + + # List all topics for a repository + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Sawyer::Resource] representing the topics for given repo + # @see https://developer.github.com/v3/repos/#list-all-topics-for-a-repository + # @example List topics for octokit/octokit.rb + # Octokit.topics('octokit/octokit.rb') + # @example List topics for octokit/octokit.rb + # client.topics('octokit/octokit.rb') + def topics(repo, options = {}) + opts = ensure_api_media_type(:topics, options) + paginate "#{Repository.path repo}/topics", opts + end + + # Replace all topics for a repository + # + # Requires authenticated client. + # + # @param repo [Integer, String, Repository, Hash] A Github repository + # @param names [Array] An array of topics to add to the repository. + # @return [Sawyer::Resource] representing the replaced topics for given repo + # @see https://developer.github.com/v3/repos/#replace-all-topics-for-a-repository + # @example Replace topics for octokit/octokit.rb + # client.replace_all_topics('octokit/octokit.rb', ['octocat', 'atom', 'electron', 'API']) + # @example Clear all topics for octokit/octokit.rb + # client.replace_all_topics('octokit/octokit.rb', []) + def replace_all_topics(repo, names, options = {}) + opts = ensure_api_media_type(:topics, options) + put "#{Repository.path repo}/topics", opts.merge(:names => names) + end + + # List contributors to a repo + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param anon [Boolean] Set true to include anonymous contributors. + # @return [Array<Sawyer::Resource>] Array of hashes representing users. + # @see https://developer.github.com/v3/repos/#list-contributors + # @example + # Octokit.contributors('octokit/octokit.rb', true) + # @example + # Octokit.contribs('octokit/octokit.rb') + # @example + # @client.contribs('octokit/octokit.rb') + def contributors(repo, anon = nil, options = {}) + options[:anon] = 1 if anon.to_s[/1|true/] + paginate "#{Repository.path repo}/contributors", options + end + alias :contribs :contributors + + # List stargazers of a repo + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of hashes representing users. + # @see https://developer.github.com/v3/activity/starring/#list-stargazers + # @example + # Octokit.stargazers('octokit/octokit.rb') + # @example + # @client.stargazers('octokit/octokit.rb') + def stargazers(repo, options = {}) + paginate "#{Repository.path repo}/stargazers", options + end + + # @deprecated Use {#stargazers} instead + # + # List watchers of repo. + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of hashes representing users. + # @see https://developer.github.com/v3/repos/watching/#list-watchers + # @example + # Octokit.watchers('octokit/octokit.rb') + # @example + # @client.watchers('octokit/octokit.rb') + def watchers(repo, options = {}) + paginate "#{Repository.path repo}/watchers", options + end + + # List forks + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of hashes representing repos. + # @see https://developer.github.com/v3/repos/forks/#list-forks + # @example + # Octokit.forks('octokit/octokit.rb') + # @example + # Octokit.network('octokit/octokit.rb') + # @example + # @client.forks('octokit/octokit.rb') + def forks(repo, options = {}) + paginate "#{Repository.path repo}/forks", options + end + alias :network :forks + + # List languages of code in the repo. + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of Hashes representing languages. + # @see https://developer.github.com/v3/repos/#list-languages + # @example + # Octokit.languages('octokit/octokit.rb') + # @example + # @client.languages('octokit/octokit.rb') + def languages(repo, options = {}) + paginate "#{Repository.path repo}/languages", options + end + + # List tags + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of hashes representing tags. + # @see https://developer.github.com/v3/repos/#list-tags + # @example + # Octokit.tags('octokit/octokit.rb') + # @example + # @client.tags('octokit/octokit.rb') + def tags(repo, options = {}) + paginate "#{Repository.path repo}/tags", options + end + + # List branches + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of hashes representing branches. + # @see https://developer.github.com/v3/repos/#list-branches + # @example + # Octokit.branches('octokit/octokit.rb') + # @example + # @client.branches('octokit/octokit.rb') + def branches(repo, options = {}) + paginate "#{Repository.path repo}/branches", options + end + + # Get a single branch from a repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param branch [String] Branch name + # @return [Sawyer::Resource] The branch requested, if it exists + # @see https://developer.github.com/v3/repos/#get-branch + # @example Get branch 'master` from octokit/octokit.rb + # Octokit.branch("octokit/octokit.rb", "master") + def branch(repo, branch, options = {}) + get "#{Repository.path repo}/branches/#{branch}", options + end + alias :get_branch :branch + + # Lock a single branch from a repository + # + # Requires authenticated client + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param branch [String] Branch name + # @option options [Hash] :required_status_checks If not null, the following keys are required: + # <tt>:enforce_admins [boolean] Enforce required status checks for repository administrators.</tt> + # <tt>:strict [boolean] Require branches to be up to date before merging.</tt> + # <tt>:contexts [Array] The list of status checks to require in order to merge into this branch</tt> + # + # @option options [Hash] :restrictions If not null, the following keys are required: + # <tt>:users [Array] The list of user logins with push access</tt> + # <tt>:teams [Array] The list of team slugs with push access</tt>. + # + # Teams and users restrictions are only available for organization-owned repositories. + # @return [Sawyer::Resource] The protected branch + # @see https://developer.github.com/v3/repos/#enabling-and-disabling-branch-protection + # @example + # @client.protect_branch('octokit/octokit.rb', 'master', foo) + def protect_branch(repo, branch, options = {}) + opts = ensure_api_media_type(:branch_protection, options) + opts[:restrictions] ||= nil + opts[:required_status_checks] ||= nil + put "#{Repository.path repo}/branches/#{branch}/protection", opts + end + + # Get branch protection summary + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param branch [String] Branch name + # @return [Sawyer::Resource, nil] Branch protection summary or nil if the branch + # is not protected + # @see https://developer.github.com/v3/repos/branches/#get-branch-protection + # @example + # @client.branch_protection('octokit/octokit.rb', 'master') + def branch_protection(repo, branch, options = {}) + opts = ensure_api_media_type(:branch_protection, options) + begin + get "#{Repository.path repo}/branches/#{branch}/protection", opts + rescue Octokit::BranchNotProtected + nil + end + end + + # Unlock a single branch from a repository + # + # Requires authenticated client + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param branch [String] Branch name + # @return [Sawyer::Resource] The unprotected branch + # @see https://developer.github.com/v3/repos/#enabling-and-disabling-branch-protection + # @example + # @client.unprotect_branch('octokit/octokit.rb', 'master') + def unprotect_branch(repo, branch, options = {}) + opts = ensure_api_media_type(:branch_protection, options) + boolean_from_response :delete, "#{Repository.path repo}/branches/#{branch}/protection", opts + end + + # List users available for assigning to issues. + # + # Requires authenticated client for private repos. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of hashes representing users. + # @see https://developer.github.com/v3/issues/assignees/#list-assignees + # @example + # Octokit.repository_assignees('octokit/octokit.rb') + # @example + # Octokit.repo_assignees('octokit/octokit.rb') + # @example + # @client.repository_assignees('octokit/octokit.rb') + def repository_assignees(repo, options = {}) + paginate "#{Repository.path repo}/assignees", options + end + alias :repo_assignees :repository_assignees + + # Check to see if a particular user is an assignee for a repository. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param assignee [String] User login to check + # @return [Boolean] True if assignable on project, false otherwise. + # @see https://developer.github.com/v3/issues/assignees/#check-assignee + # @example + # Octokit.check_assignee('octokit/octokit.rb', 'andrew') + def check_assignee(repo, assignee, options = {}) + boolean_from_response :get, "#{Repository.path repo}/assignees/#{assignee}", options + end + + # List watchers subscribing to notifications for a repo + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Array<Sawyer::Resource>] Array of users watching. + # @see https://developer.github.com/v3/activity/watching/#list-watchers + # @example + # @client.subscribers("octokit/octokit.rb") + def subscribers(repo, options = {}) + paginate "#{Repository.path repo}/subscribers", options + end + + # Get a repository subscription + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Sawyer::Resource] Repository subscription. + # @see https://developer.github.com/v3/activity/watching/#get-a-repository-subscription + # @example + # @client.subscription("octokit/octokit.rb") + def subscription(repo, options = {}) + get "#{Repository.path repo}/subscription", options + end + + # Update repository subscription + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param options [Hash] + # + # @option options [Boolean] :subscribed Determines if notifications + # should be received from this repository. + # @option options [Boolean] :ignored Deterimines if all notifications + # should be blocked from this repository. + # @return [Sawyer::Resource] Updated repository subscription. + # @see https://developer.github.com/v3/activity/watching/#set-a-repository-subscription + # @example Subscribe to notifications for a repository + # @client.update_subscription("octokit/octokit.rb", {subscribed: true}) + def update_subscription(repo, options = {}) + put "#{Repository.path repo}/subscription", options + end + + # Delete a repository subscription + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Boolean] True if subscription deleted, false otherwise. + # @see https://developer.github.com/v3/activity/watching/#delete-a-repository-subscription + # + # @example + # @client.delete_subscription("octokit/octokit.rb") + def delete_subscription(repo, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/subscription", options + end + + # Create a repository dispatch event + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param event_type [String] A custom webhook event name. + # @option options [Hash] :client_payload payload with extra information + # about the webhook event that your action or worklow may use. + # + # @return [Boolean] True if event was dispatched, false otherwise. + # @see https://developer.github.com/v3/repos/#create-a-repository-dispatch-event + def dispatch_event(repo, event_type, options = {}) + boolean_from_response :post, "#{Repository.path repo}/dispatches", options.merge({ event_type: event_type }) + end + + # Check to see if vulnerability alerts are enabled for a repository + # + # The authenticated user must have admin access to the repository. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Boolean] True if vulnerability alerts are enabled, false otherwise. + # @see https://docs.github.com/en/rest/reference/repos#check-if-vulnerability-alerts-are-enabled-for-a-repository + # + # @example + # @client.vulnerability_alerts_enabled?("octokit/octokit.rb") + def vulnerability_alerts_enabled?(repo, options = {}) + opts = ensure_api_media_type(:vulnerability_alerts, options) + boolean_from_response(:get, "#{Repository.path repo}/vulnerability-alerts", opts) + end + + # Enable vulnerability alerts for a repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param options [Hash] + # + # @return [Boolean] True if vulnerability alerts enabled, false otherwise. + # @see https://docs.github.com/en/rest/reference/repos#enable-vulnerability-alerts + # @example Enable vulnerability alerts for a repository + # @client.enable_vulnerability_alerts("octokit/octokit.rb") + def enable_vulnerability_alerts(repo, options = {}) + opts = ensure_api_media_type(:vulnerability_alerts, options) + boolean_from_response(:put, "#{Repository.path repo}/vulnerability-alerts", opts) + end + + # Disable vulnerability alerts for a repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param options [Hash] + # + # @return [Boolean] True if vulnerability alerts disabled, false otherwise. + # @see https://docs.github.com/en/rest/reference/repos#disable-vulnerability-alerts + # @example Disable vulnerability alerts for a repository + # @client.disable_vulnerability_alerts("octokit/octokit.rb") + def disable_vulnerability_alerts(repo, options = {}) + opts = ensure_api_media_type(:vulnerability_alerts, options) + boolean_from_response(:delete, "#{Repository.path repo}/vulnerability-alerts", opts) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/repository_invitations.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/repository_invitations.rb new file mode 100644 index 000000000000..47fdb880b6b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/repository_invitations.rb @@ -0,0 +1,96 @@ +module Octokit + class Client + + # Methods for the Repository Invitations API + # + # @see https://developer.github.com/v3/repos/invitations/ + module RepositoryInvitations + + # Invite a user to a repository + # + # Requires authenticated client + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param user [String] User GitHub username to add + # @return [Sawyer::Resource] The repository invitation + # @see https://developer.github.com/v3/repos/collaborators/#add-user-as-a-collaborator + def invite_user_to_repository(repo, user, options = {}) + put "#{Repository.path repo}/collaborators/#{user}", options + end + alias invite_user_to_repo invite_user_to_repository + + # List all invitations for a repository + # + # Requires authenticated client + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] A list of invitations + # @see https://developer.github.com/v3/repos/invitations/#list-invitations-for-a-repository + def repository_invitations(repo, options = {}) + paginate "#{Repository.path repo}/invitations", options + end + alias repo_invitations repository_invitations + + # Delete an invitation for a repository + # + # Requires authenticated client + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param invitation_id [Integer] The id of the invitation + # @return [Boolean] True if the invitation was successfully deleted + # @see https://developer.github.com/v3/repos/invitations/#delete-a-repository-invitation + def delete_repository_invitation(repo, invitation_id, options = {}) + boolean_from_response :delete, "#{Repository.path repo}/invitations/#{invitation_id}", options + end + alias delete_repo_invitation delete_repository_invitation + + # Update an invitation for a repository + # + # Requires authenticated client + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param invitation_id [Integer] The id of the invitation + # @return [Sawyer::Resource] The updated repository invitation + # @see https://developer.github.com/v3/repos/invitations/#update-a-repository-invitation + def update_repository_invitation(repo, invitation_id, options = {}) + patch "#{Repository.path repo}/invitations/#{invitation_id}", options + end + alias update_repo_invitation update_repository_invitation + + # List all repository invitations for the user + # + # Requires authenticated client + # + # @return [Array<Sawyer::Resource>] The users repository invitations + # @see https://developer.github.com/v3/repos/invitations/#list-a-users-repository-invitations + def user_repository_invitations(options = {}) + paginate "/user/repository_invitations", options + end + alias user_repo_invitations user_repository_invitations + + # Accept a repository invitation + # + # Requires authenticated client + # + # @param invitation_id [Integer] The id of the invitation + # @return [Boolean] True if the acceptance of the invitation was successful + # @see https://developer.github.com/v3/repos/invitations/#accept-a-repository-invitation + def accept_repository_invitation(invitation_id, options = {}) + patch "/user/repository_invitations/#{invitation_id}", options + end + alias accept_repo_invitation accept_repository_invitation + + # Decline a repository invitation + # + # Requires authenticated client + # + # @param invitation_id [Integer] The id of the invitation + # @return [Boolean] True if the acceptance of the invitation was successful + # @see https://developer.github.com/v3/repos/invitations/#decline-a-repository-invitation + def decline_repository_invitation(invitation_id, options = {}) + boolean_from_response :delete, "/user/repository_invitations/#{invitation_id}", options + end + alias decline_invitation decline_repository_invitation + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/reviews.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/reviews.rb new file mode 100644 index 000000000000..7e478e3e15ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/reviews.rb @@ -0,0 +1,227 @@ +module Octokit + class Client + + # Methods for the Reviews API + # + # @see https://developer.github.com/v3/pulls/reviews/ + module Reviews + + # List reviews on a pull request + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @see https://developer.github.com/v3/pulls/reviews/#list-reviews-on-a-pull-request + # + # @example + # @client.pull_request_reviews('octokit/octokit.rb', 2) + # + # @return [Array<Sawyer::Resource>] Array of Hashes representing the reviews + def pull_request_reviews(repo, number, options = {}) + paginate "#{Repository.path repo}/pulls/#{number}/reviews", options + end + + # Get a single review + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @param review [Integer] The id of the review + # @see https://developer.github.com/v3/pulls/reviews/#get-a-single-review + # + # @example + # @client.pull_request_review('octokit/octokit.rb', 825, 6505518) + # + # @return [Sawyer::Resource] Hash representing the review + def pull_request_review(repo, number, review, options = {}) + get "#{Repository.path repo}/pulls/#{number}/reviews/#{review}", options + end + + # Delete a pending review + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @param review [Integer] The id of the review + # @see https://developer.github.com/v3/pulls/reviews/#delete-a-pending-review + # + # @example + # @client.delete_pull_request_review('octokit/octokit.rb', 825, 6505518) + # + # @return [Sawyer::Resource] Hash representing the deleted review + def delete_pull_request_review(repo, number, review, options = {}) + delete "#{Repository.path repo}/pulls/#{number}/reviews/#{review}", options + end + + # Get comments for a single review + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @param review [Integer] The id of the review + # @see https://developer.github.com/v3/pulls/reviews/#get-comments-for-a-single-review + # + # @example + # @client.pull_request_review_comments('octokit/octokit.rb', 825, 6505518) + # + # @return [Array<Sawyer::Resource>] Array of Hashes representing the review comments + def pull_request_review_comments(repo, number, review, options = {}) + paginate "#{Repository.path repo}/pulls/#{number}/reviews/#{review}/comments", options + end + + # Create a pull request review + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @param options [Hash] Method options + # @option options [String] :event The review action (event) to perform; + # can be one of APPROVE, REQUEST_CHANGES, or COMMENT. + # If left blank, the review is left PENDING. + # @option options [String] :body The body text of the pull request review + # @option options [Array<Hash>] :comments Comments part of the review + # @option comments [String] :path The path to the file being commented on + # @option comments [Integer] :position The position in the file to be commented on + # @option comments [String] :body Body of the comment + # @see https://developer.github.com/v3/pulls/reviews/#create-a-pull-request-review + # + # @example + # comments = [ + # { path: '.travis.yml', position: 10, body: 'ruby-head is under development that is not stable.' }, + # { path: '.travis.yml', position: 32, body: 'ruby-head is also required in thervm section.' }, + # ] + # options = { event: 'REQUEST_CHANGES', comments: comments } + # @client.create_pull_request_review('octokit/octokit.rb', 844, options) + # + # @return [Sawyer::Resource>] Hash respresenting the review + def create_pull_request_review(repo, number, options = {}) + post "#{Repository.path repo}/pulls/#{number}/reviews", options + end + + # Submit a pull request review + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @param review [Integer] The id of the review + # @param event [String] The review action (event) to perform; can be one of + # APPROVE, REQUEST_CHANGES, or COMMENT. + # @param options [Hash] Method options + # @option options [String] :body The body text of the pull request review + # @see https://developer.github.com/v3/pulls/reviews/#submit-a-pull-request-review + # + # @example + # @client.submit_pull_request_review('octokit/octokit.rb', 825, 6505518, + # 'APPROVE', body: 'LGTM!') + # + # @return [Sawyer::Resource] Hash respresenting the review + def submit_pull_request_review(repo, number, review, event, options = {}) + options = options.merge(event: event) + post "#{Repository.path repo}/pulls/#{number}/reviews/#{review}/events", options + end + + # Dismiss a pull request review + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @param review [Integer] The id of the review + # @param message [String] The message for the pull request review dismissal + # @see https://developer.github.com/v3/pulls/reviews/#dismiss-a-pull-request-review + # + # @example + # @client.dismiss_pull_request_review('octokit/octokit.rb', 825, 6505518, 'The message.') + # + # @return [Sawyer::Resource] Hash representing the dismissed review + def dismiss_pull_request_review(repo, number, review, message, options = {}) + options = options.merge(message: message) + put "#{Repository.path repo}/pulls/#{number}/reviews/#{review}/dismissals", options + end + + # List review requests + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @see https://developer.github.com/v3/pulls/review_requests/#list-review-requests + # + # @example + # @client.pull_request_review_requests('octokit/octokit.rb', 2) + # + # @return [Array<Sawyer::Resource>] Array of Hashes representing the review requests + def pull_request_review_requests(repo, number, options = {}) + paginate "#{Repository.path repo}/pulls/#{number}/requested_reviewers", options + end + + # Create a review request + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @param reviewers [Hash] :reviewers [Array<String>] An array of user logins + # @param options [Hash] :team_reviewers [Array<String>] An array of team slugs + # @see https://developer.github.com/v3/pulls/review_requests/#create-a-review-request + # + # @example + # @client.request_pull_request_review('octokit/octokit.rb', 2, reviewers: ['soudy']) + # + # @return [Sawyer::Resource>] Hash respresenting the pull request + def request_pull_request_review(repo, number, reviewers = {}, options = {}) + # TODO(5.0): remove deprecated behavior + if reviewers.is_a?(Array) + octokit_warn( + "Deprecated: Octokit::Client#request_pull_request_review "\ + "no longer takes a separate :reviewers argument.\n" \ + "Please update your call to pass :reviewers and :team_reviewers as part of the options hash." + ) + options = options.merge(reviewers: reviewers) + else + options = options.merge(reviewers) + end + + post "#{Repository.path repo}/pulls/#{number}/requested_reviewers", options + end + + # Delete a review request + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param id [Integer] The id of the pull request + # @param reviewers [Hash] :reviewers [Array] An array of user logins + # @param options [Hash] :team_reviewers [Array] An array of team slugs + # + # @see https://developer.github.com/v3/pulls/review_requests/#delete-a-review-request + # + # @example + # options = { + # "reviewers" => [ "octocat", "hubot", "other_user" ], + # "team_reviewers" => [ "justice-league" ] + # } + # @client.delete_pull_request_review_request('octokit/octokit.rb', 2, options) + # + # @return [Sawyer::Resource>] Hash representing the pull request + def delete_pull_request_review_request(repo, id, reviewers={}, options = {}) + # TODO(5.0): remove deprecated behavior + if !reviewers.empty? && !options.empty? + octokit_warn( + "Deprecated: Octokit::Client#delete_pull_request_review_request "\ + "no longer takes a separate :reviewers argument.\n" \ + "Please update your call to pass :reviewers and :team_reviewers as part of the options hash." + ) + end + # For backwards compatibility, this endpoint can be called with a separate reviewers hash. + # If not called with a separate hash, then 'reviewers' is, in fact, 'options'. + options = options.merge(reviewers) + delete "#{Repository.path repo}/pulls/#{id}/requested_reviewers", options + end + + # Update a review request comment + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param number [Integer] Number ID of the pull request + # @param review [Integer] The id of the review + # @param body [String] body text of the pull request review. + # @param options [Hash] Method options + # @see https://developer.github.com/v3/pulls/reviews/#update-a-pull-request-review + # + # @example + # @client.update_pull_request_review('octokit/octokit.rb', 825, 6505518, 'This is close to perfect! Please address the suggested inline change. And add more about this.') + # + # @return [Sawyer::Resource] Hash representing the review comment + def update_pull_request_review(repo, number, review, body, options = {}) + options[:body] = body + put "#{Repository.path repo}/pulls/#{number}/reviews/#{review}", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/say.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/say.rb new file mode 100644 index 000000000000..082be183cf97 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/say.rb @@ -0,0 +1,19 @@ +module Octokit + class Client + + # Methods for the unpublished Octocat API + module Say + + # Return a nifty ASCII Octocat with GitHub wisdom + # or your own + # + # @return [String] + def say(text = nil, options = {}) + options[:s] = text if text + get "octocat", options + end + alias :octocat :say + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/search.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/search.rb new file mode 100644 index 000000000000..181e6cd9c1b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/search.rb @@ -0,0 +1,91 @@ +module Octokit + class Client + + # Methods for the Search API + # + # @see https://developer.github.com/v3/search/ + module Search + + # Search code + # + # @param query [String] Search term and qualifiers + # @param options [Hash] Sort and pagination options + # @option options [String] :sort Sort field + # @option options [String] :order Sort order (asc or desc) + # @option options [Integer] :page Page of paginated results + # @option options [Integer] :per_page Number of items per page + # @return [Sawyer::Resource] Search results object + # @see https://developer.github.com/v3/search/#search-code + def search_code(query, options = {}) + search "search/code", query, options + end + + # Search commits + # + # @param query [String] Search terms and qualifiers + # @param options [Hash] Sort and pagination options + # @option options [String] :sort Sort field + # @option options [String] :order Sort order (asc or desc) + # @option options [Integer] :page Page of paginated results + # @option options [Integer] :per_page Number of items per page + # @return [Sawyer::Resource] Search results object + # @see https://developer.github.com/v3/search/#search-commits + def search_commits(query, options = {}) + options = ensure_api_media_type(:commit_search, options) + search "search/commits", query, options + end + + # Search issues + # + # @param query [String] Search term and qualifiers + # @param options [Hash] Sort and pagination options + # @option options [String] :sort Sort field + # @option options [String] :order Sort order (asc or desc) + # @option options [Integer] :page Page of paginated results + # @option options [Integer] :per_page Number of items per page + # @return [Sawyer::Resource] Search results object + # @see https://developer.github.com/v3/search/#search-issues-and-pull-requests + def search_issues(query, options = {}) + search "search/issues", query, options + end + + # Search repositories + # + # @param query [String] Search term and qualifiers + # @param options [Hash] Sort and pagination options + # @option options [String] :sort Sort field + # @option options [String] :order Sort order (asc or desc) + # @option options [Integer] :page Page of paginated results + # @option options [Integer] :per_page Number of items per page + # @return [Sawyer::Resource] Search results object + # @see https://developer.github.com/v3/search/#search-repositories + def search_repositories(query, options = {}) + search "search/repositories", query, options + end + alias :search_repos :search_repositories + + # Search users + # + # @param query [String] Search term and qualifiers + # @param options [Hash] Sort and pagination options + # @option options [String] :sort Sort field + # @option options [String] :order Sort order (asc or desc) + # @option options [Integer] :page Page of paginated results + # @option options [Integer] :per_page Number of items per page + # @return [Sawyer::Resource] Search results object + # @see https://developer.github.com/v3/search/#search-users + def search_users(query, options = {}) + search "search/users", query, options + end + + private + + def search(path, query, options = {}) + opts = options.merge(:q => query) + paginate(path, opts) do |data, last_response| + data.items.concat last_response.data.items + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/service_status.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/service_status.rb new file mode 100644 index 000000000000..65a1f84b6f9a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/service_status.rb @@ -0,0 +1,38 @@ +module Octokit + class Client + + # Methods for the GitHub Status API + # + # @see https://status.github.com/api + module ServiceStatus + + # Root for status API + # @private + STATUS_ROOT = 'https://status.github.com/api.json' + + # Returns the current system status + # + # @return [Sawyer::Resource] GitHub status + # @see https://status.github.com/api#api-current-status + def github_status + get(STATUS_ROOT).rels[:status].get.data + end + + # Returns the last human communication, status, and timestamp. + # + # @return [Sawyer::Resource] GitHub status last message + # @see https://status.github.com/api#api-last-message + def github_status_last_message + get(STATUS_ROOT).rels[:last_message].get.data + end + + # Returns the most recent human communications with status and timestamp. + # + # @return [Array<Sawyer::Resource>] GitHub status messages + # @see https://status.github.com/api#api-recent-messages + def github_status_messages + get(STATUS_ROOT).rels[:messages].get.data + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/source_import.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/source_import.rb new file mode 100644 index 000000000000..4ffdb642c4ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/source_import.rb @@ -0,0 +1,161 @@ +module Octokit + class Client + + # Methods for the Source Import API + # + # @see https://developer.github.com/v3/migration/source_imports + module SourceImport + + # Start a source import to a GitHub repository using GitHub Importer. + # + # @overload start_source_import(repo, vcs, vcs_url, options = {}) + # @deprecated + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param vcs [String] The originating VCS type. Can be one of "subversion", "git", "mercurial", or "tfvc". + # @param vcs_url [String] The URL of the originating repository. + # @param options [Hash] + # @option options [String] :vcs_username If authentication is required, the username to provide to vcs_url. + # @option options [String] :vcs_password If authentication is required, the password to provide to vcs_url. + # @option options [String] :tfvc_project For a tfvc import, the name of the project that is being imported. + # @overload start_source_import(repo, vcs_url, options = {}) + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param vcs_url [String] The URL of the originating repository. + # @param options [Hash] + # @param options [String] :vcs The originating VCS type. Can be one of "subversion", "git", "mercurial", or "tfvc". + # @option options [String] :vcs_username If authentication is required, the username to provide to vcs_url. + # @option options [String] :vcs_password If authentication is required, the password to provide to vcs_url. + # @option options [String] :tfvc_project For a tfvc import, the name of the project that is being imported. + # @return [Sawyer::Resource] Hash representing the repository import + # @see https://developer.github.com/v3/migration/source_imports/#start-an-import + # + # @example + # @client.start_source_import("octokit/octokit.rb", "http://svn.mycompany.com/svn/myproject", { + # :vcs => "subversion", + # :vcs_username" => "octocat", + # :vcs_password => "secret" + # }) + def start_source_import(*args) + arguments = Octokit::RepoArguments.new(args) + vcs_url = arguments.pop + vcs = arguments.pop + if vcs + octokit_warn "Octokit#start_source_import vcs parameter is now an option, please update your call before the next major Octokit version update." + arguments.options.merge!(:vcs => vcs) + end + options = ensure_api_media_type(:source_imports, arguments.options.merge(:vcs_url => vcs_url)) + put "#{Repository.path arguments.repo}/import", options + end + + # View the progress of an import. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Sawyer::Resource] Hash representing the progress of the import + # @see https://developer.github.com/v3/migration/source_imports/#get-import-progress + # + # @example + # @client.source_import_progress("octokit/octokit.rb") + def source_import_progress(repo, options = {}) + options = ensure_api_media_type(:source_imports, options) + get "#{Repository.path repo}/import", options + end + + # Update source import with authentication or project choice + # Restart source import if no options are passed + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Sawyer::Resource] Hash representing the repository import + # @see https://developer.github.com/v3/migration/source_imports/#update-existing-import + # @option options [String] :vcs_username If authentication is required, the username to provide to vcs_url. + # @option options [String] :vcs_password If authentication is required, the password to provide to vcs_url. + # @option options [String] To update project choice, please refer to the project_choice array from the progress return hash for the exact attributes. + # https://developer.github.com/v3/migration/source_imports/#update-existing-import + # + # @example + # @client.update_source_import("octokit/octokit.rb", { + # :vcs_username" => "octocat", + # :vcs_password => "secret" + # }) + def update_source_import(repo, options = {}) + options = ensure_api_media_type(:source_imports, options) + patch "#{Repository.path repo}/import", options + end + + # List source import commit authors + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param options [Hash] + # @option options [String] :since Only authors found after this id are returned. + # @return [Array<Sawyer::Resource>] Array of hashes representing commit_authors. + # @see https://developer.github.com/v3/migration/source_imports/#get-commit-authors + # + # @example + # @client.source_import_commit_authors("octokit/octokit.rb") + def source_import_commit_authors(repo, options = {}) + options = ensure_api_media_type(:source_imports, options) + get "#{Repository.path repo}/import/authors", options + end + + # Update an author's identity for the import. + # + # @param author_url [String] The source import API url for the commit author + # @param values [Hash] The updated author attributes + # @option values [String] :email The new Git author email. + # @option values [String] :name The new Git author name. + # @return [Sawyer::Resource] Hash representing the updated commit author + # @see https://developer.github.com/v3/migration/source_imports/#map-a-commit-author + # + # @example + # author_url = "https://api.github.com/repos/octokit/octokit.rb/import/authors/1" + # @client.map_source_import_commit_author(author_url, { + # :email => "hubot@github.com", + # :name => "Hubot the Robot" + # }) + def map_source_import_commit_author(author_url, values, options = {}) + options = ensure_api_media_type(:source_imports, options.merge(values)) + patch author_url, options + end + + # Stop an import for a repository. + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [Boolean] True if the import has been cancelled, false otherwise. + # @see https://developer.github.com/v3/migration/source_imports/#cancel-an-import + # + # @example + # @client.cancel_source_import("octokit/octokit.rb") + def cancel_source_import(repo, options = {}) + options = ensure_api_media_type(:source_imports, options) + boolean_from_response :delete, "#{Repository.path repo}/import", options + end + + # List source import large files + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param options [Hash] + # @option options [Integer] :page Page of paginated results + # @return [Array<Sawyer::Resource>] Array of hashes representing files over 100MB. + # @see https://developer.github.com/v3/migration/source_imports/#get-large-files + # + # @example + # @client.source_import_large_files("octokit/octokit.rb") + def source_import_large_files(repo, options = {}) + options = ensure_api_media_type(:source_imports, options) + get "#{Repository.path repo}/import/large_files", options + end + + # Set preference for using Git LFS to import files over 100MB + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @param use_lfs [String] Preference for using Git LFS to import large files. Can be one of "opt_in" or "opt_out" + # @return [Sawyer::Resource] Hash representing the repository import + # @see https://developer.github.com/v3/migration/source_imports/#set-git-lfs-preference + # + # @example + # @client.opt_in_source_import_lfs("octokit/octokit.rb", "opt_in") + def set_source_import_lfs_preference(repo, use_lfs, options = {}) + options = ensure_api_media_type(:source_imports, options.merge(:use_lfs => use_lfs)) + patch "#{Repository.path repo}/import/lfs", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/stats.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/stats.rb new file mode 100644 index 000000000000..8dcc8223d076 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/stats.rb @@ -0,0 +1,107 @@ +module Octokit + class Client + + # Methods for the Repository Statistics API + # + # @see https://developer.github.com/v3/repos/statistics/ + module Stats + + # Get contributors list with additions, deletions, and commit counts + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds) + # @option retry_wait [Number] How long Octokit should wait between retries. + # @return [Array<Sawyer::Resource>] Array of contributor stats + # @see https://developer.github.com/v3/repos/statistics/#get-contributors-list-with-additions-deletions-and-commit-counts + # @example Get contributor stats for octokit + # @client.contributors_stats('octokit/octokit.rb') + def contributors_stats(repo, options = {}) + get_stats(repo, "contributors", options) + end + alias :contributor_stats :contributors_stats + + # Get the last year of commit activity data + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds) + # @option retry_wait [Number] How long Octokit should wait between retries. + # @return [Array<Sawyer::Resource>] The last year of commit activity grouped by + # week. The days array is a group of commits per day, starting on Sunday. + # @see https://developer.github.com/v3/repos/statistics/#get-the-last-year-of-commit-activity-data + # @example Get commit activity for octokit + # @client.commit_activity_stats('octokit/octokit.rb') + def commit_activity_stats(repo, options = {}) + get_stats(repo, "commit_activity", options) + end + + # Get the number of additions and deletions per week + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds) + # @option retry_wait [Number] How long Octokit should wait between retries. + # @return [Array<Sawyer::Resource>] Weekly aggregate of the number of additions + # and deletions pushed to a repository. + # @see https://developer.github.com/v3/repos/statistics/#get-the-number-of-additions-and-deletions-per-week + # @example Get code frequency stats for octokit + # @client.code_frequency_stats('octokit/octokit.rb') + def code_frequency_stats(repo, options = {}) + get_stats(repo, "code_frequency", options) + end + + # Get the weekly commit count for the repo owner and everyone else + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds) + # @option retry_wait [Number] How long Octokit should wait between retries. + # @return [Sawyer::Resource] Total commit counts for the owner and total commit + # counts in all. all is everyone combined, including the owner in the last + # 52 weeks. If you’d like to get the commit counts for non-owners, you can + # subtract all from owner. + # @see https://developer.github.com/v3/repos/statistics/#get-the-weekly-commit-count-for-the-repository-owner-and-everyone-else + # @example Get weekly commit counts for octokit + # @client.participation_stats("octokit/octokit.rb") + def participation_stats(repo, options = {}) + get_stats(repo, "participation", options) + end + + # Get the number of commits per hour in each day + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @option retry_timeout [Number] How long Octokit should keep trying to get stats (in seconds) + # @option retry_wait [Number] How long Octokit should wait between retries. + # @return [Array<Array>] Arrays containing the day number, hour number, and + # number of commits + # @see https://developer.github.com/v3/repos/statistics/#get-the-number-of-commits-per-hour-in-each-day + # @example Get octokit punch card + # @octokit.punch_card_stats + def punch_card_stats(repo, options = {}) + get_stats(repo, "punch_card", options) + end + alias :punch_card :punch_card_stats + + private + + # @private Get stats for a repository + # + # @param repo [Integer, String, Hash, Repository] A GitHub repository + # @param metric [String] The metrics you are looking for + # @return [Array<Sawyer::Resource> or nil] Stats in metric-specific format, or nil if not yet calculated. + # @see https://developer.github.com/v3/repos/statistics/ + def get_stats(repo, metric, options = {}) + options = options.dup + if retry_timeout = options.delete(:retry_timeout) + retry_wait = options.delete(:retry_wait) || 0.5 + timeout = Time.now + retry_timeout + end + loop do + data = get("#{Repository.path repo}/stats/#{metric}", options) + return data if last_response.status == 200 + return [] if last_response.status == 204 + return nil unless retry_timeout + return nil if Time.now >= timeout + sleep retry_wait if retry_wait + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/statuses.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/statuses.rb new file mode 100644 index 000000000000..9a24883b3dc4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/statuses.rb @@ -0,0 +1,47 @@ +module Octokit + class Client + + # Methods for the Commit Statuses API + # + # @see https://developer.github.com/v3/repos/statuses/ + module Statuses + + # List all statuses for a given commit + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param sha [String] The SHA1 for the commit + # @return [Array<Sawyer::Resource>] A list of statuses + # @see https://developer.github.com/v3/repos/statuses/#list-statuses-for-a-specific-ref + def statuses(repo, sha, options = {}) + paginate "#{Repository.path repo}/statuses/#{sha}", options + end + alias :list_statuses :statuses + + # Get the combined status for a ref + # + # @param repo [Integer, String, Repository, Hash] a GitHub repository + # @param ref [String] A Sha or Ref to fetch the status of + # @return [Sawyer::Resource] The combined status for the commit + # @see https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref + def combined_status(repo, ref, options = {}) + get "#{Repository.path repo}/commits/#{ref}/status", options + end + alias :status :combined_status + + # Create status for a commit + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @param sha [String] The SHA1 for the commit + # @param state [String] The state: pending, success, failure, error + # @option options [String] :context A context to differentiate this status from others + # @option options [String] :target_url A link to more details about this status + # @option options [String] :description A short human-readable description of this status + # @return [Sawyer::Resource] A status + # @see https://developer.github.com/v3/repos/statuses/#create-a-status + def create_status(repo, sha, state, options = {}) + options = options.merge(:state => state) + post "#{Repository.path repo}/statuses/#{sha}", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/traffic.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/traffic.rb new file mode 100644 index 000000000000..e6802f982ba7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/traffic.rb @@ -0,0 +1,69 @@ +module Octokit + class Client + + # Methods for the Traffic API + # + # @see https://developer.github.com/v3/repos/traffic/ + module Traffic + + # Get the top 10 referrers over the last 14 days + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] List of referrers and stats + # @see https://developer.github.com/v3/repos/traffic/#list-referrers + # @example + # @client.top_referrers('octokit/octokit.rb') + def top_referrers(repo, options = {}) + opts = ensure_api_media_type(:traffic, options) + get "#{Repository.path repo}/traffic/popular/referrers", opts + end + + # Get the top 10 popular contents over the last 14 days + # + # @param repo [Integer, String, Repository, Hash] A GitHub repository + # @return [Array<Sawyer::Resource>] List of popular contents + # @see https://developer.github.com/v3/repos/traffic/#list-paths + # @example + # @client.top_paths('octokit/octokit.rb') + def top_paths(repo, options = {}) + opts = ensure_api_media_type(:traffic, options) + get "#{Repository.path repo}/traffic/popular/paths", opts + end + + # Get the total number of views and breakdown per day or week for the + # last 14 days + # + # @param repo [Integer, String, Repository, Hash] A GitHub Repository + # @option options [String] :per ('day') Views per. <tt>day</tt> or + # <tt>week</tt> + # @return [Sawyer::Resource] Breakdown of view stats + # @see https://developer.github.com/v3/repos/traffic/#views + # @example Views per day + # @client.views('octokit/octokit.rb') + # @example Views per week + # @client.views('octokit/octokit.rb', per: 'week') + def views(repo, options = {}) + opts = ensure_api_media_type(:traffic, options) + get "#{Repository.path repo}/traffic/views", opts + end + + # Get the total number of clones and breakdown per day or week for the + # last 14 days + # + # @param repo [Integer, String, Repository, Hash] A GitHub Repository + # @option options [String] :per ('day') Views per. <tt>day</tt> or + # <tt>week</tt> + # @return [Sawyer::Resource] Breakdown of clone stats + # @see https://developer.github.com/v3/repos/traffic/#clones + # @example Clones per day + # @client.clones('octokit/octokit.rb') + # @example Clones per week + # @client.clones('octokit/octokit.rb', per: 'week') + def clones(repo, options = {}) + opts = ensure_api_media_type(:traffic, options) + get "#{Repository.path repo}/traffic/clones", opts + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/users.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/users.rb new file mode 100644 index 000000000000..0ad66ee423c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/client/users.rb @@ -0,0 +1,441 @@ +module Octokit + class Client + + # Methods for the Users API + # + # @see https://developer.github.com/v3/users/ + module Users + + # List all GitHub users + # + # This provides a list of every user, in the order that they signed up + # for GitHub. + # + # @param options [Hash] Optional options. + # @option options [Integer] :since The integer ID of the last User that + # you’ve seen. + # + # @see https://developer.github.com/v3/users/#get-all-users + # + # @return [Array<Sawyer::Resource>] List of GitHub users. + def all_users(options = {}) + paginate "users", options + end + + # Get a single user + # + # @param user [Integer, String] GitHub user login or id. + # @return [Sawyer::Resource] + # @see https://developer.github.com/v3/users/#get-a-single-user + # @see https://developer.github.com/v3/users/#get-the-authenticated-user + # @example + # Octokit.user("sferik") + def user(user=nil, options = {}) + get User.path(user), options + end + + # Retrieve the access_token. + # + # @param code [String] Authorization code generated by GitHub. + # @param app_id [String] Client Id we received when our application was registered with GitHub. Defaults to client_id. + # @param app_secret [String] Client Secret we received when our application was registered with GitHub. Defaults to client_secret. + # @return [Sawyer::Resource] Hash holding the access token. + # @see https://developer.github.com/v3/oauth/#web-application-flow + # @example + # Octokit.exchange_code_for_token('aaaa', 'xxxx', 'yyyy', {:accept => 'application/json'}) + def exchange_code_for_token(code, app_id = client_id, app_secret = client_secret, options = {}) + options = options.merge({ + :code => code, + :client_id => app_id, + :client_secret => app_secret, + :headers => { + :content_type => 'application/json', + :accept => 'application/json' + } + }) + + post "#{web_endpoint}login/oauth/access_token", options + end + + # Validate user username and password + # + # @param options [Hash] User credentials + # @option options [String] :login GitHub login + # @option options [String] :password GitHub password + # @return [Boolean] True if credentials are valid + def validate_credentials(options = {}) + !self.class.new(options).user.nil? + rescue Octokit::Unauthorized + false + end + + # Update the authenticated user + # + # @param options [Hash] A customizable set of options. + # @option options [String] :name + # @option options [String] :email Publically visible email address. + # @option options [String] :blog + # @option options [String] :company + # @option options [String] :location + # @option options [Boolean] :hireable + # @option options [String] :bio + # @return [Sawyer::Resource] + # @see https://developer.github.com/v3/users/#update-the-authenticated-user + # @example + # Octokit.update_user(:name => "Erik Michaels-Ober", :email => "sferik@gmail.com", :company => "Code for America", :location => "San Francisco", :hireable => false) + def update_user(options) + patch "user", options + end + + # Get a user's followers. + # + # @param user [Integer, String] GitHub user login or id of the user whose + # list of followers you are getting. + # @return [Array<Sawyer::Resource>] Array of hashes representing users + # followers. + # @see https://developer.github.com/v3/users/followers/#list-followers-of-a-user + # @example + # Octokit.followers('pengwynn') + def followers(user=login, options = {}) + paginate "#{User.path user}/followers", options + end + + # Get list of users a user is following. + # + # @param user [Intger, String] GitHub user login or id of the user who you + # are getting the list of the people they follow. + # @return [Array<Sawyer::Resource>] Array of hashes representing users a + # user is following. + # @see https://developer.github.com/v3/users/followers/#list-users-followed-by-another-user + # @example + # Octokit.following('pengwynn') + def following(user=login, options = {}) + paginate "#{User.path user}/following", options + end + + # Check if you are following a user. Alternatively, check if a given user + # is following a target user. + # + # Requries an authenticated client. + # + # @overload follows?(target) + # @param target [String] GitHub login of the user that you want to + # check if you are following. + # @overload follows?(user, target) + # @param user [Integer, String] GitHub user login or id of first user + # @param target [String] GitHub login of the target user + # @return [Boolean] True following target user, false otherwise. + # @see https://developer.github.com/v3/users/followers/#check-if-you-are-following-a-user + # @see https://developer.github.com/v3/users/followers/#check-if-one-user-follows-another + # @example + # @client.follows?('pengwynn') + # @example + # @client.follows?('catsby', 'pengwynn') + def follows?(*args) + target = args.pop + user = args.first + boolean_from_response :get, "#{User.path user}/following/#{target}" + end + + # Follow a user. + # + # Requires authenticatied client. + # + # @param user [String] Username of the user to follow. + # @return [Boolean] True if follow was successful, false otherwise. + # @see https://developer.github.com/v3/users/followers/#follow-a-user + # @example + # @client.follow('holman') + def follow(user, options = {}) + boolean_from_response :put, "user/following/#{user}", options + end + + # Unfollow a user. + # + # Requires authenticated client. + # + # @param user [String] Username of the user to unfollow. + # @return [Boolean] True if unfollow was successful, false otherwise. + # @see https://developer.github.com/v3/users/followers/#unfollow-a-user + # @example + # @client.unfollow('holman') + def unfollow(user, options = {}) + boolean_from_response :delete, "user/following/#{user}", options + end + + # Get list of repos starred by a user. + # + # @param user [Integer, String] GitHub user login of the user to get the + # list of their starred repositories. + # @param options [Hash] Optional options + # @option options [String] :sort (created) Sort: <tt>created</tt> or <tt>updated</tt>. + # @option options [String] :direction (desc) Direction: <tt>asc</tt> or <tt>desc</tt>. + # @return [Array<Sawyer::Resource>] Array of hashes representing repositories starred by user. + # @see https://developer.github.com/v3/activity/starring/#list-repositories-being-starred + # @example + # Octokit.starred('pengwynn') + def starred(user=login, options = {}) + paginate user_path(user, 'starred'), options + end + + # Check if you are starring a repo. + # + # Requires authenticated client. + # + # @param repo [String, Hash, Repository] A GitHub repository + # @return [Boolean] True if you are following the repo, false otherwise. + # @see https://developer.github.com/v3/activity/starring/#check-if-you-are-starring-a-repository + # @example + # @client.starred?('pengwynn/octokit') + def starred?(repo, options = {}) + boolean_from_response :get, "user/starred/#{Repository.new(repo)}", options + end + + # Get a public key. + # + # Note, when using dot notation to retrieve the values, ruby will return + # the hash key for the public keys value instead of the actual value, use + # symbol or key string to retrieve the value. See example. + # + # Requires authenticated client. + # + # @param key_id [Integer] Key to retreive. + # @return [Sawyer::Resource] Hash representing the key. + # @see https://developer.github.com/v3/users/keys/#get-a-single-public-key + # @example + # @client.key(1) + # @example Retrieve public key contents + # public_key = @client.key(1) + # public_key.key + # # => Error + # + # public_key[:key] + # # => "ssh-rsa AAA..." + # + # public_key['key'] + # # => "ssh-rsa AAA..." + def key(key_id, options = {}) + get "user/keys/#{key_id}", options + end + + # Get list of public keys for user. + # + # Requires authenticated client. + # + # @return [Array<Sawyer::Resource>] Array of hashes representing public keys. + # @see https://developer.github.com/v3/users/keys/#list-your-public-keys + # @example + # @client.keys + def keys(options = {}) + paginate "user/keys", options + end + + # Get list of public keys for user. + # + # @param user [Integer, String] GitHub user login or id. + # @return [Array<Sawyer::Resource>] Array of hashes representing public keys. + # @see https://developer.github.com/v3/users/keys/#list-public-keys-for-a-user + # @example + # @client.user_keys('pengwynn') + def user_keys(user, options = {}) + # TODO: Roll this into .keys + paginate "#{User.path user}/keys", options + end + + # Add public key to user account. + # + # Requires authenticated client. + # + # @param title [String] Title to give reference to the public key. + # @param key [String] Public key. + # @return [Sawyer::Resource] Hash representing the newly added public key. + # @see https://developer.github.com/v3/users/keys/#create-a-public-key + # @example + # @client.add_key('Personal projects key', 'ssh-rsa AAA...') + def add_key(title, key, options = {}) + post "user/keys", options.merge({:title => title, :key => key}) + end + + # Update a public key + # + # Requires authenticated client + # + # @param key_id [Integer] Id of key to update. + # @param options [Hash] Hash containing attributes to update. + # @option options [String] :title + # @option options [String] :key + # @return [Sawyer::Resource] Hash representing the updated public key. + # + # @deprecated This method is no longer supported in the API + # @see https://developer.github.com/v3/users/keys/#update-a-public-key + # @see https://developer.github.com/changes/2014-02-24-finer-grained-scopes-for-ssh-keys/ + # @example + # @client.update_key(1, :title => 'new title', :key => "ssh-rsa BBB") + def update_key(key_id, options = {}) + patch "user/keys/#{key_id}", options + end + + # Remove a public key from user account. + # + # Requires authenticated client. + # + # @param id [String] Id of the public key to remove. + # @return [Boolean] True if removal was successful, false otherwise. + # @see https://developer.github.com/v3/users/keys/#delete-a-public-key + # @example + # @client.remove_key(1) + def remove_key(id, options = {}) + boolean_from_response :delete, "user/keys/#{id}", options + end + + # List email addresses for a user. + # + # Requires authenticated client. + # + # @return [Array<String>] Array of email addresses. + # @see https://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user + # @example + # @client.emails + def emails(options = {}) + paginate "user/emails", options + end + + # Add email address to user. + # + # Requires authenticated client. + # + # @param email [String] Email address to add to the user. + # @return [Array<String>] Array of all email addresses of the user. + # @see https://developer.github.com/v3/users/emails/#add-email-addresses + # @example + # @client.add_email('new_email@user.com') + def add_email(email, options = {}) + email = Array(email) + post "user/emails", email + end + + # Remove email from user. + # + # Requires authenticated client. + # + # @param email [String] Email address to remove. + # @return [Array<String>] Array of all email addresses of the user. + # @see https://developer.github.com/v3/users/emails/#delete-email-addresses + # @example + # @client.remove_email('old_email@user.com') + def remove_email(email) + email = Array(email) + boolean_from_response :delete, "user/emails", email + end + + # List repositories being watched by a user. + # + # @param user [Integer, String] GitHub user login or id. + # @return [Array<Sawyer::Resource>] Array of repositories. + # @see https://developer.github.com/v3/activity/watching/#list-repositories-being-watched + # @example + # @client.subscriptions("pengwynn") + def subscriptions(user=login, options = {}) + paginate user_path(user, 'subscriptions'), options + end + alias :watched :subscriptions + + # Initiates the generation of a migration archive. + # + # Requires authenticated user. + # + # @param repositories [Array<String>] :repositories Repositories for the organization. + # @option options [Boolean, optional] :lock_repositories Indicates whether repositories should be locked during migration + # @option options [Boolean, optional] :exclude_attachments Exclude attachments fro the migration data + # @return [Sawyer::Resource] Hash representing the new migration. + # @example + # @client.start_migration(['octocat/hello-world']) + # @see https://docs.github.com/en/rest/reference/migrations#start-a-user-migration + def start_user_migration(repositories, options = {}) + options = ensure_api_media_type(:migrations, options) + options[:repositories] = repositories + post "user/migrations", options + end + + # Lists the most recent migrations. + # + # Requires authenticated user. + # + # @return [Array<Sawyer::Resource>] Array of migration resources. + # @see https://docs.github.com/en/rest/reference/migrations#list-user-migrations + def user_migrations(options = {}) + options = ensure_api_media_type(:migrations, options) + paginate "user/migrations", options + end + + # Fetches the status of a migration. + # + # Requires authenticated user. + # + # @param id [Integer] ID number of the migration. + # @see https://docs.github.com/en/rest/reference/migrations#get-a-user-migration-status + def user_migration_status(id, options = {}) + options = ensure_api_media_type(:migrations, options) + get "user/migrations/#{id}", options + end + + # Fetches the URL to a migration archive. + # + # Requires authenticated user. + # + # @param id [Integer] ID number of the migration. + # @see https://docs.github.com/en/rest/reference/migrations#download-a-user-migration-archive + def user_migration_archive_url(id, options = {}) + options = ensure_api_media_type(:migrations, options) + url = "user/migrations/#{id}/archive" + + response = client_without_redirects(options).get(url) + response.headers['location'] + end + + # Deletes a previous migration archive. + # + # Requires authenticated user. + # + # @param id [Integer] ID number of the migration. + # @see https://docs.github.com/en/rest/reference/migrations#delete-a-user-migration-archive + def delete_user_migration_archive(id, options = {}) + options = ensure_api_media_type(:migrations, options) + delete "user/migrations/#{id}/archive", options + end + + # List repositories for a user migration. + # + # Requires authenticated user. + # + # @param id [Integer] ID number of the migration. + # @see https://docs.github.com/en/rest/reference/migrations#list-repositories-for-a-user-migration + def user_migration_repositories(id, options = {}) + options = ensure_api_media_type(:migrations, options) + get "user/migrations/#{id}/repositories", options + end + + # Unlock a user repository which has been locked by a migration. + # + # Requires authenticated user. + # + # @param id [Integer] ID number of the migration. + # @param repo [String] Name of the repository. + # @see https://docs.github.com/en/rest/reference/migrations#unlock-a-user-repository + def unlock_user_repository(id, repo, options = {}) + options = ensure_api_media_type(:migrations, options) + delete "user/migrations/#{id}/repos/#{repo}/lock", options + end + end + + private + # convenience method for constructing a user specific path, if the user is logged in + def user_path(user, path) + if user == login && user_authenticated? + "user/#{path}" + else + "#{User.path user}/#{path}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/configurable.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/configurable.rb new file mode 100644 index 000000000000..f3d0568db8d0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/configurable.rb @@ -0,0 +1,151 @@ +module Octokit + + # Configuration options for {Client}, defaulting to values + # in {Default} + module Configurable + # @!attribute [w] access_token + # @see https://developer.github.com/v3/oauth/ + # @return [String] OAuth2 access token for authentication + # @!attribute api_endpoint + # @return [String] Base URL for API requests. default: https://api.github.com/ + # @!attribute auto_paginate + # @return [Boolean] Auto fetch next page of results until rate limit reached + # @!attribute [w] bearer_token + # @see https://developer.github.com/early-access/integrations/authentication/#as-an-integration + # @return [String] JWT bearer token for authentication + # @!attribute client_id + # @see https://developer.github.com/v3/oauth/ + # @return [String] Configure OAuth app key + # @!attribute [w] client_secret + # @see https://developer.github.com/v3/oauth/ + # @return [String] Configure OAuth app secret + # @!attribute default_media_type + # @see https://developer.github.com/v3/media/ + # @return [String] Configure preferred media type (for API versioning, for example) + # @!attribute connection_options + # @see https://github.com/lostisland/faraday + # @return [Hash] Configure connection options for Faraday + # @!attribute login + # @return [String] GitHub username for Basic Authentication + # @!attribute management_console_password + # @return [String] An admin password set up for your GitHub Enterprise management console + # @!attribute management_console_endpoint + # @return [String] Base URL for API requests to the GitHub Enterprise management console + # @!attribute middleware + # @see https://github.com/lostisland/faraday + # @return [Faraday::Builder or Faraday::RackBuilder] Configure middleware for Faraday + # @!attribute netrc + # @return [Boolean] Instruct Octokit to get credentials from .netrc file + # @!attribute netrc_file + # @return [String] Path to .netrc file. default: ~/.netrc + # @!attribute [w] password + # @return [String] GitHub password for Basic Authentication + # @!attribute per_page + # @return [String] Configure page size for paginated results. API default: 30 + # @!attribute proxy + # @see https://github.com/lostisland/faraday + # @return [String] URI for proxy server + # @!attribute ssl_verify_mode + # @see https://github.com/lostisland/faraday + # @return [String] SSL verify mode for ssl connections + # @!attribute user_agent + # @return [String] Configure User-Agent header for requests. + # @!attribute web_endpoint + # @return [String] Base URL for web URLs. default: https://github.com/ + + attr_accessor :access_token, :auto_paginate, :bearer_token, :client_id, + :client_secret, :default_media_type, :connection_options, + :middleware, :netrc, :netrc_file, + :per_page, :proxy, :ssl_verify_mode, :user_agent + attr_writer :password, :web_endpoint, :api_endpoint, :login, + :management_console_endpoint, :management_console_password + + class << self + + # List of configurable keys for {Octokit::Client} + # @return [Array] of option keys + def keys + @keys ||= [ + :access_token, + :api_endpoint, + :auto_paginate, + :bearer_token, + :client_id, + :client_secret, + :connection_options, + :default_media_type, + :login, + :management_console_endpoint, + :management_console_password, + :middleware, + :netrc, + :netrc_file, + :per_page, + :password, + :proxy, + :ssl_verify_mode, + :user_agent, + :web_endpoint + ] + end + end + + # Set configuration options using a block + def configure + yield self + end + + # Reset configuration options to default values + def reset! + Octokit::Configurable.keys.each do |key| + instance_variable_set(:"@#{key}", Octokit::Default.options[key]) + end + self + end + alias setup reset! + + # Compares client options to a Hash of requested options + # + # @param opts [Hash] Options to compare with current client options + # @return [Boolean] + def same_options?(opts) + opts.hash == options.hash + end + + def api_endpoint + File.join(@api_endpoint, "") + end + + def management_console_endpoint + File.join(@management_console_endpoint, "") + end + + # Base URL for generated web URLs + # + # @return [String] Default: https://github.com/ + def web_endpoint + File.join(@web_endpoint, "") + end + + def login + @login ||= begin + user.login if token_authenticated? + end + end + + def netrc? + !!@netrc + end + + private + + def options + Hash[Octokit::Configurable.keys.map{|key| [key, instance_variable_get(:"@#{key}")]}] + end + + def fetch_client_id_and_secret(overrides = {}) + opts = options.merge(overrides) + opts.values_at :client_id, :client_secret + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/connection.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/connection.rb new file mode 100644 index 000000000000..fbe71ef1f1b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/connection.rb @@ -0,0 +1,211 @@ +require 'sawyer' +require 'octokit/authentication' +module Octokit + + # Network layer for API clients. + module Connection + + include Octokit::Authentication + + # Header keys that can be passed in options hash to {#get},{#head} + CONVENIENCE_HEADERS = Set.new([:accept, :content_type]) + + # Make a HTTP GET request + # + # @param url [String] The path, relative to {#api_endpoint} + # @param options [Hash] Query and header params for request + # @return [Sawyer::Resource] + def get(url, options = {}) + request :get, url, parse_query_and_convenience_headers(options) + end + + # Make a HTTP POST request + # + # @param url [String] The path, relative to {#api_endpoint} + # @param options [Hash] Body and header params for request + # @return [Sawyer::Resource] + def post(url, options = {}) + request :post, url, options + end + + # Make a HTTP PUT request + # + # @param url [String] The path, relative to {#api_endpoint} + # @param options [Hash] Body and header params for request + # @return [Sawyer::Resource] + def put(url, options = {}) + request :put, url, options + end + + # Make a HTTP PATCH request + # + # @param url [String] The path, relative to {#api_endpoint} + # @param options [Hash] Body and header params for request + # @return [Sawyer::Resource] + def patch(url, options = {}) + request :patch, url, options + end + + # Make a HTTP DELETE request + # + # @param url [String] The path, relative to {#api_endpoint} + # @param options [Hash] Query and header params for request + # @return [Sawyer::Resource] + def delete(url, options = {}) + request :delete, url, options + end + + # Make a HTTP HEAD request + # + # @param url [String] The path, relative to {#api_endpoint} + # @param options [Hash] Query and header params for request + # @return [Sawyer::Resource] + def head(url, options = {}) + request :head, url, parse_query_and_convenience_headers(options) + end + + # Make one or more HTTP GET requests, optionally fetching + # the next page of results from URL in Link response header based + # on value in {#auto_paginate}. + # + # @param url [String] The path, relative to {#api_endpoint} + # @param options [Hash] Query and header params for request + # @param block [Block] Block to perform the data concatination of the + # multiple requests. The block is called with two parameters, the first + # contains the contents of the requests so far and the second parameter + # contains the latest response. + # @return [Sawyer::Resource] + def paginate(url, options = {}, &block) + opts = parse_query_and_convenience_headers(options) + if @auto_paginate || @per_page + opts[:query][:per_page] ||= @per_page || (@auto_paginate ? 100 : nil) + end + + data = request(:get, url, opts.dup) + + if @auto_paginate + while @last_response.rels[:next] && rate_limit.remaining > 0 + @last_response = @last_response.rels[:next].get(:headers => opts[:headers]) + if block_given? + yield(data, @last_response) + else + data.concat(@last_response.data) if @last_response.data.is_a?(Array) + end + end + + end + + data + end + + # Hypermedia agent for the GitHub API + # + # @return [Sawyer::Agent] + def agent + @agent ||= Sawyer::Agent.new(endpoint, sawyer_options) do |http| + http.headers[:accept] = default_media_type + http.headers[:content_type] = "application/json" + http.headers[:user_agent] = user_agent + if basic_authenticated? + http.basic_auth(@login, @password) + elsif token_authenticated? + http.authorization 'token', @access_token + elsif bearer_authenticated? + http.authorization 'Bearer', @bearer_token + elsif application_authenticated? + http.basic_auth(@client_id, @client_secret) + end + end + end + + # Fetch the root resource for the API + # + # @return [Sawyer::Resource] + def root + get "/" + end + + # Response for last HTTP request + # + # @return [Sawyer::Response] + def last_response + @last_response if defined? @last_response + end + + protected + + def endpoint + api_endpoint + end + + private + + def reset_agent + @agent = nil + end + + def request(method, path, data, options = {}) + if data.is_a?(Hash) + options[:query] = data.delete(:query) || {} + options[:headers] = data.delete(:headers) || {} + if accept = data.delete(:accept) + options[:headers][:accept] = accept + end + end + + @last_response = response = agent.call(method, Addressable::URI.parse(path.to_s).normalize.to_s, data, options) + response.data + rescue Octokit::Error => error + @last_response = nil + raise error + end + + # Executes the request, checking if it was successful + # + # @return [Boolean] True on success, false otherwise + def boolean_from_response(method, path, options = {}) + request(method, path, options) + [201, 202, 204].include? @last_response.status + rescue Octokit::NotFound + false + end + + + def sawyer_options + opts = { + :links_parser => Sawyer::LinkParsers::Simple.new + } + conn_opts = @connection_options + conn_opts[:builder] = @middleware if @middleware + conn_opts[:proxy] = @proxy if @proxy + if conn_opts[:ssl].nil? + conn_opts[:ssl] = { :verify_mode => @ssl_verify_mode } if @ssl_verify_mode + else + verify = @connection_options[:ssl][:verify] + conn_opts[:ssl] = { + :verify => verify, + :verify_mode => verify == false ? 0 : @ssl_verify_mode + } + end + opts[:faraday] = Faraday.new(conn_opts) + + opts + end + + def parse_query_and_convenience_headers(options) + options = options.dup + headers = options.delete(:headers) { Hash.new } + CONVENIENCE_HEADERS.each do |h| + if header = options.delete(h) + headers[h] = header + end + end + query = options.delete(:query) + opts = {:query => options} + opts[:query].merge!(query) if query && query.is_a?(Hash) + opts[:headers] = headers unless headers.empty? + + opts + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/default.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/default.rb new file mode 100644 index 000000000000..ef91dfcac216 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/default.rb @@ -0,0 +1,176 @@ +require 'octokit/middleware/follow_redirects' +require 'octokit/response/raise_error' +require 'octokit/response/feed_parser' +require 'octokit/version' + +module Octokit + + # Default configuration options for {Client} + module Default + + # Default API endpoint + API_ENDPOINT = "https://api.github.com".freeze + + # Default User Agent header string + USER_AGENT = "Octokit Ruby Gem #{Octokit::VERSION}".freeze + + # Default media type + MEDIA_TYPE = "application/vnd.github.v3+json".freeze + + # Default WEB endpoint + WEB_ENDPOINT = "https://github.com".freeze + + # In Faraday 0.9, Faraday::Builder was renamed to Faraday::RackBuilder + RACK_BUILDER_CLASS = defined?(Faraday::RackBuilder) ? Faraday::RackBuilder : Faraday::Builder + + # Default Faraday middleware stack + MIDDLEWARE = RACK_BUILDER_CLASS.new do |builder| + builder.use Faraday::Request::Retry, exceptions: [Octokit::ServerError] + builder.use Octokit::Middleware::FollowRedirects + builder.use Octokit::Response::RaiseError + builder.use Octokit::Response::FeedParser + builder.adapter Faraday.default_adapter + end + + class << self + + # Configuration options + # @return [Hash] + def options + Hash[Octokit::Configurable.keys.map{|key| [key, send(key)]}] + end + + # Default access token from ENV + # @return [String] + def access_token + ENV['OCTOKIT_ACCESS_TOKEN'] + end + + # Default API endpoint from ENV or {API_ENDPOINT} + # @return [String] + def api_endpoint + ENV['OCTOKIT_API_ENDPOINT'] || API_ENDPOINT + end + + # Default pagination preference from ENV + # @return [String] + def auto_paginate + ENV['OCTOKIT_AUTO_PAGINATE'] + end + + # Default bearer token from ENV + # @return [String] + def bearer_token + ENV['OCTOKIT_BEARER_TOKEN'] + end + + # Default OAuth app key from ENV + # @return [String] + def client_id + ENV['OCTOKIT_CLIENT_ID'] + end + + # Default OAuth app secret from ENV + # @return [String] + def client_secret + ENV['OCTOKIT_SECRET'] + end + + # Default management console password from ENV + # @return [String] + def management_console_password + ENV['OCTOKIT_ENTERPRISE_MANAGEMENT_CONSOLE_PASSWORD'] + end + + # Default management console endpoint from ENV + # @return [String] + def management_console_endpoint + ENV['OCTOKIT_ENTERPRISE_MANAGEMENT_CONSOLE_ENDPOINT'] + end + + # Default options for Faraday::Connection + # @return [Hash] + def connection_options + { + :headers => { + :accept => default_media_type, + :user_agent => user_agent + } + } + end + + # Default media type from ENV or {MEDIA_TYPE} + # @return [String] + def default_media_type + ENV['OCTOKIT_DEFAULT_MEDIA_TYPE'] || MEDIA_TYPE + end + + # Default GitHub username for Basic Auth from ENV + # @return [String] + def login + ENV['OCTOKIT_LOGIN'] + end + + # Default middleware stack for Faraday::Connection + # from {MIDDLEWARE} + # @return [Faraday::RackBuilder or Faraday::Builder] + def middleware + MIDDLEWARE + end + + # Default GitHub password for Basic Auth from ENV + # @return [String] + def password + ENV['OCTOKIT_PASSWORD'] + end + + # Default pagination page size from ENV + # @return [Integer] Page size + def per_page + page_size = ENV['OCTOKIT_PER_PAGE'] + + page_size.to_i if page_size + end + + # Default proxy server URI for Faraday connection from ENV + # @return [String] + def proxy + ENV['OCTOKIT_PROXY'] + end + + # Default SSL verify mode from ENV + # @return [Integer] + def ssl_verify_mode + # 0 is OpenSSL::SSL::VERIFY_NONE + # 1 is OpenSSL::SSL::SSL_VERIFY_PEER + # the standard default for SSL is SSL_VERIFY_PEER which requires a server certificate check on the client + ENV.fetch('OCTOKIT_SSL_VERIFY_MODE', 1).to_i + end + + # Default User-Agent header string from ENV or {USER_AGENT} + # @return [String] + def user_agent + ENV['OCTOKIT_USER_AGENT'] || USER_AGENT + end + + # Default web endpoint from ENV or {WEB_ENDPOINT} + # @return [String] + def web_endpoint + ENV['OCTOKIT_WEB_ENDPOINT'] || WEB_ENDPOINT + end + + # Default behavior for reading .netrc file + # @return [Boolean] + def netrc + ENV['OCTOKIT_NETRC'] || false + end + + # Default path for .netrc file + # @return [String] + def netrc_file + ENV['OCTOKIT_NETRC_FILE'] || File.join(ENV['HOME'].to_s, '.netrc') + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client.rb new file mode 100644 index 000000000000..64a1c56f9196 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client.rb @@ -0,0 +1,40 @@ +require 'octokit/connection' +require 'octokit/configurable' +require 'octokit/warnable' +require 'octokit/enterprise_admin_client/admin_stats' +require 'octokit/enterprise_admin_client/license' +require 'octokit/enterprise_admin_client/orgs' +require 'octokit/enterprise_admin_client/search_indexing' +require 'octokit/enterprise_admin_client/users' + +module Octokit + + # EnterpriseAdminClient is only meant to be used by GitHub Enterprise Admins + # and provides access the Admin only API endpoints including Admin Stats, + # Management Console, and the Search Indexing API. + # + # @see Octokit::Client Use Octokit::Client for regular API use for GitHub + # and GitHub Enterprise. + # @see https://developer.github.com/v3/enterprise/ + class EnterpriseAdminClient + + include Octokit::Configurable + include Octokit::Connection + include Octokit::Warnable + include Octokit::EnterpriseAdminClient::AdminStats + include Octokit::EnterpriseAdminClient::License + include Octokit::EnterpriseAdminClient::Orgs + include Octokit::EnterpriseAdminClient::SearchIndexing + include Octokit::EnterpriseAdminClient::Users + + def initialize(options = {}) + # Use options passed in, but fall back to module defaults + Octokit::Configurable.keys.each do |key| + instance_variable_set(:"@#{key}", options[key] || Octokit.instance_variable_get(:"@#{key}")) + end + + login_from_netrc unless user_authenticated? || application_authenticated? + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/admin_stats.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/admin_stats.rb new file mode 100644 index 000000000000..fd469382be2e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/admin_stats.rb @@ -0,0 +1,120 @@ +module Octokit + class EnterpriseAdminClient + + # Methods for the Enterprise Admin Stats API + # + # @see https://developer.github.com/v3/enterprise-admin/admin_stats/ + module AdminStats + + # Get all available stats + # + # @return [Sawyer::Resource] All available stats + # @example Get all available stats + # @client.admin_stats + def admin_stats + get_admin_stats "all" + end + + # Get only repository-related stats + # + # @return [Sawyer::Resource] Only repository-related stats + # @example Get only repository-related stats + # @client.admin_repository_stats + def admin_repository_stats + get_admin_stats "repos" + end + + # Get only hooks-related stats + # + # @return [Sawyer::Resource] Only hooks-related stats + # @example Get only hooks-related stats + # @client.admin_hooks_stats + def admin_hooks_stats + get_admin_stats "hooks" + end + + # Get only pages-related stats + # + # @return [Sawyer::Resource] Only pages-related stats + # @example Get only pages-related stats + # @client.admin_pages_stats + def admin_pages_stats + get_admin_stats "pages" + end + + # Get only organization-related stats + # + # @return [Sawyer::Resource] Only organization-related stats + # @example Get only organization-related stats + # @client.admin_organization_stats + def admin_organization_stats + get_admin_stats "orgs" + end + + # Get only user-related stats + # + # @return [Sawyer::Resource] Only user-related stats + # @example Get only user-related stats + # @client.admin_users_stats + def admin_users_stats + get_admin_stats "users" + end + + # Get only pull request-related stats + # + # @return [Sawyer::Resource] Only pull request-related stats + # @example Get only pull request-related stats + # @client.admin_pull_requests_stats + def admin_pull_requests_stats + get_admin_stats "pulls" + end + + # Get only issue-related stats + # + # @return [Sawyer::Resource] Only issue-related stats + # @example Get only issue-related stats + # @client.admin_issues_stats + def admin_issues_stats + get_admin_stats "issues" + end + + # Get only milestone-related stats + # + # @return [Sawyer::Resource] Only milestone-related stats + # @example Get only milestone-related stats + # @client.admin_milestones_stats + def admin_milestones_stats + get_admin_stats "milestones" + end + + # Get only gist-related stats + # + # @return [Sawyer::Resource] Only only gist-related stats + # @example Get only gist-related stats + # @client.admin_gits_stats + def admin_gists_stats + get_admin_stats "gists" + end + + # Get only comment-related stats + # + # @return [Sawyer::Resource] Only comment-related stats + # @example Get only comment-related stats + # @client.admin_comments_stats + def admin_comments_stats + get_admin_stats "comments" + end + + private + + # @private Get enterprise stats + # + # @param metric [String] The metrics you are looking for + # @return [Sawyer::Resource] Magical unicorn stats + def get_admin_stats(metric) + get "enterprise/stats/#{metric}" + end + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/license.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/license.rb new file mode 100644 index 000000000000..25785f961645 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/license.rb @@ -0,0 +1,18 @@ +module Octokit + class EnterpriseAdminClient + + # Methods for the Enterprise License API + # + # @see https://developer.github.com/v3/enterprise-admin/license/ + module License + + # Get information about the Enterprise license + # + # @return [Sawyer::Resource] The license information + def license_info + get "enterprise/settings/license" + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/orgs.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/orgs.rb new file mode 100644 index 000000000000..ce86ab8d6c9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/orgs.rb @@ -0,0 +1,27 @@ +module Octokit + class EnterpriseAdminClient + + # Methods for the Enterprise Orgs API + # + # @see https://developer.github.com/v3/enterprise-admin/orgs/ + module Orgs + + # Create a new organization on the instance. + # + # @param login [String] The organization's username. + # @param admin [String] The login of the user who will manage this organization. + # @param options [Hash] A set of options. + # @option options [String] :profile_name The organization's display name. + # @return [nil] + # @see https://developer.github.com/v3/enterprise-admin/orgs/#create-an-organization + # @example + # @admin_client.create_organization('SuchAGreatOrg', 'gjtorikian') + def create_organization(login, admin, options = {}) + options[:login] = login + options[:admin] = admin + post "admin/organizations", options + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/search_indexing.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/search_indexing.rb new file mode 100644 index 000000000000..cb0bc6c60193 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/search_indexing.rb @@ -0,0 +1,83 @@ +module Octokit + class EnterpriseAdminClient + + # Methods for the Enterprise Search Indexing API + # + # @see https://developer.github.com/v3/enterprise-admin/search_indexing/ + module SearchIndexing + + # Queue a User or Organization to be indexed + # + # @param user [String] A GitHub Enterprise user or organization + # @return [Sawyer:Resource] Result of the queuing containing `:message` + def index_user(user) + queue_index user + end + alias :index_organization :index_user + + # Queue a Repository to be indexed + # + # @param repo [String, Hash, Repository] A GitHub repository + # @return [Sawyer:Resource] Result of the queuing containing `:message` + def index_repository(repo) + queue_index Repository.new repo + end + + # Queue a repository's Issues to be indexed + # + # @param repo [String, Hash, Repository] A GitHub repository + # @return [Sawyer:Resource] Result of the queuing containing `:message` + def index_repository_issues(repo) + queue_index "#{Repository.new repo}/issues" + end + + # Queue a repository's code to be indexed + # + # @param repo [String, Hash, Repository] A GitHub repository + # @return [Sawyer:Resource] Result of the queuing containing `:message` + def index_repository_code(repo) + queue_index "#{Repository.new repo}/code" + end + + # Queue a user's or organization's repositories to be indexed + # + # @param user [String] A GitHub Enterprise user or organization + # @return [Sawyer:Resource] Result of the queuing containing `:message` + def index_users_repositories(user) + queue_index "#{user}/*" + end + alias :index_organizations_repositories :index_users_repositories + + # Queue an index of all the issues across all of a user's or + # organization's repositories + # + # @param user [String] A GitHub Enterprise user or organization + # @return [Sawyer:Resource] Result of the queuing containing `:message` + def index_users_repositories_issues(user) + queue_index "#{user}/*/issues" + end + alias :index_organizations_repositories_issues :index_users_repositories_issues + + # Queue an index of all the code contained in all of a user's or + # organization's repositories + # + # @param user [String] A GitHub Enterprise user or organization + # @return [Sawyer:Resource] Result of the queuing containing `:message` + def index_users_repositories_code(user) + queue_index "#{user}/*/code" + end + alias :index_organizations_repositories_code :index_users_repositories_code + + private + + # @private Queue a target for indexing + # + # @param target [String] Target to index + # @return [Sawyer:Resource] Result of the queuing containing `:message` + def queue_index(target) + post "staff/indexing_jobs", :target => target + end + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/users.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/users.rb new file mode 100644 index 000000000000..2a4e30e50d7e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_admin_client/users.rb @@ -0,0 +1,128 @@ +module Octokit + class EnterpriseAdminClient + + # Methods for the Enterprise User Administration API + # + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/ + module Users + # Create a new user. + # + # @param login [String] The user's username. + # @param email [String] The user's email address. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users#create-a-new-user + # @example + # @admin_client.create_user('foobar', 'notreal@foo.bar') + def create_user(login, email, options = {}) + options[:login] = login + options[:email] = email + post "admin/users", options + end + + # Promote an ordinary user to a site administrator + # + # @param user [String] Username of the user to promote. + # @return [Boolean] True if promote was successful, false otherwise. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#promote-an-ordinary-user-to-a-site-administrator + # @example + # @admin_client.promote('holman') + def promote(user, options = {}) + boolean_from_response :put, "users/#{user}/site_admin", options + end + + # Demote a site administrator to an ordinary user + # + # @param user [String] Username of the user to demote. + # @return [Boolean] True if demote was successful, false otherwise. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#demote-a-site-administrator-to-an-ordinary-user + # @example + # @admin_client.demote('holman') + def demote(user, options = {}) + boolean_from_response :delete, "users/#{user}/site_admin", options + end + + # Rename a user. + # + # @param old_login [String] The user's old username. + # @param new_login [String] The user's new username. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#rename-an-existing-user + # @example + # @admin_client.rename_user('foobar', 'foofoobar') + def rename_user(old_login, new_login, options = {}) + options[:login] = new_login + patch "admin/users/#{old_login}", options + end + + # Deletes a user. + # + # @param username [String] The username to delete. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-a-user + # @example + # @admin_client.delete_key(1) + def delete_user(username, options = {}) + boolean_from_response :delete, "admin/users/#{username}", options + end + + # Suspend a user. + # + # @param user [String] Username of the user to suspend. + # @return [Boolean] True if suspend was successful, false otherwise. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#suspend-a-user + # @example + # @admin_client.suspend('holman') + def suspend(user, options = {}) + boolean_from_response :put, "users/#{user}/suspended", options + end + + # Unsuspend a user. + # + # @param user [String] Username of the user to unsuspend. + # @return [Boolean] True if unsuspend was successful, false otherwise. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#unsuspend-a-user + # @example + # @admin_client.unsuspend('holman') + def unsuspend(user, options = {}) + boolean_from_response :delete, "users/#{user}/suspended", options + end + + # Creates an impersonation OAuth token. + # + # @param login [String] The user to create a token for. + # @param options [Array<String>] :scopes The scopes to apply. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#create-an-impersonation-oauth-token + # @example + # @admin_client.create_impersonation_token('foobar', {:scopes => ['repo:write']}) + def create_impersonation_token(login, options = {}) + post "admin/users/#{login}/authorizations", options + end + + # Deletes an impersonation OAuth token. + # + # @param login [String] The user whose token should be deleted. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-an-impersonation-oauth-token + # @example + # @admin_client.delete_impersonation_token('foobar') + def delete_impersonation_token(login, options = {}) + boolean_from_response :delete, "admin/users/#{login}/authorizations", options + end + + # Lists all the public SSH keys. + # + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#list-all-public-keys + # @example + # @admin_client.list_all_keys + def list_all_keys(options = {}) + get "admin/keys", options + end + + # Deletes a public SSH keys. + # + # @param id [Number] The ID of the key to delete. + # @see https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-a-public-key + # @example + # @admin_client.delete_key(1) + def delete_key(id, options = {}) + boolean_from_response :delete, "admin/keys/#{id}", options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_management_console_client.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_management_console_client.rb new file mode 100644 index 000000000000..0310ead83861 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_management_console_client.rb @@ -0,0 +1,50 @@ +require 'octokit/configurable' +require 'octokit/connection' +require 'octokit/warnable' +require 'octokit/enterprise_management_console_client/management_console' + +module Octokit + + # EnterpriseManagementConsoleClient is only meant to be used by GitHub Enterprise Admins + # and provides access to the management console API endpoints. + # + # @see Octokit::Client Use Octokit::Client for regular API use for GitHub + # and GitHub Enterprise. + # @see https://developer.github.com/v3/enterprise-admin/management_console/ + class EnterpriseManagementConsoleClient + + include Octokit::Configurable + include Octokit::Connection + include Octokit::Warnable + include Octokit::EnterpriseManagementConsoleClient::ManagementConsole + + def initialize(options = {}) + # Use options passed in, but fall back to module defaults + Octokit::Configurable.keys.each do |key| + instance_variable_set(:"@#{key}", options[key] || Octokit.instance_variable_get(:"@#{key}")) + end + end + + protected + + def endpoint + management_console_endpoint + end + + # Set Enterprise Management Console password + # + # @param value [String] Management console admin password + def management_console_password=(value) + reset_agent + @management_console_password = value + end + + # Set Enterprise Management Console endpoint + # + # @param value [String] Management console endpoint + def management_console_endpoint=(value) + reset_agent + @management_console_endpoint = value + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_management_console_client/management_console.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_management_console_client/management_console.rb new file mode 100644 index 000000000000..289a79ccc02c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/enterprise_management_console_client/management_console.rb @@ -0,0 +1,176 @@ +module Octokit + class EnterpriseManagementConsoleClient + + # Methods for the Enterprise Management Console API + # + # @see https://developer.github.com/v3/enterprise-admin/management_console/ + module ManagementConsole + + # Uploads a license for the first time + # + # @param license [String] The path to your .ghl license file. + # @param settings [Hash] A hash configuration of the initial settings. + # + # @see http: //git.io/j5NT + # @return nil + def upload_license(license, settings = nil) + conn = faraday_configuration + + params = { } + params[:license] = Faraday::UploadIO.new(license, 'binary') + params[:password] = @management_console_password + params[:settings] = "#{settings.to_json}" unless settings.nil? + + @last_response = conn.post("/setup/api/start", params) + end + + # Start a configuration process. + # + # @return nil + def start_configuration + post "/setup/api/configure", password_hash + end + + # Upgrade an Enterprise installation + # + # @param license [String] The path to your .ghl license file. + # + # @return nil + def upgrade(license) + conn = faraday_configuration + + params = { } + params[:license] = Faraday::UploadIO.new(license, 'binary') + params[:api_key] = @management_console_password + @last_response = conn.post("/setup/api/upgrade", params) + end + + # Get information about the Enterprise installation + # + # @return [Sawyer::Resource] The installation information + def config_status + get "/setup/api/configcheck", password_hash + end + alias :config_check :config_status + + # Get information about the Enterprise installation + # + # @return [Sawyer::Resource] The settings + def settings + get "/setup/api/settings", password_hash + end + alias :get_settings :settings + + # Modify the Enterprise settings + # + # @param settings [Hash] A hash configuration of the new settings + # + # @return [nil] + def edit_settings(settings) + queries = password_hash + queries[:query][:settings] = "#{settings.to_json}" + put "/setup/api/settings", queries + end + + # Get information about the Enterprise maintenance status + # + # @return [Sawyer::Resource] The maintenance status + def maintenance_status + get "/setup/api/maintenance", password_hash + end + alias :get_maintenance_status :maintenance_status + + # Start (or turn off) the Enterprise maintenance mode + # + # @param maintenance [Hash] A hash configuration of the maintenance settings + # @return [nil] + def set_maintenance_status(maintenance) + queries = password_hash + queries[:query][:maintenance] = "#{maintenance.to_json}" + post "/setup/api/maintenance", queries + end + alias :edit_maintenance_status :set_maintenance_status + + # Fetch the authorized SSH keys on the Enterprise install + # + # @return [Sawyer::Resource] An array of authorized SSH keys + def authorized_keys + get "/setup/api/settings/authorized-keys", password_hash + end + alias :get_authorized_keys :authorized_keys + + # Add an authorized SSH keys on the Enterprise install + # + # @param key Either the file path to a key, a File handler to the key, or the contents of the key itself + # @return [Sawyer::Resource] An array of authorized SSH keys + def add_authorized_key(key) + queries = password_hash + case key + when String + if File.exist?(key) + key = File.open(key, "r") + content = key.read.strip + key.close + else + content = key + end + when File + content = key.read.strip + key.close + end + + queries[:query][:authorized_key] = content + post "/setup/api/settings/authorized-keys", queries + end + + # Removes an authorized SSH keys from the Enterprise install + # + # @param key Either the file path to a key, a File handler to the key, or the contents of the key itself + # @return [Sawyer::Resource] An array of authorized SSH keys + def remove_authorized_key(key) + queries = password_hash + case key + when String + if File.exist?(key) + key = File.open(key, "r") + content = key.read.strip + key.close + else + content = key + end + when File + content = key.read.strip + key.close + end + + queries[:query][:authorized_key] = content + delete "/setup/api/settings/authorized-keys", queries + end + alias :delete_authorized_key :remove_authorized_key + + end + private + + def password_hash + { :query => { :api_key => @management_console_password } } + end + + # We fall back to raw Faraday for handling the licenses because I'm suspicious + # that Sawyer isn't handling binary POSTs correctly: http://git.io/jMir + def faraday_configuration + @faraday_configuration ||= Faraday.new(:url => @management_console_endpoint) do |http| + http.headers[:user_agent] = user_agent + http.request :multipart + http.request :url_encoded + + # Disabling SSL is essential for certain self-hosted Enterprise instances + if self.connection_options[:ssl] && !self.connection_options[:ssl][:verify] + http.ssl[:verify] = false + end + + http.use Octokit::Response::RaiseError + http.adapter Faraday.default_adapter + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/error.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/error.rb new file mode 100644 index 000000000000..16c5702f85b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/error.rb @@ -0,0 +1,346 @@ +module Octokit + # Custom error class for rescuing from all GitHub errors + class Error < StandardError + attr_reader :context + # Returns the appropriate Octokit::Error subclass based + # on status and response message + # + # @param [Hash] response HTTP response + # @return [Octokit::Error] + def self.from_response(response) + status = response[:status].to_i + body = response[:body].to_s + headers = response[:response_headers] + + if klass = case status + when 400 then Octokit::BadRequest + when 401 then error_for_401(headers) + when 403 then error_for_403(body) + when 404 then error_for_404(body) + when 405 then Octokit::MethodNotAllowed + when 406 then Octokit::NotAcceptable + when 409 then Octokit::Conflict + when 415 then Octokit::UnsupportedMediaType + when 422 then error_for_422(body) + when 451 then Octokit::UnavailableForLegalReasons + when 400..499 then Octokit::ClientError + when 500 then Octokit::InternalServerError + when 501 then Octokit::NotImplemented + when 502 then Octokit::BadGateway + when 503 then Octokit::ServiceUnavailable + when 500..599 then Octokit::ServerError + end + klass.new(response) + end + end + + def build_error_context + if RATE_LIMITED_ERRORS.include?(self.class) + @context = Octokit::RateLimit.from_response(@response) + end + end + + def initialize(response=nil) + @response = response + super(build_error_message) + build_error_context + end + + # Documentation URL returned by the API for some errors + # + # @return [String] + def documentation_url + data[:documentation_url] if data.is_a? Hash + end + + # Returns most appropriate error for 401 HTTP status code + # @private + def self.error_for_401(headers) + if Octokit::OneTimePasswordRequired.required_header(headers) + Octokit::OneTimePasswordRequired + else + Octokit::Unauthorized + end + end + + # Returns most appropriate error for 403 HTTP status code + # @private + def self.error_for_403(body) + if body =~ /rate limit exceeded/i + Octokit::TooManyRequests + elsif body =~ /login attempts exceeded/i + Octokit::TooManyLoginAttempts + elsif body =~ /returns blobs up to [0-9]+ MB/i + Octokit::TooLargeContent + elsif body =~ /abuse/i + Octokit::AbuseDetected + elsif body =~ /repository access blocked/i + Octokit::RepositoryUnavailable + elsif body =~ /email address must be verified/i + Octokit::UnverifiedEmail + elsif body =~ /account was suspended/i + Octokit::AccountSuspended + elsif body =~ /billing issue/i + Octokit::BillingIssue + elsif body =~ /Resource protected by organization SAML enforcement/i + Octokit::SAMLProtected + elsif body =~ /suspended your access|This installation has been suspended/i + Octokit::InstallationSuspended + else + Octokit::Forbidden + end + end + + # Return most appropriate error for 404 HTTP status code + # @private + def self.error_for_404(body) + if body =~ /Branch not protected/i + Octokit::BranchNotProtected + else + Octokit::NotFound + end + end + + # Return most appropriate error for 422 HTTP status code + # @private + def self.error_for_422(body) + if body =~ /PullRequestReviewComment/i && body =~ /(commit_id|end_commit_oid) is not part of the pull request/i + Octokit::CommitIsNotPartOfPullRequest + else + Octokit::UnprocessableEntity + end + end + + # Array of validation errors + # @return [Array<Hash>] Error info + def errors + if data && data.is_a?(Hash) + data[:errors] || [] + else + [] + end + end + + # Status code returned by the GitHub server. + # + # @return [Integer] + def response_status + @response[:status] + end + + # Headers returned by the GitHub server. + # + # @return [Hash] + def response_headers + @response[:response_headers] + end + + # Body returned by the GitHub server. + # + # @return [String] + def response_body + @response[:body] + end + + private + + def data + @data ||= + if (body = @response[:body]) && !body.empty? + if body.is_a?(String) && + @response[:response_headers] && + @response[:response_headers][:content_type] =~ /json/ + + Sawyer::Agent.serializer.decode(body) + else + body + end + else + nil + end + end + + def response_message + case data + when Hash + data[:message] + when String + data + end + end + + def response_error + "Error: #{data[:error]}" if data.is_a?(Hash) && data[:error] + end + + def response_error_summary + return nil unless data.is_a?(Hash) && !Array(data[:errors]).empty? + + summary = "\nError summary:\n" + summary << data[:errors].map do |error| + if error.is_a? Hash + error.map { |k,v| " #{k}: #{v}" } + else + " #{error}" + end + end.join("\n") + + summary + end + + def build_error_message + return nil if @response.nil? + + message = "#{@response[:method].to_s.upcase} " + message << redact_url(@response[:url].to_s) + ": " + message << "#{@response[:status]} - " + message << "#{response_message}" unless response_message.nil? + message << "#{response_error}" unless response_error.nil? + message << "#{response_error_summary}" unless response_error_summary.nil? + message << " // See: #{documentation_url}" unless documentation_url.nil? + message + end + + def redact_url(url_string) + %w[client_secret access_token].each do |token| + url_string.gsub!(/#{token}=\S+/, "#{token}=(redacted)") if url_string.include? token + end + url_string + end + end + + # Raised on errors in the 400-499 range + class ClientError < Error; end + + # Raised when GitHub returns a 400 HTTP status code + class BadRequest < ClientError; end + + # Raised when GitHub returns a 401 HTTP status code + class Unauthorized < ClientError; end + + # Raised when GitHub returns a 401 HTTP status code + # and headers include "X-GitHub-OTP" + class OneTimePasswordRequired < ClientError + #@private + OTP_DELIVERY_PATTERN = /required; (\w+)/i + + #@private + def self.required_header(headers) + OTP_DELIVERY_PATTERN.match headers['X-GitHub-OTP'].to_s + end + + # Delivery method for the user's OTP + # + # @return [String] + def password_delivery + @password_delivery ||= delivery_method_from_header + end + + private + + def delivery_method_from_header + if match = self.class.required_header(@response[:response_headers]) + match[1] + end + end + end + + # Raised when GitHub returns a 403 HTTP status code + class Forbidden < ClientError; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'rate limit exceeded' + class TooManyRequests < Forbidden; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'login attempts exceeded' + class TooManyLoginAttempts < Forbidden; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'returns blobs up to [0-9]+ MB' + class TooLargeContent < Forbidden; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'abuse' + class AbuseDetected < Forbidden; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'repository access blocked' + class RepositoryUnavailable < Forbidden; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'email address must be verified' + class UnverifiedEmail < Forbidden; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'account was suspended' + class AccountSuspended < Forbidden; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'billing issue' + class BillingIssue < Forbidden; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'Resource protected by organization SAML enforcement' + class SAMLProtected < Forbidden; end + + # Raised when GitHub returns a 403 HTTP status code + # and body matches 'suspended your access' + class InstallationSuspended < Forbidden; end + + # Raised when GitHub returns a 404 HTTP status code + class NotFound < ClientError; end + + # Raised when GitHub returns a 404 HTTP status code + # and body matches 'Branch not protected' + class BranchNotProtected < ClientError; end + + # Raised when GitHub returns a 405 HTTP status code + class MethodNotAllowed < ClientError; end + + # Raised when GitHub returns a 406 HTTP status code + class NotAcceptable < ClientError; end + + # Raised when GitHub returns a 409 HTTP status code + class Conflict < ClientError; end + + # Raised when GitHub returns a 414 HTTP status code + class UnsupportedMediaType < ClientError; end + + # Raised when GitHub returns a 422 HTTP status code + class UnprocessableEntity < ClientError; end + + # Raised when GitHub returns a 422 HTTP status code + # and body matches 'PullRequestReviewComment' and 'commit_id (or end_commit_oid) is not part of the pull request' + class CommitIsNotPartOfPullRequest < UnprocessableEntity; end + + # Raised when GitHub returns a 451 HTTP status code + class UnavailableForLegalReasons < ClientError; end + + # Raised on errors in the 500-599 range + class ServerError < Error; end + + # Raised when GitHub returns a 500 HTTP status code + class InternalServerError < ServerError; end + + # Raised when GitHub returns a 501 HTTP status code + class NotImplemented < ServerError; end + + # Raised when GitHub returns a 502 HTTP status code + class BadGateway < ServerError; end + + # Raised when GitHub returns a 503 HTTP status code + class ServiceUnavailable < ServerError; end + + # Raised when client fails to provide valid Content-Type + class MissingContentType < ArgumentError; end + + # Raised when a method requires an application client_id + # and secret but none is provided + class ApplicationCredentialsRequired < StandardError; end + + # Raised when a repository is created with an invalid format + class InvalidRepository < ArgumentError; end + + RATE_LIMITED_ERRORS = [Octokit::TooManyRequests, Octokit::AbuseDetected] +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/gist.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/gist.rb new file mode 100644 index 000000000000..6b06b44e7617 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/gist.rb @@ -0,0 +1,36 @@ +module Octokit + + # Class to parse and create Gist URLs + class Gist + + # !@attribute id + # @return [String] Gist ID + attr_accessor :id + + # Instantiate {Gist} object from Gist URL + # @ return [Gist] + def self.from_url(url) + Gist.new(URI.parse(url).path[1..-1]) + end + + def initialize(gist) + case gist + when Integer, String + @id = gist.to_s + end + end + + # Gist ID + # @return [String] + def to_s + @id + end + + # Gist URL + # @return [String] + def url + "https://gist.github.com/#{@id}" + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/middleware/follow_redirects.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/middleware/follow_redirects.rb new file mode 100644 index 000000000000..3b3556ee783e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/middleware/follow_redirects.rb @@ -0,0 +1,131 @@ +require 'faraday' +require 'set' + +# Adapted from lostisland/faraday_middleware. Trimmed down to just the logic +# that we need for octokit.rb. +# +# https://github.com/lostisland/faraday_middleware/blob/138766e/lib/faraday_middleware/response/follow_redirects.rb + +module Octokit + + module Middleware + + # Public: Exception thrown when the maximum amount of requests is exceeded. + class RedirectLimitReached < Faraday::ClientError + attr_reader :response + + def initialize(response) + super "too many redirects; last one to: #{response['location']}" + @response = response + end + end + + # Public: Follow HTTP 301, 302, 303, and 307 redirects. + # + # For HTTP 303, the original GET, POST, PUT, DELETE, or PATCH request gets + # converted into a GET. For HTTP 301, 302, and 307, the HTTP method remains + # unchanged. + # + # This middleware currently only works with synchronous requests; i.e. it + # doesn't support parallelism. + class FollowRedirects < Faraday::Middleware + # HTTP methods for which 30x redirects can be followed + ALLOWED_METHODS = Set.new [:head, :options, :get, :post, :put, :patch, :delete] + + # HTTP redirect status codes that this middleware implements + REDIRECT_CODES = Set.new [301, 302, 303, 307] + + # Keys in env hash which will get cleared between requests + ENV_TO_CLEAR = Set.new [:status, :response, :response_headers] + + # Default value for max redirects followed + FOLLOW_LIMIT = 3 + + # Regex that matches characters that need to be escaped in URLs, sans + # the "%" character which we assume already represents an escaped + # sequence. + URI_UNSAFE = /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]%]/ + + # Public: Initialize the middleware. + # + # options - An options Hash (default: {}): + # :limit - A Integer redirect limit (default: 3). + def initialize(app, options = {}) + super(app) + @options = options + + @convert_to_get = Set.new [303] + end + + def call(env) + perform_with_redirection(env, follow_limit) + end + + private + + def convert_to_get?(response) + ![:head, :options].include?(response.env[:method]) && + @convert_to_get.include?(response.status) + end + + def perform_with_redirection(env, follows) + request_body = env[:body] + response = @app.call(env) + + response.on_complete do |response_env| + if follow_redirect?(response_env, response) + raise(RedirectLimitReached, response) if follows.zero? + new_request_env = update_env(response_env, request_body, response) + response = perform_with_redirection(new_request_env, follows - 1) + end + end + response + end + + def update_env(env, request_body, response) + original_url = env[:url] + env[:url] += safe_escape(response["location"]) + unless same_host?(original_url, env[:url]) + env[:request_headers].delete("Authorization") + end + + if convert_to_get?(response) + env[:method] = :get + env[:body] = nil + else + env[:body] = request_body + end + + ENV_TO_CLEAR.each { |key| env.delete(key) } + + env + end + + def follow_redirect?(env, response) + ALLOWED_METHODS.include?(env[:method]) && + REDIRECT_CODES.include?(response.status) + end + + def follow_limit + @options.fetch(:limit, FOLLOW_LIMIT) + end + + def same_host?(original_url, redirect_url) + original_uri = Addressable::URI.parse(original_url) + redirect_uri = Addressable::URI.parse(redirect_url) + + redirect_uri.host.nil? || original_uri.host == redirect_uri.host + end + + # Internal: Escapes unsafe characters from a URL which might be a path + # component only or a fully-qualified URI so that it can be joined onto a + # URI:HTTP using the `+` operator. Doesn't escape "%" characters so to not + # risk double-escaping. + def safe_escape(uri) + uri.to_s.gsub(URI_UNSAFE) { |match| + "%" + match.unpack("H2" * match.bytesize).join("%").upcase + } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/organization.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/organization.rb new file mode 100644 index 000000000000..24bd2da342f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/organization.rb @@ -0,0 +1,17 @@ +module Octokit + # GitHub organization class to generate API path urls + class Organization + # Get the api path for an organization + # + # @param org [String, Integer] GitHub organization login or id + # @return [String] Organization Api path + def self.path org + case org + when String + "orgs/#{org}" + when Integer + "organizations/#{org}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/preview.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/preview.rb new file mode 100644 index 000000000000..ef1c4546c6cb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/preview.rb @@ -0,0 +1,49 @@ +module Octokit + + # Default setup options for preview features + module Preview + + PREVIEW_TYPES = { + :applications_api => 'application/vnd.github.doctor-strange-preview+json'.freeze, + :branch_protection => 'application/vnd.github.luke-cage-preview+json'.freeze, + :checks => 'application/vnd.github.antiope-preview+json'.freeze, + :commit_search => 'application/vnd.github.cloak-preview+json'.freeze, + :commit_pulls => 'application/vnd.github.groot-preview+json'.freeze, + :commit_branches => 'application/vnd.github.groot-preview+json'.freeze, + :migrations => 'application/vnd.github.wyandotte-preview+json'.freeze, + :licenses => 'application/vnd.github.drax-preview+json'.freeze, + :source_imports => 'application/vnd.github.barred-rock-preview'.freeze, + :reactions => 'application/vnd.github.squirrel-girl-preview'.freeze, + :transfer_repository => 'application/vnd.github.nightshade-preview+json'.freeze, + :issue_timelines => 'application/vnd.github.mockingbird-preview+json'.freeze, + :nested_teams => 'application/vnd.github.hellcat-preview+json'.freeze, + :pages => 'application/vnd.github.mister-fantastic-preview+json'.freeze, + :projects => 'application/vnd.github.inertia-preview+json'.freeze, + :traffic => 'application/vnd.github.spiderman-preview'.freeze, + :topics => 'application/vnd.github.mercy-preview+json'.freeze, + :community_profile => 'application/vnd.github.black-panther-preview+json'.freeze, + :strict_validation => 'application/vnd.github.speedy-preview+json'.freeze, + :drafts => 'application/vnd.github.shadow-cat-preview'.freeze, + :template_repositories => 'application/vnd.github.baptiste-preview+json'.freeze, + :uninstall_github_app => 'application/vnd.github.gambit-preview+json'.freeze, + :project_card_events => 'application/vnd.github.starfox-preview+json'.freeze, + :vulnerability_alerts => 'application/vnd.github.dorian-preview+json'.freeze, + } + + def ensure_api_media_type(type, options) + if options[:accept].nil? + options[:accept] = PREVIEW_TYPES[type] + warn_preview(type) + end + options + end + + def warn_preview(type) + octokit_warn <<-EOS +WARNING: The preview version of the #{type.to_s.capitalize} API is not yet suitable for production use. +You can avoid this message by supplying an appropriate media type in the 'Accept' request +header. +EOS + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/rate_limit.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/rate_limit.rb new file mode 100644 index 000000000000..201bc674c9b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/rate_limit.rb @@ -0,0 +1,33 @@ +module Octokit + + # Class for API Rate Limit info + # + # @!attribute [w] limit + # @return [Integer] Max tries per rate limit period + # @!attribute [w] remaining + # @return [Integer] Remaining tries per rate limit period + # @!attribute [w] resets_at + # @return [Time] Indicates when rate limit resets + # @!attribute [w] resets_in + # @return [Integer] Number of seconds when rate limit resets + # + # @see https://developer.github.com/v3/#rate-limiting + class RateLimit < Struct.new(:limit, :remaining, :resets_at, :resets_in) + + # Get rate limit info from HTTP response + # + # @param response [#headers] HTTP response + # @return [RateLimit] + def self.from_response(response) + info = new + if response && response.respond_to?(:headers) && !response.headers.nil? + info.limit = (response.headers['X-RateLimit-Limit'] || 1).to_i + info.remaining = (response.headers['X-RateLimit-Remaining'] || 1).to_i + info.resets_at = Time.at((response.headers['X-RateLimit-Reset'] || Time.now).to_i) + info.resets_in = [(info.resets_at - Time.now).to_i, 0].max + end + + info + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/repo_arguments.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/repo_arguments.rb new file mode 100644 index 000000000000..6adfee4dbffc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/repo_arguments.rb @@ -0,0 +1,19 @@ +module Octokit + + # Class to extract options from Ruby arguments for + # Repository-related methods + class RepoArguments < Arguments + + # !@attribute [r] repo + # @return [Repository] + attr_reader :repo + + def initialize(args) + arguments = super(args) + @repo = arguments.shift + + arguments + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/repository.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/repository.rb new file mode 100644 index 000000000000..caa3c5b2013f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/repository.rb @@ -0,0 +1,95 @@ +module Octokit + + # Class to parse GitHub repository owner and name from + # URLs and to generate URLs + class Repository + attr_accessor :owner, :name, :id + NAME_WITH_OWNER_PATTERN = /\A[\w.-]+\/[\w.-]+\z/i + + # Instantiate from a GitHub repository URL + # + # @return [Repository] + def self.from_url(url) + new URI.parse(url).path[1..-1]. + gsub(/^repos\//,''). + split('/', 3)[0..1]. + join('/') + end + + # @raise [Octokit::InvalidRepository] if the repository + # has an invalid format + def initialize(repo) + case repo + when Integer + @id = repo + when NAME_WITH_OWNER_PATTERN + @owner, @name = repo.split("/") + when Repository + @owner = repo.owner + @name = repo.name + when Hash + @name = repo[:repo] || repo[:name] + @owner = repo[:owner] || repo[:user] || repo[:username] + else + raise_invalid_repository!(repo) + end + if @owner && @name + validate_owner_and_name!(repo) + end + end + + # Repository owner/name + # @return [String] + def slug + "#{@owner}/#{@name}" + end + alias :to_s :slug + + # @return [String] Repository API path + def path + return named_api_path if @owner && @name + return id_api_path if @id + end + + # Get the api path for a repo + # @param repo [Integer, String, Hash, Repository] A GitHub repository. + # @return [String] Api path. + def self.path repo + new(repo).path + end + + # @return [String] Api path for owner/name identified repos + def named_api_path + "repos/#{slug}" + end + + # @return [String] Api path for id identified repos + def id_api_path + "repositories/#{@id}" + end + + # Repository URL based on {Octokit::Client#web_endpoint} + # @return [String] + def url + "#{Octokit.web_endpoint}#{slug}" + end + + alias :user :owner + alias :username :owner + alias :repo :name + + private + + def validate_owner_and_name!(repo) + if @owner.include?('/') || @name.include?('/') || !url.match(URI::ABS_URI) + raise_invalid_repository!(repo) + end + end + + def raise_invalid_repository!(repo) + msg = "#{repo.inspect} is invalid as a repository identifier. " + + "Use the user/repo (String) format, or the repository ID (Integer), or a hash containing :repo and :user keys." + raise Octokit::InvalidRepository, msg + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/response/feed_parser.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/response/feed_parser.rb new file mode 100644 index 000000000000..b3d1cd4eb97d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/response/feed_parser.rb @@ -0,0 +1,19 @@ +require 'faraday' + +module Octokit + + module Response + + # Parses RSS and Atom feed responses. + class FeedParser < Faraday::Response::Middleware + + def on_complete(env) + if env[:response_headers]["content-type"] =~ /(\batom|\brss)/ + require 'rss' + env[:body] = RSS::Parser.parse env[:body] + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/response/raise_error.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/response/raise_error.rb new file mode 100644 index 000000000000..9da2a1a2662a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/response/raise_error.rb @@ -0,0 +1,19 @@ +require 'faraday' +require 'octokit/error' + +module Octokit + # Faraday response middleware + module Response + + # This class raises an Octokit-flavored exception based + # HTTP status codes returned by the API + class RaiseError < Faraday::Response::Middleware + + def on_complete(response) + if error = Octokit::Error.from_response(response) + raise error + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/user.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/user.rb new file mode 100644 index 000000000000..d8f83f3ca9f3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/user.rb @@ -0,0 +1,19 @@ +module Octokit + # GitHub user class to generate API path urls + class User + # Get the api path for a user + # + # @param user [String, Integer] GitHub user login or id + # @return [String] User Api path + def self.path user + case user + when String + "users/#{user}" + when Integer + "user/#{user}" + else + "user" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/version.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/version.rb new file mode 100644 index 000000000000..e0362462ca83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/version.rb @@ -0,0 +1,17 @@ +module Octokit + # Current major release. + # @return [Integer] + MAJOR = 4 + + # Current minor release. + # @return [Integer] + MINOR = 20 + + # Current patch level. + # @return [Integer] + PATCH = 0 + + # Full release version. + # @return [String] + VERSION = [MAJOR, MINOR, PATCH].join('.').freeze +end diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/warnable.rb b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/warnable.rb new file mode 100644 index 000000000000..f0ce150bc6e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/lib/octokit/warnable.rb @@ -0,0 +1,17 @@ +module Octokit + + # Allows warnings to be suppressed via environment variable. + module Warnable + + # Wrapper around Kernel#warn to print warnings unless + # OCTOKIT_SILENT is set to true. + # + # @return [nil] + def octokit_warn(*message) + unless ENV['OCTOKIT_SILENT'] + warn message + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/octokit.gemspec b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/octokit.gemspec new file mode 100644 index 000000000000..765185b12e1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/octokit-4.20.0/octokit.gemspec @@ -0,0 +1,23 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'octokit/version' + +Gem::Specification.new do |spec| + spec.add_development_dependency 'bundler', '>= 1', '< 3' + spec.add_dependency 'sawyer', '>= 0.5.3', '~> 0.8.0' + spec.add_dependency 'faraday', '>= 0.9' + spec.authors = ["Wynn Netherland", "Erik Michaels-Ober", "Clint Shryock"] + spec.description = %q{Simple wrapper for the GitHub API} + spec.email = ['wynn.netherland@gmail.com', 'sferik@gmail.com', 'clint@ctshryock.com'] + spec.files = %w(.document CONTRIBUTING.md LICENSE.md README.md Rakefile octokit.gemspec) + spec.files += Dir.glob("lib/**/*.rb") + spec.homepage = 'https://github.com/octokit/octokit.rb' + spec.licenses = ['MIT'] + spec.name = 'octokit' + spec.require_paths = ['lib'] + spec.required_ruby_version = '>= 2.0.0' + spec.required_rubygems_version = '>= 1.3.5' + spec.summary = "Ruby toolkit for working with the GitHub API" + spec.version = Octokit::VERSION.dup +end diff --git a/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/Gemfile b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/Gemfile new file mode 100644 index 000000000000..60ea36cfecb0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/Gemfile @@ -0,0 +1,22 @@ +# Frozen-string-literal: true +# Copyright: 2015 - 2017 Jordon Bedwell - MIT License +# Encoding: utf-8 + +source "https://rubygems.org" +gem "rake", :require => false +gemspec + +group :test do + gem "safe_yaml", :require => false + gem "luna-rspec-formatters", :require => false + gem "simplecov", :require => false +end + +group :development do + gem "rspec", :require => false + gem "rspec-helpers", :require => false + gem "rubocop", :github => "bbatsov/rubocop", :require => false + gem "benchmark-ips", :require => false + gem "simple-ansi", :require => false + gem "pry", :require => false +end diff --git a/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/LICENSE b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/LICENSE new file mode 100644 index 000000000000..139db7925ae8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 - 2017 Jordon Bedwell + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/Rakefile b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/Rakefile new file mode 100644 index 000000000000..a09025154e9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/Rakefile @@ -0,0 +1,12 @@ +# Frozen-string-literal: true +# Copyright: 2017 - 2018 - MIT License +# Source: https://github.com/envygeeks/devfiles +# Author: Jordon Bedwell +# Encoding: utf-8 + +task default: [:spec] +task(:spec) { exec "script/test" } +task(:test) { exec "script/test" } +Dir.glob("script/rake.d/*.rake").each do |v| + load v +end diff --git a/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/lib/pathutil.rb b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/lib/pathutil.rb new file mode 100644 index 000000000000..1a15873ddbac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/lib/pathutil.rb @@ -0,0 +1,909 @@ +# Frozen-string-literal: true +# Copyright: 2015 - 2017 Jordon Bedwell - MIT License +# Encoding: utf-8 + +require "pathutil/helpers" +require "forwardable/extended" +require "find" + +class Pathutil + attr_writer :encoding + extend Forwardable::Extended + extend Helpers + + # -- + # @note A lot of this class can be compatible with Pathname. + # Initialize a new instance. + # @return Pathutil + # -- + def initialize(path) + return @path = path if path.is_a?(String) + return @path = path.to_path if path.respond_to?(:to_path) + return @path = path.to_s + end + + # -- + # Make a path relative. + # -- + def relative + return self if relative? + self.class.new(strip_windows_drive.gsub( + %r!\A(\\+|/+)!, "" + )) + end + + # -- + # Make a path absolute + # -- + def absolute + return self if absolute? + self.class.new("/").join( + @path + ) + end + + # -- + # @see Pathname#cleanpath. + # @note This is a wholesale rip and cleanup of Pathname#cleanpath + # @return Pathutil + # -- + def cleanpath(symlink = false) + symlink ? conservative_cleanpath : aggressive_cleanpath + end + + # -- + # @yield Pathutil + # @note It will return all results that it finds across all ascending paths. + # @example Pathutil.new("~/").expand_path.search_backwards(".bashrc") => [#<Pathutil:/home/user/.bashrc>] + # Search backwards for a file (like Rakefile, _config.yml, opts.yml). + # @return Enum + # -- + def search_backwards(file, backwards: Float::INFINITY) + ary = [] + + ascend.with_index(1).each do |path, index| + if index > backwards + break + + else + Dir.chdir path do + if block_given? + file = self.class.new(file) + if yield(file) + ary.push( + file + ) + end + + elsif File.exist?(file) + ary.push(self.class.new( + path.join(file) + )) + end + end + end + end + + ary + end + + # -- + # Read the file as a YAML file turning it into an object. + # @see self.class.load_yaml as this a direct alias of that method. + # @return Hash + # -- + def read_yaml(throw_missing: false, **kwd) + self.class.load_yaml( + read, **kwd + ) + + rescue Errno::ENOENT + throw_missing ? raise : ( + return {} + ) + end + + # -- + # Read the file as a JSON file turning it into an object. + # @see self.class.read_json as this is a direct alias of that method. + # @return Hash + # -- + def read_json(throw_missing: false) + JSON.parse( + read + ) + + rescue Errno::ENOENT + throw_missing ? raise : ( + return {} + ) + end + + # -- + # @note The blank part is intentionally left there so that you can rejoin. + # Splits the path into all parts so that you can do step by step comparisons + # @example Pathutil.new("/my/path").split_path # => ["", "my", "path"] + # @return Array<String> + # -- + def split_path + @path.split( + %r!\\+|/+! + ) + end + + # -- + # @see `String#==` for more details. + # A stricter version of `==` that also makes sure the object matches. + # @return true|false + # -- + def ===(other) + other.is_a?(self.class) && @path == other + end + + # -- + # @example Pathutil.new("/hello") >= Pathutil.new("/") # => true + # @example Pathutil.new("/hello") >= Pathutil.new("/hello") # => true + # Checks to see if a path falls within a path and deeper or is the other. + # @return true|false + # -- + def >=(other) + mine, other = expanded_paths(other) + return true if other == mine + mine.in_path?(other) + end + + # -- + # @example Pathutil.new("/hello/world") > Pathutil.new("/hello") # => true + # Strictly checks to see if a path is deeper but within the path of the other. + # @return true|false + # -- + def >(other) + mine, other = expanded_paths(other) + return false if other == mine + mine.in_path?(other) + end + + # -- + # @example Pathutil.new("/") < Pathutil.new("/hello") # => true + # Strictly check to see if a path is behind other path but within it. + # @return true|false + # -- + def <(other) + mine, other = expanded_paths(other) + return false if other == mine + other.in_path?(mine) + end + + # -- + # Check to see if a path is behind the other path but within it. + # @example Pathutil.new("/hello") < Pathutil.new("/hello") # => true + # @example Pathutil.new("/") < Pathutil.new("/hello") # => true + # @return true|false + # -- + def <=(other) + mine, other = expanded_paths(other) + return true if other == mine + other.in_path?(mine) + end + + # -- + # @note "./" is considered relative. + # Check to see if the path is absolute, as in: starts with "/" + # @return true|false + # -- + def absolute? + return !!( + @path =~ %r!\A(?:[A-Za-z]:)?(?:\\+|/+)! + ) + end + + # -- + # @yield Pathutil + # Break apart the path and yield each with the previous parts. + # @example Pathutil.new("/hello/world").ascend.to_a # => ["/", "/hello", "/hello/world"] + # @example Pathutil.new("/hello/world").ascend { |path| $stdout.puts path } + # @return Enum + # -- + def ascend + unless block_given? + return to_enum( + __method__ + ) + end + + yield( + path = self + ) + + while (new_path = path.dirname) + if path == new_path || new_path == "." + break + else + path = new_path + yield new_path + end + end + + nil + end + + # -- + # @yield Pathutil + # Break apart the path in reverse order and descend into the path. + # @example Pathutil.new("/hello/world").descend.to_a # => ["/hello/world", "/hello", "/"] + # @example Pathutil.new("/hello/world").descend { |path| $stdout.puts path } + # @return Enum + # -- + def descend + unless block_given? + return to_enum( + __method__ + ) + end + + ascend.to_a.reverse_each do |val| + yield val + end + + nil + end + + # -- + # @yield Pathutil + # @example Pathutil.new("/hello/world").each_line { |line| $stdout.puts line } + # Wraps `readlines` and allows you to yield on the result. + # @return Enum + # -- + def each_line + return to_enum(__method__) unless block_given? + readlines.each do |line| + yield line + end + + nil + end + + # -- + # @example Pathutil.new("/hello").fnmatch?("/hello") # => true + # Unlike traditional `fnmatch`, with this one `Regexp` is allowed. + # @example Pathutil.new("/hello").fnmatch?(/h/) # => true + # @see `File#fnmatch` for more information. + # @return true|false + # -- + def fnmatch?(matcher) + matcher.is_a?(Regexp) ? !!(self =~ matcher) : \ + File.fnmatch(matcher, self) + end + + # -- + # Allows you to quickly determine if the file is the root folder. + # @return true|false + # -- + def root? + !!(self =~ %r!\A(?:[A-Za-z]:)?(?:\\+|/+)\z!) + end + + # -- + # Allows you to check if the current path is in the path you want. + # @return true|false + # -- + def in_path?(path) + path = self.class.new(path).expand_path.split_path + mine = (symlink?? expand_path.realpath : expand_path).split_path + path.each_with_index { |part, index| return false if mine[index] != part } + true + end + + # -- + def inspect + "#<#{self.class}:#{@path}>" + end + + # -- + # @return Array<Pathutil> + # Grab all of the children from the current directory, including hidden. + # @yield Pathutil + # -- + def children + ary = [] + + Dir.foreach(@path) do |path| + if path == "." || path == ".." + next + else + path = self.class.new(File.join(@path, path)) + yield path if block_given? + ary.push( + path + ) + end + end + + ary + end + + # -- + # @yield Pathutil + # Allows you to glob however you wish to glob in the current `Pathutil` + # @see `File::Constants` for a list of flags. + # @return Enum + # -- + def glob(pattern, flags = 0) + unless block_given? + return to_enum( + __method__, pattern, flags + ) + end + + chdir do + Dir.glob(pattern, flags).each do |file| + yield self.class.new( + File.join(@path, file) + ) + end + end + + nil + end + + # -- + # @yield &block + # Move to the current directory temporarily (or for good) and do work son. + # @note you do not need to ship a block at all. + # @return nil + # -- + def chdir + if !block_given? + Dir.chdir( + @path + ) + + else + Dir.chdir @path do + yield + end + end + end + + # -- + # @yield Pathutil + # Find all files without care and yield the given block. + # @return Enum + # -- + def find + return to_enum(__method__) unless block_given? + Find.find @path do |val| + yield self.class.new(val) + end + end + + # -- + # @yield Pathutil + # Splits the path returning each part (filename) back to you. + # @return Enum + # -- + def each_filename + return to_enum(__method__) unless block_given? + @path.split(File::SEPARATOR).delete_if(&:empty?).each do |file| + yield file + end + end + + # -- + # Get the parent of the current path. + # @note This will simply return self if "/". + # @return Pathutil + # -- + def parent + return self if @path == "/" + self.class.new(absolute?? File.dirname(@path) : File.join( + @path, ".." + )) + end + + # -- + # @yield Pathutil + # Split the file into its dirname and basename, so you can do stuff. + # @return nil + # -- + def split + File.split(@path).collect! do |path| + self.class.new(path) + end + end + + # -- + # @note Your extension should start with "." + # Replace a files extension with your given extension. + # @return Pathutil + # -- + def sub_ext(ext) + self.class.new(@path.chomp(File.extname(@path)) + ext) + end + + # -- + # A less complex version of `relative_path_from` that simply uses a + # `Regexp` and returns the full path if it cannot be determined. + # @return Pathutil + # -- + def relative_path_from(from) + from = self.class.new(from).expand_path.gsub(%r!/$!, "") + self.class.new(expand_path.gsub(%r!^#{ + from.regexp_escape + }/!, "")) + end + + # -- + # Expands the path and left joins the root to the path. + # @return Pathutil + # -- + def enforce_root(root) + return self if !relative? && in_path?(root) + self.class.new(root).join( + self + ) + end + + # -- + # Copy a directory, allowing symlinks if the link falls inside of the root. + # This is indented for people who wish some safety to their copies. + # @note Ignore is ignored on safe_copy file because it's explicit. + # @return nil + # -- + def safe_copy(to, root: nil, ignore: []) + raise ArgumentError, "must give a root" unless root + root = self.class.new(root) + to = self.class.new(to) + + if directory? + safe_copy_directory(to, { + :root => root, :ignore => ignore + }) + + else + safe_copy_file(to, { + :root => root + }) + end + end + + # -- + # @see `self.class.normalize` as this is an alias. + # -- + def normalize + return @normalize ||= begin + self.class.normalize + end + end + + # -- + # @see `self.class.encoding` as this is an alias. + # -- + def encoding + return @encoding ||= begin + self.class.encoding + end + end + + # -- + # @note You can set the default encodings via the class. + # Read took two steroid shots: it can normalize your string, and encode. + # @return String + # -- + def read(*args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:read] + File.read(self, *args, kwd).encode({ + :universal_newline => true + }) + + else + File.read( + self, *args, kwd + ) + end + end + + # -- + # @note You can set the default encodings via the class. + # Binread took two steroid shots: it can normalize your string, and encode. + # @return String + # -- + def binread(*args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:read] + File.binread(self, *args, kwd).encode({ + :universal_newline => true + }) + + else + File.read( + self, *args, kwd + ) + end + end + + # -- + # @note You can set the default encodings via the class. + # Readlines took two steroid shots: it can normalize your string, and encode. + # @return Array<String> + # -- + def readlines(*args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:read] + File.readlines(self, *args, kwd).encode({ + :universal_newline => true + }) + + else + File.readlines( + self, *args, kwd + ) + end + end + + # -- + # @note You can set the default encodings via the class. + # Write took two steroid shots: it can normalize your string, and encode. + # @return Fixnum<Bytes> + # -- + def write(data, *args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:write] + File.write(self, data.encode( + :crlf_newline => true + ), *args, kwd) + + else + File.write( + self, data, *args, kwd + ) + end + end + + # -- + # @note You can set the default encodings via the class. + # Binwrite took two steroid shots: it can normalize your string, and encode. + # @return Fixnum<Bytes> + # -- + def binwrite(data, *args, **kwd) + kwd[:encoding] ||= encoding + + if normalize[:write] + File.binwrite(self, data.encode( + :crlf_newline => true + ), *args, kwd) + + else + File.binwrite( + self, data, *args, kwd + ) + end + end + + # -- + def to_regexp(guard: true) + Regexp.new((guard ? "\\A" : "") + Regexp.escape( + self + )) + end + + # -- + # Strips the windows drive from the path. + # -- + def strip_windows_drive(path = @path) + self.class.new(path.gsub( + %r!\A[A-Za-z]:(?:\\+|/+)!, "" + )) + end + + # -- + # rubocop:disable Metrics/AbcSize + # rubocop:disable Metrics/CyclomaticComplexity + # rubocop:disable Metrics/PerceivedComplexity + # -- + + def aggressive_cleanpath + return self.class.new("/") if root? + + _out = split_path.each_with_object([]) do |part, out| + next if part == "." || (part == ".." && out.last == "") + if part == ".." && out.last && out.last != ".." + out.pop + + else + out.push( + part + ) + end + end + + # -- + + return self.class.new("/") if _out == [""].freeze + return self.class.new(".") if _out.empty? && (end_with?(".") || relative?) + self.class.new(_out.join("/")) + end + + # -- + def conservative_cleanpath + _out = split_path.each_with_object([]) do |part, out| + next if part == "." || (part == ".." && out.last == "") + out.push( + part + ) + end + + # -- + + if !_out.empty? && basename == "." && _out.last != "" && _out.last != ".." + _out << "." + end + + # -- + + return self.class.new("/") if _out == [""].freeze + return self.class.new(".") if _out.empty? && (end_with?(".") || relative?) + return self.class.new(_out.join("/")).join("") if @path =~ %r!/\z! \ + && _out.last != "." && _out.last != ".." + self.class.new(_out.join("/")) + end + + # -- + # rubocop:enable Metrics/AbcSize + # rubocop:enable Metrics/CyclomaticComplexity + # rubocop:enable Metrics/PerceivedComplexity + # Expand the paths and return. + # -- + private + def expanded_paths(path) + return expand_path, self.class.new(path).expand_path + end + + # -- + # Safely copy a file. + # -- + private + def safe_copy_file(to, root: nil) + raise Errno::EPERM, "#{self} not in #{root}" unless in_path?(root) + FileUtils.cp(self, to, { + :preserve => true + }) + end + + # -- + # Safely copy a directory and it's sub-files. + # -- + private + def safe_copy_directory(to, root: nil, ignore: []) + ignore = [ignore].flatten.uniq + + if !in_path?(root) + raise Errno::EPERM, "#{self} not in #{ + root + }" + + else + to.mkdir_p unless to.exist? + children do |file| + unless ignore.any? { |path| file.in_path?(path) } + if !file.in_path?(root) + raise Errno::EPERM, "#{file} not in #{ + root + }" + + elsif file.file? + FileUtils.cp(file, to, { + :preserve => true + }) + + else + path = file.realpath + path.safe_copy(to.join(file.basename), { + :root => root, :ignore => ignore + }) + end + end + end + end + end + + class << self + attr_writer :encoding + + # -- + # @note We do nothing special here. + # Get the current directory that Ruby knows about. + # @return Pathutil + # -- + def pwd + new( + Dir.pwd + ) + end + + alias gcwd pwd + alias cwd pwd + + # -- + # @note you are encouraged to override this if you need to. + # Aliases the default system encoding to us so that we can do most read + # and write operations with that encoding, instead of being crazy. + # -- + def encoding + return @encoding ||= begin + Encoding.default_external + end + end + + # -- + # Normalize CRLF -> LF on Windows reads, to ease your troubles. + # Normalize LF -> CLRF on Windows write, to ease your troubles. + # -- + def normalize + return @normalize ||= { + :read => Gem.win_platform?, + :write => Gem.win_platform? + } + end + + # -- + # Make a temporary directory. + # @note if you adruptly exit it will not remove the dir. + # @note this directory is removed on exit. + # @return Pathutil + # -- + def tmpdir(*args) + rtn = new(make_tmpname(*args)).tap(&:mkdir) + ObjectSpace.define_finalizer(rtn, proc do + rtn.rm_rf + end) + + rtn + end + + # -- + # Make a temporary file. + # @note if you adruptly exit it will not remove the dir. + # @note this file is removed on exit. + # @return Pathutil + # -- + def tmpfile(*args) + rtn = new(make_tmpname(*args)).tap(&:touch) + ObjectSpace.define_finalizer(rtn, proc do + rtn.rm_rf + end) + + rtn + end + end + + # -- + + rb_delegate :gcwd, :to => :"self.class" + rb_delegate :pwd, :to => :"self.class" + + # -- + + rb_delegate :sub, :to => :@path, :wrap => true + rb_delegate :chomp, :to => :@path, :wrap => true + rb_delegate :gsub, :to => :@path, :wrap => true + rb_delegate :[], :to => :@path + rb_delegate :=~, :to => :@path + rb_delegate :==, :to => :@path + rb_delegate :to_s, :to => :@path + rb_delegate :freeze, :to => :@path + rb_delegate :end_with?, :to => :@path + rb_delegate :start_with?, :to => :@path + rb_delegate :frozen?, :to => :@path + rb_delegate :to_str, :to => :@path + rb_delegate :"!~", :to => :@path + rb_delegate :<=>, :to => :@path + + # -- + + rb_delegate :chmod, :to => :File, :args => { :after => :@path } + rb_delegate :lchown, :to => :File, :args => { :after => :@path } + rb_delegate :lchmod, :to => :File, :args => { :after => :@path } + rb_delegate :chown, :to => :File, :args => { :after => :@path } + rb_delegate :basename, :to => :File, :args => :@path, :wrap => true + rb_delegate :dirname, :to => :File, :args => :@path, :wrap => true + rb_delegate :readlink, :to => :File, :args => :@path, :wrap => true + rb_delegate :expand_path, :to => :File, :args => :@path, :wrap => true + rb_delegate :realdirpath, :to => :File, :args => :@path, :wrap => true + rb_delegate :realpath, :to => :File, :args => :@path, :wrap => true + rb_delegate :rename, :to => :File, :args => :@path, :wrap => true + rb_delegate :join, :to => :File, :args => :@path, :wrap => true + rb_delegate :empty?, :to => :file, :args => :@path + rb_delegate :size, :to => :File, :args => :@path + rb_delegate :link, :to => :File, :args => :@path + rb_delegate :atime, :to => :File, :args => :@path + rb_delegate :ctime, :to => :File, :args => :@path + rb_delegate :lstat, :to => :File, :args => :@path + rb_delegate :utime, :to => :File, :args => :@path + rb_delegate :sysopen, :to => :File, :args => :@path + rb_delegate :birthtime, :to => :File, :args => :@path + rb_delegate :mountpoint?, :to => :File, :args => :@path + rb_delegate :truncate, :to => :File, :args => :@path + rb_delegate :symlink, :to => :File, :args => :@path + rb_delegate :extname, :to => :File, :args => :@path + rb_delegate :zero?, :to => :File, :args => :@path + rb_delegate :ftype, :to => :File, :args => :@path + rb_delegate :mtime, :to => :File, :args => :@path + rb_delegate :open, :to => :File, :args => :@path + rb_delegate :stat, :to => :File, :args => :@path + + # -- + + rb_delegate :pipe?, :to => :FileTest, :args => :@path + rb_delegate :file?, :to => :FileTest, :args => :@path + rb_delegate :owned?, :to => :FileTest, :args => :@path + rb_delegate :setgid?, :to => :FileTest, :args => :@path + rb_delegate :socket?, :to => :FileTest, :args => :@path + rb_delegate :readable?, :to => :FileTest, :args => :@path + rb_delegate :blockdev?, :to => :FileTest, :args => :@path + rb_delegate :directory?, :to => :FileTest, :args => :@path + rb_delegate :readable_real?, :to => :FileTest, :args => :@path + rb_delegate :world_readable?, :to => :FileTest, :args => :@path + rb_delegate :executable_real?, :to => :FileTest, :args => :@path + rb_delegate :world_writable?, :to => :FileTest, :args => :@path + rb_delegate :writable_real?, :to => :FileTest, :args => :@path + rb_delegate :executable?, :to => :FileTest, :args => :@path + rb_delegate :writable?, :to => :FileTest, :args => :@path + rb_delegate :grpowned?, :to => :FileTest, :args => :@path + rb_delegate :chardev?, :to => :FileTest, :args => :@path + rb_delegate :symlink?, :to => :FileTest, :args => :@path + rb_delegate :sticky?, :to => :FileTest, :args => :@path + rb_delegate :setuid?, :to => :FileTest, :args => :@path + rb_delegate :exist?, :to => :FileTest, :args => :@path + rb_delegate :size?, :to => :FileTest, :args => :@path + + # -- + + rb_delegate :rm_rf, :to => :FileUtils, :args => :@path + rb_delegate :rm_r, :to => :FileUtils, :args => :@path + rb_delegate :rm_f, :to => :FileUtils, :args => :@path + rb_delegate :rm, :to => :FileUtils, :args => :@path + rb_delegate :cp_r, :to => :FileUtils, :args => :@path + rb_delegate :touch, :to => :FileUtils, :args => :@path + rb_delegate :mkdir_p, :to => :FileUtils, :args => :@path + rb_delegate :mkpath, :to => :FileUtils, :args => :@path + rb_delegate :cp, :to => :FileUtils, :args => :@path + + # -- + + rb_delegate :each_child, :to => :children + rb_delegate :each_entry, :to => :children + rb_delegate :to_a, :to => :children + + # -- + + rb_delegate :opendir, :to => :Dir, :alias_of => :open + rb_delegate :relative?, :to => :self, :alias_of => :absolute?, :bool => :reverse + rb_delegate :regexp_escape, :to => :Regexp, :args => :@path, :alias_of => :escape + rb_delegate :shellescape, :to => :Shellwords, :args => :@path + rb_delegate :mkdir, :to => :Dir, :args => :@path + + # -- + + alias + join + alias delete rm + alias rmtree rm_r + alias to_path to_s + alias last basename + alias entries children + alias make_symlink symlink + alias cleanpath_conservative conservative_cleanpath + alias cleanpath_aggressive aggressive_cleanpath + alias prepend enforce_root + alias fnmatch fnmatch? + alias make_link link + alias first dirname + alias rmdir rm_r + alias unlink rm + alias / join +end diff --git a/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/lib/pathutil/helpers.rb b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/lib/pathutil/helpers.rb new file mode 100644 index 000000000000..7398008dba35 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/lib/pathutil/helpers.rb @@ -0,0 +1,129 @@ +# Frozen-string-literal: true +# Copyright: 2015 - 2017 Jordon Bedwell - MIT License +# Encoding: utf-8 + +class Pathutil + module Helpers + extend self + + # -- + + def allowed + return @allowed ||= begin + { + :yaml => { + :classes => [], + :symbols => [] + } + } + end + end + + # -- + # Wraps around YAML and SafeYAML to provide alternatives to Rubies. + # @note We default aliases to yes so we can detect if you explicit true. + # @return Hash + # -- + def load_yaml(data, safe: true, whitelist_classes: allowed[:yaml][:classes], \ + whitelist_symbols: allowed[:yaml][:symbols], aliases: :yes) + + require "yaml" + unless safe + return YAML.load( + data + ) + end + + if !YAML.respond_to?(:safe_load) + setup_safe_yaml whitelist_classes, aliases + SafeYAML.load( + data + ) + + else + YAML.safe_load( + data, + whitelist_classes, + whitelist_symbols, + aliases + ) + end + end + + # -- + # Make a temporary name suitable for temporary files and directories. + # @return String + # -- + def make_tmpname(prefix = "", suffix = nil, root = nil) + prefix = tmpname_prefix(prefix) + suffix = tmpname_suffix(suffix) + + root ||= Dir::Tmpname.tmpdir + File.join(root, __make_tmpname( + prefix, suffix + )) + end + + # -- + private + def __make_tmpname((prefix, suffix), number) + prefix &&= String.try_convert(prefix) || tmpname_agerr(:prefix, prefix) + suffix &&= String.try_convert(suffix) || tmpname_agerr(:suffix, suffix) + + time = Time.now.strftime("%Y%m%d") + path = "#{prefix}#{time}-#{$$}-#{rand(0x100000000).to_s(36)}".dup + path << "-#{number}" if number + path << suffix if suffix + path + end + + private + def tmpname_agerr(type, val) + raise ArgumentError, "unexpected #{type}: #{val.inspect}" + end + + # -- + private + def tmpname_suffix(suffix) + suffix = suffix.join("-") if suffix.is_a?(Array) + suffix = suffix.gsub(/\A\-/, "") unless !suffix || suffix.empty? + suffix + end + + # -- + # Cleanup the temp name prefix, joining if necessary. + # rubocop:disable Style/ParallelAssignment + # -- + private + def tmpname_prefix(prefix) + ext, prefix = prefix, "" if !prefix.is_a?(Array) && prefix.start_with?(".") + ext = prefix.pop if prefix.is_a?(Array) && prefix[-1].start_with?(".") + prefix = prefix.join("-") if prefix.is_a?(Array) + + unless prefix.empty? + prefix = prefix.gsub(/\-\Z/, "") \ + + "-" + end + + return [ + prefix, ext || "" + ] + end + + # -- + # Wrap around, cleanup, deprecate and use SafeYAML. + # rubocop:enable Style/ParallelAssignment + # -- + private + def setup_safe_yaml(whitelist_classes, aliases) + warn "WARN: SafeYAML does not support disabling of aliases." if aliases && aliases != :yes + warn "WARN: SafeYAML will be removed when Ruby 2.0 goes EOL." + require "safe_yaml/load" + + SafeYAML.restore_defaults! + whitelist_classes.map(&SafeYAML.method( + :whitelist_class! + )) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/lib/pathutil/version.rb b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/lib/pathutil/version.rb new file mode 100644 index 000000000000..bfe223c18f0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/pathutil-0.16.2/lib/pathutil/version.rb @@ -0,0 +1,7 @@ +# Frozen-string-literal: true +# Copyright: 2015 - 2017 Jordon Bedwell - MIT License +# Encoding: utf-8 + +class Pathutil + VERSION = "0.16.2" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.github/FUNDING.yml b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.github/FUNDING.yml new file mode 100644 index 000000000000..085e1ac2f010 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: "rubygems/public_suffix" +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with a single custom sponsorship URL diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.github/workflows/tests.yml b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.github/workflows/tests.yml new file mode 100644 index 000000000000..2de9058300df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.github/workflows/tests.yml @@ -0,0 +1,36 @@ +name: Tests + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + + build: + strategy: + matrix: + ruby-version: + # - "2.3" + - "2.4" + - "2.5" + - "2.6" + - "2.7" + platform: [ubuntu-latest] + + runs-on: ${{ matrix.platform }} + steps: + + - uses: actions/checkout@v2 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby-version }} + + - name: Install dependencies + run: bundle install + + - name: Run tests + run: bundle exec rake diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.gitignore b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.gitignore new file mode 100644 index 000000000000..85062928f2e0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.gitignore @@ -0,0 +1,8 @@ +# Bundler +/.bundle +/Gemfile.lock +/pkg/* + +# YARD +/.yardoc +/yardoc/ diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.rubocop.yml b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.rubocop.yml new file mode 100644 index 000000000000..af922f52f7a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.rubocop.yml @@ -0,0 +1,36 @@ +inherit_from: + - .rubocop_opinionated.yml + +AllCops: + Exclude: + # Exclude .gemspec files because they are generally auto-generated + - '*.gemspec' + # Exclude vendored folders + - 'tmp/**/*' + - 'vendor/**/*' + # Exclude artifacts + - 'pkg/**/*' + # Other + - 'test/benchmarks/**/*' + - 'test/profilers/**/*' + +# I often use @_variable to avoid clashing. +Naming/MemoizedInstanceVariableName: + Enabled: false + +Style/ClassAndModuleChildren: + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# Dear Rubocop, I don't want to use String#strip_heredoc +Layout/HeredocIndentation: + Enabled: false + +Style/WordArray: + Enabled: false + MinSize: 3 + +Style/SymbolArray: + Enabled: false + MinSize: 3 diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.rubocop_opinionated.yml b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.rubocop_opinionated.yml new file mode 100644 index 000000000000..401e684d406f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.rubocop_opinionated.yml @@ -0,0 +1,157 @@ +AllCops: + Exclude: + # Exclude .gemspec files because they are generally auto-generated + - '*.gemspec' + # Exclude vendored folders + - 'tmp/**/*' + - 'vendor/**/*' + NewCops: enable + +# [codesmell] +Layout/LineLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + Max: 100 + +# [codesmell] +Metrics/AbcSize: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/BlockLength: + Enabled: false + +# [codesmell] +Metrics/CyclomaticComplexity: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/ClassLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/MethodLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + Max: 10 + +# [codesmell] +Metrics/ModuleLength: + Enabled: false + Exclude: + - 'spec/**/*_spec.rb' + - 'test/**/*_test.rb' + +# [codesmell] +Metrics/ParameterLists: + Enabled: false + Max: 5 + +# [codesmell] +Metrics/PerceivedComplexity: + Enabled: false + +# Do not use "and" or "or" in conditionals, but for readability we can use it +# to chain executions. Just beware of operator order. +Style/AndOr: + EnforcedStyle: conditionals + +Style/Documentation: + Exclude: + - 'spec/**/*' + - 'test/**/*' + +# Double empty lines are useful to separate conceptually different methods +# in the same class or module. +Layout/EmptyLines: + Enabled: false + +# In most cases, a space is nice. Sometimes, it's not. +# Just be consistent with the rest of the surrounding code. +Layout/EmptyLinesAroundClassBody: + Enabled: false + +# In most cases, a space is nice. Sometimes, it's not. +# Just be consistent with the rest of the surrounding code. +Layout/EmptyLinesAroundModuleBody: + Enabled: false + +# This is quite buggy, as it doesn't recognize double lines. +# Double empty lines are useful to separate conceptually different methods +# in the same class or module. +Layout/EmptyLineBetweenDefs: + Enabled: false + +# I personally don't care about the format style. +# In most cases I like to use %, but not at the point I want to enforce it +# as a convention in the entire code. +Style/FormatString: + Enabled: false + +# Annotated tokens (like %<foo>s) are a good thing, but in most cases we don't need them. +# %s is a simpler and straightforward version that works in almost all cases. So don't complain. +Style/FormatStringToken: + Enabled: false + +# unless is not always cool. +Style/NegatedIf: + Enabled: false + +# For years, %w() has been the de-facto standard. A lot of libraries are using (). +# Switching to [] would be a nightmare. +Style/PercentLiteralDelimiters: + Enabled: false + +# There are cases were the inline rescue is ok. We can either downgrade the severity, +# or rely on the developer judgement on a case-by-case basis. +Style/RescueModifier: + Enabled: false + +Style/SymbolArray: + EnforcedStyle: brackets + +# Sorry, but using trailing spaces helps readability. +# +# %w( foo bar ) +# +# looks better to me than +# +# %w( foo bar ) +# +Layout/SpaceInsidePercentLiteralDelimiters: + Enabled: false + +# Hate It or Love It, I prefer double quotes as this is more consistent +# with several other programming languages and the output of puts and inspect. +Style/StringLiterals: + EnforcedStyle: double_quotes + +# It's nice to be consistent. The trailing comma also allows easy reordering, +# and doesn't cause a diff in Git when you add a line to the bottom. +Style/TrailingCommaInArrayLiteral: + EnforcedStyleForMultiline: consistent_comma +Style/TrailingCommaInHashLiteral: + EnforcedStyleForMultiline: consistent_comma + +Style/TrivialAccessors: + # IgnoreClassMethods because I want to be able to define class-level accessors + # that sets an instance variable on the metaclass, such as: + # + # def self.default=(value) + # @default = value + # end + # + IgnoreClassMethods: true diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.travis.yml new file mode 100644 index 000000000000..30f78e82d155 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.travis.yml @@ -0,0 +1,23 @@ +language: ruby + +rvm: + # - 2.3 + - 2.4 + - 2.5 + - 2.6 + - 2.7 + - ruby-head + +env: + - COVERAGE=1 + +cache: + - bundler + +matrix: + allow_failures: + - rvm: ruby-head + +before_install: + - gem update --system + - gem install bundler diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.yardopts b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.yardopts new file mode 100644 index 000000000000..0a782de2ba05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/.yardopts @@ -0,0 +1 @@ +--title 'Ruby Public Suffix API Documentation' diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/2.0-Upgrade.md b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/2.0-Upgrade.md new file mode 100644 index 000000000000..1a10bfb36ed9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/2.0-Upgrade.md @@ -0,0 +1,52 @@ +# Welcome to PublicSuffix 2.0! + +PublicSuffix 2.0 contains a rewritten internal representation and comparison logic, that drastically increases the lookup performance. The new version also changes several internal and external API. + +This document documents the most relevant changes to help you upgrading from PublicSuffix 1.0 to 2.0. + +## What's New + +- The library is now 100% compliants with the official PublicSuffix tests. The major breaking change you may experience, is that if a domain passed as input doesn't match any rule, the rule `*` is assumed. You can override this behavior by passing a custom default rule with the `default_rule` option. The old behavior can be restored by passing `default_rule: nil`. +- `PublicSuffix.domain` is a new method that parses the input and returns the domain (combination of second level domain + suffix). This is a convenient helper to parse a domain name, for example when you need to determine the cookie or SSL scope. +- Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available. + +## Upgrade + +When upgrading, here's the most relevant changes to keep an eye on: + +- Several futile utility helpers were removed, such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`. +- `PublicSuffix::List.private_domains` is no longer available. Instead, you now have two ways to enable/disable the private domains: + + 1. At runtime, by using the `ignore_private` option + + ```ruby + PublicSuffix.domain("something.blogspot.com", ignore_private: true) + ``` + + 1. Loading a filtered list: + + ```ruby + # Disable support for private TLDs + PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false) + # => "blogspot.com" + PublicSuffix.domain("something.blogspot.com") + # => "blogspot.com" + ``` +- Now that the library is 100% compliant with the official PublicSuffix algorithm, if a domain passed as input doesn't match any rule, the wildcard rule `*` is assumed. This means that unlisted TLDs will be considered valid by default, when they would have been invalid in 1.x. However, you can override this behavior to emulate the 1.x behavior if needed: + + ```ruby + # 1.x: + + PublicSuffix.valid?("google.commm") + # => false + + # 2.x: + + PublicSuffix.valid?("google.commm") + # => true + + # Overriding 2.x behavior if needed: + + PublicSuffix.valid?("google.commm", default_rule: nil) + # => false + ```` diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/CHANGELOG.md new file mode 100644 index 000000000000..4861d623af7e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/CHANGELOG.md @@ -0,0 +1,406 @@ +# Changelog + +This project uses [Semantic Versioning 2.0.0](https://semver.org/). + + +## 4.0.6 + +### Changed + +- Updated definitions. + + +## 4.0.5 + +### Changed + +- Updated definitions. + + +## 4.0.4 + +### Changed + +- Updated definitions. + + +## 4.0.3 + +### Fixed + +- Fixed 2.7 deprecations and warnings (GH-167). [Thanks @BrianHawley] + + +## 4.0.2 + +### Changed + +- Updated definitions. + + +## 4.0.1 + +### Changed + +- Updated definitions. + + +## 4.0.0 + +### Changed + +- Minimum Ruby version is 2.3 + + +## Release 3.1.1 + +- CHANGED: Updated definitions. +- CHANGED: Rolled back support for Ruby 2.3 (GH-161, GH-162) + +IMPORTANT: 3.x is the latest version compatible with Ruby 2.1 and Ruby 2.2. + + +## Release 3.1.0 + +- CHANGED: Updated definitions. +- CHANGED: Minimum Ruby version is 2.3 +- CHANGED: Upgraded to Bundler 2.x + + +## Release 3.0.3 + +- CHANGED: Updated definitions. + + +## Release 3.0.2 + +- CHANGED: Updated definitions. + + +## Release 3.0.1 + +- CHANGED: Updated definitions. +- CHANGED: Improve performance and avoid allocation (GH-146). [Thanks @robholland] + + +## Release 3.0.0 + +This new version includes a major redesign of the library internals, with the goal to drastically +improve the lookup time while reducing storage space. + +For this reason, several public methods that are no longer applicable have been deprecated +and/or removed. You can find more information at GH-133. + +- CHANGED: Updated definitions. +- CHANGED: Dropped support for Ruby < 2.1 +- CHANGED: `PublicSuffix::List#rules` is now protected. You should not rely on it as the internal rule representation is subject to change to optimize performances. +- CHANGED: Removed `PublicSuffix::List.clear`, it was an unnecessary accessor method. Use `PublicSuffix::List.default = nil` if you **really** need to reset the default list. You shouldn't. +- CHANGED: `PublicSuffix::List#select` is now private. You should not use it, instead use `PublicSuffix::List#find`. +- CHANGED: `PublicSuffix::List` no longer implements Enumerable. Instead, use `#each` to loop over, or get an Enumerator. +- CHANGED: Redesigned internal list storage and lookup algorithm to achieve O(1) lookup time (see GH-133). + + +## Release 2.0.5 + +- CHANGED: Updated definitions. +- CHANGED: Initialization performance improvements (GH-128). [Thanks @casperisfine] + + +## Release 2.0.4 + +- FIXED: Fix a bug that caused the GEM to be published with the wrong version number in the gemspec (GH-121). + +- CHANGED: Updated definitions. + + +## Release 2.0.3 + +- CHANGED: Updated definitions. + + +## Release 2.0.2 + +- CHANGED: Updated definitions. + + +## Release 2.0.1 + +- FIXED: Fix bug that prevented .valid? to reset the default rule + + +## Release 2.0.0 + +- NEW: Added PublicSuffix.domain # => sld.tld +- NEW: Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available. + +- CHANGED: Considerable performance improvements (GH-92) +- CHANGED: Updated definitions. +- CHANGED: Removed deprecated PublicSuffix::InvalidDomain exception +- CHANGED: If the suffix is now listed, then the prevaling rule is "*" as defined by the PSL algorithm (GH-91) +- CHANGED: Input validation is performed only if you call `PublicSuffix.parse` or `PublicSuffix.list` +- CHANGED: Input with leading dot is invalid per PSL acceptance tests +- CHANGED: Removed `private_domains` class-level attribute. It is replaced by the `private_domains: false` option in the list parse method. +- CHANGED: The default list now assumes you use UTF-8 for reading the input (GH-94), + +- REMOVED: Removed futile utility helpers such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`. + + +## Release 1.5.3 + +- FIXED: Don't duplicate rule indices when creating index (GH-77). [Thanks @ags] + +- CHANGED: Updated definitions. + + +## Release 1.5.2 + +- CHANGED: Updated definitions. + + +## Release 1.5.1 + +- FIXED: Ignore case for parsing and validating (GH-62) + +- CHANGED: Updated definitions. + + +## Release 1.5.0 + +- CHANGED: Dropped support for Ruby < 2.0 + +- CHANGED: Updated definitions. + + +## Release 1.4.6 + +- CHANGED: Updated definitions. + + +## Release 1.4.5 + +- CHANGED: Updated definitions. + + +## Release 1.4.4 + +- CHANGED: Updated definitions. + + +## Release 1.4.3 + +- CHANGED: Updated definitions. + + +## Release 1.4.2 + +- CHANGED: Updated definitions. + + +## Release 1.4.1 + +- CHANGED: Updated definitions. + + +## Release 1.4.0 + +- CHANGED: Moved the definitions in the lib folder. + +- CHANGED: Updated definitions. + + +## Release 1.3.3 + +- CHANGED: Updated definitions. + + +## Release 1.3.2 + +- CHANGED: Updated definitions. + + +## Release 1.3.1 + +- CHANGED: Updated definitions. + + +## Release 1.3.0 + +- NEW: Ability to skip Private Domains (GH-28). [Thanks @rb2k] + +- CHANGED: Updated definitions. + + +## Release 1.2.1 + +- CHANGED: Updated definitions. + + +## Release 1.2.0 + +- NEW: Allow a custom List on `PublicSuffix.parse` (GH-26). [Thanks @itspriddle] + +- FIXED: PublicSuffix.parse and PublicSuffix.valid? crashes when input is nil (GH-20). + +- CHANGED: Updated definitions. + + +## Release 1.1.3 + +- CHANGED: Updated definitions. + + +## Release 1.1.2 + +- CHANGED: Updated definitions. + + +## Release 1.1.1 + +- CHANGED: Updated definitions. + + +## Release 1.1.0 + +- FIXED: #valid? and #parse consider URIs as valid domains (GH-15) + +- CHANGED: Updated definitions. + +- CHANGED: Removed deprecatd PublicSuffixService::RuleList. + + +## Release 1.0.0 + +- CHANGED: Updated definitions. + + +## Release 1.0.0.rc1 + +The library is now known as PublicSuffix. + + +## Release 0.9.1 + +- CHANGED: Renamed PublicSuffixService::RuleList to PublicSuffixService::List. + +- CHANGED: Renamed PublicSuffixService::List#list to PublicSuffixService::List#rules. + +- CHANGED: Renamed PublicSuffixService to PublicSuffix. + +- CHANGED: Updated definitions. + + +## Release 0.9.0 + +- CHANGED: Minimum Ruby version increased to Ruby 1.8.7. + +- CHANGED: rake/gempackagetask is deprecated. Use rubygems/package_task instead. + + +## Release 0.8.4 + +- FIXED: Reverted bugfix for issue #12 for Ruby 1.8.6. + This is the latest version compatible with Ruby 1.8.6. + + +## Release 0.8.3 + +- FIXED: Fixed ArgumentError: invalid byte sequence in US-ASCII with Ruby 1.9.2 (#12). + +- CHANGED: Updated definitions (#11). + +- CHANGED: Renamed definitions.txt to definitions.dat. + + +## Release 0.8.2 + +- NEW: Added support for rubygems-test. + +- CHANGED: Integrated Bundler. + +- CHANGED: Updated definitions. + + +## Release 0.8.1 + +- FIXED: The files in the release 0.8.0 have wrong permission 600 and can't be loaded (#10). + + +## Release 0.8.0 + +- CHANGED: Update public suffix list to d1a5599b49fa 2010-10-25 15:10 +0100 (#9) + +- NEW: Add support for Fully Qualified Domain Names (#7) + + +## Release 0.7.0 + +- CHANGED: Using YARD to document the code instead of RDoc. + +- FIXED: RuleList cache is not recreated when a new rule is appended to the list (#6) + +- FIXED: PublicSuffixService.valid? should return false if the domain is not defined or not allowed (#4, #5) + + +## Release 0.6.0 + +- NEW: PublicSuffixService.parse raises DomainNotAllowed when trying to parse a domain name + which exists, but is not allowed by the current definition list (#3) + + PublicSuffixService.parse("nic.do") + # => PublicSuffixService::DomainNotAllowed + +- CHANGED: Renamed PublicSuffixService::InvalidDomain to PublicSuffixService::DomainInvalid + + +## Release 0.5.2 + +- CHANGED: Update public suffix list to 248ea690d671 2010-09-16 18:02 +0100 + + +## Release 0.5.1 + +- CHANGED: Update public suffix list to 14dc66dd53c1 2010-09-15 17:09 +0100 + + +## Release 0.5.0 + +- CHANGED: Improve documentation for Domain#domain and Domain#subdomain (#1). + +- CHANGED: Performance improvements (#2). + + +## Release 0.4.0 + +- CHANGED: Rename library from DomainName to PublicSuffixService to reduce the probability of name conflicts. + + +## Release 0.3.1 + +- Deprecated DomainName library. + + +## Release 0.3.0 + +- CHANGED: DomainName#domain and DomainName#subdomain are no longer alias of Domain#sld and Domain#tld. + +- CHANGED: Removed DomainName#labels and decoupled Rule from DomainName. + +- CHANGED: DomainName#valid? no longer instantiates new DomainName objects. This means less overhead. + +- CHANGED: Refactoring the entire DomainName API. Removed the internal on-the-fly parsing. Added a bunch of new methods to check and validate the DomainName. + + +## Release 0.2.0 + +- NEW: DomainName#valid? + +- NEW: DomainName#parse and DomainName#parse! + +- NEW: DomainName#valid_domain? and DomainName#valid_subdomain? + +- CHANGED: Make sure RuleList lookup is only performed once. + + +## Release 0.1.0 + +- Initial version diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/Gemfile b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/Gemfile new file mode 100644 index 000000000000..6ae681631723 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/Gemfile @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +gemspec + +gem "rake" + +gem "codecov", require: false +gem "memory_profiler", require: false +gem "minitest" +gem "minitest-reporters" +gem "mocha" +gem "rubocop", "~>0.90", require: false +gem "yard" diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/LICENSE.txt new file mode 100644 index 000000000000..3bbd11213572 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2009-2020 Simone Carletti <weppos@weppos.net> + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/README.md b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/README.md new file mode 100644 index 000000000000..12ec7a0183c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/README.md @@ -0,0 +1,207 @@ +# Public Suffix <small>for Ruby</small> + +<tt>PublicSuffix</tt> is a Ruby domain name parser based on the [Public Suffix List](https://publicsuffix.org/). + +[![Build Status](https://travis-ci.com/weppos/publicsuffix-ruby.svg?branch=master)](https://travis-ci.com/weppos/publicsuffix-ruby) +[![Tidelift dependencies](https://tidelift.com/badges/package/rubygems/public_suffix)](https://tidelift.com/subscription/pkg/rubygems-public-suffix?utm_source=rubygems-public-suffix&utm_medium=referral&utm_campaign=enterprise) + + +## Links + +- [Homepage](https://simonecarletti.com/code/publicsuffix-ruby) +- [Repository](https://github.com/weppos/publicsuffix-ruby) +- [API Documentation](https://rubydoc.info/gems/public_suffix) +- [Introducing the Public Suffix List library for Ruby](https://simonecarletti.com/blog/2010/06/public-suffix-list-library-for-ruby/) + + +## Requirements + +<tt>PublicSuffix</tt> requires **Ruby >= 2.3**. For an older versions of Ruby use a previous release. + + +## Installation + +You can install the gem manually: + +```shell +gem install public_suffix +``` + +Or use Bundler and define it as a dependency in your `Gemfile`: + +```ruby +gem 'public_suffix' +``` + +If you are upgrading to 2.0, see [2.0-Upgrade.md](2.0-Upgrade.md). + +## Usage + +Extract the domain out from a name: + +```ruby +PublicSuffix.domain("google.com") +# => "google.com" +PublicSuffix.domain("www.google.com") +# => "google.com" +PublicSuffix.domain("www.google.co.uk") +# => "google.co.uk" +``` + +Parse a domain without subdomains: + +```ruby +domain = PublicSuffix.parse("google.com") +# => #<PublicSuffix::Domain> +domain.tld +# => "com" +domain.sld +# => "google" +domain.trd +# => nil +domain.domain +# => "google.com" +domain.subdomain +# => nil +``` + +Parse a domain with subdomains: + +```ruby +domain = PublicSuffix.parse("www.google.com") +# => #<PublicSuffix::Domain> +domain.tld +# => "com" +domain.sld +# => "google" +domain.trd +# => "www" +domain.domain +# => "google.com" +domain.subdomain +# => "www.google.com" +``` + +Simple validation example: + +```ruby +PublicSuffix.valid?("google.com") +# => true + +PublicSuffix.valid?("www.google.com") +# => true + +# Explicitly forbidden, it is listed as a private domain +PublicSuffix.valid?("blogspot.com") +# => false + +# Unknown/not-listed TLD domains are valid by default +PublicSuffix.valid?("example.tldnotlisted") +# => true +``` + +Strict validation (without applying the default * rule): + +```ruby +PublicSuffix.valid?("example.tldnotlisted", default_rule: nil) +# => false +``` + + +## Fully Qualified Domain Names + +This library automatically recognizes Fully Qualified Domain Names. A FQDN is a domain name that end with a trailing dot. + +```ruby +# Parse a standard domain name +PublicSuffix.domain("www.google.com") +# => "google.com" + +# Parse a fully qualified domain name +PublicSuffix.domain("www.google.com.") +# => "google.com" +``` + +## Private domains + +This library has support for switching off support for private (non-ICANN). + +```ruby +# Extract a domain including private domains (by default) +PublicSuffix.domain("something.blogspot.com") +# => "something.blogspot.com" + +# Extract a domain excluding private domains +PublicSuffix.domain("something.blogspot.com", ignore_private: true) +# => "blogspot.com" + +# It also works for #parse and #valid? +PublicSuffix.parse("something.blogspot.com", ignore_private: true) +PublicSuffix.valid?("something.blogspot.com", ignore_private: true) +``` + +If you don't care about private domains at all, it's more efficient to exclude them when the list is parsed: + +```ruby +# Disable support for private TLDs +PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false) +# => "blogspot.com" +PublicSuffix.domain("something.blogspot.com") +# => "blogspot.com" +``` + + +## What is the Public Suffix List? + +The [Public Suffix List](https://publicsuffix.org) is a cross-vendor initiative to provide an accurate list of domain name suffixes. + +The Public Suffix List is an initiative of the Mozilla Project, but is maintained as a community resource. It is available for use in any software, but was originally created to meet the needs of browser manufacturers. + +A "public suffix" is one under which Internet users can directly register names. Some examples of public suffixes are ".com", ".co.uk" and "pvt.k12.wy.us". The Public Suffix List is a list of all known public suffixes. + + +## Why the Public Suffix List is better than any available Regular Expression parser? + +Previously, browsers used an algorithm which basically only denied setting wide-ranging cookies for top-level domains with no dots (e.g. com or org). However, this did not work for top-level domains where only third-level registrations are allowed (e.g. co.uk). In these cases, websites could set a cookie for co.uk which will be passed onto every website registered under co.uk. + +Clearly, this was a security risk as it allowed websites other than the one setting the cookie to read it, and therefore potentially extract sensitive information. + +Since there is no algorithmic method of finding the highest level at which a domain may be registered for a particular top-level domain (the policies differ with each registry), the only method is to create a list of all top-level domains and the level at which domains can be registered. This is the aim of the effective TLD list. + +As well as being used to prevent cookies from being set where they shouldn't be, the list can also potentially be used for other applications where the registry controlled and privately controlled parts of a domain name need to be known, for example when grouping by top-level domains. + +Source: https://wiki.mozilla.org/Public_Suffix_List + +Not convinced yet? Check out [this real world example](https://stackoverflow.com/q/288810/123527). + + +## Does <tt>PublicSuffix</tt> make requests to Public Suffix List website? + +No. <tt>PublicSuffix</tt> comes with a bundled list. It does not make any HTTP requests to parse or validate a domain. + + +## Support + +Library documentation is auto-generated from the [README](https://github.com/weppos/publicsuffix-ruby/blob/master/README.md) and the source code, and it's available at https://rubydoc.info/gems/public_suffix. + +- The PublicSuffix bug tracker is here: https://github.com/weppos/publicsuffix-ruby/issues +- The PublicSuffix code repository is here: https://github.com/weppos/publicsuffix-ruby. Contributions are welcome! Please include tests and/or feature coverage for every patch, and create a topic branch for every separate change you make. + +[Consider subscribing to Tidelift which provides Enterprise support for this project](https://tidelift.com/subscription/pkg/rubygems-public-suffix?utm_source=rubygems-public-suffix&utm_medium=referral&utm_campaign=readme) as part of the Tidelift Subscription. Tidelift subscriptions also help the maintainers by funding the project, which in turn allows us to ship releases, bugfixes, and security updates more often. + + +## Security and Vulnerability Reporting + +Full information and description of our security policy please visit [`SECURITY.md`](SECURITY.md) + + +## Changelog + +See the [CHANGELOG.md](CHANGELOG.md) file for details. + + +## License + +Copyright (c) 2009-2020 Simone Carletti. This is Free Software distributed under the MIT license. + +The [Public Suffix List source](https://publicsuffix.org/list/) is subject to the terms of the Mozilla Public License, v. 2.0. diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/Rakefile b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/Rakefile new file mode 100644 index 000000000000..502270a4f810 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/Rakefile @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require "bundler/gem_tasks" + +# By default, run tests and linter. +task default: [:test, :rubocop] + + +require "rake/testtask" + +Rake::TestTask.new do |t| + t.libs = %w( lib test ) + t.pattern = "test/**/*_test.rb" + t.verbose = !ENV["VERBOSE"].nil? + t.warning = !ENV["WARNING"].nil? +end + +require "rubocop/rake_task" + +RuboCop::RakeTask.new + + +require "yard/rake/yardoc_task" + +YARD::Rake::YardocTask.new(:yardoc) do |y| + y.options = ["--output-dir", "yardoc"] +end + +CLOBBER.include "yardoc" + + +task :benchmarks do + Dir["benchmarks/bm_*.rb"].each do |file| + sh "ruby #{file}" + end +end +task default: [:benchmarks] if ENV["BENCHMARKS"] == "1" + + +desc "Downloads the Public Suffix List file from the repository and stores it locally." +task :"update-list" do + require "net/http" + + DEFINITION_URL = "https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat" + + File.open("data/list.txt", "w+") do |f| + response = Net::HTTP.get_response(URI.parse(DEFINITION_URL)) + response.body + f.write(response.body) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/SECURITY.md b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/SECURITY.md new file mode 100644 index 000000000000..f3291287a37a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/SECURITY.md @@ -0,0 +1,104 @@ +# Security Policy + +## Supported Versions + +Security updates are provided only for the current minor version. + +If you are using a previous minor version, we recommend to upgrade to the current minor version. +This project uses [semantic versioning](https://semver.org/), therefore you can upgrade to a more recent minor version without incurring into breaking changes. + +Exceptionally, we may support previous minor versions upon request if there are significant reasons preventing to immediately switch the latest minor version. + +Older major versions are no longer supported. + + +## Reporting a Vulnerability + +To make a report, please email weppos@weppos.net. + +Please consider encrypting your report with GPG using the key [0x420da82a989398df](https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x420da82a989398df). + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE/QiI0BCACtBbjJnJIzaLb4NfjaljzT/+dvodst+wyDRE8Vwc6ujwboZjr2 +0QwXScNzObPazyvkSZVh3g6PveneeSD0dSw2XDqKbbtLMg/Ss12yqXJfjavH/zjk +6Xq+nnbSnxBPzwFAAEaEFIc6H6BygJ7zHPP5WEY5QIMqifEAX//aBqHi4GXHJiHE +237Zqufdry23jBYjY7wGXAa11VsU9Iwqh6LPB9/hc1KtzjAuvvm5ufeT/iVjxGQX +te1OZZk6n8xSVYeLsn97PfgYs0yauhexwD9dG7FbRCB379JxPRn5akr391qXcVOG +ZA3yBXUSPOL6D1+TS1S0su5zbw2AEp4+z3SpABEBAAHNIlNpbW9uZSBDYXJsZXR0 +aSA8d2VwcG9zQGdtYWlsLmNvbT7CwHcEEwEKACEFAlXH0UQCGy8FCwkIBwMFFQoJ +CAsFFgIDAQACHgECF4AACgkQQg2oKpiTmN9BOQf/UHd+bmww71MkbS38KkowDu+0 +1VH35aL8sFcAMUSEA4I5oPWZoBtYYPGpALLxtrSNW+SCnmmeCQVfVmLedUVHwDZo +TS4qiynpqnz+Cnq4KRC8VMIyaFoiT5Vg6MLtau8hJtqZn1Wv68g0nXuprsCuf9vs +z7DDZ36z8em6OJQJQ/FQ4BGogzyYHa90cJnIM6BeLiRUUpFTl1tHLlw4JFUNi8sx +6VQ1/nhcr3OyskAix5TytRnJ8uIn22m25GGdTF2WQPNfkWJQVT4ZDbCxT20acRp0 +l3x1DAk3Eel8gOKzgOboB3bkI5/l1XZvNL0YWGZeyfp8I7ZqpXg/m4qLDkYU2cLA +egQTAQoAJAIbLwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCVf6KvAIZAQAKCRBC +DagqmJOY34ABB/9WbNAh0l07UN1ePfVm6Brg2Yt8k6Q2lIRUG2xAeQj/+Kx/4lAL +oY6F0jJ44kIDZqZdNA0QIqYzZRBV4iW+cQrsBUUyM+chiA3RuOsDG18sfvkyPvRy +ecOVubHCN+nK2GKy1oHQkCpVFIeetr0ugB/j+xNDKJ3Oa5dGBKF29ZH5Pxg7cqwH +cdkhBGMpPbBYq5pJtYGggqypELzFTG292StbtV837Eze+clWRTKtMBOHke/oKBCr +YYic2fmipGC9XUiqvMEMAKYq5WWWXIlcSVSnBDdxq41tXjKK4XMVgoOboZCcNFvh +0NxuDQATk1YruRZOS4SpBPXykEA1pK/zm3WmzSNTaW1vbmUgQ2FybGV0dGkgPHdl +cHBvc0B3ZXBwb3MubmV0PsLAeQQTAQIAIwUCT9CIjQIbLwcLCQgHAwIBBhUIAgkK +CwQWAgMBAh4BAheAAAoJEEINqCqYk5jfGWcH/Ax3EhAckGeCqNYE5BTx94bKB1LL +vUjeUoImMtGGFxQu2jNOAjtpuyjihm9uHBZ+dxaxHHrhE11f+0sDcwvW8qtKEzOs +GESr01VqTaVFS2JOEHhLphXseaLXJe32Osz0kHCZmrz1fCwv3b8QuWBifn8oVzcV +vrE7lGC6pGwaiUvMsvA++RUquTlNVlh8uRrqcQCU8Ne9lSoDWHlUJes5s4FoCh3R +oVBcKPsx3m/P9+GlEgTDqYP+WU3sfSfJYERH0r0NAYP96m2e7UQrqdgvMTVVDkPB +UB9efZzgkL7u9IAqmLU2klSGdEZnJ8t1AsjEyHXMztC7ICUhRFCeXHdTNhHCwHwE +EwEKACYCGy8HCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAUCVcfRaQIZAQAKCRBC +DagqmJOY31y1B/41I/SsWwDqJP/Y3LzzatGmIv/gy+LkJBBTr/NV0NYzKV2XJ1BG +ese2ZE4tKKdG4HDwF+IwFLBHcPZRv358IwwTRPnzeO23mxpTYAnRCdg/pcaYIJ9r +OxIOP+R52YbgGrNKcezVA+7TY9za072P7Bk85jTM2FNfqevaf/YQ4GRcGLQ3JI8N +tBUdvrOEETDpR0QFTr22Wv1C7UfPDsSf7ZUM7zJ38CmDji8JSlr6y75/LYSY50BB +8EHb03QxyePe98A3WzvOoqamiCIe9bRzH5IqRAtJYDX8cK4PZmp43bQhrjdjawCc +AU/OY9iz+zCw00+b6CNiRb59N+OwpNJh5iNNwsB5BBMBCgAjAhsvBwsJCAcDAgEG +FQgCCQoLBBYCAwECHgECF4AFAlX+iq0ACgkQQg2oKpiTmN/z2gf/VbcQHgTlXFYa +Sq/dE7S54uGFrdzHOV3IJyl+ByMwVoKn6zdpksRoyt7jPV3RonrUO7jEcrt7VKCU +2KC7/MZMDoUsn9BXXTtUk+uTCNh8qllR0Fo/FvWM9RJKmcDMKwAJwcKIgbfUBJGx +1N6pP2DUc+YCnEerRbnQ1DWJUM7BaOEN6bvPxuGblPst1l6S5VktFj3gZGYItHrs +pit5pesILP8K6B6VCNP2WXXYvYQo7yyYcG8WBWXin8/SdNwU68lUbfhhQVIKv6LU +h0wvgG97NsBPrFbij0K6O63FufnNr9WLMZhAzi0h6gNK2HKAyw9AZNKpPccwg+mX +Huc/4CPRlM0uU2ltb25lIENhcmxldHRpIDxzaW1vbmUuY2FybGV0dGlAZG5zaW1w +bGUuY29tPsLAdwQTAQoAIQUCVh4ipAIbLwULCQgHAwUVCgkICwUWAgMBAAIeAQIX +gAAKCRBCDagqmJOY329iCACpOY5SV7hwOZ8VqmRfxRoHQFQe9Owr+hD3eL0AKZaJ +V918dCPrrxbAmwwMAC8pS8J4CmrrTR27kxcUgVwcfyydFPrgST5pg+H7UTrBR045 +4Npw1+m99I2Pyyl3oaym4lKJFbp2c2DGODEzTg8kKfjk0cb8bd+MJrXqFyod1z5r +0pfexwaLVt1Hz+ZsmFIPO1ISHYBPV8OkpL8Kgb8WtY6REntgNjfcmtHNi0VWQ7+N +vgeYqdhscX8c9ROe26BiiiGXphRlAsCU/VLHOJkzoW3f9QLy4z01Xj/7OaD0JkHS +HrES1ye3ZDxnjnTRdh4U8ntJ+L+xnePcFQA2t0eCbPwIzSZTaW1vbmUgQ2FybGV0 +dGkgPHNpbW9uZUBjYXJsZXR0aS5uYW1lPsLAdwQTAQoAIQUCVf7gmwIbLwULCQgH +AwUVCgkICwUWAgMBAAIeAQIXgAAKCRBCDagqmJOY37L+B/45pWT3wgm43+kzHVOT +j63m4zmRb53TGZToRSxz3acyuVSuqU9Tv010F0ZV9ccb0NDeN+88s9tEisuoO0Rz +5vhC8AtwRUyR3ADE9pBtvvxT+4R9y8yYNTCIX45VPG9ZPp9+7i+XCdKtz30KIV7r +smktd2FrK16r/KUN8+03iZSgzQ9lsTmXK5L7zH/f3Tqhbfvybr4+M71KGnSoP+iP +vwfsoBb5rhijQLOykTb+VzdDpHQbupwxwm/3S4nsA4U6tonIywlJgBDSjgDjQj0i +Ez+Db2Wt59y6LoksRQogvJqm0nuxFUWMZc47zdhsRnqmxUYTNpKaJPWc6pfxsQPK +ZvTjzsBNBE/QiI0BCACsaNbG6kyKJBWL5jPhebsijk8PCfSHte1jNCA5l/NvaImZ +6ORq9f8S9MWlYxmzyUkVJaWrv+9p5zmjwcaegjerj6ggjPDEXlZG41Z4YE1/R8pf +wkSvrkLziBxZDB1aYplg8kgXkaIf2yi2FrMPSi04sjvQbBSCcIJeh6+vGK8tIJTn +e0tQbEvRorTwBAPAFlpx/bdk1wZYu11vFKbckhKWou7f8XSdn9ng9cY5uK+xBlFU +2ORgL1ygeIoY9uRvNZG2ncvCvxUPgOqbo31R8KPyvV4rNNvGBOfxQER9LbieBF2I +5I1gpyboGWKcXu1eV7tOpjtW6LHt+6NHhE6L1Lw1ABEBAAHCwX4EGAECAAkFAk/Q +iI0CGy4BKQkQQg2oKpiTmN/AXSAEGQECAAYFAk/QiI0ACgkQcBROh493BN9hdwf9 +GjiF1GcQN+3TZkXdr2WY0AlbcA/wBp6+ShnqcoU5XLuA0RY3+rWGuaSc2buLke6Y +2MhMAYcgmPdG+WTBoW5dWQGXBZ1IHYVR8HLGaF+Vate1MofE1BNHXhnilIMMfH4G +Tcr3Z3/FaSk9OdHlyiE/Jo7++8PQ+auHVyjtqry+/ysAnyr+lnCn+K4E0PQ1fYpP +fiawKtfSqk9h6HjjMyx9Adrz+ljXh+NyVqYZUfRytjgO+v+dAQmMczT1EawLTdX+ +trx1tHR549pEey7in5QKsje3GLH4zq4mCdWBlivQxmmmlvR07DysLADMbcpjKK2g +utfzygZHCU9hWGR3wbWZ7lXjB/0ZzutNaNYzSCkiC8PIWH1bG+TJO9pslHwP+aBJ +NGAmcwyOH9Bub2CSXikQFZNUmVRwtl7mN4bVAHI8zbMd6xdlX22yDgQei54dPXDw +UYsvGE4zmrD97he1EYcIOKMFHzlJNcWK+uR7lEq6mv7SFGnBr8qTYZRi1bySRgwd +UORuDV12GKTen9WectKtepW0fgYSz+udbDKQyyRef+7xGtCErWRL7f1qr8xm60da ++gSwyD/WkPTY8SP2mdq4u+6m4dWS26kKoENwuL7jUktl/C/EG7NmUKURbXG8lmeu +q59MIs/Fb3SgaO+zN2FZTYp6dyRJHbeEz55JdOu6F+6ihZYH +=j6Xr +-----END PGP PUBLIC KEY BLOCK----- +``` + + +## Tracking Security Updates + +Information about security vulnerabilities are published in the [Security Advisories](https://github.com/weppos/publicsuffix-ruby/security/advisories) page. diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/bin/console b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/bin/console new file mode 100644 index 000000000000..c638bb43db04 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/bin/console @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "bundler/setup" +require "public_suffix" + +# You can add fixtures and/or initialization code here to make experimenting +# with your gem easier. You can also use a different console, if you like. + +# (If you use this, don't forget to add pry to your Gemfile!) +# require "pry" +# Pry.start + +require "irb" +IRB.start diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/codecov.yml b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/codecov.yml new file mode 100644 index 000000000000..b6959370bc53 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/codecov.yml @@ -0,0 +1,12 @@ +# https://docs.codecov.io/docs/coverage-configuration +coverage: + precision: 1 + round: down + status: + project: + default: false + patch: + default: false + +# https://docs.codecov.io/docs/pull-request-comments#section-requiring-changes +comment: off diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/data/list.txt b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/data/list.txt new file mode 100644 index 000000000000..9ca00ee5f79a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/data/list.txt @@ -0,0 +1,13380 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://www.amnic.net/policy/en/Policy_EN.pdf +am +co.am +com.am +commune.am +net.am +org.am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry <it@nic.at> 2008-06-17 +at +ac.at +co.at +gv.at +or.at +sth.ac.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +catholic.edu.au +// eq.edu.au - Removed at the request of the Queensland Department of Education +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au> +// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au> +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au +// 4LDs +// education.tas.edu.au - Removed at the request of the Department of Education Tasmania +schools.nsw.edu.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry <tech@dns.be> 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://www.bnnic.bn/faqs +bn +com.bn +edu.bn +gov.bn +net.bn +org.bn + +// bo : https://nic.bo/delegacion2015.php#h-1.10 +bo +com.bo +edu.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo +web.bo +// Social Domains +academia.bo +agro.bo +arte.bo +blog.bo +bolivia.bo +ciencia.bo +cooperativa.bo +democracia.bo +deporte.bo +ecologia.bo +economia.bo +empresa.bo +indigena.bo +industria.bo +info.bo +medicina.bo +movimiento.bo +musica.bo +natural.bo +nombre.bo +noticias.bo +patria.bo +politica.bo +profesional.bo +plurinacional.bo +pueblo.bo +revista.bo +salud.bo +tecnologia.bo +tksat.bo +transporte.bo +wiki.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry <fneves@registro.br> +br +9guacu.br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +anani.br +aparecida.br +app.br +arq.br +art.br +ato.br +b.br +barueri.br +belem.br +bhz.br +bib.br +bio.br +blog.br +bmd.br +boavista.br +bsb.br +campinagrande.br +campinas.br +caxias.br +cim.br +cng.br +cnt.br +com.br +contagem.br +coop.br +coz.br +cri.br +cuiaba.br +curitiba.br +def.br +des.br +det.br +dev.br +ecn.br +eco.br +edu.br +emp.br +enf.br +eng.br +esp.br +etc.br +eti.br +far.br +feira.br +flog.br +floripa.br +fm.br +fnd.br +fortal.br +fot.br +foz.br +fst.br +g12.br +geo.br +ggf.br +goiania.br +gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +imb.br +ind.br +inf.br +jab.br +jampa.br +jdf.br +joinville.br +jor.br +jus.br +leg.br +lel.br +log.br +londrina.br +macapa.br +maceio.br +manaus.br +maringa.br +mat.br +med.br +mil.br +morena.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +ong.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +pvh.br +qsl.br +radio.br +rec.br +recife.br +rep.br +ribeirao.br +rio.br +riobranco.br +riopreto.br +salvador.br +sampa.br +santamaria.br +santoandre.br +saobernardo.br +saogonca.br +seg.br +sjc.br +slg.br +slz.br +sorocaba.br +srv.br +taxi.br +tc.br +tec.br +teo.br +the.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://www.nic.cl +// Confirmed by .CL registry <hsalgado@nic.cl> +cl +aprendemas.cl +co.cl +gob.cl +gov.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry <tanyaling@cnnic.cn> +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry <tecnico@uniandes.edu.co> +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry <registry@una.net> 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy> +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry <ops@denic.de> (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry <vabboud@nic.ec> +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : http://domains.fj/ +// Submitted by registry <garth.miller@cocca.org.nz> 2020-02-11 +fj +ac.fj +biz.fj +com.fj +gov.fj +info.fj +mil.fj +name.fj +net.fj +org.fj +pro.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +com.fm +edu.fm +net.fm +org.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : https://www.afnic.fr/medias/documents/Cadre_legal/Afnic_Naming_Policy_12122016_VEN.pdf +fr +asso.fr +com.fr +gouv.fr +nom.fr +prd.fr +tm.fr +// domaines sectoriels : https://www.afnic.fr/en/products-and-services/the-fr-tld/sector-based-fr-domains-4.html +aeroport.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry <Damien.Shaw@ja.net> +gb + +// gd : https://en.wikipedia.org/wiki/.gd +edu.gd +gov.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry <randy@psg.com> +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry <segred@ics.forth.gr> +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/register.html +// University of Guam : https://www.uog.edu +// Submitted by uognoc@triton.uog.edu +gu +com.gu +edu.gu +gov.gu +guam.gu +info.gu +net.gu +org.gu +web.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry <pasztor@iszt.hu> 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://pandi.id/en/domain/registration-requirements/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +ponpes.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry <info@nic.im> +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry <iana-questions@icann.org> 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry <marius@isgate.is> 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names (regions and provinces): +// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentin-sud-tirol.it +trentin-süd-tirol.it +trentin-sudtirol.it +trentin-südtirol.it +trentin-sued-tirol.it +trentin-suedtirol.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-süd-tirol.it +trentino-sudtirol.it +trentino-südtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentino.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosüd-tirol.it +trentinosudtirol.it +trentinosüdtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +trentinsud-tirol.it +trentinsüd-tirol.it +trentinsudtirol.it +trentinsüdtirol.it +trentinsued-tirol.it +trentinsuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +vallée-aoste.it +vallee-d-aoste.it +vallée-d-aoste.it +valleeaoste.it +valléeaoste.it +valleedaoste.it +valléedaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan-sudtirol.it +balsan-südtirol.it +balsan-suedtirol.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano-altoadige.it +bolzano.it +bozen-sudtirol.it +bozen-südtirol.it +bozen-suedtirol.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bulsan-sudtirol.it +bulsan-südtirol.it +bulsan-suedtirol.it +bulsan.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesena-forlì.it +cesenaforli.it +cesenaforlì.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlì-cesena.it +forlicesena.it +forlìcesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +südtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry <nigel@channelisles.net> 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry <info@jprs.jp> +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains +ke +ac.ke +co.ke +go.ke +info.ke +me.ke +mobi.ke +ne.ke +or.ke +sc.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://www.nic.kw/policies/ +// Confirmed by registry <nic.tech@citra.gov.kw> +kw +com.kw +edu.kw +emb.kw +gov.kw +ind.kw +net.kw +org.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry <gavin.brown@nic.la> +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry <randy@psg.com> +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : https://www.nic.lk/index.php/domain-registration/lk-domain-naming-structure +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry <randy@psg.com> +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://www.nic.ls/ +// Confirmed by registry <lsadmin@nic.ls> +ls +ac.ls +biz.ls +co.ls +edu.ls +gov.ls +info.ls +net.ls +org.ls +sc.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry <dcamacho@saipan.com> 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry <help@nic.org.mt> +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry <farias@nic.mx> +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry <antonio@uem.mz> +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc +nom.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry <technician@cenpac.net.nr> +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry <jay@nzrs.net.nz> +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry <jed@email.com.ph> +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky <gug@cctld.ru> +ru + +// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf +rw +ac.rw +co.rw +coop.rw +gov.rw +mil.rw +net.rw +org.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry <lee.humphries@telekom.com.sb> +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry <admin@isoc.sd> +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry <patrik.wallstrom@iis.se> +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry <jarle@uninett.no> +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry <adam@neoip.com> +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://sonic.so/policies/ +so +com.so +edu.so +gov.so +me.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// ss : https://registry.nic.ss/ +// Submitted by registry <technical@nic.ss> +ss +biz.ss +com.ss +edu.ss +gov.ss +net.ss +org.ss + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry <jcvignes@openregistry.com> +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry <krit@thains.co.th> +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry <egullich@colo.to> +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tr : https://nic.tr/ +// https://nic.tr/forms/eng/policies.pdf +// https://nic.tr/index.php?USRACTN=PRICELST +tr +av.tr +bbs.tr +bel.tr +biz.tr +com.tr +dr.tr +edu.tr +gen.tr +gov.tr +info.tr +mil.tr +k12.tr +kep.tr +name.tr +net.tr +org.tr +pol.tr +tel.tr +tsk.tr +tv.tr +web.tr +// Used by Northern Cyprus +nc.tr +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry <manager@tznic.or.tz> +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry <dk@cctld.ua> +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry <Michael.Daly@nominet.org.uk> +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov> +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +// k12.ri.us Removed at request of Kim Cournoyer <netsupport@staff.ri.net> +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us> +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu> +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us> +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us> +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net> +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry <kshah@ca.afilias.info> +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD> +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ae ("bg", Bulgarian) : BG +бг + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +// https://eurid.eu +ею + +// xn--qxa6a ("eu", Greek) : EU +// https://eurid.eu +ευ + +// xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR +موريتانيا + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www.hkirc.hk +// Submitted by registry <hk.tech@hkirc.hk> +// https://www.hkirc.hk/content.jsp?id=30#!/34 +香港 +公司.香港 +教育.香港 +政府.香港 +個人.香港 +網絡.香港 +組織.香港 + +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतम् + +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a ("Bharat", Kashmiri) : IN +// India +بارت + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// https://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// https://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky <gug@cctld.ru> +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : https://www.zadna.org.za/content/page/domain-information/ +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nic.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry <info@zicta.zm> +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + + +// newGTLDs + +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2020-08-07T17:16:50Z +// This list is auto-generated, don't edit it manually. +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Minds + Machines Group Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Binky Moon, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Binky Moon, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// actor : 2013-12-12 Dog Beach, LLC +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Binky Moon, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 Dog Beach, LLC +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 Region Grand Est +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// amazon : 2019-12-19 Amazon Registry Services, Inc. +amazon + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 Beijing Qihu Keji Co., Ltd. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 Oath Inc. +aol + +// apartments : 2014-12-11 Binky Moon, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 Afilias Limited +archi + +// army : 2014-03-06 Dog Beach, LLC +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Binky Moon, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 Dog Beach, LLC +attorney + +// auction : 2014-03-20 Dog Beach, LLC +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon Registry Services, Inc. +audible + +// audio : 2014-03-20 UNR Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon Registry Services, Inc. +author + +// auto : 2014-11-13 XYZ.COM LLC +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Avianca Holdings S.A. +avianca + +// aws : 2015-06-25 Amazon Registry Services, Inc. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 XYZ.COM LLC +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 Dog Beach, LLC +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Binky Moon, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 XYZ.COM LLC +beauty + +// beer : 2014-01-09 Minds + Machines Group Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias Limited +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Binky Moon, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Binky Moon, LLC +bingo + +// bio : 2014-03-06 Afilias Limited +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 UNR Corp. +blackfriday + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 Knock Knock WHOIS There, LLC +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 Bank of America Corporation +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 ShortDot SA +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon Registry Services, Inc. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 Boston TLD Management, LLC +boston + +// bot : 2014-12-18 Amazon Registry Services, Inc. +bot + +// boutique : 2013-11-14 Binky Moon, LLC +boutique + +// box : 2015-11-12 .BOX INC. +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 Dotbroker Registry Limited +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Minds + Machines Group Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Binky Moon, LLC +builders + +// business : 2013-11-07 Binky Moon, LLC +business + +// buy : 2014-12-18 Amazon Registry Services, Inc. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Binky Moon, LLC +cab + +// cafe : 2015-02-11 Binky Moon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon Registry Services, Inc. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Binky Moon, LLC +camera + +// camp : 2013-11-07 Binky Moon, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Binky Moon, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 XYZ.COM LLC +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Binky Moon, LLC +cards + +// care : 2014-03-06 Binky Moon, LLC +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Binky Moon, LLC +careers + +// cars : 2014-11-13 XYZ.COM LLC +cars + +// casa : 2013-11-21 Minds + Machines Group Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Binky Moon, LLC +cash + +// casino : 2014-12-18 Binky Moon, LLC +casino + +// catering : 2013-12-05 Binky Moon, LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Binky Moon, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 DotCFD Registry Limited +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// charity : 2018-04-11 Binky Moon, LLC +charity + +// chase : 2015-04-30 JPMorgan Chase Bank, National Association +chase + +// chat : 2014-12-04 Binky Moon, LLC +chat + +// cheap : 2013-11-14 Binky Moon, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// christmas : 2013-11-21 UNR Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// church : 2014-02-06 Binky Moon, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon Registry Services, Inc. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Binky Moon, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Binky Moon, LLC +claims + +// cleaning : 2013-12-05 Binky Moon, LLC +cleaning + +// click : 2014-06-05 UNR Corp. +click + +// clinic : 2014-03-20 Binky Moon, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Binky Moon, LLC +clothing + +// cloud : 2015-04-16 Aruba PEC S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Binky Moon, LLC +coach + +// codes : 2013-10-31 Binky Moon, LLC +codes + +// coffee : 2013-10-17 Binky Moon, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 dotKoeln GmbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Binky Moon, LLC +community + +// company : 2013-11-07 Binky Moon, LLC +company + +// compare : 2015-10-08 Registry Services, LLC +compare + +// computer : 2013-10-24 Binky Moon, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Binky Moon, LLC +condos + +// construction : 2013-09-16 Binky Moon, LLC +construction + +// consulting : 2013-12-05 Dog Beach, LLC +consulting + +// contact : 2015-01-08 Dog Beach, LLC +contact + +// contractors : 2013-09-10 Binky Moon, LLC +contractors + +// cooking : 2013-11-21 Minds + Machines Group Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Binky Moon, LLC +cool + +// corsica : 2014-09-25 Collectivité de Corse +corsica + +// country : 2013-12-19 DotCountry LLC +country + +// coupon : 2015-02-26 Amazon Registry Services, Inc. +coupon + +// coupons : 2015-03-26 Binky Moon, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// cpa : 2019-06-10 American Institute of Certified Public Accountants +cpa + +// credit : 2014-03-20 Binky Moon, LLC +credit + +// creditcard : 2014-03-20 Binky Moon, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Binky Moon, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 ShortDot SA +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 Dog Beach, LLC +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Binky Moon, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Minds + Machines Group Limited +dds + +// deal : 2015-06-25 Amazon Registry Services, Inc. +deal + +// dealer : 2014-12-22 Intercap Registry Inc. +dealer + +// deals : 2014-05-22 Binky Moon, LLC +deals + +// degree : 2014-03-06 Dog Beach, LLC +degree + +// delivery : 2014-09-11 Binky Moon, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 Dog Beach, LLC +democrat + +// dental : 2014-03-20 Binky Moon, LLC +dental + +// dentist : 2014-03-20 Dog Beach, LLC +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 Binky Moon, LLC +diamonds + +// diet : 2014-06-26 UNR Corp. +diet + +// digital : 2014-03-06 Binky Moon, LLC +digital + +// direct : 2014-04-10 Binky Moon, LLC +direct + +// directory : 2013-09-20 Binky Moon, LLC +directory + +// discount : 2014-03-06 Binky Moon, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Binky Moon, LLC +doctor + +// dog : 2014-12-04 Binky Moon, LLC +dog + +// domains : 2013-10-17 Binky Moon, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 DISH Technologies L.L.C. +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Binky Moon, LLC +education + +// email : 2013-10-31 Binky Moon, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Moon, LLC +energy + +// engineer : 2014-03-06 Dog Beach, LLC +engineer + +// engineering : 2014-03-06 Binky Moon, LLC +engineering + +// enterprises : 2013-09-20 Binky Moon, LLC +enterprises + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Binky Moon, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Binky Moon, LLC +estate + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Binky Moon, LLC +events + +// exchange : 2014-03-06 Binky Moon, LLC +exchange + +// expert : 2013-11-21 Binky Moon, LLC +expert + +// exposed : 2013-12-05 Binky Moon, LLC +exposed + +// express : 2015-02-11 Binky Moon, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Binky Moon, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 Dog Beach, LLC +family + +// fan : 2014-03-06 Dog Beach, LLC +fan + +// fans : 2014-11-07 ZDNS International Limited +fans + +// farm : 2013-11-07 Binky Moon, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Minds + Machines Group Limited +fashion + +// fast : 2014-12-18 Amazon Registry Services, Inc. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Canada Inc. +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Binky Moon, LLC +finance + +// financial : 2014-03-06 Binky Moon, LLC +financial + +// fire : 2015-06-25 Amazon Registry Services, Inc. +fire + +// firestone : 2014-12-18 Bridgestone Licensing Services, Inc +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Binky Moon, LLC +fish + +// fishing : 2013-11-21 Minds + Machines Group Limited +fishing + +// fit : 2014-11-07 Minds + Machines Group Limited +fit + +// fitness : 2014-03-06 Binky Moon, LLC +fitness + +// flickr : 2015-04-02 Flickr, Inc. +flickr + +// flights : 2013-12-05 Binky Moon, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Binky Moon, LLC +florist + +// flowers : 2014-10-09 UNR Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Binky Moon, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 Dotforex Registry Limited +forex + +// forsale : 2014-05-22 Dog Beach, LLC +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 Binky Moon, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon Registry Services, Inc. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 DotSpace Inc. +fun + +// fund : 2014-03-20 Binky Moon, LLC +fund + +// furniture : 2014-03-20 Binky Moon, LLC +furniture + +// futbol : 2013-09-20 Dog Beach, LLC +futbol + +// fyi : 2015-04-02 Binky Moon, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Binky Moon, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 UNR Corp. +game + +// games : 2015-05-28 Dog Beach, LLC +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Minds + Machines Group Limited +garden + +// gay : 2019-05-23 Top Level Design, LLC +gay + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL NV +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 DotGift, LLC +gift + +// gifts : 2014-07-03 Binky Moon, LLC +gifts + +// gives : 2014-03-06 Dog Beach, LLC +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Binky Moon, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot Global Domain Registry Limited +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Binky Moon, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 Binky Moon, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Binky Moon, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon Registry Services, Inc. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Binky Moon, LLC +graphics + +// gratis : 2014-03-20 Binky Moon, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Binky Moon, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Binky Moon, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Binky Moon, LLC +guide + +// guitars : 2013-11-14 UNR Corp. +guitars + +// guru : 2013-08-27 Binky Moon, LLC +guru + +// hair : 2015-12-03 XYZ.COM LLC +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 Dog Beach, LLC +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Binky Moon, LLC +healthcare + +// help : 2014-06-26 UNR Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 UNR Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 UNR Corp. +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Binky Moon, LLC +hockey + +// holdings : 2013-08-27 Binky Moon, LLC +holdings + +// holiday : 2013-11-07 Binky Moon, LLC +holiday + +// homedepot : 2015-04-02 Home Depot Product Authority, LLC +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// horse : 2013-11-21 Minds + Machines Group Limited +horse + +// hospital : 2016-10-20 Binky Moon, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 UNR Corp. +hosting + +// hot : 2015-08-27 Amazon Registry Services, Inc. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Binky Moon, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Global Services (UK) Limited +hsbc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 ShortDot SA +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon Registry Services, Inc. +imdb + +// immo : 2014-07-10 Binky Moon, LLC +immo + +// immobilien : 2013-11-07 Dog Beach, LLC +immobilien + +// inc : 2018-03-10 Intercap Registry Inc. +inc + +// industries : 2013-12-05 Binky Moon, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Binky Moon, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Binky Moon, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Binky Moon, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Binky Moon, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Binky Moon, LLC +irish + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 Binky Moon, LLC +jetzt + +// jewelry : 2015-03-05 Binky Moon, LLC +jewelry + +// jio : 2015-04-02 Reliance Industries Limited +jio + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon Registry Services, Inc. +jot + +// joy : 2014-12-18 Amazon Registry Services, Inc. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 UNR Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 Dog Beach, LLC +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon Registry Services, Inc. +kindle + +// kitchen : 2013-09-20 Binky Moon, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 dotKoeln GmbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” +lacaixa + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// land : 2013-09-10 Binky Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 LW TLD Limited +law + +// lawyer : 2014-03-20 Dog Beach, LLC +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC +lds + +// lease : 2014-03-06 Binky Moon, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Binky Moon, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Binky Moon, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 Binky Moon, LLC +lighting + +// like : 2014-12-18 Amazon Registry Services, Inc. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Binky Moon, LLC +limited + +// limo : 2013-10-17 Binky Moon, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 UNR Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 Dog Beach, LLC +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// llc : 2017-12-14 Afilias Limited +llc + +// llp : 2019-08-26 UNR Corp. +llp + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 Binky Moon, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 UNR Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Binky Moon, LLC +ltd + +// ltda : 2014-04-17 InterNetX, Corp +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Minds + Machines Group Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Binky Moon, LLC +maison + +// makeup : 2015-01-15 XYZ.COM LLC +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 Binky Moon, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 Dog Beach, LLC +market + +// marketing : 2013-11-07 Binky Moon, LLC +marketing + +// markets : 2014-12-11 Dotmarkets Registry Limited +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Binky Moon, LLC +mba + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Binky Moon, LLC +media + +// meet : 2014-01-16 Charleston Road Registry Inc. +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Dot Menu Registry, LLC +menu + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Minds + Machines Group Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// moda : 2013-11-07 Dog Beach, LLC +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon Registry Services, Inc. +moi + +// mom : 2015-04-16 UNR Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Binky Moon, LLC +money + +// monster : 2015-09-11 XYZ.COM LLC +monster + +// mormon : 2013-12-05 IRI Domain Management, LLC +mormon + +// mortgage : 2014-03-20 Dog Beach, LLC +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 Motorola Trademark Holdings, LLC +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 Binky Moon, LLC +movie + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 Dog Beach, LLC +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Binky Moon, LLC +network + +// neustar : 2013-12-05 NeuStar, Inc. +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 Dog Beach, LLC +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 Dog Beach, LLC +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon Registry Services, Inc. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 Top Level Spectrum, Inc. +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BRregistry, Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Osaka Registry Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 MédiaBC +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Binky Moon, LLC +partners + +// parts : 2013-12-05 Binky Moon, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon Registry Services, Inc. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias Limited +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 UNR Corp. +photo + +// photography : 2013-09-20 Binky Moon, LLC +photography + +// photos : 2013-10-17 Binky Moon, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// pics : 2013-11-14 UNR Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Binky Moon, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon Registry Services, Inc. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Binky Moon, LLC +pizza + +// place : 2014-04-24 Binky Moon, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Interactive Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Binky Moon, LLC +plumbing + +// plus : 2015-02-05 Binky Moon, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon Registry Services, Inc. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Binky Moon, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 Afilias Limited +promo + +// properties : 2013-12-05 Binky Moon, LLC +properties + +// property : 2014-05-22 UNR Corp. +property + +// protection : 2015-04-23 XYZ.COM LLC +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 Dog Beach, LLC +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 XYZ.COM LLC +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon Registry Services, Inc. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Binky Moon, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 Dog Beach, LLC +rehab + +// reise : 2014-03-13 Binky Moon, LLC +reise + +// reisen : 2014-03-06 Binky Moon, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 ZDNS International Limited +ren + +// rent : 2014-12-04 XYZ.COM LLC +rent + +// rentals : 2013-12-05 Binky Moon, LLC +rentals + +// repair : 2013-11-07 Binky Moon, LLC +repair + +// report : 2013-12-05 Binky Moon, LLC +report + +// republican : 2014-03-20 Dog Beach, LLC +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Binky Moon, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 Dog Beach, LLC +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 Dog Beach, LLC +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 Dog Beach, LLC +rocks + +// rodeo : 2013-12-19 Minds + Machines Group Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Canada Inc. +rogers + +// room : 2014-12-18 Amazon Registry Services, Inc. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Binky Moon, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BRregistry, Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon Registry Services, Inc. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 Dog Beach, LLC +sale + +// salon : 2014-12-11 Binky Moon, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sarl : 2014-07-03 Binky Moon, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon Registry Services, Inc. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Binky Moon, LLC +school + +// schule : 2014-03-06 Binky Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon Registry Services, Inc. +secure + +// security : 2015-05-14 XYZ.COM LLC +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 Registry Services, LLC +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Binky Moon, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 UNR Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Moon, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 Binky Moon, LLC +shopping + +// shouji : 2015-01-08 Beijing Qihu Keji Co., Ltd. +shouji + +// show : 2015-03-05 Binky Moon, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon Registry Services, Inc. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Binky Moon, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 Afilias Limited +ski + +// skin : 2015-01-15 XYZ.COM LLC +skin + +// sky : 2014-06-19 Sky International AG +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 DISH Technologies L.L.C. +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon Registry Services, Inc. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Binky Moon, LLC +soccer + +// social : 2013-11-07 Dog Beach, LLC +social + +// softbank : 2015-07-02 SoftBank Group Corp. +softbank + +// software : 2014-03-20 Dog Beach, LLC +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Binky Moon, LLC +solar + +// solutions : 2013-11-07 Binky Moon, LLC +solutions + +// song : 2015-02-26 Amazon Registry Services, Inc. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited +spa + +// space : 2014-04-03 DotSpace Inc. +space + +// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) +sport + +// spot : 2015-02-26 Amazon Registry Services, Inc. +spot + +// spreadbetting : 2014-12-11 Dotspreadbetting Registry Limited +spreadbetting + +// srl : 2015-05-07 InterNetX, Corp +srl + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 XYZ.COM LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 Dog Beach, LLC +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Ltd. +sucks + +// supplies : 2013-12-19 Binky Moon, LLC +supplies + +// supply : 2013-12-19 Binky Moon, LLC +supply + +// support : 2013-10-24 Binky Moon, LLC +support + +// surf : 2014-01-09 Minds + Machines Group Limited +surf + +// surgery : 2014-03-20 Binky Moon, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// systems : 2013-11-07 Binky Moon, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon Registry Services, Inc. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 UNR Corp. +tattoo + +// tax : 2014-03-20 Binky Moon, LLC +tax + +// taxi : 2015-03-19 Binky Moon, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Binky Moon, LLC +team + +// tech : 2015-01-30 Personals TLD Inc. +tech + +// technology : 2013-09-13 Binky Moon, LLC +technology + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Binky Moon, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Home Depot Product Authority, LLC +thd + +// theater : 2015-03-19 Binky Moon, LLC +theater + +// theatre : 2015-05-07 XYZ.COM LLC +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Binky Moon, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Binky Moon, LLC +tips + +// tires : 2014-11-07 Binky Moon, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Binky Moon, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Binky Moon, LLC +tools + +// top : 2014-03-20 .TOP Registry +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Binky Moon, LLC +tours + +// town : 2014-03-06 Binky Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Binky Moon, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 Dottrading Registry Limited +trading + +// training : 2013-11-07 Binky Moon, LLC +training + +// travel : 2015-10-09 Dog Beach, LLC +travel + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 NCC Group Domain Services, Inc. +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon Registry Services, Inc. +tunes + +// tushu : 2014-12-18 Amazon Registry Services, Inc. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Binky Moon, LLC +university + +// uno : 2013-09-11 DotSite Inc. +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Binky Moon, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Moon, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 tldbox GmbH +versicherung + +// vet : 2014-03-06 Dog Beach, LLC +vet + +// viajes : 2013-10-17 Binky Moon, LLC +viajes + +// video : 2014-10-16 Dog Beach, LLC +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 Binky Moon, LLC +villas + +// vin : 2015-06-18 Binky Moon, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Binky Moon, LLC +vision + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Minds + Machines Group Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Binky Moon, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Wang Limited +wang + +// wanggou : 2014-12-18 Amazon Registry Services, Inc. +wanggou + +// watch : 2013-11-14 Binky Moon, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 International Business Machines Corporation +weather + +// weatherchannel : 2015-03-12 International Business Machines Corporation +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Minds + Machines Group Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 Binky Moon, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Minds + Machines Group Limited +work + +// works : 2013-11-14 Binky Moon, LLC +works + +// world : 2014-06-12 Binky Moon, LLC +world + +// wow : 2015-10-08 Amazon Registry Services, Inc. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Binky Moon, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 Beijing Qihu Keji Co., Ltd. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd +八卦 + +// xn--4gbrim : 2013-10-04 Fans TLD Limited +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. +ストア + +// xn--cckwcxetd : 2019-12-19 Amazon Registry Services, Inc. +アマゾン + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited +商标 + +// xn--czrs0t : 2013-12-19 Binky Moon, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. +ポイント + +// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. +新闻 + +// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Binky Moon, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited +餐厅 + +// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq480n2rg : 2019-12-19 Amazon Registry Services, Inc. +亚马逊 + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--otu796d : 2017-08-06 Jiang Yu Liang Cai Technology Company Limited +招聘 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. +書籍 + +// xn--ses554g : 2014-01-16 KNET Co., Ltd. +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Binky Moon, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Binky Moon, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon Registry Services, Inc. +yamaxun + +// yandex : 2014-04-10 Yandex Europe B.V. +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Minds + Machines Group Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon Registry Services, Inc. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 Beijing Qihu Keji Co., Ltd. +yun + +// zappos : 2015-06-25 Amazon Registry Services, Inc. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon Registry Services, Inc. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zone : 2013-11-14 Binky Moon, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC <noc@1gb.com.ua> +cc.ua +inf.ua +ltd.ua + +// 611coin : https://611project.org/ +611.to + +// Adobe : https://www.adobe.com/ +// Submitted by Ian Boston <boston@adobe.com> +adobeaemcloud.com +adobeaemcloud.net +*.dev.adobeaemcloud.com + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa <it-admin@domena.pl> +beep.pl + +// alboto.ca : http://alboto.ca +// Submitted by Anton Avramov <avramov@alboto.ca> +barsy.ca + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com> +*.compute.estate +*.alces.network + +// all-inkl.com : https://all-inkl.com +// Submitted by Werner Kaltofen <wk@all-inkl.com> +kasserver.com + +// Algorithmia, Inc. : algorithmia.com +// Submitted by Eli Perelman <eperelman@algorithmia.io> +*.algorithmia.com +!teams.algorithmia.com +!test.algorithmia.com + +// Altervista: https://www.altervista.org +// Submitted by Carlo Cannas <tech_staff@altervista.it> +altervista.org + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril <admin@alwaysdata.com> +alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller <donavanm@amazon.com> +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +cn-north-1.eb.amazonaws.com.cn +cn-northwest-1.eb.amazonaws.com.cn +elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-northeast-3.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +eu-west-3.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells <psl-maintainers@amazon.com> +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-eu-west-3.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.eu-west-3.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.eu-west-3.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.eu-west-3.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amsterdam Wireless: https://www.amsterdamwireless.nl/ +// Submitted by Imre Jonk <hostmaster@amsterdamwireless.nl> +amsw.nl + +// Amune : https://amune.org/ +// Submitted by Team Amune <cert@amune.org> +t3l3p0rt.net +tele.amune.org + +// Apigee : https://apigee.com/ +// Submitted by Apigee Security Team <security@apigee.com> +apigee.io + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco <thomas@aptible.com> +on-aptible.com + +// ASEINet : https://www.aseinet.com/ +// Submitted by Asei SEKIGUCHI <mail@aseinet.com> +user.aseinet.ne.jp +gv.vc +d.gv.vc + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin <marcan@euskalencounter.org> +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar <jardiniers@potager.org> +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng <vincenttseng@asustor.com> +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise <a.weise@avm.de> +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy <domains@advisorwebsites.com> +*.awdev.ca +*.advisor.ws + +// b-data GmbH : https://www.b-data.io +// Submitted by Olivier Benz <olivier.benz@b-data.ch> +b-data.io + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas <anthony@backplane.io> +backplaneapp.io + +// Balena : https://www.balena.io +// Submitted by Petros Angelatos <petrosagg@balena.io> +balena-devices.com + +// Banzai Cloud +// Submitted by Janos Matyas <info@banzaicloud.com> +*.banzai.cloud +app.banzaicloud.io +*.backyards.banzaicloud.io + + +// BetaInABox +// Submitted by Adrian <adrian@betainabox.com> +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan <nathan@mammoth.com.au> +bnr.la + +// Blackbaud, Inc. : https://www.blackbaud.com +// Submitted by Paul Crowder <paul.crowder@blackbaud.com> +blackbaudcdn.net + +// Boomla : https://boomla.com +// Submitted by Tibor Halter <thalter@boomla.com> +boomla.net + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine <axel@boxfuse.com> +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic <security@bplaced.net> +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com> +browsersafetymark.io + +// Bytemark Hosting : https://www.bytemark.co.uk +// Submitted by Paul Cammish <paul.cammish@bytemark.co.uk> +uk0.bigv.io +dh.bytemark.co.uk +vm.bytemark.co.uk + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp <admin@callidomus.com> +mycd.eu + +// Carrd : https://carrd.co +// Submitted by AJ <aj@carrd.co> +carrd.co +crd.co +uwu.ai + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry <gavin.brown@centralnic.com> +ae.org +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.net +hu.net +jp.net +jpn.com +mex.com +ru.com +sa.com +se.net +uk.com +uk.net +us.com +za.bz +za.com + +// No longer operated by CentralNic, these entries should be adopted and/or removed by current operators +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +ar.com +gb.com +hu.com +kr.com +no.com +qc.com +uy.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +in.net +web.in + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +co.com + +// Roar Domains LLC : https://roar.basketball/ +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +aus.basketball +nz.basketball + +// BRS Media : https://brsmedia.com/ +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +radio.am +radio.fm + +// Globe Hosting SRL : https://www.globehosting.com/ +// Submitted by Gavin Brown <gavin.brown@centralnic.com> +co.ro +shop.ro + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt <hostmaster@certmgr.org> +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard <alex.stoddard@citrix.com> +xenapponazure.com + +// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/ +// Submitted by Rishabh Nambiar & Michael Brown <team@discourse.org> +discourse.group +discourse.team + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland <leon@clearvox.nl> +virtueeldomein.nl + +// Clever Cloud : https://www.clever-cloud.com/ +// Submitted by Quentin Adam <noc@clever-cloud.com> +cleverapps.io + +// Clerk : https://www.clerk.dev +// Submitted by Colin Sidoti <colin@clerk.dev> +*.lcl.dev +*.stg.dev + +// Clic2000 : https://clic2000.fr +// Submitted by Mathilde Blanchemanche <mathilde@clic2000.fr> +clic2000.net + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi <khash@cloud66.com> +c66.me +cloud66.ws +cloud66.zone + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek <noc@cloudaccess.net> +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken <tw@cloudcontrol.com> +cloudcontrolled.com +cloudcontrolapp.com + +// Cloudera, Inc. : https://www.cloudera.com/ +// Submitted by Philip Langdale <security@cloudera.com> +cloudera.site + +// Cloudflare, Inc. : https://www.cloudflare.com/ +// Submitted by Jake Riesterer <publicsuffixlist@cloudflare.com> +trycloudflare.com +workers.dev + +// Clovyr : https://clovyr.io +// Submitted by Patrick Nielsen <patrick@clovyr.io> +wnext.app + +// co.ca : http://registry.co.ca/ +co.ca + +// Co & Co : https://co-co.nl/ +// Submitted by Govert Versluis <govert@co-co.nl> +*.otap.co + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad <semrad@i-registry.cz> +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes <jan.krpes@cdn77.com> +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov <noc@cloudns.net> +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// Cloudeity Inc : https://cloudeity.com +// Submitted by Stefan Dimitrov <contact@cloudeity.com> +cloudeity.net + +// CNPY : https://cnpy.gdn +// Submitted by Angelo Gladding <angelo@lahacker.net> +cnpy.gdn + +// CoDNS B.V. +co.nl +co.no + +// Combell.com : https://www.combell.com +// Submitted by Thomas Wouters <thomas.wouters@combellgroup.com> +webhosting.be +hosting-cluster.nl + +// Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/ +// Submitted by George Georgievsky <gug@cctld.ru> +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke <rmarticke@cosimo.de> +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik <ales.krajnik@craynic.com> +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net> +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> +cupcake.is + +// Curv UG : https://curv-labs.de/ +// Submitted by Marvin Wiesner <Marvin@curv-labs.de> +curv.dev + +// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/ +// Submitted by Gregory Drake <support@dyn.com> +// Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label +*.customer-oci.com +*.oci.customer-oci.com +*.ocp.customer-oci.com +*.ocs.customer-oci.com + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger <dol@cyon.ch> +cyon.link +cyon.site + +// Danger Science Group: https://dangerscience.com/ +// Submitted by Skylar MacDonald <skylar@dangerscience.com> +fnwk.site +folionetwork.site +platform0.app + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal <aj@daplie.com> +daplie.me +localhost.daplie.me + +// Datto, Inc. : https://www.datto.com/ +// Submitted by Philipp Heckel <ph@datto.com> +dattolocal.com +dattorelay.com +dattoweb.com +mydatto.com +dattolocal.net +mydatto.net + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule <digital@digital.co.dk> +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// dappnode.io : https://dappnode.io/ +// Submitted by Abel Boldu / DAppNode Team <community@dappnode.io> +dyndns.dappnode.io + +// dapps.earth : https://dapps.earth/ +// Submitted by Daniil Burdakov <icqkill@gmail.com> +*.dapps.earth +*.bzz.dapps.earth + +// Dark, Inc. : https://darklang.com +// Submitted by Paul Biggar <ops@darklang.com> +builtwithdark.com + +// Datawire, Inc : https://www.datawire.io +// Submitted by Richard Li <secalert@datawire.io> +edgestack.me + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team <dsa-publicsuffixlist@debian.org> +debian.net + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen <peter@desec.io> +dedyn.io + +// DNS Africa Ltd https://dns.business +// Submitted by Calvin Browne <calvin@dns.business> +jozi.biz + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler <mail@dnshome.de> +dnshome.de + +// DotArai : https://www.dotarai.com/ +// Submitted by Atsadawat Netcharadsang <atsadawat@dotarai.co.th> +online.th +shop.th + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang <mis@draytek.com> +drayddns.com + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha <rpadilha@drobo.com> +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges <kevin@drud.com> +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper <richard@duckdns.org> +duckdns.org + +// bitbridge.net : Submitted by Craig Welch, abeliidev@gmail.com +bitbridge.net + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen <hessu@hes.iki.fi> +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela <webmaster@ddnss.de> +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli <maxence@definima.com> +definima.net +definima.io + +// dnstrace.pro : https://dnstrace.pro/ +// Submitted by Chris Partridge <chris@partridge.tech> +bci.dnstrace.pro + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye <sue@dynu.com> +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke <dom@digineo.de> +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr <info@e4you.cz> +e4.cz + +// En root‽ : https://en-root.org +// Submitted by Emmanuel Raviart <emmanuel@raviart.com> +en-root.fr + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier <thomas.cottier@enalean.com> +mytuleap.com + +// ECG Robotics, Inc: https://ecgrobotics.org +// Submitted by <frc1533@ecgrobotics.org> +onred.one +staging.onred.one + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde <esu@enonic.com> +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac <hostmaster@eu.org> +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik <support@evennode.com> +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang <cschang@corp.url.com.tw> +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Fabrica Technologies, Inc. : https://www.fabrica.dev/ +// Submitted by Eric Jiang <eric@fabrica.dev> +onfabrica.com + +// Facebook, Inc. +// Submitted by Peter Ruibal <public-suffix@fb.com> +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba <tech.contact@faitid.org> +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta <aman@getchannels.com> +channelsdvr.net +u.channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security <security@fastly.com> +fastly-terrarium.com +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// FASTVPS EESTI OU : https://fastvps.ru/ +// Submitted by Likhachev Vasiliy <lihachev@fastvps.ru> +fastvps-server.com +fastvps.host +myfast.host +fastvps.site +myfast.space + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke <simon@featherhead.xyz> +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org> +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org +app.os.fedoraproject.org +app.os.stg.fedoraproject.org + +// FearWorks Media Ltd. : https://fearworksmedia.co.uk +// submitted by Keith Fairley <domains@fearworksmedia.co.uk> +conn.uk +copro.uk +couk.me +ukco.me + +// Fermax : https://fermax.com/ +// submitted by Koen Van Isterdael <k.vanisterdael@fermax.be> +mydobiss.com + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu <jason@owtware.com> +filegear.me +filegear-au.me +filegear-de.me +filegear-gb.me +filegear-ie.me +filegear-jp.me +filegear-sg.me + +// Firebase, Inc. +// Submitted by Chris Raynor <chris@firebase.com> +firebaseapp.com + +// fly.io: https://fly.io +// Submitted by Kurt Mackey <kurt@fly.io> +fly.dev +edgeapp.net +shw.io + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg <jonathan@flynn.io> +flynnhosting.net + +// Frederik Braun https://frederik-braun.com +// Submitted by Frederik Braun <fb@frederik-braun.com> +0e.vc + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel <rfliedel@freebox.fr> +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// freedesktop.org : https://www.freedesktop.org +// Submitted by Daniel Stone <daniel@fooishbar.org> +freedesktop.org + +// FunkFeuer - Verein zur Förderung freier Netze : https://www.funkfeuer.at +// Submitted by Daniel A. Maierhofer <vorstand@funkfeuer.at> +wien.funkfeuer.at + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at> +*.futurecms.at +*.ex.futurecms.at +*.in.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> +service.gov.uk + +// Gehirn Inc. : https://www.gehirn.co.jp/ +// Submitted by Kohei YOSHIDA <tech@gehirn.co.jp> +gehirn.ne.jp +usercontent.jp + +// Gentlent, Inc. : https://www.gentlent.com +// Submitted by Tom Klein <tom@gentlent.com> +gentapps.com +gentlentapis.com +lab.ms + +// GitHub, Inc. +// Submitted by Patrick Toomey <security@github.com> +github.io +githubusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka <alex@gitlab.com> +gitlab.io + +// Gitplac.si - https://gitplac.si +// Submitted by Aljaž Starc <me@aljaxus.eu> +gitpage.si + +// Glitch, Inc : https://glitch.com +// Submitted by Mads Hartmann <mads@glitch.com> +glitch.me + +// GMO Pepabo, Inc. : https://pepabo.com/ +// Submitted by dojineko <admin@pepabo.com> +lolipop.io + +// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/ +// Submitted by Tom Whitwell <tom.whitwell@digital.cabinet-office.gov.uk> +cloudapps.digital +london.cloudapps.digital + +// GOV.UK Pay : https://www.payments.service.gov.uk/ +// Submitted by Richard Baker <richard.baker@digital.cabinet-office.gov.uk> +pymnt.uk + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk> +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi <egresi@globehosting.com> +ro.im + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter <milchstrasse@goip.de> +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela <evn@google.com> +run.app +a.run.app +web.app +*.0emm.com +appspot.com +*.r.appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +cloud.goog +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Aaron Marais' Gitlab pages: https://lab.aaronleem.co.za +// Submitted by Aaron Marais <its_me@aaronleem.co.za> +graphox.us + +// Group 53, LLC : https://www.group53.com +// Submitted by Tyler Todd <noc@nova53.net> +awsmppl.com + +// Hakaran group: http://hakaran.cz +// Submited by Arseniy Sokolov <security@hakaran.cz> +fin.ci +free.hr +caa.li +ua.rs +conf.se + +// Handshake : https://handshake.org +// Submitted by Mike Damm <md@md.vc> +hs.zone +hs.run + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed <shahidh@hasura.io> +hasura.app +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid <admin@hepforge.org> +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher <tmaher@heroku.com> +herokuapp.com +herokussl.com + +// Hibernating Rhinos +// Submitted by Oren Eini <oren@ravendb.net> +myravendb.com +ravendb.community +ravendb.me +development.run +ravendb.run + +// HOSTBIP REGISTRY : https://www.hostbip.com/ +// Submitted by Atanunu Igbunuroghene <publicsuffixlist@hostbip.com> +bpl.biz +orx.biz +ng.city +biz.gl +ng.ink +col.ng +firm.ng +gen.ng +ltd.ng +ngo.ng +ng.school +sch.so + +// HostyHosting (hostyhosting.com) +hostyhosting.io + +// Häkkinen.fi +// Submitted by Eero Häkkinen <Eero+psl@Häkkinen.fi> +häkkinen.fi + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan <simon@icilalune.com> +*.moonscale.io +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson <haa@iki.fi> +iki.fi + +// Individual Network Berlin e.V. : https://www.in-berlin.de/ +// Submitted by Christian Seitz <chris@in-berlin.de> +dyn-berlin.de +in-berlin.de +in-brb.de +in-butter.de +in-dsl.de +in-dsl.net +in-dsl.org +in-vpn.de +in-vpn.net +in-vpn.org + +// info.at : http://www.info.at/ +biz.at +info.at + +// info.cx : http://info.cx +// Submitted by Jacob Slater <whois@igloo.to> +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br> +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz <admin@intermetrics.de> +pixolino.com + +// Internet-Pro, LLP: https://netangels.ru/ +// Submited by Vasiliy Sheredeko <piphon@gmail.com> +na4u.ru + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman <mhardeman@ipifony.com> +ipifony.net + +// IServ GmbH : https://iserv.eu +// Submitted by Kim-Alexander Brodowski <info@iserv.eu> +mein-iserv.de +schulserver.de +test-iserv.de +iserv.dev + +// I-O DATA DEVICE, INC. : http://www.iodata.com/ +// Submitted by Yuji Minagawa <domains-admin@iodata.jp> +iobb.net + +//Jelastic, Inc. : https://jelastic.com/ +// Submited by Ihor Kolodyuk <ik@jelastic.com> +appengine.flow.ch +vip.jelastic.cloud +jele.cloud +jele.club +dopaas.com +hidora.com +jcloud.ik-server.com +demo.jelastic.com +paas.massivegrid.com +j.scaleforce.com.cy +jelastic.dogado.eu +fi.cloudplatform.fi +paas.datacenter.fi +jele.host +mircloud.host +jele.io +cloudjiffy.net +jls-sto1.elastx.net +jelastic.saveincloud.net +jelastic.regruhosting.ru +jele.site +jelastic.team +j.layershift.co.uk + +// Jino : https://www.jino.ru +// Submitted by Sergey Ulyashin <ulyashin@jino.ru> +myjino.ru +*.hosting.myjino.ru +*.landing.myjino.ru +*.spectrum.myjino.ru +*.vps.myjino.ru + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett <brian.bennett@joyent.com> +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim <admin@js.org> +js.org + +// KaasHosting : http://www.kaashosting.nl/ +// Submitted by Wouter Bakker <hostmaster@kaashosting.nl> +kaas.gg +khplay.nl + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl <postmaster@keymachine.de> +keymachine.de + +// KingHost : https://king.host +// Submitted by Felipe Keller Braz <felipebraz@kinghost.com.br> +kinghost.net +uni5.net + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene <rkeene@knightpoint.com> +knightpoint.systems + +// KUROKU LTD : https://kuroku.ltd/ +// Submitted by DisposaBoy <security@oya.to> +oya.to + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn <info@lcube.de> +git-repos.de +lcube-server.de +svn-repos.de + +// Leadpages : https://www.leadpages.net +// Submitted by Greg Dallavalle <domains@leadpages.net> +leadpages.co +lpages.co +lpusercontent.com + +// Lelux.fi : https://lelux.fi/ +// Submitted by Lelux Admin <publisuffix@lelux.site> +lelux.site + +// Lifetime Hosting : https://Lifetime.Hosting/ +// Submitted by Mike Fillator <support@lifetime.hosting> +co.business +co.education +co.events +co.financial +co.network +co.place +co.technology + +// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ +// Submitted by Greg Holland <greg.holland@lmpm.com> +app.lmpm.com + +// Linki Tools UG : https://linki.tools +// Submitted by Paulo Matos <pmatos@linki.tools> +linkitools.space + +// linkyard ldt: https://www.linkyard.ch/ +// Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch> +linkyard.cloud +linkyard-cloud.ch + +// Linode : https://linode.com +// Submitted by <security@linode.com> +members.linode.com +*.nodebalancer.linode.com +*.linodeobjects.com + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev <admin@liquidnetlimited.com> +we.bs + +// Log'in Line : https://www.loginline.com/ +// Submitted by Rémi Mach <remi.mach@loginline.com> +loginline.app +loginline.dev +loginline.io +loginline.services +loginline.site + +// LubMAN UMCS Sp. z o.o : https://lubman.pl/ +// Submitted by Ireneusz Maliszewski <ireneusz.maliszewski@lubman.pl> +krasnik.pl +leczna.pl +lubartow.pl +lublin.pl +poniatowa.pl +swidnik.pl + +// Lug.org.uk : https://lug.org.uk +// Submitted by Jon Spriggs <admin@lug.org.uk> +uklugs.org +glug.org.uk +lug.org.uk +lugs.org.uk + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov <register@lukanet.com> +barsy.bg +barsy.co.uk +barsyonline.co.uk +barsycenter.com +barsyonline.com +barsy.club +barsy.de +barsy.eu +barsy.in +barsy.info +barsy.io +barsy.me +barsy.menu +barsy.mobi +barsy.net +barsy.online +barsy.org +barsy.pro +barsy.pub +barsy.shop +barsy.site +barsy.support +barsy.uk + +// Magento Commerce +// Submitted by Damien Tournoud <dtournoud@magento.cloud> +*.magentosite.cloud + +// May First - People Link : https://mayfirst.org/ +// Submitted by Jamie McClelland <info@mayfirst.org> +mayfirst.info +mayfirst.org + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru> +hb.cldmail.ru + +// mcpe.me : https://mcpe.me +// Submitted by Noa Heyl <hi@noa.dev> +mcpe.me + +// McHost : https://mchost.ru +// Submitted by Evgeniy Subbotin <e.subbotin@mchost.ru> +mcdir.ru +vps.mcdir.ru + +// Memset hosting : https://www.memset.com +// Submitted by Tom Whitwell <domains@memset.com> +miniserver.com +memset.net + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz> +*.cloud.metacentrum.cz +custom.metacentrum.cz + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Radim Janča <janca@cesnet.cz> +flt.cloud.muni.cz +usr.cloud.muni.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier <pierre@meteor.com> +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft Corporation : http://microsoft.com +// Submitted by Mostafa Elzeiny <moelzein@microsoft.com> +*.azurecontainer.io +azurewebsites.net +azure-mobile.net +cloudapp.net + +// minion.systems : http://minion.systems +// Submitted by Robert Böttinger <r@minion.systems> +csx.cc + +// MobileEducation, LLC : https://joinforte.com +// Submitted by Grayson Martin <grayson.martin@mobileeducation.us> +forte.id + +// Mozilla Corporation : https://mozilla.com +// Submitted by Ben Francis <bfrancis@mozilla.com> +mozilla-iot.org + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob <glob@mozilla.com> +bmoattachments.org + +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman <r.khannanov@msk-ix.ru> +net.ru +org.ru +pp.ru + +// Mythic Beasts : https://www.mythic-beasts.com +// Submitted by Paul Cammish <kelduum@mythic-beasts.com> +hostedpi.com +customer.mythic-beasts.com +lynx.mythic-beasts.com +ocelot.mythic-beasts.com +onza.mythic-beasts.com +sphinx.mythic-beasts.com +vs.mythic-beasts.com +x.mythic-beasts.com +yali.mythic-beasts.com +cust.retrosnub.co.uk + +// Nabu Casa : https://www.nabucasa.com +// Submitted by Paulus Schoutsen <infra@nabucasa.com> +ui.nabu.casa + +// Names.of.London : https://names.of.london/ +// Submitted by James Stevens <registry@names.of.london> or <james@jrcs.net> +pony.club +of.fashion +on.fashion +of.football +in.london +of.london +for.men +and.mom +for.mom +for.one +for.sale +of.work +to.work + +// NCTU.ME : https://nctu.me/ +// Submitted by Tocknicsu <admin@nctu.me> +nctu.me + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons <jessica@netlify.com> +netlify.app + +// Neustar Inc. +// Submitted by Trung Tran <Trung.Tran@neustar.biz> +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve <alan@ngrok.com> +ngrok.io + +// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ +// Submitted by Nicholas Ford <nick@nimbushosting.co.uk> +nh-serv.co.uk + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> +nfshost.com + +// Now-DNS : https://now-dns.com +// Submitted by Steve Russell <steve@now-dns.com> +dnsking.ch +mypi.co +n4t.co +001www.com +ddnslive.com +myiphost.com +forumz.info +16-b.it +32-b.it +64-b.it +soundcast.me +tcp4.me +dnsup.net +hicam.net +now-dns.net +ownip.net +vpndns.net +dynserv.org +now-dns.org +x443.pw +now-dns.top +ntdll.top +freeddns.us +crafting.xyz +zapto.xyz + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann <info@nsupdate.info> +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza <publicsuffixlist@noip.com> +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov <Nosov@nodeart.io> +stage.nodeart.io + +// Nodum B.V. : https://nodum.io/ +// Submitted by Wietse Wind <hello+publicsuffixlist@nodum.io> +nodum.co +nodum.io + +// Nucleos Inc. : https://nucleos.com +// Submitted by Piotr Zduniak <piotr@nucleos.com> +pcloud.host + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown <mattbrown@nyc.mn> +nyc.mn + +// NymNom : https://nymnom.com/ +// Submitted by NymNom <psl@nymnom.com> +nom.ae +nom.af +nom.ai +nom.al +nym.by +nom.bz +nym.bz +nom.cl +nym.ec +nom.gd +nom.ge +nom.gl +nym.gr +nom.gt +nym.gy +nym.hk +nom.hn +nym.ie +nom.im +nom.ke +nym.kz +nym.la +nym.lc +nom.li +nym.li +nym.lt +nym.lu +nom.lv +nym.me +nom.mk +nym.mn +nym.mx +nom.nu +nym.nz +nym.pe +nym.pt +nom.pw +nom.qa +nym.ro +nom.rs +nom.si +nym.sk +nom.st +nym.su +nym.sx +nom.tj +nym.tw +nom.ug +nom.uy +nom.vc +nom.vg + +// Observable, Inc. : https://observablehq.com +// Submitted by Mike Bostock <dns@observablehq.com> +static.observableusercontent.com + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson <andrew@ulterius.io> +cya.gg + +// OMG.LOL : <https://omg.lol> +// Submitted by Adam Newbold <adam@omg.lol> +omg.lol + +// Omnibond Systems, LLC. : https://www.omnibond.com +// Submitted by Cole Estep <cole@omnibond.com> +cloudycluster.net + +// OmniWe Limited: https://omniwe.com +// Submitted by Vicary Archangel <vicary@omniwe.com> +omniwe.site + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones <eddie@onefoldmedia.com> +nid.io + +// Open Social : https://www.getopensocial.com/ +// Submitted by Alexander Varwijk <security@getopensocial.com> +opensocial.site + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach <sven@opencraft.com> +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen <yngve@opera.com> +operaunite.com + +// Oursky Limited : https://skygear.io/ +// Submited by Skygear Developer <hello@skygear.io> +skygearapp.com + +// OutSystems +// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> +outsystemscloud.com + +// OwnProvider GmbH: http://www.ownprovider.com +// Submitted by Jan Moennich <jan.moennich@ownprovider.com> +ownprovider.com +own.pm + +// OwO : https://whats-th.is/ +// Submitted by Dean Sheather <dean@deansheather.com> +*.owo.codes + +// OX : http://www.ox.rs +// Submitted by Adam Grand <webmaster@mail.ox.rs> +ox.rs + +// oy.lc +// Submitted by Charly Coste <changaco@changaco.oy.lc> +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers <derek@pagefog.com> +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss <jason@pagefronthq.com> +pagefrontapp.com + +// PageXL : https://pagexl.com +// Submitted by Yann Guichard <yann@pagexl.com> +pagexl.com + +// pcarrier.ca Software Inc: https://pcarrier.ca/ +// Submitted by Pierre Carrier <pc@rrier.ca> +bar0.net +bar1.net +bar2.net +rdv.to + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina <gary@pantheon.io> +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung <steveleung@peplink.com> +mypep.link + +// Perspecta : https://perspecta.com/ +// Submitted by Kenneth Van Alstyne <kvanalstyne@perspecta.com> +perspecta.cloud + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com> +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur <nikola@platform.sh> +bc.platform.sh +ent.platform.sh +eu.platform.sh +us.platform.sh +*.platformsh.site + +// Platter: https://platter.dev +// Submitted by Patrick Flor <patrick@platter.dev> +platter-app.com +platter-app.dev +platterp.us + +// Plesk : https://www.plesk.com/ +// Submitted by Anton Akhtyamov <program-managers@plesk.com> +pdns.page +plesk.page +pleskns.com + +// Port53 : https://port53.io/ +// Submitted by Maximilian Schieder <maxi@zeug.co> +dyn53.io + +// Positive Codes Technology Company : http://co.bn/faq.html +// Submitted by Zulfais <pc@co.bn> +co.bn + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman <owner@prgmr.com> +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry <lendl@nic.at> +priv.at + +// privacytools.io : https://www.privacytools.io/ +// Submitted by Jonah Aragon <jonah@privacytools.io> +prvcy.page + +// Protocol Labs : https://protocol.ai/ +// Submitted by Michael Burns <noc@protocol.ai> +*.dweb.link + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier <admin@protonet.io> +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr> +chirurgiens-dentistes-en-france.fr +byen.site + +// pubtls.org: https://www.pubtls.org +// Submitted by Kor Nielsen <kor@pubtls.org> +pubtls.org + +// Qualifio : https://qualifio.com/ +// Submitted by Xavier De Cock <xdecock@gmail.com> +qualifioapp.com + +// QuickBackend: https://www.quickbackend.com +// Submitted by Dani Biro <dani@pymet.com> +qbuser.com + +// Redstar Consultants : https://www.redstarconsultants.com/ +// Submitted by Jons Slemmer <jons@redstarconsultants.com> +instantcloud.cn + +// Russian Academy of Sciences +// Submitted by Tech Support <support@rasnet.ru> +ras.ru + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QCX +// Submitted by Cassandra Beelen <cassandra@beelen.one> +qcx.io +*.sys.qcx.io + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang <nickchang@qnap.com> +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan <plinehan@quip.com> +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz <jonas@qutheory.io> +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev <kika@rackmaze.com> +rackmaze.com +rackmaze.net + +// Rakuten Games, Inc : https://dev.viberplay.io +// Submitted by Joshua Zhang <public-suffix@rgames.jp> +g.vbrplsbx.io + +// Rancher Labs, Inc : https://rancher.com +// Submitted by Vincent Fiduccia <domains@rancher.com> +*.on-k3s.io +*.on-rancher.cloud +*.on-rio.io + +// Read The Docs, Inc : https://www.readthedocs.org +// Submitted by David Fischer <team@readthedocs.org> +readthedocs.io + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer <tkramer@rhcloud.com> +rhcloud.com + +// Render : https://render.com +// Submitted by Anurag Goel <dev@render.com> +app.render.com +onrender.com + +// Repl.it : https://repl.it +// Submitted by Mason Clayton <mason@repl.it> +repl.co +repl.run + +// Resin.io : https://resin.io +// Submitted by Tim Perry <tim@resin.io> +resindevice.io +devices.resinstaging.io + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff <info@rethinkdb.com> +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price <jack@revitalised.co.uk> +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Rochester Institute of Technology : http://www.rit.edu/ +// Submitted by Jennifer Herting <jchits@rit.edu> +git-pages.rit.edu + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia <asheesh@sandstorm.io> +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick <nm@sbe.de> +logoip.de +logoip.com + +// schokokeks.org GbR : https://schokokeks.org/ +// Submitted by Hanno Böck <hanno@schokokeks.org> +schokokeks.net + +// Scottish Government: https://www.gov.scot +// Submitted by Martin Ellis <martin.ellis@gov.scot> +gov.scot + +// Scry Security : http://www.scrysec.com +// Submitted by Shante Adam <shante@skyhat.io> +scrysec.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders <erik.anders@securepoint.de> +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// Seidat : https://www.seidat.com +// Submitted by Artem Kondratev <accounts@seidat.com> +seidat.net + +// Senseering GmbH : https://www.senseering.de +// Submitted by Felix Mönckemeyer <f.moenckemeyer@senseering.de> +senseering.net + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh <support@drs.ua> +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez <adam@shiftcreate.com> +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers <alex@shopblocks.com> +myshopblocks.com + +// Shopit : https://www.shopitcommerce.com/ +// Submitted by Craig McMahon <craig@shopitcommerce.com> +shopitsite.com + +// shopware AG : https://shopware.com +// Submitted by Jens Küper <cloud@shopware.com> +shopware.store + +// Siemens Mobility GmbH +// Submitted by Oliver Graebner <security@mo-siemens.io> +mo-siemens.io + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine <saesupport@sinacloud.com> +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Siteleaf : https://www.siteleaf.com/ +// Submitted by Skylar Challand <support@siteleaf.com> +siteleaf.net + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam <shante@skyhat.io> +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// Small Technology Foundation : https://small-tech.org +// Submitted by Aral Balkan <aral@small-tech.org> +small-web.org + +// Stackhero : https://www.stackhero.io +// Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io> +stackhero-network.com + +// staticland : https://static.land +// Submitted by Seth Vincent <sethvincent@gmail.com> +static.land +dev.static.land +sites.static.land + +// Sony Interactive Entertainment LLC : https://sie.com/ +// Submitted by David Coles <david.coles@sony.com> +playstation-cloud.com + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com> +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan <spacekit.io@gmail.com> +spacekit.io + +// SpeedPartner GmbH: https://www.speedpartner.de/ +// Submitted by Stefan Neufeind <info@speedpartner.de> +customer.speedpartner.de + +// Standard Library : https://stdlib.com +// Submitted by Jacob Lee <jacob@stdlib.com> +api.stdlib.com + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins <hostmaster@storj.io> +storj.farm + +// Studenten Net Twente : http://www.snt.utwente.nl/ +// Submitted by Silke Hofstra <syscom@snt.utwente.nl> +utwente.io + +// Student-Run Computing Facility : https://www.srcf.net/ +// Submitted by Edwin Balani <sysadmins@srcf.net> +soc.srcf.net +user.srcf.net + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller <dm@sub6.com> +temp-dns.com + +// Swisscom Application Cloud: https://developer.swisscom.com +// Submitted by Matthias.Winzeler <matthias.winzeler@swisscom.com> +applicationcloud.io +scapp.io + +// Symfony, SAS : https://symfony.com/ +// Submitted by Fabien Potencier <fabien@symfony.com> +*.s5y.io +*.sensiosite.cloud + +// Syncloud : https://syncloud.org +// Submitted by Boris Rybalkin <syncloud@syncloud.it> +syncloud.it + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng <ronyweng@synology.com> +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to +direct.quickconnect.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke <dev-server@taifun-software.de> +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// Teckids e.V. : https://www.teckids.org +// Submitted by Dominik George <dominik.george@teckids.org> +edugit.org + +// Telebit : https://telebit.cloud +// Submitted by AJ ONeal <aj@telebit.cloud> +telebit.app +telebit.io +*.telebit.xyz + +// The Gwiddle Foundation : https://gwiddlefoundation.org.uk +// Submitted by Joshua Bayfield <joshua.bayfield@gwiddlefoundation.org.uk> +gwiddle.co.uk + +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden <adi@thingdust.com> +thingdustdata.com +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io +*.firenet.ch +*.svc.firenet.ch + +// Tlon.io : https://tlon.io +// Submitted by Mark Staarink <mark@tlon.io> +arvo.network +azimuth.network + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward <dward@townnews.com> +bloxcms.com +townnews-staging.com + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll <phillipp.roell@trafficplex.de> +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : https://www.transip.nl +// Submitted by Rory Breuk <rbreuk@transip.nl> +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org> +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support <support@two-dns.de> +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner <mwerner@jonaspasche.com> +uber.space +*.uberspace.de + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry <hostmaster@udr.hk.com> +hk.com +hk.org +ltd.hk +inc.hk + +// United Gameserver GmbH : https://united-gameserver.de +// Submitted by Stefan Schwarz <sysadm@united-gameserver.de> +virtualuser.de +virtual-user.de + +// urown.net : https://urown.net +// Submitted by Hostmaster <hostmaster@urown.net> +urown.cloud +dnsupdate.info + +// .US +// Submitted by Ed Moore <Ed.Moore@lib.de.us> +lib.de.us + +// VeryPositive SIA : http://very.lv +// Submitted by Danko Aleksejevs <danko@very.lv> +2038.io + +// Vercel, Inc : https://vercel.com/ +// Submitted by Connor Davis <security@vercel.com> +vercel.app +vercel.dev +now.sh + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel <hostmaster@viprinet.com> +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN <hostmaster@v-info.info> +v-info.info + +// Voorloper.com: https://voorloper.com +// Submitted by Nathan van Bakel <info@voorloper.com> +voorloper.cloud + +// Voxel.sh DNS : https://voxel.sh/dns/ +// Submitted by Mia Rehlinger <dns@voxel.sh> +neko.am +nyaa.am +be.ax +cat.ax +es.ax +eu.ax +gg.ax +mc.ax +us.ax +xy.ax +nl.ci +xx.gl +app.gp +blog.gt +de.gt +to.gt +be.gy +cc.hn +blog.kg +io.kg +jp.kg +tv.kg +uk.kg +us.kg +de.ls +at.md +de.md +jp.md +to.md +uwu.nu +indie.porn +vxl.sh +ch.tc +me.tc +we.tc +nyan.to +at.vg +blog.vu +dev.vu +me.vu + +// V.UA Domain Administrator : https://domain.v.ua/ +// Submitted by Serhii Rostilo <sergey@rostilo.kiev.ua> +v.ua + +// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com +// Submitted by Masayuki Note <masa@blade.wafflecell.com> +wafflecell.com + +// WebHare bv: https://www.webhare.com/ +// Submitted by Arnold Hendriks <info@webhare.com> +*.webhare.dev + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente <security@wedeploy.com> +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin <jungseok.jin@wdc.com> +remotewd.com + +// WIARD Enterprises : https://wiardweb.com +// Submitted by Kidd Hustle <kiddhustle@wiardweb.com> +pages.wiardweb.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Arturo Borrero Gonzalez <aborrero@wikimedia.org> +wmflabs.org +toolforge.org +wmcloud.org + +// WISP : https://wisp.gg +// Submitted by Stepan Fedotov <stepan@wisp.gg> +panel.gg +daemon.panel.gg + +// WoltLab GmbH : https://www.woltlab.com +// Submitted by Tim Düsterhus <security@woltlab.cloud> +myforum.community +community-pro.de +diskussionsbereich.de +community-pro.net +meinforum.net + +// www.com.vc : http://www.com.vc +// Submitted by Li Hui <lihui@sinopub.com> +cn.vu + +// XenonCloud GbR: https://xenoncloud.net +// Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net> +half.host + +// XnBay Technology : http://www.xnbay.com/ +// Submitted by XnBay Developer <developer.xncloud@gmail.com> +xnbay.com +u2.xnbay.com +u2-local.xnbay.com + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net> +cistron.nl +demon.nl +xs4all.space + +// Yandex.Cloud LLC: https://cloud.yandex.com +// Submitted by Alexander Lodin <security+psl@yandex-team.ru> +yandexcloud.net +storage.yandexcloud.net +website.yandexcloud.net + +// YesCourse Pty Ltd : https://yescourse.com +// Submitted by Atul Bhouraskar <atul@yescourse.com> +official.academy + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera <stefano@yola.com> +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk <mitch@yombo.net> +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// Yunohost : https://yunohost.org +// Submitted by Valentin Grimaud <security@yunohost.org> +nohost.me +noho.st + +// ZaNiC : http://www.za.net/ +// Submitted by registry <hostmaster@nic.za.net> +za.net +za.org + +// Zine EOOD : https://zine.bg/ +// Submitted by Martin Angelov <martin@zine.bg> +bss.design + +// Zitcom A/S : https://www.zitcom.dk +// Submitted by Emil Stahl <esp@zitcom.dk> +basicserver.io +virtualserver.io +enterprisecloud.nu + +// Mintere : https://mintere.com/ +// Submitted by Ben Aubin <security@mintere.com> +mintere.site + +// WP Engine : https://wpengine.com/ +// Submitted by Michael Smith <michael.smith@wpengine.com> +wpenginepowered.com + +// Impertrix Solutions : <https://impertrixcdn.com> +// Submitted by Zhixiang Zhao <csuite@impertrix.com> +impertrixcdn.com +impertrix.com +// ===END PRIVATE DOMAINS=== diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix.rb new file mode 100644 index 000000000000..01f880e3a865 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix.rb @@ -0,0 +1,179 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2020 Simone Carletti <weppos@weppos.net> + +require_relative "public_suffix/domain" +require_relative "public_suffix/version" +require_relative "public_suffix/errors" +require_relative "public_suffix/rule" +require_relative "public_suffix/list" + +# PublicSuffix is a Ruby domain name parser based on the Public Suffix List. +# +# The [Public Suffix List](https://publicsuffix.org) is a cross-vendor initiative +# to provide an accurate list of domain name suffixes. +# +# The Public Suffix List is an initiative of the Mozilla Project, +# but is maintained as a community resource. It is available for use in any software, +# but was originally created to meet the needs of browser manufacturers. +module PublicSuffix + + DOT = "." + BANG = "!" + STAR = "*" + + # Parses +name+ and returns the {PublicSuffix::Domain} instance. + # + # @example Parse a valid domain + # PublicSuffix.parse("google.com") + # # => #<PublicSuffix::Domain:0x007fec2e51e588 @sld="google", @tld="com", @trd=nil> + # + # @example Parse a valid subdomain + # PublicSuffix.parse("www.google.com") + # # => #<PublicSuffix::Domain:0x007fec276d4cf8 @sld="google", @tld="com", @trd="www"> + # + # @example Parse a fully qualified domain + # PublicSuffix.parse("google.com.") + # # => #<PublicSuffix::Domain:0x007fec257caf38 @sld="google", @tld="com", @trd=nil> + # + # @example Parse a fully qualified domain (subdomain) + # PublicSuffix.parse("www.google.com.") + # # => #<PublicSuffix::Domain:0x007fec27b6bca8 @sld="google", @tld="com", @trd="www"> + # + # @example Parse an invalid (unlisted) domain + # PublicSuffix.parse("x.yz") + # # => #<PublicSuffix::Domain:0x007fec2f49bec0 @sld="x", @tld="yz", @trd=nil> + # + # @example Parse an invalid (unlisted) domain with strict checking (without applying the default * rule) + # PublicSuffix.parse("x.yz", default_rule: nil) + # # => PublicSuffix::DomainInvalid: `x.yz` is not a valid domain + # + # @example Parse an URL (not supported, only domains) + # PublicSuffix.parse("http://www.google.com") + # # => PublicSuffix::DomainInvalid: http://www.google.com is not expected to contain a scheme + # + # + # @param [String, #to_s] name The domain name or fully qualified domain name to parse. + # @param [PublicSuffix::List] list The rule list to search, defaults to the default {PublicSuffix::List} + # @param [Boolean] ignore_private + # @return [PublicSuffix::Domain] + # + # @raise [PublicSuffix::DomainInvalid] + # If domain is not a valid domain. + # @raise [PublicSuffix::DomainNotAllowed] + # If a rule for +domain+ is found, but the rule doesn't allow +domain+. + def self.parse(name, list: List.default, default_rule: list.default_rule, ignore_private: false) + what = normalize(name) + raise what if what.is_a?(DomainInvalid) + + rule = list.find(what, default: default_rule, ignore_private: ignore_private) + + # rubocop:disable Style/IfUnlessModifier + if rule.nil? + raise DomainInvalid, "`#{what}` is not a valid domain" + end + if rule.decompose(what).last.nil? + raise DomainNotAllowed, "`#{what}` is not allowed according to Registry policy" + end + + # rubocop:enable Style/IfUnlessModifier + + decompose(what, rule) + end + + # Checks whether +domain+ is assigned and allowed, without actually parsing it. + # + # This method doesn't care whether domain is a domain or subdomain. + # The validation is performed using the default {PublicSuffix::List}. + # + # @example Validate a valid domain + # PublicSuffix.valid?("example.com") + # # => true + # + # @example Validate a valid subdomain + # PublicSuffix.valid?("www.example.com") + # # => true + # + # @example Validate a not-listed domain + # PublicSuffix.valid?("example.tldnotlisted") + # # => true + # + # @example Validate a not-listed domain with strict checking (without applying the default * rule) + # PublicSuffix.valid?("example.tldnotlisted") + # # => true + # PublicSuffix.valid?("example.tldnotlisted", default_rule: nil) + # # => false + # + # @example Validate a fully qualified domain + # PublicSuffix.valid?("google.com.") + # # => true + # PublicSuffix.valid?("www.google.com.") + # # => true + # + # @example Check an URL (which is not a valid domain) + # PublicSuffix.valid?("http://www.example.com") + # # => false + # + # + # @param [String, #to_s] name The domain name or fully qualified domain name to validate. + # @param [Boolean] ignore_private + # @return [Boolean] + def self.valid?(name, list: List.default, default_rule: list.default_rule, ignore_private: false) + what = normalize(name) + return false if what.is_a?(DomainInvalid) + + rule = list.find(what, default: default_rule, ignore_private: ignore_private) + + !rule.nil? && !rule.decompose(what).last.nil? + end + + # Attempt to parse the name and returns the domain, if valid. + # + # This method doesn't raise. Instead, it returns nil if the domain is not valid for whatever reason. + # + # @param [String, #to_s] name The domain name or fully qualified domain name to parse. + # @param [PublicSuffix::List] list The rule list to search, defaults to the default {PublicSuffix::List} + # @param [Boolean] ignore_private + # @return [String] + def self.domain(name, **options) + parse(name, **options).domain + rescue PublicSuffix::Error + nil + end + + + # private + + def self.decompose(name, rule) + left, right = rule.decompose(name) + + parts = left.split(DOT) + # If we have 0 parts left, there is just a tld and no domain or subdomain + # If we have 1 part left, there is just a tld, domain and not subdomain + # If we have 2 parts left, the last part is the domain, the other parts (combined) are the subdomain + tld = right + sld = parts.empty? ? nil : parts.pop + trd = parts.empty? ? nil : parts.join(DOT) + + Domain.new(tld, sld, trd) + end + + # Pretend we know how to deal with user input. + def self.normalize(name) + name = name.to_s.dup + name.strip! + name.chomp!(DOT) + name.downcase! + + return DomainInvalid.new("Name is blank") if name.empty? + return DomainInvalid.new("Name starts with a dot") if name.start_with?(DOT) + return DomainInvalid.new("%s is not expected to contain a scheme" % name) if name.include?("://") + + name + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/domain.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/domain.rb new file mode 100644 index 000000000000..3d65eac7ea40 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/domain.rb @@ -0,0 +1,235 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2020 Simone Carletti <weppos@weppos.net> + +module PublicSuffix + + # Domain represents a domain name, composed by a TLD, SLD and TRD. + class Domain + + # Splits a string into the labels, that is the dot-separated parts. + # + # The input is not validated, but it is assumed to be a valid domain name. + # + # @example + # + # name_to_labels('example.com') + # # => ['example', 'com'] + # + # name_to_labels('example.co.uk') + # # => ['example', 'co', 'uk'] + # + # @param name [String, #to_s] The domain name to split. + # @return [Array<String>] + def self.name_to_labels(name) + name.to_s.split(DOT) + end + + + attr_reader :tld, :sld, :trd + + # Creates and returns a new {PublicSuffix::Domain} instance. + # + # @overload initialize(tld) + # Initializes with a +tld+. + # @param [String] tld The TLD (extension) + # @overload initialize(tld, sld) + # Initializes with a +tld+ and +sld+. + # @param [String] tld The TLD (extension) + # @param [String] sld The TRD (domain) + # @overload initialize(tld, sld, trd) + # Initializes with a +tld+, +sld+ and +trd+. + # @param [String] tld The TLD (extension) + # @param [String] sld The SLD (domain) + # @param [String] trd The TRD (subdomain) + # + # @yield [self] Yields on self. + # @yieldparam [PublicSuffix::Domain] self The newly creates instance + # + # @example Initialize with a TLD + # PublicSuffix::Domain.new("com") + # # => #<PublicSuffix::Domain @tld="com"> + # + # @example Initialize with a TLD and SLD + # PublicSuffix::Domain.new("com", "example") + # # => #<PublicSuffix::Domain @tld="com", @trd=nil> + # + # @example Initialize with a TLD, SLD and TRD + # PublicSuffix::Domain.new("com", "example", "wwww") + # # => #<PublicSuffix::Domain @tld="com", @trd=nil, @sld="example"> + # + def initialize(*args) + @tld, @sld, @trd = args + yield(self) if block_given? + end + + # Returns a string representation of this object. + # + # @return [String] + def to_s + name + end + + # Returns an array containing the domain parts. + # + # @return [Array<String, nil>] + # + # @example + # + # PublicSuffix::Domain.new("google.com").to_a + # # => [nil, "google", "com"] + # + # PublicSuffix::Domain.new("www.google.com").to_a + # # => [nil, "google", "com"] + # + def to_a + [@trd, @sld, @tld] + end + + # Returns the full domain name. + # + # @return [String] + # + # @example Gets the domain name of a domain + # PublicSuffix::Domain.new("com", "google").name + # # => "google.com" + # + # @example Gets the domain name of a subdomain + # PublicSuffix::Domain.new("com", "google", "www").name + # # => "www.google.com" + # + def name + [@trd, @sld, @tld].compact.join(DOT) + end + + # Returns a domain-like representation of this object + # if the object is a {#domain?}, <tt>nil</tt> otherwise. + # + # PublicSuffix::Domain.new("com").domain + # # => nil + # + # PublicSuffix::Domain.new("com", "google").domain + # # => "google.com" + # + # PublicSuffix::Domain.new("com", "google", "www").domain + # # => "www.google.com" + # + # This method doesn't validate the input. It handles the domain + # as a valid domain name and simply applies the necessary transformations. + # + # This method returns a FQD, not just the domain part. + # To get the domain part, use <tt>#sld</tt> (aka second level domain). + # + # PublicSuffix::Domain.new("com", "google", "www").domain + # # => "google.com" + # + # PublicSuffix::Domain.new("com", "google", "www").sld + # # => "google" + # + # @see #domain? + # @see #subdomain + # + # @return [String] + def domain + [@sld, @tld].join(DOT) if domain? + end + + # Returns a subdomain-like representation of this object + # if the object is a {#subdomain?}, <tt>nil</tt> otherwise. + # + # PublicSuffix::Domain.new("com").subdomain + # # => nil + # + # PublicSuffix::Domain.new("com", "google").subdomain + # # => nil + # + # PublicSuffix::Domain.new("com", "google", "www").subdomain + # # => "www.google.com" + # + # This method doesn't validate the input. It handles the domain + # as a valid domain name and simply applies the necessary transformations. + # + # This method returns a FQD, not just the subdomain part. + # To get the subdomain part, use <tt>#trd</tt> (aka third level domain). + # + # PublicSuffix::Domain.new("com", "google", "www").subdomain + # # => "www.google.com" + # + # PublicSuffix::Domain.new("com", "google", "www").trd + # # => "www" + # + # @see #subdomain? + # @see #domain + # + # @return [String] + def subdomain + [@trd, @sld, @tld].join(DOT) if subdomain? + end + + # Checks whether <tt>self</tt> looks like a domain. + # + # This method doesn't actually validate the domain. + # It only checks whether the instance contains + # a value for the {#tld} and {#sld} attributes. + # + # @example + # + # PublicSuffix::Domain.new("com").domain? + # # => false + # + # PublicSuffix::Domain.new("com", "google").domain? + # # => true + # + # PublicSuffix::Domain.new("com", "google", "www").domain? + # # => true + # + # # This is an invalid domain, but returns true + # # because this method doesn't validate the content. + # PublicSuffix::Domain.new("com", nil).domain? + # # => true + # + # @see #subdomain? + # + # @return [Boolean] + def domain? + !(@tld.nil? || @sld.nil?) + end + + # Checks whether <tt>self</tt> looks like a subdomain. + # + # This method doesn't actually validate the subdomain. + # It only checks whether the instance contains + # a value for the {#tld}, {#sld} and {#trd} attributes. + # If you also want to validate the domain, + # use {#valid_subdomain?} instead. + # + # @example + # + # PublicSuffix::Domain.new("com").subdomain? + # # => false + # + # PublicSuffix::Domain.new("com", "google").subdomain? + # # => false + # + # PublicSuffix::Domain.new("com", "google", "www").subdomain? + # # => true + # + # # This is an invalid domain, but returns true + # # because this method doesn't validate the content. + # PublicSuffix::Domain.new("com", "example", nil).subdomain? + # # => true + # + # @see #domain? + # + # @return [Boolean] + def subdomain? + !(@tld.nil? || @sld.nil? || @trd.nil?) + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/errors.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/errors.rb new file mode 100644 index 000000000000..2d5798def6a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/errors.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2020 Simone Carletti <weppos@weppos.net> + +module PublicSuffix + + class Error < StandardError + end + + # Raised when trying to parse an invalid name. + # A name is considered invalid when no rule is found in the definition list. + # + # @example + # + # PublicSuffix.parse("nic.test") + # # => PublicSuffix::DomainInvalid + # + # PublicSuffix.parse("http://www.nic.it") + # # => PublicSuffix::DomainInvalid + # + class DomainInvalid < Error + end + + # Raised when trying to parse a name that matches a suffix. + # + # @example + # + # PublicSuffix.parse("nic.do") + # # => PublicSuffix::DomainNotAllowed + # + # PublicSuffix.parse("www.nic.do") + # # => PublicSuffix::Domain + # + class DomainNotAllowed < DomainInvalid + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/list.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/list.rb new file mode 100644 index 000000000000..321b59a79f87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/list.rb @@ -0,0 +1,247 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2020 Simone Carletti <weppos@weppos.net> + +module PublicSuffix + + # A {PublicSuffix::List} is a collection of one + # or more {PublicSuffix::Rule}. + # + # Given a {PublicSuffix::List}, + # you can add or remove {PublicSuffix::Rule}, + # iterate all items in the list or search for the first rule + # which matches a specific domain name. + # + # # Create a new list + # list = PublicSuffix::List.new + # + # # Push two rules to the list + # list << PublicSuffix::Rule.factory("it") + # list << PublicSuffix::Rule.factory("com") + # + # # Get the size of the list + # list.size + # # => 2 + # + # # Search for the rule matching given domain + # list.find("example.com") + # # => #<PublicSuffix::Rule::Normal> + # list.find("example.org") + # # => nil + # + # You can create as many {PublicSuffix::List} you want. + # The {PublicSuffix::List.default} rule list is used + # to tokenize and validate a domain. + # + class List + + DEFAULT_LIST_PATH = File.expand_path("../../data/list.txt", __dir__) + + # Gets the default rule list. + # + # Initializes a new {PublicSuffix::List} parsing the content + # of {PublicSuffix::List.default_list_content}, if required. + # + # @return [PublicSuffix::List] + def self.default(**options) + @default ||= parse(File.read(DEFAULT_LIST_PATH), **options) + end + + # Sets the default rule list to +value+. + # + # @param value [PublicSuffix::List] the new list + # @return [PublicSuffix::List] + def self.default=(value) + @default = value + end + + # Parse given +input+ treating the content as Public Suffix List. + # + # See http://publicsuffix.org/format/ for more details about input format. + # + # @param string [#each_line] the list to parse + # @param private_domains [Boolean] whether to ignore the private domains section + # @return [PublicSuffix::List] + def self.parse(input, private_domains: true) + comment_token = "//" + private_token = "===BEGIN PRIVATE DOMAINS===" + section = nil # 1 == ICANN, 2 == PRIVATE + + new do |list| + input.each_line do |line| + line.strip! + case # rubocop:disable Style/EmptyCaseCondition + + # skip blank lines + when line.empty? + next + + # include private domains or stop scanner + when line.include?(private_token) + break if !private_domains + + section = 2 + + # skip comments + when line.start_with?(comment_token) + next + + else + list.add(Rule.factory(line, private: section == 2)) + + end + end + end + end + + + # Initializes an empty {PublicSuffix::List}. + # + # @yield [self] Yields on self. + # @yieldparam [PublicSuffix::List] self The newly created instance. + def initialize + @rules = {} + yield(self) if block_given? + end + + + # Checks whether two lists are equal. + # + # List <tt>one</tt> is equal to <tt>two</tt>, if <tt>two</tt> is an instance of + # {PublicSuffix::List} and each +PublicSuffix::Rule::*+ + # in list <tt>one</tt> is available in list <tt>two</tt>, in the same order. + # + # @param other [PublicSuffix::List] the List to compare + # @return [Boolean] + def ==(other) + return false unless other.is_a?(List) + + equal?(other) || @rules == other.rules + end + alias eql? == + + # Iterates each rule in the list. + def each(&block) + Enumerator.new do |y| + @rules.each do |key, node| + y << entry_to_rule(node, key) + end + end.each(&block) + end + + + # Adds the given object to the list and optionally refreshes the rule index. + # + # @param rule [PublicSuffix::Rule::*] the rule to add to the list + # @return [self] + def add(rule) + @rules[rule.value] = rule_to_entry(rule) + self + end + alias << add + + # Gets the number of rules in the list. + # + # @return [Integer] + def size + @rules.size + end + + # Checks whether the list is empty. + # + # @return [Boolean] + def empty? + @rules.empty? + end + + # Removes all rules. + # + # @return [self] + def clear + @rules.clear + self + end + + # Finds and returns the rule corresponding to the longest public suffix for the hostname. + # + # @param name [#to_s] the hostname + # @param default [PublicSuffix::Rule::*] the default rule to return in case no rule matches + # @return [PublicSuffix::Rule::*] + def find(name, default: default_rule, **options) + rule = select(name, **options).inject do |l, r| + return r if r.class == Rule::Exception + + l.length > r.length ? l : r + end + rule || default + end + + # Selects all the rules matching given hostame. + # + # If `ignore_private` is set to true, the algorithm will skip the rules that are flagged as + # private domain. Note that the rules will still be part of the loop. + # If you frequently need to access lists ignoring the private domains, + # you should create a list that doesn't include these domains setting the + # `private_domains: false` option when calling {.parse}. + # + # Note that this method is currently private, as you should not rely on it. Instead, + # the public interface is {#find}. The current internal algorithm allows to return all + # matching rules, but different data structures may not be able to do it, and instead would + # return only the match. For this reason, you should rely on {#find}. + # + # @param name [#to_s] the hostname + # @param ignore_private [Boolean] + # @return [Array<PublicSuffix::Rule::*>] + def select(name, ignore_private: false) + name = name.to_s + + parts = name.split(DOT).reverse! + index = 0 + query = parts[index] + rules = [] + + loop do + match = @rules[query] + rules << entry_to_rule(match, query) if !match.nil? && (ignore_private == false || match.private == false) + + index += 1 + break if index >= parts.size + + query = parts[index] + DOT + query + end + + rules + end + private :select + + # Gets the default rule. + # + # @see PublicSuffix::Rule.default_rule + # + # @return [PublicSuffix::Rule::*] + def default_rule + PublicSuffix::Rule.default + end + + + protected + + attr_reader :rules + + + private + + def entry_to_rule(entry, value) + entry.type.new(value: value, length: entry.length, private: entry.private) + end + + def rule_to_entry(rule) + Rule::Entry.new(rule.class, rule.length, rule.private) + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/rule.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/rule.rb new file mode 100644 index 000000000000..d4c32ca1794b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/rule.rb @@ -0,0 +1,350 @@ +# frozen_string_literal: true + +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2020 Simone Carletti <weppos@weppos.net> + +module PublicSuffix + + # A Rule is a special object which holds a single definition + # of the Public Suffix List. + # + # There are 3 types of rules, each one represented by a specific + # subclass within the +PublicSuffix::Rule+ namespace. + # + # To create a new Rule, use the {PublicSuffix::Rule#factory} method. + # + # PublicSuffix::Rule.factory("ar") + # # => #<PublicSuffix::Rule::Normal> + # + module Rule + + # @api internal + Entry = Struct.new(:type, :length, :private) # rubocop:disable Lint/StructNewOverride + + # = Abstract rule class + # + # This represent the base class for a Rule definition + # in the {Public Suffix List}[https://publicsuffix.org]. + # + # This is intended to be an Abstract class + # and you shouldn't create a direct instance. The only purpose + # of this class is to expose a common interface + # for all the available subclasses. + # + # * {PublicSuffix::Rule::Normal} + # * {PublicSuffix::Rule::Exception} + # * {PublicSuffix::Rule::Wildcard} + # + # ## Properties + # + # A rule is composed by 4 properties: + # + # value - A normalized version of the rule name. + # The normalization process depends on rule tpe. + # + # Here's an example + # + # PublicSuffix::Rule.factory("*.google.com") + # #<PublicSuffix::Rule::Wildcard:0x1015c14b0 + # @value="google.com" + # > + # + # ## Rule Creation + # + # The best way to create a new rule is passing the rule name + # to the <tt>PublicSuffix::Rule.factory</tt> method. + # + # PublicSuffix::Rule.factory("com") + # # => PublicSuffix::Rule::Normal + # + # PublicSuffix::Rule.factory("*.com") + # # => PublicSuffix::Rule::Wildcard + # + # This method will detect the rule type and create an instance + # from the proper rule class. + # + # ## Rule Usage + # + # A rule describes the composition of a domain name and explains how to tokenize + # the name into tld, sld and trd. + # + # To use a rule, you first need to be sure the name you want to tokenize + # can be handled by the current rule. + # You can use the <tt>#match?</tt> method. + # + # rule = PublicSuffix::Rule.factory("com") + # + # rule.match?("google.com") + # # => true + # + # rule.match?("google.com") + # # => false + # + # Rule order is significant. A name can match more than one rule. + # See the {Public Suffix Documentation}[http://publicsuffix.org/format/] + # to learn more about rule priority. + # + # When you have the right rule, you can use it to tokenize the domain name. + # + # rule = PublicSuffix::Rule.factory("com") + # + # rule.decompose("google.com") + # # => ["google", "com"] + # + # rule.decompose("www.google.com") + # # => ["www.google", "com"] + # + # @abstract + # + class Base + + # @return [String] the rule definition + attr_reader :value + + # @return [String] the length of the rule + attr_reader :length + + # @return [Boolean] true if the rule is a private domain + attr_reader :private + + + # Initializes a new rule from the content. + # + # @param content [String] the content of the rule + # @param private [Boolean] + def self.build(content, private: false) + new(value: content, private: private) + end + + # Initializes a new rule. + # + # @param value [String] + # @param private [Boolean] + def initialize(value:, length: nil, private: false) + @value = value.to_s + @length = length || @value.count(DOT) + 1 + @private = private + end + + # Checks whether this rule is equal to <tt>other</tt>. + # + # @param [PublicSuffix::Rule::*] other The rule to compare + # @return [Boolean] + # Returns true if this rule and other are instances of the same class + # and has the same value, false otherwise. + def ==(other) + equal?(other) || (self.class == other.class && value == other.value) + end + alias eql? == + + # Checks if this rule matches +name+. + # + # A domain name is said to match a rule if and only if + # all of the following conditions are met: + # + # - When the domain and rule are split into corresponding labels, + # that the domain contains as many or more labels than the rule. + # - Beginning with the right-most labels of both the domain and the rule, + # and continuing for all labels in the rule, one finds that for every pair, + # either they are identical, or that the label from the rule is "*". + # + # @see https://publicsuffix.org/list/ + # + # @example + # PublicSuffix::Rule.factory("com").match?("example.com") + # # => true + # PublicSuffix::Rule.factory("com").match?("example.net") + # # => false + # + # @param name [String] the domain name to check + # @return [Boolean] + def match?(name) + # Note: it works because of the assumption there are no + # rules like foo.*.com. If the assumption is incorrect, + # we need to properly walk the input and skip parts according + # to wildcard component. + diff = name.chomp(value) + diff.empty? || diff.end_with?(DOT) + end + + # @abstract + def parts + raise NotImplementedError + end + + # @abstract + # @param [String, #to_s] name The domain name to decompose + # @return [Array<String, nil>] + def decompose(*) + raise NotImplementedError + end + + end + + # Normal represents a standard rule (e.g. com). + class Normal < Base + + # Gets the original rule definition. + # + # @return [String] The rule definition. + def rule + value + end + + # Decomposes the domain name according to rule properties. + # + # @param [String, #to_s] name The domain name to decompose + # @return [Array<String>] The array with [trd + sld, tld]. + def decompose(domain) + suffix = parts.join('\.') + matches = domain.to_s.match(/^(.*)\.(#{suffix})$/) + matches ? matches[1..2] : [nil, nil] + end + + # dot-split rule value and returns all rule parts + # in the order they appear in the value. + # + # @return [Array<String>] + def parts + @value.split(DOT) + end + + end + + # Wildcard represents a wildcard rule (e.g. *.co.uk). + class Wildcard < Base + + # Initializes a new rule from the content. + # + # @param content [String] the content of the rule + # @param private [Boolean] + def self.build(content, private: false) + new(value: content.to_s[2..-1], private: private) + end + + # Initializes a new rule. + # + # @param value [String] + # @param private [Boolean] + def initialize(value:, length: nil, private: false) + super(value: value, length: length, private: private) + length or @length += 1 # * counts as 1 + end + + # Gets the original rule definition. + # + # @return [String] The rule definition. + def rule + value == "" ? STAR : STAR + DOT + value + end + + # Decomposes the domain name according to rule properties. + # + # @param [String, #to_s] name The domain name to decompose + # @return [Array<String>] The array with [trd + sld, tld]. + def decompose(domain) + suffix = ([".*?"] + parts).join('\.') + matches = domain.to_s.match(/^(.*)\.(#{suffix})$/) + matches ? matches[1..2] : [nil, nil] + end + + # dot-split rule value and returns all rule parts + # in the order they appear in the value. + # + # @return [Array<String>] + def parts + @value.split(DOT) + end + + end + + # Exception represents an exception rule (e.g. !parliament.uk). + class Exception < Base + + # Initializes a new rule from the content. + # + # @param content [String] the content of the rule + # @param private [Boolean] + def self.build(content, private: false) + new(value: content.to_s[1..-1], private: private) + end + + # Gets the original rule definition. + # + # @return [String] The rule definition. + def rule + BANG + value + end + + # Decomposes the domain name according to rule properties. + # + # @param [String, #to_s] name The domain name to decompose + # @return [Array<String>] The array with [trd + sld, tld]. + def decompose(domain) + suffix = parts.join('\.') + matches = domain.to_s.match(/^(.*)\.(#{suffix})$/) + matches ? matches[1..2] : [nil, nil] + end + + # dot-split rule value and returns all rule parts + # in the order they appear in the value. + # The leftmost label is not considered a label. + # + # See http://publicsuffix.org/format/: + # If the prevailing rule is a exception rule, + # modify it by removing the leftmost label. + # + # @return [Array<String>] + def parts + @value.split(DOT)[1..-1] + end + + end + + + # Takes the +name+ of the rule, detects the specific rule class + # and creates a new instance of that class. + # The +name+ becomes the rule +value+. + # + # @example Creates a Normal rule + # PublicSuffix::Rule.factory("ar") + # # => #<PublicSuffix::Rule::Normal> + # + # @example Creates a Wildcard rule + # PublicSuffix::Rule.factory("*.ar") + # # => #<PublicSuffix::Rule::Wildcard> + # + # @example Creates an Exception rule + # PublicSuffix::Rule.factory("!congresodelalengua3.ar") + # # => #<PublicSuffix::Rule::Exception> + # + # @param [String] content The rule content. + # @return [PublicSuffix::Rule::*] A rule instance. + def self.factory(content, private: false) + case content.to_s[0, 1] + when STAR + Wildcard + when BANG + Exception + else + Normal + end.build(content, private: private) + end + + # The default rule to use if no rule match. + # + # The default rule is "*". From https://publicsuffix.org/list/: + # + # > If no rules match, the prevailing rule is "*". + # + # @return [PublicSuffix::Rule::Wildcard] The default rule. + def self.default + factory(STAR) + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/version.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/version.rb new file mode 100644 index 000000000000..c9f93f10f5ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/version.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +# +# = Public Suffix +# +# Domain name parser based on the Public Suffix List. +# +# Copyright (c) 2009-2020 Simone Carletti <weppos@weppos.net> + +module PublicSuffix + # The current library version. + VERSION = "4.0.6" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/public_suffix.gemspec b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/public_suffix.gemspec new file mode 100644 index 000000000000..ae552fc906fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/public_suffix.gemspec @@ -0,0 +1,29 @@ +# -*- encoding: utf-8 -*- +$LOAD_PATH.push File.expand_path("../lib", __FILE__) +require "public_suffix/version" + +Gem::Specification.new do |s| + s.name = "public_suffix" + s.version = PublicSuffix::VERSION + s.authors = ["Simone Carletti"] + s.email = ["weppos@weppos.net"] + s.homepage = "https://simonecarletti.com/code/publicsuffix-ruby" + s.summary = "Domain name parser based on the Public Suffix List." + s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains." + s.licenses = ["MIT"] + + s.metadata = { + "bug_tracker_uri" => "https://github.com/weppos/publicsuffix-ruby/issues", + "changelog_uri" => "https://github.com/weppos/publicsuffix-ruby/blob/master/CHANGELOG.md", + "documentation_uri" => "https://rubydoc.info/gems/#{s.name}/#{s.version}", + "homepage_uri" => s.homepage, + "source_code_uri" => "https://github.com/weppos/publicsuffix-ruby/tree/v#{s.version}", + } + + s.required_ruby_version = ">= 2.3" + + s.require_paths = ["lib"] + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.extra_rdoc_files = %w( LICENSE.txt ) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/.empty b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/.empty new file mode 100644 index 000000000000..e3220151c771 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/.empty @@ -0,0 +1,2 @@ +# This is an empty file I use to force a non-empty commit when I only need to store notes +.. \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/acceptance_test.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/acceptance_test.rb new file mode 100644 index 000000000000..371bfe1331af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/acceptance_test.rb @@ -0,0 +1,131 @@ +# frozen_string_literal: true + +require "test_helper" + +class AcceptanceTest < Minitest::Test + + VALID_CASES = [ + ["example.com", "example.com", [nil, "example", "com"]], + ["foo.example.com", "example.com", ["foo", "example", "com"]], + + ["verybritish.co.uk", "verybritish.co.uk", [nil, "verybritish", "co.uk"]], + ["foo.verybritish.co.uk", "verybritish.co.uk", ["foo", "verybritish", "co.uk"]], + + ["parliament.uk", "parliament.uk", [nil, "parliament", "uk"]], + ["foo.parliament.uk", "parliament.uk", ["foo", "parliament", "uk"]], + ].freeze + + def test_valid + VALID_CASES.each do |input, domain, results| + parsed = PublicSuffix.parse(input) + trd, sld, tld = results + assert_equal tld, parsed.tld, "Invalid tld for `#{name}`" + assert_equal sld, parsed.sld, "Invalid sld for `#{name}`" + if trd.nil? + assert_nil parsed.trd, "Invalid trd for `#{name}`" + else + assert_equal trd, parsed.trd, "Invalid trd for `#{name}`" + end + + assert_equal domain, PublicSuffix.domain(input) + assert PublicSuffix.valid?(input) + end + end + + + INVALID_CASES = [ + ["nic.bd", PublicSuffix::DomainNotAllowed], + [nil, PublicSuffix::DomainInvalid], + ["", PublicSuffix::DomainInvalid], + [" ", PublicSuffix::DomainInvalid], + ].freeze + + def test_invalid + INVALID_CASES.each do |(name, error)| + assert_raises(error) { PublicSuffix.parse(name) } + assert !PublicSuffix.valid?(name) + end + end + + + REJECTED_CASES = [ + ["www. .com", true], + ["foo.co..uk", true], + ["goo,gle.com", true], + ["-google.com", true], + ["google-.com", true], + + # This case was covered in GH-15. + # I decided to cover this case because it's not easily reproducible with URI.parse + # and can lead to several false positives. + ["http://google.com", false], + ].freeze + + def test_rejected + REJECTED_CASES.each do |name, expected| + assert_equal expected, PublicSuffix.valid?(name), + "Expected %s to be %s" % [name.inspect, expected.inspect] + assert !valid_domain?(name), + "#{name} expected to be invalid" + end + end + + + CASE_CASES = [ + ["Www.google.com", %w( www google com )], + ["www.Google.com", %w( www google com )], + ["www.google.Com", %w( www google com )], + ].freeze + + def test_ignore_case + CASE_CASES.each do |name, results| + domain = PublicSuffix.parse(name) + trd, sld, tld = results + assert_equal tld, domain.tld, "Invalid tld for `#{name}'" + assert_equal sld, domain.sld, "Invalid sld for `#{name}'" + assert_equal trd, domain.trd, "Invalid trd for `#{name}'" + assert PublicSuffix.valid?(name) + end + end + + + INCLUDE_PRIVATE_CASES = [ + ["blogspot.com", true, "blogspot.com"], + ["blogspot.com", false, nil], + ["subdomain.blogspot.com", true, "blogspot.com"], + ["subdomain.blogspot.com", false, "subdomain.blogspot.com"], + ].freeze + + # rubocop:disable Style/CombinableLoops + def test_ignore_private + # test domain and parse + INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected| + if expected.nil? + assert_nil PublicSuffix.domain(given, ignore_private: ignore_private) + else + assert_equal expected, PublicSuffix.domain(given, ignore_private: ignore_private) + end + end + # test valid? + INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected| + assert_equal !expected.nil?, PublicSuffix.valid?(given, ignore_private: ignore_private) + end + end + # rubocop:enable Style/CombinableLoops + + + def valid_uri?(name) + uri = URI.parse(name) + !uri.host.nil? + rescue StandardError + false + end + + def valid_domain?(name) + uri = URI.parse(name) + !uri.host.nil? && uri.scheme.nil? + rescue StandardError + false + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find.rb new file mode 100644 index 000000000000..0074f1d094a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find.rb @@ -0,0 +1,66 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +NAME_SHORT = "example.de" +NAME_MEDIUM = "www.subdomain.example.de" +NAME_LONG = "one.two.three.four.five.example.de" +NAME_WILD = "one.two.three.four.five.example.bd" +NAME_EXCP = "one.two.three.four.five.www.ck" + +IAAA = "www.example.ac" +IZZZ = "www.example.zone" + +PAAA = "one.two.three.four.five.example.beep.pl" +PZZZ = "one.two.three.four.five.example.now.sh" + +JP = "www.yokoshibahikari.chiba.jp" +IT = "www.example.it" +COM = "www.example.com" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.find("example.com") + +Benchmark.bmbm(25) do |x| + x.report("NAME_SHORT") do + TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil } + end + x.report("NAME_MEDIUM") do + TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil } + end + x.report("NAME_LONG") do + TIMES.times { PublicSuffixList.find(NAME_LONG) != nil } + end + x.report("NAME_WILD") do + TIMES.times { PublicSuffixList.find(NAME_WILD) != nil } + end + x.report("NAME_EXCP") do + TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil } + end + + x.report("IAAA") do + TIMES.times { PublicSuffixList.find(IAAA) != nil } + end + x.report("IZZZ") do + TIMES.times { PublicSuffixList.find(IZZZ) != nil } + end + + x.report("PAAA") do + TIMES.times { PublicSuffixList.find(PAAA) != nil } + end + x.report("PZZZ") do + TIMES.times { PublicSuffixList.find(PZZZ) != nil } + end + + x.report("JP") do + TIMES.times { PublicSuffixList.find(JP) != nil } + end + x.report("IT") do + TIMES.times { PublicSuffixList.find(IT) != nil } + end + x.report("COM") do + TIMES.times { PublicSuffixList.find(COM) != nil } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find_all.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find_all.rb new file mode 100644 index 000000000000..0bcfd42c8af2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find_all.rb @@ -0,0 +1,102 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +NAME_SHORT = "example.de" +NAME_MEDIUM = "www.subdomain.example.de" +NAME_LONG = "one.two.three.four.five.example.de" +NAME_WILD = "one.two.three.four.five.example.bd" +NAME_EXCP = "one.two.three.four.five.www.ck" + +IAAA = "www.example.ac" +IZZZ = "www.example.zone" + +PAAA = "one.two.three.four.five.example.beep.pl" +PZZZ = "one.two.three.four.five.example.now.sh" + +JP = "www.yokoshibahikari.chiba.jp" +IT = "www.example.it" +COM = "www.example.com" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.find("example.com") + +Benchmark.bmbm(25) do |x| + x.report("NAME_SHORT") do + TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil } + end + x.report("NAME_SHORT (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_SHORT, ignore_private: true) != nil } + end + x.report("NAME_MEDIUM") do + TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil } + end + x.report("NAME_MEDIUM (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_MEDIUM, ignore_private: true) != nil } + end + x.report("NAME_LONG") do + TIMES.times { PublicSuffixList.find(NAME_LONG) != nil } + end + x.report("NAME_LONG (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_LONG, ignore_private: true) != nil } + end + x.report("NAME_WILD") do + TIMES.times { PublicSuffixList.find(NAME_WILD) != nil } + end + x.report("NAME_WILD (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_WILD, ignore_private: true) != nil } + end + x.report("NAME_EXCP") do + TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil } + end + x.report("NAME_EXCP (noprivate)") do + TIMES.times { PublicSuffixList.find(NAME_EXCP, ignore_private: true) != nil } + end + + x.report("IAAA") do + TIMES.times { PublicSuffixList.find(IAAA) != nil } + end + x.report("IAAA (noprivate)") do + TIMES.times { PublicSuffixList.find(IAAA, ignore_private: true) != nil } + end + x.report("IZZZ") do + TIMES.times { PublicSuffixList.find(IZZZ) != nil } + end + x.report("IZZZ (noprivate)") do + TIMES.times { PublicSuffixList.find(IZZZ, ignore_private: true) != nil } + end + + x.report("PAAA") do + TIMES.times { PublicSuffixList.find(PAAA) != nil } + end + x.report("PAAA (noprivate)") do + TIMES.times { PublicSuffixList.find(PAAA, ignore_private: true) != nil } + end + x.report("PZZZ") do + TIMES.times { PublicSuffixList.find(PZZZ) != nil } + end + x.report("PZZZ (noprivate)") do + TIMES.times { PublicSuffixList.find(PZZZ, ignore_private: true) != nil } + end + + x.report("JP") do + TIMES.times { PublicSuffixList.find(JP) != nil } + end + x.report("JP (noprivate)") do + TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil } + end + x.report("IT") do + TIMES.times { PublicSuffixList.find(IT) != nil } + end + x.report("IT (noprivate)") do + TIMES.times { PublicSuffixList.find(IT, ignore_private: true) != nil } + end + x.report("COM") do + TIMES.times { PublicSuffixList.find(COM) != nil } + end + x.report("COM (noprivate)") do + TIMES.times { PublicSuffixList.find(COM, ignore_private: true) != nil } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_names.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_names.rb new file mode 100644 index 000000000000..36b2bce36ae1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_names.rb @@ -0,0 +1,91 @@ +require 'benchmark/ips' + +STRING = "www.subdomain.example.com" +ARRAY = %w( + com + example.com + subdomain.example.com + www.subdomain.example.com +) + +def tokenizer1(string) + parts = string.split(".").reverse! + index = 0 + query = parts[index] + names = [] + + loop do + names << query + + index += 1 + break if index >= parts.size + query = parts[index] + "." + query + end + names +end + +def tokenizer2(string) + parts = string.split(".") + index = parts.size - 1 + query = parts[index] + names = [] + + loop do + names << query + + index -= 1 + break if index < 0 + query = parts[index] + "." + query + end + names +end + +def tokenizer3(string) + isx = string.size + idx = string.size - 1 + names = [] + + loop do + isx = string.rindex(".", isx - 1) || -1 + names << string[isx + 1, idx - isx] + + break if isx <= 0 + end + names +end + +def tokenizer4(string) + isx = string.size + idx = string.size - 1 + names = [] + + loop do + isx = string.rindex(".", isx - 1) || -1 + names << string[(isx+1)..idx] + + break if isx <= 0 + end + names +end + +(x = tokenizer1(STRING)) == ARRAY or fail("tokenizer1 failed: #{x.inspect}") +(x = tokenizer2(STRING)) == ARRAY or fail("tokenizer2 failed: #{x.inspect}") +(x = tokenizer3(STRING)) == ARRAY or fail("tokenizer3 failed: #{x.inspect}") +(x = tokenizer4(STRING)) == ARRAY or fail("tokenizer4 failed: #{x.inspect}") + +Benchmark.ips do |x| + x.report("tokenizer1") do + tokenizer1(STRING).is_a?(Array) + end + x.report("tokenizer2") do + tokenizer2(STRING).is_a?(Array) + end + x.report("tokenizer3") do + tokenizer3(STRING).is_a?(Array) + end + x.report("tokenizer4") do + tokenizer4(STRING).is_a?(Array) + end + + x.compare! +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select.rb new file mode 100644 index 000000000000..66d908b8ac7d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select.rb @@ -0,0 +1,26 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +JP = "www.yokoshibahikari.chiba.jp" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +class PublicSuffix::List + public :select +end +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.select("example.jp") +PublicSuffixList.find("example.jp") + +Benchmark.bmbm(25) do |x| + x.report("JP select") do + TIMES.times { PublicSuffixList.select(JP) } + end + x.report("JP find") do + TIMES.times { PublicSuffixList.find(JP) } + end + # x.report("JP (noprivate)") do + # TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil } + # end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select_incremental.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select_incremental.rb new file mode 100644 index 000000000000..f002c827b14e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select_incremental.rb @@ -0,0 +1,25 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +JP = "www.yokoshibahikari.chiba.jp" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +class PublicSuffix::List + public :select +end +PublicSuffixList = PublicSuffix::List.default +PublicSuffixList.select("example.jp") + +Benchmark.bmbm(25) do |x| + x.report("select jp") do + TIMES.times { PublicSuffixList.select("jp") } + end + x.report("select example.jp") do + TIMES.times { PublicSuffixList.select("example.jp") } + end + x.report("select www.example.jp") do + TIMES.times { PublicSuffixList.select("www.example.jp") } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_valid.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_valid.rb new file mode 100644 index 000000000000..a484451fff44 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_valid.rb @@ -0,0 +1,101 @@ +require 'benchmark' +require_relative "../../lib/public_suffix" + +NAME_SHORT = "example.de" +NAME_MEDIUM = "www.subdomain.example.de" +NAME_LONG = "one.two.three.four.five.example.de" +NAME_WILD = "one.two.three.four.five.example.bd" +NAME_EXCP = "one.two.three.four.five.www.ck" + +IAAA = "www.example.ac" +IZZZ = "www.example.zone" + +PAAA = "one.two.three.four.five.example.beep.pl" +PZZZ = "one.two.three.four.five.example.now.sh" + +JP = "www.yokoshibahikari.chiba.jp" +IT = "www.example.it" +COM = "www.example.com" + +TIMES = (ARGV.first || 50_000).to_i + +# Initialize +PublicSuffix.valid?("example.com") + +Benchmark.bmbm(25) do |x| + x.report("NAME_SHORT") do + TIMES.times { PublicSuffix.valid?(NAME_SHORT) == true } + end + x.report("NAME_SHORT (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_SHORT, ignore_private: true) == true } + end + x.report("NAME_MEDIUM") do + TIMES.times { PublicSuffix.valid?(NAME_MEDIUM) == true } + end + x.report("NAME_MEDIUM (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_MEDIUM, ignore_private: true) == true } + end + x.report("NAME_LONG") do + TIMES.times { PublicSuffix.valid?(NAME_LONG) == true } + end + x.report("NAME_LONG (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_LONG, ignore_private: true) == true } + end + x.report("NAME_WILD") do + TIMES.times { PublicSuffix.valid?(NAME_WILD) == true } + end + x.report("NAME_WILD (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_WILD, ignore_private: true) == true } + end + x.report("NAME_EXCP") do + TIMES.times { PublicSuffix.valid?(NAME_EXCP) == true } + end + x.report("NAME_EXCP (noprivate)") do + TIMES.times { PublicSuffix.valid?(NAME_EXCP, ignore_private: true) == true } + end + + x.report("IAAA") do + TIMES.times { PublicSuffix.valid?(IAAA) == true } + end + x.report("IAAA (noprivate)") do + TIMES.times { PublicSuffix.valid?(IAAA, ignore_private: true) == true } + end + x.report("IZZZ") do + TIMES.times { PublicSuffix.valid?(IZZZ) == true } + end + x.report("IZZZ (noprivate)") do + TIMES.times { PublicSuffix.valid?(IZZZ, ignore_private: true) == true } + end + + x.report("PAAA") do + TIMES.times { PublicSuffix.valid?(PAAA) == true } + end + x.report("PAAA (noprivate)") do + TIMES.times { PublicSuffix.valid?(PAAA, ignore_private: true) == true } + end + x.report("PZZZ") do + TIMES.times { PublicSuffix.valid?(PZZZ) == true } + end + x.report("PZZZ (noprivate)") do + TIMES.times { PublicSuffix.valid?(PZZZ, ignore_private: true) == true } + end + + x.report("JP") do + TIMES.times { PublicSuffix.valid?(JP) == true } + end + x.report("JP (noprivate)") do + TIMES.times { PublicSuffix.valid?(JP, ignore_private: true) == true } + end + x.report("IT") do + TIMES.times { PublicSuffix.valid?(IT) == true } + end + x.report("IT (noprivate)") do + TIMES.times { PublicSuffix.valid?(IT, ignore_private: true) == true } + end + x.report("COM") do + TIMES.times { PublicSuffix.valid?(COM) == true } + end + x.report("COM (noprivate)") do + TIMES.times { PublicSuffix.valid?(COM, ignore_private: true) == true } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/domain_profiler.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/domain_profiler.rb new file mode 100644 index 000000000000..1ed10500d57f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/domain_profiler.rb @@ -0,0 +1,12 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +PublicSuffix::List.default + +report = MemoryProfiler.report do + PublicSuffix.domain("www.example.com") +end + +report.pretty_print diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler.rb new file mode 100644 index 000000000000..53d28ebcac43 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler.rb @@ -0,0 +1,12 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +PublicSuffix::List.default + +report = MemoryProfiler.report do + PublicSuffix::List.default.find("www.example.com") +end + +report.pretty_print diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler_jp.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler_jp.rb new file mode 100644 index 000000000000..65c13fea7f27 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler_jp.rb @@ -0,0 +1,12 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +PublicSuffix::List.default + +report = MemoryProfiler.report do + PublicSuffix::List.default.find("a.b.ide.kyoto.jp") +end + +report.pretty_print diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/initialization_profiler.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/initialization_profiler.rb new file mode 100644 index 000000000000..008b1e757cf9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/initialization_profiler.rb @@ -0,0 +1,11 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require "memory_profiler" +require "public_suffix" + +report = MemoryProfiler.report do + PublicSuffix::List.default +end + +report.pretty_print +# report.pretty_print(to_file: 'profiler-%s-%d.txt' % [ARGV[0], Time.now.to_i]) diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/list_profsize.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/list_profsize.rb new file mode 100644 index 000000000000..0b98b4b3852c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/list_profsize.rb @@ -0,0 +1,11 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __dir__) + +require_relative "object_binsize" +require "public_suffix" + +list = PublicSuffix::List.default +puts "#{list.size} rules:" + +prof = ObjectBinsize.new +prof.report(PublicSuffix::List.default, label: "PublicSuffix::List size") +prof.report(PublicSuffix::List.default.instance_variable_get(:@rules), label: "Size of rules") diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/object_binsize.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/object_binsize.rb new file mode 100644 index 000000000000..dc60bdb46928 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/object_binsize.rb @@ -0,0 +1,57 @@ +require 'tempfile' + +# A very simple memory profiles that checks the full size of a variable +# by serializing into a binary file. +# +# Yes, I know this is very rough, but there are cases where ObjectSpace.memsize_of +# doesn't cooperate, and this is one of the possible workarounds. +# +# For certain cases, it works (TM). +class ObjectBinsize + + def measure(var, label: nil) + dump(var, label: label) + end + + def report(var, label: nil, padding: 10) + file = measure(var, label: label) + + size = format_integer(file.size) + name = label || File.basename(file.path) + printf("%#{padding}s %s\n", size, name) + end + + private + + def dump(var, **args) + file = Tempfile.new(args[:label].to_s) + file.write(Marshal.dump(var)) + file + ensure + file.close + end + + def format_integer(int) + int.to_s.reverse.gsub(/...(?=.)/, '\&,').reverse + end + +end + +if __FILE__ == $0 + prof = ObjectBinsize.new + + prof.report(nil, label: "nil") + prof.report(false, label: "false") + prof.report(true, label: "true") + prof.report(0, label: "integer") + prof.report("", label: "empty string") + prof.report({}, label: "empty hash") + prof.report({}, label: "empty array") + + prof.report({ foo: "1" }, label: "hash 1 item (symbol)") + prof.report({ foo: "1", bar: 2 }, label: "hash 2 items (symbol)") + prof.report({ "foo" => "1" }, label: "hash 1 item (string)") + prof.report({ "foo" => "1", "bar" => 2 }, label: "hash 2 items (string)") + + prof.report("big string" * 200, label: "big string * 200") +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/psl_test.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/psl_test.rb new file mode 100644 index 000000000000..fae398f74ef0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/psl_test.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +require "test_helper" +require "public_suffix" + +# This test runs against the current PSL file and ensures +# the definitions satisfies the test suite. +class PslTest < Minitest::Test + + ROOT = File.expand_path("..", __dir__) + + # rubocop:disable Security/Eval + def self.tests + File.readlines(File.join(ROOT, "test/tests.txt")).map do |line| + line = line.strip + next if line.empty? + next if line.start_with?("//") + + input, output = line.split(", ") + + # handle the case of eval("null"), it must be eval("nil") + input = "nil" if input == "null" + output = "nil" if output == "null" + + input = eval(input) + output = eval(output) + [input, output] + end + end + # rubocop:enable Security/Eval + + + def test_valid + # Parse the PSL and run the tests + data = File.read(PublicSuffix::List::DEFAULT_LIST_PATH) + PublicSuffix::List.default = PublicSuffix::List.parse(data) + + failures = [] + self.class.tests.each do |input, output| + # Punycode domains are not supported ATM + next if input =~ /xn--/ + + domain = PublicSuffix.domain(input) rescue nil + failures << [input, output, domain] if output != domain + end + + message = "The following #{failures.size} tests fail:\n" + failures.each { |i, o, d| message += "Expected %s to be %s, got %s\n" % [i.inspect, o.inspect, d.inspect] } + assert_equal 0, failures.size, message + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/test_helper.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/test_helper.rb new file mode 100644 index 000000000000..4f8a4477a043 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/test_helper.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +if ENV["COVERAGE"] + require "simplecov" + SimpleCov.start + + require "codecov" + SimpleCov.formatter = SimpleCov::Formatter::Codecov +end + +require "minitest/autorun" +require "minitest/reporters" +require "mocha/minitest" + +Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true) + +$LOAD_PATH.unshift File.expand_path("../lib", __dir__) +require "public_suffix" diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/tests.txt b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/tests.txt new file mode 100644 index 000000000000..b11150ab85f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/tests.txt @@ -0,0 +1,98 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// null input +null, null +// Mixed case +'COM', null +'example.COM', 'example.com' +'WwW.example.COM', 'example.com' +// Leading dot +'.com', null +'.example', null +'.example.com', null +'.example.example', null +// Unlisted TLD +'example', null +'example.example', 'example.example' +'b.example.example', 'example.example' +'a.b.example.example', 'example.example' +// Listed, but non-Internet, TLD +//'local', null +//'example.local', null +//'b.example.local', null +//'a.b.example.local', null +// TLD with only 1 rule +'biz', null +'domain.biz', 'domain.biz' +'b.domain.biz', 'domain.biz' +'a.b.domain.biz', 'domain.biz' +// TLD with some 2-level rules +'com', null +'example.com', 'example.com' +'b.example.com', 'example.com' +'a.b.example.com', 'example.com' +'uk.com', null +'example.uk.com', 'example.uk.com' +'b.example.uk.com', 'example.uk.com' +'a.b.example.uk.com', 'example.uk.com' +'test.ac', 'test.ac' +// TLD with only 1 (wildcard) rule +'mm', null +'c.mm', null +'b.c.mm', 'b.c.mm' +'a.b.c.mm', 'b.c.mm' +// More complex TLD +'jp', null +'test.jp', 'test.jp' +'www.test.jp', 'test.jp' +'ac.jp', null +'test.ac.jp', 'test.ac.jp' +'www.test.ac.jp', 'test.ac.jp' +'kyoto.jp', null +'test.kyoto.jp', 'test.kyoto.jp' +'ide.kyoto.jp', null +'b.ide.kyoto.jp', 'b.ide.kyoto.jp' +'a.b.ide.kyoto.jp', 'b.ide.kyoto.jp' +'c.kobe.jp', null +'b.c.kobe.jp', 'b.c.kobe.jp' +'a.b.c.kobe.jp', 'b.c.kobe.jp' +'city.kobe.jp', 'city.kobe.jp' +'www.city.kobe.jp', 'city.kobe.jp' +// TLD with a wildcard rule and exceptions +'ck', null +'test.ck', null +'b.test.ck', 'b.test.ck' +'a.b.test.ck', 'b.test.ck' +'www.ck', 'www.ck' +'www.www.ck', 'www.ck' +// US K12 +'us', null +'test.us', 'test.us' +'www.test.us', 'test.us' +'ak.us', null +'test.ak.us', 'test.ak.us' +'www.test.ak.us', 'test.ak.us' +'k12.ak.us', null +'test.k12.ak.us', 'test.k12.ak.us' +'www.test.k12.ak.us', 'test.k12.ak.us' +// IDN labels +'食狮.com.cn', '食狮.com.cn' +'食狮.公司.cn', '食狮.公司.cn' +'www.食狮.公司.cn', '食狮.公司.cn' +'shishi.公司.cn', 'shishi.公司.cn' +'公司.cn', null +'食狮.中国', '食狮.中国' +'www.食狮.中国', '食狮.中国' +'shishi.中国', 'shishi.中国' +'中国', null +// Same as above, but punycoded +'xn--85x722f.com.cn', 'xn--85x722f.com.cn' +'xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn' +'www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn' +'shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn' +'xn--55qx5d.cn', null +'xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s' +'www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s' +'shishi.xn--fiqs8s', 'shishi.xn--fiqs8s' +'xn--fiqs8s', null diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/domain_test.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/domain_test.rb new file mode 100644 index 000000000000..968462d94642 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/domain_test.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +require "test_helper" + +class PublicSuffix::DomainTest < Minitest::Test + + def setup + @klass = PublicSuffix::Domain + end + + # Tokenizes given input into labels. + def test_self_name_to_labels + assert_equal %w( someone spaces live com ), + PublicSuffix::Domain.name_to_labels("someone.spaces.live.com") + assert_equal %w( leontina23samiko wiki zoho com ), + PublicSuffix::Domain.name_to_labels("leontina23samiko.wiki.zoho.com") + end + + # Converts input into String. + def test_self_name_to_labels_converts_input_to_string + assert_equal %w( someone spaces live com ), + PublicSuffix::Domain.name_to_labels(:"someone.spaces.live.com") + end + + + def test_initialize_with_tld + domain = @klass.new("com") + assert_equal "com", domain.tld + assert_nil domain.sld + assert_nil domain.trd + end + + def test_initialize_with_tld_and_sld + domain = @klass.new("com", "google") + assert_equal "com", domain.tld + assert_equal "google", domain.sld + assert_nil domain.trd + end + + def test_initialize_with_tld_and_sld_and_trd + domain = @klass.new("com", "google", "www") + assert_equal "com", domain.tld + assert_equal "google", domain.sld + assert_equal "www", domain.trd + end + + + def test_to_s + assert_equal "com", @klass.new("com").to_s + assert_equal "google.com", @klass.new("com", "google").to_s + assert_equal "www.google.com", @klass.new("com", "google", "www").to_s + end + + def test_to_a + assert_equal [nil, nil, "com"], @klass.new("com").to_a + assert_equal [nil, "google", "com"], @klass.new("com", "google").to_a + assert_equal ["www", "google", "com"], @klass.new("com", "google", "www").to_a + end + + + def test_tld + assert_equal "com", @klass.new("com", "google", "www").tld + end + + def test_sld + assert_equal "google", @klass.new("com", "google", "www").sld + end + + def test_trd + assert_equal "www", @klass.new("com", "google", "www").trd + end + + + def test_name + assert_equal "com", @klass.new("com").name + assert_equal "google.com", @klass.new("com", "google").name + assert_equal "www.google.com", @klass.new("com", "google", "www").name + end + + def test_domain + assert_nil @klass.new("com").domain + assert_nil @klass.new("tldnotlisted").domain + assert_equal "google.com", @klass.new("com", "google").domain + assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google").domain + assert_equal "google.com", @klass.new("com", "google", "www").domain + assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").domain + end + + def test_subdomain + assert_nil @klass.new("com").subdomain + assert_nil @klass.new("tldnotlisted").subdomain + assert_nil @klass.new("com", "google").subdomain + assert_nil @klass.new("tldnotlisted", "google").subdomain + assert_equal "www.google.com", @klass.new("com", "google", "www").subdomain + assert_equal "www.google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").subdomain + end + + + def test_domain_question + assert !@klass.new("com").domain? + assert @klass.new("com", "example").domain? + assert @klass.new("com", "example", "www").domain? + assert @klass.new("tldnotlisted", "example").domain? + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/errors_test.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/errors_test.rb new file mode 100644 index 000000000000..75099ba98644 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/errors_test.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require "test_helper" + +class ErrorsTest < Minitest::Test + + # Inherits from StandardError + def test_error_inheritance + assert_kind_of StandardError, + PublicSuffix::Error.new + end + + # Inherits from PublicSuffix::Error + def test_domain_invalid_inheritance + assert_kind_of PublicSuffix::Error, + PublicSuffix::DomainInvalid.new + end + + # Inherits from PublicSuffix::DomainInvalid + def test_domain_not_allowed_inheritance + assert_kind_of PublicSuffix::DomainInvalid, + PublicSuffix::DomainNotAllowed.new + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/list_test.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/list_test.rb new file mode 100644 index 000000000000..98529352424d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/list_test.rb @@ -0,0 +1,241 @@ +# frozen_string_literal: true + +require "test_helper" + +class PublicSuffix::ListTest < Minitest::Test + + def setup + @list = PublicSuffix::List.new + end + + def teardown + PublicSuffix::List.default = nil + end + + + def test_initialize + assert_instance_of PublicSuffix::List, @list + assert_equal 0, @list.size + end + + + def test_equality_with_self + list = PublicSuffix::List.new + assert_equal list, list + end + + def test_equality_with_internals + rule = PublicSuffix::Rule.factory("com") + assert_equal PublicSuffix::List.new.add(rule), PublicSuffix::List.new.add(rule) + end + + def test_each_without_block + list = PublicSuffix::List.parse(<<LIST) +alpha +beta +LIST + + assert_kind_of Enumerator, list.each + assert_equal 2, list.each.count + assert_equal PublicSuffix::Rule.factory("alpha"), list.each.first + end + + def test_each_with_block + list = PublicSuffix::List.parse(<<LIST) +alpha +beta +LIST + + entries = [] + list.each { |r| entries << r } + + assert_equal 2, entries.count + assert_equal PublicSuffix::Rule.factory("alpha"), entries.first + end + + + def test_add + assert_equal @list, @list.add(PublicSuffix::Rule.factory("foo")) + assert_equal @list, @list << PublicSuffix::Rule.factory("bar") + assert_equal 2, @list.size + end + + def test_add_should_recreate_index + @list = PublicSuffix::List.parse("com") + assert_equal PublicSuffix::Rule.factory("com"), @list.find("google.com") + assert_equal @list.default_rule, @list.find("google.net") + + @list << PublicSuffix::Rule.factory("net") + assert_equal PublicSuffix::Rule.factory("com"), @list.find("google.com") + assert_equal PublicSuffix::Rule.factory("net"), @list.find("google.net") + end + + def test_empty? + assert @list.empty? + @list.add(PublicSuffix::Rule.factory("")) + assert !@list.empty? + end + + def test_size + assert_equal 0, @list.size + assert_equal @list, @list.add(PublicSuffix::Rule.factory("")) + assert_equal 1, @list.size + end + + def test_clear + assert_equal 0, @list.size + assert_equal @list, @list.add(PublicSuffix::Rule.factory("")) + assert_equal 1, @list.size + assert_equal @list, @list.clear + assert_equal 0, @list.size + end + + + def test_find + list = PublicSuffix::List.parse(<<LIST) +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// ===BEGIN ICANN DOMAINS=== + +// com +com + +// uk +*.uk +*.sch.uk +!bl.uk +!british-library.uk + +// io +io + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== + +// Google, Inc. +blogspot.com + +// ===END PRIVATE DOMAINS=== +LIST + + # match IANA + assert_equal PublicSuffix::Rule.factory("com"), list.find("example.com") + assert_equal PublicSuffix::Rule.factory("com"), list.find("foo.example.com") + + # match wildcard + assert_equal PublicSuffix::Rule.factory("*.uk"), list.find("example.uk") + assert_equal PublicSuffix::Rule.factory("*.uk"), list.find("example.co.uk") + assert_equal PublicSuffix::Rule.factory("*.uk"), list.find("foo.example.co.uk") + + # match exception + assert_equal PublicSuffix::Rule.factory("!british-library.uk"), list.find("british-library.uk") + assert_equal PublicSuffix::Rule.factory("!british-library.uk"), list.find("foo.british-library.uk") + + # match default rule + assert_equal PublicSuffix::Rule.factory("*"), list.find("test") + assert_equal PublicSuffix::Rule.factory("*"), list.find("example.test") + assert_equal PublicSuffix::Rule.factory("*"), list.find("foo.example.test") + + # match private + assert_equal PublicSuffix::Rule.factory("blogspot.com", private: true), list.find("blogspot.com") + assert_equal PublicSuffix::Rule.factory("blogspot.com", private: true), list.find("foo.blogspot.com") + end + + + def test_select + assert_equal 2, list.send(:select, "british-library.uk").size + end + + def test_select_name_blank + assert_equal [], list.send(:select, nil) + assert_equal [], list.send(:select, "") + assert_equal [], list.send(:select, " ") + end + + def test_select_ignore_private + list = PublicSuffix::List.new + list.add r1 = PublicSuffix::Rule.factory("io") + list.add r2 = PublicSuffix::Rule.factory("example.io", private: true) + + assert_equal list.send(:select, "foo.io"), [r1] + assert_equal list.send(:select, "example.io"), [r1, r2] + assert_equal list.send(:select, "foo.example.io"), [r1, r2] + + assert_equal list.send(:select, "foo.io", ignore_private: false), [r1] + assert_equal list.send(:select, "example.io", ignore_private: false), [r1, r2] + assert_equal list.send(:select, "foo.example.io", ignore_private: false), [r1, r2] + + assert_equal list.send(:select, "foo.io", ignore_private: true), [r1] + assert_equal list.send(:select, "example.io", ignore_private: true), [r1] + assert_equal list.send(:select, "foo.example.io", ignore_private: true), [r1] + end + + + def test_self_default_getter + PublicSuffix::List.default = nil + assert_nil(PublicSuffix::List.class_eval { @default }) + PublicSuffix::List.default + refute_nil(PublicSuffix::List.class_eval { @default }) + end + + def test_self_default_setter + PublicSuffix::List.default + refute_nil(PublicSuffix::List.class_eval { @default }) + PublicSuffix::List.default = nil + assert_nil(PublicSuffix::List.class_eval { @default }) + end + + def test_self_parse + list = PublicSuffix::List.parse(<<LIST) +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// ===BEGIN ICANN DOMAINS=== + +// com +com + +// uk +*.uk +!british-library.uk + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== + +// Google, Inc. +blogspot.com + +// ===END PRIVATE DOMAINS=== +LIST + + assert_instance_of PublicSuffix::List, list + assert_equal 4, list.size + + rules = %w( com *.uk !british-library.uk blogspot.com ).map { |name| PublicSuffix::Rule.factory(name) } + assert_equal rules, list.each.to_a + + # private domains + assert_equal false, list.find("com").private + assert_equal true, list.find("blogspot.com").private + end + + + private + + def list + @_list ||= PublicSuffix::List.parse(<<LIST) +// com : http://en.wikipedia.org/wiki/.com +com + +// uk : http://en.wikipedia.org/wiki/.uk +*.uk +*.sch.uk +!bl.uk +!british-library.uk +LIST + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/public_suffix_test.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/public_suffix_test.rb new file mode 100644 index 000000000000..ba51e138a8c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/public_suffix_test.rb @@ -0,0 +1,188 @@ +# frozen_string_literal: true + +require "test_helper" + +class PublicSuffixTest < Minitest::Test + + def test_private_domains_enabled_by_default + domain = PublicSuffix.parse("www.example.blogspot.com") + assert_equal "blogspot.com", domain.tld + end + + def test_private_domains_disable + data = File.read(PublicSuffix::List::DEFAULT_LIST_PATH) + PublicSuffix::List.default = PublicSuffix::List.parse(data, private_domains: false) + domain = PublicSuffix.parse("www.example.blogspot.com") + assert_equal "com", domain.tld + ensure + PublicSuffix::List.default = nil + end + + + def test_self_parse_a_domain_with_tld_and_sld + domain = PublicSuffix.parse("example.com") + assert_instance_of PublicSuffix::Domain, domain + assert_equal "com", domain.tld + assert_equal "example", domain.sld + assert_nil domain.trd + + domain = PublicSuffix.parse("example.co.uk") + assert_instance_of PublicSuffix::Domain, domain + assert_equal "co.uk", domain.tld + assert_equal "example", domain.sld + assert_nil domain.trd + end + + def test_self_parse_a_domain_with_tld_and_sld_and_trd + domain = PublicSuffix.parse("alpha.example.com") + assert_instance_of PublicSuffix::Domain, domain + assert_equal "com", domain.tld + assert_equal "example", domain.sld + assert_equal "alpha", domain.trd + + domain = PublicSuffix.parse("alpha.example.co.uk") + assert_instance_of PublicSuffix::Domain, domain + assert_equal "co.uk", domain.tld + assert_equal "example", domain.sld + assert_equal "alpha", domain.trd + end + + def test_self_parse_a_domain_with_tld_and_sld_and_4rd + domain = PublicSuffix.parse("one.two.example.com") + assert_instance_of PublicSuffix::Domain, domain + assert_equal "com", domain.tld + assert_equal "example", domain.sld + assert_equal "one.two", domain.trd + + domain = PublicSuffix.parse("one.two.example.co.uk") + assert_instance_of PublicSuffix::Domain, domain + assert_equal "co.uk", domain.tld + assert_equal "example", domain.sld + assert_equal "one.two", domain.trd + end + + def test_self_parse_name_fqdn + domain = PublicSuffix.parse("www.example.com.") + assert_instance_of PublicSuffix::Domain, domain + assert_equal "com", domain.tld + assert_equal "example", domain.sld + assert_equal "www", domain.trd + end + + def test_self_parse_with_custom_list + list = PublicSuffix::List.new + list << PublicSuffix::Rule.factory("test") + + domain = PublicSuffix.parse("www.example.test", list: list) + assert_instance_of PublicSuffix::Domain, domain + assert_equal "test", domain.tld + assert_equal "example", domain.sld + assert_equal "www", domain.trd + end + + def test_self_parse_with_notlisted_name + domain = PublicSuffix.parse("example.tldnotlisted") + assert_instance_of PublicSuffix::Domain, domain + assert_equal "tldnotlisted", domain.tld + assert_equal "example", domain.sld + assert_nil domain.trd + end + + def test_self_parse_with_unallowed_domain + error = assert_raises(PublicSuffix::DomainNotAllowed) { PublicSuffix.parse("example.bd") } + assert_match(/example\.bd/, error.message) + end + + def test_self_parse_with_uri + error = assert_raises(PublicSuffix::DomainInvalid) { PublicSuffix.parse("http://google.com") } + assert_match(%r{http://google\.com}, error.message) + end + + + def test_self_valid + assert PublicSuffix.valid?("google.com") + assert PublicSuffix.valid?("www.google.com") + assert PublicSuffix.valid?("google.co.uk") + assert PublicSuffix.valid?("www.google.co.uk") + end + + def test_self_valid_with_notlisted_name + assert PublicSuffix.valid?("google.tldnotlisted") + assert PublicSuffix.valid?("www.google.tldnotlisted") + end + + # def test_self_valid_with_fully_qualified_domain_name + # assert PublicSuffix.valid?("google.com.") + # assert PublicSuffix.valid?("google.co.uk.") + # assert !PublicSuffix.valid?("google.tldnotlisted.") + # end + + + def test_self_domain + assert_equal "google.com", PublicSuffix.domain("google.com") + assert_equal "google.com", PublicSuffix.domain("www.google.com") + assert_equal "google.co.uk", PublicSuffix.domain("google.co.uk") + assert_equal "google.co.uk", PublicSuffix.domain("www.google.co.uk") + end + + def test_self_domain_with_notlisted_name + assert_equal "example.tldnotlisted", PublicSuffix.domain("example.tldnotlisted") + end + + def test_self_domain_with_unallowed_name + assert_nil PublicSuffix.domain("example.bd") + end + + def test_self_domain_with_blank_sld + assert_nil PublicSuffix.domain("com") + assert_nil PublicSuffix.domain(".com") + end + + + def test_self_normalize + [ + ["com", "com"], + ["example.com", "example.com"], + ["www.example.com", "www.example.com"], + + ["example.com.", "example.com"], # strip FQDN + [" example.com ", "example.com"], # strip spaces + ["Example.COM", "example.com"], # downcase + ].each do |input, output| + assert_equal output, PublicSuffix.normalize(input) + end + end + + def test_normalize_blank + [ + nil, + "", + " ", + ].each do |input| + error = PublicSuffix.normalize(input) + assert_instance_of PublicSuffix::DomainInvalid, error + assert_equal "Name is blank", error.message + end + end + + def test_normalize_scheme + [ + "https://google.com", + ].each do |input| + error = PublicSuffix.normalize(input) + assert_instance_of PublicSuffix::DomainInvalid, error + assert_match(/scheme/, error.message) + end + end + + def test_normalize_leading_dot + [ + ".google.com", + ].each do |input| + error = PublicSuffix.normalize(input) + assert_instance_of PublicSuffix::DomainInvalid, error + assert_match "Name starts with a dot", error.message + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/rule_test.rb b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/rule_test.rb new file mode 100644 index 000000000000..d1cc60946d6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/public_suffix-4.0.6/test/unit/rule_test.rb @@ -0,0 +1,222 @@ +# frozen_string_literal: true + +require "test_helper" + +class PublicSuffix::RuleTest < Minitest::Test + + def test_factory_should_return_rule_normal + rule = PublicSuffix::Rule.factory("com") + assert_instance_of PublicSuffix::Rule::Normal, rule + + rule = PublicSuffix::Rule.factory("verona.it") + assert_instance_of PublicSuffix::Rule::Normal, rule + end + + def test_factory_should_return_rule_exception + rule = PublicSuffix::Rule.factory("!british-library.uk") + assert_instance_of PublicSuffix::Rule::Exception, rule + end + + def test_factory_should_return_rule_wildcard + rule = PublicSuffix::Rule.factory("*.do") + assert_instance_of PublicSuffix::Rule::Wildcard, rule + + rule = PublicSuffix::Rule.factory("*.sch.uk") + assert_instance_of PublicSuffix::Rule::Wildcard, rule + end + + + def test_default_returns_default_wildcard + default = PublicSuffix::Rule.default + assert_equal PublicSuffix::Rule::Wildcard.build("*"), default + assert_equal %w( example tldnotlisted ), default.decompose("example.tldnotlisted") + assert_equal %w( www.example tldnotlisted ), default.decompose("www.example.tldnotlisted") + end + +end + + +class PublicSuffix::RuleBaseTest < Minitest::Test + + class ::PublicSuffix::Rule::Test < ::PublicSuffix::Rule::Base + end + + def setup + @klass = PublicSuffix::Rule::Base + end + + + def test_initialize + rule = @klass.new(value: "verona.it") + assert_instance_of @klass, rule + assert_equal "verona.it", rule.value + end + + + def test_equality_with_self + rule = PublicSuffix::Rule::Base.new(value: "foo") + assert_equal rule, rule + end + + # rubocop:disable Style/SingleLineMethods + def test_equality_with_internals + assert_equal @klass.new(value: "foo"), @klass.new(value: "foo") + refute_equal @klass.new(value: "foo"), @klass.new(value: "bar") + refute_equal @klass.new(value: "foo"), PublicSuffix::Rule::Test.new(value: "foo") + refute_equal @klass.new(value: "foo"), PublicSuffix::Rule::Test.new(value: "bar") + refute_equal @klass.new(value: "foo"), Class.new { def name; foo; end }.new + end + # rubocop:enable Style/SingleLineMethods + + def test_match + [ + # standard match + [PublicSuffix::Rule.factory("uk"), "uk", true], + [PublicSuffix::Rule.factory("uk"), "example.uk", true], + [PublicSuffix::Rule.factory("uk"), "example.co.uk", true], + [PublicSuffix::Rule.factory("co.uk"), "example.co.uk", true], + + # FIXME + # [PublicSuffix::Rule.factory("*.com"), "com", false], + [PublicSuffix::Rule.factory("*.com"), "example.com", true], + [PublicSuffix::Rule.factory("*.com"), "foo.example.com", true], + [PublicSuffix::Rule.factory("!example.com"), "com", false], + [PublicSuffix::Rule.factory("!example.com"), "example.com", true], + [PublicSuffix::Rule.factory("!example.com"), "foo.example.com", true], + + # TLD mismatch + [PublicSuffix::Rule.factory("gk"), "example.uk", false], + [PublicSuffix::Rule.factory("gk"), "example.co.uk", false], + [PublicSuffix::Rule.factory("co.uk"), "uk", false], + + # general mismatch + [PublicSuffix::Rule.factory("uk.co"), "example.co.uk", false], + [PublicSuffix::Rule.factory("go.uk"), "example.co.uk", false], + [PublicSuffix::Rule.factory("co.uk"), "uk", false], + + # partial matches/mismatches + [PublicSuffix::Rule.factory("co"), "example.co.uk", false], + [PublicSuffix::Rule.factory("example"), "example.uk", false], + [PublicSuffix::Rule.factory("le.it"), "example.it", false], + [PublicSuffix::Rule.factory("le.it"), "le.it", true], + [PublicSuffix::Rule.factory("le.it"), "foo.le.it", true], + + ].each do |rule, input, expected| + assert_equal expected, rule.match?(input) + end + end + + + def test_parts + assert_raises(NotImplementedError) { @klass.new(value: "com").parts } + end + + def test_decompose + assert_raises(NotImplementedError) { @klass.new(value: "com").decompose("google.com") } + end + +end + + +class PublicSuffix::RuleNormalTest < Minitest::Test + + def setup + @klass = PublicSuffix::Rule::Normal + end + + + def test_build + rule = @klass.build("verona.it") + assert_instance_of @klass, rule + assert_equal "verona.it", rule.value + assert_equal "verona.it", rule.rule + end + + + def test_length + assert_equal 1, @klass.build("com").length + assert_equal 2, @klass.build("co.com").length + assert_equal 3, @klass.build("mx.co.com").length + end + + def test_parts + assert_equal %w(com), @klass.build("com").parts + assert_equal %w(co com), @klass.build("co.com").parts + assert_equal %w(mx co com), @klass.build("mx.co.com").parts + end + + def test_decompose + assert_equal [nil, nil], @klass.build("com").decompose("com") + assert_equal %w( example com ), @klass.build("com").decompose("example.com") + assert_equal %w( foo.example com ), @klass.build("com").decompose("foo.example.com") + end + +end + + +class PublicSuffix::RuleExceptionTest < Minitest::Test + + def setup + @klass = PublicSuffix::Rule::Exception + end + + + def test_initialize + rule = @klass.build("!british-library.uk") + assert_instance_of @klass, rule + assert_equal "british-library.uk", rule.value + assert_equal "!british-library.uk", rule.rule + end + + + def test_length + assert_equal 2, @klass.build("!british-library.uk").length + assert_equal 3, @klass.build("!foo.british-library.uk").length + end + + def test_parts + assert_equal %w( uk ), @klass.build("!british-library.uk").parts + assert_equal %w( tokyo jp ), @klass.build("!metro.tokyo.jp").parts + end + + def test_decompose + assert_equal [nil, nil], @klass.build("!british-library.uk").decompose("uk") + assert_equal %w( british-library uk ), @klass.build("!british-library.uk").decompose("british-library.uk") + assert_equal %w( foo.british-library uk ), @klass.build("!british-library.uk").decompose("foo.british-library.uk") + end + +end + + +class PublicSuffix::RuleWildcardTest < Minitest::Test + + def setup + @klass = PublicSuffix::Rule::Wildcard + end + + + def test_initialize + rule = @klass.build("*.aichi.jp") + assert_instance_of @klass, rule + assert_equal "aichi.jp", rule.value + assert_equal "*.aichi.jp", rule.rule + end + + + def test_length + assert_equal 2, @klass.build("*.uk").length + assert_equal 3, @klass.build("*.co.uk").length + end + + def test_parts + assert_equal %w( uk ), @klass.build("*.uk").parts + assert_equal %w( co uk ), @klass.build("*.co.uk").parts + end + + def test_decompose + assert_equal [nil, nil], @klass.build("*.do").decompose("nic.do") + assert_equal %w( google co.uk ), @klass.build("*.uk").decompose("google.co.uk") + assert_equal %w( foo.google co.uk ), @klass.build("*.uk").decompose("foo.google.co.uk") + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/COPYING b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/COPYING new file mode 100644 index 000000000000..00e3e0db94f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/COPYING @@ -0,0 +1,22 @@ +Copyright (C) 2019 Yukihiro Matsumoto. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ChangeLog b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ChangeLog new file mode 100644 index 000000000000..762b5ee75568 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ChangeLog @@ -0,0 +1,846 @@ +Tue Feb 20 18:45:45 2007 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammar.rb (separated_by): last commit was wrong. use + optional default return value of #option. + +Tue Feb 20 18:27:48 2007 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammar.rb (separated_by): return [] for empty list. + +Tue Nov 7 07:13:47 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammar.rb (Rule#prec): rule.prec{...} should set + action. + +Tue Nov 7 06:38:57 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammar.rb: system call error on writing log file + should be ignored. + + * lib/racc/grammar.rb: never define lvar which have same name with + block local variable. + + * lib/racc/iset.rb: ditto. + + * lib/racc/logfilegenerator.rb: ditto. + + * lib/racc/parser.rb: ditto. + + * lib/racc/state.rb: ditto. + + * lib/racc/statetransitiontable.rb: ditto. + + * test/test.rb: racc -c is obsolete, use --line-convert-all. + +Sun Oct 29 13:27:30 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammarfileparser.rb: use String#lines instead of + #to_a. + + * lib/racc/parserfilegenerator.rb: ditto. + + * lib/racc/compat.rb: provide Object#__send. + + * lib/racc/compat.rb: provide Object#__send!. + + * lib/racc/compat.rb: provide String#lines. + +Thu Aug 24 23:14:16 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammar.rb: report conflicts/useless if $DEBUG. + + * lib/racc/statetransitiontable.rb: remove code for Ruby 1.4 + compatibility. + +Fri Aug 4 01:02:36 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammar.rb: #should_terminal should be called in + #check_terminals. + +Fri Aug 4 00:44:56 2006 Minero Aoki <aamine@loveruby.net> + + * bin/racc: getopts -> optparse. + + * lib/racc/grammar.rb: value of error symbol is :error. + + * lib/racc/grammar.rb (check_terminals): string symbols are + terminal. + + * lib/racc/grammarfileparser.rb (add_rule_block): specified-prec + did not work. + +Fri Aug 4 00:29:53 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/parserfilegenerator.rb + (serialize_integer_list_compressed): fix typo. + +Thu Aug 3 22:20:34 2006 Minero Aoki <aamine@loveruby.net> + + * bin/y2racc: fix filename. + +Thu Aug 3 21:10:48 2006 Minero Aoki <aamine@loveruby.net> + + * bin/y2racc: getopts -> optparse. + +Thu Aug 3 19:35:34 2006 Minero Aoki <aamine@loveruby.net> + + * setup.rb: updated. + +Thu Aug 3 19:34:55 2006 Minero Aoki <aamine@loveruby.net> + + * bin/racc2y: getopts -> optparse. + + * bin/racc2y: rewrite code for new generator. + + * lib/racc/grammar.rb (_regist): did not check @delayed rules (it + causes registering same dummy rules many times). + + * lib/racc/grammarfileparser.rb: refactoring: simplify syntax. + + * lib/racc/grammarfileparser.rb: new method + GrammarFileParser.parse. + + * lib/racc/grammarfileparser.rb: new method + GrammarFileParser.parse_file. + +Sat Jul 29 04:51:42 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/pre-setup: We need not make grammarfileparser.rb. + +Sat Jul 29 04:30:33 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammar.rb: allow '|' operation with meta rules + (many, option...). + +Sat Jul 29 03:17:20 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammar.rb (Grammar#parser_class): write log file when + $DEBUG=true. + + * lib/racc/grammar.rb (Grammar.define): run block on a + Racc::Grammar::DefinitionEnv object, instead of a Racc::Grammar + object. + + * lib/racc/grammar.rb (DefinitionEnv): new method #null. + + * lib/racc/grammar.rb (DefinitionEnv): new method #many. + + * lib/racc/grammar.rb (DefinitionEnv): new method #many1. + + * lib/racc/grammar.rb (DefinitionEnv): new method #option. + + * lib/racc/grammar.rb (DefinitionEnv): new method #seperated_by. + + * lib/racc/grammar.rb (DefinitionEnv): new method #seperated_by1. + + * lib/racc/grammar.rb (DefinitionEnv): new method #action. + +Sat Jul 29 03:13:22 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/compat.rb: reduce warning. + +Sun Jul 16 05:07:12 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/compat.rb: implement Enumerable#each_slice for Ruby + 1.8. + + * lib/racc/parserfilegenerator.rb: better output. + + * ext/racc/cparse/cparse.c: always use VALUE instead of struct + cparse_params. + + * ext/racc/cparse/cparse.c: mark params->value_v. + +Thu Jul 6 20:44:48 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammar.rb: on-the-fly generator implemented. + + * lib/racc/generator.rb -> statetransitiontable.rb, + parserfilegenerator.rb, logfilegenerator.rb. + + * lib/racc/statetransitiontable.rb: new file. + + * lib/racc/parserfilegenerator.rb: new file. + + * lib/racc/logfilegenerator.rb: new file. + + * lib/racc/grammarfileparser.rb.in: removed. + + * lib/racc/grammarfileparser.rb: new file. uses on-the-fly + generator. + + * misc/boot.rb: removed. + + * lib/racc/static.rb: new file, to import static generator + (lib/racc.rb provides dynamic generator). + + * lib/racc/grammar.rb: grand refactoring. + + * lib/racc/sourcetext.rb: new method #to_s, #location. + + * lib/racc/state.rb: compute NFA/DFA on demand. + + * bin/racc: follow these changes. + +Thu Jul 6 20:39:42 2006 Minero Aoki <aamine@loveruby.net> + + * ext/racc/cparse/cparse.so: should mark VALUEs in cparse_params. + +Tue Jul 4 02:24:27 2006 Minero Aoki <aamine@loveruby.net> + + * bin/racc: simplify report code. + + * lib/racc/grammar.rb: introduce new methods for racc command. + + * lib/racc/states.rb: ditto. + + * lib/racc/generator.rb: class CodeGenerator -> + ParserFileGenerator. + + * lib/racc/generator.rb: new class ParserFileGenerator::Params. + + * bin/racc: ditto. + + * misc/boot.rb: ditto. + + * lib/racc/grammarfileparser.rb.in: ditto. + + * lib/racc/grammarfileparser.rb.in: merge grammarfilescanner.rb. + + * lib/racc/grammarfilescanner.rb: removed. + + * lib/racc/grammarfileparser.rb.in: parses user code blocks. + + * lib/racc/usercodeparser.rb: removed. + + * lib/racc/generator.rb: remove user code parsing code. + + * lib/racc/grammarfileparser.rb.in: passes user code block by a + SourceText object. + + * lib/racc/generator.rb: ditto. + + * lib/racc/sourcetext.rb: new file. + + * lib/racc/generator.rb: introduce DSL to describe file contents. + +Tue Jul 4 02:15:36 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/debugflags.rb: remove unused class GenerationOptions. + +Tue Jul 4 02:14:48 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/compat.rb: update coding style. + +Mon Jul 3 04:34:32 2006 Minero Aoki <aamine@loveruby.net> + + * lib/racc/compiler.rb: do not export Grammar/SymbolTable/States. + + * lib/racc/compiler.rb: make a new class for debug flags + (Racc::DebugFlags). + + * lib/racc/compiler.rb: removed. + + * bin/racc: eliminate Racc::Compiler class. + + * bin/racc: refactor profiling code. + + * bin/racc: move file generation code to racc/generator.rb. + + * misc/boot.rb: does not emulate Racc::Compiler interface. + + * lib/racc.rb: new file to require whole generator. + + * lib/racc/grammar.rb: class RuleTable -> Grammar. + + * lib/racc/grammar.rb: Grammar.new does not acccept a Compiler. + + * lib/racc/grammar.rb: refactoring. + + * lib/racc/grammarfileparser.rb.in: GrammarFileParser.new does not + accept a Compiler. + + * lib/racc/grammarfileparser.rb.in: #parser takes more 2 args, a + filename and a base line number. + + * lib/racc/grammarfileparser.rb.in: refactoring. + + * lib/racc/output.rb -> generate.rb + + * lib/racc/generate.rb: class Formatter -> CodeGenerator. + + * lib/racc/generate.rb: CodeGenerator.new does not accept a + Compiler. + + * lib/racc/generate.rb: a CodeGenerator got many parameters via + setter method. + + * lib/racc/generate.rb: class VerboseOutputter -> + LogFileGenerator. + + * lib/racc/generate.rb: LogFileGenerator.new does not accept a + Compiler. + + * lib/racc/generate.rb: refactoring. + + * lib/racc/state.rb: class StateTable -> States. + + * lib/racc/state.rb: States.new does not acccept a Compiler. + + * lib/racc/state.rb: refactoring. + + * test/test.rb: -Da is obsolete (I forgot what this flag is). + + * test/test.rb: allow replacing racc via environment variable + $RACC. + +Mon Jul 3 04:18:49 2006 Minero Aoki <aamine@loveruby.net> + + * Makefile: new task bootstrap-force. + +Sun Jul 2 19:46:58 2006 Minero Aoki <aamine@loveruby.net> + + * test/ichk.y: update coding style. + +Sun Jul 2 19:01:55 2006 Minero Aoki <aamine@loveruby.net> + + * ext/racc/cparse/cparse.c: must require version.h to get + RUBY_VERSION_CODE. + +Sun Jul 2 18:33:32 2006 Minero Aoki <aamine@loveruby.net> + + * ext/racc/cparse/cparse.c: do not use rb_iterate to give a block + to the method, use rb_block_call instead. [ruby-dev:28445] + +Mon Jun 19 02:38:18 2006 Minero Aoki <aamine@loveruby.net> + + * bin/racc: -g option is now -t. -g option is obsolete and is an + alias of -t. + +Mon Jun 19 02:35:59 2006 Minero Aoki <aamine@loveruby.net> + + * ext/racc/cparse/cparse.c: K&R -> ANSI C. + +Mon Nov 21 02:37:10 2005 Minero Aoki <aamine@loveruby.net> + + * version 1.4.5 released. + +Mon Nov 21 02:31:18 2005 Minero Aoki <aamine@loveruby.net> + + * bin/racc: shebang line should include file extension. + + * lib/racc/compat.rb: method removed: bug!. + + * lib/racc/*.rb: racc compiler should not depend on + Racc::ParseError. + + * lib/racc/*.rb: update copyright year. + + * lib/racc/*.rb: update coding style. + + * lib/racc/exception.rb: new file. + +Mon Nov 21 00:49:18 2005 Minero Aoki <aamine@loveruby.net> + + * Makefile: remove useless target `import'. + + * Makefile: generate parser-text.rb. + + * misc/dist.sh: setup.rb and COPYING is now in repository. + + * misc/dist.sh: generate parser-text.rb. + +Mon Nov 21 00:14:21 2005 Minero Aoki <aamine@loveruby.net> + + * bin/racc: read racc/parser.rb from parser-text.rb. + + * lib/racc/rubyloader.rb: no longer needed. + + * lib/racc/pre-setup: new file. + + * lib/racc/pre-setup: generate parser-text.rb. + + * lib/racc/pre-setup: generate grammarfileparser.rb. + + * misc/boot.rb: new method BootstrapCompiler.main. + + * misc/boot.rb: new method BootstrapCompiler.generate, which is + used from pre-setup. + +Mon Nov 21 00:09:04 2005 Minero Aoki <aamine@loveruby.net> + + * bin/racc2y: refactoring. + + * bin/y2racc: refactoring. + +Sun Nov 20 23:46:42 2005 Minero Aoki <aamine@loveruby.net> + + * lib/racc/pre-setup: new file. + +Sun Nov 20 22:46:21 2005 Minero Aoki <aamine@loveruby.net> + + * COPYING: new file. + +Sun Nov 20 22:25:15 2005 Minero Aoki <aamine@loveruby.net> + + * setup.rb: import setup.rb 3.4.1. + +Thu Sep 29 02:51:56 2005 Minero Aoki <aamine@loveruby.net> + + * Makefile (clean): invoke `make clean' in ext. + +Thu Sep 29 02:50:56 2005 Minero Aoki <aamine@loveruby.net> + + * lib/racc/.cvsignore: removed. + +Thu Sep 29 02:46:30 2005 Minero Aoki <aamine@loveruby.net> + + * Makefile: use .makeparams system. + + * Makefile: unify lib/racc/Makefile. + + * Makefile: new target lib/racc/grammarfileparser.rb. + + * lib/racc/Makefile: unified by ./Makefile. + + * lib/racc/boot: removed (moved under misc). + + * misc/boot.rb: new file. + +Thu Sep 29 02:43:30 2005 Minero Aoki <aamine@loveruby.net> + + * setup.rb: new file. + +Tue Jul 26 23:37:46 2005 Minero Aoki <aamine@loveruby.net> + + * bin/racc: --no-omit-actions did not work (This patch is + contributed by OHKUBO Takuya). + +Sun Jan 2 11:48:19 2005 Minero Aoki <aamine@loveruby.net> + + * lib/racc/grammer.rb (once_writer): bug! needs argument. + +Mon Feb 16 16:14:16 2004 Minero Aoki <aamine@loveruby.net> + + * test/echk.y: fix typo. + + * test/ichk.y: does not use amstd. + + * test/opt.y: untabify. + +Mon Feb 16 16:10:46 2004 Minero Aoki <aamine@loveruby.net> + + * lib/racc/boot: update coding style. + + * lib/racc/compat.rb: ditto. + + * lib/racc/compiler.rb: ditto. + + * lib/racc/grammar.rb: ditto. + + * lib/racc/grammarfileparser.rb.in: ditto. + + * lib/racc/grammarfilescanner.rb: ditto. + + * lib/racc/info.rb: ditto. + + * lib/racc/iset.rb: ditto. + + * lib/racc/output.rb: ditto. + + * lib/racc/parser.rb: ditto. + + * lib/racc/state.rb: ditto. + + * lib/racc/usercodeparser.rb: ditto. + +Mon Feb 16 16:01:34 2004 Minero Aoki <aamine@loveruby.net> + + * lib/racc/rubyloader.rb: imported rev1.6. + +Fri Dec 12 01:57:47 2003 Minero Aoki <aamine@loveruby.net> + + * sample/hash.y: use no_result_var option. + + * sample/array.y: use latest (my) coding style. + + * sample/array2.y: ditto. + + * sample/hash.y: ditto. + + * sample/lists.y: ditto. + +Wed Nov 5 19:50:35 2003 Minero Aoki <aamine@loveruby.net> + + * test/bench.y: remove dependency on amstd. + + * test/chk.y: ditto. + + * test/echk.y: ditto. + + * test/ichk.y: ditto. + + * test/intp.y: ditto. + + * test/opt.y: ditto. + + * test/percent.y: ditto. + +Wed Nov 5 19:11:15 2003 Minero Aoki <aamine@loveruby.net> + + * bin/racc (get_options): remove --no-extensions option; + racc/parser is preloaded, Racc_No_Extension does not work. + +Mon Nov 3 22:41:42 2003 Minero Aoki <aamine@loveruby.net> + + * bin/racc: apply latest coding style. + + * lib/racc/parser.rb: ditto. + + * lib/racc/compat.rb: add File.read. + +Mon Nov 3 21:20:25 2003 Minero Aoki <aamine@loveruby.net> + + * ext/racc/cparse/cparse.c (parse_main): abort if length of state + stack <=1, not ==0. + + * lib/racc/parser.rb: use <=1, not <2. + + * ext/racc/cparse/cparse.c: check_*() -> assert_*() + + * ext/racc/cparse/cparse.c (racc_cparse): define lvar `v' for + debugging. + + * ext/racc/cparse/cparse.c (racc_yyparse): ditto. + +Mon Nov 3 17:21:55 2003 Minero Aoki <aamine@loveruby.net> + + * Makefile (all): make cparse.so. + +Mon Nov 3 17:19:26 2003 Minero Aoki <aamine@loveruby.net> + + * lib/racc/parser.rb: update version. + + * ext/racc/cparse/cparse.c: update version. + +Mon Nov 3 17:19:01 2003 Minero Aoki <aamine@loveruby.net> + + * Makefile: update version in parser.rb, cparse.c. + +Sun Oct 12 23:49:58 2003 Minero Aoki <aamine@loveruby.net> + + * version 1.4.4. + +Sun Oct 12 23:49:40 2003 Minero Aoki <aamine@loveruby.net> + + * bin/y2racc: did not work. + + * bin/y2racc: -u options did not work. + +Sun Oct 12 23:41:46 2003 Minero Aoki <aamine@loveruby.net> + + * misc/dist.sh: cd before make. + +Sun Oct 12 23:38:04 2003 Minero Aoki <aamine@loveruby.net> + + * Makefile (site): create $siteroot/{ja,en}/man/racc/*.html. + +Sun Oct 12 23:37:18 2003 Minero Aoki <aamine@loveruby.net> + + * doc/parser.rrd.m: missing 'j'. + +Sun Oct 12 23:29:11 2003 Minero Aoki <aamine@loveruby.net> + + * Makefile: new target `doc'. + + * Makefile: new target `clean'. + + * lib/racc/Makefile: new target `clean'. + + * misc/dist.sh: create documents before pack. + +Sun Oct 12 23:27:58 2003 Minero Aoki <aamine@loveruby.net> + + * doc/debug.rd.m: junk char was inserted. + + * doc/index.html.m: en/ja text were mixed. + + * doc/parser.rrd.m: add return values. + + * doc/usage.html.m: fix hyper link. + +Sun Oct 12 22:57:28 2003 Minero Aoki <aamine@loveruby.net> + + * doc.en/changes.html, doc.ja/changes.html -> doc/NEWS.rd.m + + * doc.en/command.html, doc.ja/command.html -> doc/command.html.m + + * doc.en/debug.html, doc.ja/debug.html -> doc/debug.rd.m + + * doc.en/grammar.html, doc.ja/grammar.html -> doc/grammar.rd.m + + * doc.en/index.html, doc.ja/index.html -> doc/index.html.m + + * doc.en/parser.html, doc.ja/parser.html -> doc/parser.rrd.m + + * doc.en/usage.html, doc.ja/usage.html -> doc/usage.html.m + +Sun Oct 12 18:46:21 2003 Minero Aoki <aamine@loveruby.net> + + * web/racc.ja.html: update descriptions. + + * web/racc.en.html: ditto. + +Sun Oct 12 18:43:45 2003 Minero Aoki <aamine@loveruby.net> + + * misc/dist.sh: remove web/ directory before distribute. + +Sun Oct 12 18:37:29 2003 Minero Aoki <aamine@loveruby.net> + + * Makefile: new target `site'. + + * web/racc.ja.html: new file. + + * web/racc.en.html: new file. + +Sun Oct 12 18:30:55 2003 Minero Aoki <aamine@loveruby.net> + + * misc/dist.sh: forgot to remove tmp comment out. + +Sun Oct 12 18:12:09 2003 Minero Aoki <aamine@loveruby.net> + + * lib/racc/info.rb: version 1.4.4. + +Sun Oct 12 18:11:42 2003 Minero Aoki <aamine@loveruby.net> + + * Makefile (dist): split out misc/dist.sh. + + * misc/dist.sh: new file. + +Sun Oct 12 17:18:47 2003 Minero Aoki <aamine@loveruby.net> + + * README.en: update documents. + + * README.ja: ditto. + + * doc.en/changes.html: ditto. + + * doc.en/command.html: ditto. + + * doc.en/debug.html: ditto. + + * doc.en/grammar.html: ditto. + + * doc.en/index.html: ditto. + + * doc.en/parser.html: ditto. + + * doc.en/usage.html: ditto. + + * doc.ja/changes.html: ditto. + + * doc.ja/command.html: ditto. + + * doc.ja/debug.html: ditto. + + * doc.ja/index.html: ditto. + + * doc.ja/parser.html: ditto. + + * doc.ja/usage.html: ditto. + +Sun Oct 12 16:24:46 2003 Minero Aoki <aamine@loveruby.net> + + * sameple/calc-ja.y: simplify. + +Sun Oct 12 16:24:16 2003 Minero Aoki <aamine@loveruby.net> + + * misc/y2racc -> bin/y2racc + + * misc/racc2y -> bin/racc2y + +Sun Oct 12 15:56:30 2003 Minero Aoki <aamine@loveruby.net> + + * bin/racc: follow method name change. + +Sun Oct 12 15:34:14 2003 Minero Aoki <aamine@loveruby.net> + + * Makefile: new target `test'. + + * Makefile: missing $datadir. + +Sun Oct 12 15:33:02 2003 Minero Aoki <aamine@loveruby.net> + + * README.ja: update description. + + * README.en: ditto. + +Sun Oct 12 15:25:23 2003 Minero Aoki <aamine@loveruby.net> + + * lib/racc/compiler.rb: adjust file names. + + * lib/racc/grammarfileparser.rb.in: ditto. + + * lib/racc/grammarfilescanner.rb: ditto. + +Sun Oct 12 15:24:53 2003 Minero Aoki <aamine@loveruby.net> + + * Makefile: new file. + +Sun Oct 12 15:19:57 2003 Minero Aoki <aamine@loveruby.net> + + * BUGS.en: removed. + + * BUGS.ja: removed. + +Sun Oct 12 15:10:38 2003 Minero Aoki <aamine@loveruby.net> + + * racc -> bin/racc + + * .cvsignore -> lib/racc/.cvsignore + + * lib/racc/Makefile: new file. + + * boot.rb -> lib/racc/boot + + * compat.rb -> lib/racc/compat.rb + + * compiler.rb -> lib/racc/compiler.rb + + * grammar.rb -> lib/racc/grammar.rb + + * in.raccp.rb -> lib/racc/grammarfileparser.rb.in + + * raccs.rb -> lib/racc/grammarfilescanner.rb + + * info.rb -> lib/racc/info.rb + + * iset.rb -> lib/racc/iset.rb + + * outpur.rb -> lib/racc/output.rb + + * parser.rb -> lib/racc/parser.rb + + * rubyloader.rb -> lib/racc/rubyloader.rb + + * state.rb -> lib/racc/state.rb + + * ucodep.rb -> lib/racc/usercodeparser.rb + + * cparse/MANIFEST -> ext/racc/cparse/MANIFEST + + * cparse/cparse.c -> ext/racc/cparse/cparse.c + + * cparse/depend -> ext/racc/cparse/depend + + * cparse/extconf.rb -> ext/racc/cparse/extconf.rb + + * cparse/.cvsignore -> ext/racc/cparse/.cvsignore + +Sun Oct 12 15:10:13 2003 Minero Aoki <aamine@loveruby.net> + + * test/test.rb: use /bin/rm if exists. + +Sun Oct 12 14:33:29 2003 Minero Aoki <aamine@loveruby.net> + + * rubyloader.rb: imported from amstd, rev 1.5. + +Sun Oct 12 14:24:47 2003 Minero Aoki <aamine@loveruby.net> + + * boot.rb: reformat only. + + * compiler.rb: ditto. + + * grammar.rb: ditto. + + * in.raccp.rb: ditto. + + * iset.rb: ditto. + + * output.rb: ditto. + + * raccs.rb: ditto. + + * state.rb: ditto. + +Sun Oct 12 14:17:22 2003 Minero Aoki <aamine@loveruby.net> + + * test/test.rb: refactoring. + +Tue Jun 24 03:14:01 2003 Minero Aoki <aamine@as600.loveruby.net> + + * ucodep.rb: typo: Grammer -> Grammar + +Mon May 26 23:06:58 2003 Minero Aoki <aamine@loveruby.net> + + * compiler.rb: update copyright year. + + * grammar.rb: ditto. + + * in.raccp.rb: ditto. + + * info.rb: ditto. + + * iset.rb: ditto. + + * output.rb: ditto. + + * parser.rb: ditto. + + * raccs.rb: ditto. + + * state.rb: ditto. + + * ucodep.rb: ditto. + +Sun May 25 13:21:27 2003 Minero Aoki <aamine@loveruby.net> + + * raccs.rb: update coding style. + +Fri Nov 15 17:53:12 2002 Minero Aoki <aamine@loveruby.net> + + * racc: changes style. + + * parser.rb: ditto. + +Fri Nov 15 17:11:52 2002 Minero Aoki <aamine@loveruby.net> + + version 1.4.3. + +Fri Nov 15 17:08:01 2002 Minero Aoki <aamine@loveruby.net> + + * boot.rb, compiler.rb, grammar.rb, in.raccp.rb, iset.rb, + output.rb, parser.rb, racc, raccs.rb, state.rb, ucodep.rb, + misc/racc2y, misc/y2racc: follows (my) latest coding styles. + +Thu Nov 14 14:39:53 2002 Minero Aoki <aamine@loveruby.net> + + * raccs.rb: explicit method call for VCALL. + +Wed Oct 16 15:45:11 2002 Minero Aoki <aamine@loveruby.net> + + * parser.rb: reformat. + +Fri Aug 9 18:21:01 2002 Minero Aoki <aamine@loveruby.net> + + * cparse/cparse.c: use better variable/macro names. + +Wed Aug 7 08:39:19 2002 Minero Aoki <aamine@loveruby.net> + + * cparse/cparse.c: goto label requires stmt. + +Mon Aug 5 21:53:07 2002 Minero Aoki <aamine@loveruby.net> + + * cparse/cparse.c: grand refine. + + * cparse/depend: re-added from ruby/ext/racc/cparse. + +Tue Jun 4 00:15:28 2002 Minero Aoki <aamine@loveruby.net> + + * boot.rb: allow to omit last 'end'. + +Mon Jun 3 23:29:45 2002 Minero Aoki <aamine@loveruby.net> + + * racc (write_table_file): shebang must placed on first line. + (reported by Hiroyuki Sato) + diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/README.ja.rdoc b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/README.ja.rdoc new file mode 100644 index 000000000000..33aebb40d27e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/README.ja.rdoc @@ -0,0 +1,95 @@ += Racc + +* http://i.loveruby.net/en/projects/racc/ +* http://racc.rubyforge.org/ + +== DESCRIPTION: + + Racc は LALR(1) パーサジェネレータです。 + yacc の Ruby 版に相当します。 + + NOTE: + Ruby 1.8.0 からは Racc のランタイムが標準添付されているので、 + Racc で生成したパーサを安心して配布できます。また Ruby 1.6 系に + 対応させたい場合は racc -E で生成してください。 + + +== 必要環境 + + * Ruby 1.8 以降 + (*) C コンパイラと make + + +== インストール + + gem インストール: + + $ gem install racc + + setup.rb インストル: + + パッケージのトップディレクトリで次のように入力してください。 + ($ は通常ユーザ、# はルートのプロンプトです) + + $ ruby setup.rb config + $ ruby setup.rb setup + ($ su) + # ruby setup.rb install + + これで通常のパスに Racc がインストールされます。自分の好き + なディレクトリにインストールしたいときは、setup.rb config に + 各種オプションをつけて実行してください。オプションのリストは + + $ ruby setup.rb --help + + で見られます。 + + + コンパイラがない場合 + -------------------- + + config を以下のようにすれば、拡張モジュールなしで + インストールできます。 + + $ ruby setup.rb config --without-ext + + +== テスト + + sample/ 以下にいくつか Racc の文法ファイルのサンプルが用意 + してあります。動くのも動かないのもありますが、少なくとも + calc-ja.y は動くのでこれを処理してみましょう。Racc をインス + トールしたあと + + $ racc -ocalc.rb calc-ja.y + + として下さい。処理は一瞬から数秒で終わるので、 + + $ ruby calc.rb + + を実行してください。ちゃんと動いてますか? + + Racc の文法など詳しいことは doc.ja/ ディレクトリ以下の HTML を + 見てください。 + + +== ライセンス + + このパッケージに付属するファイルの著作権は青木峰郎が保持します。 + ライセンスは Ruby ライセンスです。ただしユーザが書いた規則 + ファイルや、Racc がそこから生成した Ruby スクリプトはその対象 + 外です。好きなライセンスで配布してください。 + + +== バグなど + + Racc を使っていてバグらしき現象に遭遇したら、下記のアドレスまで + メールをください。作者にはバグを修正する義務はありませんがその + 意思はあります。また、そのときはできるだけバグを再現できる文法 + ファイルを付けてください。 + + + 青木峰郎(あおきみねろう) + aamine@loveruby.net + http://i.loveruby.net + diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/README.rdoc b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/README.rdoc new file mode 100644 index 000000000000..25fbb0ab5a36 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/README.rdoc @@ -0,0 +1,84 @@ += Racc + +* http://i.loveruby.net/en/projects/racc/ +* http://racc.rubyforge.org/ + +== DESCRIPTION: + + Racc is a LALR(1) parser generator. + It is written in Ruby itself, and generates Ruby program. + + NOTE: Ruby 1.8.x comes with Racc runtime module. You + can run your parsers generated by racc 1.4.x out of the + box. + + +== Requirement + + * Ruby 1.8.x or later. + +== Installation + + gem install: + + $ gem install racc + + setup.rb install: + + Type this in the top directory of the extracted archive: + + $ ruby setup.rb config + $ ruby setup.rb setup + ($ su) + # ruby setup.rb install + + You can install Racc into your favorite directory by giving + options to setup.rb. e.g. + + $ ruby setup.rb config --prefix=/usr + + For details, try "ruby setup.rb --help". + + + If you don't have C Compiler + ---------------------------- + + You can install Racc without C compilers. Type following + command in config phase. + + $ ruby setup.rb config --without-ext + + +== Testing Racc + + Racc comes with simple calculator. To compile this, on shell: + + $ racc -o calc calc.y + + This process costs few seconds (or less). Then type: + + $ ruby calc + + ... Does it works? + For details of Racc, see HTML documents placed under 'doc.en/' + and sample grammer files under 'sample/'. + + +== License + + Racc is distributed under the same terms of ruby. + (see the file COPYING). Note that you do NOT need to follow + ruby license for your own parser (racc outputs). + You can distribute those files under any licenses you want. + + +== Bug Reports + + Any kind of bug reports are welcome. + If you find a bug of Racc, please email me. Your grammer file, + debug output genereted by "racc -g", are helpful. + + + Minero Aoki + aamine@loveruby.net + http://i.loveruby.net diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/Rakefile b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/Rakefile new file mode 100644 index 000000000000..e956eb177a62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/Rakefile @@ -0,0 +1,79 @@ +# -*- ruby -*- + +require "bundler/gem_tasks" + +require 'rdoc/task' + +RDoc::Task.new(:docs) do |rd| + spec = Gem::Specification.load("racc.gemspec") + rd.main = "README.en.rdoc" + rd.rdoc_files.include(spec.files.find_all { |file_name| + file_name =~ /^(bin|lib|ext)/ || file_name !~ /\// + }) + + title = "#{spec.name}-#{spec.version} Documentation" + + rd.options << "-t #{title}" +end + +require 'rake/testtask' + +Rake::TestTask.new(:test) do |t| + t.test_files = FileList["test/**/test_*.rb"] + if RUBY_VERSION >= "2.6" + t.ruby_opts = %w[--enable-frozen-string-literal --debug=frozen-string-literal] + end +end +gem 'rake-compiler', '>= 0.4.1' + +def java? + /java/ === RUBY_PLATFORM +end +def jruby? + Object.const_defined?(:RUBY_ENGINE) and 'jruby' == RUBY_ENGINE +end + +file 'lib/racc/parser-text.rb' => ['lib/racc/parser.rb'] do |t| + source = 'lib/racc/parser.rb' + + open(t.name, 'wb') { |io| + io.write(<<-eorb) +module Racc + PARSER_TEXT = <<'__end_of_file__' +#{File.read(source)} +__end_of_file__ +end + eorb + } +end + +if jruby? + # JRUBY + require "rake/javaextensiontask" + Rake::JavaExtensionTask.new("cparse") do |ext| + jruby_home = RbConfig::CONFIG['prefix'] + ext.lib_dir = File.join 'lib', 'racc' + ext.ext_dir = File.join 'ext', 'racc' + # source/target jvm + ext.source_version = '1.6' + ext.target_version = '1.6' + jars = ["#{jruby_home}/lib/jruby.jar"] + FileList['lib/*.jar'] + ext.classpath = jars.map { |x| File.expand_path x }.join( ':' ) + ext.name = 'cparse-jruby' + end + + task :compile => ['lib/racc/parser-text.rb'] +else + # MRI + require "rake/extensiontask" + Rake::ExtensionTask.new "cparse" do |ext| + ext.lib_dir = File.join 'lib', 'racc' + ext.ext_dir = File.join 'ext', 'racc', 'cparse' + end + + task :compile => 'lib/racc/parser-text.rb' +end + +task :build => "lib/racc/parser-text.rb" + +task :test => :compile diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/TODO b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/TODO new file mode 100644 index 000000000000..8e68e6e4d68e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/TODO @@ -0,0 +1,5 @@ +* check 'error' token handling. +* interactive transition table monitor. +* support backtracking. +* output Ruby extention library? +* LL(k)? (But it should not be called Racc) diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/bin/racc b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/bin/racc new file mode 100644 index 000000000000..4507d049625c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/bin/racc @@ -0,0 +1,320 @@ +#!/usr/bin/env ruby +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". + +require 'racc/static' +require 'optparse' + +def main + output = nil + debug_parser = false + make_logfile = false + logfilename = nil + make_executable = false + rubypath = nil + embed_runtime = false + debug_flags = Racc::DebugFlags.new + line_convert = true + line_convert_all = false + omit_action_call = true + superclass = nil + check_only = false + verbose = false + profiler = RaccProfiler.new(false) + + parser = OptionParser.new + parser.banner = "Usage: #{File.basename($0)} [options] <input>" + parser.on('-o', '--output-file=PATH', + 'output file name [<input>.tab.rb]') {|name| + output = name + } + parser.on('-t', '--debug', 'Outputs debugging parser.') {|fl| + debug_parser = fl + } + parser.on('-g', 'Equivalent to -t (obsolete).') {|fl| + $stderr.puts "racc -g is obsolete. Use racc -t instead." if $VERBOSE + debug_parser = fl + } + parser.on('-v', '--verbose', + 'Creates <filename>.output log file.') {|fl| + make_logfile = fl + } + parser.on('-O', '--log-file=PATH', + 'Log file name [<input>.output]') {|path| + make_logfile = true + logfilename = path + } + parser.on('-e', '--executable [RUBYPATH]', 'Makes executable parser.') {|path| + make_executable = true + rubypath = (path == 'ruby' ? nil : path) + } + parser.on('-E', '--embedded', "Embeds Racc runtime in output.") { + embed_runtime = true + } + parser.on('--line-convert-all', 'Converts line numbers of user codes.') { + line_convert_all = true + } + parser.on('-l', '--no-line-convert', 'Never convert line numbers.') { + line_convert = false + line_convert_all = false + } + parser.on('-a', '--no-omit-actions', 'Never omit actions.') { + omit_action_call = false + } + parser.on('--superclass=CLASSNAME', + 'Uses CLASSNAME instead of Racc::Parser.') {|name| + superclass = name + } + parser.on('-C', '--check-only', 'Checks syntax and quit immediately.') {|fl| + check_only = fl + } + parser.on('-S', '--output-status', 'Outputs internal status time to time.') { + verbose = true + } + parser.on('-P', 'Enables generator profile') { + profiler = RaccProfiler.new(true) + } + parser.on('-D flags', "Flags for Racc debugging (do not use).") {|flags| + debug_flags = Racc::DebugFlags.parse_option_string(flags) + } + #parser.on('--no-extensions', 'Run Racc without any Ruby extension.') { + # Racc.const_set :Racc_No_Extensions, true + #} + parser.on('--version', 'Prints version and quit.') { + puts "racc version #{Racc::Version}" + exit 0 + } + parser.on('--runtime-version', 'Prints runtime version and quit.') { + printf "racc runtime version %s; %s\n", + Racc::Parser::Racc_Runtime_Version, + if Racc::Parser.racc_runtime_type == 'ruby' + sprintf('ruby core version %s', + Racc::Parser::Racc_Runtime_Core_Version_R) + else + sprintf('c core version %s', + Racc::Parser::Racc_Runtime_Core_Version_C) + end + exit 0 + } + parser.on('--copyright', 'Prints copyright and quit.') { + puts Racc::Copyright + exit 0 + } + parser.on('--help', 'Prints this message and quit.') { + puts parser.help + exit 1 + } + begin + parser.parse! + rescue OptionParser::ParseError => err + $stderr.puts err.message + $stderr.puts parser.help + exit 1 + end + if ARGV.empty? + $stderr.puts 'no input' + exit 1 + end + if ARGV.size > 1 + $stderr.puts 'too many input' + exit 1 + end + input = ARGV[0] + + begin + $stderr.puts 'Parsing grammar file...' if verbose + result = profiler.section('parse') { + parser = Racc::GrammarFileParser.new(debug_flags) + parser.parse(File.read(input), File.basename(input)) + } + if check_only + $stderr.puts 'syntax ok' + exit 0 + end + + $stderr.puts 'Generating LALR states...' if verbose + states = profiler.section('nfa') { + Racc::States.new(result.grammar).nfa + } + + $stderr.puts "Resolving #{states.size} states..." if verbose + profiler.section('dfa') { + states.dfa + } + + $stderr.puts 'Creating parser file...' if verbose + params = result.params.dup + # Overwrites parameters given by a grammar file with command line options. + params.superclass = superclass if superclass + params.omit_action_call = true if omit_action_call + # From command line option + if make_executable + params.make_executable = true + params.interpreter = rubypath + end + params.debug_parser = debug_parser + params.convert_line = line_convert + params.convert_line_all = line_convert_all + params.embed_runtime = embed_runtime + profiler.section('generation') { + generator = Racc::ParserFileGenerator.new(states, params) + generator.generate_parser_file(output || make_filename(input, '.tab.rb')) + } + + if make_logfile + profiler.section('logging') { + $stderr.puts 'Creating log file...' if verbose + logfilename ||= make_filename(output || File.basename(input), '.output') + File.open(logfilename, 'w') {|f| + Racc::LogFileGenerator.new(states, debug_flags).output f + } + } + end + if debug_flags.status_logging + log_useless states.grammar + log_conflict states + else + has_useless = report_useless states.grammar + has_conflicts = report_conflict states + if has_useless || has_conflicts + preamble = make_logfile ? 'C' : 'Turn on logging with "-v" and c' + $stderr.puts %Q{#{preamble}heck ".output" file for details} + end + end + + profiler.report + rescue Racc::Error, Errno::ENOENT, Errno::EPERM => err + raise if $DEBUG or debug_flags.any? + lineno = err.message.slice(/\A\d+:/).to_s + $stderr.puts "#{File.basename $0}: #{input}:#{lineno} #{err.message.strip}" + exit 1 + end +end + +def make_filename(path, suffix) + path.sub(/(?:\..*?)?\z/, suffix) +end + +LIST_LIMIT = 10 +def report_list(enum, label) + c = enum.count + if c > 0 + $stderr.puts "#{c} #{label}:" + enum.first(LIST_LIMIT).each do |item| + $stderr.puts " #{yield item}" + end + $stderr.puts " ..." if c > LIST_LIMIT + end +end + +# @return [Boolean] if anything was reported +def report_conflict(states) + if states.should_report_srconflict? + reported = true + $stderr.puts "#{states.n_srconflicts} shift/reduce conflicts" + end + if states.rrconflict_exist? + reported = true + $stderr.puts "#{states.n_rrconflicts} reduce/reduce conflicts" + end + reported +end + +def log_conflict(states) + logging('w') {|f| + f.puts "ex#{states.grammar.n_expected_srconflicts}" + if states.should_report_srconflict? + f.puts "sr#{states.n_srconflicts}" + end + if states.rrconflict_exist? + f.puts "rr#{states.n_rrconflicts}" + end + } +end + +# @return [Boolean] if anything was reported +def report_useless(grammar) + reported = report_list(grammar.each_useless_nonterminal, 'useless nonterminals', &:to_s) + + reported ||= report_list(grammar.each_useless_rule, 'useless rules') { |r| "##{r.ident} (#{r.target})" } + + if grammar.start.useless? + $stderr.puts 'fatal: start symbol does not derive any sentence' + reported = true + end + reported +end + +def log_useless(grammar) + logging('a') {|f| + if grammar.useless_nonterminal_exist? + f.puts "un#{grammar.n_useless_nonterminals}" + end + if grammar.useless_rule_exist? + f.puts "ur#{grammar.n_useless_rules}" + end + } +end + +def logging(mode, &block) + File.open("log/#{File.basename(ARGV[0])}", mode, &block) +end + +class RaccProfiler + def initialize(really) + @really = really + @log = [] + unless ::Process.respond_to?(:times) + # Ruby 1.6 + @class = ::Time + else + @class = ::Process + end + end + + def section(name) + if @really + t1 = @class.times.utime + result = yield + t2 = @class.times.utime + @log.push [name, t2 - t1] + result + else + yield + end + end + + def report + return unless @really + f = $stderr + total = cumulative_time() + f.puts '--task-----------+--sec------+---%-' + @log.each do |name, time| + f.printf "%-19s %s %3d%%\n", name, pjust(time,4,4), (time/total*100).to_i + end + f.puts '-----------------+-----------+-----' + f.printf "%-20s%s\n", 'total', pjust(total,4,4) + end + + private + + def cumulative_time + t = @log.inject(0) {|sum, (name, time)| sum + time } + t == 0 ? 0.01 : t + end + + def pjust(num, i, j) + m = /(\d+)(\.\d+)?/.match(num.to_s) + str = m[1].rjust(i) + str.concat m[2].ljust(j+1)[0,j+1] if m[2] + str + end +end + +main diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/MANIFEST b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/MANIFEST new file mode 100644 index 000000000000..682793775023 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/MANIFEST @@ -0,0 +1,4 @@ +MANIFEST +cparse.c +depend +extconf.rb diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/com/headius/racc/Cparse.java b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/com/headius/racc/Cparse.java new file mode 100644 index 000000000000..27579c09b19c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/com/headius/racc/Cparse.java @@ -0,0 +1,849 @@ +/* + Cparse.java -- Racc Runtime Core for JRuby + + Copyright (c) 2016 Charles Oliver Nutter <headius@headius.com> + + Ported from and distributed under the same licence as cparse.c + + cparse.c -- Racc Runtime Core + + Copyright (c) 1999-2006 Minero Aoki + + This library is free software. + You can distribute/modify this program under the same terms of ruby. +*/ +package com.headius.racc; + +import org.jruby.Ruby; +import org.jruby.RubyArray; +import org.jruby.RubyBasicObject; +import org.jruby.RubyClass; +import org.jruby.RubyContinuation; +import org.jruby.RubyFixnum; +import org.jruby.RubyHash; +import org.jruby.RubyKernel; +import org.jruby.RubyModule; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.RubySymbol; +import org.jruby.anno.JRubyMethod; +import org.jruby.exceptions.JumpException; +import org.jruby.internal.runtime.methods.AttrReaderMethod; +import org.jruby.internal.runtime.methods.AttrWriterMethod; +import org.jruby.internal.runtime.methods.CallConfiguration; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.BlockCallback; +import org.jruby.runtime.CallBlock19; +import org.jruby.runtime.CallSite; +import org.jruby.runtime.Helpers; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.Signature; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.Library; + +public class Cparse implements Library { + public static final String RACC_VERSION = "1.4.15"; // TODO: parse from Cparse.c + + public enum TokenType { + DEFAULT(-1), + FINAL(0), + ERROR(1); + + private final int id; + TokenType(int id) { this.id = id; } + } + + private RubyFixnum vDEFAULT_TOKEN; + private RubyFixnum vERROR_TOKEN; + private RubyFixnum vFINAL_TOKEN; + + private RubyClass RaccBug; + private RubyClass CparseParams; + + private static final String ID_YYDEBUG = "@yydebug"; + private static final String ID_NEXTTOKEN = "next_token"; + private static final String ID_ONERROR = "on_error"; + private static final String ID_NOREDUCE = "_reduce_none"; + private static final String ID_ERRSTATUS = "@racc_error_status"; + + private static final String ID_D_SHIFT = "racc_shift"; + private static final String ID_D_REDUCE = "racc_reduce"; + private static final String ID_D_ACCEPT = "racc_accept"; + private static final String ID_D_READ_TOKEN = "racc_read_token"; + private static final String ID_D_NEXT_STATE = "racc_next_state"; + private static final String ID_D_E_POP = "racc_e_pop"; + + private RubySymbol sym_noreduce; + private CallSite call_nexttoken; + private CallSite call_onerror; + private CallSite call_d_shift; + private CallSite call_d_reduce; + private CallSite call_d_accept; + private CallSite call_d_read_token; + private CallSite call_d_next_state; + private CallSite call_d_e_pop; + + private static RubySymbol value_to_id(ThreadContext context, IRubyObject v) { + if (!(v instanceof RubySymbol)) { + throw context.runtime.newTypeError("not symbol"); + } + return (RubySymbol)v; + } + + private static int num_to_int(IRubyObject n) { + return assert_integer(n); + } + + private static IRubyObject AREF(ThreadContext context, IRubyObject s, int idx) { + return ((0 <= idx && idx < ((RubyArray)s).size()) ? ((RubyArray)s).entry(idx) : context.nil); + } + + private static IRubyObject get_stack_tail(ThreadContext context, RubyArray stack, int len) { + if (len < 0) return context.nil; + int size = stack.size(); + len = Math.min(len, size); + return stack.subseq(size - len, len); + } + + private static void cut_stack_tail(ThreadContext context, RubyArray stack, int len) { + while (len > 0) { + stack.pop(context); + len--; + } + } + + private static final int STACK_INIT_LEN = 64; + private static RubyArray NEW_STACK(ThreadContext context) { + return context.runtime.newArray(STACK_INIT_LEN); + } + private static IRubyObject PUSH(RubyArray stack, IRubyObject i) { + return stack.append(i); + } + private static IRubyObject POP(ThreadContext context, RubyArray stack) { + return stack.pop(context); + } + private static IRubyObject LAST_I(ThreadContext context, RubyArray stack) { + return stack.size() > 0 ? stack.last() : context.nil; + } + private static IRubyObject GET_TAIL(ThreadContext context, RubyArray stack, int len) { + return get_stack_tail(context, stack, len); + } + private static void CUT_TAIL(ThreadContext context, RubyArray stack, int len) { + cut_stack_tail(context, stack, len); + } + + static final int CP_FIN_ACCEPT = 1; + static final int CP_FIN_EOT = 2; + static final int CP_FIN_CANTPOP = 3; + + public class CparseParams extends RubyObject { + public CparseParams(Ruby runtime, RubyClass rubyClass) { + super(runtime, rubyClass); + } + + public void initialize_params(ThreadContext context, Parser parser, IRubyObject arg, IRubyObject lexer, IRubyObject lexmid) { + Ruby runtime = context.runtime; + this.parser = parser; + this.lexer = lexer; + if (!lexmid.isNil()) { + this.lexmid = value_to_id(context, lexmid); + this.call_lexmid = MethodIndex.getFunctionalCallSite(this.lexmid.toString()); + } + + this.debug = parser.getInstanceVariable(ID_YYDEBUG).isTrue(); + + RubyArray argAry = arg.convertToArray(); + if (!(13 <= argAry.size() && argAry.size() <= 14)) { + throw runtime.newRaiseException(RaccBug, "[Racc Bug] wrong arg.size " + argAry.size()); + } + this.action_table = assert_array(argAry.eltOk(0)); + this.action_check = assert_array(argAry.eltOk(1)); + this.action_default = assert_array(argAry.eltOk(2)); + this.action_pointer = assert_array(argAry.eltOk(3)); + this.goto_table = assert_array(argAry.eltOk(4)); + this.goto_check = assert_array(argAry.eltOk(5)); + this.goto_default = assert_array(argAry.eltOk(6)); + this.goto_pointer = assert_array(argAry.eltOk(7)); + this.nt_base = assert_integer(argAry.eltOk(8)); + this.reduce_table = assert_array(argAry.eltOk(9)); + this.token_table = assert_hash(argAry.eltOk(10)); + this.shift_n = assert_integer(argAry.eltOk(11)); + this.reduce_n = assert_integer(argAry.eltOk(12)); + if (argAry.size() > 13) { + this.use_result_var = argAry.eltOk(13).isTrue(); + } else { + this.use_result_var = true; + } + + this.tstack = this.debug ? NEW_STACK(context) : null; + this.vstack = NEW_STACK(context); + this.state = NEW_STACK(context); + this.curstate = 0; + PUSH(this.state, RubyFixnum.zero(runtime)); + this.t = runtime.newFixnum(TokenType.FINAL.id + 1); // must not init to FINAL_TOKEN + this.nerr = 0; + this.errstatus = 0; + this.parser.setInstanceVariable(ID_ERRSTATUS, runtime.newFixnum(this.errstatus)); + + this.retval = context.nil; + this.fin = 0; + + this.lex_is_iterator = false; + + parser.setInstanceVariable("@vstack", this.vstack); + if (this.debug) { + parser.setInstanceVariable("@tstack", this.tstack); + } + else { + parser.setInstanceVariable("@tstack", context.nil); + } + } + + public void extract_user_token(ThreadContext context, IRubyObject block_args, IRubyObject[] tokVal) { + if (block_args.isNil()) { + /* EOF */ + tokVal[0] = context.runtime.getFalse(); + tokVal[1] = context.runtime.newString("$"); + return; + } + + if (!(block_args instanceof RubyArray)) { + throw context.runtime.newTypeError( + (lex_is_iterator ? lexmid.asJavaString() : "next_token") + + " " + + (lex_is_iterator ? "yielded" : "returned") + + " " + + block_args.getMetaClass().getName() + + " (must be Array[2])"); + } + RubyArray block_args_ary = (RubyArray)block_args; + if (block_args_ary.size() != 2) { + throw context.runtime.newTypeError( + (lex_is_iterator ? lexmid.asJavaString() : "next_token") + + " " + + (lex_is_iterator ? "yielded" : "returned") + + " wrong size of array (" + + block_args_ary.size() + + " for 2)"); + } + tokVal[0] = ((RubyArray) block_args).eltOk(0); + tokVal[1] = ((RubyArray) block_args).eltOk(1); + } + + private static final int RESUME = 1; + private static final int NOTFOUND = 2; + private static final int ERROR_RECOVERED = 3; + private static final int ERROR = 4; + private static final int HANDLE_ACT = 5; + private static final int ACT_FIXED = 6; + private static final int ACCEPT = 7; + private static final int USER_YYERROR = 8; + private static final int ERROR_POP = 9; + private static final int TRANSIT = 9; + + private void SHIFT(ThreadContext context, int act, IRubyObject tok, IRubyObject val) { + shift(context, act, tok, val); + } + + public void parse_main(ThreadContext context, IRubyObject tok, IRubyObject val, boolean resume) { + Ruby runtime = context.runtime; + + int i = 0; /* table index */ + int act = 0; /* action type */ + IRubyObject act_value; /* action type, VALUE version */ + boolean read_next = true; /* true if we need to read next token */ + IRubyObject tmp; + + int branch = 0; + + if (resume) { + branch = RESUME; + } + + BRANCH: while (true) { + switch (branch) { + case 0: + + D_puts(""); + D_puts("---- enter new loop ----"); + D_puts(""); + + D_printf("(act) k1=%ld\n", this.curstate); + tmp = AREF(context, this.action_pointer, this.curstate); + if (tmp.isNil()) {branch = NOTFOUND; continue BRANCH;} + D_puts("(act) pointer[k1] ok"); + i = assert_integer(tmp); + + D_printf("read_next=%d\n", read_next); + if (read_next && (!this.t.equals(vFINAL_TOKEN))) { + if (this.lex_is_iterator) { + D_puts("resuming..."); + if (this.fin != 0) throw runtime.newArgumentError("token given after EOF"); + this.i = i; /* save i */ + return; + + // remainder of case duplicated from here for RESUME case + //D_puts(this, "resumed"); + //i = this.i; /* load i */ + } + else { + D_puts("next_token"); + tmp = call_nexttoken.call(context, this.parser, this.parser); + IRubyObject[] tokVal = {tok, val}; + extract_user_token(context, tmp, tokVal); + tok = tokVal[0]; + val = tokVal[1]; + } + /* convert token */ + this.t = ((RubyHash)this.token_table).op_aref(context, tok); + if (this.t.isNil()) { + this.t = vERROR_TOKEN; + } + D_printf("(act) t(k2)=%ld\n", assert_integer(this.t)); + if (this.debug) { + call_d_read_token.call(context, this.parser, this.parser, this.t, tok, val); + } + } + + // duplicated logic from above for RESUME case + case RESUME: + if (branch == RESUME) { + D_puts("resumed"); + i = this.i; /* load i */ + + /* convert token */ + this.t = ((RubyHash)this.token_table).op_aref(context, tok); + if (this.t.isNil()) { + this.t = vERROR_TOKEN; + } + D_printf("(act) t(k2)=%ld\n", assert_integer(this.t)); + if (this.debug) { + call_d_read_token.call(context, this.parser, this.parser, this.t, tok, val); + } + } + + read_next = false; + + i += assert_integer(this.t); + D_printf("(act) i=%ld\n", i); + if (i < 0) {branch = NOTFOUND; continue BRANCH;} + + act_value = AREF(context, this.action_table, i); + if (act_value.isNil()) {branch = NOTFOUND; continue BRANCH;} + act = assert_integer(act_value); + D_printf("(act) table[i]=%ld\n", act); + + tmp = AREF(context, this.action_check, i); + if (tmp.isNil()) {branch = NOTFOUND; continue BRANCH;} + if (assert_integer(tmp) != this.curstate) {branch = NOTFOUND; continue BRANCH;} + D_printf("(act) check[i]=%ld\n", assert_integer(tmp)); + + D_puts("(act) found"); + + case ACT_FIXED: + D_printf("act=%ld\n", act); + branch = HANDLE_ACT; continue BRANCH; + + case NOTFOUND: + D_puts("(act) not found: use default"); + act_value = AREF(context, this.action_default, this.curstate); + act = assert_integer(act_value); + branch = ACT_FIXED; continue BRANCH; + + case HANDLE_ACT: + if (act > 0 && act < this.shift_n) { + D_puts("shift"); + if (this.errstatus > 0) { + this.errstatus--; + this.parser.setInstanceVariable(ID_ERRSTATUS, runtime.newFixnum(this.errstatus)); + } + SHIFT(context, act, this.t, val); + read_next = true; + } + else if (act < 0 && act > -(this.reduce_n)) { + D_puts("reduce"); + { // macro REDUCE + switch (reduce(context, act)) { + case 0: /* normal */ + break; + case 1: /* yyerror */ + branch = USER_YYERROR; + continue BRANCH; + case 2: /* yyaccept */ + D_puts("u accept"); + branch = ACCEPT; + continue BRANCH; + default: + break; + } + } + } + else if (act == -(this.reduce_n)) { + branch = ERROR; continue BRANCH; + } + else if (act == this.shift_n) { + D_puts("accept"); + branch = ACCEPT; continue BRANCH; + } + else { + throw runtime.newRaiseException(RaccBug, "[Cparse Bug] unknown act value " + act); + } + + // fall through + case ERROR_RECOVERED: + + if (this.debug) { + call_d_next_state.call(context, this.parser, this.parser, runtime.newFixnum(this.curstate), this.state); + } + branch = 0; continue BRANCH; + + /* not reach */ + + case ACCEPT: + if (this.debug) call_d_accept.call(context, this.parser, this.parser); + this.retval = this.vstack.eltOk(0); + this.fin = CP_FIN_ACCEPT; + return; + + case ERROR: + D_printf("error detected, status=%ld\n", this.errstatus); + if (this.errstatus == 0) { + this.nerr++; + call_onerror.call(context, this.parser, this.parser, this.t, val, this.vstack); + } + + // fall through + case USER_YYERROR: + if (this.errstatus == 3) { + if (this.t.equals(vFINAL_TOKEN)) { + this.retval = runtime.getFalse(); + this.fin = CP_FIN_EOT; + return; + } + read_next = true; + } + this.errstatus = 3; + this.parser.setInstanceVariable(ID_ERRSTATUS, runtime.newFixnum(this.errstatus)); + + /* check if we can shift/reduce error token */ + D_printf("(err) k1=%ld\n", this.curstate); + D_printf("(err) k2=%d (error)\n", TokenType.ERROR.id); + + int branch2 = 0; + + BRANCH2: while (true) { + switch (branch2) { + case 0: + tmp = AREF(context, this.action_pointer, this.curstate); + if (tmp.isNil()) {branch2 = ERROR_POP; continue BRANCH2;} + D_puts("(err) pointer[k1] ok"); + + i = assert_integer(tmp) + TokenType.ERROR.id; + D_printf("(err) i=%ld\n", i); + if (i < 0) {branch2 = ERROR_POP; continue BRANCH2;} + + act_value = AREF(context, this.action_table, i); + if (act_value.isNil()) { + D_puts("(err) table[i] == nil"); + branch2 = ERROR_POP; continue BRANCH2; + } + act = assert_integer(act_value); + D_printf("(err) table[i]=%ld\n", act); + + tmp = AREF(context, this.action_check, i); + if (tmp.isNil()) { + D_puts("(err) check[i] == nil"); + branch2 = ERROR_POP; continue BRANCH2; + } + if (assert_integer(tmp) != this.curstate) { + D_puts("(err) check[i] != k1"); + branch2 = ERROR_POP; continue BRANCH2; + } + + D_puts("(err) found: can handle error token"); + break BRANCH2; + + case ERROR_POP: + D_puts("(err) act not found: can't handle error token; pop"); + + if (this.state.size() <= 1) { + this.retval = context.nil; + this.fin = CP_FIN_CANTPOP; + return; + } + POP(context, this.state); + POP(context, this.vstack); + this.curstate = assert_integer(LAST_I(context, this.state)); + if (this.debug) { + POP(context, this.tstack); + call_d_e_pop.call(context, this.parser, this.parser, this.state, this.tstack, this.vstack); + } + } + } + + /* shift/reduce error token */ + if (act > 0 && act < this.shift_n) { + D_puts("e shift"); + SHIFT(context, act, runtime.newFixnum(TokenType.ERROR.id), val); + } + else if (act < 0 && act > -(this.reduce_n)) { + D_puts("e reduce"); + { // macro REDUCE + switch (reduce(context, act)) { + case 0: /* normal */ + break; + case 1: /* yyerror */ + branch = USER_YYERROR; + continue BRANCH; + case 2: /* yyaccept */ + D_puts("u accept"); + branch = ACCEPT; + continue BRANCH; + default: + break; + } + } + } + else if (act == this.shift_n) { + D_puts("e accept"); + branch = ACCEPT; continue BRANCH; + } + else { + throw runtime.newRaiseException(RaccBug, "[Cparse Bug] unknown act value " + act); + } + branch = ERROR_RECOVERED; continue BRANCH; + } + } + } + + private void shift(ThreadContext context, int act, IRubyObject tok, IRubyObject val) { + PUSH(vstack, val); + if (debug) { + PUSH(tstack, tok); + call_d_shift.call(context, this.parser, this.parser, tok, tstack, vstack); + } + curstate = act; + PUSH(state, context.runtime.newFixnum(curstate)); + } + + private int reduce(ThreadContext context, int act) { + ruleno = -act * 3; + IRubyObject tag = context.runtime.newSymbol("racc_jump"); + IRubyObject code = RubyKernel.rbCatch19(context, this, + tag, + CallBlock19.newCallClosure(this, getMetaClass(), Signature.NO_ARGUMENTS, + new BlockCallback() { + @Override + public IRubyObject call(ThreadContext context, IRubyObject[] args, Block block) { + return reduce0(context); + } + }, context)); + errstatus = assert_integer(parser.getInstanceVariable(ID_ERRSTATUS)); + return assert_integer(code); + } + + private IRubyObject reduce0(ThreadContext context) { + Ruby runtime = context.runtime; + + IRubyObject reduce_to, reduce_len, method_id; + int len; + RubySymbol mid; + IRubyObject tmp, tmp_t = RubyBasicObject.UNDEF, tmp_v = RubyBasicObject.UNDEF; + int i, k1 = 0, k2; + IRubyObject goto_state = context.nil; + + reduce_len = this.reduce_table.entry(this.ruleno); + reduce_to = this.reduce_table.entry(this.ruleno+1); + method_id = this.reduce_table.entry(this.ruleno+2); + len = assert_integer(reduce_len); + mid = value_to_id(context, method_id); + + int branch = 0; + BRANCH: while (true) { + switch (branch) { + case 0: + + /* call action */ + if (len == 0) { + tmp = context.nil; + if (!mid.equals(sym_noreduce)) + tmp_v = runtime.newArray(); + if (this.debug) + tmp_t = runtime.newArray(); + } + else { + if (!mid.equals(sym_noreduce)) { + tmp_v = GET_TAIL(context, this.vstack, len); + tmp = ((RubyArray)tmp_v).entry(0); + } + else { + tmp = this.vstack.entry(this.vstack.size() - len); + } + CUT_TAIL(context, this.vstack, len); + if (this.debug) { + tmp_t = GET_TAIL(context, this.tstack, len); + CUT_TAIL(context, this.tstack, len); + } + CUT_TAIL(context, this.state, len); + } + if (!mid.equals(sym_noreduce)) { + if (this.use_result_var) { + tmp = Helpers.invoke(context, this.parser, mid.toString(), tmp_v, this.vstack, tmp); + } + else { + tmp = Helpers.invoke(context, this.parser, mid.toString(), tmp_v, this.vstack); + } + } + + /* then push result */ + PUSH(this.vstack, tmp); + if (this.debug) { + PUSH(this.tstack, reduce_to); + call_d_reduce.call(context, this.parser, this.parser, tmp_t, reduce_to, this.tstack, this.vstack); + } + + /* calculate transition state */ + if (state.size() == 0) + throw runtime.newRaiseException(RaccBug, "state stack unexpectedly empty"); + k2 = assert_integer(LAST_I(context, this.state)); + k1 = assert_integer(reduce_to) - this.nt_base; + D_printf("(goto) k1=%ld\n", k1); + D_printf("(goto) k2=%ld\n", k2); + + tmp = AREF(context, this.goto_pointer, k1); + if (tmp.isNil()) {branch = NOTFOUND; continue BRANCH;} + + i = assert_integer(tmp) + k2; + D_printf("(goto) i=%ld\n", i); + if (i < 0) {branch = NOTFOUND; continue BRANCH;} + + goto_state = AREF(context, this.goto_table, i); + if (goto_state.isNil()) { + D_puts("(goto) table[i] == nil"); + branch = NOTFOUND; continue BRANCH; + } + D_printf("(goto) table[i]=%ld (goto_state)\n", goto_state.convertToInteger().getLongValue()); + + tmp = AREF(context, this.goto_check, i); + if (tmp.isNil()) { + D_puts("(goto) check[i] == nil"); + branch = NOTFOUND; continue BRANCH; + } + if (!tmp.equals(runtime.newFixnum(k1))) { + D_puts("(goto) check[i] != table[i]"); + branch = NOTFOUND; continue BRANCH; + } + D_printf("(goto) check[i]=%ld\n", tmp.convertToInteger().getLongValue()); + + D_puts("(goto) found"); + + case TRANSIT: + PUSH(this.state, goto_state); + this.curstate = assert_integer(goto_state); + return RubyFixnum.zero(runtime); + + case NOTFOUND: + D_puts("(goto) not found: use default"); + /* overwrite `goto-state' by default value */ + goto_state = AREF(context, this.goto_default, k1); + branch = TRANSIT; continue BRANCH; + } + } + } + + private void D_puts(String msg) { + if (sys_debug) { + System.out.println(msg); + } + } + + private void D_printf(String fmt, long arg) { + if (sys_debug) { + System.out.println(fmt + ": " + arg); + } + } + + private void D_printf(String fmt, boolean arg) { + if (sys_debug) { + System.out.println(fmt + ": " + arg); + } + } + + Parser parser; /* parser object */ + + boolean lex_is_iterator; + IRubyObject lexer; /* scanner object */ + RubySymbol lexmid; /* name of scanner method (must be an iterator) */ + CallSite call_lexmid; /* call site for scanner method */ + + /* State transition tables (immutable) + Data structure is from Dragon Book 4.9 */ + /* action table */ + IRubyObject action_table; + IRubyObject action_check; + IRubyObject action_default; + IRubyObject action_pointer; + /* goto table */ + IRubyObject goto_table; + IRubyObject goto_check; + IRubyObject goto_default; + IRubyObject goto_pointer; + + int nt_base; /* NonTerminal BASE index */ + RubyArray reduce_table; /* reduce data table */ + IRubyObject token_table; /* token conversion table */ + + /* parser stacks and parameters */ + RubyArray state; + int curstate; + RubyArray vstack; + RubyArray tstack; + IRubyObject t; + int shift_n; + int reduce_n; + int ruleno; + + int errstatus; /* nonzero in error recovering mode */ + int nerr; /* number of error */ + + boolean use_result_var; + + IRubyObject retval; /* return IRubyObject of parser routine */ + int fin; /* parse result status */ + + boolean debug; /* user level debug */ + boolean sys_debug; /* system level debug */ + + int i; /* table index */ + } + + private static RubyArray assert_array(IRubyObject a) { + return a.convertToArray(); + } + + private static RubyHash assert_hash(IRubyObject h) { + return h.convertToHash(); + } + + private static int assert_integer(IRubyObject i) { + return (int)i.convertToInteger().getLongValue(); + } + + public class Parser extends RubyObject { + public Parser(Ruby runtime, RubyClass rubyClass) { + super(runtime, rubyClass); + } + + public static final String Racc_Runtime_Core_Version_C = RACC_VERSION; + public static final String Racc_Runtime_Core_Id_C = "$originalId: cparse.c,v 1.8 2006/07/06 11:39:46 aamine Exp $"; + + @JRubyMethod(name = "_racc_do_parse_c", frame = true) + public IRubyObject racc_cparse(ThreadContext context, IRubyObject arg, IRubyObject sysdebug) { + CparseParams v = new CparseParams(context.runtime, CparseParams); + + v.D_puts("starting cparse"); + v.sys_debug = sysdebug.isTrue(); + v.initialize_params(context, this, arg, context.nil, context.nil); + v.lex_is_iterator = false; + v.parse_main(context, context.nil, context.nil, false); + + return v.retval; + } + + @JRubyMethod(name = "_racc_yyparse_c", frame = true, required = 4) + public IRubyObject racc_yyparse(ThreadContext context, IRubyObject[] args) { + Ruby runtime = context.runtime; + CparseParams v = new CparseParams(context.runtime, CparseParams); + + IRubyObject lexer = args[0], lexmid = args[1], arg = args[2], sysdebug = args[3]; + + v.sys_debug = sysdebug.isTrue(); + v.D_puts("start C yyparse"); + v.initialize_params(context, this, arg, lexer, lexmid); + v.lex_is_iterator = true; + v.D_puts("params initialized"); + v.parse_main(context, context.nil, context.nil, false); + call_lexer(context, v); + if (v.fin == 0) { + throw runtime.newArgumentError(v.lexmid + " is finished before EndOfToken"); + } + + return v.retval; + } + + private class LexerUnroll extends RuntimeException { + public Throwable fillInStackTrace() { + return this; + } + } + + private void call_lexer(ThreadContext context, final CparseParams v) { + final LexerUnroll lexerUnroll = new LexerUnroll(); + try { + v.call_lexmid.call(context, v.lexer, v.lexer, CallBlock19.newCallClosure(v, v.getMetaClass(), Arity.ONE_ARGUMENT, new BlockCallback() { + @Override + public IRubyObject call(ThreadContext context, IRubyObject[] args, Block block) { + Ruby runtime = context.getRuntime(); + if (v.fin != 0) { + throw runtime.newArgumentError("extra token after EndOfToken"); + } + IRubyObject[] tokVal = {null, null}; + v.extract_user_token(context, args[0], tokVal); + v.parse_main(context, tokVal[0], tokVal[1], true); + if (v.fin != 0 && v.fin != CP_FIN_ACCEPT) { + throw lexerUnroll; + } + + return context.nil; + } + }, context)); + } catch (LexerUnroll maybeOurs) { + if (maybeOurs.equals(lexerUnroll)) { + return; + } + } + } + } + + public void load(Ruby runtime, boolean wrap) { + RubyModule racc = runtime.getOrCreateModule("Racc"); + RubyClass parser = racc.defineOrGetClassUnder("Parser", runtime.getObject()); + parser.setAllocator(new ObjectAllocator() { + @Override + public IRubyObject allocate(Ruby ruby, RubyClass rubyClass) { + return new Parser(ruby, rubyClass); + } + }); + + parser.defineAnnotatedMethods(Parser.class); + + parser.defineConstant("Racc_Runtime_Core_Version_C", runtime.newString(Parser.Racc_Runtime_Core_Version_C)); + parser.defineConstant("Racc_Runtime_Core_Id_C", runtime.newString(Parser.Racc_Runtime_Core_Id_C)); + + CparseParams = racc.defineClassUnder("CparseParams", runtime.getObject(), new ObjectAllocator() { + @Override + public IRubyObject allocate(Ruby ruby, RubyClass rubyClass) { + return new CparseParams(ruby, rubyClass); + } + }); + + RaccBug = runtime.getRuntimeError(); + sym_noreduce = runtime.newSymbol(ID_NOREDUCE); + call_nexttoken = MethodIndex.getFunctionalCallSite(ID_NEXTTOKEN); + call_onerror = MethodIndex.getFunctionalCallSite(ID_ONERROR); + call_d_shift = MethodIndex.getFunctionalCallSite(ID_D_SHIFT); + call_d_reduce = MethodIndex.getFunctionalCallSite(ID_D_REDUCE); + call_d_accept = MethodIndex.getFunctionalCallSite(ID_D_ACCEPT); + call_d_read_token = MethodIndex.getFunctionalCallSite(ID_D_READ_TOKEN); + call_d_next_state = MethodIndex.getFunctionalCallSite(ID_D_NEXT_STATE); + call_d_e_pop = MethodIndex.getFunctionalCallSite(ID_D_E_POP); + + vDEFAULT_TOKEN = runtime.newFixnum(TokenType.DEFAULT.id); + vERROR_TOKEN = runtime.newFixnum(TokenType.ERROR.id); + vFINAL_TOKEN = runtime.newFixnum(TokenType.FINAL.id); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/.sitearchdir.-.racc.time b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/.sitearchdir.-.racc.time new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/Makefile b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/Makefile new file mode 100644 index 000000000000..d151caa0f0ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/Makefile @@ -0,0 +1,263 @@ + +SHELL = /bin/sh + +# V=0 quiet, V=1 verbose. other values don't work. +V = 0 +Q1 = $(V:1=) +Q = $(Q1:0=@) +ECHO1 = $(V:1=@ :) +ECHO = $(ECHO1:0=@ echo) +NULLCMD = : + +#### Start of system configuration section. #### + +srcdir = . +topdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0 +hdrdir = $(topdir) +arch_hdrdir = /home/app/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux +PATH_SEPARATOR = : +VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby +prefix = $(DESTDIR)/home/app/.rbenv/versions/2.5.1 +rubysitearchprefix = $(rubylibprefix)/$(sitearch) +rubyarchprefix = $(rubylibprefix)/$(arch) +rubylibprefix = $(libdir)/$(RUBY_BASE_NAME) +exec_prefix = $(prefix) +vendorarchhdrdir = $(vendorhdrdir)/$(sitearch) +sitearchhdrdir = $(sitehdrdir)/$(sitearch) +rubyarchhdrdir = $(rubyhdrdir)/$(arch) +vendorhdrdir = $(rubyhdrdir)/vendor_ruby +sitehdrdir = $(rubyhdrdir)/site_ruby +rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME) +vendorarchdir = $(vendorlibdir)/$(sitearch) +vendorlibdir = $(vendordir)/$(ruby_version) +vendordir = $(rubylibprefix)/vendor_ruby +sitearchdir = $(DESTDIR)./.gem.20211005-8-19cl0e +sitelibdir = $(DESTDIR)./.gem.20211005-8-19cl0e +sitedir = $(rubylibprefix)/site_ruby +rubyarchdir = $(rubylibdir)/$(arch) +rubylibdir = $(rubylibprefix)/$(ruby_version) +sitearchincludedir = $(includedir)/$(sitearch) +archincludedir = $(includedir)/$(arch) +sitearchlibdir = $(libdir)/$(sitearch) +archlibdir = $(libdir)/$(arch) +ridir = $(datarootdir)/$(RI_BASE_NAME) +mandir = $(datarootdir)/man +localedir = $(datarootdir)/locale +libdir = $(exec_prefix)/lib +psdir = $(docdir) +pdfdir = $(docdir) +dvidir = $(docdir) +htmldir = $(docdir) +infodir = $(datarootdir)/info +docdir = $(datarootdir)/doc/$(PACKAGE) +oldincludedir = $(DESTDIR)/usr/include +includedir = $(prefix)/include +localstatedir = $(prefix)/var +sharedstatedir = $(prefix)/com +sysconfdir = $(prefix)/etc +datadir = $(datarootdir) +datarootdir = $(prefix)/share +libexecdir = $(exec_prefix)/libexec +sbindir = $(exec_prefix)/sbin +bindir = $(exec_prefix)/bin +archdir = $(rubyarchdir) + + +CC = gcc +CXX = g++ +LIBRUBY = $(LIBRUBY_SO) +LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a +LIBRUBYARG_SHARED = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME) +LIBRUBYARG_STATIC = -Wl,-rpath,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static +empty = +OUTFLAG = -o $(empty) +COUTFLAG = -o $(empty) +CSRCFLAG = $(empty) + +RUBY_EXTCONF_H = +cflags = $(optflags) $(debugflags) $(warnflags) +cxxflags = $(optflags) $(debugflags) $(warnflags) +optflags = -O3 +debugflags = -ggdb3 +warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wimplicit-fallthrough=0 -Wduplicated-cond -Wrestrict +CCDLFLAGS = -fPIC +CFLAGS = $(CCDLFLAGS) $(cflags) -fPIC $(ARCH_FLAG) +INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) +DEFS = +CPPFLAGS = -DHAVE_RB_ARY_SUBSEQ -I/home/app/.rbenv/versions/2.5.1/include $(DEFS) $(cppflags) +CXXFLAGS = $(CCDLFLAGS) $(cxxflags) $(ARCH_FLAG) +ldflags = -L. -L/home/app/.rbenv/versions/2.5.1/lib -fstack-protector -rdynamic -Wl,-export-dynamic +dldflags = -L/home/app/.rbenv/versions/2.5.1/lib -Wl,--compress-debug-sections=zlib +ARCH_FLAG = +DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) +LDSHARED = $(CC) -shared +LDSHAREDXX = $(CXX) -shared +AR = ar +EXEEXT = + +RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) +RUBY_SO_NAME = ruby +RUBYW_INSTALL_NAME = +RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version) +RUBYW_BASE_NAME = rubyw +RUBY_BASE_NAME = ruby + +arch = x86_64-linux +sitearch = $(arch) +ruby_version = 2.5.0 +ruby = $(bindir)/$(RUBY_BASE_NAME) +RUBY = $(ruby) +ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h + +RM = rm -f +RM_RF = $(RUBY) -run -e rm -- -rf +RMDIRS = rmdir --ignore-fail-on-non-empty -p +MAKEDIRS = /usr/bin/mkdir -p +INSTALL = /usr/bin/install -c +INSTALL_PROG = $(INSTALL) -m 0755 +INSTALL_DATA = $(INSTALL) -m 644 +COPY = cp +TOUCH = exit > + +#### End of system configuration section. #### + +preload = +libpath = . $(libdir) +LIBPATH = -L. -L$(libdir) -Wl,-rpath,$(libdir) +DEFFILE = + +CLEANFILES = mkmf.log +DISTCLEANFILES = +DISTCLEANDIRS = + +extout = +extout_prefix = +target_prefix = /racc +LOCAL_LIBS = +LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc +ORIG_SRCS = cparse.c +SRCS = $(ORIG_SRCS) +OBJS = cparse.o +HDRS = +LOCAL_HDRS = +TARGET = cparse +TARGET_NAME = cparse +TARGET_ENTRY = Init_$(TARGET_NAME) +DLLIB = $(TARGET).so +EXTSTATIC = +STATIC_LIB = + +TIMESTAMP_DIR = . +BINDIR = $(bindir) +RUBYCOMMONDIR = $(sitedir)$(target_prefix) +RUBYLIBDIR = $(sitelibdir)$(target_prefix) +RUBYARCHDIR = $(sitearchdir)$(target_prefix) +HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) +ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) +TARGET_SO_DIR = +TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) +CLEANLIBS = $(TARGET_SO) +CLEANOBJS = *.o *.bak + +all: $(DLLIB) +static: $(STATIC_LIB) +.PHONY: all install static install-so install-rb +.PHONY: clean clean-so clean-static clean-rb + +clean-static:: +clean-rb-default:: +clean-rb:: +clean-so:: +clean: clean-so clean-static clean-rb-default clean-rb + -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time + +distclean-rb-default:: +distclean-rb:: +distclean-so:: +distclean-static:: +distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb + -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log + -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) + -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true + +realclean: distclean +install: install-so install-rb + +install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.-.racc.time + $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) +clean-static:: + -$(Q)$(RM) $(STATIC_LIB) +install-rb: pre-install-rb do-install-rb install-rb-default +install-rb-default: pre-install-rb-default do-install-rb-default +pre-install-rb: Makefile +pre-install-rb-default: Makefile +do-install-rb: +do-install-rb-default: +pre-install-rb-default: + @$(NULLCMD) +$(TIMESTAMP_DIR)/.sitearchdir.-.racc.time: + $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) + $(Q) $(TOUCH) $@ + +site-install: site-install-so site-install-rb +site-install-so: install-so +site-install-rb: install-rb + +.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S + +.cc.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cc.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.mm.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.mm.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cxx.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cxx.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.cpp.o: + $(ECHO) compiling $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.cpp.S: + $(ECHO) translating $(<) + $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.c.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.c.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +.m.o: + $(ECHO) compiling $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< + +.m.S: + $(ECHO) translating $(<) + $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< + +$(TARGET_SO): $(OBJS) Makefile + $(ECHO) linking shared-object racc/$(DLLIB) + -$(Q)$(RM) $(@) + $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) + + + +$(OBJS): $(HDRS) $(ruby_headers) diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/cparse.c b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/cparse.c new file mode 100644 index 000000000000..8614c10e0909 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/cparse.c @@ -0,0 +1,863 @@ +/* + + cparse.c -- Racc Runtime Core + + Copyright (c) 1999-2006 Minero Aoki + + This library is free software. + You can distribute/modify this program under the same terms of ruby. + + $originalId: cparse.c,v 1.8 2006/07/06 11:39:46 aamine Exp $ + +*/ + +#include <ruby.h> + +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif + +/* ----------------------------------------------------------------------- + Important Constants +----------------------------------------------------------------------- */ + +#define RACC_VERSION "1.4.15" + +#define DEFAULT_TOKEN -1 +#define ERROR_TOKEN 1 +#define FINAL_TOKEN 0 + +#define vDEFAULT_TOKEN INT2FIX(DEFAULT_TOKEN) +#define vERROR_TOKEN INT2FIX(ERROR_TOKEN) +#define vFINAL_TOKEN INT2FIX(FINAL_TOKEN) + +/* ----------------------------------------------------------------------- + File Local Variables +----------------------------------------------------------------------- */ + +static VALUE RaccBug; +static VALUE CparseParams; + +static ID id_yydebug; +static ID id_nexttoken; +static ID id_onerror; +static ID id_noreduce; +static ID id_errstatus; + +static ID id_d_shift; +static ID id_d_reduce; +static ID id_d_accept; +static ID id_d_read_token; +static ID id_d_next_state; +static ID id_d_e_pop; + +/* ----------------------------------------------------------------------- + Utils +----------------------------------------------------------------------- */ + +/* For backward compatibility */ +#ifndef ID2SYM +# define ID2SYM(i) ULONG2NUM(i) +#endif +#ifndef SYM2ID +# define SYM2ID(v) ((ID)NUM2ULONG(v)) +#endif +#ifndef SYMBOL_P +# define SYMBOL_P(v) FIXNUM_P(v) +#endif +#ifndef LONG2NUM +# define LONG2NUM(i) INT2NUM(i) +#endif + +#ifndef HAVE_RB_ARY_SUBSEQ +# define rb_ary_subseq(ary, beg, len) rb_ary_new4(len, RARRAY_PTR(ary) + beg) +#endif + +static ID value_to_id _((VALUE v)); +static inline long num_to_long _((VALUE n)); + +static ID +value_to_id(VALUE v) +{ + if (! SYMBOL_P(v)) { + rb_raise(rb_eTypeError, "not symbol"); + } + return SYM2ID(v); +} + +static inline long +num_to_long(VALUE n) +{ + return NUM2LONG(n); +} + +#define AREF(s, idx) \ + ((0 <= idx && idx < RARRAY_LEN(s)) ? rb_ary_entry(s, idx) : Qnil) + +/* ----------------------------------------------------------------------- + Parser Stack Interfaces +----------------------------------------------------------------------- */ + +static VALUE get_stack_tail _((VALUE stack, long len)); +static void cut_stack_tail _((VALUE stack, long len)); + +static VALUE +get_stack_tail(VALUE stack, long len) +{ + if (len < 0) return Qnil; /* system error */ + if (len > RARRAY_LEN(stack)) len = RARRAY_LEN(stack); + return rb_ary_subseq(stack, RARRAY_LEN(stack) - len, len); +} + +static void +cut_stack_tail(VALUE stack, long len) +{ + while (len > 0) { + rb_ary_pop(stack); + len--; + } +} + +#define STACK_INIT_LEN 64 +#define NEW_STACK() rb_ary_new2(STACK_INIT_LEN) +#define PUSH(s, i) rb_ary_store(s, RARRAY_LEN(s), i) +#define POP(s) rb_ary_pop(s) +#define LAST_I(s) \ + ((RARRAY_LEN(s) > 0) ? rb_ary_entry(s, RARRAY_LEN(s) - 1) : Qnil) +#define GET_TAIL(s, len) get_stack_tail(s, len) +#define CUT_TAIL(s, len) cut_stack_tail(s, len) + +/* ----------------------------------------------------------------------- + struct cparse_params +----------------------------------------------------------------------- */ + +struct cparse_params { + VALUE value_v; /* VALUE version of this struct */ + + VALUE parser; /* parser object */ + + int lex_is_iterator; + VALUE lexer; /* scanner object */ + ID lexmid; /* name of scanner method (must be an iterator) */ + + /* State transition tables (immutable) + Data structure is from Dragon Book 4.9 */ + /* action table */ + VALUE action_table; + VALUE action_check; + VALUE action_default; + VALUE action_pointer; + /* goto table */ + VALUE goto_table; + VALUE goto_check; + VALUE goto_default; + VALUE goto_pointer; + + long nt_base; /* NonTerminal BASE index */ + VALUE reduce_table; /* reduce data table */ + VALUE token_table; /* token conversion table */ + + /* parser stacks and parameters */ + VALUE state; + long curstate; + VALUE vstack; + VALUE tstack; + VALUE t; + long shift_n; + long reduce_n; + long ruleno; + + long errstatus; /* nonzero in error recovering mode */ + long nerr; /* number of error */ + + int use_result_var; + + VALUE retval; /* return value of parser routine */ + long fin; /* parse result status */ +#define CP_FIN_ACCEPT 1 +#define CP_FIN_EOT 2 +#define CP_FIN_CANTPOP 3 + + int debug; /* user level debug */ + int sys_debug; /* system level debug */ + + long i; /* table index */ +}; + +/* ----------------------------------------------------------------------- + Parser Main Routines +----------------------------------------------------------------------- */ + +static VALUE racc_cparse _((VALUE parser, VALUE arg, VALUE sysdebug)); +static VALUE racc_yyparse _((VALUE parser, VALUE lexer, VALUE lexmid, + VALUE arg, VALUE sysdebug)); + +static void call_lexer _((struct cparse_params *v)); +static VALUE lexer_i _((RB_BLOCK_CALL_FUNC_ARGLIST(block_args, data))); + +static VALUE assert_array _((VALUE a)); +static long assert_integer _((VALUE n)); +static VALUE assert_hash _((VALUE h)); +static VALUE initialize_params _((VALUE vparams, VALUE parser, VALUE arg, + VALUE lexer, VALUE lexmid)); +static void cparse_params_mark _((void *ptr)); +static size_t cparse_params_memsize _((const void *ptr)); + +static void parse_main _((struct cparse_params *v, + VALUE tok, VALUE val, int resume)); +static void extract_user_token _((struct cparse_params *v, + VALUE block_args, VALUE *tok, VALUE *val)); +static void shift _((struct cparse_params* v, long act, VALUE tok, VALUE val)); +static int reduce _((struct cparse_params* v, long act)); +static rb_block_call_func reduce0; + +#ifdef DEBUG +# define D_puts(msg) if (v->sys_debug) puts(msg) +# define D_printf(fmt,arg) if (v->sys_debug) printf(fmt,arg) +#else +# define D_puts(msg) +# define D_printf(fmt,arg) +#endif + +#undef RUBY_UNTYPED_DATA_WARNING +#define RUBY_UNTYPED_DATA_WARNING 1 + +static const rb_data_type_t cparse_params_type = { + "racc/cparse", + { + cparse_params_mark, + RUBY_TYPED_DEFAULT_FREE, + cparse_params_memsize, + }, +#ifdef RUBY_TYPED_FREE_IMMEDIATELY + 0, 0, + RUBY_TYPED_FREE_IMMEDIATELY, +#endif +}; + +static VALUE +racc_cparse(VALUE parser, VALUE arg, VALUE sysdebug) +{ + VALUE vparams; + struct cparse_params *v; + + vparams = TypedData_Make_Struct(CparseParams, struct cparse_params, + &cparse_params_type, v); + D_puts("starting cparse"); + v->sys_debug = RTEST(sysdebug); + vparams = initialize_params(vparams, parser, arg, Qnil, Qnil); + v->lex_is_iterator = FALSE; + parse_main(v, Qnil, Qnil, 0); + + RB_GC_GUARD(vparams); + return v->retval; +} + +static VALUE +racc_yyparse(VALUE parser, VALUE lexer, VALUE lexmid, VALUE arg, VALUE sysdebug) +{ + VALUE vparams; + struct cparse_params *v; + + vparams = TypedData_Make_Struct(CparseParams, struct cparse_params, + &cparse_params_type, v); + v->sys_debug = RTEST(sysdebug); + D_puts("start C yyparse"); + vparams = initialize_params(vparams, parser, arg, lexer, lexmid); + v->lex_is_iterator = TRUE; + D_puts("params initialized"); + parse_main(v, Qnil, Qnil, 0); + call_lexer(v); + if (!v->fin) { + rb_raise(rb_eArgError, "%s() is finished before EndOfToken", + rb_id2name(v->lexmid)); + } + + RB_GC_GUARD(vparams); + return v->retval; +} + +#ifdef HAVE_RB_BLOCK_CALL +static void +call_lexer(struct cparse_params *v) +{ + rb_block_call(v->lexer, v->lexmid, 0, NULL, lexer_i, v->value_v); +} +#else +static VALUE +lexer_iter(VALUE data) +{ + struct cparse_params *v = rb_check_typeddata(data, &cparse_params_type); + + rb_funcall(v->lexer, v->lexmid, 0); + return Qnil; +} + +static void +call_lexer(struct cparse_params *v) +{ + rb_iterate(lexer_iter, v->value_v, lexer_i, v->value_v); +} +#endif + +static VALUE +lexer_i(RB_BLOCK_CALL_FUNC_ARGLIST(block_args, data)) +{ + struct cparse_params *v = rb_check_typeddata(data, &cparse_params_type); + VALUE tok, val; + + if (v->fin) + rb_raise(rb_eArgError, "extra token after EndOfToken"); + extract_user_token(v, block_args, &tok, &val); + parse_main(v, tok, val, 1); + if (v->fin && v->fin != CP_FIN_ACCEPT) + rb_iter_break(); + return Qnil; +} + +static VALUE +assert_array(VALUE a) +{ + Check_Type(a, T_ARRAY); + return a; +} + +static VALUE +assert_hash(VALUE h) +{ + Check_Type(h, T_HASH); + return h; +} + +static long +assert_integer(VALUE n) +{ + return NUM2LONG(n); +} + +static VALUE +initialize_params(VALUE vparams, VALUE parser, VALUE arg, VALUE lexer, VALUE lexmid) +{ + struct cparse_params *v = rb_check_typeddata(vparams, &cparse_params_type); + + v->value_v = vparams; + v->parser = parser; + v->lexer = lexer; + if (! NIL_P(lexmid)) + v->lexmid = value_to_id(lexmid); + + v->debug = RTEST(rb_ivar_get(parser, id_yydebug)); + + Check_Type(arg, T_ARRAY); + if (!(13 <= RARRAY_LEN(arg) && RARRAY_LEN(arg) <= 14)) + rb_raise(RaccBug, "[Racc Bug] wrong arg.size %ld", RARRAY_LEN(arg)); + v->action_table = assert_array (rb_ary_entry(arg, 0)); + v->action_check = assert_array (rb_ary_entry(arg, 1)); + v->action_default = assert_array (rb_ary_entry(arg, 2)); + v->action_pointer = assert_array (rb_ary_entry(arg, 3)); + v->goto_table = assert_array (rb_ary_entry(arg, 4)); + v->goto_check = assert_array (rb_ary_entry(arg, 5)); + v->goto_default = assert_array (rb_ary_entry(arg, 6)); + v->goto_pointer = assert_array (rb_ary_entry(arg, 7)); + v->nt_base = assert_integer(rb_ary_entry(arg, 8)); + v->reduce_table = assert_array (rb_ary_entry(arg, 9)); + v->token_table = assert_hash (rb_ary_entry(arg, 10)); + v->shift_n = assert_integer(rb_ary_entry(arg, 11)); + v->reduce_n = assert_integer(rb_ary_entry(arg, 12)); + if (RARRAY_LEN(arg) > 13) { + v->use_result_var = RTEST(rb_ary_entry(arg, 13)); + } + else { + v->use_result_var = TRUE; + } + + v->tstack = v->debug ? NEW_STACK() : Qnil; + v->vstack = NEW_STACK(); + v->state = NEW_STACK(); + v->curstate = 0; + PUSH(v->state, INT2FIX(0)); + v->t = INT2FIX(FINAL_TOKEN + 1); /* must not init to FINAL_TOKEN */ + v->nerr = 0; + v->errstatus = 0; + rb_ivar_set(parser, id_errstatus, LONG2NUM(v->errstatus)); + + v->retval = Qnil; + v->fin = 0; + + v->lex_is_iterator = FALSE; + + rb_iv_set(parser, "@vstack", v->vstack); + if (v->debug) { + rb_iv_set(parser, "@tstack", v->tstack); + } + else { + rb_iv_set(parser, "@tstack", Qnil); + } + + return vparams; +} + +static void +cparse_params_mark(void *ptr) +{ + struct cparse_params *v = (struct cparse_params*)ptr; + + rb_gc_mark(v->value_v); + rb_gc_mark(v->parser); + rb_gc_mark(v->lexer); + rb_gc_mark(v->action_table); + rb_gc_mark(v->action_check); + rb_gc_mark(v->action_default); + rb_gc_mark(v->action_pointer); + rb_gc_mark(v->goto_table); + rb_gc_mark(v->goto_check); + rb_gc_mark(v->goto_default); + rb_gc_mark(v->goto_pointer); + rb_gc_mark(v->reduce_table); + rb_gc_mark(v->token_table); + rb_gc_mark(v->state); + rb_gc_mark(v->vstack); + rb_gc_mark(v->tstack); + rb_gc_mark(v->t); + rb_gc_mark(v->retval); +} + +static size_t +cparse_params_memsize(const void *ptr) +{ + return sizeof(struct cparse_params); +} + +static void +extract_user_token(struct cparse_params *v, VALUE block_args, + VALUE *tok, VALUE *val) +{ + if (NIL_P(block_args)) { + /* EOF */ + *tok = Qfalse; + *val = rb_str_new("$", 1); + return; + } + + if (!RB_TYPE_P(block_args, T_ARRAY)) { + rb_raise(rb_eTypeError, + "%s() %s %"PRIsVALUE" (must be Array[2])", + v->lex_is_iterator ? rb_id2name(v->lexmid) : "next_token", + v->lex_is_iterator ? "yielded" : "returned", + rb_obj_class(block_args)); + } + if (RARRAY_LEN(block_args) != 2) { + rb_raise(rb_eArgError, + "%s() %s wrong size of array (%ld for 2)", + v->lex_is_iterator ? rb_id2name(v->lexmid) : "next_token", + v->lex_is_iterator ? "yielded" : "returned", + RARRAY_LEN(block_args)); + } + *tok = AREF(block_args, 0); + *val = AREF(block_args, 1); +} + +#define SHIFT(v,act,tok,val) shift(v,act,tok,val) +#define REDUCE(v,act) do {\ + switch (reduce(v,act)) { \ + case 0: /* normal */ \ + break; \ + case 1: /* yyerror */ \ + goto user_yyerror; \ + case 2: /* yyaccept */ \ + D_puts("u accept"); \ + goto accept; \ + default: \ + break; \ + } \ +} while (0) + +static void +parse_main(struct cparse_params *v, VALUE tok, VALUE val, int resume) +{ + long i; /* table index */ + long act; /* action type */ + VALUE act_value; /* action type, VALUE version */ + int read_next = 1; /* true if we need to read next token */ + VALUE tmp; + + if (resume) + goto resume; + + while (1) { + D_puts(""); + D_puts("---- enter new loop ----"); + D_puts(""); + + D_printf("(act) k1=%ld\n", v->curstate); + tmp = AREF(v->action_pointer, v->curstate); + if (NIL_P(tmp)) goto notfound; + D_puts("(act) pointer[k1] ok"); + i = NUM2LONG(tmp); + + D_printf("read_next=%d\n", read_next); + if (read_next && (v->t != vFINAL_TOKEN)) { + if (v->lex_is_iterator) { + D_puts("resuming..."); + if (v->fin) rb_raise(rb_eArgError, "token given after EOF"); + v->i = i; /* save i */ + return; + resume: + D_puts("resumed"); + i = v->i; /* load i */ + } + else { + D_puts("next_token"); + tmp = rb_funcall(v->parser, id_nexttoken, 0); + extract_user_token(v, tmp, &tok, &val); + } + /* convert token */ + v->t = rb_hash_aref(v->token_table, tok); + if (NIL_P(v->t)) { + v->t = vERROR_TOKEN; + } + D_printf("(act) t(k2)=%ld\n", NUM2LONG(v->t)); + if (v->debug) { + rb_funcall(v->parser, id_d_read_token, + 3, v->t, tok, val); + } + } + read_next = 0; + + i += NUM2LONG(v->t); + D_printf("(act) i=%ld\n", i); + if (i < 0) goto notfound; + + act_value = AREF(v->action_table, i); + if (NIL_P(act_value)) goto notfound; + act = NUM2LONG(act_value); + D_printf("(act) table[i]=%ld\n", act); + + tmp = AREF(v->action_check, i); + if (NIL_P(tmp)) goto notfound; + if (NUM2LONG(tmp) != v->curstate) goto notfound; + D_printf("(act) check[i]=%ld\n", NUM2LONG(tmp)); + + D_puts("(act) found"); + act_fixed: + D_printf("act=%ld\n", act); + goto handle_act; + + notfound: + D_puts("(act) not found: use default"); + act_value = AREF(v->action_default, v->curstate); + act = NUM2LONG(act_value); + goto act_fixed; + + + handle_act: + if (act > 0 && act < v->shift_n) { + D_puts("shift"); + if (v->errstatus > 0) { + v->errstatus--; + rb_ivar_set(v->parser, id_errstatus, LONG2NUM(v->errstatus)); + } + SHIFT(v, act, v->t, val); + read_next = 1; + } + else if (act < 0 && act > -(v->reduce_n)) { + D_puts("reduce"); + REDUCE(v, act); + } + else if (act == -(v->reduce_n)) { + goto error; + error_recovered: + ; /* goto label requires stmt */ + } + else if (act == v->shift_n) { + D_puts("accept"); + goto accept; + } + else { + rb_raise(RaccBug, "[Racc Bug] unknown act value %ld", act); + } + + if (v->debug) { + rb_funcall(v->parser, id_d_next_state, + 2, LONG2NUM(v->curstate), v->state); + } + } + /* not reach */ + + + accept: + if (v->debug) rb_funcall(v->parser, id_d_accept, 0); + v->retval = rb_ary_entry(v->vstack, 0); + v->fin = CP_FIN_ACCEPT; + return; + + + error: + D_printf("error detected, status=%ld\n", v->errstatus); + if (v->errstatus == 0) { + v->nerr++; + rb_funcall(v->parser, id_onerror, + 3, v->t, val, v->vstack); + } + user_yyerror: + if (v->errstatus == 3) { + if (v->t == vFINAL_TOKEN) { + v->retval = Qnil; + v->fin = CP_FIN_EOT; + return; + } + read_next = 1; + } + v->errstatus = 3; + rb_ivar_set(v->parser, id_errstatus, LONG2NUM(v->errstatus)); + + /* check if we can shift/reduce error token */ + D_printf("(err) k1=%ld\n", v->curstate); + D_printf("(err) k2=%d (error)\n", ERROR_TOKEN); + while (1) { + tmp = AREF(v->action_pointer, v->curstate); + if (NIL_P(tmp)) goto error_pop; + D_puts("(err) pointer[k1] ok"); + + i = NUM2LONG(tmp) + ERROR_TOKEN; + D_printf("(err) i=%ld\n", i); + if (i < 0) goto error_pop; + + act_value = AREF(v->action_table, i); + if (NIL_P(act_value)) { + D_puts("(err) table[i] == nil"); + goto error_pop; + } + act = NUM2LONG(act_value); + D_printf("(err) table[i]=%ld\n", act); + + tmp = AREF(v->action_check, i); + if (NIL_P(tmp)) { + D_puts("(err) check[i] == nil"); + goto error_pop; + } + if (NUM2LONG(tmp) != v->curstate) { + D_puts("(err) check[i] != k1"); + goto error_pop; + } + + D_puts("(err) found: can handle error token"); + break; + + error_pop: + D_puts("(err) act not found: can't handle error token; pop"); + + if (RARRAY_LEN(v->state) <= 1) { + v->retval = Qnil; + v->fin = CP_FIN_CANTPOP; + return; + } + POP(v->state); + POP(v->vstack); + v->curstate = num_to_long(LAST_I(v->state)); + if (v->debug) { + POP(v->tstack); + rb_funcall(v->parser, id_d_e_pop, + 3, v->state, v->tstack, v->vstack); + } + } + + /* shift/reduce error token */ + if (act > 0 && act < v->shift_n) { + D_puts("e shift"); + SHIFT(v, act, ERROR_TOKEN, val); + } + else if (act < 0 && act > -(v->reduce_n)) { + D_puts("e reduce"); + REDUCE(v, act); + } + else if (act == v->shift_n) { + D_puts("e accept"); + goto accept; + } + else { + rb_raise(RaccBug, "[Racc Bug] unknown act value %ld", act); + } + goto error_recovered; +} + +static void +shift(struct cparse_params *v, long act, VALUE tok, VALUE val) +{ + PUSH(v->vstack, val); + if (v->debug) { + PUSH(v->tstack, tok); + rb_funcall(v->parser, id_d_shift, + 3, tok, v->tstack, v->vstack); + } + v->curstate = act; + PUSH(v->state, LONG2NUM(v->curstate)); +} + +static int +reduce(struct cparse_params *v, long act) +{ + VALUE code; + v->ruleno = -act * 3; + code = rb_catch("racc_jump", reduce0, v->value_v); + v->errstatus = num_to_long(rb_ivar_get(v->parser, id_errstatus)); + return NUM2INT(code); +} + +static VALUE +reduce0(RB_BLOCK_CALL_FUNC_ARGLIST(_, data)) +{ + struct cparse_params *v = rb_check_typeddata(data, &cparse_params_type); + VALUE reduce_to, reduce_len, method_id; + long len; + ID mid; + VALUE tmp, tmp_t = Qundef, tmp_v = Qundef; + long i, k1, k2; + VALUE goto_state; + + reduce_len = rb_ary_entry(v->reduce_table, v->ruleno); + reduce_to = rb_ary_entry(v->reduce_table, v->ruleno+1); + method_id = rb_ary_entry(v->reduce_table, v->ruleno+2); + len = NUM2LONG(reduce_len); + mid = value_to_id(method_id); + + /* call action */ + if (len == 0) { + tmp = Qnil; + if (mid != id_noreduce) + tmp_v = rb_ary_new(); + if (v->debug) + tmp_t = rb_ary_new(); + } + else { + if (mid != id_noreduce) { + tmp_v = GET_TAIL(v->vstack, len); + tmp = rb_ary_entry(tmp_v, 0); + } + else { + tmp = rb_ary_entry(v->vstack, RARRAY_LEN(v->vstack) - len); + } + CUT_TAIL(v->vstack, len); + if (v->debug) { + tmp_t = GET_TAIL(v->tstack, len); + CUT_TAIL(v->tstack, len); + } + CUT_TAIL(v->state, len); + } + if (mid != id_noreduce) { + if (v->use_result_var) { + tmp = rb_funcall(v->parser, mid, + 3, tmp_v, v->vstack, tmp); + } + else { + tmp = rb_funcall(v->parser, mid, + 2, tmp_v, v->vstack); + } + } + + /* then push result */ + PUSH(v->vstack, tmp); + if (v->debug) { + PUSH(v->tstack, reduce_to); + rb_funcall(v->parser, id_d_reduce, + 4, tmp_t, reduce_to, v->tstack, v->vstack); + } + + /* calculate transition state */ + if (RARRAY_LEN(v->state) == 0) + rb_raise(RaccBug, "state stack unexpectedly empty"); + k2 = num_to_long(LAST_I(v->state)); + k1 = num_to_long(reduce_to) - v->nt_base; + D_printf("(goto) k1=%ld\n", k1); + D_printf("(goto) k2=%ld\n", k2); + + tmp = AREF(v->goto_pointer, k1); + if (NIL_P(tmp)) goto notfound; + + i = NUM2LONG(tmp) + k2; + D_printf("(goto) i=%ld\n", i); + if (i < 0) goto notfound; + + goto_state = AREF(v->goto_table, i); + if (NIL_P(goto_state)) { + D_puts("(goto) table[i] == nil"); + goto notfound; + } + D_printf("(goto) table[i]=%ld (goto_state)\n", NUM2LONG(goto_state)); + + tmp = AREF(v->goto_check, i); + if (NIL_P(tmp)) { + D_puts("(goto) check[i] == nil"); + goto notfound; + } + if (tmp != LONG2NUM(k1)) { + D_puts("(goto) check[i] != table[i]"); + goto notfound; + } + D_printf("(goto) check[i]=%ld\n", NUM2LONG(tmp)); + + D_puts("(goto) found"); + transit: + PUSH(v->state, goto_state); + v->curstate = NUM2LONG(goto_state); + return INT2FIX(0); + + notfound: + D_puts("(goto) not found: use default"); + /* overwrite `goto-state' by default value */ + goto_state = AREF(v->goto_default, k1); + goto transit; +} + +/* ----------------------------------------------------------------------- + Ruby Interface +----------------------------------------------------------------------- */ + +void +Init_cparse(void) +{ +#if HAVE_RB_EXT_RACTOR_SAFE + rb_ext_ractor_safe(true); +#endif + + VALUE Racc, Parser; + ID id_racc = rb_intern_const("Racc"); + + if (rb_const_defined(rb_cObject, id_racc)) { + Racc = rb_const_get(rb_cObject, id_racc); + Parser = rb_const_get_at(Racc, rb_intern_const("Parser")); + } + else { + Racc = rb_define_module("Racc"); + Parser = rb_define_class_under(Racc, "Parser", rb_cObject); + } + rb_define_private_method(Parser, "_racc_do_parse_c", racc_cparse, 2); + rb_define_private_method(Parser, "_racc_yyparse_c", racc_yyparse, 4); + rb_define_const(Parser, "Racc_Runtime_Core_Version_C", + rb_str_new2(RACC_VERSION)); + rb_define_const(Parser, "Racc_Runtime_Core_Id_C", + rb_str_new2("$originalId: cparse.c,v 1.8 2006/07/06 11:39:46 aamine Exp $")); + + CparseParams = rb_define_class_under(Racc, "CparseParams", rb_cObject); + rb_undef_alloc_func(CparseParams); + rb_undef_method(CparseParams, "initialize"); + rb_undef_method(CparseParams, "initialize_copy"); + + RaccBug = rb_eRuntimeError; + + id_yydebug = rb_intern_const("@yydebug"); + id_nexttoken = rb_intern_const("next_token"); + id_onerror = rb_intern_const("on_error"); + id_noreduce = rb_intern_const("_reduce_none"); + id_errstatus = rb_intern_const("@racc_error_status"); + + id_d_shift = rb_intern_const("racc_shift"); + id_d_reduce = rb_intern_const("racc_reduce"); + id_d_accept = rb_intern_const("racc_accept"); + id_d_read_token = rb_intern_const("racc_read_token"); + id_d_next_state = rb_intern_const("racc_next_state"); + id_d_e_pop = rb_intern_const("racc_e_pop"); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/cparse.o b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/cparse.o new file mode 100644 index 000000000000..c06e0c0cb1de Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/cparse.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/cparse.so b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/cparse.so new file mode 100644 index 000000000000..ed9bececabad Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/cparse.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/extconf.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/extconf.rb new file mode 100644 index 000000000000..3b4f594b9d1c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/ext/racc/cparse/extconf.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: false +# + +require 'mkmf' + +have_func('rb_ary_subseq') + +create_makefile 'racc/cparse' diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc.rb new file mode 100644 index 000000000000..f6e4ac03a870 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc.rb @@ -0,0 +1,6 @@ +require 'racc/compat' +require 'racc/debugflags' +require 'racc/grammar' +require 'racc/state' +require 'racc/exception' +require 'racc/info' diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/compat.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/compat.rb new file mode 100644 index 000000000000..62f4f630be08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/compat.rb @@ -0,0 +1,33 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +unless Object.method_defined?(:__send) + class Object + alias __send __send__ + end +end + +unless Object.method_defined?(:__send!) + class Object + alias __send! __send__ + end +end + +unless Array.method_defined?(:map!) + class Array + if Array.method_defined?(:collect!) + alias map! collect! + else + alias map! filter + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/cparse.so b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/cparse.so new file mode 100644 index 000000000000..ed9bececabad Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/cparse.so differ diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/debugflags.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/debugflags.rb new file mode 100644 index 000000000000..ee34cf231498 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/debugflags.rb @@ -0,0 +1,60 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +module Racc + + class DebugFlags + def DebugFlags.parse_option_string(s) + parse = rule = token = state = la = prec = conf = false + s.split(//).each do |ch| + case ch + when 'p' then parse = true + when 'r' then rule = true + when 't' then token = true + when 's' then state = true + when 'l' then la = true + when 'c' then prec = true + when 'o' then conf = true + else + raise "unknown debug flag char: #{ch.inspect}" + end + end + new(parse, rule, token, state, la, prec, conf) + end + + def initialize(parse = false, rule = false, token = false, state = false, + la = false, prec = false, conf = false) + @parse = parse + @rule = rule + @token = token + @state = state + @la = la + @prec = prec + @any = (parse || rule || token || state || la || prec) + @status_logging = conf + end + + attr_reader :parse + attr_reader :rule + attr_reader :token + attr_reader :state + attr_reader :la + attr_reader :prec + + def any? + @any + end + + attr_reader :status_logging + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/exception.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/exception.rb new file mode 100644 index 000000000000..c11dc2e43e1e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/exception.rb @@ -0,0 +1,16 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +module Racc + class Error < StandardError; end + class CompileError < Error; end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/grammar.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/grammar.rb new file mode 100644 index 000000000000..3444dfcce3e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/grammar.rb @@ -0,0 +1,1118 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +require 'racc/compat' +require 'racc/iset' +require 'racc/sourcetext' +require 'racc/logfilegenerator' +require 'racc/exception' +require 'forwardable' + +module Racc + + class Grammar + + def initialize(debug_flags = DebugFlags.new) + @symboltable = SymbolTable.new + @debug_symbol = debug_flags.token + @rules = [] # :: [Rule] + @start = nil + @n_expected_srconflicts = nil + @prec_table = [] + @prec_table_closed = false + @closed = false + @states = nil + end + + attr_reader :start + attr_reader :symboltable + attr_accessor :n_expected_srconflicts + + def [](x) + @rules[x] + end + + def each_rule(&block) + @rules.each(&block) + end + + alias each each_rule + + def each_index(&block) + @rules.each_index(&block) + end + + def each_with_index(&block) + @rules.each_with_index(&block) + end + + def size + @rules.size + end + + def to_s + "<Racc::Grammar>" + end + + extend Forwardable + + def_delegator "@symboltable", :each, :each_symbol + def_delegator "@symboltable", :each_terminal + def_delegator "@symboltable", :each_nonterminal + + def intern(value, dummy = false) + @symboltable.intern(value, dummy) + end + + def symbols + @symboltable.symbols + end + + def nonterminal_base + @symboltable.nt_base + end + + def useless_nonterminal_exist? + n_useless_nonterminals() != 0 + end + + def n_useless_nonterminals + @n_useless_nonterminals ||= each_useless_nonterminal.count + end + + def each_useless_nonterminal + return to_enum __method__ unless block_given? + + @symboltable.each_nonterminal do |sym| + yield sym if sym.useless? + end + end + + def useless_rule_exist? + n_useless_rules() != 0 + end + + def n_useless_rules + @n_useless_rules ||= each_useless_rule.count + end + + def each_useless_rule + return to_enum __method__ unless block_given? + + each do |r| + yield r if r.useless? + end + end + + def nfa + (@states ||= States.new(self)).nfa + end + + def dfa + (@states ||= States.new(self)).dfa + end + + alias states dfa + + def state_transition_table + states().state_transition_table + end + + def parser_class + states = states() # cache + if $DEBUG + srcfilename = caller(1).first.slice(/\A(.*?):/, 1) + begin + write_log srcfilename + ".output" + rescue SystemCallError + end + report = lambda {|s| $stderr.puts "racc: #{srcfilename}: #{s}" } + if states.should_report_srconflict? + report["#{states.n_srconflicts} shift/reduce conflicts"] + end + if states.rrconflict_exist? + report["#{states.n_rrconflicts} reduce/reduce conflicts"] + end + g = states.grammar + if g.useless_nonterminal_exist? + report["#{g.n_useless_nonterminals} useless nonterminals"] + end + if g.useless_rule_exist? + report["#{g.n_useless_rules} useless rules"] + end + end + states.state_transition_table.parser_class + end + + def write_log(path) + File.open(path, 'w') {|f| + LogFileGenerator.new(states()).output f + } + end + + # + # Grammar Definition Interface + # + + def add(rule) + raise ArgumentError, "rule added after the Grammar closed" if @closed + @rules.push rule + end + + def added?(sym) + @rules.detect {|r| r.target == sym } + end + + def start_symbol=(s) + raise CompileError, "start symbol set twice'" if @start + @start = s + end + + def declare_precedence(assoc, syms) + raise CompileError, "precedence table defined twice" if @prec_table_closed + @prec_table.push [assoc, syms] + end + + def end_precedence_declaration(reverse) + @prec_table_closed = true + return if @prec_table.empty? + table = reverse ? @prec_table.reverse : @prec_table + table.each_with_index do |(assoc, syms), idx| + syms.each do |sym| + sym.assoc = assoc + sym.precedence = idx + end + end + end + + # + # Dynamic Generation Interface + # + + def Grammar.define(&block) + env = DefinitionEnv.new + env.instance_eval(&block) + env.grammar + end + + class DefinitionEnv + def initialize + @grammar = Grammar.new + @seqs = Hash.new(0) + @delayed = [] + end + + def grammar + flush_delayed + @grammar.each do |rule| + if rule.specified_prec + rule.specified_prec = @grammar.intern(rule.specified_prec) + end + end + @grammar.init + @grammar + end + + def precedence_table(&block) + env = PrecedenceDefinitionEnv.new(@grammar) + env.instance_eval(&block) + @grammar.end_precedence_declaration env.reverse + end + + def method_missing(mid, *args, &block) + unless mid.to_s[-1,1] == '=' + super # raises NoMethodError + end + target = @grammar.intern(mid.to_s.chop.intern) + unless args.size == 1 + raise ArgumentError, "too many arguments for #{mid} (#{args.size} for 1)" + end + _add target, args.first + end + + def _add(target, x) + case x + when Sym + @delayed.each do |rule| + rule.replace x, target if rule.target == x + end + @grammar.symboltable.delete x + else + x.each_rule do |r| + r.target = target + @grammar.add r + end + end + flush_delayed + end + + def _delayed_add(rule) + @delayed.push rule + end + + def _added?(sym) + @grammar.added?(sym) or @delayed.detect {|r| r.target == sym } + end + + def flush_delayed + return if @delayed.empty? + @delayed.each do |rule| + @grammar.add rule + end + @delayed.clear + end + + def seq(*list, &block) + Rule.new(nil, list.map {|x| _intern(x) }, UserAction.proc(block)) + end + + def null(&block) + seq(&block) + end + + def action(&block) + id = "@#{@seqs["action"] += 1}".intern + _delayed_add Rule.new(@grammar.intern(id), [], UserAction.proc(block)) + id + end + + alias _ action + + def option(sym, default = nil, &block) + _defmetasyntax("option", _intern(sym), block) {|target| + seq() { default } | seq(sym) + } + end + + def many(sym, &block) + _defmetasyntax("many", _intern(sym), block) {|target| + seq() { [] }\ + | seq(target, sym) {|list, x| list.push x; list } + } + end + + def many1(sym, &block) + _defmetasyntax("many1", _intern(sym), block) {|target| + seq(sym) {|x| [x] }\ + | seq(target, sym) {|list, x| list.push x; list } + } + end + + def separated_by(sep, sym, &block) + option(separated_by1(sep, sym), [], &block) + end + + def separated_by1(sep, sym, &block) + _defmetasyntax("separated_by1", _intern(sym), block) {|target| + seq(sym) {|x| [x] }\ + | seq(target, sep, sym) {|list, _, x| list.push x; list } + } + end + + def _intern(x) + case x + when Symbol, String + @grammar.intern(x) + when Racc::Sym + x + else + raise TypeError, "wrong type #{x.class} (expected Symbol/String/Racc::Sym)" + end + end + + private + + def _defmetasyntax(type, id, action, &block) + if action + idbase = "#{type}@#{id}-#{@seqs[type] += 1}" + target = _wrap(idbase, "#{idbase}-core", action) + _regist("#{idbase}-core", &block) + else + target = _regist("#{type}@#{id}", &block) + end + @grammar.intern(target) + end + + def _regist(target_name) + target = target_name.intern + unless _added?(@grammar.intern(target)) + yield(target).each_rule do |rule| + rule.target = @grammar.intern(target) + _delayed_add rule + end + end + target + end + + def _wrap(target_name, sym, block) + target = target_name.intern + _delayed_add Rule.new(@grammar.intern(target), + [@grammar.intern(sym.intern)], + UserAction.proc(block)) + target + end + end + + class PrecedenceDefinitionEnv + def initialize(g) + @grammar = g + @prechigh_seen = false + @preclow_seen = false + @reverse = false + end + + attr_reader :reverse + + def higher + if @prechigh_seen + raise CompileError, "prechigh used twice" + end + @prechigh_seen = true + end + + def lower + if @preclow_seen + raise CompileError, "preclow used twice" + end + if @prechigh_seen + @reverse = true + end + @preclow_seen = true + end + + def left(*syms) + @grammar.declare_precedence :Left, syms.map {|s| @grammar.intern(s) } + end + + def right(*syms) + @grammar.declare_precedence :Right, syms.map {|s| @grammar.intern(s) } + end + + def nonassoc(*syms) + @grammar.declare_precedence :Nonassoc, syms.map {|s| @grammar.intern(s)} + end + end + + # + # Computation + # + + def init + return if @closed + @closed = true + @start ||= @rules.map {|r| r.target }.detect {|sym| not sym.dummy? } + raise CompileError, 'no rule in input' if @rules.empty? + add_start_rule + @rules.freeze + fix_ident + compute_hash + compute_heads + determine_terminals + compute_nullable_0 + @symboltable.fix + compute_locate + @symboltable.each_nonterminal {|t| compute_expand t } + compute_nullable + compute_useless + end + + private + + def add_start_rule + r = Rule.new(@symboltable.dummy, + [@start, @symboltable.anchor, @symboltable.anchor], + UserAction.empty) + r.ident = 0 + r.hash = 0 + r.precedence = nil + @rules.unshift r + end + + # Rule#ident + # LocationPointer#ident + def fix_ident + @rules.each_with_index do |rule, idx| + rule.ident = idx + end + end + + # Rule#hash + def compute_hash + hash = 4 # size of dummy rule + @rules.each do |rule| + rule.hash = hash + hash += (rule.size + 1) + end + end + + # Sym#heads + def compute_heads + @rules.each do |rule| + rule.target.heads.push rule.ptrs[0] + end + end + + # Sym#terminal? + def determine_terminals + @symboltable.each do |s| + s.term = s.heads.empty? + end + end + + # Sym#self_null? + def compute_nullable_0 + @symboltable.each do |s| + if s.terminal? + s.snull = false + else + s.snull = s.heads.any? {|loc| loc.reduce? } + end + end + end + + # Sym#locate + def compute_locate + @rules.each do |rule| + t = nil + rule.ptrs.each do |ptr| + unless ptr.reduce? + tok = ptr.dereference + tok.locate.push ptr + t = tok if tok.terminal? + end + end + rule.precedence = t + end + end + + # Sym#expand + def compute_expand(t) + puts "expand> #{t.to_s}" if @debug_symbol + t.expand = _compute_expand(t, ISet.new, []) + puts "expand< #{t.to_s}: #{t.expand.to_s}" if @debug_symbol + end + + def _compute_expand(t, set, lock) + if tmp = t.expand + set.update tmp + return set + end + tok = nil + set.update_a t.heads + t.heads.each do |ptr| + tok = ptr.dereference + if tok and tok.nonterminal? + unless lock[tok.ident] + lock[tok.ident] = true + _compute_expand tok, set, lock + end + end + end + set + end + + # Sym#nullable?, Rule#nullable? + def compute_nullable + @rules.each {|r| r.null = false } + @symboltable.each {|t| t.null = false } + r = @rules.dup + s = @symboltable.nonterminals + begin + rs = r.size + ss = s.size + check_rules_nullable r + check_symbols_nullable s + end until rs == r.size and ss == s.size + end + + def check_rules_nullable(rules) + rules.delete_if do |rule| + rule.null = true + rule.symbols.each do |t| + unless t.nullable? + rule.null = false + break + end + end + rule.nullable? + end + end + + def check_symbols_nullable(symbols) + symbols.delete_if do |sym| + sym.heads.each do |ptr| + if ptr.rule.nullable? + sym.null = true + break + end + end + sym.nullable? + end + end + + # Sym#useless?, Rule#useless? + # FIXME: what means "useless"? + def compute_useless + @symboltable.each_terminal {|sym| sym.useless = false } + @symboltable.each_nonterminal {|sym| sym.useless = true } + @rules.each {|rule| rule.useless = true } + r = @rules.dup + s = @symboltable.nonterminals + begin + rs = r.size + ss = s.size + check_rules_useless r + check_symbols_useless s + end until r.size == rs and s.size == ss + end + + def check_rules_useless(rules) + rules.delete_if do |rule| + rule.useless = false + rule.symbols.each do |sym| + if sym.useless? + rule.useless = true + break + end + end + not rule.useless? + end + end + + def check_symbols_useless(s) + s.delete_if do |t| + t.heads.each do |ptr| + unless ptr.rule.useless? + t.useless = false + break + end + end + not t.useless? + end + end + + end # class Grammar + + + class Rule + + def initialize(target, syms, act) + @target = target + @symbols = syms + @action = act + @alternatives = [] + + @ident = nil + @hash = nil + @ptrs = nil + @precedence = nil + @specified_prec = nil + @null = nil + @useless = nil + end + + attr_accessor :target + attr_reader :symbols + attr_reader :action + + def |(x) + @alternatives.push x.rule + self + end + + def rule + self + end + + def each_rule(&block) + yield self + @alternatives.each(&block) + end + + attr_accessor :ident + + attr_reader :hash + attr_reader :ptrs + + def hash=(n) + @hash = n + ptrs = [] + @symbols.each_with_index do |sym, idx| + ptrs.push LocationPointer.new(self, idx, sym) + end + ptrs.push LocationPointer.new(self, @symbols.size, nil) + @ptrs = ptrs + end + + def precedence + @specified_prec || @precedence + end + + def precedence=(sym) + @precedence ||= sym + end + + def prec(sym, &block) + @specified_prec = sym + if block + unless @action.empty? + raise CompileError, 'both of rule action block and prec block given' + end + @action = UserAction.proc(block) + end + self + end + + attr_accessor :specified_prec + + def nullable?() @null end + def null=(n) @null = n end + + def useless?() @useless end + def useless=(u) @useless = u end + + def inspect + "#<Racc::Rule id=#{@ident} (#{@target})>" + end + + def ==(other) + other.kind_of?(Rule) and @ident == other.ident + end + + def [](idx) + @symbols[idx] + end + + def size + @symbols.size + end + + def empty? + @symbols.empty? + end + + def to_s + "#<rule#{@ident}>" + end + + def accept? + if tok = @symbols[-1] + tok.anchor? + else + false + end + end + + def each(&block) + @symbols.each(&block) + end + + def replace(src, dest) + @target = dest + @symbols = @symbols.map {|s| s == src ? dest : s } + end + + end # class Rule + + + class UserAction + + def UserAction.source_text(src) + new(src, nil) + end + + def UserAction.proc(pr = nil, &block) + if pr and block + raise ArgumentError, "both of argument and block given" + end + new(nil, pr || block) + end + + def UserAction.empty + new(nil, nil) + end + + private_class_method :new + + def initialize(src, proc) + @source = src + @proc = proc + end + + attr_reader :source + attr_reader :proc + + def source? + not @proc + end + + def proc? + not @source + end + + def empty? + not @proc and not @source + end + + def name + "{action type=#{@source || @proc || 'nil'}}" + end + + alias inspect name + + end + + + class OrMark + def initialize(lineno) + @lineno = lineno + end + + def name + '|' + end + + alias inspect name + + attr_reader :lineno + end + + + class Prec + def initialize(symbol, lineno) + @symbol = symbol + @lineno = lineno + end + + def name + "=#{@symbol}" + end + + alias inspect name + + attr_reader :symbol + attr_reader :lineno + end + + + # + # A set of rule and position in it's RHS. + # Note that the number of pointers is more than rule's RHS array, + # because pointer points right edge of the final symbol when reducing. + # + class LocationPointer + + def initialize(rule, i, sym) + @rule = rule + @index = i + @symbol = sym + @ident = @rule.hash + i + @reduce = sym.nil? + end + + attr_reader :rule + attr_reader :index + attr_reader :symbol + + alias dereference symbol + + attr_reader :ident + alias hash ident + attr_reader :reduce + alias reduce? reduce + + def to_s + sprintf('(%d,%d %s)', + @rule.ident, @index, (reduce?() ? '#' : @symbol.to_s)) + end + + alias inspect to_s + + def eql?(ot) + @hash == ot.hash + end + + alias == eql? + + def head? + @index == 0 + end + + def next + @rule.ptrs[@index + 1] or ptr_bug! + end + + alias increment next + + def before(len) + @rule.ptrs[@index - len] or ptr_bug! + end + + private + + def ptr_bug! + raise "racc: fatal: pointer not exist: self: #{to_s}" + end + + end # class LocationPointer + + + class SymbolTable + + include Enumerable + + def initialize + @symbols = [] # :: [Racc::Sym] + @cache = {} # :: {(String|Symbol) => Racc::Sym} + @dummy = intern(:$start, true) + @anchor = intern(false, true) # Symbol ID = 0 + @error = intern(:error, false) # Symbol ID = 1 + end + + attr_reader :dummy + attr_reader :anchor + attr_reader :error + + def [](id) + @symbols[id] + end + + def intern(val, dummy = false) + @cache[val] ||= + begin + sym = Sym.new(val, dummy) + @symbols.push sym + sym + end + end + + attr_reader :symbols + alias to_a symbols + + def delete(sym) + @symbols.delete sym + @cache.delete sym.value + end + + attr_reader :nt_base + + def nt_max + @symbols.size + end + + def each(&block) + @symbols.each(&block) + end + + def terminals(&block) + @symbols[0, @nt_base] + end + + def each_terminal(&block) + @terms.each(&block) + end + + def nonterminals + @symbols[@nt_base, @symbols.size - @nt_base] + end + + def each_nonterminal(&block) + @nterms.each(&block) + end + + def fix + terms, nterms = @symbols.partition {|s| s.terminal? } + @symbols = terms + nterms + @terms = terms + @nterms = nterms + @nt_base = terms.size + fix_ident + check_terminals + end + + private + + def fix_ident + @symbols.each_with_index do |t, i| + t.ident = i + end + end + + def check_terminals + return unless @symbols.any? {|s| s.should_terminal? } + @anchor.should_terminal + @error.should_terminal + each_terminal do |t| + t.should_terminal if t.string_symbol? + end + each do |s| + s.should_terminal if s.assoc + end + terminals().reject {|t| t.should_terminal? }.each do |t| + raise CompileError, "terminal #{t} not declared as terminal" + end + nonterminals().select {|n| n.should_terminal? }.each do |n| + raise CompileError, "symbol #{n} declared as terminal but is not terminal" + end + end + + end # class SymbolTable + + + # Stands terminal and nonterminal symbols. + class Sym + + def initialize(value, dummyp) + @ident = nil + @value = value + @dummyp = dummyp + + @term = nil + @nterm = nil + @should_terminal = false + @precedence = nil + case value + when Symbol + @to_s = value.to_s + @serialized = value.inspect + @string = false + when String + @to_s = value.inspect + @serialized = value.dump + @string = true + when false + @to_s = '$end' + @serialized = 'false' + @string = false + when ErrorSymbolValue + @to_s = 'error' + @serialized = 'Object.new' + @string = false + else + raise ArgumentError, "unknown symbol value: #{value.class}" + end + + @heads = [] + @locate = [] + @snull = nil + @null = nil + @expand = nil + @useless = nil + end + + class << self + def once_writer(nm) + nm = nm.id2name + module_eval(<<-EOS) + def #{nm}=(v) + raise 'racc: fatal: @#{nm} != nil' unless @#{nm}.nil? + @#{nm} = v + end + EOS + end + end + + once_writer :ident + attr_reader :ident + + alias hash ident + + attr_reader :value + + def dummy? + @dummyp + end + + def terminal? + @term + end + + def nonterminal? + @nterm + end + + def term=(t) + raise 'racc: fatal: term= called twice' unless @term.nil? + @term = t + @nterm = !t + end + + def should_terminal + @should_terminal = true + end + + def should_terminal? + @should_terminal + end + + def string_symbol? + @string + end + + def serialize + @serialized + end + + attr_writer :serialized + + attr_accessor :precedence + attr_accessor :assoc + + def to_s + @to_s.dup + end + + alias inspect to_s + + def |(x) + rule() | x.rule + end + + def rule + Rule.new(nil, [self], UserAction.empty) + end + + # + # cache + # + + attr_reader :heads + attr_reader :locate + + def self_null? + @snull + end + + once_writer :snull + + def nullable? + @null + end + + def null=(n) + @null = n + end + + attr_reader :expand + once_writer :expand + + def useless? + @useless + end + + def useless=(f) + @useless = f + end + + end # class Sym + +end # module Racc diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/grammarfileparser.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/grammarfileparser.rb new file mode 100644 index 000000000000..419495113b87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/grammarfileparser.rb @@ -0,0 +1,561 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +require 'racc' +require 'racc/compat' +require 'racc/grammar' +require 'racc/parserfilegenerator' +require 'racc/sourcetext' +require 'stringio' + +module Racc + + grammar = Grammar.define { + g = self + + g.class = seq(:CLASS, :cname, many(:param), :RULE, :rules, option(:END)) + + g.cname = seq(:rubyconst) {|name| + @result.params.classname = name + }\ + | seq(:rubyconst, "<", :rubyconst) {|c, _, s| + @result.params.classname = c + @result.params.superclass = s + } + + g.rubyconst = separated_by1(:colon2, :SYMBOL) {|syms| + syms.map {|s| s.to_s }.join('::') + } + + g.colon2 = seq(':', ':') + + g.param = seq(:CONV, many1(:convdef), :END) {|*| + #@grammar.end_convert_block # FIXME + }\ + | seq(:PRECHIGH, many1(:precdef), :PRECLOW) {|*| + @grammar.end_precedence_declaration true + }\ + | seq(:PRECLOW, many1(:precdef), :PRECHIGH) {|*| + @grammar.end_precedence_declaration false + }\ + | seq(:START, :symbol) {|_, sym| + @grammar.start_symbol = sym + }\ + | seq(:TOKEN, :symbols) {|_, syms| + syms.each do |s| + s.should_terminal + end + }\ + | seq(:OPTION, :options) {|_, syms| + syms.each do |opt| + case opt + when 'result_var' + @result.params.result_var = true + when 'no_result_var' + @result.params.result_var = false + when 'omit_action_call' + @result.params.omit_action_call = true + when 'no_omit_action_call' + @result.params.omit_action_call = false + else + raise CompileError, "unknown option: #{opt}" + end + end + }\ + | seq(:EXPECT, :DIGIT) {|_, num| + if @grammar.n_expected_srconflicts + raise CompileError, "`expect' seen twice" + end + @grammar.n_expected_srconflicts = num + } + + g.convdef = seq(:symbol, :STRING) {|sym, code| + sym.serialized = code + } + + g.precdef = seq(:LEFT, :symbols) {|_, syms| + @grammar.declare_precedence :Left, syms + }\ + | seq(:RIGHT, :symbols) {|_, syms| + @grammar.declare_precedence :Right, syms + }\ + | seq(:NONASSOC, :symbols) {|_, syms| + @grammar.declare_precedence :Nonassoc, syms + } + + g.symbols = seq(:symbol) {|sym| + [sym] + }\ + | seq(:symbols, :symbol) {|list, sym| + list.push sym + list + }\ + | seq(:symbols, "|") + + g.symbol = seq(:SYMBOL) {|sym| @grammar.intern(sym) }\ + | seq(:STRING) {|str| @grammar.intern(str) } + + g.options = many(:SYMBOL) {|syms| syms.map {|s| s.to_s } } + + g.rules = option(:rules_core) {|list| + add_rule_block list unless list.empty? + nil + } + + g.rules_core = seq(:symbol) {|sym| + [sym] + }\ + | seq(:rules_core, :rule_item) {|list, i| + list.push i + list + }\ + | seq(:rules_core, ';') {|list, *| + add_rule_block list unless list.empty? + list.clear + list + }\ + | seq(:rules_core, ':') {|list, *| + next_target = list.pop + add_rule_block list unless list.empty? + [next_target] + } + + g.rule_item = seq(:symbol)\ + | seq("|") {|*| + OrMark.new(@scanner.lineno) + }\ + | seq("=", :symbol) {|_, sym| + Prec.new(sym, @scanner.lineno) + }\ + | seq(:ACTION) {|src| + UserAction.source_text(src) + } + } + + GrammarFileParser = grammar.parser_class + + if grammar.states.srconflict_exist? + raise 'Racc boot script fatal: S/R conflict in build' + end + if grammar.states.rrconflict_exist? + raise 'Racc boot script fatal: R/R conflict in build' + end + + class GrammarFileParser # reopen + + class Result + def initialize(grammar) + @grammar = grammar + @params = ParserFileGenerator::Params.new + end + + attr_reader :grammar + attr_reader :params + end + + def GrammarFileParser.parse_file(filename) + parse(File.read(filename), filename, 1) + end + + def GrammarFileParser.parse(src, filename = '-', lineno = 1) + new().parse(src, filename, lineno) + end + + def initialize(debug_flags = DebugFlags.new) + @yydebug = debug_flags.parse + end + + def parse(src, filename = '-', lineno = 1) + @filename = filename + @lineno = lineno + @scanner = GrammarFileScanner.new(src, @filename) + @scanner.debug = @yydebug + @grammar = Grammar.new + @result = Result.new(@grammar) + @embedded_action_seq = 0 + yyparse @scanner, :yylex + parse_user_code + @result.grammar.init + @result + end + + private + + def next_token + @scanner.scan + end + + def on_error(tok, val, _values) + if val.respond_to?(:id2name) + v = val.id2name + elsif val.kind_of?(String) + v = val + else + v = val.inspect + end + raise CompileError, "#{location()}: unexpected token '#{v}'" + end + + def location + "#{@filename}:#{@lineno - 1 + @scanner.lineno}" + end + + def add_rule_block(list) + sprec = nil + target = list.shift + case target + when OrMark, UserAction, Prec + raise CompileError, "#{target.lineno}: unexpected symbol #{target.name}" + end + curr = [] + list.each do |i| + case i + when OrMark + add_rule target, curr, sprec + curr = [] + sprec = nil + when Prec + raise CompileError, "'=<prec>' used twice in one rule" if sprec + sprec = i.symbol + else + curr.push i + end + end + add_rule target, curr, sprec + end + + def add_rule(target, list, sprec) + if list.last.kind_of?(UserAction) + act = list.pop + else + act = UserAction.empty + end + list.map! {|s| s.kind_of?(UserAction) ? embedded_action(s) : s } + rule = Rule.new(target, list, act) + rule.specified_prec = sprec + @grammar.add rule + end + + def embedded_action(act) + sym = @grammar.intern("@#{@embedded_action_seq += 1}".intern, true) + @grammar.add Rule.new(sym, [], act) + sym + end + + # + # User Code Block + # + + def parse_user_code + line = @scanner.lineno + _, *blocks = *@scanner.epilogue.split(/^----/) + blocks.each do |block| + header, *body = block.lines.to_a + label0, pathes = *header.sub(/\A-+/, '').split('=', 2) + label = canonical_label(label0) + (pathes ? pathes.strip.split(' ') : []).each do |path| + add_user_code label, SourceText.new(File.read(path), path, 1) + end + add_user_code label, SourceText.new(body.join(''), @filename, line + 1) + line += (1 + body.size) + end + end + + USER_CODE_LABELS = { + 'header' => :header, + 'prepare' => :header, # obsolete + 'inner' => :inner, + 'footer' => :footer, + 'driver' => :footer # obsolete + } + + def canonical_label(src) + label = src.to_s.strip.downcase.slice(/\w+/) + unless USER_CODE_LABELS.key?(label) + raise CompileError, "unknown user code type: #{label.inspect}" + end + label + end + + def add_user_code(label, src) + @result.params.public_send(USER_CODE_LABELS[label]).push src + end + + end + + + class GrammarFileScanner + + def initialize(str, filename = '-') + @lines = str.b.split(/\n|\r\n|\r/) + @filename = filename + @lineno = -1 + @line_head = true + @in_rule_blk = false + @in_conv_blk = false + @in_block = nil + @epilogue = '' + @debug = false + next_line + end + + attr_reader :epilogue + + def lineno + @lineno + 1 + end + + attr_accessor :debug + + def yylex(&block) + unless @debug + yylex0(&block) + else + yylex0 do |sym, tok| + $stderr.printf "%7d %-10s %s\n", lineno(), sym.inspect, tok.inspect + yield [sym, tok] + end + end + end + + private + + def yylex0 + begin + until @line.empty? + @line.sub!(/\A\s+/, '') + if /\A\#/ =~ @line + break + elsif /\A\/\*/ =~ @line + skip_comment + elsif s = reads(/\A[a-zA-Z_]\w*/) + yield [atom_symbol(s), s.intern] + elsif s = reads(/\A\d+/) + yield [:DIGIT, s.to_i] + elsif ch = reads(/\A./) + case ch + when '"', "'" + yield [:STRING, eval(scan_quoted(ch))] + when '{' + lineno = lineno() + yield [:ACTION, SourceText.new(scan_action(), @filename, lineno)] + else + if ch == '|' + @line_head = false + end + yield [ch, ch] + end + else + end + end + end while next_line() + yield nil + end + + def next_line + @lineno += 1 + @line = @lines[@lineno] + if not @line or /\A----/ =~ @line + @epilogue = @lines.join("\n") + @lines.clear + @line = nil + if @in_block + @lineno -= 1 + scan_error! sprintf('unterminated %s', @in_block) + end + false + else + @line.sub!(/(?:\n|\r\n|\r)\z/, '') + @line_head = true + true + end + end + + ReservedWord = { + 'right' => :RIGHT, + 'left' => :LEFT, + 'nonassoc' => :NONASSOC, + 'preclow' => :PRECLOW, + 'prechigh' => :PRECHIGH, + 'token' => :TOKEN, + 'convert' => :CONV, + 'options' => :OPTION, + 'start' => :START, + 'expect' => :EXPECT, + 'class' => :CLASS, + 'rule' => :RULE, + 'end' => :END + } + + def atom_symbol(token) + if token == 'end' + symbol = :END + @in_conv_blk = false + @in_rule_blk = false + else + if @line_head and not @in_conv_blk and not @in_rule_blk + symbol = ReservedWord[token] || :SYMBOL + else + symbol = :SYMBOL + end + case symbol + when :RULE then @in_rule_blk = true + when :CONV then @in_conv_blk = true + end + end + @line_head = false + symbol + end + + def skip_comment + @in_block = 'comment' + until m = /\*\//.match(@line) + next_line + end + @line = m.post_match + @in_block = nil + end + + $raccs_print_type = false + + def scan_action + buf = String.new + nest = 1 + pre = nil + @in_block = 'action' + begin + pre = nil + if s = reads(/\A\s+/) + # does not set 'pre' + buf << s + end + until @line.empty? + if s = reads(/\A[^'"`{}%#\/\$]+/) + buf << (pre = s) + next + end + case ch = read(1) + when '{' + nest += 1 + buf << (pre = ch) + when '}' + nest -= 1 + if nest == 0 + @in_block = nil + buf.sub!(/[ \t\f]+\z/, '') + return buf + end + buf << (pre = ch) + when '#' # comment + buf << ch << @line + break + when "'", '"', '`' + buf << (pre = scan_quoted(ch)) + when '%' + if literal_head? pre, @line + # % string, regexp, array + buf << ch + case ch = read(1) + when /[qQx]/n + buf << ch << (pre = scan_quoted(read(1), '%string')) + when /wW/n + buf << ch << (pre = scan_quoted(read(1), '%array')) + when /s/n + buf << ch << (pre = scan_quoted(read(1), '%symbol')) + when /r/n + buf << ch << (pre = scan_quoted(read(1), '%regexp')) + when /[a-zA-Z0-9= ]/n # does not include "_" + scan_error! "unknown type of % literal '%#{ch}'" + else + buf << (pre = scan_quoted(ch, '%string')) + end + else + # operator + buf << '||op->' if $raccs_print_type + buf << (pre = ch) + end + when '/' + if literal_head? pre, @line + # regexp + buf << (pre = scan_quoted(ch, 'regexp')) + else + # operator + buf << '||op->' if $raccs_print_type + buf << (pre = ch) + end + when '$' # gvar + buf << ch << (pre = read(1)) + else + raise 'racc: fatal: must not happen' + end + end + buf << "\n" + end while next_line() + raise 'racc: fatal: scan finished before parser finished' + end + + def literal_head?(pre, post) + (!pre || /[a-zA-Z_0-9]/n !~ pre[-1,1]) && + !post.empty? && /\A[\s\=]/n !~ post + end + + def read(len) + s = @line[0, len] + @line = @line[len .. -1] + s + end + + def reads(re) + m = re.match(@line) or return nil + @line = m.post_match + m[0] + end + + def scan_quoted(left, tag = 'string') + buf = left.dup + buf = "||#{tag}->" + buf if $raccs_print_type + re = get_quoted_re(left) + sv, @in_block = @in_block, tag + begin + if s = reads(re) + buf << s + break + else + buf << @line + end + end while next_line() + @in_block = sv + buf << "<-#{tag}||" if $raccs_print_type + buf + end + + LEFT_TO_RIGHT = { + '(' => ')', + '{' => '}', + '[' => ']', + '<' => '>' + } + + CACHE = {} + + def get_quoted_re(left) + term = Regexp.quote(LEFT_TO_RIGHT[left] || left) + CACHE[left] ||= /\A[^#{term}\\]*(?:\\.[^\\#{term}]*)*#{term}/ + end + + def scan_error!(msg) + raise CompileError, "#{lineno()}: #{msg}" + end + + end + +end # module Racc diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/info.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/info.rb new file mode 100644 index 000000000000..f599b13cbb25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/info.rb @@ -0,0 +1,17 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +module Racc + VERSION = '1.5.2' + Version = VERSION + Copyright = 'Copyright (c) 1999-2006 Minero Aoki' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/iset.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/iset.rb new file mode 100644 index 000000000000..339221d21bc5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/iset.rb @@ -0,0 +1,92 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +module Racc + + # An "indexed" set. All items must respond to :ident. + class ISet + + def initialize(a = []) + @set = a + end + + attr_reader :set + + def add(i) + @set[i.ident] = i + end + + def [](key) + @set[key.ident] + end + + def []=(key, val) + @set[key.ident] = val + end + + alias include? [] + alias key? [] + + def update(other) + s = @set + o = other.set + o.each_index do |idx| + if t = o[idx] + s[idx] = t + end + end + end + + def update_a(a) + s = @set + a.each {|i| s[i.ident] = i } + end + + def delete(key) + i = @set[key.ident] + @set[key.ident] = nil + i + end + + def each(&block) + @set.compact.each(&block) + end + + def to_a + @set.compact + end + + def to_s + "[#{@set.compact.join(' ')}]" + end + + alias inspect to_s + + def size + @set.nitems + end + + def empty? + @set.nitems == 0 + end + + def clear + @set.clear + end + + def dup + ISet.new(@set.dup) + end + + end # class ISet + +end # module Racc diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/logfilegenerator.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/logfilegenerator.rb new file mode 100644 index 000000000000..2f5aa0c8b077 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/logfilegenerator.rb @@ -0,0 +1,212 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +module Racc + + class LogFileGenerator + + def initialize(states, debug_flags = DebugFlags.new) + @states = states + @grammar = states.grammar + @debug_flags = debug_flags + end + + def output(out) + output_conflict out; out.puts + output_useless out; out.puts + output_rule out; out.puts + output_token out; out.puts + output_state out + end + + # + # Warnings + # + + def output_conflict(out) + @states.each do |state| + if state.srconf + out.printf "state %d contains %d shift/reduce conflicts\n", + state.stateid, state.srconf.size + end + if state.rrconf + out.printf "state %d contains %d reduce/reduce conflicts\n", + state.stateid, state.rrconf.size + end + end + end + + def output_useless(out) + @grammar.each do |rl| + if rl.useless? + out.printf "rule %d (%s) never reduced\n", + rl.ident, rl.target.to_s + end + end + @grammar.each_nonterminal do |t| + if t.useless? + out.printf "useless nonterminal %s\n", t.to_s + end + end + end + + # + # States + # + + def output_state(out) + out << "--------- State ---------\n" + + showall = @debug_flags.la || @debug_flags.state + @states.each do |state| + out << "\nstate #{state.ident}\n\n" + + (showall ? state.closure : state.core).each do |ptr| + pointer_out(out, ptr) if ptr.rule.ident != 0 or showall + end + out << "\n" + + action_out out, state + end + end + + def pointer_out(out, ptr) + buf = sprintf("%4d) %s :", ptr.rule.ident, ptr.rule.target.to_s) + ptr.rule.symbols.each_with_index do |tok, idx| + buf << ' _' if idx == ptr.index + buf << ' ' << tok.to_s + end + buf << ' _' if ptr.reduce? + out.puts buf + end + + def action_out(f, state) + sr = state.srconf && state.srconf.dup + rr = state.rrconf && state.rrconf.dup + acts = state.action + keys = acts.keys + keys.sort! {|a,b| a.ident <=> b.ident } + + [ Shift, Reduce, Error, Accept ].each do |klass| + keys.delete_if do |tok| + act = acts[tok] + if act.kind_of?(klass) + outact f, tok, act + if sr and c = sr.delete(tok) + outsrconf f, c + end + if rr and c = rr.delete(tok) + outrrconf f, c + end + + true + else + false + end + end + end + sr.each {|tok, c| outsrconf f, c } if sr + rr.each {|tok, c| outrrconf f, c } if rr + + act = state.defact + if not act.kind_of?(Error) or @debug_flags.any? + outact f, '$default', act + end + + f.puts + state.goto_table.each do |t, st| + if t.nonterminal? + f.printf " %-12s go to state %d\n", t.to_s, st.ident + end + end + end + + def outact(f, t, act) + case act + when Shift + f.printf " %-12s shift, and go to state %d\n", + t.to_s, act.goto_id + when Reduce + f.printf " %-12s reduce using rule %d (%s)\n", + t.to_s, act.ruleid, act.rule.target.to_s + when Accept + f.printf " %-12s accept\n", t.to_s + when Error + f.printf " %-12s error\n", t.to_s + else + raise "racc: fatal: wrong act for outact: act=#{act}(#{act.class})" + end + end + + def outsrconf(f, confs) + confs.each do |c| + r = c.reduce + f.printf " %-12s [reduce using rule %d (%s)]\n", + c.shift.to_s, r.ident, r.target.to_s + end + end + + def outrrconf(f, confs) + confs.each do |c| + r = c.low_prec + f.printf " %-12s [reduce using rule %d (%s)]\n", + c.token.to_s, r.ident, r.target.to_s + end + end + + # + # Rules + # + + def output_rule(out) + out.print "-------- Grammar --------\n\n" + @grammar.each do |rl| + if @debug_flags.any? or rl.ident != 0 + out.printf "rule %d %s: %s\n", + rl.ident, rl.target.to_s, rl.symbols.join(' ') + end + end + end + + # + # Tokens + # + + def output_token(out) + out.print "------- Symbols -------\n\n" + + out.print "**Nonterminals, with rules where they appear\n\n" + @grammar.each_nonterminal do |t| + tmp = <<SRC + %s (%d) + on right: %s + on left : %s +SRC + out.printf tmp, t.to_s, t.ident, + symbol_locations(t.locate).join(' '), + symbol_locations(t.heads).join(' ') + end + + out.print "\n**Terminals, with rules where they appear\n\n" + @grammar.each_terminal do |t| + out.printf " %s (%d) %s\n", + t.to_s, t.ident, symbol_locations(t.locate).join(' ') + end + end + + def symbol_locations(locs) + locs.map {|loc| loc.rule.ident }.reject {|n| n == 0 }.uniq + end + + end + +end # module Racc diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/parser-text.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/parser-text.rb new file mode 100644 index 000000000000..7090c6a01ab7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/parser-text.rb @@ -0,0 +1,637 @@ +module Racc + PARSER_TEXT = <<'__end_of_file__' +# frozen_string_literal: false +#-- +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# +# As a special exception, when this code is copied by Racc +# into a Racc output file, you may use that output file +# without restriction. +#++ + +require 'racc/info' + +unless defined?(NotImplementedError) + NotImplementedError = NotImplementError # :nodoc: +end + +module Racc + class ParseError < StandardError; end +end +unless defined?(::ParseError) + ParseError = Racc::ParseError +end + +# Racc is a LALR(1) parser generator. +# It is written in Ruby itself, and generates Ruby programs. +# +# == Command-line Reference +# +# racc [-o<var>filename</var>] [--output-file=<var>filename</var>] +# [-e<var>rubypath</var>] [--executable=<var>rubypath</var>] +# [-v] [--verbose] +# [-O<var>filename</var>] [--log-file=<var>filename</var>] +# [-g] [--debug] +# [-E] [--embedded] +# [-l] [--no-line-convert] +# [-c] [--line-convert-all] +# [-a] [--no-omit-actions] +# [-C] [--check-only] +# [-S] [--output-status] +# [--version] [--copyright] [--help] <var>grammarfile</var> +# +# [+grammarfile+] +# Racc grammar file. Any extension is permitted. +# [-o+outfile+, --output-file=+outfile+] +# A filename for output. default is <+filename+>.tab.rb +# [-O+filename+, --log-file=+filename+] +# Place logging output in file +filename+. +# Default log file name is <+filename+>.output. +# [-e+rubypath+, --executable=+rubypath+] +# output executable file(mode 755). where +path+ is the Ruby interpreter. +# [-v, --verbose] +# verbose mode. create +filename+.output file, like yacc's y.output file. +# [-g, --debug] +# add debug code to parser class. To display debuggin information, +# use this '-g' option and set @yydebug true in parser class. +# [-E, --embedded] +# Output parser which doesn't need runtime files (racc/parser.rb). +# [-C, --check-only] +# Check syntax of racc grammar file and quit. +# [-S, --output-status] +# Print messages time to time while compiling. +# [-l, --no-line-convert] +# turns off line number converting. +# [-c, --line-convert-all] +# Convert line number of actions, inner, header and footer. +# [-a, --no-omit-actions] +# Call all actions, even if an action is empty. +# [--version] +# print Racc version and quit. +# [--copyright] +# Print copyright and quit. +# [--help] +# Print usage and quit. +# +# == Generating Parser Using Racc +# +# To compile Racc grammar file, simply type: +# +# $ racc parse.y +# +# This creates Ruby script file "parse.tab.y". The -o option can change the output filename. +# +# == Writing A Racc Grammar File +# +# If you want your own parser, you have to write a grammar file. +# A grammar file contains the name of your parser class, grammar for the parser, +# user code, and anything else. +# When writing a grammar file, yacc's knowledge is helpful. +# If you have not used yacc before, Racc is not too difficult. +# +# Here's an example Racc grammar file. +# +# class Calcparser +# rule +# target: exp { print val[0] } +# +# exp: exp '+' exp +# | exp '*' exp +# | '(' exp ')' +# | NUMBER +# end +# +# Racc grammar files resemble yacc files. +# But (of course), this is Ruby code. +# yacc's $$ is the 'result', $0, $1... is +# an array called 'val', and $-1, $-2... is an array called '_values'. +# +# See the {Grammar File Reference}[rdoc-ref:lib/racc/rdoc/grammar.en.rdoc] for +# more information on grammar files. +# +# == Parser +# +# Then you must prepare the parse entry method. There are two types of +# parse methods in Racc, Racc::Parser#do_parse and Racc::Parser#yyparse +# +# Racc::Parser#do_parse is simple. +# +# It's yyparse() of yacc, and Racc::Parser#next_token is yylex(). +# This method must returns an array like [TOKENSYMBOL, ITS_VALUE]. +# EOF is [false, false]. +# (TOKENSYMBOL is a Ruby symbol (taken from String#intern) by default. +# If you want to change this, see the grammar reference. +# +# Racc::Parser#yyparse is little complicated, but useful. +# It does not use Racc::Parser#next_token, instead it gets tokens from any iterator. +# +# For example, <code>yyparse(obj, :scan)</code> causes +# calling +obj#scan+, and you can return tokens by yielding them from +obj#scan+. +# +# == Debugging +# +# When debugging, "-v" or/and the "-g" option is helpful. +# +# "-v" creates verbose log file (.output). +# "-g" creates a "Verbose Parser". +# Verbose Parser prints the internal status when parsing. +# But it's _not_ automatic. +# You must use -g option and set +@yydebug+ to +true+ in order to get output. +# -g option only creates the verbose parser. +# +# === Racc reported syntax error. +# +# Isn't there too many "end"? +# grammar of racc file is changed in v0.10. +# +# Racc does not use '%' mark, while yacc uses huge number of '%' marks.. +# +# === Racc reported "XXXX conflicts". +# +# Try "racc -v xxxx.y". +# It causes producing racc's internal log file, xxxx.output. +# +# === Generated parsers does not work correctly +# +# Try "racc -g xxxx.y". +# This command let racc generate "debugging parser". +# Then set @yydebug=true in your parser. +# It produces a working log of your parser. +# +# == Re-distributing Racc runtime +# +# A parser, which is created by Racc, requires the Racc runtime module; +# racc/parser.rb. +# +# Ruby 1.8.x comes with Racc runtime module, +# you need NOT distribute Racc runtime files. +# +# If you want to include the Racc runtime module with your parser. +# This can be done by using '-E' option: +# +# $ racc -E -omyparser.rb myparser.y +# +# This command creates myparser.rb which `includes' Racc runtime. +# Only you must do is to distribute your parser file (myparser.rb). +# +# Note: parser.rb is ruby license, but your parser is not. +# Your own parser is completely yours. +module Racc + + unless defined?(Racc_No_Extensions) + Racc_No_Extensions = false # :nodoc: + end + + class Parser + + Racc_Runtime_Version = ::Racc::VERSION + Racc_Runtime_Core_Version_R = ::Racc::VERSION + + begin + if Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == 'jruby' + require 'jruby' + require 'racc/cparse-jruby.jar' + com.headius.racc.Cparse.new.load(JRuby.runtime, false) + else + require 'racc/cparse' + end + + unless new.respond_to?(:_racc_do_parse_c, true) + raise LoadError, 'old cparse.so' + end + if Racc_No_Extensions + raise LoadError, 'selecting ruby version of racc runtime core' + end + + Racc_Main_Parsing_Routine = :_racc_do_parse_c # :nodoc: + Racc_YY_Parse_Method = :_racc_yyparse_c # :nodoc: + Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_C # :nodoc: + Racc_Runtime_Type = 'c' # :nodoc: + rescue LoadError + Racc_Main_Parsing_Routine = :_racc_do_parse_rb + Racc_YY_Parse_Method = :_racc_yyparse_rb + Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_R + Racc_Runtime_Type = 'ruby' + end + + def Parser.racc_runtime_type # :nodoc: + Racc_Runtime_Type + end + + def _racc_setup + @yydebug = false unless self.class::Racc_debug_parser + @yydebug = false unless defined?(@yydebug) + if @yydebug + @racc_debug_out = $stderr unless defined?(@racc_debug_out) + @racc_debug_out ||= $stderr + end + arg = self.class::Racc_arg + arg[13] = true if arg.size < 14 + arg + end + + def _racc_init_sysvars + @racc_state = [0] + @racc_tstack = [] + @racc_vstack = [] + + @racc_t = nil + @racc_val = nil + + @racc_read_next = true + + @racc_user_yyerror = false + @racc_error_status = 0 + end + + # The entry point of the parser. This method is used with #next_token. + # If Racc wants to get token (and its value), calls next_token. + # + # Example: + # def parse + # @q = [[1,1], + # [2,2], + # [3,3], + # [false, '$']] + # do_parse + # end + # + # def next_token + # @q.shift + # end + class_eval %{ + def do_parse + #{Racc_Main_Parsing_Routine}(_racc_setup(), false) + end + } + + # The method to fetch next token. + # If you use #do_parse method, you must implement #next_token. + # + # The format of return value is [TOKEN_SYMBOL, VALUE]. + # +token-symbol+ is represented by Ruby's symbol by default, e.g. :IDENT + # for 'IDENT'. ";" (String) for ';'. + # + # The final symbol (End of file) must be false. + def next_token + raise NotImplementedError, "#{self.class}\#next_token is not defined" + end + + def _racc_do_parse_rb(arg, in_debug) + action_table, action_check, action_default, action_pointer, + _, _, _, _, + _, _, token_table, * = arg + + _racc_init_sysvars + tok = act = i = nil + + catch(:racc_end_parse) { + while true + if i = action_pointer[@racc_state[-1]] + if @racc_read_next + if @racc_t != 0 # not EOF + tok, @racc_val = next_token() + unless tok # EOF + @racc_t = 0 + else + @racc_t = (token_table[tok] or 1) # error token + end + racc_read_token(@racc_t, tok, @racc_val) if @yydebug + @racc_read_next = false + end + end + i += @racc_t + unless i >= 0 and + act = action_table[i] and + action_check[i] == @racc_state[-1] + act = action_default[@racc_state[-1]] + end + else + act = action_default[@racc_state[-1]] + end + while act = _racc_evalact(act, arg) + ; + end + end + } + end + + # Another entry point for the parser. + # If you use this method, you must implement RECEIVER#METHOD_ID method. + # + # RECEIVER#METHOD_ID is a method to get next token. + # It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE]. + class_eval %{ + def yyparse(recv, mid) + #{Racc_YY_Parse_Method}(recv, mid, _racc_setup(), false) + end + } + + def _racc_yyparse_rb(recv, mid, arg, c_debug) + action_table, action_check, action_default, action_pointer, + _, _, _, _, + _, _, token_table, * = arg + + _racc_init_sysvars + + catch(:racc_end_parse) { + until i = action_pointer[@racc_state[-1]] + while act = _racc_evalact(action_default[@racc_state[-1]], arg) + ; + end + end + recv.__send__(mid) do |tok, val| + unless tok + @racc_t = 0 + else + @racc_t = (token_table[tok] or 1) # error token + end + @racc_val = val + @racc_read_next = false + + i += @racc_t + unless i >= 0 and + act = action_table[i] and + action_check[i] == @racc_state[-1] + act = action_default[@racc_state[-1]] + end + while act = _racc_evalact(act, arg) + ; + end + + while !(i = action_pointer[@racc_state[-1]]) || + ! @racc_read_next || + @racc_t == 0 # $ + unless i and i += @racc_t and + i >= 0 and + act = action_table[i] and + action_check[i] == @racc_state[-1] + act = action_default[@racc_state[-1]] + end + while act = _racc_evalact(act, arg) + ; + end + end + end + } + end + + ### + ### common + ### + + def _racc_evalact(act, arg) + action_table, action_check, _, action_pointer, + _, _, _, _, + _, _, _, shift_n, + reduce_n, * = arg + nerr = 0 # tmp + + if act > 0 and act < shift_n + # + # shift + # + if @racc_error_status > 0 + @racc_error_status -= 1 unless @racc_t <= 1 # error token or EOF + end + @racc_vstack.push @racc_val + @racc_state.push act + @racc_read_next = true + if @yydebug + @racc_tstack.push @racc_t + racc_shift @racc_t, @racc_tstack, @racc_vstack + end + + elsif act < 0 and act > -reduce_n + # + # reduce + # + code = catch(:racc_jump) { + @racc_state.push _racc_do_reduce(arg, act) + false + } + if code + case code + when 1 # yyerror + @racc_user_yyerror = true # user_yyerror + return -reduce_n + when 2 # yyaccept + return shift_n + else + raise '[Racc Bug] unknown jump code' + end + end + + elsif act == shift_n + # + # accept + # + racc_accept if @yydebug + throw :racc_end_parse, @racc_vstack[0] + + elsif act == -reduce_n + # + # error + # + case @racc_error_status + when 0 + unless arg[21] # user_yyerror + nerr += 1 + on_error @racc_t, @racc_val, @racc_vstack + end + when 3 + if @racc_t == 0 # is $ + # We're at EOF, and another error occurred immediately after + # attempting auto-recovery + throw :racc_end_parse, nil + end + @racc_read_next = true + end + @racc_user_yyerror = false + @racc_error_status = 3 + while true + if i = action_pointer[@racc_state[-1]] + i += 1 # error token + if i >= 0 and + (act = action_table[i]) and + action_check[i] == @racc_state[-1] + break + end + end + throw :racc_end_parse, nil if @racc_state.size <= 1 + @racc_state.pop + @racc_vstack.pop + if @yydebug + @racc_tstack.pop + racc_e_pop @racc_state, @racc_tstack, @racc_vstack + end + end + return act + + else + raise "[Racc Bug] unknown action #{act.inspect}" + end + + racc_next_state(@racc_state[-1], @racc_state) if @yydebug + + nil + end + + def _racc_do_reduce(arg, act) + _, _, _, _, + goto_table, goto_check, goto_default, goto_pointer, + nt_base, reduce_table, _, _, + _, use_result, * = arg + + state = @racc_state + vstack = @racc_vstack + tstack = @racc_tstack + + i = act * -3 + len = reduce_table[i] + reduce_to = reduce_table[i+1] + method_id = reduce_table[i+2] + void_array = [] + + tmp_t = tstack[-len, len] if @yydebug + tmp_v = vstack[-len, len] + tstack[-len, len] = void_array if @yydebug + vstack[-len, len] = void_array + state[-len, len] = void_array + + # tstack must be updated AFTER method call + if use_result + vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0]) + else + vstack.push __send__(method_id, tmp_v, vstack) + end + tstack.push reduce_to + + racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug + + k1 = reduce_to - nt_base + if i = goto_pointer[k1] + i += state[-1] + if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1 + return curstate + end + end + goto_default[k1] + end + + # This method is called when a parse error is found. + # + # ERROR_TOKEN_ID is an internal ID of token which caused error. + # You can get string representation of this ID by calling + # #token_to_str. + # + # ERROR_VALUE is a value of error token. + # + # value_stack is a stack of symbol values. + # DO NOT MODIFY this object. + # + # This method raises ParseError by default. + # + # If this method returns, parsers enter "error recovering mode". + def on_error(t, val, vstack) + raise ParseError, sprintf("\nparse error on value %s (%s)", + val.inspect, token_to_str(t) || '?') + end + + # Enter error recovering mode. + # This method does not call #on_error. + def yyerror + throw :racc_jump, 1 + end + + # Exit parser. + # Return value is Symbol_Value_Stack[0]. + def yyaccept + throw :racc_jump, 2 + end + + # Leave error recovering mode. + def yyerrok + @racc_error_status = 0 + end + + # For debugging output + def racc_read_token(t, tok, val) + @racc_debug_out.print 'read ' + @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') ' + @racc_debug_out.puts val.inspect + @racc_debug_out.puts + end + + def racc_shift(tok, tstack, vstack) + @racc_debug_out.puts "shift #{racc_token2str tok}" + racc_print_stacks tstack, vstack + @racc_debug_out.puts + end + + def racc_reduce(toks, sim, tstack, vstack) + out = @racc_debug_out + out.print 'reduce ' + if toks.empty? + out.print ' <none>' + else + toks.each {|t| out.print ' ', racc_token2str(t) } + end + out.puts " --> #{racc_token2str(sim)}" + racc_print_stacks tstack, vstack + @racc_debug_out.puts + end + + def racc_accept + @racc_debug_out.puts 'accept' + @racc_debug_out.puts + end + + def racc_e_pop(state, tstack, vstack) + @racc_debug_out.puts 'error recovering mode: pop token' + racc_print_states state + racc_print_stacks tstack, vstack + @racc_debug_out.puts + end + + def racc_next_state(curstate, state) + @racc_debug_out.puts "goto #{curstate}" + racc_print_states state + @racc_debug_out.puts + end + + def racc_print_stacks(t, v) + out = @racc_debug_out + out.print ' [' + t.each_index do |i| + out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')' + end + out.puts ' ]' + end + + def racc_print_states(s) + out = @racc_debug_out + out.print ' [' + s.each {|st| out.print ' ', st } + out.puts ' ]' + end + + def racc_token2str(tok) + self.class::Racc_token_to_s_table[tok] or + raise "[Racc Bug] can't convert token #{tok} to string" + end + + # Convert internal ID of token symbol to the string. + def token_to_str(t) + self.class::Racc_token_to_s_table[t] + end + + end + +end + +__end_of_file__ +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/parser.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/parser.rb new file mode 100644 index 000000000000..df94e85eb75e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/parser.rb @@ -0,0 +1,632 @@ +# frozen_string_literal: false +#-- +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# +# As a special exception, when this code is copied by Racc +# into a Racc output file, you may use that output file +# without restriction. +#++ + +require 'racc/info' + +unless defined?(NotImplementedError) + NotImplementedError = NotImplementError # :nodoc: +end + +module Racc + class ParseError < StandardError; end +end +unless defined?(::ParseError) + ParseError = Racc::ParseError +end + +# Racc is a LALR(1) parser generator. +# It is written in Ruby itself, and generates Ruby programs. +# +# == Command-line Reference +# +# racc [-o<var>filename</var>] [--output-file=<var>filename</var>] +# [-e<var>rubypath</var>] [--executable=<var>rubypath</var>] +# [-v] [--verbose] +# [-O<var>filename</var>] [--log-file=<var>filename</var>] +# [-g] [--debug] +# [-E] [--embedded] +# [-l] [--no-line-convert] +# [-c] [--line-convert-all] +# [-a] [--no-omit-actions] +# [-C] [--check-only] +# [-S] [--output-status] +# [--version] [--copyright] [--help] <var>grammarfile</var> +# +# [+grammarfile+] +# Racc grammar file. Any extension is permitted. +# [-o+outfile+, --output-file=+outfile+] +# A filename for output. default is <+filename+>.tab.rb +# [-O+filename+, --log-file=+filename+] +# Place logging output in file +filename+. +# Default log file name is <+filename+>.output. +# [-e+rubypath+, --executable=+rubypath+] +# output executable file(mode 755). where +path+ is the Ruby interpreter. +# [-v, --verbose] +# verbose mode. create +filename+.output file, like yacc's y.output file. +# [-g, --debug] +# add debug code to parser class. To display debuggin information, +# use this '-g' option and set @yydebug true in parser class. +# [-E, --embedded] +# Output parser which doesn't need runtime files (racc/parser.rb). +# [-C, --check-only] +# Check syntax of racc grammar file and quit. +# [-S, --output-status] +# Print messages time to time while compiling. +# [-l, --no-line-convert] +# turns off line number converting. +# [-c, --line-convert-all] +# Convert line number of actions, inner, header and footer. +# [-a, --no-omit-actions] +# Call all actions, even if an action is empty. +# [--version] +# print Racc version and quit. +# [--copyright] +# Print copyright and quit. +# [--help] +# Print usage and quit. +# +# == Generating Parser Using Racc +# +# To compile Racc grammar file, simply type: +# +# $ racc parse.y +# +# This creates Ruby script file "parse.tab.y". The -o option can change the output filename. +# +# == Writing A Racc Grammar File +# +# If you want your own parser, you have to write a grammar file. +# A grammar file contains the name of your parser class, grammar for the parser, +# user code, and anything else. +# When writing a grammar file, yacc's knowledge is helpful. +# If you have not used yacc before, Racc is not too difficult. +# +# Here's an example Racc grammar file. +# +# class Calcparser +# rule +# target: exp { print val[0] } +# +# exp: exp '+' exp +# | exp '*' exp +# | '(' exp ')' +# | NUMBER +# end +# +# Racc grammar files resemble yacc files. +# But (of course), this is Ruby code. +# yacc's $$ is the 'result', $0, $1... is +# an array called 'val', and $-1, $-2... is an array called '_values'. +# +# See the {Grammar File Reference}[rdoc-ref:lib/racc/rdoc/grammar.en.rdoc] for +# more information on grammar files. +# +# == Parser +# +# Then you must prepare the parse entry method. There are two types of +# parse methods in Racc, Racc::Parser#do_parse and Racc::Parser#yyparse +# +# Racc::Parser#do_parse is simple. +# +# It's yyparse() of yacc, and Racc::Parser#next_token is yylex(). +# This method must returns an array like [TOKENSYMBOL, ITS_VALUE]. +# EOF is [false, false]. +# (TOKENSYMBOL is a Ruby symbol (taken from String#intern) by default. +# If you want to change this, see the grammar reference. +# +# Racc::Parser#yyparse is little complicated, but useful. +# It does not use Racc::Parser#next_token, instead it gets tokens from any iterator. +# +# For example, <code>yyparse(obj, :scan)</code> causes +# calling +obj#scan+, and you can return tokens by yielding them from +obj#scan+. +# +# == Debugging +# +# When debugging, "-v" or/and the "-g" option is helpful. +# +# "-v" creates verbose log file (.output). +# "-g" creates a "Verbose Parser". +# Verbose Parser prints the internal status when parsing. +# But it's _not_ automatic. +# You must use -g option and set +@yydebug+ to +true+ in order to get output. +# -g option only creates the verbose parser. +# +# === Racc reported syntax error. +# +# Isn't there too many "end"? +# grammar of racc file is changed in v0.10. +# +# Racc does not use '%' mark, while yacc uses huge number of '%' marks.. +# +# === Racc reported "XXXX conflicts". +# +# Try "racc -v xxxx.y". +# It causes producing racc's internal log file, xxxx.output. +# +# === Generated parsers does not work correctly +# +# Try "racc -g xxxx.y". +# This command let racc generate "debugging parser". +# Then set @yydebug=true in your parser. +# It produces a working log of your parser. +# +# == Re-distributing Racc runtime +# +# A parser, which is created by Racc, requires the Racc runtime module; +# racc/parser.rb. +# +# Ruby 1.8.x comes with Racc runtime module, +# you need NOT distribute Racc runtime files. +# +# If you want to include the Racc runtime module with your parser. +# This can be done by using '-E' option: +# +# $ racc -E -omyparser.rb myparser.y +# +# This command creates myparser.rb which `includes' Racc runtime. +# Only you must do is to distribute your parser file (myparser.rb). +# +# Note: parser.rb is ruby license, but your parser is not. +# Your own parser is completely yours. +module Racc + + unless defined?(Racc_No_Extensions) + Racc_No_Extensions = false # :nodoc: + end + + class Parser + + Racc_Runtime_Version = ::Racc::VERSION + Racc_Runtime_Core_Version_R = ::Racc::VERSION + + begin + if Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == 'jruby' + require 'jruby' + require 'racc/cparse-jruby.jar' + com.headius.racc.Cparse.new.load(JRuby.runtime, false) + else + require 'racc/cparse' + end + + unless new.respond_to?(:_racc_do_parse_c, true) + raise LoadError, 'old cparse.so' + end + if Racc_No_Extensions + raise LoadError, 'selecting ruby version of racc runtime core' + end + + Racc_Main_Parsing_Routine = :_racc_do_parse_c # :nodoc: + Racc_YY_Parse_Method = :_racc_yyparse_c # :nodoc: + Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_C # :nodoc: + Racc_Runtime_Type = 'c' # :nodoc: + rescue LoadError + Racc_Main_Parsing_Routine = :_racc_do_parse_rb + Racc_YY_Parse_Method = :_racc_yyparse_rb + Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_R + Racc_Runtime_Type = 'ruby' + end + + def Parser.racc_runtime_type # :nodoc: + Racc_Runtime_Type + end + + def _racc_setup + @yydebug = false unless self.class::Racc_debug_parser + @yydebug = false unless defined?(@yydebug) + if @yydebug + @racc_debug_out = $stderr unless defined?(@racc_debug_out) + @racc_debug_out ||= $stderr + end + arg = self.class::Racc_arg + arg[13] = true if arg.size < 14 + arg + end + + def _racc_init_sysvars + @racc_state = [0] + @racc_tstack = [] + @racc_vstack = [] + + @racc_t = nil + @racc_val = nil + + @racc_read_next = true + + @racc_user_yyerror = false + @racc_error_status = 0 + end + + # The entry point of the parser. This method is used with #next_token. + # If Racc wants to get token (and its value), calls next_token. + # + # Example: + # def parse + # @q = [[1,1], + # [2,2], + # [3,3], + # [false, '$']] + # do_parse + # end + # + # def next_token + # @q.shift + # end + class_eval %{ + def do_parse + #{Racc_Main_Parsing_Routine}(_racc_setup(), false) + end + } + + # The method to fetch next token. + # If you use #do_parse method, you must implement #next_token. + # + # The format of return value is [TOKEN_SYMBOL, VALUE]. + # +token-symbol+ is represented by Ruby's symbol by default, e.g. :IDENT + # for 'IDENT'. ";" (String) for ';'. + # + # The final symbol (End of file) must be false. + def next_token + raise NotImplementedError, "#{self.class}\#next_token is not defined" + end + + def _racc_do_parse_rb(arg, in_debug) + action_table, action_check, action_default, action_pointer, + _, _, _, _, + _, _, token_table, * = arg + + _racc_init_sysvars + tok = act = i = nil + + catch(:racc_end_parse) { + while true + if i = action_pointer[@racc_state[-1]] + if @racc_read_next + if @racc_t != 0 # not EOF + tok, @racc_val = next_token() + unless tok # EOF + @racc_t = 0 + else + @racc_t = (token_table[tok] or 1) # error token + end + racc_read_token(@racc_t, tok, @racc_val) if @yydebug + @racc_read_next = false + end + end + i += @racc_t + unless i >= 0 and + act = action_table[i] and + action_check[i] == @racc_state[-1] + act = action_default[@racc_state[-1]] + end + else + act = action_default[@racc_state[-1]] + end + while act = _racc_evalact(act, arg) + ; + end + end + } + end + + # Another entry point for the parser. + # If you use this method, you must implement RECEIVER#METHOD_ID method. + # + # RECEIVER#METHOD_ID is a method to get next token. + # It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE]. + class_eval %{ + def yyparse(recv, mid) + #{Racc_YY_Parse_Method}(recv, mid, _racc_setup(), false) + end + } + + def _racc_yyparse_rb(recv, mid, arg, c_debug) + action_table, action_check, action_default, action_pointer, + _, _, _, _, + _, _, token_table, * = arg + + _racc_init_sysvars + + catch(:racc_end_parse) { + until i = action_pointer[@racc_state[-1]] + while act = _racc_evalact(action_default[@racc_state[-1]], arg) + ; + end + end + recv.__send__(mid) do |tok, val| + unless tok + @racc_t = 0 + else + @racc_t = (token_table[tok] or 1) # error token + end + @racc_val = val + @racc_read_next = false + + i += @racc_t + unless i >= 0 and + act = action_table[i] and + action_check[i] == @racc_state[-1] + act = action_default[@racc_state[-1]] + end + while act = _racc_evalact(act, arg) + ; + end + + while !(i = action_pointer[@racc_state[-1]]) || + ! @racc_read_next || + @racc_t == 0 # $ + unless i and i += @racc_t and + i >= 0 and + act = action_table[i] and + action_check[i] == @racc_state[-1] + act = action_default[@racc_state[-1]] + end + while act = _racc_evalact(act, arg) + ; + end + end + end + } + end + + ### + ### common + ### + + def _racc_evalact(act, arg) + action_table, action_check, _, action_pointer, + _, _, _, _, + _, _, _, shift_n, + reduce_n, * = arg + nerr = 0 # tmp + + if act > 0 and act < shift_n + # + # shift + # + if @racc_error_status > 0 + @racc_error_status -= 1 unless @racc_t <= 1 # error token or EOF + end + @racc_vstack.push @racc_val + @racc_state.push act + @racc_read_next = true + if @yydebug + @racc_tstack.push @racc_t + racc_shift @racc_t, @racc_tstack, @racc_vstack + end + + elsif act < 0 and act > -reduce_n + # + # reduce + # + code = catch(:racc_jump) { + @racc_state.push _racc_do_reduce(arg, act) + false + } + if code + case code + when 1 # yyerror + @racc_user_yyerror = true # user_yyerror + return -reduce_n + when 2 # yyaccept + return shift_n + else + raise '[Racc Bug] unknown jump code' + end + end + + elsif act == shift_n + # + # accept + # + racc_accept if @yydebug + throw :racc_end_parse, @racc_vstack[0] + + elsif act == -reduce_n + # + # error + # + case @racc_error_status + when 0 + unless arg[21] # user_yyerror + nerr += 1 + on_error @racc_t, @racc_val, @racc_vstack + end + when 3 + if @racc_t == 0 # is $ + # We're at EOF, and another error occurred immediately after + # attempting auto-recovery + throw :racc_end_parse, nil + end + @racc_read_next = true + end + @racc_user_yyerror = false + @racc_error_status = 3 + while true + if i = action_pointer[@racc_state[-1]] + i += 1 # error token + if i >= 0 and + (act = action_table[i]) and + action_check[i] == @racc_state[-1] + break + end + end + throw :racc_end_parse, nil if @racc_state.size <= 1 + @racc_state.pop + @racc_vstack.pop + if @yydebug + @racc_tstack.pop + racc_e_pop @racc_state, @racc_tstack, @racc_vstack + end + end + return act + + else + raise "[Racc Bug] unknown action #{act.inspect}" + end + + racc_next_state(@racc_state[-1], @racc_state) if @yydebug + + nil + end + + def _racc_do_reduce(arg, act) + _, _, _, _, + goto_table, goto_check, goto_default, goto_pointer, + nt_base, reduce_table, _, _, + _, use_result, * = arg + + state = @racc_state + vstack = @racc_vstack + tstack = @racc_tstack + + i = act * -3 + len = reduce_table[i] + reduce_to = reduce_table[i+1] + method_id = reduce_table[i+2] + void_array = [] + + tmp_t = tstack[-len, len] if @yydebug + tmp_v = vstack[-len, len] + tstack[-len, len] = void_array if @yydebug + vstack[-len, len] = void_array + state[-len, len] = void_array + + # tstack must be updated AFTER method call + if use_result + vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0]) + else + vstack.push __send__(method_id, tmp_v, vstack) + end + tstack.push reduce_to + + racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug + + k1 = reduce_to - nt_base + if i = goto_pointer[k1] + i += state[-1] + if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1 + return curstate + end + end + goto_default[k1] + end + + # This method is called when a parse error is found. + # + # ERROR_TOKEN_ID is an internal ID of token which caused error. + # You can get string representation of this ID by calling + # #token_to_str. + # + # ERROR_VALUE is a value of error token. + # + # value_stack is a stack of symbol values. + # DO NOT MODIFY this object. + # + # This method raises ParseError by default. + # + # If this method returns, parsers enter "error recovering mode". + def on_error(t, val, vstack) + raise ParseError, sprintf("\nparse error on value %s (%s)", + val.inspect, token_to_str(t) || '?') + end + + # Enter error recovering mode. + # This method does not call #on_error. + def yyerror + throw :racc_jump, 1 + end + + # Exit parser. + # Return value is Symbol_Value_Stack[0]. + def yyaccept + throw :racc_jump, 2 + end + + # Leave error recovering mode. + def yyerrok + @racc_error_status = 0 + end + + # For debugging output + def racc_read_token(t, tok, val) + @racc_debug_out.print 'read ' + @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') ' + @racc_debug_out.puts val.inspect + @racc_debug_out.puts + end + + def racc_shift(tok, tstack, vstack) + @racc_debug_out.puts "shift #{racc_token2str tok}" + racc_print_stacks tstack, vstack + @racc_debug_out.puts + end + + def racc_reduce(toks, sim, tstack, vstack) + out = @racc_debug_out + out.print 'reduce ' + if toks.empty? + out.print ' <none>' + else + toks.each {|t| out.print ' ', racc_token2str(t) } + end + out.puts " --> #{racc_token2str(sim)}" + racc_print_stacks tstack, vstack + @racc_debug_out.puts + end + + def racc_accept + @racc_debug_out.puts 'accept' + @racc_debug_out.puts + end + + def racc_e_pop(state, tstack, vstack) + @racc_debug_out.puts 'error recovering mode: pop token' + racc_print_states state + racc_print_stacks tstack, vstack + @racc_debug_out.puts + end + + def racc_next_state(curstate, state) + @racc_debug_out.puts "goto #{curstate}" + racc_print_states state + @racc_debug_out.puts + end + + def racc_print_stacks(t, v) + out = @racc_debug_out + out.print ' [' + t.each_index do |i| + out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')' + end + out.puts ' ]' + end + + def racc_print_states(s) + out = @racc_debug_out + out.print ' [' + s.each {|st| out.print ' ', st } + out.puts ' ]' + end + + def racc_token2str(tok) + self.class::Racc_token_to_s_table[tok] or + raise "[Racc Bug] can't convert token #{tok} to string" + end + + # Convert internal ID of token symbol to the string. + def token_to_str(t) + self.class::Racc_token_to_s_table[t] + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/parserfilegenerator.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/parserfilegenerator.rb new file mode 100644 index 000000000000..fb6c209536d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/parserfilegenerator.rb @@ -0,0 +1,512 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +require 'racc/compat' +require 'racc/sourcetext' +require 'racc/parser-text' +require 'rbconfig' + +module Racc + + class ParserFileGenerator + + class Params + def self.bool_attr(name) + module_eval(<<-End) + def #{name}? + @#{name} + end + + def #{name}=(b) + @#{name} = b + end + End + end + + attr_accessor :filename + attr_accessor :classname + attr_accessor :superclass + bool_attr :omit_action_call + bool_attr :result_var + attr_accessor :header + attr_accessor :inner + attr_accessor :footer + + bool_attr :debug_parser + bool_attr :convert_line + bool_attr :convert_line_all + bool_attr :embed_runtime + bool_attr :make_executable + attr_accessor :interpreter + + def initialize + # Parameters derived from parser + self.filename = nil + self.classname = nil + self.superclass = 'Racc::Parser' + self.omit_action_call = true + self.result_var = true + self.header = [] + self.inner = [] + self.footer = [] + + # Parameters derived from command line options + self.debug_parser = false + self.convert_line = true + self.convert_line_all = false + self.embed_runtime = false + self.make_executable = false + self.interpreter = nil + end + end + + def initialize(states, params) + @states = states + @grammar = states.grammar + @params = params + end + + def generate_parser + string_io = StringIO.new + + init_line_conversion_system + @f = string_io + parser_file + + string_io.rewind + string_io.read + end + + def generate_parser_file(destpath) + init_line_conversion_system + File.open(destpath, 'w') {|f| + @f = f + parser_file + } + File.chmod 0755, destpath if @params.make_executable? + end + + private + + def parser_file + shebang @params.interpreter if @params.make_executable? + notice + line + if @params.embed_runtime? + embed_library runtime_source() + else + require 'racc/parser.rb' + end + header + parser_class(@params.classname, @params.superclass) { + inner + state_transition_table + } + footer + end + + c = ::RbConfig::CONFIG + RUBY_PATH = "#{c['bindir']}/#{c['ruby_install_name']}#{c['EXEEXT']}" + + def shebang(path) + line '#!' + (path == 'ruby' ? RUBY_PATH : path) + end + + def notice + line %q[#] + line %q[# DO NOT MODIFY!!!!] + line %Q[# This file is automatically generated by Racc #{Racc::Version}] + line %Q[# from Racc grammar file "#{@params.filename}".] + line %q[#] + end + + def runtime_source + SourceText.new(::Racc::PARSER_TEXT, 'racc/parser.rb', 1) + end + + def embed_library(src) + line %[###### #{src.filename} begin] + line %[unless $".index '#{src.filename}'] + line %[$".push '#{src.filename}'] + put src, @params.convert_line? + line %[end] + line %[###### #{src.filename} end] + end + + def require(feature) + line "require '#{feature}'" + end + + def parser_class(classname, superclass) + mods = classname.split('::') + classid = mods.pop + mods.each do |mod| + indent; line "module #{mod}" + cref_push mod + end + indent; line "class #{classid} < #{superclass}" + cref_push classid + yield + cref_pop + indent; line "end \# class #{classid}" + mods.reverse_each do |mod| + cref_pop + indent; line "end \# module #{mod}" + end + end + + def header + @params.header.each do |src| + line + put src, @params.convert_line_all? + end + end + + def inner + @params.inner.each do |src| + line + put src, @params.convert_line? + end + end + + def footer + @params.footer.each do |src| + line + put src, @params.convert_line_all? + end + end + + # Low Level Routines + + def put(src, convert_line = false) + if convert_line + replace_location(src) { + @f.puts src.text + } + else + @f.puts src.text + end + end + + def line(str = '') + @f.puts str + end + + def init_line_conversion_system + @cref = [] + @used_separator = {} + end + + def cref_push(name) + @cref.push name + end + + def cref_pop + @cref.pop + end + + def indent + @f.print ' ' * @cref.size + end + + def toplevel? + @cref.empty? + end + + def replace_location(src) + sep = make_separator(src) + @f.print 'self.class.' if toplevel? + @f.puts "module_eval(<<'#{sep}', '#{src.filename}', #{src.lineno})" + yield + @f.puts sep + end + + def make_separator(src) + sep = unique_separator(src.filename) + sep *= 2 while src.text.index(sep) + sep + end + + def unique_separator(id) + sep = String.new "...end #{id}/module_eval..." + while @used_separator.key?(sep) + sep.concat sprintf('%02x', rand(255)) + end + @used_separator[sep] = true + sep + end + + # + # State Transition Table Serialization + # + + public + + def put_state_transition_table(f) + @f = f + state_transition_table + end + + private + + def state_transition_table + table = @states.state_transition_table + table.use_result_var = @params.result_var? + table.debug_parser = @params.debug_parser? + + line "##### State transition tables begin ###" + line + integer_list 'racc_action_table', table.action_table + line + integer_list 'racc_action_check', table.action_check + line + integer_list 'racc_action_pointer', table.action_pointer + line + integer_list 'racc_action_default', table.action_default + line + integer_list 'racc_goto_table', table.goto_table + line + integer_list 'racc_goto_check', table.goto_check + line + integer_list 'racc_goto_pointer', table.goto_pointer + line + integer_list 'racc_goto_default', table.goto_default + line + i_i_sym_list 'racc_reduce_table', table.reduce_table + line + line "racc_reduce_n = #{table.reduce_n}" + line + line "racc_shift_n = #{table.shift_n}" + line + sym_int_hash 'racc_token_table', table.token_table + line + line "racc_nt_base = #{table.nt_base}" + line + line "racc_use_result_var = #{table.use_result_var}" + line + @f.print(unindent_auto(<<-End)) + Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + End + line + string_list 'Racc_token_to_s_table', table.token_to_s_table + line + line "Racc_debug_parser = #{table.debug_parser}" + line + line '##### State transition tables end #####' + actions + end + + def integer_list(name, table) + if table.size > 2000 + serialize_integer_list_compressed name, table + else + serialize_integer_list_std name, table + end + end + + def serialize_integer_list_compressed(name, table) + # TODO: this can be made a LOT more clean with a simple split/map + sep = "\n" + nsep = ",\n" + buf = String.new + com = '' + ncom = ',' + co = com + @f.print 'clist = [' + table.each do |i| + buf << co << i.to_s; co = ncom + if buf.size > 66 + @f.print sep; sep = nsep + @f.print "'", buf, "'" + buf = String.new + co = com + end + end + unless buf.empty? + @f.print sep + @f.print "'", buf, "'" + end + line ' ]' + + @f.print(<<-End) + #{name} = arr = ::Array.new(#{table.size}, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + End + end + + def serialize_integer_list_std(name, table) + sep = '' + line "#{name} = [" + table.each_slice(10) do |ns| + @f.print sep; sep = ",\n" + @f.print ns.map {|n| sprintf('%6s', n ? n.to_s : 'nil') }.join(',') + end + line ' ]' + end + + def i_i_sym_list(name, table) + sep = '' + line "#{name} = [" + table.each_slice(3) do |len, target, mid| + @f.print sep; sep = ",\n" + @f.printf ' %d, %d, %s', len, target, mid.inspect + end + line " ]" + end + + def sym_int_hash(name, h) + sep = "\n" + @f.print "#{name} = {" + h.to_a.sort_by {|sym, i| i }.each do |sym, i| + @f.print sep; sep = ",\n" + @f.printf " %s => %d", sym.serialize, i + end + line " }" + end + + def string_list(name, list) + sep = " " + line "#{name} = [" + list.each do |s| + @f.print sep; sep = ",\n " + @f.print s.dump + end + line ' ]' + end + + def actions + @grammar.each do |rule| + unless rule.action.source? + raise "racc: fatal: cannot generate parser file when any action is a Proc" + end + end + + if @params.result_var? + decl = ', result' + retval = "\n result" + default_body = '' + else + decl = '' + retval = '' + default_body = 'val[0]' + end + @grammar.each do |rule| + line + if rule.action.empty? and @params.omit_action_call? + line "# reduce #{rule.ident} omitted" + else + src0 = rule.action.source || SourceText.new(default_body, __FILE__, 0) + if @params.convert_line? + src = remove_blank_lines(src0) + delim = make_delimiter(src.text) + @f.printf unindent_auto(<<-End), + module_eval(<<'%s', '%s', %d) + def _reduce_%d(val, _values%s) + %s%s + end + %s + End + delim, src.filename, src.lineno - 1, + rule.ident, decl, + src.text, retval, + delim + else + src = remove_blank_lines(src0) + @f.printf unindent_auto(<<-End), + def _reduce_%d(val, _values%s) + %s%s + end + End + rule.ident, decl, + src.text, retval + end + end + end + line + @f.printf unindent_auto(<<-'End'), decl + def _reduce_none(val, _values%s) + val[0] + end + End + line + end + + def remove_blank_lines(src) + body = src.text.dup + line = src.lineno + while body.slice!(/\A[ \t\f]*(?:\n|\r\n|\r)/) + line += 1 + end + SourceText.new(body, src.filename, line) + end + + def make_delimiter(body) + delim = '.,.,' + while body.index(delim) + delim *= 2 + end + delim + end + + def unindent_auto(str) + lines = str.lines.to_a + n = minimum_indent(lines) + lines.map {|line| detab(line).sub(indent_re(n), '').rstrip + "\n" }.join('') + end + + def minimum_indent(lines) + lines.map {|line| n_indent(line) }.min + end + + def n_indent(line) + line.slice(/\A\s+/).size + end + + RE_CACHE = {} + + def indent_re(n) + RE_CACHE[n] ||= /\A {#{n}}/ + end + + def detab(str, ts = 8) + add = 0 + len = nil + str.gsub(/\t/) { + len = ts - ($`.size + add) % ts + add += len - 1 + ' ' * len + } + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/pre-setup b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/pre-setup new file mode 100644 index 000000000000..5027d865b7ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/pre-setup @@ -0,0 +1,13 @@ +def generate_parser_text_rb(target) + return if File.exist?(srcfile(target)) + $stderr.puts "generating #{target}..." + File.open(target, 'w') {|f| + f.puts "module Racc" + f.puts " PARSER_TEXT = <<'__end_of_file__'" + f.puts File.read(srcfile('parser.rb')) + f.puts "__end_of_file__" + f.puts "end" + } +end + +generate_parser_text_rb 'parser-text.rb' diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/sourcetext.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/sourcetext.rb new file mode 100644 index 000000000000..de52dcae9b62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/sourcetext.rb @@ -0,0 +1,35 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +module Racc + + class SourceText + def initialize(text, filename, lineno) + @text = text + @filename = filename + @lineno = lineno + end + + attr_reader :text + attr_reader :filename + attr_reader :lineno + + def to_s + "#<SourceText #{location()}>" + end + + def location + "#{@filename}:#{@lineno}" + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/state.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/state.rb new file mode 100644 index 000000000000..f85809fbeb17 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/state.rb @@ -0,0 +1,972 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +require 'racc/iset' +require 'racc/statetransitiontable' +require 'racc/exception' +require 'forwardable' + +module Racc + + # A table of LALR states. + class States + + include Enumerable + + def initialize(grammar, debug_flags = DebugFlags.new) + @grammar = grammar + @symboltable = grammar.symboltable + @d_state = debug_flags.state + @d_la = debug_flags.la + @d_prec = debug_flags.prec + @states = [] + @statecache = {} + @actions = ActionTable.new(@grammar, self) + @nfa_computed = false + @dfa_computed = false + end + + attr_reader :grammar + attr_reader :actions + + def size + @states.size + end + + def inspect + '#<state table>' + end + + alias to_s inspect + + def [](i) + @states[i] + end + + def each_state(&block) + @states.each(&block) + end + + alias each each_state + + def each_index(&block) + @states.each_index(&block) + end + + extend Forwardable + + def_delegator "@actions", :shift_n + def_delegator "@actions", :reduce_n + def_delegator "@actions", :nt_base + + def should_report_srconflict? + srconflict_exist? and + (n_srconflicts() != @grammar.n_expected_srconflicts) + end + + def srconflict_exist? + n_srconflicts() != 0 + end + + def n_srconflicts + @n_srconflicts ||= inject(0) {|sum, st| sum + st.n_srconflicts } + end + + def rrconflict_exist? + n_rrconflicts() != 0 + end + + def n_rrconflicts + @n_rrconflicts ||= inject(0) {|sum, st| sum + st.n_rrconflicts } + end + + def state_transition_table + @state_transition_table ||= StateTransitionTable.generate(self.dfa) + end + + # + # NFA (Non-deterministic Finite Automaton) Computation + # + + public + + def nfa + return self if @nfa_computed + compute_nfa + @nfa_computed = true + self + end + + private + + def compute_nfa + @grammar.init + # add state 0 + core_to_state [ @grammar[0].ptrs[0] ] + # generate LALR states + cur = 0 + @gotos = [] + while cur < @states.size + generate_states @states[cur] # state is added here + cur += 1 + end + @actions.init + end + + def generate_states(state) + puts "dstate: #{state}" if @d_state + + table = {} + state.closure.each do |ptr| + if sym = ptr.dereference + addsym table, sym, ptr.next + end + end + table.each do |sym, core| + puts "dstate: sym=#{sym} ncore=#{core}" if @d_state + + dest = core_to_state(core.to_a) + state.goto_table[sym] = dest + id = sym.nonterminal?() ? @gotos.size : nil + g = Goto.new(id, sym, state, dest) + @gotos.push g if sym.nonterminal? + state.gotos[sym] = g + puts "dstate: #{state.ident} --#{sym}--> #{dest.ident}" if @d_state + + # check infinite recursion + if state.ident == dest.ident and state.closure.size == 1 + raise CompileError, + sprintf("Infinite recursion: state %d, with rule %d", + state.ident, state.ptrs[0].rule.ident) + end + end + end + + def addsym(table, sym, ptr) + unless s = table[sym] + table[sym] = s = ISet.new + end + s.add ptr + end + + def core_to_state(core) + # + # convert CORE to a State object. + # If matching state does not exist, create it and add to the table. + # + + k = fingerprint(core) + unless dest = @statecache[k] + # not registered yet + dest = State.new(@states.size, core) + @states.push dest + + @statecache[k] = dest + + puts "core_to_state: create state ID #{dest.ident}" if @d_state + else + if @d_state + puts "core_to_state: dest is cached ID #{dest.ident}" + puts "core_to_state: dest core #{dest.core.join(' ')}" + end + end + + dest + end + + def fingerprint(arr) + arr.map {|i| i.ident }.pack('L*') + end + + # + # DFA (Deterministic Finite Automaton) Generation + # + + public + + def dfa + return self if @dfa_computed + nfa + compute_dfa + @dfa_computed = true + self + end + + private + + def compute_dfa + la = lookahead() + @states.each do |state| + state.la = la + resolve state + end + set_accept + @states.each do |state| + pack state + end + check_useless + end + + def lookahead + # + # lookahead algorithm ver.3 -- from bison 1.26 + # + + gotos = @gotos + if @d_la + puts "\n--- goto ---" + gotos.each_with_index {|g, i| print i, ' '; p g } + end + + ### initialize_LA() + ### set_goto_map() + la_rules = [] + @states.each do |state| + state.check_la la_rules + end + + ### initialize_F() + f = create_tmap(gotos.size) + reads = [] + edge = [] + gotos.each do |goto| + goto.to_state.goto_table.each do |t, st| + if t.terminal? + f[goto.ident] |= (1 << t.ident) + elsif t.nullable? + edge.push goto.to_state.gotos[t].ident + end + end + if edge.empty? + reads.push nil + else + reads.push edge + edge = [] + end + end + digraph f, reads + if @d_la + puts "\n--- F1 (reads) ---" + print_tab gotos, reads, f + end + + ### build_relations() + ### compute_FOLLOWS + path = nil + edge = [] + lookback = Array.new(la_rules.size, nil) + includes = [] + gotos.each do |goto| + goto.symbol.heads.each do |ptr| + path = record_path(goto.from_state, ptr.rule) + lastgoto = path.last + st = lastgoto ? lastgoto.to_state : goto.from_state + if st.conflict? + addrel lookback, st.rruleid(ptr.rule), goto + end + path.reverse_each do |g| + break if g.symbol.terminal? + edge.push g.ident + break unless g.symbol.nullable? + end + end + if edge.empty? + includes.push nil + else + includes.push edge + edge = [] + end + end + includes = transpose(includes) + digraph f, includes + if @d_la + puts "\n--- F2 (includes) ---" + print_tab gotos, includes, f + end + + ### compute_lookaheads + la = create_tmap(la_rules.size) + lookback.each_with_index do |arr, i| + if arr + arr.each do |g| + la[i] |= f[g.ident] + end + end + end + if @d_la + puts "\n--- LA (lookback) ---" + print_tab la_rules, lookback, la + end + + la + end + + def create_tmap(size) + Array.new(size, 0) # use Integer as bitmap + end + + def addrel(tbl, i, item) + if a = tbl[i] + a.push item + else + tbl[i] = [item] + end + end + + def record_path(begst, rule) + st = begst + path = [] + rule.symbols.each do |t| + goto = st.gotos[t] + path.push goto + st = goto.to_state + end + path + end + + def transpose(rel) + new = Array.new(rel.size, nil) + rel.each_with_index do |arr, idx| + if arr + arr.each do |i| + addrel new, i, idx + end + end + end + new + end + + def digraph(map, relation) + n = relation.size + index = Array.new(n, nil) + vertices = [] + @infinity = n + 2 + + index.each_index do |i| + if not index[i] and relation[i] + traverse i, index, vertices, map, relation + end + end + end + + def traverse(i, index, vertices, map, relation) + vertices.push i + index[i] = height = vertices.size + + if rp = relation[i] + rp.each do |proci| + unless index[proci] + traverse proci, index, vertices, map, relation + end + if index[i] > index[proci] + # circulative recursion !!! + index[i] = index[proci] + end + map[i] |= map[proci] + end + end + + if index[i] == height + while true + proci = vertices.pop + index[proci] = @infinity + break if i == proci + + map[proci] |= map[i] + end + end + end + + # for debug + def print_atab(idx, tab) + tab.each_with_index do |i,ii| + printf '%-20s', idx[ii].inspect + p i + end + end + + def print_tab(idx, rel, tab) + tab.each_with_index do |bin,i| + print i, ' ', idx[i].inspect, ' << '; p rel[i] + print ' ' + each_t(@symboltable, bin) {|t| print ' ', t } + puts + end + end + + # for debug + def print_tab_i(idx, rel, tab, i) + bin = tab[i] + print i, ' ', idx[i].inspect, ' << '; p rel[i] + print ' ' + each_t(@symboltable, bin) {|t| print ' ', t } + end + + # for debug + def printb(i) + each_t(@symboltable, i) do |t| + print t, ' ' + end + puts + end + + def each_t(tbl, set) + 0.upto( set.size ) do |i| + (0..7).each do |ii| + if set[idx = i * 8 + ii] == 1 + yield tbl[idx] + end + end + end + end + + # + # resolve + # + + def resolve(state) + if state.conflict? + resolve_rr state, state.ritems + resolve_sr state, state.stokens + else + if state.rrules.empty? + # shift + state.stokens.each do |t| + state.action[t] = @actions.shift(state.goto_table[t]) + end + else + # reduce + state.defact = @actions.reduce(state.rrules[0]) + end + end + end + + def resolve_rr(state, r) + r.each do |item| + item.each_la(@symboltable) do |t| + act = state.action[t] + if act + unless act.kind_of?(Reduce) + raise "racc: fatal: #{act.class} in action table" + end + # Cannot resolve R/R conflict (on t). + # Reduce with upper rule as default. + state.rr_conflict act.rule, item.rule, t + else + # No conflict. + state.action[t] = @actions.reduce(item.rule) + end + end + end + end + + def resolve_sr(state, s) + s.each do |stok| + goto = state.goto_table[stok] + act = state.action[stok] + + unless act + # no conflict + state.action[stok] = @actions.shift(goto) + else + unless act.kind_of?(Reduce) + puts 'DEBUG -------------------------------' + p stok + p act + state.action.each do |k,v| + print k.inspect, ' ', v.inspect, "\n" + end + raise "racc: fatal: #{act.class} in action table" + end + + # conflict on stok + + rtok = act.rule.precedence + case do_resolve_sr(stok, rtok) + when :Reduce + # action is already set + + when :Shift + # overwrite + act.decref + state.action[stok] = @actions.shift(goto) + + when :Error + act.decref + state.action[stok] = @actions.error + + when :CantResolve + # shift as default + act.decref + state.action[stok] = @actions.shift(goto) + state.sr_conflict stok, act.rule + end + end + end + end + + ASSOC = { + :Left => :Reduce, + :Right => :Shift, + :Nonassoc => :Error + } + + def do_resolve_sr(stok, rtok) + puts "resolve_sr: s/r conflict: rtok=#{rtok}, stok=#{stok}" if @d_prec + + unless rtok and rtok.precedence + puts "resolve_sr: no prec for #{rtok}(R)" if @d_prec + return :CantResolve + end + rprec = rtok.precedence + + unless stok and stok.precedence + puts "resolve_sr: no prec for #{stok}(S)" if @d_prec + return :CantResolve + end + sprec = stok.precedence + + ret = if rprec == sprec + ASSOC[rtok.assoc] or + raise "racc: fatal: #{rtok}.assoc is not Left/Right/Nonassoc" + else + (rprec > sprec) ? (:Reduce) : (:Shift) + end + + puts "resolve_sr: resolved as #{ret.id2name}" if @d_prec + ret + end + + # + # complete + # + + def set_accept + anch = @symboltable.anchor + init_state = @states[0].goto_table[@grammar.start] + targ_state = init_state.action[anch].goto_state + acc_state = targ_state.action[anch].goto_state + + acc_state.action.clear + acc_state.goto_table.clear + acc_state.defact = @actions.accept + end + + def pack(state) + ### find most frequently used reduce rule + act = state.action + arr = Array.new(@grammar.size, 0) + act.each do |t, a| + arr[a.ruleid] += 1 if a.kind_of?(Reduce) + end + i = arr.max + s = (i > 0) ? arr.index(i) : nil + + ### set & delete default action + if s + r = @actions.reduce(s) + if not state.defact or state.defact == r + act.delete_if {|t, a| a == r } + state.defact = r + end + else + state.defact ||= @actions.error + end + end + + def check_useless + used = [] + @actions.each_reduce do |act| + if not act or act.refn == 0 + act.rule.useless = true + else + t = act.rule.target + used[t.ident] = t + end + end + @symboltable.nt_base.upto(@symboltable.nt_max - 1) do |n| + unless used[n] + @symboltable[n].useless = true + end + end + end + + end # class StateTable + + + # A LALR state. + class State + + def initialize(ident, core) + @ident = ident + @core = core + @goto_table = {} + @gotos = {} + @stokens = nil + @ritems = nil + @action = {} + @defact = nil + @rrconf = nil + @srconf = nil + + @closure = make_closure(@core) + end + + attr_reader :ident + alias stateid ident + alias hash ident + + attr_reader :core + attr_reader :closure + + attr_reader :goto_table + attr_reader :gotos + + attr_reader :stokens + attr_reader :ritems + attr_reader :rrules + + attr_reader :action + attr_accessor :defact # default action + + attr_reader :rrconf + attr_reader :srconf + + def inspect + "<state #{@ident}>" + end + + alias to_s inspect + + def ==(oth) + @ident == oth.ident + end + + alias eql? == + + def make_closure(core) + set = ISet.new + core.each do |ptr| + set.add ptr + if t = ptr.dereference and t.nonterminal? + set.update_a t.expand + end + end + set.to_a + end + + def check_la(la_rules) + @conflict = false + s = [] + r = [] + @closure.each do |ptr| + if t = ptr.dereference + if t.terminal? + s[t.ident] = t + if t.ident == 1 # $error + @conflict = true + end + end + else + r.push ptr.rule + end + end + unless r.empty? + if not s.empty? or r.size > 1 + @conflict = true + end + end + s.compact! + @stokens = s + @rrules = r + + if @conflict + @la_rules_i = la_rules.size + @la_rules = r.map {|i| i.ident } + la_rules.concat r + else + @la_rules_i = @la_rules = nil + end + end + + def conflict? + @conflict + end + + def rruleid(rule) + if i = @la_rules.index(rule.ident) + @la_rules_i + i + else + puts '/// rruleid' + p self + p rule + p @rrules + p @la_rules_i + raise 'racc: fatal: cannot get reduce rule id' + end + end + + def la=(la) + return unless @conflict + i = @la_rules_i + @ritems = r = [] + @rrules.each do |rule| + r.push Item.new(rule, la[i]) + i += 1 + end + end + + def rr_conflict(high, low, ctok) + c = RRconflict.new(@ident, high, low, ctok) + + @rrconf ||= {} + if a = @rrconf[ctok] + a.push c + else + @rrconf[ctok] = [c] + end + end + + def sr_conflict(shift, reduce) + c = SRconflict.new(@ident, shift, reduce) + + @srconf ||= {} + if a = @srconf[shift] + a.push c + else + @srconf[shift] = [c] + end + end + + def n_srconflicts + @srconf ? @srconf.size : 0 + end + + def n_rrconflicts + @rrconf ? @rrconf.size : 0 + end + + end # class State + + + # + # Represents a transition on the grammar. + # "Real goto" means a transition by nonterminal, + # but this class treats also terminal's. + # If one is a terminal transition, .ident returns nil. + # + class Goto + def initialize(ident, sym, from, to) + @ident = ident + @symbol = sym + @from_state = from + @to_state = to + end + + attr_reader :ident + attr_reader :symbol + attr_reader :from_state + attr_reader :to_state + + def inspect + "(#{@from_state.ident}-#{@symbol}->#{@to_state.ident})" + end + end + + + # LALR item. A set of rule and its lookahead tokens. + class Item + def initialize(rule, la) + @rule = rule + @la = la + end + + attr_reader :rule + attr_reader :la + + def each_la(tbl) + la = @la + 0.upto(la.size - 1) do |i| + (0..7).each do |ii| + if la[idx = i * 8 + ii] == 1 + yield tbl[idx] + end + end + end + end + end + + + # The table of LALR actions. Actions are either of + # Shift, Reduce, Accept and Error. + class ActionTable + + def initialize(rt, st) + @grammar = rt + @statetable = st + + @reduce = [] + @shift = [] + @accept = nil + @error = nil + end + + def init + @grammar.each do |rule| + @reduce.push Reduce.new(rule) + end + @statetable.each do |state| + @shift.push Shift.new(state) + end + @accept = Accept.new + @error = Error.new + end + + def reduce_n + @reduce.size + end + + def reduce(i) + case i + when Rule then i = i.ident + when Integer then ; + else + raise "racc: fatal: wrong class #{i.class} for reduce" + end + + r = @reduce[i] or raise "racc: fatal: reduce action #{i.inspect} not exist" + r.incref + r + end + + def each_reduce(&block) + @reduce.each(&block) + end + + def shift_n + @shift.size + end + + def shift(i) + case i + when State then i = i.ident + when Integer then ; + else + raise "racc: fatal: wrong class #{i.class} for shift" + end + + @shift[i] or raise "racc: fatal: shift action #{i} does not exist" + end + + def each_shift(&block) + @shift.each(&block) + end + + attr_reader :accept + attr_reader :error + + end + + + class Shift + def initialize(goto) + @goto_state = goto + end + + attr_reader :goto_state + + def goto_id + @goto_state.ident + end + + def inspect + "<shift #{@goto_state.ident}>" + end + end + + + class Reduce + def initialize(rule) + @rule = rule + @refn = 0 + end + + attr_reader :rule + attr_reader :refn + + def ruleid + @rule.ident + end + + def inspect + "<reduce #{@rule.ident}>" + end + + def incref + @refn += 1 + end + + def decref + @refn -= 1 + raise 'racc: fatal: act.refn < 0' if @refn < 0 + end + end + + class Accept + def inspect + "<accept>" + end + end + + class Error + def inspect + "<error>" + end + end + + class SRconflict + def initialize(sid, shift, reduce) + @stateid = sid + @shift = shift + @reduce = reduce + end + + attr_reader :stateid + attr_reader :shift + attr_reader :reduce + + def to_s + sprintf('state %d: S/R conflict rule %d reduce and shift %s', + @stateid, @reduce.ruleid, @shift.to_s) + end + end + + class RRconflict + def initialize(sid, high, low, tok) + @stateid = sid + @high_prec = high + @low_prec = low + @token = tok + end + + attr_reader :stateid + attr_reader :high_prec + attr_reader :low_prec + attr_reader :token + + def to_s + sprintf('state %d: R/R conflict with rule %d and %d on %s', + @stateid, @high_prec.ident, @low_prec.ident, @token.to_s) + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/statetransitiontable.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/statetransitiontable.rb new file mode 100644 index 000000000000..4252ba01848f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/statetransitiontable.rb @@ -0,0 +1,317 @@ +#-- +# +# +# +# Copyright (c) 1999-2006 Minero Aoki +# +# This program is free software. +# You can distribute/modify this program under the same terms of ruby. +# see the file "COPYING". +# +#++ + +require 'racc/parser' + +unless Object.method_defined?(:funcall) + class Object + alias funcall __send__ + end +end + +module Racc + + StateTransitionTable = Struct.new(:action_table, + :action_check, + :action_default, + :action_pointer, + :goto_table, + :goto_check, + :goto_default, + :goto_pointer, + :token_table, + :reduce_table, + :reduce_n, + :shift_n, + :nt_base, + :token_to_s_table, + :use_result_var, + :debug_parser) + class StateTransitionTable # reopen + def StateTransitionTable.generate(states) + StateTransitionTableGenerator.new(states).generate + end + + def initialize(states) + super() + @states = states + @grammar = states.grammar + self.use_result_var = true + self.debug_parser = true + end + + attr_reader :states + attr_reader :grammar + + def parser_class + ParserClassGenerator.new(@states).generate + end + + def token_value_table + h = {} + token_table().each do |sym, i| + h[sym.value] = i + end + h + end + end + + + class StateTransitionTableGenerator + + def initialize(states) + @states = states + @grammar = states.grammar + end + + def generate + t = StateTransitionTable.new(@states) + gen_action_tables t, @states + gen_goto_tables t, @grammar + t.token_table = token_table(@grammar) + t.reduce_table = reduce_table(@grammar) + t.reduce_n = @states.reduce_n + t.shift_n = @states.shift_n + t.nt_base = @grammar.nonterminal_base + t.token_to_s_table = @grammar.symbols.map {|sym| sym.to_s } + t + end + + def reduce_table(grammar) + t = [0, 0, :racc_error] + grammar.each_with_index do |rule, idx| + next if idx == 0 + t.push rule.size + t.push rule.target.ident + t.push(if rule.action.empty? # and @params.omit_action_call? + then :_reduce_none + else "_reduce_#{idx}".intern + end) + end + t + end + + def token_table(grammar) + h = {} + grammar.symboltable.terminals.each do |t| + h[t] = t.ident + end + h + end + + def gen_action_tables(t, states) + t.action_table = yytable = [] + t.action_check = yycheck = [] + t.action_default = yydefact = [] + t.action_pointer = yypact = [] + e1 = [] + e2 = [] + states.each do |state| + yydefact.push act2actid(state.defact) + if state.action.empty? + yypact.push nil + next + end + vector = [] + state.action.each do |tok, act| + vector[tok.ident] = act2actid(act) + end + addent e1, vector, state.ident, yypact + end + set_table e1, e2, yytable, yycheck, yypact + end + + def gen_goto_tables(t, grammar) + t.goto_table = yytable2 = [] + t.goto_check = yycheck2 = [] + t.goto_pointer = yypgoto = [] + t.goto_default = yydefgoto = [] + e1 = [] + e2 = [] + grammar.each_nonterminal do |tok| + tmp = [] + + # decide default + freq = Array.new(@states.size, 0) + @states.each do |state| + st = state.goto_table[tok] + if st + st = st.ident + freq[st] += 1 + end + tmp[state.ident] = st + end + max = freq.max + if max > 1 + default = freq.index(max) + tmp.map! {|i| default == i ? nil : i } + else + default = nil + end + yydefgoto.push default + + # delete default value + tmp.pop until tmp.last or tmp.empty? + if tmp.compact.empty? + # only default + yypgoto.push nil + next + end + + addent e1, tmp, (tok.ident - grammar.nonterminal_base), yypgoto + end + set_table e1, e2, yytable2, yycheck2, yypgoto + end + + def addent(all, arr, chkval, ptr) + max = arr.size + min = nil + arr.each_with_index do |item, idx| + if item + min ||= idx + end + end + ptr.push(-7777) # mark + arr = arr[min...max] + all.push [arr, chkval, mkmapexp(arr), min, ptr.size - 1] + end + + n = 2 ** 16 + begin + Regexp.compile("a{#{n}}") + RE_DUP_MAX = n + rescue RegexpError + n /= 2 + retry + end + + def mkmapexp(arr) + i = ii = 0 + as = arr.size + map = String.new + maxdup = RE_DUP_MAX + curr = nil + while i < as + ii = i + 1 + if arr[i] + ii += 1 while ii < as and arr[ii] + curr = '-' + else + ii += 1 while ii < as and not arr[ii] + curr = '.' + end + + offset = ii - i + if offset == 1 + map << curr + else + while offset > maxdup + map << "#{curr}{#{maxdup}}" + offset -= maxdup + end + map << "#{curr}{#{offset}}" if offset > 1 + end + i = ii + end + Regexp.compile(map, 'n') + end + + def set_table(entries, dummy, tbl, chk, ptr) + upper = 0 + map = '-' * 10240 + + # sort long to short + entries.sort_by!.with_index {|a,i| [-a[0].size, i] } + + entries.each do |arr, chkval, expr, min, ptri| + if upper + arr.size > map.size + map << '-' * (arr.size + 1024) + end + idx = map.index(expr) + ptr[ptri] = idx - min + arr.each_with_index do |item, i| + if item + i += idx + tbl[i] = item + chk[i] = chkval + map[i] = ?o + end + end + upper = idx + arr.size + end + end + + def act2actid(act) + case act + when Shift then act.goto_id + when Reduce then -act.ruleid + when Accept then @states.shift_n + when Error then @states.reduce_n * -1 + else + raise "racc: fatal: wrong act type #{act.class} in action table" + end + end + + end + + + class ParserClassGenerator + + def initialize(states) + @states = states + @grammar = states.grammar + end + + def generate + table = @states.state_transition_table + c = Class.new(::Racc::Parser) + c.const_set :Racc_arg, [table.action_table, + table.action_check, + table.action_default, + table.action_pointer, + table.goto_table, + table.goto_check, + table.goto_default, + table.goto_pointer, + table.nt_base, + table.reduce_table, + table.token_value_table, + table.shift_n, + table.reduce_n, + false] + c.const_set :Racc_token_to_s_table, table.token_to_s_table + c.const_set :Racc_debug_parser, true + define_actions c + c + end + + private + + def define_actions(c) + c.module_eval "def _reduce_none(vals, vstack) vals[0] end" + @grammar.each do |rule| + if rule.action.empty? + c.funcall(:alias_method, "_reduce_#{rule.ident}", :_reduce_none) + else + c.funcall(:define_method, "_racc_action_#{rule.ident}", &rule.action.proc) + c.module_eval(<<-End, __FILE__, __LINE__ + 1) + def _reduce_#{rule.ident}(vals, vstack) + _racc_action_#{rule.ident}(*vals) + end + End + end + end + end + + end + +end # module Racc diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/static.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/static.rb new file mode 100644 index 000000000000..bebbeb5aa6c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/lib/racc/static.rb @@ -0,0 +1,5 @@ +require 'racc' +require 'racc/parser' +require 'racc/grammarfileparser' +require 'racc/parserfilegenerator' +require 'racc/logfilegenerator' diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/en/NEWS.en.rdoc b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/en/NEWS.en.rdoc new file mode 100644 index 000000000000..07a45eff91bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/en/NEWS.en.rdoc @@ -0,0 +1,282 @@ += NEWS + +=== 1.4.6 + +* Bugfixes + + * bin/racc -g option renamed to -t + * racc/compiler.rb is removed + * '|' is allowed with meta rules + * Ruby 1.8.7 compatibility fixes + * Ruby 1.9 compatibility fixes + +=== 1.4.5 (2005-11-21) + * [FEATURE CHANGE] --no-extensions option was removed. + * [fix] racc command should not depend on `raccrt' package. + * [fix] --no-omit-actions did not work. + * setup.rb 3.4.1. + +=== 1.4.4 (2003-10-12) + * document changed. + * -all packages does not include amstd and strscan. + * setup.rb 3.2.1. + +=== 1.4.3 (2002-11-14) + * [fix] reduce ruby 1.8 warnings. + +=== 1.4.2 (2002-01-29) + * [new] new option --no-extentions + +=== 1.4.1 (2001-12-02) + * now Racc does not depend on amstd library. + * update y2racc and racc2y for racc 1.4.1 + +=== 1.4.0 (2001-11-30) + * minor version up for checking in runtime library into ruby CVS repositry. + * RaccParser, RaccScanner -&gt; GrammarFileParser, GrammarFileScanner + * modify typo (grammer -&gt; grammar) + +=== 1.3.12 (2001-11-22) + * modify installer bug (thanks Tanaka Akira) + * enhance regexp/%-strings/gvar detection in action block + +=== 1.3.11 (2001-08-28) + * modify scan error on $' $` $/ etc. + +=== 1.3.10 (2001-08-12) + * modify prototype missmatch in cparse.c + +=== 1.3.9 (2001-04-07) + * support Ruby 1.4 again. + +=== 1.3.8 (2001-03-17) + * output symbol name when error + * Racc::Parser#token_to_str + +=== 1.3.7 (2001-02-04) + * allow nil for EndOfInput (experimental) + * more sample grammar files + +=== 1.3.6 (2001-01-22) + * modify cparse.so for static link + +=== 1.3.5 (2001-01-18) + * %-string scanning was wrong + * new directive "expect" + +=== 1.3.4 (2001-01-11) + * cparse: add type checks + * cparse: rm depend + * cparse: does not pass non-VALUE object to rb_iterate() + +=== 1.3.3 (2000-12-25) + * <em>critical bug</em> in generator (from 1.3.1) + * racc --runtime-version + +=== 1.3.2 (2000-12-21) + * bug with racc -E + * package strscan togather (again) + +=== 1.3.1 (2000-12-17) + * dynamically determine RE_DUP_MAX + * ruby version routine was used always + +=== 1.3.0 (2000-11-30) + * can yield(sym,val) from scanner (Parser#yyparse) + +=== 1.2.6 (2000-11-28) + * class M::C + +=== 1.2.5 (2000-11-20) + * big changes in option; -h -f -p -i -n -c -A are incompatible + * support long options + * y2racc, racc2y leaves actions as default + +=== 1.2.4 (2000-09-13) + * updates installer and documents + +=== 1.2.3 (2000-08-14) + * output useless rules and nonterminals (version 2) + * nonassoc makes error (never shift/reduce) + +=== 1.2.2 (2000-08-12) + * internal changes + +=== 1.2.1 (2000-08-05) + * racc2y, y2racc + +=== 1.2.0 (2000-08-02) + * uses bison's lookahead algorithm + +=== 1.1.6 (2000-07-25) + * new keyword "options" and its parameter "no_result_var" + +=== 1.1.5 (2000-07-21) + * [IMPORTANT] change keyword "token" to "convert" + * NEW keyword "token" for token declearation + +=== 1.1.4 (2000-07-13) + * update installer + * samples had bugs + +=== 1.1.3 (2000-06-30) + * new option -a; does not omit void action call + +=== 1.1.2 (2000-06-29) + * now racc does not use strscan.so + * ScanError -&gt; Racc::ScanError, ParseError -&gt; Racc::ParseError + * more friendly error messages + +=== 1.1.1 (2000-06-15) + * require miss + * conflicts were not reported with -v + +=== 1.1.0 (2000-06-12) + * use other algolithm for generating state table + +=== 1.0.4 (2000-06-04) + * S/R conflict & -v flag causes unexpected exception (reported by Tosh) + * output useless nonterminals/rules + +=== 1.0.3 (2000-06-03) + * use Array#collect! instead of #filter. + +=== 1.0.2 (2000-05-16) + * update installer (setup.rb) + +=== 1.0.1 (2000-05-12) + * state.rb: faster lookahead & debug lalr code + * refine code + * update amstd package (1.7.0) + +=== 1.0.0 (2000-05-06) + * version 1.0 + +=== 0.14.6 (2000-05-05) + * much more debug output + +=== 0.14.5 (2000-05-01) + +=== 0.14.4 (2000-04-09) + * Racc_* are included in Racc_arg + * faster state generation (a little) + +=== 0.14.3 (2000-04-04) + * check both of SYM2ID and ID2SYM (thanks Katsuyuki Komatsu) + +=== 0.14.2 (2000-04-03) + * "class" on first line causes parse error (thanks Yoshiki Wada) + * new option "racc -V" + +=== 0.14.1 (2000-03-31) + +=== 0.14.0 (2000-03-21) + * implement "fast" table (same to bison) + * stop line no. conversion temporaliry because of ruby bug + +=== 0.13.1 (2000-03-21) + * racc --version --copyright did not work (thanks Tadayoshi Funaba) + +=== 0.13.0 (2000-03-20) + * implement yyerror/yyerrok/yyaccept + +=== 0.12.2 (2000-03-19) + * -E flag had bug + +=== 0.12.1 (2000-03-16) + * modify the way to decide default action + +=== 0.12.0 (2000-03-15) + * implement real LALR + * use both SLR and LALR to resolve conflicts + +=== 0.11.3 (2000-03-09) + * modify lookahead routine again + +=== 0.11.2 (2000-03-09) + * bug in lookahead routine + * modify cparse.so for Symbol class of ruby 1.5 + +=== 0.11.1 (2000-03-08) + * modify for Symbol + * update strscan + +=== 0.11.0 (2000-02-19) + * if error is occured in action, ruby print line number of grammar file + +=== 0.10.9 (2000-01-19) + * change package/setup + +=== 0.10.8 (2000-01-03) + * (1-17 re-packed) add/modify documents + +=== 0.10.7 (2000-01-03) + * modify setup.rb, compile.rb, amstd/inst. (thanks: Koji Arai) + +=== 0.10.6 (1999-12-24) + * racc -e ruby + * omit void action call + +=== 0.10.5 (1999-12-21) + * critical bug in embedded action implement + * bug in setup.rb + * modify calc[2].y for 0.10 + +=== 0.10.4 (1999-12-19) + * support error recover ('error' token) + * can embed runtime by "racc -E" + * Racc is module + +=== 0.10.3 (1999-12-01) + * support embedded action + * modify .output bug + +=== 0.10.2 (1999-11-27) + * update document + * separate libracc.rb + +=== 0.10.1 (1999-11-19) + * rewrite runtime routine in C + * once next_token returns [false, *], not call next_token + * action is only default, not call next_token + * $end is obsolute + * LALRactionTable + +=== 0.10.0 (1999-11-06) + * next_value, peep_token is obsolute + * @__debug__ -&gt; @yydebug + * class...rule...end + * refine libracc.rb + * unify strscan library + * *.rb are installed in lib/ruby/VERSION/racc/ + +=== 0.9.5 (1999-10-03) + * too few arguments for __show_stack__ + * could not scan $end + * typo in d.format.rb + +=== 0.9.4 (1999-09-??) + +=== 0.9.3 (1999-09-03) + +=== 0.9.2 (1999-06-26) + +=== 0.9.1 (1999-06-08) + +=== 0.9.0 (1999-06-03) + +=== 0.8.11 (?) + +=== 0.8.10 (?) + +=== 0.8.9 (1999-03-21) + +=== 0.8.8 (1999-03-20) + +=== 0.8.7 (1999-03-01) + +=== 0.8.0 (1999-01-16) + +=== 0.5.0 (1999-01-07) + +=== 0.1.0 (1999-01-01) diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/en/grammar.en.rdoc b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/en/grammar.en.rdoc new file mode 100644 index 000000000000..b15c6e6bbc6e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/en/grammar.en.rdoc @@ -0,0 +1,230 @@ += Racc Grammar File Reference + +== Global Structure + +== Class Block and User Code Block + +There's two block on toplevel. +one is 'class' block, another is 'user code' block. 'user code' block MUST +places after 'class' block. + +== Comment + +You can insert comment about all places. Two style comment can be used, +Ruby style (#.....) and C style (/*......*/) . + +== Class Block + +The class block is formed like this: +-- +class CLASS_NAME + [precedance table] + [token declearations] + [expected number of S/R conflict] + [options] + [semantic value convertion] + [start rule] +rule + GRAMMARS +-- +CLASS_NAME is a name of parser class. +This is the name of generating parser class. + +If CLASS_NAME includes '::', Racc outputs module clause. +For example, writing "class M::C" causes creating the code bellow: +-- +module M + class C + : + : + end +end +-- + +== Grammar Block + +The grammar block discripts grammar which is able +to be understood by parser. Syntax is: +-- +(token): (token) (token) (token).... (action) + +(token): (token) (token) (token).... (action) + | (token) (token) (token).... (action) + | (token) (token) (token).... (action) +-- +(action) is an action which is executed when its (token)s are found. +(action) is a ruby code block, which is surrounded by braces: +-- +{ print val[0] + puts val[1] } +-- +Note that you cannot use '%' string, here document, '%r' regexp in action. + +Actions can be omitted. +When it is omitted, '' (empty string) is used. + +A return value of action is a value of left side value ($$). +It is value of result, or returned value by "return" statement. + +Here is an example of whole grammar block. +-- +rule + goal: definition ruls source { result = val } + + definition: /* none */ { result = [] } + | definition startdesig { result[0] = val[1] } + | definition + precrule # this line continue from upper line + { + result[1] = val[1] + } + + startdesig: START TOKEN +-- +You can use following special local variables in action. + + * result ($$) + +The value of left-hand side (lhs). A default value is val[0]. + + * val ($1,$2,$3...) + +An array of value of right-hand side (rhs). + + * _values (...$-2,$-1,$0) + +A stack of values. +DO NOT MODIFY this stack unless you know what you are doing. + +== Operator Precedance + +This function is equal to '%prec' in yacc. +To designate this block: +-- +prechigh + nonassoc '++' + left '*' '/' + left '+' '-' + right '=' +preclow +-- +`right' is yacc's %right, `left' is yacc's %left. + +`=' + (symbol) means yacc's %prec: +-- +prechigh + nonassoc UMINUS + left '*' '/' + left '+' '-' +preclow + +rule + exp: exp '*' exp + | exp '-' exp + | '-' exp =UMINUS # equals to "%prec UMINUS" + : + : +-- + +== expect + +Racc has bison's "expect" directive. +-- +# Example + +class MyParser +rule + expect 3 + : + : +-- +This directive declears "expected" number of shift/reduce conflict. +If "expected" number is equal to real number of conflicts, +racc does not print confliction warning message. + +== Declaring Tokens + +By declaring tokens, you can avoid many meanless bugs. +If decleared token does not exist/existing token does not decleared, +Racc output warnings. Declearation syntax is: +-- +token TOKEN_NAME AND_IS_THIS + ALSO_THIS_IS AGAIN_AND_AGAIN THIS_IS_LAST +-- + +== Options + +You can write options for racc command in your racc file. +-- +options OPTION OPTION ... +-- +Options are: + + * omit_action_call + +omit empty action call or not. + + * result_var + +use/does not use local variable "result" + +You can use 'no_' prefix to invert its meanings. + +== Converting Token Symbol + +Token symbols are, as default, + + * naked token string in racc file (TOK, XFILE, this_is_token, ...) + --&gt; symbol (:TOK, :XFILE, :this_is_token, ...) + * quoted string (':', '.', '(', ...) + --&gt; same string (':', '.', '(', ...) + +You can change this default by "convert" block. +Here is an example: +-- +convert + PLUS 'PlusClass' # We use PlusClass for symbol of `PLUS' + MIN 'MinusClass' # We use MinusClass for symbol of `MIN' +end +-- +We can use almost all ruby value can be used by token symbol, +except 'false' and 'nil'. These are causes unexpected parse error. + +If you want to use String as token symbol, special care is required. +For example: +-- +convert + class '"cls"' # in code, "cls" + PLUS '"plus\n"' # in code, "plus\n" + MIN "\"minus#{val}\"" # in code, \"minus#{val}\" +end +-- + +== Start Rule + +'%start' in yacc. This changes start rule. +-- +start real_target +-- +This statement will not be used forever, I think. + +== User Code Block + +"User Code Block" is a Ruby source code which is copied to output. +There are three user code block, "header" "inner" and "footer". + +Format of user code is like this: +-- +---- header + ruby statement + ruby statement + ruby statement + +---- inner + ruby statement + : + : +-- +If four '-' exist on line head, +racc treat it as beginning of user code block. +A name of user code must be one word. diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/NEWS.ja.rdoc b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/NEWS.ja.rdoc new file mode 100644 index 000000000000..c82475730e4a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/NEWS.ja.rdoc @@ -0,0 +1,307 @@ += NEWS + +=== 1.4.6 + +* バグの修正 + + * bin/racc -g オプションを -t に改名 + * racc/compiler.rb を削除 + * '|' が meta rules によって許可 + * Ruby 1.8.7 互換性を修正 + * Ruby 1.9 互換性を修正 + +=== 1.4.5 (2005-11-21) + * [FEATURE CHANGE] --no-extensions オプションを削除 + * [fix] racc パッケージのみで -E を使えるように修正 + * [fix] --no-omit-actions が動作していなかったのを修正 + * setup.rb 3.4.1. + +=== 1.4.4 (2003-10-12) + * Ruby 1.8.0 に対応するリリース。本体に変更はなし + * -all パッケージに strscan, amstd の同梱するのをやめた + * setup.rb 3.2.1 + +=== 1.4.3 (2002-11-14) + * [fix] ruby 1.8 の警告を消した + +=== 1.4.2 (2002-01-29) + * [new] 新しいオプション --no-extentions + +=== 1.4.1 (2001-12-02) + * amstd 非依存になった (ただし -all パッケージへバンドルは継続) + * y2racc racc2y を 1.4 対応にした + +=== 1.4.0 (2001-11-30) + * ランタイムを Ruby の CVS に入れたのにあわせてマイナーバージョンアップ + * RaccParser, RaccScanner → GrammarFileParser, GrammarFileScanner + * ハズい typo を修正 (grammer → grammar) + +=== 1.3.12 (2001-11-22) + * インストーラのバグを修正 (thanks Tanaka Akira) + * アクション中の正規表現や % 文字列、グローバル変数の検出を向上させた + +=== 1.3.11 (2001-08-28) + * アクション中の $' $` $/ などを正しくスキャン + +=== 1.3.10 (2001-08-12) + * cparse.c のプロトタイプ違いを直した + +=== 1.3.9 (2001-04-07) + * Ruby 1.4 に(再び)対応した + +=== 1.3.8 (2001-03-17) + * パースエラーの時に記号名も出力するようにした + * Racc::Parser#token_to_s + +=== 1.3.7 (2001-02-04) + * サンプルを増やした + +=== 1.3.6 (2001-01-22) + * cparse がスタティックリンクされても動くようにした + +=== 1.3.5 (2001-01-18) + * % 文字列のスキャンがバグってた + * 新しい命令 expect + +=== 1.3.4 (2001-01-11) + * cparse: シンボルのタイプチェックを入れた + * cparse: depend を消した + * cparse: rb_iterate 中の GC で落ちるバグを修正 + +=== 1.3.3 (2000-12-25) + * ジェネレータに致命的なバグ。1.3.1 から混入 (format.rb) + * racc --runtime-version + +=== 1.3.2 (2000-12-21) + * -E が失敗するのを直した + * 再度 strscan を同梱 (y2racc/racc2y に必要) + +=== 1.3.1 (2000-12-17) + * 正規表現の繰り返し指定の上限を動的に決定する (RE_DUP_MAX) + * パースルーチンが常に Ruby 版になっていた (消し忘れ) + +=== 1.3.0 (2000-11-30) + * スキャナから yield でトークンを渡せるようになった + +=== 1.2.6 (2000-11-28) + * class M::C を許した + +=== 1.2.5 (2000-11-20) + * オプションに大変動。非互換オプションは -h -f -p -i -n -c -A + * ロングオプションをサポート + * y2racc, racc2y はデフォルトでアクションを残すようにした + +=== 1.2.4 (2000-09-13) + * インストーラとドキュメントを更新 + +=== 1.2.3 (2000-08-14) + * 使われない規則と非終端記号を出力 (強力版) + * S/R conflict の時 nonassoc で解決するならばエラー + +=== 1.2.2 (2000-08-12) + * 内部の変更 + +=== 1.2.1 (2000-08-05) + * yacc との変換コマンド racc2y・y2racc を添付 + +=== 1.2.0 (2000-08-02) + * 先読みアルゴリズムを bison のものに変更 + +=== 1.1.6 (2000-07-25) + * 新たなキーワード options とその引数 no_result_var + +=== 1.1.5 (2000-07-21) + * [重要] token を convert に変更 + * 「新たな」キーワード token (終端記号の宣言) + +=== 1.1.4 (2000-07-13) + * サンプルがバグってた + +=== 1.1.3 (2000-06-30) + * 空アクションの呼び出しを省略しないようにするオプション -a + +=== 1.1.2 (2000-06-29) + * スキャナで strscan を使わないようにした + * ScanError -&gt; Racc::ScanError, ParseError -&gt; Racc::ParseError + * エラーメッセージを強化 + +=== 1.1.1 (2000-06-15) + * requireミス (thanks Toshさん) + * -v をつけるとconflictが報告されなくなっていた + +=== 1.1.0 (2000-06-12) + * 新しい 状態遷移表生成アルゴリズム + +=== 1.0.4 (2000-06-04) + * S/R conflict がおきると .output 出力で落ちるバグ修正 (Tosh さんの報告) + * 使われない非終端記号・規則を表示 + +=== 1.0.3 (2000-06-03) + * filter -&gt; collect! + +=== 1.0.2 (2000-05-16) + * インストーラをアップデート + +=== 1.0.1 (2000-05-12) + * state.rb: 先読みルーチンをちょっとだけ高速化 && 追加デバッグ + * コードを整理した。著作権表示全体を全部のファイルにつけた。 + * amstd アップデート (1.7.0) + +=== 1.0.0 (2000-05-06) + * バージョン 1.0 + +=== 0.14.6 (2000-05-05) + * デバッグ出力を詳細にした + +=== 0.14.5 (2000-05-01) + * インストーラを ruby 1.4.4 系の新しいパスに対応させた + +=== 0.14.4 (2000-04-09) + * パーサの定数を削減(Racc_arg にまとめた) + * state 生成を微妙に高速化(コアを文字列に変換) + +=== 0.14.3 (2000-04-04) + * cparse の SYM2ID と ID2SYM のチェックを分離 (thanks 小松さん) + +=== 0.14.2 (2000-04-03) + * 一行目の class がパースエラーになっていた (thanks 和田さん) + * 新しいフラグ racc -V + +=== 0.14.1 (2000-03-31) + +=== 0.14.0 (2000-03-21) + * 高速テーブルを実装 + * 一時的にファイル名/行番号の変換をやめた(Rubyのバグのため。) + +=== 0.13.1 (2000-03-21) + * --version --copyright などがうまく働いてなかった (thanks ふなばさん) + +=== 0.13.0 (2000-03-20) + * yyerror/yyerrok/yyaccept を実装 + +=== 0.12.2 (2000-03-19) + * -E フラグがバグってた (thanks ふなばさん) + +=== 0.12.1 (2000-03-16) + * デフォルトアクションの決め方をちょっと修正(元に戻しただけ) + +=== 0.12.0 (2000-03-15) + * 完全な LALR を実装したら遅くなったので SLR も併用するようにした。効果絶大。 + +=== 0.11.3 (2000-03-09) + * 状態遷移表生成のバグの修正がまだ甘かった。さらに別のバグもあるようだ。 + +=== 0.11.2 (2000-03-09) + * cparse が Symbol に対応できてなかった + +=== 0.11.1 (2000-03-08) + * ruby 1.5 の Symbol に対応 + * strscan を最新に + +=== 0.11.0 (2000-02-19) + * 例外のとき、元のファイルの行番号が出るようにした + +=== 0.10.9 (2000-01-19) + * セットアップ方法など細かな変更 + +=== 0.10.8 (2000-01-03) + * 忘れてしまったけどたしかインストーラ関係の修正 + * (1/17 repacked) ドキュメントの追加と修正 + +=== 0.10.7 (2000-01-03) + * setup.rb compile.rb amstd/inst などのバグ修正 + +=== 0.10.6 (1999-12-24) + * racc -e ruby でデフォルトパスを使用 + * 空のアクションの呼びだしは省略するようにした + +=== 0.10.5 (1999-12-21) + * 埋めこみアクションの実装がすさまじくバグってた + * setup.rb が inst.rb の変化に追従してなかった + * calc.y calc2.y を 0.10 用に修正 + +=== 0.10.4 (1999-12-19) + * エラー回復モードを実装 + * racc -E で単体で動作するパーサを生成 + * Racc は class から module になった + +=== 0.10.3 (1999-12-01) + * 埋めこみアクションをサポート + * .output の出力内容にバグがあったのを修正 + +=== 0.10.2 (1999-11-27) + * ドキュメントの訂正と更新 + * libracc.rb を分割 + +=== 0.10.1 (1999-11-19) + * C でランタイムを書きなおした + * next_token が false を返したらもう読みこまない + * アクションがトークンによらず決まるときは next_token を呼ばない + * $end 廃止 + * LALRactionTable + +=== 0.10.0 (1999-11-06) + * next_* を next_token に一本化、peep_token 廃止 + * @__debug__ -&lt; @yydebug など変数名を大幅変更 + * 文法ファイルの構造が class...rule...end に変わった + * コアのコードを一新、高速化 + * strscan を併合 + * ライブラリを racc/ ディレクトリに移動 + +=== 0.9.5 (1999-10-03) + * 0.9.4 の変更がすごくバグってた + * $end が通らなかったのを修正 + * __show_stack__ の引数が違ってた + +=== 0.9.4 (1999-09-??) + * Parser::Reporter をなくしてメソッドに戻した + * d.format.rb を再編成 + +=== 0.9.3 (1999-09-03) + * racc.rb -> racc + +=== 0.9.2 (1999-06-26) + * strscan使用 + +=== 0.9.1 (1999-06-08) + * アクション中の正規表現に対応 ( /= にも注意だ) + * アクション中の # コメントに対応 + +=== 0.9.0 (1999-06-03) + * アクションを { } 形式にした + * ユーザーコードを '----' を使う形式にした + +=== 0.8.11 (?) + * -g の出力をわかりやすくした + +=== 0.8.10 (?) + * アクションからreturnできるようにした + +=== 0.8.9 (1999-03-21) + * -g + @__debug__をつかったデバッグメッセージ操作 + * エラー発生時のバグを修正 + * TOKEN_TO_S_TABLEを付加するようにした + +=== 0.8.8 (1999-03-20) + * 100倍程度の高速化 + * defaultトークンを加えた + * デバッグ用ソースを出力するオプション-gをくわえた + * user_initializeを廃止し、普通にinitializeを使えるようにした + * parse_initialize/finalize,parseメソッドを廃止 + * next_token,next_value,peep_tokenのデフォルトを廃止 + * %precと同等の機能を加えた + +=== 0.8.7 (1999-03-01) + * 内部構造が大幅に変化 + * マニュアルがHTMLになった + +=== 0.8.0 (1999-01-16) + * 文法がブロック型に変化 + +=== 0.5.0 (1999-01-07) + * 演算子優先順位が実装されたようだ + * スタート規則が実装されたようだ + * トークン値の置換が実装されたようだ(後に致命的なバグ発見) + +=== 0.1.0 (1999-01-01) + * とにかく動くようになった diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/command.ja.html b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/command.ja.html new file mode 100644 index 000000000000..f72230764c3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/command.ja.html @@ -0,0 +1,94 @@ +<h1>Raccコマンドリファレンス</h1> +<p> +racc [-o<var>filename</var>] [--output-file=<var>filename</var>] + [-e<var>rubypath</var>] [--executable=<var>rubypath</var>] + [-v] [--verbose] + [-O<var>filename</var>] [--log-file=<var>filename</var>] + [-g] [--debug] + [-E] [--embedded] + [-l] [--no-line-convert] + [-c] [--line-convert-all] + [-a] [--no-omit-actions] + [-C] [--check-only] + [-S] [--output-status] + [--version] [--copyright] [--help] <var>grammarfile</var> +</p> + +<dl> +<dt><var>filename</var> +<dd> +Raccの文法ファイルを指定します。拡張子には特に制限はありません。 +</dd> +<dt>-o<var>outfile</var>, --output-file=<var>outfile</var> +<dd> +作成するクラスをかきこむファイル名を指定します。デフォルトは<filename>.tab.rbです。 +</dd> +<dt>-O<var>filename</var>, --log-file=<var>filename</var> +<dd> +-v オプションをつけた時に生成するログファイルの名前を +<var>filename</var> に変更します。 +デフォルトは <var>filename</var>.output です。 +</dd> +<dt>-e<var>rubypath</var>, --executable=<var>rubypath</var> +<dd> +実行可能ファイルを生成します。<var>rubypath</var>は Ruby 本体のパスです。 +<var>rubypath</var>を単に 'ruby' にした時には Racc が動作している +Ruby のパスを使用します。 +</dd> +<dt>-v, --verbose +<dd> +ファイル "filename".output に詳細な解析情報を出力します。 +</dd> +<dt>-g, --debug +<dd> +出力するコードにデバッグ用コードを加えます。-g をつけて生成したパーサで +@yydebug を true にセットすると、デバッグ用のコードが出力されます。<br> +-g をつけるだけでは何もおこりませんので注意してください。 +</dd> +<dt>-E, --embedded +<dd> +ランタイムルーチンをすべて含んだコードを生成します。 +つまり、このオプションをつけて生成したコードは Ruby さえあれば動きます。 +</dd> +<dt>-C, --check-only +<dd> +(文法ファイルの) 文法のチェックだけをして終了します。 +</dd> +<dt>-S, --output-status +<dd> +進行状況を逐一報告します。 +</dd> +<dt>-l, --no-line-convert +<dd> +<p> +Ruby では例外が発生した時のファイル名や行番号を表示してくれますが、 +Racc の生成したパーサは、デフォルトではこの場合のファイル名・行番号を +文法ファイルでのものに置きかえます。このフラグはその機能をオフにします。 +</p> +<p> +ruby 1.4.3 以前のバージョンではバグのために定数の参照に失敗する +場合があるので、定数参照に関してなにかおかしいことがおこったらこのフラグを +試してみてください。 +</p> +</dd> +<dt>-c, --line-convert-all +<dd> +アクションと inner に加え header footer の行番号も変換します。 +header と footer がつながっているような場合には使わないでください。 +<dt>-a, --no-omit-actions +<dd> +全てのアクションに対応するメソッド定義と呼び出しを行います。 +例えアクションが省略されていても空のメソッドを生成します。 +</dd> +<dt>--version +<dd> +Racc のバージョンを出力して終了します。 +</dd> +<dt>--copyright +<dd> +著作権表示を出力して終了します。 +<dt>--help +<dd> +オプションの簡単な説明を出力して終了します。 +</dd> +</dl> diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/debug.ja.rdoc b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/debug.ja.rdoc new file mode 100644 index 000000000000..90f70f6834cc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/debug.ja.rdoc @@ -0,0 +1,36 @@ += パーサのデバッグ + +ここでは、Racc を使っていくうえで遭遇しそうな問題について書きます。 + +== 文法ファイルがパースエラーになる + +エラーメッセージに出ている行番号のあたりを見て間違いを +探してください。ブロックを閉じる行でエラーになる場合は、 +どこかで開き括弧などを増やしてしまっている可能性が高いです。 + +== なんたら conflict って言われた + +一番ありがちで一番面倒な問題は衝突 (conflict) でしょう。 +文法中に衝突があると、racc はコンパイル後に +「5 shift/reduce conflict」のようなメッセージを表示します。 +-v をつけると出力される .output ファイルからはさらに詳しい情報が得られます。 +それをどう使うか、とかそういうことに関しては、それなりの本を読んでください。 +とてもここに書けるような単純な話ではありません。 +当然ながら『Ruby を 256 倍使うための本 無道編』(青木峰郎著)がお勧めです。 + +== パーサは問題なく生成できたけど予想どおりに動かない + +racc に -g オプションをつけてパーサを出力すると、デバッグ用のコードが +付加されます。ここで、パーサクラスのインスタンス変数 @yydebug を true に +しておいてから do_parse/yyparse を呼ぶと、デバッグ用メッセージが出力 +されます。パーサが動作する様子が直接見えますので、完全に現在の状態を +把握できます。これを見てどこがおかしいのかわかったらあとは直すだけ。 + +== next_token に関して + +いまだ自分でも忘れることが多いのが +「送るトークンが尽きたら [false,なにか] を送る」ということです。 +ちなみに Racc 0.10.2 以降では一度 [false,なにか] を受け取ったら +それ以上 next_token は呼ばないことが保証されています。 + +追記: 最近は [false,なにか] ではなく nil でもよいことになった。 diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/grammar.ja.rdoc b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/grammar.ja.rdoc new file mode 100644 index 000000000000..c366130e395b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/grammar.ja.rdoc @@ -0,0 +1,348 @@ += 規則ファイル文法リファレンス + +== 文法に関する前バージョンとの非互換 + + * (1.2.5) ユーザーコードを連結する時、外部ファイルよりも + 埋めこんであるコードを先に連結します。 + * (1.1.6) 新しいディレクティブ options が追加されました。 + * (1.1.5) 予約語 token の意味が変更になりました。 + * (0.14) ルールの最後のセミコロンが省略可能になりました。 + また、token prechigh などが予約語でなくなりました。 + * (10.2) prepare が header に driver が footer になりました。 + 今はそのままでも使えますが、2.0 からは対応しません。 + * (0.10) class に対応する end がなくなりました。 + * (0.9) ダサダサのピリオド方式をやめて { と } で囲むようにしました。 + +== 全体の構造 + +トップレベルは、規則部とユーザーコード部に分けられます。 +ユーザーコード部はクラス定義の後に来なければいけません。 + +=== コメント + +文法ファイルには、一部例外を除いて、ほとんどどこにでもコメントを +書くことができます。コメントは、Rubyの #.....(行末) スタイルと、 +Cの /*......*/ スタイルを使うことができます。 + +=== 規則部 + +規則部は以下のような形をしています。 +-- +class クラス名 [< スーパークラス] + [演算子順位] + [トークン宣言] + [オプション] + [expect] + [トークンシンボル値おきかえ] + [スタート規則] +rule + 文法記述 +-- +"クラス名"はここで定義するパーサクラスの名前です。 +これはそのままRubyのクラス名になります。 + +また M::C のように「::」を使った名前を使うと、クラス定義を +モジュール M の中にネストさせます。つまり class M::C ならば +-- +module M + class C < Racc::Parser + いろいろ + end +end +-- +のように出力します。 + +さらに、Ruby と同じ構文でスーパークラスを指定できます。 +ただしこの指定をするとパーサの動作に重大な影響を与えるので、 +特に必要がない限り指定してはいけません。これは将来の拡張の +ために用意したもので、現在指定する必然性はあまりありません。 + +=== 文法の記述 + +racc で生成するパーサが理解できる文法を記述します。 +文法は、予約語 rule と end の間に、以下のような書式で書きます。 +-- +トークン: トークンの並び アクション + +トークン: トークンの並び アクション + | トークンの並び アクション + | トークンの並び アクション + (必要なだけ同じようにつづける) +-- +アクションは { } で囲みます。アクションでは Ruby の文はほとんど +使えますが、一部だけは非対応です。対応していないものは以下のとおり。 + + * ヒアドキュメント + * =begin ... =end 型コメント + * スペースで始まる正規表現 + * ごくまれに % の演算。普通に演算子のまわりにスペースを入れていれば問題なし + +このあたりに関しては完全な対応はまず無理です。あきらめてください。 + +左辺の値($$)は、オプションによって返し方がかわります。まずデフォルトでは +ローカル変数 result (そのデフォルト値は val[0])が 左辺値を表し、アクション +ブロックを抜けた時の result の値が左辺値になります。または明示的に return +で返した場合もこの値になります。一方、options で no_result_var を指定した +場合、左辺値はアクションブロックの最後の文の値になります (Ruby のメソッドと +同じ)。 + +どちらの場合でもアクションは省略でき、省略した場合の左辺値は常に val[0] です。 + +以下に文法記述の全体の例をしめします。 +-- +rule + goal: def ruls source + { + result = val + } + + def : /* none */ + { + result = [] + } + | def startdesig + { + result[0] = val[1] + } + | def + precrule # これは上の行の続き + { + result[1] = val[1] + } +(略) +-- +アクション内では特別な意味をもった変数がいくつか使えます。 +そのような変数を以下に示します。括弧の中は yacc での表記です。 + + * result ($$) + +左辺の値。初期値は val[0] です。 + + * val ($1,$2,$3…) + +右辺の記号の値の配列。Ruby の配列なので当然インデックスはゼロから始まります。 +この配列は毎回作られるので自由に変更したり捨てたりして構いません。 + + * _values (...,$-2,$-1,$0) + +値スタック。Racc コアが使っているオブジェクトがそのまま渡されます。 +この変数の意味がわかる人以外は<em>絶対に</em>変更してはいけません。 + +またアクションの特別な形式に、埋めこみアクションというものがあります。 +これはトークン列の途中の好きなところに記述することができます。 +以下に埋めこみアクションの例を示します。 +-- +target: A B { puts 'test test' } C D { normal action } +-- +このように記述すると A B を検出した時点で puts が実行されます。 +また、埋めこみアクションはそれ自体が値を持ちます。つまり、以下の例において +-- +target: A { result = 1 } B { p val[1] } +-- +最後にある p val[1] は埋めこみアクションの値 1 を表示します。 +B の値ではありません。 + +意味的には、埋めこみアクションは空の規則を持つ非終端記号を追加することと +全く同じ働きをします。つまり、上の例は次のコードと完全に同じ意味です。 +-- +target : A nonterm B { p val[1] } +nonterm : /* 空の規則 */ { result = 1 } +-- + +=== 演算子優先順位 + +あるトークン上でシフト・還元衝突がおこったとき、そのトークンに +演算子優先順位が設定してあると衝突を解消できる場合があります。 +そのようなものとして特に有名なのは数式の演算子と if...else 構文です。 + +優先順位で解決できる文法は、うまく文法をくみかえてやれば +優先順位なしでも同じ効果を得ることができます。しかしたいていの +場合は優先順位を設定して解決するほうが文法を簡単にできます。 + +シフト・還元衝突がおこったとき、Racc はまずその規則に順位が設定 +されているか調べます。規則の順位は、その規則で一番うしろにある +終端トークンの優先順位です。たとえば +-- +target: TERM_A nonterm_a TERM_B nonterm_b +-- +のような規則の順位はTERM_Bの優先順位になります。もしTERM_Bに +優先順位が設定されていなかったら、優先順位で衝突を解決することは +できないと判断し、「Shift/Reduce conflict」を報告します。 + +演算子の優先順位はつぎのように書いて定義します。 +-- +prechigh + nonassoc PLUSPLUS + left MULTI DEVIDE + left PLUS MINUS + right '=' +preclow +-- +prechigh に近い行にあるほど優先順位の高いトークンです。上下をまるごと +さかさまにして preclow...prechigh の順番に書くこともできます。left +などは必ず行の最初になければいけません。 + +left right nonassoc はそれぞれ「結合性」を表します。結合性によって、 +同じ順位の演算子の規則が衝突した場合にシフト還元のどちらをとるかが +決まります。たとえば +-- +a - b - c +-- +が +-- +(a - b) - c +-- +になるのが左結合 (left) です。四則演算は普通これです。 +一方 +-- +a - (b - c) +-- +になるのが右結合 (right) です。代入のクオートは普通 right です。 +またこのように演算子が重なるのはエラーである場合、非結合 (nonassoc) です。 +C 言語の ++ や単項のマイナスなどがこれにあたります。 + +ところで、説明したとおり通常は還元する規則の最後のトークンが順位を +決めるのですが、ある規則に限ってそのトークンとは違う順位にしたいことも +あります。例えば符号反転のマイナスは引き算のマイナスより順位を高く +しないといけません。このような場合 yacc では %prec を使います。 +racc ではイコール記号を使って同じことをできます。 +-- +prechigh + nonassoc UMINUS + left '*' '/' + left '+' '-' +preclow +(略) +exp: exp '*' exp + | exp '-' exp + | '-' exp = UMINUS # ここだけ順位を上げる +-- +このように記述すると、'-' exp の規則の順位が UMINUS の順位になります。 +こうすることで符号反転の '-' は '*' よりも順位が高くなるので、 +意図どおりになります。 + +=== トークン宣言 + +トークン(終端記号)のつづりを間違えるというのはよくあることですが、 +発見するのはなかなか難しいものです。1.1.5 からはトークンを明示的に +宣言することで、宣言にないトークン / 宣言にだけあるトークンに対して +警告が出るようになりました。yacc の %token と似ていますが最大の違いは +racc では必須ではなく、しかもエラーにならず警告だけ、という点です。 + +トークン宣言は以下のように書きます。 +-- +token A B C D + E F G H +-- +トークンのリストを複数行にわたって書けることに注目してください。 +racc では一般に「予約語」は行の先頭に来た時だけ予約語とみなされるので +prechigh などもシンボルとして使えます。ただし深淵な理由から end だけは +どうやっても予約語になってしまいます。 + +=== オプション + +racc のコマンドラインオプションの一部をファイル中にデフォルト値 +として記述することができます。 +-- +options オプション オプション … +-- +現在ここで使えるのは + + * omit_action_call + +空のアクション呼び出しを省略する + + * result_var + +変数 result を使う + +です。 +それぞれ no_ を頭につけることで意味を反転できます。 + +=== expect + +実用になるパーサはたいてい無害な shift/reduce conflict を含みます。 +しかし文法ファイルを書いた本人はそれを知っているからいいですが、 +ユーザが文法ファイルを処理した時に「conflict」と表示されたら +不安に思うでしょう。そのような場合、以下のように書いておくと +shift/reduce conflict のメッセージを抑制できます。 +-- +expect 3 +-- +この場合 shift/reduce conflict はぴったり三つでなければいけません。 +三つでない場合はやはり表示が出ます (ゼロでも出ます)。 +また reduce/reduce conflict の表示は抑制できません。 + +=== トークンシンボル値の変更 + +トークンシンボルを表す値は、デフォルトでは + + * 文法中、引用符でかこまれていないもの (RULEとかXENDとか) + →その名前の文字列を intern して得られるシンボル (1.4 では Fixnum) + * 引用符でかこまれているもの(':'とか'.'とか) + →その文字列そのまま + +となっていますが、たとえば他の形式のスキャナがすでに存在する場合などは、 +これにあわせなければならず、このままでは不便です。このような場合には、 +convert 節を加えることで、トークンシンボルを表す値を変えることができます。 +以下がその例です。 +-- +convert + PLUS 'PlusClass' #→ PlusClass + MIN 'MinusClass' #→ MinusClass +end +-- +デフォルトではトークンシンボル PLUS に対してはトークンシンボル値は +:PLUS ですが、上のような記述がある場合は PlusClass になります。 +変換後の値は false・nil 以外ならなんでも使えます。 + +変換後の値として文字列を使うときは、次のように引用符を重ねる必要があります。 +-- +convert + PLUS '"plus"' #→ "plus" +end +-- +また、「'」を使っても生成された Ruby のコード上では「"」になるので +注意してください。バックスラッシュによるクオートは有効ですが、バック +スラッシュは消えずにそのまま残ります。 +-- +PLUS '"plus\n"' #→ "plus\n" +MIN "\"minus#{val}\"" #→ \"minus#{val}\" +-- + +=== スタート規則 + +パーサをつくるためには、どの規則が「最初の」規則か、ということを Racc におしえて +やらなければいけません。それを明示的に書くのがスタート規則です。スタート規則は +次のように書きます。 +-- +start real_target +-- +start は行の最初にこなければいけません。このように書くと、ファイルで +一番最初に出てくる real_target の規則をスタート規則として使います。 +省略した場合は、ファイルの最初の規則がスタート規則になります。普通は +最初の規則を一番上にかくほうが書きやすく、わかりやすくなりますから、 +この記法はあまりつかう必要はないでしょう。 + +=== ユーザーコード部 + +ユーザーコードは、パーサクラスが書きこまれるファイルに、 +アクションの他にもコードを含めたい時に使います。このようなものは +書きこまれる場所に応じて三つ存在し、パーサクラスの定義の前が +header、クラスの定義中(の冒頭)が inner、定義の後が footer です。 +ユーザコードとして書いたものは全く手を加えずにそのまま連結されます。 + +ユーザーコード部の書式は以下の通りです。 +-- +---- 識別子 + ruby の文 + ruby の文 + ruby の文 + +---- 識別子 + ruby の文 + : +-- +行の先頭から四つ以上連続した「-」(マイナス)があるとユーザーコードと +みなされます。識別子は一つの単語で、そのあとには「=」以外なら何を +書いてもかまいません。 diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/index.ja.html b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/index.ja.html new file mode 100644 index 000000000000..29fd70f3bdd7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/index.ja.html @@ -0,0 +1,10 @@ +<h1>Racc ユーザマニュアル</h1> +<p>バージョン 1.4 対応</p> +<ul> +<li><a href="usage.html">Racc の使い方</a> +<li><a href="command.html">racc コマンドリファレンス</a> +<li><a href="grammar.html">規則ファイル文法リファレンス</a> +<li><a href="parser.html">Parser クラスリファレンス</a> +<li><a href="debug.html">パーサのデバッグ</a> +<li><a href="NEWS.html">リリースノート</a> +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/parser.ja.rdoc b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/parser.ja.rdoc new file mode 100644 index 000000000000..29a1bde5b31e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/parser.ja.rdoc @@ -0,0 +1,125 @@ += class Racc::Parser +Racc の生成するパーサはすべて Racc::Parser クラスを継承します。 +Racc::Parser クラスにはパース中に使用するメソッドがいくつかあり、 +そのようなメソッドをオーバーロードすると、パーサを初期化したり +することができます。 + +== Super Class + +Object + +== Constants + +プリフィクス "Racc_" がついた定数はパーサの予約定数です。 +そのような定数は使わないでください。動作不可能になります。 +== Instance Methods +ここに載っているもののほか、プリフィクス "racc_" および "_racc_" が +ついたメソッドはパーサの予約名です。そのようなメソッドは使わないで +ください。 + +: do_parse -> Object + パースを開始します。 + また、トークンが必要になった時は #next_token を呼び出します。 + + -- + # Example + ---- inner + def parse + @q = [[1,1], + [2,2], + [3,3], + [false, '$']] + do_parse + end + + def next_token + @q.shift + end + -- + +: next_token -> [Symbol, Object] + [abstract method] + + パーサが次のトークンを読みこむ時に使います。 + [記号, その値] の形式の配列を返してください。 + 記号はデフォルトでは + + * 文法中、引用符でかこまれていないもの + → その名前の文字列のシンボル (例えば :ATOM ) + * 引用符でかこまれているもの<br> + → その文字列そのまま (例えば '=' ) + + で表します。これを変更する方法については、 + 文法リファレンスを参照してください。 + + また、もう送るシンボルがなくなったときには + [false, なにか] または nil を返してください。 + + このメソッドは抽象メソッドなので、#do_parse を使う場合は + 必ずパーサクラス中で再定義する必要があります。 + 定義しないままパースを始めると例外 NotImplementedError が + 発生します。 + +: yyparse( receiver, method_id ) + パースを開始します。このメソッドでは始めてトークンが + 必要になった時点で receiver に対して method_id メソッドを + 呼び出してトークンを得ます。 + + receiver の method_id メソッドはトークンを yield しなければ + なりません。形式は #next_token と同じで [記号, 値] です。 + つまり、receiver の method_id メソッドの概形は以下のように + なるはずです。 + -- + def method_id + until end_of_file + : + yield 記号, 値 + : + end + end + -- + 少し注意が必要なのは、method_id が呼び出されるのは始めて + トークンが必要になった時点であるということです。method_id + メソッドが呼び出されたときは既にパースが進行中なので、 + アクション中で使う変数を method_id の冒頭で初期化すると + まず失敗します。 + + トークンの終端を示す [false, なにか] を渡したらそれ以上は + yield しないでください。その場合には例外が発生します。 + + 最後に、method_id メソッドからは必ず yield してください。 + しない場合は何が起きるかわかりません。 + +: on_error( error_token_id, error_value, value_stack ) + パーサコアが文法エラーを検出すると呼び出します (yacc の yyerror)。 + エラーメッセージを出すなり、例外を発生するなりしてください。 + このメソッドから正常に戻った場合、パーサはエラー回復モード + に移行します。 + + error_token はパースエラーを起こした記号の内部表現 (整数) です。 + #token_to_str で文法ファイル上の文字列表現に直せます。 + + error_value はその値です。 + + value_stack はエラーの時点での値スタックです。 + value_stack を変更してはいけません。 + + on_error のデフォルトの実装は例外 ParseError を発生します。 + +: token_to_str( t ) -> String + Racc トークンの内部表現 (整数) + を文法ファイル上の記号表現の文字列に変換します。 + + t が整数でない場合は TypeError を発生します。 + t が範囲外の整数だった場合は nil を返します。 + +: yyerror + エラー回復モードに入ります。このとき #on_error は呼ばれません。 + アクション以外からは呼び出さないでください。 + +: yyerrok + エラー回復モードから復帰します。 + アクション以外からは呼び出さないでください。 + +: yyaccept + すぐに値スタックの先頭の値を返して #do_parse、#yyparse を抜けます。 diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/usage.ja.html b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/usage.ja.html new file mode 100644 index 000000000000..8884b8f64835 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/rdoc/ja/usage.ja.html @@ -0,0 +1,414 @@ +<h1>Racc の使い方</h1> +<p> +Racc は文法規則から Ruby で書かれたパーサを生成するパーサジェネレータです。 +パーサ生成アルゴリズムには yacc などと同じ LALR(1) を使用しています。 +</p> +<p> +yacc を知っている人は記述法の違いだけわかれば使えると思います。 +yacc を知らない人は +拙著『Ruby を 256 倍使うための本 無道編』(青木峰郎著、ASCII) +などを一読していただくのがよいかと思います。 +他の UNIX コマンドなどとは異なり、 +いきなり使うだけで Racc を理解するのはかなり困難です。 +</p> + +<h2>Racc とはなにか</h2> +<p> +Racc は文法を処理するツールです。 +文字列はただの文字の列で、コンピュータにとっては意味を持ちません。 +しかし人間はその文字の列の中になにか意味を見出すことができます。 +コンピュータにもそのようなことを、部分的にでも、させられたら便利でしょう。 +Racc はその手伝いをしてくれます。完全な自動化ではありませんが、 +人間が全部やるよりも遥かに簡単になります。 +</p> +<p> +Racc が自動化してくれる部分とは、文字列の含む「構造」の処理です。 +たとえば Ruby の if 文を考えてみると、次のように定式化できます。 +</p> +<pre> +if 条件式 [then] + 文 + : +[elsif 条件式 [then] + 文 + :] +[else + 文 + :] +end +</pre> +<p> +if 文では if という単語が最初になくてはならず、 +elsif 節は else 節より前になくてはいけません。 +このような配置の関係 (構造) が、Racc が処理する対象です。 +</p> +<p> +一方、Racc で処理できないのはどういうことでしょうか。それは、たとえば +if の条件式にあたる部分が「なんであるか」ということです。つまり、条件 +式が if の条件だということです。これは、こっちで条件として扱うコードを +書いてやらないといけません。 +</p> +<p> +と言っても、わかりにくいでしょう。こういう抽象的なものは実際にいじって +みるのが一番です。 +</p> + +<h2>実際の話</h2> +<p> +実際に Racc をどのように使うかという話をします。Racc には独自のソース +コードみたいなものがあって、この中に処理したい「構造」を記述しておきま +す。このソースファイルを「文法ファイル」と呼ぶことにしましょう。この文 +法ファイルの名前が parse.y と仮定すると、コマンドラインから以下のよう +に打ちこめば、その構造を処理するためのクラスを含んだファイルが得られま +す。 +</p> +<pre> +$ racc parse.y +</pre> +<p> +生成されるファイルはデフォルトでは "ファイル名.tab.rb" です。他の名前 +にしたいなら、-o オプションで変更できます。 +</p> +<pre> +$ racc parse.y -o myparser.rb +</pre> +<p> +このようにして作ったクラス、またはそのような処理を担当するパート、 +のことはパーサ (parser) と呼ぶことになっています。解析するヤツ、 +というくらいに適当にとらえてください。 +</p> + +<h2>文法ファイルを書く</h2> +<p> +Racc は文法ファイルから Ruby のクラスを生成するツールだと言いました。 +そのクラスは全て Racc::Parser の下位クラスで、名前は文法ファイル中で +指定します。以下、ここに書くべきことが「なんなのか」を説明します。 +ここでは内容に重点を置くので、文法ファイル自体の文法の詳細は +<a href="grammar.html">文法リファレンス</a>を見てください。 +</p> + +<h3>文法</h3> +<p> +まずは、全体の概形です。 +</p> +<pre> +class MyParser +rule + + if_stmt: IF expr then stmt_list elsif else END + + then : THEN + | + + elsif : + | ELSIF stmt_list + + else : + | ELSE stmt_list + + expr : NUMBER + | IDENT + | STRING + + stmt_list : ふにゃふにゃ + +end +</pre> +<p> +Ruby スクリプトのように class でパーサクラス名を指定し、rule ... end +の間にパーサに解析させたい文法を記述します。 +</p> +<p> +文法は、記号の並びでもって表します。rule ... end の間にあるコロンとバー +以外のもの、if_stmt IF expr then などが全て「記号」です。そしてコロン +が日本語で言う「〜は××だ」の「は」みたいなもんで、その左の記号が右の +記号の列と同じものを指す、というふうに定義します。また、バーは「または」 +を意味します。それと、単純にコロンの左の記号のことを左辺、右を右辺とも +言います。以下はこちらのほうを使って説明しましょう。 +</p> +<p> +少し注意が必要な点を述べます。まず、then の、バーのあとの定義 (規則) を +見てください。ここには何も書いていないので、これはその通り「無」であっ +てもいい、ということを表しています。つまり、then は記号 THEN 一個か、 +またはなにもなし(省略する)でよい、ということです。記号 then は実際の +Ruby のソースコードにある then とは切り離して考えましょう +(それは実は大文字の記号 THEN が表しています)。 +</p> +<p> +さて、そろそろ「記号」というものがなんなのか書きましょう。 +ただし順番に話をしないといけないので、まずは聞いていてください。 +この文章の最初に、パーサとは文字の列から構造を見出す部分だと言いました。 +しかし文字の列からいきなり構造を探すのは面倒なので、実際にはまず +文字の列を単語の列に分割します。その時点でスペースやコメントは捨てて +しまい、以降は純粋にプログラムの一部をなす部分だけを相手にします。 +たとえば文字列の入力が次のようだったとすると、 +</p> +<pre> +if flag then # item found. + puts 'ok' +end +</pre> +<p> +単語の列は次のようになります。 +</p> +<pre> +if flag then puts 'ok' end +</pre> +<p> +ここで、工夫が必要です。どうやら flag はローカル変数名だと思われますが、 +変数名というのは他にもいろいろあります。しかし名前が i だろうが a だろ +うが vvvvvvvvvvvv だろうが、「構造」は同じです。つまり同じ扱いをされる +べきです。変数 a を書ける場所なら b も書けなくてはいけません。だったら +一時的に同じ名前で読んでもいいじゃん。ということで、この単語の列を以下 +のように読みかえましょう。 +</p> +<pre> +IF IDENT THEN IDENT STRING END +</pre> +<p> +これが「記号」の列です。パーサではこの記号列のほうを扱い、構造を見付け +ていきます。 +</p> +<p> +さらに記号について見ていきましょう。 +記号は二種類に分けられます。「左辺にある記号」と「ない記号」です。 +左辺にある記号は「非終端」記号と言います。ないほうは「終端」記号と +言います。最初の例では終端記号はすべて大文字、非終端記号は小文字で +書いてあるので、もう一度戻って例の文法を見てください。 +</p> +<p> +なぜこの区分が重要かと言うと、入力の記号列はすべて終端記号だからです。 +一方、非終端記号はパーサの中でだけ、終端記号の列から「作りだす」ことに +よって始めて存在します。例えば次の規則をもう一度見てください。 +</p> +<pre> + expr : NUMBER + | IDENT + | STRING +</pre> +<p> +expr は NUMBER か IDENT か STRING だと言っています。逆に言うと、 +IDENT は expr に「なることができます」。文法上 expr が存在できる +場所に IDENT が来ると、それは expr になります。例えば if の条件式の +部分は expr ですから、ここに IDENT があると expr になります。その +ように文法的に「大きい」記号を作っていって、最終的に一個になると、 +その入力は文法を満たしていることになります。実際にさっきの入力で +試してみましょう。入力はこうでした。 +</p> +<pre> +IF IDENT THEN IDENT STRING END +</pre> +<p> +まず、IDENT が expr になります。 +</p> +<pre> +IF expr THEN IDENT STRING END +</pre> +<p> +次に THEN が then になります。 +</p> +<pre> +IF expr then IDENT STRING END +</pre> +<p> +IDENT STRING がメソッドコールになります。この定義はさきほどの例には +ないですが、実は省略されているんだと考えてください。そしていろいろな +過程を経て、最終的には stmt_list (文のリスト)になります。 +</p> +<pre> +IF expr then stmt_list END +</pre> +<p> +elsif と else は省略できる、つまり無から生成できます。 +</p> +<pre> +IF expr then stmt_list elsif else END +</pre> +<p> +最後に if_stmt を作ります。 +</p> +<pre> +if_stmt +</pre> +<p> +ということでひとつになりました。 +つまりこの入力は文法的に正しいということがわかりました。 +</p> + +<h3>アクション</h3> +<p> +ここまでで入力の文法が正しいかどうかを確認する方法はわかりましたが、 +これだけではなんにもなりません。最初に説明したように、ここまででは +構造が見えただけで、プログラムは「意味」を理解できません。そしてその +部分は Racc では自動処理できないので、人間が書く、とも言いました。 +それを書くのが以下に説明する「アクション」という部分です。 +</p> +<p> +前項で、記号の列がだんだんと大きな単位にまとめられていく過程を見ました。 +そのまとめる時に、同時になにかをやらせることができます。それが +アクションです。アクションは、文法ファイルで以下のように書きます。 +</p> +<pre> +class MyParser +rule + + if_stmt: IF expr then stmt_list elsif else END + { puts 'if_stmt found' } + + then : THEN + { puts 'then found' } + | + { puts 'then is omitted' } + + elsif : + { puts 'elsif is omitted' } + | ELSIF stmt_list + { puts 'elsif found' } + + else : + { puts 'else omitted' } + | ELSE stmt_list + { puts 'else found' } + + expr : NUMBER + { puts 'expr found (NUMBER)' } + | IDENT + { puts 'expr found (IDENT)' } + | STRING + { puts 'expr found (STRING)' } + + stmt_list : ふにゃふにゃ + +end +</pre> +<p> +見てのとおり、規則のあとに { と } で囲んで書きます。 +アクションにはだいたい好きなように Ruby スクリプトが書けます。 +</p> +<p> +(この節、未完) +</p> +<hr> + +<p> +yacc での <code>$$</code> は Racc ではローカル変数 <code>result</code> +で、<code>$1,$2...</code> は配列 <var>val</var>です。 +<code>result</code> は <code>val[0]</code> ($1) の値に初期化され、 +アクションを抜けたときの <code>result</code> の値が左辺値になります。 +Racc ではアクション中の <code>return</code> はアクションから抜けるだけで、 +パース自体は終わりません。アクション中からパースを終了するには、 +メソッド <code>yyaccept</code> を使ってください。 +</p> +<p> +演算子の優先順位、スタートルールなどの yacc の一般的な機能も用意されて +います。ただしこちらも少し文法が違います。 +</p> +<p> +yacc では生成されたコードに直接転写されるコードがありました。 +Racc でも同じように、ユーザ指定のコードが書けます。 +Racc ではクラスを生成するので、クラス定義の前/中/後の三個所があります。 +Racc ではそれを上から順番に header inner footer と呼んでいます。 +</p> + +<h3>ユーザが用意すべきコード</h3> +<p> +パースのエントリポイントとなるメソッドは二つあります。ひとつは +<code>do_parse</code>で、こちらはトークンを +<code>Parser#next_token</code> から得ます。もうひとつは +<code>yyparse</code> で、こちらはスキャナから <code>yield</code> され +ることによってトークンを得ます。ユーザ側ではこのどちらか(両方でもいい +けど)を起動する簡単なメソッドを inner に書いてください。これらメソッド +の引数など、詳しいことはリファレンスを見てください。 +</p> +<ul> +<li><a href="parser.html#Racc%3a%3aParser-do_parse">do_parse</a> +<li><a href="parser.html#Racc%3a%3aParser-yyparse">yyparse</a> +</ul> +<p> +どちらのメソッドにも共通なのはトークンの形式です。必ずトークンシンボル +とその値の二要素を持つ配列を返すようにします。またスキャンが終了して、 +もう送るものがない場合は <code>[false,<var>なにか</var>]</code> を返し +てください。これは一回返せば十分です (逆に、<code>yyparse</code> を使 +う場合は二回以上 <code>yield</code> してはいけない)。 +</p> +<p> +パーサは別に文字列処理にだけ使われるものではありませんが、実際問題とし +て、パーサを作る場面ではたいてい文字列のスキャナとセットで使うことが多 +いでしょう。Ruby ならスキャナくらい楽勝で作れますが、高速なスキャナと +なると実は難しかったりします。そこで高速なスキャナを作成するためのライ +ブラリも作っています。詳しくは +<a href="#WritingScanner">「スキャナを作る」の項</a>を見てください。 +</p> +<p> +Racc には error トークンを使ったエラー回復機能もあります。yacc の +<code>yyerror()</code> は Racc では +<a href="parser.html#Racc%3a%3aParser-on_error"><code>Racc::Parser#on_error</code></a> +で、エラーが起きたトークンとその値、値スタック、の三つの引数をとります。 +<code>on_error</code> のデフォルトの実装は例外 +<code>Racc::ParseError</code> を発生します。 +</p> +<p> +ユーザがアクション中でパースエラーを発見した場合は、メソッド +<a href="parser.html#Racc%3a%3aParser-yyerror"><code>yyerror</code></a> +を呼べばパーサがエラー回復モードに入ります。 +ただしこのとき <code>on_error</code>は呼ばれません。 +</p> + +<h3>パーサを生成する</h3> +<p> +これだけあればだいたい書けると思います。あとは、最初に示した方法で文法 +ファイルを処理し、Ruby スクリプトを得ます。 +</p> +<p> +うまくいけばいいのですが、大きいものだと最初からはうまくいかないでしょ +う。racc に -g オプションをつけてコンパイルし、@yydebug を true にする +とデバッグ用の出力が得られます。デバッグ出力はパーサの @racc_debug_out +に出力されます(デフォルトは stderr)。また、racc に -v オプションをつけ +ると、状態遷移表を読みやすい形で出力したファイル(*.output)が得られます。 +どちらもデバッグの参考になるでしょう。 +</p> + + +<h2>作ったパーサを配布する</h2> +<p> +Racc の生成したパーサは動作時にランタイムルーチンが必要です。 +具体的には parser.rb と cparse.so です。 +ただし cparse.so は単にパースを高速化するためのライブラリなので +必須ではありません。なくても動きます。 +</p> +<p> +まず Ruby 1.8.0 以降にはこのランタイムが標準添付されているので、 +Ruby 1.8 がある環境ならばランタイムについて考慮する必要はありません。 +Racc 1.4.x のランタイムと Ruby 1.8 に添付されているランタイムは +完全互換です。 +</p> +<p> +問題は Ruby 1.8 を仮定できない場合です。 +Racc をユーザみんなにインストールしてもらうのも一つの手ですが、 +これでは不親切です。そこでRacc では回避策を用意しました。 +</p> +<p> +racc に -E オプションをつけてコンパイルすると、 +パーサと racc/parser.rb を合体したファイルを出力できます。 +これならばファイルは一つだけなので簡単に扱えます。 +racc/parser.rb は擬似的に require したような扱いになるので、 +この形式のパーサが複数あったとしてもクラスやメソッドが衝突することもありません。 +ただし -E を使った場合は cparse.so が使えませんので、 +必然的にパーサの速度は落ちます。 +</p> + + +<h2><a name="WritingScanner">おまけ: スキャナを書く</a></h2> +<p> +パーサを使うときは、たいてい文字列をトークンに切りわけてくれるスキャナ +が必要になります。しかし実は Ruby は文字列の最初からトークンに切りわけ +ていくという作業があまり得意ではありません。 +正確に言うと、簡単にできるのですが、それなりのオーバーヘッドがかかります。 +</p> +<p> +そのオーバーヘッドを回避しつつ、 +手軽にスキャナを作れるように strscan というパッケージを作りました。 +Ruby 1.8 以降には標準添付されていますし、 +<a href="http://i.loveruby.net/ja/">筆者のホームページ</a>には +単体パッケージがあります。 +</p> diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/array.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/array.y new file mode 100644 index 000000000000..c54d600c55fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/array.y @@ -0,0 +1,67 @@ +# +# +# convert Array-like string into Ruby's Array. + +class ArrayParser + +rule + +array : '[' contents ']' + { + result = val[1] + } + | '[' ']' + { + result = [] + } + +contents: ITEM + { + result = val + } + | contents ',' ITEM + { + result.push val[2] + } + +---- inner + + def parse(str) + str = str.strip + @q = [] + until str.empty? + case str + when /\A\s+/ + str = $' + when /\A\w+/ + @q.push [:ITEM, $&] + str = $' + else + c = str[0,1] + @q.push [c, c] + str = str[1..-1] + end + end + @q.push [false, '$'] # is optional from Racc 1.3.7 + do_parse + end + + def next_token + @q.shift + end + +---- footer + +if $0 == __FILE__ + src = <<EOS +[ + a, b, c, + d, + e ] +EOS + puts 'parsing:' + print src + puts + puts 'result:' + p ArrayParser.new.parse(src) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/array2.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/array2.y new file mode 100644 index 000000000000..290c4d4bd274 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/array2.y @@ -0,0 +1,59 @@ +# +# +# Converting Array-like string into Ruby's Array, version 2. +# This grammer uses no_result_var. + +class ArrayParser2 + options no_result_var +rule + array : '[' contents ']' { val[1] } + | '[' ']' { [] } + + contents: ITEM { val } + | contents ',' ITEM { val[0].push val[2]; val[0] } +end + +---- inner + + def parse(str) + @str = str + yyparse self, :scan + end + + def scan + str = @str.strip + until str.empty? + case str + when /\A\s+/ + str = $' + when /\A\w+/ + yield :ITEM, $& + str = $' + else + c = str[0,1] + yield c, c + str = str[1..-1] + end + end + yield false, '$' # is optional from Racc 1.3.7 + end + + def next_token + @q.shift + end + +---- footer + +if $0 == __FILE__ + src = <<EOS +[ + a, b, c, + d, + e ] +EOS + puts 'parsing:' + print src + puts + puts 'result:' + p ArrayParser2.new.parse(src) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/calc-ja.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/calc-ja.y new file mode 100644 index 000000000000..05f2137a0b1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/calc-ja.y @@ -0,0 +1,66 @@ +# +# +# A simple calculator, version 2. +# This file contains Japanese characters (encoding=EUC-JP). + +class Calculator2 + prechigh + nonassoc UMINUS + left '*' '/' + left '+' '-' + preclow + options no_result_var +rule + target : exp + | /* none */ { 0 } + + exp : exp '+' exp { val[0] + val[2] } + | exp '-' exp { val[0] - val[2] } + | exp '*' exp { val[0] * val[2] } + | exp '/' exp { val[0] / val[2] } + | '(' exp ')' { val[1] } + | '-' NUMBER =UMINUS { -(val[1]) } + | NUMBER +end + +---- header +# +---- inner + + def evaluate(str) + @tokens = [] + until str.empty? + case str + when /\A\s+/ + ; + when /\A\d+/ + @tokens.push [:NUMBER, $&.to_i] + when /\A.|\n/ + s = $& + @tokens.push [s, s] + end + str = $' + end + @tokens.push [false, '$'] + do_parse + end + + def next_token + @tokens.shift + end + +---- footer + +puts 'Ķ 2 浡' +puts 'Q ǽλޤ' +calc = Calculator2.new +while true + print '>>> '; $stdout.flush + str = $stdin.gets.strip + break if /q/i =~ str + begin + p calc.evaluate(str) + rescue ParseError + puts 'parse error' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/calc.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/calc.y new file mode 100644 index 000000000000..4757ed9bd224 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/calc.y @@ -0,0 +1,65 @@ +# +# +# Very simple calculater. + +class Calcp + prechigh + nonassoc UMINUS + left '*' '/' + left '+' '-' + preclow +rule + target: exp + | /* none */ { result = 0 } + + exp: exp '+' exp { result += val[2] } + | exp '-' exp { result -= val[2] } + | exp '*' exp { result *= val[2] } + | exp '/' exp { result /= val[2] } + | '(' exp ')' { result = val[1] } + | '-' NUMBER =UMINUS { result = -val[1] } + | NUMBER +end + +---- header +# +---- inner + + def parse(str) + @q = [] + until str.empty? + case str + when /\A\s+/ + when /\A\d+/ + @q.push [:NUMBER, $&.to_i] + when /\A.|\n/o + s = $& + @q.push [s, s] + end + str = $' + end + @q.push [false, '$end'] + do_parse + end + + def next_token + @q.shift + end + +---- footer + +parser = Calcp.new +puts +puts 'type "Q" to quit.' +puts +while true + puts + print '? ' + str = gets.chop! + break if /q/i =~ str + begin + puts "= #{parser.parse(str)}" + rescue ParseError + puts $! + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/conflict.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/conflict.y new file mode 100644 index 000000000000..c4b534df590b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/conflict.y @@ -0,0 +1,15 @@ +# +# +# Example of conflicted grammer. +# This grammer contains 1 Shift/Reduce conflict and 1 Reduce/Reduce conflict. + +class A +rule + target : outer + + outer : + | outer inner + + inner : + | inner ITEM +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/hash.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/hash.y new file mode 100644 index 000000000000..85348e4e9822 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/hash.y @@ -0,0 +1,60 @@ +# +# +# Converting Hash-like string into Ruby's Hash. + +class HashParser + options no_result_var +rule + hash : '{' contents '}' { val[1] } + | '{' '}' { Hash.new } + + # Racc can handle string over 2 bytes. + contents: IDENT '=>' IDENT { {val[0] => val[2]} } + | contents ',' IDENT '=>' IDENT { val[0][val[2]] = val[4]; val[0] } +end + +---- inner + + def parse(str) + @str = str + yyparse self, :scan + end + + private + + def scan + str = @str + until str.empty? + case str + when /\A\s+/ + str = $' + when /\A\w+/ + yield :IDENT, $& + str = $' + when /\A=>/ + yield '=>', '=>' + str = $' + else + c = str[0,1] + yield c, c + str = str[1..-1] + end + end + yield false, '$' # is optional from Racc 1.3.7 + end + +---- footer + +if $0 == __FILE__ + src = <<EOS +{ + name => MyName, + id => MyIdent +} +EOS + puts 'Parsing (String):' + print src + puts + puts 'Result (Ruby Object):' + p HashParser.new.parse(src) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/lalr.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/lalr.y new file mode 100644 index 000000000000..17753f9e5e17 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/lalr.y @@ -0,0 +1,17 @@ +# +# +# This is LALR grammer, and not LL/SLR. + +class A +rule + A : L '=' E + + L : i + | R '^' i + + E : E '+' R + | R + | '@' L + + R : i +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/lists.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/lists.y new file mode 100644 index 000000000000..195d4f766944 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/lists.y @@ -0,0 +1,57 @@ +# +# +# Rules for verious lists. +# This file is just an example, you cannot compile this file. + +class ExampleOnly +rule + +# a list, which minimum number of items is 0 +list0 : + { + result = [] + } + | list0 item + { + result.push val[1] + } + +# a list, which minimum number of items is 1 +list1 : item + { + result = val + } + | list1 item + { + result.push val[1] + } + +# a list, separated by comma +clist : item + { + result = val + } + | clist ',' item + { + result.push val[2] + } + +# a hash. see also "hash.y". +hash : '{' hash_contents '}' + { + result = val[1] + } + | '{' '}' + { + result = {} + } + +hash_contents + : item "=>" item + { + result = { val[0] => val[2] } + } + | hash_contents ',' item "=>" item + { + result[val[2]] = val[4] + } diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/syntax.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/syntax.y new file mode 100644 index 000000000000..b9af4aa2b9cf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/syntax.y @@ -0,0 +1,46 @@ +# +# +# Racc syntax checker. This grammer file generates +# invalid ruby program, you cannot run this parser. + +class P + token A B C + + convert + A '5' + end + + prechigh + left B + preclow + + options omit_action_call + + start target +rule + target: A B C + { + print 'abc' + } + | B C A + | C B A + { + print 'cba' + } + | cont + + cont : A c2 B c2 C + + c2 : C C C C C +end + +---- inner + + junk code !!!! + +kjaljlajrlaolanbla /// %%% (*((( token rule +akiurtlajluealjflaj @@@@ end end end end __END__ + laieu2o879urkq96ga(Q#*&%Q# + #&lkji END + + q395q?/// liutjqlkr7 diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/yyerr.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/yyerr.y new file mode 100644 index 000000000000..10307d1e61be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/sample/yyerr.y @@ -0,0 +1,46 @@ +# +# +# Test grammer file for error handling. + +class A +rule + +target: a b c + +a : + { + yyerror + raise ArgumentError, "yyerror failed" + } + | error + +b : + { + yyerrok + } + +c : + { + yyaccept + raise "yyaccept failed" + } + +end + +---- inner + + def parse + do_parse + end + + def next_token + [false, '$end'] + end + + def on_error(*args) + $stderr.puts "on_error called: args=#{args.inspect}" + end + +---- footer + +A.new.parse diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/cadenza.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/cadenza.y new file mode 100644 index 000000000000..1940ead22510 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/cadenza.y @@ -0,0 +1,170 @@ +# This grammar is released under an MIT license +# Author: William Howard (http://github.com/whoward) +# Source: https://github.com/whoward/cadenza/blob/master/src/cadenza.y + +class Cadenza::RaccParser + +/* expect this many shift/reduce conflicts */ +expect 37 + +rule + target + : document + | /* none */ { result = nil } + ; + + parameter_list + : logical_expression { result = [val[0]] } + | parameter_list ',' logical_expression { result = val[0].push(val[2]) } + ; + + /* this has a shift/reduce conflict but since Racc will shift in this case it is the correct behavior */ + primary_expression + : IDENTIFIER { result = VariableNode.new(val[0].value) } + | IDENTIFIER parameter_list { result = VariableNode.new(val[0].value, val[1]) } + | INTEGER { result = ConstantNode.new(val[0].value) } + | REAL { result = ConstantNode.new(val[0].value) } + | STRING { result = ConstantNode.new(val[0].value) } + | '(' filtered_expression ')' { result = val[1] } + ; + + multiplicative_expression + : primary_expression + | multiplicative_expression '*' primary_expression { result = OperationNode.new(val[0], "*", val[2]) } + | multiplicative_expression '/' primary_expression { result = OperationNode.new(val[0], "/", val[2]) } + ; + + additive_expression + : multiplicative_expression + | additive_expression '+' multiplicative_expression { result = OperationNode.new(val[0], "+", val[2]) } + | additive_expression '-' multiplicative_expression { result = OperationNode.new(val[0], "-", val[2]) } + ; + + boolean_expression + : additive_expression + | boolean_expression OP_EQ additive_expression { result = OperationNode.new(val[0], "==", val[2]) } + | boolean_expression OP_NEQ additive_expression { result = OperationNode.new(val[0], "!=", val[2]) } + | boolean_expression OP_LEQ additive_expression { result = OperationNode.new(val[0], "<=", val[2]) } + | boolean_expression OP_GEQ additive_expression { result = OperationNode.new(val[0], ">=", val[2]) } + | boolean_expression '>' additive_expression { result = OperationNode.new(val[0], ">", val[2]) } + | boolean_expression '<' additive_expression { result = OperationNode.new(val[0], "<", val[2]) } + ; + + inverse_expression + : boolean_expression + | NOT boolean_expression { result = BooleanInverseNode.new(val[1]) } + ; + + logical_expression + : inverse_expression + | logical_expression AND inverse_expression { result = OperationNode.new(val[0], "and", val[2]) } + | logical_expression OR inverse_expression { result = OperationNode.new(val[0], "or", val[2]) } + ; + + filter + : IDENTIFIER { result = FilterNode.new(val[0].value) } + | IDENTIFIER ':' parameter_list { result = FilterNode.new(val[0].value, val[2]) } + ; + + filter_list + : filter { result = [val[0]] } + | filter_list '|' filter { result = val[0].push(val[2]) } + ; + + filtered_expression + : logical_expression + | logical_expression '|' filter_list { result = FilteredValueNode.new(val[0], val[2]) } + ; + + inject_statement + : VAR_OPEN filtered_expression VAR_CLOSE { result = val[1] } + ; + + if_tag + : STMT_OPEN IF logical_expression STMT_CLOSE { open_scope!; result = val[2] } + | STMT_OPEN UNLESS logical_expression STMT_CLOSE { open_scope!; result = BooleanInverseNode.new(val[2]) } + ; + + else_tag + : STMT_OPEN ELSE STMT_CLOSE { result = close_scope!; open_scope! } + ; + + end_if_tag + : STMT_OPEN ENDIF STMT_CLOSE { result = close_scope! } + | STMT_OPEN ENDUNLESS STMT_CLOSE { result = close_scope! } + ; + + if_block + : if_tag end_if_tag { result = IfNode.new(val[0], val[1]) } + | if_tag document end_if_tag { result = IfNode.new(val[0], val[2]) } + | if_tag else_tag document end_if_tag { result = IfNode.new(val[0], val[1], val[3]) } + | if_tag document else_tag end_if_tag { result = IfNode.new(val[0], val[2], val[3]) } + | if_tag document else_tag document end_if_tag { result = IfNode.new(val[0], val[2], val[4]) } + ; + + for_tag + : STMT_OPEN FOR IDENTIFIER IN filtered_expression STMT_CLOSE { open_scope!; result = [val[2].value, val[4]] } + ; + + end_for_tag + : STMT_OPEN ENDFOR STMT_CLOSE { result = close_scope! } + ; + + /* this has a shift/reduce conflict but since Racc will shift in this case it is the correct behavior */ + for_block + : for_tag end_for_tag { result = ForNode.new(VariableNode.new(val[0].first), val[0].last, val[1]) } + | for_tag document end_for_tag { result = ForNode.new(VariableNode.new(val[0].first), val[0].last, val[2]) } + ; + + block_tag + : STMT_OPEN BLOCK IDENTIFIER STMT_CLOSE { result = open_block_scope!(val[2].value) } + ; + + end_block_tag + : STMT_OPEN ENDBLOCK STMT_CLOSE { result = close_block_scope! } + ; + + /* this has a shift/reduce conflict but since Racc will shift in this case it is the correct behavior */ + block_block + : block_tag end_block_tag { result = BlockNode.new(val[0], val[1]) } + | block_tag document end_block_tag { result = BlockNode.new(val[0], val[2]) } + ; + + generic_block_tag + : STMT_OPEN IDENTIFIER STMT_CLOSE { open_scope!; result = [val[1].value, []] } + | STMT_OPEN IDENTIFIER parameter_list STMT_CLOSE { open_scope!; result = [val[1].value, val[2]] } + ; + + end_generic_block_tag + : STMT_OPEN END STMT_CLOSE { result = close_scope! } + ; + + generic_block + : generic_block_tag document end_generic_block_tag { result = GenericBlockNode.new(val[0].first, val[2], val[0].last) } + ; + + extends_statement + : STMT_OPEN EXTENDS STRING STMT_CLOSE { result = val[2].value } + | STMT_OPEN EXTENDS IDENTIFIER STMT_CLOSE { result = VariableNode.new(val[2].value) } + ; + + document_component + : TEXT_BLOCK { result = TextNode.new(val[0].value) } + | inject_statement + | if_block + | for_block + | generic_block + | block_block + ; + + document + : document_component { push val[0] } + | document document_component { push val[1] } + | extends_statement { document.extends = val[0] } + | document extends_statement { document.extends = val[1] } + ; + +---- header ---- +# racc_parser.rb : generated by racc + +---- inner ---- diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/cast.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/cast.y new file mode 100644 index 000000000000..d180c09e1417 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/cast.y @@ -0,0 +1,926 @@ +# The MIT License +# +# Copyright (c) George Ogata +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class C::Parser +# shift/reduce conflict on "if (c) if (c) ; else ; else ;" +expect 1 +rule + +# A.2.4 External definitions + +# Returns TranslationUnit +translation_unit + : external_declaration {result = TranslationUnit.new_at(val[0].pos, NodeChain[val[0]])} + | translation_unit external_declaration {result = val[0]; result.entities << val[1]} + +# Returns Declaration|FunctionDef +external_declaration + : function_definition {result = val[0]} + | declaration {result = val[0]} + +# Returns FunctionDef +function_definition + : declaration_specifiers declarator declaration_list compound_statement {result = make_function_def(val[0][0], val[0][1], val[1], val[2], val[3])} + | declaration_specifiers declarator compound_statement {result = make_function_def(val[0][0], val[0][1], val[1], nil , val[2])} + +# Returns [Declaration] +declaration_list + : declaration {result = [val[0]]} + | declaration_list declaration {result = val[0] << val[1]} + +# A.2.3 Statements + +# Returns Statement +statement + : labeled_statement {result = val[0]} + | compound_statement {result = val[0]} + | expression_statement {result = val[0]} + | selection_statement {result = val[0]} + | iteration_statement {result = val[0]} + | jump_statement {result = val[0]} + +# Returns Statement +labeled_statement + : identifier COLON statement {val[2].labels.unshift(PlainLabel.new_at(val[0].pos, val[0].val)); result = val[2]} + | CASE constant_expression COLON statement {val[3].labels.unshift(Case .new_at(val[0].pos, val[1] )); result = val[3]} + | DEFAULT COLON statement {val[2].labels.unshift(Default .new_at(val[0].pos )); result = val[2]} + # type names can also be used as labels + | typedef_name COLON statement {val[2].labels.unshift(PlainLabel.new_at(val[0].pos, val[0].name)); result = val[2]} + +# Returns Block +compound_statement + : LBRACE block_item_list RBRACE {result = Block.new_at(val[0].pos, val[1])} + | LBRACE RBRACE {result = Block.new_at(val[0].pos )} + +# Returns NodeChain[Declaration|Statement] +block_item_list + : block_item {result = NodeChain[val[0]]} + | block_item_list block_item {result = val[0] << val[1]} + +# Returns Declaration|Statement +block_item + : declaration {result = val[0]} + | statement {result = val[0]} + +# Returns ExpressionStatement +expression_statement + : expression SEMICOLON {result = ExpressionStatement.new_at(val[0].pos, val[0])} + | SEMICOLON {result = ExpressionStatement.new_at(val[0].pos )} + +# Returns Statement +selection_statement + : IF LPAREN expression RPAREN statement {result = If .new_at(val[0].pos, val[2], val[4] )} + | IF LPAREN expression RPAREN statement ELSE statement {result = If .new_at(val[0].pos, val[2], val[4], val[6])} + | SWITCH LPAREN expression RPAREN statement {result = Switch.new_at(val[0].pos, val[2], val[4] )} + +# Returns Statement +iteration_statement + : WHILE LPAREN expression RPAREN statement {result = While.new_at(val[0].pos, val[2], val[4] )} + | DO statement WHILE LPAREN expression RPAREN SEMICOLON {result = While.new_at(val[0].pos, val[4], val[1], :do => true )} + | FOR LPAREN expression SEMICOLON expression SEMICOLON expression RPAREN statement {result = For.new_at(val[0].pos, val[2], val[4], val[6], val[8])} + | FOR LPAREN expression SEMICOLON expression SEMICOLON RPAREN statement {result = For.new_at(val[0].pos, val[2], val[4], nil , val[7])} + | FOR LPAREN expression SEMICOLON SEMICOLON expression RPAREN statement {result = For.new_at(val[0].pos, val[2], nil , val[5], val[7])} + | FOR LPAREN expression SEMICOLON SEMICOLON RPAREN statement {result = For.new_at(val[0].pos, val[2], nil , nil , val[6])} + | FOR LPAREN SEMICOLON expression SEMICOLON expression RPAREN statement {result = For.new_at(val[0].pos, nil , val[3], val[5], val[7])} + | FOR LPAREN SEMICOLON expression SEMICOLON RPAREN statement {result = For.new_at(val[0].pos, nil , val[3], nil , val[6])} + | FOR LPAREN SEMICOLON SEMICOLON expression RPAREN statement {result = For.new_at(val[0].pos, nil , nil , val[4], val[6])} + | FOR LPAREN SEMICOLON SEMICOLON RPAREN statement {result = For.new_at(val[0].pos, nil , nil , nil , val[5])} + | FOR LPAREN declaration expression SEMICOLON expression RPAREN statement {result = For.new_at(val[0].pos, val[2], val[3], val[5], val[7])} + | FOR LPAREN declaration expression SEMICOLON RPAREN statement {result = For.new_at(val[0].pos, val[2], val[3], nil , val[6])} + | FOR LPAREN declaration SEMICOLON expression RPAREN statement {result = For.new_at(val[0].pos, val[2], nil , val[4], val[6])} + | FOR LPAREN declaration SEMICOLON RPAREN statement {result = For.new_at(val[0].pos, val[2], nil , nil , val[5])} + +# Returns Statement +jump_statement + : GOTO identifier SEMICOLON {result = Goto .new_at(val[0].pos, val[1].val)} + | CONTINUE SEMICOLON {result = Continue.new_at(val[0].pos )} + | BREAK SEMICOLON {result = Break .new_at(val[0].pos )} + | RETURN expression SEMICOLON {result = Return .new_at(val[0].pos, val[1] )} + | RETURN SEMICOLON {result = Return .new_at(val[0].pos )} + # type names can also be used as labels + | GOTO typedef_name SEMICOLON {result = Goto .new_at(val[0].pos, val[1].name)} + +# A.2.2 Declarations + +# Returns Declaration +declaration + : declaration_specifiers init_declarator_list SEMICOLON {result = make_declaration(val[0][0], val[0][1], val[1])} + | declaration_specifiers SEMICOLON {result = make_declaration(val[0][0], val[0][1], NodeArray[])} + +# Returns {Pos, [Symbol]} +declaration_specifiers + : storage_class_specifier declaration_specifiers {val[1][1] << val[0][1]; result = val[1]} + | storage_class_specifier {result = [val[0][0], [val[0][1]]]} + | type_specifier declaration_specifiers {val[1][1] << val[0][1]; result = val[1]} + | type_specifier {result = [val[0][0], [val[0][1]]]} + | type_qualifier declaration_specifiers {val[1][1] << val[0][1]; result = val[1]} + | type_qualifier {result = [val[0][0], [val[0][1]]]} + | function_specifier declaration_specifiers {val[1][1] << val[0][1]; result = val[1]} + | function_specifier {result = [val[0][0], [val[0][1]]]} + +# Returns NodeArray[Declarator] +init_declarator_list + : init_declarator {result = NodeArray[val[0]]} + | init_declarator_list COMMA init_declarator {result = val[0] << val[2]} + +# Returns Declarator +init_declarator + : declarator {result = val[0]} + | declarator EQ initializer {val[0].init = val[2]; result = val[0]} + +# Returns [Pos, Symbol] +storage_class_specifier + : TYPEDEF {result = [val[0].pos, :typedef ]} + | EXTERN {result = [val[0].pos, :extern ]} + | STATIC {result = [val[0].pos, :static ]} + | AUTO {result = [val[0].pos, :auto ]} + | REGISTER {result = [val[0].pos, :register]} + +# Returns [Pos, Type|Symbol] +type_specifier + : VOID {result = [val[0].pos, :void ]} + | CHAR {result = [val[0].pos, :char ]} + | SHORT {result = [val[0].pos, :short ]} + | INT {result = [val[0].pos, :int ]} + | LONG {result = [val[0].pos, :long ]} + | FLOAT {result = [val[0].pos, :float ]} + | DOUBLE {result = [val[0].pos, :double ]} + | SIGNED {result = [val[0].pos, :signed ]} + | UNSIGNED {result = [val[0].pos, :unsigned ]} + | BOOL {result = [val[0].pos, :_Bool ]} + | COMPLEX {result = [val[0].pos, :_Complex ]} + | IMAGINARY {result = [val[0].pos, :_Imaginary]} + | struct_or_union_specifier {result = [val[0].pos, val[0] ]} + | enum_specifier {result = [val[0].pos, val[0] ]} + | typedef_name {result = [val[0].pos, val[0] ]} + +# Returns Struct|Union +struct_or_union_specifier + : struct_or_union identifier LBRACE struct_declaration_list RBRACE {result = val[0][1].new_at(val[0][0], val[1].val, val[3])} + | struct_or_union LBRACE struct_declaration_list RBRACE {result = val[0][1].new_at(val[0][0], nil , val[2])} + | struct_or_union identifier {result = val[0][1].new_at(val[0][0], val[1].val, nil )} + # type names can also be used as struct identifiers + | struct_or_union typedef_name LBRACE struct_declaration_list RBRACE {result = val[0][1].new_at(val[0][0], val[1].name, val[3])} + | struct_or_union typedef_name {result = val[0][1].new_at(val[0][0], val[1].name, nil )} + +# Returns [Pos, Class] +struct_or_union + : STRUCT {result = [val[0].pos, Struct]} + | UNION {result = [val[0].pos, Union ]} + +# Returns NodeArray[Declaration] +struct_declaration_list + : struct_declaration {result = NodeArray[val[0]]} + | struct_declaration_list struct_declaration {val[0] << val[1]; result = val[0]} + +# Returns Declaration +struct_declaration + : specifier_qualifier_list struct_declarator_list SEMICOLON {result = make_declaration(val[0][0], val[0][1], val[1])} + +# Returns {Pos, [Symbol]} +specifier_qualifier_list + : type_specifier specifier_qualifier_list {val[1][1] << val[0][1]; result = val[1]} + | type_specifier {result = [val[0][0], [val[0][1]]]} + | type_qualifier specifier_qualifier_list {val[1][1] << val[0][1]; result = val[1]} + | type_qualifier {result = [val[0][0], [val[0][1]]]} + +# Returns NodeArray[Declarator] +struct_declarator_list + : struct_declarator {result = NodeArray[val[0]]} + | struct_declarator_list COMMA struct_declarator {result = val[0] << val[2]} + +# Returns Declarator +struct_declarator + : declarator {result = val[0]} + | declarator COLON constant_expression {result = val[0]; val[0].num_bits = val[2]} + | COLON constant_expression {result = Declarator.new_at(val[0].pos, :num_bits => val[1])} + +# Returns Enum +enum_specifier + : ENUM identifier LBRACE enumerator_list RBRACE {result = Enum.new_at(val[0].pos, val[1].val, val[3])} + | ENUM LBRACE enumerator_list RBRACE {result = Enum.new_at(val[0].pos, nil , val[2])} + | ENUM identifier LBRACE enumerator_list COMMA RBRACE {result = Enum.new_at(val[0].pos, val[1].val, val[3])} + | ENUM LBRACE enumerator_list COMMA RBRACE {result = Enum.new_at(val[0].pos, nil , val[2])} + | ENUM identifier {result = Enum.new_at(val[0].pos, val[1].val, nil )} + # type names can also be used as enum names + | ENUM typedef_name LBRACE enumerator_list RBRACE {result = Enum.new_at(val[0].pos, val[1].name, val[3])} + | ENUM typedef_name LBRACE enumerator_list COMMA RBRACE {result = Enum.new_at(val[0].pos, val[1].name, val[3])} + | ENUM typedef_name {result = Enum.new_at(val[0].pos, val[1].name, nil )} + +# Returns NodeArray[Enumerator] +enumerator_list + : enumerator {result = NodeArray[val[0]]} + | enumerator_list COMMA enumerator {result = val[0] << val[2]} + +# Returns Enumerator +enumerator + : enumeration_constant {result = Enumerator.new_at(val[0].pos, val[0].val, nil )} + | enumeration_constant EQ constant_expression {result = Enumerator.new_at(val[0].pos, val[0].val, val[2])} + +# Returns [Pos, Symbol] +type_qualifier + : CONST {result = [val[0].pos, :const ]} + | RESTRICT {result = [val[0].pos, :restrict]} + | VOLATILE {result = [val[0].pos, :volatile]} + +# Returns [Pos, Symbol] +function_specifier + : INLINE {result = [val[0].pos, :inline]} + +# Returns Declarator +declarator + : pointer direct_declarator {result = add_decl_type(val[1], val[0])} + | direct_declarator {result = val[0]} + +# Returns Declarator +direct_declarator + : identifier {result = Declarator.new_at(val[0].pos, nil, val[0].val)} + | LPAREN declarator RPAREN {result = val[1]} + | direct_declarator LBRACKET type_qualifier_list assignment_expression RBRACKET {result = add_decl_type(val[0], Array.new_at(val[0].pos ))} # TODO + | direct_declarator LBRACKET type_qualifier_list RBRACKET {result = add_decl_type(val[0], Array.new_at(val[0].pos ))} # TODO + | direct_declarator LBRACKET assignment_expression RBRACKET {result = add_decl_type(val[0], Array.new_at(val[0].pos, nil, val[2]))} + | direct_declarator LBRACKET RBRACKET {result = add_decl_type(val[0], Array.new_at(val[0].pos ))} + | direct_declarator LBRACKET STATIC type_qualifier_list assignment_expression RBRACKET {result = add_decl_type(val[0], Array.new_at(val[0].pos ))} # TODO + | direct_declarator LBRACKET STATIC assignment_expression RBRACKET {result = add_decl_type(val[0], Array.new_at(val[0].pos ))} # TODO + | direct_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET {result = add_decl_type(val[0], Array.new_at(val[0].pos ))} # TODO + | direct_declarator LBRACKET type_qualifier_list MUL RBRACKET {result = add_decl_type(val[0], Array.new_at(val[0].pos ))} # TODO + | direct_declarator LBRACKET MUL RBRACKET {result = add_decl_type(val[0], Array.new_at(val[0].pos ))} # TODO + | direct_declarator LPAREN parameter_type_list RPAREN {result = add_decl_type(val[0], Function.new_at(val[0].pos, nil, param_list(*val[2]), :var_args => val[2][1]))} + | direct_declarator LPAREN identifier_list RPAREN {result = add_decl_type(val[0], Function.new_at(val[0].pos, nil, val[2]))} + | direct_declarator LPAREN RPAREN {result = add_decl_type(val[0], Function.new_at(val[0].pos ))} + +# Returns Pointer +pointer + : MUL type_qualifier_list {result = add_type_quals(Pointer.new_at(val[0].pos), val[1][1]) } + | MUL {result = Pointer.new_at(val[0].pos) } + | MUL type_qualifier_list pointer {p = add_type_quals(Pointer.new_at(val[0].pos), val[1][1]); val[2].direct_type = p; result = val[2]} + | MUL pointer {p = Pointer.new_at(val[0].pos) ; val[1].direct_type = p; result = val[1]} + +# Returns {Pos, [Symbol]} +type_qualifier_list + : type_qualifier {result = [val[0][0], [val[0][1]]]} + | type_qualifier_list type_qualifier {val[0][1] << val[1][1]; result = val[0]} + +# Returns [NodeArray[Parameter], var_args?] +parameter_type_list + : parameter_list {result = [val[0], false]} + | parameter_list COMMA ELLIPSIS {result = [val[0], true ]} + +# Returns NodeArray[Parameter] +parameter_list + : parameter_declaration {result = NodeArray[val[0]]} + | parameter_list COMMA parameter_declaration {result = val[0] << val[2]} + +# Returns Parameter +parameter_declaration + : declaration_specifiers declarator {ind_type = val[1].indirect_type and ind_type.detach + result = make_parameter(val[0][0], val[0][1], ind_type, val[1].name)} + | declaration_specifiers abstract_declarator {result = make_parameter(val[0][0], val[0][1], val[1] , nil )} + | declaration_specifiers {result = make_parameter(val[0][0], val[0][1], nil , nil )} + +# Returns NodeArray[Parameter] +identifier_list + : identifier {result = NodeArray[Parameter.new_at(val[0].pos, nil, val[0].val)]} + | identifier_list COMMA identifier {result = val[0] << Parameter.new_at(val[2].pos, nil, val[2].val)} + +# Returns Type +type_name + : specifier_qualifier_list abstract_declarator {val[1].direct_type = make_direct_type(val[0][0], val[0][1]); result = val[1]} + | specifier_qualifier_list {result = make_direct_type(val[0][0], val[0][1]) } + +# Returns Type +abstract_declarator + : pointer {result = val[0]} + | pointer direct_abstract_declarator {val[1].direct_type = val[0]; result = val[1]} + | direct_abstract_declarator {result = val[0]} + +# Returns Type +direct_abstract_declarator + : LPAREN abstract_declarator RPAREN {result = val[1]} + | direct_abstract_declarator LBRACKET assignment_expression RBRACKET {val[0].direct_type = Array.new_at(val[0].pos, nil, val[2]); result = val[0]} + | direct_abstract_declarator LBRACKET RBRACKET {val[0].direct_type = Array.new_at(val[0].pos, nil, nil ); result = val[0]} + | LBRACKET assignment_expression RBRACKET {result = Array.new_at(val[0].pos, nil, val[1])} + | LBRACKET RBRACKET {result = Array.new_at(val[0].pos )} + | direct_abstract_declarator LBRACKET MUL RBRACKET {val[0].direct_type = Array.new_at(val[0].pos); result = val[0]} # TODO + | LBRACKET MUL RBRACKET {result = Array.new_at(val[0].pos)} # TODO + | direct_abstract_declarator LPAREN parameter_type_list RPAREN {val[0].direct_type = Function.new_at(val[0].pos, nil, param_list(*val[2]), val[2][1]); result = val[0]} + | direct_abstract_declarator LPAREN RPAREN {val[0].direct_type = Function.new_at(val[0].pos ); result = val[0]} + | LPAREN parameter_type_list RPAREN {result = Function.new_at(val[0].pos, nil, param_list(*val[1]), val[1][1])} + | LPAREN RPAREN {result = Function.new_at(val[0].pos )} + +# Returns CustomType +typedef_name + #: identifier -- insufficient since we must distinguish between type + # names and var names (otherwise we have a conflict) + : TYPENAME {result = CustomType.new_at(val[0].pos, val[0].val)} + +# Returns Expression +initializer + : assignment_expression {result = val[0]} + | LBRACE initializer_list RBRACE {result = CompoundLiteral.new_at(val[0].pos, nil, val[1])} + | LBRACE initializer_list COMMA RBRACE {result = CompoundLiteral.new_at(val[0].pos, nil, val[1])} + +# Returns NodeArray[MemberInit] +initializer_list + : designation initializer {result = NodeArray[MemberInit.new_at(val[0][0] , val[0][1], val[1])]} + | initializer {result = NodeArray[MemberInit.new_at(val[0].pos, nil , val[0])]} + | initializer_list COMMA designation initializer {result = val[0] << MemberInit.new_at(val[2][0] , val[2][1], val[3])} + | initializer_list COMMA initializer {result = val[0] << MemberInit.new_at(val[2].pos, nil , val[2])} + +# Returns {Pos, NodeArray[Expression|Token]} +designation + : designator_list EQ {result = val[0]} + +# Returns {Pos, NodeArray[Expression|Token]} +designator_list + : designator {result = val[0]; val[0][1] = NodeArray[val[0][1]]} + | designator_list designator {result = val[0]; val[0][1] << val[1][1]} + +# Returns {Pos, Expression|Member} +designator + : LBRACKET constant_expression RBRACKET {result = [val[1].pos, val[1] ]} + | DOT identifier {result = [val[1].pos, Member.new_at(val[1].pos, val[1].val)]} + +# A.2.1 Expressions + +# Returns Expression +primary_expression + : identifier {result = Variable.new_at(val[0].pos, val[0].val)} + | constant {result = val[0]} + | string_literal {result = val[0]} + # GCC EXTENSION: allow a compound statement in parentheses as an expression + | LPAREN expression RPAREN {result = val[1]} + | LPAREN compound_statement RPAREN {block_expressions_enabled? or parse_error val[0].pos, "compound statement found where expression expected" + result = BlockExpression.new(val[1]); result.pos = val[0].pos} + +# Returns Expression +postfix_expression + : primary_expression {result = val[0]} + | postfix_expression LBRACKET expression RBRACKET {result = Index .new_at(val[0].pos, val[0], val[2])} + | postfix_expression LPAREN argument_expression_list RPAREN {result = Call .new_at(val[0].pos, val[0], val[2] )} + | postfix_expression LPAREN RPAREN {result = Call .new_at(val[0].pos, val[0], NodeArray[])} + | postfix_expression DOT identifier {result = Dot .new_at(val[0].pos, val[0], Member.new(val[2].val))} + | postfix_expression ARROW identifier {result = Arrow .new_at(val[0].pos, val[0], Member.new(val[2].val))} + | postfix_expression INC {result = PostInc .new_at(val[0].pos, val[0] )} + | postfix_expression DEC {result = PostDec .new_at(val[0].pos, val[0] )} + | LPAREN type_name RPAREN LBRACE initializer_list RBRACE {result = CompoundLiteral.new_at(val[0].pos, val[1], val[4])} + | LPAREN type_name RPAREN LBRACE initializer_list COMMA RBRACE {result = CompoundLiteral.new_at(val[0].pos, val[1], val[4])} + +# Returns [Expression|Type] +argument_expression_list + : argument_expression {result = NodeArray[val[0]]} + | argument_expression_list COMMA argument_expression {result = val[0] << val[2]} + +# Returns Expression|Type -- EXTENSION: allow type names here too, to support some standard library macros (e.g., va_arg [7.15.1.1]) +argument_expression + : assignment_expression {result = val[0]} + | type_name {result = val[0]} + +# Returns Expression +unary_expression + : postfix_expression {result = val[0]} + | INC unary_expression {result = PreInc.new_at(val[0].pos, val[1])} + | DEC unary_expression {result = PreDec.new_at(val[0].pos, val[1])} + | unary_operator cast_expression {result = val[0][0].new_at(val[0][1], val[1])} + | SIZEOF unary_expression {result = Sizeof.new_at(val[0].pos, val[1])} + | SIZEOF LPAREN type_name RPAREN {result = Sizeof.new_at(val[0].pos, val[2])} + +# Returns [Class, Pos] +unary_operator + : AND {result = [Address , val[0].pos]} + | MUL {result = [Dereference, val[0].pos]} + | ADD {result = [Positive , val[0].pos]} + | SUB {result = [Negative , val[0].pos]} + | NOT {result = [BitNot , val[0].pos]} + | BANG {result = [Not , val[0].pos]} + +# Returns Expression +cast_expression + : unary_expression {result = val[0]} + | LPAREN type_name RPAREN cast_expression {result = Cast.new_at(val[0].pos, val[1], val[3])} + +# Returns Expression +multiplicative_expression + : cast_expression {result = val[0]} + | multiplicative_expression MUL cast_expression {result = Multiply.new_at(val[0].pos, val[0], val[2])} + | multiplicative_expression DIV cast_expression {result = Divide .new_at(val[0].pos, val[0], val[2])} + | multiplicative_expression MOD cast_expression {result = Mod .new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +additive_expression + : multiplicative_expression {result = val[0]} + | additive_expression ADD multiplicative_expression {result = Add .new_at(val[0].pos, val[0], val[2])} + | additive_expression SUB multiplicative_expression {result = Subtract.new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +shift_expression + : additive_expression {result = val[0]} + | shift_expression LSHIFT additive_expression {result = ShiftLeft .new_at(val[0].pos, val[0], val[2])} + | shift_expression RSHIFT additive_expression {result = ShiftRight.new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +relational_expression + : shift_expression {result = val[0]} + | relational_expression LT shift_expression {result = Less.new_at(val[0].pos, val[0], val[2])} + | relational_expression GT shift_expression {result = More.new_at(val[0].pos, val[0], val[2])} + | relational_expression LEQ shift_expression {result = LessOrEqual.new_at(val[0].pos, val[0], val[2])} + | relational_expression GEQ shift_expression {result = MoreOrEqual.new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +equality_expression + : relational_expression {result = val[0]} + | equality_expression EQEQ relational_expression {result = Equal .new_at(val[0].pos, val[0], val[2])} + | equality_expression NEQ relational_expression {result = NotEqual.new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +and_expression + : equality_expression {result = val[0]} + | and_expression AND equality_expression {result = BitAnd.new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +exclusive_or_expression + : and_expression {result = val[0]} + | exclusive_or_expression XOR and_expression {result = BitXor.new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +inclusive_or_expression + : exclusive_or_expression {result = val[0]} + | inclusive_or_expression OR exclusive_or_expression {result = BitOr.new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +logical_and_expression + : inclusive_or_expression {result = val[0]} + | logical_and_expression ANDAND inclusive_or_expression {result = And.new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +logical_or_expression + : logical_and_expression {result = val[0]} + | logical_or_expression OROR logical_and_expression {result = Or.new_at(val[0].pos, val[0], val[2])} + +# Returns Expression +conditional_expression + : logical_or_expression {result = val[0]} + | logical_or_expression QUESTION expression COLON conditional_expression {result = Conditional.new_at(val[0].pos, val[0], val[2], val[4])} + +# Returns Expression +assignment_expression + : conditional_expression {result = val[0]} + | unary_expression assignment_operator assignment_expression {result = val[1].new_at(val[0].pos, val[0], val[2])} + +# Returns Class +assignment_operator + : EQ {result = Assign} + | MULEQ {result = MultiplyAssign} + | DIVEQ {result = DivideAssign} + | MODEQ {result = ModAssign} + | ADDEQ {result = AddAssign} + | SUBEQ {result = SubtractAssign} + | LSHIFTEQ {result = ShiftLeftAssign} + | RSHIFTEQ {result = ShiftRightAssign} + | ANDEQ {result = BitAndAssign} + | XOREQ {result = BitXorAssign} + | OREQ {result = BitOrAssign} + +# Returns Expression +expression + : assignment_expression {result = val[0]} + | expression COMMA assignment_expression { + if val[0].is_a? Comma + if val[2].is_a? Comma + val[0].exprs.push(*val[2].exprs) + else + val[0].exprs << val[2] + end + result = val[0] + else + if val[2].is_a? Comma + val[2].exprs.unshift(val[0]) + val[2].pos = val[0].pos + result = val[2] + else + result = Comma.new_at(val[0].pos, NodeArray[val[0], val[2]]) + end + end + } + +# Returns Expression +constant_expression + : conditional_expression {result = val[0]} + +# A.1.1 -- Lexical elements +# +# token +# : keyword (raw string) +# | identifier expanded below +# | constant expanded below +# | string_literal expanded below +# | punctuator (raw string) +# +# preprocessing-token (skip) + +# Returns Token +identifier + : ID {result = val[0]} + +# Returns Literal +constant + : ICON {result = val[0].val; result.pos = val[0].pos} + | FCON {result = val[0].val; result.pos = val[0].pos} + #| enumeration_constant -- these are parsed as identifiers at all + # places the `constant' nonterminal appears + | CCON {result = val[0].val; result.pos = val[0].pos} + +# Returns Token +enumeration_constant + : ID {result = val[0]} + +# Returns StringLiteral +# Also handles string literal concatenation (6.4.5.4) +string_literal + : string_literal SCON {val[0].val << val[1].val.val; result = val[0]} + | SCON { result = val[0].val; result.pos = val[0].pos } + +---- inner + # A.1.9 -- Preprocessing numbers -- skip + # A.1.8 -- Header names -- skip + + # A.1.7 -- Puncuators -- we don't bother with {##,#,%:,%:%:} since + # we don't do preprocessing + @@punctuators = %r'\+\+|-[->]|&&|\|\||\.\.\.|(?:<<|>>|[<>=!*/%+\-&^|])=?|[\[\](){}.~?:;,]' + @@digraphs = %r'<[:%]|[:%]>' + + # A.1.6 -- String Literals -- simple for us because we don't decode + # the string (and indeed accept some illegal strings) + @@string_literal = %r'L?"(?:[^\\]|\\.)*?"'m + + # A.1.5 -- Constants + @@decimal_floating_constant = %r'(?:(?:\d*\.\d+|\d+\.)(?:e[-+]?\d+)?|\d+e[-+]?\d+)[fl]?'i + @@hexadecimal_floating_constant = %r'0x(?:(?:[0-9a-f]*\.[0-9a-f]+|[0-9a-f]+\.)|[0-9a-f]+)p[-+]?\d+[fl]?'i + + @@integer_constant = %r'(?:[1-9][0-9]*|0x[0-9a-f]+|0[0-7]*)(?:ul?l?|ll?u?)?'i + @@floating_constant = %r'#{@@decimal_floating_constant}|#{@@hexadecimal_floating_constant}' + @@enumeration_constant = %r'[a-zA-Z_\\][a-zA-Z_\\0-9]*' + @@character_constant = %r"L?'(?:[^\\]|\\.)+?'" + # (note that as with string-literals, we accept some illegal + # character-constants) + + # A.1.4 -- Universal character names -- skip + + # A.1.3 -- Identifiers -- skip, since an identifier is lexically + # identical to an enumeration constant + + # A.1.2 Keywords + keywords = %w'auto break case char const continue default do +double else enum extern float for goto if inline int long register +restrict return short signed sizeof static struct switch typedef union + unsigned void volatile while _Bool _Complex _Imaginary' + @@keywords = %r"#{keywords.join('|')}" + + def initialize + @type_names = ::Set.new + + @warning_proc = lambda{} + @pos = C::Node::Pos.new(nil, 1, 0) + end + def initialize_copy(x) + @pos = x.pos.dup + @type_names = x.type_names.dup + end + attr_accessor :pos, :type_names + + def parse(str) + if str.respond_to? :read + str = str.read + end + @str = str + begin + prepare_lexer(str) + return do_parse + rescue ParseError => e + e.set_backtrace(caller) + raise + end + end + + # + # Error handler, as used by racc. + # + def on_error(error_token_id, error_value, value_stack) + if error_value == '$' + parse_error @pos, "unexpected EOF" + else + parse_error(error_value.pos, + "parse error on #{token_to_str(error_token_id)} (#{error_value.val})") + end + end + + def self.feature(name) + attr_writer "#{name}_enabled" + class_eval <<-EOS + def enable_#{name} + @#{name}_enabled = true + end + def #{name}_enabled? + @#{name}_enabled + end + EOS + end + private_class_method :feature + + # + # Allow blocks in parentheses as expressions, as per the gcc + # extension. [http://rubyurl.com/iB7] + # + feature :block_expressions + + private # --------------------------------------------------------- + + class Token + attr_accessor :pos, :val + def initialize(pos, val) + @pos = pos + @val = val + end + end + def eat(str) + lines = str.split(/\r\n|[\r\n]/, -1) + if lines.length == 1 + @pos.col_num += lines[0].length + else + @pos.line_num += lines.length - 1 + @pos.col_num = lines[-1].length + end + end + + # + # Make a Declaration from the given specs and declarators. + # + def make_declaration(pos, specs, declarators) + specs.all?{|x| x.is_a?(Symbol) || x.is_a?(Type)} or raise specs.map{|x| x.class}.inspect + decl = Declaration.new_at(pos, nil, declarators) + + # set storage class + storage_classes = specs.find_all do |x| + [:typedef, :extern, :static, :auto, :register].include? x + end + # 6.7.1p2: at most, one storage-class specifier may be given in + # the declaration specifiers in a declaration + storage_classes.length <= 1 or + begin + if declarators.length == 0 + for_name = '' + else + for_name = "for `#{declarators[0].name}'" + end + parse_error pos, "multiple or duplicate storage classes given #{for_name}'" + end + decl.storage = storage_classes[0] + + # set type (specifiers, qualifiers) + decl.type = make_direct_type(pos, specs) + + # set function specifiers + decl.inline = specs.include?(:inline) + + # look for new type names + if decl.typedef? + decl.declarators.each do |d| + if d.name + @type_names << d.name + end + end + end + + return decl + end + + def make_function_def(pos, specs, func_declarator, decl_list, defn) + add_decl_type(func_declarator, make_direct_type(pos, specs)) + + # get types from decl_list if necessary + function = func_declarator.indirect_type + function.is_a? Function or + parse_error pos, "non function type for function `#{func_declarator.name}'" + params = function.params + if decl_list + params.all?{|p| p.type.nil?} or + parse_error pos, "both prototype and declaration list given for `#{func_declarator.name}'" + decl_list.each do |declaration| + declaration.declarators.each do |declarator| + param = params.find{|p| p.name == declarator.name} or + parse_error pos, "no parameter named #{declarator.name}" + if declarator.indirect_type + param.type = declarator.indirect_type + param.type.direct_type = declaration.type.dup + else + param.type = declaration.type.dup + end + end + end + params.all?{|p| p.type} or + begin + s = params.find_all{|p| p.type.nil?}.map{|p| "`#{p.name}'"}.join(' and ') + parse_error pos, "types missing for parameters #{s}" + end + end + + fd = FunctionDef.new_at(pos, + function.detach, + func_declarator.name, + defn, + :no_prototype => !decl_list.nil?) + + # set storage class + # 6.9.1p4: only extern or static allowed + specs.each do |s| + [:typedef, :auto, :register].include?(s) and + "`#{s}' illegal for function" + end + storage_classes = specs.find_all do |s| + s == :extern || s == :static + end + # 6.7.1p2: at most, one storage-class specifier may be given in + # the declaration specifiers in a declaration + storage_classes.length <= 1 or + "multiple or duplicate storage classes given for `#{func_declarator.name}'" + fd.storage = storage_classes[0] if storage_classes[0] + + # set function specifiers + # 6.7.4p5 'inline' can be repeated + fd.inline = specs.include?(:inline) + + return fd + end + + # + # Make a direct type from the list of type specifiers and type + # qualifiers. + # + def make_direct_type(pos, specs) + specs_order = [:signed, :unsigned, :short, :long, :double, :void, + :char, :int, :float, :_Bool, :_Complex, :_Imaginary] + + type_specs = specs.find_all do |x| + specs_order.include?(x) || !x.is_a?(Symbol) + end + type_specs.sort! do |a, b| + (specs_order.index(a)||100) <=> (specs_order.index(b)||100) + end + + # set type specifiers + # 6.7.2p2: the specifier list should be one of these + type = + case type_specs + when [:void] + Void.new + when [:char] + Char.new + when [:signed, :char] + Char.new :signed => true + when [:unsigned, :char] + Char.new :signed => false + when [:short], [:signed, :short], [:short, :int], + [:signed, :short, :int] + Int.new :longness => -1 + when [:unsigned, :short], [:unsigned, :short, :int] + Int.new :unsigned => true, :longness => -1 + when [:int], [:signed], [:signed, :int] + Int.new + when [:unsigned], [:unsigned, :int] + Int.new :unsigned => true + when [:long], [:signed, :long], [:long, :int], + [:signed, :long, :int] + Int.new :longness => 1 + when [:unsigned, :long], [:unsigned, :long, :int] + Int.new :longness => 1, :unsigned => true + when [:long, :long], [:signed, :long, :long], + [:long, :long, :int], [:signed, :long, :long, :int] + Int.new :longness => 2 + when [:unsigned, :long, :long], [:unsigned, :long, :long, :int] + Int.new :longness => 2, :unsigned => true + when [:float] + Float.new + when [:double] + Float.new :longness => 1 + when [:long, :double] + Float.new :longness => 2 + when [:_Bool] + Bool.new + when [:float, :_Complex] + Complex.new + when [:double, :_Complex] + Complex.new :longness => 1 + when [:long, :double, :_Complex] + Complex.new :longness => 2 + when [:float, :_Imaginary] + Imaginary.new + when [:double, :_Imaginary] + Imaginary.new :longness => 1 + when [:long, :double, :_Imaginary] + Imaginary.new :longness => 2 + else + if type_specs.length == 1 && + [CustomType, Struct, Union, Enum].any?{|c| type_specs[0].is_a? c} + type_specs[0] + else + if type_specs == [] + parse_error pos, "no type specifiers given" + else + parse_error pos, "invalid type specifier combination: #{type_specs.join(' ')}" + end + end + end + type.pos ||= pos + + # set type qualifiers + # 6.7.3p4: type qualifiers can be repeated + type.const = specs.any?{|x| x.equal? :const } + type.restrict = specs.any?{|x| x.equal? :restrict} + type.volatile = specs.any?{|x| x.equal? :volatile} + + return type + end + + def make_parameter(pos, specs, indirect_type, name) + type = indirect_type + if type + type.direct_type = make_direct_type(pos, specs) + else + type = make_direct_type(pos, specs) + end + [:typedef, :extern, :static, :auto, :inline].each do |sym| + specs.include? sym and + parse_error pos, "parameter `#{declarator.name}' declared `#{sym}'" + end + return Parameter.new_at(pos, type, name, + :register => specs.include?(:register)) + end + + def add_type_quals(type, quals) + type.const = quals.include?(:const ) + type.restrict = quals.include?(:restrict) + type.volatile = quals.include?(:volatile) + return type + end + + # + # Add te given type as the "most direct" type to the given + # declarator. Return the declarator. + # + def add_decl_type(declarator, type) + if declarator.indirect_type + declarator.indirect_type.direct_type = type + else + declarator.indirect_type = type + end + return declarator + end + + def param_list(params, var_args) + if params.length == 1 && + params[0].type.is_a?(Void) && + params[0].name.nil? + return NodeArray[] + elsif params.empty? + return nil + else + return params + end + end + + def parse_error(pos, str) + raise ParseError, "#{pos}: #{str}" + end + +---- header + +require 'set' + +# Error classes +module C + class ParseError < StandardError; end +end + +# Local variables: +# mode: ruby +# end: diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/chk.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/chk.y new file mode 100644 index 000000000000..7e0ee20f1e83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/chk.y @@ -0,0 +1,126 @@ +# +# racc tester +# + +class Calcp + + prechigh + left '*' '/' + left '+' '-' + preclow + + convert + NUMBER 'Number' + end + +rule + + target : exp | /* none */ { result = 0 } ; + + exp : exp '+' exp { result += val[2]; @plus = 'plus' } + | exp '-' exp { result -= val[2]; @str = "string test" } + | exp '*' exp { result *= val[2] } + | exp '/' exp { result /= val[2] } + | '(' { $emb = true } exp ')' + { + raise 'must not happen' unless $emb + result = val[2] + } + | '-' NUMBER { result = -val[1] } + | NUMBER + ; + +end + +----header + +class Number; end + +----inner + + def parse( src ) + $emb = false + @plus = nil + @str = nil + @src = src + result = do_parse + if @plus + raise 'string parse failed' unless @plus == 'plus' + end + if @str + raise 'string parse failed' unless @str == 'string test' + end + result + end + + def next_token + @src.shift + end + + def initialize + @yydebug = true + end + +----footer + +$parser = Calcp.new +$test_number = 1 + +def chk( src, ans ) + result = $parser.parse(src) + raise "test #{$test_number} fail" unless result == ans + $test_number += 1 +end + +chk( + [ [Number, 9], + [false, false], + [false, false] ], 9 +) + +chk( + [ [Number, 5], + ['*', nil], + [Number, 1], + ['-', nil], + [Number, 1], + ['*', nil], + [Number, 8], + [false, false], + [false, false] ], -3 +) + +chk( + [ [Number, 5], + ['+', nil], + [Number, 2], + ['-', nil], + [Number, 5], + ['+', nil], + [Number, 2], + ['-', nil], + [Number, 5], + [false, false], + [false, false] ], -1 +) + +chk( + [ ['-', nil], + [Number, 4], + [false, false], + [false, false] ], -4 +) + +chk( + [ [Number, 7], + ['*', nil], + ['(', nil], + [Number, 4], + ['+', nil], + [Number, 3], + [')', nil], + ['-', nil], + [Number, 9], + [false, false], + [false, false] ], 40 +) diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/conf.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/conf.y new file mode 100644 index 000000000000..de9de71d2806 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/conf.y @@ -0,0 +1,16 @@ + +class A +rule + +a: A c C expr; + +b: A B; # useless + +c: A; +c: A; + +expr: expr '+' expr +expr: expr '-' expr +expr: NUMBER + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/csspool.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/csspool.y new file mode 100644 index 000000000000..3d6af25d85f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/csspool.y @@ -0,0 +1,729 @@ +class CSSPool::CSS::Parser + +token CHARSET_SYM IMPORT_SYM STRING SEMI IDENT S COMMA LBRACE RBRACE STAR HASH +token LSQUARE RSQUARE EQUAL INCLUDES DASHMATCH LPAREN RPAREN FUNCTION GREATER PLUS +token SLASH NUMBER MINUS LENGTH PERCENTAGE ANGLE TIME FREQ URI +token IMPORTANT_SYM MEDIA_SYM NOT ONLY AND NTH_PSEUDO_CLASS +token DOCUMENT_QUERY_SYM FUNCTION_NO_QUOTE +token TILDE +token PREFIXMATCH SUFFIXMATCH SUBSTRINGMATCH +token NOT_PSEUDO_CLASS +token KEYFRAMES_SYM +token MATCHES_PSEUDO_CLASS +token NAMESPACE_SYM +token MOZ_PSEUDO_ELEMENT +token RESOLUTION +token COLON +token SUPPORTS_SYM +token OR +token VARIABLE_NAME +token CALC_SYM +token FONTFACE_SYM +token UNICODE_RANGE +token RATIO + +rule + document + : { @handler.start_document } + stylesheet + { @handler.end_document } + ; + stylesheet + : charset stylesheet + | import stylesheet + | namespace stylesheet + | charset + | import + | namespace + | body + | + ; + charset + : CHARSET_SYM STRING SEMI { @handler.charset interpret_string(val[1]), {} } + ; + import + : IMPORT_SYM import_location medium SEMI { + @handler.import_style val[2], val[1] + } + | IMPORT_SYM import_location SEMI { + @handler.import_style [], val[1] + } + ; + import_location + : import_location S + | STRING { result = Terms::String.new interpret_string val.first } + | URI { result = Terms::URI.new interpret_uri val.first } + ; + namespace + : NAMESPACE_SYM ident import_location SEMI { + @handler.namespace val[1], val[2] + } + | NAMESPACE_SYM import_location SEMI { + @handler.namespace nil, val[1] + } + ; + medium + : medium COMMA IDENT { + result = val[0] << MediaType.new(val[2]) + } + | IDENT { + result = [MediaType.new(val[0])] + } + ; + media_query_list + : media_query { result = MediaQueryList.new([ val[0] ]) } + | media_query_list COMMA media_query { result = val[0] << val[2] } + | { result = MediaQueryList.new } + ; + media_query + : optional_only_or_not media_type optional_and_exprs { result = MediaQuery.new(val[0], val[1], val[2]) } + | media_expr optional_and_exprs { result = MediaQuery.new(nil, val[0], val[1]) } + ; + optional_only_or_not + : ONLY { result = :only } + | NOT { result = :not } + | { result = nil } + ; + media_type + : IDENT { result = MediaType.new(val[0]) } + ; + media_expr + : LPAREN optional_space IDENT optional_space RPAREN { result = MediaType.new(val[2]) } + | LPAREN optional_space IDENT optional_space COLON optional_space expr RPAREN { result = MediaFeature.new(val[2], val[6][0]) } + ; + optional_space + : S { result = val[0] } + | { result = nil } + ; + optional_and_exprs + : optional_and_exprs AND media_expr { result = val[0] << val[2] } + | { result = [] } + ; + resolution + : RESOLUTION { + unit = val.first.gsub(/[\s\d.]/, '') + number = numeric(val.first) + result = Terms::Resolution.new(number, unit) + } + ; + body + : ruleset body + | conditional_rule body + | keyframes_rule body + | fontface_rule body + | ruleset + | conditional_rule + | keyframes_rule + | fontface_rule + ; + conditional_rule + : media + | document_query + | supports + ; + body_in_media + : body + | empty_ruleset + ; + media + : start_media body_in_media RBRACE { @handler.end_media val.first } + ; + start_media + : MEDIA_SYM media_query_list LBRACE { + result = val[1] + @handler.start_media result + } + ; + document_query + : start_document_query body RBRACE { @handler.end_document_query(before_pos(val), after_pos(val)) } + | start_document_query RBRACE { @handler.end_document_query(before_pos(val), after_pos(val)) } + ; + start_document_query + : start_document_query_pos url_match_fns LBRACE { + @handler.start_document_query(val[1], after_pos(val)) + } + ; + start_document_query_pos + : DOCUMENT_QUERY_SYM { + @handler.node_start_pos = before_pos(val) + } + ; + url_match_fns + : url_match_fn COMMA url_match_fns { + result = [val[0], val[2]].flatten + } + | url_match_fn { + result = val + } + ; + url_match_fn + : function_no_quote + | function + | uri + ; + supports + : start_supports body RBRACE { @handler.end_supports } + | start_supports RBRACE { @handler.end_supports } + ; + start_supports + : SUPPORTS_SYM supports_condition_root LBRACE { + @handler.start_supports val[1] + } + ; + supports_condition_root + : supports_negation { result = val.join('') } + | supports_conjunction_or_disjunction { result = val.join('') } + | supports_condition_in_parens { result = val.join('') } + ; + supports_condition + : supports_negation { result = val.join('') } + | supports_conjunction_or_disjunction { result = val.join('') } + | supports_condition_in_parens { result = val.join('') } + ; + supports_condition_in_parens + : LPAREN supports_condition RPAREN { result = val.join('') } + | supports_declaration_condition { result = val.join('') } + ; + supports_negation + : NOT supports_condition_in_parens { result = val.join('') } + ; + supports_conjunction_or_disjunction + : supports_conjunction + | supports_disjunction + ; + supports_conjunction + : supports_condition_in_parens AND supports_condition_in_parens { result = val.join('') } + | supports_conjunction_or_disjunction AND supports_condition_in_parens { result = val.join('') } + ; + supports_disjunction + : supports_condition_in_parens OR supports_condition_in_parens { result = val.join('') } + | supports_conjunction_or_disjunction OR supports_condition_in_parens { result = val.join('') } + ; + supports_declaration_condition + : LPAREN declaration_internal RPAREN { result = val.join('') } + | LPAREN S declaration_internal RPAREN { result = val.join('') } + ; + keyframes_rule + : start_keyframes_rule keyframes_blocks RBRACE + | start_keyframes_rule RBRACE + ; + start_keyframes_rule + : KEYFRAMES_SYM IDENT LBRACE { + @handler.start_keyframes_rule val[1] + } + ; + keyframes_blocks + : keyframes_block keyframes_blocks + | keyframes_block + ; + keyframes_block + : start_keyframes_block declarations RBRACE { @handler.end_keyframes_block } + | start_keyframes_block RBRACE { @handler.end_keyframes_block } + ; + start_keyframes_block + : keyframes_selectors LBRACE { + @handler.start_keyframes_block val[0] + } + ; + keyframes_selectors + | keyframes_selector COMMA keyframes_selectors { + result = val[0] + ', ' + val[2] + } + | keyframes_selector + ; + keyframes_selector + : IDENT + | PERCENTAGE { result = val[0].strip } + ; + fontface_rule + : start_fontface_rule declarations RBRACE { @handler.end_fontface_rule } + | start_fontface_rule RBRACE { @handler.end_fontface_rule } + ; + start_fontface_rule + : FONTFACE_SYM LBRACE { + @handler.start_fontface_rule + } + ; + ruleset + : start_selector declarations RBRACE { + @handler.end_selector val.first + } + | start_selector RBRACE { + @handler.end_selector val.first + } + ; + empty_ruleset + : optional_space { + start = @handler.start_selector([]) + @handler.end_selector(start) + } + ; + start_selector + : S start_selector { result = val.last } + | selectors LBRACE { + @handler.start_selector val.first + } + ; + selectors + : selector COMMA selectors + { + sel = Selector.new(val.first, {}) + result = [sel].concat(val[2]) + } + | selector + { + result = [Selector.new(val.first, {})] + } + ; + selector + : simple_selector combinator selector + { + val.flatten! + val[2].combinator = val.delete_at 1 + result = val + } + | simple_selector + ; + combinator + : S { result = :s } + | GREATER { result = :> } + | PLUS { result = :+ } + | TILDE { result = :~ } + ; + simple_selector + : element_name hcap { + selector = val.first + selector.additional_selectors = val.last + result = [selector] + } + | element_name { result = val } + | hcap + { + ss = Selectors::Simple.new nil, nil + ss.additional_selectors = val.flatten + result = [ss] + } + ; + simple_selectors + : simple_selector COMMA simple_selectors { result = [val[0], val[2]].flatten } + | simple_selector + ; + ident_with_namespace + : IDENT { result = [interpret_identifier(val[0]), nil] } + | IDENT '|' IDENT { result = [interpret_identifier(val[2]), interpret_identifier(val[0])] } + | '|' IDENT { result = [interpret_identifier(val[1]), nil] } + | STAR '|' IDENT { result = [interpret_identifier(val[2]), '*'] } + ; + element_name + : ident_with_namespace { result = Selectors::Type.new val.first[0], nil, val.first[1] } + | STAR { result = Selectors::Universal.new val.first } + | '|' STAR { result = Selectors::Universal.new val[1] } + | STAR '|' STAR { result = Selectors::Universal.new val[2], nil, val[0] } + | IDENT '|' STAR { result = Selectors::Universal.new val[2], nil, interpret_identifier(val[0]) } + ; + hcap + : hash { result = val } + | class { result = val } + | attrib { result = val } + | pseudo { result = val } + | hash hcap { result = val.flatten } + | class hcap { result = val.flatten } + | attrib hcap { result = val.flatten } + | pseudo hcap { result = val.flatten } + ; + hash + : HASH { + result = Selectors::Id.new interpret_identifier val.first.sub(/^#/, '') + } + class + : '.' IDENT { + result = Selectors::Class.new interpret_identifier val.last + } + ; + attrib + : LSQUARE ident_with_namespace EQUAL IDENT RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::EQUALS, + val[1][1] + ) + } + | LSQUARE ident_with_namespace EQUAL STRING RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::EQUALS, + val[1][1] + ) + } + | LSQUARE ident_with_namespace INCLUDES STRING RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::INCLUDES, + val[1][1] + ) + } + | LSQUARE ident_with_namespace INCLUDES IDENT RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::INCLUDES, + val[1][1] + ) + } + | LSQUARE ident_with_namespace DASHMATCH IDENT RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::DASHMATCH, + val[1][1] + ) + } + | LSQUARE ident_with_namespace DASHMATCH STRING RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::DASHMATCH, + val[1][1] + ) + } + | LSQUARE ident_with_namespace PREFIXMATCH IDENT RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::PREFIXMATCH, + val[1][1] + ) + } + | LSQUARE ident_with_namespace PREFIXMATCH STRING RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::PREFIXMATCH, + val[1][1] + ) + } + | LSQUARE ident_with_namespace SUFFIXMATCH IDENT RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::SUFFIXMATCH, + val[1][1] + ) + } + | LSQUARE ident_with_namespace SUFFIXMATCH STRING RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::SUFFIXMATCH, + val[1][1] + ) + } + | LSQUARE ident_with_namespace SUBSTRINGMATCH IDENT RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::SUBSTRINGMATCH, + val[1][1] + ) + } + | LSQUARE ident_with_namespace SUBSTRINGMATCH STRING RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::SUBSTRINGMATCH, + val[1][1] + ) + } + | LSQUARE ident_with_namespace RSQUARE { + result = Selectors::Attribute.new( + val[1][0], + nil, + Selectors::Attribute::SET, + val[1][1] + ) + } + ; + pseudo + : COLON IDENT { + result = Selectors::pseudo interpret_identifier(val[1]) + } + | COLON COLON IDENT { + result = Selectors::PseudoElement.new( + interpret_identifier(val[2]) + ) + } + | COLON FUNCTION RPAREN { + result = Selectors::PseudoClass.new( + interpret_identifier(val[1].sub(/\($/, '')), + '' + ) + } + | COLON FUNCTION IDENT RPAREN { + result = Selectors::PseudoClass.new( + interpret_identifier(val[1].sub(/\($/, '')), + interpret_identifier(val[2]) + ) + } + | COLON NOT_PSEUDO_CLASS simple_selector RPAREN { + result = Selectors::PseudoClass.new( + 'not', + val[2].first.to_s + ) + } + | COLON NTH_PSEUDO_CLASS { + result = Selectors::PseudoClass.new( + interpret_identifier(val[1].sub(/\(.*/, '')), + interpret_identifier(val[1].sub(/.*\(/, '').sub(/\).*/, '')) + ) + } + | COLON MATCHES_PSEUDO_CLASS simple_selectors RPAREN { + result = Selectors::PseudoClass.new( + val[1].split('(').first.strip, + val[2].join(', ') + ) + } + | COLON MOZ_PSEUDO_ELEMENT optional_space any_number_of_idents optional_space RPAREN { + result = Selectors::PseudoElement.new( + interpret_identifier(val[1].sub(/\($/, '')) + ) + } + | COLON COLON MOZ_PSEUDO_ELEMENT optional_space any_number_of_idents optional_space RPAREN { + result = Selectors::PseudoElement.new( + interpret_identifier(val[2].sub(/\($/, '')) + ) + } + ; + any_number_of_idents + : + | multiple_idents + ; + multiple_idents + : IDENT + | IDENT COMMA multiple_idents + ; + # declarations can be separated by one *or more* semicolons. semi-colons at the start or end of a ruleset are also allowed + one_or_more_semis + : SEMI + | SEMI one_or_more_semis + ; + declarations + : declaration one_or_more_semis declarations + | one_or_more_semis declarations + | declaration one_or_more_semis + | declaration + | one_or_more_semis + ; + declaration + : declaration_internal { @handler.property val.first } + ; + declaration_internal + : property COLON expr prio + { result = Declaration.new(val.first, val[2], val[3]) } + | property COLON S expr prio + { result = Declaration.new(val.first, val[3], val[4]) } + | property S COLON expr prio + { result = Declaration.new(val.first, val[3], val[4]) } + | property S COLON S expr prio + { result = Declaration.new(val.first, val[4], val[5]) } + ; + prio + : IMPORTANT_SYM { result = true } + | { result = false } + ; + property + : IDENT { result = interpret_identifier val[0] } + | STAR IDENT { result = interpret_identifier val.join } + | VARIABLE_NAME { result = interpret_identifier val[0] } + ; + operator + : COMMA + | SLASH + | EQUAL + ; + expr + : term operator expr { + result = [val.first, val.last].flatten + val.last.first.operator = val[1] + } + | term expr { result = val.flatten } + | term { result = val } + ; + term + : ident + | ratio + | numeric + | string + | uri + | hexcolor + | calc + | function + | resolution + | VARIABLE_NAME + | uranges + ; + function + : function S { result = val.first } + | FUNCTION expr RPAREN { + name = interpret_identifier val.first.sub(/\($/, '') + if name == 'rgb' + result = Terms::Rgb.new(*val[1]) + else + result = Terms::Function.new name, val[1] + end + } + | FUNCTION RPAREN { + name = interpret_identifier val.first.sub(/\($/, '') + result = Terms::Function.new name + } + ; + function_no_quote + : function_no_quote S { result = val.first } + | FUNCTION_NO_QUOTE { + parts = val.first.split('(') + name = interpret_identifier parts.first + result = Terms::Function.new(name, [Terms::String.new(interpret_string_no_quote(parts.last))]) + } + ; + uranges + : UNICODE_RANGE COMMA uranges + | UNICODE_RANGE + ; + calc + : CALC_SYM calc_sum RPAREN optional_space { + result = Terms::Math.new(val.first.split('(').first, val[1]) + } + ; + # plus and minus are supposed to have whitespace around them, per http://dev.w3.org/csswg/css-values/#calc-syntax, but the numbers are eating trailing whitespace, so we inject it back in + calc_sum + : calc_product + | calc_product PLUS calc_sum { val.insert(1, ' '); result = val.join('') } + | calc_product MINUS calc_sum { val.insert(1, ' '); result = val.join('') } + ; + calc_product + : calc_value + | calc_value optional_space STAR calc_value { result = val.join('') } + | calc_value optional_space SLASH calc_value { result = val.join('') } + ; + calc_value + : numeric { result = val.join('') } + | function { result = val.join('') } # for var() variable references + | LPAREN calc_sum RPAREN { result = val.join('') } + ; + hexcolor + : hexcolor S { result = val.first } + | HASH { result = Terms::Hash.new val.first.sub(/^#/, '') } + ; + uri + : uri S { result = val.first } + | URI { result = Terms::URI.new interpret_uri val.first } + ; + string + : string S { result = val.first } + | STRING { result = Terms::String.new interpret_string val.first } + ; + numeric + : unary_operator numeric { + result = val[1] + val[1].unary_operator = val.first + } + | NUMBER { + result = Terms::Number.new numeric val.first + } + | PERCENTAGE { + result = Terms::Number.new numeric(val.first), nil, '%' + } + | LENGTH { + unit = val.first.gsub(/[\s\d.]/, '') + result = Terms::Number.new numeric(val.first), nil, unit + } + | ANGLE { + unit = val.first.gsub(/[\s\d.]/, '') + result = Terms::Number.new numeric(val.first), nil, unit + } + | TIME { + unit = val.first.gsub(/[\s\d.]/, '') + result = Terms::Number.new numeric(val.first), nil, unit + } + | FREQ { + unit = val.first.gsub(/[\s\d.]/, '') + result = Terms::Number.new numeric(val.first), nil, unit + } + ; + ratio + : RATIO { + result = Terms::Ratio.new(val[0], val[1]) + } + ; + unary_operator + : MINUS { result = :minus } + | PLUS { result = :plus } + ; + ident + : ident S { result = val.first } + | IDENT { result = Terms::Ident.new interpret_identifier val.first } + ; + +---- inner + +def numeric thing + thing = thing.gsub(/[^\d.]/, '') + Integer(thing) rescue Float(thing) +end + +def interpret_identifier s + interpret_escapes s +end + +def interpret_uri s + interpret_escapes s.match(/^url\((.*)\)$/mui)[1].strip.match(/^(['"]?)((?:\\.|.)*)\1$/mu)[2] +end + +def interpret_string_no_quote s + interpret_escapes s.match(/^(.*)\)$/mu)[1].strip.match(/^(['"]?)((?:\\.|.)*)\1$/mu)[2] +end + +def interpret_string s + interpret_escapes s.match(/^(['"])((?:\\.|.)*)\1$/mu)[2] +end + +def interpret_escapes s + token_exp = /\\(?:([0-9a-fA-F]{1,6}(?:\r\n|\s)?)|(.))/mu + return s.gsub(token_exp) do |escape_sequence| + if !$1.nil? + code = $1.chomp.to_i 16 + code = 0xFFFD if code > 0x10FFFF + next [code].pack('U') + end + next '' if $2 == "\n" + next $2 + end +end + +# override racc's on_error so we can have context in our error messages +def on_error(t, val, vstack) + errcontext = (@ss.pre_match[-10..-1] || @ss.pre_match) + + @ss.matched + @ss.post_match[0..9] + line_number = @ss.pre_match.lines.count + raise ParseError, sprintf("parse error on value %s (%s) " + + "on line %s around \"%s\"", + val.inspect, token_to_str(t) || '?', + line_number, errcontext) +end + +def before_pos(val) + # don't include leading whitespace + return current_pos - val.last.length + val.last[/\A\s*/].size +end + +def after_pos(val) + # don't include trailing whitespace + return current_pos - val.last[/\s*\z/].size +end + +# charpos will work with multibyte strings but is not available until ruby 2 +def current_pos + @ss.respond_to?('charpos') ? @ss.charpos : @ss.pos +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/digraph.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/digraph.y new file mode 100644 index 000000000000..17a034ee54d0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/digraph.y @@ -0,0 +1,29 @@ +# ? detect digraph bug + +class P + token A B C D +rule + target : a b c d + a : A + | + b : B + | + c : C + | + d : D + | +end + +---- inner + + def parse + do_parse + end + + def next_token + [false, '$'] + end + +---- footer + +P.new.parse diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/echk.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/echk.y new file mode 100644 index 000000000000..0fda2685aa59 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/echk.y @@ -0,0 +1,118 @@ +# +# racc tester +# + +class Calcp + + prechigh + left '*' '/' + left '+' '-' + preclow + + convert + NUMBER 'Number' + end + +rule + + target : exp | /* none */ { result = 0 } ; + + exp : exp '+' exp { result += val[2]; a = 'plus' } + | exp '-' exp { result -= val[2]; "string test" } + | exp '*' exp { result *= val[2] } + | exp '/' exp { result /= val[2] } + | '(' { $emb = true } exp ')' + { + raise 'must not happen' unless $emb + result = val[2] + } + | '-' NUMBER { result = -val[1] } + | NUMBER + ; + +end + +----header + +class Number ; end + +----inner + + def parse( src ) + @src = src + do_parse + end + + def next_token + @src.shift + end + + def initialize + @yydebug = true + end + +----footer + +$parser = Calcp.new +$tidx = 1 + +def chk( src, ans ) + ret = $parser.parse( src ) + unless ret == ans then + bug! "test #{$tidx} fail" + end + $tidx += 1 +end + +chk( + [ [Number, 9], + [false, false], + [false, false] ], 9 +) + +chk( + [ [Number, 5], + ['*', nil], + [Number, 1], + ['-', nil], + [Number, 1], + ['*', nil], + [Number, 8], + [false, false], + [false, false] ], -3 +) + +chk( + [ [Number, 5], + ['+', nil], + [Number, 2], + ['-', nil], + [Number, 5], + ['+', nil], + [Number, 2], + ['-', nil], + [Number, 5], + [false, false], + [false, false] ], -1 +) + +chk( + [ ['-', nil], + [Number, 4], + [false, false], + [false, false] ], -4 +) + +chk( + [ [Number, 7], + ['*', nil], + ['(', nil], + [Number, 4], + ['+', nil], + [Number, 3], + [')', nil], + ['-', nil], + [Number, 9], + [false, false], + [false, false] ], 40 +) diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/edtf.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/edtf.y new file mode 100644 index 000000000000..4f5f6bb4fdd3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/edtf.y @@ -0,0 +1,583 @@ +# -*- racc -*- + +# Copyright 2011 Sylvester Keil. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are +# those of the authors and should not be interpreted as representing official +# policies, either expressed or implied, of the copyright holder. + +class EDTF::Parser + +token T Z E X U UNKNOWN OPEN LONGYEAR UNMATCHED DOTS UA PUA + +expect 0 + +rule + + edtf : level_0_expression + | level_1_expression + | level_2_expression + ; + + # ---- Level 0 / ISO 8601 Rules ---- + + # NB: level 0 intervals are covered by the level 1 interval rules + level_0_expression : date + | date_time + ; + + date : positive_date + | negative_date + ; + + positive_date : + year { result = Date.new(val[0]).year_precision! } + | year_month { result = Date.new(*val.flatten).month_precision! } + | year_month_day { result = Date.new(*val.flatten).day_precision! } + ; + + negative_date : '-' positive_date { result = -val[1] } + + + date_time : date T time { + result = DateTime.new(val[0].year, val[0].month, val[0].day, *val[2]) + result.skip_timezone = (val[2].length == 3) + } + + time : base_time + | base_time zone_offset { result = val.flatten } + + base_time : hour ':' minute ':' second { result = val.values_at(0, 2, 4) } + | midnight + + midnight : '2' '4' ':' '0' '0' ':' '0' '0' { result = [24, 0, 0] } + + zone_offset : Z { result = 0 } + | '-' zone_offset_hour { result = -1 * val[1] } + | '+' positive_zone_offset { result = val[1] } + ; + + positive_zone_offset : zone_offset_hour + | '0' '0' ':' '0' '0' { result = 0 } + ; + + + zone_offset_hour : d01_13 ':' minute { result = Rational(val[0] * 60 + val[2], 1440) } + | '1' '4' ':' '0' '0' { result = Rational(840, 1440) } + | '0' '0' ':' d01_59 { result = Rational(val[3], 1440) } + ; + + year : digit digit digit digit { + result = val.zip([1000,100,10,1]).reduce(0) { |s,(a,b)| s += a * b } + } + + month : d01_12 + day : d01_31 + + year_month : year '-' month { result = [val[0], val[2]] } + + # We raise an exception if there are two many days for the month, but + # do not consider leap years, as the EDTF BNF did not either. + # NB: an exception will be raised regardless, because the Ruby Date + # implementation calculates leap years. + year_month_day : year_month '-' day { + result = val[0] << val[2] + if result[2] > 31 || (result[2] > 30 && [2,4,6,9,11].include?(result[1])) || (result[2] > 29 && result[1] == 2) + raise ArgumentError, "invalid date (invalid days #{result[2]} for month #{result[1]})" + end + } + + hour : d00_23 + minute : d00_59 + second : d00_59 + + # Completely covered by level_1_interval + # level_0_interval : date '/' date { result = Interval.new(val[0], val[1]) } + + + # ---- Level 1 Extension Rules ---- + + # NB: Uncertain/approximate Dates are covered by the Level 2 rules + level_1_expression : unspecified | level_1_interval | long_year_simple | season + + # uncertain_or_approximate_date : date UA { result = uoa(val[0], val[1]) } + + unspecified : unspecified_year + { + result = Date.new(val[0][0]).year_precision! + result.unspecified.year[2,2] = val[0][1] + } + | unspecified_month + | unspecified_day + | unspecified_day_and_month + ; + + unspecified_year : + digit digit digit U + { + result = [val[0,3].zip([1000,100,10]).reduce(0) { |s,(a,b)| s += a * b }, [false,true]] + } + | digit digit U U + { + result = [val[0,2].zip([1000,100]).reduce(0) { |s,(a,b)| s += a * b }, [true, true]] + } + + unspecified_month : year '-' U U { + result = Date.new(val[0]).unspecified!(:month) + result.precision = :month + } + + unspecified_day : year_month '-' U U { + result = Date.new(*val[0]).unspecified!(:day) + } + + unspecified_day_and_month : year '-' U U '-' U U { + result = Date.new(val[0]).unspecified!([:day,:month]) + } + + + level_1_interval : level_1_start '/' level_1_end { + result = Interval.new(val[0], val[2]) + } + + level_1_start : date | partial_uncertain_or_approximate | unspecified | partial_unspecified | UNKNOWN + + level_1_end : level_1_start | OPEN + + + long_year_simple : + LONGYEAR long_year + { + result = Date.new(val[1]) + result.precision = :year + } + | LONGYEAR '-' long_year + { + result = Date.new(-1 * val[2]) + result.precision = :year + } + ; + + long_year : + positive_digit digit digit digit digit { + result = val.zip([10000,1000,100,10,1]).reduce(0) { |s,(a,b)| s += a * b } + } + | long_year digit { result = 10 * val[0] + val[1] } + ; + + + season : year '-' season_number ua { + result = Season.new(val[0], val[2]) + val[3].each { |ua| result.send(ua) } + } + + season_number : '2' '1' { result = 21 } + | '2' '2' { result = 22 } + | '2' '3' { result = 23 } + | '2' '4' { result = 24 } + ; + + + # ---- Level 2 Extension Rules ---- + + # NB: Level 2 Intervals are covered by the Level 1 Interval rules. + level_2_expression : season_qualified + | partial_uncertain_or_approximate + | partial_unspecified + | choice_list + | inclusive_list + | masked_precision + | date_and_calendar + | long_year_scientific + ; + + + season_qualified : season '^' { result = val[0]; result.qualifier = val[1] } + + + long_year_scientific : + long_year_simple E integer + { + result = Date.new(val[0].year * 10 ** val[2]).year_precision! + } + | LONGYEAR int1_4 E integer + { + result = Date.new(val[1] * 10 ** val[3]).year_precision! + } + | LONGYEAR '-' int1_4 E integer + { + result = Date.new(-1 * val[2] * 10 ** val[4]).year_precision! + } + ; + + + date_and_calendar : date '^' { result = val[0]; result.calendar = val[1] } + + + masked_precision : + digit digit digit X + { + d = val[0,3].zip([1000,100,10]).reduce(0) { |s,(a,b)| s += a * b } + result = EDTF::Decade.new(d) + } + | digit digit X X + { + d = val[0,2].zip([1000,100]).reduce(0) { |s,(a,b)| s += a * b } + result = EDTF::Century.new(d) + } + ; + + + choice_list : '[' list ']' { result = val[1].choice! } + + inclusive_list : '{' list '}' { result = val[1] } + + list : earlier { result = EDTF::Set.new(val[0]).earlier! } + | earlier ',' list_elements ',' later { result = EDTF::Set.new([val[0]] + val[2] + [val[4]]).earlier!.later! } + | earlier ',' list_elements { result = EDTF::Set.new([val[0]] + val[2]).earlier! } + | earlier ',' later { result = EDTF::Set.new([val[0]] + [val[2]]).earlier!.later! } + | list_elements ',' later { result = EDTF::Set.new(val[0] + [val[2]]).later! } + | list_elements { result = EDTF::Set.new(*val[0]) } + | later { result = EDTF::Set.new(val[0]).later! } + ; + + list_elements : list_element { result = [val[0]].flatten } + | list_elements ',' list_element { result = val[0] + [val[2]].flatten } + ; + + list_element : atomic + | consecutives + ; + + atomic : date + | partial_uncertain_or_approximate + | unspecified + ; + + earlier : DOTS date { result = val[1] } + + later : year_month_day DOTS { result = Date.new(*val[0]).year_precision! } + | year_month DOTS { result = Date.new(*val[0]).month_precision! } + | year DOTS { result = Date.new(val[0]).year_precision! } + ; + + consecutives : year_month_day DOTS year_month_day { result = (Date.new(val[0]).day_precision! .. Date.new(val[2]).day_precision!) } + | year_month DOTS year_month { result = (Date.new(val[0]).month_precision! .. Date.new(val[2]).month_precision!) } + | year DOTS year { result = (Date.new(val[0]).year_precision! .. Date.new(val[2]).year_precision!) } + ; + + partial_unspecified : + unspecified_year '-' month '-' day + { + result = Date.new(val[0][0], val[2], val[4]) + result.unspecified.year[2,2] = val[0][1] + } + | unspecified_year '-' U U '-' day + { + result = Date.new(val[0][0], 1, val[5]) + result.unspecified.year[2,2] = val[0][1] + result.unspecified!(:month) + } + | unspecified_year '-' U U '-' U U + { + result = Date.new(val[0][0], 1, 1) + result.unspecified.year[2,2] = val[0][1] + result.unspecified!([:month, :day]) + } + | unspecified_year '-' month '-' U U + { + result = Date.new(val[0][0], val[2], 1) + result.unspecified.year[2,2] = val[0][1] + result.unspecified!(:day) + } + | year '-' U U '-' day + { + result = Date.new(val[0], 1, val[5]) + result.unspecified!(:month) + } + ; + + + partial_uncertain_or_approximate : pua_base + | '(' pua_base ')' UA { result = uoa(val[1], val[3]) } + + pua_base : + pua_year { result = val[0].year_precision! } + | pua_year_month { result = val[0][0].month_precision! } + | pua_year_month_day { result = val[0].day_precision! } + + pua_year : year UA { result = uoa(Date.new(val[0]), val[1], :year) } + + pua_year_month : + pua_year '-' month ua { + result = [uoa(val[0].change(:month => val[2]), val[3], [:month, :year])] + } + | year '-' month UA { + result = [uoa(Date.new(val[0], val[2]), val[3], [:year, :month])] + } + | year '-(' month ')' UA { + result = [uoa(Date.new(val[0], val[2]), val[4], [:month]), true] + } + | pua_year '-(' month ')' UA { + result = [uoa(val[0].change(:month => val[2]), val[4], [:month]), true] + } + ; + + pua_year_month_day : + pua_year_month '-' day ua { + result = uoa(val[0][0].change(:day => val[2]), val[3], val[0][1] ? [:day] : nil) + } + | pua_year_month '-(' day ')' UA { + result = uoa(val[0][0].change(:day => val[2]), val[4], [:day]) + } + | year '-(' month ')' UA day ua { + result = uoa(uoa(Date.new(val[0], val[2], val[5]), val[4], :month), val[6], :day) + } + | year_month '-' day UA { + result = uoa(Date.new(val[0][0], val[0][1], val[2]), val[3]) + } + | year_month '-(' day ')' UA { + result = uoa(Date.new(val[0][0], val[0][1], val[2]), val[4], [:day]) + } + | year '-(' month '-' day ')' UA { + result = uoa(Date.new(val[0], val[2], val[4]), val[6], [:month, :day]) + } + | year '-(' month '-(' day ')' UA ')' UA { + result = Date.new(val[0], val[2], val[4]) + result = uoa(result, val[6], [:day]) + result = uoa(result, val[8], [:month, :day]) + } + | pua_year '-(' month '-' day ')' UA { + result = val[0].change(:month => val[2], :day => val[4]) + result = uoa(result, val[6], [:month, :day]) + } + | pua_year '-(' month '-(' day ')' UA ')' UA { + result = val[0].change(:month => val[2], :day => val[4]) + result = uoa(result, val[6], [:day]) + result = uoa(result, val[8], [:month, :day]) + } + # | '(' pua_year '-(' month ')' UA ')' UA '-' day ua { + # result = val[1].change(:month => val[3], :day => val[9]) + # result = uoa(result, val[5], [:month]) + # result = [uoa(result, val[7], [:year]), true] + # } + ; + + ua : { result = [] } | UA + + # ---- Auxiliary Rules ---- + + digit : '0' { result = 0 } + | positive_digit + ; + + positive_digit : '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' + + d01_12 : '0' positive_digit { result = val[1] } + | '1' '0' { result = 10 } + | '1' '1' { result = 11 } + | '1' '2' { result = 12 } + ; + + d01_13 : d01_12 + | '1' '3' { result = 13 } + ; + + d01_23 : '0' positive_digit { result = val[1] } + | '1' digit { result = 10 + val[1] } + | '2' '0' { result = 20 } + | '2' '1' { result = 21 } + | '2' '2' { result = 22 } + | '2' '3' { result = 23 } + ; + + d00_23 : '0' '0' + | d01_23 + ; + + d01_29 : d01_23 + | '2' '4' { result = 24 } + | '2' '5' { result = 25 } + | '2' '6' { result = 26 } + | '2' '7' { result = 27 } + | '2' '8' { result = 28 } + | '2' '9' { result = 29 } + ; + + d01_30 : d01_29 + | '3' '0' { result = 30 } + ; + + d01_31 : d01_30 + | '3' '1' { result = 31 } + ; + + d01_59 : d01_29 + | '3' digit { result = 30 + val[1] } + | '4' digit { result = 40 + val[1] } + | '5' digit { result = 50 + val[1] } + ; + + d00_59 : '0' '0' + | d01_59 + ; + + int1_4 : positive_digit { result = val[0] } + | positive_digit digit { result = 10 * val[0] + val[1] } + | positive_digit digit digit + { + result = val.zip([100,10,1]).reduce(0) { |s,(a,b)| s += a * b } + } + | positive_digit digit digit digit + { + result = val.zip([1000,100,10,1]).reduce(0) { |s,(a,b)| s += a * b } + } + ; + + integer : positive_digit { result = val[0] } + | integer digit { result = 10 * val[0] + val[1] } + ; + + + +---- header +require 'strscan' + +---- inner + + @defaults = { + :level => 2, + :debug => false + }.freeze + + class << self; attr_reader :defaults; end + + attr_reader :options + + def initialize(options = {}) + @options = Parser.defaults.merge(options) + end + + def debug? + !!(options[:debug] || ENV['DEBUG']) + end + + def parse(input) + parse!(input) + rescue => e + warn e.message if debug? + nil + end + + def parse!(input) + @yydebug = debug? + @src = StringScanner.new(input) + do_parse + end + + def on_error(tid, value, stack) + raise ArgumentError, + "failed to parse date: unexpected '#{value}' at #{stack.inspect}" + end + + def apply_uncertainty(date, uncertainty, scope = nil) + uncertainty.each do |u| + scope.nil? ? date.send(u) : date.send(u, scope) + end + date + end + + alias uoa apply_uncertainty + + def next_token + case + when @src.eos? + nil + # when @src.scan(/\s+/) + # ignore whitespace + when @src.scan(/\(/) + ['(', @src.matched] + # when @src.scan(/\)\?~-/) + # [:PUA, [:uncertain!, :approximate!]] + # when @src.scan(/\)\?-/) + # [:PUA, [:uncertain!]] + # when @src.scan(/\)~-/) + # [:PUA, [:approximate!]] + when @src.scan(/\)/) + [')', @src.matched] + when @src.scan(/\[/) + ['[', @src.matched] + when @src.scan(/\]/) + [']', @src.matched] + when @src.scan(/\{/) + ['{', @src.matched] + when @src.scan(/\}/) + ['}', @src.matched] + when @src.scan(/T/) + [:T, @src.matched] + when @src.scan(/Z/) + [:Z, @src.matched] + when @src.scan(/\?~/) + [:UA, [:uncertain!, :approximate!]] + when @src.scan(/\?/) + [:UA, [:uncertain!]] + when @src.scan(/~/) + [:UA, [:approximate!]] + when @src.scan(/open/i) + [:OPEN, :open] + when @src.scan(/unkn?own/i) # matches 'unkown' typo too + [:UNKNOWN, :unknown] + when @src.scan(/u/) + [:U, @src.matched] + when @src.scan(/x/i) + [:X, @src.matched] + when @src.scan(/y/) + [:LONGYEAR, @src.matched] + when @src.scan(/e/) + [:E, @src.matched] + when @src.scan(/\+/) + ['+', @src.matched] + when @src.scan(/-\(/) + ['-(', @src.matched] + when @src.scan(/-/) + ['-', @src.matched] + when @src.scan(/:/) + [':', @src.matched] + when @src.scan(/\//) + ['/', @src.matched] + when @src.scan(/\s*\.\.\s*/) + [:DOTS, '..'] + when @src.scan(/\s*,\s*/) + [',', ','] + when @src.scan(/\^\w+/) + ['^', @src.matched[1..-1]] + when @src.scan(/\d/) + [@src.matched, @src.matched.to_i] + else @src.scan(/./) + [:UNMATCHED, @src.rest] + end + end + + +# -*- racc -*- diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/err.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/err.y new file mode 100644 index 000000000000..ae280957ccd6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/err.y @@ -0,0 +1,60 @@ + +class ErrTestp + +rule + +target: lines + ; + +lines: line + | lines line + ; + +line: A B C D E + | error E + ; + +end + +---- inner + +def initialize + @yydebug = false + @q = [ + [:A, 'a'], + # [:B, 'b'], + [:C, 'c'], + [:D, 'd'], + [:E, 'e'], + + [:A, 'a'], + [:B, 'b'], + [:C, 'c'], + [:D, 'd'], + [:E, 'e'], + + [:A, 'a'], + [:B, 'b'], + # [:C, 'c'], + [:D, 'd'], + [:E, 'e'], + [false, nil] + ] +end + +def next_token + @q.shift +end + +def on_error( t, val, values ) + $stderr.puts "error on token '#{val}'(#{t})" +end + +def parse + do_parse +end + +---- footer + +p = ErrTestp.new +p.parse diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/error_recovery.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/error_recovery.y new file mode 100644 index 000000000000..1fd21ac7d049 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/error_recovery.y @@ -0,0 +1,35 @@ +# Regression test case for the bug discussed here: +# https://github.com/whitequark/parser/issues/93 +# In short, a Racc-generated parser could go into an infinite loop when +# attempting error recovery at EOF + +class InfiniteLoop + +rule + + stmts: stmt + | error stmt + + stmt: '%' stmt + +end + +---- inner + + def parse + @errors = [] + do_parse + end + + def next_token + nil + end + + def on_error(error_token, error_value, value_stack) + # oh my, an error + @errors << [error_token, error_value] + end + +---- footer + +InfiniteLoop.new.parse \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/expect.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/expect.y new file mode 100644 index 000000000000..24c27443e207 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/expect.y @@ -0,0 +1,7 @@ +class E + expect 1 +rule + list: inlist inlist + inlist: + | A +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/firstline.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/firstline.y new file mode 100644 index 000000000000..ab0692e543fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/firstline.y @@ -0,0 +1,4 @@ +class T +rule + a: A B C +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/huia.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/huia.y new file mode 100644 index 000000000000..de9d45150c9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/huia.y @@ -0,0 +1,318 @@ +# Copyright (c) 2014 James Harton +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class Huia::Parser + + token + IDENTIFIER EQUAL PLUS MINUS ASTERISK FWD_SLASH COLON FLOAT INTEGER STRING + EXPO INDENT OUTDENT OPAREN CPAREN DOT SIGNATURE NL EOF PIPE COMMA NIL TRUE + FALSE EQUALITY CALL SELF CONSTANT CHAR DOUBLE_TICK_STRING + DOUBLE_TICK_STRING_END INTERPOLATE_START INTERPOLATE_END BOX LSQUARE + RSQUARE FACES LFACE RFACE BANG TILDE RETURN NOT_EQUALITY OR AND GT LT + GTE LTE AT + + prechigh + left EXPO + left BANG TILDE + left ASTERISK FWD_SLASH PERCENT + left PLUS MINUS + + right EQUAL + preclow + + rule + statements: statement + | statements statement { return scope } + + statement: expr eol { return scope.append val[0] } + | expr { return scope.append val[0] } + | eol { return scope } + + eol: NL | EOF + nlq: NL | + + expr: literal + | grouped_expr + | binary_op + | unary_op + | method_call + | constant + | variable + | array + | hash + | return + + return: return_expr + | return_nil + return_expr: RETURN expr { return n(:Return, val[1]) } + return_nil: RETURN { return n(:Return, n(:Nil)) } + + array: empty_array + | array_list + + empty_array: BOX { return n :Array } + + array_list: LSQUARE array_items RSQUARE { return val[1] } + array_items: expr { return n :Array, [val[0]] } + | array_items COMMA expr { val[0].append(val[2]); return val[0] } + + hash: empty_hash + | hash_list + empty_hash: FACES { return n :Hash } + hash_list: LFACE hash_items RFACE { return val[1] } + hash_items: hash_item { return n :Hash, val[0] } + | hash_items COMMA hash_item { val[0].append(val[2]); return val[0] } + hash_item: expr COLON expr { return n :HashItem, val[0], val[2] } + + constant: CONSTANT { return constant val[0] } + + indented: indented_w_stmts + | indented_w_expr + | indented_wo_stmts + indented_w_stmts: indent statements outdent { return val[0] } + indented_w_expr: indent expr outdent { return val[0].append(val[1]) } + indented_wo_stmts: indent outdent { return val[0] } + outdent: OUTDENT { return pop_scope } + + + indent_w_args: indent_pipe indent_args PIPE nlq INDENT { return val[0] } + indent_pipe: PIPE { return push_scope } + indent_wo_args: INDENT { return push_scope } + indent: indent_w_args + | indent_wo_args + + indent_args: indent_arg + | indent_args COMMA indent_arg + indent_arg: arg_var { return scope.add_argument val[0] } + | arg_var EQUAL expr { return n :Assignment, val[0], val[2] } + arg_var: IDENTIFIER { return n :Variable, val[0] } + + method_call: method_call_on_object + | method_call_on_self + | method_call_on_closure + method_call_on_object: expr DOT call_signature { return n :MethodCall, val[0], val[2] } + | expr DOT IDENTIFIER { return n :MethodCall, val[0], n(:CallSignature, val[2]) } + method_call_on_self: call_signature { return n :MethodCall, scope_instance, val[0] } + + method_call_on_closure: AT call_signature { return n :MethodCall, this_closure, val[1] } + | AT IDENTIFIER { return n :MethodCall, this_closure, n(:CallSignature, val[1]) } + + call_signature: call_arguments + | call_simple_name + call_simple_name: CALL { return n :CallSignature, val[0] } + call_argument: SIGNATURE call_passed_arg { return n :CallSignature, val[0], [val[1]] } + call_passed_arg: call_passed_simple + | call_passed_indented + call_passed_simple: expr + | expr NL + call_passed_indented: indented + | indented NL + call_arguments: call_argument { return val[0] } + | call_arguments call_argument { return val[0].concat_signature val[1] } + + grouped_expr: OPAREN expr CPAREN { return n :Expression, val[1] } + + variable: IDENTIFIER { return allocate_local val[0] } + + binary_op: assignment + | addition + | subtraction + | multiplication + | division + | exponentiation + | modulo + | equality + | not_equality + | logical_or + | logical_and + | greater_than + | less_than + | greater_or_eq + | less_or_eq + + assignment: IDENTIFIER EQUAL expr { return allocate_local_assignment val[0], val[2] } + addition: expr PLUS expr { return binary val[0], val[2], 'plus:' } + subtraction: expr MINUS expr { return binary val[0], val[2], 'minus:' } + multiplication: expr ASTERISK expr { return binary val[0], val[2], 'multiplyBy:' } + division: expr FWD_SLASH expr { return binary val[0], val[2], 'divideBy:' } + exponentiation: expr EXPO expr { return binary val[0], val[2], 'toThePowerOf:' } + modulo: expr PERCENT expr { return binary val[0], val[2], 'moduloOf:' } + equality: expr EQUALITY expr { return binary val[0], val[2], 'isEqualTo:' } + not_equality: expr NOT_EQUALITY expr { return binary val[0], val[2], 'isNotEqualTo:' } + logical_or: expr OR expr { return binary val[0], val[2], 'logicalOr:' } + logical_and: expr AND expr { return binary val[0], val[2], 'logicalAnd:' } + greater_than: expr GT expr { return binary val[0], val[2], 'isGreaterThan:' } + less_than: expr LT expr { return binary val[0], val[2], 'isLessThan:' } + greater_or_eq: expr GTE expr { return binary val[0], val[2], 'isGreaterOrEqualTo:' } + less_or_eq: expr LTE expr { return binary val[0], val[2], 'isLessOrEqualTo:' } + + unary_op: unary_not + | unary_plus + | unary_minus + | unary_complement + + unary_not: BANG expr { return unary val[1], 'unaryNot' } + unary_plus: PLUS expr { return unary val[1], 'unaryPlus' } + unary_minus: MINUS expr { return unary val[1], 'unaryMinus' } + unary_complement: TILDE expr { return unary val[1], 'unaryComplement' } + + literal: integer + | float + | string + | nil + | true + | false + | self + + float: FLOAT { return n :Float, val[0] } + integer: INTEGER { return n :Integer, val[0] } + nil: NIL { return n :Nil } + true: TRUE { return n :True } + false: FALSE { return n :False } + self: SELF { return n :Self } + + string: STRING { return n :String, val[0] } + | interpolated_string + | empty_string + + interpolated_string: DOUBLE_TICK_STRING interpolated_string_contents DOUBLE_TICK_STRING_END { return val[1] } + interpolation: INTERPOLATE_START expr INTERPOLATE_END { return val[1] } + interpolated_string_contents: interpolated_string_chunk { return n :InterpolatedString, val[0] } + | interpolated_string_contents interpolated_string_chunk { val[0].append(val[1]); return val[0] } + interpolated_string_chunk: chars { return val[0] } + | interpolation { return to_string(val[0]) } + empty_string: DOUBLE_TICK_STRING DOUBLE_TICK_STRING_END { return n :String, '' } + + chars: CHAR { return n :String, val[0] } + | chars CHAR { val[0].append(val[1]); return val[0] } +end + +---- inner + +attr_accessor :lexer, :scopes, :state + +def initialize lexer + @lexer = lexer + @state = [] + @scopes = [] + push_scope +end + +def ast + @ast ||= do_parse + @scopes.first +end + +def on_error t, val, vstack + line = lexer.line + col = lexer.column + message = "Unexpected #{token_to_str t} at #{lexer.filename} line #{line}:#{col}:\n\n" + + start = line - 5 > 0 ? line - 5 : 0 + i_size = line.to_s.size + (start..(start + 5)).each do |i| + message << sprintf("\t%#{i_size}d: %s\n", i, lexer.get_line(i)) + message << "\t#{' ' * i_size} #{'-' * (col - 1)}^\n" if i == line + end + + raise SyntaxError, message +end + +def next_token + nt = lexer.next_computed_token + # just use a state stack for now, we'll have to do something + # more sophisticated soon. + if nt && nt.first == :state + if nt.last + state.push << nt.last + else + state.pop + end + next_token + else + nt + end +end + +def push_scope + new_scope = Huia::AST::Scope.new scope + new_scope.file = lexer.filename + new_scope.line = lexer.line + new_scope.column = lexer.column + scopes.push new_scope + new_scope +end + +def pop_scope + scopes.pop +end + +def scope + scopes.last +end + +def binary left, right, method + node(:MethodCall, left, node(:CallSignature, method, [right])) +end + +def unary left, method + node(:MethodCall, left, node(:CallSignature, method)) +end + +def node type, *args + Huia::AST.const_get(type).new(*args).tap do |n| + n.file = lexer.filename + n.line = lexer.line + n.column = lexer.column + end +end +alias n node + +def allocate_local name + node(:Variable, name).tap do |n| + scope.allocate_local n + end +end + +def allocate_local_assignment name, value + node(:Assignment, name, value).tap do |n| + scope.allocate_local n + end +end + +def this_closure + allocate_local('@') +end + +def scope_instance + node(:ScopeInstance, scope) +end + +def constant name + return scope_instance if name == 'self' + node(:Constant, name) +end + +def to_string expr + node(:MethodCall, expr, node(:CallSignature, 'toString')) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ichk.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ichk.y new file mode 100644 index 000000000000..1d359df83e28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ichk.y @@ -0,0 +1,102 @@ +class Calculator + + prechigh + left '*' '/' + left '+' '-' + preclow + + convert + NUMBER 'Number' + end + +rule + + target : exp + | /* none */ { result = 0 } + + exp : exp '+' exp { result += val[2]; a = 'plus' } + | exp '-' exp { result -= val[2]; a = "string test" } + | exp '*' exp { result *= val[2] } + | exp '/' exp { result /= val[2] } + | '(' { $emb = true } exp ')' + { + raise 'must not happen' unless $emb + result = val[2] + } + | '-' NUMBER { result = -val[1] } + | NUMBER + +----header + +class Number +end + +----inner + + def initialize + @racc_debug_out = $stdout + @yydebug = false + end + + def validate(expected, src) + result = parse(src) + unless result == expected + raise "test #{@test_number} fail" + end + @test_number += 1 + end + + def parse(src) + @src = src + @test_number = 1 + yyparse self, :scan + end + + def scan(&block) + @src.each(&block) + end + +----footer + +calc = Calculator.new + +calc.validate(9, [[Number, 9], nil]) + +calc.validate(-3, + [[Number, 5], + ['*', '*'], + [Number, 1], + ['-', '*'], + [Number, 1], + ['*', '*'], + [Number, 8], + nil]) + +calc.validate(-1, + [[Number, 5], + ['+', '+'], + [Number, 2], + ['-', '-'], + [Number, 5], + ['+', '+'], + [Number, 2], + ['-', '-'], + [Number, 5], + nil]) + +calc.validate(-4, + [['-', 'UMINUS'], + [Number, 4], + nil]) + +calc.validate(40, + [[Number, 7], + ['*', '*'], + ['(', '('], + [Number, 4], + ['+', '+'], + [Number, 3], + [')', ')'], + ['-', '-'], + [Number, 9], + nil]) diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/intp.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/intp.y new file mode 100644 index 000000000000..39e42afd74bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/intp.y @@ -0,0 +1,546 @@ +# +# intp +# + +class Intp::Parser + +prechigh + nonassoc UMINUS + left '*' '/' + left '+' '-' + nonassoc EQ +preclow + +rule + + program : stmt_list + { + result = RootNode.new( val[0] ) + } + + stmt_list : + { + result = [] + } + | stmt_list stmt EOL + { + result.push val[1] + } + | stmt_list EOL + + stmt : expr + | assign + | IDENT realprim + { + result = FuncallNode.new( @fname, val[0][0], + val[0][1], [val[1]] ) + } + | if_stmt + | while_stmt + | defun + + if_stmt : IF stmt THEN EOL stmt_list else_stmt END + { + result = IfNode.new( @fname, val[0][0], + val[1], val[4], val[5] ) + } + + else_stmt : ELSE EOL stmt_list + { + result = val[2] + } + | + { + result = nil + } + + while_stmt: WHILE stmt DO EOL stmt_list END + { + result = WhileNode.new(@fname, val[0][0], + val[1], val[4]) + } + + defun : DEF IDENT param EOL stmt_list END + { + result = DefNode.new(@fname, val[0][0], val[1][1], + Function.new(@fname, val[0][0], val[2], val[4])) + } + + param : '(' name_list ')' + { + result = val[1] + } + | '(' ')' + { + result = [] + } + | + { + result = [] + } + + name_list : IDENT + { + result = [ val[0][1] ] + } + | name_list ',' IDENT + { + result.push val[2][1] + } + + assign : IDENT '=' expr + { + result = AssignNode.new(@fname, val[0][0], val[0][1], val[2]) + } + + expr : expr '+' expr + { + result = FuncallNode.new(@fname, val[0].lineno, '+', [val[0], val[2]]) + } + | expr '-' expr + { + result = FuncallNode.new(@fname, val[0].lineno, '-', [val[0], val[2]]) + } + | expr '*' expr + { + result = FuncallNode.new(@fname, val[0].lineno, '*', [val[0], val[2]]) + } + | expr '/' expr + { + result = FuncallNode.new(@fname, val[0].lineno, + '/', [val[0], val[2]]) + } + | expr EQ expr + { + result = FuncallNode.new(@fname, val[0].lineno, '==', [val[0], val[2]]) + } + | primary + + primary : realprim + | '(' expr ')' + { + result = val[1] + } + | '-' expr =UMINUS + { + result = FuncallNode.new(@fname, val[0][0], '-@', [val[1]]) + } + + realprim : IDENT + { + result = VarRefNode.new(@fname, val[0][0], + val[0][1]) + } + | NUMBER + { + result = LiteralNode.new(@fname, *val[0]) + } + | STRING + { + result = StringNode.new(@fname, *val[0]) + } + | TRUE + { + result = LiteralNode.new(@fname, *val[0]) + } + | FALSE + { + result = LiteralNode.new(@fname, *val[0]) + } + | NIL + { + result = LiteralNode.new(@fname, *val[0]) + } + | funcall + + funcall : IDENT '(' args ')' + { + result = FuncallNode.new(@fname, val[0][0], val[0][1], val[2]) + } + | IDENT '(' ')' + { + result = FuncallNode.new(@fname, val[0][0], val[0][1], []) + } + + args : expr + { + result = val + } + | args ',' expr + { + result.push val[2] + } + +end + +---- header +# +# intp/parser.rb +# + +---- inner + + def initialize + @scope = {} + end + + RESERVED = { + 'if' => :IF, + 'else' => :ELSE, + 'while' => :WHILE, + 'then' => :THEN, + 'do' => :DO, + 'def' => :DEF, + 'true' => :TRUE, + 'false' => :FALSE, + 'nil' => :NIL, + 'end' => :END + } + + RESERVED_V = { + 'true' => true, + 'false' => false, + 'nil' => nil + } + + def parse(f, fname) + @q = [] + @fname = fname + lineno = 1 + f.each do |line| + line.strip! + until line.empty? + case line + when /\A\s+/, /\A\#.*/ + ; + when /\A[a-zA-Z_]\w*/ + word = $& + @q.push [(RESERVED[word] || :IDENT), + [lineno, RESERVED_V.key?(word) ? RESERVED_V[word] : word.intern]] + when /\A\d+/ + @q.push [:NUMBER, [lineno, $&.to_i]] + when /\A"(?:[^"\\]+|\\.)*"/, /\A'(?:[^'\\]+|\\.)*'/ + @q.push [:STRING, [lineno, eval($&)]] + when /\A==/ + @q.push [:EQ, [lineno, '==']] + when /\A./ + @q.push [$&, [lineno, $&]] + else + raise RuntimeError, 'must not happen' + end + line = $' + end + @q.push [:EOL, [lineno, nil]] + lineno += 1 + end + @q.push [false, '$'] + do_parse + end + + def next_token + @q.shift + end + + def on_error(t, v, values) + if v + line = v[0] + v = v[1] + else + line = 'last' + end + raise Racc::ParseError, "#{@fname}:#{line}: syntax error on #{v.inspect}" + end + +---- footer +# intp/node.rb + +module Intp + + class IntpError < StandardError; end + class IntpArgumentError < IntpError; end + + class Core + + def initialize + @ftab = {} + @obj = Object.new + @stack = [] + @stack.push Frame.new '(toplevel)' + end + + def frame + @stack[-1] + end + + def define_function(fname, node) + raise IntpError, "function #{fname} defined twice" if @ftab.key?(fname) + @ftab[fname] = node + end + + def call_function_or(fname, args) + call_intp_function_or(fname, args) { + call_ruby_toplevel_or(fname, args) { + yield + } + } + end + + def call_intp_function_or(fname, args) + if func = @ftab[fname] + frame = Frame.new(fname) + @stack.push frame + func.call self, frame, args + @stack.pop + else + yield + end + end + + def call_ruby_toplevel_or(fname, args) + if @obj.respond_to? fname, true + @obj.send fname, *args + else + yield + end + end + + end + + class Frame + + def initialize(fname) + @fname = fname + @lvars = {} + end + + attr :fname + + def lvar?(name) + @lvars.key? name + end + + def [](key) + @lvars[key] + end + + def []=(key, val) + @lvars[key] = val + end + + end + + + class Node + + def initialize(fname, lineno) + @filename = fname + @lineno = lineno + end + + attr_reader :filename + attr_reader :lineno + + def exec_list(intp, nodes) + v = nil + nodes.each {|i| v = i.evaluate(intp) } + v + end + + def intp_error!(msg) + raise IntpError, "in #{filename}:#{lineno}: #{msg}" + end + + def inspect + "#{self.class.name}/#{lineno}" + end + + end + + + class RootNode < Node + + def initialize(tree) + super nil, nil + @tree = tree + end + + def evaluate + exec_list Core.new, @tree + end + + end + + + class DefNode < Node + + def initialize(file, lineno, fname, func) + super file, lineno + @funcname = fname + @funcobj = func + end + + def evaluate(intp) + intp.define_function @funcname, @funcobj + end + + end + + class FuncallNode < Node + + def initialize(file, lineno, func, args) + super file, lineno + @funcname = func + @args = args + end + + def evaluate(intp) + args = @args.map {|i| i.evaluate intp } + begin + intp.call_intp_function_or(@funcname, args) { + if args.empty? or not args[0].respond_to?(@funcname) + intp.call_ruby_toplevel_or(@funcname, args) { + intp_error! "undefined function #{@funcname.id2name}" + } + else + recv = args.shift + recv.send @funcname, *args + end + } + rescue IntpArgumentError, ArgumentError + intp_error! $!.message + end + end + + end + + class Function < Node + + def initialize(file, lineno, params, body) + super file, lineno + @params = params + @body = body + end + + def call(intp, frame, args) + unless args.size == @params.size + raise IntpArgumentError, + "wrong # of arg for #{frame.fname}() (#{args.size} for #{@params.size})" + end + args.each_with_index do |v,i| + frame[@params[i]] = v + end + exec_list intp, @body + end + + end + + + class IfNode < Node + + def initialize(fname, lineno, cond, tstmt, fstmt) + super fname, lineno + @condition = cond + @tstmt = tstmt + @fstmt = fstmt + end + + def evaluate(intp) + if @condition.evaluate(intp) + exec_list intp, @tstmt + else + exec_list intp, @fstmt if @fstmt + end + end + + end + + class WhileNode < Node + + def initialize(fname, lineno, cond, body) + super fname, lineno + @condition = cond + @body = body + end + + def evaluate(intp) + while @condition.evaluate(intp) + exec_list intp, @body + end + end + + end + + + class AssignNode < Node + + def initialize(fname, lineno, vname, val) + super fname, lineno + @vname = vname + @val = val + end + + def evaluate(intp) + intp.frame[@vname] = @val.evaluate(intp) + end + + end + + class VarRefNode < Node + + def initialize(fname, lineno, vname) + super fname, lineno + @vname = vname + end + + def evaluate(intp) + if intp.frame.lvar?(@vname) + intp.frame[@vname] + else + intp.call_function_or(@vname, []) { + intp_error! "unknown method or local variable #{@vname.id2name}" + } + end + end + + end + + class StringNode < Node + + def initialize(fname, lineno, str) + super fname, lineno + @val = str + end + + def evaluate(intp) + @val.dup + end + + end + + class LiteralNode < Node + + def initialize(fname, lineno, val) + super fname, lineno + @val = val + end + + def evaluate(intp) + @val + end + + end + +end # module Intp + +begin + tree = nil + fname = 'src.intp' + File.open(fname) {|f| + tree = Intp::Parser.new.parse(f, fname) + } + tree.evaluate +rescue Racc::ParseError, Intp::IntpError, Errno::ENOENT + raise #### + $stderr.puts "#{File.basename $0}: #{$!}" + exit 1 +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/journey.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/journey.y new file mode 100644 index 000000000000..c2640f333940 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/journey.y @@ -0,0 +1,47 @@ +class Journey::Parser + +token SLASH LITERAL SYMBOL LPAREN RPAREN DOT STAR OR + +rule + expressions + : expressions expression { result = Cat.new(val.first, val.last) } + | expression { result = val.first } + | or + ; + expression + : terminal + | group + | star + ; + group + : LPAREN expressions RPAREN { result = Group.new(val[1]) } + ; + or + : expressions OR expression { result = Or.new([val.first, val.last]) } + ; + star + : STAR { result = Star.new(Symbol.new(val.last)) } + ; + terminal + : symbol + | literal + | slash + | dot + ; + slash + : SLASH { result = Slash.new('/') } + ; + symbol + : SYMBOL { result = Symbol.new(val.first) } + ; + literal + : LITERAL { result = Literal.new(val.first) } + dot + : DOT { result = Dot.new(val.first) } + ; + +end + +---- header + +require 'journey/parser_extras' diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/liquor.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/liquor.y new file mode 100644 index 000000000000..8045a072a425 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/liquor.y @@ -0,0 +1,313 @@ +# Copyright (c) 2012-2013 Peter Zotov <whitequark@whitequark.org> +# 2012 Yaroslav Markin <yaroslav@markin.net> +# 2012 Nate Gadgibalaev <nat@xnsv.ru> +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class Liquor::Parser + token comma dot endtag ident integer keyword lblock lblock2 lbracket + linterp lparen op_div op_eq op_gt op_geq op_lt op_leq op_minus + op_mod op_mul op_neq op_not op_plus pipe plaintext rblock + rbracket rinterp rparen string tag_ident + + prechigh + left dot + nonassoc op_uminus op_not + left op_mul op_div op_mod + left op_plus op_minus + left op_eq op_neq op_lt op_leq op_gt op_geq + left op_and + left op_or + preclow + + expect 15 + + start block + +rule + block: /* empty */ + { result = [] } + | plaintext block + { result = [ val[0], *val[1] ] } + | interp block + { result = [ val[0], *val[1] ] } + | tag block + { result = [ val[0], *val[1] ] } + + interp: + linterp expr rinterp + { result = [ :interp, retag(val), val[1] ] } + | linterp filter_chain rinterp + { result = [ :interp, retag(val), val[1] ] } + + primary_expr: + ident + | lparen expr rparen + { result = [ val[1][0], retag(val), *val[1][2..-1] ] } + + expr: + integer + | string + | tuple + | ident function_args + { result = [ :call, retag(val), val[0], val[1] ] } + | expr lbracket expr rbracket + { result = [ :index, retag(val), val[0], val[2] ] } + | expr dot ident function_args + { result = [ :external, retag(val), val[0], val[2], val[3] ] } + | expr dot ident + { result = [ :external, retag(val), val[0], val[2], nil ] } + | op_minus expr =op_uminus + { result = [ :uminus, retag(val), val[1] ] } + | op_not expr + { result = [ :not, retag(val), val[1] ] } + | expr op_mul expr + { result = [ :mul, retag(val), val[0], val[2] ] } + | expr op_div expr + { result = [ :div, retag(val), val[0], val[2] ] } + | expr op_mod expr + { result = [ :mod, retag(val), val[0], val[2] ] } + | expr op_plus expr + { result = [ :plus, retag(val), val[0], val[2] ] } + | expr op_minus expr + { result = [ :minus, retag(val), val[0], val[2] ] } + | expr op_eq expr + { result = [ :eq, retag(val), val[0], val[2] ] } + | expr op_neq expr + { result = [ :neq, retag(val), val[0], val[2] ] } + | expr op_lt expr + { result = [ :lt, retag(val), val[0], val[2] ] } + | expr op_leq expr + { result = [ :leq, retag(val), val[0], val[2] ] } + | expr op_gt expr + { result = [ :gt, retag(val), val[0], val[2] ] } + | expr op_geq expr + { result = [ :geq, retag(val), val[0], val[2] ] } + | expr op_and expr + { result = [ :and, retag(val), val[0], val[2] ] } + | expr op_or expr + { result = [ :or, retag(val), val[0], val[2] ] } + | primary_expr + + tuple: + lbracket tuple_content rbracket + { result = [ :tuple, retag(val), val[1].compact ] } + + tuple_content: + expr comma tuple_content + { result = [ val[0], *val[2] ] } + | expr + { result = [ val[0] ] } + | /* empty */ + { result = [ ] } + + function_args: + lparen function_args_inside rparen + { result = [ :args, retag(val), *val[1] ] } + + function_args_inside: + expr function_keywords + { result = [ val[0], val[1][2] ] } + | function_keywords + { result = [ nil, val[0][2] ] } + + function_keywords: + keyword expr function_keywords + { name = val[0][2].to_sym + tail = val[2][2] + loc = retag([ val[0], val[1] ]) + + if tail.include? name + @errors << SyntaxError.new("duplicate keyword argument `#{val[0][2]}'", + tail[name][1]) + end + + hash = { + name => [ val[1][0], loc, *val[1][2..-1] ] + }.merge(tail) + + result = [ :keywords, retag([ loc, val[2] ]), hash ] + } + | /* empty */ + { result = [ :keywords, nil, {} ] } + + filter_chain: + expr pipe filter_chain_cont + { result = [ val[0], *val[2] ]. + reduce { |tree, node| node[3][2] = tree; node } + } + + filter_chain_cont: + filter_call pipe filter_chain_cont + { result = [ val[0], *val[2] ] } + | filter_call + { result = [ val[0] ] } + + filter_call: + ident function_keywords + { ident_loc = val[0][1] + empty_args_loc = { line: ident_loc[:line], + start: ident_loc[:end] + 1, + end: ident_loc[:end] + 1, } + result = [ :call, val[0][1], val[0], + [ :args, val[1][1] || empty_args_loc, nil, val[1][2] ] ] + } + + tag: + lblock ident expr tag_first_cont + { result = [ :tag, retag(val), val[1], val[2], *reduce_tag_args(val[3][2]) ] } + | lblock ident tag_first_cont + { result = [ :tag, retag(val), val[1], nil, *reduce_tag_args(val[2][2]) ] } + + # Racc cannot do lookahead across rules. I had to add states + # explicitly to avoid S/R conflicts. You are not expected to + # understand this. + + tag_first_cont: + rblock + { result = [ :cont, retag(val), [] ] } + | keyword tag_first_cont2 + { result = [ :cont, retag(val), [ val[0], *val[1][2] ] ] } + + tag_first_cont2: + rblock block lblock2 tag_next_cont + { result = [ :cont2, val[0][1], [ [:block, val[0][1], val[1] ], *val[3] ] ] } + | expr tag_first_cont + { result = [ :cont2, retag(val), [ val[0], *val[1][2] ] ] } + + tag_next_cont: + endtag rblock + { result = [] } + | keyword tag_next_cont2 + { result = [ val[0], *val[1] ] } + + tag_next_cont2: + rblock block lblock2 tag_next_cont + { result = [ [:block, val[0][1], val[1] ], *val[3] ] } + | expr keyword tag_next_cont3 + { result = [ val[0], val[1], *val[2] ] } + + tag_next_cont3: + rblock block lblock2 tag_next_cont + { result = [ [:block, val[0][1], val[1] ], *val[3] ] } + | expr tag_next_cont + { result = [ val[0], *val[1] ] } + +---- inner + attr_reader :errors, :ast + + def initialize(tags={}) + super() + + @errors = [] + @ast = nil + @tags = tags + end + + def success? + @errors.empty? + end + + def parse(string, name='(code)') + @errors.clear + @name = name + @ast = nil + + begin + @stream = Lexer.lex(string, @name, @tags) + @ast = do_parse + rescue Liquor::SyntaxError => e + @errors << e + end + + success? + end + + def next_token + tok = @stream.shift + [ tok[0], tok ] if tok + end + + TOKEN_NAME_MAP = { + :comma => ',', + :dot => '.', + :lblock => '{%', + :rblock => '%}', + :linterp => '{{', + :rinterp => '}}', + :lbracket => '[', + :rbracket => ']', + :lparen => '(', + :rparen => ')', + :pipe => '|', + :op_not => '!', + :op_mul => '*', + :op_div => '/', + :op_mod => '%', + :op_plus => '+', + :op_minus => '-', + :op_eq => '==', + :op_neq => '!=', + :op_lt => '<', + :op_leq => '<=', + :op_gt => '>', + :op_geq => '>=', + :keyword => 'keyword argument name', + :kwarg => 'keyword argument', + :ident => 'identifier', + } + + def on_error(error_token_id, error_token, value_stack) + if token_to_str(error_token_id) == "$end" + raise Liquor::SyntaxError.new("unexpected end of program", { + file: @name + }) + else + type, (loc, value) = error_token + type = TOKEN_NAME_MAP[type] || type + + raise Liquor::SyntaxError.new("unexpected token `#{type}'", loc) + end + end + + def retag(nodes) + loc = nodes.map { |node| node[1] }.compact + first, *, last = loc + return first if last.nil? + + { + file: first[:file], + line: first[:line], + start: first[:start], + end: last[:end], + } + end + + def reduce_tag_args(list) + list.each_slice(2).reduce([]) { |args, (k, v)| + if v[0] == :block + args << [ :blockarg, retag([ k, v ]), k, v[2] || [] ] + else + args << [ :kwarg, retag([ k, v ]), k, v ] + end + } + end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/machete.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/machete.y new file mode 100644 index 000000000000..ea92d47a69cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/machete.y @@ -0,0 +1,423 @@ +# Copyright (c) 2011 SUSE +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +class Machete::Parser + +token NIL +token TRUE +token FALSE +token INTEGER +token SYMBOL +token STRING +token REGEXP +token ANY +token EVEN +token ODD +token METHOD_NAME +token CLASS_NAME + +start expression + +rule + +expression : primary + | expression "|" primary { + result = if val[0].is_a?(ChoiceMatcher) + ChoiceMatcher.new(val[0].alternatives << val[2]) + else + ChoiceMatcher.new([val[0], val[2]]) + end + } + +primary : node + | array + | literal + | any + +node : CLASS_NAME { + result = NodeMatcher.new(val[0].to_sym) + } + | CLASS_NAME "<" attrs ">" { + result = NodeMatcher.new(val[0].to_sym, val[2]) + } + +attrs : attr + | attrs "," attr { result = val[0].merge(val[2]) } + +attr : method_name "=" expression { result = { val[0].to_sym => val[2] } } + | method_name "^=" SYMBOL { + result = { + val[0].to_sym => SymbolRegexpMatcher.new( + Regexp.new("^" + Regexp.escape(symbol_value(val[2]).to_s)) + ) + } + } + | method_name "$=" SYMBOL { + result = { + val[0].to_sym => SymbolRegexpMatcher.new( + Regexp.new(Regexp.escape(symbol_value(val[2]).to_s) + "$") + ) + } + } + | method_name "*=" SYMBOL { + result = { + val[0].to_sym => SymbolRegexpMatcher.new( + Regexp.new(Regexp.escape(symbol_value(val[2]).to_s)) + ) + } + } + | method_name "^=" STRING { + result = { + val[0].to_sym => StringRegexpMatcher.new( + Regexp.new("^" + Regexp.escape(string_value(val[2]))) + ) + } + } + | method_name "$=" STRING { + result = { + val[0].to_sym => StringRegexpMatcher.new( + Regexp.new(Regexp.escape(string_value(val[2])) + "$") + ) + } + } + | method_name "*=" STRING { + result = { + val[0].to_sym => StringRegexpMatcher.new( + Regexp.new(Regexp.escape(string_value(val[2]))) + ) + } + } + | method_name "*=" REGEXP { + result = { + val[0].to_sym => IndifferentRegexpMatcher.new( + Regexp.new(regexp_value(val[2])) + ) + } + } + +# Hack to overcome the fact that some tokens will lex as simple tokens, not +# METHOD_NAME tokens, and that "reserved words" will lex as separate kinds of +# tokens. +method_name : METHOD_NAME + | NIL + | TRUE + | FALSE + | ANY + | EVEN + | ODD + | "*" + | "+" + | "<" + | ">" + | "^" + | "|" + +array : "[" items_opt "]" { result = ArrayMatcher.new(val[1]) } + +items_opt : /* empty */ { result = [] } + | items + +items : item { result = [val[0]] } + | items "," item { result = val[0] << val[2] } + +item : expression + | expression quantifier { result = Quantifier.new(val[0], *val[1]) } + +quantifier : "*" { result = [0, nil, 1] } + | "+" { result = [1, nil, 1] } + | "?" { result = [0, 1, 1] } + | "{" INTEGER "}" { + result = [integer_value(val[1]), integer_value(val[1]), 1] + } + | "{" INTEGER "," "}" { + result = [integer_value(val[1]), nil, 1] + } + | "{" "," INTEGER "}" { + result = [0, integer_value(val[2]), 1] + } + | "{" INTEGER "," INTEGER "}" { + result = [integer_value(val[1]), integer_value(val[3]), 1] + } + | "{" EVEN "}" { result = [0, nil, 2] } + | "{" ODD "}" { result = [1, nil, 2] } + +literal : NIL { result = LiteralMatcher.new(nil) } + | TRUE { result = LiteralMatcher.new(true) } + | FALSE { result = LiteralMatcher.new(false) } + | INTEGER { result = LiteralMatcher.new(integer_value(val[0])) } + | SYMBOL { result = LiteralMatcher.new(symbol_value(val[0])) } + | STRING { result = LiteralMatcher.new(string_value(val[0])) } + | REGEXP { result = LiteralMatcher.new(regexp_value(val[0])) } + +any : ANY { result = AnyMatcher.new } + +---- inner + +include Matchers + +class SyntaxError < StandardError; end + +def parse(input) + @input = input + @pos = 0 + + do_parse +end + +private + +def integer_value(value) + if value =~ /^0[bB]/ + value[2..-1].to_i(2) + elsif value =~ /^0[oO]/ + value[2..-1].to_i(8) + elsif value =~ /^0[dD]/ + value[2..-1].to_i(10) + elsif value =~ /^0[xX]/ + value[2..-1].to_i(16) + elsif value =~ /^0/ + value.to_i(8) + else + value.to_i + end +end + +def symbol_value(value) + value[1..-1].to_sym +end + +def string_value(value) + quote = value[0..0] + if quote == "'" + value[1..-2].gsub("\\\\", "\\").gsub("\\'", "'") + elsif quote == '"' + value[1..-2]. + gsub("\\\\", "\\"). + gsub('\\"', '"'). + gsub("\\n", "\n"). + gsub("\\t", "\t"). + gsub("\\r", "\r"). + gsub("\\f", "\f"). + gsub("\\v", "\v"). + gsub("\\a", "\a"). + gsub("\\e", "\e"). + gsub("\\b", "\b"). + gsub("\\s", "\s"). + gsub(/\\([0-7]{1,3})/) { $1.to_i(8).chr }. + gsub(/\\x([0-9a-fA-F]{1,2})/) { $1.to_i(16).chr } + else + raise "Unknown quote: #{quote.inspect}." + end +end + +REGEXP_OPTIONS = { + 'i' => Regexp::IGNORECASE, + 'm' => Regexp::MULTILINE, + 'x' => Regexp::EXTENDED +} + +def regexp_value(value) + /\A\/(.*)\/([imx]*)\z/ =~ value + pattern, options = $1, $2 + + Regexp.new(pattern, options.chars.map { |ch| REGEXP_OPTIONS[ch] }.inject(:|)) +end + +# "^" needs to be here because if it were among operators recognized by +# METHOD_NAME, "^=" would be recognized as two tokens. +SIMPLE_TOKENS = [ + "|", + "<", + ">", + ",", + "=", + "^=", + "^", + "$=", + "[", + "]", + "*=", + "*", + "+", + "?", + "{", + "}" +] + +COMPLEX_TOKENS = [ + [:NIL, /^nil/], + [:TRUE, /^true/], + [:FALSE, /^false/], + # INTEGER needs to be before METHOD_NAME, otherwise e.g. "+1" would be + # recognized as two tokens. + [ + :INTEGER, + /^ + [+-]? # sign + ( + 0[bB][01]+(_[01]+)* # binary (prefixed) + | + 0[oO][0-7]+(_[0-7]+)* # octal (prefixed) + | + 0[dD]\d+(_\d+)* # decimal (prefixed) + | + 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)* # hexadecimal (prefixed) + | + 0[0-7]*(_[0-7]+)* # octal (unprefixed) + | + [1-9]\d*(_\d+)* # decimal (unprefixed) + ) + /x + ], + [ + :SYMBOL, + /^ + : + ( + # class name + [A-Z][a-zA-Z0-9_]* + | + # regular method name + [a-z_][a-zA-Z0-9_]*[?!=]? + | + # instance variable name + @[a-zA-Z_][a-zA-Z0-9_]* + | + # class variable name + @@[a-zA-Z_][a-zA-Z0-9_]* + | + # operator (sorted by length, then alphabetically) + (<=>|===|\[\]=|\*\*|\+@|-@|<<|<=|==|=~|>=|>>|\[\]|[%&*+\-\/<>^`|~]) + ) + /x + ], + [ + :STRING, + /^ + ( + ' # sinqle-quoted string + ( + \\[\\'] # escape + | + [^'] # regular character + )* + ' + | + " # double-quoted string + ( + \\ # escape + ( + [\\"ntrfvaebs] # one-character escape + | + [0-7]{1,3} # octal number escape + | + x[0-9a-fA-F]{1,2} # hexadecimal number escape + ) + | + [^"] # regular character + )* + " + ) + /x + ], + [ + :REGEXP, + /^ + \/ + ( + \\ # escape + ( + [\\\/ntrfvaebs\(\)\[\]\{\}\-\.\?\*\+\|\^\$] # one-character escape + | + [0-7]{2,3} # octal number escape + | + x[0-9a-fA-F]{1,2} # hexadecimal number escape + ) + | + [^\/] # regular character + )* + \/ + [imx]* + /x + ], + # ANY, EVEN and ODD need to be before METHOD_NAME, otherwise they would be + # recognized as method names. + [:ANY, /^any/], + [:EVEN, /^even/], + [:ODD, /^odd/], + # We exclude "*", "+", "<", ">", "^" and "|" from method names since they are + # lexed as simple tokens. This is because they have also other meanings in + # Machette patterns beside Ruby method names. + [ + :METHOD_NAME, + /^ + ( + # regular name + [a-z_][a-zA-Z0-9_]*[?!=]? + | + # operator (sorted by length, then alphabetically) + (<=>|===|\[\]=|\*\*|\+@|-@|<<|<=|==|=~|>=|>>|\[\]|[%&\-\/`~]) + ) + /x + ], + [:CLASS_NAME, /^[A-Z][a-zA-Z0-9_]*/] +] + +def next_token + skip_whitespace + + return false if remaining_input.empty? + + # Complex tokens need to be before simple tokens, otherwise e.g. "<<" would be + # recognized as two tokens. + + COMPLEX_TOKENS.each do |type, regexp| + if remaining_input =~ regexp + @pos += $&.length + return [type, $&] + end + end + + SIMPLE_TOKENS.each do |token| + if remaining_input[0...token.length] == token + @pos += token.length + return [token, token] + end + end + + raise SyntaxError, "Unexpected character: #{remaining_input[0..0].inspect}." +end + +def skip_whitespace + if remaining_input =~ /\A^[ \t\r\n]+/ + @pos += $&.length + end +end + +def remaining_input + @input[@pos..-1] +end + +def on_error(error_token_id, error_value, value_stack) + raise SyntaxError, "Unexpected token: #{error_value.inspect}." +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/macruby.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/macruby.y new file mode 100644 index 000000000000..5ede00830839 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/macruby.y @@ -0,0 +1,2197 @@ +# Copyright (c) 2013 Peter Zotov <whitequark@whitequark.org> +# +# Parts of the source are derived from ruby_parser: +# Copyright (c) Ryan Davis, seattle.rb +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class Parser::MacRuby + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tREGEXP_OPT + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG + tCHARACTER + +prechigh + right tBANG tTILDE tUPLUS + right tPOW + right tUMINUS_NUM tUMINUS + left tSTAR2 tDIVIDE tPERCENT + left tPLUS tMINUS + left tLSHFT tRSHFT + left tAMPER2 + left tPIPE tCARET + left tGT tGEQ tLT tLEQ + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tANDOP + left tOROP + nonassoc tDOT2 tDOT3 + right tEH tCOLON + left kRESCUE_MOD + right tEQL tOP_ASGN + nonassoc kDEFINED + right kNOT + left kOR kAND + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + nonassoc tLBRACE_ARG + nonassoc tLOWEST +preclow + +rule + + program: top_compstmt + + top_compstmt: top_stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + top_stmts: # nothing + { + result = [] + } + | top_stmt + { + result = [ val[0] ] + } + | top_stmts terms top_stmt + { + result = val[0] << val[2] + } + | error top_stmt + { + result = [ val[1] ] + } + + top_stmt: stmt + | klBEGIN tLCURLY top_compstmt tRCURLY + { + result = @builder.preexe(val[0], val[1], val[2], val[3]) + } + + bodystmt: compstmt opt_rescue opt_else opt_ensure + { + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + } + + compstmt: stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + stmts: # nothing + { + result = [] + } + | stmt + { + result = [ val[0] ] + } + | stmts terms stmt + { + result = val[0] << val[2] + } + | error stmt + { + result = [ val[1] ] + } + + stmt: kALIAS fitem + { + @lexer.state = :expr_fname + } + fitem + { + result = @builder.alias(val[0], val[1], val[3]) + } + | kALIAS tGVAR tGVAR + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + } + | kALIAS tGVAR tBACK_REF + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + } + | kALIAS tGVAR tNTH_REF + { + diagnostic :error, :nth_ref_alias, nil, val[2] + } + | kUNDEF undef_list + { + result = @builder.undef_method(val[0], val[1]) + } + | stmt kIF_MOD expr_value + { + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + } + | stmt kUNLESS_MOD expr_value + { + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + } + | stmt kWHILE_MOD expr_value + { + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + } + | stmt kUNTIL_MOD expr_value + { + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + } + | stmt kRESCUE_MOD stmt + { + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + } + | klEND tLCURLY compstmt tRCURLY + { + result = @builder.postexe(val[0], val[1], val[2], val[3]) + } + | lhs tEQL command_call + { + result = @builder.assign(val[0], val[1], val[2]) + } + | mlhs tEQL command_call + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN command_call + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | backref tOP_ASGN command_call + { + @builder.op_assign(val[0], val[1], val[2]) + } + | lhs tEQL mrhs + { + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | mlhs tEQL arg_value + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | mlhs tEQL mrhs + { + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | expr + + expr: command_call + | expr kAND expr + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | expr kOR expr + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kNOT opt_nl expr + { + result = @builder.not_op(val[0], nil, val[2], nil) + } + | tBANG command_call + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | arg + + expr_value: expr + + command_call: command + | block_command + + block_command: block_call + | block_call tDOT operation2 command_args + { + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + } + | block_call tCOLON2 operation2 command_args + { + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + } + + cmd_brace_block: tLBRACE_ARG + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + command: operation command_args =tLOWEST + { + result = @builder.call_method(nil, nil, val[0], + *val[1]) + } + | operation command_args cmd_brace_block + { + method_call = @builder.call_method(nil, nil, val[0], + *val[1]) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tDOT operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + } + | primary_value tDOT operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + *val[3]) + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + *val[3]) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | kSUPER command_args + { + result = @builder.keyword_cmd(:super, val[0], + *val[1]) + } + | kYIELD command_args + { + result = @builder.keyword_cmd(:yield, val[0], + *val[1]) + } + | kRETURN call_args + { + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + } + | kBREAK call_args + { + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + } + | kNEXT call_args + { + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + } + + mlhs: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_inner: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + mlhs_basic: mlhs_head + | mlhs_head mlhs_item + { + result = val[0]. + push(val[1]) + } + | mlhs_head tSTAR mlhs_node + { + result = val[0]. + push(@builder.splat(val[1], val[2])) + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + } + | mlhs_head tSTAR + { + result = val[0]. + push(@builder.splat(val[1])) + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + } + | tSTAR mlhs_node + { + result = [ @builder.splat(val[0], val[1]) ] + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.splat(val[0]) ] + } + | tSTAR tCOMMA mlhs_post + { + result = [ @builder.splat(val[0]), + *val[2] ] + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_head: mlhs_item tCOMMA + { + result = [ val[0] ] + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1] + } + + mlhs_post: mlhs_item + { + result = [ val[0] ] + } + | mlhs_post tCOMMA mlhs_item + { + result = val[0] << val[2] + } + + mlhs_node: variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + lhs: variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + cname: tIDENTIFIER + { + diagnostic :error, :module_name_const, nil, val[0] + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = @builder.const_global(val[0], val[1]) + } + | cname + { + result = @builder.const(val[0]) + } + | primary_value tCOLON2 cname + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + | reswords + + fsym: fname + { + result = @builder.symbol(val[0]) + } + | symbol + + fitem: fsym + | dsym + + undef_list: fitem + { + result = [ val[0] ] + } + | undef_list tCOMMA + { + @lexer.state = :expr_fname + } + fitem + { + result = val[0] << val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + } + | var_lhs tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg + { + diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ] + } + | tCOLON3 tCONSTANT tOP_ASGN arg + { + diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ] + } + | backref tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | arg tDOT2 arg + { + result = @builder.range_inclusive(val[0], val[1], val[2]) + } + | arg tDOT3 arg + { + result = @builder.range_exclusive(val[0], val[1], val[2]) + } + | arg tPLUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMINUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tSTAR2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tDIVIDE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPERCENT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPOW arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tUMINUS_NUM tINTEGER tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + } + | tUMINUS_NUM tFLOAT tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + } + | tUPLUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | tUMINUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tPIPE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCARET arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tAMPER2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCMP arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tNEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMATCH arg + { + result = @builder.match_op(val[0], val[1], val[2]) + } + | arg tNMATCH arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tBANG arg + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | tTILDE arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tLSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tRSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tANDOP arg + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | arg tOROP arg + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kDEFINED opt_nl arg + { + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + } + + | arg tEH arg opt_nl tCOLON arg + { + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + } + | primary + + arg_value: arg + + aref_args: none + | args trailer + | args tCOMMA assocs trailer + { + result = val[0] << @builder.associate(nil, val[2], nil) + } + | assocs trailer + { + result = [ @builder.associate(nil, val[0], nil) ] + } + + paren_args: tLPAREN2 opt_call_args rparen + { + result = val + } + + opt_paren_args: # nothing + { + result = [ nil, [], nil ] + } + | paren_args + + opt_call_args: # nothing + { + result = [] + } + | call_args + + call_args: command + { + result = [ val[0] ] + } + | args opt_block_arg + { + result = val[0].concat(val[1]) + } + | assocs opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + } + | args tCOMMA assocs opt_block_arg + { + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + } + | args tCOMMA assocs tCOMMA args opt_block_arg + { + val[2][-1] = @builder.objc_varargs(val[2][-1], val[4]) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[5]) + } + | block_arg + { + result = [ val[0] ] + } + + call_args2: arg_value tCOMMA args opt_block_arg + { + result = [ val[0], *val[2].concat(val[3]) ] + } + | arg_value tCOMMA block_arg + { + result = [ val[0], val[2] ] + } + | assocs opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil), + *val[1] ] + } + | arg_value tCOMMA assocs opt_block_arg + { + result = [ val[0], + @builder.associate(nil, val[2], nil), + *val[3] ] + } + | arg_value tCOMMA args tCOMMA assocs opt_block_arg + { + result = [ val[0], + *val[2]. + push(@builder.associate(nil, val[4], nil)). + concat(val[5]) ] + } + | block_arg + { + result = [ val[0] ] + } + + command_args: { + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + } + open_args + { + @lexer.cmdarg = val[0] + + result = val[1] + } + + open_args: call_args + { + result = [ nil, val[0], nil ] + } + | tLPAREN_ARG + { + @lexer.state = :expr_endarg + } + rparen + { + result = [ val[0], [], val[2] ] + } + | tLPAREN_ARG call_args2 + { + @lexer.state = :expr_endarg + } + rparen + { + result = [ val[0], val[1], val[3] ] + } + + block_arg: tAMPER arg_value + { + result = @builder.block_pass(val[0], val[1]) + } + + opt_block_arg: tCOMMA block_arg + { + result = [ val[1] ] + } + | tCOMMA + { + result = [] + } + | # nothing + { + result = [] + } + + args: arg_value + { + result = [ val[0] ] + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + | args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | var_ref + | backref + | tFID + { + result = @builder.call_method(nil, nil, val[0]) + } + | kBEGIN bodystmt kEND + { + result = @builder.begin_keyword(val[0], val[1], val[2]) + } + | tLPAREN_ARG expr + { + @lexer.state = :expr_endarg + } + rparen + { + result = @builder.begin(val[0], val[1], val[3]) + } + | tLPAREN compstmt tRPAREN + { + result = @builder.begin(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + | tCOLON3 tCONSTANT + { + result = @builder.const_global(val[0], val[1]) + } + | tLBRACK aref_args tRBRACK + { + result = @builder.array(val[0], val[1], val[2]) + } + | tLBRACE assoc_list tRCURLY + { + result = @builder.associate(val[0], val[1], val[2]) + } + | kRETURN + { + result = @builder.keyword_cmd(:return, val[0]) + } + | kYIELD tLPAREN2 call_args rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + } + | kYIELD tLPAREN2 rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + } + | kYIELD + { + result = @builder.keyword_cmd(:yield, val[0]) + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + } + | kNOT tLPAREN2 expr rparen + { + result = @builder.not_op(val[0], val[1], val[2], val[3]) + } + | kNOT tLPAREN2 rparen + { + result = @builder.not_op(val[0], val[1], nil, val[2]) + } + | operation brace_block + { + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | method_call + | method_call brace_block + { + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + } + | tLAMBDA lambda + { + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[1] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + } + | kIF expr_value then compstmt if_tail kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + } + | kUNLESS expr_value then compstmt opt_else kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + } + | kWHILE + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + } + | kUNTIL + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + } + | kCASE expr_value opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + } + | kCASE opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + } + | kFOR for_var kIN + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + } + | kCLASS cpath superclass + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :class_in_def, nil, val[0] + end + + lt_t, superclass = val[2] + result = @builder.def_class(val[0], val[1], + lt_t, superclass, + val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kCLASS tLSHFT expr term + { + result = @def_level + @def_level = 0 + + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + result = @builder.def_sclass(val[0], val[1], val[2], + val[5], val[6]) + + @lexer.pop_cmdarg + @static_env.unextend + + @def_level = val[4] + } + | kMODULE cpath + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :module_in_def, nil, val[0] + end + + result = @builder.def_module(val[0], val[1], + val[3], val[4]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kDEF fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kDEF singleton dot_or_colon + { + @lexer.state = :expr_fname + } + fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kBREAK + { + result = @builder.keyword_cmd(:break, val[0]) + } + | kNEXT + { + result = @builder.keyword_cmd(:next, val[0]) + } + | kREDO + { + result = @builder.keyword_cmd(:redo, val[0]) + } + | kRETRY + { + result = @builder.keyword_cmd(:retry, val[0]) + } + + primary_value: primary + + then: term + | kTHEN + | term kTHEN + { + result = val[1] + } + + do: term + | kDO_COND + + if_tail: opt_else + | kELSIF expr_value then compstmt if_tail + { + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + } + + opt_else: none + | kELSE compstmt + { + result = val + } + + for_var: lhs + | mlhs + + f_marg: f_norm_arg + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_marg_list: f_marg + { + result = [ val[0] ] + } + | f_marg_list tCOMMA f_marg + { + result = val[0] << val[2] + } + + f_margs: f_marg_list + | f_marg_list tCOMMA tSTAR f_norm_arg + { + result = val[0]. + push(@builder.objc_restarg(val[2], val[3])) + } + | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list + { + result = val[0]. + push(@builder.objc_restarg(val[2], val[3])). + concat(val[5]) + } + | f_marg_list tCOMMA tSTAR + { + result = val[0]. + push(@builder.objc_restarg(val[2])) + } + | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list + { + result = val[0]. + push(@builder.objc_restarg(val[2])). + concat(val[4]) + } + | tSTAR f_norm_arg + { + result = [ @builder.objc_restarg(val[0], val[1]) ] + } + | tSTAR f_norm_arg tCOMMA f_marg_list + { + result = [ @builder.objc_restarg(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.objc_restarg(val[0]) ] + } + | tSTAR tCOMMA f_marg_list + { + result = [ @builder.objc_restarg(val[0]), + *val[2] ] + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_block_optarg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_block_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_block_optarg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_block_optarg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_block_arg + { + result = [ val[0] ] + } + + opt_block_param: # nothing + { + result = @builder.args(nil, [], nil) + } + | block_param_def + { + @lexer.state = :expr_value + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1], val[2]) + } + | tOROP + { + result = @builder.args(val[0], [], val[0]) + } + | tPIPE block_param opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + + opt_bv_decl: # nothing + { + result = [] + } + | tSEMI bv_decls + { + result = val[1] + } + + bv_decls: bvar + { + result = [ val[0] ] + } + | bv_decls tCOMMA bvar + { + result = val[0] << val[2] + } + + bvar: tIDENTIFIER + { + result = @builder.shadowarg(val[0]) + } + | f_bad_arg + + lambda: { + @static_env.extend_dynamic + } + f_larglist lambda_body + { + result = [ val[1], val[2] ] + + @static_env.unextend + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + | f_args + { + result = @builder.args(nil, val[0], nil) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = [ val[0], val[1], val[2] ] + } + | kDO_LAMBDA compstmt kEND + { + result = [ val[0], val[1], val[2] ] + } + + do_block: kDO_BLOCK + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + block_call: command do_block + { + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + } + | block_call tDOT operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | block_call tCOLON2 operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + + method_call: operation paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + } + | primary_value tDOT operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation2 paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation3 + { + result = @builder.call_method(val[0], val[1], val[2]) + } + | primary_value tDOT paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | kSUPER paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + } + | kSUPER + { + result = @builder.keyword_cmd(:zsuper, val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index(val[0], val[1], val[2], val[3]) + } + + brace_block: tLCURLY + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + | kDO + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + case_body: kWHEN args then compstmt cases + { + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + } + + cases: opt_else + { + result = [ val[0] ] + } + | case_body + + opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue + { + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + } + | + { + result = [] + } + + exc_list: arg_value + { + result = [ val[0] ] + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = [ val[0], val[1] ] + } + | none + + opt_ensure: kENSURE compstmt + { + result = [ val[0], val[1] ] + } + | none + + literal: numeric + | symbol + | dsym + + strings: string + { + result = @builder.string_compose(nil, val[0], nil) + } + + string: string1 + { + result = [ val[0] ] + } + | string string1 + { + result = val[0] << val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + result = @builder.string_compose(val[0], val[1], val[2]) + } + | tSTRING + { + result = @builder.string(val[0]) + } + | tCHARACTER + { + result = @builder.character(val[0]) + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = @builder.xstring_compose(val[0], val[1], val[2]) + } + + regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT + { + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + } + + words: tWORDS_BEG word_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + word_list: # nothing + { + result = [] + } + | word_list word tSPACE + { + result = val[0] << @builder.word(val[1]) + } + + word: string_content + { + result = [ val[0] ] + } + | word string_content + { + result = val[0] << val[1] + } + + qwords: tQWORDS_BEG qword_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + qword_list: # nothing + { + result = [] + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0] << @builder.string_internal(val[1]) + } + + string_contents: # nothing + { + result = [] + } + | string_contents string_content + { + result = val[0] << val[1] + } + +xstring_contents: # nothing + { + result = [] + } + | xstring_contents string_content + { + result = val[0] << val[1] + } + +regexp_contents: # nothing + { + result = [] + } + | regexp_contents string_content + { + result = val[0] << val[1] + } + + string_content: tSTRING_CONTENT + { + result = @builder.string_internal(val[0]) + } + | tSTRING_DVAR string_dvar + { + result = val[1] + } + | tSTRING_DBEG + { + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + } + compstmt tRCURLY + { + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + } + + string_dvar: tGVAR + { + result = @builder.gvar(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + | backref + + + symbol: tSYMBOL + { + result = @builder.symbol(val[0]) + } + + dsym: tSYMBEG xstring_contents tSTRING_END + { + result = @builder.symbol_compose(val[0], val[1], val[2]) + } + + numeric: tINTEGER + { + result = @builder.integer(val[0]) + } + | tFLOAT + { + result = @builder.float(val[0]) + } + | tUMINUS_NUM tINTEGER =tLOWEST + { + result = @builder.negate(val[0], + @builder.integer(val[1])) + } + | tUMINUS_NUM tFLOAT =tLOWEST + { + result = @builder.negate(val[0], + @builder.float(val[1])) + } + + variable: tIDENTIFIER + { + result = @builder.ident(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tGVAR + { + result = @builder.gvar(val[0]) + } + | tCONSTANT + { + result = @builder.const(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + | kNIL + { + result = @builder.nil(val[0]) + } + | kSELF + { + result = @builder.self(val[0]) + } + | kTRUE + { + result = @builder.true(val[0]) + } + | kFALSE + { + result = @builder.false(val[0]) + } + | k__FILE__ + { + result = @builder.__FILE__(val[0]) + } + | k__LINE__ + { + result = @builder.__LINE__(val[0]) + } + | k__ENCODING__ + { + result = @builder.__ENCODING__(val[0]) + } + + var_ref: variable + { + result = @builder.accessible(val[0]) + } + + var_lhs: variable + { + result = @builder.assignable(val[0]) + } + + backref: tNTH_REF + { + result = @builder.nth_ref(val[0]) + } + | tBACK_REF + { + result = @builder.back_ref(val[0]) + } + + superclass: term + { + result = nil + } + | tLT expr_value term + { + result = [ val[0], val[1] ] + } + | error term + { + yyerrok + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + } + | f_args term + { + result = @builder.args(nil, val[0], nil) + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_optarg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_optarg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_block_arg + { + result = [ val[0] ] + } + | # nothing + { + result = [] + } + + f_bad_arg: tCONSTANT + { + diagnostic :error, :argument_const, nil, val[0] + } + | tIVAR + { + diagnostic :error, :argument_ivar, nil, val[0] + } + | tGVAR + { + diagnostic :error, :argument_gvar, nil, val[0] + } + | tCVAR + { + diagnostic :error, :argument_cvar, nil, val[0] + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + } + | tIDENTIFIER tASSOC tIDENTIFIER + { + @static_env.declare val[2][0] + + result = @builder.objc_kwarg(val[0], val[1], val[2]) + } + | tLABEL tIDENTIFIER + { + @static_env.declare val[1][0] + + result = @builder.objc_kwarg(val[0], nil, val[1]) + } + + f_arg_item: f_norm_arg + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_arg: f_arg_item + { + result = [ val[0] ] + } + | f_arg tCOMMA f_arg_item + { + result = val[0] << val[2] + } + + f_opt: tIDENTIFIER tEQL arg_value + { + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_opt: tIDENTIFIER tEQL primary_value + { + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_optarg: f_block_opt + { + result = [ val[0] ] + } + | f_block_optarg tCOMMA f_block_opt + { + result = val[0] << val[2] + } + + f_optarg: f_opt + { + result = [ val[0] ] + } + | f_optarg tCOMMA f_opt + { + result = val[0] << val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + } + | restarg_mark + { + result = [ @builder.restarg(val[0]) ] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + } + + opt_f_block_arg: tCOMMA f_block_arg + { + result = [ val[1] ] + } + | # nothing + { + result = [] + } + + singleton: var_ref + | tLPAREN2 expr rparen + { + result = val[1] + } + + assoc_list: # nothing + { + result = [] + } + | assocs trailer + + assocs: assoc + { + result = [ val[0] ] + } + | assocs tCOMMA assoc + { + result = val[0] << val[2] + } + + assoc: arg_value tASSOC arg_value + { + result = @builder.pair(val[0], val[1], val[2]) + } + | tLABEL arg_value + { + result = @builder.pair_keyword(val[0], val[1]) + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + result = val[1] + } + rbracket: opt_nl tRBRACK + { + result = val[1] + } + trailer: | tNL | tCOMMA + + term: tSEMI + { + yyerrok + } + | tNL + + terms: term + | terms tSEMI + + none: # nothing + { + result = nil + } +end + +---- header + +require 'parser' + +Parser.check_for_encoding_support + +---- inner + + def version + 19 # closest released match: v1_9_0_2 + end + + def default_encoding + Encoding::BINARY + end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/mailp.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/mailp.y new file mode 100644 index 000000000000..eb7d4d529d0e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/mailp.y @@ -0,0 +1,437 @@ +# +# mailp for test +# + +class Testp + +rule + + content : DateH datetime { @field.date = val[1] } + | RecvH received + | RetpathH returnpath + | MaddrH addrs { @field.addrs.replace val[1] } + | SaddrH addr { @field.addr = val[1] } + | MmboxH mboxes { @field.addrs.replace val[1] } + | SmboxH mbox { @field.addr = val[1] } + | MsgidH msgid { @field.msgid = val[1] } + | KeyH keys { @field.keys.replace val[1] } + | EncH enc + | VersionH version + | CTypeH ctype + | CEncodingH cencode + | CDispositionH cdisp + | Mbox mbox + { + mb = val[1] + @field.phrase = mb.phrase + @field.setroute mb.route + @field.local = mb.local + @field.domain = mb.domain + } + | Spec spec + { + mb = val[1] + @field.local = mb.local + @field.domain = mb.domain + } + ; + + datetime : day DIGIT ATOM DIGIT hour zone + # 0 1 2 3 4 5 + # day month year + { + t = Time.gm( val[3].to_i, val[2], val[1].to_i, 0, 0, 0 ) + result = (t + val[4] - val[5]).localtime + } + ; + + day : /* none */ + | ATOM ',' + ; + + hour : DIGIT ':' DIGIT + { + result = (result.to_i * 60 * 60) + (val[2].to_i * 60) + } + | DIGIT ':' DIGIT ':' DIGIT + { + result = (result.to_i * 60 * 60) + + (val[2].to_i * 60) + + val[4].to_i + } + ; + + zone : ATOM + { + result = ::TMail.zonestr2i( val[0] ) * 60 + } + ; + + received : from by via with id for recvdatetime + ; + + from : /* none */ + | FROM domain + { + @field.from = Address.join( val[1] ) + } + | FROM domain '@' domain + { + @field.from = Address.join( val[3] ) + } + | FROM domain DOMLIT + { + @field.from = Address.join( val[1] ) + } + ; + + by : /* none */ + | BY domain + { + @field.by = Address.join( val[1] ) + } + ; + + via : /* none */ + | VIA ATOM + { + @field.via = val[1] + } + ; + + with : /* none */ + | WITH ATOM + { + @field.with.push val[1] + } + ; + + id : /* none */ + | ID msgid + { + @field.msgid = val[1] + } + | ID ATOM + { + @field.msgid = val[1] + } + ; + + for : /* none */ + | FOR addr + { + @field.for_ = val[1].address + } + ; + + recvdatetime + : /* none */ + | ';' datetime + { + @field.date = val[1] + } + ; + + returnpath: '<' '>' + | routeaddr + { + @field.route.replace result.route + @field.addr = result.addr + } + ; + + addrs : addr { result = val } + | addrs ',' addr { result.push val[2] } + ; + + addr : mbox + | group + ; + + mboxes : mbox + { + result = val + } + | mboxes ',' mbox + { + result.push val[2] + } + ; + + mbox : spec + | routeaddr + | phrase routeaddr + { + val[1].phrase = HFdecoder.decode( result ) + result = val[1] + } + ; + + group : phrase ':' mboxes ';' + { + result = AddressGroup.new( result, val[2] ) + } + # | phrase ':' ';' { result = AddressGroup.new( result ) } + ; + + routeaddr : '<' route spec '>' + { + result = val[2] + result.route = val[1] + } + | '<' spec '>' + { + result = val[1] + } + ; + + route : at_domains ':' + ; + + at_domains: '@' domain { result = [ val[1] ] } + | at_domains ',' '@' domain { result.push val[3] } + ; + + spec : local '@' domain { result = Address.new( val[0], val[2] ) } + | local { result = Address.new( result, nil ) } + ; + + local : word { result = val } + | local '.' word { result.push val[2] } + ; + + domain : domword { result = val } + | domain '.' domword { result.push val[2] } + ; + + domword : atom + | DOMLIT + | DIGIT + ; + + msgid : '<' spec '>' + { + val[1] = val[1].addr + result = val.join('') + } + ; + + phrase : word + | phrase word { result << ' ' << val[1] } + ; + + word : atom + | QUOTED + | DIGIT + ; + + keys : phrase + | keys ',' phrase + ; + + enc : word + { + @field.encrypter = val[0] + } + | word word + { + @field.encrypter = val[0] + @field.keyword = val[1] + } + ; + + version : DIGIT '.' DIGIT + { + @field.major = val[0].to_i + @field.minor = val[2].to_i + } + ; + + ctype : TOKEN '/' TOKEN params + { + @field.main = val[0] + @field.sub = val[2] + } + | TOKEN params + { + @field.main = val[0] + @field.sub = '' + } + ; + + params : /* none */ + | params ';' TOKEN '=' value + { + @field.params[ val[2].downcase ] = val[4] + } + ; + + value : TOKEN + | QUOTED + ; + + cencode : TOKEN + { + @field.encoding = val[0] + } + ; + + cdisp : TOKEN disp_params + { + @field.disposition = val[0] + } + ; + + disp_params + : /* none */ + | disp_params ';' disp_param + ; + + disp_param: /* none */ + | TOKEN '=' value + { + @field.params[ val[0].downcase ] = val[2] + } + ; + + atom : ATOM + | FROM + | BY + | VIA + | WITH + | ID + | FOR + ; + +end + + +---- header +# +# mailp for test +# + +require 'tmail/mails' + + +module TMail + +---- inner + + MAILP_DEBUG = false + + def initialize + self.debug = MAILP_DEBUG + end + + def debug=( flag ) + @yydebug = flag && Racc_debug_parser + @scanner_debug = flag + end + + def debug + @yydebug + end + + + def Mailp.parse( str, obj, ident ) + new.parse( str, obj, ident ) + end + + + NATIVE_ROUTINE = { + 'TMail::MsgidH' => :msgid_parse, + 'TMail::RefH' => :refs_parse + } + + def parse( str, obj, ident ) + return if /\A\s*\z/ === str + + @field = obj + + if mid = NATIVE_ROUTINE[ obj.type.name ] then + send mid, str + else + unless ident then + ident = obj.type.name.split('::')[-1].to_s + cmt = [] + obj.comments.replace cmt + else + cmt = nil + end + + @scanner = MailScanner.new( str, ident, cmt ) + @scanner.debug = @scanner_debug + @first = [ ident.intern, ident ] + @pass_array = [nil, nil] + + do_parse + end + end + + + private + + + def next_token + if @first then + ret = @first + @first = nil + ret + else + @scanner.scan @pass_array + end + end + + def on_error( tok, val, vstack ) + raise ParseError, + "\nparse error in '#{@field.name}' header, on token #{val.inspect}" + end + + + + def refs_parse( str ) + arr = [] + + while mdata = ::TMail::MSGID.match( str ) do + str = mdata.post_match + + pre = mdata.pre_match + pre.strip! + proc_phrase pre, arr unless pre.empty? + arr.push mdata.to_s + end + str.strip! + proc_phrase str, arr if not pre or pre.empty? + + @field.refs.replace arr + end + + def proc_phrase( str, arr ) + while mdata = /"([^\\]*(?:\\.[^"\\]*)*)"/.match( str ) do + str = mdata.post_match + + pre = mdata.pre_match + pre.strip! + arr.push pre unless pre.empty? + arr.push mdata[1] + end + str.strip! + arr.push unless str.empty? + end + + + def msgid_parse( str ) + if mdata = ::TMail::MSGID.match( str ) then + @field.msgid = mdata.to_s + else + raise ParseError, "wrong Message-ID format: #{str}" + end + end + +---- footer + +end # module TMail + +mp = TMail::Testp.new +mp.parse diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/mediacloth.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/mediacloth.y new file mode 100644 index 000000000000..94cc411ea75e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/mediacloth.y @@ -0,0 +1,599 @@ +# Copyright (c) 2006 Pluron Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# The parser for the MediaWiki language. +# +# Usage together with a lexer: +# inputFile = File.new("data/input1", "r") +# input = inputFile.read +# parser = MediaWikiParser.new +# parser.lexer = MediaWikiLexer.new +# parser.parse(input) + +class MediaWikiParser + +token TEXT BOLD_START BOLD_END ITALIC_START ITALIC_END LINK_START LINK_END LINKSEP + INTLINK_START INTLINK_END INTLINKSEP RESOURCESEP CHAR_ENT + PRE_START PRE_END PREINDENT_START PREINDENT_END + SECTION_START SECTION_END HLINE SIGNATURE_NAME SIGNATURE_DATE SIGNATURE_FULL + PARA_START PARA_END UL_START UL_END OL_START OL_END LI_START LI_END + DL_START DL_END DT_START DT_END DD_START DD_END TAG_START TAG_END ATTR_NAME ATTR_VALUE + TABLE_START TABLE_END ROW_START ROW_END HEAD_START HEAD_END CELL_START CELL_END + KEYWORD TEMPLATE_START TEMPLATE_END CATEGORY PASTE_START PASTE_END + + +rule + +wiki: + repeated_contents + { + @nodes.push WikiAST.new(0, @wiki_ast_length) + #@nodes.last.children.insert(0, val[0]) + #puts val[0] + @nodes.last.children += val[0] + } + ; + +contents: + text + { + result = val[0] + } + | bulleted_list + { + result = val[0] + } + | numbered_list + { + result = val[0] + } + | dictionary_list + { + list = ListAST.new(@ast_index, @ast_length) + list.list_type = :Dictionary + list.children = val[0] + result = list + } + | preformatted + { + result = val[0] + } + | section + { + result = val[0] + } + | tag + { + result = val[0] + } + | template + { + result = val[0] + } + | KEYWORD + { + k = KeywordAST.new(@ast_index, @ast_length) + k.text = val[0] + result = k + } + | PARA_START para_contents PARA_END + { + p = ParagraphAST.new(@ast_index, @ast_length) + p.children = val[1] + result = p + } + | LINK_START link_contents LINK_END + { + l = LinkAST.new(@ast_index, @ast_length) + l.link_type = val[0] + l.url = val[1][0] + l.children += val[1][1..-1] if val[1].length > 1 + result = l + } + | PASTE_START para_contents PASTE_END + { + p = PasteAST.new(@ast_index, @ast_length) + p.children = val[1] + result = p + } + | INTLINK_START TEXT RESOURCESEP TEXT reslink_repeated_contents INTLINK_END + { + l = ResourceLinkAST.new(@ast_index, @ast_length) + l.prefix = val[1] + l.locator = val[3] + l.children = val[4] unless val[4].nil? or val[4].empty? + result = l + } + | INTLINK_START TEXT intlink_repeated_contents INTLINK_END + { + l = InternalLinkAST.new(@ast_index, @ast_length) + l.locator = val[1] + l.children = val[2] unless val[2].nil? or val[2].empty? + result = l + } + | INTLINK_START CATEGORY TEXT cat_sort_contents INTLINK_END + { + l = CategoryAST.new(@ast_index, @ast_length) + l.locator = val[2] + l.sort_as = val[3] + result = l + } + | INTLINK_START RESOURCESEP CATEGORY TEXT intlink_repeated_contents INTLINK_END + { + l = CategoryLinkAST.new(@ast_index, @ast_length) + l.locator = val[3] + l.children = val[4] unless val[4].nil? or val[4].empty? + result = l + } + | table + ; + +para_contents: + { + result = nil + } + | repeated_contents + { + result = val[0] + } + ; + +tag: + TAG_START tag_attributes TAG_END + { + if val[0] != val[2] + raise Racc::ParseError.new("XHTML end tag #{val[2]} does not match start tag #{val[0]}") + end + elem = ElementAST.new(@ast_index, @ast_length) + elem.name = val[0] + elem.attributes = val[1] + result = elem + } + | TAG_START tag_attributes repeated_contents TAG_END + { + if val[0] != val[3] + raise Racc::ParseError.new("XHTML end tag #{val[3]} does not match start tag #{val[0]}") + end + elem = ElementAST.new(@ast_index, @ast_length) + elem.name = val[0] + elem.attributes = val[1] + elem.children += val[2] + result = elem + } + ; + +tag_attributes: + { + result = nil + } + | ATTR_NAME tag_attributes + { + attr_map = val[2] ? val[2] : {} + attr_map[val[0]] = true + result = attr_map + } + | ATTR_NAME ATTR_VALUE tag_attributes + { + attr_map = val[2] ? val[2] : {} + attr_map[val[0]] = val[1] + result = attr_map + } + ; + + +link_contents: + TEXT + { + result = val + } + | TEXT LINKSEP link_repeated_contents + { + result = [val[0]] + result += val[2] + } + ; + + +link_repeated_contents: + repeated_contents + { + result = val[0] + } + | repeated_contents LINKSEP link_repeated_contents + { + result = val[0] + result += val[2] if val[2] + } + ; + + +intlink_repeated_contents: + { + result = nil + } + | INTLINKSEP repeated_contents + { + result = val[1] + } + ; + +cat_sort_contents: + { + result = nil + } + | INTLINKSEP TEXT + { + result = val[1] + } + ; + +reslink_repeated_contents: + { + result = nil + } + | INTLINKSEP reslink_repeated_contents + { + result = val[1] + } + | INTLINKSEP repeated_contents reslink_repeated_contents + { + i = InternalLinkItemAST.new(@ast_index, @ast_length) + i.children = val[1] + result = [i] + result += val[2] if val[2] + } + ; + +repeated_contents: contents + { + result = [] + result << val[0] + } + | repeated_contents contents + { + result = [] + result += val[0] + result << val[1] + } + ; + +text: element + { + p = TextAST.new(@ast_index, @ast_length) + p.formatting = val[0][0] + p.contents = val[0][1] + result = p + } + | formatted_element + { + result = val[0] + } + ; + +table: + TABLE_START table_contents TABLE_END + { + table = TableAST.new(@ast_index, @ast_length) + table.children = val[1] unless val[1].nil? or val[1].empty? + result = table + } + | TABLE_START TEXT table_contents TABLE_END + { + table = TableAST.new(@ast_index, @ast_length) + table.options = val[1] + table.children = val[2] unless val[2].nil? or val[2].empty? + result = table + } + +table_contents: + { + result = nil + } + | ROW_START row_contents ROW_END table_contents + { + row = TableRowAST.new(@ast_index, @ast_length) + row.children = val[1] unless val[1].nil? or val[1].empty? + result = [row] + result += val[3] unless val[3].nil? or val[3].empty? + } + | ROW_START TEXT row_contents ROW_END table_contents + { + row = TableRowAST.new(@ast_index, @ast_length) + row.children = val[2] unless val[2].nil? or val[2].empty? + row.options = val[1] + result = [row] + result += val[4] unless val[4].nil? or val[4].empty? + } + +row_contents: + { + result = nil + } + | HEAD_START HEAD_END row_contents + { + cell = TableCellAST.new(@ast_index, @ast_length) + cell.type = :head + result = [cell] + result += val[2] unless val[2].nil? or val[2].empty? + } + | HEAD_START repeated_contents HEAD_END row_contents + { + cell = TableCellAST.new(@ast_index, @ast_length) + cell.children = val[1] unless val[1].nil? or val[1].empty? + cell.type = :head + result = [cell] + result += val[3] unless val[3].nil? or val[3].empty? + } + | CELL_START CELL_END row_contents + { + cell = TableCellAST.new(@ast_index, @ast_length) + cell.type = :body + result = [cell] + result += val[2] unless val[2].nil? or val[2].empty? + } + | CELL_START repeated_contents CELL_END row_contents + { + if val[2] == 'attributes' + result = [] + else + cell = TableCellAST.new(@ast_index, @ast_length) + cell.children = val[1] unless val[1].nil? or val[1].empty? + cell.type = :body + result = [cell] + end + result += val[3] unless val[3].nil? or val[3].empty? + if val[2] == 'attributes' and val[3] and val[3].first.class == TableCellAST + val[3].first.attributes = val[1] + end + result + } + + +element: + TEXT + { return [:None, val[0]] } + | HLINE + { return [:HLine, val[0]] } + | CHAR_ENT + { return [:CharacterEntity, val[0]] } + | SIGNATURE_DATE + { return [:SignatureDate, val[0]] } + | SIGNATURE_NAME + { return [:SignatureName, val[0]] } + | SIGNATURE_FULL + { return [:SignatureFull, val[0]] } + ; + +formatted_element: + BOLD_START BOLD_END + { + result = FormattedAST.new(@ast_index, @ast_length) + result.formatting = :Bold + result + } + | ITALIC_START ITALIC_END + { + result = FormattedAST.new(@ast_index, @ast_length) + result.formatting = :Italic + result + } + | BOLD_START repeated_contents BOLD_END + { + p = FormattedAST.new(@ast_index, @ast_length) + p.formatting = :Bold + p.children += val[1] + result = p + } + | ITALIC_START repeated_contents ITALIC_END + { + p = FormattedAST.new(@ast_index, @ast_length) + p.formatting = :Italic + p.children += val[1] + result = p + } + ; + +bulleted_list: UL_START list_item list_contents UL_END + { + list = ListAST.new(@ast_index, @ast_length) + list.list_type = :Bulleted + list.children << val[1] + list.children += val[2] + result = list + } + ; + +numbered_list: OL_START list_item list_contents OL_END + { + list = ListAST.new(@ast_index, @ast_length) + list.list_type = :Numbered + list.children << val[1] + list.children += val[2] + result = list + } + ; + +list_contents: + { result = [] } + list_item list_contents + { + result << val[1] + result += val[2] + } + | + { result = [] } + ; + +list_item: + LI_START LI_END + { + result = ListItemAST.new(@ast_index, @ast_length) + } + | LI_START repeated_contents LI_END + { + li = ListItemAST.new(@ast_index, @ast_length) + li.children += val[1] + result = li + } + ; + +dictionary_list: + DL_START dictionary_term dictionary_contents DL_END + { + result = [val[1]] + result += val[2] + } + | DL_START dictionary_contents DL_END + { + result = val[1] + } + ; + +dictionary_term: + DT_START DT_END + { + result = ListTermAST.new(@ast_index, @ast_length) + } + | DT_START repeated_contents DT_END + { + term = ListTermAST.new(@ast_index, @ast_length) + term.children += val[1] + result = term + } + +dictionary_contents: + dictionary_definition dictionary_contents + { + result = [val[0]] + result += val[1] if val[1] + } + | + { + result = [] + } + +dictionary_definition: + DD_START DD_END + { + result = ListDefinitionAST.new(@ast_index, @ast_length) + } + | DD_START repeated_contents DD_END + { + term = ListDefinitionAST.new(@ast_index, @ast_length) + term.children += val[1] + result = term + } + +preformatted: PRE_START repeated_contents PRE_END + { + p = PreformattedAST.new(@ast_index, @ast_length) + p.children += val[1] + result = p + } + | PREINDENT_START repeated_contents PREINDENT_END + { + p = PreformattedAST.new(@ast_index, @ast_length) + p.indented = true + p.children += val[1] + result = p + } + ; + +section: SECTION_START repeated_contents SECTION_END + { result = [val[1], val[0].length] + s = SectionAST.new(@ast_index, @ast_length) + s.children = val[1] + s.level = val[0].length + result = s + } + ; + +template: TEMPLATE_START TEXT template_parameters TEMPLATE_END + { + t = TemplateAST.new(@ast_index, @ast_length) + t.template_name = val[1] + t.children = val[2] unless val[2].nil? or val[2].empty? + result = t + } + ; + +template_parameters: + { + result = nil + } + | INTLINKSEP TEXT template_parameters + { + p = TemplateParameterAST.new(@ast_index, @ast_length) + p.parameter_value = val[1] + result = [p] + result += val[2] if val[2] + } + | INTLINKSEP template template_parameters + { + p = TemplateParameterAST.new(@ast_index, @ast_length) + p.children << val[1] + result = [p] + result += val[2] if val[2] + } + ; + +end + +---- header ---- +require 'mediacloth/mediawikiast' + +---- inner ---- + +attr_accessor :lexer + +def initialize + @nodes = [] + @context = [] + @wiki_ast_length = 0 + super +end + +#Tokenizes input string and parses it. +def parse(input) + @yydebug=true + lexer.tokenize(input) + do_parse + return @nodes.last +end + +#Asks the lexer to return the next token. +def next_token + token = @lexer.lex + if token[0].to_s.upcase.include? "_START" + @context << token[2..3] + elsif token[0].to_s.upcase.include? "_END" + @ast_index = @context.last[0] + @ast_length = token[2] + token[3] - @context.last[0] + @context.pop + else + @ast_index = token[2] + @ast_length = token[3] + end + + @wiki_ast_length += token[3] + + return token[0..1] +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/mof.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/mof.y new file mode 100644 index 000000000000..da3172988f7e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/mof.y @@ -0,0 +1,649 @@ +# Distributed under the Ruby license +# See http://www.ruby-lang.org/en/LICENSE.txt for the full license text +# Copyright (c) 2010 Klaus Kämpf <kkaempf@suse.de> + +/* + * According to appendix A of + * http://www.dmtf.org/standards/cim/cim_spec_v22 + */ + +class MOF::Parser + prechigh +/* nonassoc UMINUS */ + left '*' '/' + left '+' '-' + preclow + + token PRAGMA INCLUDE IDENTIFIER CLASS ASSOCIATION INDICATION + AMENDED ENABLEOVERRIDE DISABLEOVERRIDE RESTRICTED TOSUBCLASS TOINSTANCE + TRANSLATABLE QUALIFIER SCOPE SCHEMA PROPERTY REFERENCE + METHOD PARAMETER FLAVOR INSTANCE + AS REF ANY OF + DT_VOID + DT_UINT8 DT_SINT8 DT_UINT16 DT_SINT16 DT_UINT32 DT_SINT32 + DT_UINT64 DT_SINT64 DT_REAL32 DT_REAL64 DT_CHAR16 DT_STR + DT_BOOLEAN DT_DATETIME + positiveDecimalValue + stringValue + realValue + charValue + booleanValue + nullValue + binaryValue + octalValue + decimalValue + hexValue + +rule + + /* Returns a Hash of filename and MofResult */ + mofSpecification + : /* empty */ + { result = Hash.new } + | mofProduction + { result = { @name => @result } } + | mofSpecification mofProduction + { result = val[0] + result[@name] = @result + } + ; + + mofProduction + : compilerDirective + | classDeclaration + { #puts "Class '#{val[0].name}'" + @result.classes << val[0] + } + | qualifierDeclaration + { @result.qualifiers << val[0] + @qualifiers[val[0].name.downcase] = val[0] + } + | instanceDeclaration + { @result.instances << val[0] } + ; + +/*** + * compilerDirective + * + */ + + compilerDirective + : "#" PRAGMA INCLUDE pragmaParameters_opt + { raise MOF::Helper::Error.new(@name,@lineno,@line,"Missing filename after '#pragma include'") unless val[3] + open val[3], :pragma + } + | "#" PRAGMA pragmaName pragmaParameters_opt + | "#" INCLUDE pragmaParameters_opt + { raise StyleError.new(@name,@lineno,@line,"Use '#pragma include' instead of '#include'") unless @style == :wmi + raise MOF::Helper::Error.new(@name,@lineno,@line,"Missing filename after '#include'") unless val[2] + open val[2], :pragma + } + ; + + pragmaName + : IDENTIFIER + ; + + pragmaParameters_opt + : /* empty */ + { raise StyleError.new(@name,@lineno,@line,"#pragma parameter missing") unless @style == :wmi } + | "(" pragmaParameterValues ")" + { result = val[1] } + ; + + pragmaParameterValues + : pragmaParameterValue + | pragmaParameterValues "," pragmaParameterValue + ; + + pragmaParameterValue + : string + | integerValue + { raise StyleError.new(@name,@lineno,@line,"#pragma parameter missing") unless @style == :wmi } + | IDENTIFIER + ; + +/*** + * classDeclaration + * + */ + + classDeclaration + : qualifierList_opt CLASS className alias_opt superClass_opt "{" classFeatures "}" ";" + { qualifiers = val[0] + features = val[6] + # FIXME: features must not include references + result = CIM::Class.new(val[2],qualifiers,val[3],val[4],features) + } + ; + + classFeatures + : /* empty */ + { result = [] } + | classFeatures classFeature + { result = val[0] << val[1] } + ; + + classFeature + : propertyDeclaration + | methodDeclaration + | referenceDeclaration /* must have association qualifier */ + ; + + + qualifierList_opt + : /* empty */ + | qualifierList + { result = CIM::QualifierSet.new val[0] } + ; + + qualifierList + : "[" qualifier qualifiers "]" + { result = val[2] + result.unshift val[1] if val[1] } + ; + + qualifiers + : /* empty */ + { result = [] } + | qualifiers "," qualifier + { result = val[0] + result << val[2] if val[2] + } + ; + + qualifier + : qualifierName qualifierParameter_opt flavor_opt + { # Get qualifier decl + qualifier = case val[0] + when CIM::Qualifier then val[0].definition + when CIM::QualifierDeclaration then val[0] + when String then @qualifiers[val[0].downcase] + else + nil + end + raise MOF::Helper::Error.new(@name,@lineno,@line,"'#{val[0]}' is not a valid qualifier") unless qualifier + value = val[1] + raise MOF::Helper::Error.new(@name,@lineno,@line,"#{value.inspect} does not match qualifier type '#{qualifier.type}'") unless qualifier.type.matches?(value)||@style == :wmi + # Don't propagate a boolean 'false' + if qualifier.type == :boolean && value == false + result = nil + else + result = CIM::Qualifier.new(qualifier,value,val[2]) + end + } + ; + + flavor_opt + : /* empty */ + | ":" flavor + { result = CIM::QualifierFlavors.new val[1] } + ; + + qualifierParameter_opt + : /* empty */ + | qualifierParameter + ; + + qualifierParameter + : "(" constantValue ")" + { result = val[1] } + | arrayInitializer + ; + + /* CIM::Flavors */ + flavor + : AMENDED | ENABLEOVERRIDE | DISABLEOVERRIDE | RESTRICTED | TOSUBCLASS | TRANSLATABLE | TOINSTANCE + { case val[0].to_sym + when :amended, :toinstance + raise StyleError.new(@name,@lineno,@line,"'#{val[0]}' is not a valid flavor") unless @style == :wmi + end + } + ; + + alias_opt + : /* empty */ + | alias + ; + + superClass_opt + : /* empty */ + | superClass + ; + + className + : IDENTIFIER /* must be <schema>_<classname> in CIM v2.x */ + { raise ParseError.new("Class name must be prefixed by '<schema>_'") unless val[0].include?("_") || @style == :wmi } + ; + + alias + : AS aliasIdentifier + { result = val[1] } + ; + + aliasIdentifier + : "$" IDENTIFIER /* NO whitespace ! */ + { result = val[1] } + ; + + superClass + : ":" className + { result = val[1] } + ; + + + propertyDeclaration + : qualifierList_opt dataType propertyName array_opt defaultValue_opt ";" + { if val[3] + type = CIM::Array.new val[3],val[1] + else + type = val[1] + end + result = CIM::Property.new(type,val[2],val[0],val[4]) + } + ; + + referenceDeclaration + : qualifierList_opt objectRef referenceName array_opt defaultValue_opt ";" + { if val[4] + raise StyleError.new(@name,@lineno,@line,"Array not allowed in reference declaration") unless @style == :wmi + end + result = CIM::Reference.new(val[1],val[2],val[0],val[4]) } + ; + + methodDeclaration + : qualifierList_opt dataType methodName "(" parameterList_opt ")" ";" + { result = CIM::Method.new(val[1],val[2],val[0],val[4]) } + ; + + propertyName + : IDENTIFIER + | PROPERTY + { # tmplprov.mof has 'string Property;' + raise StyleError.new(@name,@lineno,@line,"Invalid keyword '#{val[0]}' used for property name") unless @style == :wmi + } + ; + + referenceName + : IDENTIFIER + | INDICATION + { result = "Indication" } + ; + + methodName + : IDENTIFIER + ; + + dataType + : DT_UINT8 + | DT_SINT8 + | DT_UINT16 + | DT_SINT16 + | DT_UINT32 + | DT_SINT32 + | DT_UINT64 + | DT_SINT64 + | DT_REAL32 + | DT_REAL64 + | DT_CHAR16 + | DT_STR + | DT_BOOLEAN + | DT_DATETIME + | DT_VOID + { raise StyleError.new(@name,@lineno,@line,"'void' is not a valid datatype") unless @style == :wmi } + ; + + objectRef + : className + { # WMI uses class names as data types (without REF ?!) + raise StyleError.new(@name,@lineno,@line,"Expected 'ref' keyword after classname '#{val[0]}'") unless @style == :wmi + result = CIM::ReferenceType.new val[0] + } + + | className REF + { result = CIM::ReferenceType.new val[0] } + ; + + parameterList_opt + : /* empty */ + | parameterList + ; + + parameterList + : parameter parameters + { result = val[1].unshift val[0] } + ; + + parameters + : /* empty */ + { result = [] } + | parameters "," parameter + { result = val[0] << val[2] } + ; + + parameter + : qualifierList_opt typespec parameterName array_opt parameterValue_opt + { if val[3] + type = CIM::Array.new val[3], val[1] + else + type = val[1] + end + result = CIM::Property.new(type,val[2],val[0]) + } + ; + + typespec + : dataType + | objectRef + ; + + parameterName + : IDENTIFIER + ; + + array_opt + : /* empty */ + | array + ; + + parameterValue_opt + : /* empty */ + | defaultValue + { raise "Default parameter value not allowed in syntax style '{@style}'" unless @style == :wmi } + ; + + array + : "[" positiveDecimalValue_opt "]" + { result = val[1] } + ; + + positiveDecimalValue_opt + : /* empty */ + { result = -1 } + | positiveDecimalValue + ; + + defaultValue_opt + : /* empty */ + | defaultValue + ; + + defaultValue + : "=" initializer + { result = val[1] } + ; + + initializer + : constantValue + | arrayInitializer + | referenceInitializer + ; + + arrayInitializer + : "{" constantValues "}" + { result = val[1] } + ; + + constantValues + : /* empty */ + | constantValue + { result = [ val[0] ] } + | constantValues "," constantValue + { result = val[0] << val[2] } + ; + + constantValue + : integerValue + | realValue + | charValue + | string + | booleanValue + | nullValue + | instance + { raise "Instance as property value not allowed in syntax style '{@style}'" unless @style == :wmi } + ; + + integerValue + : binaryValue + | octalValue + | decimalValue + | positiveDecimalValue + | hexValue + ; + + string + : stringValue + | string stringValue + { result = val[0] + val[1] } + ; + + referenceInitializer + : objectHandle + | aliasIdentifier + ; + + objectHandle + : namespace_opt modelPath + ; + + namespace_opt + : /* empty */ + | namespaceHandle ":" + ; + + namespaceHandle + : IDENTIFIER + ; + + /* + * Note + : structure depends on type of namespace + */ + + modelPath + : className "." keyValuePairList + ; + + keyValuePairList + : keyValuePair keyValuePairs + ; + + keyValuePairs + : /* empty */ + | keyValuePairs "," keyValuePair + ; + + keyValuePair + : keyname "=" initializer + ; + + keyname + : propertyName | referenceName + ; + +/*** + * qualifierDeclaration + * + */ + + qualifierDeclaration + /* 0 1 2 3 4 */ + : QUALIFIER qualifierName qualifierType scope defaultFlavor_opt ";" + { result = CIM::QualifierDeclaration.new( val[1], val[2][0], val[2][1], val[3], val[4]) } + ; + + defaultFlavor_opt + : /* empty */ + | defaultFlavor + ; + + qualifierName + : IDENTIFIER + | ASSOCIATION /* meta qualifier */ + | INDICATION /* meta qualifier */ + | REFERENCE /* Added in DSP0004 2.7.0 */ + | SCHEMA + ; + + /* [type, value] */ + qualifierType + : ":" dataType array_opt defaultValue_opt + { type = val[2].nil? ? val[1] : CIM::Array.new(val[2],val[1]) + result = [ type, val[3] ] + } + ; + + scope + : "," SCOPE "(" metaElements ")" + { result = CIM::QualifierScopes.new(val[3]) } + ; + + metaElements + : metaElement + { result = [ val[0] ] } + | metaElements "," metaElement + { result = val[0] << val[2] } + ; + + metaElement + : SCHEMA + | CLASS + | ASSOCIATION + | INDICATION + | QUALIFIER + | PROPERTY + | REFERENCE + | METHOD + | PARAMETER + | ANY + ; + + defaultFlavor + : "," FLAVOR "(" flavors ")" + { result = CIM::QualifierFlavors.new val[3] } + ; + + flavors + : flavor + { result = [ val[0] ] } + | flavors "," flavor + { result = val[0] << val[2] } + ; + +/*** + * instanceDeclaration + * + */ + + instanceDeclaration + : instance ";" + ; + + instance + : qualifierList_opt INSTANCE OF className alias_opt "{" valueInitializers "}" + ; + + valueInitializers + : valueInitializer + | valueInitializers valueInitializer + ; + + valueInitializer + : qualifierList_opt keyname "=" initializer ";" + | qualifierList_opt keyname ";" + { raise "Instance property '#{val[1]} must have a value" unless @style == :wmi } + ; + +end # class Parser + +---- header ---- + +# parser.rb - generated by racc + +require 'strscan' +require 'rubygems' +require 'cim' +require File.join(File.dirname(__FILE__), 'result') +require File.join(File.dirname(__FILE__), 'scanner') +require File.join(File.dirname(__FILE__), 'helper') + +---- inner ---- + +# +# Initialize MOF::Parser +# MOF::Parser.new options = {} +# +# options -> Hash of options +# :debug -> boolean +# :includes -> array of include dirs +# :style -> :cim or :wmi +# +def initialize options = {} + @yydebug = options[:debug] + @includes = options[:includes] || [] + @quiet = options[:quiet] + @style = options[:style] || :cim # default to style CIM v2.2 syntax + + @lineno = 1 + @file = nil + @iconv = nil + @eol = "\n" + @fname = nil + @fstack = [] + @in_comment = false + @seen_files = [] + @qualifiers = {} +end + +# +# Make options hash from argv +# +# returns [ files, options ] +# + + def self.argv_handler name, argv + files = [] + options = { :namespace => "" } + while argv.size > 0 + case opt = argv.shift + when "-h" + $stderr.puts "Ruby MOF compiler" + $stderr.puts "#{name} [-h] [-d] [-I <dir>] [<moffiles>]" + $stderr.puts "Compiles <moffile>" + $stderr.puts "\t-d debug" + $stderr.puts "\t-h this help" + $stderr.puts "\t-I <dir> include dir" + $stderr.puts "\t-f force" + $stderr.puts "\t-n <namespace>" + $stderr.puts "\t-o <output>" + $stderr.puts "\t-s <style> syntax style (wmi,cim)" + $stderr.puts "\t-q quiet" + $stderr.puts "\t<moffiles> file(s) to read (else use $stdin)" + exit 0 + when "-f" then options[:force] = true + when "-s" then options[:style] = argv.shift.to_sym + when "-d" then options[:debug] = true + when "-q" then options[:quiet] = true + when "-I" + options[:includes] ||= [] + dirname = argv.shift + unless File.directory?(dirname) + files << dirname + dirname = File.dirname(dirname) + end + options[:includes] << Pathname.new(dirname) + when "-n" then options[:namespace] = argv.shift + when "-o" then options[:output] = argv.shift + when /^-.+/ + $stderr.puts "Undefined option #{opt}" + else + files << opt + end + end + [ files, options ] + end + +include Helper +include Scanner + +---- footer ---- diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/namae.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/namae.y new file mode 100644 index 000000000000..0378345fef89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/namae.y @@ -0,0 +1,302 @@ +# -*- ruby -*- +# vi: set ft=ruby : + +# Copyright (C) 2012 President and Fellows of Harvard College +# Copyright (C) 2013-2014 Sylvester Keil +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are +# those of the authors and should not be interpreted as representing official +# policies, either expressed or implied, of the copyright holder. + +class Namae::Parser + +token COMMA UWORD LWORD PWORD NICK AND APPELLATION TITLE SUFFIX + +expect 0 + +rule + + names : { result = [] } + | name { result = [val[0]] } + | names AND name { result = val[0] << val[2] } + + name : word { result = Name.new(:given => val[0]) } + | display_order + | honorific word { result = val[0].merge(:family => val[1]) } + | honorific display_order { result = val[1].merge(val[0]) } + | sort_order + + honorific : APPELLATION { result = Name.new(:appellation => val[0]) } + | TITLE { result = Name.new(:title => val[0]) } + + display_order : u_words word opt_suffices opt_titles + { + result = Name.new(:given => val[0], :family => val[1], + :suffix => val[2], :title => val[3]) + } + | u_words NICK last opt_suffices opt_titles + { + result = Name.new(:given => val[0], :nick => val[1], + :family => val[2], :suffix => val[3], :title => val[4]) + } + | u_words NICK von last opt_suffices opt_titles + { + result = Name.new(:given => val[0], :nick => val[1], + :particle => val[2], :family => val[3], + :suffix => val[4], :title => val[5]) + } + | u_words von last + { + result = Name.new(:given => val[0], :particle => val[1], + :family => val[2]) + } + | von last + { + result = Name.new(:particle => val[0], :family => val[1]) + } + + sort_order : last COMMA first + { + result = Name.new({ :family => val[0], :suffix => val[2][0], + :given => val[2][1] }, !!val[2][0]) + } + | von last COMMA first + { + result = Name.new({ :particle => val[0], :family => val[1], + :suffix => val[3][0], :given => val[3][1] }, !!val[3][0]) + } + | u_words von last COMMA first + { + result = Name.new({ :particle => val[0,2].join(' '), :family => val[2], + :suffix => val[4][0], :given => val[4][1] }, !!val[4][0]) + } + ; + + von : LWORD + | von LWORD { result = val.join(' ') } + | von u_words LWORD { result = val.join(' ') } + + last : LWORD | u_words + + first : opt_words { result = [nil,val[0]] } + | words opt_comma suffices { result = [val[2],val[0]] } + | suffices { result = [val[0],nil] } + | suffices COMMA words { result = [val[0],val[2]] } + + u_words : u_word + | u_words u_word { result = val.join(' ') } + + u_word : UWORD | PWORD + + words : word + | words word { result = val.join(' ') } + + opt_comma : /* empty */ | COMMA + opt_words : /* empty */ | words + + word : LWORD | UWORD | PWORD + + opt_suffices : /* empty */ | suffices + + suffices : SUFFIX + | suffices SUFFIX { result = val.join(' ') } + + opt_titles : /* empty */ | titles + + titles : TITLE + | titles TITLE { result = val.join(' ') } + +---- header +require 'singleton' +require 'strscan' + +---- inner + + include Singleton + + attr_reader :options, :input + + def initialize + @input, @options = StringScanner.new(''), { + :debug => false, + :prefer_comma_as_separator => false, + :comma => ',', + :stops => ',;', + :separator => /\s*(\band\b|\&|;)\s*/i, + :title => /\s*\b(sir|lord|count(ess)?|(gen|adm|col|maj|capt|cmdr|lt|sgt|cpl|pvt|prof|dr|md|ph\.?d)\.?)(\s+|$)/i, + :suffix => /\s*\b(JR|Jr|jr|SR|Sr|sr|[IVX]{2,})(\.|\b)/, + :appellation => /\s*\b((mrs?|ms|fr|hr)\.?|miss|herr|frau)(\s+|$)/i + } + end + + def debug? + options[:debug] || ENV['DEBUG'] + end + + def separator + options[:separator] + end + + def comma + options[:comma] + end + + def stops + options[:stops] + end + + def title + options[:title] + end + + def suffix + options[:suffix] + end + + def appellation + options[:appellation] + end + + def prefer_comma_as_separator? + options[:prefer_comma_as_separator] + end + + def parse(input) + parse!(input) + rescue => e + warn e.message if debug? + [] + end + + def parse!(string) + input.string = normalize(string) + reset + do_parse + end + + def normalize(string) + string = string.strip + string + end + + def reset + @commas, @words, @initials, @suffices, @yydebug = 0, 0, 0, 0, debug? + self + end + + private + + def stack + @vstack || @racc_vstack || [] + end + + def last_token + stack[-1] + end + + def consume_separator + return next_token if seen_separator? + @commas, @words, @initials, @suffices = 0, 0, 0, 0 + [:AND, :AND] + end + + def consume_comma + @commas += 1 + [:COMMA, :COMMA] + end + + def consume_word(type, word) + @words += 1 + + case type + when :UWORD + @initials += 1 if word =~ /^[[:upper:]]+\b/ + when :SUFFIX + @suffices += 1 + end + + [type, word] + end + + def seen_separator? + !stack.empty? && last_token == :AND + end + + def suffix? + !@suffices.zero? || will_see_suffix? + end + + def will_see_suffix? + input.peek(8).to_s.strip.split(/\s+/)[0] =~ suffix + end + + def will_see_initial? + input.peek(6).to_s.strip.split(/\s+/)[0] =~ /^[[:upper:]]+\b/ + end + + def seen_full_name? + prefer_comma_as_separator? && @words > 1 && + (@initials > 0 || !will_see_initial?) && !will_see_suffix? + end + + def next_token + case + when input.nil?, input.eos? + nil + when input.scan(separator) + consume_separator + when input.scan(/\s*#{comma}\s*/) + if @commas.zero? && !seen_full_name? || @commas == 1 && suffix? + consume_comma + else + consume_separator + end + when input.scan(/\s+/) + next_token + when input.scan(title) + consume_word(:TITLE, input.matched.strip) + when input.scan(suffix) + consume_word(:SUFFIX, input.matched.strip) + when input.scan(appellation) + [:APPELLATION, input.matched.strip] + when input.scan(/((\\\w+)?\{[^\}]*\})*[[:upper:]][^\s#{stops}]*/) + consume_word(:UWORD, input.matched) + when input.scan(/((\\\w+)?\{[^\}]*\})*[[:lower:]][^\s#{stops}]*/) + consume_word(:LWORD, input.matched) + when input.scan(/(\\\w+)?\{[^\}]*\}[^\s#{stops}]*/) + consume_word(:PWORD, input.matched) + when input.scan(/('[^'\n]+')|("[^"\n]+")/) + consume_word(:NICK, input.matched[1...-1]) + else + raise ArgumentError, + "Failed to parse name #{input.string.inspect}: unmatched data at offset #{input.pos}" + end + end + + def on_error(tid, value, stack) + raise ArgumentError, + "Failed to parse name: unexpected '#{value}' at #{stack.inspect}" + end + +# -*- racc -*- diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nasl.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nasl.y new file mode 100644 index 000000000000..c7b8e465510a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nasl.y @@ -0,0 +1,626 @@ +################################################################################ +# Copyright (c) 2011-2014, Tenable Network Security +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +################################################################################ + +class Nasl::Grammar + +preclow + right ASS_EQ ADD_EQ SUB_EQ MUL_EQ DIV_EQ MOD_EQ SLL_EQ SRA_EQ SRL_EQ + left OR + left AND + left CMP_LT CMP_GT CMP_EQ CMP_NE CMP_GE CMP_LE SUBSTR_EQ SUBSTR_NE REGEX_EQ REGEX_NE + left BIT_OR + left BIT_XOR + left AMPERSAND + left BIT_SRA BIT_SRL BIT_SLL + left ADD SUB + left MUL DIV MOD + right NOT + right UMINUS BIT_NOT + right EXP + right INCR DECR +prechigh + +# Tell the parser generator that we don't wish to use the result variable in the +# action section of rules. Instead, the result of the rule will be the value of +# evaluating the action block. +options no_result_var + +# Tell the parser generator that we expect one shift/reduce conflict due to the +# well-known dangling else problem. We could make the grammar solve this +# problem, but this is how the NASL YACC file solves it, so we'll follow suit. +expect 1 + +rule + ############################################################################## + # Aggregate Statements + ############################################################################## + + start : roots + { val[0] } + | /* Blank */ + { [] } + ; + + roots : root roots + { [val[0]] + val[1] } + | root + { [val[0]] } + ; + + root : COMMENT export + { c(*val) } + | export + { val[0] } + | COMMENT function + { c(*val) } + | function + { val[0] } + | statement + { val[0] } + ; + + statement : simple + { val[0] } + | compound + { val[0] } + ; + + ############################################################################## + # Root Statements + ############################################################################## + + export : EXPORT function + { n(:Export, *val) } + ; + + function : FUNCTION ident LPAREN params RPAREN block + { n(:Function, *val) } + | FUNCTION ident LPAREN RPAREN block + { n(:Function, *val) } + ; + + simple : assign + { val[0] } + | break + { val[0] } + | call + { val[0] } + | continue + { val[0] } + | decr + { val[0] } + | empty + { val[0] } + | COMMENT global + { c(*val) } + | global + { val[0] } + | import + { val[0] } + | include + { val[0] } + | incr + { val[0] } + | local + { val[0] } + | rep + { val[0] } + | return + { val[0] } + ; + + compound : block + { val[0] } + | for + { val[0] } + | foreach + { val[0] } + | if + { val[0] } + | repeat + { val[0] } + | while + { val[0] } + ; + + ############################################################################## + # Simple Statements + ############################################################################## + + assign : assign_exp SEMICOLON + { val[0] } + ; + + break : BREAK SEMICOLON + { n(:Break, *val) } + ; + + call : call_exp SEMICOLON + { val[0] } + ; + + continue : CONTINUE SEMICOLON + { n(:Continue, *val) } + ; + + decr : decr_exp SEMICOLON + { val[0] } + ; + + empty : SEMICOLON + { n(:Empty, *val) } + ; + + global : GLOBAL var_decls SEMICOLON + { n(:Global, *val) } + ; + + incr : incr_exp SEMICOLON + { val[0] } + ; + + import : IMPORT LPAREN string RPAREN SEMICOLON + { n(:Import, *val) } + ; + + include : INCLUDE LPAREN string RPAREN SEMICOLON + { n(:Include, *val) } + ; + + local : LOCAL var_decls SEMICOLON + { n(:Local, *val) } + ; + + rep : call_exp REP expr SEMICOLON + { n(:Repetition, *val[0..-1]) } + ; + + return : RETURN expr SEMICOLON + { n(:Return, *val) } + | RETURN ref SEMICOLON + { n(:Return, *val) } + | RETURN SEMICOLON + { n(:Return, *val) } + ; + + ############################################################################## + # Compound Statements + ############################################################################## + + block : LBRACE statements RBRACE + { n(:Block, *val) } + | LBRACE RBRACE + { n(:Block, *val) } + ; + + for : FOR LPAREN field SEMICOLON expr SEMICOLON field RPAREN statement + { n(:For, *val) } + ; + + foreach : FOREACH ident LPAREN expr RPAREN statement + { n(:Foreach, val[0], val[1], val[3], val[5]) } + | FOREACH LPAREN ident IN expr RPAREN statement + { n(:Foreach, val[0], val[2], val[4], val[6]) } + ; + + if : IF LPAREN expr RPAREN statement + { n(:If, *val) } + | IF LPAREN expr RPAREN statement ELSE statement + { n(:If, *val) } + ; + + repeat : REPEAT statement UNTIL expr SEMICOLON + { n(:Repeat, *val) } + ; + + while : WHILE LPAREN expr RPAREN statement + { n(:While, *val) } + ; + + ############################################################################## + # Expressions + ############################################################################## + + assign_exp : lval ASS_EQ expr + { n(:Assignment, *val) } + | lval ASS_EQ ref + { n(:Assignment, *val) } + | lval ADD_EQ expr + { n(:Assignment, *val) } + | lval SUB_EQ expr + { n(:Assignment, *val) } + | lval MUL_EQ expr + { n(:Assignment, *val) } + | lval DIV_EQ expr + { n(:Assignment, *val) } + | lval MOD_EQ expr + { n(:Assignment, *val) } + | lval SRL_EQ expr + { n(:Assignment, *val) } + | lval SRA_EQ expr + { n(:Assignment, *val) } + | lval SLL_EQ expr + { n(:Assignment, *val) } + ; + + call_exp : lval LPAREN args RPAREN + { n(:Call, *val) } + | lval LPAREN RPAREN + { n(:Call, *val) } + ; + + decr_exp : DECR lval + { n(:Decrement, val[0]) } + | lval DECR + { n(:Decrement, val[0]) } + ; + + incr_exp : INCR lval + { n(:Increment, val[0]) } + | lval INCR + { n(:Increment, val[0]) } + ; + + expr : LPAREN expr RPAREN + { n(:Expression, *val) } + | expr AND expr + { n(:Expression, *val) } + | NOT expr + { n(:Expression, *val) } + | expr OR expr + { n(:Expression, *val) } + | expr ADD expr + { n(:Expression, *val) } + | expr SUB expr + { n(:Expression, *val) } + | SUB expr =UMINUS + { n(:Expression, *val) } + | BIT_NOT expr + { n(:Expression, *val) } + | expr MUL expr + { n(:Expression, *val) } + | expr EXP expr + { n(:Expression, *val) } + | expr DIV expr + { n(:Expression, *val) } + | expr MOD expr + { n(:Expression, *val) } + | expr AMPERSAND expr + { n(:Expression, *val) } + | expr BIT_XOR expr + { n(:Expression, *val) } + | expr BIT_OR expr + { n(:Expression, *val) } + | expr BIT_SRA expr + { n(:Expression, *val) } + | expr BIT_SRL expr + { n(:Expression, *val) } + | expr BIT_SLL expr + { n(:Expression, *val) } + | incr_exp + { val[0] } + | decr_exp + { val[0] } + | expr SUBSTR_EQ expr + { n(:Expression, *val) } + | expr SUBSTR_NE expr + { n(:Expression, *val) } + | expr REGEX_EQ expr + { n(:Expression, *val) } + | expr REGEX_NE expr + { n(:Expression, *val) } + | expr CMP_LT expr + { n(:Expression, *val) } + | expr CMP_GT expr + { n(:Expression, *val) } + | expr CMP_EQ expr + { n(:Expression, *val) } + | expr CMP_NE expr + { n(:Expression, *val) } + | expr CMP_GE expr + { n(:Expression, *val) } + | expr CMP_LE expr + { n(:Expression, *val) } + | assign_exp + { val[0] } + | string + { val[0] } + | call_exp + { val[0] } + | lval + { val[0] } + | ip + { val[0] } + | int + { val[0] } + | undef + { val[0] } + | list_expr + { val[0] } + | array_expr + { val[0] } + ; + + ############################################################################## + # Named Components + ############################################################################## + + arg : ident COLON expr + { n(:Argument, *val) } + | ident COLON ref + { n(:Argument, *val) } + | expr + { n(:Argument, *val) } + | ref + { n(:Argument, *val) } + ; + + kv_pair : string COLON expr + { n(:KeyValuePair, *val) } + | int COLON expr + { n(:KeyValuePair, *val) } + | ident COLON expr + { n(:KeyValuePair, *val) } + | string COLON ref + { n(:KeyValuePair, *val) } + | int COLON ref + { n(:KeyValuePair, *val) } + | ident COLON ref + { n(:KeyValuePair, *val) } + ; + + kv_pairs : kv_pair COMMA kv_pairs + { [val[0]] + val[2] } + | kv_pair COMMA + { [val[0]] } + | kv_pair + { [val[0]] } + ; + + lval : ident indexes + { n(:Lvalue, *val) } + | ident + { n(:Lvalue, *val) } + ; + + ref : AT_SIGN ident + { n(:Reference, val[1]) } + ; + + ############################################################################## + # Anonymous Components + ############################################################################## + + args : arg COMMA args + { [val[0]] + val[2] } + | arg + { [val[0]] } + ; + + array_expr : LBRACE kv_pairs RBRACE + { n(:Array, *val) } + | LBRACE RBRACE + { n(:Array, *val) } + ; + + field : assign_exp + { val[0] } + | call_exp + { val[0] } + | decr_exp + { val[0] } + | incr_exp + { val[0] } + | /* Blank */ + { nil } + ; + + index : LBRACK expr RBRACK + { val[1] } + | PERIOD ident + { val[1] } + ; + + indexes : index indexes + { [val[0]] + val[1] } + | index + { [val[0]] } + ; + + list_elem : expr + { val[0] } + | ref + { val[0] } + ; + + list_elems : list_elem COMMA list_elems + { [val[0]] + val[2] } + | list_elem + { [val[0]] } + ; + + list_expr : LBRACK list_elems RBRACK + { n(:List, *val) } + | LBRACK RBRACK + { n(:List, *val) } + ; + + param : AMPERSAND ident + { n(:Parameter, val[1], 'reference') } + | ident + { n(:Parameter, val[0], 'value') } + ; + + params : param COMMA params + { [val[0]] + val[2] } + | param + { [val[0]] } + ; + + statements : statement statements + { [val[0]] + val[1] } + | statement + { [val[0]] } + ; + + var_decl : ident ASS_EQ expr + { n(:Assignment, *val) } + | ident ASS_EQ ref + { n(:Assignment, *val) } + | ident + { val[0] } + ; + + var_decls : var_decl COMMA var_decls + { [val[0]] + val[2] } + | var_decl + { [val[0]] } + ; + + ############################################################################## + # Literals + ############################################################################## + + ident : IDENT + { n(:Identifier, *val) } + | REP + { n(:Identifier, *val) } + | IN + { n(:Identifier, *val) } + ; + + int : INT_DEC + { n(:Integer, *val) } + | INT_HEX + { n(:Integer, *val) } + | INT_OCT + { n(:Integer, *val) } + | FALSE + { n(:Integer, *val) } + | TRUE + { n(:Integer, *val) } + ; + + ip : int PERIOD int PERIOD int PERIOD int + { n(:Ip, *val) } + + string : DATA + { n(:String, *val) } + | STRING + { n(:String, *val) } + ; + + undef : UNDEF + { n(:Undefined, *val) } + ; +end + +---- header ---- + +require 'nasl/parser/tree' + +require 'nasl/parser/argument' +require 'nasl/parser/array' +require 'nasl/parser/assigment' +require 'nasl/parser/block' +require 'nasl/parser/break' +require 'nasl/parser/call' +require 'nasl/parser/comment' +require 'nasl/parser/continue' +require 'nasl/parser/decrement' +require 'nasl/parser/empty' +require 'nasl/parser/export' +require 'nasl/parser/expression' +require 'nasl/parser/for' +require 'nasl/parser/foreach' +require 'nasl/parser/function' +require 'nasl/parser/global' +require 'nasl/parser/identifier' +require 'nasl/parser/if' +require 'nasl/parser/import' +require 'nasl/parser/include' +require 'nasl/parser/increment' +require 'nasl/parser/integer' +require 'nasl/parser/ip' +require 'nasl/parser/key_value_pair' +require 'nasl/parser/list' +require 'nasl/parser/local' +require 'nasl/parser/lvalue' +require 'nasl/parser/parameter' +require 'nasl/parser/reference' +require 'nasl/parser/repeat' +require 'nasl/parser/repetition' +require 'nasl/parser/return' +require 'nasl/parser/string' +require 'nasl/parser/undefined' +require 'nasl/parser/while' + +---- inner ---- + +def n(cls, *args) + begin + Nasl.const_get(cls).new(@tree, *args) + rescue + puts "An exception occurred during the creation of a #{cls} instance." + puts + puts "The arguments passed to the constructor were:" + puts args + puts + puts @tok.last.context + puts + raise + end +end + +def c(*args) + n(:Comment, *args) + args[1] +end + +def on_error(type, value, stack) + raise ParseException, "The language's grammar does not permit #{value.name} to appear here", value.context +end + +def next_token + @tok = @tkz.get_token + + if @first && @tok.first == :COMMENT + n(:Comment, @tok.last) + @tok = @tkz.get_token + end + @first = false + + return @tok +end + +def parse(env, code, path) + @first = true + @tree = Tree.new(env) + @tkz = Tokenizer.new(code, path) + @tree.concat(do_parse) +end + +---- footer ---- diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/newsyn.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/newsyn.y new file mode 100644 index 000000000000..5b670c966a0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/newsyn.y @@ -0,0 +1,25 @@ + +class A + + preclow + left preclow prechigh right left nonassoc token + right preclow prechigh right left nonassoc token + nonassoc preclow prechigh right left nonassoc token + prechigh + + convert + left 'a' + right 'b' + preclow 'c' + nonassoc 'd' + preclow 'e' + prechigh 'f' + end + +rule + + left: right nonassoc preclow prechigh + + right: A B C + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/noend.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/noend.y new file mode 100644 index 000000000000..5aa0670be05a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/noend.y @@ -0,0 +1,4 @@ +class MyParser +rule +input: A B C +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nokogiri-css.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nokogiri-css.y new file mode 100644 index 000000000000..24dfbf3b1b2c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nokogiri-css.y @@ -0,0 +1,255 @@ +class Nokogiri::CSS::Parser + +token FUNCTION INCLUDES DASHMATCH LBRACE HASH PLUS GREATER S STRING IDENT +token COMMA NUMBER PREFIXMATCH SUFFIXMATCH SUBSTRINGMATCH TILDE NOT_EQUAL +token SLASH DOUBLESLASH NOT EQUAL RPAREN LSQUARE RSQUARE HAS + +rule + selector + : selector COMMA simple_selector_1toN { + result = [val.first, val.last].flatten + } + | prefixless_combinator_selector { result = val.flatten } + | optional_S simple_selector_1toN { result = [val.last].flatten } + ; + combinator + : PLUS { result = :DIRECT_ADJACENT_SELECTOR } + | GREATER { result = :CHILD_SELECTOR } + | TILDE { result = :FOLLOWING_SELECTOR } + | DOUBLESLASH { result = :DESCENDANT_SELECTOR } + | SLASH { result = :CHILD_SELECTOR } + ; + simple_selector + : element_name hcap_0toN { + result = if val[1].nil? + val.first + else + Node.new(:CONDITIONAL_SELECTOR, [val.first, val[1]]) + end + } + | function + | function pseudo { + result = Node.new(:CONDITIONAL_SELECTOR, val) + } + | function attrib { + result = Node.new(:CONDITIONAL_SELECTOR, val) + } + | hcap_1toN { + result = Node.new(:CONDITIONAL_SELECTOR, + [Node.new(:ELEMENT_NAME, ['*']), val.first] + ) + } + ; + prefixless_combinator_selector + : combinator simple_selector_1toN { + result = Node.new(val.first, [nil, val.last]) + } + ; + simple_selector_1toN + : simple_selector combinator simple_selector_1toN { + result = Node.new(val[1], [val.first, val.last]) + } + | simple_selector S simple_selector_1toN { + result = Node.new(:DESCENDANT_SELECTOR, [val.first, val.last]) + } + | simple_selector + ; + class + : '.' IDENT { result = Node.new(:CLASS_CONDITION, [val[1]]) } + ; + element_name + : namespaced_ident + | '*' { result = Node.new(:ELEMENT_NAME, val) } + ; + namespaced_ident + : namespace '|' IDENT { + result = Node.new(:ELEMENT_NAME, + [[val.first, val.last].compact.join(':')] + ) + } + | IDENT { + name = @namespaces.key?('xmlns') ? "xmlns:#{val.first}" : val.first + result = Node.new(:ELEMENT_NAME, [name]) + } + ; + namespace + : IDENT { result = val[0] } + | + ; + attrib + : LSQUARE attrib_name attrib_val_0or1 RSQUARE { + result = Node.new(:ATTRIBUTE_CONDITION, + [val[1]] + (val[2] || []) + ) + } + | LSQUARE function attrib_val_0or1 RSQUARE { + result = Node.new(:ATTRIBUTE_CONDITION, + [val[1]] + (val[2] || []) + ) + } + | LSQUARE NUMBER RSQUARE { + # Non standard, but hpricot supports it. + result = Node.new(:PSEUDO_CLASS, + [Node.new(:FUNCTION, ['nth-child(', val[1]])] + ) + } + ; + attrib_name + : namespace '|' IDENT { + result = Node.new(:ELEMENT_NAME, + [[val.first, val.last].compact.join(':')] + ) + } + | IDENT { + # Default namespace is not applied to attributes. + # So we don't add prefix "xmlns:" as in namespaced_ident. + result = Node.new(:ELEMENT_NAME, [val.first]) + } + ; + function + : FUNCTION RPAREN { + result = Node.new(:FUNCTION, [val.first.strip]) + } + | FUNCTION expr RPAREN { + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + } + | FUNCTION nth RPAREN { + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + } + | NOT expr RPAREN { + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + } + | HAS selector RPAREN { + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + } + ; + expr + : NUMBER COMMA expr { result = [val.first, val.last] } + | STRING COMMA expr { result = [val.first, val.last] } + | IDENT COMMA expr { result = [val.first, val.last] } + | NUMBER + | STRING + | IDENT # even, odd + { + case val[0] + when 'even' + result = Node.new(:NTH, ['2','n','+','0']) + when 'odd' + result = Node.new(:NTH, ['2','n','+','1']) + when 'n' + result = Node.new(:NTH, ['1','n','+','0']) + else + # This is not CSS standard. It allows us to support this: + # assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)')) + # assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)')) + # assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)')) + result = val + end + } + ; + nth + : NUMBER IDENT PLUS NUMBER # 5n+3 -5n+3 + { + if val[1] == 'n' + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + } + | IDENT PLUS NUMBER { # n+3, -n+3 + if val[0] == 'n' + val.unshift("1") + result = Node.new(:NTH, val) + elsif val[0] == '-n' + val[0] = 'n' + val.unshift("-1") + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + } + | NUMBER IDENT { # 5n, -5n, 10n-1 + n = val[1] + if n[0, 2] == 'n-' + val[1] = 'n' + val << "-" + # b is contained in n as n is the string "n-b" + val << n[2, n.size] + result = Node.new(:NTH, val) + elsif n == 'n' + val << "+" + val << "0" + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + } + ; + pseudo + : ':' function { + result = Node.new(:PSEUDO_CLASS, [val[1]]) + } + | ':' IDENT { result = Node.new(:PSEUDO_CLASS, [val[1]]) } + ; + hcap_0toN + : hcap_1toN + | + ; + hcap_1toN + : attribute_id hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | class hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | attrib hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | pseudo hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | negation hcap_1toN { + result = Node.new(:COMBINATOR, val) + } + | attribute_id + | class + | attrib + | pseudo + | negation + ; + attribute_id + : HASH { result = Node.new(:ID, val) } + ; + attrib_val_0or1 + : eql_incl_dash IDENT { result = [val.first, val[1]] } + | eql_incl_dash STRING { result = [val.first, val[1]] } + | + ; + eql_incl_dash + : EQUAL { result = :equal } + | PREFIXMATCH { result = :prefix_match } + | SUFFIXMATCH { result = :suffix_match } + | SUBSTRINGMATCH { result = :substring_match } + | NOT_EQUAL { result = :not_equal } + | INCLUDES { result = :includes } + | DASHMATCH { result = :dash_match } + ; + negation + : NOT negation_arg RPAREN { + result = Node.new(:NOT, [val[1]]) + } + ; + negation_arg + : element_name + | element_name hcap_1toN + | hcap_1toN + ; + optional_S + : S + | + ; +end + +---- header + +require 'nokogiri/css/parser_extras' diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nonass.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nonass.y new file mode 100644 index 000000000000..b9a35a262634 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nonass.y @@ -0,0 +1,41 @@ +# +# nonassoc test +# + +class P + +preclow + nonassoc N + left P +prechigh + +rule + +target : exp +exp : exp N exp + | exp P exp + | T + +end + +---- inner + + def parse + @src = [[:T,'T'], [:N,'N'], [:T,'T'], [:N,'N'], [:T,'T']] + do_parse + end + + def next_token + @src.shift + end + +---- footer + +begin + P.new.parse +rescue ParseError + exit 0 +else + $stderr.puts 'parse error not raised: nonassoc not work' + exit 1 +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/normal.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/normal.y new file mode 100644 index 000000000000..96ae352c828a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/normal.y @@ -0,0 +1,27 @@ + +class Testp + + convert + A '2' + B '3' + end + + prechigh + left B + preclow + +rule + +/* comment */ + target: A B C nonterminal { action "string" == /regexp/o + 1 /= 3 } + ; # comment + + nonterminal: A '+' B = A; + +/* end */ +end + +---- driver + + # driver is old name diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/norule.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/norule.y new file mode 100644 index 000000000000..e50a4b347213 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/norule.y @@ -0,0 +1,4 @@ + +class A +rule +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nullbug1.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nullbug1.y new file mode 100644 index 000000000000..4b267ba0ea6f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nullbug1.y @@ -0,0 +1,25 @@ +# +# number of conflicts must be ZERO. +# + +class T + +rule + +targ : dummy + | a b c + +dummy : V v + +V : E e + | F f + | + ; + +E : + ; + +F : + ; + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nullbug2.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nullbug2.y new file mode 100644 index 000000000000..0c1d43bf3e18 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/nullbug2.y @@ -0,0 +1,15 @@ +# +# number of conflicts must be ZERO. +# + +class A +rule + targ: operation voidhead + | variable + + voidhead : void B + void: + + operation: A + variable : A +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/opal.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/opal.y new file mode 100644 index 000000000000..ae6a5a6bdd3c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/opal.y @@ -0,0 +1,1807 @@ +# Copyright (C) 2013 by Adam Beynon +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +class Opal::Parser + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP + tOROP tMATCH tNMATCH tJSDOT tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT + tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG + ARRAY_BEG tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 + tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET + tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tAWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING + tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG + tLBRACK2 tLBRACK tJSLBRACK tDSTAR + +prechigh + right tBANG tTILDE tUPLUS + right tPOW + right tUMINUS_NUM tUMINUS + left tSTAR2 tDIVIDE tPERCENT + left tPLUS tMINUS + left tLSHFT tRSHFT + left tAMPER2 + left tPIPE tCARET + left tGT tGEQ tLT tLEQ + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tANDOP + left tOROP + nonassoc tDOT2 tDOT3 + right tEH tCOLON + left kRESCUE_MOD + right tEQL tOP_ASGN + nonassoc kDEFINED + right kNOT + left kOR kAND + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + nonassoc tLBRACE_ARG + nonassoc tLOWEST +preclow + +rule + + program: top_compstmt + + top_compstmt: top_stmts opt_terms + { + result = new_compstmt val[0] + } + + top_stmts: # none + { + result = new_block + } + | top_stmt + { + result = new_block val[0] + } + | top_stmts terms top_stmt + { + val[0] << val[2] + result = val[0] + } + + top_stmt: stmt + | klBEGIN tLCURLY top_compstmt tRCURLY + { + result = val[2] + } + + bodystmt: compstmt opt_rescue opt_else opt_ensure + { + result = new_body(val[0], val[1], val[2], val[3]) + } + + compstmt: stmts opt_terms + { + result = new_compstmt val[0] + } + + stmts: # none + { + result = new_block + } + | stmt + { + result = new_block val[0] + } + | stmts terms stmt + { + val[0] << val[2] + result = val[0] + } + + stmt: kALIAS fitem + { + lexer.lex_state = :expr_fname + } + fitem + { + result = new_alias(val[0], val[1], val[3]) + } + | kALIAS tGVAR tGVAR + { + result = s(:valias, value(val[1]).to_sym, value(val[2]).to_sym) + } + | kALIAS tGVAR tBACK_REF + | kALIAS tGVAR tNTH_REF + { + result = s(:valias, value(val[1]).to_sym, value(val[2]).to_sym) + } + | kUNDEF undef_list + { + result = val[1] + } + | stmt kIF_MOD expr_value + { + result = new_if(val[1], val[2], val[0], nil) + } + | stmt kUNLESS_MOD expr_value + { + result = new_if(val[1], val[2], nil, val[0]) + } + | stmt kWHILE_MOD expr_value + { + result = new_while(val[1], val[2], val[0]) + } + | stmt kUNTIL_MOD expr_value + { + result = new_until(val[1], val[2], val[0]) + } + | stmt kRESCUE_MOD stmt + { + result = new_rescue_mod(val[1], val[0], val[2]) + } + | klEND tLCURLY compstmt tRCURLY + | lhs tEQL command_call + { + result = new_assign(val[0], val[1], val[2]) + } + | mlhs tEQL command_call + { + result = s(:masgn, val[0], s(:to_ary, val[2])) + } + | var_lhs tOP_ASGN command_call + { + result = new_op_asgn val[1], val[0], val[2] + } + | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN command_call + | primary_value tJSLBRACK aref_args tRBRACK tOP_ASGN command_call + | primary_value tDOT tIDENTIFIER tOP_ASGN command_call + { + result = s(:op_asgn2, val[0], op_to_setter(val[2]), value(val[3]).to_sym, val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN command_call + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call + | backref tOP_ASGN command_call + | lhs tEQL mrhs + { + result = new_assign val[0], val[1], s(:svalue, val[2]) + } + | mlhs tEQL arg_value + { + result = s(:masgn, val[0], s(:to_ary, val[2])) + } + | mlhs tEQL mrhs + { + result = s(:masgn, val[0], val[2]) + } + | expr + + expr: command_call + | expr kAND expr + { + result = s(:and, val[0], val[2]) + } + | expr kOR expr + { + result = s(:or, val[0], val[2]) + } + | kNOT expr + { + result = new_unary_call(['!', []], val[1]) + } + | tBANG command_call + { + result = new_unary_call(val[0], val[1]) + } + | arg + + expr_value: expr + + command_call: command + | block_command + | kRETURN call_args + { + result = new_return(val[0], val[1]) + } + | kBREAK call_args + { + result = new_break(val[0], val[1]) + } + | kNEXT call_args + { + result = new_next(val[0], val[1]) + } + + block_command: block_call + | block_call tJSDOT operation2 command_args + | block_call tDOT operation2 command_args + | block_call tCOLON2 operation2 command_args + + cmd_brace_block: tLBRACE_ARG opt_block_var compstmt tRCURLY + + command: operation command_args =tLOWEST + { + result = new_call(nil, val[0], val[1]) + } + | operation command_args cmd_brace_block + | primary_value tJSDOT operation2 command_args =tLOWEST + { + result = new_js_call(val[0], val[2], val[3]) + } + | primary_value tJSDOT operation2 command_args cmd_brace_block + | primary_value tDOT operation2 command_args =tLOWEST + { + result = new_call(val[0], val[2], val[3]) + } + | primary_value tDOT operation2 command_args cmd_brace_block + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + result = new_call(val[0], val[2], val[3]) + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + | kSUPER command_args + { + result = new_super(val[0], val[1]) + } + | kYIELD command_args + { + result = new_yield val[1] + } + + mlhs: mlhs_basic + { + result = val[0] + } + | tLPAREN mlhs_entry tRPAREN + { + result = val[1] + } + + mlhs_entry: mlhs_basic + { + result = val[0] + } + | tLPAREN mlhs_entry tRPAREN + { + result = val[1] + } + + mlhs_basic: mlhs_head + { + result = val[0] + } + | mlhs_head mlhs_item + { + result = val[0] << val[1] + } + | mlhs_head tSTAR mlhs_node + { + result = val[0] << s(:splat, val[2]) + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + | mlhs_head tSTAR + { + result = val[0] << s(:splat) + } + | mlhs_head tSTAR tCOMMA mlhs_post + | tSTAR mlhs_node + { + result = s(:array, s(:splat, val[1])) + } + | tSTAR + { + result = s(:array, s(:splat)) + } + | tSTAR tCOMMA mlhs_post + + mlhs_item: mlhs_node + { + result = val[0] + } + | tLPAREN mlhs_entry tRPAREN + { + result = val[1] + } + + mlhs_head: mlhs_item tCOMMA + { + result = s(:array, val[0]) + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1] + } + + mlhs_post: mlhs_item + | mlhs_post tCOMMA mlhs_item + + mlhs_node: variable + { + result = new_assignable val[0] + } + | primary_value tLBRACK2 aref_args tRBRACK + { + args = val[2] ? val[2] : [] + result = s(:attrasgn, val[0], :[]=, s(:arglist, *args)) + } + | primary_value tDOT tIDENTIFIER + { + result = new_call val[0], val[2], [] + } + | primary_value tCOLON2 tIDENTIFIER + | primary_value tDOT tCONSTANT + | primary_value tCOLON2 tCONSTANT + | tCOLON3 tCONSTANT + | backref + + lhs: variable + { + result = new_assignable val[0] + } + | primary_value tJSLBRACK aref_args tRBRACK + { + result = new_js_attrasgn(val[0], val[2]) + } + | primary_value tLBRACK2 aref_args tRBRACK + { + result = new_attrasgn(val[0], :[]=, val[2]) + } + | primary_value tDOT tIDENTIFIER + { + result = new_attrasgn(val[0], op_to_setter(val[2])) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = new_attrasgn(val[0], op_to_setter(val[2])) + } + | primary_value tDOT tCONSTANT + { + result = new_attrasgn(val[0], op_to_setter(val[2])) + } + | primary_value tCOLON2 tCONSTANT + { + result = new_colon2(val[0], val[1], val[2]) + } + | tCOLON3 tCONSTANT + { + result = new_colon3(val[0], val[1]) + } + | backref + + cname: tCONSTANT + + cpath: tCOLON3 cname + { + result = new_colon3(val[0], val[1]) + } + | cname + { + result = new_const(val[0]) + } + | primary_value tCOLON2 cname + { + result = new_colon2(val[0], val[1], val[2]) + } + + fname: tIDENTIFIER + | tCONSTANT + | tFID + | op + { + lexer.lex_state = :expr_end + result = val[0] + } + | reswords + { + lexer.lex_state = :expr_end + result = val[0] + } + + fitem: fname + { + result = new_sym(val[0]) + } + | symbol + + undef_list: fitem + { + result = s(:undef, val[0]) + } + | undef_list tCOMMA fitem + { + result = val[0] << val[2] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | klBEGIN | klEND | kALIAS | kAND + | kBEGIN | kBREAK | kCASE | kCLASS | kDEF | kDEFINED + | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE + | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF + | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD + | kIF_MOD | kUNLESS_MOD | kWHILE_MOD | kUNTIL_MOD | kRESCUE_MOD + | kIF | kWHILE | kUNTIL | kUNLESS + + arg: lhs tEQL arg + { + result = new_assign(val[0], val[1], val[2]) + } + | lhs tEQL arg kRESCUE_MOD arg + { + result = new_assign val[0], val[1], s(:rescue_mod, val[2], val[4]) + } + | var_lhs tOP_ASGN arg + { + result = new_op_asgn val[1], val[0], val[2] + } + | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN arg + { + result = new_op_asgn1(val[0], val[2], val[4], val[5]) + } + | primary_value tJSLBRACK aref_args tRBRACK tOP_ASGN arg + { + raise ".JS[...] #{val[4]} is not supported" + } + | primary_value tDOT tIDENTIFIER tOP_ASGN arg + { + result = s(:op_asgn2, val[0], op_to_setter(val[2]), value(val[3]).to_sym, val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN arg + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg + | tCOLON3 tCONSTANT tOP_ASGN arg + | backref tOP_ASGN arg + | arg tDOT2 arg + { + result = new_irange(val[0], val[1], val[2]) + } + | arg tDOT3 arg + { + result = new_erange(val[0], val[1], val[2]) + } + | arg tPLUS arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tMINUS arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tSTAR2 arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tDIVIDE arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tPERCENT arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tPOW arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | '-@NUM' tINTEGER tPOW arg + { + result = new_call new_binary_call(new_int(val[1]), val[2], val[3]), [:"-@", []], [] + } + | '-@NUM' tFLOAT tPOW arg + { + result = new_call new_binary_call(new_float(val[1]), val[2], val[3]), [:"-@", []], [] + } + | tUPLUS arg + { + result = new_call val[1], [:"+@", []], [] + if [:int, :float].include? val[1].type + result = val[1] + end + } + | tUMINUS arg + { + result = new_call val[1], [:"-@", []], [] + if val[1].type == :int + val[1][1] = -val[1][1] + result = val[1] + elsif val[1].type == :float + val[1][1] = -val[1][1].to_f + result = val[1] + end + } + | arg tPIPE arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tCARET arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tAMPER2 arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tCMP arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tGT arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tGEQ arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tLT arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tLEQ arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tEQ arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tEQQ arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tNEQ arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tMATCH arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tNMATCH arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | tBANG arg + { + result = new_unary_call(val[0], val[1]) + } + | tTILDE arg + { + result = new_unary_call(val[0], val[1]) + } + | arg tLSHFT arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tRSHFT arg + { + result = new_binary_call(val[0], val[1], val[2]) + } + | arg tANDOP arg + { + result = new_and(val[0], val[1], val[2]) + } + | arg tOROP arg + { + result = new_or(val[0], val[1], val[2]) + } + | kDEFINED opt_nl arg + { + result = s(:defined, val[2]) + } + | arg tEH arg tCOLON arg + { + result = new_if(val[1], val[0], val[2], val[4]) + } + | primary + + arg_value: arg + + aref_args: none + { + result = nil + } + | command opt_nl + { + result = [val[0]] + } + | args trailer + { + result = val[0] + } + | args tCOMMA assocs trailer + { + val[0] << s(:hash, *val[2]) + result = val[0] + } + | assocs trailer + { + result = [s(:hash, *val[0])] + } + + paren_args: tLPAREN2 opt_call_args rparen + { + result = val[1] + } + + rparen: opt_nl tRPAREN + + opt_paren_args: none + { + result = [] + } + | paren_args + + opt_call_args: none + { + result = [] + } + | call_args + | args tCOMMA + { + result = val[0] + } + | args tCOMMA assocs tCOMMA + { + result = val[0] + result << new_hash(nil, val[2], nil) + } + | assocs tCOMMA + { + result = [new_hash(nil, val[0], nil)] + } + + call_args: command + { + result = [val[0]] + } + | args opt_block_arg + { + result = val[0] + add_block_pass val[0], val[1] + } + | assocs opt_block_arg + { + result = [new_hash(nil, val[0], nil)] + add_block_pass result, val[1] + } + | args tCOMMA assocs opt_block_arg + { + result = val[0] + result << new_hash(nil, val[2], nil) + result << val[3] if val[3] + } + | block_arg + { + result = [] + add_block_pass result, val[0] + } + + call_args2: arg_value tCOMMA args opt_block_arg + | block_arg + + command_args: { + lexer.cmdarg_push 1 + } + open_args + { + lexer.cmdarg_pop + result = val[1] + } + + open_args: call_args + | tLPAREN_ARG tRPAREN + { + result = nil + } + | tLPAREN_ARG call_args2 tRPAREN + { + result = val[1] + } + + block_arg: tAMPER arg_value + { + result = new_block_pass(val[0], val[1]) + } + + opt_block_arg: tCOMMA block_arg + { + result = val[1] + } + | # none + { + result = nil + } + + args: arg_value + { + result = [val[0]] + } + | tSTAR arg_value + { + result = [new_splat(val[0], val[1])] + } + | args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << new_splat(val[2], val[3]) + } + + mrhs: args tCOMMA arg_value + { + val[0] << val[2] + result = s(:array, *val[0]) + } + | args tCOMMA tSTAR arg_value + { + val[0] << s(:splat, val[3]) + result = s(:array, *val[0]) + } + | tSTAR arg_value + { + result = s(:splat, val[1]) + } + + primary: literal + | strings + | xstring + | regexp + | words + | awords + | var_ref + | backref + | tFID + | kBEGIN + { + result = lexer.line + } + bodystmt kEND + { + result = s(:begin, val[2]) + } + | tLPAREN_ARG expr opt_nl tRPAREN + { + result = val[1] + } + | tLPAREN compstmt tRPAREN + { + result = new_paren(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = new_colon2(val[0], val[1], val[2]) + } + | tCOLON3 tCONSTANT + { + result = new_colon3(val[0], val[1]) + } + | primary_value tLBRACK2 aref_args tRBRACK + { + result = new_call val[0], [:[], []], val[2] + } + | primary_value tJSLBRACK aref_args tRBRACK + { + result = new_js_call val[0], [:[], []], val[2] + } + | tLBRACK aref_args tRBRACK + { + result = new_array(val[0], val[1], val[2]) + } + | tLBRACE assoc_list tRCURLY + { + result = new_hash(val[0], val[1], val[2]) + } + | kRETURN + { + result = new_return(val[0]) + } + | kYIELD tLPAREN2 call_args tRPAREN + { + result = new_yield val[2] + } + | kYIELD tLPAREN2 tRPAREN + { + result = s(:yield) + } + | kYIELD + { + result = s(:yield) + } + | kDEFINED opt_nl tLPAREN2 expr tRPAREN + { + result = s(:defined, val[3]) + } + | kNOT tLPAREN2 expr tRPAREN + { + result = new_unary_call(['!', []], val[2]) + } + | kNOT tLPAREN2 tRPAREN + { + result = new_unary_call(['!', []], new_nil(val[0])) + } + | operation brace_block + { + result = new_call(nil, val[0], []) + result << val[1] + } + | method_call + | method_call brace_block + { + val[0] << val[1] + result = val[0] + } + | tLAMBDA lambda + { + result = val[1] + } + | kIF expr_value then compstmt if_tail kEND + { + result = new_if(val[0], val[1], val[3], val[4]) + } + | kUNLESS expr_value then compstmt opt_else kEND + { + result = new_if(val[0], val[1], val[4], val[3]) + } + | kWHILE + { + lexer.cond_push 1 + result = lexer.line + } + expr_value do + { + lexer.cond_pop + } + compstmt kEND + { + result = s(:while, val[2], val[5]) + } + | kUNTIL + { + lexer.cond_push 1 + result = lexer.line + } + expr_value do + { + lexer.cond_pop + } + compstmt kEND + { + result = s(:until, val[2], val[5]) + } + | kCASE expr_value opt_terms case_body kEND + { + result = s(:case, val[1], *val[3]) + } + | kCASE opt_terms case_body kEND + { + result = s(:case, nil, *val[2]) + } + | kCASE opt_terms kELSE compstmt kEND + { + result = s(:case, nil, val[3]) + } + | kFOR for_var kIN + { + lexer.cond_push 1 + result = lexer.line + } + expr_value do + { + lexer.cond_pop + } + compstmt kEND + { + result = s(:for, val[4], val[1], val[7]) + } + | kCLASS cpath superclass + { + # ... + } + bodystmt kEND + { + result = new_class val[0], val[1], val[2], val[4], val[5] + } + | kCLASS tLSHFT + { + result = lexer.line + } + expr term + { + # ... + } + bodystmt kEND + { + result = new_sclass(val[0], val[3], val[6], val[7]) + } + | kMODULE + { + result = lexer.line + } + cpath + { + # ... + } + bodystmt kEND + { + result = new_module(val[0], val[2], val[4], val[5]) + } + | kDEF fname + { + push_scope + lexer.lex_state = :expr_endfn + } + f_arglist bodystmt kEND + { + result = new_def(val[0], nil, val[1], val[3], val[4], val[5]) + pop_scope + } + | kDEF singleton dot_or_colon + { + lexer.lex_state = :expr_fname + } + fname + { + push_scope + lexer.lex_state = :expr_endfn + } + f_arglist bodystmt kEND + { + result = new_def(val[0], val[1], val[4], val[6], val[7], val[8]) + pop_scope + } + | kBREAK + { + result = new_break(val[0]) + } + | kNEXT + { + result = s(:next) + } + | kREDO + { + result = s(:redo) + } + | kRETRY + + primary_value: primary + + then: term + | tCOLON + | kTHEN + | term kTHEN + + do: term + | tCOLON + | kDO_COND + + lambda: f_larglist lambda_body + { + result = new_call nil, [:lambda, []], [] + result << new_iter(val[0], val[1]) + } + + f_larglist: tLPAREN2 block_param tRPAREN + { + result = val[1] + } + | tLPAREN2 tRPAREN + { + result = nil + } + | block_param + | none + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = val[1] + } + | kDO_LAMBDA compstmt kEND + { + result = val[1] + } + + if_tail: opt_else + { + result = val[0] + } + | kELSIF expr_value then compstmt if_tail + { + result = new_if(val[0], val[1], val[3], val[4]) + } + + opt_else: none + | kELSE compstmt + { + result = val[1] + } + + f_block_optarg: f_block_opt + { + result = s(:block, val[0]) + } + | f_block_optarg tCOMMA f_block_opt + { + val[0] << val[2] + result = val[0] + } + + f_block_opt: tIDENTIFIER tEQL primary_value + { + result = new_assign(new_assignable(new_ident( + val[0])), val[1], val[2]) + } + + opt_block_var: none + | tPIPE tPIPE + { + result = nil + } + | tOROP + { + result = nil + } + | tPIPE block_param tPIPE + { + result = val[1] + } + + block_args_tail: f_block_arg + { + result = val[0] + } + +opt_block_args_tail: tCOMMA block_args_tail + { + result = val[1] + } + | none + { + nil + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = new_block_args(val[0], val[2], val[4], val[5]) + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = new_block_args(val[0], val[2], nil, val[3]) + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = new_block_args(val[0], nil, val[2], val[3]) + } + | f_arg tCOMMA + { + result = new_block_args(val[0], nil, nil, nil) + } + | f_arg opt_block_args_tail + { + result = new_block_args(val[0], nil, nil, val[1]) + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = new_block_args(nil, val[0], val[2], val[3]) + } + | f_block_optarg opt_block_args_tail + { + result = new_block_args(nil, val[0], nil, val[1]) + } + | f_rest_arg opt_block_args_tail + { + result = new_block_args(nil, nil, val[0], val[1]) + } + | block_args_tail + { + result = new_block_args(nil, nil, nil, val[0]) + } + + do_block: kDO_BLOCK + { + push_scope :block + result = lexer.line + } + opt_block_var compstmt kEND + { + result = new_iter val[2], val[3] + pop_scope + } + + block_call: command do_block + { + val[0] << val[1] + result = val[0] + } + | block_call tJSDOT operation2 opt_paren_args + | block_call tDOT operation2 opt_paren_args + | block_call tCOLON2 operation2 opt_paren_args + + method_call: operation paren_args + { + result = new_call(nil, val[0], val[1]) + } + | primary_value tDOT operation2 opt_paren_args + { + result = new_call(val[0], val[2], val[3]) + } + | primary_value tJSDOT operation2 opt_paren_args + { + result = new_js_call(val[0], val[2], val[3]) + } + | primary_value tDOT paren_args + { + result = new_call(val[0], [:call, []], val[2]) + } + | primary_value tCOLON2 operation2 paren_args + { + result = new_call(val[0], val[2], val[3]) + } + | primary_value tCOLON2 operation3 + { + result = new_call(val[0], val[2]) + } + | kSUPER paren_args + { + result = new_super(val[0], val[1]) + } + | kSUPER + { + result = new_super(val[0], nil) + } + + brace_block: tLCURLY + { + push_scope :block + result = lexer.line + } + opt_block_var compstmt tRCURLY + { + result = new_iter val[2], val[3] + pop_scope + } + | kDO + { + push_scope :block + result = lexer.line + } + opt_block_var compstmt kEND + { + result = new_iter val[2], val[3] + pop_scope + } + + case_body: kWHEN + { + result = lexer.line + } + args then compstmt cases + { + part = s(:when, s(:array, *val[2]), val[4]) + result = [part] + result.push(*val[5]) if val[5] + } + + cases: opt_else + { + result = [val[0]] + } + | case_body + + opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue + { + exc = val[1] || s(:array) + exc << new_assign(val[2], val[2], s(:gvar, '$!'.intern)) if val[2] + result = [s(:resbody, exc, val[4])] + result.push val[5].first if val[5] + } + | # none + { + result = nil + } + + exc_list: arg_value + { + result = s(:array, val[0]) + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = val[1] + } + | none + { + result = nil + } + + opt_ensure: kENSURE compstmt + { + result = val[1].nil? ? s(:nil) : val[1] + } + | none + + literal: numeric + | symbol + | dsym + + strings: string + { + result = new_str val[0] + } + + string: string1 + | string string1 + { + result = str_append val[0], val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + result = val[1] + } + | tSTRING + { + result = s(:str, value(val[0])) + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = new_xstr(val[0], val[1], val[2]) + } + + regexp: tREGEXP_BEG xstring_contents tREGEXP_END + { + result = new_regexp val[1], val[2] + } + + words: tWORDS_BEG tSPACE tSTRING_END + { + result = s(:array) + } + | tWORDS_BEG word_list tSTRING_END + { + result = val[1] + } + + word_list: none + { + result = s(:array) + } + | word_list word tSPACE + { + part = val[1] + part = s(:dstr, "", val[1]) if part.type == :evstr + result = val[0] << part + } + + word: string_content + { + result = val[0] + } + | word string_content + { + result = val[0].concat([val[1]]) + } + + awords: tAWORDS_BEG tSPACE tSTRING_END + { + result = s(:array) + } + | tAWORDS_BEG qword_list tSTRING_END + { + result = val[1] + } + + qword_list: none + { + result = s(:array) + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0] << s(:str, value(val[1])) + } + + string_contents: none + { + result = nil + } + | string_contents string_content + { + result = str_append val[0], val[1] + } + +xstring_contents: none + { + result = nil + } + | xstring_contents string_content + { + result = str_append val[0], val[1] + } + + string_content: tSTRING_CONTENT + { + result = new_str_content(val[0]) + } + | tSTRING_DVAR + { + result = lexer.strterm + lexer.strterm = nil + } + string_dvar + { + lexer.strterm = val[1] + result = new_evstr(val[2]) + } + | tSTRING_DBEG + { + lexer.cond_push 0 + lexer.cmdarg_push 0 + result = lexer.strterm + lexer.strterm = nil + lexer.lex_state = :expr_beg + } + compstmt tRCURLY + { + lexer.strterm = val[1] + lexer.cond_lexpop + lexer.cmdarg_lexpop + result = new_evstr(val[2]) + } + + string_dvar: tGVAR + { + result = new_gvar(val[0]) + } + | tIVAR + { + result = new_ivar(val[0]) + } + | tCVAR + { + result = new_cvar(val[0]) + } + | backref + + + symbol: tSYMBEG sym + { + result = new_sym(val[1]) + lexer.lex_state = :expr_end + } + | tSYMBOL + { + result = new_sym(val[0]) + } + + sym: fname + | tIVAR + | tGVAR + | tCVAR + + dsym: tSYMBEG xstring_contents tSTRING_END + { + result = new_dsym val[1] + } + + numeric: tINTEGER + { + result = new_int(val[0]) + } + | tFLOAT + { + result = new_float(val[0]) + } + | '-@NUM' tINTEGER =tLOWEST + { + result = negate_num(new_int(val[1])) + } + | '-@NUM' tFLOAT =tLOWEST + { + result = negate_num(new_float(val[1])) + } + | '+@NUM' tINTEGER =tLOWEST + { + result = new_int(val[1]) + } + | '+@NUM' tFLOAT =tLOWEST + { + result = new_float(val[1]) + } + + variable: tIDENTIFIER + { + result = new_ident(val[0]) + } + | tIVAR + { + result = new_ivar(val[0]) + } + | tGVAR + { + result = new_gvar(val[0]) + } + | tCONSTANT + { + result = new_const(val[0]) + } + | tCVAR + { + result = new_cvar(val[0]) + } + | kNIL + { + result = new_nil(val[0]) + } + | kSELF + { + result = new_self(val[0]) + } + | kTRUE + { + result = new_true(val[0]) + } + | kFALSE + { + result = new_false(val[0]) + } + | k__FILE__ + { + result = new___FILE__(val[0]) + } + | k__LINE__ + { + result = new___LINE__(val[0]) + } + + var_ref: variable + { + result = new_var_ref(val[0]) + } + + var_lhs: variable + { + result = new_assignable val[0] + } + + backref: tNTH_REF + { + result = s(:nth_ref, value(val[0])) + } + | tBACK_REF + + superclass: term + { + result = nil + } + | tLT expr_value term + { + result = val[1] + } + | error term + { + result = nil + } + + f_arglist: tLPAREN2 f_args opt_nl tRPAREN + { + result = val[1] + lexer.lex_state = :expr_beg + } + | f_args term + { + result = val[0] + lexer.lex_state = :expr_beg + } + + kwrest_mark: tPOW + | tDSTAR + + f_kwrest: kwrest_mark tIDENTIFIER + { + result = new_kwrestarg(val[1]) + } + | kwrest_mark + { + result = new_kwrestarg() + } + + f_label: tLABEL + { + result = new_sym(val[0]) + } + + f_kw: f_label arg_value + { + result = new_kwoptarg(val[0], val[1]) + } + | f_label + { + result = new_kwarg(val[0]) + } + + f_kwarg: f_kw + { + result = [val[0]] + } + | f_kwarg tCOMMA f_kw + { + result = val[0] + result << val[2] + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = new_args_tail(val[0], val[2], val[3]) + } + | f_kwarg opt_f_block_arg + { + result = new_args_tail(val[0], nil, val[1]) + } + | f_kwrest opt_f_block_arg + { + result = new_args_tail(nil, val[0], val[1]) + } + | f_block_arg + { + result = new_args_tail(nil, nil, val[0]) + } + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | # none + { + result = new_args_tail(nil, nil, nil) + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = new_args(val[0], val[2], val[4], val[5]) + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = new_args(val[0], val[2], nil, val[3]) + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = new_args(val[0], nil, val[2], val[3]) + } + | f_arg opt_args_tail + { + result = new_args(val[0], nil, nil, val[1]) + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = new_args(nil, val[0], val[2], val[3]) + } + | f_optarg opt_args_tail + { + result = new_args(nil, val[0], nil, val[1]) + } + | f_rest_arg opt_args_tail + { + result = new_args(nil, nil, val[0], val[1]) + } + | args_tail + { + result = new_args(nil, nil, nil, val[0]) + } + | # none + { + result = new_args(nil, nil, nil, nil) + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + result = value(val[0]).to_sym + scope.add_local result + } + + f_bad_arg: tCONSTANT + { + raise 'formal argument cannot be a constant' + } + | tIVAR + { + raise 'formal argument cannot be an instance variable' + } + | tCVAR + { + raise 'formal argument cannot be a class variable' + } + | tGVAR + { + raise 'formal argument cannot be a global variable' + } + + f_arg_item: f_norm_arg + { + result = val[0] + } + | tLPAREN f_margs tRPAREN + { + result = val[1] + } + + for_var: lhs + | mlhs + + f_marg: f_norm_arg + { + result = s(:lasgn, val[0]) + } + | tLPAREN f_margs tRPAREN + + f_marg_list: f_marg + { + result = s(:array, val[0]) + } + | f_marg_list tCOMMA f_marg + { + val[0] << val[2] + result = val[0] + } + + f_margs: f_marg_list + | f_marg_list tCOMMA tSTAR f_norm_arg + | f_marg_list tCOMMA tSTAR + | tSTAR f_norm_arg + | tSTAR + + f_arg: f_arg_item + { + result = [val[0]] + } + | f_arg tCOMMA f_arg_item + { + val[0] << val[2] + result = val[0] + } + + f_opt: tIDENTIFIER tEQL arg_value + { + result = new_assign(new_assignable(new_ident(val[0])), val[1], val[2]) + } + + f_optarg: f_opt + { + result = s(:block, val[0]) + } + | f_optarg tCOMMA f_opt + { + result = val[0] + val[0] << val[2] + } + + restarg_mark: tSTAR2 + | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + result = "*#{value(val[1])}".to_sym + } + | restarg_mark + { + result = :"*" + } + + blkarg_mark: tAMPER2 + | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + result = "&#{value(val[1])}".to_sym + } + + opt_f_block_arg: tCOMMA f_block_arg + { + result = val[1] + } + | # none + { + result = nil + } + + singleton: var_ref + { + result = val[0] + } + | tLPAREN2 expr opt_nl tRPAREN + { + result = val[1] + } + + assoc_list: # none + { + result = [] + } + | assocs trailer + { + result = val[0] + } + + assocs: assoc + { + result = val[0] + } + | assocs tCOMMA assoc + { + result = val[0].push(*val[2]) + } + + assoc: arg_value tASSOC arg_value + { + result = [val[0], val[2]] + } + | tLABEL arg_value + { + result = [new_sym(val[0]), val[1]] + } + + operation: tIDENTIFIER + | tCONSTANT + | tFID + + operation2: tIDENTIFIER + | tCONSTANT + | tFID + | op + + operation3: tIDENTIFIER + | tFID + | op + + dot_or_colon: tDOT + | tCOLON2 + + opt_terms: # none + | terms + + opt_nl: # none + | tNL + + trailer: # none + | tNL + | tCOMMA + + term: tSEMI + | tNL + + terms: term + | terms tSEMI + + none: # none + { + result = nil + } +end + +---- inner diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/opt.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/opt.y new file mode 100644 index 000000000000..a011953a5182 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/opt.y @@ -0,0 +1,123 @@ +# +# check options working +# + +class Calcp + + prechigh + left '*' '/' + left '+' '-' + preclow + + convert + NUMBER 'Number' + end + + options no_omit_action_call no_result_var + +rule + + target : exp | /* none */ { 0 } ; + + exp : exp '+' exp { chk(val[0] + val[2]) } + | exp '-' exp { chk(val[0] - val[2]) } + | exp '*' exp { chk(val[0] * val[2]) } + | exp '/' exp { chk(val[0] / val[2]) } + | '(' { $emb = true } exp ')' + { + raise 'must not happen' unless $emb + val[2] + } + | '-' NUMBER { -val[1] } + | NUMBER + ; + +end + +----header + +class Number; end + +----inner + + def parse( src ) + @src = src + do_parse + end + + def next_token + @src.shift + end + + def initialize + @yydebug = true + end + + def chk( i ) + # p i + i + end + +----footer + +$parser = Calcp.new +$test_number = 1 + +def chk( src, ans ) + result = $parser.parse(src) + raise "test #{$test_number} failed" unless result == ans + $test_number += 1 +end + +chk( + [ [Number, 9], + [false, false], + [false, false] ], 9 +) + +chk( + [ [Number, 5], + ['*', nil], + [Number, 1], + ['-', nil], + [Number, 1], + ['*', nil], + [Number, 8], + [false, false], + [false, false] ], -3 +) + +chk( + [ [Number, 5], + ['+', nil], + [Number, 2], + ['-', nil], + [Number, 5], + ['+', nil], + [Number, 2], + ['-', nil], + [Number, 5], + [false, false], + [false, false] ], -1 +) + +chk( + [ ['-', nil], + [Number, 4], + [false, false], + [false, false] ], -4 +) + +chk( + [ [Number, 7], + ['*', nil], + ['(', nil], + [Number, 4], + ['+', nil], + [Number, 3], + [')', nil], + ['-', nil], + [Number, 9], + [false, false], + [false, false] ], 40 +) diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/percent.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/percent.y new file mode 100644 index 000000000000..68d63583caa6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/percent.y @@ -0,0 +1,35 @@ +class ScannerChecker +rule + target: A + { + i = 7 + i %= 4 + raise 'assert failed' unless i == 3 + tmp = %-This is percent string.- + raise 'assert failed' unless tmp == 'This is percent string.' + a = 5; b = 3 + assert_equal(2,(a%b)) #A + # assert_equal(2,(a %b)) # is %-string + assert_equal(2,(a% b)) #B + assert_equal(2,(a % b)) #C + } +end + +---- inner ---- + + def parse + @q = [[:A, 'A'], [false, '$']] + do_parse + end + + def next_token + @q.shift + end + + def assert_equal( expect, real ) + raise "expect #{expect.inspect} but #{real.inspect}" unless expect == real + end + +---- footer ---- + +parser = ScannerChecker.new.parse diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/php_serialization.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/php_serialization.y new file mode 100644 index 000000000000..99f78f20815b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/php_serialization.y @@ -0,0 +1,98 @@ +# MIT License +# See https://github.com/divoxx/ruby-php-serialization/blob/master/LICENSE.txt + +class PhpSerialization::Unserializer +rule + + data : null ';' { @object = val[0] } + | bool ';' { @object = val[0] } + | integer ';' { @object = val[0] } + | double ';' { @object = val[0] } + | string ';' { @object = val[0] } + | assoc_array { @object = val[0] } + | object { @object = val[0] } + ; + + null : 'N' { result = nil } + ; + + bool : 'b' ':' NUMBER { result = Integer(val[2]) > 0 } + ; + + integer : 'i' ':' NUMBER { result = Integer(val[2]) } + ; + + double : 'd' ':' NUMBER { result = Float(val[2]) } + ; + + string : 's' ':' NUMBER ':' STRING { result = val[4] } + ; + + object : 'O' ':' NUMBER ':' STRING ':' NUMBER ':' '{' attribute_list '}' + { + if eval("defined?(#{val[4]})") + result = Object.const_get(val[4]).new + + val[9].each do |(attr_name, value)| + # Protected and private attributes will have a \0..\0 prefix + attr_name = attr_name.gsub(/\A\\0[^\\]+\\0/, '') + result.instance_variable_set("@#{attr_name}", value) + end + else + klass_name = val[4].gsub(/^Struct::/, '') + attr_names, values = [], [] + + val[9].each do |(attr_name, value)| + # Protected and private attributes will have a \0..\0 prefix + attr_names << attr_name.gsub(/\A\\0[^\\]+\\0/, '') + values << value + end + + result = Struct.new(klass_name, *attr_names).new(*values) + result.instance_variable_set("@_php_class", klass_name) + end + } + ; + + attribute_list : attribute_list attribute { result = val[0] << val[1] } + | { result = [] } + ; + + attribute : data data { result = val } + ; + + assoc_array : 'a' ':' NUMBER ':' '{' attribute_list '}' + { + # Checks if the keys are a sequence of integers + idx = -1 + arr = val[5].all? { |(k,v)| k == (idx += 1) } + + if arr + result = val[5].map { |(k,v)| v } + else + result = Hash[val[5]] + end + } + ; + +end + +---- header ---- +require 'php_serialization/tokenizer' + +---- inner ---- + def initialize(tokenizer_klass = Tokenizer) + @tokenizer_klass = tokenizer_klass + end + + def run(string) + @tokenizer = @tokenizer_klass.new(string) + yyparse(@tokenizer, :each) + return @object + ensure + @tokenizer = nil + end + + def next_token + @tokenizer.next_token + end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/recv.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/recv.y new file mode 100644 index 000000000000..b6e849dda98b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/recv.y @@ -0,0 +1,97 @@ +# s/r 5, r/r 10 +class A +rule + + content: RecvH received + ; + + datetime: day + ; + + msgid: '<' spec '>'; + + day: + | ATOM ',' + ; + + received: recvitem_list recvdatetime + ; + + recvitem_list: + | recvitem_list recvitem + ; + + recvitem: by | via | with | for ; + + by: + | BY domain + ; + + via: + | VIA ATOM + ; + + with: WITH ATOM + ; + + for: + | FOR addr + ; + + recvdatetime: + | ';' datetime + ; + + addr: mbox | group ; + + mboxes: mbox + | mboxes ',' mbox + ; + + mbox: spec + | routeaddr + | phrase routeaddr + ; + + group: phrase ':' mboxes ';' + ; + + routeaddr: '<' route spec '>' + | '<' spec '>' + ; + + route: at_domains ':' ; + + at_domains: '@' domain + | at_domains ',' '@' domain + ; + + spec: local '@' domain + | local + ; + + local: word + | local '.' word + ; + + domain: domword + | domain '.' domword + ; + + domword: atom + | DOMLIT + | DIGIT + ; + + phrase: word + | phrase word + ; + + word: atom + | QUOTED + | DIGIT + ; + + atom: ATOM | FROM | BY | VIA | WITH | ID | FOR ; + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/riml.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/riml.y new file mode 100644 index 000000000000..1d99b0fdb8f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/riml.y @@ -0,0 +1,665 @@ +# Copyright (c) 2012-2014 by Luke Gruber +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class Riml::Parser + +token IF ELSE ELSEIF THEN UNLESS END +token WHILE UNTIL BREAK CONTINUE +token TRY CATCH FINALLY +token FOR IN +token DEF DEF_BANG SPLAT_PARAM SPLAT_ARG CALL BUILTIN_COMMAND # such as echo "hi" +token CLASS NEW DEFM DEFM_BANG SUPER +token RIML_FILE_COMMAND RIML_CLASS_COMMAND +token RETURN +token NEWLINE +token NUMBER +token STRING_D STRING_S # single- and double-quoted +token EX_LITERAL +token REGEXP +token TRUE FALSE +token LET UNLET UNLET_BANG IDENTIFIER +token DICT_VAL # like dict.key, 'key' is a DICT_VAL +token SCOPE_MODIFIER SCOPE_MODIFIER_LITERAL SPECIAL_VAR_PREFIX +token FINISH + +prechigh + right '!' + left '*' '/' '%' + left '+' '-' '.' + left '>' '>#' '>?' '<' '<#' '<?' '>=' '>=#' '>=?' '<=' '<=#' '<=?' + left '==' '==?' '==#' '=~' '=~?' '=~#' '!~' '!~?' '!~#' '!=' '!=?' '!=#' + left IS ISNOT + left '&&' + left '||' + right '?' + right '=' '+=' '-=' '.=' + left ',' + left IF UNLESS +preclow + +# All rules +rule + + Root: + /* nothing */ { result = make_node(val) { |_| Riml::Nodes.new([]) } } + | Terminator { result = make_node(val) { |_| Riml::Nodes.new([]) } } + | Statements { result = val[0] } + ; + + # any list of expressions + Statements: + Statement { result = make_node(val) { |v| Riml::Nodes.new([ v[0] ]) } } + | Statements Terminator Statement { result = val[0] << val[2] } + | Statements Terminator { result = val[0] } + | Terminator Statements { result = make_node(val) { |v| Riml::Nodes.new(v[1]) } } + ; + + # All types of expressions in Riml + Statement: + ExplicitCall { result = val[0] } + | Def { result = val[0] } + | Return { result = val[0] } + | UnletVariable { result = val[0] } + | ExLiteral { result = val[0] } + | For { result = val[0] } + | While { result = val[0] } + | Until { result = val[0] } + | Try { result = val[0] } + | ClassDefinition { result = val[0] } + | LoopKeyword { result = val[0] } + | EndScript { result = val[0] } + | RimlFileCommand { result = val[0] } + | RimlClassCommand { result = val[0] } + | MultiAssign { result = val[0] } + | If { result = val[0] } + | Unless { result = val[0] } + | Expression { result = val[0] } + ; + + Expression: + ExpressionWithoutDictLiteral { result = val[0] } + | Dictionary { result = val[0] } + | Dictionary DictGetWithDotLiteral { result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } } + | BinaryOperator { result = val[0] } + | Ternary { result = val[0] } + | Assign { result = val[0] } + | Super { result = val[0] } + | '(' Expression ')' { result = make_node(val) { |v| Riml::WrapInParensNode.new(v[1]) } } + ; + + ExpressionWithoutDictLiteral: + UnaryOperator { result = val[0] } + | DictGet { result = val[0] } + | ListOrDictGet { result = val[0] } + | AllVariableRetrieval { result = val[0] } + | LiteralWithoutDictLiteral { result = val[0] } + | Call { result = val[0] } + | ObjectInstantiation { result = val[0] } + | '(' ExpressionWithoutDictLiteral ')' { result = make_node(val) { |v| Riml::WrapInParensNode.new(v[1]) } } + ; + + # for inside curly-brace variable names + PossibleStringValue: + String { result = val[0] } + | DictGet { result = val[0] } + | ListOrDictGet { result = val[0] } + | AllVariableRetrieval { result = val[0] } + | BinaryOperator { result = val[0] } + | Ternary { result = val[0] } + | Call { result = val[0] } + ; + + Terminator: + NEWLINE { result = nil } + | ';' { result = nil } + ; + + LiteralWithoutDictLiteral: + Number { result = val[0] } + | String { result = val[0] } + | Regexp { result = val[0] } + | List { result = val[0] } + | ScopeModifierLiteral { result = val[0] } + | TRUE { result = make_node(val) { |_| Riml::TrueNode.new } } + | FALSE { result = make_node(val) { |_| Riml::FalseNode.new } } + ; + + Number: + NUMBER { result = make_node(val) { |v| Riml::NumberNode.new(v[0]) } } + ; + + String: + STRING_S { result = make_node(val) { |v| Riml::StringNode.new(v[0], :s) } } + | STRING_D { result = make_node(val) { |v| Riml::StringNode.new(v[0], :d) } } + | String STRING_S { result = make_node(val) { |v| Riml::StringLiteralConcatNode.new(v[0], Riml::StringNode.new(v[1], :s)) } } + | String STRING_D { result = make_node(val) { |v| Riml::StringLiteralConcatNode.new(v[0], Riml::StringNode.new(v[1], :d)) } } + ; + + Regexp: + REGEXP { result = make_node(val) { |v| Riml::RegexpNode.new(v[0]) } } + ; + + ScopeModifierLiteral: + SCOPE_MODIFIER_LITERAL { result = make_node(val) { |v| Riml::ScopeModifierLiteralNode.new(v[0]) } } + ; + + List: + ListLiteral { result = make_node(val) { |v| Riml::ListNode.new(v[0]) } } + ; + + ListUnpack: + '[' ListItems ';' Expression ']' { result = make_node(val) { |v| Riml::ListUnpackNode.new(v[1] << v[3]) } } + ; + + ListLiteral: + '[' ListItems ']' { result = val[1] } + | '[' ListItems ',' ']' { result = val[1] } + ; + + ListItems: + /* nothing */ { result = [] } + | Expression { result = [val[0]] } + | ListItems ',' Expression { result = val[0] << val[2] } + ; + + Dictionary: + DictionaryLiteral { result = make_node(val) { |v| Riml::DictionaryNode.new(v[0]) } } + ; + + # {'key': 'value', 'key2': 'value2'} + # Save as [['key', 'value'], ['key2', 'value2']] because ruby-1.8.7 offers + # no guarantee for key-value pair ordering. + DictionaryLiteral: + '{' DictItems '}' { result = val[1] } + | '{' DictItems ',' '}' { result = val[1] } + ; + + # [[key, value], [key, value]] + DictItems: + /* nothing */ { result = [] } + | DictItem { result = val } + | DictItems ',' DictItem { result = val[0] << val[2] } + ; + + # [key, value] + DictItem: + Expression ':' Expression { result = [val[0], val[2]] } + ; + + DictGet: + AllVariableRetrieval DictGetWithDot { result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } } + | ListOrDictGet DictGetWithDot { result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } } + | Call DictGetWithDot { result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } } + | '(' Expression ')' DictGetWithDot { result = make_node(val) { |v| Riml::DictGetDotNode.new(Riml::WrapInParensNode.new(v[1]), v[3]) } } + ; + + ListOrDictGet: + ExpressionWithoutDictLiteral ListOrDictGetWithBrackets { result = make_node(val) { |v| Riml::ListOrDictGetNode.new(v[0], v[1]) } } + | '(' Expression ')' ListOrDictGetWithBrackets { result = make_node(val) { |v| Riml::ListOrDictGetNode.new(Riml::WrapInParensNode.new(v[1]), v[3]) } } + ; + + ListOrDictGetAssign: + ExpressionWithoutDictLiteral ListOrDictGetWithBrackets { result = make_node(val) { |v| Riml::ListOrDictGetNode.new(v[0], v[1]) } } + ; + + ListOrDictGetWithBrackets: + '[' Expression ']' { result = [val[1]] } + | '[' SubList ']' { result = [val[1]] } + | ListOrDictGetWithBrackets '[' Expression ']' { result = val[0] << val[2] } + | ListOrDictGetWithBrackets '[' SubList ']' { result = val[0] << val[2] } + ; + + SubList: + Expression ':' Expression { result = make_node(val) { |v| Riml::SublistNode.new([v[0], Riml::LiteralNode.new(' : '), v[2]]) } } + | Expression ':' { result = make_node(val) { |v| Riml::SublistNode.new([v[0], Riml::LiteralNode.new(' :')]) } } + | ':' Expression { result = make_node(val) { |v| Riml::SublistNode.new([Riml::LiteralNode.new(': '), v[1]]) } } + | ':' { result = make_node(val) { |_| Riml::SublistNode.new([Riml::LiteralNode.new(':')]) } } + ; + + DictGetWithDot: + DICT_VAL { result = [val[0]] } + | DictGetWithDot DICT_VAL { result = val[0] << val[1] } + ; + + DictGetWithDotLiteral: + '.' IDENTIFIER { result = [val[1]] } + | DictGetWithDotLiteral DICT_VAL { result = val[0] << val[1] } + ; + + Call: + Scope DefCallIdentifier '(' ArgList ')' { result = make_node(val) { |v| Riml::CallNode.new(v[0], v[1], v[3]) } } + | DictGet '(' ArgList ')' { result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], v[2]) } } + | BUILTIN_COMMAND '(' ArgList ')' { result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], v[2]) } } + | BUILTIN_COMMAND ArgListWithoutNothing { result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], v[1]) } } + | BUILTIN_COMMAND NEWLINE { result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], []) } } + | CALL '(' ArgList ')' { result = make_node(val) { |v| Riml::ExplicitCallNode.new(nil, nil, v[2]) } } + ; + + ObjectInstantiationCall: + Scope DefCallIdentifier '(' ArgList ')' { result = make_node(val) { |v| Riml::CallNode.new(v[0], v[1], v[3]) } } + | Scope DefCallIdentifier { result = make_node(val) { |v| Riml::CallNode.new(v[0], v[1], []) } } + ; + + RimlFileCommand: + RIML_FILE_COMMAND '(' ArgList ')' { result = make_node(val) { |v| Riml::RimlFileCommandNode.new(nil, v[0], v[2]) } } + | RIML_FILE_COMMAND ArgList { result = make_node(val) { |v| Riml::RimlFileCommandNode.new(nil, v[0], v[1]) } } + ; + + RimlClassCommand: + RIML_CLASS_COMMAND '(' ClassArgList ')' { result = make_node(val) { |v| Riml::RimlClassCommandNode.new(nil, v[0], v[2]) } } + | RIML_CLASS_COMMAND ClassArgList { result = make_node(val) { |v| Riml::RimlClassCommandNode.new(nil, v[0], v[1]) } } + ; + + ClassArgList: + Scope IDENTIFIER { result = ["#{val[0]}#{val[1]}"] } + | String { result = val } + | ClassArgList ',' Scope IDENTIFIER { result = val[0].concat ["#{val[2]}#{val[3]}"] } + ; + + ExplicitCall: + CALL Scope DefCallIdentifier '(' ArgList ')' { result = make_node(val) { |v| Riml::ExplicitCallNode.new(v[1], v[2], v[4]) } } + | CALL DictGet '(' ArgList ')' { result = make_node(val) { |v| Riml::ExplicitCallNode.new(nil, v[1], v[3]) } } + ; + + Scope: + SCOPE_MODIFIER { result = val[0] } + | /* nothing */ { result = nil } + ; + + # [SID, scope_modifier] + SIDAndScope: + Scope { result = [ nil, val[0] ] } + | '<' IDENTIFIER '>' Scope { result = [ make_node(val) { |v| Riml::SIDNode.new(v[1]) }, val[3] ] } + ; + + ArgList: + /* nothing */ { result = [] } + | ArgListWithoutNothingWithSplat { result = val[0] } + ; + + ArgListWithSplat: + /* nothing */ { result = [] } + | ArgListWithoutNothingWithSplat { result = val[0] } + ; + + ArgListWithoutNothingWithSplat: + Expression { result = val } + | SPLAT_ARG Expression { result = [ make_node(val) { |v| Riml::SplatNode.new(v[1]) } ] } + | ArgListWithoutNothingWithSplat "," Expression { result = val[0] << val[2] } + | ArgListWithoutNothingWithSplat "," SPLAT_ARG Expression { result = val[0] << make_node(val) { |v| Riml::SplatNode.new(v[3]) } } + ; + + ArgListWithoutNothing: + Expression { result = val } + | ArgListWithoutNothing "," Expression { result = val[0] << val[2] } + ; + + BinaryOperator: + Expression '||' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '&&' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression '==' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '==#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '==?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + # added by riml + | Expression '===' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression '!=' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '!=#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '!=?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression '=~' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '=~#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '=~?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression '!~' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '!~#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '!~?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression '>' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '>#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '>?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression '>=' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '>=#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '>=?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression '<' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '<#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '<?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression '<=' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '<=#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '<=?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression '+' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '-' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '*' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '/' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '.' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression '%' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + + | Expression IS Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + | Expression ISNOT Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } } + ; + + UnaryOperator: + '!' Expression { result = make_node(val) { |v| Riml::UnaryOperatorNode.new(val[0], [val[1]]) } } + | '+' Expression { result = make_node(val) { |v| Riml::UnaryOperatorNode.new(val[0], [val[1]]) } } + | '-' Expression { result = make_node(val) { |v| Riml::UnaryOperatorNode.new(val[0], [val[1]]) } } + ; + + # ['=', LHS, RHS] + Assign: + LET AssignExpression { result = make_node(val) { |v| Riml::AssignNode.new(v[1][0], v[1][1], v[1][2]) } } + | AssignExpression { result = make_node(val) { |v| Riml::AssignNode.new(v[0][0], v[0][1], v[0][2]) } } + ; + + MultiAssign: + Assign ',' Assign { result = make_node(val) { |v| Riml::MultiAssignNode.new([v[0], v[2]]) } } + | MultiAssign ',' Assign { val[0].assigns << val[2]; result = val[0] } + ; + + # ['=', AssignLHS, Expression] + AssignExpression: + AssignLHS '=' Expression { result = [val[1], val[0], val[2]] } + | AssignLHS '+=' Expression { result = [val[1], val[0], val[2]] } + | AssignLHS '-=' Expression { result = [val[1], val[0], val[2]] } + | AssignLHS '.=' Expression { result = [val[1], val[0], val[2]] } + ; + + AssignLHS: + AllVariableRetrieval { result = val[0] } + | List { result = val[0] } + | ListUnpack { result = val[0] } + | DictGet { result = val[0] } + | ListOrDictGetAssign { result = val[0] } + ; + + # retrieving the value of a variable + VariableRetrieval: + SimpleVariableRetrieval { result = val[0] } + | SPECIAL_VAR_PREFIX IDENTIFIER { result = make_node(val) { |v| Riml::GetSpecialVariableNode.new(v[0], v[1]) } } + | ScopeModifierLiteral ListOrDictGetWithBrackets { result = make_node(val) { |v| Riml::GetVariableByScopeAndDictNameNode.new(v[0], v[1]) } } + ; + + SimpleVariableRetrieval: + Scope IDENTIFIER { result = make_node(val) { |v| Riml::GetVariableNode.new(v[0], v[1]) } } + ; + + AllVariableRetrieval: + VariableRetrieval { result = val[0] } + | Scope CurlyBraceName { result = make_node(val) { |v| Riml::GetCurlyBraceNameNode.new(v[0], v[1]) } } + ; + + UnletVariable: + UNLET VariableRetrieval { result = make_node(val) { |v| Riml::UnletVariableNode.new('!', [ v[1] ]) } } + | UNLET_BANG VariableRetrieval { result = make_node(val) { |v| Riml::UnletVariableNode.new('!', [ v[1] ]) } } + | UnletVariable VariableRetrieval { result = val[0] << val[1] } + ; + + CurlyBraceName: + CurlyBraceVarPart { result = make_node(val) { |v| Riml::CurlyBraceVariable.new([ v[0] ]) } } + | IDENTIFIER CurlyBraceName { result = make_node(val) { |v| Riml::CurlyBraceVariable.new([ Riml::CurlyBracePart.new(v[0]), v[1] ]) } } + | CurlyBraceName IDENTIFIER { result = val[0] << make_node(val) { |v| Riml::CurlyBracePart.new(v[1]) } } + | CurlyBraceName CurlyBraceVarPart { result = val[0] << val[1] } + ; + + CurlyBraceVarPart: + '{' PossibleStringValue '}' { result = make_node(val) { |v| Riml::CurlyBracePart.new(v[1]) } } + | '{' PossibleStringValue CurlyBraceVarPart '}' { result = make_node(val) { |v| Riml::CurlyBracePart.new([v[1], v[2]]) } } + | '{' CurlyBraceVarPart PossibleStringValue '}' { result = make_node(val) { |v| Riml::CurlyBracePart.new([v[1], v[2]]) } } + ; + + # Method definition + # [SID, scope_modifier, name, parameters, keyword, expressions] + Def: + FunctionType SIDAndScope DefCallIdentifier DefKeywords Block END { result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], [], v[3], v[4]) } } + | FunctionType SIDAndScope DefCallIdentifier '(' ParamList ')' DefKeywords Block END { result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], v[4], v[6], v[7]) } } + | FunctionType SIDAndScope DefCallIdentifier '(' SPLAT_PARAM ')' DefKeywords Block END { result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], [v[4]], v[6], v[7]) } } + | FunctionType SIDAndScope DefCallIdentifier '(' ParamList ',' SPLAT_PARAM ')' DefKeywords Block END { result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], v[4] << v[6], v[8], v[9]) } } + ; + + FunctionType: + DEF { result = "DefNode" } + | DEF_BANG { result = "DefNode" } + | DEFM { result = "DefMethodNode" } + ; + + DefCallIdentifier: + # use '' for first argument instead of nil in order to avoid a double scope-modifier + CurlyBraceName { result = make_node(val) { |v| Riml::GetCurlyBraceNameNode.new('', v[0]) } } + | IDENTIFIER { result = val[0] } + ; + + # Example: 'range', 'dict' or 'abort' after function definition + DefKeywords: + IDENTIFIER { result = [val[0]] } + | DefKeywords IDENTIFIER { result = val[0] << val[1] } + | /* nothing */ { result = nil } + ; + + ParamList: + /* nothing */ { result = [] } + | IDENTIFIER { result = val } + | DefaultParam { result = val } + | ParamList ',' IDENTIFIER { result = val[0] << val[2] } + | ParamList ',' DefaultParam { result = val[0] << val[2] } + ; + + DefaultParam: + IDENTIFIER '=' Expression { result = make_node(val) { |v| Riml::DefaultParamNode.new(v[0], v[2]) } } + ; + + Return: + RETURN Returnable { result = make_node(val) { |v| Riml::ReturnNode.new(v[1]) } } + | RETURN Returnable IF Expression { result = make_node(val) { |v| Riml::IfNode.new(v[3], Nodes.new([ReturnNode.new(v[1])])) } } + | RETURN Returnable UNLESS Expression { result = make_node(val) { |v| Riml::UnlessNode.new(v[3], Nodes.new([ReturnNode.new(v[1])])) } } + ; + + Returnable: + /* nothing */ { result = nil } + | Expression { result = val[0] } + ; + + EndScript: + FINISH { result = make_node(val) { |_| Riml::FinishNode.new } } + ; + + # [expression, expressions] + If: + IF Expression IfBlock END { result = make_node(val) { |v| Riml::IfNode.new(v[1], v[2]) } } + | IF Expression THEN Expression END { result = make_node(val) { |v| Riml::IfNode.new(v[1], Riml::Nodes.new([v[3]])) } } + | Expression IF Expression { result = make_node(val) { |v| Riml::IfNode.new(v[2], Riml::Nodes.new([v[0]])) } } + ; + + Unless: + UNLESS Expression IfBlock END { result = make_node(val) { |v| Riml::UnlessNode.new(v[1], v[2]) } } + | UNLESS Expression THEN Expression END { result = make_node(val) { |v| Riml::UnlessNode.new(v[1], Riml::Nodes.new([v[3]])) } } + | Expression UNLESS Expression { result = make_node(val) { |v| Riml::UnlessNode.new(v[2], Riml::Nodes.new([v[0]])) } } + ; + + Ternary: + Expression '?' Expression ':' Expression { result = make_node(val) { |v| Riml::TernaryOperatorNode.new([v[0], v[2], v[4]]) } } + ; + + While: + WHILE Expression Block END { result = make_node(val) { |v| Riml::WhileNode.new(v[1], v[2]) } } + ; + + LoopKeyword: + BREAK { result = make_node(val) { |_| Riml::BreakNode.new } } + | CONTINUE { result = make_node(val) { |_| Riml::ContinueNode.new } } + ; + + Until: + UNTIL Expression Block END { result = make_node(val) { |v| Riml::UntilNode.new(v[1], v[2]) } } + ; + + For: + FOR SimpleVariableRetrieval IN Expression Block END { result = make_node(val) { |v| Riml::ForNode.new(v[1], v[3], v[4]) } } + | FOR List IN Expression Block END { result = make_node(val) { |v| Riml::ForNode.new(v[1], v[3], v[4]) } } + | FOR ListUnpack IN Expression Block END { result = make_node(val) { |v| Riml::ForNode.new(v[1], v[3], v[4]) } } + ; + + Try: + TRY Block END { result = make_node(val) { |v| Riml::TryNode.new(v[1], nil, nil) } } + | TRY Block Catch END { result = make_node(val) { |v| Riml::TryNode.new(v[1], v[2], nil) } } + | TRY Block Catch FINALLY Block END { result = make_node(val) { |v| Riml::TryNode.new(v[1], v[2], v[4]) } } + ; + + Catch: + /* nothing */ { result = nil } + | CATCH Block { result = [ make_node(val) { |v| Riml::CatchNode.new(nil, v[1]) } ] } + | CATCH Catchable Block { result = [ make_node(val) { |v| Riml::CatchNode.new(v[1], v[2]) } ] } + | Catch CATCH Block { result = val[0] << make_node(val) { |v| Riml::CatchNode.new(nil, v[2]) } } + | Catch CATCH Catchable Block { result = val[0] << make_node(val) { |v| Riml::CatchNode.new(v[2], v[3]) } } + ; + + Catchable: + Regexp { result = val[0] } + | String { result = val[0] } + ; + + # [expressions] + # expressions list could contain an ElseNode, which contains expressions + # itself + Block: + NEWLINE Statements { result = val[1] } + | NEWLINE { result = make_node(val) { |_| Riml::Nodes.new([]) } } + ; + + IfBlock: + Block { result = val[0] } + | NEWLINE Statements ElseBlock { result = val[1] << val[2] } + | NEWLINE Statements ElseifBlock { result = val[1] << val[2] } + | NEWLINE Statements ElseifBlock ElseBlock { result = val[1] << val[2] << val[3] } + ; + + ElseBlock: + ELSE NEWLINE Statements { result = make_node(val) { |v| Riml::ElseNode.new(v[2]) } } + ; + + ElseifBlock: + ELSEIF Expression NEWLINE Statements { result = make_node(val) { |v| Riml::Nodes.new([Riml::ElseifNode.new(v[1], v[3])]) } } + | ElseifBlock ELSEIF Expression NEWLINE Statements { result = val[0] << make_node(val) { |v| Riml::ElseifNode.new(v[2], v[4]) } } + ; + + ClassDefinition: + CLASS Scope IDENTIFIER Block END { result = make_node(val) { |v| Riml::ClassDefinitionNode.new(v[1], v[2], nil, v[3]) } } + | CLASS Scope IDENTIFIER '<' Scope IDENTIFIER Block END { result = make_node(val) { |v| Riml::ClassDefinitionNode.new(v[1], v[2], (v[4] || ClassDefinitionNode::DEFAULT_SCOPE_MODIFIER) + v[5], v[6]) } } + ; + + ObjectInstantiation: + NEW ObjectInstantiationCall { result = make_node(val) { |v| Riml::ObjectInstantiationNode.new(v[1]) } } + ; + + Super: + SUPER '(' ArgListWithSplat ')' { result = make_node(val) { |v| Riml::SuperNode.new(v[2], true) } } + | SUPER { result = make_node(val) { |_| Riml::SuperNode.new([], false) } } + ; + + ExLiteral: + EX_LITERAL { result = make_node(val) { |v| Riml::ExLiteralNode.new(v[0]) } } + ; +end + +---- header + require File.expand_path("../lexer", __FILE__) + require File.expand_path("../nodes", __FILE__) + require File.expand_path("../errors", __FILE__) + require File.expand_path("../ast_rewriter", __FILE__) +---- inner + # This code will be put as-is in the parser class + + attr_accessor :ast_rewriter + attr_writer :options + + # The Parser and AST_Rewriter share this same hash of options + def options + @options ||= {} + end + + def self.ast_cache + @ast_cache + end + @ast_cache = {} + + # parses tokens or code into output nodes + def parse(object, ast_rewriter = Riml::AST_Rewriter.new, filename = nil, included = false) + if (ast = self.class.ast_cache[filename]) + else + if tokens?(object) + @tokens = object + elsif code?(object) + @lexer = Riml::Lexer.new(object, filename, true) + end + + begin + ast = do_parse + rescue Racc::ParseError => e + raise unless @lexer + if (invalid_token = @lexer.prev_token_is_keyword?) + warning = "#{invalid_token.inspect} is a keyword, and cannot " \ + "be used as a variable name" + end + error_msg = e.message + error_msg << "\nWARNING: #{warning}" if warning + error = Riml::ParseError.new(error_msg, @lexer.filename, @lexer.lineno) + raise error + end + self.class.ast_cache[filename] = ast if filename + end + @ast_rewriter ||= ast_rewriter + return ast unless @ast_rewriter + @ast_rewriter.ast = ast.dup + @ast_rewriter.options ||= options + @ast_rewriter.rewrite(filename, included) + @ast_rewriter.ast + end + + # get the next token from either the list of tokens provided, or + # the lexer getting the next token + def next_token + return @tokens.shift unless @lexer + token = @lexer.next_token + if token && @lexer.parser_info + @current_parser_info = token.pop + end + token + end + + private + + def tokens?(object) + Array === object + end + + def code?(object) + String === object + end + + def make_node(racc_val) + node = yield racc_val + node.parser_info = @current_parser_info + node + end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/rrconf.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/rrconf.y new file mode 100644 index 000000000000..baf9249a774c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/rrconf.y @@ -0,0 +1,14 @@ +# 1 s/r conflict and 1 r/r conflict + +class A +rule + +target: a + +a : + | a list + +list : + | list ITEM + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby18.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby18.y new file mode 100644 index 000000000000..eceb2532980c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby18.y @@ -0,0 +1,1943 @@ +# Copyright (c) 2013 Peter Zotov <whitequark@whitequark.org> +# +# Parts of the source are derived from ruby_parser: +# Copyright (c) Ryan Davis, seattle.rb +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class Parser::Ruby18 + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tNTH_REF + tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT tREGEXP_END tUPLUS + tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP + tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT + tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG + tLBRACK tLBRACK2 tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 + tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET + tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING + tSYMBOL tREGEXP_OPT tNL tEH tCOLON tCOMMA tSPACE tSEMI + +prechigh + right tBANG tTILDE tUPLUS + right tPOW + right tUMINUS_NUM tUMINUS + left tSTAR2 tDIVIDE tPERCENT + left tPLUS tMINUS + left tLSHFT tRSHFT + left tAMPER2 + left tPIPE tCARET + left tGT tGEQ tLT tLEQ + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tANDOP + left tOROP + nonassoc tDOT2 tDOT3 + right tEH tCOLON + left kRESCUE_MOD + right tEQL tOP_ASGN + nonassoc kDEFINED + right kNOT + left kOR kAND + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + nonassoc tLBRACE_ARG + nonassoc tLOWEST +preclow + +rule + + program: compstmt + { + result = val[0] + } + + bodystmt: compstmt opt_rescue opt_else opt_ensure + { + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + } + + compstmt: stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + stmts: # nothing + { + result = [] + } + | stmt + { + result = [ val[0] ] + } + | error stmt + { + result = [ val[1] ] + } + | stmts terms stmt + { + result = val[0] << val[2] + } + + stmt: kALIAS fitem + { + @lexer.state = :expr_fname + } + fitem + { + result = @builder.alias(val[0], val[1], val[3]) + } + | kALIAS tGVAR tGVAR + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + } + | kALIAS tGVAR tBACK_REF + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + } + | kALIAS tGVAR tNTH_REF + { + diagnostic :error, :nth_ref_alias, nil, val[2] + } + | kUNDEF undef_list + { + result = @builder.undef_method(val[0], val[1]) + } + | stmt kIF_MOD expr_value + { + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + } + | stmt kUNLESS_MOD expr_value + { + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + } + | stmt kWHILE_MOD expr_value + { + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + } + | stmt kUNTIL_MOD expr_value + { + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + } + | stmt kRESCUE_MOD stmt + { + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + } + | klBEGIN tLCURLY compstmt tRCURLY + { + if in_def? + diagnostic :error, :begin_in_method, nil, val[0] + end + + result = @builder.preexe(val[0], val[1], val[2], val[3]) + } + | klEND tLCURLY compstmt tRCURLY + { + result = @builder.postexe(val[0], val[1], val[2], val[3]) + } + | lhs tEQL command_call + { + result = @builder.assign(val[0], val[1], val[2]) + } + | mlhs tEQL command_call + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN command_call + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | backref tOP_ASGN command_call + { + @builder.op_assign(val[0], val[1], val[2]) + } + | lhs tEQL mrhs + { + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | mlhs tEQL arg_value + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | mlhs tEQL mrhs + { + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | expr + + expr: command_call + | expr kAND expr + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | expr kOR expr + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kNOT expr + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | tBANG command_call + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | arg + + expr_value: expr + + command_call: command + | block_command + | kRETURN call_args + { + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + } + | kBREAK call_args + { + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + } + | kNEXT call_args + { + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + } + + block_command: block_call + | block_call tDOT operation2 command_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | block_call tCOLON2 operation2 command_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + + cmd_brace_block: tLBRACE_ARG + { + @static_env.extend_dynamic + } + opt_block_var compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + command: operation command_args =tLOWEST + { + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + } + | operation command_args cmd_brace_block + { + lparen_t, args, rparen_t = val[1] + method_call = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + begin_t, block_args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, block_args, body, end_t) + } + | primary_value tDOT operation2 command_args =tLOWEST + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + } + | primary_value tDOT operation2 command_args cmd_brace_block + { + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, block_args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, block_args, body, end_t) + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, block_args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, block_args, body, end_t) + } + | kSUPER command_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + } + | kYIELD command_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:yield, val[0], + lparen_t, args, rparen_t) + } + + mlhs: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_entry tRPAREN + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_entry: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_entry tRPAREN + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + mlhs_basic: mlhs_head + { + result = val[0] + } + | mlhs_head mlhs_item + { + result = val[0] << val[1] + } + | mlhs_head tSTAR mlhs_node + { + result = val[0] << @builder.splat(val[1], val[2]) + } + | mlhs_head tSTAR + { + result = val[0] << @builder.splat(val[1]) + } + | tSTAR mlhs_node + { + result = [ @builder.splat(val[0], val[1]) ] + } + | tSTAR + { + result = [ @builder.splat(val[0]) ] + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_entry tRPAREN + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_head: mlhs_item tCOMMA + { + result = [ val[0] ] + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1] + } + + mlhs_node: variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 aref_args tRBRACK + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + lhs: variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 aref_args tRBRACK + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + cname: tIDENTIFIER + { + diagnostic :error, :module_name_const, nil, val[0] + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = @builder.const_global(val[0], val[1]) + } + | cname + { + result = @builder.const(val[0]) + } + | primary_value tCOLON2 cname + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + | reswords + + fsym: fname + { + result = @builder.symbol(val[0]) + } + | symbol + + fitem: fsym + | dsym + + undef_list: fitem + { + result = [ val[0] ] + } + | undef_list tCOMMA + { + @lexer.state = :expr_fname + } + fitem + { + result = val[0] << val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tGT | tGEQ | tLT | tLEQ | tLSHFT + | tRSHFT | tPLUS | tMINUS | tSTAR2 | tSTAR | tDIVIDE + | tPERCENT | tPOW | tTILDE | tUPLUS | tUMINUS | tAREF + | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | klBEGIN | klEND | kALIAS | kAND + | kBEGIN | kBREAK | kCASE | kCLASS | kDEF | kDEFINED + | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE + | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF + | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD + | kIF | kUNLESS | kWHILE | kUNTIL + + arg: lhs tEQL arg + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + } + | var_lhs tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN arg + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg + { + diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ] + } + | tCOLON3 tCONSTANT tOP_ASGN arg + { + diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ] + } + | backref tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | arg tDOT2 arg + { + result = @builder.range_inclusive(val[0], val[1], val[2]) + } + | arg tDOT3 arg + { + result = @builder.range_exclusive(val[0], val[1], val[2]) + } + | arg tPLUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMINUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tSTAR2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tDIVIDE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPERCENT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPOW arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tUMINUS_NUM tINTEGER tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + } + | tUMINUS_NUM tFLOAT tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + } + | tUPLUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | tUMINUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tPIPE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCARET arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tAMPER2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCMP arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tNEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMATCH arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tNMATCH arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tBANG arg + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | tTILDE arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tLSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tRSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tANDOP arg + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | arg tOROP arg + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kDEFINED opt_nl arg + { + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + } + | arg tEH arg tCOLON arg + { + result = @builder.ternary(val[0], val[1], + val[2], val[3], val[4]) + } + | primary + + arg_value: arg + + aref_args: none + | command opt_nl + { + result = [ val[0] ] + } + | args trailer + { + result = val[0] + } + | args tCOMMA tSTAR arg opt_nl + { + result = val[0] << @builder.splat(val[2], val[3]) + } + | assocs trailer + { + result = [ @builder.associate(nil, val[0], nil) ] + } + | tSTAR arg opt_nl + { + result = [ @builder.splat(val[0], val[1]) ] + } + + paren_args: tLPAREN2 none tRPAREN + { + result = [ val[0], [], val[2] ] + } + | tLPAREN2 call_args opt_nl tRPAREN + { + result = [ val[0], val[1], val[3] ] + } + | tLPAREN2 block_call opt_nl tRPAREN + { + result = [ val[0], [ val[1] ], val[3] ] + } + | tLPAREN2 args tCOMMA block_call opt_nl tRPAREN + { + result = [ val[0], val[1] << val[3], val[5] ] + } + + opt_paren_args: # nothing + { + result = [ nil, [], nil ] + } + | paren_args + + call_args: command + { + result = [ val[0] ] + } + | args opt_block_arg + { + result = val[0].concat(val[1]) + } + | args tCOMMA tSTAR arg_value opt_block_arg + { + result = val[0].concat( + [ @builder.splat(val[2], val[3]), + *val[4] ]) + } + | assocs opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil), + *val[1] ] + } + | assocs tCOMMA tSTAR arg_value opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil), + @builder.splat(val[2], val[3]), + *val[4] ] + } + | args tCOMMA assocs opt_block_arg + { + result = val[0].concat( + [ @builder.associate(nil, val[2], nil), + *val[3] ]) + } + | args tCOMMA assocs tCOMMA tSTAR arg opt_block_arg + { + result = val[0].concat( + [ @builder.associate(nil, val[2], nil), + @builder.splat(val[4], val[5]), + *val[6] ]) + } + | tSTAR arg_value opt_block_arg + { + result = [ @builder.splat(val[0], val[1]), + *val[2] ] + } + | block_arg + { + result = [ val[0] ] + } + + call_args2: arg_value tCOMMA args opt_block_arg + { + result = [ val[0], *val[2].concat(val[3]) ] + } + | arg_value tCOMMA block_arg + { + result = [ val[0], val[2] ] + } + | arg_value tCOMMA tSTAR arg_value opt_block_arg + { + result = [ val[0], + @builder.splat(val[2], val[3]), + *val[4] ] + } + | arg_value tCOMMA args tCOMMA tSTAR arg_value opt_block_arg + { + result = [ val[0], + *val[2]. + push(@builder.splat(val[4], val[5])). + concat(val[6]) ] + } + | assocs opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil), + *val[1] ] + } + | assocs tCOMMA tSTAR arg_value opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil), + @builder.splat(val[2], val[3]), + *val[4] ] + } + | arg_value tCOMMA assocs opt_block_arg + { + result = [ val[0], + @builder.associate(nil, val[2], nil), + *val[3] ] + } + | arg_value tCOMMA args tCOMMA assocs opt_block_arg + { + result = [ val[0], + *val[2]. + push(@builder.associate(nil, val[4], nil)). + concat(val[5]) ] + } + | arg_value tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg + { + result = [ val[0], + @builder.associate(nil, val[2], nil), + @builder.splat(val[4], val[5]), + *val[6] ] + } + | arg_value tCOMMA args tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg + { + result = [ val[0], + *val[2]. + push(@builder.associate(nil, val[4], nil)). + push(@builder.splat(val[6], val[7])). + concat(val[8]) ] + } + | tSTAR arg_value opt_block_arg + { + result = [ @builder.splat(val[0], val[1]), + *val[2] ] + } + | block_arg + { + result = [ val[0] ] + } + + command_args: { + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + } + open_args + { + @lexer.cmdarg = val[0] + + result = val[1] + } + + open_args: call_args + { + result = [ nil, val[0], nil ] + } + | tLPAREN_ARG + { + @lexer.state = :expr_endarg + } + tRPAREN + { + result = [ val[0], [], val[2] ] + } + | tLPAREN_ARG call_args2 + { + @lexer.state = :expr_endarg + } + tRPAREN + { + result = [ val[0], val[1], val[3] ] + } + + block_arg: tAMPER arg_value + { + result = @builder.block_pass(val[0], val[1]) + } + + opt_block_arg: tCOMMA block_arg + { + result = [ val[1] ] + } + | # nothing + { + result = [] + } + + args: arg_value + { + result = [ val[0] ] + } + | args tCOMMA arg_value + { + result = val[0] << val[2] + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | var_ref + | backref + | tFID + { + result = @builder.call_method(nil, nil, val[0]) + } + | kBEGIN bodystmt kEND + { + result = @builder.begin_keyword(val[0], val[1], val[2]) + } + | tLPAREN_ARG expr + { + @lexer.state = :expr_endarg + } + opt_nl tRPAREN + { + result = @builder.begin(val[0], val[1], val[4]) + } + | tLPAREN compstmt tRPAREN + { + result = @builder.begin(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + | tCOLON3 tCONSTANT + { + result = @builder.const_global(val[0], val[1]) + } + | primary_value tLBRACK2 aref_args tRBRACK + { + result = @builder.index(val[0], val[1], val[2], val[3]) + } + | tLBRACK aref_args tRBRACK + { + result = @builder.array(val[0], val[1], val[2]) + } + | tLBRACE assoc_list tRCURLY + { + result = @builder.associate(val[0], val[1], val[2]) + } + | kRETURN + { + result = @builder.keyword_cmd(:return, val[0]) + } + | kYIELD tLPAREN2 call_args tRPAREN + { + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + } + | kYIELD tLPAREN2 tRPAREN + { + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + } + | kYIELD + { + result = @builder.keyword_cmd(:yield, val[0]) + } + | kDEFINED opt_nl tLPAREN2 expr tRPAREN + { + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + } + | operation brace_block + { + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | method_call + | method_call brace_block + { + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + } + | kIF expr_value then compstmt if_tail kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + } + | kUNLESS expr_value then compstmt opt_else kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + } + | kWHILE + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + } + | kUNTIL + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + } + | kCASE expr_value opt_terms case_body kEND + { + when_bodies = val[3][0..-2] + else_t, else_body = val[3][-1] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + } + | kCASE opt_terms case_body kEND + { + when_bodies = val[2][0..-2] + else_t, else_body = val[2][-1] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + } + | kCASE opt_terms kELSE compstmt kEND + { + result = @builder.case(val[0], nil, + [], val[2], val[3], + val[4]) + } + | kFOR for_var kIN + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + } + | kCLASS cpath superclass + { + @static_env.extend_static + } + bodystmt kEND + { + if in_def? + diagnostic :error, :class_in_def, nil, val[0] + end + + lt_t, superclass = val[2] + result = @builder.def_class(val[0], val[1], + lt_t, superclass, + val[4], val[5]) + + @static_env.unextend + } + | kCLASS tLSHFT expr term + { + result = @def_level + @def_level = 0 + + @static_env.extend_static + } + bodystmt kEND + { + result = @builder.def_sclass(val[0], val[1], val[2], + val[5], val[6]) + + @static_env.unextend + + @def_level = val[4] + } + | kMODULE cpath + { + @static_env.extend_static + } + bodystmt kEND + { + if in_def? + diagnostic :error, :module_in_def, nil, val[0] + end + + result = @builder.def_module(val[0], val[1], + val[3], val[4]) + + @static_env.unextend + } + | kDEF fname + { + @def_level += 1 + @static_env.extend_static + } + f_arglist bodystmt kEND + { + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + @static_env.unextend + @def_level -= 1 + } + | kDEF singleton dot_or_colon + { + @lexer.state = :expr_fname + } + fname + { + @def_level += 1 + @static_env.extend_static + } + f_arglist bodystmt kEND + { + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + @static_env.unextend + @def_level -= 1 + } + | kBREAK + { + result = @builder.keyword_cmd(:break, val[0]) + } + | kNEXT + { + result = @builder.keyword_cmd(:next, val[0]) + } + | kREDO + { + result = @builder.keyword_cmd(:redo, val[0]) + } + | kRETRY + { + result = @builder.keyword_cmd(:retry, val[0]) + } + + primary_value: primary + + then: term + | tCOLON + | kTHEN + | term kTHEN + { + result = val[1] + } + + do: term + | tCOLON + | kDO_COND + + if_tail: opt_else + | kELSIF expr_value then compstmt if_tail + { + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + } + + opt_else: none + | kELSE compstmt + { + result = val + } + + for_var: lhs + | mlhs + + block_par: mlhs_item + { + result = [ @builder.arg_expr(val[0]) ] + } + | block_par tCOMMA mlhs_item + { + result = val[0] << @builder.arg_expr(val[2]) + } + + block_var: block_par + | block_par tCOMMA + | block_par tCOMMA tAMPER lhs + { + result = val[0]. + push(@builder.blockarg_expr(val[2], val[3])) + } + | block_par tCOMMA tSTAR lhs tCOMMA tAMPER lhs + { + result = val[0]. + push(@builder.restarg_expr(val[2], val[3])). + push(@builder.blockarg_expr(val[5], val[6])) + } + | block_par tCOMMA tSTAR tCOMMA tAMPER lhs + { + result = val[0]. + push(@builder.restarg_expr(val[2])). + push(@builder.blockarg_expr(val[4], val[5])) + } + | block_par tCOMMA tSTAR lhs + { + result = val[0]. + push(@builder.restarg_expr(val[2], val[3])) + } + | block_par tCOMMA tSTAR + { + result = val[0]. + push(@builder.restarg_expr(val[2])) + } + | tSTAR lhs tCOMMA tAMPER lhs + { + result = [ @builder.restarg_expr(val[0], val[1]), + @builder.blockarg_expr(val[3], val[4]) ] + } + | tSTAR tCOMMA tAMPER lhs + { + result = [ @builder.restarg_expr(val[0]), + @builder.blockarg_expr(val[2], val[3]) ] + } + | tSTAR lhs + { + result = [ @builder.restarg_expr(val[0], val[1]) ] + } + | tSTAR + { + result = [ @builder.restarg_expr(val[0]) ] + } + | tAMPER lhs + { + result = [ @builder.blockarg_expr(val[0], val[1]) ] + } + ; + + opt_block_var: # nothing + { + result = @builder.args(nil, [], nil) + } + | tPIPE tPIPE + { + result = @builder.args(val[0], [], val[1]) + } + | tOROP + { + result = @builder.args(val[0], [], val[0]) + } + | tPIPE block_var tPIPE + { + result = @builder.args(val[0], val[1], val[2], false) + } + + do_block: kDO_BLOCK + { + @static_env.extend_dynamic + } + opt_block_var compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + block_call: command do_block + { + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + } + | block_call tDOT operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | block_call tCOLON2 operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + + method_call: operation paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + } + | primary_value tDOT operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation2 paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation3 + { + result = @builder.call_method(val[0], val[1], val[2]) + } + | kSUPER paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + } + | kSUPER + { + result = @builder.keyword_cmd(:zsuper, val[0]) + } + + brace_block: tLCURLY + { + @static_env.extend_dynamic + } + opt_block_var compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + | kDO + { + @static_env.extend_dynamic + } + opt_block_var compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + case_body: kWHEN when_args then compstmt cases + { + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + } + + when_args: args + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + + cases: opt_else + { + result = [ val[0] ] + } + | case_body + + opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue + { + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + } + | # nothing + { + result = [] + } + + exc_list: arg_value + { + result = [ val[0] ] + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = [ val[0], val[1] ] + } + | none + + opt_ensure: kENSURE compstmt + { + result = [ val[0], val[1] ] + } + | none + + literal: numeric + | symbol + | dsym + + strings: string + { + result = @builder.string_compose(nil, val[0], nil) + } + + string: string1 + { + result = [ val[0] ] + } + | string string1 + { + result = val[0] << val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + result = @builder.string_compose(val[0], val[1], val[2]) + } + | tSTRING + { + result = @builder.string(val[0]) + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = @builder.xstring_compose(val[0], val[1], val[2]) + } + + regexp: tREGEXP_BEG xstring_contents tSTRING_END tREGEXP_OPT + { + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + } + + words: tWORDS_BEG word_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + word_list: # nothing + { + result = [] + } + | word_list word tSPACE + { + result = val[0] << @builder.word(val[1]) + } + + word: string_content + { + result = [ val[0] ] + } + | word string_content + { + result = val[0] << val[1] + } + + qwords: tQWORDS_BEG qword_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + qword_list: # nothing + { + result = [] + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0] << @builder.string_internal(val[1]) + } + + string_contents: # nothing + { + result = [] + } + | string_contents string_content + { + result = val[0] << val[1] + } + +xstring_contents: # nothing + { + result = [] + } + | xstring_contents string_content + { + result = val[0] << val[1] + } + + string_content: tSTRING_CONTENT + { + result = @builder.string_internal(val[0]) + } + | tSTRING_DVAR string_dvar + { + result = val[1] + } + | tSTRING_DBEG + { + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + } + compstmt tRCURLY + { + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + } + + string_dvar: tGVAR + { + result = @builder.gvar(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + | backref + + + symbol: tSYMBOL + { + result = @builder.symbol(val[0]) + } + + dsym: tSYMBEG xstring_contents tSTRING_END + { + result = @builder.symbol_compose(val[0], val[1], val[2]) + } + + numeric: tINTEGER + { + result = @builder.integer(val[0]) + } + | tFLOAT + { + result = @builder.float(val[0]) + } + | tUMINUS_NUM tINTEGER =tLOWEST + { + result = @builder.negate(val[0], + @builder.integer(val[1])) + } + | tUMINUS_NUM tFLOAT =tLOWEST + { + result = @builder.negate(val[0], + @builder.float(val[1])) + } + + variable: tIDENTIFIER + { + result = @builder.ident(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tGVAR + { + result = @builder.gvar(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + | tCONSTANT + { + result = @builder.const(val[0]) + } + | kNIL + { + result = @builder.nil(val[0]) + } + | kSELF + { + result = @builder.self(val[0]) + } + | kTRUE + { + result = @builder.true(val[0]) + } + | kFALSE + { + result = @builder.false(val[0]) + } + | k__FILE__ + { + result = @builder.__FILE__(val[0]) + } + | k__LINE__ + { + result = @builder.__LINE__(val[0]) + } + + var_ref: variable + { + result = @builder.accessible(val[0]) + } + + var_lhs: variable + { + result = @builder.assignable(val[0]) + } + + backref: tNTH_REF + { + result = @builder.nth_ref(val[0]) + } + | tBACK_REF + { + result = @builder.back_ref(val[0]) + } + + superclass: term + { + result = nil + } + | tLT expr_value term + { + result = [ val[0], val[1] ] + } + | error term + { + yyerrok + result = nil + } + + f_arglist: tLPAREN2 f_args opt_nl tRPAREN + { + result = @builder.args(val[0], val[1], val[3]) + + @lexer.state = :expr_beg + } + | f_args term + { + result = @builder.args(nil, val[0], nil) + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_optarg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_optarg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_block_arg + { + result = [ val[0] ] + } + | # nothing + { + result = [] + } + + f_norm_arg: tCONSTANT + { + diagnostic :error, :argument_const, nil, val[0] + } + | tIVAR + { + diagnostic :error, :argument_ivar, nil, val[0] + } + | tGVAR + { + diagnostic :error, :argument_gvar, nil, val[0] + } + | tCVAR + { + diagnostic :error, :argument_cvar, nil, val[0] + } + | tIDENTIFIER + { + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + } + + f_arg: f_norm_arg + { + result = [ val[0] ] + } + | f_arg tCOMMA f_norm_arg + { + result = val[0] << val[2] + } + + f_opt: tIDENTIFIER tEQL arg_value + { + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_optarg: f_opt + { + result = [ val[0] ] + } + | f_optarg tCOMMA f_opt + { + result = val[0] << val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + } + | restarg_mark + { + result = [ @builder.restarg(val[0]) ] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + } + + opt_f_block_arg: tCOMMA f_block_arg + { + result = [ val[1] ] + } + | # nothing + { + result = [] + } + + singleton: var_ref + | tLPAREN2 expr opt_nl tRPAREN + { + result = val[1] + } + + assoc_list: # nothing + { + result = [] + } + | assocs trailer + { + result = val[0] + } + | args trailer + { + result = @builder.pair_list_18(val[0]) + } + + assocs: assoc + { + result = [ val[0] ] + } + | assocs tCOMMA assoc + { + result = val[0] << val[2] + } + + assoc: arg_value tASSOC arg_value + { + result = @builder.pair(val[0], val[1], val[2]) + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + opt_terms: | terms + opt_nl: | tNL + trailer: | tNL | tCOMMA + + term: tSEMI + { + yyerrok + } + | tNL + + terms: term + | terms tSEMI + + none: # nothing + { + result = nil + } + +end + +---- header + +require 'parser' + +---- inner + + def version + 18 + end + + def default_encoding + Encoding::BINARY if defined? Encoding + end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby19.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby19.y new file mode 100644 index 000000000000..b405c952e72b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby19.y @@ -0,0 +1,2174 @@ +# Copyright (c) 2013 Peter Zotov <whitequark@whitequark.org> +# +# Parts of the source are derived from ruby_parser: +# Copyright (c) Ryan Davis, seattle.rb +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class Parser::Ruby19 + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tREGEXP_OPT + tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END + tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG + tCHARACTER + +prechigh + right tBANG tTILDE tUPLUS + right tPOW + right tUMINUS_NUM tUMINUS + left tSTAR2 tDIVIDE tPERCENT + left tPLUS tMINUS + left tLSHFT tRSHFT + left tAMPER2 + left tPIPE tCARET + left tGT tGEQ tLT tLEQ + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tANDOP + left tOROP + nonassoc tDOT2 tDOT3 + right tEH tCOLON + left kRESCUE_MOD + right tEQL tOP_ASGN + nonassoc kDEFINED + right kNOT + left kOR kAND + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + nonassoc tLBRACE_ARG + nonassoc tLOWEST +preclow + +rule + + program: top_compstmt + + top_compstmt: top_stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + top_stmts: # nothing + { + result = [] + } + | top_stmt + { + result = [ val[0] ] + } + | top_stmts terms top_stmt + { + result = val[0] << val[2] + } + | error top_stmt + { + result = [ val[1] ] + } + + top_stmt: stmt + | klBEGIN tLCURLY top_compstmt tRCURLY + { + result = @builder.preexe(val[0], val[1], val[2], val[3]) + } + + bodystmt: compstmt opt_rescue opt_else opt_ensure + { + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + } + + compstmt: stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + stmts: # nothing + { + result = [] + } + | stmt + { + result = [ val[0] ] + } + | stmts terms stmt + { + result = val[0] << val[2] + } + | error stmt + { + result = [ val[1] ] + } + + stmt: kALIAS fitem + { + @lexer.state = :expr_fname + } + fitem + { + result = @builder.alias(val[0], val[1], val[3]) + } + | kALIAS tGVAR tGVAR + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + } + | kALIAS tGVAR tBACK_REF + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + } + | kALIAS tGVAR tNTH_REF + { + diagnostic :error, :nth_ref_alias, nil, val[2] + } + | kUNDEF undef_list + { + result = @builder.undef_method(val[0], val[1]) + } + | stmt kIF_MOD expr_value + { + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + } + | stmt kUNLESS_MOD expr_value + { + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + } + | stmt kWHILE_MOD expr_value + { + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + } + | stmt kUNTIL_MOD expr_value + { + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + } + | stmt kRESCUE_MOD stmt + { + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + } + | klEND tLCURLY compstmt tRCURLY + { + result = @builder.postexe(val[0], val[1], val[2], val[3]) + } + | command_asgn + | mlhs tEQL command_call + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN command_call + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | backref tOP_ASGN command_call + { + @builder.op_assign(val[0], val[1], val[2]) + } + | lhs tEQL mrhs + { + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | mlhs tEQL arg_value + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | mlhs tEQL mrhs + { + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | expr + + command_asgn: lhs tEQL command_call + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL command_asgn + { + result = @builder.assign(val[0], val[1], val[2]) + } + + expr: command_call + | expr kAND expr + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | expr kOR expr + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kNOT opt_nl expr + { + result = @builder.not_op(val[0], nil, val[2], nil) + } + | tBANG command_call + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | arg + + expr_value: expr + + command_call: command + | block_command + + block_command: block_call + | block_call tDOT operation2 command_args + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + | block_call tCOLON2 operation2 command_args + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + + cmd_brace_block: tLBRACE_ARG + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + command: operation command_args =tLOWEST + { + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + } + | operation command_args cmd_brace_block + { + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tDOT operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + | primary_value tDOT operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | kSUPER command_args + { + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + } + | kYIELD command_args + { + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + } + | kRETURN call_args + { + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + } + | kBREAK call_args + { + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + } + | kNEXT call_args + { + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + } + + mlhs: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_inner: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + mlhs_basic: mlhs_head + | mlhs_head mlhs_item + { + result = val[0]. + push(val[1]) + } + | mlhs_head tSTAR mlhs_node + { + result = val[0]. + push(@builder.splat(val[1], val[2])) + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + } + | mlhs_head tSTAR + { + result = val[0]. + push(@builder.splat(val[1])) + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + } + | tSTAR mlhs_node + { + result = [ @builder.splat(val[0], val[1]) ] + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.splat(val[0]) ] + } + | tSTAR tCOMMA mlhs_post + { + result = [ @builder.splat(val[0]), + *val[2] ] + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_head: mlhs_item tCOMMA + { + result = [ val[0] ] + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1] + } + + mlhs_post: mlhs_item + { + result = [ val[0] ] + } + | mlhs_post tCOMMA mlhs_item + { + result = val[0] << val[2] + } + + mlhs_node: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + lhs: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + cname: tIDENTIFIER + { + diagnostic :error, :module_name_const, nil, val[0] + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = @builder.const_global(val[0], val[1]) + } + | cname + { + result = @builder.const(val[0]) + } + | primary_value tCOLON2 cname + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + | reswords + + fsym: fname + { + result = @builder.symbol(val[0]) + } + | symbol + + fitem: fsym + | dsym + + undef_list: fitem + { + result = [ val[0] ] + } + | undef_list tCOMMA + { + @lexer.state = :expr_fname + } + fitem + { + result = val[0] << val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + } + | var_lhs tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg + { + diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ] + } + | tCOLON3 tCONSTANT tOP_ASGN arg + { + diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ] + } + | backref tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | arg tDOT2 arg + { + result = @builder.range_inclusive(val[0], val[1], val[2]) + } + | arg tDOT3 arg + { + result = @builder.range_exclusive(val[0], val[1], val[2]) + } + | arg tPLUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMINUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tSTAR2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tDIVIDE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPERCENT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPOW arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tUMINUS_NUM tINTEGER tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + } + | tUMINUS_NUM tFLOAT tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + } + | tUPLUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | tUMINUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tPIPE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCARET arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tAMPER2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCMP arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tNEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMATCH arg + { + result = @builder.match_op(val[0], val[1], val[2]) + } + | arg tNMATCH arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tBANG arg + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | tTILDE arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tLSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tRSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tANDOP arg + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | arg tOROP arg + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kDEFINED opt_nl arg + { + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + } + + | arg tEH arg opt_nl tCOLON arg + { + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + } + | primary + + arg_value: arg + + aref_args: none + | args trailer + | args tCOMMA assocs trailer + { + result = val[0] << @builder.associate(nil, val[2], nil) + } + | assocs trailer + { + result = [ @builder.associate(nil, val[0], nil) ] + } + + paren_args: tLPAREN2 opt_call_args rparen + { + result = val + } + + opt_paren_args: # nothing + { + result = [ nil, [], nil ] + } + | paren_args + + opt_call_args: # nothing + { + result = [] + } + | call_args + | args tCOMMA + | args tCOMMA assocs tCOMMA + { + result = val[0] << @builder.associate(nil, val[2], nil) + } + | assocs tCOMMA + { + result = [ @builder.associate(nil, val[0], nil) ] + } + + call_args: command + { + result = [ val[0] ] + } + | args opt_block_arg + { + result = val[0].concat(val[1]) + } + | assocs opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + } + | args tCOMMA assocs opt_block_arg + { + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + } + | block_arg + { + result = [ val[0] ] + } + + command_args: { + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + } + call_args + { + @lexer.cmdarg = val[0] + + result = val[1] + } + + block_arg: tAMPER arg_value + { + result = @builder.block_pass(val[0], val[1]) + } + + opt_block_arg: tCOMMA block_arg + { + result = [ val[1] ] + } + | # nothing + { + result = [] + } + + args: arg_value + { + result = [ val[0] ] + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + | args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | var_ref + | backref + | tFID + { + result = @builder.call_method(nil, nil, val[0]) + } + | kBEGIN bodystmt kEND + { + result = @builder.begin_keyword(val[0], val[1], val[2]) + } + | tLPAREN_ARG + { + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + } + expr + { + @lexer.state = :expr_endarg + } + opt_nl tRPAREN + { + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + } + | tLPAREN compstmt tRPAREN + { + result = @builder.begin(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + | tCOLON3 tCONSTANT + { + result = @builder.const_global(val[0], val[1]) + } + | tLBRACK aref_args tRBRACK + { + result = @builder.array(val[0], val[1], val[2]) + } + | tLBRACE assoc_list tRCURLY + { + result = @builder.associate(val[0], val[1], val[2]) + } + | kRETURN + { + result = @builder.keyword_cmd(:return, val[0]) + } + | kYIELD tLPAREN2 call_args rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + } + | kYIELD tLPAREN2 rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + } + | kYIELD + { + result = @builder.keyword_cmd(:yield, val[0]) + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + } + | kNOT tLPAREN2 expr rparen + { + result = @builder.not_op(val[0], val[1], val[2], val[3]) + } + | kNOT tLPAREN2 rparen + { + result = @builder.not_op(val[0], val[1], nil, val[2]) + } + | operation brace_block + { + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | method_call + | method_call brace_block + { + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + } + | tLAMBDA lambda + { + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[1] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + } + | kIF expr_value then compstmt if_tail kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + } + | kUNLESS expr_value then compstmt opt_else kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + } + | kWHILE + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + } + | kUNTIL + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + } + | kCASE expr_value opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + } + | kCASE opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + } + | kFOR for_var kIN + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + } + | kCLASS cpath superclass + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :class_in_def, nil, val[0] + end + + lt_t, superclass = val[2] + result = @builder.def_class(val[0], val[1], + lt_t, superclass, + val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kCLASS tLSHFT expr term + { + result = @def_level + @def_level = 0 + + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + result = @builder.def_sclass(val[0], val[1], val[2], + val[5], val[6]) + + @lexer.pop_cmdarg + @static_env.unextend + + @def_level = val[4] + } + | kMODULE cpath + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :module_in_def, nil, val[0] + end + + result = @builder.def_module(val[0], val[1], + val[3], val[4]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kDEF fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kDEF singleton dot_or_colon + { + @lexer.state = :expr_fname + } + fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kBREAK + { + result = @builder.keyword_cmd(:break, val[0]) + } + | kNEXT + { + result = @builder.keyword_cmd(:next, val[0]) + } + | kREDO + { + result = @builder.keyword_cmd(:redo, val[0]) + } + | kRETRY + { + result = @builder.keyword_cmd(:retry, val[0]) + } + + primary_value: primary + + then: term + | kTHEN + | term kTHEN + { + result = val[1] + } + + do: term + | kDO_COND + + if_tail: opt_else + | kELSIF expr_value then compstmt if_tail + { + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + } + + opt_else: none + | kELSE compstmt + { + result = val + } + + for_var: lhs + | mlhs + + f_marg: f_norm_arg + { + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + } + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_marg_list: f_marg + { + result = [ val[0] ] + } + | f_marg_list tCOMMA f_marg + { + result = val[0] << val[2] + } + + f_margs: f_marg_list + | f_marg_list tCOMMA tSTAR f_norm_arg + { + @static_env.declare val[3][0] + + result = val[0]. + push(@builder.restarg(val[2], val[3])) + } + | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list + { + @static_env.declare val[3][0] + + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + } + | f_marg_list tCOMMA tSTAR + { + result = val[0]. + push(@builder.restarg(val[2])) + } + | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list + { + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + } + | tSTAR f_norm_arg + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + } + | tSTAR f_norm_arg tCOMMA f_marg_list + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.restarg(val[0]) ] + } + | tSTAR tCOMMA f_marg_list + { + result = [ @builder.restarg(val[0]), + *val[2] ] + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_block_optarg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_block_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_block_optarg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_block_optarg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_block_arg + { + result = [ val[0] ] + } + + opt_block_param: # nothing + { + result = @builder.args(nil, [], nil) + } + | block_param_def + { + @lexer.state = :expr_value + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1], val[2]) + } + | tOROP + { + result = @builder.args(val[0], [], val[0]) + } + | tPIPE block_param opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + + opt_bv_decl: # nothing + { + result = [] + } + | tSEMI bv_decls + { + result = val[1] + } + + bv_decls: bvar + { + result = [ val[0] ] + } + | bv_decls tCOMMA bvar + { + result = val[0] << val[2] + } + + bvar: tIDENTIFIER + { + result = @builder.shadowarg(val[0]) + } + | f_bad_arg + + lambda: { + @static_env.extend_dynamic + } + f_larglist lambda_body + { + result = [ val[1], val[2] ] + + @static_env.unextend + } + + f_larglist: tLPAREN2 f_args opt_bv_decl rparen + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + | f_args + { + result = @builder.args(nil, val[0], nil) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = [ val[0], val[1], val[2] ] + } + | kDO_LAMBDA compstmt kEND + { + result = [ val[0], val[1], val[2] ] + } + + do_block: kDO_BLOCK + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + block_call: command do_block + { + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + } + | block_call tDOT operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | block_call tCOLON2 operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + + method_call: operation paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + } + | primary_value tDOT operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation2 paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation3 + { + result = @builder.call_method(val[0], val[1], val[2]) + } + | primary_value tDOT paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | kSUPER paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + } + | kSUPER + { + result = @builder.keyword_cmd(:zsuper, val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index(val[0], val[1], val[2], val[3]) + } + + brace_block: tLCURLY + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + | kDO + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + case_body: kWHEN args then compstmt cases + { + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + } + + cases: opt_else + { + result = [ val[0] ] + } + | case_body + + opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue + { + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + } + | + { + result = [] + } + + exc_list: arg_value + { + result = [ val[0] ] + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = [ val[0], val[1] ] + } + | none + + opt_ensure: kENSURE compstmt + { + result = [ val[0], val[1] ] + } + | none + + literal: numeric + | symbol + | dsym + + strings: string + { + result = @builder.string_compose(nil, val[0], nil) + } + + string: string1 + { + result = [ val[0] ] + } + | string string1 + { + result = val[0] << val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + result = @builder.string_compose(val[0], val[1], val[2]) + } + | tSTRING + { + result = @builder.string(val[0]) + } + | tCHARACTER + { + result = @builder.character(val[0]) + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = @builder.xstring_compose(val[0], val[1], val[2]) + } + + regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT + { + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + } + + words: tWORDS_BEG word_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + word_list: # nothing + { + result = [] + } + | word_list word tSPACE + { + result = val[0] << @builder.word(val[1]) + } + + word: string_content + { + result = [ val[0] ] + } + | word string_content + { + result = val[0] << val[1] + } + + qwords: tQWORDS_BEG qword_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + qword_list: # nothing + { + result = [] + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0] << @builder.string_internal(val[1]) + } + + string_contents: # nothing + { + result = [] + } + | string_contents string_content + { + result = val[0] << val[1] + } + +xstring_contents: # nothing + { + result = [] + } + | xstring_contents string_content + { + result = val[0] << val[1] + } + +regexp_contents: # nothing + { + result = [] + } + | regexp_contents string_content + { + result = val[0] << val[1] + } + + string_content: tSTRING_CONTENT + { + result = @builder.string_internal(val[0]) + } + | tSTRING_DVAR string_dvar + { + result = val[1] + } + | tSTRING_DBEG + { + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + } + compstmt tRCURLY + { + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + } + + string_dvar: tGVAR + { + result = @builder.gvar(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + | backref + + + symbol: tSYMBOL + { + result = @builder.symbol(val[0]) + } + + dsym: tSYMBEG xstring_contents tSTRING_END + { + result = @builder.symbol_compose(val[0], val[1], val[2]) + } + + numeric: tINTEGER + { + result = @builder.integer(val[0]) + } + | tFLOAT + { + result = @builder.float(val[0]) + } + | tUMINUS_NUM tINTEGER =tLOWEST + { + result = @builder.negate(val[0], + @builder.integer(val[1])) + } + | tUMINUS_NUM tFLOAT =tLOWEST + { + result = @builder.negate(val[0], + @builder.float(val[1])) + } + + user_variable: tIDENTIFIER + { + result = @builder.ident(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tGVAR + { + result = @builder.gvar(val[0]) + } + | tCONSTANT + { + result = @builder.const(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + +keyword_variable: kNIL + { + result = @builder.nil(val[0]) + } + | kSELF + { + result = @builder.self(val[0]) + } + | kTRUE + { + result = @builder.true(val[0]) + } + | kFALSE + { + result = @builder.false(val[0]) + } + | k__FILE__ + { + result = @builder.__FILE__(val[0]) + } + | k__LINE__ + { + result = @builder.__LINE__(val[0]) + } + | k__ENCODING__ + { + result = @builder.__ENCODING__(val[0]) + } + + var_ref: user_variable + { + result = @builder.accessible(val[0]) + } + | keyword_variable + { + result = @builder.accessible(val[0]) + } + + var_lhs: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + + backref: tNTH_REF + { + result = @builder.nth_ref(val[0]) + } + | tBACK_REF + { + result = @builder.back_ref(val[0]) + } + + superclass: term + { + result = nil + } + | tLT expr_value term + { + result = [ val[0], val[1] ] + } + | error term + { + yyerrok + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + } + | f_args term + { + result = @builder.args(nil, val[0], nil) + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_optarg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_optarg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_f_block_arg + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_f_block_arg + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_block_arg + { + result = [ val[0] ] + } + | # nothing + { + result = [] + } + + f_bad_arg: tCONSTANT + { + diagnostic :error, :argument_const, nil, val[0] + } + | tIVAR + { + diagnostic :error, :argument_ivar, nil, val[0] + } + | tGVAR + { + diagnostic :error, :argument_gvar, nil, val[0] + } + | tCVAR + { + diagnostic :error, :argument_cvar, nil, val[0] + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + + f_arg_item: f_norm_arg + { + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + } + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_arg: f_arg_item + { + result = [ val[0] ] + } + | f_arg tCOMMA f_arg_item + { + result = val[0] << val[2] + } + + f_opt: tIDENTIFIER tEQL arg_value + { + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_opt: tIDENTIFIER tEQL primary_value + { + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_optarg: f_block_opt + { + result = [ val[0] ] + } + | f_block_optarg tCOMMA f_block_opt + { + result = val[0] << val[2] + } + + f_optarg: f_opt + { + result = [ val[0] ] + } + | f_optarg tCOMMA f_opt + { + result = val[0] << val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + } + | restarg_mark + { + result = [ @builder.restarg(val[0]) ] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + } + + opt_f_block_arg: tCOMMA f_block_arg + { + result = [ val[1] ] + } + | # nothing + { + result = [] + } + + singleton: var_ref + | tLPAREN2 expr rparen + { + result = val[1] + } + + assoc_list: # nothing + { + result = [] + } + | assocs trailer + + assocs: assoc + { + result = [ val[0] ] + } + | assocs tCOMMA assoc + { + result = val[0] << val[2] + } + + assoc: arg_value tASSOC arg_value + { + result = @builder.pair(val[0], val[1], val[2]) + } + | tLABEL arg_value + { + result = @builder.pair_keyword(val[0], val[1]) + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + result = val[1] + } + rbracket: opt_nl tRBRACK + { + result = val[1] + } + trailer: | tNL | tCOMMA + + term: tSEMI + { + yyerrok + } + | tNL + + terms: term + | terms tSEMI + + none: # nothing + { + result = nil + } +end + +---- header + +require 'parser' + +Parser.check_for_encoding_support + +---- inner + + def version + 19 + end + + def default_encoding + Encoding::BINARY + end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby20.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby20.y new file mode 100644 index 000000000000..6e07734778a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby20.y @@ -0,0 +1,2350 @@ +# Copyright (c) 2013 Peter Zotov <whitequark@whitequark.org> +# +# Parts of the source are derived from ruby_parser: +# Copyright (c) Ryan Davis, seattle.rb +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class Parser::Ruby20 + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tDSTAR tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tREGEXP_OPT + tWORDS_BEG tQWORDS_BEG tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DBEG + tSTRING_DVAR tSTRING_END tSTRING_DEND tSTRING tSYMBOL + tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG tCHARACTER + +prechigh + right tBANG tTILDE tUPLUS + right tPOW + right tUMINUS_NUM tUMINUS + left tSTAR2 tDIVIDE tPERCENT + left tPLUS tMINUS + left tLSHFT tRSHFT + left tAMPER2 + left tPIPE tCARET + left tGT tGEQ tLT tLEQ + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tANDOP + left tOROP + nonassoc tDOT2 tDOT3 + right tEH tCOLON + left kRESCUE_MOD + right tEQL tOP_ASGN + nonassoc kDEFINED + right kNOT + left kOR kAND + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + nonassoc tLBRACE_ARG + nonassoc tLOWEST +preclow + +rule + + program: top_compstmt + + top_compstmt: top_stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + top_stmts: # nothing + { + result = [] + } + | top_stmt + { + result = [ val[0] ] + } + | top_stmts terms top_stmt + { + result = val[0] << val[2] + } + | error top_stmt + { + result = [ val[1] ] + } + + top_stmt: stmt + | klBEGIN tLCURLY top_compstmt tRCURLY + { + result = @builder.preexe(val[0], val[1], val[2], val[3]) + } + + bodystmt: compstmt opt_rescue opt_else opt_ensure + { + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + } + + compstmt: stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + stmts: # nothing + { + result = [] + } + | stmt_or_begin + { + result = [ val[0] ] + } + | stmts terms stmt_or_begin + { + result = val[0] << val[2] + } + | error stmt + { + result = [ val[1] ] + } + + stmt_or_begin: stmt + | klBEGIN tLCURLY top_compstmt tRCURLY + { + if in_def? + diagnostic :error, :begin_in_method, nil, val[0] + end + + result = @builder.preexe(val[0], val[1], val[2], val[3]) + } + + stmt: kALIAS fitem + { + @lexer.state = :expr_fname + } + fitem + { + result = @builder.alias(val[0], val[1], val[3]) + } + | kALIAS tGVAR tGVAR + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + } + | kALIAS tGVAR tBACK_REF + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + } + | kALIAS tGVAR tNTH_REF + { + diagnostic :error, :nth_ref_alias, nil, val[2] + } + | kUNDEF undef_list + { + result = @builder.undef_method(val[0], val[1]) + } + | stmt kIF_MOD expr_value + { + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + } + | stmt kUNLESS_MOD expr_value + { + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + } + | stmt kWHILE_MOD expr_value + { + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + } + | stmt kUNTIL_MOD expr_value + { + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + } + | stmt kRESCUE_MOD stmt + { + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + } + | klEND tLCURLY compstmt tRCURLY + { + result = @builder.postexe(val[0], val[1], val[2], val[3]) + } + | command_asgn + | mlhs tEQL command_call + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN command_call + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | backref tOP_ASGN command_call + { + @builder.op_assign(val[0], val[1], val[2]) + } + | lhs tEQL mrhs + { + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | mlhs tEQL arg_value + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | mlhs tEQL mrhs + { + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | expr + + command_asgn: lhs tEQL command_call + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL command_asgn + { + result = @builder.assign(val[0], val[1], val[2]) + } + + expr: command_call + | expr kAND expr + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | expr kOR expr + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kNOT opt_nl expr + { + result = @builder.not_op(val[0], nil, val[2], nil) + } + | tBANG command_call + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | arg + + expr_value: expr + + command_call: command + | block_command + + block_command: block_call + | block_call dot_or_colon operation2 command_args + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + + cmd_brace_block: tLBRACE_ARG + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + fcall: operation + + command: fcall command_args =tLOWEST + { + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + } + | fcall command_args cmd_brace_block + { + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tDOT operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + | primary_value tDOT operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | kSUPER command_args + { + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + } + | kYIELD command_args + { + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + } + | kRETURN call_args + { + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + } + | kBREAK call_args + { + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + } + | kNEXT call_args + { + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + } + + mlhs: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_inner: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + mlhs_basic: mlhs_head + | mlhs_head mlhs_item + { + result = val[0]. + push(val[1]) + } + | mlhs_head tSTAR mlhs_node + { + result = val[0]. + push(@builder.splat(val[1], val[2])) + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + } + | mlhs_head tSTAR + { + result = val[0]. + push(@builder.splat(val[1])) + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + } + | tSTAR mlhs_node + { + result = [ @builder.splat(val[0], val[1]) ] + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.splat(val[0]) ] + } + | tSTAR tCOMMA mlhs_post + { + result = [ @builder.splat(val[0]), + *val[2] ] + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_head: mlhs_item tCOMMA + { + result = [ val[0] ] + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1] + } + + mlhs_post: mlhs_item + { + result = [ val[0] ] + } + | mlhs_post tCOMMA mlhs_item + { + result = val[0] << val[2] + } + + mlhs_node: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + lhs: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + cname: tIDENTIFIER + { + diagnostic :error, :module_name_const, nil, val[0] + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = @builder.const_global(val[0], val[1]) + } + | cname + { + result = @builder.const(val[0]) + } + | primary_value tCOLON2 cname + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + | reswords + + fsym: fname + { + result = @builder.symbol(val[0]) + } + | symbol + + fitem: fsym + | dsym + + undef_list: fitem + { + result = [ val[0] ] + } + | undef_list tCOMMA + { + @lexer.state = :expr_fname + } + fitem + { + result = val[0] << val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tDSTAR | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + } + | var_lhs tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg + { + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + } + | tCOLON3 tCONSTANT tOP_ASGN arg + { + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + } + | backref tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | arg tDOT2 arg + { + result = @builder.range_inclusive(val[0], val[1], val[2]) + } + | arg tDOT3 arg + { + result = @builder.range_exclusive(val[0], val[1], val[2]) + } + | arg tPLUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMINUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tSTAR2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tDIVIDE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPERCENT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPOW arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tUMINUS_NUM tINTEGER tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + } + | tUMINUS_NUM tFLOAT tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + } + | tUPLUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | tUMINUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tPIPE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCARET arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tAMPER2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCMP arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tNEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMATCH arg + { + result = @builder.match_op(val[0], val[1], val[2]) + } + | arg tNMATCH arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tBANG arg + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | tTILDE arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tLSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tRSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tANDOP arg + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | arg tOROP arg + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kDEFINED opt_nl arg + { + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + } + + | arg tEH arg opt_nl tCOLON arg + { + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + } + | primary + + arg_value: arg + + aref_args: none + | args trailer + | args tCOMMA assocs trailer + { + result = val[0] << @builder.associate(nil, val[2], nil) + } + | assocs trailer + { + result = [ @builder.associate(nil, val[0], nil) ] + } + + paren_args: tLPAREN2 opt_call_args rparen + { + result = val + } + + opt_paren_args: # nothing + { + result = [ nil, [], nil ] + } + | paren_args + + opt_call_args: # nothing + { + result = [] + } + | call_args + | args tCOMMA + | args tCOMMA assocs tCOMMA + { + result = val[0] << @builder.associate(nil, val[2], nil) + } + | assocs tCOMMA + { + result = [ @builder.associate(nil, val[0], nil) ] + } + + call_args: command + { + result = [ val[0] ] + } + | args opt_block_arg + { + result = val[0].concat(val[1]) + } + | assocs opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + } + | args tCOMMA assocs opt_block_arg + { + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + } + | block_arg + { + result = [ val[0] ] + } + + command_args: { + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + } + call_args + { + @lexer.cmdarg = val[0] + + result = val[1] + } + + block_arg: tAMPER arg_value + { + result = @builder.block_pass(val[0], val[1]) + } + + opt_block_arg: tCOMMA block_arg + { + result = [ val[1] ] + } + | # nothing + { + result = [] + } + + args: arg_value + { + result = [ val[0] ] + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + | args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + result = @builder.call_method(nil, nil, val[0]) + } + | kBEGIN + { + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + } + bodystmt kEND + { + @lexer.cmdarg = val[1] + + result = @builder.begin_keyword(val[0], val[2], val[3]) + } + | tLPAREN_ARG + { + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + } + expr + { + @lexer.state = :expr_endarg + } + opt_nl tRPAREN + { + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + } + | tLPAREN_ARG + { + @lexer.state = :expr_endarg + } + opt_nl tRPAREN + { + result = @builder.begin(val[0], nil, val[3]) + } + | tLPAREN compstmt tRPAREN + { + result = @builder.begin(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + | tCOLON3 tCONSTANT + { + result = @builder.const_global(val[0], val[1]) + } + | tLBRACK aref_args tRBRACK + { + result = @builder.array(val[0], val[1], val[2]) + } + | tLBRACE assoc_list tRCURLY + { + result = @builder.associate(val[0], val[1], val[2]) + } + | kRETURN + { + result = @builder.keyword_cmd(:return, val[0]) + } + | kYIELD tLPAREN2 call_args rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + } + | kYIELD tLPAREN2 rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + } + | kYIELD + { + result = @builder.keyword_cmd(:yield, val[0]) + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + } + | kNOT tLPAREN2 expr rparen + { + result = @builder.not_op(val[0], val[1], val[2], val[3]) + } + | kNOT tLPAREN2 rparen + { + result = @builder.not_op(val[0], val[1], nil, val[2]) + } + | fcall brace_block + { + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | method_call + | method_call brace_block + { + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + } + | tLAMBDA lambda + { + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[1] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + } + | kIF expr_value then compstmt if_tail kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + } + | kUNLESS expr_value then compstmt opt_else kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + } + | kWHILE + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + } + | kUNTIL + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + } + | kCASE expr_value opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + } + | kCASE opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + } + | kFOR for_var kIN + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + } + | kCLASS cpath superclass + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :class_in_def, nil, val[0] + end + + lt_t, superclass = val[2] + result = @builder.def_class(val[0], val[1], + lt_t, superclass, + val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kCLASS tLSHFT expr term + { + result = @def_level + @def_level = 0 + + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + result = @builder.def_sclass(val[0], val[1], val[2], + val[5], val[6]) + + @lexer.pop_cmdarg + @static_env.unextend + + @def_level = val[4] + } + | kMODULE cpath + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :module_in_def, nil, val[0] + end + + result = @builder.def_module(val[0], val[1], + val[3], val[4]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kDEF fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kDEF singleton dot_or_colon + { + @lexer.state = :expr_fname + } + fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kBREAK + { + result = @builder.keyword_cmd(:break, val[0]) + } + | kNEXT + { + result = @builder.keyword_cmd(:next, val[0]) + } + | kREDO + { + result = @builder.keyword_cmd(:redo, val[0]) + } + | kRETRY + { + result = @builder.keyword_cmd(:retry, val[0]) + } + + primary_value: primary + + then: term + | kTHEN + | term kTHEN + { + result = val[1] + } + + do: term + | kDO_COND + + if_tail: opt_else + | kELSIF expr_value then compstmt if_tail + { + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + } + + opt_else: none + | kELSE compstmt + { + result = val + } + + for_var: lhs + | mlhs + + f_marg: f_norm_arg + { + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + } + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_marg_list: f_marg + { + result = [ val[0] ] + } + | f_marg_list tCOMMA f_marg + { + result = val[0] << val[2] + } + + f_margs: f_marg_list + | f_marg_list tCOMMA tSTAR f_norm_arg + { + @static_env.declare val[3][0] + + result = val[0]. + push(@builder.restarg(val[2], val[3])) + } + | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list + { + @static_env.declare val[3][0] + + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + } + | f_marg_list tCOMMA tSTAR + { + result = val[0]. + push(@builder.restarg(val[2])) + } + | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list + { + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + } + | tSTAR f_norm_arg + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + } + | tSTAR f_norm_arg tCOMMA f_marg_list + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.restarg(val[0]) ] + } + | tSTAR tCOMMA f_marg_list + { + result = [ @builder.restarg(val[0]), + *val[2] ] + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = val[0].concat(val[2]).concat(val[3]) + } + | f_block_kwarg opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_kwrest opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_block_arg + { + result = [ val[0] ] + } + +opt_block_args_tail: + tCOMMA block_args_tail + { + result = val[1] + } + | # nothing + { + result = [] + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_block_args_tail + { + result = val[0].concat(val[1]) + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_block_optarg opt_block_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | block_args_tail + + opt_block_param: # nothing + { + result = @builder.args(nil, [], nil) + } + | block_param_def + { + @lexer.state = :expr_value + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1], val[2]) + } + | tOROP + { + result = @builder.args(val[0], [], val[0]) + } + | tPIPE block_param opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + + opt_bv_decl: opt_nl + { + result = [] + } + | opt_nl tSEMI bv_decls opt_nl + { + result = val[2] + } + + bv_decls: bvar + { + result = [ val[0] ] + } + | bv_decls tCOMMA bvar + { + result = val[0] << val[2] + } + + bvar: tIDENTIFIER + { + result = @builder.shadowarg(val[0]) + } + | f_bad_arg + + lambda: { + @static_env.extend_dynamic + } + f_larglist lambda_body + { + result = [ val[1], val[2] ] + + @static_env.unextend + } + + f_larglist: tLPAREN2 f_args opt_bv_decl tRPAREN + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + | f_args + { + result = @builder.args(nil, val[0], nil) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = [ val[0], val[1], val[2] ] + } + | kDO_LAMBDA compstmt kEND + { + result = [ val[0], val[1], val[2] ] + } + + do_block: kDO_BLOCK + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + block_call: command do_block + { + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + } + | block_call dot_or_colon operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | block_call dot_or_colon operation2 opt_paren_args brace_block + { + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | block_call dot_or_colon operation2 command_args do_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + + method_call: fcall paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + } + | primary_value tDOT operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation2 paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation3 + { + result = @builder.call_method(val[0], val[1], val[2]) + } + | primary_value tDOT paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | kSUPER paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + } + | kSUPER + { + result = @builder.keyword_cmd(:zsuper, val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index(val[0], val[1], val[2], val[3]) + } + + brace_block: tLCURLY + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + | kDO + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + case_body: kWHEN args then compstmt cases + { + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + } + + cases: opt_else + { + result = [ val[0] ] + } + | case_body + + opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue + { + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + } + | + { + result = [] + } + + exc_list: arg_value + { + result = [ val[0] ] + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = [ val[0], val[1] ] + } + | none + + opt_ensure: kENSURE compstmt + { + result = [ val[0], val[1] ] + } + | none + + literal: numeric + | symbol + | dsym + + strings: string + { + result = @builder.string_compose(nil, val[0], nil) + } + + string: string1 + { + result = [ val[0] ] + } + | string string1 + { + result = val[0] << val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + result = @builder.string_compose(val[0], val[1], val[2]) + } + | tSTRING + { + result = @builder.string(val[0]) + } + | tCHARACTER + { + result = @builder.character(val[0]) + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = @builder.xstring_compose(val[0], val[1], val[2]) + } + + regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT + { + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + } + + words: tWORDS_BEG word_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + word_list: # nothing + { + result = [] + } + | word_list word tSPACE + { + result = val[0] << @builder.word(val[1]) + } + + word: string_content + { + result = [ val[0] ] + } + | word string_content + { + result = val[0] << val[1] + } + + symbols: tSYMBOLS_BEG symbol_list tSTRING_END + { + result = @builder.symbols_compose(val[0], val[1], val[2]) + } + + symbol_list: # nothing + { + result = [] + } + | symbol_list word tSPACE + { + result = val[0] << @builder.word(val[1]) + } + + qwords: tQWORDS_BEG qword_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + qsymbols: tQSYMBOLS_BEG qsym_list tSTRING_END + { + result = @builder.symbols_compose(val[0], val[1], val[2]) + } + + qword_list: # nothing + { + result = [] + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0] << @builder.string_internal(val[1]) + } + + qsym_list: # nothing + { + result = [] + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0] << @builder.symbol_internal(val[1]) + } + + string_contents: # nothing + { + result = [] + } + | string_contents string_content + { + result = val[0] << val[1] + } + +xstring_contents: # nothing + { + result = [] + } + | xstring_contents string_content + { + result = val[0] << val[1] + } + +regexp_contents: # nothing + { + result = [] + } + | regexp_contents string_content + { + result = val[0] << val[1] + } + + string_content: tSTRING_CONTENT + { + result = @builder.string_internal(val[0]) + } + | tSTRING_DVAR string_dvar + { + result = val[1] + } + | tSTRING_DBEG + { + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + } + compstmt tSTRING_DEND + { + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + } + + string_dvar: tGVAR + { + result = @builder.gvar(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + | backref + + + symbol: tSYMBOL + { + result = @builder.symbol(val[0]) + } + + dsym: tSYMBEG xstring_contents tSTRING_END + { + result = @builder.symbol_compose(val[0], val[1], val[2]) + } + + numeric: tINTEGER + { + result = @builder.integer(val[0]) + } + | tFLOAT + { + result = @builder.float(val[0]) + } + | tUMINUS_NUM tINTEGER =tLOWEST + { + result = @builder.negate(val[0], + @builder.integer(val[1])) + } + | tUMINUS_NUM tFLOAT =tLOWEST + { + result = @builder.negate(val[0], + @builder.float(val[1])) + } + + user_variable: tIDENTIFIER + { + result = @builder.ident(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tGVAR + { + result = @builder.gvar(val[0]) + } + | tCONSTANT + { + result = @builder.const(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + +keyword_variable: kNIL + { + result = @builder.nil(val[0]) + } + | kSELF + { + result = @builder.self(val[0]) + } + | kTRUE + { + result = @builder.true(val[0]) + } + | kFALSE + { + result = @builder.false(val[0]) + } + | k__FILE__ + { + result = @builder.__FILE__(val[0]) + } + | k__LINE__ + { + result = @builder.__LINE__(val[0]) + } + | k__ENCODING__ + { + result = @builder.__ENCODING__(val[0]) + } + + var_ref: user_variable + { + result = @builder.accessible(val[0]) + } + | keyword_variable + { + result = @builder.accessible(val[0]) + } + + var_lhs: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + + backref: tNTH_REF + { + result = @builder.nth_ref(val[0]) + } + | tBACK_REF + { + result = @builder.back_ref(val[0]) + } + + superclass: term + { + result = nil + } + | tLT + { + @lexer.state = :expr_value + } + expr_value term + { + result = [ val[0], val[2] ] + } + | error term + { + yyerrok + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + } + | f_args term + { + result = @builder.args(nil, val[0], nil) + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = val[0].concat(val[2]).concat(val[3]) + } + | f_kwarg opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_kwrest opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_block_arg + { + result = [ val[0] ] + } + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | # nothing + { + result = [] + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_optarg opt_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | args_tail + { + result = val[0] + } + | # nothing + { + result = [] + } + + f_bad_arg: tCONSTANT + { + diagnostic :error, :argument_const, nil, val[0] + } + | tIVAR + { + diagnostic :error, :argument_ivar, nil, val[0] + } + | tGVAR + { + diagnostic :error, :argument_gvar, nil, val[0] + } + | tCVAR + { + diagnostic :error, :argument_cvar, nil, val[0] + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + + f_arg_item: f_norm_arg + { + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + } + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_arg: f_arg_item + { + result = [ val[0] ] + } + | f_arg tCOMMA f_arg_item + { + result = val[0] << val[2] + } + + f_kw: tLABEL arg_value + { + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = @builder.kwoptarg(val[0], val[1]) + } + + f_block_kw: tLABEL primary_value + { + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = @builder.kwoptarg(val[0], val[1]) + } + + f_block_kwarg: f_block_kw + { + result = [ val[0] ] + } + | f_block_kwarg tCOMMA f_block_kw + { + result = val[0] << val[2] + } + + f_kwarg: f_kw + { + result = [ val[0] ] + } + | f_kwarg tCOMMA f_kw + { + result = val[0] << val[2] + } + + kwrest_mark: tPOW | tDSTAR + + f_kwrest: kwrest_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + } + | kwrest_mark + { + result = [ @builder.kwrestarg(val[0]) ] + } + + f_opt: tIDENTIFIER tEQL arg_value + { + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_opt: tIDENTIFIER tEQL primary_value + { + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_optarg: f_block_opt + { + result = [ val[0] ] + } + | f_block_optarg tCOMMA f_block_opt + { + result = val[0] << val[2] + } + + f_optarg: f_opt + { + result = [ val[0] ] + } + | f_optarg tCOMMA f_opt + { + result = val[0] << val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + } + | restarg_mark + { + result = [ @builder.restarg(val[0]) ] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + } + + opt_f_block_arg: tCOMMA f_block_arg + { + result = [ val[1] ] + } + | + { + result = [] + } + + singleton: var_ref + | tLPAREN2 expr rparen + { + result = val[1] + } + + assoc_list: # nothing + { + result = [] + } + | assocs trailer + + assocs: assoc + { + result = [ val[0] ] + } + | assocs tCOMMA assoc + { + result = val[0] << val[2] + } + + assoc: arg_value tASSOC arg_value + { + result = @builder.pair(val[0], val[1], val[2]) + } + | tLABEL arg_value + { + result = @builder.pair_keyword(val[0], val[1]) + } + | tDSTAR arg_value + { + result = @builder.kwsplat(val[0], val[1]) + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + result = val[1] + } + rbracket: opt_nl tRBRACK + { + result = val[1] + } + trailer: | tNL | tCOMMA + + term: tSEMI + { + yyerrok + } + | tNL + + terms: term + | terms tSEMI + + none: # nothing + { + result = nil + } +end + +---- header + +require 'parser' + +Parser.check_for_encoding_support + +---- inner + + def version + 20 + end + + def default_encoding + Encoding::UTF_8 + end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby21.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby21.y new file mode 100644 index 000000000000..2ac94afb0ce5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby21.y @@ -0,0 +1,2359 @@ +# Copyright (c) 2013 Peter Zotov <whitequark@whitequark.org> +# +# Parts of the source are derived from ruby_parser: +# Copyright (c) Ryan Davis, seattle.rb +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class Parser::Ruby21 + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tDSTAR tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tREGEXP_OPT + tWORDS_BEG tQWORDS_BEG tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DBEG + tSTRING_DVAR tSTRING_END tSTRING_DEND tSTRING tSYMBOL + tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG tCHARACTER + tRATIONAL tIMAGINARY + +prechigh + right tBANG tTILDE tUPLUS + right tPOW + right tUMINUS_NUM tUMINUS + left tSTAR2 tDIVIDE tPERCENT + left tPLUS tMINUS + left tLSHFT tRSHFT + left tAMPER2 + left tPIPE tCARET + left tGT tGEQ tLT tLEQ + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tANDOP + left tOROP + nonassoc tDOT2 tDOT3 + right tEH tCOLON + left kRESCUE_MOD + right tEQL tOP_ASGN + nonassoc kDEFINED + right kNOT + left kOR kAND + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + nonassoc tLBRACE_ARG + nonassoc tLOWEST +preclow + +rule + + program: top_compstmt + + top_compstmt: top_stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + top_stmts: # nothing + { + result = [] + } + | top_stmt + { + result = [ val[0] ] + } + | top_stmts terms top_stmt + { + result = val[0] << val[2] + } + | error top_stmt + { + result = [ val[1] ] + } + + top_stmt: stmt + | klBEGIN tLCURLY top_compstmt tRCURLY + { + result = @builder.preexe(val[0], val[1], val[2], val[3]) + } + + bodystmt: compstmt opt_rescue opt_else opt_ensure + { + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + } + + compstmt: stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + stmts: # nothing + { + result = [] + } + | stmt_or_begin + { + result = [ val[0] ] + } + | stmts terms stmt_or_begin + { + result = val[0] << val[2] + } + | error stmt + { + result = [ val[1] ] + } + + stmt_or_begin: stmt + | klBEGIN tLCURLY top_compstmt tRCURLY + { + diagnostic :error, :begin_in_method, nil, val[0] + } + + stmt: kALIAS fitem + { + @lexer.state = :expr_fname + } + fitem + { + result = @builder.alias(val[0], val[1], val[3]) + } + | kALIAS tGVAR tGVAR + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + } + | kALIAS tGVAR tBACK_REF + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + } + | kALIAS tGVAR tNTH_REF + { + diagnostic :error, :nth_ref_alias, nil, val[2] + } + | kUNDEF undef_list + { + result = @builder.undef_method(val[0], val[1]) + } + | stmt kIF_MOD expr_value + { + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + } + | stmt kUNLESS_MOD expr_value + { + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + } + | stmt kWHILE_MOD expr_value + { + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + } + | stmt kUNTIL_MOD expr_value + { + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + } + | stmt kRESCUE_MOD stmt + { + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + } + | klEND tLCURLY compstmt tRCURLY + { + result = @builder.postexe(val[0], val[1], val[2], val[3]) + } + | command_asgn + | mlhs tEQL command_call + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN command_call + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | backref tOP_ASGN command_call + { + @builder.op_assign(val[0], val[1], val[2]) + } + | lhs tEQL mrhs + { + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | mlhs tEQL mrhs_arg + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | expr + + command_asgn: lhs tEQL command_call + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL command_asgn + { + result = @builder.assign(val[0], val[1], val[2]) + } + + expr: command_call + | expr kAND expr + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | expr kOR expr + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kNOT opt_nl expr + { + result = @builder.not_op(val[0], nil, val[2], nil) + } + | tBANG command_call + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | arg + + expr_value: expr + + command_call: command + | block_command + + block_command: block_call + | block_call dot_or_colon operation2 command_args + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + + cmd_brace_block: tLBRACE_ARG + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + fcall: operation + + command: fcall command_args =tLOWEST + { + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + } + | fcall command_args cmd_brace_block + { + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tDOT operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + | primary_value tDOT operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | kSUPER command_args + { + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + } + | kYIELD command_args + { + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + } + | kRETURN call_args + { + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + } + | kBREAK call_args + { + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + } + | kNEXT call_args + { + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + } + + mlhs: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_inner: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + mlhs_basic: mlhs_head + | mlhs_head mlhs_item + { + result = val[0]. + push(val[1]) + } + | mlhs_head tSTAR mlhs_node + { + result = val[0]. + push(@builder.splat(val[1], val[2])) + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + } + | mlhs_head tSTAR + { + result = val[0]. + push(@builder.splat(val[1])) + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + } + | tSTAR mlhs_node + { + result = [ @builder.splat(val[0], val[1]) ] + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.splat(val[0]) ] + } + | tSTAR tCOMMA mlhs_post + { + result = [ @builder.splat(val[0]), + *val[2] ] + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_head: mlhs_item tCOMMA + { + result = [ val[0] ] + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1] + } + + mlhs_post: mlhs_item + { + result = [ val[0] ] + } + | mlhs_post tCOMMA mlhs_item + { + result = val[0] << val[2] + } + + mlhs_node: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + lhs: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + cname: tIDENTIFIER + { + diagnostic :error, :module_name_const, nil, val[0] + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = @builder.const_global(val[0], val[1]) + } + | cname + { + result = @builder.const(val[0]) + } + | primary_value tCOLON2 cname + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + | reswords + + fsym: fname + { + result = @builder.symbol(val[0]) + } + | symbol + + fitem: fsym + | dsym + + undef_list: fitem + { + result = [ val[0] ] + } + | undef_list tCOMMA + { + @lexer.state = :expr_fname + } + fitem + { + result = val[0] << val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tDSTAR | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + } + | var_lhs tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg + { + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + } + | tCOLON3 tCONSTANT tOP_ASGN arg + { + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + } + | backref tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | arg tDOT2 arg + { + result = @builder.range_inclusive(val[0], val[1], val[2]) + } + | arg tDOT3 arg + { + result = @builder.range_exclusive(val[0], val[1], val[2]) + } + | arg tPLUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMINUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tSTAR2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tDIVIDE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPERCENT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPOW arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + } + | tUPLUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | tUMINUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tPIPE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCARET arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tAMPER2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCMP arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tNEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMATCH arg + { + result = @builder.match_op(val[0], val[1], val[2]) + } + | arg tNMATCH arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tBANG arg + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | tTILDE arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tLSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tRSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tANDOP arg + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | arg tOROP arg + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kDEFINED opt_nl arg + { + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + } + + | arg tEH arg opt_nl tCOLON arg + { + result = @builder.ternary(val[0], val[1], + val[2], val[4], val[5]) + } + | primary + + arg_value: arg + + aref_args: none + | args trailer + | args tCOMMA assocs trailer + { + result = val[0] << @builder.associate(nil, val[2], nil) + } + | assocs trailer + { + result = [ @builder.associate(nil, val[0], nil) ] + } + + paren_args: tLPAREN2 opt_call_args rparen + { + result = val + } + + opt_paren_args: # nothing + { + result = [ nil, [], nil ] + } + | paren_args + + opt_call_args: # nothing + { + result = [] + } + | call_args + | args tCOMMA + | args tCOMMA assocs tCOMMA + { + result = val[0] << @builder.associate(nil, val[2], nil) + } + | assocs tCOMMA + { + result = [ @builder.associate(nil, val[0], nil) ] + } + + call_args: command + { + result = [ val[0] ] + } + | args opt_block_arg + { + result = val[0].concat(val[1]) + } + | assocs opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + } + | args tCOMMA assocs opt_block_arg + { + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + } + | block_arg + { + result = [ val[0] ] + } + + command_args: { + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + } + call_args + { + @lexer.cmdarg = val[0] + + result = val[1] + } + + block_arg: tAMPER arg_value + { + result = @builder.block_pass(val[0], val[1]) + } + + opt_block_arg: tCOMMA block_arg + { + result = [ val[1] ] + } + | # nothing + { + result = [] + } + + args: arg_value + { + result = [ val[0] ] + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + | args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + + mrhs_arg: mrhs + { + result = @builder.array(nil, val[0], nil) + } + | arg_value + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + result = @builder.call_method(nil, nil, val[0]) + } + | kBEGIN + { + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + } + bodystmt kEND + { + @lexer.cmdarg = val[1] + + result = @builder.begin_keyword(val[0], val[2], val[3]) + } + | tLPAREN_ARG + { + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + } + expr + { + @lexer.state = :expr_endarg + } + opt_nl tRPAREN + { + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + } + | tLPAREN_ARG + { + @lexer.state = :expr_endarg + } + opt_nl tRPAREN + { + result = @builder.begin(val[0], nil, val[3]) + } + | tLPAREN compstmt tRPAREN + { + result = @builder.begin(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + | tCOLON3 tCONSTANT + { + result = @builder.const_global(val[0], val[1]) + } + | tLBRACK aref_args tRBRACK + { + result = @builder.array(val[0], val[1], val[2]) + } + | tLBRACE assoc_list tRCURLY + { + result = @builder.associate(val[0], val[1], val[2]) + } + | kRETURN + { + result = @builder.keyword_cmd(:return, val[0]) + } + | kYIELD tLPAREN2 call_args rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + } + | kYIELD tLPAREN2 rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + } + | kYIELD + { + result = @builder.keyword_cmd(:yield, val[0]) + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + } + | kNOT tLPAREN2 expr rparen + { + result = @builder.not_op(val[0], val[1], val[2], val[3]) + } + | kNOT tLPAREN2 rparen + { + result = @builder.not_op(val[0], val[1], nil, val[2]) + } + | fcall brace_block + { + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | method_call + | method_call brace_block + { + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + } + | tLAMBDA lambda + { + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[1] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + } + | kIF expr_value then compstmt if_tail kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + } + | kUNLESS expr_value then compstmt opt_else kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + } + | kWHILE + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + } + | kUNTIL + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + } + | kCASE expr_value opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + } + | kCASE opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + } + | kFOR for_var kIN + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + } + | kCLASS cpath superclass + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :class_in_def, nil, val[0] + end + + lt_t, superclass = val[2] + result = @builder.def_class(val[0], val[1], + lt_t, superclass, + val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kCLASS tLSHFT expr term + { + result = @def_level + @def_level = 0 + + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + result = @builder.def_sclass(val[0], val[1], val[2], + val[5], val[6]) + + @lexer.pop_cmdarg + @static_env.unextend + + @def_level = val[4] + } + | kMODULE cpath + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :module_in_def, nil, val[0] + end + + result = @builder.def_module(val[0], val[1], + val[3], val[4]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kDEF fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kDEF singleton dot_or_colon + { + @lexer.state = :expr_fname + } + fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kBREAK + { + result = @builder.keyword_cmd(:break, val[0]) + } + | kNEXT + { + result = @builder.keyword_cmd(:next, val[0]) + } + | kREDO + { + result = @builder.keyword_cmd(:redo, val[0]) + } + | kRETRY + { + result = @builder.keyword_cmd(:retry, val[0]) + } + + primary_value: primary + + then: term + | kTHEN + | term kTHEN + { + result = val[1] + } + + do: term + | kDO_COND + + if_tail: opt_else + | kELSIF expr_value then compstmt if_tail + { + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + } + + opt_else: none + | kELSE compstmt + { + result = val + } + + for_var: lhs + | mlhs + + f_marg: f_norm_arg + { + result = @builder.arg(val[0]) + } + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_marg_list: f_marg + { + result = [ val[0] ] + } + | f_marg_list tCOMMA f_marg + { + result = val[0] << val[2] + } + + f_margs: f_marg_list + | f_marg_list tCOMMA tSTAR f_norm_arg + { + result = val[0]. + push(@builder.restarg(val[2], val[3])) + } + | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list + { + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + } + | f_marg_list tCOMMA tSTAR + { + result = val[0]. + push(@builder.restarg(val[2])) + } + | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list + { + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + } + | tSTAR f_norm_arg + { + result = [ @builder.restarg(val[0], val[1]) ] + } + | tSTAR f_norm_arg tCOMMA f_marg_list + { + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.restarg(val[0]) ] + } + | tSTAR tCOMMA f_marg_list + { + result = [ @builder.restarg(val[0]), + *val[2] ] + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = val[0].concat(val[2]).concat(val[3]) + } + | f_block_kwarg opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_kwrest opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_block_arg + { + result = [ val[0] ] + } + +opt_block_args_tail: + tCOMMA block_args_tail + { + result = val[1] + } + | # nothing + { + result = [] + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_block_args_tail + { + result = val[0].concat(val[1]) + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_block_optarg opt_block_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | block_args_tail + + opt_block_param: # nothing + { + result = @builder.args(nil, [], nil) + } + | block_param_def + { + @lexer.state = :expr_value + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1], val[2]) + } + | tOROP + { + result = @builder.args(val[0], [], val[0]) + } + | tPIPE block_param opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + + opt_bv_decl: opt_nl + { + result = [] + } + | opt_nl tSEMI bv_decls opt_nl + { + result = val[2] + } + + bv_decls: bvar + { + result = [ val[0] ] + } + | bv_decls tCOMMA bvar + { + result = val[0] << val[2] + } + + bvar: tIDENTIFIER + { + result = @builder.shadowarg(val[0]) + } + | f_bad_arg + + lambda: { + @static_env.extend_dynamic + } + f_larglist + { + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + } + lambda_body + { + @lexer.cmdarg = val[2] + @lexer.cmdarg.lexpop + + result = [ val[1], val[3] ] + + @static_env.unextend + } + + f_larglist: tLPAREN2 f_args opt_bv_decl tRPAREN + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + | f_args + { + result = @builder.args(nil, val[0], nil) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = [ val[0], val[1], val[2] ] + } + | kDO_LAMBDA compstmt kEND + { + result = [ val[0], val[1], val[2] ] + } + + do_block: kDO_BLOCK + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + block_call: command do_block + { + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + } + | block_call dot_or_colon operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | block_call dot_or_colon operation2 opt_paren_args brace_block + { + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | block_call dot_or_colon operation2 command_args do_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + + method_call: fcall paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + } + | primary_value tDOT operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation2 paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation3 + { + result = @builder.call_method(val[0], val[1], val[2]) + } + | primary_value tDOT paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | kSUPER paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + } + | kSUPER + { + result = @builder.keyword_cmd(:zsuper, val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index(val[0], val[1], val[2], val[3]) + } + + brace_block: tLCURLY + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + | kDO + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + case_body: kWHEN args then compstmt cases + { + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + } + + cases: opt_else + { + result = [ val[0] ] + } + | case_body + + opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue + { + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + } + | + { + result = [] + } + + exc_list: arg_value + { + result = [ val[0] ] + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = [ val[0], val[1] ] + } + | none + + opt_ensure: kENSURE compstmt + { + result = [ val[0], val[1] ] + } + | none + + literal: numeric + | symbol + | dsym + + strings: string + { + result = @builder.string_compose(nil, val[0], nil) + } + + string: string1 + { + result = [ val[0] ] + } + | string string1 + { + result = val[0] << val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + result = @builder.string_compose(val[0], val[1], val[2]) + } + | tSTRING + { + result = @builder.string(val[0]) + } + | tCHARACTER + { + result = @builder.character(val[0]) + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = @builder.xstring_compose(val[0], val[1], val[2]) + } + + regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT + { + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + } + + words: tWORDS_BEG word_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + word_list: # nothing + { + result = [] + } + | word_list word tSPACE + { + result = val[0] << @builder.word(val[1]) + } + + word: string_content + { + result = [ val[0] ] + } + | word string_content + { + result = val[0] << val[1] + } + + symbols: tSYMBOLS_BEG symbol_list tSTRING_END + { + result = @builder.symbols_compose(val[0], val[1], val[2]) + } + + symbol_list: # nothing + { + result = [] + } + | symbol_list word tSPACE + { + result = val[0] << @builder.word(val[1]) + } + + qwords: tQWORDS_BEG qword_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + qsymbols: tQSYMBOLS_BEG qsym_list tSTRING_END + { + result = @builder.symbols_compose(val[0], val[1], val[2]) + } + + qword_list: # nothing + { + result = [] + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0] << @builder.string_internal(val[1]) + } + + qsym_list: # nothing + { + result = [] + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0] << @builder.symbol_internal(val[1]) + } + + string_contents: # nothing + { + result = [] + } + | string_contents string_content + { + result = val[0] << val[1] + } + +xstring_contents: # nothing + { + result = [] + } + | xstring_contents string_content + { + result = val[0] << val[1] + } + +regexp_contents: # nothing + { + result = [] + } + | regexp_contents string_content + { + result = val[0] << val[1] + } + + string_content: tSTRING_CONTENT + { + result = @builder.string_internal(val[0]) + } + | tSTRING_DVAR string_dvar + { + result = val[1] + } + | tSTRING_DBEG + { + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + } + compstmt tSTRING_DEND + { + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + } + + string_dvar: tGVAR + { + result = @builder.gvar(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + | backref + + + symbol: tSYMBOL + { + result = @builder.symbol(val[0]) + } + + dsym: tSYMBEG xstring_contents tSTRING_END + { + result = @builder.symbol_compose(val[0], val[1], val[2]) + } + + numeric: simple_numeric + { + result = val[0] + } + | tUMINUS_NUM simple_numeric =tLOWEST + { + result = @builder.negate(val[0], val[1]) + } + + simple_numeric: tINTEGER + { + result = @builder.integer(val[0]) + } + | tFLOAT + { + result = @builder.float(val[0]) + } + | tRATIONAL + { + result = @builder.rational(val[0]) + } + | tIMAGINARY + { + result = @builder.complex(val[0]) + } + + user_variable: tIDENTIFIER + { + result = @builder.ident(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tGVAR + { + result = @builder.gvar(val[0]) + } + | tCONSTANT + { + result = @builder.const(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + +keyword_variable: kNIL + { + result = @builder.nil(val[0]) + } + | kSELF + { + result = @builder.self(val[0]) + } + | kTRUE + { + result = @builder.true(val[0]) + } + | kFALSE + { + result = @builder.false(val[0]) + } + | k__FILE__ + { + result = @builder.__FILE__(val[0]) + } + | k__LINE__ + { + result = @builder.__LINE__(val[0]) + } + | k__ENCODING__ + { + result = @builder.__ENCODING__(val[0]) + } + + var_ref: user_variable + { + result = @builder.accessible(val[0]) + } + | keyword_variable + { + result = @builder.accessible(val[0]) + } + + var_lhs: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + + backref: tNTH_REF + { + result = @builder.nth_ref(val[0]) + } + | tBACK_REF + { + result = @builder.back_ref(val[0]) + } + + superclass: term + { + result = nil + } + | tLT + { + @lexer.state = :expr_value + } + expr_value term + { + result = [ val[0], val[2] ] + } + | error term + { + yyerrok + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + } + | { + result = @lexer.in_kwarg + @lexer.in_kwarg = true + } + f_args term + { + @lexer.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + } + + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = val[0].concat(val[2]).concat(val[3]) + } + | f_kwarg opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_kwrest opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_block_arg + { + result = [ val[0] ] + } + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | # nothing + { + result = [] + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_optarg opt_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | args_tail + { + result = val[0] + } + | # nothing + { + result = [] + } + + f_bad_arg: tCONSTANT + { + diagnostic :error, :argument_const, nil, val[0] + } + | tIVAR + { + diagnostic :error, :argument_ivar, nil, val[0] + } + | tGVAR + { + diagnostic :error, :argument_gvar, nil, val[0] + } + | tCVAR + { + diagnostic :error, :argument_cvar, nil, val[0] + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + @static_env.declare val[0][0] + + result = val[0] + } + + f_arg_item: f_norm_arg + { + result = @builder.arg(val[0]) + } + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_arg: f_arg_item + { + result = [ val[0] ] + } + | f_arg tCOMMA f_arg_item + { + result = val[0] << val[2] + } + + f_label: tLABEL + { + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = val[0] + } + + f_kw: f_label arg_value + { + result = @builder.kwoptarg(val[0], val[1]) + } + | f_label + { + result = @builder.kwarg(val[0]) + } + + f_block_kw: f_label primary_value + { + result = @builder.kwoptarg(val[0], val[1]) + } + | f_label + { + result = @builder.kwarg(val[0]) + } + + f_block_kwarg: f_block_kw + { + result = [ val[0] ] + } + | f_block_kwarg tCOMMA f_block_kw + { + result = val[0] << val[2] + } + + f_kwarg: f_kw + { + result = [ val[0] ] + } + | f_kwarg tCOMMA f_kw + { + result = val[0] << val[2] + } + + kwrest_mark: tPOW | tDSTAR + + f_kwrest: kwrest_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + } + | kwrest_mark + { + result = [ @builder.kwrestarg(val[0]) ] + } + + f_opt: f_norm_arg tEQL arg_value + { + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_opt: f_norm_arg tEQL primary_value + { + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_optarg: f_block_opt + { + result = [ val[0] ] + } + | f_block_optarg tCOMMA f_block_opt + { + result = val[0] << val[2] + } + + f_optarg: f_opt + { + result = [ val[0] ] + } + | f_optarg tCOMMA f_opt + { + result = val[0] << val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + } + | restarg_mark + { + result = [ @builder.restarg(val[0]) ] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + } + + opt_f_block_arg: tCOMMA f_block_arg + { + result = [ val[1] ] + } + | + { + result = [] + } + + singleton: var_ref + | tLPAREN2 expr rparen + { + result = val[1] + } + + assoc_list: # nothing + { + result = [] + } + | assocs trailer + + assocs: assoc + { + result = [ val[0] ] + } + | assocs tCOMMA assoc + { + result = val[0] << val[2] + } + + assoc: arg_value tASSOC arg_value + { + result = @builder.pair(val[0], val[1], val[2]) + } + | tLABEL arg_value + { + result = @builder.pair_keyword(val[0], val[1]) + } + | tDSTAR arg_value + { + result = @builder.kwsplat(val[0], val[1]) + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + result = val[1] + } + rbracket: opt_nl tRBRACK + { + result = val[1] + } + trailer: | tNL | tCOMMA + + term: tSEMI + { + yyerrok + } + | tNL + + terms: term + | terms tSEMI + + none: # nothing + { + result = nil + } +end + +---- header + +require 'parser' + +Parser.check_for_encoding_support + +---- inner + + def version + 21 + end + + def default_encoding + Encoding::UTF_8 + end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby22.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby22.y new file mode 100644 index 000000000000..751c0e866b93 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/ruby22.y @@ -0,0 +1,2381 @@ +# Copyright (c) 2013 Peter Zotov <whitequark@whitequark.org> +# +# Parts of the source are derived from ruby_parser: +# Copyright (c) Ryan Davis, seattle.rb +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +class Parser::Ruby22 + +token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS + kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT + kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER + kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD + kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__ + k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT + tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT + tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ + tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF + tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN + tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE + tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE + tDSTAR tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY + tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tREGEXP_OPT + tWORDS_BEG tQWORDS_BEG tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DBEG + tSTRING_DVAR tSTRING_END tSTRING_DEND tSTRING tSYMBOL + tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG tCHARACTER + tRATIONAL tIMAGINARY tLABEL_END + +prechigh + right tBANG tTILDE tUPLUS + right tPOW + right tUMINUS_NUM tUMINUS + left tSTAR2 tDIVIDE tPERCENT + left tPLUS tMINUS + left tLSHFT tRSHFT + left tAMPER2 + left tPIPE tCARET + left tGT tGEQ tLT tLEQ + nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH + left tANDOP + left tOROP + nonassoc tDOT2 tDOT3 + right tEH tCOLON + left kRESCUE_MOD + right tEQL tOP_ASGN + nonassoc kDEFINED + right kNOT + left kOR kAND + nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD + nonassoc tLBRACE_ARG + nonassoc tLOWEST +preclow + +rule + + program: top_compstmt + + top_compstmt: top_stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + top_stmts: # nothing + { + result = [] + } + | top_stmt + { + result = [ val[0] ] + } + | top_stmts terms top_stmt + { + result = val[0] << val[2] + } + | error top_stmt + { + result = [ val[1] ] + } + + top_stmt: stmt + | klBEGIN tLCURLY top_compstmt tRCURLY + { + result = @builder.preexe(val[0], val[1], val[2], val[3]) + } + + bodystmt: compstmt opt_rescue opt_else opt_ensure + { + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + } + + compstmt: stmts opt_terms + { + result = @builder.compstmt(val[0]) + } + + stmts: # nothing + { + result = [] + } + | stmt_or_begin + { + result = [ val[0] ] + } + | stmts terms stmt_or_begin + { + result = val[0] << val[2] + } + | error stmt + { + result = [ val[1] ] + } + + stmt_or_begin: stmt + | klBEGIN tLCURLY top_compstmt tRCURLY + { + diagnostic :error, :begin_in_method, nil, val[0] + } + + stmt: kALIAS fitem + { + @lexer.state = :expr_fname + } + fitem + { + result = @builder.alias(val[0], val[1], val[3]) + } + | kALIAS tGVAR tGVAR + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + } + | kALIAS tGVAR tBACK_REF + { + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + } + | kALIAS tGVAR tNTH_REF + { + diagnostic :error, :nth_ref_alias, nil, val[2] + } + | kUNDEF undef_list + { + result = @builder.undef_method(val[0], val[1]) + } + | stmt kIF_MOD expr_value + { + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + } + | stmt kUNLESS_MOD expr_value + { + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + } + | stmt kWHILE_MOD expr_value + { + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + } + | stmt kUNTIL_MOD expr_value + { + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + } + | stmt kRESCUE_MOD stmt + { + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + } + | klEND tLCURLY compstmt tRCURLY + { + result = @builder.postexe(val[0], val[1], val[2], val[3]) + } + | command_asgn + | mlhs tEQL command_call + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN command_call + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | backref tOP_ASGN command_call + { + @builder.op_assign(val[0], val[1], val[2]) + } + | lhs tEQL mrhs + { + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + } + | mlhs tEQL mrhs_arg + { + result = @builder.multi_assign(val[0], val[1], val[2]) + } + | expr + + command_asgn: lhs tEQL command_call + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL command_asgn + { + result = @builder.assign(val[0], val[1], val[2]) + } + + expr: command_call + | expr kAND expr + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | expr kOR expr + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kNOT opt_nl expr + { + result = @builder.not_op(val[0], nil, val[2], nil) + } + | tBANG command_call + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | arg + + expr_value: expr + + command_call: command + | block_command + + block_command: block_call + | block_call dot_or_colon operation2 command_args + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + + cmd_brace_block: tLBRACE_ARG + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + fcall: operation + + command: fcall command_args =tLOWEST + { + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + } + | fcall command_args cmd_brace_block + { + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tDOT operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + | primary_value tDOT operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | primary_value tCOLON2 operation2 command_args =tLOWEST + { + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + } + | primary_value tCOLON2 operation2 command_args cmd_brace_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | kSUPER command_args + { + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + } + | kYIELD command_args + { + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + } + | kRETURN call_args + { + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + } + | kBREAK call_args + { + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + } + | kNEXT call_args + { + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + } + + mlhs: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_inner: mlhs_basic + { + result = @builder.multi_lhs(nil, val[0], nil) + } + | tLPAREN mlhs_inner rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + mlhs_basic: mlhs_head + | mlhs_head mlhs_item + { + result = val[0]. + push(val[1]) + } + | mlhs_head tSTAR mlhs_node + { + result = val[0]. + push(@builder.splat(val[1], val[2])) + } + | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + } + | mlhs_head tSTAR + { + result = val[0]. + push(@builder.splat(val[1])) + } + | mlhs_head tSTAR tCOMMA mlhs_post + { + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + } + | tSTAR mlhs_node + { + result = [ @builder.splat(val[0], val[1]) ] + } + | tSTAR mlhs_node tCOMMA mlhs_post + { + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.splat(val[0]) ] + } + | tSTAR tCOMMA mlhs_post + { + result = [ @builder.splat(val[0]), + *val[2] ] + } + + mlhs_item: mlhs_node + | tLPAREN mlhs_inner rparen + { + result = @builder.begin(val[0], val[1], val[2]) + } + + mlhs_head: mlhs_item tCOMMA + { + result = [ val[0] ] + } + | mlhs_head mlhs_item tCOMMA + { + result = val[0] << val[1] + } + + mlhs_post: mlhs_item + { + result = [ val[0] ] + } + | mlhs_post tCOMMA mlhs_item + { + result = val[0] << val[2] + } + + mlhs_node: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + lhs: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + } + | primary_value tDOT tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tIDENTIFIER + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tDOT tCONSTANT + { + result = @builder.attr_asgn(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + } + | tCOLON3 tCONSTANT + { + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + } + | backref + { + result = @builder.assignable(val[0]) + } + + cname: tIDENTIFIER + { + diagnostic :error, :module_name_const, nil, val[0] + } + | tCONSTANT + + cpath: tCOLON3 cname + { + result = @builder.const_global(val[0], val[1]) + } + | cname + { + result = @builder.const(val[0]) + } + | primary_value tCOLON2 cname + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + + fname: tIDENTIFIER | tCONSTANT | tFID + | op + | reswords + + fsym: fname + { + result = @builder.symbol(val[0]) + } + | symbol + + fitem: fsym + | dsym + + undef_list: fitem + { + result = [ val[0] ] + } + | undef_list tCOMMA + { + @lexer.state = :expr_fname + } + fitem + { + result = val[0] << val[3] + } + + op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ + | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ + | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2 + | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE + | tUPLUS | tUMINUS | tAREF | tASET | tDSTAR | tBACK_REF2 + + reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND + | kALIAS | kAND | kBEGIN | kBREAK | kCASE + | kCLASS | kDEF | kDEFINED | kDO | kELSE + | kELSIF | kEND | kENSURE | kFALSE | kFOR + | kIN | kMODULE | kNEXT | kNIL | kNOT + | kOR | kREDO | kRESCUE | kRETRY | kRETURN + | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF + | kWHEN | kYIELD | kIF | kUNLESS | kWHILE + | kUNTIL + + arg: lhs tEQL arg + { + result = @builder.assign(val[0], val[1], val[2]) + } + | lhs tEQL arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + } + | var_lhs tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | var_lhs tOP_ASGN arg kRESCUE_MOD arg + { + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + } + | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg + { + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + } + | primary_value tDOT tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tDOT tCONSTANT tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg + { + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + } + | primary_value tCOLON2 tCONSTANT tOP_ASGN arg + { + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + } + | tCOLON3 tCONSTANT tOP_ASGN arg + { + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + } + | backref tOP_ASGN arg + { + result = @builder.op_assign(val[0], val[1], val[2]) + } + | arg tDOT2 arg + { + result = @builder.range_inclusive(val[0], val[1], val[2]) + } + | arg tDOT3 arg + { + result = @builder.range_exclusive(val[0], val[1], val[2]) + } + | arg tPLUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMINUS arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tSTAR2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tDIVIDE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPERCENT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tPOW arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tUMINUS_NUM simple_numeric tPOW arg + { + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + } + | tUPLUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | tUMINUS arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tPIPE arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCARET arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tAMPER2 arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tCMP arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tGEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tLEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tEQQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tNEQ arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tMATCH arg + { + result = @builder.match_op(val[0], val[1], val[2]) + } + | arg tNMATCH arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | tBANG arg + { + result = @builder.not_op(val[0], nil, val[1], nil) + } + | tTILDE arg + { + result = @builder.unary_op(val[0], val[1]) + } + | arg tLSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tRSHFT arg + { + result = @builder.binary_op(val[0], val[1], val[2]) + } + | arg tANDOP arg + { + result = @builder.logical_op(:and, val[0], val[1], val[2]) + } + | arg tOROP arg + { + result = @builder.logical_op(:or, val[0], val[1], val[2]) + } + | kDEFINED opt_nl arg + { + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + } + + # Note: MRI eventually came to rely on disambiguation based on + # the lexer state, but it is too contrived with the Ragel lexer, + # so we kept this approach. See ruby/ruby@b0c03f63e5 for + # the initial commit, and ruby/ruby@23352f62a for MRI revert, + # which we decided not to track. + | arg tEH + { + @lexer.push_cond + @lexer.cond.push(true) + } + arg opt_nl tCOLON + { + @lexer.pop_cond + } + arg + { + result = @builder.ternary(val[0], val[1], + val[3], val[5], val[7]) + } + | primary + + arg_value: arg + + aref_args: none + | args trailer + | args tCOMMA assocs trailer + { + result = val[0] << @builder.associate(nil, val[2], nil) + } + | assocs trailer + { + result = [ @builder.associate(nil, val[0], nil) ] + } + + paren_args: tLPAREN2 opt_call_args rparen + { + result = val + } + + opt_paren_args: # nothing + { + result = [ nil, [], nil ] + } + | paren_args + + opt_call_args: # nothing + { + result = [] + } + | call_args + | args tCOMMA + | args tCOMMA assocs tCOMMA + { + result = val[0] << @builder.associate(nil, val[2], nil) + } + | assocs tCOMMA + { + result = [ @builder.associate(nil, val[0], nil) ] + } + + call_args: command + { + result = [ val[0] ] + } + | args opt_block_arg + { + result = val[0].concat(val[1]) + } + | assocs opt_block_arg + { + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + } + | args tCOMMA assocs opt_block_arg + { + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + } + | block_arg + { + result = [ val[0] ] + } + + command_args: { + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + } + call_args + { + @lexer.cmdarg = val[0] + + result = val[1] + } + + block_arg: tAMPER arg_value + { + result = @builder.block_pass(val[0], val[1]) + } + + opt_block_arg: tCOMMA block_arg + { + result = [ val[1] ] + } + | # nothing + { + result = [] + } + + args: arg_value + { + result = [ val[0] ] + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + | args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + + mrhs_arg: mrhs + { + result = @builder.array(nil, val[0], nil) + } + | arg_value + + mrhs: args tCOMMA arg_value + { + result = val[0] << val[2] + } + | args tCOMMA tSTAR arg_value + { + result = val[0] << @builder.splat(val[2], val[3]) + } + | tSTAR arg_value + { + result = [ @builder.splat(val[0], val[1]) ] + } + + primary: literal + | strings + | xstring + | regexp + | words + | qwords + | symbols + | qsymbols + | var_ref + | backref + | tFID + { + result = @builder.call_method(nil, nil, val[0]) + } + | kBEGIN + { + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + } + bodystmt kEND + { + @lexer.cmdarg = val[1] + + result = @builder.begin_keyword(val[0], val[2], val[3]) + } + | tLPAREN_ARG + { + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + } + expr + { + @lexer.state = :expr_endarg + } + opt_nl tRPAREN + { + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + } + | tLPAREN_ARG + { + @lexer.state = :expr_endarg + } + opt_nl tRPAREN + { + result = @builder.begin(val[0], nil, val[3]) + } + | tLPAREN compstmt tRPAREN + { + result = @builder.begin(val[0], val[1], val[2]) + } + | primary_value tCOLON2 tCONSTANT + { + result = @builder.const_fetch(val[0], val[1], val[2]) + } + | tCOLON3 tCONSTANT + { + result = @builder.const_global(val[0], val[1]) + } + | tLBRACK aref_args tRBRACK + { + result = @builder.array(val[0], val[1], val[2]) + } + | tLBRACE assoc_list tRCURLY + { + result = @builder.associate(val[0], val[1], val[2]) + } + | kRETURN + { + result = @builder.keyword_cmd(:return, val[0]) + } + | kYIELD tLPAREN2 call_args rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + } + | kYIELD tLPAREN2 rparen + { + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + } + | kYIELD + { + result = @builder.keyword_cmd(:yield, val[0]) + } + | kDEFINED opt_nl tLPAREN2 expr rparen + { + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + } + | kNOT tLPAREN2 expr rparen + { + result = @builder.not_op(val[0], val[1], val[2], val[3]) + } + | kNOT tLPAREN2 rparen + { + result = @builder.not_op(val[0], val[1], nil, val[2]) + } + | fcall brace_block + { + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | method_call + | method_call brace_block + { + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + } + | tLAMBDA lambda + { + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[1] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + } + | kIF expr_value then compstmt if_tail kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + } + | kUNLESS expr_value then compstmt opt_else kEND + { + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + } + | kWHILE + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + } + | kUNTIL + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + } + | kCASE expr_value opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + } + | kCASE opt_terms case_body kEND + { + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + } + | kFOR for_var kIN + { + @lexer.cond.push(true) + } + expr_value do + { + @lexer.cond.pop + } + compstmt kEND + { + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + } + | kCLASS cpath superclass + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :class_in_def, nil, val[0] + end + + lt_t, superclass = val[2] + result = @builder.def_class(val[0], val[1], + lt_t, superclass, + val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kCLASS tLSHFT expr term + { + result = @def_level + @def_level = 0 + + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + result = @builder.def_sclass(val[0], val[1], val[2], + val[5], val[6]) + + @lexer.pop_cmdarg + @static_env.unextend + + @def_level = val[4] + } + | kMODULE cpath + { + @static_env.extend_static + @lexer.push_cmdarg + } + bodystmt kEND + { + if in_def? + diagnostic :error, :module_in_def, nil, val[0] + end + + result = @builder.def_module(val[0], val[1], + val[3], val[4]) + + @lexer.pop_cmdarg + @static_env.unextend + } + | kDEF fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kDEF singleton dot_or_colon + { + @lexer.state = :expr_fname + } + fname + { + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + } + f_arglist bodystmt kEND + { + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + } + | kBREAK + { + result = @builder.keyword_cmd(:break, val[0]) + } + | kNEXT + { + result = @builder.keyword_cmd(:next, val[0]) + } + | kREDO + { + result = @builder.keyword_cmd(:redo, val[0]) + } + | kRETRY + { + result = @builder.keyword_cmd(:retry, val[0]) + } + + primary_value: primary + + then: term + | kTHEN + | term kTHEN + { + result = val[1] + } + + do: term + | kDO_COND + + if_tail: opt_else + | kELSIF expr_value then compstmt if_tail + { + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + } + + opt_else: none + | kELSE compstmt + { + result = val + } + + for_var: lhs + | mlhs + + f_marg: f_norm_arg + { + result = @builder.arg(val[0]) + } + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_marg_list: f_marg + { + result = [ val[0] ] + } + | f_marg_list tCOMMA f_marg + { + result = val[0] << val[2] + } + + f_margs: f_marg_list + | f_marg_list tCOMMA tSTAR f_norm_arg + { + result = val[0]. + push(@builder.restarg(val[2], val[3])) + } + | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list + { + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + } + | f_marg_list tCOMMA tSTAR + { + result = val[0]. + push(@builder.restarg(val[2])) + } + | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list + { + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + } + | tSTAR f_norm_arg + { + result = [ @builder.restarg(val[0], val[1]) ] + } + | tSTAR f_norm_arg tCOMMA f_marg_list + { + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + } + | tSTAR + { + result = [ @builder.restarg(val[0]) ] + } + | tSTAR tCOMMA f_marg_list + { + result = [ @builder.restarg(val[0]), + *val[2] ] + } + + block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = val[0].concat(val[2]).concat(val[3]) + } + | f_block_kwarg opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_kwrest opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_block_arg + { + result = [ val[0] ] + } + +opt_block_args_tail: + tCOMMA block_args_tail + { + result = val[1] + } + | # nothing + { + result = [] + } + + block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_block_optarg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_block_args_tail + { + result = val[0].concat(val[1]) + } + | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_block_optarg opt_block_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_block_optarg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_block_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_block_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | block_args_tail + + opt_block_param: # nothing + { + result = @builder.args(nil, [], nil) + } + | block_param_def + { + @lexer.state = :expr_value + } + + block_param_def: tPIPE opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1], val[2]) + } + | tOROP + { + result = @builder.args(val[0], [], val[0]) + } + | tPIPE block_param opt_bv_decl tPIPE + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + + opt_bv_decl: opt_nl + { + result = [] + } + | opt_nl tSEMI bv_decls opt_nl + { + result = val[2] + } + + bv_decls: bvar + { + result = [ val[0] ] + } + | bv_decls tCOMMA bvar + { + result = val[0] << val[2] + } + + bvar: tIDENTIFIER + { + result = @builder.shadowarg(val[0]) + } + | f_bad_arg + + lambda: { + @static_env.extend_dynamic + } + f_larglist + { + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + } + lambda_body + { + @lexer.cmdarg = val[2] + @lexer.cmdarg.lexpop + + result = [ val[1], val[3] ] + + @static_env.unextend + } + + f_larglist: tLPAREN2 f_args opt_bv_decl tRPAREN + { + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + } + | f_args + { + result = @builder.args(nil, val[0], nil) + } + + lambda_body: tLAMBEG compstmt tRCURLY + { + result = [ val[0], val[1], val[2] ] + } + | kDO_LAMBDA compstmt kEND + { + result = [ val[0], val[1], val[2] ] + } + + do_block: kDO_BLOCK + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + block_call: command do_block + { + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + } + | block_call dot_or_colon operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | block_call dot_or_colon operation2 opt_paren_args brace_block + { + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + | block_call dot_or_colon operation2 command_args do_block + { + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + } + + method_call: fcall paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + } + | primary_value tDOT operation2 opt_paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation2 paren_args + { + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 operation3 + { + result = @builder.call_method(val[0], val[1], val[2]) + } + | primary_value tDOT paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | primary_value tCOLON2 paren_args + { + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + } + | kSUPER paren_args + { + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + } + | kSUPER + { + result = @builder.keyword_cmd(:zsuper, val[0]) + } + | primary_value tLBRACK2 opt_call_args rbracket + { + result = @builder.index(val[0], val[1], val[2], val[3]) + } + + brace_block: tLCURLY + { + @static_env.extend_dynamic + } + opt_block_param compstmt tRCURLY + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + | kDO + { + @static_env.extend_dynamic + } + opt_block_param compstmt kEND + { + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + } + + case_body: kWHEN args then compstmt cases + { + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + } + + cases: opt_else + { + result = [ val[0] ] + } + | case_body + + opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue + { + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + } + | + { + result = [] + } + + exc_list: arg_value + { + result = [ val[0] ] + } + | mrhs + | none + + exc_var: tASSOC lhs + { + result = [ val[0], val[1] ] + } + | none + + opt_ensure: kENSURE compstmt + { + result = [ val[0], val[1] ] + } + | none + + literal: numeric + | symbol + | dsym + + strings: string + { + result = @builder.string_compose(nil, val[0], nil) + } + + string: string1 + { + result = [ val[0] ] + } + | string string1 + { + result = val[0] << val[1] + } + + string1: tSTRING_BEG string_contents tSTRING_END + { + result = @builder.string_compose(val[0], val[1], val[2]) + } + | tSTRING + { + result = @builder.string(val[0]) + } + | tCHARACTER + { + result = @builder.character(val[0]) + } + + xstring: tXSTRING_BEG xstring_contents tSTRING_END + { + result = @builder.xstring_compose(val[0], val[1], val[2]) + } + + regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT + { + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + } + + words: tWORDS_BEG word_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + word_list: # nothing + { + result = [] + } + | word_list word tSPACE + { + result = val[0] << @builder.word(val[1]) + } + + word: string_content + { + result = [ val[0] ] + } + | word string_content + { + result = val[0] << val[1] + } + + symbols: tSYMBOLS_BEG symbol_list tSTRING_END + { + result = @builder.symbols_compose(val[0], val[1], val[2]) + } + + symbol_list: # nothing + { + result = [] + } + | symbol_list word tSPACE + { + result = val[0] << @builder.word(val[1]) + } + + qwords: tQWORDS_BEG qword_list tSTRING_END + { + result = @builder.words_compose(val[0], val[1], val[2]) + } + + qsymbols: tQSYMBOLS_BEG qsym_list tSTRING_END + { + result = @builder.symbols_compose(val[0], val[1], val[2]) + } + + qword_list: # nothing + { + result = [] + } + | qword_list tSTRING_CONTENT tSPACE + { + result = val[0] << @builder.string_internal(val[1]) + } + + qsym_list: # nothing + { + result = [] + } + | qsym_list tSTRING_CONTENT tSPACE + { + result = val[0] << @builder.symbol_internal(val[1]) + } + + string_contents: # nothing + { + result = [] + } + | string_contents string_content + { + result = val[0] << val[1] + } + +xstring_contents: # nothing + { + result = [] + } + | xstring_contents string_content + { + result = val[0] << val[1] + } + +regexp_contents: # nothing + { + result = [] + } + | regexp_contents string_content + { + result = val[0] << val[1] + } + + string_content: tSTRING_CONTENT + { + result = @builder.string_internal(val[0]) + } + | tSTRING_DVAR string_dvar + { + result = val[1] + } + | tSTRING_DBEG + { + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + } + compstmt tSTRING_DEND + { + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + } + + string_dvar: tGVAR + { + result = @builder.gvar(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + | backref + + + symbol: tSYMBOL + { + result = @builder.symbol(val[0]) + } + + dsym: tSYMBEG xstring_contents tSTRING_END + { + result = @builder.symbol_compose(val[0], val[1], val[2]) + } + + numeric: simple_numeric + { + result = val[0] + } + | tUMINUS_NUM simple_numeric =tLOWEST + { + result = @builder.negate(val[0], val[1]) + } + + simple_numeric: tINTEGER + { + result = @builder.integer(val[0]) + } + | tFLOAT + { + result = @builder.float(val[0]) + } + | tRATIONAL + { + result = @builder.rational(val[0]) + } + | tIMAGINARY + { + result = @builder.complex(val[0]) + } + + user_variable: tIDENTIFIER + { + result = @builder.ident(val[0]) + } + | tIVAR + { + result = @builder.ivar(val[0]) + } + | tGVAR + { + result = @builder.gvar(val[0]) + } + | tCONSTANT + { + result = @builder.const(val[0]) + } + | tCVAR + { + result = @builder.cvar(val[0]) + } + +keyword_variable: kNIL + { + result = @builder.nil(val[0]) + } + | kSELF + { + result = @builder.self(val[0]) + } + | kTRUE + { + result = @builder.true(val[0]) + } + | kFALSE + { + result = @builder.false(val[0]) + } + | k__FILE__ + { + result = @builder.__FILE__(val[0]) + } + | k__LINE__ + { + result = @builder.__LINE__(val[0]) + } + | k__ENCODING__ + { + result = @builder.__ENCODING__(val[0]) + } + + var_ref: user_variable + { + result = @builder.accessible(val[0]) + } + | keyword_variable + { + result = @builder.accessible(val[0]) + } + + var_lhs: user_variable + { + result = @builder.assignable(val[0]) + } + | keyword_variable + { + result = @builder.assignable(val[0]) + } + + backref: tNTH_REF + { + result = @builder.nth_ref(val[0]) + } + | tBACK_REF + { + result = @builder.back_ref(val[0]) + } + + superclass: term + { + result = nil + } + | tLT + { + @lexer.state = :expr_value + } + expr_value term + { + result = [ val[0], val[2] ] + } + | error term + { + yyerrok + result = nil + } + + f_arglist: tLPAREN2 f_args rparen + { + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + } + | { + result = @lexer.in_kwarg + @lexer.in_kwarg = true + } + f_args term + { + @lexer.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + } + + args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg + { + result = val[0].concat(val[2]).concat(val[3]) + } + | f_kwarg opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_kwrest opt_f_block_arg + { + result = val[0].concat(val[1]) + } + | f_block_arg + { + result = [ val[0] ] + } + + opt_args_tail: tCOMMA args_tail + { + result = val[1] + } + | # nothing + { + result = [] + } + + f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + } + | f_arg tCOMMA f_optarg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg tCOMMA f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_arg opt_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + } + | f_optarg opt_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_optarg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | f_rest_arg opt_args_tail + { + result = val[0]. + concat(val[1]) + } + | f_rest_arg tCOMMA f_arg opt_args_tail + { + result = val[0]. + concat(val[2]). + concat(val[3]) + } + | args_tail + { + result = val[0] + } + | # nothing + { + result = [] + } + + f_bad_arg: tCONSTANT + { + diagnostic :error, :argument_const, nil, val[0] + } + | tIVAR + { + diagnostic :error, :argument_ivar, nil, val[0] + } + | tGVAR + { + diagnostic :error, :argument_gvar, nil, val[0] + } + | tCVAR + { + diagnostic :error, :argument_cvar, nil, val[0] + } + + f_norm_arg: f_bad_arg + | tIDENTIFIER + { + @static_env.declare val[0][0] + + result = val[0] + } + + f_arg_asgn: f_norm_arg + { + result = val[0] + } + + f_arg_item: f_arg_asgn + { + result = @builder.arg(val[0]) + } + | tLPAREN f_margs rparen + { + result = @builder.multi_lhs(val[0], val[1], val[2]) + } + + f_arg: f_arg_item + { + result = [ val[0] ] + } + | f_arg tCOMMA f_arg_item + { + result = val[0] << val[2] + } + + f_label: tLABEL + { + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = val[0] + } + + f_kw: f_label arg_value + { + result = @builder.kwoptarg(val[0], val[1]) + } + | f_label + { + result = @builder.kwarg(val[0]) + } + + f_block_kw: f_label primary_value + { + result = @builder.kwoptarg(val[0], val[1]) + } + | f_label + { + result = @builder.kwarg(val[0]) + } + + f_block_kwarg: f_block_kw + { + result = [ val[0] ] + } + | f_block_kwarg tCOMMA f_block_kw + { + result = val[0] << val[2] + } + + f_kwarg: f_kw + { + result = [ val[0] ] + } + | f_kwarg tCOMMA f_kw + { + result = val[0] << val[2] + } + + kwrest_mark: tPOW | tDSTAR + + f_kwrest: kwrest_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + } + | kwrest_mark + { + result = [ @builder.kwrestarg(val[0]) ] + } + + f_opt: f_arg_asgn tEQL arg_value + { + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_opt: f_arg_asgn tEQL primary_value + { + result = @builder.optarg(val[0], val[1], val[2]) + } + + f_block_optarg: f_block_opt + { + result = [ val[0] ] + } + | f_block_optarg tCOMMA f_block_opt + { + result = val[0] << val[2] + } + + f_optarg: f_opt + { + result = [ val[0] ] + } + | f_optarg tCOMMA f_opt + { + result = val[0] << val[2] + } + + restarg_mark: tSTAR2 | tSTAR + + f_rest_arg: restarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + } + | restarg_mark + { + result = [ @builder.restarg(val[0]) ] + } + + blkarg_mark: tAMPER2 | tAMPER + + f_block_arg: blkarg_mark tIDENTIFIER + { + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + } + + opt_f_block_arg: tCOMMA f_block_arg + { + result = [ val[1] ] + } + | + { + result = [] + } + + singleton: var_ref + | tLPAREN2 expr rparen + { + result = val[1] + } + + assoc_list: # nothing + { + result = [] + } + | assocs trailer + + assocs: assoc + { + result = [ val[0] ] + } + | assocs tCOMMA assoc + { + result = val[0] << val[2] + } + + assoc: arg_value tASSOC arg_value + { + result = @builder.pair(val[0], val[1], val[2]) + } + | tLABEL arg_value + { + result = @builder.pair_keyword(val[0], val[1]) + } + | tSTRING_BEG string_contents tLABEL_END arg_value + { + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + } + | tDSTAR arg_value + { + result = @builder.kwsplat(val[0], val[1]) + } + + operation: tIDENTIFIER | tCONSTANT | tFID + operation2: tIDENTIFIER | tCONSTANT | tFID | op + operation3: tIDENTIFIER | tFID | op + dot_or_colon: tDOT | tCOLON2 + opt_terms: | terms + opt_nl: | tNL + rparen: opt_nl tRPAREN + { + result = val[1] + } + rbracket: opt_nl tRBRACK + { + result = val[1] + } + trailer: | tNL | tCOMMA + + term: tSEMI + { + yyerrok + } + | tNL + + terms: term + | terms tSEMI + + none: # nothing + { + result = nil + } +end + +---- header + +require 'parser' + +Parser.check_for_encoding_support + +---- inner + + def version + 22 + end + + def default_encoding + Encoding::UTF_8 + end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/scan.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/scan.y new file mode 100644 index 000000000000..709254ed6610 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/scan.y @@ -0,0 +1,72 @@ +class P + +rule + + a: A + { + # comment test + + # comment test + + # string + @sstring = 'squote string' + @dstring = 'dquote string' + + # regexp + @regexp = /some regexp with spaces/ + + # gvar + /regexp/ === 'some regexp matches to this string' + @pre_match = $` + @matched = $& + @post_match = $' + @m = $~ + + # braces + @array = [] + [1,2,3].each {|i| + @array.push i + } + 3.times { @array.push 10 } + } + +end + +---- inner + + def parse + @sstring = @dstring = nil + @regexp = nil + @pre_match = @matched = @post_match = @m = nil + + @src = [[:A, 'A'], [false, '$']] + do_parse + + assert_equal 'squote string', @sstring + assert_equal 'dquote string', @dstring + assert_equal(/some regexp with spaces/, @regexp) + assert_equal 'some ', @pre_match + assert_equal 'regexp', @matched + assert_equal ' matches to this string', @post_match + assert_instance_of MatchData, @m + end + + def assert_equal(ok, data) + unless ok == data + raise "expected <#{ok.inspect}> but is <#{data.inspect}>" + end + end + + def assert_instance_of(klass, obj) + unless obj.instance_of?(klass) + raise "expected #{klass} but is #{obj.class}" + end + end + + def next_token + @src.shift + end + +---- footer + +P.new.parse diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/syntax.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/syntax.y new file mode 100644 index 000000000000..727f74a29d9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/syntax.y @@ -0,0 +1,50 @@ +# +# racc syntax checker +# + +class M1::M2::ParserClass < S1::S2::SuperClass + + token A + | B C + + convert + A '5' + end + + prechigh + left B + preclow + + start target + + expect 0 + +rule + + target: A B C + { + print 'abc' + } + | B C A + | C B A + { + print 'cba' + } + | cont + + cont : A c2 B c2 C + + c2 : C C C C C + +end + +---- inner + + junk code !!!! + +kjaljlajrlaolanbla /// %%% (*((( token rule +akiurtlajluealjflaj @@@@ end end end end __END__ + laieu2o879urkq96ga(Q#*&%Q# + #&lkji END + + q395q?/// liutjqlkr7 diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/tp_plus.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/tp_plus.y new file mode 100644 index 000000000000..388ed1302d8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/tp_plus.y @@ -0,0 +1,622 @@ +# Released under an MIT License (http://www.opensource.org/licenses/MIT) +# By Jay Strybis (https://github.com/unreal) + +class TPPlus::Parser +token ASSIGN AT_SYM COMMENT JUMP IO_METHOD INPUT OUTPUT +token NUMREG POSREG VREG SREG TIME_SEGMENT ARG UALM +token MOVE DOT TO AT TERM OFFSET SKIP GROUP +token SEMICOLON NEWLINE STRING +token REAL DIGIT WORD EQUAL +token EEQUAL NOTEQUAL GTE LTE LT GT BANG +token PLUS MINUS STAR SLASH DIV AND OR MOD +token IF ELSE END UNLESS FOR IN WHILE +token WAIT_FOR WAIT_UNTIL TIMEOUT AFTER +token FANUC_USE SET_SKIP_CONDITION NAMESPACE +token CASE WHEN INDIRECT POSITION +token EVAL TIMER TIMER_METHOD RAISE ABORT +token POSITION_DATA TRUE_FALSE RUN TP_HEADER PAUSE +token LPAREN RPAREN COLON COMMA LBRACK RBRACK LBRACE RBRACE +token LABEL ADDRESS +token false + +prechigh + right BANG + left STAR SLASH DIV MOD + left PLUS MINUS + left GT GTE LT LTE + left EEQUAL NOTEQUAL + left AND + left OR + right EQUAL +preclow + +rule + program + #: statements { @interpreter.nodes = val[0].flatten } + : statements { @interpreter.nodes = val[0] } + | + ; + + + statements + : statement terminator { + result = [val[0]] + result << val[1] unless val[1].nil? + } + | statements statement terminator { + result = val[0] << val[1] + result << val[2] unless val[2].nil? + } + ; + + block + : NEWLINE statements { result = val[1] } + ; + + optional_newline + : NEWLINE + | + ; + + statement + : comment + | definition + | namespace + #| assignment + | motion_statement + #| jump + #| io_method + | label_definition + | address + | conditional + | inline_conditional + | forloop + | while_loop + #| program_call + | use_statement + | set_skip_statement + | wait_statement + | case_statement + | fanuc_eval + | timer_method + | position_data + | raise + | tp_header_definition + | empty_stmt + | PAUSE { result = PauseNode.new } + | ABORT { result = AbortNode.new } + ; + + empty_stmt + : NEWLINE { result = EmptyStmtNode.new() } + ; + + tp_header_definition + : TP_HEADER EQUAL tp_header_value { result = HeaderNode.new(val[0],val[2]) } + ; + + tp_header_value + : STRING + | TRUE_FALSE + ; + + raise + : RAISE var_or_indirect { result = RaiseNode.new(val[1]) } + ; + + timer_method + : TIMER_METHOD var_or_indirect { result = TimerMethodNode.new(val[0],val[1]) } + ; + + fanuc_eval + : EVAL STRING { result = EvalNode.new(val[1]) } + ; + + wait_statement + : WAIT_FOR LPAREN indirectable COMMA STRING RPAREN + { result = WaitForNode.new(val[2], val[4]) } + | WAIT_UNTIL LPAREN expression RPAREN + { result = WaitUntilNode.new(val[2], nil) } + | WAIT_UNTIL LPAREN expression RPAREN DOT wait_modifier + { result = WaitUntilNode.new(val[2],val[5]) } + | WAIT_UNTIL LPAREN expression RPAREN DOT wait_modifier DOT wait_modifier + { result = WaitUntilNode.new(val[2],val[5].merge(val[7])) } + ; + + wait_modifier + : timeout_modifier + | after_modifier + ; + + timeout_modifier + : swallow_newlines TIMEOUT LPAREN label RPAREN + { result = { label: val[3] } } + ; + + after_modifier + : swallow_newlines AFTER LPAREN indirectable COMMA STRING RPAREN + { result = { timeout: [val[3],val[5]] } } + ; + + label + : LABEL { result = val[0] } + ; + + use_statement + : FANUC_USE indirectable { result = UseNode.new(val[0],val[1]) } + ; + + # set_skip_condition x + set_skip_statement + : SET_SKIP_CONDITION expression { result = SetSkipNode.new(val[1]) } + ; + + program_call + : WORD LPAREN args RPAREN { result = CallNode.new(val[0],val[2]) } + | RUN WORD LPAREN args RPAREN { result = CallNode.new(val[1],val[3],async: true) } + ; + + args + : arg { result = [val[0]] } + | args COMMA arg { result = val[0] << val[2] } + | { result = [] } + ; + + arg + : number + | var + | string + | address + ; + + string + : STRING { result = StringNode.new(val[0]) } + ; + + io_method + : IO_METHOD var_or_indirect { result = IOMethodNode.new(val[0],val[1]) } + | IO_METHOD LPAREN var_or_indirect RPAREN + { result = IOMethodNode.new(val[0],val[2]) } + | IO_METHOD LPAREN var_or_indirect COMMA number COMMA STRING RPAREN + { result = IOMethodNode.new(val[0],val[2],{ pulse_time: val[4], pulse_units: val[6] }) } + ; + + var_or_indirect + : var + | indirect_thing + ; + + + jump + : JUMP label { result = JumpNode.new(val[1]) } + ; + + conditional + : IF expression block else_block END + { result = ConditionalNode.new("if",val[1],val[2],val[3]) } + | UNLESS expression block else_block END + { result = ConditionalNode.new("unless",val[1],val[2],val[3]) } + ; + + forloop + : FOR var IN LPAREN minmax_val TO minmax_val RPAREN block END + { result = ForNode.new(val[1],val[4],val[6],val[8]) } + ; + + while_loop + : WHILE expression block END { result = WhileNode.new(val[1],val[2]) } + ; + + minmax_val + : integer + | var + ; + + namespace + : NAMESPACE WORD block END { result = NamespaceNode.new(val[1],val[2]) } + ; + + case_statement + : CASE var swallow_newlines + case_conditions + case_else + END { result = CaseNode.new(val[1],val[3],val[4]) } + ; + + case_conditions + : case_condition { result = val } + | case_conditions case_condition + { result = val[0] << val[1] << val[2] } + ; + + case_condition + : WHEN case_allowed_condition swallow_newlines case_allowed_statement + terminator { result = CaseConditionNode.new(val[1],val[3]) } + ; + + case_allowed_condition + : number + | var + ; + + case_else + : ELSE swallow_newlines case_allowed_statement terminator + { result = CaseConditionNode.new(nil,val[2]) } + | + ; + + case_allowed_statement + : program_call + | jump + ; + + inline_conditional + : inlineable + | inlineable IF expression { result = InlineConditionalNode.new(val[1], val[2], val[0]) } + | inlineable UNLESS expression { result = InlineConditionalNode.new(val[1], val[2], val[0]) } + ; + + inlineable + : jump + | assignment + | io_method + | program_call + ; + + else_block + : ELSE block { result = val[1] } + | { result = [] } + ; + + motion_statement + : MOVE DOT swallow_newlines TO LPAREN var RPAREN motion_modifiers + { result = MotionNode.new(val[0],val[5],val[7]) } + ; + + motion_modifiers + : motion_modifier { result = val } + | motion_modifiers motion_modifier + { result = val[0] << val[1] } + ; + + motion_modifier + : DOT swallow_newlines AT LPAREN speed RPAREN + { result = SpeedNode.new(val[4]) } + | DOT swallow_newlines TERM LPAREN valid_terminations RPAREN + { result = TerminationNode.new(val[4]) } + | DOT swallow_newlines OFFSET LPAREN var RPAREN + { result = OffsetNode.new(val[2],val[4]) } + | DOT swallow_newlines TIME_SEGMENT LPAREN time COMMA time_seg_actions RPAREN + { result = TimeNode.new(val[2],val[4],val[6]) } + | DOT swallow_newlines SKIP LPAREN label optional_lpos_arg RPAREN + { result = SkipNode.new(val[4],val[5]) } + ; + + valid_terminations + : integer + | var + | MINUS DIGIT { + raise Racc::ParseError, sprintf("\ninvalid termination type: (%s)", val[1]) if val[1] != 1 + + result = DigitNode.new(val[1].to_i * -1) + } + ; + + optional_lpos_arg + : COMMA var { result = val[1] } + | + ; + + indirectable + : number + | var + ; + + time_seg_actions + : program_call + | io_method + ; + + time + : var + | number + ; + + speed + : indirectable COMMA STRING { result = { speed: val[0], units: val[2] } } + | STRING { result = { speed: val[0], units: nil } } + ; + + label_definition + : label { result = LabelDefinitionNode.new(val[0]) }#@interpreter.add_label(val[1]) } + ; + + definition + : WORD ASSIGN definable { result = DefinitionNode.new(val[0],val[2]) } + ; + + assignment + : var_or_indirect EQUAL expression { result = AssignmentNode.new(val[0],val[2]) } + | var_or_indirect PLUS EQUAL expression { result = AssignmentNode.new( + val[0], + ExpressionNode.new(val[0],"+",val[3]) + ) + } + | var_or_indirect MINUS EQUAL expression { result = AssignmentNode.new( + val[0], + ExpressionNode.new(val[0],"-",val[3]) + ) + } + ; + + var + : var_without_namespaces + | var_with_namespaces + ; + + var_without_namespaces + : WORD { result = VarNode.new(val[0]) } + | WORD var_method_modifiers { result = VarMethodNode.new(val[0],val[1]) } + ; + + var_with_namespaces + : namespaces var_without_namespaces + { result = NamespacedVarNode.new(val[0],val[1]) } + ; + + var_method_modifiers + : var_method_modifier { result = val[0] } + | var_method_modifiers var_method_modifier + { result = val[0].merge(val[1]) } + ; + + var_method_modifier + : DOT swallow_newlines WORD { result = { method: val[2] } } + | DOT swallow_newlines GROUP LPAREN integer RPAREN + { result = { group: val[4] } } + ; + + namespaces + : ns { result = [val[0]] } + | namespaces ns { result = val[0] << val[1] } + ; + + ns + : WORD COLON COLON { result = val[0] } + ; + + + expression + : unary_expression + | binary_expression + ; + + unary_expression + : factor { result = val[0] } + | address + | BANG factor { result = ExpressionNode.new(val[1], "!", nil) } + ; + + binary_expression + : expression operator expression + { result = ExpressionNode.new(val[0], val[1], val[2]) } + ; + + operator + : EEQUAL { result = "==" } + | NOTEQUAL { result = "<>" } + | LT { result = "<" } + | GT { result = ">" } + | GTE { result = ">=" } + | LTE { result = "<=" } + | PLUS { result = "+" } + | MINUS { result = "-" } + | OR { result = "||" } + | STAR { result = "*" } + | SLASH { result = "/" } + | DIV { result = "DIV" } + | MOD { result = "%" } + | AND { result = "&&" } + ; + + factor + : number + | signed_number + | var + | indirect_thing + | paren_expr + ; + + paren_expr + : LPAREN expression RPAREN { result = ParenExpressionNode.new(val[1]) } + ; + + indirect_thing + : INDIRECT LPAREN STRING COMMA indirectable RPAREN + { result = IndirectNode.new(val[2].to_sym, val[4]) } + ; + + signed_number + : sign DIGIT { + val[1] = val[1].to_i * -1 if val[0] == "-" + result = DigitNode.new(val[1]) + } + | sign REAL { val[1] = val[1].to_f * -1 if val[0] == "-"; result = RealNode.new(val[1]) } + ; + + sign + : MINUS { result = "-" } + ; + + number + : integer + | REAL { result = RealNode.new(val[0]) } + ; + + integer + : DIGIT { result = DigitNode.new(val[0]) } + ; + + definable + : numreg + | output + | input + | posreg + | position + | vreg + | number + | signed_number + | argument + | timer + | ualm + | sreg + ; + + + sreg + : SREG LBRACK DIGIT RBRACK { result = StringRegisterNode.new(val[2].to_i) } + ; + + ualm + : UALM LBRACK DIGIT RBRACK { result = UserAlarmNode.new(val[2].to_i) } + ; + + timer + : TIMER LBRACK DIGIT RBRACK { result = TimerNode.new(val[2].to_i) } + ; + + argument + : ARG LBRACK DIGIT RBRACK { result = ArgumentNode.new(val[2].to_i) } + ; + + vreg + : VREG LBRACK DIGIT RBRACK { result = VisionRegisterNode.new(val[2].to_i) } + ; + + position + : POSITION LBRACK DIGIT RBRACK { result = PositionNode.new(val[2].to_i) } + ; + + numreg + : NUMREG LBRACK DIGIT RBRACK { result = NumregNode.new(val[2].to_i) } + ; + + posreg + : POSREG LBRACK DIGIT RBRACK { result = PosregNode.new(val[2].to_i) } + ; + + output + : OUTPUT LBRACK DIGIT RBRACK { result = IONode.new(val[0], val[2].to_i) } + ; + + input + : INPUT LBRACK DIGIT RBRACK { result = IONode.new(val[0], val[2].to_i) } + ; + + address + : ADDRESS { result = AddressNode.new(val[0]) } + ; + + comment + : COMMENT { result = CommentNode.new(val[0]) } + ; + + terminator + : NEWLINE { result = TerminatorNode.new } + | comment optional_newline { result = val[0] } + # ^-- consume newlines or else we will get an extra space from EmptyStmt in the output + | false + | + ; + + swallow_newlines + : NEWLINE { result = TerminatorNode.new } + | + ; + + position_data + : POSITION_DATA sn hash sn END + { result = PositionDataNode.new(val[2]) } + ; + + sn + : swallow_newlines + ; + + hash + : LBRACE sn hash_attributes sn RBRACE { result = val[2] } + | LBRACE sn RBRACE { result = {} } + ; + + hash_attributes + : hash_attribute { result = val[0] } + | hash_attributes COMMA sn hash_attribute + { result = val[0].merge(val[3]) } + ; + + hash_attribute + : STRING COLON hash_value { result = { val[0].to_sym => val[2] } } + ; + + hash_value + : STRING + | hash + | array + | optional_sign DIGIT { val[1] = val[1].to_i * -1 if val[0] == "-"; result = val[1] } + | optional_sign REAL { val[1] = val[1].to_f * -1 if val[0] == "-"; result = val[1] } + | TRUE_FALSE { result = val[0] == "true" } + ; + + optional_sign + : sign + | + ; + + array + : LBRACK sn array_values sn RBRACK { result = val[2] } + ; + + array_values + : array_value { result = val } + | array_values COMMA sn array_value { result = val[0] << val[3] } + ; + + array_value + : hash_value + ; + + +end + +---- inner + + include TPPlus::Nodes + + attr_reader :interpreter + def initialize(scanner, interpreter = TPPlus::Interpreter.new) + @scanner = scanner + @interpreter = interpreter + super() + end + + def next_token + t = @scanner.next_token + @interpreter.line_count += 1 if t && t[0] == :NEWLINE + + #puts t.inspect + t + end + + def parse + #@yydebug =true + + do_parse + @interpreter + end + + def on_error(t, val, vstack) + raise ParseError, sprintf("Parse error on line #{@scanner.tok_line} column #{@scanner.tok_col}: %s (%s)", + val.inspect, token_to_str(t) || '?') + end + + class ParseError < StandardError ; end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/twowaysql.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/twowaysql.y new file mode 100644 index 000000000000..d3bc748d3a29 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/twowaysql.y @@ -0,0 +1,278 @@ +# Copyright 2008-2015 Takuto Wada +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +class TwoWaySQL::Parser + +rule + +sql : stmt_list + { + result = RootNode.new( val[0] ) + } + +stmt_list : + { + result = [] + } + | stmt_list stmt + { + result.push val[1] + } + +stmt : primary + | if_stmt + | begin_stmt + +begin_stmt : BEGIN stmt_list END + { + result = BeginNode.new( val[1] ) + } + +if_stmt : IF sub_stmt else_stmt END + { + result = IfNode.new( val[0][1], val[1], val[2] ) + } + +else_stmt : ELSE sub_stmt + { + result = val[1] + } + | + { + result = nil + } + +sub_stmt : and_stmt + | or_stmt + | stmt_list + +and_stmt : AND stmt_list + { + result = SubStatementNode.new( val[0][1], val[1] ) + } + +or_stmt : OR stmt_list + { + result = SubStatementNode.new( val[0][1], val[1] ) + } + +primary : IDENT + { + result = LiteralNode.new( val[0][1] ) + } + | STRING_LITERAL + { + result = LiteralNode.new( val[0][1] ) + } + | AND + { + result = LiteralNode.new( val[0][1] ) + } + | OR + { + result = LiteralNode.new( val[0][1] ) + } + | SPACES + { + result = WhiteSpaceNode.new( val[0][1], @preserve_space ) + } + | COMMA + { + result = LiteralNode.new( val[0][1] ) + } + | LPAREN + { + result = LiteralNode.new( val[0][1] ) + } + | RPAREN + { + result = LiteralNode.new( val[0][1] ) + } + | QUESTION + { + @num_questions += 1 + result = QuestionNode.new( @num_questions ) + } + | ACTUAL_COMMENT + { + result = ActualCommentNode.new( val[0][1] , val[0][2] ) + } + | bind_var + | embed_var + +bind_var : BIND_VARIABLE STRING_LITERAL + { + result = BindVariableNode.new( val[0][1] ) + } + | BIND_VARIABLE SPACES STRING_LITERAL + { + result = BindVariableNode.new( val[0][1] ) + } + | BIND_VARIABLE IDENT + { + result = BindVariableNode.new( val[0][1] ) + } + | BIND_VARIABLE SPACES IDENT + { + result = BindVariableNode.new( val[0][1] ) + } + | PAREN_BIND_VARIABLE + { + result = ParenBindVariableNode.new( val[0][1] ) + } + +embed_var : EMBED_VARIABLE IDENT + { + result = EmbedVariableNode.new( val[0][1] ) + } + | EMBED_VARIABLE SPACES IDENT + { + result = EmbedVariableNode.new( val[0][1] ) + } + +end + + +---- inner + +require 'strscan' + +def initialize(opts={}) + opts = { + :debug => false, + :preserve_space => true, + :preserve_comment => false + }.merge(opts) + @yydebug = opts[:debug] + @preserve_space = opts[:preserve_space] + @preserve_comment = opts[:preserve_comment] + @num_questions = 0 +end + + +PAREN_EXAMPLE = '\([^\)]+\)' +BEGIN_BIND_VARIABLE = '(\/|\#)\*([^\*]+)\*\1' +BIND_VARIABLE_PATTERN = /\A#{BEGIN_BIND_VARIABLE}\s*/ +PAREN_BIND_VARIABLE_PATTERN = /\A#{BEGIN_BIND_VARIABLE}\s*#{PAREN_EXAMPLE}/ +EMBED_VARIABLE_PATTERN = /\A(\/|\#)\*\$([^\*]+)\*\1\s*/ + +CONDITIONAL_PATTERN = /\A(\/|\#)\*(IF)\s+([^\*]+)\s*\*\1/ +BEGIN_END_PATTERN = /\A(\/|\#)\*(BEGIN|END)\s*\*\1/ +STRING_LITERAL_PATTERN = /\A(\'(?:[^\']+|\'\')*\')/ ## quoted string +SPLIT_TOKEN_PATTERN = /\A(\S+?)(?=\s*(?:(?:\/|\#)\*|-{2,}|\(|\)|\,))/ ## stop on delimiters --,/*,#*,',',(,) +LITERAL_PATTERN = /\A([^;\s]+)/ +SPACES_PATTERN = /\A(\s+)/ +QUESTION_PATTERN = /\A\?/ +COMMA_PATTERN = /\A\,/ +LPAREN_PATTERN = /\A\(/ +RPAREN_PATTERN = /\A\)/ +ACTUAL_COMMENT_PATTERN = /\A(\/|\#)\*(\s{1,}(?:.*?))\*\1/m ## start with spaces +SEMICOLON_AT_INPUT_END_PATTERN = /\A\;\s*\Z/ +UNMATCHED_COMMENT_START_PATTERN = /\A(?:(?:\/|\#)\*)/ + +#TODO: remove trailing spaces for S2Dao compatibility, but this spec sometimes causes SQL bugs... +ELSE_PATTERN = /\A\-{2,}\s*ELSE\s*/ +AND_PATTERN = /\A(\ *AND)\b/i +OR_PATTERN = /\A(\ *OR)\b/i + + +def parse( io ) + @q = [] + io.each_line(nil) do |whole| + @s = StringScanner.new(whole) + end + scan_str + + # @q.push [ false, nil ] + @q.push [ false, [@s.pos, nil] ] + + ## call racc's private parse method + do_parse +end + + +## called by racc +def next_token + @q.shift +end + + +def scan_str + until @s.eos? do + case + when @s.scan(AND_PATTERN) + @q.push [ :AND, [@s.pos, @s[1]] ] + when @s.scan(OR_PATTERN) + @q.push [ :OR, [@s.pos, @s[1]] ] + when @s.scan(SPACES_PATTERN) + @q.push [ :SPACES, [@s.pos, @s[1]] ] + when @s.scan(QUESTION_PATTERN) + @q.push [ :QUESTION, [@s.pos, nil] ] + when @s.scan(COMMA_PATTERN) + @q.push [ :COMMA, [@s.pos, ','] ] + when @s.scan(LPAREN_PATTERN) + @q.push [ :LPAREN, [@s.pos, '('] ] + when @s.scan(RPAREN_PATTERN) + @q.push [ :RPAREN, [@s.pos, ')'] ] + when @s.scan(ELSE_PATTERN) + @q.push [ :ELSE, [@s.pos, nil] ] + when @s.scan(ACTUAL_COMMENT_PATTERN) + @q.push [ :ACTUAL_COMMENT, [@s.pos, @s[1], @s[2]] ] if @preserve_comment + when @s.scan(BEGIN_END_PATTERN) + @q.push [ @s[2].intern, [@s.pos, nil] ] + when @s.scan(CONDITIONAL_PATTERN) + @q.push [ @s[2].intern, [@s.pos, @s[3]] ] + when @s.scan(EMBED_VARIABLE_PATTERN) + @q.push [ :EMBED_VARIABLE, [@s.pos, @s[2]] ] + when @s.scan(PAREN_BIND_VARIABLE_PATTERN) + @q.push [ :PAREN_BIND_VARIABLE, [@s.pos, @s[2]] ] + when @s.scan(BIND_VARIABLE_PATTERN) + @q.push [ :BIND_VARIABLE, [@s.pos, @s[2]] ] + when @s.scan(STRING_LITERAL_PATTERN) + @q.push [ :STRING_LITERAL, [@s.pos, @s[1]] ] + when @s.scan(SPLIT_TOKEN_PATTERN) + @q.push [ :IDENT, [@s.pos, @s[1]] ] + when @s.scan(UNMATCHED_COMMENT_START_PATTERN) ## unmatched comment start, '/*','#*' + raise Racc::ParseError, "unmatched comment. line:[#{line_no(@s.pos)}], str:[#{@s.rest}]" + when @s.scan(LITERAL_PATTERN) ## other string token + @q.push [ :IDENT, [@s.pos, @s[1]] ] + when @s.scan(SEMICOLON_AT_INPUT_END_PATTERN) + #drop semicolon at input end + else + raise Racc::ParseError, "syntax error at or near line:[#{line_no(@s.pos)}], str:[#{@s.rest}]" + end + end +end + + +## override racc's default on_error method +def on_error(t, v, vstack) + ## cursor in value-stack is an array of two items, + ## that have position value as 0th item. like [731, "ctx[:limit] "] + cursor = vstack.find do |tokens| + tokens.size == 2 and tokens[0].kind_of?(Fixnum) + end + pos = cursor[0] + line = line_no(pos) + rest = @s.string[pos .. -1] + raise Racc::ParseError, "syntax error at or near line:[#{line}], str:[#{rest}]" +end + + +def line_no(pos) + lines = 0 + scanned = @s.string[0..(pos)] + scanned.each_line { lines += 1 } + lines +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/unterm.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/unterm.y new file mode 100644 index 000000000000..518acc7f31f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/unterm.y @@ -0,0 +1,5 @@ +# unterminated action + +class A +rule + a: A { diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/useless.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/useless.y new file mode 100644 index 000000000000..3f172e341c2e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/useless.y @@ -0,0 +1,12 @@ + + +class A +token A B C X +rule + +targ : A list B + | A B C + +list: list X + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/yyerr.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/yyerr.y new file mode 100644 index 000000000000..9faae89a7936 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/assets/yyerr.y @@ -0,0 +1,46 @@ +# +# yyerror/yyerrok/yyaccept test +# + +class A +rule + +target: a b c + +a: + { + yyerror + raise ArgumentError, "yyerror failed" + } + | error + +b: + { + yyerrok + } + +c: + { + yyaccept + raise ArgumentError, "yyaccept failed" + } + +end + +---- inner + + def parse + do_parse + end + + def next_token + [false, '$end'] + end + + def on_error( *args ) + $stderr.puts "on_error called: args=#{args.inspect}" + end + +---- footer + +A.new.parse diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/bench.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/bench.y new file mode 100644 index 000000000000..c6ba13620155 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/bench.y @@ -0,0 +1,36 @@ +class BenchmarkParser + +rule + + target: a a a a a a a a a a; + a: b b b b b b b b b b; + b: c c c c c c c c c c; + c: d d d d d d d d d d; + d: e e e e e e e e e e; + +end + +---- inner + +def initialize + @old = [ :e, 'e' ] + @i = 0 +end + +def next_token + return [false, '$'] if @i >= 10_0000 + @i += 1 + @old +end + +def parse + do_parse +end + +---- footer + +require 'benchmark' + +Benchmark.bm do |x| + x.report { BenchmarkParser.new.parse } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/helper.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/helper.rb new file mode 100644 index 000000000000..146beb5a7379 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/helper.rb @@ -0,0 +1,115 @@ +verbose = $VERBOSE +$VERBOSE = true +begin + +require 'test/unit' +begin + require_relative './lib/core_assertions' + Test::Unit::TestCase.include Test::Unit::CoreAssertions +rescue LoadError +end +require 'racc/static' +require 'fileutils' +require 'tempfile' +require 'timeout' + +module Racc + class TestCase < Test::Unit::TestCase + PROJECT_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..')) + + test_dir = File.join(PROJECT_DIR, 'test') + test_dir = File.join(PROJECT_DIR, 'racc') unless File.exist?(test_dir) + TEST_DIR = test_dir + racc = File.join(PROJECT_DIR, 'bin', 'racc') + racc = File.join(PROJECT_DIR, '..', 'libexec', 'racc') unless File.exist?(racc) + RACC = racc + ASSET_DIR = File.join(TEST_DIR, 'assets') # test grammars + REGRESS_DIR = File.join(TEST_DIR, 'regress') # known-good generated outputs + + INC = [ + File.join(PROJECT_DIR, 'lib'), + File.join(PROJECT_DIR, 'ext'), + ].join(':') + + def setup + @TEMP_DIR = Dir.mktmpdir("racc") + @OUT_DIR = File.join(@TEMP_DIR, 'out') + @TAB_DIR = File.join(@TEMP_DIR, 'tab') # generated parsers go here + @LOG_DIR = File.join(@TEMP_DIR, 'log') + @ERR_DIR = File.join(@TEMP_DIR, 'err') + FileUtils.mkdir_p([@OUT_DIR, @TAB_DIR, @LOG_DIR, @ERR_DIR]) + FileUtils.cp File.join(TEST_DIR, "src.intp"), @TEMP_DIR + end + + def teardown + FileUtils.rm_f(File.join(@TEMP_DIR, "src.intp")) + FileUtils.rm_rf([@OUT_DIR, @TAB_DIR, @LOG_DIR, @ERR_DIR, @TEMP_DIR]) + end + + def assert_compile(asset, args = [], **opt) + file = File.basename(asset, '.y') + args = ([args].flatten) + [ + "#{ASSET_DIR}/#{file}.y", + '-Do', + "-O#{@OUT_DIR}/#{file}", + "-o#{@TAB_DIR}/#{file}", + ] + racc(*args, **opt) + end + + def assert_debugfile(asset, ok) + file = File.basename(asset, '.y') + Dir.chdir(@LOG_DIR) do + File.foreach("#{file}.y") do |line| + line.strip! + case line + when /sr/ then assert_equal "sr#{ok[0]}", line + when /rr/ then assert_equal "rr#{ok[1]}", line + when /un/ then assert_equal "un#{ok[2]}", line + when /ur/ then assert_equal "ur#{ok[3]}", line + when /ex/ then assert_equal "ex#{ok[4]}", line + else + raise TestFailed, 'racc outputs unknown debug report???' + end + end + end + end + + def assert_exec(asset) + lib_path = File.expand_path("../../lib", __FILE__) + file = File.basename(asset, '.y') + ruby "-I#{lib_path}", "#{@TAB_DIR}/#{file}" + end + + def strip_version(source) + source.sub(/This file is automatically generated by Racc \d+\.\d+\.\d+/, '') + end + + def assert_output_unchanged(asset) + file = File.basename(asset, '.y') + + # Code to re-generate the expectation files + # File.write("#{REGRESS_DIR}/#{file}", File.read("#{@TAB_DIR}/#{file}")) + + expected = File.read("#{REGRESS_DIR}/#{file}") + actual = File.read("#{@TAB_DIR}/#{file}") + result = (strip_version(expected) == strip_version(actual)) + + assert(result, "Output of test/assets/#{file}.y differed from " \ + "expectation. Try compiling it and diff with test/regress/#{file}.") + end + + def racc(*arg, **opt) + lib_path = File.expand_path("../../lib", __FILE__) + ruby "-I#{lib_path}", "-S", RACC, *arg, **opt + end + + def ruby(*arg, **opt) + assert_ruby_status(["-C", @TEMP_DIR, *arg], **opt) + end + end +end + +ensure +$VERBOSE = verbose +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/infini.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/infini.y new file mode 100644 index 000000000000..88b1e1e93b33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/infini.y @@ -0,0 +1,8 @@ + +class I + +rule + +list: list X + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/cadenza b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/cadenza new file mode 100644 index 000000000000..dafce3c9f3ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/cadenza @@ -0,0 +1,796 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + +# racc_parser.rb : generated by racc + +module Cadenza + class RaccParser < Racc::Parser + +module_eval(<<'...end cadenza.y/module_eval...', 'cadenza.y', 171) + +...end cadenza.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 37, 89, 65, 66, 20, 21, 22, 23, 24, 17, + 106, 37, 3, 76, 4, 3, 75, 4, 50, 37, + 29, 68, 65, 66, 33, 67, 34, 110, 9, 74, + 35, 9, 37, 36, 71, 33, 38, 34, 77, 78, + 79, 35, 72, 33, 36, 34, 37, 38, 3, 35, + 39, 83, 36, 54, 55, 38, 33, 89, 34, 37, + 90, 3, 35, 43, 9, 36, 85, 103, 38, 108, + 33, 109, 34, 56, 57, 111, 35, 9, 3, 36, + 46, 122, 38, 33, 112, 34, 113, 78, 79, 35, + 114, 3, 36, 4, 9, 38, 20, 21, 22, 23, + 24, 20, 21, 22, 23, 24, 115, 9, 65, 66, + 65, 66, 29, 54, 55, 120, 107, 29, 20, 21, + 22, 23, 24, 20, 21, 22, 23, 24, 20, 21, + 22, 23, 24, 3, 29, 39, 3, 121, 4, 29, + 3, 3, 43, 46, 29, 3, 124, 87, 125, 9, + 54, 55, 9, 56, 57, 128, 9, 9, 3, 103, + 116, 9, 20, 21, 22, 23, 24, 20, 21, 22, + 23, 24, 131, 3, 9, 116, 56, 57, 29, 3, + 89, 116, nil, 29, 20, 21, 22, 23, 24, 9, + 20, 21, 22, 23, 24, 9, 56, 57, 56, 57, + 29, 20, 21, 22, 23, 24, 29, 58, 59, 60, + 61, 62, 63, 56, 57, 56, 57, 29, 58, 59, + 60, 61, 62, 63, 20, 21, 22, 23, 24, 20, + 21, 22, 23, 24, 20, 21, 22, 23, 24, 20, + 21, 22, 23, 24, 20, 21, 22, 23, 24, 20, + 21, 22, 23, 24, 20, 21, 22, 23, 24, 20, + 21, 22, 23, 24, 20, 21, 22, 23, 24, 20, + 21, 22, 23, 24, 20, 21, 22, 23, 24, 65, + 66 ] + +racc_action_check = [ + 4, 73, 69, 69, 37, 37, 37, 37, 37, 1, + 69, 39, 0, 38, 0, 2, 38, 2, 17, 43, + 37, 32, 31, 31, 4, 31, 4, 73, 0, 37, + 4, 2, 46, 4, 35, 39, 4, 39, 39, 39, + 39, 39, 36, 43, 39, 43, 87, 39, 5, 43, + 5, 43, 43, 26, 26, 43, 46, 52, 46, 116, + 53, 6, 46, 6, 5, 46, 46, 67, 46, 71, + 87, 72, 87, 27, 27, 75, 87, 6, 7, 87, + 7, 87, 87, 116, 76, 116, 77, 116, 116, 116, + 78, 8, 116, 8, 7, 116, 3, 3, 3, 3, + 3, 20, 20, 20, 20, 20, 79, 8, 70, 70, + 51, 51, 3, 93, 93, 83, 70, 20, 24, 24, + 24, 24, 24, 33, 33, 33, 33, 33, 34, 34, + 34, 34, 34, 41, 24, 41, 42, 85, 42, 33, + 45, 48, 45, 48, 34, 49, 103, 49, 105, 41, + 94, 94, 42, 95, 95, 122, 45, 48, 81, 125, + 81, 49, 65, 65, 65, 65, 65, 66, 66, 66, + 66, 66, 126, 82, 81, 82, 96, 96, 65, 118, + 129, 118, nil, 66, 89, 89, 89, 89, 89, 82, + 108, 108, 108, 108, 108, 118, 97, 97, 98, 98, + 89, 124, 124, 124, 124, 124, 108, 28, 28, 28, + 28, 28, 28, 99, 99, 100, 100, 124, 64, 64, + 64, 64, 64, 64, 29, 29, 29, 29, 29, 54, + 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, + 56, 56, 56, 56, 57, 57, 57, 57, 57, 58, + 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, + 60, 60, 60, 60, 61, 61, 61, 61, 61, 62, + 62, 62, 62, 62, 63, 63, 63, 63, 63, 123, + 123 ] + +racc_action_pointer = [ + -12, 9, -9, 93, -3, 24, 37, 54, 67, nil, + nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, + 98, nil, nil, nil, 115, nil, 44, 62, 194, 221, + nil, 2, -4, 120, 125, 31, 39, 1, 10, 8, + nil, 109, 112, 16, nil, 116, 29, nil, 117, 121, + nil, 90, 55, 52, 226, 231, 236, 241, 246, 251, + 256, 261, 266, 271, 205, 159, 164, 64, nil, -18, + 88, 35, 43, -1, nil, 47, 56, 58, 62, 78, + nil, 134, 149, 87, nil, 109, nil, 43, nil, 181, + nil, nil, nil, 104, 141, 142, 165, 185, 187, 202, + 204, nil, nil, 124, nil, 125, nil, nil, 187, nil, + nil, nil, nil, nil, nil, nil, 56, nil, 155, nil, + nil, nil, 127, 259, 198, 156, 144, nil, nil, 178, + nil, nil ] + +racc_action_default = [ + -2, -70, -1, -70, -70, -70, -70, -70, -70, -60, + -61, -62, -63, -64, -65, -66, -68, -70, -67, -69, + -5, -7, -8, -9, -70, -11, -14, -17, -24, -70, + -26, -33, -70, -70, -70, -70, -70, -70, -70, -70, + -41, -70, -70, -70, -48, -70, -70, -52, -70, -70, + 132, -3, -6, -70, -70, -70, -70, -70, -70, -70, + -70, -70, -70, -70, -25, -70, -70, -70, -35, -70, + -70, -70, -70, -70, -54, -70, -70, -70, -70, -70, + -42, -70, -70, -70, -49, -70, -53, -70, -57, -70, + -10, -12, -13, -15, -16, -18, -19, -20, -21, -22, + -23, -27, -28, -29, -31, -34, -36, -37, -70, -50, + -55, -58, -59, -38, -39, -40, -70, -44, -70, -43, + -47, -51, -70, -4, -70, -70, -70, -45, -56, -30, + -32, -46 ] + +racc_goto_table = [ + 19, 40, 18, 32, 104, 52, 51, 1, 2, 64, + 47, 91, 92, 41, 45, 48, 49, 44, 42, 69, + 70, 105, 73, 51, 53, 95, 96, 97, 98, 99, + 100, 93, 94, 101, 102, 88, nil, 80, nil, 19, + nil, 18, nil, 19, nil, 18, 19, 19, 18, 18, + 82, 86, nil, nil, 81, nil, 84, nil, nil, nil, + nil, nil, 130, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 123, nil, 117, 119, nil, + 19, nil, 18, nil, nil, nil, nil, nil, nil, 118, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 126, 129, + 51, nil, nil, nil, 127, nil, 19, nil, 18 ] + +racc_goto_check = [ + 27, 16, 28, 6, 11, 3, 4, 1, 2, 9, + 22, 5, 5, 2, 2, 2, 2, 19, 15, 4, + 4, 12, 3, 4, 6, 8, 8, 8, 8, 8, + 8, 7, 7, 10, 10, 25, nil, 16, nil, 27, + nil, 28, nil, 27, nil, 28, 27, 27, 28, 28, + 2, 22, nil, nil, 15, nil, 19, nil, nil, nil, + nil, nil, 11, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 4, nil, 16, 16, nil, + 27, nil, 28, nil, nil, nil, nil, nil, nil, 2, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 6, 3, + 4, nil, nil, nil, 16, nil, 27, nil, 28 ] + +racc_goto_pointer = [ + nil, 7, 8, -15, -14, -43, 0, -25, -33, -20, + -32, -63, -46, nil, nil, 13, -4, nil, nil, 11, + nil, nil, 3, nil, nil, -14, nil, -2, 0 ] + +racc_goto_default = [ + nil, nil, nil, nil, 31, 25, nil, 26, 27, 28, + 30, nil, nil, 10, 5, nil, nil, 11, 6, nil, + 12, 7, nil, 14, 8, nil, 13, 16, 15 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 42, :_reduce_none, + 0, 42, :_reduce_2, + 1, 44, :_reduce_3, + 3, 44, :_reduce_4, + 1, 46, :_reduce_5, + 2, 46, :_reduce_6, + 1, 46, :_reduce_7, + 1, 46, :_reduce_8, + 1, 46, :_reduce_9, + 3, 46, :_reduce_10, + 1, 48, :_reduce_none, + 3, 48, :_reduce_12, + 3, 48, :_reduce_13, + 1, 49, :_reduce_none, + 3, 49, :_reduce_15, + 3, 49, :_reduce_16, + 1, 50, :_reduce_none, + 3, 50, :_reduce_18, + 3, 50, :_reduce_19, + 3, 50, :_reduce_20, + 3, 50, :_reduce_21, + 3, 50, :_reduce_22, + 3, 50, :_reduce_23, + 1, 51, :_reduce_none, + 2, 51, :_reduce_25, + 1, 45, :_reduce_none, + 3, 45, :_reduce_27, + 3, 45, :_reduce_28, + 1, 52, :_reduce_29, + 3, 52, :_reduce_30, + 1, 53, :_reduce_31, + 3, 53, :_reduce_32, + 1, 47, :_reduce_none, + 3, 47, :_reduce_34, + 3, 54, :_reduce_35, + 4, 55, :_reduce_36, + 4, 55, :_reduce_37, + 3, 56, :_reduce_38, + 3, 57, :_reduce_39, + 3, 57, :_reduce_40, + 2, 58, :_reduce_41, + 3, 58, :_reduce_42, + 4, 58, :_reduce_43, + 4, 58, :_reduce_44, + 5, 58, :_reduce_45, + 6, 59, :_reduce_46, + 3, 60, :_reduce_47, + 2, 61, :_reduce_48, + 3, 61, :_reduce_49, + 4, 62, :_reduce_50, + 3, 63, :_reduce_51, + 2, 64, :_reduce_52, + 3, 64, :_reduce_53, + 3, 65, :_reduce_54, + 4, 65, :_reduce_55, + 3, 66, :_reduce_56, + 3, 67, :_reduce_57, + 4, 68, :_reduce_58, + 4, 68, :_reduce_59, + 1, 69, :_reduce_60, + 1, 69, :_reduce_none, + 1, 69, :_reduce_none, + 1, 69, :_reduce_none, + 1, 69, :_reduce_none, + 1, 69, :_reduce_none, + 1, 43, :_reduce_66, + 2, 43, :_reduce_67, + 1, 43, :_reduce_68, + 2, 43, :_reduce_69 ] + +racc_reduce_n = 70 + +racc_shift_n = 132 + +racc_token_table = { + false => 0, + :error => 1, + "," => 2, + :IDENTIFIER => 3, + :INTEGER => 4, + :REAL => 5, + :STRING => 6, + "(" => 7, + ")" => 8, + "*" => 9, + "/" => 10, + "+" => 11, + "-" => 12, + :OP_EQ => 13, + :OP_NEQ => 14, + :OP_LEQ => 15, + :OP_GEQ => 16, + ">" => 17, + "<" => 18, + :NOT => 19, + :AND => 20, + :OR => 21, + ":" => 22, + "|" => 23, + :VAR_OPEN => 24, + :VAR_CLOSE => 25, + :STMT_OPEN => 26, + :IF => 27, + :STMT_CLOSE => 28, + :UNLESS => 29, + :ELSE => 30, + :ENDIF => 31, + :ENDUNLESS => 32, + :FOR => 33, + :IN => 34, + :ENDFOR => 35, + :BLOCK => 36, + :ENDBLOCK => 37, + :END => 38, + :EXTENDS => 39, + :TEXT_BLOCK => 40 } + +racc_nt_base = 41 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "\",\"", + "IDENTIFIER", + "INTEGER", + "REAL", + "STRING", + "\"(\"", + "\")\"", + "\"*\"", + "\"/\"", + "\"+\"", + "\"-\"", + "OP_EQ", + "OP_NEQ", + "OP_LEQ", + "OP_GEQ", + "\">\"", + "\"<\"", + "NOT", + "AND", + "OR", + "\":\"", + "\"|\"", + "VAR_OPEN", + "VAR_CLOSE", + "STMT_OPEN", + "IF", + "STMT_CLOSE", + "UNLESS", + "ELSE", + "ENDIF", + "ENDUNLESS", + "FOR", + "IN", + "ENDFOR", + "BLOCK", + "ENDBLOCK", + "END", + "EXTENDS", + "TEXT_BLOCK", + "$start", + "target", + "document", + "parameter_list", + "logical_expression", + "primary_expression", + "filtered_expression", + "multiplicative_expression", + "additive_expression", + "boolean_expression", + "inverse_expression", + "filter", + "filter_list", + "inject_statement", + "if_tag", + "else_tag", + "end_if_tag", + "if_block", + "for_tag", + "end_for_tag", + "for_block", + "block_tag", + "end_block_tag", + "block_block", + "generic_block_tag", + "end_generic_block_tag", + "generic_block", + "extends_statement", + "document_component" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +module_eval(<<'.,.,', 'cadenza.y', 12) + def _reduce_2(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 16) + def _reduce_3(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 17) + def _reduce_4(val, _values, result) + result = val[0].push(val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 22) + def _reduce_5(val, _values, result) + result = VariableNode.new(val[0].value) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 23) + def _reduce_6(val, _values, result) + result = VariableNode.new(val[0].value, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 24) + def _reduce_7(val, _values, result) + result = ConstantNode.new(val[0].value) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 25) + def _reduce_8(val, _values, result) + result = ConstantNode.new(val[0].value) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 26) + def _reduce_9(val, _values, result) + result = ConstantNode.new(val[0].value) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 27) + def _reduce_10(val, _values, result) + result = val[1] + result + end +.,., + +# reduce 11 omitted + +module_eval(<<'.,.,', 'cadenza.y', 32) + def _reduce_12(val, _values, result) + result = OperationNode.new(val[0], "*", val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 33) + def _reduce_13(val, _values, result) + result = OperationNode.new(val[0], "/", val[2]) + result + end +.,., + +# reduce 14 omitted + +module_eval(<<'.,.,', 'cadenza.y', 38) + def _reduce_15(val, _values, result) + result = OperationNode.new(val[0], "+", val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 39) + def _reduce_16(val, _values, result) + result = OperationNode.new(val[0], "-", val[2]) + result + end +.,., + +# reduce 17 omitted + +module_eval(<<'.,.,', 'cadenza.y', 44) + def _reduce_18(val, _values, result) + result = OperationNode.new(val[0], "==", val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 45) + def _reduce_19(val, _values, result) + result = OperationNode.new(val[0], "!=", val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 46) + def _reduce_20(val, _values, result) + result = OperationNode.new(val[0], "<=", val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 47) + def _reduce_21(val, _values, result) + result = OperationNode.new(val[0], ">=", val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 48) + def _reduce_22(val, _values, result) + result = OperationNode.new(val[0], ">", val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 49) + def _reduce_23(val, _values, result) + result = OperationNode.new(val[0], "<", val[2]) + result + end +.,., + +# reduce 24 omitted + +module_eval(<<'.,.,', 'cadenza.y', 54) + def _reduce_25(val, _values, result) + result = BooleanInverseNode.new(val[1]) + result + end +.,., + +# reduce 26 omitted + +module_eval(<<'.,.,', 'cadenza.y', 59) + def _reduce_27(val, _values, result) + result = OperationNode.new(val[0], "and", val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 60) + def _reduce_28(val, _values, result) + result = OperationNode.new(val[0], "or", val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 64) + def _reduce_29(val, _values, result) + result = FilterNode.new(val[0].value) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 65) + def _reduce_30(val, _values, result) + result = FilterNode.new(val[0].value, val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 69) + def _reduce_31(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 70) + def _reduce_32(val, _values, result) + result = val[0].push(val[2]) + result + end +.,., + +# reduce 33 omitted + +module_eval(<<'.,.,', 'cadenza.y', 75) + def _reduce_34(val, _values, result) + result = FilteredValueNode.new(val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 79) + def _reduce_35(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 83) + def _reduce_36(val, _values, result) + open_scope!; result = val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 84) + def _reduce_37(val, _values, result) + open_scope!; result = BooleanInverseNode.new(val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 88) + def _reduce_38(val, _values, result) + result = close_scope!; open_scope! + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 92) + def _reduce_39(val, _values, result) + result = close_scope! + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 93) + def _reduce_40(val, _values, result) + result = close_scope! + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 97) + def _reduce_41(val, _values, result) + result = IfNode.new(val[0], val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 98) + def _reduce_42(val, _values, result) + result = IfNode.new(val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 99) + def _reduce_43(val, _values, result) + result = IfNode.new(val[0], val[1], val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 100) + def _reduce_44(val, _values, result) + result = IfNode.new(val[0], val[2], val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 101) + def _reduce_45(val, _values, result) + result = IfNode.new(val[0], val[2], val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 105) + def _reduce_46(val, _values, result) + open_scope!; result = [val[2].value, val[4]] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 109) + def _reduce_47(val, _values, result) + result = close_scope! + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 114) + def _reduce_48(val, _values, result) + result = ForNode.new(VariableNode.new(val[0].first), val[0].last, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 115) + def _reduce_49(val, _values, result) + result = ForNode.new(VariableNode.new(val[0].first), val[0].last, val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 119) + def _reduce_50(val, _values, result) + result = open_block_scope!(val[2].value) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 123) + def _reduce_51(val, _values, result) + result = close_block_scope! + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 128) + def _reduce_52(val, _values, result) + result = BlockNode.new(val[0], val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 129) + def _reduce_53(val, _values, result) + result = BlockNode.new(val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 133) + def _reduce_54(val, _values, result) + open_scope!; result = [val[1].value, []] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 134) + def _reduce_55(val, _values, result) + open_scope!; result = [val[1].value, val[2]] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 138) + def _reduce_56(val, _values, result) + result = close_scope! + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 142) + def _reduce_57(val, _values, result) + result = GenericBlockNode.new(val[0].first, val[2], val[0].last) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 146) + def _reduce_58(val, _values, result) + result = val[2].value + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 147) + def _reduce_59(val, _values, result) + result = VariableNode.new(val[2].value) + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 151) + def _reduce_60(val, _values, result) + result = TextNode.new(val[0].value) + result + end +.,., + +# reduce 61 omitted + +# reduce 62 omitted + +# reduce 63 omitted + +# reduce 64 omitted + +# reduce 65 omitted + +module_eval(<<'.,.,', 'cadenza.y', 160) + def _reduce_66(val, _values, result) + push val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 161) + def _reduce_67(val, _values, result) + push val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 162) + def _reduce_68(val, _values, result) + document.extends = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cadenza.y', 163) + def _reduce_69(val, _values, result) + document.extends = val[1] + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class RaccParser +end # module Cadenza diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/cast b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/cast new file mode 100644 index 000000000000..1892c73e018e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/cast @@ -0,0 +1,3428 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + + +require 'set' + +# Error classes +module C + class ParseError < StandardError; end +end + +# Local variables: +# mode: ruby +# end: +module C + class Parser < Racc::Parser + +module_eval(<<'...end cast.y/module_eval...', 'cast.y', 564) + # A.1.9 -- Preprocessing numbers -- skip + # A.1.8 -- Header names -- skip + + # A.1.7 -- Puncuators -- we don't bother with {##,#,%:,%:%:} since + # we don't do preprocessing + @@punctuators = %r'\+\+|-[->]|&&|\|\||\.\.\.|(?:<<|>>|[<>=!*/%+\-&^|])=?|[\[\](){}.~?:;,]' + @@digraphs = %r'<[:%]|[:%]>' + + # A.1.6 -- String Literals -- simple for us because we don't decode + # the string (and indeed accept some illegal strings) + @@string_literal = %r'L?"(?:[^\\]|\\.)*?"'m + + # A.1.5 -- Constants + @@decimal_floating_constant = %r'(?:(?:\d*\.\d+|\d+\.)(?:e[-+]?\d+)?|\d+e[-+]?\d+)[fl]?'i + @@hexadecimal_floating_constant = %r'0x(?:(?:[0-9a-f]*\.[0-9a-f]+|[0-9a-f]+\.)|[0-9a-f]+)p[-+]?\d+[fl]?'i + + @@integer_constant = %r'(?:[1-9][0-9]*|0x[0-9a-f]+|0[0-7]*)(?:ul?l?|ll?u?)?'i + @@floating_constant = %r'#{@@decimal_floating_constant}|#{@@hexadecimal_floating_constant}' + @@enumeration_constant = %r'[a-zA-Z_\\][a-zA-Z_\\0-9]*' + @@character_constant = %r"L?'(?:[^\\]|\\.)+?'" + # (note that as with string-literals, we accept some illegal + # character-constants) + + # A.1.4 -- Universal character names -- skip + + # A.1.3 -- Identifiers -- skip, since an identifier is lexically + # identical to an enumeration constant + + # A.1.2 Keywords + keywords = %w'auto break case char const continue default do +double else enum extern float for goto if inline int long register +restrict return short signed sizeof static struct switch typedef union + unsigned void volatile while _Bool _Complex _Imaginary' + @@keywords = %r"#{keywords.join('|')}" + + def initialize + @type_names = ::Set.new + + @warning_proc = lambda{} + @pos = C::Node::Pos.new(nil, 1, 0) + end + def initialize_copy(x) + @pos = x.pos.dup + @type_names = x.type_names.dup + end + attr_accessor :pos, :type_names + + def parse(str) + if str.respond_to? :read + str = str.read + end + @str = str + begin + prepare_lexer(str) + return do_parse + rescue ParseError => e + e.set_backtrace(caller) + raise + end + end + + # + # Error handler, as used by racc. + # + def on_error(error_token_id, error_value, value_stack) + if error_value == '$' + parse_error @pos, "unexpected EOF" + else + parse_error(error_value.pos, + "parse error on #{token_to_str(error_token_id)} (#{error_value.val})") + end + end + + def self.feature(name) + attr_writer "#{name}_enabled" + class_eval <<-EOS + def enable_#{name} + @#{name}_enabled = true + end + def #{name}_enabled? + @#{name}_enabled + end + EOS + end + private_class_method :feature + + # + # Allow blocks in parentheses as expressions, as per the gcc + # extension. [http://rubyurl.com/iB7] + # + feature :block_expressions + + private # --------------------------------------------------------- + + class Token + attr_accessor :pos, :val + def initialize(pos, val) + @pos = pos + @val = val + end + end + def eat(str) + lines = str.split(/\r\n|[\r\n]/, -1) + if lines.length == 1 + @pos.col_num += lines[0].length + else + @pos.line_num += lines.length - 1 + @pos.col_num = lines[-1].length + end + end + + # + # Make a Declaration from the given specs and declarators. + # + def make_declaration(pos, specs, declarators) + specs.all?{|x| x.is_a?(Symbol) || x.is_a?(Type)} or raise specs.map{|x| x.class}.inspect + decl = Declaration.new_at(pos, nil, declarators) + + # set storage class + storage_classes = specs.find_all do |x| + [:typedef, :extern, :static, :auto, :register].include? x + end + # 6.7.1p2: at most, one storage-class specifier may be given in + # the declaration specifiers in a declaration + storage_classes.length <= 1 or + begin + if declarators.length == 0 + for_name = '' + else + for_name = "for `#{declarators[0].name}'" + end + parse_error pos, "multiple or duplicate storage classes given #{for_name}'" + end + decl.storage = storage_classes[0] + + # set type (specifiers, qualifiers) + decl.type = make_direct_type(pos, specs) + + # set function specifiers + decl.inline = specs.include?(:inline) + + # look for new type names + if decl.typedef? + decl.declarators.each do |d| + if d.name + @type_names << d.name + end + end + end + + return decl + end + + def make_function_def(pos, specs, func_declarator, decl_list, defn) + add_decl_type(func_declarator, make_direct_type(pos, specs)) + + # get types from decl_list if necessary + function = func_declarator.indirect_type + function.is_a? Function or + parse_error pos, "non function type for function `#{func_declarator.name}'" + params = function.params + if decl_list + params.all?{|p| p.type.nil?} or + parse_error pos, "both prototype and declaration list given for `#{func_declarator.name}'" + decl_list.each do |declaration| + declaration.declarators.each do |declarator| + param = params.find{|p| p.name == declarator.name} or + parse_error pos, "no parameter named #{declarator.name}" + if declarator.indirect_type + param.type = declarator.indirect_type + param.type.direct_type = declaration.type.dup + else + param.type = declaration.type.dup + end + end + end + params.all?{|p| p.type} or + begin + s = params.find_all{|p| p.type.nil?}.map{|p| "`#{p.name}'"}.join(' and ') + parse_error pos, "types missing for parameters #{s}" + end + end + + fd = FunctionDef.new_at(pos, + function.detach, + func_declarator.name, + defn, + :no_prototype => !decl_list.nil?) + + # set storage class + # 6.9.1p4: only extern or static allowed + specs.each do |s| + [:typedef, :auto, :register].include?(s) and + "`#{s}' illegal for function" + end + storage_classes = specs.find_all do |s| + s == :extern || s == :static + end + # 6.7.1p2: at most, one storage-class specifier may be given in + # the declaration specifiers in a declaration + storage_classes.length <= 1 or + "multiple or duplicate storage classes given for `#{func_declarator.name}'" + fd.storage = storage_classes[0] if storage_classes[0] + + # set function specifiers + # 6.7.4p5 'inline' can be repeated + fd.inline = specs.include?(:inline) + + return fd + end + + # + # Make a direct type from the list of type specifiers and type + # qualifiers. + # + def make_direct_type(pos, specs) + specs_order = [:signed, :unsigned, :short, :long, :double, :void, + :char, :int, :float, :_Bool, :_Complex, :_Imaginary] + + type_specs = specs.find_all do |x| + specs_order.include?(x) || !x.is_a?(Symbol) + end + type_specs.sort! do |a, b| + (specs_order.index(a)||100) <=> (specs_order.index(b)||100) + end + + # set type specifiers + # 6.7.2p2: the specifier list should be one of these + type = + case type_specs + when [:void] + Void.new + when [:char] + Char.new + when [:signed, :char] + Char.new :signed => true + when [:unsigned, :char] + Char.new :signed => false + when [:short], [:signed, :short], [:short, :int], + [:signed, :short, :int] + Int.new :longness => -1 + when [:unsigned, :short], [:unsigned, :short, :int] + Int.new :unsigned => true, :longness => -1 + when [:int], [:signed], [:signed, :int] + Int.new + when [:unsigned], [:unsigned, :int] + Int.new :unsigned => true + when [:long], [:signed, :long], [:long, :int], + [:signed, :long, :int] + Int.new :longness => 1 + when [:unsigned, :long], [:unsigned, :long, :int] + Int.new :longness => 1, :unsigned => true + when [:long, :long], [:signed, :long, :long], + [:long, :long, :int], [:signed, :long, :long, :int] + Int.new :longness => 2 + when [:unsigned, :long, :long], [:unsigned, :long, :long, :int] + Int.new :longness => 2, :unsigned => true + when [:float] + Float.new + when [:double] + Float.new :longness => 1 + when [:long, :double] + Float.new :longness => 2 + when [:_Bool] + Bool.new + when [:float, :_Complex] + Complex.new + when [:double, :_Complex] + Complex.new :longness => 1 + when [:long, :double, :_Complex] + Complex.new :longness => 2 + when [:float, :_Imaginary] + Imaginary.new + when [:double, :_Imaginary] + Imaginary.new :longness => 1 + when [:long, :double, :_Imaginary] + Imaginary.new :longness => 2 + else + if type_specs.length == 1 && + [CustomType, Struct, Union, Enum].any?{|c| type_specs[0].is_a? c} + type_specs[0] + else + if type_specs == [] + parse_error pos, "no type specifiers given" + else + parse_error pos, "invalid type specifier combination: #{type_specs.join(' ')}" + end + end + end + type.pos ||= pos + + # set type qualifiers + # 6.7.3p4: type qualifiers can be repeated + type.const = specs.any?{|x| x.equal? :const } + type.restrict = specs.any?{|x| x.equal? :restrict} + type.volatile = specs.any?{|x| x.equal? :volatile} + + return type + end + + def make_parameter(pos, specs, indirect_type, name) + type = indirect_type + if type + type.direct_type = make_direct_type(pos, specs) + else + type = make_direct_type(pos, specs) + end + [:typedef, :extern, :static, :auto, :inline].each do |sym| + specs.include? sym and + parse_error pos, "parameter `#{declarator.name}' declared `#{sym}'" + end + return Parameter.new_at(pos, type, name, + :register => specs.include?(:register)) + end + + def add_type_quals(type, quals) + type.const = quals.include?(:const ) + type.restrict = quals.include?(:restrict) + type.volatile = quals.include?(:volatile) + return type + end + + # + # Add te given type as the "most direct" type to the given + # declarator. Return the declarator. + # + def add_decl_type(declarator, type) + if declarator.indirect_type + declarator.indirect_type.direct_type = type + else + declarator.indirect_type = type + end + return declarator + end + + def param_list(params, var_args) + if params.length == 1 && + params[0].type.is_a?(Void) && + params[0].name.nil? + return NodeArray[] + elsif params.empty? + return nil + else + return params + end + end + + def parse_error(pos, str) + raise ParseError, "#{pos}: #{str}" + end + +...end cast.y/module_eval... +##### State transition tables begin ### + +clist = [ +'99,100,65,103,108,109,120,312,61,110,111,112,113,114,115,116,117,77', +'48,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,31,32,33,34,35', +'36,37,72,281,128,49,38,196,391,123,124,126,127,129,130,131,132,183,277', +'83,273,84,238,288,293,88,196,72,290,38,274,184,372,373,386,239,240,289', +'294,71,241,242,50,147,148,149,150,99,100,65,193,108,109,120,50,281,110', +'111,112,113,114,115,116,117,71,50,10,11,12,13,14,15,16,17,18,19,20,21', +'22,23,24,25,26,31,32,33,34,35,36,37,56,366,128,89,38,50,169,123,124', +'126,127,129,130,131,132,99,100,65,88,108,109,120,88,88,110,111,112,113', +'114,115,116,117,346,349,238,59,68,48,365,195,50,147,148,149,150,38,347', +'239,240,69,178,283,196,312,366,243,244,48,262,88,128,185,38,263,284', +'123,124,126,127,129,130,131,132,99,100,65,49,108,109,120,38,50,110,111', +'112,113,114,115,116,117,281,365,309,440,249,250,49,238,50,147,148,149', +'150,313,379,196,227,439,178,413,239,240,88,196,50,48,50,196,128,187', +'38,191,196,123,124,126,127,129,130,131,132,99,100,65,50,108,109,120', +'416,428,110,111,112,113,114,115,116,117,255,256,192,196,196,197,49,198', +'50,147,148,149,150,228,229,230,231,232,233,234,235,236,237,43,199,48', +'241,242,128,202,38,241,242,123,124,126,127,129,130,131,132,99,100,65', +'50,108,109,120,375,376,110,111,112,113,114,115,116,117,196,196,205,377', +'387,427,49,433,50,147,148,149,150,196,388,196,437,196,206,445,209,447', +'450,43,251,48,196,252,128,196,38,196,196,123,124,126,127,129,130,131', +'132,99,100,65,50,108,109,120,454,253,110,111,112,113,114,115,116,117', +'196,34,35,36,243,244,49,49,50,147,148,149,150,34,35,36,243,244,254,49', +'245,246,247,248,67,48,243,244,128,268,38,243,244,123,124,126,127,129', +'130,131,132,99,100,65,50,108,109,120,249,250,110,111,112,113,114,115', +'116,117,245,246,247,248,271,272,49,275,50,147,148,149,150,245,246,247', +'248,285,296,192,303,307,308,314,315,277,50,50,128,50,38,353,355,123', +'124,126,127,129,130,131,132,99,100,65,50,108,109,120,357,50,110,111', +'112,113,114,115,116,117,378,389,390,251,281,252,49,253,50,147,148,149', +'150,254,395,396,397,398,399,405,406,384,384,423,424,425,426,442,128', +',38,,,123,124,126,127,129,130,131,132,99,100,65,50,108,109,120,,,110', +'111,112,113,114,115,116,117,,,,,,,,,50,147,148,149,150,,,,,,,,,,,,,', +',,128,,38,,,123,124,126,127,129,130,131,132,99,100,65,,108,109,120,', +',110,111,112,113,114,115,116,117,,,,,,,,,50,147,148,149,150,,,,,,,,', +',,,,,,,128,,38,,,123,124,126,127,129,130,131,132,99,100,65,,108,109', +'120,,,110,111,112,113,114,115,116,117,,,,,,,,,50,147,148,149,150,,,', +',,,,,,,,,,,,128,,38,,,123,124,126,127,129,130,131,132,99,100,65,,108', +'109,120,,,110,111,112,113,114,115,116,117,,,,,,,,,50,147,148,149,150', +',,,,,,,,,,,,,,,128,,38,,,123,124,126,127,129,130,131,132,99,100,65,', +'108,109,120,,,110,111,112,113,114,115,116,117,,,,,,,,,50,147,148,149', +'150,,,,,,,,,,,,,,,,128,,38,,,123,124,126,127,129,130,131,132,99,100', +'65,,108,109,120,,,110,111,112,113,114,115,116,117,,,,,,,,,50,147,148', +'149,150,,,,,,,,,,,,,,,,128,,38,,,123,124,126,127,129,130,131,132,99', +'100,65,,108,109,120,,,110,111,112,113,114,115,116,117,,,,,,,,,50,147', +'148,149,150,,,,,,,,,,,,,,,,128,,38,,,123,124,126,127,129,130,131,132', +'99,100,65,,108,109,120,,,110,111,112,113,114,115,116,117,,,,,,,,,50', +'147,148,149,150,,,,,,,,,,,,,,,,128,,38,,,123,124,126,127,129,130,131', +'132,99,100,65,,108,109,120,,,110,111,112,113,114,115,116,117,,,,,,,', +',50,147,148,149,150,,,,,,,,,,,,,,,,128,,38,,,123,124,126,127,129,130', +'131,132,99,100,65,,108,109,120,,,110,111,112,113,114,115,116,117,,,', +',,,,,50,147,148,149,150,,,,,,,,,,,,,,,,128,,38,,,123,124,126,127,129', +'130,131,132,99,100,65,,108,109,120,,,110,111,112,113,114,115,116,117', +',,,,,,,,50,147,148,149,150,,,,,,,,,,,,,,,,128,,38,,,123,124,126,127', +'129,130,131,132,99,100,65,,108,109,120,,,110,111,112,113,114,115,116', +'117,,,,,,,,,50,147,148,149,150,,,,,,,,,,,,,,,,128,,38,,,123,124,126', +'127,129,130,131,132,99,100,65,,108,109,120,,,110,111,112,113,114,115', +'116,117,,,,,,,,,50,147,148,149,150,,,,,,,,,,,,,,,,128,,38,,,123,124', +'126,127,129,130,131,132,99,100,65,,108,109,120,,,110,111,112,113,114', +'115,116,117,154,,,,120,,,,50,147,148,149,150,,,,,,,215,,,,,,,,,128,', +'38,,,123,124,126,127,129,130,131,132,,,128,,,,,123,124,126,127,129,130', +'131,132,214,,,,,216,217,218,219,,50,147,148,149,150,65,,,,120,,,,,,50', +'147,148,149,150,154,,,,120,,,15,16,17,18,19,20,21,22,23,24,25,26,31', +'32,33,34,35,36,,,,128,,38,,,123,124,126,127,129,130,131,132,262,,128', +',,263,,123,124,126,127,129,130,131,132,,,,,,,,,,,50,147,148,149,150', +'65,,,,120,,,,,,50,147,148,149,150,,,,,,,,15,16,17,18,19,20,21,22,23', +'24,25,26,31,32,33,34,35,36,,,,128,,38,,,123,124,126,127,129,130,131', +'132,,,,,,,,,65,,,,120,,,,,,,,,,,,,50,147,148,149,150,15,16,17,18,19', +'20,21,22,23,24,25,26,31,32,33,34,35,36,,,,128,,38,,,123,124,126,127', +'129,130,131,132,154,,,,120,,,,,,,,,384,,,,120,,,,,,,,50,147,148,149', +'150,,,,,,,,,,,,,,128,,,,,123,124,126,127,129,130,131,132,128,,,,,123', +'124,126,127,129,130,131,132,154,392,,,120,,,,,,,,50,147,148,149,150', +'154,,,,120,,,,50,147,148,149,150,,,,,,,,,,,,262,,128,,,263,,123,124', +'126,127,129,130,131,132,,,262,,128,,,263,,123,124,126,127,129,130,131', +'132,154,,,,120,,,,50,147,148,149,150,,,154,453,,,120,,,,,,50,147,148', +'149,150,,,,,,,,,,,,,,128,,,,,123,124,126,127,129,130,131,132,262,,128', +',208,263,120,123,124,126,127,129,130,131,132,,,,,,,,,,,50,147,148,149', +'150,,,,,,,,,,,50,147,148,149,150,128,,,,,123,124,126,127,129,130,131', +'132,,,,,,,,,,,,,,,,305,,120,,,,,,,,50,147,148,149,150,10,11,12,13,14', +'15,16,17,18,19,20,21,22,23,24,25,26,31,32,33,34,35,36,37,,,128,,38,', +',123,124,126,127,129,130,131,132,381,,120,,,,,,,,,,,383,,120,,,,,,,', +',,50,147,148,149,150,,,,,,,,,,,,128,,,,,123,124,126,127,129,130,131', +'132,128,,412,,120,123,124,126,127,129,130,131,132,,,,,,,,,,,,,50,147', +'148,149,150,,,,,,,,,50,147,148,149,150,128,,,,,123,124,126,127,129,130', +'131,132,120,,,,,,,,,,,,,120,,160,,,,,,,,,,50,147,148,149,150,,,,34,35', +'36,,,159,161,,,,,123,124,126,127,129,130,131,132,128,,,,220,123,124', +'126,127,129,130,131,132,,,,,220,,,,,,,,50,147,148,149,150,,,,,,,,,50', +'147,148,149,150,128,,,,,123,124,126,127,129,130,131,132,128,,,,120,123', +'124,126,127,129,130,131,132,,,,,224,,,,,,,,50,147,148,149,150,,,,,,', +',,50,147,148,149,150,128,,,,,123,124,126,127,129,130,131,132,128,,,', +',123,124,126,127,129,130,131,132,,,120,,,,,,,,,,50,147,148,149,150,266', +',,,120,,,,50,147,148,149,150,,,,,,34,35,36,,,265,267,,,,120,123,124', +'126,127,129,130,131,132,34,35,36,,,,128,,,,120,123,124,126,127,129,130', +'131,132,,,,,,,50,147,148,149,150,128,,,,120,123,124,126,127,129,130', +'131,132,,50,147,148,149,150,128,,,,120,123,124,126,127,129,130,131,132', +',,,,,,50,147,148,149,150,128,,,,120,123,124,126,127,129,130,131,132', +',50,147,148,149,150,128,,,,120,123,124,126,127,129,130,131,132,,,,,', +',50,147,148,149,150,128,,,,120,123,124,126,127,129,130,131,132,,50,147', +'148,149,150,128,,,,,123,124,126,127,129,130,131,132,,,,,,,50,147,148', +'149,150,128,,,,,123,124,126,127,129,130,131,132,,50,147,148,149,150', +',,,,,,120,318,,,,,,,,,,,,50,147,148,149,150,15,16,17,18,19,20,21,22', +'23,24,25,26,31,32,33,34,35,36,,,,128,,38,,120,123,124,126,127,129,130', +'131,132,,,,,120,,,,,,,,,,,,,,,,,,,,,50,147,148,149,150,128,,,,,123,124', +'126,127,129,130,131,132,128,,,,120,123,124,126,127,129,130,131,132,', +',,,120,,,,,,,,50,147,148,149,150,,,,,,,,,50,147,148,149,150,128,,,,', +'123,124,126,127,129,130,131,132,128,,,,120,123,124,126,127,129,130,131', +'132,,,,,120,,,,,,,,50,147,148,149,150,,,,,,,,,50,147,148,149,150,128', +',,,,123,124,126,127,129,130,131,132,128,,,,120,123,124,126,127,129,130', +'131,132,,,,,120,,,,,,,,50,147,148,149,150,,,,,,,,,50,147,148,149,150', +'128,,,,,123,124,126,127,129,130,131,132,128,,,,120,123,124,126,127,129', +'130,131,132,,,,,120,,,,,,,,50,147,148,149,150,,,,,,,,,50,147,148,149', +'150,128,,,,,123,124,126,127,129,130,131,132,128,,,,120,123,124,126,127', +'129,130,131,132,,,,,120,,,,,,,,50,147,148,149,150,,,,,,,,,50,147,148', +'149,150,128,,,,,123,124,126,127,129,130,131,132,128,,,,120,123,124,126', +'127,129,130,131,132,,,,,120,,,,,,,,50,147,148,149,150,,,,,,,,,50,147', +'148,149,150,128,,,,,123,124,126,127,129,130,131,132,128,,,,120,123,124', +'126,127,129,130,131,132,,,,,120,,,,,,,,50,147,148,149,150,,,,,,,,,50', +'147,148,149,150,128,,,,,123,124,126,127,129,130,131,132,128,,,,120,123', +'124,126,127,129,130,131,132,,,,,120,,,,,,,,50,147,148,149,150,,,,,,', +',,50,147,148,149,150,128,,,,,123,124,126,127,129,130,131,132,128,,,', +'120,123,124,126,127,129,130,131,132,,,,,120,,,,,,,,50,147,148,149,150', +',,,,,,,,50,147,148,149,150,128,,,,,123,124,126,127,129,130,131,132,128', +',,,120,123,124,126,127,129,130,131,132,,,,,120,,,,,,,,50,147,148,149', +'150,,,,,,,,,50,147,148,149,150,128,,,,,123,124,126,127,129,130,131,132', +'128,,,,,123,124,126,127,129,130,131,132,120,,,,,,,,,,,,50,147,148,149', +'150,120,,,,,,,,50,147,148,149,150,,,,34,35,36,,,,128,,,,,123,124,126', +'127,129,130,131,132,,,,368,369,,,,120,123,124,126,127,129,130,131,132', +',,,,,120,,,50,147,148,149,150,,,,,,,,,,,,,50,147,148,149,150,128,,,', +',123,124,126,127,129,130,131,132,401,402,,,,120,123,124,126,127,129', +'130,131,132,,,,,120,415,,,,,,50,147,148,149,150,,,,,,,,,,50,147,148', +'149,150,128,,,,,123,124,126,127,129,130,131,132,128,,,,,123,124,126', +'127,129,130,131,132,120,418,,,,,,,,,,,50,147,148,149,150,,,,,,,,,50', +'147,148,149,150,,,,,,,,,,128,,,,,123,124,126,127,129,130,131,132,,,', +',,,,,,,,,120,,,,,,,,,,,,,50,147,148,149,150,15,16,17,18,19,20,21,22', +'23,24,25,26,31,32,33,34,35,36,,,,128,,38,,120,123,124,126,127,129,130', +'131,132,,,,,120,430,,,,,,,,,,,,,,,,,,,,50,147,148,149,150,128,,,,,123', +'124,126,127,129,130,131,132,128,,,,,123,124,126,127,129,130,131,132', +'120,432,,,,,,,,,,,50,147,148,149,150,120,436,,,,,,,50,147,148,149,150', +',,,,,,,,,128,,,,,123,124,126,127,129,130,131,132,,,,,128,,,,,123,124', +'126,127,129,130,131,132,120,444,,,,,,,50,147,148,149,150,,,,,,,,,,,', +',50,147,148,149,150,,,,,,,,,,128,,,,,123,124,126,127,129,130,131,132', +',,,,,,,,,,,,,,,,,277,364,,,,,,,50,147,148,149,150,10,11,12,13,14,15', +'16,17,18,19,20,21,22,23,24,25,26,31,32,33,34,35,36,37,281,164,49,,38', +',,,,,,,,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,31,32,33', +'34,35,36,37,,,,50,38,,,,,,,,,,,,,,,39,,,,,,,,,,,,,,,,,,,,,50,10,11,12', +'13,14,15,16,17,18,19,20,21,22,23,24,25,26,31,32,33,34,35,36,37,65,,', +',38,,,,,,,,,,,,67,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26', +'31,32,33,34,35,36,37,65,,,,38,,,,,,,,,,,,,10,11,12,13,14,15,16,17,18', +'19,20,21,22,23,24,25,26,31,32,33,34,35,36,37,173,,,,38,,,,,,,,,,,,,', +',,,15,16,17,18,19,20,21,22,23,24,25,26,31,32,33,34,35,36,282,,,,,38', +',,,,,,,,,,,,,,,15,16,17,18,19,20,21,22,23,24,25,26,31,32,33,34,35,36', +'287,,,,,38,,,,,,,,,,,,,,,,15,16,17,18,19,20,21,22,23,24,25,26,31,32', +'33,34,35,36,312,364,,,,38,,,,,,,,10,11,12,13,14,15,16,17,18,19,20,21', +'22,23,24,25,26,31,32,33,34,35,36,37,281,404,49,,38,,,,,,,,,10,11,12', +'13,14,15,16,17,18,19,20,21,22,23,24,25,26,31,32,33,34,35,36,37,,,,,38', +'10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,31,32,33,34,35,36', +'37,,,,,38,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,31,32,33', +'34,35,36,37,,,,,38,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26', +'31,32,33,34,35,36,37,,,,,38,10,11,12,13,14,15,16,17,18,19,20,21,22,23', +'24,25,26,31,32,33,34,35,36,37,,,,,38,10,11,12,13,14,15,16,17,18,19,20', +'21,22,23,24,25,26,31,32,33,34,35,36,37,,,,,38,10,11,12,13,14,15,16,17', +'18,19,20,21,22,23,24,25,26,31,32,33,34,35,36,37,,,,359,38,15,16,17,18', +'19,20,21,22,23,24,25,26,31,32,33,34,35,36,,,,,,38,15,16,17,18,19,20', +'21,22,23,24,25,26,31,32,33,34,35,36,,,,,,38,15,16,17,18,19,20,21,22', +'23,24,25,26,31,32,33,34,35,36,,,,,,38,15,16,17,18,19,20,21,22,23,24', +'25,26,31,32,33,34,35,36,,,,,,38,15,16,17,18,19,20,21,22,23,24,25,26', +'31,32,33,34,35,36,,,,,,38' ] + racc_action_table = arr = ::Array.new(4321, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'65,65,65,65,65,65,65,210,39,65,65,65,65,65,65,65,65,55,45,65,65,65,65', +'65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,46,210,65', +'210,65,316,345,65,65,65,65,65,65,65,65,85,276,57,163,58,135,182,186', +'59,345,70,184,114,163,85,289,294,316,135,135,182,186,46,136,136,65,65', +'65,65,65,102,102,102,102,102,102,102,45,276,102,102,102,102,102,102', +'102,102,70,114,102,102,102,102,102,102,102,102,102,102,102,102,102,102', +'102,102,102,102,102,102,102,102,102,102,30,280,102,60,102,276,73,102', +'102,102,102,102,102,102,102,112,112,112,184,112,112,112,289,294,112', +'112,112,112,112,112,112,112,257,260,330,33,42,48,280,107,102,102,102', +'102,102,30,257,330,330,42,80,175,107,311,361,137,137,80,260,84,112,87', +'112,260,175,112,112,112,112,112,112,112,112,187,187,187,48,187,187,187', +'33,30,187,187,187,187,187,187,187,187,311,361,207,419,139,139,80,331', +'112,112,112,112,112,211,304,207,133,419,284,380,331,331,89,211,48,284', +'33,304,187,98,187,100,380,187,187,187,187,187,187,187,187,191,191,191', +'80,191,191,191,382,411,191,191,191,191,191,191,191,191,144,144,101,382', +'411,109,284,110,187,187,187,187,187,133,133,133,133,133,133,133,133', +'133,133,5,111,5,332,332,191,113,191,333,333,191,191,191,191,191,191', +'191,191,192,192,192,284,192,192,192,300,301,192,192,192,192,192,192', +'192,192,300,301,115,302,317,410,5,414,191,191,191,191,191,302,317,410', +'417,414,116,429,119,431,435,66,140,66,417,141,192,429,192,431,435,192', +'192,192,192,192,192,192,192,296,296,296,5,296,296,296,443,142,296,296', +'296,296,296,296,296,296,443,49,49,49,334,334,66,49,192,192,192,192,192', +'74,74,74,335,335,143,74,138,138,138,138,151,69,336,336,296,158,296,337', +'337,296,296,296,296,296,296,296,296,375,375,375,66,375,375,375,340,340', +'375,375,375,375,375,375,375,375,338,338,338,338,161,162,69,165,296,296', +'296,296,296,339,339,339,339,177,188,200,201,203,204,212,213,167,216', +'217,375,263,375,264,267,375,375,375,375,375,375,375,375,376,376,376', +'69,376,376,376,270,274,376,376,376,376,376,376,376,376,303,324,325,341', +'167,342,167,343,375,375,375,375,375,344,351,354,356,362,363,367,369', +'389,390,400,402,403,407,427,376,,376,,,376,376,376,376,376,376,376,376', +'377,377,377,167,377,377,377,,,377,377,377,377,377,377,377,377,,,,,,', +',,376,376,376,376,376,,,,,,,,,,,,,,,,377,,377,,,377,377,377,377,377', +'377,377,377,415,415,415,,415,415,415,,,415,415,415,415,415,415,415,415', +',,,,,,,,377,377,377,377,377,,,,,,,,,,,,,,,,415,,415,,,415,415,415,415', +'415,415,415,415,418,418,418,,418,418,418,,,418,418,418,418,418,418,418', +'418,,,,,,,,,415,415,415,415,415,,,,,,,,,,,,,,,,418,,418,,,418,418,418', +'418,418,418,418,418,426,426,426,,426,426,426,,,426,426,426,426,426,426', +'426,426,,,,,,,,,418,418,418,418,418,,,,,,,,,,,,,,,,426,,426,,,426,426', +'426,426,426,426,426,426,430,430,430,,430,430,430,,,430,430,430,430,430', +'430,430,430,,,,,,,,,426,426,426,426,426,,,,,,,,,,,,,,,,430,,430,,,430', +'430,430,430,430,430,430,430,432,432,432,,432,432,432,,,432,432,432,432', +'432,432,432,432,,,,,,,,,430,430,430,430,430,,,,,,,,,,,,,,,,432,,432', +',,432,432,432,432,432,432,432,432,433,433,433,,433,433,433,,,433,433', +'433,433,433,433,433,433,,,,,,,,,432,432,432,432,432,,,,,,,,,,,,,,,,433', +',433,,,433,433,433,433,433,433,433,433,436,436,436,,436,436,436,,,436', +'436,436,436,436,436,436,436,,,,,,,,,433,433,433,433,433,,,,,,,,,,,,', +',,,436,,436,,,436,436,436,436,436,436,436,436,437,437,437,,437,437,437', +',,437,437,437,437,437,437,437,437,,,,,,,,,436,436,436,436,436,,,,,,', +',,,,,,,,,437,,437,,,437,437,437,437,437,437,437,437,444,444,444,,444', +'444,444,,,444,444,444,444,444,444,444,444,,,,,,,,,437,437,437,437,437', +',,,,,,,,,,,,,,,444,,444,,,444,444,444,444,444,444,444,444,445,445,445', +',445,445,445,,,445,445,445,445,445,445,445,445,,,,,,,,,444,444,444,444', +'444,,,,,,,,,,,,,,,,445,,445,,,445,445,445,445,445,445,445,445,447,447', +'447,,447,447,447,,,447,447,447,447,447,447,447,447,,,,,,,,,445,445,445', +'445,445,,,,,,,,,,,,,,,,447,,447,,,447,447,447,447,447,447,447,447,450', +'450,450,,450,450,450,,,450,450,450,450,450,450,450,450,,,,,,,,,447,447', +'447,447,447,,,,,,,,,,,,,,,,450,,450,,,450,450,450,450,450,450,450,450', +'454,454,454,,454,454,454,,,454,454,454,454,454,454,454,454,67,,,,67', +',,,450,450,450,450,450,,,,,,,122,,,,,,,,,454,,454,,,454,454,454,454', +'454,454,454,454,,,67,,,,,67,67,67,67,67,67,67,67,122,,,,,122,122,122', +'122,,454,454,454,454,454,120,,,,120,,,,,,67,67,67,67,67,154,,,,154,', +',120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120', +'120,,,,120,,120,,,120,120,120,120,120,120,120,120,154,,154,,,154,,154', +'154,154,154,154,154,154,154,,,,,,,,,,,120,120,120,120,120,220,,,,220', +',,,,,154,154,154,154,154,,,,,,,,220,220,220,220,220,220,220,220,220', +'220,220,220,220,220,220,220,220,220,,,,220,,220,,,220,220,220,220,220', +'220,220,220,,,,,,,,,224,,,,224,,,,,,,,,,,,,220,220,220,220,220,224,224', +'224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,,,,224', +',224,,,224,224,224,224,224,224,224,224,258,,,,258,,,,,,,,,315,,,,315', +',,,,,,,224,224,224,224,224,,,,,,,,,,,,,,258,,,,,258,258,258,258,258', +'258,258,258,315,,,,,315,315,315,315,315,315,315,315,347,347,,,347,,', +',,,,,258,258,258,258,258,384,,,,384,,,,315,315,315,315,315,,,,,,,,,', +',,347,,347,,,347,,347,347,347,347,347,347,347,347,,,384,,384,,,384,', +'384,384,384,384,384,384,384,384,393,,,,393,,,,347,347,347,347,347,,', +'439,439,,,439,,,,,,384,384,384,384,384,,,,,,,,,,,,,,393,,,,,393,393', +'393,393,393,393,393,393,439,,439,,117,439,117,439,439,439,439,439,439', +'439,439,,,,,,,,,,,393,393,393,393,393,,,,,,,,,,,439,439,439,439,439', +'117,,,,,117,117,117,117,117,117,117,117,,,,,,,,,,,,,,,,202,,202,,,,', +',,,117,117,117,117,117,202,202,202,202,202,202,202,202,202,202,202,202', +'202,202,202,202,202,202,202,202,202,202,202,202,,,202,,202,,,202,202', +'202,202,202,202,202,202,305,,305,,,,,,,,,,,306,,306,,,,,,,,,,202,202', +'202,202,202,,,,,,,,,,,,305,,,,,305,305,305,305,305,305,305,305,306,', +'379,,379,306,306,306,306,306,306,306,306,,,,,,,,,,,,,305,305,305,305', +'305,,,,,,,,,306,306,306,306,306,379,,,,,379,379,379,379,379,379,379', +'379,71,,,,,,,,,,,,,99,,71,,,,,,,,,,379,379,379,379,379,,,,71,71,71,', +',71,71,,,,,71,71,71,71,71,71,71,71,99,,,,123,99,99,99,99,99,99,99,99', +',,,,124,,,,,,,,71,71,71,71,71,,,,,,,,,99,99,99,99,99,123,,,,,123,123', +'123,123,123,123,123,123,124,,,,125,124,124,124,124,124,124,124,124,', +',,,126,,,,,,,,123,123,123,123,123,,,,,,,,,124,124,124,124,124,125,,', +',,125,125,125,125,125,125,125,125,126,,,,,126,126,126,126,126,126,126', +'126,,,157,,,,,,,,,,125,125,125,125,125,157,,,,160,,,,126,126,126,126', +'126,,,,,,157,157,157,,,157,157,,,,178,157,157,157,157,157,157,157,157', +'160,160,160,,,,160,,,,185,160,160,160,160,160,160,160,160,,,,,,,157', +'157,157,157,157,178,,,,196,178,178,178,178,178,178,178,178,,160,160', +'160,160,160,185,,,,197,185,185,185,185,185,185,185,185,,,,,,,178,178', +'178,178,178,196,,,,198,196,196,196,196,196,196,196,196,,185,185,185', +'185,185,197,,,,199,197,197,197,197,197,197,197,197,,,,,,,196,196,196', +'196,196,198,,,,214,198,198,198,198,198,198,198,198,,197,197,197,197', +'197,199,,,,,199,199,199,199,199,199,199,199,,,,,,,198,198,198,198,198', +'214,,,,,214,214,214,214,214,214,214,214,,199,199,199,199,199,,,,,,,215', +'215,,,,,,,,,,,,214,214,214,214,214,215,215,215,215,215,215,215,215,215', +'215,215,215,215,215,215,215,215,215,,,,215,,215,,226,215,215,215,215', +'215,215,215,215,,,,,238,,,,,,,,,,,,,,,,,,,,,215,215,215,215,215,226', +',,,,226,226,226,226,226,226,226,226,238,,,,239,238,238,238,238,238,238', +'238,238,,,,,240,,,,,,,,226,226,226,226,226,,,,,,,,,238,238,238,238,238', +'239,,,,,239,239,239,239,239,239,239,239,240,,,,241,240,240,240,240,240', +'240,240,240,,,,,242,,,,,,,,239,239,239,239,239,,,,,,,,,240,240,240,240', +'240,241,,,,,241,241,241,241,241,241,241,241,242,,,,243,242,242,242,242', +'242,242,242,242,,,,,244,,,,,,,,241,241,241,241,241,,,,,,,,,242,242,242', +'242,242,243,,,,,243,243,243,243,243,243,243,243,244,,,,245,244,244,244', +'244,244,244,244,244,,,,,246,,,,,,,,243,243,243,243,243,,,,,,,,,244,244', +'244,244,244,245,,,,,245,245,245,245,245,245,245,245,246,,,,247,246,246', +'246,246,246,246,246,246,,,,,248,,,,,,,,245,245,245,245,245,,,,,,,,,246', +'246,246,246,246,247,,,,,247,247,247,247,247,247,247,247,248,,,,249,248', +'248,248,248,248,248,248,248,,,,,250,,,,,,,,247,247,247,247,247,,,,,', +',,,248,248,248,248,248,249,,,,,249,249,249,249,249,249,249,249,250,', +',,251,250,250,250,250,250,250,250,250,,,,,252,,,,,,,,249,249,249,249', +'249,,,,,,,,,250,250,250,250,250,251,,,,,251,251,251,251,251,251,251', +'251,252,,,,253,252,252,252,252,252,252,252,252,,,,,254,,,,,,,,251,251', +'251,251,251,,,,,,,,,252,252,252,252,252,253,,,,,253,253,253,253,253', +'253,253,253,254,,,,255,254,254,254,254,254,254,254,254,,,,,256,,,,,', +',,253,253,253,253,253,,,,,,,,,254,254,254,254,254,255,,,,,255,255,255', +'255,255,255,255,255,256,,,,262,256,256,256,256,256,256,256,256,,,,,266', +',,,,,,,255,255,255,255,255,,,,,,,,,256,256,256,256,256,262,,,,,262,262', +'262,262,262,262,262,262,266,,,,,266,266,266,266,266,266,266,266,269', +',,,,,,,,,,,262,262,262,262,262,281,,,,,,,,266,266,266,266,266,,,,269', +'269,269,,,,269,,,,,269,269,269,269,269,269,269,269,,,,281,281,,,,285', +'281,281,281,281,281,281,281,281,,,,,,365,,,269,269,269,269,269,,,,,', +',,,,,,,281,281,281,281,281,285,,,,,285,285,285,285,285,285,285,285,365', +'365,,,,378,365,365,365,365,365,365,365,365,,,,,381,381,,,,,,285,285', +'285,285,285,,,,,,,,,,365,365,365,365,365,378,,,,,378,378,378,378,378', +'378,378,378,381,,,,,381,381,381,381,381,381,381,381,383,383,,,,,,,,', +',,378,378,378,378,378,,,,,,,,,381,381,381,381,381,,,,,,,,,,383,,,,,383', +'383,383,383,383,383,383,383,,,,,,,,,,,,,388,,,,,,,,,,,,,383,383,383', +'383,383,388,388,388,388,388,388,388,388,388,388,388,388,388,388,388', +'388,388,388,,,,388,,388,,391,388,388,388,388,388,388,388,388,,,,,412', +'412,,,,,,,,,,,,,,,,,,,,388,388,388,388,388,391,,,,,391,391,391,391,391', +'391,391,391,412,,,,,412,412,412,412,412,412,412,412,413,413,,,,,,,,', +',,391,391,391,391,391,416,416,,,,,,,412,412,412,412,412,,,,,,,,,,413', +',,,,413,413,413,413,413,413,413,413,,,,,416,,,,,416,416,416,416,416', +'416,416,416,428,428,,,,,,,413,413,413,413,413,,,,,,,,,,,,,416,416,416', +'416,416,,,,,,,,,,428,,,,,428,428,428,428,428,428,428,428,,,,,,,,,,,', +',,,,,,277,277,,,,,,,428,428,428,428,428,277,277,277,277,277,277,277', +'277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277', +'277,72,277,,277,,,,,,,,,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72', +'72,72,72,72,72,72,72,72,72,,,,277,72,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,', +',,,,,72,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,41,,,,1,,,,', +',,,,,,,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41', +'41,41,41,41,62,,,,41,,,,,,,,,,,,,62,62,62,62,62,62,62,62,62,62,62,62', +'62,62,62,62,62,62,62,62,62,62,62,62,78,,,,62,,,,,,,,,,,,,,,,,78,78,78', +'78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,172,,,,,78,,,,,,,,,,,,', +',,,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172', +'172,181,,,,,172,,,,,,,,,,,,,,,,181,181,181,181,181,181,181,181,181,181', +'181,181,181,181,181,181,181,181,312,312,,,,181,,,,,,,,312,312,312,312', +'312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312', +'312,312,312,312,366,312,,312,,,,,,,,,366,366,366,366,366,366,366,366', +'366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,,,,', +'366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,0,6,6,6,6,6', +'6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,,,,,6,7,7,7,7,7,7,7,7,7,7,7,7', +'7,7,7,7,7,7,7,7,7,7,7,7,,,,,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8', +'8,8,8,8,8,,,,,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,,,,', +'9,275,275,275,275,275,275,275,275,275,275,275,275,275,275,275,275,275', +'275,275,275,275,275,275,275,,,,275,275,56,56,56,56,56,56,56,56,56,56', +'56,56,56,56,56,56,56,56,,,,,,56,77,77,77,77,77,77,77,77,77,77,77,77', +'77,77,77,77,77,77,,,,,,77,81,81,81,81,81,81,81,81,81,81,81,81,81,81', +'81,81,81,81,,,,,,81,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82', +'82,82,,,,,,82,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83', +',,,,,83' ] + racc_action_check = arr = ::Array.new(4321, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 4005, 3703, nil, nil, nil, 295, 4034, 4063, 4092, 4121, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 126, nil, nil, 161, nil, nil, nil, nil, nil, 8, + nil, 3744, 160, nil, nil, 9, 34, nil, 159, 354, + nil, nil, nil, nil, nil, 12, 4174, 55, 57, -20, + 129, nil, 3785, nil, nil, -3, 353, 1318, nil, 411, + 59, 2026, 3638, 127, 366, nil, nil, 4198, 3825, nil, + 179, 4222, 4246, 4270, 104, 52, nil, 171, nil, 157, + nil, nil, nil, nil, nil, nil, nil, nil, 248, 2039, + 250, 279, 85, nil, nil, nil, nil, 163, nil, 275, + 277, 294, 143, 299, 20, 332, 348, 1795, nil, 267, + 1389, nil, 1333, 2082, 2095, 2138, 2151, nil, nil, nil, + nil, nil, nil, 216, nil, 15, 24, 123, 350, 156, + 305, 293, 314, 340, 205, nil, nil, nil, nil, nil, + nil, 398, nil, nil, 1404, nil, nil, 2205, 377, nil, + 2224, 410, 448, 51, nil, 440, nil, 469, nil, nil, + nil, nil, 3864, nil, nil, 175, nil, 468, 2248, nil, + nil, 3903, 58, nil, 63, 2267, 59, 201, 469, nil, + nil, 259, 317, nil, nil, nil, 2291, 2310, 2334, 2353, + 470, 460, 1864, 467, 468, nil, nil, 216, nil, nil, + -2, 224, 466, 467, 2377, 2441, 393, 394, nil, nil, + 1475, nil, nil, nil, 1539, nil, 2484, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 2497, 2540, + 2553, 2596, 2609, 2652, 2665, 2708, 2721, 2764, 2777, 2820, + 2833, 2876, 2889, 2932, 2945, 2988, 3001, 157, 1595, nil, + 143, nil, 3044, 396, 437, nil, 3057, 438, nil, 3109, + 454, nil, nil, nil, 416, 4150, 50, 3601, nil, nil, + 123, 3126, nil, nil, 237, 3169, nil, nil, nil, 67, + nil, nil, nil, nil, 68, nil, 375, nil, nil, nil, + 317, 318, 330, 502, 228, 1918, 1931, nil, nil, nil, + nil, 175, 3939, nil, nil, 1608, 28, 331, nil, nil, + nil, nil, nil, nil, 502, 503, nil, nil, nil, nil, + 117, 180, 248, 253, 336, 348, 358, 363, 388, 401, + 374, 458, 445, 446, 451, 47, nil, 1664, nil, nil, + nil, 478, nil, nil, 479, nil, 480, nil, nil, nil, + nil, 176, 518, 519, nil, 3183, 3976, 483, nil, 484, + nil, nil, nil, nil, nil, 433, 491, 549, 3226, 1974, + 233, 3239, 262, 3291, 1681, nil, nil, nil, 3355, 527, + 528, 3398, nil, 1737, nil, nil, nil, nil, nil, nil, + 487, nil, 488, 526, nil, nil, nil, 526, nil, nil, + 332, 263, 3411, 3463, 334, 607, 3480, 343, 665, 218, + nil, nil, nil, nil, nil, nil, 723, 531, 3532, 346, + 781, 348, 839, 897, nil, 349, 955, 1013, nil, 1752, + nil, nil, nil, 375, 1071, 1129, nil, 1187, nil, nil, + 1245, nil, nil, nil, 1303, nil, nil, nil, nil, nil ] + +racc_action_default = [ + -265, -265, -1, -3, -4, -265, -53, -55, -57, -59, + -64, -65, -66, -67, -68, -69, -70, -71, -72, -73, + -74, -75, -76, -77, -78, -79, -80, -81, -82, -83, + -265, -89, -90, -265, -115, -116, -117, -118, -166, -265, + -2, -62, -265, -51, -60, -265, -120, -121, -265, -136, + -258, -52, -54, -56, -58, -86, -265, -88, -107, -265, + -110, 460, -265, -6, -7, -265, -265, -265, -50, -265, + -119, -265, -265, -265, -135, -138, -139, -265, -265, -91, + -265, -95, -97, -265, -265, -265, -111, -113, -262, -265, + -5, -8, -9, -10, -11, -12, -13, -14, -179, -265, + -265, -83, -265, -20, -21, -23, -24, -265, -26, -265, + -265, -265, -265, -265, -265, -265, -265, -265, -180, -181, + -265, -184, -198, -265, -265, -265, -265, -204, -205, -206, + -207, -208, -209, -210, -212, -216, -219, -222, -227, -230, + -232, -234, -236, -238, -240, -242, -255, -259, -260, -261, + -264, -62, -63, -167, -265, -179, -61, -265, -265, -126, + -265, -205, -265, -265, -134, -141, -143, -147, -148, -122, + -137, -140, -265, -85, -92, -265, -98, -100, -265, -94, + -96, -265, -265, -104, -265, -265, -265, -265, -265, -210, + -257, -265, -265, -19, -22, -25, -265, -265, -265, -265, + -265, -265, -265, -265, -265, -45, -46, -265, -48, -263, + -151, -265, -265, -265, -265, -265, -265, -265, -190, -191, + -265, -199, -200, -201, -265, -202, -265, -244, -245, -246, + -247, -248, -249, -250, -251, -252, -253, -254, -265, -265, + -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, + -265, -265, -265, -265, -265, -265, -265, -265, -265, -171, + -265, -175, -265, -265, -265, -124, -265, -205, -125, -265, + -265, -131, -132, -133, -265, -265, -152, -265, -145, -146, + -154, -265, -84, -93, -265, -265, -102, -87, -103, -265, + -106, -112, -114, -108, -265, -15, -265, -17, -18, -256, + -265, -265, -265, -265, -265, -265, -265, -44, -49, -47, + -150, -152, -265, -182, -183, -265, -265, -265, -187, -194, + -196, -197, -188, -189, -265, -265, -243, -213, -214, -215, + -217, -218, -220, -221, -223, -224, -225, -226, -228, -229, + -231, -233, -235, -237, -239, -265, -168, -265, -170, -174, + -176, -265, -178, -123, -265, -130, -265, -128, -149, -142, + -144, -153, -265, -265, -165, -265, -265, -265, -159, -205, + -99, -101, -105, -109, -16, -265, -265, -265, -265, -265, + -265, -265, -265, -265, -265, -211, -185, -186, -265, -265, + -203, -265, -169, -265, -173, -177, -129, -127, -155, -164, + -265, -157, -205, -265, -163, -158, -161, -27, -29, -30, + -265, -265, -265, -265, -265, -265, -265, -265, -265, -265, + -195, -241, -172, -156, -160, -162, -265, -265, -265, -265, + -265, -265, -265, -265, -39, -265, -265, -265, -43, -265, + -192, -28, -31, -265, -265, -265, -35, -265, -37, -38, + -265, -41, -42, -193, -265, -33, -34, -36, -40, -32 ] + +racc_goto_table = [ + 47, 152, 57, 162, 75, 60, 70, 319, 153, 5, + 5, 257, 158, 176, 174, 51, 52, 53, 54, 76, + 393, 291, 279, 361, 74, 55, 82, 1, 58, 170, + 62, 104, 179, 180, 190, 223, 63, 101, 102, 41, + 47, 76, 188, 47, 171, 64, 157, 82, 82, 78, + 156, 82, 82, 82, 213, 85, 175, 90, 361, 163, + 98, 47, 2, 40, 47, 310, 91, 168, 194, 105, + 172, 210, 330, 331, 101, 47, 181, 332, 333, 360, + 182, 167, 338, 339, 200, 186, 204, 350, 317, 340, + 82, 334, 335, 336, 337, 153, 341, 98, 264, 342, + 151, 270, 343, 151, 344, 226, 105, 98, 174, 203, + nil, nil, 393, 190, 177, 212, nil, 174, nil, 81, + 190, 286, 276, nil, nil, nil, 291, 171, 292, nil, + 76, 291, nil, nil, nil, 269, nil, 299, nil, nil, + 81, 81, 82, nil, 81, 81, 81, nil, 327, 328, + 329, 82, nil, nil, 324, nil, 320, nil, 325, 200, + nil, nil, 47, 200, 200, 311, 210, 326, nil, nil, + 201, 210, nil, nil, nil, 210, nil, nil, nil, nil, + 420, nil, 98, 81, nil, 82, 98, 98, nil, nil, + 82, nil, 348, nil, 82, nil, nil, 190, nil, 153, + nil, 278, nil, nil, nil, 351, 306, 354, nil, nil, + 356, 322, 323, nil, nil, 212, nil, 370, nil, 212, + 190, nil, 367, nil, nil, 385, nil, nil, 371, nil, + nil, nil, 276, nil, nil, 81, nil, 70, nil, 171, + nil, 419, nil, nil, 81, 295, nil, nil, nil, 297, + 298, nil, nil, nil, nil, nil, nil, nil, 352, nil, + nil, nil, nil, nil, nil, nil, nil, 311, 200, 358, + nil, 47, 47, nil, nil, nil, nil, nil, 81, 47, + nil, 394, nil, 81, 167, nil, 167, 81, 153, nil, + nil, 98, nil, nil, nil, nil, nil, 403, nil, nil, + nil, nil, nil, nil, 207, nil, 400, 211, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 177, nil, + nil, 167, nil, nil, nil, 153, 421, 422, nil, 320, + nil, nil, nil, nil, 153, nil, nil, nil, nil, 210, + nil, nil, nil, nil, nil, nil, nil, 200, 200, 200, + nil, nil, nil, nil, 374, nil, nil, nil, 82, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 98, 98, 98, 394, nil, 167, nil, nil, nil, nil, + 153, nil, nil, nil, 300, 301, 302, 200, nil, 304, + 200, nil, nil, nil, nil, nil, nil, nil, 200, nil, + nil, 316, 200, nil, 200, 200, nil, 211, 200, 200, + 98, 211, nil, 98, nil, nil, 200, 200, nil, 200, + nil, 98, 200, nil, nil, 98, 200, 98, 98, nil, + nil, 98, 98, 407, 408, 409, nil, nil, 189, 98, + 98, nil, 98, 345, nil, 98, nil, nil, nil, 98, + nil, 81, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 221, 222, 189, 225, nil, nil, nil, nil, + nil, nil, nil, 434, nil, nil, 438, nil, nil, nil, + nil, nil, nil, nil, 441, nil, nil, nil, 446, nil, + 448, 449, 380, 382, 451, 452, nil, nil, nil, nil, + nil, nil, 455, 456, nil, 457, nil, nil, 458, nil, + nil, nil, 459, nil, nil, nil, nil, 189, nil, nil, + nil, nil, nil, nil, 189, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 410, 411, nil, 414, nil, + 417, nil, nil, nil, nil, nil, nil, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, nil, nil, nil, nil, 429, + 431, 189, nil, 435, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 443, nil, nil, nil, nil, + nil, nil, nil, nil, 189, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 189, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 189 ] + +racc_goto_check = [ + 15, 27, 17, 43, 39, 17, 40, 59, 42, 5, + 5, 50, 42, 35, 32, 5, 5, 5, 5, 24, + 51, 37, 47, 49, 41, 15, 24, 1, 15, 39, + 7, 19, 33, 33, 73, 62, 8, 17, 18, 6, + 15, 24, 16, 15, 24, 4, 41, 24, 24, 31, + 26, 24, 24, 24, 48, 36, 34, 8, 49, 44, + 15, 15, 2, 2, 15, 47, 4, 15, 19, 4, + 31, 33, 63, 63, 17, 15, 31, 64, 64, 46, + 36, 5, 66, 66, 17, 36, 17, 53, 58, 67, + 24, 65, 65, 65, 65, 42, 68, 15, 42, 69, + 6, 42, 70, 6, 71, 74, 4, 15, 32, 15, + nil, nil, 51, 73, 6, 8, nil, 32, nil, 23, + 73, 16, 39, nil, nil, nil, 37, 24, 16, nil, + 24, 37, nil, nil, nil, 41, nil, 42, nil, nil, + 23, 23, 24, nil, 23, 23, 23, nil, 62, 62, + 62, 24, nil, nil, 48, nil, 42, nil, 48, 17, + nil, nil, 15, 17, 17, 39, 33, 42, nil, nil, + 9, 33, nil, nil, nil, 33, nil, nil, nil, nil, + 59, nil, 15, 23, nil, 24, 15, 15, nil, nil, + 24, nil, 27, nil, 24, nil, nil, 73, nil, 42, + nil, 6, nil, nil, nil, 16, 4, 42, nil, nil, + 42, 15, 15, nil, nil, 8, nil, 35, nil, 8, + 73, nil, 42, nil, nil, 62, nil, nil, 16, nil, + nil, nil, 39, nil, nil, 23, nil, 40, nil, 24, + nil, 50, nil, nil, 23, 9, nil, nil, nil, 9, + 9, nil, nil, nil, nil, nil, nil, nil, 15, nil, + nil, nil, nil, nil, nil, nil, nil, 39, 17, 15, + nil, 15, 15, nil, nil, nil, nil, nil, 23, 15, + nil, 27, nil, 23, 5, nil, 5, 23, 42, nil, + nil, 15, nil, nil, nil, nil, nil, 43, nil, nil, + nil, nil, nil, nil, 20, nil, 42, 20, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 6, nil, + nil, 5, nil, nil, nil, 42, 73, 27, nil, 42, + nil, nil, nil, nil, 42, nil, nil, nil, nil, 33, + nil, nil, nil, nil, nil, nil, nil, 17, 17, 17, + nil, nil, nil, nil, 9, nil, nil, nil, 24, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 15, 15, 15, 27, nil, 5, nil, nil, nil, nil, + 42, nil, nil, nil, 20, 20, 20, 17, nil, 20, + 17, nil, nil, nil, nil, nil, nil, nil, 17, nil, + nil, 20, 17, nil, 17, 17, nil, 20, 17, 17, + 15, 20, nil, 15, nil, nil, 17, 17, nil, 17, + nil, 15, 17, nil, nil, 15, 17, 15, 15, nil, + nil, 15, 15, 9, 9, 9, nil, nil, 60, 15, + 15, nil, 15, 20, nil, 15, nil, nil, nil, 15, + nil, 23, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 60, 60, 60, 60, nil, nil, nil, nil, + nil, nil, nil, 9, nil, nil, 9, nil, nil, nil, + nil, nil, nil, nil, 9, nil, nil, nil, 9, nil, + 9, 9, 20, 20, 9, 9, nil, nil, nil, nil, + nil, nil, 9, 9, nil, 9, nil, nil, 9, nil, + nil, nil, 9, nil, nil, nil, nil, 60, nil, nil, + nil, nil, nil, nil, 60, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 20, 20, nil, 20, nil, + 20, nil, nil, nil, nil, nil, nil, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, nil, nil, nil, nil, 20, + 20, 60, nil, 20, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 20, nil, nil, nil, nil, + nil, nil, nil, nil, 60, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 60, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 60 ] + +racc_goto_pointer = [ + nil, 27, 62, nil, 4, 9, 34, -11, -5, 58, + nil, nil, nil, nil, nil, -5, -57, -28, -27, -34, + 187, nil, nil, 63, -30, nil, -19, -66, nil, nil, + nil, -7, -64, -49, -24, -67, -4, -163, nil, -45, + -39, -25, -59, -69, -13, nil, -196, -145, -66, -253, + -143, -327, nil, -173, nil, nil, nil, nil, -127, -208, + 339, nil, -90, -169, -166, -154, -167, -162, -156, -154, + -152, -151, nil, -65, -28 ] + +racc_goto_default = [ + nil, nil, nil, 3, 4, 66, 73, nil, 93, 106, + 92, 94, 95, 96, 97, 155, nil, 29, nil, nil, + 107, 42, 6, 7, 8, 9, 44, 259, 27, 28, + 30, nil, 79, 80, nil, nil, nil, 86, 87, 45, + 46, nil, 146, 363, nil, 165, 166, 362, 321, 280, + nil, 258, 260, 261, 121, 118, 119, 122, nil, nil, + 133, 125, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, nil ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 92, :_reduce_1, + 2, 92, :_reduce_2, + 1, 93, :_reduce_3, + 1, 93, :_reduce_4, + 4, 94, :_reduce_5, + 3, 94, :_reduce_6, + 1, 98, :_reduce_7, + 2, 98, :_reduce_8, + 1, 100, :_reduce_9, + 1, 100, :_reduce_10, + 1, 100, :_reduce_11, + 1, 100, :_reduce_12, + 1, 100, :_reduce_13, + 1, 100, :_reduce_14, + 3, 101, :_reduce_15, + 4, 101, :_reduce_16, + 3, 101, :_reduce_17, + 3, 101, :_reduce_18, + 3, 99, :_reduce_19, + 2, 99, :_reduce_20, + 1, 109, :_reduce_21, + 2, 109, :_reduce_22, + 1, 110, :_reduce_23, + 1, 110, :_reduce_24, + 2, 102, :_reduce_25, + 1, 102, :_reduce_26, + 5, 103, :_reduce_27, + 7, 103, :_reduce_28, + 5, 103, :_reduce_29, + 5, 104, :_reduce_30, + 7, 104, :_reduce_31, + 9, 104, :_reduce_32, + 8, 104, :_reduce_33, + 8, 104, :_reduce_34, + 7, 104, :_reduce_35, + 8, 104, :_reduce_36, + 7, 104, :_reduce_37, + 7, 104, :_reduce_38, + 6, 104, :_reduce_39, + 8, 104, :_reduce_40, + 7, 104, :_reduce_41, + 7, 104, :_reduce_42, + 6, 104, :_reduce_43, + 3, 105, :_reduce_44, + 2, 105, :_reduce_45, + 2, 105, :_reduce_46, + 3, 105, :_reduce_47, + 2, 105, :_reduce_48, + 3, 105, :_reduce_49, + 3, 95, :_reduce_50, + 2, 95, :_reduce_51, + 2, 96, :_reduce_52, + 1, 96, :_reduce_53, + 2, 96, :_reduce_54, + 1, 96, :_reduce_55, + 2, 96, :_reduce_56, + 1, 96, :_reduce_57, + 2, 96, :_reduce_58, + 1, 96, :_reduce_59, + 1, 112, :_reduce_60, + 3, 112, :_reduce_61, + 1, 117, :_reduce_62, + 3, 117, :_reduce_63, + 1, 113, :_reduce_64, + 1, 113, :_reduce_65, + 1, 113, :_reduce_66, + 1, 113, :_reduce_67, + 1, 113, :_reduce_68, + 1, 114, :_reduce_69, + 1, 114, :_reduce_70, + 1, 114, :_reduce_71, + 1, 114, :_reduce_72, + 1, 114, :_reduce_73, + 1, 114, :_reduce_74, + 1, 114, :_reduce_75, + 1, 114, :_reduce_76, + 1, 114, :_reduce_77, + 1, 114, :_reduce_78, + 1, 114, :_reduce_79, + 1, 114, :_reduce_80, + 1, 114, :_reduce_81, + 1, 114, :_reduce_82, + 1, 114, :_reduce_83, + 5, 119, :_reduce_84, + 4, 119, :_reduce_85, + 2, 119, :_reduce_86, + 5, 119, :_reduce_87, + 2, 119, :_reduce_88, + 1, 121, :_reduce_89, + 1, 121, :_reduce_90, + 1, 122, :_reduce_91, + 2, 122, :_reduce_92, + 3, 123, :_reduce_93, + 2, 124, :_reduce_94, + 1, 124, :_reduce_95, + 2, 124, :_reduce_96, + 1, 124, :_reduce_97, + 1, 125, :_reduce_98, + 3, 125, :_reduce_99, + 1, 126, :_reduce_100, + 3, 126, :_reduce_101, + 2, 126, :_reduce_102, + 5, 120, :_reduce_103, + 4, 120, :_reduce_104, + 6, 120, :_reduce_105, + 5, 120, :_reduce_106, + 2, 120, :_reduce_107, + 5, 120, :_reduce_108, + 6, 120, :_reduce_109, + 2, 120, :_reduce_110, + 1, 127, :_reduce_111, + 3, 127, :_reduce_112, + 1, 128, :_reduce_113, + 3, 128, :_reduce_114, + 1, 115, :_reduce_115, + 1, 115, :_reduce_116, + 1, 115, :_reduce_117, + 1, 116, :_reduce_118, + 2, 97, :_reduce_119, + 1, 97, :_reduce_120, + 1, 131, :_reduce_121, + 3, 131, :_reduce_122, + 5, 131, :_reduce_123, + 4, 131, :_reduce_124, + 4, 131, :_reduce_125, + 3, 131, :_reduce_126, + 6, 131, :_reduce_127, + 5, 131, :_reduce_128, + 6, 131, :_reduce_129, + 5, 131, :_reduce_130, + 4, 131, :_reduce_131, + 4, 131, :_reduce_132, + 4, 131, :_reduce_133, + 3, 131, :_reduce_134, + 2, 130, :_reduce_135, + 1, 130, :_reduce_136, + 3, 130, :_reduce_137, + 2, 130, :_reduce_138, + 1, 132, :_reduce_139, + 2, 132, :_reduce_140, + 1, 134, :_reduce_141, + 3, 134, :_reduce_142, + 1, 136, :_reduce_143, + 3, 136, :_reduce_144, + 2, 137, :_reduce_145, + 2, 137, :_reduce_146, + 1, 137, :_reduce_147, + 1, 135, :_reduce_148, + 3, 135, :_reduce_149, + 2, 139, :_reduce_150, + 1, 139, :_reduce_151, + 1, 138, :_reduce_152, + 2, 138, :_reduce_153, + 1, 138, :_reduce_154, + 3, 140, :_reduce_155, + 4, 140, :_reduce_156, + 3, 140, :_reduce_157, + 3, 140, :_reduce_158, + 2, 140, :_reduce_159, + 4, 140, :_reduce_160, + 3, 140, :_reduce_161, + 4, 140, :_reduce_162, + 3, 140, :_reduce_163, + 3, 140, :_reduce_164, + 2, 140, :_reduce_165, + 1, 108, :_reduce_166, + 1, 118, :_reduce_167, + 3, 118, :_reduce_168, + 4, 118, :_reduce_169, + 2, 141, :_reduce_170, + 1, 141, :_reduce_171, + 4, 141, :_reduce_172, + 3, 141, :_reduce_173, + 2, 142, :_reduce_174, + 1, 143, :_reduce_175, + 2, 143, :_reduce_176, + 3, 144, :_reduce_177, + 2, 144, :_reduce_178, + 1, 145, :_reduce_179, + 1, 145, :_reduce_180, + 1, 145, :_reduce_181, + 3, 145, :_reduce_182, + 3, 145, :_reduce_183, + 1, 148, :_reduce_184, + 4, 148, :_reduce_185, + 4, 148, :_reduce_186, + 3, 148, :_reduce_187, + 3, 148, :_reduce_188, + 3, 148, :_reduce_189, + 2, 148, :_reduce_190, + 2, 148, :_reduce_191, + 6, 148, :_reduce_192, + 7, 148, :_reduce_193, + 1, 149, :_reduce_194, + 3, 149, :_reduce_195, + 1, 150, :_reduce_196, + 1, 150, :_reduce_197, + 1, 151, :_reduce_198, + 2, 151, :_reduce_199, + 2, 151, :_reduce_200, + 2, 151, :_reduce_201, + 2, 151, :_reduce_202, + 4, 151, :_reduce_203, + 1, 152, :_reduce_204, + 1, 152, :_reduce_205, + 1, 152, :_reduce_206, + 1, 152, :_reduce_207, + 1, 152, :_reduce_208, + 1, 152, :_reduce_209, + 1, 153, :_reduce_210, + 4, 153, :_reduce_211, + 1, 154, :_reduce_212, + 3, 154, :_reduce_213, + 3, 154, :_reduce_214, + 3, 154, :_reduce_215, + 1, 155, :_reduce_216, + 3, 155, :_reduce_217, + 3, 155, :_reduce_218, + 1, 156, :_reduce_219, + 3, 156, :_reduce_220, + 3, 156, :_reduce_221, + 1, 157, :_reduce_222, + 3, 157, :_reduce_223, + 3, 157, :_reduce_224, + 3, 157, :_reduce_225, + 3, 157, :_reduce_226, + 1, 158, :_reduce_227, + 3, 158, :_reduce_228, + 3, 158, :_reduce_229, + 1, 159, :_reduce_230, + 3, 159, :_reduce_231, + 1, 160, :_reduce_232, + 3, 160, :_reduce_233, + 1, 161, :_reduce_234, + 3, 161, :_reduce_235, + 1, 162, :_reduce_236, + 3, 162, :_reduce_237, + 1, 163, :_reduce_238, + 3, 163, :_reduce_239, + 1, 164, :_reduce_240, + 5, 164, :_reduce_241, + 1, 133, :_reduce_242, + 3, 133, :_reduce_243, + 1, 165, :_reduce_244, + 1, 165, :_reduce_245, + 1, 165, :_reduce_246, + 1, 165, :_reduce_247, + 1, 165, :_reduce_248, + 1, 165, :_reduce_249, + 1, 165, :_reduce_250, + 1, 165, :_reduce_251, + 1, 165, :_reduce_252, + 1, 165, :_reduce_253, + 1, 165, :_reduce_254, + 1, 111, :_reduce_255, + 3, 111, :_reduce_256, + 1, 107, :_reduce_257, + 1, 106, :_reduce_258, + 1, 146, :_reduce_259, + 1, 146, :_reduce_260, + 1, 146, :_reduce_261, + 1, 129, :_reduce_262, + 2, 147, :_reduce_263, + 1, 147, :_reduce_264 ] + +racc_reduce_n = 265 + +racc_shift_n = 460 + +racc_token_table = { + false => 0, + :error => 1, + :COLON => 2, + :CASE => 3, + :DEFAULT => 4, + :LBRACE => 5, + :RBRACE => 6, + :SEMICOLON => 7, + :IF => 8, + :LPAREN => 9, + :RPAREN => 10, + :ELSE => 11, + :SWITCH => 12, + :WHILE => 13, + :DO => 14, + :FOR => 15, + :GOTO => 16, + :CONTINUE => 17, + :BREAK => 18, + :RETURN => 19, + :COMMA => 20, + :EQ => 21, + :TYPEDEF => 22, + :EXTERN => 23, + :STATIC => 24, + :AUTO => 25, + :REGISTER => 26, + :VOID => 27, + :CHAR => 28, + :SHORT => 29, + :INT => 30, + :LONG => 31, + :FLOAT => 32, + :DOUBLE => 33, + :SIGNED => 34, + :UNSIGNED => 35, + :BOOL => 36, + :COMPLEX => 37, + :IMAGINARY => 38, + :STRUCT => 39, + :UNION => 40, + :ENUM => 41, + :CONST => 42, + :RESTRICT => 43, + :VOLATILE => 44, + :INLINE => 45, + :LBRACKET => 46, + :RBRACKET => 47, + :MUL => 48, + :ELLIPSIS => 49, + :TYPENAME => 50, + :DOT => 51, + :ARROW => 52, + :INC => 53, + :DEC => 54, + :SIZEOF => 55, + :AND => 56, + :ADD => 57, + :SUB => 58, + :NOT => 59, + :BANG => 60, + :DIV => 61, + :MOD => 62, + :LSHIFT => 63, + :RSHIFT => 64, + :LT => 65, + :GT => 66, + :LEQ => 67, + :GEQ => 68, + :EQEQ => 69, + :NEQ => 70, + :XOR => 71, + :OR => 72, + :ANDAND => 73, + :OROR => 74, + :QUESTION => 75, + :MULEQ => 76, + :DIVEQ => 77, + :MODEQ => 78, + :ADDEQ => 79, + :SUBEQ => 80, + :LSHIFTEQ => 81, + :RSHIFTEQ => 82, + :ANDEQ => 83, + :XOREQ => 84, + :OREQ => 85, + :ID => 86, + :ICON => 87, + :FCON => 88, + :CCON => 89, + :SCON => 90 } + +racc_nt_base = 91 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "COLON", + "CASE", + "DEFAULT", + "LBRACE", + "RBRACE", + "SEMICOLON", + "IF", + "LPAREN", + "RPAREN", + "ELSE", + "SWITCH", + "WHILE", + "DO", + "FOR", + "GOTO", + "CONTINUE", + "BREAK", + "RETURN", + "COMMA", + "EQ", + "TYPEDEF", + "EXTERN", + "STATIC", + "AUTO", + "REGISTER", + "VOID", + "CHAR", + "SHORT", + "INT", + "LONG", + "FLOAT", + "DOUBLE", + "SIGNED", + "UNSIGNED", + "BOOL", + "COMPLEX", + "IMAGINARY", + "STRUCT", + "UNION", + "ENUM", + "CONST", + "RESTRICT", + "VOLATILE", + "INLINE", + "LBRACKET", + "RBRACKET", + "MUL", + "ELLIPSIS", + "TYPENAME", + "DOT", + "ARROW", + "INC", + "DEC", + "SIZEOF", + "AND", + "ADD", + "SUB", + "NOT", + "BANG", + "DIV", + "MOD", + "LSHIFT", + "RSHIFT", + "LT", + "GT", + "LEQ", + "GEQ", + "EQEQ", + "NEQ", + "XOR", + "OR", + "ANDAND", + "OROR", + "QUESTION", + "MULEQ", + "DIVEQ", + "MODEQ", + "ADDEQ", + "SUBEQ", + "LSHIFTEQ", + "RSHIFTEQ", + "ANDEQ", + "XOREQ", + "OREQ", + "ID", + "ICON", + "FCON", + "CCON", + "SCON", + "$start", + "translation_unit", + "external_declaration", + "function_definition", + "declaration", + "declaration_specifiers", + "declarator", + "declaration_list", + "compound_statement", + "statement", + "labeled_statement", + "expression_statement", + "selection_statement", + "iteration_statement", + "jump_statement", + "identifier", + "constant_expression", + "typedef_name", + "block_item_list", + "block_item", + "expression", + "init_declarator_list", + "storage_class_specifier", + "type_specifier", + "type_qualifier", + "function_specifier", + "init_declarator", + "initializer", + "struct_or_union_specifier", + "enum_specifier", + "struct_or_union", + "struct_declaration_list", + "struct_declaration", + "specifier_qualifier_list", + "struct_declarator_list", + "struct_declarator", + "enumerator_list", + "enumerator", + "enumeration_constant", + "pointer", + "direct_declarator", + "type_qualifier_list", + "assignment_expression", + "parameter_type_list", + "identifier_list", + "parameter_list", + "parameter_declaration", + "abstract_declarator", + "type_name", + "direct_abstract_declarator", + "initializer_list", + "designation", + "designator_list", + "designator", + "primary_expression", + "constant", + "string_literal", + "postfix_expression", + "argument_expression_list", + "argument_expression", + "unary_expression", + "unary_operator", + "cast_expression", + "multiplicative_expression", + "additive_expression", + "shift_expression", + "relational_expression", + "equality_expression", + "and_expression", + "exclusive_or_expression", + "inclusive_or_expression", + "logical_and_expression", + "logical_or_expression", + "conditional_expression", + "assignment_operator" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'cast.y', 32) + def _reduce_1(val, _values, result) + result = TranslationUnit.new_at(val[0].pos, NodeChain[val[0]]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 33) + def _reduce_2(val, _values, result) + result = val[0]; result.entities << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 37) + def _reduce_3(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 38) + def _reduce_4(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 42) + def _reduce_5(val, _values, result) + result = make_function_def(val[0][0], val[0][1], val[1], val[2], val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 43) + def _reduce_6(val, _values, result) + result = make_function_def(val[0][0], val[0][1], val[1], nil , val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 47) + def _reduce_7(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 48) + def _reduce_8(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 54) + def _reduce_9(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 55) + def _reduce_10(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 56) + def _reduce_11(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 57) + def _reduce_12(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 58) + def _reduce_13(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 59) + def _reduce_14(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 63) + def _reduce_15(val, _values, result) + val[2].labels.unshift(PlainLabel.new_at(val[0].pos, val[0].val)); result = val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 64) + def _reduce_16(val, _values, result) + val[3].labels.unshift(Case .new_at(val[0].pos, val[1] )); result = val[3] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 65) + def _reduce_17(val, _values, result) + val[2].labels.unshift(Default .new_at(val[0].pos )); result = val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 67) + def _reduce_18(val, _values, result) + val[2].labels.unshift(PlainLabel.new_at(val[0].pos, val[0].name)); result = val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 71) + def _reduce_19(val, _values, result) + result = Block.new_at(val[0].pos, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 72) + def _reduce_20(val, _values, result) + result = Block.new_at(val[0].pos ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 76) + def _reduce_21(val, _values, result) + result = NodeChain[val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 77) + def _reduce_22(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 81) + def _reduce_23(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 82) + def _reduce_24(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 86) + def _reduce_25(val, _values, result) + result = ExpressionStatement.new_at(val[0].pos, val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 87) + def _reduce_26(val, _values, result) + result = ExpressionStatement.new_at(val[0].pos ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 91) + def _reduce_27(val, _values, result) + result = If .new_at(val[0].pos, val[2], val[4] ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 92) + def _reduce_28(val, _values, result) + result = If .new_at(val[0].pos, val[2], val[4], val[6]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 93) + def _reduce_29(val, _values, result) + result = Switch.new_at(val[0].pos, val[2], val[4] ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 97) + def _reduce_30(val, _values, result) + result = While.new_at(val[0].pos, val[2], val[4] ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 98) + def _reduce_31(val, _values, result) + result = While.new_at(val[0].pos, val[4], val[1], :do => true ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 99) + def _reduce_32(val, _values, result) + result = For.new_at(val[0].pos, val[2], val[4], val[6], val[8]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 100) + def _reduce_33(val, _values, result) + result = For.new_at(val[0].pos, val[2], val[4], nil , val[7]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 101) + def _reduce_34(val, _values, result) + result = For.new_at(val[0].pos, val[2], nil , val[5], val[7]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 102) + def _reduce_35(val, _values, result) + result = For.new_at(val[0].pos, val[2], nil , nil , val[6]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 103) + def _reduce_36(val, _values, result) + result = For.new_at(val[0].pos, nil , val[3], val[5], val[7]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 104) + def _reduce_37(val, _values, result) + result = For.new_at(val[0].pos, nil , val[3], nil , val[6]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 105) + def _reduce_38(val, _values, result) + result = For.new_at(val[0].pos, nil , nil , val[4], val[6]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 106) + def _reduce_39(val, _values, result) + result = For.new_at(val[0].pos, nil , nil , nil , val[5]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 107) + def _reduce_40(val, _values, result) + result = For.new_at(val[0].pos, val[2], val[3], val[5], val[7]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 108) + def _reduce_41(val, _values, result) + result = For.new_at(val[0].pos, val[2], val[3], nil , val[6]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 109) + def _reduce_42(val, _values, result) + result = For.new_at(val[0].pos, val[2], nil , val[4], val[6]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 110) + def _reduce_43(val, _values, result) + result = For.new_at(val[0].pos, val[2], nil , nil , val[5]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 114) + def _reduce_44(val, _values, result) + result = Goto .new_at(val[0].pos, val[1].val) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 115) + def _reduce_45(val, _values, result) + result = Continue.new_at(val[0].pos ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 116) + def _reduce_46(val, _values, result) + result = Break .new_at(val[0].pos ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 117) + def _reduce_47(val, _values, result) + result = Return .new_at(val[0].pos, val[1] ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 118) + def _reduce_48(val, _values, result) + result = Return .new_at(val[0].pos ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 120) + def _reduce_49(val, _values, result) + result = Goto .new_at(val[0].pos, val[1].name) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 126) + def _reduce_50(val, _values, result) + result = make_declaration(val[0][0], val[0][1], val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 127) + def _reduce_51(val, _values, result) + result = make_declaration(val[0][0], val[0][1], NodeArray[]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 131) + def _reduce_52(val, _values, result) + val[1][1] << val[0][1]; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 132) + def _reduce_53(val, _values, result) + result = [val[0][0], [val[0][1]]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 133) + def _reduce_54(val, _values, result) + val[1][1] << val[0][1]; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 134) + def _reduce_55(val, _values, result) + result = [val[0][0], [val[0][1]]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 135) + def _reduce_56(val, _values, result) + val[1][1] << val[0][1]; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 136) + def _reduce_57(val, _values, result) + result = [val[0][0], [val[0][1]]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 137) + def _reduce_58(val, _values, result) + val[1][1] << val[0][1]; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 138) + def _reduce_59(val, _values, result) + result = [val[0][0], [val[0][1]]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 142) + def _reduce_60(val, _values, result) + result = NodeArray[val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 143) + def _reduce_61(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 147) + def _reduce_62(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 148) + def _reduce_63(val, _values, result) + val[0].init = val[2]; result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 152) + def _reduce_64(val, _values, result) + result = [val[0].pos, :typedef ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 153) + def _reduce_65(val, _values, result) + result = [val[0].pos, :extern ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 154) + def _reduce_66(val, _values, result) + result = [val[0].pos, :static ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 155) + def _reduce_67(val, _values, result) + result = [val[0].pos, :auto ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 156) + def _reduce_68(val, _values, result) + result = [val[0].pos, :register] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 160) + def _reduce_69(val, _values, result) + result = [val[0].pos, :void ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 161) + def _reduce_70(val, _values, result) + result = [val[0].pos, :char ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 162) + def _reduce_71(val, _values, result) + result = [val[0].pos, :short ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 163) + def _reduce_72(val, _values, result) + result = [val[0].pos, :int ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 164) + def _reduce_73(val, _values, result) + result = [val[0].pos, :long ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 165) + def _reduce_74(val, _values, result) + result = [val[0].pos, :float ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 166) + def _reduce_75(val, _values, result) + result = [val[0].pos, :double ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 167) + def _reduce_76(val, _values, result) + result = [val[0].pos, :signed ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 168) + def _reduce_77(val, _values, result) + result = [val[0].pos, :unsigned ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 169) + def _reduce_78(val, _values, result) + result = [val[0].pos, :_Bool ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 170) + def _reduce_79(val, _values, result) + result = [val[0].pos, :_Complex ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 171) + def _reduce_80(val, _values, result) + result = [val[0].pos, :_Imaginary] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 172) + def _reduce_81(val, _values, result) + result = [val[0].pos, val[0] ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 173) + def _reduce_82(val, _values, result) + result = [val[0].pos, val[0] ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 174) + def _reduce_83(val, _values, result) + result = [val[0].pos, val[0] ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 178) + def _reduce_84(val, _values, result) + result = val[0][1].new_at(val[0][0], val[1].val, val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 179) + def _reduce_85(val, _values, result) + result = val[0][1].new_at(val[0][0], nil , val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 180) + def _reduce_86(val, _values, result) + result = val[0][1].new_at(val[0][0], val[1].val, nil ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 182) + def _reduce_87(val, _values, result) + result = val[0][1].new_at(val[0][0], val[1].name, val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 183) + def _reduce_88(val, _values, result) + result = val[0][1].new_at(val[0][0], val[1].name, nil ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 187) + def _reduce_89(val, _values, result) + result = [val[0].pos, Struct] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 188) + def _reduce_90(val, _values, result) + result = [val[0].pos, Union ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 192) + def _reduce_91(val, _values, result) + result = NodeArray[val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 193) + def _reduce_92(val, _values, result) + val[0] << val[1]; result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 197) + def _reduce_93(val, _values, result) + result = make_declaration(val[0][0], val[0][1], val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 201) + def _reduce_94(val, _values, result) + val[1][1] << val[0][1]; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 202) + def _reduce_95(val, _values, result) + result = [val[0][0], [val[0][1]]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 203) + def _reduce_96(val, _values, result) + val[1][1] << val[0][1]; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 204) + def _reduce_97(val, _values, result) + result = [val[0][0], [val[0][1]]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 208) + def _reduce_98(val, _values, result) + result = NodeArray[val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 209) + def _reduce_99(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 213) + def _reduce_100(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 214) + def _reduce_101(val, _values, result) + result = val[0]; val[0].num_bits = val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 215) + def _reduce_102(val, _values, result) + result = Declarator.new_at(val[0].pos, :num_bits => val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 219) + def _reduce_103(val, _values, result) + result = Enum.new_at(val[0].pos, val[1].val, val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 220) + def _reduce_104(val, _values, result) + result = Enum.new_at(val[0].pos, nil , val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 221) + def _reduce_105(val, _values, result) + result = Enum.new_at(val[0].pos, val[1].val, val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 222) + def _reduce_106(val, _values, result) + result = Enum.new_at(val[0].pos, nil , val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 223) + def _reduce_107(val, _values, result) + result = Enum.new_at(val[0].pos, val[1].val, nil ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 225) + def _reduce_108(val, _values, result) + result = Enum.new_at(val[0].pos, val[1].name, val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 226) + def _reduce_109(val, _values, result) + result = Enum.new_at(val[0].pos, val[1].name, val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 227) + def _reduce_110(val, _values, result) + result = Enum.new_at(val[0].pos, val[1].name, nil ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 231) + def _reduce_111(val, _values, result) + result = NodeArray[val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 232) + def _reduce_112(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 236) + def _reduce_113(val, _values, result) + result = Enumerator.new_at(val[0].pos, val[0].val, nil ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 237) + def _reduce_114(val, _values, result) + result = Enumerator.new_at(val[0].pos, val[0].val, val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 241) + def _reduce_115(val, _values, result) + result = [val[0].pos, :const ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 242) + def _reduce_116(val, _values, result) + result = [val[0].pos, :restrict] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 243) + def _reduce_117(val, _values, result) + result = [val[0].pos, :volatile] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 247) + def _reduce_118(val, _values, result) + result = [val[0].pos, :inline] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 251) + def _reduce_119(val, _values, result) + result = add_decl_type(val[1], val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 252) + def _reduce_120(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 256) + def _reduce_121(val, _values, result) + result = Declarator.new_at(val[0].pos, nil, val[0].val) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 257) + def _reduce_122(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 258) + def _reduce_123(val, _values, result) + result = add_decl_type(val[0], Array.new_at(val[0].pos )) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 259) + def _reduce_124(val, _values, result) + result = add_decl_type(val[0], Array.new_at(val[0].pos )) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 260) + def _reduce_125(val, _values, result) + result = add_decl_type(val[0], Array.new_at(val[0].pos, nil, val[2])) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 261) + def _reduce_126(val, _values, result) + result = add_decl_type(val[0], Array.new_at(val[0].pos )) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 262) + def _reduce_127(val, _values, result) + result = add_decl_type(val[0], Array.new_at(val[0].pos )) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 263) + def _reduce_128(val, _values, result) + result = add_decl_type(val[0], Array.new_at(val[0].pos )) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 264) + def _reduce_129(val, _values, result) + result = add_decl_type(val[0], Array.new_at(val[0].pos )) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 265) + def _reduce_130(val, _values, result) + result = add_decl_type(val[0], Array.new_at(val[0].pos )) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 266) + def _reduce_131(val, _values, result) + result = add_decl_type(val[0], Array.new_at(val[0].pos )) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 267) + def _reduce_132(val, _values, result) + result = add_decl_type(val[0], Function.new_at(val[0].pos, nil, param_list(*val[2]), :var_args => val[2][1])) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 268) + def _reduce_133(val, _values, result) + result = add_decl_type(val[0], Function.new_at(val[0].pos, nil, val[2])) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 269) + def _reduce_134(val, _values, result) + result = add_decl_type(val[0], Function.new_at(val[0].pos )) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 273) + def _reduce_135(val, _values, result) + result = add_type_quals(Pointer.new_at(val[0].pos), val[1][1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 274) + def _reduce_136(val, _values, result) + result = Pointer.new_at(val[0].pos) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 275) + def _reduce_137(val, _values, result) + p = add_type_quals(Pointer.new_at(val[0].pos), val[1][1]); val[2].direct_type = p; result = val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 276) + def _reduce_138(val, _values, result) + p = Pointer.new_at(val[0].pos) ; val[1].direct_type = p; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 280) + def _reduce_139(val, _values, result) + result = [val[0][0], [val[0][1]]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 281) + def _reduce_140(val, _values, result) + val[0][1] << val[1][1]; result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 285) + def _reduce_141(val, _values, result) + result = [val[0], false] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 286) + def _reduce_142(val, _values, result) + result = [val[0], true ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 290) + def _reduce_143(val, _values, result) + result = NodeArray[val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 291) + def _reduce_144(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 295) + def _reduce_145(val, _values, result) + ind_type = val[1].indirect_type and ind_type.detach + result = make_parameter(val[0][0], val[0][1], ind_type, val[1].name) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 297) + def _reduce_146(val, _values, result) + result = make_parameter(val[0][0], val[0][1], val[1] , nil ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 298) + def _reduce_147(val, _values, result) + result = make_parameter(val[0][0], val[0][1], nil , nil ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 302) + def _reduce_148(val, _values, result) + result = NodeArray[Parameter.new_at(val[0].pos, nil, val[0].val)] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 303) + def _reduce_149(val, _values, result) + result = val[0] << Parameter.new_at(val[2].pos, nil, val[2].val) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 307) + def _reduce_150(val, _values, result) + val[1].direct_type = make_direct_type(val[0][0], val[0][1]); result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 308) + def _reduce_151(val, _values, result) + result = make_direct_type(val[0][0], val[0][1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 312) + def _reduce_152(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 313) + def _reduce_153(val, _values, result) + val[1].direct_type = val[0]; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 314) + def _reduce_154(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 318) + def _reduce_155(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 319) + def _reduce_156(val, _values, result) + val[0].direct_type = Array.new_at(val[0].pos, nil, val[2]); result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 320) + def _reduce_157(val, _values, result) + val[0].direct_type = Array.new_at(val[0].pos, nil, nil ); result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 321) + def _reduce_158(val, _values, result) + result = Array.new_at(val[0].pos, nil, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 322) + def _reduce_159(val, _values, result) + result = Array.new_at(val[0].pos ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 323) + def _reduce_160(val, _values, result) + val[0].direct_type = Array.new_at(val[0].pos); result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 324) + def _reduce_161(val, _values, result) + result = Array.new_at(val[0].pos) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 325) + def _reduce_162(val, _values, result) + val[0].direct_type = Function.new_at(val[0].pos, nil, param_list(*val[2]), val[2][1]); result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 326) + def _reduce_163(val, _values, result) + val[0].direct_type = Function.new_at(val[0].pos ); result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 327) + def _reduce_164(val, _values, result) + result = Function.new_at(val[0].pos, nil, param_list(*val[1]), val[1][1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 328) + def _reduce_165(val, _values, result) + result = Function.new_at(val[0].pos ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 334) + def _reduce_166(val, _values, result) + result = CustomType.new_at(val[0].pos, val[0].val) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 338) + def _reduce_167(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 339) + def _reduce_168(val, _values, result) + result = CompoundLiteral.new_at(val[0].pos, nil, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 340) + def _reduce_169(val, _values, result) + result = CompoundLiteral.new_at(val[0].pos, nil, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 344) + def _reduce_170(val, _values, result) + result = NodeArray[MemberInit.new_at(val[0][0] , val[0][1], val[1])] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 345) + def _reduce_171(val, _values, result) + result = NodeArray[MemberInit.new_at(val[0].pos, nil , val[0])] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 346) + def _reduce_172(val, _values, result) + result = val[0] << MemberInit.new_at(val[2][0] , val[2][1], val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 347) + def _reduce_173(val, _values, result) + result = val[0] << MemberInit.new_at(val[2].pos, nil , val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 351) + def _reduce_174(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 355) + def _reduce_175(val, _values, result) + result = val[0]; val[0][1] = NodeArray[val[0][1]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 356) + def _reduce_176(val, _values, result) + result = val[0]; val[0][1] << val[1][1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 360) + def _reduce_177(val, _values, result) + result = [val[1].pos, val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 361) + def _reduce_178(val, _values, result) + result = [val[1].pos, Member.new_at(val[1].pos, val[1].val)] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 367) + def _reduce_179(val, _values, result) + result = Variable.new_at(val[0].pos, val[0].val) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 368) + def _reduce_180(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 369) + def _reduce_181(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 371) + def _reduce_182(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 372) + def _reduce_183(val, _values, result) + block_expressions_enabled? or parse_error val[0].pos, "compound statement found where expression expected" + result = BlockExpression.new(val[1]); result.pos = val[0].pos + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 377) + def _reduce_184(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 378) + def _reduce_185(val, _values, result) + result = Index .new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 379) + def _reduce_186(val, _values, result) + result = Call .new_at(val[0].pos, val[0], val[2] ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 380) + def _reduce_187(val, _values, result) + result = Call .new_at(val[0].pos, val[0], NodeArray[]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 381) + def _reduce_188(val, _values, result) + result = Dot .new_at(val[0].pos, val[0], Member.new(val[2].val)) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 382) + def _reduce_189(val, _values, result) + result = Arrow .new_at(val[0].pos, val[0], Member.new(val[2].val)) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 383) + def _reduce_190(val, _values, result) + result = PostInc .new_at(val[0].pos, val[0] ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 384) + def _reduce_191(val, _values, result) + result = PostDec .new_at(val[0].pos, val[0] ) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 385) + def _reduce_192(val, _values, result) + result = CompoundLiteral.new_at(val[0].pos, val[1], val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 386) + def _reduce_193(val, _values, result) + result = CompoundLiteral.new_at(val[0].pos, val[1], val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 390) + def _reduce_194(val, _values, result) + result = NodeArray[val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 391) + def _reduce_195(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 395) + def _reduce_196(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 396) + def _reduce_197(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 400) + def _reduce_198(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 401) + def _reduce_199(val, _values, result) + result = PreInc.new_at(val[0].pos, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 402) + def _reduce_200(val, _values, result) + result = PreDec.new_at(val[0].pos, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 403) + def _reduce_201(val, _values, result) + result = val[0][0].new_at(val[0][1], val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 404) + def _reduce_202(val, _values, result) + result = Sizeof.new_at(val[0].pos, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 405) + def _reduce_203(val, _values, result) + result = Sizeof.new_at(val[0].pos, val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 409) + def _reduce_204(val, _values, result) + result = [Address , val[0].pos] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 410) + def _reduce_205(val, _values, result) + result = [Dereference, val[0].pos] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 411) + def _reduce_206(val, _values, result) + result = [Positive , val[0].pos] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 412) + def _reduce_207(val, _values, result) + result = [Negative , val[0].pos] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 413) + def _reduce_208(val, _values, result) + result = [BitNot , val[0].pos] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 414) + def _reduce_209(val, _values, result) + result = [Not , val[0].pos] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 418) + def _reduce_210(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 419) + def _reduce_211(val, _values, result) + result = Cast.new_at(val[0].pos, val[1], val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 423) + def _reduce_212(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 424) + def _reduce_213(val, _values, result) + result = Multiply.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 425) + def _reduce_214(val, _values, result) + result = Divide .new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 426) + def _reduce_215(val, _values, result) + result = Mod .new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 430) + def _reduce_216(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 431) + def _reduce_217(val, _values, result) + result = Add .new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 432) + def _reduce_218(val, _values, result) + result = Subtract.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 436) + def _reduce_219(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 437) + def _reduce_220(val, _values, result) + result = ShiftLeft .new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 438) + def _reduce_221(val, _values, result) + result = ShiftRight.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 442) + def _reduce_222(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 443) + def _reduce_223(val, _values, result) + result = Less.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 444) + def _reduce_224(val, _values, result) + result = More.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 445) + def _reduce_225(val, _values, result) + result = LessOrEqual.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 446) + def _reduce_226(val, _values, result) + result = MoreOrEqual.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 450) + def _reduce_227(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 451) + def _reduce_228(val, _values, result) + result = Equal .new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 452) + def _reduce_229(val, _values, result) + result = NotEqual.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 456) + def _reduce_230(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 457) + def _reduce_231(val, _values, result) + result = BitAnd.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 461) + def _reduce_232(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 462) + def _reduce_233(val, _values, result) + result = BitXor.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 466) + def _reduce_234(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 467) + def _reduce_235(val, _values, result) + result = BitOr.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 471) + def _reduce_236(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 472) + def _reduce_237(val, _values, result) + result = And.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 476) + def _reduce_238(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 477) + def _reduce_239(val, _values, result) + result = Or.new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 481) + def _reduce_240(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 482) + def _reduce_241(val, _values, result) + result = Conditional.new_at(val[0].pos, val[0], val[2], val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 486) + def _reduce_242(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 487) + def _reduce_243(val, _values, result) + result = val[1].new_at(val[0].pos, val[0], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 491) + def _reduce_244(val, _values, result) + result = Assign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 492) + def _reduce_245(val, _values, result) + result = MultiplyAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 493) + def _reduce_246(val, _values, result) + result = DivideAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 494) + def _reduce_247(val, _values, result) + result = ModAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 495) + def _reduce_248(val, _values, result) + result = AddAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 496) + def _reduce_249(val, _values, result) + result = SubtractAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 497) + def _reduce_250(val, _values, result) + result = ShiftLeftAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 498) + def _reduce_251(val, _values, result) + result = ShiftRightAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 499) + def _reduce_252(val, _values, result) + result = BitAndAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 500) + def _reduce_253(val, _values, result) + result = BitXorAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 501) + def _reduce_254(val, _values, result) + result = BitOrAssign + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 505) + def _reduce_255(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 507) + def _reduce_256(val, _values, result) + if val[0].is_a? Comma + if val[2].is_a? Comma + val[0].exprs.push(*val[2].exprs) + else + val[0].exprs << val[2] + end + result = val[0] + else + if val[2].is_a? Comma + val[2].exprs.unshift(val[0]) + val[2].pos = val[0].pos + result = val[2] + else + result = Comma.new_at(val[0].pos, NodeArray[val[0], val[2]]) + end + end + + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 527) + def _reduce_257(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 542) + def _reduce_258(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 546) + def _reduce_259(val, _values, result) + result = val[0].val; result.pos = val[0].pos + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 547) + def _reduce_260(val, _values, result) + result = val[0].val; result.pos = val[0].pos + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 550) + def _reduce_261(val, _values, result) + result = val[0].val; result.pos = val[0].pos + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 554) + def _reduce_262(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 559) + def _reduce_263(val, _values, result) + val[0].val << val[1].val.val; result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'cast.y', 560) + def _reduce_264(val, _values, result) + result = val[0].val; result.pos = val[0].pos + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module C diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/csspool b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/csspool new file mode 100644 index 000000000000..a3d14a9b34c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/csspool @@ -0,0 +1,2314 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +module CSSPool + module CSS + class Parser < Racc::Parser + +module_eval(<<'...end csspool.y/module_eval...', 'csspool.y', 670) + +def numeric thing + thing = thing.gsub(/[^\d.]/, '') + Integer(thing) rescue Float(thing) +end + +def interpret_identifier s + interpret_escapes s +end + +def interpret_uri s + interpret_escapes s.match(/^url\((.*)\)$/mui)[1].strip.match(/^(['"]?)((?:\\.|.)*)\1$/mu)[2] +end + +def interpret_string_no_quote s + interpret_escapes s.match(/^(.*)\)$/mu)[1].strip.match(/^(['"]?)((?:\\.|.)*)\1$/mu)[2] +end + +def interpret_string s + interpret_escapes s.match(/^(['"])((?:\\.|.)*)\1$/mu)[2] +end + +def interpret_escapes s + token_exp = /\\(?:([0-9a-fA-F]{1,6}(?:\r\n|\s)?)|(.))/mu + return s.gsub(token_exp) do |escape_sequence| + if !$1.nil? + code = $1.chomp.to_i 16 + code = 0xFFFD if code > 0x10FFFF + next [code].pack('U') + end + next '' if $2 == "\n" + next $2 + end +end + +# override racc's on_error so we can have context in our error messages +def on_error(t, val, vstack) + errcontext = (@ss.pre_match[-10..-1] || @ss.pre_match) + + @ss.matched + @ss.post_match[0..9] + line_number = @ss.pre_match.lines.count + raise ParseError, sprintf("parse error on value %s (%s) " + + "on line %s around \"%s\"", + val.inspect, token_to_str(t) || '?', + line_number, errcontext) +end + +def before_pos(val) + # don't include leading whitespace + return current_pos - val.last.length + val.last[/\A\s*/].size +end + +def after_pos(val) + # don't include trailing whitespace + return current_pos - val.last[/\s*\z/].size +end + +# charpos will work with multibyte strings but is not available until ruby 2 +def current_pos + @ss.respond_to?('charpos') ? @ss.charpos : @ss.pos +end +...end csspool.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 9, 10, 137, 129, 37, 31, 55, 139, 130, 39, + 45, 47, 45, 47, 123, 9, 10, 103, 3, 37, + 31, 98, 229, 103, 39, 45, 47, 230, 124, 125, + 224, 20, 113, 56, 37, 31, 23, 114, 104, 39, + 45, 47, 245, 27, 104, 11, 20, 126, 48, 25, + 48, 23, 242, 29, 138, 244, 38, 46, 27, 46, + 11, 108, 113, 48, 25, 9, 10, 114, 29, 37, + 31, 38, 46, 223, 39, 45, 47, 49, 48, 115, + 9, 10, 108, 113, 37, 31, 38, 46, 114, 39, + 45, 47, 55, 339, 243, 155, 20, 108, 113, 37, + 31, 23, 107, 114, 39, 45, 47, 231, 27, 115, + 11, 20, 232, 48, 25, 55, 23, 59, 29, 56, + 344, 38, 46, 27, 340, 11, 20, 53, 48, 25, + 115, 23, 345, 29, 37, 31, 38, 46, 27, 39, + 45, 47, 56, 48, 25, 115, -28, 105, 29, 37, + 31, 38, 46, 116, 39, 45, 47, 250, 75, 120, + 251, 20, 108, 113, 37, 31, 23, 118, 114, 39, + 45, 47, 121, 27, 74, 73, 20, 313, 48, 25, + 314, 23, 128, 29, 108, 113, 38, 46, 27, 215, + 114, 20, 131, 48, 25, 75, 23, 136, 29, 37, + 64, 38, 46, 27, 39, 45, 47, 92, 48, 25, + 115, 74, 73, 29, 37, 31, 38, 46, 77, 39, + 45, 47, 148, 94, 103, 156, 20, -89, 83, 37, + 31, 23, 115, 87, 39, 45, 47, 160, 27, 85, + 153, 20, 151, 48, 25, 104, 23, 84, 29, 157, + 158, 38, 46, 27, 163, 252, 20, 151, 48, 25, + 201, 23, 164, 29, 37, 31, 38, 46, 27, 39, + 45, 47, 203, 48, 25, 188, 202, 59, 29, 37, + 165, 38, 46, 187, 39, 45, 47, 201, 204, 166, + 184, 83, 288, 198, 287, 190, 197, 192, 191, 193, + 194, 195, 85, 202, 37, 45, 47, 37, 48, 39, + 45, 47, 39, 45, 47, 167, 38, 46, 168, 83, + 170, 113, 210, 48, 181, 186, 114, 185, 196, 37, + 85, 38, 46, 92, 39, 45, 47, 203, 84, 150, + 152, 151, 289, 48, 290, 292, 163, 291, 48, 94, + -33, 48, 46, 204, 169, 199, 38, 46, 37, 38, + 46, 200, -33, 39, 45, 47, 92, 188, 115, 59, + 294, 258, 293, 48, 296, 187, 295, 298, 260, 297, + 212, 38, 46, 83, 216, 198, 259, 190, 197, 192, + 191, 193, 194, 195, 85, 45, 47, 45, 47, 45, + 47, 217, 48, 218, 219, 188, 108, 59, 285, 108, + 38, 46, 170, 187, 225, 226, 181, 186, 233, 185, + 196, 83, 129, 198, 234, 190, 197, 192, 191, 193, + 194, 195, 85, 48, 163, 48, 255, 48, 256, 155, + 263, 169, 46, 188, 46, 59, 46, 264, 168, 265, + 170, 187, 266, 92, 181, 186, 92, 185, 196, 83, + 92, 198, 92, 190, 197, 192, 191, 193, 194, 195, + 85, 198, 278, 190, 197, 192, 191, 193, 194, 195, + 279, 188, 281, 59, 241, 235, 236, 237, 170, 187, + 286, 229, 181, 186, 231, 185, 196, 83, 163, 198, + 300, 190, 197, 192, 191, 193, 194, 195, 85, 301, + 302, 238, 239, 240, 303, 306, 307, 255, 141, 188, + 75, 59, 322, 163, 185, 168, 170, 187, 312, 317, + 181, 186, 143, 185, 196, 83, 319, 198, 323, 190, + 197, 192, 191, 193, 194, 195, 85, 324, 325, 145, + 326, 327, 328, 329, 330, 331, 144, 188, 146, 59, + 147, 332, 142, 333, 170, 187, 334, 306, 181, 186, + 163, 185, 196, 83, 338, 198, 163, 190, 197, 192, + 191, 193, 194, 195, 85, 346, 319, 319, 163, 351, + 306, 163, 319, 357, 359, 188, nil, 59, nil, nil, + nil, nil, 170, 187, nil, nil, 181, 186, nil, 185, + 196, 83, nil, 198, nil, 190, 197, 192, 191, 193, + 194, 195, 85, 272, nil, 83, nil, 198, nil, 190, + 197, 192, 191, 193, 194, 195, nil, nil, nil, nil, + 170, nil, nil, nil, 181, 186, nil, 185, 196, 272, + nil, 83, nil, 198, nil, 190, 197, 192, 191, 193, + 194, 195, 272, nil, 83, nil, 198, nil, 190, 197, + 192, 191, 193, 194, 195, 272, nil, 83, nil, 198, + nil, 190, 197, 192, 191, 193, 194, 195, 272, nil, + 83, nil, 198, nil, 190, 197, 192, 191, 193, 194, + 195, 272, nil, 83, nil, 198, nil, 190, 197, 192, + 191, 193, 194, 195 ] + +racc_action_check = [ + 2, 2, 47, 38, 2, 2, 10, 47, 38, 2, + 2, 2, 35, 35, 34, 5, 5, 26, 1, 5, + 5, 26, 128, 217, 5, 5, 5, 128, 34, 34, + 112, 2, 210, 10, 31, 31, 2, 210, 26, 31, + 31, 31, 143, 2, 217, 2, 5, 34, 2, 2, + 35, 5, 142, 2, 47, 143, 2, 2, 5, 35, + 5, 110, 110, 5, 5, 6, 6, 110, 5, 6, + 6, 5, 5, 112, 6, 6, 6, 3, 31, 210, + 7, 7, 221, 221, 7, 7, 31, 31, 221, 7, + 7, 7, 58, 309, 142, 58, 6, 28, 28, 12, + 12, 6, 28, 28, 12, 12, 12, 131, 6, 110, + 6, 7, 131, 6, 6, 11, 7, 11, 6, 58, + 315, 6, 6, 7, 309, 7, 12, 9, 7, 7, + 221, 12, 315, 7, 13, 13, 7, 7, 12, 13, + 13, 13, 11, 12, 12, 28, 20, 27, 12, 14, + 14, 12, 12, 29, 14, 14, 14, 149, 20, 32, + 149, 13, 30, 30, 15, 15, 13, 30, 30, 15, + 15, 15, 33, 13, 20, 20, 14, 269, 13, 13, + 269, 14, 37, 13, 100, 100, 13, 13, 14, 100, + 100, 15, 39, 14, 14, 157, 15, 46, 14, 19, + 19, 14, 14, 15, 19, 19, 19, 25, 15, 15, + 30, 157, 157, 15, 21, 21, 15, 15, 21, 21, + 21, 21, 53, 25, 99, 67, 19, 99, 22, 24, + 24, 19, 100, 24, 24, 24, 24, 71, 19, 22, + 57, 21, 57, 19, 19, 99, 21, 22, 19, 70, + 70, 19, 19, 21, 75, 154, 24, 154, 21, 21, + 90, 24, 76, 21, 64, 64, 21, 21, 24, 64, + 64, 64, 91, 24, 24, 83, 90, 83, 24, 121, + 78, 24, 24, 83, 121, 121, 121, 206, 91, 79, + 83, 83, 235, 83, 235, 83, 83, 83, 83, 83, + 83, 83, 83, 206, 122, 41, 41, 144, 64, 122, + 122, 122, 144, 144, 144, 80, 64, 64, 81, 166, + 83, 92, 92, 121, 83, 83, 92, 83, 83, 146, + 166, 121, 121, 92, 146, 146, 146, 207, 166, 54, + 54, 54, 236, 41, 236, 237, 270, 237, 122, 92, + 270, 144, 41, 207, 82, 86, 122, 122, 302, 144, + 144, 88, 270, 302, 302, 302, 94, 171, 92, 171, + 238, 171, 238, 146, 239, 171, 239, 240, 171, 240, + 97, 146, 146, 171, 101, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 42, 42, 43, 43, 44, + 44, 102, 302, 105, 106, 223, 108, 223, 223, 109, + 302, 302, 171, 223, 114, 117, 171, 171, 137, 171, + 171, 223, 138, 223, 139, 223, 223, 223, 223, 223, + 223, 223, 223, 42, 147, 43, 161, 44, 162, 172, + 175, 176, 42, 261, 43, 261, 44, 177, 179, 183, + 223, 261, 185, 201, 223, 223, 202, 223, 223, 261, + 203, 261, 204, 261, 261, 261, 261, 261, 261, 261, + 261, 189, 208, 189, 189, 189, 189, 189, 189, 189, + 209, 285, 214, 285, 140, 140, 140, 140, 261, 285, + 224, 233, 261, 261, 234, 261, 261, 285, 243, 285, + 245, 285, 285, 285, 285, 285, 285, 285, 285, 246, + 247, 140, 140, 140, 248, 249, 251, 254, 48, 286, + 255, 286, 286, 256, 266, 267, 285, 286, 268, 280, + 285, 285, 48, 285, 285, 286, 284, 286, 287, 286, + 286, 286, 286, 286, 286, 286, 286, 288, 289, 48, + 290, 291, 292, 293, 294, 295, 48, 322, 48, 322, + 48, 296, 48, 297, 286, 322, 298, 299, 286, 286, + 304, 286, 286, 322, 306, 322, 312, 322, 322, 322, + 322, 322, 322, 322, 322, 316, 320, 321, 335, 337, + 338, 340, 349, 350, 358, 353, nil, 353, nil, nil, + nil, nil, 322, 353, nil, nil, 322, 322, nil, 322, + 322, 353, nil, 353, nil, 353, 353, 353, 353, 353, + 353, 353, 353, 186, nil, 186, nil, 186, nil, 186, + 186, 186, 186, 186, 186, 186, nil, nil, nil, nil, + 353, nil, nil, nil, 353, 353, nil, 353, 353, 272, + nil, 272, nil, 272, nil, 272, 272, 272, 272, 272, + 272, 272, 313, nil, 313, nil, 313, nil, 313, 313, + 313, 313, 313, 313, 313, 314, nil, 314, nil, 314, + nil, 314, 314, 314, 314, 314, 314, 314, 344, nil, + 344, nil, 344, nil, 344, 344, 344, 344, 344, 344, + 344, 345, nil, 345, nil, 345, nil, 345, 345, 345, + 345, 345, 345, 345 ] + +racc_action_pointer = [ + nil, 18, -2, 77, nil, 13, 63, 78, nil, 123, + 2, 111, 93, 128, 143, 158, nil, nil, nil, 193, + 140, 208, 208, nil, 223, 189, 11, 141, 92, 144, + 157, 28, 150, 164, 7, 0, nil, 124, -3, 134, + nil, 293, 383, 385, 387, nil, 191, -4, 512, nil, + nil, nil, nil, 217, 334, nil, nil, 235, 88, nil, + nil, nil, nil, nil, 258, nil, nil, 215, nil, nil, + 241, 231, nil, nil, nil, 247, 252, nil, 271, 281, + 308, 311, 347, 271, nil, nil, 345, nil, 352, nil, + 224, 236, 315, nil, 348, nil, nil, 370, nil, 218, + 179, 375, 393, nil, nil, 394, 394, nil, 401, 404, + 56, nil, 23, nil, 408, nil, nil, 405, nil, nil, + nil, 273, 298, nil, nil, nil, nil, nil, 16, nil, + nil, 101, nil, nil, nil, nil, nil, 360, 416, 366, + 470, nil, 46, 36, 301, nil, 323, 427, nil, 152, + nil, nil, nil, nil, 250, nil, nil, 177, nil, nil, + nil, 400, 432, nil, nil, nil, 299, nil, nil, nil, + nil, 363, 432, nil, nil, 433, 434, 440, nil, 441, + nil, nil, nil, 430, nil, 444, 605, nil, nil, 449, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 435, 438, 442, 444, nil, 251, 301, 453, 461, + 26, nil, nil, nil, 472, nil, nil, 17, nil, nil, + nil, 77, nil, 401, 440, nil, nil, nil, nil, nil, + nil, nil, nil, 485, 488, 288, 338, 341, 366, 370, + 373, nil, nil, 491, nil, 481, 490, 502, 495, 509, + nil, 510, nil, nil, 481, 502, 516, nil, nil, nil, + nil, 439, nil, nil, nil, nil, 468, 518, 509, 155, + 339, nil, 631, nil, nil, nil, nil, nil, nil, nil, + 510, nil, nil, nil, 504, 477, 515, 524, 533, 534, + 536, 537, 538, 539, 540, 541, 547, 549, 552, 561, + nil, nil, 352, nil, 563, nil, 566, nil, nil, 74, + nil, nil, 569, 644, 657, 109, 566, nil, nil, nil, + 554, 555, 553, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 581, nil, 570, 584, nil, + 584, nil, nil, nil, 670, 683, nil, nil, nil, 560, + 574, nil, nil, 591, nil, nil, nil, nil, 575, nil ] + +racc_action_default = [ + -1, -229, -10, -229, -2, -6, -7, -8, -9, -229, + -229, -229, -41, -42, -43, -44, -45, -46, -47, -33, + -23, -229, -229, -55, -229, -229, -89, -229, -229, -229, + -229, -229, -229, -103, -105, -111, -112, -115, -229, -120, + -119, -124, -125, -126, -127, -132, -229, -229, -229, 360, + -3, -4, -5, -229, -229, -15, -16, -229, -229, -228, + -37, -38, -39, -40, -32, -48, -49, -229, -99, -21, + -229, -229, -35, -26, -27, -33, -229, -53, -229, -57, + -58, -59, -60, -229, -198, -214, -229, -62, -229, -64, + -65, -66, -229, -71, -229, -73, -74, -229, -82, -85, + -229, -229, -91, -92, -93, -229, -229, -95, -160, -165, + -166, -167, -229, -174, -229, -176, -96, -229, -98, -100, + -101, -229, -229, -106, -107, -108, -109, -110, -229, -117, + -121, -229, -128, -129, -130, -131, -133, -115, -229, -229, + -229, -147, -229, -229, -229, -152, -229, -33, -11, -229, + -13, -14, -20, -18, -229, -227, -50, -28, -51, -35, + -29, -25, -229, -32, -52, -54, -229, -197, -194, -213, + -36, -182, -183, -184, -185, -186, -187, -188, -189, -190, + -191, -192, -193, -229, -196, -200, -229, -212, -216, -229, + -218, -219, -220, -221, -222, -223, -224, -225, -226, -61, + -63, -229, -229, -229, -229, -67, -68, -69, -229, -229, + -229, -72, -81, -84, -229, -87, -88, -89, -83, -94, + -161, -164, -163, -229, -229, -175, -97, -102, -104, -116, + -123, -118, -122, -229, -229, -229, -229, -229, -229, -229, + -229, -146, -148, -33, -149, -229, -229, -114, -229, -156, + -12, -229, -17, -22, -24, -229, -33, -56, -177, -178, + -179, -229, -181, -215, -211, -195, -229, -209, -229, -202, + -205, -208, -229, -217, -76, -78, -75, -77, -70, -79, + -229, -86, -90, -162, -173, -229, -229, -229, -229, -229, + -229, -229, -229, -229, -229, -229, -229, -229, -229, -156, + -150, -151, -229, -153, -33, -157, -158, -19, -34, -229, + -180, -199, -33, -229, -229, -229, -229, -80, -168, -172, + -173, -173, -229, -134, -135, -136, -137, -138, -139, -140, + -141, -142, -143, -144, -145, -33, -113, -229, -229, -30, + -33, -201, -203, -204, -229, -229, -210, -169, -170, -173, + -229, -154, -159, -229, -206, -207, -171, -155, -229, -31 ] + +racc_goto_table = [ + 81, 248, 183, 68, 106, 91, 117, 271, 78, 246, + 273, 247, 82, 69, 209, 161, 97, 89, 268, 304, + 90, 119, 54, 57, 220, 221, 318, 60, 61, 62, + 63, 354, 355, 1, 65, 127, 76, 2, 149, 86, + 58, 132, 133, 134, 135, 4, 70, 159, 50, 51, + 52, 308, 67, 66, 119, 88, 208, 282, 227, 162, + 228, 122, 347, 348, 140, 352, 261, 311, nil, 335, + 154, nil, 207, nil, 211, nil, 214, nil, nil, nil, + nil, nil, nil, nil, 205, nil, 222, 206, nil, 213, + 262, 356, nil, 271, nil, nil, nil, nil, nil, nil, + nil, nil, 254, nil, 316, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 249, 280, nil, 271, 271, nil, nil, nil, nil, + nil, nil, 284, nil, 81, 342, 343, nil, nil, nil, + 253, nil, 257, nil, nil, nil, 82, 336, nil, nil, + nil, nil, nil, nil, 267, 271, 271, 247, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 310, 274, 275, 276, 277, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 283, nil, nil, + nil, nil, nil, nil, 320, 321, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 299, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 309, 349, nil, nil, nil, nil, nil, nil, nil, nil, + 267, nil, nil, nil, 315, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 358, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 337, nil, + nil, 267, 267, nil, nil, nil, 341, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 350, + nil, nil, 267, 267, 353 ] + +racc_goto_check = [ + 35, 62, 18, 17, 51, 41, 51, 77, 32, 58, + 77, 58, 36, 12, 46, 15, 48, 39, 82, 68, + 40, 55, 8, 8, 70, 70, 73, 7, 7, 7, + 7, 84, 84, 1, 7, 61, 7, 3, 9, 7, + 10, 61, 61, 61, 61, 2, 11, 14, 2, 2, + 2, 16, 27, 28, 55, 38, 42, 52, 56, 17, + 57, 59, 73, 73, 63, 69, 74, 81, nil, 68, + 8, nil, 41, nil, 41, nil, 51, nil, nil, nil, + nil, nil, nil, nil, 39, nil, 51, 40, nil, 48, + 18, 73, nil, 77, nil, nil, nil, nil, nil, nil, + nil, nil, 15, nil, 82, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 17, 46, nil, 77, 77, nil, nil, nil, nil, + nil, nil, 18, nil, 35, 82, 82, nil, nil, nil, + 12, nil, 32, nil, nil, nil, 36, 62, nil, nil, + nil, nil, nil, nil, 35, 77, 77, 58, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 18, 41, 41, 41, 41, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 51, nil, nil, + nil, nil, nil, nil, 18, 18, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 17, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 17, 18, nil, nil, nil, nil, nil, nil, nil, nil, + 35, nil, nil, nil, 17, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 18, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 17, nil, + nil, 35, 35, nil, nil, nil, 17, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 17, + nil, nil, 35, 35, 17 ] + +racc_goto_pointer = [ + nil, 33, 43, 37, nil, nil, nil, 15, 12, -16, + 29, 26, -7, nil, -24, -57, -204, -16, -81, nil, + nil, nil, nil, nil, nil, nil, nil, 33, 34, nil, + nil, nil, -14, nil, nil, -22, -10, nil, 30, -8, + -5, -20, -36, nil, nil, nil, -78, nil, -10, nil, + nil, -24, -160, nil, nil, -10, -63, -62, -135, 27, + nil, 0, -145, 17, nil, nil, nil, nil, -230, -273, + -84, nil, nil, -258, -105, nil, nil, -179, nil, nil, + nil, -199, -168, nil, -313, nil ] + +racc_goto_default = [ + nil, nil, nil, nil, 5, 6, 7, 8, nil, nil, + 172, nil, nil, 71, nil, nil, 72, nil, nil, 180, + 12, 13, 14, 15, 16, 17, 18, nil, nil, 19, + 21, 22, nil, 79, 80, 179, 176, 24, nil, nil, + nil, nil, nil, 93, 95, 96, 111, 26, nil, 99, + 100, nil, 101, 102, 28, 30, 32, 33, 34, nil, + 35, 36, nil, 40, 41, 42, 43, 44, nil, 305, + 110, 109, 112, nil, nil, 171, 173, 174, 175, 177, + 178, 182, nil, 269, 270, 189 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 63, :_reduce_1, + 2, 61, :_reduce_2, + 2, 62, :_reduce_none, + 2, 62, :_reduce_none, + 2, 62, :_reduce_none, + 1, 62, :_reduce_none, + 1, 62, :_reduce_none, + 1, 62, :_reduce_none, + 1, 62, :_reduce_none, + 0, 62, :_reduce_none, + 3, 64, :_reduce_11, + 4, 65, :_reduce_12, + 3, 65, :_reduce_13, + 2, 68, :_reduce_none, + 1, 68, :_reduce_15, + 1, 68, :_reduce_16, + 4, 66, :_reduce_17, + 3, 66, :_reduce_18, + 3, 69, :_reduce_19, + 1, 69, :_reduce_20, + 1, 71, :_reduce_21, + 3, 71, :_reduce_22, + 0, 71, :_reduce_23, + 3, 72, :_reduce_24, + 2, 72, :_reduce_25, + 1, 73, :_reduce_26, + 1, 73, :_reduce_27, + 0, 73, :_reduce_28, + 1, 74, :_reduce_29, + 5, 76, :_reduce_30, + 8, 76, :_reduce_31, + 1, 77, :_reduce_32, + 0, 77, :_reduce_33, + 3, 75, :_reduce_34, + 0, 75, :_reduce_35, + 1, 79, :_reduce_36, + 2, 67, :_reduce_none, + 2, 67, :_reduce_none, + 2, 67, :_reduce_none, + 2, 67, :_reduce_none, + 1, 67, :_reduce_none, + 1, 67, :_reduce_none, + 1, 67, :_reduce_none, + 1, 67, :_reduce_none, + 1, 81, :_reduce_none, + 1, 81, :_reduce_none, + 1, 81, :_reduce_none, + 1, 87, :_reduce_none, + 1, 87, :_reduce_none, + 3, 84, :_reduce_50, + 3, 89, :_reduce_51, + 3, 85, :_reduce_52, + 2, 85, :_reduce_53, + 3, 90, :_reduce_54, + 1, 91, :_reduce_55, + 3, 92, :_reduce_56, + 1, 92, :_reduce_57, + 1, 93, :_reduce_none, + 1, 93, :_reduce_none, + 1, 93, :_reduce_none, + 3, 86, :_reduce_61, + 2, 86, :_reduce_62, + 3, 97, :_reduce_63, + 1, 98, :_reduce_64, + 1, 98, :_reduce_65, + 1, 98, :_reduce_66, + 1, 102, :_reduce_67, + 1, 102, :_reduce_68, + 1, 102, :_reduce_69, + 3, 101, :_reduce_70, + 1, 101, :_reduce_71, + 2, 99, :_reduce_72, + 1, 100, :_reduce_none, + 1, 100, :_reduce_none, + 3, 104, :_reduce_75, + 3, 104, :_reduce_76, + 3, 105, :_reduce_77, + 3, 105, :_reduce_78, + 3, 103, :_reduce_79, + 4, 103, :_reduce_80, + 3, 82, :_reduce_none, + 2, 82, :_reduce_none, + 3, 107, :_reduce_83, + 2, 108, :_reduce_none, + 1, 108, :_reduce_none, + 3, 109, :_reduce_86, + 2, 109, :_reduce_87, + 2, 110, :_reduce_88, + 0, 112, :_reduce_none, + 3, 112, :_reduce_90, + 1, 112, :_reduce_none, + 1, 113, :_reduce_none, + 1, 113, :_reduce_93, + 3, 83, :_reduce_94, + 2, 83, :_reduce_95, + 2, 114, :_reduce_96, + 3, 80, :_reduce_97, + 2, 80, :_reduce_98, + 1, 88, :_reduce_99, + 2, 115, :_reduce_100, + 2, 115, :_reduce_101, + 3, 116, :_reduce_102, + 1, 116, :_reduce_103, + 3, 117, :_reduce_104, + 1, 117, :_reduce_none, + 1, 119, :_reduce_106, + 1, 119, :_reduce_107, + 1, 119, :_reduce_108, + 1, 119, :_reduce_109, + 2, 118, :_reduce_110, + 1, 118, :_reduce_111, + 1, 118, :_reduce_112, + 3, 122, :_reduce_113, + 1, 122, :_reduce_none, + 1, 123, :_reduce_115, + 3, 123, :_reduce_116, + 2, 123, :_reduce_117, + 3, 123, :_reduce_118, + 1, 120, :_reduce_119, + 1, 120, :_reduce_120, + 2, 120, :_reduce_121, + 3, 120, :_reduce_122, + 3, 120, :_reduce_123, + 1, 121, :_reduce_124, + 1, 121, :_reduce_125, + 1, 121, :_reduce_126, + 1, 121, :_reduce_127, + 2, 121, :_reduce_128, + 2, 121, :_reduce_129, + 2, 121, :_reduce_130, + 2, 121, :_reduce_131, + 1, 124, :_reduce_132, + 2, 125, :_reduce_133, + 5, 126, :_reduce_134, + 5, 126, :_reduce_135, + 5, 126, :_reduce_136, + 5, 126, :_reduce_137, + 5, 126, :_reduce_138, + 5, 126, :_reduce_139, + 5, 126, :_reduce_140, + 5, 126, :_reduce_141, + 5, 126, :_reduce_142, + 5, 126, :_reduce_143, + 5, 126, :_reduce_144, + 5, 126, :_reduce_145, + 3, 126, :_reduce_146, + 2, 127, :_reduce_147, + 3, 127, :_reduce_148, + 3, 127, :_reduce_149, + 4, 127, :_reduce_150, + 4, 127, :_reduce_151, + 2, 127, :_reduce_152, + 4, 127, :_reduce_153, + 6, 127, :_reduce_154, + 7, 127, :_reduce_155, + 0, 128, :_reduce_none, + 1, 128, :_reduce_none, + 1, 129, :_reduce_none, + 3, 129, :_reduce_none, + 1, 130, :_reduce_none, + 2, 130, :_reduce_none, + 3, 111, :_reduce_none, + 2, 111, :_reduce_none, + 2, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 111, :_reduce_none, + 1, 131, :_reduce_167, + 4, 106, :_reduce_168, + 5, 106, :_reduce_169, + 5, 106, :_reduce_170, + 6, 106, :_reduce_171, + 1, 133, :_reduce_172, + 0, 133, :_reduce_173, + 1, 132, :_reduce_174, + 2, 132, :_reduce_175, + 1, 132, :_reduce_176, + 1, 134, :_reduce_none, + 1, 134, :_reduce_none, + 1, 134, :_reduce_none, + 3, 78, :_reduce_180, + 2, 78, :_reduce_181, + 1, 78, :_reduce_182, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 1, 135, :_reduce_none, + 2, 95, :_reduce_194, + 3, 95, :_reduce_195, + 2, 95, :_reduce_196, + 2, 94, :_reduce_197, + 1, 94, :_reduce_198, + 3, 141, :_reduce_none, + 1, 141, :_reduce_none, + 4, 140, :_reduce_201, + 1, 142, :_reduce_none, + 3, 142, :_reduce_203, + 3, 142, :_reduce_204, + 1, 143, :_reduce_none, + 4, 143, :_reduce_206, + 4, 143, :_reduce_207, + 1, 144, :_reduce_208, + 1, 144, :_reduce_209, + 3, 144, :_reduce_210, + 2, 139, :_reduce_211, + 1, 139, :_reduce_212, + 2, 96, :_reduce_213, + 1, 96, :_reduce_214, + 2, 138, :_reduce_215, + 1, 138, :_reduce_216, + 2, 137, :_reduce_217, + 1, 137, :_reduce_218, + 1, 137, :_reduce_219, + 1, 137, :_reduce_220, + 1, 137, :_reduce_221, + 1, 137, :_reduce_222, + 1, 137, :_reduce_223, + 1, 136, :_reduce_224, + 1, 145, :_reduce_225, + 1, 145, :_reduce_226, + 2, 70, :_reduce_227, + 1, 70, :_reduce_228 ] + +racc_reduce_n = 229 + +racc_shift_n = 360 + +racc_token_table = { + false => 0, + :error => 1, + :CHARSET_SYM => 2, + :IMPORT_SYM => 3, + :STRING => 4, + :SEMI => 5, + :IDENT => 6, + :S => 7, + :COMMA => 8, + :LBRACE => 9, + :RBRACE => 10, + :STAR => 11, + :HASH => 12, + :LSQUARE => 13, + :RSQUARE => 14, + :EQUAL => 15, + :INCLUDES => 16, + :DASHMATCH => 17, + :LPAREN => 18, + :RPAREN => 19, + :FUNCTION => 20, + :GREATER => 21, + :PLUS => 22, + :SLASH => 23, + :NUMBER => 24, + :MINUS => 25, + :LENGTH => 26, + :PERCENTAGE => 27, + :ANGLE => 28, + :TIME => 29, + :FREQ => 30, + :URI => 31, + :IMPORTANT_SYM => 32, + :MEDIA_SYM => 33, + :NOT => 34, + :ONLY => 35, + :AND => 36, + :NTH_PSEUDO_CLASS => 37, + :DOCUMENT_QUERY_SYM => 38, + :FUNCTION_NO_QUOTE => 39, + :TILDE => 40, + :PREFIXMATCH => 41, + :SUFFIXMATCH => 42, + :SUBSTRINGMATCH => 43, + :NOT_PSEUDO_CLASS => 44, + :KEYFRAMES_SYM => 45, + :MATCHES_PSEUDO_CLASS => 46, + :NAMESPACE_SYM => 47, + :MOZ_PSEUDO_ELEMENT => 48, + :RESOLUTION => 49, + :COLON => 50, + :SUPPORTS_SYM => 51, + :OR => 52, + :VARIABLE_NAME => 53, + :CALC_SYM => 54, + :FONTFACE_SYM => 55, + :UNICODE_RANGE => 56, + :RATIO => 57, + "|" => 58, + "." => 59 } + +racc_nt_base = 60 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "CHARSET_SYM", + "IMPORT_SYM", + "STRING", + "SEMI", + "IDENT", + "S", + "COMMA", + "LBRACE", + "RBRACE", + "STAR", + "HASH", + "LSQUARE", + "RSQUARE", + "EQUAL", + "INCLUDES", + "DASHMATCH", + "LPAREN", + "RPAREN", + "FUNCTION", + "GREATER", + "PLUS", + "SLASH", + "NUMBER", + "MINUS", + "LENGTH", + "PERCENTAGE", + "ANGLE", + "TIME", + "FREQ", + "URI", + "IMPORTANT_SYM", + "MEDIA_SYM", + "NOT", + "ONLY", + "AND", + "NTH_PSEUDO_CLASS", + "DOCUMENT_QUERY_SYM", + "FUNCTION_NO_QUOTE", + "TILDE", + "PREFIXMATCH", + "SUFFIXMATCH", + "SUBSTRINGMATCH", + "NOT_PSEUDO_CLASS", + "KEYFRAMES_SYM", + "MATCHES_PSEUDO_CLASS", + "NAMESPACE_SYM", + "MOZ_PSEUDO_ELEMENT", + "RESOLUTION", + "COLON", + "SUPPORTS_SYM", + "OR", + "VARIABLE_NAME", + "CALC_SYM", + "FONTFACE_SYM", + "UNICODE_RANGE", + "RATIO", + "\"|\"", + "\".\"", + "$start", + "document", + "stylesheet", + "@1", + "charset", + "import", + "namespace", + "body", + "import_location", + "medium", + "ident", + "media_query_list", + "media_query", + "optional_only_or_not", + "media_type", + "optional_and_exprs", + "media_expr", + "optional_space", + "expr", + "resolution", + "ruleset", + "conditional_rule", + "keyframes_rule", + "fontface_rule", + "media", + "document_query", + "supports", + "body_in_media", + "empty_ruleset", + "start_media", + "start_document_query", + "start_document_query_pos", + "url_match_fns", + "url_match_fn", + "function_no_quote", + "function", + "uri", + "start_supports", + "supports_condition_root", + "supports_negation", + "supports_conjunction_or_disjunction", + "supports_condition_in_parens", + "supports_condition", + "supports_declaration_condition", + "supports_conjunction", + "supports_disjunction", + "declaration_internal", + "start_keyframes_rule", + "keyframes_blocks", + "keyframes_block", + "start_keyframes_block", + "declarations", + "keyframes_selectors", + "keyframes_selector", + "start_fontface_rule", + "start_selector", + "selectors", + "selector", + "simple_selector", + "combinator", + "element_name", + "hcap", + "simple_selectors", + "ident_with_namespace", + "hash", + "class", + "attrib", + "pseudo", + "any_number_of_idents", + "multiple_idents", + "one_or_more_semis", + "declaration", + "property", + "prio", + "operator", + "term", + "ratio", + "numeric", + "string", + "hexcolor", + "calc", + "uranges", + "calc_sum", + "calc_product", + "calc_value", + "unary_operator" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'csspool.y', 26) + def _reduce_1(val, _values, result) + @handler.start_document + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 28) + def _reduce_2(val, _values, result) + @handler.end_document + result + end +.,., + +# reduce 3 omitted + +# reduce 4 omitted + +# reduce 5 omitted + +# reduce 6 omitted + +# reduce 7 omitted + +# reduce 8 omitted + +# reduce 9 omitted + +# reduce 10 omitted + +module_eval(<<'.,.,', 'csspool.y', 41) + def _reduce_11(val, _values, result) + @handler.charset interpret_string(val[1]), {} + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 45) + def _reduce_12(val, _values, result) + @handler.import_style val[2], val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 48) + def _reduce_13(val, _values, result) + @handler.import_style [], val[1] + + result + end +.,., + +# reduce 14 omitted + +module_eval(<<'.,.,', 'csspool.y', 53) + def _reduce_15(val, _values, result) + result = Terms::String.new interpret_string val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 54) + def _reduce_16(val, _values, result) + result = Terms::URI.new interpret_uri val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 58) + def _reduce_17(val, _values, result) + @handler.namespace val[1], val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 61) + def _reduce_18(val, _values, result) + @handler.namespace nil, val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 66) + def _reduce_19(val, _values, result) + result = val[0] << MediaType.new(val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 69) + def _reduce_20(val, _values, result) + result = [MediaType.new(val[0])] + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 73) + def _reduce_21(val, _values, result) + result = MediaQueryList.new([ val[0] ]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 74) + def _reduce_22(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 75) + def _reduce_23(val, _values, result) + result = MediaQueryList.new + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 78) + def _reduce_24(val, _values, result) + result = MediaQuery.new(val[0], val[1], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 79) + def _reduce_25(val, _values, result) + result = MediaQuery.new(nil, val[0], val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 82) + def _reduce_26(val, _values, result) + result = :only + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 83) + def _reduce_27(val, _values, result) + result = :not + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 84) + def _reduce_28(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 87) + def _reduce_29(val, _values, result) + result = MediaType.new(val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 90) + def _reduce_30(val, _values, result) + result = MediaType.new(val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 91) + def _reduce_31(val, _values, result) + result = MediaFeature.new(val[2], val[6][0]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 94) + def _reduce_32(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 95) + def _reduce_33(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 98) + def _reduce_34(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 99) + def _reduce_35(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 103) + def _reduce_36(val, _values, result) + unit = val.first.gsub(/[\s\d.]/, '') + number = numeric(val.first) + result = Terms::Resolution.new(number, unit) + + result + end +.,., + +# reduce 37 omitted + +# reduce 38 omitted + +# reduce 39 omitted + +# reduce 40 omitted + +# reduce 41 omitted + +# reduce 42 omitted + +# reduce 43 omitted + +# reduce 44 omitted + +# reduce 45 omitted + +# reduce 46 omitted + +# reduce 47 omitted + +# reduce 48 omitted + +# reduce 49 omitted + +module_eval(<<'.,.,', 'csspool.y', 128) + def _reduce_50(val, _values, result) + @handler.end_media val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 132) + def _reduce_51(val, _values, result) + result = val[1] + @handler.start_media result + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 137) + def _reduce_52(val, _values, result) + @handler.end_document_query(before_pos(val), after_pos(val)) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 138) + def _reduce_53(val, _values, result) + @handler.end_document_query(before_pos(val), after_pos(val)) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 142) + def _reduce_54(val, _values, result) + @handler.start_document_query(val[1], after_pos(val)) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 147) + def _reduce_55(val, _values, result) + @handler.node_start_pos = before_pos(val) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 152) + def _reduce_56(val, _values, result) + result = [val[0], val[2]].flatten + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 155) + def _reduce_57(val, _values, result) + result = val + + result + end +.,., + +# reduce 58 omitted + +# reduce 59 omitted + +# reduce 60 omitted + +module_eval(<<'.,.,', 'csspool.y', 164) + def _reduce_61(val, _values, result) + @handler.end_supports + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 165) + def _reduce_62(val, _values, result) + @handler.end_supports + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 169) + def _reduce_63(val, _values, result) + @handler.start_supports val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 173) + def _reduce_64(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 174) + def _reduce_65(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 175) + def _reduce_66(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 178) + def _reduce_67(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 179) + def _reduce_68(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 180) + def _reduce_69(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 183) + def _reduce_70(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 184) + def _reduce_71(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 187) + def _reduce_72(val, _values, result) + result = val.join('') + result + end +.,., + +# reduce 73 omitted + +# reduce 74 omitted + +module_eval(<<'.,.,', 'csspool.y', 194) + def _reduce_75(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 195) + def _reduce_76(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 198) + def _reduce_77(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 199) + def _reduce_78(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 202) + def _reduce_79(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 203) + def _reduce_80(val, _values, result) + result = val.join('') + result + end +.,., + +# reduce 81 omitted + +# reduce 82 omitted + +module_eval(<<'.,.,', 'csspool.y', 211) + def _reduce_83(val, _values, result) + @handler.start_keyframes_rule val[1] + + result + end +.,., + +# reduce 84 omitted + +# reduce 85 omitted + +module_eval(<<'.,.,', 'csspool.y', 219) + def _reduce_86(val, _values, result) + @handler.end_keyframes_block + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 220) + def _reduce_87(val, _values, result) + @handler.end_keyframes_block + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 224) + def _reduce_88(val, _values, result) + @handler.start_keyframes_block val[0] + + result + end +.,., + +# reduce 89 omitted + +module_eval(<<'.,.,', 'csspool.y', 229) + def _reduce_90(val, _values, result) + result = val[0] + ', ' + val[2] + + result + end +.,., + +# reduce 91 omitted + +# reduce 92 omitted + +module_eval(<<'.,.,', 'csspool.y', 235) + def _reduce_93(val, _values, result) + result = val[0].strip + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 238) + def _reduce_94(val, _values, result) + @handler.end_fontface_rule + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 239) + def _reduce_95(val, _values, result) + @handler.end_fontface_rule + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 243) + def _reduce_96(val, _values, result) + @handler.start_fontface_rule + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 248) + def _reduce_97(val, _values, result) + @handler.end_selector val.first + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 251) + def _reduce_98(val, _values, result) + @handler.end_selector val.first + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 256) + def _reduce_99(val, _values, result) + start = @handler.start_selector([]) + @handler.end_selector(start) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 261) + def _reduce_100(val, _values, result) + result = val.last + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 263) + def _reduce_101(val, _values, result) + @handler.start_selector val.first + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 269) + def _reduce_102(val, _values, result) + sel = Selector.new(val.first, {}) + result = [sel].concat(val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 274) + def _reduce_103(val, _values, result) + result = [Selector.new(val.first, {})] + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 280) + def _reduce_104(val, _values, result) + val.flatten! + val[2].combinator = val.delete_at 1 + result = val + + result + end +.,., + +# reduce 105 omitted + +module_eval(<<'.,.,', 'csspool.y', 287) + def _reduce_106(val, _values, result) + result = :s + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 288) + def _reduce_107(val, _values, result) + result = :> + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 289) + def _reduce_108(val, _values, result) + result = :+ + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 290) + def _reduce_109(val, _values, result) + result = :~ + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 294) + def _reduce_110(val, _values, result) + selector = val.first + selector.additional_selectors = val.last + result = [selector] + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 298) + def _reduce_111(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 301) + def _reduce_112(val, _values, result) + ss = Selectors::Simple.new nil, nil + ss.additional_selectors = val.flatten + result = [ss] + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 307) + def _reduce_113(val, _values, result) + result = [val[0], val[2]].flatten + result + end +.,., + +# reduce 114 omitted + +module_eval(<<'.,.,', 'csspool.y', 311) + def _reduce_115(val, _values, result) + result = [interpret_identifier(val[0]), nil] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 312) + def _reduce_116(val, _values, result) + result = [interpret_identifier(val[2]), interpret_identifier(val[0])] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 313) + def _reduce_117(val, _values, result) + result = [interpret_identifier(val[1]), nil] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 314) + def _reduce_118(val, _values, result) + result = [interpret_identifier(val[2]), '*'] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 317) + def _reduce_119(val, _values, result) + result = Selectors::Type.new val.first[0], nil, val.first[1] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 318) + def _reduce_120(val, _values, result) + result = Selectors::Universal.new val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 319) + def _reduce_121(val, _values, result) + result = Selectors::Universal.new val[1] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 320) + def _reduce_122(val, _values, result) + result = Selectors::Universal.new val[2], nil, val[0] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 321) + def _reduce_123(val, _values, result) + result = Selectors::Universal.new val[2], nil, interpret_identifier(val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 324) + def _reduce_124(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 325) + def _reduce_125(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 326) + def _reduce_126(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 327) + def _reduce_127(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 328) + def _reduce_128(val, _values, result) + result = val.flatten + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 329) + def _reduce_129(val, _values, result) + result = val.flatten + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 330) + def _reduce_130(val, _values, result) + result = val.flatten + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 331) + def _reduce_131(val, _values, result) + result = val.flatten + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 335) + def _reduce_132(val, _values, result) + result = Selectors::Id.new interpret_identifier val.first.sub(/^#/, '') + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 339) + def _reduce_133(val, _values, result) + result = Selectors::Class.new interpret_identifier val.last + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 344) + def _reduce_134(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::EQUALS, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 352) + def _reduce_135(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::EQUALS, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 360) + def _reduce_136(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::INCLUDES, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 368) + def _reduce_137(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::INCLUDES, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 376) + def _reduce_138(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::DASHMATCH, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 384) + def _reduce_139(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::DASHMATCH, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 392) + def _reduce_140(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::PREFIXMATCH, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 400) + def _reduce_141(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::PREFIXMATCH, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 408) + def _reduce_142(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::SUFFIXMATCH, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 416) + def _reduce_143(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::SUFFIXMATCH, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 424) + def _reduce_144(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_identifier(val[3]), + Selectors::Attribute::SUBSTRINGMATCH, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 432) + def _reduce_145(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + interpret_string(val[3]), + Selectors::Attribute::SUBSTRINGMATCH, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 440) + def _reduce_146(val, _values, result) + result = Selectors::Attribute.new( + val[1][0], + nil, + Selectors::Attribute::SET, + val[1][1] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 450) + def _reduce_147(val, _values, result) + result = Selectors::pseudo interpret_identifier(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 453) + def _reduce_148(val, _values, result) + result = Selectors::PseudoElement.new( + interpret_identifier(val[2]) + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 458) + def _reduce_149(val, _values, result) + result = Selectors::PseudoClass.new( + interpret_identifier(val[1].sub(/\($/, '')), + '' + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 464) + def _reduce_150(val, _values, result) + result = Selectors::PseudoClass.new( + interpret_identifier(val[1].sub(/\($/, '')), + interpret_identifier(val[2]) + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 470) + def _reduce_151(val, _values, result) + result = Selectors::PseudoClass.new( + 'not', + val[2].first.to_s + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 476) + def _reduce_152(val, _values, result) + result = Selectors::PseudoClass.new( + interpret_identifier(val[1].sub(/\(.*/, '')), + interpret_identifier(val[1].sub(/.*\(/, '').sub(/\).*/, '')) + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 482) + def _reduce_153(val, _values, result) + result = Selectors::PseudoClass.new( + val[1].split('(').first.strip, + val[2].join(', ') + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 488) + def _reduce_154(val, _values, result) + result = Selectors::PseudoElement.new( + interpret_identifier(val[1].sub(/\($/, '')) + ) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 493) + def _reduce_155(val, _values, result) + result = Selectors::PseudoElement.new( + interpret_identifier(val[2].sub(/\($/, '')) + ) + + result + end +.,., + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +module_eval(<<'.,.,', 'csspool.y', 519) + def _reduce_167(val, _values, result) + @handler.property val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 523) + def _reduce_168(val, _values, result) + result = Declaration.new(val.first, val[2], val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 525) + def _reduce_169(val, _values, result) + result = Declaration.new(val.first, val[3], val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 527) + def _reduce_170(val, _values, result) + result = Declaration.new(val.first, val[3], val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 529) + def _reduce_171(val, _values, result) + result = Declaration.new(val.first, val[4], val[5]) + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 532) + def _reduce_172(val, _values, result) + result = true + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 533) + def _reduce_173(val, _values, result) + result = false + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 536) + def _reduce_174(val, _values, result) + result = interpret_identifier val[0] + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 537) + def _reduce_175(val, _values, result) + result = interpret_identifier val.join + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 538) + def _reduce_176(val, _values, result) + result = interpret_identifier val[0] + result + end +.,., + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +module_eval(<<'.,.,', 'csspool.y', 547) + def _reduce_180(val, _values, result) + result = [val.first, val.last].flatten + val.last.first.operator = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 550) + def _reduce_181(val, _values, result) + result = val.flatten + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 551) + def _reduce_182(val, _values, result) + result = val + result + end +.,., + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +module_eval(<<'.,.,', 'csspool.y', 567) + def _reduce_194(val, _values, result) + result = val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 569) + def _reduce_195(val, _values, result) + name = interpret_identifier val.first.sub(/\($/, '') + if name == 'rgb' + result = Terms::Rgb.new(*val[1]) + else + result = Terms::Function.new name, val[1] + end + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 577) + def _reduce_196(val, _values, result) + name = interpret_identifier val.first.sub(/\($/, '') + result = Terms::Function.new name + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 582) + def _reduce_197(val, _values, result) + result = val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 584) + def _reduce_198(val, _values, result) + parts = val.first.split('(') + name = interpret_identifier parts.first + result = Terms::Function.new(name, [Terms::String.new(interpret_string_no_quote(parts.last))]) + + result + end +.,., + +# reduce 199 omitted + +# reduce 200 omitted + +module_eval(<<'.,.,', 'csspool.y', 595) + def _reduce_201(val, _values, result) + result = Terms::Math.new(val.first.split('(').first, val[1]) + + result + end +.,., + +# reduce 202 omitted + +module_eval(<<'.,.,', 'csspool.y', 601) + def _reduce_203(val, _values, result) + val.insert(1, ' '); result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 602) + def _reduce_204(val, _values, result) + val.insert(1, ' '); result = val.join('') + result + end +.,., + +# reduce 205 omitted + +module_eval(<<'.,.,', 'csspool.y', 606) + def _reduce_206(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 607) + def _reduce_207(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 610) + def _reduce_208(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 611) + def _reduce_209(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 612) + def _reduce_210(val, _values, result) + result = val.join('') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 615) + def _reduce_211(val, _values, result) + result = val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 616) + def _reduce_212(val, _values, result) + result = Terms::Hash.new val.first.sub(/^#/, '') + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 619) + def _reduce_213(val, _values, result) + result = val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 620) + def _reduce_214(val, _values, result) + result = Terms::URI.new interpret_uri val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 623) + def _reduce_215(val, _values, result) + result = val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 624) + def _reduce_216(val, _values, result) + result = Terms::String.new interpret_string val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 628) + def _reduce_217(val, _values, result) + result = val[1] + val[1].unary_operator = val.first + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 632) + def _reduce_218(val, _values, result) + result = Terms::Number.new numeric val.first + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 635) + def _reduce_219(val, _values, result) + result = Terms::Number.new numeric(val.first), nil, '%' + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 638) + def _reduce_220(val, _values, result) + unit = val.first.gsub(/[\s\d.]/, '') + result = Terms::Number.new numeric(val.first), nil, unit + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 642) + def _reduce_221(val, _values, result) + unit = val.first.gsub(/[\s\d.]/, '') + result = Terms::Number.new numeric(val.first), nil, unit + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 646) + def _reduce_222(val, _values, result) + unit = val.first.gsub(/[\s\d.]/, '') + result = Terms::Number.new numeric(val.first), nil, unit + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 650) + def _reduce_223(val, _values, result) + unit = val.first.gsub(/[\s\d.]/, '') + result = Terms::Number.new numeric(val.first), nil, unit + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 656) + def _reduce_224(val, _values, result) + result = Terms::Ratio.new(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 660) + def _reduce_225(val, _values, result) + result = :minus + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 661) + def _reduce_226(val, _values, result) + result = :plus + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 664) + def _reduce_227(val, _values, result) + result = val.first + result + end +.,., + +module_eval(<<'.,.,', 'csspool.y', 665) + def _reduce_228(val, _values, result) + result = Terms::Ident.new interpret_identifier val.first + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser + end # module CSS +end # module CSSPool diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/edtf b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/edtf new file mode 100644 index 000000000000..5947931260a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/edtf @@ -0,0 +1,1794 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + +require 'strscan' + +module EDTF + class Parser < Racc::Parser + +module_eval(<<'...end edtf.y/module_eval...', 'edtf.y', 468) + + @defaults = { + :level => 2, + :debug => false + }.freeze + + class << self; attr_reader :defaults; end + + attr_reader :options + + def initialize(options = {}) + @options = Parser.defaults.merge(options) + end + + def debug? + !!(options[:debug] || ENV['DEBUG']) + end + + def parse(input) + parse!(input) + rescue => e + warn e.message if debug? + nil + end + + def parse!(input) + @yydebug = debug? + @src = StringScanner.new(input) + do_parse + end + + def on_error(tid, value, stack) + raise ArgumentError, + "failed to parse date: unexpected '#{value}' at #{stack.inspect}" + end + + def apply_uncertainty(date, uncertainty, scope = nil) + uncertainty.each do |u| + scope.nil? ? date.send(u) : date.send(u, scope) + end + date + end + + alias uoa apply_uncertainty + + def next_token + case + when @src.eos? + nil + # when @src.scan(/\s+/) + # ignore whitespace + when @src.scan(/\(/) + ['(', @src.matched] + # when @src.scan(/\)\?~-/) + # [:PUA, [:uncertain!, :approximate!]] + # when @src.scan(/\)\?-/) + # [:PUA, [:uncertain!]] + # when @src.scan(/\)~-/) + # [:PUA, [:approximate!]] + when @src.scan(/\)/) + [')', @src.matched] + when @src.scan(/\[/) + ['[', @src.matched] + when @src.scan(/\]/) + [']', @src.matched] + when @src.scan(/\{/) + ['{', @src.matched] + when @src.scan(/\}/) + ['}', @src.matched] + when @src.scan(/T/) + [:T, @src.matched] + when @src.scan(/Z/) + [:Z, @src.matched] + when @src.scan(/\?~/) + [:UA, [:uncertain!, :approximate!]] + when @src.scan(/\?/) + [:UA, [:uncertain!]] + when @src.scan(/~/) + [:UA, [:approximate!]] + when @src.scan(/open/i) + [:OPEN, :open] + when @src.scan(/unkn?own/i) # matches 'unkown' typo too + [:UNKNOWN, :unknown] + when @src.scan(/u/) + [:U, @src.matched] + when @src.scan(/x/i) + [:X, @src.matched] + when @src.scan(/y/) + [:LONGYEAR, @src.matched] + when @src.scan(/e/) + [:E, @src.matched] + when @src.scan(/\+/) + ['+', @src.matched] + when @src.scan(/-\(/) + ['-(', @src.matched] + when @src.scan(/-/) + ['-', @src.matched] + when @src.scan(/:/) + [':', @src.matched] + when @src.scan(/\//) + ['/', @src.matched] + when @src.scan(/\s*\.\.\s*/) + [:DOTS, '..'] + when @src.scan(/\s*,\s*/) + [',', ','] + when @src.scan(/\^\w+/) + ['^', @src.matched[1..-1]] + when @src.scan(/\d/) + [@src.matched, @src.matched.to_i] + else @src.scan(/./) + [:UNMATCHED, @src.rest] + end + end + + +# -*- racc -*- +...end edtf.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 129, 128, 52, 111, 51, 112, 149, 208, 207, 57, + -50, 43, 45, 40, 55, 42, 54, 44, 43, 45, + 40, -48, 42, 53, 44, 64, 58, 46, 47, 48, + 49, 50, 128, 56, 46, 47, 48, 49, 50, 207, + 57, 65, 43, 45, 40, 55, 42, 157, 44, 43, + 45, 40, 55, 42, 214, 44, 92, 58, 46, 47, + 48, 49, 50, 66, 56, 46, 47, 48, 49, 50, + 25, 56, 26, 93, 94, 67, 108, 12, -65, 43, + 45, 40, -66, 42, 159, 44, 110, 33, 111, 34, + 112, 95, 36, 25, 141, 46, 47, 48, 49, 50, + 12, 58, 43, 45, 40, 101, 42, 103, 44, 104, + 96, 148, 55, 133, 147, 36, 124, 125, 46, 47, + 48, 49, 50, 87, 165, 111, 12, 112, 43, 45, + 40, 56, 42, 146, 44, 166, 111, 150, 112, 218, + 167, 36, 152, 153, 46, 47, 48, 49, 50, 87, + 108, 111, 12, 112, 43, 45, 40, 188, 42, 186, + 44, 187, 111, 190, 112, 154, 111, 36, 112, 156, + 46, 47, 48, 49, 50, 69, 158, 43, 45, 189, + 191, 42, 12, 44, 43, 45, 40, 200, 42, 201, + 44, 168, 177, 46, 47, 48, 49, 50, 233, 178, + 46, 47, 48, 49, 50, 12, 180, 43, 45, 40, + 111, 42, 112, 44, 232, 234, 111, 240, 112, 239, + 36, 192, 193, 46, 47, 48, 49, 50, 12, 202, + 43, 45, 40, 118, 42, 117, 44, 104, 118, 121, + 117, 209, 104, 36, 121, 210, 46, 47, 48, 49, + 50, 12, 212, 43, 45, 40, 244, 42, 239, 44, + 213, 43, 45, 40, 215, 42, 36, 44, 229, 46, + 47, 48, 49, 50, 180, 180, 236, 46, 47, 48, + 49, 50, 43, 45, 40, 253, 42, 254, 44, 43, + 45, 40, 255, 42, 258, 44, 261, 264, 46, 47, + 48, 49, 50, 124, 125, 46, 47, 48, 49, 50, + 43, 45, 40, 265, 42, 192, 44, 43, 45, 266, + 269, 42, 270, 44, 275, 280, 46, 47, 48, 49, + 50, 284, 285, 46, 47, 48, 49, 50, 43, 45, + 40, 286, 42, 290, 44, 43, 45, 292, 293, 42, + 295, 44, 296, 297, 46, 47, 48, 49, 50, 300, + 301, 46, 47, 48, 49, 50, 43, 45, 40, 180, + 42, 303, 44, 43, 45, 40, 304, 42, 305, 44, + 281, 306, 46, 47, 48, 49, 50, 307, 308, 46, + 47, 48, 49, 50, 43, 45, 175, 311, 42, 312, + 44, 43, 45, 40, 313, 42, 314, 44, 316, 317, + 46, 47, 48, 49, 50, 318, 319, 46, 47, 48, + 49, 50, 43, 45, nil, nil, 42, nil, 44, 43, + 45, nil, nil, 42, nil, 44, nil, nil, 46, 47, + 48, 49, 50, nil, nil, 46, 47, 48, 49, 50, + 172, 194, 170, nil, 171, nil, 173, 43, 45, 40, + nil, 42, nil, 44, nil, nil, 195, 196, 197, 198, + 199, nil, nil, 46, 47, 48, 49, 50, 43, 45, + 40, nil, 42, nil, 44, 43, 45, 40, nil, 42, + nil, 44, nil, nil, 46, 47, 48, 49, 50, nil, + nil, 46, 47, 48, 49, 50, 43, 45, 40, nil, + 42, nil, 44, 43, 45, nil, nil, 42, nil, 44, + nil, nil, 46, 47, 48, 49, 50, nil, nil, 46, + 47, 48, 49, 50, 43, 45, 40, nil, 42, nil, + 44, 43, 45, 40, nil, 42, nil, 44, nil, nil, + 46, 47, 48, 49, 50, nil, nil, 46, 47, 48, + 49, 50, 43, 45, 40, nil, 42, nil, 44, 43, + 45, 40, nil, 42, nil, 44, nil, nil, 46, 47, + 48, 49, 50, nil, nil, 46, 47, 48, 49, 50, + 43, 45, nil, nil, 42, nil, 44, 43, 45, 40, + nil, 42, nil, 44, nil, nil, 46, 47, 48, 49, + 50, nil, nil, 46, 47, 48, 49, 50, 43, 45, + 40, nil, 42, nil, 44, 43, 45, 273, nil, 42, + nil, 44, nil, nil, 46, 47, 48, 49, 50, nil, + nil, 46, 47, 48, 49, 50, 43, 45, 274, nil, + 42, nil, 44, 43, 45, 276, nil, 42, nil, 44, + nil, nil, 46, 47, 48, 49, 50, nil, nil, 46, + 47, 48, 49, 50, 43, 45, 40, nil, 42, nil, + 44, 43, 45, 40, nil, 42, nil, 44, nil, nil, + 46, 47, 48, 49, 50, nil, nil, 46, 47, 48, + 49, 50, 43, 45, 40, nil, 42, nil, 44, 43, + 45, 40, nil, 42, nil, 44, nil, nil, 46, 47, + 48, 49, 50, nil, nil, 46, 47, 48, 49, 50, + 43, 45, 40, nil, 42, nil, 44, 43, 45, 315, + nil, 42, nil, 44, nil, nil, 46, 47, 48, 49, + 50, 116, nil, 46, 47, 48, 49, 50, 118, 250, + 247, 118, 104, 117, 249, 104, 260, 121, nil, 281, + nil, nil, nil, nil, 251, nil, 118, 288, 117, 118, + 104, 117, 121, 104, 118, 121, 117, 118, 104, 117, + 121, 104, nil, 121, 118, 250, 247, nil, 104, nil, + 249, 118, 250, 247, nil, 104, nil, 249, nil, nil, + 251, nil, 118, 250, 117, nil, 104, 251, 249, 118, + 250, 310, nil, 104, nil, 249, nil, nil, 251, nil, + 172, 169, 170, nil, 171, 251, 173, 182, 184, nil, + 118, 181, 117, 183, 104, 118, 121, 117, 118, 104, + 117, 121, 104, 118, 121, 117, 118, 104, 117, 121, + 104, 118, 121, 117, nil, 104, nil, 121, 188, 271, + 186, 118, 187, 117, 272, 104, nil, 121 ] + +racc_action_check = [ + 63, 63, 5, 56, 1, 56, 73, 127, 127, 73, + 14, 63, 63, 63, 9, 63, 9, 63, 127, 127, + 127, 5, 127, 5, 127, 16, 73, 63, 63, 63, + 63, 63, 151, 9, 127, 127, 127, 127, 127, 224, + 10, 17, 151, 151, 151, 89, 151, 89, 151, 224, + 224, 224, 134, 224, 134, 224, 37, 10, 151, 151, + 151, 151, 151, 18, 89, 224, 224, 224, 224, 224, + 0, 134, 0, 37, 38, 22, 54, 0, 23, 0, + 0, 0, 24, 0, 91, 0, 54, 0, 54, 0, + 54, 38, 0, 67, 67, 0, 0, 0, 0, 0, + 67, 91, 67, 67, 67, 52, 67, 52, 67, 52, + 51, 72, 72, 66, 72, 67, 59, 60, 67, 67, + 67, 67, 67, 33, 98, 66, 33, 66, 33, 33, + 33, 72, 33, 71, 33, 98, 92, 74, 92, 147, + 98, 33, 77, 78, 33, 33, 33, 33, 33, 34, + 214, 147, 34, 147, 34, 34, 34, 112, 34, 112, + 34, 112, 214, 113, 214, 79, 93, 34, 93, 88, + 34, 34, 34, 34, 34, 26, 90, 26, 26, 113, + 113, 26, 87, 26, 87, 87, 87, 121, 87, 121, + 87, 99, 107, 26, 26, 26, 26, 26, 161, 108, + 87, 87, 87, 87, 87, 153, 109, 153, 153, 153, + 124, 153, 124, 153, 161, 161, 157, 166, 157, 166, + 153, 115, 116, 153, 153, 153, 153, 153, 154, 123, + 154, 154, 154, 58, 154, 58, 154, 58, 94, 58, + 94, 128, 94, 154, 94, 129, 154, 154, 154, 154, + 154, 265, 132, 265, 265, 265, 167, 265, 167, 265, + 133, 12, 12, 12, 144, 12, 265, 12, 158, 265, + 265, 265, 265, 265, 160, 162, 163, 12, 12, 12, + 12, 12, 13, 13, 13, 169, 13, 178, 13, 36, + 36, 36, 189, 36, 202, 36, 213, 218, 13, 13, + 13, 13, 13, 220, 222, 36, 36, 36, 36, 36, + 62, 62, 62, 225, 62, 230, 62, 64, 64, 232, + 236, 64, 238, 64, 245, 253, 62, 62, 62, 62, + 62, 256, 257, 64, 64, 64, 64, 64, 68, 68, + 68, 260, 68, 264, 68, 69, 69, 267, 268, 69, + 271, 69, 273, 274, 68, 68, 68, 68, 68, 280, + 281, 69, 69, 69, 69, 69, 70, 70, 70, 283, + 70, 284, 70, 75, 75, 75, 285, 75, 288, 75, + 290, 292, 70, 70, 70, 70, 70, 293, 295, 75, + 75, 75, 75, 75, 103, 103, 103, 300, 103, 304, + 103, 104, 104, 104, 307, 104, 308, 104, 311, 312, + 103, 103, 103, 103, 103, 313, 316, 104, 104, 104, + 104, 104, 111, 111, nil, nil, 111, nil, 111, 117, + 117, nil, nil, 117, nil, 117, nil, nil, 111, 111, + 111, 111, 111, nil, nil, 117, 117, 117, 117, 117, + 118, 118, 118, nil, 118, nil, 118, 126, 126, 126, + nil, 126, nil, 126, nil, nil, 118, 118, 118, 118, + 118, nil, nil, 126, 126, 126, 126, 126, 130, 130, + 130, nil, 130, nil, 130, 143, 143, 143, nil, 143, + nil, 143, nil, nil, 130, 130, 130, 130, 130, nil, + nil, 143, 143, 143, 143, 143, 145, 145, 145, nil, + 145, nil, 145, 146, 146, nil, nil, 146, nil, 146, + nil, nil, 145, 145, 145, 145, 145, nil, nil, 146, + 146, 146, 146, 146, 148, 148, 148, nil, 148, nil, + 148, 149, 149, 149, nil, 149, nil, 149, nil, nil, + 148, 148, 148, 148, 148, nil, nil, 149, 149, 149, + 149, 149, 150, 150, 150, nil, 150, nil, 150, 205, + 205, 205, nil, 205, nil, 205, nil, nil, 150, 150, + 150, 150, 150, nil, nil, 205, 205, 205, 205, 205, + 215, 215, nil, nil, 215, nil, 215, 216, 216, 216, + nil, 216, nil, 216, nil, nil, 215, 215, 215, 215, + 215, nil, nil, 216, 216, 216, 216, 216, 217, 217, + 217, nil, 217, nil, 217, 240, 240, 240, nil, 240, + nil, 240, nil, nil, 217, 217, 217, 217, 217, nil, + nil, 240, 240, 240, 240, 240, 244, 244, 244, nil, + 244, nil, 244, 247, 247, 247, nil, 247, nil, 247, + nil, nil, 244, 244, 244, 244, 244, nil, nil, 247, + 247, 247, 247, 247, 249, 249, 249, nil, 249, nil, + 249, 250, 250, 250, nil, 250, nil, 250, nil, nil, + 249, 249, 249, 249, 249, nil, nil, 250, 250, 250, + 250, 250, 251, 251, 251, nil, 251, nil, 251, 262, + 262, 262, nil, 262, nil, 262, nil, nil, 251, 251, + 251, 251, 251, nil, nil, 262, 262, 262, 262, 262, + 263, 263, 263, nil, 263, nil, 263, 310, 310, 310, + nil, 310, nil, 310, nil, nil, 263, 263, 263, 263, + 263, 57, nil, 310, 310, 310, 310, 310, 168, 168, + 168, 57, 168, 57, 168, 57, 212, 57, nil, 254, + nil, nil, nil, nil, 168, nil, 212, 261, 212, 254, + 212, 254, 212, 254, 95, 254, 95, 261, 95, 261, + 95, 261, nil, 261, 270, 270, 270, nil, 270, nil, + 270, 275, 275, 275, nil, 275, nil, 275, nil, nil, + 270, nil, 296, 296, 296, nil, 296, 275, 296, 297, + 297, 297, nil, 297, nil, 297, nil, nil, 296, nil, + 101, 101, 101, nil, 101, 297, 101, 110, 110, nil, + 125, 110, 125, 110, 125, 159, 125, 159, 190, 159, + 190, 159, 190, 191, 190, 191, 233, 191, 233, 191, + 233, 234, 233, 234, nil, 234, nil, 234, 239, 239, + 239, 255, 239, 255, 239, 255, nil, 255 ] + +racc_action_pointer = [ + 63, 4, nil, nil, nil, 0, nil, nil, nil, 2, + 26, nil, 245, 266, -11, nil, 21, 18, 49, nil, + nil, nil, 54, 78, 82, nil, 161, nil, nil, nil, + nil, nil, nil, 112, 138, nil, 273, 42, 60, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 110, 89, nil, 70, nil, -15, 745, 217, 102, + 103, nil, 294, -5, 301, nil, 107, 86, 322, 329, + 350, 129, 100, -5, 126, 357, nil, 117, 115, 137, + nil, nil, nil, nil, nil, nil, nil, 168, 142, 33, + 146, 70, 118, 148, 222, 768, nil, nil, 121, 176, + nil, 814, nil, 378, 385, nil, nil, 180, 193, 194, + 821, 406, 141, 149, nil, 209, 216, 413, 434, nil, + nil, 169, nil, 199, 192, 824, 441, 2, 235, 240, + 462, nil, 238, 254, 40, nil, nil, nil, nil, nil, + nil, nil, nil, 469, 260, 490, 497, 133, 518, 525, + 546, 26, nil, 191, 214, nil, nil, 198, 256, 829, + 262, 184, 263, 246, nil, nil, 199, 238, 742, 270, + nil, nil, nil, nil, nil, nil, nil, nil, 273, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 280, + 832, 837, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 282, nil, nil, 553, nil, nil, nil, nil, + nil, nil, 760, 282, 144, 574, 581, 602, 291, nil, + 289, nil, 290, nil, 33, 285, nil, nil, nil, nil, + 303, nil, 307, 840, 845, nil, 308, nil, 307, 852, + 609, nil, nil, nil, 630, 309, nil, 637, nil, 658, + 665, 686, nil, 307, 763, 855, 301, 302, nil, nil, + 335, 771, 693, 714, 329, 237, nil, 317, 318, nil, + 778, 335, nil, 337, 338, 785, nil, nil, nil, nil, + 341, 354, nil, 357, 359, 364, nil, nil, 372, nil, + 374, nil, 369, 375, nil, 370, 796, 803, nil, nil, + 382, nil, nil, nil, 369, nil, nil, 374, 388, nil, + 721, 390, 397, 403, nil, nil, 398, nil, nil, nil ] + +racc_action_default = [ + -176, -176, -1, -2, -3, -4, -5, -6, -7, -8, + -9, -10, -176, -176, -34, -35, -36, -37, -38, -39, + -40, -41, -176, -49, -51, -52, -176, -64, -67, -68, + -69, -70, -71, -176, -176, -107, -176, -109, -110, -111, + -128, -129, -130, -131, -132, -133, -134, -135, -136, -137, + -138, -176, -176, -76, -176, -112, -176, -176, -176, -8, + -9, -11, -176, -176, -176, -72, -176, -176, -55, -176, + -170, -176, -8, -9, -10, -176, -38, -176, -81, -86, + -87, -88, -90, -91, -92, -93, -94, -176, -176, -176, + -176, -176, -176, -176, -176, -176, 320, -12, -13, -176, + -16, -176, -31, -176, -176, -152, -27, -29, -176, -126, + -176, -176, -176, -176, -28, -30, -176, -176, -176, -153, + -160, -176, -162, -176, -176, -176, -176, -176, -176, -176, + -73, -174, -176, -176, -8, -47, -48, -49, -50, -51, + -53, -54, -58, -56, -176, -171, -176, -176, -98, -97, + -96, -176, -79, -176, -176, -95, -80, -176, -176, -176, + -126, -176, -126, -176, -14, -18, -176, -176, -176, -176, + -147, -148, -149, -150, -145, -151, -146, -114, -44, -59, + -127, -60, -61, -62, -63, -139, -140, -141, -142, -176, + -176, -176, -120, -45, -154, -155, -156, -157, -158, -159, + -161, -163, -176, -29, -30, -176, -26, -42, -77, -43, + -78, -175, -176, -176, -176, -176, -172, -74, -176, -101, + -176, -100, -176, -99, -176, -83, -84, -85, -89, -108, + -176, -113, -176, -176, -176, -117, -176, -19, -176, -176, + -176, -143, -20, -21, -176, -176, -32, -176, -164, -176, + -176, -176, -169, -176, -176, -115, -176, -176, -121, -102, + -176, -176, -75, -173, -44, -176, -116, -176, -176, -118, + -176, -176, -144, -176, -176, -176, -168, -165, -166, -167, + -176, -176, -106, -126, -176, -176, -105, -103, -176, -57, + -176, -82, -176, -176, -23, -176, -176, -176, -15, -33, + -176, -46, -119, -122, -176, -104, -124, -176, -176, -25, + -176, -176, -176, -176, -24, -22, -176, -123, -125, -17 ] + +racc_goto_table = [ + 70, 179, 130, 13, 228, 11, 248, 115, 123, 226, + 227, 113, 245, 5, 14, 9, 63, 11, 68, 10, + 18, 132, 22, 23, 71, 1, 24, 59, 237, 243, + 2, 60, 309, 309, 241, 241, 75, 75, 131, 77, + 88, 3, 4, 70, 162, 163, 6, 160, 161, 61, + 97, 89, 231, 98, 235, 91, 164, 99, 298, 100, + 242, 143, 102, 299, 15, 126, 127, 144, 16, 17, + 75, 142, 11, 145, 135, 204, 109, 174, 151, 203, + 136, 138, 134, 27, 217, 185, 10, 18, 28, 140, + 137, 174, 11, 139, 29, 30, 31, 32, 225, 90, + 155, 105, 59, nil, nil, nil, 60, 176, 248, 230, + nil, nil, nil, 248, 294, 228, nil, nil, nil, nil, + 131, 291, nil, nil, nil, nil, nil, nil, nil, 205, + 206, nil, nil, 211, 248, 248, nil, nil, nil, nil, + 256, 257, nil, nil, nil, nil, 142, nil, 216, nil, + nil, nil, nil, 262, 224, 223, 75, 75, nil, nil, + nil, nil, 259, 219, 220, 220, nil, nil, 221, 222, + nil, nil, nil, nil, nil, 302, nil, nil, nil, nil, + nil, nil, nil, 267, 268, nil, nil, nil, nil, 131, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 282, 283, nil, nil, 206, nil, + nil, 287, nil, nil, 185, nil, nil, nil, 185, 263, + 211, 174, nil, nil, nil, nil, nil, 206, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 277, 278, 279, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 211, 289, nil, 75, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 174 ] + +racc_goto_check = [ + 43, 45, 52, 23, 58, 11, 66, 26, 26, 57, + 57, 24, 16, 5, 30, 9, 23, 11, 42, 10, + 34, 24, 38, 40, 53, 1, 41, 9, 19, 19, + 2, 10, 22, 22, 25, 25, 23, 23, 43, 54, + 54, 3, 4, 43, 26, 26, 6, 24, 24, 7, + 12, 9, 45, 13, 45, 10, 14, 15, 17, 18, + 20, 42, 28, 29, 31, 23, 23, 53, 32, 33, + 23, 23, 11, 23, 39, 26, 44, 43, 23, 24, + 5, 30, 9, 46, 52, 43, 10, 34, 47, 38, + 40, 43, 11, 41, 48, 49, 50, 51, 56, 61, + 5, 65, 9, nil, nil, nil, 10, 23, 66, 26, + nil, nil, nil, 66, 16, 58, nil, nil, nil, nil, + 43, 57, nil, nil, nil, nil, nil, nil, nil, 23, + 23, nil, nil, 23, 66, 66, nil, nil, nil, nil, + 26, 26, nil, nil, nil, nil, 23, nil, 23, nil, + nil, nil, nil, 52, 23, 11, 23, 23, nil, nil, + nil, nil, 26, 9, 9, 9, nil, nil, 10, 10, + nil, nil, nil, nil, nil, 45, nil, nil, nil, nil, + nil, nil, nil, 26, 26, nil, nil, nil, nil, 43, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 26, 26, nil, nil, 23, nil, + nil, 26, nil, nil, 43, nil, nil, nil, 43, 23, + 23, 43, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 23, 23, 23, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 23, 23, nil, 23, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 43 ] + +racc_goto_pointer = [ + nil, 25, 30, 41, 42, 13, 46, 37, nil, 15, + 19, 5, -2, 1, -42, 5, -156, -217, 7, -138, + -107, nil, -264, 3, -45, -132, -50, nil, 10, -212, + 14, 64, 68, 69, 20, nil, nil, nil, 22, 7, + 23, 26, -8, -26, 22, -108, 83, 88, 94, 95, + 96, 97, -62, -2, 6, nil, -55, -144, -150, nil, + nil, 63, nil, nil, nil, 49, -162, nil ] + +racc_goto_default = [ + nil, nil, nil, nil, nil, 84, nil, 7, 8, 72, + 73, 74, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 238, 252, 62, 107, 106, nil, 114, nil, 246, + 86, nil, nil, nil, 76, 19, 20, 21, nil, nil, + 85, nil, nil, 41, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 78, 79, 80, 81, 82, + 83, 35, 37, 38, 39, 119, 120, 122 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 38, :_reduce_none, + 1, 38, :_reduce_none, + 1, 38, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 42, :_reduce_none, + 1, 42, :_reduce_none, + 1, 44, :_reduce_8, + 1, 44, :_reduce_9, + 1, 44, :_reduce_10, + 2, 45, :_reduce_11, + 3, 43, :_reduce_12, + 1, 49, :_reduce_none, + 2, 49, :_reduce_14, + 5, 50, :_reduce_15, + 1, 50, :_reduce_none, + 8, 55, :_reduce_17, + 1, 51, :_reduce_18, + 2, 51, :_reduce_19, + 2, 51, :_reduce_20, + 1, 57, :_reduce_none, + 5, 57, :_reduce_22, + 3, 56, :_reduce_23, + 5, 56, :_reduce_24, + 4, 56, :_reduce_25, + 4, 46, :_reduce_26, + 1, 61, :_reduce_none, + 1, 63, :_reduce_none, + 3, 47, :_reduce_29, + 3, 48, :_reduce_30, + 1, 52, :_reduce_none, + 1, 53, :_reduce_none, + 1, 54, :_reduce_none, + 1, 40, :_reduce_none, + 1, 40, :_reduce_none, + 1, 40, :_reduce_none, + 1, 40, :_reduce_none, + 1, 67, :_reduce_38, + 1, 67, :_reduce_none, + 1, 67, :_reduce_none, + 1, 67, :_reduce_none, + 4, 71, :_reduce_42, + 4, 71, :_reduce_43, + 4, 72, :_reduce_44, + 4, 73, :_reduce_45, + 7, 74, :_reduce_46, + 3, 68, :_reduce_47, + 1, 75, :_reduce_none, + 1, 75, :_reduce_none, + 1, 75, :_reduce_none, + 1, 75, :_reduce_none, + 1, 75, :_reduce_none, + 1, 76, :_reduce_none, + 1, 76, :_reduce_none, + 2, 69, :_reduce_55, + 3, 69, :_reduce_56, + 5, 79, :_reduce_57, + 2, 79, :_reduce_58, + 4, 70, :_reduce_59, + 2, 81, :_reduce_60, + 2, 81, :_reduce_61, + 2, 81, :_reduce_62, + 2, 81, :_reduce_63, + 1, 41, :_reduce_none, + 1, 41, :_reduce_none, + 1, 41, :_reduce_none, + 1, 41, :_reduce_none, + 1, 41, :_reduce_none, + 1, 41, :_reduce_none, + 1, 41, :_reduce_none, + 1, 41, :_reduce_none, + 2, 83, :_reduce_72, + 3, 88, :_reduce_73, + 4, 88, :_reduce_74, + 5, 88, :_reduce_75, + 2, 87, :_reduce_76, + 4, 86, :_reduce_77, + 4, 86, :_reduce_78, + 3, 84, :_reduce_79, + 3, 85, :_reduce_80, + 1, 91, :_reduce_81, + 5, 91, :_reduce_82, + 3, 91, :_reduce_83, + 3, 91, :_reduce_84, + 3, 91, :_reduce_85, + 1, 91, :_reduce_86, + 1, 91, :_reduce_87, + 1, 93, :_reduce_88, + 3, 93, :_reduce_89, + 1, 95, :_reduce_none, + 1, 95, :_reduce_none, + 1, 96, :_reduce_none, + 1, 96, :_reduce_none, + 1, 96, :_reduce_none, + 2, 92, :_reduce_95, + 2, 94, :_reduce_96, + 2, 94, :_reduce_97, + 2, 94, :_reduce_98, + 3, 97, :_reduce_99, + 3, 97, :_reduce_100, + 3, 97, :_reduce_101, + 5, 78, :_reduce_102, + 6, 78, :_reduce_103, + 7, 78, :_reduce_104, + 6, 78, :_reduce_105, + 6, 78, :_reduce_106, + 1, 77, :_reduce_none, + 4, 77, :_reduce_108, + 1, 98, :_reduce_109, + 1, 98, :_reduce_110, + 1, 98, :_reduce_111, + 2, 99, :_reduce_112, + 4, 100, :_reduce_113, + 4, 100, :_reduce_114, + 5, 100, :_reduce_115, + 5, 100, :_reduce_116, + 4, 101, :_reduce_117, + 5, 101, :_reduce_118, + 7, 101, :_reduce_119, + 4, 101, :_reduce_120, + 5, 101, :_reduce_121, + 7, 101, :_reduce_122, + 9, 101, :_reduce_123, + 7, 101, :_reduce_124, + 9, 101, :_reduce_125, + 0, 82, :_reduce_126, + 1, 82, :_reduce_none, + 1, 60, :_reduce_128, + 1, 60, :_reduce_none, + 1, 80, :_reduce_none, + 1, 80, :_reduce_none, + 1, 80, :_reduce_none, + 1, 80, :_reduce_none, + 1, 80, :_reduce_none, + 1, 80, :_reduce_none, + 1, 80, :_reduce_none, + 1, 80, :_reduce_none, + 1, 80, :_reduce_none, + 2, 62, :_reduce_139, + 2, 62, :_reduce_140, + 2, 62, :_reduce_141, + 2, 62, :_reduce_142, + 1, 58, :_reduce_none, + 2, 58, :_reduce_144, + 2, 102, :_reduce_145, + 2, 102, :_reduce_146, + 2, 102, :_reduce_147, + 2, 102, :_reduce_148, + 2, 102, :_reduce_149, + 2, 102, :_reduce_150, + 2, 65, :_reduce_none, + 1, 65, :_reduce_none, + 1, 103, :_reduce_none, + 2, 103, :_reduce_154, + 2, 103, :_reduce_155, + 2, 103, :_reduce_156, + 2, 103, :_reduce_157, + 2, 103, :_reduce_158, + 2, 103, :_reduce_159, + 1, 104, :_reduce_none, + 2, 104, :_reduce_161, + 1, 64, :_reduce_none, + 2, 64, :_reduce_163, + 1, 59, :_reduce_none, + 2, 59, :_reduce_165, + 2, 59, :_reduce_166, + 2, 59, :_reduce_167, + 2, 66, :_reduce_none, + 1, 66, :_reduce_none, + 1, 90, :_reduce_170, + 2, 90, :_reduce_171, + 3, 90, :_reduce_172, + 4, 90, :_reduce_173, + 1, 89, :_reduce_174, + 2, 89, :_reduce_175 ] + +racc_reduce_n = 176 + +racc_shift_n = 320 + +racc_token_table = { + false => 0, + :error => 1, + :T => 2, + :Z => 3, + :E => 4, + :X => 5, + :U => 6, + :UNKNOWN => 7, + :OPEN => 8, + :LONGYEAR => 9, + :UNMATCHED => 10, + :DOTS => 11, + :UA => 12, + :PUA => 13, + "-" => 14, + ":" => 15, + "2" => 16, + "4" => 17, + "0" => 18, + "+" => 19, + "1" => 20, + "/" => 21, + "3" => 22, + "^" => 23, + "[" => 24, + "]" => 25, + "{" => 26, + "}" => 27, + "," => 28, + "(" => 29, + ")" => 30, + "-(" => 31, + "5" => 32, + "6" => 33, + "7" => 34, + "8" => 35, + "9" => 36 } + +racc_nt_base = 37 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "T", + "Z", + "E", + "X", + "U", + "UNKNOWN", + "OPEN", + "LONGYEAR", + "UNMATCHED", + "DOTS", + "UA", + "PUA", + "\"-\"", + "\":\"", + "\"2\"", + "\"4\"", + "\"0\"", + "\"+\"", + "\"1\"", + "\"/\"", + "\"3\"", + "\"^\"", + "\"[\"", + "\"]\"", + "\"{\"", + "\"}\"", + "\",\"", + "\"(\"", + "\")\"", + "\"-(\"", + "\"5\"", + "\"6\"", + "\"7\"", + "\"8\"", + "\"9\"", + "$start", + "edtf", + "level_0_expression", + "level_1_expression", + "level_2_expression", + "date", + "date_time", + "positive_date", + "negative_date", + "year", + "year_month", + "year_month_day", + "time", + "base_time", + "zone_offset", + "hour", + "minute", + "second", + "midnight", + "zone_offset_hour", + "positive_zone_offset", + "d01_13", + "d01_59", + "digit", + "month", + "d01_12", + "day", + "d01_31", + "d00_23", + "d00_59", + "unspecified", + "level_1_interval", + "long_year_simple", + "season", + "unspecified_year", + "unspecified_month", + "unspecified_day", + "unspecified_day_and_month", + "level_1_start", + "level_1_end", + "partial_uncertain_or_approximate", + "partial_unspecified", + "long_year", + "positive_digit", + "season_number", + "ua", + "season_qualified", + "choice_list", + "inclusive_list", + "masked_precision", + "date_and_calendar", + "long_year_scientific", + "integer", + "int1_4", + "list", + "earlier", + "list_elements", + "later", + "list_element", + "atomic", + "consecutives", + "pua_base", + "pua_year", + "pua_year_month", + "pua_year_month_day", + "d01_23", + "d01_29", + "d01_30" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +# reduce 2 omitted + +# reduce 3 omitted + +# reduce 4 omitted + +# reduce 5 omitted + +# reduce 6 omitted + +# reduce 7 omitted + +module_eval(<<'.,.,', 'edtf.y', 54) + def _reduce_8(val, _values, result) + result = Date.new(val[0]).year_precision! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 55) + def _reduce_9(val, _values, result) + result = Date.new(*val.flatten).month_precision! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 56) + def _reduce_10(val, _values, result) + result = Date.new(*val.flatten).day_precision! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 59) + def _reduce_11(val, _values, result) + result = -val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 63) + def _reduce_12(val, _values, result) + result = DateTime.new(val[0].year, val[0].month, val[0].day, *val[2]) + result.skip_timezone = (val[2].length == 3) + + result + end +.,., + +# reduce 13 omitted + +module_eval(<<'.,.,', 'edtf.y', 68) + def _reduce_14(val, _values, result) + result = val.flatten + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 70) + def _reduce_15(val, _values, result) + result = val.values_at(0, 2, 4) + result + end +.,., + +# reduce 16 omitted + +module_eval(<<'.,.,', 'edtf.y', 73) + def _reduce_17(val, _values, result) + result = [24, 0, 0] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 75) + def _reduce_18(val, _values, result) + result = 0 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 76) + def _reduce_19(val, _values, result) + result = -1 * val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 77) + def _reduce_20(val, _values, result) + result = val[1] + result + end +.,., + +# reduce 21 omitted + +module_eval(<<'.,.,', 'edtf.y', 81) + def _reduce_22(val, _values, result) + result = 0 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 85) + def _reduce_23(val, _values, result) + result = Rational(val[0] * 60 + val[2], 1440) + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 86) + def _reduce_24(val, _values, result) + result = Rational(840, 1440) + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 87) + def _reduce_25(val, _values, result) + result = Rational(val[3], 1440) + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 91) + def _reduce_26(val, _values, result) + result = val.zip([1000,100,10,1]).reduce(0) { |s,(a,b)| s += a * b } + + result + end +.,., + +# reduce 27 omitted + +# reduce 28 omitted + +module_eval(<<'.,.,', 'edtf.y', 97) + def _reduce_29(val, _values, result) + result = [val[0], val[2]] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 104) + def _reduce_30(val, _values, result) + result = val[0] << val[2] + if result[2] > 31 || (result[2] > 30 && [2,4,6,9,11].include?(result[1])) || (result[2] > 29 && result[1] == 2) + raise ArgumentError, "invalid date (invalid days #{result[2]} for month #{result[1]})" + end + + result + end +.,., + +# reduce 31 omitted + +# reduce 32 omitted + +# reduce 33 omitted + +# reduce 34 omitted + +# reduce 35 omitted + +# reduce 36 omitted + +# reduce 37 omitted + +module_eval(<<'.,.,', 'edtf.y', 127) + def _reduce_38(val, _values, result) + result = Date.new(val[0][0]).year_precision! + result.unspecified.year[2,2] = val[0][1] + + result + end +.,., + +# reduce 39 omitted + +# reduce 40 omitted + +# reduce 41 omitted + +module_eval(<<'.,.,', 'edtf.y', 138) + def _reduce_42(val, _values, result) + result = [val[0,3].zip([1000,100,10]).reduce(0) { |s,(a,b)| s += a * b }, [false,true]] + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 142) + def _reduce_43(val, _values, result) + result = [val[0,2].zip([1000,100]).reduce(0) { |s,(a,b)| s += a * b }, [true, true]] + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 146) + def _reduce_44(val, _values, result) + result = Date.new(val[0]).unspecified!(:month) + result.precision = :month + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 151) + def _reduce_45(val, _values, result) + result = Date.new(*val[0]).unspecified!(:day) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 155) + def _reduce_46(val, _values, result) + result = Date.new(val[0]).unspecified!([:day,:month]) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 160) + def _reduce_47(val, _values, result) + result = Interval.new(val[0], val[2]) + + result + end +.,., + +# reduce 48 omitted + +# reduce 49 omitted + +# reduce 50 omitted + +# reduce 51 omitted + +# reduce 52 omitted + +# reduce 53 omitted + +# reduce 54 omitted + +module_eval(<<'.,.,', 'edtf.y', 171) + def _reduce_55(val, _values, result) + result = Date.new(val[1]) + result.precision = :year + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 176) + def _reduce_56(val, _values, result) + result = Date.new(-1 * val[2]) + result.precision = :year + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 183) + def _reduce_57(val, _values, result) + result = val.zip([10000,1000,100,10,1]).reduce(0) { |s,(a,b)| s += a * b } + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 185) + def _reduce_58(val, _values, result) + result = 10 * val[0] + val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 190) + def _reduce_59(val, _values, result) + result = Season.new(val[0], val[2]) + val[3].each { |ua| result.send(ua) } + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 194) + def _reduce_60(val, _values, result) + result = 21 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 195) + def _reduce_61(val, _values, result) + result = 22 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 196) + def _reduce_62(val, _values, result) + result = 23 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 197) + def _reduce_63(val, _values, result) + result = 24 + result + end +.,., + +# reduce 64 omitted + +# reduce 65 omitted + +# reduce 66 omitted + +# reduce 67 omitted + +# reduce 68 omitted + +# reduce 69 omitted + +# reduce 70 omitted + +# reduce 71 omitted + +module_eval(<<'.,.,', 'edtf.y', 215) + def _reduce_72(val, _values, result) + result = val[0]; result.qualifier = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 221) + def _reduce_73(val, _values, result) + result = Date.new(val[0].year * 10 ** val[2]).year_precision! + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 225) + def _reduce_74(val, _values, result) + result = Date.new(val[1] * 10 ** val[3]).year_precision! + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 229) + def _reduce_75(val, _values, result) + result = Date.new(-1 * val[2] * 10 ** val[4]).year_precision! + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 234) + def _reduce_76(val, _values, result) + result = val[0]; result.calendar = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 240) + def _reduce_77(val, _values, result) + d = val[0,3].zip([1000,100,10]).reduce(0) { |s,(a,b)| s += a * b } + result = EDTF::Decade.new(d) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 245) + def _reduce_78(val, _values, result) + d = val[0,2].zip([1000,100]).reduce(0) { |s,(a,b)| s += a * b } + result = EDTF::Century.new(d) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 251) + def _reduce_79(val, _values, result) + result = val[1].choice! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 253) + def _reduce_80(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 255) + def _reduce_81(val, _values, result) + result = EDTF::Set.new(val[0]).earlier! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 256) + def _reduce_82(val, _values, result) + result = EDTF::Set.new([val[0]] + val[2] + [val[4]]).earlier!.later! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 257) + def _reduce_83(val, _values, result) + result = EDTF::Set.new([val[0]] + val[2]).earlier! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 258) + def _reduce_84(val, _values, result) + result = EDTF::Set.new([val[0]] + [val[2]]).earlier!.later! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 259) + def _reduce_85(val, _values, result) + result = EDTF::Set.new(val[0] + [val[2]]).later! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 260) + def _reduce_86(val, _values, result) + result = EDTF::Set.new(*val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 261) + def _reduce_87(val, _values, result) + result = EDTF::Set.new(val[0]).later! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 264) + def _reduce_88(val, _values, result) + result = [val[0]].flatten + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 265) + def _reduce_89(val, _values, result) + result = val[0] + [val[2]].flatten + result + end +.,., + +# reduce 90 omitted + +# reduce 91 omitted + +# reduce 92 omitted + +# reduce 93 omitted + +# reduce 94 omitted + +module_eval(<<'.,.,', 'edtf.y', 277) + def _reduce_95(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 279) + def _reduce_96(val, _values, result) + result = Date.new(*val[0]).year_precision! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 280) + def _reduce_97(val, _values, result) + result = Date.new(*val[0]).month_precision! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 281) + def _reduce_98(val, _values, result) + result = Date.new(val[0]).year_precision! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 284) + def _reduce_99(val, _values, result) + result = (Date.new(val[0]).day_precision! .. Date.new(val[2]).day_precision!) + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 285) + def _reduce_100(val, _values, result) + result = (Date.new(val[0]).month_precision! .. Date.new(val[2]).month_precision!) + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 286) + def _reduce_101(val, _values, result) + result = (Date.new(val[0]).year_precision! .. Date.new(val[2]).year_precision!) + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 292) + def _reduce_102(val, _values, result) + result = Date.new(val[0][0], val[2], val[4]) + result.unspecified.year[2,2] = val[0][1] + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 297) + def _reduce_103(val, _values, result) + result = Date.new(val[0][0], 1, val[5]) + result.unspecified.year[2,2] = val[0][1] + result.unspecified!(:month) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 303) + def _reduce_104(val, _values, result) + result = Date.new(val[0][0], 1, 1) + result.unspecified.year[2,2] = val[0][1] + result.unspecified!([:month, :day]) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 309) + def _reduce_105(val, _values, result) + result = Date.new(val[0][0], val[2], 1) + result.unspecified.year[2,2] = val[0][1] + result.unspecified!(:day) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 315) + def _reduce_106(val, _values, result) + result = Date.new(val[0], 1, val[5]) + result.unspecified!(:month) + + result + end +.,., + +# reduce 107 omitted + +module_eval(<<'.,.,', 'edtf.y', 322) + def _reduce_108(val, _values, result) + result = uoa(val[1], val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 325) + def _reduce_109(val, _values, result) + result = val[0].year_precision! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 326) + def _reduce_110(val, _values, result) + result = val[0][0].month_precision! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 327) + def _reduce_111(val, _values, result) + result = val[0].day_precision! + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 329) + def _reduce_112(val, _values, result) + result = uoa(Date.new(val[0]), val[1], :year) + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 333) + def _reduce_113(val, _values, result) + result = [uoa(val[0].change(:month => val[2]), val[3], [:month, :year])] + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 336) + def _reduce_114(val, _values, result) + result = [uoa(Date.new(val[0], val[2]), val[3], [:year, :month])] + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 339) + def _reduce_115(val, _values, result) + result = [uoa(Date.new(val[0], val[2]), val[4], [:month]), true] + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 342) + def _reduce_116(val, _values, result) + result = [uoa(val[0].change(:month => val[2]), val[4], [:month]), true] + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 348) + def _reduce_117(val, _values, result) + result = uoa(val[0][0].change(:day => val[2]), val[3], val[0][1] ? [:day] : nil) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 351) + def _reduce_118(val, _values, result) + result = uoa(val[0][0].change(:day => val[2]), val[4], [:day]) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 354) + def _reduce_119(val, _values, result) + result = uoa(uoa(Date.new(val[0], val[2], val[5]), val[4], :month), val[6], :day) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 357) + def _reduce_120(val, _values, result) + result = uoa(Date.new(val[0][0], val[0][1], val[2]), val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 360) + def _reduce_121(val, _values, result) + result = uoa(Date.new(val[0][0], val[0][1], val[2]), val[4], [:day]) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 363) + def _reduce_122(val, _values, result) + result = uoa(Date.new(val[0], val[2], val[4]), val[6], [:month, :day]) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 366) + def _reduce_123(val, _values, result) + result = Date.new(val[0], val[2], val[4]) + result = uoa(result, val[6], [:day]) + result = uoa(result, val[8], [:month, :day]) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 371) + def _reduce_124(val, _values, result) + result = val[0].change(:month => val[2], :day => val[4]) + result = uoa(result, val[6], [:month, :day]) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 375) + def _reduce_125(val, _values, result) + result = val[0].change(:month => val[2], :day => val[4]) + result = uoa(result, val[6], [:day]) + result = uoa(result, val[8], [:month, :day]) + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 386) + def _reduce_126(val, _values, result) + result = [] + result + end +.,., + +# reduce 127 omitted + +module_eval(<<'.,.,', 'edtf.y', 390) + def _reduce_128(val, _values, result) + result = 0 + result + end +.,., + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +module_eval(<<'.,.,', 'edtf.y', 396) + def _reduce_139(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 397) + def _reduce_140(val, _values, result) + result = 10 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 398) + def _reduce_141(val, _values, result) + result = 11 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 399) + def _reduce_142(val, _values, result) + result = 12 + result + end +.,., + +# reduce 143 omitted + +module_eval(<<'.,.,', 'edtf.y', 403) + def _reduce_144(val, _values, result) + result = 13 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 406) + def _reduce_145(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 407) + def _reduce_146(val, _values, result) + result = 10 + val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 408) + def _reduce_147(val, _values, result) + result = 20 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 409) + def _reduce_148(val, _values, result) + result = 21 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 410) + def _reduce_149(val, _values, result) + result = 22 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 411) + def _reduce_150(val, _values, result) + result = 23 + result + end +.,., + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +module_eval(<<'.,.,', 'edtf.y', 419) + def _reduce_154(val, _values, result) + result = 24 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 420) + def _reduce_155(val, _values, result) + result = 25 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 421) + def _reduce_156(val, _values, result) + result = 26 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 422) + def _reduce_157(val, _values, result) + result = 27 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 423) + def _reduce_158(val, _values, result) + result = 28 + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 424) + def _reduce_159(val, _values, result) + result = 29 + result + end +.,., + +# reduce 160 omitted + +module_eval(<<'.,.,', 'edtf.y', 428) + def _reduce_161(val, _values, result) + result = 30 + result + end +.,., + +# reduce 162 omitted + +module_eval(<<'.,.,', 'edtf.y', 432) + def _reduce_163(val, _values, result) + result = 31 + result + end +.,., + +# reduce 164 omitted + +module_eval(<<'.,.,', 'edtf.y', 436) + def _reduce_165(val, _values, result) + result = 30 + val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 437) + def _reduce_166(val, _values, result) + result = 40 + val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 438) + def _reduce_167(val, _values, result) + result = 50 + val[1] + result + end +.,., + +# reduce 168 omitted + +# reduce 169 omitted + +module_eval(<<'.,.,', 'edtf.y', 445) + def _reduce_170(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 446) + def _reduce_171(val, _values, result) + result = 10 * val[0] + val[1] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 449) + def _reduce_172(val, _values, result) + result = val.zip([100,10,1]).reduce(0) { |s,(a,b)| s += a * b } + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 453) + def _reduce_173(val, _values, result) + result = val.zip([1000,100,10,1]).reduce(0) { |s,(a,b)| s += a * b } + + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 457) + def _reduce_174(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'edtf.y', 458) + def _reduce_175(val, _values, result) + result = 10 * val[0] + val[1] + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module EDTF diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/huia b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/huia new file mode 100644 index 000000000000..0b75d397354e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/huia @@ -0,0 +1,1392 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +module Huia + class Parser < Racc::Parser + +module_eval(<<'...end huia.y/module_eval...', 'huia.y', 211) + +attr_accessor :lexer, :scopes, :state + +def initialize lexer + @lexer = lexer + @state = [] + @scopes = [] + push_scope +end + +def ast + @ast ||= do_parse + @scopes.first +end + +def on_error t, val, vstack + line = lexer.line + col = lexer.column + message = "Unexpected #{token_to_str t} at #{lexer.filename} line #{line}:#{col}:\n\n" + + start = line - 5 > 0 ? line - 5 : 0 + i_size = line.to_s.size + (start..(start + 5)).each do |i| + message << sprintf("\t%#{i_size}d: %s\n", i, lexer.get_line(i)) + message << "\t#{' ' * i_size} #{'-' * (col - 1)}^\n" if i == line + end + + raise SyntaxError, message +end + +def next_token + nt = lexer.next_computed_token + # just use a state stack for now, we'll have to do something + # more sophisticated soon. + if nt && nt.first == :state + if nt.last + state.push << nt.last + else + state.pop + end + next_token + else + nt + end +end + +def push_scope + new_scope = Huia::AST::Scope.new scope + new_scope.file = lexer.filename + new_scope.line = lexer.line + new_scope.column = lexer.column + scopes.push new_scope + new_scope +end + +def pop_scope + scopes.pop +end + +def scope + scopes.last +end + +def binary left, right, method + node(:MethodCall, left, node(:CallSignature, method, [right])) +end + +def unary left, method + node(:MethodCall, left, node(:CallSignature, method)) +end + +def node type, *args + Huia::AST.const_get(type).new(*args).tap do |n| + n.file = lexer.filename + n.line = lexer.line + n.column = lexer.column + end +end +alias n node + +def allocate_local name + node(:Variable, name).tap do |n| + scope.allocate_local n + end +end + +def allocate_local_assignment name, value + node(:Assignment, name, value).tap do |n| + scope.allocate_local n + end +end + +def this_closure + allocate_local('@') +end + +def scope_instance + node(:ScopeInstance, scope) +end + +def constant name + return scope_instance if name == 'self' + node(:Constant, name) +end + +def to_string expr + node(:MethodCall, expr, node(:CallSignature, 'toString')) +end +...end huia.y/module_eval... +##### State transition tables begin ### + +clist = [ +'81,106,40,37,61,62,123,153,135,71,72,77,155,178,179,39,164,37,37,5,6', +'137,152,73,74,75,36,36,76,28,154,80,166,172,180,22,23,37,26,27,182,60', +'63,19,164,40,36,61,62,186,,33,71,72,77,,,134,39,133,129,37,5,6,,,73', +'74,75,,36,76,28,134,80,169,129,,22,23,,26,27,,60,63,19,,40,,61,62,,', +'33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60', +'63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80', +',,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73', +'74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72', +'77,,114,,39,,,37,,,113,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63', +'19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,', +',22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74', +'75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77', +',,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40', +',61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23', +',26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36', +'76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,', +',37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62', +',,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27', +',60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28', +',80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,', +',,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71', +'72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19', +',40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22', +'23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75', +',36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,', +'39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61', +'62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26', +'27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76', +'28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37', +',,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33', +'71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63', +'19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,', +',22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74', +'75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77', +',,160,39,,,37,5,6,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19', +',40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22', +'23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75', +',36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,', +'39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61', +'62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26', +'27,,60,63,19,,40,,61,62,,,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76', +'28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62,,,33,71,72,77,,,160,39,', +',37,5,6,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27,,60,63,19,,40,,61,62', +',,33,71,72,77,,,,39,,,37,,,,,73,74,75,,36,76,28,,80,,,,22,23,,26,27', +',60,63,19,85,86,87,88,,84,,33,89,,,,,84,91,5,6,85,86,87,88,,91,,,89', +',,,,84,,92,93,94,95,96,97,98,91,92,93,94,95,96,97,98,,90,,,,,,,,,92', +'93,94,95,96,97,98,,90,85,86,87,88,,,,,89,,,,,84,,85,86,87,88,156,,,91', +'89,,,,,84,,,,,,,,,91,,,92,93,94,95,96,97,98,,90,,,,,,,92,93,94,95,96', +'97,98,,90,85,86,87,88,,,,,89,,,,,84,,165,85,86,87,88,,,91,,89,,,,167', +'84,,,,,,,,,91,,92,93,94,95,96,97,98,,90,,,,,,,,92,93,94,95,96,97,98', +',90,85,86,87,88,,,,,89,,,,,84,,85,86,87,88,,,,91,89,,,,,84,,,,,,,,,91', +',,92,93,94,95,96,97,98,,90,,,,,,,92,93,94,95,96,97,98,,90,85,86,87,88', +',,,,89,,,,,84,,85,86,87,88,,,,91,89,,,,,84,,,,,,,,,91,,,92,93,94,95', +'96,97,98,,90,,,,,,,92,93,94,95,96,97,98,,90,85,86,87,88,,,,,89,,,,,84', +',85,86,87,88,,,,91,89,,,,,84,,,,,,,,,91,,,92,93,94,95,96,97,98,,90,', +',,,,,92,93,94,95,96,97,98,,90,85,86,87,88,,,,,89,,,,,84,,85,86,87,88', +',,,91,89,,,,,84,,,,,,,,,91,,,92,93,94,95,96,97,98,,90,,,,,,,92,93,94', +'95,96,97,98,,90,85,86,87,88,,,,,89,,160,,,84,,5,6,85,86,87,88,,91,,', +'89,,,,,84,,,,,,,,,91,92,93,94,95,96,97,98,,90,,,,,,,,,92,93,94,95,96', +'97,98,,90,85,86,87,88,,,,,89,,,,,84,,85,86,87,88,,,,91,89,,,,,84,,181', +',,,,,,91,,,92,93,94,95,96,97,98,,90,,,,,,,92,93,94,95,96,97,98,,90,85', +'86,87,88,,,,,89,,,,,84,,85,86,87,88,,,,91,89,,,,,84,,,,,,,,,91,,,92', +'93,94,95,96,97,98,,90,,,,,,,92,93,94,95,96,97,98,,90,87,88,,,,,89,,', +',,84,87,88,,,,,89,,91,,,84,,87,88,,,,,89,91,,,,84,,92,93,94,95,96,97', +'98,91,90,,,,92,93,94,95,96,97,98,,90,,,,,92,93,94,95,96,97,98,89,90', +'87,88,,84,,,89,,,,,84,91,,,,,,,,91,,,89,,,,,84,,92,93,94,95,96,97,98', +'91,92,93,94,95,96,97,98,,90,,89,,,,,84,,92,93,94,95,96,97,98,91,89,', +',,,84,,,,,89,,,,91,84,,92,93,94,95,96,97,98,91,,,,,,,,92,93,94,95,96', +'97,98,,,,92,93,94,95,96,97,98' ] + racc_action_table = arr = ::Array.new(2249, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'1,33,1,34,1,1,40,100,81,1,1,1,102,161,161,1,112,33,1,1,1,84,100,1,1', +'1,33,1,1,1,102,1,121,131,163,1,1,84,1,1,178,1,1,1,179,0,84,0,0,183,', +'1,0,0,0,,,80,0,80,80,0,0,0,,,0,0,0,,0,0,0,128,0,128,128,,0,0,,0,0,,0', +'0,0,,19,,19,19,,,0,19,19,19,,,,19,,,19,,,,,19,19,19,,19,19,19,,19,,', +',19,19,,19,19,,19,19,19,,23,,23,23,,,19,23,23,23,,,,23,,,23,,,,,23,23', +'23,,23,23,23,,23,,,,23,23,,23,23,,23,23,23,,27,,27,27,,,23,27,27,27', +',,,27,,,27,,,,,27,27,27,,27,27,27,,27,,,,27,27,,27,27,,27,27,27,,37', +',37,37,,,27,37,37,37,,37,,37,,,37,,,37,,37,37,37,,37,37,37,,37,,,,37', +'37,,37,37,,37,37,37,,39,,39,39,,,37,39,39,39,,,,39,,,39,,,,,39,39,39', +',39,39,39,,39,,,,39,39,,39,39,,39,39,39,,60,,60,60,,,39,60,60,60,,,', +'60,,,60,,,,,60,60,60,,60,60,60,,60,,,,60,60,,60,60,,60,60,60,,61,,61', +'61,,,60,61,61,61,,,,61,,,61,,,,,61,61,61,,61,61,61,,61,,,,61,61,,61', +'61,,61,61,61,,62,,62,62,,,61,62,62,62,,,,62,,,62,,,,,62,62,62,,62,62', +'62,,62,,,,62,62,,62,62,,62,62,62,,63,,63,63,,,62,63,63,63,,,,63,,,63', +',,,,63,63,63,,63,63,63,,63,,,,63,63,,63,63,,63,63,63,,85,,85,85,,,63', +'85,85,85,,,,85,,,85,,,,,85,85,85,,85,85,85,,85,,,,85,85,,85,85,,85,85', +'85,,86,,86,86,,,85,86,86,86,,,,86,,,86,,,,,86,86,86,,86,86,86,,86,,', +',86,86,,86,86,,86,86,86,,87,,87,87,,,86,87,87,87,,,,87,,,87,,,,,87,87', +'87,,87,87,87,,87,,,,87,87,,87,87,,87,87,87,,88,,88,88,,,87,88,88,88', +',,,88,,,88,,,,,88,88,88,,88,88,88,,88,,,,88,88,,88,88,,88,88,88,,89', +',89,89,,,88,89,89,89,,,,89,,,89,,,,,89,89,89,,89,89,89,,89,,,,89,89', +',89,89,,89,89,89,,90,,90,90,,,89,90,90,90,,,,90,,,90,,,,,90,90,90,,90', +'90,90,,90,,,,90,90,,90,90,,90,90,90,,91,,91,91,,,90,91,91,91,,,,91,', +',91,,,,,91,91,91,,91,91,91,,91,,,,91,91,,91,91,,91,91,91,,92,,92,92', +',,91,92,92,92,,,,92,,,92,,,,,92,92,92,,92,92,92,,92,,,,92,92,,92,92', +',92,92,92,,93,,93,93,,,92,93,93,93,,,,93,,,93,,,,,93,93,93,,93,93,93', +',93,,,,93,93,,93,93,,93,93,93,,94,,94,94,,,93,94,94,94,,,,94,,,94,,', +',,94,94,94,,94,94,94,,94,,,,94,94,,94,94,,94,94,94,,95,,95,95,,,94,95', +'95,95,,,,95,,,95,,,,,95,95,95,,95,95,95,,95,,,,95,95,,95,95,,95,95,95', +',96,,96,96,,,95,96,96,96,,,,96,,,96,,,,,96,96,96,,96,96,96,,96,,,,96', +'96,,96,96,,96,96,96,,97,,97,97,,,96,97,97,97,,,,97,,,97,,,,,97,97,97', +',97,97,97,,97,,,,97,97,,97,97,,97,97,97,,98,,98,98,,,97,98,98,98,,,', +'98,,,98,,,,,98,98,98,,98,98,98,,98,,,,98,98,,98,98,,98,98,98,,111,,111', +'111,,,98,111,111,111,,,111,111,,,111,111,111,,,111,111,111,,111,111', +'111,,111,,,,111,111,,111,111,,111,111,111,,123,,123,123,,,111,123,123', +'123,,,,123,,,123,,,,,123,123,123,,123,123,123,,123,,,,123,123,,123,123', +',123,123,123,,129,,129,129,,,123,129,129,129,,,,129,,,129,,,,,129,129', +'129,,129,129,129,,129,,,,129,129,,129,129,,129,129,129,,153,,153,153', +',,129,153,153,153,,,,153,,,153,,,,,153,153,153,,153,153,153,,153,,,', +'153,153,,153,153,,153,153,153,,155,,155,155,,,153,155,155,155,,,,155', +',,155,,,,,155,155,155,,155,155,155,,155,,,,155,155,,155,155,,155,155', +'155,,156,,156,156,,,155,156,156,156,,,,156,,,156,,,,,156,156,156,,156', +'156,156,,156,,,,156,156,,156,156,,156,156,156,,157,,157,157,,,156,157', +'157,157,,,157,157,,,157,157,157,,,157,157,157,,157,157,157,,157,,,,157', +'157,,157,157,,157,157,157,,180,,180,180,,,157,180,180,180,,,,180,,,180', +',,,,180,180,180,,180,180,180,,180,,,,180,180,,180,180,,180,180,180,3', +'3,3,3,,142,,180,3,,,,,3,142,3,3,99,99,99,99,,3,,,99,,,,,99,,142,142', +'142,142,142,142,142,99,3,3,3,3,3,3,3,,3,,,,,,,,,99,99,99,99,99,99,99', +',99,101,101,101,101,,,,,101,,,,,101,,104,104,104,104,104,,,101,104,', +',,,104,,,,,,,,,104,,,101,101,101,101,101,101,101,,101,,,,,,,104,104', +'104,104,104,104,104,,104,117,117,117,117,,,,,117,,,,,117,,117,122,122', +'122,122,,,117,,122,,,,122,122,,,,,,,,,122,,117,117,117,117,117,117,117', +',117,,,,,,,,122,122,122,122,122,122,122,,122,144,144,144,144,,,,,144', +',,,,144,,145,145,145,145,,,,144,145,,,,,145,,,,,,,,,145,,,144,144,144', +'144,144,144,144,,144,,,,,,,145,145,145,145,145,145,145,,145,146,146', +'146,146,,,,,146,,,,,146,,147,147,147,147,,,,146,147,,,,,147,,,,,,,,', +'147,,,146,146,146,146,146,146,146,,146,,,,,,,147,147,147,147,147,147', +'147,,147,148,148,148,148,,,,,148,,,,,148,,149,149,149,149,,,,148,149', +',,,,149,,,,,,,,,149,,,148,148,148,148,148,148,148,,148,,,,,,,149,149', +'149,149,149,149,149,,149,150,150,150,150,,,,,150,,,,,150,,151,151,151', +'151,,,,150,151,,,,,151,,,,,,,,,151,,,150,150,150,150,150,150,150,,150', +',,,,,,151,151,151,151,151,151,151,,151,158,158,158,158,,,,,158,,158', +',,158,,158,158,168,168,168,168,,158,,,168,,,,,168,,,,,,,,,168,158,158', +'158,158,158,158,158,,158,,,,,,,,,168,168,168,168,168,168,168,,168,171', +'171,171,171,,,,,171,,,,,171,,173,173,173,173,,,,171,173,,,,,173,,171', +',,,,,,173,,,171,171,171,171,171,171,171,,171,,,,,,,173,173,173,173,173', +'173,173,,173,175,175,175,175,,,,,175,,,,,175,,185,185,185,185,,,,175', +'185,,,,,185,,,,,,,,,185,,,175,175,175,175,175,175,175,,175,,,,,,,185', +'185,185,185,185,185,185,,185,125,125,,,,,125,,,,,125,126,126,,,,,126', +',125,,,126,,138,138,,,,,138,126,,,,138,,125,125,125,125,125,125,125', +'138,125,,,,126,126,126,126,126,126,126,,126,,,,,138,138,138,138,138', +'138,138,124,138,139,139,,124,,,139,,,,,139,124,,,,,,,,139,,,127,,,,', +'127,,124,124,124,124,124,124,124,127,139,139,139,139,139,139,139,,139', +',140,,,,,140,,127,127,127,127,127,127,127,140,141,,,,,141,,,,,143,,', +',141,143,,140,140,140,140,140,140,140,143,,,,,,,,141,141,141,141,141', +'141,141,,,,143,143,143,143,143,143,143' ] + racc_action_check = arr = ::Array.new(2249, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 43, 0, nil, 1416, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 86, + nil, nil, nil, 129, nil, nil, nil, 172, nil, nil, + nil, nil, nil, -1, -15, nil, nil, 215, nil, 258, + 3, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 301, 344, 387, 430, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 27, 8, nil, nil, 19, 473, 516, 559, 602, 645, + 688, 731, 774, 817, 860, 903, 946, 989, 1032, 1433, + -15, 1482, -10, nil, 1497, nil, nil, nil, nil, nil, + nil, 1075, 14, nil, nil, nil, nil, 1546, nil, nil, + nil, 13, 1562, 1118, 2123, 2059, 2071, 2148, 43, 1161, + nil, 3, nil, nil, nil, nil, nil, nil, 2084, 2131, + 2173, 2188, 1408, 2198, 1611, 1626, 1675, 1690, 1739, 1754, + 1803, 1818, nil, 1204, nil, 1247, 1290, 1333, 1867, nil, + nil, -8, nil, 31, nil, nil, nil, nil, 1884, nil, + nil, 1933, nil, 1948, nil, 1997, nil, nil, 21, 42, + 1376, nil, nil, 36, nil, 2012, nil ] + +racc_action_default = [ + -140, -140, -1, -4, -5, -6, -7, -10, -11, -12, + -13, -14, -15, -16, -17, -18, -19, -20, -21, -23, + -24, -25, -26, -140, -30, -31, -32, -140, -37, -55, + -56, -57, -60, -140, -63, -64, -65, -140, -73, -140, + -76, -77, -78, -79, -80, -81, -82, -83, -84, -85, + -86, -87, -88, -89, -90, -91, -107, -108, -109, -110, + -140, -140, -140, -140, -115, -116, -117, -118, -119, -120, + -121, -122, -123, -124, -125, -126, -127, -128, -129, -130, + -140, -140, -2, -3, -140, -140, -140, -140, -140, -140, + -140, -140, -140, -140, -140, -140, -140, -140, -140, -22, + -140, -28, -140, -34, -140, -61, -62, -74, -38, -39, + -40, -140, -140, -46, -47, -48, -49, -69, -66, -67, + -68, -71, -140, -140, -111, -112, -113, -114, -140, -140, + -133, -135, -136, -137, -138, 187, -58, -59, -93, -94, + -95, -96, -97, -98, -99, -100, -101, -102, -103, -104, + -105, -106, -27, -140, -33, -140, -140, -140, -4, -43, + -44, -140, -50, -52, -54, -70, -72, -75, -92, -131, + -134, -140, -139, -29, -35, -36, -41, -42, -9, -140, + -140, -132, -8, -140, -51, -53, -45 ] + +racc_goto_table = [ + 99, 82, 103, 83, 101, 1, 105, 130, 104, 183, + 100, 102, 159, 162, 121, 108, 109, 110, 117, 111, + 122, 115, 112, 161, 116, 107, 118, 119, 120, 128, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 124, 125, 126, 127, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 170, nil, 136, 176, 177, + nil, nil, nil, nil, nil, nil, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 184, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 158, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 168, nil, nil, nil, nil, nil, + 171, nil, nil, nil, nil, nil, 157, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 174, nil, nil, nil, 173, nil, 104, 175, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 82, 83, nil, + nil, 185 ] + +racc_goto_check = [ + 3, 2, 24, 4, 3, 1, 40, 77, 3, 5, + 20, 23, 30, 35, 25, 26, 27, 28, 3, 29, + 3, 31, 32, 33, 34, 43, 44, 45, 46, 75, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 3, 3, 3, 3, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 77, nil, 40, 30, 30, + nil, nil, nil, nil, nil, nil, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 35, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 3, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 3, nil, nil, nil, nil, nil, + 3, nil, nil, nil, nil, nil, 1, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 24, nil, nil, nil, 3, nil, 3, 3, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 2, 4, nil, + nil, 3 ] + +racc_goto_pointer = [ + nil, 5, 0, -19, 0, -169, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + -13, nil, nil, -16, -25, -23, -22, -21, -20, -18, + -99, -16, -15, -89, -13, -99, nil, nil, nil, nil, + -27, nil, nil, -9, -11, -10, -9, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, -51, nil, -73, nil ] + +racc_goto_default = [ + nil, nil, 2, 3, 4, nil, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, + nil, 24, 25, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 163, 29, 30, 31, + 32, 34, 35, 38, nil, nil, nil, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 64, 65, 66, 67, + 68, 69, 70, 78, 79, nil, 132, nil, 131 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 54, :_reduce_none, + 2, 54, :_reduce_2, + 2, 55, :_reduce_3, + 1, 55, :_reduce_4, + 1, 55, :_reduce_5, + 1, 57, :_reduce_none, + 1, 57, :_reduce_none, + 1, 58, :_reduce_none, + 0, 58, :_reduce_none, + 1, 56, :_reduce_none, + 1, 56, :_reduce_none, + 1, 56, :_reduce_none, + 1, 56, :_reduce_none, + 1, 56, :_reduce_none, + 1, 56, :_reduce_none, + 1, 56, :_reduce_none, + 1, 56, :_reduce_none, + 1, 56, :_reduce_none, + 1, 56, :_reduce_none, + 1, 68, :_reduce_none, + 1, 68, :_reduce_none, + 2, 69, :_reduce_22, + 1, 70, :_reduce_23, + 1, 66, :_reduce_none, + 1, 66, :_reduce_none, + 1, 71, :_reduce_26, + 3, 72, :_reduce_27, + 1, 73, :_reduce_28, + 3, 73, :_reduce_29, + 1, 67, :_reduce_none, + 1, 67, :_reduce_none, + 1, 74, :_reduce_32, + 3, 75, :_reduce_33, + 1, 76, :_reduce_34, + 3, 76, :_reduce_35, + 3, 77, :_reduce_36, + 1, 64, :_reduce_37, + 1, 78, :_reduce_none, + 1, 78, :_reduce_none, + 1, 78, :_reduce_none, + 3, 79, :_reduce_41, + 3, 80, :_reduce_42, + 2, 81, :_reduce_43, + 1, 83, :_reduce_44, + 5, 84, :_reduce_45, + 1, 85, :_reduce_46, + 1, 87, :_reduce_47, + 1, 82, :_reduce_none, + 1, 82, :_reduce_none, + 1, 86, :_reduce_none, + 3, 86, :_reduce_none, + 1, 88, :_reduce_52, + 3, 88, :_reduce_53, + 1, 89, :_reduce_54, + 1, 63, :_reduce_none, + 1, 63, :_reduce_none, + 1, 63, :_reduce_none, + 3, 90, :_reduce_58, + 3, 90, :_reduce_59, + 1, 91, :_reduce_60, + 2, 92, :_reduce_61, + 2, 92, :_reduce_62, + 1, 93, :_reduce_none, + 1, 93, :_reduce_none, + 1, 95, :_reduce_65, + 2, 96, :_reduce_66, + 1, 97, :_reduce_none, + 1, 97, :_reduce_none, + 1, 98, :_reduce_none, + 2, 98, :_reduce_none, + 1, 99, :_reduce_none, + 2, 99, :_reduce_none, + 1, 94, :_reduce_73, + 2, 94, :_reduce_74, + 3, 60, :_reduce_75, + 1, 65, :_reduce_76, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 1, 61, :_reduce_none, + 3, 100, :_reduce_92, + 3, 101, :_reduce_93, + 3, 102, :_reduce_94, + 3, 103, :_reduce_95, + 3, 104, :_reduce_96, + 3, 105, :_reduce_97, + 3, 106, :_reduce_98, + 3, 107, :_reduce_99, + 3, 108, :_reduce_100, + 3, 109, :_reduce_101, + 3, 110, :_reduce_102, + 3, 111, :_reduce_103, + 3, 112, :_reduce_104, + 3, 113, :_reduce_105, + 3, 114, :_reduce_106, + 1, 62, :_reduce_none, + 1, 62, :_reduce_none, + 1, 62, :_reduce_none, + 1, 62, :_reduce_none, + 2, 115, :_reduce_111, + 2, 116, :_reduce_112, + 2, 117, :_reduce_113, + 2, 118, :_reduce_114, + 1, 59, :_reduce_none, + 1, 59, :_reduce_none, + 1, 59, :_reduce_none, + 1, 59, :_reduce_none, + 1, 59, :_reduce_none, + 1, 59, :_reduce_none, + 1, 59, :_reduce_none, + 1, 120, :_reduce_122, + 1, 119, :_reduce_123, + 1, 122, :_reduce_124, + 1, 123, :_reduce_125, + 1, 124, :_reduce_126, + 1, 125, :_reduce_127, + 1, 121, :_reduce_128, + 1, 121, :_reduce_none, + 1, 121, :_reduce_none, + 3, 126, :_reduce_131, + 3, 129, :_reduce_132, + 1, 128, :_reduce_133, + 2, 128, :_reduce_134, + 1, 130, :_reduce_135, + 1, 130, :_reduce_136, + 2, 127, :_reduce_137, + 1, 131, :_reduce_138, + 2, 131, :_reduce_139 ] + +racc_reduce_n = 140 + +racc_shift_n = 187 + +racc_token_table = { + false => 0, + :error => 1, + :IDENTIFIER => 2, + :EQUAL => 3, + :PLUS => 4, + :MINUS => 5, + :ASTERISK => 6, + :FWD_SLASH => 7, + :COLON => 8, + :FLOAT => 9, + :INTEGER => 10, + :STRING => 11, + :EXPO => 12, + :INDENT => 13, + :OUTDENT => 14, + :OPAREN => 15, + :CPAREN => 16, + :DOT => 17, + :SIGNATURE => 18, + :NL => 19, + :EOF => 20, + :PIPE => 21, + :COMMA => 22, + :NIL => 23, + :TRUE => 24, + :FALSE => 25, + :EQUALITY => 26, + :CALL => 27, + :SELF => 28, + :CONSTANT => 29, + :CHAR => 30, + :DOUBLE_TICK_STRING => 31, + :DOUBLE_TICK_STRING_END => 32, + :INTERPOLATE_START => 33, + :INTERPOLATE_END => 34, + :BOX => 35, + :LSQUARE => 36, + :RSQUARE => 37, + :FACES => 38, + :LFACE => 39, + :RFACE => 40, + :BANG => 41, + :TILDE => 42, + :RETURN => 43, + :NOT_EQUALITY => 44, + :OR => 45, + :AND => 46, + :GT => 47, + :LT => 48, + :GTE => 49, + :LTE => 50, + :AT => 51, + :PERCENT => 52 } + +racc_nt_base = 53 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "IDENTIFIER", + "EQUAL", + "PLUS", + "MINUS", + "ASTERISK", + "FWD_SLASH", + "COLON", + "FLOAT", + "INTEGER", + "STRING", + "EXPO", + "INDENT", + "OUTDENT", + "OPAREN", + "CPAREN", + "DOT", + "SIGNATURE", + "NL", + "EOF", + "PIPE", + "COMMA", + "NIL", + "TRUE", + "FALSE", + "EQUALITY", + "CALL", + "SELF", + "CONSTANT", + "CHAR", + "DOUBLE_TICK_STRING", + "DOUBLE_TICK_STRING_END", + "INTERPOLATE_START", + "INTERPOLATE_END", + "BOX", + "LSQUARE", + "RSQUARE", + "FACES", + "LFACE", + "RFACE", + "BANG", + "TILDE", + "RETURN", + "NOT_EQUALITY", + "OR", + "AND", + "GT", + "LT", + "GTE", + "LTE", + "AT", + "PERCENT", + "$start", + "statements", + "statement", + "expr", + "eol", + "nlq", + "literal", + "grouped_expr", + "binary_op", + "unary_op", + "method_call", + "constant", + "variable", + "array", + "hash", + "return", + "return_expr", + "return_nil", + "empty_array", + "array_list", + "array_items", + "empty_hash", + "hash_list", + "hash_items", + "hash_item", + "indented", + "indented_w_stmts", + "indented_w_expr", + "indented_wo_stmts", + "indent", + "outdent", + "indent_w_args", + "indent_pipe", + "indent_args", + "indent_wo_args", + "indent_arg", + "arg_var", + "method_call_on_object", + "method_call_on_self", + "method_call_on_closure", + "call_signature", + "call_arguments", + "call_simple_name", + "call_argument", + "call_passed_arg", + "call_passed_simple", + "call_passed_indented", + "assignment", + "addition", + "subtraction", + "multiplication", + "division", + "exponentiation", + "modulo", + "equality", + "not_equality", + "logical_or", + "logical_and", + "greater_than", + "less_than", + "greater_or_eq", + "less_or_eq", + "unary_not", + "unary_plus", + "unary_minus", + "unary_complement", + "integer", + "float", + "string", + "nil", + "true", + "false", + "self", + "interpolated_string", + "empty_string", + "interpolated_string_contents", + "interpolation", + "interpolated_string_chunk", + "chars" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +module_eval(<<'.,.,', 'huia.y', 44) + def _reduce_2(val, _values, result) + return scope + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 46) + def _reduce_3(val, _values, result) + return scope.append val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 47) + def _reduce_4(val, _values, result) + return scope.append val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 48) + def _reduce_5(val, _values, result) + return scope + result + end +.,., + +# reduce 6 omitted + +# reduce 7 omitted + +# reduce 8 omitted + +# reduce 9 omitted + +# reduce 10 omitted + +# reduce 11 omitted + +# reduce 12 omitted + +# reduce 13 omitted + +# reduce 14 omitted + +# reduce 15 omitted + +# reduce 16 omitted + +# reduce 17 omitted + +# reduce 18 omitted + +# reduce 19 omitted + +# reduce 20 omitted + +# reduce 21 omitted + +module_eval(<<'.,.,', 'huia.y', 66) + def _reduce_22(val, _values, result) + return n(:Return, val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 67) + def _reduce_23(val, _values, result) + return n(:Return, n(:Nil)) + result + end +.,., + +# reduce 24 omitted + +# reduce 25 omitted + +module_eval(<<'.,.,', 'huia.y', 72) + def _reduce_26(val, _values, result) + return n :Array + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 74) + def _reduce_27(val, _values, result) + return val[1] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 75) + def _reduce_28(val, _values, result) + return n :Array, [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 76) + def _reduce_29(val, _values, result) + val[0].append(val[2]); return val[0] + result + end +.,., + +# reduce 30 omitted + +# reduce 31 omitted + +module_eval(<<'.,.,', 'huia.y', 80) + def _reduce_32(val, _values, result) + return n :Hash + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 81) + def _reduce_33(val, _values, result) + return val[1] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 82) + def _reduce_34(val, _values, result) + return n :Hash, val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 83) + def _reduce_35(val, _values, result) + val[0].append(val[2]); return val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 84) + def _reduce_36(val, _values, result) + return n :HashItem, val[0], val[2] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 86) + def _reduce_37(val, _values, result) + return constant val[0] + result + end +.,., + +# reduce 38 omitted + +# reduce 39 omitted + +# reduce 40 omitted + +module_eval(<<'.,.,', 'huia.y', 91) + def _reduce_41(val, _values, result) + return val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 92) + def _reduce_42(val, _values, result) + return val[0].append(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 93) + def _reduce_43(val, _values, result) + return val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 94) + def _reduce_44(val, _values, result) + return pop_scope + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 97) + def _reduce_45(val, _values, result) + return val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 98) + def _reduce_46(val, _values, result) + return push_scope + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 99) + def _reduce_47(val, _values, result) + return push_scope + result + end +.,., + +# reduce 48 omitted + +# reduce 49 omitted + +# reduce 50 omitted + +# reduce 51 omitted + +module_eval(<<'.,.,', 'huia.y', 105) + def _reduce_52(val, _values, result) + return scope.add_argument val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 106) + def _reduce_53(val, _values, result) + return n :Assignment, val[0], val[2] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 107) + def _reduce_54(val, _values, result) + return n :Variable, val[0] + result + end +.,., + +# reduce 55 omitted + +# reduce 56 omitted + +# reduce 57 omitted + +module_eval(<<'.,.,', 'huia.y', 112) + def _reduce_58(val, _values, result) + return n :MethodCall, val[0], val[2] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 113) + def _reduce_59(val, _values, result) + return n :MethodCall, val[0], n(:CallSignature, val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 114) + def _reduce_60(val, _values, result) + return n :MethodCall, scope_instance, val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 116) + def _reduce_61(val, _values, result) + return n :MethodCall, this_closure, val[1] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 117) + def _reduce_62(val, _values, result) + return n :MethodCall, this_closure, n(:CallSignature, val[1]) + result + end +.,., + +# reduce 63 omitted + +# reduce 64 omitted + +module_eval(<<'.,.,', 'huia.y', 121) + def _reduce_65(val, _values, result) + return n :CallSignature, val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 122) + def _reduce_66(val, _values, result) + return n :CallSignature, val[0], [val[1]] + result + end +.,., + +# reduce 67 omitted + +# reduce 68 omitted + +# reduce 69 omitted + +# reduce 70 omitted + +# reduce 71 omitted + +# reduce 72 omitted + +module_eval(<<'.,.,', 'huia.y', 129) + def _reduce_73(val, _values, result) + return val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 130) + def _reduce_74(val, _values, result) + return val[0].concat_signature val[1] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 132) + def _reduce_75(val, _values, result) + return n :Expression, val[1] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 134) + def _reduce_76(val, _values, result) + return allocate_local val[0] + result + end +.,., + +# reduce 77 omitted + +# reduce 78 omitted + +# reduce 79 omitted + +# reduce 80 omitted + +# reduce 81 omitted + +# reduce 82 omitted + +# reduce 83 omitted + +# reduce 84 omitted + +# reduce 85 omitted + +# reduce 86 omitted + +# reduce 87 omitted + +# reduce 88 omitted + +# reduce 89 omitted + +# reduce 90 omitted + +# reduce 91 omitted + +module_eval(<<'.,.,', 'huia.y', 152) + def _reduce_92(val, _values, result) + return allocate_local_assignment val[0], val[2] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 153) + def _reduce_93(val, _values, result) + return binary val[0], val[2], 'plus:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 154) + def _reduce_94(val, _values, result) + return binary val[0], val[2], 'minus:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 155) + def _reduce_95(val, _values, result) + return binary val[0], val[2], 'multiplyBy:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 156) + def _reduce_96(val, _values, result) + return binary val[0], val[2], 'divideBy:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 157) + def _reduce_97(val, _values, result) + return binary val[0], val[2], 'toThePowerOf:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 158) + def _reduce_98(val, _values, result) + return binary val[0], val[2], 'moduloOf:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 159) + def _reduce_99(val, _values, result) + return binary val[0], val[2], 'isEqualTo:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 160) + def _reduce_100(val, _values, result) + return binary val[0], val[2], 'isNotEqualTo:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 161) + def _reduce_101(val, _values, result) + return binary val[0], val[2], 'logicalOr:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 162) + def _reduce_102(val, _values, result) + return binary val[0], val[2], 'logicalAnd:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 163) + def _reduce_103(val, _values, result) + return binary val[0], val[2], 'isGreaterThan:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 164) + def _reduce_104(val, _values, result) + return binary val[0], val[2], 'isLessThan:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 165) + def _reduce_105(val, _values, result) + return binary val[0], val[2], 'isGreaterOrEqualTo:' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 166) + def _reduce_106(val, _values, result) + return binary val[0], val[2], 'isLessOrEqualTo:' + result + end +.,., + +# reduce 107 omitted + +# reduce 108 omitted + +# reduce 109 omitted + +# reduce 110 omitted + +module_eval(<<'.,.,', 'huia.y', 173) + def _reduce_111(val, _values, result) + return unary val[1], 'unaryNot' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 174) + def _reduce_112(val, _values, result) + return unary val[1], 'unaryPlus' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 175) + def _reduce_113(val, _values, result) + return unary val[1], 'unaryMinus' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 176) + def _reduce_114(val, _values, result) + return unary val[1], 'unaryComplement' + result + end +.,., + +# reduce 115 omitted + +# reduce 116 omitted + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +# reduce 121 omitted + +module_eval(<<'.,.,', 'huia.y', 186) + def _reduce_122(val, _values, result) + return n :Float, val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 187) + def _reduce_123(val, _values, result) + return n :Integer, val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 188) + def _reduce_124(val, _values, result) + return n :Nil + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 189) + def _reduce_125(val, _values, result) + return n :True + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 190) + def _reduce_126(val, _values, result) + return n :False + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 191) + def _reduce_127(val, _values, result) + return n :Self + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 193) + def _reduce_128(val, _values, result) + return n :String, val[0] + result + end +.,., + +# reduce 129 omitted + +# reduce 130 omitted + +module_eval(<<'.,.,', 'huia.y', 197) + def _reduce_131(val, _values, result) + return val[1] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 198) + def _reduce_132(val, _values, result) + return val[1] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 199) + def _reduce_133(val, _values, result) + return n :InterpolatedString, val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 200) + def _reduce_134(val, _values, result) + val[0].append(val[1]); return val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 201) + def _reduce_135(val, _values, result) + return val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 202) + def _reduce_136(val, _values, result) + return to_string(val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 203) + def _reduce_137(val, _values, result) + return n :String, '' + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 205) + def _reduce_138(val, _values, result) + return n :String, val[0] + result + end +.,., + +module_eval(<<'.,.,', 'huia.y', 206) + def _reduce_139(val, _values, result) + val[0].append(val[1]); return val[0] + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module Huia diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/journey b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/journey new file mode 100644 index 000000000000..3daf81dac0e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/journey @@ -0,0 +1,222 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + + +require 'journey/parser_extras' +module Journey + class Parser < Racc::Parser +##### State transition tables begin ### + +racc_action_table = [ + 17, 21, 13, 15, 14, 7, nil, 16, 8, 19, + 13, 15, 14, 7, 23, 16, 8, 19, 13, 15, + 14, 7, nil, 16, 8, 13, 15, 14, 7, nil, + 16, 8, 13, 15, 14, 7, nil, 16, 8 ] + +racc_action_check = [ + 1, 17, 1, 1, 1, 1, nil, 1, 1, 1, + 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, + 0, 0, nil, 0, 0, 7, 7, 7, 7, nil, + 7, 7, 19, 19, 19, 19, nil, 19, 19 ] + +racc_action_pointer = [ + 16, 0, nil, nil, nil, nil, nil, 23, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 1, nil, 30, + 8, nil, nil, nil ] + +racc_action_default = [ + -18, -18, -2, -3, -4, -5, -6, -18, -9, -10, + -11, -12, -13, -14, -15, -16, -17, -18, -1, -18, + -18, 24, -8, -7 ] + +racc_goto_table = [ + 18, 1, nil, nil, nil, nil, nil, nil, 20, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 22, 18 ] + +racc_goto_check = [ + 2, 1, nil, nil, nil, nil, nil, nil, 1, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 2, 2 ] + +racc_goto_pointer = [ + nil, 1, -1, nil, nil, nil, nil, nil, nil, nil, + nil ] + +racc_goto_default = [ + nil, nil, 2, 3, 4, 5, 6, 9, 10, 11, + 12 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 2, 11, :_reduce_1, + 1, 11, :_reduce_2, + 1, 11, :_reduce_none, + 1, 12, :_reduce_none, + 1, 12, :_reduce_none, + 1, 12, :_reduce_none, + 3, 15, :_reduce_7, + 3, 13, :_reduce_8, + 1, 16, :_reduce_9, + 1, 14, :_reduce_none, + 1, 14, :_reduce_none, + 1, 14, :_reduce_none, + 1, 14, :_reduce_none, + 1, 19, :_reduce_14, + 1, 17, :_reduce_15, + 1, 18, :_reduce_16, + 1, 20, :_reduce_17 ] + +racc_reduce_n = 18 + +racc_shift_n = 24 + +racc_token_table = { + false => 0, + :error => 1, + :SLASH => 2, + :LITERAL => 3, + :SYMBOL => 4, + :LPAREN => 5, + :RPAREN => 6, + :DOT => 7, + :STAR => 8, + :OR => 9 } + +racc_nt_base = 10 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "SLASH", + "LITERAL", + "SYMBOL", + "LPAREN", + "RPAREN", + "DOT", + "STAR", + "OR", + "$start", + "expressions", + "expression", + "or", + "terminal", + "group", + "star", + "symbol", + "literal", + "slash", + "dot" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'journey.y', 6) + def _reduce_1(val, _values, result) + result = Cat.new(val.first, val.last) + result + end +.,., + +module_eval(<<'.,.,', 'journey.y', 7) + def _reduce_2(val, _values, result) + result = val.first + result + end +.,., + +# reduce 3 omitted + +# reduce 4 omitted + +# reduce 5 omitted + +# reduce 6 omitted + +module_eval(<<'.,.,', 'journey.y', 16) + def _reduce_7(val, _values, result) + result = Group.new(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'journey.y', 19) + def _reduce_8(val, _values, result) + result = Or.new([val.first, val.last]) + result + end +.,., + +module_eval(<<'.,.,', 'journey.y', 22) + def _reduce_9(val, _values, result) + result = Star.new(Symbol.new(val.last)) + result + end +.,., + +# reduce 10 omitted + +# reduce 11 omitted + +# reduce 12 omitted + +# reduce 13 omitted + +module_eval(<<'.,.,', 'journey.y', 31) + def _reduce_14(val, _values, result) + result = Slash.new('/') + result + end +.,., + +module_eval(<<'.,.,', 'journey.y', 34) + def _reduce_15(val, _values, result) + result = Symbol.new(val.first) + result + end +.,., + +module_eval(<<'.,.,', 'journey.y', 37) + def _reduce_16(val, _values, result) + result = Literal.new(val.first) + result + end +.,., + +module_eval(<<'.,.,', 'journey.y', 39) + def _reduce_17(val, _values, result) + result = Dot.new(val.first) + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module Journey diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/liquor b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/liquor new file mode 100644 index 000000000000..9fa2ca4da0be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/liquor @@ -0,0 +1,885 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +module Liquor + class Parser < Racc::Parser + +module_eval(<<'...end liquor.y/module_eval...', 'liquor.y', 216) + attr_reader :errors, :ast + + def initialize(tags={}) + super() + + @errors = [] + @ast = nil + @tags = tags + end + + def success? + @errors.empty? + end + + def parse(string, name='(code)') + @errors.clear + @name = name + @ast = nil + + begin + @stream = Lexer.lex(string, @name, @tags) + @ast = do_parse + rescue Liquor::SyntaxError => e + @errors << e + end + + success? + end + + def next_token + tok = @stream.shift + [ tok[0], tok ] if tok + end + + TOKEN_NAME_MAP = { + :comma => ',', + :dot => '.', + :lblock => '{%', + :rblock => '%}', + :linterp => '{{', + :rinterp => '}}', + :lbracket => '[', + :rbracket => ']', + :lparen => '(', + :rparen => ')', + :pipe => '|', + :op_not => '!', + :op_mul => '*', + :op_div => '/', + :op_mod => '%', + :op_plus => '+', + :op_minus => '-', + :op_eq => '==', + :op_neq => '!=', + :op_lt => '<', + :op_leq => '<=', + :op_gt => '>', + :op_geq => '>=', + :keyword => 'keyword argument name', + :kwarg => 'keyword argument', + :ident => 'identifier', + } + + def on_error(error_token_id, error_token, value_stack) + if token_to_str(error_token_id) == "$end" + raise Liquor::SyntaxError.new("unexpected end of program", { + file: @name + }) + else + type, (loc, value) = error_token + type = TOKEN_NAME_MAP[type] || type + + raise Liquor::SyntaxError.new("unexpected token `#{type}'", loc) + end + end + + def retag(nodes) + loc = nodes.map { |node| node[1] }.compact + first, *, last = loc + return first if last.nil? + + { + file: first[:file], + line: first[:line], + start: first[:start], + end: last[:end], + } + end + + def reduce_tag_args(list) + list.each_slice(2).reduce([]) { |args, (k, v)| + if v[0] == :block + args << [ :blockarg, retag([ k, v ]), k, v[2] || [] ] + else + args << [ :kwarg, retag([ k, v ]), k, v ] + end + } + end +...end liquor.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 76, 26, 26, 6, 7, 22, 5, 6, 25, 25, + 5, 28, 32, 36, 37, 34, 35, 31, 29, 27, + 33, 2, 30, 26, 26, 2, 6, 23, 41, 5, + 25, 25, 38, 39, 28, 32, 36, 37, 34, 35, + 31, 29, 27, 33, 2, 30, 40, 26, 96, 6, + 24, 97, 5, 43, 25, 38, 39, 28, 32, 36, + 37, 34, 35, 31, 29, 27, 33, 2, 30, 26, + 54, 70, 77, 26, 75, 26, 25, 52, 38, 39, + 25, 43, 25, 28, 32, 36, 37, 34, 35, 31, + 29, 27, 33, 26, 30, 84, 26, 51, 6, 96, + 25, 5, 97, 25, 38, 39, 28, 32, 36, 37, + 34, 35, 31, 29, 27, 33, 2, 30, 74, 26, + 87, 82, 96, 74, 70, 97, 25, 38, 39, 28, + 32, 36, 37, 34, 35, 31, 29, 27, 33, 94, + 30, 98, 26, 107, 6, 111, 52, 5, nil, 25, + 38, 39, 28, 32, 36, 37, 34, 35, 31, 29, + 27, 33, 2, 30, nil, 26, 51, 6, nil, 74, + 5, nil, 25, 38, 39, 28, 32, 36, 37, 34, + 35, 31, 29, 27, 33, 2, 30, nil, 26, nil, + nil, nil, 102, nil, nil, 25, 38, 39, 28, 32, + 36, 37, 34, 35, 31, 29, 27, 33, nil, 30, + nil, 26, 96, nil, nil, 97, nil, nil, 25, 38, + 39, 28, 32, 36, 37, 34, 35, 31, 29, 27, + 33, nil, 30, nil, 26, nil, nil, nil, nil, nil, + nil, 25, 38, 39, 28, 32, 36, 37, 34, 35, + 31, 29, 27, 33, nil, 30, 13, 15, nil, 13, + 15, 21, nil, 14, 21, 38, 14, nil, nil, nil, + 18, nil, nil, 18, 19, nil, nil, 19, nil, 13, + 15, nil, 16, nil, 21, 16, 14, nil, nil, 13, + 15, nil, nil, 18, 21, nil, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, 52, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, 51, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, 74, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, 81, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, nil, 18, 21, 16, 14, 19, nil, 13, + 15, nil, 26, 18, 21, 16, 14, 19, nil, 25, + nil, 101, 28, 18, nil, 16, nil, 19, 31, 29, + 27, 106, 26, 30, nil, 16, nil, nil, nil, 25, + nil, nil, 28, nil, 26, nil, nil, nil, 31, 29, + 27, 25, nil, 30, 28, nil, 26, nil, nil, nil, + 31, 29, 27, 25, nil, 30, 28, nil, 26, nil, + nil, nil, 31, 29, 27, 25, nil, 30, 28, nil, + 26, nil, nil, nil, 31, 29, 27, 25, nil, 30, + 28, nil, 26, nil, nil, nil, 31, 29, 27, 25, + nil, 30, 28, 32, 36, 37, 34, 35, 31, 29, + 27, 33, 26, 30, 26, nil, nil, nil, nil, 25, + nil, 25, 28, nil, 28, nil, nil, nil, nil, 29, + 27, 29, 27 ] + +racc_action_check = [ + 47, 47, 45, 0, 1, 6, 0, 2, 47, 45, + 2, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 0, 47, 46, 11, 2, 3, 7, 12, 3, + 46, 11, 47, 47, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 3, 11, 11, 44, 94, 4, + 11, 94, 4, 13, 44, 11, 11, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 4, 44, 55, + 26, 40, 48, 49, 44, 56, 55, 49, 44, 44, + 49, 54, 56, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 57, 49, 69, 53, 49, 81, 107, + 57, 81, 107, 53, 49, 49, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 81, 53, 70, 71, + 72, 53, 111, 71, 84, 111, 71, 53, 53, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 91, + 71, 96, 79, 103, 101, 109, 79, 101, nil, 79, + 71, 71, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 101, 79, nil, 88, 79, 106, nil, 88, + 106, nil, 88, 79, 79, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 106, 88, nil, 99, nil, + nil, nil, 99, nil, nil, 99, 88, 88, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, nil, 99, + nil, 104, 104, nil, nil, 104, nil, nil, 104, 99, + 99, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, nil, 104, nil, 67, nil, nil, nil, nil, nil, + nil, 67, 104, 104, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, nil, 67, 5, 5, nil, 14, + 14, 5, nil, 5, 14, 67, 14, nil, nil, nil, + 5, nil, nil, 14, 5, nil, nil, 14, nil, 18, + 18, nil, 5, nil, 18, 14, 18, nil, nil, 19, + 19, nil, nil, 18, 19, nil, 19, 18, nil, 21, + 21, nil, nil, 19, 21, 18, 21, 19, nil, 22, + 22, 22, nil, 21, 22, 19, 22, 21, nil, 25, + 25, nil, nil, 22, 25, 21, 25, 22, nil, 27, + 27, 22, nil, 25, 27, 22, 27, 25, nil, 28, + 28, nil, nil, 27, 28, 25, 28, 27, nil, 29, + 29, nil, nil, 28, 29, 27, 29, 28, nil, 30, + 30, nil, nil, 29, 30, 28, 30, 29, nil, 31, + 31, nil, nil, 30, 31, 29, 31, 30, nil, 32, + 32, nil, nil, 31, 32, 30, 32, 31, nil, 33, + 33, nil, nil, 32, 33, 31, 33, 32, nil, 34, + 34, nil, nil, 33, 34, 32, 34, 33, nil, 35, + 35, nil, nil, 34, 35, 33, 35, 34, nil, 36, + 36, nil, nil, 35, 36, 34, 36, 35, nil, 37, + 37, nil, nil, 36, 37, 35, 37, 36, nil, 38, + 38, nil, nil, 37, 38, 36, 38, 37, nil, 39, + 39, nil, nil, 38, 39, 37, 39, 38, nil, 43, + 43, 43, nil, 39, 43, 38, 43, 39, nil, 52, + 52, nil, nil, 43, 52, 39, 52, 43, nil, 74, + 74, nil, nil, 52, 74, 43, 74, 52, nil, 76, + 76, 52, nil, 74, 76, 52, 76, 74, nil, 97, + 97, nil, nil, 76, 97, 74, 97, 76, nil, 102, + 102, nil, 60, 97, 102, 76, 102, 97, nil, 60, + nil, 97, 60, 102, nil, 97, nil, 102, 60, 60, + 60, 102, 61, 60, nil, 102, nil, nil, nil, 61, + nil, nil, 61, nil, 62, nil, nil, nil, 61, 61, + 61, 62, nil, 61, 62, nil, 63, nil, nil, nil, + 62, 62, 62, 63, nil, 62, 63, nil, 64, nil, + nil, nil, 63, 63, 63, 64, nil, 63, 64, nil, + 65, nil, nil, nil, 64, 64, 64, 65, nil, 64, + 65, nil, 66, nil, nil, nil, 65, 65, 65, 66, + nil, 65, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 58, 66, 59, nil, nil, nil, nil, 58, + nil, 59, 58, nil, 59, nil, nil, nil, nil, 58, + 58, 59, 59 ] + +racc_action_pointer = [ + -5, 4, -1, 18, 41, 251, 0, 27, nil, nil, + nil, 21, -1, 41, 254, nil, nil, nil, 274, 284, + nil, 294, 304, nil, nil, 314, 65, 324, 334, 344, + 354, 364, 374, 384, 394, 404, 414, 424, 434, 444, + 66, nil, nil, 454, 44, -1, 20, -2, 44, 70, + nil, nil, 464, 93, 69, 66, 72, 90, 609, 611, + 509, 529, 541, 553, 565, 577, 589, 231, nil, 70, + 111, 116, 90, nil, 474, nil, 484, nil, nil, 139, + nil, 90, nil, nil, 119, nil, nil, nil, 162, nil, + nil, 130, nil, nil, 44, nil, 114, 494, nil, 185, + nil, 136, 504, 134, 208, nil, 159, 95, nil, 136, + nil, 118, nil ] + +racc_action_default = [ + -1, -57, -1, -1, -1, -57, -57, -57, -2, -3, + -4, -57, -57, -7, -57, -9, -10, -11, -57, -57, + -31, -35, -57, 113, -5, -57, -57, -57, -57, -57, + -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, + -57, -6, -12, -40, -57, -16, -17, -34, -57, -57, + -46, -47, -57, -57, -15, -18, -19, -20, -21, -22, + -23, -24, -25, -26, -27, -28, -29, -30, -41, -43, + -40, -40, -57, -38, -57, -8, -35, -32, -45, -57, + -48, -1, -13, -14, -57, -44, -37, -36, -40, -33, + -50, -57, -42, -39, -57, -49, -57, -57, -51, -57, + -52, -1, -57, -57, -57, -54, -1, -57, -56, -57, + -53, -57, -55 ] + +racc_goto_table = [ + 1, 11, 8, 9, 10, 48, 68, 12, 42, 50, + 44, 72, 80, 73, 45, 46, 100, 105, 49, nil, + nil, 53, nil, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 78, nil, nil, 71, + 85, 86, 95, nil, nil, nil, nil, nil, 79, 83, + 92, nil, 108, nil, nil, 110, nil, nil, 93, 112, + 89, nil, nil, nil, nil, nil, 90, nil, nil, nil, + 88, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 91, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 99, nil, nil, nil, nil, 104, nil, + nil, 103, nil, nil, nil, nil, 109 ] + +racc_goto_check = [ + 1, 4, 1, 1, 1, 9, 12, 5, 8, 14, + 4, 10, 15, 11, 4, 4, 17, 18, 4, nil, + nil, 4, nil, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 14, nil, nil, 4, + 11, 11, 16, nil, nil, nil, nil, nil, 4, 8, + 12, nil, 16, nil, nil, 16, nil, nil, 11, 16, + 9, nil, nil, nil, nil, nil, 14, nil, nil, nil, + 4, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 4, nil, nil, nil, nil, 4, nil, + nil, 1, nil, nil, nil, nil, 1 ] + +racc_goto_pointer = [ + nil, 0, nil, nil, -4, 2, nil, nil, -5, -16, + -32, -30, -34, nil, -13, -40, -52, -81, -85 ] + +racc_goto_default = [ + nil, nil, 3, 4, 47, nil, 20, 17, nil, nil, + nil, nil, nil, 69, nil, nil, nil, nil, nil ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 37, :_reduce_1, + 2, 37, :_reduce_2, + 2, 37, :_reduce_3, + 2, 37, :_reduce_4, + 3, 38, :_reduce_5, + 3, 38, :_reduce_6, + 1, 42, :_reduce_none, + 3, 42, :_reduce_8, + 1, 40, :_reduce_none, + 1, 40, :_reduce_none, + 1, 40, :_reduce_none, + 2, 40, :_reduce_12, + 4, 40, :_reduce_13, + 4, 40, :_reduce_14, + 3, 40, :_reduce_15, + 2, 40, :_reduce_16, + 2, 40, :_reduce_17, + 3, 40, :_reduce_18, + 3, 40, :_reduce_19, + 3, 40, :_reduce_20, + 3, 40, :_reduce_21, + 3, 40, :_reduce_22, + 3, 40, :_reduce_23, + 3, 40, :_reduce_24, + 3, 40, :_reduce_25, + 3, 40, :_reduce_26, + 3, 40, :_reduce_27, + 3, 40, :_reduce_28, + 3, 40, :_reduce_29, + 3, 40, :_reduce_30, + 1, 40, :_reduce_none, + 3, 43, :_reduce_32, + 3, 45, :_reduce_33, + 1, 45, :_reduce_34, + 0, 45, :_reduce_35, + 3, 44, :_reduce_36, + 2, 46, :_reduce_37, + 1, 46, :_reduce_38, + 3, 47, :_reduce_39, + 0, 47, :_reduce_40, + 3, 41, :_reduce_41, + 3, 48, :_reduce_42, + 1, 48, :_reduce_43, + 2, 49, :_reduce_44, + 4, 39, :_reduce_45, + 3, 39, :_reduce_46, + 1, 50, :_reduce_47, + 2, 50, :_reduce_48, + 4, 51, :_reduce_49, + 2, 51, :_reduce_50, + 2, 52, :_reduce_51, + 2, 52, :_reduce_52, + 4, 53, :_reduce_53, + 3, 53, :_reduce_54, + 4, 54, :_reduce_55, + 2, 54, :_reduce_56 ] + +racc_reduce_n = 57 + +racc_shift_n = 113 + +racc_token_table = { + false => 0, + :error => 1, + :comma => 2, + :dot => 3, + :endtag => 4, + :ident => 5, + :integer => 6, + :keyword => 7, + :lblock => 8, + :lblock2 => 9, + :lbracket => 10, + :linterp => 11, + :lparen => 12, + :op_div => 13, + :op_eq => 14, + :op_gt => 15, + :op_geq => 16, + :op_lt => 17, + :op_leq => 18, + :op_minus => 19, + :op_mod => 20, + :op_mul => 21, + :op_neq => 22, + :op_not => 23, + :op_plus => 24, + :pipe => 25, + :plaintext => 26, + :rblock => 27, + :rbracket => 28, + :rinterp => 29, + :rparen => 30, + :string => 31, + :tag_ident => 32, + :op_uminus => 33, + :op_and => 34, + :op_or => 35 } + +racc_nt_base = 36 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "comma", + "dot", + "endtag", + "ident", + "integer", + "keyword", + "lblock", + "lblock2", + "lbracket", + "linterp", + "lparen", + "op_div", + "op_eq", + "op_gt", + "op_geq", + "op_lt", + "op_leq", + "op_minus", + "op_mod", + "op_mul", + "op_neq", + "op_not", + "op_plus", + "pipe", + "plaintext", + "rblock", + "rbracket", + "rinterp", + "rparen", + "string", + "tag_ident", + "op_uminus", + "op_and", + "op_or", + "$start", + "block", + "interp", + "tag", + "expr", + "filter_chain", + "primary_expr", + "tuple", + "function_args", + "tuple_content", + "function_args_inside", + "function_keywords", + "filter_chain_cont", + "filter_call", + "tag_first_cont", + "tag_first_cont2", + "tag_next_cont", + "tag_next_cont2", + "tag_next_cont3" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'liquor.y', 47) + def _reduce_1(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 49) + def _reduce_2(val, _values, result) + result = [ val[0], *val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 51) + def _reduce_3(val, _values, result) + result = [ val[0], *val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 53) + def _reduce_4(val, _values, result) + result = [ val[0], *val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 57) + def _reduce_5(val, _values, result) + result = [ :interp, retag(val), val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 59) + def _reduce_6(val, _values, result) + result = [ :interp, retag(val), val[1] ] + result + end +.,., + +# reduce 7 omitted + +module_eval(<<'.,.,', 'liquor.y', 64) + def _reduce_8(val, _values, result) + result = [ val[1][0], retag(val), *val[1][2..-1] ] + result + end +.,., + +# reduce 9 omitted + +# reduce 10 omitted + +# reduce 11 omitted + +module_eval(<<'.,.,', 'liquor.y', 71) + def _reduce_12(val, _values, result) + result = [ :call, retag(val), val[0], val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 73) + def _reduce_13(val, _values, result) + result = [ :index, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 75) + def _reduce_14(val, _values, result) + result = [ :external, retag(val), val[0], val[2], val[3] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 77) + def _reduce_15(val, _values, result) + result = [ :external, retag(val), val[0], val[2], nil ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 79) + def _reduce_16(val, _values, result) + result = [ :uminus, retag(val), val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 81) + def _reduce_17(val, _values, result) + result = [ :not, retag(val), val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 83) + def _reduce_18(val, _values, result) + result = [ :mul, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 85) + def _reduce_19(val, _values, result) + result = [ :div, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 87) + def _reduce_20(val, _values, result) + result = [ :mod, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 89) + def _reduce_21(val, _values, result) + result = [ :plus, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 91) + def _reduce_22(val, _values, result) + result = [ :minus, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 93) + def _reduce_23(val, _values, result) + result = [ :eq, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 95) + def _reduce_24(val, _values, result) + result = [ :neq, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 97) + def _reduce_25(val, _values, result) + result = [ :lt, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 99) + def _reduce_26(val, _values, result) + result = [ :leq, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 101) + def _reduce_27(val, _values, result) + result = [ :gt, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 103) + def _reduce_28(val, _values, result) + result = [ :geq, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 105) + def _reduce_29(val, _values, result) + result = [ :and, retag(val), val[0], val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 107) + def _reduce_30(val, _values, result) + result = [ :or, retag(val), val[0], val[2] ] + result + end +.,., + +# reduce 31 omitted + +module_eval(<<'.,.,', 'liquor.y', 112) + def _reduce_32(val, _values, result) + result = [ :tuple, retag(val), val[1].compact ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 116) + def _reduce_33(val, _values, result) + result = [ val[0], *val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 118) + def _reduce_34(val, _values, result) + result = [ val[0] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 120) + def _reduce_35(val, _values, result) + result = [ ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 124) + def _reduce_36(val, _values, result) + result = [ :args, retag(val), *val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 128) + def _reduce_37(val, _values, result) + result = [ val[0], val[1][2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 130) + def _reduce_38(val, _values, result) + result = [ nil, val[0][2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 134) + def _reduce_39(val, _values, result) + name = val[0][2].to_sym + tail = val[2][2] + loc = retag([ val[0], val[1] ]) + + if tail.include? name + @errors << SyntaxError.new("duplicate keyword argument `#{val[0][2]}'", + tail[name][1]) + end + + hash = { + name => [ val[1][0], loc, *val[1][2..-1] ] + }.merge(tail) + + result = [ :keywords, retag([ loc, val[2] ]), hash ] + + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 150) + def _reduce_40(val, _values, result) + result = [ :keywords, nil, {} ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 154) + def _reduce_41(val, _values, result) + result = [ val[0], *val[2] ]. + reduce { |tree, node| node[3][2] = tree; node } + + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 160) + def _reduce_42(val, _values, result) + result = [ val[0], *val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 162) + def _reduce_43(val, _values, result) + result = [ val[0] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 166) + def _reduce_44(val, _values, result) + ident_loc = val[0][1] + empty_args_loc = { line: ident_loc[:line], + start: ident_loc[:end] + 1, + end: ident_loc[:end] + 1, } + result = [ :call, val[0][1], val[0], + [ :args, val[1][1] || empty_args_loc, nil, val[1][2] ] ] + + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 176) + def _reduce_45(val, _values, result) + result = [ :tag, retag(val), val[1], val[2], *reduce_tag_args(val[3][2]) ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 178) + def _reduce_46(val, _values, result) + result = [ :tag, retag(val), val[1], nil, *reduce_tag_args(val[2][2]) ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 186) + def _reduce_47(val, _values, result) + result = [ :cont, retag(val), [] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 188) + def _reduce_48(val, _values, result) + result = [ :cont, retag(val), [ val[0], *val[1][2] ] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 192) + def _reduce_49(val, _values, result) + result = [ :cont2, val[0][1], [ [:block, val[0][1], val[1] ], *val[3] ] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 194) + def _reduce_50(val, _values, result) + result = [ :cont2, retag(val), [ val[0], *val[1][2] ] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 198) + def _reduce_51(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 200) + def _reduce_52(val, _values, result) + result = [ val[0], *val[1] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 204) + def _reduce_53(val, _values, result) + result = [ [:block, val[0][1], val[1] ], *val[3] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 206) + def _reduce_54(val, _values, result) + result = [ val[0], val[1], *val[2] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 210) + def _reduce_55(val, _values, result) + result = [ [:block, val[0][1], val[1] ], *val[3] ] + result + end +.,., + +module_eval(<<'.,.,', 'liquor.y', 212) + def _reduce_56(val, _values, result) + result = [ val[0], *val[1] ] + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module Liquor diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/machete b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/machete new file mode 100644 index 000000000000..6297fe2ac92b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/machete @@ -0,0 +1,833 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +module Machete + class Parser < Racc::Parser + +module_eval(<<'...end machete.y/module_eval...', 'machete.y', 175) + +include Matchers + +class SyntaxError < StandardError; end + +def parse(input) + @input = input + @pos = 0 + + do_parse +end + +private + +def integer_value(value) + if value =~ /^0[bB]/ + value[2..-1].to_i(2) + elsif value =~ /^0[oO]/ + value[2..-1].to_i(8) + elsif value =~ /^0[dD]/ + value[2..-1].to_i(10) + elsif value =~ /^0[xX]/ + value[2..-1].to_i(16) + elsif value =~ /^0/ + value.to_i(8) + else + value.to_i + end +end + +def symbol_value(value) + value[1..-1].to_sym +end + +def string_value(value) + quote = value[0..0] + if quote == "'" + value[1..-2].gsub("\\\\", "\\").gsub("\\'", "'") + elsif quote == '"' + value[1..-2]. + gsub("\\\\", "\\"). + gsub('\\"', '"'). + gsub("\\n", "\n"). + gsub("\\t", "\t"). + gsub("\\r", "\r"). + gsub("\\f", "\f"). + gsub("\\v", "\v"). + gsub("\\a", "\a"). + gsub("\\e", "\e"). + gsub("\\b", "\b"). + gsub("\\s", "\s"). + gsub(/\\([0-7]{1,3})/) { $1.to_i(8).chr }. + gsub(/\\x([0-9a-fA-F]{1,2})/) { $1.to_i(16).chr } + else + raise "Unknown quote: #{quote.inspect}." + end +end + +REGEXP_OPTIONS = { + 'i' => Regexp::IGNORECASE, + 'm' => Regexp::MULTILINE, + 'x' => Regexp::EXTENDED +} + +def regexp_value(value) + /\A\/(.*)\/([imx]*)\z/ =~ value + pattern, options = $1, $2 + + Regexp.new(pattern, options.chars.map { |ch| REGEXP_OPTIONS[ch] }.inject(:|)) +end + +# "^" needs to be here because if it were among operators recognized by +# METHOD_NAME, "^=" would be recognized as two tokens. +SIMPLE_TOKENS = [ + "|", + "<", + ">", + ",", + "=", + "^=", + "^", + "$=", + "[", + "]", + "*=", + "*", + "+", + "?", + "{", + "}" +] + +COMPLEX_TOKENS = [ + [:NIL, /^nil/], + [:TRUE, /^true/], + [:FALSE, /^false/], + # INTEGER needs to be before METHOD_NAME, otherwise e.g. "+1" would be + # recognized as two tokens. + [ + :INTEGER, + /^ + [+-]? # sign + ( + 0[bB][01]+(_[01]+)* # binary (prefixed) + | + 0[oO][0-7]+(_[0-7]+)* # octal (prefixed) + | + 0[dD]\d+(_\d+)* # decimal (prefixed) + | + 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)* # hexadecimal (prefixed) + | + 0[0-7]*(_[0-7]+)* # octal (unprefixed) + | + [1-9]\d*(_\d+)* # decimal (unprefixed) + ) + /x + ], + [ + :SYMBOL, + /^ + : + ( + # class name + [A-Z][a-zA-Z0-9_]* + | + # regular method name + [a-z_][a-zA-Z0-9_]*[?!=]? + | + # instance variable name + @[a-zA-Z_][a-zA-Z0-9_]* + | + # class variable name + @@[a-zA-Z_][a-zA-Z0-9_]* + | + # operator (sorted by length, then alphabetically) + (<=>|===|\[\]=|\*\*|\+@|-@|<<|<=|==|=~|>=|>>|\[\]|[%&*+\-\/<>^`|~]) + ) + /x + ], + [ + :STRING, + /^ + ( + ' # sinqle-quoted string + ( + \\[\\'] # escape + | + [^'] # regular character + )* + ' + | + " # double-quoted string + ( + \\ # escape + ( + [\\"ntrfvaebs] # one-character escape + | + [0-7]{1,3} # octal number escape + | + x[0-9a-fA-F]{1,2} # hexadecimal number escape + ) + | + [^"] # regular character + )* + " + ) + /x + ], + [ + :REGEXP, + /^ + \/ + ( + \\ # escape + ( + [\\\/ntrfvaebs\(\)\[\]\{\}\-\.\?\*\+\|\^\$] # one-character escape + | + [0-7]{2,3} # octal number escape + | + x[0-9a-fA-F]{1,2} # hexadecimal number escape + ) + | + [^\/] # regular character + )* + \/ + [imx]* + /x + ], + # ANY, EVEN and ODD need to be before METHOD_NAME, otherwise they would be + # recognized as method names. + [:ANY, /^any/], + [:EVEN, /^even/], + [:ODD, /^odd/], + # We exclude "*", "+", "<", ">", "^" and "|" from method names since they are + # lexed as simple tokens. This is because they have also other meanings in + # Machette patterns beside Ruby method names. + [ + :METHOD_NAME, + /^ + ( + # regular name + [a-z_][a-zA-Z0-9_]*[?!=]? + | + # operator (sorted by length, then alphabetically) + (<=>|===|\[\]=|\*\*|\+@|-@|<<|<=|==|=~|>=|>>|\[\]|[%&\-\/`~]) + ) + /x + ], + [:CLASS_NAME, /^[A-Z][a-zA-Z0-9_]*/] +] + +def next_token + skip_whitespace + + return false if remaining_input.empty? + + # Complex tokens need to be before simple tokens, otherwise e.g. "<<" would be + # recognized as two tokens. + + COMPLEX_TOKENS.each do |type, regexp| + if remaining_input =~ regexp + @pos += $&.length + return [type, $&] + end + end + + SIMPLE_TOKENS.each do |token| + if remaining_input[0...token.length] == token + @pos += token.length + return [token, token] + end + end + + raise SyntaxError, "Unexpected character: #{remaining_input[0..0].inspect}." +end + +def skip_whitespace + if remaining_input =~ /\A^[ \t\r\n]+/ + @pos += $&.length + end +end + +def remaining_input + @input[@pos..-1] +end + +def on_error(error_token_id, error_value, value_stack) + raise SyntaxError, "Unexpected token: #{error_value.inspect}." +end +...end machete.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 75, 19, 9, 10, 11, 12, 13, 14, 15, 16, + 66, 67, 68, 7, 24, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 74, 8, 7, 47, 9, 10, + 11, 12, 13, 14, 15, 16, 48, 18, 8, 7, + 71, 9, 10, 11, 12, 13, 14, 15, 16, 72, + 70, 8, 7, 73, 9, 10, 11, 12, 13, 14, + 15, 16, 69, 18, 8, 7, 30, 31, 32, 51, + 52, 53, 54, 33, 34, 35, 29, 8, 41, 38, + 39, 76, 30, 31, 32, 77, 36, 37, 40, 33, + 34, 35, 29, nil, 41, 38, 39, 18, 49, 50, + 62, 63, 36, 37, 40, 43, 44, 55, 64, 65, + 45, 46, 57, 58, nil, nil, nil, nil, nil, 56 ] + +racc_action_check = [ + 70, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 54, 54, 54, 0, 17, 8, 8, 8, 8, 8, + 8, 8, 8, 1, 70, 0, 8, 21, 18, 18, + 18, 18, 18, 18, 18, 18, 22, 1, 8, 18, + 56, 48, 48, 48, 48, 48, 48, 48, 48, 57, + 55, 18, 48, 58, 51, 51, 51, 51, 51, 51, + 51, 51, 55, 61, 48, 51, 19, 19, 19, 28, + 28, 28, 28, 19, 19, 19, 19, 51, 19, 19, + 19, 71, 50, 50, 50, 75, 19, 19, 19, 50, + 50, 50, 50, nil, 50, 50, 50, 20, 26, 26, + 52, 52, 50, 50, 50, 20, 20, 46, 53, 53, + 20, 20, 46, 46, nil, nil, nil, nil, nil, 46 ] + +racc_action_pointer = [ + 0, 23, nil, nil, nil, nil, nil, -14, 13, nil, + nil, nil, nil, nil, nil, nil, nil, 14, 26, 64, + 83, 1, 19, nil, nil, nil, 82, nil, 51, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 102, nil, 39, nil, + 80, 52, 94, 102, 4, 33, 35, 20, 24, nil, + nil, 49, nil, nil, nil, nil, nil, nil, nil, nil, + -5, 52, nil, nil, nil, 56, nil, nil ] + +racc_action_default = [ + -56, -56, -1, -3, -4, -5, -6, -7, -33, -48, + -49, -50, -51, -52, -53, -54, -55, -56, -56, -56, + -37, -56, -34, -35, 78, -2, -56, -9, -56, -19, + -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, + -30, -31, -38, -39, -40, -41, -56, -32, -56, -8, + -56, -56, -56, -56, -56, -56, -56, -56, -56, -36, + -10, -11, -12, -15, -13, -16, -14, -17, -18, -42, + -56, -56, -46, -47, -43, -56, -44, -45 ] + +racc_goto_table = [ + 1, 23, 27, 25, 26, 21, 22, 42, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 60, nil, nil, nil, nil, nil, nil, + nil, 59, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 61 ] + +racc_goto_check = [ + 1, 12, 8, 2, 7, 10, 11, 13, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 8, nil, nil, nil, nil, nil, nil, + nil, 12, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 1 ] + +racc_goto_pointer = [ + nil, 0, -15, nil, nil, nil, nil, -15, -17, nil, + -3, -2, -7, -13 ] + +racc_goto_default = [ + nil, 20, 2, 3, 4, 5, 6, nil, nil, 28, + nil, nil, nil, nil ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 31, :_reduce_none, + 3, 31, :_reduce_2, + 1, 32, :_reduce_none, + 1, 32, :_reduce_none, + 1, 32, :_reduce_none, + 1, 32, :_reduce_none, + 1, 33, :_reduce_7, + 4, 33, :_reduce_8, + 1, 37, :_reduce_none, + 3, 37, :_reduce_10, + 3, 38, :_reduce_11, + 3, 38, :_reduce_12, + 3, 38, :_reduce_13, + 3, 38, :_reduce_14, + 3, 38, :_reduce_15, + 3, 38, :_reduce_16, + 3, 38, :_reduce_17, + 3, 38, :_reduce_18, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 1, 39, :_reduce_none, + 3, 34, :_reduce_32, + 0, 40, :_reduce_33, + 1, 40, :_reduce_none, + 1, 41, :_reduce_35, + 3, 41, :_reduce_36, + 1, 42, :_reduce_none, + 2, 42, :_reduce_38, + 1, 43, :_reduce_39, + 1, 43, :_reduce_40, + 1, 43, :_reduce_41, + 3, 43, :_reduce_42, + 4, 43, :_reduce_43, + 4, 43, :_reduce_44, + 5, 43, :_reduce_45, + 3, 43, :_reduce_46, + 3, 43, :_reduce_47, + 1, 35, :_reduce_48, + 1, 35, :_reduce_49, + 1, 35, :_reduce_50, + 1, 35, :_reduce_51, + 1, 35, :_reduce_52, + 1, 35, :_reduce_53, + 1, 35, :_reduce_54, + 1, 36, :_reduce_55 ] + +racc_reduce_n = 56 + +racc_shift_n = 78 + +racc_token_table = { + false => 0, + :error => 1, + :NIL => 2, + :TRUE => 3, + :FALSE => 4, + :INTEGER => 5, + :SYMBOL => 6, + :STRING => 7, + :REGEXP => 8, + :ANY => 9, + :EVEN => 10, + :ODD => 11, + :METHOD_NAME => 12, + :CLASS_NAME => 13, + "|" => 14, + "<" => 15, + ">" => 16, + "," => 17, + "=" => 18, + "^=" => 19, + "$=" => 20, + "*=" => 21, + "*" => 22, + "+" => 23, + "^" => 24, + "[" => 25, + "]" => 26, + "?" => 27, + "{" => 28, + "}" => 29 } + +racc_nt_base = 30 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "NIL", + "TRUE", + "FALSE", + "INTEGER", + "SYMBOL", + "STRING", + "REGEXP", + "ANY", + "EVEN", + "ODD", + "METHOD_NAME", + "CLASS_NAME", + "\"|\"", + "\"<\"", + "\">\"", + "\",\"", + "\"=\"", + "\"^=\"", + "\"$=\"", + "\"*=\"", + "\"*\"", + "\"+\"", + "\"^\"", + "\"[\"", + "\"]\"", + "\"?\"", + "\"{\"", + "\"}\"", + "$start", + "expression", + "primary", + "node", + "array", + "literal", + "any", + "attrs", + "attr", + "method_name", + "items_opt", + "items", + "item", + "quantifier" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +module_eval(<<'.,.,', 'machete.y', 44) + def _reduce_2(val, _values, result) + result = if val[0].is_a?(ChoiceMatcher) + ChoiceMatcher.new(val[0].alternatives << val[2]) + else + ChoiceMatcher.new([val[0], val[2]]) + end + + result + end +.,., + +# reduce 3 omitted + +# reduce 4 omitted + +# reduce 5 omitted + +# reduce 6 omitted + +module_eval(<<'.,.,', 'machete.y', 57) + def _reduce_7(val, _values, result) + result = NodeMatcher.new(val[0].to_sym) + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 60) + def _reduce_8(val, _values, result) + result = NodeMatcher.new(val[0].to_sym, val[2]) + + result + end +.,., + +# reduce 9 omitted + +module_eval(<<'.,.,', 'machete.y', 64) + def _reduce_10(val, _values, result) + result = val[0].merge(val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 66) + def _reduce_11(val, _values, result) + result = { val[0].to_sym => val[2] } + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 68) + def _reduce_12(val, _values, result) + result = { + val[0].to_sym => SymbolRegexpMatcher.new( + Regexp.new("^" + Regexp.escape(symbol_value(val[2]).to_s)) + ) + } + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 75) + def _reduce_13(val, _values, result) + result = { + val[0].to_sym => SymbolRegexpMatcher.new( + Regexp.new(Regexp.escape(symbol_value(val[2]).to_s) + "$") + ) + } + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 82) + def _reduce_14(val, _values, result) + result = { + val[0].to_sym => SymbolRegexpMatcher.new( + Regexp.new(Regexp.escape(symbol_value(val[2]).to_s)) + ) + } + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 89) + def _reduce_15(val, _values, result) + result = { + val[0].to_sym => StringRegexpMatcher.new( + Regexp.new("^" + Regexp.escape(string_value(val[2]))) + ) + } + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 96) + def _reduce_16(val, _values, result) + result = { + val[0].to_sym => StringRegexpMatcher.new( + Regexp.new(Regexp.escape(string_value(val[2])) + "$") + ) + } + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 103) + def _reduce_17(val, _values, result) + result = { + val[0].to_sym => StringRegexpMatcher.new( + Regexp.new(Regexp.escape(string_value(val[2]))) + ) + } + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 110) + def _reduce_18(val, _values, result) + result = { + val[0].to_sym => IndifferentRegexpMatcher.new( + Regexp.new(regexp_value(val[2])) + ) + } + + result + end +.,., + +# reduce 19 omitted + +# reduce 20 omitted + +# reduce 21 omitted + +# reduce 22 omitted + +# reduce 23 omitted + +# reduce 24 omitted + +# reduce 25 omitted + +# reduce 26 omitted + +# reduce 27 omitted + +# reduce 28 omitted + +# reduce 29 omitted + +# reduce 30 omitted + +# reduce 31 omitted + +module_eval(<<'.,.,', 'machete.y', 134) + def _reduce_32(val, _values, result) + result = ArrayMatcher.new(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 136) + def _reduce_33(val, _values, result) + result = [] + result + end +.,., + +# reduce 34 omitted + +module_eval(<<'.,.,', 'machete.y', 139) + def _reduce_35(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 140) + def _reduce_36(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +# reduce 37 omitted + +module_eval(<<'.,.,', 'machete.y', 143) + def _reduce_38(val, _values, result) + result = Quantifier.new(val[0], *val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 145) + def _reduce_39(val, _values, result) + result = [0, nil, 1] + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 146) + def _reduce_40(val, _values, result) + result = [1, nil, 1] + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 147) + def _reduce_41(val, _values, result) + result = [0, 1, 1] + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 149) + def _reduce_42(val, _values, result) + result = [integer_value(val[1]), integer_value(val[1]), 1] + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 152) + def _reduce_43(val, _values, result) + result = [integer_value(val[1]), nil, 1] + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 155) + def _reduce_44(val, _values, result) + result = [0, integer_value(val[2]), 1] + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 158) + def _reduce_45(val, _values, result) + result = [integer_value(val[1]), integer_value(val[3]), 1] + + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 160) + def _reduce_46(val, _values, result) + result = [0, nil, 2] + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 161) + def _reduce_47(val, _values, result) + result = [1, nil, 2] + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 163) + def _reduce_48(val, _values, result) + result = LiteralMatcher.new(nil) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 164) + def _reduce_49(val, _values, result) + result = LiteralMatcher.new(true) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 165) + def _reduce_50(val, _values, result) + result = LiteralMatcher.new(false) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 166) + def _reduce_51(val, _values, result) + result = LiteralMatcher.new(integer_value(val[0])) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 167) + def _reduce_52(val, _values, result) + result = LiteralMatcher.new(symbol_value(val[0])) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 168) + def _reduce_53(val, _values, result) + result = LiteralMatcher.new(string_value(val[0])) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 169) + def _reduce_54(val, _values, result) + result = LiteralMatcher.new(regexp_value(val[0])) + result + end +.,., + +module_eval(<<'.,.,', 'machete.y', 171) + def _reduce_55(val, _values, result) + result = AnyMatcher.new + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module Machete diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/mediacloth b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/mediacloth new file mode 100644 index 000000000000..cca7d3c7e4e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/mediacloth @@ -0,0 +1,1463 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + +require 'mediacloth/mediawikiast' + +class MediaWikiParser < Racc::Parser + +module_eval(<<'...end mediacloth.y/module_eval...', 'mediacloth.y', 564) + +attr_accessor :lexer + +def initialize + @nodes = [] + @context = [] + @wiki_ast_length = 0 + super +end + +#Tokenizes input string and parses it. +def parse(input) + @yydebug=true + lexer.tokenize(input) + do_parse + return @nodes.last +end + +#Asks the lexer to return the next token. +def next_token + token = @lexer.lex + if token[0].to_s.upcase.include? "_START" + @context << token[2..3] + elsif token[0].to_s.upcase.include? "_END" + @ast_index = @context.last[0] + @ast_length = token[2] + token[3] - @context.last[0] + @context.pop + else + @ast_index = token[2] + @ast_length = token[3] + end + + @wiki_ast_length += token[3] + + return token[0..1] +end +...end mediacloth.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 22, 28, 50, 29, 61, 13, 63, 132, 15, 86, + 37, 87, 24, 33, 86, 34, 87, 35, 85, 23, + 26, 25, 27, 12, 86, 30, 87, 31, 86, 42, + 87, 32, 44, 86, 48, 87, 57, 17, 57, 22, + 28, 21, 29, 46, 13, 51, 67, 15, 68, 11, + 36, 24, 33, 14, 34, 69, 35, 36, 23, 26, + 25, 27, 12, 86, 30, 87, 31, 75, 73, 70, + 32, 48, 81, 71, 72, 76, 17, 77, 22, 28, + 21, 29, 82, 13, 45, 51, 15, -65, 11, 36, + 24, 33, 14, 34, -65, 35, 63, 23, 26, 25, + 27, 12, 96, 30, 63, 31, 106, 109, 110, 32, + 113, 114, 48, 117, 118, 17, 124, 22, 28, 21, + 29, 57, 13, 127, 128, 15, 131, 11, 36, 24, + 33, 14, 34, 136, 35, 137, 23, 26, 25, 27, + 12, 138, 30, 75, 31, 51, 141, -63, 32, 106, + 106, 150, 153, 51, 17, nil, nil, nil, 21, nil, + 22, 28, 53, 29, nil, 13, 11, 36, 15, nil, + 14, nil, 24, 33, nil, 34, nil, 35, nil, 23, + 26, 25, 27, 12, nil, 30, nil, 31, nil, nil, + nil, 32, nil, nil, nil, nil, nil, 17, nil, 22, + 28, 21, 29, 55, 13, nil, nil, 15, nil, 11, + 36, 24, 33, 14, 34, nil, 35, nil, 23, 26, + 25, 27, 12, nil, 30, nil, 31, nil, nil, nil, + 32, nil, nil, nil, nil, nil, 17, nil, 22, 28, + 21, 29, nil, 13, nil, nil, 15, nil, 11, 36, + 24, 33, 14, 34, nil, 35, nil, 23, 26, 25, + 27, 12, nil, 30, nil, 31, nil, nil, nil, 32, + nil, nil, nil, nil, nil, 17, nil, 22, 28, 21, + 29, nil, 13, nil, nil, 15, nil, 11, 36, 24, + 33, 14, 34, nil, 35, nil, 23, 26, 25, 27, + 12, nil, 30, nil, 31, nil, nil, nil, 32, nil, + nil, nil, nil, nil, 17, nil, 22, 28, 21, 29, + nil, 13, nil, nil, 15, nil, 11, 36, 24, 33, + 14, 34, nil, 35, nil, 23, 26, 25, 27, 12, + nil, 30, nil, 31, nil, nil, nil, 32, nil, nil, + nil, nil, nil, 17, nil, 22, 28, 21, 29, nil, + 13, nil, nil, 15, nil, 11, 36, 24, 33, 14, + 34, nil, 35, nil, 23, 26, 25, 27, 12, nil, + 30, nil, 31, nil, nil, nil, 32, nil, nil, nil, + nil, nil, 17, nil, 22, 28, 21, 29, nil, 13, + nil, nil, 15, nil, 11, 36, 24, 33, 14, 34, + nil, 35, nil, 23, 26, 25, 27, 12, nil, 30, + nil, 31, nil, nil, nil, 32, nil, nil, nil, nil, + nil, 17, 78, nil, nil, 21, nil, 22, 28, 88, + 29, nil, 13, 11, 36, 15, nil, 14, nil, 24, + 33, nil, 34, nil, 35, nil, 23, 26, 25, 27, + 12, nil, 30, nil, 31, nil, nil, nil, 32, nil, + nil, nil, nil, nil, 17, nil, 22, 28, 21, 29, + 89, 13, nil, nil, 15, nil, 11, 36, 24, 33, + 14, 34, nil, 35, nil, 23, 26, 25, 27, 12, + nil, 30, nil, 31, nil, nil, nil, 32, nil, nil, + nil, nil, nil, 17, nil, 22, 28, 21, 29, nil, + 13, nil, nil, 15, nil, 11, 36, 24, 33, 14, + 34, nil, 35, nil, 23, 26, 25, 27, 12, nil, + 30, nil, 31, nil, nil, 93, 32, nil, nil, nil, + nil, nil, 17, nil, 22, 28, 21, 29, nil, 13, + nil, nil, 15, nil, 11, 36, 24, 33, 14, 34, + nil, 35, nil, 23, 26, 25, 27, 12, nil, 30, + nil, 31, nil, nil, nil, 32, nil, nil, 98, nil, + nil, 17, nil, 22, 28, 21, 29, nil, 13, nil, + nil, 15, nil, 11, 36, 24, 33, 14, 34, nil, + 35, nil, 23, 26, 25, 27, 12, nil, 30, nil, + 31, nil, nil, nil, 32, nil, nil, nil, nil, 101, + 17, nil, nil, nil, 21, nil, 22, 28, nil, 29, + nil, 13, 11, 36, 15, nil, 14, nil, 24, 33, + 102, 34, nil, 35, nil, 23, 26, 25, 27, 12, + nil, 30, nil, 31, nil, nil, nil, 32, nil, nil, + nil, nil, nil, 17, nil, 22, 28, 21, 29, nil, + 13, nil, nil, 15, nil, 11, 36, 24, 33, 14, + 34, 103, 35, nil, 23, 26, 25, 27, 12, nil, + 30, nil, 31, nil, nil, nil, 32, nil, nil, nil, + nil, nil, 17, nil, 22, 28, 21, 29, nil, 13, + nil, nil, 15, nil, 11, 36, 24, 33, 14, 34, + nil, 35, 104, 23, 26, 25, 27, 12, nil, 30, + nil, 31, nil, nil, nil, 32, nil, nil, nil, nil, + nil, 17, nil, 22, 28, 21, 29, nil, 13, nil, + nil, 15, nil, 11, 36, 24, 33, 14, 34, nil, + 35, nil, 23, 26, 25, 27, 12, nil, 30, nil, + 31, nil, nil, nil, 32, nil, nil, nil, nil, nil, + 17, nil, 22, 28, 21, 29, nil, 13, nil, nil, + 15, nil, 11, 36, 24, 33, 14, 34, nil, 35, + nil, 23, 26, 25, 27, 12, nil, 30, nil, 31, + nil, nil, nil, 32, nil, nil, nil, nil, nil, 17, + nil, 22, 28, 21, 29, nil, 13, nil, nil, 15, + nil, 11, 36, 24, 33, 14, 34, nil, 35, nil, + 23, 26, 25, 27, 12, nil, 30, nil, 31, nil, + nil, nil, 32, nil, nil, nil, nil, nil, 17, 115, + 22, 28, 21, 29, nil, 13, nil, nil, 15, nil, + 11, 36, 24, 33, 14, 34, nil, 35, nil, 23, + 26, 25, 27, 12, nil, 30, nil, 31, nil, nil, + nil, 32, nil, nil, nil, nil, nil, 17, nil, 22, + 28, 21, 29, nil, 13, nil, 121, 15, nil, 11, + 36, 24, 33, 14, 34, nil, 35, nil, 23, 26, + 25, 27, 12, nil, 30, nil, 31, nil, nil, nil, + 32, nil, nil, nil, nil, nil, 17, nil, 22, 28, + 21, 29, nil, 13, nil, nil, 15, 123, 11, 36, + 24, 33, 14, 34, nil, 35, nil, 23, 26, 25, + 27, 12, nil, 30, nil, 31, nil, nil, 126, 32, + nil, nil, nil, nil, nil, 17, nil, 22, 28, 21, + 29, nil, 13, nil, nil, 15, nil, 11, 36, 24, + 33, 14, 34, nil, 35, nil, 23, 26, 25, 27, + 12, nil, 30, nil, 31, nil, nil, nil, 32, nil, + nil, 129, nil, nil, 17, nil, 22, 28, 21, 29, + nil, 13, nil, nil, 15, nil, 11, 36, 24, 33, + 14, 34, nil, 35, nil, 23, 26, 25, 27, 12, + nil, 30, nil, 31, nil, nil, nil, 32, nil, nil, + nil, nil, 130, 17, nil, 22, 28, 21, 29, nil, + 13, nil, 134, 15, nil, 11, 36, 24, 33, 14, + 34, nil, 35, nil, 23, 26, 25, 27, 12, nil, + 30, nil, 31, nil, nil, nil, 32, nil, nil, nil, + nil, nil, 17, nil, 22, 28, 21, 29, nil, 13, + nil, nil, 15, nil, 11, 36, 24, 33, 14, 34, + nil, 35, nil, 23, 26, 25, 27, 12, nil, 30, + nil, 31, nil, nil, nil, 32, nil, nil, nil, nil, + nil, 17, nil, 22, 28, 21, 29, nil, 13, nil, + nil, 15, nil, 11, 36, 24, 33, 14, 34, nil, + 35, nil, 23, 26, 25, 27, 12, nil, 30, nil, + 31, nil, nil, nil, 32, nil, nil, nil, nil, nil, + 17, nil, 22, 28, 21, 29, nil, 13, nil, 142, + 15, nil, 11, 36, 24, 33, 14, 34, nil, 35, + nil, 23, 26, 25, 27, 12, nil, 30, nil, 31, + nil, nil, nil, 32, nil, nil, nil, nil, nil, 17, + nil, 22, 28, 21, 29, nil, 13, nil, nil, 15, + 144, 11, 36, 24, 33, 14, 34, nil, 35, nil, + 23, 26, 25, 27, 12, nil, 30, nil, 31, nil, + nil, nil, 32, nil, nil, nil, nil, nil, 17, nil, + nil, nil, 21, nil, nil, nil, nil, nil, nil, nil, + 11, 36, 22, 28, 14, 29, nil, 13, nil, nil, + 15, nil, 136, nil, 24, 33, nil, 34, nil, 35, + nil, 23, 26, 25, 27, 12, nil, 30, nil, 31, + nil, nil, nil, 32, nil, nil, nil, nil, nil, 17, + nil, nil, nil, 21, nil, nil, nil, nil, nil, nil, + nil, 11, 36, 22, 28, 14, 29, nil, 13, nil, + nil, 15, nil, 136, nil, 24, 33, nil, 34, nil, + 35, nil, 23, 26, 25, 27, 12, nil, 30, nil, + 31, nil, nil, nil, 32, nil, nil, nil, nil, nil, + 17, nil, nil, nil, 21, nil, nil, nil, nil, nil, + nil, nil, 11, 36, nil, nil, 14 ] + +racc_action_check = [ + 0, 0, 21, 0, 32, 0, 32, 106, 0, 85, + 1, 85, 0, 0, 121, 0, 121, 0, 51, 0, + 0, 0, 0, 0, 123, 0, 123, 0, 142, 13, + 142, 0, 15, 144, 17, 144, 30, 0, 31, 2, + 2, 0, 2, 15, 2, 21, 36, 2, 37, 0, + 0, 2, 2, 0, 2, 39, 2, 106, 2, 2, + 2, 2, 2, 51, 2, 51, 2, 44, 44, 41, + 2, 48, 48, 42, 43, 45, 2, 46, 12, 12, + 2, 12, 49, 12, 15, 50, 12, 56, 2, 2, + 12, 12, 2, 12, 58, 12, 59, 12, 12, 12, + 12, 12, 60, 12, 62, 12, 67, 73, 74, 12, + 76, 77, 81, 83, 84, 12, 90, 14, 14, 12, + 14, 91, 14, 94, 95, 14, 105, 12, 12, 14, + 14, 12, 14, 109, 14, 112, 14, 14, 14, 14, + 14, 113, 14, 114, 14, 118, 119, 125, 14, 132, + 133, 135, 139, 141, 14, nil, nil, nil, 14, nil, + 28, 28, 28, 28, nil, 28, 14, 14, 28, nil, + 14, nil, 28, 28, nil, 28, nil, 28, nil, 28, + 28, 28, 28, 28, nil, 28, nil, 28, nil, nil, + nil, 28, nil, nil, nil, nil, nil, 28, nil, 29, + 29, 28, 29, 29, 29, nil, nil, 29, nil, 28, + 28, 29, 29, 28, 29, nil, 29, nil, 29, 29, + 29, 29, 29, nil, 29, nil, 29, nil, nil, nil, + 29, nil, nil, nil, nil, nil, 29, nil, 33, 33, + 29, 33, nil, 33, nil, nil, 33, nil, 29, 29, + 33, 33, 29, 33, nil, 33, nil, 33, 33, 33, + 33, 33, nil, 33, nil, 33, nil, nil, nil, 33, + nil, nil, nil, nil, nil, 33, nil, 34, 34, 33, + 34, nil, 34, nil, nil, 34, nil, 33, 33, 34, + 34, 33, 34, nil, 34, nil, 34, 34, 34, 34, + 34, nil, 34, nil, 34, nil, nil, nil, 34, nil, + nil, nil, nil, nil, 34, nil, 35, 35, 34, 35, + nil, 35, nil, nil, 35, nil, 34, 34, 35, 35, + 34, 35, nil, 35, nil, 35, 35, 35, 35, 35, + nil, 35, nil, 35, nil, nil, nil, 35, nil, nil, + nil, nil, nil, 35, nil, 40, 40, 35, 40, nil, + 40, nil, nil, 40, nil, 35, 35, 40, 40, 35, + 40, nil, 40, nil, 40, 40, 40, 40, 40, nil, + 40, nil, 40, nil, nil, nil, 40, nil, nil, nil, + nil, nil, 40, nil, 47, 47, 40, 47, nil, 47, + nil, nil, 47, nil, 40, 40, 47, 47, 40, 47, + nil, 47, nil, 47, 47, 47, 47, 47, nil, 47, + nil, 47, nil, nil, nil, 47, nil, nil, nil, nil, + nil, 47, 47, nil, nil, 47, nil, 52, 52, 52, + 52, nil, 52, 47, 47, 52, nil, 47, nil, 52, + 52, nil, 52, nil, 52, nil, 52, 52, 52, 52, + 52, nil, 52, nil, 52, nil, nil, nil, 52, nil, + nil, nil, nil, nil, 52, nil, 54, 54, 52, 54, + 54, 54, nil, nil, 54, nil, 52, 52, 54, 54, + 52, 54, nil, 54, nil, 54, 54, 54, 54, 54, + nil, 54, nil, 54, nil, nil, nil, 54, nil, nil, + nil, nil, nil, 54, nil, 57, 57, 54, 57, nil, + 57, nil, nil, 57, nil, 54, 54, 57, 57, 54, + 57, nil, 57, nil, 57, 57, 57, 57, 57, nil, + 57, nil, 57, nil, nil, 57, 57, nil, nil, nil, + nil, nil, 57, nil, 61, 61, 57, 61, nil, 61, + nil, nil, 61, nil, 57, 57, 61, 61, 57, 61, + nil, 61, nil, 61, 61, 61, 61, 61, nil, 61, + nil, 61, nil, nil, nil, 61, nil, nil, 61, nil, + nil, 61, nil, 63, 63, 61, 63, nil, 63, nil, + nil, 63, nil, 61, 61, 63, 63, 61, 63, nil, + 63, nil, 63, 63, 63, 63, 63, nil, 63, nil, + 63, nil, nil, nil, 63, nil, nil, nil, nil, 63, + 63, nil, nil, nil, 63, nil, 64, 64, nil, 64, + nil, 64, 63, 63, 64, nil, 63, nil, 64, 64, + 64, 64, nil, 64, nil, 64, 64, 64, 64, 64, + nil, 64, nil, 64, nil, nil, nil, 64, nil, nil, + nil, nil, nil, 64, nil, 65, 65, 64, 65, nil, + 65, nil, nil, 65, nil, 64, 64, 65, 65, 64, + 65, 65, 65, nil, 65, 65, 65, 65, 65, nil, + 65, nil, 65, nil, nil, nil, 65, nil, nil, nil, + nil, nil, 65, nil, 66, 66, 65, 66, nil, 66, + nil, nil, 66, nil, 65, 65, 66, 66, 65, 66, + nil, 66, 66, 66, 66, 66, 66, 66, nil, 66, + nil, 66, nil, nil, nil, 66, nil, nil, nil, nil, + nil, 66, nil, 71, 71, 66, 71, nil, 71, nil, + nil, 71, nil, 66, 66, 71, 71, 66, 71, nil, + 71, nil, 71, 71, 71, 71, 71, nil, 71, nil, + 71, nil, nil, nil, 71, nil, nil, nil, nil, nil, + 71, nil, 75, 75, 71, 75, nil, 75, nil, nil, + 75, nil, 71, 71, 75, 75, 71, 75, nil, 75, + nil, 75, 75, 75, 75, 75, nil, 75, nil, 75, + nil, nil, nil, 75, nil, nil, nil, nil, nil, 75, + nil, 79, 79, 75, 79, nil, 79, nil, nil, 79, + nil, 75, 75, 79, 79, 75, 79, nil, 79, nil, + 79, 79, 79, 79, 79, nil, 79, nil, 79, nil, + nil, nil, 79, nil, nil, nil, nil, nil, 79, 79, + 86, 86, 79, 86, nil, 86, nil, nil, 86, nil, + 79, 79, 86, 86, 79, 86, nil, 86, nil, 86, + 86, 86, 86, 86, nil, 86, nil, 86, nil, nil, + nil, 86, nil, nil, nil, nil, nil, 86, nil, 87, + 87, 86, 87, nil, 87, nil, 86, 87, nil, 86, + 86, 87, 87, 86, 87, nil, 87, nil, 87, 87, + 87, 87, 87, nil, 87, nil, 87, nil, nil, nil, + 87, nil, nil, nil, nil, nil, 87, nil, 92, 92, + 87, 92, nil, 92, nil, nil, 92, 87, 87, 87, + 92, 92, 87, 92, nil, 92, nil, 92, 92, 92, + 92, 92, nil, 92, nil, 92, nil, nil, 92, 92, + nil, nil, nil, nil, nil, 92, nil, 97, 97, 92, + 97, nil, 97, nil, nil, 97, nil, 92, 92, 97, + 97, 92, 97, nil, 97, nil, 97, 97, 97, 97, + 97, nil, 97, nil, 97, nil, nil, nil, 97, nil, + nil, 97, nil, nil, 97, nil, 100, 100, 97, 100, + nil, 100, nil, nil, 100, nil, 97, 97, 100, 100, + 97, 100, nil, 100, nil, 100, 100, 100, 100, 100, + nil, 100, nil, 100, nil, nil, nil, 100, nil, nil, + nil, nil, 100, 100, nil, 108, 108, 100, 108, nil, + 108, nil, 108, 108, nil, 100, 100, 108, 108, 100, + 108, nil, 108, nil, 108, 108, 108, 108, 108, nil, + 108, nil, 108, nil, nil, nil, 108, nil, nil, nil, + nil, nil, 108, nil, 111, 111, 108, 111, nil, 111, + nil, nil, 111, nil, 108, 108, 111, 111, 108, 111, + nil, 111, nil, 111, 111, 111, 111, 111, nil, 111, + nil, 111, nil, nil, nil, 111, nil, nil, nil, nil, + nil, 111, nil, 120, 120, 111, 120, nil, 120, nil, + nil, 120, nil, 111, 111, 120, 120, 111, 120, nil, + 120, nil, 120, 120, 120, 120, 120, nil, 120, nil, + 120, nil, nil, nil, 120, nil, nil, nil, nil, nil, + 120, nil, 122, 122, 120, 122, nil, 122, nil, 120, + 122, nil, 120, 120, 122, 122, 120, 122, nil, 122, + nil, 122, 122, 122, 122, 122, nil, 122, nil, 122, + nil, nil, nil, 122, nil, nil, nil, nil, nil, 122, + nil, 134, 134, 122, 134, nil, 134, nil, nil, 134, + 122, 122, 122, 134, 134, 122, 134, nil, 134, nil, + 134, 134, 134, 134, 134, nil, 134, nil, 134, nil, + nil, nil, 134, nil, nil, nil, nil, nil, 134, nil, + nil, nil, 134, nil, nil, nil, nil, nil, nil, nil, + 134, 134, 136, 136, 134, 136, nil, 136, nil, nil, + 136, nil, 136, nil, 136, 136, nil, 136, nil, 136, + nil, 136, 136, 136, 136, 136, nil, 136, nil, 136, + nil, nil, nil, 136, nil, nil, nil, nil, nil, 136, + nil, nil, nil, 136, nil, nil, nil, nil, nil, nil, + nil, 136, 136, 152, 152, 136, 152, nil, 152, nil, + nil, 152, nil, 152, nil, 152, 152, nil, 152, nil, + 152, nil, 152, 152, 152, 152, 152, nil, 152, nil, + 152, nil, nil, nil, 152, nil, nil, nil, nil, nil, + 152, nil, nil, nil, 152, nil, nil, nil, nil, nil, + nil, nil, 152, 152, nil, nil, 152 ] + +racc_action_pointer = [ + -2, 10, 37, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 76, 27, 115, 30, nil, -7, nil, nil, + nil, 0, nil, nil, nil, nil, nil, nil, 158, 197, + 5, 7, -31, 236, 275, 314, 44, 48, nil, 29, + 353, 61, 64, 18, 55, 73, 23, 392, 30, 38, + 40, 16, 435, nil, 474, nil, 59, 513, 64, 59, + 68, 552, 67, 591, 634, 673, 712, 94, nil, nil, + nil, 751, nil, 105, 97, 790, 98, 109, nil, 829, + nil, 71, nil, 69, 68, -38, 868, 907, nil, nil, + 88, 90, 946, nil, 93, 90, nil, 985, nil, nil, + 1024, nil, nil, nil, nil, 73, 5, nil, 1063, 121, + nil, 1102, 124, 139, 131, nil, nil, nil, 100, 100, + 1141, -33, 1180, -23, nil, 116, nil, nil, nil, nil, + nil, nil, 137, 138, 1219, 140, 1270, nil, nil, 141, + nil, 108, -19, nil, -14, nil, nil, nil, nil, nil, + nil, nil, 1321, nil, nil, nil, nil, nil ] + +racc_action_default = [ + -83, -83, -1, -2, -3, -4, -5, -6, -7, -8, + -9, -10, -19, -83, -19, -83, -18, -23, -37, -39, + -40, -43, -51, -52, -53, -54, -55, -56, -83, -83, + -83, -83, -73, -83, -83, -83, -83, -83, -38, -83, + -20, -83, -26, -83, -30, -83, -83, -83, -23, -83, + -43, -46, -83, -57, -83, -58, -63, -83, -63, -73, + -83, -83, -73, -83, -83, -83, -83, -80, 158, -11, + -12, -83, -13, -83, -83, -83, -32, -83, -21, -83, + -24, -23, -41, -83, -83, -46, -83, -83, -59, -60, + -83, -83, -83, -66, -83, -83, -69, -83, -70, -72, + -83, -74, -76, -77, -78, -83, -83, -27, -28, -34, + -15, -31, -83, -83, -30, -22, -25, -42, -43, -83, + -83, -46, -83, -46, -61, -65, -67, -62, -68, -71, + -75, -79, -80, -80, -83, -83, -34, -16, -33, -83, + -44, -43, -46, -47, -46, -49, -64, -81, -82, -29, + -14, -35, -34, -17, -45, -48, -50, -36 ] + +racc_goto_table = [ + 38, 84, 74, 105, 49, 39, 90, 43, 94, 60, + 135, 1, 133, 2, 47, 41, 107, 112, 59, 56, + 58, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 83, nil, 119, 95, 151, 38, 99, + nil, 52, 54, nil, nil, 80, 64, 65, 66, nil, + 38, nil, 38, 157, nil, nil, nil, nil, nil, nil, + 79, nil, 38, 38, 38, nil, nil, nil, 147, 148, + 92, 143, 139, 145, 97, 146, 100, 38, 116, 149, + 125, nil, nil, nil, 108, nil, nil, nil, 111, nil, + 38, nil, 155, nil, 156, 38, nil, nil, 38, 120, + 122, 140, nil, nil, nil, nil, 38, nil, nil, 38, + nil, nil, nil, nil, nil, nil, nil, nil, 38, nil, + 38, nil, nil, nil, 154, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 108, nil, 152, + 38 ] + +racc_goto_check = [ + 3, 23, 15, 30, 22, 12, 25, 12, 25, 28, + 14, 1, 11, 2, 18, 13, 19, 16, 27, 24, + 24, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 22, nil, 23, 28, 14, 3, 28, + nil, 2, 2, nil, nil, 18, 2, 2, 2, nil, + 3, nil, 3, 14, nil, nil, nil, nil, nil, nil, + 2, nil, 3, 3, 3, nil, nil, nil, 30, 30, + 2, 23, 15, 23, 2, 25, 2, 3, 18, 19, + 24, nil, nil, nil, 2, nil, nil, nil, 2, nil, + 3, nil, 23, nil, 23, 3, nil, nil, 3, 2, + 2, 22, nil, nil, nil, nil, 3, nil, nil, 3, + nil, nil, nil, nil, nil, nil, nil, nil, 3, nil, + 3, nil, nil, nil, 22, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 2, nil, 2, + 3 ] + +racc_goto_pointer = [ + nil, 11, 13, -2, nil, nil, nil, nil, nil, nil, + nil, -94, -7, 2, -99, -42, -59, nil, -3, -55, + nil, nil, -17, -50, -11, -50, nil, -14, -23, nil, + -64 ] + +racc_goto_default = [ + nil, nil, 40, 18, 3, 4, 5, 6, 7, 8, + 9, 10, nil, nil, nil, nil, nil, 16, nil, nil, + 19, 20, nil, nil, nil, nil, 91, nil, nil, 62, + nil ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 58, :_reduce_1, + 1, 60, :_reduce_2, + 1, 60, :_reduce_3, + 1, 60, :_reduce_4, + 1, 60, :_reduce_5, + 1, 60, :_reduce_6, + 1, 60, :_reduce_7, + 1, 60, :_reduce_8, + 1, 60, :_reduce_9, + 1, 60, :_reduce_10, + 3, 60, :_reduce_11, + 3, 60, :_reduce_12, + 3, 60, :_reduce_13, + 6, 60, :_reduce_14, + 4, 60, :_reduce_15, + 5, 60, :_reduce_16, + 6, 60, :_reduce_17, + 1, 60, :_reduce_none, + 0, 69, :_reduce_19, + 1, 69, :_reduce_20, + 3, 67, :_reduce_21, + 4, 67, :_reduce_22, + 0, 75, :_reduce_23, + 2, 75, :_reduce_24, + 3, 75, :_reduce_25, + 1, 70, :_reduce_26, + 3, 70, :_reduce_27, + 1, 76, :_reduce_28, + 3, 76, :_reduce_29, + 0, 72, :_reduce_30, + 2, 72, :_reduce_31, + 0, 73, :_reduce_32, + 2, 73, :_reduce_33, + 0, 71, :_reduce_34, + 2, 71, :_reduce_35, + 3, 71, :_reduce_36, + 1, 59, :_reduce_37, + 2, 59, :_reduce_38, + 1, 61, :_reduce_39, + 1, 61, :_reduce_40, + 3, 74, :_reduce_41, + 4, 74, :_reduce_42, + 0, 79, :_reduce_43, + 4, 79, :_reduce_44, + 5, 79, :_reduce_45, + 0, 80, :_reduce_46, + 3, 80, :_reduce_47, + 4, 80, :_reduce_48, + 3, 80, :_reduce_49, + 4, 80, :_reduce_50, + 1, 77, :_reduce_51, + 1, 77, :_reduce_52, + 1, 77, :_reduce_53, + 1, 77, :_reduce_54, + 1, 77, :_reduce_55, + 1, 77, :_reduce_56, + 2, 78, :_reduce_57, + 2, 78, :_reduce_58, + 3, 78, :_reduce_59, + 3, 78, :_reduce_60, + 4, 62, :_reduce_61, + 4, 63, :_reduce_62, + 0, 83, :_reduce_63, + 3, 82, :_reduce_64, + 0, 82, :_reduce_65, + 2, 81, :_reduce_66, + 3, 81, :_reduce_67, + 4, 64, :_reduce_68, + 3, 64, :_reduce_69, + 2, 84, :_reduce_70, + 3, 84, :_reduce_71, + 2, 85, :_reduce_72, + 0, 85, :_reduce_73, + 2, 86, :_reduce_74, + 3, 86, :_reduce_75, + 3, 65, :_reduce_76, + 3, 65, :_reduce_77, + 3, 66, :_reduce_78, + 4, 68, :_reduce_79, + 0, 87, :_reduce_80, + 3, 87, :_reduce_81, + 3, 87, :_reduce_82 ] + +racc_reduce_n = 83 + +racc_shift_n = 158 + +racc_token_table = { + false => 0, + :error => 1, + :TEXT => 2, + :BOLD_START => 3, + :BOLD_END => 4, + :ITALIC_START => 5, + :ITALIC_END => 6, + :LINK_START => 7, + :LINK_END => 8, + :LINKSEP => 9, + :INTLINK_START => 10, + :INTLINK_END => 11, + :INTLINKSEP => 12, + :RESOURCESEP => 13, + :CHAR_ENT => 14, + :PRE_START => 15, + :PRE_END => 16, + :PREINDENT_START => 17, + :PREINDENT_END => 18, + :SECTION_START => 19, + :SECTION_END => 20, + :HLINE => 21, + :SIGNATURE_NAME => 22, + :SIGNATURE_DATE => 23, + :SIGNATURE_FULL => 24, + :PARA_START => 25, + :PARA_END => 26, + :UL_START => 27, + :UL_END => 28, + :OL_START => 29, + :OL_END => 30, + :LI_START => 31, + :LI_END => 32, + :DL_START => 33, + :DL_END => 34, + :DT_START => 35, + :DT_END => 36, + :DD_START => 37, + :DD_END => 38, + :TAG_START => 39, + :TAG_END => 40, + :ATTR_NAME => 41, + :ATTR_VALUE => 42, + :TABLE_START => 43, + :TABLE_END => 44, + :ROW_START => 45, + :ROW_END => 46, + :HEAD_START => 47, + :HEAD_END => 48, + :CELL_START => 49, + :CELL_END => 50, + :KEYWORD => 51, + :TEMPLATE_START => 52, + :TEMPLATE_END => 53, + :CATEGORY => 54, + :PASTE_START => 55, + :PASTE_END => 56 } + +racc_nt_base = 57 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "TEXT", + "BOLD_START", + "BOLD_END", + "ITALIC_START", + "ITALIC_END", + "LINK_START", + "LINK_END", + "LINKSEP", + "INTLINK_START", + "INTLINK_END", + "INTLINKSEP", + "RESOURCESEP", + "CHAR_ENT", + "PRE_START", + "PRE_END", + "PREINDENT_START", + "PREINDENT_END", + "SECTION_START", + "SECTION_END", + "HLINE", + "SIGNATURE_NAME", + "SIGNATURE_DATE", + "SIGNATURE_FULL", + "PARA_START", + "PARA_END", + "UL_START", + "UL_END", + "OL_START", + "OL_END", + "LI_START", + "LI_END", + "DL_START", + "DL_END", + "DT_START", + "DT_END", + "DD_START", + "DD_END", + "TAG_START", + "TAG_END", + "ATTR_NAME", + "ATTR_VALUE", + "TABLE_START", + "TABLE_END", + "ROW_START", + "ROW_END", + "HEAD_START", + "HEAD_END", + "CELL_START", + "CELL_END", + "KEYWORD", + "TEMPLATE_START", + "TEMPLATE_END", + "CATEGORY", + "PASTE_START", + "PASTE_END", + "$start", + "wiki", + "repeated_contents", + "contents", + "text", + "bulleted_list", + "numbered_list", + "dictionary_list", + "preformatted", + "section", + "tag", + "template", + "para_contents", + "link_contents", + "reslink_repeated_contents", + "intlink_repeated_contents", + "cat_sort_contents", + "table", + "tag_attributes", + "link_repeated_contents", + "element", + "formatted_element", + "table_contents", + "row_contents", + "list_item", + "list_contents", + "@1", + "dictionary_term", + "dictionary_contents", + "dictionary_definition", + "template_parameters" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'mediacloth.y', 47) + def _reduce_1(val, _values, result) + @nodes.push WikiAST.new(0, @wiki_ast_length) + #@nodes.last.children.insert(0, val[0]) + #puts val[0] + @nodes.last.children += val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 57) + def _reduce_2(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 61) + def _reduce_3(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 65) + def _reduce_4(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 69) + def _reduce_5(val, _values, result) + list = ListAST.new(@ast_index, @ast_length) + list.list_type = :Dictionary + list.children = val[0] + result = list + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 76) + def _reduce_6(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 80) + def _reduce_7(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 84) + def _reduce_8(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 88) + def _reduce_9(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 92) + def _reduce_10(val, _values, result) + k = KeywordAST.new(@ast_index, @ast_length) + k.text = val[0] + result = k + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 98) + def _reduce_11(val, _values, result) + p = ParagraphAST.new(@ast_index, @ast_length) + p.children = val[1] + result = p + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 104) + def _reduce_12(val, _values, result) + l = LinkAST.new(@ast_index, @ast_length) + l.link_type = val[0] + l.url = val[1][0] + l.children += val[1][1..-1] if val[1].length > 1 + result = l + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 112) + def _reduce_13(val, _values, result) + p = PasteAST.new(@ast_index, @ast_length) + p.children = val[1] + result = p + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 118) + def _reduce_14(val, _values, result) + l = ResourceLinkAST.new(@ast_index, @ast_length) + l.prefix = val[1] + l.locator = val[3] + l.children = val[4] unless val[4].nil? or val[4].empty? + result = l + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 126) + def _reduce_15(val, _values, result) + l = InternalLinkAST.new(@ast_index, @ast_length) + l.locator = val[1] + l.children = val[2] unless val[2].nil? or val[2].empty? + result = l + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 133) + def _reduce_16(val, _values, result) + l = CategoryAST.new(@ast_index, @ast_length) + l.locator = val[2] + l.sort_as = val[3] + result = l + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 140) + def _reduce_17(val, _values, result) + l = CategoryLinkAST.new(@ast_index, @ast_length) + l.locator = val[3] + l.children = val[4] unless val[4].nil? or val[4].empty? + result = l + + result + end +.,., + +# reduce 18 omitted + +module_eval(<<'.,.,', 'mediacloth.y', 150) + def _reduce_19(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 154) + def _reduce_20(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 161) + def _reduce_21(val, _values, result) + if val[0] != val[2] + raise Racc::ParseError.new("XHTML end tag #{val[2]} does not match start tag #{val[0]}") + end + elem = ElementAST.new(@ast_index, @ast_length) + elem.name = val[0] + elem.attributes = val[1] + result = elem + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 171) + def _reduce_22(val, _values, result) + if val[0] != val[3] + raise Racc::ParseError.new("XHTML end tag #{val[3]} does not match start tag #{val[0]}") + end + elem = ElementAST.new(@ast_index, @ast_length) + elem.name = val[0] + elem.attributes = val[1] + elem.children += val[2] + result = elem + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 184) + def _reduce_23(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 188) + def _reduce_24(val, _values, result) + attr_map = val[2] ? val[2] : {} + attr_map[val[0]] = true + result = attr_map + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 194) + def _reduce_25(val, _values, result) + attr_map = val[2] ? val[2] : {} + attr_map[val[0]] = val[1] + result = attr_map + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 204) + def _reduce_26(val, _values, result) + result = val + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 208) + def _reduce_27(val, _values, result) + result = [val[0]] + result += val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 217) + def _reduce_28(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 221) + def _reduce_29(val, _values, result) + result = val[0] + result += val[2] if val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 229) + def _reduce_30(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 233) + def _reduce_31(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 239) + def _reduce_32(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 243) + def _reduce_33(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 249) + def _reduce_34(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 253) + def _reduce_35(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 257) + def _reduce_36(val, _values, result) + i = InternalLinkItemAST.new(@ast_index, @ast_length) + i.children = val[1] + result = [i] + result += val[2] if val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 266) + def _reduce_37(val, _values, result) + result = [] + result << val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 271) + def _reduce_38(val, _values, result) + result = [] + result += val[0] + result << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 279) + def _reduce_39(val, _values, result) + p = TextAST.new(@ast_index, @ast_length) + p.formatting = val[0][0] + p.contents = val[0][1] + result = p + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 286) + def _reduce_40(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 293) + def _reduce_41(val, _values, result) + table = TableAST.new(@ast_index, @ast_length) + table.children = val[1] unless val[1].nil? or val[1].empty? + result = table + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 299) + def _reduce_42(val, _values, result) + table = TableAST.new(@ast_index, @ast_length) + table.options = val[1] + table.children = val[2] unless val[2].nil? or val[2].empty? + result = table + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 307) + def _reduce_43(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 311) + def _reduce_44(val, _values, result) + row = TableRowAST.new(@ast_index, @ast_length) + row.children = val[1] unless val[1].nil? or val[1].empty? + result = [row] + result += val[3] unless val[3].nil? or val[3].empty? + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 318) + def _reduce_45(val, _values, result) + row = TableRowAST.new(@ast_index, @ast_length) + row.children = val[2] unless val[2].nil? or val[2].empty? + row.options = val[1] + result = [row] + result += val[4] unless val[4].nil? or val[4].empty? + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 327) + def _reduce_46(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 331) + def _reduce_47(val, _values, result) + cell = TableCellAST.new(@ast_index, @ast_length) + cell.type = :head + result = [cell] + result += val[2] unless val[2].nil? or val[2].empty? + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 338) + def _reduce_48(val, _values, result) + cell = TableCellAST.new(@ast_index, @ast_length) + cell.children = val[1] unless val[1].nil? or val[1].empty? + cell.type = :head + result = [cell] + result += val[3] unless val[3].nil? or val[3].empty? + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 346) + def _reduce_49(val, _values, result) + cell = TableCellAST.new(@ast_index, @ast_length) + cell.type = :body + result = [cell] + result += val[2] unless val[2].nil? or val[2].empty? + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 353) + def _reduce_50(val, _values, result) + if val[2] == 'attributes' + result = [] + else + cell = TableCellAST.new(@ast_index, @ast_length) + cell.children = val[1] unless val[1].nil? or val[1].empty? + cell.type = :body + result = [cell] + end + result += val[3] unless val[3].nil? or val[3].empty? + if val[2] == 'attributes' and val[3] and val[3].first.class == TableCellAST + val[3].first.attributes = val[1] + end + result + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 371) + def _reduce_51(val, _values, result) + return [:None, val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 373) + def _reduce_52(val, _values, result) + return [:HLine, val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 375) + def _reduce_53(val, _values, result) + return [:CharacterEntity, val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 377) + def _reduce_54(val, _values, result) + return [:SignatureDate, val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 379) + def _reduce_55(val, _values, result) + return [:SignatureName, val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 381) + def _reduce_56(val, _values, result) + return [:SignatureFull, val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 387) + def _reduce_57(val, _values, result) + result = FormattedAST.new(@ast_index, @ast_length) + result.formatting = :Bold + result + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 393) + def _reduce_58(val, _values, result) + result = FormattedAST.new(@ast_index, @ast_length) + result.formatting = :Italic + result + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 399) + def _reduce_59(val, _values, result) + p = FormattedAST.new(@ast_index, @ast_length) + p.formatting = :Bold + p.children += val[1] + result = p + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 406) + def _reduce_60(val, _values, result) + p = FormattedAST.new(@ast_index, @ast_length) + p.formatting = :Italic + p.children += val[1] + result = p + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 415) + def _reduce_61(val, _values, result) + list = ListAST.new(@ast_index, @ast_length) + list.list_type = :Bulleted + list.children << val[1] + list.children += val[2] + result = list + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 425) + def _reduce_62(val, _values, result) + list = ListAST.new(@ast_index, @ast_length) + list.list_type = :Numbered + list.children << val[1] + list.children += val[2] + result = list + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 434) + def _reduce_63(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 437) + def _reduce_64(val, _values, result) + result << val[1] + result += val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 441) + def _reduce_65(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 447) + def _reduce_66(val, _values, result) + result = ListItemAST.new(@ast_index, @ast_length) + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 451) + def _reduce_67(val, _values, result) + li = ListItemAST.new(@ast_index, @ast_length) + li.children += val[1] + result = li + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 460) + def _reduce_68(val, _values, result) + result = [val[1]] + result += val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 465) + def _reduce_69(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 472) + def _reduce_70(val, _values, result) + result = ListTermAST.new(@ast_index, @ast_length) + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 476) + def _reduce_71(val, _values, result) + term = ListTermAST.new(@ast_index, @ast_length) + term.children += val[1] + result = term + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 484) + def _reduce_72(val, _values, result) + result = [val[0]] + result += val[1] if val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 489) + def _reduce_73(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 495) + def _reduce_74(val, _values, result) + result = ListDefinitionAST.new(@ast_index, @ast_length) + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 499) + def _reduce_75(val, _values, result) + term = ListDefinitionAST.new(@ast_index, @ast_length) + term.children += val[1] + result = term + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 506) + def _reduce_76(val, _values, result) + p = PreformattedAST.new(@ast_index, @ast_length) + p.children += val[1] + result = p + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 512) + def _reduce_77(val, _values, result) + p = PreformattedAST.new(@ast_index, @ast_length) + p.indented = true + p.children += val[1] + result = p + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 520) + def _reduce_78(val, _values, result) + result = [val[1], val[0].length] + s = SectionAST.new(@ast_index, @ast_length) + s.children = val[1] + s.level = val[0].length + result = s + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 530) + def _reduce_79(val, _values, result) + t = TemplateAST.new(@ast_index, @ast_length) + t.template_name = val[1] + t.children = val[2] unless val[2].nil? or val[2].empty? + result = t + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 539) + def _reduce_80(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 543) + def _reduce_81(val, _values, result) + p = TemplateParameterAST.new(@ast_index, @ast_length) + p.parameter_value = val[1] + result = [p] + result += val[2] if val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'mediacloth.y', 550) + def _reduce_82(val, _values, result) + p = TemplateParameterAST.new(@ast_index, @ast_length) + p.children << val[1] + result = [p] + result += val[2] if val[2] + + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + +end # class MediaWikiParser diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/mof b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/mof new file mode 100644 index 000000000000..836604744b1e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/mof @@ -0,0 +1,1368 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + + +# parser.rb - generated by racc + +require 'strscan' +require 'rubygems' +require 'cim' +require File.join(File.dirname(__FILE__), 'result') +require File.join(File.dirname(__FILE__), 'scanner') +require File.join(File.dirname(__FILE__), 'helper') + +module MOF + class Parser < Racc::Parser + +module_eval(<<'...end mof.y/module_eval...', 'mof.y', 571) + +# +# Initialize MOF::Parser +# MOF::Parser.new options = {} +# +# options -> Hash of options +# :debug -> boolean +# :includes -> array of include dirs +# :style -> :cim or :wmi +# +def initialize options = {} + @yydebug = options[:debug] + @includes = options[:includes] || [] + @quiet = options[:quiet] + @style = options[:style] || :cim # default to style CIM v2.2 syntax + + @lineno = 1 + @file = nil + @iconv = nil + @eol = "\n" + @fname = nil + @fstack = [] + @in_comment = false + @seen_files = [] + @qualifiers = {} +end + +# +# Make options hash from argv +# +# returns [ files, options ] +# + + def self.argv_handler name, argv + files = [] + options = { :namespace => "" } + while argv.size > 0 + case opt = argv.shift + when "-h" + $stderr.puts "Ruby MOF compiler" + $stderr.puts "#{name} [-h] [-d] [-I <dir>] [<moffiles>]" + $stderr.puts "Compiles <moffile>" + $stderr.puts "\t-d debug" + $stderr.puts "\t-h this help" + $stderr.puts "\t-I <dir> include dir" + $stderr.puts "\t-f force" + $stderr.puts "\t-n <namespace>" + $stderr.puts "\t-o <output>" + $stderr.puts "\t-s <style> syntax style (wmi,cim)" + $stderr.puts "\t-q quiet" + $stderr.puts "\t<moffiles> file(s) to read (else use $stdin)" + exit 0 + when "-f" then options[:force] = true + when "-s" then options[:style] = argv.shift.to_sym + when "-d" then options[:debug] = true + when "-q" then options[:quiet] = true + when "-I" + options[:includes] ||= [] + dirname = argv.shift + unless File.directory?(dirname) + files << dirname + dirname = File.dirname(dirname) + end + options[:includes] << Pathname.new(dirname) + when "-n" then options[:namespace] = argv.shift + when "-o" then options[:output] = argv.shift + when /^-.+/ + $stderr.puts "Undefined option #{opt}" + else + files << opt + end + end + [ files, options ] + end + +include Helper +include Scanner + +...end mof.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 13, 172, 163, 197, 174, 27, 63, 17, 145, 146, + 147, 62, 28, 172, 11, 173, 174, 173, 148, 11, + 144, 149, 150, 151, 152, 18, 163, 173, 33, 153, + 106, 107, 108, 109, 110, 112, 111, 40, 15, 16, + 42, 55, 57, 68, 69, 71, 72, 52, 53, 54, + 56, 163, 7, 199, 35, 42, 174, 7, 10, 10, + 115, 102, 114, 36, 10, 55, 57, 68, 69, 71, + 72, 52, 53, 54, 56, 51, 190, 44, -77, 42, + 33, 189, 10, 10, 33, 102, 51, 164, 60, 10, + 55, 57, 68, 69, 71, 72, 52, 53, 54, 56, + 170, 35, 10, 21, 42, 22, 23, 10, 29, 31, + 102, 35, 95, 96, 55, 57, 25, 65, 24, 78, + 52, 53, 54, 56, 97, 55, 57, 35, 180, 181, + 100, 52, 53, 54, 56, 93, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + -25, 93, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 191, 192, 102, 60, + 55, 57, 68, 69, 71, 72, 52, 53, 54, 56, + 145, 146, 147, 172, 113, 97, 174, 10, 18, 118, + 148, 119, 144, 149, 150, 151, 152, 173, 121, 124, + 35, 153, 55, 57, 68, 69, 71, 72, 52, 53, + 54, 56, 106, 107, 108, 109, 110, 112, 111, 10, + 55, 57, 68, 69, 71, 72, 52, 53, 54, 56, + 21, 126, 22, 23, 127, 129, 21, 10, 22, 23, + 130, 131, 133, 25, 135, 24, 10, 141, 154, 25, + 35, 24, 93, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 106, 107, 108, + 109, 110, 112, 111, 184, 185, 194, 200, 121, 207, + -59, 121, 209, 211, 135, 135, 218, 220, 221, 226, + 228, 229, 231, 10, 121, 135 ] + +racc_action_check = [ + 1, 140, 135, 186, 140, 12, 37, 8, 131, 131, + 131, 37, 13, 194, 0, 140, 194, 186, 131, 1, + 131, 131, 131, 131, 131, 8, 189, 194, 16, 131, + 65, 65, 65, 65, 65, 65, 65, 20, 7, 7, + 20, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 211, 0, 187, 17, 135, 187, 1, 135, 0, + 75, 135, 75, 18, 1, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 33, 177, 26, 207, 189, + 29, 177, 189, 207, 30, 189, 96, 137, 34, 137, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 138, 36, 138, 10, 211, 10, 10, 211, 15, 15, + 211, 169, 47, 47, 33, 33, 10, 38, 10, 43, + 33, 33, 33, 33, 49, 96, 96, 216, 142, 142, + 58, 96, 96, 96, 96, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 42, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 178, 178, 60, 61, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 181, 181, 181, 218, 66, 70, 218, 42, 74, 77, + 181, 78, 181, 181, 181, 181, 181, 218, 94, 98, + 100, 181, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 141, 141, 141, 141, 141, 141, 141, 40, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 11, 102, 11, 11, 103, 116, 63, 115, 63, 63, + 118, 119, 121, 11, 122, 11, 127, 130, 132, 63, + 161, 63, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 192, 192, 192, + 192, 192, 192, 192, 162, 164, 183, 188, 195, 196, + 197, 198, 201, 205, 206, 208, 210, 212, 213, 217, + 221, 222, 223, 229, 230, 233 ] + +racc_action_pointer = [ + -5, 0, nil, nil, nil, nil, nil, 32, -2, nil, + 95, 222, -58, 12, nil, 101, -30, 46, 32, nil, + -21, nil, nil, nil, nil, nil, 11, nil, nil, 22, + 26, nil, nil, 67, 60, nil, 93, -54, 51, nil, + 155, nil, 123, 59, 220, nil, nil, 53, nil, 76, + nil, nil, nil, nil, nil, nil, nil, nil, 64, nil, + 101, 141, nil, 228, nil, 18, 125, nil, nil, nil, + 137, nil, nil, nil, 161, 0, nil, 129, 171, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 134, nil, 78, nil, 138, nil, + 192, nil, 223, 173, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 173, 172, nil, 214, 183, + nil, 195, 176, nil, nil, nil, nil, 182, nil, nil, + 189, -1, 183, nil, nil, -6, nil, 25, 38, nil, + -7, 200, 69, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 242, 208, nil, 212, nil, nil, nil, nil, 103, + nil, nil, nil, nil, nil, nil, nil, 13, 107, nil, + nil, 171, nil, 207, nil, nil, -5, 45, 248, 18, + nil, nil, 255, nil, 5, 214, 221, 222, 217, nil, + nil, 219, nil, nil, nil, 215, 216, 19, 217, nil, + 226, 43, 224, 229, nil, nil, 119, 226, 175, nil, + nil, 227, 231, 284, nil, nil, nil, nil, nil, 229, + 230, nil, nil, 227, nil, nil ] + +racc_action_default = [ + -1, -25, -2, -4, -5, -6, -7, -161, -161, -26, + -161, -161, -161, -161, -3, -161, -12, -161, -161, -28, + -33, -133, -134, -135, -136, -137, -161, -155, 236, -12, + -12, -11, -10, -161, -44, -48, -161, -161, -31, -34, + -25, -36, -100, -161, -161, -8, -9, -161, -14, -16, + -17, -18, -110, -111, -112, -113, -114, -115, -46, -45, + -161, -44, -27, -161, -30, -161, -161, -103, -104, -105, + -106, -107, -108, -109, -161, -161, -101, -131, -161, -60, + -61, -62, -63, -64, -65, -66, -67, -68, -69, -70, + -71, -72, -73, -74, -86, -13, -161, -116, -161, -47, + -161, -49, -161, -161, -29, -32, -37, -38, -39, -40, + -41, -42, -43, -35, -99, -25, -161, -132, -161, -161, + -87, -91, -93, -15, -20, -51, -50, -25, -102, -130, + -161, -161, -161, -92, -94, -25, -138, -25, -25, -157, + -161, -161, -161, -140, -142, -143, -144, -145, -146, -147, + -148, -149, -150, -151, -90, -95, -96, -97, -98, -117, + -118, -161, -161, -122, -161, -21, -22, -23, -24, -161, + -156, -158, -55, -56, -58, -128, -129, -161, -161, -153, + -139, -161, -119, -161, -121, -19, -161, -161, -75, -25, + -160, -152, -161, -141, -161, -86, -161, -55, -86, -57, + -76, -161, -154, -123, -125, -161, -93, -25, -93, -159, + -124, -25, -161, -161, -78, -80, -161, -161, -161, -127, + -52, -161, -79, -161, -83, -84, -53, -126, -54, -25, + -86, -85, -81, -88, -82, -89 ] + +racc_goto_table = [ + 8, 8, 34, 94, 122, 105, 136, 155, 48, 66, + 49, 76, 50, 19, 143, 187, 58, 204, 215, 32, + 139, 61, 2, 14, 12, 12, 1, 30, 47, 98, + 137, 171, 45, 46, 165, 166, 167, 168, 37, 26, + 232, 227, 38, 103, 64, 39, 41, 99, 101, 195, + 198, 196, 213, 214, 222, 223, 230, 234, 235, 132, + 75, 201, 225, 182, 193, 203, 104, 210, 177, 43, + 77, 123, 116, 49, 117, 50, 142, 178, 138, nil, + nil, 179, nil, 219, 128, 125, nil, nil, nil, nil, + 212, nil, 217, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 206, nil, nil, 208, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 140, 186, nil, + nil, nil, 202, nil, nil, nil, nil, 169, 140, nil, + 233, nil, nil, nil, nil, nil, 183, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 224, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 216, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 216 ] + +racc_goto_check = [ + 13, 13, 14, 35, 37, 28, 38, 52, 10, 30, + 11, 30, 12, 23, 69, 39, 15, 61, 44, 7, + 72, 14, 2, 2, 55, 55, 1, 8, 9, 16, + 17, 72, 7, 7, 18, 19, 20, 21, 24, 25, + 44, 61, 26, 15, 27, 29, 31, 33, 34, 36, + 40, 41, 42, 43, 45, 46, 47, 48, 50, 51, + 54, 52, 39, 58, 69, 60, 23, 62, 63, 64, + 65, 10, 66, 11, 67, 12, 68, 70, 71, nil, + nil, 28, nil, 52, 30, 14, nil, nil, nil, nil, + 38, nil, 38, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 37, nil, nil, 37, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 13, 35, nil, + nil, nil, 28, nil, nil, nil, nil, 13, 13, nil, + 37, nil, nil, nil, nil, nil, 14, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 35, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 13, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 13 ] + +racc_goto_pointer = [ + nil, 26, 22, nil, nil, nil, nil, 3, 12, -5, + -25, -23, -21, 0, -15, -18, -29, -94, -103, -102, + -101, -100, nil, 3, 19, 28, 22, 6, -60, 25, + -31, 26, nil, -11, -12, -41, -137, -90, -116, -154, + -137, -135, -155, -154, -189, -161, -161, -167, -176, nil, + -175, -62, -128, nil, 18, 24, nil, nil, -98, nil, + -129, -177, -137, -72, 43, 27, -5, -3, -55, -117, + -64, -49, -107 ] + +racc_goto_default = [ + nil, nil, nil, 3, 4, 5, 6, nil, nil, nil, + nil, 70, 67, 74, 188, nil, nil, nil, nil, nil, + nil, nil, 9, nil, nil, 20, nil, nil, nil, nil, + 156, 157, 59, nil, 160, nil, 175, nil, nil, nil, + 176, nil, nil, nil, nil, nil, nil, nil, nil, 120, + 134, nil, nil, 158, nil, 73, 159, 161, nil, 162, + nil, nil, nil, 205, nil, nil, nil, nil, nil, nil, + nil, nil, nil ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 71, :_reduce_1, + 1, 71, :_reduce_2, + 2, 71, :_reduce_3, + 1, 72, :_reduce_none, + 1, 72, :_reduce_5, + 1, 72, :_reduce_6, + 1, 72, :_reduce_7, + 4, 73, :_reduce_8, + 4, 73, :_reduce_none, + 3, 73, :_reduce_10, + 1, 78, :_reduce_none, + 0, 77, :_reduce_12, + 3, 77, :_reduce_13, + 1, 79, :_reduce_none, + 3, 79, :_reduce_none, + 1, 80, :_reduce_none, + 1, 80, :_reduce_17, + 1, 80, :_reduce_none, + 9, 74, :_reduce_19, + 0, 87, :_reduce_20, + 2, 87, :_reduce_21, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 0, 83, :_reduce_none, + 1, 83, :_reduce_26, + 4, 92, :_reduce_27, + 0, 94, :_reduce_28, + 3, 94, :_reduce_29, + 3, 93, :_reduce_30, + 0, 97, :_reduce_none, + 2, 97, :_reduce_32, + 0, 96, :_reduce_none, + 1, 96, :_reduce_none, + 3, 99, :_reduce_35, + 1, 99, :_reduce_none, + 1, 98, :_reduce_none, + 1, 98, :_reduce_none, + 1, 98, :_reduce_none, + 1, 98, :_reduce_none, + 1, 98, :_reduce_none, + 1, 98, :_reduce_none, + 1, 98, :_reduce_43, + 0, 85, :_reduce_none, + 1, 85, :_reduce_none, + 0, 86, :_reduce_none, + 1, 86, :_reduce_none, + 1, 84, :_reduce_48, + 2, 102, :_reduce_49, + 2, 104, :_reduce_50, + 2, 103, :_reduce_51, + 6, 89, :_reduce_52, + 6, 91, :_reduce_53, + 7, 90, :_reduce_54, + 1, 106, :_reduce_none, + 1, 106, :_reduce_56, + 1, 110, :_reduce_none, + 1, 110, :_reduce_58, + 1, 111, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_none, + 1, 105, :_reduce_74, + 1, 109, :_reduce_75, + 2, 109, :_reduce_76, + 0, 112, :_reduce_none, + 1, 112, :_reduce_none, + 2, 113, :_reduce_79, + 0, 115, :_reduce_80, + 3, 115, :_reduce_81, + 5, 114, :_reduce_82, + 1, 116, :_reduce_none, + 1, 116, :_reduce_none, + 1, 117, :_reduce_none, + 0, 107, :_reduce_none, + 1, 107, :_reduce_none, + 0, 118, :_reduce_none, + 1, 118, :_reduce_89, + 3, 119, :_reduce_90, + 0, 121, :_reduce_91, + 1, 121, :_reduce_none, + 0, 108, :_reduce_none, + 1, 108, :_reduce_none, + 2, 120, :_reduce_95, + 1, 122, :_reduce_none, + 1, 122, :_reduce_none, + 1, 122, :_reduce_none, + 3, 101, :_reduce_99, + 0, 124, :_reduce_none, + 1, 124, :_reduce_101, + 3, 124, :_reduce_102, + 1, 100, :_reduce_none, + 1, 100, :_reduce_none, + 1, 100, :_reduce_none, + 1, 100, :_reduce_none, + 1, 100, :_reduce_none, + 1, 100, :_reduce_none, + 1, 100, :_reduce_109, + 1, 82, :_reduce_none, + 1, 82, :_reduce_none, + 1, 82, :_reduce_none, + 1, 82, :_reduce_none, + 1, 82, :_reduce_none, + 1, 81, :_reduce_none, + 2, 81, :_reduce_116, + 1, 123, :_reduce_none, + 1, 123, :_reduce_none, + 2, 126, :_reduce_none, + 0, 127, :_reduce_none, + 2, 127, :_reduce_none, + 1, 129, :_reduce_none, + 3, 128, :_reduce_none, + 2, 130, :_reduce_none, + 0, 132, :_reduce_none, + 3, 132, :_reduce_none, + 3, 131, :_reduce_none, + 1, 133, :_reduce_none, + 1, 133, :_reduce_none, + 6, 75, :_reduce_130, + 0, 136, :_reduce_none, + 1, 136, :_reduce_none, + 1, 95, :_reduce_none, + 1, 95, :_reduce_none, + 1, 95, :_reduce_none, + 1, 95, :_reduce_none, + 1, 95, :_reduce_none, + 4, 134, :_reduce_138, + 5, 135, :_reduce_139, + 1, 138, :_reduce_140, + 3, 138, :_reduce_141, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 5, 137, :_reduce_152, + 1, 140, :_reduce_153, + 3, 140, :_reduce_154, + 2, 76, :_reduce_none, + 8, 125, :_reduce_none, + 1, 141, :_reduce_none, + 2, 141, :_reduce_none, + 5, 142, :_reduce_none, + 3, 142, :_reduce_160 ] + +racc_reduce_n = 161 + +racc_shift_n = 236 + +racc_token_table = { + false => 0, + :error => 1, + "*" => 2, + "/" => 3, + "+" => 4, + "-" => 5, + :PRAGMA => 6, + :INCLUDE => 7, + :IDENTIFIER => 8, + :CLASS => 9, + :ASSOCIATION => 10, + :INDICATION => 11, + :AMENDED => 12, + :ENABLEOVERRIDE => 13, + :DISABLEOVERRIDE => 14, + :RESTRICTED => 15, + :TOSUBCLASS => 16, + :TOINSTANCE => 17, + :TRANSLATABLE => 18, + :QUALIFIER => 19, + :SCOPE => 20, + :SCHEMA => 21, + :PROPERTY => 22, + :REFERENCE => 23, + :METHOD => 24, + :PARAMETER => 25, + :FLAVOR => 26, + :INSTANCE => 27, + :AS => 28, + :REF => 29, + :ANY => 30, + :OF => 31, + :DT_VOID => 32, + :DT_UINT8 => 33, + :DT_SINT8 => 34, + :DT_UINT16 => 35, + :DT_SINT16 => 36, + :DT_UINT32 => 37, + :DT_SINT32 => 38, + :DT_UINT64 => 39, + :DT_SINT64 => 40, + :DT_REAL32 => 41, + :DT_REAL64 => 42, + :DT_CHAR16 => 43, + :DT_STR => 44, + :DT_BOOLEAN => 45, + :DT_DATETIME => 46, + :positiveDecimalValue => 47, + :stringValue => 48, + :realValue => 49, + :charValue => 50, + :booleanValue => 51, + :nullValue => 52, + :binaryValue => 53, + :octalValue => 54, + :decimalValue => 55, + :hexValue => 56, + "#" => 57, + "(" => 58, + ")" => 59, + "," => 60, + "{" => 61, + "}" => 62, + ";" => 63, + "[" => 64, + "]" => 65, + ":" => 66, + "$" => 67, + "=" => 68, + "." => 69 } + +racc_nt_base = 70 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "\"*\"", + "\"/\"", + "\"+\"", + "\"-\"", + "PRAGMA", + "INCLUDE", + "IDENTIFIER", + "CLASS", + "ASSOCIATION", + "INDICATION", + "AMENDED", + "ENABLEOVERRIDE", + "DISABLEOVERRIDE", + "RESTRICTED", + "TOSUBCLASS", + "TOINSTANCE", + "TRANSLATABLE", + "QUALIFIER", + "SCOPE", + "SCHEMA", + "PROPERTY", + "REFERENCE", + "METHOD", + "PARAMETER", + "FLAVOR", + "INSTANCE", + "AS", + "REF", + "ANY", + "OF", + "DT_VOID", + "DT_UINT8", + "DT_SINT8", + "DT_UINT16", + "DT_SINT16", + "DT_UINT32", + "DT_SINT32", + "DT_UINT64", + "DT_SINT64", + "DT_REAL32", + "DT_REAL64", + "DT_CHAR16", + "DT_STR", + "DT_BOOLEAN", + "DT_DATETIME", + "positiveDecimalValue", + "stringValue", + "realValue", + "charValue", + "booleanValue", + "nullValue", + "binaryValue", + "octalValue", + "decimalValue", + "hexValue", + "\"#\"", + "\"(\"", + "\")\"", + "\",\"", + "\"{\"", + "\"}\"", + "\";\"", + "\"[\"", + "\"]\"", + "\":\"", + "\"$\"", + "\"=\"", + "\".\"", + "$start", + "mofSpecification", + "mofProduction", + "compilerDirective", + "classDeclaration", + "qualifierDeclaration", + "instanceDeclaration", + "pragmaParameters_opt", + "pragmaName", + "pragmaParameterValues", + "pragmaParameterValue", + "string", + "integerValue", + "qualifierList_opt", + "className", + "alias_opt", + "superClass_opt", + "classFeatures", + "classFeature", + "propertyDeclaration", + "methodDeclaration", + "referenceDeclaration", + "qualifierList", + "qualifier", + "qualifiers", + "qualifierName", + "qualifierParameter_opt", + "flavor_opt", + "flavor", + "qualifierParameter", + "constantValue", + "arrayInitializer", + "alias", + "superClass", + "aliasIdentifier", + "dataType", + "propertyName", + "array_opt", + "defaultValue_opt", + "objectRef", + "referenceName", + "methodName", + "parameterList_opt", + "parameterList", + "parameter", + "parameters", + "typespec", + "parameterName", + "parameterValue_opt", + "array", + "defaultValue", + "positiveDecimalValue_opt", + "initializer", + "referenceInitializer", + "constantValues", + "instance", + "objectHandle", + "namespace_opt", + "modelPath", + "namespaceHandle", + "keyValuePairList", + "keyValuePair", + "keyValuePairs", + "keyname", + "qualifierType", + "scope", + "defaultFlavor_opt", + "defaultFlavor", + "metaElements", + "metaElement", + "flavors", + "valueInitializers", + "valueInitializer" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'mof.y', 41) + def _reduce_1(val, _values, result) + result = Hash.new + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 43) + def _reduce_2(val, _values, result) + result = { @name => @result } + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 45) + def _reduce_3(val, _values, result) + result = val[0] + result[@name] = @result + + result + end +.,., + +# reduce 4 omitted + +module_eval(<<'.,.,', 'mof.y', 53) + def _reduce_5(val, _values, result) + #puts "Class '#{val[0].name}'" + @result.classes << val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 57) + def _reduce_6(val, _values, result) + @result.qualifiers << val[0] + @qualifiers[val[0].name.downcase] = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 61) + def _reduce_7(val, _values, result) + @result.instances << val[0] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 71) + def _reduce_8(val, _values, result) + raise MOF::Helper::Error.new(@name,@lineno,@line,"Missing filename after '#pragma include'") unless val[3] + open val[3], :pragma + + result + end +.,., + +# reduce 9 omitted + +module_eval(<<'.,.,', 'mof.y', 76) + def _reduce_10(val, _values, result) + raise StyleError.new(@name,@lineno,@line,"Use '#pragma include' instead of '#include'") unless @style == :wmi + raise MOF::Helper::Error.new(@name,@lineno,@line,"Missing filename after '#include'") unless val[2] + open val[2], :pragma + + result + end +.,., + +# reduce 11 omitted + +module_eval(<<'.,.,', 'mof.y', 88) + def _reduce_12(val, _values, result) + raise StyleError.new(@name,@lineno,@line,"#pragma parameter missing") unless @style == :wmi + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 90) + def _reduce_13(val, _values, result) + result = val[1] + result + end +.,., + +# reduce 14 omitted + +# reduce 15 omitted + +# reduce 16 omitted + +module_eval(<<'.,.,', 'mof.y', 101) + def _reduce_17(val, _values, result) + raise StyleError.new(@name,@lineno,@line,"#pragma parameter missing") unless @style == :wmi + result + end +.,., + +# reduce 18 omitted + +module_eval(<<'.,.,', 'mof.y', 112) + def _reduce_19(val, _values, result) + qualifiers = val[0] + features = val[6] + # FIXME: features must not include references + result = CIM::Class.new(val[2],qualifiers,val[3],val[4],features) + + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 121) + def _reduce_20(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 123) + def _reduce_21(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +# reduce 22 omitted + +# reduce 23 omitted + +# reduce 24 omitted + +# reduce 25 omitted + +module_eval(<<'.,.,', 'mof.y', 136) + def _reduce_26(val, _values, result) + result = CIM::QualifierSet.new val[0] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 141) + def _reduce_27(val, _values, result) + result = val[2] + result.unshift val[1] if val[1] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 147) + def _reduce_28(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 149) + def _reduce_29(val, _values, result) + result = val[0] + result << val[2] if val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 156) + def _reduce_30(val, _values, result) + # Get qualifier decl + qualifier = case val[0] + when CIM::Qualifier then val[0].definition + when CIM::QualifierDeclaration then val[0] + when String then @qualifiers[val[0].downcase] + else + nil + end + raise MOF::Helper::Error.new(@name,@lineno,@line,"'#{val[0]}' is not a valid qualifier") unless qualifier + value = val[1] + raise MOF::Helper::Error.new(@name,@lineno,@line,"#{value.inspect} does not match qualifier type '#{qualifier.type}'") unless qualifier.type.matches?(value)||@style == :wmi + # Don't propagate a boolean 'false' + if qualifier.type == :boolean && value == false + result = nil + else + result = CIM::Qualifier.new(qualifier,value,val[2]) + end + + result + end +.,., + +# reduce 31 omitted + +module_eval(<<'.,.,', 'mof.y', 179) + def _reduce_32(val, _values, result) + result = CIM::QualifierFlavors.new val[1] + result + end +.,., + +# reduce 33 omitted + +# reduce 34 omitted + +module_eval(<<'.,.,', 'mof.y', 189) + def _reduce_35(val, _values, result) + result = val[1] + result + end +.,., + +# reduce 36 omitted + +# reduce 37 omitted + +# reduce 38 omitted + +# reduce 39 omitted + +# reduce 40 omitted + +# reduce 41 omitted + +# reduce 42 omitted + +module_eval(<<'.,.,', 'mof.y', 196) + def _reduce_43(val, _values, result) + case val[0].to_sym + when :amended, :toinstance + raise StyleError.new(@name,@lineno,@line,"'#{val[0]}' is not a valid flavor") unless @style == :wmi + end + + result + end +.,., + +# reduce 44 omitted + +# reduce 45 omitted + +# reduce 46 omitted + +# reduce 47 omitted + +module_eval(<<'.,.,', 'mof.y', 215) + def _reduce_48(val, _values, result) + raise ParseError.new("Class name must be prefixed by '<schema>_'") unless val[0].include?("_") || @style == :wmi + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 220) + def _reduce_49(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 225) + def _reduce_50(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 230) + def _reduce_51(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 236) + def _reduce_52(val, _values, result) + if val[3] + type = CIM::Array.new val[3],val[1] + else + type = val[1] + end + result = CIM::Property.new(type,val[2],val[0],val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 247) + def _reduce_53(val, _values, result) + if val[4] + raise StyleError.new(@name,@lineno,@line,"Array not allowed in reference declaration") unless @style == :wmi + end + result = CIM::Reference.new(val[1],val[2],val[0],val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 255) + def _reduce_54(val, _values, result) + result = CIM::Method.new(val[1],val[2],val[0],val[4]) + result + end +.,., + +# reduce 55 omitted + +module_eval(<<'.,.,', 'mof.y', 261) + def _reduce_56(val, _values, result) + # tmplprov.mof has 'string Property;' + raise StyleError.new(@name,@lineno,@line,"Invalid keyword '#{val[0]}' used for property name") unless @style == :wmi + + result + end +.,., + +# reduce 57 omitted + +module_eval(<<'.,.,', 'mof.y', 269) + def _reduce_58(val, _values, result) + result = "Indication" + result + end +.,., + +# reduce 59 omitted + +# reduce 60 omitted + +# reduce 61 omitted + +# reduce 62 omitted + +# reduce 63 omitted + +# reduce 64 omitted + +# reduce 65 omitted + +# reduce 66 omitted + +# reduce 67 omitted + +# reduce 68 omitted + +# reduce 69 omitted + +# reduce 70 omitted + +# reduce 71 omitted + +# reduce 72 omitted + +# reduce 73 omitted + +module_eval(<<'.,.,', 'mof.y', 292) + def _reduce_74(val, _values, result) + raise StyleError.new(@name,@lineno,@line,"'void' is not a valid datatype") unless @style == :wmi + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 297) + def _reduce_75(val, _values, result) + # WMI uses class names as data types (without REF ?!) + raise StyleError.new(@name,@lineno,@line,"Expected 'ref' keyword after classname '#{val[0]}'") unless @style == :wmi + result = CIM::ReferenceType.new val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 303) + def _reduce_76(val, _values, result) + result = CIM::ReferenceType.new val[0] + result + end +.,., + +# reduce 77 omitted + +# reduce 78 omitted + +module_eval(<<'.,.,', 'mof.y', 313) + def _reduce_79(val, _values, result) + result = val[1].unshift val[0] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 318) + def _reduce_80(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 320) + def _reduce_81(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 325) + def _reduce_82(val, _values, result) + if val[3] + type = CIM::Array.new val[3], val[1] + else + type = val[1] + end + result = CIM::Property.new(type,val[2],val[0]) + + result + end +.,., + +# reduce 83 omitted + +# reduce 84 omitted + +# reduce 85 omitted + +# reduce 86 omitted + +# reduce 87 omitted + +# reduce 88 omitted + +module_eval(<<'.,.,', 'mof.y', 351) + def _reduce_89(val, _values, result) + raise "Default parameter value not allowed in syntax style '{@style}'" unless @style == :wmi + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 356) + def _reduce_90(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 361) + def _reduce_91(val, _values, result) + result = -1 + result + end +.,., + +# reduce 92 omitted + +# reduce 93 omitted + +# reduce 94 omitted + +module_eval(<<'.,.,', 'mof.y', 372) + def _reduce_95(val, _values, result) + result = val[1] + result + end +.,., + +# reduce 96 omitted + +# reduce 97 omitted + +# reduce 98 omitted + +module_eval(<<'.,.,', 'mof.y', 383) + def _reduce_99(val, _values, result) + result = val[1] + result + end +.,., + +# reduce 100 omitted + +module_eval(<<'.,.,', 'mof.y', 389) + def _reduce_101(val, _values, result) + result = [ val[0] ] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 391) + def _reduce_102(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +# reduce 103 omitted + +# reduce 104 omitted + +# reduce 105 omitted + +# reduce 106 omitted + +# reduce 107 omitted + +# reduce 108 omitted + +module_eval(<<'.,.,', 'mof.y', 402) + def _reduce_109(val, _values, result) + raise "Instance as property value not allowed in syntax style '{@style}'" unless @style == :wmi + result + end +.,., + +# reduce 110 omitted + +# reduce 111 omitted + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +module_eval(<<'.,.,', 'mof.y', 416) + def _reduce_116(val, _values, result) + result = val[0] + val[1] + result + end +.,., + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +# reduce 121 omitted + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +module_eval(<<'.,.,', 'mof.y', 471) + def _reduce_130(val, _values, result) + result = CIM::QualifierDeclaration.new( val[1], val[2][0], val[2][1], val[3], val[4]) + result + end +.,., + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +module_eval(<<'.,.,', 'mof.y', 490) + def _reduce_138(val, _values, result) + type = val[2].nil? ? val[1] : CIM::Array.new(val[2],val[1]) + result = [ type, val[3] ] + + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 497) + def _reduce_139(val, _values, result) + result = CIM::QualifierScopes.new(val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 502) + def _reduce_140(val, _values, result) + result = [ val[0] ] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 504) + def _reduce_141(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +module_eval(<<'.,.,', 'mof.y', 522) + def _reduce_152(val, _values, result) + result = CIM::QualifierFlavors.new val[3] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 527) + def _reduce_153(val, _values, result) + result = [ val[0] ] + result + end +.,., + +module_eval(<<'.,.,', 'mof.y', 529) + def _reduce_154(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +module_eval(<<'.,.,', 'mof.y', 553) + def _reduce_160(val, _values, result) + raise "Instance property '#{val[1]} must have a value" unless @style == :wmi + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module MOF + + diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/namae b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/namae new file mode 100644 index 000000000000..5a795e45793a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/namae @@ -0,0 +1,634 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + +require 'singleton' +require 'strscan' + +module Namae + class Parser < Racc::Parser + +module_eval(<<'...end namae.y/module_eval...', 'namae.y', 135) + + include Singleton + + attr_reader :options, :input + + def initialize + @input, @options = StringScanner.new(''), { + :debug => false, + :prefer_comma_as_separator => false, + :comma => ',', + :stops => ',;', + :separator => /\s*(\band\b|\&|;)\s*/i, + :title => /\s*\b(sir|lord|count(ess)?|(gen|adm|col|maj|capt|cmdr|lt|sgt|cpl|pvt|prof|dr|md|ph\.?d)\.?)(\s+|$)/i, + :suffix => /\s*\b(JR|Jr|jr|SR|Sr|sr|[IVX]{2,})(\.|\b)/, + :appellation => /\s*\b((mrs?|ms|fr|hr)\.?|miss|herr|frau)(\s+|$)/i + } + end + + def debug? + options[:debug] || ENV['DEBUG'] + end + + def separator + options[:separator] + end + + def comma + options[:comma] + end + + def stops + options[:stops] + end + + def title + options[:title] + end + + def suffix + options[:suffix] + end + + def appellation + options[:appellation] + end + + def prefer_comma_as_separator? + options[:prefer_comma_as_separator] + end + + def parse(input) + parse!(input) + rescue => e + warn e.message if debug? + [] + end + + def parse!(string) + input.string = normalize(string) + reset + do_parse + end + + def normalize(string) + string = string.strip + string + end + + def reset + @commas, @words, @initials, @suffices, @yydebug = 0, 0, 0, 0, debug? + self + end + + private + + def stack + @vstack || @racc_vstack || [] + end + + def last_token + stack[-1] + end + + def consume_separator + return next_token if seen_separator? + @commas, @words, @initials, @suffices = 0, 0, 0, 0 + [:AND, :AND] + end + + def consume_comma + @commas += 1 + [:COMMA, :COMMA] + end + + def consume_word(type, word) + @words += 1 + + case type + when :UWORD + @initials += 1 if word =~ /^[[:upper:]]+\b/ + when :SUFFIX + @suffices += 1 + end + + [type, word] + end + + def seen_separator? + !stack.empty? && last_token == :AND + end + + def suffix? + !@suffices.zero? || will_see_suffix? + end + + def will_see_suffix? + input.peek(8).to_s.strip.split(/\s+/)[0] =~ suffix + end + + def will_see_initial? + input.peek(6).to_s.strip.split(/\s+/)[0] =~ /^[[:upper:]]+\b/ + end + + def seen_full_name? + prefer_comma_as_separator? && @words > 1 && + (@initials > 0 || !will_see_initial?) && !will_see_suffix? + end + + def next_token + case + when input.nil?, input.eos? + nil + when input.scan(separator) + consume_separator + when input.scan(/\s*#{comma}\s*/) + if @commas.zero? && !seen_full_name? || @commas == 1 && suffix? + consume_comma + else + consume_separator + end + when input.scan(/\s+/) + next_token + when input.scan(title) + consume_word(:TITLE, input.matched.strip) + when input.scan(suffix) + consume_word(:SUFFIX, input.matched.strip) + when input.scan(appellation) + [:APPELLATION, input.matched.strip] + when input.scan(/((\\\w+)?\{[^\}]*\})*[[:upper:]][^\s#{stops}]*/) + consume_word(:UWORD, input.matched) + when input.scan(/((\\\w+)?\{[^\}]*\})*[[:lower:]][^\s#{stops}]*/) + consume_word(:LWORD, input.matched) + when input.scan(/(\\\w+)?\{[^\}]*\}[^\s#{stops}]*/) + consume_word(:PWORD, input.matched) + when input.scan(/('[^'\n]+')|("[^"\n]+")/) + consume_word(:NICK, input.matched[1...-1]) + else + raise ArgumentError, + "Failed to parse name #{input.string.inspect}: unmatched data at offset #{input.pos}" + end + end + + def on_error(tid, value, stack) + raise ArgumentError, + "Failed to parse name: unexpected '#{value}' at #{stack.inspect}" + end + +# -*- racc -*- +...end namae.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + -39, 16, 32, 30, -40, 31, 33, -39, 17, -39, + -39, -40, 67, -40, -40, 66, 53, 52, 54, -38, + 59, -22, 39, -34, 45, 58, -38, 53, 52, 54, + 53, 52, 54, 59, 39, 39, 62, 39, 53, 52, + 54, 14, 12, 15, 68, 39, 7, 8, 14, 12, + 15, 58, 39, 7, 8, 14, 22, 15, 24, 14, + 22, 15, 24, 14, 22, 15, 30, 28, 31, 30, + 28, 31, -19, -19, -19, 30, 42, 31, 30, 28, + 31, -20, -20, -20, 30, 46, 31, 30, 28, 31, + 30, 28, 31, -19, -19, -19, 53, 52, 54, 53, + 52, 54, 39, 58, 59 ] + +racc_action_check = [ + 14, 1, 11, 43, 15, 43, 16, 14, 1, 14, + 14, 15, 50, 15, 15, 49, 49, 49, 49, 12, + 50, 12, 23, 49, 27, 37, 12, 32, 32, 32, + 45, 45, 45, 38, 32, 40, 44, 45, 62, 62, + 62, 0, 0, 0, 57, 62, 0, 0, 17, 17, + 17, 60, 61, 17, 17, 9, 9, 9, 9, 20, + 20, 20, 20, 5, 5, 5, 10, 10, 10, 21, + 21, 21, 22, 22, 22, 24, 24, 24, 25, 25, + 25, 28, 28, 28, 29, 29, 29, 35, 35, 35, + 41, 41, 41, 42, 42, 42, 67, 67, 67, 73, + 73, 73, 64, 70, 72 ] + +racc_action_pointer = [ + 38, 1, nil, nil, nil, 60, nil, nil, nil, 52, + 63, 0, 19, nil, 0, 4, 6, 45, nil, nil, + 56, 66, 69, 12, 72, 75, nil, 22, 78, 81, + nil, nil, 24, nil, nil, 84, nil, 16, 23, nil, + 25, 87, 90, 0, 34, 27, nil, nil, nil, 13, + 10, nil, nil, nil, nil, nil, nil, 35, nil, nil, + 42, 42, 35, nil, 92, nil, nil, 93, nil, nil, + 94, nil, 94, 96, nil ] + +racc_action_default = [ + -1, -49, -2, -4, -5, -49, -8, -9, -10, -23, + -49, -49, -19, -28, -30, -31, -49, -49, -6, -7, + -49, -49, -38, -41, -49, -49, -29, -15, -22, -23, + -30, -31, -36, 75, -3, -49, -15, -45, -42, -43, + -41, -49, -22, -23, -14, -36, -21, -16, -24, -37, + -26, -32, -38, -39, -40, -14, -11, -46, -47, -44, + -45, -41, -36, -17, -49, -33, -35, -49, -48, -12, + -45, -18, -25, -27, -13 ] + +racc_goto_table = [ + 3, 37, 26, 50, 56, 18, 2, 9, 47, 23, + 1, 19, 20, 26, 73, 27, 50, 3, 60, 64, + 23, 63, 26, 34, 9, nil, 36, 69, 21, 40, + 44, 43, 25, 50, nil, 72, 26, 74, 71, 70, + 55, nil, nil, 35, nil, nil, 61, 41, nil, 65, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 65 ] + +racc_goto_check = [ + 3, 8, 17, 16, 9, 3, 2, 7, 12, 3, + 1, 4, 7, 17, 14, 10, 16, 3, 8, 15, + 3, 12, 17, 2, 7, nil, 10, 9, 11, 10, + 10, 7, 11, 16, nil, 16, 17, 9, 12, 8, + 10, nil, nil, 11, nil, nil, 10, 11, nil, 3, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 3 ] + +racc_goto_pointer = [ + nil, 10, 6, 0, 6, nil, nil, 7, -22, -33, + 5, 23, -24, nil, -53, -30, -29, -7, nil ] + +racc_goto_default = [ + nil, nil, nil, 51, 4, 5, 6, 29, nil, nil, + 11, 10, nil, 48, 49, nil, 38, 13, 57 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 12, :_reduce_1, + 1, 12, :_reduce_2, + 3, 12, :_reduce_3, + 1, 13, :_reduce_4, + 1, 13, :_reduce_none, + 2, 13, :_reduce_6, + 2, 13, :_reduce_7, + 1, 13, :_reduce_none, + 1, 16, :_reduce_9, + 1, 16, :_reduce_10, + 4, 15, :_reduce_11, + 5, 15, :_reduce_12, + 6, 15, :_reduce_13, + 3, 15, :_reduce_14, + 2, 15, :_reduce_15, + 3, 17, :_reduce_16, + 4, 17, :_reduce_17, + 5, 17, :_reduce_18, + 1, 22, :_reduce_none, + 2, 22, :_reduce_20, + 3, 22, :_reduce_21, + 1, 21, :_reduce_none, + 1, 21, :_reduce_none, + 1, 23, :_reduce_24, + 3, 23, :_reduce_25, + 1, 23, :_reduce_26, + 3, 23, :_reduce_27, + 1, 18, :_reduce_none, + 2, 18, :_reduce_29, + 1, 28, :_reduce_none, + 1, 28, :_reduce_none, + 1, 25, :_reduce_none, + 2, 25, :_reduce_33, + 0, 26, :_reduce_none, + 1, 26, :_reduce_none, + 0, 24, :_reduce_none, + 1, 24, :_reduce_none, + 1, 14, :_reduce_none, + 1, 14, :_reduce_none, + 1, 14, :_reduce_none, + 0, 19, :_reduce_none, + 1, 19, :_reduce_none, + 1, 27, :_reduce_none, + 2, 27, :_reduce_44, + 0, 20, :_reduce_none, + 1, 20, :_reduce_none, + 1, 29, :_reduce_none, + 2, 29, :_reduce_48 ] + +racc_reduce_n = 49 + +racc_shift_n = 75 + +racc_token_table = { + false => 0, + :error => 1, + :COMMA => 2, + :UWORD => 3, + :LWORD => 4, + :PWORD => 5, + :NICK => 6, + :AND => 7, + :APPELLATION => 8, + :TITLE => 9, + :SUFFIX => 10 } + +racc_nt_base = 11 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "COMMA", + "UWORD", + "LWORD", + "PWORD", + "NICK", + "AND", + "APPELLATION", + "TITLE", + "SUFFIX", + "$start", + "names", + "name", + "word", + "display_order", + "honorific", + "sort_order", + "u_words", + "opt_suffices", + "opt_titles", + "last", + "von", + "first", + "opt_words", + "words", + "opt_comma", + "suffices", + "u_word", + "titles" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'namae.y', 39) + def _reduce_1(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 40) + def _reduce_2(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 41) + def _reduce_3(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 43) + def _reduce_4(val, _values, result) + result = Name.new(:given => val[0]) + result + end +.,., + +# reduce 5 omitted + +module_eval(<<'.,.,', 'namae.y', 45) + def _reduce_6(val, _values, result) + result = val[0].merge(:family => val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 46) + def _reduce_7(val, _values, result) + result = val[1].merge(val[0]) + result + end +.,., + +# reduce 8 omitted + +module_eval(<<'.,.,', 'namae.y', 49) + def _reduce_9(val, _values, result) + result = Name.new(:appellation => val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 50) + def _reduce_10(val, _values, result) + result = Name.new(:title => val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 54) + def _reduce_11(val, _values, result) + result = Name.new(:given => val[0], :family => val[1], + :suffix => val[2], :title => val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 59) + def _reduce_12(val, _values, result) + result = Name.new(:given => val[0], :nick => val[1], + :family => val[2], :suffix => val[3], :title => val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 64) + def _reduce_13(val, _values, result) + result = Name.new(:given => val[0], :nick => val[1], + :particle => val[2], :family => val[3], + :suffix => val[4], :title => val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 70) + def _reduce_14(val, _values, result) + result = Name.new(:given => val[0], :particle => val[1], + :family => val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 75) + def _reduce_15(val, _values, result) + result = Name.new(:particle => val[0], :family => val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 80) + def _reduce_16(val, _values, result) + result = Name.new({ :family => val[0], :suffix => val[2][0], + :given => val[2][1] }, !!val[2][0]) + + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 85) + def _reduce_17(val, _values, result) + result = Name.new({ :particle => val[0], :family => val[1], + :suffix => val[3][0], :given => val[3][1] }, !!val[3][0]) + + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 90) + def _reduce_18(val, _values, result) + result = Name.new({ :particle => val[0,2].join(' '), :family => val[2], + :suffix => val[4][0], :given => val[4][1] }, !!val[4][0]) + + result + end +.,., + +# reduce 19 omitted + +module_eval(<<'.,.,', 'namae.y', 96) + def _reduce_20(val, _values, result) + result = val.join(' ') + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 97) + def _reduce_21(val, _values, result) + result = val.join(' ') + result + end +.,., + +# reduce 22 omitted + +# reduce 23 omitted + +module_eval(<<'.,.,', 'namae.y', 101) + def _reduce_24(val, _values, result) + result = [nil,val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 102) + def _reduce_25(val, _values, result) + result = [val[2],val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 103) + def _reduce_26(val, _values, result) + result = [val[0],nil] + result + end +.,., + +module_eval(<<'.,.,', 'namae.y', 104) + def _reduce_27(val, _values, result) + result = [val[0],val[2]] + result + end +.,., + +# reduce 28 omitted + +module_eval(<<'.,.,', 'namae.y', 107) + def _reduce_29(val, _values, result) + result = val.join(' ') + result + end +.,., + +# reduce 30 omitted + +# reduce 31 omitted + +# reduce 32 omitted + +module_eval(<<'.,.,', 'namae.y', 112) + def _reduce_33(val, _values, result) + result = val.join(' ') + result + end +.,., + +# reduce 34 omitted + +# reduce 35 omitted + +# reduce 36 omitted + +# reduce 37 omitted + +# reduce 38 omitted + +# reduce 39 omitted + +# reduce 40 omitted + +# reduce 41 omitted + +# reduce 42 omitted + +# reduce 43 omitted + +module_eval(<<'.,.,', 'namae.y', 122) + def _reduce_44(val, _values, result) + result = val.join(' ') + result + end +.,., + +# reduce 45 omitted + +# reduce 46 omitted + +# reduce 47 omitted + +module_eval(<<'.,.,', 'namae.y', 127) + def _reduce_48(val, _values, result) + result = val.join(' ') + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module Namae diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/nasl b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/nasl new file mode 100644 index 000000000000..9173795a1d84 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/nasl @@ -0,0 +1,2058 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + + +require 'nasl/parser/tree' + +require 'nasl/parser/argument' +require 'nasl/parser/array' +require 'nasl/parser/assigment' +require 'nasl/parser/block' +require 'nasl/parser/break' +require 'nasl/parser/call' +require 'nasl/parser/comment' +require 'nasl/parser/continue' +require 'nasl/parser/decrement' +require 'nasl/parser/empty' +require 'nasl/parser/export' +require 'nasl/parser/expression' +require 'nasl/parser/for' +require 'nasl/parser/foreach' +require 'nasl/parser/function' +require 'nasl/parser/global' +require 'nasl/parser/identifier' +require 'nasl/parser/if' +require 'nasl/parser/import' +require 'nasl/parser/include' +require 'nasl/parser/increment' +require 'nasl/parser/integer' +require 'nasl/parser/ip' +require 'nasl/parser/key_value_pair' +require 'nasl/parser/list' +require 'nasl/parser/local' +require 'nasl/parser/lvalue' +require 'nasl/parser/parameter' +require 'nasl/parser/reference' +require 'nasl/parser/repeat' +require 'nasl/parser/repetition' +require 'nasl/parser/return' +require 'nasl/parser/string' +require 'nasl/parser/undefined' +require 'nasl/parser/while' + +module Nasl + class Grammar < Racc::Parser + +module_eval(<<'...end nasl.y/module_eval...', 'nasl.y', 582) + +def n(cls, *args) + begin + Nasl.const_get(cls).new(@tree, *args) + rescue + puts "An exception occurred during the creation of a #{cls} instance." + puts + puts "The arguments passed to the constructor were:" + puts args + puts + puts @tok.last.context + puts + raise + end +end + +def c(*args) + n(:Comment, *args) + args[1] +end + +def on_error(type, value, stack) + raise ParseException, "The language's grammar does not permit #{value.name} to appear here", value.context +end + +def next_token + @tok = @tkz.get_token + + if @first && @tok.first == :COMMENT + n(:Comment, @tok.last) + @tok = @tkz.get_token + end + @first = false + + return @tok +end + +def parse(env, code, path) + @first = true + @tree = Tree.new(env) + @tkz = Tokenizer.new(code, path) + @tree.concat(do_parse) +end + +...end nasl.y/module_eval... +##### State transition tables begin ### + +clist = [ +'144,143,161,162,163,164,165,166,157,158,159,160,153,152,151,154,155', +'156,145,146,147,149,150,82,54,111,148,81,218,83,55,51,50,56,54,54,80', +'11,78,65,55,55,53,63,54,54,66,95,102,103,55,55,53,53,64,54,218,269,67', +'94,96,55,53,53,97,98,99,100,101,102,103,104,82,53,267,217,81,130,83', +'131,51,50,130,54,131,80,130,54,131,55,51,50,68,55,54,72,95,147,149,150', +'55,53,73,148,54,53,102,103,74,96,55,109,53,97,98,99,100,101,102,103', +'104,82,53,112,114,81,54,83,133,51,50,134,55,136,80,137,54,138,141,51', +'50,167,55,54,53,95,147,149,150,55,10,11,148,54,53,172,37,37,96,55,185', +'53,97,98,99,100,101,102,103,104,82,53,192,195,81,225,83,226,51,50,148', +'54,148,80,179,148,253,55,254,255,54,54,54,256,95,257,55,55,55,53,97', +'98,99,100,101,102,103,96,53,53,53,97,98,99,100,101,102,103,104,82,54', +'258,259,81,260,83,55,51,50,262,54,266,80,268,270,43,55,273,53,54,274', +'54,275,95,148,55,148,55,53,97,98,99,100,101,102,103,96,53,148,53,97', +'98,99,100,101,102,103,104,82,148,276,43,81,300,83,301,51,50,306,,,80', +'154,155,156,145,146,147,149,150,54,,95,148,,,55,,145,146,147,149,150', +',,96,148,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',145,146,147,149,150,,,54,148,95,,,,55,,,145,146,147,149,150,94,96,184', +'148,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,97,98', +'99,100,101,,,,54,,95,,,,55,97,98,99,100,101,,,,96,,,53,97,98,99,100', +'101,102,103,104,82,,,,81,,83,,51,50,,,,80,97,98,99,100,101,,,,54,,95', +',,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51', +'50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,94,96,,,53,97,98,99,100,101,102', +'103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,', +'53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54', +',95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83', +',51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102', +'103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,', +'53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54', +',95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83', +',51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102', +'103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,', +'53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54', +',95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83', +',51,50,,,,80,208,,,,,,,,54,,95,,,,55,,,,,,,,94,96,,,53,97,98,99,100', +'101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,', +',,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,', +',,,,,,54,,95,,,,55,,,,,,,,94,96,,,53,97,98,99,100,101,102,103,104,82', +',,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99', +'100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,', +',,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82', +',,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99', +'100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,', +',,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82', +',,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99', +'100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,', +',,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82', +',,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99', +'100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,', +',,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82', +',,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99', +'100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,', +',,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82', +',,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99', +'100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,', +',,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82', +',,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99', +'100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,', +',,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82', +',,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99', +'100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,', +',,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82', +',,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,,53,97,98,99', +'100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,', +',,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80', +',,,,,,,,54,,95,,,,55,,,,,,,,94,96,,,53,97,98,99,100,101,102,103,104', +'82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,94,96,,,53,97', +'98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,', +',,55,,,,,,,,94,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51', +'50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,94,96,,,53,97,98,99,100,101,102', +'103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,,96,,', +'53,97,98,99,100,101,102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54', +',95,,,,55,,,,,,,,,96,,,53,97,98,99,100,101,102,103,104,82,,,,81,,83', +',51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,94,96,,,53,97,98,99,100,101', +'102,103,104,82,,,,81,,83,,51,50,,,,80,,,,,,,,,54,,95,,,,55,,,,,,,,94', +'96,,,53,97,98,99,100,101,102,103,104,115,116,117,118,119,120,123,122', +'121,115,116,117,118,119,120,123,122,121,153,152,151,154,155,156,145', +'146,147,149,150,,,,148,,,,126,125,,,,124,,,,126,125,,,,124,144,143,161', +'162,163,164,165,166,157,158,159,160,153,152,151,154,155,156,145,146', +'147,149,150,,,,148,,,,,,,,142,144,143,161,162,163,164,165,166,157,158', +'159,160,153,152,151,154,155,156,145,146,147,149,150,,,,148,,,,,,,,221', +'144,143,161,162,163,164,165,166,157,158,159,160,153,152,151,154,155', +'156,145,146,147,149,150,,,,148,,,,,,,,289,144,143,161,162,163,164,165', +'166,157,158,159,160,153,152,151,154,155,156,145,146,147,149,150,,,,148', +',,,,,,,297,144,143,161,162,163,164,165,166,157,158,159,160,153,152,151', +'154,155,156,145,146,147,149,150,,,,148,,,,,,,251,144,143,161,162,163', +'164,165,166,157,158,159,160,153,152,151,154,155,156,145,146,147,149', +'150,,,,148,,,,,,,263,144,143,161,162,163,164,165,166,157,158,159,160', +'153,152,151,154,155,156,145,146,147,149,150,,,,148,,,,,,,265,144,143', +'161,162,163,164,165,166,157,158,159,160,153,152,151,154,155,156,145', +'146,147,149,150,,,,148,,,,,,,286,144,143,161,162,163,164,165,166,157', +'158,159,160,153,152,151,154,155,156,145,146,147,149,150,,,,148,51,50', +'4,10,11,,299,36,32,34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,51,50', +'4,10,11,,53,36,32,34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,51,50', +'105,,,,53,36,32,34,37,39,40,41,54,42,43,107,44,45,55,46,,47,,48,51,50', +'105,,,,53,36,32,34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,51,50,105', +',,,53,36,32,34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,51,50,105,', +',,53,36,32,34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,51,50,105,,', +',53,36,32,34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,51,50,105,,,', +'53,36,32,34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,51,50,105,,,,53', +'36,32,34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,51,50,105,,,,53,36', +'32,34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,51,50,105,,,,53,36,32', +'34,37,39,40,41,54,42,43,,44,45,55,46,,47,,48,,,,,,,53,144,143,161,162', +'163,164,165,166,157,158,159,160,153,152,151,154,155,156,145,146,147', +'149,150,,,,148,144,143,161,162,163,164,165,166,157,158,159,160,153,152', +'151,154,155,156,145,146,147,149,150,,,,148,144,143,161,162,163,164,165', +'166,157,158,159,160,153,152,151,154,155,156,145,146,147,149,150,,,,148', +'144,143,161,162,163,164,165,166,157,158,159,160,153,152,151,154,155', +'156,145,146,147,149,150,,,,148,144,143,161,162,163,164,165,166,157,158', +'159,160,153,152,151,154,155,156,145,146,147,149,150,,,,148,144,143,161', +'162,163,164,165,166,157,158,159,160,153,152,151,154,155,156,145,146', +'147,149,150,,,,148,144,143,161,162,163,164,165,166,157,158,159,160,153', +'152,151,154,155,156,145,146,147,149,150,,,,148,144,143,161,162,163,164', +'165,166,157,158,159,160,153,152,151,154,155,156,145,146,147,149,150', +',,,148,144,143,161,162,163,164,165,166,157,158,159,160,153,152,151,154', +'155,156,145,146,147,149,150,,,,148,144,143,161,162,163,164,165,166,157', +'158,159,160,153,152,151,154,155,156,145,146,147,149,150,,,,148,144,143', +'161,162,163,164,165,166,157,158,159,160,153,152,151,154,155,156,145', +'146,147,149,150,,,,148,144,143,161,162,163,164,165,166,157,158,159,160', +'153,152,151,154,155,156,145,146,147,149,150,,,,148,144,143,161,162,163', +'164,165,166,157,158,159,160,153,152,151,154,155,156,145,146,147,149', +'150,,,,148,144,143,161,162,163,164,165,166,157,158,159,160,153,152,151', +'154,155,156,145,146,147,149,150,,,,148,144,143,161,162,163,164,165,166', +'157,158,159,160,153,152,151,154,155,156,145,146,147,149,150,,,,148,144', +'143,161,162,163,164,165,166,157,158,159,160,153,152,151,154,155,156', +'145,146,147,149,150,,,,148,143,161,162,163,164,165,166,157,158,159,160', +'153,152,151,154,155,156,145,146,147,149,150,,,,148,161,162,163,164,165', +'166,157,158,159,160,153,152,151,154,155,156,145,146,147,149,150,,,,148', +'153,152,151,154,155,156,145,146,147,149,150,,,,148,153,152,151,154,155', +'156,145,146,147,149,150,,,,148,153,152,151,154,155,156,145,146,147,149', +'150,,,,148,153,152,151,154,155,156,145,146,147,149,150,,,,148,153,152', +'151,154,155,156,145,146,147,149,150,,,,148,153,152,151,154,155,156,145', +'146,147,149,150,,,,148,153,152,151,154,155,156,145,146,147,149,150,', +',,148,153,152,151,154,155,156,145,146,147,149,150,,,,148,153,152,151', +'154,155,156,145,146,147,149,150,,,,148,152,151,154,155,156,145,146,147', +'149,150,,,,148,151,154,155,156,145,146,147,149,150,,,,148' ] + racc_action_table = arr = ::Array.new(4010, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213', +'213,213,213,213,213,213,42,11,45,213,42,273,42,11,42,42,1,45,37,42,10', +'42,33,45,37,11,31,41,42,33,42,73,73,41,42,45,37,32,273,134,213,34,42', +'42,273,41,42,42,42,42,42,42,42,42,42,66,273,210,134,66,210,66,210,66', +'66,52,134,52,66,132,50,132,134,109,109,35,50,66,38,66,229,229,229,66', +'134,39,229,109,50,74,74,40,66,109,44,66,66,66,66,66,66,66,66,66,80,109', +'46,48,80,51,80,56,80,80,62,51,69,80,70,94,71,75,297,297,77,94,80,51', +'80,230,230,230,80,4,4,230,297,94,90,105,4,80,297,106,80,80,80,80,80', +'80,80,80,80,81,297,110,113,81,139,81,140,81,81,169,95,170,81,95,171', +'174,95,175,176,111,131,81,177,81,178,111,131,81,95,95,95,95,95,95,95', +'95,81,111,131,81,81,81,81,81,81,81,81,81,82,138,182,183,82,187,82,138', +'82,82,193,256,207,82,212,216,217,256,220,138,218,225,82,226,82,231,218', +'232,82,256,256,256,256,256,256,256,256,82,218,233,82,82,82,82,82,82', +'82,82,82,83,234,252,270,83,288,83,296,83,83,302,,,83,235,235,235,235', +'235,235,235,235,83,,83,235,,,83,,238,238,238,238,238,,,83,238,,83,83', +'83,83,83,83,83,83,83,96,,,,96,,96,,96,96,,,,96,,239,239,239,239,239', +',,96,239,96,,,,96,,,240,240,240,240,240,96,96,96,240,96,96,96,96,96', +'96,96,96,96,112,,,,112,,112,,112,112,,,,112,172,172,172,172,172,,,,112', +',112,,,,112,276,276,276,276,276,,,,112,,,112,112,112,112,112,112,112', +'112,112,114,,,,114,,114,,114,114,,,,114,301,301,301,301,301,,,,114,', +'114,,,,114,,,,,,,,,114,,,114,114,114,114,114,114,114,114,114,115,,,', +'115,,115,,115,115,,,,115,,,,,,,,,115,,115,,,,115,,,,,,,,115,115,,,115', +'115,115,115,115,115,115,115,115,116,,,,116,,116,,116,116,,,,116,,,,', +',,,,116,,116,,,,116,,,,,,,,,116,,,116,116,116,116,116,116,116,116,116', +'117,,,,117,,117,,117,117,,,,117,,,,,,,,,117,,117,,,,117,,,,,,,,,117', +',,117,117,117,117,117,117,117,117,117,118,,,,118,,118,,118,118,,,,118', +',,,,,,,,118,,118,,,,118,,,,,,,,,118,,,118,118,118,118,118,118,118,118', +'118,119,,,,119,,119,,119,119,,,,119,,,,,,,,,119,,119,,,,119,,,,,,,,', +'119,,,119,119,119,119,119,119,119,119,119,120,,,,120,,120,,120,120,', +',,120,,,,,,,,,120,,120,,,,120,,,,,,,,,120,,,120,120,120,120,120,120', +'120,120,120,121,,,,121,,121,,121,121,,,,121,,,,,,,,,121,,121,,,,121', +',,,,,,,,121,,,121,121,121,121,121,121,121,121,121,122,,,,122,,122,,122', +'122,,,,122,,,,,,,,,122,,122,,,,122,,,,,,,,,122,,,122,122,122,122,122', +'122,122,122,122,123,,,,123,,123,,123,123,,,,123,,,,,,,,,123,,123,,,', +'123,,,,,,,,,123,,,123,123,123,123,123,123,123,123,123,124,,,,124,,124', +',124,124,,,,124,124,,,,,,,,124,,124,,,,124,,,,,,,,124,124,,,124,124', +'124,124,124,124,124,124,124,130,,,,130,,130,,130,130,,,,130,,,,,,,,', +'130,,130,,,,130,,,,,,,,,130,,,130,130,130,130,130,130,130,130,130,137', +',,,137,,137,,137,137,,,,137,,,,,,,,,137,,137,,,,137,,,,,,,,137,137,', +',137,137,137,137,137,137,137,137,137,143,,,,143,,143,,143,143,,,,143', +',,,,,,,,143,,143,,,,143,,,,,,,,,143,,,143,143,143,143,143,143,143,143', +'143,144,,,,144,,144,,144,144,,,,144,,,,,,,,,144,,144,,,,144,,,,,,,,', +'144,,,144,144,144,144,144,144,144,144,144,145,,,,145,,145,,145,145,', +',,145,,,,,,,,,145,,145,,,,145,,,,,,,,,145,,,145,145,145,145,145,145', +'145,145,145,146,,,,146,,146,,146,146,,,,146,,,,,,,,,146,,146,,,,146', +',,,,,,,,146,,,146,146,146,146,146,146,146,146,146,147,,,,147,,147,,147', +'147,,,,147,,,,,,,,,147,,147,,,,147,,,,,,,,,147,,,147,147,147,147,147', +'147,147,147,147,148,,,,148,,148,,148,148,,,,148,,,,,,,,,148,,148,,,', +'148,,,,,,,,,148,,,148,148,148,148,148,148,148,148,148,149,,,,149,,149', +',149,149,,,,149,,,,,,,,,149,,149,,,,149,,,,,,,,,149,,,149,149,149,149', +'149,149,149,149,149,150,,,,150,,150,,150,150,,,,150,,,,,,,,,150,,150', +',,,150,,,,,,,,,150,,,150,150,150,150,150,150,150,150,150,151,,,,151', +',151,,151,151,,,,151,,,,,,,,,151,,151,,,,151,,,,,,,,,151,,,151,151,151', +'151,151,151,151,151,151,152,,,,152,,152,,152,152,,,,152,,,,,,,,,152', +',152,,,,152,,,,,,,,,152,,,152,152,152,152,152,152,152,152,152,153,,', +',153,,153,,153,153,,,,153,,,,,,,,,153,,153,,,,153,,,,,,,,,153,,,153', +'153,153,153,153,153,153,153,153,154,,,,154,,154,,154,154,,,,154,,,,', +',,,,154,,154,,,,154,,,,,,,,,154,,,154,154,154,154,154,154,154,154,154', +'155,,,,155,,155,,155,155,,,,155,,,,,,,,,155,,155,,,,155,,,,,,,,,155', +',,155,155,155,155,155,155,155,155,155,156,,,,156,,156,,156,156,,,,156', +',,,,,,,,156,,156,,,,156,,,,,,,,,156,,,156,156,156,156,156,156,156,156', +'156,157,,,,157,,157,,157,157,,,,157,,,,,,,,,157,,157,,,,157,,,,,,,,', +'157,,,157,157,157,157,157,157,157,157,157,158,,,,158,,158,,158,158,', +',,158,,,,,,,,,158,,158,,,,158,,,,,,,,,158,,,158,158,158,158,158,158', +'158,158,158,159,,,,159,,159,,159,159,,,,159,,,,,,,,,159,,159,,,,159', +',,,,,,,,159,,,159,159,159,159,159,159,159,159,159,160,,,,160,,160,,160', +'160,,,,160,,,,,,,,,160,,160,,,,160,,,,,,,,,160,,,160,160,160,160,160', +'160,160,160,160,161,,,,161,,161,,161,161,,,,161,,,,,,,,,161,,161,,,', +'161,,,,,,,,,161,,,161,161,161,161,161,161,161,161,161,162,,,,162,,162', +',162,162,,,,162,,,,,,,,,162,,162,,,,162,,,,,,,,,162,,,162,162,162,162', +'162,162,162,162,162,163,,,,163,,163,,163,163,,,,163,,,,,,,,,163,,163', +',,,163,,,,,,,,,163,,,163,163,163,163,163,163,163,163,163,164,,,,164', +',164,,164,164,,,,164,,,,,,,,,164,,164,,,,164,,,,,,,,,164,,,164,164,164', +'164,164,164,164,164,164,165,,,,165,,165,,165,165,,,,165,,,,,,,,,165', +',165,,,,165,,,,,,,,,165,,,165,165,165,165,165,165,165,165,165,166,,', +',166,,166,,166,166,,,,166,,,,,,,,,166,,166,,,,166,,,,,,,,,166,,,166', +'166,166,166,166,166,166,166,166,192,,,,192,,192,,192,192,,,,192,,,,', +',,,,192,,192,,,,192,,,,,,,,,192,,,192,192,192,192,192,192,192,192,192', +'195,,,,195,,195,,195,195,,,,195,,,,,,,,,195,,195,,,,195,,,,,,,,,195', +',,195,195,195,195,195,195,195,195,195,253,,,,253,,253,,253,253,,,,253', +',,,,,,,,253,,253,,,,253,,,,,,,,253,253,,,253,253,253,253,253,253,253', +'253,253,254,,,,254,,254,,254,254,,,,254,,,,,,,,,254,,254,,,,254,,,,', +',,,254,254,,,254,254,254,254,254,254,254,254,254,255,,,,255,,255,,255', +'255,,,,255,,,,,,,,,255,,255,,,,255,,,,,,,,255,255,,,255,255,255,255', +'255,255,255,255,255,258,,,,258,,258,,258,258,,,,258,,,,,,,,,258,,258', +',,,258,,,,,,,,258,258,,,258,258,258,258,258,258,258,258,258,260,,,,260', +',260,,260,260,,,,260,,,,,,,,,260,,260,,,,260,,,,,,,,,260,,,260,260,260', +'260,260,260,260,260,260,262,,,,262,,262,,262,262,,,,262,,,,,,,,,262', +',262,,,,262,,,,,,,,,262,,,262,262,262,262,262,262,262,262,262,267,,', +',267,,267,,267,267,,,,267,,,,,,,,,267,,267,,,,267,,,,,,,,267,267,,,267', +'267,267,267,267,267,267,267,267,268,,,,268,,268,,268,268,,,,268,,,,', +',,,,268,,268,,,,268,,,,,,,,268,268,,,268,268,268,268,268,268,268,268', +'268,49,49,49,49,49,49,49,49,49,79,79,79,79,79,79,79,79,79,241,241,241', +'241,241,241,241,241,241,241,241,,,,241,,,,49,49,,,,49,,,,79,79,,,,79', +'76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76', +',,,76,,,,,,,,76,135,135,135,135,135,135,135,135,135,135,135,135,135', +'135,135,135,135,135,135,135,135,135,135,,,,135,,,,,,,,135,264,264,264', +'264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264,264', +'264,264,264,,,,264,,,,,,,,264,285,285,285,285,285,285,285,285,285,285', +'285,285,285,285,285,285,285,285,285,285,285,285,285,,,,285,,,,,,,,285', +'168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168', +'168,168,168,168,168,168,,,,168,,,,,,,168,194,194,194,194,194,194,194', +'194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,194,,,,194', +',,,,,,194,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196', +'196,196,196,196,196,196,196,196,,,,196,,,,,,,196,261,261,261,261,261', +'261,261,261,261,261,261,261,261,261,261,261,261,261,261,261,261,261', +'261,,,,261,,,,,,,261,287,287,287,287,287,287,287,287,287,287,287,287', +'287,287,287,287,287,287,287,287,287,287,287,,,,287,0,0,0,0,0,,287,0', +'0,0,0,0,0,0,0,0,0,,0,0,0,0,,0,,0,3,3,3,3,3,,0,3,3,3,3,3,3,3,3,3,3,,3', +'3,3,3,,3,,3,43,43,43,,,,3,43,43,43,43,43,43,43,43,43,43,43,43,43,43', +'43,,43,,43,47,47,47,,,,43,47,47,47,47,47,47,47,47,47,47,,47,47,47,47', +',47,,47,108,108,108,,,,47,108,108,108,108,108,108,108,108,108,108,,108', +'108,108,108,,108,,108,263,263,263,,,,108,263,263,263,263,263,263,263', +'263,263,263,,263,263,263,263,,263,,263,265,265,265,,,,263,265,265,265', +'265,265,265,265,265,265,265,,265,265,265,265,,265,,265,286,286,286,', +',,265,286,286,286,286,286,286,286,286,286,286,,286,286,286,286,,286', +',286,299,299,299,,,,286,299,299,299,299,299,299,299,299,299,299,,299', +'299,299,299,,299,,299,300,300,300,,,,299,300,300,300,300,300,300,300', +'300,300,300,,300,300,300,300,,300,,300,306,306,306,,,,300,306,306,306', +'306,306,306,306,306,306,306,,306,306,306,306,,306,,306,,,,,,,306,180', +'180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180', +'180,180,180,180,180,,,,180,197,197,197,197,197,197,197,197,197,197,197', +'197,197,197,197,197,197,197,197,197,197,197,197,,,,197,199,199,199,199', +'199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199', +'199,199,,,,199,200,200,200,200,200,200,200,200,200,200,200,200,200,200', +'200,200,200,200,200,200,200,200,200,,,,200,201,201,201,201,201,201,201', +'201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,,,,201', +'202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202', +'202,202,202,202,202,202,,,,202,203,203,203,203,203,203,203,203,203,203', +'203,203,203,203,203,203,203,203,203,203,203,203,203,,,,203,204,204,204', +'204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204', +'204,204,204,,,,204,205,205,205,205,205,205,205,205,205,205,205,205,205', +'205,205,205,205,205,205,205,205,205,205,,,,205,206,206,206,206,206,206', +'206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206', +',,,206,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209', +'209,209,209,209,209,209,209,,,,209,222,222,222,222,222,222,222,222,222', +'222,222,222,222,222,222,222,222,222,222,222,222,222,222,,,,222,277,277', +'277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277', +'277,277,277,277,,,,277,279,279,279,279,279,279,279,279,279,279,279,279', +'279,279,279,279,279,279,279,279,279,279,279,,,,279,281,281,281,281,281', +'281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281', +'281,,,,281,291,291,291,291,291,291,291,291,291,291,291,291,291,291,291', +'291,291,291,291,291,291,291,291,,,,291,228,228,228,228,228,228,228,228', +'228,228,228,228,228,228,228,228,228,228,228,228,228,228,,,,228,227,227', +'227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227', +'227,227,,,,227,242,242,242,242,242,242,242,242,242,242,242,,,,242,243', +'243,243,243,243,243,243,243,243,243,243,,,,243,244,244,244,244,244,244', +'244,244,244,244,244,,,,244,245,245,245,245,245,245,245,245,245,245,245', +',,,245,246,246,246,246,246,246,246,246,246,246,246,,,,246,247,247,247', +'247,247,247,247,247,247,247,247,,,,247,248,248,248,248,248,248,248,248', +'248,248,248,,,,248,249,249,249,249,249,249,249,249,249,249,249,,,,249', +'250,250,250,250,250,250,250,250,250,250,250,,,,250,237,237,237,237,237', +'237,237,237,237,237,,,,237,236,236,236,236,236,236,236,236,236,,,,236' ] + racc_action_check = arr = ::Array.new(4010, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 3034, 33, nil, 3060, 109, nil, nil, nil, nil, nil, + -5, -28, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, -2, 9, -6, 13, 47, nil, -17, 50, 59, + 65, -8, -7, 3086, 68, -18, 80, 3112, 81, 2716, + 35, 74, 15, nil, nil, nil, 128, nil, nil, nil, + nil, nil, 88, nil, nil, nil, 42, nil, nil, 88, + 133, 72, nil, -28, 30, 93, 2758, 96, nil, 2725, + 91, 140, 189, 238, nil, nil, nil, nil, nil, nil, + 86, nil, nil, nil, 84, 129, 287, nil, nil, nil, + nil, nil, nil, nil, nil, 108, 105, nil, 3138, 52, + 129, 138, 336, 111, 385, 434, 483, 532, 581, 630, + 679, 728, 777, 826, 875, nil, nil, nil, nil, nil, + 924, 139, 19, nil, 31, 2793, nil, 973, 168, 131, + 133, nil, nil, 1022, 1071, 1120, 1169, 1218, 1267, 1316, + 1365, 1414, 1463, 1512, 1561, 1610, 1659, 1708, 1757, 1806, + 1855, 1904, 1953, 2002, 2051, 2100, 2149, nil, 2898, 143, + 145, 148, 309, nil, 122, 124, 125, 128, 140, nil, + 3354, nil, 156, 154, nil, nil, nil, 179, nil, nil, + nil, nil, 2198, 171, 2932, 2247, 2966, 3381, nil, 3408, + 3435, 3462, 3489, 3516, 3543, 3570, 3597, 187, nil, 3624, + 10, nil, 168, -11, nil, nil, 190, 181, 187, nil, + 172, nil, 3651, nil, nil, 195, 197, 3810, 3785, 66, + 115, 207, 209, 221, 232, 256, 3972, 3959, 269, 303, + 319, 2713, 3825, 3840, 3855, 3870, 3885, 3900, 3915, 3930, + 3945, nil, 201, 2296, 2345, 2394, 178, nil, 2443, nil, + 2492, 3000, 2541, 3164, 2828, 3190, nil, 2590, 2639, nil, + 217, nil, nil, 3, nil, nil, 324, 3678, nil, 3705, + nil, 3732, nil, nil, nil, 2863, 3216, 3034, 213, nil, + nil, 3759, nil, nil, nil, nil, 206, 101, nil, 3242, + 3268, 358, 234, nil, nil, nil, 3294, nil ] + +racc_action_default = [ + -2, -172, -1, -4, -172, -6, -8, -9, -10, -11, + -172, -172, -15, -16, -17, -18, -19, -20, -22, -23, + -24, -25, -26, -27, -28, -29, -30, -31, -32, -33, + -34, -172, -172, -172, -172, -172, -40, -172, -172, -172, + -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, + -172, -172, -128, -160, -161, -162, -172, -3, -5, -7, + -21, -12, -172, -35, -36, -37, -172, -38, -39, -172, + -157, -159, -42, -172, -172, -172, -172, -172, -49, -108, + -172, -172, -172, -172, -93, -94, -105, -106, -107, -109, + -110, -111, -112, -113, -172, -172, -172, -163, -164, -165, + -166, -167, -169, -170, -171, -172, -172, -51, -154, -138, + -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, + -172, -172, -172, -172, -172, -72, -74, -71, -73, -127, + -172, -172, -142, 308, -172, -172, -41, -172, -172, -172, + -172, -45, -47, -172, -172, -172, -172, -172, -172, -172, + -172, -172, -172, -172, -172, -172, -172, -172, -172, -172, + -172, -172, -172, -172, -172, -172, -172, -48, -172, -77, + -81, -82, -172, -129, -172, -172, -172, -126, -172, -133, + -143, -144, -146, -172, -148, -50, -153, -172, -134, -135, + -136, -137, -172, -172, -172, -172, -172, -59, -60, -61, + -62, -63, -64, -65, -66, -67, -68, -172, -70, -116, + -128, -117, -131, -172, -140, -141, -172, -172, -172, -150, + -152, -46, -155, -156, -158, -172, -172, -76, -78, -79, + -80, -83, -84, -85, -86, -87, -88, -89, -90, -91, + -92, -95, -96, -97, -98, -99, -100, -101, -102, -103, + -104, -75, -172, -172, -172, -172, -125, -132, -172, -147, + -172, -172, -172, -172, -172, -172, -69, -172, -172, -139, + -172, -14, -149, -172, -43, -44, -172, -118, -121, -119, + -122, -120, -123, -124, -145, -172, -172, -172, -55, -57, + -58, -114, -115, -130, -13, -151, -172, -138, -53, -172, + -172, -172, -172, -54, -56, -168, -172, -52 ] + +racc_goto_table = [ + 31, 187, 62, 31, 175, 33, 77, 183, 33, 178, + 35, 139, 140, 35, 207, 38, 216, 106, 38, 60, + 69, 1, 271, 59, 75, 58, 215, 49, 70, 61, + 49, 108, 70, 174, 2, 113, 110, 57, nil, nil, + nil, nil, nil, 31, nil, nil, nil, 31, 33, nil, + nil, nil, 33, 35, nil, nil, nil, 35, 38, nil, + nil, nil, 38, nil, nil, nil, nil, nil, nil, nil, + 49, nil, nil, nil, 49, 294, nil, 127, 128, 198, + nil, 252, 186, nil, nil, 173, 176, nil, 211, nil, + nil, nil, nil, nil, nil, nil, 108, nil, nil, nil, + nil, 223, 193, nil, nil, nil, nil, nil, 31, 188, + nil, nil, nil, 33, 189, 210, nil, nil, 35, 190, + 60, 224, 214, 38, 191, 219, nil, nil, nil, 70, + nil, nil, nil, nil, nil, 49, 49, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 295, nil, nil, 293, nil, + nil, nil, nil, nil, nil, 175, nil, nil, nil, 284, + 283, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 296, nil, nil, nil, 302, + nil, nil, nil, nil, 174, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 272, + 305, nil, nil, nil, nil, nil, nil, 278, 280, 282, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 292, 211, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 176, nil, nil, + nil, 288, nil, 290, nil, nil, nil, nil, nil, 210, + nil, nil, nil, 31, 219, 31, nil, nil, 33, nil, + 33, nil, nil, 35, 298, 35, nil, nil, 38, 76, + 38, nil, nil, nil, nil, nil, 31, 303, 304, nil, + 49, 33, 49, nil, 307, nil, 35, 188, nil, 31, + 31, 38, 189, 135, 33, 33, 31, 190, nil, 35, + 35, 33, 191, 49, 38, 38, 35, 168, 169, 170, + 171, 38, nil, nil, 49, nil, 49, 49, nil, nil, + nil, nil, nil, 49, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 194, + nil, 196, 197, 199, 200, 201, 202, 203, 204, 205, + 206, 209, nil, nil, nil, nil, nil, 213, nil, nil, + nil, nil, nil, nil, 222, nil, nil, nil, nil, nil, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 261, + nil, nil, 264, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 277, 279, 281, nil, nil, nil, nil, 285, nil, 287, + nil, nil, nil, nil, 291, 209 ] + +racc_goto_check = [ + 30, 39, 9, 30, 43, 31, 37, 53, 31, 49, + 32, 35, 35, 32, 41, 34, 10, 38, 34, 18, + 33, 1, 11, 5, 33, 4, 50, 40, 9, 5, + 40, 6, 9, 35, 2, 6, 9, 2, nil, nil, + nil, nil, nil, 30, nil, nil, nil, 30, 31, nil, + nil, nil, 31, 32, nil, nil, nil, 32, 34, nil, + nil, nil, 34, nil, nil, nil, nil, nil, nil, nil, + 40, nil, nil, nil, 40, 11, nil, 40, 40, 37, + nil, 43, 38, nil, nil, 9, 9, nil, 37, nil, + nil, nil, nil, nil, nil, nil, 6, nil, nil, nil, + nil, 37, 9, nil, nil, nil, nil, nil, 30, 30, + nil, nil, nil, 31, 31, 9, nil, nil, 32, 32, + 18, 33, 9, 34, 34, 9, nil, nil, nil, 9, + nil, nil, nil, nil, nil, 40, 40, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 10, nil, nil, 41, nil, + nil, nil, nil, nil, nil, 43, nil, nil, nil, 53, + 49, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 43, nil, nil, nil, 39, + nil, nil, nil, nil, 35, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 9, + 43, nil, nil, nil, nil, nil, nil, 37, 37, 37, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 37, 37, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 9, nil, nil, + nil, 6, nil, 6, nil, nil, nil, nil, nil, 9, + nil, nil, nil, 30, 9, 30, nil, nil, 31, nil, + 31, nil, nil, 32, 6, 32, nil, nil, 34, 36, + 34, nil, nil, nil, nil, nil, 30, 6, 6, nil, + 40, 31, 40, nil, 6, nil, 32, 30, nil, 30, + 30, 34, 31, 36, 31, 31, 30, 32, nil, 32, + 32, 31, 34, 40, 34, 34, 32, 36, 36, 36, + 36, 34, nil, nil, 40, nil, 40, 40, nil, nil, + nil, nil, nil, 40, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 36, + nil, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, nil, nil, nil, nil, nil, 36, nil, nil, + nil, nil, nil, nil, 36, nil, nil, nil, nil, nil, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 36, + nil, nil, 36, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 36, 36, 36, nil, nil, nil, nil, 36, nil, 36, + nil, nil, nil, nil, 36, 36 ] + +racc_goto_pointer = [ + nil, 21, 34, nil, 21, 19, -12, nil, nil, -9, + -118, -195, nil, nil, nil, nil, nil, nil, 15, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 0, 5, 10, -17, 15, -62, 237, -36, -26, -108, + 27, -110, nil, -91, nil, nil, nil, nil, nil, -86, + -106, nil, nil, -89, nil, nil ] + +racc_goto_default = [ + nil, nil, nil, 3, 5, 6, 7, 8, 9, 52, + nil, 25, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, + 86, 88, 85, nil, 84, 87, 180, 181, nil, nil, + 79, nil, 89, 90, 91, 92, 93, 212, 177, nil, + 129, 132, 182, nil, 220, 71 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 80, :_reduce_1, + 0, 80, :_reduce_2, + 2, 81, :_reduce_3, + 1, 81, :_reduce_4, + 2, 82, :_reduce_5, + 1, 82, :_reduce_6, + 2, 82, :_reduce_7, + 1, 82, :_reduce_8, + 1, 82, :_reduce_9, + 1, 85, :_reduce_10, + 1, 85, :_reduce_11, + 2, 83, :_reduce_12, + 6, 84, :_reduce_13, + 5, 84, :_reduce_14, + 1, 86, :_reduce_15, + 1, 86, :_reduce_16, + 1, 86, :_reduce_17, + 1, 86, :_reduce_18, + 1, 86, :_reduce_19, + 1, 86, :_reduce_20, + 2, 86, :_reduce_21, + 1, 86, :_reduce_22, + 1, 86, :_reduce_23, + 1, 86, :_reduce_24, + 1, 86, :_reduce_25, + 1, 86, :_reduce_26, + 1, 86, :_reduce_27, + 1, 86, :_reduce_28, + 1, 87, :_reduce_29, + 1, 87, :_reduce_30, + 1, 87, :_reduce_31, + 1, 87, :_reduce_32, + 1, 87, :_reduce_33, + 1, 87, :_reduce_34, + 2, 91, :_reduce_35, + 2, 92, :_reduce_36, + 2, 93, :_reduce_37, + 2, 94, :_reduce_38, + 2, 95, :_reduce_39, + 1, 96, :_reduce_40, + 3, 97, :_reduce_41, + 2, 100, :_reduce_42, + 5, 98, :_reduce_43, + 5, 99, :_reduce_44, + 3, 101, :_reduce_45, + 4, 102, :_reduce_46, + 3, 103, :_reduce_47, + 3, 103, :_reduce_48, + 2, 103, :_reduce_49, + 3, 90, :_reduce_50, + 2, 90, :_reduce_51, + 9, 104, :_reduce_52, + 6, 105, :_reduce_53, + 7, 105, :_reduce_54, + 5, 106, :_reduce_55, + 7, 106, :_reduce_56, + 5, 107, :_reduce_57, + 5, 108, :_reduce_58, + 3, 109, :_reduce_59, + 3, 109, :_reduce_60, + 3, 109, :_reduce_61, + 3, 109, :_reduce_62, + 3, 109, :_reduce_63, + 3, 109, :_reduce_64, + 3, 109, :_reduce_65, + 3, 109, :_reduce_66, + 3, 109, :_reduce_67, + 3, 109, :_reduce_68, + 4, 110, :_reduce_69, + 3, 110, :_reduce_70, + 2, 111, :_reduce_71, + 2, 111, :_reduce_72, + 2, 113, :_reduce_73, + 2, 113, :_reduce_74, + 3, 115, :_reduce_75, + 3, 115, :_reduce_76, + 2, 115, :_reduce_77, + 3, 115, :_reduce_78, + 3, 115, :_reduce_79, + 3, 115, :_reduce_80, + 2, 115, :_reduce_81, + 2, 115, :_reduce_82, + 3, 115, :_reduce_83, + 3, 115, :_reduce_84, + 3, 115, :_reduce_85, + 3, 115, :_reduce_86, + 3, 115, :_reduce_87, + 3, 115, :_reduce_88, + 3, 115, :_reduce_89, + 3, 115, :_reduce_90, + 3, 115, :_reduce_91, + 3, 115, :_reduce_92, + 1, 115, :_reduce_93, + 1, 115, :_reduce_94, + 3, 115, :_reduce_95, + 3, 115, :_reduce_96, + 3, 115, :_reduce_97, + 3, 115, :_reduce_98, + 3, 115, :_reduce_99, + 3, 115, :_reduce_100, + 3, 115, :_reduce_101, + 3, 115, :_reduce_102, + 3, 115, :_reduce_103, + 3, 115, :_reduce_104, + 1, 115, :_reduce_105, + 1, 115, :_reduce_106, + 1, 115, :_reduce_107, + 1, 115, :_reduce_108, + 1, 115, :_reduce_109, + 1, 115, :_reduce_110, + 1, 115, :_reduce_111, + 1, 115, :_reduce_112, + 1, 115, :_reduce_113, + 3, 126, :_reduce_114, + 3, 126, :_reduce_115, + 1, 126, :_reduce_116, + 1, 126, :_reduce_117, + 3, 127, :_reduce_118, + 3, 127, :_reduce_119, + 3, 127, :_reduce_120, + 3, 127, :_reduce_121, + 3, 127, :_reduce_122, + 3, 127, :_reduce_123, + 3, 128, :_reduce_124, + 2, 128, :_reduce_125, + 1, 128, :_reduce_126, + 2, 119, :_reduce_127, + 1, 119, :_reduce_128, + 2, 116, :_reduce_129, + 3, 120, :_reduce_130, + 1, 120, :_reduce_131, + 3, 125, :_reduce_132, + 2, 125, :_reduce_133, + 1, 118, :_reduce_134, + 1, 118, :_reduce_135, + 1, 118, :_reduce_136, + 1, 118, :_reduce_137, + 0, 118, :_reduce_138, + 3, 130, :_reduce_139, + 2, 130, :_reduce_140, + 2, 129, :_reduce_141, + 1, 129, :_reduce_142, + 1, 131, :_reduce_143, + 1, 131, :_reduce_144, + 3, 132, :_reduce_145, + 1, 132, :_reduce_146, + 3, 124, :_reduce_147, + 2, 124, :_reduce_148, + 2, 133, :_reduce_149, + 1, 133, :_reduce_150, + 3, 89, :_reduce_151, + 1, 89, :_reduce_152, + 2, 117, :_reduce_153, + 1, 117, :_reduce_154, + 3, 134, :_reduce_155, + 3, 134, :_reduce_156, + 1, 134, :_reduce_157, + 3, 112, :_reduce_158, + 1, 112, :_reduce_159, + 1, 88, :_reduce_160, + 1, 88, :_reduce_161, + 1, 88, :_reduce_162, + 1, 122, :_reduce_163, + 1, 122, :_reduce_164, + 1, 122, :_reduce_165, + 1, 122, :_reduce_166, + 1, 122, :_reduce_167, + 7, 121, :_reduce_168, + 1, 114, :_reduce_169, + 1, 114, :_reduce_170, + 1, 123, :_reduce_171 ] + +racc_reduce_n = 172 + +racc_shift_n = 308 + +racc_token_table = { + false => 0, + :error => 1, + :ASS_EQ => 2, + :ADD_EQ => 3, + :SUB_EQ => 4, + :MUL_EQ => 5, + :DIV_EQ => 6, + :MOD_EQ => 7, + :SLL_EQ => 8, + :SRA_EQ => 9, + :SRL_EQ => 10, + :OR => 11, + :AND => 12, + :CMP_LT => 13, + :CMP_GT => 14, + :CMP_EQ => 15, + :CMP_NE => 16, + :CMP_GE => 17, + :CMP_LE => 18, + :SUBSTR_EQ => 19, + :SUBSTR_NE => 20, + :REGEX_EQ => 21, + :REGEX_NE => 22, + :BIT_OR => 23, + :BIT_XOR => 24, + :AMPERSAND => 25, + :BIT_SRA => 26, + :BIT_SRL => 27, + :BIT_SLL => 28, + :ADD => 29, + :SUB => 30, + :MUL => 31, + :DIV => 32, + :MOD => 33, + :NOT => 34, + :UMINUS => 35, + :BIT_NOT => 36, + :EXP => 37, + :INCR => 38, + :DECR => 39, + :COMMENT => 40, + :EXPORT => 41, + :FUNCTION => 42, + :LPAREN => 43, + :RPAREN => 44, + :SEMICOLON => 45, + :BREAK => 46, + :CONTINUE => 47, + :GLOBAL => 48, + :IMPORT => 49, + :INCLUDE => 50, + :LOCAL => 51, + :REP => 52, + :RETURN => 53, + :LBRACE => 54, + :RBRACE => 55, + :FOR => 56, + :FOREACH => 57, + :IN => 58, + :IF => 59, + :ELSE => 60, + :REPEAT => 61, + :UNTIL => 62, + :WHILE => 63, + :COLON => 64, + :COMMA => 65, + :AT_SIGN => 66, + :LBRACK => 67, + :RBRACK => 68, + :PERIOD => 69, + :IDENT => 70, + :INT_DEC => 71, + :INT_HEX => 72, + :INT_OCT => 73, + :FALSE => 74, + :TRUE => 75, + :DATA => 76, + :STRING => 77, + :UNDEF => 78 } + +racc_nt_base = 79 + +racc_use_result_var = false + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "ASS_EQ", + "ADD_EQ", + "SUB_EQ", + "MUL_EQ", + "DIV_EQ", + "MOD_EQ", + "SLL_EQ", + "SRA_EQ", + "SRL_EQ", + "OR", + "AND", + "CMP_LT", + "CMP_GT", + "CMP_EQ", + "CMP_NE", + "CMP_GE", + "CMP_LE", + "SUBSTR_EQ", + "SUBSTR_NE", + "REGEX_EQ", + "REGEX_NE", + "BIT_OR", + "BIT_XOR", + "AMPERSAND", + "BIT_SRA", + "BIT_SRL", + "BIT_SLL", + "ADD", + "SUB", + "MUL", + "DIV", + "MOD", + "NOT", + "UMINUS", + "BIT_NOT", + "EXP", + "INCR", + "DECR", + "COMMENT", + "EXPORT", + "FUNCTION", + "LPAREN", + "RPAREN", + "SEMICOLON", + "BREAK", + "CONTINUE", + "GLOBAL", + "IMPORT", + "INCLUDE", + "LOCAL", + "REP", + "RETURN", + "LBRACE", + "RBRACE", + "FOR", + "FOREACH", + "IN", + "IF", + "ELSE", + "REPEAT", + "UNTIL", + "WHILE", + "COLON", + "COMMA", + "AT_SIGN", + "LBRACK", + "RBRACK", + "PERIOD", + "IDENT", + "INT_DEC", + "INT_HEX", + "INT_OCT", + "FALSE", + "TRUE", + "DATA", + "STRING", + "UNDEF", + "$start", + "start", + "roots", + "root", + "export", + "function", + "statement", + "simple", + "compound", + "ident", + "params", + "block", + "assign", + "break", + "call", + "continue", + "decr", + "empty", + "global", + "import", + "include", + "incr", + "local", + "rep", + "return", + "for", + "foreach", + "if", + "repeat", + "while", + "assign_exp", + "call_exp", + "decr_exp", + "var_decls", + "incr_exp", + "string", + "expr", + "ref", + "statements", + "field", + "lval", + "args", + "ip", + "int", + "undef", + "list_expr", + "array_expr", + "arg", + "kv_pair", + "kv_pairs", + "indexes", + "index", + "list_elem", + "list_elems", + "param", + "var_decl" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'nasl.y', 61) + def _reduce_1(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 63) + def _reduce_2(val, _values) + [] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 67) + def _reduce_3(val, _values) + [val[0]] + val[1] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 69) + def _reduce_4(val, _values) + [val[0]] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 73) + def _reduce_5(val, _values) + c(*val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 75) + def _reduce_6(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 77) + def _reduce_7(val, _values) + c(*val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 79) + def _reduce_8(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 81) + def _reduce_9(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 85) + def _reduce_10(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 87) + def _reduce_11(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 95) + def _reduce_12(val, _values) + n(:Export, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 99) + def _reduce_13(val, _values) + n(:Function, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 101) + def _reduce_14(val, _values) + n(:Function, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 105) + def _reduce_15(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 107) + def _reduce_16(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 109) + def _reduce_17(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 111) + def _reduce_18(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 113) + def _reduce_19(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 115) + def _reduce_20(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 117) + def _reduce_21(val, _values) + c(*val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 119) + def _reduce_22(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 121) + def _reduce_23(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 123) + def _reduce_24(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 125) + def _reduce_25(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 127) + def _reduce_26(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 129) + def _reduce_27(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 131) + def _reduce_28(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 135) + def _reduce_29(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 137) + def _reduce_30(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 139) + def _reduce_31(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 141) + def _reduce_32(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 143) + def _reduce_33(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 145) + def _reduce_34(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 153) + def _reduce_35(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 157) + def _reduce_36(val, _values) + n(:Break, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 161) + def _reduce_37(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 165) + def _reduce_38(val, _values) + n(:Continue, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 169) + def _reduce_39(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 173) + def _reduce_40(val, _values) + n(:Empty, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 177) + def _reduce_41(val, _values) + n(:Global, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 181) + def _reduce_42(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 185) + def _reduce_43(val, _values) + n(:Import, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 189) + def _reduce_44(val, _values) + n(:Include, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 193) + def _reduce_45(val, _values) + n(:Local, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 197) + def _reduce_46(val, _values) + n(:Repetition, *val[0..-1]) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 201) + def _reduce_47(val, _values) + n(:Return, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 203) + def _reduce_48(val, _values) + n(:Return, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 205) + def _reduce_49(val, _values) + n(:Return, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 213) + def _reduce_50(val, _values) + n(:Block, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 215) + def _reduce_51(val, _values) + n(:Block, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 219) + def _reduce_52(val, _values) + n(:For, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 223) + def _reduce_53(val, _values) + n(:Foreach, val[0], val[1], val[3], val[5]) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 225) + def _reduce_54(val, _values) + n(:Foreach, val[0], val[2], val[4], val[6]) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 229) + def _reduce_55(val, _values) + n(:If, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 231) + def _reduce_56(val, _values) + n(:If, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 235) + def _reduce_57(val, _values) + n(:Repeat, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 239) + def _reduce_58(val, _values) + n(:While, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 247) + def _reduce_59(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 249) + def _reduce_60(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 251) + def _reduce_61(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 253) + def _reduce_62(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 255) + def _reduce_63(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 257) + def _reduce_64(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 259) + def _reduce_65(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 261) + def _reduce_66(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 263) + def _reduce_67(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 265) + def _reduce_68(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 269) + def _reduce_69(val, _values) + n(:Call, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 271) + def _reduce_70(val, _values) + n(:Call, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 275) + def _reduce_71(val, _values) + n(:Decrement, val[0]) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 277) + def _reduce_72(val, _values) + n(:Decrement, val[0]) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 281) + def _reduce_73(val, _values) + n(:Increment, val[0]) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 283) + def _reduce_74(val, _values) + n(:Increment, val[0]) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 287) + def _reduce_75(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 289) + def _reduce_76(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 291) + def _reduce_77(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 293) + def _reduce_78(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 295) + def _reduce_79(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 297) + def _reduce_80(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 299) + def _reduce_81(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 301) + def _reduce_82(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 303) + def _reduce_83(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 305) + def _reduce_84(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 307) + def _reduce_85(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 309) + def _reduce_86(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 311) + def _reduce_87(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 313) + def _reduce_88(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 315) + def _reduce_89(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 317) + def _reduce_90(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 319) + def _reduce_91(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 321) + def _reduce_92(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 323) + def _reduce_93(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 325) + def _reduce_94(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 327) + def _reduce_95(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 329) + def _reduce_96(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 331) + def _reduce_97(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 333) + def _reduce_98(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 335) + def _reduce_99(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 337) + def _reduce_100(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 339) + def _reduce_101(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 341) + def _reduce_102(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 343) + def _reduce_103(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 345) + def _reduce_104(val, _values) + n(:Expression, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 347) + def _reduce_105(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 349) + def _reduce_106(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 351) + def _reduce_107(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 353) + def _reduce_108(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 355) + def _reduce_109(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 357) + def _reduce_110(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 359) + def _reduce_111(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 361) + def _reduce_112(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 363) + def _reduce_113(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 371) + def _reduce_114(val, _values) + n(:Argument, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 373) + def _reduce_115(val, _values) + n(:Argument, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 375) + def _reduce_116(val, _values) + n(:Argument, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 377) + def _reduce_117(val, _values) + n(:Argument, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 381) + def _reduce_118(val, _values) + n(:KeyValuePair, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 383) + def _reduce_119(val, _values) + n(:KeyValuePair, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 385) + def _reduce_120(val, _values) + n(:KeyValuePair, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 387) + def _reduce_121(val, _values) + n(:KeyValuePair, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 389) + def _reduce_122(val, _values) + n(:KeyValuePair, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 391) + def _reduce_123(val, _values) + n(:KeyValuePair, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 395) + def _reduce_124(val, _values) + [val[0]] + val[2] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 397) + def _reduce_125(val, _values) + [val[0]] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 399) + def _reduce_126(val, _values) + [val[0]] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 403) + def _reduce_127(val, _values) + n(:Lvalue, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 405) + def _reduce_128(val, _values) + n(:Lvalue, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 409) + def _reduce_129(val, _values) + n(:Reference, val[1]) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 417) + def _reduce_130(val, _values) + [val[0]] + val[2] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 419) + def _reduce_131(val, _values) + [val[0]] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 423) + def _reduce_132(val, _values) + n(:Array, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 425) + def _reduce_133(val, _values) + n(:Array, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 429) + def _reduce_134(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 431) + def _reduce_135(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 433) + def _reduce_136(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 435) + def _reduce_137(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 437) + def _reduce_138(val, _values) + nil + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 441) + def _reduce_139(val, _values) + val[1] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 443) + def _reduce_140(val, _values) + val[1] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 447) + def _reduce_141(val, _values) + [val[0]] + val[1] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 449) + def _reduce_142(val, _values) + [val[0]] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 453) + def _reduce_143(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 455) + def _reduce_144(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 459) + def _reduce_145(val, _values) + [val[0]] + val[2] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 461) + def _reduce_146(val, _values) + [val[0]] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 465) + def _reduce_147(val, _values) + n(:List, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 467) + def _reduce_148(val, _values) + n(:List, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 471) + def _reduce_149(val, _values) + n(:Parameter, val[1], 'reference') + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 473) + def _reduce_150(val, _values) + n(:Parameter, val[0], 'value') + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 477) + def _reduce_151(val, _values) + [val[0]] + val[2] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 479) + def _reduce_152(val, _values) + [val[0]] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 483) + def _reduce_153(val, _values) + [val[0]] + val[1] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 485) + def _reduce_154(val, _values) + [val[0]] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 489) + def _reduce_155(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 491) + def _reduce_156(val, _values) + n(:Assignment, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 493) + def _reduce_157(val, _values) + val[0] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 497) + def _reduce_158(val, _values) + [val[0]] + val[2] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 499) + def _reduce_159(val, _values) + [val[0]] + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 507) + def _reduce_160(val, _values) + n(:Identifier, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 509) + def _reduce_161(val, _values) + n(:Identifier, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 511) + def _reduce_162(val, _values) + n(:Identifier, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 515) + def _reduce_163(val, _values) + n(:Integer, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 517) + def _reduce_164(val, _values) + n(:Integer, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 519) + def _reduce_165(val, _values) + n(:Integer, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 521) + def _reduce_166(val, _values) + n(:Integer, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 523) + def _reduce_167(val, _values) + n(:Integer, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 527) + def _reduce_168(val, _values) + n(:Ip, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 530) + def _reduce_169(val, _values) + n(:String, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 532) + def _reduce_170(val, _values) + n(:String, *val) + end +.,., + +module_eval(<<'.,.,', 'nasl.y', 536) + def _reduce_171(val, _values) + n(:Undefined, *val) + end +.,., + +def _reduce_none(val, _values) + val[0] +end + + end # class Grammar +end # module Nasl + + diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/nokogiri-css b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/nokogiri-css new file mode 100644 index 000000000000..bc2faf8702b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/nokogiri-css @@ -0,0 +1,836 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + + +require 'nokogiri/css/parser_extras' +module Nokogiri + module CSS + class Parser < Racc::Parser +##### State transition tables begin ### + +racc_action_table = [ + 24, 93, 56, 57, 33, 55, 94, 23, 24, 22, + 12, 93, 33, 27, 35, 52, 44, 22, -23, 25, + 45, 98, 23, 33, 26, 18, 20, 25, 27, -23, + 23, 24, 26, 18, 20, 33, 27, 11, 39, 24, + 22, 23, 74, 33, 18, 91, 90, 27, 22, 12, + 25, 24, -23, 23, 85, 26, 18, 20, 25, 27, + 66, 23, 24, 26, 18, 20, 33, 27, 101, 100, + 51, 22, 86, 88, 24, 26, 56, 87, 89, 60, + 92, 25, 95, 46, 23, 49, 26, 18, 20, 90, + 27, 33, 33, 51, 96, 99, 56, 58, 26, 60, + 102, 103, 33, 33, 33, 93, 39, 39, 105, 23, + 23, 108, 18, 18, 20, 27, 27, 39, 39, 39, + 23, 23, 23, 18, 18, 18, 27, 27, 27, 33, + 33, 56, 87, 109, 60, 22, 56, 87, nil, 60, + 33, nil, nil, nil, 39, 39, nil, 23, 23, nil, + 18, 18, 20, 27, 27, 39, 82, 83, 23, 56, + 87, 18, 60, nil, 27, 82, 83, 78, 79, 80, + nil, 81, nil, nil, nil, 77, 78, 79, 80, nil, + 81, 4, 5, 10, 77, 4, 5, 43, nil, nil, + nil, 6, nil, 8, 7, 6, nil, 8, 7, 4, + 5, 10, nil, nil, nil, nil, nil, nil, nil, 6, + nil, 8, 7 ] + +racc_action_check = [ + 3, 58, 24, 24, 3, 24, 57, 15, 9, 3, + 64, 57, 9, 15, 11, 24, 18, 9, 58, 3, + 21, 64, 3, 14, 3, 3, 3, 9, 3, 22, + 9, 12, 9, 9, 9, 12, 9, 1, 14, 42, + 12, 14, 45, 42, 14, 55, 55, 14, 42, 1, + 12, 27, 46, 12, 49, 12, 12, 12, 42, 12, + 27, 42, 43, 42, 42, 42, 43, 42, 76, 76, + 27, 43, 50, 53, 23, 27, 51, 51, 54, 51, + 56, 43, 59, 23, 43, 23, 43, 43, 43, 60, + 43, 28, 25, 23, 61, 75, 25, 25, 23, 25, + 84, 86, 29, 30, 31, 87, 28, 25, 91, 28, + 25, 94, 28, 25, 25, 28, 25, 29, 30, 31, + 29, 30, 31, 29, 30, 31, 29, 30, 31, 32, + 39, 90, 90, 105, 90, 39, 92, 92, nil, 92, + 62, nil, nil, nil, 32, 39, nil, 32, 39, nil, + 32, 39, 39, 32, 39, 62, 47, 47, 62, 93, + 93, 62, 93, nil, 62, 48, 48, 47, 47, 47, + nil, 47, nil, nil, nil, 47, 48, 48, 48, nil, + 48, 0, 0, 0, 48, 17, 17, 17, nil, nil, + nil, 0, nil, 0, 0, 17, nil, 17, 17, 26, + 26, 26, nil, nil, nil, nil, nil, nil, nil, 26, + nil, 26, 26 ] + +racc_action_pointer = [ + 174, 37, nil, -2, nil, nil, nil, nil, nil, 6, + nil, 14, 29, nil, 17, -17, nil, 178, 5, nil, + nil, -9, 0, 72, -8, 86, 192, 49, 85, 96, + 97, 98, 123, nil, nil, nil, nil, nil, nil, 124, + nil, nil, 37, 60, nil, 31, 23, 153, 162, 29, + 43, 66, nil, 50, 55, 34, 68, -1, -11, 59, + 77, 71, 134, nil, -2, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 70, 58, nil, nil, nil, + nil, nil, nil, nil, 75, nil, 90, 93, nil, nil, + 121, 101, 126, 149, 98, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 120, nil, nil, nil, nil ] + +racc_action_default = [ + -74, -75, -2, -24, -4, -5, -6, -7, -8, -24, + -73, -75, -24, -3, -47, -10, -13, -17, -75, -19, + -20, -75, -22, -24, -75, -24, -74, -75, -53, -54, + -55, -56, -57, -58, -14, 110, -1, -9, -46, -24, + -11, -12, -24, -24, -18, -75, -29, -61, -61, -75, + -75, -75, -30, -75, -75, -38, -39, -40, -22, -75, + -38, -75, -70, -72, -75, -44, -45, -48, -49, -50, + -51, -52, -15, -16, -21, -75, -75, -62, -63, -64, + -65, -66, -67, -68, -75, -27, -75, -40, -31, -32, + -75, -43, -75, -75, -75, -33, -69, -71, -34, -25, + -59, -60, -26, -28, -35, -75, -36, -37, -42, -41 ] + +racc_goto_table = [ + 53, 38, 13, 1, 42, 48, 62, 37, 34, 65, + 40, 36, 63, 75, 84, 67, 68, 69, 70, 71, + 62, 41, 50, 47, 54, nil, 63, nil, nil, 64, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 72, 73, nil, nil, nil, nil, nil, nil, 97, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 104, nil, 106, 107 ] + +racc_goto_check = [ + 18, 12, 2, 1, 5, 9, 7, 8, 2, 9, + 10, 2, 12, 17, 17, 12, 12, 12, 12, 12, + 7, 11, 15, 16, 19, nil, 12, nil, nil, 1, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 2, 2, nil, nil, nil, nil, nil, nil, 12, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 18, nil, 18, 18 ] + +racc_goto_pointer = [ + nil, 3, -1, nil, nil, -13, nil, -19, -7, -18, + -5, 6, -13, nil, nil, -1, 0, -34, -24, 0, + nil, nil, nil, nil ] + +racc_goto_default = [ + nil, nil, nil, 2, 3, 9, 17, 14, nil, 15, + 31, 30, 16, 29, 19, 21, nil, nil, 59, nil, + 28, 32, 76, 61 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 3, 32, :_reduce_1, + 1, 32, :_reduce_2, + 2, 32, :_reduce_3, + 1, 36, :_reduce_4, + 1, 36, :_reduce_5, + 1, 36, :_reduce_6, + 1, 36, :_reduce_7, + 1, 36, :_reduce_8, + 2, 37, :_reduce_9, + 1, 37, :_reduce_none, + 2, 37, :_reduce_11, + 2, 37, :_reduce_12, + 1, 37, :_reduce_13, + 2, 34, :_reduce_14, + 3, 33, :_reduce_15, + 3, 33, :_reduce_16, + 1, 33, :_reduce_none, + 2, 44, :_reduce_18, + 1, 38, :_reduce_none, + 1, 38, :_reduce_20, + 3, 45, :_reduce_21, + 1, 45, :_reduce_22, + 1, 46, :_reduce_23, + 0, 46, :_reduce_none, + 4, 42, :_reduce_25, + 4, 42, :_reduce_26, + 3, 42, :_reduce_27, + 3, 47, :_reduce_28, + 1, 47, :_reduce_29, + 2, 40, :_reduce_30, + 3, 40, :_reduce_31, + 3, 40, :_reduce_32, + 3, 40, :_reduce_33, + 3, 40, :_reduce_34, + 3, 49, :_reduce_35, + 3, 49, :_reduce_36, + 3, 49, :_reduce_37, + 1, 49, :_reduce_none, + 1, 49, :_reduce_none, + 1, 49, :_reduce_40, + 4, 50, :_reduce_41, + 3, 50, :_reduce_42, + 2, 50, :_reduce_43, + 2, 41, :_reduce_44, + 2, 41, :_reduce_45, + 1, 39, :_reduce_none, + 0, 39, :_reduce_none, + 2, 43, :_reduce_48, + 2, 43, :_reduce_49, + 2, 43, :_reduce_50, + 2, 43, :_reduce_51, + 2, 43, :_reduce_52, + 1, 43, :_reduce_none, + 1, 43, :_reduce_none, + 1, 43, :_reduce_none, + 1, 43, :_reduce_none, + 1, 43, :_reduce_none, + 1, 51, :_reduce_58, + 2, 48, :_reduce_59, + 2, 48, :_reduce_60, + 0, 48, :_reduce_none, + 1, 53, :_reduce_62, + 1, 53, :_reduce_63, + 1, 53, :_reduce_64, + 1, 53, :_reduce_65, + 1, 53, :_reduce_66, + 1, 53, :_reduce_67, + 1, 53, :_reduce_68, + 3, 52, :_reduce_69, + 1, 54, :_reduce_none, + 2, 54, :_reduce_none, + 1, 54, :_reduce_none, + 1, 35, :_reduce_none, + 0, 35, :_reduce_none ] + +racc_reduce_n = 75 + +racc_shift_n = 110 + +racc_token_table = { + false => 0, + :error => 1, + :FUNCTION => 2, + :INCLUDES => 3, + :DASHMATCH => 4, + :LBRACE => 5, + :HASH => 6, + :PLUS => 7, + :GREATER => 8, + :S => 9, + :STRING => 10, + :IDENT => 11, + :COMMA => 12, + :NUMBER => 13, + :PREFIXMATCH => 14, + :SUFFIXMATCH => 15, + :SUBSTRINGMATCH => 16, + :TILDE => 17, + :NOT_EQUAL => 18, + :SLASH => 19, + :DOUBLESLASH => 20, + :NOT => 21, + :EQUAL => 22, + :RPAREN => 23, + :LSQUARE => 24, + :RSQUARE => 25, + :HAS => 26, + "." => 27, + "*" => 28, + "|" => 29, + ":" => 30 } + +racc_nt_base = 31 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "FUNCTION", + "INCLUDES", + "DASHMATCH", + "LBRACE", + "HASH", + "PLUS", + "GREATER", + "S", + "STRING", + "IDENT", + "COMMA", + "NUMBER", + "PREFIXMATCH", + "SUFFIXMATCH", + "SUBSTRINGMATCH", + "TILDE", + "NOT_EQUAL", + "SLASH", + "DOUBLESLASH", + "NOT", + "EQUAL", + "RPAREN", + "LSQUARE", + "RSQUARE", + "HAS", + "\".\"", + "\"*\"", + "\"|\"", + "\":\"", + "$start", + "selector", + "simple_selector_1toN", + "prefixless_combinator_selector", + "optional_S", + "combinator", + "simple_selector", + "element_name", + "hcap_0toN", + "function", + "pseudo", + "attrib", + "hcap_1toN", + "class", + "namespaced_ident", + "namespace", + "attrib_name", + "attrib_val_0or1", + "expr", + "nth", + "attribute_id", + "negation", + "eql_incl_dash", + "negation_arg" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'nokogiri-css.y', 9) + def _reduce_1(val, _values, result) + result = [val.first, val.last].flatten + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 11) + def _reduce_2(val, _values, result) + result = val.flatten + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 12) + def _reduce_3(val, _values, result) + result = [val.last].flatten + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 15) + def _reduce_4(val, _values, result) + result = :DIRECT_ADJACENT_SELECTOR + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 16) + def _reduce_5(val, _values, result) + result = :CHILD_SELECTOR + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 17) + def _reduce_6(val, _values, result) + result = :FOLLOWING_SELECTOR + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 18) + def _reduce_7(val, _values, result) + result = :DESCENDANT_SELECTOR + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 19) + def _reduce_8(val, _values, result) + result = :CHILD_SELECTOR + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 23) + def _reduce_9(val, _values, result) + result = if val[1].nil? + val.first + else + Node.new(:CONDITIONAL_SELECTOR, [val.first, val[1]]) + end + + result + end +.,., + +# reduce 10 omitted + +module_eval(<<'.,.,', 'nokogiri-css.y', 31) + def _reduce_11(val, _values, result) + result = Node.new(:CONDITIONAL_SELECTOR, val) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 34) + def _reduce_12(val, _values, result) + result = Node.new(:CONDITIONAL_SELECTOR, val) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 37) + def _reduce_13(val, _values, result) + result = Node.new(:CONDITIONAL_SELECTOR, + [Node.new(:ELEMENT_NAME, ['*']), val.first] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 44) + def _reduce_14(val, _values, result) + result = Node.new(val.first, [nil, val.last]) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 49) + def _reduce_15(val, _values, result) + result = Node.new(val[1], [val.first, val.last]) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 52) + def _reduce_16(val, _values, result) + result = Node.new(:DESCENDANT_SELECTOR, [val.first, val.last]) + + result + end +.,., + +# reduce 17 omitted + +module_eval(<<'.,.,', 'nokogiri-css.y', 57) + def _reduce_18(val, _values, result) + result = Node.new(:CLASS_CONDITION, [val[1]]) + result + end +.,., + +# reduce 19 omitted + +module_eval(<<'.,.,', 'nokogiri-css.y', 61) + def _reduce_20(val, _values, result) + result = Node.new(:ELEMENT_NAME, val) + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 65) + def _reduce_21(val, _values, result) + result = Node.new(:ELEMENT_NAME, + [[val.first, val.last].compact.join(':')] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 70) + def _reduce_22(val, _values, result) + name = @namespaces.key?('xmlns') ? "xmlns:#{val.first}" : val.first + result = Node.new(:ELEMENT_NAME, [name]) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 75) + def _reduce_23(val, _values, result) + result = val[0] + result + end +.,., + +# reduce 24 omitted + +module_eval(<<'.,.,', 'nokogiri-css.y', 80) + def _reduce_25(val, _values, result) + result = Node.new(:ATTRIBUTE_CONDITION, + [val[1]] + (val[2] || []) + ) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 85) + def _reduce_26(val, _values, result) + result = Node.new(:ATTRIBUTE_CONDITION, + [val[1]] + (val[2] || []) + ) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 90) + def _reduce_27(val, _values, result) + # Non standard, but hpricot supports it. + result = Node.new(:PSEUDO_CLASS, + [Node.new(:FUNCTION, ['nth-child(', val[1]])] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 98) + def _reduce_28(val, _values, result) + result = Node.new(:ELEMENT_NAME, + [[val.first, val.last].compact.join(':')] + ) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 103) + def _reduce_29(val, _values, result) + # Default namespace is not applied to attributes. + # So we don't add prefix "xmlns:" as in namespaced_ident. + result = Node.new(:ELEMENT_NAME, [val.first]) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 110) + def _reduce_30(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip]) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 113) + def _reduce_31(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 116) + def _reduce_32(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 119) + def _reduce_33(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 122) + def _reduce_34(val, _values, result) + result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 126) + def _reduce_35(val, _values, result) + result = [val.first, val.last] + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 127) + def _reduce_36(val, _values, result) + result = [val.first, val.last] + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 128) + def _reduce_37(val, _values, result) + result = [val.first, val.last] + result + end +.,., + +# reduce 38 omitted + +# reduce 39 omitted + +module_eval(<<'.,.,', 'nokogiri-css.y', 133) + def _reduce_40(val, _values, result) + case val[0] + when 'even' + result = Node.new(:NTH, ['2','n','+','0']) + when 'odd' + result = Node.new(:NTH, ['2','n','+','1']) + when 'n' + result = Node.new(:NTH, ['1','n','+','0']) + else + # This is not CSS standard. It allows us to support this: + # assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)')) + # assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)')) + # assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)')) + result = val + end + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 152) + def _reduce_41(val, _values, result) + if val[1] == 'n' + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 158) + def _reduce_42(val, _values, result) + # n+3, -n+3 + if val[0] == 'n' + val.unshift("1") + result = Node.new(:NTH, val) + elsif val[0] == '-n' + val[0] = 'n' + val.unshift("-1") + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 170) + def _reduce_43(val, _values, result) + # 5n, -5n, 10n-1 + n = val[1] + if n[0, 2] == 'n-' + val[1] = 'n' + val << "-" + # b is contained in n as n is the string "n-b" + val << n[2, n.size] + result = Node.new(:NTH, val) + elsif n == 'n' + val << "+" + val << "0" + result = Node.new(:NTH, val) + else + raise Racc::ParseError, "parse error on IDENT '#{val[1]}'" + end + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 189) + def _reduce_44(val, _values, result) + result = Node.new(:PSEUDO_CLASS, [val[1]]) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 191) + def _reduce_45(val, _values, result) + result = Node.new(:PSEUDO_CLASS, [val[1]]) + result + end +.,., + +# reduce 46 omitted + +# reduce 47 omitted + +module_eval(<<'.,.,', 'nokogiri-css.y', 199) + def _reduce_48(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 202) + def _reduce_49(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 205) + def _reduce_50(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 208) + def _reduce_51(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 211) + def _reduce_52(val, _values, result) + result = Node.new(:COMBINATOR, val) + + result + end +.,., + +# reduce 53 omitted + +# reduce 54 omitted + +# reduce 55 omitted + +# reduce 56 omitted + +# reduce 57 omitted + +module_eval(<<'.,.,', 'nokogiri-css.y', 220) + def _reduce_58(val, _values, result) + result = Node.new(:ID, val) + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 223) + def _reduce_59(val, _values, result) + result = [val.first, val[1]] + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 224) + def _reduce_60(val, _values, result) + result = [val.first, val[1]] + result + end +.,., + +# reduce 61 omitted + +module_eval(<<'.,.,', 'nokogiri-css.y', 228) + def _reduce_62(val, _values, result) + result = :equal + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 229) + def _reduce_63(val, _values, result) + result = :prefix_match + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 230) + def _reduce_64(val, _values, result) + result = :suffix_match + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 231) + def _reduce_65(val, _values, result) + result = :substring_match + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 232) + def _reduce_66(val, _values, result) + result = :not_equal + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 233) + def _reduce_67(val, _values, result) + result = :includes + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 234) + def _reduce_68(val, _values, result) + result = :dash_match + result + end +.,., + +module_eval(<<'.,.,', 'nokogiri-css.y', 238) + def _reduce_69(val, _values, result) + result = Node.new(:NOT, [val[1]]) + + result + end +.,., + +# reduce 70 omitted + +# reduce 71 omitted + +# reduce 72 omitted + +# reduce 73 omitted + +# reduce 74 omitted + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser + end # module CSS +end # module Nokogiri diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/opal b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/opal new file mode 100644 index 000000000000..710ccdfe888a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/opal @@ -0,0 +1,6431 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +module Opal + class Parser < Racc::Parser + +module_eval(<<'...end opal.y/module_eval...', 'opal.y', 1808) + +...end opal.y/module_eval... +##### State transition tables begin ### + +clist = [ +'63,64,65,8,51,575,552,-92,57,58,619,205,206,61,73,59,60,62,23,24,66', +'67,74,544,754,607,543,22,28,27,90,89,91,92,97,751,17,607,273,-458,612', +'653,7,41,6,9,94,93,575,84,50,86,85,87,273,88,95,96,653,81,82,-100,38', +'39,-99,-68,597,-446,344,343,-95,205,206,618,-446,652,-97,581,575,582', +'-94,205,206,-96,575,36,609,608,30,-92,575,52,652,108,54,770,32,-84,609', +'608,40,101,-79,-92,268,752,100,195,18,-100,-99,551,-84,79,73,75,76,77', +'78,101,-95,574,74,80,100,272,-98,63,64,65,56,51,-97,53,653,57,58,196', +'37,83,61,272,59,60,62,23,24,66,67,454,-534,205,206,197,22,28,27,90,89', +'91,92,308,101,17,574,-84,-91,100,652,-90,41,308,596,94,93,-86,84,50', +'86,85,87,-88,88,95,96,-85,81,82,-87,38,39,101,101,-535,574,900,100,100', +'101,-100,574,-449,-84,100,101,198,574,649,-449,100,-96,-84,210,246,-98', +'214,215,-92,52,-92,-91,54,-92,-100,-99,-100,-99,40,-100,-99,-94,-89', +'273,607,-95,18,-95,299,726,-95,79,73,75,76,77,78,-97,-90,-97,74,80,-97', +'-86,726,63,64,65,56,51,-88,53,544,57,58,546,37,83,61,531,59,60,62,23', +'24,66,67,205,206,653,205,206,22,28,27,90,89,91,92,-91,-534,219,777,300', +'-535,609,608,605,41,268,227,94,93,308,84,50,86,85,87,388,88,95,96,652', +'81,82,-90,38,39,-99,272,-86,726,301,302,-96,-91,-96,-88,-98,-96,-98', +'224,810,-98,-91,226,225,-87,101,210,725,-93,214,100,-94,52,-94,-85,54', +'-94,391,-89,-90,101,40,725,788,-86,100,402,101,-90,218,415,-88,100,-86', +'79,73,75,76,77,78,-88,453,101,74,80,455,204,100,63,64,65,56,51,607,53', +'544,57,58,546,37,83,61,789,59,60,62,258,259,66,67,876,-534,-87,-95,877', +'257,28,27,90,89,91,92,-85,456,219,-535,-89,-91,101,607,725,41,607,100', +'94,93,-100,84,50,86,85,87,261,88,95,96,-456,81,82,-87,38,39,-97,-456', +'609,608,610,101,-87,-85,-93,215,100,-89,-94,487,264,265,-85,754,-455', +'-454,-89,210,266,489,214,-455,-454,52,751,813,54,582,256,491,254,497', +'40,-67,609,608,614,609,608,620,218,400,401,203,201,79,73,75,76,77,78', +'202,514,544,74,80,546,344,343,63,64,65,56,51,101,53,-451,57,58,100,37', +'83,61,-451,59,60,62,258,259,66,67,515,-532,527,528,516,257,28,27,90', +'89,91,92,101,752,219,-331,-331,100,199,625,200,41,525,-331,94,93,277', +'84,50,86,85,87,261,88,95,96,308,81,82,268,38,39,532,227,231,236,237', +'238,233,235,243,244,239,240,-449,-449,220,221,-452,101,241,242,-449', +'210,100,-452,214,-532,533,52,227,-331,54,-331,256,224,254,230,40,226', +'225,222,223,234,232,228,218,229,-532,203,449,79,73,75,76,77,78,450,308', +'-458,74,80,547,245,548,63,64,65,56,51,-449,53,-449,57,58,491,37,83,61', +'555,59,60,62,258,259,66,67,103,104,105,106,107,257,28,27,90,89,91,92', +'-453,-84,219,524,521,531,452,-453,451,41,-92,522,94,93,558,84,50,86', +'85,87,261,88,95,96,559,81,82,561,38,39,570,227,231,236,237,238,233,235', +'243,244,239,240,524,534,220,221,-90,412,241,242,535,210,414,413,214', +'-99,571,52,404,520,54,523,256,224,254,230,40,226,225,222,223,234,232', +'228,218,229,587,524,584,79,73,75,76,77,78,585,588,630,74,80,589,245', +'650,-255,-255,-255,56,-255,452,53,451,-255,-255,613,37,83,-255,617,-255', +'-255,-255,-255,-255,-255,-255,103,104,105,106,107,-255,-255,-255,-255', +'-255,-255,-255,621,-86,-255,524,593,624,583,625,586,-255,-95,591,-255', +'-255,627,-255,-255,-255,-255,-255,-255,-255,-255,-255,-263,-255,-255', +'628,-255,-255,629,227,231,236,237,238,233,235,243,244,239,240,-284,-284', +'220,221,205,206,241,242,-284,-255,268,631,-255,268,227,-255,227,592', +'-255,523,-255,224,-255,230,-255,226,225,222,223,234,232,228,-255,229', +'344,343,602,-255,-255,-255,-255,-255,-255,603,832,813,-255,-255,776', +'245,227,-233,-88,227,-255,915,-284,-255,-284,308,754,-97,-255,-255,63', +'64,65,8,51,344,343,751,57,58,832,813,670,61,671,59,60,62,23,24,66,67', +'679,681,-79,-85,682,22,28,27,90,89,91,92,-94,684,17,537,341,340,344', +'343,7,41,227,9,94,93,694,84,50,86,85,87,700,88,95,96,701,81,82,702,38', +'39,706,227,231,236,237,238,233,235,243,244,239,240,224,752,220,221,226', +'225,241,242,716,36,718,721,281,582,729,52,772,-264,54,497,32,224,497', +'230,40,226,225,222,223,234,232,228,18,229,497,524,593,79,73,75,76,77', +'78,822,791,792,74,80,489,245,491,63,64,65,56,51,800,53,802,57,58,803', +'37,83,61,694,59,60,62,258,259,66,67,708,807,268,268,808,257,291,295', +'90,89,91,92,268,227,219,-286,-286,227,592,813,523,292,819,-286,94,93', +'820,84,50,86,85,87,558,88,95,96,561,81,82,823,327,824,336,334,333,561', +'335,341,340,344,343,827,866,867,-283,-283,868,95,96,813,836,837,-283', +'289,839,840,286,-535,-534,52,842,-286,54,-286,285,850,852,855,856,338', +'858,915,860,862,864,-265,754,341,340,344,343,79,73,75,76,77,78,751,794', +'878,74,80,879,880,881,63,64,65,56,51,-283,53,-283,57,58,883,296,83,61', +'884,59,60,62,258,259,66,67,708,341,340,344,343,257,291,295,90,89,91', +'92,524,946,219,103,104,105,106,107,947,292,227,694,94,93,886,84,50,86', +'85,87,-263,88,95,96,890,81,82,764,752,336,334,333,754,335,895,341,340', +'344,343,897,903,905,224,751,906,308,226,225,222,223,919,289,-266,921', +'214,-535,945,52,586,563,54,336,334,333,561,335,338,749,931,932,937,855', +'939,860,341,340,344,343,860,79,73,75,76,77,78,862,948,954,74,80,700', +'964,860,298,966,967,56,,,53,,,,,296,83,63,64,65,227,51,,,752,57,58,', +',,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,224,219,', +',226,225,222,223,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39', +',227,231,236,237,238,233,235,243,244,239,240,,,220,221,,,241,242,,210', +',,214,,,52,,,54,,,224,,230,40,226,225,222,223,234,232,228,218,229,,', +',79,73,75,76,77,78,,,,74,80,,245,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,563,219,336,334', +'333,,335,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,227,231', +'236,237,238,233,235,243,244,239,240,,,220,221,,,241,242,,210,,,214,', +',52,,,54,,,224,,230,40,226,225,222,223,234,232,228,218,229,,,,79,73', +'75,76,77,78,,,,74,80,,245,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,227,231,236,237,238,233,235', +'243,244,239,240,,,220,221,,,241,242,,210,,,214,,,52,,,54,,,224,,230', +'40,226,225,222,223,234,232,228,218,229,,,,79,73,75,76,77,78,,,,74,80', +',245,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,', +',22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96', +',81,82,,38,39,,227,231,236,237,238,233,235,243,244,239,240,,,220,221', +',,241,242,,210,,,214,,,52,,,54,,,224,,230,40,226,225,222,223,234,232', +'228,18,229,,,,79,73,75,76,77,78,,,,74,80,,245,,63,64,65,56,51,,53,,57', +'58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,28,27,90,89,91,92,,,219', +',,,,,,41,,,94,93,,84,50,86,85,87,261,88,95,96,,81,82,,38,39,,227,231', +'236,237,238,233,235,243,244,239,240,,,220,221,,,241,242,,210,,,214,', +',52,,,54,,256,224,,230,40,226,225,222,223,234,232,228,218,229,,,,79', +'73,75,76,77,78,,,,74,80,,245,,63,64,65,56,51,,53,,57,58,,37,83,61,,59', +'60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94', +'93,,84,50,86,85,87,261,88,95,96,,81,82,,38,39,,227,231,236,237,238,233', +'235,243,244,239,240,,,220,221,,,241,242,,210,,,214,,,52,,,54,,,224,', +'230,40,226,225,222,223,234,232,228,218,229,,,,79,73,75,76,77,78,,,,74', +'80,,245,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67,', +',,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95', +'96,,81,82,,38,39,,227,231,236,237,238,233,235,243,244,239,240,,,220', +'221,,,241,242,,210,,,214,,,52,,,54,,,224,,230,40,226,225,222,223,234', +'232,228,18,229,,,,79,73,75,76,77,78,,,,74,80,,245,,63,64,65,56,51,,53', +',57,58,,37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17', +',,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,227,231,236', +'237,238,233,235,243,244,239,240,,,220,221,,,241,242,,210,,,214,,,52', +',,54,,,224,,230,40,226,225,222,223,234,232,228,18,229,,,,79,73,75,76', +'77,78,,,,74,80,,245,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85', +'87,,88,95,96,,81,82,,38,39,,227,231,236,237,238,233,235,243,244,239', +'240,,,220,221,,,241,242,,210,,,214,,,52,,,54,,,224,,230,40,226,225,222', +'223,234,232,228,18,229,,,,79,73,75,76,77,78,,,,74,80,101,245,,-233,', +'100,56,,,53,,,,,37,83,63,64,65,,51,,,,57,58,,,,61,,59,60,62,258,259', +'66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,292,,,94,93,,84,50,86', +'85,87,,88,95,96,,81,82,227,231,236,237,238,233,235,243,244,239,240,227', +',220,221,,,241,242,,,,,,356,,,30,241,242,52,,224,54,230,32,226,225,222', +'223,234,232,228,224,229,230,,226,225,222,223,,79,73,75,76,77,78,,,245', +'74,80,,,,63,64,65,56,51,,53,,57,58,,296,83,61,,59,60,62,258,259,66,67', +',,,,,257,291,295,90,89,91,92,,,219,,,,,,,292,,,94,93,,84,50,86,85,361', +',88,95,96,,81,82,227,231,236,237,238,233,235,243,244,239,240,227,,220', +'221,,,241,242,,,367,,,362,,,214,241,242,52,,224,54,230,,226,225,222', +'223,234,232,228,224,229,230,,226,225,222,223,,79,73,75,76,77,78,,,245', +'74,80,,,,-531,-531,-531,56,-531,,53,,-531,-531,,296,83,-531,,-531,-531', +'-531,-531,-531,-531,-531,,-531,,,,-531,-531,-531,-531,-531,-531,-531', +',,-531,,,,,,,-531,,,-531,-531,,-531,-531,-531,-531,-531,-531,-531,-531', +'-531,,-531,-531,,-531,-531,,227,231,236,237,238,233,235,243,244,239', +'240,,,220,221,,,241,242,,-531,,,-531,-531,,-531,,,-531,,-531,224,-531', +'230,-531,226,225,222,223,234,232,228,-531,229,-531,,,-531,-531,-531', +'-531,-531,-531,,,,-531,-531,,245,,-532,-532,-532,-531,-532,,-531,,-532', +'-532,,-531,-531,-532,,-532,-532,-532,-532,-532,-532,-532,,-532,,,,-532', +'-532,-532,-532,-532,-532,-532,,,-532,,,,,,,-532,,,-532,-532,,-532,-532', +'-532,-532,-532,-532,-532,-532,-532,,-532,-532,,-532,-532,,227,231,236', +'237,238,233,235,243,244,239,240,,,220,221,,,241,242,,-532,,,-532,-532', +',-532,,,-532,,-532,224,-532,230,-532,226,225,222,223,234,232,228,-532', +'229,-532,,,-532,-532,-532,-532,-532,-532,,,,-532,-532,,245,,,,,-532', +',,-532,,,,,-532,-532,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66', +'67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,6,9,94,93,,84,50,86,85,87', +',88,95,96,,81,82,,38,39,,227,231,236,237,238,233,235,243,244,239,240', +',,220,221,,,241,242,,36,,,30,,,52,,,54,,32,224,,230,40,226,225,222,223', +'234,232,228,18,229,,,,79,73,75,76,77,78,,,,74,80,,245,,,,404,56,,,53', +',,,,37,83,63,64,65,,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22', +'28,27,90,89,91,92,,563,17,336,334,333,,335,,41,,,94,93,,84,50,86,85', +'87,,88,95,96,,81,82,,38,39,563,,336,334,333,,335,,,563,566,336,334,333', +',335,,,569,,,210,,,214,,,52,,,54,,,,,,40,,,566,,,,,18,,,569,566,79,73', +'75,76,77,78,,829,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,227,231,236,237,238,233,235,243,244', +'239,240,,,-555,-555,,,241,242,,210,,,214,,,52,,,54,,,224,,230,40,226', +'225,222,223,234,232,228,18,229,,,,79,73,75,76,77,78,,,,74,80,,,,63,64', +'65,56,51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90', +'89,91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38', +'39,,227,231,236,237,238,233,235,243,244,239,240,,,-555,-555,,,241,242', +',210,,,214,,,52,,,54,,,224,,230,40,226,225,222,223,234,232,228,18,229', +',,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,227,-555,-555,-555,-555,233', +'235,,,-555,-555,,,,,,,241,242,,210,,,214,,,52,,,54,,,224,,230,40,226', +'225,222,223,234,232,228,18,229,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56', +',,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,', +',,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,227,,,,,,,,,,,,,,,,,241,242,,36,,,30,,,52,,,54', +',32,224,,230,40,226,225,222,223,,,228,18,229,,,,79,73,75,76,77,78,,', +',74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62', +'23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,6,9,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,227,,,,,,,,,,,,,,,,,241,242,,36,,', +'30,,,52,,,54,,32,224,,230,40,226,225,222,223,,,228,18,229,,,,79,73,75', +'76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,', +'61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9', +'94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,227,,,,,,,,,,,,,,,,,241', +'242,,36,,,30,,,52,,,54,,32,224,,230,40,226,225,222,223,,,228,18,229', +',,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,219,,,,,,,41,,,94', +'93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,227,,,,,,,,,,,,,,,,,241', +'242,,210,,,214,,,52,,,54,,421,224,,230,40,226,225,222,223,,,228,218', +'229,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83', +'61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,219,,,,,,,41,,', +'94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,227,-555,-555,-555,-555', +'233,235,,,-555,-555,,,,,,,241,242,,210,,,214,,,52,,,54,,421,224,,230', +'40,226,225,222,223,234,232,228,218,229,,,,79,73,75,76,77,78,,,,74,80', +',,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,,,22', +'28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,', +'81,82,,38,39,,227,-555,-555,-555,-555,233,235,,,-555,-555,,,,,,,241', +'242,,210,,,214,,,52,,,54,,,224,,230,40,226,225,222,223,234,232,228,218', +'229,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83', +'61,,59,60,62,258,259,66,67,,,,,,257,28,27,90,89,91,92,,,219,,,,,,,41', +',,94,93,,84,50,86,85,87,261,88,95,96,,81,82,,38,39,,227,-555,-555,-555', +'-555,233,235,,,-555,-555,,,,,,,241,242,,210,,,214,,,52,,,54,,256,224', +',230,40,226,225,222,223,234,232,228,218,229,,,,79,73,75,76,77,78,,,', +'74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67', +',,,,,257,28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,261', +'88,95,96,,81,82,,38,39,,227,-555,-555,-555,-555,233,235,,,-555,-555', +',,,,,,241,242,,210,,,214,,,52,,,54,,256,224,,230,40,226,225,222,223', +'234,232,228,218,229,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51', +',53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92', +',,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,227', +'-555,-555,-555,-555,233,235,,,-555,-555,,,,,,,241,242,,210,,,214,,,52', +',,54,,,224,,230,40,226,225,222,223,234,232,228,218,229,,,,79,73,75,76', +'77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,23,24', +'66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85,87', +',88,95,96,,81,82,,38,39,,227,231,236,237,238,233,235,,,239,240,,,,,', +',241,242,,210,,,214,,,52,,,54,,,224,,230,40,226,225,222,223,234,232', +'228,18,229,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58', +',37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,', +',41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,227,231,236,237', +'238,233,235,243,,239,240,,,,,,,241,242,,210,,,214,,,52,,,54,,,224,,230', +'40,226,225,222,223,234,232,228,18,229,,,,79,73,75,76,77,78,,,,74,80', +',,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24', +'66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85', +'87,,88,95,96,,81,82,,38,39,,227,,,,,,,,,,,,,,,,,241,242,,36,,,30,,,52', +',,54,,32,224,,,40,226,225,222,223,,,,18,,,,,79,73,75,76,77,78,,,,74', +'80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,', +',22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96', +',81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,458,52,,,54,,,,,,40,,', +',,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58', +',37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219', +',,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,', +',,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77', +'78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259', +'66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86', +'85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,', +'54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90', +'89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38', +'39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79', +'73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214', +',,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64', +'65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295', +'90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82', +',38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,', +',,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41', +',,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,', +',210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74', +'80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,', +',,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40', +',,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57', +'58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,', +'219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,', +',,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76', +'77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258', +'259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90', +'89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38', +'39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79', +'73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214', +',,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64', +'65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295', +'90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82', +',38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,', +',,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41', +',,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,', +',210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74', +'80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,', +',,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40', +',,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57', +'58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,', +'219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,', +',,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76', +'77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258', +'259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90', +'89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38', +'39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79', +'73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214', +',,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64', +'65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295', +'90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82', +',38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,', +',,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41', +',,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,', +',210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74', +'80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,', +',,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40', +',,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57', +'58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,', +'219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,', +',,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76', +'77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258', +'259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90', +'89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38', +'39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79', +'73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214', +',,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64', +'65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295', +'90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82', +',38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,', +',,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41', +',,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,', +',210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74', +'80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,', +',,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40', +',,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57', +'58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,', +'219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,', +',,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76', +'77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258', +'259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,28,27,90,89', +'91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,261,88,95,96,,81,82,,38', +'39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,256,,254,,40,,,,,,,,218', +',,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,28,27,90,89,91,92,,,219,,,,,,,41,,', +'94,93,,84,50,86,85,87,261,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,', +',,210,,,214,,,506,,,54,,256,,254,,40,,,,,,,,218,,,,,79,73,75,76,77,78', +',,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66', +'67,,,,,,257,28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87', +'261,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,510,52,,', +'54,,256,,254,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56', +',,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,', +',,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,281,,,52,,,54,,32,,,,40', +',,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58', +',37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219', +',,,,,,292,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,764,,336,334,333', +'754,335,,,,,,,,,,751,,,,,,,,289,,,214,,,52,,,54,,,,,,338,,,,,,,,341', +'340,344,343,,79,73,75,76,77,78,,,,74,80,,,,518,,,56,,,53,,,,,296,83', +'63,64,65,8,51,,,752,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27', +'90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81,82', +',38,39,,,,,,,,,,,,,,,,,,,,,,36,,,281,,,52,,,54,,32,,,,40,,,,,,,,18,', +',,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,292', +',,94,93,,84,50,86,85,87,,88,95,96,,81,82,327,,336,334,333,,335,,,,,', +',,,,,,,,,,,,289,,,286,,,52,,,54,,,,,,338,322,,,,,,,341,340,344,343,', +'79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,296,83,61,', +'59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,', +',94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,', +'210,,,214,537,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74', +'80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86', +'85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54', +',32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51', +',53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92', +',,17,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,', +',,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,18,,,,,79,73,75,76', +'77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,23,24', +'66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85,87', +',88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,', +',,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53', +',57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92', +',,219,,,,,,,292,,,94,93,,84,50,86,85,361,,88,95,96,,81,82,327,,336,334', +'333,,335,,,,,,,,,,,,,,,,,,362,,,214,,,52,,,54,,,,,,338,,554,,,,,,341', +'340,344,343,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58', +',296,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,', +',,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,', +',,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,', +',74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67', +',,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87', +',88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,', +',,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,-255,-255,-255,56', +'-255,,53,,-255,-255,,37,83,-255,,-255,-255,-255,-255,-255,-255,-255', +',,,,,-255,-255,-255,-255,-255,-255,-255,,,-255,,,,,,,-255,,,-255,-255', +',-255,-255,-255,-255,-255,-255,-255,-255,-255,,-255,-255,,-255,-255', +',,,,,,,,,,,,,,,,,,,,,-255,,,-255,268,,-255,,,-255,,-255,,-255,,-255', +',,,,,,,-255,,,,,-255,-255,-255,-255,-255,-255,,,,-255,-255,,,,-536,-536', +'-536,-255,-536,,-255,,-536,-536,,-255,-255,-536,,-536,-536,-536,-536', +'-536,-536,-536,,,,,,-536,-536,-536,-536,-536,-536,-536,,,-536,,,,,,', +'-536,,,-536,-536,,-536,-536,-536,-536,-536,-536,-536,-536,-536,,-536', +'-536,,-536,-536,,,,,,,,,,,,,,,,,,,,,,-536,,,-536,-536,,-536,,,-536,', +'-536,,-536,,-536,,,,,,,,-536,,,,,-536,-536,-536,-536,-536,-536,,,,-536', +'-536,,,,-537,-537,-537,-536,-537,,-536,,-537,-537,,-536,-536,-537,,-537', +'-537,-537,-537,-537,-537,-537,,,,,,-537,-537,-537,-537,-537,-537,-537', +',,-537,,,,,,,-537,,,-537,-537,,-537,-537,-537,-537,-537,-537,-537,-537', +'-537,,-537,-537,,-537,-537,,,,,,,,,,,,,,,,,,,,,,-537,,,-537,-537,,-537', +',,-537,,-537,,-537,,-537,,,,,,,,-537,,,,,-537,-537,-537,-537,-537,-537', +',,,-537,-537,,,,-255,-255,-255,-537,-255,,-537,,-255,-255,,-537,-537', +'-255,,-255,-255,-255,-255,-255,-255,-255,,,,,,-255,-255,-255,-255,-255', +'-255,-255,,,-255,,,,,,,-255,,,-255,-255,,-255,-255,-255,-255,-255,-255', +'-255,-255,-255,,-255,-255,,-255,-255,,,,,,,,,,,,,,,,,,,,,,-255,,,-255', +'268,,-255,,,-255,,-255,,-255,,-255,,,,,,,,-255,,,,,-255,-255,-255,-255', +'-255,-255,,,,-255,-255,,,,63,64,65,-255,51,,-255,,57,58,,-255,-255,61', +',59,60,62,258,259,66,67,,,,,,257,28,27,90,89,91,92,,,219,,,,,,,41,,', +'94,93,,84,50,86,85,87,261,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,', +',,210,,,214,,,52,,,54,,256,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,', +',74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67', +',,,,,257,28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,261', +'88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,256', +',,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53', +',57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92', +',,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,', +',,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75', +'76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258', +'259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90', +'89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38', +'39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79', +'73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93', +',84,50,86,85,87,261,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210', +',,214,,,52,,,54,,658,,254,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74', +'80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,', +',,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,261', +'88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,254', +',40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53', +',57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92', +',,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,', +',,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75', +'76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85', +'87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,675,52,,', +'54,,,,254,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53', +',,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22', +'28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96', +',81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,', +',,18,,,,,79,73,75,76,77,78,,,,74,80,,,,,,404,56,,,53,,,,,37,83,63,64', +'65,,51,,,,57,58,,,,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89', +'91,92,,,219,,,,,,,292,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,327,', +'336,334,333,,335,,,,,,,,,,,,,,,,,,289,,,286,,,52,,,54,,,,,,338,,,,,', +',,341,340,344,343,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53', +',57,58,,296,83,61,,59,60,62,258,259,66,67,,,,,,257,28,27,90,89,91,92', +',,219,,,,,,,41,,,94,93,,84,50,86,85,87,261,88,95,96,,81,82,,38,39,,', +',,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,256,,,,40,,,,,,,,218,,,,,79', +'73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,258,259,66,67,,,,,,257,28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,', +'84,50,86,85,87,261,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,', +',214,,,52,,,54,,256,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80', +',,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,', +'257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95', +'96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,', +',,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58', +',37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219', +',,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,', +',,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77', +'78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259', +'66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86', +'85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,', +'54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91', +'92,,,17,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,', +',,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,18,,,,,79,73,75', +'76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258', +'259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,261,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,', +',52,,,54,,658,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63', +'64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291', +'295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,261,88,95,96', +',81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,', +',,218,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65', +'8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92', +',,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,', +',,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75', +'76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,', +'61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9', +'94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36', +',,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,', +',63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257', +'291,295,90,89,91,92,,,219,,,,,,,292,,,94,93,,84,50,86,85,87,,88,95,96', +',81,82,764,,336,334,333,754,335,,,,,,,,,,751,,,,,,,,712,,,214,,,52,', +',54,,,,,,338,,,,,,,,341,340,344,343,,79,73,75,76,77,78,,,,74,80,,,,', +',,56,,,53,,,,,296,83,63,64,65,8,51,,,752,57,58,,,,61,,59,60,62,23,24', +'66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85', +'87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32', +',,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37', +'83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27', +'90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81,82', +',38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,', +',,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,', +',,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,', +',,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,', +',,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75,76,77', +'78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259', +'66,67,,,,,,257,28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85', +'87,261,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,', +'54,,256,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65', +'56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,28,27,90', +'89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,261,88,95,96,,81,82', +',38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,256,,,,40,,,,,,,,218', +',,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,28,27,90,89,91,92,,,219,,,,,,,41,,', +'94,93,,84,50,86,85,87,261,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,', +',,210,,,214,,,52,,,54,,256,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,', +',74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67', +',,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40', +',,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58', +',37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,', +',41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,', +',,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,', +'74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67', +',,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87', +',88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,', +',,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53', +',57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92', +',,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,', +',,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,775,,,,40,,,,,,,,218,,,,,79,73', +'75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62', +'23,24,66,67,,,,,,22,28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91', +'92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,', +',,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73', +'75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62', +'23,24,66,67,,,,,,22,28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90', +'89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38', +'39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79', +'73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214', +',,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56', +',,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,', +',,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40', +',,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58', +',37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219', +',,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,', +',,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77', +'78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59', +'60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30', +',,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64', +'65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295', +'90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,261,88,95,96,,81', +'82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,658,,254,,40,,,', +',,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58', +',37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219', +',,,,,,41,,,94,93,,84,50,86,85,87,261,88,95,96,,81,82,,38,39,,,,,,,,', +',,,,,,,,,,,,,210,,,214,,,52,,,54,,,,254,,40,,,,,,,,218,,,,,79,73,75', +'76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,', +'61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9', +'94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36', +',,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,', +',,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66', +'67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87', +',88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,', +',,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53', +',57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92', +',,219,,,,,,,292,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,,,,,,,,,,', +',,,,,,,,,,,,,289,,,286,,,52,,,54,,,,,,,,,,,,,,,,,,,79,73,75,76,77,78', +',,,74,80,,,,63,64,65,56,51,,53,,57,58,,296,83,61,,59,60,62,258,259,66', +'67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,292,,,94,93,,84,50,86,85', +'87,,88,95,96,,81,82,,,,,,,,,,,,,,,,,,,,,,,,,289,,,286,,,52,,,54,,,,', +',,,,,,,,,,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58', +',296,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219', +',,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,', +',,,,,,,,,,210,,,214,,,52,,,54,,421,,,,40,,,,,,,,218,,,,,79,73,75,76', +'77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258', +'259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,256,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65', +'56,51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89', +'91,92,,,17,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39', +',,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,18,,,,,79,73', +'75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58', +',,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41', +',9,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,', +',,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74', +'80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86', +'85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54', +',32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53,,,', +',37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28', +'27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81', +'82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18', +',,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41', +',,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,', +',210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74', +'80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86', +'85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54', +',32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51', +',53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89', +'91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39', +',,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73', +'75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62', +'23,24,66,67,,,,,,22,28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91', +'92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,', +',,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73', +'75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62', +'258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84', +'50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,', +',52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64', +'65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295', +'90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82', +',38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,', +',,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61', +',59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41', +',,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,', +',210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74', +'80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,', +',,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,256,,', +',40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83', +'63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90', +'89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38', +'39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79', +'73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53', +',,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22', +'28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96', +',81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,', +',,18,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65', +'8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92', +',,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,', +',,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75', +'76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258', +'259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52', +',,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56', +'51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90', +'89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38', +'39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,,,40,,,,,,,,218,,,,,79', +'73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60', +'62,258,259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,41,,,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214', +',,52,,,54,,,,,,40,,,,,,,,218,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64', +'65,56,51,,53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295', +'90,89,91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,261,88,95,96,,81', +'82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,,,254,,40,,,,,,', +',218,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65', +'8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92', +',,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,', +',,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75', +'76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62,258', +'259,66,67,,,,,,257,291,295,90,89,91,92,,,219,,,,,,,292,,,94,93,,84,50', +'86,85,87,,88,95,96,,81,82,,,,,,,,,,,,,,,,,,,,,,,,,926,,,214,,,52,,,54', +',,,,,,,,,,,,,,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,', +'57,58,,296,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89,91,92', +',,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,', +',,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,658,,,,40,,,,,,,,218,,,,,79,73', +'75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58', +',,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41', +',9,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,', +',,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74', +'80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23', +'24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86', +'85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54', +',32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,63,64,65,56,51', +',53,,57,58,,37,83,61,,59,60,62,258,259,66,67,,,,,,257,291,295,90,89', +'91,92,,,219,,,,,,,41,,,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39', +',,,,,,,,,,,,,,,,,,,,,210,,,214,,,52,,,54,,658,,254,,40,,,,,,,,218,,', +',,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,', +',,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,', +',,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,', +',,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75,76,77', +'78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59', +'60,62,23,24,66,67,,,,,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93', +',84,50,86,85,87,,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30', +',,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56', +',,53,,,,,37,83,63,64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,', +',,,22,28,27,90,89,91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88', +'95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40', +',,,,,,,18,,,,,79,73,75,76,77,78,,,,74,80,,,,,,,56,,,53,,,,,37,83,63', +'64,65,8,51,,,,57,58,,,,61,,59,60,62,23,24,66,67,,,,,,22,28,27,90,89', +'91,92,,,17,,,,,,7,41,,9,94,93,,84,50,86,85,87,,88,95,96,,81,82,,38,39', +',,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,,,54,,32,,,,40,,,,,,,,18,,,,,79,73', +'75,76,77,78,,,,74,80,,,,63,64,65,56,51,,53,,57,58,,37,83,61,,59,60,62', +'258,259,66,67,,,,,,257,28,27,90,89,91,92,,,219,,,,,,,41,,,94,93,,84', +'50,86,85,87,261,88,95,96,,81,82,,38,39,,,,,,,,,,,,,,,,,,,,,,210,,,214', +',,52,,,54,,256,,,,40,,,,,,,,218,,,,-538,79,73,75,76,77,78,-538,-538', +'-538,74,80,,-538,-538,,-538,,56,,,53,,,,-538,37,83,,,,,,,,,-538,-538', +',-538,-538,-538,-538,-538,,,,,,,,,,,,,,,,,,,,,,,,-538,-538,-538,-538', +'-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-283,,-538,-538', +'-538,,636,-283,-283,-283,-538,,,-283,-283,,-283,-538,,-538,,-538,-538', +'-538,-538,-538,-538,-538,,-538,-538,-538,,,,,-283,-283,,-283,-283,-283', +'-283,-283,-538,-538,,-87,,-538,,,-538,,-538,,-96,,,,,,,,,,,-283,-283', +'-283,-283,-283,-283,-283,-283,-283,-283,-283,-283,-283,-283,-283,,,-283', +'-283,-283,,639,,,,-283,,,,,,,-283,,-283,,-283,-283,-283,-283,-283,-283', +'-283,,-283,,-283,,,,,,,,,,,,,-283,-283,,-89,,-283,-538,,-283,,-283,', +'-98,-538,-538,-538,,,-538,-538,-538,,-538,,,,,,,,,-538,-538,-538,,,', +',,,,,-538,-538,,-538,-538,-538,-538,-538,,,,,,,,,,,,,,,,,,,,,,,,-538', +'-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538,-538', +',,-538,-538,-538,,790,-538,,,-538,,,-538,,-538,,-538,,-538,,-538,-538', +'-538,-538,-538,-538,-538,,-538,-538,-538,,,,,,,,,,,,,-538,-538,-538', +'-538,,-538,-283,,-538,,-538,,-96,-283,-283,-283,,,-283,-283,-283,,-283', +',,,,,,,,,-283,-283,,,,,,,,,-283,-283,,-283,-283,-283,-283,-283,,,,,', +',,,,,,,,,,,,,,,,,,-283,-283,-283,-283,-283,-283,-283,-283,-283,-283', +'-283,-283,-283,-283,-283,,,-283,-283,-283,,639,-283,,,-283,,,-283,,-283', +',-283,,-283,,-283,-283,-283,-283,-283,-283,-283,,-283,,-283,,,,,,,,', +',,,,-283,-283,-283,-283,,-283,-292,,-283,,-283,,-98,-292,-292,-292,', +',-292,-292,-292,,-292,,,,,,,,,,-292,-292,,,,,,,,,-292,-292,,-292,-292', +'-292,-292,-292,,,,,,,,,,,,,,,,,,,,,,,,-292,-292,-292,-292,-292,-292', +'-292,-292,-292,-292,-292,-292,-292,-292,-292,,,-292,-292,-292,,,-292', +',277,-292,,,-292,,-292,,-292,,-292,,-292,-292,-292,-292,-292,-292,-292', +',-292,,-292,,,,,,,,,,,,,-292,-292,-292,-292,-278,-292,,,-292,,-292,-278', +'-278,-278,,,-278,-278,-278,,-278,,,,,,,,,,-278,-278,-278,,,,,,,,-278', +'-278,,-278,-278,-278,-278,-278,,,,,,,,,,,,,,,,,,,,,,,,-278,-278,-278', +'-278,-278,-278,-278,-278,-278,-278,-278,-278,-278,-278,-278,,,-278,-278', +'-278,,,-278,,,-278,,,-278,,-278,,-278,,-278,,-278,-278,-278,-278,-278', +'-278,-278,,-278,,-278,,,,,,,,,,,,,-278,-278,-278,-278,-554,-278,,-278', +'-278,,-278,-554,-554,-554,,,-554,-554,-554,,-554,,,,,,,,,,-554,,,,,', +',,,,-554,-554,,-554,-554,-554,-554,-554,,,,,,,,,,,,,,-554,,,,,,,-554', +'-554,-554,,,-554,-554,-554,,-554,,,,,-554,-554,,,,-554,,,-554,,,,,268', +'-554,-554,-554,,-554,-554,-554,-554,-554,,,,,764,,336,334,333,754,335', +',-554,,,,,,,,751,,,,-554,-554,,-554,,,-554,-554,-554,-554,-554,-554', +'-554,-554,-554,,-554,,-554,338,749,,,268,-554,,-554,341,340,344,343', +',,,,,-554,-554,,-554,-554,-554,-554,-554,,-554,,,,,,436,440,,,438,,', +'-554,,-554,,,-554,142,143,752,139,121,122,123,130,127,129,,,124,125', +'-554,-554,,,144,145,131,132,-554,,,,,268,-554,,,,,,136,135,,120,141', +'138,137,133,134,128,126,118,140,119,,-554,146,,,,,,,,,,,,-554,,-554', +',,-554,156,167,157,180,153,173,163,162,188,191,178,161,160,155,181,189', +'190,165,154,168,172,174,166,159,,,,175,182,177,176,169,179,164,152,171', +'170,183,184,185,186,187,151,158,149,150,147,148,,111,113,110,,112,,', +',,,,,,142,143,,139,121,122,123,130,127,129,,,124,125,,,,,144,145,131', +'132,,,,,,,,,,,,,136,135,,120,141,138,137,133,134,128,126,118,140,119', +',,146,192,,,,,,,,,,80,156,167,157,180,153,173,163,162,188,191,178,161', +'160,155,181,189,190,165,154,168,172,174,166,159,,,,175,182,177,176,169', +'179,164,152,171,170,183,184,185,186,187,151,158,149,150,147,148,,111', +'113,,,112,,,,,,,,,142,143,,139,121,122,123,130,127,129,,,124,125,,,', +',144,145,131,132,,,,,,,,,,,,,136,135,,120,141,138,137,133,134,128,126', +'118,140,119,,,146,192,,,,,,,,,,80,156,167,157,180,153,173,163,162,188', +'191,178,161,160,155,181,189,190,165,154,168,172,174,166,159,,,,175,182', +'177,176,169,179,164,152,171,170,183,184,185,186,187,151,158,149,150', +'147,148,,111,113,,,112,,,,,,,,,142,143,,139,121,122,123,130,127,129', +',,124,125,,,,,144,145,131,132,,,,,,,,,,,,,136,135,,120,141,138,137,133', +'134,128,126,118,140,119,,,146,192,,,,,,,,,,80,156,167,157,180,153,173', +'163,162,188,191,178,161,160,155,181,189,190,165,154,168,172,174,166', +'159,,,,175,182,177,176,169,179,164,152,171,170,183,184,185,186,187,151', +'158,149,150,147,148,,111,113,,,112,,,,,,,,,142,143,,139,121,122,123', +'130,127,129,,,124,125,,,,,144,145,131,132,,,,,,,,,,,,,136,135,,120,141', +'138,137,133,134,128,126,118,140,119,,,146,192,,,,,,,,,,80,156,167,157', +'180,153,173,163,162,188,191,178,161,160,155,181,189,190,165,154,168', +'172,174,166,159,,,,175,182,177,376,375,377,374,152,171,170,183,184,185', +'186,187,151,158,149,150,372,373,,370,113,86,85,371,,88,,,,,,,142,143', +',139,121,122,123,130,127,129,,,124,125,,,,,144,145,131,132,,,,,,381', +',,,,,,136,135,,120,141,138,137,133,134,128,126,118,140,119,,,146,156', +'167,157,180,153,173,163,162,188,191,178,161,160,155,181,189,190,165', +'154,168,172,174,166,159,,,,175,182,177,176,169,179,164,152,171,170,183', +'184,185,186,187,151,158,149,150,147,148,,111,113,398,397,112,,399,,', +',,,,142,143,,139,121,122,123,130,127,129,,,124,125,,,,,144,145,131,132', +',,,,,,,,,,,,136,135,,120,141,138,137,133,134,128,126,118,140,119,,,146', +'156,167,157,180,153,173,163,162,188,191,178,161,160,155,181,189,190', +'165,154,168,172,174,166,159,,,,175,182,177,176,169,179,164,152,171,170', +'183,184,185,186,187,151,158,149,150,147,148,,111,113,398,397,112,,399', +',,,,,,142,143,,139,121,122,123,130,127,129,,,124,125,,,,,144,145,131', +'132,,,,,,,,,,,,,136,135,,120,141,138,137,133,134,128,126,118,140,119', +',,146,156,167,157,180,153,173,163,162,188,191,178,161,160,155,181,189', +'190,165,154,168,172,174,166,159,,,,175,182,177,176,169,179,164,152,171', +'170,183,184,185,186,187,151,158,149,150,147,148,,111,113,,,112,,,,,', +',,,142,143,,139,121,122,123,130,127,129,,,124,125,,,,,144,145,131,132', +',,,,,,,,,,,,136,135,,120,141,138,137,133,134,128,126,118,140,119,430', +'434,146,,431,,,,,,,,,142,143,,139,121,122,123,130,127,129,,,124,125', +',,,,144,145,131,132,,,,,,268,,,,,,,136,135,,120,141,138,137,133,134', +'128,126,118,140,119,443,434,146,,444,,,,,,,,,142,143,,139,121,122,123', +'130,127,129,,,124,125,,,,,144,145,131,132,,,,,,,,,,,,,136,135,,120,141', +'138,137,133,134,128,126,118,140,119,443,434,146,,444,,,,,,,,,142,143', +',139,121,122,123,130,127,129,,,124,125,,,,,144,145,131,132,,,,,,,,,', +',,,136,135,,120,141,138,137,133,134,128,126,118,140,119,443,434,146', +',444,,,,,,,,,142,143,,139,121,122,123,130,127,129,,,124,125,,,,,144', +'145,131,132,,,,,,,,,,,,,136,135,,120,141,138,137,133,134,128,126,118', +'140,119,443,434,146,,444,,,,,,,,,142,143,,139,121,122,123,130,127,129', +',,124,125,,,,,144,145,131,132,,,,,,,,,,,,,136,135,,120,141,138,137,133', +'134,128,126,118,140,119,642,434,146,,643,,,,,,,,,142,143,,139,121,122', +'123,130,127,129,,,124,125,,,,,144,145,131,132,,,,,,268,,,,,,,136,135', +',120,141,138,137,133,134,128,126,118,140,119,644,440,146,,645,,,,,,', +',,142,143,,139,121,122,123,130,127,129,,,124,125,,,,,144,145,131,132', +',,,,,,,,,,,,136,135,,120,141,138,137,133,134,128,126,118,140,119,686', +'434,146,,687,,,,,,,,,142,143,,139,121,122,123,130,127,129,,,124,125', +',,,,144,145,131,132,,,,,,268,,,,,,,136,135,,120,141,138,137,133,134', +'128,126,118,140,119,689,440,146,,690,,,,,,,,,142,143,,139,121,122,123', +'130,127,129,,,124,125,,,,,144,145,131,132,,,,,,,,,,,,,136,135,,120,141', +'138,137,133,134,128,126,118,140,119,443,434,146,,444,,,,,,,,,142,143', +',139,121,122,123,130,127,129,,,124,125,,,,,144,145,131,132,,,,,,,,,', +',,,136,135,,120,141,138,137,133,134,128,126,118,140,119,642,434,146', +',643,,,,,,,,,142,143,,139,121,122,123,130,127,129,,,124,125,,,,,144', +'145,131,132,,,,,,268,,,,,,,136,135,,120,141,138,137,133,134,128,126', +'118,140,119,644,440,146,,645,,,,,,,,,142,143,,139,121,122,123,130,127', +'129,,,124,125,,,,,144,145,131,132,,,,,,,,,,,,,136,135,,120,141,138,137', +'133,134,128,126,118,140,119,733,434,146,,734,,,,,,,,,142,143,,139,121', +'122,123,130,127,129,,,124,125,,,,,144,145,131,132,,,,,,268,,,,,,,136', +'135,,120,141,138,137,133,134,128,126,118,140,119,735,440,146,,736,,', +',,,,,,142,143,,139,121,122,123,130,127,129,,,124,125,,,,,144,145,131', +'132,,,,,,,,,,,,,136,135,,120,141,138,137,133,134,128,126,118,140,119', +'741,440,146,,739,,,,,,,,,142,143,,139,121,122,123,130,127,129,,,124', +'125,,,,,144,145,131,132,,,,,,,,,,,,,136,135,,120,141,138,137,133,134', +'128,126,118,140,119,443,434,146,,444,,,,,,,,,142,143,,139,121,122,123', +'130,127,129,,,124,125,,,,,144,145,131,132,,,,,,268,,,,,,,136,135,,120', +'141,138,137,133,134,128,126,118,140,119,741,440,146,,892,,,,,,,,,142', +'143,,139,121,122,123,130,127,129,,,124,125,,,,,144,145,131,132,,,,,', +',,,,,,,136,135,,120,141,138,137,133,134,128,126,118,140,119,959,434', +'146,,960,,,,,,,,,142,143,,139,121,122,123,130,127,129,,,124,125,,,,', +'144,145,131,132,,,,,,268,,,,,,,136,135,,120,141,138,137,133,134,128', +'126,118,140,119,961,440,146,,962,,,,,,,,,142,143,,139,121,122,123,130', +'127,129,,,124,125,,,,,144,145,131,132,,,,,,,,,,,,,136,135,,120,141,138', +'137,133,134,128,126,118,140,119,,,146' ] + racc_action_table = arr = ::Array.new(25031, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'0,0,0,0,0,347,321,354,0,0,392,746,746,0,71,0,0,0,0,0,0,0,71,313,852', +'615,313,0,0,0,0,0,0,0,1,852,0,387,26,209,387,485,0,0,0,0,0,0,348,0,0', +'0,0,0,55,0,0,0,497,0,0,357,0,0,587,681,366,370,852,852,733,310,310,392', +'370,485,734,352,838,352,839,604,604,735,889,0,615,615,0,209,896,0,497', +'6,0,615,0,287,387,387,0,746,681,924,26,852,746,9,0,927,948,321,354,0', +'0,0,0,0,0,347,959,347,0,0,347,26,736,17,17,17,0,17,960,0,507,17,17,10', +'0,0,17,55,17,17,17,17,17,17,17,211,735,457,457,11,17,17,17,17,17,17', +'17,310,348,17,348,287,357,348,507,587,17,604,366,17,17,733,17,17,17', +'17,17,734,17,17,17,839,17,17,735,17,17,366,838,736,838,838,366,838,889', +'211,889,371,287,889,896,12,896,457,371,896,961,287,17,20,962,17,17,924', +'17,924,290,17,924,927,948,927,948,17,927,948,967,736,293,383,959,17', +'959,34,577,959,17,17,17,17,17,17,960,525,960,17,17,960,686,578,18,18', +'18,17,18,687,17,314,18,18,314,17,17,18,453,18,18,18,18,18,18,18,698', +'698,508,15,15,18,18,18,18,18,18,18,290,961,18,629,36,962,383,383,383', +'18,293,461,18,18,41,18,18,18,18,18,77,18,18,18,508,18,18,525,18,18,453', +'293,686,841,37,37,961,290,961,687,962,961,962,461,698,962,290,461,461', +'689,577,18,577,629,18,577,967,18,967,807,18,967,78,690,525,578,18,578', +'642,686,578,97,3,525,18,193,687,3,686,18,18,18,18,18,18,687,210,278', +'18,18,212,14,278,22,22,22,18,22,385,18,317,22,22,317,18,18,22,643,22', +'22,22,22,22,22,22,791,689,689,642,792,22,22,22,22,22,22,22,807,213,22', +'690,690,14,841,389,841,22,394,841,22,22,14,22,22,22,22,22,22,22,22,22', +'372,22,22,689,22,22,643,372,385,385,385,351,689,807,791,219,351,690', +'792,251,25,25,807,860,373,374,690,22,25,252,22,373,374,22,860,934,22', +'934,22,255,22,267,22,280,389,389,389,394,394,394,22,83,83,13,13,22,22', +'22,22,22,22,13,282,703,22,22,703,860,860,23,23,23,22,23,597,22,375,23', +'23,597,22,22,23,375,23,23,23,23,23,23,23,283,361,296,296,284,23,23,23', +'23,23,23,23,744,860,23,42,42,744,13,648,13,23,289,42,23,23,291,23,23', +'23,23,23,23,23,23,23,292,23,23,295,23,23,301,648,648,648,648,648,648', +'648,648,648,648,648,361,361,648,648,376,750,648,648,361,23,750,376,23', +'361,302,23,305,42,23,42,23,648,23,648,23,648,648,648,648,648,648,648', +'23,648,361,208,208,23,23,23,23,23,23,208,312,35,23,23,315,648,316,24', +'24,24,23,24,361,23,361,24,24,318,23,23,24,326,24,24,24,24,24,24,24,5', +'5,5,5,5,24,24,24,24,24,24,24,377,35,24,288,288,300,208,377,208,24,35', +'288,24,24,327,24,24,24,24,24,24,24,24,24,329,24,24,330,24,24,342,484', +'484,484,484,484,484,484,484,484,484,484,303,303,484,484,300,110,484', +'484,303,24,110,110,24,300,345,24,353,288,24,288,24,484,24,484,24,484', +'484,484,484,484,484,484,24,484,356,355,355,24,24,24,24,24,24,355,358', +'430,24,24,362,484,484,27,27,27,24,27,303,24,303,27,27,388,24,24,27,391', +'27,27,27,27,27,27,27,279,279,279,279,279,27,27,27,27,27,27,27,410,430', +'27,364,364,416,355,419,355,27,430,364,27,27,422,27,27,27,27,27,27,27', +'27,27,424,27,27,428,27,27,429,419,419,419,419,419,419,419,419,419,419', +'419,589,589,419,419,346,346,419,419,589,27,437,431,27,27,463,27,464', +'364,27,364,27,419,27,419,27,419,419,419,419,419,419,419,27,419,561,561', +'379,27,27,27,27,27,27,379,720,720,27,27,628,419,465,419,431,466,27,858', +'589,27,589,499,858,431,27,27,30,30,30,30,30,855,855,858,30,30,949,949', +'502,30,503,30,30,30,30,30,30,30,509,513,514,628,517,30,30,30,30,30,30', +'30,628,519,30,526,858,858,858,858,30,30,462,30,30,30,529,30,30,30,30', +'30,538,30,30,30,539,30,30,540,30,30,553,19,19,19,19,19,19,19,19,19,19', +'19,462,858,19,19,462,462,19,19,564,30,568,573,30,579,580,30,619,626', +'30,632,30,19,637,19,30,19,19,19,19,19,19,19,30,19,640,711,711,30,30', +'30,30,30,30,711,646,647,30,30,655,19,657,31,31,31,30,31,669,30,673,31', +'31,676,30,30,31,683,31,31,31,31,31,31,31,555,685,688,691,692,31,31,31', +'31,31,31,31,693,696,31,840,840,697,711,699,711,31,704,840,31,31,705', +'31,31,31,31,31,708,31,31,31,710,31,31,712,652,713,652,652,652,714,652', +'555,555,555,555,717,768,768,739,739,768,768,768,722,728,730,739,31,732', +'737,31,739,741,31,742,840,31,840,31,753,757,758,760,652,761,939,762', +'764,767,774,939,652,652,652,652,31,31,31,31,31,31,939,652,795,31,31', +'796,799,801,32,32,32,31,32,739,31,739,32,32,804,31,31,32,805,32,32,32', +'32,32,32,32,824,939,939,939,939,32,32,32,32,32,32,32,925,925,32,680', +'680,680,680,680,925,32,480,806,32,32,811,32,32,32,32,32,814,32,32,32', +'815,32,32,600,939,600,600,600,600,600,830,824,824,824,824,833,843,846', +'480,600,847,848,480,480,480,480,870,32,871,882,32,892,925,32,925,569', +'32,569,569,569,893,569,600,600,898,899,907,909,912,913,600,600,600,600', +'914,32,32,32,32,32,32,915,926,936,32,32,944,953,955,32,956,958,32,,', +'32,,,,,32,32,38,38,38,481,38,,,600,38,38,,,,38,,38,38,38,38,38,38,38', +',,,,,38,38,38,38,38,38,38,,481,38,,,481,481,481,481,38,,,38,38,,38,38', +'38,38,38,,38,38,38,,38,38,,38,38,,249,249,249,249,249,249,249,249,249', +'249,249,,,249,249,,,249,249,,38,,,38,,,38,,,38,,,249,,249,38,249,249', +'249,249,249,249,249,38,249,,,,38,38,38,38,38,38,,,,38,38,,249,,39,39', +'39,38,39,,38,,39,39,,38,38,39,,39,39,39,39,39,39,39,,,,,,39,39,39,39', +'39,39,39,,829,39,829,829,829,,829,,39,,,39,39,,39,39,39,39,39,,39,39', +'39,,39,39,,39,39,,427,427,427,427,427,427,427,427,427,427,427,,,427', +'427,,,427,427,,39,,,39,,,39,,,39,,,427,,427,39,427,427,427,427,427,427', +'427,39,427,,,,39,39,39,39,39,39,,,,39,39,,427,,40,40,40,39,40,,39,,40', +'40,,39,39,40,,40,40,40,40,40,40,40,,,,,,40,40,40,40,40,40,40,,,40,,', +',,,,40,,,40,40,,40,40,40,40,40,,40,40,40,,40,40,,40,40,,446,446,446', +'446,446,446,446,446,446,446,446,,,446,446,,,446,446,,40,,,40,,,40,,', +'40,,,446,,446,40,446,446,446,446,446,446,446,40,446,,,,40,40,40,40,40', +'40,,,,40,40,,446,,52,52,52,40,52,,40,,52,52,,40,40,52,,52,52,52,52,52', +'52,52,,,,,,52,52,52,52,52,52,52,,,52,,,,,,,52,,,52,52,,52,52,52,52,52', +',52,52,52,,52,52,,52,52,,536,536,536,536,536,536,536,536,536,536,536', +',,536,536,,,536,536,,52,,,52,,,52,,,52,,,536,,536,52,536,536,536,536', +'536,536,536,52,536,,,,52,52,52,52,52,52,,,,52,52,,536,,53,53,53,52,53', +',52,,53,53,,52,52,53,,53,53,53,53,53,53,53,,,,,,53,53,53,53,53,53,53', +',,53,,,,,,,53,,,53,53,,53,53,53,53,53,53,53,53,53,,53,53,,53,53,,695', +'695,695,695,695,695,695,695,695,695,695,,,695,695,,,695,695,,53,,,53', +',,53,,,53,,53,695,,695,53,695,695,695,695,695,695,695,53,695,,,,53,53', +'53,53,53,53,,,,53,53,,695,,54,54,54,53,54,,53,,54,54,,53,53,54,,54,54', +'54,54,54,54,54,,,,,,54,54,54,54,54,54,54,,,54,,,,,,,54,,,54,54,,54,54', +'54,54,54,54,54,54,54,,54,54,,54,54,,773,773,773,773,773,773,773,773', +'773,773,773,,,773,773,,,773,773,,54,,,54,,,54,,,54,,,773,,773,54,773', +'773,773,773,773,773,773,54,773,,,,54,54,54,54,54,54,,,,54,54,,773,,57', +'57,57,54,57,,54,,57,57,,54,54,57,,57,57,57,57,57,57,57,,,,,,57,57,57', +'57,57,57,57,,,57,,,,,,,57,,,57,57,,57,57,57,57,57,,57,57,57,,57,57,', +'57,57,,779,779,779,779,779,779,779,779,779,779,779,,,779,779,,,779,779', +',57,,,57,,,57,,,57,,,779,,779,57,779,779,779,779,779,779,779,57,779', +',,,57,57,57,57,57,57,,,,57,57,,779,,58,58,58,57,58,,57,,58,58,,57,57', +'58,,58,58,58,58,58,58,58,,,,,,58,58,58,58,58,58,58,,,58,,,,,,,58,,,58', +'58,,58,58,58,58,58,,58,58,58,,58,58,,58,58,,781,781,781,781,781,781', +'781,781,781,781,781,,,781,781,,,781,781,,58,,,58,,,58,,,58,,,781,,781', +'58,781,781,781,781,781,781,781,58,781,,,,58,58,58,58,58,58,,,,58,58', +',781,,61,61,61,58,61,,58,,61,61,,58,58,61,,61,61,61,61,61,61,61,,,,', +',61,61,61,61,61,61,61,,,61,,,,,,,61,,,61,61,,61,61,61,61,61,,61,61,61', +',61,61,,61,61,,672,672,672,672,672,672,672,672,672,672,672,,,672,672', +',,672,672,,61,,,61,,,61,,,61,,,672,,672,61,672,672,672,672,672,672,672', +'61,672,,,,61,61,61,61,61,61,,,,61,61,61,672,,672,,61,61,,,61,,,,,61', +'61,62,62,62,,62,,,,62,62,,,,62,,62,62,62,62,62,62,62,,,,,,62,62,62,62', +'62,62,62,,,62,,,,,,,62,,,62,62,,62,62,62,62,62,,62,62,62,,62,62,784', +'784,784,784,784,784,784,784,784,784,784,467,,784,784,,,784,784,,,,,', +'62,,,62,467,467,62,,784,62,784,62,784,784,784,784,784,784,784,467,784', +'467,,467,467,467,467,,62,62,62,62,62,62,,,784,62,62,,,,63,63,63,62,63', +',62,,63,63,,62,62,63,,63,63,63,63,63,63,63,,,,,,63,63,63,63,63,63,63', +',,63,,,,,,,63,,,63,63,,63,63,63,63,63,,63,63,63,,63,63,786,786,786,786', +'786,786,786,786,786,786,786,468,,786,786,,,786,786,,,63,,,63,,,63,468', +'468,63,,786,63,786,,786,786,786,786,786,786,786,468,786,468,,468,468', +'468,468,,63,63,63,63,63,63,,,786,63,63,,,,84,84,84,63,84,,63,,84,84', +',63,63,84,,84,84,84,84,84,84,84,,84,,,,84,84,84,84,84,84,84,,,84,,,', +',,,84,,,84,84,,84,84,84,84,84,84,84,84,84,,84,84,,84,84,,793,793,793', +'793,793,793,793,793,793,793,793,,,793,793,,,793,793,,84,,,84,84,,84', +',,84,,84,793,84,793,84,793,793,793,793,793,793,793,84,793,84,,,84,84', +'84,84,84,84,,,,84,84,,793,,87,87,87,84,87,,84,,87,87,,84,84,87,,87,87', +'87,87,87,87,87,,87,,,,87,87,87,87,87,87,87,,,87,,,,,,,87,,,87,87,,87', +'87,87,87,87,87,87,87,87,,87,87,,87,87,,873,873,873,873,873,873,873,873', +'873,873,873,,,873,873,,,873,873,,87,,,87,87,,87,,,87,,87,873,87,873', +'87,873,873,873,873,873,873,873,87,873,87,,,87,87,87,87,87,87,,,,87,87', +',873,,,,,87,,,87,,,,,87,87,99,99,99,99,99,,,,99,99,,,,99,,99,99,99,99', +'99,99,99,,,,,,99,99,99,99,99,99,99,,,99,,,,,,99,99,99,99,99,99,,99,99', +'99,99,99,,99,99,99,,99,99,,99,99,,875,875,875,875,875,875,875,875,875', +'875,875,,,875,875,,,875,875,,99,,,99,,,99,,,99,,99,875,,875,99,875,875', +'875,875,875,875,875,99,875,,,,99,99,99,99,99,99,,,,99,99,,875,,,,99', +'99,,,99,,,,,99,99,103,103,103,,103,,,,103,103,,,,103,,103,103,103,103', +'103,103,103,,,,,,103,103,103,103,103,103,103,,338,103,338,338,338,,338', +',103,,,103,103,,103,103,103,103,103,,103,103,103,,103,103,,103,103,566', +',566,566,566,,566,,,718,338,718,718,718,,718,,,338,,,103,,,103,,,103', +',,103,,,,,,103,,,566,,,,,103,,,566,718,103,103,103,103,103,103,,718', +',103,103,,,,104,104,104,103,104,,103,,104,104,,103,103,104,,104,104', +'104,104,104,104,104,,,,,,104,104,104,104,104,104,104,,,104,,,,,,,104', +',,104,104,,104,104,104,104,104,,104,104,104,,104,104,,104,104,,459,459', +'459,459,459,459,459,459,459,459,459,,,459,459,,,459,459,,104,,,104,', +',104,,,104,,,459,,459,104,459,459,459,459,459,459,459,104,459,,,,104', +'104,104,104,104,104,,,,104,104,,,,105,105,105,104,105,,104,,105,105', +',104,104,105,,105,105,105,105,105,105,105,,,,,,105,105,105,105,105,105', +'105,,,105,,,,,,,105,,,105,105,,105,105,105,105,105,,105,105,105,,105', +'105,,105,105,,460,460,460,460,460,460,460,460,460,460,460,,,460,460', +',,460,460,,105,,,105,,,105,,,105,,,460,,460,105,460,460,460,460,460', +'460,460,105,460,,,,105,105,105,105,105,105,,,,105,105,,,,106,106,106', +'105,106,,105,,106,106,,105,105,106,,106,106,106,106,106,106,106,,,,', +',106,106,106,106,106,106,106,,,106,,,,,,,106,,,106,106,,106,106,106', +'106,106,,106,106,106,,106,106,,106,106,,470,470,470,470,470,470,470', +',,470,470,,,,,,,470,470,,106,,,106,,,106,,,106,,,470,,470,106,470,470', +'470,470,470,470,470,106,470,,,,106,106,106,106,106,106,,,,106,106,,', +',,,,106,,,106,,,,,106,106,107,107,107,107,107,,,,107,107,,,,107,,107', +'107,107,107,107,107,107,,,,,,107,107,107,107,107,107,107,,,107,,,,,', +'107,107,,107,107,107,,107,107,107,107,107,,107,107,107,,107,107,,107', +'107,,471,,,,,,,,,,,,,,,,,471,471,,107,,,107,,,107,,,107,,107,471,,471', +'107,471,471,471,471,,,471,107,471,,,,107,107,107,107,107,107,,,,107', +'107,,,,,,,107,,,107,,,,,107,107,108,108,108,108,108,,,,108,108,,,,108', +',108,108,108,108,108,108,108,,,,,,108,108,108,108,108,108,108,,,108', +',,,,,108,108,108,108,108,108,,108,108,108,108,108,,108,108,108,,108', +'108,,108,108,,472,,,,,,,,,,,,,,,,,472,472,,108,,,108,,,108,,,108,,108', +'472,,472,108,472,472,472,472,,,472,108,472,,,,108,108,108,108,108,108', +',,,108,108,,,,,,,108,,,108,,,,,108,108,195,195,195,195,195,,,,195,195', +',,,195,,195,195,195,195,195,195,195,,,,,,195,195,195,195,195,195,195', +',,195,,,,,,195,195,,195,195,195,,195,195,195,195,195,,195,195,195,,195', +'195,,195,195,,473,,,,,,,,,,,,,,,,,473,473,,195,,,195,,,195,,,195,,195', +'473,,473,195,473,473,473,473,,,473,195,473,,,,195,195,195,195,195,195', +',,,195,195,,,,196,196,196,195,196,,195,,196,196,,195,195,196,,196,196', +'196,196,196,196,196,,,,,,196,196,196,196,196,196,196,,,196,,,,,,,196', +',,196,196,,196,196,196,196,196,,196,196,196,,196,196,,196,196,,474,', +',,,,,,,,,,,,,,,474,474,,196,,,196,,,196,,,196,,196,474,,474,196,474', +'474,474,474,,,474,196,474,,,,196,196,196,196,196,196,,,,196,196,,,,197', +'197,197,196,197,,196,,197,197,,196,196,197,,197,197,197,197,197,197', +'197,,,,,,197,197,197,197,197,197,197,,,197,,,,,,,197,,,197,197,,197', +'197,197,197,197,,197,197,197,,197,197,,197,197,,475,475,475,475,475', +'475,475,,,475,475,,,,,,,475,475,,197,,,197,,,197,,,197,,197,475,,475', +'197,475,475,475,475,475,475,475,197,475,,,,197,197,197,197,197,197,', +',,197,197,,,,198,198,198,197,198,,197,,198,198,,197,197,198,,198,198', +'198,198,198,198,198,,,,,,198,198,198,198,198,198,198,,,198,,,,,,,198', +',,198,198,,198,198,198,198,198,,198,198,198,,198,198,,198,198,,476,476', +'476,476,476,476,476,,,476,476,,,,,,,476,476,,198,,,198,,,198,,,198,', +',476,,476,198,476,476,476,476,476,476,476,198,476,,,,198,198,198,198', +'198,198,,,,198,198,,,,199,199,199,198,199,,198,,199,199,,198,198,199', +',199,199,199,199,199,199,199,,,,,,199,199,199,199,199,199,199,,,199', +',,,,,,199,,,199,199,,199,199,199,199,199,199,199,199,199,,199,199,,199', +'199,,477,477,477,477,477,477,477,,,477,477,,,,,,,477,477,,199,,,199', +',,199,,,199,,199,477,,477,199,477,477,477,477,477,477,477,199,477,,', +',199,199,199,199,199,199,,,,199,199,,,,200,200,200,199,200,,199,,200', +'200,,199,199,200,,200,200,200,200,200,200,200,,,,,,200,200,200,200,200', +'200,200,,,200,,,,,,,200,,,200,200,,200,200,200,200,200,200,200,200,200', +',200,200,,200,200,,478,478,478,478,478,478,478,,,478,478,,,,,,,478,478', +',200,,,200,,,200,,,200,,200,478,,478,200,478,478,478,478,478,478,478', +'200,478,,,,200,200,200,200,200,200,,,,200,200,,,,204,204,204,200,204', +',200,,204,204,,200,200,204,,204,204,204,204,204,204,204,,,,,,204,204', +'204,204,204,204,204,,,204,,,,,,,204,,,204,204,,204,204,204,204,204,', +'204,204,204,,204,204,,204,204,,479,479,479,479,479,479,479,,,479,479', +',,,,,,479,479,,204,,,204,,,204,,,204,,,479,,479,204,479,479,479,479', +'479,479,479,204,479,,,,204,204,204,204,204,204,,,,204,204,,,,205,205', +'205,204,205,,204,,205,205,,204,204,205,,205,205,205,205,205,205,205', +',,,,,205,205,205,205,205,205,205,,,205,,,,,,,205,,,205,205,,205,205', +'205,205,205,,205,205,205,,205,205,,205,205,,482,482,482,482,482,482', +'482,,,482,482,,,,,,,482,482,,205,,,205,,,205,,,205,,,482,,482,205,482', +'482,482,482,482,482,482,205,482,,,,205,205,205,205,205,205,,,,205,205', +',,,206,206,206,205,206,,205,,206,206,,205,205,206,,206,206,206,206,206', +'206,206,,,,,,206,206,206,206,206,206,206,,,206,,,,,,,206,,,206,206,', +'206,206,206,206,206,,206,206,206,,206,206,,206,206,,483,483,483,483', +'483,483,483,483,,483,483,,,,,,,483,483,,206,,,206,,,206,,,206,,,483', +',483,206,483,483,483,483,483,483,483,206,483,,,,206,206,206,206,206', +'206,,,,206,206,,,,,,,206,,,206,,,,,206,206,214,214,214,214,214,,,,214', +'214,,,,214,,214,214,214,214,214,214,214,,,,,,214,214,214,214,214,214', +'214,,,214,,,,,,214,214,,214,214,214,,214,214,214,214,214,,214,214,214', +',214,214,,214,214,,469,,,,,,,,,,,,,,,,,469,469,,214,,,214,,,214,,,214', +',214,469,,,214,469,469,469,469,,,,214,,,,,214,214,214,214,214,214,,', +',214,214,,,,215,215,215,214,215,,214,,215,215,,214,214,215,,215,215', +'215,215,215,215,215,,,,,,215,215,215,215,215,215,215,,,215,,,,,,,215', +',,215,215,,215,215,215,215,215,,215,215,215,,215,215,,215,215,,,,,,', +',,,,,,,,,,,,,,,215,,,215,,215,215,,,215,,,,,,215,,,,,,,,215,,,,,215', +'215,215,215,215,215,,,,215,215,,,,218,218,218,215,218,,215,,218,218', +',215,215,218,,218,218,218,218,218,218,218,,,,,,218,218,218,218,218,218', +'218,,,218,,,,,,,218,,,218,218,,218,218,218,218,218,,218,218,218,,218', +'218,,218,218,,,,,,,,,,,,,,,,,,,,,,218,,,218,,,218,,,218,,,,,,218,,,', +',,,,218,,,,,218,218,218,218,218,218,,,,218,218,,,,220,220,220,218,220', +',218,,220,220,,218,218,220,,220,220,220,220,220,220,220,,,,,,220,220', +'220,220,220,220,220,,,220,,,,,,,220,,,220,220,,220,220,220,220,220,', +'220,220,220,,220,220,,220,220,,,,,,,,,,,,,,,,,,,,,,220,,,220,,,220,', +',220,,,,,,220,,,,,,,,220,,,,,220,220,220,220,220,220,,,,220,220,,,,221', +'221,221,220,221,,220,,221,221,,220,220,221,,221,221,221,221,221,221', +'221,,,,,,221,221,221,221,221,221,221,,,221,,,,,,,221,,,221,221,,221', +'221,221,221,221,,221,221,221,,221,221,,221,221,,,,,,,,,,,,,,,,,,,,,', +'221,,,221,,,221,,,221,,,,,,221,,,,,,,,221,,,,,221,221,221,221,221,221', +',,,221,221,,,,222,222,222,221,222,,221,,222,222,,221,221,222,,222,222', +'222,222,222,222,222,,,,,,222,222,222,222,222,222,222,,,222,,,,,,,222', +',,222,222,,222,222,222,222,222,,222,222,222,,222,222,,222,222,,,,,,', +',,,,,,,,,,,,,,,222,,,222,,,222,,,222,,,,,,222,,,,,,,,222,,,,,222,222', +'222,222,222,222,,,,222,222,,,,223,223,223,222,223,,222,,223,223,,222', +'222,223,,223,223,223,223,223,223,223,,,,,,223,223,223,223,223,223,223', +',,223,,,,,,,223,,,223,223,,223,223,223,223,223,,223,223,223,,223,223', +',223,223,,,,,,,,,,,,,,,,,,,,,,223,,,223,,,223,,,223,,,,,,223,,,,,,,', +'223,,,,,223,223,223,223,223,223,,,,223,223,,,,224,224,224,223,224,,223', +',224,224,,223,223,224,,224,224,224,224,224,224,224,,,,,,224,224,224', +'224,224,224,224,,,224,,,,,,,224,,,224,224,,224,224,224,224,224,,224', +'224,224,,224,224,,224,224,,,,,,,,,,,,,,,,,,,,,,224,,,224,,,224,,,224', +',,,,,224,,,,,,,,224,,,,,224,224,224,224,224,224,,,,224,224,,,,225,225', +'225,224,225,,224,,225,225,,224,224,225,,225,225,225,225,225,225,225', +',,,,,225,225,225,225,225,225,225,,,225,,,,,,,225,,,225,225,,225,225', +'225,225,225,,225,225,225,,225,225,,225,225,,,,,,,,,,,,,,,,,,,,,,225', +',,225,,,225,,,225,,,,,,225,,,,,,,,225,,,,,225,225,225,225,225,225,,', +',225,225,,,,226,226,226,225,226,,225,,226,226,,225,225,226,,226,226', +'226,226,226,226,226,,,,,,226,226,226,226,226,226,226,,,226,,,,,,,226', +',,226,226,,226,226,226,226,226,,226,226,226,,226,226,,226,226,,,,,,', +',,,,,,,,,,,,,,,226,,,226,,,226,,,226,,,,,,226,,,,,,,,226,,,,,226,226', +'226,226,226,226,,,,226,226,,,,227,227,227,226,227,,226,,227,227,,226', +'226,227,,227,227,227,227,227,227,227,,,,,,227,227,227,227,227,227,227', +',,227,,,,,,,227,,,227,227,,227,227,227,227,227,,227,227,227,,227,227', +',227,227,,,,,,,,,,,,,,,,,,,,,,227,,,227,,,227,,,227,,,,,,227,,,,,,,', +'227,,,,,227,227,227,227,227,227,,,,227,227,,,,228,228,228,227,228,,227', +',228,228,,227,227,228,,228,228,228,228,228,228,228,,,,,,228,228,228', +'228,228,228,228,,,228,,,,,,,228,,,228,228,,228,228,228,228,228,,228', +'228,228,,228,228,,228,228,,,,,,,,,,,,,,,,,,,,,,228,,,228,,,228,,,228', +',,,,,228,,,,,,,,228,,,,,228,228,228,228,228,228,,,,228,228,,,,229,229', +'229,228,229,,228,,229,229,,228,228,229,,229,229,229,229,229,229,229', +',,,,,229,229,229,229,229,229,229,,,229,,,,,,,229,,,229,229,,229,229', +'229,229,229,,229,229,229,,229,229,,229,229,,,,,,,,,,,,,,,,,,,,,,229', +',,229,,,229,,,229,,,,,,229,,,,,,,,229,,,,,229,229,229,229,229,229,,', +',229,229,,,,230,230,230,229,230,,229,,230,230,,229,229,230,,230,230', +'230,230,230,230,230,,,,,,230,230,230,230,230,230,230,,,230,,,,,,,230', +',,230,230,,230,230,230,230,230,,230,230,230,,230,230,,230,230,,,,,,', +',,,,,,,,,,,,,,,230,,,230,,,230,,,230,,,,,,230,,,,,,,,230,,,,,230,230', +'230,230,230,230,,,,230,230,,,,231,231,231,230,231,,230,,231,231,,230', +'230,231,,231,231,231,231,231,231,231,,,,,,231,231,231,231,231,231,231', +',,231,,,,,,,231,,,231,231,,231,231,231,231,231,,231,231,231,,231,231', +',231,231,,,,,,,,,,,,,,,,,,,,,,231,,,231,,,231,,,231,,,,,,231,,,,,,,', +'231,,,,,231,231,231,231,231,231,,,,231,231,,,,232,232,232,231,232,,231', +',232,232,,231,231,232,,232,232,232,232,232,232,232,,,,,,232,232,232', +'232,232,232,232,,,232,,,,,,,232,,,232,232,,232,232,232,232,232,,232', +'232,232,,232,232,,232,232,,,,,,,,,,,,,,,,,,,,,,232,,,232,,,232,,,232', +',,,,,232,,,,,,,,232,,,,,232,232,232,232,232,232,,,,232,232,,,,233,233', +'233,232,233,,232,,233,233,,232,232,233,,233,233,233,233,233,233,233', +',,,,,233,233,233,233,233,233,233,,,233,,,,,,,233,,,233,233,,233,233', +'233,233,233,,233,233,233,,233,233,,233,233,,,,,,,,,,,,,,,,,,,,,,233', +',,233,,,233,,,233,,,,,,233,,,,,,,,233,,,,,233,233,233,233,233,233,,', +',233,233,,,,234,234,234,233,234,,233,,234,234,,233,233,234,,234,234', +'234,234,234,234,234,,,,,,234,234,234,234,234,234,234,,,234,,,,,,,234', +',,234,234,,234,234,234,234,234,,234,234,234,,234,234,,234,234,,,,,,', +',,,,,,,,,,,,,,,234,,,234,,,234,,,234,,,,,,234,,,,,,,,234,,,,,234,234', +'234,234,234,234,,,,234,234,,,,235,235,235,234,235,,234,,235,235,,234', +'234,235,,235,235,235,235,235,235,235,,,,,,235,235,235,235,235,235,235', +',,235,,,,,,,235,,,235,235,,235,235,235,235,235,,235,235,235,,235,235', +',235,235,,,,,,,,,,,,,,,,,,,,,,235,,,235,,,235,,,235,,,,,,235,,,,,,,', +'235,,,,,235,235,235,235,235,235,,,,235,235,,,,236,236,236,235,236,,235', +',236,236,,235,235,236,,236,236,236,236,236,236,236,,,,,,236,236,236', +'236,236,236,236,,,236,,,,,,,236,,,236,236,,236,236,236,236,236,,236', +'236,236,,236,236,,236,236,,,,,,,,,,,,,,,,,,,,,,236,,,236,,,236,,,236', +',,,,,236,,,,,,,,236,,,,,236,236,236,236,236,236,,,,236,236,,,,237,237', +'237,236,237,,236,,237,237,,236,236,237,,237,237,237,237,237,237,237', +',,,,,237,237,237,237,237,237,237,,,237,,,,,,,237,,,237,237,,237,237', +'237,237,237,,237,237,237,,237,237,,237,237,,,,,,,,,,,,,,,,,,,,,,237', +',,237,,,237,,,237,,,,,,237,,,,,,,,237,,,,,237,237,237,237,237,237,,', +',237,237,,,,238,238,238,237,238,,237,,238,238,,237,237,238,,238,238', +'238,238,238,238,238,,,,,,238,238,238,238,238,238,238,,,238,,,,,,,238', +',,238,238,,238,238,238,238,238,,238,238,238,,238,238,,238,238,,,,,,', +',,,,,,,,,,,,,,,238,,,238,,,238,,,238,,,,,,238,,,,,,,,238,,,,,238,238', +'238,238,238,238,,,,238,238,,,,239,239,239,238,239,,238,,239,239,,238', +'238,239,,239,239,239,239,239,239,239,,,,,,239,239,239,239,239,239,239', +',,239,,,,,,,239,,,239,239,,239,239,239,239,239,,239,239,239,,239,239', +',239,239,,,,,,,,,,,,,,,,,,,,,,239,,,239,,,239,,,239,,,,,,239,,,,,,,', +'239,,,,,239,239,239,239,239,239,,,,239,239,,,,240,240,240,239,240,,239', +',240,240,,239,239,240,,240,240,240,240,240,240,240,,,,,,240,240,240', +'240,240,240,240,,,240,,,,,,,240,,,240,240,,240,240,240,240,240,,240', +'240,240,,240,240,,240,240,,,,,,,,,,,,,,,,,,,,,,240,,,240,,,240,,,240', +',,,,,240,,,,,,,,240,,,,,240,240,240,240,240,240,,,,240,240,,,,241,241', +'241,240,241,,240,,241,241,,240,240,241,,241,241,241,241,241,241,241', +',,,,,241,241,241,241,241,241,241,,,241,,,,,,,241,,,241,241,,241,241', +'241,241,241,,241,241,241,,241,241,,241,241,,,,,,,,,,,,,,,,,,,,,,241', +',,241,,,241,,,241,,,,,,241,,,,,,,,241,,,,,241,241,241,241,241,241,,', +',241,241,,,,242,242,242,241,242,,241,,242,242,,241,241,242,,242,242', +'242,242,242,242,242,,,,,,242,242,242,242,242,242,242,,,242,,,,,,,242', +',,242,242,,242,242,242,242,242,,242,242,242,,242,242,,242,242,,,,,,', +',,,,,,,,,,,,,,,242,,,242,,,242,,,242,,,,,,242,,,,,,,,242,,,,,242,242', +'242,242,242,242,,,,242,242,,,,243,243,243,242,243,,242,,243,243,,242', +'242,243,,243,243,243,243,243,243,243,,,,,,243,243,243,243,243,243,243', +',,243,,,,,,,243,,,243,243,,243,243,243,243,243,,243,243,243,,243,243', +',243,243,,,,,,,,,,,,,,,,,,,,,,243,,,243,,,243,,,243,,,,,,243,,,,,,,', +'243,,,,,243,243,243,243,243,243,,,,243,243,,,,244,244,244,243,244,,243', +',244,244,,243,243,244,,244,244,244,244,244,244,244,,,,,,244,244,244', +'244,244,244,244,,,244,,,,,,,244,,,244,244,,244,244,244,244,244,,244', +'244,244,,244,244,,244,244,,,,,,,,,,,,,,,,,,,,,,244,,,244,,,244,,,244', +',,,,,244,,,,,,,,244,,,,,244,244,244,244,244,244,,,,244,244,,,,245,245', +'245,244,245,,244,,245,245,,244,244,245,,245,245,245,245,245,245,245', +',,,,,245,245,245,245,245,245,245,,,245,,,,,,,245,,,245,245,,245,245', +'245,245,245,,245,245,245,,245,245,,245,245,,,,,,,,,,,,,,,,,,,,,,245', +',,245,,,245,,,245,,,,,,245,,,,,,,,245,,,,,245,245,245,245,245,245,,', +',245,245,,,,254,254,254,245,254,,245,,254,254,,245,245,254,,254,254', +'254,254,254,254,254,,,,,,254,254,254,254,254,254,254,,,254,,,,,,,254', +',,254,254,,254,254,254,254,254,,254,254,254,,254,254,,254,254,,,,,,', +',,,,,,,,,,,,,,,254,,,254,,,254,,,254,,,,,,254,,,,,,,,254,,,,,254,254', +'254,254,254,254,,,,254,254,,,,256,256,256,254,256,,254,,256,256,,254', +'254,256,,256,256,256,256,256,256,256,,,,,,256,256,256,256,256,256,256', +',,256,,,,,,,256,,,256,256,,256,256,256,256,256,,256,256,256,,256,256', +',256,256,,,,,,,,,,,,,,,,,,,,,,256,,,256,,,256,,,256,,,,,,256,,,,,,,', +'256,,,,,256,256,256,256,256,256,,,,256,256,,,,261,261,261,256,261,,256', +',261,261,,256,256,261,,261,261,261,261,261,261,261,,,,,,261,261,261', +'261,261,261,261,,,261,,,,,,,261,,,261,261,,261,261,261,261,261,,261', +'261,261,,261,261,,261,261,,,,,,,,,,,,,,,,,,,,,,261,,,261,,,261,,,261', +',,,,,261,,,,,,,,261,,,,,261,261,261,261,261,261,,,,261,261,,,,268,268', +'268,261,268,,261,,268,268,,261,261,268,,268,268,268,268,268,268,268', +',,,,,268,268,268,268,268,268,268,,,268,,,,,,,268,,,268,268,,268,268', +'268,268,268,268,268,268,268,,268,268,,268,268,,,,,,,,,,,,,,,,,,,,,,268', +',,268,,,268,,,268,,268,,268,,268,,,,,,,,268,,,,,268,268,268,268,268', +'268,,,,268,268,,,,269,269,269,268,269,,268,,269,269,,268,268,269,,269', +'269,269,269,269,269,269,,,,,,269,269,269,269,269,269,269,,,269,,,,,', +',269,,,269,269,,269,269,269,269,269,269,269,269,269,,269,269,,269,269', +',,,,,,,,,,,,,,,,,,,,,269,,,269,,,269,,,269,,269,,269,,269,,,,,,,,269', +',,,,269,269,269,269,269,269,,,,269,269,,,,277,277,277,269,277,,269,', +'277,277,,269,269,277,,277,277,277,277,277,277,277,,,,,,277,277,277,277', +'277,277,277,,,277,,,,,,,277,,,277,277,,277,277,277,277,277,277,277,277', +'277,,277,277,,277,277,,,,,,,,,,,,,,,,,,,,,,277,,,277,,277,277,,,277', +',277,,277,,277,,,,,,,,277,,,,,277,277,277,277,277,277,,,,277,277,,,', +',,,277,,,277,,,,,277,277,281,281,281,281,281,,,,281,281,,,,281,,281', +'281,281,281,281,281,281,,,,,,281,281,281,281,281,281,281,,,281,,,,,', +'281,281,,281,281,281,,281,281,281,281,281,,281,281,281,,281,281,,281', +'281,,,,,,,,,,,,,,,,,,,,,,281,,,281,,,281,,,281,,281,,,,281,,,,,,,,281', +',,,,281,281,281,281,281,281,,,,281,281,,,,285,285,285,281,285,,281,', +'285,285,,281,281,285,,285,285,285,285,285,285,285,,,,,,285,285,285,285', +'285,285,285,,,285,,,,,,,285,,,285,285,,285,285,285,285,285,,285,285', +'285,,285,285,749,,749,749,749,749,749,,,,,,,,,,749,,,,,,,,285,,,285', +',,285,,,285,,,,,,749,,,,,,,,749,749,749,749,,285,285,285,285,285,285', +',,,285,285,,,,285,,,285,,,285,,,,,285,285,286,286,286,286,286,,,749', +'286,286,,,,286,,286,286,286,286,286,286,286,,,,,,286,286,286,286,286', +'286,286,,,286,,,,,,286,286,,286,286,286,,286,286,286,286,286,,286,286', +'286,,286,286,,286,286,,,,,,,,,,,,,,,,,,,,,,286,,,286,,,286,,,286,,286', +',,,286,,,,,,,,286,,,,,286,286,286,286,286,286,,,,286,286,,,,298,298', +'298,286,298,,286,,298,298,,286,286,298,,298,298,298,298,298,298,298', +',,,,,298,298,298,298,298,298,298,,,298,,,,,,,298,,,298,298,,298,298', +'298,298,298,,298,298,298,,298,298,56,,56,56,56,,56,,,,,,,,,,,,,,,,,', +'298,,,298,,,298,,,298,,,,,,56,56,,,,,,,56,56,56,56,,298,298,298,298', +'298,298,,,,298,298,,,,307,307,307,298,307,,298,,307,307,,298,298,307', +',307,307,307,307,307,307,307,,,,,,307,307,307,307,307,307,307,,,307', +',,,,,,307,,,307,307,,307,307,307,307,307,,307,307,307,,307,307,,307', +'307,,,,,,,,,,,,,,,,,,,,,,307,,,307,307,,307,,,307,,,,,,307,,,,,,,,307', +',,,,307,307,307,307,307,307,,,,307,307,,,,,,,307,,,307,,,,,307,307,309', +'309,309,309,309,,,,309,309,,,,309,,309,309,309,309,309,309,309,,,,,', +'309,309,309,309,309,309,309,,,309,,,,,,309,309,,309,309,309,,309,309', +'309,309,309,,309,309,309,,309,309,,309,309,,,,,,,,,,,,,,,,,,,,,,309', +',,309,,,309,,,309,,309,,,,309,,,,,,,,309,,,,,309,309,309,309,309,309', +',,,309,309,,,,349,349,349,309,349,,309,,349,349,,309,309,349,,349,349', +'349,349,349,349,349,,,,,,349,349,349,349,349,349,349,,,349,,,,,,,349', +',,349,349,,349,349,349,349,349,,349,349,349,,349,349,,349,349,,,,,,', +',,,,,,,,,,,,,,,349,,,349,,,349,,,349,,,,,,349,,,,,,,,349,,,,,349,349', +'349,349,349,349,,,,349,349,,,,350,350,350,349,350,,349,,350,350,,349', +'349,350,,350,350,350,350,350,350,350,,,,,,350,350,350,350,350,350,350', +',,350,,,,,,,350,,,350,350,,350,350,350,350,350,,350,350,350,,350,350', +',350,350,,,,,,,,,,,,,,,,,,,,,,350,,,350,,,350,,,350,,,,,,350,,,,,,,', +'350,,,,,350,350,350,350,350,350,,,,350,350,,,,369,369,369,350,369,,350', +',369,369,,350,350,369,,369,369,369,369,369,369,369,,,,,,369,369,369', +'369,369,369,369,,,369,,,,,,,369,,,369,369,,369,369,369,369,369,,369', +'369,369,,369,369,322,,322,322,322,,322,,,,,,,,,,,,,,,,,,369,,,369,,', +'369,,,369,,,,,,322,,322,,,,,,322,322,322,322,,369,369,369,369,369,369', +',,,369,369,,,,381,381,381,369,381,,369,,381,381,,369,369,381,,381,381', +'381,381,381,381,381,,,,,,381,381,381,381,381,381,381,,,381,,,,,,,381', +',,381,381,,381,381,381,381,381,,381,381,381,,381,381,,381,381,,,,,,', +',,,,,,,,,,,,,,,381,,,381,,,381,,,381,,,,,,381,,,,,,,,381,,,,,381,381', +'381,381,381,381,,,,381,381,,,,421,421,421,381,421,,381,,421,421,,381', +'381,421,,421,421,421,421,421,421,421,,,,,,421,421,421,421,421,421,421', +',,421,,,,,,,421,,,421,421,,421,421,421,421,421,,421,421,421,,421,421', +',421,421,,,,,,,,,,,,,,,,,,,,,,421,,,421,,,421,,,421,,,,,,421,,,,,,,', +'421,,,,,421,421,421,421,421,421,,,,421,421,,,,432,432,432,421,432,,421', +',432,432,,421,421,432,,432,432,432,432,432,432,432,,,,,,432,432,432', +'432,432,432,432,,,432,,,,,,,432,,,432,432,,432,432,432,432,432,432,432', +'432,432,,432,432,,432,432,,,,,,,,,,,,,,,,,,,,,,432,,,432,432,,432,,', +'432,,432,,432,,432,,,,,,,,432,,,,,432,432,432,432,432,432,,,,432,432', +',,,440,440,440,432,440,,432,,440,440,,432,432,440,,440,440,440,440,440', +'440,440,,,,,,440,440,440,440,440,440,440,,,440,,,,,,,440,,,440,440,', +'440,440,440,440,440,440,440,440,440,,440,440,,440,440,,,,,,,,,,,,,,', +',,,,,,,440,,,440,440,,440,,,440,,440,,440,,440,,,,,,,,440,,,,,440,440', +'440,440,440,440,,,,440,440,,,,441,441,441,440,441,,440,,441,441,,440', +'440,441,,441,441,441,441,441,441,441,,,,,,441,441,441,441,441,441,441', +',,441,,,,,,,441,,,441,441,,441,441,441,441,441,441,441,441,441,,441', +'441,,441,441,,,,,,,,,,,,,,,,,,,,,,441,,,441,441,,441,,,441,,441,,441', +',441,,,,,,,,441,,,,,441,441,441,441,441,441,,,,441,441,,,,442,442,442', +'441,442,,441,,442,442,,441,441,442,,442,442,442,442,442,442,442,,,,', +',442,442,442,442,442,442,442,,,442,,,,,,,442,,,442,442,,442,442,442', +'442,442,442,442,442,442,,442,442,,442,442,,,,,,,,,,,,,,,,,,,,,,442,', +',442,442,,442,,,442,,442,,442,,442,,,,,,,,442,,,,,442,442,442,442,442', +'442,,,,442,442,,,,451,451,451,442,451,,442,,451,451,,442,442,451,,451', +'451,451,451,451,451,451,,,,,,451,451,451,451,451,451,451,,,451,,,,,', +',451,,,451,451,,451,451,451,451,451,451,451,451,451,,451,451,,451,451', +',,,,,,,,,,,,,,,,,,,,,451,,,451,,,451,,,451,,451,,,,451,,,,,,,,451,,', +',,451,451,451,451,451,451,,,,451,451,,,,452,452,452,451,452,,451,,452', +'452,,451,451,452,,452,452,452,452,452,452,452,,,,,,452,452,452,452,452', +'452,452,,,452,,,,,,,452,,,452,452,,452,452,452,452,452,452,452,452,452', +',452,452,,452,452,,,,,,,,,,,,,,,,,,,,,,452,,,452,,,452,,,452,,452,,', +',452,,,,,,,,452,,,,,452,452,452,452,452,452,,,,452,452,,,,454,454,454', +'452,454,,452,,454,454,,452,452,454,,454,454,454,454,454,454,454,,,,', +',454,454,454,454,454,454,454,,,454,,,,,,,454,,,454,454,,454,454,454', +'454,454,,454,454,454,,454,454,,454,454,,,,,,,,,,,,,,,,,,,,,,454,,,454', +',,454,,,454,,,,,,454,,,,,,,,454,,,,,454,454,454,454,454,454,,,,454,454', +',,,455,455,455,454,455,,454,,455,455,,454,454,455,,455,455,455,455,455', +'455,455,,,,,,455,455,455,455,455,455,455,,,455,,,,,,,455,,,455,455,', +'455,455,455,455,455,,455,455,455,,455,455,,455,455,,,,,,,,,,,,,,,,,', +',,,,455,,,455,,,455,,,455,,,,,,455,,,,,,,,455,,,,,455,455,455,455,455', +'455,,,,455,455,,,,456,456,456,455,456,,455,,456,456,,455,455,456,,456', +'456,456,456,456,456,456,,,,,,456,456,456,456,456,456,456,,,456,,,,,', +',456,,,456,456,,456,456,456,456,456,,456,456,456,,456,456,,456,456,', +',,,,,,,,,,,,,,,,,,,,456,,,456,,,456,,,456,,,,,,456,,,,,,,,456,,,,,456', +'456,456,456,456,456,,,,456,456,,,,487,487,487,456,487,,456,,487,487', +',456,456,487,,487,487,487,487,487,487,487,,,,,,487,487,487,487,487,487', +'487,,,487,,,,,,,487,,,487,487,,487,487,487,487,487,487,487,487,487,', +'487,487,,487,487,,,,,,,,,,,,,,,,,,,,,,487,,,487,,,487,,,487,,487,,487', +',487,,,,,,,,487,,,,,487,487,487,487,487,487,,,,487,487,,,,489,489,489', +'487,489,,487,,489,489,,487,487,489,,489,489,489,489,489,489,489,,,,', +',489,489,489,489,489,489,489,,,489,,,,,,,489,,,489,489,,489,489,489', +'489,489,489,489,489,489,,489,489,,489,489,,,,,,,,,,,,,,,,,,,,,,489,', +',489,,,489,,,489,,,,489,,489,,,,,,,,489,,,,,489,489,489,489,489,489', +',,,489,489,,,,491,491,491,489,491,,489,,491,491,,489,489,491,,491,491', +'491,491,491,491,491,,,,,,491,491,491,491,491,491,491,,,491,,,,,,,491', +',,491,491,,491,491,491,491,491,,491,491,491,,491,491,,491,491,,,,,,', +',,,,,,,,,,,,,,,491,,,491,,,491,,,491,,,,,,491,,,,,,,,491,,,,,491,491', +'491,491,491,491,,,,491,491,,,,506,506,506,491,506,,491,,506,506,,491', +'491,506,,506,506,506,506,506,506,506,,,,,,506,506,506,506,506,506,506', +',,506,,,,,,,506,,,506,506,,506,506,506,506,506,,506,506,506,,506,506', +',506,506,,,,,,,,,,,,,,,,,,,,,,506,,,506,,506,506,,,506,,,,506,,506,', +',,,,,,506,,,,,506,506,506,506,506,506,,,,506,506,,,,,,,506,,,506,,,', +',506,506,512,512,512,512,512,,,,512,512,,,,512,,512,512,512,512,512', +'512,512,,,,,,512,512,512,512,512,512,512,,,512,,,,,,512,512,,512,512', +'512,,512,512,512,512,512,,512,512,512,,512,512,,512,512,,,,,,,,,,,,', +',,,,,,,,,512,,,512,,,512,,,512,,512,,,,512,,,,,,,,512,,,,,512,512,512', +'512,512,512,,,,512,512,,,,,,512,512,,,512,,,,,512,512,518,518,518,,518', +',,,518,518,,,,518,,518,518,518,518,518,518,518,,,,,,518,518,518,518', +'518,518,518,,,518,,,,,,,518,,,518,518,,518,518,518,518,518,,518,518', +'518,,518,518,559,,559,559,559,,559,,,,,,,,,,,,,,,,,,518,,,518,,,518', +',,518,,,,,,559,,,,,,,,559,559,559,559,,518,518,518,518,518,518,,,,518', +'518,,,,520,520,520,518,520,,518,,520,520,,518,518,520,,520,520,520,520', +'520,520,520,,,,,,520,520,520,520,520,520,520,,,520,,,,,,,520,,,520,520', +',520,520,520,520,520,520,520,520,520,,520,520,,520,520,,,,,,,,,,,,,', +',,,,,,,,520,,,520,,,520,,,520,,520,,,,520,,,,,,,,520,,,,,520,520,520', +'520,520,520,,,,520,520,,,,523,523,523,520,523,,520,,523,523,,520,520', +'523,,523,523,523,523,523,523,523,,,,,,523,523,523,523,523,523,523,,', +'523,,,,,,,523,,,523,523,,523,523,523,523,523,523,523,523,523,,523,523', +',523,523,,,,,,,,,,,,,,,,,,,,,,523,,,523,,,523,,,523,,523,,,,523,,,,', +',,,523,,,,,523,523,523,523,523,523,,,,523,523,,,,531,531,531,523,531', +',523,,531,531,,523,523,531,,531,531,531,531,531,531,531,,,,,,531,531', +'531,531,531,531,531,,,531,,,,,,,531,,,531,531,,531,531,531,531,531,', +'531,531,531,,531,531,,531,531,,,,,,,,,,,,,,,,,,,,,,531,,,531,,,531,', +',531,,,,,,531,,,,,,,,531,,,,,531,531,531,531,531,531,,,,531,531,,,,532', +'532,532,531,532,,531,,532,532,,531,531,532,,532,532,532,532,532,532', +'532,,,,,,532,532,532,532,532,532,532,,,532,,,,,,,532,,,532,532,,532', +'532,532,532,532,,532,532,532,,532,532,,532,532,,,,,,,,,,,,,,,,,,,,,', +'532,,,532,,,532,,,532,,,,,,532,,,,,,,,532,,,,,532,532,532,532,532,532', +',,,532,532,,,,533,533,533,532,533,,532,,533,533,,532,532,533,,533,533', +'533,533,533,533,533,,,,,,533,533,533,533,533,533,533,,,533,,,,,,,533', +',,533,533,,533,533,533,533,533,,533,533,533,,533,533,,533,533,,,,,,', +',,,,,,,,,,,,,,,533,,,533,,,533,,,533,,,,,,533,,,,,,,,533,,,,,533,533', +'533,533,533,533,,,,533,533,,,,537,537,537,533,537,,533,,537,537,,533', +'533,537,,537,537,537,537,537,537,537,,,,,,537,537,537,537,537,537,537', +',,537,,,,,,,537,,,537,537,,537,537,537,537,537,,537,537,537,,537,537', +',537,537,,,,,,,,,,,,,,,,,,,,,,537,,,537,,,537,,,537,,,,,,537,,,,,,,', +'537,,,,,537,537,537,537,537,537,,,,537,537,,,,543,543,543,537,543,,537', +',543,543,,537,537,543,,543,543,543,543,543,543,543,,,,,,543,543,543', +'543,543,543,543,,,543,,,,,,,543,,,543,543,,543,543,543,543,543,543,543', +'543,543,,543,543,,543,543,,,,,,,,,,,,,,,,,,,,,,543,,,543,,,543,,,543', +',543,,,,543,,,,,,,,543,,,,,543,543,543,543,543,543,,,,543,543,,,,546', +'546,546,543,546,,543,,546,546,,543,543,546,,546,546,546,546,546,546', +'546,,,,,,546,546,546,546,546,546,546,,,546,,,,,,,546,,,546,546,,546', +'546,546,546,546,546,546,546,546,,546,546,,546,546,,,,,,,,,,,,,,,,,,', +',,,546,,,546,,,546,,,546,,,,,,546,,,,,,,,546,,,,,546,546,546,546,546', +'546,,,,546,546,,,,,,,546,,,546,,,,,546,546,551,551,551,551,551,,,,551', +'551,,,,551,,551,551,551,551,551,551,551,,,,,,551,551,551,551,551,551', +'551,,,551,,,,,,551,551,,551,551,551,,551,551,551,551,551,,551,551,551', +',551,551,,551,551,,,,,,,,,,,,,,,,,,,,,,551,,,551,,,551,,,551,,551,,', +',551,,,,,,,,551,,,,,551,551,551,551,551,551,,,,551,551,,,,,,,551,,,551', +',,,,551,551,552,552,552,552,552,,,,552,552,,,,552,,552,552,552,552,552', +'552,552,,,,,,552,552,552,552,552,552,552,,,552,,,,,,552,552,,552,552', +'552,,552,552,552,552,552,,552,552,552,,552,552,,552,552,,,,,,,,,,,,', +',,,,,,,,,552,,,552,,,552,,,552,,552,,,,552,,,,,,,,552,,,,,552,552,552', +'552,552,552,,,,552,552,,,,558,558,558,552,558,,552,,558,558,,552,552', +'558,,558,558,558,558,558,558,558,,,,,,558,558,558,558,558,558,558,,', +'558,,,,,,,558,,,558,558,,558,558,558,558,558,,558,558,558,,558,558,856', +',856,856,856,856,856,,,,,,,,,,856,,,,,,,,558,,,558,,,558,,,558,,,,,', +'856,,,,,,,,856,856,856,856,,558,558,558,558,558,558,,,,558,558,,,,,', +',558,,,558,,,,,558,558,572,572,572,572,572,,,856,572,572,,,,572,,572', +'572,572,572,572,572,572,,,,,,572,572,572,572,572,572,572,,,572,,,,,', +'572,572,,572,572,572,,572,572,572,572,572,,572,572,572,,572,572,,572', +'572,,,,,,,,,,,,,,,,,,,,,,572,,,572,,,572,,,572,,572,,,,572,,,,,,,,572', +',,,,572,572,572,572,572,572,,,,572,572,,,,,,,572,,,572,,,,,572,572,576', +'576,576,576,576,,,,576,576,,,,576,,576,576,576,576,576,576,576,,,,,', +'576,576,576,576,576,576,576,,,576,,,,,,576,576,,576,576,576,,576,576', +'576,576,576,,576,576,576,,576,576,,576,576,,,,,,,,,,,,,,,,,,,,,,576', +',,576,,,576,,,576,,576,,,,576,,,,,,,,576,,,,,576,576,576,576,576,576', +',,,576,576,,,,,,,576,,,576,,,,,576,576,581,581,581,581,581,,,,581,581', +',,,581,,581,581,581,581,581,581,581,,,,,,581,581,581,581,581,581,581', +',,581,,,,,,581,581,,581,581,581,,581,581,581,581,581,,581,581,581,,581', +'581,,581,581,,,,,,,,,,,,,,,,,,,,,,581,,,581,,,581,,,581,,581,,,,581', +',,,,,,,581,,,,,581,581,581,581,581,581,,,,581,581,,,,583,583,583,581', +'583,,581,,583,583,,581,581,583,,583,583,583,583,583,583,583,,,,,,583', +'583,583,583,583,583,583,,,583,,,,,,,583,,,583,583,,583,583,583,583,583', +'583,583,583,583,,583,583,,583,583,,,,,,,,,,,,,,,,,,,,,,583,,,583,,,583', +',,583,,583,,,,583,,,,,,,,583,,,,,583,583,583,583,583,583,,,,583,583', +',,,586,586,586,583,586,,583,,586,586,,583,583,586,,586,586,586,586,586', +'586,586,,,,,,586,586,586,586,586,586,586,,,586,,,,,,,586,,,586,586,', +'586,586,586,586,586,586,586,586,586,,586,586,,586,586,,,,,,,,,,,,,,', +',,,,,,,586,,,586,,,586,,,586,,586,,,,586,,,,,,,,586,,,,,586,586,586', +'586,586,586,,,,586,586,,,,592,592,592,586,592,,586,,592,592,,586,586', +'592,,592,592,592,592,592,592,592,,,,,,592,592,592,592,592,592,592,,', +'592,,,,,,,592,,,592,592,,592,592,592,592,592,592,592,592,592,,592,592', +',592,592,,,,,,,,,,,,,,,,,,,,,,592,,,592,,,592,,,592,,592,,,,592,,,,', +',,,592,,,,,592,592,592,592,592,592,,,,592,592,,,,596,596,596,592,596', +',592,,596,596,,592,592,596,,596,596,596,596,596,596,596,,,,,,596,596', +'596,596,596,596,596,,,596,,,,,,,596,,,596,596,,596,596,596,596,596,', +'596,596,596,,596,596,,596,596,,,,,,,,,,,,,,,,,,,,,,596,,,596,,,596,', +',596,,,,,,596,,,,,,,,596,,,,,596,596,596,596,596,596,,,,596,596,,,,598', +'598,598,596,598,,596,,598,598,,596,596,598,,598,598,598,598,598,598', +'598,,,,,,598,598,598,598,598,598,598,,,598,,,,,,,598,,,598,598,,598', +'598,598,598,598,,598,598,598,,598,598,,598,598,,,,,,,,,,,,,,,,,,,,,', +'598,,,598,,,598,,,598,,,,,,598,,,,,,,,598,,,,,598,598,598,598,598,598', +',,,598,598,,,,625,625,625,598,625,,598,,625,625,,598,598,625,,625,625', +'625,625,625,625,625,,,,,,625,625,625,625,625,625,625,,,625,,,,,,,625', +',,625,625,,625,625,625,625,625,,625,625,625,,625,625,,625,625,,,,,,', +',,,,,,,,,,,,,,,625,,,625,,,625,,,625,,,,,,625,,,,,,,,625,,,,,625,625', +'625,625,625,625,,,,625,625,,,,627,627,627,625,627,,625,,627,627,,625', +'625,627,,627,627,627,627,627,627,627,,,,,,627,627,627,627,627,627,627', +',,627,,,,,,,627,,,627,627,,627,627,627,627,627,,627,627,627,,627,627', +',627,627,,,,,,,,,,,,,,,,,,,,,,627,,,627,,,627,,,627,,627,,,,627,,,,', +',,,627,,,,,627,627,627,627,627,627,,,,627,627,,,,630,630,630,627,630', +',627,,630,630,,627,627,630,,630,630,630,630,630,630,630,,,,,,630,630', +'630,630,630,630,630,,,630,,,,,,,630,,,630,630,,630,630,630,630,630,', +'630,630,630,,630,630,,630,630,,,,,,,,,,,,,,,,,,,,,,630,,,630,,,630,', +',630,,,,,,630,,,,,,,,630,,,,,630,630,630,630,630,630,,,,630,630,,,,631', +'631,631,630,631,,630,,631,631,,630,630,631,,631,631,631,631,631,631', +'631,,,,,,631,631,631,631,631,631,631,,,631,,,,,,,631,,,631,631,,631', +'631,631,631,631,,631,631,631,,631,631,,631,631,,,,,,,,,,,,,,,,,,,,,', +'631,,,631,,,631,,,631,,,,,,631,,,,,,,,631,,,,,631,631,631,631,631,631', +',,,631,631,,,,636,636,636,631,636,,631,,636,636,,631,631,636,,636,636', +'636,636,636,636,636,,,,,,636,636,636,636,636,636,636,,,636,,,,,,,636', +',,636,636,,636,636,636,636,636,,636,636,636,,636,636,,636,636,,,,,,', +',,,,,,,,,,,,,,,636,,,636,,,636,,,636,,,,,,636,,,,,,,,636,,,,,636,636', +'636,636,636,636,,,,636,636,,,,639,639,639,636,639,,636,,639,639,,636', +'636,639,,639,639,639,639,639,639,639,,,,,,639,639,639,639,639,639,639', +',,639,,,,,,,639,,,639,639,,639,639,639,639,639,,639,639,639,,639,639', +',639,639,,,,,,,,,,,,,,,,,,,,,,639,,,639,,,639,,,639,,,,,,639,,,,,,,', +'639,,,,,639,639,639,639,639,639,,,,639,639,,,,650,650,650,639,650,,639', +',650,650,,639,639,650,,650,650,650,650,650,650,650,,,,,,650,650,650', +'650,650,650,650,,,650,,,,,,,650,,,650,650,,650,650,650,650,650,,650', +'650,650,,650,650,,650,650,,,,,,,,,,,,,,,,,,,,,,650,,,650,,,650,,,650', +',,,,,650,,,,,,,,650,,,,,650,650,650,650,650,650,,,,650,650,,,,,,,650', +',,650,,,,,650,650,654,654,654,654,654,,,,654,654,,,,654,,654,654,654', +'654,654,654,654,,,,,,654,654,654,654,654,654,654,,,654,,,,,,654,654', +',654,654,654,,654,654,654,654,654,,654,654,654,,654,654,,654,654,,,', +',,,,,,,,,,,,,,,,,,654,,,654,,,654,,,654,,654,,,,654,,,,,,,,654,,,,,654', +'654,654,654,654,654,,,,654,654,,,,658,658,658,654,658,,654,,658,658', +',654,654,658,,658,658,658,658,658,658,658,,,,,,658,658,658,658,658,658', +'658,,,658,,,,,,,658,,,658,658,,658,658,658,658,658,,658,658,658,,658', +'658,,658,658,,,,,,,,,,,,,,,,,,,,,,658,,,658,,,658,,,658,,,,,,658,,,', +',,,,658,,,,,658,658,658,658,658,658,,,,658,658,,,,,,,658,,,658,,,,,658', +'658,667,667,667,667,667,,,,667,667,,,,667,,667,667,667,667,667,667,667', +',,,,,667,667,667,667,667,667,667,,,667,,,,,,667,667,,667,667,667,,667', +'667,667,667,667,,667,667,667,,667,667,,667,667,,,,,,,,,,,,,,,,,,,,,', +'667,,,667,,,667,,,667,,667,,,,667,,,,,,,,667,,,,,667,667,667,667,667', +'667,,,,667,667,,,,670,670,670,667,670,,667,,670,670,,667,667,670,,670', +'670,670,670,670,670,670,,,,,,670,670,670,670,670,670,670,,,670,,,,,', +',670,,,670,670,,670,670,670,670,670,670,670,670,670,,670,670,,670,670', +',,,,,,,,,,,,,,,,,,,,,670,,,670,,,670,,,670,,670,,670,,670,,,,,,,,670', +',,,,670,670,670,670,670,670,,,,670,670,,,,671,671,671,670,671,,670,', +'671,671,,670,670,671,,671,671,671,671,671,671,671,,,,,,671,671,671,671', +'671,671,671,,,671,,,,,,,671,,,671,671,,671,671,671,671,671,671,671,671', +'671,,671,671,,671,671,,,,,,,,,,,,,,,,,,,,,,671,,,671,,,671,,,671,,,', +'671,,671,,,,,,,,671,,,,,671,671,671,671,671,671,,,,671,671,,,,,,,671', +',,671,,,,,671,671,677,677,677,677,677,,,,677,677,,,,677,,677,677,677', +'677,677,677,677,,,,,,677,677,677,677,677,677,677,,,677,,,,,,677,677', +',677,677,677,,677,677,677,677,677,,677,677,677,,677,677,,677,677,,,', +',,,,,,,,,,,,,,,,,,677,,,677,,,677,,,677,,677,,,,677,,,,,,,,677,,,,,677', +'677,677,677,677,677,,,,677,677,,,,,,,677,,,677,,,,,677,677,678,678,678', +'678,678,,,,678,678,,,,678,,678,678,678,678,678,678,678,,,,,,678,678', +'678,678,678,678,678,,,678,,,,,,678,678,,678,678,678,,678,678,678,678', +'678,,678,678,678,,678,678,,678,678,,,,,,,,,,,,,,,,,,,,,,678,,,678,,', +'678,,,678,,678,,,,678,,,,,,,,678,,,,,678,678,678,678,678,678,,,,678', +'678,,,,682,682,682,678,682,,678,,682,682,,678,678,682,,682,682,682,682', +'682,682,682,,,,,,682,682,682,682,682,682,682,,,682,,,,,,,682,,,682,682', +',682,682,682,682,682,,682,682,682,,682,682,,,,,,,,,,,,,,,,,,,,,,,,,682', +',,682,,,682,,,682,,,,,,,,,,,,,,,,,,,682,682,682,682,682,682,,,,682,682', +',,,694,694,694,682,694,,682,,694,694,,682,682,694,,694,694,694,694,694', +'694,694,,,,,,694,694,694,694,694,694,694,,,694,,,,,,,694,,,694,694,', +'694,694,694,694,694,,694,694,694,,694,694,,,,,,,,,,,,,,,,,,,,,,,,,694', +',,694,,,694,,,694,,,,,,,,,,,,,,,,,,,694,694,694,694,694,694,,,,694,694', +',,,700,700,700,694,700,,694,,700,700,,694,694,700,,700,700,700,700,700', +'700,700,,,,,,700,700,700,700,700,700,700,,,700,,,,,,,700,,,700,700,', +'700,700,700,700,700,,700,700,700,,700,700,,700,700,,,,,,,,,,,,,,,,,', +',,,,700,,,700,,,700,,,700,,700,,,,700,,,,,,,,700,,,,,700,700,700,700', +'700,700,,,,700,700,,,,731,731,731,700,731,,700,,731,731,,700,700,731', +',731,731,731,731,731,731,731,,,,,,731,731,731,731,731,731,731,,,731', +',,,,,,731,,,731,731,,731,731,731,731,731,,731,731,731,,731,731,,731', +'731,,,,,,,,,,,,,,,,,,,,,,731,,,731,,,731,,,731,,731,,,,731,,,,,,,,731', +',,,,731,731,731,731,731,731,,,,731,731,,,,738,738,738,731,738,,731,', +'738,738,,731,731,738,,738,738,738,738,738,738,738,,,,,,738,738,738,738', +'738,738,738,,,738,,,,,,,738,,,738,738,,738,738,738,738,738,,738,738', +'738,,738,738,,738,738,,,,,,,,,,,,,,,,,,,,,,738,,,738,,,738,,,738,,,', +',,738,,,,,,,,738,,,,,738,738,738,738,738,738,,,,738,738,,,,,,,738,,', +'738,,,,,738,738,743,743,743,743,743,,,,743,743,,,,743,,743,743,743,743', +'743,743,743,,,,,,743,743,743,743,743,743,743,,,743,,,,,,743,743,,743', +'743,743,,743,743,743,743,743,,743,743,743,,743,743,,743,743,,,,,,,,', +',,,,,,,,,,,,,743,,,743,,,743,,,743,,743,,,,743,,,,,,,,743,,,,,743,743', +'743,743,743,743,,,,743,743,,,,,,,743,,,743,,,,,743,743,747,747,747,747', +'747,,,,747,747,,,,747,,747,747,747,747,747,747,747,,,,,,747,747,747', +'747,747,747,747,,,747,,,,,,747,747,,747,747,747,,747,747,747,747,747', +',747,747,747,,747,747,,747,747,,,,,,,,,,,,,,,,,,,,,,747,,,747,,,747', +',,747,,747,,,,747,,,,,,,,747,,,,,747,747,747,747,747,747,,,,747,747', +',,,,,,747,,,747,,,,,747,747,748,748,748,748,748,,,,748,748,,,,748,,748', +'748,748,748,748,748,748,,,,,,748,748,748,748,748,748,748,,,748,,,,,', +'748,748,,748,748,748,,748,748,748,748,748,,748,748,748,,748,748,,748', +'748,,,,,,,,,,,,,,,,,,,,,,748,,,748,,,748,,,748,,748,,,,748,,,,,,,,748', +',,,,748,748,748,748,748,748,,,,748,748,,,,755,755,755,748,755,,748,', +'755,755,,748,748,755,,755,755,755,755,755,755,755,,,,,,755,755,755,755', +'755,755,755,,,755,,,,,,,755,,,755,755,,755,755,755,755,755,,755,755', +'755,,755,755,,755,755,,,,,,,,,,,,,,,,,,,,,,755,,,755,,,755,,,755,,,', +',,755,,,,,,,,755,,,,,755,755,755,755,755,755,,,,755,755,,,,,,,755,,', +'755,,,,,755,755,769,769,769,769,769,,,,769,769,,,,769,,769,769,769,769', +'769,769,769,,,,,,769,769,769,769,769,769,769,,,769,,,,,,769,769,,769', +'769,769,,769,769,769,769,769,,769,769,769,,769,769,,769,769,,,,,,,,', +',,,,,,,,,,,,,769,,,769,,,769,,,769,,769,,,,769,,,,,,,,769,,,,,769,769', +'769,769,769,769,,,,769,769,,,,775,775,775,769,775,,769,,775,775,,769', +'769,775,,775,775,775,775,775,775,775,,,,,,775,775,775,775,775,775,775', +',,775,,,,,,,775,,,775,775,,775,775,775,775,775,,775,775,775,,775,775', +',775,775,,,,,,,,,,,,,,,,,,,,,,775,,,775,,,775,,,775,,,,,,775,,,,,,,', +'775,,,,,775,775,775,775,775,775,,,,775,775,,,,776,776,776,775,776,,775', +',776,776,,775,775,776,,776,776,776,776,776,776,776,,,,,,776,776,776', +'776,776,776,776,,,776,,,,,,,776,,,776,776,,776,776,776,776,776,,776', +'776,776,,776,776,,776,776,,,,,,,,,,,,,,,,,,,,,,776,,,776,,,776,,,776', +',,,,,776,,,,,,,,776,,,,,776,776,776,776,776,776,,,,776,776,,,,777,777', +'777,776,777,,776,,777,777,,776,776,777,,777,777,777,777,777,777,777', +',,,,,777,777,777,777,777,777,777,,,777,,,,,,,777,,,777,777,,777,777', +'777,777,777,,777,777,777,,777,777,,777,777,,,,,,,,,,,,,,,,,,,,,,777', +',,777,,,777,,,777,,,,,,777,,,,,,,,777,,,,,777,777,777,777,777,777,,', +',777,777,,,,788,788,788,777,788,,777,,788,788,,777,777,788,,788,788', +'788,788,788,788,788,,,,,,788,788,788,788,788,788,788,,,788,,,,,,,788', +',,788,788,,788,788,788,788,788,,788,788,788,,788,788,,788,788,,,,,,', +',,,,,,,,,,,,,,,788,,,788,,,788,,,788,,,,,,788,,,,,,,,788,,,,,788,788', +'788,788,788,788,,,,788,788,,,,789,789,789,788,789,,788,,789,789,,788', +'788,789,,789,789,789,789,789,789,789,,,,,,789,789,789,789,789,789,789', +',,789,,,,,,,789,,,789,789,,789,789,789,789,789,,789,789,789,,789,789', +',789,789,,,,,,,,,,,,,,,,,,,,,,789,,,789,,,789,,,789,,,,,,789,,,,,,,', +'789,,,,,789,789,789,789,789,789,,,,789,789,,,,790,790,790,789,790,,789', +',790,790,,789,789,790,,790,790,790,790,790,790,790,,,,,,790,790,790', +'790,790,790,790,,,790,,,,,,,790,,,790,790,,790,790,790,790,790,,790', +'790,790,,790,790,,790,790,,,,,,,,,,,,,,,,,,,,,,790,,,790,,,790,,,790', +',,,,,790,,,,,,,,790,,,,,790,790,790,790,790,790,,,,790,790,,,,802,802', +'802,790,802,,790,,802,802,,790,790,802,,802,802,802,802,802,802,802', +',,,,,802,802,802,802,802,802,802,,,802,,,,,,,802,,,802,802,,802,802', +'802,802,802,,802,802,802,,802,802,,802,802,,,,,,,,,,,,,,,,,,,,,,802', +',,802,,,802,,,802,,802,,,,802,,,,,,,,802,,,,,802,802,802,802,802,802', +',,,802,802,,,,,,,802,,,802,,,,,802,802,813,813,813,813,813,,,,813,813', +',,,813,,813,813,813,813,813,813,813,,,,,,813,813,813,813,813,813,813', +',,813,,,,,,813,813,,813,813,813,,813,813,813,813,813,,813,813,813,,813', +'813,,813,813,,,,,,,,,,,,,,,,,,,,,,813,,,813,,,813,,,813,,813,,,,813', +',,,,,,,813,,,,,813,813,813,813,813,813,,,,813,813,,,,832,832,832,813', +'832,,813,,832,832,,813,813,832,,832,832,832,832,832,832,832,,,,,,832', +'832,832,832,832,832,832,,,832,,,,,,,832,,,832,832,,832,832,832,832,832', +',832,832,832,,832,832,,832,832,,,,,,,,,,,,,,,,,,,,,,832,,,832,,,832', +',,832,,,,,,832,,,,,,,,832,,,,,832,832,832,832,832,832,,,,832,832,,,', +',,,832,,,832,,,,,832,832,834,834,834,834,834,,,,834,834,,,,834,,834', +'834,834,834,834,834,834,,,,,,834,834,834,834,834,834,834,,,834,,,,,', +'834,834,,834,834,834,,834,834,834,834,834,,834,834,834,,834,834,,834', +'834,,,,,,,,,,,,,,,,,,,,,,834,,,834,,,834,,,834,,834,,,,834,,,,,,,,834', +',,,,834,834,834,834,834,834,,,,834,834,,,,,,,834,,,834,,,,,834,834,835', +'835,835,835,835,,,,835,835,,,,835,,835,835,835,835,835,835,835,,,,,', +'835,835,835,835,835,835,835,,,835,,,,,,835,835,,835,835,835,,835,835', +'835,835,835,,835,835,835,,835,835,,835,835,,,,,,,,,,,,,,,,,,,,,,835', +',,835,,,835,,,835,,835,,,,835,,,,,,,,835,,,,,835,835,835,835,835,835', +',,,835,835,,,,862,862,862,835,862,,835,,862,862,,835,835,862,,862,862', +'862,862,862,862,862,,,,,,862,862,862,862,862,862,862,,,862,,,,,,,862', +',,862,862,,862,862,862,862,862,,862,862,862,,862,862,,862,862,,,,,,', +',,,,,,,,,,,,,,,862,,,862,,,862,,,862,,,,,,862,,,,,,,,862,,,,,862,862', +'862,862,862,862,,,,862,862,,,,876,876,876,862,876,,862,,876,876,,862', +'862,876,,876,876,876,876,876,876,876,,,,,,876,876,876,876,876,876,876', +',,876,,,,,,,876,,,876,876,,876,876,876,876,876,,876,876,876,,876,876', +',876,876,,,,,,,,,,,,,,,,,,,,,,876,,,876,,,876,,,876,,,,,,876,,,,,,,', +'876,,,,,876,876,876,876,876,876,,,,876,876,,,,877,877,877,876,877,,876', +',877,877,,876,876,877,,877,877,877,877,877,877,877,,,,,,877,877,877', +'877,877,877,877,,,877,,,,,,,877,,,877,877,,877,877,877,877,877,,877', +'877,877,,877,877,,877,877,,,,,,,,,,,,,,,,,,,,,,877,,,877,,,877,,,877', +',,,,,877,,,,,,,,877,,,,,877,877,877,877,877,877,,,,877,877,,,,881,881', +'881,877,881,,877,,881,881,,877,877,881,,881,881,881,881,881,881,881', +',,,,,881,881,881,881,881,881,881,,,881,,,,,,,881,,,881,881,,881,881', +'881,881,881,881,881,881,881,,881,881,,881,881,,,,,,,,,,,,,,,,,,,,,,881', +',,881,,,881,,,881,,,,881,,881,,,,,,,,881,,,,,881,881,881,881,881,881', +',,,881,881,,,,,,,881,,,881,,,,,881,881,886,886,886,886,886,,,,886,886', +',,,886,,886,886,886,886,886,886,886,,,,,,886,886,886,886,886,886,886', +',,886,,,,,,886,886,,886,886,886,,886,886,886,886,886,,886,886,886,,886', +'886,,886,886,,,,,,,,,,,,,,,,,,,,,,886,,,886,,,886,,,886,,886,,,,886', +',,,,,,,886,,,,,886,886,886,886,886,886,,,,886,886,,,,890,890,890,886', +'890,,886,,890,890,,886,886,890,,890,890,890,890,890,890,890,,,,,,890', +'890,890,890,890,890,890,,,890,,,,,,,890,,,890,890,,890,890,890,890,890', +',890,890,890,,890,890,,,,,,,,,,,,,,,,,,,,,,,,,890,,,890,,,890,,,890', +',,,,,,,,,,,,,,,,,,890,890,890,890,890,890,,,,890,890,,,,900,900,900', +'890,900,,890,,900,900,,890,890,900,,900,900,900,900,900,900,900,,,,', +',900,900,900,900,900,900,900,,,900,,,,,,,900,,,900,900,,900,900,900', +'900,900,,900,900,900,,900,900,,900,900,,,,,,,,,,,,,,,,,,,,,,900,,,900', +',,900,,,900,,900,,,,900,,,,,,,,900,,,,,900,900,900,900,900,900,,,,900', +'900,,,,,,,900,,,900,,,,,900,900,901,901,901,901,901,,,,901,901,,,,901', +',901,901,901,901,901,901,901,,,,,,901,901,901,901,901,901,901,,,901', +',,,,,901,901,,901,901,901,,901,901,901,901,901,,901,901,901,,901,901', +',901,901,,,,,,,,,,,,,,,,,,,,,,901,,,901,,,901,,,901,,901,,,,901,,,,', +',,,901,,,,,901,901,901,901,901,901,,,,901,901,,,,,,,901,,,901,,,,,901', +'901,904,904,904,904,904,,,,904,904,,,,904,,904,904,904,904,904,904,904', +',,,,,904,904,904,904,904,904,904,,,904,,,,,,904,904,,904,904,904,,904', +'904,904,904,904,,904,904,904,,904,904,,904,904,,,,,,,,,,,,,,,,,,,,,', +'904,,,904,,,904,,,904,,904,,,,904,,,,,,,,904,,,,,904,904,904,904,904', +'904,,,,904,904,,,,921,921,921,904,921,,904,,921,921,,904,904,921,,921', +'921,921,921,921,921,921,,,,,,921,921,921,921,921,921,921,,,921,,,,,', +',921,,,921,921,,921,921,921,921,921,,921,921,921,,921,921,,921,921,', +',,,,,,,,,,,,,,,,,,,,921,,,921,,,921,,,921,,921,,921,,921,,,,,,,,921', +',,,,921,921,921,921,921,921,,,,921,921,,,,,,,921,,,921,,,,,921,921,923', +'923,923,923,923,,,,923,923,,,,923,,923,923,923,923,923,923,923,,,,,', +'923,923,923,923,923,923,923,,,923,,,,,,923,923,,923,923,923,,923,923', +'923,923,923,,923,923,923,,923,923,,923,923,,,,,,,,,,,,,,,,,,,,,,923', +',,923,,,923,,,923,,923,,,,923,,,,,,,,923,,,,,923,923,923,923,923,923', +',,,923,923,,,,,,,923,,,923,,,,,923,923,930,930,930,930,930,,,,930,930', +',,,930,,930,930,930,930,930,930,930,,,,,,930,930,930,930,930,930,930', +',,930,,,,,,930,930,,930,930,930,,930,930,930,930,930,,930,930,930,,930', +'930,,930,930,,,,,,,,,,,,,,,,,,,,,,930,,,930,,,930,,,930,,930,,,,930', +',,,,,,,930,,,,,930,930,930,930,930,930,,,,930,930,,,,,,,930,,,930,,', +',,930,930,935,935,935,935,935,,,,935,935,,,,935,,935,935,935,935,935', +'935,935,,,,,,935,935,935,935,935,935,935,,,935,,,,,,935,935,,935,935', +'935,,935,935,935,935,935,,935,935,935,,935,935,,935,935,,,,,,,,,,,,', +',,,,,,,,,935,,,935,,,935,,,935,,935,,,,935,,,,,,,,935,,,,,935,935,935', +'935,935,935,,,,935,935,,,,,,,935,,,935,,,,,935,935,943,943,943,943,943', +',,,943,943,,,,943,,943,943,943,943,943,943,943,,,,,,943,943,943,943', +'943,943,943,,,943,,,,,,943,943,,943,943,943,,943,943,943,943,943,,943', +'943,943,,943,943,,943,943,,,,,,,,,,,,,,,,,,,,,,943,,,943,,,943,,,943', +',943,,,,943,,,,,,,,943,,,,,943,943,943,943,943,943,,,,943,943,,,,945', +'945,945,943,945,,943,,945,945,,943,943,945,,945,945,945,945,945,945', +'945,,,,,,945,945,945,945,945,945,945,,,945,,,,,,,945,,,945,945,,945', +'945,945,945,945,945,945,945,945,,945,945,,945,945,,,,,,,,,,,,,,,,,,', +',,,945,,,945,,,945,,,945,,945,,,,945,,,,,,,,945,,,,436,945,945,945,945', +'945,945,436,436,436,945,945,,436,436,,436,,945,,,945,,,,436,945,945', +',,,,,,,,436,436,,436,436,436,436,436,,,,,,,,,,,,,,,,,,,,,,,,436,436', +'436,436,436,436,436,436,436,436,436,436,436,436,436,438,,436,436,436', +',436,438,438,438,436,,,438,438,,438,436,,436,,436,436,436,436,436,436', +'436,,436,436,436,,,,,438,438,,438,438,438,438,438,436,436,,436,,436', +',,436,,436,,436,,,,,,,,,,,438,438,438,438,438,438,438,438,438,438,438', +'438,438,438,438,,,438,438,438,,438,,,,438,,,,,,,438,,438,,438,438,438', +'438,438,438,438,,438,,438,,,,,,,,,,,,,438,438,,438,,438,644,,438,,438', +',438,644,644,644,,,644,644,644,,644,,,,,,,,,644,644,644,,,,,,,,,644', +'644,,644,644,644,644,644,,,,,,,,,,,,,,,,,,,,,,,,644,644,644,644,644', +'644,644,644,644,644,644,644,644,644,644,,,644,644,644,,644,644,,,644', +',,644,,644,,644,,644,,644,644,644,644,644,644,644,,644,644,644,,,,,', +',,,,,,,644,644,644,644,,644,645,,644,,644,,644,645,645,645,,,645,645', +'645,,645,,,,,,,,,,645,645,,,,,,,,,645,645,,645,645,645,645,645,,,,,', +',,,,,,,,,,,,,,,,,,645,645,645,645,645,645,645,645,645,645,645,645,645', +'645,645,,,645,645,645,,645,645,,,645,,,645,,645,,645,,645,,645,645,645', +'645,645,645,645,,645,,645,,,,,,,,,,,,,645,645,645,645,,645,28,,645,', +'645,,645,28,28,28,,,28,28,28,,28,,,,,,,,,,28,28,,,,,,,,,28,28,,28,28', +'28,28,28,,,,,,,,,,,,,,,,,,,,,,,,28,28,28,28,28,28,28,28,28,28,28,28', +'28,28,28,,,28,28,28,,,28,,28,28,,,28,,28,,28,,28,,28,28,28,28,28,28', +'28,,28,,28,,,,,,,,,,,,,28,28,28,28,50,28,,,28,,28,50,50,50,,,50,50,50', +',50,,,,,,,,,,50,50,50,,,,,,,,50,50,,50,50,50,50,50,,,,,,,,,,,,,,,,,', +',,,,,,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,,,50,50,50,,,50,', +',50,,,50,,50,,50,,50,,50,50,50,50,50,50,50,,50,,50,,,,,,,,,,,,,50,50', +'50,50,494,50,,50,50,,50,494,494,494,,,494,494,494,,494,,,,,,,,,,494', +',,,,,,,,,494,494,,494,494,494,494,494,,,,,,,,,,,,,,495,,,,,,,495,495', +'495,,,495,495,495,,495,,,,,494,494,,,,495,,,494,,,,,494,494,495,495', +',495,495,495,495,495,,,,,918,,918,918,918,918,918,,494,,,,,,,,918,,', +',496,494,,494,,,494,496,496,496,495,495,496,496,496,,496,,495,918,918', +',,495,495,,496,918,918,918,918,,,,,,496,496,,496,496,496,496,496,,495', +',,,,,202,202,,,202,,,495,,495,,,495,202,202,918,202,202,202,202,202', +'202,202,,,202,202,496,496,,,202,202,202,202,496,,,,,496,496,,,,,,202', +'202,,202,202,202,202,202,202,202,202,202,202,202,,496,202,,,,,,,,,,', +',496,,496,,,496,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,,,,7', +'7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,,7,7,7,,7,,,,,,,,,7,7,,7,7,7', +'7,7,7,7,,,7,7,,,,,7,7,7,7,,,,,,,,,,,,,7,7,,7,7,7,7,7,7,7,7,7,7,7,,,7', +'7,,,,,,,,,,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,,,,8,8', +'8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,,8,8,,,8,,,,,,,,,8,8,,8,8,8,8', +'8,8,8,,,8,8,,,,,8,8,8,8,,,,,,,,,,,,,8,8,,8,8,8,8,8,8,8,8,8,8,8,,,8,8', +',,,,,,,,,8,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411', +'411,411,411,411,411,411,411,411,411,,,,411,411,411,411,411,411,411,411', +'411,411,411,411,411,411,411,411,411,411,411,411,411,,411,411,,,411,', +',,,,,,,411,411,,411,411,411,411,411,411,411,,,411,411,,,,,411,411,411', +'411,,,,,,,,,,,,,411,411,,411,411,411,411,411,411,411,411,411,411,411', +',,411,411,,,,,,,,,,411,415,415,415,415,415,415,415,415,415,415,415,415', +'415,415,415,415,415,415,415,415,415,415,415,415,,,,415,415,415,415,415', +'415,415,415,415,415,415,415,415,415,415,415,415,415,415,415,415,,415', +'415,,,415,,,,,,,,,415,415,,415,415,415,415,415,415,415,,,415,415,,,', +',415,415,415,415,,,,,,,,,,,,,415,415,,415,415,415,415,415,415,415,415', +'415,415,415,,,415,415,,,,,,,,,,415,65,65,65,65,65,65,65,65,65,65,65', +'65,65,65,65,65,65,65,65,65,65,65,65,65,,,,65,65,65,65,65,65,65,65,65', +'65,65,65,65,65,65,65,65,65,65,65,65,,65,65,65,65,65,,65,,,,,,,65,65', +',65,65,65,65,65,65,65,,,65,65,,,,,65,65,65,65,,,,,,65,,,,,,,65,65,,65', +'65,65,65,65,65,65,65,65,65,65,,,65,79,79,79,79,79,79,79,79,79,79,79', +'79,79,79,79,79,79,79,79,79,79,79,79,79,,,,79,79,79,79,79,79,79,79,79', +'79,79,79,79,79,79,79,79,79,79,79,79,,79,79,79,79,79,,79,,,,,,,79,79', +',79,79,79,79,79,79,79,,,79,79,,,,,79,79,79,79,,,,,,,,,,,,,79,79,,79', +'79,79,79,79,79,79,79,79,79,79,,,79,192,192,192,192,192,192,192,192,192', +'192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,,,,192,192', +'192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192', +'192,192,,192,192,192,192,192,,192,,,,,,,192,192,,192,192,192,192,192', +'192,192,,,192,192,,,,,192,192,192,192,,,,,,,,,,,,,192,192,,192,192,192', +'192,192,192,192,192,192,192,192,,,192,766,766,766,766,766,766,766,766', +'766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,,,,766', +'766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766', +'766,766,766,,766,766,,,766,,,,,,,,,766,766,,766,766,766,766,766,766', +'766,,,766,766,,,,,766,766,766,766,,,,,,,,,,,,,766,766,,766,766,766,766', +'766,766,766,766,766,766,766,201,201,766,,201,,,,,,,,,201,201,,201,201', +'201,201,201,201,201,,,201,201,,,,,201,201,201,201,,,,,,201,,,,,,,201', +'201,,201,201,201,201,201,201,201,201,201,201,201,203,203,201,,203,,', +',,,,,,203,203,,203,203,203,203,203,203,203,,,203,203,,,,,203,203,203', +'203,,,,,,,,,,,,,203,203,,203,203,203,203,203,203,203,203,203,203,203', +'264,264,203,,264,,,,,,,,,264,264,,264,264,264,264,264,264,264,,,264', +'264,,,,,264,264,264,264,,,,,,,,,,,,,264,264,,264,264,264,264,264,264', +'264,264,264,264,264,265,265,264,,265,,,,,,,,,265,265,,265,265,265,265', +'265,265,265,,,265,265,,,,,265,265,265,265,,,,,,,,,,,,,265,265,,265,265', +'265,265,265,265,265,265,265,265,265,266,266,265,,266,,,,,,,,,266,266', +',266,266,266,266,266,266,266,,,266,266,,,,,266,266,266,266,,,,,,,,,', +',,,266,266,,266,266,266,266,266,266,266,266,266,266,266,449,449,266', +',449,,,,,,,,,449,449,,449,449,449,449,449,449,449,,,449,449,,,,,449', +'449,449,449,,,,,,449,,,,,,,449,449,,449,449,449,449,449,449,449,449', +'449,449,449,450,450,449,,450,,,,,,,,,450,450,,450,450,450,450,450,450', +'450,,,450,450,,,,,450,450,450,450,,,,,,,,,,,,,450,450,,450,450,450,450', +'450,450,450,450,450,450,450,521,521,450,,521,,,,,,,,,521,521,,521,521', +'521,521,521,521,521,,,521,521,,,,,521,521,521,521,,,,,,521,,,,,,,521', +'521,,521,521,521,521,521,521,521,521,521,521,521,522,522,521,,522,,', +',,,,,,522,522,,522,522,522,522,522,522,522,,,522,522,,,,,522,522,522', +'522,,,,,,,,,,,,,522,522,,522,522,522,522,522,522,522,522,522,522,522', +'524,524,522,,524,,,,,,,,,524,524,,524,524,524,524,524,524,524,,,524', +'524,,,,,524,524,524,524,,,,,,,,,,,,,524,524,,524,524,524,524,524,524', +'524,524,524,524,524,534,534,524,,534,,,,,,,,,534,534,,534,534,534,534', +'534,534,534,,,534,534,,,,,534,534,534,534,,,,,,534,,,,,,,534,534,,534', +'534,534,534,534,534,534,534,534,534,534,535,535,534,,535,,,,,,,,,535', +'535,,535,535,535,535,535,535,535,,,535,535,,,,,535,535,535,535,,,,,', +',,,,,,,535,535,,535,535,535,535,535,535,535,535,535,535,535,584,584', +'535,,584,,,,,,,,,584,584,,584,584,584,584,584,584,584,,,584,584,,,,', +'584,584,584,584,,,,,,584,,,,,,,584,584,,584,584,584,584,584,584,584', +'584,584,584,584,585,585,584,,585,,,,,,,,,585,585,,585,585,585,585,585', +'585,585,,,585,585,,,,,585,585,585,585,,,,,,,,,,,,,585,585,,585,585,585', +'585,585,585,585,585,585,585,585,591,591,585,,591,,,,,,,,,591,591,,591', +'591,591,591,591,591,591,,,591,591,,,,,591,591,591,591,,,,,,,,,,,,,591', +'591,,591,591,591,591,591,591,591,591,591,591,591,593,593,591,,593,,', +',,,,,,593,593,,593,593,593,593,593,593,593,,,593,593,,,,,593,593,593', +'593,,,,,,593,,,,,,,593,593,,593,593,593,593,593,593,593,593,593,593', +'593,822,822,593,,822,,,,,,,,,822,822,,822,822,822,822,822,822,822,,', +'822,822,,,,,822,822,822,822,,,,,,,,,,,,,822,822,,822,822,822,822,822', +'822,822,822,822,822,822,946,946,822,,946,,,,,,,,,946,946,,946,946,946', +'946,946,946,946,,,946,946,,,,,946,946,946,946,,,,,,946,,,,,,,946,946', +',946,946,946,946,946,946,946,946,946,946,946,947,947,946,,947,,,,,,', +',,947,947,,947,947,947,947,947,947,947,,,947,947,,,,,947,947,947,947', +',,,,,,,,,,,,947,947,,947,947,947,947,947,947,947,947,947,947,947,,,947' ] + racc_action_check = arr = ::Array.new(25031, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + -2, 34, nil, 234, nil, 618, -19, 22922, 23046, -5, + -1, 15, 117, 414, 291, 243, nil, 125, 252, 900, + 186, nil, 379, 506, 633, 381, 13, 760, 22407, nil, + 900, 1027, 1154, nil, 108, 541, 237, 261, 1294, 1421, + 1548, 176, 467, nil, nil, nil, nil, nil, nil, nil, + 22537, nil, 1675, 1802, 1929, 29, 9932, 2056, 2183, nil, + nil, 2310, 2450, 2577, nil, 23418, nil, nil, nil, nil, + nil, -102, nil, nil, nil, nil, nil, 178, 220, 23531, + nil, nil, nil, 429, 2704, nil, nil, 2831, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 359, nil, 2971, + nil, nil, nil, 3111, 3238, 3365, 3492, 3632, 3772, nil, + 663, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 23644, 234, nil, 3912, 4039, 4166, 4293, 4420, + 4547, 23818, 22792, 23879, 4674, 4801, 4928, nil, 541, -49, + 319, 61, 240, 328, 5068, 5195, nil, nil, 5322, 363, + 5449, 5576, 5703, 5830, 5957, 6084, 6211, 6338, 6465, 6592, + 6719, 6846, 6973, 7100, 7227, 7354, 7481, 7608, 7735, 7862, + 7989, 8116, 8243, 8370, 8497, 8624, nil, nil, nil, 1294, + nil, 329, 339, nil, 8751, 389, 8878, nil, nil, nil, + nil, 9005, nil, nil, 23940, 24001, 24062, 383, 9132, 9259, + nil, nil, nil, nil, nil, nil, nil, 9386, 249, 745, + 390, 9526, 409, 438, 405, 9653, 9793, 73, 594, 497, + 196, 465, 440, 207, nil, 478, 471, nil, 9920, nil, + 586, 505, 531, 633, nil, 533, nil, 10047, nil, 10187, + 35, nil, 502, -103, 135, 537, 521, 262, 556, nil, + nil, -22, 10580, nil, nil, nil, 520, 545, nil, 564, + 567, nil, nil, nil, nil, nil, nil, nil, 3097, nil, + nil, nil, 648, nil, nil, 674, 806, -7, 36, 10314, + 10441, 324, 63, 596, -17, 668, 690, 37, 731, nil, + nil, 506, 704, nil, 721, nil, 65, nil, nil, 10568, + -12, 122, 360, 384, 385, 436, 509, 590, nil, 795, + nil, 10695, nil, 173, nil, 326, nil, -23, 649, 362, + nil, 653, -50, nil, 365, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 683, 23170, nil, nil, nil, 23294, 688, nil, nil, 760, + nil, 10822, 681, nil, 691, nil, nil, 1421, 728, 731, + 668, 761, 10949, nil, nil, nil, 21929, 757, 22011, nil, + 11076, 11203, 11330, nil, nil, nil, 1548, nil, nil, 24123, + 24184, 11457, 11584, 180, 11711, 11838, 11965, 115, nil, 3238, + 3365, 232, 879, 785, 787, 821, 824, 2457, 2584, 5068, + 3492, 3632, 3772, 3912, 4039, 4166, 4293, 4420, 4547, 4674, + 1133, 1232, 4801, 4928, 633, -34, nil, 12092, nil, 12219, + nil, 12346, nil, nil, 22667, 22724, 22792, -17, nil, 771, + nil, nil, 785, 787, nil, nil, 12473, 59, 203, 832, + nil, nil, 12613, 833, 797, nil, nil, 799, 12753, 845, + 12880, 24245, 24306, 13007, 24367, 223, 848, nil, nil, 821, + nil, 13134, 13261, 13388, 24428, 24489, 1675, 13515, 949, 951, + 871, nil, nil, 13642, nil, nil, 13769, nil, nil, nil, + nil, 13909, 14049, 874, nil, 1000, nil, nil, 14176, 12765, + nil, 772, nil, nil, 894, nil, 3126, nil, 859, 1198, + nil, nil, 14316, 977, nil, nil, 14456, 212, 227, 975, + 983, 14596, nil, 14723, 24550, 24611, 14850, 40, nil, 760, + nil, 24672, 14977, 24733, nil, nil, 15104, 387, 15231, nil, + 1166, nil, nil, nil, 45, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, -35, nil, nil, nil, 864, + nil, nil, nil, nil, nil, 15358, 866, 15485, 798, 203, + 15612, 15739, 900, nil, nil, nil, 15866, 903, nil, 15993, + 915, nil, 268, 307, 22143, 22275, 927, 928, 506, nil, + 16120, nil, 1040, nil, 16260, 897, nil, 939, 16387, nil, + nil, nil, nil, nil, nil, nil, nil, 16527, nil, 942, + 16654, 16781, 2310, 907, nil, nil, 947, 16921, 17061, nil, + 1154, -27, 17188, 914, nil, 957, 228, 235, 962, 313, + 327, 963, 960, 972, 17315, 1802, 997, 1001, 240, 1056, + 17442, nil, nil, 376, 960, 1068, nil, nil, 945, nil, + 958, 935, 1035, 963, 967, nil, nil, 1010, 3135, nil, + 869, nil, 1096, nil, nil, nil, nil, nil, 1102, nil, + 1103, 17569, 1020, 46, 52, 59, 102, 1021, 17696, 1027, + nil, 1028, 1026, 17836, 416, nil, -25, 17976, 18116, 9665, + 463, nil, nil, 1075, nil, 18243, nil, 998, 999, nil, + 1000, 1002, 1004, nil, 996, nil, 23757, 1043, 1050, 18383, + nil, nil, nil, 1929, 1007, 18510, 18637, 18764, nil, 2056, + nil, 2183, nil, nil, 2446, nil, 2573, nil, 18891, 19018, + 19145, 315, 319, 2704, nil, 1041, 1144, nil, nil, 1041, + nil, 1026, 19272, nil, 1053, 1161, 1072, 323, nil, nil, + nil, 1196, nil, 19412, 1081, 1125, nil, nil, nil, nil, + nil, nil, 24794, nil, 1127, nil, nil, nil, nil, 1407, + 1215, nil, 19539, 1220, 19679, 19819, nil, nil, 66, 56, + 988, 295, nil, 1221, nil, nil, 1222, 1225, 1109, nil, + nil, nil, -32, nil, nil, 807, 14188, nil, 842, nil, + 406, nil, 19946, nil, nil, nil, nil, nil, nil, nil, + 1127, 1113, nil, 2831, nil, 2971, 20073, 20200, nil, nil, + nil, 20327, 1114, nil, nil, nil, 20467, nil, nil, 72, + 20594, nil, 1154, 1125, nil, nil, 78, nil, 1249, 1250, + 20721, 20861, nil, nil, 21001, nil, nil, 1168, nil, 1132, + nil, nil, 1133, 1134, 1139, 1137, nil, nil, 22721, nil, + nil, 21128, nil, 21268, 91, 1112, 1221, 97, nil, nil, + 21408, nil, nil, nil, 460, 21548, 1268, nil, nil, 1081, + nil, nil, nil, 21688, 1273, 21815, 24855, 24916, 98, 899, + nil, nil, nil, 1272, nil, 1153, 1275, nil, 1190, 108, + 120, 198, 202, nil, nil, nil, nil, 218 ] + +racc_action_default = [ + -3, -555, -1, -543, -4, -6, -555, -555, -555, -555, + -555, -555, -555, -555, -277, -37, -38, -555, -555, -43, + -45, -46, -289, -327, -328, -50, -255, -382, -255, -65, + -10, -69, -76, -78, -555, -457, -555, -555, -555, -555, + -555, -545, -232, -270, -271, -272, -273, -274, -275, -276, + -533, -279, -555, -554, -525, -297, -554, -555, -555, -302, + -305, -543, -555, -555, -319, -555, -329, -330, -400, -401, + -402, -403, -404, -554, -407, -554, -554, -554, -554, -554, + -434, -440, -441, -555, -446, -447, -448, -449, -450, -451, + -452, -453, -454, -455, -456, -459, -460, -555, -2, -544, + -550, -551, -552, -555, -555, -555, -555, -555, -3, -13, + -555, -105, -106, -107, -108, -109, -110, -111, -114, -115, + -116, -117, -118, -119, -120, -121, -122, -123, -124, -125, + -126, -127, -128, -129, -130, -131, -132, -133, -134, -135, + -136, -137, -138, -139, -140, -141, -142, -143, -144, -145, + -146, -147, -148, -149, -150, -151, -152, -153, -154, -155, + -156, -157, -158, -159, -160, -161, -162, -163, -164, -165, + -166, -167, -168, -169, -170, -171, -172, -173, -174, -175, + -176, -177, -178, -179, -180, -181, -182, -183, -184, -185, + -186, -187, -555, -18, -112, -10, -555, -555, -555, -554, + -554, -555, -555, -555, -555, -555, -555, -41, -555, -457, + -555, -277, -555, -555, -10, -555, -42, -224, -555, -555, + -555, -555, -555, -555, -555, -555, -555, -555, -555, -555, + -555, -555, -555, -555, -555, -555, -555, -555, -555, -555, + -555, -555, -555, -555, -555, -555, -369, -371, -47, -233, + -248, -262, -262, -252, -555, -263, -555, -289, -327, -328, + -527, -555, -48, -49, -555, -555, -555, -55, -554, -555, + -296, -375, -383, -385, -63, -381, -64, -555, -543, -11, + -65, -10, -555, -555, -70, -73, -10, -457, -555, -555, + -277, -292, -545, -555, -331, -382, -555, -75, -555, -80, + -284, -442, -443, -555, -209, -210, -225, -555, -546, -10, + -545, -234, -545, -547, -547, -555, -555, -547, -555, -298, + -299, -555, -555, -342, -343, -350, -554, -491, -357, -554, + -554, -368, -490, -492, -493, -494, -495, -496, -555, -509, + -514, -515, -517, -518, -519, -555, -44, -555, -555, -555, + -555, -543, -555, -544, -457, -555, -555, -277, -555, -498, + -499, -101, -555, -103, -555, -277, -555, -316, -457, -555, + -105, -106, -143, -144, -160, -165, -172, -175, -322, -555, + -523, -555, -405, -555, -420, -555, -422, -555, -555, -555, + -412, -555, -555, -418, -555, -433, -435, -436, -437, -438, + -444, -445, 968, -5, -553, -19, -20, -21, -22, -23, + -555, -555, -15, -16, -17, -555, -555, -25, -34, -188, + -263, -555, -555, -26, -35, -36, -27, -190, -555, -555, + -534, -535, -554, -378, -536, -537, -534, -255, -535, -380, + -539, -540, -554, -534, -535, -33, -198, -39, -40, -555, + -555, -554, -554, -284, -555, -555, -555, -555, -295, -199, + -200, -201, -202, -203, -204, -205, -206, -211, -212, -213, + -214, -215, -216, -217, -218, -219, -220, -221, -222, -223, + -226, -227, -228, -229, -555, -554, -249, -555, -250, -555, + -260, -555, -264, -530, -255, -255, -255, -554, -56, -545, + -243, -244, -262, -262, -256, -257, -555, -554, -554, -555, + -291, -9, -544, -555, -66, -282, -81, -71, -555, -555, + -554, -555, -555, -554, -555, -284, -555, -442, -443, -77, + -82, -555, -555, -555, -555, -555, -230, -555, -392, -555, + -555, -235, -236, -549, -548, -238, -549, -287, -288, -526, + -339, -10, -10, -555, -341, -555, -359, -366, -555, -363, + -364, -555, -367, -491, -555, -500, -555, -502, -504, -508, + -516, -520, -10, -332, -333, -334, -10, -555, -555, -555, + -555, -10, -387, -554, -555, -555, -554, -284, -311, -101, + -102, -555, -554, -555, -314, -461, -555, -555, -555, -320, + -489, -324, -541, -542, -545, -406, -421, -424, -425, -427, + -408, -423, -409, -410, -411, -555, -414, -416, -417, -555, + -439, -7, -14, -113, -24, -555, -269, -555, -285, -286, + -555, -555, -59, -241, -242, -376, -555, -61, -379, -555, + -57, -377, -534, -535, -534, -535, -555, -555, -188, -294, + -555, -353, -555, -355, -10, -262, -261, -265, -555, -528, + -529, -51, -372, -52, -373, -53, -374, -10, -239, -555, + -245, -247, -43, -555, -254, -258, -555, -10, -10, -290, + -12, -66, -555, -74, -79, -555, -534, -535, -554, -538, + -283, -555, -555, -554, -555, -197, -207, -208, -555, -554, + -554, -280, -281, -547, -555, -555, -340, -351, -555, -358, + -554, -352, -555, -554, -554, -510, -497, -555, -555, -507, + -554, -335, -554, -303, -336, -337, -338, -306, -555, -309, + -555, -555, -555, -534, -535, -538, -283, -555, -555, -101, + -104, -538, -555, -10, -555, -463, -555, -10, -10, -489, + -555, -466, -467, -469, -470, -472, -473, -522, -522, -478, + -480, -480, -480, -488, -491, -512, -555, -555, -555, -10, + -413, -415, -419, -189, -267, -555, -555, -555, -30, -193, + -31, -194, -60, -32, -195, -62, -196, -58, -555, -555, + -555, -286, -285, -231, -354, -555, -555, -251, -266, -555, + -240, -262, -555, -259, -555, -555, -72, -285, -286, -83, + -293, -554, -348, -10, -393, -554, -394, -395, -237, -344, + -345, -365, -555, -284, -555, -361, -362, -501, -503, -506, + -555, -346, -555, -555, -10, -10, -308, -310, -555, -285, + -93, -555, -285, -555, -462, -317, -555, -555, -545, -465, + -468, -471, -555, -476, -477, -555, -555, -484, -555, -486, + -555, -487, -555, -325, -524, -426, -429, -430, -431, -432, + -555, -268, -28, -191, -29, -192, -555, -555, -356, -370, + -54, -246, -262, -384, -386, -8, -10, -399, -349, -555, + -555, -397, -283, -554, -505, -300, -555, -301, -555, -555, + -555, -10, -312, -315, -10, -321, -323, -555, -474, -522, + -521, -479, -480, -480, -480, -555, -513, -511, -489, -428, + -253, -555, -398, -10, -457, -555, -555, -277, -396, -360, + -10, -304, -307, -265, -554, -10, -555, -464, -475, -555, + -482, -483, -485, -10, -392, -554, -555, -555, -284, -554, + -388, -389, -390, -555, -318, -480, -555, -391, -555, -534, + -535, -538, -283, -347, -313, -481, -326, -285 ] + +clist = [ +'13,315,307,699,323,378,498,114,114,539,250,250,250,432,437,442,5,208', +'208,396,284,488,208,208,208,659,331,102,294,294,13,288,288,572,576,529', +'10,98,12,557,748,312,560,562,251,251,251,366,565,109,194,580,208,208', +'117,117,216,208,208,294,294,208,355,364,99,114,10,715,12,418,425,760', +'707,267,274,276,494,495,496,114,542,545,659,2,549,102,280,297,252,252', +'252,606,763,723,727,352,759,616,359,13,1,916,590,208,208,208,208,13', +'13,347,348,403,282,351,641,5,564,710,385,387,317,714,394,409,5,885,830', +'248,262,263,193,360,396,411,499,10,668,12,676,504,207,654,811,10,10', +'12,12,428,429,853,854,380,316,667,319,405,406,407,408,320,358,594,762', +'677,678,833,662,664,666,379,601,309,349,834,350,310,835,738,935,743', +'346,346,916,598,346,904,369,312,312,747,600,410,114,766,918,13,208,208', +'208,208,208,321,441,550,208,208,208,659,713,247,485,656,507,656,13,208', +'508,950,422,422,760,731,815,889,382,383,346,346,346,346,674,10,389,12', +'417,423,426,615,392,865,768,763,445,769,848,759,909,908,912,828,10,', +'12,526,,683,250,250,,,,432,437,,,250,,,208,208,553,540,488,541,,,565', +'208,728,719,,13,294,,,288,13,530,,,502,251,331,,,294,,,288,251,,938', +'102,,,,,,,13,,762,511,,,,,10,,12,,,10,771,12,,271,275,447,448,14,740', +',688,503,252,693,280,457,512,517,707,280,252,717,10,688,12,910,208,208', +'910,759,599,759,963,759,902,943,,14,290,290,513,715,641,294,,519,364', +',782,,501,505,102,785,951,,787,,208,509,,,579,893,,,760,595,,357,365', +'656,656,688,,,646,647,577,578,,,688,,,,957,763,114,,,759,114,,659,913', +'806,914,,,821,797,,825,826,565,14,,,,,,759,,14,14,312,312,,,843,,,,846', +'847,,441,208,208,622,,,,623,117,,669,,117,,,,,,685,,818,692,346,346', +',,,,,632,762,,,,637,,,,,640,,,,,,,,,,,,955,,,604,,208,530,312,,,312', +'13,,,294,,,288,,208,,441,208,901,14,,,680,,,732,,,737,441,,208,,894', +'742,661,663,665,14,,,,10,,12,13,13,655,,294,,,711,,,,,,,767,,,,,797', +'312,13,816,312,923,13,857,859,861,312,13,930,208,,441,208,10,10,12,12', +'441,208,271,35,275,208,,208,,795,724,724,,936,656,929,,10,703,12,14', +'10,,12,290,14,10,,12,,745,331,,35,287,287,,290,310,208,208,,952,,,208', +',,14,,,,956,,656,,,744,,,920,,,13,,354,368,,368,698,,283,,,,,13,778', +'780,,530,,,783,,,13,13,294,,,288,809,,,,,,,10,294,12,35,288,,,,,365', +',35,35,10,,12,863,,,,,,,10,10,12,12,,,346,,746,422,,,,,,,940,941,942', +'634,,,,801,638,208,,,,634,13,,,,13,13,,,,,838,,,,,688,,,,,,,,114,,844', +'13,845,,965,,849,,208,208,,10,,12,,10,10,12,12,,,35,841,,,,634,634,634', +',,,,,,,,10,,12,35,907,,,,13,872,874,,,,,,,441,,882,,,416,,,,,208,318', +'13,13,,,,,,,14,,,,283,,290,10,,12,,,,,,,,,,346,,,,724,,,,,10,10,12,12', +',35,,,,287,35,14,14,,896,,13,294,365,,925,,287,958,,,,,,,,13,14,35,13', +',14,,,,,14,,283,,,,,283,,,,10,13,12,,928,,,,13,,,312,,13,,10,,12,10', +',12,13,,208,,441,,,,,,,,346,,,,10,,12,,368,,,10,,12,,,10,,12,,420,424', +',,10,,12,,,14,,,,634,,,638,,634,,,,14,,,,,,,,,,14,14,,,,290,,,,,,,,', +',,,290,,,,,,,,,490,,492,,,,,493,,,,,,,,,,,,,,,,,,,,,,324,,,,,,,,,,,14', +',,,14,14,384,,386,386,390,393,386,,,,,,,,,,,,,869,14,,,,,,,35,,,,,,287', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,,35,35,,,,,,368,,,,,,,,,,,,14,14,35', +'217,,,35,249,249,249,,35,,,,,,,,704,705,,,304,305,306,,,,,,,,,,,626', +',249,249,720,,,,722,,,,,730,,,14,,,,927,,,,,,,,,,,14,,,14,,,,,,,,,,', +',,,35,,,,,14,,,,,,,14,35,,,,14,657,,318,,660,35,35,14,500,,287,,,,,', +',,,673,796,,287,,,,,,,,,,,799,,,,,,,,,,804,805,,,,,,,,,,,,657,,,318', +',,,,,,556,,,556,556,35,,,,35,35,,,419,249,427,249,249,,,,446,,,,,,,', +',,35,,,,217,,459,460,461,462,463,464,465,466,467,468,469,470,471,472', +'473,474,475,476,477,478,479,480,481,482,483,484,,,,,,,870,,249,,249', +'774,35,,,249,,,,,,,249,249,,,,,,,,249,,35,35,,,,,,,,798,633,,,,,,,888', +',,633,657,318,,,,,,536,,,,,,,,,,898,899,,,,,,,,,,,,814,35,,,,924,,,', +',,,651,,,,35,,,35,,633,633,633,651,,,,,,,420,,,651,651,,,35,922,,,,', +',35,,,,,35,,,,934,851,,,35,,,,,,,,,,,,,,,,,871,944,,,,,,,949,,,,,953', +',,249,,,,,,,,,,,420,,,,,,,,,,,,,,,,,,,249,249,,446,648,427,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,249,,249,,249,917,,,,,,,,,,,,,,672,,,,,318,,,,', +',,,,249,,,249,,,,,,,933,695,696,697,,,,,,,,,,249,,633,249,,,,633,933', +',,,,812,817,,,,,,,,,,556,,,556,556,,,,,,812,,812,,,,249,,,249,,,,,,249', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,773,,249,,,779,781,,,293,293,784,,,786', +',293,293,293,,,,,,,793,,,,,,,293,249,,,,,,,293,293,,887,,249,249,891', +',,,,,,,,,,,,,,,,,,,,,,,,,,,249,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,249,,,', +',,,,,,,,,,,,,,,556,,,,,249,,,,,,,,,,,,,,,,,,,,249,873,875,,,,,,,,,,', +'779,781,784,812,,,,,,,,,,,249,,,,812,,,,,,,,,,,,,,,293,,293,293,293', +'293,293,293,293,293,293,293,293,293,293,293,293,293,293,293,293,293', +'293,293,293,293,293,293,,,,,,,,,293,,293,,,249,,293,,,,,,,,,,,,875,873', +',,,249,,,,,,,293,,,,,,,,,,,,249,293,,,,,,,,,293,,,,,,,,,,,249,,,,,,', +',,,,,,,,,,,,,,,,,249,,,,,,,,,,,,,,,,,,,,,,,,,,,293,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,293,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,293,293,293,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,293,,293,,293,,,,,,,,,,', +',,,,,,,,,,,,,,,,293,,,,,,,,,,,,,293,293,293,,,,,,,,,,293,,,293,,,,,', +',,,,,,293,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,293,,293,,,,,,,,,,,,293,,,,,,,,,,,293,,,,,,,,293,,,,,,,,,,,', +'293,293,,,,,,,,,,,293,,,,,,,,,,,,293,,,,,,293,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,293,,,,,,,,,,,,,,,,,,,,,,,,293,,,,,,,,,,,,,,,,,,,,293,,,,,,', +',,,,,,293,293,293,,,,,,,,,,,,293,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,293,,,,,,,,,,,,,,293,293,,,,293,,,,,,,,,293', +',,,,,,,,,293,,,,,,,,,,,,,,,,,,,,,293' ] + racc_goto_table = arr = ::Array.new(2674, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'21,22,51,10,104,47,35,48,48,8,29,29,29,33,33,33,7,21,21,47,41,61,21', +'21,21,154,107,83,52,52,21,21,21,77,77,43,17,4,20,109,84,29,109,109,54', +'54,54,46,145,14,14,80,21,21,50,50,18,21,21,52,52,21,21,21,6,48,17,147', +'20,24,24,110,106,34,34,34,33,33,33,48,55,55,154,2,55,83,38,42,56,56', +'56,129,141,79,79,4,108,129,17,21,1,151,45,21,21,21,21,21,21,16,16,5', +'39,16,60,7,148,111,126,126,56,111,126,7,7,12,78,31,31,31,15,19,47,27', +'58,17,59,20,63,64,26,36,11,17,17,20,20,22,22,142,142,72,73,36,74,16', +'16,16,16,76,81,82,111,36,36,11,60,60,60,85,86,87,88,89,90,26,91,92,93', +'94,26,26,151,95,26,96,97,29,29,98,99,2,48,100,101,21,21,21,21,21,21', +'102,48,103,21,21,21,154,105,112,113,62,115,62,21,21,116,117,54,54,110', +'118,119,120,124,125,26,26,26,26,62,17,127,20,18,18,18,128,130,131,132', +'141,18,133,135,108,137,139,144,149,17,,20,51,,43,29,29,,,,33,33,,,29', +',,21,21,104,51,61,51,,,145,21,80,145,,21,52,,,21,21,41,,,54,54,107,', +',52,,,21,54,,142,83,,,,,,,21,,111,4,,,,,17,,20,,,17,129,20,,57,57,26', +'26,23,45,,33,56,56,33,38,26,6,42,106,38,56,148,17,33,20,108,21,21,108', +'108,46,108,78,108,79,84,,23,23,23,39,147,60,52,,39,21,,35,,31,31,83', +'35,11,,35,,21,31,,,4,111,,,110,83,,23,23,62,62,33,,,22,22,16,16,,,33', +',,,10,141,48,,,108,48,,154,111,43,111,,,109,61,,109,109,145,23,,,,,', +'108,,23,23,29,29,,,8,,,,8,8,,48,21,21,14,,,,14,50,,51,,50,,,,,,22,,55', +'22,26,26,,,,,,34,111,,,,34,,,,,34,,,,,,,,,,,,111,,,26,,21,41,29,,,29', +'21,,,52,,,21,,21,,48,21,77,23,,,7,,,22,,,22,48,,21,,145,22,34,34,34', +'23,,,,17,,20,21,21,56,,52,,,21,,,,,,,51,,,,,61,29,21,24,29,77,21,143', +'143,143,29,21,77,21,,48,21,17,17,20,20,48,21,57,44,57,21,,21,,104,83', +'83,,8,62,109,,17,56,20,23,17,,20,23,23,17,,20,,83,107,,44,44,44,,23', +'26,21,21,,80,,,21,,,23,,,,8,,62,,,16,,,61,,,21,,44,44,,44,26,,9,,,,', +'21,18,18,,41,,,18,,,21,21,52,,,21,41,,,,,,,17,52,20,44,21,,,,,23,,44', +'44,17,,20,47,,,,,,,17,17,20,20,,,26,,26,54,,,,,,,143,143,143,57,,,,56', +'57,21,,,,57,21,,,,21,21,,,,,54,,,,,33,,,,,,,,48,,83,21,83,,143,,83,', +'21,21,,17,,20,,17,17,20,20,,,44,16,,,,57,57,57,,,,,,,,,17,,20,44,51', +',,,21,18,18,,,,,,,48,,54,,,9,,,,,21,25,21,21,,,,,,,23,,,,9,,23,17,,20', +',,,,,,,,,26,,,,83,,,,,17,17,20,20,,44,,,,44,44,23,23,,16,,21,52,23,', +'21,,44,22,,,,,,,,21,23,44,21,,23,,,,,23,,9,,,,,9,,,,17,21,20,,17,,,', +'21,,,29,,21,,17,,20,17,,20,21,,21,,48,,,,,,,,26,,,,17,,20,,44,,,17,', +'20,,,17,,20,,25,25,,,17,,20,,,23,,,,57,,,57,,57,,,,23,,,,,,,,,,23,23', +',,,23,,,,,,,,,,,,23,,,,,,,,,25,,25,,,,,25,,,,,,,,,,,,,,,,,,,,,,53,,', +',,,,,,,,23,,,,23,23,53,,53,53,53,53,53,,,,,,,,,,,,,23,23,,,,,,,44,,', +',,,44,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,23,,44,44,,,,,,44,,,,,,,,,,,,23', +'23,44,28,,,44,28,28,28,,44,,,,,,,,9,9,,,28,28,28,,,,,,,,,,,25,,28,28', +'9,,,,9,,,,,9,,,23,,,,23,,,,,,,,,,,23,,,23,,,,,,,,,,,,,,44,,,,,23,,,', +',,,23,44,,,,23,25,,25,,25,44,44,23,53,,44,,,,,,,,,25,9,,44,,,,,,,,,', +',9,,,,,,,,,,9,9,,,,,,,,,,,,25,,,25,,,,,,,53,,,53,53,44,,,,44,44,,,28', +'28,28,28,28,,,,28,,,,,,,,,,44,,,,28,,28,28,28,28,28,28,28,28,28,28,28', +'28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,,,,,,,9,,28,,28,25,44,', +',28,,,,,,,28,28,,,,,,,,28,,44,44,,,,,,,,25,53,,,,,,,9,,,53,25,25,,,', +',,28,,,,,,,,,,9,9,,,,,,,,,,,,25,44,,,,44,,,,,,,53,,,,44,,,44,,53,53', +'53,53,,,,,,,25,,,53,53,,,44,9,,,,,,44,,,,,44,,,,9,25,,,44,,,,,,,,,,', +',,,,,,25,9,,,,,,,9,,,,,9,,,28,,,,,,,,,,,25,,,,,,,,,,,,,,,,,,,28,28,', +'28,28,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,,28,,28,25,,,,,,,,,,,,,,28', +',,,,25,,,,,,,,,28,,,28,,,,,,,25,28,28,28,,,,,,,,,,28,,53,28,,,,53,25', +',,,,53,53,,,,,,,,,,53,,,53,53,,,,,,53,,53,,,,28,,,28,,,,,,28,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,28,,28,,,28,28,,,37,37,28,,,28,,37,37,37,,', +',,,,28,,,,,,,37,28,,,,,,,37,37,,53,,28,28,53,,,,,,,,,,,,,,,,,,,,,,,', +',,,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,,,,,,,,,,,,,,,,,,,53,,,,,28', +',,,,,,,,,,,,,,,,,,,28,28,28,,,,,,,,,,,28,28,28,53,,,,,,,,,,,28,,,,53', +',,,,,,,,,,,,,,37,,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37', +'37,37,37,37,37,37,37,37,37,,,,,,,,,37,,37,,,28,,37,,,,,,,,,,,,28,28', +',,,28,,,,,,,37,,,,,,,,,,,,28,37,,,,,,,,,37,,,,,,,,,,,28,,,,,,,,,,,,', +',,,,,,,,,,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,37,37', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,37,,37,,,,,,,,,,,,,,,,,,,,,,,,,,,37', +',,,,,,,,,,,,37,37,37,,,,,,,,,,37,,,37,,,,,,,,,,,,37,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,37,,,,,,,,,,,', +'37,,,,,,,,,,,37,,,,,,,,37,,,,,,,,,,,,37,37,,,,,,,,,,,37,,,,,,,,,,,,37', +',,,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,,,,37,', +',,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,37,37,37,,,,,,,,,,,,37,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,37,37', +',,,37,,,,,,,,,37,,,,,,,,,,37,,,,,,,,,,,,,,,,,,,,,37' ] + racc_goto_check = arr = ::Array.new(2674, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 100, 83, nil, 34, 12, 61, 16, -300, 632, + -535, -557, -686, nil, 42, 122, 52, 36, 38, 69, + 38, 0, -52, 330, -127, 779, 123, 24, 1149, -12, + nil, 105, nil, -188, 47, -261, -344, 1752, 56, 82, + nil, -11, 55, -263, 594, -260, -16, -60, 0, nil, + 47, -39, -3, 1006, 22, -233, 66, 300, -134, -363, + -328, -231, -276, -368, -130, nil, nil, nil, nil, nil, + nil, nil, 86, 98, 99, nil, 103, -314, -594, -484, + -301, 98, -205, 24, -560, 104, -209, 120, 113, -550, + 114, -551, -411, -724, -415, -184, -660, 122, -410, -188, + -408, -669, 145, -118, -52, -351, -483, -30, -504, -287, + -529, -438, 189, -36, nil, -60, -57, -717, -361, -478, + -592, nil, nil, nil, 153, 152, 43, 155, -152, -292, + 160, -529, -368, -366, nil, -505, nil, -606, nil, -605, + nil, -508, -608, -183, -608, -290, nil, -492, -222, -469, + nil, -757, nil, nil, -464 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 353, 279, nil, 538, + nil, 831, nil, 278, nil, nil, nil, 212, 16, 11, + 213, 303, nil, 211, nil, 255, 15, nil, 19, 20, + 21, nil, 25, 691, nil, nil, nil, 26, 29, nil, + 31, 34, 33, nil, 209, 363, nil, 116, 435, 115, + 69, nil, 42, 311, 313, nil, 314, 433, nil, nil, + 635, 486, 253, nil, nil, 269, 43, 44, 45, 46, + 47, 48, 49, nil, 270, 55, nil, nil, nil, nil, + nil, nil, nil, 573, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 326, 325, 709, 328, nil, + 329, 330, nil, nil, 439, nil, nil, nil, nil, nil, + nil, 68, 70, 71, 72, nil, nil, nil, nil, 611, + nil, nil, nil, nil, 395, 750, 753, 758, 755, 756, + 757, 911, nil, nil, 761, 337, 332, 339, nil, 567, + 568, 765, 342, 345, 260 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 143, :_reduce_none, + 2, 144, :_reduce_2, + 0, 145, :_reduce_3, + 1, 145, :_reduce_4, + 3, 145, :_reduce_5, + 1, 147, :_reduce_none, + 4, 147, :_reduce_7, + 4, 150, :_reduce_8, + 2, 151, :_reduce_9, + 0, 155, :_reduce_10, + 1, 155, :_reduce_11, + 3, 155, :_reduce_12, + 0, 169, :_reduce_13, + 4, 149, :_reduce_14, + 3, 149, :_reduce_15, + 3, 149, :_reduce_none, + 3, 149, :_reduce_17, + 2, 149, :_reduce_18, + 3, 149, :_reduce_19, + 3, 149, :_reduce_20, + 3, 149, :_reduce_21, + 3, 149, :_reduce_22, + 3, 149, :_reduce_23, + 4, 149, :_reduce_none, + 3, 149, :_reduce_25, + 3, 149, :_reduce_26, + 3, 149, :_reduce_27, + 6, 149, :_reduce_none, + 6, 149, :_reduce_none, + 5, 149, :_reduce_30, + 5, 149, :_reduce_none, + 5, 149, :_reduce_none, + 3, 149, :_reduce_none, + 3, 149, :_reduce_34, + 3, 149, :_reduce_35, + 3, 149, :_reduce_36, + 1, 149, :_reduce_none, + 1, 168, :_reduce_none, + 3, 168, :_reduce_39, + 3, 168, :_reduce_40, + 2, 168, :_reduce_41, + 2, 168, :_reduce_42, + 1, 168, :_reduce_none, + 1, 158, :_reduce_none, + 1, 160, :_reduce_none, + 1, 160, :_reduce_none, + 2, 160, :_reduce_47, + 2, 160, :_reduce_48, + 2, 160, :_reduce_49, + 1, 172, :_reduce_none, + 4, 172, :_reduce_none, + 4, 172, :_reduce_none, + 4, 172, :_reduce_none, + 4, 177, :_reduce_none, + 2, 171, :_reduce_55, + 3, 171, :_reduce_none, + 4, 171, :_reduce_57, + 5, 171, :_reduce_none, + 4, 171, :_reduce_59, + 5, 171, :_reduce_none, + 4, 171, :_reduce_61, + 5, 171, :_reduce_none, + 2, 171, :_reduce_63, + 2, 171, :_reduce_64, + 1, 161, :_reduce_65, + 3, 161, :_reduce_66, + 1, 181, :_reduce_67, + 3, 181, :_reduce_68, + 1, 180, :_reduce_69, + 2, 180, :_reduce_70, + 3, 180, :_reduce_71, + 5, 180, :_reduce_none, + 2, 180, :_reduce_73, + 4, 180, :_reduce_none, + 2, 180, :_reduce_75, + 1, 180, :_reduce_76, + 3, 180, :_reduce_none, + 1, 183, :_reduce_78, + 3, 183, :_reduce_79, + 2, 182, :_reduce_80, + 3, 182, :_reduce_81, + 1, 185, :_reduce_none, + 3, 185, :_reduce_none, + 1, 184, :_reduce_84, + 4, 184, :_reduce_85, + 3, 184, :_reduce_86, + 3, 184, :_reduce_none, + 3, 184, :_reduce_none, + 3, 184, :_reduce_none, + 2, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 159, :_reduce_92, + 4, 159, :_reduce_93, + 4, 159, :_reduce_94, + 3, 159, :_reduce_95, + 3, 159, :_reduce_96, + 3, 159, :_reduce_97, + 3, 159, :_reduce_98, + 2, 159, :_reduce_99, + 1, 159, :_reduce_none, + 1, 187, :_reduce_none, + 2, 188, :_reduce_102, + 1, 188, :_reduce_103, + 3, 188, :_reduce_104, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_none, + 1, 189, :_reduce_108, + 1, 189, :_reduce_109, + 1, 156, :_reduce_110, + 1, 156, :_reduce_none, + 1, 157, :_reduce_112, + 3, 157, :_reduce_113, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 190, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 1, 191, :_reduce_none, + 3, 170, :_reduce_188, + 5, 170, :_reduce_189, + 3, 170, :_reduce_190, + 6, 170, :_reduce_191, + 6, 170, :_reduce_192, + 5, 170, :_reduce_193, + 5, 170, :_reduce_none, + 5, 170, :_reduce_none, + 5, 170, :_reduce_none, + 4, 170, :_reduce_none, + 3, 170, :_reduce_none, + 3, 170, :_reduce_199, + 3, 170, :_reduce_200, + 3, 170, :_reduce_201, + 3, 170, :_reduce_202, + 3, 170, :_reduce_203, + 3, 170, :_reduce_204, + 3, 170, :_reduce_205, + 3, 170, :_reduce_206, + 4, 170, :_reduce_207, + 4, 170, :_reduce_208, + 2, 170, :_reduce_209, + 2, 170, :_reduce_210, + 3, 170, :_reduce_211, + 3, 170, :_reduce_212, + 3, 170, :_reduce_213, + 3, 170, :_reduce_214, + 3, 170, :_reduce_215, + 3, 170, :_reduce_216, + 3, 170, :_reduce_217, + 3, 170, :_reduce_218, + 3, 170, :_reduce_219, + 3, 170, :_reduce_220, + 3, 170, :_reduce_221, + 3, 170, :_reduce_222, + 3, 170, :_reduce_223, + 2, 170, :_reduce_224, + 2, 170, :_reduce_225, + 3, 170, :_reduce_226, + 3, 170, :_reduce_227, + 3, 170, :_reduce_228, + 3, 170, :_reduce_229, + 3, 170, :_reduce_230, + 5, 170, :_reduce_231, + 1, 170, :_reduce_none, + 1, 167, :_reduce_none, + 1, 164, :_reduce_234, + 2, 164, :_reduce_235, + 2, 164, :_reduce_236, + 4, 164, :_reduce_237, + 2, 164, :_reduce_238, + 3, 199, :_reduce_239, + 2, 201, :_reduce_none, + 1, 202, :_reduce_241, + 1, 202, :_reduce_none, + 1, 200, :_reduce_243, + 1, 200, :_reduce_none, + 2, 200, :_reduce_245, + 4, 200, :_reduce_246, + 2, 200, :_reduce_247, + 1, 173, :_reduce_248, + 2, 173, :_reduce_249, + 2, 173, :_reduce_250, + 4, 173, :_reduce_251, + 1, 173, :_reduce_252, + 4, 205, :_reduce_none, + 1, 205, :_reduce_none, + 0, 207, :_reduce_255, + 2, 176, :_reduce_256, + 1, 206, :_reduce_none, + 2, 206, :_reduce_258, + 3, 206, :_reduce_259, + 2, 204, :_reduce_260, + 2, 203, :_reduce_261, + 0, 203, :_reduce_262, + 1, 196, :_reduce_263, + 2, 196, :_reduce_264, + 3, 196, :_reduce_265, + 4, 196, :_reduce_266, + 3, 166, :_reduce_267, + 4, 166, :_reduce_268, + 2, 166, :_reduce_269, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 1, 194, :_reduce_none, + 0, 229, :_reduce_279, + 4, 194, :_reduce_280, + 4, 194, :_reduce_281, + 3, 194, :_reduce_282, + 3, 194, :_reduce_283, + 2, 194, :_reduce_284, + 4, 194, :_reduce_285, + 4, 194, :_reduce_286, + 3, 194, :_reduce_287, + 3, 194, :_reduce_288, + 1, 194, :_reduce_289, + 4, 194, :_reduce_290, + 3, 194, :_reduce_291, + 1, 194, :_reduce_292, + 5, 194, :_reduce_293, + 4, 194, :_reduce_294, + 3, 194, :_reduce_295, + 2, 194, :_reduce_296, + 1, 194, :_reduce_none, + 2, 194, :_reduce_298, + 2, 194, :_reduce_299, + 6, 194, :_reduce_300, + 6, 194, :_reduce_301, + 0, 230, :_reduce_302, + 0, 231, :_reduce_303, + 7, 194, :_reduce_304, + 0, 232, :_reduce_305, + 0, 233, :_reduce_306, + 7, 194, :_reduce_307, + 5, 194, :_reduce_308, + 4, 194, :_reduce_309, + 5, 194, :_reduce_310, + 0, 234, :_reduce_311, + 0, 235, :_reduce_312, + 9, 194, :_reduce_313, + 0, 236, :_reduce_314, + 6, 194, :_reduce_315, + 0, 237, :_reduce_316, + 0, 238, :_reduce_317, + 8, 194, :_reduce_318, + 0, 239, :_reduce_319, + 0, 240, :_reduce_320, + 6, 194, :_reduce_321, + 0, 241, :_reduce_322, + 6, 194, :_reduce_323, + 0, 242, :_reduce_324, + 0, 243, :_reduce_325, + 9, 194, :_reduce_326, + 1, 194, :_reduce_327, + 1, 194, :_reduce_328, + 1, 194, :_reduce_329, + 1, 194, :_reduce_none, + 1, 163, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 1, 219, :_reduce_none, + 2, 219, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 1, 221, :_reduce_none, + 2, 218, :_reduce_339, + 3, 244, :_reduce_340, + 2, 244, :_reduce_341, + 1, 244, :_reduce_none, + 1, 244, :_reduce_none, + 3, 245, :_reduce_344, + 3, 245, :_reduce_345, + 1, 220, :_reduce_346, + 5, 220, :_reduce_347, + 1, 153, :_reduce_none, + 2, 153, :_reduce_349, + 1, 247, :_reduce_350, + 3, 247, :_reduce_351, + 3, 248, :_reduce_352, + 1, 178, :_reduce_none, + 2, 178, :_reduce_354, + 1, 178, :_reduce_355, + 3, 178, :_reduce_356, + 1, 249, :_reduce_357, + 2, 251, :_reduce_358, + 1, 251, :_reduce_359, + 6, 246, :_reduce_360, + 4, 246, :_reduce_361, + 4, 246, :_reduce_362, + 2, 246, :_reduce_363, + 2, 246, :_reduce_364, + 4, 246, :_reduce_365, + 2, 246, :_reduce_366, + 2, 246, :_reduce_367, + 1, 246, :_reduce_368, + 0, 255, :_reduce_369, + 5, 254, :_reduce_370, + 2, 174, :_reduce_371, + 4, 174, :_reduce_none, + 4, 174, :_reduce_none, + 4, 174, :_reduce_none, + 2, 217, :_reduce_375, + 4, 217, :_reduce_376, + 4, 217, :_reduce_377, + 3, 217, :_reduce_378, + 4, 217, :_reduce_379, + 3, 217, :_reduce_380, + 2, 217, :_reduce_381, + 1, 217, :_reduce_382, + 0, 257, :_reduce_383, + 5, 216, :_reduce_384, + 0, 258, :_reduce_385, + 5, 216, :_reduce_386, + 0, 260, :_reduce_387, + 6, 222, :_reduce_388, + 1, 259, :_reduce_389, + 1, 259, :_reduce_none, + 6, 152, :_reduce_391, + 0, 152, :_reduce_392, + 1, 261, :_reduce_393, + 1, 261, :_reduce_none, + 1, 261, :_reduce_none, + 2, 262, :_reduce_396, + 1, 262, :_reduce_397, + 2, 154, :_reduce_398, + 1, 154, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 209, :_reduce_403, + 1, 265, :_reduce_none, + 2, 265, :_reduce_405, + 3, 266, :_reduce_406, + 1, 266, :_reduce_407, + 3, 210, :_reduce_408, + 3, 211, :_reduce_409, + 3, 212, :_reduce_410, + 3, 212, :_reduce_411, + 1, 269, :_reduce_412, + 3, 269, :_reduce_413, + 1, 270, :_reduce_414, + 2, 270, :_reduce_415, + 3, 213, :_reduce_416, + 3, 213, :_reduce_417, + 1, 272, :_reduce_418, + 3, 272, :_reduce_419, + 1, 267, :_reduce_420, + 2, 267, :_reduce_421, + 1, 268, :_reduce_422, + 2, 268, :_reduce_423, + 1, 271, :_reduce_424, + 0, 274, :_reduce_425, + 3, 271, :_reduce_426, + 0, 275, :_reduce_427, + 4, 271, :_reduce_428, + 1, 273, :_reduce_429, + 1, 273, :_reduce_430, + 1, 273, :_reduce_431, + 1, 273, :_reduce_none, + 2, 192, :_reduce_433, + 1, 192, :_reduce_434, + 1, 276, :_reduce_none, + 1, 276, :_reduce_none, + 1, 276, :_reduce_none, + 1, 276, :_reduce_none, + 3, 264, :_reduce_439, + 1, 263, :_reduce_440, + 1, 263, :_reduce_441, + 2, 263, :_reduce_442, + 2, 263, :_reduce_443, + 2, 263, :_reduce_444, + 2, 263, :_reduce_445, + 1, 186, :_reduce_446, + 1, 186, :_reduce_447, + 1, 186, :_reduce_448, + 1, 186, :_reduce_449, + 1, 186, :_reduce_450, + 1, 186, :_reduce_451, + 1, 186, :_reduce_452, + 1, 186, :_reduce_453, + 1, 186, :_reduce_454, + 1, 186, :_reduce_455, + 1, 186, :_reduce_456, + 1, 214, :_reduce_457, + 1, 162, :_reduce_458, + 1, 165, :_reduce_459, + 1, 165, :_reduce_none, + 1, 224, :_reduce_461, + 3, 224, :_reduce_462, + 2, 224, :_reduce_463, + 4, 226, :_reduce_464, + 2, 226, :_reduce_465, + 1, 278, :_reduce_none, + 1, 278, :_reduce_none, + 2, 279, :_reduce_468, + 1, 279, :_reduce_469, + 1, 280, :_reduce_470, + 2, 281, :_reduce_471, + 1, 281, :_reduce_472, + 1, 282, :_reduce_473, + 3, 282, :_reduce_474, + 4, 283, :_reduce_475, + 2, 283, :_reduce_476, + 2, 283, :_reduce_477, + 1, 283, :_reduce_478, + 2, 285, :_reduce_479, + 0, 285, :_reduce_480, + 6, 277, :_reduce_481, + 4, 277, :_reduce_482, + 4, 277, :_reduce_483, + 2, 277, :_reduce_484, + 4, 277, :_reduce_485, + 2, 277, :_reduce_486, + 2, 277, :_reduce_487, + 1, 277, :_reduce_488, + 0, 277, :_reduce_489, + 1, 287, :_reduce_none, + 1, 287, :_reduce_491, + 1, 288, :_reduce_492, + 1, 288, :_reduce_493, + 1, 288, :_reduce_494, + 1, 288, :_reduce_495, + 1, 289, :_reduce_496, + 3, 289, :_reduce_497, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 291, :_reduce_500, + 3, 291, :_reduce_none, + 1, 292, :_reduce_502, + 3, 292, :_reduce_503, + 1, 290, :_reduce_none, + 4, 290, :_reduce_none, + 3, 290, :_reduce_none, + 2, 290, :_reduce_none, + 1, 290, :_reduce_none, + 1, 252, :_reduce_509, + 3, 252, :_reduce_510, + 3, 293, :_reduce_511, + 1, 286, :_reduce_512, + 3, 286, :_reduce_513, + 1, 294, :_reduce_none, + 1, 294, :_reduce_none, + 2, 253, :_reduce_516, + 1, 253, :_reduce_517, + 1, 295, :_reduce_none, + 1, 295, :_reduce_none, + 2, 250, :_reduce_520, + 2, 284, :_reduce_521, + 0, 284, :_reduce_522, + 1, 227, :_reduce_523, + 4, 227, :_reduce_524, + 0, 215, :_reduce_525, + 2, 215, :_reduce_526, + 1, 198, :_reduce_527, + 3, 198, :_reduce_528, + 3, 296, :_reduce_529, + 2, 296, :_reduce_530, + 1, 179, :_reduce_none, + 1, 179, :_reduce_none, + 1, 179, :_reduce_none, + 1, 175, :_reduce_none, + 1, 175, :_reduce_none, + 1, 175, :_reduce_none, + 1, 175, :_reduce_none, + 1, 256, :_reduce_none, + 1, 256, :_reduce_none, + 1, 256, :_reduce_none, + 1, 228, :_reduce_none, + 1, 228, :_reduce_none, + 0, 146, :_reduce_none, + 1, 146, :_reduce_none, + 0, 193, :_reduce_none, + 1, 193, :_reduce_none, + 0, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 197, :_reduce_none, + 1, 225, :_reduce_none, + 1, 225, :_reduce_none, + 1, 148, :_reduce_none, + 2, 148, :_reduce_none, + 0, 195, :_reduce_554 ] + +racc_reduce_n = 555 + +racc_shift_n = 968 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tJSDOT => 78, + :tDOT => 79, + :tDOT2 => 80, + :tDOT3 => 81, + :tAREF => 82, + :tASET => 83, + :tLSHFT => 84, + :tRSHFT => 85, + :tCOLON2 => 86, + :tCOLON3 => 87, + :tOP_ASGN => 88, + :tASSOC => 89, + :tLPAREN => 90, + :tLPAREN2 => 91, + :tRPAREN => 92, + :tLPAREN_ARG => 93, + :ARRAY_BEG => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tPLUS => 105, + :tMINUS => 106, + :tLT => 107, + :tGT => 108, + :tPIPE => 109, + :tBANG => 110, + :tCARET => 111, + :tLCURLY => 112, + :tRCURLY => 113, + :tBACK_REF2 => 114, + :tSYMBEG => 115, + :tSTRING_BEG => 116, + :tXSTRING_BEG => 117, + :tREGEXP_BEG => 118, + :tWORDS_BEG => 119, + :tAWORDS_BEG => 120, + :tSTRING_DBEG => 121, + :tSTRING_DVAR => 122, + :tSTRING_END => 123, + :tSTRING => 124, + :tSYMBOL => 125, + :tNL => 126, + :tEH => 127, + :tCOLON => 128, + :tCOMMA => 129, + :tSPACE => 130, + :tSEMI => 131, + :tLAMBDA => 132, + :tLAMBEG => 133, + :tLBRACK2 => 134, + :tLBRACK => 135, + :tJSLBRACK => 136, + :tDSTAR => 137, + :tEQL => 138, + :tLOWEST => 139, + "-@NUM" => 140, + "+@NUM" => 141 } + +racc_nt_base = 142 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tJSDOT", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "ARRAY_BEG", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tAWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tLBRACK2", + "tLBRACK", + "tJSLBRACK", + "tDSTAR", + "tEQL", + "tLOWEST", + "\"-@NUM\"", + "\"+@NUM\"", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "fitem", + "undef_list", + "expr_value", + "lhs", + "command_call", + "mlhs", + "var_lhs", + "primary_value", + "aref_args", + "backref", + "mrhs", + "arg_value", + "expr", + "@1", + "arg", + "command", + "block_command", + "call_args", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_var", + "operation", + "mlhs_basic", + "mlhs_entry", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "symbol", + "opt_nl", + "primary", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_call_args", + "rparen", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "call_args2", + "open_args", + "@2", + "literal", + "strings", + "xstring", + "regexp", + "words", + "awords", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "superclass", + "term", + "f_arglist", + "singleton", + "dot_or_colon", + "@3", + "@4", + "@5", + "@6", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "f_larglist", + "lambda_body", + "block_param", + "f_block_optarg", + "f_block_opt", + "block_args_tail", + "f_block_arg", + "opt_block_args_tail", + "f_arg", + "f_rest_arg", + "do_block", + "@18", + "operation3", + "@19", + "@20", + "cases", + "@21", + "exc_list", + "exc_var", + "numeric", + "dsym", + "string", + "string1", + "string_contents", + "xstring_contents", + "word_list", + "word", + "string_content", + "qword_list", + "string_dvar", + "@22", + "@23", + "sym", + "f_args", + "kwrest_mark", + "f_kwrest", + "f_label", + "f_kw", + "f_kwarg", + "args_tail", + "opt_f_block_arg", + "opt_args_tail", + "f_optarg", + "f_norm_arg", + "f_bad_arg", + "f_arg_item", + "f_margs", + "f_marg", + "f_marg_list", + "f_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +module_eval(<<'.,.,', 'opal.y', 70) + def _reduce_2(val, _values, result) + result = new_compstmt val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 75) + def _reduce_3(val, _values, result) + result = new_block + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 79) + def _reduce_4(val, _values, result) + result = new_block val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 83) + def _reduce_5(val, _values, result) + val[0] << val[2] + result = val[0] + + result + end +.,., + +# reduce 6 omitted + +module_eval(<<'.,.,', 'opal.y', 90) + def _reduce_7(val, _values, result) + result = val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 95) + def _reduce_8(val, _values, result) + result = new_body(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 100) + def _reduce_9(val, _values, result) + result = new_compstmt val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 105) + def _reduce_10(val, _values, result) + result = new_block + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 109) + def _reduce_11(val, _values, result) + result = new_block val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 113) + def _reduce_12(val, _values, result) + val[0] << val[2] + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 119) + def _reduce_13(val, _values, result) + lexer.lex_state = :expr_fname + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 123) + def _reduce_14(val, _values, result) + result = new_alias(val[0], val[1], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 127) + def _reduce_15(val, _values, result) + result = s(:valias, value(val[1]).to_sym, value(val[2]).to_sym) + + result + end +.,., + +# reduce 16 omitted + +module_eval(<<'.,.,', 'opal.y', 132) + def _reduce_17(val, _values, result) + result = s(:valias, value(val[1]).to_sym, value(val[2]).to_sym) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 136) + def _reduce_18(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 140) + def _reduce_19(val, _values, result) + result = new_if(val[1], val[2], val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 144) + def _reduce_20(val, _values, result) + result = new_if(val[1], val[2], nil, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 148) + def _reduce_21(val, _values, result) + result = new_while(val[1], val[2], val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 152) + def _reduce_22(val, _values, result) + result = new_until(val[1], val[2], val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 156) + def _reduce_23(val, _values, result) + result = new_rescue_mod(val[1], val[0], val[2]) + + result + end +.,., + +# reduce 24 omitted + +module_eval(<<'.,.,', 'opal.y', 161) + def _reduce_25(val, _values, result) + result = new_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 165) + def _reduce_26(val, _values, result) + result = s(:masgn, val[0], s(:to_ary, val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 169) + def _reduce_27(val, _values, result) + result = new_op_asgn val[1], val[0], val[2] + + result + end +.,., + +# reduce 28 omitted + +# reduce 29 omitted + +module_eval(<<'.,.,', 'opal.y', 175) + def _reduce_30(val, _values, result) + result = s(:op_asgn2, val[0], op_to_setter(val[2]), value(val[3]).to_sym, val[4]) + + result + end +.,., + +# reduce 31 omitted + +# reduce 32 omitted + +# reduce 33 omitted + +module_eval(<<'.,.,', 'opal.y', 182) + def _reduce_34(val, _values, result) + result = new_assign val[0], val[1], s(:svalue, val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 186) + def _reduce_35(val, _values, result) + result = s(:masgn, val[0], s(:to_ary, val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 190) + def _reduce_36(val, _values, result) + result = s(:masgn, val[0], val[2]) + + result + end +.,., + +# reduce 37 omitted + +# reduce 38 omitted + +module_eval(<<'.,.,', 'opal.y', 197) + def _reduce_39(val, _values, result) + result = s(:and, val[0], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 201) + def _reduce_40(val, _values, result) + result = s(:or, val[0], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 205) + def _reduce_41(val, _values, result) + result = new_unary_call(['!', []], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 209) + def _reduce_42(val, _values, result) + result = new_unary_call(val[0], val[1]) + + result + end +.,., + +# reduce 43 omitted + +# reduce 44 omitted + +# reduce 45 omitted + +# reduce 46 omitted + +module_eval(<<'.,.,', 'opal.y', 219) + def _reduce_47(val, _values, result) + result = new_return(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 223) + def _reduce_48(val, _values, result) + result = new_break(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 227) + def _reduce_49(val, _values, result) + result = new_next(val[0], val[1]) + + result + end +.,., + +# reduce 50 omitted + +# reduce 51 omitted + +# reduce 52 omitted + +# reduce 53 omitted + +# reduce 54 omitted + +module_eval(<<'.,.,', 'opal.y', 239) + def _reduce_55(val, _values, result) + result = new_call(nil, val[0], val[1]) + + result + end +.,., + +# reduce 56 omitted + +module_eval(<<'.,.,', 'opal.y', 244) + def _reduce_57(val, _values, result) + result = new_js_call(val[0], val[2], val[3]) + + result + end +.,., + +# reduce 58 omitted + +module_eval(<<'.,.,', 'opal.y', 249) + def _reduce_59(val, _values, result) + result = new_call(val[0], val[2], val[3]) + + result + end +.,., + +# reduce 60 omitted + +module_eval(<<'.,.,', 'opal.y', 254) + def _reduce_61(val, _values, result) + result = new_call(val[0], val[2], val[3]) + + result + end +.,., + +# reduce 62 omitted + +module_eval(<<'.,.,', 'opal.y', 259) + def _reduce_63(val, _values, result) + result = new_super(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 263) + def _reduce_64(val, _values, result) + result = new_yield val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 268) + def _reduce_65(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 272) + def _reduce_66(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 277) + def _reduce_67(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 281) + def _reduce_68(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 286) + def _reduce_69(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 290) + def _reduce_70(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 294) + def _reduce_71(val, _values, result) + result = val[0] << s(:splat, val[2]) + + result + end +.,., + +# reduce 72 omitted + +module_eval(<<'.,.,', 'opal.y', 299) + def _reduce_73(val, _values, result) + result = val[0] << s(:splat) + + result + end +.,., + +# reduce 74 omitted + +module_eval(<<'.,.,', 'opal.y', 304) + def _reduce_75(val, _values, result) + result = s(:array, s(:splat, val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 308) + def _reduce_76(val, _values, result) + result = s(:array, s(:splat)) + + result + end +.,., + +# reduce 77 omitted + +module_eval(<<'.,.,', 'opal.y', 314) + def _reduce_78(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 318) + def _reduce_79(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 323) + def _reduce_80(val, _values, result) + result = s(:array, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 327) + def _reduce_81(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +# reduce 82 omitted + +# reduce 83 omitted + +module_eval(<<'.,.,', 'opal.y', 335) + def _reduce_84(val, _values, result) + result = new_assignable val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 339) + def _reduce_85(val, _values, result) + args = val[2] ? val[2] : [] + result = s(:attrasgn, val[0], :[]=, s(:arglist, *args)) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 344) + def _reduce_86(val, _values, result) + result = new_call val[0], val[2], [] + + result + end +.,., + +# reduce 87 omitted + +# reduce 88 omitted + +# reduce 89 omitted + +# reduce 90 omitted + +# reduce 91 omitted + +module_eval(<<'.,.,', 'opal.y', 354) + def _reduce_92(val, _values, result) + result = new_assignable val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 358) + def _reduce_93(val, _values, result) + result = new_js_attrasgn(val[0], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 362) + def _reduce_94(val, _values, result) + result = new_attrasgn(val[0], :[]=, val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 366) + def _reduce_95(val, _values, result) + result = new_attrasgn(val[0], op_to_setter(val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 370) + def _reduce_96(val, _values, result) + result = new_attrasgn(val[0], op_to_setter(val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 374) + def _reduce_97(val, _values, result) + result = new_attrasgn(val[0], op_to_setter(val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 378) + def _reduce_98(val, _values, result) + result = new_colon2(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 382) + def _reduce_99(val, _values, result) + result = new_colon3(val[0], val[1]) + + result + end +.,., + +# reduce 100 omitted + +# reduce 101 omitted + +module_eval(<<'.,.,', 'opal.y', 390) + def _reduce_102(val, _values, result) + result = new_colon3(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 394) + def _reduce_103(val, _values, result) + result = new_const(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 398) + def _reduce_104(val, _values, result) + result = new_colon2(val[0], val[1], val[2]) + + result + end +.,., + +# reduce 105 omitted + +# reduce 106 omitted + +# reduce 107 omitted + +module_eval(<<'.,.,', 'opal.y', 406) + def _reduce_108(val, _values, result) + lexer.lex_state = :expr_end + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 411) + def _reduce_109(val, _values, result) + lexer.lex_state = :expr_end + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 417) + def _reduce_110(val, _values, result) + result = new_sym(val[0]) + + result + end +.,., + +# reduce 111 omitted + +module_eval(<<'.,.,', 'opal.y', 423) + def _reduce_112(val, _values, result) + result = s(:undef, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 427) + def _reduce_113(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +# reduce 114 omitted + +# reduce 115 omitted + +# reduce 116 omitted + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +# reduce 121 omitted + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +module_eval(<<'.,.,', 'opal.y', 447) + def _reduce_188(val, _values, result) + result = new_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 451) + def _reduce_189(val, _values, result) + result = new_assign val[0], val[1], s(:rescue_mod, val[2], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 455) + def _reduce_190(val, _values, result) + result = new_op_asgn val[1], val[0], val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 459) + def _reduce_191(val, _values, result) + result = new_op_asgn1(val[0], val[2], val[4], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 463) + def _reduce_192(val, _values, result) + raise ".JS[...] #{val[4]} is not supported" + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 467) + def _reduce_193(val, _values, result) + result = s(:op_asgn2, val[0], op_to_setter(val[2]), value(val[3]).to_sym, val[4]) + + result + end +.,., + +# reduce 194 omitted + +# reduce 195 omitted + +# reduce 196 omitted + +# reduce 197 omitted + +# reduce 198 omitted + +module_eval(<<'.,.,', 'opal.y', 476) + def _reduce_199(val, _values, result) + result = new_irange(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 480) + def _reduce_200(val, _values, result) + result = new_erange(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 484) + def _reduce_201(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 488) + def _reduce_202(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 492) + def _reduce_203(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 496) + def _reduce_204(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 500) + def _reduce_205(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 504) + def _reduce_206(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 508) + def _reduce_207(val, _values, result) + result = new_call new_binary_call(new_int(val[1]), val[2], val[3]), [:"-@", []], [] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 512) + def _reduce_208(val, _values, result) + result = new_call new_binary_call(new_float(val[1]), val[2], val[3]), [:"-@", []], [] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 516) + def _reduce_209(val, _values, result) + result = new_call val[1], [:"+@", []], [] + if [:int, :float].include? val[1].type + result = val[1] + end + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 523) + def _reduce_210(val, _values, result) + result = new_call val[1], [:"-@", []], [] + if val[1].type == :int + val[1][1] = -val[1][1] + result = val[1] + elsif val[1].type == :float + val[1][1] = -val[1][1].to_f + result = val[1] + end + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 534) + def _reduce_211(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 538) + def _reduce_212(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 542) + def _reduce_213(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 546) + def _reduce_214(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 550) + def _reduce_215(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 554) + def _reduce_216(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 558) + def _reduce_217(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 562) + def _reduce_218(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 566) + def _reduce_219(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 570) + def _reduce_220(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 574) + def _reduce_221(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 578) + def _reduce_222(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 582) + def _reduce_223(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 586) + def _reduce_224(val, _values, result) + result = new_unary_call(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 590) + def _reduce_225(val, _values, result) + result = new_unary_call(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 594) + def _reduce_226(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 598) + def _reduce_227(val, _values, result) + result = new_binary_call(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 602) + def _reduce_228(val, _values, result) + result = new_and(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 606) + def _reduce_229(val, _values, result) + result = new_or(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 610) + def _reduce_230(val, _values, result) + result = s(:defined, val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 614) + def _reduce_231(val, _values, result) + result = new_if(val[1], val[0], val[2], val[4]) + + result + end +.,., + +# reduce 232 omitted + +# reduce 233 omitted + +module_eval(<<'.,.,', 'opal.y', 622) + def _reduce_234(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 626) + def _reduce_235(val, _values, result) + result = [val[0]] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 630) + def _reduce_236(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 634) + def _reduce_237(val, _values, result) + val[0] << s(:hash, *val[2]) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 639) + def _reduce_238(val, _values, result) + result = [s(:hash, *val[0])] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 644) + def _reduce_239(val, _values, result) + result = val[1] + + result + end +.,., + +# reduce 240 omitted + +module_eval(<<'.,.,', 'opal.y', 651) + def _reduce_241(val, _values, result) + result = [] + + result + end +.,., + +# reduce 242 omitted + +module_eval(<<'.,.,', 'opal.y', 657) + def _reduce_243(val, _values, result) + result = [] + + result + end +.,., + +# reduce 244 omitted + +module_eval(<<'.,.,', 'opal.y', 662) + def _reduce_245(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 666) + def _reduce_246(val, _values, result) + result = val[0] + result << new_hash(nil, val[2], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 671) + def _reduce_247(val, _values, result) + result = [new_hash(nil, val[0], nil)] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 676) + def _reduce_248(val, _values, result) + result = [val[0]] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 680) + def _reduce_249(val, _values, result) + result = val[0] + add_block_pass val[0], val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 685) + def _reduce_250(val, _values, result) + result = [new_hash(nil, val[0], nil)] + add_block_pass result, val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 690) + def _reduce_251(val, _values, result) + result = val[0] + result << new_hash(nil, val[2], nil) + result << val[3] if val[3] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 696) + def _reduce_252(val, _values, result) + result = [] + add_block_pass result, val[0] + + result + end +.,., + +# reduce 253 omitted + +# reduce 254 omitted + +module_eval(<<'.,.,', 'opal.y', 704) + def _reduce_255(val, _values, result) + lexer.cmdarg_push 1 + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 708) + def _reduce_256(val, _values, result) + lexer.cmdarg_pop + result = val[1] + + result + end +.,., + +# reduce 257 omitted + +module_eval(<<'.,.,', 'opal.y', 715) + def _reduce_258(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 719) + def _reduce_259(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 724) + def _reduce_260(val, _values, result) + result = new_block_pass(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 729) + def _reduce_261(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 733) + def _reduce_262(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 738) + def _reduce_263(val, _values, result) + result = [val[0]] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 742) + def _reduce_264(val, _values, result) + result = [new_splat(val[0], val[1])] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 746) + def _reduce_265(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 750) + def _reduce_266(val, _values, result) + result = val[0] << new_splat(val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 755) + def _reduce_267(val, _values, result) + val[0] << val[2] + result = s(:array, *val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 760) + def _reduce_268(val, _values, result) + val[0] << s(:splat, val[3]) + result = s(:array, *val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 765) + def _reduce_269(val, _values, result) + result = s(:splat, val[1]) + + result + end +.,., + +# reduce 270 omitted + +# reduce 271 omitted + +# reduce 272 omitted + +# reduce 273 omitted + +# reduce 274 omitted + +# reduce 275 omitted + +# reduce 276 omitted + +# reduce 277 omitted + +# reduce 278 omitted + +module_eval(<<'.,.,', 'opal.y', 779) + def _reduce_279(val, _values, result) + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 783) + def _reduce_280(val, _values, result) + result = s(:begin, val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 787) + def _reduce_281(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 791) + def _reduce_282(val, _values, result) + result = new_paren(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 795) + def _reduce_283(val, _values, result) + result = new_colon2(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 799) + def _reduce_284(val, _values, result) + result = new_colon3(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 803) + def _reduce_285(val, _values, result) + result = new_call val[0], [:[], []], val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 807) + def _reduce_286(val, _values, result) + result = new_js_call val[0], [:[], []], val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 811) + def _reduce_287(val, _values, result) + result = new_array(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 815) + def _reduce_288(val, _values, result) + result = new_hash(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 819) + def _reduce_289(val, _values, result) + result = new_return(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 823) + def _reduce_290(val, _values, result) + result = new_yield val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 827) + def _reduce_291(val, _values, result) + result = s(:yield) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 831) + def _reduce_292(val, _values, result) + result = s(:yield) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 835) + def _reduce_293(val, _values, result) + result = s(:defined, val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 839) + def _reduce_294(val, _values, result) + result = new_unary_call(['!', []], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 843) + def _reduce_295(val, _values, result) + result = new_unary_call(['!', []], new_nil(val[0])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 847) + def _reduce_296(val, _values, result) + result = new_call(nil, val[0], []) + result << val[1] + + result + end +.,., + +# reduce 297 omitted + +module_eval(<<'.,.,', 'opal.y', 853) + def _reduce_298(val, _values, result) + val[0] << val[1] + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 858) + def _reduce_299(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 862) + def _reduce_300(val, _values, result) + result = new_if(val[0], val[1], val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 866) + def _reduce_301(val, _values, result) + result = new_if(val[0], val[1], val[4], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 870) + def _reduce_302(val, _values, result) + lexer.cond_push 1 + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 875) + def _reduce_303(val, _values, result) + lexer.cond_pop + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 879) + def _reduce_304(val, _values, result) + result = s(:while, val[2], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 883) + def _reduce_305(val, _values, result) + lexer.cond_push 1 + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 888) + def _reduce_306(val, _values, result) + lexer.cond_pop + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 892) + def _reduce_307(val, _values, result) + result = s(:until, val[2], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 896) + def _reduce_308(val, _values, result) + result = s(:case, val[1], *val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 900) + def _reduce_309(val, _values, result) + result = s(:case, nil, *val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 904) + def _reduce_310(val, _values, result) + result = s(:case, nil, val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 908) + def _reduce_311(val, _values, result) + lexer.cond_push 1 + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 913) + def _reduce_312(val, _values, result) + lexer.cond_pop + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 917) + def _reduce_313(val, _values, result) + result = s(:for, val[4], val[1], val[7]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 921) + def _reduce_314(val, _values, result) + # ... + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 925) + def _reduce_315(val, _values, result) + result = new_class val[0], val[1], val[2], val[4], val[5] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 929) + def _reduce_316(val, _values, result) + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 933) + def _reduce_317(val, _values, result) + # ... + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 937) + def _reduce_318(val, _values, result) + result = new_sclass(val[0], val[3], val[6], val[7]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 941) + def _reduce_319(val, _values, result) + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 945) + def _reduce_320(val, _values, result) + # ... + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 949) + def _reduce_321(val, _values, result) + result = new_module(val[0], val[2], val[4], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 953) + def _reduce_322(val, _values, result) + push_scope + lexer.lex_state = :expr_endfn + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 958) + def _reduce_323(val, _values, result) + result = new_def(val[0], nil, val[1], val[3], val[4], val[5]) + pop_scope + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 963) + def _reduce_324(val, _values, result) + lexer.lex_state = :expr_fname + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 967) + def _reduce_325(val, _values, result) + push_scope + lexer.lex_state = :expr_endfn + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 972) + def _reduce_326(val, _values, result) + result = new_def(val[0], val[1], val[4], val[6], val[7], val[8]) + pop_scope + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 977) + def _reduce_327(val, _values, result) + result = new_break(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 981) + def _reduce_328(val, _values, result) + result = s(:next) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 985) + def _reduce_329(val, _values, result) + result = s(:redo) + + result + end +.,., + +# reduce 330 omitted + +# reduce 331 omitted + +# reduce 332 omitted + +# reduce 333 omitted + +# reduce 334 omitted + +# reduce 335 omitted + +# reduce 336 omitted + +# reduce 337 omitted + +# reduce 338 omitted + +module_eval(<<'.,.,', 'opal.y', 1002) + def _reduce_339(val, _values, result) + result = new_call nil, [:lambda, []], [] + result << new_iter(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1008) + def _reduce_340(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1012) + def _reduce_341(val, _values, result) + result = nil + + result + end +.,., + +# reduce 342 omitted + +# reduce 343 omitted + +module_eval(<<'.,.,', 'opal.y', 1019) + def _reduce_344(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1023) + def _reduce_345(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1028) + def _reduce_346(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1032) + def _reduce_347(val, _values, result) + result = new_if(val[0], val[1], val[3], val[4]) + + result + end +.,., + +# reduce 348 omitted + +module_eval(<<'.,.,', 'opal.y', 1038) + def _reduce_349(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1043) + def _reduce_350(val, _values, result) + result = s(:block, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1047) + def _reduce_351(val, _values, result) + val[0] << val[2] + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1053) + def _reduce_352(val, _values, result) + result = new_assign(new_assignable(new_ident( + val[0])), val[1], val[2]) + + result + end +.,., + +# reduce 353 omitted + +module_eval(<<'.,.,', 'opal.y', 1060) + def _reduce_354(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1064) + def _reduce_355(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1068) + def _reduce_356(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1073) + def _reduce_357(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1078) + def _reduce_358(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1082) + def _reduce_359(val, _values, result) + nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1087) + def _reduce_360(val, _values, result) + result = new_block_args(val[0], val[2], val[4], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1091) + def _reduce_361(val, _values, result) + result = new_block_args(val[0], val[2], nil, val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1095) + def _reduce_362(val, _values, result) + result = new_block_args(val[0], nil, val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1099) + def _reduce_363(val, _values, result) + result = new_block_args(val[0], nil, nil, nil) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1103) + def _reduce_364(val, _values, result) + result = new_block_args(val[0], nil, nil, val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1107) + def _reduce_365(val, _values, result) + result = new_block_args(nil, val[0], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1111) + def _reduce_366(val, _values, result) + result = new_block_args(nil, val[0], nil, val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1115) + def _reduce_367(val, _values, result) + result = new_block_args(nil, nil, val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1119) + def _reduce_368(val, _values, result) + result = new_block_args(nil, nil, nil, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1124) + def _reduce_369(val, _values, result) + push_scope :block + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1129) + def _reduce_370(val, _values, result) + result = new_iter val[2], val[3] + pop_scope + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1135) + def _reduce_371(val, _values, result) + val[0] << val[1] + result = val[0] + + result + end +.,., + +# reduce 372 omitted + +# reduce 373 omitted + +# reduce 374 omitted + +module_eval(<<'.,.,', 'opal.y', 1144) + def _reduce_375(val, _values, result) + result = new_call(nil, val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1148) + def _reduce_376(val, _values, result) + result = new_call(val[0], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1152) + def _reduce_377(val, _values, result) + result = new_js_call(val[0], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1156) + def _reduce_378(val, _values, result) + result = new_call(val[0], [:call, []], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1160) + def _reduce_379(val, _values, result) + result = new_call(val[0], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1164) + def _reduce_380(val, _values, result) + result = new_call(val[0], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1168) + def _reduce_381(val, _values, result) + result = new_super(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1172) + def _reduce_382(val, _values, result) + result = new_super(val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1177) + def _reduce_383(val, _values, result) + push_scope :block + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1182) + def _reduce_384(val, _values, result) + result = new_iter val[2], val[3] + pop_scope + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1187) + def _reduce_385(val, _values, result) + push_scope :block + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1192) + def _reduce_386(val, _values, result) + result = new_iter val[2], val[3] + pop_scope + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1198) + def _reduce_387(val, _values, result) + result = lexer.line + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1202) + def _reduce_388(val, _values, result) + part = s(:when, s(:array, *val[2]), val[4]) + result = [part] + result.push(*val[5]) if val[5] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1209) + def _reduce_389(val, _values, result) + result = [val[0]] + + result + end +.,., + +# reduce 390 omitted + +module_eval(<<'.,.,', 'opal.y', 1215) + def _reduce_391(val, _values, result) + exc = val[1] || s(:array) + exc << new_assign(val[2], val[2], s(:gvar, '$!'.intern)) if val[2] + result = [s(:resbody, exc, val[4])] + result.push val[5].first if val[5] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1222) + def _reduce_392(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1227) + def _reduce_393(val, _values, result) + result = s(:array, val[0]) + + result + end +.,., + +# reduce 394 omitted + +# reduce 395 omitted + +module_eval(<<'.,.,', 'opal.y', 1234) + def _reduce_396(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1238) + def _reduce_397(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1243) + def _reduce_398(val, _values, result) + result = val[1].nil? ? s(:nil) : val[1] + + result + end +.,., + +# reduce 399 omitted + +# reduce 400 omitted + +# reduce 401 omitted + +# reduce 402 omitted + +module_eval(<<'.,.,', 'opal.y', 1253) + def _reduce_403(val, _values, result) + result = new_str val[0] + + result + end +.,., + +# reduce 404 omitted + +module_eval(<<'.,.,', 'opal.y', 1259) + def _reduce_405(val, _values, result) + result = str_append val[0], val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1264) + def _reduce_406(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1268) + def _reduce_407(val, _values, result) + result = s(:str, value(val[0])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1273) + def _reduce_408(val, _values, result) + result = new_xstr(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1278) + def _reduce_409(val, _values, result) + result = new_regexp val[1], val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1283) + def _reduce_410(val, _values, result) + result = s(:array) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1287) + def _reduce_411(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1292) + def _reduce_412(val, _values, result) + result = s(:array) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1296) + def _reduce_413(val, _values, result) + part = val[1] + part = s(:dstr, "", val[1]) if part.type == :evstr + result = val[0] << part + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1303) + def _reduce_414(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1307) + def _reduce_415(val, _values, result) + result = val[0].concat([val[1]]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1312) + def _reduce_416(val, _values, result) + result = s(:array) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1316) + def _reduce_417(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1321) + def _reduce_418(val, _values, result) + result = s(:array) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1325) + def _reduce_419(val, _values, result) + result = val[0] << s(:str, value(val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1330) + def _reduce_420(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1334) + def _reduce_421(val, _values, result) + result = str_append val[0], val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1339) + def _reduce_422(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1343) + def _reduce_423(val, _values, result) + result = str_append val[0], val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1348) + def _reduce_424(val, _values, result) + result = new_str_content(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1352) + def _reduce_425(val, _values, result) + result = lexer.strterm + lexer.strterm = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1357) + def _reduce_426(val, _values, result) + lexer.strterm = val[1] + result = new_evstr(val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1362) + def _reduce_427(val, _values, result) + lexer.cond_push 0 + lexer.cmdarg_push 0 + result = lexer.strterm + lexer.strterm = nil + lexer.lex_state = :expr_beg + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1370) + def _reduce_428(val, _values, result) + lexer.strterm = val[1] + lexer.cond_lexpop + lexer.cmdarg_lexpop + result = new_evstr(val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1378) + def _reduce_429(val, _values, result) + result = new_gvar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1382) + def _reduce_430(val, _values, result) + result = new_ivar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1386) + def _reduce_431(val, _values, result) + result = new_cvar(val[0]) + + result + end +.,., + +# reduce 432 omitted + +module_eval(<<'.,.,', 'opal.y', 1393) + def _reduce_433(val, _values, result) + result = new_sym(val[1]) + lexer.lex_state = :expr_end + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1398) + def _reduce_434(val, _values, result) + result = new_sym(val[0]) + + result + end +.,., + +# reduce 435 omitted + +# reduce 436 omitted + +# reduce 437 omitted + +# reduce 438 omitted + +module_eval(<<'.,.,', 'opal.y', 1408) + def _reduce_439(val, _values, result) + result = new_dsym val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1413) + def _reduce_440(val, _values, result) + result = new_int(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1417) + def _reduce_441(val, _values, result) + result = new_float(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1421) + def _reduce_442(val, _values, result) + result = negate_num(new_int(val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1425) + def _reduce_443(val, _values, result) + result = negate_num(new_float(val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1429) + def _reduce_444(val, _values, result) + result = new_int(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1433) + def _reduce_445(val, _values, result) + result = new_float(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1438) + def _reduce_446(val, _values, result) + result = new_ident(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1442) + def _reduce_447(val, _values, result) + result = new_ivar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1446) + def _reduce_448(val, _values, result) + result = new_gvar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1450) + def _reduce_449(val, _values, result) + result = new_const(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1454) + def _reduce_450(val, _values, result) + result = new_cvar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1458) + def _reduce_451(val, _values, result) + result = new_nil(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1462) + def _reduce_452(val, _values, result) + result = new_self(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1466) + def _reduce_453(val, _values, result) + result = new_true(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1470) + def _reduce_454(val, _values, result) + result = new_false(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1474) + def _reduce_455(val, _values, result) + result = new___FILE__(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1478) + def _reduce_456(val, _values, result) + result = new___LINE__(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1483) + def _reduce_457(val, _values, result) + result = new_var_ref(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1488) + def _reduce_458(val, _values, result) + result = new_assignable val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1493) + def _reduce_459(val, _values, result) + result = s(:nth_ref, value(val[0])) + + result + end +.,., + +# reduce 460 omitted + +module_eval(<<'.,.,', 'opal.y', 1499) + def _reduce_461(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1503) + def _reduce_462(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1507) + def _reduce_463(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1512) + def _reduce_464(val, _values, result) + result = val[1] + lexer.lex_state = :expr_beg + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1517) + def _reduce_465(val, _values, result) + result = val[0] + lexer.lex_state = :expr_beg + + result + end +.,., + +# reduce 466 omitted + +# reduce 467 omitted + +module_eval(<<'.,.,', 'opal.y', 1526) + def _reduce_468(val, _values, result) + result = new_kwrestarg(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1530) + def _reduce_469(val, _values, result) + result = new_kwrestarg() + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1535) + def _reduce_470(val, _values, result) + result = new_sym(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1540) + def _reduce_471(val, _values, result) + result = new_kwoptarg(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1544) + def _reduce_472(val, _values, result) + result = new_kwarg(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1549) + def _reduce_473(val, _values, result) + result = [val[0]] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1553) + def _reduce_474(val, _values, result) + result = val[0] + result << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1559) + def _reduce_475(val, _values, result) + result = new_args_tail(val[0], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1563) + def _reduce_476(val, _values, result) + result = new_args_tail(val[0], nil, val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1567) + def _reduce_477(val, _values, result) + result = new_args_tail(nil, val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1571) + def _reduce_478(val, _values, result) + result = new_args_tail(nil, nil, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1576) + def _reduce_479(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1580) + def _reduce_480(val, _values, result) + result = new_args_tail(nil, nil, nil) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1585) + def _reduce_481(val, _values, result) + result = new_args(val[0], val[2], val[4], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1589) + def _reduce_482(val, _values, result) + result = new_args(val[0], val[2], nil, val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1593) + def _reduce_483(val, _values, result) + result = new_args(val[0], nil, val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1597) + def _reduce_484(val, _values, result) + result = new_args(val[0], nil, nil, val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1601) + def _reduce_485(val, _values, result) + result = new_args(nil, val[0], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1605) + def _reduce_486(val, _values, result) + result = new_args(nil, val[0], nil, val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1609) + def _reduce_487(val, _values, result) + result = new_args(nil, nil, val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1613) + def _reduce_488(val, _values, result) + result = new_args(nil, nil, nil, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1617) + def _reduce_489(val, _values, result) + result = new_args(nil, nil, nil, nil) + + result + end +.,., + +# reduce 490 omitted + +module_eval(<<'.,.,', 'opal.y', 1623) + def _reduce_491(val, _values, result) + result = value(val[0]).to_sym + scope.add_local result + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1629) + def _reduce_492(val, _values, result) + raise 'formal argument cannot be a constant' + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1633) + def _reduce_493(val, _values, result) + raise 'formal argument cannot be an instance variable' + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1637) + def _reduce_494(val, _values, result) + raise 'formal argument cannot be a class variable' + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1641) + def _reduce_495(val, _values, result) + raise 'formal argument cannot be a global variable' + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1646) + def _reduce_496(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1650) + def _reduce_497(val, _values, result) + result = val[1] + + result + end +.,., + +# reduce 498 omitted + +# reduce 499 omitted + +module_eval(<<'.,.,', 'opal.y', 1658) + def _reduce_500(val, _values, result) + result = s(:lasgn, val[0]) + + result + end +.,., + +# reduce 501 omitted + +module_eval(<<'.,.,', 'opal.y', 1664) + def _reduce_502(val, _values, result) + result = s(:array, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1668) + def _reduce_503(val, _values, result) + val[0] << val[2] + result = val[0] + + result + end +.,., + +# reduce 504 omitted + +# reduce 505 omitted + +# reduce 506 omitted + +# reduce 507 omitted + +# reduce 508 omitted + +module_eval(<<'.,.,', 'opal.y', 1680) + def _reduce_509(val, _values, result) + result = [val[0]] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1684) + def _reduce_510(val, _values, result) + val[0] << val[2] + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1690) + def _reduce_511(val, _values, result) + result = new_assign(new_assignable(new_ident(val[0])), val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1695) + def _reduce_512(val, _values, result) + result = s(:block, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1699) + def _reduce_513(val, _values, result) + result = val[0] + val[0] << val[2] + + result + end +.,., + +# reduce 514 omitted + +# reduce 515 omitted + +module_eval(<<'.,.,', 'opal.y', 1708) + def _reduce_516(val, _values, result) + result = "*#{value(val[1])}".to_sym + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1712) + def _reduce_517(val, _values, result) + result = :"*" + + result + end +.,., + +# reduce 518 omitted + +# reduce 519 omitted + +module_eval(<<'.,.,', 'opal.y', 1720) + def _reduce_520(val, _values, result) + result = "&#{value(val[1])}".to_sym + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1725) + def _reduce_521(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1729) + def _reduce_522(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1734) + def _reduce_523(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1738) + def _reduce_524(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1743) + def _reduce_525(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1747) + def _reduce_526(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1752) + def _reduce_527(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1756) + def _reduce_528(val, _values, result) + result = val[0].push(*val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1761) + def _reduce_529(val, _values, result) + result = [val[0], val[2]] + + result + end +.,., + +module_eval(<<'.,.,', 'opal.y', 1765) + def _reduce_530(val, _values, result) + result = [new_sym(val[0]), val[1]] + + result + end +.,., + +# reduce 531 omitted + +# reduce 532 omitted + +# reduce 533 omitted + +# reduce 534 omitted + +# reduce 535 omitted + +# reduce 536 omitted + +# reduce 537 omitted + +# reduce 538 omitted + +# reduce 539 omitted + +# reduce 540 omitted + +# reduce 541 omitted + +# reduce 542 omitted + +# reduce 543 omitted + +# reduce 544 omitted + +# reduce 545 omitted + +# reduce 546 omitted + +# reduce 547 omitted + +# reduce 548 omitted + +# reduce 549 omitted + +# reduce 550 omitted + +# reduce 551 omitted + +# reduce 552 omitted + +# reduce 553 omitted + +module_eval(<<'.,.,', 'opal.y', 1802) + def _reduce_554(val, _values, result) + result = nil + + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module Opal diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/php_serialization b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/php_serialization new file mode 100644 index 000000000000..e412db1cc86d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/php_serialization @@ -0,0 +1,336 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + +require 'php_serialization/tokenizer' + +module PhpSerialization + class Unserializer < Racc::Parser + +module_eval(<<'...end php_serialization.y/module_eval...', 'php_serialization.y', 84) + def initialize(tokenizer_klass = Tokenizer) + @tokenizer_klass = tokenizer_klass + end + + def run(string) + @tokenizer = @tokenizer_klass.new(string) + yyparse(@tokenizer, :each) + return @object + ensure + @tokenizer = nil + end + + def next_token + @tokenizer.next_token + end +...end php_serialization.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 9, 10, 16, 17, 11, 12, 13, 18, 14, 9, + 10, 15, 19, 11, 12, 13, 20, 14, 21, 46, + 15, 9, 10, 22, 23, 11, 12, 13, 24, 14, + 9, 10, 15, 25, 11, 12, 13, 26, 14, 27, + 51, 15, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 43, 47, 49 ] + +racc_action_check = [ + 0, 0, 1, 2, 0, 0, 0, 3, 0, 42, + 42, 0, 4, 42, 42, 42, 5, 42, 6, 42, + 42, 45, 45, 10, 11, 45, 45, 45, 12, 45, + 50, 50, 45, 13, 50, 50, 50, 14, 50, 15, + 50, 50, 16, 22, 23, 24, 25, 26, 27, 32, + 33, 34, 35, 36, 37, 39, 41, 43, 47 ] + +racc_action_pointer = [ + -3, 2, 1, 5, 10, 14, 16, nil, nil, nil, + 18, 19, 23, 28, 32, 34, 42, nil, nil, nil, + nil, nil, 37, 38, 39, 40, 41, 42, nil, nil, + nil, nil, 44, 45, 46, 42, 43, 42, nil, 50, + nil, 50, 6, 52, nil, 18, nil, 46, nil, nil, + 27, nil ] + +racc_action_default = [ + -18, -18, -18, -18, -18, -18, -18, -6, -7, -8, + -18, -18, -18, -18, -18, -18, -18, -1, -2, -3, + -4, -5, -18, -18, -18, -18, -18, -18, 52, -9, + -10, -11, -18, -18, -18, -18, -18, -18, -12, -18, + -15, -18, -18, -18, -14, -18, -17, -18, -16, -15, + -18, -13 ] + +racc_goto_table = [ + 1, 42, nil, nil, nil, nil, nil, nil, nil, nil, + 50, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 48 ] + +racc_goto_check = [ + 1, 9, nil, nil, nil, nil, nil, nil, nil, nil, + 9, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 1 ] + +racc_goto_pointer = [ + nil, 0, nil, nil, nil, nil, nil, nil, nil, -39, + nil ] + +racc_goto_default = [ + nil, 45, 2, 3, 4, 5, 6, 7, 8, nil, + 44 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 2, 16, :_reduce_1, + 2, 16, :_reduce_2, + 2, 16, :_reduce_3, + 2, 16, :_reduce_4, + 2, 16, :_reduce_5, + 1, 16, :_reduce_6, + 1, 16, :_reduce_7, + 1, 17, :_reduce_8, + 3, 18, :_reduce_9, + 3, 19, :_reduce_10, + 3, 20, :_reduce_11, + 5, 21, :_reduce_12, + 11, 23, :_reduce_13, + 2, 24, :_reduce_14, + 0, 24, :_reduce_15, + 2, 25, :_reduce_16, + 7, 22, :_reduce_17 ] + +racc_reduce_n = 18 + +racc_shift_n = 52 + +racc_token_table = { + false => 0, + :error => 1, + ";" => 2, + "N" => 3, + "b" => 4, + ":" => 5, + :NUMBER => 6, + "i" => 7, + "d" => 8, + "s" => 9, + :STRING => 10, + "O" => 11, + "{" => 12, + "}" => 13, + "a" => 14 } + +racc_nt_base = 15 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "\";\"", + "\"N\"", + "\"b\"", + "\":\"", + "NUMBER", + "\"i\"", + "\"d\"", + "\"s\"", + "STRING", + "\"O\"", + "\"{\"", + "\"}\"", + "\"a\"", + "$start", + "data", + "null", + "bool", + "integer", + "double", + "string", + "assoc_array", + "object", + "attribute_list", + "attribute" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'php_serialization.y', 6) + def _reduce_1(val, _values, result) + @object = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 7) + def _reduce_2(val, _values, result) + @object = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 8) + def _reduce_3(val, _values, result) + @object = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 9) + def _reduce_4(val, _values, result) + @object = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 10) + def _reduce_5(val, _values, result) + @object = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 11) + def _reduce_6(val, _values, result) + @object = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 12) + def _reduce_7(val, _values, result) + @object = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 15) + def _reduce_8(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 18) + def _reduce_9(val, _values, result) + result = Integer(val[2]) > 0 + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 21) + def _reduce_10(val, _values, result) + result = Integer(val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 24) + def _reduce_11(val, _values, result) + result = Float(val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 27) + def _reduce_12(val, _values, result) + result = val[4] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 32) + def _reduce_13(val, _values, result) + if eval("defined?(#{val[4]})") + result = Object.const_get(val[4]).new + + val[9].each do |(attr_name, value)| + # Protected and private attributes will have a \0..\0 prefix + attr_name = attr_name.gsub(/\A\\0[^\\]+\\0/, '') + result.instance_variable_set("@#{attr_name}", value) + end + else + klass_name = val[4].gsub(/^Struct::/, '') + attr_names, values = [], [] + + val[9].each do |(attr_name, value)| + # Protected and private attributes will have a \0..\0 prefix + attr_names << attr_name.gsub(/\A\\0[^\\]+\\0/, '') + values << value + end + + result = Struct.new(klass_name, *attr_names).new(*values) + result.instance_variable_set("@_php_class", klass_name) + end + + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 56) + def _reduce_14(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 57) + def _reduce_15(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 60) + def _reduce_16(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'php_serialization.y', 65) + def _reduce_17(val, _values, result) + # Checks if the keys are a sequence of integers + idx = -1 + arr = val[5].all? { |(k,v)| k == (idx += 1) } + + if arr + result = val[5].map { |(k,v)| v } + else + result = Hash[val[5]] + end + + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Unserializer +end # module PhpSerialization diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/riml b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/riml new file mode 100644 index 000000000000..965afc31f5ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/riml @@ -0,0 +1,3283 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + + require File.expand_path("../lexer", __FILE__) + require File.expand_path("../nodes", __FILE__) + require File.expand_path("../errors", __FILE__) + require File.expand_path("../ast_rewriter", __FILE__) +module Riml + class Parser < Racc::Parser + +module_eval(<<'...end riml.y/module_eval...', 'riml.y', 592) + # This code will be put as-is in the parser class + + attr_accessor :ast_rewriter + attr_writer :options + + # The Parser and AST_Rewriter share this same hash of options + def options + @options ||= {} + end + + def self.ast_cache + @ast_cache + end + @ast_cache = {} + + # parses tokens or code into output nodes + def parse(object, ast_rewriter = Riml::AST_Rewriter.new, filename = nil, included = false) + if (ast = self.class.ast_cache[filename]) + else + if tokens?(object) + @tokens = object + elsif code?(object) + @lexer = Riml::Lexer.new(object, filename, true) + end + + begin + ast = do_parse + rescue Racc::ParseError => e + raise unless @lexer + if (invalid_token = @lexer.prev_token_is_keyword?) + warning = "#{invalid_token.inspect} is a keyword, and cannot " \ + "be used as a variable name" + end + error_msg = e.message + error_msg << "\nWARNING: #{warning}" if warning + error = Riml::ParseError.new(error_msg, @lexer.filename, @lexer.lineno) + raise error + end + self.class.ast_cache[filename] = ast if filename + end + @ast_rewriter ||= ast_rewriter + return ast unless @ast_rewriter + @ast_rewriter.ast = ast.dup + @ast_rewriter.options ||= options + @ast_rewriter.rewrite(filename, included) + @ast_rewriter.ast + end + + # get the next token from either the list of tokens provided, or + # the lexer getting the next token + def next_token + return @tokens.shift unless @lexer + token = @lexer.next_token + if token && @lexer.parser_info + @current_parser_info = token.pop + end + token + end + + private + + def tokens?(object) + Array === object + end + + def code?(object) + String === object + end + + def make_node(racc_val) + node = yield racc_val + node.parser_info = @current_parser_info + node + end +...end riml.y/module_eval... +##### State transition tables begin ### + +clist = [ +'135,265,60,139,136,211,417,418,48,47,411,211,448,274,146,56,199,89,272', +'60,273,270,409,271,37,46,48,47,37,49,44,45,392,412,37,449,384,60,50', +'70,316,61,386,385,317,62,63,129,130,132,127,128,131,115,116,117,121', +'122,123,118,119,120,124,125,126,102,104,103,109,111,110,112,114,113', +'106,108,107,133,134,101,100,137,171,80,38,173,37,81,38,82,85,83,84,87', +'38,105,86,37,75,76,153,152,57,56,88,89,77,37,90,58,59,78,37,46,48,47', +'91,49,44,45,64,72,73,-116,161,60,50,70,79,61,272,37,92,62,63,271,48', +'47,-178,-178,-178,-178,211,147,211,211,38,60,-43,-43,153,152,329,409', +'99,409,409,38,331,153,152,-42,-42,161,60,50,70,38,139,313,29,313,38', +'52,80,54,164,277,81,277,82,85,83,84,87,279,279,86,149,75,76,38,182,57', +'56,88,89,77,149,90,58,59,78,37,46,48,47,91,49,44,45,64,72,73,-116,164', +'60,50,70,79,61,164,60,164,62,63,-204,277,149,164,279,164,-203,305,149', +'366,141,164,164,-44,-44,129,130,132,-85,-85,-85,-85,142,-48,-48,-116', +'258,60,50,70,-99,-98,60,50,70,29,149,38,52,80,54,371,149,81,52,82,85', +'83,84,87,149,139,86,164,75,76,164,139,57,56,88,89,77,105,90,58,59,78', +'37,46,48,47,91,49,44,45,64,72,73,-99,-98,60,50,70,79,61,-46,-46,370', +'62,63,-175,-175,-175,-175,139,129,130,132,-47,-47,-45,-45,433,195,432', +'129,130,132,127,128,131,115,116,117,121,122,123,118,119,120,124,125', +'126,164,354,29,211,38,52,80,54,153,152,81,60,82,85,83,84,87,149,60,86', +'105,75,76,417,437,57,56,88,89,77,105,90,58,59,78,215,46,48,47,91,49', +'44,45,64,72,73,-116,216,60,50,70,79,61,139,218,319,62,63,-175,-175,-175', +'-175,-178,-178,-178,-178,211,147,48,47,211,49,48,47,262,49,-176,-176', +'-176,-176,263,320,191,192,193,194,267,129,130,132,127,128,131,29,269', +'269,52,269,54,129,130,132,127,128,131,115,116,117,121,122,123,118,119', +'120,124,125,126,102,104,103,109,111,110,112,114,113,106,108,107,133', +'134,101,100,137,323,105,258,276,294,295,149,139,302,305,306,105,139', +'105,312,326,327,328,333,105,105,105,342,346,357,361,320,258,362,363', +'60,129,130,132,127,128,131,129,130,132,127,128,131,368,129,130,132,127', +'128,131,115,116,117,121,122,123,118,119,120,124,125,126,102,104,103', +'109,111,110,112,114,113,106,108,107,133,134,101,100,137,105,80,129,130', +'132,81,105,82,85,83,84,87,374,105,86,377,75,76,379,380,57,56,88,89,77', +'393,90,58,59,78,37,46,48,47,91,49,44,45,64,72,73,-116,302,60,50,70,79', +'61,394,397,105,62,63,269,258,129,130,132,127,128,131,115,116,117,121', +'122,123,118,119,120,124,125,126,102,104,103,109,111,110,112,114,113', +'106,108,107,133,134,101,29,400,38,52,80,54,401,402,81,-245,82,85,83', +'84,87,105,403,86,406,75,76,60,211,57,56,88,89,77,211,90,58,59,78,37', +'46,48,47,91,49,44,45,64,72,73,427,60,60,50,70,79,61,430,431,434,62,63', +'435,438,129,130,132,127,128,131,115,116,117,121,122,123,118,119,120', +'124,125,126,102,104,103,109,111,110,112,114,113,106,108,107,133,134', +'440,29,441,38,52,80,54,442,443,81,211,82,85,83,84,87,105,445,86,446', +'75,76,371,371,57,56,88,89,77,211,90,58,59,78,37,46,48,47,91,49,44,45', +'64,72,73,458,435,60,50,70,79,61,462,463,371,62,63,465,468,129,130,132', +'127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,,,,,,,,', +',,,129,130,132,,29,,38,52,80,54,,,81,,82,85,83,84,87,105,,86,,75,76', +',,57,56,88,89,77,,90,58,59,78,37,46,48,47,91,49,44,45,64,72,73,105,', +'60,50,70,79,61,,,,62,63,,,129,130,132,127,128,131,115,116,117,121,122', +'123,118,119,120,124,125,126,,,,,,,,,,,,129,130,132,,29,,38,52,80,54', +',,81,,82,85,83,84,87,105,,86,,75,76,,,57,56,88,89,77,,90,58,59,78,37', +'46,48,47,91,49,44,45,64,72,73,105,,60,50,70,79,61,,,,62,63,414,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,29,,38,52,,54,,129,130,132,127,128,131', +'115,116,117,121,122,123,118,119,120,124,125,126,102,104,103,109,111', +'110,112,114,113,106,108,107,133,134,101,100,137,419,,,,,,,,,146,56,', +'89,105,,90,,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,129,130', +'132,127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,102', +'104,103,109,111,110,112,114,113,106,108,107,133,134,101,100,137,29,', +',52,,54,,261,146,56,,89,,105,90,,,,,46,48,47,,49,44,45,64,,,,,60,50', +'70,,61,,,,62,63,180,146,56,,89,,,90,,,,,46,48,47,,49,44,45,64,,,-116', +',60,50,70,,61,,,,62,63,,29,,,52,,54,,261,,129,130,132,127,128,131,115', +'116,117,121,122,123,118,119,120,124,125,126,,180,146,56,,89,,176,90', +',52,,54,46,48,47,,49,44,45,64,,,,,60,50,70,,61,105,,,62,63,180,146,56', +',89,,,90,,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,,29,-119', +',52,,54,,,129,130,132,127,128,131,115,116,117,121,122,123,118,119,120', +'124,125,126,,,,180,146,56,,89,29,-119,90,52,,54,,46,48,47,,49,44,45', +'64,,,,,60,50,70,105,61,,,,62,63,180,146,56,,89,,,90,,,,,46,48,47,,49', +'44,45,64,,,,,60,50,70,,61,,,,62,63,,29,-119,,52,,54,,,129,130,132,127', +'128,131,115,116,117,121,122,123,118,119,120,124,125,126,,,,180,146,56', +',89,29,-119,90,52,,54,,46,48,47,,49,44,45,64,,,,,60,50,70,105,61,,,', +'62,63,180,146,56,,89,,,90,,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61', +',,,62,63,,29,-121,,52,,54,,,129,130,132,127,128,131,115,116,117,121', +'122,123,118,119,120,124,125,126,,,,,146,56,,89,29,-119,90,52,,54,,46', +'48,47,,49,44,45,64,,,,,60,50,70,105,61,,,,62,63,180,146,56,,89,,,90', +',,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,,29,,,52,,54,350', +',129,130,132,127,128,131,115,116,117,121,122,123,118,119,120,124,125', +'126,,,,180,146,56,,89,29,-119,90,52,,54,,46,48,47,,49,44,45,64,,,,,60', +'50,70,105,61,,,,62,63,365,146,56,,89,,,90,,,,,46,48,47,,49,44,45,64', +',,,,60,50,70,,61,,,,62,63,,29,-119,,52,,54,,129,130,132,127,128,131', +'115,116,117,121,122,123,118,119,120,124,125,126,,,,180,146,56,,89,,29', +'90,,52,,54,46,48,47,,49,44,45,64,,,,,60,50,70,105,61,,,,62,63,180,146', +'56,,89,,,90,,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,,29', +'-119,,52,,54,,,129,130,132,127,128,131,115,116,117,121,122,123,118,119', +'120,124,125,126,,,,,146,56,,89,29,-119,90,52,,54,,46,48,47,,49,44,45', +'64,,,,,60,50,70,105,61,,,,62,63,146,56,,89,,,90,,,,,46,48,47,,49,44', +'45,64,,,-116,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48', +'47,,49,44,45,64,,,-116,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54', +',,167,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,', +'52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,165', +'89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146', +'56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63', +'146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,-116,,60,50,70,,61', +',,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70', +',61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60', +'50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,', +',,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45', +'64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49', +'44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47', +',49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46', +'48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54', +',,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52', +'90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89', +',52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56', +'29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146', +'56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63', +'146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,', +'62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,', +'61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50', +'70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,', +'60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64', +',,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44', +'45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,', +'49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48', +'47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,', +'46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90', +'54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,', +'52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29', +'89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146', +'56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63', +'146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,', +'62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,', +'61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50', +'70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,', +'60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64', +',,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44', +'45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,', +'49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48', +'47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,', +'46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90', +'54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,', +'52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29', +'89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146', +'56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63', +'146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,', +'62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,', +'61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50', +'70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,', +'60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64', +',,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44', +'45,64,,,-116,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,288,,,,46,48', +'47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,', +'46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90', +'54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,', +'52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29', +'89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146', +'56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63', +'146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,-116,,60,50,70,,61', +',,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70', +',61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60', +'50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,', +',,,60,50,70,,61,,,,62,63,,,29,,,52,348,54,129,130,132,127,128,131,115', +'116,117,121,122,123,118,119,120,124,125,126,,,,,146,56,,89,,29,90,,52', +',54,46,48,47,,49,44,45,64,,,-116,,60,50,70,105,61,,,,62,63,146,56,,89', +',,90,,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89', +',52,90,288,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56', +'29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146', +'56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63', +'146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,', +'62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,', +'61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50', +'70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,', +'60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44,45,64', +',,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,,49,44', +'45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,,46,48,47,', +'49,44,45,64,,,-116,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90,54,,,', +'46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,,52,90', +'54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29,89,', +'52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146,56,29', +'89,,52,90,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63,146', +'56,29,89,,52,,54,,,,46,48,47,,49,44,45,,,,,,60,50,70,,61,,,,62,63,146', +'56,29,89,,52,,54,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62,63', +'146,56,188,89,,52,,,,,,46,48,47,,49,44,45,64,,,,,60,50,70,,61,,,,62', +'63,,,188,,,52,,,,,,,,,,,,,,,,211,,,,,,129,130,132,127,128,131,,,188', +',,52,129,130,132,127,128,131,115,116,117,121,122,123,118,119,120,124', +'125,126,102,104,103,109,111,110,112,114,113,106,108,107,133,134,101', +'100,137,211,105,,,,,129,130,132,127,128,131,,105,,,,,129,130,132,127', +'128,131,115,116,117,121,122,123,118,119,120,124,125,126,102,104,103', +'109,111,110,112,114,113,106,108,107,133,134,101,100,137,211,105,,,,', +'129,130,132,127,128,131,,105,,,,,129,130,132,127,128,131,115,116,117', +'121,122,123,118,119,120,124,125,126,102,104,103,109,111,110,112,114', +'113,106,108,107,133,134,101,100,137,211,105,,,,,129,130,132,127,128', +'131,,105,,,,,129,130,132,127,128,131,115,116,117,121,122,123,118,119', +'120,124,125,126,102,104,103,109,111,110,112,114,113,106,108,107,133', +'134,101,100,137,211,105,,,,,129,130,132,127,128,131,,105,,,,,129,130', +'132,127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,102', +'104,103,109,111,110,112,114,113,106,108,107,133,134,101,100,137,455', +'105,,,,,129,130,132,127,128,131,,105,,,,,129,130,132,127,128,131,115', +'116,117,121,122,123,118,119,120,124,125,126,102,104,103,109,111,110', +'112,114,113,106,108,107,133,134,101,100,137,460,105,,,,129,130,132,127', +'128,131,,,105,,,,,129,130,132,127,128,131,115,116,117,121,122,123,118', +'119,120,124,125,126,102,104,103,109,111,110,112,114,113,106,108,107', +'133,134,101,100,137,105,129,130,132,127,128,131,,,,,,,105,129,130,132', +'127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,102,104', +'103,109,111,110,112,114,113,106,108,107,133,134,101,100,137,105,,,,', +',266,129,130,132,127,128,131,105,129,130,132,127,128,131,115,116,117', +'121,122,123,118,119,120,124,125,126,102,104,103,109,111,110,112,114', +'113,106,108,107,133,134,101,100,137,,,,,,,105,,,,,,,105,129,130,132', +'127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,102,104', +'103,109,111,110,112,114,113,106,108,107,133,134,101,100,137,,,,,,,,', +',,,,275,105,129,130,132,127,128,131,115,116,117,121,122,123,118,119', +'120,124,125,126,102,104,103,109,111,110,112,114,113,106,108,107,133', +'134,101,100,137,,,,,,,,,,,,,,105,129,130,132,127,128,131,115,116,117', +'121,122,123,118,119,120,124,125,126,102,104,103,109,111,110,112,114', +'113,106,108,107,133,134,101,100,137,,,,,,,,,,,,,,105,129,130,132,127', +'128,131,115,116,117,121,122,123,118,119,120,124,125,126,102,104,103', +'109,111,110,112,114,113,106,108,107,133,134,101,100,137,,,,,,,,,,,,', +',105,129,130,132,127,128,131,115,116,117,121,122,123,118,119,120,124', +'125,126,102,104,103,109,111,110,112,114,113,106,108,107,133,134,101', +'100,137,,,,,,,,,,,,,,105,129,130,132,127,128,131,115,116,117,121,122', +'123,118,119,120,124,125,126,129,130,132,127,128,131,115,116,117,121', +'122,123,118,119,120,124,125,126,102,104,103,109,111,110,112,114,113', +'106,108,107,105,,,,,,,,,,,,,,,,,,105,129,130,132,127,128,131,115,116', +'117,121,122,123,118,119,120,124,125,126,102,104,103,109,111,110,112', +'114,113,106,108,107,,,,,,,,,,,,,,,,,,,105,129,130,132,127,128,131,115', +'116,117,121,122,123,118,119,120,124,125,126,102,104,103,109,111,110', +'112,114,113,106,108,107,133,134,101,100,137,,,,,,,,,,,,,,105,129,130', +'132,127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,102', +'104,103,109,111,110,112,114,113,106,108,107,133,134,101,100,137,,,,', +',,,,,,,,,105,129,130,132,127,128,131,115,116,117,121,122,123,118,119', +'120,124,125,126,102,104,103,109,111,110,112,114,113,106,108,107,133', +'134,101,100,137,,,,,,,,,,,,,337,105,129,130,132,127,128,131,115,116', +'117,121,122,123,118,119,120,124,125,126,102,104,103,109,111,110,112', +'114,113,106,108,107,133,134,101,100,137,,,,,,,,,,340,,,341,105,129,130', +'132,127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,102', +'104,103,109,111,110,112,114,113,106,108,107,133,134,101,100,137,,,,', +',,,,,,,,,105,129,130,132,127,128,131,115,116,117,121,122,123,118,119', +'120,124,125,126,102,104,103,109,111,110,112,114,113,106,108,107,133', +'134,101,100,137,,,,,,,266,,,,,,,105,129,130,132,127,128,131,115,116', +'117,121,122,123,118,119,120,124,125,126,102,104,103,109,111,110,112', +'114,113,106,108,107,133,134,101,100,137,,,,,,,360,,,,,,,105,129,130', +'132,127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,102', +'104,103,109,111,110,112,114,113,106,108,107,133,134,101,100,137,,,,', +',,,,,,,,,105,129,130,132,127,128,131,115,116,117,121,122,123,118,119', +'120,124,125,126,102,104,103,109,111,110,112,114,113,106,108,107,133', +'134,101,100,137,,,,,,,360,,,,,,,105,129,130,132,127,128,131,115,116', +'117,121,122,123,118,119,120,124,125,126,102,104,103,109,111,110,112', +'114,113,106,108,107,133,134,101,100,137,,,,,,,,,,,,,,105,129,130,132', +'127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,102,104', +'103,109,111,110,112,114,113,106,108,107,133,134,101,100,137,,,,,,,,', +',,,,,105,129,130,132,127,128,131,115,116,117,121,122,123,118,119,120', +'124,125,126,102,104,103,109,111,110,112,114,113,106,108,107,133,134', +'101,100,137,,,,,,,,,,,,,,105,129,130,132,127,128,131,115,116,117,121', +'122,123,118,119,120,124,125,126,102,104,103,109,111,110,112,114,113', +'106,108,107,133,134,101,100,137,,,,,,,,,,,,,,105,129,130,132,127,128', +'131,115,116,117,121,122,123,118,119,120,124,125,126,102,104,103,109', +'111,110,112,114,113,106,108,107,133,134,101,100,137,,,,,,,,,,396,,,341', +'105,129,130,132,127,128,131,115,116,117,121,122,123,118,119,120,124', +'125,126,102,104,103,109,111,110,112,114,113,106,108,107,133,134,101', +'100,137,,,,,,,,,,,,,,105,129,130,132,127,128,131,115,116,117,121,122', +'123,118,119,120,124,125,126,102,104,103,109,111,110,112,114,113,106', +'108,107,133,134,101,100,137,,,,,,,,,,399,,,,105,129,130,132,127,128', +'131,115,116,117,121,122,123,118,119,120,124,125,126,102,104,103,109', +'111,110,112,114,113,106,108,107,133,134,101,100,137,,,,,,,,,,,,,,105', +'129,130,132,127,128,131,115,116,117,121,122,123,118,119,120,124,125', +'126,102,104,103,109,111,110,112,114,113,106,108,107,133,134,101,100', +'137,,,,,,,,,,,,,,105,129,130,132,127,128,131,115,116,117,121,122,123', +'118,119,120,124,125,126,102,104,103,109,111,110,112,114,113,106,108', +'107,133,134,101,100,137,,,,,,,,,,,,,,105,129,130,132,127,128,131,115', +'116,117,121,122,123,118,119,120,124,125,126,102,104,103,109,111,110', +'112,114,113,106,108,107,133,134,101,100,137,,,,,,,,,,,,,,105,129,130', +'132,127,128,131,115,116,117,121,122,123,118,119,120,124,125,126,102', +'104,103,109,111,110,112,114,113,106,108,107,133,134,101,100,137,,,,', +',,,,,,,,,105,129,130,132,127,128,131,115,116,117,121,122,123,118,119', +'120,124,125,126,102,104,103,109,111,110,112,114,113,106,108,107,133', +'134,101,100,137,,,,,,,,,,,,,,105,129,130,132,127,128,131,115,116,117', +'121,122,123,118,119,120,124,125,126,102,104,103,109,111,110,112,114', +'113,106,108,107,133,134,101,100,137,,,,,,,,,,,,,,105,129,130,132,127', +'128,131,115,116,117,121,122,123,118,119,120,124,125,126,102,104,103', +'109,111,110,112,114,113,106,108,107,133,134,101,100,137,,,,,,,,,,,,', +',105,129,130,132,127,128,131,115,116,117,121,122,123,118,119,120,124', +'125,126,102,104,103,109,111,110,112,114,113,106,108,107,133,134,101', +'100,137,,,,,,,,,,,,,,105,129,130,132,127,128,131,115,116,117,121,122', +'123,118,119,120,124,125,126,102,104,103,109,111,110,112,114,113,106', +'108,107,133,134,101,100,137,,,,,,,,,,,,,,105' ] + racc_action_table = arr = ::Array.new(6668, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'22,143,74,143,22,333,376,376,182,182,370,369,433,157,57,57,74,57,155', +'182,157,155,369,155,3,57,57,57,93,57,57,57,333,370,376,433,330,57,57', +'57,202,57,330,330,202,57,57,22,22,22,22,22,22,22,22,22,22,22,22,22,22', +'22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,57,0', +'3,57,332,0,93,0,0,0,0,0,376,22,0,454,0,0,287,287,0,0,0,0,0,461,0,0,0', +'0,0,0,0,0,0,0,0,0,0,0,0,0,55,0,0,0,0,0,298,466,1,0,0,298,59,59,283,283', +'283,283,447,283,451,464,332,59,283,283,40,40,210,447,19,451,464,454', +'210,181,181,287,287,175,72,72,72,461,23,200,0,213,0,0,2,0,55,277,2,161', +'2,2,2,2,2,162,278,2,284,2,2,466,59,2,2,2,2,2,286,2,2,2,2,2,2,2,2,2,2', +'2,2,2,2,2,2,175,2,2,2,2,2,200,86,213,2,2,161,313,266,277,314,161,162', +'304,360,304,24,162,278,284,284,186,186,186,138,138,138,138,27,286,286', +'8,138,8,8,8,403,430,73,73,73,2,32,2,2,94,2,315,35,94,86,94,94,94,94', +'94,285,266,94,313,94,94,314,360,94,94,94,94,94,186,94,94,94,94,94,94', +'94,94,94,94,94,94,94,94,94,403,430,94,94,94,94,94,281,281,315,94,94', +'285,285,285,285,43,187,187,187,282,282,285,285,410,70,410,222,222,222', +'222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,290,290', +'94,87,94,94,95,94,387,387,95,88,95,95,95,95,95,33,89,95,187,95,95,416', +'416,95,95,95,95,95,222,95,95,95,95,90,95,95,95,95,95,95,95,95,95,95', +'95,92,95,95,95,95,95,96,97,203,95,95,33,33,33,33,31,31,31,31,331,31', +'331,331,386,331,386,386,140,386,42,42,42,42,141,203,66,66,66,66,146', +'235,235,235,235,235,235,95,148,150,95,151,95,203,203,203,203,203,203', +'203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203', +'203,203,203,203,203,203,203,203,203,203,203,203,204,235,154,160,166', +'169,170,174,178,183,184,185,189,203,199,207,208,209,212,249,250,252', +'260,268,293,297,204,299,300,301,305,236,236,236,236,236,236,237,237', +'237,237,237,237,312,204,204,204,204,204,204,204,204,204,204,204,204', +'204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204', +'204,204,204,204,204,204,236,211,247,247,247,211,237,211,211,211,211', +'211,318,204,211,322,211,211,324,325,211,211,211,211,211,334,211,211', +'211,211,211,211,211,211,211,211,211,211,211,211,211,211,335,211,211', +'211,211,211,336,339,247,211,211,344,345,220,220,220,220,220,220,220', +'220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220', +'220,220,220,220,220,220,220,220,220,211,353,211,211,320,211,355,356', +'320,320,320,320,320,320,320,220,359,320,367,320,320,368,385,320,320', +'320,320,320,389,320,320,320,320,320,320,320,320,320,320,320,320,320', +'320,320,391,392,320,320,320,320,320,404,408,411,320,320,412,417,221', +'221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221', +'221,221,221,221,221,221,221,221,221,221,221,221,221,221,420,320,421', +'320,320,438,320,422,423,438,425,438,438,438,438,438,221,428,438,429', +'438,438,432,434,438,438,438,438,438,445,438,438,438,438,438,438,438', +'438,438,438,438,438,438,438,438,448,449,438,438,438,438,438,456,457', +'458,438,438,459,467,223,223,223,223,223,223,223,223,223,223,223,223', +'223,223,223,223,223,223,,,,,,,,,,,,248,248,248,,438,,438,438,455,438', +',,455,,455,455,455,455,455,223,,455,,455,455,,,455,455,455,455,455,', +'455,455,455,455,455,455,455,455,455,455,455,455,455,455,455,248,,455', +'455,455,455,455,,,,455,455,,,224,224,224,224,224,224,224,224,224,224', +'224,224,224,224,224,224,224,224,,,,,,,,,,,,251,251,251,,455,,455,455', +'460,455,,,460,,460,460,460,460,460,224,,460,,460,460,,,460,460,460,460', +'460,,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,251', +',460,460,460,460,460,,,,460,460,375,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,460,,460,460,,460,,375,375,375,375,375,375,375,375,375,375,375,375', +'375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375', +'375,375,375,375,375,375,378,,,,,,,,,139,139,,139,375,,139,,,,,139,139', +'139,,139,139,139,139,,,,,139,139,139,,139,,,,139,139,378,378,378,378', +'378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378', +'378,378,378,378,378,378,378,378,378,378,378,378,378,378,139,,,139,,139', +',139,258,258,,258,,378,258,,,,,258,258,258,,258,258,258,258,,,,,258', +'258,258,,258,,,,258,258,58,58,58,,58,,,58,,,,,58,58,58,,58,58,58,58', +',,58,,58,58,58,,58,,,,58,58,,258,,,258,,258,,258,,226,226,226,226,226', +'226,226,226,226,226,226,226,226,226,226,226,226,226,,147,147,147,,147', +',58,147,,58,,58,147,147,147,,147,147,147,147,,,,,147,147,147,,147,226', +',,147,147,165,165,165,,165,,,165,,,,,165,165,165,,165,165,165,165,,', +',,165,165,165,,165,,,,165,165,,147,147,,147,,147,,,227,227,227,227,227', +'227,227,227,227,227,227,227,227,227,227,227,227,227,,,,171,171,171,', +'171,165,165,171,165,,165,,171,171,171,,171,171,171,171,,,,,171,171,171', +'227,171,,,,171,171,176,176,176,,176,,,176,,,,,176,176,176,,176,176,176', +'176,,,,,176,176,176,,176,,,,176,176,,171,171,,171,,171,,,228,228,228', +'228,228,228,228,228,228,228,228,228,228,228,228,228,228,228,,,,215,215', +'215,,215,176,176,215,176,,176,,215,215,215,,215,215,215,215,,,,,215', +'215,215,228,215,,,,215,215,267,267,267,,267,,,267,,,,,267,267,267,,267', +'267,267,267,,,,,267,267,267,,267,,,,267,267,,215,215,,215,,215,,,229', +'229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229', +',,,,274,274,,274,267,267,274,267,,267,,274,274,274,,274,274,274,274', +',,,,274,274,274,229,274,,,,274,274,276,276,276,,276,,,276,,,,,276,276', +'276,,276,276,276,276,,,,,276,276,276,,276,,,,276,276,,274,,,274,,274', +'274,,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230', +'230,230,,,,295,295,295,,295,276,276,295,276,,276,,295,295,295,,295,295', +'295,295,,,,,295,295,295,230,295,,,,295,295,302,302,302,,302,,,302,,', +',,302,302,302,,302,302,302,302,,,,,302,302,302,,302,,,,302,302,,295', +'295,,295,,295,,231,231,231,231,231,231,231,231,231,231,231,231,231,231', +'231,231,231,231,,,,362,362,362,,362,,302,362,,302,,302,362,362,362,', +'362,362,362,362,,,,,362,362,362,231,362,,,,362,362,393,393,393,,393', +',,393,,,,,393,393,393,,393,393,393,393,,,,,393,393,393,,393,,,,393,393', +',362,362,,362,,362,,,232,232,232,232,232,232,232,232,232,232,232,232', +'232,232,232,232,232,232,,,,,29,29,,29,393,393,29,393,,393,,29,29,29', +',29,29,29,29,,,,,29,29,29,232,29,,,,29,29,52,52,,52,,,52,,,,,52,52,52', +',52,52,52,52,,,52,,52,52,52,,52,,,,52,52,54,54,29,54,,29,54,29,,,,54', +'54,54,,54,54,54,54,,,54,,54,54,54,,54,,,,54,54,56,56,52,56,,52,56,52', +',,56,56,56,56,,56,56,56,56,,,,,56,56,56,,56,,,,56,56,61,61,54,61,,54', +'61,54,,,,61,61,61,,61,61,61,61,,,,,61,61,61,,61,,,,61,61,62,62,56,62', +',56,62,56,,,,62,62,62,,62,62,62,62,,,,,62,62,62,,62,,,,62,62,63,63,61', +'63,,61,63,61,,,,63,63,63,,63,63,63,63,,,,,63,63,63,,63,,,,63,63,78,78', +'62,78,,62,78,62,,,,78,78,78,,78,78,78,78,,,78,,78,78,78,,78,,,,78,78', +'80,80,63,80,,63,80,63,,,,80,80,80,,80,80,80,80,,,,,80,80,80,,80,,,,80', +'80,81,81,78,81,,78,81,78,,,,81,81,81,,81,81,81,81,,,,,81,81,81,,81,', +',,81,81,82,82,80,82,,80,82,80,,,,82,82,82,,82,82,82,82,,,,,82,82,82', +',82,,,,82,82,85,85,81,85,,81,85,81,,,,85,85,85,,85,85,85,85,,,,,85,85', +'85,,85,,,,85,85,100,100,82,100,,82,100,82,,,,100,100,100,,100,100,100', +'100,,,,,100,100,100,,100,,,,100,100,101,101,85,101,,85,101,85,,,,101', +'101,101,,101,101,101,101,,,,,101,101,101,,101,,,,101,101,102,102,100', +'102,,100,102,100,,,,102,102,102,,102,102,102,102,,,,,102,102,102,,102', +',,,102,102,103,103,101,103,,101,103,101,,,,103,103,103,,103,103,103', +'103,,,,,103,103,103,,103,,,,103,103,104,104,102,104,,102,104,102,,,', +'104,104,104,,104,104,104,104,,,,,104,104,104,,104,,,,104,104,105,105', +'103,105,,103,105,103,,,,105,105,105,,105,105,105,105,,,,,105,105,105', +',105,,,,105,105,106,106,104,106,,104,106,104,,,,106,106,106,,106,106', +'106,106,,,,,106,106,106,,106,,,,106,106,107,107,105,107,,105,107,105', +',,,107,107,107,,107,107,107,107,,,,,107,107,107,,107,,,,107,107,108', +'108,106,108,,106,108,106,,,,108,108,108,,108,108,108,108,,,,,108,108', +'108,,108,,,,108,108,109,109,107,109,,107,109,107,,,,109,109,109,,109', +'109,109,109,,,,,109,109,109,,109,,,,109,109,110,110,108,110,,108,110', +'108,,,,110,110,110,,110,110,110,110,,,,,110,110,110,,110,,,,110,110', +'111,111,109,111,,109,111,109,,,,111,111,111,,111,111,111,111,,,,,111', +'111,111,,111,,,,111,111,112,112,110,112,,110,112,110,,,,112,112,112', +',112,112,112,112,,,,,112,112,112,,112,,,,112,112,113,113,111,113,,111', +'113,111,,,,113,113,113,,113,113,113,113,,,,,113,113,113,,113,,,,113', +'113,114,114,112,114,,112,114,112,,,,114,114,114,,114,114,114,114,,,', +',114,114,114,,114,,,,114,114,115,115,113,115,,113,115,113,,,,115,115', +'115,,115,115,115,115,,,,,115,115,115,,115,,,,115,115,116,116,114,116', +',114,116,114,,,,116,116,116,,116,116,116,116,,,,,116,116,116,,116,,', +',116,116,117,117,115,117,,115,117,115,,,,117,117,117,,117,117,117,117', +',,,,117,117,117,,117,,,,117,117,118,118,116,118,,116,118,116,,,,118', +'118,118,,118,118,118,118,,,,,118,118,118,,118,,,,118,118,119,119,117', +'119,,117,119,117,,,,119,119,119,,119,119,119,119,,,,,119,119,119,,119', +',,,119,119,120,120,118,120,,118,120,118,,,,120,120,120,,120,120,120', +'120,,,,,120,120,120,,120,,,,120,120,121,121,119,121,,119,121,119,,,', +'121,121,121,,121,121,121,121,,,,,121,121,121,,121,,,,121,121,122,122', +'120,122,,120,122,120,,,,122,122,122,,122,122,122,122,,,,,122,122,122', +',122,,,,122,122,123,123,121,123,,121,123,121,,,,123,123,123,,123,123', +'123,123,,,,,123,123,123,,123,,,,123,123,124,124,122,124,,122,124,122', +',,,124,124,124,,124,124,124,124,,,,,124,124,124,,124,,,,124,124,125', +'125,123,125,,123,125,123,,,,125,125,125,,125,125,125,125,,,,,125,125', +'125,,125,,,,125,125,126,126,124,126,,124,126,124,,,,126,126,126,,126', +'126,126,126,,,,,126,126,126,,126,,,,126,126,127,127,125,127,,125,127', +'125,,,,127,127,127,,127,127,127,127,,,,,127,127,127,,127,,,,127,127', +'128,128,126,128,,126,128,126,,,,128,128,128,,128,128,128,128,,,,,128', +'128,128,,128,,,,128,128,129,129,127,129,,127,129,127,,,,129,129,129', +',129,129,129,129,,,,,129,129,129,,129,,,,129,129,130,130,128,130,,128', +'130,128,,,,130,130,130,,130,130,130,130,,,,,130,130,130,,130,,,,130', +'130,131,131,129,131,,129,131,129,,,,131,131,131,,131,131,131,131,,,', +',131,131,131,,131,,,,131,131,132,132,130,132,,130,132,130,,,,132,132', +'132,,132,132,132,132,,,,,132,132,132,,132,,,,132,132,133,133,131,133', +',131,133,131,,,,133,133,133,,133,133,133,133,,,,,133,133,133,,133,,', +',133,133,134,134,132,134,,132,134,132,,,,134,134,134,,134,134,134,134', +',,,,134,134,134,,134,,,,134,134,135,135,133,135,,133,135,133,,,,135', +'135,135,,135,135,135,135,,,,,135,135,135,,135,,,,135,135,136,136,134', +'136,,134,136,134,,,,136,136,136,,136,136,136,136,,,,,136,136,136,,136', +',,,136,136,137,137,135,137,,135,137,135,,,,137,137,137,,137,137,137', +'137,,,,,137,137,137,,137,,,,137,137,164,164,136,164,,136,164,136,,,', +'164,164,164,,164,164,164,164,,,,,164,164,164,,164,,,,164,164,173,173', +'137,173,,137,173,137,,,,173,173,173,,173,173,173,173,,,173,,173,173', +'173,,173,,,,173,173,180,180,164,180,,164,180,164,,,,180,180,180,,180', +'180,180,180,,,,,180,180,180,,180,,,,180,180,188,188,173,188,,173,188', +'173,,,,188,188,188,,188,188,188,188,,,,,188,188,188,,188,,,,188,188', +'191,191,180,191,,180,191,180,,,,191,191,191,,191,191,191,191,,,,,191', +'191,191,,191,,,,191,191,192,192,188,192,,188,192,188,,,,192,192,192', +',192,192,192,192,,,,,192,192,192,,192,,,,192,192,193,193,191,193,,191', +'193,191,,,,193,193,193,,193,193,193,193,,,,,193,193,193,,193,,,,193', +'193,194,194,192,194,,192,194,192,,,,194,194,194,,194,194,194,194,,,', +',194,194,194,,194,,,,194,194,261,261,193,261,,193,261,193,,,,261,261', +'261,,261,261,261,261,,,261,,261,261,261,,261,,,,261,261,270,270,194', +'270,,194,270,194,,,,270,270,270,,270,270,270,270,,,,,270,270,270,,270', +',,,270,270,272,272,261,272,,261,272,261,,,,272,272,272,,272,272,272', +'272,,,,,272,272,272,,272,,,,272,272,275,275,270,275,,270,275,270,,,', +'275,275,275,,275,275,275,275,,,,,275,275,275,,275,,,,275,275,,,272,', +',272,272,272,233,233,233,233,233,233,233,233,233,233,233,233,233,233', +'233,233,233,233,,,,,288,288,,288,,275,288,,275,,275,288,288,288,,288', +'288,288,288,,,288,,288,288,288,233,288,,,,288,288,291,291,,291,,,291', +',,,,291,291,291,,291,291,291,291,,,,,291,291,291,,291,,,,291,291,294', +'294,288,294,,288,294,288,,,,294,294,294,,294,294,294,294,,,,,294,294', +'294,,294,,,,294,294,316,316,291,316,,291,316,291,,,,316,316,316,,316', +'316,316,316,,,,,316,316,316,,316,,,,316,316,317,317,294,317,,294,317', +'294,,,,317,317,317,,317,317,317,317,,,,,317,317,317,,317,,,,317,317', +'319,319,316,319,,316,319,316,,,,319,319,319,,319,319,319,319,,,,,319', +'319,319,,319,,,,319,319,323,323,317,323,,317,323,317,,,,323,323,323', +',323,323,323,323,,,,,323,323,323,,323,,,,323,323,326,326,319,326,,319', +'326,319,,,,326,326,326,,326,326,326,326,,,,,326,326,326,,326,,,,326', +'326,327,327,323,327,,323,327,323,,,,327,327,327,,327,327,327,327,,,', +',327,327,327,,327,,,,327,327,328,328,326,328,,326,328,326,,,,328,328', +'328,,328,328,328,328,,,,,328,328,328,,328,,,,328,328,337,337,327,337', +',327,337,327,,,,337,337,337,,337,337,337,337,,,,,337,337,337,,337,,', +',337,337,341,341,328,341,,328,341,328,,,,341,341,341,,341,341,341,341', +',,341,,341,341,341,,341,,,,341,341,365,365,337,365,,337,365,337,,,,365', +'365,365,,365,365,365,365,,,,,365,365,365,,365,,,,365,365,418,418,341', +'418,,341,418,341,,,,418,418,418,,418,418,418,418,,,,,418,418,418,,418', +',,,418,418,435,435,365,435,,365,435,365,,,,435,435,435,,435,435,435', +'435,,,,,435,435,435,,435,,,,435,435,437,437,418,437,,418,437,418,,,', +'437,437,437,,437,437,437,437,,,,,437,437,437,,437,,,,437,437,64,64,435', +'64,,435,,435,,,,64,64,64,,64,64,64,,,,,,64,64,64,,64,,,,64,64,99,99', +'437,99,,437,,437,,,,99,99,99,,99,99,99,99,,,,,99,99,99,,99,,,,99,99', +'142,142,64,142,,64,,,,,,142,142,142,,142,142,142,142,,,,,142,142,142', +',142,,,,142,142,,,99,,,99,,,,,,,,,,,,,,,,205,,,,,,238,238,238,238,238', +'238,,,142,,,142,205,205,205,205,205,205,205,205,205,205,205,205,205', +'205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205', +'205,205,205,205,205,206,238,,,,,239,239,239,239,239,239,,205,,,,,206', +'206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206', +'206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206', +'381,239,,,,,240,240,240,240,240,240,,206,,,,,381,381,381,381,381,381', +'381,381,381,381,381,381,381,381,381,381,381,381,381,381,381,381,381', +'381,381,381,381,381,381,381,381,381,381,381,381,382,240,,,,,241,241', +'241,241,241,241,,381,,,,,382,382,382,382,382,382,382,382,382,382,382', +'382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,382', +'382,382,382,382,382,382,382,383,241,,,,,242,242,242,242,242,242,,382', +',,,,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383', +'383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383', +'383,383,439,242,,,,,243,243,243,243,243,243,,383,,,,,439,439,439,439', +'439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439', +'439,439,439,439,439,439,439,439,439,439,439,439,439,439,453,243,,,,244', +'244,244,244,244,244,,,439,,,,,453,453,453,453,453,453,453,453,453,453', +'453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453', +'453,453,453,453,453,453,453,453,244,245,245,245,245,245,245,,,,,,,453', +'145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145', +'145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145', +'145,245,,,,,,145,246,246,246,246,246,246,145,156,156,156,156,156,156', +'156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156', +'156,156,156,156,156,156,156,156,156,156,156,156,,,,,,,246,,,,,,,156', +'159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159', +'159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159', +'159,,,,,,,,,,,,,159,159,168,168,168,168,168,168,168,168,168,168,168', +'168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168', +'168,168,168,168,168,168,168,,,,,,,,,,,,,,168,179,179,179,179,179,179', +'179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179', +'179,179,179,179,179,179,179,179,179,179,179,179,,,,,,,,,,,,,,179,201', +'201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201', +'201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201,201', +',,,,,,,,,,,,,201,225,225,225,225,225,225,225,225,225,225,225,225,225', +'225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225', +'225,225,225,225,225,,,,,,,,,,,,,,225,234,234,234,234,234,234,234,234', +'234,234,234,234,234,234,234,234,234,234,253,253,253,253,253,253,253', +'253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253', +'253,253,253,253,253,253,234,,,,,,,,,,,,,,,,,,253,254,254,254,254,254', +'254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254', +'254,254,254,254,254,254,254,254,,,,,,,,,,,,,,,,,,,254,255,255,255,255', +'255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255', +'255,255,255,255,255,255,255,255,255,255,255,255,255,255,,,,,,,,,,,,', +',255,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256', +'256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256', +'256,256,,,,,,,,,,,,,,256,257,257,257,257,257,257,257,257,257,257,257', +'257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257', +'257,257,257,257,257,257,257,,,,,,,,,,,,,257,257,259,259,259,259,259', +'259,259,259,259,259,259,259,259,259,259,259,259,259,259,259,259,259', +'259,259,259,259,259,259,259,259,259,259,259,259,259,,,,,,,,,,259,,,259', +'259,289,289,289,289,289,289,289,289,289,289,289,289,289,289,289,289', +'289,289,289,289,289,289,289,289,289,289,289,289,289,289,289,289,289', +'289,289,,,,,,,,,,,,,,289,292,292,292,292,292,292,292,292,292,292,292', +'292,292,292,292,292,292,292,292,292,292,292,292,292,292,292,292,292', +'292,292,292,292,292,292,292,,,,,,,292,,,,,,,292,296,296,296,296,296', +'296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296', +'296,296,296,296,296,296,296,296,296,296,296,296,296,,,,,,,296,,,,,,', +'296,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303', +'303,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303,303', +'303,303,,,,,,,,,,,,,,303,307,307,307,307,307,307,307,307,307,307,307', +'307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307', +'307,307,307,307,307,307,307,,,,,,,307,,,,,,,307,308,308,308,308,308', +'308,308,308,308,308,308,308,308,308,308,308,308,308,308,308,308,308', +'308,308,308,308,308,308,308,308,308,308,308,308,308,,,,,,,,,,,,,,308', +'309,309,309,309,309,309,309,309,309,309,309,309,309,309,309,309,309', +'309,309,309,309,309,309,309,309,309,309,309,309,309,309,309,309,309', +'309,,,,,,,,,,,,,,309,310,310,310,310,310,310,310,310,310,310,310,310', +'310,310,310,310,310,310,310,310,310,310,310,310,310,310,310,310,310', +'310,310,310,310,310,310,,,,,,,,,,,,,,310,311,311,311,311,311,311,311', +'311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311', +'311,311,311,311,311,311,311,311,311,311,311,,,,,,,,,,,,,,311,338,338', +'338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338', +'338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,,,,', +',,,,,338,,,338,338,343,343,343,343,343,343,343,343,343,343,343,343,343', +'343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343', +'343,343,343,343,343,,,,,,,,,,,,,,343,347,347,347,347,347,347,347,347', +'347,347,347,347,347,347,347,347,347,347,347,347,347,347,347,347,347', +'347,347,347,347,347,347,347,347,347,347,,,,,,,,,,347,,,,347,349,349', +'349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349', +'349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,,,,', +',,,,,,,,,349,352,352,352,352,352,352,352,352,352,352,352,352,352,352', +'352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352', +'352,352,352,352,,,,,,,,,,,,,,352,358,358,358,358,358,358,358,358,358', +'358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358', +'358,358,358,358,358,358,358,358,358,,,,,,,,,,,,,,358,364,364,364,364', +'364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364', +'364,364,364,364,364,364,364,364,364,364,364,364,364,364,,,,,,,,,,,,', +',364,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372', +'372,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372', +'372,372,,,,,,,,,,,,,,372,373,373,373,373,373,373,373,373,373,373,373', +'373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373', +'373,373,373,373,373,373,373,,,,,,,,,,,,,,373,395,395,395,395,395,395', +'395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395', +'395,395,395,395,395,395,395,395,395,395,395,395,,,,,,,,,,,,,,395,398', +'398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398', +'398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398', +',,,,,,,,,,,,,398,405,405,405,405,405,405,405,405,405,405,405,405,405', +'405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405', +'405,405,405,405,405,,,,,,,,,,,,,,405,452,452,452,452,452,452,452,452', +'452,452,452,452,452,452,452,452,452,452,452,452,452,452,452,452,452', +'452,452,452,452,452,452,452,452,452,452,,,,,,,,,,,,,,452' ] + racc_action_check = arr = ::Array.new(6668, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 81, 132, 172, -7, nil, nil, nil, nil, 209, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 66, + nil, nil, -2, 76, 182, nil, nil, 160, nil, 1805, + nil, 328, 219, 324, nil, 225, nil, nil, nil, nil, + 117, nil, 342, 229, nil, nil, nil, nil, nil, nil, + nil, nil, 1838, nil, 1871, 82, 1904, -7, 1155, 103, + nil, 1937, 1970, 2003, 4409, nil, 348, nil, nil, nil, + 288, nil, 120, 214, -42, nil, nil, nil, 2036, nil, + 2069, 2102, 2135, nil, nil, 2168, 178, 322, 317, 324, + 296, nil, 397, -3, 263, 354, 311, 362, nil, 4442, + 2201, 2234, 2267, 2300, 2333, 2366, 2399, 2432, 2465, 2498, + 2531, 2564, 2597, 2630, 2663, 2696, 2729, 2762, 2795, 2828, + 2861, 2894, 2927, 2960, 2993, 3026, 3059, 3092, 3125, 3158, + 3191, 3224, 3257, 3290, 3323, 3356, 3389, 3422, 160, 1045, + 381, 388, 4475, -89, nil, 4886, 347, 1218, 401, nil, + 402, 404, nil, nil, 394, -70, 4935, -75, nil, 4984, + 398, 137, 143, nil, 3455, 1252, 400, nil, 5033, 400, + 447, 1316, nil, 3488, 399, 121, 1350, nil, 404, 5082, + 3521, 126, -25, 405, 452, 398, 192, 273, 3554, 404, + nil, 3587, 3620, 3653, 3686, nil, nil, nil, nil, 456, + 127, 5131, 38, 400, 479, 4519, 4572, 483, 484, 485, + 145, 562, 460, 129, nil, 1414, nil, nil, nil, nil, + 569, 660, 283, 751, 842, 5180, 1170, 1266, 1364, 1462, + 1560, 1657, 1755, 3831, 5229, 388, 466, 472, 4507, 4560, + 4613, 4666, 4719, 4772, 4824, 4873, 4928, 516, 780, 406, + 407, 871, 408, 5247, 5296, 5345, 5394, 5443, 1121, 5492, + 413, 3719, nil, nil, nil, nil, 185, 1448, 417, nil, + 3752, nil, 3785, nil, 1512, 3818, 1546, 135, 144, nil, + nil, 218, 231, 54, 145, 233, 155, 67, 3881, 5541, + 256, 3914, 5590, 418, 3947, 1610, 5639, 419, 42, 419, + 423, 423, 1644, 5688, 145, 470, nil, 5737, 5786, 5835, + 5884, 5933, 472, 185, 188, 225, 3980, 4013, 568, 4046, + 653, nil, 571, 4079, 574, 575, 4112, 4145, 4178, nil, + 29, 385, 55, -26, 499, 517, 521, 4211, 5982, 519, + nil, 4244, nil, 6031, 573, 525, nil, 6080, nil, 6129, + nil, nil, 6178, 562, nil, 562, 563, nil, 6227, 577, + 191, nil, 1707, nil, 6276, 4277, nil, 627, 628, -20, + -9, nil, 6325, 6374, nil, 973, 3, nil, 1050, nil, + nil, 4625, 4678, 4731, nil, 642, 389, 325, nil, 648, + nil, 688, 652, 1741, nil, 6423, nil, nil, 6472, nil, + nil, nil, nil, 213, 612, 6521, nil, nil, 696, nil, + 241, 614, 623, nil, nil, nil, 370, 677, 4310, nil, + 734, 736, 741, 742, nil, 720, nil, nil, 716, 670, + 214, nil, 721, -7, 722, 4343, nil, 4376, 744, 4784, + nil, nil, nil, nil, nil, 739, nil, 111, 696, 703, + nil, 113, 6570, 4837, 66, 835, 786, 787, 753, 791, + 926, 76, nil, nil, 114, nil, 100, 792, nil ] + +racc_action_default = [ + -1, -259, -2, -3, -4, -8, -9, -10, -11, -12, + -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, + -23, -24, -25, -26, -27, -29, -30, -31, -32, -116, + -34, -35, -36, -37, -38, -39, -40, -49, -50, -51, + -52, -53, -54, -55, -56, -57, -58, -59, -60, -63, + -64, -65, -69, -72, -75, -259, -116, -116, -119, -116, + -115, -116, -116, -116, -116, -168, -259, -177, -179, -180, + -259, -184, -116, -116, -116, -200, -201, -202, -217, -219, + -116, -116, -116, -228, -229, -116, -116, -259, -116, -116, + -257, -258, -259, -7, -116, -6, -259, -259, -188, -116, + -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, + -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, + -116, -116, -116, -116, -116, -116, -116, -116, -116, -116, + -116, -116, -116, -116, -116, -116, -116, -116, -83, -116, + -28, -259, -116, -26, -31, -259, -259, -116, -80, -94, + -79, -81, -61, -62, -182, -259, -70, -259, -76, -259, + -259, -183, -185, -189, -116, -116, -101, -102, -127, -35, + -37, -116, -54, -69, -259, -259, -116, -107, -120, -123, + -116, -111, -116, -109, -259, -164, -165, -166, -116, -259, + -167, -116, -116, -116, -116, -181, -186, -187, -117, -259, + -259, -218, -214, -259, -259, -259, -259, -259, -259, -259, + -237, -245, -259, -259, -255, -116, 469, -5, -183, -170, + -129, -130, -131, -132, -133, -134, -135, -136, -137, -138, + -139, -140, -141, -142, -143, -144, -145, -146, -147, -148, + -149, -150, -151, -152, -153, -154, -155, -156, -157, -158, + -159, -160, -161, -162, -163, -222, -225, -259, -116, -259, + -259, -93, -97, -96, -169, -41, -33, -116, -259, -95, + -116, -67, -116, -73, -116, -116, -116, -259, -190, -191, + -192, -29, -30, -35, -36, -37, -39, -52, -75, -259, + -259, -116, -123, -259, -116, -116, -123, -259, -259, -83, + -259, -259, -116, -124, -259, -116, -110, -259, -171, -172, + -173, -174, -259, -204, -203, -207, -116, -116, -259, -116, + -116, -246, -259, -116, -259, -259, -116, -116, -116, -234, + -259, -259, -244, -259, -105, -122, -259, -116, -259, -259, + -86, -91, -87, -92, -82, -84, -99, -259, -68, -71, + -74, -77, -78, -259, -193, -259, -259, -100, -128, -259, + -259, -103, -116, -106, -125, -116, -108, -259, -116, -259, + -208, -205, -215, -216, -220, -259, -244, -223, -259, -227, + -230, -259, -259, -259, -235, -259, -259, -243, -238, -259, + -242, -259, -116, -116, -256, -226, -88, -89, -90, -66, + -98, -194, -195, -114, -259, -126, -112, -118, -259, -206, + -259, -259, -209, -210, -221, -247, -248, -259, -116, -224, + -259, -259, -259, -259, -240, -259, -239, -253, -259, -259, + -113, -196, -207, -259, -207, -116, -249, -116, -116, -259, + -231, -232, -233, -236, -241, -259, -104, -259, -259, -211, + -212, -259, -213, -259, -250, -116, -259, -259, -207, -259, + -116, -251, -254, -197, -259, -198, -252, -259, -199 ] + +racc_goto_table = [ + 2, 154, 3, 95, 27, 169, 27, 96, 210, 98, + 390, 170, 148, 281, 155, 151, 183, 369, 413, 260, + 389, 415, 172, 318, 322, 1, 282, 217, 140, 356, + 284, 286, 209, 351, 166, 214, 97, 200, 335, 336, + 190, 207, 410, 202, 177, 330, 416, nil, nil, nil, + nil, 208, nil, nil, 154, nil, nil, nil, nil, nil, + nil, 436, nil, nil, nil, 390, nil, nil, nil, nil, + nil, 96, 96, 196, 197, 425, nil, nil, nil, nil, + nil, 450, nil, nil, nil, 175, nil, 184, nil, nil, + nil, nil, 160, 95, nil, nil, 145, nil, 27, 27, + 97, 97, 198, 219, nil, nil, 181, nil, nil, nil, + nil, nil, 283, nil, 97, nil, 212, 213, 285, 156, + nil, 159, nil, 168, nil, 179, 324, 325, 185, 186, + 187, 162, 299, 268, 447, 298, 451, 281, 339, 304, + 281, 280, nil, 291, nil, 201, 264, 203, 204, 205, + 282, 293, 206, 282, 284, 286, nil, 284, 286, nil, + 464, nil, 301, nil, nil, nil, nil, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, nil, 259, nil, nil, nil, + 184, 287, 300, 332, 179, 27, nil, nil, nil, nil, + nil, nil, nil, nil, 345, nil, nil, nil, nil, 181, + nil, 289, 292, nil, nil, nil, 283, 315, 296, 283, + 156, nil, 285, 292, nil, 285, 344, 303, nil, nil, + 334, 162, 388, nil, 391, 307, nil, 280, 308, 309, + 310, 311, 353, nil, 148, nil, 151, 291, nil, 355, + nil, nil, nil, nil, nil, nil, 314, nil, nil, nil, + nil, 359, 179, nil, nil, nil, nil, nil, nil, 314, + 408, nil, nil, 280, nil, nil, nil, nil, nil, nil, + nil, nil, 420, 421, 422, nil, 423, 424, nil, nil, + 426, nil, nil, nil, nil, nil, nil, nil, 345, nil, + nil, nil, 376, nil, 27, 338, nil, nil, 343, nil, + nil, nil, 95, 367, 179, 287, 143, 347, 287, 349, + 344, 159, 352, 179, nil, nil, 444, nil, 404, nil, + nil, nil, nil, nil, nil, 159, nil, nil, 289, nil, + nil, 358, 179, nil, 174, nil, 456, nil, 457, 364, + nil, 189, 459, nil, nil, nil, 95, nil, 387, 429, + nil, nil, nil, 372, 373, 467, 375, nil, nil, nil, + 378, nil, nil, 381, 382, 383, 407, nil, nil, nil, + nil, nil, nil, nil, 395, nil, 189, nil, 398, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 428, nil, nil, nil, nil, nil, nil, nil, nil, 179, + nil, nil, 405, 387, nil, nil, nil, nil, nil, nil, + 454, nil, 27, nil, nil, nil, nil, nil, nil, 189, + nil, nil, nil, nil, 95, nil, nil, 461, nil, 27, + 179, 95, 466, nil, 27, nil, 95, nil, nil, nil, + nil, nil, 143, nil, nil, nil, nil, nil, 143, nil, + nil, nil, nil, 143, nil, 439, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 143, nil, nil, nil, nil, + nil, nil, 452, nil, 453 ] + +racc_goto_check = [ + 2, 50, 3, 2, 28, 31, 28, 42, 70, 64, + 40, 33, 49, 26, 45, 49, 58, 69, 72, 52, + 76, 77, 41, 74, 74, 1, 27, 4, 25, 37, + 32, 35, 44, 48, 56, 57, 53, 59, 60, 61, + 62, 65, 71, 73, 55, 75, 78, nil, nil, nil, + nil, 41, nil, nil, 50, nil, nil, nil, nil, nil, + nil, 77, nil, nil, nil, 40, nil, nil, nil, nil, + nil, 42, 42, 64, 64, 76, nil, nil, nil, nil, + nil, 72, nil, nil, nil, 53, nil, 53, nil, nil, + nil, nil, 54, 2, nil, nil, 22, nil, 28, 28, + 53, 53, 53, 28, nil, nil, 38, nil, nil, nil, + nil, nil, 31, nil, 53, nil, 53, 53, 33, 22, + nil, 22, nil, 22, nil, 22, 70, 70, 22, 22, + 22, 66, 50, 55, 69, 45, 69, 26, 52, 58, + 26, 67, nil, 67, nil, 22, 28, 22, 22, 22, + 27, 55, 22, 27, 32, 35, nil, 32, 35, nil, + 69, nil, 55, nil, nil, nil, nil, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, nil, 22, nil, nil, nil, + 53, 38, 54, 3, 22, 28, nil, nil, nil, nil, + nil, nil, nil, nil, 50, nil, nil, nil, nil, 38, + nil, 22, 22, nil, nil, nil, 31, 54, 22, 31, + 22, nil, 33, 22, nil, 33, 49, 22, nil, nil, + 54, 66, 70, nil, 70, 22, nil, 67, 22, 22, + 22, 22, 55, nil, 49, nil, 49, 67, nil, 67, + nil, nil, nil, nil, nil, nil, 66, nil, nil, nil, + nil, 55, 22, nil, nil, nil, nil, nil, nil, 66, + 70, nil, nil, 67, nil, nil, nil, nil, nil, nil, + nil, nil, 70, 70, 70, nil, 70, 70, nil, nil, + 70, nil, nil, nil, nil, nil, nil, nil, 50, nil, + nil, nil, 3, nil, 28, 22, nil, nil, 22, nil, + nil, nil, 2, 53, 22, 38, 23, 22, 38, 22, + 49, 22, 22, 22, nil, nil, 70, nil, 55, nil, + nil, nil, nil, nil, nil, 22, nil, nil, 22, nil, + nil, 22, 22, nil, 23, nil, 70, nil, 70, 22, + nil, 23, 70, nil, nil, nil, 2, nil, 38, 55, + nil, nil, nil, 22, 22, 70, 22, nil, nil, nil, + 22, nil, nil, 22, 22, 22, 53, nil, nil, nil, + nil, nil, nil, nil, 22, nil, 23, nil, 22, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 53, nil, nil, nil, nil, nil, nil, nil, nil, 22, + nil, nil, 22, 38, nil, nil, nil, nil, nil, nil, + 3, nil, 28, nil, nil, nil, nil, nil, nil, 23, + nil, nil, nil, nil, 2, nil, nil, 3, nil, 28, + 22, 2, 3, nil, 28, nil, 2, nil, nil, nil, + nil, nil, 23, nil, nil, nil, nil, nil, 23, nil, + nil, nil, nil, 23, nil, 22, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, + nil, nil, 22, nil, 22 ] + +racc_goto_pointer = [ + nil, 25, 0, 2, -68, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 67, 307, nil, 4, -151, -138, 4, nil, + nil, -52, -134, -46, nil, -133, nil, -262, 47, nil, + -321, -35, -1, nil, -54, -38, nil, nil, -241, -20, + -42, nil, -120, 28, 37, -14, -22, -54, -43, -37, + -177, -176, -24, nil, 1, -45, 76, -21, nil, -298, + -79, -328, -352, -35, -180, -165, -311, -355, -330 ] + +racc_goto_default = [ + nil, nil, 94, 93, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, nil, 25, 26, 144, 28, + 30, 31, 32, 33, 34, 35, 36, 290, 40, 39, + 41, 42, 43, 51, 67, nil, 53, 157, 158, 150, + 138, 68, nil, 55, nil, 297, nil, nil, nil, nil, + 178, nil, 65, 66, 71, 69, 278, 163, 74, nil, + 321, nil, nil, nil, nil, nil, nil, nil, nil ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 0, 99, :_reduce_1, + 1, 99, :_reduce_2, + 1, 99, :_reduce_3, + 1, 101, :_reduce_4, + 3, 101, :_reduce_5, + 2, 101, :_reduce_6, + 2, 101, :_reduce_7, + 1, 102, :_reduce_8, + 1, 102, :_reduce_9, + 1, 102, :_reduce_10, + 1, 102, :_reduce_11, + 1, 102, :_reduce_12, + 1, 102, :_reduce_13, + 1, 102, :_reduce_14, + 1, 102, :_reduce_15, + 1, 102, :_reduce_16, + 1, 102, :_reduce_17, + 1, 102, :_reduce_18, + 1, 102, :_reduce_19, + 1, 102, :_reduce_20, + 1, 102, :_reduce_21, + 1, 102, :_reduce_22, + 1, 102, :_reduce_23, + 1, 102, :_reduce_24, + 1, 102, :_reduce_25, + 1, 120, :_reduce_26, + 1, 120, :_reduce_27, + 2, 120, :_reduce_28, + 1, 120, :_reduce_29, + 1, 120, :_reduce_30, + 1, 120, :_reduce_31, + 1, 120, :_reduce_32, + 3, 120, :_reduce_33, + 1, 121, :_reduce_34, + 1, 121, :_reduce_35, + 1, 121, :_reduce_36, + 1, 121, :_reduce_37, + 1, 121, :_reduce_38, + 1, 121, :_reduce_39, + 1, 121, :_reduce_40, + 3, 121, :_reduce_41, + 1, 135, :_reduce_42, + 1, 135, :_reduce_43, + 1, 135, :_reduce_44, + 1, 135, :_reduce_45, + 1, 135, :_reduce_46, + 1, 135, :_reduce_47, + 1, 135, :_reduce_48, + 1, 100, :_reduce_49, + 1, 100, :_reduce_50, + 1, 132, :_reduce_51, + 1, 132, :_reduce_52, + 1, 132, :_reduce_53, + 1, 132, :_reduce_54, + 1, 132, :_reduce_55, + 1, 132, :_reduce_56, + 1, 132, :_reduce_57, + 1, 137, :_reduce_58, + 1, 136, :_reduce_59, + 1, 136, :_reduce_60, + 2, 136, :_reduce_61, + 2, 136, :_reduce_62, + 1, 138, :_reduce_63, + 1, 140, :_reduce_64, + 1, 139, :_reduce_65, + 5, 142, :_reduce_66, + 3, 141, :_reduce_67, + 4, 141, :_reduce_68, + 0, 143, :_reduce_69, + 1, 143, :_reduce_70, + 3, 143, :_reduce_71, + 1, 122, :_reduce_72, + 3, 144, :_reduce_73, + 4, 144, :_reduce_74, + 0, 145, :_reduce_75, + 1, 145, :_reduce_76, + 3, 145, :_reduce_77, + 3, 146, :_reduce_78, + 2, 129, :_reduce_79, + 2, 129, :_reduce_80, + 2, 129, :_reduce_81, + 4, 129, :_reduce_82, + 2, 130, :_reduce_83, + 4, 130, :_reduce_84, + 2, 149, :_reduce_85, + 3, 148, :_reduce_86, + 3, 148, :_reduce_87, + 4, 148, :_reduce_88, + 4, 148, :_reduce_89, + 3, 150, :_reduce_90, + 2, 150, :_reduce_91, + 2, 150, :_reduce_92, + 1, 150, :_reduce_93, + 1, 147, :_reduce_94, + 2, 147, :_reduce_95, + 2, 123, :_reduce_96, + 2, 123, :_reduce_97, + 5, 133, :_reduce_98, + 4, 133, :_reduce_99, + 4, 133, :_reduce_100, + 2, 133, :_reduce_101, + 2, 133, :_reduce_102, + 4, 133, :_reduce_103, + 5, 155, :_reduce_104, + 2, 155, :_reduce_105, + 4, 115, :_reduce_106, + 2, 115, :_reduce_107, + 4, 116, :_reduce_108, + 2, 116, :_reduce_109, + 2, 156, :_reduce_110, + 1, 156, :_reduce_111, + 4, 156, :_reduce_112, + 6, 103, :_reduce_113, + 5, 103, :_reduce_114, + 1, 151, :_reduce_115, + 0, 151, :_reduce_116, + 1, 157, :_reduce_117, + 4, 157, :_reduce_118, + 0, 153, :_reduce_119, + 1, 153, :_reduce_120, + 0, 159, :_reduce_121, + 1, 159, :_reduce_122, + 1, 158, :_reduce_123, + 2, 158, :_reduce_124, + 3, 158, :_reduce_125, + 4, 158, :_reduce_126, + 1, 154, :_reduce_127, + 3, 154, :_reduce_128, + 3, 124, :_reduce_129, + 3, 124, :_reduce_130, + 3, 124, :_reduce_131, + 3, 124, :_reduce_132, + 3, 124, :_reduce_133, + 3, 124, :_reduce_134, + 3, 124, :_reduce_135, + 3, 124, :_reduce_136, + 3, 124, :_reduce_137, + 3, 124, :_reduce_138, + 3, 124, :_reduce_139, + 3, 124, :_reduce_140, + 3, 124, :_reduce_141, + 3, 124, :_reduce_142, + 3, 124, :_reduce_143, + 3, 124, :_reduce_144, + 3, 124, :_reduce_145, + 3, 124, :_reduce_146, + 3, 124, :_reduce_147, + 3, 124, :_reduce_148, + 3, 124, :_reduce_149, + 3, 124, :_reduce_150, + 3, 124, :_reduce_151, + 3, 124, :_reduce_152, + 3, 124, :_reduce_153, + 3, 124, :_reduce_154, + 3, 124, :_reduce_155, + 3, 124, :_reduce_156, + 3, 124, :_reduce_157, + 3, 124, :_reduce_158, + 3, 124, :_reduce_159, + 3, 124, :_reduce_160, + 3, 124, :_reduce_161, + 3, 124, :_reduce_162, + 3, 124, :_reduce_163, + 2, 128, :_reduce_164, + 2, 128, :_reduce_165, + 2, 128, :_reduce_166, + 2, 126, :_reduce_167, + 1, 126, :_reduce_168, + 3, 117, :_reduce_169, + 3, 117, :_reduce_170, + 3, 160, :_reduce_171, + 3, 160, :_reduce_172, + 3, 160, :_reduce_173, + 3, 160, :_reduce_174, + 1, 161, :_reduce_175, + 1, 161, :_reduce_176, + 1, 161, :_reduce_177, + 1, 161, :_reduce_178, + 1, 161, :_reduce_179, + 1, 162, :_reduce_180, + 2, 162, :_reduce_181, + 2, 162, :_reduce_182, + 2, 163, :_reduce_183, + 1, 131, :_reduce_184, + 2, 131, :_reduce_185, + 2, 106, :_reduce_186, + 2, 106, :_reduce_187, + 2, 106, :_reduce_188, + 1, 164, :_reduce_189, + 2, 164, :_reduce_190, + 2, 164, :_reduce_191, + 2, 164, :_reduce_192, + 3, 165, :_reduce_193, + 4, 165, :_reduce_194, + 4, 165, :_reduce_195, + 6, 104, :_reduce_196, + 9, 104, :_reduce_197, + 9, 104, :_reduce_198, + 11, 104, :_reduce_199, + 1, 166, :_reduce_200, + 1, 166, :_reduce_201, + 1, 166, :_reduce_202, + 1, 152, :_reduce_203, + 1, 152, :_reduce_204, + 1, 167, :_reduce_205, + 2, 167, :_reduce_206, + 0, 167, :_reduce_207, + 0, 169, :_reduce_208, + 1, 169, :_reduce_209, + 1, 169, :_reduce_210, + 3, 169, :_reduce_211, + 3, 169, :_reduce_212, + 3, 170, :_reduce_213, + 2, 105, :_reduce_214, + 4, 105, :_reduce_215, + 4, 105, :_reduce_216, + 0, 171, :_reduce_217, + 1, 171, :_reduce_218, + 1, 114, :_reduce_219, + 4, 118, :_reduce_220, + 5, 118, :_reduce_221, + 3, 118, :_reduce_222, + 4, 119, :_reduce_223, + 5, 119, :_reduce_224, + 3, 119, :_reduce_225, + 5, 125, :_reduce_226, + 4, 109, :_reduce_227, + 1, 113, :_reduce_228, + 1, 113, :_reduce_229, + 4, 110, :_reduce_230, + 6, 108, :_reduce_231, + 6, 108, :_reduce_232, + 6, 108, :_reduce_233, + 3, 111, :_reduce_234, + 4, 111, :_reduce_235, + 6, 111, :_reduce_236, + 0, 173, :_reduce_237, + 2, 173, :_reduce_238, + 3, 173, :_reduce_239, + 3, 173, :_reduce_240, + 4, 173, :_reduce_241, + 1, 174, :_reduce_242, + 1, 174, :_reduce_243, + 2, 168, :_reduce_244, + 1, 168, :_reduce_245, + 1, 172, :_reduce_246, + 3, 172, :_reduce_247, + 3, 172, :_reduce_248, + 4, 172, :_reduce_249, + 3, 175, :_reduce_250, + 4, 176, :_reduce_251, + 5, 176, :_reduce_252, + 5, 112, :_reduce_253, + 8, 112, :_reduce_254, + 2, 134, :_reduce_255, + 4, 127, :_reduce_256, + 1, 127, :_reduce_257, + 1, 107, :_reduce_258 ] + +racc_reduce_n = 259 + +racc_shift_n = 469 + +racc_token_table = { + false => 0, + :error => 1, + :IF => 2, + :ELSE => 3, + :ELSEIF => 4, + :THEN => 5, + :UNLESS => 6, + :END => 7, + :WHILE => 8, + :UNTIL => 9, + :BREAK => 10, + :CONTINUE => 11, + :TRY => 12, + :CATCH => 13, + :FINALLY => 14, + :FOR => 15, + :IN => 16, + :DEF => 17, + :DEF_BANG => 18, + :SPLAT_PARAM => 19, + :SPLAT_ARG => 20, + :CALL => 21, + :BUILTIN_COMMAND => 22, + :CLASS => 23, + :NEW => 24, + :DEFM => 25, + :DEFM_BANG => 26, + :SUPER => 27, + :RIML_FILE_COMMAND => 28, + :RIML_CLASS_COMMAND => 29, + :RETURN => 30, + :NEWLINE => 31, + :NUMBER => 32, + :STRING_D => 33, + :STRING_S => 34, + :EX_LITERAL => 35, + :REGEXP => 36, + :TRUE => 37, + :FALSE => 38, + :LET => 39, + :UNLET => 40, + :UNLET_BANG => 41, + :IDENTIFIER => 42, + :DICT_VAL => 43, + :SCOPE_MODIFIER => 44, + :SCOPE_MODIFIER_LITERAL => 45, + :SPECIAL_VAR_PREFIX => 46, + :FINISH => 47, + "!" => 48, + "*" => 49, + "/" => 50, + "%" => 51, + "+" => 52, + "-" => 53, + "." => 54, + ">" => 55, + ">#" => 56, + ">?" => 57, + "<" => 58, + "<#" => 59, + "<?" => 60, + ">=" => 61, + ">=#" => 62, + ">=?" => 63, + "<=" => 64, + "<=#" => 65, + "<=?" => 66, + "==" => 67, + "==?" => 68, + "==#" => 69, + "=~" => 70, + "=~?" => 71, + "=~#" => 72, + "!~" => 73, + "!~?" => 74, + "!~#" => 75, + "!=" => 76, + "!=?" => 77, + "!=#" => 78, + :IS => 79, + :ISNOT => 80, + "&&" => 81, + "||" => 82, + "?" => 83, + "=" => 84, + "+=" => 85, + "-=" => 86, + ".=" => 87, + "," => 88, + "(" => 89, + ")" => 90, + ";" => 91, + "[" => 92, + "]" => 93, + "{" => 94, + "}" => 95, + ":" => 96, + "===" => 97 } + +racc_nt_base = 98 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "IF", + "ELSE", + "ELSEIF", + "THEN", + "UNLESS", + "END", + "WHILE", + "UNTIL", + "BREAK", + "CONTINUE", + "TRY", + "CATCH", + "FINALLY", + "FOR", + "IN", + "DEF", + "DEF_BANG", + "SPLAT_PARAM", + "SPLAT_ARG", + "CALL", + "BUILTIN_COMMAND", + "CLASS", + "NEW", + "DEFM", + "DEFM_BANG", + "SUPER", + "RIML_FILE_COMMAND", + "RIML_CLASS_COMMAND", + "RETURN", + "NEWLINE", + "NUMBER", + "STRING_D", + "STRING_S", + "EX_LITERAL", + "REGEXP", + "TRUE", + "FALSE", + "LET", + "UNLET", + "UNLET_BANG", + "IDENTIFIER", + "DICT_VAL", + "SCOPE_MODIFIER", + "SCOPE_MODIFIER_LITERAL", + "SPECIAL_VAR_PREFIX", + "FINISH", + "\"!\"", + "\"*\"", + "\"/\"", + "\"%\"", + "\"+\"", + "\"-\"", + "\".\"", + "\">\"", + "\">#\"", + "\">?\"", + "\"<\"", + "\"<#\"", + "\"<?\"", + "\">=\"", + "\">=#\"", + "\">=?\"", + "\"<=\"", + "\"<=#\"", + "\"<=?\"", + "\"==\"", + "\"==?\"", + "\"==#\"", + "\"=~\"", + "\"=~?\"", + "\"=~#\"", + "\"!~\"", + "\"!~?\"", + "\"!~#\"", + "\"!=\"", + "\"!=?\"", + "\"!=#\"", + "IS", + "ISNOT", + "\"&&\"", + "\"||\"", + "\"?\"", + "\"=\"", + "\"+=\"", + "\"-=\"", + "\".=\"", + "\",\"", + "\"(\"", + "\")\"", + "\";\"", + "\"[\"", + "\"]\"", + "\"{\"", + "\"}\"", + "\":\"", + "\"===\"", + "$start", + "Root", + "Terminator", + "Statements", + "Statement", + "ExplicitCall", + "Def", + "Return", + "UnletVariable", + "ExLiteral", + "For", + "While", + "Until", + "Try", + "ClassDefinition", + "LoopKeyword", + "EndScript", + "RimlFileCommand", + "RimlClassCommand", + "MultiAssign", + "If", + "Unless", + "Expression", + "ExpressionWithoutDictLiteral", + "Dictionary", + "DictGetWithDotLiteral", + "BinaryOperator", + "Ternary", + "Assign", + "Super", + "UnaryOperator", + "DictGet", + "ListOrDictGet", + "AllVariableRetrieval", + "LiteralWithoutDictLiteral", + "Call", + "ObjectInstantiation", + "PossibleStringValue", + "String", + "Number", + "Regexp", + "List", + "ScopeModifierLiteral", + "ListLiteral", + "ListUnpack", + "ListItems", + "DictionaryLiteral", + "DictItems", + "DictItem", + "DictGetWithDot", + "ListOrDictGetWithBrackets", + "ListOrDictGetAssign", + "SubList", + "Scope", + "DefCallIdentifier", + "ArgList", + "ArgListWithoutNothing", + "ObjectInstantiationCall", + "ClassArgList", + "SIDAndScope", + "ArgListWithoutNothingWithSplat", + "ArgListWithSplat", + "AssignExpression", + "AssignLHS", + "VariableRetrieval", + "SimpleVariableRetrieval", + "CurlyBraceName", + "CurlyBraceVarPart", + "FunctionType", + "DefKeywords", + "Block", + "ParamList", + "DefaultParam", + "Returnable", + "IfBlock", + "Catch", + "Catchable", + "ElseBlock", + "ElseifBlock" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'riml.y', 61) + def _reduce_1(val, _values, result) + result = make_node(val) { |_| Riml::Nodes.new([]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 62) + def _reduce_2(val, _values, result) + result = make_node(val) { |_| Riml::Nodes.new([]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 63) + def _reduce_3(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 68) + def _reduce_4(val, _values, result) + result = make_node(val) { |v| Riml::Nodes.new([ v[0] ]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 69) + def _reduce_5(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 70) + def _reduce_6(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 71) + def _reduce_7(val, _values, result) + result = make_node(val) { |v| Riml::Nodes.new(v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 76) + def _reduce_8(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 77) + def _reduce_9(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 78) + def _reduce_10(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 79) + def _reduce_11(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 80) + def _reduce_12(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 81) + def _reduce_13(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 82) + def _reduce_14(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 83) + def _reduce_15(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 84) + def _reduce_16(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 85) + def _reduce_17(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 86) + def _reduce_18(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 87) + def _reduce_19(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 88) + def _reduce_20(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 89) + def _reduce_21(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 90) + def _reduce_22(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 91) + def _reduce_23(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 92) + def _reduce_24(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 93) + def _reduce_25(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 97) + def _reduce_26(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 98) + def _reduce_27(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 99) + def _reduce_28(val, _values, result) + result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 100) + def _reduce_29(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 101) + def _reduce_30(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 102) + def _reduce_31(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 103) + def _reduce_32(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 104) + def _reduce_33(val, _values, result) + result = make_node(val) { |v| Riml::WrapInParensNode.new(v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 108) + def _reduce_34(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 109) + def _reduce_35(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 110) + def _reduce_36(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 111) + def _reduce_37(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 112) + def _reduce_38(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 113) + def _reduce_39(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 114) + def _reduce_40(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 115) + def _reduce_41(val, _values, result) + result = make_node(val) { |v| Riml::WrapInParensNode.new(v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 120) + def _reduce_42(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 121) + def _reduce_43(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 122) + def _reduce_44(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 123) + def _reduce_45(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 124) + def _reduce_46(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 125) + def _reduce_47(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 126) + def _reduce_48(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 130) + def _reduce_49(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 131) + def _reduce_50(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 135) + def _reduce_51(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 136) + def _reduce_52(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 137) + def _reduce_53(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 138) + def _reduce_54(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 139) + def _reduce_55(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 140) + def _reduce_56(val, _values, result) + result = make_node(val) { |_| Riml::TrueNode.new } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 141) + def _reduce_57(val, _values, result) + result = make_node(val) { |_| Riml::FalseNode.new } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 145) + def _reduce_58(val, _values, result) + result = make_node(val) { |v| Riml::NumberNode.new(v[0]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 149) + def _reduce_59(val, _values, result) + result = make_node(val) { |v| Riml::StringNode.new(v[0], :s) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 150) + def _reduce_60(val, _values, result) + result = make_node(val) { |v| Riml::StringNode.new(v[0], :d) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 151) + def _reduce_61(val, _values, result) + result = make_node(val) { |v| Riml::StringLiteralConcatNode.new(v[0], Riml::StringNode.new(v[1], :s)) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 152) + def _reduce_62(val, _values, result) + result = make_node(val) { |v| Riml::StringLiteralConcatNode.new(v[0], Riml::StringNode.new(v[1], :d)) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 156) + def _reduce_63(val, _values, result) + result = make_node(val) { |v| Riml::RegexpNode.new(v[0]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 160) + def _reduce_64(val, _values, result) + result = make_node(val) { |v| Riml::ScopeModifierLiteralNode.new(v[0]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 164) + def _reduce_65(val, _values, result) + result = make_node(val) { |v| Riml::ListNode.new(v[0]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 168) + def _reduce_66(val, _values, result) + result = make_node(val) { |v| Riml::ListUnpackNode.new(v[1] << v[3]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 172) + def _reduce_67(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 173) + def _reduce_68(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 177) + def _reduce_69(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 178) + def _reduce_70(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 179) + def _reduce_71(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 183) + def _reduce_72(val, _values, result) + result = make_node(val) { |v| Riml::DictionaryNode.new(v[0]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 190) + def _reduce_73(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 191) + def _reduce_74(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 196) + def _reduce_75(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 197) + def _reduce_76(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 198) + def _reduce_77(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 203) + def _reduce_78(val, _values, result) + result = [val[0], val[2]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 207) + def _reduce_79(val, _values, result) + result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 208) + def _reduce_80(val, _values, result) + result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 209) + def _reduce_81(val, _values, result) + result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 210) + def _reduce_82(val, _values, result) + result = make_node(val) { |v| Riml::DictGetDotNode.new(Riml::WrapInParensNode.new(v[1]), v[3]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 214) + def _reduce_83(val, _values, result) + result = make_node(val) { |v| Riml::ListOrDictGetNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 215) + def _reduce_84(val, _values, result) + result = make_node(val) { |v| Riml::ListOrDictGetNode.new(Riml::WrapInParensNode.new(v[1]), v[3]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 219) + def _reduce_85(val, _values, result) + result = make_node(val) { |v| Riml::ListOrDictGetNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 223) + def _reduce_86(val, _values, result) + result = [val[1]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 224) + def _reduce_87(val, _values, result) + result = [val[1]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 225) + def _reduce_88(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 226) + def _reduce_89(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 230) + def _reduce_90(val, _values, result) + result = make_node(val) { |v| Riml::SublistNode.new([v[0], Riml::LiteralNode.new(' : '), v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 231) + def _reduce_91(val, _values, result) + result = make_node(val) { |v| Riml::SublistNode.new([v[0], Riml::LiteralNode.new(' :')]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 232) + def _reduce_92(val, _values, result) + result = make_node(val) { |v| Riml::SublistNode.new([Riml::LiteralNode.new(': '), v[1]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 233) + def _reduce_93(val, _values, result) + result = make_node(val) { |_| Riml::SublistNode.new([Riml::LiteralNode.new(':')]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 237) + def _reduce_94(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 238) + def _reduce_95(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 242) + def _reduce_96(val, _values, result) + result = [val[1]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 243) + def _reduce_97(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 247) + def _reduce_98(val, _values, result) + result = make_node(val) { |v| Riml::CallNode.new(v[0], v[1], v[3]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 248) + def _reduce_99(val, _values, result) + result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 249) + def _reduce_100(val, _values, result) + result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 250) + def _reduce_101(val, _values, result) + result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 251) + def _reduce_102(val, _values, result) + result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], []) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 252) + def _reduce_103(val, _values, result) + result = make_node(val) { |v| Riml::ExplicitCallNode.new(nil, nil, v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 256) + def _reduce_104(val, _values, result) + result = make_node(val) { |v| Riml::CallNode.new(v[0], v[1], v[3]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 257) + def _reduce_105(val, _values, result) + result = make_node(val) { |v| Riml::CallNode.new(v[0], v[1], []) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 261) + def _reduce_106(val, _values, result) + result = make_node(val) { |v| Riml::RimlFileCommandNode.new(nil, v[0], v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 262) + def _reduce_107(val, _values, result) + result = make_node(val) { |v| Riml::RimlFileCommandNode.new(nil, v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 266) + def _reduce_108(val, _values, result) + result = make_node(val) { |v| Riml::RimlClassCommandNode.new(nil, v[0], v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 267) + def _reduce_109(val, _values, result) + result = make_node(val) { |v| Riml::RimlClassCommandNode.new(nil, v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 271) + def _reduce_110(val, _values, result) + result = ["#{val[0]}#{val[1]}"] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 272) + def _reduce_111(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 273) + def _reduce_112(val, _values, result) + result = val[0].concat ["#{val[2]}#{val[3]}"] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 277) + def _reduce_113(val, _values, result) + result = make_node(val) { |v| Riml::ExplicitCallNode.new(v[1], v[2], v[4]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 278) + def _reduce_114(val, _values, result) + result = make_node(val) { |v| Riml::ExplicitCallNode.new(nil, v[1], v[3]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 282) + def _reduce_115(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 283) + def _reduce_116(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 288) + def _reduce_117(val, _values, result) + result = [ nil, val[0] ] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 289) + def _reduce_118(val, _values, result) + result = [ make_node(val) { |v| Riml::SIDNode.new(v[1]) }, val[3] ] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 293) + def _reduce_119(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 294) + def _reduce_120(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 298) + def _reduce_121(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 299) + def _reduce_122(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 303) + def _reduce_123(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 304) + def _reduce_124(val, _values, result) + result = [ make_node(val) { |v| Riml::SplatNode.new(v[1]) } ] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 305) + def _reduce_125(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 306) + def _reduce_126(val, _values, result) + result = val[0] << make_node(val) { |v| Riml::SplatNode.new(v[3]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 310) + def _reduce_127(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 311) + def _reduce_128(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 315) + def _reduce_129(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 316) + def _reduce_130(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 318) + def _reduce_131(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 319) + def _reduce_132(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 320) + def _reduce_133(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 323) + def _reduce_134(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 325) + def _reduce_135(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 326) + def _reduce_136(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 327) + def _reduce_137(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 329) + def _reduce_138(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 330) + def _reduce_139(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 331) + def _reduce_140(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 333) + def _reduce_141(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 334) + def _reduce_142(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 335) + def _reduce_143(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 337) + def _reduce_144(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 338) + def _reduce_145(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 339) + def _reduce_146(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 341) + def _reduce_147(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 342) + def _reduce_148(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 343) + def _reduce_149(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 345) + def _reduce_150(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 346) + def _reduce_151(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 347) + def _reduce_152(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 349) + def _reduce_153(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 350) + def _reduce_154(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 351) + def _reduce_155(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 353) + def _reduce_156(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 354) + def _reduce_157(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 355) + def _reduce_158(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 356) + def _reduce_159(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 357) + def _reduce_160(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 358) + def _reduce_161(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 360) + def _reduce_162(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 361) + def _reduce_163(val, _values, result) + result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 365) + def _reduce_164(val, _values, result) + result = make_node(val) { |v| Riml::UnaryOperatorNode.new(val[0], [val[1]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 366) + def _reduce_165(val, _values, result) + result = make_node(val) { |v| Riml::UnaryOperatorNode.new(val[0], [val[1]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 367) + def _reduce_166(val, _values, result) + result = make_node(val) { |v| Riml::UnaryOperatorNode.new(val[0], [val[1]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 372) + def _reduce_167(val, _values, result) + result = make_node(val) { |v| Riml::AssignNode.new(v[1][0], v[1][1], v[1][2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 373) + def _reduce_168(val, _values, result) + result = make_node(val) { |v| Riml::AssignNode.new(v[0][0], v[0][1], v[0][2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 377) + def _reduce_169(val, _values, result) + result = make_node(val) { |v| Riml::MultiAssignNode.new([v[0], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 378) + def _reduce_170(val, _values, result) + val[0].assigns << val[2]; result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 383) + def _reduce_171(val, _values, result) + result = [val[1], val[0], val[2]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 384) + def _reduce_172(val, _values, result) + result = [val[1], val[0], val[2]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 385) + def _reduce_173(val, _values, result) + result = [val[1], val[0], val[2]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 386) + def _reduce_174(val, _values, result) + result = [val[1], val[0], val[2]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 390) + def _reduce_175(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 391) + def _reduce_176(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 392) + def _reduce_177(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 393) + def _reduce_178(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 394) + def _reduce_179(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 399) + def _reduce_180(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 400) + def _reduce_181(val, _values, result) + result = make_node(val) { |v| Riml::GetSpecialVariableNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 401) + def _reduce_182(val, _values, result) + result = make_node(val) { |v| Riml::GetVariableByScopeAndDictNameNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 405) + def _reduce_183(val, _values, result) + result = make_node(val) { |v| Riml::GetVariableNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 409) + def _reduce_184(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 410) + def _reduce_185(val, _values, result) + result = make_node(val) { |v| Riml::GetCurlyBraceNameNode.new(v[0], v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 414) + def _reduce_186(val, _values, result) + result = make_node(val) { |v| Riml::UnletVariableNode.new('!', [ v[1] ]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 415) + def _reduce_187(val, _values, result) + result = make_node(val) { |v| Riml::UnletVariableNode.new('!', [ v[1] ]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 416) + def _reduce_188(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 420) + def _reduce_189(val, _values, result) + result = make_node(val) { |v| Riml::CurlyBraceVariable.new([ v[0] ]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 421) + def _reduce_190(val, _values, result) + result = make_node(val) { |v| Riml::CurlyBraceVariable.new([ Riml::CurlyBracePart.new(v[0]), v[1] ]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 422) + def _reduce_191(val, _values, result) + result = val[0] << make_node(val) { |v| Riml::CurlyBracePart.new(v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 423) + def _reduce_192(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 427) + def _reduce_193(val, _values, result) + result = make_node(val) { |v| Riml::CurlyBracePart.new(v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 428) + def _reduce_194(val, _values, result) + result = make_node(val) { |v| Riml::CurlyBracePart.new([v[1], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 429) + def _reduce_195(val, _values, result) + result = make_node(val) { |v| Riml::CurlyBracePart.new([v[1], v[2]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 435) + def _reduce_196(val, _values, result) + result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], [], v[3], v[4]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 436) + def _reduce_197(val, _values, result) + result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], v[4], v[6], v[7]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 437) + def _reduce_198(val, _values, result) + result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], [v[4]], v[6], v[7]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 438) + def _reduce_199(val, _values, result) + result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], v[4] << v[6], v[8], v[9]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 442) + def _reduce_200(val, _values, result) + result = "DefNode" + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 443) + def _reduce_201(val, _values, result) + result = "DefNode" + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 444) + def _reduce_202(val, _values, result) + result = "DefMethodNode" + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 449) + def _reduce_203(val, _values, result) + result = make_node(val) { |v| Riml::GetCurlyBraceNameNode.new('', v[0]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 450) + def _reduce_204(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 455) + def _reduce_205(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 456) + def _reduce_206(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 457) + def _reduce_207(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 461) + def _reduce_208(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 462) + def _reduce_209(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 463) + def _reduce_210(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 464) + def _reduce_211(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 465) + def _reduce_212(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 469) + def _reduce_213(val, _values, result) + result = make_node(val) { |v| Riml::DefaultParamNode.new(v[0], v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 473) + def _reduce_214(val, _values, result) + result = make_node(val) { |v| Riml::ReturnNode.new(v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 474) + def _reduce_215(val, _values, result) + result = make_node(val) { |v| Riml::IfNode.new(v[3], Nodes.new([ReturnNode.new(v[1])])) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 475) + def _reduce_216(val, _values, result) + result = make_node(val) { |v| Riml::UnlessNode.new(v[3], Nodes.new([ReturnNode.new(v[1])])) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 479) + def _reduce_217(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 480) + def _reduce_218(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 484) + def _reduce_219(val, _values, result) + result = make_node(val) { |_| Riml::FinishNode.new } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 489) + def _reduce_220(val, _values, result) + result = make_node(val) { |v| Riml::IfNode.new(v[1], v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 490) + def _reduce_221(val, _values, result) + result = make_node(val) { |v| Riml::IfNode.new(v[1], Riml::Nodes.new([v[3]])) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 491) + def _reduce_222(val, _values, result) + result = make_node(val) { |v| Riml::IfNode.new(v[2], Riml::Nodes.new([v[0]])) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 495) + def _reduce_223(val, _values, result) + result = make_node(val) { |v| Riml::UnlessNode.new(v[1], v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 496) + def _reduce_224(val, _values, result) + result = make_node(val) { |v| Riml::UnlessNode.new(v[1], Riml::Nodes.new([v[3]])) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 497) + def _reduce_225(val, _values, result) + result = make_node(val) { |v| Riml::UnlessNode.new(v[2], Riml::Nodes.new([v[0]])) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 501) + def _reduce_226(val, _values, result) + result = make_node(val) { |v| Riml::TernaryOperatorNode.new([v[0], v[2], v[4]]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 505) + def _reduce_227(val, _values, result) + result = make_node(val) { |v| Riml::WhileNode.new(v[1], v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 509) + def _reduce_228(val, _values, result) + result = make_node(val) { |_| Riml::BreakNode.new } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 510) + def _reduce_229(val, _values, result) + result = make_node(val) { |_| Riml::ContinueNode.new } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 514) + def _reduce_230(val, _values, result) + result = make_node(val) { |v| Riml::UntilNode.new(v[1], v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 518) + def _reduce_231(val, _values, result) + result = make_node(val) { |v| Riml::ForNode.new(v[1], v[3], v[4]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 519) + def _reduce_232(val, _values, result) + result = make_node(val) { |v| Riml::ForNode.new(v[1], v[3], v[4]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 520) + def _reduce_233(val, _values, result) + result = make_node(val) { |v| Riml::ForNode.new(v[1], v[3], v[4]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 524) + def _reduce_234(val, _values, result) + result = make_node(val) { |v| Riml::TryNode.new(v[1], nil, nil) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 525) + def _reduce_235(val, _values, result) + result = make_node(val) { |v| Riml::TryNode.new(v[1], v[2], nil) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 526) + def _reduce_236(val, _values, result) + result = make_node(val) { |v| Riml::TryNode.new(v[1], v[2], v[4]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 530) + def _reduce_237(val, _values, result) + result = nil + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 531) + def _reduce_238(val, _values, result) + result = [ make_node(val) { |v| Riml::CatchNode.new(nil, v[1]) } ] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 532) + def _reduce_239(val, _values, result) + result = [ make_node(val) { |v| Riml::CatchNode.new(v[1], v[2]) } ] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 533) + def _reduce_240(val, _values, result) + result = val[0] << make_node(val) { |v| Riml::CatchNode.new(nil, v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 534) + def _reduce_241(val, _values, result) + result = val[0] << make_node(val) { |v| Riml::CatchNode.new(v[2], v[3]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 538) + def _reduce_242(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 539) + def _reduce_243(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 546) + def _reduce_244(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 547) + def _reduce_245(val, _values, result) + result = make_node(val) { |_| Riml::Nodes.new([]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 551) + def _reduce_246(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 552) + def _reduce_247(val, _values, result) + result = val[1] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 553) + def _reduce_248(val, _values, result) + result = val[1] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 554) + def _reduce_249(val, _values, result) + result = val[1] << val[2] << val[3] + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 558) + def _reduce_250(val, _values, result) + result = make_node(val) { |v| Riml::ElseNode.new(v[2]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 562) + def _reduce_251(val, _values, result) + result = make_node(val) { |v| Riml::Nodes.new([Riml::ElseifNode.new(v[1], v[3])]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 563) + def _reduce_252(val, _values, result) + result = val[0] << make_node(val) { |v| Riml::ElseifNode.new(v[2], v[4]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 567) + def _reduce_253(val, _values, result) + result = make_node(val) { |v| Riml::ClassDefinitionNode.new(v[1], v[2], nil, v[3]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 568) + def _reduce_254(val, _values, result) + result = make_node(val) { |v| Riml::ClassDefinitionNode.new(v[1], v[2], (v[4] || ClassDefinitionNode::DEFAULT_SCOPE_MODIFIER) + v[5], v[6]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 572) + def _reduce_255(val, _values, result) + result = make_node(val) { |v| Riml::ObjectInstantiationNode.new(v[1]) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 576) + def _reduce_256(val, _values, result) + result = make_node(val) { |v| Riml::SuperNode.new(v[2], true) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 577) + def _reduce_257(val, _values, result) + result = make_node(val) { |_| Riml::SuperNode.new([], false) } + result + end +.,., + +module_eval(<<'.,.,', 'riml.y', 581) + def _reduce_258(val, _values, result) + result = make_node(val) { |v| Riml::ExLiteralNode.new(v[0]) } + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module Riml diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/ruby18 b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/ruby18 new file mode 100644 index 000000000000..a21fa611a51c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/ruby18 @@ -0,0 +1,6344 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +module Parser + class Ruby18 < Racc::Parser + +module_eval(<<'...end ruby18.y/module_eval...', 'ruby18.y', 1936) + + def version + 18 + end + + def default_encoding + Encoding::BINARY if defined? Encoding + end +...end ruby18.y/module_eval... +##### State transition tables begin ### + +clist = [ +'-480,195,196,195,196,489,814,-480,-480,-480,511,578,578,-480,-480,-80', +'-480,-429,579,579,489,72,531,-87,558,-480,99,489,-86,73,95,98,395,195', +'196,-480,-480,-82,-480,-480,-480,-480,-480,489,489,558,495,-84,496,-83', +'-81,463,659,658,662,661,186,99,557,558,291,291,98,-80,-480,-480,-480', +'-480,-480,-480,-480,-480,-480,-480,-480,-480,-480,-480,-87,557,-480', +'-480,-480,259,546,530,722,-74,-480,-61,99,-480,291,557,621,98,-480,-86', +'-480,-85,-480,-480,-480,-480,-480,-480,-480,-277,-480,-480,-480,187', +'-476,510,-277,-277,-277,99,-72,488,-277,-277,98,-277,-480,-480,-79,-75', +'-69,-480,-83,-78,99,99,488,621,-76,98,98,99,-74,488,-277,-277,98,-277', +'-277,-277,-277,-277,-76,-74,-75,-73,431,99,99,488,488,621,98,98,-477', +'259,502,195,196,258,503,-74,690,-277,-277,-277,-277,-277,-277,-277,-277', +'-277,-277,-277,-277,-277,-277,558,259,-277,-277,-277,-74,549,99,-74', +'620,-277,713,98,-277,691,-76,188,-77,-277,521,-277,521,-277,-277,-277', +'-277,-277,-277,-277,-272,-277,-82,-277,-76,557,189,-272,-272,-272,99', +'254,-272,-272,-272,98,-272,-277,-277,99,-77,620,-277,-85,98,-76,-272', +'-272,-76,477,190,-84,476,258,254,-272,-272,768,-272,-272,-272,-272,-272', +'99,194,620,477,234,98,479,521,523,522,523,522,519,258,477,358,282,482', +'673,360,359,-272,-272,-272,-272,-272,-272,-272,-272,-272,-272,-272,-272', +'-272,-272,521,192,-272,-272,-272,-81,283,-272,193,-79,-272,521,-87,-272', +'-272,291,-272,191,-272,349,-272,215,-272,-272,-272,-272,-272,-272,-272', +'-226,-272,361,-272,523,522,524,-226,-226,-226,814,394,-226,-226,-226', +'521,-226,-272,-272,-272,-272,396,-272,-473,212,606,-226,496,214,213', +'210,211,523,522,526,-226,-226,397,-226,-226,-226,-226,-226,523,522,527', +'251,477,426,-474,479,-480,-480,252,-319,-226,659,658,662,661,428,-319', +'-226,-226,-226,-417,-476,-226,-226,-226,-319,-226,-417,-417,431,-226', +'523,522,532,-429,-417,-226,-226,284,285,-473,436,254,-226,-417,-226', +'-226,-60,-226,-226,-226,-226,-226,463,-421,451,-480,-480,541,-477,542', +'-421,-473,-480,-480,-226,-474,680,-476,-476,-421,-476,-480,-480,452', +'215,453,-72,-476,-226,-80,-226,215,-476,-226,-226,391,-476,-474,99,-480', +'-480,-226,392,98,99,-78,254,-226,-86,98,-74,393,-76,-82,-476,-84,212', +'-428,-477,-73,214,213,-81,212,-428,-477,459,214,213,-226,-477,461,462', +'-428,-477,195,196,-421,-476,-476,-476,263,-476,-226,-421,-226,-476,-476', +'-226,291,-480,-476,-477,-476,-476,-476,-476,-476,-476,-476,195,196,734', +'606,-476,-476,-476,-476,-476,-476,-476,-427,215,254,-426,-425,662,661', +'-427,464,-476,-426,-425,-476,-476,-476,-476,-476,-476,-476,-476,-476', +'-476,465,-476,-476,-422,-476,-476,-476,-480,734,606,-422,212,215,-423', +'-480,214,213,210,211,-476,-423,457,471,-480,-424,472,-476,692,458,-476', +'-476,-424,-476,-476,291,481,-476,456,-476,484,-476,-480,-476,351,516', +'-271,466,498,500,501,-476,517,-271,467,499,-476,-476,-476,-476,-476', +'-476,-271,393,497,-476,-476,-477,-477,-477,535,-477,536,538,-83,-477', +'-477,-259,540,254,-477,215,-477,-477,-477,-477,-477,-477,-477,215,215', +'215,568,-477,-477,-477,-477,-477,-477,-477,667,668,575,669,93,94,291', +'580,234,-477,590,591,-477,-477,-477,-477,-477,-477,-477,-477,-477,-477', +'-69,-477,-477,592,-477,-477,-477,215,219,224,225,226,221,223,231,232', +'227,228,507,-497,-497,-278,469,229,230,505,-477,549,-278,-477,-477,606', +'-477,-477,506,291,-477,-278,-477,212,-477,218,-477,214,213,210,211,222', +'220,216,-477,217,616,496,624,-477,-477,-477,-477,-477,-477,672,-278', +'675,-477,-477,62,63,64,-278,51,436,436,-85,56,57,693,704,-278,60,431', +'58,59,61,23,24,65,66,431,243,707,708,22,28,27,88,87,89,90,715,717,17', +'721,254,254,215,537,215,41,724,-259,92,91,82,50,84,83,86,85,93,94,728', +'80,81,730,38,39,37,215,219,224,225,226,221,223,231,232,227,228,-277', +'208,209,-279,606,229,230,-277,200,738,-279,204,-477,739,52,53,-277,740', +'54,-279,743,212,745,218,40,214,213,210,211,222,220,216,18,217,749,753', +'755,79,72,74,75,76,77,758,759,760,73,78,761,99,233,763,-215,-277,98', +'62,63,64,7,51,-277,-260,769,56,57,-477,777,778,60,-277,58,59,61,23,24', +'65,66,568,568,254,254,22,28,27,88,87,89,90,234,568,17,101,102,103,104', +'105,6,41,8,9,92,91,82,50,84,83,86,85,93,94,790,80,81,791,38,39,37,215', +'219,224,225,226,221,223,231,232,227,228,-428,-497,-497,823,792,229,230', +'-428,36,797,824,30,799,805,52,53,-428,807,54,822,32,212,291,218,40,214', +'213,210,211,222,220,216,18,217,818,825,826,79,72,74,75,76,77,827,-271', +'829,73,78,62,63,64,-271,51,830,351,-278,56,57,832,835,-271,60,-278,58', +'59,61,246,247,65,66,839,-278,840,846,245,275,279,88,87,89,90,101,102', +'103,104,105,847,848,758,758,276,759,861,92,91,82,50,84,83,86,85,93,94', +'568,80,81,215,568,655,280,653,652,651,654,-277,471,874,-279,875,876', +'880,-277,229,230,-279,883,-477,758,885,772,-277,886,204,-279,568,52', +'53,568,212,54,218,568,214,213,210,211,645,,216,,217,,,,659,658,662,661', +'79,72,74,75,76,77,,,,73,78,,62,63,64,775,51,,,,56,57,,,,60,,58,59,61', +'246,247,65,66,,,,,245,275,279,88,87,89,90,101,102,103,104,105,,,537', +',276,,,92,91,82,50,84,83,86,85,93,94,,80,81,,,,280,215,219,224,225,226', +'221,223,231,232,227,228,,208,209,,,229,230,,772,,,204,,,52,53,,,54,', +',212,,218,,214,213,210,211,222,220,216,,217,,,,79,72,74,75,76,77,,,', +'73,78,,,233,,855,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85', +'93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,', +',,40,655,,653,652,651,654,,18,,,,,79,72,74,75,76,77,,,,73,78,5,62,63', +'64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,659,658,662,661,22,28,27', +'88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81', +',38,39,37,,,,,,,,,,,,,,,,,,,,36,,,265,,,52,53,,,54,,32,,,,40,655,,653', +'652,651,654,,18,,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56', +'57,,,,60,,58,59,61,23,24,65,66,659,658,662,661,22,28,27,88,87,89,90', +',,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,', +',,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,655,,653,652,651,654', +',18,,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,645', +'58,59,61,23,24,65,66,659,658,662,661,22,28,27,88,87,89,90,,,17,,,,,', +'6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,215,-497,-497', +'-497,-497,221,223,,,-497,-497,,,,,,229,230,,36,,,30,,,52,53,,,54,,32', +'212,,218,40,214,213,210,211,222,220,216,18,217,,,,79,72,74,75,76,77', +',,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22', +'28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,', +'80,81,,38,39,37,215,,,,,,,,,,,,,,,,229,230,,36,,,30,,,52,53,,,54,,32', +'212,,218,40,214,213,210,211,,,216,18,217,,,,79,72,74,75,76,77,,,,73', +'78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27', +'88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81', +',38,39,37,215,,,,,,,,,,,,,,,,229,230,,36,,,30,,,52,53,,,54,,32,212,', +'218,40,214,213,210,211,,,216,18,217,,,,79,72,74,75,76,77,,,,73,78,5', +'62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87', +'89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,215,,,,,,,,,,,,,,,,229,230,,36,,,265,,,52,53,,,54,,32,212,,218,40', +'214,213,210,211,,,216,18,217,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64', +'7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,', +',17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,215', +'-497,-497,-497,-497,221,223,,,-497,-497,,,,,,229,230,,36,,,265,,,52', +'53,,,54,,32,212,,218,40,214,213,210,211,222,220,216,18,217,,,,79,72', +'74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24', +'65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,215,-497,-497,-497,-497,221,223,,,-497', +'-497,,,,,,229,230,,36,,,30,,,52,53,,,54,,32,212,,218,40,214,213,210', +'211,222,220,216,18,217,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7,51', +',,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,', +',,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,215,-497', +'-497,-497,-497,221,223,,,-497,-497,,,,,,229,230,,36,,,30,,,52,53,,,54', +',32,212,,218,40,214,213,210,211,222,220,216,18,217,,,,79,72,74,75,76', +'77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,', +',22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93', +'94,,80,81,,38,39,37,215,-497,-497,-497,-497,221,223,,,-497,-497,,,,', +',229,230,,36,,,30,,,52,53,,,54,,32,212,,218,40,214,213,210,211,222,220', +'216,18,217,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,', +',60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8', +'9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,215,-497,-497,-497', +'-497,221,223,,,-497,-497,,,,,,229,230,,36,,,30,,,52,53,,,54,,32,212', +',218,40,214,213,210,211,222,220,216,18,217,,,,79,72,74,75,76,77,,,,73', +'78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27', +'88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81', +',38,39,37,215,219,224,225,226,221,223,,,227,228,,,,,,229,230,,36,,,30', +',,52,53,,,54,,32,212,,218,40,214,213,210,211,222,220,216,18,217,,,,79', +'72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23', +'24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84', +'83,86,85,93,94,,80,81,,38,39,37,215,219,224,225,226,221,223,231,,227', +'228,,,,,,229,230,,36,,,30,,,52,53,,,54,,32,212,,218,40,214,213,210,211', +'222,220,216,18,217,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,', +'56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,', +',6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,215,,,,,,,', +',,,,,,,,229,230,,36,,,30,,,52,53,,,54,,32,212,,218,40,214,213,210,211', +',,,18,,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60', +',58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,215,,,,,,,,,,,,,,,,229,230', +',36,,,30,,,52,53,,,54,,32,212,,218,40,214,213,210,211,,,,18,,,,,79,72', +'74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24', +'65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,215,,,,,,,,,,,,,,,,229,230,,36,,,30,,,52', +'53,,,54,,32,212,,,40,214,213,210,211,,,,18,,,,,79,72,74,75,76,77,,,', +'73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28', +'27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80', +'81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,', +',,18,,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,', +'58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,', +'30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,5', +'62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87', +'89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,79', +'72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23', +'24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84', +'83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,', +',54,,32,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7', +'51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17', +',,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,', +',,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,79,72,74,75', +'76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85', +'93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,', +',,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56', +'57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6', +'41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,', +',,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77', +',,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22', +'28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,', +'80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,', +',,,,,18,,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60', +',58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,', +'30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,5', +'62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87', +'89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,79', +'72,74,75,76,77,,,,73,78,5,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23', +'24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84', +'83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,', +',54,,32,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,5,62,63,64,7', +'51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17', +',,,,,6,41,8,9,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,', +',,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40,,,,,,,,18,,,,,79,72,74,75', +'76,77,,,,73,78,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,', +',,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85,93', +'94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,,,,40', +',,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,153,164,154,177,150,170,160', +'159,180,181,175,158,157,152,178,182,183,162,151,165,169,171,163,156', +',,172,179,174,173,166,176,161,149,168,167,,,,,,148,155,146,147,144,145', +'109,111,108,,110,,,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,', +'141,142,129,130,,,,,,,,,,,,,,134,133,,120,138,136,135,131,132,127,125', +'118,,119,,,143,79,,,,,,,,,,78,153,164,154,177,150,170,160,159,180,181', +'175,158,157,152,178,182,183,162,151,165,169,171,163,156,,,172,179,174', +'173,166,176,161,149,168,167,,,,,,148,155,146,147,144,145,109,111,,,110', +',,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,,141,142,129,130,', +',,,,,,,,,,,,134,133,,120,138,136,135,131,132,127,125,118,,119,,,143', +'79,,,62,63,64,,51,,,78,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27', +'88,87,89,90,,,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38', +'39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18,,', +',,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23', +'24,65,66,,,,,22,28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86', +'85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54', +',,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56', +'57,,,,60,,58,59,61,246,247,65,66,,,,,245,28,27,88,87,89,90,,,,,,,,,', +'41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,', +',,,200,,,204,,,52,53,,,54,,241,,243,,40,,,,,,,,207,,,,,79,72,74,75,76', +'77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,', +'245,28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80', +'81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,241,,243,,40', +',,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,28,27,88,87,89,90,,,,,,,,,,41,,,92,91', +'82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204', +',,52,53,,,54,,241,,243,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'-249,-249,-249,,-249,,,,-249,-249,,,,-249,,-249,-249,-249,-249,-249', +'-249,-249,,,,,-249,-249,-249,-249,-249,-249,-249,,,,,,,,,,-249,,,-249', +'-249,-249,-249,-249,-249,-249,-249,-249,-249,,-249,-249,,-249,-249,-249', +',,,,,,,,,,,,,,,,,,,-249,,,-249,254,,-249,-249,,,-249,,-249,,-249,,-249', +',,,,,,,-249,,,,,-249,-249,-249,-249,-249,-249,,,,-249,-249,-249,-249', +'-249,,-249,,,,-249,-249,,,,-249,,-249,-249,-249,-249,-249,-249,-249', +',,,,-249,-249,-249,-249,-249,-249,-249,,,,,,,,,,-249,,,-249,-249,-249', +'-249,-249,-249,-249,-249,-249,-249,,-249,-249,,-249,-249,-249,,,,,,', +',,,,,,,,,,,,,-249,,,-249,263,,-249,-249,,,-249,,-249,,-249,,-249,,,', +',,,,-249,,,,,-249,-249,-249,-249,-249,-249,,,,-249,-249,62,63,64,,51', +',,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,', +',,,,,,,,276,,,92,91,82,50,84,83,86,85,93,94,,80,81,,,,280,,215,219,224', +'225,226,221,223,231,232,227,228,,208,209,,,229,230,273,,,270,,,52,53', +',,54,,269,,212,,218,,214,213,210,211,222,220,216,,217,,,79,72,74,75', +'76,77,,,,73,78,62,63,64,233,51,568,,,56,57,,,,60,,58,59,61,246,247,65', +'66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92,91,82,50,84,83,86,85', +'93,94,,80,81,,,,280,,215,219,224,225,226,221,223,231,232,227,228,,208', +'209,,,229,230,273,,,204,,,52,53,,,54,,,,212,,218,,214,213,210,211,222', +'220,216,,217,,,79,72,74,75,76,77,,,,73,78,62,63,64,233,51,,,,56,57,', +',,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41', +',,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,', +'200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73', +'78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279', +'88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,', +'54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,', +',56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,', +',,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,', +',,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77', +',,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245', +'28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81', +',38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,299,,,,40,,,,,', +',,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58', +'59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91', +'82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204', +',,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90', +',,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,', +',,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,79,72,74', +'75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,88,87,89,90,,,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93', +'94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40', +',,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,,,280,,215,219,224,225,226,221,223', +'231,232,227,228,,208,209,,,229,230,315,,,30,,,52,53,,,54,,32,,212,,218', +',214,213,210,211,222,220,216,,217,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,233,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88', +'87,89,90,,,,,,,,,,276,,,92,91,320,50,84,83,321,85,93,94,,80,81,,,,280', +',215,219,224,225,226,221,223,231,232,227,228,,208,209,,327,229,230,322', +',,204,,,52,53,,,54,,,,212,,218,,214,213,210,211,222,220,216,,217,,,79', +'72,74,75,76,77,,,,73,78,62,63,64,233,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92,91,320,50,84', +'83,321,85,93,94,,80,81,,,,280,,215,219,224,225,226,221,223,231,232,227', +'228,,208,209,,,229,230,322,,,204,,,52,53,,,54,,,,212,,218,,214,213,210', +'211,222,220,216,,217,,,79,72,74,75,76,77,,,,73,78,-473,-473,-473,233', +'-473,,,,-473,-473,,,,-473,,-473,-473,-473,-473,-473,-473,-473,,-473', +',,-473,-473,-473,-473,-473,-473,-473,,,,,,,,,,-473,,,-473,-473,-473', +'-473,-473,-473,-473,-473,-473,-473,,-473,-473,,-473,-473,-473,,,,,,', +',,,,,,,,,,,,,-473,,,-473,-473,,-473,-473,,,-473,,-473,,-473,,-473,,', +',,,,,-473,,-473,,,-473,-473,-473,-473,-473,-473,,,,-473,-473,-474,-474', +'-474,,-474,,,,-474,-474,,,,-474,,-474,-474,-474,-474,-474,-474,-474', +',-474,,,-474,-474,-474,-474,-474,-474,-474,,,,,,,,,,-474,,,-474,-474', +'-474,-474,-474,-474,-474,-474,-474,-474,,-474,-474,,-474,-474,-474,', +',,,,,,,,,,,,,,,,,,-474,,,-474,-474,,-474,-474,,,-474,,-474,,-474,,-474', +',,,,,,,-474,,-474,,,-474,-474,-474,-474,-474,-474,,,,-474,-474,62,63', +'64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90', +',,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,', +',,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,79,72,74', +'75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,88,87,89,90,,,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93', +'94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40', +',,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,,41,,,92,91', +'82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204', +',,52,53,,,54,,,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90', +',,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,', +',,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,79,72,74', +'75,76,77,,,,73,78,62,63,64,7,51,,,,56,57,,,,60,,58,59,61,23,24,65,66', +',,,,22,28,27,88,87,89,90,,,17,,,,,,6,41,8,9,92,91,82,50,84,83,86,85', +'93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,36,,,30,,,52,53,,,54,,32,', +',,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57', +',,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,369,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73', +'78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88', +'87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37', +',,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,369,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23', +'24,65,66,,,,,22,28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86', +'85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54', +',,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56', +'57,,,,60,,58,59,61,246,247,65,66,,,,,245,28,27,88,87,89,90,,,,,,,,,', +'41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,', +',,,200,,,204,,,52,53,,,54,,299,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77', +',,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28', +'27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38', +'39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,', +',,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61', +'23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,,41,,,92,91,82,50,84', +'83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53', +',,54,,,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,', +',,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,', +',,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,', +',,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77', +',,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245', +'275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80', +'81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,', +',,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58', +'59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91', +'82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204', +',,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87', +'89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,', +',,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72', +'74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65', +'66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85', +'93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,', +',,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57', +',,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41', +',,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,', +'200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73', +'78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279', +'88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,', +'54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,', +',56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,', +',,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,', +',,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76', +'77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,', +'245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94', +',80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,', +',,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279', +'88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,', +'54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,', +',56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,', +',,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,', +',,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76', +'77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,', +'245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94', +',80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,', +',,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279', +'88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,', +'54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,', +',56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,', +',,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,', +',,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76', +'77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,', +'245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94', +',80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,', +',,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279', +'88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,', +'54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,', +',56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,', +',,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,', +',,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76', +'77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,', +'245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94', +',80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,', +',,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279', +'88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,', +'54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,', +',56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,', +',,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,', +',,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76', +'77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,', +'245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94', +',80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,', +',,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,28,27,88,87,89,90,,,,,,,,,,41,,,92,91', +'82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204', +',,52,53,,,54,,241,,243,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,28,27,88', +'87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37', +',,,,,,,,,,,,,,,,,,,200,,,204,,,445,53,,,54,,241,,243,,40,,,,,,,,207', +',,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61', +'246,247,65,66,,,,,245,28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84', +'83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,449,52', +'53,,,54,,241,,243,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87', +'89,90,,,,,,,,,,276,,,92,91,82,50,84,83,86,85,93,94,,80,81,,,,280,,215', +'219,224,225,226,221,223,231,232,227,228,,208,209,,,229,230,273,,,204', +',,52,53,,,54,,,,212,,218,,214,213,210,211,222,220,216,,217,,,79,72,74', +'75,76,77,,,,73,78,62,63,64,233,51,,,,56,57,,,,60,,58,59,61,246,247,65', +'66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85', +'93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,469,,52,53,,,54', +',,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56', +'57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,', +',,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,', +',,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77', +',,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28', +'27,88,87,89,90,,,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81', +',38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18', +',,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61', +'23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,,41,,,92,91,82,50,84', +'83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53', +',,54,,,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,', +',,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,', +',,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,', +',,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77', +',,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28', +'27,88,87,89,90,,,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81', +',38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18', +',,,,79,72,74,75,76,77,,,,73,78,153,164,154,177,150,170,160,159,180,181', +'175,158,157,152,178,182,183,162,151,165,169,171,163,156,,,172,179,174', +'173,166,176,161,149,168,167,,,,,,148,155,146,147,144,145,109,111,,,110', +',,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,,141,142,129,130,', +',,,,,,,,,,,,134,133,,120,138,136,135,131,132,127,125,118,,119,,,143', +'79,,,62,63,64,,51,,,78,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275', +'279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,', +'38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207', +',,,,79,72,74,75,76,77,,,,73,78,-249,-249,-249,,-249,,,,-249,-249,,,', +'-249,,-249,-249,-249,-249,-249,-249,-249,,,,,-249,-249,-249,-249,-249', +'-249,-249,,,,,,,,,,-249,,,-249,-249,-249,-249,-249,-249,-249,-249,-249', +'-249,,-249,-249,,-249,-249,-249,,,,,,,,,,,,,,,,,,,,-249,,,-249,254,', +'-249,-249,,,-249,,-249,,-249,,-249,,,,,,,,-249,,,,,-249,-249,-249,-249', +'-249,-249,,,,-249,-249,-478,-478,-478,,-478,,,,-478,-478,,,,-478,,-478', +'-478,-478,-478,-478,-478,-478,,,,,-478,-478,-478,-478,-478,-478,-478', +',,,,,,,,,-478,,,-478,-478,-478,-478,-478,-478,-478,-478,-478,-478,,-478', +'-478,,-478,-478,-478,,,,,,,,,,,,,,,,,,,,-478,,,-478,-478,,-478,-478', +',,-478,,-478,,-478,,-478,,,,,,,,-478,,,,,-478,-478,-478,-478,-478,-478', +',,,-478,-478,-479,-479,-479,,-479,,,,-479,-479,,,,-479,,-479,-479,-479', +'-479,-479,-479,-479,,,,,-479,-479,-479,-479,-479,-479,-479,,,,,,,,,', +'-479,,,-479,-479,-479,-479,-479,-479,-479,-479,-479,-479,,-479,-479', +',-479,-479,-479,,,,,,,,,,,,,,,,,,,,-479,,,-479,-479,,-479,-479,,,-479', +',-479,,-479,,-479,,,,,,,,-479,,,,,-479,-479,-479,-479,-479,-479,,,,-479', +'-479,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,28', +'27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38', +'39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,299,,,,40,,,,,,,,207', +',,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61', +'246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50', +'84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52', +'53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,', +'51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90', +',,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,', +',,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75', +'76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,', +',,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93', +'94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40', +',,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,560,,243,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,', +'73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275', +'279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,', +'38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,564,,243,,40,,,', +',,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,', +'58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87', +'89,90,,,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37', +',,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,584,,243,,40,,,,,,,,18,,', +',,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,', +'54,,299,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51', +',,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,', +',,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,', +',,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75', +'76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,', +',,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93', +'94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40', +',,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87', +'89,90,,,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37', +',,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,79,72', +'74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65', +'66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85', +'93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,369', +',,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57', +',,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41', +',,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,', +'200,,,204,,,52,53,,,54,,612,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,', +',,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245', +'275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80', +'81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,', +',,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58', +'59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91', +'82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204', +',,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87', +'89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,', +',,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,628,,,,40,,,,,,,,207,,,,,79', +'72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247', +'65,66,,,,,245,28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85', +'93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,299', +',,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57', +',,,60,,58,59,61,246,247,65,66,,,,,245,28,27,88,87,89,90,,,,,,,,,,41', +',,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,', +'200,,,204,,,52,53,,,54,,299,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,', +',,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28', +'27,88,87,89,90,,,17,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81', +',38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18', +',,,,79,72,74,75,76,77,,,,73,78,153,164,154,177,150,170,160,159,180,181', +'175,158,157,152,178,182,183,162,151,165,169,171,163,156,,,172,179,174', +'173,166,176,161,149,168,167,,,,,,148,155,146,147,144,145,109,111,,,110', +',,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,,141,142,129,130,', +',,,,,,,,,,,,134,133,,120,138,136,135,131,132,127,125,118,,119,,,143', +'79,,,62,63,64,,51,,,78,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275', +'279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,', +'38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207', +',,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61', +'246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50', +'84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52', +'53,,,54,,679,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64', +',51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,', +',,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,', +',,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75', +'76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,', +',22,28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80', +'81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,', +',,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58', +'59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50', +'84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52', +'53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,', +'51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90', +',,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,', +',,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75', +'76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,', +',,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93', +'94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40', +',,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,,,280,,,,,,,,,,,,,,,,,,,,273,,,270', +',,52,53,,,54,,697,,698,,,,,,,,,699,,,,,,79,72,74,75,76,77,,,,73,78,62', +'63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88', +'87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37', +',,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79', +'72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247', +'65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86', +'85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54', +',,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56', +'57,,,,60,,58,59,61,246,247,65,66,,,,,245,28,27,88,87,89,90,,,,,,,,,', +'41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,', +',,,200,,,204,,,52,53,,,54,,560,,243,,40,,,,,,,,207,,,,,79,72,74,75,76', +'77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,', +'245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94', +',80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,', +',,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279', +'88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23', +'24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,,,,,41,,,92,91,82,50,84,83', +'86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,', +'54,,,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,', +'56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,', +',,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,', +',,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76', +'77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,23,24,65,66,,,,,22', +'28,27,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81', +',38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207', +',,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61', +'246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50', +'84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52', +'53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,', +'51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90', +',,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,', +',,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75', +'76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,', +',,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93', +'94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40', +',,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,,,280,,215,219,224,225,226,221,223', +'231,232,227,228,,208,209,,,229,230,772,,,204,,,52,53,,,54,,,,212,,218', +',214,213,210,211,222,220,216,,217,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,233,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88', +'87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37', +',,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,780,,243,,40,,,,,,,,207,', +',,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61', +'246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50', +'84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52', +'53,,,54,,786,,243,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87', +'89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,', +',,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,788,,243,,40,,,,,,,,207,,', +',,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92,91,82,50,84', +'83,86,85,93,94,,80,81,,,,280,,215,219,224,225,226,221,223,231,232,227', +'228,,208,209,,,229,230,772,,,204,,,52,53,,,54,,,,212,,218,,214,213,210', +'211,222,220,216,,217,,,79,72,74,75,76,77,,,,73,78,62,63,64,233,51,,', +',56,57,,,,60,,58,59,61,23,24,65,66,,,,,22,28,27,88,87,89,90,,,17,,,', +',,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,', +',,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,18,,,,,79,72,74,75,76,77', +',,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245', +'275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80', +'81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,802,,,,40,,', +',,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279', +'88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92,91,82,50,84', +'83,86,85,93,94,,80,81,,,,280,,,,,,,,,,,,,,,,,,,,273,,,270,,,52,53,,', +'54,,821,,820,,,,,,,,,,,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,', +',,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,', +',,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,', +',,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75', +'76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,', +',,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93', +'94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40', +',,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78', +'62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279', +'88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39', +'37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,', +'79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246', +'247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92,91,82,50,84', +'83,86,85,93,94,,80,81,,,,280,,215,219,224,225,226,221,223,231,232,227', +'228,,208,209,,,229,230,772,,,204,,,52,53,,,54,,,,212,,218,,214,213,210', +'211,222,220,216,,217,,,79,72,74,75,76,77,,,,73,78,62,63,64,233,51,,', +',56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,28,27,88,87,89,90,,,,,', +',,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,', +',,,,,,,200,,,204,,,52,53,,,54,,299,,,,40,,,,,,,,207,,,,,79,72,74,75', +'76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,', +',,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92,91,82,50,84,83,86,85,93', +'94,,80,81,,,,280,,215,219,224,225,226,221,223,231,232,227,228,,208,209', +',,229,230,772,,,204,,,52,53,,,54,,,,212,,218,,214,213,210,211,222,220', +'216,,217,,,79,72,74,75,76,77,,,,73,78,62,63,64,233,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,', +',204,,,52,53,,,54,,864,,243,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,', +'73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275', +'279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,', +'38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,867,,243,,40,,,', +',,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,', +'58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,,,280,,215,219,224,225,226,221,223', +'231,232,227,228,,208,209,,,229,230,772,,,204,,,52,53,,,54,,,,212,,218', +',214,213,210,211,222,220,216,,217,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,233,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88', +'87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37', +',,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79', +'72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60,,58,59,61,246,247', +'65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86', +'85,93,94,,80,81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54', +',,,,,40,,,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56', +'57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,', +',,276,,,92,91,82,50,84,83,86,85,93,94,,80,81,,,,280,,215,219,224,225', +'226,221,223,231,232,227,228,,208,209,,,229,230,772,,,204,,,52,53,,,54', +',,,212,,218,,214,213,210,211,222,220,216,,217,,,79,72,74,75,76,77,,', +',73,78,62,63,64,233,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245', +'275,279,88,87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80', +'81,,38,39,37,,,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,889,,243,,40', +',,,,,,,207,,,,,79,72,74,75,76,77,,,,73,78,62,63,64,,51,,,,56,57,,,,60', +',58,59,61,246,247,65,66,,,,,245,275,279,88,87,89,90,,,,,,,,,,276,,,92', +'91,82,50,84,83,86,85,93,94,,80,81,,,,280,,215,219,224,225,226,221,223', +'231,232,227,228,,208,209,,,229,230,772,,,204,,,52,53,,,54,,,,212,,218', +',214,213,210,211,222,220,216,,217,,,79,72,74,75,76,77,,,,73,78,62,63', +'64,233,51,,,,56,57,,,,60,,58,59,61,246,247,65,66,,,,,245,275,279,88', +'87,89,90,,,,,,,,,,41,,,92,91,82,50,84,83,86,85,93,94,,80,81,,38,39,37', +',,,,,,,,,,,,,,,,,,,200,,,204,,,52,53,,,54,,,,,,40,,,,,,,,207,,,,,79', +'72,74,75,76,77,,,,73,78,153,164,154,177,150,170,160,159,180,181,175', +'158,157,152,178,182,183,162,151,165,169,171,163,156,,,172,179,174,336', +'335,337,334,149,168,167,,,,,,148,155,146,147,332,333,330,111,84,83,331', +'85,,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,,141,142,129,130', +',,,,,341,,,,,,,,134,133,,120,138,136,135,131,132,127,125,118,,119,,', +'143,153,164,154,177,150,170,160,159,180,181,175,158,157,152,178,182', +'183,162,151,165,169,171,163,156,,,172,179,174,173,166,176,161,149,168', +'167,,,,,,148,155,146,147,144,145,109,111,,,110,,,,,,,,139,140,,137,121', +'122,123,,126,128,,,124,,,,,141,142,129,130,,,,,,,,,,,,,,134,133,,120', +'138,136,135,131,132,127,125,118,,119,,,143,215,219,224,225,226,221,223', +'231,232,227,228,,208,209,,,229,230,,,,-215,,,,,,,,,,,212,,218,,214,213', +'210,211,222,220,216,,217,,,,,,,,376,379,,,377,,,,,233,,-215,139,140', +',137,121,122,123,,126,128,,,124,,,,,141,142,129,130,,,,,,,,,,,,,,134', +'133,,120,138,136,135,131,132,127,125,118,,119,381,385,143,,383,,,,,', +',,139,140,,137,121,122,123,,126,128,,,124,,,,,141,142,129,130,,,,,,', +',,,,,,,134,133,,120,138,136,135,131,132,127,125,118,,119,433,379,143', +',434,,,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,,141,142,129', +'130,,,,,,,,,,,,,,134,133,,120,138,136,135,131,132,127,125,118,,119,433', +'379,143,,434,,,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,,141', +'142,129,130,,,,,,,,,,,,,,134,133,,120,138,136,135,131,132,127,125,118', +',119,550,379,143,,551,,,,,,,,139,140,,137,121,122,123,,126,128,,,124', +',,,,141,142,129,130,,,,,,,,,,,,,,134,133,,120,138,136,135,131,132,127', +'125,118,,119,552,385,143,,553,,,,,,,,139,140,,137,121,122,123,,126,128', +',,124,,,,,141,142,129,130,,,,,,,,,,,,,,134,133,,120,138,136,135,131', +'132,127,125,118,,119,,,143,215,219,224,225,226,221,223,231,232,227,228', +',208,209,,,229,230,,,,,,,,,,,,,,,212,,218,,214,213,210,211,222,220,216', +',217,,,,,,,594,379,,,595,,,,,,233,556,139,140,,137,121,122,123,,126', +'128,,,124,,,,,141,142,129,130,,,,,,,,,,,,,,134,133,,120,138,136,135', +'131,132,127,125,118,,119,597,385,143,,598,,,,,,,,139,140,,137,121,122', +'123,,126,128,,,124,,,,,141,142,129,130,,,,,,,,,,,,,,134,133,,120,138', +'136,135,131,132,127,125,118,,119,550,379,143,,551,,,,,,,,139,140,,137', +'121,122,123,,126,128,,,124,,,,,141,142,129,130,,,,,,,,,,,,,,134,133', +',120,138,136,135,131,132,127,125,118,,119,552,385,143,,553,,,,,,,,139', +'140,,137,121,122,123,,126,128,,,124,,,,,141,142,129,130,,,,,,,,,,,,', +',134,133,,120,138,136,135,131,132,127,125,118,,119,630,379,143,,631', +',,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,,141,142,129,130,', +',,,,,,,,,,,,134,133,,120,138,136,135,131,132,127,125,118,,119,632,385', +'143,,633,,,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,,141,142', +'129,130,,,,,,,,,,,,,,134,133,,120,138,136,135,131,132,127,125,118,,119', +'635,385,143,,636,,,,,,,,139,140,,137,121,122,123,,126,128,,,124,,,,', +'141,142,129,130,,,,,,,,,,,,,,134,133,,120,138,136,135,131,132,127,125', +'118,,119,433,379,143,,434,,,,,,,,139,140,,137,121,122,123,,126,128,', +',124,,,,,141,142,129,130,,,,,,,,,,,,,,134,133,,120,138,136,135,131,132', +'127,125,118,,119,433,379,143,,434,,,,,,,,139,140,,137,121,122,123,,126', +'128,,,124,,,,,141,142,129,130,,,,,,,,,,,,,,134,133,,120,138,136,135', +'131,132,127,125,118,,119,433,379,143,,434,,,,,,,,139,140,,137,121,122', +'123,,126,128,,,124,,,,,141,142,129,130,,,,,,,,,,,,,,134,133,,120,138', +'136,135,131,132,127,125,118,,119,857,379,143,,858,,,,,,,,139,140,,137', +'121,122,123,,126,128,,,124,,,,,141,142,129,130,,,,,,,,,,,,,,134,133', +',120,138,136,135,131,132,127,125,118,,119,859,385,143,,860,,,,,,,,139', +'140,,137,121,122,123,,126,128,,,124,,,,,141,142,129,130,,,,,,,,,,,,', +',134,133,,120,138,136,135,131,132,127,125,118,,119,,,143,215,219,224', +'225,226,221,223,231,232,227,228,,208,209,,,229,230,,,,,,,,,,,,,,,212', +',218,,214,213,210,211,222,220,216,,217,,215,219,224,225,226,221,223', +'231,232,227,228,,208,209,291,233,229,230,,,,,,,,,,,,,,,212,,218,,214', +'213,210,211,222,220,216,,217,,215,219,224,225,226,221,223,231,232,227', +'228,,208,209,291,233,229,230,,,,,,,,,,,,,,,212,,218,,214,213,210,211', +'222,220,216,,217,,,,,,,,,,,,,,,,,233' ] + racc_action_table = arr = ::Array.new(24340, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'381,512,512,518,518,306,755,381,381,381,326,440,711,381,381,313,381', +'199,440,711,307,70,347,316,424,381,3,627,500,70,1,3,201,603,603,381', +'381,630,381,381,381,381,381,727,798,446,311,631,311,632,743,394,755', +'755,755,755,8,310,424,447,440,711,310,199,381,381,381,381,381,381,381', +'381,381,381,381,381,381,381,201,446,381,381,381,55,381,347,603,594,381', +'591,512,381,518,447,491,512,381,394,381,633,381,381,381,381,381,381', +'381,383,381,381,381,9,632,326,383,383,383,306,313,306,383,383,306,383', +'381,381,316,381,591,381,381,500,307,326,307,492,595,307,326,627,630', +'627,383,383,627,383,383,383,383,383,631,594,632,743,582,727,798,727', +'798,744,727,798,633,26,322,15,15,55,322,594,550,383,383,383,383,383', +'383,383,383,383,383,383,383,383,383,574,277,383,383,383,594,383,491', +'594,491,383,582,491,383,551,595,10,633,383,528,383,343,383,383,383,383', +'383,383,383,50,383,550,383,595,574,11,50,50,50,511,26,50,50,50,511,50', +'383,383,492,383,492,383,383,492,595,50,50,595,297,12,551,297,26,277', +'50,50,693,50,50,50,50,50,744,14,744,298,20,744,298,344,528,528,343,343', +'343,277,301,108,34,301,528,108,108,50,50,50,50,50,50,50,50,50,50,50', +'50,50,50,345,13,50,50,50,693,36,50,13,14,50,346,14,50,50,41,50,13,50', +'95,50,419,50,50,50,50,50,50,50,432,50,184,50,344,344,344,432,432,432', +'848,200,432,432,432,348,432,50,50,50,50,202,50,320,419,803,432,803,419', +'419,419,419,345,345,345,432,432,203,432,432,432,432,432,346,346,346', +'25,303,239,321,303,597,635,25,42,435,848,848,848,848,240,42,435,435', +'435,330,857,435,435,435,42,435,330,320,244,432,348,348,348,35,320,435', +'432,37,37,320,253,432,432,320,435,435,264,435,435,435,435,435,283,321', +'266,597,635,376,858,377,321,320,597,635,432,321,540,597,635,321,857', +'597,635,267,400,268,35,857,432,35,432,401,857,432,435,198,857,321,640', +'597,635,435,198,640,646,283,435,435,283,646,376,198,377,376,857,377', +'400,271,858,540,400,400,540,401,271,858,273,401,401,435,858,280,280', +'271,858,294,294,331,552,552,552,275,552,435,331,435,552,552,435,276', +'859,552,858,552,552,552,552,552,552,552,305,305,615,615,552,552,552', +'552,552,552,552,332,420,279,333,334,758,758,332,284,552,333,334,552', +'552,552,552,552,552,552,552,552,552,285,552,552,335,552,552,552,859', +'870,870,335,420,288,336,859,420,420,420,420,859,336,272,292,859,337', +'293,552,552,272,552,552,337,552,552,296,300,552,272,552,302,552,859', +'552,312,339,274,286,314,315,317,552,339,274,286,314,552,552,552,552', +'552,552,274,286,314,552,552,553,553,553,362,553,363,368,552,553,553', +'371,375,382,553,402,553,553,553,553,553,553,553,403,404,405,429,553', +'553,553,553,553,553,553,522,522,438,522,522,522,439,441,442,553,448', +'450,553,553,553,553,553,553,553,553,553,553,451,553,553,455,553,553', +'553,398,398,398,398,398,398,398,398,398,398,398,324,398,398,459,460', +'398,398,324,553,553,459,553,553,470,553,553,324,473,553,459,553,398', +'553,398,553,398,398,398,398,398,398,398,553,398,487,493,494,553,553', +'553,553,553,553,526,503,531,553,553,60,60,60,503,60,543,547,553,60,60', +'554,561,503,60,563,60,60,60,60,60,60,60,566,568,576,577,60,60,60,60', +'60,60,60,583,586,60,593,596,599,601,366,602,60,604,607,60,60,60,60,60', +'60,60,60,60,60,608,60,60,611,60,60,60,366,366,366,366,366,366,366,366', +'366,366,366,598,366,366,721,617,366,366,598,60,623,721,60,598,625,60', +'60,598,626,60,721,629,366,638,366,60,366,366,366,366,366,366,366,60', +'366,643,647,648,60,60,60,60,60,60,649,655,660,60,60,663,60,366,665,366', +'636,60,97,97,97,97,97,636,678,696,97,97,636,700,701,97,636,97,97,97', +'97,97,97,97,702,705,709,710,97,97,97,97,97,97,97,712,716,97,4,4,4,4', +'4,97,97,97,97,97,97,97,97,97,97,97,97,97,97,718,97,97,719,97,97,97,399', +'399,399,399,399,399,399,399,399,399,399,770,399,399,771,720,399,399', +'770,97,732,771,97,735,746,97,97,770,750,97,771,97,399,751,399,97,399', +'399,399,399,399,399,399,97,399,764,772,774,97,97,97,97,97,97,775,773', +'782,97,97,697,697,697,773,697,783,97,825,697,697,784,787,773,697,825', +'697,697,697,697,697,697,697,800,825,801,806,697,697,697,697,697,697', +'697,106,106,106,106,106,808,809,810,813,697,814,826,697,697,697,697', +'697,697,697,697,697,697,833,697,697,410,836,514,697,514,514,514,514', +'860,837,854,876,855,856,865,860,410,410,876,871,860,872,873,697,860', +'874,697,876,878,697,697,881,410,697,410,892,410,410,410,410,514,,410', +',410,,,,514,514,514,514,697,697,697,697,697,697,,,,697,697,,821,821', +'821,697,821,,,,821,821,,,,821,,821,821,821,821,821,821,821,,,,,821,821', +'821,821,821,821,821,350,350,350,350,350,,,555,,821,,,821,821,821,821', +'821,821,821,821,821,821,,821,821,,,,821,555,555,555,555,555,555,555', +'555,555,555,555,,555,555,,,555,555,,821,,,821,,,821,821,,,821,,,555', +',555,,555,555,555,555,555,555,555,,555,,,,821,821,821,821,821,821,,', +',821,821,,,555,,821,0,0,0,0,0,0,,,,0,0,,,,0,,0,0,0,0,0,0,0,,,,,0,0,0', +'0,0,0,0,,,0,,,,,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,,0,0,0,,,,,,,,,,,', +',,,,,,,,0,,,0,,,0,0,,,0,,0,,,,0,645,,645,645,645,645,,0,,,,,0,0,0,0', +'0,0,,,,0,0,30,30,30,30,30,30,,,,30,30,,,,30,,30,30,30,30,30,30,30,645', +'645,645,645,30,30,30,30,30,30,30,,,30,,,,,,30,30,30,30,30,30,30,30,30', +'30,30,30,30,30,,30,30,,30,30,30,,,,,,,,,,,,,,,,,,,,30,,,30,,,30,30,', +',30,,30,,,,30,753,,753,753,753,753,,30,,,,,30,30,30,30,30,30,,,,30,30', +'51,51,51,51,51,51,,,,51,51,,,,51,,51,51,51,51,51,51,51,753,753,753,753', +'51,51,51,51,51,51,51,,,51,,,,,,51,51,51,51,51,51,51,51,51,51,51,51,51', +'51,,51,51,,51,51,51,,,,,,,,,,,,,,,,,,,,51,,,51,,,51,51,,,51,,51,,,,51', +'817,,817,817,817,817,,51,,,,,51,51,51,51,51,51,,,,51,51,186,186,186', +'186,186,186,,,,186,186,,,,186,817,186,186,186,186,186,186,186,817,817', +'817,817,186,186,186,186,186,186,186,,,186,,,,,,186,186,186,186,186,186', +'186,186,186,186,186,186,186,186,,186,186,,186,186,186,409,409,409,409', +'409,409,409,,,409,409,,,,,,409,409,,186,,,186,,,186,186,,,186,,186,409', +',409,186,409,409,409,409,409,409,409,186,409,,,,186,186,186,186,186', +'186,,,,186,186,187,187,187,187,187,187,,,,187,187,,,,187,,187,187,187', +'187,187,187,187,,,,,187,187,187,187,187,187,187,,,187,,,,,,187,187,187', +'187,187,187,187,187,187,187,187,187,187,187,,187,187,,187,187,187,411', +',,,,,,,,,,,,,,,411,411,,187,,,187,,,187,187,,,187,,187,411,,411,187', +'411,411,411,411,,,411,187,411,,,,187,187,187,187,187,187,,,,187,187', +'204,204,204,204,204,204,,,,204,204,,,,204,,204,204,204,204,204,204,204', +',,,,204,204,204,204,204,204,204,,,204,,,,,,204,204,204,204,204,204,204', +'204,204,204,204,204,204,204,,204,204,,204,204,204,412,,,,,,,,,,,,,,', +',412,412,,204,,,204,,,204,204,,,204,,204,412,,412,204,412,412,412,412', +',,412,204,412,,,,204,204,204,204,204,204,,,,204,204,265,265,265,265', +'265,265,,,,265,265,,,,265,,265,265,265,265,265,265,265,,,,,265,265,265', +'265,265,265,265,,,265,,,,,,265,265,265,265,265,265,265,265,265,265,265', +'265,265,265,,265,265,,265,265,265,413,,,,,,,,,,,,,,,,413,413,,265,,', +'265,,,265,265,,,265,,265,413,,413,265,413,413,413,413,,,413,265,413', +',,,265,265,265,265,265,265,,,,265,265,270,270,270,270,270,270,,,,270', +'270,,,,270,,270,270,270,270,270,270,270,,,,,270,270,270,270,270,270', +'270,,,270,,,,,,270,270,270,270,270,270,270,270,270,270,270,270,270,270', +',270,270,,270,270,270,414,414,414,414,414,414,414,,,414,414,,,,,,414', +'414,,270,,,270,,,270,270,,,270,,270,414,,414,270,414,414,414,414,414', +'414,414,270,414,,,,270,270,270,270,270,270,,,,270,270,486,486,486,486', +'486,486,,,,486,486,,,,486,,486,486,486,486,486,486,486,,,,,486,486,486', +'486,486,486,486,,,486,,,,,,486,486,486,486,486,486,486,486,486,486,486', +'486,486,486,,486,486,,486,486,486,415,415,415,415,415,415,415,,,415', +'415,,,,,,415,415,,486,,,486,,,486,486,,,486,,486,415,,415,486,415,415', +'415,415,415,415,415,486,415,,,,486,486,486,486,486,486,,,,486,486,490', +'490,490,490,490,490,,,,490,490,,,,490,,490,490,490,490,490,490,490,', +',,,490,490,490,490,490,490,490,,,490,,,,,,490,490,490,490,490,490,490', +'490,490,490,490,490,490,490,,490,490,,490,490,490,416,416,416,416,416', +'416,416,,,416,416,,,,,,416,416,,490,,,490,,,490,490,,,490,,490,416,', +'416,490,416,416,416,416,416,416,416,490,416,,,,490,490,490,490,490,490', +',,,490,490,495,495,495,495,495,495,,,,495,495,,,,495,,495,495,495,495', +'495,495,495,,,,,495,495,495,495,495,495,495,,,495,,,,,,495,495,495,495', +'495,495,495,495,495,495,495,495,495,495,,495,495,,495,495,495,417,417', +'417,417,417,417,417,,,417,417,,,,,,417,417,,495,,,495,,,495,495,,,495', +',495,417,,417,495,417,417,417,417,417,417,417,495,417,,,,495,495,495', +'495,495,495,,,,495,495,513,513,513,513,513,513,,,,513,513,,,,513,,513', +'513,513,513,513,513,513,,,,,513,513,513,513,513,513,513,,,513,,,,,,513', +'513,513,513,513,513,513,513,513,513,513,513,513,513,,513,513,,513,513', +'513,418,418,418,418,418,418,418,,,418,418,,,,,,418,418,,513,,,513,,', +'513,513,,,513,,513,418,,418,513,418,418,418,418,418,418,418,513,418', +',,,513,513,513,513,513,513,,,,513,513,559,559,559,559,559,559,,,,559', +'559,,,,559,,559,559,559,559,559,559,559,,,,,559,559,559,559,559,559', +'559,,,559,,,,,,559,559,559,559,559,559,559,559,559,559,559,559,559,559', +',559,559,,559,559,559,421,421,421,421,421,421,421,,,421,421,,,,,,421', +'421,,559,,,559,,,559,559,,,559,,559,421,,421,559,421,421,421,421,421', +'421,421,559,421,,,,559,559,559,559,559,559,,,,559,559,588,588,588,588', +'588,588,,,,588,588,,,,588,,588,588,588,588,588,588,588,,,,,588,588,588', +'588,588,588,588,,,588,,,,,,588,588,588,588,588,588,588,588,588,588,588', +'588,588,588,,588,588,,588,588,588,422,422,422,422,422,422,422,422,,422', +'422,,,,,,422,422,,588,,,588,,,588,588,,,588,,588,422,,422,588,422,422', +'422,422,422,422,422,588,422,,,,588,588,588,588,588,588,,,,588,588,589', +'589,589,589,589,589,,,,589,589,,,,589,,589,589,589,589,589,589,589,', +',,,589,589,589,589,589,589,589,,,589,,,,,,589,589,589,589,589,589,589', +'589,589,589,589,589,589,589,,589,589,,589,589,589,406,,,,,,,,,,,,,,', +',406,406,,589,,,589,,,589,589,,,589,,589,406,,406,589,406,406,406,406', +',,,589,,,,,589,589,589,589,589,589,,,,589,589,606,606,606,606,606,606', +',,,606,606,,,,606,,606,606,606,606,606,606,606,,,,,606,606,606,606,606', +'606,606,,,606,,,,,,606,606,606,606,606,606,606,606,606,606,606,606,606', +'606,,606,606,,606,606,606,407,,,,,,,,,,,,,,,,407,407,,606,,,606,,,606', +'606,,,606,,606,407,,407,606,407,407,407,407,,,,606,,,,,606,606,606,606', +'606,606,,,,606,606,639,639,639,639,639,639,,,,639,639,,,,639,,639,639', +'639,639,639,639,639,,,,,639,639,639,639,639,639,639,,,639,,,,,,639,639', +'639,639,639,639,639,639,639,639,639,639,639,639,,639,639,,639,639,639', +'408,,,,,,,,,,,,,,,,408,408,,639,,,639,,,639,639,,,639,,639,408,,,639', +'408,408,408,408,,,,639,,,,,639,639,639,639,639,639,,,,639,639,644,644', +'644,644,644,644,,,,644,644,,,,644,,644,644,644,644,644,644,644,,,,,644', +'644,644,644,644,644,644,,,644,,,,,,644,644,644,644,644,644,644,644,644', +'644,644,644,644,644,,644,644,,644,644,644,,,,,,,,,,,,,,,,,,,,644,,,644', +',,644,644,,,644,,644,,,,644,,,,,,,,644,,,,,644,644,644,644,644,644,', +',,644,644,671,671,671,671,671,671,,,,671,671,,,,671,,671,671,671,671', +'671,671,671,,,,,671,671,671,671,671,671,671,,,671,,,,,,671,671,671,671', +'671,671,671,671,671,671,671,671,671,671,,671,671,,671,671,671,,,,,,', +',,,,,,,,,,,,,671,,,671,,,671,671,,,671,,671,,,,671,,,,,,,,671,,,,,671', +'671,671,671,671,671,,,,671,671,706,706,706,706,706,706,,,,706,706,,', +',706,,706,706,706,706,706,706,706,,,,,706,706,706,706,706,706,706,,', +'706,,,,,,706,706,706,706,706,706,706,706,706,706,706,706,706,706,,706', +'706,,706,706,706,,,,,,,,,,,,,,,,,,,,706,,,706,,,706,706,,,706,,706,', +',,706,,,,,,,,706,,,,,706,706,706,706,706,706,,,,706,706,724,724,724', +'724,724,724,,,,724,724,,,,724,,724,724,724,724,724,724,724,,,,,724,724', +'724,724,724,724,724,,,724,,,,,,724,724,724,724,724,724,724,724,724,724', +'724,724,724,724,,724,724,,724,724,724,,,,,,,,,,,,,,,,,,,,724,,,724,', +',724,724,,,724,,724,,,,724,,,,,,,,724,,,,,724,724,724,724,724,724,,', +',724,724,736,736,736,736,736,736,,,,736,736,,,,736,,736,736,736,736', +'736,736,736,,,,,736,736,736,736,736,736,736,,,736,,,,,,736,736,736,736', +'736,736,736,736,736,736,736,736,736,736,,736,736,,736,736,736,,,,,,', +',,,,,,,,,,,,,736,,,736,,,736,736,,,736,,736,,,,736,,,,,,,,736,,,,,736', +'736,736,736,736,736,,,,736,736,737,737,737,737,737,737,,,,737,737,,', +',737,,737,737,737,737,737,737,737,,,,,737,737,737,737,737,737,737,,', +'737,,,,,,737,737,737,737,737,737,737,737,737,737,737,737,737,737,,737', +'737,,737,737,737,,,,,,,,,,,,,,,,,,,,737,,,737,,,737,737,,,737,,737,', +',,737,,,,,,,,737,,,,,737,737,737,737,737,737,,,,737,737,741,741,741', +'741,741,741,,,,741,741,,,,741,,741,741,741,741,741,741,741,,,,,741,741', +'741,741,741,741,741,,,741,,,,,,741,741,741,741,741,741,741,741,741,741', +'741,741,741,741,,741,741,,741,741,741,,,,,,,,,,,,,,,,,,,,741,,,741,', +',741,741,,,741,,741,,,,741,,,,,,,,741,,,,,741,741,741,741,741,741,,', +',741,741,748,748,748,748,748,748,,,,748,748,,,,748,,748,748,748,748', +'748,748,748,,,,,748,748,748,748,748,748,748,,,748,,,,,,748,748,748,748', +'748,748,748,748,748,748,748,748,748,748,,748,748,,748,748,748,,,,,,', +',,,,,,,,,,,,,748,,,748,,,748,748,,,748,,748,,,,748,,,,,,,,748,,,,,748', +'748,748,748,748,748,,,,748,748,794,794,794,794,794,794,,,,794,794,,', +',794,,794,794,794,794,794,794,794,,,,,794,794,794,794,794,794,794,,', +'794,,,,,,794,794,794,794,794,794,794,794,794,794,794,794,794,794,,794', +'794,,794,794,794,,,,,,,,,,,,,,,,,,,,794,,,794,,,794,794,,,794,,794,', +',,794,,,,,,,,794,,,,,794,794,794,794,794,794,,,,794,794,838,838,838', +'838,838,838,,,,838,838,,,,838,,838,838,838,838,838,838,838,,,,,838,838', +'838,838,838,838,838,,,838,,,,,,838,838,838,838,838,838,838,838,838,838', +'838,838,838,838,,838,838,,838,838,838,,,,,,,,,,,,,,,,,,,,838,,,838,', +',838,838,,,838,,838,,,,838,,,,,,,,838,,,,,838,838,838,838,838,838,,', +',838,838,845,845,845,845,845,845,,,,845,845,,,,845,,845,845,845,845', +'845,845,845,,,,,845,845,845,845,845,845,845,,,845,,,,,,845,845,845,845', +'845,845,845,845,845,845,845,845,845,845,,845,845,,845,845,845,,,,,,', +',,,,,,,,,,,,,845,,,845,,,845,845,,,845,,845,,,,845,,,,,,,,845,,,,,845', +'845,845,845,845,845,,,,845,845,852,852,852,852,852,852,,,,852,852,,', +',852,,852,852,852,852,852,852,852,,,,,852,852,852,852,852,852,852,,', +'852,,,,,,852,852,852,852,852,852,852,852,852,852,852,852,852,852,,852', +'852,,852,852,852,,,,,,,,,,,,,,,,,,,,852,,,852,,,852,852,,,852,,852,', +',,852,,,,,,,,852,,,,,852,852,852,852,852,852,,,,852,852,5,5,5,5,5,,', +',5,5,,,,5,,5,5,5,5,5,5,5,,,,,5,5,5,5,5,5,5,,,5,,,,,,5,5,5,5,5,5,5,5', +'5,5,5,5,5,5,,5,5,,5,5,5,,,,,,,,,,,,,,,,,,,,5,,,5,,,5,5,,,5,,5,,,,5,', +',,,,,,5,,,,,5,5,5,5,5,5,,,,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6', +'6,6,6,6,6,,,6,6,6,6,6,6,6,6,6,6,,,,,,6,6,6,6,6,6,6,6,6,,6,,,,,,,,6,6', +',6,6,6,6,,6,6,,,6,,,,,6,6,6,6,,,,,,,,,,,,,,6,6,,6,6,6,6,6,6,6,6,6,,6', +',,6,6,,,,,,,,,,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,,,7', +'7,7,7,7,7,7,7,7,7,,,,,,7,7,7,7,7,7,7,7,,,7,,,,,,,,7,7,,7,7,7,7,,7,7', +',,7,,,,,7,7,7,7,,,,,,,,,,,,,,7,7,,7,7,7,7,7,7,7,7,7,,7,,,7,7,,,17,17', +'17,,17,,,7,17,17,,,,17,,17,17,17,17,17,17,17,,,,,17,17,17,17,17,17,17', +',,17,,,,,,,17,,,17,17,17,17,17,17,17,17,17,17,,17,17,,17,17,17,,,,,', +',,,,,,,,,,,,,,17,,,17,,,17,17,,,17,,,,,,17,,,,,,,,17,,,,,17,17,17,17', +'17,17,,,,17,17,18,18,18,,18,,,,18,18,,,,18,,18,18,18,18,18,18,18,,,', +',18,18,18,18,18,18,18,,,,,,,,,,18,,,18,18,18,18,18,18,18,18,18,18,,18', +'18,,18,18,18,,,,,,,,,,,,,,,,,,,,18,,,18,,,18,18,,,18,,,,,,18,,,,,,,', +'18,,,,,18,18,18,18,18,18,,,,18,18,22,22,22,,22,,,,22,22,,,,22,,22,22', +'22,22,22,22,22,,,,,22,22,22,22,22,22,22,,,,,,,,,,22,,,22,22,22,22,22', +'22,22,22,22,22,,22,22,,22,22,22,,,,,,,,,,,,,,,,,,,,22,,,22,,,22,22,', +',22,,22,,22,,22,,,,,,,,22,,,,,22,22,22,22,22,22,,,,22,22,23,23,23,,23', +',,,23,23,,,,23,,23,23,23,23,23,23,23,,,,,23,23,23,23,23,23,23,,,,,,', +',,,23,,,23,23,23,23,23,23,23,23,23,23,,23,23,,23,23,23,,,,,,,,,,,,,', +',,,,,,23,,,23,,,23,23,,,23,,23,,23,,23,,,,,,,,23,,,,,23,23,23,23,23', +'23,,,,23,23,24,24,24,,24,,,,24,24,,,,24,,24,24,24,24,24,24,24,,,,,24', +'24,24,24,24,24,24,,,,,,,,,,24,,,24,24,24,24,24,24,24,24,24,24,,24,24', +',24,24,24,,,,,,,,,,,,,,,,,,,,24,,,24,,,24,24,,,24,,24,,24,,24,,,,,,', +',24,,,,,24,24,24,24,24,24,,,,24,24,27,27,27,,27,,,,27,27,,,,27,,27,27', +'27,27,27,27,27,,,,,27,27,27,27,27,27,27,,,,,,,,,,27,,,27,27,27,27,27', +'27,27,27,27,27,,27,27,,27,27,27,,,,,,,,,,,,,,,,,,,,27,,,27,27,,27,27', +',,27,,27,,27,,27,,,,,,,,27,,,,,27,27,27,27,27,27,,,,27,27,28,28,28,', +'28,,,,28,28,,,,28,,28,28,28,28,28,28,28,,,,,28,28,28,28,28,28,28,,,', +',,,,,,28,,,28,28,28,28,28,28,28,28,28,28,,28,28,,28,28,28,,,,,,,,,,', +',,,,,,,,,28,,,28,28,,28,28,,,28,,28,,28,,28,,,,,,,,28,,,,,28,28,28,28', +'28,28,,,,28,28,31,31,31,,31,,,,31,31,,,,31,,31,31,31,31,31,31,31,,,', +',31,31,31,31,31,31,31,,,,,,,,,,31,,,31,31,31,31,31,31,31,31,31,31,,31', +'31,,,,31,,828,828,828,828,828,828,828,828,828,828,828,,828,828,,,828', +'828,31,,,31,,,31,31,,,31,,31,,828,,828,,828,828,828,828,828,828,828', +',828,,,31,31,31,31,31,31,,,,31,31,32,32,32,828,32,828,,,32,32,,,,32', +',32,32,32,32,32,32,32,,,,,32,32,32,32,32,32,32,,,,,,,,,,32,,,32,32,32', +'32,32,32,32,32,32,32,,32,32,,,,32,,19,19,19,19,19,19,19,19,19,19,19', +',19,19,,,19,19,32,,,32,,,32,32,,,32,,,,19,,19,,19,19,19,19,19,19,19', +',19,,,32,32,32,32,32,32,,,,32,32,38,38,38,19,38,,,,38,38,,,,38,,38,38', +'38,38,38,38,38,,,,,38,38,38,38,38,38,38,,,,,,,,,,38,,,38,38,38,38,38', +'38,38,38,38,38,,38,38,,38,38,38,,,,,,,,,,,,,,,,,,,,38,,,38,,,38,38,', +',38,,,,,,38,,,,,,,,38,,,,,38,38,38,38,38,38,,,,38,38,39,39,39,,39,,', +',39,39,,,,39,,39,39,39,39,39,39,39,,,,,39,39,39,39,39,39,39,,,,,,,,', +',39,,,39,39,39,39,39,39,39,39,39,39,,39,39,,39,39,39,,,,,,,,,,,,,,,', +',,,,39,,,39,,,39,39,,,39,,,,,,39,,,,,,,,39,,,,,39,39,39,39,39,39,,,', +'39,39,40,40,40,,40,,,,40,40,,,,40,,40,40,40,40,40,40,40,,,,,40,40,40', +'40,40,40,40,,,,,,,,,,40,,,40,40,40,40,40,40,40,40,40,40,,40,40,,40,40', +'40,,,,,,,,,,,,,,,,,,,,40,,,40,,,40,40,,,40,,,,,,40,,,,,,,,40,,,,,40', +'40,40,40,40,40,,,,40,40,52,52,52,,52,,,,52,52,,,,52,,52,52,52,52,52', +'52,52,,,,,52,52,52,52,52,52,52,,,52,,,,,,,52,,,52,52,52,52,52,52,52', +'52,52,52,,52,52,,52,52,52,,,,,,,,,,,,,,,,,,,,52,,,52,,,52,52,,,52,,', +',,,52,,,,,,,,52,,,,,52,52,52,52,52,52,,,,52,52,53,53,53,,53,,,,53,53', +',,,53,,53,53,53,53,53,53,53,,,,,53,53,53,53,53,53,53,,,,,,,,,,53,,,53', +'53,53,53,53,53,53,53,53,53,,53,53,,53,53,53,,,,,,,,,,,,,,,,,,,,53,,', +'53,,,53,53,,,53,,53,,,,53,,,,,,,,53,,,,,53,53,53,53,53,53,,,,53,53,54', +'54,54,,54,,,,54,54,,,,54,,54,54,54,54,54,54,54,,,,,54,54,54,54,54,54', +'54,,,,,,,,,,54,,,54,54,54,54,54,54,54,54,54,54,,54,54,,54,54,54,,,,', +',,,,,,,,,,,,,,,54,,,54,,,54,54,,,54,,,,,,54,,,,,,,,54,,,,,54,54,54,54', +'54,54,,,,54,54,56,56,56,,56,,,,56,56,,,,56,,56,56,56,56,56,56,56,,,', +',56,56,56,56,56,56,56,,,56,,,,,,,56,,,56,56,56,56,56,56,56,56,56,56', +',56,56,,56,56,56,,,,,,,,,,,,,,,,,,,,56,,,56,,,56,56,,,56,,,,,,56,,,', +',,,,56,,,,,56,56,56,56,56,56,,,,56,56,57,57,57,,57,,,,57,57,,,,57,,57', +'57,57,57,57,57,57,,,,,57,57,57,57,57,57,57,,,57,,,,,,,57,,,57,57,57', +'57,57,57,57,57,57,57,,57,57,,57,57,57,,,,,,,,,,,,,,,,,,,,57,,,57,,,57', +'57,,,57,,,,,,57,,,,,,,,57,,,,,57,57,57,57,57,57,,,,57,57,61,61,61,,61', +',,,61,61,,,,61,,61,61,61,61,61,61,61,,,,,61,61,61,61,61,61,61,,,,,,', +',,,61,,,61,61,61,61,61,61,61,61,61,61,,61,61,,,,61,,237,237,237,237', +'237,237,237,237,237,237,237,,237,237,,,237,237,61,,,61,,,61,61,,,61', +',61,,237,,237,,237,237,237,237,237,237,237,,237,,,61,61,61,61,61,61', +',,,61,61,62,62,62,237,62,,,,62,62,,,,62,,62,62,62,62,62,62,62,,,,,62', +'62,62,62,62,62,62,,,,,,,,,,62,,,62,62,62,62,62,62,62,62,62,62,,62,62', +',,,62,,374,374,374,374,374,374,374,374,374,374,374,,374,374,,62,374', +'374,62,,,62,,,62,62,,,62,,,,374,,374,,374,374,374,374,374,374,374,,374', +',,62,62,62,62,62,62,,,,62,62,63,63,63,374,63,,,,63,63,,,,63,,63,63,63', +'63,63,63,63,,,,,63,63,63,63,63,63,63,,,,,,,,,,63,,,63,63,63,63,63,63', +'63,63,63,63,,63,63,,,,63,,388,388,388,388,388,388,388,388,388,388,388', +',388,388,,,388,388,63,,,63,,,63,63,,,63,,,,388,,388,,388,388,388,388', +'388,388,388,,388,,,63,63,63,63,63,63,,,,63,63,82,82,82,388,82,,,,82', +'82,,,,82,,82,82,82,82,82,82,82,,82,,,82,82,82,82,82,82,82,,,,,,,,,,82', +',,82,82,82,82,82,82,82,82,82,82,,82,82,,82,82,82,,,,,,,,,,,,,,,,,,,', +'82,,,82,82,,82,82,,,82,,82,,82,,82,,,,,,,,82,,82,,,82,82,82,82,82,82', +',,,82,82,86,86,86,,86,,,,86,86,,,,86,,86,86,86,86,86,86,86,,86,,,86', +'86,86,86,86,86,86,,,,,,,,,,86,,,86,86,86,86,86,86,86,86,86,86,,86,86', +',86,86,86,,,,,,,,,,,,,,,,,,,,86,,,86,86,,86,86,,,86,,86,,86,,86,,,,', +',,,86,,86,,,86,86,86,86,86,86,,,,86,86,101,101,101,,101,,,,101,101,', +',,101,,101,101,101,101,101,101,101,,,,,101,101,101,101,101,101,101,', +',101,,,,,,,101,,,101,101,101,101,101,101,101,101,101,101,,101,101,,101', +'101,101,,,,,,,,,,,,,,,,,,,,101,,,101,,,101,101,,,101,,,,,,101,,,,,,', +',101,,,,,101,101,101,101,101,101,,,,101,101,102,102,102,,102,,,,102', +'102,,,,102,,102,102,102,102,102,102,102,,,,,102,102,102,102,102,102', +'102,,,102,,,,,,,102,,,102,102,102,102,102,102,102,102,102,102,,102,102', +',102,102,102,,,,,,,,,,,,,,,,,,,,102,,,102,,,102,102,,,102,,,,,,102,', +',,,,,,102,,,,,102,102,102,102,102,102,,,,102,102,103,103,103,,103,,', +',103,103,,,,103,,103,103,103,103,103,103,103,,,,,103,103,103,103,103', +'103,103,,,103,,,,,,,103,,,103,103,103,103,103,103,103,103,103,103,,103', +'103,,103,103,103,,,,,,,,,,,,,,,,,,,,103,,,103,,,103,103,,,103,,,,,,103', +',,,,,,,103,,,,,103,103,103,103,103,103,,,,103,103,104,104,104,,104,', +',,104,104,,,,104,,104,104,104,104,104,104,104,,,,,104,104,104,104,104', +'104,104,,,104,,,,,,,104,,,104,104,104,104,104,104,104,104,104,104,,104', +'104,,104,104,104,,,,,,,,,,,,,,,,,,,,104,,,104,,,104,104,,,104,,,,,,104', +',,,,,,,104,,,,,104,104,104,104,104,104,,,,104,104,105,105,105,105,105', +',,,105,105,,,,105,,105,105,105,105,105,105,105,,,,,105,105,105,105,105', +'105,105,,,105,,,,,,105,105,105,105,105,105,105,105,105,105,105,105,105', +'105,,105,105,,105,105,105,,,,,,,,,,,,,,,,,,,,105,,,105,,,105,105,,,105', +',105,,,,105,,,,,,,,105,,,,,105,105,105,105,105,105,,,,105,105,188,188', +'188,,188,,,,188,188,,,,188,,188,188,188,188,188,188,188,,,,,188,188', +'188,188,188,188,188,,,,,,,,,,188,,,188,188,188,188,188,188,188,188,188', +'188,,188,188,,188,188,188,,,,,,,,,,,,,,,,,,,,188,,,188,,,188,188,,,188', +',188,,,,188,,,,,,,,188,,,,,188,188,188,188,188,188,,,,188,188,189,189', +'189,,189,,,,189,189,,,,189,,189,189,189,189,189,189,189,,,,,189,189', +'189,189,189,189,189,,,,,,,,,,189,,,189,189,189,189,189,189,189,189,189', +'189,,189,189,,189,189,189,,,,,,,,,,,,,,,,,,,,189,,,189,,,189,189,,,189', +',189,,,,189,,,,,,,,189,,,,,189,189,189,189,189,189,,,,189,189,190,190', +'190,,190,,,,190,190,,,,190,,190,190,190,190,190,190,190,,,,,190,190', +'190,190,190,190,190,,,,,,,,,,190,,,190,190,190,190,190,190,190,190,190', +'190,,190,190,,190,190,190,,,,,,,,,,,,,,,,,,,,190,,,190,,,190,190,,,190', +',,,,,190,,,,,,,,190,,,,,190,190,190,190,190,190,,,,190,190,191,191,191', +',191,,,,191,191,,,,191,,191,191,191,191,191,191,191,,,,,191,191,191', +'191,191,191,191,,,,,,,,,,191,,,191,191,191,191,191,191,191,191,191,191', +',191,191,,191,191,191,,,,,,,,,,,,,,,,,,,,191,,,191,,,191,191,,,191,', +'191,,,,191,,,,,,,,191,,,,,191,191,191,191,191,191,,,,191,191,194,194', +'194,,194,,,,194,194,,,,194,,194,194,194,194,194,194,194,,,,,194,194', +'194,194,194,194,194,,,,,,,,,,194,,,194,194,194,194,194,194,194,194,194', +'194,,194,194,,194,194,194,,,,,,,,,,,,,,,,,,,,194,,,194,,,194,194,,,194', +',,,,,194,,,,,,,,194,,,,,194,194,194,194,194,194,,,,194,194,195,195,195', +',195,,,,195,195,,,,195,,195,195,195,195,195,195,195,,,,,195,195,195', +'195,195,195,195,,,195,,,,,,,195,,,195,195,195,195,195,195,195,195,195', +'195,,195,195,,195,195,195,,,,,,,,,,,,,,,,,,,,195,,,195,,,195,195,,,195', +',,,,,195,,,,,,,,195,,,,,195,195,195,195,195,195,,,,195,195,196,196,196', +',196,,,,196,196,,,,196,,196,196,196,196,196,196,196,,,,,196,196,196', +'196,196,196,196,,,196,,,,,,,196,,,196,196,196,196,196,196,196,196,196', +'196,,196,196,,196,196,196,,,,,,,,,,,,,,,,,,,,196,,,196,,,196,196,,,196', +',,,,,196,,,,,,,,196,,,,,196,196,196,196,196,196,,,,196,196,207,207,207', +',207,,,,207,207,,,,207,,207,207,207,207,207,207,207,,,,,207,207,207', +'207,207,207,207,,,,,,,,,,207,,,207,207,207,207,207,207,207,207,207,207', +',207,207,,207,207,207,,,,,,,,,,,,,,,,,,,,207,,,207,,,207,207,,,207,', +',,,,207,,,,,,,,207,,,,,207,207,207,207,207,207,,,,207,207,208,208,208', +',208,,,,208,208,,,,208,,208,208,208,208,208,208,208,,,,,208,208,208', +'208,208,208,208,,,,,,,,,,208,,,208,208,208,208,208,208,208,208,208,208', +',208,208,,208,208,208,,,,,,,,,,,,,,,,,,,,208,,,208,,,208,208,,,208,', +',,,,208,,,,,,,,208,,,,,208,208,208,208,208,208,,,,208,208,209,209,209', +',209,,,,209,209,,,,209,,209,209,209,209,209,209,209,,,,,209,209,209', +'209,209,209,209,,,,,,,,,,209,,,209,209,209,209,209,209,209,209,209,209', +',209,209,,209,209,209,,,,,,,,,,,,,,,,,,,,209,,,209,,,209,209,,,209,', +',,,,209,,,,,,,,209,,,,,209,209,209,209,209,209,,,,209,209,210,210,210', +',210,,,,210,210,,,,210,,210,210,210,210,210,210,210,,,,,210,210,210', +'210,210,210,210,,,,,,,,,,210,,,210,210,210,210,210,210,210,210,210,210', +',210,210,,210,210,210,,,,,,,,,,,,,,,,,,,,210,,,210,,,210,210,,,210,', +',,,,210,,,,,,,,210,,,,,210,210,210,210,210,210,,,,210,210,211,211,211', +',211,,,,211,211,,,,211,,211,211,211,211,211,211,211,,,,,211,211,211', +'211,211,211,211,,,,,,,,,,211,,,211,211,211,211,211,211,211,211,211,211', +',211,211,,211,211,211,,,,,,,,,,,,,,,,,,,,211,,,211,,,211,211,,,211,', +',,,,211,,,,,,,,211,,,,,211,211,211,211,211,211,,,,211,211,212,212,212', +',212,,,,212,212,,,,212,,212,212,212,212,212,212,212,,,,,212,212,212', +'212,212,212,212,,,,,,,,,,212,,,212,212,212,212,212,212,212,212,212,212', +',212,212,,212,212,212,,,,,,,,,,,,,,,,,,,,212,,,212,,,212,212,,,212,', +',,,,212,,,,,,,,212,,,,,212,212,212,212,212,212,,,,212,212,213,213,213', +',213,,,,213,213,,,,213,,213,213,213,213,213,213,213,,,,,213,213,213', +'213,213,213,213,,,,,,,,,,213,,,213,213,213,213,213,213,213,213,213,213', +',213,213,,213,213,213,,,,,,,,,,,,,,,,,,,,213,,,213,,,213,213,,,213,', +',,,,213,,,,,,,,213,,,,,213,213,213,213,213,213,,,,213,213,214,214,214', +',214,,,,214,214,,,,214,,214,214,214,214,214,214,214,,,,,214,214,214', +'214,214,214,214,,,,,,,,,,214,,,214,214,214,214,214,214,214,214,214,214', +',214,214,,214,214,214,,,,,,,,,,,,,,,,,,,,214,,,214,,,214,214,,,214,', +',,,,214,,,,,,,,214,,,,,214,214,214,214,214,214,,,,214,214,215,215,215', +',215,,,,215,215,,,,215,,215,215,215,215,215,215,215,,,,,215,215,215', +'215,215,215,215,,,,,,,,,,215,,,215,215,215,215,215,215,215,215,215,215', +',215,215,,215,215,215,,,,,,,,,,,,,,,,,,,,215,,,215,,,215,215,,,215,', +',,,,215,,,,,,,,215,,,,,215,215,215,215,215,215,,,,215,215,216,216,216', +',216,,,,216,216,,,,216,,216,216,216,216,216,216,216,,,,,216,216,216', +'216,216,216,216,,,,,,,,,,216,,,216,216,216,216,216,216,216,216,216,216', +',216,216,,216,216,216,,,,,,,,,,,,,,,,,,,,216,,,216,,,216,216,,,216,', +',,,,216,,,,,,,,216,,,,,216,216,216,216,216,216,,,,216,216,217,217,217', +',217,,,,217,217,,,,217,,217,217,217,217,217,217,217,,,,,217,217,217', +'217,217,217,217,,,,,,,,,,217,,,217,217,217,217,217,217,217,217,217,217', +',217,217,,217,217,217,,,,,,,,,,,,,,,,,,,,217,,,217,,,217,217,,,217,', +',,,,217,,,,,,,,217,,,,,217,217,217,217,217,217,,,,217,217,218,218,218', +',218,,,,218,218,,,,218,,218,218,218,218,218,218,218,,,,,218,218,218', +'218,218,218,218,,,,,,,,,,218,,,218,218,218,218,218,218,218,218,218,218', +',218,218,,218,218,218,,,,,,,,,,,,,,,,,,,,218,,,218,,,218,218,,,218,', +',,,,218,,,,,,,,218,,,,,218,218,218,218,218,218,,,,218,218,219,219,219', +',219,,,,219,219,,,,219,,219,219,219,219,219,219,219,,,,,219,219,219', +'219,219,219,219,,,,,,,,,,219,,,219,219,219,219,219,219,219,219,219,219', +',219,219,,219,219,219,,,,,,,,,,,,,,,,,,,,219,,,219,,,219,219,,,219,', +',,,,219,,,,,,,,219,,,,,219,219,219,219,219,219,,,,219,219,220,220,220', +',220,,,,220,220,,,,220,,220,220,220,220,220,220,220,,,,,220,220,220', +'220,220,220,220,,,,,,,,,,220,,,220,220,220,220,220,220,220,220,220,220', +',220,220,,220,220,220,,,,,,,,,,,,,,,,,,,,220,,,220,,,220,220,,,220,', +',,,,220,,,,,,,,220,,,,,220,220,220,220,220,220,,,,220,220,221,221,221', +',221,,,,221,221,,,,221,,221,221,221,221,221,221,221,,,,,221,221,221', +'221,221,221,221,,,,,,,,,,221,,,221,221,221,221,221,221,221,221,221,221', +',221,221,,221,221,221,,,,,,,,,,,,,,,,,,,,221,,,221,,,221,221,,,221,', +',,,,221,,,,,,,,221,,,,,221,221,221,221,221,221,,,,221,221,222,222,222', +',222,,,,222,222,,,,222,,222,222,222,222,222,222,222,,,,,222,222,222', +'222,222,222,222,,,,,,,,,,222,,,222,222,222,222,222,222,222,222,222,222', +',222,222,,222,222,222,,,,,,,,,,,,,,,,,,,,222,,,222,,,222,222,,,222,', +',,,,222,,,,,,,,222,,,,,222,222,222,222,222,222,,,,222,222,223,223,223', +',223,,,,223,223,,,,223,,223,223,223,223,223,223,223,,,,,223,223,223', +'223,223,223,223,,,,,,,,,,223,,,223,223,223,223,223,223,223,223,223,223', +',223,223,,223,223,223,,,,,,,,,,,,,,,,,,,,223,,,223,,,223,223,,,223,', +',,,,223,,,,,,,,223,,,,,223,223,223,223,223,223,,,,223,223,224,224,224', +',224,,,,224,224,,,,224,,224,224,224,224,224,224,224,,,,,224,224,224', +'224,224,224,224,,,,,,,,,,224,,,224,224,224,224,224,224,224,224,224,224', +',224,224,,224,224,224,,,,,,,,,,,,,,,,,,,,224,,,224,,,224,224,,,224,', +',,,,224,,,,,,,,224,,,,,224,224,224,224,224,224,,,,224,224,225,225,225', +',225,,,,225,225,,,,225,,225,225,225,225,225,225,225,,,,,225,225,225', +'225,225,225,225,,,,,,,,,,225,,,225,225,225,225,225,225,225,225,225,225', +',225,225,,225,225,225,,,,,,,,,,,,,,,,,,,,225,,,225,,,225,225,,,225,', +',,,,225,,,,,,,,225,,,,,225,225,225,225,225,225,,,,225,225,226,226,226', +',226,,,,226,226,,,,226,,226,226,226,226,226,226,226,,,,,226,226,226', +'226,226,226,226,,,,,,,,,,226,,,226,226,226,226,226,226,226,226,226,226', +',226,226,,226,226,226,,,,,,,,,,,,,,,,,,,,226,,,226,,,226,226,,,226,', +',,,,226,,,,,,,,226,,,,,226,226,226,226,226,226,,,,226,226,227,227,227', +',227,,,,227,227,,,,227,,227,227,227,227,227,227,227,,,,,227,227,227', +'227,227,227,227,,,,,,,,,,227,,,227,227,227,227,227,227,227,227,227,227', +',227,227,,227,227,227,,,,,,,,,,,,,,,,,,,,227,,,227,,,227,227,,,227,', +',,,,227,,,,,,,,227,,,,,227,227,227,227,227,227,,,,227,227,228,228,228', +',228,,,,228,228,,,,228,,228,228,228,228,228,228,228,,,,,228,228,228', +'228,228,228,228,,,,,,,,,,228,,,228,228,228,228,228,228,228,228,228,228', +',228,228,,228,228,228,,,,,,,,,,,,,,,,,,,,228,,,228,,,228,228,,,228,', +',,,,228,,,,,,,,228,,,,,228,228,228,228,228,228,,,,228,228,229,229,229', +',229,,,,229,229,,,,229,,229,229,229,229,229,229,229,,,,,229,229,229', +'229,229,229,229,,,,,,,,,,229,,,229,229,229,229,229,229,229,229,229,229', +',229,229,,229,229,229,,,,,,,,,,,,,,,,,,,,229,,,229,,,229,229,,,229,', +',,,,229,,,,,,,,229,,,,,229,229,229,229,229,229,,,,229,229,230,230,230', +',230,,,,230,230,,,,230,,230,230,230,230,230,230,230,,,,,230,230,230', +'230,230,230,230,,,,,,,,,,230,,,230,230,230,230,230,230,230,230,230,230', +',230,230,,230,230,230,,,,,,,,,,,,,,,,,,,,230,,,230,,,230,230,,,230,', +',,,,230,,,,,,,,230,,,,,230,230,230,230,230,230,,,,230,230,231,231,231', +',231,,,,231,231,,,,231,,231,231,231,231,231,231,231,,,,,231,231,231', +'231,231,231,231,,,,,,,,,,231,,,231,231,231,231,231,231,231,231,231,231', +',231,231,,231,231,231,,,,,,,,,,,,,,,,,,,,231,,,231,,,231,231,,,231,', +',,,,231,,,,,,,,231,,,,,231,231,231,231,231,231,,,,231,231,232,232,232', +',232,,,,232,232,,,,232,,232,232,232,232,232,232,232,,,,,232,232,232', +'232,232,232,232,,,,,,,,,,232,,,232,232,232,232,232,232,232,232,232,232', +',232,232,,232,232,232,,,,,,,,,,,,,,,,,,,,232,,,232,,,232,232,,,232,', +',,,,232,,,,,,,,232,,,,,232,232,232,232,232,232,,,,232,232,233,233,233', +',233,,,,233,233,,,,233,,233,233,233,233,233,233,233,,,,,233,233,233', +'233,233,233,233,,,,,,,,,,233,,,233,233,233,233,233,233,233,233,233,233', +',233,233,,233,233,233,,,,,,,,,,,,,,,,,,,,233,,,233,,,233,233,,,233,', +',,,,233,,,,,,,,233,,,,,233,233,233,233,233,233,,,,233,233,241,241,241', +',241,,,,241,241,,,,241,,241,241,241,241,241,241,241,,,,,241,241,241', +'241,241,241,241,,,,,,,,,,241,,,241,241,241,241,241,241,241,241,241,241', +',241,241,,241,241,241,,,,,,,,,,,,,,,,,,,,241,,,241,,,241,241,,,241,', +',,,,241,,,,,,,,241,,,,,241,241,241,241,241,241,,,,241,241,243,243,243', +',243,,,,243,243,,,,243,,243,243,243,243,243,243,243,,,,,243,243,243', +'243,243,243,243,,,,,,,,,,243,,,243,243,243,243,243,243,243,243,243,243', +',243,243,,243,243,243,,,,,,,,,,,,,,,,,,,,243,,,243,,,243,243,,,243,', +',,,,243,,,,,,,,243,,,,,243,243,243,243,243,243,,,,243,243,254,254,254', +',254,,,,254,254,,,,254,,254,254,254,254,254,254,254,,,,,254,254,254', +'254,254,254,254,,,,,,,,,,254,,,254,254,254,254,254,254,254,254,254,254', +',254,254,,254,254,254,,,,,,,,,,,,,,,,,,,,254,,,254,,,254,254,,,254,', +'254,,254,,254,,,,,,,,254,,,,,254,254,254,254,254,254,,,,254,254,255', +'255,255,,255,,,,255,255,,,,255,,255,255,255,255,255,255,255,,,,,255', +'255,255,255,255,255,255,,,,,,,,,,255,,,255,255,255,255,255,255,255,255', +'255,255,,255,255,,255,255,255,,,,,,,,,,,,,,,,,,,,255,,,255,,,255,255', +',,255,,255,,255,,255,,,,,,,,255,,,,,255,255,255,255,255,255,,,,255,255', +'263,263,263,,263,,,,263,263,,,,263,,263,263,263,263,263,263,263,,,,', +'263,263,263,263,263,263,263,,,,,,,,,,263,,,263,263,263,263,263,263,263', +'263,263,263,,263,263,,263,263,263,,,,,,,,,,,,,,,,,,,,263,,,263,,263', +'263,263,,,263,,263,,263,,263,,,,,,,,263,,,,,263,263,263,263,263,263', +',,,263,263,269,269,269,,269,,,,269,269,,,,269,,269,269,269,269,269,269', +'269,,,,,269,269,269,269,269,269,269,,,,,,,,,,269,,,269,269,269,269,269', +'269,269,269,269,269,,269,269,,,,269,,468,468,468,468,468,468,468,468', +'468,468,468,,468,468,,,468,468,269,,,269,,,269,269,,,269,,,,468,,468', +',468,468,468,468,468,468,468,,468,,,269,269,269,269,269,269,,,,269,269', +'290,290,290,468,290,,,,290,290,,,,290,,290,290,290,290,290,290,290,', +',,,290,290,290,290,290,290,290,,,,,,,,,,290,,,290,290,290,290,290,290', +'290,290,290,290,,290,290,,290,290,290,,,,,,,,,,,,,,,,,,,,290,,,290,290', +',290,290,,,290,,,,,,290,,,,,,,,290,,,,,290,290,290,290,290,290,,,,290', +'290,299,299,299,,299,,,,299,299,,,,299,,299,299,299,299,299,299,299', +',,,,299,299,299,299,299,299,299,,,,,,,,,,299,,,299,299,299,299,299,299', +'299,299,299,299,,299,299,,299,299,299,,,,,,,,,,,,,,,,,,,,299,,,299,', +',299,299,,,299,,,,,,299,,,,,,,,299,,,,,299,299,299,299,299,299,,,,299', +'299,308,308,308,,308,,,,308,308,,,,308,,308,308,308,308,308,308,308', +',,,,308,308,308,308,308,308,308,,,308,,,,,,,308,,,308,308,308,308,308', +'308,308,308,308,308,,308,308,,308,308,308,,,,,,,,,,,,,,,,,,,,308,,,308', +',,308,308,,,308,,,,,,308,,,,,,,,308,,,,,308,308,308,308,308,308,,,,308', +'308,309,309,309,,309,,,,309,309,,,,309,,309,309,309,309,309,309,309', +',,,,309,309,309,309,309,309,309,,,309,,,,,,,309,,,309,309,309,309,309', +'309,309,309,309,309,,309,309,,309,309,309,,,,,,,,,,,,,,,,,,,,309,,,309', +',,309,309,,,309,,,,,,309,,,,,,,,309,,,,,309,309,309,309,309,309,,,,309', +'309,327,327,327,,327,,,,327,327,,,,327,,327,327,327,327,327,327,327', +',,,,327,327,327,327,327,327,327,,,327,,,,,,,327,,,327,327,327,327,327', +'327,327,327,327,327,,327,327,,327,327,327,,,,,,,,,,,,,,,,,,,,327,,,327', +',,327,327,,,327,,,,,,327,,,,,,,,327,,,,,327,327,327,327,327,327,,,,327', +'327,341,341,341,,341,,,,341,341,,,,341,,341,341,341,341,341,341,341', +',,,,341,341,341,341,341,341,341,,,341,,,,,,,341,,,341,341,341,341,341', +'341,341,341,341,341,,341,341,,341,341,341,,,,,,,,,,,,,,,,,,,,341,,,341', +',,341,341,,,341,,,,,,341,,,,,,,,341,,,,,341,341,341,341,341,341,,,,341', +'341,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357', +'357,357,357,357,357,357,357,357,,,357,357,357,357,357,357,357,357,357', +'357,,,,,,357,357,357,357,357,357,357,357,,,357,,,,,,,,357,357,,357,357', +'357,357,,357,357,,,357,,,,,357,357,357,357,,,,,,,,,,,,,,357,357,,357', +'357,357,357,357,357,357,357,357,,357,,,357,357,,,369,369,369,,369,,', +'357,369,369,,,,369,,369,369,369,369,369,369,369,,,,,369,369,369,369', +'369,369,369,,,,,,,,,,369,,,369,369,369,369,369,369,369,369,369,369,', +'369,369,,369,369,369,,,,,,,,,,,,,,,,,,,,369,,,369,,,369,369,,,369,,', +',,,369,,,,,,,,369,,,,,369,369,369,369,369,369,,,,369,369,378,378,378', +',378,,,,378,378,,,,378,,378,378,378,378,378,378,378,,,,,378,378,378', +'378,378,378,378,,,,,,,,,,378,,,378,378,378,378,378,378,378,378,378,378', +',378,378,,378,378,378,,,,,,,,,,,,,,,,,,,,378,,,378,378,,378,378,,,378', +',378,,378,,378,,,,,,,,378,,,,,378,378,378,378,378,378,,,,378,378,385', +'385,385,,385,,,,385,385,,,,385,,385,385,385,385,385,385,385,,,,,385', +'385,385,385,385,385,385,,,,,,,,,,385,,,385,385,385,385,385,385,385,385', +'385,385,,385,385,,385,385,385,,,,,,,,,,,,,,,,,,,,385,,,385,385,,385', +'385,,,385,,385,,385,,385,,,,,,,,385,,,,,385,385,385,385,385,385,,,,385', +'385,386,386,386,,386,,,,386,386,,,,386,,386,386,386,386,386,386,386', +',,,,386,386,386,386,386,386,386,,,,,,,,,,386,,,386,386,386,386,386,386', +'386,386,386,386,,386,386,,386,386,386,,,,,,,,,,,,,,,,,,,,386,,,386,386', +',386,386,,,386,,386,,386,,386,,,,,,,,386,,,,,386,386,386,386,386,386', +',,,386,386,393,393,393,,393,,,,393,393,,,,393,,393,393,393,393,393,393', +'393,,,,,393,393,393,393,393,393,393,,,,,,,,,,393,,,393,393,393,393,393', +'393,393,393,393,393,,393,393,,393,393,393,,,,,,,,,,,,,,,,,,,,393,,,393', +',,393,393,,,393,,393,,,,393,,,,,,,,393,,,,,393,393,393,393,393,393,', +',,393,393,395,395,395,,395,,,,395,395,,,,395,,395,395,395,395,395,395', +'395,,,,,395,395,395,395,395,395,395,,,,,,,,,,395,,,395,395,395,395,395', +'395,395,395,395,395,,395,395,,395,395,395,,,,,,,,,,,,,,,,,,,,395,,,395', +',,395,395,,,395,,,,,,395,,,,,,,,395,,,,,395,395,395,395,395,395,,,,395', +'395,396,396,396,,396,,,,396,396,,,,396,,396,396,396,396,396,396,396', +',,,,396,396,396,396,396,396,396,,,,,,,,,,396,,,396,396,396,396,396,396', +'396,396,396,396,,396,396,,396,396,396,,,,,,,,,,,,,,,,,,,,396,,,396,', +',396,396,,,396,,,,,,396,,,,,,,,396,,,,,396,396,396,396,396,396,,,,396', +'396,397,397,397,,397,,,,397,397,,,,397,,397,397,397,397,397,397,397', +',,,,397,397,397,397,397,397,397,,,,,,,,,,397,,,397,397,397,397,397,397', +'397,397,397,397,,397,397,,397,397,397,,,,,,,,,,,,,,,,,,,,397,,,397,', +',397,397,,,397,,,,,,397,,,,,,,,397,,,,,397,397,397,397,397,397,,,,397', +'397,426,426,426,,426,,,,426,426,,,,426,,426,426,426,426,426,426,426', +',,,,426,426,426,426,426,426,426,,,,,,,,,,426,,,426,426,426,426,426,426', +'426,426,426,426,,426,426,,426,426,426,,,,,,,,,,,,,,,,,,,,426,,,426,', +',426,426,,,426,,426,,426,,426,,,,,,,,426,,,,,426,426,426,426,426,426', +',,,426,426,428,428,428,,428,,,,428,428,,,,428,,428,428,428,428,428,428', +'428,,,,,428,428,428,428,428,428,428,,,,,,,,,,428,,,428,428,428,428,428', +'428,428,428,428,428,,428,428,,428,428,428,,,,,,,,,,,,,,,,,,,,428,,,428', +',,428,428,,,428,,428,,428,,428,,,,,,,,428,,,,,428,428,428,428,428,428', +',,,428,428,431,431,431,,431,,,,431,431,,,,431,,431,431,431,431,431,431', +'431,,,,,431,431,431,431,431,431,431,,,,,,,,,,431,,,431,431,431,431,431', +'431,431,431,431,431,,431,431,,431,431,431,,,,,,,,,,,,,,,,,,,,431,,,431', +',,431,431,,,431,,,,,,431,,,,,,,,431,,,,,431,431,431,431,431,431,,,,431', +'431,445,445,445,,445,,,,445,445,,,,445,,445,445,445,445,445,445,445', +',,,,445,445,445,445,445,445,445,,,445,,,,,,,445,,,445,445,445,445,445', +'445,445,445,445,445,,445,445,,445,445,445,,,,,,,,,,,,,,,,,,,,445,,,445', +',,445,445,,,445,,445,,445,,445,,,,,,,,445,,,,,445,445,445,445,445,445', +',,,445,445,456,456,456,,456,,,,456,456,,,,456,,456,456,456,456,456,456', +'456,,,,,456,456,456,456,456,456,456,,,,,,,,,,456,,,456,456,456,456,456', +'456,456,456,456,456,,456,456,,456,456,456,,,,,,,,,,,,,,,,,,,,456,,,456', +',,456,456,,,456,,456,,,,456,,,,,,,,456,,,,,456,456,456,456,456,456,', +',,456,456,463,463,463,,463,,,,463,463,,,,463,,463,463,463,463,463,463', +'463,,,,,463,463,463,463,463,463,463,,,,,,,,,,463,,,463,463,463,463,463', +'463,463,463,463,463,,463,463,,463,463,463,,,,,,,,,,,,,,,,,,,,463,,,463', +',,463,463,,,463,,,,,,463,,,,,,,,463,,,,,463,463,463,463,463,463,,,,463', +'463,464,464,464,,464,,,,464,464,,,,464,,464,464,464,464,464,464,464', +',,,,464,464,464,464,464,464,464,,,,,,,,,,464,,,464,464,464,464,464,464', +'464,464,464,464,,464,464,,464,464,464,,,,,,,,,,,,,,,,,,,,464,,,464,', +',464,464,,,464,,,,,,464,,,,,,,,464,,,,,464,464,464,464,464,464,,,,464', +'464,465,465,465,,465,,,,465,465,,,,465,,465,465,465,465,465,465,465', +',,,,465,465,465,465,465,465,465,,,,,,,,,,465,,,465,465,465,465,465,465', +'465,465,465,465,,465,465,,465,465,465,,,,,,,,,,,,,,,,,,,,465,,,465,', +',465,465,,,465,,,,,,465,,,,,,,,465,,,,,465,465,465,465,465,465,,,,465', +'465,469,469,469,,469,,,,469,469,,,,469,,469,469,469,469,469,469,469', +',,,,469,469,469,469,469,469,469,,,469,,,,,,,469,,,469,469,469,469,469', +'469,469,469,469,469,,469,469,,469,469,469,,,,,,,,,,,,,,,,,,,,469,,,469', +',,469,469,,,469,,,,,,469,,,,,,,,469,,,,,469,469,469,469,469,469,,,,469', +'469,471,471,471,,471,,,,471,471,,,,471,,471,471,471,471,471,471,471', +',,,,471,471,471,471,471,471,471,,,,,,,,,,471,,,471,471,471,471,471,471', +'471,471,471,471,,471,471,,471,471,471,,,,,,,,,,,,,,,,,,,,471,,,471,', +',471,471,,,471,,471,,,,471,,,,,,,,471,,,,,471,471,471,471,471,471,,', +',471,471,476,476,476,,476,,,,476,476,,,,476,,476,476,476,476,476,476', +'476,,,,,476,476,476,476,476,476,476,,,,,,,,,,476,,,476,476,476,476,476', +'476,476,476,476,476,,476,476,,476,476,476,,,,,,,,,,,,,,,,,,,,476,,,476', +',,476,476,,,476,,476,,,,476,,,,,,,,476,,,,,476,476,476,476,476,476,', +',,476,476,479,479,479,,479,,,,479,479,,,,479,,479,479,479,479,479,479', +'479,,,,,479,479,479,479,479,479,479,,,,,,,,,,479,,,479,479,479,479,479', +'479,479,479,479,479,,479,479,,479,479,479,,,,,,,,,,,,,,,,,,,,479,,,479', +',,479,479,,,479,,,,,,479,,,,,,,,479,,,,,479,479,479,479,479,479,,,,479', +'479,482,482,482,,482,,,,482,482,,,,482,,482,482,482,482,482,482,482', +',,,,482,482,482,482,482,482,482,,,,,,,,,,482,,,482,482,482,482,482,482', +'482,482,482,482,,482,482,,482,482,482,,,,,,,,,,,,,,,,,,,,482,,,482,', +',482,482,,,482,,,,,,482,,,,,,,,482,,,,,482,482,482,482,482,482,,,,482', +'482,496,496,496,,496,,,,496,496,,,,496,,496,496,496,496,496,496,496', +',,,,496,496,496,496,496,496,496,,,,,,,,,,496,,,496,496,496,496,496,496', +'496,496,496,496,,496,496,,496,496,496,,,,,,,,,,,,,,,,,,,,496,,,496,', +',496,496,,,496,,496,,,,496,,,,,,,,496,,,,,496,496,496,496,496,496,,', +',496,496,497,497,497,,497,,,,497,497,,,,497,,497,497,497,497,497,497', +'497,,,,,497,497,497,497,497,497,497,,,,,,,,,,497,,,497,497,497,497,497', +'497,497,497,497,497,,497,497,,497,497,497,,,,,,,,,,,,,,,,,,,,497,,,497', +',,497,497,,,497,,497,,,,497,,,,,,,,497,,,,,497,497,497,497,497,497,', +',,497,497,506,506,506,,506,,,,506,506,,,,506,,506,506,506,506,506,506', +'506,,,,,506,506,506,506,506,506,506,,,,,,,,,,506,,,506,506,506,506,506', +'506,506,506,506,506,,506,506,,506,506,506,,,,,,,,,,,,,,,,,,,,506,,,506', +',,506,506,,,506,,506,,,,506,,,,,,,,506,,,,,506,506,506,506,506,506,', +',,506,506,510,510,510,,510,,,,510,510,,,,510,,510,510,510,510,510,510', +'510,,,,,510,510,510,510,510,510,510,,,510,,,,,,,510,,,510,510,510,510', +'510,510,510,510,510,510,,510,510,,510,510,510,,,,,,,,,,,,,,,,,,,,510', +',,510,,,510,510,,,510,,,,,,510,,,,,,,,510,,,,,510,510,510,510,510,510', +',,,510,510,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534', +'534,534,534,534,534,534,534,534,534,,,534,534,534,534,534,534,534,534', +'534,534,,,,,,534,534,534,534,534,534,534,534,,,534,,,,,,,,534,534,,534', +'534,534,534,,534,534,,,534,,,,,534,534,534,534,,,,,,,,,,,,,,534,534', +',534,534,534,534,534,534,534,534,534,,534,,,534,534,,,537,537,537,,537', +',,534,537,537,,,,537,,537,537,537,537,537,537,537,,,,,537,537,537,537', +'537,537,537,,,,,,,,,,537,,,537,537,537,537,537,537,537,537,537,537,', +'537,537,,537,537,537,,,,,,,,,,,,,,,,,,,,537,,,537,,,537,537,,,537,,', +',,,537,,,,,,,,537,,,,,537,537,537,537,537,537,,,,537,537,538,538,538', +',538,,,,538,538,,,,538,,538,538,538,538,538,538,538,,,,,538,538,538', +'538,538,538,538,,,,,,,,,,538,,,538,538,538,538,538,538,538,538,538,538', +',538,538,,538,538,538,,,,,,,,,,,,,,,,,,,,538,,,538,,,538,538,,,538,', +'538,,,,538,,,,,,,,538,,,,,538,538,538,538,538,538,,,,538,538,541,541', +'541,,541,,,,541,541,,,,541,,541,541,541,541,541,541,541,,,,,541,541', +'541,541,541,541,541,,,,,,,,,,541,,,541,541,541,541,541,541,541,541,541', +'541,,541,541,,541,541,541,,,,,,,,,,,,,,,,,,,,541,,,541,,,541,541,,,541', +',,,,,541,,,,,,,,541,,,,,541,541,541,541,541,541,,,,541,541,542,542,542', +',542,,,,542,542,,,,542,,542,542,542,542,542,542,542,,,,,542,542,542', +'542,542,542,542,,,,,,,,,,542,,,542,542,542,542,542,542,542,542,542,542', +',542,542,,542,542,542,,,,,,,,,,,,,,,,,,,,542,,,542,,,542,542,,,542,', +',,,,542,,,,,,,,542,,,,,542,542,542,542,542,542,,,,542,542,546,546,546', +',546,,,,546,546,,,,546,,546,546,546,546,546,546,546,,,,,546,546,546', +'546,546,546,546,,,,,,,,,,546,,,546,546,546,546,546,546,546,546,546,546', +',546,546,,546,546,546,,,,,,,,,,,,,,,,,,,,546,,,546,,,546,546,,,546,', +',,,,546,,,,,,,,546,,,,,546,546,546,546,546,546,,,,546,546,549,549,549', +',549,,,,549,549,,,,549,,549,549,549,549,549,549,549,,,,,549,549,549', +'549,549,549,549,,,,,,,,,,549,,,549,549,549,549,549,549,549,549,549,549', +',549,549,,549,549,549,,,,,,,,,,,,,,,,,,,,549,,,549,,,549,549,,,549,', +',,,,549,,,,,,,,549,,,,,549,549,549,549,549,549,,,,549,549,556,556,556', +',556,,,,556,556,,,,556,,556,556,556,556,556,556,556,,,,,556,556,556', +'556,556,556,556,,,,,,,,,,556,,,556,556,556,556,556,556,556,556,556,556', +',556,556,,556,556,556,,,,,,,,,,,,,,,,,,,,556,,,556,,,556,556,,,556,', +',,,,556,,,,,,,,556,,,,,556,556,556,556,556,556,,,,556,556,557,557,557', +',557,,,,557,557,,,,557,,557,557,557,557,557,557,557,,,,,557,557,557', +'557,557,557,557,,,,,,,,,,557,,,557,557,557,557,557,557,557,557,557,557', +',557,557,,,,557,,,,,,,,,,,,,,,,,,,,557,,,557,,,557,557,,,557,,557,,557', +',,,,,,,,557,,,,,,557,557,557,557,557,557,,,,557,557,560,560,560,,560', +',,,560,560,,,,560,,560,560,560,560,560,560,560,,,,,560,560,560,560,560', +'560,560,,,,,,,,,,560,,,560,560,560,560,560,560,560,560,560,560,,560', +'560,,560,560,560,,,,,,,,,,,,,,,,,,,,560,,,560,,,560,560,,,560,,,,,,560', +',,,,,,,560,,,,,560,560,560,560,560,560,,,,560,560,564,564,564,,564,', +',,564,564,,,,564,,564,564,564,564,564,564,564,,,,,564,564,564,564,564', +'564,564,,,,,,,,,,564,,,564,564,564,564,564,564,564,564,564,564,,564', +'564,,564,564,564,,,,,,,,,,,,,,,,,,,,564,,,564,,,564,564,,,564,,,,,,564', +',,,,,,,564,,,,,564,564,564,564,564,564,,,,564,564,580,580,580,,580,', +',,580,580,,,,580,,580,580,580,580,580,580,580,,,,,580,580,580,580,580', +'580,580,,,,,,,,,,580,,,580,580,580,580,580,580,580,580,580,580,,580', +'580,,580,580,580,,,,,,,,,,,,,,,,,,,,580,,,580,,,580,580,,,580,,580,', +'580,,580,,,,,,,,580,,,,,580,580,580,580,580,580,,,,580,580,584,584,584', +',584,,,,584,584,,,,584,,584,584,584,584,584,584,584,,,,,584,584,584', +'584,584,584,584,,,,,,,,,,584,,,584,584,584,584,584,584,584,584,584,584', +',584,584,,584,584,584,,,,,,,,,,,,,,,,,,,,584,,,584,,,584,584,,,584,', +',,,,584,,,,,,,,584,,,,,584,584,584,584,584,584,,,,584,584,612,612,612', +',612,,,,612,612,,,,612,,612,612,612,612,612,612,612,,,,,612,612,612', +'612,612,612,612,,,,,,,,,,612,,,612,612,612,612,612,612,612,612,612,612', +',612,612,,612,612,612,,,,,,,,,,,,,,,,,,,,612,,,612,,,612,612,,,612,', +',,,,612,,,,,,,,612,,,,,612,612,612,612,612,612,,,,612,612,628,628,628', +',628,,,,628,628,,,,628,,628,628,628,628,628,628,628,,,,,628,628,628', +'628,628,628,628,,,,,,,,,,628,,,628,628,628,628,628,628,628,628,628,628', +',628,628,,628,628,628,,,,,,,,,,,,,,,,,,,,628,,,628,,,628,628,,,628,', +',,,,628,,,,,,,,628,,,,,628,628,628,628,628,628,,,,628,628,634,634,634', +',634,,,,634,634,,,,634,,634,634,634,634,634,634,634,,,,,634,634,634', +'634,634,634,634,,,634,,,,,,,634,,,634,634,634,634,634,634,634,634,634', +'634,,634,634,,634,634,634,,,,,,,,,,,,,,,,,,,,634,,,634,,,634,634,,,634', +',,,,,634,,,,,,,,634,,,,,634,634,634,634,634,634,,,,634,634,679,679,679', +',679,,,,679,679,,,,679,,679,679,679,679,679,679,679,,,,,679,679,679', +'679,679,679,679,,,,,,,,,,679,,,679,679,679,679,679,679,679,679,679,679', +',679,679,,679,679,679,,,,,,,,,,,,,,,,,,,,679,,,679,,,679,679,,,679,', +',,,,679,,,,,,,,679,,,,,679,679,679,679,679,679,,,,679,679,680,680,680', +',680,,,,680,680,,,,680,,680,680,680,680,680,680,680,,,,,680,680,680', +'680,680,680,680,,,,,,,,,,680,,,680,680,680,680,680,680,680,680,680,680', +',680,680,,680,680,680,,,,,,,,,,,,,,,,,,,,680,,,680,,,680,680,,,680,', +',,,,680,,,,,,,,680,,,,,680,680,680,680,680,680,,,,680,680,690,690,690', +',690,,,,690,690,,,,690,,690,690,690,690,690,690,690,,,,,690,690,690', +'690,690,690,690,,,,,,,,,,690,,,690,690,690,690,690,690,690,690,690,690', +',690,690,,690,690,690,,,,,,,,,,,,,,,,,,,,690,,,690,,,690,690,,,690,', +',,,,690,,,,,,,,690,,,,,690,690,690,690,690,690,,,,690,690,691,691,691', +',691,,,,691,691,,,,691,,691,691,691,691,691,691,691,,,,,691,691,691', +'691,691,691,691,,,,,,,,,,691,,,691,691,691,691,691,691,691,691,691,691', +',691,691,,691,691,691,,,,,,,,,,,,,,,,,,,,691,,,691,,,691,691,,,691,', +',,,,691,,,,,,,,691,,,,,691,691,691,691,691,691,,,,691,691,692,692,692', +',692,,,,692,692,,,,692,,692,692,692,692,692,692,692,,,,,692,692,692', +'692,692,692,692,,,,,,,,,,692,,,692,692,692,692,692,692,692,692,692,692', +',692,692,,692,692,692,,,,,,,,,,,,,,,,,,,,692,,,692,,,692,692,,,692,', +',,,,692,,,,,,,,692,,,,,692,692,692,692,692,692,,,,692,692,698,698,698', +',698,,,,698,698,,,,698,,698,698,698,698,698,698,698,,,,,698,698,698', +'698,698,698,698,,,,,,,,,,698,,,698,698,698,698,698,698,698,698,698,698', +',698,698,,,,698,,600,600,600,600,600,600,600,600,600,600,600,,600,600', +',,600,600,698,,,698,,,698,698,,,698,,,,600,,600,,600,600,600,600,600', +'600,600,,600,,,698,698,698,698,698,698,,,,698,698,704,704,704,600,704', +',,,704,704,,,,704,,704,704,704,704,704,704,704,,,,,704,704,704,704,704', +'704,704,,,,,,,,,,704,,,704,704,704,704,704,704,704,704,704,704,,704', +'704,,704,704,704,,,,,,,,,,,,,,,,,,,,704,,,704,,,704,704,,,704,,704,', +'704,,704,,,,,,,,704,,,,,704,704,704,704,704,704,,,,704,704,713,713,713', +',713,,,,713,713,,,,713,,713,713,713,713,713,713,713,,,,,713,713,713', +'713,713,713,713,,,,,,,,,,713,,,713,713,713,713,713,713,713,713,713,713', +',713,713,,713,713,713,,,,,,,,,,,,,,,,,,,,713,,,713,,,713,713,,,713,', +'713,,713,,713,,,,,,,,713,,,,,713,713,713,713,713,713,,,,713,713,715', +'715,715,,715,,,,715,715,,,,715,,715,715,715,715,715,715,715,,,,,715', +'715,715,715,715,715,715,,,,,,,,,,715,,,715,715,715,715,715,715,715,715', +'715,715,,715,715,,715,715,715,,,,,,,,,,,,,,,,,,,,715,,,715,,,715,715', +',,715,,715,,715,,715,,,,,,,,715,,,,,715,715,715,715,715,715,,,,715,715', +'728,728,728,,728,,,,728,728,,,,728,,728,728,728,728,728,728,728,,,,', +'728,728,728,728,728,728,728,,,,,,,,,,728,,,728,728,728,728,728,728,728', +'728,728,728,,728,728,,,,728,,677,677,677,677,677,677,677,677,677,677', +'677,,677,677,,,677,677,728,,,728,,,728,728,,,728,,,,677,,677,,677,677', +'677,677,677,677,677,,677,,,728,728,728,728,728,728,,,,728,728,734,734', +'734,677,734,,,,734,734,,,,734,,734,734,734,734,734,734,734,,,,,734,734', +'734,734,734,734,734,,,734,,,,,,,734,,,734,734,734,734,734,734,734,734', +'734,734,,734,734,,734,734,734,,,,,,,,,,,,,,,,,,,,734,,,734,,,734,734', +',,734,,,,,,734,,,,,,,,734,,,,,734,734,734,734,734,734,,,,734,734,740', +'740,740,,740,,,,740,740,,,,740,,740,740,740,740,740,740,740,,,,,740', +'740,740,740,740,740,740,,,,,,,,,,740,,,740,740,740,740,740,740,740,740', +'740,740,,740,740,,740,740,740,,,,,,,,,,,,,,,,,,,,740,,,740,,,740,740', +',,740,,740,,,,740,,,,,,,,740,,,,,740,740,740,740,740,740,,,,740,740', +'759,759,759,,759,,,,759,759,,,,759,,759,759,759,759,759,759,759,,,,', +'759,759,759,759,759,759,759,,,,,,,,,,759,,,759,759,759,759,759,759,759', +'759,759,759,,759,759,,759,759,759,,,,,,,,,,,,,,,,,,,,759,,,759,,,759', +'759,,,759,,,,,,759,,,,,,,,759,,,,,759,759,759,759,759,759,,,,759,759', +'768,768,768,,768,,,,768,768,,,,768,,768,768,768,768,768,768,768,,,,', +'768,768,768,768,768,768,768,,,,,,,,,,768,,,768,768,768,768,768,768,768', +'768,768,768,,768,768,,768,768,768,,,,,,,,,,,,,,,,,,,,768,,,768,,,768', +'768,,,768,,,,,,768,,,,,,,,768,,,,,768,768,768,768,768,768,,,,768,768', +'769,769,769,,769,,,,769,769,,,,769,,769,769,769,769,769,769,769,,,,', +'769,769,769,769,769,769,769,,,,,,,,,,769,,,769,769,769,769,769,769,769', +'769,769,769,,769,769,,,,769,,,,,,,,,,,,,,,,,,,,769,,,769,,,769,769,', +',769,,769,,769,,,,,,,,,,,,,,,769,769,769,769,769,769,,,,769,769,780', +'780,780,,780,,,,780,780,,,,780,,780,780,780,780,780,780,780,,,,,780', +'780,780,780,780,780,780,,,,,,,,,,780,,,780,780,780,780,780,780,780,780', +'780,780,,780,780,,780,780,780,,,,,,,,,,,,,,,,,,,,780,,,780,,,780,780', +',,780,,,,,,780,,,,,,,,780,,,,,780,780,780,780,780,780,,,,780,780,786', +'786,786,,786,,,,786,786,,,,786,,786,786,786,786,786,786,786,,,,,786', +'786,786,786,786,786,786,,,,,,,,,,786,,,786,786,786,786,786,786,786,786', +'786,786,,786,786,,786,786,786,,,,,,,,,,,,,,,,,,,,786,,,786,,,786,786', +',,786,,,,,,786,,,,,,,,786,,,,,786,786,786,786,786,786,,,,786,786,788', +'788,788,,788,,,,788,788,,,,788,,788,788,788,788,788,788,788,,,,,788', +'788,788,788,788,788,788,,,,,,,,,,788,,,788,788,788,788,788,788,788,788', +'788,788,,788,788,,788,788,788,,,,,,,,,,,,,,,,,,,,788,,,788,,,788,788', +',,788,,,,,,788,,,,,,,,788,,,,,788,788,788,788,788,788,,,,788,788,802', +'802,802,,802,,,,802,802,,,,802,,802,802,802,802,802,802,802,,,,,802', +'802,802,802,802,802,802,,,,,,,,,,802,,,802,802,802,802,802,802,802,802', +'802,802,,802,802,,802,802,802,,,,,,,,,,,,,,,,,,,,802,,,802,,,802,802', +',,802,,,,,,802,,,,,,,,802,,,,,802,802,802,802,802,802,,,,802,802,820', +'820,820,,820,,,,820,820,,,,820,,820,820,820,820,820,820,820,,,,,820', +'820,820,820,820,820,820,,,,,,,,,,820,,,820,820,820,820,820,820,820,820', +'820,820,,820,820,,,,820,,682,682,682,682,682,682,682,682,682,682,682', +',682,682,,,682,682,820,,,820,,,820,820,,,820,,,,682,,682,,682,682,682', +'682,682,682,682,,682,,,820,820,820,820,820,820,,,,820,820,822,822,822', +'682,822,,,,822,822,,,,822,,822,822,822,822,822,822,822,,,,,822,822,822', +'822,822,822,822,,,,,,,,,,822,,,822,822,822,822,822,822,822,822,822,822', +',822,822,,822,822,822,,,,,,,,,,,,,,,,,,,,822,,,822,,,822,822,,,822,', +'822,,,,822,,,,,,,,822,,,,,822,822,822,822,822,822,,,,822,822,827,827', +'827,,827,,,,827,827,,,,827,,827,827,827,827,827,827,827,,,,,827,827', +'827,827,827,827,827,,,,,,,,,,827,,,827,827,827,827,827,827,827,827,827', +'827,,827,827,,,,827,,684,684,684,684,684,684,684,684,684,684,684,,684', +'684,,,684,684,827,,,827,,,827,827,,,827,,,,684,,684,,684,684,684,684', +'684,684,684,,684,,,827,827,827,827,827,827,,,,827,827,832,832,832,684', +'832,,,,832,832,,,,832,,832,832,832,832,832,832,832,,,,,832,832,832,832', +'832,832,832,,,,,,,,,,832,,,832,832,832,832,832,832,832,832,832,832,', +'832,832,,832,832,832,,,,,,,,,,,,,,,,,,,,832,,,832,,,832,832,,,832,,832', +',832,,832,,,,,,,,832,,,,,832,832,832,832,832,832,,,,832,832,835,835', +'835,,835,,,,835,835,,,,835,,835,835,835,835,835,835,835,,,,,835,835', +'835,835,835,835,835,,,,,,,,,,835,,,835,835,835,835,835,835,835,835,835', +'835,,835,835,,835,835,835,,,,,,,,,,,,,,,,,,,,835,,,835,,,835,835,,,835', +',835,,835,,835,,,,,,,,835,,,,,835,835,835,835,835,835,,,,835,835,861', +'861,861,,861,,,,861,861,,,,861,,861,861,861,861,861,861,861,,,,,861', +'861,861,861,861,861,861,,,,,,,,,,861,,,861,861,861,861,861,861,861,861', +'861,861,,861,861,,,,861,,687,687,687,687,687,687,687,687,687,687,687', +',687,687,,,687,687,861,,,861,,,861,861,,,861,,,,687,,687,,687,687,687', +'687,687,687,687,,687,,,861,861,861,861,861,861,,,,861,861,864,864,864', +'687,864,,,,864,864,,,,864,,864,864,864,864,864,864,864,,,,,864,864,864', +'864,864,864,864,,,,,,,,,,864,,,864,864,864,864,864,864,864,864,864,864', +',864,864,,864,864,864,,,,,,,,,,,,,,,,,,,,864,,,864,,,864,864,,,864,', +',,,,864,,,,,,,,864,,,,,864,864,864,864,864,864,,,,864,864,867,867,867', +',867,,,,867,867,,,,867,,867,867,867,867,867,867,867,,,,,867,867,867', +'867,867,867,867,,,,,,,,,,867,,,867,867,867,867,867,867,867,867,867,867', +',867,867,,867,867,867,,,,,,,,,,,,,,,,,,,,867,,,867,,,867,867,,,867,', +',,,,867,,,,,,,,867,,,,,867,867,867,867,867,867,,,,867,867,875,875,875', +',875,,,,875,875,,,,875,,875,875,875,875,875,875,875,,,,,875,875,875', +'875,875,875,875,,,,,,,,,,875,,,875,875,875,875,875,875,875,875,875,875', +',875,875,,,,875,,689,689,689,689,689,689,689,689,689,689,689,,689,689', +',,689,689,875,,,875,,,875,875,,,875,,,,689,,689,,689,689,689,689,689', +'689,689,,689,,,875,875,875,875,875,875,,,,875,875,880,880,880,689,880', +',,,880,880,,,,880,,880,880,880,880,880,880,880,,,,,880,880,880,880,880', +'880,880,,,,,,,,,,880,,,880,880,880,880,880,880,880,880,880,880,,880', +'880,,880,880,880,,,,,,,,,,,,,,,,,,,,880,,,880,,,880,880,,,880,,880,', +'880,,880,,,,,,,,880,,,,,880,880,880,880,880,880,,,,880,880,886,886,886', +',886,,,,886,886,,,,886,,886,886,886,886,886,886,886,,,,,886,886,886', +'886,886,886,886,,,,,,,,,,886,,,886,886,886,886,886,886,886,886,886,886', +',886,886,,,,886,,694,694,694,694,694,694,694,694,694,694,694,,694,694', +',,694,694,886,,,886,,,886,886,,,886,,,,694,,694,,694,694,694,694,694', +'694,694,,694,,,886,886,886,886,886,886,,,,886,886,889,889,889,694,889', +',,,889,889,,,,889,,889,889,889,889,889,889,889,,,,,889,889,889,889,889', +'889,889,,,,,,,,,,889,,,889,889,889,889,889,889,889,889,889,889,,889', +'889,,889,889,889,,,,,,,,,,,,,,,,,,,,889,,,889,,,889,889,,,889,,,,,,889', +',,,,,,,889,,,,,889,889,889,889,889,889,,,,889,889,64,64,64,64,64,64', +'64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,,,64,64,64,64', +'64,64,64,64,64,64,,,,,,64,64,64,64,64,64,64,64,64,64,64,64,,,,,,,64', +'64,,64,64,64,64,,64,64,,,64,,,,,64,64,64,64,,,,,,64,,,,,,,,64,64,,64', +'64,64,64,64,64,64,64,64,,64,,,64,664,664,664,664,664,664,664,664,664', +'664,664,664,664,664,664,664,664,664,664,664,664,664,664,664,,,664,664', +'664,664,664,664,664,664,664,664,,,,,,664,664,664,664,664,664,664,664', +',,664,,,,,,,,664,664,,664,664,664,664,,664,664,,,664,,,,,664,664,664', +'664,,,,,,,,,,,,,,664,664,,664,664,664,664,664,664,664,664,664,,664,', +',664,581,581,581,581,581,581,581,581,581,581,581,,581,581,,,581,581', +',,,581,,,,,,,,,,,581,,581,,581,581,581,581,581,581,581,,581,,,,,,,,192', +'192,,,192,,,,,581,,581,192,192,,192,192,192,192,,192,192,,,192,,,,,192', +'192,192,192,,,,,,,,,,,,,,192,192,,192,192,192,192,192,192,192,192,192', +',192,193,193,192,,193,,,,,,,,193,193,,193,193,193,193,,193,193,,,193', +',,,,193,193,193,193,,,,,,,,,,,,,,193,193,,193,193,193,193,193,193,193', +'193,193,,193,251,251,193,,251,,,,,,,,251,251,,251,251,251,251,,251,251', +',,251,,,,,251,251,251,251,,,,,,,,,,,,,,251,251,,251,251,251,251,251', +'251,251,251,251,,251,252,252,251,,252,,,,,,,,252,252,,252,252,252,252', +',252,252,,,252,,,,,252,252,252,252,,,,,,,,,,,,,,252,252,,252,252,252', +'252,252,252,252,252,252,,252,391,391,252,,391,,,,,,,,391,391,,391,391', +'391,391,,391,391,,,391,,,,,391,391,391,391,,,,,,,,,,,,,,391,391,,391', +'391,391,391,391,391,391,391,391,,391,392,392,391,,392,,,,,,,,392,392', +',392,392,392,392,,392,392,,,392,,,,,392,392,392,392,,,,,,,,,,,,,,392', +'392,,392,392,392,392,392,392,392,392,392,,392,,,392,423,423,423,423', +'423,423,423,423,423,423,423,,423,423,,,423,423,,,,,,,,,,,,,,,423,,423', +',423,423,423,423,423,423,423,,423,,,,,,,457,457,,,457,,,,,,423,423,457', +'457,,457,457,457,457,,457,457,,,457,,,,,457,457,457,457,,,,,,,,,,,,', +',457,457,,457,457,457,457,457,457,457,457,457,,457,458,458,457,,458', +',,,,,,,458,458,,458,458,458,458,,458,458,,,458,,,,,458,458,458,458,', +',,,,,,,,,,,,458,458,,458,458,458,458,458,458,458,458,458,,458,466,466', +'458,,466,,,,,,,,466,466,,466,466,466,466,,466,466,,,466,,,,,466,466', +'466,466,,,,,,,,,,,,,,466,466,,466,466,466,466,466,466,466,466,466,,466', +'467,467,466,,467,,,,,,,,467,467,,467,467,467,467,,467,467,,,467,,,,', +'467,467,467,467,,,,,,,,,,,,,,467,467,,467,467,467,467,467,467,467,467', +'467,,467,498,498,467,,498,,,,,,,,498,498,,498,498,498,498,,498,498,', +',498,,,,,498,498,498,498,,,,,,,,,,,,,,498,498,,498,498,498,498,498,498', +'498,498,498,,498,499,499,498,,499,,,,,,,,499,499,,499,499,499,499,,499', +'499,,,499,,,,,499,499,499,499,,,,,,,,,,,,,,499,499,,499,499,499,499', +'499,499,499,499,499,,499,505,505,499,,505,,,,,,,,505,505,,505,505,505', +'505,,505,505,,,505,,,,,505,505,505,505,,,,,,,,,,,,,,505,505,,505,505', +'505,505,505,505,505,505,505,,505,507,507,505,,507,,,,,,,,507,507,,507', +'507,507,507,,507,507,,,507,,,,,507,507,507,507,,,,,,,,,,,,,,507,507', +',507,507,507,507,507,507,507,507,507,,507,578,578,507,,578,,,,,,,,578', +'578,,578,578,578,578,,578,578,,,578,,,,,578,578,578,578,,,,,,,,,,,,', +',578,578,,578,578,578,578,578,578,578,578,578,,578,579,579,578,,579', +',,,,,,,579,579,,579,579,579,579,,579,579,,,579,,,,,579,579,579,579,', +',,,,,,,,,,,,579,579,,579,579,579,579,579,579,579,579,579,,579,823,823', +'579,,823,,,,,,,,823,823,,823,823,823,823,,823,823,,,823,,,,,823,823', +'823,823,,,,,,,,,,,,,,823,823,,823,823,823,823,823,823,823,823,823,,823', +'824,824,823,,824,,,,,,,,824,824,,824,824,824,824,,824,824,,,824,,,,', +'824,824,824,824,,,,,,,,,,,,,,824,824,,824,824,824,824,824,824,824,824', +'824,,824,,,824,480,480,480,480,480,480,480,480,480,480,480,,480,480', +',,480,480,,,,,,,,,,,,,,,480,,480,,480,480,480,480,480,480,480,,480,', +'731,731,731,731,731,731,731,731,731,731,731,,731,731,480,480,731,731', +',,,,,,,,,,,,,,731,,731,,731,731,731,731,731,731,731,,731,,767,767,767', +'767,767,767,767,767,767,767,767,,767,767,731,731,767,767,,,,,,,,,,,', +',,,767,,767,,767,767,767,767,767,767,767,,767,,,,,,,,,,,,,,,,,767' ] + racc_action_check = arr = ::Array.new(24340, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 1233, 30, nil, -98, 863, 4770, 4891, 5012, -53, 2, + 71, 90, 160, 218, 174, 130, nil, 5125, 5246, 6094, + 234, nil, 5367, 5488, 5609, 292, 138, 5730, 5851, nil, + 1355, 5972, 6093, nil, 146, 316, 245, 346, 6214, 6335, + 6456, 183, 300, nil, nil, nil, nil, nil, nil, nil, + 214, 1477, 6577, 6698, 6819, 58, 6940, 7061, nil, nil, + 735, 7182, 7303, 7424, 22775, nil, nil, nil, nil, nil, + -92, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 7545, nil, nil, nil, 7666, nil, nil, nil, + nil, nil, nil, nil, nil, 311, nil, 863, nil, nil, + nil, 7787, 7908, 8029, 8150, 8271, 981, nil, 221, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 196, nil, 1599, 1721, 8392, 8513, + 8634, 8755, 23000, 23060, 8876, 8997, 9118, nil, 377, -67, + 279, -52, 212, 274, 1843, nil, nil, 9239, 9360, 9481, + 9602, 9723, 9844, 9965, 10086, 10207, 10328, 10449, 10570, 10691, + 10812, 10933, 11054, 11175, 11296, 11417, 11538, 11659, 11780, 11901, + 12022, 12143, 12264, 12385, nil, nil, nil, 7183, nil, 242, + 254, 12506, nil, 12627, 310, nil, nil, nil, nil, nil, + nil, 23120, 23180, 313, 12748, 12869, nil, nil, nil, nil, + nil, nil, nil, 12990, 325, 1965, 333, 352, 315, 13111, + 2087, 399, 496, 430, 520, 411, 382, 161, nil, 443, + 430, nil, nil, 335, 472, 486, 521, nil, 498, nil, + 13232, nil, 565, 566, 457, nil, 460, 119, 136, 13353, + 493, 147, 479, 244, nil, 482, -7, 8, 13474, 13595, + -67, 32, 464, -9, 522, 545, -1, 575, nil, nil, + 319, 345, 115, nil, 614, nil, 9, 13716, nil, nil, + 311, 419, 453, 456, 457, 478, 488, 499, nil, 519, + nil, 13837, nil, 149, 207, 235, 246, -35, 279, nil, + 1103, nil, nil, nil, nil, nil, nil, 13958, nil, nil, + nil, nil, 509, 511, nil, nil, 735, nil, 495, 14071, + nil, 499, nil, nil, 7304, 535, 340, 342, 14192, nil, + nil, 0, 541, 107, nil, 14313, 14434, nil, 7425, nil, + nil, 23240, 23300, 14555, -33, 14676, 14797, 14918, 614, 863, + 377, 384, 566, 574, 575, 576, 2941, 3063, 3185, 1599, + 980, 1721, 1843, 1965, 2087, 2209, 2331, 2453, 2575, 249, + 465, 2697, 2819, 23348, -48, nil, 15039, nil, 15160, 514, + nil, 15281, 321, nil, nil, 376, nil, nil, 563, 531, + -64, 529, 630, nil, nil, 15402, -27, -13, 571, nil, + 572, 544, nil, nil, nil, 586, 15523, 23414, 23474, 617, + 606, nil, nil, 15644, 15765, 15886, 23534, 23594, 13112, 16007, + 688, 16128, nil, 582, nil, nil, 16249, nil, nil, 16370, + 24122, nil, 16491, nil, nil, nil, 2209, 711, nil, nil, + 2331, 68, 109, 708, 716, 2453, 16612, 16733, 23654, 23714, + 4, nil, nil, 658, nil, 23774, 16854, 23834, nil, nil, + 16975, 100, -34, 2575, 997, nil, nil, nil, -32, nil, + nil, nil, 598, nil, nil, nil, 609, nil, 147, nil, + nil, 606, nil, nil, 17096, nil, nil, 17209, 17330, nil, + 349, 17451, 17572, 648, nil, nil, 17693, 649, nil, 17814, + 86, 115, 493, 614, 655, 1106, 17935, 18056, nil, 2697, + 18177, 621, nil, 666, 18298, nil, 674, nil, 663, nil, + nil, nil, nil, nil, 113, nil, 673, 674, 23894, 23954, + 18419, 22933, 69, 643, 18540, nil, 683, nil, 2819, 2941, + nil, 1, nil, 681, 63, 112, 687, 347, 735, 688, + 19630, 712, 714, -2, 772, nil, 3063, 654, 707, nil, + nil, 707, 18661, nil, nil, 506, nil, 800, nil, nil, + nil, nil, nil, 810, nil, 814, 700, 15, 18782, 738, + 13, 23, 25, 75, 18903, 348, 788, nil, 740, 3185, + 331, nil, nil, 835, 3307, 1284, 337, 718, 719, 726, + nil, nil, nil, nil, nil, 724, nil, nil, nil, nil, + 806, nil, nil, 809, 22885, 773, nil, nil, nil, nil, + nil, 3429, nil, nil, nil, nil, nil, 20114, 744, 19024, + 19145, nil, 21324, nil, 21566, nil, nil, 21929, nil, 22292, + 19266, 19387, 19508, 167, 22534, nil, 745, 984, 19629, nil, + 770, 868, 760, nil, 19750, 761, 3551, nil, nil, 802, + 803, -63, 871, 19871, nil, 19992, 772, nil, 832, 813, + 933, 738, nil, nil, 3673, nil, nil, 31, 20113, nil, + nil, 24168, 938, nil, 20234, 941, 3795, 3917, nil, nil, + 20355, 4039, nil, 26, 133, nil, 942, nil, 4161, nil, + 946, 836, nil, 1406, nil, -43, nil, nil, 436, 20476, + nil, nil, nil, nil, 862, nil, nil, 24214, 20597, 20718, + 863, 866, 920, 907, 847, 884, nil, nil, nil, nil, + 20839, nil, 873, 903, 869, nil, 20960, 870, 21081, nil, + nil, nil, nil, nil, 4283, nil, nil, nil, 32, nil, + 999, 1001, 21202, 332, nil, nil, 1002, nil, 936, 898, + 899, nil, nil, 900, 899, nil, nil, 1528, nil, nil, + 21323, 1106, 21444, 24014, 24074, 918, 933, 21565, 5973, nil, + nil, nil, 21686, 914, nil, 21807, 918, 1046, 4405, nil, + nil, nil, nil, nil, nil, 4527, nil, nil, 282, nil, + nil, nil, 4649, nil, 927, 959, 965, 362, 400, 482, + 977, 21928, nil, nil, 22049, 931, nil, 22170, nil, nil, + 545, 1054, 938, 1057, 972, 22291, 980, nil, 945, nil, + 22412, 948, nil, nil, nil, nil, 22533, nil, nil, 22654, + nil, nil, 952, nil ] + +racc_action_default = [ + -4, -497, -1, -485, -5, -497, -497, -497, -497, -497, + -497, -497, -497, -497, -271, -32, -33, -497, -497, -38, + -40, -41, -282, -315, -316, -45, -249, -361, -285, -58, + -4, -62, -67, -68, -497, -428, -497, -497, -497, -497, + -497, -487, -214, -264, -265, -266, -267, -268, -269, -270, + -475, -4, -497, -496, -467, -288, -497, -497, -292, -295, + -485, -497, -497, -497, -497, -317, -318, -381, -382, -383, + -384, -385, -399, -388, -401, -401, -392, -397, -411, -401, + -413, -414, -417, -418, -419, -420, -421, -422, -423, -424, + -425, -426, -427, -430, -431, -497, -3, -486, -492, -493, + -494, -497, -497, -497, -497, -497, -6, -8, -497, -93, + -94, -95, -96, -97, -98, -99, -100, -101, -105, -106, + -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, + -117, -118, -119, -120, -121, -122, -123, -124, -125, -126, + -127, -128, -129, -130, -131, -132, -133, -134, -135, -136, + -137, -138, -139, -140, -141, -142, -143, -144, -145, -146, + -147, -148, -149, -150, -151, -152, -153, -154, -155, -156, + -157, -158, -159, -160, -161, -162, -163, -164, -165, -166, + -167, -168, -169, -170, -13, -102, -4, -4, -497, -497, + -497, -496, -497, -497, -497, -497, -497, -36, -497, -428, + -497, -271, -497, -497, -4, -37, -206, -497, -497, -497, + -497, -497, -497, -497, -497, -497, -497, -497, -497, -497, + -497, -497, -497, -497, -497, -497, -497, -497, -497, -497, + -497, -497, -497, -497, -351, -353, -42, -215, -228, -258, + -258, -497, -236, -497, -259, -282, -315, -316, -470, -43, + -44, -497, -497, -50, -496, -497, -287, -356, -362, -364, + -56, -360, -57, -497, -58, -4, -497, -497, -63, -65, + -4, -72, -497, -497, -79, -285, -487, -497, -319, -361, + -497, -66, -70, -278, -415, -416, -497, -191, -192, -207, + -497, -488, -373, -497, -274, -216, -487, -489, -489, -497, + -497, -489, -497, -489, -289, -39, -497, -497, -497, -497, + -485, -497, -486, -428, -497, -497, -271, -497, -331, -332, + -88, -89, -497, -91, -497, -271, -497, -497, -428, -308, + -93, -94, -131, -132, -148, -153, -160, -163, -310, -497, + -465, -497, -386, -497, -497, -497, -497, -497, -497, 894, + -7, -495, -14, -15, -16, -17, -18, -497, -10, -11, + -12, -103, -497, -497, -21, -29, -171, -259, -497, -497, + -22, -30, -31, -23, -173, -497, -476, -477, -226, -478, + -479, -476, -249, -477, -359, -481, -482, -28, -180, -34, + -35, -497, -497, -496, -278, -497, -497, -497, -181, -182, + -183, -184, -185, -186, -187, -188, -193, -194, -195, -196, + -197, -198, -199, -200, -201, -202, -203, -204, -205, -208, + -209, -210, -211, -497, -347, -229, -497, -231, -497, -258, + -256, -497, -249, -476, -477, -249, -48, -51, -497, -487, + -487, -258, -228, -250, -251, -252, -347, -347, -497, -284, + -497, -59, -276, -71, -64, -497, -496, -497, -497, -78, + -497, -415, -416, -497, -497, -497, -497, -497, -212, -497, + -496, -496, -273, -487, -217, -218, -491, -490, -220, -491, + -487, -280, -491, -469, -281, -468, -4, -320, -321, -322, + -4, -497, -497, -497, -497, -4, -497, -496, -497, -497, + -278, -301, -88, -89, -90, -497, -496, -497, -304, -432, + -497, -497, -497, -4, -445, -312, -483, -484, -487, -387, + -400, -403, -497, -405, -389, -402, -497, -391, -497, -394, + -396, -497, -412, -9, -497, -19, -20, -497, -497, -263, + -279, -497, -497, -52, -227, -357, -497, -54, -358, -497, + -476, -477, -480, -277, -497, -171, -497, -497, -349, -4, + -497, -258, -257, -260, -497, -471, -497, -235, -497, -472, + -46, -354, -47, -355, -347, -222, -497, -497, -497, -497, + -497, -38, -497, -258, -497, -248, -497, -254, -4, -4, + -283, -59, -69, -497, -476, -477, -226, -75, -77, -497, + -179, -189, -190, -497, -496, -329, -4, -374, -496, -375, + -376, -497, -497, -260, -221, -496, -323, -496, -293, -324, + -325, -326, -296, -497, -299, -497, -367, -497, -497, -497, + -476, -477, -480, -277, -497, -88, -89, -92, -497, -4, + -497, -434, -306, -497, -4, -445, -497, -464, -464, -464, + -444, -446, -447, -448, -449, -450, -451, -454, -456, -457, + -459, -460, -461, -497, -497, -497, -404, -407, -408, -409, + -410, -4, -390, -393, -395, -398, -104, -172, -261, -497, + -497, -25, -175, -26, -176, -53, -27, -177, -55, -178, + -497, -497, -497, -279, -213, -333, -335, -345, -497, -348, + -497, -497, -258, -233, -497, -258, -4, -223, -224, -226, + -226, -487, -497, -497, -241, -497, -258, -253, -497, -497, + -497, -73, -286, -2, -4, -380, -330, -497, -497, -378, + -275, -487, -497, -327, -497, -497, -4, -4, -298, -300, + -497, -4, -369, -279, -497, -279, -497, -433, -4, -309, + -497, -487, -436, -497, -440, -497, -442, -443, -497, -497, + -458, -462, -313, -466, -497, -262, -24, -174, -497, -336, + -80, -497, -497, -87, -344, -497, -346, -350, -352, -230, + -497, -232, -497, -497, -258, -238, -497, -258, -497, -247, + -255, -363, -365, -379, -4, -377, -219, -290, -497, -291, + -497, -497, -497, -496, -302, -305, -497, -311, -497, -464, + -464, -452, -463, -464, -497, -455, -453, -445, -406, -334, + -497, -341, -496, -497, -497, -86, -497, -497, -258, -49, + -225, -237, -497, -258, -243, -497, -258, -373, -4, -294, + -297, -368, -366, -370, -371, -4, -307, -435, -497, -438, + -439, -441, -4, -337, -340, -497, -497, -82, -84, -83, + -85, -497, -343, -234, -497, -258, -239, -497, -242, -372, + -496, -497, -464, -497, -497, -497, -81, -342, -258, -244, + -497, -258, -328, -303, -437, -314, -497, -339, -240, -497, + -245, -338, -258, -246 ] + +clist = [ +'10,205,240,240,240,10,268,438,112,112,100,300,338,470,293,644,242,242', +'242,440,107,185,238,238,238,115,115,117,117,494,10,486,490,650,303,437', +'239,239,239,253,260,262,604,290,365,372,732,618,622,96,565,10,815,296', +'257,261,281,571,504,520,573,318,529,236,249,250,112,100,301,559,810', +'264,813,266,106,475,478,344,345,483,1,485,348,723,754,756,757,326,329', +'306,307,588,589,310,97,13,184,10,319,357,13,565,574,534,587,10,311,443', +'586,718,340,302,198,198,304,317,508,198,198,198,339,515,473,308,736', +'13,272,272,309,737,634,278,278,845,352,353,354,355,639,748,513,197,514', +'664,817,815,13,198,198,375,696,198,198,700,424,198,314,324,324,446,447', +'278,278,278,650,872,350,627,842,608,727,364,370,373,356,342,294,387', +'343,346,305,305,528,347,305,666,10,10,671,735,751,296,13,809,811,386', +'198,198,198,198,13,2,368,368,10,,,,,,,623,,,,,,,,706,,,,605,610,305', +'305,305,305,,,267,,,240,240,,,,,,637,,240,674,,849,850,242,242,851,', +',,442,238,,242,,,,,,238,,10,,,441,239,10,,,,,,,239,460,,,13,13,198,198', +'198,198,,,198,198,198,14,454,,439,444,14,474,13,804,882,,427,448,257', +'264,261,450,884,,264,,455,,,,100,852,389,390,,14,274,274,685,565,609', +',688,,,,509,571,573,650,565,,,,491,492,14,,711,,,,198,198,554,741,316', +'325,325,493,725,198,112,13,729,,,272,13,,,605,278,605,533,,,,843,115', +',117,,,,,,,,,362,363,14,,543,,296,386,547,,14,,,,,,198,198,267,561,', +',,548,,,,593,,,,,,,,198,,,583,,,,,,,305,305,,,198,,,585,,576,577,,,570', +',,572,,,512,794,,,629,296,565,,,386,,,,638,518,267,,,386,,267,,,,611', +'643,,14,14,,,614,,,368,10,,198,,10,,567,,,10,14,296,619,619,,386,565', +',,,296,386,,,626,,,10,,,,,641,642,665,844,,838,681,683,,,,686,,,695', +',,,112,,,,198,,,640,,,,,676,,,198,,115,,117,605,14,869,10,561,274,14', +',198,,,,,294,,,,,,,,,,,712,13,,,,13,,,10,10,13,,198,603,,,378,382,35', +',,198,746,35,,198,10,750,13,,,,762,12,,,,,12,,,,,605,703,,,548,35,271', +'271,,,,305,,198,198,,10,,198,,12,10,,714,747,,35,,,272,752,13,432,435', +'278,,313,328,328,328,766,12,,112,744,,,,10,,,,198,,,,,,,,13,13,,,615', +',,,617,,787,,35,625,774,776,,,13,,35,,,10,785,,,12,806,,783,,,,,12,', +',,,,10,,,784,795,198,,,,796,13,,10,10,,13,,10,,,819,,,,10,,,619,,808', +',,,,305,,701,,,,,779,13,798,781,,,,,,,198,,,14,789,856,,14,,35,35,,14', +',719,720,,771,771,10,378,382,278,278,12,12,13,35,,,14,,726,,,,,865,', +'670,873,,12,,13,853,854,296,771,,,386,862,278,198,,13,13,,,,13,,10,', +',,,13,,10,,831,,274,834,14,10,,,,,,305,,,877,599,35,272,,,271,35,278', +',599,764,,,887,,,12,,14,14,,12,,,891,,,13,,863,,,,,866,,14,868,,,,599', +',,,782,,599,,,,,,771,771,198,,,278,278,771,,,793,,278,879,,,14,,13,', +',14,800,801,,13,888,803,,890,,,13,,,,,,,,893,771,,,,,278,,14,,,,,,,771', +',,,,278,,,,,,771,709,710,,,278,,,773,773,,,,,837,,,14,,,,,,,,,,,,,,', +',,,14,,,,773,,,,,,,,14,14,,,,14,,,,,,870,14,,,,,,871,,,,,,,,,,,,,,,274', +',,,,,,,,,,,,,,,,,,,,,,35,,14,,35,,,,,35,,,,,,12,,,,12,,,,,12,,,35,773', +'773,,,,,,773,,,,,,,12,,,,14,,,,,,,14,,,,,,,14,,,,,,,,,773,,271,,35,', +',,,,,,,,773,,,,,12,,,,,,773,,,,,,,,35,35,,,,,,,,,,,,,,12,12,,35,,,,', +',,,,,,,,,,12,,,,,,,,,599,,,,,,,,,35,,,,,35,,,,,,,,,,12,,,,,12,,,,,,', +',,,,,35,,,,,,,,,,,,,,,12,,,,,,,,,,,770,770,,,,,,,,35,,,206,,,,237,237', +'237,,,,,,12,,,35,,,,770,287,288,289,,,,,35,35,,12,,35,,,237,237,,,35', +',,12,12,,,,12,,,,,367,371,12,,,,,,271,,,,,,,,,,,,,,,,,,,,,,,,,35,,,', +',,,,,,,,,,,12,,,,,429,,430,,,,770,770,,,,,,770,,,,,,,,,,,35,,,,,,,35', +',,,,,,35,12,,,,,,,12,770,,,,,,12,,,,,,,,770,,,,366,237,374,237,,,388', +'770,,,,,,,,,,,,206,398,399,400,401,402,403,404,405,406,407,408,409,410', +'411,412,413,414,415,416,417,418,419,420,421,422,423,,,,,,,,237,,237', +',,,,,,,539,,,237,237,,,,,,,,237,,,,,,,,,,,,,,,,,,,,,,,,,,,468,,,,,,', +',,480,,,,,,,,,563,,566,,,569,,,,,,,,,,,,,,582,,,,,,,,,,,,,,,,,,,,,,', +',,,607,,,,,613,,,566,,,613,,,,,237,,,,,,,,,367,,,,,,,,,,,,,,,237,,388', +'555,374,,,,,,,,,,,,,,,,,,,,,,,678,,,,,,237,,237,,,237,,,,,,,,,,,702', +',,581,705,,,,,,,,,,237,,,,,,563,600,601,602,716,,26,,,237,,26,,,237', +',,237,,,237,,,26,26,,,,26,26,26,,,,237,237,26,,,,,,,,237,,,,742,,,,', +',,,,26,26,26,,,26,26,,,26,,,,,,,,,677,237,,,682,684,,,,687,,,689,,,', +',,,694,,,,237,765,,,237,26,,,,26,26,26,26,26,,,,,,,237,,,,237,,566,', +',,,,,,,,,566,,,,,,,,,,,,,,,731,,,,,,,,,,613,,,,,,237,,,,,,,,,,,,,816', +',,,,,,,,,,,,26,26,26,26,26,26,,,26,26,26,,,,833,,836,,26,,,,,,,237,767', +',,,841,,,,,,682,684,687,,,,,,,,,,,,237,,,,,,,,,237,563,237,,566,,,,', +'26,26,,,,,,,,26,,26,,,,,26,,237,,,,,,878,,,881,,,,,,,,,,237,,,566,,', +',,,767,,,892,,,,,26,26,,,828,,,,,,237,,237,,,,,,,26,,,,,,,237,,,,,,', +'26,,,,,,,,,,,,,237,,,,,,,,,,237,,,237,,,,,,,,,,,,,,,,,,,,,,,,,,26,,', +'237,,,237,,,,,,,,,,,,,237,,,,,,,,,237,,,,,,,,,,,,,,,,,,,,,,,,26,,,,', +',,,,,,26,,,,,,,,,,,,,26,,,,,,,,,,,,,,,,,26,,,,26,,,,,26,,26,,,,,,,,', +'26,,,,26,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,26,26,,,,26,,,,,,,,,,,,,26', +',,,,,,,,,,,,,,,,,,,,26,,,,,,,,26,26,,,,,,,,,,,,,,,,,26,,,,,,,,,,,,,', +',,,,,,,,,,,,,,26,,,,,26,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,26,,,,,,,,', +'26,,,,,,,,,,,,,,,,,,,,,,,,,,26,,,,,,,,,,,,,,,,,,26,,,,,,,,,,26,,26,26', +',,,26,,,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,26,,,,,', +',,,,,,,,,,,,,,,,,,,,,,26,,,,,,,,,,,,,,,,26,,,,,,,26,,,,,,,26' ] + racc_goto_table = arr = ::Array.new(2610, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'14,15,56,56,56,14,39,53,45,45,82,19,44,4,3,83,60,60,60,29,11,11,26,26', +'26,48,48,49,49,79,14,76,76,126,56,32,54,54,54,31,31,31,5,51,21,21,77', +'78,78,8,131,14,128,26,57,57,40,58,42,117,58,14,117,28,28,28,45,82,54', +'33,124,36,124,37,9,55,55,114,114,55,1,55,114,6,125,125,125,43,43,13', +'13,33,33,13,10,18,12,14,16,24,18,131,34,50,61,14,8,62,64,65,72,73,18', +'18,74,80,81,18,18,18,84,85,86,87,88,18,18,18,89,90,91,52,52,92,13,13', +'13,13,93,94,95,23,96,97,98,128,18,18,18,19,99,18,18,100,102,18,18,18', +'18,104,105,52,52,52,126,124,9,106,107,108,109,15,15,15,9,112,23,15,113', +'115,23,23,116,118,23,119,14,14,120,5,121,26,18,123,127,45,18,18,18,18', +'18,2,54,54,14,,,,,,,79,,,,,,,,33,,,,53,53,23,23,23,23,,,2,,,56,56,,', +',,,42,,56,117,,125,125,60,60,125,,,,26,26,,60,,,,,,26,,14,,,54,54,14', +',,,,,,54,51,,,18,18,18,18,18,18,,,18,18,18,20,40,,28,28,20,51,18,78', +'77,,59,28,57,36,57,37,125,,36,,37,,,,82,83,23,23,,20,20,20,32,131,21', +',32,,,,82,58,58,126,131,,,,13,13,20,,29,,,,18,18,19,76,20,20,20,8,53', +'18,45,18,53,,,18,18,,,53,52,53,11,,,,5,48,,49,,,,,,,,,2,2,20,,31,,26', +'45,31,,20,,,,,,18,18,2,56,,,,57,,,,19,,,,,,,,18,,,56,,,,,,,23,23,,,18', +',,60,,51,51,,,31,,,31,,,23,76,,,19,26,131,,,45,,,,19,23,2,,,45,,2,,', +',51,3,,20,20,,,51,,,54,14,,18,,14,,59,,,14,20,26,82,82,,45,131,,,,26', +'45,,,54,,,14,,,,,82,82,51,79,,76,15,15,,,,15,,,39,,,,45,,,,18,,,13,', +',,,11,,,18,,48,,49,53,20,4,14,56,20,20,,18,,,,,23,,,,,,,,,,,26,18,,', +',18,,,14,14,18,,18,23,,,30,30,41,,,18,3,41,,18,14,3,18,,,,44,17,,,,', +'17,,,,,53,59,,,57,41,41,41,,,,23,,18,18,,14,,18,,17,14,,59,82,,41,,', +'18,82,18,30,30,52,,41,41,41,41,15,17,,45,13,,,,14,,,,18,,,,,,,,18,18', +',,2,,,,2,,56,,41,2,14,14,,,18,,41,,,14,60,,,17,3,,51,,,,,17,,,,,,14', +',,54,14,18,,,,51,18,,14,14,,18,,14,,,39,,,,14,,,82,,51,,,,,23,,2,,,', +',59,18,13,59,,,,,,,18,,,20,59,19,,20,,41,41,,20,,2,2,,18,18,14,30,30', +'52,52,17,17,18,41,,,20,,2,,,,,56,,20,3,,17,,18,14,14,26,18,,,45,14,52', +'18,,18,18,,,,18,,14,,,,,18,,14,,59,,20,59,20,14,,,,,,23,,,14,30,41,18', +',,41,41,52,,30,2,,,14,,,17,,20,20,,17,,,14,,,18,,59,,,,,59,,20,59,,', +',30,,,,2,,30,,,,,,18,18,18,,,52,52,18,,,2,,52,59,,,20,,18,,,20,2,2,', +'18,59,2,,59,,,18,,,,,,,,59,18,,,,,52,,20,,,,,,,18,,,,,52,,,,,,18,30', +'30,,,52,,,20,20,,,,,2,,,20,,,,,,,,,,,,,,,,,,20,,,,20,,,,,,,,20,20,,', +',20,,,,,,2,20,,,,,,2,,,,,,,,,,,,,,,20,,,,,,,,,,,,,,,,,,,,,,,41,,20,', +'41,,,,,41,,,,,,17,,,,17,,,,,17,,,41,20,20,,,,,,20,,,,,,,17,,,,20,,,', +',,,20,,,,,,,20,,,,,,,,,20,,41,,41,,,,,,,,,,20,,,,,17,,,,,,20,,,,,,,', +'41,41,,,,,,,,,,,,,,17,17,,41,,,,,,,,,,,,,,,17,,,,,,,,,30,,,,,,,,,41', +',,,,41,,,,,,,,,,17,,,,,17,,,,,,,,,,,,41,,,,,,,,,,,,,,,17,,,,,,,,,,,41', +'41,,,,,,,,41,,,25,,,,25,25,25,,,,,,17,,,41,,,,41,25,25,25,,,,,41,41', +',17,,41,,,25,25,,,41,,,17,17,,,,17,,,,,22,22,17,,,,,,41,,,,,,,,,,,,', +',,,,,,,,,,,,41,,,,,,,,,,,,,,,17,,,,,22,,22,,,,41,41,,,,,,41,,,,,,,,', +',,41,,,,,,,41,,,,,,,41,17,,,,,,,17,41,,,,,,17,,,,,,,,41,,,,25,25,25', +'25,,,25,41,,,,,,,,,,,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25', +'25,25,25,25,25,25,25,25,25,25,25,,,,,,,,25,,25,,,,,,,,22,,,25,25,,,', +',,,,25,,,,,,,,,,,,,,,,,,,,,,,,,,,25,,,,,,,,,25,,,,,,,,,22,,22,,,22,', +',,,,,,,,,,,,22,,,,,,,,,,,,,,,,,,,,,,,,,,22,,,,,22,,,22,,,22,,,,,25,', +',,,,,,,22,,,,,,,,,,,,,,,25,,25,25,25,,,,,,,,,,,,,,,,,,,,,,,22,,,,,,25', +',25,,,25,,,,,,,,,,,22,,,25,22,,,,,,,,,,25,,,,,,22,25,25,25,22,,35,,', +'25,,35,,,25,,,25,,,25,,,35,35,,,,35,35,35,,,,25,25,35,,,,,,,,25,,,,22', +',,,,,,,,35,35,35,,,35,35,,,35,,,,,,,,,25,25,,,25,25,,,,25,,,25,,,,,', +',25,,,,25,22,,,25,35,,,,35,35,35,35,35,,,,,,,25,,,,25,,22,,,,,,,,,,', +'22,,,,,,,,,,,,,,,25,,,,,,,,,,22,,,,,,25,,,,,,,,,,,,,22,,,,,,,,,,,,,35', +'35,35,35,35,35,,,35,35,35,,,,22,,22,,35,,,,,,,25,25,,,,22,,,,,,25,25', +'25,,,,,,,,,,,,25,,,,,,,,,25,22,25,,22,,,,,35,35,,,,,,,,35,,35,,,,,35', +',25,,,,,,22,,,22,,,,,,,,,,25,,,22,,,,,,25,,,22,,,,,35,35,,,25,,,,,,25', +',25,,,,,,,35,,,,,,,25,,,,,,,35,,,,,,,,,,,,,25,,,,,,,,,,25,,,25,,,,,', +',,,,,,,,,,,,,,,,,,,,35,,,25,,,25,,,,,,,,,,,,,25,,,,,,,,,25,,,,,,,,,', +',,,,,,,,,,,,,,35,,,,,,,,,,,35,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,,35,,,,35', +',,,,35,,35,,,,,,,,,35,,,,35,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,35,,', +',35,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,,,,,,35,,,,,,,,35,35,,,,,,,,,,,,,', +',,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,,,,,35,,,,,35,,,,,,,,,,,,,,,,,,', +',,,,,,,,35,,,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,,,35', +',,,,,,,,,35,,35,35,,,,35,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,,,,,,,,,,,,,,,,35,,,,,,', +'35,,,,,,,35' ] + racc_goto_check = arr = ::Array.new(2610, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 80, 201, -37, -279, -428, -521, nil, 46, 69, + 91, 14, 89, 33, 0, -17, 37, 613, 95, -42, + 292, -144, 1171, 124, -8, 1289, 0, nil, 41, -235, + 404, 13, -218, -355, -334, 1757, 41, 43, nil, -25, + 24, 598, -264, 25, -52, 2, nil, nil, 19, 21, + -258, 2, 100, -247, 14, -222, -20, 28, -375, 63, + -6, -341, -148, nil, -337, -478, nil, nil, nil, nil, + nil, nil, 46, 57, 59, nil, -275, -569, -444, -282, + 54, -210, 7, -499, 56, -218, -172, 65, -494, 69, + -493, -371, -671, -370, -503, -189, -196, -372, -618, -407, + -404, nil, -80, nil, -99, -99, -329, -635, -302, -438, + nil, nil, 105, 106, 3, 103, -164, -284, 106, -337, + -335, -455, nil, -560, -683, -563, -481, -559, -703, nil, + nil, -378 ] + +racc_goto_default = [ + nil, nil, 292, nil, nil, 733, nil, 3, nil, 4, + 312, nil, nil, nil, 202, 16, 11, 203, 286, nil, + 201, nil, 244, 15, nil, 19, 20, 21, nil, 25, + 596, nil, nil, nil, nil, 277, 29, nil, 31, 34, + 33, 199, 323, nil, 114, 380, 113, 116, 68, 69, + nil, nil, 42, 295, 297, nil, 298, 544, 545, 425, + 562, nil, nil, 255, nil, nil, 43, 44, 45, 46, + 47, 48, 49, nil, 256, 55, nil, nil, nil, nil, + nil, nil, 487, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 235, nil, 384, nil, nil, nil, nil, nil, nil, + 67, 70, 71, nil, nil, nil, nil, 525, nil, nil, + nil, 646, 647, 648, 649, nil, 812, 656, 657, 660, + 663, 248 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 133, :_reduce_1, + 4, 135, :_reduce_2, + 2, 134, :_reduce_3, + 0, 139, :_reduce_4, + 1, 139, :_reduce_5, + 2, 139, :_reduce_6, + 3, 139, :_reduce_7, + 0, 156, :_reduce_8, + 4, 141, :_reduce_9, + 3, 141, :_reduce_10, + 3, 141, :_reduce_11, + 3, 141, :_reduce_12, + 2, 141, :_reduce_13, + 3, 141, :_reduce_14, + 3, 141, :_reduce_15, + 3, 141, :_reduce_16, + 3, 141, :_reduce_17, + 3, 141, :_reduce_18, + 4, 141, :_reduce_19, + 4, 141, :_reduce_20, + 3, 141, :_reduce_21, + 3, 141, :_reduce_22, + 3, 141, :_reduce_23, + 6, 141, :_reduce_24, + 5, 141, :_reduce_25, + 5, 141, :_reduce_26, + 5, 141, :_reduce_27, + 3, 141, :_reduce_28, + 3, 141, :_reduce_29, + 3, 141, :_reduce_30, + 3, 141, :_reduce_31, + 1, 141, :_reduce_none, + 1, 155, :_reduce_none, + 3, 155, :_reduce_34, + 3, 155, :_reduce_35, + 2, 155, :_reduce_36, + 2, 155, :_reduce_37, + 1, 155, :_reduce_none, + 1, 145, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 2, 147, :_reduce_42, + 2, 147, :_reduce_43, + 2, 147, :_reduce_44, + 1, 159, :_reduce_none, + 4, 159, :_reduce_46, + 4, 159, :_reduce_47, + 0, 166, :_reduce_48, + 5, 164, :_reduce_49, + 2, 158, :_reduce_50, + 3, 158, :_reduce_51, + 4, 158, :_reduce_52, + 5, 158, :_reduce_53, + 4, 158, :_reduce_54, + 5, 158, :_reduce_55, + 2, 158, :_reduce_56, + 2, 158, :_reduce_57, + 1, 148, :_reduce_58, + 3, 148, :_reduce_59, + 1, 169, :_reduce_60, + 3, 169, :_reduce_61, + 1, 168, :_reduce_62, + 2, 168, :_reduce_63, + 3, 168, :_reduce_64, + 2, 168, :_reduce_65, + 2, 168, :_reduce_66, + 1, 168, :_reduce_67, + 1, 171, :_reduce_none, + 3, 171, :_reduce_69, + 2, 170, :_reduce_70, + 3, 170, :_reduce_71, + 1, 172, :_reduce_72, + 4, 172, :_reduce_73, + 3, 172, :_reduce_74, + 3, 172, :_reduce_75, + 3, 172, :_reduce_76, + 3, 172, :_reduce_77, + 2, 172, :_reduce_78, + 1, 172, :_reduce_79, + 1, 146, :_reduce_80, + 4, 146, :_reduce_81, + 3, 146, :_reduce_82, + 3, 146, :_reduce_83, + 3, 146, :_reduce_84, + 3, 146, :_reduce_85, + 2, 146, :_reduce_86, + 1, 146, :_reduce_87, + 1, 174, :_reduce_88, + 1, 174, :_reduce_none, + 2, 175, :_reduce_90, + 1, 175, :_reduce_91, + 3, 175, :_reduce_92, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 176, :_reduce_none, + 1, 179, :_reduce_98, + 1, 179, :_reduce_none, + 1, 143, :_reduce_none, + 1, 143, :_reduce_none, + 1, 144, :_reduce_102, + 0, 182, :_reduce_103, + 4, 144, :_reduce_104, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 177, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 1, 178, :_reduce_none, + 3, 157, :_reduce_171, + 5, 157, :_reduce_172, + 3, 157, :_reduce_173, + 6, 157, :_reduce_174, + 5, 157, :_reduce_175, + 5, 157, :_reduce_176, + 5, 157, :_reduce_177, + 5, 157, :_reduce_178, + 4, 157, :_reduce_179, + 3, 157, :_reduce_180, + 3, 157, :_reduce_181, + 3, 157, :_reduce_182, + 3, 157, :_reduce_183, + 3, 157, :_reduce_184, + 3, 157, :_reduce_185, + 3, 157, :_reduce_186, + 3, 157, :_reduce_187, + 3, 157, :_reduce_188, + 4, 157, :_reduce_189, + 4, 157, :_reduce_190, + 2, 157, :_reduce_191, + 2, 157, :_reduce_192, + 3, 157, :_reduce_193, + 3, 157, :_reduce_194, + 3, 157, :_reduce_195, + 3, 157, :_reduce_196, + 3, 157, :_reduce_197, + 3, 157, :_reduce_198, + 3, 157, :_reduce_199, + 3, 157, :_reduce_200, + 3, 157, :_reduce_201, + 3, 157, :_reduce_202, + 3, 157, :_reduce_203, + 3, 157, :_reduce_204, + 3, 157, :_reduce_205, + 2, 157, :_reduce_206, + 2, 157, :_reduce_207, + 3, 157, :_reduce_208, + 3, 157, :_reduce_209, + 3, 157, :_reduce_210, + 3, 157, :_reduce_211, + 3, 157, :_reduce_212, + 5, 157, :_reduce_213, + 1, 157, :_reduce_none, + 1, 154, :_reduce_none, + 1, 151, :_reduce_none, + 2, 151, :_reduce_217, + 2, 151, :_reduce_218, + 5, 151, :_reduce_219, + 2, 151, :_reduce_220, + 3, 151, :_reduce_221, + 3, 189, :_reduce_222, + 4, 189, :_reduce_223, + 4, 189, :_reduce_224, + 6, 189, :_reduce_225, + 0, 190, :_reduce_226, + 1, 190, :_reduce_none, + 1, 160, :_reduce_228, + 2, 160, :_reduce_229, + 5, 160, :_reduce_230, + 2, 160, :_reduce_231, + 5, 160, :_reduce_232, + 4, 160, :_reduce_233, + 7, 160, :_reduce_234, + 3, 160, :_reduce_235, + 1, 160, :_reduce_236, + 4, 193, :_reduce_237, + 3, 193, :_reduce_238, + 5, 193, :_reduce_239, + 7, 193, :_reduce_240, + 2, 193, :_reduce_241, + 5, 193, :_reduce_242, + 4, 193, :_reduce_243, + 6, 193, :_reduce_244, + 7, 193, :_reduce_245, + 9, 193, :_reduce_246, + 3, 193, :_reduce_247, + 1, 193, :_reduce_248, + 0, 195, :_reduce_249, + 2, 163, :_reduce_250, + 1, 194, :_reduce_251, + 0, 196, :_reduce_252, + 3, 194, :_reduce_253, + 0, 197, :_reduce_254, + 4, 194, :_reduce_255, + 2, 192, :_reduce_256, + 2, 191, :_reduce_257, + 0, 191, :_reduce_258, + 1, 186, :_reduce_259, + 3, 186, :_reduce_260, + 3, 153, :_reduce_261, + 4, 153, :_reduce_262, + 2, 153, :_reduce_263, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_none, + 1, 184, :_reduce_272, + 3, 184, :_reduce_273, + 0, 218, :_reduce_274, + 5, 184, :_reduce_275, + 3, 184, :_reduce_276, + 3, 184, :_reduce_277, + 2, 184, :_reduce_278, + 4, 184, :_reduce_279, + 3, 184, :_reduce_280, + 3, 184, :_reduce_281, + 1, 184, :_reduce_282, + 4, 184, :_reduce_283, + 3, 184, :_reduce_284, + 1, 184, :_reduce_285, + 5, 184, :_reduce_286, + 2, 184, :_reduce_287, + 1, 184, :_reduce_none, + 2, 184, :_reduce_289, + 6, 184, :_reduce_290, + 6, 184, :_reduce_291, + 0, 219, :_reduce_292, + 0, 220, :_reduce_293, + 7, 184, :_reduce_294, + 0, 221, :_reduce_295, + 0, 222, :_reduce_296, + 7, 184, :_reduce_297, + 5, 184, :_reduce_298, + 4, 184, :_reduce_299, + 5, 184, :_reduce_300, + 0, 223, :_reduce_301, + 0, 224, :_reduce_302, + 9, 184, :_reduce_303, + 0, 225, :_reduce_304, + 6, 184, :_reduce_305, + 0, 226, :_reduce_306, + 7, 184, :_reduce_307, + 0, 227, :_reduce_308, + 5, 184, :_reduce_309, + 0, 228, :_reduce_310, + 6, 184, :_reduce_311, + 0, 229, :_reduce_312, + 0, 230, :_reduce_313, + 9, 184, :_reduce_314, + 1, 184, :_reduce_315, + 1, 184, :_reduce_316, + 1, 184, :_reduce_317, + 1, 184, :_reduce_318, + 1, 150, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 1, 208, :_reduce_none, + 2, 208, :_reduce_323, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 210, :_reduce_none, + 1, 209, :_reduce_none, + 5, 209, :_reduce_328, + 1, 137, :_reduce_none, + 2, 137, :_reduce_330, + 1, 212, :_reduce_none, + 1, 212, :_reduce_none, + 1, 231, :_reduce_333, + 3, 231, :_reduce_334, + 1, 232, :_reduce_none, + 2, 232, :_reduce_none, + 4, 232, :_reduce_337, + 7, 232, :_reduce_338, + 6, 232, :_reduce_339, + 4, 232, :_reduce_340, + 3, 232, :_reduce_341, + 5, 232, :_reduce_342, + 4, 232, :_reduce_343, + 2, 232, :_reduce_344, + 1, 232, :_reduce_345, + 2, 232, :_reduce_346, + 0, 165, :_reduce_347, + 2, 165, :_reduce_348, + 1, 165, :_reduce_349, + 3, 165, :_reduce_350, + 0, 234, :_reduce_351, + 5, 233, :_reduce_352, + 2, 161, :_reduce_353, + 4, 161, :_reduce_354, + 4, 161, :_reduce_355, + 2, 207, :_reduce_356, + 4, 207, :_reduce_357, + 4, 207, :_reduce_358, + 3, 207, :_reduce_359, + 2, 207, :_reduce_360, + 1, 207, :_reduce_361, + 0, 236, :_reduce_362, + 5, 206, :_reduce_363, + 0, 237, :_reduce_364, + 5, 206, :_reduce_365, + 5, 211, :_reduce_366, + 1, 238, :_reduce_none, + 4, 238, :_reduce_368, + 2, 238, :_reduce_369, + 1, 239, :_reduce_370, + 1, 239, :_reduce_none, + 6, 136, :_reduce_372, + 0, 136, :_reduce_373, + 1, 240, :_reduce_374, + 1, 240, :_reduce_none, + 1, 240, :_reduce_none, + 2, 241, :_reduce_377, + 1, 241, :_reduce_none, + 2, 138, :_reduce_379, + 1, 138, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 198, :_reduce_none, + 1, 199, :_reduce_384, + 1, 243, :_reduce_385, + 2, 243, :_reduce_386, + 3, 244, :_reduce_387, + 1, 244, :_reduce_388, + 3, 200, :_reduce_389, + 4, 201, :_reduce_390, + 3, 202, :_reduce_391, + 0, 247, :_reduce_392, + 3, 247, :_reduce_393, + 1, 248, :_reduce_394, + 2, 248, :_reduce_395, + 3, 203, :_reduce_396, + 0, 250, :_reduce_397, + 3, 250, :_reduce_398, + 0, 245, :_reduce_399, + 2, 245, :_reduce_400, + 0, 246, :_reduce_401, + 2, 246, :_reduce_402, + 1, 249, :_reduce_403, + 2, 249, :_reduce_404, + 0, 252, :_reduce_405, + 4, 249, :_reduce_406, + 1, 251, :_reduce_407, + 1, 251, :_reduce_408, + 1, 251, :_reduce_409, + 1, 251, :_reduce_none, + 1, 180, :_reduce_411, + 3, 181, :_reduce_412, + 1, 242, :_reduce_413, + 1, 242, :_reduce_414, + 2, 242, :_reduce_415, + 2, 242, :_reduce_416, + 1, 173, :_reduce_417, + 1, 173, :_reduce_418, + 1, 173, :_reduce_419, + 1, 173, :_reduce_420, + 1, 173, :_reduce_421, + 1, 173, :_reduce_422, + 1, 173, :_reduce_423, + 1, 173, :_reduce_424, + 1, 173, :_reduce_425, + 1, 173, :_reduce_426, + 1, 173, :_reduce_427, + 1, 204, :_reduce_428, + 1, 149, :_reduce_429, + 1, 152, :_reduce_430, + 1, 152, :_reduce_431, + 1, 213, :_reduce_432, + 3, 213, :_reduce_433, + 2, 213, :_reduce_434, + 4, 215, :_reduce_435, + 2, 215, :_reduce_436, + 6, 253, :_reduce_437, + 4, 253, :_reduce_438, + 4, 253, :_reduce_439, + 2, 253, :_reduce_440, + 4, 253, :_reduce_441, + 2, 253, :_reduce_442, + 2, 253, :_reduce_443, + 1, 253, :_reduce_444, + 0, 253, :_reduce_445, + 1, 259, :_reduce_446, + 1, 259, :_reduce_447, + 1, 259, :_reduce_448, + 1, 259, :_reduce_449, + 1, 259, :_reduce_450, + 1, 254, :_reduce_451, + 3, 254, :_reduce_452, + 3, 260, :_reduce_453, + 1, 255, :_reduce_454, + 3, 255, :_reduce_455, + 1, 261, :_reduce_none, + 1, 261, :_reduce_none, + 2, 256, :_reduce_458, + 1, 256, :_reduce_459, + 1, 262, :_reduce_none, + 1, 262, :_reduce_none, + 2, 258, :_reduce_462, + 2, 257, :_reduce_463, + 0, 257, :_reduce_464, + 1, 216, :_reduce_none, + 4, 216, :_reduce_466, + 0, 205, :_reduce_467, + 2, 205, :_reduce_468, + 2, 205, :_reduce_469, + 1, 188, :_reduce_470, + 3, 188, :_reduce_471, + 3, 263, :_reduce_472, + 1, 167, :_reduce_none, + 1, 167, :_reduce_none, + 1, 167, :_reduce_none, + 1, 162, :_reduce_none, + 1, 162, :_reduce_none, + 1, 162, :_reduce_none, + 1, 162, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 235, :_reduce_none, + 1, 217, :_reduce_none, + 1, 217, :_reduce_none, + 0, 140, :_reduce_none, + 1, 140, :_reduce_none, + 0, 183, :_reduce_none, + 1, 183, :_reduce_none, + 0, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 187, :_reduce_none, + 1, 214, :_reduce_492, + 1, 214, :_reduce_none, + 1, 142, :_reduce_none, + 2, 142, :_reduce_none, + 0, 185, :_reduce_496 ] + +racc_reduce_n = 497 + +racc_shift_n = 894 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kRETURN => 28, + :kYIELD => 29, + :kSUPER => 30, + :kSELF => 31, + :kNIL => 32, + :kTRUE => 33, + :kFALSE => 34, + :kAND => 35, + :kOR => 36, + :kNOT => 37, + :kIF_MOD => 38, + :kUNLESS_MOD => 39, + :kWHILE_MOD => 40, + :kUNTIL_MOD => 41, + :kRESCUE_MOD => 42, + :kALIAS => 43, + :kDEFINED => 44, + :klBEGIN => 45, + :klEND => 46, + :k__LINE__ => 47, + :k__FILE__ => 48, + :tIDENTIFIER => 49, + :tFID => 50, + :tGVAR => 51, + :tIVAR => 52, + :tCONSTANT => 53, + :tCVAR => 54, + :tNTH_REF => 55, + :tBACK_REF => 56, + :tSTRING_CONTENT => 57, + :tINTEGER => 58, + :tFLOAT => 59, + :tREGEXP_END => 60, + :tUPLUS => 61, + :tUMINUS => 62, + :tUMINUS_NUM => 63, + :tPOW => 64, + :tCMP => 65, + :tEQ => 66, + :tEQQ => 67, + :tNEQ => 68, + :tGEQ => 69, + :tLEQ => 70, + :tANDOP => 71, + :tOROP => 72, + :tMATCH => 73, + :tNMATCH => 74, + :tDOT => 75, + :tDOT2 => 76, + :tDOT3 => 77, + :tAREF => 78, + :tASET => 79, + :tLSHFT => 80, + :tRSHFT => 81, + :tCOLON2 => 82, + :tCOLON3 => 83, + :tOP_ASGN => 84, + :tASSOC => 85, + :tLPAREN => 86, + :tLPAREN2 => 87, + :tRPAREN => 88, + :tLPAREN_ARG => 89, + :tLBRACK => 90, + :tLBRACK2 => 91, + :tRBRACK => 92, + :tLBRACE => 93, + :tLBRACE_ARG => 94, + :tSTAR => 95, + :tSTAR2 => 96, + :tAMPER => 97, + :tAMPER2 => 98, + :tTILDE => 99, + :tPERCENT => 100, + :tDIVIDE => 101, + :tPLUS => 102, + :tMINUS => 103, + :tLT => 104, + :tGT => 105, + :tPIPE => 106, + :tBANG => 107, + :tCARET => 108, + :tLCURLY => 109, + :tRCURLY => 110, + :tBACK_REF2 => 111, + :tSYMBEG => 112, + :tSTRING_BEG => 113, + :tXSTRING_BEG => 114, + :tREGEXP_BEG => 115, + :tWORDS_BEG => 116, + :tQWORDS_BEG => 117, + :tSTRING_DBEG => 118, + :tSTRING_DVAR => 119, + :tSTRING_END => 120, + :tSTRING => 121, + :tSYMBOL => 122, + :tREGEXP_OPT => 123, + :tNL => 124, + :tEH => 125, + :tCOLON => 126, + :tCOMMA => 127, + :tSPACE => 128, + :tSEMI => 129, + :tEQL => 130, + :tLOWEST => 131 } + +racc_nt_base = 132 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING", + "tSYMBOL", + "tREGEXP_OPT", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tEQL", + "tLOWEST", + "$start", + "program", + "compstmt", + "bodystmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "opt_terms", + "stmt", + "terms", + "fitem", + "undef_list", + "expr_value", + "lhs", + "command_call", + "mlhs", + "var_lhs", + "primary_value", + "aref_args", + "backref", + "mrhs", + "arg_value", + "expr", + "@1", + "arg", + "command", + "block_command", + "call_args", + "block_call", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_var", + "@2", + "operation", + "mlhs_basic", + "mlhs_entry", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "opt_nl", + "primary", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "call_args2", + "open_args", + "@4", + "@5", + "@6", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "superclass", + "term", + "f_arglist", + "singleton", + "dot_or_colon", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "block_par", + "block_var", + "do_block", + "@20", + "operation3", + "@21", + "@22", + "when_args", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "word_list", + "word", + "string_content", + "qword_list", + "string_dvar", + "@23", + "f_args", + "f_arg", + "f_optarg", + "f_rest_arg", + "opt_f_block_arg", + "f_block_arg", + "f_norm_arg", + "f_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'ruby18.y', 73) + def _reduce_1(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 78) + def _reduce_2(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 94) + def _reduce_3(val, _values, result) + result = @builder.compstmt(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 99) + def _reduce_4(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 103) + def _reduce_5(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 107) + def _reduce_6(val, _values, result) + result = [ val[1] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 111) + def _reduce_7(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 116) + def _reduce_8(val, _values, result) + @lexer.state = :expr_fname + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 120) + def _reduce_9(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 124) + def _reduce_10(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 130) + def _reduce_11(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 136) + def _reduce_12(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 140) + def _reduce_13(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 144) + def _reduce_14(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 149) + def _reduce_15(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 154) + def _reduce_16(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 158) + def _reduce_17(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 162) + def _reduce_18(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 170) + def _reduce_19(val, _values, result) + if in_def? + diagnostic :error, :begin_in_method, nil, val[0] + end + + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 178) + def _reduce_20(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 182) + def _reduce_21(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 186) + def _reduce_22(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 190) + def _reduce_23(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 194) + def _reduce_24(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 201) + def _reduce_25(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 208) + def _reduce_26(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 215) + def _reduce_27(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 222) + def _reduce_28(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 226) + def _reduce_29(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 231) + def _reduce_30(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 235) + def _reduce_31(val, _values, result) + result = @builder.multi_assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result + end +.,., + +# reduce 32 omitted + +# reduce 33 omitted + +module_eval(<<'.,.,', 'ruby18.y', 243) + def _reduce_34(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 247) + def _reduce_35(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 251) + def _reduce_36(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 255) + def _reduce_37(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result + end +.,., + +# reduce 38 omitted + +# reduce 39 omitted + +# reduce 40 omitted + +# reduce 41 omitted + +module_eval(<<'.,.,', 'ruby18.y', 265) + def _reduce_42(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 270) + def _reduce_43(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 275) + def _reduce_44(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result + end +.,., + +# reduce 45 omitted + +module_eval(<<'.,.,', 'ruby18.y', 282) + def _reduce_46(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 288) + def _reduce_47(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 295) + def _reduce_48(val, _values, result) + @static_env.extend_dynamic + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 299) + def _reduce_49(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 306) + def _reduce_50(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 312) + def _reduce_51(val, _values, result) + lparen_t, args, rparen_t = val[1] + method_call = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + begin_t, block_args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, block_args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 322) + def _reduce_52(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 329) + def _reduce_53(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, block_args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, block_args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 339) + def _reduce_54(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 345) + def _reduce_55(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, block_args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, block_args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 355) + def _reduce_56(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 361) + def _reduce_57(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:yield, val[0], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 368) + def _reduce_58(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 372) + def _reduce_59(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 377) + def _reduce_60(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 381) + def _reduce_61(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 386) + def _reduce_62(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 390) + def _reduce_63(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 394) + def _reduce_64(val, _values, result) + result = val[0] << @builder.splat(val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 398) + def _reduce_65(val, _values, result) + result = val[0] << @builder.splat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 402) + def _reduce_66(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 406) + def _reduce_67(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result + end +.,., + +# reduce 68 omitted + +module_eval(<<'.,.,', 'ruby18.y', 412) + def _reduce_69(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 417) + def _reduce_70(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 421) + def _reduce_71(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 426) + def _reduce_72(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 430) + def _reduce_73(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 434) + def _reduce_74(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 438) + def _reduce_75(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 442) + def _reduce_76(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 446) + def _reduce_77(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 451) + def _reduce_78(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 456) + def _reduce_79(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 461) + def _reduce_80(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 465) + def _reduce_81(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 469) + def _reduce_82(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 473) + def _reduce_83(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 477) + def _reduce_84(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 481) + def _reduce_85(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 486) + def _reduce_86(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 491) + def _reduce_87(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 496) + def _reduce_88(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result + end +.,., + +# reduce 89 omitted + +module_eval(<<'.,.,', 'ruby18.y', 502) + def _reduce_90(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 506) + def _reduce_91(val, _values, result) + result = @builder.const(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 510) + def _reduce_92(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result + end +.,., + +# reduce 93 omitted + +# reduce 94 omitted + +# reduce 95 omitted + +# reduce 96 omitted + +# reduce 97 omitted + +module_eval(<<'.,.,', 'ruby18.y', 519) + def _reduce_98(val, _values, result) + result = @builder.symbol(val[0]) + + result + end +.,., + +# reduce 99 omitted + +# reduce 100 omitted + +# reduce 101 omitted + +module_eval(<<'.,.,', 'ruby18.y', 528) + def _reduce_102(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 532) + def _reduce_103(val, _values, result) + @lexer.state = :expr_fname + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 536) + def _reduce_104(val, _values, result) + result = val[0] << val[3] + + result + end +.,., + +# reduce 105 omitted + +# reduce 106 omitted + +# reduce 107 omitted + +# reduce 108 omitted + +# reduce 109 omitted + +# reduce 110 omitted + +# reduce 111 omitted + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +# reduce 116 omitted + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +# reduce 120 omitted + +# reduce 121 omitted + +# reduce 122 omitted + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +module_eval(<<'.,.,', 'ruby18.y', 555) + def _reduce_171(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 559) + def _reduce_172(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 569) + def _reduce_173(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 573) + def _reduce_174(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 580) + def _reduce_175(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 587) + def _reduce_176(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 594) + def _reduce_177(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 601) + def _reduce_178(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 605) + def _reduce_179(val, _values, result) + diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 609) + def _reduce_180(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 613) + def _reduce_181(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 617) + def _reduce_182(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 621) + def _reduce_183(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 625) + def _reduce_184(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 629) + def _reduce_185(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 633) + def _reduce_186(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 637) + def _reduce_187(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 641) + def _reduce_188(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 645) + def _reduce_189(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.integer(val[1]), + val[2], val[3])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 652) + def _reduce_190(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + @builder.float(val[1]), + val[2], val[3])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 659) + def _reduce_191(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 663) + def _reduce_192(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 667) + def _reduce_193(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 671) + def _reduce_194(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 675) + def _reduce_195(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 679) + def _reduce_196(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 683) + def _reduce_197(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 687) + def _reduce_198(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 691) + def _reduce_199(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 695) + def _reduce_200(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 699) + def _reduce_201(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 703) + def _reduce_202(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 707) + def _reduce_203(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 711) + def _reduce_204(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 715) + def _reduce_205(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 719) + def _reduce_206(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 723) + def _reduce_207(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 727) + def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 731) + def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 735) + def _reduce_210(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 739) + def _reduce_211(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 743) + def _reduce_212(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 747) + def _reduce_213(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[2], val[3], val[4]) + + result + end +.,., + +# reduce 214 omitted + +# reduce 215 omitted + +# reduce 216 omitted + +module_eval(<<'.,.,', 'ruby18.y', 757) + def _reduce_217(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 761) + def _reduce_218(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 765) + def _reduce_219(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 769) + def _reduce_220(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 773) + def _reduce_221(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 778) + def _reduce_222(val, _values, result) + result = [ val[0], [], val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 782) + def _reduce_223(val, _values, result) + result = [ val[0], val[1], val[3] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 786) + def _reduce_224(val, _values, result) + result = [ val[0], [ val[1] ], val[3] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 790) + def _reduce_225(val, _values, result) + result = [ val[0], val[1] << val[3], val[5] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 795) + def _reduce_226(val, _values, result) + result = [ nil, [], nil ] + + result + end +.,., + +# reduce 227 omitted + +module_eval(<<'.,.,', 'ruby18.y', 801) + def _reduce_228(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 805) + def _reduce_229(val, _values, result) + result = val[0].concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 809) + def _reduce_230(val, _values, result) + result = val[0].concat( + [ @builder.splat(val[2], val[3]), + *val[4] ]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 815) + def _reduce_231(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + *val[1] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 820) + def _reduce_232(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + @builder.splat(val[2], val[3]), + *val[4] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 826) + def _reduce_233(val, _values, result) + result = val[0].concat( + [ @builder.associate(nil, val[2], nil), + *val[3] ]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 832) + def _reduce_234(val, _values, result) + result = val[0].concat( + [ @builder.associate(nil, val[2], nil), + @builder.splat(val[4], val[5]), + *val[6] ]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 839) + def _reduce_235(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 844) + def _reduce_236(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 849) + def _reduce_237(val, _values, result) + result = [ val[0], *val[2].concat(val[3]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 853) + def _reduce_238(val, _values, result) + result = [ val[0], val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 857) + def _reduce_239(val, _values, result) + result = [ val[0], + @builder.splat(val[2], val[3]), + *val[4] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 863) + def _reduce_240(val, _values, result) + result = [ val[0], + *val[2]. + push(@builder.splat(val[4], val[5])). + concat(val[6]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 870) + def _reduce_241(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + *val[1] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 875) + def _reduce_242(val, _values, result) + result = [ @builder.associate(nil, val[0], nil), + @builder.splat(val[2], val[3]), + *val[4] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 881) + def _reduce_243(val, _values, result) + result = [ val[0], + @builder.associate(nil, val[2], nil), + *val[3] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 887) + def _reduce_244(val, _values, result) + result = [ val[0], + *val[2]. + push(@builder.associate(nil, val[4], nil)). + concat(val[5]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 894) + def _reduce_245(val, _values, result) + result = [ val[0], + @builder.associate(nil, val[2], nil), + @builder.splat(val[4], val[5]), + *val[6] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 901) + def _reduce_246(val, _values, result) + result = [ val[0], + *val[2]. + push(@builder.associate(nil, val[4], nil)). + push(@builder.splat(val[6], val[7])). + concat(val[8]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 909) + def _reduce_247(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 914) + def _reduce_248(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 918) + def _reduce_249(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 923) + def _reduce_250(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 930) + def _reduce_251(val, _values, result) + result = [ nil, val[0], nil ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 934) + def _reduce_252(val, _values, result) + @lexer.state = :expr_endarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 938) + def _reduce_253(val, _values, result) + result = [ val[0], [], val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 942) + def _reduce_254(val, _values, result) + @lexer.state = :expr_endarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 946) + def _reduce_255(val, _values, result) + result = [ val[0], val[1], val[3] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 951) + def _reduce_256(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 956) + def _reduce_257(val, _values, result) + result = [ val[1] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 960) + def _reduce_258(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 965) + def _reduce_259(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 969) + def _reduce_260(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 974) + def _reduce_261(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 978) + def _reduce_262(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 982) + def _reduce_263(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result + end +.,., + +# reduce 264 omitted + +# reduce 265 omitted + +# reduce 266 omitted + +# reduce 267 omitted + +# reduce 268 omitted + +# reduce 269 omitted + +# reduce 270 omitted + +# reduce 271 omitted + +module_eval(<<'.,.,', 'ruby18.y', 995) + def _reduce_272(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 999) + def _reduce_273(val, _values, result) + result = @builder.begin_keyword(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1003) + def _reduce_274(val, _values, result) + @lexer.state = :expr_endarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1007) + def _reduce_275(val, _values, result) + result = @builder.begin(val[0], val[1], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1011) + def _reduce_276(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1015) + def _reduce_277(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1019) + def _reduce_278(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1023) + def _reduce_279(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1027) + def _reduce_280(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1031) + def _reduce_281(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1035) + def _reduce_282(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1039) + def _reduce_283(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1043) + def _reduce_284(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1047) + def _reduce_285(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1051) + def _reduce_286(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1056) + def _reduce_287(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result + end +.,., + +# reduce 288 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1065) + def _reduce_289(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1071) + def _reduce_290(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1078) + def _reduce_291(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1085) + def _reduce_292(val, _values, result) + @lexer.cond.push(true) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1089) + def _reduce_293(val, _values, result) + @lexer.cond.pop + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1093) + def _reduce_294(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1098) + def _reduce_295(val, _values, result) + @lexer.cond.push(true) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1102) + def _reduce_296(val, _values, result) + @lexer.cond.pop + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1106) + def _reduce_297(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1111) + def _reduce_298(val, _values, result) + when_bodies = val[3][0..-2] + else_t, else_body = val[3][-1] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1120) + def _reduce_299(val, _values, result) + when_bodies = val[2][0..-2] + else_t, else_body = val[2][-1] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1129) + def _reduce_300(val, _values, result) + result = @builder.case(val[0], nil, + [], val[2], val[3], + val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1135) + def _reduce_301(val, _values, result) + @lexer.cond.push(true) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1139) + def _reduce_302(val, _values, result) + @lexer.cond.pop + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1143) + def _reduce_303(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1149) + def _reduce_304(val, _values, result) + @static_env.extend_static + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1153) + def _reduce_305(val, _values, result) + if in_def? + diagnostic :error, :class_in_def, nil, val[0] + end + + lt_t, superclass = val[2] + result = @builder.def_class(val[0], val[1], + lt_t, superclass, + val[4], val[5]) + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1166) + def _reduce_306(val, _values, result) + result = @def_level + @def_level = 0 + + @static_env.extend_static + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1173) + def _reduce_307(val, _values, result) + result = @builder.def_sclass(val[0], val[1], val[2], + val[5], val[6]) + + @static_env.unextend + + @def_level = val[4] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1182) + def _reduce_308(val, _values, result) + @static_env.extend_static + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1186) + def _reduce_309(val, _values, result) + if in_def? + diagnostic :error, :module_in_def, nil, val[0] + end + + result = @builder.def_module(val[0], val[1], + val[3], val[4]) + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1197) + def _reduce_310(val, _values, result) + @def_level += 1 + @static_env.extend_static + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1202) + def _reduce_311(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + @static_env.unextend + @def_level -= 1 + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1210) + def _reduce_312(val, _values, result) + @lexer.state = :expr_fname + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1214) + def _reduce_313(val, _values, result) + @def_level += 1 + @static_env.extend_static + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1219) + def _reduce_314(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + @static_env.unextend + @def_level -= 1 + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1227) + def _reduce_315(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1231) + def _reduce_316(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1235) + def _reduce_317(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1239) + def _reduce_318(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result + end +.,., + +# reduce 319 omitted + +# reduce 320 omitted + +# reduce 321 omitted + +# reduce 322 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1249) + def _reduce_323(val, _values, result) + result = val[1] + + result + end +.,., + +# reduce 324 omitted + +# reduce 325 omitted + +# reduce 326 omitted + +# reduce 327 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1259) + def _reduce_328(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result + end +.,., + +# reduce 329 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1270) + def _reduce_330(val, _values, result) + result = val + + result + end +.,., + +# reduce 331 omitted + +# reduce 332 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1278) + def _reduce_333(val, _values, result) + result = [ @builder.arg_expr(val[0]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1282) + def _reduce_334(val, _values, result) + result = val[0] << @builder.arg_expr(val[2]) + + result + end +.,., + +# reduce 335 omitted + +# reduce 336 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1289) + def _reduce_337(val, _values, result) + result = val[0]. + push(@builder.blockarg_expr(val[2], val[3])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1294) + def _reduce_338(val, _values, result) + result = val[0]. + push(@builder.restarg_expr(val[2], val[3])). + push(@builder.blockarg_expr(val[5], val[6])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1300) + def _reduce_339(val, _values, result) + result = val[0]. + push(@builder.restarg_expr(val[2])). + push(@builder.blockarg_expr(val[4], val[5])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1306) + def _reduce_340(val, _values, result) + result = val[0]. + push(@builder.restarg_expr(val[2], val[3])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1311) + def _reduce_341(val, _values, result) + result = val[0]. + push(@builder.restarg_expr(val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1316) + def _reduce_342(val, _values, result) + result = [ @builder.restarg_expr(val[0], val[1]), + @builder.blockarg_expr(val[3], val[4]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1321) + def _reduce_343(val, _values, result) + result = [ @builder.restarg_expr(val[0]), + @builder.blockarg_expr(val[2], val[3]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1326) + def _reduce_344(val, _values, result) + result = [ @builder.restarg_expr(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1330) + def _reduce_345(val, _values, result) + result = [ @builder.restarg_expr(val[0]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1334) + def _reduce_346(val, _values, result) + result = [ @builder.blockarg_expr(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1340) + def _reduce_347(val, _values, result) + result = @builder.args(nil, [], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1344) + def _reduce_348(val, _values, result) + result = @builder.args(val[0], [], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1348) + def _reduce_349(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1352) + def _reduce_350(val, _values, result) + result = @builder.args(val[0], val[1], val[2], false) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1357) + def _reduce_351(val, _values, result) + @static_env.extend_dynamic + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1361) + def _reduce_352(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1368) + def _reduce_353(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1374) + def _reduce_354(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1380) + def _reduce_355(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1387) + def _reduce_356(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1393) + def _reduce_357(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1399) + def _reduce_358(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1405) + def _reduce_359(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1409) + def _reduce_360(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1415) + def _reduce_361(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1420) + def _reduce_362(val, _values, result) + @static_env.extend_dynamic + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1424) + def _reduce_363(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1430) + def _reduce_364(val, _values, result) + @static_env.extend_dynamic + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1434) + def _reduce_365(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1441) + def _reduce_366(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result + end +.,., + +# reduce 367 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1448) + def _reduce_368(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1452) + def _reduce_369(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1457) + def _reduce_370(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +# reduce 371 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1463) + def _reduce_372(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1476) + def _reduce_373(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1481) + def _reduce_374(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +# reduce 375 omitted + +# reduce 376 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1488) + def _reduce_377(val, _values, result) + result = [ val[0], val[1] ] + + result + end +.,., + +# reduce 378 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1494) + def _reduce_379(val, _values, result) + result = [ val[0], val[1] ] + + result + end +.,., + +# reduce 380 omitted + +# reduce 381 omitted + +# reduce 382 omitted + +# reduce 383 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1504) + def _reduce_384(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1509) + def _reduce_385(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1513) + def _reduce_386(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1518) + def _reduce_387(val, _values, result) + result = @builder.string_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1522) + def _reduce_388(val, _values, result) + result = @builder.string(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1527) + def _reduce_389(val, _values, result) + result = @builder.xstring_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1532) + def _reduce_390(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1538) + def _reduce_391(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1543) + def _reduce_392(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1547) + def _reduce_393(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1552) + def _reduce_394(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1556) + def _reduce_395(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1561) + def _reduce_396(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1566) + def _reduce_397(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1570) + def _reduce_398(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1575) + def _reduce_399(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1579) + def _reduce_400(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1584) + def _reduce_401(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1588) + def _reduce_402(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1593) + def _reduce_403(val, _values, result) + result = @builder.string_internal(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1597) + def _reduce_404(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1601) + def _reduce_405(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1606) + def _reduce_406(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1614) + def _reduce_407(val, _values, result) + result = @builder.gvar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1618) + def _reduce_408(val, _values, result) + result = @builder.ivar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1622) + def _reduce_409(val, _values, result) + result = @builder.cvar(val[0]) + + result + end +.,., + +# reduce 410 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1629) + def _reduce_411(val, _values, result) + result = @builder.symbol(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1634) + def _reduce_412(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1639) + def _reduce_413(val, _values, result) + result = @builder.integer(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1643) + def _reduce_414(val, _values, result) + result = @builder.float(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1647) + def _reduce_415(val, _values, result) + result = @builder.negate(val[0], + @builder.integer(val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1652) + def _reduce_416(val, _values, result) + result = @builder.negate(val[0], + @builder.float(val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1658) + def _reduce_417(val, _values, result) + result = @builder.ident(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1662) + def _reduce_418(val, _values, result) + result = @builder.ivar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1666) + def _reduce_419(val, _values, result) + result = @builder.gvar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1670) + def _reduce_420(val, _values, result) + result = @builder.cvar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1674) + def _reduce_421(val, _values, result) + result = @builder.const(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1678) + def _reduce_422(val, _values, result) + result = @builder.nil(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1682) + def _reduce_423(val, _values, result) + result = @builder.self(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1686) + def _reduce_424(val, _values, result) + result = @builder.true(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1690) + def _reduce_425(val, _values, result) + result = @builder.false(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1694) + def _reduce_426(val, _values, result) + result = @builder.__FILE__(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1698) + def _reduce_427(val, _values, result) + result = @builder.__LINE__(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1703) + def _reduce_428(val, _values, result) + result = @builder.accessible(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1708) + def _reduce_429(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1713) + def _reduce_430(val, _values, result) + result = @builder.nth_ref(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1717) + def _reduce_431(val, _values, result) + result = @builder.back_ref(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1722) + def _reduce_432(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1726) + def _reduce_433(val, _values, result) + result = [ val[0], val[1] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1730) + def _reduce_434(val, _values, result) + yyerrok + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1736) + def _reduce_435(val, _values, result) + result = @builder.args(val[0], val[1], val[3]) + + @lexer.state = :expr_beg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1742) + def _reduce_436(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1747) + def _reduce_437(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1754) + def _reduce_438(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1760) + def _reduce_439(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1766) + def _reduce_440(val, _values, result) + result = val[0]. + concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1771) + def _reduce_441(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1777) + def _reduce_442(val, _values, result) + result = val[0]. + concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1782) + def _reduce_443(val, _values, result) + result = val[0]. + concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1787) + def _reduce_444(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1791) + def _reduce_445(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1796) + def _reduce_446(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1800) + def _reduce_447(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1804) + def _reduce_448(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1808) + def _reduce_449(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1812) + def _reduce_450(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.arg(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1819) + def _reduce_451(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1823) + def _reduce_452(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1828) + def _reduce_453(val, _values, result) + @static_env.declare val[0][0] + + result = @builder.optarg(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1835) + def _reduce_454(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1839) + def _reduce_455(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +# reduce 456 omitted + +# reduce 457 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1846) + def _reduce_458(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1852) + def _reduce_459(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result + end +.,., + +# reduce 460 omitted + +# reduce 461 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1859) + def _reduce_462(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1866) + def _reduce_463(val, _values, result) + result = [ val[1] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1870) + def _reduce_464(val, _values, result) + result = [] + + result + end +.,., + +# reduce 465 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1876) + def _reduce_466(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1881) + def _reduce_467(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1885) + def _reduce_468(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1889) + def _reduce_469(val, _values, result) + result = @builder.pair_list_18(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1894) + def _reduce_470(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1898) + def _reduce_471(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby18.y', 1903) + def _reduce_472(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result + end +.,., + +# reduce 473 omitted + +# reduce 474 omitted + +# reduce 475 omitted + +# reduce 476 omitted + +# reduce 477 omitted + +# reduce 478 omitted + +# reduce 479 omitted + +# reduce 480 omitted + +# reduce 481 omitted + +# reduce 482 omitted + +# reduce 483 omitted + +# reduce 484 omitted + +# reduce 485 omitted + +# reduce 486 omitted + +# reduce 487 omitted + +# reduce 488 omitted + +# reduce 489 omitted + +# reduce 490 omitted + +# reduce 491 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1916) + def _reduce_492(val, _values, result) + yyerrok + + result + end +.,., + +# reduce 493 omitted + +# reduce 494 omitted + +# reduce 495 omitted + +module_eval(<<'.,.,', 'ruby18.y', 1925) + def _reduce_496(val, _values, result) + result = nil + + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby18 +end # module Parser diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/ruby22 b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/ruby22 new file mode 100644 index 000000000000..101119a232c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/ruby22 @@ -0,0 +1,7460 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' + + +require 'parser' + +Parser.check_for_encoding_support + +module Parser + class Ruby22 < Racc::Parser + +module_eval(<<'...end ruby22.y/module_eval...', 'ruby22.y', 2374) + + def version + 22 + end + + def default_encoding + Encoding::UTF_8 + end +...end ruby22.y/module_eval... +##### State transition tables begin ### + +clist = [ +'-476,-97,268,214,215,-98,-105,-476,-476,-476,-490,568,-476,-476,-476', +'610,-476,580,217,612,-288,581,214,215,-476,-491,-476,-476,-476,647,268', +'268,214,215,-104,589,-476,-476,568,-476,-476,-476,-476,-476,568,568', +'212,109,568,815,-100,121,-100,-83,-102,-99,214,215,268,218,-288,806', +'-69,574,646,-102,-97,-476,-476,-476,-476,-476,-476,-476,-476,-476,-476', +'-476,-476,-476,-476,-98,609,-476,-476,-476,611,-476,-476,715,267,-476', +'206,-96,-476,-476,263,-476,218,-476,207,-476,-105,-476,-476,-99,-476', +'-476,-476,-476,-476,-88,-476,-479,-476,-89,-96,218,267,267,-479,-479', +'-479,263,-101,-479,-479,-479,-476,-479,113,-476,-476,-476,-476,112,-476', +'-479,-476,-479,-479,-479,588,-476,-95,715,267,-101,715,-479,-479,218', +'-479,-479,-479,-479,-479,113,208,814,-91,-91,112,113,113,113,842,113', +'112,112,112,-100,112,-102,-99,-93,-100,213,-102,-99,-479,-479,-479,-479', +'-479,-479,-479,-479,-479,-479,-479,-479,-479,-479,113,257,-479,-479', +'-479,112,-479,-479,-574,-93,-479,316,-103,-479,-479,317,-479,597,-479', +'-574,-479,-90,-479,-479,444,-479,-479,-479,-479,-479,-291,-479,218,-479', +'-91,214,215,-291,-291,-291,647,260,527,-291,-291,526,-291,-479,261,-101', +'-479,-479,-479,-479,-101,-479,113,-479,-571,113,113,112,-479,-92,112', +'112,-291,-291,386,-291,-291,-291,-291,-291,-91,646,-93,-91,-575,396', +'-105,399,599,598,398,397,-91,548,597,545,544,543,747,546,443,91,92,-291', +'-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-476', +'-572,-291,-291,-291,-93,630,-476,-93,-490,-291,-94,-571,-291,91,92,-476', +'-93,-291,113,-291,515,-291,-291,112,-291,-291,-291,-291,-291,597,-291', +'-578,-291,445,-571,-491,-476,446,-578,-578,-578,599,598,-476,-578,-578', +'-291,-578,647,-291,-291,749,-94,-479,-291,-88,-578,217,833,-578,-479', +'-103,93,94,-97,-572,477,-578,-578,-479,-578,-578,-578,-578,-578,548', +'-104,545,544,543,515,546,-89,646,527,647,597,529,-572,597,486,-98,93', +'94,599,598,595,-412,-578,-578,-578,-578,-578,-578,-578,-578,-578,-578', +'-578,-578,-578,-578,-578,625,-578,-578,-578,597,631,-578,646,113,-578', +'626,-574,-578,112,-95,-578,597,-578,770,-578,-578,-578,-578,-104,-578', +'-578,-578,-578,-578,488,-578,-578,-578,597,-578,490,597,-412,599,598', +'595,599,598,600,-412,957,-578,-91,756,-578,-578,-578,-92,-412,-578,662', +'-100,-93,-578,-578,-578,-101,498,-578,-578,-578,-102,-578,-479,599,598', +'602,-412,-578,-100,-479,-578,-578,-578,-578,-578,599,598,604,771,-574', +'-68,-578,-578,-578,-578,-578,-578,-578,-578,-90,218,860,599,598,608', +'599,598,613,-99,214,215,-486,-578,548,-485,545,544,543,-486,546,501', +'-485,-578,-578,-578,-578,-578,-578,-578,-578,-578,-578,-578,-578,-578', +'-578,553,502,-578,-578,-578,-487,772,-578,-102,509,-578,556,-487,-578', +'-578,701,-578,272,-578,218,-578,-99,-578,-578,704,-578,-578,-578,-578', +'-578,553,-578,-578,-578,527,-484,79,529,113,-481,263,556,-484,112,564', +'563,-481,-578,80,557,-578,-578,-578,-578,238,-578,-291,-578,81,-482', +'210,512,-101,-291,-291,-291,-482,211,-291,-291,-291,-334,-291,440,564', +'563,209,516,-334,557,441,-483,-291,-291,-291,238,235,-334,-483,442,237', +'236,-291,-291,260,-291,-291,-291,-291,-291,548,261,545,544,543,-488', +'546,548,218,545,544,543,-488,546,548,530,545,544,543,527,546,-488,529', +'-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291,-291', +'238,701,-291,-291,-291,-489,773,-291,701,238,-291,531,-489,-291,-291', +'701,-291,704,-291,490,-291,-489,-291,-291,904,-291,-291,-291,-291,-291', +'113,-291,235,-291,574,112,237,236,238,233,234,235,214,215,388,237,236', +'-291,233,234,-291,-291,-291,-291,113,-291,113,-291,578,112,579,112,-103', +'5,69,70,71,9,57,614,235,507,63,64,237,236,617,67,508,65,66,68,30,31', +'72,73,218,506,-263,981,619,29,28,27,101,100,102,103,741,742,19,218,743', +'107,108,635,8,45,7,10,105,104,106,95,56,97,96,98,623,99,107,108,624', +'91,92,263,42,43,41,238,242,247,248,249,244,246,254,255,250,251,-281', +'231,232,517,634,252,253,-281,40,637,518,33,564,563,58,59,-281,238,60', +'442,35,235,238,241,44,237,236,238,233,234,245,243,239,20,240,837,806', +'238,89,79,82,83,576,84,86,85,87,837,806,577,218,80,88,218,256,218,-240', +'-83,575,62,666,81,93,94,290,69,70,71,9,57,218,520,584,63,64,677,682', +'683,67,583,65,66,68,30,31,72,73,685,585,689,692,693,29,28,27,101,100', +'102,103,695,697,19,699,707,708,709,620,8,45,292,10,105,104,106,95,56', +'97,96,98,711,99,107,108,574,91,92,718,42,43,41,238,242,247,248,249,244', +'246,254,255,250,251,-292,231,232,-292,736,252,253,-292,40,746,-292,294', +'750,751,58,59,-292,-264,60,-292,35,235,757,241,44,237,236,477,233,234', +'245,243,239,20,240,477,218,257,89,79,82,83,584,84,86,85,87,488,490,939', +'799,80,88,677,256,218,263,263,585,62,677,81,93,94,5,69,70,71,9,57,238', +'806,584,63,64,218,218,831,67,939,65,66,68,30,31,72,73,218,585,806,841', +'218,29,28,27,101,100,102,103,218,850,19,-265,859,861,862,635,8,45,7', +'10,105,104,106,95,56,97,96,98,692,99,107,108,865,91,92,867,42,43,41', +'238,242,247,248,249,244,246,254,255,250,251,-291,231,232,-488,869,252', +'253,-291,40,871,-488,33,-575,218,58,59,-291,873,60,-488,35,235,874,241', +'44,237,236,877,233,234,245,243,239,20,240,879,880,677,89,79,82,83,-489', +'84,86,85,87,882,-263,-489,886,80,88,888,256,891,692,893,-489,62,895', +'81,93,94,290,69,70,71,9,57,897,899,986,63,64,899,218,905,67,987,65,66', +'68,30,31,72,73,907,985,909,915,918,29,28,27,101,100,102,103,218,936', +'19,545,544,543,922,546,8,45,292,10,105,104,106,95,56,97,96,98,-266,99', +'107,108,933,91,92,940,42,43,41,238,242,247,248,249,244,246,254,255,250', +'251,-291,231,232,-281,941,252,253,-291,40,950,-281,33,-575,951,58,59', +'-291,959,60,-281,35,235,961,241,44,237,236,962,233,234,245,243,239,20', +'240,967,736,692,89,79,82,83,-292,84,86,85,87,971,973,-292,975,80,88', +'977,256,977,988,989,-292,62,899,81,93,94,290,69,70,71,9,57,899,899,994', +'63,64,959,-575,-574,67,682,65,66,68,30,31,72,73,116,117,118,119,120', +'29,28,27,101,100,102,103,959,936,19,545,544,543,1013,546,8,45,292,10', +'105,104,106,95,56,97,96,98,1014,99,107,108,1015,91,92,977,42,43,41,238', +'242,247,248,249,244,246,254,255,250,251,-291,231,232,977,977,252,253', +'-291,40,218,899,33,-575,959,58,59,-291,977,60,,35,235,,241,44,237,236', +',233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,256', +',,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72', +'73,116,117,118,119,120,29,28,27,101,100,102,103,,,19,116,117,118,119', +'120,8,45,292,10,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,238,242,247,248,249,244,246,254,255,250,251,,231,232,,,252,253,,40', +',,294,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,245,243,239,20,240', +',,,89,79,82,83,,84,86,85,87,,,,,80,88,,256,,,,,62,,81,93,94,290,69,70', +'71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102', +'103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98,,99,107,108,,91', +'92,,42,43,41,238,242,247,248,249,244,246,254,255,250,251,,231,232,,', +'252,253,,40,,,294,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,245', +'243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,256,,,,,62,,81', +'93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96', +'98,,99,107,108,,91,92,,42,43,41,238,242,247,248,249,244,246,254,255', +'250,251,,231,232,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237', +'236,,233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88', +'218,256,,,,,62,,81,93,94,5,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,7,10,105,104,106', +'95,56,97,96,98,,99,107,108,,91,92,,42,43,41,238,242,247,248,249,244', +'246,254,255,250,251,,231,232,,,252,253,,40,,,33,,,58,59,,,60,,35,235', +',241,44,237,236,,233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85', +'87,,,,,80,88,,256,,,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,292', +'10,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,238,242,247', +'248,249,244,246,254,255,250,251,,231,232,,,252,253,,40,,,33,,,58,59', +',,60,,35,235,,241,44,237,236,,233,234,245,243,239,20,240,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,256,,,,,62,,81,93,94,290,69,70,71,9,57,,', +',63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19', +',,,,,8,45,292,10,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,238,242,247,248,249,244,246,254,255,250,251,,231,232,,,252,253,,40', +',,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,245,243,239,20,240', +',,,89,79,82,83,,84,86,85,87,,,,,80,88,,256,,,,,62,,81,93,94,290,69,70', +'71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102', +'103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98,,99,107,108,,91', +'92,,42,43,41,238,242,247,248,249,244,246,254,255,250,251,,231,232,,', +'252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,245,243', +'239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,256,,,,,62,,81,93', +'94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98', +',99,107,108,,91,92,,42,43,41,238,242,247,248,249,244,246,254,255,250', +'251,,231,232,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236', +',233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,256', +',,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,42,43,41,238,242,247,248,249,244,246', +'254,255,250,251,,231,232,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241', +'44,237,236,,233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,', +',,,80,88,,256,,,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,292,10', +'105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,238,242,247', +'248,249,244,246,254,255,250,251,,231,232,,,252,253,,40,,,33,,,58,59', +',,60,,35,235,,241,44,237,236,,233,234,245,243,239,20,240,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,256,,,,,62,,81,93,94,290,69,70,71,9,57,,', +',63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19', +',,,,,8,45,292,10,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,238,242,247,248,249,244,246,254,255,250,251,,231,232,,,252,253,,40', +',,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,245,243,239,20,240', +',,,89,79,82,83,,84,86,85,87,,,,,80,88,,256,,,,,62,,81,93,94,290,69,70', +'71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102', +'103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98,,99,107,108,,91', +'92,,42,43,41,238,242,247,248,249,244,246,254,255,250,251,,231,232,,', +'252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,245,243', +'239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,256,,,,,62,,81,93', +'94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98', +',99,107,108,,91,92,,42,43,41,238,242,247,248,249,244,246,254,255,250', +'251,,-597,-597,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236', +',233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,', +',,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,42,43,41,238,242,247,248,249,244,246', +'254,255,250,251,,-597,-597,,,252,253,,40,,,33,,,58,59,,,60,,35,235,', +'241,44,237,236,,233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85', +'87,,,,,80,88,,,,,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,548,19,545,544,543', +',546,8,45,292,10,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,238,-597,-597,-597,-597,244,246,,701,-597,-597,,,,,,252,253,,40,', +',33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,245,243,239,20,240', +',,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62,,81,93,94,290,69,70,71', +'9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102', +'103,,548,19,545,544,543,,546,8,45,292,10,105,104,106,95,56,97,96,98', +',99,107,108,,91,92,,42,43,41,238,,,548,,545,544,543,701,546,,,,,,,252', +'253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,701,,239', +'20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62,,81,93,94,290', +'69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101', +'100,102,103,,548,19,545,544,543,,546,8,45,292,10,105,104,106,95,56,97', +'96,98,,99,107,108,,91,92,,42,43,41,238,,,,,,,,701,,,,,,,,252,253,,40', +',,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,,,239,20,240,,,,89', +'79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62,,81,93,94,290,69,70,71,9,57', +',,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,', +',19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98,,99,107,108,,91,92,', +'42,43,41,238,,,,,,,,,,,,,,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241', +'44,237,236,,233,234,,,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80', +'88,,,,,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104', +'106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,238,,,,,,,,,,,,,,,,252', +'253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,,,239,20', +'240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62,,81,93,94,290,69', +'70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100', +'102,103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98,,99,107,108', +',91,92,,42,43,41,238,-597,-597,-597,-597,244,246,,,-597,-597,,,,,,252', +'253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,245,243,239', +'20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62,,81,93,94,290', +'69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101', +'100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98,,99,107', +'108,,91,92,,42,43,41,238,-597,-597,-597,-597,244,246,,,-597,-597,,,', +',,252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,245', +'243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62,,81,93', +'94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28', +'27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98', +',99,107,108,,91,92,,42,43,41,238,-597,-597,-597,-597,244,246,,,-597', +'-597,,,,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236,,233', +'234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62', +',81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,', +',,29,28,27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97', +'96,98,,99,107,108,,91,92,,42,43,41,238,-597,-597,-597,-597,244,246,', +',-597,-597,,,,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237,236', +',233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,', +',,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72', +'73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,42,43,41,238,-597,-597,-597,-597,244', +'246,,,-597,-597,,,,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237', +'236,,233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88', +',,,,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106', +'95,56,97,96,98,,99,107,108,,91,92,,42,43,41,238,242,247,248,249,244', +'246,,,250,251,,,,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44,237', +'236,,233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,,80,88', +',,,,,,62,,81,93,94,290,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106', +'95,56,97,96,98,,99,107,108,,91,92,,42,43,41,238,242,247,248,249,244', +'246,254,,250,251,,,,,,252,253,,40,,,33,,,58,59,,,60,,35,235,,241,44', +'237,236,,233,234,245,243,239,20,240,,,,89,79,82,83,,84,86,85,87,,,,', +'80,88,,,,,,,62,,81,93,94,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,7,10,105,104,106', +'95,56,97,96,98,,99,107,108,,91,92,,42,43,41,238,,,,,,,,,,,,,,,,252,253', +',40,,,33,,,58,59,,,60,,35,235,,241,44,237,236,,233,234,,,,20,,,,,89', +'79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,,,,45', +',,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,238,,,,,,', +',,,,,,,,,252,253,,223,,,229,,,58,59,,,60,,,235,,241,44,237,236,,233', +'234,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57', +'81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102', +'103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108,,91,92', +',42,43,41,238,,,,,,,,,,,,,,,,252,253,,223,,,229,,,58,59,,,60,,281,235', +'279,,44,237,236,285,233,234,,,,228,,,,,89,282,82,83,,84,86,85,87,,,', +',80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97', +'96,98,284,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,', +',58,59,,,60,,281,,279,,44,,,285,,,,,,228,,,,,89,282,82,83,,84,86,85', +'87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31', +'72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95', +'56,97,96,98,284,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,', +',229,,,58,59,,,60,,281,,279,,44,,,285,,,,,,228,,,,,89,282,82,83,,84', +'86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68', +'309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,307,,,105', +'104,106,95,56,97,96,98,,99,107,108,,91,92,,,,313,,,,,,,,,,,,,,,,,,,', +'303,,,299,,,58,59,,,60,,298,,,,,,,,,,,,,,,,,,89,79,82,83,,84,86,85,87', +',,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72', +'73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,307,,,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,,,313,,,,,,,,,,,,,,,,,,,,303,,,229,', +',58,59,,,60,,548,,545,544,543,553,546,,,,,,,,,,556,,89,79,82,83,,84', +'86,85,87,,,,,80,88,,,,315,,551,62,,81,93,94,69,70,71,,57,564,563,,63', +'64,557,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103', +',,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,', +',89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230', +',,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,', +',,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89', +'79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,', +'67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,', +',,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,', +',,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79', +'82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67', +',65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,', +',45,,,105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42,43,41,,,', +',,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,,,44,,,285,,,,,,228,,,', +',89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230', +',,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42,43,41', +',,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,285,,,,,,228,,,', +',89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,', +',45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,', +',,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105', +'104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,', +',,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86', +'85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80', +'88,113,,,,,112,62,,81,93,94,69,70,71,,57,,,,63,64,,,,67,,65,66,68,309', +'310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,307,,,105,104', +'106,95,56,97,96,98,,99,107,108,,91,92,,,,313,,,,,,,,,,,,,,,,,,,,348', +',,33,,,58,59,,,60,,35,,,,,,,,,,,,,,,,,,89,79,82,83,,84,86,85,87,,,,', +'80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73', +',,,,,305,306,312,101,100,102,103,,,230,,,,,,,307,,,105,104,106,353,56', +'97,96,354,,99,107,108,,91,92,,,,313,,,,,,,,,,,,,,,,,360,,,355,,,229', +',,58,59,,,60,,,,,,,,,,,,,,,,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,', +',,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305', +'306,312,101,100,102,103,,,230,,,,,,,307,,,105,104,106,353,56,97,96,354', +',99,107,108,,91,92,,,,313,,,,,,,,,,,,,,,,,,,,355,,,229,,,58,59,,,60', +',548,,545,544,543,553,546,,,,,,,,,,556,,89,79,82,83,,84,86,85,87,,,', +',80,88,,,,,,551,62,,81,93,94,69,70,71,9,57,564,563,,63,64,557,,,67,', +'65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,8,45,7', +'10,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,', +',,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,,,,,20,,,,,89,79,82,83', +',84,86,85,87,,,,,80,88,,,,,,388,62,,81,93,94,69,70,71,,57,,,,63,64,', +',,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,', +'45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,', +',,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83', +',84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105,104', +'106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223', +',,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,', +',,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105,104,106,95,56,97,96', +'98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59', +',,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69', +'70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'101,100,102,103,,,19,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108', +',91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,', +',,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62,,81,93,94', +'69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101', +'100,102,103,,,19,,,,,,8,45,,10,105,104,106,95,56,97,96,98,,99,107,108', +',91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,', +',,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81', +'93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103', +',,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,404,,,,44,,,,,,,,,228', +',,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,', +',,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,', +',,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79', +'82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67', +',65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,,,,45,', +',105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42,43,41,,,,,,,,', +',,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,279,,44,,,285,,,,,,228,,,,,89', +'282,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,', +',67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,,,', +'45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,', +',,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,,,,45,,,105', +'104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,', +',,,223,,,229,,,58,59,,,60,,404,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84', +'86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105,104,106', +'95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,', +',229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,', +',,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105,104,106,95,56,97,96', +'98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59', +',,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69', +'70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'101,100,102,103,,,19,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108', +',91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,', +',,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81', +'93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103', +',,19,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'89,79,82,83,,84,86,85,87,,,,,80,88,218,,,69,70,71,62,57,81,93,94,63', +'64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,', +'230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,', +',89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230', +',,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,', +',,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89', +'79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,', +'67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,', +',,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,', +',,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79', +'82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67', +',65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,', +',45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,', +',,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65', +'66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45', +',,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,', +',,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83', +',84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66', +'68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105', +'104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,', +',,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86', +'85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309', +'310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104', +'106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223', +',,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87', +',,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72', +'73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229', +',,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80', +'88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,', +',,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97', +'96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58', +'59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,', +',,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305', +'306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98', +',99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,', +'60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69', +'70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306', +'312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99', +'107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,', +',,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71', +'62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312', +'101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107', +'108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,', +'44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62', +'57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101', +'100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108', +',91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,', +',,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57', +'81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100', +'102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91', +'92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,', +',,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93', +'94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102', +'103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,', +'42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228', +',,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63', +'64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,', +'230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,', +',89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230', +',,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,', +',,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89', +'79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,', +'67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,', +',,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,', +',,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79', +'82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67', +',65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,', +',45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,', +',,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65', +'66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45', +',,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,', +',,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83', +',84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66', +'68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105', +'104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,', +',,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86', +'85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309', +'310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104', +'106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223', +',,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87', +',,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72', +'73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229', +',,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80', +'88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,', +',,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97', +'96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58', +'59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,', +',,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305', +'306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98', +',99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,', +'60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69', +'70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306', +'312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99', +'107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,', +',,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71', +'62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100', +'102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108,', +'91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,279', +',44,,,285,,,,,,228,,,,,89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70', +'71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101', +'100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108', +',91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,279', +',44,,,285,,,,,,228,,,,,89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70', +'71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101', +'100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108', +',91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,279', +',44,,,285,,,,,,228,,,,,89,282,82,83,,84,86,85,87,,,,,80,88,218,,,69', +'70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306', +'312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99', +'107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,', +',,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71', +'62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312', +'101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107', +'108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,', +'44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62', +'57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101', +'100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108', +',91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,', +',,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57', +'81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100', +'102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91', +'92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,', +',,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62,,81,93,94,69', +'70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100', +'102,103,,,19,,,,,,8,45,,10,105,104,106,95,56,97,96,98,,99,107,108,,91', +'92,,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35,,,,44,,,,,', +',,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93', +'94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102', +'103,,,230,,,,,,,307,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92', +',,,313,,,,,,,,,,,,,,,,,,,,303,,,229,,,58,59,,,60,,548,,545,544,543,553', +'546,,,,,,,,,,556,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,504,,551,62', +',81,93,94,69,70,71,,57,564,563,,63,64,557,,,67,,65,66,68,309,310,72', +'73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,307,,,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,,,313,,,,,,,,,,,,,,,,,,,,303,,,299,', +',58,59,,,60,,,,,,,,,,,,,,,,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,', +',69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305', +'306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98', +',99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,520,,58,59', +',,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69', +'70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'101,100,102,103,,,19,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108', +',91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,', +',,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81', +'93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103', +',,19,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,', +'89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,', +',45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,', +',,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105', +'104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,', +',,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86', +'85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229', +',,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80', +'88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,', +',,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97', +'96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58', +'59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,', +',,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29', +'28,27,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,284', +'99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60', +',281,,279,,44,,,285,,,,,,228,,,,,89,282,82,83,,84,86,85,87,,,,,80,88', +',,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,', +'305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96', +'98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59', +',,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69', +'70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306', +'312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99', +'107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,', +',,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71', +'62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312', +'101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107', +'108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,', +'44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62', +'57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101', +'100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108', +',91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,', +',,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57', +'81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100', +'102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108,', +'91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,659,,279', +',44,,,285,,,,,,228,,,,,89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70', +'71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312', +'101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107', +'108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,279', +',44,,,285,,,,,,228,,,,,89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70', +'71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312', +'101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107', +'108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,', +'44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,,62,,81,93', +'94,69,70,71,9,57,,,,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27', +'101,100,102,103,,,19,,,,,,8,45,292,10,105,104,106,95,56,97,96,98,,99', +'107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,40,,,33,,,58,59,,,60,,35', +',,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,,,388,62', +',81,93,94,69,70,71,,57,,,,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305', +'306,312,101,100,102,103,,,230,,,,,,,307,,,105,104,106,95,56,97,96,98', +',99,107,108,,91,92,,,,313,,,,,,,,,,,,,,,,,,,,303,,,299,,,58,59,,,60', +',,,,,,,,,,,,,,,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62', +'57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100', +'102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108,', +'91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,279', +',44,,,285,,,,,,228,,,,,89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70', +'71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312', +'101,100,102,103,,,230,,,,,,,307,,,105,104,106,95,56,97,96,98,,99,107', +'108,,91,92,,,,313,,,,,,,,,,,,,,,,,,,,303,,,299,,,58,59,,,60,,,,,,,,', +',,,,,,,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93', +'94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102', +'103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,', +'42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228', +',,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63', +'64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,', +'230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,', +',89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,', +',45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,', +',,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65', +'66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45', +',,105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42,43,41,,,,,,,', +',,,,,,,,,,,,223,,,229,,,58,59,,,60,,659,,,,44,,,285,,,,,,228,,,,,89', +'282,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,', +',67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,', +',,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42,43,41', +',,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,285,,,,,,228,,,', +',89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230', +',,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,', +',,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89', +'79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,', +'67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,', +',,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,', +',,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,,,44,,,,,,,,,228,,,,,89', +'79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,', +'67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,,,,45', +',,105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42,43,41,,,,,,,', +',,,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,279,,44,,,285,,,,,,228,,,,', +'89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,', +',,45,,,105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42,43,41,,', +',,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,279,,44,,,285,,,,,,228', +',,,,89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63', +'64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,', +'230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,754,,,,44,,,,,,,,,228', +',,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63', +'64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,', +'230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,', +',89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230', +',,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42,43,41', +',,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,659,,279,,44,,,285,,,,,,228', +',,,,89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63', +'64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,', +'230,,,,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42', +'43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,279,,44,,,285,,,', +',,228,,,,,89,282,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93', +'94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,', +',230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,', +',89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,', +',,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,', +',,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65', +'66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,,,,45,,,105', +'104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,', +',,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86', +'85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30', +'31,72,73,,,,,,29,28,27,101,100,102,103,,,230,,,,,,,45,,,105,104,106', +'95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,', +',229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,', +',,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97', +'96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58', +'59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,', +',,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305', +'306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98', +',99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,', +'60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69', +'70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306', +'312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99', +'107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,', +',,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71', +'62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312', +'101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107', +'108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,', +'44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62', +'57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101', +'100,102,103,,,230,,,,,,,307,,,105,104,106,95,56,97,96,98,,99,107,108', +',91,92,,,,313,,,,,,,,,,,,,,,,,,,,303,,,299,,,58,59,,,60,,,,,,,,,,,,', +',,,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94', +'63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103', +',,230,,,,,,,307,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,,,313', +',,,,,,,,,,,,,,,,,,,303,,,299,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65', +'66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45', +',,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,', +',,,,,,,,,223,,,229,,,58,59,,,60,,404,,,,44,,,,,,,,,228,,,,,89,79,82', +'83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65', +'66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45', +',,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,', +',,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83', +',84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66', +'68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105,104', +'106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223', +',,229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,', +',,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73', +',,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105,104,106,95,56,97,96', +'98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59', +',,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69', +'70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306', +'312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99', +'107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,', +',,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71', +'62,57,81,93,94,63,64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100', +'102,103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91', +'92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,', +',,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93', +'94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102', +'103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,', +'42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228', +',,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63', +'64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,', +'230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43', +'41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,', +',89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64', +',,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230', +',,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,', +',,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89', +'79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,', +'67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,', +',,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,', +',,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79', +'82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67', +',65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102,103,,,230,,,,,', +',307,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,,,,313,,,,,,,,', +',,,,,,,,,,,876,,,229,,,58,59,,,60,,,,,,,,,,,,,,,,,,,,89,79,82,83,,84', +'86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68', +'30,31,72,73,,,,,,29,28,27,101,100,102,103,,,19,,,,,,,45,,,105,104,106', +'95,56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,', +',229,,,58,59,,,60,,,,,,44,,,,,,,,,20,,,,,89,79,82,83,,84,86,85,87,,', +',,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72', +'73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229', +',,58,59,,,60,,659,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,', +',80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73', +',,,,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95,56', +'97,96,98,284,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229', +',,58,59,,,60,,,,279,,44,,,285,,,,,,228,,,,,89,282,82,83,,84,86,85,87', +',,,,80,88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72', +'73,,,,,,305,306,312,101,100,102,103,,,230,,,,,,,45,,,105,104,106,95', +'56,97,96,98,,99,107,108,,91,92,,42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229', +',,58,59,,,60,,,,,,44,,,,,,,,,228,,,,,89,79,82,83,,84,86,85,87,,,,,80', +'88,,,,69,70,71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,', +',,,305,306,312,101,100,102,103,,,230,,,,,,,307,,,105,104,106,95,56,97', +'96,98,,99,107,108,,91,92,,,,313,,,,,,,,,,,,,,,,,,,,876,,,229,,,58,59', +',,60,,,,,,,,,,,,,,,,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70', +'71,62,57,81,93,94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312', +'101,100,102,103,,,230,,,,,,,307,,,105,104,106,95,56,97,96,98,,99,107', +'108,,91,92,,,,313,,,,,,,,,,,,,,,,,,,,947,,,229,,,58,59,,,60,,,,,,,,', +',,,,,,,,,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93', +'94,63,64,,,,67,,65,66,68,309,310,72,73,,,,,,305,306,312,101,100,102', +'103,,,230,,,,,,,45,,,105,104,106,95,56,97,96,98,,99,107,108,,91,92,', +'42,43,41,,,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,,,,,44,,,,,,,,,228', +',,,,89,79,82,83,,84,86,85,87,,,,,80,88,,,,69,70,71,62,57,81,93,94,63', +'64,,,,67,,65,66,68,30,31,72,73,,,,,,29,28,27,101,100,102,103,,,230,', +',,,,,45,,,105,104,106,95,56,97,96,98,284,99,107,108,,91,92,,42,43,41', +',,,,,,,,,,,,,,,,,,,223,,,229,,,58,59,,,60,,281,,279,,44,,,285,,,,,,228', +',,,,89,282,82,83,,84,86,85,87,,,,,80,88,,,,,-282,,62,,81,93,94,-282', +'-282,-282,,,-282,-282,-282,,-282,,,,,,,,,,-282,-282,-282,,,,,,,,-282', +'-282,,-282,-282,-282,-282,-282,,,,,,,,,,,,,,,,,,,,,,,,-282,-282,-282', +'-282,-282,-282,-282,-282,-282,-282,-282,-282,-282,-282,,,-282,-282,-282', +',,-282,,,-282,,,-282,-282,,-282,,-282,,-282,,-282,-282,,-282,-282,-282', +'-282,-282,,-282,,-282,,,,,,,,,,,,,,-282,,,-282,-282,-282,-282,-579,-282', +',-282,,,,-579,-579,-579,,,-579,-579,-579,,-579,,,,,,,,,-579,-579,-579', +'-579,,,,,,,,-579,-579,,-579,-579,-579,-579,-579,,,,,,,,,,,,,,,,,,,,', +',,,-579,-579,-579,-579,-579,-579,-579,-579,-579,-579,-579,-579,-579', +'-579,,,-579,-579,-579,,,-579,,,-579,,,-579,-579,,-579,,-579,,-579,,-579', +'-579,,-579,-579,-579,-579,-579,,-579,-579,-579,,,,,,,,,,,,,,-579,,,-579', +'-579,-579,-579,-580,-579,,-579,,,,-580,-580,-580,,,-580,-580,-580,,-580', +',,,,,,,,-580,-580,-580,-580,,,,,,,,-580,-580,,-580,-580,-580,-580,-580', +',,,,,,,,,,,,,,,,,,,,,,,-580,-580,-580,-580,-580,-580,-580,-580,-580', +'-580,-580,-580,-580,-580,,,-580,-580,-580,,,-580,,,-580,,,-580,-580', +',-580,,-580,,-580,,-580,-580,,-580,-580,-580,-580,-580,,-580,-580,-580', +',,,,,,,,,,,,,-580,,,-580,-580,-580,-580,-411,-580,,-580,,,,-411,-411', +'-411,,,-411,-411,-411,,-411,,,,,,,,,-411,-411,-411,,,,,,,,,-411,-411', +',-411,-411,-411,-411,-411,,,,,,,,,,,,,,,,,,,,,,,,-411,-411,-411,-411', +'-411,-411,-411,-411,-411,-411,-411,-411,-411,-411,,,-411,-411,-411,', +',-411,,263,-411,,,-411,-411,,-411,,-411,,-411,,-411,-411,,-411,-411', +'-411,-411,-411,-298,-411,-411,-411,,,,-298,-298,-298,,,-298,-298,-298', +',-298,-411,,,-411,-411,,-411,,-411,-298,-298,,,,,,,,,-298,-298,,-298', +'-298,-298,-298,-298,,,,,,,,,,,,,,,,,,,,,,,,-298,-298,-298,-298,-298', +'-298,-298,-298,-298,-298,-298,-298,-298,-298,,,-298,-298,-298,,,-298', +',272,-298,,,-298,-298,,-298,,-298,,-298,,-298,-298,,-298,-298,-298,-298', +'-298,,-298,-246,-298,,,,,,-246,-246,-246,,,-246,-246,-246,-298,-246', +',-298,-298,,-298,,-298,,-246,-246,-246,,,,,,,,,-246,-246,,-246,-246', +'-246,-246,-246,,,,,,,,,,,,,,,,,,,,,,,,-246,-246,-246,-246,-246,-246', +'-246,-246,-246,-246,-246,-246,-246,-246,,,-246,-246,-246,,,-246,,263', +'-246,,,-246,-246,,-246,,-246,,-246,,-246,-246,,-246,-246,-246,-246,-246', +',-246,-246,-246,,,,,,,,,,,,,,-246,,-246,-246,-246,,-246,,-246,-246,-246', +'-246,,,-246,-246,-246,548,-246,545,544,543,553,546,,,,-246,-246,,,,', +'556,,,,,-246,-246,,-246,-246,-246,-246,-246,,,,,,,,,,551,548,,545,544', +'543,553,546,,561,560,564,563,,,,557,556,548,,545,544,543,553,546,-246', +',,,,,,-246,,556,,,263,-246,551,534,,218,,,,,,561,560,564,563,,,,557', +'551,,,,-246,-246,,,,561,560,564,563,,,,557,,,-246,,,-246,,,,,-246,173', +'184,174,197,170,190,180,179,200,201,195,178,177,172,198,202,203,182', +'171,185,189,191,183,176,,,,192,199,194,193,186,196,181,169,188,187,', +',,,,168,175,166,167,163,164,165,124,126,123,,125,,,,,,,,,157,158,,154', +'136,137,138,145,142,144,,,139,140,,,,159,160,146,147,,,,,,,,,,,,,,151', +'150,,135,156,153,152,161,148,149,143,141,133,155,134,,,162,89,,,,,,', +',,,,,,,88,173,184,174,197,170,190,180,179,200,201,195,178,177,172,198', +'202,203,182,171,185,189,191,183,176,,,,192,199,194,193,186,196,181,169', +'188,187,,,,,,168,175,166,167,163,164,165,124,126,,,125,,,,,,,,,157,158', +',154,136,137,138,145,142,144,,,139,140,,,,159,160,146,147,,,,,,,,,,', +',,,151,150,,135,156,153,152,161,148,149,143,141,133,155,134,,,162,89', +',,,,,,,,,,,,,88,173,184,174,197,170,190,180,179,200,201,195,178,177', +'172,198,202,203,182,171,185,189,191,183,176,,,,192,199,194,193,186,196', +'181,169,188,187,,,,,,168,175,166,167,163,164,165,124,126,,,125,,,,,', +',,,157,158,,154,136,137,138,145,142,144,,,139,140,,,,159,160,146,147', +',,,,,,,,,,,,,151,150,,135,156,153,152,161,148,149,143,141,133,155,134', +',,162,89,,,,,,,,,,,,,,88,173,184,174,197,170,190,180,179,200,201,195', +'178,177,172,198,202,203,182,171,185,189,191,183,176,,,,192,199,194,193', +'186,196,181,169,188,187,,,,,,168,175,166,167,163,164,165,124,126,,,125', +',,,,,,,,157,158,,154,136,137,138,145,142,144,,,139,140,,,,159,160,146', +'147,,,,,,,,,,,,,,151,150,,135,156,153,152,161,148,149,143,141,133,155', +'134,,,162,89,,,,,,,,,,,,,,88,173,184,174,197,170,190,180,179,200,201', +'195,178,177,172,198,202,203,182,171,185,189,191,183,176,,,,192,199,194', +'371,370,372,369,169,188,187,,,,,,168,175,166,167,366,367,368,364,126', +'97,96,365,,99,,,,,,,157,158,,154,136,137,138,145,142,144,,,139,140,', +',,159,160,146,147,,,,,,376,,,,,,,,151,150,,135,156,153,152,161,148,149', +'143,141,133,155,134,,,162,173,184,174,197,170,190,180,179,200,201,195', +'178,177,172,198,202,203,182,171,185,189,191,183,176,,,,192,199,194,193', +'186,196,181,169,188,187,,,,,,168,175,166,167,163,164,165,124,126,,,125', +',,,,,,,,157,158,,154,136,137,138,145,142,144,,,139,140,,,,159,160,146', +'147,,,,,,,,,,,,,,151,150,,135,156,153,152,161,148,149,143,141,133,155', +'134,413,417,162,,414,,,,,,,,,157,158,,154,136,137,138,145,142,144,,', +'139,140,,,,159,160,146,147,,,,,,263,,,,,,,,151,150,,135,156,153,152', +'161,148,149,143,141,133,155,134,420,424,162,,419,,,,,,,,,157,158,,154', +'136,137,138,145,142,144,,,139,140,,,,159,160,146,147,,,,,,263,,,,,,', +',151,150,,135,156,153,152,161,148,149,143,141,133,155,134,475,417,162', +',476,,,,,,,,,157,158,,154,136,137,138,145,142,144,,,139,140,,,,159,160', +'146,147,,,,,,,,,,,,,,151,150,,135,156,153,152,161,148,149,143,141,133', +'155,134,638,417,162,,639,,,,,,,,,157,158,,154,136,137,138,145,142,144', +',,139,140,,,,159,160,146,147,,,,,,263,,,,,,,,151,150,,135,156,153,152', +'161,148,149,143,141,133,155,134,640,424,162,,641,,,,,,,,,157,158,,154', +'136,137,138,145,142,144,,,139,140,,,,159,160,146,147,,,,,,263,,,,,,', +',151,150,,135,156,153,152,161,148,149,143,141,133,155,134,670,417,162', +',671,,,,,,,,,157,158,,154,136,137,138,145,142,144,,,139,140,,,,159,160', +'146,147,,,,,,263,,,,,,,,151,150,,135,156,153,152,161,148,149,143,141', +'133,155,134,673,424,162,,674,,,,,,,,,157,158,,154,136,137,138,145,142', +'144,,,139,140,,,,159,160,146,147,,,,,,263,,,,,,,,151,150,,135,156,153', +'152,161,148,149,143,141,133,155,134,638,417,162,,639,,,,,,,,,157,158', +',154,136,137,138,145,142,144,,,139,140,,,,159,160,146,147,,,,,,263,', +',,,,,,151,150,,135,156,153,152,161,148,149,143,141,133,155,134,640,424', +'162,,641,,,,,,,,,157,158,,154,136,137,138,145,142,144,,,139,140,,,,159', +'160,146,147,,,,,,263,,,,,,,,151,150,,135,156,153,152,161,148,149,143', +'141,133,155,134,721,417,162,,722,,,,,,,,,157,158,,154,136,137,138,145', +'142,144,,,139,140,,,,159,160,146,147,,,,,,263,,,,,,,,151,150,,135,156', +'153,152,161,148,149,143,141,133,155,134,723,424,162,,724,,,,,,,,,157', +'158,,154,136,137,138,145,142,144,,,139,140,,,,159,160,146,147,,,,,,263', +',,,,,,,151,150,,135,156,153,152,161,148,149,143,141,133,155,134,726', +'424,162,,727,,,,,,,,,157,158,,154,136,137,138,145,142,144,,,139,140', +',,,159,160,146,147,,,,,,263,,,,,,,,151,150,,135,156,153,152,161,148', +'149,143,141,133,155,134,475,417,162,,476,,,,,,,,,157,158,,154,136,137', +'138,145,142,144,,,139,140,,,,159,160,146,147,,,,,,263,,,,,,,,151,150', +',135,156,153,152,161,148,149,143,141,133,155,134,983,424,162,,982,,', +',,,,,,157,158,,154,136,137,138,145,142,144,,,139,140,,,,159,160,146', +'147,,,,,,263,,,,,,,,151,150,,135,156,153,152,161,148,149,143,141,133', +'155,134,1006,417,162,,1007,,,,,,,,,157,158,,154,136,137,138,145,142', +'144,,,139,140,,,,159,160,146,147,,,,,,263,,,,,,,,151,150,,135,156,153', +'152,161,148,149,143,141,133,155,134,1008,424,162,,1009,,,,,,,,,157,158', +',154,136,137,138,145,142,144,,,139,140,,,,159,160,146,147,,,,,,263,', +',,,,,,151,150,,135,156,153,152,161,148,149,143,141,133,155,134,,548', +'162,545,544,543,553,546,,548,,545,544,543,553,546,,556,,,,,,,548,556', +'545,544,543,553,546,,,,,,,,,551,556,,,,,,,551,561,560,564,563,,,,557', +'561,560,564,563,,,551,557,548,,545,544,543,553,546,561,560,564,563,', +',,557,548,556,545,544,543,553,546,,548,,545,544,543,553,546,,556,,,', +',,,551,556,548,,545,544,543,553,546,561,560,564,563,,,551,557,,556,', +',,,551,561,560,564,563,,,,557,561,560,564,563,,,,557,551,548,,545,544', +'543,553,546,,561,560,564,563,,,,557,556,548,,545,544,543,553,546,,548', +',545,544,543,553,546,,556,,,,,551,,548,556,545,544,543,553,546,,,564', +'563,,,,557,551,556,,,,,,,551,,,564,563,,,,557,561,560,564,563,,,551', +'557,548,,545,544,543,553,546,,,564,563,,,,557,548,556,545,544,543,553', +'546,,548,,545,544,543,553,546,548,556,545,544,543,553,546,,551,556,', +',,,,,556,,,564,563,,,551,557,,,,,,,551,,,564,563,,,551,557,,,564,563', +',,,557,,564,563,,,,557' ] + racc_action_table = arr = ::Array.new(25292, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'95,345,61,437,437,346,349,95,95,95,221,338,95,95,95,383,95,355,19,384', +'58,355,594,594,95,222,95,95,95,473,650,26,17,17,578,359,95,95,339,95', +'95,95,95,95,719,885,15,1,908,687,721,7,1006,665,1007,1020,680,680,308', +'19,58,913,665,913,473,722,221,95,95,95,95,95,95,95,95,95,95,95,95,95', +'95,222,383,95,95,95,384,95,95,570,61,95,10,15,95,95,26,95,437,95,12', +'95,15,95,95,844,95,95,95,95,95,345,95,98,95,346,349,594,650,26,98,98', +'98,308,1008,98,98,98,95,98,338,95,95,95,95,338,95,98,95,98,98,98,359', +'95,578,571,308,723,845,98,98,680,98,98,98,98,98,339,13,687,721,670,339', +'719,885,359,719,908,719,885,359,1006,908,1007,1020,722,1006,16,1007', +'1020,98,98,98,98,98,98,98,98,98,98,98,98,98,98,570,22,98,98,98,570,98', +'98,1008,671,98,37,724,98,98,40,98,605,98,723,98,844,98,98,224,98,98', +'98,98,98,419,98,45,98,670,590,590,419,419,419,481,24,328,419,419,328', +'419,98,24,1008,98,98,98,98,1008,98,571,98,353,845,3,571,98,723,845,3', +'419,419,109,419,419,419,419,419,670,481,671,670,724,123,224,204,605', +'605,123,123,670,704,607,704,704,704,605,704,223,41,41,419,419,419,419', +'419,419,419,419,419,419,419,419,419,419,353,354,419,419,419,671,419', +'353,671,38,419,724,353,419,313,313,353,671,419,590,419,443,419,419,590', +'419,419,419,419,419,378,419,420,419,225,353,39,364,226,420,420,420,607', +'607,364,420,420,419,420,482,419,419,607,419,354,419,38,420,230,704,673', +'354,419,41,41,38,354,262,420,420,354,420,420,420,420,420,904,443,904', +'904,904,317,904,39,482,329,651,492,329,354,379,276,39,313,313,378,378', +'378,801,420,420,420,420,420,420,420,420,420,420,420,420,420,420,673', +'413,420,420,420,380,420,673,651,288,420,414,673,420,288,317,673,381', +'420,638,420,726,420,420,317,420,420,420,420,420,277,420,420,420,382', +'673,280,385,801,492,492,492,379,379,379,801,904,420,413,621,420,420', +'640,420,801,420,492,413,414,640,640,640,420,292,640,640,640,414,640', +'365,380,380,380,801,726,638,365,640,640,640,640,726,381,381,381,639', +'726,293,640,640,726,640,640,640,640,640,621,295,774,382,382,382,385', +'385,385,621,337,337,366,726,551,367,551,551,551,366,551,296,367,640', +'640,640,640,640,640,640,640,640,640,640,640,640,640,689,297,640,640', +'640,368,640,640,639,303,640,689,368,640,640,551,640,306,640,307,640', +'774,640,640,551,640,640,640,640,640,862,640,640,640,332,369,77,332,342', +'370,312,862,369,342,689,689,370,640,77,689,640,640,640,640,449,640,641', +'640,77,371,14,314,640,641,641,641,371,14,641,641,641,46,641,220,862', +'862,14,318,46,862,220,372,641,641,641,321,449,46,372,220,449,449,641', +'641,374,641,641,641,641,641,833,374,833,833,833,300,833,701,326,701', +'701,701,300,701,831,330,831,831,831,686,831,300,686,641,641,641,641', +'641,641,641,641,641,641,641,641,641,641,468,833,641,641,641,301,641', +'641,701,469,641,331,301,641,641,831,641,701,641,333,641,301,641,641', +'831,641,641,641,641,641,589,641,468,641,343,589,468,468,450,468,468', +'469,523,523,344,469,469,641,469,469,641,641,641,641,848,641,853,641', +'348,848,350,853,641,0,0,0,0,0,0,394,450,302,0,0,450,450,400,0,302,0', +'0,0,0,0,0,0,934,302,403,934,405,0,0,0,0,0,0,0,598,598,0,409,598,598', +'598,432,0,0,0,0,0,0,0,0,0,0,0,0,411,0,0,0,412,0,0,421,0,0,0,432,432', +'432,432,432,432,432,432,432,432,432,304,432,432,319,429,432,432,304', +'0,439,319,0,692,692,0,0,304,451,0,319,0,432,452,432,0,432,432,453,432', +'432,432,432,432,0,432,710,710,454,0,0,0,0,347,0,0,0,0,996,996,347,479', +'0,0,483,432,499,432,500,347,0,503,0,0,0,33,33,33,33,33,33,505,510,357', +'33,33,513,521,522,33,357,33,33,33,33,33,33,33,524,357,536,537,539,33', +'33,33,33,33,33,33,540,541,33,550,558,562,565,408,33,33,33,33,33,33,33', +'33,33,33,33,33,567,33,33,33,572,33,33,573,33,33,33,408,408,408,408,408', +'408,408,408,408,408,408,509,408,408,581,592,408,408,509,33,602,581,33', +'610,612,33,33,509,618,33,581,33,408,622,408,33,408,408,627,408,408,408', +'408,408,33,408,632,642,649,33,33,33,33,875,33,33,33,33,656,658,875,664', +'33,33,667,408,669,672,675,875,33,676,33,33,33,121,121,121,121,121,121', +'679,681,938,121,121,684,688,703,121,938,121,121,121,121,121,121,121', +'705,938,712,717,720,121,121,121,121,121,121,121,729,734,121,753,758', +'775,776,643,121,121,121,121,121,121,121,121,121,121,121,121,777,121', +'121,121,779,121,121,780,121,121,121,643,643,643,643,643,643,643,643', +'643,643,643,674,643,643,944,781,643,643,674,121,783,944,121,674,784', +'121,121,674,785,121,944,121,643,786,643,121,643,643,790,643,643,643', +'643,643,121,643,794,795,800,121,121,121,121,945,121,121,121,121,804', +'807,945,808,121,121,811,643,816,817,821,945,121,822,121,121,121,206', +'206,206,206,206,206,824,825,946,206,206,827,830,832,206,946,206,206', +'206,206,206,206,206,835,946,838,847,851,206,206,206,206,206,206,206', +'852,873,206,873,873,873,855,873,206,206,206,206,206,206,206,206,206', +'206,206,206,856,206,206,206,872,206,206,876,206,206,206,21,21,21,21', +'21,21,21,21,21,21,21,727,21,21,948,878,21,21,727,206,889,948,206,727', +'890,206,206,727,906,206,948,206,21,910,21,206,21,21,911,21,21,21,21', +'21,206,21,917,921,924,206,206,206,206,988,206,206,206,206,927,928,988', +'929,206,206,930,21,932,947,952,988,206,953,206,206,206,229,229,229,229', +'229,229,954,955,956,229,229,958,982,983,229,984,229,229,229,229,229', +'229,229,6,6,6,6,6,229,229,229,229,229,229,229,995,981,229,981,981,981', +'997,981,229,229,229,229,229,229,229,229,229,229,229,229,998,229,229', +'229,999,229,229,1000,229,229,229,274,274,274,274,274,274,274,274,274', +'274,274,1009,274,274,1001,1002,274,274,1009,229,1005,1010,229,1009,1011', +'229,229,1009,1022,229,,229,274,,274,229,274,274,,274,274,274,274,274', +'229,274,,,,229,229,229,229,,229,229,229,229,,,,,229,229,,274,,,,,229', +',229,229,229,294,294,294,294,294,294,,,,294,294,,,,294,,294,294,294', +'294,294,294,294,291,291,291,291,291,294,294,294,294,294,294,294,,,294', +'497,497,497,497,497,294,294,294,294,294,294,294,294,294,294,294,294', +',294,294,294,,294,294,,294,294,294,427,427,427,427,427,427,427,427,427', +'427,427,,427,427,,,427,427,,294,,,294,,,294,294,,,294,,294,427,,427', +'294,427,427,,427,427,427,427,427,294,427,,,,294,294,294,294,,294,294', +'294,294,,,,,294,294,,427,,,,,294,,294,294,294,299,299,299,299,299,299', +',,,299,299,,,,299,,299,299,299,299,299,299,299,,,,,,299,299,299,299', +'299,299,299,,,299,,,,,,299,299,299,299,299,299,299,299,299,299,299,299', +',299,299,299,,299,299,,299,299,299,519,519,519,519,519,519,519,519,519', +'519,519,,519,519,,,519,519,,299,,,299,,,299,299,,,299,,299,519,,519', +'299,519,519,,519,519,519,519,519,299,519,,,,299,299,299,299,,299,299', +'299,299,,,,,299,299,,519,,,,,299,,299,299,299,324,324,324,324,324,324', +',,,324,324,,,,324,,324,324,324,324,324,324,324,,,,,,324,324,324,324', +'324,324,324,,,324,,,,,,324,324,324,324,324,324,324,324,324,324,324,324', +',324,324,324,,324,324,,324,324,324,644,644,644,644,644,644,644,644,644', +'644,644,,644,644,,,644,644,,324,,,324,,,324,324,,,324,,324,644,,644', +'324,644,644,,644,644,644,644,644,324,644,,,,324,324,324,324,,324,324', +'324,324,,,,,324,324,644,644,,,,,324,,324,324,324,498,498,498,498,498', +'498,,,,498,498,,,,498,,498,498,498,498,498,498,498,,,,,,498,498,498', +'498,498,498,498,,,498,,,,,,498,498,498,498,498,498,498,498,498,498,498', +'498,,498,498,498,,498,498,,498,498,498,678,678,678,678,678,678,678,678', +'678,678,678,,678,678,,,678,678,,498,,,498,,,498,498,,,498,,498,678,', +'678,498,678,678,,678,678,678,678,678,498,678,,,,498,498,498,498,,498', +'498,498,498,,,,,498,498,,678,,,,,498,,498,498,498,566,566,566,566,566', +'566,,,,566,566,,,,566,,566,566,566,566,566,566,566,,,,,,566,566,566', +'566,566,566,566,,,566,,,,,,566,566,566,566,566,566,566,566,566,566,566', +'566,,566,566,566,,566,566,,566,566,566,755,755,755,755,755,755,755,755', +'755,755,755,,755,755,,,755,755,,566,,,566,,,566,566,,,566,,566,755,', +'755,566,755,755,,755,755,755,755,755,566,755,,,,566,566,566,566,,566', +'566,566,566,,,,,566,566,,755,,,,,566,,566,566,566,569,569,569,569,569', +'569,,,,569,569,,,,569,,569,569,569,569,569,569,569,,,,,,569,569,569', +'569,569,569,569,,,569,,,,,,569,569,569,569,569,569,569,569,569,569,569', +'569,,569,569,569,,569,569,,569,569,569,760,760,760,760,760,760,760,760', +'760,760,760,,760,760,,,760,760,,569,,,569,,,569,569,,,569,,569,760,', +'760,569,760,760,,760,760,760,760,760,569,760,,,,569,569,569,569,,569', +'569,569,569,,,,,569,569,,760,,,,,569,,569,569,569,591,591,591,591,591', +'591,,,,591,591,,,,591,,591,591,591,591,591,591,591,,,,,,591,591,591', +'591,591,591,591,,,591,,,,,,591,591,591,591,591,591,591,591,591,591,591', +'591,,591,591,591,,591,591,,591,591,591,762,762,762,762,762,762,762,762', +'762,762,762,,762,762,,,762,762,,591,,,591,,,591,591,,,591,,591,762,', +'762,591,762,762,,762,762,762,762,762,591,762,,,,591,591,591,591,,591', +'591,591,591,,,,,591,591,,762,,,,,591,,591,591,591,648,648,648,648,648', +'648,,,,648,648,,,,648,,648,648,648,648,648,648,648,,,,,,648,648,648', +'648,648,648,648,,,648,,,,,,648,648,648,648,648,648,648,648,648,648,648', +'648,,648,648,648,,648,648,,648,648,648,765,765,765,765,765,765,765,765', +'765,765,765,,765,765,,,765,765,,648,,,648,,,648,648,,,648,,648,765,', +'765,648,765,765,,765,765,765,765,765,648,765,,,,648,648,648,648,,648', +'648,648,648,,,,,648,648,,765,,,,,648,,648,648,648,653,653,653,653,653', +'653,,,,653,653,,,,653,,653,653,653,653,653,653,653,,,,,,653,653,653', +'653,653,653,653,,,653,,,,,,653,653,653,653,653,653,653,653,653,653,653', +'653,,653,653,653,,653,653,,653,653,653,767,767,767,767,767,767,767,767', +'767,767,767,,767,767,,,767,767,,653,,,653,,,653,653,,,653,,653,767,', +'767,653,767,767,,767,767,767,767,767,653,767,,,,653,653,653,653,,653', +'653,653,653,,,,,653,653,,767,,,,,653,,653,653,653,654,654,654,654,654', +'654,,,,654,654,,,,654,,654,654,654,654,654,654,654,,,,,,654,654,654', +'654,654,654,654,,,654,,,,,,654,654,654,654,654,654,654,654,654,654,654', +'654,,654,654,654,,654,654,,654,654,654,769,769,769,769,769,769,769,769', +'769,769,769,,769,769,,,769,769,,654,,,654,,,654,654,,,654,,654,769,', +'769,654,769,769,,769,769,769,769,769,654,769,,,,654,654,654,654,,654', +'654,654,654,,,,,654,654,,769,,,,,654,,654,654,654,730,730,730,730,730', +'730,,,,730,730,,,,730,,730,730,730,730,730,730,730,,,,,,730,730,730', +'730,730,730,730,,,730,,,,,,730,730,730,730,730,730,730,730,730,730,730', +'730,,730,730,730,,730,730,,730,730,730,858,858,858,858,858,858,858,858', +'858,858,858,,858,858,,,858,858,,730,,,730,,,730,730,,,730,,730,858,', +'858,730,858,858,,858,858,858,858,858,730,858,,,,730,730,730,730,,730', +'730,730,730,,,,,730,730,,858,,,,,730,,730,730,730,735,735,735,735,735', +'735,,,,735,735,,,,735,,735,735,735,735,735,735,735,,,,,,735,735,735', +'735,735,735,735,,,735,,,,,,735,735,735,735,735,735,735,735,735,735,735', +'735,,735,735,735,,735,735,,735,735,735,969,969,969,969,969,969,969,969', +'969,969,969,,969,969,,,969,969,,735,,,735,,,735,735,,,735,,735,969,', +'969,735,969,969,,969,969,969,969,969,735,969,,,,735,735,735,735,,735', +'735,735,735,,,,,735,735,,969,,,,,735,,735,735,735,745,745,745,745,745', +'745,,,,745,745,,,,745,,745,745,745,745,745,745,745,,,,,,745,745,745', +'745,745,745,745,,,745,,,,,,745,745,745,745,745,745,745,745,745,745,745', +'745,,745,745,745,,745,745,,745,745,745,447,447,447,447,447,447,447,447', +'447,447,447,,447,447,,,447,447,,745,,,745,,,745,745,,,745,,745,447,', +'447,745,447,447,,447,447,447,447,447,745,447,,,,745,745,745,745,,745', +'745,745,745,,,,,745,745,,,,,,,745,,745,745,745,793,793,793,793,793,793', +',,,793,793,,,,793,,793,793,793,793,793,793,793,,,,,,793,793,793,793', +'793,793,793,,,793,,,,,,793,793,793,793,793,793,793,793,793,793,793,793', +',793,793,793,,793,793,,793,793,793,448,448,448,448,448,448,448,448,448', +'448,448,,448,448,,,448,448,,793,,,793,,,793,793,,,793,,793,448,,448', +'793,448,448,,448,448,448,448,448,793,448,,,,793,793,793,793,,793,793', +'793,793,,,,,793,793,,,,,,,793,,793,793,793,806,806,806,806,806,806,', +',,806,806,,,,806,,806,806,806,806,806,806,806,,,,,,806,806,806,806,806', +'806,806,,905,806,905,905,905,,905,806,806,806,806,806,806,806,806,806', +'806,806,806,,806,806,806,,806,806,,806,806,806,458,458,458,458,458,458', +'458,,905,458,458,,,,,,458,458,,806,,,806,,,806,806,,,806,,806,458,,458', +'806,458,458,,458,458,458,458,458,806,458,,,,806,806,806,806,,806,806', +'806,806,,,,,806,806,,,,,,,806,,806,806,806,814,814,814,814,814,814,', +',,814,814,,,,814,,814,814,814,814,814,814,814,,,,,,814,814,814,814,814', +'814,814,,957,814,957,957,957,,957,814,814,814,814,814,814,814,814,814', +'814,814,814,,814,814,814,,814,814,,814,814,814,459,,,959,,959,959,959', +'957,959,,,,,,,459,459,,814,,,814,,,814,814,,,814,,814,459,,459,814,459', +'459,,459,459,959,,459,814,459,,,,814,814,814,814,,814,814,814,814,,', +',,814,814,,,,,,,814,,814,814,814,815,815,815,815,815,815,,,,815,815', +',,,815,,815,815,815,815,815,815,815,,,,,,815,815,815,815,815,815,815', +',994,815,994,994,994,,994,815,815,815,815,815,815,815,815,815,815,815', +'815,,815,815,815,,815,815,,815,815,815,460,,,,,,,,994,,,,,,,,460,460', +',815,,,815,,,815,815,,,815,,815,460,,460,815,460,460,,460,460,,,460', +'815,460,,,,815,815,815,815,,815,815,815,815,,,,,815,815,,,,,,,815,,815', +'815,815,839,839,839,839,839,839,,,,839,839,,,,839,,839,839,839,839,839', +'839,839,,,,,,839,839,839,839,839,839,839,,,839,,,,,,839,839,839,839', +'839,839,839,839,839,839,839,839,,839,839,839,,839,839,,839,839,839,461', +',,,,,,,,,,,,,,,461,461,,839,,,839,,,839,839,,,839,,839,461,,461,839', +'461,461,,461,461,,,461,839,461,,,,839,839,839,839,,839,839,839,839,', +',,,839,839,,,,,,,839,,839,839,839,840,840,840,840,840,840,,,,840,840', +',,,840,,840,840,840,840,840,840,840,,,,,,840,840,840,840,840,840,840', +',,840,,,,,,840,840,840,840,840,840,840,840,840,840,840,840,,840,840', +'840,,840,840,,840,840,840,462,,,,,,,,,,,,,,,,462,462,,840,,,840,,,840', +'840,,,840,,840,462,,462,840,462,462,,462,462,,,462,840,462,,,,840,840', +'840,840,,840,840,840,840,,,,,840,840,,,,,,,840,,840,840,840,843,843', +'843,843,843,843,,,,843,843,,,,843,,843,843,843,843,843,843,843,,,,,', +'843,843,843,843,843,843,843,,,843,,,,,,843,843,843,843,843,843,843,843', +'843,843,843,843,,843,843,843,,843,843,,843,843,843,463,463,463,463,463', +'463,463,,,463,463,,,,,,463,463,,843,,,843,,,843,843,,,843,,843,463,', +'463,843,463,463,,463,463,463,463,463,843,463,,,,843,843,843,843,,843', +'843,843,843,,,,,843,843,,,,,,,843,,843,843,843,849,849,849,849,849,849', +',,,849,849,,,,849,,849,849,849,849,849,849,849,,,,,,849,849,849,849', +'849,849,849,,,849,,,,,,849,849,849,849,849,849,849,849,849,849,849,849', +',849,849,849,,849,849,,849,849,849,464,464,464,464,464,464,464,,,464', +'464,,,,,,464,464,,849,,,849,,,849,849,,,849,,849,464,,464,849,464,464', +',464,464,464,464,464,849,464,,,,849,849,849,849,,849,849,849,849,,,', +',849,849,,,,,,,849,,849,849,849,882,882,882,882,882,882,,,,882,882,', +',,882,,882,882,882,882,882,882,882,,,,,,882,882,882,882,882,882,882', +',,882,,,,,,882,882,882,882,882,882,882,882,882,882,882,882,,882,882', +'882,,882,882,,882,882,882,465,465,465,465,465,465,465,,,465,465,,,,', +',465,465,,882,,,882,,,882,882,,,882,,882,465,,465,882,465,465,,465,465', +'465,465,465,882,465,,,,882,882,882,882,,882,882,882,882,,,,,882,882', +',,,,,,882,,882,882,882,943,943,943,943,943,943,,,,943,943,,,,943,,943', +'943,943,943,943,943,943,,,,,,943,943,943,943,943,943,943,,,943,,,,,', +'943,943,943,943,943,943,943,943,943,943,943,943,,943,943,943,,943,943', +',943,943,943,466,466,466,466,466,466,466,,,466,466,,,,,,466,466,,943', +',,943,,,943,943,,,943,,943,466,,466,943,466,466,,466,466,466,466,466', +'943,466,,,,943,943,943,943,,943,943,943,943,,,,,943,943,,,,,,,943,,943', +'943,943,960,960,960,960,960,960,,,,960,960,,,,960,,960,960,960,960,960', +'960,960,,,,,,960,960,960,960,960,960,960,,,960,,,,,,960,960,960,960', +'960,960,960,960,960,960,960,960,,960,960,960,,960,960,,960,960,960,467', +'467,467,467,467,467,467,,,467,467,,,,,,467,467,,960,,,960,,,960,960', +',,960,,960,467,,467,960,467,467,,467,467,467,467,467,960,467,,,,960', +'960,960,960,,960,960,960,960,,,,,960,960,,,,,,,960,,960,960,960,966', +'966,966,966,966,966,,,,966,966,,,,966,,966,966,966,966,966,966,966,', +',,,,966,966,966,966,966,966,966,,,966,,,,,,966,966,966,966,966,966,966', +'966,966,966,966,966,,966,966,966,,966,966,,966,966,966,470,470,470,470', +'470,470,470,,,470,470,,,,,,470,470,,966,,,966,,,966,966,,,966,,966,470', +',470,966,470,470,,470,470,470,470,470,966,470,,,,966,966,966,966,,966', +'966,966,966,,,,,966,966,,,,,,,966,,966,966,966,968,968,968,968,968,968', +',,,968,968,,,,968,,968,968,968,968,968,968,968,,,,,,968,968,968,968', +'968,968,968,,,968,,,,,,968,968,968,968,968,968,968,968,968,968,968,968', +',968,968,968,,968,968,,968,968,968,471,471,471,471,471,471,471,471,', +'471,471,,,,,,471,471,,968,,,968,,,968,968,,,968,,968,471,,471,968,471', +'471,,471,471,471,471,471,968,471,,,,968,968,968,968,,968,968,968,968', +',,,,968,968,,,,,,,968,,968,968,968,5,5,5,5,5,,,,5,5,,,,5,,5,5,5,5,5', +'5,5,,,,,,5,5,5,5,5,5,5,,,5,,,,,,5,5,5,5,5,5,5,5,5,5,5,5,,5,5,5,,5,5', +',5,5,5,455,,,,,,,,,,,,,,,,455,455,,5,,,5,,,5,5,,,5,,5,455,,455,5,455', +'455,,455,455,,,,5,,,,,5,5,5,5,,5,5,5,5,,,,,5,5,,,,20,20,20,5,20,5,5', +'5,20,20,,,,20,,20,20,20,20,20,20,20,,,,,,20,20,20,20,20,20,20,,,20,', +',,,,,20,,,20,20,20,20,20,20,20,20,,20,20,20,,20,20,,20,20,20,456,,,', +',,,,,,,,,,,,456,456,,20,,,20,,,20,20,,,20,,,456,,456,20,456,456,,456', +'456,,,,20,,,,,20,20,20,20,,20,20,20,20,,,,,20,20,,,,29,29,29,20,29,20', +'20,20,29,29,,,,29,,29,29,29,29,29,29,29,,,,,,29,29,29,29,29,29,29,,', +'29,,,,,,,29,,,29,29,29,29,29,29,29,29,29,29,29,29,,29,29,,29,29,29,457', +',,,,,,,,,,,,,,,457,457,,29,,,29,,,29,29,,,29,,29,457,29,,29,457,457', +'29,457,457,,,,29,,,,,29,29,29,29,,29,29,29,29,,,,,29,29,,,,30,30,30', +'29,30,29,29,29,30,30,,,,30,,30,30,30,30,30,30,30,,,,,,30,30,30,30,30', +'30,30,,,30,,,,,,,30,,,30,30,30,30,30,30,30,30,30,30,30,30,,30,30,,30', +'30,30,,,,,,,,,,,,,,,,,,,,30,,,30,,,30,30,,,30,,30,,30,,30,,,30,,,,,', +'30,,,,,30,30,30,30,,30,30,30,30,,,,,30,30,,,,31,31,31,30,31,30,30,30', +'31,31,,,,31,,31,31,31,31,31,31,31,,,,,,31,31,31,31,31,31,31,,,31,,,', +',,,31,,,31,31,31,31,31,31,31,31,31,31,31,31,,31,31,,31,31,31,,,,,,,', +',,,,,,,,,,,,31,,,31,,,31,31,,,31,,31,,31,,31,,,31,,,,,,31,,,,,31,31', +'31,31,,31,31,31,31,,,,,31,31,,,,34,34,34,31,34,31,31,31,34,34,,,,34', +',34,34,34,34,34,34,34,,,,,,34,34,34,34,34,34,34,,,34,,,,,,,34,,,34,34', +'34,34,34,34,34,34,,34,34,34,,34,34,,,,34,,,,,,,,,,,,,,,,,,,,34,,,34', +',,34,34,,,34,,34,,,,,,,,,,,,,,,,,,34,34,34,34,,34,34,34,34,,,,,34,34', +',,,35,35,35,34,35,34,34,34,35,35,,,,35,,35,35,35,35,35,35,35,,,,,,35', +'35,35,35,35,35,35,,,35,,,,,,,35,,,35,35,35,35,35,35,35,35,,35,35,35', +',35,35,,,,35,,,,,,,,,,,,,,,,,,,,35,,,35,,,35,35,,,35,,697,,697,697,697', +'697,697,,,,,,,,,,697,,35,35,35,35,,35,35,35,35,,,,,35,35,,,,35,,697', +'35,,35,35,35,42,42,42,,42,697,697,,42,42,697,,,42,,42,42,42,42,42,42', +'42,,,,,,42,42,42,42,42,42,42,,,42,,,,,,,42,,,42,42,42,42,42,42,42,42', +',42,42,42,,42,42,,42,42,42,,,,,,,,,,,,,,,,,,,,42,,,42,,,42,42,,,42,', +',,,,42,,,,,,,,,42,,,,,42,42,42,42,,42,42,42,42,,,,,42,42,,,,43,43,43', +'42,43,42,42,42,43,43,,,,43,,43,43,43,43,43,43,43,,,,,,43,43,43,43,43', +'43,43,,,43,,,,,,,43,,,43,43,43,43,43,43,43,43,,43,43,43,,43,43,,43,43', +'43,,,,,,,,,,,,,,,,,,,,43,,,43,,,43,43,,,43,,,,,,43,,,,,,,,,43,,,,,43', +'43,43,43,,43,43,43,43,,,,,43,43,,,,44,44,44,43,44,43,43,43,44,44,,,', +'44,,44,44,44,44,44,44,44,,,,,,44,44,44,44,44,44,44,,,44,,,,,,,44,,,44', +'44,44,44,44,44,44,44,,44,44,44,,44,44,,44,44,44,,,,,,,,,,,,,,,,,,,,44', +',,44,,,44,44,,,44,,,,,,44,,,,,,,,,44,,,,,44,44,44,44,,44,44,44,44,,', +',,44,44,,,,59,59,59,44,59,44,44,44,59,59,,,,59,,59,59,59,59,59,59,59', +',,,,,59,59,59,59,59,59,59,,,59,,,,,,,59,,,59,59,59,59,59,59,59,59,59', +'59,59,59,,59,59,,59,59,59,,,,,,,,,,,,,,,,,,,,59,,,59,,,59,59,,,59,,59', +',,,59,,,59,,,,,,59,,,,,59,59,59,59,,59,59,59,59,,,,,59,59,,,,60,60,60', +'59,60,59,59,59,60,60,,,,60,,60,60,60,60,60,60,60,,,,,,60,60,60,60,60', +'60,60,,,60,,,,,,,60,,,60,60,60,60,60,60,60,60,60,60,60,60,,60,60,,60', +'60,60,,,,,,,,,,,,,,,,,,,,60,,,60,,,60,60,,,60,,,,,,60,,,60,,,,,,60,', +',,,60,60,60,60,,60,60,60,60,,,,,60,60,,,,63,63,63,60,63,60,60,60,63', +'63,,,,63,,63,63,63,63,63,63,63,,,,,,63,63,63,63,63,63,63,,,63,,,,,,', +'63,,,63,63,63,63,63,63,63,63,,63,63,63,,63,63,,63,63,63,,,,,,,,,,,,', +',,,,,,,63,,,63,,,63,63,,,63,,,,,,63,,,,,,,,,63,,,,,63,63,63,63,,63,63', +'63,63,,,,,63,63,,,,64,64,64,63,64,63,63,63,64,64,,,,64,,64,64,64,64', +'64,64,64,,,,,,64,64,64,64,64,64,64,,,64,,,,,,,64,,,64,64,64,64,64,64', +'64,64,,64,64,64,,64,64,,64,64,64,,,,,,,,,,,,,,,,,,,,64,,,64,,,64,64', +',,64,,,,,,64,,,,,,,,,64,,,,,64,64,64,64,,64,64,64,64,,,,,64,64,,,,67', +'67,67,64,67,64,64,64,67,67,,,,67,,67,67,67,67,67,67,67,,,,,,67,67,67', +'67,67,67,67,,,67,,,,,,,67,,,67,67,67,67,67,67,67,67,,67,67,67,,67,67', +',67,67,67,,,,,,,,,,,,,,,,,,,,67,,,67,,,67,67,,,67,,,,,,67,,,,,,,,,67', +',,,,67,67,67,67,,67,67,67,67,,,,,67,67,67,,,,,67,67,,67,67,67,68,68', +'68,,68,,,,68,68,,,,68,,68,68,68,68,68,68,68,,,,,,68,68,68,68,68,68,68', +',,68,,,,,,,68,,,68,68,68,68,68,68,68,68,,68,68,68,,68,68,,,,68,,,,,', +',,,,,,,,,,,,,,68,,,68,,,68,68,,,68,,68,,,,,,,,,,,,,,,,,,68,68,68,68', +',68,68,68,68,,,,,68,68,,,,69,69,69,68,69,68,68,68,69,69,,,,69,,69,69', +'69,69,69,69,69,,,,,,69,69,69,69,69,69,69,,,69,,,,,,,69,,,69,69,69,69', +'69,69,69,69,,69,69,69,,69,69,,,,69,,,,,,,,,,,,,,,,,69,,,69,,,69,,,69', +'69,,,69,,,,,,,,,,,,,,,,,,,,69,69,69,69,,69,69,69,69,,,,,69,69,,,,70', +'70,70,69,70,69,69,69,70,70,,,,70,,70,70,70,70,70,70,70,,,,,,70,70,70', +'70,70,70,70,,,70,,,,,,,70,,,70,70,70,70,70,70,70,70,,70,70,70,,70,70', +',,,70,,,,,,,,,,,,,,,,,,,,70,,,70,,,70,70,,,70,,869,,869,869,869,869', +'869,,,,,,,,,,869,,70,70,70,70,,70,70,70,70,,,,,70,70,,,,,,869,70,,70', +'70,70,111,111,111,111,111,869,869,,111,111,869,,,111,,111,111,111,111', +'111,111,111,,,,,,111,111,111,111,111,111,111,,,111,,,,,,111,111,111', +'111,111,111,111,111,111,111,111,111,,111,111,111,,111,111,,111,111,111', +',,,,,,,,,,,,,,,,,,,111,,,111,,,111,111,,,111,,111,,,,111,,,,,,,,,111', +',,,,111,111,111,111,,111,111,111,111,,,,,111,111,,,,,,111,111,,111,111', +'111,116,116,116,,116,,,,116,116,,,,116,,116,116,116,116,116,116,116', +',,,,,116,116,116,116,116,116,116,,,116,,,,,,,116,,,116,116,116,116,116', +'116,116,116,,116,116,116,,116,116,,116,116,116,,,,,,,,,,,,,,,,,,,,116', +',,116,,,116,116,,,116,,,,,,116,,,,,,,,,116,,,,,116,116,116,116,,116', +'116,116,116,,,,,116,116,,,,117,117,117,116,117,116,116,116,117,117,', +',,117,,117,117,117,117,117,117,117,,,,,,117,117,117,117,117,117,117', +',,117,,,,,,,117,,,117,117,117,117,117,117,117,117,,117,117,117,,117', +'117,,117,117,117,,,,,,,,,,,,,,,,,,,,117,,,117,,,117,117,,,117,,,,,,117', +',,,,,,,,117,,,,,117,117,117,117,,117,117,117,117,,,,,117,117,,,,118', +'118,118,117,118,117,117,117,118,118,,,,118,,118,118,118,118,118,118', +'118,,,,,,118,118,118,118,118,118,118,,,118,,,,,,,118,,,118,118,118,118', +'118,118,118,118,,118,118,118,,118,118,,118,118,118,,,,,,,,,,,,,,,,,', +',,118,,,118,,,118,118,,,118,,,,,,118,,,,,,,,,118,,,,,118,118,118,118', +',118,118,118,118,,,,,118,118,,,,119,119,119,118,119,118,118,118,119', +'119,,,,119,,119,119,119,119,119,119,119,,,,,,119,119,119,119,119,119', +'119,,,119,,,,,,,119,,,119,119,119,119,119,119,119,119,,119,119,119,', +'119,119,,119,119,119,,,,,,,,,,,,,,,,,,,,119,,,119,,,119,119,,,119,,', +',,,119,,,,,,,,,119,,,,,119,119,119,119,,119,119,119,119,,,,,119,119', +',,,,,,119,,119,119,119,120,120,120,120,120,,,,120,120,,,,120,,120,120', +'120,120,120,120,120,,,,,,120,120,120,120,120,120,120,,,120,,,,,,120', +'120,,120,120,120,120,120,120,120,120,120,,120,120,120,,120,120,,120', +'120,120,,,,,,,,,,,,,,,,,,,,120,,,120,,,120,120,,,120,,120,,,,120,,,', +',,,,,120,,,,,120,120,120,120,,120,120,120,120,,,,,120,120,,,,207,207', +'207,120,207,120,120,120,207,207,,,,207,,207,207,207,207,207,207,207', +',,,,,207,207,207,207,207,207,207,,,207,,,,,,,207,,,207,207,207,207,207', +'207,207,207,,207,207,207,,207,207,,207,207,207,,,,,,,,,,,,,,,,,,,,207', +',,207,,,207,207,,,207,,207,,,,207,,,,,,,,,207,,,,,207,207,207,207,,207', +'207,207,207,,,,,207,207,,,,208,208,208,207,208,207,207,207,208,208,', +',,208,,208,208,208,208,208,208,208,,,,,,208,208,208,208,208,208,208', +',,208,,,,,,,208,,,208,208,208,208,208,208,208,208,,208,208,208,,208', +'208,,208,208,208,,,,,,,,,,,,,,,,,,,,208,,,208,,,208,208,,,208,,,,,,208', +',,,,,,,,208,,,,,208,208,208,208,,208,208,208,208,,,,,208,208,,,,209', +'209,209,208,209,208,208,208,209,209,,,,209,,209,209,209,209,209,209', +'209,,,,,,209,209,209,209,209,209,209,,,209,,,,,,,209,,,209,209,209,209', +'209,209,209,209,209,209,209,209,,209,209,,209,209,209,,,,,,,,,,,,,,', +',,,,,209,,,209,,,209,209,,,209,,209,,209,,209,,,209,,,,,,209,,,,,209', +'209,209,209,,209,209,209,209,,,,,209,209,,,,212,212,212,209,212,209', +'209,209,212,212,,,,212,,212,212,212,212,212,212,212,,,,,,212,212,212', +'212,212,212,212,,,212,,,,,,,212,,,212,212,212,212,212,212,212,212,,212', +'212,212,,212,212,,212,212,212,,,,,,,,,,,,,,,,,,,,212,,,212,,,212,212', +',,212,,,,,,212,,,,,,,,,212,,,,,212,212,212,212,,212,212,212,212,,,,', +'212,212,,,,213,213,213,212,213,212,212,212,213,213,,,,213,,213,213,213', +'213,213,213,213,,,,,,213,213,213,213,213,213,213,,,213,,,,,,,213,,,213', +'213,213,213,213,213,213,213,,213,213,213,,213,213,,213,213,213,,,,,', +',,,,,,,,,,,,,,213,,,213,,,213,213,,,213,,213,,,,213,,,,,,,,,213,,,,', +'213,213,213,213,,213,213,213,213,,,,,213,213,,,,214,214,214,213,214', +'213,213,213,214,214,,,,214,,214,214,214,214,214,214,214,,,,,,214,214', +'214,214,214,214,214,,,214,,,,,,,214,,,214,214,214,214,214,214,214,214', +',214,214,214,,214,214,,214,214,214,,,,,,,,,,,,,,,,,,,,214,,,214,,,214', +'214,,,214,,,,,,214,,,,,,,,,214,,,,,214,214,214,214,,214,214,214,214', +',,,,214,214,,,,215,215,215,214,215,214,214,214,215,215,,,,215,,215,215', +'215,215,215,215,215,,,,,,215,215,215,215,215,215,215,,,215,,,,,,,215', +',,215,215,215,215,215,215,215,215,,215,215,215,,215,215,,215,215,215', +',,,,,,,,,,,,,,,,,,,215,,,215,,,215,215,,,215,,,,,,215,,,,,,,,,215,,', +',,215,215,215,215,,215,215,215,215,,,,,215,215,,,,216,216,216,215,216', +'215,215,215,216,216,,,,216,,216,216,216,216,216,216,216,,,,,,216,216', +'216,216,216,216,216,,,216,,,,,,,216,,,216,216,216,216,216,216,216,216', +',216,216,216,,216,216,,216,216,216,,,,,,,,,,,,,,,,,,,,216,,,216,,,216', +'216,,,216,,,,,,216,,,,,,,,,216,,,,,216,216,216,216,,216,216,216,216', +',,,,216,216,,,,217,217,217,216,217,216,216,216,217,217,,,,217,,217,217', +'217,217,217,217,217,,,,,,217,217,217,217,217,217,217,,,217,,,,,,,217', +',,217,217,217,217,217,217,217,217,,217,217,217,,217,217,,217,217,217', +',,,,,,,,,,,,,,,,,,,217,,,217,,,217,217,,,217,,,,,,217,,,,,,,,,217,,', +',,217,217,217,217,,217,217,217,217,,,,,217,217,217,,,228,228,228,217', +'228,217,217,217,228,228,,,,228,,228,228,228,228,228,228,228,,,,,,228', +'228,228,228,228,228,228,,,228,,,,,,,228,,,228,228,228,228,228,228,228', +'228,,228,228,228,,228,228,,228,228,228,,,,,,,,,,,,,,,,,,,,228,,,228', +',,228,228,,,228,,,,,,228,,,,,,,,,228,,,,,228,228,228,228,,228,228,228', +'228,,,,,228,228,,,,231,231,231,228,231,228,228,228,231,231,,,,231,,231', +'231,231,231,231,231,231,,,,,,231,231,231,231,231,231,231,,,231,,,,,', +',231,,,231,231,231,231,231,231,231,231,,231,231,231,,231,231,,231,231', +'231,,,,,,,,,,,,,,,,,,,,231,,,231,,,231,231,,,231,,,,,,231,,,,,,,,,231', +',,,,231,231,231,231,,231,231,231,231,,,,,231,231,,,,232,232,232,231', +'232,231,231,231,232,232,,,,232,,232,232,232,232,232,232,232,,,,,,232', +'232,232,232,232,232,232,,,232,,,,,,,232,,,232,232,232,232,232,232,232', +'232,,232,232,232,,232,232,,232,232,232,,,,,,,,,,,,,,,,,,,,232,,,232', +',,232,232,,,232,,,,,,232,,,,,,,,,232,,,,,232,232,232,232,,232,232,232', +'232,,,,,232,232,,,,233,233,233,232,233,232,232,232,233,233,,,,233,,233', +'233,233,233,233,233,233,,,,,,233,233,233,233,233,233,233,,,233,,,,,', +',233,,,233,233,233,233,233,233,233,233,,233,233,233,,233,233,,233,233', +'233,,,,,,,,,,,,,,,,,,,,233,,,233,,,233,233,,,233,,,,,,233,,,,,,,,,233', +',,,,233,233,233,233,,233,233,233,233,,,,,233,233,,,,234,234,234,233', +'234,233,233,233,234,234,,,,234,,234,234,234,234,234,234,234,,,,,,234', +'234,234,234,234,234,234,,,234,,,,,,,234,,,234,234,234,234,234,234,234', +'234,,234,234,234,,234,234,,234,234,234,,,,,,,,,,,,,,,,,,,,234,,,234', +',,234,234,,,234,,,,,,234,,,,,,,,,234,,,,,234,234,234,234,,234,234,234', +'234,,,,,234,234,,,,235,235,235,234,235,234,234,234,235,235,,,,235,,235', +'235,235,235,235,235,235,,,,,,235,235,235,235,235,235,235,,,235,,,,,', +',235,,,235,235,235,235,235,235,235,235,,235,235,235,,235,235,,235,235', +'235,,,,,,,,,,,,,,,,,,,,235,,,235,,,235,235,,,235,,,,,,235,,,,,,,,,235', +',,,,235,235,235,235,,235,235,235,235,,,,,235,235,,,,236,236,236,235', +'236,235,235,235,236,236,,,,236,,236,236,236,236,236,236,236,,,,,,236', +'236,236,236,236,236,236,,,236,,,,,,,236,,,236,236,236,236,236,236,236', +'236,,236,236,236,,236,236,,236,236,236,,,,,,,,,,,,,,,,,,,,236,,,236', +',,236,236,,,236,,,,,,236,,,,,,,,,236,,,,,236,236,236,236,,236,236,236', +'236,,,,,236,236,,,,237,237,237,236,237,236,236,236,237,237,,,,237,,237', +'237,237,237,237,237,237,,,,,,237,237,237,237,237,237,237,,,237,,,,,', +',237,,,237,237,237,237,237,237,237,237,,237,237,237,,237,237,,237,237', +'237,,,,,,,,,,,,,,,,,,,,237,,,237,,,237,237,,,237,,,,,,237,,,,,,,,,237', +',,,,237,237,237,237,,237,237,237,237,,,,,237,237,,,,238,238,238,237', +'238,237,237,237,238,238,,,,238,,238,238,238,238,238,238,238,,,,,,238', +'238,238,238,238,238,238,,,238,,,,,,,238,,,238,238,238,238,238,238,238', +'238,,238,238,238,,238,238,,238,238,238,,,,,,,,,,,,,,,,,,,,238,,,238', +',,238,238,,,238,,,,,,238,,,,,,,,,238,,,,,238,238,238,238,,238,238,238', +'238,,,,,238,238,,,,239,239,239,238,239,238,238,238,239,239,,,,239,,239', +'239,239,239,239,239,239,,,,,,239,239,239,239,239,239,239,,,239,,,,,', +',239,,,239,239,239,239,239,239,239,239,,239,239,239,,239,239,,239,239', +'239,,,,,,,,,,,,,,,,,,,,239,,,239,,,239,239,,,239,,,,,,239,,,,,,,,,239', +',,,,239,239,239,239,,239,239,239,239,,,,,239,239,,,,240,240,240,239', +'240,239,239,239,240,240,,,,240,,240,240,240,240,240,240,240,,,,,,240', +'240,240,240,240,240,240,,,240,,,,,,,240,,,240,240,240,240,240,240,240', +'240,,240,240,240,,240,240,,240,240,240,,,,,,,,,,,,,,,,,,,,240,,,240', +',,240,240,,,240,,,,,,240,,,,,,,,,240,,,,,240,240,240,240,,240,240,240', +'240,,,,,240,240,,,,241,241,241,240,241,240,240,240,241,241,,,,241,,241', +'241,241,241,241,241,241,,,,,,241,241,241,241,241,241,241,,,241,,,,,', +',241,,,241,241,241,241,241,241,241,241,,241,241,241,,241,241,,241,241', +'241,,,,,,,,,,,,,,,,,,,,241,,,241,,,241,241,,,241,,,,,,241,,,,,,,,,241', +',,,,241,241,241,241,,241,241,241,241,,,,,241,241,,,,242,242,242,241', +'242,241,241,241,242,242,,,,242,,242,242,242,242,242,242,242,,,,,,242', +'242,242,242,242,242,242,,,242,,,,,,,242,,,242,242,242,242,242,242,242', +'242,,242,242,242,,242,242,,242,242,242,,,,,,,,,,,,,,,,,,,,242,,,242', +',,242,242,,,242,,,,,,242,,,,,,,,,242,,,,,242,242,242,242,,242,242,242', +'242,,,,,242,242,,,,243,243,243,242,243,242,242,242,243,243,,,,243,,243', +'243,243,243,243,243,243,,,,,,243,243,243,243,243,243,243,,,243,,,,,', +',243,,,243,243,243,243,243,243,243,243,,243,243,243,,243,243,,243,243', +'243,,,,,,,,,,,,,,,,,,,,243,,,243,,,243,243,,,243,,,,,,243,,,,,,,,,243', +',,,,243,243,243,243,,243,243,243,243,,,,,243,243,,,,244,244,244,243', +'244,243,243,243,244,244,,,,244,,244,244,244,244,244,244,244,,,,,,244', +'244,244,244,244,244,244,,,244,,,,,,,244,,,244,244,244,244,244,244,244', +'244,,244,244,244,,244,244,,244,244,244,,,,,,,,,,,,,,,,,,,,244,,,244', +',,244,244,,,244,,,,,,244,,,,,,,,,244,,,,,244,244,244,244,,244,244,244', +'244,,,,,244,244,,,,245,245,245,244,245,244,244,244,245,245,,,,245,,245', +'245,245,245,245,245,245,,,,,,245,245,245,245,245,245,245,,,245,,,,,', +',245,,,245,245,245,245,245,245,245,245,,245,245,245,,245,245,,245,245', +'245,,,,,,,,,,,,,,,,,,,,245,,,245,,,245,245,,,245,,,,,,245,,,,,,,,,245', +',,,,245,245,245,245,,245,245,245,245,,,,,245,245,,,,246,246,246,245', +'246,245,245,245,246,246,,,,246,,246,246,246,246,246,246,246,,,,,,246', +'246,246,246,246,246,246,,,246,,,,,,,246,,,246,246,246,246,246,246,246', +'246,,246,246,246,,246,246,,246,246,246,,,,,,,,,,,,,,,,,,,,246,,,246', +',,246,246,,,246,,,,,,246,,,,,,,,,246,,,,,246,246,246,246,,246,246,246', +'246,,,,,246,246,,,,247,247,247,246,247,246,246,246,247,247,,,,247,,247', +'247,247,247,247,247,247,,,,,,247,247,247,247,247,247,247,,,247,,,,,', +',247,,,247,247,247,247,247,247,247,247,,247,247,247,,247,247,,247,247', +'247,,,,,,,,,,,,,,,,,,,,247,,,247,,,247,247,,,247,,,,,,247,,,,,,,,,247', +',,,,247,247,247,247,,247,247,247,247,,,,,247,247,,,,248,248,248,247', +'248,247,247,247,248,248,,,,248,,248,248,248,248,248,248,248,,,,,,248', +'248,248,248,248,248,248,,,248,,,,,,,248,,,248,248,248,248,248,248,248', +'248,,248,248,248,,248,248,,248,248,248,,,,,,,,,,,,,,,,,,,,248,,,248', +',,248,248,,,248,,,,,,248,,,,,,,,,248,,,,,248,248,248,248,,248,248,248', +'248,,,,,248,248,,,,249,249,249,248,249,248,248,248,249,249,,,,249,,249', +'249,249,249,249,249,249,,,,,,249,249,249,249,249,249,249,,,249,,,,,', +',249,,,249,249,249,249,249,249,249,249,,249,249,249,,249,249,,249,249', +'249,,,,,,,,,,,,,,,,,,,,249,,,249,,,249,249,,,249,,,,,,249,,,,,,,,,249', +',,,,249,249,249,249,,249,249,249,249,,,,,249,249,,,,250,250,250,249', +'250,249,249,249,250,250,,,,250,,250,250,250,250,250,250,250,,,,,,250', +'250,250,250,250,250,250,,,250,,,,,,,250,,,250,250,250,250,250,250,250', +'250,,250,250,250,,250,250,,250,250,250,,,,,,,,,,,,,,,,,,,,250,,,250', +',,250,250,,,250,,,,,,250,,,,,,,,,250,,,,,250,250,250,250,,250,250,250', +'250,,,,,250,250,,,,251,251,251,250,251,250,250,250,251,251,,,,251,,251', +'251,251,251,251,251,251,,,,,,251,251,251,251,251,251,251,,,251,,,,,', +',251,,,251,251,251,251,251,251,251,251,,251,251,251,,251,251,,251,251', +'251,,,,,,,,,,,,,,,,,,,,251,,,251,,,251,251,,,251,,,,,,251,,,,,,,,,251', +',,,,251,251,251,251,,251,251,251,251,,,,,251,251,,,,252,252,252,251', +'252,251,251,251,252,252,,,,252,,252,252,252,252,252,252,252,,,,,,252', +'252,252,252,252,252,252,,,252,,,,,,,252,,,252,252,252,252,252,252,252', +'252,,252,252,252,,252,252,,252,252,252,,,,,,,,,,,,,,,,,,,,252,,,252', +',,252,252,,,252,,,,,,252,,,,,,,,,252,,,,,252,252,252,252,,252,252,252', +'252,,,,,252,252,,,,253,253,253,252,253,252,252,252,253,253,,,,253,,253', +'253,253,253,253,253,253,,,,,,253,253,253,253,253,253,253,,,253,,,,,', +',253,,,253,253,253,253,253,253,253,253,,253,253,253,,253,253,,253,253', +'253,,,,,,,,,,,,,,,,,,,,253,,,253,,,253,253,,,253,,,,,,253,,,,,,,,,253', +',,,,253,253,253,253,,253,253,253,253,,,,,253,253,,,,254,254,254,253', +'254,253,253,253,254,254,,,,254,,254,254,254,254,254,254,254,,,,,,254', +'254,254,254,254,254,254,,,254,,,,,,,254,,,254,254,254,254,254,254,254', +'254,,254,254,254,,254,254,,254,254,254,,,,,,,,,,,,,,,,,,,,254,,,254', +',,254,254,,,254,,,,,,254,,,,,,,,,254,,,,,254,254,254,254,,254,254,254', +'254,,,,,254,254,,,,255,255,255,254,255,254,254,254,255,255,,,,255,,255', +'255,255,255,255,255,255,,,,,,255,255,255,255,255,255,255,,,255,,,,,', +',255,,,255,255,255,255,255,255,255,255,,255,255,255,,255,255,,255,255', +'255,,,,,,,,,,,,,,,,,,,,255,,,255,,,255,255,,,255,,,,,,255,,,,,,,,,255', +',,,,255,255,255,255,,255,255,255,255,,,,,255,255,,,,263,263,263,255', +'263,255,255,255,263,263,,,,263,,263,263,263,263,263,263,263,,,,,,263', +'263,263,263,263,263,263,,,263,,,,,,,263,,,263,263,263,263,263,263,263', +'263,263,263,263,263,,263,263,,263,263,263,,,,,,,,,,,,,,,,,,,,263,,,263', +',,263,263,,,263,,263,,263,,263,,,263,,,,,,263,,,,,263,263,263,263,,263', +'263,263,263,,,,,263,263,,,,264,264,264,263,264,263,263,263,264,264,', +',,264,,264,264,264,264,264,264,264,,,,,,264,264,264,264,264,264,264', +',,264,,,,,,,264,,,264,264,264,264,264,264,264,264,264,264,264,264,,264', +'264,,264,264,264,,,,,,,,,,,,,,,,,,,,264,,,264,,,264,264,,,264,,264,', +'264,,264,,,264,,,,,,264,,,,,264,264,264,264,,264,264,264,264,,,,,264', +'264,,,,272,272,272,264,272,264,264,264,272,272,,,,272,,272,272,272,272', +'272,272,272,,,,,,272,272,272,272,272,272,272,,,272,,,,,,,272,,,272,272', +'272,272,272,272,272,272,272,272,272,272,,272,272,,272,272,272,,,,,,', +',,,,,,,,,,,,,272,,,272,,,272,272,,,272,,272,,272,,272,,,272,,,,,,272', +',,,,272,272,272,272,,272,272,272,272,,,,,272,272,272,,,279,279,279,272', +'279,272,272,272,279,279,,,,279,,279,279,279,279,279,279,279,,,,,,279', +'279,279,279,279,279,279,,,279,,,,,,,279,,,279,279,279,279,279,279,279', +'279,,279,279,279,,279,279,,279,279,279,,,,,,,,,,,,,,,,,,,,279,,,279', +',,279,279,,,279,,,,,,279,,,,,,,,,279,,,,,279,279,279,279,,279,279,279', +'279,,,,,279,279,,,,281,281,281,279,281,279,279,279,281,281,,,,281,,281', +'281,281,281,281,281,281,,,,,,281,281,281,281,281,281,281,,,281,,,,,', +',281,,,281,281,281,281,281,281,281,281,,281,281,281,,281,281,,281,281', +'281,,,,,,,,,,,,,,,,,,,,281,,,281,,,281,281,,,281,,,,,,281,,,,,,,,,281', +',,,,281,281,281,281,,281,281,281,281,,,,,281,281,,,,284,284,284,281', +'284,281,281,281,284,284,,,,284,,284,284,284,284,284,284,284,,,,,,284', +'284,284,284,284,284,284,,,284,,,,,,,284,,,284,284,284,284,284,284,284', +'284,,284,284,284,,284,284,,284,284,284,,,,,,,,,,,,,,,,,,,,284,,,284', +',,284,284,,,284,,,,,,284,,,,,,,,,284,,,,,284,284,284,284,,284,284,284', +'284,,,,,284,284,,,,285,285,285,284,285,284,284,284,285,285,,,,285,,285', +'285,285,285,285,285,285,,,,,,285,285,285,285,285,285,285,,,285,,,,,', +',285,,,285,285,285,285,285,285,285,285,,285,285,285,,285,285,,285,285', +'285,,,,,,,,,,,,,,,,,,,,285,,,285,,,285,285,,,285,,,,,,285,,,,,,,,,285', +',,,,285,285,285,285,,285,285,285,285,,,,,285,285,,,,,,,285,,285,285', +'285,290,290,290,290,290,,,,290,290,,,,290,,290,290,290,290,290,290,290', +',,,,,290,290,290,290,290,290,290,,,290,,,,,,290,290,,290,290,290,290', +'290,290,290,290,290,,290,290,290,,290,290,,290,290,290,,,,,,,,,,,,,', +',,,,,,290,,,290,,,290,290,,,290,,290,,,,290,,,,,,,,,290,,,,,290,290', +'290,290,,290,290,290,290,,,,,290,290,,,,298,298,298,290,298,290,290', +'290,298,298,,,,298,,298,298,298,298,298,298,298,,,,,,298,298,298,298', +'298,298,298,,,298,,,,,,,298,,,298,298,298,298,298,298,298,298,,298,298', +'298,,298,298,,,,298,,,,,,,,,,,,,,,,,,,,298,,,298,,,298,298,,,298,,895', +',895,895,895,895,895,,,,,,,,,,895,,298,298,298,298,,298,298,298,298', +',,,,298,298,,,,298,,895,298,,298,298,298,315,315,315,,315,895,895,,315', +'315,895,,,315,,315,315,315,315,315,315,315,,,,,,315,315,315,315,315', +'315,315,,,315,,,,,,,315,,,315,315,315,315,315,315,315,315,,315,315,315', +',315,315,,,,315,,,,,,,,,,,,,,,,,,,,315,,,315,,,315,315,,,315,,,,,,,', +',,,,,,,,,,,,315,315,315,315,,315,315,315,315,,,,,315,315,,,,323,323', +'323,315,323,315,315,315,323,323,,,,323,,323,323,323,323,323,323,323', +',,,,,323,323,323,323,323,323,323,,,323,,,,,,,323,,,323,323,323,323,323', +'323,323,323,,323,323,323,,323,323,,323,323,323,,,,,,,,,,,,,,,,,,,,323', +',,323,323,,323,323,,,323,,,,,,323,,,,,,,,,323,,,,,323,323,323,323,,323', +'323,323,323,,,,,323,323,,,,325,325,325,323,325,323,323,323,325,325,', +',,325,,325,325,325,325,325,325,325,,,,,,325,325,325,325,325,325,325', +',,325,,,,,,,325,,,325,325,325,325,325,325,325,325,,325,325,325,,325', +'325,,325,325,325,,,,,,,,,,,,,,,,,,,,325,,,325,,,325,325,,,325,,,,,,325', +',,,,,,,,325,,,,,325,325,325,325,,325,325,325,325,,,,,325,325,,,,340', +'340,340,325,340,325,325,325,340,340,,,,340,,340,340,340,340,340,340', +'340,,,,,,340,340,340,340,340,340,340,,,340,,,,,,,340,,,340,340,340,340', +'340,340,340,340,,340,340,340,,340,340,,340,340,340,,,,,,,,,,,,,,,,,', +',,340,,,340,,,340,340,,,340,,,,,,340,,,,,,,,,340,,,,,340,340,340,340', +',340,340,340,340,,,,,340,340,,,,341,341,341,340,341,340,340,340,341', +'341,,,,341,,341,341,341,341,341,341,341,,,,,,341,341,341,341,341,341', +'341,,,341,,,,,,,341,,,341,341,341,341,341,341,341,341,,341,341,341,', +'341,341,,341,341,341,,,,,,,,,,,,,,,,,,,,341,,,341,,,341,341,,,341,,', +',,,341,,,,,,,,,341,,,,,341,341,341,341,,341,341,341,341,,,,,341,341', +',,,360,360,360,341,360,341,341,341,360,360,,,,360,,360,360,360,360,360', +'360,360,,,,,,360,360,360,360,360,360,360,,,360,,,,,,,360,,,360,360,360', +'360,360,360,360,360,,360,360,360,,360,360,,360,360,360,,,,,,,,,,,,,', +',,,,,,360,,,360,,,360,360,,,360,,,,,,360,,,,,,,,,360,,,,,360,360,360', +'360,,360,360,360,360,,,,,360,360,,,,376,376,376,360,376,360,360,360', +'376,376,,,,376,,376,376,376,376,376,376,376,,,,,,376,376,376,376,376', +'376,376,,,376,,,,,,,376,,,376,376,376,376,376,376,376,376,,376,376,376', +',376,376,,376,376,376,,,,,,,,,,,,,,,,,,,,376,,,376,,,376,376,,,376,', +',,,,376,,,,,,,,,376,,,,,376,376,376,376,,376,376,376,376,,,,,376,376', +',,,404,404,404,376,404,376,376,376,404,404,,,,404,,404,404,404,404,404', +'404,404,,,,,,404,404,404,404,404,404,404,,,404,,,,,,,404,,,404,404,404', +'404,404,404,404,404,,404,404,404,,404,404,,404,404,404,,,,,,,,,,,,,', +',,,,,,404,,,404,,,404,404,,,404,,,,,,404,,,,,,,,,404,,,,,404,404,404', +'404,,404,404,404,404,,,,,404,404,,,,442,442,442,404,442,404,404,404', +'442,442,,,,442,,442,442,442,442,442,442,442,,,,,,442,442,442,442,442', +'442,442,,,442,,,,,,,442,,,442,442,442,442,442,442,442,442,442,442,442', +'442,,442,442,,442,442,442,,,,,,,,,,,,,,,,,,,,442,,,442,,,442,442,,,442', +',442,,442,,442,,,442,,,,,,442,,,,,442,442,442,442,,442,442,442,442,', +',,,442,442,,,,444,444,444,442,444,442,442,442,444,444,,,,444,,444,444', +'444,444,444,444,444,,,,,,444,444,444,444,444,444,444,,,444,,,,,,,444', +',,444,444,444,444,444,444,444,444,,444,444,444,,444,444,,444,444,444', +',,,,,,,,,,,,,,,,,,,444,,,444,,,444,444,,,444,,,,,,444,,,,,,,,,444,,', +',,444,444,444,444,,444,444,444,444,,,,,444,444,,,,445,445,445,444,445', +'444,444,444,445,445,,,,445,,445,445,445,445,445,445,445,,,,,,445,445', +'445,445,445,445,445,,,445,,,,,,,445,,,445,445,445,445,445,445,445,445', +',445,445,445,,445,445,,445,445,445,,,,,,,,,,,,,,,,,,,,445,,,445,,,445', +'445,,,445,,,,,,445,,,,,,,,,445,,,,,445,445,445,445,,445,445,445,445', +',,,,445,445,,,,446,446,446,445,446,445,445,445,446,446,,,,446,,446,446', +'446,446,446,446,446,,,,,,446,446,446,446,446,446,446,,,446,,,,,,,446', +',,446,446,446,446,446,446,446,446,,446,446,446,,446,446,,446,446,446', +',,,,,,,,,,,,,,,,,,,446,,,446,,,446,446,,,446,,,,,,446,,,,,,,,,446,,', +',,446,446,446,446,,446,446,446,446,,,,,446,446,,,,472,472,472,446,472', +'446,446,446,472,472,,,,472,,472,472,472,472,472,472,472,,,,,,472,472', +'472,472,472,472,472,,,472,,,,,,,472,,,472,472,472,472,472,472,472,472', +',472,472,472,,472,472,,472,472,472,,,,,,,,,,,,,,,,,,,,472,,,472,,,472', +'472,,,472,,,,,,472,,,,,,,,,472,,,,,472,472,472,472,,472,472,472,472', +',,,,472,472,,,,486,486,486,472,486,472,472,472,486,486,,,,486,,486,486', +'486,486,486,486,486,,,,,,486,486,486,486,486,486,486,,,486,,,,,,,486', +',,486,486,486,486,486,486,486,486,486,486,486,486,,486,486,,486,486', +'486,,,,,,,,,,,,,,,,,,,,486,,,486,,,486,486,,,486,,486,,486,,486,,,486', +',,,,,486,,,,,486,486,486,486,,486,486,486,486,,,,,486,486,,,,488,488', +'488,486,488,486,486,486,488,488,,,,488,,488,488,488,488,488,488,488', +',,,,,488,488,488,488,488,488,488,,,488,,,,,,,488,,,488,488,488,488,488', +'488,488,488,488,488,488,488,,488,488,,488,488,488,,,,,,,,,,,,,,,,,,', +',488,,,488,,,488,488,,,488,,,,488,,488,,,488,,,,,,488,,,,,488,488,488', +'488,,488,488,488,488,,,,,488,488,,,,490,490,490,488,490,488,488,488', +'490,490,,,,490,,490,490,490,490,490,490,490,,,,,,490,490,490,490,490', +'490,490,,,490,,,,,,,490,,,490,490,490,490,490,490,490,490,,490,490,490', +',490,490,,490,490,490,,,,,,,,,,,,,,,,,,,,490,,,490,,,490,490,,,490,', +',,,,490,,,,,,,,,490,,,,,490,490,490,490,,490,490,490,490,,,,,490,490', +',,,,,,490,,490,490,490,496,496,496,496,496,,,,496,496,,,,496,,496,496', +'496,496,496,496,496,,,,,,496,496,496,496,496,496,496,,,496,,,,,,496', +'496,496,496,496,496,496,496,496,496,496,496,,496,496,496,,496,496,,496', +'496,496,,,,,,,,,,,,,,,,,,,,496,,,496,,,496,496,,,496,,496,,,,496,,,', +',,,,,496,,,,,496,496,496,496,,496,496,496,496,,,,,496,496,,,,,,496,496', +',496,496,496,504,504,504,,504,,,,504,504,,,,504,,504,504,504,504,504', +'504,504,,,,,,504,504,504,504,504,504,504,,,504,,,,,,,504,,,504,504,504', +'504,504,504,504,504,,504,504,504,,504,504,,,,504,,,,,,,,,,,,,,,,,,,', +'504,,,504,,,504,504,,,504,,,,,,,,,,,,,,,,,,,,504,504,504,504,,504,504', +'504,504,,,,,504,504,,,,506,506,506,504,506,504,504,504,506,506,,,,506', +',506,506,506,506,506,506,506,,,,,,506,506,506,506,506,506,506,,,506', +',,,,,,506,,,506,506,506,506,506,506,506,506,506,506,506,506,,506,506', +',506,506,506,,,,,,,,,,,,,,,,,,,,506,,,506,,,506,506,,,506,,506,,506', +',506,,,506,,,,,,506,,,,,506,506,506,506,,506,506,506,506,,,,,506,506', +',,,512,512,512,506,512,506,506,506,512,512,,,,512,,512,512,512,512,512', +'512,512,,,,,,512,512,512,512,512,512,512,,,512,,,,,,,512,,,512,512,512', +'512,512,512,512,512,,512,512,512,,512,512,,,,512,,,,,,,,,,,,,,,,,,,', +'512,,,512,,,512,512,,,512,,,,,,,,,,,,,,,,,,,,512,512,512,512,,512,512', +'512,512,,,,,512,512,,,,515,515,515,512,515,512,512,512,515,515,,,,515', +',515,515,515,515,515,515,515,,,,,,515,515,515,515,515,515,515,,,515', +',,,,,,515,,,515,515,515,515,515,515,515,515,,515,515,515,,515,515,,515', +'515,515,,,,,,,,,,,,,,,,,,,,515,,,515,,,515,515,,,515,,,,,,515,,,,,,', +',,515,,,,,515,515,515,515,,515,515,515,515,,,,,515,515,,,,516,516,516', +'515,516,515,515,515,516,516,,,,516,,516,516,516,516,516,516,516,,,,', +',516,516,516,516,516,516,516,,,516,,,,,,,516,,,516,516,516,516,516,516', +'516,516,,516,516,516,,516,516,,516,516,516,,,,,,,,,,,,,,,,,,,,516,,', +'516,,,516,516,,,516,,,,,,516,,,,,,,,,516,,,,,516,516,516,516,,516,516', +'516,516,,,,,516,516,,,,520,520,520,516,520,516,516,516,520,520,,,,520', +',520,520,520,520,520,520,520,,,,,,520,520,520,520,520,520,520,,,520', +',,,,,,520,,,520,520,520,520,520,520,520,520,,520,520,520,,520,520,,520', +'520,520,,,,,,,,,,,,,,,,,,,,520,,,520,,,520,520,,,520,,,,,,520,,,,,,', +',,520,,,,,520,520,520,520,,520,520,520,520,,,,,520,520,,,,526,526,526', +'520,526,520,520,520,526,526,,,,526,,526,526,526,526,526,526,526,,,,', +',526,526,526,526,526,526,526,,,526,,,,,,,526,,,526,526,526,526,526,526', +'526,526,526,526,526,526,,526,526,,526,526,526,,,,,,,,,,,,,,,,,,,,526', +',,526,,,526,526,,,526,,526,,,,526,,,526,,,,,,526,,,,,526,526,526,526', +',526,526,526,526,,,,,526,526,,,,529,529,529,526,529,526,526,526,529', +'529,,,,529,,529,529,529,529,529,529,529,,,,,,529,529,529,529,529,529', +'529,,,529,,,,,,,529,,,529,529,529,529,529,529,529,529,529,529,529,529', +',529,529,,529,529,529,,,,,,,,,,,,,,,,,,,,529,,,529,,,529,529,,,529,', +',,,,529,,,529,,,,,,529,,,,,529,529,529,529,,529,529,529,529,,,,,529', +'529,,,,554,554,554,529,554,529,529,529,554,554,,,,554,,554,554,554,554', +'554,554,554,,,,,,554,554,554,554,554,554,554,,,554,,,,,,,554,,,554,554', +'554,554,554,554,554,554,,554,554,554,,554,554,,554,554,554,,,,,,,,,', +',,,,,,,,,,554,,,554,,,554,554,,,554,,,,,,554,,,,,,,,,554,,,,,554,554', +'554,554,,554,554,554,554,,,,,554,554,,,,574,574,574,554,574,554,554', +'554,574,574,,,,574,,574,574,574,574,574,574,574,,,,,,574,574,574,574', +'574,574,574,,,574,,,,,,,574,,,574,574,574,574,574,574,574,574,,574,574', +'574,,574,574,,574,574,574,,,,,,,,,,,,,,,,,,,,574,,,574,,,574,574,,,574', +',574,,,,574,,,,,,,,,574,,,,,574,574,574,574,,574,574,574,574,,,,,574', +'574,,,,575,575,575,574,575,574,574,574,575,575,,,,575,,575,575,575,575', +'575,575,575,,,,,,575,575,575,575,575,575,575,,,575,,,,,,,575,,,575,575', +'575,575,575,575,575,575,575,575,575,575,,575,575,,575,575,575,,,,,,', +',,,,,,,,,,,,,575,,,575,,,575,575,,,575,,575,,575,,575,,,575,,,,,,575', +',,,,575,575,575,575,,575,575,575,575,,,,,575,575,,,,585,585,585,575', +'585,575,575,575,585,585,,,,585,,585,585,585,585,585,585,585,,,,,,585', +'585,585,585,585,585,585,,,585,,,,,,,585,,,585,585,585,585,585,585,585', +'585,585,585,585,585,,585,585,,585,585,585,,,,,,,,,,,,,,,,,,,,585,,,585', +',,585,585,,,585,,585,,585,,585,,,585,,,,,,585,,,,,585,585,585,585,,585', +'585,585,585,,,,,585,585,,,,619,619,619,585,619,585,585,585,619,619,', +',,619,,619,619,619,619,619,619,619,,,,,,619,619,619,619,619,619,619', +',,619,,,,,,,619,,,619,619,619,619,619,619,619,619,,619,619,619,,619', +'619,,619,619,619,,,,,,,,,,,,,,,,,,,,619,,,619,,,619,619,,,619,,619,', +',,619,,,,,,,,,619,,,,,619,619,619,619,,619,619,619,619,,,,,619,619,', +',,620,620,620,619,620,619,619,619,620,620,,,,620,,620,620,620,620,620', +'620,620,,,,,,620,620,620,620,620,620,620,,,620,,,,,,,620,,,620,620,620', +'620,620,620,620,620,,620,620,620,,620,620,,620,620,620,,,,,,,,,,,,,', +',,,,,,620,,,620,,,620,620,,,620,,,,,,620,,,,,,,,,620,,,,,620,620,620', +'620,,620,620,620,620,,,,,620,620,,,,623,623,623,620,623,620,620,620', +'623,623,,,,623,,623,623,623,623,623,623,623,,,,,,623,623,623,623,623', +'623,623,,,623,,,,,,,623,,,623,623,623,623,623,623,623,623,623,623,623', +'623,,623,623,,623,623,623,,,,,,,,,,,,,,,,,,,,623,,,623,,,623,623,,,623', +',623,,623,,623,,,623,,,,,,623,,,,,623,623,623,623,,623,623,623,623,', +',,,623,623,,,,624,624,624,623,624,623,623,623,624,624,,,,624,,624,624', +'624,624,624,624,624,,,,,,624,624,624,624,624,624,624,,,624,,,,,,,624', +',,624,624,624,624,624,624,624,624,624,624,624,624,,624,624,,624,624', +'624,,,,,,,,,,,,,,,,,,,,624,,,624,,,624,624,,,624,,,,624,,624,,,624,', +',,,,624,,,,,624,624,624,624,,624,624,624,624,,,,,624,624,,,,625,625', +'625,624,625,624,624,624,625,625,,,,625,,625,625,625,625,625,625,625', +',,,,,625,625,625,625,625,625,625,,,625,,,,,,,625,,,625,625,625,625,625', +'625,625,625,,625,625,625,,625,625,,625,625,625,,,,,,,,,,,,,,,,,,,,625', +',,625,,,625,625,,,625,,,,,,625,,,,,,,,,625,,,,,625,625,625,625,,625', +'625,625,625,,,,,625,625,,,,626,626,626,625,626,625,625,625,626,626,', +',,626,,626,626,626,626,626,626,626,,,,,,626,626,626,626,626,626,626', +',,626,,,,,,,626,,,626,626,626,626,626,626,626,626,,626,626,626,,626', +'626,,626,626,626,,,,,,,,,,,,,,,,,,,,626,,,626,,,626,626,,,626,,,,,,626', +',,,,,,,,626,,,,,626,626,626,626,,626,626,626,626,,,,,626,626,,,,630', +'630,630,626,630,626,626,626,630,630,,,,630,,630,630,630,630,630,630', +'630,,,,,,630,630,630,630,630,630,630,,,630,,,,,,,630,,,630,630,630,630', +'630,630,630,630,,630,630,630,,630,630,,630,630,630,,,,,,,,,,,,,,,,,', +',,630,,,630,,,630,630,,,630,,,,,,630,,,,,,,,,630,,,,,630,630,630,630', +',630,630,630,630,,,,,630,630,,,,631,631,631,630,631,630,630,630,631', +'631,,,,631,,631,631,631,631,631,631,631,,,,,,631,631,631,631,631,631', +'631,,,631,,,,,,,631,,,631,631,631,631,631,631,631,631,,631,631,631,', +'631,631,,631,631,631,,,,,,,,,,,,,,,,,,,,631,,,631,,,631,631,,,631,,', +',,,631,,,,,,,,,631,,,,,631,631,631,631,,631,631,631,631,,,,,631,631', +',,,634,634,634,631,634,631,631,631,634,634,,,,634,,634,634,634,634,634', +'634,634,,,,,,634,634,634,634,634,634,634,,,634,,,,,,,634,,,634,634,634', +'634,634,634,634,634,,634,634,634,,634,634,,634,634,634,,,,,,,,,,,,,', +',,,,,,634,,,634,,,634,634,,,634,,,,,,634,,,,,,,,,634,,,,,634,634,634', +'634,,634,634,634,634,,,,,634,634,,,,635,635,635,634,635,634,634,634', +'635,635,,,,635,,635,635,635,635,635,635,635,,,,,,635,635,635,635,635', +'635,635,,,635,,,,,,,635,,,635,635,635,635,635,635,635,635,,635,635,635', +',635,635,,635,635,635,,,,,,,,,,,,,,,,,,,,635,,,635,,,635,635,,,635,', +',,,,635,,,,,,,,,635,,,,,635,635,635,635,,635,635,635,635,,,,,635,635', +',,,659,659,659,635,659,635,635,635,659,659,,,,659,,659,659,659,659,659', +'659,659,,,,,,659,659,659,659,659,659,659,,,659,,,,,,,659,,,659,659,659', +'659,659,659,659,659,,659,659,659,,659,659,,659,659,659,,,,,,,,,,,,,', +',,,,,,659,,,659,,,659,659,,,659,,,,,,659,,,,,,,,,659,,,,,659,659,659', +'659,,659,659,659,659,,,,,659,659,,,,662,662,662,659,662,659,659,659', +'662,662,,,,662,,662,662,662,662,662,662,662,,,,,,662,662,662,662,662', +'662,662,,,662,,,,,,,662,,,662,662,662,662,662,662,662,662,,662,662,662', +',662,662,,662,662,662,,,,,,,,,,,,,,,,,,,,662,,,662,,,662,662,,,662,', +',,,,662,,,,,,,,,662,,,,,662,662,662,662,,662,662,662,662,,,,,662,662', +',,,666,666,666,662,666,662,662,662,666,666,,,,666,,666,666,666,666,666', +'666,666,,,,,,666,666,666,666,666,666,666,,,666,,,,,,,666,,,666,666,666', +'666,666,666,666,666,,666,666,666,,666,666,,,,666,,,,,,,,,,,,,,,,,,,', +'666,,,666,,,666,666,,,666,,,,,,,,,,,,,,,,,,,,666,666,666,666,,666,666', +'666,666,,,,,666,666,,,,677,677,677,666,677,666,666,666,677,677,,,,677', +',677,677,677,677,677,677,677,,,,,,677,677,677,677,677,677,677,,,677', +',,,,,,677,,,677,677,677,677,677,677,677,677,,677,677,677,,677,677,,', +',677,,,,,,,,,,,,,,,,,,,,677,,,677,,,677,677,,,677,,,,,,,,,,,,,,,,,,', +',677,677,677,677,,677,677,677,677,,,,,677,677,,,,682,682,682,677,682', +'677,677,677,682,682,,,,682,,682,682,682,682,682,682,682,,,,,,682,682', +'682,682,682,682,682,,,682,,,,,,,682,,,682,682,682,682,682,682,682,682', +',682,682,682,,682,682,,682,682,682,,,,,,,,,,,,,,,,,,,,682,,,682,,,682', +'682,,,682,,682,,,,682,,,,,,,,,682,,,,,682,682,682,682,,682,682,682,682', +',,,,682,682,,,,699,699,699,682,699,682,682,682,699,699,,,,699,,699,699', +'699,699,699,699,699,,,,,,699,699,699,699,699,699,699,,,699,,,,,,,699', +',,699,699,699,699,699,699,699,699,,699,699,699,,699,699,,699,699,699', +',,,,,,,,,,,,,,,,,,,699,,,699,,,699,699,,,699,,,,,,699,,,,,,,,,699,,', +',,699,699,699,699,,699,699,699,699,,,,,699,699,,,,725,725,725,699,725', +'699,699,699,725,725,,,,725,,725,725,725,725,725,725,725,,,,,,725,725', +'725,725,725,725,725,,,725,,,,,,,725,,,725,725,725,725,725,725,725,725', +',725,725,725,,725,725,,725,725,725,,,,,,,,,,,,,,,,,,,,725,,,725,,,725', +'725,,,725,,,,,,725,,,,,,,,,725,,,,,725,725,725,725,,725,725,725,725', +',,,,725,725,,,,731,731,731,725,731,725,725,725,731,731,,,,731,,731,731', +'731,731,731,731,731,,,,,,731,731,731,731,731,731,731,,,731,,,,,,,731', +',,731,731,731,731,731,731,731,731,,731,731,731,,731,731,,731,731,731', +',,,,,,,,,,,,,,,,,,,731,,,731,,,731,731,,,731,,,,,,731,,,,,,,,,731,,', +',,731,731,731,731,,731,731,731,731,,,,,731,731,,,,754,754,754,731,754', +'731,731,731,754,754,,,,754,,754,754,754,754,754,754,754,,,,,,754,754', +'754,754,754,754,754,,,754,,,,,,,754,,,754,754,754,754,754,754,754,754', +',754,754,754,,754,754,,754,754,754,,,,,,,,,,,,,,,,,,,,754,,,754,,,754', +'754,,,754,,,,,,754,,,,,,,,,754,,,,,754,754,754,754,,754,754,754,754', +',,,,754,754,,,,756,756,756,754,756,754,754,754,756,756,,,,756,,756,756', +'756,756,756,756,756,,,,,,756,756,756,756,756,756,756,,,756,,,,,,,756', +',,756,756,756,756,756,756,756,756,,756,756,756,,756,756,,756,756,756', +',,,,,,,,,,,,,,,,,,,756,,,756,,,756,756,,,756,,,,,,756,,,,,,,,,756,,', +',,756,756,756,756,,756,756,756,756,,,,,756,756,,,,770,770,770,756,770', +'756,756,756,770,770,,,,770,,770,770,770,770,770,770,770,,,,,,770,770', +'770,770,770,770,770,,,770,,,,,,,770,,,770,770,770,770,770,770,770,770', +',770,770,770,,770,770,,770,770,770,,,,,,,,,,,,,,,,,,,,770,,,770,,,770', +'770,,,770,,,,,,770,,,,,,,,,770,,,,,770,770,770,770,,770,770,770,770', +',,,,770,770,,,,771,771,771,770,771,770,770,770,771,771,,,,771,,771,771', +'771,771,771,771,771,,,,,,771,771,771,771,771,771,771,,,771,,,,,,,771', +',,771,771,771,771,771,771,771,771,,771,771,771,,771,771,,771,771,771', +',,,,,,,,,,,,,,,,,,,771,,,771,,,771,771,,,771,,,,,,771,,,,,,,,,771,,', +',,771,771,771,771,,771,771,771,771,,,,,771,771,,,,772,772,772,771,772', +'771,771,771,772,772,,,,772,,772,772,772,772,772,772,772,,,,,,772,772', +'772,772,772,772,772,,,772,,,,,,,772,,,772,772,772,772,772,772,772,772', +',772,772,772,,772,772,,772,772,772,,,,,,,,,,,,,,,,,,,,772,,,772,,,772', +'772,,,772,,,,,,772,,,,,,,,,772,,,,,772,772,772,772,,772,772,772,772', +',,,,772,772,,,,773,773,773,772,773,772,772,772,773,773,,,,773,,773,773', +'773,773,773,773,773,,,,,,773,773,773,773,773,773,773,,,773,,,,,,,773', +',,773,773,773,773,773,773,773,773,,773,773,773,,773,773,,773,773,773', +',,,,,,,,,,,,,,,,,,,773,,,773,,,773,773,,,773,,,,,,773,,,,,,,,,773,,', +',,773,773,773,773,,773,773,773,773,,,,,773,773,,,,787,787,787,773,787', +'773,773,773,787,787,,,,787,,787,787,787,787,787,787,787,,,,,,787,787', +'787,787,787,787,787,,,787,,,,,,,787,,,787,787,787,787,787,787,787,787', +',787,787,787,,787,787,,,,787,,,,,,,,,,,,,,,,,,,,787,,,787,,,787,787', +',,787,,,,,,,,,,,,,,,,,,,,787,787,787,787,,787,787,787,787,,,,,787,787', +',,,837,837,837,787,837,787,787,787,837,837,,,,837,,837,837,837,837,837', +'837,837,,,,,,837,837,837,837,837,837,837,,,837,,,,,,,837,,,837,837,837', +'837,837,837,837,837,,837,837,837,,837,837,,837,837,837,,,,,,,,,,,,,', +',,,,,,837,,,837,,,837,837,,,837,,,,,,837,,,,,,,,,837,,,,,837,837,837', +'837,,837,837,837,837,,,,,837,837,,,,842,842,842,837,842,837,837,837', +'842,842,,,,842,,842,842,842,842,842,842,842,,,,,,842,842,842,842,842', +'842,842,,,842,,,,,,,842,,,842,842,842,842,842,842,842,842,,842,842,842', +',842,842,,842,842,842,,,,,,,,,,,,,,,,,,,,842,,,842,,,842,842,,,842,', +'842,,,,842,,,,,,,,,842,,,,,842,842,842,842,,842,842,842,842,,,,,842', +'842,,,,859,859,859,842,859,842,842,842,859,859,,,,859,,859,859,859,859', +'859,859,859,,,,,,859,859,859,859,859,859,859,,,859,,,,,,,859,,,859,859', +'859,859,859,859,859,859,859,859,859,859,,859,859,,859,859,859,,,,,,', +',,,,,,,,,,,,,859,,,859,,,859,859,,,859,,,,859,,859,,,859,,,,,,859,,', +',,859,859,859,859,,859,859,859,859,,,,,859,859,,,,860,860,860,859,860', +'859,859,859,860,860,,,,860,,860,860,860,860,860,860,860,,,,,,860,860', +'860,860,860,860,860,,,860,,,,,,,860,,,860,860,860,860,860,860,860,860', +',860,860,860,,860,860,,860,860,860,,,,,,,,,,,,,,,,,,,,860,,,860,,,860', +'860,,,860,,,,,,860,,,,,,,,,860,,,,,860,860,860,860,,860,860,860,860', +',,,,860,860,,,,874,874,874,860,874,860,860,860,874,874,,,,874,,874,874', +'874,874,874,874,874,,,,,,874,874,874,874,874,874,874,,,874,,,,,,,874', +',,874,874,874,874,874,874,874,874,,874,874,874,,874,874,,,,874,,,,,', +',,,,,,,,,,,,,,874,,,874,,,874,874,,,874,,,,,,,,,,,,,,,,,,,,874,874,874', +'874,,874,874,874,874,,,,,874,874,,,,886,886,886,874,886,874,874,874', +'886,886,,,,886,,886,886,886,886,886,886,886,,,,,,886,886,886,886,886', +'886,886,,,886,,,,,,,886,,,886,886,886,886,886,886,886,886,,886,886,886', +',886,886,,,,886,,,,,,,,,,,,,,,,,,,,886,,,886,,,886,886,,,886,,,,,,,', +',,,,,,,,,,,,886,886,886,886,,886,886,886,886,,,,,886,886,,,,923,923', +'923,886,923,886,886,886,923,923,,,,923,,923,923,923,923,923,923,923', +',,,,,923,923,923,923,923,923,923,,,923,,,,,,,923,,,923,923,923,923,923', +'923,923,923,,923,923,923,,923,923,,923,923,923,,,,,,,,,,,,,,,,,,,,923', +',,923,,,923,923,,,923,,,,,,923,,,,,,,,,923,,,,,923,923,923,923,,923', +'923,923,923,,,,,923,923,,,,985,985,985,923,985,923,923,923,985,985,', +',,985,,985,985,985,985,985,985,985,,,,,,985,985,985,985,985,985,985', +',,985,,,,,,,985,,,985,985,985,985,985,985,985,985,985,985,985,985,,985', +'985,,985,985,985,,,,,,,,,,,,,,,,,,,,985,,,985,,,985,985,,,985,,985,', +'985,,985,,,985,,,,,,985,,,,,985,985,985,985,,985,985,985,985,,,,,985', +'985,,,,,56,,985,,985,985,985,56,56,56,,,56,56,56,,56,,,,,,,,,,56,56', +'56,,,,,,,,56,56,,56,56,56,56,56,,,,,,,,,,,,,,,,,,,,,,,,56,56,56,56,56', +'56,56,56,56,56,56,56,56,56,,,56,56,56,,,56,,,56,,,56,56,,56,,56,,56', +',56,56,,56,56,56,56,56,,56,,56,,,,,,,,,,,,,,56,,,56,56,56,56,424,56', +',56,,,,424,424,424,,,424,424,424,,424,,,,,,,,,424,424,424,424,,,,,,', +',424,424,,424,424,424,424,424,,,,,,,,,,,,,,,,,,,,,,,,424,424,424,424', +'424,424,424,424,424,424,424,424,424,424,,,424,424,424,,,424,,,424,,', +'424,424,,424,,424,,424,,424,424,,424,424,424,424,424,,424,424,424,,', +',,,,,,,,,,,424,,,424,424,424,424,425,424,,424,,,,425,425,425,,,425,425', +'425,,425,,,,,,,,,425,425,425,425,,,,,,,,425,425,,425,425,425,425,425', +',,,,,,,,,,,,,,,,,,,,,,,425,425,425,425,425,425,425,425,425,425,425,425', +'425,425,,,425,425,425,,,425,,,425,,,425,425,,425,,425,,425,,425,425', +',425,425,425,425,425,,425,425,425,,,,,,,,,,,,,,425,,,425,425,425,425', +'27,425,,425,,,,27,27,27,,,27,27,27,,27,,,,,,,,,27,27,27,,,,,,,,,27,27', +',27,27,27,27,27,,,,,,,,,,,,,,,,,,,,,,,,27,27,27,27,27,27,27,27,27,27', +'27,27,27,27,,,27,27,27,,,27,,27,27,,,27,27,,27,,27,,27,,27,27,,27,27', +'27,27,27,28,27,27,27,,,,28,28,28,,,28,28,28,,28,27,,,27,27,,27,,27,28', +'28,,,,,,,,,28,28,,28,28,28,28,28,,,,,,,,,,,,,,,,,,,,,,,,28,28,28,28', +'28,28,28,28,28,28,28,28,28,28,,,28,28,28,,,28,,28,28,,,28,28,,28,,28', +',28,,28,28,,28,28,28,28,28,,28,415,28,,,,,,415,415,415,,,415,415,415', +'28,415,,28,28,,28,,28,,415,415,415,,,,,,,,,415,415,,415,415,415,415', +'415,,,,,,,,,,,,,,,,,,,,,,,,415,415,415,415,415,415,415,415,415,415,415', +'415,415,415,,,415,415,415,,,415,,415,415,,,415,415,,415,,415,,415,,415', +'415,,415,415,415,415,415,,415,415,415,,,,,,,,,,,,,,415,,474,415,415', +',415,,415,474,474,474,,,474,474,474,646,474,646,646,646,646,646,,,,474', +'474,,,,,646,,,,,474,474,,474,474,474,474,474,,,,,,,,,,646,336,,336,336', +'336,336,336,,646,646,646,646,,,,646,336,534,,534,534,534,534,534,474', +',,,,,,474,,534,,,474,474,336,336,,646,,,,,,336,336,336,336,,,,336,534', +',,,474,474,,,,534,534,534,534,,,,534,,,474,,,474,,,,,474,8,8,8,8,8,8', +'8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,,,,8,8,8,8,8,8,8,8,8,8,,,,,,8,8', +'8,8,8,8,8,8,8,8,,8,,,,,,,,,8,8,,8,8,8,8,8,8,8,,,8,8,,,,8,8,8,8,,,,,', +',,,,,,,,8,8,,8,8,8,8,8,8,8,8,8,8,8,8,,,8,8,,,,,,,,,,,,,,8,9,9,9,9,9', +'9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,,,,9,9,9,9,9,9,9,9,9,9,,,,,,9', +'9,9,9,9,9,9,9,9,,,9,,,,,,,,,9,9,,9,9,9,9,9,9,9,,,9,9,,,,9,9,9,9,,,,', +',,,,,,,,,9,9,,9,9,9,9,9,9,9,9,9,9,9,9,,,9,9,,,,,,,,,,,,,,9,395,395,395', +'395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395', +'395,395,395,395,,,,395,395,395,395,395,395,395,395,395,395,,,,,,395', +'395,395,395,395,395,395,395,395,,,395,,,,,,,,,395,395,,395,395,395,395', +'395,395,395,,,395,395,,,,395,395,395,395,,,,,,,,,,,,,,395,395,,395,395', +'395,395,395,395,395,395,395,395,395,395,,,395,395,,,,,,,,,,,,,,395,616', +'616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616', +'616,616,616,616,616,616,,,,616,616,616,616,616,616,616,616,616,616,', +',,,,616,616,616,616,616,616,616,616,616,,,616,,,,,,,,,616,616,,616,616', +'616,616,616,616,616,,,616,616,,,,616,616,616,616,,,,,,,,,,,,,,616,616', +',616,616,616,616,616,616,616,616,616,616,616,616,,,616,616,,,,,,,,,', +',,,,616,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71', +'71,71,71,71,,,,71,71,71,71,71,71,71,71,71,71,,,,,,71,71,71,71,71,71', +'71,71,71,71,71,71,,71,,,,,,,71,71,,71,71,71,71,71,71,71,,,71,71,,,,71', +'71,71,71,,,,,,71,,,,,,,,71,71,,71,71,71,71,71,71,71,71,71,71,71,71,', +',71,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738', +'738,738,738,738,738,738,738,738,,,,738,738,738,738,738,738,738,738,738', +'738,,,,,,738,738,738,738,738,738,738,738,738,,,738,,,,,,,,,738,738,', +'738,738,738,738,738,738,738,,,738,738,,,,738,738,738,738,,,,,,,,,,,', +',,738,738,,738,738,738,738,738,738,738,738,738,738,738,738,210,210,738', +',210,,,,,,,,,210,210,,210,210,210,210,210,210,210,,,210,210,,,,210,210', +'210,210,,,,,,210,,,,,,,,210,210,,210,210,210,210,210,210,210,210,210', +'210,210,210,211,211,210,,211,,,,,,,,,211,211,,211,211,211,211,211,211', +'211,,,211,211,,,,211,211,211,211,,,,,,211,,,,,,,,211,211,,211,211,211', +'211,211,211,211,211,211,211,211,211,259,259,211,,259,,,,,,,,,259,259', +',259,259,259,259,259,259,259,,,259,259,,,,259,259,259,259,,,,,,,,,,', +',,,259,259,,259,259,259,259,259,259,259,259,259,259,259,259,440,440', +'259,,440,,,,,,,,,440,440,,440,440,440,440,440,440,440,,,440,440,,,,440', +'440,440,440,,,,,,440,,,,,,,,440,440,,440,440,440,440,440,440,440,440', +'440,440,440,440,441,441,440,,441,,,,,,,,,441,441,,441,441,441,441,441', +'441,441,,,441,441,,,,441,441,441,441,,,,,,441,,,,,,,,441,441,,441,441', +'441,441,441,441,441,441,441,441,441,441,507,507,441,,507,,,,,,,,,507', +'507,,507,507,507,507,507,507,507,,,507,507,,,,507,507,507,507,,,,,,507', +',,,,,,,507,507,,507,507,507,507,507,507,507,507,507,507,507,507,508', +'508,507,,508,,,,,,,,,508,508,,508,508,508,508,508,508,508,,,508,508', +',,,508,508,508,508,,,,,,508,,,,,,,,508,508,,508,508,508,508,508,508', +'508,508,508,508,508,508,517,517,508,,517,,,,,,,,,517,517,,517,517,517', +'517,517,517,517,,,517,517,,,,517,517,517,517,,,,,,517,,,,,,,,517,517', +',517,517,517,517,517,517,517,517,517,517,517,517,518,518,517,,518,,', +',,,,,,518,518,,518,518,518,518,518,518,518,,,518,518,,,,518,518,518', +'518,,,,,,518,,,,,,,,518,518,,518,518,518,518,518,518,518,518,518,518', +'518,518,576,576,518,,576,,,,,,,,,576,576,,576,576,576,576,576,576,576', +',,576,576,,,,576,576,576,576,,,,,,576,,,,,,,,576,576,,576,576,576,576', +'576,576,576,576,576,576,576,576,577,577,576,,577,,,,,,,,,577,577,,577', +'577,577,577,577,577,577,,,577,577,,,,577,577,577,577,,,,,,577,,,,,,', +',577,577,,577,577,577,577,577,577,577,577,577,577,577,577,583,583,577', +',583,,,,,,,,,583,583,,583,583,583,583,583,583,583,,,583,583,,,,583,583', +'583,583,,,,,,583,,,,,,,,583,583,,583,583,583,583,583,583,583,583,583', +'583,583,583,584,584,583,,584,,,,,,,,,584,584,,584,584,584,584,584,584', +'584,,,584,584,,,,584,584,584,584,,,,,,584,,,,,,,,584,584,,584,584,584', +'584,584,584,584,584,584,584,584,584,939,939,584,,939,,,,,,,,,939,939', +',939,939,939,939,939,939,939,,,939,939,,,,939,939,939,939,,,,,,939,', +',,,,,,939,939,,939,939,939,939,939,939,939,939,939,939,939,939,986,986', +'939,,986,,,,,,,,,986,986,,986,986,986,986,986,986,986,,,986,986,,,,986', +'986,986,986,,,,,,986,,,,,,,,986,986,,986,986,986,986,986,986,986,986', +'986,986,986,986,987,987,986,,987,,,,,,,,,987,987,,987,987,987,987,987', +'987,987,,,987,987,,,,987,987,987,987,,,,,,987,,,,,,,,987,987,,987,987', +'987,987,987,987,987,987,987,987,987,987,,693,987,693,693,693,693,693', +',695,,695,695,695,695,695,,693,,,,,,,736,695,736,736,736,736,736,,,', +',,,,,693,736,,,,,,,695,693,693,693,693,,,,693,695,695,695,695,,,736', +'695,737,,737,737,737,737,737,736,736,736,736,,,,736,865,737,865,865', +'865,865,865,,867,,867,867,867,867,867,,865,,,,,,,737,867,893,,893,893', +'893,893,893,737,737,737,737,,,865,737,,893,,,,,867,865,865,865,865,', +',,865,867,867,867,867,,,,867,893,897,,897,897,897,897,897,,893,893,893', +'893,,,,893,897,899,,899,899,899,899,899,,971,,971,971,971,971,971,,899', +',,,,897,,973,971,973,973,973,973,973,,,897,897,,,,897,899,973,,,,,,', +'971,,,899,899,,,,899,971,971,971,971,,,973,971,975,,975,975,975,975', +'975,,,973,973,,,,973,977,975,977,977,977,977,977,,989,,989,989,989,989', +'989,1015,977,1015,1015,1015,1015,1015,,975,989,,,,,,,1015,,,975,975', +',,977,975,,,,,,,989,,,977,977,,,1015,977,,,989,989,,,,989,,1015,1015', +',,,1015' ] + racc_action_check = arr = ::Array.new(25292, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_action_pointer = [ + 750, 47, nil, 123, nil, 5120, 1299, -62, 23249, 23378, + -21, nil, -43, 71, 533, -41, 34, -4, nil, -72, + 5252, 1173, 168, nil, 157, nil, 6, 22760, 22871, 5384, + 5516, 5648, nil, 891, 5780, 5912, nil, 71, 227, 254, + 154, 228, 6052, 6184, 6316, 95, 544, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 22355, nil, -71, 6448, + 6580, -23, nil, 6712, 6844, nil, nil, 6976, 7116, 7248, + 7380, 23765, nil, nil, nil, nil, nil, 470, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 0, nil, nil, 113, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 262, + nil, 7520, nil, nil, nil, nil, 7660, 7792, 7924, 8056, + 8196, 1032, nil, 220, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 141, nil, 1173, 8328, 8460, 8592, + 23941, 24003, 8724, 8856, 8988, 9120, 9252, 9384, nil, nil, + 546, -77, -62, 233, 131, 196, 256, nil, 9516, 1314, + 273, 9648, 9780, 9912, 10044, 10176, 10308, 10440, 10572, 10704, + 10836, 10968, 11100, 11232, 11364, 11496, 11628, 11760, 11892, 12024, + 12156, 12288, 12420, 12552, 12684, 12816, nil, nil, nil, 24065, + nil, nil, 275, 12948, 13080, nil, nil, nil, nil, nil, + nil, nil, 13212, nil, 1314, nil, 262, 314, nil, 13344, + 366, 13476, nil, nil, 13608, 13740, nil, nil, 296, nil, + 13880, 1440, 368, 362, 1455, 384, 444, 418, 14012, 1596, + 578, 615, 681, 505, 750, nil, 478, 439, 33, nil, + nil, nil, 501, 258, 478, 14152, nil, 299, 561, 753, + nil, 569, nil, 14284, 1737, 14416, 528, nil, 105, 259, + 571, 585, 454, 619, nil, nil, 23117, 488, -1, 26, + 14548, 14680, 458, 706, 596, -23, -19, 792, 691, -18, + 724, nil, nil, 227, 281, -34, nil, 822, nil, 34, + 14812, nil, nil, nil, 264, 409, 448, 451, 478, 508, + 512, 532, 554, nil, 567, nil, 14944, nil, 275, 335, + 363, 375, 392, -45, -41, 395, nil, nil, nil, nil, + nil, nil, nil, nil, 643, 23507, nil, nil, nil, nil, + 650, nil, nil, 642, 15076, 644, nil, nil, 891, 658, + nil, 672, 676, 332, 342, 22984, nil, nil, nil, 224, + 337, 723, nil, nil, 22490, 22625, nil, 1455, nil, 689, + nil, nil, 750, nil, nil, nil, nil, -33, nil, 746, + 24127, 24189, 15208, 239, 15340, 15472, 15604, 3147, 3288, 538, + 659, 778, 783, 788, 798, 5120, 5252, 5384, 3429, 3570, + 3711, 3852, 3993, 4134, 4275, 4416, 4557, 4698, 621, 630, + 4839, 4980, 15736, -46, 23114, nil, nil, nil, nil, 747, + nil, 159, 279, 750, nil, nil, 15868, nil, 16000, nil, + 16132, nil, 332, nil, nil, nil, 16272, 1455, 1878, 752, + 751, nil, nil, 754, 16412, 767, 16544, 24251, 24313, 891, + 809, nil, 16676, 769, nil, 16808, 16940, 24375, 24437, 1596, + 17072, 897, 896, 694, 824, nil, 17204, nil, nil, 17336, + nil, nil, nil, nil, 23134, nil, 783, 784, nil, 785, + 793, 794, nil, nil, nil, nil, nil, nil, nil, nil, + 787, 477, nil, nil, 17468, nil, nil, nil, 880, nil, + nil, nil, 881, nil, nil, 882, 2019, 935, nil, 2160, + 63, 119, 935, 945, 17600, 17732, 24499, 24561, 10, nil, + nil, 894, nil, 24623, 24685, 17864, nil, nil, nil, 587, + 193, 2301, 883, nil, -14, nil, nil, nil, 733, nil, + nil, nil, 858, nil, nil, 151, nil, 222, nil, nil, + 846, nil, 847, nil, nil, nil, 23636, nil, 852, 17996, + 18128, 380, 896, 18260, 18392, 18524, 18656, 899, nil, nil, + 18788, 18920, 907, nil, 19052, 19184, nil, nil, 350, 416, + 470, 607, 874, 1032, 1737, nil, 23078, nil, 2442, 979, + 5, 316, nil, 2583, 2724, nil, 882, nil, 929, 19316, + nil, nil, 19448, nil, 905, -81, 19580, 888, nil, 893, + 137, 179, 935, 340, 1032, 936, 895, 19712, 1878, 972, + 20, 1026, 19844, nil, 913, nil, 539, 21, 914, 495, + nil, nil, 740, 24934, nil, 24942, nil, 5959, nil, 19976, + nil, 607, nil, 912, 230, 925, nil, nil, nil, nil, + 850, nil, 1044, nil, nil, nil, nil, 1050, nil, 32, + 929, 26, 41, 123, 182, 20108, 414, 1173, nil, 937, + 2865, 20240, nil, nil, 1060, 3006, 24957, 24997, 23879, nil, + nil, nil, nil, nil, nil, 3147, nil, nil, nil, nil, + nil, nil, nil, 937, 20372, 2019, 20504, nil, 938, nil, + 2160, nil, 2301, nil, nil, 2442, nil, 2583, nil, 2724, + 20636, 20768, 20900, 21032, 429, 940, 940, 954, nil, 958, + 961, 980, nil, 1009, 992, 991, 989, 21164, nil, nil, + 1128, nil, nil, 3288, 1031, 1137, nil, nil, nil, nil, + 1013, 378, nil, nil, 1149, nil, 3429, 1024, 1072, nil, + nil, 1072, nil, nil, 3570, 3711, 1074, 1032, nil, nil, + nil, 1033, 1036, nil, 1046, 1047, nil, 1051, nil, nil, + 1055, 614, 1053, 600, nil, 1188, nil, 21296, 1190, 3852, + 3993, nil, 21428, 4134, 81, 122, nil, 1191, 611, 4275, + nil, 1192, 1078, 613, nil, 1087, 1095, nil, 2865, 21560, + 21692, nil, 525, nil, nil, 25012, nil, 25020, nil, 7427, + nil, nil, 1123, 1159, 21824, 933, 1181, nil, 1141, nil, + nil, nil, 4416, nil, nil, 33, 21956, nil, nil, 1146, + 1255, nil, nil, 25037, nil, 14059, nil, 25076, nil, 25093, + nil, nil, nil, nil, 330, 3415, 1134, nil, 36, nil, + 1264, 1269, nil, 47, nil, nil, nil, 1277, nil, nil, + nil, 1197, nil, 22088, 1154, nil, nil, 1164, 1165, 1167, + 1170, nil, 1172, nil, 643, nil, nil, nil, 963, 24747, + nil, nil, nil, 4557, 1035, 1074, 1104, 1252, 1176, nil, + nil, nil, 1174, 1177, 1187, 1188, 1189, 3556, 1192, 3589, + 4698, nil, nil, nil, nil, nil, 4839, nil, 4980, 3006, + nil, 25101, nil, 25116, nil, 25156, nil, 25171, nil, nil, + nil, 1300, 1237, 1238, 1323, 22220, 24809, 24871, 1215, 25179, + nil, nil, nil, nil, 3697, 1216, 862, 1347, 1361, 1240, + 1243, 1261, 1262, nil, nil, 1270, 40, 42, 112, 1314, + 1268, 1271, nil, nil, nil, 25186, nil, nil, nil, nil, + 43, nil, 1275, nil ] + +racc_action_default = [ + -3, -597, -1, -583, -4, -597, -7, -597, -597, -597, + -597, -29, -597, -597, -597, -281, -597, -40, -43, -585, + -597, -48, -50, -51, -52, -56, -258, -258, -258, -295, + -330, -331, -68, -11, -72, -80, -82, -597, -488, -489, + -597, -597, -597, -597, -597, -585, -239, -272, -273, -274, + -275, -276, -277, -278, -279, -280, -573, -283, -285, -596, + -563, -303, -391, -597, -597, -308, -311, -583, -597, -597, + -597, -597, -332, -333, -429, -430, -431, -432, -433, -454, + -436, -437, -456, -458, -441, -446, -450, -452, -468, -456, + -470, -472, -473, -474, -475, -571, -477, -478, -572, -480, + -481, -482, -483, -484, -485, -486, -487, -492, -493, -597, + -2, -584, -592, -593, -594, -6, -597, -597, -597, -597, + -597, -3, -17, -597, -111, -112, -113, -114, -115, -116, + -117, -118, -119, -123, -124, -125, -126, -127, -128, -129, + -130, -131, -132, -133, -134, -135, -136, -137, -138, -139, + -140, -141, -142, -143, -144, -145, -146, -147, -148, -149, + -150, -151, -152, -153, -154, -155, -156, -157, -158, -159, + -160, -161, -162, -163, -164, -165, -166, -167, -168, -169, + -170, -171, -172, -173, -174, -175, -176, -177, -178, -179, + -180, -181, -182, -183, -184, -185, -186, -187, -188, -189, + -190, -191, -192, -193, -22, -120, -11, -597, -597, -248, + -597, -597, -597, -597, -597, -597, -597, -585, -586, -47, + -597, -488, -489, -597, -281, -597, -597, -229, -597, -11, + -597, -597, -597, -597, -597, -597, -597, -597, -597, -597, + -597, -597, -597, -597, -597, -597, -597, -597, -597, -597, + -597, -597, -597, -597, -597, -597, -236, -398, -400, -597, + -581, -582, -57, -248, -597, -302, -404, -413, -415, -63, + -410, -64, -585, -65, -240, -253, -262, -262, -257, -597, + -263, -597, -454, -565, -597, -597, -66, -67, -583, -12, + -597, -15, -597, -70, -11, -585, -597, -73, -76, -11, + -88, -89, -597, -597, -96, -295, -298, -585, -597, -330, + -331, -334, -411, -597, -78, -597, -84, -292, -471, -597, + -214, -215, -230, -597, -11, -597, -585, -241, -589, -589, + -597, -597, -589, -597, -304, -305, -521, -49, -597, -597, + -597, -597, -583, -597, -584, -488, -489, -597, -597, -281, + -597, -344, -345, -106, -107, -597, -109, -597, -281, -597, + -597, -488, -489, -323, -111, -112, -153, -154, -155, -171, + -176, -183, -186, -325, -597, -561, -597, -434, -597, -597, + -597, -597, -597, -597, -597, -597, 1024, -5, -595, -23, + -24, -25, -26, -27, -597, -597, -19, -20, -21, -121, + -597, -30, -39, -268, -597, -597, -267, -31, -196, -585, + -249, -262, -262, -574, -575, -258, -408, -576, -577, -575, + -574, -258, -407, -409, -576, -577, -37, -204, -38, -597, + -41, -42, -194, -263, -44, -45, -46, -585, -301, -597, + -597, -597, -248, -292, -597, -597, -597, -205, -206, -207, + -208, -209, -210, -211, -212, -216, -217, -218, -219, -220, + -221, -222, -223, -224, -225, -226, -227, -228, -231, -232, + -233, -234, -597, -380, -258, -574, -575, -54, -58, -585, + -259, -380, -380, -585, -297, -254, -597, -255, -597, -260, + -597, -264, -597, -568, -570, -10, -584, -14, -3, -585, + -69, -290, -85, -74, -597, -585, -248, -597, -597, -95, + -597, -471, -597, -81, -86, -597, -597, -597, -597, -235, + -597, -421, -597, -286, -597, -242, -591, -590, -244, -591, + -293, -294, -564, -392, -521, -395, -560, -560, -504, -506, + -506, -506, -520, -522, -523, -524, -525, -526, -527, -528, + -529, -597, -531, -533, -535, -540, -542, -543, -545, -550, + -552, -553, -555, -556, -557, -597, -11, -335, -336, -11, + -597, -597, -597, -597, -597, -248, -597, -597, -292, -316, + -106, -107, -108, -597, -597, -248, -319, -494, -495, -597, + -597, -11, -499, -327, -585, -435, -455, -460, -597, -462, + -438, -457, -597, -459, -440, -597, -443, -597, -445, -448, + -597, -449, -597, -469, -8, -18, -597, -28, -271, -597, + -597, -412, -597, -250, -252, -597, -597, -59, -247, -405, + -597, -597, -61, -406, -597, -597, -300, -587, -574, -575, + -574, -575, -585, -194, -585, -381, -585, -383, -11, -53, + -401, -380, -245, -11, -11, -296, -262, -261, -265, -597, + -566, -567, -597, -13, -597, -71, -597, -77, -83, -585, + -574, -575, -246, -92, -94, -597, -79, -597, -203, -213, + -585, -596, -596, -284, -585, -289, -589, -597, -585, -597, + -502, -503, -597, -597, -513, -597, -516, -597, -518, -597, + -346, -597, -348, -350, -357, -585, -534, -544, -554, -558, + -596, -337, -596, -309, -338, -339, -312, -597, -315, -597, + -585, -574, -575, -578, -291, -597, -106, -107, -110, -585, + -11, -597, -497, -321, -597, -11, -521, -521, -597, -562, + -461, -464, -465, -466, -467, -11, -439, -442, -444, -447, + -451, -453, -122, -269, -597, -197, -597, -588, -262, -33, + -199, -34, -200, -60, -35, -202, -36, -201, -62, -195, + -597, -597, -597, -597, -412, -597, -560, -560, -362, -364, + -364, -364, -379, -597, -585, -385, -529, -537, -538, -548, + -597, -403, -402, -11, -597, -597, -256, -266, -569, -16, + -75, -90, -87, -299, -596, -342, -11, -422, -596, -423, + -424, -597, -243, -393, -11, -11, -597, -560, -541, -559, + -505, -506, -506, -532, -506, -506, -551, -506, -529, -546, + -585, -597, -355, -597, -530, -597, -340, -597, -597, -11, + -11, -314, -597, -11, -412, -597, -412, -597, -597, -11, + -324, -597, -585, -597, -328, -597, -270, -32, -198, -251, + -597, -237, -597, -360, -361, -370, -372, -597, -375, -597, + -377, -382, -597, -597, -597, -536, -597, -399, -597, -414, + -416, -9, -11, -428, -343, -597, -597, -426, -287, -597, + -597, -394, -501, -597, -509, -597, -511, -597, -514, -597, + -517, -519, -347, -349, -353, -597, -358, -306, -597, -307, + -597, -597, -265, -596, -317, -320, -496, -597, -326, -498, + -500, -499, -463, -597, -560, -539, -363, -364, -364, -364, + -364, -549, -364, -384, -585, -387, -389, -390, -547, -597, + -292, -55, -427, -11, -97, -98, -597, -597, -105, -425, + -396, -397, -506, -506, -506, -506, -351, -597, -356, -597, + -11, -310, -313, -417, -418, -419, -11, -322, -11, -238, + -359, -597, -367, -597, -369, -597, -373, -597, -376, -378, + -386, -597, -291, -578, -421, -248, -597, -597, -104, -597, + -507, -510, -512, -515, -597, -354, -596, -597, -597, -364, + -364, -364, -364, -388, -420, -585, -574, -575, -578, -103, + -506, -352, -341, -318, -329, -597, -365, -368, -371, -374, + -412, -508, -364, -366 ] + +clist = [ +'216,275,275,275,14,327,373,409,573,14,522,276,276,276,266,270,311,311', +'258,2,415,421,334,431,220,681,323,259,122,205,535,127,127,220,220,220', +'406,14,302,302,550,328,428,478,297,130,130,132,132,542,311,311,311,110', +'114,338,339,487,438,342,513,479,735,835,582,318,660,220,220,474,111', +'220,347,357,357,705,621,826,219,6,314,690,691,804,6,783,566,569,713', +'716,378,293,295,780,127,262,269,271,906,903,525,528,115,931,532,379', +'935,660,389,390,391,392,385,484,838,14,937,343,114,1,220,220,220,220', +'14,14,881,816,359,363,648,273,286,287,605,607,500,663,653,654,394,823', +'204,352,402,395,277,277,277,651,616,472,657,13,657,923,330,650,13,375', +'331,335,350,586,374,324,325,684,326,340,958,694,696,698,839,341,329', +'332,840,725,966,275,730,849,591,592,13,738,921,405,6,782,487,784,934', +'405,533,813,416,393,6,700,660,336,687,473,481,931,387,482,14,220,220', +'220,1003,963,220,220,220,220,220,220,995,872,937,830,808,903,688,885', +'377,296,380,14,425,275,275,717,550,381,642,382,383,384,275,740,276,542', +'745,667,415,421,731,821,276,818,925,676,,1011,,,,,13,401,407,220,220', +',426,430,,13,13,826,220,734,636,,311,601,603,606,606,,,601,510,657,657', +',728,492,14,,266,311,14,,270,,302,14,669,,,524,793,774,,,927,823,,964', +',672,,302,652,863,864,,655,514,,672,14,220,,,570,571,,,801,511,495,114', +'665,,,503,220,220,668,823,,1012,786,700,293,499,832,496,,293,505,13', +',,892,914,220,,480,,,497,,,,720,483,,,593,,,220,277,13,729,,,672,844', +',277,622,968,572,114,672,,846,550,,550,,,,628,400,,,,763,633,587,800', +',768,275,615,847,,127,,,851,,,,823,,296,416,,852,853,130,,132,739,796', +'660,,,550,550,,13,431,,220,13,,542,542,,13,894,896,,898,900,812,901', +',333,628,,425,,,843,,970,,,,,,,,13,275,,,700,,700,627,,311,,1004,,632', +',296,,311,416,,296,,26,14,,14,,26,416,,748,302,748,220,809,781,,514', +',302,664,,26,,803,514,,220,657,,,26,26,26,425,26,,,917,,,796,,,425,', +'649,,,834,275,,,,,,,956,700,719,275,,822,,824,26,26,416,,26,,,786,14', +'786,416,14,,,,6,965,220,,,,,990,991,992,993,,220,,,,,,14,,550,,,425', +',,656,,,425,700,403,700,26,792,,,433,26,26,26,26,26,26,714,714,622,', +'775,,785,810,220,220,,,943,220,220,752,,220,127,732,733,1021,686,700', +'791,,,311,13,622,13,14,130,998,132,960,14,14,311,628,,,633,405,811,', +',,785,302,902,1020,854,,786,514,,,,489,302,491,759,761,493,494,802,764', +'766,,,430,919,,,,,,,,622,,,,26,26,26,26,,622,26,26,26,26,26,26,845,', +'13,,,13,848,,,,,26,220,,928,,929,14,220,,,,14,758,,,,13,,,,,14,883,', +'15,,887,,,15,,952,220,127,26,26,710,785,,712,,311,,26,,,,,,,,,,,,1005', +',15,304,304,,26,,875,,26,,,672,14,26,,,13,,16,,618,13,13,16,,14,,,,857', +',,,14,14,349,358,358,26,26,,,,,908,,,,,,,16,999,,26,26,220,,14,14,,790', +'14,,,,794,795,14,777,,311,,,26,,,,15,,,778,,311,,,351,15,15,,26,,,938', +',,,,13,,,14,658,13,333,946,661,,779,,,714,817,13,916,,,,,920,,,,,819', +',,819,,16,980,,,,,,,,16,16,,,658,,,333,,,,,,,,787,,,26,825,855,827,', +'13,14,,,,,,,,706,,275,15,13,,,425,,14,,,13,13,,14,,14,,416,433,,,,,', +'15,,,,,622,,,220,,878,13,13,,26,13,26,,,,,13,,884,26,,,,16,425,,889', +'890,,,429,,,26,753,,,,658,333,,,,,,,16,,,13,,910,911,,,913,15,,,,15', +',,,304,15,,,,337,337,,,337,797,,,798,,26,,304,26,,924,,,777,26,777,15', +'777,,,942,,819,807,26,778,,778,,778,26,,,16,,,13,16,,,829,,16,,,,,,337', +'337,337,337,,13,930,,932,,,13,,13,,,26,26,,16,,26,26,,,26,866,868,870', +',,,953,984,954,,955,,,26,,,,,26,26,787,856,,787,996,787,,787,,,997,', +',,,,38,,,,,38,,,,777,,777,,777,,777,,,,,,778,,778,,778,,778,,,,,,38', +'300,300,434,435,436,437,,,,,,,,,1000,,1001,,1002,777,26,,,,,26,26,,', +',26,778,1010,,345,361,361,361,,912,26,,,,15,,15,,,,,26,304,,,,333,,1022', +'787,304,787,,787,,787,,,,,,,,,,,,38,972,974,976,978,,979,,,38,38,26', +',,,,,,16,,16,,,,26,,787,,,,,,26,26,,,523,15,,,15,,,,,,,,,,,337,337,', +',26,,26,26,,,26,15,,,,,26,,744,,590,,1016,1017,1018,1019,,,,,,,,,,,594', +'16,,,16,,,,38,1023,,,,26,,,,,,,,,,,,,16,,,,,38,15,,,,,15,15,,,,,,,,', +',,,304,,,,,,,,,,,304,,,,,,,,429,,,,,26,,,,,,,,,16,,,,,16,16,39,26,38', +',,39,38,26,,26,300,38,,,,,,,,,,,,,15,,26,300,,15,,,,39,301,301,38,,', +'15,,,,,,,,,,,,,,,680,,,,,,,,,,,,,,346,362,362,362,,,,16,,,,,16,358,', +',,,,15,,,16,,,,,,,,,,15,,,,,,,,15,15,,39,,,,,,,,,39,39,,,,,,,,,,,,15', +'15,,,15,16,,,,,15,,,,,,,,16,,,,,,,,16,16,,,,,,,,358,,,,,,,,15,,,,948', +',,,16,16,,,16,,,,,,16,,,,,,,,,,,,39,,38,,38,,,,,,300,,,,,,,,300,,,16', +',39,,949,,,,,,15,,,,,,,,,,,,,,,,,15,,,,,337,15,,15,,,337,,,,,,,,,,,', +',38,,,38,,,,,,,16,,39,,,,39,,,,301,39,,,,38,,16,,,,,,16,,16,,301,,,', +',,,,,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,38,,,,,38,38,,,,,337,,,,', +',,300,,,,,,,,,,,300,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,38,,,,,38,,,,,,,,,,38,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39,', +'39,361,,,,,301,38,,,,,,,301,,,,,,38,,,,,,,,38,38,,,,,,,,,,,,,,,,,,,', +',,,,38,38,,,38,,,,,,38,,,,,39,,,39,,,,,,,,,,,,,,,,,361,,,,,39,,,38,', +',,944,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,39,,,,,39,39', +'38,,,,,,,,,,,301,,,,,,38,,,,227,301,38,,38,,,,,274,274,274,,,,,,,,,', +',320,321,322,,,,,,,,,,,,,,,274,274,,,,,,,,,,,,,,39,,,,,39,,,,,,,,,,39', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,362,,,,,,39,,,,,,,,,,,,,39', +',,,,,,,39,39,,,,,,,,,,,,,,,,,,,,,,,,39,39,,,39,,,,,,39,,,,,,,,,,,,,', +'274,408,274,,,427,432,,,,,362,,,,,,,,39,,227,,945,447,448,449,450,451', +'452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468', +'469,470,471,,,,,,,,274,274,,,,,,,,274,,,,,,,274,,274,,,274,274,,39,', +',,,,,,,,,,,,,,,39,,,,,,39,,39,,,,,,,,,,,519,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,274,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,274,,427,643,408,,,,,,,,,,,,,,,,,,,,,,', +',,,644,,,,,,,,,,,,,,274,,274,,274,,,,,,,,,,,,,,,,274,,,,,,,,,678,679', +',,,,,,,,,274,,,274,,,,,,,,,,,,,,,,,,,,,,,,,274,,,,,,,,,,,,,,,,,,,,274', +'274,,,,,,,,,,274,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,274,755,,,274,274', +'760,762,,,,765,767,,,643,769,,,,,,,,,,,,,,,,,,,,,,,,274,,,274,,,,,,', +',,,,,,,,,,,,,274,,,,,,,,,,,,,,,,,274,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,274,,858,,,,,,,,,,,,,,760,762,767,765,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,274,,,', +',,,,,,,,,,,,,274,858,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,969,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,274' ] + racc_goto_table = arr = ::Array.new(3100, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +clist = [ +'31,33,33,33,22,69,56,23,94,22,8,70,70,70,73,73,64,64,140,2,37,37,88', +'18,22,10,31,36,15,15,139,57,57,22,22,22,27,22,22,22,168,70,27,39,49', +'60,60,61,61,163,64,64,64,4,97,17,17,75,47,17,51,23,98,92,54,63,178,22', +'22,37,6,22,22,22,22,118,24,174,20,7,50,123,123,11,7,131,91,91,93,93', +'151,45,46,128,57,38,38,38,119,116,71,71,5,175,71,152,133,178,17,17,17', +'17,152,47,11,22,134,4,97,1,22,22,22,22,22,22,12,131,55,55,40,44,44,44', +'155,155,47,14,40,40,2,169,16,19,28,30,72,72,72,42,62,66,76,21,76,67', +'68,74,21,86,87,90,95,96,99,100,101,102,103,104,119,166,166,166,105,106', +'72,72,107,108,109,33,110,111,112,113,21,114,115,70,7,120,75,126,132', +'70,135,136,73,7,7,117,178,137,138,141,143,175,5,144,22,22,22,22,133', +'145,22,22,22,22,22,22,119,131,134,118,146,116,139,147,150,9,153,22,57', +'33,33,94,168,154,23,157,158,159,33,160,70,163,161,51,37,37,162,167,70', +'171,172,51,,119,,,,,21,20,20,22,22,,20,20,,21,21,174,22,8,47,,64,156', +'156,156,156,,,156,31,76,76,,54,151,22,,73,64,22,,73,,22,22,23,,,31,40', +'24,,,128,169,,11,,37,,22,47,123,123,,47,49,,37,22,22,,,17,17,,,24,63', +'4,97,47,,,50,22,22,47,169,,92,168,117,45,46,117,6,,45,46,21,,,123,93', +'22,,44,,,7,,,,23,44,,,36,,,22,72,21,23,,,37,24,,72,31,98,4,97,37,,24', +'168,,168,,,,73,9,,,,39,73,97,51,,39,33,15,8,,57,,,8,,,,169,,9,73,,139', +'139,60,,61,47,75,178,,,168,168,,21,18,,22,21,,163,163,,21,166,166,,166', +'166,71,166,,65,73,,57,,,91,,123,,,,,,,,21,33,,,117,,117,38,,64,,10,', +'38,,9,,64,73,,9,,41,22,,22,,41,73,,156,22,156,22,27,129,,49,,22,2,,41', +',47,49,,22,76,,,41,41,41,57,41,,,8,,,75,,,57,,38,,,47,33,,,,,,,117,117', +'70,33,,129,,129,41,41,73,,41,,,168,22,168,73,22,,,,7,94,22,,,,,166,166', +'166,166,,22,,,,,,22,,168,,,57,,,72,,,57,117,65,117,41,88,,,65,41,41', +'41,41,41,41,97,97,31,,31,,31,69,22,22,,,91,22,22,15,,22,57,97,97,166', +'72,117,140,,,64,21,31,21,22,60,8,61,91,22,22,64,73,,,73,70,31,,,,31', +'22,47,24,56,,168,49,,,,65,22,65,20,20,65,65,49,20,20,,,20,47,,,,,,,', +'31,,,,41,41,41,41,,31,41,41,41,41,41,41,17,,21,,,21,17,,,,,41,22,,129', +',129,22,22,,,,22,72,,,,21,,,,,22,69,,25,,69,,,25,,129,22,57,41,41,9', +'31,,9,,64,,41,,,,,,,,,,,,23,,25,25,25,,41,,22,,41,,,37,22,41,,,21,,26', +',65,21,21,26,,22,,,,20,,,,22,22,25,25,25,41,41,,,,,17,,,,,,,26,129,', +'41,41,22,,22,22,,9,22,,,,9,9,22,122,,64,,,41,,,,25,,,124,,64,,,26,25', +'25,,41,,,22,,,,,21,,,22,65,21,65,22,65,,127,,,97,122,21,97,,,,,97,,', +',,124,,,124,,26,31,,,,,,,,26,26,,,65,,,65,,,,,,,,170,,,41,127,9,127', +',21,22,,,,,,,,65,,33,25,21,,,57,,22,,,21,21,,22,,22,,73,65,,,,,,25,', +',,,31,,,22,,9,21,21,,41,21,41,,,,,21,,9,41,,,,26,57,,9,9,,,26,,,41,65', +',,,65,65,,,,,,,26,,,21,,9,9,,,9,25,,,,25,,,,25,25,,,,29,29,,,29,65,', +',65,,41,,25,41,,122,,,122,41,122,25,122,,,9,,124,65,41,124,,124,,124', +'41,,,26,,,21,26,,,65,,26,,,,,,29,29,29,29,,21,127,,127,,,21,,21,,,41', +'41,,26,,41,41,,,41,125,125,125,,,,127,9,127,,127,,,41,,,,,41,41,170', +'65,,170,9,170,,170,,,9,,,,,,52,,,,,52,,,,122,,122,,122,,122,,,,,,124', +',124,,124,,124,,,,,,52,52,52,29,29,29,29,,,,,,,,,127,,127,,127,122,41', +',,,,41,41,,,,41,124,127,,52,52,52,52,,65,41,,,,25,,25,,,,,41,25,,,,65', +',127,170,25,170,,170,,170,,,,,,,,,,,,52,125,125,125,125,,125,,,52,52', +'41,,,,,,,26,,26,,,,41,,170,,,,,,41,41,,,29,25,,,25,,,,,,,,,,,29,29,', +',41,,41,41,,,41,25,,,,,41,,25,,29,,125,125,125,125,,,,,,,,,,,29,26,', +',26,,,,52,125,,,,41,,,,,,,,,,,,,26,,,,,52,25,,,,,25,25,,,,,,,,,,,,25', +',,,,,,,,,,25,,,,,,,,26,,,,,41,,,,,,,,,26,,,,,26,26,53,41,52,,,53,52', +'41,,41,52,52,,,,,,,,,,,,,25,,41,52,,25,,,,53,53,53,52,,,25,,,,,,,,,', +',,,,,29,,,,,,,,,,,,,,53,53,53,53,,,,26,,,,,26,25,,,,,,25,,,26,,,,,,', +',,,25,,,,,,,,25,25,,53,,,,,,,,,53,53,,,,,,,,,,,,25,25,,,25,26,,,,,25', +',,,,,,,26,,,,,,,,26,26,,,,,,,,25,,,,,,,,25,,,,25,,,,26,26,,,26,,,,,', +'26,,,,,,,,,,,,53,,52,,52,,,,,,52,,,,,,,,52,,,26,,53,,26,,,,,,25,,,,', +',,,,,,,,,,,,25,,,,,29,25,,25,,,29,,,,,,,,,,,,,52,,,52,,,,,,,26,,53,', +',,53,,,,53,53,,,,52,,26,,,,,,26,,26,,53,,,,,,,,,53,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,52,,,,,52,52,,,,,29,,,,,,,52,,,,,,,,,,,52,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,52,,,,,52,,,,,,,,,,52,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,,53,52,,,,,53,52,,,,,,,53,,,', +',,52,,,,,,,,52,52,,,,,,,,,,,,,,,,,,,,,,,,52,52,,,52,,,,,,52,,,,,53,', +',53,,,,,,,,,,,,,,,,,52,,,,,53,,,52,,,,52,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,53,,,,,53,53,52,,,,,,,,,,,53,,,,,,52,,,,32,53', +'52,,52,,,,,32,32,32,,,,,,,,,,,32,32,32,,,,,,,,,,,,,,,32,32,,,,,,,,,', +',,,,53,,,,,53,,,,,,,,,,53,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53', +',,,,,53,,,,,,,,,,,,,53,,,,,,,,53,53,,,,,,,,,,,,,,,,,,,,,,,,53,53,,,53', +',,,,,53,,,,,,,,,,,,,,32,32,32,,,32,32,,,,,53,,,,,,,,53,,32,,53,32,32', +'32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32', +',,,,,,,32,32,,,,,,,,32,,,,,,,32,,32,,,32,32,,53,,,,,,,,,,,,,,,,,53,', +',,,,53,,53,,,,,,,,,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,32,,32,32,32,,,,,,,,,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,32,,32', +',32,,,,,,,,,,,,,,,,32,,,,,,,,,32,32,,,,,,,,,,32,,,32,,,,,,,,,,,,,,,', +',,,,,,,,,32,,,,,,,,,,,,,,,,,,,,32,32,,,,,,,,,,32,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,32,32,,,32,32,32,32,,,,32,32,,,32,32,,,,,,,,,,,,,,,,,', +',,,,,,32,,,32,,,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32,,32,,,,,,,,,,,,,,32,32,32', +'32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,32,,,,,,,,,,,,,,,,,32,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,,,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,', +',,,,,,,,,,,,,,,,,,32' ] + racc_goto_check = arr = ::Array.new(3100, nil) + idx = 0 + clist.each do |str| + str.split(',', -1).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end + end + +racc_goto_pointer = [ + nil, 119, 19, nil, 50, 97, 67, 79, -314, 198, + -496, -598, -678, nil, -359, 20, 133, -8, -190, 75, + 58, 153, 4, -202, -333, 752, 803, -171, -63, 992, + 23, -19, 2114, -28, nil, nil, 3, -190, 69, -219, + -343, 499, -328, nil, 102, 58, 59, -159, nil, 10, + 45, -255, 1170, 1458, -291, 59, -65, 23, nil, nil, + 37, 39, -249, 24, -18, 401, -105, -706, 97, -54, + -18, -228, 117, -12, -317, -220, -334, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 88, 100, -39, nil, + 99, -252, -647, -482, -335, 94, -196, 51, -530, 93, + 108, 108, -356, 110, 104, -539, 109, -538, -400, -734, + -404, -550, -179, -188, -406, -666, -732, -350, -476, -735, + -455, nil, 208, -455, 220, 355, -453, 247, -553, -134, + nil, -561, -679, -767, -757, -140, -490, 141, -329, -306, + -4, -52, nil, -61, -59, -698, -456, -579, nil, nil, + 153, 11, 23, 149, 155, -247, -98, 156, 156, 156, + -353, -351, -336, -287, nil, nil, -368, -440, -296, -552, + 292, -434, -606, nil, -618, -764, nil, nil, -422 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, 4, 344, 291, nil, 521, + nil, 836, nil, 288, 289, nil, nil, nil, 11, 12, + 18, 226, 319, nil, nil, 224, 225, nil, nil, 17, + nil, 439, 21, 22, 23, 24, nil, 675, nil, nil, + nil, 308, nil, 25, 410, 32, nil, nil, 34, 37, + 36, nil, 221, 222, 356, nil, 129, 418, 128, 131, + 75, 76, nil, 90, 46, 280, nil, nil, nil, 805, + 411, nil, 412, 423, 629, 485, 278, 264, 47, 48, + 49, 50, 51, 52, 53, 54, 55, nil, 265, 61, + nil, nil, nil, nil, nil, nil, nil, 567, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 702, 549, nil, 703, + 926, 776, 537, nil, 538, nil, nil, 539, nil, 541, + 645, nil, nil, nil, 547, nil, nil, nil, nil, nil, + nil, nil, 422, nil, nil, nil, nil, nil, 74, 77, + 78, nil, nil, nil, nil, nil, 596, nil, nil, nil, + nil, nil, nil, 820, 737, 536, nil, 540, 828, 552, + 554, 555, 788, 558, 559, 789, 562, 565, 283 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 146, :_reduce_none, + 2, 147, :_reduce_2, + 0, 148, :_reduce_3, + 1, 148, :_reduce_4, + 3, 148, :_reduce_5, + 2, 148, :_reduce_6, + 1, 150, :_reduce_none, + 4, 150, :_reduce_8, + 4, 153, :_reduce_9, + 2, 154, :_reduce_10, + 0, 158, :_reduce_11, + 1, 158, :_reduce_12, + 3, 158, :_reduce_13, + 2, 158, :_reduce_14, + 1, 159, :_reduce_none, + 4, 159, :_reduce_16, + 0, 175, :_reduce_17, + 4, 152, :_reduce_18, + 3, 152, :_reduce_19, + 3, 152, :_reduce_20, + 3, 152, :_reduce_21, + 2, 152, :_reduce_22, + 3, 152, :_reduce_23, + 3, 152, :_reduce_24, + 3, 152, :_reduce_25, + 3, 152, :_reduce_26, + 3, 152, :_reduce_27, + 4, 152, :_reduce_28, + 1, 152, :_reduce_none, + 3, 152, :_reduce_30, + 3, 152, :_reduce_31, + 6, 152, :_reduce_32, + 5, 152, :_reduce_33, + 5, 152, :_reduce_34, + 5, 152, :_reduce_35, + 5, 152, :_reduce_36, + 3, 152, :_reduce_37, + 3, 152, :_reduce_38, + 3, 152, :_reduce_39, + 1, 152, :_reduce_none, + 3, 163, :_reduce_41, + 3, 163, :_reduce_42, + 1, 174, :_reduce_none, + 3, 174, :_reduce_44, + 3, 174, :_reduce_45, + 3, 174, :_reduce_46, + 2, 174, :_reduce_47, + 1, 174, :_reduce_none, + 1, 162, :_reduce_none, + 1, 165, :_reduce_none, + 1, 165, :_reduce_none, + 1, 179, :_reduce_none, + 4, 179, :_reduce_53, + 0, 187, :_reduce_54, + 5, 184, :_reduce_55, + 1, 186, :_reduce_none, + 2, 178, :_reduce_57, + 3, 178, :_reduce_58, + 4, 178, :_reduce_59, + 5, 178, :_reduce_60, + 4, 178, :_reduce_61, + 5, 178, :_reduce_62, + 2, 178, :_reduce_63, + 2, 178, :_reduce_64, + 2, 178, :_reduce_65, + 2, 178, :_reduce_66, + 2, 178, :_reduce_67, + 1, 164, :_reduce_68, + 3, 164, :_reduce_69, + 1, 191, :_reduce_70, + 3, 191, :_reduce_71, + 1, 190, :_reduce_none, + 2, 190, :_reduce_73, + 3, 190, :_reduce_74, + 5, 190, :_reduce_75, + 2, 190, :_reduce_76, + 4, 190, :_reduce_77, + 2, 190, :_reduce_78, + 4, 190, :_reduce_79, + 1, 190, :_reduce_80, + 3, 190, :_reduce_81, + 1, 194, :_reduce_none, + 3, 194, :_reduce_83, + 2, 193, :_reduce_84, + 3, 193, :_reduce_85, + 1, 196, :_reduce_86, + 3, 196, :_reduce_87, + 1, 195, :_reduce_88, + 1, 195, :_reduce_89, + 4, 195, :_reduce_90, + 3, 195, :_reduce_91, + 3, 195, :_reduce_92, + 3, 195, :_reduce_93, + 3, 195, :_reduce_94, + 2, 195, :_reduce_95, + 1, 195, :_reduce_96, + 1, 171, :_reduce_97, + 1, 171, :_reduce_98, + 4, 171, :_reduce_99, + 3, 171, :_reduce_100, + 3, 171, :_reduce_101, + 3, 171, :_reduce_102, + 3, 171, :_reduce_103, + 2, 171, :_reduce_104, + 1, 171, :_reduce_105, + 1, 199, :_reduce_106, + 1, 199, :_reduce_none, + 2, 200, :_reduce_108, + 1, 200, :_reduce_109, + 3, 200, :_reduce_110, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 201, :_reduce_none, + 1, 204, :_reduce_116, + 1, 204, :_reduce_none, + 1, 160, :_reduce_none, + 1, 160, :_reduce_none, + 1, 161, :_reduce_120, + 0, 207, :_reduce_121, + 4, 161, :_reduce_122, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 202, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 1, 203, :_reduce_none, + 3, 177, :_reduce_194, + 5, 177, :_reduce_195, + 3, 177, :_reduce_196, + 5, 177, :_reduce_197, + 6, 177, :_reduce_198, + 5, 177, :_reduce_199, + 5, 177, :_reduce_200, + 5, 177, :_reduce_201, + 5, 177, :_reduce_202, + 4, 177, :_reduce_203, + 3, 177, :_reduce_204, + 3, 177, :_reduce_205, + 3, 177, :_reduce_206, + 3, 177, :_reduce_207, + 3, 177, :_reduce_208, + 3, 177, :_reduce_209, + 3, 177, :_reduce_210, + 3, 177, :_reduce_211, + 3, 177, :_reduce_212, + 4, 177, :_reduce_213, + 2, 177, :_reduce_214, + 2, 177, :_reduce_215, + 3, 177, :_reduce_216, + 3, 177, :_reduce_217, + 3, 177, :_reduce_218, + 3, 177, :_reduce_219, + 3, 177, :_reduce_220, + 3, 177, :_reduce_221, + 3, 177, :_reduce_222, + 3, 177, :_reduce_223, + 3, 177, :_reduce_224, + 3, 177, :_reduce_225, + 3, 177, :_reduce_226, + 3, 177, :_reduce_227, + 3, 177, :_reduce_228, + 2, 177, :_reduce_229, + 2, 177, :_reduce_230, + 3, 177, :_reduce_231, + 3, 177, :_reduce_232, + 3, 177, :_reduce_233, + 3, 177, :_reduce_234, + 3, 177, :_reduce_235, + 0, 211, :_reduce_236, + 0, 212, :_reduce_237, + 8, 177, :_reduce_238, + 1, 177, :_reduce_none, + 1, 210, :_reduce_none, + 1, 213, :_reduce_none, + 2, 213, :_reduce_none, + 4, 213, :_reduce_243, + 2, 213, :_reduce_244, + 3, 218, :_reduce_245, + 0, 219, :_reduce_246, + 1, 219, :_reduce_none, + 0, 168, :_reduce_248, + 1, 168, :_reduce_none, + 2, 168, :_reduce_none, + 4, 168, :_reduce_251, + 2, 168, :_reduce_252, + 1, 189, :_reduce_253, + 2, 189, :_reduce_254, + 2, 189, :_reduce_255, + 4, 189, :_reduce_256, + 1, 189, :_reduce_257, + 0, 222, :_reduce_258, + 2, 183, :_reduce_259, + 2, 221, :_reduce_260, + 2, 220, :_reduce_261, + 0, 220, :_reduce_262, + 1, 215, :_reduce_263, + 2, 215, :_reduce_264, + 3, 215, :_reduce_265, + 4, 215, :_reduce_266, + 1, 173, :_reduce_267, + 1, 173, :_reduce_none, + 3, 172, :_reduce_269, + 4, 172, :_reduce_270, + 2, 172, :_reduce_271, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_none, + 1, 209, :_reduce_282, + 0, 245, :_reduce_283, + 4, 209, :_reduce_284, + 0, 246, :_reduce_285, + 0, 247, :_reduce_286, + 6, 209, :_reduce_287, + 0, 248, :_reduce_288, + 4, 209, :_reduce_289, + 3, 209, :_reduce_290, + 3, 209, :_reduce_291, + 2, 209, :_reduce_292, + 3, 209, :_reduce_293, + 3, 209, :_reduce_294, + 1, 209, :_reduce_295, + 4, 209, :_reduce_296, + 3, 209, :_reduce_297, + 1, 209, :_reduce_298, + 5, 209, :_reduce_299, + 4, 209, :_reduce_300, + 3, 209, :_reduce_301, + 2, 209, :_reduce_302, + 1, 209, :_reduce_none, + 2, 209, :_reduce_304, + 2, 209, :_reduce_305, + 6, 209, :_reduce_306, + 6, 209, :_reduce_307, + 0, 249, :_reduce_308, + 0, 250, :_reduce_309, + 7, 209, :_reduce_310, + 0, 251, :_reduce_311, + 0, 252, :_reduce_312, + 7, 209, :_reduce_313, + 5, 209, :_reduce_314, + 4, 209, :_reduce_315, + 0, 253, :_reduce_316, + 0, 254, :_reduce_317, + 9, 209, :_reduce_318, + 0, 255, :_reduce_319, + 6, 209, :_reduce_320, + 0, 256, :_reduce_321, + 7, 209, :_reduce_322, + 0, 257, :_reduce_323, + 5, 209, :_reduce_324, + 0, 258, :_reduce_325, + 6, 209, :_reduce_326, + 0, 259, :_reduce_327, + 0, 260, :_reduce_328, + 9, 209, :_reduce_329, + 1, 209, :_reduce_330, + 1, 209, :_reduce_331, + 1, 209, :_reduce_332, + 1, 209, :_reduce_333, + 1, 167, :_reduce_none, + 1, 236, :_reduce_none, + 1, 236, :_reduce_none, + 2, 236, :_reduce_337, + 1, 238, :_reduce_none, + 1, 238, :_reduce_none, + 1, 237, :_reduce_none, + 5, 237, :_reduce_341, + 1, 156, :_reduce_none, + 2, 156, :_reduce_343, + 1, 240, :_reduce_none, + 1, 240, :_reduce_none, + 1, 261, :_reduce_346, + 3, 261, :_reduce_347, + 1, 264, :_reduce_348, + 3, 264, :_reduce_349, + 1, 263, :_reduce_none, + 4, 263, :_reduce_351, + 6, 263, :_reduce_352, + 3, 263, :_reduce_353, + 5, 263, :_reduce_354, + 2, 263, :_reduce_355, + 4, 263, :_reduce_356, + 1, 263, :_reduce_357, + 3, 263, :_reduce_358, + 4, 265, :_reduce_359, + 2, 265, :_reduce_360, + 2, 265, :_reduce_361, + 1, 265, :_reduce_362, + 2, 270, :_reduce_363, + 0, 270, :_reduce_364, + 6, 271, :_reduce_365, + 8, 271, :_reduce_366, + 4, 271, :_reduce_367, + 6, 271, :_reduce_368, + 4, 271, :_reduce_369, + 2, 271, :_reduce_none, + 6, 271, :_reduce_371, + 2, 271, :_reduce_372, + 4, 271, :_reduce_373, + 6, 271, :_reduce_374, + 2, 271, :_reduce_375, + 4, 271, :_reduce_376, + 2, 271, :_reduce_377, + 4, 271, :_reduce_378, + 1, 271, :_reduce_none, + 0, 185, :_reduce_380, + 1, 185, :_reduce_381, + 3, 275, :_reduce_382, + 1, 275, :_reduce_383, + 4, 275, :_reduce_384, + 1, 276, :_reduce_385, + 4, 276, :_reduce_386, + 1, 277, :_reduce_387, + 3, 277, :_reduce_388, + 1, 278, :_reduce_389, + 1, 278, :_reduce_none, + 0, 282, :_reduce_391, + 0, 283, :_reduce_392, + 4, 235, :_reduce_393, + 4, 280, :_reduce_394, + 1, 280, :_reduce_395, + 3, 281, :_reduce_396, + 3, 281, :_reduce_397, + 0, 286, :_reduce_398, + 5, 285, :_reduce_399, + 2, 180, :_reduce_400, + 4, 180, :_reduce_401, + 5, 180, :_reduce_402, + 5, 180, :_reduce_403, + 2, 234, :_reduce_404, + 4, 234, :_reduce_405, + 4, 234, :_reduce_406, + 3, 234, :_reduce_407, + 3, 234, :_reduce_408, + 3, 234, :_reduce_409, + 2, 234, :_reduce_410, + 1, 234, :_reduce_411, + 4, 234, :_reduce_412, + 0, 288, :_reduce_413, + 5, 233, :_reduce_414, + 0, 289, :_reduce_415, + 5, 233, :_reduce_416, + 5, 239, :_reduce_417, + 1, 290, :_reduce_418, + 1, 290, :_reduce_none, + 6, 155, :_reduce_420, + 0, 155, :_reduce_421, + 1, 291, :_reduce_422, + 1, 291, :_reduce_none, + 1, 291, :_reduce_none, + 2, 292, :_reduce_425, + 1, 292, :_reduce_none, + 2, 157, :_reduce_427, + 1, 157, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 223, :_reduce_none, + 1, 224, :_reduce_432, + 1, 294, :_reduce_433, + 2, 294, :_reduce_434, + 3, 295, :_reduce_435, + 1, 295, :_reduce_436, + 1, 295, :_reduce_437, + 3, 225, :_reduce_438, + 4, 226, :_reduce_439, + 3, 227, :_reduce_440, + 0, 299, :_reduce_441, + 3, 299, :_reduce_442, + 1, 300, :_reduce_443, + 2, 300, :_reduce_444, + 3, 229, :_reduce_445, + 0, 302, :_reduce_446, + 3, 302, :_reduce_447, + 3, 228, :_reduce_448, + 3, 230, :_reduce_449, + 0, 303, :_reduce_450, + 3, 303, :_reduce_451, + 0, 304, :_reduce_452, + 3, 304, :_reduce_453, + 0, 296, :_reduce_454, + 2, 296, :_reduce_455, + 0, 297, :_reduce_456, + 2, 297, :_reduce_457, + 0, 298, :_reduce_458, + 2, 298, :_reduce_459, + 1, 301, :_reduce_460, + 2, 301, :_reduce_461, + 0, 306, :_reduce_462, + 4, 301, :_reduce_463, + 1, 305, :_reduce_464, + 1, 305, :_reduce_465, + 1, 305, :_reduce_466, + 1, 305, :_reduce_none, + 1, 205, :_reduce_468, + 3, 206, :_reduce_469, + 1, 293, :_reduce_470, + 2, 293, :_reduce_471, + 1, 208, :_reduce_472, + 1, 208, :_reduce_473, + 1, 208, :_reduce_474, + 1, 208, :_reduce_475, + 1, 197, :_reduce_476, + 1, 197, :_reduce_477, + 1, 197, :_reduce_478, + 1, 197, :_reduce_479, + 1, 197, :_reduce_480, + 1, 198, :_reduce_481, + 1, 198, :_reduce_482, + 1, 198, :_reduce_483, + 1, 198, :_reduce_484, + 1, 198, :_reduce_485, + 1, 198, :_reduce_486, + 1, 198, :_reduce_487, + 1, 231, :_reduce_488, + 1, 231, :_reduce_489, + 1, 166, :_reduce_490, + 1, 166, :_reduce_491, + 1, 170, :_reduce_492, + 1, 170, :_reduce_493, + 1, 241, :_reduce_494, + 0, 307, :_reduce_495, + 4, 241, :_reduce_496, + 2, 241, :_reduce_497, + 3, 243, :_reduce_498, + 0, 309, :_reduce_499, + 3, 243, :_reduce_500, + 4, 308, :_reduce_501, + 2, 308, :_reduce_502, + 2, 308, :_reduce_503, + 1, 308, :_reduce_504, + 2, 311, :_reduce_505, + 0, 311, :_reduce_506, + 6, 284, :_reduce_507, + 8, 284, :_reduce_508, + 4, 284, :_reduce_509, + 6, 284, :_reduce_510, + 4, 284, :_reduce_511, + 6, 284, :_reduce_512, + 2, 284, :_reduce_513, + 4, 284, :_reduce_514, + 6, 284, :_reduce_515, + 2, 284, :_reduce_516, + 4, 284, :_reduce_517, + 2, 284, :_reduce_518, + 4, 284, :_reduce_519, + 1, 284, :_reduce_520, + 0, 284, :_reduce_521, + 1, 279, :_reduce_522, + 1, 279, :_reduce_523, + 1, 279, :_reduce_524, + 1, 279, :_reduce_525, + 1, 262, :_reduce_none, + 1, 262, :_reduce_527, + 1, 313, :_reduce_528, + 1, 314, :_reduce_529, + 3, 314, :_reduce_530, + 1, 272, :_reduce_531, + 3, 272, :_reduce_532, + 1, 315, :_reduce_533, + 2, 316, :_reduce_534, + 1, 316, :_reduce_535, + 2, 317, :_reduce_536, + 1, 317, :_reduce_537, + 1, 266, :_reduce_538, + 3, 266, :_reduce_539, + 1, 310, :_reduce_540, + 3, 310, :_reduce_541, + 1, 318, :_reduce_none, + 1, 318, :_reduce_none, + 2, 267, :_reduce_544, + 1, 267, :_reduce_545, + 3, 319, :_reduce_546, + 3, 320, :_reduce_547, + 1, 273, :_reduce_548, + 3, 273, :_reduce_549, + 1, 312, :_reduce_550, + 3, 312, :_reduce_551, + 1, 321, :_reduce_none, + 1, 321, :_reduce_none, + 2, 274, :_reduce_554, + 1, 274, :_reduce_555, + 1, 322, :_reduce_none, + 1, 322, :_reduce_none, + 2, 269, :_reduce_558, + 2, 268, :_reduce_559, + 0, 268, :_reduce_560, + 1, 244, :_reduce_none, + 3, 244, :_reduce_562, + 0, 232, :_reduce_563, + 2, 232, :_reduce_none, + 1, 217, :_reduce_565, + 3, 217, :_reduce_566, + 3, 323, :_reduce_567, + 2, 323, :_reduce_568, + 4, 323, :_reduce_569, + 2, 323, :_reduce_570, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 188, :_reduce_none, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 1, 182, :_reduce_none, + 1, 287, :_reduce_none, + 1, 287, :_reduce_none, + 1, 287, :_reduce_none, + 1, 181, :_reduce_none, + 1, 181, :_reduce_none, + 0, 149, :_reduce_none, + 1, 149, :_reduce_none, + 0, 176, :_reduce_none, + 1, 176, :_reduce_none, + 2, 192, :_reduce_587, + 2, 169, :_reduce_588, + 0, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 216, :_reduce_none, + 1, 242, :_reduce_592, + 1, 242, :_reduce_none, + 1, 151, :_reduce_none, + 2, 151, :_reduce_none, + 0, 214, :_reduce_596 ] + +racc_reduce_n = 597 + +racc_shift_n = 1024 + +racc_token_table = { + false => 0, + :error => 1, + :kCLASS => 2, + :kMODULE => 3, + :kDEF => 4, + :kUNDEF => 5, + :kBEGIN => 6, + :kRESCUE => 7, + :kENSURE => 8, + :kEND => 9, + :kIF => 10, + :kUNLESS => 11, + :kTHEN => 12, + :kELSIF => 13, + :kELSE => 14, + :kCASE => 15, + :kWHEN => 16, + :kWHILE => 17, + :kUNTIL => 18, + :kFOR => 19, + :kBREAK => 20, + :kNEXT => 21, + :kREDO => 22, + :kRETRY => 23, + :kIN => 24, + :kDO => 25, + :kDO_COND => 26, + :kDO_BLOCK => 27, + :kDO_LAMBDA => 28, + :kRETURN => 29, + :kYIELD => 30, + :kSUPER => 31, + :kSELF => 32, + :kNIL => 33, + :kTRUE => 34, + :kFALSE => 35, + :kAND => 36, + :kOR => 37, + :kNOT => 38, + :kIF_MOD => 39, + :kUNLESS_MOD => 40, + :kWHILE_MOD => 41, + :kUNTIL_MOD => 42, + :kRESCUE_MOD => 43, + :kALIAS => 44, + :kDEFINED => 45, + :klBEGIN => 46, + :klEND => 47, + :k__LINE__ => 48, + :k__FILE__ => 49, + :k__ENCODING__ => 50, + :tIDENTIFIER => 51, + :tFID => 52, + :tGVAR => 53, + :tIVAR => 54, + :tCONSTANT => 55, + :tLABEL => 56, + :tCVAR => 57, + :tNTH_REF => 58, + :tBACK_REF => 59, + :tSTRING_CONTENT => 60, + :tINTEGER => 61, + :tFLOAT => 62, + :tREGEXP_END => 63, + :tUPLUS => 64, + :tUMINUS => 65, + :tUMINUS_NUM => 66, + :tPOW => 67, + :tCMP => 68, + :tEQ => 69, + :tEQQ => 70, + :tNEQ => 71, + :tGEQ => 72, + :tLEQ => 73, + :tANDOP => 74, + :tOROP => 75, + :tMATCH => 76, + :tNMATCH => 77, + :tDOT => 78, + :tDOT2 => 79, + :tDOT3 => 80, + :tAREF => 81, + :tASET => 82, + :tLSHFT => 83, + :tRSHFT => 84, + :tCOLON2 => 85, + :tCOLON3 => 86, + :tOP_ASGN => 87, + :tASSOC => 88, + :tLPAREN => 89, + :tLPAREN2 => 90, + :tRPAREN => 91, + :tLPAREN_ARG => 92, + :tLBRACK => 93, + :tLBRACK2 => 94, + :tRBRACK => 95, + :tLBRACE => 96, + :tLBRACE_ARG => 97, + :tSTAR => 98, + :tSTAR2 => 99, + :tAMPER => 100, + :tAMPER2 => 101, + :tTILDE => 102, + :tPERCENT => 103, + :tDIVIDE => 104, + :tDSTAR => 105, + :tPLUS => 106, + :tMINUS => 107, + :tLT => 108, + :tGT => 109, + :tPIPE => 110, + :tBANG => 111, + :tCARET => 112, + :tLCURLY => 113, + :tRCURLY => 114, + :tBACK_REF2 => 115, + :tSYMBEG => 116, + :tSTRING_BEG => 117, + :tXSTRING_BEG => 118, + :tREGEXP_BEG => 119, + :tREGEXP_OPT => 120, + :tWORDS_BEG => 121, + :tQWORDS_BEG => 122, + :tSYMBOLS_BEG => 123, + :tQSYMBOLS_BEG => 124, + :tSTRING_DBEG => 125, + :tSTRING_DVAR => 126, + :tSTRING_END => 127, + :tSTRING_DEND => 128, + :tSTRING => 129, + :tSYMBOL => 130, + :tNL => 131, + :tEH => 132, + :tCOLON => 133, + :tCOMMA => 134, + :tSPACE => 135, + :tSEMI => 136, + :tLAMBDA => 137, + :tLAMBEG => 138, + :tCHARACTER => 139, + :tRATIONAL => 140, + :tIMAGINARY => 141, + :tLABEL_END => 142, + :tEQL => 143, + :tLOWEST => 144 } + +racc_nt_base = 145 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "kCLASS", + "kMODULE", + "kDEF", + "kUNDEF", + "kBEGIN", + "kRESCUE", + "kENSURE", + "kEND", + "kIF", + "kUNLESS", + "kTHEN", + "kELSIF", + "kELSE", + "kCASE", + "kWHEN", + "kWHILE", + "kUNTIL", + "kFOR", + "kBREAK", + "kNEXT", + "kREDO", + "kRETRY", + "kIN", + "kDO", + "kDO_COND", + "kDO_BLOCK", + "kDO_LAMBDA", + "kRETURN", + "kYIELD", + "kSUPER", + "kSELF", + "kNIL", + "kTRUE", + "kFALSE", + "kAND", + "kOR", + "kNOT", + "kIF_MOD", + "kUNLESS_MOD", + "kWHILE_MOD", + "kUNTIL_MOD", + "kRESCUE_MOD", + "kALIAS", + "kDEFINED", + "klBEGIN", + "klEND", + "k__LINE__", + "k__FILE__", + "k__ENCODING__", + "tIDENTIFIER", + "tFID", + "tGVAR", + "tIVAR", + "tCONSTANT", + "tLABEL", + "tCVAR", + "tNTH_REF", + "tBACK_REF", + "tSTRING_CONTENT", + "tINTEGER", + "tFLOAT", + "tREGEXP_END", + "tUPLUS", + "tUMINUS", + "tUMINUS_NUM", + "tPOW", + "tCMP", + "tEQ", + "tEQQ", + "tNEQ", + "tGEQ", + "tLEQ", + "tANDOP", + "tOROP", + "tMATCH", + "tNMATCH", + "tDOT", + "tDOT2", + "tDOT3", + "tAREF", + "tASET", + "tLSHFT", + "tRSHFT", + "tCOLON2", + "tCOLON3", + "tOP_ASGN", + "tASSOC", + "tLPAREN", + "tLPAREN2", + "tRPAREN", + "tLPAREN_ARG", + "tLBRACK", + "tLBRACK2", + "tRBRACK", + "tLBRACE", + "tLBRACE_ARG", + "tSTAR", + "tSTAR2", + "tAMPER", + "tAMPER2", + "tTILDE", + "tPERCENT", + "tDIVIDE", + "tDSTAR", + "tPLUS", + "tMINUS", + "tLT", + "tGT", + "tPIPE", + "tBANG", + "tCARET", + "tLCURLY", + "tRCURLY", + "tBACK_REF2", + "tSYMBEG", + "tSTRING_BEG", + "tXSTRING_BEG", + "tREGEXP_BEG", + "tREGEXP_OPT", + "tWORDS_BEG", + "tQWORDS_BEG", + "tSYMBOLS_BEG", + "tQSYMBOLS_BEG", + "tSTRING_DBEG", + "tSTRING_DVAR", + "tSTRING_END", + "tSTRING_DEND", + "tSTRING", + "tSYMBOL", + "tNL", + "tEH", + "tCOLON", + "tCOMMA", + "tSPACE", + "tSEMI", + "tLAMBDA", + "tLAMBEG", + "tCHARACTER", + "tRATIONAL", + "tIMAGINARY", + "tLABEL_END", + "tEQL", + "tLOWEST", + "$start", + "program", + "top_compstmt", + "top_stmts", + "opt_terms", + "top_stmt", + "terms", + "stmt", + "bodystmt", + "compstmt", + "opt_rescue", + "opt_else", + "opt_ensure", + "stmts", + "stmt_or_begin", + "fitem", + "undef_list", + "expr_value", + "command_asgn", + "mlhs", + "command_call", + "var_lhs", + "primary_value", + "opt_call_args", + "rbracket", + "backref", + "lhs", + "mrhs", + "mrhs_arg", + "expr", + "@1", + "opt_nl", + "arg", + "command", + "block_command", + "block_call", + "dot_or_colon", + "operation2", + "command_args", + "cmd_brace_block", + "opt_block_param", + "fcall", + "@2", + "operation", + "call_args", + "mlhs_basic", + "mlhs_inner", + "rparen", + "mlhs_head", + "mlhs_item", + "mlhs_node", + "mlhs_post", + "user_variable", + "keyword_variable", + "cname", + "cpath", + "fname", + "op", + "reswords", + "fsym", + "symbol", + "dsym", + "@3", + "simple_numeric", + "primary", + "arg_value", + "@4", + "@5", + "aref_args", + "none", + "args", + "trailer", + "assocs", + "paren_args", + "opt_paren_args", + "opt_block_arg", + "block_arg", + "@6", + "literal", + "strings", + "xstring", + "regexp", + "words", + "qwords", + "symbols", + "qsymbols", + "var_ref", + "assoc_list", + "brace_block", + "method_call", + "lambda", + "then", + "if_tail", + "do", + "case_body", + "for_var", + "superclass", + "term", + "f_arglist", + "singleton", + "@7", + "@8", + "@9", + "@10", + "@11", + "@12", + "@13", + "@14", + "@15", + "@16", + "@17", + "@18", + "@19", + "@20", + "@21", + "@22", + "f_marg", + "f_norm_arg", + "f_margs", + "f_marg_list", + "block_args_tail", + "f_block_kwarg", + "f_kwrest", + "opt_f_block_arg", + "f_block_arg", + "opt_block_args_tail", + "block_param", + "f_arg", + "f_block_optarg", + "f_rest_arg", + "block_param_def", + "opt_bv_decl", + "bv_decls", + "bvar", + "f_bad_arg", + "f_larglist", + "lambda_body", + "@23", + "@24", + "f_args", + "do_block", + "@25", + "operation3", + "@26", + "@27", + "cases", + "exc_list", + "exc_var", + "numeric", + "string", + "string1", + "string_contents", + "xstring_contents", + "regexp_contents", + "word_list", + "word", + "string_content", + "symbol_list", + "qword_list", + "qsym_list", + "string_dvar", + "@28", + "@29", + "args_tail", + "@30", + "f_kwarg", + "opt_args_tail", + "f_optarg", + "f_arg_asgn", + "f_arg_item", + "f_label", + "f_kw", + "f_block_kw", + "kwrest_mark", + "f_opt", + "f_block_opt", + "restarg_mark", + "blkarg_mark", + "assoc" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +module_eval(<<'.,.,', 'ruby22.y', 78) + def _reduce_2(val, _values, result) + result = @builder.compstmt(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 83) + def _reduce_3(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 87) + def _reduce_4(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 91) + def _reduce_5(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 95) + def _reduce_6(val, _values, result) + result = [ val[1] ] + + result + end +.,., + +# reduce 7 omitted + +module_eval(<<'.,.,', 'ruby22.y', 101) + def _reduce_8(val, _values, result) + result = @builder.preexe(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 106) + def _reduce_9(val, _values, result) + rescue_bodies = val[1] + else_t, else_ = val[2] + ensure_t, ensure_ = val[3] + + if rescue_bodies.empty? && !else_.nil? + diagnostic :warning, :useless_else, nil, else_t + end + + result = @builder.begin_body(val[0], + rescue_bodies, + else_t, else_, + ensure_t, ensure_) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 122) + def _reduce_10(val, _values, result) + result = @builder.compstmt(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 127) + def _reduce_11(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 131) + def _reduce_12(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 135) + def _reduce_13(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 139) + def _reduce_14(val, _values, result) + result = [ val[1] ] + + result + end +.,., + +# reduce 15 omitted + +module_eval(<<'.,.,', 'ruby22.y', 145) + def _reduce_16(val, _values, result) + diagnostic :error, :begin_in_method, nil, val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 150) + def _reduce_17(val, _values, result) + @lexer.state = :expr_fname + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 154) + def _reduce_18(val, _values, result) + result = @builder.alias(val[0], val[1], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 158) + def _reduce_19(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.gvar(val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 164) + def _reduce_20(val, _values, result) + result = @builder.alias(val[0], + @builder.gvar(val[1]), + @builder.back_ref(val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 170) + def _reduce_21(val, _values, result) + diagnostic :error, :nth_ref_alias, nil, val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 174) + def _reduce_22(val, _values, result) + result = @builder.undef_method(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 178) + def _reduce_23(val, _values, result) + result = @builder.condition_mod(val[0], nil, + val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 183) + def _reduce_24(val, _values, result) + result = @builder.condition_mod(nil, val[0], + val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 188) + def _reduce_25(val, _values, result) + result = @builder.loop_mod(:while, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 192) + def _reduce_26(val, _values, result) + result = @builder.loop_mod(:until, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 196) + def _reduce_27(val, _values, result) + rescue_body = @builder.rescue_body(val[1], + nil, nil, nil, + nil, val[2]) + + result = @builder.begin_body(val[0], [ rescue_body ]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 204) + def _reduce_28(val, _values, result) + result = @builder.postexe(val[0], val[1], val[2], val[3]) + + result + end +.,., + +# reduce 29 omitted + +module_eval(<<'.,.,', 'ruby22.y', 209) + def _reduce_30(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 213) + def _reduce_31(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 217) + def _reduce_32(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 224) + def _reduce_33(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 231) + def _reduce_34(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 238) + def _reduce_35(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 245) + def _reduce_36(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 252) + def _reduce_37(val, _values, result) + @builder.op_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 256) + def _reduce_38(val, _values, result) + result = @builder.assign(val[0], val[1], + @builder.array(nil, val[2], nil)) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 261) + def _reduce_39(val, _values, result) + result = @builder.multi_assign(val[0], val[1], val[2]) + + result + end +.,., + +# reduce 40 omitted + +module_eval(<<'.,.,', 'ruby22.y', 267) + def _reduce_41(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 271) + def _reduce_42(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result + end +.,., + +# reduce 43 omitted + +module_eval(<<'.,.,', 'ruby22.y', 277) + def _reduce_44(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 281) + def _reduce_45(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 285) + def _reduce_46(val, _values, result) + result = @builder.not_op(val[0], nil, val[2], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 289) + def _reduce_47(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result + end +.,., + +# reduce 48 omitted + +# reduce 49 omitted + +# reduce 50 omitted + +# reduce 51 omitted + +# reduce 52 omitted + +module_eval(<<'.,.,', 'ruby22.y', 301) + def _reduce_53(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 307) + def _reduce_54(val, _values, result) + @static_env.extend_dynamic + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 311) + def _reduce_55(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + + result + end +.,., + +# reduce 56 omitted + +module_eval(<<'.,.,', 'ruby22.y', 320) + def _reduce_57(val, _values, result) + result = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 325) + def _reduce_58(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0], + nil, val[1], nil) + + begin_t, args, body, end_t = val[2] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 334) + def _reduce_59(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 339) + def _reduce_60(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 348) + def _reduce_61(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 353) + def _reduce_62(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 362) + def _reduce_63(val, _values, result) + result = @builder.keyword_cmd(:super, val[0], + nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 367) + def _reduce_64(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], + nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 372) + def _reduce_65(val, _values, result) + result = @builder.keyword_cmd(:return, val[0], + nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 377) + def _reduce_66(val, _values, result) + result = @builder.keyword_cmd(:break, val[0], + nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 382) + def _reduce_67(val, _values, result) + result = @builder.keyword_cmd(:next, val[0], + nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 388) + def _reduce_68(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 392) + def _reduce_69(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 397) + def _reduce_70(val, _values, result) + result = @builder.multi_lhs(nil, val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 401) + def _reduce_71(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result + end +.,., + +# reduce 72 omitted + +module_eval(<<'.,.,', 'ruby22.y', 407) + def _reduce_73(val, _values, result) + result = val[0]. + push(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 412) + def _reduce_74(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 417) + def _reduce_75(val, _values, result) + result = val[0]. + push(@builder.splat(val[1], val[2])). + concat(val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 423) + def _reduce_76(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 428) + def _reduce_77(val, _values, result) + result = val[0]. + push(@builder.splat(val[1])). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 434) + def _reduce_78(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 438) + def _reduce_79(val, _values, result) + result = [ @builder.splat(val[0], val[1]), + *val[3] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 443) + def _reduce_80(val, _values, result) + result = [ @builder.splat(val[0]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 447) + def _reduce_81(val, _values, result) + result = [ @builder.splat(val[0]), + *val[2] ] + + result + end +.,., + +# reduce 82 omitted + +module_eval(<<'.,.,', 'ruby22.y', 454) + def _reduce_83(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 459) + def _reduce_84(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 463) + def _reduce_85(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 468) + def _reduce_86(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 472) + def _reduce_87(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 477) + def _reduce_88(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 481) + def _reduce_89(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 485) + def _reduce_90(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 489) + def _reduce_91(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 493) + def _reduce_92(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 497) + def _reduce_93(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 501) + def _reduce_94(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 506) + def _reduce_95(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 511) + def _reduce_96(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 516) + def _reduce_97(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 520) + def _reduce_98(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 524) + def _reduce_99(val, _values, result) + result = @builder.index_asgn(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 528) + def _reduce_100(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 532) + def _reduce_101(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 536) + def _reduce_102(val, _values, result) + result = @builder.attr_asgn(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 540) + def _reduce_103(val, _values, result) + result = @builder.assignable( + @builder.const_fetch(val[0], val[1], val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 545) + def _reduce_104(val, _values, result) + result = @builder.assignable( + @builder.const_global(val[0], val[1])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 550) + def _reduce_105(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 555) + def _reduce_106(val, _values, result) + diagnostic :error, :module_name_const, nil, val[0] + + result + end +.,., + +# reduce 107 omitted + +module_eval(<<'.,.,', 'ruby22.y', 561) + def _reduce_108(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 565) + def _reduce_109(val, _values, result) + result = @builder.const(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 569) + def _reduce_110(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result + end +.,., + +# reduce 111 omitted + +# reduce 112 omitted + +# reduce 113 omitted + +# reduce 114 omitted + +# reduce 115 omitted + +module_eval(<<'.,.,', 'ruby22.y', 578) + def _reduce_116(val, _values, result) + result = @builder.symbol(val[0]) + + result + end +.,., + +# reduce 117 omitted + +# reduce 118 omitted + +# reduce 119 omitted + +module_eval(<<'.,.,', 'ruby22.y', 587) + def _reduce_120(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 591) + def _reduce_121(val, _values, result) + @lexer.state = :expr_fname + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 595) + def _reduce_122(val, _values, result) + result = val[0] << val[3] + + result + end +.,., + +# reduce 123 omitted + +# reduce 124 omitted + +# reduce 125 omitted + +# reduce 126 omitted + +# reduce 127 omitted + +# reduce 128 omitted + +# reduce 129 omitted + +# reduce 130 omitted + +# reduce 131 omitted + +# reduce 132 omitted + +# reduce 133 omitted + +# reduce 134 omitted + +# reduce 135 omitted + +# reduce 136 omitted + +# reduce 137 omitted + +# reduce 138 omitted + +# reduce 139 omitted + +# reduce 140 omitted + +# reduce 141 omitted + +# reduce 142 omitted + +# reduce 143 omitted + +# reduce 144 omitted + +# reduce 145 omitted + +# reduce 146 omitted + +# reduce 147 omitted + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +# reduce 153 omitted + +# reduce 154 omitted + +# reduce 155 omitted + +# reduce 156 omitted + +# reduce 157 omitted + +# reduce 158 omitted + +# reduce 159 omitted + +# reduce 160 omitted + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +# reduce 173 omitted + +# reduce 174 omitted + +# reduce 175 omitted + +# reduce 176 omitted + +# reduce 177 omitted + +# reduce 178 omitted + +# reduce 179 omitted + +# reduce 180 omitted + +# reduce 181 omitted + +# reduce 182 omitted + +# reduce 183 omitted + +# reduce 184 omitted + +# reduce 185 omitted + +# reduce 186 omitted + +# reduce 187 omitted + +# reduce 188 omitted + +# reduce 189 omitted + +# reduce 190 omitted + +# reduce 191 omitted + +# reduce 192 omitted + +# reduce 193 omitted + +module_eval(<<'.,.,', 'ruby22.y', 616) + def _reduce_194(val, _values, result) + result = @builder.assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 620) + def _reduce_195(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.assign(val[0], val[1], rescue_) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 630) + def _reduce_196(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 634) + def _reduce_197(val, _values, result) + rescue_body = @builder.rescue_body(val[3], + nil, nil, nil, + nil, val[4]) + + rescue_ = @builder.begin_body(val[2], [ rescue_body ]) + + result = @builder.op_assign(val[0], val[1], rescue_) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 644) + def _reduce_198(val, _values, result) + result = @builder.op_assign( + @builder.index( + val[0], val[1], val[2], val[3]), + val[4], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 651) + def _reduce_199(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 658) + def _reduce_200(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 665) + def _reduce_201(val, _values, result) + result = @builder.op_assign( + @builder.call_method( + val[0], val[1], val[2]), + val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 672) + def _reduce_202(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_fetch(val[0], val[1], val[2])) + result = @builder.op_assign(const, val[3], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 678) + def _reduce_203(val, _values, result) + const = @builder.const_op_assignable( + @builder.const_global(val[0], val[1])) + result = @builder.op_assign(const, val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 684) + def _reduce_204(val, _values, result) + result = @builder.op_assign(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 688) + def _reduce_205(val, _values, result) + result = @builder.range_inclusive(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 692) + def _reduce_206(val, _values, result) + result = @builder.range_exclusive(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 696) + def _reduce_207(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 700) + def _reduce_208(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 704) + def _reduce_209(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 708) + def _reduce_210(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 712) + def _reduce_211(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 716) + def _reduce_212(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 720) + def _reduce_213(val, _values, result) + result = @builder.unary_op(val[0], + @builder.binary_op( + val[1], val[2], val[3])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 726) + def _reduce_214(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 730) + def _reduce_215(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 734) + def _reduce_216(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 738) + def _reduce_217(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 742) + def _reduce_218(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 746) + def _reduce_219(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 750) + def _reduce_220(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 754) + def _reduce_221(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 758) + def _reduce_222(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 762) + def _reduce_223(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 766) + def _reduce_224(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 770) + def _reduce_225(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 774) + def _reduce_226(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 778) + def _reduce_227(val, _values, result) + result = @builder.match_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 782) + def _reduce_228(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 786) + def _reduce_229(val, _values, result) + result = @builder.not_op(val[0], nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 790) + def _reduce_230(val, _values, result) + result = @builder.unary_op(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 794) + def _reduce_231(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 798) + def _reduce_232(val, _values, result) + result = @builder.binary_op(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 802) + def _reduce_233(val, _values, result) + result = @builder.logical_op(:and, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 806) + def _reduce_234(val, _values, result) + result = @builder.logical_op(:or, val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 810) + def _reduce_235(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 820) + def _reduce_236(val, _values, result) + @lexer.push_cond + @lexer.cond.push(true) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 825) + def _reduce_237(val, _values, result) + @lexer.pop_cond + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 829) + def _reduce_238(val, _values, result) + result = @builder.ternary(val[0], val[1], + val[3], val[5], val[7]) + + result + end +.,., + +# reduce 239 omitted + +# reduce 240 omitted + +# reduce 241 omitted + +# reduce 242 omitted + +module_eval(<<'.,.,', 'ruby22.y', 840) + def _reduce_243(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 844) + def _reduce_244(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 849) + def _reduce_245(val, _values, result) + result = val + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 854) + def _reduce_246(val, _values, result) + result = [ nil, [], nil ] + + result + end +.,., + +# reduce 247 omitted + +module_eval(<<'.,.,', 'ruby22.y', 860) + def _reduce_248(val, _values, result) + result = [] + + result + end +.,., + +# reduce 249 omitted + +# reduce 250 omitted + +module_eval(<<'.,.,', 'ruby22.y', 866) + def _reduce_251(val, _values, result) + result = val[0] << @builder.associate(nil, val[2], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 870) + def _reduce_252(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 875) + def _reduce_253(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 879) + def _reduce_254(val, _values, result) + result = val[0].concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 883) + def _reduce_255(val, _values, result) + result = [ @builder.associate(nil, val[0], nil) ] + result.concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 888) + def _reduce_256(val, _values, result) + assocs = @builder.associate(nil, val[2], nil) + result = val[0] << assocs + result.concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 894) + def _reduce_257(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 898) + def _reduce_258(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.push(true) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 903) + def _reduce_259(val, _values, result) + @lexer.cmdarg = val[0] + + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 910) + def _reduce_260(val, _values, result) + result = @builder.block_pass(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 915) + def _reduce_261(val, _values, result) + result = [ val[1] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 919) + def _reduce_262(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 924) + def _reduce_263(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 928) + def _reduce_264(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 932) + def _reduce_265(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 936) + def _reduce_266(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 941) + def _reduce_267(val, _values, result) + result = @builder.array(nil, val[0], nil) + + result + end +.,., + +# reduce 268 omitted + +module_eval(<<'.,.,', 'ruby22.y', 947) + def _reduce_269(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 951) + def _reduce_270(val, _values, result) + result = val[0] << @builder.splat(val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 955) + def _reduce_271(val, _values, result) + result = [ @builder.splat(val[0], val[1]) ] + + result + end +.,., + +# reduce 272 omitted + +# reduce 273 omitted + +# reduce 274 omitted + +# reduce 275 omitted + +# reduce 276 omitted + +# reduce 277 omitted + +# reduce 278 omitted + +# reduce 279 omitted + +# reduce 280 omitted + +# reduce 281 omitted + +module_eval(<<'.,.,', 'ruby22.y', 970) + def _reduce_282(val, _values, result) + result = @builder.call_method(nil, nil, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 974) + def _reduce_283(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 979) + def _reduce_284(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin_keyword(val[0], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 985) + def _reduce_285(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 990) + def _reduce_286(val, _values, result) + @lexer.state = :expr_endarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 994) + def _reduce_287(val, _values, result) + @lexer.cmdarg = val[1] + + result = @builder.begin(val[0], val[2], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1000) + def _reduce_288(val, _values, result) + @lexer.state = :expr_endarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1004) + def _reduce_289(val, _values, result) + result = @builder.begin(val[0], nil, val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1008) + def _reduce_290(val, _values, result) + result = @builder.begin(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1012) + def _reduce_291(val, _values, result) + result = @builder.const_fetch(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1016) + def _reduce_292(val, _values, result) + result = @builder.const_global(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1020) + def _reduce_293(val, _values, result) + result = @builder.array(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1024) + def _reduce_294(val, _values, result) + result = @builder.associate(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1028) + def _reduce_295(val, _values, result) + result = @builder.keyword_cmd(:return, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1032) + def _reduce_296(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1036) + def _reduce_297(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1040) + def _reduce_298(val, _values, result) + result = @builder.keyword_cmd(:yield, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1044) + def _reduce_299(val, _values, result) + result = @builder.keyword_cmd(:defined?, val[0], + val[2], [ val[3] ], val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1049) + def _reduce_300(val, _values, result) + result = @builder.not_op(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1053) + def _reduce_301(val, _values, result) + result = @builder.not_op(val[0], val[1], nil, val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1057) + def _reduce_302(val, _values, result) + method_call = @builder.call_method(nil, nil, val[0]) + + begin_t, args, body, end_t = val[1] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result + end +.,., + +# reduce 303 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1066) + def _reduce_304(val, _values, result) + begin_t, args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1072) + def _reduce_305(val, _values, result) + lambda_call = @builder.call_lambda(val[0]) + + args, (begin_t, body, end_t) = val[1] + result = @builder.block(lambda_call, + begin_t, args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1080) + def _reduce_306(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1087) + def _reduce_307(val, _values, result) + else_t, else_ = val[4] + result = @builder.condition(val[0], val[1], val[2], + else_, else_t, + val[3], val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1094) + def _reduce_308(val, _values, result) + @lexer.cond.push(true) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1098) + def _reduce_309(val, _values, result) + @lexer.cond.pop + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1102) + def _reduce_310(val, _values, result) + result = @builder.loop(:while, val[0], val[2], val[3], + val[5], val[6]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1107) + def _reduce_311(val, _values, result) + @lexer.cond.push(true) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1111) + def _reduce_312(val, _values, result) + @lexer.cond.pop + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1115) + def _reduce_313(val, _values, result) + result = @builder.loop(:until, val[0], val[2], val[3], + val[5], val[6]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1120) + def _reduce_314(val, _values, result) + *when_bodies, (else_t, else_body) = *val[3] + + result = @builder.case(val[0], val[1], + when_bodies, else_t, else_body, + val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1128) + def _reduce_315(val, _values, result) + *when_bodies, (else_t, else_body) = *val[2] + + result = @builder.case(val[0], nil, + when_bodies, else_t, else_body, + val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1136) + def _reduce_316(val, _values, result) + @lexer.cond.push(true) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1140) + def _reduce_317(val, _values, result) + @lexer.cond.pop + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1144) + def _reduce_318(val, _values, result) + result = @builder.for(val[0], val[1], + val[2], val[4], + val[5], val[7], val[8]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1150) + def _reduce_319(val, _values, result) + @static_env.extend_static + @lexer.push_cmdarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1155) + def _reduce_320(val, _values, result) + if in_def? + diagnostic :error, :class_in_def, nil, val[0] + end + + lt_t, superclass = val[2] + result = @builder.def_class(val[0], val[1], + lt_t, superclass, + val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1169) + def _reduce_321(val, _values, result) + result = @def_level + @def_level = 0 + + @static_env.extend_static + @lexer.push_cmdarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1177) + def _reduce_322(val, _values, result) + result = @builder.def_sclass(val[0], val[1], val[2], + val[5], val[6]) + + @lexer.pop_cmdarg + @static_env.unextend + + @def_level = val[4] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1187) + def _reduce_323(val, _values, result) + @static_env.extend_static + @lexer.push_cmdarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1192) + def _reduce_324(val, _values, result) + if in_def? + diagnostic :error, :module_in_def, nil, val[0] + end + + result = @builder.def_module(val[0], val[1], + val[3], val[4]) + + @lexer.pop_cmdarg + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1204) + def _reduce_325(val, _values, result) + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1210) + def _reduce_326(val, _values, result) + result = @builder.def_method(val[0], val[1], + val[3], val[4], val[5]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1219) + def _reduce_327(val, _values, result) + @lexer.state = :expr_fname + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1223) + def _reduce_328(val, _values, result) + @def_level += 1 + @static_env.extend_static + @lexer.push_cmdarg + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1229) + def _reduce_329(val, _values, result) + result = @builder.def_singleton(val[0], val[1], val[2], + val[4], val[6], val[7], val[8]) + + @lexer.pop_cmdarg + @static_env.unextend + @def_level -= 1 + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1238) + def _reduce_330(val, _values, result) + result = @builder.keyword_cmd(:break, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1242) + def _reduce_331(val, _values, result) + result = @builder.keyword_cmd(:next, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1246) + def _reduce_332(val, _values, result) + result = @builder.keyword_cmd(:redo, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1250) + def _reduce_333(val, _values, result) + result = @builder.keyword_cmd(:retry, val[0]) + + result + end +.,., + +# reduce 334 omitted + +# reduce 335 omitted + +# reduce 336 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1259) + def _reduce_337(val, _values, result) + result = val[1] + + result + end +.,., + +# reduce 338 omitted + +# reduce 339 omitted + +# reduce 340 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1268) + def _reduce_341(val, _values, result) + else_t, else_ = val[4] + result = [ val[0], + @builder.condition(val[0], val[1], val[2], + val[3], else_t, + else_, nil), + ] + + result + end +.,., + +# reduce 342 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1279) + def _reduce_343(val, _values, result) + result = val + + result + end +.,., + +# reduce 344 omitted + +# reduce 345 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1287) + def _reduce_346(val, _values, result) + result = @builder.arg(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1291) + def _reduce_347(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1296) + def _reduce_348(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1300) + def _reduce_349(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +# reduce 350 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1306) + def _reduce_351(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1311) + def _reduce_352(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2], val[3])). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1317) + def _reduce_353(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1322) + def _reduce_354(val, _values, result) + result = val[0]. + push(@builder.restarg(val[2])). + concat(val[4]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1328) + def _reduce_355(val, _values, result) + result = [ @builder.restarg(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1332) + def _reduce_356(val, _values, result) + result = [ @builder.restarg(val[0], val[1]), + *val[3] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1337) + def _reduce_357(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1341) + def _reduce_358(val, _values, result) + result = [ @builder.restarg(val[0]), + *val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1347) + def _reduce_359(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1351) + def _reduce_360(val, _values, result) + result = val[0].concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1355) + def _reduce_361(val, _values, result) + result = val[0].concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1359) + def _reduce_362(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1365) + def _reduce_363(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1369) + def _reduce_364(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1374) + def _reduce_365(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1381) + def _reduce_366(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1389) + def _reduce_367(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1395) + def _reduce_368(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1402) + def _reduce_369(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +# reduce 370 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1409) + def _reduce_371(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1416) + def _reduce_372(val, _values, result) + result = val[0].concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1420) + def _reduce_373(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1426) + def _reduce_374(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1433) + def _reduce_375(val, _values, result) + result = val[0]. + concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1438) + def _reduce_376(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1444) + def _reduce_377(val, _values, result) + result = val[0]. + concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1449) + def _reduce_378(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +# reduce 379 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1457) + def _reduce_380(val, _values, result) + result = @builder.args(nil, [], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1461) + def _reduce_381(val, _values, result) + @lexer.state = :expr_value + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1466) + def _reduce_382(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1470) + def _reduce_383(val, _values, result) + result = @builder.args(val[0], [], val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1474) + def _reduce_384(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1479) + def _reduce_385(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1483) + def _reduce_386(val, _values, result) + result = val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1488) + def _reduce_387(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1492) + def _reduce_388(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1497) + def _reduce_389(val, _values, result) + result = @builder.shadowarg(val[0]) + + result + end +.,., + +# reduce 390 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1502) + def _reduce_391(val, _values, result) + @static_env.extend_dynamic + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1506) + def _reduce_392(val, _values, result) + result = @lexer.cmdarg.dup + @lexer.cmdarg.clear + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1511) + def _reduce_393(val, _values, result) + @lexer.cmdarg = val[2] + @lexer.cmdarg.lexpop + + result = [ val[1], val[3] ] + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1521) + def _reduce_394(val, _values, result) + result = @builder.args(val[0], val[1].concat(val[2]), val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1525) + def _reduce_395(val, _values, result) + result = @builder.args(nil, val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1530) + def _reduce_396(val, _values, result) + result = [ val[0], val[1], val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1534) + def _reduce_397(val, _values, result) + result = [ val[0], val[1], val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1539) + def _reduce_398(val, _values, result) + @static_env.extend_dynamic + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1543) + def _reduce_399(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1550) + def _reduce_400(val, _values, result) + begin_t, block_args, body, end_t = val[1] + result = @builder.block(val[0], + begin_t, block_args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1556) + def _reduce_401(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1562) + def _reduce_402(val, _values, result) + lparen_t, args, rparen_t = val[3] + method_call = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1572) + def _reduce_403(val, _values, result) + method_call = @builder.call_method(val[0], val[1], val[2], + nil, val[3], nil) + + begin_t, args, body, end_t = val[4] + result = @builder.block(method_call, + begin_t, args, body, end_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1582) + def _reduce_404(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.call_method(nil, nil, val[0], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1588) + def _reduce_405(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1594) + def _reduce_406(val, _values, result) + lparen_t, args, rparen_t = val[3] + result = @builder.call_method(val[0], val[1], val[2], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1600) + def _reduce_407(val, _values, result) + result = @builder.call_method(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1604) + def _reduce_408(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1610) + def _reduce_409(val, _values, result) + lparen_t, args, rparen_t = val[2] + result = @builder.call_method(val[0], val[1], nil, + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1616) + def _reduce_410(val, _values, result) + lparen_t, args, rparen_t = val[1] + result = @builder.keyword_cmd(:super, val[0], + lparen_t, args, rparen_t) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1622) + def _reduce_411(val, _values, result) + result = @builder.keyword_cmd(:zsuper, val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1626) + def _reduce_412(val, _values, result) + result = @builder.index(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1631) + def _reduce_413(val, _values, result) + @static_env.extend_dynamic + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1635) + def _reduce_414(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1641) + def _reduce_415(val, _values, result) + @static_env.extend_dynamic + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1645) + def _reduce_416(val, _values, result) + result = [ val[0], val[2], val[3], val[4] ] + + @static_env.unextend + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1652) + def _reduce_417(val, _values, result) + result = [ @builder.when(val[0], val[1], val[2], val[3]), + *val[4] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1658) + def _reduce_418(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +# reduce 419 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1664) + def _reduce_420(val, _values, result) + assoc_t, exc_var = val[2] + + if val[1] + exc_list = @builder.array(nil, val[1], nil) + end + + result = [ @builder.rescue_body(val[0], + exc_list, assoc_t, exc_var, + val[3], val[4]), + *val[5] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1677) + def _reduce_421(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1682) + def _reduce_422(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +# reduce 423 omitted + +# reduce 424 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1689) + def _reduce_425(val, _values, result) + result = [ val[0], val[1] ] + + result + end +.,., + +# reduce 426 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1695) + def _reduce_427(val, _values, result) + result = [ val[0], val[1] ] + + result + end +.,., + +# reduce 428 omitted + +# reduce 429 omitted + +# reduce 430 omitted + +# reduce 431 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1705) + def _reduce_432(val, _values, result) + result = @builder.string_compose(nil, val[0], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1710) + def _reduce_433(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1714) + def _reduce_434(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1719) + def _reduce_435(val, _values, result) + result = @builder.string_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1723) + def _reduce_436(val, _values, result) + result = @builder.string(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1727) + def _reduce_437(val, _values, result) + result = @builder.character(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1732) + def _reduce_438(val, _values, result) + result = @builder.xstring_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1737) + def _reduce_439(val, _values, result) + opts = @builder.regexp_options(val[3]) + result = @builder.regexp_compose(val[0], val[1], val[2], opts) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1743) + def _reduce_440(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1748) + def _reduce_441(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1752) + def _reduce_442(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1757) + def _reduce_443(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1761) + def _reduce_444(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1766) + def _reduce_445(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1771) + def _reduce_446(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1775) + def _reduce_447(val, _values, result) + result = val[0] << @builder.word(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1780) + def _reduce_448(val, _values, result) + result = @builder.words_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1785) + def _reduce_449(val, _values, result) + result = @builder.symbols_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1790) + def _reduce_450(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1794) + def _reduce_451(val, _values, result) + result = val[0] << @builder.string_internal(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1799) + def _reduce_452(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1803) + def _reduce_453(val, _values, result) + result = val[0] << @builder.symbol_internal(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1808) + def _reduce_454(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1812) + def _reduce_455(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1817) + def _reduce_456(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1821) + def _reduce_457(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1826) + def _reduce_458(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1830) + def _reduce_459(val, _values, result) + result = val[0] << val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1835) + def _reduce_460(val, _values, result) + result = @builder.string_internal(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1839) + def _reduce_461(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1843) + def _reduce_462(val, _values, result) + @lexer.cond.push(false) + @lexer.cmdarg.push(false) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1848) + def _reduce_463(val, _values, result) + @lexer.cond.lexpop + @lexer.cmdarg.lexpop + + result = @builder.begin(val[0], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1856) + def _reduce_464(val, _values, result) + result = @builder.gvar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1860) + def _reduce_465(val, _values, result) + result = @builder.ivar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1864) + def _reduce_466(val, _values, result) + result = @builder.cvar(val[0]) + + result + end +.,., + +# reduce 467 omitted + +module_eval(<<'.,.,', 'ruby22.y', 1871) + def _reduce_468(val, _values, result) + result = @builder.symbol(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1876) + def _reduce_469(val, _values, result) + result = @builder.symbol_compose(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1881) + def _reduce_470(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1885) + def _reduce_471(val, _values, result) + result = @builder.negate(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1890) + def _reduce_472(val, _values, result) + result = @builder.integer(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1894) + def _reduce_473(val, _values, result) + result = @builder.float(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1898) + def _reduce_474(val, _values, result) + result = @builder.rational(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1902) + def _reduce_475(val, _values, result) + result = @builder.complex(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1907) + def _reduce_476(val, _values, result) + result = @builder.ident(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1911) + def _reduce_477(val, _values, result) + result = @builder.ivar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1915) + def _reduce_478(val, _values, result) + result = @builder.gvar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1919) + def _reduce_479(val, _values, result) + result = @builder.const(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1923) + def _reduce_480(val, _values, result) + result = @builder.cvar(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1928) + def _reduce_481(val, _values, result) + result = @builder.nil(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1932) + def _reduce_482(val, _values, result) + result = @builder.self(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1936) + def _reduce_483(val, _values, result) + result = @builder.true(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1940) + def _reduce_484(val, _values, result) + result = @builder.false(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1944) + def _reduce_485(val, _values, result) + result = @builder.__FILE__(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1948) + def _reduce_486(val, _values, result) + result = @builder.__LINE__(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1952) + def _reduce_487(val, _values, result) + result = @builder.__ENCODING__(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1957) + def _reduce_488(val, _values, result) + result = @builder.accessible(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1961) + def _reduce_489(val, _values, result) + result = @builder.accessible(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1966) + def _reduce_490(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1970) + def _reduce_491(val, _values, result) + result = @builder.assignable(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1975) + def _reduce_492(val, _values, result) + result = @builder.nth_ref(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1979) + def _reduce_493(val, _values, result) + result = @builder.back_ref(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1984) + def _reduce_494(val, _values, result) + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1988) + def _reduce_495(val, _values, result) + @lexer.state = :expr_value + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1992) + def _reduce_496(val, _values, result) + result = [ val[0], val[2] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 1996) + def _reduce_497(val, _values, result) + yyerrok + result = nil + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2002) + def _reduce_498(val, _values, result) + result = @builder.args(val[0], val[1], val[2]) + + @lexer.state = :expr_value + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2007) + def _reduce_499(val, _values, result) + result = @lexer.in_kwarg + @lexer.in_kwarg = true + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2012) + def _reduce_500(val, _values, result) + @lexer.in_kwarg = val[0] + result = @builder.args(nil, val[1], nil) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2018) + def _reduce_501(val, _values, result) + result = val[0].concat(val[2]).concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2022) + def _reduce_502(val, _values, result) + result = val[0].concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2026) + def _reduce_503(val, _values, result) + result = val[0].concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2030) + def _reduce_504(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2035) + def _reduce_505(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2039) + def _reduce_506(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2044) + def _reduce_507(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2051) + def _reduce_508(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[6]). + concat(val[7]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2059) + def _reduce_509(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2065) + def _reduce_510(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2072) + def _reduce_511(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2078) + def _reduce_512(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2085) + def _reduce_513(val, _values, result) + result = val[0]. + concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2090) + def _reduce_514(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2096) + def _reduce_515(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[4]). + concat(val[5]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2103) + def _reduce_516(val, _values, result) + result = val[0]. + concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2108) + def _reduce_517(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2114) + def _reduce_518(val, _values, result) + result = val[0]. + concat(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2119) + def _reduce_519(val, _values, result) + result = val[0]. + concat(val[2]). + concat(val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2125) + def _reduce_520(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2129) + def _reduce_521(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2134) + def _reduce_522(val, _values, result) + diagnostic :error, :argument_const, nil, val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2138) + def _reduce_523(val, _values, result) + diagnostic :error, :argument_ivar, nil, val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2142) + def _reduce_524(val, _values, result) + diagnostic :error, :argument_gvar, nil, val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2146) + def _reduce_525(val, _values, result) + diagnostic :error, :argument_cvar, nil, val[0] + + result + end +.,., + +# reduce 526 omitted + +module_eval(<<'.,.,', 'ruby22.y', 2152) + def _reduce_527(val, _values, result) + @static_env.declare val[0][0] + + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2159) + def _reduce_528(val, _values, result) + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2164) + def _reduce_529(val, _values, result) + result = @builder.arg(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2168) + def _reduce_530(val, _values, result) + result = @builder.multi_lhs(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2173) + def _reduce_531(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2177) + def _reduce_532(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2182) + def _reduce_533(val, _values, result) + check_kwarg_name(val[0]) + + @static_env.declare val[0][0] + + result = val[0] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2191) + def _reduce_534(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2195) + def _reduce_535(val, _values, result) + result = @builder.kwarg(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2200) + def _reduce_536(val, _values, result) + result = @builder.kwoptarg(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2204) + def _reduce_537(val, _values, result) + result = @builder.kwarg(val[0]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2209) + def _reduce_538(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2213) + def _reduce_539(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2218) + def _reduce_540(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2222) + def _reduce_541(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +# reduce 542 omitted + +# reduce 543 omitted + +module_eval(<<'.,.,', 'ruby22.y', 2229) + def _reduce_544(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.kwrestarg(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2235) + def _reduce_545(val, _values, result) + result = [ @builder.kwrestarg(val[0]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2240) + def _reduce_546(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2245) + def _reduce_547(val, _values, result) + result = @builder.optarg(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2250) + def _reduce_548(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2254) + def _reduce_549(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2259) + def _reduce_550(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2263) + def _reduce_551(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +# reduce 552 omitted + +# reduce 553 omitted + +module_eval(<<'.,.,', 'ruby22.y', 2270) + def _reduce_554(val, _values, result) + @static_env.declare val[1][0] + + result = [ @builder.restarg(val[0], val[1]) ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2276) + def _reduce_555(val, _values, result) + result = [ @builder.restarg(val[0]) ] + + result + end +.,., + +# reduce 556 omitted + +# reduce 557 omitted + +module_eval(<<'.,.,', 'ruby22.y', 2283) + def _reduce_558(val, _values, result) + @static_env.declare val[1][0] + + result = @builder.blockarg(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2290) + def _reduce_559(val, _values, result) + result = [ val[1] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2294) + def _reduce_560(val, _values, result) + result = [] + + result + end +.,., + +# reduce 561 omitted + +module_eval(<<'.,.,', 'ruby22.y', 2300) + def _reduce_562(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2305) + def _reduce_563(val, _values, result) + result = [] + + result + end +.,., + +# reduce 564 omitted + +module_eval(<<'.,.,', 'ruby22.y', 2311) + def _reduce_565(val, _values, result) + result = [ val[0] ] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2315) + def _reduce_566(val, _values, result) + result = val[0] << val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2320) + def _reduce_567(val, _values, result) + result = @builder.pair(val[0], val[1], val[2]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2324) + def _reduce_568(val, _values, result) + result = @builder.pair_keyword(val[0], val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2328) + def _reduce_569(val, _values, result) + result = @builder.pair_quoted(val[0], val[1], val[2], val[3]) + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2332) + def _reduce_570(val, _values, result) + result = @builder.kwsplat(val[0], val[1]) + + result + end +.,., + +# reduce 571 omitted + +# reduce 572 omitted + +# reduce 573 omitted + +# reduce 574 omitted + +# reduce 575 omitted + +# reduce 576 omitted + +# reduce 577 omitted + +# reduce 578 omitted + +# reduce 579 omitted + +# reduce 580 omitted + +# reduce 581 omitted + +# reduce 582 omitted + +# reduce 583 omitted + +# reduce 584 omitted + +# reduce 585 omitted + +# reduce 586 omitted + +module_eval(<<'.,.,', 'ruby22.y', 2343) + def _reduce_587(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'ruby22.y', 2347) + def _reduce_588(val, _values, result) + result = val[1] + + result + end +.,., + +# reduce 589 omitted + +# reduce 590 omitted + +# reduce 591 omitted + +module_eval(<<'.,.,', 'ruby22.y', 2353) + def _reduce_592(val, _values, result) + yyerrok + + result + end +.,., + +# reduce 593 omitted + +# reduce 594 omitted + +# reduce 595 omitted + +module_eval(<<'.,.,', 'ruby22.y', 2362) + def _reduce_596(val, _values, result) + result = nil + + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Ruby22 +end # module Parser diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/tp_plus b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/tp_plus new file mode 100644 index 000000000000..34b6284db714 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/tp_plus @@ -0,0 +1,1933 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +module TPPlus + class Parser < Racc::Parser + +module_eval(<<'...end tp_plus.y/module_eval...', 'tp_plus.y', 592) + + include TPPlus::Nodes + + attr_reader :interpreter + def initialize(scanner, interpreter = TPPlus::Interpreter.new) + @scanner = scanner + @interpreter = interpreter + super() + end + + def next_token + t = @scanner.next_token + @interpreter.line_count += 1 if t && t[0] == :NEWLINE + + #puts t.inspect + t + end + + def parse + #@yydebug =true + + do_parse + @interpreter + end + + def on_error(t, val, vstack) + raise ParseError, sprintf("Parse error on line #{@scanner.tok_line} column #{@scanner.tok_col}: %s (%s)", + val.inspect, token_to_str(t) || '?') + end + + class ParseError < StandardError ; end +...end tp_plus.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 62, 62, 62, 62, 101, 122, 62, 41, 38, 130, + 275, 265, 72, 41, 72, 98, 113, 72, 53, 114, + 41, 67, 67, 67, 67, 234, 38, 26, 152, 151, + 101, 36, 64, 159, 81, 82, 72, 308, 159, 81, + 82, 72, 122, 70, 308, 60, 74, 60, 42, 308, + 60, 43, 44, 131, 45, 31, 32, 300, 75, 34, + 35, 46, 47, 102, 60, 273, 30, 72, 29, 28, + 25, 63, 76, 37, 27, 24, 62, 41, 38, 37, + 69, 69, 69, 69, 33, 61, 37, 97, 53, 102, + 61, 37, 81, 82, 355, 61, 103, 26, 82, 72, + 60, 36, 159, 81, 82, 72, 208, 221, 209, 371, + 82, 72, 105, 220, 33, 81, 82, 72, 42, 72, + 317, 43, 44, 111, 45, 31, 32, 96, 72, 34, + 35, 46, 47, 96, 60, 223, 30, 224, 29, 28, + 25, 63, 115, 37, 27, 24, 62, 41, 38, 72, + 60, 81, 82, 72, 33, 61, 121, 116, 53, 61, + 122, 88, 94, 96, 321, 117, 118, 26, 317, 352, + 125, 36, 323, 127, 203, 349, 350, 351, 353, 303, + 304, 96, 367, 81, 82, 72, 60, 255, 42, 209, + 101, 43, 44, 122, 45, 31, 32, 185, 94, 34, + 35, 46, 47, 186, 60, 191, 30, 61, 29, 28, + 25, 63, 321, 37, 27, 24, 62, 41, 38, 188, + 323, 122, 203, 122, 33, 61, 82, 72, 53, 336, + 335, 182, 181, 179, 180, 177, 173, 26, 176, 174, + 199, 36, 81, 82, 72, 81, 82, 72, 81, 82, + 72, 81, 82, 81, 82, 72, 200, 201, 42, 203, + 204, 43, 44, 96, 45, 31, 32, 210, 211, 34, + 35, 46, 47, 212, 60, 213, 30, 214, 29, 28, + 25, 63, 215, 37, 27, 24, 216, 178, 217, 175, + 81, 82, 72, 218, 33, 61, 81, 82, 72, 219, + 88, 317, 96, 81, 82, 72, 88, 227, 96, 81, + 82, 72, 227, 88, 96, 96, 81, 82, 72, 88, + 229, 96, 81, 82, 72, 60, 88, 230, 96, 231, + 234, 60, 88, 235, 96, 238, 122, 94, 60, 81, + 82, 72, 122, 94, 60, 321, 61, 81, 82, 72, + 94, 60, 61, 323, 241, 203, 94, 60, 242, 61, + 244, 245, 246, 94, 247, 61, 248, 249, 250, 94, + 251, 252, 61, 81, 82, 72, 253, 254, 61, 81, + 82, 72, 257, 88, 188, 96, 81, 82, 72, 88, + 259, 96, 81, 82, 72, 269, 88, 271, 96, 81, + 82, 72, 88, 276, 96, 122, 281, 282, 60, 88, + 283, 96, 284, 285, 60, 286, 287, 288, 289, 290, + 94, 60, 82, 292, 293, 294, 94, 60, 122, 61, + 122, 72, 298, 94, 60, 61, 301, 302, 305, 94, + 306, 313, 61, 314, 122, 122, 94, 325, 61, 135, + 136, 139, 140, 137, 138, 61, 141, 142, 144, 145, + 146, 148, 143, 147, 135, 136, 139, 140, 137, 138, + 326, 141, 142, 144, 145, 146, 148, 143, 147, 327, + 328, 188, 97, 333, 275, 122, 33, 135, 136, 139, + 140, 137, 138, 205, 141, 142, 144, 145, 146, 148, + 143, 147, 188, 188, 333, 122, 346, 347, 207, 135, + 136, 139, 140, 137, 138, 348, 141, 142, 144, 145, + 146, 148, 143, 147, 188, 356, 357, 358, 359, 360, + 135, 136, 139, 140, 137, 138, 361, 141, 142, 144, + 145, 146, 148, 143, 147, 135, 136, 139, 140, 137, + 138, 362, 141, 142, 144, 145, 146, 148, 143, 147, + 135, 136, 139, 140, 137, 138, 122, 141, 142, 144, + 145, 146, 148, 143, 147, 135, 136, 139, 140, 137, + 138, 364, 141, 142, 144, 145, 146, 148, 143, 147, + 135, 136, 139, 140, 137, 138, 72, 141, 142, 144, + 145, 146, 148, 143, 147, 135, 136, 139, 140, 137, + 138, 33, 141, 142, 144, 145, 146, 148, 143, 147, + 135, 136, 139, 140, 137, 138, 378, 141, 142, 144, + 145, 146, 148, 143, 147, 135, 136, 139, 140, 137, + 138, 379, 141, 142, 144, 145, 146, 148, 143, 147, + 380, 381, 382, 383, 385, 386, 390, 72, 392 ] + +racc_action_check = [ + 3, 65, 309, 312, 72, 272, 0, 0, 0, 70, + 240, 232, 28, 295, 29, 36, 48, 105, 0, 48, + 296, 3, 65, 309, 312, 232, 383, 0, 95, 95, + 36, 0, 1, 97, 97, 97, 97, 295, 186, 186, + 186, 186, 343, 27, 296, 28, 30, 29, 0, 383, + 105, 0, 0, 70, 0, 0, 0, 272, 31, 0, + 0, 0, 0, 72, 0, 240, 0, 38, 0, 0, + 0, 0, 32, 0, 0, 0, 2, 2, 2, 295, + 3, 65, 309, 312, 0, 0, 296, 36, 2, 36, + 97, 383, 224, 224, 343, 186, 37, 2, 358, 358, + 38, 2, 209, 209, 209, 209, 153, 184, 153, 358, + 229, 229, 38, 184, 41, 88, 88, 88, 2, 44, + 301, 2, 2, 46, 2, 2, 2, 88, 47, 2, + 2, 2, 2, 301, 2, 187, 2, 187, 2, 2, + 2, 2, 53, 2, 2, 2, 188, 188, 188, 58, + 88, 35, 35, 35, 2, 2, 60, 55, 188, 209, + 63, 35, 88, 35, 301, 55, 55, 188, 337, 342, + 64, 188, 301, 68, 301, 342, 342, 342, 342, 280, + 280, 337, 357, 357, 357, 357, 35, 222, 188, 222, + 99, 188, 188, 101, 188, 188, 188, 102, 35, 188, + 188, 188, 188, 103, 188, 109, 188, 35, 188, 188, + 188, 188, 337, 188, 188, 188, 225, 225, 225, 111, + 337, 112, 337, 115, 188, 188, 293, 293, 225, 320, + 320, 98, 98, 98, 98, 98, 98, 225, 98, 98, + 117, 225, 34, 34, 34, 75, 75, 75, 234, 234, + 234, 98, 98, 238, 238, 238, 118, 121, 225, 123, + 132, 225, 225, 98, 225, 225, 225, 173, 174, 225, + 225, 225, 225, 175, 225, 176, 225, 177, 225, 225, + 225, 225, 178, 225, 225, 225, 179, 98, 180, 98, + 42, 42, 42, 181, 225, 225, 43, 43, 43, 182, + 42, 363, 42, 45, 45, 45, 43, 189, 43, 76, + 76, 76, 190, 45, 363, 45, 94, 94, 94, 76, + 191, 76, 113, 113, 113, 42, 94, 192, 94, 193, + 194, 43, 113, 197, 113, 201, 202, 42, 45, 326, + 326, 326, 203, 43, 76, 363, 42, 360, 360, 360, + 45, 94, 43, 363, 204, 363, 76, 113, 205, 45, + 210, 211, 212, 94, 213, 76, 214, 215, 216, 113, + 217, 218, 94, 114, 114, 114, 219, 221, 113, 116, + 116, 116, 226, 114, 227, 114, 134, 134, 134, 116, + 228, 116, 199, 199, 199, 235, 134, 239, 134, 200, + 200, 200, 199, 241, 199, 242, 244, 245, 114, 200, + 246, 200, 247, 248, 116, 249, 250, 251, 252, 253, + 114, 134, 254, 256, 260, 263, 116, 199, 265, 114, + 266, 269, 270, 134, 200, 116, 275, 277, 291, 199, + 292, 297, 134, 299, 300, 302, 200, 303, 199, 133, + 133, 133, 133, 133, 133, 200, 133, 133, 133, 133, + 133, 133, 133, 133, 150, 150, 150, 150, 150, 150, + 304, 150, 150, 150, 150, 150, 150, 150, 150, 306, + 307, 107, 308, 313, 315, 323, 325, 107, 107, 107, + 107, 107, 107, 133, 107, 107, 107, 107, 107, 107, + 107, 107, 328, 108, 331, 333, 338, 339, 150, 108, + 108, 108, 108, 108, 108, 340, 108, 108, 108, 108, + 108, 108, 108, 108, 110, 347, 349, 350, 351, 352, + 110, 110, 110, 110, 110, 110, 353, 110, 110, 110, + 110, 110, 110, 110, 110, 83, 83, 83, 83, 83, + 83, 354, 83, 83, 83, 83, 83, 83, 83, 83, + 195, 195, 195, 195, 195, 195, 355, 195, 195, 195, + 195, 195, 195, 195, 195, 196, 196, 196, 196, 196, + 196, 356, 196, 196, 196, 196, 196, 196, 196, 196, + 198, 198, 198, 198, 198, 198, 359, 198, 198, 198, + 198, 198, 198, 198, 198, 206, 206, 206, 206, 206, + 206, 361, 206, 206, 206, 206, 206, 206, 206, 206, + 236, 236, 236, 236, 236, 236, 365, 236, 236, 236, + 236, 236, 236, 236, 236, 237, 237, 237, 237, 237, + 237, 366, 237, 237, 237, 237, 237, 237, 237, 237, + 368, 371, 372, 373, 376, 379, 384, 385, 387 ] + +racc_action_pointer = [ + 2, 32, 72, -4, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 13, -17, -15, + 20, -16, -2, nil, 215, 124, 13, 67, 38, nil, + nil, 32, 263, 269, 90, 276, 94, 99, -30, nil, + nil, nil, nil, 125, nil, 127, nil, nil, 120, nil, + 82, nil, nil, 135, 170, -3, nil, nil, 148, nil, + -17, nil, -13, nil, nil, 218, 282, nil, nil, nil, + nil, nil, nil, 514, nil, nil, nil, nil, 88, nil, + nil, nil, nil, nil, 289, 1, nil, 7, 224, 173, + nil, 168, 121, 129, nil, -12, nil, 456, 478, 154, + 499, 194, 196, 295, 346, 198, 352, 210, 226, nil, + nil, 231, nil, 179, nil, nil, nil, nil, nil, nil, + nil, nil, 183, 418, 359, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 433, nil, nil, 31, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 189, 190, 195, 197, 199, 204, 208, + 210, 215, 221, nil, 84, nil, 12, 60, 142, 260, + 265, 246, 279, 281, 269, 529, 544, 315, 559, 365, + 372, 258, 311, 317, 328, 341, 574, nil, nil, 76, + 332, 333, 334, 336, 338, 339, 340, 342, 343, 348, + nil, 303, 112, nil, 65, 212, 334, 359, 342, 82, + nil, nil, -36, nil, 221, 321, 589, 604, 226, 349, + -16, 328, 380, nil, 327, 328, 331, 333, 334, 336, + 337, 338, 339, 340, 394, nil, 346, nil, nil, nil, + 406, nil, nil, 377, nil, 403, 405, nil, nil, 402, + 357, nil, -20, nil, nil, 360, nil, 420, nil, nil, + 124, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 363, 414, 198, nil, 8, 15, 366, nil, 362, + 419, 94, 420, 373, 396, nil, 404, 405, 408, -2, + nil, nil, -1, 466, nil, 458, nil, nil, nil, nil, + 202, nil, nil, 460, nil, 404, 312, nil, 477, nil, + nil, 487, nil, 480, nil, nil, nil, 142, 431, 430, + 467, nil, 156, 17, nil, nil, nil, 499, nil, 452, + 453, 454, 455, 462, 472, 541, 506, 156, 70, 567, + 320, 529, nil, 275, nil, 551, 564, nil, 575, nil, + nil, 623, 577, 576, nil, nil, 577, nil, nil, 629, + nil, nil, nil, 20, 581, 628, nil, 583, nil, nil, + nil, nil, nil ] + +racc_action_default = [ + -2, -210, -1, -188, -8, -9, -10, -11, -12, -13, + -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, + -24, -25, -26, -27, -28, -29, -30, -210, -210, -210, + -210, -210, -210, -45, -210, -210, -118, -210, -210, -61, + -62, -210, -210, -210, -210, -210, -210, -210, -81, -84, + -85, -86, -87, -210, -111, -210, -116, -117, -210, -125, + -210, -183, -184, -190, -210, -188, -3, -185, -7, -187, + -210, -34, -118, -35, -36, -210, -210, -46, -103, -104, + -158, -159, -160, -47, -128, -129, -130, -131, -210, -148, + -149, -150, -151, -152, -210, -210, -157, -52, -210, -119, + -121, -190, -210, -210, -58, -210, -63, -210, -210, -210, + -210, -210, -190, -210, -210, -190, -210, -210, -210, -120, + -126, -210, -189, -210, -192, 393, -4, -6, -186, -31, + -32, -33, -210, -210, -210, -134, -135, -136, -137, -138, + -139, -140, -141, -142, -143, -144, -145, -146, -147, -132, + -210, -155, -156, -210, -50, -53, -54, -55, -56, -57, + -112, -161, -162, -163, -164, -165, -166, -167, -168, -169, + -170, -171, -172, -210, -210, -210, -210, -210, -210, -210, + -210, -210, -210, -122, -210, -127, -52, -210, -210, -89, + -89, -210, -210, -210, -210, -82, -83, -210, -113, -210, + -210, -210, -190, -190, -210, -38, -133, -153, -48, -210, + -210, -210, -210, -210, -210, -210, -210, -210, -210, -210, + -123, -210, -210, -59, -210, -5, -210, -210, -210, -210, + -67, -70, -78, -72, -210, -210, -114, -115, -210, -210, + -210, -210, -190, -51, -210, -210, -210, -210, -210, -210, + -210, -210, -210, -210, -210, -49, -210, -64, -88, -65, + -210, -68, -69, -210, -73, -190, -190, -75, -76, -210, + -210, -191, -190, -194, -195, -210, -37, -39, -41, -42, + -210, -173, -174, -175, -176, -177, -178, -179, -180, -181, + -182, -210, -210, -210, -71, -210, -210, -210, -154, -210, + -190, -205, -190, -210, -210, -124, -210, -210, -210, -188, + -79, -80, -188, -210, -193, -210, -197, -198, -199, -200, + -210, -203, -204, -190, -40, -210, -210, -60, -210, -77, + -74, -90, -91, -190, -196, -201, -202, -205, -210, -210, + -210, -92, -210, -190, -207, -209, -43, -210, -66, -210, + -210, -210, -210, -210, -210, -190, -210, -210, -210, -210, + -210, -210, -206, -205, -44, -210, -210, -110, -210, -98, + -99, -210, -210, -210, -107, -108, -102, -208, -93, -210, + -94, -100, -95, -210, -210, -210, -109, -210, -105, -106, + -97, -101, -96 ] + +racc_goto_table = [ + 39, 106, 39, 66, 78, 65, 123, 68, 77, 184, + 9, 2, 9, 153, 40, 261, 40, 274, 310, 310, + 194, 189, 190, 197, 192, 193, 71, 73, 39, 39, + 277, 260, 233, 344, 79, 1, 104, 322, 39, 332, + 291, 128, 40, 40, 109, 78, 129, 112, 243, 132, + 311, 311, 40, 83, 226, 228, 389, 341, 232, 377, + 107, 108, 263, 110, 266, 126, 331, 155, 167, 68, + 264, 309, 312, 322, 365, 79, 368, 373, 387, 261, + 384, 160, 119, 183, 120, 149, 168, 161, 162, 163, + 324, 164, 334, 165, 133, 307, 166, 156, 169, 322, + 170, 171, 222, 187, 172, 39, 388, 158, 202, 272, + 316, 343, 150, nil, nil, nil, nil, nil, nil, 40, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 195, 196, nil, 198, nil, nil, nil, nil, nil, + nil, 258, nil, nil, 369, 239, 240, nil, nil, nil, + 280, nil, 206, nil, nil, nil, 155, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 295, 296, nil, nil, nil, nil, 155, + nil, nil, nil, nil, nil, nil, 156, nil, 39, nil, + nil, nil, nil, nil, 256, nil, 158, nil, 9, 225, + nil, nil, 40, nil, 267, nil, nil, nil, 78, 156, + 280, nil, 270, nil, nil, 299, nil, 236, 237, 158, + nil, nil, nil, nil, nil, 39, nil, nil, 65, 262, + nil, nil, nil, nil, 268, 9, nil, nil, 79, 40, + nil, 342, 340, 315, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 337, nil, nil, 297, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 338, 354, nil, nil, nil, + nil, nil, nil, 262, nil, nil, 78, nil, 363, nil, + 339, nil, nil, nil, nil, nil, nil, nil, nil, 329, + nil, nil, 330, 68, nil, nil, 68, nil, nil, nil, + nil, 376, nil, nil, nil, nil, 79, 78, nil, nil, + 375, 366, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 79, 370, 372, + 374, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 391 ] + +racc_goto_check = [ + 40, 35, 40, 4, 39, 3, 86, 7, 29, 34, + 12, 2, 12, 37, 43, 47, 43, 89, 36, 36, + 34, 5, 5, 34, 5, 5, 28, 28, 40, 40, + 31, 46, 50, 94, 40, 1, 28, 75, 40, 56, + 47, 6, 43, 43, 40, 39, 27, 40, 38, 29, + 44, 44, 43, 30, 45, 45, 42, 56, 48, 94, + 30, 30, 49, 30, 51, 4, 55, 39, 39, 7, + 50, 52, 52, 75, 57, 40, 58, 59, 60, 47, + 61, 62, 63, 67, 68, 71, 73, 76, 77, 78, + 31, 79, 89, 80, 30, 46, 81, 40, 82, 75, + 83, 84, 37, 28, 85, 40, 36, 12, 87, 88, + 90, 93, 30, nil, nil, nil, nil, nil, nil, 43, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 30, 30, nil, 30, nil, nil, nil, nil, nil, + nil, 5, nil, nil, 47, 86, 86, nil, nil, nil, + 34, nil, 30, nil, nil, nil, 39, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 34, 34, nil, nil, nil, nil, 39, + nil, nil, nil, nil, nil, nil, 40, nil, 40, nil, + nil, nil, nil, nil, 39, nil, 12, nil, 12, 2, + nil, nil, 43, nil, 39, nil, nil, nil, 39, 40, + 34, nil, 29, nil, nil, 86, nil, 30, 30, 12, + nil, nil, nil, nil, nil, 40, nil, nil, 3, 40, + nil, nil, nil, nil, 40, 12, nil, nil, 40, 43, + nil, 34, 5, 86, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 86, nil, nil, 40, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 35, 86, nil, nil, nil, + nil, nil, nil, 40, nil, nil, 39, nil, 86, nil, + 29, nil, nil, nil, nil, nil, nil, nil, nil, 4, + nil, nil, 4, 7, nil, nil, 7, nil, nil, nil, + nil, 35, nil, nil, nil, nil, 40, 39, nil, nil, + 39, 29, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 40, 40, 40, + 40, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 40 ] + +racc_goto_pointer = [ + nil, 35, 11, 3, 0, -86, -27, 4, nil, nil, + nil, nil, 10, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, -24, -2, -26, + 18, -212, nil, nil, -92, -40, -277, -84, -161, -30, + 0, nil, -327, 14, -245, -135, -198, -214, -136, -170, + -162, -170, -224, nil, nil, -247, -274, -283, -282, -283, + -305, -296, -17, 24, nil, nil, nil, -16, 26, nil, + nil, -3, nil, -12, nil, -264, -11, -10, -9, -7, + -5, -2, 0, 2, 3, 6, -57, -15, -131, -223, + -191, nil, nil, -226, -304 ] + +racc_goto_default = [ + nil, nil, nil, 3, nil, nil, nil, 4, 5, 6, + 7, 8, 87, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, nil, 55, nil, + nil, nil, 278, 279, 124, 54, 52, nil, 154, 89, + 91, 157, 51, 92, 49, nil, nil, 80, nil, nil, + nil, nil, nil, 48, 50, nil, nil, nil, nil, nil, + nil, nil, nil, 56, 57, 99, 58, 100, 59, 84, + 85, 86, 134, 90, 93, 95, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 318, nil, nil, + 345, 319, 320, nil, nil ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 86, :_reduce_1, + 0, 86, :_reduce_none, + 2, 87, :_reduce_3, + 3, 87, :_reduce_4, + 2, 90, :_reduce_5, + 1, 91, :_reduce_none, + 0, 91, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 88, :_reduce_28, + 1, 88, :_reduce_29, + 1, 111, :_reduce_30, + 3, 110, :_reduce_31, + 1, 112, :_reduce_none, + 1, 112, :_reduce_none, + 2, 109, :_reduce_34, + 2, 107, :_reduce_35, + 2, 106, :_reduce_36, + 6, 104, :_reduce_37, + 4, 104, :_reduce_38, + 6, 104, :_reduce_39, + 8, 104, :_reduce_40, + 1, 116, :_reduce_none, + 1, 116, :_reduce_none, + 5, 117, :_reduce_43, + 7, 118, :_reduce_44, + 1, 120, :_reduce_45, + 2, 102, :_reduce_46, + 2, 103, :_reduce_47, + 4, 121, :_reduce_48, + 5, 121, :_reduce_49, + 1, 122, :_reduce_50, + 3, 122, :_reduce_51, + 0, 122, :_reduce_52, + 1, 123, :_reduce_none, + 1, 123, :_reduce_none, + 1, 123, :_reduce_none, + 1, 123, :_reduce_none, + 1, 126, :_reduce_57, + 2, 127, :_reduce_58, + 4, 127, :_reduce_59, + 8, 127, :_reduce_60, + 1, 113, :_reduce_none, + 1, 113, :_reduce_none, + 2, 129, :_reduce_63, + 5, 98, :_reduce_64, + 5, 98, :_reduce_65, + 10, 100, :_reduce_66, + 4, 101, :_reduce_67, + 1, 131, :_reduce_none, + 1, 131, :_reduce_none, + 4, 94, :_reduce_70, + 6, 105, :_reduce_71, + 1, 133, :_reduce_72, + 2, 133, :_reduce_73, + 5, 135, :_reduce_74, + 1, 136, :_reduce_none, + 1, 136, :_reduce_none, + 4, 134, :_reduce_77, + 0, 134, :_reduce_none, + 1, 137, :_reduce_none, + 1, 137, :_reduce_none, + 1, 99, :_reduce_none, + 3, 99, :_reduce_82, + 3, 99, :_reduce_83, + 1, 138, :_reduce_none, + 1, 138, :_reduce_none, + 1, 138, :_reduce_none, + 1, 138, :_reduce_none, + 2, 130, :_reduce_88, + 0, 130, :_reduce_89, + 8, 95, :_reduce_90, + 1, 140, :_reduce_91, + 2, 140, :_reduce_92, + 6, 141, :_reduce_93, + 6, 141, :_reduce_94, + 6, 141, :_reduce_95, + 8, 141, :_reduce_96, + 7, 141, :_reduce_97, + 1, 143, :_reduce_none, + 1, 143, :_reduce_none, + 2, 143, :_reduce_100, + 2, 146, :_reduce_101, + 0, 146, :_reduce_none, + 1, 114, :_reduce_none, + 1, 114, :_reduce_none, + 1, 145, :_reduce_none, + 1, 145, :_reduce_none, + 1, 144, :_reduce_none, + 1, 144, :_reduce_none, + 3, 142, :_reduce_109, + 1, 142, :_reduce_110, + 1, 96, :_reduce_111, + 3, 93, :_reduce_112, + 3, 139, :_reduce_113, + 4, 139, :_reduce_114, + 4, 139, :_reduce_115, + 1, 125, :_reduce_none, + 1, 125, :_reduce_none, + 1, 148, :_reduce_118, + 2, 148, :_reduce_119, + 2, 149, :_reduce_120, + 1, 150, :_reduce_121, + 2, 150, :_reduce_122, + 3, 152, :_reduce_123, + 6, 152, :_reduce_124, + 1, 151, :_reduce_125, + 2, 151, :_reduce_126, + 3, 153, :_reduce_127, + 1, 115, :_reduce_none, + 1, 115, :_reduce_none, + 1, 154, :_reduce_130, + 1, 154, :_reduce_none, + 2, 154, :_reduce_132, + 3, 155, :_reduce_133, + 1, 157, :_reduce_134, + 1, 157, :_reduce_135, + 1, 157, :_reduce_136, + 1, 157, :_reduce_137, + 1, 157, :_reduce_138, + 1, 157, :_reduce_139, + 1, 157, :_reduce_140, + 1, 157, :_reduce_141, + 1, 157, :_reduce_142, + 1, 157, :_reduce_143, + 1, 157, :_reduce_144, + 1, 157, :_reduce_145, + 1, 157, :_reduce_146, + 1, 157, :_reduce_147, + 1, 156, :_reduce_none, + 1, 156, :_reduce_none, + 1, 156, :_reduce_none, + 1, 156, :_reduce_none, + 1, 156, :_reduce_none, + 3, 159, :_reduce_153, + 6, 128, :_reduce_154, + 2, 158, :_reduce_155, + 2, 158, :_reduce_156, + 1, 160, :_reduce_157, + 1, 124, :_reduce_none, + 1, 124, :_reduce_159, + 1, 132, :_reduce_160, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 1, 147, :_reduce_none, + 4, 170, :_reduce_173, + 4, 169, :_reduce_174, + 4, 168, :_reduce_175, + 4, 167, :_reduce_176, + 4, 166, :_reduce_177, + 4, 165, :_reduce_178, + 4, 161, :_reduce_179, + 4, 164, :_reduce_180, + 4, 162, :_reduce_181, + 4, 163, :_reduce_182, + 1, 97, :_reduce_183, + 1, 92, :_reduce_184, + 1, 89, :_reduce_185, + 2, 89, :_reduce_186, + 1, 89, :_reduce_none, + 0, 89, :_reduce_none, + 1, 119, :_reduce_189, + 0, 119, :_reduce_none, + 5, 108, :_reduce_191, + 1, 171, :_reduce_none, + 5, 172, :_reduce_193, + 3, 172, :_reduce_194, + 1, 173, :_reduce_195, + 4, 173, :_reduce_196, + 3, 174, :_reduce_197, + 1, 175, :_reduce_none, + 1, 175, :_reduce_none, + 1, 175, :_reduce_none, + 2, 175, :_reduce_201, + 2, 175, :_reduce_202, + 1, 175, :_reduce_203, + 1, 177, :_reduce_none, + 0, 177, :_reduce_none, + 5, 176, :_reduce_206, + 1, 178, :_reduce_207, + 4, 178, :_reduce_208, + 1, 179, :_reduce_none ] + +racc_reduce_n = 210 + +racc_shift_n = 393 + +racc_token_table = { + false => 0, + :error => 1, + :ASSIGN => 2, + :AT_SYM => 3, + :COMMENT => 4, + :JUMP => 5, + :IO_METHOD => 6, + :INPUT => 7, + :OUTPUT => 8, + :NUMREG => 9, + :POSREG => 10, + :VREG => 11, + :SREG => 12, + :TIME_SEGMENT => 13, + :ARG => 14, + :UALM => 15, + :MOVE => 16, + :DOT => 17, + :TO => 18, + :AT => 19, + :TERM => 20, + :OFFSET => 21, + :SKIP => 22, + :GROUP => 23, + :SEMICOLON => 24, + :NEWLINE => 25, + :STRING => 26, + :REAL => 27, + :DIGIT => 28, + :WORD => 29, + :EQUAL => 30, + :EEQUAL => 31, + :NOTEQUAL => 32, + :GTE => 33, + :LTE => 34, + :LT => 35, + :GT => 36, + :BANG => 37, + :PLUS => 38, + :MINUS => 39, + :STAR => 40, + :SLASH => 41, + :DIV => 42, + :AND => 43, + :OR => 44, + :MOD => 45, + :IF => 46, + :ELSE => 47, + :END => 48, + :UNLESS => 49, + :FOR => 50, + :IN => 51, + :WHILE => 52, + :WAIT_FOR => 53, + :WAIT_UNTIL => 54, + :TIMEOUT => 55, + :AFTER => 56, + :FANUC_USE => 57, + :SET_SKIP_CONDITION => 58, + :NAMESPACE => 59, + :CASE => 60, + :WHEN => 61, + :INDIRECT => 62, + :POSITION => 63, + :EVAL => 64, + :TIMER => 65, + :TIMER_METHOD => 66, + :RAISE => 67, + :ABORT => 68, + :POSITION_DATA => 69, + :TRUE_FALSE => 70, + :RUN => 71, + :TP_HEADER => 72, + :PAUSE => 73, + :LPAREN => 74, + :RPAREN => 75, + :COLON => 76, + :COMMA => 77, + :LBRACK => 78, + :RBRACK => 79, + :LBRACE => 80, + :RBRACE => 81, + :LABEL => 82, + :ADDRESS => 83, + :false => 84 } + +racc_nt_base = 85 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "ASSIGN", + "AT_SYM", + "COMMENT", + "JUMP", + "IO_METHOD", + "INPUT", + "OUTPUT", + "NUMREG", + "POSREG", + "VREG", + "SREG", + "TIME_SEGMENT", + "ARG", + "UALM", + "MOVE", + "DOT", + "TO", + "AT", + "TERM", + "OFFSET", + "SKIP", + "GROUP", + "SEMICOLON", + "NEWLINE", + "STRING", + "REAL", + "DIGIT", + "WORD", + "EQUAL", + "EEQUAL", + "NOTEQUAL", + "GTE", + "LTE", + "LT", + "GT", + "BANG", + "PLUS", + "MINUS", + "STAR", + "SLASH", + "DIV", + "AND", + "OR", + "MOD", + "IF", + "ELSE", + "END", + "UNLESS", + "FOR", + "IN", + "WHILE", + "WAIT_FOR", + "WAIT_UNTIL", + "TIMEOUT", + "AFTER", + "FANUC_USE", + "SET_SKIP_CONDITION", + "NAMESPACE", + "CASE", + "WHEN", + "INDIRECT", + "POSITION", + "EVAL", + "TIMER", + "TIMER_METHOD", + "RAISE", + "ABORT", + "POSITION_DATA", + "TRUE_FALSE", + "RUN", + "TP_HEADER", + "PAUSE", + "LPAREN", + "RPAREN", + "COLON", + "COMMA", + "LBRACK", + "RBRACK", + "LBRACE", + "RBRACE", + "LABEL", + "ADDRESS", + "false", + "$start", + "program", + "statements", + "statement", + "terminator", + "block", + "optional_newline", + "comment", + "definition", + "namespace", + "motion_statement", + "label_definition", + "address", + "conditional", + "inline_conditional", + "forloop", + "while_loop", + "use_statement", + "set_skip_statement", + "wait_statement", + "case_statement", + "fanuc_eval", + "timer_method", + "position_data", + "raise", + "tp_header_definition", + "empty_stmt", + "tp_header_value", + "var_or_indirect", + "indirectable", + "expression", + "wait_modifier", + "timeout_modifier", + "after_modifier", + "swallow_newlines", + "label", + "program_call", + "args", + "arg", + "number", + "var", + "string", + "io_method", + "indirect_thing", + "jump", + "else_block", + "minmax_val", + "integer", + "case_conditions", + "case_else", + "case_condition", + "case_allowed_condition", + "case_allowed_statement", + "inlineable", + "assignment", + "motion_modifiers", + "motion_modifier", + "speed", + "valid_terminations", + "time", + "time_seg_actions", + "optional_lpos_arg", + "definable", + "var_without_namespaces", + "var_with_namespaces", + "var_method_modifiers", + "namespaces", + "var_method_modifier", + "ns", + "unary_expression", + "binary_expression", + "factor", + "operator", + "signed_number", + "paren_expr", + "sign", + "numreg", + "output", + "input", + "posreg", + "position", + "vreg", + "argument", + "timer", + "ualm", + "sreg", + "sn", + "hash", + "hash_attributes", + "hash_attribute", + "hash_value", + "array", + "optional_sign", + "array_values", + "array_value" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 35) + def _reduce_1(val, _values, result) + @interpreter.nodes = val[0] + result + end +.,., + +# reduce 2 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 42) + def _reduce_3(val, _values, result) + result = [val[0]] + result << val[1] unless val[1].nil? + + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 46) + def _reduce_4(val, _values, result) + result = val[0] << val[1] + result << val[2] unless val[2].nil? + + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 52) + def _reduce_5(val, _values, result) + result = val[1] + result + end +.,., + +# reduce 6 omitted + +# reduce 7 omitted + +# reduce 8 omitted + +# reduce 9 omitted + +# reduce 10 omitted + +# reduce 11 omitted + +# reduce 12 omitted + +# reduce 13 omitted + +# reduce 14 omitted + +# reduce 15 omitted + +# reduce 16 omitted + +# reduce 17 omitted + +# reduce 18 omitted + +# reduce 19 omitted + +# reduce 20 omitted + +# reduce 21 omitted + +# reduce 22 omitted + +# reduce 23 omitted + +# reduce 24 omitted + +# reduce 25 omitted + +# reduce 26 omitted + +# reduce 27 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 85) + def _reduce_28(val, _values, result) + result = PauseNode.new + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 86) + def _reduce_29(val, _values, result) + result = AbortNode.new + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 90) + def _reduce_30(val, _values, result) + result = EmptyStmtNode.new() + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 94) + def _reduce_31(val, _values, result) + result = HeaderNode.new(val[0],val[2]) + result + end +.,., + +# reduce 32 omitted + +# reduce 33 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 103) + def _reduce_34(val, _values, result) + result = RaiseNode.new(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 107) + def _reduce_35(val, _values, result) + result = TimerMethodNode.new(val[0],val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 111) + def _reduce_36(val, _values, result) + result = EvalNode.new(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 116) + def _reduce_37(val, _values, result) + result = WaitForNode.new(val[2], val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 118) + def _reduce_38(val, _values, result) + result = WaitUntilNode.new(val[2], nil) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 120) + def _reduce_39(val, _values, result) + result = WaitUntilNode.new(val[2],val[5]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 122) + def _reduce_40(val, _values, result) + result = WaitUntilNode.new(val[2],val[5].merge(val[7])) + result + end +.,., + +# reduce 41 omitted + +# reduce 42 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 132) + def _reduce_43(val, _values, result) + result = { label: val[3] } + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 137) + def _reduce_44(val, _values, result) + result = { timeout: [val[3],val[5]] } + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 141) + def _reduce_45(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 145) + def _reduce_46(val, _values, result) + result = UseNode.new(val[0],val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 150) + def _reduce_47(val, _values, result) + result = SetSkipNode.new(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 154) + def _reduce_48(val, _values, result) + result = CallNode.new(val[0],val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 155) + def _reduce_49(val, _values, result) + result = CallNode.new(val[1],val[3],async: true) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 159) + def _reduce_50(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 160) + def _reduce_51(val, _values, result) + result = val[0] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 161) + def _reduce_52(val, _values, result) + result = [] + result + end +.,., + +# reduce 53 omitted + +# reduce 54 omitted + +# reduce 55 omitted + +# reduce 56 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 172) + def _reduce_57(val, _values, result) + result = StringNode.new(val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 176) + def _reduce_58(val, _values, result) + result = IOMethodNode.new(val[0],val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 178) + def _reduce_59(val, _values, result) + result = IOMethodNode.new(val[0],val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 180) + def _reduce_60(val, _values, result) + result = IOMethodNode.new(val[0],val[2],{ pulse_time: val[4], pulse_units: val[6] }) + result + end +.,., + +# reduce 61 omitted + +# reduce 62 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 190) + def _reduce_63(val, _values, result) + result = JumpNode.new(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 195) + def _reduce_64(val, _values, result) + result = ConditionalNode.new("if",val[1],val[2],val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 197) + def _reduce_65(val, _values, result) + result = ConditionalNode.new("unless",val[1],val[2],val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 202) + def _reduce_66(val, _values, result) + result = ForNode.new(val[1],val[4],val[6],val[8]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 206) + def _reduce_67(val, _values, result) + result = WhileNode.new(val[1],val[2]) + result + end +.,., + +# reduce 68 omitted + +# reduce 69 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 215) + def _reduce_70(val, _values, result) + result = NamespaceNode.new(val[1],val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 222) + def _reduce_71(val, _values, result) + result = CaseNode.new(val[1],val[3],val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 226) + def _reduce_72(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 228) + def _reduce_73(val, _values, result) + result = val[0] << val[1] << val[2] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 233) + def _reduce_74(val, _values, result) + result = CaseConditionNode.new(val[1],val[3]) + result + end +.,., + +# reduce 75 omitted + +# reduce 76 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 243) + def _reduce_77(val, _values, result) + result = CaseConditionNode.new(nil,val[2]) + result + end +.,., + +# reduce 78 omitted + +# reduce 79 omitted + +# reduce 80 omitted + +# reduce 81 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 254) + def _reduce_82(val, _values, result) + result = InlineConditionalNode.new(val[1], val[2], val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 255) + def _reduce_83(val, _values, result) + result = InlineConditionalNode.new(val[1], val[2], val[0]) + result + end +.,., + +# reduce 84 omitted + +# reduce 85 omitted + +# reduce 86 omitted + +# reduce 87 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 266) + def _reduce_88(val, _values, result) + result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 267) + def _reduce_89(val, _values, result) + result = [] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 272) + def _reduce_90(val, _values, result) + result = MotionNode.new(val[0],val[5],val[7]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 276) + def _reduce_91(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 278) + def _reduce_92(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 283) + def _reduce_93(val, _values, result) + result = SpeedNode.new(val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 285) + def _reduce_94(val, _values, result) + result = TerminationNode.new(val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 287) + def _reduce_95(val, _values, result) + result = OffsetNode.new(val[2],val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 289) + def _reduce_96(val, _values, result) + result = TimeNode.new(val[2],val[4],val[6]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 291) + def _reduce_97(val, _values, result) + result = SkipNode.new(val[4],val[5]) + result + end +.,., + +# reduce 98 omitted + +# reduce 99 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 298) + def _reduce_100(val, _values, result) + raise Racc::ParseError, sprintf("\ninvalid termination type: (%s)", val[1]) if val[1] != 1 + + result = DigitNode.new(val[1].to_i * -1) + + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 305) + def _reduce_101(val, _values, result) + result = val[1] + result + end +.,., + +# reduce 102 omitted + +# reduce 103 omitted + +# reduce 104 omitted + +# reduce 105 omitted + +# reduce 106 omitted + +# reduce 107 omitted + +# reduce 108 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 325) + def _reduce_109(val, _values, result) + result = { speed: val[0], units: val[2] } + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 326) + def _reduce_110(val, _values, result) + result = { speed: val[0], units: nil } + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 330) + def _reduce_111(val, _values, result) + result = LabelDefinitionNode.new(val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 334) + def _reduce_112(val, _values, result) + result = DefinitionNode.new(val[0],val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 338) + def _reduce_113(val, _values, result) + result = AssignmentNode.new(val[0],val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 339) + def _reduce_114(val, _values, result) + result = AssignmentNode.new( + val[0], + ExpressionNode.new(val[0],"+",val[3]) + ) + + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 344) + def _reduce_115(val, _values, result) + result = AssignmentNode.new( + val[0], + ExpressionNode.new(val[0],"-",val[3]) + ) + + result + end +.,., + +# reduce 116 omitted + +# reduce 117 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 357) + def _reduce_118(val, _values, result) + result = VarNode.new(val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 358) + def _reduce_119(val, _values, result) + result = VarMethodNode.new(val[0],val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 363) + def _reduce_120(val, _values, result) + result = NamespacedVarNode.new(val[0],val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 367) + def _reduce_121(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 369) + def _reduce_122(val, _values, result) + result = val[0].merge(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 373) + def _reduce_123(val, _values, result) + result = { method: val[2] } + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 375) + def _reduce_124(val, _values, result) + result = { group: val[4] } + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 379) + def _reduce_125(val, _values, result) + result = [val[0]] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 380) + def _reduce_126(val, _values, result) + result = val[0] << val[1] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 384) + def _reduce_127(val, _values, result) + result = val[0] + result + end +.,., + +# reduce 128 omitted + +# reduce 129 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 394) + def _reduce_130(val, _values, result) + result = val[0] + result + end +.,., + +# reduce 131 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 396) + def _reduce_132(val, _values, result) + result = ExpressionNode.new(val[1], "!", nil) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 401) + def _reduce_133(val, _values, result) + result = ExpressionNode.new(val[0], val[1], val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 405) + def _reduce_134(val, _values, result) + result = "==" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 406) + def _reduce_135(val, _values, result) + result = "<>" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 407) + def _reduce_136(val, _values, result) + result = "<" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 408) + def _reduce_137(val, _values, result) + result = ">" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 409) + def _reduce_138(val, _values, result) + result = ">=" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 410) + def _reduce_139(val, _values, result) + result = "<=" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 411) + def _reduce_140(val, _values, result) + result = "+" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 412) + def _reduce_141(val, _values, result) + result = "-" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 413) + def _reduce_142(val, _values, result) + result = "||" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 414) + def _reduce_143(val, _values, result) + result = "*" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 415) + def _reduce_144(val, _values, result) + result = "/" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 416) + def _reduce_145(val, _values, result) + result = "DIV" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 417) + def _reduce_146(val, _values, result) + result = "%" + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 418) + def _reduce_147(val, _values, result) + result = "&&" + result + end +.,., + +# reduce 148 omitted + +# reduce 149 omitted + +# reduce 150 omitted + +# reduce 151 omitted + +# reduce 152 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 430) + def _reduce_153(val, _values, result) + result = ParenExpressionNode.new(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 435) + def _reduce_154(val, _values, result) + result = IndirectNode.new(val[2].to_sym, val[4]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 440) + def _reduce_155(val, _values, result) + val[1] = val[1].to_i * -1 if val[0] == "-" + result = DigitNode.new(val[1]) + + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 443) + def _reduce_156(val, _values, result) + val[1] = val[1].to_f * -1 if val[0] == "-"; result = RealNode.new(val[1]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 447) + def _reduce_157(val, _values, result) + result = "-" + result + end +.,., + +# reduce 158 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 452) + def _reduce_159(val, _values, result) + result = RealNode.new(val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 456) + def _reduce_160(val, _values, result) + result = DigitNode.new(val[0]) + result + end +.,., + +# reduce 161 omitted + +# reduce 162 omitted + +# reduce 163 omitted + +# reduce 164 omitted + +# reduce 165 omitted + +# reduce 166 omitted + +# reduce 167 omitted + +# reduce 168 omitted + +# reduce 169 omitted + +# reduce 170 omitted + +# reduce 171 omitted + +# reduce 172 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 476) + def _reduce_173(val, _values, result) + result = StringRegisterNode.new(val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 480) + def _reduce_174(val, _values, result) + result = UserAlarmNode.new(val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 484) + def _reduce_175(val, _values, result) + result = TimerNode.new(val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 488) + def _reduce_176(val, _values, result) + result = ArgumentNode.new(val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 492) + def _reduce_177(val, _values, result) + result = VisionRegisterNode.new(val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 496) + def _reduce_178(val, _values, result) + result = PositionNode.new(val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 500) + def _reduce_179(val, _values, result) + result = NumregNode.new(val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 504) + def _reduce_180(val, _values, result) + result = PosregNode.new(val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 508) + def _reduce_181(val, _values, result) + result = IONode.new(val[0], val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 512) + def _reduce_182(val, _values, result) + result = IONode.new(val[0], val[2].to_i) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 516) + def _reduce_183(val, _values, result) + result = AddressNode.new(val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 520) + def _reduce_184(val, _values, result) + result = CommentNode.new(val[0]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 524) + def _reduce_185(val, _values, result) + result = TerminatorNode.new + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 525) + def _reduce_186(val, _values, result) + result = val[0] + result + end +.,., + +# reduce 187 omitted + +# reduce 188 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 532) + def _reduce_189(val, _values, result) + result = TerminatorNode.new + result + end +.,., + +# reduce 190 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 538) + def _reduce_191(val, _values, result) + result = PositionDataNode.new(val[2]) + result + end +.,., + +# reduce 192 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 546) + def _reduce_193(val, _values, result) + result = val[2] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 547) + def _reduce_194(val, _values, result) + result = {} + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 551) + def _reduce_195(val, _values, result) + result = val[0] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 553) + def _reduce_196(val, _values, result) + result = val[0].merge(val[3]) + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 557) + def _reduce_197(val, _values, result) + result = { val[0].to_sym => val[2] } + result + end +.,., + +# reduce 198 omitted + +# reduce 199 omitted + +# reduce 200 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 564) + def _reduce_201(val, _values, result) + val[1] = val[1].to_i * -1 if val[0] == "-"; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 565) + def _reduce_202(val, _values, result) + val[1] = val[1].to_f * -1 if val[0] == "-"; result = val[1] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 566) + def _reduce_203(val, _values, result) + result = val[0] == "true" + result + end +.,., + +# reduce 204 omitted + +# reduce 205 omitted + +module_eval(<<'.,.,', 'tp_plus.y', 575) + def _reduce_206(val, _values, result) + result = val[2] + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 579) + def _reduce_207(val, _values, result) + result = val + result + end +.,., + +module_eval(<<'.,.,', 'tp_plus.y', 580) + def _reduce_208(val, _values, result) + result = val[0] << val[3] + result + end +.,., + +# reduce 209 omitted + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module TPPlus diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/twowaysql b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/twowaysql new file mode 100644 index 000000000000..219f1a8b04dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/regress/twowaysql @@ -0,0 +1,556 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.5.0 +# from Racc grammar file "". +# + +require 'racc/parser.rb' +module TwoWaySQL + class Parser < Racc::Parser + +module_eval(<<'...end twowaysql.y/module_eval...', 'twowaysql.y', 148) + +require 'strscan' + +def initialize(opts={}) + opts = { + :debug => false, + :preserve_space => true, + :preserve_comment => false + }.merge(opts) + @yydebug = opts[:debug] + @preserve_space = opts[:preserve_space] + @preserve_comment = opts[:preserve_comment] + @num_questions = 0 +end + + +PAREN_EXAMPLE = '\([^\)]+\)' +BEGIN_BIND_VARIABLE = '(\/|\#)\*([^\*]+)\*\1' +BIND_VARIABLE_PATTERN = /\A#{BEGIN_BIND_VARIABLE}\s*/ +PAREN_BIND_VARIABLE_PATTERN = /\A#{BEGIN_BIND_VARIABLE}\s*#{PAREN_EXAMPLE}/ +EMBED_VARIABLE_PATTERN = /\A(\/|\#)\*\$([^\*]+)\*\1\s*/ + +CONDITIONAL_PATTERN = /\A(\/|\#)\*(IF)\s+([^\*]+)\s*\*\1/ +BEGIN_END_PATTERN = /\A(\/|\#)\*(BEGIN|END)\s*\*\1/ +STRING_LITERAL_PATTERN = /\A(\'(?:[^\']+|\'\')*\')/ ## quoted string +SPLIT_TOKEN_PATTERN = /\A(\S+?)(?=\s*(?:(?:\/|\#)\*|-{2,}|\(|\)|\,))/ ## stop on delimiters --,/*,#*,',',(,) +LITERAL_PATTERN = /\A([^;\s]+)/ +SPACES_PATTERN = /\A(\s+)/ +QUESTION_PATTERN = /\A\?/ +COMMA_PATTERN = /\A\,/ +LPAREN_PATTERN = /\A\(/ +RPAREN_PATTERN = /\A\)/ +ACTUAL_COMMENT_PATTERN = /\A(\/|\#)\*(\s{1,}(?:.*?))\*\1/m ## start with spaces +SEMICOLON_AT_INPUT_END_PATTERN = /\A\;\s*\Z/ +UNMATCHED_COMMENT_START_PATTERN = /\A(?:(?:\/|\#)\*)/ + +#TODO: remove trailing spaces for S2Dao compatibility, but this spec sometimes causes SQL bugs... +ELSE_PATTERN = /\A\-{2,}\s*ELSE\s*/ +AND_PATTERN = /\A(\ *AND)\b/i +OR_PATTERN = /\A(\ *OR)\b/i + + +def parse( io ) + @q = [] + io.each_line(nil) do |whole| + @s = StringScanner.new(whole) + end + scan_str + + # @q.push [ false, nil ] + @q.push [ false, [@s.pos, nil] ] + + ## call racc's private parse method + do_parse +end + + +## called by racc +def next_token + @q.shift +end + + +def scan_str + until @s.eos? do + case + when @s.scan(AND_PATTERN) + @q.push [ :AND, [@s.pos, @s[1]] ] + when @s.scan(OR_PATTERN) + @q.push [ :OR, [@s.pos, @s[1]] ] + when @s.scan(SPACES_PATTERN) + @q.push [ :SPACES, [@s.pos, @s[1]] ] + when @s.scan(QUESTION_PATTERN) + @q.push [ :QUESTION, [@s.pos, nil] ] + when @s.scan(COMMA_PATTERN) + @q.push [ :COMMA, [@s.pos, ','] ] + when @s.scan(LPAREN_PATTERN) + @q.push [ :LPAREN, [@s.pos, '('] ] + when @s.scan(RPAREN_PATTERN) + @q.push [ :RPAREN, [@s.pos, ')'] ] + when @s.scan(ELSE_PATTERN) + @q.push [ :ELSE, [@s.pos, nil] ] + when @s.scan(ACTUAL_COMMENT_PATTERN) + @q.push [ :ACTUAL_COMMENT, [@s.pos, @s[1], @s[2]] ] if @preserve_comment + when @s.scan(BEGIN_END_PATTERN) + @q.push [ @s[2].intern, [@s.pos, nil] ] + when @s.scan(CONDITIONAL_PATTERN) + @q.push [ @s[2].intern, [@s.pos, @s[3]] ] + when @s.scan(EMBED_VARIABLE_PATTERN) + @q.push [ :EMBED_VARIABLE, [@s.pos, @s[2]] ] + when @s.scan(PAREN_BIND_VARIABLE_PATTERN) + @q.push [ :PAREN_BIND_VARIABLE, [@s.pos, @s[2]] ] + when @s.scan(BIND_VARIABLE_PATTERN) + @q.push [ :BIND_VARIABLE, [@s.pos, @s[2]] ] + when @s.scan(STRING_LITERAL_PATTERN) + @q.push [ :STRING_LITERAL, [@s.pos, @s[1]] ] + when @s.scan(SPLIT_TOKEN_PATTERN) + @q.push [ :IDENT, [@s.pos, @s[1]] ] + when @s.scan(UNMATCHED_COMMENT_START_PATTERN) ## unmatched comment start, '/*','#*' + raise Racc::ParseError, "unmatched comment. line:[#{line_no(@s.pos)}], str:[#{@s.rest}]" + when @s.scan(LITERAL_PATTERN) ## other string token + @q.push [ :IDENT, [@s.pos, @s[1]] ] + when @s.scan(SEMICOLON_AT_INPUT_END_PATTERN) + #drop semicolon at input end + else + raise Racc::ParseError, "syntax error at or near line:[#{line_no(@s.pos)}], str:[#{@s.rest}]" + end + end +end + + +## override racc's default on_error method +def on_error(t, v, vstack) + ## cursor in value-stack is an array of two items, + ## that have position value as 0th item. like [731, "ctx[:limit] "] + cursor = vstack.find do |tokens| + tokens.size == 2 and tokens[0].kind_of?(Fixnum) + end + pos = cursor[0] + line = line_no(pos) + rest = @s.string[pos .. -1] + raise Racc::ParseError, "syntax error at or near line:[#{line}], str:[#{rest}]" +end + + +def line_no(pos) + lines = 0 + scanned = @s.string[0..(pos)] + scanned.each_line { lines += 1 } + lines +end +...end twowaysql.y/module_eval... +##### State transition tables begin ### + +racc_action_table = [ + 8, 36, 9, 37, 12, 13, 10, 11, 14, 15, + 16, 17, 18, 19, 22, 23, 24, 8, 38, 9, + 3, 12, 13, 10, 11, 14, 15, 16, 17, 18, + 19, 22, 23, 24, 8, 25, 9, 40, 12, 13, + 10, 11, 14, 15, 16, 17, 18, 19, 22, 23, + 24, 8, 45, 9, 46, 12, 13, 10, 11, 14, + 15, 16, 17, 18, 19, 22, 23, 24, 8, nil, + 9, nil, 12, 13, 10, 11, 14, 15, 16, 17, + 18, 19, 22, 23, 24, 35, 33, 34, 31, 32, + 44, 43, 31, 32 ] + +racc_action_check = [ + 2, 24, 2, 24, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 26, 26, 26, + 1, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 27, 3, 27, 28, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 41, 37, 41, 39, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 42, nil, + 42, nil, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 22, 22, 22, 9, 9, + 34, 34, 40, 40 ] + +racc_action_pointer = [ + nil, 20, -2, 35, nil, nil, nil, nil, nil, 82, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 77, nil, -7, nil, 15, 32, 32, nil, + nil, nil, nil, nil, 82, nil, nil, 44, nil, 51, + 86, 49, 66, nil, nil, nil, nil, nil ] + +racc_action_default = [ + -2, -35, -1, -35, -3, -4, -5, -6, -2, -2, + -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, + -26, -27, -35, -32, -35, 48, -35, -13, -10, -11, + -12, -2, -2, -28, -35, -30, -33, -35, -7, -35, + -2, -14, -15, -29, -31, -34, -8, -9 ] + +racc_goto_table = [ + 2, 1, 28, 39, nil, nil, nil, nil, 26, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 41, 42, 47 ] + +racc_goto_check = [ + 2, 1, 7, 8, nil, nil, nil, nil, 2, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 2, 2, 7 ] + +racc_goto_pointer = [ + nil, 1, 0, nil, nil, nil, nil, -7, -25, nil, + nil, nil, nil ] + +racc_goto_default = [ + nil, nil, 27, 4, 5, 6, 7, nil, nil, 29, + 30, 20, 21 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 20, :_reduce_1, + 0, 21, :_reduce_2, + 2, 21, :_reduce_3, + 1, 22, :_reduce_none, + 1, 22, :_reduce_none, + 1, 22, :_reduce_none, + 3, 25, :_reduce_7, + 4, 24, :_reduce_8, + 2, 27, :_reduce_9, + 0, 27, :_reduce_10, + 1, 26, :_reduce_none, + 1, 26, :_reduce_none, + 1, 26, :_reduce_none, + 2, 28, :_reduce_14, + 2, 29, :_reduce_15, + 1, 23, :_reduce_16, + 1, 23, :_reduce_17, + 1, 23, :_reduce_18, + 1, 23, :_reduce_19, + 1, 23, :_reduce_20, + 1, 23, :_reduce_21, + 1, 23, :_reduce_22, + 1, 23, :_reduce_23, + 1, 23, :_reduce_24, + 1, 23, :_reduce_25, + 1, 23, :_reduce_none, + 1, 23, :_reduce_none, + 2, 30, :_reduce_28, + 3, 30, :_reduce_29, + 2, 30, :_reduce_30, + 3, 30, :_reduce_31, + 1, 30, :_reduce_32, + 2, 31, :_reduce_33, + 3, 31, :_reduce_34 ] + +racc_reduce_n = 35 + +racc_shift_n = 48 + +racc_token_table = { + false => 0, + :error => 1, + :BEGIN => 2, + :END => 3, + :IF => 4, + :ELSE => 5, + :AND => 6, + :OR => 7, + :IDENT => 8, + :STRING_LITERAL => 9, + :SPACES => 10, + :COMMA => 11, + :LPAREN => 12, + :RPAREN => 13, + :QUESTION => 14, + :ACTUAL_COMMENT => 15, + :BIND_VARIABLE => 16, + :PAREN_BIND_VARIABLE => 17, + :EMBED_VARIABLE => 18 } + +racc_nt_base = 19 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "BEGIN", + "END", + "IF", + "ELSE", + "AND", + "OR", + "IDENT", + "STRING_LITERAL", + "SPACES", + "COMMA", + "LPAREN", + "RPAREN", + "QUESTION", + "ACTUAL_COMMENT", + "BIND_VARIABLE", + "PAREN_BIND_VARIABLE", + "EMBED_VARIABLE", + "$start", + "sql", + "stmt_list", + "stmt", + "primary", + "if_stmt", + "begin_stmt", + "sub_stmt", + "else_stmt", + "and_stmt", + "or_stmt", + "bind_var", + "embed_var" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +module_eval(<<'.,.,', 'twowaysql.y', 20) + def _reduce_1(val, _values, result) + result = RootNode.new( val[0] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 25) + def _reduce_2(val, _values, result) + result = [] + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 29) + def _reduce_3(val, _values, result) + result.push val[1] + + result + end +.,., + +# reduce 4 omitted + +# reduce 5 omitted + +# reduce 6 omitted + +module_eval(<<'.,.,', 'twowaysql.y', 38) + def _reduce_7(val, _values, result) + result = BeginNode.new( val[1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 43) + def _reduce_8(val, _values, result) + result = IfNode.new( val[0][1], val[1], val[2] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 48) + def _reduce_9(val, _values, result) + result = val[1] + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 52) + def _reduce_10(val, _values, result) + result = nil + + result + end +.,., + +# reduce 11 omitted + +# reduce 12 omitted + +# reduce 13 omitted + +module_eval(<<'.,.,', 'twowaysql.y', 61) + def _reduce_14(val, _values, result) + result = SubStatementNode.new( val[0][1], val[1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 66) + def _reduce_15(val, _values, result) + result = SubStatementNode.new( val[0][1], val[1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 71) + def _reduce_16(val, _values, result) + result = LiteralNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 75) + def _reduce_17(val, _values, result) + result = LiteralNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 79) + def _reduce_18(val, _values, result) + result = LiteralNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 83) + def _reduce_19(val, _values, result) + result = LiteralNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 87) + def _reduce_20(val, _values, result) + result = WhiteSpaceNode.new( val[0][1], @preserve_space ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 91) + def _reduce_21(val, _values, result) + result = LiteralNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 95) + def _reduce_22(val, _values, result) + result = LiteralNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 99) + def _reduce_23(val, _values, result) + result = LiteralNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 103) + def _reduce_24(val, _values, result) + @num_questions += 1 + result = QuestionNode.new( @num_questions ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 108) + def _reduce_25(val, _values, result) + result = ActualCommentNode.new( val[0][1] , val[0][2] ) + + result + end +.,., + +# reduce 26 omitted + +# reduce 27 omitted + +module_eval(<<'.,.,', 'twowaysql.y', 115) + def _reduce_28(val, _values, result) + result = BindVariableNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 119) + def _reduce_29(val, _values, result) + result = BindVariableNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 123) + def _reduce_30(val, _values, result) + result = BindVariableNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 127) + def _reduce_31(val, _values, result) + result = BindVariableNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 131) + def _reduce_32(val, _values, result) + result = ParenBindVariableNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 136) + def _reduce_33(val, _values, result) + result = EmbedVariableNode.new( val[0][1] ) + + result + end +.,., + +module_eval(<<'.,.,', 'twowaysql.y', 140) + def _reduce_34(val, _values, result) + result = EmbedVariableNode.new( val[0][1] ) + + result + end +.,., + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser +end # module TwoWaySQL diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/brace b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/brace new file mode 100644 index 000000000000..f6c843853e0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/brace @@ -0,0 +1,7 @@ +{ { + } { } { + { { { } } } + { { { {} } } } + {} {} {} + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/gvar b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/gvar new file mode 100644 index 000000000000..50528ce97b10 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/gvar @@ -0,0 +1 @@ +{ $' $" $& $-a $/ $\ $( $1 $2 $3 $? $-i } diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/normal b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/normal new file mode 100644 index 000000000000..e7051315362a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/normal @@ -0,0 +1,4 @@ +{ + # comment + result = "string".match(/regexp/)[0] +} diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/percent b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/percent new file mode 100644 index 000000000000..fded9a385cd8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/percent @@ -0,0 +1,18 @@ +{ + 3 % 5 # mod + 3%5 # mod + 3% 5 # mod + i % 5 # mod + i%5 # mod + i% 5 # mod + call %{str} # string + call(%{str}) # string + %q{string} # string + %Q{string} # string + %r{string} # string + %w(array) # array + %x{array} # command string + %{string} # string + %_string_ # string + %/string/ # regexp +} diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/slash b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/slash new file mode 100644 index 000000000000..190135b3bd1f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/scandata/slash @@ -0,0 +1,10 @@ +{ + # here's many '/'s + i = 5/1 # div + re = /regex/ # regexp + i /= 5 # div + result = 5 / 1 # div + result = 5/ 1 # div + call(/regex/) # regexp + call /regex/ # regexp +} diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/src.intp b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/src.intp new file mode 100644 index 000000000000..4d2460e8edfb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/src.intp @@ -0,0 +1,34 @@ +def assert( no, cond ) + if cond then + else + raise( 'assert ' + to_s(no) + ' failed' ) + end +end + +assert( 1, concat(concat(concat('str=', 'a'), "b"), 'c') == 'str=abc' ) +assert( 2, 'operator' + ' ok' == 'operator ok' ) +assert( 3, 1 + 1 == 2 ) +assert( 4, 4 * 1 + 10 * 1 == 14 ) + +if true then + assert( 5, true ) +else + assert( 6, false ) +end + +i = 1 +while i == 1 do + i = false +end +assert( 7, i == false ) +assert( 8, nil == nil ) + +def func + assert( 9, true ) +end +func + +def argfunc( str ) + assert( 10, str == 'ok' ) +end +argfunc 'ok' diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/start.y b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/start.y new file mode 100644 index 000000000000..86296899b844 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/start.y @@ -0,0 +1,20 @@ +class S + +start st + +rule + +n: D { result = 'no' } +st : A B C n { result = 'ok' } + +end + +---- inner + + def parse + do_parse + end + +---- footer + +S.new.parse == 'ok' or raise 'start stmt not worked' diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_chk_y.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_chk_y.rb new file mode 100644 index 000000000000..bb8b6b4fe3d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_chk_y.rb @@ -0,0 +1,52 @@ +require File.expand_path(File.join(File.dirname(__FILE__), 'helper')) + +module Racc + class TestChkY < TestCase + def setup + super + file = File.join(ASSET_DIR, 'chk.y') + @debug_flags = Racc::DebugFlags.parse_option_string('o') + parser = Racc::GrammarFileParser.new(@debug_flags) + @result = parser.parse(File.read(file), File.basename(file)) + @states = Racc::States.new(@result.grammar).nfa + @states.dfa + end + + def test_compile_chk_y + generator = Racc::ParserFileGenerator.new(@states, @result.params.dup) + + # it generates valid ruby + assert Module.new { + self.instance_eval(generator.generate_parser, __FILE__, __LINE__) + } + + grammar = @states.grammar + + assert_equal 0, @states.n_srconflicts + assert_equal 0, @states.n_rrconflicts + assert_equal 0, grammar.n_useless_nonterminals + assert_equal 0, grammar.n_useless_rules + assert_nil grammar.n_expected_srconflicts + end + + def test_compile_chk_y_line_convert + params = @result.params.dup + params.convert_line_all = true + + generator = Racc::ParserFileGenerator.new(@states, @result.params.dup) + + # it generates valid ruby + assert Module.new { + self.instance_eval(generator.generate_parser, __FILE__, __LINE__) + } + + grammar = @states.grammar + + assert_equal 0, @states.n_srconflicts + assert_equal 0, @states.n_rrconflicts + assert_equal 0, grammar.n_useless_nonterminals + assert_equal 0, grammar.n_useless_rules + assert_nil grammar.n_expected_srconflicts + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_grammar_file_parser.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_grammar_file_parser.rb new file mode 100644 index 000000000000..b187bdcaec96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_grammar_file_parser.rb @@ -0,0 +1,15 @@ +require File.expand_path(File.join(File.dirname(__FILE__), 'helper')) + +module Racc + class TestGrammarFileParser < TestCase + def test_parse + file = File.join(ASSET_DIR, 'yyerr.y') + + debug_flags = Racc::DebugFlags.parse_option_string('o') + assert debug_flags.status_logging + + parser = Racc::GrammarFileParser.new(debug_flags) + parser.parse(File.read(file), File.basename(file)) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_racc_command.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_racc_command.rb new file mode 100644 index 000000000000..0d2c5829e4a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_racc_command.rb @@ -0,0 +1,339 @@ +require File.expand_path(File.join(File.dirname(__FILE__), 'helper')) + +module Racc + class TestRaccCommand < TestCase + def test_syntax_y + assert_compile 'syntax.y', '-v' + assert_debugfile 'syntax.y', [0,0,0,0,0] + end + + def test_percent_y + assert_compile 'percent.y' + assert_debugfile 'percent.y', [] + assert_exec 'percent.y' + end + + def test_scan_y + assert_compile 'scan.y' + assert_debugfile 'scan.y', [] + assert_exec 'scan.y' + end + + def test_newsyn_y + assert_compile 'newsyn.y' + assert_debugfile 'newsyn.y', [] + end + + def test_normal_y + assert_compile 'normal.y' + assert_debugfile 'normal.y', [] + + assert_compile 'normal.y', '-vg' + assert_debugfile 'normal.y', [] + end + + def test_chk_y + assert_compile 'chk.y', '-vg' + assert_debugfile 'chk.y', [] + assert_exec 'chk.y' + + assert_compile 'chk.y', '--line-convert-all' + assert_debugfile 'chk.y', [] + assert_exec 'chk.y' + end + + def test_echk_y + assert_compile 'echk.y', '-E' + assert_debugfile 'echk.y', [] + assert_exec 'echk.y' + end + + def test_err_y + assert_compile 'err.y' + assert_debugfile 'err.y', [] + assert_exec 'err.y' + end + + def test_mailp_y + assert_compile 'mailp.y' + assert_debugfile 'mailp.y', [] + end + + def test_conf_y + assert_compile 'conf.y', '-v' + assert_debugfile 'conf.y', [4,1,1,2] + end + + def test_rrconf_y + assert_compile 'rrconf.y' + assert_debugfile 'rrconf.y', [1,1,0,0] + end + + def test_useless_y + assert_compile 'useless.y' + assert_debugfile 'useless.y', [0,0,1,2] + end + + def test_opt_y + assert_compile 'opt.y' + assert_debugfile 'opt.y', [] + assert_exec 'opt.y' + end + + def test_yyerr_y + assert_compile 'yyerr.y' + assert_debugfile 'yyerr.y', [] + assert_exec 'yyerr.y' + end + + def test_recv_y + assert_compile 'recv.y' + assert_debugfile 'recv.y', [5,10,1,4] + end + + def test_ichk_y + assert_compile 'ichk.y' + assert_debugfile 'ichk.y', [] + assert_exec 'ichk.y' + end + + def test_intp_y + assert_compile 'intp.y' + assert_debugfile 'intp.y', [] + assert_exec 'intp.y' + end + + def test_expect_y + assert_compile 'expect.y' + assert_debugfile 'expect.y', [1,0,0,0,1] + end + + def test_nullbug1_y + assert_compile 'nullbug1.y' + assert_debugfile 'nullbug1.y', [0,0,0,0] + end + + def test_nullbug2_y + assert_compile 'nullbug2.y' + assert_debugfile 'nullbug2.y', [0,0,0,0] + end + + def test_firstline_y + assert_compile 'firstline.y' + assert_debugfile 'firstline.y', [] + end + + def test_nonass_y + assert_compile 'nonass.y' + assert_debugfile 'nonass.y', [] + assert_exec 'nonass.y' + end + + def test_digraph_y + assert_compile 'digraph.y' + assert_debugfile 'digraph.y', [] + assert_exec 'digraph.y' + end + + def test_noend_y + assert_compile 'noend.y' + assert_debugfile 'noend.y', [] + end + + def test_norule_y + assert_raise(Test::Unit::AssertionFailedError) { + assert_compile 'norule.y' + } + end + + def test_unterm_y + assert_raise(Test::Unit::AssertionFailedError) { + assert_compile 'unterm.y' + } + end + + # Regression test for a problem where error recovery at EOF would cause + # a Racc-generated parser to go into an infinite loop (on some grammars) + def test_error_recovery_y + assert_compile 'error_recovery.y' + Timeout.timeout(10) do + assert_exec 'error_recovery.y' + end + end + + # .y files from `parser` gem + + def test_ruby18 + assert_compile 'ruby18.y', [], timeout: 60 + assert_debugfile 'ruby18.y', [] + assert_output_unchanged 'ruby18.y' + end + + def test_ruby22 + assert_compile 'ruby22.y', [], timeout: 60 + assert_debugfile 'ruby22.y', [] + assert_output_unchanged 'ruby22.y' + end + + # .y file from csspool gem + + def test_csspool + assert_compile 'csspool.y' + assert_debugfile 'csspool.y', [5, 3] + assert_output_unchanged 'csspool.y' + end + + # .y file from opal gem + + def test_opal + assert_compile 'opal.y', [], timeout: 60 + assert_debugfile 'opal.y', [] + assert_output_unchanged 'opal.y' + end + + # .y file from journey gem + + def test_journey + assert_compile 'journey.y' + assert_debugfile 'journey.y', [] + assert_output_unchanged 'journey.y' + end + + # .y file from nokogiri gem + + def test_nokogiri_css + assert_compile 'nokogiri-css.y' + assert_debugfile 'nokogiri-css.y', [0, 1] + assert_output_unchanged 'nokogiri-css.y' + end + + # .y file from edtf-ruby gem + + def test_edtf + assert_compile 'edtf.y' + assert_debugfile 'edtf.y', [0, 0, 0, 0, 0] + assert_output_unchanged 'edtf.y' + end + + # .y file from namae gem + + def test_namae + assert_compile 'namae.y' + assert_debugfile 'namae.y', [0, 0, 0, 0, 0] + assert_output_unchanged 'namae.y' + end + + # .y file from liquor gem + + def test_liquor + assert_compile 'liquor.y' + assert_debugfile 'liquor.y', [0, 0, 0, 0, 15] + assert_output_unchanged 'liquor.y' + end + + # .y file from nasl gem + + def test_nasl + assert_compile 'nasl.y' + assert_debugfile 'nasl.y', [0, 0, 0, 0, 1] + assert_output_unchanged 'nasl.y' + end + + # .y file from riml gem + + def test_riml + assert_compile 'riml.y' + assert_debugfile 'riml.y', [289, 0, 0, 0] + assert_output_unchanged 'riml.y' + end + + # .y file from ruby-php-serialization gem + + def test_php_serialization + assert_compile 'php_serialization.y' + assert_debugfile 'php_serialization.y', [0, 0, 0, 0] + assert_output_unchanged 'php_serialization.y' + end + + # .y file from huia language implementation + + def test_huia + assert_compile 'huia.y' + assert_debugfile 'huia.y', [285, 0, 0, 0] + assert_output_unchanged 'huia.y' + end + + # .y file from cast gem + + def test_cast + assert_compile 'cast.y' + assert_debugfile 'cast.y', [0, 0, 0, 0, 1] + assert_output_unchanged 'cast.y' + end + + # .y file from cadenza gem + + def test_cadenza + assert_compile 'cadenza.y' + assert_debugfile 'cadenza.y', [0, 0, 0, 0, 37] + assert_output_unchanged 'cadenza.y' + end + + # .y file from mediacloth gem + + def test_mediacloth + assert_compile 'mediacloth.y' + assert_debugfile 'mediacloth.y', [0, 0, 0, 0] + assert_output_unchanged 'mediacloth.y' + end + + # .y file from twowaysql gem + + def test_twowaysql + assert_compile 'twowaysql.y' + assert_debugfile 'twowaysql.y', [4, 0, 0, 0] + assert_output_unchanged 'twowaysql.y' + end + + # .y file from machete gem + + def test_machete + assert_compile 'machete.y' + assert_debugfile 'machete.y', [0, 0, 0, 0] + assert_output_unchanged 'machete.y' + end + + # .y file from mof gem + + def test_mof + assert_compile 'mof.y' + assert_debugfile 'mof.y', [7, 4, 0, 0] + assert_output_unchanged 'mof.y' + end + + # .y file from tp_plus gem + + def test_tp_plus + assert_compile 'tp_plus.y' + assert_debugfile 'tp_plus.y', [21, 0, 0, 0] + assert_output_unchanged 'tp_plus.y' + end + + def test_ifelse + omit if RUBY_PLATFORM =~ /java/ + + stderr = nil + racc "-o#{@TAB_DIR}/ifelse", "#{ASSET_DIR}/ifelse.y", stdout_filter: ->(s) { stderr = s } + stderr = stderr.lines[1..-1].join if RUBY_PLATFORM.match?(/java/) + assert_equal(<<~STDERR, stderr) + 1 useless nonterminals: + dummy + 2 useless rules: + #4 (dummy) + #5 (dummy) + 1 shift/reduce conflicts + Turn on logging with "-v" and check ".output" file for details + STDERR + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_scan_y.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_scan_y.rb new file mode 100644 index 000000000000..4c60119119d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/test_scan_y.rb @@ -0,0 +1,52 @@ +require File.expand_path(File.join(File.dirname(__FILE__), 'helper')) + +module Racc + class TestScanY < TestCase + def setup + super + file = File.join(ASSET_DIR, 'scan.y') + @debug_flags = Racc::DebugFlags.parse_option_string('o') + parser = Racc::GrammarFileParser.new(@debug_flags) + @result = parser.parse(File.read(file), File.basename(file)) + @states = Racc::States.new(@result.grammar).nfa + @states.dfa + end + + def test_compile + generator = Racc::ParserFileGenerator.new(@states, @result.params.dup) + + # it generates valid ruby + assert Module.new { + self.class_eval(generator.generate_parser) + } + + grammar = @states.grammar + + assert_equal 0, @states.n_srconflicts + assert_equal 0, @states.n_rrconflicts + assert_equal 0, grammar.n_useless_nonterminals + assert_equal 0, grammar.n_useless_rules + assert_nil grammar.n_expected_srconflicts + end + + def test_compile_line_convert + params = @result.params.dup + params.convert_line_all = true + + generator = Racc::ParserFileGenerator.new(@states, @result.params.dup) + + # it generates valid ruby + assert Module.new { + self.class_eval(generator.generate_parser) + } + + grammar = @states.grammar + + assert_equal 0, @states.n_srconflicts + assert_equal 0, @states.n_rrconflicts + assert_equal 0, grammar.n_useless_nonterminals + assert_equal 0, grammar.n_useless_rules + assert_nil grammar.n_expected_srconflicts + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/testscanner.rb b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/testscanner.rb new file mode 100644 index 000000000000..d7877511ec29 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/test/testscanner.rb @@ -0,0 +1,51 @@ +# +# racc scanner tester +# + +require 'racc/raccs' + + +class ScanError < StandardError; end + +def testdata( dir, argv ) + if argv.empty? then + Dir.glob( dir + '/*' ) - + Dir.glob( dir + '/*.swp' ) - + [ dir + '/CVS' ] + else + argv.collect {|i| dir + '/' + i } + end +end + + +if ARGV.delete '--print' then + $raccs_print_type = true + printonly = true +else + printonly = false +end + +testdata( File.dirname($0) + '/scandata', ARGV ).each do |file| + $stderr.print File.basename(file) + ': ' + begin + ok = File.read(file) + s = Racc::GrammarFileScanner.new( ok ) + sym, (val, _lineno) = s.scan + if printonly then + $stderr.puts + $stderr.puts val + next + end + + val = '{' + val + "}\n" + sym == :ACTION or raise ScanError, 'is not action!' + val == ok or raise ScanError, "\n>>>\n#{ok}----\n#{val}<<<" + + $stderr.puts 'ok' + rescue => err + $stderr.puts 'fail (' + err.type.to_s + ')' + $stderr.puts err.message + $stderr.puts err.backtrace + $stderr.puts + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/web/racc.en.rhtml b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/web/racc.en.rhtml new file mode 100644 index 000000000000..269011b44158 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/web/racc.en.rhtml @@ -0,0 +1,42 @@ +% require 'makefile' +% version = Makefile.get_parameter('Makefile', 'version') +<h1>Racc</h1> +<p> +$Id$ +</p> + +<table summary="package descriptor"> +<tr><th>Version</th><td><%= version %></td></tr> +<tr><th>Type</th><td>Parser Generator</td></tr> +<tr><th>Format</th><td>Ruby script + Ruby extention</td></tr> +<tr><th>Requirement</th><td>ruby (&gt;=1.6)</td></tr> +<tr><th>License</th><td>LGPL</td></tr> +</table> +<p> +-- <a href="/archive/racc/racc-<%= version %>-all.tar.gz">Download (.tar.gz)</a> +-- <a href="/archive/racc/">Old Versions</a> +-- <a href="doc/">Online Manual</a> +-- +</p> + +<p> +Racc (Ruby yACC) is a LALR(1) parser generator for Ruby. +Version 1.4.x is stable release. +</p> +<p> +Parsers generated by Racc requires "Racc Runtime Module". +Ruby 1.8.x comes with this runtime. +If you want to run your parsers with ruby 1.6.x, +use "racc -E" command. For details, see <a href="doc/">online manual</a>. +</p> + +<h2>Anonymous CVS</h2> +<p> +You can true latest version of Racc via anonymous CVS. +To check out working copy, type: +</p> +<pre> +$ cvs -d :pserver:anonymous@cvs.loveruby.net:/src login +Password: (Just hit [Enter]) +$ cvs -d :pserver:anonymous@cvs.loveruby.net:/src co racc +</pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/web/racc.ja.rhtml b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/web/racc.ja.rhtml new file mode 100644 index 000000000000..92e5459b8b0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/racc-1.5.2/web/racc.ja.rhtml @@ -0,0 +1,51 @@ +% require 'makefile' +% version = Makefile.get_parameter('Makefile', 'version') +<h1>Racc</h1> +<p> +$Id$ +</p> +<table summary="package descriptor"> +<tr><th>ǿ</th><td><%= version %></td></tr> +<tr><th></th><td>parser generator</td></tr> +<tr><th></th><td>ruby script, ruby extention</td></tr> +<tr><th>ɬ״Ķ</th><td>ruby (&gt;=1.6)</td></tr> +<tr><th>۾</th><td>LGPL</td></tr> +</table> +<ul> +<li><a href="/archive/racc/racc-<%= version %>-all.tar.gz"></a></li> +<li><a href="/archive/racc/">Сꥹ</a></li> +<li><a href="doc/">饤ޥ˥奢</a></li> +</ul> +</p> +<p> +Ruby Ѥ LALR(1) ѡͥ졼Ǥ +ѡϤʤ˹®ưޤ +</p> +<p> +Racc ѡư˥󥿥⥸塼뤬ɬפǤ +Ruby 1.8 ˤϤΥ󥿥बǽ餫źդƤΤ +ͤʤפǤRuby 1.6 оݤˤȤ +racc -E ǥѡɬפޤ +</p> +<p> +ʤRacc 1.4.x Υ󥿥 Ruby 1.8 źդ Racc 󥿥ϡ +ɾǤ̯˰㤤ޤ˸ߴޤ +</p> + +<h2></h2> +<p> +⤦ŪʬϸϤƤϤǤ +TODO ϤޤĤޤ¾ˤäƤΤ +ʬ礭ѹĤϤޤ +</p> + +<h2>CVS ݥȥ</h2> +<p> +CVS Ȥ Racc οκǿǤǤޤ +ޥɥ饤ǼΤ褦ǤäƤ +</p> +<pre> +$ cvs -d :pserver:anonymous@cvs.loveruby.net:/src login +Password: (EnterǤ) +$ cvs -d :pserver:anonymous@cvs.loveruby.net:/src co racc +</pre> diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/.gitignore b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/.gitignore new file mode 100644 index 000000000000..25a0e9a7e4f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/.gitignore @@ -0,0 +1,13 @@ +*.gem +.DS_Store +.Trashes +.bundle +.com.apple.timemachine.supported +.fseventsd +.idea +.rbx +/ext/build +Desktop DB +Desktop DF +Gemfile.lock +pkg/* diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/Gemfile b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/Gemfile new file mode 100644 index 000000000000..b4e2a20bb606 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/Guardfile b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/Guardfile new file mode 100644 index 000000000000..63a666e507a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/Guardfile @@ -0,0 +1,8 @@ +# A sample Guardfile +# More info at http://github.com/guard/guard#readme + +guard :rspec do + watch(%r(^spec/(.*)_spec.rb)) + watch(%r(^lib/(.*)\.rb)) { |m| "spec/#{m[1]}_spec.rb" } + watch('spec/spec_helper.rb') { 'spec' } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/LICENSE.txt new file mode 100644 index 000000000000..b083ecdd1651 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2010-2014 Thibaud Guillaume-Gentil & Travis Tilley + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/README.md b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/README.md new file mode 100644 index 000000000000..5dd3310cda3e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/README.md @@ -0,0 +1,260 @@ +[![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/thibaudgg/rb-fsevent) +[![endorse](https://api.coderwall.com/ttilley/endorsecount.png)](https://coderwall.com/ttilley) + +# rb-fsevent + +Very simple & usable Mac OSX FSEvents API + +* Signals are working (really) +* Tested on MRI 2.4.1, RBX 3.72, JRuby 1.7.26 and 9.1.8.0 +* Tested on 10.8 + +## HFS+ filename corruption bug + +There is a _very_ long-standing (since 2011) OSX bug where sometimes the filename metadata for HFS+ filesystems will get corrupted, resulting in some APIs returning one case for a file, and other APIs returning another. The result is that sometimes, _for no visible reason to the user_, fsevents would simply not work. As of rb-fsevent 0.9.5 this issue is properly detected and an insanely hacky (but effective) workaround is used that replaces the system `realpath()` with a custom implementation that should almost always return the same value as the kernel reporting (thus fixing fsevents). The major flaw in the workaround is that it may return the wrong path for hard links. + +Please note that this doesn't repair the underlying issue on disk. Other apps and libraries using fsevents will continue to break with no warning. There may be other issues unrelated to fsevents. + +__This bug is resolved in MacOS 10.12 and all users are strongly encouraged to upgrade.__ + +## Install + + gem install rb-fsevent + +### re-compilation + +rb-fsevent comes with a pre-compiled fsevent\_watch binary supporting x86\_64 on 10.9 and above. The binary is codesigned with my (Travis Tilley) Developer ID as an extra precaution when distributing pre-compiled code and contains an embedded plist describing its build environment. This should be sufficient for most users, but if you need to use rb-fsevent on 10.8 or lower then recompilation is necessary. This can be done by entering the installed gem's ext directory and running: + + MACOSX_DEPLOYMENT_TARGET="10.7" rake replace_exe + +The following ENV vars are recognized: + +* CC +* CFLAGS +* ARCHFLAGS +* MACOSX\_DEPLOYMENT\_TARGET +* FWDEBUG (enables debug mode, printing an obscene number of informational + messages to STDERR) + +### embedded plist + +You can retrieve the values in the embedded plist via the CLI: + + fsevent_watch --show-plist + +The output is essentially formatted as `"#{key}:\n #{value}\n"` to make it easier to read than plist style xml. The result looks like this: + + DTSDKName: + macosx10.5 + FSEWBuildTriple: + i386-apple-darwin10.8.0 + FSEWCC: + /usr/bin/gcc-4.2 + DTSDKPath: + /Developer/SDKs/MacOSX10.5.sdk + FSEWCCVersion: + i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3) + FSEWCFLAGS: + -fconstant-cfstrings -fno-strict-aliasing -Wall -mmacosx-version-min=10.5 -O3 + +If, for some perverse reason, you prefer to look at the xml... it can be retrieved via: + + otool -s __TEXT __info_plist ./bin/fsevent_watch | grep ^0 | xxd -r - + +### codesign + +You can verify code signing information for a specific fsevent\_watch via: + + codesign -d -vvv ./bin/fsevent_watch + +If you're using the pre-compiled binary, then the output should contain something to the effect of: + + Authority=Developer ID Application: Travis Tilley + Authority=Developer ID Certification Authority + Authority=Apple Root CA + Timestamp=Dec 31, 2012 12:49:13 PM + +## Usage + +### Singular path + +```ruby +require 'rb-fsevent' + +fsevent = FSEvent.new +fsevent.watch Dir.pwd do |directories| + puts "Detected change inside: #{directories.inspect}" +end +fsevent.run +``` + +### Multiple paths + +```ruby +require 'rb-fsevent' + +paths = ['/tmp/path/one', '/tmp/path/two', Dir.pwd] + +fsevent = FSEvent.new +fsevent.watch paths do |directories| + puts "Detected change inside: #{directories.inspect}" +end +fsevent.run +``` + +### Multiple paths and additional options as a Hash + +```ruby +require 'rb-fsevent' + +paths = ['/tmp/path/one', '/tmp/path/two', Dir.pwd] +options = {:latency => 1.5, :no_defer => true } + +fsevent = FSEvent.new +fsevent.watch paths, options do |directories| + puts "Detected change inside: #{directories.inspect}" +end +fsevent.run +``` + +### Multiple paths and additional options as an Array + +```ruby +require 'rb-fsevent' + +paths = ['/tmp/path/one', '/tmp/path/two', Dir.pwd] +options = ['--latency', 1.5, '--no-defer'] + +fsevent = FSEvent.new +fsevent.watch paths, options do |directories| + puts "Detected change inside: #{directories.inspect}" +end +fsevent.run +``` + +### Using _full_ event information + +```ruby +require 'rb-fsevent' +fsevent = FSEvent.new +fsevent.watch Dir.pwd do |paths, event_meta| + event_meta.events.each do |event| + puts "event ID: #{event.id}" + puts "path: #{event.path}" + puts "c flags: #{event.cflags}" + puts "named flags: #{event.flags.join(', ')}" + # named flags will include strings such as `ItemInodeMetaMod` or `OwnEvent` + end +end +fsevent.run +``` + +## Options + +When defining options using a hash or hash-like object, it gets checked for validity and converted to the appropriate fsevent\_watch commandline arguments array when the FSEvent class is instantiated. This is obviously the safest and preferred method of passing in options. + +You may, however, choose to pass in an array of commandline arguments as your options value and it will be passed on, unmodified, to the fsevent\_watch binary when called. + +So far, the following options are supported: + +* :latency => 0.5 # in seconds +* :no\_defer => true +* :watch\_root => true +* :since\_when => 18446744073709551615 # an FSEventStreamEventId +* :file\_events => true + +### Latency + +The :latency parameter determines how long the service should wait after the first event before passing that information along to the client. If your latency is set to 4 seconds, and 300 changes occur in the first three, then the callback will be fired only once. If latency is set to 0.1 in the exact same scenario, you will see that callback fire somewhere closer to between 25 and 30 times. + +Setting a higher latency value allows for more effective temporal coalescing, resulting in fewer callbacks and greater overall efficiency... at the cost of apparent responsiveness. Setting this to a reasonably high value (and NOT setting :no\_defer) is particularly well suited for background, daemon, or batch processing applications. + +Implementation note: It appears that FSEvents will only coalesce events from a maximum of 32 distinct subpaths, making the above completely accurate only when events are to fewer than 32 subpaths. Creating 300 files in one directory, for example, or 30 files in 10 subdirectories, but not 300 files within 300 subdirectories. In the latter case, you may receive 31 callbacks in one go after the latency period. As this appears to be an implementation detail, the number could potentially differ across OS revisions. It is entirely possible that this number is somehow configurable, but I have not yet discovered an accepted method of doing so. + +### NoDefer + +The :no\_defer option changes the behavior of the latency parameter completely. Rather than waiting for $latency period of time before sending along events in an attempt to coalesce a potential deluge ahead of time, that first event is sent along to the client immediately and is followed by a $latency period of silence before sending along any additional events that occurred within that period. + +This behavior is particularly useful for interactive applications where that feeling of apparent responsiveness is most important, but you still don't want to get overwhelmed by a series of events that occur in rapid succession. + +### WatchRoot + +The :watch\_root option allows for catching the scenario where you start watching "~/src/demo\_project" and either it is later renamed to "~/src/awesome\_sauce\_3000" or the path changes in such a manner that the original directory is now at "~/clients/foo/iteration4/demo\_project". + +Unfortunately, while this behavior is somewhat supported in the fsevent\_watch binary built as part of this project, support for passing across detailed metadata is not (yet). As a result, you would not receive the appropriate RootChanged event and be able to react appropriately. Also, since the C code doesn't open watched directories and retain that file descriptor as part of path-specific callback metadata, we are unable to issue an F\_GETPATH fcntl() to determine the directory's new path. + +Please do not use this option until proper support is added (or, even better, add it and submit a pull request). + +### SinceWhen + +The FSEventStreamEventId passed in to :since\_when is used as a base for reacting to historic events. Unfortunately, not only is the metadata for transitioning from historic to live events not currently passed along, but it is incorrectly passed as a change event on the root path, and only per-host event streams are currently supported. When using per-host event streams, the event IDs are not guaranteed to be unique or contiguous when shared volumes (firewire/USB/net/etc) are used on multiple macs. + +Please do not use this option until proper support is added, unless it's acceptable for you to receive that one fake event that's handled incorrectly when events transition from historical to live. Even in that scenario, there's no metadata available for determining the FSEventStreamEventId of the last received event. + +WARNING: passing in 0 as the parameter to :since\_when will return events for every directory modified since "the beginning of time". + +### FileEvents ### + +Prepare yourself for an obscene number of callbacks. Realistically, an "Atomic Save" could easily fire maybe 6 events for the combination of creating the new file, changing metadata/permissions, writing content, swapping out the old file for the new may itself result in multiple events being fired, and so forth. By the time you get the event for the temporary file being created as part of the atomic save, it will already be gone and swapped with the original file. This and issues of a similar nature have prevented me from adding the option to the ruby code despite the fsevent\_watch binary supporting file level events for quite some time now. Mountain Lion seems to be better at coalescing needless events, but that might just be my imagination. + +## Debugging output + +If the gem is re-compiled with the environment variable FWDEBUG set, then fsevent\_watch will be built with its various DEBUG sections defined, and the output to STDERR is truly verbose (and hopefully helpful in debugging your application and not just fsevent\_watch itself). If enough people find this to be directly useful when developing code that makes use of rb-fsevent, then it wouldn't be hard to clean this up and make it a feature enabled by a commandline argument instead. Until somebody files an issue, however, I will assume otherwise. + + append_path called for: /tmp/moo/cow/ + resolved path to: /private/tmp/moo/cow + + config.sinceWhen 18446744073709551615 + config.latency 0.300000 + config.flags 00000000 + config.paths + /private/tmp/moo/cow + + FSEventStreamRef @ 0x100108540: + allocator = 0x7fff705a4ee0 + callback = 0x10000151e + context = {0, 0x0, 0x0, 0x0, 0x0} + numPathsToWatch = 1 + pathsToWatch = 0x7fff705a4ee0 + pathsToWatch[0] = '/private/tmp/moo/cow' + latestEventId = -1 + latency = 300000 (microseconds) + flags = 0x00000000 + runLoop = 0x0 + runLoopMode = 0x0 + + FSEventStreamCallback fired! + numEvents: 32 + event path: /private/tmp/moo/cow/1/a/ + event flags: 00000000 + event ID: 1023767 + event path: /private/tmp/moo/cow/1/b/ + event flags: 00000000 + event ID: 1023782 + event path: /private/tmp/moo/cow/1/c/ + event flags: 00000000 + event ID: 1023797 + event path: /private/tmp/moo/cow/1/d/ + event flags: 00000000 + event ID: 1023812 + [etc] + + +## Development + +* Source hosted at [GitHub](http://github.com/thibaudgg/rb-fsevent) +* Report issues/Questions/Feature requests on [GitHub Issues](http://github.com/thibaudgg/rb-fsevent/issues) + +Pull requests are quite welcome! Please ensure that your commits are in a topic branch for each individual changeset that can be reasonably isolated. It is also important to ensure that your changes are well tested... whether that means new tests, modified tests, or fixing a scenario where the existing tests currently fail. If you have rbenv and ruby-build, we have a helper task for running the testsuite in all of them: + + rake spec:portability + +The list of tested targets is currently: + + %w[2.4.1 rbx-3.72 jruby-1.7.26 jruby-9.1.8.0] + +## Authors + +* [Travis Tilley](http://github.com/ttilley) +* [Thibaud Guillaume-Gentil](http://github.com/thibaudgg) +* [Andrey Tarantsov](https://github.com/andreyvit) diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/Rakefile b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/Rakefile new file mode 100644 index 000000000000..53a08a14f0b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/Rakefile @@ -0,0 +1,33 @@ +# -*- encoding: utf-8 -*- +require 'bundler' +Bundler::GemHelper.install_tasks + +require 'rspec/core/rake_task' +RSpec::Core::RakeTask.new(:spec) +task :default => :spec + +namespace(:spec) do + desc "Run all specs on multiple ruby versions" + task(:portability) do + versions = %w[2.4.1 rbx-3.72 jruby-1.7.26 jruby-9.1.8.0] + versions.each do |version| + # system <<-BASH + # bash -c 'source ~/.rvm/scripts/rvm; + # rvm #{version}; + # echo "--------- version #{version} ----------\n"; + # bundle install; + # rake spec' + # BASH + system <<-BASH + bash -c 'export PATH="$HOME/.rbenv/bin:$PATH"; + [[ `which rbenv` ]] && eval "$(rbenv init -)"; + [[ ! -a $HOME/.rbenv/versions/#{version} ]] && rbenv install #{version}; + rbenv shell #{version}; + rbenv which bundle 2> /dev/null || gem install bundler; + rm Gemfile.lock; + bundle install; + rake spec;' + BASH + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/bin/fsevent_watch b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/bin/fsevent_watch new file mode 100644 index 000000000000..889204f817bb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/bin/fsevent_watch differ diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/LICENSE b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/LICENSE new file mode 100644 index 000000000000..a35e1957ddd5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2011-2013 Travis Tilley + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/FSEventsFix.c b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/FSEventsFix.c new file mode 100644 index 000000000000..60e3d37bd607 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/FSEventsFix.c @@ -0,0 +1,626 @@ +/* + * FSEventsFix + * + * Resolves a long-standing bug in realpath() that prevents FSEvents API from + * monitoring certain folders on a wide range of OS X released (10.6-10.10 at least). + * + * The underlying issue is that for some folders, realpath() call starts returning + * a path with incorrect casing (e.g. "/users/smt" instead of "/Users/smt"). + * FSEvents is case-sensitive and calls realpath() on the paths you pass in, so + * an incorrect value returned by realpath() prevents FSEvents from seeing any + * change events. + * + * See the discussion at https://github.com/thibaudgg/rb-fsevent/issues/10 about + * the history of this bug and how this library came to exist. + * + * This library uses Facebook's fishhook to replace a custom implementation of + * realpath in place of the system realpath; FSEvents will then invoke our custom + * implementation (which does not screw up the names) and will thus work correctly. + * + * Our implementation of realpath is based on the open-source implementation from + * OS X 10.10, with a single change applied (enclosed in "BEGIN WORKAROUND FOR + * OS X BUG" ... "END WORKAROUND FOR OS X BUG"). + * + * Include FSEventsFix.{h,c} into your project and call FSEventsFixInstall(). + * + * It is recommended that you install FSEventsFix on demand, using FSEventsFixIsBroken + * to check if the folder you're about to pass to FSEventStreamCreate needs the fix. + * Note that the fix must be applied before calling FSEventStreamCreate. + * + * FSEventsFixIsBroken requires a path that uses the correct case for all folder names, + * i.e. a path provided by the system APIs or constructed from folder names provided + * by the directory enumeration APIs. + * + * Copyright (c) 2015 Andrey Tarantsov <andrey@tarantsov.com> + * Copyright (c) 2003 Constantin S. Svintsoff <kostik@iclub.nsu.ru> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * Based on a realpath implementation from Apple libc 498.1.7, taken from + * http://www.opensource.apple.com/source/Libc/Libc-498.1.7/stdlib/FreeBSD/realpath.c + * and provided under the following license: + * + * Copyright (c) 2003 Constantin S. Svintsoff <kostik@iclub.nsu.ru> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The names of the authors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + +#include "FSEventsFix.h" + +#include <dispatch/dispatch.h> +#include <stddef.h> +#include <stdint.h> +#include <stdbool.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <ctype.h> +#include <dlfcn.h> + + +const char *const FSEventsFixVersionString = "0.11.0"; + + +#pragma mark - Forward declarations + +static char *(*orig_realpath)(const char *restrict file_name, char resolved_name[PATH_MAX]); +static char *CFURL_realpath(const char *restrict file_name, char resolved_name[PATH_MAX]); +static char *FSEventsFix_realpath_wrapper(const char *restrict src, char *restrict dst); + +static void _FSEventsFixHookInstall(); +static void _FSEventsFixHookUninstall(); + + +#pragma mark - Internal state + +static dispatch_queue_t g_queue = NULL; + +static int64_t g_enable_refcount = 0; + +static bool g_in_self_test = false; +static bool g_hook_operational = false; + +static void(^g_logging_block)(FSEventsFixMessageType type, const char *message); +static FSEventsFixDebugOptions g_debug_opt = 0; + +typedef struct { + char *name; + void *replacement; + void *original; + uint hooked_symbols; +} rebinding_t; + +static rebinding_t g_rebindings[] = { + { "_realpath$DARWIN_EXTSN", (void *) &FSEventsFix_realpath_wrapper, (void *) &realpath, 0 } +}; +static const uint g_rebindings_nel = sizeof(g_rebindings) / sizeof(g_rebindings[0]); + + +#pragma mark - Logging + +static void _FSEventsFixLog(FSEventsFixMessageType type, const char *__restrict fmt, ...) __attribute__((__format__ (__printf__, 2, 3))); + +static void _FSEventsFixLog(FSEventsFixMessageType type, const char *__restrict fmt, ...) { + if (g_logging_block) { + char *message = NULL; + va_list va; + va_start(va, fmt); + vasprintf(&message, fmt, va); + va_end(va); + + if (message) { + if (!!(g_debug_opt & FSEventsFixDebugOptionLogToStderr)) { + fprintf(stderr, "FSEventsFix: %s\n", message); + } + if (g_logging_block) { + g_logging_block(type, message); + } + free(message); + } + } +} + + +#pragma mark - API + +void _FSEventsFixInitialize() { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + g_queue = dispatch_queue_create("FSEventsFix", DISPATCH_QUEUE_SERIAL); + }); +} + +void FSEventsFixConfigure(FSEventsFixDebugOptions debugOptions, void(^loggingBlock)(FSEventsFixMessageType severity, const char *message)) { + _FSEventsFixInitialize(); + loggingBlock = Block_copy(loggingBlock); + dispatch_sync(g_queue, ^{ + g_debug_opt = debugOptions; + g_logging_block = loggingBlock; + }); +} + +// Must be called from the private serial queue. +void _FSEventsFixSelfTest() { + g_in_self_test = true; + g_hook_operational = false; + static char result[1024]; + realpath("/Etc/__!FSEventsFixSelfTest!__", result); + g_in_self_test = false; +} + +void FSEventsFixEnable() { + _FSEventsFixInitialize(); + dispatch_sync(g_queue, ^{ + if (++g_enable_refcount == 1) { + orig_realpath = dlsym(RTLD_DEFAULT, "realpath"); + _FSEventsFixHookInstall(); + _FSEventsFixSelfTest(); + if (g_hook_operational) { + _FSEventsFixLog(FSEventsFixMessageTypeStatusChange, "Enabled"); + } else { + _FSEventsFixLog(FSEventsFixMessageTypeFatalError, "Failed to enable (hook not called)"); + } + } + }); +} + +void FSEventsFixDisable() { + _FSEventsFixInitialize(); + dispatch_sync(g_queue, ^{ + if (g_enable_refcount == 0) { + abort(); + } + if (--g_enable_refcount == 0) { + _FSEventsFixHookUninstall(); + _FSEventsFixSelfTest(); + if (!g_hook_operational) { + _FSEventsFixLog(FSEventsFixMessageTypeStatusChange, "Disabled"); + } else { + _FSEventsFixLog(FSEventsFixMessageTypeFatalError, "Failed to disable (hook still called)"); + } + } + }); +} + +bool FSEventsFixIsOperational() { + _FSEventsFixInitialize(); + __block bool result = false; + dispatch_sync(g_queue, ^{ + result = g_hook_operational; + }); + return result; +} + +bool _FSEventsFixIsBroken_noresolve(const char *resolved) { + if (!!(g_debug_opt & FSEventsFixDebugOptionSimulateBroken)) { + if (strstr(resolved, FSEventsFixSimulatedBrokenFolderMarker)) { + return true; + } + } + + char *reresolved = realpath(resolved, NULL); + if (reresolved) { + bool broken = (0 != strcmp(resolved, reresolved)); + free(reresolved); + return broken; + } else { + return true; + } +} + +bool FSEventsFixIsBroken(const char *path) { + char *resolved = CFURL_realpath(path, NULL); + if (!resolved) { + return true; + } + bool broken = _FSEventsFixIsBroken_noresolve(resolved); + free(resolved); + return broken; +} + +char *FSEventsFixCopyRootBrokenFolderPath(const char *inpath) { + if (!FSEventsFixIsBroken(inpath)) { + return NULL; + } + + // get a mutable copy of an absolute path + char *path = CFURL_realpath(inpath, NULL); + if (!path) { + return NULL; + } + + for (;;) { + char *sep = strrchr(path, '/'); + if ((sep == NULL) || (sep == path)) { + break; + } + *sep = 0; + if (!_FSEventsFixIsBroken_noresolve(path)) { + *sep = '/'; + break; + } + } + + return path; +} + +static void _FSEventsFixAttemptRepair(const char *folder) { + int rv = rename(folder, folder); + + if (!!(g_debug_opt & FSEventsFixDebugOptionSimulateRepair)) { + const char *pos = strstr(folder, FSEventsFixSimulatedBrokenFolderMarker); + if (pos) { + char *fixed = strdup(folder); + fixed[pos - folder] = 0; + strcat(fixed, pos + strlen(FSEventsFixSimulatedBrokenFolderMarker)); + + rv = rename(folder, fixed); + free(fixed); + } + } + + if (rv != 0) { + if (errno == EPERM) { + _FSEventsFixLog(FSEventsFixMessageTypeResult, "Permission error when trying to repair '%s'", folder); + } else { + _FSEventsFixLog(FSEventsFixMessageTypeExpectedFailure, "Unknown error when trying to repair '%s': errno = %d", folder, errno); + } + } +} + +FSEventsFixRepairStatus FSEventsFixRepairIfNeeded(const char *inpath) { + char *root = FSEventsFixCopyRootBrokenFolderPath(inpath); + if (root == NULL) { + return FSEventsFixRepairStatusNotBroken; + } + + for (;;) { + _FSEventsFixAttemptRepair(root); + char *newRoot = FSEventsFixCopyRootBrokenFolderPath(inpath); + if (newRoot == NULL) { + _FSEventsFixLog(FSEventsFixMessageTypeResult, "Repaired '%s' in '%s'", root, inpath); + free(root); + return FSEventsFixRepairStatusRepaired; + } + if (0 == strcmp(root, newRoot)) { + _FSEventsFixLog(FSEventsFixMessageTypeResult, "Failed to repair '%s' in '%s'", root, inpath); + free(root); + free(newRoot); + return FSEventsFixRepairStatusFailed; + } + _FSEventsFixLog(FSEventsFixMessageTypeResult, "Partial success, repaired '%s' in '%s'", root, inpath); + free(root); + root = newRoot; + } +} + + +#pragma mark - FSEventsFix realpath wrapper + +static char *FSEventsFix_realpath_wrapper(const char * __restrict src, char * __restrict dst) { + if (g_in_self_test) { + if (strstr(src, "__!FSEventsFixSelfTest!__")) { + g_hook_operational = true; + } + } + + // CFURL_realpath doesn't support putting where resolution failed into the + // dst buffer, so we call the original realpath here first and if it gets a + // result, replace that with the output of CFURL_realpath. that way all the + // features of the original realpath are available. + char *rv = NULL; + char *orv = orig_realpath(src, dst); + if (orv != NULL) { rv = CFURL_realpath(src, dst); } + + if (!!(g_debug_opt & FSEventsFixDebugOptionLogCalls)) { + char *result = rv ?: dst; + _FSEventsFixLog(FSEventsFixMessageTypeCall, "realpath(%s) => %s\n", src, result); + } + + if (!!(g_debug_opt & FSEventsFixDebugOptionUppercaseReturn)) { + char *result = rv ?: dst; + if (result) { + for (char *pch = result; *pch; ++pch) { + *pch = (char)toupper(*pch); + } + } + } + + return rv; +} + + +#pragma mark - realpath + +// naive implementation of realpath on top of CFURL +// NOTE: doesn't quite support the full range of errno results one would +// expect here, in part because some of these functions just return a boolean, +// and in part because i'm not dealing with messy CFErrorRef objects and +// attempting to translate those to sane errno values. +// NOTE: the OSX realpath will return _where_ resolution failed in resolved_name +// if passed in and return NULL. we can't properly support that extension here +// since the resolution happens entirely behind the scenes to us in CFURL. +static char* CFURL_realpath(const char *file_name, char resolved_name[PATH_MAX]) +{ + char* resolved; + CFURLRef url1; + CFURLRef url2; + CFStringRef path; + + if (file_name == NULL) { + errno = EINVAL; + return (NULL); + } + +#if __DARWIN_UNIX03 + if (*file_name == 0) { + errno = ENOENT; + return (NULL); + } +#endif + + // create a buffer to store our result if we weren't passed one + if (!resolved_name) { + if ((resolved = malloc(PATH_MAX)) == NULL) return (NULL); + } else { + resolved = resolved_name; + } + + url1 = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)file_name, (CFIndex)strlen(file_name), false); + if (url1 == NULL) { goto error_return; } + + url2 = CFURLCopyAbsoluteURL(url1); + CFRelease(url1); + if (url2 == NULL) { goto error_return; } + + url1 = CFURLCreateFileReferenceURL(NULL, url2, NULL); + CFRelease(url2); + if (url1 == NULL) { goto error_return; } + + // if there are multiple hard links to the original path, this may end up + // being _completely_ different from what was intended + url2 = CFURLCreateFilePathURL(NULL, url1, NULL); + CFRelease(url1); + if (url2 == NULL) { goto error_return; } + + path = CFURLCopyFileSystemPath(url2, kCFURLPOSIXPathStyle); + CFRelease(url2); + if (path == NULL) { goto error_return; } + + bool success = CFStringGetCString(path, resolved, PATH_MAX, kCFStringEncodingUTF8); + CFRelease(path); + if (!success) { goto error_return; } + + return resolved; + +error_return: + if (!resolved_name) { + // we weren't passed in an output buffer and created our own. free it + int e = errno; + free(resolved); + errno = e; + } + return (NULL); +} + + +#pragma mark - fishhook + +// Copyright (c) 2013, Facebook, Inc. +// All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name Facebook nor the names of its contributors may be used to +// endorse or promote products derived from this software without specific +// prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import <stdlib.h> +#import <string.h> +#import <sys/types.h> +#import <mach-o/dyld.h> +#import <mach-o/loader.h> +#import <mach-o/nlist.h> + +#ifdef __LP64__ +typedef struct mach_header_64 mach_header_t; +typedef struct segment_command_64 segment_command_t; +typedef struct section_64 section_t; +typedef struct nlist_64 nlist_t; +#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT_64 +#else +typedef struct mach_header mach_header_t; +typedef struct segment_command segment_command_t; +typedef struct section section_t; +typedef struct nlist nlist_t; +#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT +#endif + +static volatile bool g_hook_installed = false; + +static void _FSEventsFixHookUpdateSection(section_t *section, intptr_t slide, nlist_t *symtab, char *strtab, uint32_t *indirect_symtab) +{ + uint32_t *indirect_symbol_indices = indirect_symtab + section->reserved1; + void **indirect_symbol_bindings = (void **)((uintptr_t)slide + section->addr); + for (uint i = 0; i < section->size / sizeof(void *); i++) { + uint32_t symtab_index = indirect_symbol_indices[i]; + if (symtab_index == INDIRECT_SYMBOL_ABS || symtab_index == INDIRECT_SYMBOL_LOCAL || + symtab_index == (INDIRECT_SYMBOL_LOCAL | INDIRECT_SYMBOL_ABS)) { + continue; + } + uint32_t strtab_offset = symtab[symtab_index].n_un.n_strx; + char *symbol_name = strtab + strtab_offset; + for (rebinding_t *cur = g_rebindings, *end = g_rebindings + g_rebindings_nel; cur < end; ++cur) { + if (strcmp(symbol_name, cur->name) == 0) { + if (g_hook_installed) { + if (indirect_symbol_bindings[i] != cur->replacement) { + indirect_symbol_bindings[i] = cur->replacement; + ++cur->hooked_symbols; + } + } else if (cur->original != NULL) { + if (indirect_symbol_bindings[i] == cur->replacement) { + indirect_symbol_bindings[i] = cur->original; + if (cur->hooked_symbols > 0) { + --cur->hooked_symbols; + } + } + } + goto symbol_loop; + } + } + symbol_loop:; + } +} + +static void _FSEventsFixHookUpdateImage(const struct mach_header *header, intptr_t slide) { + Dl_info info; + if (dladdr(header, &info) == 0) { + return; + } + + segment_command_t *cur_seg_cmd; + segment_command_t *linkedit_segment = NULL; + struct symtab_command* symtab_cmd = NULL; + struct dysymtab_command* dysymtab_cmd = NULL; + + uintptr_t cur = (uintptr_t)header + sizeof(mach_header_t); + for (uint i = 0; i < header->ncmds; i++, cur += cur_seg_cmd->cmdsize) { + cur_seg_cmd = (segment_command_t *)cur; + if (cur_seg_cmd->cmd == LC_SEGMENT_ARCH_DEPENDENT) { + if (strcmp(cur_seg_cmd->segname, SEG_LINKEDIT) == 0) { + linkedit_segment = cur_seg_cmd; + } + } else if (cur_seg_cmd->cmd == LC_SYMTAB) { + symtab_cmd = (struct symtab_command*)cur_seg_cmd; + } else if (cur_seg_cmd->cmd == LC_DYSYMTAB) { + dysymtab_cmd = (struct dysymtab_command*)cur_seg_cmd; + } + } + + if (!symtab_cmd || !dysymtab_cmd || !linkedit_segment || + !dysymtab_cmd->nindirectsyms) { + return; + } + + // Find base symbol/string table addresses + uintptr_t linkedit_base = (uintptr_t)slide + linkedit_segment->vmaddr - linkedit_segment->fileoff; + nlist_t *symtab = (nlist_t *)(linkedit_base + symtab_cmd->symoff); + char *strtab = (char *)(linkedit_base + symtab_cmd->stroff); + + // Get indirect symbol table (array of uint32_t indices into symbol table) + uint32_t *indirect_symtab = (uint32_t *)(linkedit_base + dysymtab_cmd->indirectsymoff); + + cur = (uintptr_t)header + sizeof(mach_header_t); + for (uint i = 0; i < header->ncmds; i++, cur += cur_seg_cmd->cmdsize) { + cur_seg_cmd = (segment_command_t *)cur; + if (cur_seg_cmd->cmd == LC_SEGMENT_ARCH_DEPENDENT) { + if (strcmp(cur_seg_cmd->segname, SEG_DATA) != 0) { + continue; + } + for (uint j = 0; j < cur_seg_cmd->nsects; j++) { + section_t *sect = + (section_t *)(cur + sizeof(segment_command_t)) + j; + if ((sect->flags & SECTION_TYPE) == S_LAZY_SYMBOL_POINTERS) { + _FSEventsFixHookUpdateSection(sect, slide, symtab, strtab, indirect_symtab); + } + if ((sect->flags & SECTION_TYPE) == S_NON_LAZY_SYMBOL_POINTERS) { + _FSEventsFixHookUpdateSection(sect, slide, symtab, strtab, indirect_symtab); + } + } + } + } +} + +static void _FSEventsFixHookSaveOriginals() { + for (rebinding_t *cur = g_rebindings, *end = g_rebindings + g_rebindings_nel; cur < end; ++cur) { + void *original = cur->original = dlsym(RTLD_DEFAULT, cur->name+1); + if (!original) { + const char *error = dlerror(); + _FSEventsFixLog(FSEventsFixMessageTypeFatalError, "Cannot find symbol %s, dlsym says: %s\n", cur->name, error); + } + } +} + +static void _FSEventsFixHookUpdate() { + uint32_t c = _dyld_image_count(); + for (uint32_t i = 0; i < c; i++) { + _FSEventsFixHookUpdateImage(_dyld_get_image_header(i), _dyld_get_image_vmaddr_slide(i)); + } +} + +static void _FSEventsFixHookInstall() { + static bool first_rebinding_done = false; + + if (!g_hook_installed) { + g_hook_installed = true; + + if (!first_rebinding_done) { + first_rebinding_done = true; + _FSEventsFixHookSaveOriginals(); + _dyld_register_func_for_add_image(_FSEventsFixHookUpdateImage); + } else { + _FSEventsFixHookUpdate(); + } + } +} + +static void _FSEventsFixHookUninstall() { + if (g_hook_installed) { + g_hook_installed = false; + _FSEventsFixHookUpdate(); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/FSEventsFix.h b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/FSEventsFix.h new file mode 100644 index 000000000000..b70b8800c7a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/FSEventsFix.h @@ -0,0 +1,105 @@ +/* + * FSEventsFix + * + * Works around a long-standing bug in realpath() that prevents FSEvents API from + * monitoring certain folders on a wide range of OS X releases (10.6-10.10 at least). + * + * The underlying issue is that for some folders, realpath() call starts returning + * a path with incorrect casing (e.g. "/users/smt" instead of "/Users/smt"). + * FSEvents is case-sensitive and calls realpath() on the paths you pass in, so + * an incorrect value returned by realpath() prevents FSEvents from seeing any + * change events. + * + * See the discussion at https://github.com/thibaudgg/rb-fsevent/issues/10 about + * the history of this bug and how this library came to exist. + * + * This library uses Facebook's fishhook to replace a custom implementation of + * realpath in place of the system realpath; FSEvents will then invoke our custom + * implementation (which does not screw up the names) and will thus work correctly. + * + * Our implementation of realpath is based on the open-source implementation from + * OS X 10.10, with a single change applied (enclosed in "BEGIN WORKAROUND FOR + * OS X BUG" ... "END WORKAROUND FOR OS X BUG"). + * + * Include FSEventsFix.{h,c} into your project and call FSEventsFixInstall(). + * + * It is recommended that you install FSEventsFix on demand, using FSEventsFixIsBroken + * to check if the folder you're about to pass to FSEventStreamCreate needs the fix. + * Note that the fix must be applied before calling FSEventStreamCreate. + * + * FSEventsFixIsBroken requires a path that uses the correct case for all folder names, + * i.e. a path provided by the system APIs or constructed from folder names provided + * by the directory enumeration APIs. + * + * See .c file for license & copyrights, but basically this is available under a mix + * of MIT and BSD licenses. + */ + +#ifndef __FSEventsFix__ +#define __FSEventsFix__ + +#include <CoreFoundation/CoreFoundation.h> + +/// A library version string (e.g. 1.2.3) for displaying and logging purposes +extern const char *const FSEventsFixVersionString; + +/// See FSEventsFixDebugOptionSimulateBroken +#define FSEventsFixSimulatedBrokenFolderMarker "__!FSEventsBroken!__" + +typedef CF_OPTIONS(unsigned, FSEventsFixDebugOptions) { + /// Always return an uppercase string from realpath + FSEventsFixDebugOptionUppercaseReturn = 0x01, + + /// Log all calls to realpath using the logger configured via FSEventsFixConfigure + FSEventsFixDebugOptionLogCalls = 0x02, + + /// In addition to the logging block (if any), log everything to stderr + FSEventsFixDebugOptionLogToStderr = 0x08, + + /// Report paths containing FSEventsFixSimulatedBrokenFolderMarker as broken + FSEventsFixDebugOptionSimulateBroken = 0x10, + + /// Repair paths containing FSEventsFixSimulatedBrokenFolderMarker by renaming them + FSEventsFixDebugOptionSimulateRepair = 0x20, +}; + +typedef CF_ENUM(int, FSEventsFixMessageType) { + /// Call logging requested via FSEventsFixDebugOptionLogCalls + FSEventsFixMessageTypeCall, + + /// Results of actions like repair, and other pretty verbose, but notable, stuff. + FSEventsFixMessageTypeResult, + + /// Enabled/disabled status change + FSEventsFixMessageTypeStatusChange, + + /// Expected failure (treat as a warning) + FSEventsFixMessageTypeExpectedFailure, + + /// Severe failure that most likely means that the library won't work + FSEventsFixMessageTypeFatalError +}; + +typedef CF_ENUM(int, FSEventsFixRepairStatus) { + FSEventsFixRepairStatusNotBroken, + FSEventsFixRepairStatusRepaired, + FSEventsFixRepairStatusFailed, +}; + +/// Note that the logging block can be called on any dispatch queue. +void FSEventsFixConfigure(FSEventsFixDebugOptions debugOptions, void(^loggingBlock)(FSEventsFixMessageType type, const char *message)); + +void FSEventsFixEnable(); +void FSEventsFixDisable(); + +bool FSEventsFixIsOperational(); + +bool FSEventsFixIsBroken(const char *path); + +/// If the path is broken, returns a string identifying the root broken folder, +/// otherwise, returns NULL. You need to free() the returned string. +char *FSEventsFixCopyRootBrokenFolderPath(const char *path); + +FSEventsFixRepairStatus FSEventsFixRepairIfNeeded(const char *path); + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/TSICTString.c b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/TSICTString.c new file mode 100644 index 000000000000..6e033d0638c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/TSICTString.c @@ -0,0 +1,373 @@ +// +// TSICTString.c +// TSITString +// +// Created by Travis Tilley on 9/27/11. +// + +#include "TSICTString.h" + + +const char* const TNetstringTypes = ",#^!~}]Z"; +const char* const OTNetstringTypes = ",#^!~{[Z"; +const UInt8 TNetstringSeparator = ':'; + +TSITStringFormat TSITStringDefaultFormat = kTSITStringFormatTNetstring; + +static const CFRange BeginningRange = {0,0}; + +static CFTypeID kCFDataTypeID = -1UL; +static CFTypeID kCFStringTypeID = -1UL; +static CFTypeID kCFNumberTypeID = -1UL; +static CFTypeID kCFBooleanTypeID = -1UL; +static CFTypeID kCFNullTypeID = -1UL; +static CFTypeID kCFArrayTypeID = -1UL; +static CFTypeID kCFDictionaryTypeID = -1UL; + + +__attribute__((constructor)) void Init_TSICTString(void) +{ + kCFDataTypeID = CFDataGetTypeID(); + kCFStringTypeID = CFStringGetTypeID(); + kCFNumberTypeID = CFNumberGetTypeID(); + kCFBooleanTypeID = CFBooleanGetTypeID(); + kCFNullTypeID = CFNullGetTypeID(); + kCFArrayTypeID = CFArrayGetTypeID(); + kCFDictionaryTypeID = CFDictionaryGetTypeID(); +} + + +void TSICTStringSetDefaultFormat(TSITStringFormat format) +{ + if (format == kTSITStringFormatDefault) { + TSITStringDefaultFormat = kTSITStringFormatTNetstring; + } else { + TSITStringDefaultFormat = format; + } +} + +TSITStringFormat TSICTStringGetDefaultFormat(void) +{ + return TSITStringDefaultFormat; +} + + +void TSICTStringDestroy(TStringIRep* rep) +{ + CFRelease(rep->data); + free(rep->length); + free(rep); +} + + +static inline TStringIRep* TSICTStringCreateWithDataOfTypeAndFormat(CFDataRef data, TSITStringTag type, TSITStringFormat format) +{ + if (format == kTSITStringFormatDefault) { + format = TSICTStringGetDefaultFormat(); + } + + TStringIRep* rep = calloc(1, sizeof(TStringIRep)); + rep->data = CFDataCreateCopy(kCFAllocatorDefault, data); + rep->type = type; + rep->format = format; + rep->length = calloc(10, sizeof(char)); + + CFIndex len = CFDataGetLength(rep->data); + if (snprintf(rep->length, 10, "%lu", len)) { + return rep; + } else { + TSICTStringDestroy(rep); + return NULL; + } +} + +static inline CFDataRef TSICTStringCreateDataFromIntermediateRepresentation(TStringIRep* rep) +{ + CFIndex len = CFDataGetLength(rep->data); + CFMutableDataRef buffer = CFDataCreateMutableCopy(kCFAllocatorDefault, (len + 12), rep->data); + UInt8* bufferBytes = CFDataGetMutableBytePtr(buffer); + + size_t prefixLength = strlen(rep->length) + 1; + CFDataReplaceBytes(buffer, BeginningRange, (const UInt8*)rep->length, (CFIndex)prefixLength); + + if (rep->format == kTSITStringFormatTNetstring) { + const UInt8 ftag = (UInt8)TNetstringTypes[rep->type]; + CFDataAppendBytes(buffer, &ftag, 1); + bufferBytes[(prefixLength - 1)] = TNetstringSeparator; + } else if (rep->format == kTSITStringFormatOTNetstring) { + const UInt8 ftag = (UInt8)OTNetstringTypes[rep->type]; + bufferBytes[(prefixLength - 1)] = ftag; + } + + CFDataRef dataRep = CFDataCreateCopy(kCFAllocatorDefault, buffer); + CFRelease(buffer); + + return dataRep; +} + +static inline CFStringRef TSICTStringCreateStringFromIntermediateRepresentation(TStringIRep* rep) +{ + CFDataRef data = TSICTStringCreateDataFromIntermediateRepresentation(rep); + CFStringRef string = CFStringCreateFromExternalRepresentation(kCFAllocatorDefault, data, kCFStringEncodingUTF8); + CFRelease(data); + return string; +} + +static inline void TSICTStringAppendObjectToMutableDataWithFormat(CFTypeRef object, CFMutableDataRef buffer, TSITStringFormat format) +{ + if (object == NULL) { + object = kCFNull; + } + + CFRetain(object); + + TStringIRep* objRep = TSICTStringCreateWithObjectAndFormat(object, format); + CFDataRef objData = TSICTStringCreateDataFromIntermediateRepresentation(objRep); + CFDataAppendBytes(buffer, (CFDataGetBytePtr(objData)), CFDataGetLength(objData)); + CFRelease(objData); + TSICTStringDestroy(objRep); + + CFRelease(object); +} + +static void ArrayBufferAppendCallback(const void* item, void* context) +{ + TStringCollectionCallbackContext* cx = (TStringCollectionCallbackContext*)context; + CFMutableDataRef buffer = cx->buffer; + TSITStringFormat format = cx->format; + + TSICTStringAppendObjectToMutableDataWithFormat(item, buffer, format); +} + +static void DictionaryBufferAppendCallback(const void* key, const void* value, void* context) +{ + TStringCollectionCallbackContext* cx = (TStringCollectionCallbackContext*)context; + CFMutableDataRef buffer = cx->buffer; + TSITStringFormat format = cx->format; + + TSICTStringAppendObjectToMutableDataWithFormat(key, buffer, format); + TSICTStringAppendObjectToMutableDataWithFormat(value, buffer, format); +} + + +CFDataRef TSICTStringCreateRenderedData(TStringIRep* rep) +{ + return TSICTStringCreateDataFromIntermediateRepresentation(rep); +} + +CFDataRef TSICTStringCreateRenderedDataFromObjectWithFormat(CFTypeRef object, TSITStringFormat format) +{ + if (object == NULL) { + object = kCFNull; + } + + CFRetain(object); + + TStringIRep* rep = TSICTStringCreateWithObjectAndFormat(object, format); + CFDataRef data = TSICTStringCreateDataFromIntermediateRepresentation(rep); + + TSICTStringDestroy(rep); + CFRelease(object); + + return data; +} + +CFStringRef TSICTStringCreateRenderedString(TStringIRep* rep) +{ + return TSICTStringCreateStringFromIntermediateRepresentation(rep); +} + +CFStringRef TSICTStringCreateRenderedStringFromObjectWithFormat(CFTypeRef object, TSITStringFormat format) +{ + if (object == NULL) { + object = kCFNull; + } + + CFRetain(object); + + TStringIRep* rep = TSICTStringCreateWithObjectAndFormat(object, format); + CFStringRef string = TSICTStringCreateStringFromIntermediateRepresentation(rep); + + TSICTStringDestroy(rep); + CFRelease(object); + + return string; +} + + +TStringIRep* TSICTStringCreateWithObjectAndFormat(CFTypeRef object, TSITStringFormat format) +{ + if (object == NULL) { + return TSICTStringCreateNullWithFormat(format); + } + CFRetain(object); + + CFTypeID cfType = CFGetTypeID(object); + TStringIRep* rep = NULL; + + if (cfType == kCFDataTypeID) { + rep = TSICTStringCreateWithDataOfTypeAndFormat(object, kTSITStringTagString, format); + } else if (cfType == kCFStringTypeID) { + rep = TSICTStringCreateWithStringAndFormat(object, format); + } else if (cfType == kCFNumberTypeID) { + rep = TSICTStringCreateWithNumberAndFormat(object, format); + } else if (cfType == kCFBooleanTypeID) { + if (CFBooleanGetValue(object)) { + rep = TSICTStringCreateTrueWithFormat(format); + } else { + rep = TSICTStringCreateFalseWithFormat(format); + } + } else if (cfType == kCFNullTypeID) { + rep = TSICTStringCreateNullWithFormat(format); + } else if (cfType == kCFArrayTypeID) { + rep = TSICTStringCreateWithArrayAndFormat(object, format); + } else if (cfType == kCFDictionaryTypeID) { + rep = TSICTStringCreateWithDictionaryAndFormat(object, format); + } else { + rep = TSICTStringCreateInvalidWithFormat(format); + } + + CFRelease(object); + return rep; +} + +TStringIRep* TSICTStringCreateWithStringAndFormat(CFStringRef string, TSITStringFormat format) +{ + CFRetain(string); + CFDataRef data = CFStringCreateExternalRepresentation(kCFAllocatorDefault, string, kCFStringEncodingUTF8, '?'); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagString, format); + CFRelease(data); + CFRelease(string); + return rep; +} + +TStringIRep* TSICTStringCreateWithNumberAndFormat(CFNumberRef number, TSITStringFormat format) +{ + CFRetain(number); + TSITStringTag tag = kTSITStringTagNumber; + CFDataRef data; + CFNumberType numType = CFNumberGetType(number); + + switch(numType) { + case kCFNumberCharType: + { + int value; + if (CFNumberGetValue(number, kCFNumberIntType, &value)) { + if (value == 0 || value == 1) { + tag = kTSITStringTagBool; + } else { + tag = kTSITStringTagString; + } + } + break; + } + case kCFNumberFloat32Type: + case kCFNumberFloat64Type: + case kCFNumberFloatType: + case kCFNumberDoubleType: + { + tag = kTSITStringTagFloat; + break; + } + } + + if (tag == kTSITStringTagBool) { + bool value; + CFNumberGetValue(number, kCFNumberIntType, &value); + if (value) { + data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"true", 4); + } else { + data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"false", 5); + } + } else if (tag == kTSITStringTagFloat) { + char buf[32]; + char *p, *e; + double value; + + CFNumberGetValue(number, numType, &value); + sprintf(buf, "%#.15g", value); + + e = buf + strlen(buf); + p = e; + while (p[-1]=='0' && ('0' <= p[-2] && p[-2] <= '9')) { + p--; + } + memmove(p, e, strlen(e)+1); + + data = CFDataCreate(kCFAllocatorDefault, (UInt8*)buf, (CFIndex)strlen(buf)); + } else { + char buf[32]; + SInt64 value; + CFNumberGetValue(number, numType, &value); + sprintf(buf, "%lli", value); + data = CFDataCreate(kCFAllocatorDefault, (UInt8*)buf, (CFIndex)strlen(buf)); + } + + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, tag, format); + CFRelease(data); + CFRelease(number); + return rep; +} + +TStringIRep* TSICTStringCreateTrueWithFormat(TSITStringFormat format) +{ + CFDataRef data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"true", 4); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagBool, format); + CFRelease(data); + return rep; +} + +TStringIRep* TSICTStringCreateFalseWithFormat(TSITStringFormat format) +{ + CFDataRef data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"false", 5); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagBool, format); + CFRelease(data); + return rep; +} + +TStringIRep* TSICTStringCreateNullWithFormat(TSITStringFormat format) +{ + CFDataRef data = CFDataCreate(kCFAllocatorDefault, NULL, 0); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagNull, format); + CFRelease(data); + return rep; +} + +TStringIRep* TSICTStringCreateInvalidWithFormat(TSITStringFormat format) +{ + CFDataRef data = CFDataCreate(kCFAllocatorDefault, NULL, 0); + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagInvalid, format); + CFRelease(data); + return rep; +} + +TStringIRep* TSICTStringCreateWithArrayAndFormat(CFArrayRef array, TSITStringFormat format) +{ + CFRetain(array); + + CFMutableDataRef buffer = CFDataCreateMutable(kCFAllocatorDefault, 0); + + CFRange all = CFRangeMake(0, CFArrayGetCount(array)); + TStringCollectionCallbackContext cx = {buffer, format}; + CFArrayApplyFunction(array, all, ArrayBufferAppendCallback, &cx); + + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(buffer, kTSITStringTagList, format); + CFRelease(buffer); + CFRelease(array); + return rep; +} + +TStringIRep* TSICTStringCreateWithDictionaryAndFormat(CFDictionaryRef dictionary, TSITStringFormat format) +{ + CFRetain(dictionary); + + CFMutableDataRef buffer = CFDataCreateMutable(kCFAllocatorDefault, 0); + + TStringCollectionCallbackContext cx = {buffer, format}; + CFDictionaryApplyFunction(dictionary, DictionaryBufferAppendCallback, &cx); + + TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(buffer, kTSITStringTagDict, format); + CFRelease(buffer); + CFRelease(dictionary); + return rep; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/TSICTString.h b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/TSICTString.h new file mode 100644 index 000000000000..daf085c32f54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/TSICTString.h @@ -0,0 +1,74 @@ +// +// TSICTString.h +// TSITString +// +// Created by Travis Tilley on 9/27/11. +// + +#ifndef TSICTString_H +#define TSICTString_H + +#include <CoreFoundation/CoreFoundation.h> + + +typedef enum { + kTSITStringTagString = 0, + kTSITStringTagNumber = 1, + kTSITStringTagFloat = 2, + kTSITStringTagBool = 3, + kTSITStringTagNull = 4, + kTSITStringTagDict = 5, + kTSITStringTagList = 6, + kTSITStringTagInvalid = 7, +} TSITStringTag; + +extern const char* const TNetstringTypes; +extern const char* const OTNetstringTypes; +extern const UInt8 TNetstringSeparator; + +typedef enum { + kTSITStringFormatDefault = 0, + kTSITStringFormatOTNetstring = 1, + kTSITStringFormatTNetstring = 2, +} TSITStringFormat; + +extern TSITStringFormat TSITStringDefaultFormat; + +typedef struct TSITStringIntermediate { + CFDataRef data; + char* length; + TSITStringTag type; + TSITStringFormat format; +} TStringIRep; + +typedef struct { + CFMutableDataRef buffer; + TSITStringFormat format; +} TStringCollectionCallbackContext; + + +void Init_TSICTString(void); + +void TSICTStringSetDefaultFormat(TSITStringFormat format); +TSITStringFormat TSICTStringGetDefaultFormat(void); + +void TSICTStringDestroy(TStringIRep* rep); + +CFDataRef TSICTStringCreateRenderedData(TStringIRep* rep); +CFDataRef TSICTStringCreateRenderedDataFromObjectWithFormat(CFTypeRef object, TSITStringFormat format); + +CFStringRef TSICTStringCreateRenderedString(TStringIRep* rep); +CFStringRef TSICTStringCreateRenderedStringFromObjectWithFormat(CFTypeRef object, TSITStringFormat format); + +TStringIRep* TSICTStringCreateWithObjectAndFormat(CFTypeRef object, TSITStringFormat format); +TStringIRep* TSICTStringCreateWithStringAndFormat(CFStringRef string, TSITStringFormat format); +TStringIRep* TSICTStringCreateWithNumberAndFormat(CFNumberRef number, TSITStringFormat format); +TStringIRep* TSICTStringCreateTrueWithFormat(TSITStringFormat format); +TStringIRep* TSICTStringCreateFalseWithFormat(TSITStringFormat format); +TStringIRep* TSICTStringCreateNullWithFormat(TSITStringFormat format); +TStringIRep* TSICTStringCreateInvalidWithFormat(TSITStringFormat format); +TStringIRep* TSICTStringCreateWithArrayAndFormat(CFArrayRef array, TSITStringFormat format); +TStringIRep* TSICTStringCreateWithDictionaryAndFormat(CFDictionaryRef dictionary, TSITStringFormat format); + + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/cli.c b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/cli.c new file mode 100644 index 000000000000..6d36dd13dd57 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/cli.c @@ -0,0 +1,201 @@ +#include <getopt.h> +#include "cli.h" + +const char* cli_info_purpose = "A flexible command-line interface for the FSEvents API"; +const char* cli_info_usage = "Usage: fsevent_watch [OPTIONS]... [PATHS]..."; +const char* cli_info_help[] = { + " -h, --help you're looking at it", + " -V, --version print version number and exit", + " -p, --show-plist display the embedded Info.plist values", + " -s, --since-when=EventID fire historical events since ID", + " -l, --latency=seconds latency period (default='0.5')", + " -n, --no-defer enable no-defer latency modifier", + " -r, --watch-root watch for when the root path has changed", + // " -i, --ignore-self ignore current process", + " -F, --file-events provide file level event data", + " -f, --format=name output format (classic, niw, \n" + " tnetstring, otnetstring)", + 0 +}; + +static void default_args (struct cli_info* args_info) +{ + args_info->since_when_arg = kFSEventStreamEventIdSinceNow; + args_info->latency_arg = 0.5; + args_info->no_defer_flag = false; + args_info->watch_root_flag = false; + args_info->ignore_self_flag = false; + args_info->file_events_flag = false; + args_info->mark_self_flag = false; + args_info->format_arg = kFSEventWatchOutputFormatOTNetstring; +} + +static void cli_parser_release (struct cli_info* args_info) +{ + unsigned int i; + + for (i=0; i < args_info->inputs_num; ++i) { + free(args_info->inputs[i]); + } + + if (args_info->inputs_num) { + free(args_info->inputs); + } + + args_info->inputs_num = 0; +} + +void cli_parser_init (struct cli_info* args_info) +{ + default_args(args_info); + + args_info->inputs = 0; + args_info->inputs_num = 0; +} + +void cli_parser_free (struct cli_info* args_info) +{ + cli_parser_release(args_info); +} + +static void cli_print_info_dict (const void *key, + const void *value, + void *context) +{ + CFStringRef entry = CFStringCreateWithFormat(NULL, NULL, + CFSTR("%@:\n %@"), key, value); + if (entry) { + CFShow(entry); + CFRelease(entry); + } +} + +void cli_show_plist (void) +{ + CFBundleRef mainBundle = CFBundleGetMainBundle(); + CFRetain(mainBundle); + CFDictionaryRef mainBundleDict = CFBundleGetInfoDictionary(mainBundle); + if (mainBundleDict) { + CFRetain(mainBundleDict); + printf("Embedded Info.plist metadata:\n\n"); + CFDictionaryApplyFunction(mainBundleDict, cli_print_info_dict, NULL); + CFRelease(mainBundleDict); + } + CFRelease(mainBundle); + printf("\n"); +} + +void cli_print_version (void) +{ + printf("%s %s\n\n", CLI_NAME, CLI_VERSION); +#ifdef COMPILED_AT + printf("Compiled at: %s\n", COMPILED_AT); +#endif +#ifdef COMPILER + printf("Compiled with: %s\n", COMPILER); +#endif +#ifdef TARGET_CPU + printf("Compiled for: %s\n", TARGET_CPU); +#endif + printf("\n"); +} + +void cli_print_help (void) +{ + cli_print_version(); + + printf("\n%s\n", cli_info_purpose); + printf("\n%s\n", cli_info_usage); + printf("\n"); + + int i = 0; + while (cli_info_help[i]) { + printf("%s\n", cli_info_help[i++]); + } +} + +int cli_parser (int argc, const char** argv, struct cli_info* args_info) +{ + static struct option longopts[] = { + { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, 'V' }, + { "show-plist", no_argument, NULL, 'p' }, + { "since-when", required_argument, NULL, 's' }, + { "latency", required_argument, NULL, 'l' }, + { "no-defer", no_argument, NULL, 'n' }, + { "watch-root", no_argument, NULL, 'r' }, + { "ignore-self", no_argument, NULL, 'i' }, + { "file-events", no_argument, NULL, 'F' }, + { "mark-self", no_argument, NULL, 'm' }, + { "format", required_argument, NULL, 'f' }, + { 0, 0, 0, 0 } + }; + + const char* shortopts = "hVps:l:nriFf:"; + + int c = -1; + + while ((c = getopt_long(argc, (char * const*)argv, shortopts, longopts, NULL)) != -1) { + switch(c) { + case 's': // since-when + args_info->since_when_arg = strtoull(optarg, NULL, 0); + break; + case 'l': // latency + args_info->latency_arg = strtod(optarg, NULL); + break; + case 'n': // no-defer + args_info->no_defer_flag = true; + break; + case 'r': // watch-root + args_info->watch_root_flag = true; + break; + case 'i': // ignore-self + args_info->ignore_self_flag = true; + break; + case 'F': // file-events + args_info->file_events_flag = true; + break; + case 'm': // mark-self + args_info->mark_self_flag = true; + break; + case 'f': // format + if (strcmp(optarg, "classic") == 0) { + args_info->format_arg = kFSEventWatchOutputFormatClassic; + } else if (strcmp(optarg, "niw") == 0) { + args_info->format_arg = kFSEventWatchOutputFormatNIW; + } else if (strcmp(optarg, "tnetstring") == 0) { + args_info->format_arg = kFSEventWatchOutputFormatTNetstring; + } else if (strcmp(optarg, "otnetstring") == 0) { + args_info->format_arg = kFSEventWatchOutputFormatOTNetstring; + } else { + fprintf(stderr, "Unknown output format: %s\n", optarg); + exit(EXIT_FAILURE); + } + break; + case 'V': // version + cli_print_version(); + exit(EXIT_SUCCESS); + case 'p': // show-plist + cli_show_plist(); + exit(EXIT_SUCCESS); + case 'h': // help + case '?': // invalid option + case ':': // missing argument + cli_print_help(); + exit((c == 'h') ? EXIT_SUCCESS : EXIT_FAILURE); + } + } + + if (optind < argc) { + int i = 0; + args_info->inputs_num = (unsigned int)(argc - optind); + args_info->inputs = + (char**)(malloc ((args_info->inputs_num)*sizeof(char*))); + while (optind < argc) + if (argv[optind++] != argv[0]) { + args_info->inputs[i++] = strdup(argv[optind-1]); + } + } + + return EXIT_SUCCESS; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/cli.h b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/cli.h new file mode 100644 index 000000000000..2164995a5d8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/cli.h @@ -0,0 +1,45 @@ +#ifndef CLI_H +#define CLI_H + +#include "common.h" + +#ifndef CLI_NAME +#define CLI_NAME "fsevent_watch" +#endif /* CLI_NAME */ + +#ifndef PROJECT_VERSION +#error "PROJECT_VERSION not set" +#endif /* PROJECT_VERSION */ + +#ifndef CLI_VERSION +#define CLI_VERSION _xstr(PROJECT_VERSION) +#endif /* CLI_VERSION */ + + +struct cli_info { + UInt64 since_when_arg; + double latency_arg; + bool no_defer_flag; + bool watch_root_flag; + bool ignore_self_flag; + bool file_events_flag; + bool mark_self_flag; + enum FSEventWatchOutputFormat format_arg; + + char** inputs; + unsigned inputs_num; +}; + +extern const char* cli_info_purpose; +extern const char* cli_info_usage; +extern const char* cli_info_help[]; + +void cli_print_help(void); +void cli_print_version(void); + +int cli_parser (int argc, const char** argv, struct cli_info* args_info); +void cli_parser_init (struct cli_info* args_info); +void cli_parser_free (struct cli_info* args_info); + + +#endif /* CLI_H */ diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/common.h b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/common.h new file mode 100644 index 000000000000..b2d3e4ebf4f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/common.h @@ -0,0 +1,22 @@ +#ifndef fsevent_watch_common_h +#define fsevent_watch_common_h + +#include <CoreFoundation/CoreFoundation.h> +#ifdef __OBJC__ +#import <Foundation/Foundation.h> +#endif + +#include <CoreServices/CoreServices.h> +#include <unistd.h> +#include "compat.h" +#include "defines.h" +#include "TSICTString.h" + +enum FSEventWatchOutputFormat { + kFSEventWatchOutputFormatClassic, + kFSEventWatchOutputFormatNIW, + kFSEventWatchOutputFormatTNetstring, + kFSEventWatchOutputFormatOTNetstring +}; + +#endif /* fsevent_watch_common_h */ diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/compat.c b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/compat.c new file mode 100644 index 000000000000..5f51baff1171 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/compat.c @@ -0,0 +1,41 @@ +#include "compat.h" + + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_6) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) +FSEventStreamCreateFlags kFSEventStreamCreateFlagIgnoreSelf = 0x00000008; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_7) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) +FSEventStreamCreateFlags kFSEventStreamCreateFlagFileEvents = 0x00000010; +FSEventStreamEventFlags kFSEventStreamEventFlagItemCreated = 0x00000100; +FSEventStreamEventFlags kFSEventStreamEventFlagItemRemoved = 0x00000200; +FSEventStreamEventFlags kFSEventStreamEventFlagItemInodeMetaMod = 0x00000400; +FSEventStreamEventFlags kFSEventStreamEventFlagItemRenamed = 0x00000800; +FSEventStreamEventFlags kFSEventStreamEventFlagItemModified = 0x00001000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemFinderInfoMod = 0x00002000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemChangeOwner = 0x00004000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemXattrMod = 0x00008000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsFile = 0x00010000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsDir = 0x00020000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsSymlink = 0x00040000; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_9) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0) +FSEventStreamCreateFlags kFSEventStreamCreateFlagMarkSelf = 0x00000020; +FSEventStreamEventFlags kFSEventStreamEventFlagOwnEvent = 0x00080000; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_10) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0) +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsHardlink = 0x00100000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsLastHardlink = 0x00200000; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_13) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_11_0) +FSEventStreamCreateFlags kFSEventStreamCreateFlagUseExtendedData = 0x00000040; +FSEventStreamEventFlags kFSEventStreamEventFlagItemCloned = 0x00400000; +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/compat.h b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/compat.h new file mode 100644 index 000000000000..757b41356523 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/compat.h @@ -0,0 +1,100 @@ +/** + * @headerfile compat.h + * FSEventStream flag compatibility shim + * + * In order to compile a binary against an older SDK yet still support the + * features present in later OS releases, we need to define any missing enum + * constants not present in the older SDK. This allows us to safely defer + * feature detection to runtime (and avoid recompilation). + */ + + +#ifndef listen_fsevents_compat_h +#define listen_fsevents_compat_h + +#ifndef __CORESERVICES__ +#include <CoreServices/CoreServices.h> +#endif // __CORESERVICES__ + +#ifndef __AVAILABILITY__ +#include <Availability.h> +#endif // __AVAILABILITY__ + +#ifndef __MAC_10_6 +#define __MAC_10_6 1060 +#endif +#ifndef __MAC_10_7 +#define __MAC_10_7 1070 +#endif +#ifndef __MAC_10_9 +#define __MAC_10_9 1090 +#endif +#ifndef __MAC_10_10 +#define __MAC_10_10 101000 +#endif +#ifndef __MAC_10_13 +#define __MAC_10_13 101300 +#endif +#ifndef __IPHONE_6_0 +#define __IPHONE_6_0 60000 +#endif +#ifndef __IPHONE_7_0 +#define __IPHONE_7_0 70000 +#endif +#ifndef __IPHONE_9_0 +#define __IPHONE_9_0 90000 +#endif +#ifndef __IPHONE_11_0 +#define __IPHONE_11_0 110000 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_6) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) +extern FSEventStreamCreateFlags kFSEventStreamCreateFlagIgnoreSelf; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_7) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) +extern FSEventStreamCreateFlags kFSEventStreamCreateFlagFileEvents; +extern FSEventStreamEventFlags kFSEventStreamEventFlagItemCreated, + kFSEventStreamEventFlagItemRemoved, + kFSEventStreamEventFlagItemInodeMetaMod, + kFSEventStreamEventFlagItemRenamed, + kFSEventStreamEventFlagItemModified, + kFSEventStreamEventFlagItemFinderInfoMod, + kFSEventStreamEventFlagItemChangeOwner, + kFSEventStreamEventFlagItemXattrMod, + kFSEventStreamEventFlagItemIsFile, + kFSEventStreamEventFlagItemIsDir, + kFSEventStreamEventFlagItemIsSymlink; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_9) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0) +extern FSEventStreamCreateFlags kFSEventStreamCreateFlagMarkSelf; +extern FSEventStreamEventFlags kFSEventStreamEventFlagOwnEvent; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_10) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0) +extern FSEventStreamEventFlags kFSEventStreamEventFlagItemIsHardlink, + kFSEventStreamEventFlagItemIsLastHardlink; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_13) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_11_0) +extern FSEventStreamCreateFlags kFSEventStreamCreateFlagUseExtendedData; +extern FSEventStreamEventFlags kFSEventStreamEventFlagItemCloned; +#endif + + +#ifdef __cplusplus +} +#endif + +#endif // listen_fsevents_compat_h diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/defines.h b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/defines.h new file mode 100644 index 000000000000..6f6e87b08ac3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/defines.h @@ -0,0 +1,40 @@ +#ifndef fsevent_watch_defines_h +#define fsevent_watch_defines_h + +#define _str(s) #s +#define _xstr(s) _str(s) + +#define COMPILED_AT __DATE__ " " __TIME__ + +#if defined (__clang__) +#define COMPILER "clang " __clang_version__ +#elif defined (__GNUC__) +#define COMPILER "gcc " __VERSION__ +#else +#define COMPILER "unknown" +#endif + +#if defined(__ppc__) +#define TARGET_CPU "ppc" +#elif defined(__ppc64__) +#define TARGET_CPU "ppc64" +#elif defined(__i386__) +#define TARGET_CPU "i386" +#elif defined(__x86_64__) +#define TARGET_CPU "x86_64" +#else +#define TARGET_CPU "unknown" +#endif + +#define FLAG_CHECK(flags, flag) ((flags) & (flag)) + +#define FPRINTF_FLAG_CHECK(flags, flag, msg, fd) \ + do { \ + if (FLAG_CHECK(flags, flag)) { \ + fprintf(fd, "%s", msg "\n"); } } \ + while (0) + +#define FLAG_CHECK_STDERR(flags, flag, msg) \ + FPRINTF_FLAG_CHECK(flags, flag, msg, stderr) + +#endif /* fsevent_watch_defines_h */ diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/main.c b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/main.c new file mode 100644 index 000000000000..b18596a60345 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/main.c @@ -0,0 +1,548 @@ +#include "common.h" +#include "signal_handlers.h" +#include "cli.h" +#include "FSEventsFix.h" + +// TODO: set on fire. cli.{h,c} handle both parsing and defaults, so there's +// no need to set those here. also, in order to scope metadata by path, +// each stream will need its own configuration... so this won't work as +// a global any more. In the end the goal is to make the output format +// able to declare not just that something happened and what flags were +// attached, but what path it was watching that caused those events (so +// that the path itself can be used for routing that information to the +// relevant callback). +// +// Structure for storing metadata parsed from the commandline +static struct { + FSEventStreamEventId sinceWhen; + CFTimeInterval latency; + FSEventStreamCreateFlags flags; + CFMutableArrayRef paths; + enum FSEventWatchOutputFormat format; +} config = { + (UInt64) kFSEventStreamEventIdSinceNow, + (double) 0.3, + (CFOptionFlags) kFSEventStreamCreateFlagNone, + NULL, + kFSEventWatchOutputFormatOTNetstring +}; + +// Prototypes +static void append_path(const char* path); +static inline void parse_cli_settings(int argc, const char* argv[]); +static void callback(FSEventStreamRef streamRef, + void* clientCallBackInfo, + size_t numEvents, + void* eventPaths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]); +static bool needs_fsevents_fix = false; + +// Resolve a path and append it to the CLI settings structure +// The FSEvents API will, internally, resolve paths using a similar scheme. +// Performing this ahead of time makes things less confusing, IMHO. +static void append_path(const char* path) +{ +#ifdef DEBUG + fprintf(stderr, "\n"); + fprintf(stderr, "append_path called for: %s\n", path); +#endif + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + +#ifdef DEBUG + fprintf(stderr, "compiled against 10.6+, using CFURLCreateFileReferenceURL\n"); +#endif + + CFURLRef url = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)path, (CFIndex)strlen(path), false); + CFURLRef placeholder = CFURLCopyAbsoluteURL(url); + CFRelease(url); + + CFMutableArrayRef imaginary = NULL; + + // if we don't have an existing url, spin until we get to a parent that + // does exist, saving any imaginary components for appending back later + while(!CFURLResourceIsReachable(placeholder, NULL)) { +#ifdef DEBUG + fprintf(stderr, "path does not exist\n"); +#endif + + CFStringRef child; + + if (imaginary == NULL) { + imaginary = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); + } + + child = CFURLCopyLastPathComponent(placeholder); + CFArrayInsertValueAtIndex(imaginary, 0, child); + CFRelease(child); + + url = CFURLCreateCopyDeletingLastPathComponent(NULL, placeholder); + CFRelease(placeholder); + placeholder = url; + +#ifdef DEBUG + fprintf(stderr, "parent: "); + CFShow(placeholder); +#endif + } + +#ifdef DEBUG + fprintf(stderr, "path exists\n"); +#endif + + // realpath() doesn't always return the correct case for a path, so this + // is a funky workaround that converts a path into a (volId/inodeId) pair + // and asks what the path should be for that. since it looks at the actual + // inode instead of returning the same case passed in like realpath() + // appears to do for HFS+, it should always be correct. + url = CFURLCreateFileReferenceURL(NULL, placeholder, NULL); + CFRelease(placeholder); + placeholder = CFURLCreateFilePathURL(NULL, url, NULL); + CFRelease(url); + +#ifdef DEBUG + fprintf(stderr, "path resolved to: "); + CFShow(placeholder); +#endif + + // if we stripped off any imaginary path components, append them back on + if (imaginary != NULL) { + CFIndex count = CFArrayGetCount(imaginary); + for (CFIndex i = 0; i<count; i++) { + CFStringRef component = CFArrayGetValueAtIndex(imaginary, i); +#ifdef DEBUG + fprintf(stderr, "appending component: "); + CFShow(component); +#endif + url = CFURLCreateCopyAppendingPathComponent(NULL, placeholder, component, false); + CFRelease(placeholder); + placeholder = url; + } + CFRelease(imaginary); + } + +#ifdef DEBUG + fprintf(stderr, "result: "); + CFShow(placeholder); +#endif + + CFStringRef cfPath = CFURLCopyFileSystemPath(placeholder, kCFURLPOSIXPathStyle); + CFRelease(placeholder); + + char cPath[PATH_MAX]; + if (CFStringGetCString(cfPath, cPath, PATH_MAX, kCFStringEncodingUTF8)) { + FSEventsFixRepairStatus status = FSEventsFixRepairIfNeeded(cPath); + if (status == FSEventsFixRepairStatusFailed) { + needs_fsevents_fix = true; + } + } + + CFArrayAppendValue(config.paths, cfPath); + CFRelease(cfPath); + +#else + +#ifdef DEBUG + fprintf(stderr, "compiled against 10.5, using realpath()\n"); +#endif + + char fullPath[PATH_MAX + 1]; + + if (realpath(path, fullPath) == NULL) { +#ifdef DEBUG + fprintf(stderr, " realpath not directly resolvable from path\n"); +#endif + + if (path[0] != '/') { +#ifdef DEBUG + fprintf(stderr, " passed path is not absolute\n"); +#endif + size_t len; + getcwd(fullPath, sizeof(fullPath)); +#ifdef DEBUG + fprintf(stderr, " result of getcwd: %s\n", fullPath); +#endif + len = strlen(fullPath); + fullPath[len] = '/'; + strlcpy(&fullPath[len + 1], path, sizeof(fullPath) - (len + 1)); + } else { +#ifdef DEBUG + fprintf(stderr, " assuming path does not YET exist\n"); +#endif + strlcpy(fullPath, path, sizeof(fullPath)); + } + } + +#ifdef DEBUG + fprintf(stderr, " resolved path to: %s\n", fullPath); + fprintf(stderr, "\n"); +#endif + + CFStringRef pathRef = CFStringCreateWithCString(kCFAllocatorDefault, + fullPath, + kCFStringEncodingUTF8); + CFArrayAppendValue(config.paths, pathRef); + CFRelease(pathRef); + +#endif +} + +// Parse commandline settings +static inline void parse_cli_settings(int argc, const char* argv[]) +{ + // runtime os version detection + SInt32 osMajorVersion, osMinorVersion; + if (!(Gestalt(gestaltSystemVersionMajor, &osMajorVersion) == noErr)) { + osMajorVersion = 0; + } + if (!(Gestalt(gestaltSystemVersionMinor, &osMinorVersion) == noErr)) { + osMinorVersion = 0; + } + + if ((osMajorVersion == 10) & (osMinorVersion < 5)) { + fprintf(stderr, "The FSEvents API is unavailable on this version of macos!\n"); + exit(EXIT_FAILURE); + } + + struct cli_info args_info; + cli_parser_init(&args_info); + + if (cli_parser(argc, argv, &args_info) != 0) { + exit(EXIT_FAILURE); + } + + config.paths = CFArrayCreateMutable(NULL, + (CFIndex)0, + &kCFTypeArrayCallBacks); + + config.sinceWhen = args_info.since_when_arg; + config.latency = args_info.latency_arg; + config.format = args_info.format_arg; + + if (args_info.no_defer_flag) { + config.flags |= kFSEventStreamCreateFlagNoDefer; + } + if (args_info.watch_root_flag) { + config.flags |= kFSEventStreamCreateFlagWatchRoot; + } + + if (args_info.ignore_self_flag) { + if ((osMajorVersion == 10) & (osMinorVersion >= 6)) { + config.flags |= kFSEventStreamCreateFlagIgnoreSelf; + } else { + fprintf(stderr, "MacOSX 10.6 or later is required for --ignore-self\n"); + exit(EXIT_FAILURE); + } + } + + if (args_info.file_events_flag) { + if ((osMajorVersion == 10) & (osMinorVersion >= 7)) { + config.flags |= kFSEventStreamCreateFlagFileEvents; + } else { + fprintf(stderr, "MacOSX 10.7 or later required for --file-events\n"); + exit(EXIT_FAILURE); + } + } + + if (args_info.mark_self_flag) { + if ((osMajorVersion == 10) & (osMinorVersion >= 9)) { + config.flags |= kFSEventStreamCreateFlagMarkSelf; + } else { + fprintf(stderr, "MacOSX 10.9 or later required for --mark-self\n"); + exit(EXIT_FAILURE); + } + } + + if (args_info.inputs_num == 0) { + append_path("."); + } else { + for (unsigned int i=0; i < args_info.inputs_num; ++i) { + append_path(args_info.inputs[i]); + } + } + + cli_parser_free(&args_info); + +#ifdef DEBUG + fprintf(stderr, "config.sinceWhen %llu\n", config.sinceWhen); + fprintf(stderr, "config.latency %f\n", config.latency); + +// STFU clang +#if defined(__LP64__) + fprintf(stderr, "config.flags %#.8x\n", config.flags); +#else + fprintf(stderr, "config.flags %#.8lx\n", config.flags); +#endif + + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagUseCFTypes, + " Using CF instead of C types"); + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagNoDefer, + " NoDefer latency modifier enabled"); + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagWatchRoot, + " WatchRoot notifications enabled"); + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagIgnoreSelf, + " IgnoreSelf enabled"); + FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagFileEvents, + " FileEvents enabled"); + + fprintf(stderr, "config.paths\n"); + + long numpaths = CFArrayGetCount(config.paths); + + for (long i = 0; i < numpaths; i++) { + char path[PATH_MAX]; + CFStringGetCString(CFArrayGetValueAtIndex(config.paths, i), + path, + PATH_MAX, + kCFStringEncodingUTF8); + fprintf(stderr, " %s\n", path); + } + + fprintf(stderr, "\n"); +#endif +} + +// original output format for rb-fsevent +static void classic_output_format(size_t numEvents, + char** paths) +{ + for (size_t i = 0; i < numEvents; i++) { + fprintf(stdout, "%s:", paths[i]); + } + fprintf(stdout, "\n"); +} + +// output format used in the Yoshimasa Niwa branch of rb-fsevent +static void niw_output_format(size_t numEvents, + char** paths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]) +{ + for (size_t i = 0; i < numEvents; i++) { + fprintf(stdout, "%lu:%llu:%s\n", + (unsigned long)eventFlags[i], + (unsigned long long)eventIds[i], + paths[i]); + } + fprintf(stdout, "\n"); +} + +static void tstring_output_format(size_t numEvents, + char** paths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[], + TSITStringFormat format) +{ + CFMutableArrayRef events = CFArrayCreateMutable(kCFAllocatorDefault, + 0, &kCFTypeArrayCallBacks); + + for (size_t i = 0; i < numEvents; i++) { + CFMutableDictionaryRef event = CFDictionaryCreateMutable(kCFAllocatorDefault, + 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + CFStringRef path = CFStringCreateWithBytes(kCFAllocatorDefault, + (const UInt8*)paths[i], + (CFIndex)strlen(paths[i]), + kCFStringEncodingUTF8, + false); + CFDictionarySetValue(event, CFSTR("path"), path); + + CFNumberRef ident = CFNumberCreate(kCFAllocatorDefault, kCFNumberLongLongType, &eventIds[i]); + CFDictionarySetValue(event, CFSTR("id"), ident); + + CFNumberRef cflags = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &eventFlags[i]); + CFDictionarySetValue(event, CFSTR("cflags"), cflags); + + CFMutableArrayRef flags = CFArrayCreateMutable(kCFAllocatorDefault, + 0, &kCFTypeArrayCallBacks); + +#define FLAG_ADD_NAME(flagsnum, flagnum, flagname, flagarray) \ + do { \ + if (FLAG_CHECK(flagsnum, flagnum)) { \ + CFArrayAppendValue(flagarray, CFSTR(flagname)); } } \ + while(0) + + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagMustScanSubDirs, "MustScanSubDirs", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagUserDropped, "UserDropped", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagKernelDropped, "KernelDropped", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagEventIdsWrapped, "EventIdsWrapped", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagHistoryDone, "HistoryDone", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagRootChanged, "RootChanged", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagMount, "Mount", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagUnmount, "Unmount", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemCreated, "ItemCreated", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemRemoved, "ItemRemoved", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemInodeMetaMod, "ItemInodeMetaMod", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemRenamed, "ItemRenamed", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemModified, "ItemModified", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemFinderInfoMod, "ItemFinderInfoMod", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemChangeOwner, "ItemChangeOwner", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemXattrMod, "ItemXattrMod", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsFile, "ItemIsFile", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsDir, "ItemIsDir", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsSymlink, "ItemIsSymlink", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagOwnEvent, "OwnEvent", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsHardlink, "ItemIsHardLink", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsLastHardlink, "ItemIsLastHardLink", flags); + + CFDictionarySetValue(event, CFSTR("flags"), flags); + + + CFArrayAppendValue(events, event); + + CFRelease(event); + CFRelease(path); + CFRelease(ident); + CFRelease(cflags); + CFRelease(flags); + } + + CFMutableDictionaryRef meta = CFDictionaryCreateMutable(kCFAllocatorDefault, + 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + CFDictionarySetValue(meta, CFSTR("events"), events); + + CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberCFIndexType, &numEvents); + CFDictionarySetValue(meta, CFSTR("numEvents"), num); + + CFDataRef data = TSICTStringCreateRenderedDataFromObjectWithFormat(meta, format); + fprintf(stdout, "%s", CFDataGetBytePtr(data)); + + CFRelease(events); + CFRelease(num); + CFRelease(meta); + CFRelease(data); +} + +static void callback(__attribute__((unused)) FSEventStreamRef streamRef, + __attribute__((unused)) void* clientCallBackInfo, + size_t numEvents, + void* eventPaths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]) +{ + char** paths = eventPaths; + + +#ifdef DEBUG + fprintf(stderr, "\n"); + fprintf(stderr, "FSEventStreamCallback fired!\n"); + fprintf(stderr, " numEvents: %lu\n", numEvents); + + for (size_t i = 0; i < numEvents; i++) { + fprintf(stderr, "\n"); + fprintf(stderr, " event ID: %llu\n", eventIds[i]); + +// STFU clang +#if defined(__LP64__) + fprintf(stderr, " event flags: %#.8x\n", eventFlags[i]); +#else + fprintf(stderr, " event flags: %#.8lx\n", eventFlags[i]); +#endif + + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagMustScanSubDirs, + " Recursive scanning of directory required"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagUserDropped, + " Buffering problem: events dropped user-side"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagKernelDropped, + " Buffering problem: events dropped kernel-side"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagEventIdsWrapped, + " Event IDs have wrapped"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagHistoryDone, + " All historical events have been processed"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagRootChanged, + " Root path has changed"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagMount, + " A new volume was mounted at this path"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagUnmount, + " A volume was unmounted from this path"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemCreated, + " Item created"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemRemoved, + " Item removed"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemInodeMetaMod, + " Item metadata modified"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemRenamed, + " Item renamed"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemModified, + " Item modified"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemFinderInfoMod, + " Item Finder Info modified"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemChangeOwner, + " Item changed ownership"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemXattrMod, + " Item extended attributes modified"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsFile, + " Item is a file"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsDir, + " Item is a directory"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsSymlink, + " Item is a symbolic link"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsHardlink, + " Item is a hard link"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsLastHardlink, + " Item is the last hard link"); + fprintf(stderr, " event path: %s\n", paths[i]); + fprintf(stderr, "\n"); + } + + fprintf(stderr, "\n"); +#endif + + if (config.format == kFSEventWatchOutputFormatClassic) { + classic_output_format(numEvents, paths); + } else if (config.format == kFSEventWatchOutputFormatNIW) { + niw_output_format(numEvents, paths, eventFlags, eventIds); + } else if (config.format == kFSEventWatchOutputFormatTNetstring) { + tstring_output_format(numEvents, paths, eventFlags, eventIds, + kTSITStringFormatTNetstring); + } else if (config.format == kFSEventWatchOutputFormatOTNetstring) { + tstring_output_format(numEvents, paths, eventFlags, eventIds, + kTSITStringFormatOTNetstring); + } + + fflush(stdout); +} + +int main(int argc, const char* argv[]) +{ + install_signal_handlers(); + parse_cli_settings(argc, argv); + + if (needs_fsevents_fix) { + FSEventsFixEnable(); + } + + FSEventStreamContext context = {0, NULL, NULL, NULL, NULL}; + FSEventStreamRef stream; + stream = FSEventStreamCreate(kCFAllocatorDefault, + (FSEventStreamCallback)&callback, + &context, + config.paths, + config.sinceWhen, + config.latency, + config.flags); + +#ifdef DEBUG + FSEventStreamShow(stream); + fprintf(stderr, "\n"); +#endif + + if (needs_fsevents_fix) { + FSEventsFixDisable(); + } + + FSEventStreamScheduleWithRunLoop(stream, + CFRunLoopGetCurrent(), + kCFRunLoopDefaultMode); + FSEventStreamStart(stream); + CFRunLoopRun(); + FSEventStreamFlushSync(stream); + FSEventStreamStop(stream); + + return 0; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/signal_handlers.c b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/signal_handlers.c new file mode 100644 index 000000000000..b20da3f3813f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/signal_handlers.c @@ -0,0 +1,66 @@ +#include "signal_handlers.h" +#include <fcntl.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/time.h> +#include <unistd.h> + + +#define PPID_ALARM_INTERVAL 2 // send SIGALRM every this seconds + + +static pid_t orig_ppid; + + +static void signal_handler(int _) { + exit(EXIT_FAILURE); +} + +static void check_ppid(void) { + if (getppid() != orig_ppid) { + exit(EXIT_FAILURE); + } +} + +static void check_stdout_open(void) { + if (fcntl(STDOUT_FILENO, F_GETFD) < 0) { + exit(EXIT_FAILURE); + } +} + +static void alarm_handler(int _) { + check_ppid(); + check_stdout_open(); + alarm(PPID_ALARM_INTERVAL); + signal(SIGALRM, alarm_handler); +} + +static void die(const char *msg) { + fprintf(stderr, "\nFATAL: %s\n", msg); + abort(); +} + +static void install_signal_handler(int sig, void (*handler)(int)) { + if (signal(sig, handler) == SIG_ERR) { + die("Could not install signal handler"); + } +} + +void install_signal_handlers(void) { + // check pipe is still connected + check_stdout_open(); + + // watch getppid() every PPID_ALARM_INTERVAL seconds + orig_ppid = getppid(); + if (orig_ppid <= 1) { + die("prematurely zombied"); + } + install_signal_handler(SIGALRM, alarm_handler); + alarm(PPID_ALARM_INTERVAL); + + // be sure to exit on SIGHUP, SIGPIPE + install_signal_handler(SIGHUP, signal_handler); + install_signal_handler(SIGPIPE, signal_handler); +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/signal_handlers.h b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/signal_handlers.h new file mode 100644 index 000000000000..c31685d9ec8c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/fsevent_watch/signal_handlers.h @@ -0,0 +1,16 @@ +/** + * @headerfile signal_handlers.h + * Signal handlers to stop the zombie hordes + * + * Catch and handle signals better so that we die faster like a good meat puppet. + */ + + +#ifndef fsevent_watch_signal_handlers_h +#define fsevent_watch_signal_handlers_h + + +void install_signal_handlers(void); + + +#endif // fsevent_watch_signal_handlers_h diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/rakefile.rb b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/rakefile.rb new file mode 100644 index 000000000000..d7789bdc31d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/ext/rakefile.rb @@ -0,0 +1,226 @@ +# -*- encoding: utf-8 -*- +require 'rubygems' unless defined?(Gem) +require 'pathname' +require 'date' +require 'time' +require 'rake/clean' + +raise "unable to find xcodebuild" unless system('which', 'xcodebuild') + + +FSEVENT_WATCH_EXE_VERSION = '0.1.5' + +$this_dir = Pathname.new(__FILE__).dirname.expand_path +$final_exe = $this_dir.parent.join('bin/fsevent_watch') + +$src_dir = $this_dir.join('fsevent_watch') +$obj_dir = $this_dir.join('build') + +SRC = Pathname.glob("#{$src_dir}/*.c") +OBJ = SRC.map {|s| $obj_dir.join("#{s.basename('.c')}.o")} + +$now = DateTime.now.xmlschema rescue Time.now.xmlschema + +$CC = ENV['CC'] || `which clang || which gcc`.strip +$CFLAGS = ENV['CFLAGS'] || '-fconstant-cfstrings -fasm-blocks -fstrict-aliasing -Wall' +$ARCHFLAGS = ENV['ARCHFLAGS'] || '-arch x86_64' +$DEFINES = "-DNS_BUILD_32_LIKE_64 -DNS_BLOCK_ASSERTIONS -DPROJECT_VERSION=#{FSEVENT_WATCH_EXE_VERSION}" + +$GCC_C_LANGUAGE_STANDARD = ENV['GCC_C_LANGUAGE_STANDARD'] || 'gnu11' + +# generic developer id name so it'll match correctly for anyone who has only +# one developer id in their keychain (not that I expect anyone else to bother) +$CODE_SIGN_IDENTITY = 'Developer ID Application' + +$arch = `uname -m`.strip +$os_release = `uname -r`.strip +$BUILD_TRIPLE = "#{$arch}-apple-darwin#{$os_release}" + +$CCVersion = `#{$CC} --version | head -n 1`.strip + + +CLEAN.include OBJ.map(&:to_s) +CLEAN.include $obj_dir.join('Info.plist').to_s +CLEAN.include $obj_dir.join('fsevent_watch').to_s +CLOBBER.include $final_exe.to_s + + +task :sw_vers do + $mac_product_version = `sw_vers -productVersion`.strip + $mac_build_version = `sw_vers -buildVersion`.strip + $MACOSX_DEPLOYMENT_TARGET = ENV['MACOSX_DEPLOYMENT_TARGET'] || $mac_product_version.sub(/\.\d*$/, '') + $CFLAGS = "#{$CFLAGS} -mmacosx-version-min=#{$MACOSX_DEPLOYMENT_TARGET}" +end + +task :get_sdk_info => :sw_vers do + $SDK_INFO = {} + version_info = `xcodebuild -version -sdk macosx#{$MACOSX_DEPLOYMENT_TARGET}` + raise "invalid SDK" unless !!$?.exitstatus + version_info.strip.each_line do |line| + next if line.strip.empty? + next unless line.include?(':') + match = line.match(/([^:]*): (.*)/) + next unless match + $SDK_INFO[match[1]] = match[2] + end +end + +task :debug => :sw_vers do + $DEFINES = "-DDEBUG #{$DEFINES}" + $CFLAGS = "#{$CFLAGS} -O0 -fno-omit-frame-pointer -g" +end + +task :release => :sw_vers do + $DEFINES = "-DNDEBUG #{$DEFINES}" + $CFLAGS = "#{$CFLAGS} -Ofast" +end + +desc 'configure build type depending on whether ENV var FWDEBUG is set' +task :set_build_type => :sw_vers do + if ENV['FWDEBUG'] + Rake::Task[:debug].invoke + else + Rake::Task[:release].invoke + end +end + +desc 'set build arch to ppc' +task :ppc do + $ARCHFLAGS = '-arch ppc' +end + +desc 'set build arch to x86_64' +task :x86_64 do + $ARCHFLAGS = '-arch x86_64' +end + +desc 'set build arch to i386' +task :x86 do + $ARCHFLAGS = '-arch i386' +end + +task :setup_env => [:set_build_type, :sw_vers, :get_sdk_info] + +directory $obj_dir.to_s +file $obj_dir.to_s => :setup_env + +SRC.zip(OBJ).each do |source, object| + file object.to_s => [source.to_s, $obj_dir.to_s] do + cmd = [ + $CC, + $ARCHFLAGS, + "-std=#{$GCC_C_LANGUAGE_STANDARD}", + $CFLAGS, + $DEFINES, + "-I#{$src_dir}", + '-isysroot', + $SDK_INFO['Path'], + '-c', source, + '-o', object + ] + sh(cmd.map {|s| s.to_s}.join(' ')) + end +end + +file $obj_dir.join('Info.plist').to_s => [$obj_dir.to_s, :setup_env] do + File.open($obj_dir.join('Info.plist').to_s, 'w+') do |file| + indentation = '' + indent = lambda {|num| indentation = ' ' * num } + add = lambda {|str| file << "#{indentation}#{str}\n" } + key = lambda {|str| add["<key>#{str}</key>"] } + string = lambda {|str| add["<string>#{str}</string>"] } + + + add['<?xml version="1.0" encoding="UTF-8"?>'] + add['<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">'] + add['<plist version="1.0">'] + + indent[2] + add['<dict>'] + indent[4] + + key['CFBundleExecutable'] + string['fsevent_watch'] + key['CFBundleIdentifier'] + string['com.teaspoonofinsanity.fsevent_watch'] + key['CFBundleName'] + string['fsevent_watch'] + key['CFBundleDisplayName'] + string['FSEvent Watch CLI'] + key['NSHumanReadableCopyright'] + string['Copyright (C) 2011-2017 Travis Tilley'] + + key['CFBundleVersion'] + string["#{FSEVENT_WATCH_EXE_VERSION}"] + key['LSMinimumSystemVersion'] + string["#{$MACOSX_DEPLOYMENT_TARGET}"] + key['DTSDKBuild'] + string["#{$SDK_INFO['ProductBuildVersion']}"] + key['DTSDKName'] + string["macosx#{$SDK_INFO['SDKVersion']}"] + key['DTSDKPath'] + string["#{$SDK_INFO['Path']}"] + key['BuildMachineOSBuild'] + string["#{$mac_build_version}"] + key['BuildMachineOSVersion'] + string["#{$mac_product_version}"] + key['FSEWCompiledAt'] + string["#{$now}"] + key['FSEWVersionInfoBuilder'] + string["#{`whoami`.strip}"] + key['FSEWBuildTriple'] + string["#{$BUILD_TRIPLE}"] + key['FSEWCC'] + string["#{$CC}"] + key['FSEWCCVersion'] + string["#{$CCVersion}"] + key['FSEWCFLAGS'] + string["#{$CFLAGS}"] + + indent[2] + add['</dict>'] + indent[0] + + add['</plist>'] + end +end + +desc 'generate an Info.plist used for code signing as well as embedding build settings into the resulting binary' +task :plist => $obj_dir.join('Info.plist').to_s + + +file $obj_dir.join('fsevent_watch').to_s => [$obj_dir.to_s, $obj_dir.join('Info.plist').to_s] + OBJ.map(&:to_s) do + cmd = [ + $CC, + $ARCHFLAGS, + "-std=#{$GCC_C_LANGUAGE_STANDARD}", + $CFLAGS, + $DEFINES, + "-I#{$src_dir}", + '-isysroot', + $SDK_INFO['Path'], + '-framework CoreFoundation -framework CoreServices', + '-sectcreate __TEXT __info_plist', + $obj_dir.join('Info.plist') + ] + OBJ + [ + '-o', $obj_dir.join('fsevent_watch') + ] + sh(cmd.map {|s| s.to_s}.join(' ')) +end + +desc 'compile and link build/fsevent_watch' +task :build => $obj_dir.join('fsevent_watch').to_s + +desc 'codesign build/fsevent_watch binary' +task :codesign => :build do + sh "codesign -s '#{$CODE_SIGN_IDENTITY}' #{$obj_dir.join('fsevent_watch')}" +end + +directory $this_dir.parent.join('bin') + +desc 'replace bundled fsevent_watch binary with build/fsevent_watch' +task :replace_exe => [$this_dir.parent.join('bin'), :build] do + sh "mv #{$obj_dir.join('fsevent_watch')} #{$final_exe}" +end + +task :default => [:replace_exe, :clean] diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/otnetstring.rb b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/otnetstring.rb new file mode 100644 index 000000000000..cd8de4c253c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/otnetstring.rb @@ -0,0 +1,85 @@ +# Copyright (c) 2011 Konstantin Haase +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +require 'stringio' + +module OTNetstring + class Error < StandardError; end + + class << self + def parse(io, encoding = 'internal', fallback_encoding = nil) + fallback_encoding = io.encoding if io.respond_to? :encoding + io = StringIO.new(io) if io.respond_to? :to_str + length, byte = "", nil + + while byte.nil? || byte =~ /\d/ + length << byte if byte + byte = io.read(1) + end + + if length.size > 9 + raise Error, "#{length} is longer than 9 digits" + elsif length !~ /\d+/ + raise Error, "Expected '#{byte}' to be a digit" + end + length = Integer(length) + + case byte + when '#' then Integer io.read(length) + when ',' then with_encoding io.read(length), encoding, fallback_encoding + when '~' then + raise Error, "nil has length of 0, #{length} given" unless length == 0 + when '!' then io.read(length) == 'true' + when '[', '{' + array = [] + start = io.pos + array << parse(io, encoding, fallback_encoding) while io.pos - start < length + raise Error, 'Nested element longer than container' if io.pos - start != length + byte == "{" ? Hash[*array] : array + else + raise Error, "Unknown type '#{byte}'" + end + end + + def encode(obj, string_sep = ',') + case obj + when String then with_encoding "#{obj.bytesize}#{string_sep}#{obj}", "binary" + when Integer then encode(obj.inspect, '#') + when NilClass then "0~" + when Array then encode(obj.map { |e| encode(e) }.join, '[') + when Hash then encode(obj.map { |a,b| encode(a)+encode(b) }.join, '{') + when FalseClass, TrueClass then encode(obj.inspect, '!') + else raise Error, 'cannot encode %p' % obj + end + end + + private + + def with_encoding(str, encoding, fallback = nil) + return str unless str.respond_to? :encode + encoding = Encoding.find encoding if encoding.respond_to? :to_str + encoding ||= fallback + encoding ? str.encode(encoding) : str + rescue EncodingError + str.force_encoding(encoding) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/rb-fsevent.rb b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/rb-fsevent.rb new file mode 100644 index 000000000000..1ff68a309553 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/rb-fsevent.rb @@ -0,0 +1,3 @@ +# -*- encoding: utf-8 -*- +require 'rb-fsevent/fsevent' +require 'rb-fsevent/version' diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/rb-fsevent/fsevent.rb b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/rb-fsevent/fsevent.rb new file mode 100644 index 000000000000..23c5aa9edd78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/rb-fsevent/fsevent.rb @@ -0,0 +1,157 @@ +# -*- encoding: utf-8 -*- + +require 'otnetstring' + +class FSEvent + class << self + class_eval <<-END + def root_path + "#{File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))}" + end + END + class_eval <<-END + def watcher_path + "#{File.join(FSEvent.root_path, 'bin', 'fsevent_watch')}" + end + END + end + + attr_reader :paths, :callback + + def initialize args = nil, &block + watch(args, &block) unless args.nil? + end + + def watch(watch_paths, options=nil, &block) + @paths = watch_paths.kind_of?(Array) ? watch_paths : [watch_paths] + @callback = block + + if options.kind_of?(Hash) + @options = parse_options(options) + elsif options.kind_of?(Array) + @options = options + else + @options = [] + end + end + + def run + @pipe = open_pipe + @running = true + + # please note the use of IO::select() here, as it is used specifically to + # preserve correct signal handling behavior in ruby 1.8. + while @running && IO::select([@pipe], nil, nil, nil) + # managing the IO ourselves allows us to be careful and never pass an + # incomplete message to OTNetstring.parse() + message = "" + length = "" + byte = nil + + reading_length = true + found_length = false + + while reading_length + byte = @pipe.read_nonblock(1) + if "#{byte}" =~ /\d/ + length << byte + found_length = true + elsif found_length == false + next + else + reading_length = false + end + end + length = Integer(length, 10) + type = byte + + message << "#{length}#{type}" + message << @pipe.read(length) + + decoded = OTNetstring.parse(message) + modified_paths = decoded["events"].map {|event| event["path"]} + # passing the full info as a second block param feels icky, but such is + # the trap of backward compatibility. + case callback.arity + when 1 + callback.call(modified_paths) + when 2 + callback.call(modified_paths, decoded) + end + end + rescue Interrupt, IOError, Errno::EBADF + ensure + stop + end + + def stop + unless @pipe.nil? + Process.kill('KILL', @pipe.pid) if process_running?(@pipe.pid) + @pipe.close + end + rescue IOError + ensure + @running = false + end + + def process_running?(pid) + begin + Process.kill(0, pid) + true + rescue Errno::ESRCH + false + end + end + + if RUBY_VERSION < '1.9' + def open_pipe + IO.popen("'#{self.class.watcher_path}' #{options_string} #{shellescaped_paths}") + end + + private + + def options_string + @options.join(' ') + end + + def shellescaped_paths + @paths.map {|path| shellescape(path)}.join(' ') + end + + # for Ruby 1.8.6 support + def shellescape(str) + # An empty argument will be skipped, so return empty quotes. + return "''" if str.empty? + + str = str.dup + + # Process as a single byte sequence because not all shell + # implementations are multibyte aware. + str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/n, "\\\\\\1") + + # A LF cannot be escaped with a backslash because a backslash + LF + # combo is regarded as line continuation and simply ignored. + str.gsub!(/\n/, "'\n'") + + return str + end + else + def open_pipe + IO.popen([self.class.watcher_path] + @options + @paths) + end + end + + private + + def parse_options(options={}) + opts = ['--format=otnetstring'] + opts.concat(['--since-when', options[:since_when]]) if options[:since_when] + opts.concat(['--latency', options[:latency]]) if options[:latency] + opts.push('--no-defer') if options[:no_defer] + opts.push('--watch-root') if options[:watch_root] + opts.push('--file-events') if options[:file_events] + # ruby 1.9's IO.popen(array-of-stuff) syntax requires all items to be strings + opts.map {|opt| "#{opt}"} + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/rb-fsevent/version.rb b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/rb-fsevent/version.rb new file mode 100644 index 000000000000..0f4a54b1e19c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/lib/rb-fsevent/version.rb @@ -0,0 +1,5 @@ +# -*- encoding: utf-8 -*- + +class FSEvent + VERSION = '0.10.4' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/rb-fsevent.gemspec b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/rb-fsevent.gemspec new file mode 100644 index 000000000000..8f1e5aae4556 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-fsevent-0.10.4/rb-fsevent.gemspec @@ -0,0 +1,26 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'rb-fsevent/version' + +Gem::Specification.new do |s| + s.name = 'rb-fsevent' + s.version = FSEvent::VERSION + s.authors = ['Thibaud Guillaume-Gentil', 'Travis Tilley'] + s.email = ['thibaud@thibaud.gg', 'ttilley@gmail.com'] + s.homepage = 'http://rubygems.org/gems/rb-fsevent' + s.summary = 'Very simple & usable FSEvents API' + s.description = 'FSEvents API with Signals catching (without RubyCocoa)' + s.license = 'MIT' + + s.metadata = { + 'source_code_uri' => 'https://github.com/thibaudgg/rb-fsevent' + } + + s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) } + s.require_path = 'lib' + + s.add_development_dependency 'rspec', '~> 3.6' + s.add_development_dependency 'guard-rspec', '~> 4.2' + s.add_development_dependency 'rake', '~> 12.0' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/.gitignore b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/.gitignore new file mode 100644 index 000000000000..79dfcae942ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/.gitignore @@ -0,0 +1,21 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp +.tags* +.rspec_status +/guard/ +/listen/ diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/.travis.yml new file mode 100644 index 000000000000..5508dd3958bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/.travis.yml @@ -0,0 +1,19 @@ +language: ruby +cache: bundler + +matrix: + include: + - rvm: 2.3 + - rvm: 2.4 + - rvm: 2.5 + - rvm: 2.6 + - rvm: jruby + - rvm: truffleruby + - rvm: jruby-head + - rvm: ruby-head + allow_failures: + - rvm: truffleruby + - rvm: jruby + - rvm: ruby-head + - rvm: jruby-head + fast_finish: true diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/.yardopts b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/.yardopts new file mode 100644 index 000000000000..cd347c5076a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/.yardopts @@ -0,0 +1,4 @@ +--readme README.md +--markup markdown +--markup-provider maruku +--no-private diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/Gemfile b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/Gemfile new file mode 100644 index 000000000000..9b2ce272abc6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/Gemfile @@ -0,0 +1,16 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in utopia.gemspec +gemspec + +group :development do + gem 'pry' + gem 'pry-coolline' + + gem 'tty-prompt' +end + +group :test do + gem 'simplecov' + gem 'coveralls', require: false +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/LICENSE.md new file mode 100644 index 000000000000..bba4996e4b18 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/LICENSE.md @@ -0,0 +1,10 @@ +# The MIT License + +Copyright, 2009, by [Natalie Weizenbaum](https://github.com/nex3). +Copyright, 2017, by [Samuel G. D. Williams](http://www.codeotaku.com). + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/README.md b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/README.md new file mode 100644 index 000000000000..90f5aa37a413 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/README.md @@ -0,0 +1,113 @@ +# rb-inotify + +This is a simple wrapper over the [inotify](http://en.wikipedia.org/wiki/Inotify) Linux kernel subsystem +for monitoring changes to files and directories. +It uses the [FFI](http://wiki.github.com/ffi/ffi) gem to avoid having to compile a C extension. + +[API documentation is available on rdoc.info](http://rdoc.info/projects/nex3/rb-inotify). + +[![Build Status](https://secure.travis-ci.org/guard/rb-inotify.svg)](http://travis-ci.org/guard/rb-inotify) +[![Code Climate](https://codeclimate.com/github/guard/rb-inotify.svg)](https://codeclimate.com/github/guard/rb-inotify) +[![Coverage Status](https://coveralls.io/repos/guard/rb-inotify/badge.svg)](https://coveralls.io/r/guard/rb-inotify) + +## Usage + +The API is similar to the inotify C API, but with a more Rubyish feel. +First, create a notifier: + + notifier = INotify::Notifier.new + +Then, tell it to watch the paths you're interested in +for the events you care about: + + notifier.watch("path/to/foo.txt", :modify) {puts "foo.txt was modified!"} + notifier.watch("path/to/bar", :moved_to, :create) do |event| + puts "#{event.name} is now in path/to/bar!" + end + +Inotify can watch directories or individual files. +It can pay attention to all sorts of events; +for a full list, see [the inotify man page](http://www.tin.org/bin/man.cgi?section=7&topic=inotify). + +Finally, you get at the events themselves: + + notifier.run + +This will loop infinitely, calling the appropriate callbacks when the files are changed. +If you don't want infinite looping, +you can also block until there are available events, +process them all at once, +and then continue on your merry way: + + notifier.process + +## Advanced Usage + +Sometimes it's necessary to have finer control over the underlying IO operations +than is provided by the simple callback API. +The trick to this is that the \{INotify::Notifier#to_io Notifier#to_io} method +returns a fully-functional IO object, +with a file descriptor and everything. +This means, for example, that it can be passed to `IO#select`: + + # Wait 10 seconds for an event then give up + if IO.select([notifier.to_io], [], [], 10) + notifier.process + end + +It can even be used with EventMachine: + + require 'eventmachine' + + EM.run do + EM.watch notifier.to_io do + notifier.process + end + end + +Unfortunately, this currently doesn't work under JRuby. +JRuby currently doesn't use native file descriptors for the IO object, +so we can't use the notifier's file descriptor as a stand-in. + +### Resource Limits + +If you get an error like `inotify event queue has overflowed` you might be running into system limits. You can add the following to your `/etc/sysctl.conf` to increase the number of files that can be monitored: + +``` +fs.inotify.max_user_watches = 100000 +fs.inotify.max_queued_events = 100000 +fs.inotify.max_user_instances = 100000 +``` + +## Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request + +## License + +Released under the MIT license. + +Copyright, 2009, by [Natalie Weizenbaum](https://github.com/nex3). +Copyright, 2017, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/Rakefile b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/Rakefile new file mode 100644 index 000000000000..bc3a3b6b8d63 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/Rakefile @@ -0,0 +1,14 @@ +require "bundler/gem_tasks" +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) + +desc "Run tests" +task :default => :spec + +task :console do + require 'rb-inotify' + require 'pry' + + binding.pry +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify.rb new file mode 100644 index 000000000000..8897aefabe37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify.rb @@ -0,0 +1,15 @@ +require 'rb-inotify/version' +require 'rb-inotify/native' +require 'rb-inotify/native/flags' +require 'rb-inotify/notifier' +require 'rb-inotify/watcher' +require 'rb-inotify/event' +require 'rb-inotify/errors' + +# The root module of the library, which is laid out as so: +# +# * {Notifier} -- The main class, where the notifications are set up +# * {Watcher} -- A watcher for a single file or directory +# * {Event} -- An filesystem event notification +module INotify +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/errors.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/errors.rb new file mode 100644 index 000000000000..afee7099350c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/errors.rb @@ -0,0 +1,3 @@ +module INotify + class QueueOverflowError < RuntimeError; end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/event.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/event.rb new file mode 100644 index 000000000000..11701acfa1a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/event.rb @@ -0,0 +1,146 @@ +module INotify + # An event caused by a change on the filesystem. + # Each {Watcher} can fire many events, + # which are passed to that watcher's callback. + class Event + # A list of other events that are related to this one. + # Currently, this is only used for files that are moved within the same directory: + # the `:moved_from` and the `:moved_to` events will be related. + # + # @return [Array<Event>] + attr_reader :related + + # The name of the file that the event occurred on. + # This is only set for events that occur on files in directories; + # otherwise, it's `""`. + # Similarly, if the event is being fired for the directory itself + # the name will be `""` + # + # This pathname is relative to the enclosing directory. + # For the absolute pathname, use \{#absolute\_name}. + # Note that when the `:recursive` flag is passed to {Notifier#watch}, + # events in nested subdirectories will still have a `#name` field + # relative to their immediately enclosing directory. + # For example, an event on the file `"foo/bar/baz"` + # will have name `"baz"`. + # + # @return [String] + attr_reader :name + + # The {Notifier} that fired this event. + # + # @return [Notifier] + attr_reader :notifier + + # An integer specifying that this event is related to some other event, + # which will have the same cookie. + # + # Currently, this is only used for files that are moved within the same directory. + # Both the `:moved_from` and the `:moved_to` events will have the same cookie. + # + # @private + # @return [Fixnum] + attr_reader :cookie + + # The {Watcher#id id} of the {Watcher} that fired this event. + # + # @private + # @return [Fixnum] + attr_reader :watcher_id + + # Returns the {Watcher} that fired this event. + # + # @return [Watcher] + def watcher + @watcher ||= @notifier.watchers[@watcher_id] + end + + # The absolute path of the file that the event occurred on. + # + # This is actually only as absolute as the path passed to the {Watcher} + # that created this event. + # However, it is relative to the working directory, + # assuming that hasn't changed since the watcher started. + # + # @return [String] + def absolute_name + return watcher.path if name.empty? + return File.join(watcher.path, name) + end + + # Returns the flags that describe this event. + # This is generally similar to the input to {Notifier#watch}, + # except that it won't contain options flags nor `:all_events`, + # and it may contain one or more of the following flags: + # + # `:unmount` + # : The filesystem containing the watched file or directory was unmounted. + # + # `:ignored` + # : The \{#watcher watcher} was closed, or the watched file or directory was deleted. + # + # `:isdir` + # : The subject of this event is a directory. + # + # @return [Array<Symbol>] + def flags + @flags ||= Native::Flags.from_mask(@native[:mask]) + end + + # Constructs an {Event} object from a string of binary data, + # and destructively modifies the string to get rid of the initial segment + # used to construct the Event. + # + # @private + # @param data [String] The string to be modified + # @param notifier [Notifier] The {Notifier} that fired the event + # @return [Event, nil] The event, or `nil` if the string is empty + def self.consume(data, notifier) + return nil if data.empty? + ev = new(data, notifier) + data.replace data[ev.size..-1] + ev + end + + # Creates an event from a string of binary data. + # Differs from {Event.consume} in that it doesn't modify the string. + # + # @private + # @param data [String] The data string + # @param notifier [Notifier] The {Notifier} that fired the event + def initialize(data, notifier) + ptr = FFI::MemoryPointer.from_string(data) + @native = Native::Event.new(ptr) + @related = [] + @cookie = @native[:cookie] + @name = fix_encoding(data[@native.size, @native[:len]].gsub(/\0+$/, '')) + @notifier = notifier + @watcher_id = @native[:wd] + + raise QueueOverflowError.new("inotify event queue has overflowed.") if @native[:mask] & Native::Flags::IN_Q_OVERFLOW != 0 + end + + # Calls the callback of the watcher that fired this event, + # passing in the event itself. + # + # @private + def callback! + watcher && watcher.callback!(self) + end + + # Returns the size of this event object in bytes, + # including the \{#name} string. + # + # @return [Fixnum] + def size + @native.size + @native[:len] + end + + private + + def fix_encoding(name) + name.force_encoding('filesystem') if name.respond_to?(:force_encoding) + name + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/native.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/native.rb new file mode 100644 index 000000000000..6da36eb1cd03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/native.rb @@ -0,0 +1,33 @@ +require 'ffi' + +module INotify + # This module contains the low-level foreign-function interface code + # for dealing with the inotify C APIs. + # It's an implementation detail, and not meant for users to deal with. + # + # @private + module Native + extend FFI::Library + ffi_lib FFI::Library::LIBC + begin + ffi_lib 'inotify' + rescue LoadError + end + + # The C struct describing an inotify event. + # + # @private + class Event < FFI::Struct + layout( + :wd, :int, + :mask, :uint32, + :cookie, :uint32, + :len, :uint32) + end + + attach_function :inotify_init, [], :int + attach_function :inotify_add_watch, [:int, :string, :uint32], :int + attach_function :inotify_rm_watch, [:int, :uint32], :int + attach_function :fpathconf, [:int, :int], :long + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/native/flags.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/native/flags.rb new file mode 100644 index 000000000000..564013063054 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/native/flags.rb @@ -0,0 +1,94 @@ +module INotify + module Native + # A module containing all the inotify flags + # to be passed to {Notifier#watch}. + # + # @private + module Flags + # File was accessed. + IN_ACCESS = 0x00000001 + # Metadata changed. + IN_ATTRIB = 0x00000004 + # Writtable file was closed. + IN_CLOSE_WRITE = 0x00000008 + # File was modified. + IN_MODIFY = 0x00000002 + # Unwrittable file closed. + IN_CLOSE_NOWRITE = 0x00000010 + # File was opened. + IN_OPEN = 0x00000020 + # File was moved from X. + IN_MOVED_FROM = 0x00000040 + # File was moved to Y. + IN_MOVED_TO = 0x00000080 + # Subfile was created. + IN_CREATE = 0x00000100 + # Subfile was deleted. + IN_DELETE = 0x00000200 + # Self was deleted. + IN_DELETE_SELF = 0x00000400 + # Self was moved. + IN_MOVE_SELF = 0x00000800 + + ## Helper events. + + # Close. + IN_CLOSE = (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) + # Moves. + IN_MOVE = (IN_MOVED_FROM | IN_MOVED_TO) + # All events which a program can wait on. + IN_ALL_EVENTS = (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | + IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | IN_MOVED_TO | IN_CREATE | + IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF) + + + ## Special flags. + + # Only watch the path if it is a directory. + IN_ONLYDIR = 0x01000000 + # Do not follow a sym link. + IN_DONT_FOLLOW = 0x02000000 + # Add to the mask of an already existing watch. + IN_MASK_ADD = 0x20000000 + # Only send event once. + IN_ONESHOT = 0x80000000 + + + ## Events sent by the kernel. + + # Backing fs was unmounted. + IN_UNMOUNT = 0x00002000 + # Event queued overflowed. + IN_Q_OVERFLOW = 0x00004000 + # File was ignored. + IN_IGNORED = 0x00008000 + # Event occurred against dir. + IN_ISDIR = 0x40000000 + + ## fpathconf Macros + + # returns the maximum length of a filename in the directory path or fd that the process is allowed to create. The corresponding macro is _POSIX_NAME_MAX. + PC_NAME_MAX = 3 + + # Converts a list of flags to the bitmask that the C API expects. + # + # @param flags [Array<Symbol>] + # @return [Fixnum] + def self.to_mask(flags) + flags.map {|flag| const_get("IN_#{flag.to_s.upcase}")}. + inject(0) {|mask, flag| mask | flag} + end + + # Converts a bitmask from the C API into a list of flags. + # + # @param mask [Fixnum] + # @return [Array<Symbol>] + def self.from_mask(mask) + constants.map {|c| c.to_s}.select do |c| + next false unless c =~ /^IN_/ + const_get(c) & mask != 0 + end.map {|c| c.sub("IN_", "").downcase.to_sym} - [:all_events] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/notifier.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/notifier.rb new file mode 100644 index 000000000000..89be6f859d03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/notifier.rb @@ -0,0 +1,326 @@ +require 'thread' + +module INotify + # Notifier wraps a single instance of inotify. + # It's possible to have more than one instance, + # but usually unnecessary. + # + # @example + # # Create the notifier + # notifier = INotify::Notifier.new + # + # # Run this callback whenever the file path/to/foo.txt is read + # notifier.watch("path/to/foo.txt", :access) do + # puts "Foo.txt was accessed!" + # end + # + # # Watch for any file in the directory being deleted + # # or moved out of the directory. + # notifier.watch("path/to/directory", :delete, :moved_from) do |event| + # # The #name field of the event object contains the name of the affected file + # puts "#{event.name} is no longer in the directory!" + # end + # + # # Nothing happens until you run the notifier! + # notifier.run + class Notifier + # A list of directories that should never be recursively watched. + # + # * Files in `/dev/fd` sometimes register as directories, but are not enumerable. + RECURSIVE_BLACKLIST = %w[/dev/fd] + + # A hash from {Watcher} ids to the instances themselves. + # + # @private + # @return [{Fixnum => Watcher}] + attr_reader :watchers + + # The underlying file descriptor for this notifier. + # This is a valid OS file descriptor, and can be used as such + # (except under JRuby -- see \{#to\_io}). + # + # @return [Fixnum] + def fd + @handle.fileno + end + + # Creates a new {Notifier}. + # + # @return [Notifier] + # @raise [SystemCallError] if inotify failed to initialize for some reason + def initialize + @running = Mutex.new + @pipe = IO.pipe + # JRuby shutdown sometimes runs IO finalizers before all threads finish. + if RUBY_ENGINE == 'jruby' + @pipe[0].autoclose = false + @pipe[1].autoclose = false + end + + @watchers = {} + + fd = Native.inotify_init + unless fd < 0 + @handle = IO.new(fd) + @handle.autoclose = false if RUBY_ENGINE == 'jruby' + return + end + + raise SystemCallError.new( + "Failed to initialize inotify" + + case FFI.errno + when Errno::EMFILE::Errno; ": the user limit on the total number of inotify instances has been reached." + when Errno::ENFILE::Errno; ": the system limit on the total number of file descriptors has been reached." + when Errno::ENOMEM::Errno; ": insufficient kernel memory is available." + else; "" + end, + FFI.errno) + end + + # Returns a Ruby IO object wrapping the underlying file descriptor. + # Since this file descriptor is fully functional (except under JRuby), + # this IO object can be used in any way a Ruby-created IO object can. + # This includes passing it to functions like `#select`. + # + # Note that this always returns the same IO object. + # Creating lots of IO objects for the same file descriptor + # can cause some odd problems. + # + # **This is not supported under JRuby**. + # JRuby currently doesn't use native file descriptors for the IO object, + # so we can't use this file descriptor as a stand-in. + # + # @return [IO] An IO object wrapping the file descriptor + # @raise [NotImplementedError] if this is being called in JRuby + def to_io + @handle + end + + # Watches a file or directory for changes, + # calling the callback when there are. + # This is only activated once \{#process} or \{#run} is called. + # + # **Note that by default, this does not recursively watch subdirectories + # of the watched directory**. + # To do so, use the `:recursive` flag. + # + # ## Flags + # + # `:access` + # : A file is accessed (that is, read). + # + # `:attrib` + # : A file's metadata is changed (e.g. permissions, timestamps, etc). + # + # `:close_write` + # : A file that was opened for writing is closed. + # + # `:close_nowrite` + # : A file that was not opened for writing is closed. + # + # `:modify` + # : A file is modified. + # + # `:open` + # : A file is opened. + # + # ### Directory-Specific Flags + # + # These flags only apply when a directory is being watched. + # + # `:moved_from` + # : A file is moved out of the watched directory. + # + # `:moved_to` + # : A file is moved into the watched directory. + # + # `:create` + # : A file is created in the watched directory. + # + # `:delete` + # : A file is deleted in the watched directory. + # + # `:delete_self` + # : The watched file or directory itself is deleted. + # + # `:move_self` + # : The watched file or directory itself is moved. + # + # ### Helper Flags + # + # These flags are just combinations of the flags above. + # + # `:close` + # : Either `:close_write` or `:close_nowrite` is activated. + # + # `:move` + # : Either `:moved_from` or `:moved_to` is activated. + # + # `:all_events` + # : Any event above is activated. + # + # ### Options Flags + # + # These flags don't actually specify events. + # Instead, they specify options for the watcher. + # + # `:onlydir` + # : Only watch the path if it's a directory. + # + # `:dont_follow` + # : Don't follow symlinks. + # + # `:mask_add` + # : Add these flags to the pre-existing flags for this path. + # + # `:oneshot` + # : Only send the event once, then shut down the watcher. + # + # `:recursive` + # : Recursively watch any subdirectories that are created. + # Note that this is a feature of rb-inotify, + # rather than of inotify itself, which can only watch one level of a directory. + # This means that the {Event#name} field + # will contain only the basename of the modified file. + # When using `:recursive`, {Event#absolute_name} should always be used. + # + # @param path [String] The path to the file or directory + # @param flags [Array<Symbol>] Which events to watch for + # @yield [event] A block that will be called + # whenever one of the specified events occur + # @yieldparam event [Event] The Event object containing information + # about the event that occured + # @return [Watcher] A Watcher set up to watch this path for these events + # @raise [SystemCallError] if the file or directory can't be watched, + # e.g. if the file isn't found, read access is denied, + # or the flags don't contain any events + def watch(path, *flags, &callback) + return Watcher.new(self, path, *flags, &callback) unless flags.include?(:recursive) + + dir = Dir.new(path) + + dir.each do |base| + d = File.join(path, base) + binary_d = d.respond_to?(:force_encoding) ? d.dup.force_encoding('BINARY') : d + next if binary_d =~ /\/\.\.?$/ # Current or parent directory + next if RECURSIVE_BLACKLIST.include?(d) + next if flags.include?(:dont_follow) && File.symlink?(d) + next if !File.directory?(d) + + watch(d, *flags, &callback) + end + + dir.close + + rec_flags = [:create, :moved_to] + return watch(path, *((flags - [:recursive]) | rec_flags)) do |event| + callback.call(event) if flags.include?(:all_events) || !(flags & event.flags).empty? + next if (rec_flags & event.flags).empty? || !event.flags.include?(:isdir) + begin + watch(event.absolute_name, *flags, &callback) + rescue Errno::ENOENT + # If the file has been deleted since the glob was run, we don't want to error out. + end + end + end + + # Starts the notifier watching for filesystem events. + # Blocks until \{#stop} is called. + # + # @see #process + def run + @running.synchronize do + Thread.current[:INOTIFY_RUN_THREAD] = true + @stop = false + + process until @stop + end + ensure + Thread.current[:INOTIFY_RUN_THREAD] = false + end + + # Stop watching for filesystem events. + # That is, if we're in a \{#run} loop, + # exit out as soon as we finish handling the events. + def stop + @stop = true + @pipe.last.write "." + + unless Thread.current[:INOTIFY_RUN_THREAD] + @running.synchronize do + # no-op: we just needed to wait until the lock was available + end + end + end + + # Blocks until there are one or more filesystem events + # that this notifier has watchers registered for. + # Once there are events, the appropriate callbacks are called + # and this function returns. + # + # @see #run + def process + read_events.each do |event| + event.callback! + event.flags.include?(:ignored) && event.notifier.watchers.delete(event.watcher_id) + end + end + + # Close the notifier. + # + # @raise [SystemCallError] if closing the underlying file descriptor fails. + def close + stop + @handle.close + @watchers.clear + end + + # Blocks until there are one or more filesystem events that this notifier + # has watchers registered for. Once there are events, returns their {Event} + # objects. + # + # This can return an empty list if the watcher was closed elsewhere. + # + # {#run} or {#process} are ususally preferable to calling this directly. + def read_events + size = Native::Event.size + Native.fpathconf(fd, Native::Flags::PC_NAME_MAX) + 1 + tries = 1 + + begin + data = readpartial(size) + rescue SystemCallError => er + # EINVAL means that there's more data to be read + # than will fit in the buffer size + raise er unless er.errno == Errno::EINVAL::Errno && tries < 5 + size *= 2 + tries += 1 + retry + end + return [] if data.nil? + + events = [] + cookies = {} + while event = Event.consume(data, self) + events << event + next if event.cookie == 0 + cookies[event.cookie] ||= [] + cookies[event.cookie] << event + end + cookies.each {|c, evs| evs.each {|ev| ev.related.replace(evs - [ev]).freeze}} + events + end + + private + + # Same as IO#readpartial, or as close as we need. + def readpartial(size) + readable, = select([@handle, @pipe.first]) + return nil if readable.include?(@pipe.first) + @handle.readpartial(size) + rescue Errno::EBADF + # If the IO has already been closed, reading from it will cause + # Errno::EBADF. + nil + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/version.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/version.rb new file mode 100644 index 000000000000..f38a6783d255 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/version.rb @@ -0,0 +1,24 @@ +# Copyright, 2012, by Natalie Weizenbaum. +# Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com> +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +module INotify + VERSION = '0.10.1' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/watcher.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/watcher.rb new file mode 100644 index 000000000000..1205e2dea559 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/lib/rb-inotify/watcher.rb @@ -0,0 +1,88 @@ +module INotify + # Watchers monitor a single path for changes, + # specified by {INotify::Notifier#watch event flags}. + # A watcher is usually created via \{Notifier#watch}. + # + # One {Notifier} may have many {Watcher}s. + # The Notifier actually takes care of the checking for events, + # via \{Notifier#run #run} or \{Notifier#process #process}. + # The main purpose of having Watcher objects + # is to be able to disable them using \{#close}. + class Watcher + # The {Notifier} that this Watcher belongs to. + # + # @return [Notifier] + attr_reader :notifier + + # The path that this Watcher is watching. + # + # @return [String] + attr_reader :path + + # The {INotify::Notifier#watch flags} + # specifying the events that this Watcher is watching for, + # and potentially some options as well. + # + # @return [Array<Symbol>] + attr_reader :flags + + # The id for this Watcher. + # Used to retrieve this Watcher from {Notifier#watchers}. + # + # @private + # @return [Fixnum] + attr_reader :id + + # Calls this Watcher's callback with the given {Event}. + # + # @private + # @param event [Event] + def callback!(event) + @callback[event] + end + + # Disables this Watcher, so that it doesn't fire any more events. + # + # @raise [SystemCallError] if the watch fails to be disabled for some reason + def close + if Native.inotify_rm_watch(@notifier.fd, @id) == 0 + @notifier.watchers.delete(@id) + return + end + + raise SystemCallError.new("Failed to stop watching #{path.inspect}", + FFI.errno) + end + + # Creates a new {Watcher}. + # + # @private + # @see Notifier#watch + def initialize(notifier, path, *flags, &callback) + @notifier = notifier + @callback = callback || proc {} + @path = path + @flags = flags.freeze + @id = Native.inotify_add_watch(@notifier.fd, path.dup, + Native::Flags.to_mask(flags)) + + unless @id < 0 + @notifier.watchers[@id] = self + return + end + + raise SystemCallError.new( + "Failed to watch #{path.inspect}" + + case FFI.errno + when Errno::EACCES::Errno; ": read access to the given file is not permitted." + when Errno::EBADF::Errno; ": the given file descriptor is not valid." + when Errno::EFAULT::Errno; ": path points outside of the process's accessible address space." + when Errno::EINVAL::Errno; ": the given event mask contains no legal events; or fd is not an inotify file descriptor." + when Errno::ENOMEM::Errno; ": insufficient kernel memory was available." + when Errno::ENOSPC::Errno; ": The user limit on the total number of inotify watches was reached or the kernel failed to allocate a needed resource." + else; "" + end, + FFI.errno) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/rb-inotify.gemspec b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/rb-inotify.gemspec new file mode 100644 index 000000000000..e83eafeb9b88 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/rb-inotify.gemspec @@ -0,0 +1,28 @@ +# -*- encoding: utf-8 -*- +require_relative 'lib/rb-inotify/version' + +Gem::Specification.new do |spec| + spec.name = 'rb-inotify' + spec.version = INotify::VERSION + spec.platform = Gem::Platform::RUBY + + spec.summary = 'A Ruby wrapper for Linux inotify, using FFI' + spec.authors = ['Natalie Weizenbaum', 'Samuel Williams'] + spec.email = ['nex342@gmail.com', 'samuel.williams@oriontransfer.co.nz'] + spec.homepage = 'https://github.com/guard/rb-inotify' + spec.licenses = ['MIT'] + + spec.files = `git ls-files`.split($/) + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) + spec.require_paths = ["lib"] + + spec.required_ruby_version = '>= 2.2' + + spec.add_dependency "ffi", "~> 1.0" + + spec.add_development_dependency "rspec", "~> 3.6" + spec.add_development_dependency "bundler" + spec.add_development_dependency "rake" + spec.add_development_dependency "concurrent-ruby" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/spec/inotify_spec.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/spec/inotify_spec.rb new file mode 100644 index 000000000000..b73ea3033f63 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/spec/inotify_spec.rb @@ -0,0 +1,9 @@ +require 'spec_helper' + +describe INotify do + describe "version" do + it "exists" do + expect(INotify::VERSION).to be_truthy + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/spec/notifier_spec.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/spec/notifier_spec.rb new file mode 100644 index 000000000000..af94cad75c25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/spec/notifier_spec.rb @@ -0,0 +1,180 @@ +require 'spec_helper' +require 'tmpdir' +require 'concurrent' + +describe INotify::Notifier do + describe "instance" do + around do |block| + Dir.mktmpdir do |dir| + @root = Pathname.new(dir) + @notifier = INotify::Notifier.new + + begin + block.call + ensure + @notifier.close + end + end + end + + let(:dir) do + @root.join("foo").tap(&:mkdir) + end + + let(:another_dir) do + @root.join("bar").tap(&:mkdir) + end + + it "stops" do + @notifier.stop + end + + describe :process do + it "gets events" do + events = recording(dir, :create) + dir.join("test.txt").write("hello world") + + @notifier.process + + expect(events.size).to eq(1) + expect(events.first.name).to eq("test.txt") + expect(events.first.absolute_name).to eq(dir.join("test.txt").to_s) + end + + it "gets simultaneous events" do + events = recording(dir, :create) + + dir.join("one.txt").write("hello world") + dir.join("two.txt").write("hello world") + + @notifier.process + + expect(events.map(&:name)).to match_array(%w(one.txt two.txt)) + end + + it "separates events between watches" do + bar_events = nil + + foo_events = recording(dir, :create) + bar_events = recording(another_dir, :create) + + dir.join("test.txt").write("hello world") + another_dir.join("test_two.txt").write("hello world") + + @notifier.process + + expect(foo_events.size).to eq(1) + expect(foo_events.first.name).to eq("test.txt") + expect(foo_events.first.absolute_name).to eq(dir.join("test.txt").to_s) + + expect(bar_events.size).to eq(1) + expect(bar_events.first.name).to eq("test_two.txt") + expect(bar_events.first.absolute_name).to eq(another_dir.join("test_two.txt").to_s) + end + end + + describe :run do + it "processes repeatedly until stopped" do + barriers = Array.new(3) { Concurrent::Event.new } + barrier_queue = barriers.dup + events = recording(dir, :create) { barrier_queue.shift.set } + + run_thread = Thread.new { @notifier.run } + + dir.join("one.txt").write("hello world") + barriers.shift.wait(1) or raise "timeout" + + expect(events.map(&:name)).to match_array(%w(one.txt)) + + dir.join("two.txt").write("hello world") + barriers.shift.wait(1) or raise "timeout" + + expect(events.map(&:name)).to match_array(%w(one.txt two.txt)) + + @notifier.stop + + dir.join("three.txt").write("hello world") + barriers.shift.wait(1) + + dir.join("four.txt").write("hello world") + run_thread.join + + expect(events.map(&:name)).to match_array(%w(one.txt two.txt)) + end + + it "can be stopped from within a callback" do + barriers = Array.new(3) { Concurrent::Event.new } + barrier_queue = barriers.dup + events = recording(dir, :create) { @notifier.stop } + + run_thread = Thread.new { @notifier.run } + dir.join("one.txt").write("hello world") + run_thread.join + end + end + + describe :fd do + it "returns an integer" do + expect(@notifier.fd).to be_an(Integer) + end + end + + describe :to_io do + it "returns a ruby IO" do + expect(@notifier.to_io).to be_an(::IO) + end + + it "matches the fd" do + expect(@notifier.to_io.fileno).to eq(@notifier.fd) + end + + it "caches its result" do + expect(@notifier.to_io).to be(@notifier.to_io) + end + + it "is selectable" do + events = recording(dir, :create) + expect(select([@notifier.to_io], nil, nil, 0.2)).to be_nil + + dir.join("test.txt").write("hello world") + expect(select([@notifier.to_io], nil, nil, 0.2)).to eq([[@notifier.to_io], [], []]) + + @notifier.process + expect(select([@notifier.to_io], nil, nil, 0.2)).to be_nil + end + end + + private + + def recording(dir, *flags, callback: nil) + events = [] + @notifier.watch(dir.to_s, *flags) do |event| + events << event + yield if block_given? + end + + events + end + end + + describe "mixed instances" do + it "doesn't tangle fds" do + notifiers = Array.new(30) { INotify::Notifier.new } + notifiers.each(&:to_io) + + one = Array.new(10) { IO.pipe.last } + notifiers.each(&:close) + + two = Array.new(10) { IO.pipe.last } + + notifiers = nil + GC.start + + _, writable, _ = select(nil, one, nil, 1) + expect(writable).to match_array(one) + + _, writable, _ = select(nil, two, nil, 1) + expect(writable).to match_array(two) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/spec/spec_helper.rb new file mode 100644 index 000000000000..b62f9cf5ba6f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rb-inotify-0.10.1/spec/spec_helper.rb @@ -0,0 +1,29 @@ + +if ENV['COVERAGE'] || ENV['TRAVIS'] + begin + require 'simplecov' + + SimpleCov.start do + add_filter "/spec/" + end + + if ENV['TRAVIS'] + require 'coveralls' + Coveralls.wear! + end + rescue LoadError + warn "Could not load simplecov: #{$!}" + end +end + +require "bundler/setup" +require "rb-inotify" + +RSpec.configure do |config| + # Enable flags like --only-failures and --next-failure + config.example_status_persistence_file_path = ".rspec_status" + + config.expect_with :rspec do |c| + c.syntax = :expect + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/LICENSE.txt new file mode 100644 index 000000000000..a009caefea81 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/NEWS.md b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/NEWS.md new file mode 100644 index 000000000000..84bbde2d159f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/NEWS.md @@ -0,0 +1,178 @@ +# News + +## 3.2.5 - 2021-04-05 {#version-3-2-5} + +### Improvements + + * Add more validations to XPath parser. + + * `require "rexml/docuemnt"` by default. + [GitHub#36][Patch by Koichi ITO] + + * Don't add `#dcloe` method to core classes globally. + [GitHub#37][Patch by Akira Matsuda] + + * Add more documentations. + [Patch by Burdette Lamar] + + * Added `REXML::Elements#parent`. + [GitHub#52][Patch by Burdette Lamar] + +### Fixes + + * Fixed a bug that `REXML::DocType#clone` doesn't copy external ID + information. + + * Fixed round-trip vulnerability bugs. + See also: https://www.ruby-lang.org/en/news/2021/04/05/xml-round-trip-vulnerability-in-rexml-cve-2021-28965/ + [HackerOne#1104077][CVE-2021-28965][Reported by Juho Nurminen] + +### Thanks + + * Koichi ITO + + * Akira Matsuda + + * Burdette Lamar + + * Juho Nurminen + +## 3.2.4 - 2020-01-31 {#version-3-2-4} + +### Improvements + + * Don't use `taint` with Ruby 2.7 or later. + [GitHub#21][Patch by Jeremy Evans] + +### Fixes + + * Fixed a `elsif` typo. + [GitHub#22][Patch by Nobuyoshi Nakada] + +### Thanks + + * Jeremy Evans + + * Nobuyoshi Nakada + +## 3.2.3 - 2019-10-12 {#version-3-2-3} + +### Fixes + + * Fixed a bug that `REXML::XMLDecl#close` doesn't copy `@writethis`. + [GitHub#20][Patch by hirura] + +### Thanks + + * hirura + +## 3.2.2 - 2019-06-03 {#version-3-2-2} + +### Fixes + + * xpath: Fixed a bug for equality and relational expressions. + [GitHub#17][Reported by Mirko Budszuhn] + + * xpath: Fixed `boolean()` implementation. + + * xpath: Fixed `local_name()` with nonexistent node. + + * xpath: Fixed `number()` implementation with node set. + [GitHub#18][Reported by Mirko Budszuhn] + +### Thanks + + * Mirko Budszuhn + +## 3.2.1 - 2019-05-04 {#version-3-2-1} + +### Improvements + + * Improved error message. + [GitHub#12][Patch by FUJI Goro] + + * Improved error message. + [GitHub#16][Patch by ujihisa] + + * Improved documentation markup. + [GitHub#14][Patch by Alyssa Ross] + +### Fixes + + * Fixed a bug that `nil` variable value raises an unexpected exception. + [GitHub#13][Patch by Alyssa Ross] + +### Thanks + + * FUJI Goro + + * Alyssa Ross + + * ujihisa + +## 3.2.0 - 2019-01-01 {#version-3-2-0} + +### Fixes + + * Fixed a bug that no namespace attribute isn't matched with prefix. + + [ruby-list:50731][Reported by Yasuhiro KIMURA] + + * Fixed a bug that the default namespace is applied to attribute names. + + NOTE: It's a backward incompatible change. If your program has any + problem with this change, please report it. We may revert this fix. + + * `REXML::Attribute#prefix` returns `""` for no namespace attribute. + + * `REXML::Attribute#namespace` returns `""` for no namespace attribute. + +### Thanks + + * Yasuhiro KIMURA + +## 3.1.9 - 2018-12-20 {#version-3-1-9} + +### Improvements + + * Improved backward compatibility. + + Restored `REXML::Parsers::BaseParser::UNQME_STR` because it's used + by kramdown. + +## 3.1.8 - 2018-12-20 {#version-3-1-8} + +### Improvements + + * Added support for customizing quote character in prologue. + [GitHub#8][Bug #9367][Reported by Takashi Oguma] + + * You can use `"` as quote character by specifying `:quote` to + `REXML::Document#context[:prologue_quote]`. + + * You can use `'` as quote character by specifying `:apostrophe` + to `REXML::Document#context[:prologue_quote]`. + + * Added processing instruction target check. The target must not nil. + [GitHub#7][Reported by Ariel Zelivansky] + + * Added name check for element and attribute. + [GitHub#7][Reported by Ariel Zelivansky] + + * Stopped to use `Exception`. + [GitHub#9][Patch by Jean Boussier] + +### Fixes + + * Fixed a bug that `REXML::Text#clone` escapes value twice. + [ruby-dev:50626][Bug #15058][Reported by Ryosuke Nanba] + +### Thanks + + * Takashi Oguma + + * Ariel Zelivansky + + * Jean Boussier + + * Ryosuke Nanba diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/README.md b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/README.md new file mode 100644 index 000000000000..27da0e49a70e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/README.md @@ -0,0 +1,48 @@ +# REXML + +REXML was inspired by the Electric XML library for Java, which features an easy-to-use API, small size, and speed. Hopefully, REXML, designed with the same philosophy, has these same features. I've tried to keep the API as intuitive as possible, and have followed the Ruby methodology for method naming and code flow, rather than mirroring the Java API. + +REXML supports both tree and stream document parsing. Stream parsing is faster (about 1.5 times as fast). However, with stream parsing, you don't get access to features such as XPath. + +## API + +See the {API documentation}[https://ruby.github.io/rexml/] + +## Usage + +We'll start with parsing an XML document + +```ruby +require "rexml/document" +file = File.new( "mydoc.xml" ) +doc = REXML::Document.new file +``` + +Line 3 creates a new document and parses the supplied file. You can also do the following + +```ruby +require "rexml/document" +include REXML # so that we don't have to prefix everything with REXML::... +string = <<EOF + <mydoc> + <someelement attribute="nanoo">Text, text, text</someelement> + </mydoc> +EOF +doc = Document.new string +``` + +So parsing a string is just as easy as parsing a file. + +## Development + +After checking out the repo, run `rake test` to run the tests. + +To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/rexml. + +## License + +The gem is available as open source under the terms of the [BSD-2-Clause](LICENSE.txt). diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/context.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/context.rdoc new file mode 100644 index 000000000000..7ef01f7b4ad9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/context.rdoc @@ -0,0 +1,143 @@ +== Element Context + +Notes: +- All code on this page presupposes that the following has been executed: + + require 'rexml/document' + +- For convenience, examples on this page use +REXML::Document.new+, not +REXML::Element.new+. + This is completely valid, because REXML::Document is a subclass of REXML::Element. + +The context for an element is a hash of processing directives +that influence the way \XML is read, stored, and written. +The context entries are: + +- +:respect_whitespace+: controls treatment of whitespace. +- +:compress_whitespace+: determines whether whitespace is compressed. +- +:ignore_whitespace_nodes+: determines whether whitespace-only nodes are to be ignored. +- +:raw+: controls treatment of special characters and entities. + +The default context for a new element is <tt>{}</tt>. +You can set the context at element-creation time: + + d = REXML::Document.new('', {compress_whitespace: :all, raw: :all}) + d.context # => {:compress_whitespace=>:all, :raw=>:all} + +You can reset the entire context by assigning a new hash: + + d.context = {ignore_whitespace_nodes: :all} + d.context # => {:ignore_whitespace_nodes=>:all} + +Or you can create or modify an individual entry: + + d.context[:raw] = :all + d.context # => {:ignore_whitespace_nodes=>:all, :raw=>:all} + +=== +:respect_whitespace+ + +Affects: +REXML::Element.new+, +REXML::Element.text=+. + +By default, all parsed whitespace is respected (that is, stored whitespace not compressed): + + xml_string = '<root><foo>a b</foo> <bar>c d</bar> <baz>e f</baz></root>' + d = REXML::Document.new(xml_string) + d.to_s # => "<root><foo>a b</foo> <bar>c d</bar> <baz>e f</baz></root>" + +Use +:respect_whitespace+ with an array of element names +to specify the elements that _are_ to have their whitespace respected; +other elements' whitespace, and whitespace between elements, will be compressed. + +In this example: +foo+ and +baz+ will have their whitespace respected; ++bar+ and the space between elements will have their whitespace compressed: + + d = REXML::Document.new(xml_string, {respect_whitespace: ['foo', 'baz']}) + d.to_s # => "<root><foo>a b</foo> <bar>c d</bar> <baz>e f</baz></root>" + bar = d.root[2] # => <bar> ... </> + bar.text = 'X Y' + d.to_s # => "<root><foo>a b</foo> <bar>X Y</bar> <baz>e f</baz></root>" + +=== +:compress_whitespace+ + +Affects: +REXML::Element.new+, +REXML::Element.text=+. + +Use <tt>compress_whitespace: :all</tt> +to compress whitespace both within and between elements: + + xml_string = '<root><foo>a b</foo> <bar>c d</bar> <baz>e f</baz></root>' + d = REXML::Document.new(xml_string, {compress_whitespace: :all}) + d.to_s # => "<root><foo>a b</foo> <bar>c d</bar> <baz>e f</baz></root>" + +Use +:compress_whitespace+ with an array of element names +to compress whitespace in those elements, +but not in other elements nor between elements. + +In this example, +foo+ and +baz+ will have their whitespace compressed; ++bar+ and the space between elements will not: + + d = REXML::Document.new(xml_string, {compress_whitespace: ['foo', 'baz']}) + d.to_s # => "<root><foo>a b</foo> <bar>c d</bar> <baz>e f</baz></root>" + foo = d.root[0] # => <foo> ... </> + foo.text= 'X Y' + d.to_s # => "<root><foo>X Y</foo> <bar>c d</bar> <baz>e f</baz></root>" + +=== +:ignore_whitespace_nodes+ + +Affects: +REXML::Element.new+. + +Use <tt>ignore_whitespace_nodes: :all</tt> to omit all whitespace-only elements. + +In this example, +bar+ has a text node, while nodes +foo+ and +baz+ do not: + + xml_string = '<root><foo> </foo><bar> BAR </bar><baz> </baz></root>' + d = REXML::Document.new(xml_string, {ignore_whitespace_nodes: :all}) + d.to_s # => "<root><foo> FOO </foo><bar/><baz> BAZ </baz></root>" + root = d.root # => <root> ... </> + foo = root[0] # => <foo/> + bar = root[1] # => <bar> ... </> + baz = root[2] # => <baz/> + foo.first.class # => NilClass + bar.first.class # => REXML::Text + baz.first.class # => NilClass + +Use +:ignore_whitespace_nodes+ with an array of element names +to specify the elements that are to have whitespace nodes ignored. + +In this example, +bar+ and +baz+ have text nodes, while node +foo+ does not. + + xml_string = '<root><foo> </foo><bar> BAR </bar><baz> </baz></root>' + d = REXML::Document.new(xml_string, {ignore_whitespace_nodes: ['foo']}) + d.to_s # => "<root><foo/><bar> BAR </bar><baz> </baz></root>" + root = d.root # => <root> ... </> + foo = root[0] # => <foo/> + bar = root[1] # => <bar> ... </> + baz = root[2] # => <baz> ... </> + foo.first.class # => NilClass + bar.first.class # => REXML::Text + baz.first.class # => REXML::Text + +=== +:raw+ + +Affects: +Element.text=+, +Element.add_text+, +Text.to_s+. + +Parsing of +a+ elements is not affected by +raw+: + + xml_string = '<root><a>0 &lt; 1</a><b>1 &gt; 0</b></root>' + d = REXML::Document.new(xml_string, {:raw => ['a']}) + d.root.to_s # => "<root><a>0 &lt; 1</a><b>1 &gt; 0</b></root>" + a, b = *d.root.elements + a.to_s # => "<a>0 &lt; 1</a>" + b.to_s # => "<b>1 &gt; 0</b>" + +But Element#text= is affected: + + a.text = '0 &lt; 1' + b.text = '1 &gt; 0' + a.to_s # => "<a>0 &lt; 1</a>" + b.to_s # => "<b>1 &amp;gt; 0</b>" + +As is Element.add_text: + + a.add_text(' so 1 &gt; 0') + b.add_text(' so 0 &lt; 1') + a.to_s # => "<a>0 &lt; 1 so 1 &gt; 0</a>" + b.to_s # => "<b>1 &amp;gt; 0 so 0 &amp;lt; 1</b>" diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/child.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/child.rdoc new file mode 100644 index 000000000000..8953638113e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/child.rdoc @@ -0,0 +1,87 @@ +== Class Child + +Class Child includes module Node; +see {Tasks for Node}[node_rdoc.html]. + +:include: ../tocs/child_toc.rdoc + +=== Relationships + +==== Task: Set the Parent + +Use method {Child#parent=}[../../../../REXML/Parent.html#method-i-parent-3D] +to set the parent: + + e0 = REXML::Element.new('foo') + e1 = REXML::Element.new('bar') + e1.parent # => nil + e1.parent = e0 + e1.parent # => <foo/> + +==== Task: Insert Previous Sibling + +Use method {Child#previous_sibling=}[../../../../REXML/Parent.html#method-i-previous_sibling-3D] +to insert a previous sibling: + + xml_string = '<root><a/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.to_a # => [<a/>, <c/>] + c = d.root[1] # => <c/> + b = REXML::Element.new('b') + c.previous_sibling = b + d.root.to_a # => [<a/>, <b/>, <c/>] + +==== Task: Insert Next Sibling + +Use method {Child#next_sibling=}[../../../../REXML/Parent.html#method-i-next-sibling-3D] +to insert a previous sibling: + + xml_string = '<root><a/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.to_a # => [<a/>, <c/>] + a = d.root[0] # => <a/> + b = REXML::Element.new('b') + a.next_sibling = b + d.root.to_a # => [<a/>, <b/>, <c/>] + +=== Removal or Replacement + +==== Task: Remove Child from Parent + +Use method {Child#remove}[../../../../REXML/Parent.html#method-i-remove] +to remove a child from its parent; returns the removed child: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.to_a # => [<a/>, <b/>, <c/>] + b = d.root[1] # => <b/> + b.remove # => <b/> + d.root.to_a # => [<a/>, <c/>] + +==== Task: Replace Child + +Use method {Child#replace_with}[../../../../REXML/Parent.html#method-i-replace] +to replace a child; +returns the replaced child: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.to_a # => [<a/>, <b/>, <c/>] + b = d.root[1] # => <b/> + d = REXML::Element.new('d') + b.replace_with(d) # => <b/> + d.root.to_a # => [<a/>, <d/>, <c/>] + +=== Document + +==== Task: Get the Document + +Use method {Child#document}[../../../../REXML/Parent.html#method-i-document] +to get the document for the child: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.to_a # => [<a/>, <b/>, <c/>] + b = d.root[1] # => <b/> + b.document == d # => true + REXML::Child.new.document # => nil diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/document.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/document.rdoc new file mode 100644 index 000000000000..96d0335136e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/document.rdoc @@ -0,0 +1,276 @@ +== Class Document + +Class Document has methods from its superclasses and included modules; +see: + +- {Tasks for Element}[element_rdoc.html]. +- {Tasks for Parent}[parent_rdoc.html]. +- {Tasks for Child}[child_rdoc.html]. +- {Tasks for Node}[node_rdoc.html]. +- {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html]. + +:include: ../tocs/document_toc.rdoc + +=== New Document + +==== Task: Create an Empty Document + +Use method {Document::new}[../../../../REXML/Document.html#method-c-new] +to create an empty document. + + d = REXML::Document.new + +==== Task: Parse a \String into a New Document + +Use method {Document::new}[../../../../REXML/Document.html#method-c-new] +to parse an XML string into a new document: + + xml_string = '<root><a/>text<b/>more<c/></root>' + d = REXML::Document.new(xml_string) + d.root # => <root> ... </> + +==== Task: Parse an \IO Stream into a New Document + +Use method {Document::new}[../../../../REXML/Document.html#method-c-new] +to parse an XML \IO stream into a new document: + + xml_string = '<root><a/>text<b/>more<c/></root>' + File.write('t.xml', xml_string) + d = File.open('t.xml', 'r') do |file| + REXML::Document.new(file) + end + d.root # => <root> ... </> + +==== Task: Create a Document from an Existing Document + +Use method {Document::new}[../../../../REXML/Document.html#method-c-new] +to create a document from an existing document. +The context and attributes are copied to the new document, +but not the children: + + xml_string = '<root><a/>text<b/>more<c/></root>' + d = REXML::Document.new(xml_string) + d.children # => [<root> ... </>] + d.context = {raw: :all, compress_whitespace: :all} + d.add_attributes({'bar' => 0, 'baz' => 1}) + d1 = REXML::Document.new(d) + d1.context # => {:raw=>:all, :compress_whitespace=>:all} + d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'} + d1.children # => [] + +==== Task: Clone a Document + +Use method {Document#clone}[../../../../REXML/Document.html#method-i-clone] +to clone a document. +The context and attributes are copied to the new document, +but not the children: + + xml_string = '<root><a/>text<b/>more<c/></root>' + d = REXML::Document.new(xml_string) + d.children # => [<root> ... </>] + d.context = {raw: :all, compress_whitespace: :all} + d.add_attributes({'bar' => 0, 'baz' => 1}) + d1 = d.clone # => < bar='0' baz='1'/> + d1.context # => {:raw=>:all, :compress_whitespace=>:all} + d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'} + d1.children # => [] + +=== Document Type + +==== Task: Get the Document Type + +Use method {Document#doctype}[../../../../REXML/Document.html#method-i-doctype] +to get the document type: + + d = REXML::Document.new('<!DOCTYPE document SYSTEM "subjects.dtd">') + d.doctype.class # => REXML::DocType + d = REXML::Document.new('') + d.doctype.class # => nil + +==== Task: Set the Document Type + +Use method {document#add}[../../../../REXML/Document.html#method-i-add] +to add or replace the document type: + + d = REXML::Document.new('') + d.doctype.class # => nil + d.add(REXML::DocType.new('foo')) + d.doctype.class # => REXML::DocType + +=== XML Declaration + +==== Task: Get the XML Declaration + +Use method {document#xml_decl}[../../../../REXML/Document.html#method-i-xml_decl] +to get the XML declaration: + + d = REXML::Document.new('<!DOCTYPE document SYSTEM "subjects.dtd">') + d.xml_decl.class # => REXML::XMLDecl + d.xml_decl # => <?xml ... ?> + d = REXML::Document.new('') + d.xml_decl.class # => REXML::XMLDecl + d.xml_decl # => <?xml ... ?> + +==== Task: Set the XML Declaration + +Use method {document#add}[../../../../REXML/Document.html#method-i-add] +to replace the XML declaration: + + d = REXML::Document.new('<!DOCTYPE document SYSTEM "subjects.dtd">') + d.add(REXML::XMLDecl.new) + +=== Children + +==== Task: Add an Element Child + +Use method +{document#add_element}[../../../../REXML/Document.html#method-i-add_element] +to add an element to the document: + + d = REXML::Document.new('') + d.add_element(REXML::Element.new('root')) + d.children # => [<root/>] + +==== Task: Add a Non-Element Child + +Use method +{document#add}[../../../../REXML/Document.html#method-i-add] +to add a non-element to the document: + + xml_string = '<root><a/>text<b/>more<c/></root>' + d = REXML::Document.new(xml_string) + d.add(REXML::Text.new('foo')) + d.children # => [<root> ... </>, "foo"] + +=== Writing + +==== Task: Write to $stdout + +Use method +{document#write}[../../../../REXML/Document.html#method-i-write] +to write the document to <tt>$stdout</tt>: + + xml_string = '<root><a/>text<b/>more<c/></root>' + d = REXML::Document.new(xml_string) + d.write + +Output: + + <root><a/>text<b/>more<c/></root> + +==== Task: Write to IO Stream + +Use method +{document#write}[../../../../REXML/Document.html#method-i-write] +to write the document to <tt>$stdout</tt>: + + xml_string = '<root><a/>text<b/>more<c/></root>' + d = REXML::Document.new(xml_string) + File.open('t.xml', 'w') do |file| + d.write(file) + end + p File.read('t.xml') + +Output: + + "<root><a/>text<b/>more<c/></root>" + +==== Task: Write with No Indentation + +Use method +{document#write}[../../../../REXML/Document.html#method-i-write] +to write the document with no indentation: + + xml_string = '<root><a><b><c></c></b></a></root>' + d = REXML::Document.new(xml_string) + d.write({indent: 0}) + +Output: + + <root> + <a> + <b> + <c/> + </b> + </a> + </root> + +==== Task: Write with Specified Indentation + +Use method +{document#write}[../../../../REXML/Document.html#method-i-write] +to write the document with a specified indentation: + + xml_string = '<root><a><b><c></c></b></a></root>' + d = REXML::Document.new(xml_string) + d.write({indent: 2}) + +Output: + + <root> + <a> + <b> + <c/> + </b> + </a> + </root> + +=== Querying + +==== Task: Get the Document + +Use method +{document#document}[../../../../REXML/Document.html#method-i-document] +to get the document (+self+); overrides <tt>Element#document</tt>: + + xml_string = '<root><a><b><c></c></b></a></root>' + d = REXML::Document.new(xml_string) + d.document == d # => true + +==== Task: Get the Encoding + +Use method +{document#document}[../../../../REXML/Document.html#method-i-document] +to get the document (+self+); overrides <tt>Element#document</tt>: + + xml_string = '<root><a><b><c></c></b></a></root>' + d = REXML::Document.new(xml_string) + d.encoding # => "UTF-8" + +==== Task: Get the Node Type + +Use method +{document#node_type}[../../../../REXML/Document.html#method-i-node_type] +to get the node type (+:document+); overrides <tt>Element#node_type</tt>: + + xml_string = '<root><a><b><c></c></b></a></root>' + d = REXML::Document.new(xml_string) + d.node_type # => :document + +==== Task: Get the Root Element + +Use method +{document#root}[../../../../REXML/Document.html#method-i-root] +to get the root element: + + xml_string = '<root><a><b><c></c></b></a></root>' + d = REXML::Document.new(xml_string) + d.root # => <root> ... </> + +==== Task: Determine Whether Stand-Alone + +Use method +{document#stand_alone?}[../../../../REXML/Document.html#method-i-stand_alone-3F] +to get the stand-alone value: + + d = REXML::Document.new('<?xml standalone="yes"?>') + d.stand_alone? # => "yes" + +==== Task: Get the Version + +Use method +{document#version}[../../../../REXML/Document.html#method-i-version] +to get the version: + + d = REXML::Document.new('<?xml version="2.0" encoding="UTF-8"?>') + d.version # => "2.0" diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/element.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/element.rdoc new file mode 100644 index 000000000000..f229275fd479 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/element.rdoc @@ -0,0 +1,602 @@ +== Class Element + +Class Element has methods from its superclasses and included modules; +see: + +- {Tasks for Parent}[parent_rdoc.html]. +- {Tasks for Child}[child_rdoc.html]. +- {Tasks for Node}[node_rdoc.html]. +- {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html]. + +:include: ../tocs/element_toc.rdoc + +=== New Element + +==== Task: Create a Default Element + +Use method +{Element::new}[../../../../REXML/Element.html#method-c-new] +with no arguments to create a default element: + + e = REXML::Element.new + e.name # => "UNDEFINED" + e.parent # => nil + e.context # => nil + +==== Task: Create a Named Element + +Use method +{Element::new}[../../../../REXML/Element.html#method-c-new] +with a string name argument +to create a named element: + + e = REXML::Element.new('foo') + e.name # => "foo" + e.parent # => nil + e.context # => nil + +==== Task: Create an Element with Name and Parent + +Use method +{Element::new}[../../../../REXML/Element.html#method-c-new] +with name and parent arguments +to create an element with name and parent: + + p = REXML::Parent.new + e = REXML::Element.new('foo', p) + e.name # => "foo" + e.parent # => #<REXML::Parent @parent=nil, @children=[<foo/>]> + e.context # => nil + +==== Task: Create an Element with Name, Parent, and Context + +Use method +{Element::new}[../../../../REXML/Element.html#method-c-new] +with name, parent, and context arguments +to create an element with name, parent, and context: + + p = REXML::Parent.new + e = REXML::Element.new('foo', p, {compress_whitespace: :all}) + e.name # => "foo" + e.parent # => #<REXML::Parent @parent=nil, @children=[<foo/>]> + e.context # => {:compress_whitespace=>:all} + +==== Task: Create a Shallow Clone + +Use method +{Element#clone}[../../../../REXML/Element.html#method-i-clone] +to create a shallow clone of an element, +copying only the name, attributes, and context: + + e0 = REXML::Element.new('foo', nil, {compress_whitespace: :all}) + e0.add_attribute(REXML::Attribute.new('bar', 'baz')) + e0.context = {compress_whitespace: :all} + e1 = e0.clone # => <foo bar='baz'/> + e1.name # => "foo" + e1.context # => {:compress_whitespace=>:all} + +=== Attributes + +==== Task: Create and Add an Attribute + +Use method +{Element#add_attribute}[../../../../REXML/Element.html#method-i-add_attribute] +to create and add an attribute: + + e = REXML::Element.new + e.add_attribute('attr', 'value') # => "value" + e['attr'] # => "value" + e.add_attribute('attr', 'VALUE') # => "VALUE" + e['attr'] # => "VALUE" + +==== Task: Add an Existing Attribute + +Use method +{Element#add_attribute}[../../../../REXML/Element.html#method-i-add_attribute] +to add an existing attribute: + + e = REXML::Element.new + a = REXML::Attribute.new('attr', 'value') + e.add_attribute(a) + e['attr'] # => "value" + a = REXML::Attribute.new('attr', 'VALUE') + e.add_attribute(a) + e['attr'] # => "VALUE" + +==== Task: Add Multiple Attributes from a Hash + +Use method +{Element#add_attributes}[../../../../REXML/Element.html#method-i-add_attributes] +to add multiple attributes from a hash: + + e = REXML::Element.new + h = {'foo' => 0, 'bar' => 1} + e.add_attributes(h) + e['foo'] # => "0" + e['bar'] # => "1" + +==== Task: Add Multiple Attributes from an Array + +Use method +{Element#add_attributes}[../../../../REXML/Element.html#method-i-add_attributes] +to add multiple attributes from an array: + + e = REXML::Element.new + a = [['foo', 0], ['bar', 1]] + e.add_attributes(a) + e['foo'] # => "0" + e['bar'] # => "1" + +==== Task: Retrieve the Value for an Attribute Name + +Use method +{Element#[]}[../../../../REXML/Element.html#method-i-5B-5D] +to retrieve the value for an attribute name: + + e = REXML::Element.new + e.add_attribute('attr', 'value') # => "value" + e['attr'] # => "value" + +==== Task: Retrieve the Attribute Value for a Name and Namespace + +Use method +{Element#attribute}[../../../../REXML/Element.html#method-i-attribute] +to retrieve the value for an attribute name: + + xml_string = "<root xmlns:a='a' a:x='a:x' x='x'/>" + d = REXML::Document.new(xml_string) + e = d.root + e.attribute("x") # => x='x' + e.attribute("x", "a") # => a:x='a:x' + +==== Task: Delete an Attribute + +Use method +{Element#delete_attribute}[../../../../REXML/Element.html#method-i-delete_attribute] +to remove an attribute: + + e = REXML::Element.new('foo') + e.add_attribute('bar', 'baz') + e.delete_attribute('bar') + e.delete_attribute('bar') + e['bar'] # => nil + +==== Task: Determine Whether the Element Has Attributes + +Use method +{Element#has_attributes?}[../../../../REXML/Element.html#method-i-has_attributes-3F] +to determine whether the element has attributes: + + e = REXML::Element.new('foo') + e.has_attributes? # => false + e.add_attribute('bar', 'baz') + e.has_attributes? # => true + +=== Children + +<em>Element Children</em> + +==== Task: Create and Add an Element + +Use method +{Element#add_element}[../../../../REXML/Element.html#method-i-add_element] +to create a new element and add it to this element: + + e0 = REXML::Element.new('foo') + e0.add_element('bar') + e0.children # => [<bar/>] + +==== Task: Add an Existing Element + +Use method +{Element#add_element}[../../../../REXML/Element.html#method-i-add_element] +to add an element to this element: + + e0 = REXML::Element.new('foo') + e1 = REXML::Element.new('bar') + e0.add_element(e1) + e0.children # => [<bar/>] + +==== Task: Create and Add an Element with Attributes + +Use method +{Element#add_element}[../../../../REXML/Element.html#method-i-add_element] +to create a new element with attributes, and add it to this element: + + e0 = REXML::Element.new('foo') + e0.add_element('bar', {'name' => 'value'}) + e0.children # => [<bar name='value'/>] + +==== Task: Add an Existing Element with Added Attributes + +Use method +{Element#add_element}[../../../../REXML/Element.html#method-i-add_element] +to add an element to this element: + + e0 = REXML::Element.new('foo') + e1 = REXML::Element.new('bar') + e0.add_element(e1, {'name' => 'value'}) + e0.children # => [<bar name='value'/>] + +==== Task: Delete a Specified Element + +Use method +{Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element] +to remove a specified element from this element: + + e0 = REXML::Element.new('foo') + e1 = REXML::Element.new('bar') + e0.add_element(e1) + e0.children # => [<bar/>] + e0.delete_element(e1) + e0.children # => [] + +==== Task: Delete an Element by Index + +Use method +{Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element] +to remove an element from this element by index: + + e0 = REXML::Element.new('foo') + e1 = REXML::Element.new('bar') + e0.add_element(e1) + e0.children # => [<bar/>] + e0.delete_element(1) + e0.children # => [] + +==== Task: Delete an Element by XPath + +Use method +{Element#delete_element}[../../../../REXML/Element.html#method-i-delete_element] +to remove an element from this element by XPath: + + e0 = REXML::Element.new('foo') + e1 = REXML::Element.new('bar') + e0.add_element(e1) + e0.children # => [<bar/>] + e0.delete_element('//bar/') + e0.children # => [] + +==== Task: Determine Whether Element Children + +Use method +{Element#has_elements?}[../../../../REXML/Element.html#method-i-has_elements-3F] +to determine whether the element has element children: + + e0 = REXML::Element.new('foo') + e0.has_elements? # => false + e0.add_element(REXML::Element.new('bar')) + e0.has_elements? # => true + +==== Task: Get Element Descendants by XPath + +Use method +{Element#get_elements}[../../../../REXML/Element.html#method-i-get_elements] +to fetch all element descendant children by XPath: + + xml_string = <<-EOT + <root> + <a level='1'> + <a level='2'/> + </a> + </root> + EOT + d = REXML::Document.new(xml_string) + d.root.get_elements('//a') # => [<a level='1'> ... </>, <a level='2'/>] + +==== Task: Get Next Element Sibling + +Use method +{Element#next_element}[../../../../REXML/Element.html#method-i-next_element] +to retrieve the next element sibling: + + d = REXML::Document.new '<a><b/>text<c/></a>' + d.root.elements['b'].next_element #-> <c/> + d.root.elements['c'].next_element #-> nil + +==== Task: Get Previous Element Sibling + +Use method +{Element#previous_element}[../../../../REXML/Element.html#method-i-previous_element] +to retrieve the previous element sibling: + + d = REXML::Document.new '<a><b/>text<c/></a>' + d.root.elements['c'].previous_element #-> <b/> + d.root.elements['b'].previous_element #-> nil + +<em>Text Children</em> + +==== Task: Add a Text Node + +Use method +{Element#add_text}[../../../../REXML/Element.html#method-i-add_text] +to add a text node to the element: + + d = REXML::Document.new('<a>foo<b/>bar</a>') + e = d.root + e.add_text(REXML::Text.new('baz')) + e.to_a # => ["foo", <b/>, "bar", "baz"] + e.add_text(REXML::Text.new('baz')) + e.to_a # => ["foo", <b/>, "bar", "baz", "baz"] + +==== Task: Replace the First Text Node + +Use method +{Element#text=}[../../../../REXML/Element.html#method-i-text-3D] +to replace the first text node in the element: + + d = REXML::Document.new('<root><a/>text<b/>more<c/></root>') + e = d.root + e.to_a # => [<a/>, "text", <b/>, "more", <c/>] + e.text = 'oops' + e.to_a # => [<a/>, "oops", <b/>, "more", <c/>] + +==== Task: Remove the First Text Node + +Use method +{Element#text=}[../../../../REXML/Element.html#method-i-text-3D] +to remove the first text node in the element: + + d = REXML::Document.new('<root><a/>text<b/>more<c/></root>') + e = d.root + e.to_a # => [<a/>, "text", <b/>, "more", <c/>] + e.text = nil + e.to_a # => [<a/>, <b/>, "more", <c/>] + +==== Task: Retrieve the First Text Node + +Use method +{Element#get_text}[../../../../REXML/Element.html#method-i-get_text] +to retrieve the first text node in the element: + + d = REXML::Document.new('<root><a/>text<b/>more<c/></root>') + e = d.root + e.to_a # => [<a/>, "text", <b/>, "more", <c/>] + e.get_text # => "text" + +==== Task: Retrieve a Specific Text Node + +Use method +{Element#get_text}[../../../../REXML/Element.html#method-i-get_text] +to retrieve the first text node in a specified element: + + d = REXML::Document.new "<root>some text <b>this is bold!</b> more text</root>" + e = d.root + e.get_text('//root') # => "some text " + e.get_text('//b') # => "this is bold!" + +==== Task: Determine Whether the Element has Text Nodes + +Use method +{Element#has_text?}[../../../../REXML/Element.html#method-i-has_text-3F] +to determine whethe the element has text: + + e = REXML::Element.new('foo') + e.has_text? # => false + e.add_text('bar') + e.has_text? # => true + +<em>Other Children</em> + +==== Task: Get the Child at a Given Index + +Use method +{Element#[]}[../../../../REXML/Element.html#method-i-5B-5D] +to retrieve the child at a given index: + + d = REXML::Document.new '><root><a/>text<b/>more<c/></root>' + e = d.root + e[0] # => <a/> + e[1] # => "text" + e[2] # => <b/> + +==== Task: Get All CDATA Children + +Use method +{Element#cdatas}[../../../../REXML/Element.html#method-i-cdatas] +to retrieve all CDATA children: + + xml_string = <<-EOT + <root> + <![CDATA[foo]]> + <![CDATA[bar]]> + </root> + EOT + d = REXML::Document.new(xml_string) + d.root.cdatas # => ["foo", "bar"] + +==== Task: Get All Comment Children + +Use method +{Element#comments}[../../../../REXML/Element.html#method-i-comments] +to retrieve all comment children: + + xml_string = <<-EOT + <root> + <!--foo--> + <!--bar--> + </root> + EOT + d = REXML::Document.new(xml_string) + d.root.comments.map {|comment| comment.to_s } # => ["foo", "bar"] + +==== Task: Get All Processing Instruction Children + +Use method +{Element#instructions}[../../../../REXML/Element.html#method-i-instructions] +to retrieve all processing instruction children: + + xml_string = <<-EOT + <root> + <?target0 foo?> + <?target1 bar?> + </root> + EOT + d = REXML::Document.new(xml_string) + instructions = d.root.instructions.map {|instruction| instruction.to_s } + instructions # => ["<?target0 foo?>", "<?target1 bar?>"] + +==== Task: Get All Text Children + +Use method +{Element#texts}[../../../../REXML/Element.html#method-i-texts] +to retrieve all text children: + + xml_string = '<root><a/>text<b/>more<c/></root>' + d = REXML::Document.new(xml_string) + d.root.texts # => ["text", "more"] + +=== Namespaces + +==== Task: Add a Namespace + +Use method +{Element#add_namespace}[../../../../REXML/Element.html#method-i-add_namespace] +to add a namespace to the element: + + e = REXML::Element.new('foo') + e.add_namespace('bar') + e.namespaces # => {"xmlns"=>"bar"} + +==== Task: Delete the Default Namespace + +Use method +{Element#delete_namespace}[../../../../REXML/Element.html#method-i-delete_namespace] +to remove the default namespace from the element: + + d = REXML::Document.new "<a xmlns:foo='bar' xmlns='twiddle'/>" + d.to_s # => "<a xmlns:foo='bar' xmlns='twiddle'/>" + d.root.delete_namespace # => <a xmlns:foo='bar'/> + d.to_s # => "<a xmlns:foo='bar'/>" + +==== Task: Delete a Specific Namespace + +Use method +{Element#delete_namespace}[../../../../REXML/Element.html#method-i-delete_namespace] +to remove a specific namespace from the element: + + d = REXML::Document.new "<a xmlns:foo='bar' xmlns='twiddle'/>" + d.to_s # => "<a xmlns:foo='bar' xmlns='twiddle'/>" + d.root.delete_namespace # => <a xmlns:foo='bar'/> + d.to_s # => "<a xmlns:foo='bar'/>" + d.root.delete_namespace('foo') + d.to_s # => "<a/>" + +==== Task: Get a Namespace URI + +Use method +{Element#namespace}[../../../../REXML/Element.html#method-i-namespace] +to retrieve a speficic namespace URI for the element: + + xml_string = <<-EOT + <root> + <a xmlns='1' xmlns:y='2'> + <b/> + <c xmlns:z='3'/> + </a> + </root> + EOT + d = REXML::Document.new(xml_string) + b = d.elements['//b'] + b.namespace # => "1" + b.namespace('y') # => "2" + +==== Task: Retrieve Namespaces + +Use method +{Element#namespaces}[../../../../REXML/Element.html#method-i-namespaces] +to retrieve all namespaces for the element: + + xml_string = '<a xmlns="foo" xmlns:x="bar" xmlns:y="twee" z="glorp"/>' + d = REXML::Document.new(xml_string) + d.root.attributes.namespaces # => {"xmlns"=>"foo", "x"=>"bar", "y"=>"twee"} + +==== Task: Retrieve Namespace Prefixes + +Use method +{Element#prefixes}[../../../../REXML/Element.html#method-i-prefixes] +to retrieve all prefixes (namespace names) for the element: + + xml_string = <<-EOT + <root> + <a xmlns:x='1' xmlns:y='2'> + <b/> + <c xmlns:z='3'/> + </a> + </root> + EOT + d = REXML::Document.new(xml_string, {compress_whitespace: :all}) + d.elements['//a'].prefixes # => ["x", "y"] + d.elements['//b'].prefixes # => ["x", "y"] + d.elements['//c'].prefixes # => ["x", "y", "z"] + +=== Iteration + +==== Task: Iterate Over Elements + +Use method +{Element#each_element}[../../../../REXML/Element.html#method-i-each_element] +to iterate over element children: + + d = REXML::Document.new '<a><b>b</b><c>b</c><d>d</d><e/></a>' + d.root.each_element {|e| p e } + +Output: + + <b> ... </> + <c> ... </> + <d> ... </> + <e/> + +==== Task: Iterate Over Elements Having a Specified Attribute + +Use method +{Element#each_element_with_attribute}[../../../../REXML/Element.html#method-i-each_element_with_attribute] +to iterate over element children that have a specified attribute: + + d = REXML::Document.new '<a><b id="1"/><c id="2"/><d id="1"/><e/></a>' + a = d.root + a.each_element_with_attribute('id') {|e| p e } + +Output: + + <b id='1'/> + <c id='2'/> + <d id='1'/> + +==== Task: Iterate Over Elements Having a Specified Attribute and Value + +Use method +{Element#each_element_with_attribute}[../../../../REXML/Element.html#method-i-each_element_with_attribute] +to iterate over element children that have a specified attribute and value: + + d = REXML::Document.new '<a><b id="1"/><c id="2"/><d id="1"/><e/></a>' + a = d.root + a.each_element_with_attribute('id', '1') {|e| p e } + +Output: + + <b id='1'/> + <d id='1'/> + +==== Task: Iterate Over Elements Having Specified Text + +Use method +{Element#each_element_with_text}[../../../../REXML/Element.html#method-i-each_element_with_text] +to iterate over element children that have specified text: + + +=== Context + +#whitespace +#ignore_whitespace_nodes +#raw + +=== Other Getters + +#document +#root +#root_node +#node_type +#xpath +#inspect diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/node.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/node.rdoc new file mode 100644 index 000000000000..d5d2e12adb9e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/node.rdoc @@ -0,0 +1,97 @@ +== Module Node + +:include: ../tocs/node_toc.rdoc + +=== Siblings + +==== Task: Find Previous Sibling + +Use method +{Node.previous_sibling_node}[../../../../REXML/Node.html#method-i-previous_sibling] +to retrieve the previous sibling: + + d = REXML::Document.new('<root><a/><b/><c/></root>') + b = d.root[1] # => <b/> + b.previous_sibling_node # => <a/> + +==== Task: Find Next Sibling + +Use method +{Node.next_sibling_node}[../../../../REXML/Node.html#method-i-next_sibling] +to retrieve the next sibling: + + d = REXML::Document.new('<root><a/><b/><c/></root>') + b = d.root[1] # => <b/> + b.next_sibling_node # => <c/> + +=== Position + +==== Task: Find Own Index Among Siblings + +Use method +{Node.index_in_parent}[../../../../REXML/Node.html#method-i-index_in_parent] +to retrieve the 1-based index of this node among its siblings: + + d = REXML::Document.new('<root><a/><b/><c/></root>') + b = d.root[1] # => <b/> + b.index_in_parent # => 2 + +=== Recursive Traversal + +==== Task: Traverse Each Recursively + +Use method +{Node.each_recursive}[../../../../REXML/Node.html#method-i-each_recursive] +to traverse a tree of nodes recursively: + + xml_string = '<root><a><b><c></c></b><b><c></c></b></a></root>' + d = REXML::Document.new(xml_string) + d.root.each_recursive {|node| p node } + +Output: + + <a> ... </> + <b> ... </> + <c/> + <b> ... </> + <c/> + +=== Recursive Search + +==== Task: Traverse Each Recursively + +Use method +{Node.find_first_recursive}[../../../../REXML/Node.html#method-i-find_first_recursive] +to search a tree of nodes recursively: + + xml_string = '<root><a><b><c></c></b><b><c></c></b></a></root>' + d = REXML::Document.new(xml_string) + d.root.find_first_recursive {|node| node.name == 'c' } # => <c/> + +=== Representation + +==== Task: Represent a String + +Use method {Node.to_s}[../../../../REXML/Node.html#method-i-to_s] +to represent the node as a string: + + xml_string = '<root><a><b><c></c></b><b><c></c></b></a></root>' + d = REXML::Document.new(xml_string) + d.root.to_s # => "<root><a><b><c/></b><b><c/></b></a></root>" + +=== Parent? + +==== Task: Determine Whether the Node is a Parent + +Use method {Node.parent?}[../../../../REXML/Node.html#method-i-parent-3F] +to determine whether the node is a parent; +class Text derives from Node: + + d = REXML::Document.new('<root><a/>text<b/>more<c/></root>') + t = d.root[1] # => "text" + t.parent? # => false + +Class Parent also derives from Node, but overrides this method: + + p = REXML::Parent.new + p.parent? # => true diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/parent.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/parent.rdoc new file mode 100644 index 000000000000..54f1dbe36610 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/parent.rdoc @@ -0,0 +1,267 @@ +== Class Parent + +Class Parent has methods from its superclasses and included modules; +see: + +- {Tasks for Child}[child_rdoc.html]. +- {Tasks for Node}[node_rdoc.html]. +- {Module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html]. + +:include: ../tocs/parent_toc.rdoc + +=== Queries + +==== Task: Get the Count of Children + +Use method {Parent#size}[../../../../REXML/Parent.html#method-i-size] +(or its alias +length+) to get the count of the parent's children: + + p = REXML::Parent.new + p.size # => 0 + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.size # => 3 + +==== Task: Get the Child at a Given Index + +Use method {Parent#[]}[../../../../REXML/Parent.html#method-i-5B-5D] +to get the child at a given index: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root[1] # => <b/> + d.root[-1] # => <c/> + d.root[50] # => nil + +==== Task: Get the Index of a Given Child + +Use method {Parent#index}[../../../../REXML/Parent.html#method-i-index] +to get the index (0-based offset) of a child: + + d = REXML::Document.new('<root></root>') + root = d.root + e0 = REXML::Element.new('foo') + e1 = REXML::Element.new('bar') + root.add(e0) # => <foo/> + root.add(e1) # => <bar/> + root.add(e0) # => <foo/> + root.add(e1) # => <bar/> + root.index(e0) # => 0 + root.index(e1) # => 1 + +==== Task: Get the Children + +Use method {Parent#children}[../../../../REXML/Parent.html#method-i-children] +(or its alias +to_a+) to get the parent's children: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.children # => [<a/>, <b/>, <c/>] + +==== Task: Determine Whether the Node is a Parent + +Use method {Parent#parent?}[../../../../REXML/Parent.html#method-i-parent-3F] +to determine whether the node is a parent; +class Text derives from Node: + + d = REXML::Document.new('<root><a/>text<b/>more<c/></root>') + t = d.root[1] # => "text" + t.parent? # => false + +Class Parent also derives from Node, but overrides this method: + + p = REXML::Parent.new + p.parent? # => true + +=== Additions + +==== Task: Add a Child at the Beginning + +Use method {Parent#unshift}[../../../../REXML/Parent.html#method-i-unshift] +to add a child as at the beginning of the children: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.children # => [<a/>, <b/>, <c/>] + d.root.unshift REXML::Element.new('d') + d.root.children # => [<d/>, <a/>, <b/>, <c/>] + +==== Task: Add a Child at the End + +Use method {Parent#<<}[../../../../REXML/Parent.html#method-i-3C-3C] +(or an alias +push+ or +add+) to add a child as at the end of the children: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.children # => [<a/>, <b/>, <c/>] + d.root << REXML::Element.new('d') + d.root.children # => [<a/>, <b/>, <c/>, <d/>] + +==== Task: Replace a Child with Another Child + +Use method {Parent#replace}[../../../../REXML/Parent.html#method-i-replace] + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.children # => [<a/>, <b/>, <c/>] + b = d.root[1] # => <b/> + d.replace_child(b, REXML::Element.new('d')) + d.root.children # => [<a/>, <c/>] + +==== Task: Replace Multiple Children with Another Child + +Use method {Parent#[]=}[../../../../REXML/Parent.html#method-i-parent-5B-5D-3D] +to replace multiple consecutive children with another child: + + xml_string = '<root><a/><b/><c/><d/></root>' + d = REXML::Document.new(xml_string) + d.root.children # => [<a/>, <b/>, <c/>, <d/>] + d.root[1, 2] = REXML::Element.new('x') + d.root.children # => [<a/>, <x/>, <d/>] + d.root[1, 5] = REXML::Element.new('x') + d.root.children # => [<a/>, <x/>] # BUG? + +==== Task: Insert Child Before a Given Child + +Use method {Parent#insert_before}[../../../../REXML/Parent.html#method-i-insert_before] +to insert a child immediately before a given child: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.children # => [<a/>, <b/>, <c/>] + b = d.root[1] # => <b/> + x = REXML::Element.new('x') + d.root.insert_before(b, x) + d.root.children # => [<a/>, <x/>, <b/>, <c/>] + +==== Task: Insert Child After a Given Child + +Use method {Parent#insert_after}[../../../../REXML/Parent.html#method-i-insert_after] +to insert a child immediately after a given child: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.children # => [<a/>, <b/>, <c/>] + b = d.root[1] # => <b/> + x = REXML::Element.new('x') + d.root.insert_after(b, x) + d.root.children # => [<a/>, <b/>, <x/>, <c/>] + +=== Deletions + +==== Task: Remove a Given Child + +Use method {Parent#delete}[../../../../REXML/Parent.html#method-i-delete] +to remove all occurrences of a given child: + + d = REXML::Document.new('<root></root>') + a = REXML::Element.new('a') + b = REXML::Element.new('b') + d.root.add(a) + d.root.add(b) + d.root.add(a) + d.root.add(b) + d.root.children # => [<a/>, <b/>, <a/>, <b/>] + d.root.delete(b) + d.root.children # => [<a/>, <a/>] + +==== Task: Remove the Child at a Specified Offset + +Use method {Parent#delete_at}[../../../../REXML/Parent.html#method-i-delete_at] +to remove the child at a specified offset: + + d = REXML::Document.new('<root></root>') + a = REXML::Element.new('a') + b = REXML::Element.new('b') + d.root.add(a) + d.root.add(b) + d.root.add(a) + d.root.add(b) + d.root.children # => [<a/>, <b/>, <a/>, <b/>] + d.root.delete_at(2) + d.root.children # => [<a/>, <b/>, <b/>] + +==== Task: Remove Children That Meet Specified Criteria + +Use method {Parent#delete_if}[../../../../REXML/Parent.html#method-i-delete_if] +to remove children that meet criteria specified in the given block: + + d = REXML::Document.new('<root></root>') + d.root.add(REXML::Element.new('x')) + d.root.add(REXML::Element.new('xx')) + d.root.add(REXML::Element.new('xxx')) + d.root.add(REXML::Element.new('xxxx')) + d.root.children # => [<x/>, <xx/>, <xxx/>, <xxxx/>] + d.root.delete_if {|child| child.name.size.odd? } + d.root.children # => [<xx/>, <xxxx/>] + +=== Iterations + +==== Task: Iterate Over Children + +Use method {Parent#each_child}[../../../../REXML/Parent.html#method-i-each_child] +(or its alias +each+) to iterate over all children: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.children # => [<a/>, <b/>, <c/>] + d.root.each_child {|child| p child } + +Output: + + <a/> + <b/> + <c/> + +==== Task: Iterate Over Child Indexes + +Use method {Parent#each_index}[../../../../REXML/Parent.html#method-i-each_index] +to iterate over all child indexes: + + xml_string = '<root><a/><b/><c/></root>' + d = REXML::Document.new(xml_string) + d.root.children # => [<a/>, <b/>, <c/>] + d.root.each_index {|child| p child } + +Output: + + 0 + 1 + 2 + +=== Clones + +==== Task: Clone Deeply + +Use method {Parent#deep_clone}[../../../../REXML/Parent.html#method-i-deep_clone] +to clone deeply; that is, to clone every nested node that is a Parent object: + + xml_string = <<-EOT + <?xml version="1.0" encoding="UTF-8"?> + <bookstore> + <book category="cooking"> + <title lang="en">Everyday Italian</title> + <author>Giada De Laurentiis</author> + <year>2005</year> + <price>30.00</price> + </book> + <book category="children"> + <title lang="en">Harry Potter</title> + <author>J K. Rowling</author> + <year>2005</year> + <price>29.99</price> + </book> + <book category="web"> + <title lang="en">Learning XML</title> + <author>Erik T. Ray</author> + <year>2003</year> + <price>39.95</price> + </book> + </bookstore> + EOT + d = REXML::Document.new(xml_string) + root = d.root + shallow = root.clone + deep = root.deep_clone + shallow.to_s.size # => 12 + deep.to_s.size # => 590 diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/child_toc.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/child_toc.rdoc new file mode 100644 index 000000000000..a2083a09dc7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/child_toc.rdoc @@ -0,0 +1,12 @@ +Tasks on this page: + +- {Relationships}[#label-Relationships] + - {Task: Set the Parent}[#label-Task-3A+Set+the+Parent] + - {Task: Insert Previous Sibling}[#label-Task-3A+Insert+Previous+Sibling] + - {Task: Insert Next Sibling}[#label-Task-3A+Insert+Next+Sibling] +- {Removal or Replacement}[#label-Removal+or+Replacement] + - {Task: Remove Child from Parent}[#label-Task-3A+Remove+Child+from+Parent] + - {Task: Replace Child}[#label-Task-3A+Replace+Child] +- {Document}[#label-Document] + - {Task: Get the Document}[#label-Task-3A+Get+the+Document] + diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/document_toc.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/document_toc.rdoc new file mode 100644 index 000000000000..5db055ffcf4d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/document_toc.rdoc @@ -0,0 +1,30 @@ +Tasks on this page: + +- {New Document}[#label-New+Document] + - {Task: Create an Empty Document}[#label-Task-3A+Create+an+Empty+Document] + - {Task: Parse a String into a New Document}[#label-Task-3A+Parse+a+String+into+a+New+Document] + - {Task: Parse an IO Stream into a New Document}[#label-Task-3A+Parse+an+IO+Stream+into+a+New+Document] + - {Task: Create a Document from an Existing Document}[#label-Task-3A+Create+a+Document+from+an+Existing+Document] + - {Task: Clone a Document}[#label-Task-3A+Clone+a+Document] +- {Document Type}[#label-Document+Type] + - {Task: Get the Document Type}[#label-Task-3A+Get+the+Document+Type] + - {Task: Set the Document Type}[#label-Task-3A+Set+the+Document+Type] +- {XML Declaration}[#label-XML+Declaration] + - {Task: Get the XML Declaration}[#label-Task-3A+Get+the+XML+Declaration] + - {Task: Set the XML Declaration}[#label-Task-3A+Set+the+XML+Declaration] +- {Children}[#label-Children] + - {Task: Add an Element Child}[#label-Task-3A+Add+an+Element+Child] + - {Task: Add a Non-Element Child}[#label-Task-3A+Add+a+Non-Element+Child] +- {Writing}[#label-Writing] + - {Task: Write to $stdout}[#label-Task-3A+Write+to+-24stdout] + - {Task: Write to IO Stream}[#label-Task-3A+Write+to+IO+Stream] + - {Task: Write with No Indentation}[#label-Task-3A+Write+with+No+Indentation] + - {Task: Write with Specified Indentation}[#label-Task-3A+Write+with+Specified+Indentation] +- {Querying}[#label-Querying] + - {Task: Get the Document}[#label-Task-3A+Get+the+Document] + - {Task: Get the Encoding}[#label-Task-3A+Get+the+Encoding] + - {Task: Get the Node Type}[#label-Task-3A+Get+the+Node+Type] + - {Task: Get the Root Element}[#label-Task-3A+Get+the+Root+Element] + - {Task: Determine Whether Stand-Alone}[#label-Task-3A+Determine+Whether+Stand-Alone] + - {Task: Get the Version}[#label-Task-3A+Get+the+Version] + diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/element_toc.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/element_toc.rdoc new file mode 100644 index 000000000000..60a504a5563a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/element_toc.rdoc @@ -0,0 +1,55 @@ +Tasks on this page: + +- {New Element}[#label-New+Element] + - {Task: Create a Default Element}[#label-Task-3A+Create+a+Default+Element] + - {Task: Create a Named Element}[#label-Task-3A+Create+a+Named+Element] + - {Task: Create an Element with Name and Parent}[#label-Task-3A+Create+an+Element+with+Name+and+Parent] + - {Task: Create an Element with Name, Parent, and Context}[#label-Task-3A+Create+an+Element+with+Name-2C+Parent-2C+and+Context] + - {Task: Create a Shallow Clone}[#label-Task-3A+Create+a+Shallow+Clone] +- {Attributes}[#label-Attributes] + - {Task: Create and Add an Attribute}[#label-Task-3A+Create+and+Add+an+Attribute] + - {Task: Add an Existing Attribute}[#label-Task-3A+Add+an+Existing+Attribute] + - {Task: Add Multiple Attributes from a Hash}[#label-Task-3A+Add+Multiple+Attributes+from+a+Hash] + - {Task: Add Multiple Attributes from an Array}[#label-Task-3A+Add+Multiple+Attributes+from+an+Array] + - {Task: Retrieve the Value for an Attribute Name}[#label-Task-3A+Retrieve+the+Value+for+an+Attribute+Name] + - {Task: Retrieve the Attribute Value for a Name and Namespace}[#label-Task-3A+Retrieve+the+Attribute+Value+for+a+Name+and+Namespace] + - {Task: Delete an Attribute}[#label-Task-3A+Delete+an+Attribute] + - {Task: Determine Whether the Element Has Attributes}[#label-Task-3A+Determine+Whether+the+Element+Has+Attributes] +- {Children}[#label-Children] + - {Task: Create and Add an Element}[#label-Task-3A+Create+and+Add+an+Element] + - {Task: Add an Existing Element}[#label-Task-3A+Add+an+Existing+Element] + - {Task: Create and Add an Element with Attributes}[#label-Task-3A+Create+and+Add+an+Element+with+Attributes] + - {Task: Add an Existing Element with Added Attributes}[#label-Task-3A+Add+an+Existing+Element+with+Added+Attributes] + - {Task: Delete a Specified Element}[#label-Task-3A+Delete+a+Specified+Element] + - {Task: Delete an Element by Index}[#label-Task-3A+Delete+an+Element+by+Index] + - {Task: Delete an Element by XPath}[#label-Task-3A+Delete+an+Element+by+XPath] + - {Task: Determine Whether Element Children}[#label-Task-3A+Determine+Whether+Element+Children] + - {Task: Get Element Descendants by XPath}[#label-Task-3A+Get+Element+Descendants+by+XPath] + - {Task: Get Next Element Sibling}[#label-Task-3A+Get+Next+Element+Sibling] + - {Task: Get Previous Element Sibling}[#label-Task-3A+Get+Previous+Element+Sibling] + - {Task: Add a Text Node}[#label-Task-3A+Add+a+Text+Node] + - {Task: Replace the First Text Node}[#label-Task-3A+Replace+the+First+Text+Node] + - {Task: Remove the First Text Node}[#label-Task-3A+Remove+the+First+Text+Node] + - {Task: Retrieve the First Text Node}[#label-Task-3A+Retrieve+the+First+Text+Node] + - {Task: Retrieve a Specific Text Node}[#label-Task-3A+Retrieve+a+Specific+Text+Node] + - {Task: Determine Whether the Element has Text Nodes}[#label-Task-3A+Determine+Whether+the+Element+has+Text+Nodes] + - {Task: Get the Child at a Given Index}[#label-Task-3A+Get+the+Child+at+a+Given+Index] + - {Task: Get All CDATA Children}[#label-Task-3A+Get+All+CDATA+Children] + - {Task: Get All Comment Children}[#label-Task-3A+Get+All+Comment+Children] + - {Task: Get All Processing Instruction Children}[#label-Task-3A+Get+All+Processing+Instruction+Children] + - {Task: Get All Text Children}[#label-Task-3A+Get+All+Text+Children] +- {Namespaces}[#label-Namespaces] + - {Task: Add a Namespace}[#label-Task-3A+Add+a+Namespace] + - {Task: Delete the Default Namespace}[#label-Task-3A+Delete+the+Default+Namespace] + - {Task: Delete a Specific Namespace}[#label-Task-3A+Delete+a+Specific+Namespace] + - {Task: Get a Namespace URI}[#label-Task-3A+Get+a+Namespace+URI] + - {Task: Retrieve Namespaces}[#label-Task-3A+Retrieve+Namespaces] + - {Task: Retrieve Namespace Prefixes}[#label-Task-3A+Retrieve+Namespace+Prefixes] +- {Iteration}[#label-Iteration] + - {Task: Iterate Over Elements}[#label-Task-3A+Iterate+Over+Elements] + - {Task: Iterate Over Elements Having a Specified Attribute}[#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute] + - {Task: Iterate Over Elements Having a Specified Attribute and Value}[#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute+and+Value] + - {Task: Iterate Over Elements Having Specified Text}[#label-Task-3A+Iterate+Over+Elements+Having+Specified+Text] +- {Context}[#label-Context] +- {Other Getters}[#label-Other+Getters] + diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/master_toc.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/master_toc.rdoc new file mode 100644 index 000000000000..0214f6b2da25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/master_toc.rdoc @@ -0,0 +1,135 @@ +== Tasks + +=== {Child}[../../tasks/rdoc/child_rdoc.html] +- {Relationships}[../../tasks/rdoc/child_rdoc.html#label-Relationships] + - {Task: Set the Parent}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Set+the+Parent] + - {Task: Insert Previous Sibling}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Insert+Previous+Sibling] + - {Task: Insert Next Sibling}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Insert+Next+Sibling] +- {Removal or Replacement}[../../tasks/rdoc/child_rdoc.html#label-Removal+or+Replacement] + - {Task: Remove Child from Parent}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Remove+Child+from+Parent] + - {Task: Replace Child}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Replace+Child] +- {Document}[../../tasks/rdoc/child_rdoc.html#label-Document] + - {Task: Get the Document}[../../tasks/rdoc/child_rdoc.html#label-Task-3A+Get+the+Document] + +=== {Document}[../../tasks/rdoc/document_rdoc.html] +- {New Document}[../../tasks/rdoc/document_rdoc.html#label-New+Document] + - {Task: Create an Empty Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Create+an+Empty+Document] + - {Task: Parse a String into a New Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Parse+a+String+into+a+New+Document] + - {Task: Parse an IO Stream into a New Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Parse+an+IO+Stream+into+a+New+Document] + - {Task: Create a Document from an Existing Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Create+a+Document+from+an+Existing+Document] + - {Task: Clone a Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Clone+a+Document] +- {Document Type}[../../tasks/rdoc/document_rdoc.html#label-Document+Type] + - {Task: Get the Document Type}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Document+Type] + - {Task: Set the Document Type}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Set+the+Document+Type] +- {XML Declaration}[../../tasks/rdoc/document_rdoc.html#label-XML+Declaration] + - {Task: Get the XML Declaration}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+XML+Declaration] + - {Task: Set the XML Declaration}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Set+the+XML+Declaration] +- {Children}[../../tasks/rdoc/document_rdoc.html#label-Children] + - {Task: Add an Element Child}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Add+an+Element+Child] + - {Task: Add a Non-Element Child}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Add+a+Non-Element+Child] +- {Writing}[../../tasks/rdoc/document_rdoc.html#label-Writing] + - {Task: Write to $stdout}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+to+-24stdout] + - {Task: Write to IO Stream}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+to+IO+Stream] + - {Task: Write with No Indentation}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+with+No+Indentation] + - {Task: Write with Specified Indentation}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Write+with+Specified+Indentation] +- {Querying}[../../tasks/rdoc/document_rdoc.html#label-Querying] + - {Task: Get the Document}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Document] + - {Task: Get the Encoding}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Encoding] + - {Task: Get the Node Type}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Node+Type] + - {Task: Get the Root Element}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Root+Element] + - {Task: Determine Whether Stand-Alone}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Determine+Whether+Stand-Alone] + - {Task: Get the Version}[../../tasks/rdoc/document_rdoc.html#label-Task-3A+Get+the+Version] + +=== {Element}[../../tasks/rdoc/element_rdoc.html] +- {New Element}[../../tasks/rdoc/element_rdoc.html#label-New+Element] + - {Task: Create a Default Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+a+Default+Element] + - {Task: Create a Named Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+a+Named+Element] + - {Task: Create an Element with Name and Parent}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+an+Element+with+Name+and+Parent] + - {Task: Create an Element with Name, Parent, and Context}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+an+Element+with+Name-2C+Parent-2C+and+Context] + - {Task: Create a Shallow Clone}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+a+Shallow+Clone] +- {Attributes}[../../tasks/rdoc/element_rdoc.html#label-Attributes] + - {Task: Create and Add an Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+and+Add+an+Attribute] + - {Task: Add an Existing Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+an+Existing+Attribute] + - {Task: Add Multiple Attributes from a Hash}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+Multiple+Attributes+from+a+Hash] + - {Task: Add Multiple Attributes from an Array}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+Multiple+Attributes+from+an+Array] + - {Task: Retrieve the Value for an Attribute Name}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+the+Value+for+an+Attribute+Name] + - {Task: Retrieve the Attribute Value for a Name and Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+the+Attribute+Value+for+a+Name+and+Namespace] + - {Task: Delete an Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+an+Attribute] + - {Task: Determine Whether the Element Has Attributes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Determine+Whether+the+Element+Has+Attributes] +- {Children}[../../tasks/rdoc/element_rdoc.html#label-Children] + - {Task: Create and Add an Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+and+Add+an+Element] + - {Task: Add an Existing Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+an+Existing+Element] + - {Task: Create and Add an Element with Attributes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Create+and+Add+an+Element+with+Attributes] + - {Task: Add an Existing Element with Added Attributes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+an+Existing+Element+with+Added+Attributes] + - {Task: Delete a Specified Element}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+a+Specified+Element] + - {Task: Delete an Element by Index}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+an+Element+by+Index] + - {Task: Delete an Element by XPath}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+an+Element+by+XPath] + - {Task: Determine Whether Element Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Determine+Whether+Element+Children] + - {Task: Get Element Descendants by XPath}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+Element+Descendants+by+XPath] + - {Task: Get Next Element Sibling}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+Next+Element+Sibling] + - {Task: Get Previous Element Sibling}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+Previous+Element+Sibling] + - {Task: Add a Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+a+Text+Node] + - {Task: Replace the First Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Replace+the+First+Text+Node] + - {Task: Remove the First Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Remove+the+First+Text+Node] + - {Task: Retrieve the First Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+the+First+Text+Node] + - {Task: Retrieve a Specific Text Node}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+a+Specific+Text+Node] + - {Task: Determine Whether the Element has Text Nodes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Determine+Whether+the+Element+has+Text+Nodes] + - {Task: Get the Child at a Given Index}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+the+Child+at+a+Given+Index] + - {Task: Get All CDATA Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+CDATA+Children] + - {Task: Get All Comment Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+Comment+Children] + - {Task: Get All Processing Instruction Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+Processing+Instruction+Children] + - {Task: Get All Text Children}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+All+Text+Children] +- {Namespaces}[../../tasks/rdoc/element_rdoc.html#label-Namespaces] + - {Task: Add a Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Add+a+Namespace] + - {Task: Delete the Default Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+the+Default+Namespace] + - {Task: Delete a Specific Namespace}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Delete+a+Specific+Namespace] + - {Task: Get a Namespace URI}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Get+a+Namespace+URI] + - {Task: Retrieve Namespaces}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+Namespaces] + - {Task: Retrieve Namespace Prefixes}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Retrieve+Namespace+Prefixes] +- {Iteration}[../../tasks/rdoc/element_rdoc.html#label-Iteration] + - {Task: Iterate Over Elements}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements] + - {Task: Iterate Over Elements Having a Specified Attribute}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute] + - {Task: Iterate Over Elements Having a Specified Attribute and Value}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements+Having+a+Specified+Attribute+and+Value] + - {Task: Iterate Over Elements Having Specified Text}[../../tasks/rdoc/element_rdoc.html#label-Task-3A+Iterate+Over+Elements+Having+Specified+Text] +- {Context}[../../tasks/rdoc/element_rdoc.html#label-Context] +- {Other Getters}[../../tasks/rdoc/element_rdoc.html#label-Other+Getters] + +=== {Node}[../../tasks/rdoc/node_rdoc.html] +- {Siblings}[../../tasks/rdoc/node_rdoc.html#label-Siblings] + - {Task: Find Previous Sibling}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Find+Previous+Sibling] + - {Task: Find Next Sibling}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Find+Next+Sibling] +- {Position}[../../tasks/rdoc/node_rdoc.html#label-Position] + - {Task: Find Own Index Among Siblings}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Find+Own+Index+Among+Siblings] +- {Recursive Traversal}[../../tasks/rdoc/node_rdoc.html#label-Recursive+Traversal] + - {Task: Traverse Each Recursively}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Traverse+Each+Recursively] +- {Recursive Search}[../../tasks/rdoc/node_rdoc.html#label-Recursive+Search] + - {Task: Traverse Each Recursively}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Traverse+Each+Recursively] +- {Representation}[../../tasks/rdoc/node_rdoc.html#label-Representation] + - {Task: Represent a String}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Represent+a+String] +- {Parent?}[../../tasks/rdoc/node_rdoc.html#label-Parent-3F] + - {Task: Determine Whether the Node is a Parent}[../../tasks/rdoc/node_rdoc.html#label-Task-3A+Determine+Whether+the+Node+is+a+Parent] + +=== {Parent}[../../tasks/rdoc/parent_rdoc.html] +- {Queries}[../../tasks/rdoc/parent_rdoc.html#label-Queries] + - {Task: Get the Count of Children}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Count+of+Children] + - {Task: Get the Child at a Given Index}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Child+at+a+Given+Index] + - {Task: Get the Index of a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Index+of+a+Given+Child] + - {Task: Get the Children}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Get+the+Children] + - {Task: Determine Whether the Node is a Parent}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Determine+Whether+the+Node+is+a+Parent] +- {Additions}[../../tasks/rdoc/parent_rdoc.html#label-Additions] + - {Task: Add a Child at the Beginning}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Add+a+Child+at+the+Beginning] + - {Task: Add a Child at the End}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Add+a+Child+at+the+End] + - {Task: Replace a Child with Another Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Replace+a+Child+with+Another+Child] + - {Task: Replace Multiple Children with Another Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Replace+Multiple+Children+with+Another+Child] + - {Task: Insert Child Before a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Insert+Child+Before+a+Given+Child] + - {Task: Insert Child After a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Insert+Child+After+a+Given+Child] +- {Deletions}[../../tasks/rdoc/parent_rdoc.html#label-Deletions] + - {Task: Remove a Given Child}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Remove+a+Given+Child] + - {Task: Remove the Child at a Specified Offset}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Remove+the+Child+at+a+Specified+Offset] + - {Task: Remove Children That Meet Specified Criteria}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Remove+Children+That+Meet+Specified+Criteria] +- {Iterations}[../../tasks/rdoc/parent_rdoc.html#label-Iterations] + - {Task: Iterate Over Children}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Iterate+Over+Children] + - {Task: Iterate Over Child Indexes}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Iterate+Over+Child+Indexes] +- {Clones}[../../tasks/rdoc/parent_rdoc.html#label-Clones] + - {Task: Clone Deeply}[../../tasks/rdoc/parent_rdoc.html#label-Task-3A+Clone+Deeply] + diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/node_toc.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/node_toc.rdoc new file mode 100644 index 000000000000..d9114faf1689 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/node_toc.rdoc @@ -0,0 +1,16 @@ +Tasks on this page: + +- {Siblings}[#label-Siblings] + - {Task: Find Previous Sibling}[#label-Task-3A+Find+Previous+Sibling] + - {Task: Find Next Sibling}[#label-Task-3A+Find+Next+Sibling] +- {Position}[#label-Position] + - {Task: Find Own Index Among Siblings}[#label-Task-3A+Find+Own+Index+Among+Siblings] +- {Recursive Traversal}[#label-Recursive+Traversal] + - {Task: Traverse Each Recursively}[#label-Task-3A+Traverse+Each+Recursively] +- {Recursive Search}[#label-Recursive+Search] + - {Task: Traverse Each Recursively}[#label-Task-3A+Traverse+Each+Recursively] +- {Representation}[#label-Representation] + - {Task: Represent a String}[#label-Task-3A+Represent+a+String] +- {Parent?}[#label-Parent-3F] + - {Task: Determine Whether the Node is a Parent}[#label-Task-3A+Determine+Whether+the+Node+is+a+Parent] + diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/parent_toc.rdoc b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/parent_toc.rdoc new file mode 100644 index 000000000000..68fc0b705fff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/parent_toc.rdoc @@ -0,0 +1,25 @@ +Tasks on this page: + +- {Queries}[#label-Queries] + - {Task: Get the Count of Children}[#label-Task-3A+Get+the+Count+of+Children] + - {Task: Get the Child at a Given Index}[#label-Task-3A+Get+the+Child+at+a+Given+Index] + - {Task: Get the Index of a Given Child}[#label-Task-3A+Get+the+Index+of+a+Given+Child] + - {Task: Get the Children}[#label-Task-3A+Get+the+Children] + - {Task: Determine Whether the Node is a Parent}[#label-Task-3A+Determine+Whether+the+Node+is+a+Parent] +- {Additions}[#label-Additions] + - {Task: Add a Child at the Beginning}[#label-Task-3A+Add+a+Child+at+the+Beginning] + - {Task: Add a Child at the End}[#label-Task-3A+Add+a+Child+at+the+End] + - {Task: Replace a Child with Another Child}[#label-Task-3A+Replace+a+Child+with+Another+Child] + - {Task: Replace Multiple Children with Another Child}[#label-Task-3A+Replace+Multiple+Children+with+Another+Child] + - {Task: Insert Child Before a Given Child}[#label-Task-3A+Insert+Child+Before+a+Given+Child] + - {Task: Insert Child After a Given Child}[#label-Task-3A+Insert+Child+After+a+Given+Child] +- {Deletions}[#label-Deletions] + - {Task: Remove a Given Child}[#label-Task-3A+Remove+a+Given+Child] + - {Task: Remove the Child at a Specified Offset}[#label-Task-3A+Remove+the+Child+at+a+Specified+Offset] + - {Task: Remove Children That Meet Specified Criteria}[#label-Task-3A+Remove+Children+That+Meet+Specified+Criteria] +- {Iterations}[#label-Iterations] + - {Task: Iterate Over Children}[#label-Task-3A+Iterate+Over+Children] + - {Task: Iterate Over Child Indexes}[#label-Task-3A+Iterate+Over+Child+Indexes] +- {Clones}[#label-Clones] + - {Task: Clone Deeply}[#label-Task-3A+Clone+Deeply] + diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml.rb new file mode 100644 index 000000000000..eee246e43681 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require_relative "rexml/document" diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attlistdecl.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attlistdecl.rb new file mode 100644 index 000000000000..44a91d66d631 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attlistdecl.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: false +#vim:ts=2 sw=2 noexpandtab: +require_relative 'child' +require_relative 'source' + +module REXML + # This class needs: + # * Documentation + # * Work! Not all types of attlists are intelligently parsed, so we just + # spew back out what we get in. This works, but it would be better if + # we formatted the output ourselves. + # + # AttlistDecls provide *just* enough support to allow namespace + # declarations. If you need some sort of generalized support, or have an + # interesting idea about how to map the hideous, terrible design of DTD + # AttlistDecls onto an intuitive Ruby interface, let me know. I'm desperate + # for anything to make DTDs more palateable. + class AttlistDecl < Child + include Enumerable + + # What is this? Got me. + attr_reader :element_name + + # Create an AttlistDecl, pulling the information from a Source. Notice + # that this isn't very convenient; to create an AttlistDecl, you basically + # have to format it yourself, and then have the initializer parse it. + # Sorry, but for the foreseeable future, DTD support in REXML is pretty + # weak on convenience. Have I mentioned how much I hate DTDs? + def initialize(source) + super() + if (source.kind_of? Array) + @element_name, @pairs, @contents = *source + end + end + + # Access the attlist attribute/value pairs. + # value = attlist_decl[ attribute_name ] + def [](key) + @pairs[key] + end + + # Whether an attlist declaration includes the given attribute definition + # if attlist_decl.include? "xmlns:foobar" + def include?(key) + @pairs.keys.include? key + end + + # Iterate over the key/value pairs: + # attlist_decl.each { |attribute_name, attribute_value| ... } + def each(&block) + @pairs.each(&block) + end + + # Write out exactly what we got in. + def write out, indent=-1 + out << @contents + end + + def node_type + :attlistdecl + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attribute.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attribute.rb new file mode 100644 index 000000000000..8933a013a25a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attribute.rb @@ -0,0 +1,205 @@ +# frozen_string_literal: false +require_relative "namespace" +require_relative 'text' + +module REXML + # Defines an Element Attribute; IE, a attribute=value pair, as in: + # <element attribute="value"/>. Attributes can be in their own + # namespaces. General users of REXML will not interact with the + # Attribute class much. + class Attribute + include Node + include Namespace + + # The element to which this attribute belongs + attr_reader :element + # The normalized value of this attribute. That is, the attribute with + # entities intact. + attr_writer :normalized + PATTERN = /\s*(#{NAME_STR})\s*=\s*(["'])(.*?)\2/um + + NEEDS_A_SECOND_CHECK = /(<|&((#{Entity::NAME});|(#0*((?:\d+)|(?:x[a-fA-F0-9]+)));)?)/um + + # Constructor. + # FIXME: The parser doesn't catch illegal characters in attributes + # + # first:: + # Either: an Attribute, which this new attribute will become a + # clone of; or a String, which is the name of this attribute + # second:: + # If +first+ is an Attribute, then this may be an Element, or nil. + # If nil, then the Element parent of this attribute is the parent + # of the +first+ Attribute. If the first argument is a String, + # then this must also be a String, and is the content of the attribute. + # If this is the content, it must be fully normalized (contain no + # illegal characters). + # parent:: + # Ignored unless +first+ is a String; otherwise, may be the Element + # parent of this attribute, or nil. + # + # + # Attribute.new( attribute_to_clone ) + # Attribute.new( attribute_to_clone, parent_element ) + # Attribute.new( "attr", "attr_value" ) + # Attribute.new( "attr", "attr_value", parent_element ) + def initialize( first, second=nil, parent=nil ) + @normalized = @unnormalized = @element = nil + if first.kind_of? Attribute + self.name = first.expanded_name + @unnormalized = first.value + if second.kind_of? Element + @element = second + else + @element = first.element + end + elsif first.kind_of? String + @element = parent + self.name = first + @normalized = second.to_s + else + raise "illegal argument #{first.class.name} to Attribute constructor" + end + end + + # Returns the namespace of the attribute. + # + # e = Element.new( "elns:myelement" ) + # e.add_attribute( "nsa:a", "aval" ) + # e.add_attribute( "b", "bval" ) + # e.attributes.get_attribute( "a" ).prefix # -> "nsa" + # e.attributes.get_attribute( "b" ).prefix # -> "" + # a = Attribute.new( "x", "y" ) + # a.prefix # -> "" + def prefix + super + end + + # Returns the namespace URL, if defined, or nil otherwise + # + # e = Element.new("el") + # e.add_namespace("ns", "http://url") + # e.add_attribute("ns:a", "b") + # e.add_attribute("nsx:a", "c") + # e.attribute("ns:a").namespace # => "http://url" + # e.attribute("nsx:a").namespace # => nil + # + # This method always returns "" for no namespace attribute. Because + # the default namespace doesn't apply to attribute names. + # + # From https://www.w3.org/TR/xml-names/#uniqAttrs + # + # > the default namespace does not apply to attribute names + # + # e = REXML::Element.new("el") + # e.add_namespace("", "http://example.com/") + # e.namespace # => "http://example.com/" + # e.add_attribute("a", "b") + # e.attribute("a").namespace # => "" + def namespace arg=nil + arg = prefix if arg.nil? + if arg == "" + "" + else + @element.namespace(arg) + end + end + + # Returns true if other is an Attribute and has the same name and value, + # false otherwise. + def ==( other ) + other.kind_of?(Attribute) and other.name==name and other.value==value + end + + # Creates (and returns) a hash from both the name and value + def hash + name.hash + value.hash + end + + # Returns this attribute out as XML source, expanding the name + # + # a = Attribute.new( "x", "y" ) + # a.to_string # -> "x='y'" + # b = Attribute.new( "ns:x", "y" ) + # b.to_string # -> "ns:x='y'" + def to_string + if @element and @element.context and @element.context[:attribute_quote] == :quote + %Q^#@expanded_name="#{to_s().gsub(/"/, '&quot;')}"^ + else + "#@expanded_name='#{to_s().gsub(/'/, '&apos;')}'" + end + end + + def doctype + if @element + doc = @element.document + doc.doctype if doc + end + end + + # Returns the attribute value, with entities replaced + def to_s + return @normalized if @normalized + + @normalized = Text::normalize( @unnormalized, doctype ) + @unnormalized = nil + @normalized + end + + # Returns the UNNORMALIZED value of this attribute. That is, entities + # have been expanded to their values + def value + return @unnormalized if @unnormalized + @unnormalized = Text::unnormalize( @normalized, doctype ) + @normalized = nil + @unnormalized + end + + # Returns a copy of this attribute + def clone + Attribute.new self + end + + # Sets the element of which this object is an attribute. Normally, this + # is not directly called. + # + # Returns this attribute + def element=( element ) + @element = element + + if @normalized + Text.check( @normalized, NEEDS_A_SECOND_CHECK, doctype ) + end + + self + end + + # Removes this Attribute from the tree, and returns true if successful + # + # This method is usually not called directly. + def remove + @element.attributes.delete self.name unless @element.nil? + end + + # Writes this attribute (EG, puts 'key="value"' to the output) + def write( output, indent=-1 ) + output << to_string + end + + def node_type + :attribute + end + + def inspect + rv = "" + write( rv ) + rv + end + + def xpath + path = @element.xpath + path += "/@#{self.expanded_name}" + return path + end + end +end +#vim:ts=2 sw=2 noexpandtab: diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/cdata.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/cdata.rb new file mode 100644 index 000000000000..997f5a08dbce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/cdata.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: false +require_relative "text" + +module REXML + class CData < Text + START = '<![CDATA[' + STOP = ']]>' + ILLEGAL = /(\]\]>)/ + + # Constructor. CData is data between <![CDATA[ ... ]]> + # + # _Examples_ + # CData.new( source ) + # CData.new( "Here is some CDATA" ) + # CData.new( "Some unprocessed data", respect_whitespace_TF, parent_element ) + def initialize( first, whitespace=true, parent=nil ) + super( first, whitespace, parent, false, true, ILLEGAL ) + end + + # Make a copy of this object + # + # _Examples_ + # c = CData.new( "Some text" ) + # d = c.clone + # d.to_s # -> "Some text" + def clone + CData.new self + end + + # Returns the content of this CData object + # + # _Examples_ + # c = CData.new( "Some text" ) + # c.to_s # -> "Some text" + def to_s + @string + end + + def value + @string + end + + # == DEPRECATED + # See the rexml/formatters package + # + # Generates XML output of this object + # + # output:: + # Where to write the string. Defaults to $stdout + # indent:: + # The amount to indent this node by + # transitive:: + # Ignored + # ie_hack:: + # Ignored + # + # _Examples_ + # c = CData.new( " Some text " ) + # c.write( $stdout ) #-> <![CDATA[ Some text ]]> + def write( output=$stdout, indent=-1, transitive=false, ie_hack=false ) + Kernel.warn( "#{self.class.name}.write is deprecated", uplevel: 1) + indent( output, indent ) + output << START + output << @string + output << STOP + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/child.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/child.rb new file mode 100644 index 000000000000..cc6e9a471991 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/child.rb @@ -0,0 +1,97 @@ +# frozen_string_literal: false +require_relative "node" + +module REXML + ## + # A Child object is something contained by a parent, and this class + # contains methods to support that. Most user code will not use this + # class directly. + class Child + include Node + attr_reader :parent # The Parent of this object + + # Constructor. Any inheritors of this class should call super to make + # sure this method is called. + # parent:: + # if supplied, the parent of this child will be set to the + # supplied value, and self will be added to the parent + def initialize( parent = nil ) + @parent = nil + # Declare @parent, but don't define it. The next line sets the + # parent. + parent.add( self ) if parent + end + + # Replaces this object with another object. Basically, calls + # Parent.replace_child + # + # Returns:: self + def replace_with( child ) + @parent.replace_child( self, child ) + self + end + + # Removes this child from the parent. + # + # Returns:: self + def remove + unless @parent.nil? + @parent.delete self + end + self + end + + # Sets the parent of this child to the supplied argument. + # + # other:: + # Must be a Parent object. If this object is the same object as the + # existing parent of this child, no action is taken. Otherwise, this + # child is removed from the current parent (if one exists), and is added + # to the new parent. + # Returns:: The parent added + def parent=( other ) + return @parent if @parent == other + @parent.delete self if defined? @parent and @parent + @parent = other + end + + alias :next_sibling :next_sibling_node + alias :previous_sibling :previous_sibling_node + + # Sets the next sibling of this child. This can be used to insert a child + # after some other child. + # a = Element.new("a") + # b = a.add_element("b") + # c = Element.new("c") + # b.next_sibling = c + # # => <a><b/><c/></a> + def next_sibling=( other ) + parent.insert_after self, other + end + + # Sets the previous sibling of this child. This can be used to insert a + # child before some other child. + # a = Element.new("a") + # b = a.add_element("b") + # c = Element.new("c") + # b.previous_sibling = c + # # => <a><b/><c/></a> + def previous_sibling=(other) + parent.insert_before self, other + end + + # Returns:: the document this child belongs to, or nil if this child + # belongs to no document + def document + return parent.document unless parent.nil? + nil + end + + # This doesn't yet handle encodings + def bytes + document.encoding + + to_s + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/comment.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/comment.rb new file mode 100644 index 000000000000..52c58b46f6fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/comment.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: false +require_relative "child" + +module REXML + ## + # Represents an XML comment; that is, text between \<!-- ... --> + class Comment < Child + include Comparable + START = "<!--" + STOP = "-->" + + # The content text + + attr_accessor :string + + ## + # Constructor. The first argument can be one of three types: + # @param first If String, the contents of this comment are set to the + # argument. If Comment, the argument is duplicated. If + # Source, the argument is scanned for a comment. + # @param second If the first argument is a Source, this argument + # should be nil, not supplied, or a Parent to be set as the parent + # of this object + def initialize( first, second = nil ) + super(second) + if first.kind_of? String + @string = first + elsif first.kind_of? Comment + @string = first.string + end + end + + def clone + Comment.new self + end + + # == DEPRECATED + # See REXML::Formatters + # + # output:: + # Where to write the string + # indent:: + # An integer. If -1, no indenting will be used; otherwise, the + # indentation will be this number of spaces, and children will be + # indented an additional amount. + # transitive:: + # Ignored by this class. The contents of comments are never modified. + # ie_hack:: + # Needed for conformity to the child API, but not used by this class. + def write( output, indent=-1, transitive=false, ie_hack=false ) + Kernel.warn("Comment.write is deprecated. See REXML::Formatters", uplevel: 1) + indent( output, indent ) + output << START + output << @string + output << STOP + end + + alias :to_s :string + + ## + # Compares this Comment to another; the contents of the comment are used + # in the comparison. + def <=>(other) + other.to_s <=> @string + end + + ## + # Compares this Comment to another; the contents of the comment are used + # in the comparison. + def ==( other ) + other.kind_of? Comment and + (other <=> self) == 0 + end + + def node_type + :comment + end + end +end +#vim:ts=2 sw=2 noexpandtab: diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/doctype.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/doctype.rb new file mode 100644 index 000000000000..f35904845e40 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/doctype.rb @@ -0,0 +1,311 @@ +# frozen_string_literal: false +require_relative "parent" +require_relative "parseexception" +require_relative "namespace" +require_relative 'entity' +require_relative 'attlistdecl' +require_relative 'xmltokens' + +module REXML + class ReferenceWriter + def initialize(id_type, + public_id_literal, + system_literal, + context=nil) + @id_type = id_type + @public_id_literal = public_id_literal + @system_literal = system_literal + if context and context[:prologue_quote] == :apostrophe + @default_quote = "'" + else + @default_quote = "\"" + end + end + + def write(output) + output << " #{@id_type}" + if @public_id_literal + if @public_id_literal.include?("'") + quote = "\"" + else + quote = @default_quote + end + output << " #{quote}#{@public_id_literal}#{quote}" + end + if @system_literal + if @system_literal.include?("'") + quote = "\"" + elsif @system_literal.include?("\"") + quote = "'" + else + quote = @default_quote + end + output << " #{quote}#{@system_literal}#{quote}" + end + end + end + + # Represents an XML DOCTYPE declaration; that is, the contents of <!DOCTYPE + # ... >. DOCTYPES can be used to declare the DTD of a document, as well as + # being used to declare entities used in the document. + class DocType < Parent + include XMLTokens + START = "<!DOCTYPE" + STOP = ">" + SYSTEM = "SYSTEM" + PUBLIC = "PUBLIC" + DEFAULT_ENTITIES = { + 'gt'=>EntityConst::GT, + 'lt'=>EntityConst::LT, + 'quot'=>EntityConst::QUOT, + "apos"=>EntityConst::APOS + } + + # name is the name of the doctype + # external_id is the referenced DTD, if given + attr_reader :name, :external_id, :entities, :namespaces + + # Constructor + # + # dt = DocType.new( 'foo', '-//I/Hate/External/IDs' ) + # # <!DOCTYPE foo '-//I/Hate/External/IDs'> + # dt = DocType.new( doctype_to_clone ) + # # Incomplete. Shallow clone of doctype + # + # +Note+ that the constructor: + # + # Doctype.new( Source.new( "<!DOCTYPE foo 'bar'>" ) ) + # + # is _deprecated_. Do not use it. It will probably disappear. + def initialize( first, parent=nil ) + @entities = DEFAULT_ENTITIES + @long_name = @uri = nil + if first.kind_of? String + super() + @name = first + @external_id = parent + elsif first.kind_of? DocType + super( parent ) + @name = first.name + @external_id = first.external_id + @long_name = first.instance_variable_get(:@long_name) + @uri = first.instance_variable_get(:@uri) + elsif first.kind_of? Array + super( parent ) + @name = first[0] + @external_id = first[1] + @long_name = first[2] + @uri = first[3] + elsif first.kind_of? Source + super( parent ) + parser = Parsers::BaseParser.new( first ) + event = parser.pull + if event[0] == :start_doctype + @name, @external_id, @long_name, @uri, = event[1..-1] + end + else + super() + end + end + + def node_type + :doctype + end + + def attributes_of element + rv = [] + each do |child| + child.each do |key,val| + rv << Attribute.new(key,val) + end if child.kind_of? AttlistDecl and child.element_name == element + end + rv + end + + def attribute_of element, attribute + att_decl = find do |child| + child.kind_of? AttlistDecl and + child.element_name == element and + child.include? attribute + end + return nil unless att_decl + att_decl[attribute] + end + + def clone + DocType.new self + end + + # output:: + # Where to write the string + # indent:: + # An integer. If -1, no indentation will be used; otherwise, the + # indentation will be this number of spaces, and children will be + # indented an additional amount. + # transitive:: + # Ignored + # ie_hack:: + # Ignored + def write( output, indent=0, transitive=false, ie_hack=false ) + f = REXML::Formatters::Default.new + indent( output, indent ) + output << START + output << ' ' + output << @name + if @external_id + reference_writer = ReferenceWriter.new(@external_id, + @long_name, + @uri, + context) + reference_writer.write(output) + end + unless @children.empty? + output << ' [' + @children.each { |child| + output << "\n" + f.write( child, output ) + } + output << "\n]" + end + output << STOP + end + + def context + if @parent + @parent.context + else + nil + end + end + + def entity( name ) + @entities[name].unnormalized if @entities[name] + end + + def add child + super(child) + @entities = DEFAULT_ENTITIES.clone if @entities == DEFAULT_ENTITIES + @entities[ child.name ] = child if child.kind_of? Entity + end + + # This method retrieves the public identifier identifying the document's + # DTD. + # + # Method contributed by Henrik Martensson + def public + case @external_id + when "SYSTEM" + nil + when "PUBLIC" + @long_name + end + end + + # This method retrieves the system identifier identifying the document's DTD + # + # Method contributed by Henrik Martensson + def system + case @external_id + when "SYSTEM" + @long_name + when "PUBLIC" + @uri.kind_of?(String) ? @uri : nil + end + end + + # This method returns a list of notations that have been declared in the + # _internal_ DTD subset. Notations in the external DTD subset are not + # listed. + # + # Method contributed by Henrik Martensson + def notations + children().select {|node| node.kind_of?(REXML::NotationDecl)} + end + + # Retrieves a named notation. Only notations declared in the internal + # DTD subset can be retrieved. + # + # Method contributed by Henrik Martensson + def notation(name) + notations.find { |notation_decl| + notation_decl.name == name + } + end + end + + # We don't really handle any of these since we're not a validating + # parser, so we can be pretty dumb about them. All we need to be able + # to do is spew them back out on a write() + + # This is an abstract class. You never use this directly; it serves as a + # parent class for the specific declarations. + class Declaration < Child + def initialize src + super() + @string = src + end + + def to_s + @string+'>' + end + + # == DEPRECATED + # See REXML::Formatters + # + def write( output, indent ) + output << to_s + end + end + + public + class ElementDecl < Declaration + def initialize( src ) + super + end + end + + class ExternalEntity < Child + def initialize( src ) + super() + @entity = src + end + def to_s + @entity + end + def write( output, indent ) + output << @entity + end + end + + class NotationDecl < Child + attr_accessor :public, :system + def initialize name, middle, pub, sys + super(nil) + @name = name + @middle = middle + @public = pub + @system = sys + end + + def to_s + context = nil + context = parent.context if parent + notation = "<!NOTATION #{@name}" + reference_writer = ReferenceWriter.new(@middle, @public, @system, context) + reference_writer.write(notation) + notation << ">" + notation + end + + def write( output, indent=-1 ) + output << to_s + end + + # This method retrieves the name of the notation. + # + # Method contributed by Henrik Martensson + def name + @name + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/document.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/document.rb new file mode 100644 index 000000000000..2edeb9873b5a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/document.rb @@ -0,0 +1,451 @@ +# frozen_string_literal: false +require_relative "security" +require_relative "element" +require_relative "xmldecl" +require_relative "source" +require_relative "comment" +require_relative "doctype" +require_relative "instruction" +require_relative "rexml" +require_relative "parseexception" +require_relative "output" +require_relative "parsers/baseparser" +require_relative "parsers/streamparser" +require_relative "parsers/treeparser" + +module REXML + # Represents an XML document. + # + # A document may have: + # + # - A single child that may be accessed via method #root. + # - An XML declaration. + # - A document type. + # - Processing instructions. + # + # == In a Hurry? + # + # If you're somewhat familiar with XML + # and have a particular task in mind, + # you may want to see the + # {tasks pages}[../doc/rexml/tasks/tocs/master_toc_rdoc.html], + # and in particular, the + # {tasks page for documents}[../doc/rexml/tasks/tocs/document_toc_rdoc.html]. + # + class Document < Element + # A convenient default XML declaration. Use: + # + # mydoc << XMLDecl.default + # + DECLARATION = XMLDecl.default + + # :call-seq: + # new(string = nil, context = {}) -> new_document + # new(io_stream = nil, context = {}) -> new_document + # new(document = nil, context = {}) -> new_document + # + # Returns a new \REXML::Document object. + # + # When no arguments are given, + # returns an empty document: + # + # d = REXML::Document.new + # d.to_s # => "" + # + # When argument +string+ is given, it must be a string + # containing a valid XML document: + # + # xml_string = '<root><foo>Foo</foo><bar>Bar</bar></root>' + # d = REXML::Document.new(xml_string) + # d.to_s # => "<root><foo>Foo</foo><bar>Bar</bar></root>" + # + # When argument +io_stream+ is given, it must be an \IO object + # that is opened for reading, and when read must return a valid XML document: + # + # File.write('t.xml', xml_string) + # d = File.open('t.xml', 'r') do |io| + # REXML::Document.new(io) + # end + # d.to_s # => "<root><foo>Foo</foo><bar>Bar</bar></root>" + # + # When argument +document+ is given, it must be an existing + # document object, whose context and attributes (but not chidren) + # are cloned into the new document: + # + # d = REXML::Document.new(xml_string) + # d.children # => [<root> ... </>] + # d.context = {raw: :all, compress_whitespace: :all} + # d.add_attributes({'bar' => 0, 'baz' => 1}) + # d1 = REXML::Document.new(d) + # d1.children # => [] + # d1.context # => {:raw=>:all, :compress_whitespace=>:all} + # d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'} + # + # When argument +context+ is given, it must be a hash + # containing context entries for the document; + # see {Element Context}[../doc/rexml/context_rdoc.html]: + # + # context = {raw: :all, compress_whitespace: :all} + # d = REXML::Document.new(xml_string, context) + # d.context # => {:raw=>:all, :compress_whitespace=>:all} + # + def initialize( source = nil, context = {} ) + @entity_expansion_count = 0 + super() + @context = context + return if source.nil? + if source.kind_of? Document + @context = source.context + super source + else + build( source ) + end + end + + # :call-seq: + # node_type -> :document + # + # Returns the symbol +:document+. + # + def node_type + :document + end + + # :call-seq: + # clone -> new_document + # + # Returns the new document resulting from executing + # <tt>Document.new(self)</tt>. See Document.new. + # + def clone + Document.new self + end + + # :call-seq: + # expanded_name -> empty_string + # + # Returns an empty string. + # + def expanded_name + '' + #d = doc_type + #d ? d.name : "UNDEFINED" + end + alias :name :expanded_name + + # :call-seq: + # add(xml_decl) -> self + # add(doc_type) -> self + # add(object) -> self + # + # Adds an object to the document; returns +self+. + # + # When argument +xml_decl+ is given, + # it must be an REXML::XMLDecl object, + # which becomes the XML declaration for the document, + # replacing the previous XML declaration if any: + # + # d = REXML::Document.new + # d.xml_decl.to_s # => "" + # d.add(REXML::XMLDecl.new('2.0')) + # d.xml_decl.to_s # => "<?xml version='2.0'?>" + # + # When argument +doc_type+ is given, + # it must be an REXML::DocType object, + # which becomes the document type for the document, + # replacing the previous document type, if any: + # + # d = REXML::Document.new + # d.doctype.to_s # => "" + # d.add(REXML::DocType.new('foo')) + # d.doctype.to_s # => "<!DOCTYPE foo>" + # + # When argument +object+ (not an REXML::XMLDecl or REXML::DocType object) + # is given it is added as the last child: + # + # d = REXML::Document.new + # d.add(REXML::Element.new('foo')) + # d.to_s # => "<foo/>" + # + def add( child ) + if child.kind_of? XMLDecl + if @children[0].kind_of? XMLDecl + @children[0] = child + else + @children.unshift child + end + child.parent = self + elsif child.kind_of? DocType + # Find first Element or DocType node and insert the decl right + # before it. If there is no such node, just insert the child at the + # end. If there is a child and it is an DocType, then replace it. + insert_before_index = @children.find_index { |x| + x.kind_of?(Element) || x.kind_of?(DocType) + } + if insert_before_index # Not null = not end of list + if @children[ insert_before_index ].kind_of? DocType + @children[ insert_before_index ] = child + else + @children[ insert_before_index-1, 0 ] = child + end + else # Insert at end of list + @children << child + end + child.parent = self + else + rv = super + raise "attempted adding second root element to document" if @elements.size > 1 + rv + end + end + alias :<< :add + + # :call-seq: + # add_element(name_or_element = nil, attributes = nil) -> new_element + # + # Adds an element to the document by calling REXML::Element.add_element: + # + # REXML::Element.add_element(name_or_element, attributes) + def add_element(arg=nil, arg2=nil) + rv = super + raise "attempted adding second root element to document" if @elements.size > 1 + rv + end + + # :call-seq: + # root -> root_element or nil + # + # Returns the root element of the document, if it exists, otherwise +nil+: + # + # d = REXML::Document.new('<root></root>') + # d.root # => <root/> + # d = REXML::Document.new('') + # d.root # => nil + # + def root + elements[1] + #self + #@children.find { |item| item.kind_of? Element } + end + + # :call-seq: + # doctype -> doc_type or nil + # + # Returns the DocType object for the document, if it exists, otherwise +nil+: + # + # d = REXML::Document.new('<!DOCTYPE document SYSTEM "subjects.dtd">') + # d.doctype.class # => REXML::DocType + # d = REXML::Document.new('') + # d.doctype.class # => nil + # + def doctype + @children.find { |item| item.kind_of? DocType } + end + + # :call-seq: + # xml_decl -> xml_decl + # + # Returns the XMLDecl object for the document, if it exists, + # otherwise the default XMLDecl object: + # + # d = REXML::Document.new('<?xml version="1.0" encoding="UTF-8"?>') + # d.xml_decl.class # => REXML::XMLDecl + # d.xml_decl.to_s # => "<?xml version='1.0' encoding='UTF-8'?>" + # d = REXML::Document.new('') + # d.xml_decl.class # => REXML::XMLDecl + # d.xml_decl.to_s # => "" + # + def xml_decl + rv = @children[0] + return rv if rv.kind_of? XMLDecl + @children.unshift(XMLDecl.default)[0] + end + + # :call-seq: + # version -> version_string + # + # Returns the XMLDecl version of this document as a string, + # if it has been set, otherwise the default version: + # + # d = REXML::Document.new('<?xml version="2.0" encoding="UTF-8"?>') + # d.version # => "2.0" + # d = REXML::Document.new('') + # d.version # => "1.0" + # + def version + xml_decl().version + end + + # :call-seq: + # encoding -> encoding_string + # + # Returns the XMLDecl encoding of the document, + # if it has been set, otherwise the default encoding: + # + # d = REXML::Document.new('<?xml version="1.0" encoding="UTF-16"?>') + # d.encoding # => "UTF-16" + # d = REXML::Document.new('') + # d.encoding # => "UTF-8" + # + def encoding + xml_decl().encoding + end + + # :call-seq: + # stand_alone? + # + # Returns the XMLDecl standalone value of the document as a string, + # if it has been set, otherwise the default standalone value: + # + # d = REXML::Document.new('<?xml standalone="yes"?>') + # d.stand_alone? # => "yes" + # d = REXML::Document.new('') + # d.stand_alone? # => nil + # + def stand_alone? + xml_decl().stand_alone? + end + + # :call-seq: + # doc.write(output=$stdout, indent=-1, transtive=false, ie_hack=false, encoding=nil) + # doc.write(options={:output => $stdout, :indent => -1, :transtive => false, :ie_hack => false, :encoding => nil}) + # + # Write the XML tree out, optionally with indent. This writes out the + # entire XML document, including XML declarations, doctype declarations, + # and processing instructions (if any are given). + # + # A controversial point is whether Document should always write the XML + # declaration (<?xml version='1.0'?>) whether or not one is given by the + # user (or source document). REXML does not write one if one was not + # specified, because it adds unnecessary bandwidth to applications such + # as XML-RPC. + # + # Accept Nth argument style and options Hash style as argument. + # The recommended style is options Hash style for one or more + # arguments case. + # + # _Examples_ + # Document.new("<a><b/></a>").write + # + # output = "" + # Document.new("<a><b/></a>").write(output) + # + # output = "" + # Document.new("<a><b/></a>").write(:output => output, :indent => 2) + # + # See also the classes in the rexml/formatters package for the proper way + # to change the default formatting of XML output. + # + # _Examples_ + # + # output = "" + # tr = Transitive.new + # tr.write(Document.new("<a><b/></a>"), output) + # + # output:: + # output an object which supports '<< string'; this is where the + # document will be written. + # indent:: + # An integer. If -1, no indenting will be used; otherwise, the + # indentation will be twice this number of spaces, and children will be + # indented an additional amount. For a value of 3, every item will be + # indented 3 more levels, or 6 more spaces (2 * 3). Defaults to -1 + # transitive:: + # If transitive is true and indent is >= 0, then the output will be + # pretty-printed in such a way that the added whitespace does not affect + # the absolute *value* of the document -- that is, it leaves the value + # and number of Text nodes in the document unchanged. + # ie_hack:: + # This hack inserts a space before the /> on empty tags to address + # a limitation of Internet Explorer. Defaults to false + # encoding:: + # Encoding name as String. Change output encoding to specified encoding + # instead of encoding in XML declaration. + # Defaults to nil. It means encoding in XML declaration is used. + def write(*arguments) + if arguments.size == 1 and arguments[0].class == Hash + options = arguments[0] + + output = options[:output] + indent = options[:indent] + transitive = options[:transitive] + ie_hack = options[:ie_hack] + encoding = options[:encoding] + else + output, indent, transitive, ie_hack, encoding, = *arguments + end + + output ||= $stdout + indent ||= -1 + transitive = false if transitive.nil? + ie_hack = false if ie_hack.nil? + encoding ||= xml_decl.encoding + + if encoding != 'UTF-8' && !output.kind_of?(Output) + output = Output.new( output, encoding ) + end + formatter = if indent > -1 + if transitive + require_relative "formatters/transitive" + REXML::Formatters::Transitive.new( indent, ie_hack ) + else + REXML::Formatters::Pretty.new( indent, ie_hack ) + end + else + REXML::Formatters::Default.new( ie_hack ) + end + formatter.write( self, output ) + end + + + def Document::parse_stream( source, listener ) + Parsers::StreamParser.new( source, listener ).parse + end + + # Set the entity expansion limit. By default the limit is set to 10000. + # + # Deprecated. Use REXML::Security.entity_expansion_limit= instead. + def Document::entity_expansion_limit=( val ) + Security.entity_expansion_limit = val + end + + # Get the entity expansion limit. By default the limit is set to 10000. + # + # Deprecated. Use REXML::Security.entity_expansion_limit= instead. + def Document::entity_expansion_limit + return Security.entity_expansion_limit + end + + # Set the entity expansion limit. By default the limit is set to 10240. + # + # Deprecated. Use REXML::Security.entity_expansion_text_limit= instead. + def Document::entity_expansion_text_limit=( val ) + Security.entity_expansion_text_limit = val + end + + # Get the entity expansion limit. By default the limit is set to 10240. + # + # Deprecated. Use REXML::Security.entity_expansion_text_limit instead. + def Document::entity_expansion_text_limit + return Security.entity_expansion_text_limit + end + + attr_reader :entity_expansion_count + + def record_entity_expansion + @entity_expansion_count += 1 + if @entity_expansion_count > Security.entity_expansion_limit + raise "number of entity expansions exceeded, processing aborted." + end + end + + def document + self + end + + private + def build( source ) + Parsers::TreeParser.new( source, self ).parse + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/attlistdecl.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/attlistdecl.rb new file mode 100644 index 000000000000..1326cb21e4c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/attlistdecl.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: false +require_relative "../child" +module REXML + module DTD + class AttlistDecl < Child + START = "<!ATTLIST" + START_RE = /^\s*#{START}/um + PATTERN_RE = /\s*(#{START}.*?>)/um + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/dtd.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/dtd.rb new file mode 100644 index 000000000000..8b0f2d753afe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/dtd.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: false +require_relative "elementdecl" +require_relative "entitydecl" +require_relative "../comment" +require_relative "notationdecl" +require_relative "attlistdecl" +require_relative "../parent" + +module REXML + module DTD + class Parser + def Parser.parse( input ) + case input + when String + parse_helper input + when File + parse_helper input.read + end + end + + # Takes a String and parses it out + def Parser.parse_helper( input ) + contents = Parent.new + while input.size > 0 + case input + when ElementDecl.PATTERN_RE + match = $& + contents << ElementDecl.new( match ) + when AttlistDecl.PATTERN_RE + matchdata = $~ + contents << AttlistDecl.new( matchdata ) + when EntityDecl.PATTERN_RE + matchdata = $~ + contents << EntityDecl.new( matchdata ) + when Comment.PATTERN_RE + matchdata = $~ + contents << Comment.new( matchdata ) + when NotationDecl.PATTERN_RE + matchdata = $~ + contents << NotationDecl.new( matchdata ) + end + end + contents + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/elementdecl.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/elementdecl.rb new file mode 100644 index 000000000000..20ed0232441c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/elementdecl.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: false +require_relative "../child" +module REXML + module DTD + class ElementDecl < Child + START = "<!ELEMENT" + START_RE = /^\s*#{START}/um + # PATTERN_RE = /^\s*(#{START}.*?)>/um + PATTERN_RE = /^\s*#{START}\s+((?:[:\w][-\.\w]*:)?[-!\*\.\w]*)(.*?)>/ + #\s*((((["']).*?\5)|[^\/'">]*)*?)(\/)?>/um, true) + + def initialize match + @name = match[1] + @rest = match[2] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/entitydecl.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/entitydecl.rb new file mode 100644 index 000000000000..312df655ff26 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/entitydecl.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: false +require_relative "../child" +module REXML + module DTD + class EntityDecl < Child + START = "<!ENTITY" + START_RE = /^\s*#{START}/um + PUBLIC = /^\s*#{START}\s+(?:%\s+)?(\w+)\s+PUBLIC\s+((["']).*?\3)\s+((["']).*?\5)\s*>/um + SYSTEM = /^\s*#{START}\s+(?:%\s+)?(\w+)\s+SYSTEM\s+((["']).*?\3)(?:\s+NDATA\s+\w+)?\s*>/um + PLAIN = /^\s*#{START}\s+(\w+)\s+((["']).*?\3)\s*>/um + PERCENT = /^\s*#{START}\s+%\s+(\w+)\s+((["']).*?\3)\s*>/um + # <!ENTITY name SYSTEM "..."> + # <!ENTITY name "..."> + def initialize src + super() + md = nil + if src.match( PUBLIC ) + md = src.match( PUBLIC, true ) + @middle = "PUBLIC" + @content = "#{md[2]} #{md[4]}" + elsif src.match( SYSTEM ) + md = src.match( SYSTEM, true ) + @middle = "SYSTEM" + @content = md[2] + elsif src.match( PLAIN ) + md = src.match( PLAIN, true ) + @middle = "" + @content = md[2] + elsif src.match( PERCENT ) + md = src.match( PERCENT, true ) + @middle = "" + @content = md[2] + end + raise ParseException.new("failed Entity match", src) if md.nil? + @name = md[1] + end + + def to_s + rv = "<!ENTITY #@name " + rv << "#@middle " if @middle.size > 0 + rv << @content + rv + end + + def write( output, indent ) + indent( output, indent ) + output << to_s + end + + def EntityDecl.parse_source source, listener + md = source.match( PATTERN_RE, true ) + thing = md[0].squeeze(" \t\n\r") + listener.send inspect.downcase, thing + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/notationdecl.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/notationdecl.rb new file mode 100644 index 000000000000..04a9b08aa7dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/notationdecl.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: false +require_relative "../child" +module REXML + module DTD + class NotationDecl < Child + START = "<!NOTATION" + START_RE = /^\s*#{START}/um + PUBLIC = /^\s*#{START}\s+(\w[\w-]*)\s+(PUBLIC)\s+((["']).*?\4)\s*>/um + SYSTEM = /^\s*#{START}\s+(\w[\w-]*)\s+(SYSTEM)\s+((["']).*?\4)\s*>/um + def initialize src + super() + if src.match( PUBLIC ) + md = src.match( PUBLIC, true ) + elsif src.match( SYSTEM ) + md = src.match( SYSTEM, true ) + else + raise ParseException.new( "error parsing notation: no matching pattern", src ) + end + @name = md[1] + @middle = md[2] + @rest = md[3] + end + + def to_s + "<!NOTATION #@name #@middle #@rest>" + end + + def write( output, indent ) + indent( output, indent ) + output << to_s + end + + def NotationDecl.parse_source source, listener + md = source.match( PATTERN_RE, true ) + thing = md[0].squeeze(" \t\n\r") + listener.send inspect.downcase, thing + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/element.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/element.rb new file mode 100644 index 000000000000..4c21dbd555f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/element.rb @@ -0,0 +1,2599 @@ +# frozen_string_literal: false +require_relative "parent" +require_relative "namespace" +require_relative "attribute" +require_relative "cdata" +require_relative "xpath" +require_relative "parseexception" + +module REXML + # An implementation note about namespaces: + # As we parse, when we find namespaces we put them in a hash and assign + # them a unique ID. We then convert the namespace prefix for the node + # to the unique ID. This makes namespace lookup much faster for the + # cost of extra memory use. We save the namespace prefix for the + # context node and convert it back when we write it. + @@namespaces = {} + + # An \REXML::Element object represents an XML element. + # + # An element: + # + # - Has a name (string). + # - May have a parent (another element). + # - Has zero or more children + # (other elements, text, CDATA, processing instructions, and comments). + # - Has zero or more siblings + # (other elements, text, CDATA, processing instructions, and comments). + # - Has zero or more named attributes. + # + # == In a Hurry? + # + # If you're somewhat familiar with XML + # and have a particular task in mind, + # you may want to see the + # {tasks pages}[../doc/rexml/tasks/tocs/master_toc_rdoc.html], + # and in particular, the + # {tasks page for elements}[../doc/rexml/tasks/tocs/element_toc_rdoc.html]. + # + # === Name + # + # An element has a name, which is initially set when the element is created: + # + # e = REXML::Element.new('foo') + # e.name # => "foo" + # + # The name may be changed: + # + # e.name = 'bar' + # e.name # => "bar" + # + # + # === \Parent + # + # An element may have a parent. + # + # Its parent may be assigned explicitly when the element is created: + # + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new('bar', e0) + # e1.parent # => <foo> ... </> + # + # Note: the representation of an element always shows the element's name. + # If the element has children, the representation indicates that + # by including an ellipsis (<tt>...</tt>). + # + # The parent may be assigned explicitly at any time: + # + # e2 = REXML::Element.new('baz') + # e1.parent = e2 + # e1.parent # => <baz/> + # + # When an element is added as a child, its parent is set automatically: + # + # e1.add_element(e0) + # e0.parent # => <bar> ... </> + # + # For an element that has no parent, method +parent+ returns +nil+. + # + # === Children + # + # An element has zero or more children. + # The children are an ordered collection + # of all objects whose parent is the element itself. + # + # The children may include any combination of elements, text, comments, + # processing instructions, and CDATA. + # (This example keeps things clean by controlling whitespace + # via a +context+ setting.) + # + # xml_string = <<-EOT + # <root> + # <ele_0/> + # text 0 + # <!--comment 0--> + # <?target_0 pi_0?> + # <![CDATA[cdata 0]]> + # <ele_1/> + # text 1 + # <!--comment 1--> + # <?target_0 pi_1?> + # <![CDATA[cdata 1]]> + # </root> + # EOT + # context = {ignore_whitespace_nodes: :all, compress_whitespace: :all} + # d = REXML::Document.new(xml_string, context) + # root = d.root + # root.children.size # => 10 + # root.each {|child| p "#{child.class}: #{child}" } + # + # Output: + # + # "REXML::Element: <ele_0/>" + # "REXML::Text: \n text 0\n " + # "REXML::Comment: comment 0" + # "REXML::Instruction: <?target_0 pi_0?>" + # "REXML::CData: cdata 0" + # "REXML::Element: <ele_1/>" + # "REXML::Text: \n text 1\n " + # "REXML::Comment: comment 1" + # "REXML::Instruction: <?target_0 pi_1?>" + # "REXML::CData: cdata 1" + # + # A child may be added using inherited methods + # Parent#insert_before or Parent#insert_after: + # + # xml_string = '<root><a/><c/><d/></root>' + # d = REXML::Document.new(xml_string) + # root = d.root + # c = d.root[1] # => <c/> + # root.insert_before(c, REXML::Element.new('b')) + # root.to_a # => [<a/>, <b/>, <c/>, <d/>] + # + # A child may be replaced using Parent#replace_child: + # + # root.replace_child(c, REXML::Element.new('x')) + # root.to_a # => [<a/>, <b/>, <x/>, <d/>] + # + # A child may be removed using Parent#delete: + # + # x = root[2] # => <x/> + # root.delete(x) + # root.to_a # => [<a/>, <b/>, <d/>] + # + # === Siblings + # + # An element has zero or more siblings, + # which are the other children of the element's parent. + # + # In the example above, element +ele_1+ is between a CDATA sibling + # and a text sibling: + # + # ele_1 = root[5] # => <ele_1/> + # ele_1.previous_sibling # => "cdata 0" + # ele_1.next_sibling # => "\n text 1\n " + # + # === \Attributes + # + # An element has zero or more named attributes. + # + # A new element has no attributes: + # + # e = REXML::Element.new('foo') + # e.attributes # => {} + # + # Attributes may be added: + # + # e.add_attribute('bar', 'baz') + # e.add_attribute('bat', 'bam') + # e.attributes.size # => 2 + # e['bar'] # => "baz" + # e['bat'] # => "bam" + # + # An existing attribute may be modified: + # + # e.add_attribute('bar', 'bad') + # e.attributes.size # => 2 + # e['bar'] # => "bad" + # + # An existing attribute may be deleted: + # + # e.delete_attribute('bar') + # e.attributes.size # => 1 + # e['bar'] # => nil + # + # == What's Here + # + # To begin with, what's elsewhere? + # + # \Class \REXML::Element inherits from its ancestor classes: + # + # - REXML::Child + # - REXML::Parent + # + # \REXML::Element itself and its ancestors also include modules: + # + # - {Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html] + # - REXML::Namespace + # - REXML::Node + # - REXML::XMLTokens + # + # === Methods for Creating an \Element + # + # ::new:: Returns a new empty element. + # #clone:: Returns a clone of another element. + # + # === Methods for Attributes + # + # {[attribute_name]}[#method-i-5B-5D]:: Returns an attribute value. + # #add_attribute:: Adds a new attribute. + # #add_attributes:: Adds multiple new attributes. + # #attribute:: Returns the attribute value for a given name and optional namespace. + # #delete_attribute:: Removes an attribute. + # + # === Methods for Children + # + # {[index]}[#method-i-5B-5D]:: Returns the child at the given offset. + # #add_element:: Adds an element as the last child. + # #delete_element:: Deletes a child element. + # #each_element:: Calls the given block with each child element. + # #each_element_with_attribute:: Calls the given block with each child element + # that meets given criteria, + # which can include the attribute name. + # #each_element_with_text:: Calls the given block with each child element + # that meets given criteria, + # which can include text. + # #get_elements:: Returns an array of element children that match a given xpath. + # + # === Methods for \Text Children + # + # #add_text:: Adds a text node to the element. + # #get_text:: Returns a text node that meets specified criteria. + # #text:: Returns the text string from the first node that meets specified criteria. + # #texts:: Returns an array of the text children of the element. + # #text=:: Adds, removes, or replaces the first text child of the element + # + # === Methods for Other Children + # + # #cdatas:: Returns an array of the cdata children of the element. + # #comments:: Returns an array of the comment children of the element. + # #instructions:: Returns an array of the instruction children of the element. + # + # === Methods for Namespaces + # + # #add_namespace:: Adds a namespace to the element. + # #delete_namespace:: Removes a namespace from the element. + # #namespace:: Returns the string namespace URI for the element. + # #namespaces:: Returns a hash of all defined namespaces in the element. + # #prefixes:: Returns an array of the string prefixes (names) + # of all defined namespaces in the element + # + # === Methods for Querying + # + # #document:: Returns the document, if any, that the element belongs to. + # #root:: Returns the most distant element (not document) ancestor of the element. + # #root_node:: Returns the most distant ancestor of the element. + # #xpath:: Returns the string xpath to the element + # relative to the most distant parent + # #has_attributes?:: Returns whether the element has attributes. + # #has_elements?:: Returns whether the element has elements. + # #has_text?:: Returns whether the element has text. + # #next_element:: Returns the next sibling that is an element. + # #previous_element:: Returns the previous sibling that is an element. + # #raw:: Returns whether raw mode is set for the element. + # #whitespace:: Returns whether whitespace is respected for the element. + # #ignore_whitespace_nodes:: Returns whether whitespace nodes + # are to be ignored for the element. + # #node_type:: Returns symbol <tt>:element</tt>. + # + # === One More Method + # + # #inspect:: Returns a string representation of the element. + # + # === Accessors + # + # #elements:: Returns the REXML::Elements object for the element. + # #attributes:: Returns the REXML::Attributes object for the element. + # #context:: Returns or sets the context hash for the element. + # + class Element < Parent + include Namespace + + UNDEFINED = "UNDEFINED"; # The default name + + # Mechanisms for accessing attributes and child elements of this + # element. + attr_reader :attributes, :elements + # The context holds information about the processing environment, such as + # whitespace handling. + attr_accessor :context + + # :call-seq: + # Element.new(name = 'UNDEFINED', parent = nil, context = nil) -> new_element + # Element.new(element, parent = nil, context = nil) -> new_element + # + # Returns a new \REXML::Element object. + # + # When no arguments are given, + # returns an element with name <tt>'UNDEFINED'</tt>: + # + # e = REXML::Element.new # => <UNDEFINED/> + # e.class # => REXML::Element + # e.name # => "UNDEFINED" + # + # When only argument +name+ is given, + # returns an element of the given name: + # + # REXML::Element.new('foo') # => <foo/> + # + # When only argument +element+ is given, it must be an \REXML::Element object; + # returns a shallow copy of the given element: + # + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new(e0) # => <foo/> + # + # When argument +parent+ is also given, it must be an REXML::Parent object: + # + # e = REXML::Element.new('foo', REXML::Parent.new) + # e.parent # => #<REXML::Parent @parent=nil, @children=[<foo/>]> + # + # When argument +context+ is also given, it must be a hash + # representing the context for the element; + # see {Element Context}[../doc/rexml/context_rdoc.html]: + # + # e = REXML::Element.new('foo', nil, {raw: :all}) + # e.context # => {:raw=>:all} + # + def initialize( arg = UNDEFINED, parent=nil, context=nil ) + super(parent) + + @elements = Elements.new(self) + @attributes = Attributes.new(self) + @context = context + + if arg.kind_of? String + self.name = arg + elsif arg.kind_of? Element + self.name = arg.expanded_name + arg.attributes.each_attribute{ |attribute| + @attributes << Attribute.new( attribute ) + } + @context = arg.context + end + end + + # :call-seq: + # inspect -> string + # + # Returns a string representation of the element. + # + # For an element with no attributes and no children, shows the element name: + # + # REXML::Element.new.inspect # => "<UNDEFINED/>" + # + # Shows attributes, if any: + # + # e = REXML::Element.new('foo') + # e.add_attributes({'bar' => 0, 'baz' => 1}) + # e.inspect # => "<foo bar='0' baz='1'/>" + # + # Shows an ellipsis (<tt>...</tt>), if there are child elements: + # + # e.add_element(REXML::Element.new('bar')) + # e.add_element(REXML::Element.new('baz')) + # e.inspect # => "<foo bar='0' baz='1'> ... </>" + # + def inspect + rv = "<#@expanded_name" + + @attributes.each_attribute do |attr| + rv << " " + attr.write( rv, 0 ) + end + + if children.size > 0 + rv << "> ... </>" + else + rv << "/>" + end + end + + # :call-seq: + # clone -> new_element + # + # Returns a shallow copy of the element, containing the name and attributes, + # but not the parent or children: + # + # e = REXML::Element.new('foo') + # e.add_attributes({'bar' => 0, 'baz' => 1}) + # e.clone # => <foo bar='0' baz='1'/> + # + def clone + self.class.new self + end + + # :call-seq: + # root_node -> document or element + # + # Returns the most distant ancestor of +self+. + # + # When the element is part of a document, + # returns the root node of the document. + # Note that the root node is different from the document element; + # in this example +a+ is document element and the root node is its parent: + # + # d = REXML::Document.new('<a><b><c/></b></a>') + # top_element = d.first # => <a> ... </> + # child = top_element.first # => <b> ... </> + # d.root_node == d # => true + # top_element.root_node == d # => true + # child.root_node == d # => true + # + # When the element is not part of a document, but does have ancestor elements, + # returns the most distant ancestor element: + # + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new('bar') + # e1.parent = e0 + # e2 = REXML::Element.new('baz') + # e2.parent = e1 + # e2.root_node == e0 # => true + # + # When the element has no ancestor elements, + # returns +self+: + # + # e = REXML::Element.new('foo') + # e.root_node == e # => true + # + # Related: #root, #document. + # + def root_node + parent.nil? ? self : parent.root_node + end + + # :call-seq: + # root -> element + # + # Returns the most distant _element_ (not document) ancestor of the element: + # + # d = REXML::Document.new('<a><b><c/></b></a>') + # top_element = d.first + # child = top_element.first + # top_element.root == top_element # => true + # child.root == top_element # => true + # + # For a document, returns the topmost element: + # + # d.root == top_element # => true + # + # Related: #root_node, #document. + # + def root + return elements[1] if self.kind_of? Document + return self if parent.kind_of? Document or parent.nil? + return parent.root + end + + # :call-seq: + # document -> document or nil + # + # If the element is part of a document, returns that document: + # + # d = REXML::Document.new('<a><b><c/></b></a>') + # top_element = d.first + # child = top_element.first + # top_element.document == d # => true + # child.document == d # => true + # + # If the element is not part of a document, returns +nil+: + # + # REXML::Element.new.document # => nil + # + # For a document, returns +self+: + # + # d.document == d # => true + # + # Related: #root, #root_node. + # + def document + rt = root + rt.parent if rt + end + + # :call-seq: + # whitespace + # + # Returns +true+ if whitespace is respected for this element, + # +false+ otherwise. + # + # See {Element Context}[../doc/rexml/context_rdoc.html]. + # + # The evaluation is tested against the element's +expanded_name+, + # and so is namespace-sensitive. + def whitespace + @whitespace = nil + if @context + if @context[:respect_whitespace] + @whitespace = (@context[:respect_whitespace] == :all or + @context[:respect_whitespace].include? expanded_name) + end + @whitespace = false if (@context[:compress_whitespace] and + (@context[:compress_whitespace] == :all or + @context[:compress_whitespace].include? expanded_name) + ) + end + @whitespace = true unless @whitespace == false + @whitespace + end + + # :call-seq: + # ignore_whitespace_nodes + # + # Returns +true+ if whitespace nodes are ignored for the element. + # + # See {Element Context}[../doc/rexml/context_rdoc.html]. + # + def ignore_whitespace_nodes + @ignore_whitespace_nodes = false + if @context + if @context[:ignore_whitespace_nodes] + @ignore_whitespace_nodes = + (@context[:ignore_whitespace_nodes] == :all or + @context[:ignore_whitespace_nodes].include? expanded_name) + end + end + end + + # :call-seq: + # raw + # + # Returns +true+ if raw mode is set for the element. + # + # See {Element Context}[../doc/rexml/context_rdoc.html]. + # + # The evaluation is tested against +expanded_name+, and so is namespace + # sensitive. + def raw + @raw = (@context and @context[:raw] and + (@context[:raw] == :all or + @context[:raw].include? expanded_name)) + @raw + end + + #once :whitespace, :raw, :ignore_whitespace_nodes + + ################################################# + # Namespaces # + ################################################# + + # :call-seq: + # prefixes -> array_of_namespace_prefixes + # + # Returns an array of the string prefixes (names) of all defined namespaces + # in the element and its ancestors: + # + # xml_string = <<-EOT + # <root> + # <a xmlns:x='1' xmlns:y='2'> + # <b/> + # <c xmlns:z='3'/> + # </a> + # </root> + # EOT + # d = REXML::Document.new(xml_string, {compress_whitespace: :all}) + # d.elements['//a'].prefixes # => ["x", "y"] + # d.elements['//b'].prefixes # => ["x", "y"] + # d.elements['//c'].prefixes # => ["x", "y", "z"] + # + def prefixes + prefixes = [] + prefixes = parent.prefixes if parent + prefixes |= attributes.prefixes + return prefixes + end + + # :call-seq: + # namespaces -> array_of_namespace_names + # + # Returns a hash of all defined namespaces + # in the element and its ancestors: + # + # xml_string = <<-EOT + # <root> + # <a xmlns:x='1' xmlns:y='2'> + # <b/> + # <c xmlns:z='3'/> + # </a> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # d.elements['//a'].namespaces # => {"x"=>"1", "y"=>"2"} + # d.elements['//b'].namespaces # => {"x"=>"1", "y"=>"2"} + # d.elements['//c'].namespaces # => {"x"=>"1", "y"=>"2", "z"=>"3"} + # + def namespaces + namespaces = {} + namespaces = parent.namespaces if parent + namespaces = namespaces.merge( attributes.namespaces ) + return namespaces + end + + # :call-seq: + # namespace(prefix = nil) -> string_uri or nil + # + # Returns the string namespace URI for the element, + # possibly deriving from one of its ancestors. + # + # xml_string = <<-EOT + # <root> + # <a xmlns='1' xmlns:y='2'> + # <b/> + # <c xmlns:z='3'/> + # </a> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # b = d.elements['//b'] + # b.namespace # => "1" + # b.namespace('y') # => "2" + # b.namespace('nosuch') # => nil + # + def namespace(prefix=nil) + if prefix.nil? + prefix = prefix() + end + if prefix == '' + prefix = "xmlns" + else + prefix = "xmlns:#{prefix}" unless prefix[0,5] == 'xmlns' + end + ns = attributes[ prefix ] + ns = parent.namespace(prefix) if ns.nil? and parent + ns = '' if ns.nil? and prefix == 'xmlns' + return ns + end + + # :call-seq: + # add_namespace(prefix, uri = nil) -> self + # + # Adds a namespace to the element; returns +self+. + # + # With the single argument +prefix+, + # adds a namespace using the given +prefix+ and the namespace URI: + # + # e = REXML::Element.new('foo') + # e.add_namespace('bar') + # e.namespaces # => {"xmlns"=>"bar"} + # + # With both arguments +prefix+ and +uri+ given, + # adds a namespace using both arguments: + # + # e.add_namespace('baz', 'bat') + # e.namespaces # => {"xmlns"=>"bar", "baz"=>"bat"} + # + def add_namespace( prefix, uri=nil ) + unless uri + @attributes["xmlns"] = prefix + else + prefix = "xmlns:#{prefix}" unless prefix =~ /^xmlns:/ + @attributes[ prefix ] = uri + end + self + end + + # :call-seq: + # delete_namespace(namespace = 'xmlns') -> self + # + # Removes a namespace from the element. + # + # With no argument, removes the default namespace: + # + # d = REXML::Document.new "<a xmlns:foo='bar' xmlns='twiddle'/>" + # d.to_s # => "<a xmlns:foo='bar' xmlns='twiddle'/>" + # d.root.delete_namespace # => <a xmlns:foo='bar'/> + # d.to_s # => "<a xmlns:foo='bar'/>" + # + # With argument +namespace+, removes the specified namespace: + # + # d.root.delete_namespace('foo') + # d.to_s # => "<a/>" + # + # Does nothing if no such namespace is found: + # + # d.root.delete_namespace('nosuch') + # d.to_s # => "<a/>" + # + def delete_namespace namespace="xmlns" + namespace = "xmlns:#{namespace}" unless namespace == 'xmlns' + attribute = attributes.get_attribute(namespace) + attribute.remove unless attribute.nil? + self + end + + ################################################# + # Elements # + ################################################# + + # :call-seq: + # add_element(name, attributes = nil) -> new_element + # add_element(element, attributes = nil) -> element + # + # Adds a child element, optionally setting attributes + # on the added element; returns the added element. + # + # With string argument +name+, creates a new element with that name + # and adds the new element as a child: + # + # e0 = REXML::Element.new('foo') + # e0.add_element('bar') + # e0[0] # => <bar/> + # + # + # With argument +name+ and hash argument +attributes+, + # sets attributes on the new element: + # + # e0.add_element('baz', {'bat' => '0', 'bam' => '1'}) + # e0[1] # => <baz bat='0' bam='1'/> + # + # With element argument +element+, adds that element as a child: + # + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new('bar') + # e0.add_element(e1) + # e0[0] # => <bar/> + # + # With argument +element+ and hash argument +attributes+, + # sets attributes on the added element: + # + # e0.add_element(e1, {'bat' => '0', 'bam' => '1'}) + # e0[1] # => <bar bat='0' bam='1'/> + # + def add_element element, attrs=nil + raise "First argument must be either an element name, or an Element object" if element.nil? + el = @elements.add(element) + attrs.each do |key, value| + el.attributes[key]=value + end if attrs.kind_of? Hash + el + end + + # :call-seq: + # delete_element(index) -> removed_element or nil + # delete_element(element) -> removed_element or nil + # delete_element(xpath) -> removed_element or nil + # + # Deletes a child element. + # + # When 1-based integer argument +index+ is given, + # removes and returns the child element at that offset if it exists; + # indexing does not include text nodes; + # returns +nil+ if the element does not exist: + # + # d = REXML::Document.new '<a><b/>text<c/></a>' + # a = d.root # => <a> ... </> + # a.delete_element(1) # => <b/> + # a.delete_element(1) # => <c/> + # a.delete_element(1) # => nil + # + # When element argument +element+ is given, + # removes and returns that child element if it exists, + # otherwise returns +nil+: + # + # d = REXML::Document.new '<a><b/>text<c/></a>' + # a = d.root # => <a> ... </> + # c = a[2] # => <c/> + # a.delete_element(c) # => <c/> + # a.delete_element(c) # => nil + # + # When xpath argument +xpath+ is given, + # removes and returns the element at xpath if it exists, + # otherwise returns +nil+: + # + # d = REXML::Document.new '<a><b/>text<c/></a>' + # a = d.root # => <a> ... </> + # a.delete_element('//c') # => <c/> + # a.delete_element('//c') # => nil + # + def delete_element element + @elements.delete element + end + + # :call-seq: + # has_elements? + # + # Returns +true+ if the element has one or more element children, + # +false+ otherwise: + # + # d = REXML::Document.new '<a><b/>text<c/></a>' + # a = d.root # => <a> ... </> + # a.has_elements? # => true + # b = a[0] # => <b/> + # b.has_elements? # => false + # + def has_elements? + !@elements.empty? + end + + # :call-seq: + # each_element_with_attribute(attr_name, value = nil, max = 0, xpath = nil) {|e| ... } + # + # Calls the given block with each child element that meets given criteria. + # + # When only string argument +attr_name+ is given, + # calls the block with each child element that has that attribute: + # + # d = REXML::Document.new '<a><b id="1"/><c id="2"/><d id="1"/><e/></a>' + # a = d.root + # a.each_element_with_attribute('id') {|e| p e } + # + # Output: + # + # <b id='1'/> + # <c id='2'/> + # <d id='1'/> + # + # With argument +attr_name+ and string argument +value+ given, + # calls the block with each child element that has that attribute + # with that value: + # + # a.each_element_with_attribute('id', '1') {|e| p e } + # + # Output: + # + # <b id='1'/> + # <d id='1'/> + # + # With arguments +attr_name+, +value+, and integer argument +max+ given, + # calls the block with at most +max+ child elements: + # + # a.each_element_with_attribute('id', '1', 1) {|e| p e } + # + # Output: + # + # <b id='1'/> + # + # With all arguments given, including +xpath+, + # calls the block with only those child elements + # that meet the first three criteria, + # and also match the given +xpath+: + # + # a.each_element_with_attribute('id', '1', 2, '//d') {|e| p e } + # + # Output: + # + # <d id='1'/> + # + def each_element_with_attribute( key, value=nil, max=0, name=nil, &block ) # :yields: Element + each_with_something( proc {|child| + if value.nil? + child.attributes[key] != nil + else + child.attributes[key]==value + end + }, max, name, &block ) + end + + # :call-seq: + # each_element_with_text(text = nil, max = 0, xpath = nil) {|e| ... } + # + # Calls the given block with each child element that meets given criteria. + # + # With no arguments, calls the block with each child element that has text: + # + # d = REXML::Document.new '<a><b>b</b><c>b</c><d>d</d><e/></a>' + # a = d.root + # a.each_element_with_text {|e| p e } + # + # Output: + # + # <b> ... </> + # <c> ... </> + # <d> ... </> + # + # With the single string argument +text+, + # calls the block with each element that has exactly that text: + # + # a.each_element_with_text('b') {|e| p e } + # + # Output: + # + # <b> ... </> + # <c> ... </> + # + # With argument +text+ and integer argument +max+, + # calls the block with at most +max+ elements: + # + # a.each_element_with_text('b', 1) {|e| p e } + # + # Output: + # + # <b> ... </> + # + # With all arguments given, including +xpath+, + # calls the block with only those child elements + # that meet the first two criteria, + # and also match the given +xpath+: + # + # a.each_element_with_text('b', 2, '//c') {|e| p e } + # + # Output: + # + # <c> ... </> + # + def each_element_with_text( text=nil, max=0, name=nil, &block ) # :yields: Element + each_with_something( proc {|child| + if text.nil? + child.has_text? + else + child.text == text + end + }, max, name, &block ) + end + + # :call-seq: + # each_element {|e| ... } + # + # Calls the given block with each child element: + # + # d = REXML::Document.new '<a><b>b</b><c>b</c><d>d</d><e/></a>' + # a = d.root + # a.each_element {|e| p e } + # + # Output: + # + # <b> ... </> + # <c> ... </> + # <d> ... </> + # <e/> + # + def each_element( xpath=nil, &block ) # :yields: Element + @elements.each( xpath, &block ) + end + + # :call-seq: + # get_elements(xpath) + # + # Returns an array of the elements that match the given +xpath+: + # + # xml_string = <<-EOT + # <root> + # <a level='1'> + # <a level='2'/> + # </a> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # d.root.get_elements('//a') # => [<a level='1'> ... </>, <a level='2'/>] + # + def get_elements( xpath ) + @elements.to_a( xpath ) + end + + # :call-seq: + # next_element + # + # Returns the next sibling that is an element if it exists, + # +niL+ otherwise: + # + # d = REXML::Document.new '<a><b/>text<c/></a>' + # d.root.elements['b'].next_element #-> <c/> + # d.root.elements['c'].next_element #-> nil + # + def next_element + element = next_sibling + element = element.next_sibling until element.nil? or element.kind_of? Element + return element + end + + # :call-seq: + # previous_element + # + # Returns the previous sibling that is an element if it exists, + # +niL+ otherwise: + # + # d = REXML::Document.new '<a><b/>text<c/></a>' + # d.root.elements['c'].previous_element #-> <b/> + # d.root.elements['b'].previous_element #-> nil + # + def previous_element + element = previous_sibling + element = element.previous_sibling until element.nil? or element.kind_of? Element + return element + end + + + ################################################# + # Text # + ################################################# + + # :call-seq: + # has_text? -> true or false + # + # Returns +true if the element has one or more text noded, + # +false+ otherwise: + # + # d = REXML::Document.new '<a><b/>text<c/></a>' + # a = d.root + # a.has_text? # => true + # b = a[0] + # b.has_text? # => false + # + def has_text? + not text().nil? + end + + # :call-seq: + # text(xpath = nil) -> text_string or nil + # + # Returns the text string from the first text node child + # in a specified element, if it exists, # +nil+ otherwise. + # + # With no argument, returns the text from the first text node in +self+: + # + # d = REXML::Document.new "<p>some text <b>this is bold!</b> more text</p>" + # d.root.text.class # => String + # d.root.text # => "some text " + # + # With argument +xpath+, returns text from the the first text node + # in the element that matches +xpath+: + # + # d.root.text(1) # => "this is bold!" + # + # Note that an element may have multiple text nodes, + # possibly separated by other non-text children, as above. + # Even so, the returned value is the string text from the first such node. + # + # Note also that the text note is retrieved by method get_text, + # and so is always normalized text. + # + def text( path = nil ) + rv = get_text(path) + return rv.value unless rv.nil? + nil + end + + # :call-seq: + # get_text(xpath = nil) -> text_node or nil + # + # Returns the first text node child in a specified element, if it exists, + # +nil+ otherwise. + # + # With no argument, returns the first text node from +self+: + # + # d = REXML::Document.new "<p>some text <b>this is bold!</b> more text</p>" + # d.root.get_text.class # => REXML::Text + # d.root.get_text # => "some text " + # + # With argument +xpath+, returns the first text node from the element + # that matches +xpath+: + # + # d.root.get_text(1) # => "this is bold!" + # + def get_text path = nil + rv = nil + if path + element = @elements[ path ] + rv = element.get_text unless element.nil? + else + rv = @children.find { |node| node.kind_of? Text } + end + return rv + end + + # :call-seq: + # text = string -> string + # text = nil -> nil + # + # Adds, replaces, or removes the first text node child in the element. + # + # With string argument +string+, + # creates a new \REXML::Text node containing that string, + # honoring the current settings for whitespace and row, + # then places the node as the first text child in the element; + # returns +string+. + # + # If the element has no text child, the text node is added: + # + # d = REXML::Document.new '<a><b/></a>' + # d.root.text = 'foo' #-> '<a><b/>foo</a>' + # + # If the element has a text child, it is replaced: + # + # d.root.text = 'bar' #-> '<a><b/>bar</a>' + # + # With argument +nil+, removes the first text child: + # + # d.root.text = nil #-> '<a><b/><c/></a>' + # + def text=( text ) + if text.kind_of? String + text = Text.new( text, whitespace(), nil, raw() ) + elsif !text.nil? and !text.kind_of? Text + text = Text.new( text.to_s, whitespace(), nil, raw() ) + end + old_text = get_text + if text.nil? + old_text.remove unless old_text.nil? + else + if old_text.nil? + self << text + else + old_text.replace_with( text ) + end + end + return self + end + + # :call-seq: + # add_text(string) -> nil + # add_text(text_node) -> self + # + # Adds text to the element. + # + # When string argument +string+ is given, returns +nil+. + # + # If the element has no child text node, + # creates a \REXML::Text object using the string, + # honoring the current settings for whitespace and raw, + # then adds that node to the element: + # + # d = REXML::Document.new('<a><b/></a>') + # a = d.root + # a.add_text('foo') + # a.to_a # => [<b/>, "foo"] + # + # If the element has child text nodes, + # appends the string to the _last_ text node: + # + # d = REXML::Document.new('<a>foo<b/>bar</a>') + # a = d.root + # a.add_text('baz') + # a.to_a # => ["foo", <b/>, "barbaz"] + # a.add_text('baz') + # a.to_a # => ["foo", <b/>, "barbazbaz"] + # + # When text node argument +text_node+ is given, + # appends the node as the last text node in the element; + # returns +self+: + # + # d = REXML::Document.new('<a>foo<b/>bar</a>') + # a = d.root + # a.add_text(REXML::Text.new('baz')) + # a.to_a # => ["foo", <b/>, "bar", "baz"] + # a.add_text(REXML::Text.new('baz')) + # a.to_a # => ["foo", <b/>, "bar", "baz", "baz"] + # + def add_text( text ) + if text.kind_of? String + if @children[-1].kind_of? Text + @children[-1] << text + return + end + text = Text.new( text, whitespace(), nil, raw() ) + end + self << text unless text.nil? + return self + end + + # :call-seq: + # node_type -> :element + # + # Returns symbol <tt>:element</tt>: + # + # d = REXML::Document.new('<a/>') + # a = d.root # => <a/> + # a.node_type # => :element + # + def node_type + :element + end + + # :call-seq: + # xpath -> string_xpath + # + # Returns the string xpath to the element + # relative to the most distant parent: + # + # d = REXML::Document.new('<a><b><c/></b></a>') + # a = d.root # => <a> ... </> + # b = a[0] # => <b> ... </> + # c = b[0] # => <c/> + # d.xpath # => "" + # a.xpath # => "/a" + # b.xpath # => "/a/b" + # c.xpath # => "/a/b/c" + # + # If there is no parent, returns the expanded name of the element: + # + # e = REXML::Element.new('foo') + # e.xpath # => "foo" + # + def xpath + path_elements = [] + cur = self + path_elements << __to_xpath_helper( self ) + while cur.parent + cur = cur.parent + path_elements << __to_xpath_helper( cur ) + end + return path_elements.reverse.join( "/" ) + end + + ################################################# + # Attributes # + ################################################# + + # :call-seq: + # [index] -> object + # [attr_name] -> attr_value + # [attr_sym] -> attr_value + # + # With integer argument +index+ given, + # returns the child at offset +index+, or +nil+ if none: + # + # d = REXML::Document.new '><root><a/>text<b/>more<c/></root>' + # root = d.root + # (0..root.size).each do |index| + # node = root[index] + # p "#{index}: #{node} (#{node.class})" + # end + # + # Output: + # + # "0: <a/> (REXML::Element)" + # "1: text (REXML::Text)" + # "2: <b/> (REXML::Element)" + # "3: more (REXML::Text)" + # "4: <c/> (REXML::Element)" + # "5: (NilClass)" + # + # With string argument +attr_name+ given, + # returns the string value for the given attribute name if it exists, + # otherwise +nil+: + # + # d = REXML::Document.new('<root attr="value"></root>') + # root = d.root + # root['attr'] # => "value" + # root['nosuch'] # => nil + # + # With symbol argument +attr_sym+ given, + # returns <tt>[attr_sym.to_s]</tt>: + # + # root[:attr] # => "value" + # root[:nosuch] # => nil + # + def [](name_or_index) + case name_or_index + when String + attributes[name_or_index] + when Symbol + attributes[name_or_index.to_s] + else + super + end + end + + + # :call-seq: + # attribute(name, namespace = nil) + # + # Returns the string value for the given attribute name. + # + # With only argument +name+ given, + # returns the value of the named attribute if it exists, otherwise +nil+: + # + # xml_string = <<-EOT + # <root xmlns="ns0"> + # <a xmlns="ns1" attr="value"></a> + # <b xmlns="ns2" attr="value"></b> + # <c attr="value"/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # root = d.root + # a = root[1] # => <a xmlns='ns1' attr='value'/> + # a.attribute('attr') # => attr='value' + # a.attribute('nope') # => nil + # + # With arguments +name+ and +namespace+ given, + # returns the value of the named attribute if it exists, otherwise +nil+: + # + # xml_string = "<root xmlns:a='a' a:x='a:x' x='x'/>" + # document = REXML::Document.new(xml_string) + # document.root.attribute("x") # => x='x' + # document.root.attribute("x", "a") # => a:x='a:x' + # + def attribute( name, namespace=nil ) + prefix = nil + if namespaces.respond_to? :key + prefix = namespaces.key(namespace) if namespace + else + prefix = namespaces.index(namespace) if namespace + end + prefix = nil if prefix == 'xmlns' + + ret_val = + attributes.get_attribute( "#{prefix ? prefix + ':' : ''}#{name}" ) + + return ret_val unless ret_val.nil? + return nil if prefix.nil? + + # now check that prefix'es namespace is not the same as the + # default namespace + return nil unless ( namespaces[ prefix ] == namespaces[ 'xmlns' ] ) + + attributes.get_attribute( name ) + + end + + # :call-seq: + # has_attributes? -> true or false + # + # Returns +true+ if the element has attributes, +false+ otherwise: + # + # d = REXML::Document.new('<root><a attr="val"/><b/></root>') + # a, b = *d.root + # a.has_attributes? # => true + # b.has_attributes? # => false + # + def has_attributes? + return !@attributes.empty? + end + + # :call-seq: + # add_attribute(name, value) -> value + # add_attribute(attribute) -> attribute + # + # Adds an attribute to this element, overwriting any existing attribute + # by the same name. + # + # With string argument +name+ and object +value+ are given, + # adds the attribute created with that name and value: + # + # e = REXML::Element.new + # e.add_attribute('attr', 'value') # => "value" + # e['attr'] # => "value" + # e.add_attribute('attr', 'VALUE') # => "VALUE" + # e['attr'] # => "VALUE" + # + # With only attribute object +attribute+ given, + # adds the given attribute: + # + # a = REXML::Attribute.new('attr', 'value') + # e.add_attribute(a) # => attr='value' + # e['attr'] # => "value" + # a = REXML::Attribute.new('attr', 'VALUE') + # e.add_attribute(a) # => attr='VALUE' + # e['attr'] # => "VALUE" + # + def add_attribute( key, value=nil ) + if key.kind_of? Attribute + @attributes << key + else + @attributes[key] = value + end + end + + # :call-seq: + # add_attributes(hash) -> hash + # add_attributes(array) + # + # Adds zero or more attributes to the element; + # returns the argument. + # + # If hash argument +hash+ is given, + # each key must be a string; + # adds each attribute created with the key/value pair: + # + # e = REXML::Element.new + # h = {'foo' => 'bar', 'baz' => 'bat'} + # e.add_attributes(h) + # + # If argument +array+ is given, + # each array member must be a 2-element array <tt>[name, value]; + # each name must be a string: + # + # e = REXML::Element.new + # a = [['foo' => 'bar'], ['baz' => 'bat']] + # e.add_attributes(a) + # + def add_attributes hash + if hash.kind_of? Hash + hash.each_pair {|key, value| @attributes[key] = value } + elsif hash.kind_of? Array + hash.each { |value| @attributes[ value[0] ] = value[1] } + end + end + + # :call-seq: + # delete_attribute(name) -> removed_attribute or nil + # + # Removes a named attribute if it exists; + # returns the removed attribute if found, otherwise +nil+: + # + # e = REXML::Element.new('foo') + # e.add_attribute('bar', 'baz') + # e.delete_attribute('bar') # => <bar/> + # e.delete_attribute('bar') # => nil + # + def delete_attribute(key) + attr = @attributes.get_attribute(key) + attr.remove unless attr.nil? + end + + ################################################# + # Other Utilities # + ################################################# + + # :call-seq: + # cdatas -> array_of_cdata_children + # + # Returns a frozen array of the REXML::CData children of the element: + # + # xml_string = <<-EOT + # <root> + # <![CDATA[foo]]> + # <![CDATA[bar]]> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # cds = d.root.cdatas # => ["foo", "bar"] + # cds.frozen? # => true + # cds.map {|cd| cd.class } # => [REXML::CData, REXML::CData] + # + def cdatas + find_all { |child| child.kind_of? CData }.freeze + end + + # :call-seq: + # comments -> array_of_comment_children + # + # Returns a frozen array of the REXML::Comment children of the element: + # + # xml_string = <<-EOT + # <root> + # <!--foo--> + # <!--bar--> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # cs = d.root.comments + # cs.frozen? # => true + # cs.map {|c| c.class } # => [REXML::Comment, REXML::Comment] + # cs.map {|c| c.to_s } # => ["foo", "bar"] + # + def comments + find_all { |child| child.kind_of? Comment }.freeze + end + + # :call-seq: + # instructions -> array_of_instruction_children + # + # Returns a frozen array of the REXML::Instruction children of the element: + # + # xml_string = <<-EOT + # <root> + # <?target0 foo?> + # <?target1 bar?> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # is = d.root.instructions + # is.frozen? # => true + # is.map {|i| i.class } # => [REXML::Instruction, REXML::Instruction] + # is.map {|i| i.to_s } # => ["<?target0 foo?>", "<?target1 bar?>"] + # + def instructions + find_all { |child| child.kind_of? Instruction }.freeze + end + + # :call-seq: + # texts -> array_of_text_children + # + # Returns a frozen array of the REXML::Text children of the element: + # + # xml_string = '<root><a/>text<b/>more<c/></root>' + # d = REXML::Document.new(xml_string) + # ts = d.root.texts + # ts.frozen? # => true + # ts.map {|t| t.class } # => [REXML::Text, REXML::Text] + # ts.map {|t| t.to_s } # => ["text", "more"] + # + def texts + find_all { |child| child.kind_of? Text }.freeze + end + + # == DEPRECATED + # See REXML::Formatters + # + # Writes out this element, and recursively, all children. + # output:: + # output an object which supports '<< string'; this is where the + # document will be written. + # indent:: + # An integer. If -1, no indenting will be used; otherwise, the + # indentation will be this number of spaces, and children will be + # indented an additional amount. Defaults to -1 + # transitive:: + # If transitive is true and indent is >= 0, then the output will be + # pretty-printed in such a way that the added whitespace does not affect + # the parse tree of the document + # ie_hack:: + # This hack inserts a space before the /> on empty tags to address + # a limitation of Internet Explorer. Defaults to false + # + # out = '' + # doc.write( out ) #-> doc is written to the string 'out' + # doc.write( $stdout ) #-> doc written to the console + def write(output=$stdout, indent=-1, transitive=false, ie_hack=false) + Kernel.warn("#{self.class.name}.write is deprecated. See REXML::Formatters", uplevel: 1) + formatter = if indent > -1 + if transitive + require_relative "formatters/transitive" + REXML::Formatters::Transitive.new( indent, ie_hack ) + else + REXML::Formatters::Pretty.new( indent, ie_hack ) + end + else + REXML::Formatters::Default.new( ie_hack ) + end + formatter.write( self, output ) + end + + + private + def __to_xpath_helper node + rv = node.expanded_name.clone + if node.parent + results = node.parent.find_all {|n| + n.kind_of?(REXML::Element) and n.expanded_name == node.expanded_name + } + if results.length > 1 + idx = results.index( node ) + rv << "[#{idx+1}]" + end + end + rv + end + + # A private helper method + def each_with_something( test, max=0, name=nil ) + num = 0 + @elements.each( name ){ |child| + yield child if test.call(child) and num += 1 + return if max>0 and num == max + } + end + end + + ######################################################################## + # ELEMENTS # + ######################################################################## + + # A class which provides filtering of children for Elements, and + # XPath search support. You are expected to only encounter this class as + # the <tt>element.elements</tt> object. Therefore, you are + # _not_ expected to instantiate this yourself. + # + # xml_string = <<-EOT + # <?xml version="1.0" encoding="UTF-8"?> + # <bookstore> + # <book category="cooking"> + # <title lang="en">Everyday Italian</title> + # <author>Giada De Laurentiis</author> + # <year>2005</year> + # <price>30.00</price> + # </book> + # <book category="children"> + # <title lang="en">Harry Potter</title> + # <author>J K. Rowling</author> + # <year>2005</year> + # <price>29.99</price> + # </book> + # <book category="web"> + # <title lang="en">XQuery Kick Start</title> + # <author>James McGovern</author> + # <author>Per Bothner</author> + # <author>Kurt Cagle</author> + # <author>James Linn</author> + # <author>Vaidyanathan Nagarajan</author> + # <year>2003</year> + # <price>49.99</price> + # </book> + # <book category="web" cover="paperback"> + # <title lang="en">Learning XML</title> + # <author>Erik T. Ray</author> + # <year>2003</year> + # <price>39.95</price> + # </book> + # </bookstore> + # EOT + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements # => #<REXML::Elements @element=<bookstore> ... </>> + # + class Elements + include Enumerable + # :call-seq: + # new(parent) -> new_elements_object + # + # Returns a new \Elements object with the given +parent+. + # Does _not_ assign <tt>parent.elements = self</tt>: + # + # d = REXML::Document.new(xml_string) + # eles = REXML::Elements.new(d.root) + # eles # => #<REXML::Elements @element=<bookstore> ... </>> + # eles == d.root.elements # => false + # + def initialize parent + @element = parent + end + + # :call-seq: + # parent + # + # Returns the parent element cited in creating the \Elements object. + # This element is also the default starting point for searching + # in the \Elements object. + # + # d = REXML::Document.new(xml_string) + # elements = REXML::Elements.new(d.root) + # elements.parent == d.root # => true + # + def parent + @element + end + + # :call-seq: + # elements[index] -> element or nil + # elements[xpath] -> element or nil + # elements[n, name] -> element or nil + # + # Returns the first \Element object selected by the arguments, + # if any found, or +nil+ if none found. + # + # Notes: + # - The +index+ is 1-based, not 0-based, so that: + # - The first element has index <tt>1</tt> + # - The _nth_ element has index +n+. + # - The selection ignores non-\Element nodes. + # + # When the single argument +index+ is given, + # returns the element given by the index, if any; otherwise, +nil+: + # + # d = REXML::Document.new(xml_string) + # eles = d.root.elements + # eles # => #<REXML::Elements @element=<bookstore> ... </>> + # eles[1] # => <book category='cooking'> ... </> + # eles.size # => 4 + # eles[4] # => <book category='web' cover='paperback'> ... </> + # eles[5] # => nil + # + # The node at this index is not an \Element, and so is not returned: + # + # eles = d.root.first.first # => <title lang='en'> ... </> + # eles.to_a # => ["Everyday Italian"] + # eles[1] # => nil + # + # When the single argument +xpath+ is given, + # returns the first element found via that +xpath+, if any; otherwise, +nil+: + # + # eles = d.root.elements # => #<REXML::Elements @element=<bookstore> ... </>> + # eles['/bookstore'] # => <bookstore> ... </> + # eles['//book'] # => <book category='cooking'> ... </> + # eles['//book [@category="children"]'] # => <book category='children'> ... </> + # eles['/nosuch'] # => nil + # eles['//nosuch'] # => nil + # eles['//book [@category="nosuch"]'] # => nil + # eles['.'] # => <bookstore> ... </> + # eles['..'].class # => REXML::Document + # + # With arguments +n+ and +name+ given, + # returns the _nth_ found element that has the given +name+, + # or +nil+ if there is no such _nth_ element: + # + # eles = d.root.elements # => #<REXML::Elements @element=<bookstore> ... </>> + # eles[1, 'book'] # => <book category='cooking'> ... </> + # eles[4, 'book'] # => <book category='web' cover='paperback'> ... </> + # eles[5, 'book'] # => nil + # + def []( index, name=nil) + if index.kind_of? Integer + raise "index (#{index}) must be >= 1" if index < 1 + name = literalize(name) if name + num = 0 + @element.find { |child| + child.kind_of? Element and + (name.nil? ? true : child.has_name?( name )) and + (num += 1) == index + } + else + return XPath::first( @element, index ) + #{ |element| + # return element if element.kind_of? Element + #} + #return nil + end + end + + # :call-seq: + # elements[] = index, replacement_element -> replacement_element or nil + # + # Replaces or adds an element. + # + # When <tt>eles[index]</tt> exists, replaces it with +replacement_element+ + # and returns +replacement_element+: + # + # d = REXML::Document.new(xml_string) + # eles = d.root.elements # => #<REXML::Elements @element=<bookstore> ... </>> + # eles[1] # => <book category='cooking'> ... </> + # eles[1] = REXML::Element.new('foo') + # eles[1] # => <foo/> + # + # Does nothing (or raises an exception) + # if +replacement_element+ is not an \Element: + # eles[2] # => <book category='web' cover='paperback'> ... </> + # eles[2] = REXML::Text.new('bar') + # eles[2] # => <book category='web' cover='paperback'> ... </> + # + # When <tt>eles[index]</tt> does not exist, + # adds +replacement_element+ to the element and returns + # + # d = REXML::Document.new(xml_string) + # eles = d.root.elements # => #<REXML::Elements @element=<bookstore> ... </>> + # eles.size # => 4 + # eles[50] = REXML::Element.new('foo') # => <foo/> + # eles.size # => 5 + # eles[5] # => <foo/> + # + # Does nothing (or raises an exception) + # if +replacement_element+ is not an \Element: + # + # eles[50] = REXML::Text.new('bar') # => "bar" + # eles.size # => 5 + # + def []=( index, element ) + previous = self[index] + if previous.nil? + @element.add element + else + previous.replace_with element + end + return previous + end + + # :call-seq: + # empty? -> true or false + # + # Returns +true+ if there are no children, +false+ otherwise. + # + # d = REXML::Document.new('') + # d.elements.empty? # => true + # d = REXML::Document.new(xml_string) + # d.elements.empty? # => false + # + def empty? + @element.find{ |child| child.kind_of? Element}.nil? + end + + # :call-seq: + # index(element) + # + # Returns the 1-based index of the given +element+, if found; + # otherwise, returns -1: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # ele_1, ele_2, ele_3, ele_4 = *elements + # elements.index(ele_4) # => 4 + # elements.delete(ele_3) + # elements.index(ele_4) # => 3 + # elements.index(ele_3) # => -1 + # + def index element + rv = 0 + found = @element.find do |child| + child.kind_of? Element and + (rv += 1) and + child == element + end + return rv if found == element + return -1 + end + + # :call-seq: + # delete(index) -> removed_element or nil + # delete(element) -> removed_element or nil + # delete(xpath) -> removed_element or nil + # + # Removes an element; returns the removed element, or +nil+ if none removed. + # + # With integer argument +index+ given, + # removes the child element at that offset: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.size # => 4 + # elements[2] # => <book category='children'> ... </> + # elements.delete(2) # => <book category='children'> ... </> + # elements.size # => 3 + # elements[2] # => <book category='web'> ... </> + # elements.delete(50) # => nil + # + # With element argument +element+ given, + # removes that child element: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # ele_1, ele_2, ele_3, ele_4 = *elements + # elements.size # => 4 + # elements[2] # => <book category='children'> ... </> + # elements.delete(ele_2) # => <book category='children'> ... </> + # elements.size # => 3 + # elements[2] # => <book category='web'> ... </> + # elements.delete(ele_2) # => nil + # + # With string argument +xpath+ given, + # removes the first element found via that xpath: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.delete('//book') # => <book category='cooking'> ... </> + # elements.delete('//book [@category="children"]') # => <book category='children'> ... </> + # elements.delete('//nosuch') # => nil + # + def delete element + if element.kind_of? Element + @element.delete element + else + el = self[element] + el.remove if el + end + end + + # :call-seq: + # delete_all(xpath) + # + # Removes all elements found via the given +xpath+; + # returns the array of removed elements, if any, else +nil+. + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.size # => 4 + # deleted_elements = elements.delete_all('//book [@category="web"]') + # deleted_elements.size # => 2 + # elements.size # => 2 + # deleted_elements = elements.delete_all('//book') + # deleted_elements.size # => 2 + # elements.size # => 0 + # elements.delete_all('//book') # => [] + # + def delete_all( xpath ) + rv = [] + XPath::each( @element, xpath) {|element| + rv << element if element.kind_of? Element + } + rv.each do |element| + @element.delete element + element.remove + end + return rv + end + + # :call-seq: + # add -> new_element + # add(name) -> new_element + # add(element) -> element + # + # Adds an element; returns the element added. + # + # With no argument, creates and adds a new element. + # The new element has: + # + # - No name. + # - \Parent from the \Elements object. + # - Context from the that parent. + # + # Example: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # parent = elements.parent # => <bookstore> ... </> + # parent.context = {raw: :all} + # elements.size # => 4 + # new_element = elements.add # => </> + # elements.size # => 5 + # new_element.name # => nil + # new_element.parent # => <bookstore> ... </> + # new_element.context # => {:raw=>:all} + # + # With string argument +name+, creates and adds a new element. + # The new element has: + # + # - Name +name+. + # - \Parent from the \Elements object. + # - Context from the that parent. + # + # Example: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # parent = elements.parent # => <bookstore> ... </> + # parent.context = {raw: :all} + # elements.size # => 4 + # new_element = elements.add('foo') # => <foo/> + # elements.size # => 5 + # new_element.name # => "foo" + # new_element.parent # => <bookstore> ... </> + # new_element.context # => {:raw=>:all} + # + # With argument +element+, + # creates and adds a clone of the given +element+. + # The new element has name, parent, and context from the given +element+. + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.size # => 4 + # e0 = REXML::Element.new('foo') + # e1 = REXML::Element.new('bar', e0, {raw: :all}) + # element = elements.add(e1) # => <bar/> + # elements.size # => 5 + # element.name # => "bar" + # element.parent # => <bookstore> ... </> + # element.context # => {:raw=>:all} + # + def add element=nil + if element.nil? + Element.new("", self, @element.context) + elsif not element.kind_of?(Element) + Element.new(element, self, @element.context) + else + @element << element + element.context = @element.context + element + end + end + + alias :<< :add + + # :call-seq: + # each(xpath = nil) {|element| ... } -> self + # + # Iterates over the elements. + # + # With no argument, calls the block with each element: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.each {|element| p element } + # + # Output: + # + # <book category='cooking'> ... </> + # <book category='children'> ... </> + # <book category='web'> ... </> + # <book category='web' cover='paperback'> ... </> + # + # With argument +xpath+, calls the block with each element + # that matches the given +xpath+: + # + # elements.each('//book [@category="web"]') {|element| p element } + # + # Output: + # + # <book category='web'> ... </> + # <book category='web' cover='paperback'> ... </> + # + def each( xpath=nil ) + XPath::each( @element, xpath ) {|e| yield e if e.kind_of? Element } + end + + # :call-seq: + # collect(xpath = nil) {|element| ... } -> array + # + # Iterates over the elements; returns the array of block return values. + # + # With no argument, iterates over all elements: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.collect {|element| element.size } # => [9, 9, 17, 9] + # + # With argument +xpath+, iterates over elements that match + # the given +xpath+: + # + # xpath = '//book [@category="web"]' + # elements.collect(xpath) {|element| element.size } # => [17, 9] + # + def collect( xpath=nil ) + collection = [] + XPath::each( @element, xpath ) {|e| + collection << yield(e) if e.kind_of?(Element) + } + collection + end + + # :call-seq: + # inject(xpath = nil, initial = nil) -> object + # + # Calls the block with elements; returns the last block return value. + # + # With no argument, iterates over the elements, calling the block + # <tt>elements.size - 1</tt> times. + # + # - The first call passes the first and second elements. + # - The second call passes the first block return value and the third element. + # - The third call passes the second block return value and the fourth element. + # - And so on. + # + # In this example, the block returns the passed element, + # which is then the object argument to the next call: + # + # d = REXML::Document.new(xml_string) + # elements = d.root.elements + # elements.inject do |object, element| + # p [elements.index(object), elements.index(element)] + # element + # end + # + # Output: + # + # [1, 2] + # [2, 3] + # [3, 4] + # + # With the single argument +xpath+, calls the block only with + # elements matching that xpath: + # + # elements.inject('//book [@category="web"]') do |object, element| + # p [elements.index(object), elements.index(element)] + # element + # end + # + # Output: + # + # [3, 4] + # + # With argument +xpath+ given as +nil+ + # and argument +initial+ also given, + # calls the block once for each element. + # + # - The first call passes the +initial+ and the first element. + # - The second call passes the first block return value and the second element. + # - The third call passes the second block return value and the third element. + # - And so on. + # + # In this example, the first object index is <tt>-1</tt> + # + # elements.inject(nil, 'Initial') do |object, element| + # p [elements.index(object), elements.index(element)] + # element + # end + # + # Output: + # + # [-1, 1] + # [1, 2] + # [2, 3] + # [3, 4] + # + # In this form the passed object can be used as an accumulator: + # + # elements.inject(nil, 0) do |total, element| + # total += element.size + # end # => 44 + # + # With both arguments +xpath+ and +initial+ are given, + # calls the block only with elements matching that xpath: + # + # elements.inject('//book [@category="web"]', 0) do |total, element| + # total += element.size + # end # => 26 + # + def inject( xpath=nil, initial=nil ) + first = true + XPath::each( @element, xpath ) {|e| + if (e.kind_of? Element) + if (first and initial == nil) + initial = e + first = false + else + initial = yield( initial, e ) if e.kind_of? Element + end + end + } + initial + end + + # :call-seq: + # size -> integer + # + # Returns the count of \Element children: + # + # d = REXML::Document.new '<a>sean<b/>elliott<b/>russell<b/></a>' + # d.root.elements.size # => 3 # Three elements. + # d.root.size # => 6 # Three elements plus three text nodes.. + # + def size + count = 0 + @element.each {|child| count+=1 if child.kind_of? Element } + count + end + + # :call-seq: + # to_a(xpath = nil) -> array_of_elements + # + # Returns an array of element children (not including non-element children). + # + # With no argument, returns an array of all element children: + # + # d = REXML::Document.new '<a>sean<b/>elliott<c/></a>' + # elements = d.root.elements + # elements.to_a # => [<b/>, <c/>] # Omits non-element children. + # children = d.root.children + # children # => ["sean", <b/>, "elliott", <c/>] # Includes non-element children. + # + # With argument +xpath+, returns an array of element children + # that match the xpath: + # + # elements.to_a('//c') # => [<c/>] + # + def to_a( xpath=nil ) + rv = XPath.match( @element, xpath ) + return rv.find_all{|e| e.kind_of? Element} if xpath + rv + end + + private + # Private helper class. Removes quotes from quoted strings + def literalize name + name = name[1..-2] if name[0] == ?' or name[0] == ?" #' + name + end + end + + ######################################################################## + # ATTRIBUTES # + ######################################################################## + + # A class that defines the set of Attributes of an Element and provides + # operations for accessing elements in that set. + class Attributes < Hash + + # :call-seq: + # new(element) + # + # Creates and returns a new \REXML::Attributes object. + # The element given by argument +element+ is stored, + # but its own attributes are not modified: + # + # ele = REXML::Element.new('foo') + # attrs = REXML::Attributes.new(ele) + # attrs.object_id == ele.attributes.object_id # => false + # + # Other instance methods in class \REXML::Attributes may refer to: + # + # - +element.document+. + # - +element.prefix+. + # - +element.expanded_name+. + # + def initialize element + @element = element + end + + # :call-seq: + # [name] -> attribute_value or nil + # + # Returns the value for the attribute given by +name+, + # if it exists; otherwise +nil+. + # The value returned is the unnormalized attribute value, + # with entities expanded: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # ele.attributes['att'] # => "<" + # ele.attributes['bar:att'] # => "2" + # ele.attributes['nosuch'] # => nil + # + # Related: get_attribute (returns an \Attribute object). + # + def [](name) + attr = get_attribute(name) + return attr.value unless attr.nil? + return nil + end + + # :call-seq: + # to_a -> array_of_attribute_objects + # + # Returns an array of \REXML::Attribute objects representing + # the attributes: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # attrs = ele.attributes.to_a # => [foo:att='1', bar:att='2', att='&lt;'] + # attrs.first.class # => REXML::Attribute + # + def to_a + enum_for(:each_attribute).to_a + end + + # :call-seq: + # length + # + # Returns the count of attributes: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # ele.attributes.length # => 3 + # + def length + c = 0 + each_attribute { c+=1 } + c + end + alias :size :length + + # :call-seq: + # each_attribute {|attr| ... } + # + # Calls the given block with each \REXML::Attribute object: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # ele.attributes.each_attribute do |attr| + # p [attr.class, attr] + # end + # + # Output: + # + # [REXML::Attribute, foo:att='1'] + # [REXML::Attribute, bar:att='2'] + # [REXML::Attribute, att='&lt;'] + # + def each_attribute # :yields: attribute + return to_enum(__method__) unless block_given? + each_value do |val| + if val.kind_of? Attribute + yield val + else + val.each_value { |atr| yield atr } + end + end + end + + # :call-seq: + # each {|expanded_name, value| ... } + # + # Calls the given block with each expanded-name/value pair: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # ele.attributes.each do |expanded_name, value| + # p [expanded_name, value] + # end + # + # Output: + # + # ["foo:att", "1"] + # ["bar:att", "2"] + # ["att", "<"] + # + def each + return to_enum(__method__) unless block_given? + each_attribute do |attr| + yield [attr.expanded_name, attr.value] + end + end + + # :call-seq: + # get_attribute(name) -> attribute_object or nil + # + # Returns the \REXML::Attribute object for the given +name+: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # attrs = ele.attributes + # attrs.get_attribute('foo:att') # => foo:att='1' + # attrs.get_attribute('foo:att').class # => REXML::Attribute + # attrs.get_attribute('bar:att') # => bar:att='2' + # attrs.get_attribute('att') # => att='&lt;' + # attrs.get_attribute('nosuch') # => nil + # + def get_attribute( name ) + attr = fetch( name, nil ) + if attr.nil? + return nil if name.nil? + # Look for prefix + name =~ Namespace::NAMESPLIT + prefix, n = $1, $2 + if prefix + attr = fetch( n, nil ) + # check prefix + if attr == nil + elsif attr.kind_of? Attribute + return attr if prefix == attr.prefix + else + attr = attr[ prefix ] + return attr + end + end + element_document = @element.document + if element_document and element_document.doctype + expn = @element.expanded_name + expn = element_document.doctype.name if expn.size == 0 + attr_val = element_document.doctype.attribute_of(expn, name) + return Attribute.new( name, attr_val ) if attr_val + end + return nil + end + if attr.kind_of? Hash + attr = attr[ @element.prefix ] + end + return attr + end + + # :call-seq: + # [name] = value -> value + # + # When +value+ is non-+nil+, + # assigns that to the attribute for the given +name+, + # overwriting the previous value if it exists: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # attrs = ele.attributes + # attrs['foo:att'] = '2' # => "2" + # attrs['baz:att'] = '3' # => "3" + # + # When +value+ is +nil+, deletes the attribute if it exists: + # + # attrs['baz:att'] = nil + # attrs.include?('baz:att') # => false + # + def []=( name, value ) + if value.nil? # Delete the named attribute + attr = get_attribute(name) + delete attr + return + end + + unless value.kind_of? Attribute + if @element.document and @element.document.doctype + value = Text::normalize( value, @element.document.doctype ) + else + value = Text::normalize( value, nil ) + end + value = Attribute.new(name, value) + end + value.element = @element + old_attr = fetch(value.name, nil) + if old_attr.nil? + store(value.name, value) + elsif old_attr.kind_of? Hash + old_attr[value.prefix] = value + elsif old_attr.prefix != value.prefix + # Check for conflicting namespaces + if value.prefix != "xmlns" and old_attr.prefix != "xmlns" + old_namespace = old_attr.namespace + new_namespace = value.namespace + if old_namespace == new_namespace + raise ParseException.new( + "Namespace conflict in adding attribute \"#{value.name}\": "+ + "Prefix \"#{old_attr.prefix}\" = \"#{old_namespace}\" and "+ + "prefix \"#{value.prefix}\" = \"#{new_namespace}\"") + end + end + store value.name, {old_attr.prefix => old_attr, + value.prefix => value} + else + store value.name, value + end + return @element + end + + # :call-seq: + # prefixes -> array_of_prefix_strings + # + # Returns an array of prefix strings in the attributes. + # The array does not include the default + # namespace declaration, if one exists. + # + # xml_string = '<a xmlns="foo" xmlns:x="bar" xmlns:y="twee" z="glorp"/>' + # d = REXML::Document.new(xml_string) + # d.root.attributes.prefixes # => ["x", "y"] + # + def prefixes + ns = [] + each_attribute do |attribute| + ns << attribute.name if attribute.prefix == 'xmlns' + end + if @element.document and @element.document.doctype + expn = @element.expanded_name + expn = @element.document.doctype.name if expn.size == 0 + @element.document.doctype.attributes_of(expn).each { + |attribute| + ns << attribute.name if attribute.prefix == 'xmlns' + } + end + ns + end + + # :call-seq: + # namespaces + # + # Returns a hash of name/value pairs for the namespaces: + # + # xml_string = '<a xmlns="foo" xmlns:x="bar" xmlns:y="twee" z="glorp"/>' + # d = REXML::Document.new(xml_string) + # d.root.attributes.namespaces # => {"xmlns"=>"foo", "x"=>"bar", "y"=>"twee"} + # + def namespaces + namespaces = {} + each_attribute do |attribute| + namespaces[attribute.name] = attribute.value if attribute.prefix == 'xmlns' or attribute.name == 'xmlns' + end + if @element.document and @element.document.doctype + expn = @element.expanded_name + expn = @element.document.doctype.name if expn.size == 0 + @element.document.doctype.attributes_of(expn).each { + |attribute| + namespaces[attribute.name] = attribute.value if attribute.prefix == 'xmlns' or attribute.name == 'xmlns' + } + end + namespaces + end + + # :call-seq: + # delete(name) -> element + # delete(attribute) -> element + # + # Removes a specified attribute if it exists; + # returns the attributes' element. + # + # When string argument +name+ is given, + # removes the attribute of that name if it exists: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # attrs = ele.attributes + # attrs.delete('foo:att') # => <ele bar:att='2' att='&lt;'/> + # attrs.delete('foo:att') # => <ele bar:att='2' att='&lt;'/> + # + # When attribute argument +attribute+ is given, + # removes that attribute if it exists: + # + # attr = REXML::Attribute.new('bar:att', '2') + # attrs.delete(attr) # => <ele att='&lt;'/> # => <ele att='&lt;'/> + # attrs.delete(attr) # => <ele att='&lt;'/> # => <ele/> + # + def delete( attribute ) + name = nil + prefix = nil + if attribute.kind_of? Attribute + name = attribute.name + prefix = attribute.prefix + else + attribute =~ Namespace::NAMESPLIT + prefix, name = $1, $2 + prefix = '' unless prefix + end + old = fetch(name, nil) + if old.kind_of? Hash # the supplied attribute is one of many + old.delete(prefix) + if old.size == 1 + repl = nil + old.each_value{|v| repl = v} + store name, repl + end + elsif old.nil? + return @element + else # the supplied attribute is a top-level one + super(name) + end + @element + end + + # :call-seq: + # add(attribute) -> attribute + # + # Adds attribute +attribute+, replacing the previous + # attribute of the same name if it exists; + # returns +attribute+: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # attrs = ele.attributes + # attrs # => {"att"=>{"foo"=>foo:att='1', "bar"=>bar:att='2', ""=>att='&lt;'}} + # attrs.add(REXML::Attribute.new('foo:att', '2')) # => foo:att='2' + # attrs.add(REXML::Attribute.new('baz', '3')) # => baz='3' + # attrs.include?('baz') # => true + # + def add( attribute ) + self[attribute.name] = attribute + end + + alias :<< :add + + # :call-seq: + # delete_all(name) -> array_of_removed_attributes + # + # Removes all attributes matching the given +name+; + # returns an array of the removed attributes: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # attrs = ele.attributes + # attrs.delete_all('att') # => [att='&lt;'] + # + def delete_all( name ) + rv = [] + each_attribute { |attribute| + rv << attribute if attribute.expanded_name == name + } + rv.each{ |attr| attr.remove } + return rv + end + + # :call-seq: + # get_attribute_ns(namespace, name) + # + # Returns the \REXML::Attribute object among the attributes + # that matches the given +namespace+ and +name+: + # + # xml_string = <<-EOT + # <root xmlns:foo="http://foo" xmlns:bar="http://bar"> + # <ele foo:att='1' bar:att='2' att='&lt;'/> + # </root> + # EOT + # d = REXML::Document.new(xml_string) + # ele = d.root.elements['//ele'] # => <a foo:att='1' bar:att='2' att='&lt;'/> + # attrs = ele.attributes + # attrs.get_attribute_ns('http://foo', 'att') # => foo:att='1' + # attrs.get_attribute_ns('http://foo', 'nosuch') # => nil + # + def get_attribute_ns(namespace, name) + result = nil + each_attribute() { |attribute| + if name == attribute.name && + namespace == attribute.namespace() && + ( !namespace.empty? || !attribute.fully_expanded_name.index(':') ) + # foo will match xmlns:foo, but only if foo isn't also an attribute + result = attribute if !result or !namespace.empty? or + !attribute.fully_expanded_name.index(':') + end + } + result + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/encoding.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/encoding.rb new file mode 100644 index 000000000000..da2d70d6c9d7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/encoding.rb @@ -0,0 +1,51 @@ +# coding: US-ASCII +# frozen_string_literal: false +module REXML + module Encoding + # ID ---> Encoding name + attr_reader :encoding + def encoding=(encoding) + encoding = encoding.name if encoding.is_a?(Encoding) + if encoding.is_a?(String) + original_encoding = encoding + encoding = find_encoding(encoding) + unless encoding + raise ArgumentError, "Bad encoding name #{original_encoding}" + end + end + return false if defined?(@encoding) and encoding == @encoding + if encoding + @encoding = encoding.upcase + else + @encoding = 'UTF-8' + end + true + end + + def encode(string) + string.encode(@encoding) + end + + def decode(string) + string.encode(::Encoding::UTF_8, @encoding) + end + + private + def find_encoding(name) + case name + when /\Ashift-jis\z/i + return "SHIFT_JIS" + when /\ACP-(\d+)\z/ + name = "CP#{$1}" + when /\AUTF-8\z/i + return name + end + begin + ::Encoding::Converter.search_convpath(name, 'UTF-8') + rescue ::Encoding::ConverterNotFoundError + return nil + end + name + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/entity.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/entity.rb new file mode 100644 index 000000000000..89a9e84c5774 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/entity.rb @@ -0,0 +1,171 @@ +# frozen_string_literal: false +require_relative 'child' +require_relative 'source' +require_relative 'xmltokens' + +module REXML + class Entity < Child + include XMLTokens + PUBIDCHAR = "\x20\x0D\x0Aa-zA-Z0-9\\-()+,./:=?;!*@$_%#" + SYSTEMLITERAL = %Q{((?:"[^"]*")|(?:'[^']*'))} + PUBIDLITERAL = %Q{("[#{PUBIDCHAR}']*"|'[#{PUBIDCHAR}]*')} + EXTERNALID = "(?:(?:(SYSTEM)\\s+#{SYSTEMLITERAL})|(?:(PUBLIC)\\s+#{PUBIDLITERAL}\\s+#{SYSTEMLITERAL}))" + NDATADECL = "\\s+NDATA\\s+#{NAME}" + PEREFERENCE = "%#{NAME};" + ENTITYVALUE = %Q{((?:"(?:[^%&"]|#{PEREFERENCE}|#{REFERENCE})*")|(?:'([^%&']|#{PEREFERENCE}|#{REFERENCE})*'))} + PEDEF = "(?:#{ENTITYVALUE}|#{EXTERNALID})" + ENTITYDEF = "(?:#{ENTITYVALUE}|(?:#{EXTERNALID}(#{NDATADECL})?))" + PEDECL = "<!ENTITY\\s+(%)\\s+#{NAME}\\s+#{PEDEF}\\s*>" + GEDECL = "<!ENTITY\\s+#{NAME}\\s+#{ENTITYDEF}\\s*>" + ENTITYDECL = /\s*(?:#{GEDECL})|(?:#{PEDECL})/um + + attr_reader :name, :external, :ref, :ndata, :pubid + + # Create a new entity. Simple entities can be constructed by passing a + # name, value to the constructor; this creates a generic, plain entity + # reference. For anything more complicated, you have to pass a Source to + # the constructor with the entity definition, or use the accessor methods. + # +WARNING+: There is no validation of entity state except when the entity + # is read from a stream. If you start poking around with the accessors, + # you can easily create a non-conformant Entity. + # + # e = Entity.new( 'amp', '&' ) + def initialize stream, value=nil, parent=nil, reference=false + super(parent) + @ndata = @pubid = @value = @external = nil + if stream.kind_of? Array + @name = stream[1] + if stream[-1] == '%' + @reference = true + stream.pop + else + @reference = false + end + if stream[2] =~ /SYSTEM|PUBLIC/ + @external = stream[2] + if @external == 'SYSTEM' + @ref = stream[3] + @ndata = stream[4] if stream.size == 5 + else + @pubid = stream[3] + @ref = stream[4] + end + else + @value = stream[2] + end + else + @reference = reference + @external = nil + @name = stream + @value = value + end + end + + # Evaluates whether the given string matches an entity definition, + # returning true if so, and false otherwise. + def Entity::matches? string + (ENTITYDECL =~ string) == 0 + end + + # Evaluates to the unnormalized value of this entity; that is, replacing + # all entities -- both %ent; and &ent; entities. This differs from + # +value()+ in that +value+ only replaces %ent; entities. + def unnormalized + document.record_entity_expansion unless document.nil? + v = value() + return nil if v.nil? + @unnormalized = Text::unnormalize(v, parent) + @unnormalized + end + + #once :unnormalized + + # Returns the value of this entity unprocessed -- raw. This is the + # normalized value; that is, with all %ent; and &ent; entities intact + def normalized + @value + end + + # Write out a fully formed, correct entity definition (assuming the Entity + # object itself is valid.) + # + # out:: + # An object implementing <TT>&lt;&lt;</TT> to which the entity will be + # output + # indent:: + # *DEPRECATED* and ignored + def write out, indent=-1 + out << '<!ENTITY ' + out << '% ' if @reference + out << @name + out << ' ' + if @external + out << @external << ' ' + if @pubid + q = @pubid.include?('"')?"'":'"' + out << q << @pubid << q << ' ' + end + q = @ref.include?('"')?"'":'"' + out << q << @ref << q + out << ' NDATA ' << @ndata if @ndata + else + q = @value.include?('"')?"'":'"' + out << q << @value << q + end + out << '>' + end + + # Returns this entity as a string. See write(). + def to_s + rv = '' + write rv + rv + end + + PEREFERENCE_RE = /#{PEREFERENCE}/um + # Returns the value of this entity. At the moment, only internal entities + # are processed. If the value contains internal references (IE, + # %blah;), those are replaced with their values. IE, if the doctype + # contains: + # <!ENTITY % foo "bar"> + # <!ENTITY yada "nanoo %foo; nanoo> + # then: + # doctype.entity('yada').value #-> "nanoo bar nanoo" + def value + if @value + matches = @value.scan(PEREFERENCE_RE) + rv = @value.clone + if @parent + sum = 0 + matches.each do |entity_reference| + entity_value = @parent.entity( entity_reference[0] ) + if sum + entity_value.bytesize > Security.entity_expansion_text_limit + raise "entity expansion has grown too large" + else + sum += entity_value.bytesize + end + rv.gsub!( /%#{entity_reference.join};/um, entity_value ) + end + end + return rv + end + nil + end + end + + # This is a set of entity constants -- the ones defined in the XML + # specification. These are +gt+, +lt+, +amp+, +quot+ and +apos+. + # CAUTION: these entities does not have parent and document + module EntityConst + # +>+ + GT = Entity.new( 'gt', '>' ) + # +<+ + LT = Entity.new( 'lt', '<' ) + # +&+ + AMP = Entity.new( 'amp', '&' ) + # +"+ + QUOT = Entity.new( 'quot', '"' ) + # +'+ + APOS = Entity.new( 'apos', "'" ) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/default.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/default.rb new file mode 100644 index 000000000000..811b2ff3d5e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/default.rb @@ -0,0 +1,116 @@ +# frozen_string_literal: false + +module REXML + module Formatters + class Default + # Prints out the XML document with no formatting -- except if ie_hack is + # set. + # + # ie_hack:: + # If set to true, then inserts whitespace before the close of an empty + # tag, so that IE's bad XML parser doesn't choke. + def initialize( ie_hack=false ) + @ie_hack = ie_hack + end + + # Writes the node to some output. + # + # node:: + # The node to write + # output:: + # A class implementing <TT>&lt;&lt;</TT>. Pass in an Output object to + # change the output encoding. + def write( node, output ) + case node + + when Document + if node.xml_decl.encoding != 'UTF-8' && !output.kind_of?(Output) + output = Output.new( output, node.xml_decl.encoding ) + end + write_document( node, output ) + + when Element + write_element( node, output ) + + when Declaration, ElementDecl, NotationDecl, ExternalEntity, Entity, + Attribute, AttlistDecl + node.write( output,-1 ) + + when Instruction + write_instruction( node, output ) + + when DocType, XMLDecl + node.write( output ) + + when Comment + write_comment( node, output ) + + when CData + write_cdata( node, output ) + + when Text + write_text( node, output ) + + else + raise Exception.new("XML FORMATTING ERROR") + + end + end + + protected + def write_document( node, output ) + node.children.each { |child| write( child, output ) } + end + + def write_element( node, output ) + output << "<#{node.expanded_name}" + + node.attributes.to_a.map { |a| + Hash === a ? a.values : a + }.flatten.sort_by {|attr| attr.name}.each do |attr| + output << " " + attr.write( output ) + end unless node.attributes.empty? + + if node.children.empty? + output << " " if @ie_hack + output << "/" + else + output << ">" + node.children.each { |child| + write( child, output ) + } + output << "</#{node.expanded_name}" + end + output << ">" + end + + def write_text( node, output ) + output << node.to_s() + end + + def write_comment( node, output ) + output << Comment::START + output << node.to_s + output << Comment::STOP + end + + def write_cdata( node, output ) + output << CData::START + output << node.to_s + output << CData::STOP + end + + def write_instruction( node, output ) + output << Instruction::START + output << node.target + content = node.content + if content + output << ' ' + output << content + end + output << Instruction::STOP + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/pretty.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/pretty.rb new file mode 100644 index 000000000000..562ef9462e17 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/pretty.rb @@ -0,0 +1,142 @@ +# frozen_string_literal: false +require_relative 'default' + +module REXML + module Formatters + # Pretty-prints an XML document. This destroys whitespace in text nodes + # and will insert carriage returns and indentations. + # + # TODO: Add an option to print attributes on new lines + class Pretty < Default + + # If compact is set to true, then the formatter will attempt to use as + # little space as possible + attr_accessor :compact + # The width of a page. Used for formatting text + attr_accessor :width + + # Create a new pretty printer. + # + # output:: + # An object implementing '<<(String)', to which the output will be written. + # indentation:: + # An integer greater than 0. The indentation of each level will be + # this number of spaces. If this is < 1, the behavior of this object + # is undefined. Defaults to 2. + # ie_hack:: + # If true, the printer will insert whitespace before closing empty + # tags, thereby allowing Internet Explorer's XML parser to + # function. Defaults to false. + def initialize( indentation=2, ie_hack=false ) + @indentation = indentation + @level = 0 + @ie_hack = ie_hack + @width = 80 + @compact = false + end + + protected + def write_element(node, output) + output << ' '*@level + output << "<#{node.expanded_name}" + + node.attributes.each_attribute do |attr| + output << " " + attr.write( output ) + end unless node.attributes.empty? + + if node.children.empty? + if @ie_hack + output << " " + end + output << "/" + else + output << ">" + # If compact and all children are text, and if the formatted output + # is less than the specified width, then try to print everything on + # one line + skip = false + if compact + if node.children.inject(true) {|s,c| s & c.kind_of?(Text)} + string = "" + old_level = @level + @level = 0 + node.children.each { |child| write( child, string ) } + @level = old_level + if string.length < @width + output << string + skip = true + end + end + end + unless skip + output << "\n" + @level += @indentation + node.children.each { |child| + next if child.kind_of?(Text) and child.to_s.strip.length == 0 + write( child, output ) + output << "\n" + } + @level -= @indentation + output << ' '*@level + end + output << "</#{node.expanded_name}" + end + output << ">" + end + + def write_text( node, output ) + s = node.to_s() + s.gsub!(/\s/,' ') + s.squeeze!(" ") + s = wrap(s, @width - @level) + s = indent_text(s, @level, " ", true) + output << (' '*@level + s) + end + + def write_comment( node, output) + output << ' ' * @level + super + end + + def write_cdata( node, output) + output << ' ' * @level + super + end + + def write_document( node, output ) + # Ok, this is a bit odd. All XML documents have an XML declaration, + # but it may not write itself if the user didn't specifically add it, + # either through the API or in the input document. If it doesn't write + # itself, then we don't need a carriage return... which makes this + # logic more complex. + node.children.each { |child| + next if child == node.children[-1] and child.instance_of?(Text) + unless child == node.children[0] or child.instance_of?(Text) or + (child == node.children[1] and !node.children[0].writethis) + output << "\n" + end + write( child, output ) + } + end + + private + def indent_text(string, level=1, style="\t", indentfirstline=true) + return string if level < 0 + string.gsub(/\n/, "\n#{style*level}") + end + + def wrap(string, width) + parts = [] + while string.length > width and place = string.rindex(' ', width) + parts << string[0...place] + string = string[place+1..-1] + end + parts << string + parts.join("\n") + end + + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/transitive.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/transitive.rb new file mode 100644 index 000000000000..5ff51e10f372 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/transitive.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: false +require_relative 'pretty' + +module REXML + module Formatters + # The Transitive formatter writes an XML document that parses to an + # identical document as the source document. This means that no extra + # whitespace nodes are inserted, and whitespace within text nodes is + # preserved. Within these constraints, the document is pretty-printed, + # with whitespace inserted into the metadata to introduce formatting. + # + # Note that this is only useful if the original XML is not already + # formatted. Since this formatter does not alter whitespace nodes, the + # results of formatting already formatted XML will be odd. + class Transitive < Default + def initialize( indentation=2, ie_hack=false ) + @indentation = indentation + @level = 0 + @ie_hack = ie_hack + end + + protected + def write_element( node, output ) + output << "<#{node.expanded_name}" + + node.attributes.each_attribute do |attr| + output << " " + attr.write( output ) + end unless node.attributes.empty? + + output << "\n" + output << ' '*@level + if node.children.empty? + output << " " if @ie_hack + output << "/" + else + output << ">" + # If compact and all children are text, and if the formatted output + # is less than the specified width, then try to print everything on + # one line + @level += @indentation + node.children.each { |child| + write( child, output ) + } + @level -= @indentation + output << "</#{node.expanded_name}" + output << "\n" + output << ' '*@level + end + output << ">" + end + + def write_text( node, output ) + output << node.to_s() + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/functions.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/functions.rb new file mode 100644 index 000000000000..77926bf2af47 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/functions.rb @@ -0,0 +1,447 @@ +# frozen_string_literal: false +module REXML + # If you add a method, keep in mind two things: + # (1) the first argument will always be a list of nodes from which to + # filter. In the case of context methods (such as position), the function + # should return an array with a value for each child in the array. + # (2) all method calls from XML will have "-" replaced with "_". + # Therefore, in XML, "local-name()" is identical (and actually becomes) + # "local_name()" + module Functions + @@available_functions = {} + @@context = nil + @@namespace_context = {} + @@variables = {} + + INTERNAL_METHODS = [ + :namespace_context, + :namespace_context=, + :variables, + :variables=, + :context=, + :get_namespace, + :send, + ] + class << self + def singleton_method_added(name) + unless INTERNAL_METHODS.include?(name) + @@available_functions[name] = true + end + end + end + + def Functions::namespace_context=(x) ; @@namespace_context=x ; end + def Functions::variables=(x) ; @@variables=x ; end + def Functions::namespace_context ; @@namespace_context ; end + def Functions::variables ; @@variables ; end + + def Functions::context=(value); @@context = value; end + + def Functions::text( ) + if @@context[:node].node_type == :element + return @@context[:node].find_all{|n| n.node_type == :text}.collect{|n| n.value} + elsif @@context[:node].node_type == :text + return @@context[:node].value + else + return false + end + end + + # Returns the last node of the given list of nodes. + def Functions::last( ) + @@context[:size] + end + + def Functions::position( ) + @@context[:index] + end + + # Returns the size of the given list of nodes. + def Functions::count( node_set ) + node_set.size + end + + # Since REXML is non-validating, this method is not implemented as it + # requires a DTD + def Functions::id( object ) + end + + def Functions::local_name(node_set=nil) + get_namespace(node_set) do |node| + return node.local_name + end + "" + end + + def Functions::namespace_uri( node_set=nil ) + get_namespace( node_set ) {|node| node.namespace} + end + + def Functions::name( node_set=nil ) + get_namespace( node_set ) do |node| + node.expanded_name + end + end + + # Helper method. + def Functions::get_namespace( node_set = nil ) + if node_set == nil + yield @@context[:node] if @@context[:node].respond_to?(:namespace) + else + if node_set.respond_to? :each + result = [] + node_set.each do |node| + result << yield(node) if node.respond_to?(:namespace) + end + result + elsif node_set.respond_to? :namespace + yield node_set + end + end + end + + # A node-set is converted to a string by returning the string-value of the + # node in the node-set that is first in document order. If the node-set is + # empty, an empty string is returned. + # + # A number is converted to a string as follows + # + # NaN is converted to the string NaN + # + # positive zero is converted to the string 0 + # + # negative zero is converted to the string 0 + # + # positive infinity is converted to the string Infinity + # + # negative infinity is converted to the string -Infinity + # + # if the number is an integer, the number is represented in decimal form + # as a Number with no decimal point and no leading zeros, preceded by a + # minus sign (-) if the number is negative + # + # otherwise, the number is represented in decimal form as a Number + # including a decimal point with at least one digit before the decimal + # point and at least one digit after the decimal point, preceded by a + # minus sign (-) if the number is negative; there must be no leading zeros + # before the decimal point apart possibly from the one required digit + # immediately before the decimal point; beyond the one required digit + # after the decimal point there must be as many, but only as many, more + # digits as are needed to uniquely distinguish the number from all other + # IEEE 754 numeric values. + # + # The boolean false value is converted to the string false. The boolean + # true value is converted to the string true. + # + # An object of a type other than the four basic types is converted to a + # string in a way that is dependent on that type. + def Functions::string( object=@@context[:node] ) + if object.respond_to?(:node_type) + case object.node_type + when :attribute + object.value + when :element + string_value(object) + when :document + string_value(object.root) + when :processing_instruction + object.content + else + object.to_s + end + else + case object + when Array + string(object[0]) + when Float + if object.nan? + "NaN" + else + integer = object.to_i + if object == integer + "%d" % integer + else + object.to_s + end + end + else + object.to_s + end + end + end + + # A node-set is converted to a string by + # returning the concatenation of the string-value + # of each of the children of the node in the + # node-set that is first in document order. + # If the node-set is empty, an empty string is returned. + def Functions::string_value( o ) + rv = "" + o.children.each { |e| + if e.node_type == :text + rv << e.to_s + elsif e.node_type == :element + rv << string_value( e ) + end + } + rv + end + + def Functions::concat( *objects ) + concatenated = "" + objects.each do |object| + concatenated << string(object) + end + concatenated + end + + # Fixed by Mike Stok + def Functions::starts_with( string, test ) + string(string).index(string(test)) == 0 + end + + # Fixed by Mike Stok + def Functions::contains( string, test ) + string(string).include?(string(test)) + end + + # Kouhei fixed this + def Functions::substring_before( string, test ) + ruby_string = string(string) + ruby_index = ruby_string.index(string(test)) + if ruby_index.nil? + "" + else + ruby_string[ 0...ruby_index ] + end + end + + # Kouhei fixed this too + def Functions::substring_after( string, test ) + ruby_string = string(string) + return $1 if ruby_string =~ /#{test}(.*)/ + "" + end + + # Take equal portions of Mike Stok and Sean Russell; mix + # vigorously, and pour into a tall, chilled glass. Serves 10,000. + def Functions::substring( string, start, length=nil ) + ruby_string = string(string) + ruby_length = if length.nil? + ruby_string.length.to_f + else + number(length) + end + ruby_start = number(start) + + # Handle the special cases + return '' if ( + ruby_length.nan? or + ruby_start.nan? or + ruby_start.infinite? + ) + + infinite_length = ruby_length.infinite? == 1 + ruby_length = ruby_string.length if infinite_length + + # Now, get the bounds. The XPath bounds are 1..length; the ruby bounds + # are 0..length. Therefore, we have to offset the bounds by one. + ruby_start = round(ruby_start) - 1 + ruby_length = round(ruby_length) + + if ruby_start < 0 + ruby_length += ruby_start unless infinite_length + ruby_start = 0 + end + return '' if ruby_length <= 0 + ruby_string[ruby_start,ruby_length] + end + + # UNTESTED + def Functions::string_length( string ) + string(string).length + end + + # UNTESTED + def Functions::normalize_space( string=nil ) + string = string(@@context[:node]) if string.nil? + if string.kind_of? Array + string.collect{|x| string.to_s.strip.gsub(/\s+/um, ' ') if string} + else + string.to_s.strip.gsub(/\s+/um, ' ') + end + end + + # This is entirely Mike Stok's beast + def Functions::translate( string, tr1, tr2 ) + from = string(tr1) + to = string(tr2) + + # the map is our translation table. + # + # if a character occurs more than once in the + # from string then we ignore the second & + # subsequent mappings + # + # if a character maps to nil then we delete it + # in the output. This happens if the from + # string is longer than the to string + # + # there's nothing about - or ^ being special in + # http://www.w3.org/TR/xpath#function-translate + # so we don't build ranges or negated classes + + map = Hash.new + 0.upto(from.length - 1) { |pos| + from_char = from[pos] + unless map.has_key? from_char + map[from_char] = + if pos < to.length + to[pos] + else + nil + end + end + } + + if ''.respond_to? :chars + string(string).chars.collect { |c| + if map.has_key? c then map[c] else c end + }.compact.join + else + string(string).unpack('U*').collect { |c| + if map.has_key? c then map[c] else c end + }.compact.pack('U*') + end + end + + def Functions::boolean(object=@@context[:node]) + case object + when true, false + object + when Float + return false if object.zero? + return false if object.nan? + true + when Numeric + not object.zero? + when String + not object.empty? + when Array + not object.empty? + else + object ? true : false + end + end + + # UNTESTED + def Functions::not( object ) + not boolean( object ) + end + + # UNTESTED + def Functions::true( ) + true + end + + # UNTESTED + def Functions::false( ) + false + end + + # UNTESTED + def Functions::lang( language ) + lang = false + node = @@context[:node] + attr = nil + until node.nil? + if node.node_type == :element + attr = node.attributes["xml:lang"] + unless attr.nil? + lang = compare_language(string(language), attr) + break + else + end + end + node = node.parent + end + lang + end + + def Functions::compare_language lang1, lang2 + lang2.downcase.index(lang1.downcase) == 0 + end + + # a string that consists of optional whitespace followed by an optional + # minus sign followed by a Number followed by whitespace is converted to + # the IEEE 754 number that is nearest (according to the IEEE 754 + # round-to-nearest rule) to the mathematical value represented by the + # string; any other string is converted to NaN + # + # boolean true is converted to 1; boolean false is converted to 0 + # + # a node-set is first converted to a string as if by a call to the string + # function and then converted in the same way as a string argument + # + # an object of a type other than the four basic types is converted to a + # number in a way that is dependent on that type + def Functions::number(object=@@context[:node]) + case object + when true + Float(1) + when false + Float(0) + when Array + number(string(object)) + when Numeric + object.to_f + else + str = string(object) + case str.strip + when /\A\s*(-?(?:\d+(?:\.\d*)?|\.\d+))\s*\z/ + $1.to_f + else + Float::NAN + end + end + end + + def Functions::sum( nodes ) + nodes = [nodes] unless nodes.kind_of? Array + nodes.inject(0) { |r,n| r + number(string(n)) } + end + + def Functions::floor( number ) + number(number).floor + end + + def Functions::ceiling( number ) + number(number).ceil + end + + def Functions::round( number ) + number = number(number) + begin + neg = number.negative? + number = number.abs.round + neg ? -number : number + rescue FloatDomainError + number + end + end + + def Functions::processing_instruction( node ) + node.node_type == :processing_instruction + end + + def Functions::send(name, *args) + if @@available_functions[name.to_sym] + super + else + # TODO: Maybe, this is not XPath spec behavior. + # This behavior must be reconsidered. + XPath.match(@@context[:node], name.to_s) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/instruction.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/instruction.rb new file mode 100644 index 000000000000..318741f03b56 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/instruction.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: false + +require_relative "child" +require_relative "source" + +module REXML + # Represents an XML Instruction; IE, <? ... ?> + # TODO: Add parent arg (3rd arg) to constructor + class Instruction < Child + START = "<?" + STOP = "?>" + + # target is the "name" of the Instruction; IE, the "tag" in <?tag ...?> + # content is everything else. + attr_accessor :target, :content + + # Constructs a new Instruction + # @param target can be one of a number of things. If String, then + # the target of this instruction is set to this. If an Instruction, + # then the Instruction is shallowly cloned (target and content are + # copied). + # @param content Must be either a String, or a Parent. Can only + # be a Parent if the target argument is a Source. Otherwise, this + # String is set as the content of this instruction. + def initialize(target, content=nil) + case target + when String + super() + @target = target + @content = content + when Instruction + super(content) + @target = target.target + @content = target.content + else + message = + "processing instruction target must be String or REXML::Instruction: " + message << "<#{target.inspect}>" + raise ArgumentError, message + end + @content.strip! if @content + end + + def clone + Instruction.new self + end + + # == DEPRECATED + # See the rexml/formatters package + # + def write writer, indent=-1, transitive=false, ie_hack=false + Kernel.warn( "#{self.class.name}.write is deprecated", uplevel: 1) + indent(writer, indent) + writer << START + writer << @target + if @content + writer << ' ' + writer << @content + end + writer << STOP + end + + # @return true if other is an Instruction, and the content and target + # of the other matches the target and content of this object. + def ==( other ) + other.kind_of? Instruction and + other.target == @target and + other.content == @content + end + + def node_type + :processing_instruction + end + + def inspect + "<?p-i #{target} ...?>" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/light/node.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/light/node.rb new file mode 100644 index 000000000000..3dab885b0f8a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/light/node.rb @@ -0,0 +1,188 @@ +# frozen_string_literal: false +require_relative '../xmltokens' + +module REXML + module Light + # Represents a tagged XML element. Elements are characterized by + # having children, attributes, and names, and can themselves be + # children. + class Node + NAMESPLIT = /^(?:(#{XMLTokens::NCNAME_STR}):)?(#{XMLTokens::NCNAME_STR})/u + PARENTS = [ :element, :document, :doctype ] + # Create a new element. + def initialize node=nil + @node = node + if node.kind_of? String + node = [ :text, node ] + elsif node.nil? + node = [ :document, nil, nil ] + elsif node[0] == :start_element + node[0] = :element + elsif node[0] == :start_doctype + node[0] = :doctype + elsif node[0] == :start_document + node[0] = :document + end + end + + def size + if PARENTS.include? @node[0] + @node[-1].size + else + 0 + end + end + + def each + size.times { |x| yield( at(x+4) ) } + end + + def name + at(2) + end + + def name=( name_str, ns=nil ) + pfx = '' + pfx = "#{prefix(ns)}:" if ns + _old_put(2, "#{pfx}#{name_str}") + end + + def parent=( node ) + _old_put(1,node) + end + + def local_name + namesplit + @name + end + + def local_name=( name_str ) + _old_put( 1, "#@prefix:#{name_str}" ) + end + + def prefix( namespace=nil ) + prefix_of( self, namespace ) + end + + def namespace( prefix=prefix() ) + namespace_of( self, prefix ) + end + + def namespace=( namespace ) + @prefix = prefix( namespace ) + pfx = '' + pfx = "#@prefix:" if @prefix.size > 0 + _old_put(1, "#{pfx}#@name") + end + + def []( reference, ns=nil ) + if reference.kind_of? String + pfx = '' + pfx = "#{prefix(ns)}:" if ns + at(3)["#{pfx}#{reference}"] + elsif reference.kind_of? Range + _old_get( Range.new(4+reference.begin, reference.end, reference.exclude_end?) ) + else + _old_get( 4+reference ) + end + end + + def =~( path ) + XPath.match( self, path ) + end + + # Doesn't handle namespaces yet + def []=( reference, ns, value=nil ) + if reference.kind_of? String + value = ns unless value + at( 3 )[reference] = value + elsif reference.kind_of? Range + _old_put( Range.new(3+reference.begin, reference.end, reference.exclude_end?), ns ) + else + if value + _old_put( 4+reference, ns, value ) + else + _old_put( 4+reference, ns ) + end + end + end + + # Append a child to this element, optionally under a provided namespace. + # The namespace argument is ignored if the element argument is an Element + # object. Otherwise, the element argument is a string, the namespace (if + # provided) is the namespace the element is created in. + def << element + if node_type() == :text + at(-1) << element + else + newnode = Node.new( element ) + newnode.parent = self + self.push( newnode ) + end + at(-1) + end + + def node_type + _old_get(0) + end + + def text=( foo ) + replace = at(4).kind_of?(String)? 1 : 0 + self._old_put(4,replace, normalizefoo) + end + + def root + context = self + context = context.at(1) while context.at(1) + end + + def has_name?( name, namespace = '' ) + at(3) == name and namespace() == namespace + end + + def children + self + end + + def parent + at(1) + end + + def to_s + + end + + private + + def namesplit + return if @name.defined? + at(2) =~ NAMESPLIT + @prefix = '' || $1 + @name = $2 + end + + def namespace_of( node, prefix=nil ) + if not prefix + name = at(2) + name =~ NAMESPLIT + prefix = $1 + end + to_find = 'xmlns' + to_find = "xmlns:#{prefix}" if not prefix.nil? + ns = at(3)[ to_find ] + ns ? ns : namespace_of( @node[0], prefix ) + end + + def prefix_of( node, namespace=nil ) + if not namespace + name = node.name + name =~ NAMESPLIT + $1 + else + ns = at(3).find { |k,v| v == namespace } + ns ? ns : prefix_of( node.parent, namespace ) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/namespace.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/namespace.rb new file mode 100644 index 000000000000..924edf950631 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/namespace.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: false + +require_relative 'xmltokens' + +module REXML + # Adds named attributes to an object. + module Namespace + # The name of the object, valid if set + attr_reader :name, :expanded_name + # The expanded name of the object, valid if name is set + attr_accessor :prefix + include XMLTokens + NAMESPLIT = /^(?:(#{NCNAME_STR}):)?(#{NCNAME_STR})/u + + # Sets the name and the expanded name + def name=( name ) + @expanded_name = name + case name + when NAMESPLIT + if $1 + @prefix = $1 + else + @prefix = "" + @namespace = "" + end + @name = $2 + when "" + @prefix = nil + @namespace = nil + @name = nil + else + message = "name must be \#{PREFIX}:\#{LOCAL_NAME} or \#{LOCAL_NAME}: " + message += "<#{name.inspect}>" + raise ArgumentError, message + end + end + + # Compares names optionally WITH namespaces + def has_name?( other, ns=nil ) + if ns + return (namespace() == ns and name() == other) + elsif other.include? ":" + return fully_expanded_name == other + else + return name == other + end + end + + alias :local_name :name + + # Fully expand the name, even if the prefix wasn't specified in the + # source file. + def fully_expanded_name + ns = prefix + return "#{ns}:#@name" if ns.size > 0 + return @name + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/node.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/node.rb new file mode 100644 index 000000000000..081caba6cb7c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/node.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: false +require_relative "parseexception" +require_relative "formatters/pretty" +require_relative "formatters/default" + +module REXML + # Represents a node in the tree. Nodes are never encountered except as + # superclasses of other objects. Nodes have siblings. + module Node + # @return the next sibling (nil if unset) + def next_sibling_node + return nil if @parent.nil? + @parent[ @parent.index(self) + 1 ] + end + + # @return the previous sibling (nil if unset) + def previous_sibling_node + return nil if @parent.nil? + ind = @parent.index(self) + return nil if ind == 0 + @parent[ ind - 1 ] + end + + # indent:: + # *DEPRECATED* This parameter is now ignored. See the formatters in the + # REXML::Formatters package for changing the output style. + def to_s indent=nil + unless indent.nil? + Kernel.warn( "#{self.class.name}.to_s(indent) parameter is deprecated", uplevel: 1) + f = REXML::Formatters::Pretty.new( indent ) + f.write( self, rv = "" ) + else + f = REXML::Formatters::Default.new + f.write( self, rv = "" ) + end + return rv + end + + def indent to, ind + if @parent and @parent.context and not @parent.context[:indentstyle].nil? then + indentstyle = @parent.context[:indentstyle] + else + indentstyle = ' ' + end + to << indentstyle*ind unless ind<1 + end + + def parent? + false; + end + + + # Visit all subnodes of +self+ recursively + def each_recursive(&block) # :yields: node + self.elements.each {|node| + block.call(node) + node.each_recursive(&block) + } + end + + # Find (and return) first subnode (recursively) for which the block + # evaluates to true. Returns +nil+ if none was found. + def find_first_recursive(&block) # :yields: node + each_recursive {|node| + return node if block.call(node) + } + return nil + end + + # Returns the position that +self+ holds in its parent's array, indexed + # from 1. + def index_in_parent + parent.index(self)+1 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/output.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/output.rb new file mode 100644 index 000000000000..88a5fb378d9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/output.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: false +require_relative 'encoding' + +module REXML + class Output + include Encoding + + attr_reader :encoding + + def initialize real_IO, encd="iso-8859-1" + @output = real_IO + self.encoding = encd + + @to_utf = encoding != 'UTF-8' + + if encoding == "UTF-16" + @output << "\ufeff".encode("UTF-16BE") + self.encoding = "UTF-16BE" + end + end + + def <<( content ) + @output << (@to_utf ? self.encode(content) : content) + end + + def to_s + "Output[#{encoding}]" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parent.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parent.rb new file mode 100644 index 000000000000..6a53b37a123b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parent.rb @@ -0,0 +1,166 @@ +# frozen_string_literal: false +require_relative "child" + +module REXML + # A parent has children, and has methods for accessing them. The Parent + # class is never encountered except as the superclass for some other + # object. + class Parent < Child + include Enumerable + + # Constructor + # @param parent if supplied, will be set as the parent of this object + def initialize parent=nil + super(parent) + @children = [] + end + + def add( object ) + object.parent = self + @children << object + object + end + + alias :push :add + alias :<< :push + + def unshift( object ) + object.parent = self + @children.unshift object + end + + def delete( object ) + found = false + @children.delete_if {|c| c.equal?(object) and found = true } + object.parent = nil if found + found ? object : nil + end + + def each(&block) + @children.each(&block) + end + + def delete_if( &block ) + @children.delete_if(&block) + end + + def delete_at( index ) + @children.delete_at index + end + + def each_index( &block ) + @children.each_index(&block) + end + + # Fetches a child at a given index + # @param index the Integer index of the child to fetch + def []( index ) + @children[index] + end + + alias :each_child :each + + + + # Set an index entry. See Array.[]= + # @param index the index of the element to set + # @param opt either the object to set, or an Integer length + # @param child if opt is an Integer, this is the child to set + # @return the parent (self) + def []=( *args ) + args[-1].parent = self + @children[*args[0..-2]] = args[-1] + end + + # Inserts an child before another child + # @param child1 this is either an xpath or an Element. If an Element, + # child2 will be inserted before child1 in the child list of the parent. + # If an xpath, child2 will be inserted before the first child to match + # the xpath. + # @param child2 the child to insert + # @return the parent (self) + def insert_before( child1, child2 ) + if child1.kind_of? String + child1 = XPath.first( self, child1 ) + child1.parent.insert_before child1, child2 + else + ind = index(child1) + child2.parent.delete(child2) if child2.parent + @children[ind,0] = child2 + child2.parent = self + end + self + end + + # Inserts an child after another child + # @param child1 this is either an xpath or an Element. If an Element, + # child2 will be inserted after child1 in the child list of the parent. + # If an xpath, child2 will be inserted after the first child to match + # the xpath. + # @param child2 the child to insert + # @return the parent (self) + def insert_after( child1, child2 ) + if child1.kind_of? String + child1 = XPath.first( self, child1 ) + child1.parent.insert_after child1, child2 + else + ind = index(child1)+1 + child2.parent.delete(child2) if child2.parent + @children[ind,0] = child2 + child2.parent = self + end + self + end + + def to_a + @children.dup + end + + # Fetches the index of a given child + # @param child the child to get the index of + # @return the index of the child, or nil if the object is not a child + # of this parent. + def index( child ) + count = -1 + @children.find { |i| count += 1 ; i.hash == child.hash } + count + end + + # @return the number of children of this parent + def size + @children.size + end + + alias :length :size + + # Replaces one child with another, making sure the nodelist is correct + # @param to_replace the child to replace (must be a Child) + # @param replacement the child to insert into the nodelist (must be a + # Child) + def replace_child( to_replace, replacement ) + @children.map! {|c| c.equal?( to_replace ) ? replacement : c } + to_replace.parent = nil + replacement.parent = self + end + + # Deeply clones this object. This creates a complete duplicate of this + # Parent, including all descendants. + def deep_clone + cl = clone() + each do |child| + if child.kind_of? Parent + cl << child.deep_clone + else + cl << child.clone + end + end + cl + end + + alias :children :to_a + + def parent? + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parseexception.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parseexception.rb new file mode 100644 index 000000000000..7b16cd1a411d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parseexception.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: false +module REXML + class ParseException < RuntimeError + attr_accessor :source, :parser, :continued_exception + + def initialize( message, source=nil, parser=nil, exception=nil ) + super(message) + @source = source + @parser = parser + @continued_exception = exception + end + + def to_s + # Quote the original exception, if there was one + if @continued_exception + err = @continued_exception.inspect + err << "\n" + err << @continued_exception.backtrace.join("\n") + err << "\n...\n" + else + err = "" + end + + # Get the stack trace and error message + err << super + + # Add contextual information + if @source + err << "\nLine: #{line}\n" + err << "Position: #{position}\n" + err << "Last 80 unconsumed characters:\n" + err << @source.buffer[0..80].force_encoding("ASCII-8BIT").gsub(/\n/, ' ') + end + + err + end + + def position + @source.current_line[0] if @source and defined? @source.current_line and + @source.current_line + end + + def line + @source.current_line[2] if @source and defined? @source.current_line and + @source.current_line + end + + def context + @source.current_line + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/baseparser.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/baseparser.rb new file mode 100644 index 000000000000..305b1207955c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/baseparser.rb @@ -0,0 +1,694 @@ +# frozen_string_literal: false +require_relative '../parseexception' +require_relative '../undefinednamespaceexception' +require_relative '../source' +require 'set' +require "strscan" + +module REXML + module Parsers + # = Using the Pull Parser + # <em>This API is experimental, and subject to change.</em> + # parser = PullParser.new( "<a>text<b att='val'/>txet</a>" ) + # while parser.has_next? + # res = parser.next + # puts res[1]['att'] if res.start_tag? and res[0] == 'b' + # end + # See the PullEvent class for information on the content of the results. + # The data is identical to the arguments passed for the various events to + # the StreamListener API. + # + # Notice that: + # parser = PullParser.new( "<a>BAD DOCUMENT" ) + # while parser.has_next? + # res = parser.next + # raise res[1] if res.error? + # end + # + # Nat Price gave me some good ideas for the API. + class BaseParser + LETTER = '[:alpha:]' + DIGIT = '[:digit:]' + + COMBININGCHAR = '' # TODO + EXTENDER = '' # TODO + + NCNAME_STR= "[#{LETTER}_][-[:alnum:]._#{COMBININGCHAR}#{EXTENDER}]*" + QNAME_STR= "(?:(#{NCNAME_STR}):)?(#{NCNAME_STR})" + QNAME = /(#{QNAME_STR})/ + + # Just for backward compatibility. For example, kramdown uses this. + # It's not used in REXML. + UNAME_STR= "(?:#{NCNAME_STR}:)?#{NCNAME_STR}" + + NAMECHAR = '[\-\w\.:]' + NAME = "([\\w:]#{NAMECHAR}*)" + NMTOKEN = "(?:#{NAMECHAR})+" + NMTOKENS = "#{NMTOKEN}(\\s+#{NMTOKEN})*" + REFERENCE = "&(?:#{NAME};|#\\d+;|#x[0-9a-fA-F]+;)" + REFERENCE_RE = /#{REFERENCE}/ + + DOCTYPE_START = /\A\s*<!DOCTYPE\s/um + DOCTYPE_END = /\A\s*\]\s*>/um + ATTRIBUTE_PATTERN = /\s*(#{QNAME_STR})\s*=\s*(["'])(.*?)\4/um + COMMENT_START = /\A<!--/u + COMMENT_PATTERN = /<!--(.*?)-->/um + CDATA_START = /\A<!\[CDATA\[/u + CDATA_END = /\A\s*\]\s*>/um + CDATA_PATTERN = /<!\[CDATA\[(.*?)\]\]>/um + XMLDECL_START = /\A<\?xml\s/u; + XMLDECL_PATTERN = /<\?xml\s+(.*?)\?>/um + INSTRUCTION_START = /\A<\?/u + INSTRUCTION_PATTERN = /<\?#{NAME}(\s+.*?)?\?>/um + TAG_MATCH = /\A<((?>#{QNAME_STR}))/um + CLOSE_MATCH = /\A\s*<\/(#{QNAME_STR})\s*>/um + + VERSION = /\bversion\s*=\s*["'](.*?)['"]/um + ENCODING = /\bencoding\s*=\s*["'](.*?)['"]/um + STANDALONE = /\bstandalone\s*=\s*["'](.*?)['"]/um + + ENTITY_START = /\A\s*<!ENTITY/ + ELEMENTDECL_START = /\A\s*<!ELEMENT/um + ELEMENTDECL_PATTERN = /\A\s*(<!ELEMENT.*?)>/um + SYSTEMENTITY = /\A\s*(%.*?;)\s*$/um + ENUMERATION = "\\(\\s*#{NMTOKEN}(?:\\s*\\|\\s*#{NMTOKEN})*\\s*\\)" + NOTATIONTYPE = "NOTATION\\s+\\(\\s*#{NAME}(?:\\s*\\|\\s*#{NAME})*\\s*\\)" + ENUMERATEDTYPE = "(?:(?:#{NOTATIONTYPE})|(?:#{ENUMERATION}))" + ATTTYPE = "(CDATA|ID|IDREF|IDREFS|ENTITY|ENTITIES|NMTOKEN|NMTOKENS|#{ENUMERATEDTYPE})" + ATTVALUE = "(?:\"((?:[^<&\"]|#{REFERENCE})*)\")|(?:'((?:[^<&']|#{REFERENCE})*)')" + DEFAULTDECL = "(#REQUIRED|#IMPLIED|(?:(#FIXED\\s+)?#{ATTVALUE}))" + ATTDEF = "\\s+#{NAME}\\s+#{ATTTYPE}\\s+#{DEFAULTDECL}" + ATTDEF_RE = /#{ATTDEF}/ + ATTLISTDECL_START = /\A\s*<!ATTLIST/um + ATTLISTDECL_PATTERN = /\A\s*<!ATTLIST\s+#{NAME}(?:#{ATTDEF})*\s*>/um + + TEXT_PATTERN = /\A([^<]*)/um + + # Entity constants + PUBIDCHAR = "\x20\x0D\x0Aa-zA-Z0-9\\-()+,./:=?;!*@$_%#" + SYSTEMLITERAL = %Q{((?:"[^"]*")|(?:'[^']*'))} + PUBIDLITERAL = %Q{("[#{PUBIDCHAR}']*"|'[#{PUBIDCHAR}]*')} + EXTERNALID = "(?:(?:(SYSTEM)\\s+#{SYSTEMLITERAL})|(?:(PUBLIC)\\s+#{PUBIDLITERAL}\\s+#{SYSTEMLITERAL}))" + NDATADECL = "\\s+NDATA\\s+#{NAME}" + PEREFERENCE = "%#{NAME};" + ENTITYVALUE = %Q{((?:"(?:[^%&"]|#{PEREFERENCE}|#{REFERENCE})*")|(?:'([^%&']|#{PEREFERENCE}|#{REFERENCE})*'))} + PEDEF = "(?:#{ENTITYVALUE}|#{EXTERNALID})" + ENTITYDEF = "(?:#{ENTITYVALUE}|(?:#{EXTERNALID}(#{NDATADECL})?))" + PEDECL = "<!ENTITY\\s+(%)\\s+#{NAME}\\s+#{PEDEF}\\s*>" + GEDECL = "<!ENTITY\\s+#{NAME}\\s+#{ENTITYDEF}\\s*>" + ENTITYDECL = /\s*(?:#{GEDECL})|(?:#{PEDECL})/um + + NOTATIONDECL_START = /\A\s*<!NOTATION/um + EXTERNAL_ID_PUBLIC = /\A\s*PUBLIC\s+#{PUBIDLITERAL}\s+#{SYSTEMLITERAL}\s*/um + EXTERNAL_ID_SYSTEM = /\A\s*SYSTEM\s+#{SYSTEMLITERAL}\s*/um + PUBLIC_ID = /\A\s*PUBLIC\s+#{PUBIDLITERAL}\s*/um + + EREFERENCE = /&(?!#{NAME};)/ + + DEFAULT_ENTITIES = { + 'gt' => [/&gt;/, '&gt;', '>', />/], + 'lt' => [/&lt;/, '&lt;', '<', /</], + 'quot' => [/&quot;/, '&quot;', '"', /"/], + "apos" => [/&apos;/, "&apos;", "'", /'/] + } + + def initialize( source ) + self.stream = source + @listeners = [] + end + + def add_listener( listener ) + @listeners << listener + end + + attr_reader :source + + def stream=( source ) + @source = SourceFactory.create_from( source ) + @closed = nil + @document_status = nil + @tags = [] + @stack = [] + @entities = [] + @nsstack = [] + end + + def position + if @source.respond_to? :position + @source.position + else + # FIXME + 0 + end + end + + # Returns true if there are no more events + def empty? + return (@source.empty? and @stack.empty?) + end + + # Returns true if there are more events. Synonymous with !empty? + def has_next? + return !(@source.empty? and @stack.empty?) + end + + # Push an event back on the head of the stream. This method + # has (theoretically) infinite depth. + def unshift token + @stack.unshift(token) + end + + # Peek at the +depth+ event in the stack. The first element on the stack + # is at depth 0. If +depth+ is -1, will parse to the end of the input + # stream and return the last event, which is always :end_document. + # Be aware that this causes the stream to be parsed up to the +depth+ + # event, so you can effectively pre-parse the entire document (pull the + # entire thing into memory) using this method. + def peek depth=0 + raise %Q[Illegal argument "#{depth}"] if depth < -1 + temp = [] + if depth == -1 + temp.push(pull()) until empty? + else + while @stack.size+temp.size < depth+1 + temp.push(pull()) + end + end + @stack += temp if temp.size > 0 + @stack[depth] + end + + # Returns the next event. This is a +PullEvent+ object. + def pull + pull_event.tap do |event| + @listeners.each do |listener| + listener.receive event + end + end + end + + def pull_event + if @closed + x, @closed = @closed, nil + return [ :end_element, x ] + end + return [ :end_document ] if empty? + return @stack.shift if @stack.size > 0 + #STDERR.puts @source.encoding + #STDERR.puts "BUFFER = #{@source.buffer.inspect}" + if @document_status == nil + word = @source.match( /\A((?:\s+)|(?:<[^>]*>))/um ) + word = word[1] unless word.nil? + #STDERR.puts "WORD = #{word.inspect}" + case word + when COMMENT_START + return [ :comment, @source.match( COMMENT_PATTERN, true )[1] ] + when XMLDECL_START + #STDERR.puts "XMLDECL" + results = @source.match( XMLDECL_PATTERN, true )[1] + version = VERSION.match( results ) + version = version[1] unless version.nil? + encoding = ENCODING.match(results) + encoding = encoding[1] unless encoding.nil? + if need_source_encoding_update?(encoding) + @source.encoding = encoding + end + if encoding.nil? and /\AUTF-16(?:BE|LE)\z/i =~ @source.encoding + encoding = "UTF-16" + end + standalone = STANDALONE.match(results) + standalone = standalone[1] unless standalone.nil? + return [ :xmldecl, version, encoding, standalone ] + when INSTRUCTION_START + return process_instruction + when DOCTYPE_START + base_error_message = "Malformed DOCTYPE" + @source.match(DOCTYPE_START, true) + @nsstack.unshift(curr_ns=Set.new) + name = parse_name(base_error_message) + if @source.match(/\A\s*\[/um, true) + id = [nil, nil, nil] + @document_status = :in_doctype + elsif @source.match(/\A\s*>/um, true) + id = [nil, nil, nil] + @document_status = :after_doctype + else + id = parse_id(base_error_message, + accept_external_id: true, + accept_public_id: false) + if id[0] == "SYSTEM" + # For backward compatibility + id[1], id[2] = id[2], nil + end + if @source.match(/\A\s*\[/um, true) + @document_status = :in_doctype + elsif @source.match(/\A\s*>/um, true) + @document_status = :after_doctype + else + message = "#{base_error_message}: garbage after external ID" + raise REXML::ParseException.new(message, @source) + end + end + args = [:start_doctype, name, *id] + if @document_status == :after_doctype + @source.match(/\A\s*/um, true) + @stack << [ :end_doctype ] + end + return args + when /\A\s+/ + else + @document_status = :after_doctype + if @source.encoding == "UTF-8" + @source.buffer.force_encoding(::Encoding::UTF_8) + end + end + end + if @document_status == :in_doctype + md = @source.match(/\A\s*(.*?>)/um) + case md[1] + when SYSTEMENTITY + match = @source.match( SYSTEMENTITY, true )[1] + return [ :externalentity, match ] + + when ELEMENTDECL_START + return [ :elementdecl, @source.match( ELEMENTDECL_PATTERN, true )[1] ] + + when ENTITY_START + match = @source.match( ENTITYDECL, true ).to_a.compact + match[0] = :entitydecl + ref = false + if match[1] == '%' + ref = true + match.delete_at 1 + end + # Now we have to sort out what kind of entity reference this is + if match[2] == 'SYSTEM' + # External reference + match[3] = match[3][1..-2] # PUBID + match.delete_at(4) if match.size > 4 # Chop out NDATA decl + # match is [ :entity, name, SYSTEM, pubid(, ndata)? ] + elsif match[2] == 'PUBLIC' + # External reference + match[3] = match[3][1..-2] # PUBID + match[4] = match[4][1..-2] # HREF + match.delete_at(5) if match.size > 5 # Chop out NDATA decl + # match is [ :entity, name, PUBLIC, pubid, href(, ndata)? ] + else + match[2] = match[2][1..-2] + match.pop if match.size == 4 + # match is [ :entity, name, value ] + end + match << '%' if ref + return match + when ATTLISTDECL_START + md = @source.match( ATTLISTDECL_PATTERN, true ) + raise REXML::ParseException.new( "Bad ATTLIST declaration!", @source ) if md.nil? + element = md[1] + contents = md[0] + + pairs = {} + values = md[0].scan( ATTDEF_RE ) + values.each do |attdef| + unless attdef[3] == "#IMPLIED" + attdef.compact! + val = attdef[3] + val = attdef[4] if val == "#FIXED " + pairs[attdef[0]] = val + if attdef[0] =~ /^xmlns:(.*)/ + @nsstack[0] << $1 + end + end + end + return [ :attlistdecl, element, pairs, contents ] + when NOTATIONDECL_START + base_error_message = "Malformed notation declaration" + unless @source.match(/\A\s*<!NOTATION\s+/um, true) + if @source.match(/\A\s*<!NOTATION\s*>/um) + message = "#{base_error_message}: name is missing" + else + message = "#{base_error_message}: invalid declaration name" + end + raise REXML::ParseException.new(message, @source) + end + name = parse_name(base_error_message) + id = parse_id(base_error_message, + accept_external_id: true, + accept_public_id: true) + unless @source.match(/\A\s*>/um, true) + message = "#{base_error_message}: garbage before end >" + raise REXML::ParseException.new(message, @source) + end + return [:notationdecl, name, *id] + when DOCTYPE_END + @document_status = :after_doctype + @source.match( DOCTYPE_END, true ) + return [ :end_doctype ] + end + end + if @document_status == :after_doctype + @source.match(/\A\s*/um, true) + end + begin + @source.read if @source.buffer.size<2 + if @source.buffer[0] == ?< + if @source.buffer[1] == ?/ + @nsstack.shift + last_tag = @tags.pop + md = @source.match( CLOSE_MATCH, true ) + if md and !last_tag + message = "Unexpected top-level end tag (got '#{md[1]}')" + raise REXML::ParseException.new(message, @source) + end + if md.nil? or last_tag != md[1] + message = "Missing end tag for '#{last_tag}'" + message << " (got '#{md[1]}')" if md + raise REXML::ParseException.new(message, @source) + end + return [ :end_element, last_tag ] + elsif @source.buffer[1] == ?! + md = @source.match(/\A(\s*[^>]*>)/um) + #STDERR.puts "SOURCE BUFFER = #{source.buffer}, #{source.buffer.size}" + raise REXML::ParseException.new("Malformed node", @source) unless md + if md[0][2] == ?- + md = @source.match( COMMENT_PATTERN, true ) + + case md[1] + when /--/, /-\z/ + raise REXML::ParseException.new("Malformed comment", @source) + end + + return [ :comment, md[1] ] if md + else + md = @source.match( CDATA_PATTERN, true ) + return [ :cdata, md[1] ] if md + end + raise REXML::ParseException.new( "Declarations can only occur "+ + "in the doctype declaration.", @source) + elsif @source.buffer[1] == ?? + return process_instruction + else + # Get the next tag + md = @source.match(TAG_MATCH, true) + unless md + raise REXML::ParseException.new("malformed XML: missing tag start", @source) + end + @document_status = :in_element + prefixes = Set.new + prefixes << md[2] if md[2] + @nsstack.unshift(curr_ns=Set.new) + attributes, closed = parse_attributes(prefixes, curr_ns) + # Verify that all of the prefixes have been defined + for prefix in prefixes + unless @nsstack.find{|k| k.member?(prefix)} + raise UndefinedNamespaceException.new(prefix,@source,self) + end + end + + if closed + @closed = md[1] + @nsstack.shift + else + @tags.push( md[1] ) + end + return [ :start_element, md[1], attributes ] + end + else + md = @source.match( TEXT_PATTERN, true ) + if md[0].length == 0 + @source.match( /(\s+)/, true ) + end + #STDERR.puts "GOT #{md[1].inspect}" unless md[0].length == 0 + #return [ :text, "" ] if md[0].length == 0 + # unnormalized = Text::unnormalize( md[1], self ) + # return PullEvent.new( :text, md[1], unnormalized ) + return [ :text, md[1] ] + end + rescue REXML::UndefinedNamespaceException + raise + rescue REXML::ParseException + raise + rescue => error + raise REXML::ParseException.new( "Exception parsing", + @source, self, (error ? error : $!) ) + end + return [ :dummy ] + end + private :pull_event + + def entity( reference, entities ) + value = nil + value = entities[ reference ] if entities + if not value + value = DEFAULT_ENTITIES[ reference ] + value = value[2] if value + end + unnormalize( value, entities ) if value + end + + # Escapes all possible entities + def normalize( input, entities=nil, entity_filter=nil ) + copy = input.clone + # Doing it like this rather than in a loop improves the speed + copy.gsub!( EREFERENCE, '&amp;' ) + entities.each do |key, value| + copy.gsub!( value, "&#{key};" ) unless entity_filter and + entity_filter.include?(entity) + end if entities + copy.gsub!( EREFERENCE, '&amp;' ) + DEFAULT_ENTITIES.each do |key, value| + copy.gsub!( value[3], value[1] ) + end + copy + end + + # Unescapes all possible entities + def unnormalize( string, entities=nil, filter=nil ) + rv = string.clone + rv.gsub!( /\r\n?/, "\n" ) + matches = rv.scan( REFERENCE_RE ) + return rv if matches.size == 0 + rv.gsub!( /&#0*((?:\d+)|(?:x[a-fA-F0-9]+));/ ) { + m=$1 + m = "0#{m}" if m[0] == ?x + [Integer(m)].pack('U*') + } + matches.collect!{|x|x[0]}.compact! + if matches.size > 0 + matches.each do |entity_reference| + unless filter and filter.include?(entity_reference) + entity_value = entity( entity_reference, entities ) + if entity_value + re = /&#{entity_reference};/ + rv.gsub!( re, entity_value ) + else + er = DEFAULT_ENTITIES[entity_reference] + rv.gsub!( er[0], er[2] ) if er + end + end + end + rv.gsub!( /&amp;/, '&' ) + end + rv + end + + private + def need_source_encoding_update?(xml_declaration_encoding) + return false if xml_declaration_encoding.nil? + return false if /\AUTF-16\z/i =~ xml_declaration_encoding + true + end + + def parse_name(base_error_message) + md = @source.match(/\A\s*#{NAME}/um, true) + unless md + if @source.match(/\A\s*\S/um) + message = "#{base_error_message}: invalid name" + else + message = "#{base_error_message}: name is missing" + end + raise REXML::ParseException.new(message, @source) + end + md[1] + end + + def parse_id(base_error_message, + accept_external_id:, + accept_public_id:) + if accept_external_id and (md = @source.match(EXTERNAL_ID_PUBLIC, true)) + pubid = system = nil + pubid_literal = md[1] + pubid = pubid_literal[1..-2] if pubid_literal # Remove quote + system_literal = md[2] + system = system_literal[1..-2] if system_literal # Remove quote + ["PUBLIC", pubid, system] + elsif accept_public_id and (md = @source.match(PUBLIC_ID, true)) + pubid = system = nil + pubid_literal = md[1] + pubid = pubid_literal[1..-2] if pubid_literal # Remove quote + ["PUBLIC", pubid, nil] + elsif accept_external_id and (md = @source.match(EXTERNAL_ID_SYSTEM, true)) + system = nil + system_literal = md[1] + system = system_literal[1..-2] if system_literal # Remove quote + ["SYSTEM", nil, system] + else + details = parse_id_invalid_details(accept_external_id: accept_external_id, + accept_public_id: accept_public_id) + message = "#{base_error_message}: #{details}" + raise REXML::ParseException.new(message, @source) + end + end + + def parse_id_invalid_details(accept_external_id:, + accept_public_id:) + public = /\A\s*PUBLIC/um + system = /\A\s*SYSTEM/um + if (accept_external_id or accept_public_id) and @source.match(/#{public}/um) + if @source.match(/#{public}(?:\s+[^'"]|\s*[\[>])/um) + return "public ID literal is missing" + end + unless @source.match(/#{public}\s+#{PUBIDLITERAL}/um) + return "invalid public ID literal" + end + if accept_public_id + if @source.match(/#{public}\s+#{PUBIDLITERAL}\s+[^'"]/um) + return "system ID literal is missing" + end + unless @source.match(/#{public}\s+#{PUBIDLITERAL}\s+#{SYSTEMLITERAL}/um) + return "invalid system literal" + end + "garbage after system literal" + else + "garbage after public ID literal" + end + elsif accept_external_id and @source.match(/#{system}/um) + if @source.match(/#{system}(?:\s+[^'"]|\s*[\[>])/um) + return "system literal is missing" + end + unless @source.match(/#{system}\s+#{SYSTEMLITERAL}/um) + return "invalid system literal" + end + "garbage after system literal" + else + unless @source.match(/\A\s*(?:PUBLIC|SYSTEM)\s/um) + return "invalid ID type" + end + "ID type is missing" + end + end + + def process_instruction + match_data = @source.match(INSTRUCTION_PATTERN, true) + unless match_data + message = "Invalid processing instruction node" + raise REXML::ParseException.new(message, @source) + end + [:processing_instruction, match_data[1], match_data[2]] + end + + def parse_attributes(prefixes, curr_ns) + attributes = {} + closed = false + match_data = @source.match(/^(.*?)(\/)?>/um, true) + if match_data.nil? + message = "Start tag isn't ended" + raise REXML::ParseException.new(message, @source) + end + + raw_attributes = match_data[1] + closed = !match_data[2].nil? + return attributes, closed if raw_attributes.nil? + return attributes, closed if raw_attributes.empty? + + scanner = StringScanner.new(raw_attributes) + until scanner.eos? + if scanner.scan(/\s+/) + break if scanner.eos? + end + + pos = scanner.pos + loop do + break if scanner.scan(ATTRIBUTE_PATTERN) + unless scanner.scan(QNAME) + message = "Invalid attribute name: <#{scanner.rest}>" + raise REXML::ParseException.new(message, @source) + end + name = scanner[0] + unless scanner.scan(/\s*=\s*/um) + message = "Missing attribute equal: <#{name}>" + raise REXML::ParseException.new(message, @source) + end + quote = scanner.scan(/['"]/) + unless quote + message = "Missing attribute value start quote: <#{name}>" + raise REXML::ParseException.new(message, @source) + end + unless scanner.scan(/.*#{Regexp.escape(quote)}/um) + match_data = @source.match(/^(.*?)(\/)?>/um, true) + if match_data + scanner << "/" if closed + scanner << ">" + scanner << match_data[1] + scanner.pos = pos + closed = !match_data[2].nil? + next + end + message = + "Missing attribute value end quote: <#{name}>: <#{quote}>" + raise REXML::ParseException.new(message, @source) + end + end + name = scanner[1] + prefix = scanner[2] + local_part = scanner[3] + # quote = scanner[4] + value = scanner[5] + if prefix == "xmlns" + if local_part == "xml" + if value != "http://www.w3.org/XML/1998/namespace" + msg = "The 'xml' prefix must not be bound to any other namespace "+ + "(http://www.w3.org/TR/REC-xml-names/#ns-decl)" + raise REXML::ParseException.new( msg, @source, self ) + end + elsif local_part == "xmlns" + msg = "The 'xmlns' prefix must not be declared "+ + "(http://www.w3.org/TR/REC-xml-names/#ns-decl)" + raise REXML::ParseException.new( msg, @source, self) + end + curr_ns << local_part + elsif prefix + prefixes << prefix unless prefix == "xml" + end + + if attributes.has_key?(name) + msg = "Duplicate attribute #{name.inspect}" + raise REXML::ParseException.new(msg, @source, self) + end + + attributes[name] = value + end + return attributes, closed + end + end + end +end + +=begin + case event[0] + when :start_element + when :text + when :end_element + when :processing_instruction + when :cdata + when :comment + when :xmldecl + when :start_doctype + when :end_doctype + when :externalentity + when :elementdecl + when :entity + when :attlistdecl + when :notationdecl + when :end_doctype + end +=end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/lightparser.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/lightparser.rb new file mode 100644 index 000000000000..bdc08276a9ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/lightparser.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: false +require_relative 'streamparser' +require_relative 'baseparser' +require_relative '../light/node' + +module REXML + module Parsers + class LightParser + def initialize stream + @stream = stream + @parser = REXML::Parsers::BaseParser.new( stream ) + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + def rewind + @stream.rewind + @parser.stream = @stream + end + + def parse + root = context = [ :document ] + while true + event = @parser.pull + case event[0] + when :end_document + break + when :start_element, :start_doctype + new_node = event + context << new_node + new_node[1,0] = [context] + context = new_node + when :end_element, :end_doctype + context = context[1] + else + new_node = event + context << new_node + new_node[1,0] = [context] + end + end + root + end + end + + # An element is an array. The array contains: + # 0 The parent element + # 1 The tag name + # 2 A hash of attributes + # 3..-1 The child elements + # An element is an array of size > 3 + # Text is a String + # PIs are [ :processing_instruction, target, data ] + # Comments are [ :comment, data ] + # DocTypes are DocType structs + # The root is an array with XMLDecls, Text, DocType, Array, Text + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/pullparser.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/pullparser.rb new file mode 100644 index 000000000000..f8b232a2cd35 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/pullparser.rb @@ -0,0 +1,197 @@ +# frozen_string_literal: false +require 'forwardable' + +require_relative '../parseexception' +require_relative 'baseparser' +require_relative '../xmltokens' + +module REXML + module Parsers + # = Using the Pull Parser + # <em>This API is experimental, and subject to change.</em> + # parser = PullParser.new( "<a>text<b att='val'/>txet</a>" ) + # while parser.has_next? + # res = parser.next + # puts res[1]['att'] if res.start_tag? and res[0] == 'b' + # end + # See the PullEvent class for information on the content of the results. + # The data is identical to the arguments passed for the various events to + # the StreamListener API. + # + # Notice that: + # parser = PullParser.new( "<a>BAD DOCUMENT" ) + # while parser.has_next? + # res = parser.next + # raise res[1] if res.error? + # end + # + # Nat Price gave me some good ideas for the API. + class PullParser + include XMLTokens + extend Forwardable + + def_delegators( :@parser, :has_next? ) + def_delegators( :@parser, :entity ) + def_delegators( :@parser, :empty? ) + def_delegators( :@parser, :source ) + + def initialize stream + @entities = {} + @listeners = nil + @parser = BaseParser.new( stream ) + @my_stack = [] + end + + def add_listener( listener ) + @listeners = [] unless @listeners + @listeners << listener + end + + def each + while has_next? + yield self.pull + end + end + + def peek depth=0 + if @my_stack.length <= depth + (depth - @my_stack.length + 1).times { + e = PullEvent.new(@parser.pull) + @my_stack.push(e) + } + end + @my_stack[depth] + end + + def pull + return @my_stack.shift if @my_stack.length > 0 + + event = @parser.pull + case event[0] + when :entitydecl + @entities[ event[1] ] = + event[2] unless event[2] =~ /PUBLIC|SYSTEM/ + when :text + unnormalized = @parser.unnormalize( event[1], @entities ) + event << unnormalized + end + PullEvent.new( event ) + end + + def unshift token + @my_stack.unshift token + end + end + + # A parsing event. The contents of the event are accessed as an +Array?, + # and the type is given either by the ...? methods, or by accessing the + # +type+ accessor. The contents of this object vary from event to event, + # but are identical to the arguments passed to +StreamListener+s for each + # event. + class PullEvent + # The type of this event. Will be one of :tag_start, :tag_end, :text, + # :processing_instruction, :comment, :doctype, :attlistdecl, :entitydecl, + # :notationdecl, :entity, :cdata, :xmldecl, or :error. + def initialize(arg) + @contents = arg + end + + def []( start, endd=nil) + if start.kind_of? Range + @contents.slice( start.begin+1 .. start.end ) + elsif start.kind_of? Numeric + if endd.nil? + @contents.slice( start+1 ) + else + @contents.slice( start+1, endd ) + end + else + raise "Illegal argument #{start.inspect} (#{start.class})" + end + end + + def event_type + @contents[0] + end + + # Content: [ String tag_name, Hash attributes ] + def start_element? + @contents[0] == :start_element + end + + # Content: [ String tag_name ] + def end_element? + @contents[0] == :end_element + end + + # Content: [ String raw_text, String unnormalized_text ] + def text? + @contents[0] == :text + end + + # Content: [ String text ] + def instruction? + @contents[0] == :processing_instruction + end + + # Content: [ String text ] + def comment? + @contents[0] == :comment + end + + # Content: [ String name, String pub_sys, String long_name, String uri ] + def doctype? + @contents[0] == :start_doctype + end + + # Content: [ String text ] + def attlistdecl? + @contents[0] == :attlistdecl + end + + # Content: [ String text ] + def elementdecl? + @contents[0] == :elementdecl + end + + # Due to the wonders of DTDs, an entity declaration can be just about + # anything. There's no way to normalize it; you'll have to interpret the + # content yourself. However, the following is true: + # + # * If the entity declaration is an internal entity: + # [ String name, String value ] + # Content: [ String text ] + def entitydecl? + @contents[0] == :entitydecl + end + + # Content: [ String text ] + def notationdecl? + @contents[0] == :notationdecl + end + + # Content: [ String text ] + def entity? + @contents[0] == :entity + end + + # Content: [ String text ] + def cdata? + @contents[0] == :cdata + end + + # Content: [ String version, String encoding, String standalone ] + def xmldecl? + @contents[0] == :xmldecl + end + + def error? + @contents[0] == :error + end + + def inspect + @contents[0].to_s + ": " + @contents[1..-1].inspect + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/sax2parser.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/sax2parser.rb new file mode 100644 index 000000000000..6a24ce2227a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/sax2parser.rb @@ -0,0 +1,273 @@ +# frozen_string_literal: false +require_relative 'baseparser' +require_relative '../parseexception' +require_relative '../namespace' +require_relative '../text' + +module REXML + module Parsers + # SAX2Parser + class SAX2Parser + def initialize source + @parser = BaseParser.new(source) + @listeners = [] + @procs = [] + @namespace_stack = [] + @has_listeners = false + @tag_stack = [] + @entities = {} + end + + def source + @parser.source + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + # Listen arguments: + # + # Symbol, Array, Block + # Listen to Symbol events on Array elements + # Symbol, Block + # Listen to Symbol events + # Array, Listener + # Listen to all events on Array elements + # Array, Block + # Listen to :start_element events on Array elements + # Listener + # Listen to All events + # + # Symbol can be one of: :start_element, :end_element, + # :start_prefix_mapping, :end_prefix_mapping, :characters, + # :processing_instruction, :doctype, :attlistdecl, :elementdecl, + # :entitydecl, :notationdecl, :cdata, :xmldecl, :comment + # + # There is an additional symbol that can be listened for: :progress. + # This will be called for every event generated, passing in the current + # stream position. + # + # Array contains regular expressions or strings which will be matched + # against fully qualified element names. + # + # Listener must implement the methods in SAX2Listener + # + # Block will be passed the same arguments as a SAX2Listener method would + # be, where the method name is the same as the matched Symbol. + # See the SAX2Listener for more information. + def listen( *args, &blok ) + if args[0].kind_of? Symbol + if args.size == 2 + args[1].each { |match| @procs << [args[0], match, blok] } + else + add( [args[0], nil, blok] ) + end + elsif args[0].kind_of? Array + if args.size == 2 + args[0].each { |match| add( [nil, match, args[1]] ) } + else + args[0].each { |match| add( [ :start_element, match, blok ] ) } + end + else + add([nil, nil, args[0]]) + end + end + + def deafen( listener=nil, &blok ) + if listener + @listeners.delete_if {|item| item[-1] == listener } + @has_listeners = false if @listeners.size == 0 + else + @procs.delete_if {|item| item[-1] == blok } + end + end + + def parse + @procs.each { |sym,match,block| block.call if sym == :start_document } + @listeners.each { |sym,match,block| + block.start_document if sym == :start_document or sym.nil? + } + context = [] + while true + event = @parser.pull + case event[0] + when :end_document + handle( :end_document ) + break + when :start_doctype + handle( :doctype, *event[1..-1]) + when :end_doctype + context = context[1] + when :start_element + @tag_stack.push(event[1]) + # find the observers for namespaces + procs = get_procs( :start_prefix_mapping, event[1] ) + listeners = get_listeners( :start_prefix_mapping, event[1] ) + if procs or listeners + # break out the namespace declarations + # The attributes live in event[2] + event[2].each {|n, v| event[2][n] = @parser.normalize(v)} + nsdecl = event[2].find_all { |n, value| n =~ /^xmlns(:|$)/ } + nsdecl.collect! { |n, value| [ n[6..-1], value ] } + @namespace_stack.push({}) + nsdecl.each do |n,v| + @namespace_stack[-1][n] = v + # notify observers of namespaces + procs.each { |ob| ob.call( n, v ) } if procs + listeners.each { |ob| ob.start_prefix_mapping(n, v) } if listeners + end + end + event[1] =~ Namespace::NAMESPLIT + prefix = $1 + local = $2 + uri = get_namespace(prefix) + # find the observers for start_element + procs = get_procs( :start_element, event[1] ) + listeners = get_listeners( :start_element, event[1] ) + # notify observers + procs.each { |ob| ob.call( uri, local, event[1], event[2] ) } if procs + listeners.each { |ob| + ob.start_element( uri, local, event[1], event[2] ) + } if listeners + when :end_element + @tag_stack.pop + event[1] =~ Namespace::NAMESPLIT + prefix = $1 + local = $2 + uri = get_namespace(prefix) + # find the observers for start_element + procs = get_procs( :end_element, event[1] ) + listeners = get_listeners( :end_element, event[1] ) + # notify observers + procs.each { |ob| ob.call( uri, local, event[1] ) } if procs + listeners.each { |ob| + ob.end_element( uri, local, event[1] ) + } if listeners + + namespace_mapping = @namespace_stack.pop + # find the observers for namespaces + procs = get_procs( :end_prefix_mapping, event[1] ) + listeners = get_listeners( :end_prefix_mapping, event[1] ) + if procs or listeners + namespace_mapping.each do |ns_prefix, ns_uri| + # notify observers of namespaces + procs.each { |ob| ob.call( ns_prefix ) } if procs + listeners.each { |ob| ob.end_prefix_mapping(ns_prefix) } if listeners + end + end + when :text + #normalized = @parser.normalize( event[1] ) + #handle( :characters, normalized ) + copy = event[1].clone + + esub = proc { |match| + if @entities.has_key?($1) + @entities[$1].gsub(Text::REFERENCE, &esub) + else + match + end + } + + copy.gsub!( Text::REFERENCE, &esub ) + copy.gsub!( Text::NUMERICENTITY ) {|m| + m=$1 + m = "0#{m}" if m[0] == ?x + [Integer(m)].pack('U*') + } + handle( :characters, copy ) + when :entitydecl + handle_entitydecl( event ) + when :processing_instruction, :comment, :attlistdecl, + :elementdecl, :cdata, :notationdecl, :xmldecl + handle( *event ) + end + handle( :progress, @parser.position ) + end + end + + private + def handle( symbol, *arguments ) + tag = @tag_stack[-1] + procs = get_procs( symbol, tag ) + listeners = get_listeners( symbol, tag ) + # notify observers + procs.each { |ob| ob.call( *arguments ) } if procs + listeners.each { |l| + l.send( symbol.to_s, *arguments ) + } if listeners + end + + def handle_entitydecl( event ) + @entities[ event[1] ] = event[2] if event.size == 3 + parameter_reference_p = false + case event[2] + when "SYSTEM" + if event.size == 5 + if event.last == "%" + parameter_reference_p = true + else + event[4, 0] = "NDATA" + end + end + when "PUBLIC" + if event.size == 6 + if event.last == "%" + parameter_reference_p = true + else + event[5, 0] = "NDATA" + end + end + else + parameter_reference_p = (event.size == 4) + end + event[1, 0] = event.pop if parameter_reference_p + handle( event[0], event[1..-1] ) + end + + # The following methods are duplicates, but it is faster than using + # a helper + def get_procs( symbol, name ) + return nil if @procs.size == 0 + @procs.find_all do |sym, match, block| + ( + (sym.nil? or symbol == sym) and + ((name.nil? and match.nil?) or match.nil? or ( + (name == match) or + (match.kind_of? Regexp and name =~ match) + ) + ) + ) + end.collect{|x| x[-1]} + end + def get_listeners( symbol, name ) + return nil if @listeners.size == 0 + @listeners.find_all do |sym, match, block| + ( + (sym.nil? or symbol == sym) and + ((name.nil? and match.nil?) or match.nil? or ( + (name == match) or + (match.kind_of? Regexp and name =~ match) + ) + ) + ) + end.collect{|x| x[-1]} + end + + def add( pair ) + if pair[-1].respond_to? :call + @procs << pair unless @procs.include? pair + else + @listeners << pair unless @listeners.include? pair + @has_listeners = true + end + end + + def get_namespace( prefix ) + uris = (@namespace_stack.find_all { |ns| not ns[prefix].nil? }) || + (@namespace_stack.find { |ns| not ns[nil].nil? }) + uris[-1][prefix] unless uris.nil? or 0 == uris.size + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/streamparser.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/streamparser.rb new file mode 100644 index 000000000000..9e0eb0b363c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/streamparser.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: false +require_relative "baseparser" + +module REXML + module Parsers + class StreamParser + def initialize source, listener + @listener = listener + @parser = BaseParser.new( source ) + @tag_stack = [] + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + def parse + # entity string + while true + event = @parser.pull + case event[0] + when :end_document + unless @tag_stack.empty? + tag_path = "/" + @tag_stack.join("/") + raise ParseException.new("Missing end tag for '#{tag_path}'", + @parser.source) + end + return + when :start_element + @tag_stack << event[1] + attrs = event[2].each do |n, v| + event[2][n] = @parser.unnormalize( v ) + end + @listener.tag_start( event[1], attrs ) + when :end_element + @listener.tag_end( event[1] ) + @tag_stack.pop + when :text + normalized = @parser.unnormalize( event[1] ) + @listener.text( normalized ) + when :processing_instruction + @listener.instruction( *event[1,2] ) + when :start_doctype + @listener.doctype( *event[1..-1] ) + when :end_doctype + # FIXME: remove this condition for milestone:3.2 + @listener.doctype_end if @listener.respond_to? :doctype_end + when :comment, :attlistdecl, :cdata, :xmldecl, :elementdecl + @listener.send( event[0].to_s, *event[1..-1] ) + when :entitydecl, :notationdecl + @listener.send( event[0].to_s, event[1..-1] ) + when :externalentity + entity_reference = event[1] + content = entity_reference.gsub(/\A%|;\z/, "") + @listener.entity(content) + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/treeparser.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/treeparser.rb new file mode 100644 index 000000000000..bf9a42545b80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/treeparser.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: false +require_relative '../validation/validationexception' +require_relative '../undefinednamespaceexception' + +module REXML + module Parsers + class TreeParser + def initialize( source, build_context = Document.new ) + @build_context = build_context + @parser = Parsers::BaseParser.new( source ) + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + def parse + tag_stack = [] + in_doctype = false + entities = nil + begin + while true + event = @parser.pull + #STDERR.puts "TREEPARSER GOT #{event.inspect}" + case event[0] + when :end_document + unless tag_stack.empty? + raise ParseException.new("No close tag for #{@build_context.xpath}", + @parser.source, @parser) + end + return + when :start_element + tag_stack.push(event[1]) + el = @build_context = @build_context.add_element( event[1] ) + event[2].each do |key, value| + el.attributes[key]=Attribute.new(key,value,self) + end + when :end_element + tag_stack.pop + @build_context = @build_context.parent + when :text + if not in_doctype + if @build_context[-1].instance_of? Text + @build_context[-1] << event[1] + else + @build_context.add( + Text.new(event[1], @build_context.whitespace, nil, true) + ) unless ( + @build_context.ignore_whitespace_nodes and + event[1].strip.size==0 + ) + end + end + when :comment + c = Comment.new( event[1] ) + @build_context.add( c ) + when :cdata + c = CData.new( event[1] ) + @build_context.add( c ) + when :processing_instruction + @build_context.add( Instruction.new( event[1], event[2] ) ) + when :end_doctype + in_doctype = false + entities.each { |k,v| entities[k] = @build_context.entities[k].value } + @build_context = @build_context.parent + when :start_doctype + doctype = DocType.new( event[1..-1], @build_context ) + @build_context = doctype + entities = {} + in_doctype = true + when :attlistdecl + n = AttlistDecl.new( event[1..-1] ) + @build_context.add( n ) + when :externalentity + n = ExternalEntity.new( event[1] ) + @build_context.add( n ) + when :elementdecl + n = ElementDecl.new( event[1] ) + @build_context.add(n) + when :entitydecl + entities[ event[1] ] = event[2] unless event[2] =~ /PUBLIC|SYSTEM/ + @build_context.add(Entity.new(event)) + when :notationdecl + n = NotationDecl.new( *event[1..-1] ) + @build_context.add( n ) + when :xmldecl + x = XMLDecl.new( event[1], event[2], event[3] ) + @build_context.add( x ) + end + end + rescue REXML::Validation::ValidationException + raise + rescue REXML::ParseException + raise + rescue + raise ParseException.new( $!.message, @parser.source, @parser, $! ) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/ultralightparser.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/ultralightparser.rb new file mode 100644 index 000000000000..e0029f43da53 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/ultralightparser.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: false +require_relative 'streamparser' +require_relative 'baseparser' + +module REXML + module Parsers + class UltraLightParser + def initialize stream + @stream = stream + @parser = REXML::Parsers::BaseParser.new( stream ) + end + + def add_listener( listener ) + @parser.add_listener( listener ) + end + + def rewind + @stream.rewind + @parser.stream = @stream + end + + def parse + root = context = [] + while true + event = @parser.pull + case event[0] + when :end_document + break + when :end_doctype + context = context[1] + when :start_element, :start_doctype + context << event + event[1,0] = [context] + context = event + when :end_element + context = context[1] + else + context << event + end + end + root + end + end + + # An element is an array. The array contains: + # 0 The parent element + # 1 The tag name + # 2 A hash of attributes + # 3..-1 The child elements + # An element is an array of size > 3 + # Text is a String + # PIs are [ :processing_instruction, target, data ] + # Comments are [ :comment, data ] + # DocTypes are DocType structs + # The root is an array with XMLDecls, Text, DocType, Array, Text + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/xpathparser.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/xpathparser.rb new file mode 100644 index 000000000000..d92678fead2c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/xpathparser.rb @@ -0,0 +1,689 @@ +# frozen_string_literal: false +require_relative '../namespace' +require_relative '../xmltokens' + +module REXML + module Parsers + # You don't want to use this class. Really. Use XPath, which is a wrapper + # for this class. Believe me. You don't want to poke around in here. + # There is strange, dark magic at work in this code. Beware. Go back! Go + # back while you still can! + class XPathParser + include XMLTokens + LITERAL = /^'([^']*)'|^"([^"]*)"/u + + def namespaces=( namespaces ) + Functions::namespace_context = namespaces + @namespaces = namespaces + end + + def parse path + path = path.dup + path.gsub!(/([\(\[])\s+/, '\1') # Strip ignorable spaces + path.gsub!( /\s+([\]\)])/, '\1') + parsed = [] + rest = OrExpr(path, parsed) + if rest + unless rest.strip.empty? + raise ParseException.new("Garbage component exists at the end: " + + "<#{rest}>: <#{path}>") + end + end + parsed + end + + def predicate path + parsed = [] + Predicate( "[#{path}]", parsed ) + parsed + end + + def abbreviate( path ) + path = path.kind_of?(String) ? parse( path ) : path + string = "" + document = false + while path.size > 0 + op = path.shift + case op + when :node + when :attribute + string << "/" if string.size > 0 + string << "@" + when :child + string << "/" if string.size > 0 + when :descendant_or_self + string << "/" + when :self + string << "." + when :parent + string << ".." + when :any + string << "*" + when :text + string << "text()" + when :following, :following_sibling, + :ancestor, :ancestor_or_self, :descendant, + :namespace, :preceding, :preceding_sibling + string << "/" unless string.size == 0 + string << op.to_s.tr("_", "-") + string << "::" + when :qname + prefix = path.shift + name = path.shift + string << prefix+":" if prefix.size > 0 + string << name + when :predicate + string << '[' + string << predicate_to_string( path.shift ) {|x| abbreviate( x ) } + string << ']' + when :document + document = true + when :function + string << path.shift + string << "( " + string << predicate_to_string( path.shift[0] ) {|x| abbreviate( x )} + string << " )" + when :literal + string << %Q{ "#{path.shift}" } + else + string << "/" unless string.size == 0 + string << "UNKNOWN(" + string << op.inspect + string << ")" + end + end + string = "/"+string if document + return string + end + + def expand( path ) + path = path.kind_of?(String) ? parse( path ) : path + string = "" + document = false + while path.size > 0 + op = path.shift + case op + when :node + string << "node()" + when :attribute, :child, :following, :following_sibling, + :ancestor, :ancestor_or_self, :descendant, :descendant_or_self, + :namespace, :preceding, :preceding_sibling, :self, :parent + string << "/" unless string.size == 0 + string << op.to_s.tr("_", "-") + string << "::" + when :any + string << "*" + when :qname + prefix = path.shift + name = path.shift + string << prefix+":" if prefix.size > 0 + string << name + when :predicate + string << '[' + string << predicate_to_string( path.shift ) { |x| expand(x) } + string << ']' + when :document + document = true + else + string << "/" unless string.size == 0 + string << "UNKNOWN(" + string << op.inspect + string << ")" + end + end + string = "/"+string if document + return string + end + + def predicate_to_string( path, &block ) + string = "" + case path[0] + when :and, :or, :mult, :plus, :minus, :neq, :eq, :lt, :gt, :lteq, :gteq, :div, :mod, :union + op = path.shift + case op + when :eq + op = "=" + when :lt + op = "<" + when :gt + op = ">" + when :lteq + op = "<=" + when :gteq + op = ">=" + when :neq + op = "!=" + when :union + op = "|" + end + left = predicate_to_string( path.shift, &block ) + right = predicate_to_string( path.shift, &block ) + string << " " + string << left + string << " " + string << op.to_s + string << " " + string << right + string << " " + when :function + path.shift + name = path.shift + string << name + string << "( " + string << predicate_to_string( path.shift, &block ) + string << " )" + when :literal + path.shift + string << " " + string << path.shift.inspect + string << " " + else + string << " " + string << yield( path ) + string << " " + end + return string.squeeze(" ") + end + + private + #LocationPath + # | RelativeLocationPath + # | '/' RelativeLocationPath? + # | '//' RelativeLocationPath + def LocationPath path, parsed + path = path.lstrip + if path[0] == ?/ + parsed << :document + if path[1] == ?/ + parsed << :descendant_or_self + parsed << :node + path = path[2..-1] + else + path = path[1..-1] + end + end + return RelativeLocationPath( path, parsed ) if path.size > 0 + end + + #RelativeLocationPath + # | Step + # | (AXIS_NAME '::' | '@' | '') AxisSpecifier + # NodeTest + # Predicate + # | '.' | '..' AbbreviatedStep + # | RelativeLocationPath '/' Step + # | RelativeLocationPath '//' Step + AXIS = /^(ancestor|ancestor-or-self|attribute|child|descendant|descendant-or-self|following|following-sibling|namespace|parent|preceding|preceding-sibling|self)::/ + def RelativeLocationPath path, parsed + loop do + original_path = path + path = path.lstrip + + return original_path if path.empty? + + # (axis or @ or <child::>) nodetest predicate > + # OR > / Step + # (. or ..) > + if path[0] == ?. + if path[1] == ?. + parsed << :parent + parsed << :node + path = path[2..-1] + else + parsed << :self + parsed << :node + path = path[1..-1] + end + else + path_before_axis_specifier = path + parsed_not_abberviated = [] + if path[0] == ?@ + parsed_not_abberviated << :attribute + path = path[1..-1] + # Goto Nodetest + elsif path =~ AXIS + parsed_not_abberviated << $1.tr('-','_').intern + path = $' + # Goto Nodetest + else + parsed_not_abberviated << :child + end + + path_before_node_test = path + path = NodeTest(path, parsed_not_abberviated) + if path == path_before_node_test + return path_before_axis_specifier + end + path = Predicate(path, parsed_not_abberviated) + + parsed.concat(parsed_not_abberviated) + end + + original_path = path + path = path.lstrip + return original_path if path.empty? + + return original_path if path[0] != ?/ + + if path[1] == ?/ + parsed << :descendant_or_self + parsed << :node + path = path[2..-1] + else + path = path[1..-1] + end + end + end + + # Returns a 1-1 map of the nodeset + # The contents of the resulting array are either: + # true/false, if a positive match + # String, if a name match + #NodeTest + # | ('*' | NCNAME ':' '*' | QNAME) NameTest + # | '*' ':' NCNAME NameTest since XPath 2.0 + # | NODE_TYPE '(' ')' NodeType + # | PI '(' LITERAL ')' PI + # | '[' expr ']' Predicate + PREFIX_WILDCARD = /^\*:(#{NCNAME_STR})/u + LOCAL_NAME_WILDCARD = /^(#{NCNAME_STR}):\*/u + QNAME = Namespace::NAMESPLIT + NODE_TYPE = /^(comment|text|node)\(\s*\)/m + PI = /^processing-instruction\(/ + def NodeTest path, parsed + original_path = path + path = path.lstrip + case path + when PREFIX_WILDCARD + prefix = nil + name = $1 + path = $' + parsed << :qname + parsed << prefix + parsed << name + when /^\*/ + path = $' + parsed << :any + when NODE_TYPE + type = $1 + path = $' + parsed << type.tr('-', '_').intern + when PI + path = $' + literal = nil + if path =~ /^\s*\)/ + path = $' + else + path =~ LITERAL + literal = $1 + path = $' + raise ParseException.new("Missing ')' after processing instruction") if path[0] != ?) + path = path[1..-1] + end + parsed << :processing_instruction + parsed << (literal || '') + when LOCAL_NAME_WILDCARD + prefix = $1 + path = $' + parsed << :namespace + parsed << prefix + when QNAME + prefix = $1 + name = $2 + path = $' + prefix = "" unless prefix + parsed << :qname + parsed << prefix + parsed << name + else + path = original_path + end + return path + end + + # Filters the supplied nodeset on the predicate(s) + def Predicate path, parsed + original_path = path + path = path.lstrip + return original_path unless path[0] == ?[ + predicates = [] + while path[0] == ?[ + path, expr = get_group(path) + predicates << expr[1..-2] if expr + end + predicates.each{ |pred| + preds = [] + parsed << :predicate + parsed << preds + OrExpr(pred, preds) + } + path + end + + # The following return arrays of true/false, a 1-1 mapping of the + # supplied nodeset, except for axe(), which returns a filtered + # nodeset + + #| OrExpr S 'or' S AndExpr + #| AndExpr + def OrExpr path, parsed + n = [] + rest = AndExpr( path, n ) + if rest != path + while rest =~ /^\s*( or )/ + n = [ :or, n, [] ] + rest = AndExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| AndExpr S 'and' S EqualityExpr + #| EqualityExpr + def AndExpr path, parsed + n = [] + rest = EqualityExpr( path, n ) + if rest != path + while rest =~ /^\s*( and )/ + n = [ :and, n, [] ] + rest = EqualityExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| EqualityExpr ('=' | '!=') RelationalExpr + #| RelationalExpr + def EqualityExpr path, parsed + n = [] + rest = RelationalExpr( path, n ) + if rest != path + while rest =~ /^\s*(!?=)\s*/ + if $1[0] == ?! + n = [ :neq, n, [] ] + else + n = [ :eq, n, [] ] + end + rest = RelationalExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| RelationalExpr ('<' | '>' | '<=' | '>=') AdditiveExpr + #| AdditiveExpr + def RelationalExpr path, parsed + n = [] + rest = AdditiveExpr( path, n ) + if rest != path + while rest =~ /^\s*([<>]=?)\s*/ + if $1[0] == ?< + sym = "lt" + else + sym = "gt" + end + sym << "eq" if $1[-1] == ?= + n = [ sym.intern, n, [] ] + rest = AdditiveExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| AdditiveExpr ('+' | '-') MultiplicativeExpr + #| MultiplicativeExpr + def AdditiveExpr path, parsed + n = [] + rest = MultiplicativeExpr( path, n ) + if rest != path + while rest =~ /^\s*(\+|-)\s*/ + if $1[0] == ?+ + n = [ :plus, n, [] ] + else + n = [ :minus, n, [] ] + end + rest = MultiplicativeExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| MultiplicativeExpr ('*' | S ('div' | 'mod') S) UnaryExpr + #| UnaryExpr + def MultiplicativeExpr path, parsed + n = [] + rest = UnaryExpr( path, n ) + if rest != path + while rest =~ /^\s*(\*| div | mod )\s*/ + if $1[0] == ?* + n = [ :mult, n, [] ] + elsif $1.include?( "div" ) + n = [ :div, n, [] ] + else + n = [ :mod, n, [] ] + end + rest = UnaryExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace(n) + elsif n.size > 0 + parsed << n + end + rest + end + + #| '-' UnaryExpr + #| UnionExpr + def UnaryExpr path, parsed + path =~ /^(\-*)/ + path = $' + if $1 and (($1.size % 2) != 0) + mult = -1 + else + mult = 1 + end + parsed << :neg if mult < 0 + + n = [] + path = UnionExpr( path, n ) + parsed.concat( n ) + path + end + + #| UnionExpr '|' PathExpr + #| PathExpr + def UnionExpr path, parsed + n = [] + rest = PathExpr( path, n ) + if rest != path + while rest =~ /^\s*(\|)\s*/ + n = [ :union, n, [] ] + rest = PathExpr( $', n[-1] ) + end + end + if parsed.size == 0 and n.size != 0 + parsed.replace( n ) + elsif n.size > 0 + parsed << n + end + rest + end + + #| LocationPath + #| FilterExpr ('/' | '//') RelativeLocationPath + def PathExpr path, parsed + path = path.lstrip + n = [] + rest = FilterExpr( path, n ) + if rest != path + if rest and rest[0] == ?/ + rest = RelativeLocationPath(rest, n) + parsed.concat(n) + return rest + end + end + rest = LocationPath(rest, n) if rest =~ /\A[\/\.\@\[\w*]/ + parsed.concat(n) + return rest + end + + #| FilterExpr Predicate + #| PrimaryExpr + def FilterExpr path, parsed + n = [] + path_before_primary_expr = path + path = PrimaryExpr(path, n) + return path_before_primary_expr if path == path_before_primary_expr + path = Predicate(path, n) + parsed.concat(n) + path + end + + #| VARIABLE_REFERENCE + #| '(' expr ')' + #| LITERAL + #| NUMBER + #| FunctionCall + VARIABLE_REFERENCE = /^\$(#{NAME_STR})/u + NUMBER = /^(\d*\.?\d+)/ + NT = /^comment|text|processing-instruction|node$/ + def PrimaryExpr path, parsed + case path + when VARIABLE_REFERENCE + varname = $1 + path = $' + parsed << :variable + parsed << varname + #arry << @variables[ varname ] + when /^(\w[-\w]*)(?:\()/ + fname = $1 + tmp = $' + return path if fname =~ NT + path = tmp + parsed << :function + parsed << fname + path = FunctionCall(path, parsed) + when NUMBER + varname = $1.nil? ? $2 : $1 + path = $' + parsed << :literal + parsed << (varname.include?('.') ? varname.to_f : varname.to_i) + when LITERAL + varname = $1.nil? ? $2 : $1 + path = $' + parsed << :literal + parsed << varname + when /^\(/ #/ + path, contents = get_group(path) + contents = contents[1..-2] + n = [] + OrExpr( contents, n ) + parsed.concat(n) + end + path + end + + #| FUNCTION_NAME '(' ( expr ( ',' expr )* )? ')' + def FunctionCall rest, parsed + path, arguments = parse_args(rest) + argset = [] + for argument in arguments + args = [] + OrExpr( argument, args ) + argset << args + end + parsed << argset + path + end + + # get_group( '[foo]bar' ) -> ['bar', '[foo]'] + def get_group string + ind = 0 + depth = 0 + st = string[0,1] + en = (st == "(" ? ")" : "]") + begin + case string[ind,1] + when st + depth += 1 + when en + depth -= 1 + end + ind += 1 + end while depth > 0 and ind < string.length + return nil unless depth==0 + [string[ind..-1], string[0..ind-1]] + end + + def parse_args( string ) + arguments = [] + ind = 0 + inquot = false + inapos = false + depth = 1 + begin + case string[ind] + when ?" + inquot = !inquot unless inapos + when ?' + inapos = !inapos unless inquot + else + unless inquot or inapos + case string[ind] + when ?( + depth += 1 + if depth == 1 + string = string[1..-1] + ind -= 1 + end + when ?) + depth -= 1 + if depth == 0 + s = string[0,ind].strip + arguments << s unless s == "" + string = string[ind+1..-1] + end + when ?, + if depth == 1 + s = string[0,ind].strip + arguments << s unless s == "" + string = string[ind+1..-1] + ind = -1 + end + end + end + end + ind += 1 + end while depth > 0 and ind < string.length + return nil unless depth==0 + [string,arguments] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/quickpath.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/quickpath.rb new file mode 100644 index 000000000000..a0466b25d9b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/quickpath.rb @@ -0,0 +1,266 @@ +# frozen_string_literal: false +require_relative 'functions' +require_relative 'xmltokens' + +module REXML + class QuickPath + include Functions + include XMLTokens + + # A base Hash object to be used when initializing a + # default empty namespaces set. + EMPTY_HASH = {} + + def QuickPath::first element, path, namespaces=EMPTY_HASH + match(element, path, namespaces)[0] + end + + def QuickPath::each element, path, namespaces=EMPTY_HASH, &block + path = "*" unless path + match(element, path, namespaces).each( &block ) + end + + def QuickPath::match element, path, namespaces=EMPTY_HASH + raise "nil is not a valid xpath" unless path + results = nil + Functions::namespace_context = namespaces + case path + when /^\/([^\/]|$)/u + # match on root + path = path[1..-1] + return [element.root.parent] if path == '' + results = filter([element.root], path) + when /^[-\w]*::/u + results = filter([element], path) + when /^\*/u + results = filter(element.to_a, path) + when /^[\[!\w:]/u + # match on child + children = element.to_a + results = filter(children, path) + else + results = filter([element], path) + end + return results + end + + # Given an array of nodes it filters the array based on the path. The + # result is that when this method returns, the array will contain elements + # which match the path + def QuickPath::filter elements, path + return elements if path.nil? or path == '' or elements.size == 0 + case path + when /^\/\//u # Descendant + return axe( elements, "descendant-or-self", $' ) + when /^\/?\b(\w[-\w]*)\b::/u # Axe + return axe( elements, $1, $' ) + when /^\/(?=\b([:!\w][-\.\w]*:)?[-!\*\.\w]*\b([^:(]|$)|\*)/u # Child + rest = $' + results = [] + elements.each do |element| + results |= filter( element.to_a, rest ) + end + return results + when /^\/?(\w[-\w]*)\(/u # / Function + return function( elements, $1, $' ) + when Namespace::NAMESPLIT # Element name + name = $2 + ns = $1 + rest = $' + elements.delete_if do |element| + !(element.kind_of? Element and + (element.expanded_name == name or + (element.name == name and + element.namespace == Functions.namespace_context[ns]))) + end + return filter( elements, rest ) + when /^\/\[/u + matches = [] + elements.each do |element| + matches |= predicate( element.to_a, path[1..-1] ) if element.kind_of? Element + end + return matches + when /^\[/u # Predicate + return predicate( elements, path ) + when /^\/?\.\.\./u # Ancestor + return axe( elements, "ancestor", $' ) + when /^\/?\.\./u # Parent + return filter( elements.collect{|e|e.parent}, $' ) + when /^\/?\./u # Self + return filter( elements, $' ) + when /^\*/u # Any + results = [] + elements.each do |element| + results |= filter( [element], $' ) if element.kind_of? Element + #if element.kind_of? Element + # children = element.to_a + # children.delete_if { |child| !child.kind_of?(Element) } + # results |= filter( children, $' ) + #end + end + return results + end + return [] + end + + def QuickPath::axe( elements, axe_name, rest ) + matches = [] + matches = filter( elements.dup, rest ) if axe_name =~ /-or-self$/u + case axe_name + when /^descendant/u + elements.each do |element| + matches |= filter( element.to_a, "descendant-or-self::#{rest}" ) if element.kind_of? Element + end + when /^ancestor/u + elements.each do |element| + while element.parent + matches << element.parent + element = element.parent + end + end + matches = filter( matches, rest ) + when "self" + matches = filter( elements, rest ) + when "child" + elements.each do |element| + matches |= filter( element.to_a, rest ) if element.kind_of? Element + end + when "attribute" + elements.each do |element| + matches << element.attributes[ rest ] if element.kind_of? Element + end + when "parent" + matches = filter(elements.collect{|element| element.parent}.uniq, rest) + when "following-sibling" + matches = filter(elements.collect{|element| element.next_sibling}.uniq, + rest) + when "previous-sibling" + matches = filter(elements.collect{|element| + element.previous_sibling}.uniq, rest ) + end + return matches.uniq + end + + OPERAND_ = '((?=(?:(?!and|or).)*[^\s<>=])[^\s<>=]+)' + # A predicate filters a node-set with respect to an axis to produce a + # new node-set. For each node in the node-set to be filtered, the + # PredicateExpr is evaluated with that node as the context node, with + # the number of nodes in the node-set as the context size, and with the + # proximity position of the node in the node-set with respect to the + # axis as the context position; if PredicateExpr evaluates to true for + # that node, the node is included in the new node-set; otherwise, it is + # not included. + # + # A PredicateExpr is evaluated by evaluating the Expr and converting + # the result to a boolean. If the result is a number, the result will + # be converted to true if the number is equal to the context position + # and will be converted to false otherwise; if the result is not a + # number, then the result will be converted as if by a call to the + # boolean function. Thus a location path para[3] is equivalent to + # para[position()=3]. + def QuickPath::predicate( elements, path ) + ind = 1 + bcount = 1 + while bcount > 0 + bcount += 1 if path[ind] == ?[ + bcount -= 1 if path[ind] == ?] + ind += 1 + end + ind -= 1 + predicate = path[1..ind-1] + rest = path[ind+1..-1] + + # have to change 'a [=<>] b [=<>] c' into 'a [=<>] b and b [=<>] c' + # + predicate.gsub!( + /#{OPERAND_}\s*([<>=])\s*#{OPERAND_}\s*([<>=])\s*#{OPERAND_}/u, + '\1 \2 \3 and \3 \4 \5' ) + # Let's do some Ruby trickery to avoid some work: + predicate.gsub!( /&/u, "&&" ) + predicate.gsub!( /=/u, "==" ) + predicate.gsub!( /@(\w[-\w.]*)/u, 'attribute("\1")' ) + predicate.gsub!( /\bmod\b/u, "%" ) + predicate.gsub!( /\b(\w[-\w.]*\()/u ) { + fname = $1 + fname.gsub( /-/u, "_" ) + } + + Functions.pair = [ 0, elements.size ] + results = [] + elements.each do |element| + Functions.pair[0] += 1 + Functions.node = element + res = eval( predicate ) + case res + when true + results << element + when Integer + results << element if Functions.pair[0] == res + when String + results << element + end + end + return filter( results, rest ) + end + + def QuickPath::attribute( name ) + return Functions.node.attributes[name] if Functions.node.kind_of? Element + end + + def QuickPath::name() + return Functions.node.name if Functions.node.kind_of? Element + end + + def QuickPath::method_missing( id, *args ) + begin + Functions.send( id.id2name, *args ) + rescue Exception + raise "METHOD: #{id.id2name}(#{args.join ', '})\n#{$!.message}" + end + end + + def QuickPath::function( elements, fname, rest ) + args = parse_args( elements, rest ) + Functions.pair = [0, elements.size] + results = [] + elements.each do |element| + Functions.pair[0] += 1 + Functions.node = element + res = Functions.send( fname, *args ) + case res + when true + results << element + when Integer + results << element if Functions.pair[0] == res + end + end + return results + end + + def QuickPath::parse_args( element, string ) + # /.*?(?:\)|,)/ + arguments = [] + buffer = "" + while string and string != "" + c = string[0] + string.sub!(/^./u, "") + case c + when ?, + # if depth = 1, then we start a new argument + arguments << evaluate( buffer ) + #arguments << evaluate( string[0..count] ) + when ?( + # start a new method call + function( element, buffer, string ) + buffer = "" + when ?) + # close the method call and return arguments + return arguments + else + buffer << c + end + end + "" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/rexml.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/rexml.rb new file mode 100644 index 000000000000..8a01f0e124d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/rexml.rb @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# frozen_string_literal: false +# +# \Module \REXML provides classes and methods for parsing, +# editing, and generating XML. +# +# == Implementation +# +# \REXML: +# - Is pure Ruby. +# - Provides tree, stream, SAX2, pull, and lightweight APIs. +# - Conforms to {XML version 1.0}[https://www.w3.org/TR/REC-xml/]. +# - Fully implements {XPath version 1.0}[http://www.w3c.org/tr/xpath]. +# - Is {non-validating}[https://www.w3.org/TR/xml/]. +# - Passes 100% of the non-validating {Oasis tests}[http://www.oasis-open.org/committees/xml-conformance/xml-test-suite.shtml]. +# +# == In a Hurry? +# +# If you're somewhat familiar with XML +# and have a particular task in mind, +# you may want to see {the tasks pages}[doc/rexml/tasks/tocs/master_toc_rdoc.html]. +# +# == API +# +# Among the most important classes for using \REXML are: +# - REXML::Document. +# - REXML::Element. +# +module REXML + COPYRIGHT = "Copyright © 2001-2008 Sean Russell <ser@germane-software.com>" + DATE = "2008/019" + VERSION = "3.2.5" + REVISION = "" + + Copyright = COPYRIGHT + Version = VERSION +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/sax2listener.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/sax2listener.rb new file mode 100644 index 000000000000..5afdc80890e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/sax2listener.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: false +module REXML + # A template for stream parser listeners. + # Note that the declarations (attlistdecl, elementdecl, etc) are trivially + # processed; REXML doesn't yet handle doctype entity declarations, so you + # have to parse them out yourself. + # === Missing methods from SAX2 + # ignorable_whitespace + # === Methods extending SAX2 + # +WARNING+ + # These methods are certainly going to change, until DTDs are fully + # supported. Be aware of this. + # start_document + # end_document + # doctype + # elementdecl + # attlistdecl + # entitydecl + # notationdecl + # cdata + # xmldecl + # comment + module SAX2Listener + def start_document + end + def end_document + end + def start_prefix_mapping prefix, uri + end + def end_prefix_mapping prefix + end + def start_element uri, localname, qname, attributes + end + def end_element uri, localname, qname + end + def characters text + end + def processing_instruction target, data + end + # Handles a doctype declaration. Any attributes of the doctype which are + # not supplied will be nil. # EG, <!DOCTYPE me PUBLIC "foo" "bar"> + # @p name the name of the doctype; EG, "me" + # @p pub_sys "PUBLIC", "SYSTEM", or nil. EG, "PUBLIC" + # @p long_name the supplied long name, or nil. EG, "foo" + # @p uri the uri of the doctype, or nil. EG, "bar" + def doctype name, pub_sys, long_name, uri + end + # If a doctype includes an ATTLIST declaration, it will cause this + # method to be called. The content is the declaration itself, unparsed. + # EG, <!ATTLIST el attr CDATA #REQUIRED> will come to this method as "el + # attr CDATA #REQUIRED". This is the same for all of the .*decl + # methods. + def attlistdecl(element, pairs, contents) + end + # <!ELEMENT ...> + def elementdecl content + end + # <!ENTITY ...> + # The argument passed to this method is an array of the entity + # declaration. It can be in a number of formats, but in general it + # returns (example, result): + # <!ENTITY % YN '"Yes"'> + # ["%", "YN", "\"Yes\""] + # <!ENTITY % YN 'Yes'> + # ["%", "YN", "Yes"] + # <!ENTITY WhatHeSaid "He said %YN;"> + # ["WhatHeSaid", "He said %YN;"] + # <!ENTITY open-hatch SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml"> + # ["open-hatch", "SYSTEM", "http://www.textuality.com/boilerplate/OpenHatch.xml"] + # <!ENTITY open-hatch PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN" "http://www.textuality.com/boilerplate/OpenHatch.xml"> + # ["open-hatch", "PUBLIC", "-//Textuality//TEXT Standard open-hatch boilerplate//EN", "http://www.textuality.com/boilerplate/OpenHatch.xml"] + # <!ENTITY hatch-pic SYSTEM "../grafix/OpenHatch.gif" NDATA gif> + # ["hatch-pic", "SYSTEM", "../grafix/OpenHatch.gif", "NDATA", "gif"] + def entitydecl declaration + end + # <!NOTATION ...> + def notationdecl name, public_or_system, public_id, system_id + end + # Called when <![CDATA[ ... ]]> is encountered in a document. + # @p content "..." + def cdata content + end + # Called when an XML PI is encountered in the document. + # EG: <?xml version="1.0" encoding="utf"?> + # @p version the version attribute value. EG, "1.0" + # @p encoding the encoding attribute value, or nil. EG, "utf" + # @p standalone the standalone attribute value, or nil. EG, nil + # @p spaced the declaration is followed by a line break + def xmldecl version, encoding, standalone + end + # Called when a comment is encountered. + # @p comment The content of the comment + def comment comment + end + def progress position + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/security.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/security.rb new file mode 100644 index 000000000000..99b74607728b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/security.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: false +module REXML + module Security + @@entity_expansion_limit = 10_000 + + # Set the entity expansion limit. By default the limit is set to 10000. + def self.entity_expansion_limit=( val ) + @@entity_expansion_limit = val + end + + # Get the entity expansion limit. By default the limit is set to 10000. + def self.entity_expansion_limit + return @@entity_expansion_limit + end + + @@entity_expansion_text_limit = 10_240 + + # Set the entity expansion limit. By default the limit is set to 10240. + def self.entity_expansion_text_limit=( val ) + @@entity_expansion_text_limit = val + end + + # Get the entity expansion limit. By default the limit is set to 10240. + def self.entity_expansion_text_limit + return @@entity_expansion_text_limit + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/source.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/source.rb new file mode 100644 index 000000000000..90b370b989d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/source.rb @@ -0,0 +1,298 @@ +# coding: US-ASCII +# frozen_string_literal: false +require_relative 'encoding' + +module REXML + # Generates Source-s. USE THIS CLASS. + class SourceFactory + # Generates a Source object + # @param arg Either a String, or an IO + # @return a Source, or nil if a bad argument was given + def SourceFactory::create_from(arg) + if arg.respond_to? :read and + arg.respond_to? :readline and + arg.respond_to? :nil? and + arg.respond_to? :eof? + IOSource.new(arg) + elsif arg.respond_to? :to_str + require 'stringio' + IOSource.new(StringIO.new(arg)) + elsif arg.kind_of? Source + arg + else + raise "#{arg.class} is not a valid input stream. It must walk \n"+ + "like either a String, an IO, or a Source." + end + end + end + + # A Source can be searched for patterns, and wraps buffers and other + # objects and provides consumption of text + class Source + include Encoding + # The current buffer (what we're going to read next) + attr_reader :buffer + # The line number of the last consumed text + attr_reader :line + attr_reader :encoding + + # Constructor + # @param arg must be a String, and should be a valid XML document + # @param encoding if non-null, sets the encoding of the source to this + # value, overriding all encoding detection + def initialize(arg, encoding=nil) + @orig = @buffer = arg + if encoding + self.encoding = encoding + else + detect_encoding + end + @line = 0 + end + + + # Inherited from Encoding + # Overridden to support optimized en/decoding + def encoding=(enc) + return unless super + encoding_updated + end + + # Scans the source for a given pattern. Note, that this is not your + # usual scan() method. For one thing, the pattern argument has some + # requirements; for another, the source can be consumed. You can easily + # confuse this method. Originally, the patterns were easier + # to construct and this method more robust, because this method + # generated search regexps on the fly; however, this was + # computationally expensive and slowed down the entire REXML package + # considerably, since this is by far the most commonly called method. + # @param pattern must be a Regexp, and must be in the form of + # /^\s*(#{your pattern, with no groups})(.*)/. The first group + # will be returned; the second group is used if the consume flag is + # set. + # @param consume if true, the pattern returned will be consumed, leaving + # everything after it in the Source. + # @return the pattern, if found, or nil if the Source is empty or the + # pattern is not found. + def scan(pattern, cons=false) + return nil if @buffer.nil? + rv = @buffer.scan(pattern) + @buffer = $' if cons and rv.size>0 + rv + end + + def read + end + + def consume( pattern ) + @buffer = $' if pattern.match( @buffer ) + end + + def match_to( char, pattern ) + return pattern.match(@buffer) + end + + def match_to_consume( char, pattern ) + md = pattern.match(@buffer) + @buffer = $' + return md + end + + def match(pattern, cons=false) + md = pattern.match(@buffer) + @buffer = $' if cons and md + return md + end + + # @return true if the Source is exhausted + def empty? + @buffer == "" + end + + def position + @orig.index( @buffer ) + end + + # @return the current line in the source + def current_line + lines = @orig.split + res = lines.grep @buffer[0..30] + res = res[-1] if res.kind_of? Array + lines.index( res ) if res + end + + private + def detect_encoding + buffer_encoding = @buffer.encoding + detected_encoding = "UTF-8" + begin + @buffer.force_encoding("ASCII-8BIT") + if @buffer[0, 2] == "\xfe\xff" + @buffer[0, 2] = "" + detected_encoding = "UTF-16BE" + elsif @buffer[0, 2] == "\xff\xfe" + @buffer[0, 2] = "" + detected_encoding = "UTF-16LE" + elsif @buffer[0, 3] == "\xef\xbb\xbf" + @buffer[0, 3] = "" + detected_encoding = "UTF-8" + end + ensure + @buffer.force_encoding(buffer_encoding) + end + self.encoding = detected_encoding + end + + def encoding_updated + if @encoding != 'UTF-8' + @buffer = decode(@buffer) + @to_utf = true + else + @to_utf = false + @buffer.force_encoding ::Encoding::UTF_8 + end + end + end + + # A Source that wraps an IO. See the Source class for method + # documentation + class IOSource < Source + #attr_reader :block_size + + # block_size has been deprecated + def initialize(arg, block_size=500, encoding=nil) + @er_source = @source = arg + @to_utf = false + @pending_buffer = nil + + if encoding + super("", encoding) + else + super(@source.read(3) || "") + end + + if !@to_utf and + @buffer.respond_to?(:force_encoding) and + @source.respond_to?(:external_encoding) and + @source.external_encoding != ::Encoding::UTF_8 + @force_utf8 = true + else + @force_utf8 = false + end + end + + def scan(pattern, cons=false) + rv = super + # You'll notice that this next section is very similar to the same + # section in match(), but just a liiittle different. This is + # because it is a touch faster to do it this way with scan() + # than the way match() does it; enough faster to warrant duplicating + # some code + if rv.size == 0 + until @buffer =~ pattern or @source.nil? + begin + @buffer << readline + rescue Iconv::IllegalSequence + raise + rescue + @source = nil + end + end + rv = super + end + rv.taint if RUBY_VERSION < '2.7' + rv + end + + def read + begin + @buffer << readline + rescue Exception, NameError + @source = nil + end + end + + def consume( pattern ) + match( pattern, true ) + end + + def match( pattern, cons=false ) + rv = pattern.match(@buffer) + @buffer = $' if cons and rv + while !rv and @source + begin + @buffer << readline + rv = pattern.match(@buffer) + @buffer = $' if cons and rv + rescue + @source = nil + end + end + rv.taint if RUBY_VERSION < '2.7' + rv + end + + def empty? + super and ( @source.nil? || @source.eof? ) + end + + def position + @er_source.pos rescue 0 + end + + # @return the current line in the source + def current_line + begin + pos = @er_source.pos # The byte position in the source + lineno = @er_source.lineno # The XML < position in the source + @er_source.rewind + line = 0 # The \r\n position in the source + begin + while @er_source.pos < pos + @er_source.readline + line += 1 + end + rescue + end + @er_source.seek(pos) + rescue IOError + pos = -1 + line = -1 + end + [pos, lineno, line] + end + + private + def readline + str = @source.readline(@line_break) + if @pending_buffer + if str.nil? + str = @pending_buffer + else + str = @pending_buffer + str + end + @pending_buffer = nil + end + return nil if str.nil? + + if @to_utf + decode(str) + else + str.force_encoding(::Encoding::UTF_8) if @force_utf8 + str + end + end + + def encoding_updated + case @encoding + when "UTF-16BE", "UTF-16LE" + @source.binmode + @source.set_encoding(@encoding, @encoding) + end + @line_break = encode(">") + @pending_buffer, @buffer = @buffer, "" + @pending_buffer.force_encoding(@encoding) + super + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/streamlistener.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/streamlistener.rb new file mode 100644 index 000000000000..30c894517954 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/streamlistener.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: false +module REXML + # A template for stream parser listeners. + # Note that the declarations (attlistdecl, elementdecl, etc) are trivially + # processed; REXML doesn't yet handle doctype entity declarations, so you + # have to parse them out yourself. + module StreamListener + # Called when a tag is encountered. + # @p name the tag name + # @p attrs an array of arrays of attribute/value pairs, suitable for + # use with assoc or rassoc. IE, <tag attr1="value1" attr2="value2"> + # will result in + # tag_start( "tag", # [["attr1","value1"],["attr2","value2"]]) + def tag_start name, attrs + end + # Called when the end tag is reached. In the case of <tag/>, tag_end + # will be called immediately after tag_start + # @p the name of the tag + def tag_end name + end + # Called when text is encountered in the document + # @p text the text content. + def text text + end + # Called when an instruction is encountered. EG: <?xsl sheet='foo'?> + # @p name the instruction name; in the example, "xsl" + # @p instruction the rest of the instruction. In the example, + # "sheet='foo'" + def instruction name, instruction + end + # Called when a comment is encountered. + # @p comment The content of the comment + def comment comment + end + # Handles a doctype declaration. Any attributes of the doctype which are + # not supplied will be nil. # EG, <!DOCTYPE me PUBLIC "foo" "bar"> + # @p name the name of the doctype; EG, "me" + # @p pub_sys "PUBLIC", "SYSTEM", or nil. EG, "PUBLIC" + # @p long_name the supplied long name, or nil. EG, "foo" + # @p uri the uri of the doctype, or nil. EG, "bar" + def doctype name, pub_sys, long_name, uri + end + # Called when the doctype is done + def doctype_end + end + # If a doctype includes an ATTLIST declaration, it will cause this + # method to be called. The content is the declaration itself, unparsed. + # EG, <!ATTLIST el attr CDATA #REQUIRED> will come to this method as "el + # attr CDATA #REQUIRED". This is the same for all of the .*decl + # methods. + def attlistdecl element_name, attributes, raw_content + end + # <!ELEMENT ...> + def elementdecl content + end + # <!ENTITY ...> + # The argument passed to this method is an array of the entity + # declaration. It can be in a number of formats, but in general it + # returns (example, result): + # <!ENTITY % YN '"Yes"'> + # ["YN", "\"Yes\"", "%"] + # <!ENTITY % YN 'Yes'> + # ["YN", "Yes", "%"] + # <!ENTITY WhatHeSaid "He said %YN;"> + # ["WhatHeSaid", "He said %YN;"] + # <!ENTITY open-hatch SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml"> + # ["open-hatch", "SYSTEM", "http://www.textuality.com/boilerplate/OpenHatch.xml"] + # <!ENTITY open-hatch PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN" "http://www.textuality.com/boilerplate/OpenHatch.xml"> + # ["open-hatch", "PUBLIC", "-//Textuality//TEXT Standard open-hatch boilerplate//EN", "http://www.textuality.com/boilerplate/OpenHatch.xml"] + # <!ENTITY hatch-pic SYSTEM "../grafix/OpenHatch.gif" NDATA gif> + # ["hatch-pic", "SYSTEM", "../grafix/OpenHatch.gif", "gif"] + def entitydecl content + end + # <!NOTATION ...> + def notationdecl content + end + # Called when %foo; is encountered in a doctype declaration. + # @p content "foo" + def entity content + end + # Called when <![CDATA[ ... ]]> is encountered in a document. + # @p content "..." + def cdata content + end + # Called when an XML PI is encountered in the document. + # EG: <?xml version="1.0" encoding="utf"?> + # @p version the version attribute value. EG, "1.0" + # @p encoding the encoding attribute value, or nil. EG, "utf" + # @p standalone the standalone attribute value, or nil. EG, nil + def xmldecl version, encoding, standalone + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/text.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/text.rb new file mode 100644 index 000000000000..050b09c97eea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/text.rb @@ -0,0 +1,424 @@ +# frozen_string_literal: false +require_relative 'security' +require_relative 'entity' +require_relative 'doctype' +require_relative 'child' +require_relative 'doctype' +require_relative 'parseexception' + +module REXML + # Represents text nodes in an XML document + class Text < Child + include Comparable + # The order in which the substitutions occur + SPECIALS = [ /&(?!#?[\w-]+;)/u, /</u, />/u, /"/u, /'/u, /\r/u ] + SUBSTITUTES = ['&amp;', '&lt;', '&gt;', '&quot;', '&apos;', '&#13;'] + # Characters which are substituted in written strings + SLAICEPS = [ '<', '>', '"', "'", '&' ] + SETUTITSBUS = [ /&lt;/u, /&gt;/u, /&quot;/u, /&apos;/u, /&amp;/u ] + + # If +raw+ is true, then REXML leaves the value alone + attr_accessor :raw + + NEEDS_A_SECOND_CHECK = /(<|&((#{Entity::NAME});|(#0*((?:\d+)|(?:x[a-fA-F0-9]+)));)?)/um + NUMERICENTITY = /&#0*((?:\d+)|(?:x[a-fA-F0-9]+));/ + VALID_CHAR = [ + 0x9, 0xA, 0xD, + (0x20..0xD7FF), + (0xE000..0xFFFD), + (0x10000..0x10FFFF) + ] + + if String.method_defined? :encode + VALID_XML_CHARS = Regexp.new('^['+ + VALID_CHAR.map { |item| + case item + when Integer + [item].pack('U').force_encoding('utf-8') + when Range + [item.first, '-'.ord, item.last].pack('UUU').force_encoding('utf-8') + end + }.join + + ']*$') + else + VALID_XML_CHARS = /^( + [\x09\x0A\x0D\x20-\x7E] # ASCII + | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte + | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs + | [\xE1-\xEC\xEE][\x80-\xBF]{2} # straight 3-byte + | \xEF[\x80-\xBE]{2} # + | \xEF\xBF[\x80-\xBD] # excluding U+fffe and U+ffff + | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates + | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 + | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 + | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 + )*$/nx; + end + + # Constructor + # +arg+ if a String, the content is set to the String. If a Text, + # the object is shallowly cloned. + # + # +respect_whitespace+ (boolean, false) if true, whitespace is + # respected + # + # +parent+ (nil) if this is a Parent object, the parent + # will be set to this. + # + # +raw+ (nil) This argument can be given three values. + # If true, then the value of used to construct this object is expected to + # contain no unescaped XML markup, and REXML will not change the text. If + # this value is false, the string may contain any characters, and REXML will + # escape any and all defined entities whose values are contained in the + # text. If this value is nil (the default), then the raw value of the + # parent will be used as the raw value for this node. If there is no raw + # value for the parent, and no value is supplied, the default is false. + # Use this field if you have entities defined for some text, and you don't + # want REXML to escape that text in output. + # Text.new( "<&", false, nil, false ) #-> "&lt;&amp;" + # Text.new( "&lt;&amp;", false, nil, false ) #-> "&amp;lt;&amp;amp;" + # Text.new( "<&", false, nil, true ) #-> Parse exception + # Text.new( "&lt;&amp;", false, nil, true ) #-> "&lt;&amp;" + # # Assume that the entity "s" is defined to be "sean" + # # and that the entity "r" is defined to be "russell" + # Text.new( "sean russell" ) #-> "&s; &r;" + # Text.new( "sean russell", false, nil, true ) #-> "sean russell" + # + # +entity_filter+ (nil) This can be an array of entities to match in the + # supplied text. This argument is only useful if +raw+ is set to false. + # Text.new( "sean russell", false, nil, false, ["s"] ) #-> "&s; russell" + # Text.new( "sean russell", false, nil, true, ["s"] ) #-> "sean russell" + # In the last example, the +entity_filter+ argument is ignored. + # + # +illegal+ INTERNAL USE ONLY + def initialize(arg, respect_whitespace=false, parent=nil, raw=nil, + entity_filter=nil, illegal=NEEDS_A_SECOND_CHECK ) + + @raw = false + @parent = nil + @entity_filter = nil + + if parent + super( parent ) + @raw = parent.raw + end + + if arg.kind_of? String + @string = arg.dup + elsif arg.kind_of? Text + @string = arg.instance_variable_get(:@string).dup + @raw = arg.raw + @entity_filter = arg.instance_variable_get(:@entity_filter) + else + raise "Illegal argument of type #{arg.type} for Text constructor (#{arg})" + end + + @string.squeeze!(" \n\t") unless respect_whitespace + @string.gsub!(/\r\n?/, "\n") + @raw = raw unless raw.nil? + @entity_filter = entity_filter if entity_filter + clear_cache + + Text.check(@string, illegal, doctype) if @raw + end + + def parent= parent + super(parent) + Text.check(@string, NEEDS_A_SECOND_CHECK, doctype) if @raw and @parent + end + + # check for illegal characters + def Text.check string, pattern, doctype + + # illegal anywhere + if string !~ VALID_XML_CHARS + if String.method_defined? :encode + string.chars.each do |c| + case c.ord + when *VALID_CHAR + else + raise "Illegal character #{c.inspect} in raw string #{string.inspect}" + end + end + else + string.scan(/[\x00-\x7F]|[\x80-\xBF][\xC0-\xF0]*|[\xC0-\xF0]/n) do |c| + case c.unpack('U') + when *VALID_CHAR + else + raise "Illegal character #{c.inspect} in raw string #{string.inspect}" + end + end + end + end + + # context sensitive + string.scan(pattern) do + if $1[-1] != ?; + raise "Illegal character #{$1.inspect} in raw string #{string.inspect}" + elsif $1[0] == ?& + if $5 and $5[0] == ?# + case ($5[1] == ?x ? $5[2..-1].to_i(16) : $5[1..-1].to_i) + when *VALID_CHAR + else + raise "Illegal character #{$1.inspect} in raw string #{string.inspect}" + end + # FIXME: below can't work but this needs API change. + # elsif @parent and $3 and !SUBSTITUTES.include?($1) + # if !doctype or !doctype.entities.has_key?($3) + # raise "Undeclared entity '#{$1}' in raw string \"#{string}\"" + # end + end + end + end + end + + def node_type + :text + end + + def empty? + @string.size==0 + end + + + def clone + return Text.new(self, true) + end + + + # Appends text to this text node. The text is appended in the +raw+ mode + # of this text node. + # + # +returns+ the text itself to enable method chain like + # 'text << "XXX" << "YYY"'. + def <<( to_append ) + @string << to_append.gsub( /\r\n?/, "\n" ) + clear_cache + self + end + + + # +other+ a String or a Text + # +returns+ the result of (to_s <=> arg.to_s) + def <=>( other ) + to_s() <=> other.to_s + end + + def doctype + if @parent + doc = @parent.document + doc.doctype if doc + end + end + + REFERENCE = /#{Entity::REFERENCE}/ + # Returns the string value of this text node. This string is always + # escaped, meaning that it is a valid XML text node string, and all + # entities that can be escaped, have been inserted. This method respects + # the entity filter set in the constructor. + # + # # Assume that the entity "s" is defined to be "sean", and that the + # # entity "r" is defined to be "russell" + # t = Text.new( "< & sean russell", false, nil, false, ['s'] ) + # t.to_s #-> "&lt; &amp; &s; russell" + # t = Text.new( "< & &s; russell", false, nil, false ) + # t.to_s #-> "&lt; &amp; &s; russell" + # u = Text.new( "sean russell", false, nil, true ) + # u.to_s #-> "sean russell" + def to_s + return @string if @raw + @normalized ||= Text::normalize( @string, doctype, @entity_filter ) + end + + def inspect + @string.inspect + end + + # Returns the string value of this text. This is the text without + # entities, as it might be used programmatically, or printed to the + # console. This ignores the 'raw' attribute setting, and any + # entity_filter. + # + # # Assume that the entity "s" is defined to be "sean", and that the + # # entity "r" is defined to be "russell" + # t = Text.new( "< & sean russell", false, nil, false, ['s'] ) + # t.value #-> "< & sean russell" + # t = Text.new( "< & &s; russell", false, nil, false ) + # t.value #-> "< & sean russell" + # u = Text.new( "sean russell", false, nil, true ) + # u.value #-> "sean russell" + def value + @unnormalized ||= Text::unnormalize( @string, doctype ) + end + + # Sets the contents of this text node. This expects the text to be + # unnormalized. It returns self. + # + # e = Element.new( "a" ) + # e.add_text( "foo" ) # <a>foo</a> + # e[0].value = "bar" # <a>bar</a> + # e[0].value = "<a>" # <a>&lt;a&gt;</a> + def value=( val ) + @string = val.gsub( /\r\n?/, "\n" ) + clear_cache + @raw = false + end + + def wrap(string, width, addnewline=false) + # Recursively wrap string at width. + return string if string.length <= width + place = string.rindex(' ', width) # Position in string with last ' ' before cutoff + if addnewline then + return "\n" + string[0,place] + "\n" + wrap(string[place+1..-1], width) + else + return string[0,place] + "\n" + wrap(string[place+1..-1], width) + end + end + + def indent_text(string, level=1, style="\t", indentfirstline=true) + return string if level < 0 + new_string = '' + string.each_line { |line| + indent_string = style * level + new_line = (indent_string + line).sub(/[\s]+$/,'') + new_string << new_line + } + new_string.strip! unless indentfirstline + return new_string + end + + # == DEPRECATED + # See REXML::Formatters + # + def write( writer, indent=-1, transitive=false, ie_hack=false ) + Kernel.warn("#{self.class.name}.write is deprecated. See REXML::Formatters", uplevel: 1) + formatter = if indent > -1 + REXML::Formatters::Pretty.new( indent ) + else + REXML::Formatters::Default.new + end + formatter.write( self, writer ) + end + + # FIXME + # This probably won't work properly + def xpath + path = @parent.xpath + path += "/text()" + return path + end + + # Writes out text, substituting special characters beforehand. + # +out+ A String, IO, or any other object supporting <<( String ) + # +input+ the text to substitute and the write out + # + # z=utf8.unpack("U*") + # ascOut="" + # z.each{|r| + # if r < 0x100 + # ascOut.concat(r.chr) + # else + # ascOut.concat(sprintf("&#x%x;", r)) + # end + # } + # puts ascOut + def write_with_substitution out, input + copy = input.clone + # Doing it like this rather than in a loop improves the speed + copy.gsub!( SPECIALS[0], SUBSTITUTES[0] ) + copy.gsub!( SPECIALS[1], SUBSTITUTES[1] ) + copy.gsub!( SPECIALS[2], SUBSTITUTES[2] ) + copy.gsub!( SPECIALS[3], SUBSTITUTES[3] ) + copy.gsub!( SPECIALS[4], SUBSTITUTES[4] ) + copy.gsub!( SPECIALS[5], SUBSTITUTES[5] ) + out << copy + end + + private + def clear_cache + @normalized = nil + @unnormalized = nil + end + + # Reads text, substituting entities + def Text::read_with_substitution( input, illegal=nil ) + copy = input.clone + + if copy =~ illegal + raise ParseException.new( "malformed text: Illegal character #$& in \"#{copy}\"" ) + end if illegal + + copy.gsub!( /\r\n?/, "\n" ) + if copy.include? ?& + copy.gsub!( SETUTITSBUS[0], SLAICEPS[0] ) + copy.gsub!( SETUTITSBUS[1], SLAICEPS[1] ) + copy.gsub!( SETUTITSBUS[2], SLAICEPS[2] ) + copy.gsub!( SETUTITSBUS[3], SLAICEPS[3] ) + copy.gsub!( SETUTITSBUS[4], SLAICEPS[4] ) + copy.gsub!( /&#0*((?:\d+)|(?:x[a-f0-9]+));/ ) { + m=$1 + #m='0' if m=='' + m = "0#{m}" if m[0] == ?x + [Integer(m)].pack('U*') + } + end + copy + end + + EREFERENCE = /&(?!#{Entity::NAME};)/ + # Escapes all possible entities + def Text::normalize( input, doctype=nil, entity_filter=nil ) + copy = input.to_s + # Doing it like this rather than in a loop improves the speed + #copy = copy.gsub( EREFERENCE, '&amp;' ) + copy = copy.gsub( "&", "&amp;" ) + if doctype + # Replace all ampersands that aren't part of an entity + doctype.entities.each_value do |entity| + copy = copy.gsub( entity.value, + "&#{entity.name};" ) if entity.value and + not( entity_filter and entity_filter.include?(entity.name) ) + end + else + # Replace all ampersands that aren't part of an entity + DocType::DEFAULT_ENTITIES.each_value do |entity| + copy = copy.gsub(entity.value, "&#{entity.name};" ) + end + end + copy + end + + # Unescapes all possible entities + def Text::unnormalize( string, doctype=nil, filter=nil, illegal=nil ) + sum = 0 + string.gsub( /\r\n?/, "\n" ).gsub( REFERENCE ) { + s = Text.expand($&, doctype, filter) + if sum + s.bytesize > Security.entity_expansion_text_limit + raise "entity expansion has grown too large" + else + sum += s.bytesize + end + s + } + end + + def Text.expand(ref, doctype, filter) + if ref[1] == ?# + if ref[2] == ?x + [ref[3...-1].to_i(16)].pack('U*') + else + [ref[2...-1].to_i].pack('U*') + end + elsif ref == '&amp;' + '&' + elsif filter and filter.include?( ref[1...-1] ) + ref + elsif doctype + doctype.entity( ref[1...-1] ) or ref + else + entity_value = DocType::DEFAULT_ENTITIES[ ref[1...-1] ] + entity_value ? entity_value.value : ref + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/undefinednamespaceexception.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/undefinednamespaceexception.rb new file mode 100644 index 000000000000..492a098183e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/undefinednamespaceexception.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: false +require_relative 'parseexception' +module REXML + class UndefinedNamespaceException < ParseException + def initialize( prefix, source, parser ) + super( "Undefined prefix #{prefix} found" ) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/relaxng.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/relaxng.rb new file mode 100644 index 000000000000..f29a2c05e578 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/relaxng.rb @@ -0,0 +1,539 @@ +# frozen_string_literal: false +require_relative "validation" +require_relative "../parsers/baseparser" + +module REXML + module Validation + # Implemented: + # * empty + # * element + # * attribute + # * text + # * optional + # * choice + # * oneOrMore + # * zeroOrMore + # * group + # * value + # * interleave + # * mixed + # * ref + # * grammar + # * start + # * define + # + # Not implemented: + # * data + # * param + # * include + # * externalRef + # * notAllowed + # * anyName + # * nsName + # * except + # * name + class RelaxNG + include Validator + + INFINITY = 1.0 / 0.0 + EMPTY = Event.new( nil ) + TEXT = [:start_element, "text"] + attr_accessor :current + attr_accessor :count + attr_reader :references + + # FIXME: Namespaces + def initialize source + parser = REXML::Parsers::BaseParser.new( source ) + + @count = 0 + @references = {} + @root = @current = Sequence.new(self) + @root.previous = true + states = [ @current ] + begin + event = parser.pull + case event[0] + when :start_element + case event[1] + when "empty" + when "element", "attribute", "text", "value" + states[-1] << event + when "optional" + states << Optional.new( self ) + states[-2] << states[-1] + when "choice" + states << Choice.new( self ) + states[-2] << states[-1] + when "oneOrMore" + states << OneOrMore.new( self ) + states[-2] << states[-1] + when "zeroOrMore" + states << ZeroOrMore.new( self ) + states[-2] << states[-1] + when "group" + states << Sequence.new( self ) + states[-2] << states[-1] + when "interleave" + states << Interleave.new( self ) + states[-2] << states[-1] + when "mixed" + states << Interleave.new( self ) + states[-2] << states[-1] + states[-1] << TEXT + when "define" + states << [ event[2]["name"] ] + when "ref" + states[-1] << Ref.new( event[2]["name"] ) + when "anyName" + states << AnyName.new( self ) + states[-2] << states[-1] + when "nsName" + when "except" + when "name" + when "data" + when "param" + when "include" + when "grammar" + when "start" + when "externalRef" + when "notAllowed" + end + when :end_element + case event[1] + when "element", "attribute" + states[-1] << event + when "zeroOrMore", "oneOrMore", "choice", "optional", + "interleave", "group", "mixed" + states.pop + when "define" + ref = states.pop + @references[ ref.shift ] = ref + #when "empty" + end + when :end_document + states[-1] << event + when :text + states[-1] << event + end + end while event[0] != :end_document + end + + def receive event + validate( event ) + end + end + + class State + def initialize( context ) + @previous = [] + @events = [] + @current = 0 + @count = context.count += 1 + @references = context.references + @value = false + end + + def reset + return if @current == 0 + @current = 0 + @events.each {|s| s.reset if s.kind_of? State } + end + + def previous=( previous ) + @previous << previous + end + + def next( event ) + #print "In next with #{event.inspect}. " + #p @previous + return @previous.pop.next( event ) if @events[@current].nil? + expand_ref_in( @events, @current ) if @events[@current].class == Ref + if ( @events[@current].kind_of? State ) + @current += 1 + @events[@current-1].previous = self + return @events[@current-1].next( event ) + end + if ( @events[@current].matches?(event) ) + @current += 1 + if @events[@current].nil? + return @previous.pop + elsif @events[@current].kind_of? State + @current += 1 + @events[@current-1].previous = self + return @events[@current-1] + else + return self + end + else + return nil + end + end + + def to_s + # Abbreviated: + self.class.name =~ /(?:::)(\w)\w+$/ + # Full: + #self.class.name =~ /(?:::)(\w+)$/ + "#$1.#@count" + end + + def inspect + "< #{to_s} #{@events.collect{|e| + pre = e == @events[@current] ? '#' : '' + pre + e.inspect unless self == e + }.join(', ')} >" + end + + def expected + return [@events[@current]] + end + + def <<( event ) + add_event_to_arry( @events, event ) + end + + + protected + def expand_ref_in( arry, ind ) + new_events = [] + @references[ arry[ind].to_s ].each{ |evt| + add_event_to_arry(new_events,evt) + } + arry[ind,1] = new_events + end + + def add_event_to_arry( arry, evt ) + evt = generate_event( evt ) + if evt.kind_of? String + arry[-1].event_arg = evt if arry[-1].kind_of? Event and @value + @value = false + else + arry << evt + end + end + + def generate_event( event ) + return event if event.kind_of? State or event.class == Ref + evt = nil + arg = nil + case event[0] + when :start_element + case event[1] + when "element" + evt = :start_element + arg = event[2]["name"] + when "attribute" + evt = :start_attribute + arg = event[2]["name"] + when "text" + evt = :text + when "value" + evt = :text + @value = true + end + when :text + return event[1] + when :end_document + return Event.new( event[0] ) + else # then :end_element + case event[1] + when "element" + evt = :end_element + when "attribute" + evt = :end_attribute + end + end + return Event.new( evt, arg ) + end + end + + + class Sequence < State + def matches?(event) + @events[@current].matches?( event ) + end + end + + + class Optional < State + def next( event ) + if @current == 0 + rv = super + return rv if rv + @prior = @previous.pop + return @prior.next( event ) + end + super + end + + def matches?(event) + @events[@current].matches?(event) || + (@current == 0 and @previous[-1].matches?(event)) + end + + def expected + return [ @prior.expected, @events[0] ].flatten if @current == 0 + return [@events[@current]] + end + end + + + class ZeroOrMore < Optional + def next( event ) + expand_ref_in( @events, @current ) if @events[@current].class == Ref + if ( @events[@current].matches?(event) ) + @current += 1 + if @events[@current].nil? + @current = 0 + return self + elsif @events[@current].kind_of? State + @current += 1 + @events[@current-1].previous = self + return @events[@current-1] + else + return self + end + else + @prior = @previous.pop + return @prior.next( event ) if @current == 0 + return nil + end + end + + def expected + return [ @prior.expected, @events[0] ].flatten if @current == 0 + return [@events[@current]] + end + end + + + class OneOrMore < State + def initialize context + super + @ord = 0 + end + + def reset + super + @ord = 0 + end + + def next( event ) + expand_ref_in( @events, @current ) if @events[@current].class == Ref + if ( @events[@current].matches?(event) ) + @current += 1 + @ord += 1 + if @events[@current].nil? + @current = 0 + return self + elsif @events[@current].kind_of? State + @current += 1 + @events[@current-1].previous = self + return @events[@current-1] + else + return self + end + else + return @previous.pop.next( event ) if @current == 0 and @ord > 0 + return nil + end + end + + def matches?( event ) + @events[@current].matches?(event) || + (@current == 0 and @ord > 0 and @previous[-1].matches?(event)) + end + + def expected + if @current == 0 and @ord > 0 + return [@previous[-1].expected, @events[0]].flatten + else + return [@events[@current]] + end + end + end + + + class Choice < State + def initialize context + super + @choices = [] + end + + def reset + super + @events = [] + @choices.each { |c| c.each { |s| s.reset if s.kind_of? State } } + end + + def <<( event ) + add_event_to_arry( @choices, event ) + end + + def next( event ) + # Make the choice if we haven't + if @events.size == 0 + c = 0 ; max = @choices.size + while c < max + if @choices[c][0].class == Ref + expand_ref_in( @choices[c], 0 ) + @choices += @choices[c] + @choices.delete( @choices[c] ) + max -= 1 + else + c += 1 + end + end + @events = @choices.find { |evt| evt[0].matches? event } + # Remove the references + # Find the events + end + unless @events + @events = [] + return nil + end + super + end + + def matches?( event ) + return @events[@current].matches?( event ) if @events.size > 0 + !@choices.find{|evt| evt[0].matches?(event)}.nil? + end + + def expected + return [@events[@current]] if @events.size > 0 + return @choices.collect do |x| + if x[0].kind_of? State + x[0].expected + else + x[0] + end + end.flatten + end + + def inspect + "< #{to_s} #{@choices.collect{|e| e.collect{|f|f.to_s}.join(', ')}.join(' or ')} >" + end + + protected + def add_event_to_arry( arry, evt ) + if evt.kind_of? State or evt.class == Ref + arry << [evt] + elsif evt[0] == :text + if arry[-1] and + arry[-1][-1].kind_of?( Event ) and + arry[-1][-1].event_type == :text and @value + + arry[-1][-1].event_arg = evt[1] + @value = false + end + else + arry << [] if evt[0] == :start_element + arry[-1] << generate_event( evt ) + end + end + end + + + class Interleave < Choice + def initialize context + super + @choice = 0 + end + + def reset + @choice = 0 + end + + def next_current( event ) + # Expand references + c = 0 ; max = @choices.size + while c < max + if @choices[c][0].class == Ref + expand_ref_in( @choices[c], 0 ) + @choices += @choices[c] + @choices.delete( @choices[c] ) + max -= 1 + else + c += 1 + end + end + @events = @choices[@choice..-1].find { |evt| evt[0].matches? event } + @current = 0 + if @events + # reorder the choices + old = @choices[@choice] + idx = @choices.index( @events ) + @choices[@choice] = @events + @choices[idx] = old + @choice += 1 + end + + @events = [] unless @events + end + + + def next( event ) + # Find the next series + next_current(event) unless @events[@current] + return nil unless @events[@current] + + expand_ref_in( @events, @current ) if @events[@current].class == Ref + if ( @events[@current].kind_of? State ) + @current += 1 + @events[@current-1].previous = self + return @events[@current-1].next( event ) + end + return @previous.pop.next( event ) if @events[@current].nil? + if ( @events[@current].matches?(event) ) + @current += 1 + if @events[@current].nil? + return self unless @choices[@choice].nil? + return @previous.pop + elsif @events[@current].kind_of? State + @current += 1 + @events[@current-1].previous = self + return @events[@current-1] + else + return self + end + else + return nil + end + end + + def matches?( event ) + return @events[@current].matches?( event ) if @events[@current] + !@choices[@choice..-1].find{|evt| evt[0].matches?(event)}.nil? + end + + def expected + return [@events[@current]] if @events[@current] + return @choices[@choice..-1].collect do |x| + if x[0].kind_of? State + x[0].expected + else + x[0] + end + end.flatten + end + + def inspect + "< #{to_s} #{@choices.collect{|e| e.collect{|f|f.to_s}.join(', ')}.join(' and ')} >" + end + end + + class Ref + def initialize value + @value = value + end + def to_s + @value + end + def inspect + "{#{to_s}}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validation.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validation.rb new file mode 100644 index 000000000000..0ad6ada42777 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validation.rb @@ -0,0 +1,144 @@ +# frozen_string_literal: false +require_relative 'validationexception' + +module REXML + module Validation + module Validator + NILEVENT = [ nil ] + def reset + @current = @root + @root.reset + @root.previous = true + @attr_stack = [] + self + end + def dump + puts @root.inspect + end + def validate( event ) + @attr_stack = [] unless defined? @attr_stack + match = @current.next(event) + raise ValidationException.new( "Validation error. Expected: "+ + @current.expected.join( " or " )+" from #{@current.inspect} "+ + " but got #{Event.new( event[0], event[1] ).inspect}" ) unless match + @current = match + + # Check for attributes + case event[0] + when :start_element + @attr_stack << event[2] + begin + sattr = [:start_attribute, nil] + eattr = [:end_attribute] + text = [:text, nil] + k, = event[2].find { |key,value| + sattr[1] = key + m = @current.next( sattr ) + if m + # If the state has text children... + if m.matches?( eattr ) + @current = m + else + text[1] = value + m = m.next( text ) + text[1] = nil + return false unless m + @current = m if m + end + m = @current.next( eattr ) + if m + @current = m + true + else + false + end + else + false + end + } + event[2].delete(k) if k + end while k + when :end_element + attrs = @attr_stack.pop + raise ValidationException.new( "Validation error. Illegal "+ + " attributes: #{attrs.inspect}") if attrs.length > 0 + end + end + end + + class Event + def initialize(event_type, event_arg=nil ) + @event_type = event_type + @event_arg = event_arg + end + + attr_reader :event_type + attr_accessor :event_arg + + def done? + @done + end + + def single? + return (@event_type != :start_element and @event_type != :start_attribute) + end + + def matches?( event ) + return false unless event[0] == @event_type + case event[0] + when nil + return true + when :start_element + return true if event[1] == @event_arg + when :end_element + return true + when :start_attribute + return true if event[1] == @event_arg + when :end_attribute + return true + when :end_document + return true + when :text + return (@event_arg.nil? or @event_arg == event[1]) +=begin + when :processing_instruction + false + when :xmldecl + false + when :start_doctype + false + when :end_doctype + false + when :externalentity + false + when :elementdecl + false + when :entity + false + when :attlistdecl + false + when :notationdecl + false + when :end_doctype + false +=end + else + false + end + end + + def ==( other ) + return false unless other.kind_of? Event + @event_type == other.event_type and @event_arg == other.event_arg + end + + def to_s + inspect + end + + def inspect + "#{@event_type.inspect}( #@event_arg )" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validationexception.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validationexception.rb new file mode 100644 index 000000000000..78cd63fd0466 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validationexception.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: false +module REXML + module Validation + class ValidationException < RuntimeError + def initialize msg + super + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmldecl.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmldecl.rb new file mode 100644 index 000000000000..d19407cefdd4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmldecl.rb @@ -0,0 +1,130 @@ +# frozen_string_literal: false + +require_relative 'encoding' +require_relative 'source' + +module REXML + # NEEDS DOCUMENTATION + class XMLDecl < Child + include Encoding + + DEFAULT_VERSION = "1.0" + DEFAULT_ENCODING = "UTF-8" + DEFAULT_STANDALONE = "no" + START = "<?xml" + STOP = "?>" + + attr_accessor :version, :standalone + attr_reader :writeencoding, :writethis + + def initialize(version=DEFAULT_VERSION, encoding=nil, standalone=nil) + @writethis = true + @writeencoding = !encoding.nil? + if version.kind_of? XMLDecl + super() + @version = version.version + self.encoding = version.encoding + @writeencoding = version.writeencoding + @standalone = version.standalone + @writethis = version.writethis + else + super() + @version = version + self.encoding = encoding + @standalone = standalone + end + @version = DEFAULT_VERSION if @version.nil? + end + + def clone + XMLDecl.new(self) + end + + # indent:: + # Ignored. There must be no whitespace before an XML declaration + # transitive:: + # Ignored + # ie_hack:: + # Ignored + def write(writer, indent=-1, transitive=false, ie_hack=false) + return nil unless @writethis or writer.kind_of? Output + writer << START + writer << " #{content encoding}" + writer << STOP + end + + def ==( other ) + other.kind_of?(XMLDecl) and + other.version == @version and + other.encoding == self.encoding and + other.standalone == @standalone + end + + def xmldecl version, encoding, standalone + @version = version + self.encoding = encoding + @standalone = standalone + end + + def node_type + :xmldecl + end + + alias :stand_alone? :standalone + alias :old_enc= :encoding= + + def encoding=( enc ) + if enc.nil? + self.old_enc = "UTF-8" + @writeencoding = false + else + self.old_enc = enc + @writeencoding = true + end + self.dowrite + end + + # Only use this if you do not want the XML declaration to be written; + # this object is ignored by the XML writer. Otherwise, instantiate your + # own XMLDecl and add it to the document. + # + # Note that XML 1.1 documents *must* include an XML declaration + def XMLDecl.default + rv = XMLDecl.new( "1.0" ) + rv.nowrite + rv + end + + def nowrite + @writethis = false + end + + def dowrite + @writethis = true + end + + def inspect + "#{START} ... #{STOP}" + end + + private + def content(enc) + context = nil + context = parent.context if parent + if context and context[:prologue_quote] == :quote + quote = "\"" + else + quote = "'" + end + + rv = "version=#{quote}#{@version}#{quote}" + if @writeencoding or enc !~ /\Autf-8\z/i + rv << " encoding=#{quote}#{enc}#{quote}" + end + if @standalone + rv << " standalone=#{quote}#{@standalone}#{quote}" + end + rv + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmltokens.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmltokens.rb new file mode 100644 index 000000000000..392b47b1d33c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmltokens.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: false +module REXML + # Defines a number of tokens used for parsing XML. Not for general + # consumption. + module XMLTokens + # From http://www.w3.org/TR/REC-xml/#sec-common-syn + # + # [4] NameStartChar ::= + # ":" | + # [A-Z] | + # "_" | + # [a-z] | + # [#xC0-#xD6] | + # [#xD8-#xF6] | + # [#xF8-#x2FF] | + # [#x370-#x37D] | + # [#x37F-#x1FFF] | + # [#x200C-#x200D] | + # [#x2070-#x218F] | + # [#x2C00-#x2FEF] | + # [#x3001-#xD7FF] | + # [#xF900-#xFDCF] | + # [#xFDF0-#xFFFD] | + # [#x10000-#xEFFFF] + name_start_chars = [ + ":", + "A-Z", + "_", + "a-z", + "\\u00C0-\\u00D6", + "\\u00D8-\\u00F6", + "\\u00F8-\\u02FF", + "\\u0370-\\u037D", + "\\u037F-\\u1FFF", + "\\u200C-\\u200D", + "\\u2070-\\u218F", + "\\u2C00-\\u2FEF", + "\\u3001-\\uD7FF", + "\\uF900-\\uFDCF", + "\\uFDF0-\\uFFFD", + "\\u{10000}-\\u{EFFFF}", + ] + # From http://www.w3.org/TR/REC-xml/#sec-common-syn + # + # [4a] NameChar ::= + # NameStartChar | + # "-" | + # "." | + # [0-9] | + # #xB7 | + # [#x0300-#x036F] | + # [#x203F-#x2040] + name_chars = name_start_chars + [ + "\\-", + "\\.", + "0-9", + "\\u00B7", + "\\u0300-\\u036F", + "\\u203F-\\u2040", + ] + NAME_START_CHAR = "[#{name_start_chars.join('')}]" + NAME_CHAR = "[#{name_chars.join('')}]" + NAMECHAR = NAME_CHAR # deprecated. Use NAME_CHAR instead. + + # From http://www.w3.org/TR/xml-names11/#NT-NCName + # + # [6] NCNameStartChar ::= NameStartChar - ':' + ncname_start_chars = name_start_chars - [":"] + # From http://www.w3.org/TR/xml-names11/#NT-NCName + # + # [5] NCNameChar ::= NameChar - ':' + ncname_chars = name_chars - [":"] + NCNAME_STR = "[#{ncname_start_chars.join('')}][#{ncname_chars.join('')}]*" + NAME_STR = "(?:#{NCNAME_STR}:)?#{NCNAME_STR}" + + NAME = "(#{NAME_START_CHAR}#{NAME_CHAR}*)" + NMTOKEN = "(?:#{NAME_CHAR})+" + NMTOKENS = "#{NMTOKEN}(\\s+#{NMTOKEN})*" + REFERENCE = "(?:&#{NAME};|&#\\d+;|&#x[0-9a-fA-F]+;)" + + #REFERENCE = "(?:#{ENTITYREF}|#{CHARREF})" + #ENTITYREF = "&#{NAME};" + #CHARREF = "&#\\d+;|&#x[0-9a-fA-F]+;" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath.rb new file mode 100644 index 000000000000..a0921bd8e10d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: false +require_relative 'functions' +require_relative 'xpath_parser' + +module REXML + # Wrapper class. Use this class to access the XPath functions. + class XPath + include Functions + # A base Hash object, supposing to be used when initializing a + # default empty namespaces set, but is currently unused. + # TODO: either set the namespaces=EMPTY_HASH, or deprecate this. + EMPTY_HASH = {} + + # Finds and returns the first node that matches the supplied xpath. + # element:: + # The context element + # path:: + # The xpath to search for. If not supplied or nil, returns the first + # node matching '*'. + # namespaces:: + # If supplied, a Hash which defines a namespace mapping. + # variables:: + # If supplied, a Hash which maps $variables in the query + # to values. This can be used to avoid XPath injection attacks + # or to automatically handle escaping string values. + # + # XPath.first( node ) + # XPath.first( doc, "//b"} ) + # XPath.first( node, "a/x:b", { "x"=>"http://doofus" } ) + # XPath.first( node, '/book/publisher/text()=$publisher', {}, {"publisher"=>"O'Reilly"}) + def XPath::first(element, path=nil, namespaces=nil, variables={}, options={}) + raise "The namespaces argument, if supplied, must be a hash object." unless namespaces.nil? or namespaces.kind_of?(Hash) + raise "The variables argument, if supplied, must be a hash object." unless variables.kind_of?(Hash) + parser = XPathParser.new(**options) + parser.namespaces = namespaces + parser.variables = variables + path = "*" unless path + element = [element] unless element.kind_of? Array + parser.parse(path, element).flatten[0] + end + + # Iterates over nodes that match the given path, calling the supplied + # block with the match. + # element:: + # The context element + # path:: + # The xpath to search for. If not supplied or nil, defaults to '*' + # namespaces:: + # If supplied, a Hash which defines a namespace mapping + # variables:: + # If supplied, a Hash which maps $variables in the query + # to values. This can be used to avoid XPath injection attacks + # or to automatically handle escaping string values. + # + # XPath.each( node ) { |el| ... } + # XPath.each( node, '/*[@attr='v']' ) { |el| ... } + # XPath.each( node, 'ancestor::x' ) { |el| ... } + # XPath.each( node, '/book/publisher/text()=$publisher', {}, {"publisher"=>"O'Reilly"}) \ + # {|el| ... } + def XPath::each(element, path=nil, namespaces=nil, variables={}, options={}, &block) + raise "The namespaces argument, if supplied, must be a hash object." unless namespaces.nil? or namespaces.kind_of?(Hash) + raise "The variables argument, if supplied, must be a hash object." unless variables.kind_of?(Hash) + parser = XPathParser.new(**options) + parser.namespaces = namespaces + parser.variables = variables + path = "*" unless path + element = [element] unless element.kind_of? Array + parser.parse(path, element).each( &block ) + end + + # Returns an array of nodes matching a given XPath. + def XPath::match(element, path=nil, namespaces=nil, variables={}, options={}) + parser = XPathParser.new(**options) + parser.namespaces = namespaces + parser.variables = variables + path = "*" unless path + element = [element] unless element.kind_of? Array + parser.parse(path,element) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath_parser.rb b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath_parser.rb new file mode 100644 index 000000000000..d8b88e7a375f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath_parser.rb @@ -0,0 +1,974 @@ +# frozen_string_literal: false + +require "pp" + +require_relative 'namespace' +require_relative 'xmltokens' +require_relative 'attribute' +require_relative 'parsers/xpathparser' + +module REXML + module DClonable + refine Object do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object types + def dclone + clone + end + end + refine Symbol do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object types + def dclone ; self ; end + end + refine Integer do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object types + def dclone ; self ; end + end + refine Float do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object types + def dclone ; self ; end + end + refine Array do + # provides a unified +clone+ operation, for REXML::XPathParser + # to use across multiple Object+ types + def dclone + klone = self.clone + klone.clear + self.each{|v| klone << v.dclone} + klone + end + end + end +end + +using REXML::DClonable + +module REXML + # You don't want to use this class. Really. Use XPath, which is a wrapper + # for this class. Believe me. You don't want to poke around in here. + # There is strange, dark magic at work in this code. Beware. Go back! Go + # back while you still can! + class XPathParser + include XMLTokens + LITERAL = /^'([^']*)'|^"([^"]*)"/u + + DEBUG = (ENV["REXML_XPATH_PARSER_DEBUG"] == "true") + + def initialize(strict: false) + @debug = DEBUG + @parser = REXML::Parsers::XPathParser.new + @namespaces = nil + @variables = {} + @nest = 0 + @strict = strict + end + + def namespaces=( namespaces={} ) + Functions::namespace_context = namespaces + @namespaces = namespaces + end + + def variables=( vars={} ) + Functions::variables = vars + @variables = vars + end + + def parse path, nodeset + path_stack = @parser.parse( path ) + match( path_stack, nodeset ) + end + + def get_first path, nodeset + path_stack = @parser.parse( path ) + first( path_stack, nodeset ) + end + + def predicate path, nodeset + path_stack = @parser.parse( path ) + match( path_stack, nodeset ) + end + + def []=( variable_name, value ) + @variables[ variable_name ] = value + end + + + # Performs a depth-first (document order) XPath search, and returns the + # first match. This is the fastest, lightest way to return a single result. + # + # FIXME: This method is incomplete! + def first( path_stack, node ) + return nil if path.size == 0 + + case path[0] + when :document + # do nothing + return first( path[1..-1], node ) + when :child + for c in node.children + r = first( path[1..-1], c ) + return r if r + end + when :qname + name = path[2] + if node.name == name + return node if path.size == 3 + return first( path[3..-1], node ) + else + return nil + end + when :descendant_or_self + r = first( path[1..-1], node ) + return r if r + for c in node.children + r = first( path, c ) + return r if r + end + when :node + return first( path[1..-1], node ) + when :any + return first( path[1..-1], node ) + end + return nil + end + + + def match(path_stack, nodeset) + nodeset = nodeset.collect.with_index do |node, i| + position = i + 1 + XPathNode.new(node, position: position) + end + result = expr(path_stack, nodeset) + case result + when Array # nodeset + unnode(result) + else + [result] + end + end + + private + def strict? + @strict + end + + # Returns a String namespace for a node, given a prefix + # The rules are: + # + # 1. Use the supplied namespace mapping first. + # 2. If no mapping was supplied, use the context node to look up the namespace + def get_namespace( node, prefix ) + if @namespaces + return @namespaces[prefix] || '' + else + return node.namespace( prefix ) if node.node_type == :element + return '' + end + end + + + # Expr takes a stack of path elements and a set of nodes (either a Parent + # or an Array and returns an Array of matching nodes + def expr( path_stack, nodeset, context=nil ) + enter(:expr, path_stack, nodeset) if @debug + return nodeset if path_stack.length == 0 || nodeset.length == 0 + while path_stack.length > 0 + trace(:while, path_stack, nodeset) if @debug + if nodeset.length == 0 + path_stack.clear + return [] + end + op = path_stack.shift + case op + when :document + first_raw_node = nodeset.first.raw_node + nodeset = [XPathNode.new(first_raw_node.root_node, position: 1)] + when :self + nodeset = step(path_stack) do + [nodeset] + end + when :child + nodeset = step(path_stack) do + child(nodeset) + end + when :literal + trace(:literal, path_stack, nodeset) if @debug + return path_stack.shift + when :attribute + nodeset = step(path_stack, any_type: :attribute) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + next unless raw_node.node_type == :element + attributes = raw_node.attributes + next if attributes.empty? + nodesets << attributes.each_attribute.collect.with_index do |attribute, i| + XPathNode.new(attribute, position: i + 1) + end + end + nodesets + end + when :namespace + pre_defined_namespaces = { + "xml" => "http://www.w3.org/XML/1998/namespace", + } + nodeset = step(path_stack, any_type: :namespace) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + case raw_node.node_type + when :element + if @namespaces + nodesets << pre_defined_namespaces.merge(@namespaces) + else + nodesets << pre_defined_namespaces.merge(raw_node.namespaces) + end + when :attribute + if @namespaces + nodesets << pre_defined_namespaces.merge(@namespaces) + else + nodesets << pre_defined_namespaces.merge(raw_node.element.namespaces) + end + end + end + nodesets + end + when :parent + nodeset = step(path_stack) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + if raw_node.node_type == :attribute + parent = raw_node.element + else + parent = raw_node.parent + end + nodesets << [XPathNode.new(parent, position: 1)] if parent + end + nodesets + end + when :ancestor + nodeset = step(path_stack) do + nodesets = [] + # new_nodes = {} + nodeset.each do |node| + raw_node = node.raw_node + new_nodeset = [] + while raw_node.parent + raw_node = raw_node.parent + # next if new_nodes.key?(node) + new_nodeset << XPathNode.new(raw_node, + position: new_nodeset.size + 1) + # new_nodes[node] = true + end + nodesets << new_nodeset unless new_nodeset.empty? + end + nodesets + end + when :ancestor_or_self + nodeset = step(path_stack) do + nodesets = [] + # new_nodes = {} + nodeset.each do |node| + raw_node = node.raw_node + next unless raw_node.node_type == :element + new_nodeset = [XPathNode.new(raw_node, position: 1)] + # new_nodes[node] = true + while raw_node.parent + raw_node = raw_node.parent + # next if new_nodes.key?(node) + new_nodeset << XPathNode.new(raw_node, + position: new_nodeset.size + 1) + # new_nodes[node] = true + end + nodesets << new_nodeset unless new_nodeset.empty? + end + nodesets + end + when :descendant_or_self + nodeset = step(path_stack) do + descendant(nodeset, true) + end + when :descendant + nodeset = step(path_stack) do + descendant(nodeset, false) + end + when :following_sibling + nodeset = step(path_stack) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + next unless raw_node.respond_to?(:parent) + next if raw_node.parent.nil? + all_siblings = raw_node.parent.children + current_index = all_siblings.index(raw_node) + following_siblings = all_siblings[(current_index + 1)..-1] + next if following_siblings.empty? + nodesets << following_siblings.collect.with_index do |sibling, i| + XPathNode.new(sibling, position: i + 1) + end + end + nodesets + end + when :preceding_sibling + nodeset = step(path_stack, order: :reverse) do + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + next unless raw_node.respond_to?(:parent) + next if raw_node.parent.nil? + all_siblings = raw_node.parent.children + current_index = all_siblings.index(raw_node) + preceding_siblings = all_siblings[0, current_index].reverse + next if preceding_siblings.empty? + nodesets << preceding_siblings.collect.with_index do |sibling, i| + XPathNode.new(sibling, position: i + 1) + end + end + nodesets + end + when :preceding + nodeset = step(path_stack, order: :reverse) do + unnode(nodeset) do |node| + preceding(node) + end + end + when :following + nodeset = step(path_stack) do + unnode(nodeset) do |node| + following(node) + end + end + when :variable + var_name = path_stack.shift + return [@variables[var_name]] + + when :eq, :neq, :lt, :lteq, :gt, :gteq + left = expr( path_stack.shift, nodeset.dup, context ) + right = expr( path_stack.shift, nodeset.dup, context ) + res = equality_relational_compare( left, op, right ) + trace(op, left, right, res) if @debug + return res + + when :or + left = expr(path_stack.shift, nodeset.dup, context) + return true if Functions.boolean(left) + right = expr(path_stack.shift, nodeset.dup, context) + return Functions.boolean(right) + + when :and + left = expr(path_stack.shift, nodeset.dup, context) + return false unless Functions.boolean(left) + right = expr(path_stack.shift, nodeset.dup, context) + return Functions.boolean(right) + + when :div, :mod, :mult, :plus, :minus + left = expr(path_stack.shift, nodeset, context) + right = expr(path_stack.shift, nodeset, context) + left = unnode(left) if left.is_a?(Array) + right = unnode(right) if right.is_a?(Array) + left = Functions::number(left) + right = Functions::number(right) + case op + when :div + return left / right + when :mod + return left % right + when :mult + return left * right + when :plus + return left + right + when :minus + return left - right + else + raise "[BUG] Unexpected operator: <#{op.inspect}>" + end + when :union + left = expr( path_stack.shift, nodeset, context ) + right = expr( path_stack.shift, nodeset, context ) + left = unnode(left) if left.is_a?(Array) + right = unnode(right) if right.is_a?(Array) + return (left | right) + when :neg + res = expr( path_stack, nodeset, context ) + res = unnode(res) if res.is_a?(Array) + return -Functions.number(res) + when :not + when :function + func_name = path_stack.shift.tr('-','_') + arguments = path_stack.shift + + if nodeset.size != 1 + message = "[BUG] Node set size must be 1 for function call: " + message += "<#{func_name}>: <#{nodeset.inspect}>: " + message += "<#{arguments.inspect}>" + raise message + end + + node = nodeset.first + if context + target_context = context + else + target_context = {:size => nodeset.size} + if node.is_a?(XPathNode) + target_context[:node] = node.raw_node + target_context[:index] = node.position + else + target_context[:node] = node + target_context[:index] = 1 + end + end + args = arguments.dclone.collect do |arg| + result = expr(arg, nodeset, target_context) + result = unnode(result) if result.is_a?(Array) + result + end + Functions.context = target_context + return Functions.send(func_name, *args) + + else + raise "[BUG] Unexpected path: <#{op.inspect}>: <#{path_stack.inspect}>" + end + end # while + return nodeset + ensure + leave(:expr, path_stack, nodeset) if @debug + end + + def step(path_stack, any_type: :element, order: :forward) + nodesets = yield + begin + enter(:step, path_stack, nodesets) if @debug + nodesets = node_test(path_stack, nodesets, any_type: any_type) + while path_stack[0] == :predicate + path_stack.shift # :predicate + predicate_expression = path_stack.shift.dclone + nodesets = evaluate_predicate(predicate_expression, nodesets) + end + if nodesets.size == 1 + ordered_nodeset = nodesets[0] + else + raw_nodes = [] + nodesets.each do |nodeset| + nodeset.each do |node| + if node.respond_to?(:raw_node) + raw_nodes << node.raw_node + else + raw_nodes << node + end + end + end + ordered_nodeset = sort(raw_nodes, order) + end + new_nodeset = [] + ordered_nodeset.each do |node| + # TODO: Remove duplicated + new_nodeset << XPathNode.new(node, position: new_nodeset.size + 1) + end + new_nodeset + ensure + leave(:step, path_stack, new_nodeset) if @debug + end + end + + def node_test(path_stack, nodesets, any_type: :element) + enter(:node_test, path_stack, nodesets) if @debug + operator = path_stack.shift + case operator + when :qname + prefix = path_stack.shift + name = path_stack.shift + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + case raw_node.node_type + when :element + if prefix.nil? + raw_node.name == name + elsif prefix.empty? + if strict? + raw_node.name == name and raw_node.namespace == "" + else + # FIXME: This DOUBLES the time XPath searches take + ns = get_namespace(raw_node, prefix) + raw_node.name == name and raw_node.namespace == ns + end + else + # FIXME: This DOUBLES the time XPath searches take + ns = get_namespace(raw_node, prefix) + raw_node.name == name and raw_node.namespace == ns + end + when :attribute + if prefix.nil? + raw_node.name == name + elsif prefix.empty? + raw_node.name == name and raw_node.namespace == "" + else + # FIXME: This DOUBLES the time XPath searches take + ns = get_namespace(raw_node.element, prefix) + raw_node.name == name and raw_node.namespace == ns + end + else + false + end + end + end + when :namespace + prefix = path_stack.shift + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + case raw_node.node_type + when :element + namespaces = @namespaces || raw_node.namespaces + raw_node.namespace == namespaces[prefix] + when :attribute + namespaces = @namespaces || raw_node.element.namespaces + raw_node.namespace == namespaces[prefix] + else + false + end + end + end + when :any + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + raw_node.node_type == any_type + end + end + when :comment + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + raw_node.node_type == :comment + end + end + when :text + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + raw_node.node_type == :text + end + end + when :processing_instruction + target = path_stack.shift + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + raw_node = node.raw_node + (raw_node.node_type == :processing_instruction) and + (target.empty? or (raw_node.target == target)) + end + end + when :node + new_nodesets = nodesets.collect do |nodeset| + filter_nodeset(nodeset) do |node| + true + end + end + else + message = "[BUG] Unexpected node test: " + + "<#{operator.inspect}>: <#{path_stack.inspect}>" + raise message + end + new_nodesets + ensure + leave(:node_test, path_stack, new_nodesets) if @debug + end + + def filter_nodeset(nodeset) + new_nodeset = [] + nodeset.each do |node| + next unless yield(node) + new_nodeset << XPathNode.new(node, position: new_nodeset.size + 1) + end + new_nodeset + end + + def evaluate_predicate(expression, nodesets) + enter(:predicate, expression, nodesets) if @debug + new_nodesets = nodesets.collect do |nodeset| + new_nodeset = [] + subcontext = { :size => nodeset.size } + nodeset.each_with_index do |node, index| + if node.is_a?(XPathNode) + subcontext[:node] = node.raw_node + subcontext[:index] = node.position + else + subcontext[:node] = node + subcontext[:index] = index + 1 + end + result = expr(expression.dclone, [node], subcontext) + trace(:predicate_evaluate, expression, node, subcontext, result) if @debug + result = result[0] if result.kind_of? Array and result.length == 1 + if result.kind_of? Numeric + if result == node.position + new_nodeset << XPathNode.new(node, position: new_nodeset.size + 1) + end + elsif result.instance_of? Array + if result.size > 0 and result.inject(false) {|k,s| s or k} + if result.size > 0 + new_nodeset << XPathNode.new(node, position: new_nodeset.size + 1) + end + end + else + if result + new_nodeset << XPathNode.new(node, position: new_nodeset.size + 1) + end + end + end + new_nodeset + end + new_nodesets + ensure + leave(:predicate, new_nodesets) if @debug + end + + def trace(*args) + indent = " " * @nest + PP.pp(args, "").each_line do |line| + puts("#{indent}#{line}") + end + end + + def enter(tag, *args) + trace(:enter, tag, *args) + @nest += 1 + end + + def leave(tag, *args) + @nest -= 1 + trace(:leave, tag, *args) + end + + # Reorders an array of nodes so that they are in document order + # It tries to do this efficiently. + # + # FIXME: I need to get rid of this, but the issue is that most of the XPath + # interpreter functions as a filter, which means that we lose context going + # in and out of function calls. If I knew what the index of the nodes was, + # I wouldn't have to do this. Maybe add a document IDX for each node? + # Problems with mutable documents. Or, rewrite everything. + def sort(array_of_nodes, order) + new_arry = [] + array_of_nodes.each { |node| + node_idx = [] + np = node.node_type == :attribute ? node.element : node + while np.parent and np.parent.node_type == :element + node_idx << np.parent.index( np ) + np = np.parent + end + new_arry << [ node_idx.reverse, node ] + } + ordered = new_arry.sort_by do |index, node| + if order == :forward + index + else + -index + end + end + ordered.collect do |_index, node| + node + end + end + + def descendant(nodeset, include_self) + nodesets = [] + nodeset.each do |node| + new_nodeset = [] + new_nodes = {} + descendant_recursive(node.raw_node, new_nodeset, new_nodes, include_self) + nodesets << new_nodeset unless new_nodeset.empty? + end + nodesets + end + + def descendant_recursive(raw_node, new_nodeset, new_nodes, include_self) + if include_self + return if new_nodes.key?(raw_node) + new_nodeset << XPathNode.new(raw_node, position: new_nodeset.size + 1) + new_nodes[raw_node] = true + end + + node_type = raw_node.node_type + if node_type == :element or node_type == :document + raw_node.children.each do |child| + descendant_recursive(child, new_nodeset, new_nodes, true) + end + end + end + + # Builds a nodeset of all of the preceding nodes of the supplied node, + # in reverse document order + # preceding:: includes every element in the document that precedes this node, + # except for ancestors + def preceding(node) + ancestors = [] + parent = node.parent + while parent + ancestors << parent + parent = parent.parent + end + + precedings = [] + preceding_node = preceding_node_of(node) + while preceding_node + if ancestors.include?(preceding_node) + ancestors.delete(preceding_node) + else + precedings << XPathNode.new(preceding_node, + position: precedings.size + 1) + end + preceding_node = preceding_node_of(preceding_node) + end + precedings + end + + def preceding_node_of( node ) + psn = node.previous_sibling_node + if psn.nil? + if node.parent.nil? or node.parent.class == Document + return nil + end + return node.parent + #psn = preceding_node_of( node.parent ) + end + while psn and psn.kind_of? Element and psn.children.size > 0 + psn = psn.children[-1] + end + psn + end + + def following(node) + followings = [] + following_node = next_sibling_node(node) + while following_node + followings << XPathNode.new(following_node, + position: followings.size + 1) + following_node = following_node_of(following_node) + end + followings + end + + def following_node_of( node ) + if node.kind_of? Element and node.children.size > 0 + return node.children[0] + end + return next_sibling_node(node) + end + + def next_sibling_node(node) + psn = node.next_sibling_node + while psn.nil? + if node.parent.nil? or node.parent.class == Document + return nil + end + node = node.parent + psn = node.next_sibling_node + end + return psn + end + + def child(nodeset) + nodesets = [] + nodeset.each do |node| + raw_node = node.raw_node + node_type = raw_node.node_type + # trace(:child, node_type, node) + case node_type + when :element + nodesets << raw_node.children.collect.with_index do |child_node, i| + XPathNode.new(child_node, position: i + 1) + end + when :document + new_nodeset = [] + raw_node.children.each do |child| + case child + when XMLDecl, Text + # Ignore + else + new_nodeset << XPathNode.new(child, position: new_nodeset.size + 1) + end + end + nodesets << new_nodeset unless new_nodeset.empty? + end + end + nodesets + end + + def norm b + case b + when true, false + return b + when 'true', 'false' + return Functions::boolean( b ) + when /^\d+(\.\d+)?$/, Numeric + return Functions::number( b ) + else + return Functions::string( b ) + end + end + + def equality_relational_compare(set1, op, set2) + set1 = unnode(set1) if set1.is_a?(Array) + set2 = unnode(set2) if set2.is_a?(Array) + + if set1.kind_of? Array and set2.kind_of? Array + # If both objects to be compared are node-sets, then the + # comparison will be true if and only if there is a node in the + # first node-set and a node in the second node-set such that the + # result of performing the comparison on the string-values of + # the two nodes is true. + set1.product(set2).any? do |node1, node2| + node_string1 = Functions.string(node1) + node_string2 = Functions.string(node2) + compare(node_string1, op, node_string2) + end + elsif set1.kind_of? Array or set2.kind_of? Array + # If one is nodeset and other is number, compare number to each item + # in nodeset s.t. number op number(string(item)) + # If one is nodeset and other is string, compare string to each item + # in nodeset s.t. string op string(item) + # If one is nodeset and other is boolean, compare boolean to each item + # in nodeset s.t. boolean op boolean(item) + if set1.kind_of? Array + a = set1 + b = set2 + else + a = set2 + b = set1 + end + + case b + when true, false + each_unnode(a).any? do |unnoded| + compare(Functions.boolean(unnoded), op, b) + end + when Numeric + each_unnode(a).any? do |unnoded| + compare(Functions.number(unnoded), op, b) + end + when /\A\d+(\.\d+)?\z/ + b = Functions.number(b) + each_unnode(a).any? do |unnoded| + compare(Functions.number(unnoded), op, b) + end + else + b = Functions::string(b) + each_unnode(a).any? do |unnoded| + compare(Functions::string(unnoded), op, b) + end + end + else + # If neither is nodeset, + # If op is = or != + # If either boolean, convert to boolean + # If either number, convert to number + # Else, convert to string + # Else + # Convert both to numbers and compare + compare(set1, op, set2) + end + end + + def value_type(value) + case value + when true, false + :boolean + when Numeric + :number + when String + :string + else + raise "[BUG] Unexpected value type: <#{value.inspect}>" + end + end + + def normalize_compare_values(a, operator, b) + a_type = value_type(a) + b_type = value_type(b) + case operator + when :eq, :neq + if a_type == :boolean or b_type == :boolean + a = Functions.boolean(a) unless a_type == :boolean + b = Functions.boolean(b) unless b_type == :boolean + elsif a_type == :number or b_type == :number + a = Functions.number(a) unless a_type == :number + b = Functions.number(b) unless b_type == :number + else + a = Functions.string(a) unless a_type == :string + b = Functions.string(b) unless b_type == :string + end + when :lt, :lteq, :gt, :gteq + a = Functions.number(a) unless a_type == :number + b = Functions.number(b) unless b_type == :number + else + message = "[BUG] Unexpected compare operator: " + + "<#{operator.inspect}>: <#{a.inspect}>: <#{b.inspect}>" + raise message + end + [a, b] + end + + def compare(a, operator, b) + a, b = normalize_compare_values(a, operator, b) + case operator + when :eq + a == b + when :neq + a != b + when :lt + a < b + when :lteq + a <= b + when :gt + a > b + when :gteq + a >= b + else + message = "[BUG] Unexpected compare operator: " + + "<#{operator.inspect}>: <#{a.inspect}>: <#{b.inspect}>" + raise message + end + end + + def each_unnode(nodeset) + return to_enum(__method__, nodeset) unless block_given? + nodeset.each do |node| + if node.is_a?(XPathNode) + unnoded = node.raw_node + else + unnoded = node + end + yield(unnoded) + end + end + + def unnode(nodeset) + each_unnode(nodeset).collect do |unnoded| + unnoded = yield(unnoded) if block_given? + unnoded + end + end + end + + # @private + class XPathNode + attr_reader :raw_node, :context + def initialize(node, context=nil) + if node.is_a?(XPathNode) + @raw_node = node.raw_node + else + @raw_node = node + end + @context = context || {} + end + + def position + @context[:position] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/Gemfile new file mode 100644 index 000000000000..12095db5bcb8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/Gemfile @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +source 'http://rubygems.org' + +gemspec + +gem 'rake' + +gem 'minitest', '>= 5.0' +gem 'minitest-power_assert' + +gem 'parallel', '~> 1.13.0' if RUBY_VERSION < '2.2.0' +gem 'rubocop', '~> 0.49.1' + +# don't try to install redcarpet under jruby +gem 'redcarpet', :platforms => :ruby + +# Profiling +if RUBY_VERSION >= '2.3.0' + gem 'memory_profiler', :require => false +end + +# Needed for a Rake task +gem 'git' +gem 'yard' + +group :development do + gem 'pry' + + # docs + gem 'github-markup' + + # for visual tests + if RUBY_VERSION < '2.2.0' + gem 'sinatra', '~> 1.4.8' + else + gem 'sinatra' + end + gem 'shotgun' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/LICENSE b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/LICENSE new file mode 100644 index 000000000000..660592c17988 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/LICENSE @@ -0,0 +1,186 @@ +# MIT license. See http://www.opensource.org/licenses/mit-license.php + +Copyright (c) 2012 Jeanine Adkisson. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +# SPECIAL NOTE: +Many of the lexers in this project are adaptations of those in Pygments +(pygments.org). The license for Pygments is as follows: + +# BEGIN pygments/LICENSE # + +Copyright (c) 2006-2012 by the respective authors (see AUTHORS file). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# END pygments/LICENSE # + +The contents of the AUTHORS file at the time of porting was: + +# BEGIN pygments/AUTHORS # + +Pygments is written and maintained by Georg Brandl <georg@python.org>. + +Major developers are Tim Hatch <tim@timhatch.com> and Armin Ronacher +<armin.ronacher@active-4.com>. + +Other contributors, listed alphabetically, are: + +* Sam Aaron -- Ioke lexer +* Kumar Appaiah -- Debian control lexer +* Ali Afshar -- image formatter +* Andreas Amann -- AppleScript lexer +* Jeffrey Arnold -- R/S lexer, BUGS lexers +* Jeremy Ashkenas -- CoffeeScript lexer +* Stefan Matthias Aust -- Smalltalk lexer +* Ben Bangert -- Mako lexers +* Max Battcher -- Darcs patch lexer +* Paul Baumgart, 280 North, Inc. -- Objective-J lexer +* Michael Bayer -- Myghty lexers +* John Benediktsson -- Factor lexer +* Christopher Bertels -- Fancy lexer +* Jarrett Billingsley -- MiniD lexer +* Adam Blinkinsop -- Haskell, Redcode lexers +* Frits van Bommel -- assembler lexers +* Pierre Bourdon -- bugfixes +* Hiram Chirino -- Scaml and Jade lexers +* Leaf Corcoran -- MoonScript lexer +* Christopher Creutzig -- MuPAD lexer +* Pete Curry -- bugfixes +* Owen Durni -- haXe lexer +* Nick Efford -- Python 3 lexer +* Sven Efftinge -- Xtend lexer +* Artem Egorkine -- terminal256 formatter +* James H. Fisher -- PostScript lexer +* Carlos Galdino -- Elixir and Elixir Console lexers +* Naveen Garg -- Autohotkey lexer +* Laurent Gautier -- R/S lexer +* Alex Gaynor -- PyPy log lexer +* Bertrand Goetzmann -- Groovy lexer +* Krzysiek Goj -- Scala lexer +* Matt Good -- Genshi, Cheetah lexers +* Patrick Gotthardt -- PHP namespaces support +* Olivier Guibe -- Asymptote lexer +* Martin Harriman -- SNOBOL lexer +* Matthew Harrison -- SVG formatter +* Steven Hazel -- Tcl lexer +* Aslak Hellesøy -- Gherkin lexer +* Greg Hendershott -- Racket lexer +* Jordi Gutiérrez Hermoso -- Octave lexer +* David Hess, Fish Software, Inc. -- Objective-J lexer +* Varun Hiremath -- Debian control lexer +* Doug Hogan -- Mscgen lexer +* Ben Hollis -- Mason lexer +* Tim Howard -- BlitzMax lexer +* Ivan Inozemtsev -- Fantom lexer +* Brian R. Jackson -- Tea lexer +* Dennis Kaarsemaker -- sources.list lexer +* Igor Kalnitsky -- vhdl lexer +* Eric Knibbe -- Lasso lexer +* Adam Koprowski -- Opa lexer +* Benjamin Kowarsch -- Modula-2 lexer +* Alexander Kriegisch -- Kconfig and AspectJ lexers +* Marek Kubica -- Scheme lexer +* Jochen Kupperschmidt -- Markdown processor +* Gerd Kurzbach -- Modelica lexer +* Olov Lassus -- Dart lexer +* Sylvestre Ledru -- Scilab lexer +* Mark Lee -- Vala lexer +* Ben Mabey -- Gherkin lexer +* Simone Margaritelli -- Hybris lexer +* Kirk McDonald -- D lexer +* Gordon McGregor -- SystemVerilog lexer +* Stephen McKamey -- Duel/JBST lexer +* Brian McKenna -- F# lexer +* Lukas Meuser -- BBCode formatter, Lua lexer +* Paul Miller -- LiveScript lexer +* Hong Minhee -- HTTP lexer +* Michael Mior -- Awk lexer +* Jon Morton -- Rust lexer +* Paulo Moura -- Logtalk lexer +* Mher Movsisyan -- DTD lexer +* Ana Nelson -- Ragel, ANTLR, R console lexers +* Nam T. Nguyen -- Monokai style +* Jesper Noehr -- HTML formatter "anchorlinenos" +* Mike Nolta -- Julia lexer +* Jonas Obrist -- BBCode lexer +* David Oliva -- Rebol lexer +* Jon Parise -- Protocol buffers lexer +* Ronny Pfannschmidt -- BBCode lexer +* Benjamin Peterson -- Test suite refactoring +* Dominik Picheta -- Nimrod lexer +* Clément Prévost -- UrbiScript lexer +* Kashif Rasul -- CUDA lexer +* Justin Reidy -- MXML lexer +* Norman Richards -- JSON lexer +* Lubomir Rintel -- GoodData MAQL and CL lexers +* Andre Roberge -- Tango style +* Konrad Rudolph -- LaTeX formatter enhancements +* Mario Ruggier -- Evoque lexers +* Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers +* Matteo Sasso -- Common Lisp lexer +* Joe Schafer -- Ada lexer +* Ken Schutte -- Matlab lexers +* Tassilo Schweyer -- Io, MOOCode lexers +* Joerg Sieker -- ABAP lexer +* Robert Simmons -- Standard ML lexer +* Kirill Simonov -- YAML lexer +* Steve Spigarelli -- XQuery lexer +* Jerome St-Louis -- eC lexer +* James Strachan -- Kotlin lexer +* Tiberius Teng -- default style overhaul +* Jeremy Thurgood -- Erlang, Squid config lexers +* Erick Tryzelaar -- Felix lexer +* Daniele Varrazzo -- PostgreSQL lexers +* Abe Voelker -- OpenEdge ABL lexer +* Whitney Young -- ObjectiveC lexer +* Matthias Vallentin -- Bro lexer +* Nathan Weizenbaum -- Haml and Sass lexers +* Dietmar Winkler -- Modelica lexer +* Nils Winter -- Smalltalk lexer +* Davy Wybiral -- Clojure lexer +* Diego Zamboni -- CFengine3 lexer +* Alex Zimin -- Nemerle lexer + +Many thanks for all contributions! + +# END pygments/AUTHORS # diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/bin/rougify b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/bin/rougify new file mode 100644 index 000000000000..13f2b1084826 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/bin/rougify @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'pathname' +ROOT_DIR = Pathname.new(__FILE__).dirname.parent +Kernel::load ROOT_DIR.join('lib/rouge.rb') +Kernel::load ROOT_DIR.join('lib/rouge/cli.rb') +Signal.trap('PIPE', 'SYSTEM_DEFAULT') if Signal.list.include? 'PIPE' + +begin + Rouge::CLI.parse(ARGV).run +rescue Rouge::CLI::Error => e + puts e.message + exit e.status +rescue Interrupt + $stderr.puts "\nrouge: interrupted" + exit 2 +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge.rb new file mode 100644 index 000000000000..de016154ae62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge.rb @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# stdlib +require 'pathname' + +# The containing module for Rouge +module Rouge + # cache value in a constant since `__dir__` allocates a new string + # on every call. + LIB_DIR = __dir__.freeze + + class << self + def reload! + Object::send :remove_const, :Rouge + Kernel::load __FILE__ + end + + # Highlight some text with a given lexer and formatter. + # + # @example + # Rouge.highlight('@foo = 1', 'ruby', 'html') + # Rouge.highlight('var foo = 1;', 'js', 'terminal256') + # + # # streaming - chunks become available as they are lexed + # Rouge.highlight(large_string, 'ruby', 'html') do |chunk| + # $stdout.print chunk + # end + def highlight(text, lexer, formatter, &b) + lexer = Lexer.find(lexer) unless lexer.respond_to? :lex + raise "unknown lexer #{lexer}" unless lexer + + formatter = Formatter.find(formatter) unless formatter.respond_to? :format + raise "unknown formatter #{formatter}" unless formatter + + formatter.format(lexer.lex(text), &b) + end + + # Load a file relative to the `lib/rouge` path. + # + # @api private + def load_file(path) + Kernel::load File.join(LIB_DIR, "rouge/#{path}.rb") + end + + # Load the lexers in the `lib/rouge/lexers` directory. + # + # @api private + def load_lexers + # The trailing slash is necessary to avoid lexers being loaded multiple + # times by `Lexers.load_lexer` + lexer_dir = File.join(LIB_DIR, "rouge/lexers/") + Dir.glob(File.join(lexer_dir, '*.rb')).each do |f| + Lexers.load_lexer(f.sub(lexer_dir, '')) + end + end + end +end + +Rouge.load_file 'version' +Rouge.load_file 'util' +Rouge.load_file 'text_analyzer' +Rouge.load_file 'token' + +Rouge.load_file 'lexer' +Rouge.load_file 'regex_lexer' +Rouge.load_file 'template_lexer' + +Rouge.load_lexers + +Rouge.load_file 'guesser' +Rouge.load_file 'guessers/util' +Rouge.load_file 'guessers/glob_mapping' +Rouge.load_file 'guessers/modeline' +Rouge.load_file 'guessers/filename' +Rouge.load_file 'guessers/mimetype' +Rouge.load_file 'guessers/source' +Rouge.load_file 'guessers/disambiguation' + +Rouge.load_file 'formatter' +Rouge.load_file 'formatters/html' +Rouge.load_file 'formatters/html_table' +Rouge.load_file 'formatters/html_pygments' +Rouge.load_file 'formatters/html_legacy' +Rouge.load_file 'formatters/html_linewise' +Rouge.load_file 'formatters/html_line_highlighter' +Rouge.load_file 'formatters/html_line_table' +Rouge.load_file 'formatters/html_inline' +Rouge.load_file 'formatters/terminal256' +Rouge.load_file 'formatters/terminal_truecolor' +Rouge.load_file 'formatters/tex' +Rouge.load_file 'formatters/null' + +Rouge.load_file 'theme' +Rouge.load_file 'tex_theme_renderer' +Rouge.load_file 'themes/thankful_eyes' +Rouge.load_file 'themes/colorful' +Rouge.load_file 'themes/base16' +Rouge.load_file 'themes/github' +Rouge.load_file 'themes/igor_pro' +Rouge.load_file 'themes/monokai' +Rouge.load_file 'themes/molokai' +Rouge.load_file 'themes/monokai_sublime' +Rouge.load_file 'themes/gruvbox' +Rouge.load_file 'themes/tulip' +Rouge.load_file 'themes/pastie' +Rouge.load_file 'themes/bw' +Rouge.load_file 'themes/magritte' diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/cli.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/cli.rb new file mode 100644 index 000000000000..560025e4f30d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/cli.rb @@ -0,0 +1,528 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# not required by the main lib. +# to use this module, require 'rouge/cli'. + +require 'rbconfig' + +module Rouge + class FileReader + attr_reader :input + def initialize(input) + @input = input + end + + def file + case input + when '-' + IO.new($stdin.fileno, 'rt:bom|utf-8') + when String + File.new(input, 'rt:bom|utf-8') + when ->(i){ i.respond_to? :read } + input + end + end + + def read + @read ||= begin + file.read + rescue => e + $stderr.puts "unable to open #{input}: #{e.message}" + exit 1 + ensure + file.close + end + end + end + + class CLI + def self.doc + return enum_for(:doc) unless block_given? + + yield %|usage: rougify {global options} [command] [args...]| + yield %|| + yield %|where <command> is one of:| + yield %| highlight #{Highlight.desc}| + yield %| debug #{Debug.desc}| + yield %| help #{Help.desc}| + yield %| style #{Style.desc}| + yield %| list #{List.desc}| + yield %| guess #{Guess.desc}| + yield %| version #{Version.desc}| + yield %|| + yield %|global options:| + yield %[ --require|-r <fname> require <fname> after loading rouge] + yield %|| + yield %|See `rougify help <command>` for more info.| + end + + class Error < StandardError + attr_reader :message, :status + def initialize(message, status=1) + @message = message + @status = status + end + end + + def self.parse(argv=ARGV) + argv = normalize_syntax(argv) + + while (head = argv.shift) + case head + when '-h', '--help', 'help', '-help' + return Help.parse(argv) + when '--require', '-r' + require argv.shift + else + break + end + end + + klass = class_from_arg(head) + return klass.parse(argv) if klass + + argv.unshift(head) if head + Highlight.parse(argv) + end + + def initialize(options={}) + end + + def self.error!(msg, status=1) + raise Error.new(msg, status) + end + + def error!(*a) + self.class.error!(*a) + end + + def self.class_from_arg(arg) + case arg + when 'version', '--version', '-v' + Version + when 'help', nil + Help + when 'highlight', 'hi' + Highlight + when 'debug' + Debug + when 'style' + Style + when 'list' + List + when 'guess' + Guess + end + end + + class Version < CLI + def self.desc + "print the rouge version number" + end + + def self.parse(*); new; end + + def run + puts Rouge.version + end + end + + class Help < CLI + def self.desc + "print help info" + end + + def self.doc + return enum_for(:doc) unless block_given? + + yield %|usage: rougify help <command>| + yield %|| + yield %|print help info for <command>.| + end + + def self.parse(argv) + opts = { :mode => CLI } + until argv.empty? + arg = argv.shift + klass = class_from_arg(arg) + if klass + opts[:mode] = klass + next + end + end + new(opts) + end + + def initialize(opts={}) + @mode = opts[:mode] + end + + def run + @mode.doc.each(&method(:puts)) + end + end + + class Highlight < CLI + def self.desc + "highlight code" + end + + def self.doc + return enum_for(:doc) unless block_given? + + yield %[usage: rougify highlight <filename> [options...]] + yield %[ rougify highlight [options...]] + yield %[] + yield %[--input-file|-i <filename> specify a file to read, or - to use stdin] + yield %[] + yield %[--lexer|-l <lexer> specify the lexer to use.] + yield %[ If not provided, rougify will try to guess] + yield %[ based on --mimetype, the filename, and the] + yield %[ file contents.] + yield %[] + yield %[--formatter|-f <opts> specify the output formatter to use.] + yield %[ If not provided, rougify will default to] + yield %[ terminal256.] + yield %[] + yield %[--theme|-t <theme> specify the theme to use for highlighting] + yield %[ the file. (only applies to some formatters)] + yield %[] + yield %[--mimetype|-m <mimetype> specify a mimetype for lexer guessing] + yield %[] + yield %[--lexer-opts|-L <opts> specify lexer options in CGI format] + yield %[ (opt1=val1&opt2=val2)] + yield %[] + yield %[--formatter-opts|-F <opts> specify formatter options in CGI format] + yield %[ (opt1=val1&opt2=val2)] + yield %[] + yield %[--require|-r <filename> require a filename or library before] + yield %[ highlighting] + yield %[] + yield %[--escape allow the use of escapes between <! and !>] + yield %[] + yield %[--escape-with <l> <r> allow the use of escapes between custom] + yield %[ delimiters. implies --escape] + end + + # There is no consistent way to do this, but this is used elsewhere, + # and we provide explicit opt-in and opt-out with $COLORTERM + def self.supports_truecolor? + return true if %w(24bit truecolor).include?(ENV['COLORTERM']) + return false if ENV['COLORTERM'] && ENV['COLORTERM'] =~ /256/ + + if RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ + ENV['ConEmuANSI'] == 'ON' && !ENV['ANSICON'] + else + ENV['TERM'] !~ /(^rxvt)|(-color$)/ + end + end + + def self.parse_opts(argv) + opts = { + :formatter => supports_truecolor? ? 'terminal-truecolor' : 'terminal256', + :theme => 'thankful_eyes', + :css_class => 'codehilite', + :input_file => '-', + :lexer_opts => {}, + :formatter_opts => {}, + :requires => [], + } + + until argv.empty? + arg = argv.shift + case arg + when '-r', '--require' + opts[:requires] << argv.shift + when '--input-file', '-i' + opts[:input_file] = argv.shift + when '--mimetype', '-m' + opts[:mimetype] = argv.shift + when '--lexer', '-l' + opts[:lexer] = argv.shift + when '--formatter-preset', '-f' + opts[:formatter] = argv.shift + when '--theme', '-t' + opts[:theme] = argv.shift + when '--css-class', '-c' + opts[:css_class] = argv.shift + when '--lexer-opts', '-L' + opts[:lexer_opts] = parse_cgi(argv.shift) + when '--escape' + opts[:escape] = ['<!', '!>'] + when '--escape-with' + opts[:escape] = [argv.shift, argv.shift] + when /^--/ + error! "unknown option #{arg.inspect}" + else + opts[:input_file] = arg + end + end + + opts + end + + def self.parse(argv) + new(parse_opts(argv)) + end + + def input_stream + @input_stream ||= FileReader.new(@input_file) + end + + def input + @input ||= input_stream.read + end + + def lexer_class + @lexer_class ||= Lexer.guess( + :filename => @input_file, + :mimetype => @mimetype, + :source => input_stream, + ) + end + + def raw_lexer + lexer_class.new(@lexer_opts) + end + + def escape_lexer + Rouge::Lexers::Escape.new( + start: @escape[0], + end: @escape[1], + lang: raw_lexer, + ) + end + + def lexer + @lexer ||= @escape ? escape_lexer : raw_lexer + end + + attr_reader :input_file, :lexer_name, :mimetype, :formatter, :escape + + def initialize(opts={}) + Rouge::Lexer.enable_debug! + + opts[:requires].each do |r| + require r + end + + @input_file = opts[:input_file] + + if opts[:lexer] + @lexer_class = Lexer.find(opts[:lexer]) \ + or error! "unknown lexer #{opts[:lexer].inspect}" + else + @lexer_name = opts[:lexer] + @mimetype = opts[:mimetype] + end + + @lexer_opts = opts[:lexer_opts] + + theme = Theme.find(opts[:theme]).new or error! "unknown theme #{opts[:theme]}" + + # TODO: document this in --help + @formatter = case opts[:formatter] + when 'terminal256' then Formatters::Terminal256.new(theme) + when 'terminal-truecolor' then Formatters::TerminalTruecolor.new(theme) + when 'html' then Formatters::HTML.new + when 'html-pygments' then Formatters::HTMLPygments.new(Formatters::HTML.new, opts[:css_class]) + when 'html-inline' then Formatters::HTMLInline.new(theme) + when 'html-line-table' then Formatters::HTMLLineTable.new(Formatters::HTML.new) + when 'html-table' then Formatters::HTMLTable.new(Formatters::HTML.new) + when 'null', 'raw', 'tokens' then Formatters::Null.new + when 'tex' then Formatters::Tex.new + else + error! "unknown formatter preset #{opts[:formatter]}" + end + + @escape = opts[:escape] + end + + def run + Formatter.enable_escape! if @escape + formatter.format(lexer.lex(input), &method(:print)) + end + + private_class_method + def self.parse_cgi(str) + pairs = CGI.parse(str).map { |k, v| [k.to_sym, v.first] } + Hash[pairs] + end + end + + class Debug < Highlight + def self.desc + end + + def self.doc + return enum_for(:doc) unless block_given? + + yield %|usage: rougify debug [<options>]| + yield %|| + yield %|Debug a lexer. Similar options to `rougify highlight`, but| + yield %|defaults to the `null` formatter, and ensures the `debug`| + yield %|option is enabled, to print debugging information to stdout.| + end + + def self.parse_opts(argv) + out = super(argv) + out[:lexer_opts]['debug'] = '1' + out[:formatter] = 'null' + + out + end + end + + class Style < CLI + def self.desc + "print CSS styles" + end + + def self.doc + return enum_for(:doc) unless block_given? + + yield %|usage: rougify style [<theme-name>] [<options>]| + yield %|| + yield %|Print CSS styles for the given theme. Extra options are| + yield %|passed to the theme. To select a mode (light/dark) for the| + yield %|theme, append '.light' or '.dark' to the <theme-name>| + yield %|respectively. Theme defaults to thankful_eyes.| + yield %|| + yield %|options:| + yield %| --scope (default: .highlight) a css selector to scope by| + yield %| --tex (default: false) render as TeX| + yield %| --tex-prefix (default: RG) a command prefix for TeX| + yield %| implies --tex if specified| + yield %|| + yield %|available themes:| + yield %| #{Theme.registry.keys.sort.join(', ')}| + end + + def self.parse(argv) + opts = { + :theme_name => 'thankful_eyes', + :tex => false, + :tex_prefix => 'RG' + } + + until argv.empty? + arg = argv.shift + case arg + when '--tex' + opts[:tex] = true + when '--tex-prefix' + opts[:tex] = true + opts[:tex_prefix] = argv.shift + when /--(\w+)/ + opts[$1.tr('-', '_').to_sym] = argv.shift + else + opts[:theme_name] = arg + end + end + + new(opts) + end + + def initialize(opts) + theme_name = opts.delete(:theme_name) + theme_class = Theme.find(theme_name) \ + or error! "unknown theme: #{theme_name}" + + @theme = theme_class.new(opts) + if opts[:tex] + tex_prefix = opts[:tex_prefix] + @theme = TexThemeRenderer.new(@theme, prefix: tex_prefix) + end + end + + def run + @theme.render(&method(:puts)) + end + end + + class List < CLI + def self.desc + "list available lexers" + end + + def self.doc + return enum_for(:doc) unless block_given? + + yield %|usage: rouge list| + yield %|| + yield %|print a list of all available lexers with their descriptions.| + end + + def self.parse(argv) + new + end + + def run + puts "== Available Lexers ==" + + Lexer.all.sort_by(&:tag).each do |lexer| + desc = String.new("#{lexer.desc}") + if lexer.aliases.any? + desc << " [aliases: #{lexer.aliases.join(',')}]" + end + puts "%s: %s" % [lexer.tag, desc] + + lexer.option_docs.keys.sort.each do |option| + puts " ?#{option}= #{lexer.option_docs[option]}" + end + + puts + end + end + end + + class Guess < CLI + def self.desc + "guess the languages of file" + end + + def self.parse(args) + new(input_file: args.shift) + end + + attr_reader :input_file, :input_source + + def initialize(opts) + @input_file = opts[:input_file] || '-' + @input_source = FileReader.new(@input_file).read + end + + def lexers + Lexer.guesses( + filename: input_file, + source: input_source, + ) + end + + def run + lexers.each do |l| + puts "{ tag: #{l.tag.inspect}, title: #{l.title.inspect}, desc: #{l.desc.inspect} }" + end + end + end + + + private_class_method + def self.normalize_syntax(argv) + out = [] + argv.each do |arg| + case arg + when /^(--\w+)=(.*)$/ + out << $1 << $2 + when /^(-\w)(.+)$/ + out << $1 << $2 + else + out << arg + end + end + + out + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/abap b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/abap new file mode 100644 index 000000000000..1f0171bb9142 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/abap @@ -0,0 +1,6 @@ +lo_obj ?= lo_obj->do_nothing( 'Char' && ` String` ). + +SELECT SINGLE * FROM mara INTO ls_mara WHERE matkl EQ '1324'. +LOOP AT lt_mara ASSIGNING <mara>. + CHECK <mara>-mtart EQ '0001'. +ENDLOOP. diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/actionscript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/actionscript new file mode 100644 index 000000000000..f081e25cc9d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/actionscript @@ -0,0 +1,4 @@ +function hello(name:String):void +{ + trace("hello " + name); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ada b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ada new file mode 100644 index 000000000000..36182fbc4c4a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ada @@ -0,0 +1,26 @@ +with Ada.Directories; +with Ada.Direct_IO; +with Ada.Text_IO; + +procedure Extra_IO.Read_File (Name : String) is + + package Dirs renames Ada.Directories; + package Text_IO renames Ada.Text_IO; + + -- Get the size of the file for a new string. + Size : Natural := Natural (Dirs.Size (Name)); + subtype File_String is String (1 .. Size); + + -- Instantiate Direct_IO for our file type. + package FIO is new Ada.Direct_IO (File_String); + + File : FIO.File_Type; + Contents : File_String; + +begin + FIO.Open (File, FIO.In_File, Name); + FIO.Read (File, Contents); + FIO.Close (File); + + Text_IO.Put (Contents); +end Extra_IO.Read_File; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/apache b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/apache new file mode 100644 index 000000000000..ce3e5fc95239 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/apache @@ -0,0 +1,21 @@ +AddDefaultCharset UTF-8 + +RewriteEngine On + +# Serve gzipped version if available and accepted +AddEncoding x-gzip .gz +RewriteCond %{HTTP:Accept-Encoding} gzip +RewriteCond %{REQUEST_FILENAME}.gz -f +RewriteRule ^(.*)$ $1.gz [QSA,L] +<FilesMatch \.css\.gz$> + ForceType text/css + Header append Vary Accept-Encoding +</FilesMatch> +<FilesMatch \.js\.gz$> + ForceType application/javascript + Header append Vary Accept-Encoding +</FilesMatch> +<FilesMatch \.html\.gz$> + ForceType text/html + Header append Vary Accept-Encoding +</FilesMatch> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/apex b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/apex new file mode 100644 index 000000000000..5b23b00e7dc1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/apex @@ -0,0 +1,9 @@ +public class with sharing Trigger { + @Deprecated + public void resolveSum(int x, int y) { + System.debug('x is ' + x); + System.debug('y is ' + y); + + System.debug('x + y = ' + (x+y)); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/apiblueprint b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/apiblueprint new file mode 100644 index 000000000000..25dc577726fb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/apiblueprint @@ -0,0 +1,33 @@ +FORMAT: 1A +HOST: http://polls.apiblueprint.org/ + +# Polls + +Polls is a simple API allowing consumers to view polls and vote in them. + +# Polls API Root [/] + +## Group Question + +Resources related to questions in the API. + +## Question [/questions/{question_id}] + ++ Parameters + + question_id: 1 (number, required) - ID of the Question in form of an integer + ++ Attributes + + question: `Favourite programming language?` (required) + + published_at: `2014-11-11T08:40:51.620Z` - An ISO8601 date when the question was published + + choices (array[Choice], required) - An array of Choice objects + + url: /questions/1 + +### View a Questions Detail [GET] + ++ Response 200 (application/json) + + Attributes (Question) + +### Delete a Question [DELETE] + ++ Relation: delete ++ Response 204 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/applescript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/applescript new file mode 100644 index 000000000000..c824919abd36 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/applescript @@ -0,0 +1,2 @@ +-- AppleScript playing with iTunes +tell application "iTunes" to get current selection diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/armasm b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/armasm new file mode 100644 index 000000000000..b8bdf654b95c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/armasm @@ -0,0 +1,12 @@ + GET common.s + +RetVal * 0x123 :SHL: 4 + + AREA |Area$$Name|, CODE, READONLY + +MyFunction ROUT ; This is a comment + ASSERT RetVal <> 0 +1 MOVW r0, #RetVal + BX lr + + END diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/augeas b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/augeas new file mode 100644 index 000000000000..8f0ab0c4292c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/augeas @@ -0,0 +1,16 @@ +(* + This is a comment +*) +module Foo = +autoload xfm + +let a = b | c . d + +let lns = a* + +let filter = incl "/path/to/file" + . incl "/path/to/other_file" + . Util.stdexcl + +(* xmf is the transform *) +let xmf = transform lns filter diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/awk b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/awk new file mode 100644 index 000000000000..fb6ca7219fec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/awk @@ -0,0 +1,4 @@ +BEGIN { # Simulate echo(1) + for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i] + printf "\n" + exit } diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/batchfile b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/batchfile new file mode 100644 index 000000000000..9426eb47ad61 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/batchfile @@ -0,0 +1,3 @@ +@echo off +setlocal enableextensions enabledelayedexpansion +for /f "tokens=*" %%a in ("hello !username! hi") do echo %%~a diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bbcbasic b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bbcbasic new file mode 100644 index 000000000000..5737a5f45815 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bbcbasic @@ -0,0 +1,6 @@ +REM > DefaultFilename +REM Ordinary comment +FOR n=1 TO 10 +PRINTTAB(n)"Hello there ";FNnumber(n)DIV3+1 +NEXT:END +DEFFNnumber(x%)=ABS(x%-4) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bibtex b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bibtex new file mode 100644 index 000000000000..e029265881a4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bibtex @@ -0,0 +1,12 @@ +@article{Witten:1988hf, + author = "Witten, Edward", + title = "{Quantum Field Theory and the Jones Polynomial}", + journal = "Commun. Math. Phys.", + volume = "121", + year = "1989", + pages = "351-399", + doi = "10.1007/BF01217730", + note = "[,233(1988)]", + reportNumber = "IASSNS-HEP-88-33", + SLACcitation = "%%CITATION = CMPHA,121,351;%%" +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/biml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/biml new file mode 100644 index 000000000000..e4d5f68d8783 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/biml @@ -0,0 +1,38 @@ +<#@ template language="C#" #> +<#@ import namespace="System.Data" #> +<Biml xmlns="http://schemas.varigence.com/biml.xsd"> + <Connections> + <!-- Creates a connection to the Adventure Works database --> + <Connection + Name="AdventureWorks" + ConnectionString="Provider=SQLNCLI10.1;Data Source=Localhost;Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=AdventureWorksDW" + /> + </Connections> + <!-- Packages Collection --> + <Packages> + <!-- A Package --> + <Package + Name="MyFirstPackage" + ConstraintMode="Linear" + > + <!-- A Package's Tasks --> + <Tasks> + <ExecuteSQL Name="ExecuteStoredProc" ConnectionName="AdventureWorks"> + <DirectInput>EXEC usp_StoredProc</DirectInput> + </ExecuteSQL> + <# foreach (var table in RootNode.Tables) { #> + <Dataflow Name="Duplicate <#=table.Name#> Data"> + <Transformations> + <OleDbSource Name="Retrieve Data" ConnectionName="AdventureWorks"> + <DirectInput>SELECT * FROM <#=table.Name#></DirectInput> + </OleDbSource> + <OleDbDestination Name="Insert Data" ConnectionName="AdventureWorks"> + <ExternalTableOutput Table="<#=table.Name#>" /> + </OleDbDestination> + </Transformations> + </Dataflow> + <# } #> + </Tasks> + </Package> + </Packages> +</Biml> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bpf b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bpf new file mode 100644 index 000000000000..45c208325a02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bpf @@ -0,0 +1,7 @@ +r0 = *(u8 *)skb[23] +*(u32 *)(r10 - 4) = r0 +r1 = *(u32 *)(r6 + 4) +r1 = 0 ll +call 1 /* lookup */ +if r0 == 0 goto +2 <LBB0_3> +lock *(u64 *)(r0 + 0) += r1 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/brainfuck b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/brainfuck new file mode 100644 index 000000000000..8021cc136a02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/brainfuck @@ -0,0 +1,5 @@ +[ + This is a sample + comment. +] +.[>+<-]>, \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/brightscript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/brightscript new file mode 100644 index 000000000000..b702649e0127 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/brightscript @@ -0,0 +1,6 @@ +function main(args as dynamic) as void + screen = CreateObject("roSGScreen") + 'Create a scene and load /components/helloworld.xml' + scene = screen.CreateScene("HelloWorld") + screen.show() +end function \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bsl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bsl new file mode 100644 index 000000000000..a71bca25c3ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/bsl @@ -0,0 +1,7 @@ +#Область ПрограммныйИнтерфейс + +Процедура ПриветМир() Экспорт + Сообщить("Привет мир"); +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/c b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/c new file mode 100644 index 000000000000..34771c8c2c0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/c @@ -0,0 +1,8 @@ +#include "ruby/ruby.h" + +static int +clone_method_i(st_data_t key, st_data_t value, st_data_t data) +{ + clone_method((VALUE)data, (ID)key, (const rb_method_entry_t *)value); + return ST_CONTINUE; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ceylon b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ceylon new file mode 100644 index 000000000000..fcf19e0b734e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ceylon @@ -0,0 +1,7 @@ +shared class CeylonClass<Parameter>() + given Parameter satisfies Object { + + shared String name => "CeylonClass"; +} + +shared void run() => CeylonClass(); diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cfscript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cfscript new file mode 100644 index 000000000000..90064168131a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cfscript @@ -0,0 +1,18 @@ +component accessors="true" { + + property type="string" name="firstName" default=""; + property string username; + + function init(){ + return this; + } + + public any function submitOrder( required product, coupon="", boolean results=true ){ + + var foo = function( required string baz, x=true, y=false ){ + return "bar!"; + }; + + return foo; + } +} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/clean b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/clean new file mode 100644 index 000000000000..9f947f6388ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/clean @@ -0,0 +1,6 @@ +delete :: !a !.(Set a) -> Set a | < a +delete x Tip = Tip +delete x (Bin _ y l r) + | x < y = balanceR y (delete x l) r + | x > y = balanceL y l (delete x r) + | otherwise = glue l r diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/clojure b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/clojure new file mode 100644 index 000000000000..a9b682e7e27a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/clojure @@ -0,0 +1,5 @@ +(defn make-adder [x] + (let [y x] + (fn [z] (+ y z)))) +(def add2 (make-adder 2)) +(add2 4) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cmake b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cmake new file mode 100644 index 000000000000..89fcc51570e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cmake @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 2.8.3) + +project(foo C) + +# some note +add_executable(foo utils.c "foo.c") +target_link_libraries(foo ${LIBRARIES}) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cmhg b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cmhg new file mode 100644 index 000000000000..76eeaf9190aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cmhg @@ -0,0 +1,8 @@ +; Header comments + +#include "definitions.h" + +command-keyword-table: command_handler + foo(min-args:0, max-args:0,; comment + international:, + invalid-syntax: "syntaxtoken" help-text: "helptoken") diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/coffeescript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/coffeescript new file mode 100644 index 000000000000..a562db64154f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/coffeescript @@ -0,0 +1,5 @@ +# Objects: +math = + root: Math.sqrt + square: square + cube: (x) -> x * square x diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/common_lisp b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/common_lisp new file mode 100644 index 000000000000..c6d2861c1906 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/common_lisp @@ -0,0 +1 @@ +(defun square (x) (* x x)) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/conf b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/conf new file mode 100644 index 000000000000..5386d4ed15d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/conf @@ -0,0 +1,4 @@ +# A generic configuration file +option1 "val1" +option2 23 +option3 'val3' diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/console b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/console new file mode 100644 index 000000000000..9d6ed1c9e681 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/console @@ -0,0 +1,6 @@ +# prints "hello, world" to the screen +~# echo Hello, World +Hello, World + +# don't run this +~# rm -rf --no-preserve-root / diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/coq b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/coq new file mode 100644 index 000000000000..1d8d68ff3d14 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/coq @@ -0,0 +1,13 @@ +Require Import Coq.Lists.List. + +Section with_T. + Context {T : Type}. + + Fixpoint length (ls : list T) : nat := + match ls with + | nil => 0 + | _ :: ls => S (length ls) + end. +End with_T. + +Definition a_string := "hello \" world". \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cpp b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cpp new file mode 100644 index 000000000000..c20cf27c7c7c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cpp @@ -0,0 +1,8 @@ +#include<iostream> + +using namespace std; + +int main() +{ + cout << "Hello World" << endl; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/crystal b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/crystal new file mode 100644 index 000000000000..988753e96dc1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/crystal @@ -0,0 +1,45 @@ +lib LibC + WNOHANG = 0x00000001 + + @[ReturnsTwice] + fun fork : PidT + fun getpgid(pid : PidT) : PidT + fun kill(pid : PidT, signal : Int) : Int + fun getpid : PidT + fun getppid : PidT + fun exit(status : Int) : NoReturn + + ifdef x86_64 + alias ClockT = UInt64 + else + alias ClockT = UInt32 + end + + SC_CLK_TCK = 3 + + struct Tms + utime : ClockT + stime : ClockT + cutime : ClockT + cstime : ClockT + end + + fun times(buffer : Tms*) : ClockT + fun sysconf(name : Int) : Long +end + +class Process + def self.exit(status = 0) + LibC.exit(status) + end + + def self.pid + LibC.getpid + end + + def self.getpgid(pid : Int32) + ret = LibC.getpgid(pid) + raise Errno.new(ret) if ret < 0 + ret + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/csharp b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/csharp new file mode 100644 index 000000000000..04e4a8ee7b4d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/csharp @@ -0,0 +1,5 @@ +// reverse byte order (16-bit) +public static UInt16 ReverseBytes(UInt16 value) +{ + return (UInt16)((value & 0xFFU) << 8 | (value & 0xFF00U) >> 8); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/css b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/css new file mode 100644 index 000000000000..0d1fe74b9cb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/css @@ -0,0 +1,4 @@ +body { + font-size: 12pt; + background: #fff url(temp.png) top left no-repeat; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/csvs b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/csvs new file mode 100644 index 000000000000..c32906550864 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/csvs @@ -0,0 +1,8 @@ +version 1.1 +@totalColumns 5 +@separator ',' +Transaction_Date: xDate +Transaction_ID: notEmpty +Originator_Name: notEmpty +Originator_Address: any("yes","no") +Originator_Country: notEmpty \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cuda b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cuda new file mode 100644 index 000000000000..6f9fa56fcf88 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cuda @@ -0,0 +1,11 @@ +#include <cstdio> + +__global__ void helloFromGPU() { + std::printf("Hello World\n"); + __syncthreads(); +} + +int main() { + dim3 block(1, 10); + helloFromGPU<<<1, block>>>(); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cypher b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cypher new file mode 100644 index 000000000000..098df7c9ad9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cypher @@ -0,0 +1,5 @@ +// Cypher Mode for Rouge +CREATE (john:Person {name: 'John'}) +MATCH (user)-[:friend]->(follower) +WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*' +RETURN user.name, follower.name diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cython b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cython new file mode 100644 index 000000000000..be57661074ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/cython @@ -0,0 +1,6 @@ +cdef extern from 'foo.h': + int foo_int + struct foo_struct: + pass + +ctypedef int word diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/d b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/d new file mode 100644 index 000000000000..65d494503f0e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/d @@ -0,0 +1,16 @@ +import std.algorithm, std.conv, std.functional, + std.math, std.regex, std.stdio; + +alias round = pipe!(to!real, std.math.round, to!string); +static reFloatingPoint = ctRegex!`[0-9]+\.[0-9]+`; + +void main() +{ + // Replace anything that looks like a real + // number with the rounded equivalent. + stdin + .byLine + .map!(l => l.replaceAll!(c => c.hit.round) + (reFloatingPoint)) + .each!writeln; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/dart b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/dart new file mode 100644 index 000000000000..4b40da537f40 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/dart @@ -0,0 +1,6 @@ +void main() { + var collection=[1,2,3,4,5]; + for(var a in collection){ + print(a); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/datastudio b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/datastudio new file mode 100644 index 000000000000..7c1de9053320 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/datastudio @@ -0,0 +1,21 @@ + +Get_Variable("EUSER","ENV","USERNAME"); + +Message("Le Login Windows est : %EUSER%"); + +Get_Variable("st","JOB","FOLDER1.date_err.SYSTEM.STATUS"); + + +AFFECT("filter1", '%%/"t"'); +AFFECT("filter2", '%%/"pi"'); +JSONTOSQL("%{jsonpath}%/file.json", "", + " JSONPATH like '%filter1%' ", "a = JSONVALUE", + " JSONPATH like '%filter2%' ", "b = JSONVALUE; output(json_data, a, b)"); + + +Affect(VAR1,'%TEST%'); //Créer et affecter la variable VAR1 avec une chaîne +select * from TABLE1 where COL1 like %VAR1%; //utiliser la variable VAR1 dans une requête + +select * from TEST_TABLE; //exécution d'une requête Select pour ramener des valeurs +Affect_LastColumns("TEST1"); //création du paramètre TEST1 + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/diff b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/diff new file mode 100644 index 000000000000..ab4f3162f171 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/diff @@ -0,0 +1,7 @@ +--- file1 2012-10-16 15:07:58.086886874 +0100 ++++ file2 2012-10-16 15:08:07.642887236 +0100 +@@ -1,3 +1,3 @@ + a b c +-d e f ++D E F + g h i diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/digdag b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/digdag new file mode 100644 index 000000000000..f7dbad0a4fe8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/digdag @@ -0,0 +1,19 @@ +# this is digdag task definitions +timezone: UTC + ++setup: + echo>: start ${session_time} + ++disp_current_date: + echo>: ${moment(session_time).utc().format('YYYY-MM-DD HH:mm:ss Z')} + ++repeat: + for_each>: + order: [first, second, third] + animal: [dog, cat] + _do: + echo>: ${order} ${animal} + _parallel: true + ++teardown: + echo>: finish ${session_time} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/docker b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/docker new file mode 100644 index 000000000000..656d2bc1d8af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/docker @@ -0,0 +1,9 @@ +maintainer First O'Last + +run echo \ + 123 $bar +# comment +onbuild add . /app/src +onbuild run echo \ + 123 $bar +CMD /bin/bash diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/dot b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/dot new file mode 100644 index 000000000000..243ee731d2d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/dot @@ -0,0 +1,5 @@ +// The graph name and the semicolons are optional +graph G { + a -- b -- c; + b -- d; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ecl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ecl new file mode 100644 index 000000000000..596ac54cef51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ecl @@ -0,0 +1,18 @@ +/* + Example code - use without restriction. +*/ +Layout_Person := RECORD + UNSIGNED1 PersonID; + STRING15 FirstName; + STRING25 LastName; +END; + +allPeople := DATASET([ {1,'Fred','Smith'}, + {2,'Joe','Blow'}, + {3,'Jane','Smith'}],Layout_Person); + +somePeople := allPeople(LastName = 'Smith'); + +// Outputs --- +somePeople; + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/eex b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/eex new file mode 100644 index 000000000000..1f922b6743f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/eex @@ -0,0 +1 @@ +<title><%= @title %></title> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/eiffel b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/eiffel new file mode 100644 index 000000000000..ec025cc9e104 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/eiffel @@ -0,0 +1,30 @@ +note + description: "Represents a person." + +class + PERSON + +create + make, make_unknown + +feature {NONE} -- Creation + + make (a_name: like name) + -- Create a person with `a_name' as `name'. + do + name := a_name + ensure + name = a_name + end + + make_unknown + do ensure + name = Void + end + +feature -- Access + + name: detachable STRING + -- Full name or Void if unknown. + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/elixir b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/elixir new file mode 100644 index 000000000000..f81d641399b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/elixir @@ -0,0 +1 @@ +Enum.map([1,2,3], fn(x) -> x * 2 end) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/elm b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/elm new file mode 100644 index 000000000000..8d38380514f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/elm @@ -0,0 +1,4 @@ +import Html exposing (text) + +main = + text "Hello, World!" diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/email b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/email new file mode 100644 index 000000000000..b355729347f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/email @@ -0,0 +1,11 @@ +From: Me <me@example.com> +To: You <you@example.com> +Date: Tue, 21 Jul 2020 15:14:03 +0000 +Subject: A very important message + +> Please investigate. Thank you. + +I have investigated. + +-- +This message is highly confidential and will self-destruct. diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/epp b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/epp new file mode 100644 index 000000000000..e8dececdd89d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/epp @@ -0,0 +1,4 @@ +<%- | + Optional[String] $title, +| -%> +<title><%= $title %></title> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/erb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/erb new file mode 100644 index 000000000000..1f922b6743f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/erb @@ -0,0 +1 @@ +<title><%= @title %></title> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/erlang b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/erlang new file mode 100644 index 000000000000..c942b606f3be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/erlang @@ -0,0 +1,7 @@ +%%% Geometry module. +-module(geometry). +-export([area/1]). + +%% Compute rectangle and circle area. +area({rectangle, Width, Ht}) -> Width * Ht; +area({circle, R}) -> 3.14159 * R * R. \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/escape b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/escape new file mode 100644 index 000000000000..b71d6b3e864b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/escape @@ -0,0 +1,3 @@ +If Formatter.enable_escape! is called, this allows escaping into html +or the parent format with a special delimiter. For example: +<!<span style="text-decoration: underline">!>underlined text!<!</span>!> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/factor b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/factor new file mode 100644 index 000000000000..2538dff29b21 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/factor @@ -0,0 +1,5 @@ +USING: io kernel sequences ; + +4 iota [ + "Happy Birthday " write 2 = "dear NAME" "to You" ? print +] each diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/fortran b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/fortran new file mode 100644 index 000000000000..4fc52c510a72 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/fortran @@ -0,0 +1,22 @@ +program bottles + + implicit none + integer :: nbottles + + do nbottles = 99, 1, -1 + call print_bottles(nbottles) + end do + +contains + + subroutine print_bottles(n) + implicit none + integer, intent(in) :: n + + write(*, "(I0, 1X, 'bottles of beer on the wall,')") n + write(*, "(I0, 1X, 'bottles of beer.')") n + write(*, "('Take one down, pass it around,')") + write(*, "(I0, 1X, 'bottles of beer on the wall.', /)") n - 1 + end subroutine print_bottles + +end program bottles diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/freefem b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/freefem new file mode 100644 index 000000000000..9205675dd884 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/freefem @@ -0,0 +1,16 @@ +include "MUMPS" + +// Parameters +func f = 1.; + +// Mesh +int nn = 25; //Mesh quality +mesh Th = square(nn, nn); + +// Fespace +func Pk = P2; +fespace Uh(Th, Pk); +Uh u; + +// Plot +plot(u, nbiso=30, fill=true, value=true, cmm="A"); diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/fsharp b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/fsharp new file mode 100644 index 000000000000..b1812eec8a89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/fsharp @@ -0,0 +1,12 @@ +(* Binary tree with leaves car­rying an integer. *) +type Tree = Leaf of int | Node of Tree * Tree + +let rec existsLeaf test tree = + match tree with + | Leaf v -> test v + | Node (left, right) -> + existsLeaf test left + || existsLeaf test right + +let hasEvenLeaf tree = + existsLeaf (fun n -> n % 2 = 0) tree \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/gdscript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/gdscript new file mode 100644 index 000000000000..72ba52c44415 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/gdscript @@ -0,0 +1,18 @@ +extends Node + +# Variables & Built-in Types + +var a = 5 +var b = true +var s = "Hello" +var arr = [1, 2, 3] + +# Constants & Enums + +const ANSWER = 42 +enum { UNIT_NEUTRAL, UNIT_ENEMY, UNIT_ALLY } + +# Functions + +func _ready(): + print("Hello, World") diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ghc-cmm b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ghc-cmm new file mode 100644 index 000000000000..72b764e81db5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ghc-cmm @@ -0,0 +1,23 @@ +[lvl_s4t3_entry() // [R1] + { info_tbls: [(c4uB, + label: lvl_s4t3_info + rep: HeapRep 1 ptrs { Thunk } + srt: Nothing)] + stack_info: arg_space: 8 updfr_space: Just 8 + } + {offset + c4uB: // global + if ((Sp + -32) < SpLim) (likely: False) goto c4uC; else goto c4uD; + c4uC: // global + R1 = R1; + call (stg_gc_enter_1)(R1) args: 8, res: 0, upd: 8; + c4uD: // global + I64[Sp - 16] = stg_upd_frame_info; + P64[Sp - 8] = R1; + R2 = P64[R1 + 16]; + I64[Sp - 32] = stg_ap_p_info; + P64[Sp - 24] = Main.fib3_closure+1; + Sp = Sp - 32; + call GHC.Num.fromInteger_info(R2) args: 40, res: 0, upd: 24; + } + } diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ghc-core b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ghc-core new file mode 100644 index 000000000000..a421f796eb3d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ghc-core @@ -0,0 +1,26 @@ +Rec { +-- RHS size: {terms: 24, types: 3, coercions: 0, joins: 0/0} +Main.fib_fib [Occ=LoopBreaker] :: Integer -> Integer +[GblId, Arity=1, Str=<S,U>, Unf=OtherCon []] +Main.fib_fib + = \ (ds_d2OU :: Integer) -> + case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger# + ds_d2OU Main.fib1 + of { + __DEFAULT -> + case integer-gmp-1.0.2.0:GHC.Integer.Type.eqInteger# + ds_d2OU Main.fib3 + of { + __DEFAULT -> + integer-gmp-1.0.2.0:GHC.Integer.Type.plusInteger + (Main.fib_fib + (integer-gmp-1.0.2.0:GHC.Integer.Type.minusInteger + ds_d2OU Main.fib3)) + (Main.fib_fib + (integer-gmp-1.0.2.0:GHC.Integer.Type.minusInteger + ds_d2OU Main.fib2)); + 1# -> Main.fib3 + }; + 1# -> Main.fib1 + } +end Rec } diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/gherkin b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/gherkin new file mode 100644 index 000000000000..78e4ba6e87c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/gherkin @@ -0,0 +1,17 @@ +# language: en +Feature: Addition + In order to avoid silly mistakes + As someone who has trouble with mental math + I want to be told the sum of two numbers + + Scenario Outline: Add two numbers + Given I have entered <input_1> into the calculator + And I have entered <input_2> into the calculator + When I press <button> + Then the result should be <output> on the screen + + Examples: + | input_1 | input_2 | button | output | + | 20 | 30 | add | 50 | + | 2 | 5 | add | 7 | + | 0 | 40 | add | 40 | diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/glsl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/glsl new file mode 100644 index 000000000000..b2b284ea6dcb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/glsl @@ -0,0 +1,14 @@ +#version 330 core + +uniform mat4 worldMatrix; + +layout(location = 0) in vec2 position; +layout(location = 1) in vec4 color; + +out vec4 vertexColor; + +void main() +{ + vertexColor = color; + gl_Position = vec4(position, 0.0, 1.0); +} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/go b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/go new file mode 100644 index 000000000000..078ddff8f414 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello, 世界") +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/gradle b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/gradle new file mode 100644 index 000000000000..5a191f92cbea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/gradle @@ -0,0 +1,10 @@ +apply plugin: 'java' + +repositories { + jcenter() +} + +dependencies { + compile 'org.openjdk.jmh:jmh-core:1.12' + compile 'org.openjdk.jmh:jmh-generator-annprocess:1.12' +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/graphql b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/graphql new file mode 100644 index 000000000000..2fe9ec174d6d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/graphql @@ -0,0 +1,17 @@ +query myQuery($variable: Boolean) { + # Queries can have comments! + friends(ids: ["a1", "a2"]) { + id + name + + ...someFields + + ... @include(if: $variable) { + foo + } + + ... @skip(if: true) { + bar + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/groovy b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/groovy new file mode 100644 index 000000000000..6be7311c20c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/groovy @@ -0,0 +1,9 @@ +class Greet { + def name + Greet(who) { name = who[0].toUpperCase() + + who[1..-1] } + def salute() { println "Hello $name!" } +} + +g = new Greet('world') // create object +g.salute() // output "Hello World!" diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hack b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hack new file mode 100644 index 000000000000..1e695eaed5df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hack @@ -0,0 +1,5 @@ +<?hh // strict + +async function foo(): Awaitable<string> { + return await (() ==> 'Hello, world')(); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/haml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/haml new file mode 100644 index 000000000000..4dcb687a5050 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/haml @@ -0,0 +1,5 @@ +%section.container + %h1= post.title + %h2= post.subtitle + .content + = post.content diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/handlebars b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/handlebars new file mode 100644 index 000000000000..6dc4a7e2d96d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/handlebars @@ -0,0 +1,7 @@ +<div class="entry"> + <h1>{{title}}</h1> + {{#with story}} + <div class="intro">{{{intro}}}</div> + <div class="body">{{{body}}}</div> + {{/with}} +</div> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/haskell b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/haskell new file mode 100644 index 000000000000..2672159070cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/haskell @@ -0,0 +1,6 @@ +quicksort :: Ord a => [a] -> [a] +quicksort [] = [] +quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater) + where + lesser = filter (< p) xs + greater = filter (>= p) xs diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/haxe b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/haxe new file mode 100644 index 000000000000..6d5799350bc8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/haxe @@ -0,0 +1,5 @@ +// hello world! +public static function hello(arg : String) { + return 'Hello $arg'; +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hcl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hcl new file mode 100644 index 000000000000..42287dae5435 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hcl @@ -0,0 +1,7 @@ +service { + key = "value" +} + +variable "ami" { + description = "the AMI to use" +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hlsl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hlsl new file mode 100644 index 000000000000..487aee0e1cb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hlsl @@ -0,0 +1,20 @@ +struct PSInput +{ + float4 position : SV_POSITION; + float4 color : COLOR; +}; + +// Vertex shader +PSInput VSMain(float4 position : POSITION, float4 color : COLOR) +{ + PSInput result; + result.position = position; + result.color = color; + return result; +} + +// Pixel shader +float4 PSMain(PSInput input) : SV_TARGET +{ + return input.color; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hocon b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hocon new file mode 100644 index 000000000000..c2dbf5ff65e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hocon @@ -0,0 +1,8 @@ +# These are our own config values defined by the app +simple-app { + answer = 42 +} + +# Here we override some values used by a library +simple-lib.foo = "This value comes from simple-app's application.conf" +simple-lib.whatever = "This value comes from simple-app's application.conf" diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hql b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hql new file mode 100644 index 000000000000..5a344d809382 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hql @@ -0,0 +1,5 @@ +SELECT e.first_name, e.last_name, d.department_name +FROM employees e +JOIN departments d ON e.department_id = d.department_id; + +update `table` set name='abc', date=${date}, test_interpolation="${var1}.${var2}" where xyz is null; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/html b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/html new file mode 100644 index 000000000000..9329a3708cf5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/html @@ -0,0 +1,8 @@ +<html> + <head><title>Title!</title></head> + <body> + <p id="foo">Hello, World!</p> + <script type="text/javascript">var a = 1;</script> + <style type="text/css">#foo { font-weight: bold; }</style> + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/http b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/http new file mode 100644 index 000000000000..28bc750b3e0b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/http @@ -0,0 +1,14 @@ +POST /demo/submit/ HTTP/1.1 +Host: rouge.jneen.net +Cache-Control: max-age=0 +Origin: http://rouge.jayferd.us +User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) + AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7 +Content-Type: application/json +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 +Referer: http://pygments.org/ +Accept-Encoding: gzip,deflate,sdch +Accept-Language: en-US,en;q=0.8 +Accept-Charset: windows-949,utf-8;q=0.7,*;q=0.3 + +{"name":"test","lang":"text","boring":true} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hylang b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hylang new file mode 100644 index 000000000000..bf9db3b41334 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/hylang @@ -0,0 +1,10 @@ +(defn simple-conversation [] + (print "Hello! I'd like to get to know you. Tell me about yourself!") + (setv name (input "What is your name? ")) + (let [age (input "What is your age? ")] + (if (and age + name) + (print (+ "Hello " name "! I see you are " + age " years old."))))) + +(simple-conversation) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/idlang b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/idlang new file mode 100644 index 000000000000..49f16afcb3a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/idlang @@ -0,0 +1,8 @@ +for i = 99L, 0, -1 do begin + + print, i, format="(I0, 1X, 'bottles of beer on the wall,')" + print, i, format="(I0, 1X, 'bottles of beer.')" + print, 'Take one down, pass it around,' + print, i, format="(I0, 1X, 'bottles of beer on the wall.', /)" + +endfor diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/igorpro b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/igorpro new file mode 100644 index 000000000000..d4c0feb98d9f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/igorpro @@ -0,0 +1,9 @@ +#pragma TextEncoding = "UTF-8" +#pragma rtGlobals=3 // Use modern global access method and strict wave access. + +Function/WAVE MakeWave(name) + String name + + Make/N=(8,8) root:$name/WAVE=wv = p^2 + q^2 + return wv +End diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ini b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ini new file mode 100644 index 000000000000..f600c915d7c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ini @@ -0,0 +1,4 @@ +; last modified 1 April 2001 by John Doe +[owner] +name=John Doe +organization=Acme Widgets Inc. diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/io b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/io new file mode 100644 index 000000000000..05f0a2096c94 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/io @@ -0,0 +1,11 @@ +bottle := method(i, + if(i==0, return "no more bottles of beer") + if(i==1, return "1 bottle of beer") + return i asString .. " bottles of beer" +) + +for(i, 99, 1, -1, + write(bottle(i), " on the wall, ", bottle(i), ",\n") + write("take one down, pass it around,\n") + write(bottle(i - 1), " on the wall.\n\n") +) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/irb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/irb new file mode 100644 index 000000000000..5dd074ec77ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/irb @@ -0,0 +1,4 @@ +irb(main):001:0> puts "Hello, world!" +Hello, world! +irb(main):002:0> Object.new +=> #<Object:0x0056182cb182b8> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/irb_output b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/irb_output new file mode 100644 index 000000000000..c31a0122108f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/irb_output @@ -0,0 +1,2 @@ +hello world +=> #<Object:0x0056182cb182b8 @foo=#<Object:0x0056182cb63100 @bar=3>> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/isbl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/isbl new file mode 100644 index 000000000000..78605aab7e23 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/isbl @@ -0,0 +1,4 @@ +NameReq = Object.Requisites(SYSREQ_NAME) +if Assigned(NameReq.AsString) + ShowMessage("Привет мир") +endif diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/j b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/j new file mode 100644 index 000000000000..44f96f457264 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/j @@ -0,0 +1,12 @@ +NB. Procedural programming +fizzbuzz=: monad define + for_i. >:i.y do. + if. 0 = 15 | i do. echo'FizzBuzz' + elseif. 0 = 3 | i do. echo'Fizz' + elseif. 0 = 5 | i do. echo'Buzz' + else. echo i + end. + end. +) +NB. Loopless programming +fizzbuzz=: echo@(, ::] ('Fizz' ; 'Buzz') ;@#~ 0 = 3 5&|)@>:@i. diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/janet b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/janet new file mode 100644 index 000000000000..fbf89a071d7f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/janet @@ -0,0 +1,3 @@ +(defn a-fun + "A function" + (do-something)) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/java b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/java new file mode 100644 index 000000000000..0cca61e56e1b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/java @@ -0,0 +1,5 @@ +public class java { + public static void main(String[] args) { + System.out.println("Hello World"); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/javascript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/javascript new file mode 100644 index 000000000000..134a70e87714 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/javascript @@ -0,0 +1 @@ +$(document).ready(function() { alert('ready!'); }); diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jinja b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jinja new file mode 100644 index 000000000000..808cf77c4884 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jinja @@ -0,0 +1,9 @@ +{% extends "layout.html" %} + +{% block body %} + <ul> + {% for user in users %} + <li><a href="{{ user.url }}">{{ user.username }}</a></li> + {% endfor %} + </ul> +{% endblock %} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsl new file mode 100644 index 000000000000..6c3c39f9145b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsl @@ -0,0 +1,3 @@ +// Create Distribution of Big Class +dt = open( "$sample_data\big class.jmp" ); +dt << Distribution( Column( :age ), Histograms Only( 1 ) ); diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/json b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/json new file mode 100644 index 000000000000..eead967ca71b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/json @@ -0,0 +1 @@ +{ "one": 1, "two": 2, "null": null, "simple": true } diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/json-doc b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/json-doc new file mode 100644 index 000000000000..a2a57fe0b116 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/json-doc @@ -0,0 +1 @@ +{ "one": 1, "two": 2, "null": null, "simple": true } // a simple json object diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsonnet b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsonnet new file mode 100644 index 000000000000..510441fee988 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsonnet @@ -0,0 +1,28 @@ +// Compiler template +local CCompiler = { + cFlags: [], + out: "a.out", + local flags_str = std.join(" ", self.cFlags), + local files_str = std.join(" ", self.files), + cmd: "%s %s %s -o %s" % [self.compiler, flags_str, files_str, self.out], +}; + +// GCC specialization +local Gcc = CCompiler { compiler: "gcc" }; + +// Another specialization +local Clang = CCompiler { compiler: "clang" }; + +// Mixins - append flags +local Opt = { cFlags: super.cFlags + ["-O3", "-DNDEBUG"] }; +local Dbg = { cFlags: super.cFlags + ["-g"] }; + +// Output: +{ + targets: [ + Gcc { files: ["a.c", "b.c"] }, + Clang { files: ["test.c"], out: "test" }, + Clang + Opt { files: ["test2.c"], out: "test2" }, + Gcc + Opt + Dbg { files: ["foo.c", "bar.c"], out: "baz" }, + ] +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsp b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsp new file mode 100644 index 000000000000..9f4fb8d1c958 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsp @@ -0,0 +1,29 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page import="java.time.LocalDateTime" %> + +<%! int day = 3; %> + +<!DOCTYPE html> +<html> + <head> + <title>Simple JSP Application</title> + </head> + <body> + <%-- This is a JSP comment --%> + <h1>Hello world!</h1> + <h2>Current time is <%= LocalDateTime.now() %></h2> + + <% if (day == 1 || day == 7) { %> + <p> Today is weekend</p> + <% } else { %> + <p> Today is not weekend</p> + <% } %> + + h2>Using JavaBeans in JSP</h2> + <jsp:useBean id="test" class="action.TestBean" /> + <jsp:setProperty name="test" property="message" value="Hello JSP..." /> + + <p>Got message:</p> + <jsp:getProperty name="test" property="message" /> + </body> +</html> \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsx b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsx new file mode 100644 index 000000000000..1bf7872db4ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/jsx @@ -0,0 +1,17 @@ +var HelloWorld = React.createClass({ + render: function() { + return ( + <p> + Hello, <input type="text" placeholder="Your name here" />! + It is {this.props.date.toTimeString()} + </p> + ); + } +}); + +setInterval(function() { + ReactDOM.render( + <HelloWorld date={new Date()} />, + document.getElementById('example') + ); +}, 500); diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/julia b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/julia new file mode 100644 index 000000000000..fe0e9e8eccba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/julia @@ -0,0 +1,11 @@ +function mandel(z) + c = z + maxiter = 80 + for n = 1:maxiter + if abs(z) > 2 + return n-1 + end + z = z^2 + c + end + return maxiter +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/kotlin b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/kotlin new file mode 100644 index 000000000000..a27b0db02321 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/kotlin @@ -0,0 +1,3 @@ +fun main(args: Array<String>) { + println("Hello, world!") +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lasso b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lasso new file mode 100644 index 000000000000..625112fe5714 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lasso @@ -0,0 +1,12 @@ +/**! + Inserts all of the elements from #rhs into the array. +*/ +define array->+(rhs::trait_forEach) => { + local(a = .asCopy); + #rhs->forEach => { + #a->insert(#1) + } + return (#a) +} + +define array->onCompare(n::null) => 1 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/liquid b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/liquid new file mode 100644 index 000000000000..19ed3af281ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/liquid @@ -0,0 +1,10 @@ +<ul id="products"> + {% for product in products %} + <li> + <h2>{{ product.title }}</h2> + Only {{ product.price | format_as_money }} + + <p>{{ product.description | prettyprint | truncate: 200 }}</p> + </li> + {% endfor %} +</ul> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/literate_coffeescript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/literate_coffeescript new file mode 100644 index 000000000000..0e5f25f77521 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/literate_coffeescript @@ -0,0 +1,3 @@ +Import the helpers we plan to use. + + {extend, last} = require './helpers' diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/literate_haskell b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/literate_haskell new file mode 100644 index 000000000000..10e753565952 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/literate_haskell @@ -0,0 +1,7 @@ +In Bird-style you have to leave a blank before the code. + +> fact :: Integer -> Integer +> fact 0 = 1 +> fact n = n * fact (n-1) + +And you have to leave a blank line after the code as well. diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/livescript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/livescript new file mode 100644 index 000000000000..9daf4db300f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/livescript @@ -0,0 +1,15 @@ +mitch = + age: 21 + height: 180cm + pets: [\dog, \goldfish] + +phile = {} +phile{height, pets} = mitch +phile.height #=> 180 +phile.pets #=> ['dog', 'goldfish'] + +a = [2 7 1 8] + ..push 3 + ..shift! + ..sort! +a #=> [1,3,7,8] diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/llvm b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/llvm new file mode 100644 index 000000000000..c4596a80021f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/llvm @@ -0,0 +1,20 @@ +; copied from http://llvm.org/docs/LangRef.html#module-structure +; Declare the string constant as a global constant. +@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00" + +; External declaration of the puts function +declare i32 @puts(i8* nocapture) nounwind + +; Definition of main function +define i32 @main() { ; i32()* + ; Convert [13 x i8]* to i8 *... + %cast210 = getelementptr [13 x i8]* @.str, i64 0, i64 0 + + ; Call puts function to write out the string to stdout. + call i32 @puts(i8* %cast210) + ret i32 0 +} + +; Named metadata +!1 = metadata !{i32 42} +!foo = !{!1, null} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lua b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lua new file mode 100644 index 000000000000..2abebae99de3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lua @@ -0,0 +1,12 @@ +-- defines a factorial function +function fact (n) + if n == 0 then + return 1 + else + return n * fact(n-1) + end +end + +print("enter a number:") +a = io.read("*number") -- read a number +print(fact(a)) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lustre b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lustre new file mode 100644 index 000000000000..789bd580bc78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lustre @@ -0,0 +1,6 @@ +node count(init: int; reset, event: bool) returns (c: int); +let + c = init -> if reset then init + else if event then pre(c)+1 + else pre(c); +tel; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lutin b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lutin new file mode 100644 index 000000000000..b031cee1ee95 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/lutin @@ -0,0 +1,18 @@ +node gen_x_v1() returns (x:real) = loop 0.0<x and x<42.0 + +node gen_x_v2() returns (x:real) = + loop { 0.0<x and x<42.0 fby loop [20] x = pre x } + +node gen_x_v3() returns (target:real; x:real=0.0) = + run target := gen_x_v2() in + loop { x = (pre x + target) / 2.0 } + +let inertia=0.6 + +node gen_x_v4() returns (target:real; x:real=0.0) = + run target := gen_x_v2() in + exist px,ppx : real = 0.0 in + loop { + px = pre x and ppx = pre px and + x = (px+target) / 2.0+inertia*(px-ppx) + } diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/m68k b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/m68k new file mode 100644 index 000000000000..bf41adb9dea9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/m68k @@ -0,0 +1,16 @@ +initialize: ; go into super user mode + clr.l -(a7) + move.w #32,-(a7) + trap #1 + addq.l #6,a7 + move.l d0,oldstack + rts + +restore: ; go back into user mode + move.l oldstack,-(a7) + move.w #32,-(a7) + trap #1 + addq.l #6,a7 + rts + +oldstack dc.l 0 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/magik b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/magik new file mode 100644 index 000000000000..80dfe262c9bd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/magik @@ -0,0 +1,6 @@ +_private _method test_object.init() + ## initializer + .slot1 << _self.default_value + _return _self +_endmethod +$ diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/make b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/make new file mode 100644 index 000000000000..cdac71548dd9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/make @@ -0,0 +1,6 @@ +.PHONY: all +all: $(OBJ) + +$(OBJ): $(SOURCE) + @echo "compiling..." + $(GCC) $(CFLAGS) $< > $@ diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/markdown b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/markdown new file mode 100644 index 000000000000..5e3631423814 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/markdown @@ -0,0 +1,4 @@ +Markdown has cool [reference links][ref 1] +and [regular links too](http://example.com) + +[ref 1]: http://example.com diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mason b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mason new file mode 100644 index 000000000000..70d4338db36c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mason @@ -0,0 +1,22 @@ +<%doc> + This is a mason component. + # This is a comment. +</%doc> + +<%args> + $color # this argument is required! + $size => 20 # default size + $country => undef # this argument is optional, default value is 'undef' + @items => (1, 2, 'something else') + %pairs => (name => "John", age => 29) +</%args> + +% # A random block of Perl code +<%perl> + my @people = ('mary' 'john' 'pete' 'david'); +</%perl> + +% # Note how each line of code begins with the mandatory % +% foreach my $person (@people) { + Name: <% $person %> +% } diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mathematica b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mathematica new file mode 100644 index 000000000000..b650247f428d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mathematica @@ -0,0 +1,8 @@ +(* Fibonacci numbers with memoization *) + +fib::usage = "f[n] calculates the n'th Fibonacci number."; +fib[0] = fib[1] = 1; +fib[n_Integer?Positive]:= fib[n] = fib[n-1] + fib[n-2]; + +In[4]:= fib[42] +Out[4]= 433494437 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/matlab b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/matlab new file mode 100644 index 000000000000..3777fb5385d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/matlab @@ -0,0 +1,6 @@ +A = cat( 3, [1 2 3; 9 8 7; 4 6 5], [0 3 2; 8 8 4; 5 3 5], ... + [6 4 7; 6 8 5; 5 4 3]); +% The EIG function is applied to each of the horizontal 'slices' of A. +for i = 1:3 + eig(squeeze(A(i,:,:))) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/minizinc b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/minizinc new file mode 100644 index 000000000000..9429d7b11bd6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/minizinc @@ -0,0 +1,23 @@ +% from MiniZinc Handbook: +% https://www.minizinc.org/doc-latest/en/modelling.html + +% Colouring Australia using nc colours +int: nc = 3; + +var 1..nc: wa; var 1..nc: nt; var 1..nc: sa; var 1..nc: q; +var 1..nc: nsw; var 1..nc: v; var 1..nc: t; + +constraint wa != nt; +constraint wa != sa; +constraint nt != sa; +constraint nt != q; +constraint sa != q; +constraint sa != nsw; +constraint sa != v; +constraint q != nsw; +constraint nsw != v; +solve satisfy; + +output ["wa=\(wa)\t nt=\(nt)\t sa=\(sa)\n", + "q=\(q)\t nsw=\(nsw)\t v=\(v)\n", + "t=", show(t), "\n"]; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/moonscript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/moonscript new file mode 100644 index 000000000000..4c8511ddcf6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/moonscript @@ -0,0 +1,16 @@ +util = require "my.module" + +a_table = { + foo: 'bar' + interpolated: "foo-#{other.stuff 2 + 3}" + "string": 2 + do: 'keyword' +} + +class MyClass extends SomeClass + new: (@init, arg2 = 'default') => + @derived = @init + 2 + super! + + other: => + @foo + 2 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mosel b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mosel new file mode 100644 index 000000000000..e1b81d6b9f96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mosel @@ -0,0 +1,10 @@ +(!****************************************************** + Mosel Example Problems +*******************************************************!) + +! Objective function: total daily cost + Cost:= sum(p in TYPES, t in TIME) (CSTART(p)*start(p,t) + + LEN(t)*(CMIN(p)*work(p,t) + CADD(p)*padd(p,t))) + +! Limit on power production above minimum level + forall(p in TYPES, t in TIME) padd(p,t) <= (PMAX(p)-PMIN(p))*work(p,t) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/msgtrans b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/msgtrans new file mode 100644 index 000000000000..3660beddb561 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/msgtrans @@ -0,0 +1,4 @@ +# Example MessageTrans file +Token +Token0x??:Replacement localised %0 text +Color/Colour:Colour diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mxml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mxml new file mode 100644 index 000000000000..a5deedbfa439 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/mxml @@ -0,0 +1,22 @@ +<?xml version="1.0"?> +<s:ComboBox xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:s="library://ns.adobe.com/flex/spark" + xmlns:mx="library://ns.adobe.com/flex/mx"> + + <fx:Script> + <![CDATA[ + [Bindable] + private var buttonLabel:String = "Click me!"; + private var clicks:int = 0; + + function button_clicked():void { + clicks++; + buttonLabel = clicks.toString(); + } + ]]> + </fx:Script> + + <s:Button id="button" + label="{buttonLabel}" + click="{button_clicked()}" /> +</s:ComboBox> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nasm b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nasm new file mode 100644 index 000000000000..ed0e8b88e565 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nasm @@ -0,0 +1,26 @@ +%macro IRQ 2 + global irq%1 + irq%1: + cli + push byte 0 ; push a dummy error code + push byte %2 ; push the IRQ number + jmp irq_common_stub +%endmacro + +extern irq_handler + +irq_common_stub: + pusha ; push all general-purpose registers + mov ax, ds ; lower 16-bits of eax = ds + push eax ; save the data segment descriptor + mov ax, 0x10 ; load the kernel data segment descriptor + mov edx, eax + call irq_handler + +%assign i 0 +%rep 8 +ISR_NOERRCODE i +%assign i i+1 +%endrep + +ISR_NOERRCODE 9 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nesasm b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nesasm new file mode 100644 index 000000000000..91a0f972f3dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nesasm @@ -0,0 +1,11 @@ + .bank 0 + .org $C000 +Reset: + jsr WaitSync ; wait for VSYNC + jsr ClearRAM ; clear RAM + jsr WaitSync ; wait for VSYNC (and PPU warmup) + + lda #$3f ; $3F -> A register + ldy #$00 ; $00 -> Y register + sta PPU_ADDR ; write #HIGH byte first + sty PPU_ADDR ; $3F00 -> PPU address \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nginx b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nginx new file mode 100644 index 000000000000..028877078434 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nginx @@ -0,0 +1,5 @@ +server { + listen 80; + server_name example.com *.example.com; + rewrite ^ http://www.domain.com$request_uri? permanent; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nim b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nim new file mode 100644 index 000000000000..74498cdc416b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nim @@ -0,0 +1,27 @@ +import math,strutils + +proc fixedWidth(input: string, minFieldSize: int):string {.inline.} = + # Note that field size is a minimum- will expand field if input + # string is larger + if input.startsWith("-"): + return(input & repeatchar(count=(abs(minFieldSize-len(input))),c=' ')) + else: + return(" " & input & repeatchar(count=(abs(minFieldSize-len(input))-1),c=' ')) + +template mathOnInterval(lowbound,highbound:float,counts: int,p:proc) = + block: + var step: float = (highbound - lowbound)/(max(counts,1)) + var current: float = lowbound + while current < highbound: + echo($fixedWidth($current,25) & ": " & $fixedWidth($p(current),25)) + current += step + +echo "Sine of theta from 0 to 2*PI by PI/12" +mathOnInterval(0.0,2.0*PI,12,sin) +echo("\n") +echo "Cosine of theta from 0 to 2*PI by PI/12" +mathOnInterval(0.0,2.0*PI,12,cos) + +# The first example above is much the same as: +# for i in 1..100: +# echo($sin( (float(i)/100.0) * 2.0*PI )) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nix b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nix new file mode 100644 index 000000000000..abb561d6f90f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/nix @@ -0,0 +1,19 @@ +# See https://nixos.org/nix/manual/#sec-expression-syntax +{ stdenv, fetchurl, perl }: # 1 + +stdenv.mkDerivation { # 2 + name = "hello-2.1.1"; # 3 + builder = ./builder.sh; # 4 + meta = rec { + name = "rouge"; + version = "${name}-2.1.1"; + number = 55 + 12; + isSmaller = number < 42; + bool = true; + }; + src = fetchurl { # 5 + url = ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz; # path + md5 = "70c9ccf9fac07f762c24f2df2290784d"; + }; + inherit perl; # 6 +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/objective_c b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/objective_c new file mode 100644 index 000000000000..c0856262c167 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/objective_c @@ -0,0 +1,18 @@ +@interface Person : NSObject { + @public + NSString *name; + @private + int age; +} + +@property(copy) NSString *name; +@property(readonly) int age; + +-(id)initWithAge:(int)age; +@end + +NSArray *arrayLiteral = @[@"abc", @1]; +NSDictionary *dictLiteral = @{ + @"hello": @"world", + @"goodbye": @"cruel world" +}; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/objective_cpp b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/objective_cpp new file mode 100644 index 000000000000..9b6890fc6821 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/objective_cpp @@ -0,0 +1,17 @@ +@import Foundation; +#import <array> +#include <vector> + +@interface IntegerArray : NSObject { + std::vector<NSUInteger> _numbers; +} +@property(readonly) NSUInteger count; + +- (instancetype)initWithNumbers:(NSUInteger *)numbers count:(NSUInteger)count; +- (NSUInteger)numberAtIndex:(NSUInteger)index; +@end + +int main(int argc, char **argv) { + auto numbers = std::array<NSUInteger, 3>{1, 2, 3}; + NSLog(@"%@", [[IntegerArray alloc] initWithNumbers:numbers.data() count:numbers.size()]); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ocaml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ocaml new file mode 100644 index 000000000000..e09cf09bd897 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ocaml @@ -0,0 +1,12 @@ +(* Binary tree with leaves car­rying an integer. *) +type tree = Leaf of int | Node of tree * tree + +let rec exists_leaf test tree = + match tree with + | Leaf v -> test v + | Node (left, right) -> + exists_leaf test left + || exists_leaf test right + +let has_even_leaf tree = + exists_leaf (fun n -> n mod 2 = 0) tree diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ocl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ocl new file mode 100644 index 000000000000..cb6846b3677c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ocl @@ -0,0 +1,4 @@ +context Compagnie::toEuros() : Collection(Real) +body: self.employees->collect(each: Employee| each.salary/ 6.55957) +-- OR +body: self.employees->collect(salary) -> collect(x | x/6.55957) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/openedge b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/openedge new file mode 100644 index 000000000000..a2bbcbafca85 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/openedge @@ -0,0 +1,4 @@ +FORM + "Hello World!" VIEW-AS TEXT AT COL 20 ROW 2 + btnOK AT COL 20 ROW 4 + WITH FRAME f SIZE 50 BY 5 NO-BOX THREE-D. diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/opentype_feature_file b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/opentype_feature_file new file mode 100644 index 000000000000..a71151fd9991 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/opentype_feature_file @@ -0,0 +1,6 @@ +languagesystem DFLT dflt; + +feature liga { + sub f i by f_i; +} liga; + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/pascal b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/pascal new file mode 100644 index 000000000000..16be5373456b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/pascal @@ -0,0 +1,14 @@ +program FizzBuzz(output); +var + i: Integer; +begin + for i := 1 to 100 do + if i mod 15 = 0 then + WriteLn('FizzBuzz') + else if i mod 3 = 0 then + WriteLn('Fizz') + else if i mod 5 = 0 then + WriteLn('Buzz') + else + WriteLn(i) +end. diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/perl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/perl new file mode 100644 index 000000000000..a9664453b61d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/perl @@ -0,0 +1,5 @@ +#!/usr/bin/env perl +use warnings; +print "a: "; +my $a = "foo"; +print $a; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/php b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/php new file mode 100644 index 000000000000..7ca7fe69cdba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/php @@ -0,0 +1,3 @@ +<?php + print("Hello {$world}"); +?> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/plaintext b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/plaintext new file mode 100644 index 000000000000..60180f7baf65 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/plaintext @@ -0,0 +1 @@ +plain text :) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/plist b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/plist new file mode 100644 index 000000000000..7684a3ce4e51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/plist @@ -0,0 +1,11 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + /* ... */ + }; + rootObject = B3A67937542EC2041CBF1CA2 /* Project object */; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/pony b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/pony new file mode 100644 index 000000000000..9b584fd385c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/pony @@ -0,0 +1,17 @@ +use "ponytest" + +actor Main is TestList + new create(env: Env) => PonyTest(env, this) + new make() => None + + fun tag tests(test: PonyTest) => + test(_TestAddition) + +class iso _TestAddition is UnitTest + """ + Adding 2 numbers + """ + fun name(): String => "u32/add" + + fun apply(h: TestHelper): TestResult => + h.expect_eq[U32](2 + 2, 4) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/postscript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/postscript new file mode 100644 index 000000000000..377753d99556 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/postscript @@ -0,0 +1,9 @@ +%!PS +/Courier % name the desired font +20 selectfont % choose the size in points and establish + % the font as the current one +72 500 moveto % position the current point at + % coordinates 72, 500 (the origin is at the + % lower-left corner of the page) +(Hello world!) show % stroke the text in parentheses +showpage % print all on the page diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/powershell b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/powershell new file mode 100644 index 000000000000..98de97b78804 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/powershell @@ -0,0 +1,13 @@ +function Verb-Noun +{ + <# + .SYNOPSIS + Tells you what it does + + .DESCRIPTION + Tells you what it does with more detail. + #> + param ([string]$Name, [string]$Extension = "txt", [string]$foo="bar") + $name = $name + "." + $extension + $name +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/praat b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/praat new file mode 100644 index 000000000000..f1af35bf3131 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/praat @@ -0,0 +1,26 @@ +form Copy selected files... + word Prefix + word Suffix _copy + boolean Keep_original 1 +endform + +total_objects = numberOfSelected() +for i to total_objects + my_object[i] = selected(i) +endfor +for i to total_objects + selectObject: my_object[i] + @copy() + new[i] = selected() +endfor +if total_objects + selectObject: new[1] + for i from 2 to total_objects + plusObject: new[i] + endfor +endif + +procedure copy () + .name$ = extractWord$(selected$(), " ") + Copy: prefix$ + .name$ + suffix$ +endproc diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/prolog b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/prolog new file mode 100644 index 000000000000..8430e6b36a4e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/prolog @@ -0,0 +1,9 @@ +diff(plus(A,B), X, plus(DA, DB)) + <= diff(A, X, DA) and diff(B, X, DB). + +diff(times(A,B), X, plus(times(A, DB), times(DA, B))) + <= diff(A, X, DA) and diff(B, X, DB). + +equal(X, X). +diff(X, X, 1). +diff(Y, X, 0) <= not equal(Y, X). diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/prometheus b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/prometheus new file mode 100644 index 000000000000..3cdab0856bfe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/prometheus @@ -0,0 +1,9 @@ +"this is a string" +'these are unescaped: \n \\ \t' +`these are not unescaped: \n ' " \t` + +http_requests_total{environment=~"staging|testing|development", method!="GET"} + +http_requests_total offset 5m + +sum(http_requests_total{method="GET"}[10m] offset 5m) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/properties b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/properties new file mode 100644 index 000000000000..b5b717df7ed2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/properties @@ -0,0 +1,7 @@ +# You are reading the ".properties" entry. +! The exclamation mark can also mark text as comments. +website = http\://en.wikipedia.org/ +language = English +country : Poland +continent=Europe +key.with.dots=This is the value that could be looked up with the key "key.with.dots". diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/protobuf b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/protobuf new file mode 100644 index 000000000000..fdab9e9780dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/protobuf @@ -0,0 +1,5 @@ +message Person { + required string name = 1; + required int32 id = 2; + optional string email = 3; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/puppet b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/puppet new file mode 100644 index 000000000000..621d9c9c6a5b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/puppet @@ -0,0 +1,6 @@ +service { 'ntp': + name => $service_name, + ensure => running, + enable => true, + subscribe => File['ntp.conf'], +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/python b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/python new file mode 100644 index 000000000000..77a5cb3111f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/python @@ -0,0 +1,6 @@ +def fib(n): # write Fibonacci series up to n + """Print a Fibonacci series up to n.""" + a, b = 0, 1 + while a < n: + print a, + a, b = b, a+b diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/q b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/q new file mode 100644 index 000000000000..b7ff469e2e97 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/q @@ -0,0 +1,8 @@ +/ comment +x: til 10 + +tab:([]a:1 2 3;b:`a `b `c); + +function:{[table] + select from table where b=`c + }; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/qml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/qml new file mode 100644 index 000000000000..9aacda6cf095 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/qml @@ -0,0 +1,9 @@ +import QtQuick 2.0 +Item { + width: 200 + height: 100 + MouseArea { + anchors.fill: parent + onClicked: Qt.quit() + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/r b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/r new file mode 100644 index 000000000000..b6804b0735ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/r @@ -0,0 +1,8 @@ +dbenford <- function(x){ + log10(1 + 1/x) +} + +pbenford <- function(q){ + cumprobs <- cumsum(dbenford(1:9)) + return(cumprobs[q]) +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/racket b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/racket new file mode 100644 index 000000000000..bd99818643c2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/racket @@ -0,0 +1,24 @@ +#lang racket + +;; draw a graph of cos and deriv^3(cos) +(require plot) +(define ((deriv f) x) + (/ (- (f x) (f (- x 0.001))) 0.001)) +(define (thrice f) (lambda (x) (f (f (f x))))) +(plot (list (function ((thrice deriv) sin) -5 5) + (function cos -5 5 #:color 'blue))) + +;; Print the Greek alphabet +(for ([i (in-range 25)]) + (displayln + (integer->char + (+ i (char->integer #\u3B1))))) + +;; An echo server +(define listener (tcp-listen 12345)) +(let echo-server () + (define-values (in out) (tcp-accept listener)) + (thread (λ () + (copy-port in out) + (close-output-port out))) + (echo-server)) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/reasonml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/reasonml new file mode 100644 index 000000000000..db29f2cce550 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/reasonml @@ -0,0 +1,12 @@ +/* I like a teacher who gives you something to take + home to think about besides homework. */ +let gpa_score = 5.0; +type schoolPerson = Teacher | Director | Student(string); + +let greeting = person => + switch (person) { + | Teacher => "Hey Professor!" + | Director => "Hello Director." + | Student("Richard") => "Still here Ricky?" + | Student(anyOtherName) => "Hey, " ++ anyOtherName ++ "." + }; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/rego b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/rego new file mode 100644 index 000000000000..34b142206008 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/rego @@ -0,0 +1,8 @@ +package httpapi.authz + +subordinates = {"alice": [], "charlie": [], "bob": ["alice"], "betty": ["charlie"]} + +# HTTP API request +import input + +default allow = false diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/rescript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/rescript new file mode 100644 index 000000000000..a27fa9383b33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/rescript @@ -0,0 +1,26 @@ +module Person = { + type t = Teacher | Director | Student(string) + + let greeting = person => + switch person { + | Teacher => "Hey Professor!" + | Director => "Hello Director." + | Student("Richard") => "Still here Ricky?" + | Student(other) => "Hey, " ++ other ++ "." + } +} + +module Button = { + @react.component + let make = (~count: int, ~onClick) => { + let times = switch count { + | 1 => "once" + | 2 => "twice" + | n => Belt.Int.toString(n) ++ " times" + } + + let msg = "Click me " ++ times + + <button onClick> {msg->React.string} </button> + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/robot_framework b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/robot_framework new file mode 100644 index 000000000000..3ba3fdc5a1cb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/robot_framework @@ -0,0 +1,27 @@ +*** Settings *** +Document Example taken from http://robotframework.org/ +Suite Setup Open Browser To Login Page +Suite Teardown Close Browser +Test Setup Go To Login Page +Test Template Login With Invalid Credentials Should Fail +Resource resource.txt + +*** Test Cases *** User Name Password +Invalid Username invalid ${VALID PASSWORD} +Invalid Password ${VALID USER} invalid +Invalid Username And Password invalid whatever +Empty Username ${EMPTY} ${VALID PASSWORD} +Empty Password ${VALID USER} ${EMPTY} +Empty Username And Password ${EMPTY} ${EMPTY} + +*** Keywords *** +Login With Invalid Credentials Should Fail + [Arguments] ${username} ${password} + Input Username ${username} + Input Password ${password} + Submit Credentials + Login Should Have Failed + +Login Should Have Failed + Location Should Be ${ERROR URL} + Title Should Be Error Page diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ruby b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ruby new file mode 100644 index 000000000000..be609a17c1a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ruby @@ -0,0 +1,9 @@ +class Greeter + def initialize(name="World") + @name = name + end + + def say_hi + puts "Hi #{@name}!" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/rust b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/rust new file mode 100644 index 000000000000..b73b162b6669 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/rust @@ -0,0 +1,12 @@ +use core::*; + +fn main() { + for ["Alice", "Bob", "Carol"].each |&name| { + do task::spawn { + let v = rand::Rng().shuffle([1, 2, 3]); + for v.each |&num| { + io::print(fmt!("%s says: '%d'\n", name, num)) + } + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sas b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sas new file mode 100644 index 000000000000..1eee876ed842 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sas @@ -0,0 +1,13 @@ +data sim; + do i = 1 to 100; + x1 = rand("Normal"); + x2 = rand("Binomial", 0.5, 100); + output; + end; +run; + +proc means data=sashelp.class; + class sex; + var height weight; + output out = mean_by_sex; +run; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sass b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sass new file mode 100644 index 000000000000..1e768de3d39a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sass @@ -0,0 +1,3 @@ +@for $i from 1 through 3 + .item-#{$i} + width: 2em * $i diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/scala b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/scala new file mode 100644 index 000000000000..75f19ee7a481 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/scala @@ -0,0 +1,3 @@ +class Greeter(name: String = "World") { + def sayHi() { println("Hi " + name + "!") } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/scheme b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/scheme new file mode 100644 index 000000000000..c9c4dbd40ccb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/scheme @@ -0,0 +1,4 @@ +(define Y + (lambda (m) + ((lambda (f) (m (lambda (a) ((f f) a)))) + (lambda (f) (m (lambda (a) ((f f) a))))))) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/scss b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/scss new file mode 100644 index 000000000000..3f259a7677a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/scss @@ -0,0 +1,5 @@ +@for $i from 1 through 3 { + .item-#{$i} { + width: 2em * $i; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sed b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sed new file mode 100644 index 000000000000..4683cd32fcdc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sed @@ -0,0 +1,4 @@ +/begin/,/end/ { + /begin/n # skip over the line that has "begin" on it + s/old/new/ +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/shell b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/shell new file mode 100644 index 000000000000..f01fe48ec239 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/shell @@ -0,0 +1,2 @@ +# If not running interactively, don't do anything +[[ -z "$PS1" ]] && return diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sieve b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sieve new file mode 100644 index 000000000000..5f6889d47344 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sieve @@ -0,0 +1,10 @@ +require "fileinto"; +require "imap4flags"; + +if header :is "X-Spam" "Yes" { + fileinto "Junk"; + setflag "\\seen"; + stop; +} + +/* Other messages get filed into Inbox or to user's scripts */ diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/slice b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/slice new file mode 100644 index 000000000000..7c382201d163 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/slice @@ -0,0 +1,10 @@ +// Printer.ice +module Demo +{ + interface Printer + { + // A client can invoke this operation on a server. + // In this example we print the string s + void printString(string s); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/slim b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/slim new file mode 100644 index 000000000000..215a4e28750e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/slim @@ -0,0 +1,17 @@ +doctype html +html + body + h1 Markup examples + #content + p + | Slim can have #{ruby_code} interpolated! + /[if IE] + javascript: + alert('Slim supports embedded javascript!') + + - unless items.empty? + table + - for item in items do + tr + td.name = item.name + td.price = item.price diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/smalltalk b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/smalltalk new file mode 100644 index 000000000000..af97161ee453 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/smalltalk @@ -0,0 +1,6 @@ +quadMultiply: i1 and: i2 + "This method multiplies the given numbers by each other + and the result by 4." + | mul | + mul := i1 * i2. + ^mul * 4 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/smarty b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/smarty new file mode 100644 index 000000000000..bb7f664dc2c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/smarty @@ -0,0 +1,12 @@ +{foo bar='single quotes' baz="double quotes" test3=$test3} + +<ul> + {foreach from=$myvariable item=data} + <li>{$data.field}</li> + {foreachelse} + <li>No Data</li> + {/foreach} +</ul> + +<div class="{if $foo}class1{else}class2{/if}">{$foo.bar.baz}</div> + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sml new file mode 100644 index 000000000000..02a57d343026 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sml @@ -0,0 +1,4 @@ +datatype shape + = Circle of loc * real (* center and radius *) + | Square of loc * real (* upper-left corner and side length; axis-aligned *) + | Triangle of loc * loc * loc (* corners *) diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/solidity b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/solidity new file mode 100644 index 000000000000..e8d945363953 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/solidity @@ -0,0 +1,13 @@ +pragma solidity ~0.4.15; + +interface IMirror { + function reflect() external payable returns(bool /* ain't I pretty?.. */); +} + +contract Mirror is IMirror { + event logMessage(address indexed sender, uint256 value, uint256 gas, bytes data); + + function () { // no funny stuff + revert(); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sparql b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sparql new file mode 100644 index 000000000000..6884bd0182f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sparql @@ -0,0 +1,6 @@ +SELECT ?item ?itemLabel +WHERE +{ + ?item wdt:P31 wd:Q146. + SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sqf b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sqf new file mode 100644 index 000000000000..9f54383c705b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sqf @@ -0,0 +1,14 @@ +// Creates a dot marker at the given position +#include "script_component.hpp" +params ["_pos", "_txt"]; + +if (isNil QGVAR(markerID)) then { + GVAR(markerID) = 0; +}; + +_markerstr = createMarker [QGVAR(marker) + str GVAR(markerID), _pos]; +_markerstr setMarkerShape "ICON"; +_markerstr setMarkerType "hd_dot"; +_markerstr setMarkerText _txt; + +GVAR(markerID) = GVAR(markerID) + 1; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sql b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sql new file mode 100644 index 000000000000..45a7a17fc26f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/sql @@ -0,0 +1 @@ +SELECT * FROM `users` WHERE `user`.`id` = 1 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ssh b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ssh new file mode 100644 index 000000000000..47f9cdb2a958 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ssh @@ -0,0 +1,4 @@ +Host example + Hostname example.com + User user + Port 1234 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/supercollider b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/supercollider new file mode 100644 index 000000000000..23a8e4b70b7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/supercollider @@ -0,0 +1,11 @@ +// modulate a sine frequency and a noise amplitude with another sine +// whose frequency depends on the horizontal mouse pointer position +~myFunction = { + var x = SinOsc.ar(MouseX.kr(1, 100)); + SinOsc.ar(300 * x + 800, 0, 0.1) + + + PinkNoise.ar(0.1 * x + 0.1) +}; + +~myFunction.play; +"that's all, folks!".postln; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/swift b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/swift new file mode 100644 index 000000000000..0c54ed2db002 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/swift @@ -0,0 +1,5 @@ +// Say hello to poeple +func sayHello(personName: String) -> String { + let greeting = "Hello, " + personName + "!" + return greeting +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/systemd b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/systemd new file mode 100644 index 000000000000..e68c72e71aa0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/systemd @@ -0,0 +1,4 @@ +[Unit] +Description=Snap Daemon +Requires=snapd.socket +OnFailure=snapd.failure.service diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tap b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tap new file mode 100644 index 000000000000..1d9bf5a68d05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tap @@ -0,0 +1,5 @@ +ok 1 - Input file opened +not ok 2 - First line of the input valid +ok 3 - Read the rest of the file +not ok 4 - Summarized correctly # TODO Not written yet +1..4 diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tcl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tcl new file mode 100644 index 000000000000..9bbe87c733b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tcl @@ -0,0 +1 @@ +proc cross_sum {s} {expr [join [split $s ""] +]} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/terraform b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/terraform new file mode 100644 index 000000000000..006e4f87af53 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/terraform @@ -0,0 +1,16 @@ +resource "aws_elb" "web" { + name = "terraform-example-elb" + + # The same availability zone as our instances + availability_zones = ["${aws_instance.web.*.availability_zone}"] + + listener { + instance_port = 80 + instance_protocol = "http" + lb_port = 80 + lb_protocol = "http" + } + + # The instances are registered automatically + instances = ["${aws_instance.web.*.id}"] +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tex b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tex new file mode 100644 index 000000000000..430510fdb5a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tex @@ -0,0 +1 @@ +To write \LaTeX\ you would type \verb:\LaTeX:. diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/toml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/toml new file mode 100644 index 000000000000..40c11c152a9a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/toml @@ -0,0 +1,9 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tsx b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tsx new file mode 100644 index 000000000000..422d2a732513 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tsx @@ -0,0 +1,17 @@ +class HelloWorld extends React.Component<{date: Date}, void> { + render() { + return ( + <p> + Hello, <input type="text" placeholder="Your name here" />! + It is {this.props.date.toTimeString()} + </p> + ); + } +} + +setInterval(function() { + ReactDOM.render( + <HelloWorld date={new Date()} />, + document.getElementById('example') + ); +}, 500); diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ttcn3 b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ttcn3 new file mode 100644 index 000000000000..969107de42a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/ttcn3 @@ -0,0 +1,6 @@ +module DNSTester { + type integer Identification( 0..65535 ); // 16-bit integer + type enumerated MessageKind {e_Question, e_Answer}; + type charstring Question; + type charstring Answer; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tulip b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tulip new file mode 100644 index 000000000000..8c18ccf48f1c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/tulip @@ -0,0 +1,13 @@ +@module ref + +ref value = Ref (spawn [ ! => loop value ]) + +loop value = receive [ + .set new-value => loop new-value + p, id, .get => { send p (id, value); loop value } +] + +@object Ref pid [ + set val = .set val > send pid + get! = .get > send-wait pid +] diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/turtle b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/turtle new file mode 100644 index 000000000000..8c86d0c87f17 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/turtle @@ -0,0 +1,26 @@ +@prefix xsd: <http://www.w3.org/2001/XMLSchema#> +@prefix dcat: <http://www.w3.org/ns/dcat#> . +@prefix dcterms: <http://purl.org/dc/terms/> . +@prefix foaf: <http://xmlns.com/foaf/0.1/> . +@base <http://base.of.relative.iris> . + +PREFIX test: <http://example.org> +PrEfIx insensitive: <http://insensitive.example.org> + +GRAPH <https://trig.testing.graph> { + <https://example.org/resource/dataset> a dcat:Dataset ; + +#-----Mandatory-----# + + dcterms:title 'Test title'@cs, "Test title"@en ; + dcterms:description """Multiline + string"""@cs, '''Another + multiline string '''@en ; + +#-----Recommended-----# + dcat:contactPoint [ a foaf:Person ] ; + test:list ( <http://ex.org> 1 1.1 +1 -1 1.2E+4 "Test" "\"Quote\"" ) ; + test:datatype "2016-07-20"^^xsd:date ; + test:text """next multiline"""; + . +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/twig b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/twig new file mode 100644 index 000000000000..2e5e57733458 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/twig @@ -0,0 +1,9 @@ +{% include 'header.html' %} + +{% for user in users %} + * {{ user.name }} +{% else %} + No users have been found. +{% endfor %} + +{% include 'footer.html' %} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/typescript b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/typescript new file mode 100644 index 000000000000..134a70e87714 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/typescript @@ -0,0 +1 @@ +$(document).ready(function() { alert('ready!'); }); diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vala b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vala new file mode 100644 index 000000000000..2989be0592a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vala @@ -0,0 +1,8 @@ +class Demo.HelloWorld : GLib.Object +{ + public static int main (String[] args) + { + stdout.printf("Hello World\n"); + return 0; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vb new file mode 100644 index 000000000000..f7e323daaf2d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vb @@ -0,0 +1,4 @@ +Private Sub Form_Load() + ' Execute a simple message box that says "Hello, World!" + MsgBox "Hello, World!" +End Sub diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vcl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vcl new file mode 100644 index 000000000000..75c8eea398d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vcl @@ -0,0 +1,12 @@ +vcl 4.0; + +backend server1 { + .host = "server1.example.com"; + .probe = { + .url = "/"; + .timeout = 1s; + .interval = 5s; + .window = 5; + .threshold = 3; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/velocity b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/velocity new file mode 100644 index 000000000000..845776b402c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/velocity @@ -0,0 +1,9 @@ +#* + There is multi-line comment. + see this text because the Velocity Templating Engine will ignore it. +*# +<h3>List</h3> +## This is a single line comment. +#if( $allProducts ) +<p>not found.</p> +#end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/verilog b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/verilog new file mode 100644 index 000000000000..7f752c604346 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/verilog @@ -0,0 +1,27 @@ +/** + * Verilog Lexer + */ +module Foo( + input logic Clk_CI, + input logic Rst_RBI, + input logic A, + input logic B, + output logic C +); + logic C_DN, C_DP; + + assign C = C_DP; + + always_comb begin : proc_next_state + C_DN = A + B; + end + + // Clocked process + always_ff @(posedge Clk_CI, negedge Rst_RBI) begin + if(~Rst_RBI) begin + C_DP <= 1'b0; + end else begin + C_DP <= C_DN; + end + end +endmodule diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vhdl b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vhdl new file mode 100644 index 000000000000..9355b50cae92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vhdl @@ -0,0 +1,23 @@ +entity toggle_demo is + port ( + clk_in : in std_logic; -- System Clock + data_q : out std_logic -- Toggling Port + ); +end entity toggle_demo; + +architecture RTL of toggle_demo is + signal data : std_logic := '0'; +begin + + data_q <= data; + + data_proc : process (clk_in) + begin + + if (rising_edge(clk_in)) then + data <= not data; + end if; + + end process; + +end architecture RTL; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/viml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/viml new file mode 100644 index 000000000000..93a364b98287 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/viml @@ -0,0 +1,14 @@ +function! s:Make(dir, make, format, name) abort + let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd' : 'cd' + let cwd = getcwd() + let [mp, efm, cc] = [&l:mp, &l:efm, get(b:, 'current_compiler', '')] + try + execute cd fnameescape(dir) + let [&l:mp, &l:efm, b:current_compiler] = [a:make, a:format, a:compiler] + execute (exists(':Make') == 2 ? 'Make' : 'make') + finally + let [&l:mp, &l:efm, b:current_compiler] = [mp, efm, cc] + if empty(cc) | unlet! b:current_compiler | endif + execute cd fnameescape(cwd) + endtry +endfunction diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vue b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vue new file mode 100644 index 000000000000..8b54b28dde2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/vue @@ -0,0 +1,11 @@ +<template> + <div id="app"> + {{ message }} + </div> +</template> + +<script lang=coffee> + app = new Vue + el: '#app' + data: { message: 'Hello Vue!' } +</script> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/wollok b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/wollok new file mode 100644 index 000000000000..ae467f43b91e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/wollok @@ -0,0 +1,11 @@ +object pepita { + var energy = 100 + + method energy() = energy + + method fly(kilometers) { + energy -= kilometers + 10 + } + + method sayHi() = "Coo!" +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xml new file mode 100644 index 000000000000..149844b171cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsl:template match="/"></xsl:template> diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xojo b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xojo new file mode 100644 index 000000000000..698a92164572 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xojo @@ -0,0 +1,14 @@ +Dim f As FolderItem +f = GetOpenFolderItem(FileTypes1.jpeg) // defined in the File Type Set editor +rem - we should check for nil! +If not f.Exists Then + Beep 'Just for fun + MsgBox("The file " + f.NativePath + "doesn't ""exist.""") +Else // document exists + ImageWell1.image=Picture.Open(f) +End If +if f isa folderitem then + msgbox(f.name) +end if +Exception err As NilObjectException + MsgBox("Invalid pathname!") diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xpath b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xpath new file mode 100644 index 000000000000..ddc4b6afa59b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xpath @@ -0,0 +1,2 @@ +(: Authors named Bob Joe who didn't graduate from Harvard :) +//author[first-name = "Joe" and last-name = "Bob"][degree/@from != "Harvard"] diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xquery b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xquery new file mode 100644 index 000000000000..4f7b3255071f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/xquery @@ -0,0 +1,22 @@ +declare namespace html = "http://www.w3.org/1999/xhtml"; + +declare function local:test-function($catalog as document-node()) { + <html> + <head> + <title>XQuery example for the Rouge highlighter</title> + <link href="style.css"/> + </head> + <body> + <h1>List</h1> + <ul> + {for $product in $catalog/items/product[@sell-by > current-date()] return + <li> + <ul> + <li>{data($product/name)}</li> + <li>{$product/price * (1 + $product/tax)}$</li> + </ul> + </li>} + </ul> + </body> + </html> +}; diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/yaml b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/yaml new file mode 100644 index 000000000000..2f622dea3eec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/yaml @@ -0,0 +1,4 @@ +--- +one: Mark McGwire +two: Sammy Sosa +three: Ken Griffey diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/yang b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/yang new file mode 100644 index 000000000000..c68ff7bf4503 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/yang @@ -0,0 +1,17 @@ +module petstore { + namespace "http://autlan.dt/gribok/yang/example"; + prefix ex; + + revision 2020-04-01 { + description "Example yang"; + } + + container pets { + list dogs { + key name; + leaf name { + type string; + } + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/zig b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/zig new file mode 100644 index 000000000000..8374aa402354 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/demos/zig @@ -0,0 +1,6 @@ +const std = @import("std"); +const warn = std.debug.warn; + +fn add_floats(x: f16, y: f16) f16 { + return x + y; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatter.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatter.rb new file mode 100644 index 000000000000..e2802dfbb6cb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatter.rb @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + # A Formatter takes a token stream and formats it for human viewing. + class Formatter + # @private + REGISTRY = {} + + # Specify or get the unique tag for this formatter. This is used + # for specifying a formatter in `rougify`. + def self.tag(tag=nil) + return @tag unless tag + REGISTRY[tag] = self + + @tag = tag + end + + # Find a formatter class given a unique tag. + def self.find(tag) + REGISTRY[tag] + end + + def self.with_escape + Thread.current[:'rouge/with-escape'] = true + yield + ensure + Thread.current[:'rouge/with-escape'] = false + end + + def self.escape_enabled? + !!(((defined? @escape_enabled) && @escape_enabled) || Thread.current[:'rouge/with-escape']) + end + + def self.enable_escape! + @escape_enabled = true + end + + def self.disable_escape! + @escape_enabled = false + Thread.current[:'rouge/with-escape'] = false + end + + # Format a token stream. Delegates to {#format}. + def self.format(tokens, *a, &b) + new(*a).format(tokens, &b) + end + + def initialize(opts={}) + # pass + end + + def escape?(tok) + tok == Token::Tokens::Escape + end + + def filter_escapes(tokens) + tokens.each do |t, v| + if t == Token::Tokens::Escape + yield Token::Tokens::Error, v + else + yield t, v + end + end + end + + # Format a token stream. + def format(tokens, &b) + tokens = enum_for(:filter_escapes, tokens) unless Formatter.escape_enabled? + + return stream(tokens, &b) if block_given? + + out = String.new('') + stream(tokens) { |piece| out << piece } + + out + end + + # @deprecated Use {#format} instead. + def render(tokens) + warn 'Formatter#render is deprecated, use #format instead.' + format(tokens) + end + + # @abstract + # yield strings that, when concatenated, form the formatted output + def stream(tokens, &b) + raise 'abstract' + end + + protected + def token_lines(tokens, &b) + return enum_for(:token_lines, tokens) unless block_given? + + out = [] + tokens.each do |tok, val| + val.scan %r/\n|[^\n]+/ do |s| + if s == "\n" + yield out + out = [] + else + out << [tok, s] + end + end + end + + # for inputs not ending in a newline + yield out if out.any? + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html.rb new file mode 100644 index 000000000000..85ce477b9926 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html.rb @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Formatters + # Transforms a token stream into HTML output. + class HTML < Formatter + tag 'html' + + # @yield the html output. + def stream(tokens, &b) + tokens.each { |tok, val| yield span(tok, val) } + end + + def span(tok, val) + return val if escape?(tok) + + safe_span(tok, escape_special_html_chars(val)) + end + + def safe_span(tok, safe_val) + if tok == Token::Tokens::Text + safe_val + else + shortname = tok.shortname \ + or raise "unknown token: #{tok.inspect} for #{safe_val.inspect}" + + "<span class=\"#{shortname}\">#{safe_val}</span>" + end + end + + TABLE_FOR_ESCAPE_HTML = { + '&' => '&amp;', + '<' => '&lt;', + '>' => '&gt;', + } + + private + # A performance-oriented helper method to escape `&`, `<` and `>` for the rendered + # HTML from this formatter. + # + # `String#gsub` will always return a new string instance irrespective of whether + # a substitution occurs. This method however invokes `String#gsub` only if + # a substitution is imminent. + # + # Returns either the given `value` argument string as is or a new string with the + # special characters replaced with their escaped counterparts. + def escape_special_html_chars(value) + escape_regex = /[&<>]/ + return value unless value =~ escape_regex + + value.gsub(escape_regex, TABLE_FOR_ESCAPE_HTML) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_inline.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_inline.rb new file mode 100644 index 000000000000..e7f34399b255 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_inline.rb @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Formatters + class HTMLInline < HTML + tag 'html_inline' + + def initialize(theme) + if theme.is_a?(Class) && theme < Rouge::Theme + @theme = theme.new + elsif theme.is_a?(Rouge::Theme) + @theme = theme + elsif theme.is_a?(String) + @theme = Rouge::Theme.find(theme).new + else + raise ArgumentError, "invalid theme: #{theme.inspect}" + end + end + + def safe_span(tok, safe_val) + return safe_val if tok == Token::Tokens::Text + + rules = @theme.style_for(tok).rendered_rules + + "<span style=\"#{rules.to_a.join(';')}\">#{safe_val}</span>" + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_legacy.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_legacy.rb new file mode 100644 index 000000000000..8327564531ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_legacy.rb @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# stdlib +require 'cgi' + +module Rouge + module Formatters + # Transforms a token stream into HTML output. + class HTMLLegacy < Formatter + tag 'html_legacy' + + # @option opts [String] :css_class ('highlight') + # @option opts [true/false] :line_numbers (false) + # @option opts [Rouge::CSSTheme] :inline_theme (nil) + # @option opts [true/false] :wrap (true) + # + # Initialize with options. + # + # If `:inline_theme` is given, then instead of rendering the + # tokens as <span> tags with CSS classes, the styles according to + # the given theme will be inlined in "style" attributes. This is + # useful for formats in which stylesheets are not available. + # + # Content will be wrapped in a tag (`div` if tableized, `pre` if + # not) with the given `:css_class` unless `:wrap` is set to `false`. + def initialize(opts={}) + @formatter = opts[:inline_theme] ? HTMLInline.new(opts[:inline_theme]) + : HTML.new + + + @formatter = HTMLTable.new(@formatter, opts) if opts[:line_numbers] + + if opts.fetch(:wrap, true) + @formatter = HTMLPygments.new(@formatter, opts.fetch(:css_class, 'codehilite')) + end + end + + # @yield the html output. + def stream(tokens, &b) + @formatter.stream(tokens, &b) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_line_highlighter.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_line_highlighter.rb new file mode 100644 index 000000000000..2fffec0401d1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_line_highlighter.rb @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Formatters + class HTMLLineHighlighter < Formatter + tag 'html_line_highlighter' + + def initialize(delegate, opts = {}) + @delegate = delegate + @highlight_line_class = opts.fetch(:highlight_line_class, 'hll') + @highlight_lines = opts[:highlight_lines] || [] + end + + def stream(tokens) + token_lines(tokens).with_index(1) do |line_tokens, lineno| + line = %(#{@delegate.format(line_tokens)}\n) + line = %(<span class="#{@highlight_line_class}">#{line}</span>) if @highlight_lines.include? lineno + yield line + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_line_table.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_line_table.rb new file mode 100644 index 000000000000..bb2158426790 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_line_table.rb @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Formatters + class HTMLLineTable < Formatter + tag 'html_line_table' + + # @param [Rouge::Formatters::Formatter] formatter An instance of a + # `Rouge::Formatters::HTML` or `Rouge::Formatters::HTMLInline` + # @param [Hash] opts options for HTMLLineTable instance. + # @option opts [Integer] :start_line line number to start from. Defaults to `1`. + # @option opts [String] :table_class Class name for the table. + # Defaults to `"rouge-line-table"`. + # @option opts [String] :line_id a `sprintf` template for generating an `id` + # attribute for each table row corresponding to current line number. + # Defaults to `"line-%i"`. + # @option opts [String] :line_class Class name for each table row. + # Defaults to `"lineno"`. + # @option opts [String] :gutter_class Class name for rendered line-number cell. + # Defaults to `"rouge-gutter"`. + # @option opts [String] :code_class Class name for rendered code cell. + # Defaults to `"rouge-code"`. + def initialize(formatter, opts={}) + @formatter = formatter + @start_line = opts.fetch :start_line, 1 + @table_class = opts.fetch :table_class, 'rouge-line-table' + @gutter_class = opts.fetch :gutter_class, 'rouge-gutter' + @code_class = opts.fetch :code_class, 'rouge-code' + @line_class = opts.fetch :line_class, 'lineno' + @line_id = opts.fetch :line_id, 'line-%i' + end + + def stream(tokens, &b) + buffer = [%(<table class="#@table_class"><tbody>)] + token_lines(tokens).with_index(@start_line) do |line_tokens, lineno| + buffer << %(<tr id="#{sprintf @line_id, lineno}" class="#@line_class">) + buffer << %(<td class="#@gutter_class gl" ) + buffer << %(style="-moz-user-select: none;-ms-user-select: none;) + buffer << %(-webkit-user-select: none;user-select: none;">) + buffer << %(<pre>#{lineno}</pre></td>) + buffer << %(<td class="#@code_class"><pre>) + @formatter.stream(line_tokens) { |formatted| buffer << formatted } + buffer << "\n</pre></td></tr>" + end + buffer << %(</tbody></table>) + yield buffer.join + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_linewise.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_linewise.rb new file mode 100644 index 000000000000..dc58d911343a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_linewise.rb @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Formatters + class HTMLLinewise < Formatter + def initialize(formatter, opts={}) + @formatter = formatter + @tag_name = opts.fetch(:tag_name, 'div') + @class_format = opts.fetch(:class, 'line-%i') + end + + def stream(tokens, &b) + token_lines(tokens).with_index(1) do |line_tokens, lineno| + yield %(<#{@tag_name} class="#{sprintf @class_format, lineno}">) + @formatter.stream(line_tokens) {|formatted| yield formatted } + yield %(\n</#{@tag_name}>) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_pygments.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_pygments.rb new file mode 100644 index 000000000000..8ed8f5483929 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_pygments.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Rouge + module Formatters + class HTMLPygments < Formatter + def initialize(inner, css_class='codehilite') + @inner = inner + @css_class = css_class + end + + def stream(tokens, &b) + yield %(<div class="highlight"><pre class="#{@css_class}"><code>) + @inner.stream(tokens, &b) + yield "</code></pre></div>" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_table.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_table.rb new file mode 100644 index 000000000000..fa9a181df802 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/html_table.rb @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Formatters + class HTMLTable < Formatter + tag 'html_table' + + def initialize(inner, opts={}) + @inner = inner + @start_line = opts.fetch(:start_line, 1) + @line_format = opts.fetch(:line_format, '%i') + @table_class = opts.fetch(:table_class, 'rouge-table') + @gutter_class = opts.fetch(:gutter_class, 'rouge-gutter') + @code_class = opts.fetch(:code_class, 'rouge-code') + end + + def style(scope) + yield %(#{scope} .rouge-table { border-spacing: 0 }) + yield %(#{scope} .rouge-gutter { text-align: right }) + end + + def stream(tokens, &b) + last_val = nil + num_lines = tokens.reduce(0) {|count, (_, val)| count + (last_val = val).count(?\n) } + formatted = @inner.format(tokens) + unless last_val && last_val.end_with?(?\n) + num_lines += 1 + formatted << ?\n + end + + # generate a string of newline-separated line numbers for the gutter> + formatted_line_numbers = (@start_line..(@start_line + num_lines - 1)).map do |i| + sprintf(@line_format, i) + end.join(?\n) << ?\n + + buffer = [%(<table class="#@table_class"><tbody><tr>)] + # the "gl" class applies the style for Generic.Lineno + buffer << %(<td class="#@gutter_class gl">) + buffer << %(<pre class="lineno">#{formatted_line_numbers}</pre>) + buffer << '</td>' + buffer << %(<td class="#@code_class"><pre>) + buffer << formatted + buffer << '</pre></td>' + buffer << '</tr></tbody></table>' + + yield buffer.join + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/null.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/null.rb new file mode 100644 index 000000000000..078c461ca9c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/null.rb @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Formatters + # A formatter which renders nothing. + class Null < Formatter + tag 'null' + + def initialize(*) + end + + def stream(tokens, &b) + tokens.each do |tok, val| + yield "#{tok.qualname} #{val.inspect}\n" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/terminal256.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/terminal256.rb new file mode 100644 index 000000000000..140d53cfdf67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/terminal256.rb @@ -0,0 +1,198 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Formatters + # A formatter for 256-color terminals + class Terminal256 < Formatter + tag 'terminal256' + + # @private + attr_reader :theme + + # @param [Hash,Rouge::Theme] theme + # the theme to render with. + def initialize(theme = Themes::ThankfulEyes.new) + if theme.is_a?(Rouge::Theme) + @theme = theme + elsif theme.is_a?(Hash) + @theme = theme[:theme] || Themes::ThankfulEyes.new + else + raise ArgumentError, "invalid theme: #{theme.inspect}" + end + end + + def stream(tokens, &b) + tokens.each do |tok, val| + escape_sequence(tok).stream_value(val, &b) + end + end + + class EscapeSequence + attr_reader :style + def initialize(style) + @style = style + end + + def self.xterm_colors + @xterm_colors ||= [].tap do |out| + # colors 0..15: 16 basic colors + out << [0x00, 0x00, 0x00] # 0 + out << [0xcd, 0x00, 0x00] # 1 + out << [0x00, 0xcd, 0x00] # 2 + out << [0xcd, 0xcd, 0x00] # 3 + out << [0x00, 0x00, 0xee] # 4 + out << [0xcd, 0x00, 0xcd] # 5 + out << [0x00, 0xcd, 0xcd] # 6 + out << [0xe5, 0xe5, 0xe5] # 7 + out << [0x7f, 0x7f, 0x7f] # 8 + out << [0xff, 0x00, 0x00] # 9 + out << [0x00, 0xff, 0x00] # 10 + out << [0xff, 0xff, 0x00] # 11 + out << [0x5c, 0x5c, 0xff] # 12 + out << [0xff, 0x00, 0xff] # 13 + out << [0x00, 0xff, 0xff] # 14 + out << [0xff, 0xff, 0xff] # 15 + + # colors 16..232: the 6x6x6 color cube + valuerange = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff] + + 217.times do |i| + r = valuerange[(i / 36) % 6] + g = valuerange[(i / 6) % 6] + b = valuerange[i % 6] + out << [r, g, b] + end + + # colors 233..253: grayscale + 1.upto 22 do |i| + v = 8 + i * 10 + out << [v, v, v] + end + end + end + + def fg + return @fg if instance_variable_defined? :@fg + @fg = style.fg && self.class.color_index(style.fg) + end + + def bg + return @bg if instance_variable_defined? :@bg + @bg = style.bg && self.class.color_index(style.bg) + end + + + def stream_value(val, &b) + yield style_string + yield val.gsub("\e", "\\e") + .gsub("\n", "#{reset_string}\n#{style_string}") + yield reset_string + end + + def style_string + @style_string ||= begin + attrs = [] + + attrs << ['38', '5', fg.to_s] if fg + attrs << ['48', '5', bg.to_s] if bg + attrs << '01' if style[:bold] + attrs << '04' if style[:italic] # underline, but hey, whatevs + escape(attrs) + end + end + + def reset_string + @reset_string ||= begin + attrs = [] + attrs << '39' if fg # fg reset + attrs << '49' if bg # bg reset + attrs << '00' if style[:bold] || style[:italic] + + escape(attrs) + end + end + + private + def escape(attrs) + return '' if attrs.empty? + "\e[#{attrs.join(';')}m" + end + + def self.color_index(color) + @color_index_cache ||= {} + @color_index_cache[color] ||= closest_color(*get_rgb(color)) + end + + def self.get_rgb(color) + color = $1 if color =~ /#([0-9a-f]+)/i + hexes = case color.size + when 3 + color.chars.map { |c| "#{c}#{c}" } + when 6 + color.scan(/../) + else + raise "invalid color: #{color}" + end + + hexes.map { |h| h.to_i(16) } + end + + # max distance between two colors, #000000 to #ffffff + MAX_DISTANCE = 257 * 257 * 3 + + def self.closest_color(r, g, b) + @@colors_cache ||= {} + key = (r << 16) + (g << 8) + b + @@colors_cache.fetch(key) do + distance = MAX_DISTANCE + + match = 0 + + xterm_colors.each_with_index do |(cr, cg, cb), i| + d = (r - cr)**2 + (g - cg)**2 + (b - cb)**2 + next if d >= distance + + match = i + distance = d + end + + match + end + end + end + + class Unescape < EscapeSequence + def initialize(*) end + def style_string(*) '' end + def reset_string(*) '' end + def stream_value(val) yield val end + end + + # private + def escape_sequence(token) + return Unescape.new if escape?(token) + @escape_sequences ||= {} + @escape_sequences[token.qualname] ||= + make_escape_sequence(get_style(token)) + end + + def make_escape_sequence(style) + EscapeSequence.new(style) + end + + def get_style(token) + return text_style if token.ancestors.include? Token::Tokens::Text + + theme.get_own_style(token) || text_style + end + + def text_style + style = theme.get_style(Token['Text']) + # don't highlight text backgrounds + style.delete :bg + style + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/terminal_truecolor.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/terminal_truecolor.rb new file mode 100644 index 000000000000..07feab07b0a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/terminal_truecolor.rb @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true +module Rouge + module Formatters + class TerminalTruecolor < Terminal256 + tag 'terminal_truecolor' + + class TruecolorEscapeSequence < Terminal256::EscapeSequence + def style_string + @style_string ||= begin + out = String.new('') + out << escape(['48', '2', *get_rgb(style.bg)]) if style.bg + out << escape(['38', '2', *get_rgb(style.fg)]) if style.fg + out << escape(['1']) if style[:bold] || style[:italic] + out + end + end + + def get_rgb(color) + color = $1 if color =~ /#(\h+)/ + + case color.size + when 3 then color.chars.map { |c| c.to_i(16) * 2 } + when 6 then color.scan(/../).map { |cc| cc.to_i(16) } + else + raise "invalid color: #{color.inspect}" + end + end + end + + # @override + def make_escape_sequence(style) + TruecolorEscapeSequence.new(style) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/tex.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/tex.rb new file mode 100644 index 000000000000..e42c2bc9edb2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/formatters/tex.rb @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Formatters + class Tex < Formatter + tag 'tex' + + # A map of TeX escape characters. + # Newlines are handled specially by using #token_lines + # spaces are preserved as long as they aren't at the beginning + # of a line. see #tag_first for our initial-space strategy + ESCAPE = { + '&' => '\&', + '%' => '\%', + '$' => '\$', + '#' => '\#', + '_' => '\_', + '{' => '\{', + '}' => '\}', + '~' => '{\textasciitilde}', + '^' => '{\textasciicircum}', + '|' => '{\textbar}', + '\\' => '{\textbackslash}', + '`' => '{\textasciigrave}', + "'" => "'{}", + '"' => '"{}', + "\t" => '{\tab}', + } + + ESCAPE_REGEX = /[#{ESCAPE.keys.map(&Regexp.method(:escape)).join}]/om + + def initialize(opts={}) + @prefix = opts.fetch(:prefix) { 'RG' } + end + + def escape_tex(str) + str.gsub(ESCAPE_REGEX, ESCAPE) + end + + def stream(tokens, &b) + # surround the output with \begin{RG*}...\end{RG*} + yield "\\begin{#{@prefix}*}%\n" + + # we strip the newline off the last line to avoid + # an extra line being rendered. we do this by yielding + # the \newline tag *before* every line group except + # the first. + first = true + + token_lines tokens do |line| + if first + first = false + else + yield "\\newline%\n" + end + + render_line(line, &b) + end + + yield "%\n\\end{#{@prefix}*}%\n" + end + + def render_line(line, &b) + line.each do |(tok, val)| + hphantom_tag(tok, val, &b) + end + end + + # Special handling for leading spaces, since they may be gobbled + # by a previous command. We replace all initial spaces with + # \hphantom{xxxx}, which renders an empty space equal to the size + # of the x's. + def hphantom_tag(tok, val) + leading = nil + val.sub!(/^[ ]+/) { leading = $&.size; '' } + yield "\\hphantom{#{'x' * leading}}" if leading + yield tag(tok, val) unless val.empty? + end + + def tag(tok, val) + if escape?(tok) + val + elsif tok == Token::Tokens::Text + escape_tex(val) + else + "\\#@prefix{#{tok.shortname}}{#{escape_tex(val)}}" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guesser.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guesser.rb new file mode 100644 index 000000000000..7cfc3e676cb7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guesser.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +module Rouge + class Guesser + class Ambiguous < StandardError + attr_reader :alternatives + def initialize(alternatives); @alternatives = alternatives; end + + def message + "Ambiguous guess: can't decide between #{alternatives.map(&:tag).inspect}" + end + end + + def self.guess(guessers, lexers) + original_size = lexers.size + + guessers.each do |g| + new_lexers = case g + when Guesser then g.filter(lexers) + when proc { |x| x.respond_to? :call } then g.call(lexers) + else raise "bad guesser: #{g}" + end + + lexers = new_lexers && new_lexers.any? ? new_lexers : lexers + end + + # if we haven't filtered the input at *all*, + # then we have no idea what language it is, + # so we bail and return []. + lexers.size < original_size ? lexers : [] + end + + def collect_best(lexers, opts={}, &scorer) + best = [] + best_score = opts[:threshold] + + lexers.each do |lexer| + score = scorer.call(lexer) + + next if score.nil? + + if best_score.nil? || score > best_score + best_score = score + best = [lexer] + elsif score == best_score + best << lexer + end + end + + best + end + + def filter(lexers) + raise 'abstract' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/disambiguation.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/disambiguation.rb new file mode 100644 index 000000000000..0a111d50436b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/disambiguation.rb @@ -0,0 +1,136 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Disambiguation < Guesser + include Util + include Lexers + + def initialize(filename, source) + @filename = File.basename(filename) + @source = source + end + + def filter(lexers) + return lexers if lexers.size == 1 + return lexers if lexers.size == Lexer.all.size + + @analyzer = TextAnalyzer.new(get_source(@source)) + + self.class.disambiguators.each do |disambiguator| + next unless disambiguator.match?(@filename) + + filtered = disambiguator.decide!(self) + return filtered if filtered + end + + return lexers + end + + def contains?(text) + return @analyzer.include?(text) + end + + def matches?(re) + return !!(@analyzer =~ re) + end + + @disambiguators = [] + def self.disambiguate(*patterns, &decider) + @disambiguators << Disambiguator.new(patterns, &decider) + end + + def self.disambiguators + @disambiguators + end + + class Disambiguator + include Util + + def initialize(patterns, &decider) + @patterns = patterns + @decider = decider + end + + def decide!(guesser) + out = guesser.instance_eval(&@decider) + case out + when Array then out + when nil then nil + else [out] + end + end + + def match?(filename) + @patterns.any? { |p| test_glob(p, filename) } + end + end + + disambiguate '*.pl' do + next Perl if contains?('my $') + next Prolog if contains?(':-') + next Prolog if matches?(/\A\w+(\(\w+\,\s*\w+\))*\./) + end + + disambiguate '*.h' do + next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/) + next ObjectiveC if contains?('@"') + next Cpp if matches?(/^\s*(?:catch|class|constexpr|namespace|private| + protected|public|template|throw|try|using)\b/x) + + C + end + + disambiguate '*.m' do + next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/) + next ObjectiveC if contains?('@"') + + next Mathematica if contains?('(*') + next Mathematica if contains?(':=') + + next Mason if matches?(/<%(def|method|text|doc|args|flags|attr|init|once|shared|perl|cleanup|filter)([^>]*)(>)/) + + next Matlab if matches?(/^\s*?%/) + + next Mason if matches? %r!(</?%|<&)! + end + + disambiguate '*.php' do + # PHP always takes precedence over Hack + PHP + end + + disambiguate '*.hh' do + next Cpp if matches?(/^\s*#include/) + next Hack if matches?(/^<\?hh/) + next Hack if matches?(/(\(|, ?)\$\$/) + + Cpp + end + + disambiguate '*.plist' do + next XML if matches?(/\A<\?xml\b/) + + Plist + end + + disambiguate '*.sc' do + next Python if matches?(/^#/) + next SuperCollider if matches?(/(?:^~|;$)/) + + next Python + end + + disambiguate 'Messages' do + next MsgTrans if matches?(/^[^\s:]+:[^\s:]+/) + + next PlainText + end + + disambiguate '*.cls' do + next TeX if matches?(/\A\s*(?:\\|%)/) + next Apex + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/filename.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/filename.rb new file mode 100644 index 000000000000..2f01b4c9d869 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/filename.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Filename < Guesser + attr_reader :fname + def initialize(filename) + @filename = filename + end + + # returns a list of lexers that match the given filename with + # equal specificity (i.e. number of wildcards in the pattern). + # This helps disambiguate between, e.g. the Nginx lexer, which + # matches `nginx.conf`, and the Conf lexer, which matches `*.conf`. + # In this case, nginx will win because the pattern has no wildcards, + # while `*.conf` has one. + def filter(lexers) + mapping = {} + lexers.each do |lexer| + mapping[lexer.name] = lexer.filenames || [] + end + + GlobMapping.new(mapping, @filename).filter(lexers) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/glob_mapping.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/glob_mapping.rb new file mode 100644 index 000000000000..615ac2b32e83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/glob_mapping.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + # This class allows for custom behavior + # with glob -> lexer name mappings + class GlobMapping < Guesser + include Util + + def self.by_pairs(mapping, filename) + glob_map = {} + mapping.each do |(glob, lexer_name)| + lexer = Lexer.find(lexer_name) + + # ignore unknown lexers + next unless lexer + + glob_map[lexer.name] ||= [] + glob_map[lexer.name] << glob + end + + new(glob_map, filename) + end + + attr_reader :glob_map, :filename + def initialize(glob_map, filename) + @glob_map = glob_map + @filename = filename + end + + def filter(lexers) + basename = File.basename(filename) + + collect_best(lexers) do |lexer| + (@glob_map[lexer.name] || []).map do |pattern| + if test_glob(pattern, basename) + # specificity is better the fewer wildcards there are + -pattern.scan(/[*?\[]/).size + end + end.compact.min + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/mimetype.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/mimetype.rb new file mode 100644 index 000000000000..92a1d43e1514 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/mimetype.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Mimetype < Guesser + attr_reader :mimetype + def initialize(mimetype) + @mimetype = mimetype + end + + def filter(lexers) + lexers.select { |lexer| lexer.mimetypes.include? @mimetype } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/modeline.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/modeline.rb new file mode 100644 index 000000000000..97547982f23e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/modeline.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Modeline < Guesser + include Util + + # [jneen] regexen stolen from linguist + EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i + + # First form vim modeline + # [text]{white}{vi:|vim:|ex:}[white]{options} + # ex: 'vim: syntax=ruby' + VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i + + # Second form vim modeline (compatible with some versions of Vi) + # [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text] + # ex: 'vim set syntax=ruby:' + VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i + + MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2] + + def initialize(source, opts={}) + @source = source + @lines = opts[:lines] || 5 + end + + def filter(lexers) + # don't bother reading the stream if we've already decided + return lexers if lexers.size == 1 + + source_text = get_source(@source) + + lines = source_text.split(/\n/) + + search_space = (lines.first(@lines) + lines.last(@lines)).join("\n") + + matches = MODELINES.map { |re| re.match(search_space) }.compact + return lexers unless matches.any? + + match_set = Set.new(matches.map { |m| m[1] }) + lexers.select { |l| match_set.include?(l.tag) || l.aliases.any? { |a| match_set.include?(a) } } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/source.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/source.rb new file mode 100644 index 000000000000..90a51cdc990a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/source.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Source < Guesser + include Util + + attr_reader :source + def initialize(source) + @source = source + end + + def filter(lexers) + # don't bother reading the input if + # we've already filtered to 1 + return lexers if lexers.size == 1 + + source_text = get_source(@source) + + Lexer.assert_utf8!(source_text) + + source_text = TextAnalyzer.new(source_text) + + collect_best(lexers) do |lexer| + next unless lexer.detectable? + lexer.detect?(source_text) ? 1 : nil + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/util.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/util.rb new file mode 100644 index 000000000000..89c50bec986d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/guessers/util.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + module Util + module SourceNormalizer + UTF8_BOM = "\xEF\xBB\xBF" + UTF8_BOM_RE = /\A#{UTF8_BOM}/ + + # @param [String,nil] source + # @return [String,nil] + def self.normalize(source) + source.sub(UTF8_BOM_RE, '').gsub(/\r\n/, "\n") + end + end + + def test_glob(pattern, path) + File.fnmatch?(pattern, path, File::FNM_DOTMATCH | File::FNM_CASEFOLD) + end + + # @param [String,IO] source + # @return [String] + def get_source(source) + if source.respond_to?(:to_str) + SourceNormalizer.normalize(source.to_str) + elsif source.respond_to?(:read) + SourceNormalizer.normalize(source.read) + else + raise ArgumentError, "Invalid source: #{source.inspect}" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexer.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexer.rb new file mode 100644 index 000000000000..d2f088876c93 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexer.rb @@ -0,0 +1,535 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# stdlib +require 'strscan' +require 'cgi' +require 'set' + +module Rouge + # @abstract + # A lexer transforms text into a stream of `[token, chunk]` pairs. + class Lexer + include Token::Tokens + + @option_docs = {} + + class << self + # Lexes `stream` with the given options. The lex is delegated to a + # new instance. + # + # @see #lex + def lex(stream, opts={}, &b) + new(opts).lex(stream, &b) + end + + # In case #continue_lex is called statically, we simply + # begin a new lex from the beginning, since there is no state. + # + # @see #continue_lex + def continue_lex(*a, &b) + lex(*a, &b) + end + + # Given a name in string, return the correct lexer class. + # @param [String] name + # @return [Class<Rouge::Lexer>,nil] + def find(name) + registry[name.to_s] + end + + # Same as ::find_fancy, except instead of returning an instantiated + # lexer, returns a pair of [lexer_class, options], so that you can + # modify or provide additional options to the lexer. + # + # Please note: the lexer class might be nil! + def lookup_fancy(str, code=nil, default_options={}) + if str && !str.include?('?') && str != 'guess' + lexer_class = find(str) + return [lexer_class, default_options] + end + + name, opts = str ? str.split('?', 2) : [nil, ''] + + # parse the options hash from a cgi-style string + opts = CGI.parse(opts || '').map do |k, vals| + val = case vals.size + when 0 then true + when 1 then vals[0] + else vals + end + + [ k.to_s, val ] + end + + opts = default_options.merge(Hash[opts]) + + lexer_class = case name + when 'guess', nil + self.guess(:source => code, :mimetype => opts['mimetype']) + when String + self.find(name) + end + + [lexer_class, opts] + end + + # Find a lexer, with fancy shiny features. + # + # * The string you pass can include CGI-style options + # + # Lexer.find_fancy('erb?parent=tex') + # + # * You can pass the special name 'guess' so we guess for you, + # and you can pass a second argument of the code to guess by + # + # Lexer.find_fancy('guess', "#!/bin/bash\necho Hello, world") + # + # If the code matches more than one lexer then Guesser::Ambiguous + # is raised. + # + # This is used in the Redcarpet plugin as well as Rouge's own + # markdown lexer for highlighting internal code blocks. + # + def find_fancy(str, code=nil, default_options={}) + lexer_class, opts = lookup_fancy(str, code, default_options) + + lexer_class && lexer_class.new(opts) + end + + # Specify or get this lexer's title. Meant to be human-readable. + def title(t=nil) + if t.nil? + t = tag.capitalize + end + @title ||= t + end + + # Specify or get this lexer's description. + def desc(arg=:absent) + if arg == :absent + @desc + else + @desc = arg + end + end + + def option_docs + @option_docs ||= InheritableHash.new(superclass.option_docs) + end + + def option(name, desc) + option_docs[name.to_s] = desc + end + + # Specify or get the path name containing a small demo for + # this lexer (can be overriden by {demo}). + def demo_file(arg=:absent) + return @demo_file = Pathname.new(arg) unless arg == :absent + + @demo_file = Pathname.new(File.join(__dir__, 'demos', tag)) + end + + # Specify or get a small demo string for this lexer + def demo(arg=:absent) + return @demo = arg unless arg == :absent + + @demo = File.read(demo_file, mode: 'rt:bom|utf-8') + end + + # @return a list of all lexers. + def all + @all ||= registry.values.uniq + end + + # Guess which lexer to use based on a hash of info. + # + # This accepts the same arguments as Lexer.guess, but will never throw + # an error. It will return a (possibly empty) list of potential lexers + # to use. + def guesses(info={}) + mimetype, filename, source = info.values_at(:mimetype, :filename, :source) + custom_globs = info[:custom_globs] + + guessers = (info[:guessers] || []).dup + + guessers << Guessers::Mimetype.new(mimetype) if mimetype + guessers << Guessers::GlobMapping.by_pairs(custom_globs, filename) if custom_globs && filename + guessers << Guessers::Filename.new(filename) if filename + guessers << Guessers::Modeline.new(source) if source + guessers << Guessers::Source.new(source) if source + guessers << Guessers::Disambiguation.new(filename, source) if source && filename + + Guesser.guess(guessers, Lexer.all) + end + + # Guess which lexer to use based on a hash of info. + # + # @option info :mimetype + # A mimetype to guess by + # @option info :filename + # A filename to guess by + # @option info :source + # The source itself, which, if guessing by mimetype or filename + # fails, will be searched for shebangs, <!DOCTYPE ...> tags, and + # other hints. + # @param [Proc] fallback called if multiple lexers are detected. + # If omitted, Guesser::Ambiguous is raised. + # + # @see Lexer.detect? + # @see Lexer.guesses + # @return [Class<Rouge::Lexer>] + def guess(info={}, &fallback) + lexers = guesses(info) + + return Lexers::PlainText if lexers.empty? + return lexers[0] if lexers.size == 1 + + if fallback + fallback.call(lexers) + else + raise Guesser::Ambiguous.new(lexers) + end + end + + def guess_by_mimetype(mt) + guess :mimetype => mt + end + + def guess_by_filename(fname) + guess :filename => fname + end + + def guess_by_source(source) + guess :source => source + end + + def enable_debug! + @debug_enabled = true + end + + def disable_debug! + remove_instance_variable :@debug_enabled if defined? @debug_enabled + end + + def debug_enabled? + (defined? @debug_enabled) ? true : false + end + + # Determine if a lexer has a method named +:detect?+ defined in its + # singleton class. + def detectable? + return @detectable if defined?(@detectable) + @detectable = singleton_methods(false).include?(:detect?) + end + + protected + # @private + def register(name, lexer) + # reset an existing list of lexers + @all = nil if defined?(@all) + registry[name.to_s] = lexer + end + + public + # Used to specify or get the canonical name of this lexer class. + # + # @example + # class MyLexer < Lexer + # tag 'foo' + # end + # + # MyLexer.tag # => 'foo' + # + # Lexer.find('foo') # => MyLexer + def tag(t=nil) + return @tag if t.nil? + + @tag = t.to_s + Lexer.register(@tag, self) + end + + # Used to specify alternate names this lexer class may be found by. + # + # @example + # class Erb < Lexer + # tag 'erb' + # aliases 'eruby', 'rhtml' + # end + # + # Lexer.find('eruby') # => Erb + def aliases(*args) + args.map!(&:to_s) + args.each { |arg| Lexer.register(arg, self) } + (@aliases ||= []).concat(args) + end + + # Specify a list of filename globs associated with this lexer. + # + # If a filename glob is associated with more than one lexer, this can + # cause a Guesser::Ambiguous error to be raised in various guessing + # methods. These errors can be avoided by disambiguation. Filename globs + # are disambiguated in one of two ways. Either the lexer will define a + # `self.detect?` method (intended for use with shebangs and doctypes) or a + # manual rule will be specified in Guessers::Disambiguation. + # + # @example + # class Ruby < Lexer + # filenames '*.rb', '*.ruby', 'Gemfile', 'Rakefile' + # end + def filenames(*fnames) + (@filenames ||= []).concat(fnames) + end + + # Specify a list of mimetypes associated with this lexer. + # + # @example + # class Html < Lexer + # mimetypes 'text/html', 'application/xhtml+xml' + # end + def mimetypes(*mts) + (@mimetypes ||= []).concat(mts) + end + + # @private + def assert_utf8!(str) + encoding = str.encoding.name + return if encoding == 'US-ASCII' || encoding == 'UTF-8' || encoding == 'ASCII-8BIT' + + raise EncodingError.new( + "Bad encoding: #{str.encoding.names.join(',')}. " + + "Please convert your string to UTF-8." + ) + end + + private + def registry + @registry ||= {} + end + end + + # -*- instance methods -*- # + + attr_reader :options + # Create a new lexer with the given options. Individual lexers may + # specify extra options. The only current globally accepted option + # is `:debug`. + # + # @option opts :debug + # Prints debug information to stdout. The particular info depends + # on the lexer in question. In regex lexers, this will log the + # state stack at the beginning of each step, along with each regex + # tried and each stream consumed. Try it, it's pretty useful. + def initialize(opts={}) + @options = {} + opts.each { |k, v| @options[k.to_s] = v } + + @debug = Lexer.debug_enabled? && bool_option('debug') + end + + # Returns a new lexer with the given options set. Useful for e.g. setting + # debug flags post hoc, or providing global overrides for certain options + def with(opts={}) + new_options = @options.dup + opts.each { |k, v| new_options[k.to_s] = v } + self.class.new(new_options) + end + + def as_bool(val) + case val + when nil, false, 0, '0', 'false', 'off' + false + when Array + val.empty? ? true : as_bool(val.last) + else + true + end + end + + def as_string(val) + return as_string(val.last) if val.is_a?(Array) + + val ? val.to_s : nil + end + + def as_list(val) + case val + when Array + val.flat_map { |v| as_list(v) } + when String + val.split(',') + else + [] + end + end + + def as_lexer(val) + return as_lexer(val.last) if val.is_a?(Array) + return val.new(@options) if val.is_a?(Class) && val < Lexer + + case val + when Lexer + val + when String + lexer_class = Lexer.find(val) + lexer_class && lexer_class.new(@options) + end + end + + def as_token(val) + return as_token(val.last) if val.is_a?(Array) + case val + when Token + val + else + Token[val] + end + end + + def bool_option(name, &default) + name_str = name.to_s + + if @options.key?(name_str) + as_bool(@options[name_str]) + else + default ? default.call : false + end + end + + def string_option(name, &default) + as_string(@options.delete(name.to_s, &default)) + end + + def lexer_option(name, &default) + as_lexer(@options.delete(name.to_s, &default)) + end + + def list_option(name, &default) + as_list(@options.delete(name.to_s, &default)) + end + + def token_option(name, &default) + as_token(@options.delete(name.to_s, &default)) + end + + def hash_option(name, defaults, &val_cast) + name = name.to_s + out = defaults.dup + + base = @options.delete(name.to_s) + base = {} unless base.is_a?(Hash) + base.each { |k, v| out[k.to_s] = val_cast ? val_cast.call(v) : v } + + @options.keys.each do |key| + next unless key =~ /(\w+)\[(\w+)\]/ and $1 == name + value = @options.delete(key) + + out[$2] = val_cast ? val_cast.call(value) : value + end + + out + end + + # @abstract + # + # Called after each lex is finished. The default implementation + # is a noop. + def reset! + end + + # Given a string, yield [token, chunk] pairs. If no block is given, + # an enumerator is returned. + # + # @option opts :continue + # Continue the lex from the previous state (i.e. don't call #reset!) + # + # @note The use of :continue => true has been deprecated. A warning is + # issued if run with `$VERBOSE` set to true. + # + # @note The use of arbitrary `opts` has never been supported, but we + # previously ignored them with no error. We now warn unconditionally. + def lex(string, opts=nil, &b) + if opts + if (opts.keys - [:continue]).size > 0 + # improper use of options hash + warn('Improper use of Lexer#lex - this method does not receive options.' + + ' This will become an error in a future version.') + end + + if opts[:continue] + warn '`lex :continue => true` is deprecated, please use #continue_lex instead' + return continue_lex(string, &b) + end + end + + return enum_for(:lex, string) unless block_given? + + Lexer.assert_utf8!(string) + reset! + + continue_lex(string, &b) + end + + # Continue the lex from the the current state without resetting + def continue_lex(string, &b) + return enum_for(:continue_lex, string, &b) unless block_given? + + # consolidate consecutive tokens of the same type + last_token = nil + last_val = nil + stream_tokens(string) do |tok, val| + next if val.empty? + + if tok == last_token + last_val << val + next + end + + b.call(last_token, last_val) if last_token + last_token = tok + last_val = val + end + + b.call(last_token, last_val) if last_token + end + + # delegated to {Lexer.tag} + def tag + self.class.tag + end + + # @abstract + # + # Yield `[token, chunk]` pairs, given a prepared input stream. This + # must be implemented. + # + # @param [StringScanner] stream + # the stream + def stream_tokens(stream, &b) + raise 'abstract' + end + + # @abstract + # + # Return true if there is an in-text indication (such as a shebang + # or DOCTYPE declaration) that this lexer should be used. + # + # @param [TextAnalyzer] text + # the text to be analyzed, with a couple of handy methods on it, + # like {TextAnalyzer#shebang?} and {TextAnalyzer#doctype?} + def self.detect?(text) + false + end + end + + module Lexers + BASE_DIR = "#{__dir__}/lexers".freeze + @_loaded_lexers = {} + + def self.load_lexer(relpath) + return if @_loaded_lexers.key?(relpath) + @_loaded_lexers[relpath] = true + Kernel::load File.join(BASE_DIR, relpath) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/abap.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/abap.rb new file mode 100644 index 000000000000..8be9e950ce50 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/abap.rb @@ -0,0 +1,240 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# ABAP elements taken from http://help.sap.com/abapdocu_750/en/index.htm?file=abapdo.htm + +module Rouge + module Lexers + class ABAP < RegexLexer + title "ABAP" + desc "SAP - Advanced Business Application Programming" + tag 'abap' + filenames '*.abap' + mimetypes 'text/x-abap' + + def self.keywords + @keywords = Set.new %w( + *-INPUT ?TO ABAP-SOURCE ABBREVIATED ABS ABSTRACT ACCEPT ACCEPTING + ACCORDING ACCP ACTIVATION ACTUAL ADD ADD-CORRESPONDING ADJACENT + AFTER ALIAS ALIASES ALIGN ALL ALLOCATE ALPHA ANALYSIS ANALYZER AND + ANY APPEND APPENDAGE APPENDING APPLICATION ARCHIVE AREA ARITHMETIC + AS ASCENDING ASPECT ASSERT ASSIGN ASSIGNED ASSIGNING ASSOCIATION + ASYNCHRONOUS AT ATTRIBUTES AUTHORITY AUTHORITY-CHECK AVG BACK + BACKGROUND BACKUP BACKWARD BADI BASE BEFORE BEGIN BETWEEN BIG BINARY + BINTOHEX BIT BIT-AND BIT-NOT BIT-OR BIT-XOR BLACK BLANK BLANKS BLOB + BLOCK BLOCKS BLUE BOUND BOUNDARIES BOUNDS BOXED BREAK-POINT BT + BUFFER BY BYPASSING BYTE BYTE-CA BYTE-CN BYTE-CO BYTE-CS BYTE-NA + BYTE-NS BYTE-ORDER CA CALL CALLING CASE CAST CASTING CATCH CEIL + CENTER CENTERED CHAIN CHAIN-INPUT CHAIN-REQUEST CHANGE CHANGING + CHANNELS CHAR CHAR-TO-HEX CHARACTER CHECK CHECKBOX CIRCULAR CLASS + CLASS-CODING CLASS-DATA CLASS-EVENTS CLASS-METHODS CLASS-POOL + CLEANUP CLEAR CLIENT CLNT CLOB CLOCK CLOSE CN CO COALESCE CODE + CODING COLLECT COLOR COLUMN COLUMNS COL_BACKGROUND COL_GROUP + COL_HEADING COL_KEY COL_NEGATIVE COL_NORMAL COL_POSITIVE COL_TOTAL + COMMENT COMMENTS COMMIT COMMON COMMUNICATION COMPARING COMPONENT + COMPONENTS COMPRESSION COMPUTE CONCAT CONCATENATE CONCAT_WITH_SPACE + COND CONDENSE CONDITION CONNECT CONNECTION CONSTANTS CONTEXT + CONTEXTS CONTINUE CONTROL CONTROLS CONV CONVERSION CONVERT COPIES + COPY CORRESPONDING COUNT COUNTRY COVER CP CPI CREATE CREATING + CRITICAL CS CUKY CURR CURRENCY CURRENCY_CONVERSION CURRENT CURSOR + CURSOR-SELECTION CUSTOMER CUSTOMER-FUNCTION CX_DYNAMIC_CHECK + CX_NO_CHECK CX_ROOT CX_SQL_EXCEPTION CX_STATIC_CHECK DANGEROUS DATA + DATABASE DATAINFO DATASET DATE DATS DATS_ADD_DAYS DATS_ADD_MONTHS + DATS_DAYS_BETWEEN DATS_IS_VALID DAYLIGHT DD/MM/YY DD/MM/YYYY DDMMYY + DEALLOCATE DEC DECIMALS DECIMAL_SHIFT DECLARATIONS DEEP DEFAULT + DEFERRED DEFINE DEFINING DEFINITION DELETE DELETING DEMAND + DEPARTMENT DESCENDING DESCRIBE DESTINATION DETAIL DF16_DEC DF16_RAW + DF16_SCL DF34_DEC DF34_RAW DF34_SCL DIALOG DIRECTORY DISCONNECT + DISPLAY DISPLAY-MODE DISTANCE DISTINCT DIV DIVIDE + DIVIDE-CORRESPONDING DIVISION DO DUMMY DUPLICATE DUPLICATES DURATION + DURING DYNAMIC DYNPRO E EDIT EDITOR-CALL ELSE ELSEIF EMPTY ENABLED + ENABLING ENCODING END END-ENHANCEMENT-SECTION END-LINES + END-OF-DEFINITION END-OF-FILE END-OF-PAGE END-OF-SELECTION + END-TEST-INJECTION END-TEST-SEAM ENDAT ENDCASE ENDCATCH ENDCHAIN + ENDCLASS ENDDO ENDENHANCEMENT ENDEXEC ENDFORM ENDFUNCTION ENDIAN + ENDIF ENDING ENDINTERFACE ENDLOOP ENDMETHOD ENDMODULE ENDON + ENDPROVIDE ENDSELECT ENDTRY ENDWHILE ENDWITH ENGINEERING ENHANCEMENT + ENHANCEMENT-POINT ENHANCEMENT-SECTION ENHANCEMENTS ENTRIES ENTRY + ENVIRONMENT EQ EQUIV ERRORMESSAGE ERRORS ESCAPE ESCAPING EVENT + EVENTS EXACT EXCEPT EXCEPTION EXCEPTION-TABLE EXCEPTIONS EXCLUDE + EXCLUDING EXEC EXECUTE EXISTS EXIT EXIT-COMMAND EXPAND EXPANDING + EXPIRATION EXPLICIT EXPONENT EXPORT EXPORTING EXTEND EXTENDED + EXTENSION EXTRACT FAIL FETCH FIELD FIELD-GROUPS FIELD-SYMBOL + FIELD-SYMBOLS FIELDS FILE FILTER FILTER-TABLE FILTERS FINAL FIND + FIRST FIRST-LINE FIXED-POINT FKEQ FKGE FLOOR FLTP FLUSH FONT FOR + FORM FORMAT FORWARD FOUND FRAME FRAMES FREE FRIENDS FROM FUNCTION + FUNCTION-POOL FUNCTIONALITY FURTHER GAPS GE GENERATE GET + GET_PRINT_PARAMETERS GIVING GKEQ GKGE GLOBAL GRANT GREEN GROUP + GROUPS GT HANDLE HANDLER HARMLESS HASHED HAVING HDB HEAD-LINES + HEADER HEADERS HEADING HELP-ID HELP-REQUEST HEXTOBIN HIDE HIGH HINT + HOLD HOTSPOT I ICON ID IDENTIFICATION IDENTIFIER IDS IF + IF_ABAP_CLOSE_RESOURCE IF_ABAP_CODEPAGE IF_ABAP_DB_BLOB_HANDLE + IF_ABAP_DB_CLOB_HANDLE IF_ABAP_DB_LOB_HANDLE IF_ABAP_DB_READER + IF_ABAP_DB_WRITER IF_ABAP_READER IF_ABAP_WRITER IF_MESSAGE + IF_OS_CA_INSTANCE IF_OS_CA_PERSISTENCY IF_OS_FACTORY IF_OS_QUERY + IF_OS_QUERY_MANAGER IF_OS_QUERY_OPTIONS IF_OS_STATE + IF_OS_TRANSACTION IF_OS_TRANSACTION_MANAGER IF_SERIALIZABLE_OBJECT + IF_SHM_BUILD_INSTANCE IF_SYSTEM_UUID IF_T100_DYN_MSG IF_T100_MESSAGE + IGNORE IGNORING IMMEDIATELY IMPLEMENTATION IMPLEMENTATIONS + IMPLEMENTED IMPLICIT IMPORT IMPORTING IN INACTIVE INCL INCLUDE + INCLUDES INCLUDING INCREMENT INDEX INDEX-LINE INFOTYPES INHERITING + INIT INITIAL INITIALIZATION INNER INOUT INPUT INSERT INSTANCE + INSTANCES INSTR INT1 INT2 INT4 INT8 INTENSIFIED INTERFACE + INTERFACE-POOL INTERFACES INTERNAL INTERVALS INTO INVERSE + INVERTED-DATE IS ISO ITNO JOB JOIN KEEP KEEPING KERNEL KEY KEYS + KEYWORDS KIND LANG LANGUAGE LAST LATE LAYOUT LCHR LDB_PROCESS LE + LEADING LEAVE LEFT LEFT-JUSTIFIED LEFTPLUS LEFTSPACE LEGACY LENGTH + LET LEVEL LEVELS LIKE LINE LINE-COUNT LINE-SELECTION LINE-SIZE + LINEFEED LINES LIST LIST-PROCESSING LISTBOX LITTLE LLANG LOAD + LOAD-OF-PROGRAM LOB LOCAL LOCALE LOCATOR LOG-POINT LOGFILE LOGICAL + LONG LOOP LOW LOWER LPAD LPI LRAW LT LTRIM M MAIL MAIN MAJOR-ID + MAPPING MARGIN MARK MASK MATCH MATCHCODE MAX MAXIMUM MEDIUM MEMBERS + MEMORY MESH MESSAGE MESSAGE-ID MESSAGES MESSAGING METHOD METHODS MIN + MINIMUM MINOR-ID MM/DD/YY MM/DD/YYYY MMDDYY MOD MODE MODIF MODIFIER + MODIFY MODULE MOVE MOVE-CORRESPONDING MULTIPLY + MULTIPLY-CORRESPONDING NA NAME NAMETAB NATIVE NB NE NESTED NESTING + NEW NEW-LINE NEW-PAGE NEW-SECTION NEXT NO NO-DISPLAY NO-EXTENSION + NO-GAP NO-GAPS NO-GROUPING NO-HEADING NO-SCROLLING NO-SIGN NO-TITLE + NO-TOPOFPAGE NO-ZERO NODE NODES NON-UNICODE NON-UNIQUE NOT NP NS + NULL NUMBER NUMC O OBJECT OBJECTS OBLIGATORY OCCURRENCE OCCURRENCES + OCCURS OF OFF OFFSET ON ONLY OPEN OPTION OPTIONAL OPTIONS OR ORDER + OTHER OTHERS OUT OUTER OUTPUT OUTPUT-LENGTH OVERFLOW OVERLAY PACK + PACKAGE PAD PADDING PAGE PAGES PARAMETER PARAMETER-TABLE PARAMETERS + PART PARTIALLY PATTERN PERCENTAGE PERFORM PERFORMING PERSON PF + PF-STATUS PINK PLACES POOL POSITION POS_HIGH POS_LOW PRAGMAS PREC + PRECOMPILED PREFERRED PRESERVING PRIMARY PRINT PRINT-CONTROL + PRIORITY PRIVATE PROCEDURE PROCESS PROGRAM PROPERTY PROTECTED + PROVIDE PUBLIC PUSH PUSHBUTTON PUT QUAN QUEUE-ONLY QUICKINFO + RADIOBUTTON RAISE RAISING RANGE RANGES RAW RAWSTRING READ READ-ONLY + READER RECEIVE RECEIVED RECEIVER RECEIVING RED REDEFINITION REDUCE + REDUCED REF REFERENCE REFRESH REGEX REJECT REMOTE RENAMING REPLACE + REPLACEMENT REPLACING REPORT REQUEST REQUESTED RESERVE RESET + RESOLUTION RESPECTING RESPONSIBLE RESULT RESULTS RESUMABLE RESUME + RETRY RETURN RETURNCODE RETURNING RETURNS RIGHT RIGHT-JUSTIFIED + RIGHTPLUS RIGHTSPACE RISK RMC_COMMUNICATION_FAILURE + RMC_INVALID_STATUS RMC_SYSTEM_FAILURE ROLE ROLLBACK ROUND ROWS RPAD + RTRIM RUN SAP SAP-SPOOL SAVING SCALE_PRESERVING + SCALE_PRESERVING_SCIENTIFIC SCAN SCIENTIFIC + SCIENTIFIC_WITH_LEADING_ZERO SCREEN SCROLL SCROLL-BOUNDARY SCROLLING + SEARCH SECONDARY SECONDS SECTION SELECT SELECT-OPTIONS SELECTION + SELECTION-SCREEN SELECTION-SET SELECTION-SETS SELECTION-TABLE + SELECTIONS SEND SEPARATE SEPARATED SET SHARED SHIFT SHORT + SHORTDUMP-ID SIGN SIGN_AS_POSTFIX SIMPLE SINGLE SIZE SKIP SKIPPING + SMART SOME SORT SORTABLE SORTED SOURCE SPACE SPECIFIED SPLIT SPOOL + SPOTS SQL SQLSCRIPT SSTRING STABLE STAMP STANDARD START-OF-SELECTION + STARTING STATE STATEMENT STATEMENTS STATIC STATICS STATUSINFO + STEP-LOOP STOP STRING STRUCTURE STRUCTURES STYLE SUBKEY SUBMATCHES + SUBMIT SUBROUTINE SUBSCREEN SUBSTRING SUBTRACT + SUBTRACT-CORRESPONDING SUFFIX SUM SUMMARY SUMMING SUPPLIED SUPPLY + SUPPRESS SWITCH SWITCHSTATES SYMBOL SYNCPOINTS SYNTAX SYNTAX-CHECK + SYNTAX-TRACE SYST SYSTEM-CALL SYSTEM-EXCEPTIONS SYSTEM-EXIT TAB + TABBED TABLE TABLES TABLEVIEW TABSTRIP TARGET TASK TASKS TEST + TEST-INJECTION TEST-SEAM TESTING TEXT TEXTPOOL THEN THROW TIME TIMES + TIMESTAMP TIMEZONE TIMS TIMS_IS_VALID TITLE TITLE-LINES TITLEBAR TO + TOKENIZATION TOKENS TOP-LINES TOP-OF-PAGE TRACE-FILE TRACE-TABLE + TRAILING TRANSACTION TRANSFER TRANSFORMATION TRANSLATE TRANSPORTING + TRMAC TRUNCATE TRUNCATION TRY TSTMP_ADD_SECONDS + TSTMP_CURRENT_UTCTIMESTAMP TSTMP_IS_VALID TSTMP_SECONDS_BETWEEN TYPE + TYPE-POOL TYPE-POOLS TYPES ULINE UNASSIGN UNDER UNICODE UNION UNIQUE + UNIT UNIT_CONVERSION UNIX UNPACK UNTIL UNWIND UP UPDATE UPPER USER + USER-COMMAND USING UTF-8 VALID VALUE VALUE-REQUEST VALUES VARC VARY + VARYING VERIFICATION-MESSAGE VERSION VIA VIEW VISIBLE WAIT WARNING + WHEN WHENEVER WHERE WHILE WIDTH WINDOW WINDOWS WITH WITH-HEADING + WITH-TITLE WITHOUT WORD WORK WRITE WRITER XML XSD YELLOW YES YYMMDD + Z ZERO ZONE + ) + end + + def self.builtins + @keywords = Set.new %w( + acos apply asin assign atan attribute bit-set boolc boolx call + call-method cast ceil cfunc charlen char_off class_constructor clear + cluster cmax cmin cnt communication_failure concat_lines_of cond + cond-var condense constructor contains contains_any_not_of + contains_any_of copy cos cosh count count_any_not_of count_any_of + create cursor data dbmaxlen dbtab deserialize destructor distance + empty error_message escape exp extensible find find_any_not_of + find_any_of find_end floor frac from_mixed group hashed header idx + include index insert ipow itab key lax lines line_exists line_index + log log10 loop loop_key match matches me mesh_path namespace nmax + nmin node numeric numofchar object parameter primary_key read ref + repeat replace rescale resource_failure reverse root round segment + sender serialize shift_left shift_right sign simple sin sinh skip + sorted space sqrt standard strlen substring substring_after + substring_before substring_from substring_to sum switch switch-var + system_failure table table_line tan tanh template text to_lower + to_mixed to_upper transform translate trunc type value variable write + xsdbool xsequence xstrlen + ) + end + + def self.types + @types = Set.new %w( + b c d decfloat16 decfloat34 f i int8 n p s t x + clike csequence decfloat string xstring + ) + end + + def self.new_keywords + @types = Set.new %w( + DATA FIELD-SYMBOL + ) + end + + state :root do + rule %r/\s+/m, Text + + rule %r/".*/, Comment::Single + rule %r(^\*.*), Comment::Multiline + rule %r/\d+/, Num::Integer + rule %r/('|`)/, Str::Single, :single_string + rule %r/[\[\]\(\)\{\}\.,:\|]/, Punctuation + + # builtins / new ABAP 7.40 keywords (@DATA(), ...) + rule %r/(->|=>)?([A-Za-z][A-Za-z0-9_\-]*)(\()/ do |m| + if m[1] != '' + token Operator, m[1] + end + + if (self.class.new_keywords.include? m[2].upcase) && m[1].nil? + token Keyword, m[2] + elsif (self.class.builtins.include? m[2].downcase) && m[1].nil? + token Name::Builtin, m[2] + else + token Name, m[2] + end + token Punctuation, m[3] + end + + # keywords, types and normal text + rule %r/\w\w*/ do |m| + if self.class.keywords.include? m[0].upcase + token Keyword + elsif self.class.types.include? m[0].downcase + token Keyword::Type + else + token Name + end + end + + # operators + rule %r((->|->>|=>)), Operator + rule %r([-\*\+%/~=&\?<>!#\@\^]+), Operator + + end + + state :operators do + rule %r((->|->>|=>)), Operator + rule %r([-\*\+%/~=&\?<>!#\@\^]+), Operator + end + + state :single_string do + rule %r/\\./, Str::Escape + rule %r/(''|``)/, Str::Escape + rule %r/['`]/, Str::Single, :pop! + rule %r/[^\\'`]+/, Str::Single + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/actionscript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/actionscript.rb new file mode 100644 index 000000000000..557320ebdbb6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/actionscript.rb @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Actionscript < RegexLexer + title "ActionScript" + desc "ActionScript" + + tag 'actionscript' + aliases 'as', 'as3' + filenames '*.as' + mimetypes 'application/x-actionscript' + + state :comments_and_whitespace do + rule %r/\s+/, Text + rule %r(//.*?$), Comment::Single + rule %r(/\*.*?\*/)m, Comment::Multiline + end + + state :expr_start do + mixin :comments_and_whitespace + + rule %r(/) do + token Str::Regex + goto :regex + end + + rule %r/[{]/, Punctuation, :object + + rule %r//, Text, :pop! + end + + state :regex do + rule %r(/) do + token Str::Regex + goto :regex_end + end + + rule %r([^/]\n), Error, :pop! + + rule %r/\n/, Error, :pop! + rule %r/\[\^/, Str::Escape, :regex_group + rule %r/\[/, Str::Escape, :regex_group + rule %r/\\./, Str::Escape + rule %r{[(][?][:=<!]}, Str::Escape + rule %r/[{][\d,]+[}]/, Str::Escape + rule %r/[()?]/, Str::Escape + rule %r/./, Str::Regex + end + + state :regex_end do + rule %r/[gim]+/, Str::Regex, :pop! + rule(//) { pop! } + end + + state :regex_group do + # specially highlight / in a group to indicate that it doesn't + # close the regex + rule %r(/), Str::Escape + + rule %r([^/]\n) do + token Error + pop! 2 + end + + rule %r/\]/, Str::Escape, :pop! + rule %r/\\./, Str::Escape + rule %r/./, Str::Regex + end + + state :bad_regex do + rule %r/[^\n]+/, Error, :pop! + end + + def self.keywords + @keywords ||= Set.new %w( + for in while do break return continue switch case default + if else throw try catch finally new delete typeof is + this with + ) + end + + def self.declarations + @declarations ||= Set.new %w(var with function) + end + + def self.reserved + @reserved ||= Set.new %w( + dynamic final internal native public protected private class const + override static package interface extends implements namespace + set get import include super flash_proxy object_proxy trace + ) + end + + def self.constants + @constants ||= Set.new %w(true false null NaN Infinity undefined) + end + + def self.builtins + @builtins ||= %w( + void Function Math Class + Object RegExp decodeURI + decodeURIComponent encodeURI encodeURIComponent + eval isFinite isNaN parseFloat parseInt this + ) + end + + id = /[$a-zA-Z_][a-zA-Z0-9_]*/ + + state :root do + rule %r/\A\s*#!.*?\n/m, Comment::Preproc, :statement + rule %r/\n/, Text, :statement + rule %r((?<=\n)(?=\s|/|<!--)), Text, :expr_start + mixin :comments_and_whitespace + rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | === + | !== )x, + Operator, :expr_start + rule %r([:-<>+*%&|\^/!=]=?), Operator, :expr_start + rule %r/[(\[,]/, Punctuation, :expr_start + rule %r/;/, Punctuation, :statement + rule %r/[)\].]/, Punctuation + + rule %r/[?]/ do + token Punctuation + push :ternary + push :expr_start + end + + rule %r/[{}]/, Punctuation, :statement + + rule id do |m| + if self.class.keywords.include? m[0] + token Keyword + push :expr_start + elsif self.class.declarations.include? m[0] + token Keyword::Declaration + push :expr_start + elsif self.class.reserved.include? m[0] + token Keyword::Reserved + elsif self.class.constants.include? m[0] + token Keyword::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Other + end + end + + rule %r/\-?[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float + rule %r/0x[0-9a-fA-F]+/, Num::Hex + rule %r/\-?[0-9]+/, Num::Integer + rule %r/"(\\\\|\\"|[^"])*"/, Str::Double + rule %r/'(\\\\|\\'|[^'])*'/, Str::Single + end + + # braced parts that aren't object literals + state :statement do + rule %r/(#{id})(\s*)(:)/ do + groups Name::Label, Text, Punctuation + end + + rule %r/[{}]/, Punctuation + + mixin :expr_start + end + + # object literals + state :object do + mixin :comments_and_whitespace + rule %r/[}]/ do + token Punctuation + goto :statement + end + + rule %r/(#{id})(\s*)(:)/ do + groups Name::Attribute, Text, Punctuation + push :expr_start + end + + rule %r/:/, Punctuation + mixin :root + end + + # ternary expressions, where <id>: is not a label! + state :ternary do + rule %r/:/ do + token Punctuation + goto :expr_start + end + + mixin :root + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ada.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ada.rb new file mode 100644 index 000000000000..0e47ec71f05e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ada.rb @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Ada < RegexLexer + tag 'ada' + filenames '*.ada', '*.ads', '*.adb', '*.gpr' + mimetypes 'text/x-ada' + + title 'Ada' + desc 'The Ada 2012 programming language' + + # Ada identifiers are Unicode with underscores only allowed as separators. + ID = /\b[[:alpha:]](?:\p{Pc}?[[:alnum:]])*\b/ + + # Numerals can also contain underscores. + NUM = /\d(_?\d)*/ + XNUM = /\h(_?\h)*/ + EXP = /(E[-+]?#{NUM})?/i + + # Return a hash mapping lower-case identifiers to token classes. + def self.idents + @idents ||= Hash.new(Name).tap do |h| + %w( + abort abstract accept access aliased all array at begin body + case constant declare delay delta digits do else elsif end + exception exit for generic goto if in interface is limited + loop new null of others out overriding pragma private + protected raise range record renames requeue return reverse + select separate some synchronized tagged task terminate then + until use when while with + ).each {|w| h[w] = Keyword} + + %w(abs and mod not or rem xor).each {|w| h[w] = Operator::Word} + + %w( + entry function package procedure subtype type + ).each {|w| h[w] = Keyword::Declaration} + + %w( + boolean character constraint_error duration float integer + natural positive long_float long_integer long_long_float + long_long_integer program_error short_float short_integer + short_short_integer storage_error string tasking_error + wide_character wide_string wide_wide_character + wide_wide_string + ).each {|w| h[w] = Name::Builtin} + end + end + + state :whitespace do + rule %r{\s+}m, Text + rule %r{--.*$}, Comment::Single + end + + state :dquote_string do + rule %r{[^"\n]+}, Literal::String::Double + rule %r{""}, Literal::String::Escape + rule %r{"}, Literal::String::Double, :pop! + rule %r{\n}, Error, :pop! + end + + state :attr do + mixin :whitespace + rule ID, Name::Attribute, :pop! + rule %r{}, Text, :pop! + end + + # Handle a dotted name immediately following a declaration keyword. + state :decl_name do + mixin :whitespace + rule %r{body\b}i, Keyword::Declaration # package body Foo.Bar is... + rule %r{(#{ID})(\.)} do + groups Name::Namespace, Punctuation + end + # function "<=" (Left, Right: Type) is ... + rule %r{#{ID}|"(and|or|xor|/?=|<=?|>=?|\+|–|&\|/|mod|rem|\*?\*|abs|not)"}, + Name::Function, :pop! + rule %r{}, Text, :pop! + end + + # Handle a sequence of library unit names: with Ada.Foo, Ada.Bar; + # + # There's a chance we entered this state mistakenly since 'with' + # has multiple other uses in Ada (none of which are likely to + # appear at the beginning of a line). Try to bail as soon as + # possible if we see something suspicious like keywords. + # + # See ada_spec.rb for some examples. + state :libunit_name do + mixin :whitespace + + rule ID do |m| + t = self.class.idents[m[0].downcase] + if t <= Name + # Convert all kinds of Name to namespaces in this context. + token Name::Namespace + else + # Yikes, we're not supposed to get a keyword in a library unit name! + # We probably entered this state by mistake, so try to fix it. + token t + if t == Keyword::Declaration + goto :decl_name + else + pop! + end + end + end + + rule %r{[.,]}, Punctuation + rule %r{}, Text, :pop! + end + + state :root do + mixin :whitespace + + # String literals. + rule %r{'.'}, Literal::String::Char + rule %r{"[^"\n]*}, Literal::String::Double, :dquote_string + + # Real literals. + rule %r{#{NUM}\.#{NUM}#{EXP}}, Literal::Number::Float + rule %r{#{NUM}##{XNUM}\.#{XNUM}##{EXP}}, Literal::Number::Float + + # Integer literals. + rule %r{2#[01](_?[01])*##{EXP}}, Literal::Number::Bin + rule %r{8#[0-7](_?[0-7])*##{EXP}}, Literal::Number::Oct + rule %r{16##{XNUM}*##{EXP}}, Literal::Number::Hex + rule %r{#{NUM}##{XNUM}##{EXP}}, Literal::Number::Integer + rule %r{#{NUM}#\w+#}, Error + rule %r{#{NUM}#{EXP}}, Literal::Number::Integer + + # Special constructs. + rule %r{'}, Punctuation, :attr + rule %r{<<#{ID}>>}, Name::Label + + # Context clauses are tricky because the 'with' keyword is used + # for many purposes. Detect at beginning of the line only. + rule %r{^(?:(limited)(\s+))?(?:(private)(\s+))?(with)\b}i do + groups Keyword::Namespace, Text, Keyword::Namespace, Text, Keyword::Namespace + push :libunit_name + end + + # Operators and punctuation characters. + rule %r{[+*/&<=>|]|-|=>|\.\.|\*\*|[:></]=|<<|>>|<>}, Operator + rule %r{[.,:;()]}, Punctuation + + rule ID do |m| + t = self.class.idents[m[0].downcase] + token t + if t == Keyword::Declaration + push :decl_name + end + end + + # Flag word-like things that don't match the ID pattern. + rule %r{\b(\p{Pc}|[[alpha]])\p{Word}*}, Error + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apache.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apache.rb new file mode 100644 index 000000000000..2b8046bd4a55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apache.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +require 'yaml' + +module Rouge + module Lexers + class Apache < RegexLexer + title "Apache" + desc 'configuration files for Apache web server' + tag 'apache' + mimetypes 'text/x-httpd-conf', 'text/x-apache-conf' + filenames '.htaccess', 'httpd.conf' + + # self-modifying method that loads the keywords file + def self.directives + Kernel::load File.join(Lexers::BASE_DIR, 'apache/keywords.rb') + directives + end + + def self.sections + Kernel::load File.join(Lexers::BASE_DIR, 'apache/keywords.rb') + sections + end + + def self.values + Kernel::load File.join(Lexers::BASE_DIR, 'apache/keywords.rb') + values + end + + def name_for_token(token, tktype) + if self.class.sections.include? token + tktype + elsif self.class.directives.include? token + tktype + elsif self.class.values.include? token + tktype + else + Text + end + end + + state :whitespace do + rule %r/\#.*/, Comment + rule %r/\s+/m, Text + end + + state :root do + mixin :whitespace + + rule %r/(<\/?)(\w+)/ do |m| + groups Punctuation, name_for_token(m[2].downcase, Name::Label) + push :section + end + + rule %r/\w+/ do |m| + token name_for_token(m[0].downcase, Name::Class) + push :directive + end + end + + state :section do + # Match section arguments + rule %r/([^>]+)?(>(?:\r\n?|\n)?)/ do + groups Literal::String::Regex, Punctuation + pop! + end + + mixin :whitespace + end + + state :directive do + # Match value literals and other directive arguments + rule %r/\r\n?|\n/, Text, :pop! + + mixin :whitespace + + rule %r/\S+/ do |m| + token name_for_token(m[0].downcase, Literal::String::Symbol) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apache/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apache/keywords.rb new file mode 100644 index 000000000000..cd0ed9fe3437 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apache/keywords.rb @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# DO NOT EDIT +# This file is automatically generated by `rake builtins:apache`. +# See tasks/builtins/apache.rake for more info. + +module Rouge + module Lexers + class Apache + def self.directives + @directives ||= Set.new ["acceptfilter", "acceptpathinfo", "accessfilename", "action", "addalt", "addaltbyencoding", "addaltbytype", "addcharset", "adddefaultcharset", "adddescription", "addencoding", "addhandler", "addicon", "addiconbyencoding", "addiconbytype", "addinputfilter", "addlanguage", "addmoduleinfo", "addoutputfilter", "addoutputfilterbytype", "addtype", "alias", "aliasmatch", "allow", "allowconnect", "allowencodedslashes", "allowmethods", "allowoverride", "allowoverridelist", "anonymous", "anonymous_logemail", "anonymous_mustgiveemail", "anonymous_nouserid", "anonymous_verifyemail", "asyncrequestworkerfactor", "authbasicauthoritative", "authbasicfake", "authbasicprovider", "authbasicusedigestalgorithm", "authdbduserpwquery", "authdbduserrealmquery", "authdbmgroupfile", "authdbmtype", "authdbmuserfile", "authdigestalgorithm", "authdigestdomain", "authdigestnoncelifetime", "authdigestprovider", "authdigestqop", "authdigestshmemsize", "authformauthoritative", "authformbody", "authformdisablenostore", "authformfakebasicauth", "authformlocation", "authformloginrequiredlocation", "authformloginsuccesslocation", "authformlogoutlocation", "authformmethod", "authformmimetype", "authformpassword", "authformprovider", "authformsitepassphrase", "authformsize", "authformusername", "authgroupfile", "authldapauthorizeprefix", "authldapbindauthoritative", "authldapbinddn", "authldapbindpassword", "authldapcharsetconfig", "authldapcompareasuser", "authldapcomparednonserver", "authldapdereferencealiases", "authldapgroupattribute", "authldapgroupattributeisdn", "authldapinitialbindasuser", "authldapinitialbindpattern", "authldapmaxsubgroupdepth", "authldapremoteuserattribute", "authldapremoteuserisdn", "authldapsearchasuser", "authldapsubgroupattribute", "authldapsubgroupclass", "authldapurl", "authmerging", "authname", "authncachecontext", "authncacheenable", "authncacheprovidefor", "authncachesocache", "authncachetimeout", "authnzfcgicheckauthnprovider", "authnzfcgidefineprovider", "authtype", "authuserfile", "authzdbdlogintoreferer", "authzdbdquery", "authzdbdredirectquery", "authzdbmtype", "authzsendforbiddenonfailure", "balancergrowth", "balancerinherit", "balancermember", "balancerpersist", "brotlialteretag", "brotlicompressionmaxinputblock", "brotlicompressionquality", "brotlicompressionwindow", "brotlifilternote", "browsermatch", "browsermatchnocase", "bufferedlogs", "buffersize", "cachedefaultexpire", "cachedetailheader", "cachedirlength", "cachedirlevels", "cachedisable", "cacheenable", "cachefile", "cacheheader", "cacheignorecachecontrol", "cacheignoreheaders", "cacheignorenolastmod", "cacheignorequerystring", "cacheignoreurlsessionidentifiers", "cachekeybaseurl", "cachelastmodifiedfactor", "cachelock", "cachelockmaxage", "cachelockpath", "cachemaxexpire", "cachemaxfilesize", "cacheminexpire", "cacheminfilesize", "cachenegotiateddocs", "cachequickhandler", "cachereadsize", "cachereadtime", "cacheroot", "cachesocache", "cachesocachemaxsize", "cachesocachemaxtime", "cachesocachemintime", "cachesocachereadsize", "cachesocachereadtime", "cachestaleonerror", "cachestoreexpired", "cachestorenostore", "cachestoreprivate", "cgidscripttimeout", "cgimapextension", "cgipassauth", "cgivar", "charsetdefault", "charsetoptions", "charsetsourceenc", "checkcaseonly", "checkspelling", "chrootdir", "contentdigest", "cookiedomain", "cookieexpires", "cookiename", "cookiestyle", "cookietracking", "coredumpdirectory", "customlog", "dav", "davdepthinfinity", "davgenericlockdb", "davlockdb", "davmintimeout", "dbdexptime", "dbdinitsql", "dbdkeep", "dbdmax", "dbdmin", "dbdparams", "dbdpersist", "dbdpreparesql", "dbdriver", "defaulticon", "defaultlanguage", "defaultruntimedir", "defaulttype", "define", "deflatebuffersize", "deflatecompressionlevel", "deflatefilternote", "deflateinflatelimitrequestbody", "deflateinflateratioburst", "deflateinflateratiolimit", "deflatememlevel", "deflatewindowsize", "deny", "directorycheckhandler", "directoryindex", "directoryindexredirect", "directoryslash", "documentroot", "dtraceprivileges", "dumpioinput", "dumpiooutput", "enableexceptionhook", "enablemmap", "enablesendfile", "error", "errordocument", "errorlog", "errorlogformat", "example", "expiresactive", "expiresbytype", "expiresdefault", "extendedstatus", "extfilterdefine", "extfilteroptions", "fallbackresource", "fileetag", "filterchain", "filterdeclare", "filterprotocol", "filterprovider", "filtertrace", "forcelanguagepriority", "forcetype", "forensiclog", "globallog", "gprofdir", "gracefulshutdowntimeout", "group", "h2copyfiles", "h2direct", "h2earlyhints", "h2maxsessionstreams", "h2maxworkeridleseconds", "h2maxworkers", "h2minworkers", "h2moderntlsonly", "h2push", "h2pushdiarysize", "h2pushpriority", "h2pushresource", "h2serializeheaders", "h2streammaxmemsize", "h2tlscooldownsecs", "h2tlswarmupsize", "h2upgrade", "h2windowsize", "header", "headername", "heartbeataddress", "heartbeatlisten", "heartbeatmaxservers", "heartbeatstorage", "heartbeatstorage", "hostnamelookups", "httpprotocoloptions", "identitycheck", "identitychecktimeout", "imapbase", "imapdefault", "imapmenu", "include", "includeoptional", "indexheadinsert", "indexignore", "indexignorereset", "indexoptions", "indexorderdefault", "indexstylesheet", "inputsed", "isapiappendlogtoerrors", "isapiappendlogtoquery", "isapicachefile", "isapifakeasync", "isapilognotsupported", "isapireadaheadbuffer", "keepalive", "keepalivetimeout", "keptbodysize", "languagepriority", "ldapcacheentries", "ldapcachettl", "ldapconnectionpoolttl", "ldapconnectiontimeout", "ldaplibrarydebug", "ldapopcacheentries", "ldapopcachettl", "ldapreferralhoplimit", "ldapreferrals", "ldapretries", "ldapretrydelay", "ldapsharedcachefile", "ldapsharedcachesize", "ldaptimeout", "ldaptrustedclientcert", "ldaptrustedglobalcert", "ldaptrustedmode", "ldapverifyservercert", "limitinternalrecursion", "limitrequestbody", "limitrequestfields", "limitrequestfieldsize", "limitrequestline", "limitxmlrequestbody", "listen", "listenbacklog", "listencoresbucketsratio", "loadfile", "loadmodule", "logformat", "logiotrackttfb", "loglevel", "logmessage", "luaauthzprovider", "luacodecache", "luahookaccesschecker", "luahookauthchecker", "luahookcheckuserid", "luahookfixups", "luahookinsertfilter", "luahooklog", "luahookmaptostorage", "luahooktranslatename", "luahooktypechecker", "luainherit", "luainputfilter", "luamaphandler", "luaoutputfilter", "luapackagecpath", "luapackagepath", "luaquickhandler", "luaroot", "luascope", "maxconnectionsperchild", "maxkeepaliverequests", "maxmemfree", "maxrangeoverlaps", "maxrangereversals", "maxranges", "maxrequestworkers", "maxspareservers", "maxsparethreads", "maxthreads", "mdbaseserver", "mdcachallenges", "mdcertificateagreement", "mdcertificateauthority", "mdcertificateprotocol", "mddrivemode", "mdhttpproxy", "mdmember", "mdmembers", "mdmuststaple", "mdnotifycmd", "mdomain", "mdportmap", "mdprivatekeys", "mdrenewwindow", "mdrequirehttps", "mdstoredir", "memcacheconnttl", "mergetrailers", "metadir", "metafiles", "metasuffix", "mimemagicfile", "minspareservers", "minsparethreads", "mmapfile", "modemstandard", "modmimeusepathinfo", "multiviewsmatch", "mutex", "namevirtualhost", "noproxy", "nwssltrustedcerts", "nwsslupgradeable", "options", "order", "outputsed", "passenv", "pidfile", "privilegesmode", "protocol", "protocolecho", "protocols", "protocolshonororder", "proxyaddheaders", "proxybadheader", "proxyblock", "proxydomain", "proxyerroroverride", "proxyexpressdbmfile", "proxyexpressdbmtype", "proxyexpressenable", "proxyfcgibackendtype", "proxyfcgisetenvif", "proxyftpdircharset", "proxyftpescapewildcards", "proxyftplistonwildcard", "proxyhcexpr", "proxyhctemplate", "proxyhctpsize", "proxyhtmlbufsize", "proxyhtmlcharsetout", "proxyhtmldoctype", "proxyhtmlenable", "proxyhtmlevents", "proxyhtmlextended", "proxyhtmlfixups", "proxyhtmlinterp", "proxyhtmllinks", "proxyhtmlmeta", "proxyhtmlstripcomments", "proxyhtmlurlmap", "proxyiobuffersize", "proxymaxforwards", "proxypass", "proxypassinherit", "proxypassinterpolateenv", "proxypassmatch", "proxypassreverse", "proxypassreversecookiedomain", "proxypassreversecookiepath", "proxypreservehost", "proxyreceivebuffersize", "proxyremote", "proxyremotematch", "proxyrequests", "proxyscgiinternalredirect", "proxyscgisendfile", "proxyset", "proxysourceaddress", "proxystatus", "proxytimeout", "proxyvia", "qualifyredirecturl", "readmename", "receivebuffersize", "redirect", "redirectmatch", "redirectpermanent", "redirecttemp", "reflectorheader", "registerhttpmethod", "remoteipheader", "remoteipinternalproxy", "remoteipinternalproxylist", "remoteipproxiesheader", "remoteipproxyprotocol", "remoteipproxyprotocolexceptions", "remoteiptrustedproxy", "remoteiptrustedproxylist", "removecharset", "removeencoding", "removehandler", "removeinputfilter", "removelanguage", "removeoutputfilter", "removetype", "requestheader", "requestreadtimeout", "require", "rewritebase", "rewritecond", "rewriteengine", "rewritemap", "rewriteoptions", "rewriterule", "rlimitcpu", "rlimitmem", "rlimitnproc", "satisfy", "scoreboardfile", "script", "scriptalias", "scriptaliasmatch", "scriptinterpretersource", "scriptlog", "scriptlogbuffer", "scriptloglength", "scriptsock", "securelisten", "seerequesttail", "sendbuffersize", "serveradmin", "serveralias", "serverlimit", "servername", "serverpath", "serverroot", "serversignature", "servertokens", "session", "sessioncookiename", "sessioncookiename2", "sessioncookieremove", "sessioncryptocipher", "sessioncryptodriver", "sessioncryptopassphrase", "sessioncryptopassphrasefile", "sessiondbdcookiename", "sessiondbdcookiename2", "sessiondbdcookieremove", "sessiondbddeletelabel", "sessiondbdinsertlabel", "sessiondbdperuser", "sessiondbdselectlabel", "sessiondbdupdatelabel", "sessionenv", "sessionexclude", "sessionheader", "sessioninclude", "sessionmaxage", "setenv", "setenvif", "setenvifexpr", "setenvifnocase", "sethandler", "setinputfilter", "setoutputfilter", "ssiendtag", "ssierrormsg", "ssietag", "ssilastmodified", "ssilegacyexprparser", "ssistarttag", "ssitimeformat", "ssiundefinedecho", "sslcacertificatefile", "sslcacertificatepath", "sslcadnrequestfile", "sslcadnrequestpath", "sslcarevocationcheck", "sslcarevocationfile", "sslcarevocationpath", "sslcertificatechainfile", "sslcertificatefile", "sslcertificatekeyfile", "sslciphersuite", "sslcompression", "sslcryptodevice", "sslengine", "sslfips", "sslhonorcipherorder", "sslinsecurerenegotiation", "sslocspdefaultresponder", "sslocspenable", "sslocspnoverify", "sslocspoverrideresponder", "sslocspproxyurl", "sslocsprespondercertificatefile", "sslocsprespondertimeout", "sslocspresponsemaxage", "sslocspresponsetimeskew", "sslocspuserequestnonce", "sslopensslconfcmd", "ssloptions", "sslpassphrasedialog", "sslprotocol", "sslproxycacertificatefile", "sslproxycacertificatepath", "sslproxycarevocationcheck", "sslproxycarevocationfile", "sslproxycarevocationpath", "sslproxycheckpeercn", "sslproxycheckpeerexpire", "sslproxycheckpeername", "sslproxyciphersuite", "sslproxyengine", "sslproxymachinecertificatechainfile", "sslproxymachinecertificatefile", "sslproxymachinecertificatepath", "sslproxyprotocol", "sslproxyverify", "sslproxyverifydepth", "sslrandomseed", "sslrenegbuffersize", "sslrequire", "sslrequiressl", "sslsessioncache", "sslsessioncachetimeout", "sslsessionticketkeyfile", "sslsessiontickets", "sslsrpunknownuserseed", "sslsrpverifierfile", "sslstaplingcache", "sslstaplingerrorcachetimeout", "sslstaplingfaketrylater", "sslstaplingforceurl", "sslstaplingrespondertimeout", "sslstaplingresponsemaxage", "sslstaplingresponsetimeskew", "sslstaplingreturnrespondererrors", "sslstaplingstandardcachetimeout", "sslstrictsnivhostcheck", "sslusername", "sslusestapling", "sslverifyclient", "sslverifydepth", "startservers", "startthreads", "substitute", "substituteinheritbefore", "substitutemaxlinelength", "suexec", "suexecusergroup", "threadlimit", "threadsperchild", "threadstacksize", "timeout", "traceenable", "transferlog", "typesconfig", "undefine", "undefmacro", "unsetenv", "use", "usecanonicalname", "usecanonicalphysicalport", "user", "userdir", "vhostcgimode", "vhostcgiprivs", "vhostgroup", "vhostprivs", "vhostsecure", "vhostuser", "virtualdocumentroot", "virtualdocumentrootip", "virtualscriptalias", "virtualscriptaliasip", "watchdoginterval", "xbithack", "xml2encalias", "xml2encdefault", "xml2startparse"] + end + + def self.sections + @sections ||= Set.new ["authnprovideralias", "authzprovideralias", "directory", "directorymatch", "else", "elseif", "files", "filesmatch", "if", "ifdefine", "ifmodule", "ifversion", "limit", "limitexcept", "location", "locationmatch", "macro", "mdomainset", "proxy", "proxymatch", "requireall", "requireany", "requirenone", "virtualhost"] + end + + def self.values + @values ||= Set.new ["add", "addaltclass", "addsuffix", "alias", "all", "allow", "allowanyuri", "allownoslash", "always", "and", "any", "ap_auth_internal_per_uri", "api_version", "append", "ascending", "attribute", "auth", "auth-int", "authconfig", "auto", "backend-address", "balancer_name", "balancer_route_changed", "balancer_session_route", "balancer_session_sticky", "balancer_worker_name", "balancer_worker_route", "base", "basedn", "basic", "before", "block", "boolean", "byte", "byteranges", "cache", "cache-hit", "cache-invalidate", "cache-miss", "cache-revalidate", "cgi", "chain", "change", "charset", "circle", "cmd", "conditional-expression", "condpattern", "conn", "conn_remote_addr", "cookie", "cookie2", "current-uri", "date", "date_gmt", "date_local", "db", "dbm", "decoding", "default", "deny", "descending", "description", "descriptionwidth", "digest", "disabled", "disableenv", "dns", "document_args", "document_name", "document_root", "document_uri", "domain", "double", "duration", "early", "echo", "echomsg", "edit", "edit*", "email", "enableenv", "encoding", "env", "environment-variable-name", "errmsg", "error", "errorlog", "errorlogformat", "execcgi", "expr", "fallback", "fancyindexing", "fast", "file", "file-group", "file-owner", "fileinfo", "filename", "filter", "filter-name", "filter_name", "filters", "finding", "first-dot", "foldersfirst", "followsymlinks", "forever", "form", "formatted", "fpm", "from", "ftype", "full", "function_name", "gdbm", "generic", "gone", "handlers", "hit", "hook_function_name", "host", "hostname", "hse_append_log_parameter", "hse_req_done_with_session", "hse_req_is_connected", "hse_req_is_keep_conn", "hse_req_map_url_to_path", "hse_req_send_response_header", "hse_req_send_response_header_ex", "hse_req_send_url", "hse_req_send_url_redirect_resp", "html", "htmltable", "https", "iconheight", "iconsarelinks", "iconwidth", "ignore", "ignorecase", "ignoreclient", "ignorecontextinfo", "ignoreinherit", "imal", "in", "includes", "includesnoexec", "indexes", "inherit", "inheritbefore", "inheritdown", "inheritdownbefore", "inode", "input", "int", "integer", "intype", "ipaddr", "is_subreq", "iserror", "last-dot", "last_modified", "ldap", "leaf", "legacyprefixdocroot", "level", "limit", "log_function_name", "major", "manual", "map", "map1", "map2", "max", "md5", "md5-sess", "menu", "merge", "mergebase", "minor", "miss", "mod_cache_disk", "mod_cache_socache", "mode", "mtime", "multiviews", "mutual-failure", "mysql", "name", "namewidth", "ndbm", "negotiatedonly", "never", "no", "nochange", "nocontent", "nodecode", "none", "nonfatal", "note", "number-of-ranges", "odbc", "off", "on", "once", "onerror", "onfail", "option", "optional", "options", "or", "oracle", "order", "original-uri", "os", "output", "outtype", "parent-first", "parent-last", "path", "path_info", "permanent", "pipe", "point", "poly", "postgresql", "prefer", "preservescontentlength", "prg", "protocol", "provider-name", "provider_name", "proxy", "proxy-chain-auth", "proxy-fcgi-pathinfo", "proxy-initial-not-pooled", "proxy-interim-response", "proxy-nokeepalive", "proxy-scgi-pathinfo", "proxy-sendcl", "proxy-sendextracrlf", "proxy-source-port", "proxy-status", "qs", "query_string_unescaped", "range", "ratio", "rect", "referer", "regex", "registry", "registry-strict", "remote_addr", "remote_host", "remote_ident", "remote_user", "remove", "request", "request_filename", "request_rec", "request_scheme", "request_uri", "reset", "revalidate", "rewritecond", "rfc2109", "rnd", "scanhtmltitles", "scope", "script", "sdbm", "searching", "secure", "seeother", "selective", "semiformatted", "server", "server_addr", "server_admin", "server_name", "set", "setifempty", "showforbidden", "size", "sizefmt", "sqlite2", "sqlite3", "ssl", "ssl-access-forbidden", "ssl-secure-reneg", "startbody", "stat", "string", "string1", "subnet", "suppresscolumnsorting", "suppressdescription", "suppresshtmlpreamble", "suppressicon", "suppresslastmodified", "suppressrules", "suppresssize", "symlinksifownermatch", "temp", "temporary", "test_condition1", "the_request", "thread", "timefmt", "tls", "to-pattern", "trackmodified", "transform", "txt", "type", "uctonly", "uid", "unescape", "unformatted", "unlimited", "unset", "uri-pattern", "url", "url-of-terms-of-service", "url-path", "useolddateformat", "value", "value-expression", "var", "versionsort", "virtual", "x-forwarded-for", "x-forwarded-host", "x-forwarded-server", "xhtml"] + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apex.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apex.rb new file mode 100644 index 000000000000..79b5d33ddbcf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apex.rb @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Apex < RegexLexer + title "Apex" + desc "The Apex programming language (provided by salesforce)" + + tag 'apex' + filenames '*.cls' + mimetypes 'text/x-apex' + + def self.keywords + @keywords ||= Set.new %w( + assert break case catch continue default do else finally for if goto + instanceof new return switch this throw try while insert update + delete + ) + end + + def self.declarations + @declarations ||= Set.new %w( + abstract const enum extends final implements native private protected + public static super synchronized throws transient volatile with + sharing without inherited virtual global testmethod + ) + end + + def self.soql + @soql ||= Set.new %w( + SELECT FROM WHERE UPDATE LIKE TYPEOF END USING SCOPE WITH DATA + CATEGORY GROUP BY ROLLUP CUBE HAVING ORDER BY ASC DESC NULLS FIRST + LAST LIMIT OFFSET FOR VIEW REFERENCE UPDATE TRACKING VIEWSTAT OR AND + ) + end + + def self.types + @types ||= Set.new %w( + String boolean byte char double float int long short var void + ) + end + + def self.constants + @constants ||= Set.new %w(true false null) + end + + id = /[a-z_][a-z0-9_]*/i + + state :root do + rule %r/\s+/m, Text + + rule %r(//.*?$), Comment::Single + rule %r(/\*.*?\*/)m, Comment::Multiline + + rule %r/(?:class|interface)\b/, Keyword::Declaration, :class + rule %r/import\b/, Keyword::Namespace, :import + + rule %r/([@$.]?)(#{id})([:(]?)/io do |m| + lowercased = m[0].downcase + uppercased = m[0].upcase + if self.class.keywords.include? lowercased + token Keyword + elsif self.class.soql.include? uppercased + token Keyword + elsif self.class.declarations.include? lowercased + token Keyword::Declaration + elsif self.class.types.include? lowercased + token Keyword::Type + elsif self.class.constants.include? lowercased + token Keyword::Constant + elsif lowercased == 'package' + token Keyword::Namespace + elsif m[1] == "@" + token Name::Decorator + elsif m[3] == ":" + groups Operator, Name::Label, Punctuation + elsif m[3] == "(" + groups Operator, Name::Function, Punctuation + elsif m[1] == "." + groups Operator, Name::Property, Punctuation + else + token Name + end + end + + rule %r/"/, Str::Double, :dq + rule %r/'/, Str::Single, :sq + + digit = /[0-9]_+[0-9]|[0-9]/ + rule %r/#{digit}+\.#{digit}+([eE]#{digit}+)?[fd]?/, Num::Float + rule %r/0b(?:[01]_+[01]|[01])+/i, Num::Bin + rule %r/0x(?:\h_+\h|\h)+/i, Num::Hex + rule %r/0(?:[0-7]_+[0-7]|[0-7])+/, Num::Oct + rule %r/#{digit}+L?/, Num::Integer + + rule %r/[-+\/*~^!%&<>|=.?]/, Operator + rule %r/[\[\](){},:;]/, Punctuation; + end + + state :class do + rule %r/\s+/m, Text + rule id, Name::Class, :pop! + end + + state :import do + rule %r/\s+/m, Text + rule %r/[a-z0-9_.]+\*?/i, Name::Namespace, :pop! + end + + state :escape do + rule %r/\\[btnfr\\"']/, Str::Escape + end + + state :dq do + mixin :escape + rule %r/[^\\"]+/, Str::Double + rule %r/"/, Str::Double, :pop! + end + + state :sq do + mixin :escape + rule %r/[^\\']+/, Str::Double + rule %r/'/, Str::Double, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apiblueprint.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apiblueprint.rb new file mode 100644 index 000000000000..7695c3908141 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apiblueprint.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'markdown.rb' + + class APIBlueprint < Markdown + title 'API Blueprint' + desc 'Markdown based API description language.' + + tag 'apiblueprint' + aliases 'apiblueprint', 'apib' + filenames '*.apib' + mimetypes 'text/vnd.apiblueprint' + + prepend :root do + # Metadata + rule(/(\S+)(:\s*)(.*)$/) do + groups Name::Variable, Punctuation, Literal::String + end + + # Resource Group + rule(/^(#+)(\s*Group\s+)(.*)$/) do + groups Punctuation, Keyword, Generic::Heading + end + + # Resource \ Action + rule(/^(#+)(.*)(\[.*\])$/) do + groups Punctuation, Generic::Heading, Literal::String + end + + # Relation + rule(/^([\+\-\*])(\s*Relation:)(\s*.*)$/) do + groups Punctuation, Keyword, Literal::String + end + + # MSON + rule(/^(\s+[\+\-\*]\s*)(Attributes|Parameters)(.*)$/) do + groups Punctuation, Keyword, Literal::String + end + + # Request/Response + rule(/^([\+\-\*]\s*)(Request|Response)(\s+\d\d\d)?(.*)$/) do + groups Punctuation, Keyword, Literal::Number, Literal::String + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apple_script.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apple_script.rb new file mode 100644 index 000000000000..bc4bb1a594b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/apple_script.rb @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class AppleScript < RegexLexer + title "AppleScript" + desc "The AppleScript scripting language by Apple Inc. (http://developer.apple.com/applescript/)" + + tag 'applescript' + aliases 'applescript' + + filenames '*.applescript', '*.scpt' + + mimetypes 'application/x-applescript' + + def self.literals + @literals ||= ['AppleScript', 'current application', 'false', 'linefeed', + 'missing value', 'pi','quote', 'result', 'return', 'space', + 'tab', 'text item delimiters', 'true', 'version'] + end + + def self.classes + @classes ||= ['alias ', 'application ', 'boolean ', 'class ', 'constant ', + 'date ', 'file ', 'integer ', 'list ', 'number ', 'POSIX file ', + 'real ', 'record ', 'reference ', 'RGB color ', 'script ', + 'text ', 'unit types', '(?:Unicode )?text', 'string'] + end + + def self.builtins + @builtins ||= ['attachment', 'attribute run', 'character', 'day', 'month', + 'paragraph', 'word', 'year'] + end + + def self.handler_params + @handler_params ||= ['about', 'above', 'against', 'apart from', 'around', + 'aside from', 'at', 'below', 'beneath', 'beside', + 'between', 'for', 'given', 'instead of', 'on', 'onto', + 'out of', 'over', 'since'] + end + + def self.commands + @commands ||= ['ASCII (character|number)', 'activate', 'beep', 'choose URL', + 'choose application', 'choose color', 'choose file( name)?', + 'choose folder', 'choose from list', + 'choose remote application', 'clipboard info', + 'close( access)?', 'copy', 'count', 'current date', 'delay', + 'delete', 'display (alert|dialog)', 'do shell script', + 'duplicate', 'exists', 'get eof', 'get volume settings', + 'info for', 'launch', 'list (disks|folder)', 'load script', + 'log', 'make', 'mount volume', 'new', 'offset', + 'open( (for access|location))?', 'path to', 'print', 'quit', + 'random number', 'read', 'round', 'run( script)?', + 'say', 'scripting components', + 'set (eof|the clipboard to|volume)', 'store script', + 'summarize', 'system attribute', 'system info', + 'the clipboard', 'time to GMT', 'write', 'quoted form'] + end + + def self.references + @references ||= ['(in )?back of', '(in )?front of', '[0-9]+(st|nd|rd|th)', + 'first', 'second', 'third', 'fourth', 'fifth', 'sixth', + 'seventh', 'eighth', 'ninth', 'tenth', 'after', 'back', + 'before', 'behind', 'every', 'front', 'index', 'last', + 'middle', 'some', 'that', 'through', 'thru', 'where', 'whose'] + end + + def self.operators + @operators ||= ["and", "or", "is equal", "equals", "(is )?equal to", "is not", + "isn't", "isn't equal( to)?", "is not equal( to)?", + "doesn't equal", "does not equal", "(is )?greater than", + "comes after", "is not less than or equal( to)?", + "isn't less than or equal( to)?", "(is )?less than", + "comes before", "is not greater than or equal( to)?", + "isn't greater than or equal( to)?", + "(is )?greater than or equal( to)?", "is not less than", + "isn't less than", "does not come before", + "doesn't come before", "(is )?less than or equal( to)?", + "is not greater than", "isn't greater than", + "does not come after", "doesn't come after", "starts? with", + "begins? with", "ends? with", "contains?", "does not contain", + "doesn't contain", "is in", "is contained by", "is not in", + "is not contained by", "isn't contained by", "div", "mod", + "not", "(a )?(ref( to)?|reference to)", "is", "does"] + end + + def self.controls + @controls ||= ['considering', 'else', 'error', 'exit', 'from', 'if', + 'ignoring', 'in', 'repeat', 'tell', 'then', 'times', 'to', + 'try', 'until', 'using terms from', 'while', 'whith', + 'with timeout( of)?', 'with transaction', 'by', 'continue', + 'end', 'its?', 'me', 'my', 'return', 'of' , 'as'] + end + + def self.declarations + @declarations ||= ['global', 'local', 'prop(erty)?', 'set', 'get'] + end + + def self.reserved + @reserved ||= ['but', 'put', 'returning', 'the'] + end + + def self.studio_classes + @studio_classes ||= ['action cell', 'alert reply', 'application', 'box', + 'browser( cell)?', 'bundle', 'button( cell)?', 'cell', + 'clip view', 'color well', 'color-panel', + 'combo box( item)?', 'control', + 'data( (cell|column|item|row|source))?', 'default entry', + 'dialog reply', 'document', 'drag info', 'drawer', + 'event', 'font(-panel)?', 'formatter', + 'image( (cell|view))?', 'matrix', 'menu( item)?', 'item', + 'movie( view)?', 'open-panel', 'outline view', 'panel', + 'pasteboard', 'plugin', 'popup button', + 'progress indicator', 'responder', 'save-panel', + 'scroll view', 'secure text field( cell)?', 'slider', + 'sound', 'split view', 'stepper', 'tab view( item)?', + 'table( (column|header cell|header view|view))', + 'text( (field( cell)?|view))?', 'toolbar( item)?', + 'user-defaults', 'view', 'window'] + end + + def self.studio_events + @studio_events ||= ['accept outline drop', 'accept table drop', 'action', + 'activated', 'alert ended', 'awake from nib', 'became key', + 'became main', 'begin editing', 'bounds changed', + 'cell value', 'cell value changed', 'change cell value', + 'change item value', 'changed', 'child of item', + 'choose menu item', 'clicked', 'clicked toolbar item', + 'closed', 'column clicked', 'column moved', + 'column resized', 'conclude drop', 'data representation', + 'deminiaturized', 'dialog ended', 'document nib name', + 'double clicked', 'drag( (entered|exited|updated))?', + 'drop', 'end editing', 'exposed', 'idle', 'item expandable', + 'item value', 'item value changed', 'items changed', + 'keyboard down', 'keyboard up', 'launched', + 'load data representation', 'miniaturized', 'mouse down', + 'mouse dragged', 'mouse entered', 'mouse exited', + 'mouse moved', 'mouse up', 'moved', + 'number of browser rows', 'number of items', + 'number of rows', 'open untitled', 'opened', 'panel ended', + 'parameters updated', 'plugin loaded', 'prepare drop', + 'prepare outline drag', 'prepare outline drop', + 'prepare table drag', 'prepare table drop', + 'read from file', 'resigned active', 'resigned key', + 'resigned main', 'resized( sub views)?', + 'right mouse down', 'right mouse dragged', + 'right mouse up', 'rows changed', 'scroll wheel', + 'selected tab view item', 'selection changed', + 'selection changing', 'should begin editing', + 'should close', 'should collapse item', + 'should end editing', 'should expand item', + 'should open( untitled)?', + 'should quit( after last window closed)?', + 'should select column', 'should select item', + 'should select row', 'should select tab view item', + 'should selection change', 'should zoom', 'shown', + 'update menu item', 'update parameters', + 'update toolbar item', 'was hidden', 'was miniaturized', + 'will become active', 'will close', 'will dismiss', + 'will display browser cell', 'will display cell', + 'will display item cell', 'will display outline cell', + 'will finish launching', 'will hide', 'will miniaturize', + 'will move', 'will open', 'will pop up', 'will quit', + 'will resign active', 'will resize( sub views)?', + 'will select tab view item', 'will show', 'will zoom', + 'write to file', 'zoomed'] + end + + def self.studio_commands + @studio_commands ||= ['animate', 'append', 'call method', 'center', + 'close drawer', 'close panel', 'display', + 'display alert', 'display dialog', 'display panel', 'go', + 'hide', 'highlight', 'increment', 'item for', + 'load image', 'load movie', 'load nib', 'load panel', + 'load sound', 'localized string', 'lock focus', 'log', + 'open drawer', 'path for', 'pause', 'perform action', + 'play', 'register', 'resume', 'scroll', 'select( all)?', + 'show', 'size to fit', 'start', 'step back', + 'step forward', 'stop', 'synchronize', 'unlock focus', + 'update'] + end + + def self.studio_properties + @studio_properties ||= ['accepts arrow key', 'action method', 'active', + 'alignment', 'allowed identifiers', + 'allows branch selection', 'allows column reordering', + 'allows column resizing', 'allows column selection', + 'allows customization', 'allows editing text attributes', + 'allows empty selection', 'allows mixed state', + 'allows multiple selection', 'allows reordering', + 'allows undo', 'alpha( value)?', 'alternate image', + 'alternate increment value', 'alternate title', + 'animation delay', 'associated file name', + 'associated object', 'auto completes', 'auto display', + 'auto enables items', 'auto repeat', 'auto resizes( outline column)?', + 'auto save expanded items', 'auto save name', + 'auto save table columns', 'auto saves configuration', + 'auto scroll', 'auto sizes all columns to fit', + 'auto sizes cells', 'background color', 'bezel state', + 'bezel style', 'bezeled', 'border rect', 'border type', + 'bordered', 'bounds( rotation)?', 'box type', + 'button returned', 'button type', + 'can choose directories', 'can choose files', 'can draw', 'can hide', + 'cell( (background color|size|type))?', 'characters', + 'class', 'click count', 'clicked( data)? column', + 'clicked data item', 'clicked( data)? row', + 'closeable', 'collating', 'color( (mode|panel))', + 'command key down', 'configuration', + 'content(s| (size|view( margins)?))?', 'context', + 'continuous', 'control key down', 'control size', + 'control tint', 'control view', + 'controller visible', 'coordinate system', + 'copies( on scroll)?', 'corner view', 'current cell', + 'current column', 'current( field)? editor', + 'current( menu)? item', 'current row', + 'current tab view item', 'data source', + 'default identifiers', 'delta (x|y|z)', + 'destination window', 'directory', 'display mode', + 'displayed cell', 'document( (edited|rect|view))?', + 'double value', 'dragged column', 'dragged distance', + 'dragged items', 'draws( cell)? background', + 'draws grid', 'dynamically scrolls', 'echos bullets', + 'edge', 'editable', 'edited( data)? column', + 'edited data item', 'edited( data)? row', 'enabled', + 'enclosing scroll view', 'ending page', + 'error handling', 'event number', 'event type', + 'excluded from windows menu', 'executable path', + 'expanded', 'fax number', 'field editor', 'file kind', + 'file name', 'file type', 'first responder', + 'first visible column', 'flipped', 'floating', + 'font( panel)?', 'formatter', 'frameworks path', + 'frontmost', 'gave up', 'grid color', 'has data items', + 'has horizontal ruler', 'has horizontal scroller', + 'has parent data item', 'has resize indicator', + 'has shadow', 'has sub menu', 'has vertical ruler', + 'has vertical scroller', 'header cell', 'header view', + 'hidden', 'hides when deactivated', 'highlights by', + 'horizontal line scroll', 'horizontal page scroll', + 'horizontal ruler view', 'horizontally resizable', + 'icon image', 'id', 'identifier', + 'ignores multiple clicks', + 'image( (alignment|dims when disabled|frame style|scaling))?', + 'imports graphics', 'increment value', + 'indentation per level', 'indeterminate', 'index', + 'integer value', 'intercell spacing', 'item height', + 'key( (code|equivalent( modifier)?|window))?', + 'knob thickness', 'label', 'last( visible)? column', + 'leading offset', 'leaf', 'level', 'line scroll', + 'loaded', 'localized sort', 'location', 'loop mode', + 'main( (bunde|menu|window))?', 'marker follows cell', + 'matrix mode', 'maximum( content)? size', + 'maximum visible columns', + 'menu( form representation)?', 'miniaturizable', + 'miniaturized', 'minimized image', 'minimized title', + 'minimum column width', 'minimum( content)? size', + 'modal', 'modified', 'mouse down state', + 'movie( (controller|file|rect))?', 'muted', 'name', + 'needs display', 'next state', 'next text', + 'number of tick marks', 'only tick mark values', + 'opaque', 'open panel', 'option key down', + 'outline table column', 'page scroll', 'pages across', + 'pages down', 'palette label', 'pane splitter', + 'parent data item', 'parent window', 'pasteboard', + 'path( (names|separator))?', 'playing', + 'plays every frame', 'plays selection only', 'position', + 'preferred edge', 'preferred type', 'pressure', + 'previous text', 'prompt', 'properties', + 'prototype cell', 'pulls down', 'rate', + 'released when closed', 'repeated', + 'requested print time', 'required file type', + 'resizable', 'resized column', 'resource path', + 'returns records', 'reuses columns', 'rich text', + 'roll over', 'row height', 'rulers visible', + 'save panel', 'scripts path', 'scrollable', + 'selectable( identifiers)?', 'selected cell', + 'selected( data)? columns?', 'selected data items?', + 'selected( data)? rows?', 'selected item identifier', + 'selection by rect', 'send action on arrow key', + 'sends action when done editing', 'separates columns', + 'separator item', 'sequence number', 'services menu', + 'shared frameworks path', 'shared support path', + 'sheet', 'shift key down', 'shows alpha', + 'shows state by', 'size( mode)?', + 'smart insert delete enabled', 'sort case sensitivity', + 'sort column', 'sort order', 'sort type', + 'sorted( data rows)?', 'sound', 'source( mask)?', + 'spell checking enabled', 'starting page', 'state', + 'string value', 'sub menu', 'super menu', 'super view', + 'tab key traverses cells', 'tab state', 'tab type', + 'tab view', 'table view', 'tag', 'target( printer)?', + 'text color', 'text container insert', + 'text container origin', 'text returned', + 'tick mark position', 'time stamp', + 'title(d| (cell|font|height|position|rect))?', + 'tool tip', 'toolbar', 'trailing offset', 'transparent', + 'treat packages as directories', 'truncated labels', + 'types', 'unmodified characters', 'update views', + 'use sort indicator', 'user defaults', + 'uses data source', 'uses ruler', 'uses threaded animation', + 'uses title from previous column', 'value wraps', 'version', + 'vertical( (line scroll|page scroll|ruler view))?', 'vertically resizable', 'view', + 'visible( document rect)?', 'volume', 'width', 'window', + 'windows menu', 'wraps', 'zoomable', 'zoomed'] + end + + operators = %r(\b(#{self.operators.to_a.join('|')})\b) + classes = %r(\b(as )(#{self.classes.to_a.join('|')})\b) + literals = %r(\b(#{self.literals.to_a.join('|')})\b) + commands = %r(\b(#{self.commands.to_a.join('|')})\b) + controls = %r(\b(#{self.controls.to_a.join('|')})\b) + declarations = %r(\b(#{self.declarations.to_a.join('|')})\b) + reserved = %r(\b(#{self.reserved.to_a.join('|')})\b) + builtins = %r(\b(#{self.builtins.to_a.join('|')})s?\b) + handler_params = %r(\b(#{self.handler_params.to_a.join('|')})\b) + references = %r(\b(#{self.references.to_a.join('|')})\b) + studio_properties = %r(\b(#{self.studio_properties.to_a.join('|')})\b) + studio_classes = %r(\b(#{self.studio_classes.to_a.join('|')})s?\b) + studio_commands = %r(\b(#{self.studio_commands.to_a.join('|')})\b) + identifiers = %r(\b([a-zA-Z]\w*)\b) + + state :root do + rule %r/\s+/, Text::Whitespace + rule %r/¬\n/, Literal::String::Escape + rule %r/'s\s+/, Text + rule %r/(--|#).*?$/, Comment::Single + rule %r/\(\*/, Comment::Multiline + rule %r/[\(\){}!,.:]/, Punctuation + rule %r/(«)([^»]+)(»)/ do |match| + token Text, match[1] + token Name::Builtin, match[2] + token Text, match[3] + end + rule %r/\b((?:considering|ignoring)\s*)(application responses|case|diacriticals|hyphens|numeric strings|punctuation|white space)/ do |match| + token Keyword, match[1] + token Name::Builtin, match[2] + end + rule %r/(-|\*|\+|&|≠|>=?|<=?|=|≥|≤|\/|÷|\^)/, Operator + rule operators, Operator::Word + rule %r/^(\s*(?:on|end)\s+)'r'(%s)/ do |match| + token Keyword, match[1] + token Name::Function, match[2] + end + rule %r/^(\s*)(in|on|script|to)(\s+)/ do |match| + token Text, match[1] + token Keyword, match[2] + token Text, match[3] + end + rule classes do |match| + token Keyword, match[1] + token Name::Class, match[2] + end + rule literals, Name::Builtin + rule commands, Name::Builtin + rule controls, Keyword + rule declarations, Keyword + rule reserved, Name::Builtin + rule builtins, Name::Builtin + rule handler_params, Name::Builtin + rule studio_properties, Name::Attribute + rule studio_classes, Name::Builtin + rule studio_commands, Name::Builtin + rule references, Name::Builtin + rule %r/"(\\\\|\\"|[^"])*"/, Literal::String::Double + rule identifiers, Name::Variable + rule %r/[-+]?(\d+\.\d*|\d*\.\d+)(E[-+][0-9]+)?/, Literal::Number::Float + rule %r/[-+]?\d+/, Literal::Number::Integer + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/armasm.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/armasm.rb new file mode 100644 index 000000000000..51b4a3885fba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/armasm.rb @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class ArmAsm < RegexLexer + title "ArmAsm" + desc "Arm assembly syntax" + tag 'armasm' + filenames '*.s' + + def self.preproc_keyword + @preproc_keyword ||= %w( + define elif else endif error if ifdef ifndef include line pragma undef warning + ) + end + + def self.file_directive + @file_directive ||= %w( + BIN GET INCBIN INCLUDE LNK + ) + end + + def self.general_directive + @general_directive ||= %w( + ALIAS ALIGN AOF AOUT AREA ARM ASSERT ATTR CN CODE16 CODE32 COMMON CP + DATA DCB DCD DCDO DCDU DCFD DCFDU DCFH DCFHU DCFS DCFSU DCI DCI.N DCI.W + DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT + EXPORTAS EXTERN FIELD FILL FN FRAME FUNCTION GBLA GBLL GBLS GLOBAL IF + IMPORT INFO KEEP LCLA LCLL LCLS LEADR LEAF LTORG MACRO MAP MEND MEXIT + NOFP OPT ORG PRESERVE8 PROC QN RELOC REQUIRE REQUIRE8 RLIST RN ROUT + SETA SETL SETS SN SPACE STRONG SUBT THUMB THUMBX TTL WEND WHILE + \[ \] [|!#*=%&^] + ) + end + + def self.shift_or_condition + @shift_or_condition ||= %w( + ASR LSL LSR ROR RRX AL CC CS EQ GE GT HI HS LE LO LS LT MI NE PL VC VS + asr lsl lsr ror rrx al cc cs eq ge gt hi hs le lo ls lt mi ne pl vc vs + ) + end + + def self.builtin + @builtin ||= %w( + ARCHITECTURE AREANAME ARMASM_VERSION CODESIZE COMMANDLINE CONFIG CPU + ENDIAN FALSE FPIC FPU INPUTFILE INTER LINENUM LINENUMUP LINENUMUPPER + OBJASM_VERSION OPT PC PCSTOREOFFSET REENTRANT ROPI RWPI TRUE VAR + ) + end + + def self.operator + @operator ||= %w( + AND BASE CC CC_ENCODING CHR DEF EOR FATTR FEXEC FLOAD FSIZE INDEX LAND + LEFT LEN LEOR LNOT LOR LOWERCASE MOD NOT OR RCONST REVERSE_CC RIGHT ROL + ROR SHL SHR STR TARGET_ARCH_[0-9A-Z_]+ TARGET_FEATURE_[0-9A-Z_]+ + TARGET_FPU_[A-Z_] TARGET_PROFILE_[ARM] UAL UPPERCASE + ) + end + + state :root do + rule %r/\n/, Text + rule %r/^([ \t]*)(#[ \t]*(?:(?:#{ArmAsm.preproc_keyword.join('|')})(?:[ \t].*)?)?)(\n)/ do + groups Text, Comment::Preproc, Text + end + rule %r/[ \t]+/, Text, :command + rule %r/;.*/, Comment + rule %r/\$[a-z_]\w*\.?/i, Name::Namespace # variable substitution or macro argument + rule %r/\w+|\|[^|\n]+\|/, Name::Label + end + + state :command do + rule %r/\n/, Text, :pop! + rule %r/[ \t]+/ do |m| + token Text + goto :args + end + rule %r/;.*/, Comment, :pop! + rule %r/(?:#{ArmAsm.file_directive.join('|')})\b/ do |m| + token Keyword + goto :filespec + end + rule %r/(?:#{ArmAsm.general_directive.join('|')})(?=[; \t\n])/, Keyword + rule %r/(?:[A-Z][\dA-Z]*|[a-z][\da-z]*)(?:\.[NWnw])?(?:\.[DFIPSUdfipsu]?(?:8|16|32|64)?){,3}\b/, Name::Builtin # rather than attempt to list all opcodes, rely on all-uppercase or all-lowercase rule + rule %r/[a-z_]\w*|\|[^|\n]+\|/i, Name::Function # probably a macro name + rule %r/\$[a-z]\w*\.?/i, Name::Namespace + end + + state :args do + rule %r/\n/, Text, :pop! + rule %r/[ \t]+/, Text + rule %r/;.*/, Comment, :pop! + rule %r/(?:#{ArmAsm.shift_or_condition.join('|')})\b/, Name::Builtin + rule %r/[a-z_]\w*|\|[^|\n]+\|/i, Name::Variable # various types of symbol + rule %r/%[bf]?[at]?\d+(?:[a-z_]\w*)?/i, Name::Label + rule %r/(?:&|0x)\h+(?!p)/i, Literal::Number::Hex + rule %r/(?:&|0x)[.\h]+(?:p[-+]?\d+)?/i, Literal::Number::Float + rule %r/0f_\h{8}|0d_\h{16}/i, Literal::Number::Float + rule %r/(?:2_[01]+|3_[0-2]+|4_[0-3]+|5_[0-4]+|6_[0-5]+|7_[0-6]+|8_[0-7]+|9_[0-8]+|\d+)(?!e)/i, Literal::Number::Integer + rule %r/(?:2_[.01]+|3_[.0-2]+|4_[.0-3]+|5_[.0-4]+|6_[.0-5]+|7_[.0-6]+|8_[.0-7]+|9_[.0-8]+|[.\d]+)(?:e[-+]?\d+)?/i, Literal::Number::Float + rule %r/[@:](?=[ \t]*(?:8|16|32|64|128|256)[^\d])/, Operator + rule %r/[.@]|\{(?:#{ArmAsm.builtin.join('|')})\}/, Name::Constant + rule %r/[-!#%&()*+,\/<=>?^{|}]|\[|\]|!=|&&|\/=|<<|<=|<>|==|><|>=|>>|\|\||:(?:#{ArmAsm.operator.join('|')}):/, Operator + rule %r/\$[a-z]\w*\.?/i, Name::Namespace + rule %r/'/ do |m| + token Literal::String::Char + goto :singlequoted + end + rule %r/"/ do |m| + token Literal::String::Double + goto :doublequoted + end + end + + state :singlequoted do + rule %r/\n/, Text, :pop! + rule %r/\$\$/, Literal::String::Char + rule %r/\$[a-z]\w*\.?/i, Name::Namespace + rule %r/'/ do |m| + token Literal::String::Char + goto :args + end + rule %r/[^$'\n]+/, Literal::String::Char + end + + state :doublequoted do + rule %r/\n/, Text, :pop! + rule %r/\$\$/, Literal::String::Double + rule %r/\$[a-z]\w*\.?/i, Name::Namespace + rule %r/"/ do |m| + token Literal::String::Double + goto :args + end + rule %r/[^$"\n]+/, Literal::String::Double + end + + state :filespec do + rule %r/\n/, Text, :pop! + rule %r/\$\$/, Literal::String::Other + rule %r/\$[a-z]\w*\.?/i, Name::Namespace + rule %r/[^$\n]+/, Literal::String::Other + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/augeas.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/augeas.rb new file mode 100644 index 000000000000..2fda76fde44b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/augeas.rb @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Augeas < RegexLexer + title "Augeas" + desc "The Augeas programming language (augeas.net)" + + tag 'augeas' + aliases 'aug' + filenames '*.aug' + mimetypes 'text/x-augeas' + + def self.reserved + @reserved ||= Set.new %w( + _ let del store value counter seq key label autoload incl excl + transform test get put in after set clear insa insb print_string + print_regexp print_endline print_tree lens_ctype lens_atype + lens_ktype lens_vtype lens_format_atype regexp_match + ) + end + + state :basic do + rule %r/\s+/m, Text + rule %r/\(\*/, Comment::Multiline, :comment + end + + state :comment do + rule %r/\*\)/, Comment::Multiline, :pop! + rule %r/\(\*/, Comment::Multiline, :comment + rule %r/[^*)]+/, Comment::Multiline + rule %r/[*)]/, Comment::Multiline + end + + state :root do + mixin :basic + + rule %r/(:)(\w\w*)/ do + groups Punctuation, Keyword::Type + end + + rule %r/\w[\w']*/ do |m| + name = m[0] + if name == "module" + token Keyword::Reserved + push :module + elsif self.class.reserved.include? name + token Keyword::Reserved + elsif name =~ /\A[A-Z]/ + token Keyword::Namespace + else + token Name + end + end + + rule %r/"/, Str, :string + rule %r/\//, Str, :regexp + + rule %r([-*+.=?\|]+), Operator + rule %r/[\[\](){}:;]/, Punctuation + end + + state :module do + rule %r/\s+/, Text + rule %r/[A-Z][a-zA-Z0-9_.]*/, Name::Namespace, :pop! + end + + state :regexp do + rule %r/\//, Str::Regex, :pop! + rule %r/[^\\\/]+/, Str::Regex + rule %r/\\[\\\/]/, Str::Regex + rule %r/\\/, Str::Regex + end + + state :string do + rule %r/"/, Str, :pop! + rule %r/\\/, Str::Escape, :escape + rule %r/[^\\"]+/, Str + end + + state :escape do + rule %r/[abfnrtv"'&\\]/, Str::Escape, :pop! + rule %r/\^[\]\[A-Z@\^_]/, Str::Escape, :pop! + rule %r/o[0-7]+/i, Str::Escape, :pop! + rule %r/x[\da-f]+/i, Str::Escape, :pop! + rule %r/\d+/, Str::Escape, :pop! + rule %r/\s+/, Str::Escape, :pop! + rule %r/./, Str, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/awk.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/awk.rb new file mode 100644 index 000000000000..8301f86afeab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/awk.rb @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Awk < RegexLexer + title "Awk" + desc "pattern-directed scanning and processing language" + + tag 'awk' + filenames '*.awk' + mimetypes 'application/x-awk' + + def self.detect?(text) + return true if text.shebang?('awk') + end + + id = /[$a-zA-Z_][a-zA-Z0-9_]*/ + + def self.keywords + @keywords ||= Set.new %w( + if else while for do break continue return next nextfile delete + exit print printf getline + ) + end + + def self.declarations + @declarations ||= Set.new %w(function) + end + + def self.reserved + @reserved ||= Set.new %w(BEGIN END) + end + + def self.constants + @constants ||= Set.new %w( + CONVFMT FS NF NR FNR FILENAME RS OFS ORS OFMT SUBSEP ARGC ARGV + ENVIRON + ) + end + + def self.builtins + @builtins ||= %w( + exp log sqrt sin cos atan2 length rand srand int substr index match + split sub gsub sprintf system tolower toupper + ) + end + + state :comments_and_whitespace do + rule %r/\s+/, Text + rule %r(#.*?$), Comment::Single + end + + state :expr_start do + mixin :comments_and_whitespace + rule %r(/) do + token Str::Regex + goto :regex + end + rule %r//, Text, :pop! + end + + state :regex do + rule %r(/) do + token Str::Regex + goto :regex_end + end + + rule %r([^/]\n), Error, :pop! + + rule %r/\n/, Error, :pop! + rule %r/\[\^/, Str::Escape, :regex_group + rule %r/\[/, Str::Escape, :regex_group + rule %r/\\./, Str::Escape + rule %r{[(][?][:=<!]}, Str::Escape + rule %r/[{][\d,]+[}]/, Str::Escape + rule %r/[()?]/, Str::Escape + rule %r/./, Str::Regex + end + + state :regex_end do + rule(//) { pop! } + end + + state :regex_group do + # specially highlight / in a group to indicate that it doesn't + # close the regex + rule %r(/), Str::Escape + + rule %r([^/]\n) do + token Error + pop! 2 + end + + rule %r/\]/, Str::Escape, :pop! + rule %r/\\./, Str::Escape + rule %r/./, Str::Regex + end + + state :bad_regex do + rule %r/[^\n]+/, Error, :pop! + end + + state :root do + mixin :comments_and_whitespace + rule %r((?<=\n)(?=\s|/)), Text, :expr_start + rule %r([-<>+*/%\^!=]=?|in\b|\+\+|--|\|), Operator, :expr_start + rule %r(&&|\|\||~!?), Operator, :expr_start + rule %r/[(\[,]/, Punctuation, :expr_start + rule %r/;/, Punctuation, :statement + rule %r/[)\].]/, Punctuation + + rule %r/[?]/ do + token Punctuation + push :ternary + push :expr_start + end + + rule %r/[{}]/, Punctuation, :statement + + rule id do |m| + if self.class.keywords.include? m[0] + token Keyword + push :expr_start + elsif self.class.declarations.include? m[0] + token Keyword::Declaration + push :expr_start + elsif self.class.reserved.include? m[0] + token Keyword::Reserved + elsif self.class.constants.include? m[0] + token Keyword::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + elsif m[0] =~ /^\$/ + token Name::Variable + else + token Name::Other + end + end + + rule %r/[0-9]+\.[0-9]+/, Num::Float + rule %r/[0-9]+/, Num::Integer + rule %r/"(\\[\\"]|[^"])*"/, Str::Double + rule %r/:/, Punctuation + end + + state :statement do + rule %r/[{}]/, Punctuation + mixin :expr_start + end + + state :ternary do + rule %r/:/ do + token Punctuation + goto :expr_start + end + + mixin :root + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/batchfile.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/batchfile.rb new file mode 100644 index 000000000000..cc61d8503395 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/batchfile.rb @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Batchfile < RegexLexer + title "Batchfile" + desc "Windows Batch File" + + tag 'batchfile' + aliases 'bat', 'batch', 'dosbatch', 'winbatch' + filenames '*.bat', '*.cmd' + + mimetypes 'application/bat', 'application/x-bat', 'application/x-msdos-program' + + def self.keywords + @keywords ||= %w( + if else for in do goto call exit + ) + end + + def self.operator_words + @operator_words ||= %w( + exist defined errorlevel cmdextversion not equ neq lss leq gtr geq + ) + end + + def self.devices + @devices ||= %w( + con prn aux nul com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 + lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 + ) + end + + def self.builtin_commands + @builtin_commands ||= %w( + assoc attrib break bcdedit cacls cd chcp chdir chkdsk chkntfs choice + cls cmd color comp compact convert copy date del dir diskpart doskey + dpath driverquery echo endlocal erase fc find findstr format fsutil + ftype gpresult graftabl help icacls label md mkdir mklink mode more + move openfiles path pause popd print prompt pushd rd recover ren + rename replace rmdir robocopy setlocal sc schtasks shift shutdown sort + start subst systeminfo takeown tasklist taskkill time timeout title + tree type ver verify vol xcopy waitfor wmic + ) + end + + def self.other_commands + @other_commands ||= %w( + addusers admodcmd ansicon arp at bcdboot bitsadmin browstat certreq + certutil change cidiag cipher cleanmgr clip cmdkey compress convertcp + coreinfo csccmd csvde cscript curl debug defrag delprof deltree devcon + diamond dirquota diruse diskshadow diskuse dism dnscmd dsacls dsadd + dsget dsquery dsmod dsmove dsrm dsmgmt dsregcmd edlin eventcreate + expand extract fdisk fltmc forfiles freedisk ftp getmac gpupdate + hostname ifmember inuse ipconfig kill lgpo lodctr logman logoff + logtime makecab mapisend mbsacli mem mountvol moveuser msg mshta + msiexec msinfo32 mstsc nbtstat net net1 netdom netsh netstat nlsinfo + nltest now nslookup ntbackup ntdsutil ntoskrnl ntrights nvspbind + pathping perms ping portqry powercfg pngout pnputil printbrm prncnfg + prnmngr procdump psexec psfile psgetsid psinfo pskill pslist + psloggedon psloglist pspasswd psping psservice psshutdown pssuspend + qbasic qgrep qprocess query quser qwinsta rasdial reg reg1 regdump + regedt32 regsvr32 regini reset restore rundll32 rmtshare route rpcping + run runas scandisk setspn setx sfc share shellrunas shortcut sigcheck + sleep slmgr strings subinacl sysmon telnet tftp tlist touch tracerpt + tracert tscon tsdiscon tskill tttracer typeperf tzutil undelete + unformat verifier vmconnect vssadmin w32tm wbadmin wecutil wevtutil + wget where whoami windiff winrm winrs wpeutil wpr wusa wuauclt wscript + ) + end + + def self.attributes + @attributes ||= %w( + on off disable enableextensions enabledelayedexpansion + ) + end + + state :basic do + # Comments + rule %r/@?\brem\b.*$/i, Comment + + # Empty Labels + rule %r/^::.*$/, Comment + + # Labels + rule %r/:[a-z]+/i, Name::Label + + rule %r/([a-z]\w*)(\.exe|com|bat|cmd|msi)?/i do |m| + if self.class.devices.include? m[1] + groups Keyword::Reserved, Error + elsif self.class.keywords.include? m[1] + groups Keyword, Error + elsif self.class.operator_words.include? m[1] + groups Operator::Word, Error + elsif self.class.builtin_commands.include? m[1] + token Name::Builtin + elsif self.class.other_commands.include? m[1] + token Name::Builtin + elsif self.class.attributes.include? m[1] + groups Name::Attribute, Error + elsif "set".casecmp m[1] + groups Keyword::Declaration, Error + else + token Text + end + end + + rule %r/((?:[\/\+]|--?)[a-z]+)\s*/i, Name::Attribute + + mixin :expansions + + rule %r/[<>&|(){}\[\]\-+=;,~?*]/, Operator + end + + state :escape do + rule %r/\^./m, Str::Escape + end + + state :expansions do + # Normal and Delayed expansion + rule %r/[%!]+([a-z_$@#]+)[%!]+/i, Name::Variable + # For Variables + rule %r/(\%+~?[a-z]+\d?)/i, Name::Variable::Magic + end + + state :double_quotes do + mixin :escape + rule %r/["]/, Str::Double, :pop! + mixin :expansions + rule %r/[^\^"%!]+/, Str::Double + end + + state :single_quotes do + mixin :escape + rule %r/[']/, Str::Single, :pop! + mixin :expansions + rule %r/[^\^'%!]+/, Str::Single + end + + state :backtick do + mixin :escape + rule %r/[`]/, Str::Backtick, :pop! + mixin :expansions + rule %r/[^\^`%!]+/, Str::Backtick + end + + state :data do + rule %r/\s+/, Text + rule %r/0x[0-9a-f]+/i, Literal::Number::Hex + rule %r/[0-9]/, Literal::Number + rule %r/["]/, Str::Double, :double_quotes + rule %r/[']/, Str::Single, :single_quotes + rule %r/[`]/, Str::Backtick, :backtick + rule %r/[^\s&|()\[\]{}\^=;!%+\-,"'`~?*]+/, Text + mixin :escape + end + + state :root do + mixin :basic + mixin :data + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bbcbasic.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bbcbasic.rb new file mode 100644 index 000000000000..c64a1b6bde8a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bbcbasic.rb @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class BBCBASIC < RegexLexer + title "BBCBASIC" + desc "BBC BASIC syntax" + tag 'bbcbasic' + filenames '*,fd1' + + def self.punctuation + @punctuation ||= %w( + [,;'~] SPC TAB + ) + end + + def self.function + @function ||= %w( + ABS ACS ADVAL ASC ASN ATN BEATS BEAT BGET# CHR\$ COS COUNT DEG DIM + EOF# ERL ERR EVAL EXP EXT# FN GET\$# GET\$ GET HIMEM INKEY\$ INKEY + INSTR INT LEFT\$ LEN LN LOG LOMEM MID\$ OPENIN OPENOUT OPENUP PAGE + POINT POS PTR# RAD REPORT\$ RIGHT\$ RND SGN SIN SQR STR\$ STRING\$ SUM + SUMLEN TAN TEMPO TIME\$ TIME TOP USR VAL VPOS + ) + end + + def self.statement + @statement ||= %w( + BEATS BPUT# CALL CASE CHAIN CLEAR CLG CLOSE# CLS COLOR COLOUR DATA + ELSE ENDCASE ENDIF ENDPROC ENDWHILE END ENVELOPE FOR GCOL GOSUB GOTO + IF INSTALL LET LIBRARY MODE NEXT OFF OF ON ORIGIN OSCI OTHERWISE + OVERLAY PLOT PRINT# PRINT PROC QUIT READ REPEAT REPORT RETURN SOUND + STEP STEREO STOP SWAP SYS THEN TINT TO VDU VOICES VOICE UNTIL WAIT + WHEN WHILE WIDTH + ) + end + + def self.operator + @operator ||= %w( + << <= <> < >= >>> >> > [-!$()*+/=?^|] AND DIV EOR MOD NOT OR + ) + end + + def self.constant + @constant ||= %w( + FALSE TRUE + ) + end + + state :expression do + rule %r/#{BBCBASIC.function.join('|')}/o, Name::Builtin # function or pseudo-variable + rule %r/#{BBCBASIC.operator.join('|')}/o, Operator + rule %r/#{BBCBASIC.constant.join('|')}/o, Name::Constant + rule %r/"[^"]*"/o, Literal::String + rule %r/[a-z_`][\w`]*[$%]?/io, Name::Variable + rule %r/@%/o, Name::Variable + rule %r/[\d.]+/o, Literal::Number + rule %r/%[01]+/o, Literal::Number::Bin + rule %r/&[\h]+/o, Literal::Number::Hex + end + + state :root do + rule %r/(:+)( *)(\*)(.*)/ do + groups Punctuation, Text, Keyword, Text # CLI command + end + rule %r/(\n+ *)(\*)(.*)/ do + groups Text, Keyword, Text # CLI command + end + rule %r/(ELSE|OTHERWISE|REPEAT|THEN)( *)(\*)(.*)/ do + groups Keyword, Text, Keyword, Text # CLI command + end + rule %r/[ \n]+/o, Text + rule %r/:+/o, Punctuation + rule %r/[\[]/o, Keyword, :assembly1 + rule %r/REM *>.*/o, Comment::Special + rule %r/REM.*/o, Comment + rule %r/(?:#{BBCBASIC.statement.join('|')}|CIRCLE(?: *FILL)?|DEF *(?:FN|PROC)|DRAW(?: *BY)?|DIM(?!\()|ELLIPSE(?: *FILL)?|ERROR(?: *EXT)?|FILL(?: *BY)?|INPUT(?:#| *LINE)?|LINE(?: *INPUT)?|LOCAL(?: *DATA| *ERROR)?|MOUSE(?: *COLOUR| *OFF| *ON| *RECTANGLE| *STEP| *TO)?|MOVE(?: *BY)?|ON(?! *ERROR)|ON *ERROR *(?:LOCAL|OFF)?|POINT(?: *BY)?(?!\()|RECTANGE(?: *FILL)?|RESTORE(?: *DATA| *ERROR)?|TRACE(?: *CLOSE| *ENDPROC| *OFF| *STEP(?: *FN| *ON| *PROC)?| *TO)?)/o, Keyword + mixin :expression + rule %r/#{BBCBASIC.punctuation.join('|')}/o, Punctuation + end + + # Assembly statements are parsed as + # {label} {directive|opcode |']' {expressions}} {comment} + # Technically, you don't need whitespace between opcodes and arguments, + # but this is rare in uncrunched source and trying to enumerate all + # possible opcodes here is impractical so we colour it as though + # the whitespace is required. Opcodes and directives can only easily be + # distinguished from the symbols that make up expressions by looking at + # their position within the statement. Similarly, ']' is treated as a + # keyword at the start of a statement or as punctuation elsewhere. This + # requires a two-state state machine. + + state :assembly1 do + rule %r/ +/o, Text + rule %r/]/o, Keyword, :pop! + rule %r/[:\n]/o, Punctuation + rule %r/\.[a-z_`][\w`]*%? */io, Name::Label + rule %r/(?:REM|;)[^:\n]*/o, Comment + rule %r/[^ :\n]+/o, Keyword, :assembly2 + end + + state :assembly2 do + rule %r/ +/o, Text + rule %r/[:\n]/o, Punctuation, :pop! + rule %r/(?:REM|;)[^:\n]*/o, Comment, :pop! + mixin :expression + rule %r/[!#,@\[\]^{}]/, Punctuation + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bibtex.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bibtex.rb new file mode 100644 index 000000000000..cc6ece72dae3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bibtex.rb @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# Regular expressions based on https://github.com/SaswatPadhi/prismjs-bibtex +# and https://github.com/alecthomas/chroma/blob/master/lexers/b/bibtex.go + +module Rouge + module Lexers + class BibTeX < RegexLexer + title 'BibTeX' + desc "BibTeX" + tag 'bibtex' + aliases 'bib' + filenames '*.bib' + + valid_punctuation = Regexp.quote("@!$&.\\:;<>?[]^`|~*/+-") + valid_name = /[a-z_#{valid_punctuation}][\w#{valid_punctuation}]*/io + + state :root do + mixin :whitespace + + rule %r/@(#{valid_name})/o do |m| + match = m[1].downcase + + if match == "comment" + token Comment + elsif match == "preamble" + token Name::Class + push :closing_brace + push :value + push :opening_brace + elsif match == "string" + token Name::Class + push :closing_brace + push :field + push :opening_brace + else + token Name::Class + push :closing_brace + push :command_body + push :opening_brace + end + end + + rule %r/.+/, Comment + end + + state :opening_brace do + mixin :whitespace + rule %r/[{(]/, Punctuation, :pop! + end + + state :closing_brace do + mixin :whitespace + rule %r/[})]/, Punctuation, :pop! + end + + state :command_body do + mixin :whitespace + rule %r/[^\s\,\}]+/ do + token Name::Label + pop! + push :fields + end + end + + state :fields do + mixin :whitespace + rule %r/,/, Punctuation, :field + rule(//) { pop! } + end + + state :field do + mixin :whitespace + rule valid_name do + token Name::Attribute + push :value + push :equal_sign + end + rule(//) { pop! } + end + + state :equal_sign do + mixin :whitespace + rule %r/=/, Punctuation, :pop! + end + + state :value do + mixin :whitespace + rule valid_name, Name::Variable + rule %r/"/, Literal::String, :quoted_string + rule %r/\{/, Literal::String, :braced_string + rule %r/\d+/, Literal::Number + rule %r/#/, Punctuation + rule(//) { pop! } + end + + state :quoted_string do + rule %r/\{/, Literal::String, :braced_string + rule %r/"/, Literal::String, :pop! + rule %r/[^\{\"]+/, Literal::String + end + + state :braced_string do + rule %r/\{/, Literal::String, :braced_string + rule %r/\}/, Literal::String, :pop! + rule %r/[^\{\}]+/, Literal::String + end + + state :whitespace do + rule %r/\s+/, Text + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/biml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/biml.rb new file mode 100644 index 000000000000..602a57a23cb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/biml.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'xml.rb' + + class BIML < XML + title "BIML" + desc "BIML, Business Intelligence Markup Language" + tag 'biml' + filenames '*.biml' + + def self.detect?(text) + return true if text =~ /<\s*Biml\b/ + end + + prepend :root do + rule %r(<#\@\s*)m, Name::Tag, :directive_tag + + rule %r(<#[=]?\s*)m, Name::Tag, :directive_as_csharp + end + + prepend :attr do + #TODO: how to deal with embedded <# tags inside a attribute string + #rule %r("<#[=]?\s*)m, Name::Tag, :directive_as_csharp + end + + state :directive_as_csharp do + rule %r/\s*#>\s*/m, Name::Tag, :pop! + rule %r(.*?(?=\s*#>\s*))m do + delegate CSharp + end + end + + state :directive_tag do + rule %r/\s+/m, Text + rule %r/[\w.:-]+\s*=/m, Name::Attribute, :attr + rule %r/\w+\s*/m, Name::Attribute + rule %r(/?\s*#>), Name::Tag, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bpf.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bpf.rb new file mode 100644 index 000000000000..99b7ce526c79 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bpf.rb @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class BPF < RegexLexer + title "BPF" + desc "BPF bytecode syntax" + tag 'bpf' + + TYPE_KEYWORDS = %w( + u8 u16 u32 u64 ll + ).join('|') + + MISC_KEYWORDS = %w( + be16 be32 be64 exit lock map + ).join('|') + + state :root do + # Line numbers and hexadecimal output from bpftool/objdump + rule %r/(\d+)(:)(\s+)(\(\h{2}\))/i do + groups Generic::Lineno, Punctuation, Text::Whitespace, Generic + end + rule %r/(\d+)(:)(\s+)((?:\h{2} ){8})/i do + groups Generic::Lineno, Punctuation, Text::Whitespace, Generic + end + rule %r/(\d+)(:)(\s+)/i do + groups Generic::Lineno, Punctuation, Text::Whitespace + end + + # Calls to helpers + rule %r/(call)(\s+)(\d+)/i do + groups Keyword, Text::Whitespace, Literal::Number::Integer + end + rule %r/(call)(\s+)(\w+)(#)(\d+)/i do + groups Keyword, Text::Whitespace, Name::Builtin, Punctuation, Literal::Number::Integer + end + + # Unconditional jumps + rule %r/(goto)(\s*)(\+\d+)?(\s*)(<?\w+>?)/i do + groups Keyword, Text::Whitespace, Literal::Number::Integer, Text::Whitespace, Name::Label + end + + # Conditional jumps + rule %r/(if)(\s+)([rw]\d+)(\s*)([s!=<>]+)(\s*)(0x\h+|[-]?\d+)(\s*)(goto)(\s*)(\+\d+)?(\s*)(<?\w+>?)/i do + groups Keyword, Text::Whitespace, Name, Text::Whitespace, Operator, Text::Whitespace, Literal::Number, Text::Whitespace, Keyword, Text::Whitespace, Literal::Number::Integer, Text::Whitespace, Name::Label + end + rule %r/(if)(\s+)([rw]\d+)(\s*)([s!=<>]+)(\s*)([rw]\d+)(\s*)(goto)(\s*)(\+\d+)?(\s*)(<?\w+>?)/i do + groups Keyword, Text::Whitespace, Name, Text::Whitespace, Operator, Text::Whitespace, Name, Text::Whitespace, Keyword, Text::Whitespace, Literal::Number::Integer, Text::Whitespace, Name::Label + end + + # Dereferences + rule %r/(\*)(\s*)(\()(#{TYPE_KEYWORDS})(\s*)(\*)(\))/i do + groups Operator, Text::Whitespace, Punctuation, Keyword::Type, Text::Whitespace, Operator, Punctuation + push :address + end + + # Operators + rule %r/[+-\/\*&|><^s]{0,3}=/i, Operator + + # Registers + rule %r/([+-]?)([rw]\d+)/i do + groups Punctuation, Name + end + + # Comments + rule %r/\/\//, Comment::Single, :linecomment + rule %r/\/\*/, Comment::Multiline, :multilinescomment + + rule %r/#{MISC_KEYWORDS}/i, Keyword + + # Literals and global objects (maps) refered by name + rule %r/(0x\h+|[-]?\d+)(\s*)(ll)?/i do + groups Literal::Number, Text::Whitespace, Keyword::Type + end + rule %r/(\w+)(\s*)(ll)/i do + groups Name, Text::Whitespace, Keyword::Type + end + + # Labels + rule %r/(\w+)(\s*)(:)/i do + groups Name::Label, Text::Whitespace, Punctuation + end + + rule %r{.}m, Text + end + + state :address do + # Address is offset from register + rule %r/(\()([rw]\d+)(\s*)([+-])(\s*)(\d+)(\))/i do + groups Punctuation, Name, Text::Whitespace, Operator, Text::Whitespace, Literal::Number::Integer, Punctuation + pop! + end + + # Address is array subscript + rule %r/(\w+)(\[)(\d+)(\])/i do + groups Name, Punctuation, Literal::Number::Integer, Punctuation + pop! + end + rule %r/(\w+)(\[)([rw]\d+)(\])/i do + groups Name, Punctuation, Name, Punctuation + pop! + end + end + + state :linecomment do + rule %r/\n/, Comment::Single, :pop! + rule %r/.+/, Comment::Single + end + + state :multilinescomment do + rule %r/\*\//, Comment::Multiline, :pop! + rule %r/([^\*\/]+)/, Comment::Multiline + rule %r/([\*\/])/, Comment::Multiline + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/brainfuck.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/brainfuck.rb new file mode 100644 index 000000000000..1759c9ccece6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/brainfuck.rb @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Brainfuck < RegexLexer + tag 'brainfuck' + filenames '*.b', '*.bf' + mimetypes 'text/x-brainfuck' + + title "Brainfuck" + desc "The Brainfuck programming language" + + start { push :bol } + + state :bol do + rule %r/\s+/m, Text + rule %r/\[/, Comment::Multiline, :comment_multi + rule(//) { pop! } + end + + state :root do + rule %r/\]/, Error + rule %r/\[/, Punctuation, :loop + + mixin :comment_single + mixin :commands + end + + state :comment_multi do + rule %r/\[/, Comment::Multiline, :comment_multi + rule %r/\]/, Comment::Multiline, :pop! + rule %r/[^\[\]]+?/m, Comment::Multiline + end + + state :comment_single do + rule %r/[^><+\-.,\[\]]+/, Comment::Single + end + + state :loop do + rule %r/\[/, Punctuation, :loop + rule %r/\]/, Punctuation, :pop! + mixin :comment_single + mixin :commands + end + + state :commands do + rule %r/[><]+/, Name::Builtin + rule %r/[+\-.,]+/, Name::Function + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/brightscript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/brightscript.rb new file mode 100644 index 000000000000..ebd6336c2586 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/brightscript.rb @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Brightscript < RegexLexer + title "BrightScript" + desc "BrightScript Programming Language (https://developer.roku.com/en-ca/docs/references/brightscript/language/brightscript-language-reference.md)" + tag 'brightscript' + aliases 'bs', 'brs' + filenames '*.brs' + + # https://developer.roku.com/en-ca/docs/references/brightscript/language/global-utility-functions.md + # https://developer.roku.com/en-ca/docs/references/brightscript/language/global-string-functions.md + # https://developer.roku.com/en-ca/docs/references/brightscript/language/global-math-functions.md + def self.name_builtin + @name_builtin ||= Set.new %w( + ABS ASC ATN CDBL CHR CINT CONTROL COPYFILE COS CREATEDIRECTORY CSNG + DELETEDIRECTORY DELETEFILE EXP FINDMEMBERFUNCTION FINDNODE FIX + FORMATDRIVEFORMATJSON GETINTERFACE INSTR INT LCASE LEFT LEN LISTDIR + LOG MATCHFILES MID MOVEFILE OBSERVEFIELD PARSEJSON PARSEXML + READASCIIFILE REBOOTSYSTEM RIGHT RND RUNGARBAGECOLLECTOR SGN SIN + SLEEP SQR STR STRI STRING STRINGI STRTOI SUBSTITUTE TANTEXTTOP TEXT + TRUCASE UPTIME VALVISIBLE VISIBLE WAIT + ) + end + + # https://developer.roku.com/en-ca/docs/references/brightscript/language/reserved-words.md + def self.keyword_reserved + @keyword_reserved ||= Set.new %w( + BOX CREATEOBJECT DIM EACH ELSE ELSEIF END ENDFUNCTION ENDIF ENDSUB + ENDWHILE EVAL EXIT EXITWHILE FALSE FOR FUNCTION GETGLOBALAA + GETLASTRUNCOMPILEERROR GETLASTRUNRUNTIMEERROR GOTO IF IN INVALID LET + LINE_NUM M NEXT OBJFUN POS PRINT REM RETURN RUN STEP STOP SUB TAB TO + TRUE TYPE WHILE + ) + end + + # These keywords are present in BrightScript, but not supported in standard .brs files + def self.keyword_reserved_unsupported + @keyword_reserved_unsupported ||= Set.new %w( + CLASS CONST IMPORT LIBRARY NAMESPACE PRIVATE PROTECTED PUBLIC + ) + end + + # https://developer.roku.com/en-ca/docs/references/brightscript/language/expressions-variables-types.md + def self.keyword_type + @keyword_type ||= Set.new %w( + BOOLEAN DIM DOUBLE DYNAMIC FLOAT FUNCTION INTEGER INTERFACE INVALID + LONGINTEGER OBJECT STRING VOID + ) + end + + # https://developer.roku.com/en-ca/docs/references/brightscript/language/expressions-variables-types.md#operators + def self.operator_word + @operator_word ||= Set.new %w( + AND AS MOD NOT OR THEN + ) + end + + # Scene graph components configured as builtins. See BrightScript component documentation e.g. + # https://developer.roku.com/en-ca/docs/references/brightscript/components/roappinfo.md + def self.builtins + @builtins ||= Set.new %w( + roAppendFile roAppInfo roAppManager roArray roAssociativeArray + roAudioGuide roAudioMetadata roAudioPlayer roAudioPlayerEvent + roAudioResourceroBitmap roBoolean roBoolean roBrightPackage roBrSub + roButton roByteArray roCaptionRenderer roCaptionRendererEvent + roCecInterface roCECStatusEvent roChannelStore roChannelStoreEvent + roClockWidget roCodeRegistrationScreen + roCodeRegistrationScreenEventroCompositor roControlDown roControlPort + roControlPort roControlUp roCreateFile roDatagramReceiver + roDatagramSender roDataGramSocket roDateTime roDeviceInfo + roDeviceInfoEvent roDoubleroEVPCipher roEVPDigest roFileSystem + roFileSystemEvent roFloat roFont roFontMetrics roFontRegistry + roFunction roGlobal roGpio roGridScreen roGridScreenEvent + roHdmiHotPlugEventroHdmiStatus roHdmiStatusEvent roHMAC roHttpAgent + roImageCanvas roImageCanvasEvent roImageMetadata roImagePlayer + roImageWidgetroInput roInputEvent roInt roInt roInvalid roInvalid + roIRRemote roKeyboard roKeyboardPress roKeyboardScreen + roKeyboardScreenEventroList roListScreen roListScreenEvent + roLocalization roLongInteger roMessageDialog roMessageDialogEvent + roMessagePort roMicrophone roMicrophoneEvent roNetworkConfiguration + roOneLineDialog roOneLineDialogEventroParagraphScreen + roParagraphScreenEvent roPath roPinEntryDialog roPinEntryDialogEvent + roPinentryScreen roPosterScreen roPosterScreenEventroProgramGuide + roQuadravoxButton roReadFile roRectangleroRegexroRegion roRegistry + roRegistrySection roResourceManager roRSA roRssArticle roRssParser + roScreen roSearchHistory roSearchScreen roSearchScreenEvent + roSerialPort roSGNode roSGNodeEvent roSGScreenroSGScreenEvent + roSlideShowroSlideShowEvent roSNS5 roSocketAddress roSocketEvent + roSpringboardScreen roSpringboardScreenEventroSprite roStorageInfo + roStreamSocket roStringroSystemLogroSystemLogEvent roSystemTime + roTextFieldroTextScreen roTextScreenEvent roTextToSpeech + roTextToSpeechEvent roTextureManager roTextureRequest + roTextureRequestEventroTextWidget roTimer roTimespan roTouchScreen + roTunerroTunerEvent roUniversalControlEvent roUrlEvent roUrlTransfer + roVideoEvent roVideoInput roVideoMode roVideoPlayer roVideoPlayerEvent + roVideoScreen roVideoScreenEventroWriteFile roXMLElement roXMLList + ) + end + + id = /[$a-z_][a-z0-9_]*/io + + state :root do + rule %r/\s+/m, Text::Whitespace + + # https://developer.roku.com/en-ca/docs/references/brightscript/language/expressions-variables-types.md#comments + rule %r/\'.*/, Comment::Single + rule %r/REM.*/i, Comment::Single + + # https://developer.roku.com/en-ca/docs/references/brightscript/language/expressions-variables-types.md#operators + rule %r([~!%^&*+=\|?:<>/-]), Operator + + rule %r/\d*\.\d+(e-?\d+)?/i, Num::Float + rule %r/\d+[lu]*/i, Num::Integer + + rule %r/".*?"/, Str::Double + + rule %r/#{id}(?=\s*[(])/, Name::Function + + rule %r/[()\[\],.;{}]/, Punctuation + + rule id do |m| + caseSensitiveChunk = m[0] + caseInsensitiveChunk = m[0].upcase + + if self.class.builtins.include?(caseSensitiveChunk) + token Keyword::Reserved + elsif self.class.keyword_reserved.include?(caseInsensitiveChunk) + token Keyword::Reserved + elsif self.class.keyword_reserved_unsupported.include?(caseInsensitiveChunk) + token Keyword::Reserved + elsif self.class.keyword_type.include?(caseInsensitiveChunk) + token Keyword::Type + elsif self.class.name_builtin.include?(caseInsensitiveChunk) + token Name::Builtin + elsif self.class.operator_word.include?(caseInsensitiveChunk) + token Operator::Word + else + token Name + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bsl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bsl.rb new file mode 100644 index 000000000000..109d81f2832f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/bsl.rb @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Bsl < RegexLexer + title "1C (BSL)" + desc "The 1C:Enterprise programming language" + tag 'bsl' + filenames '*.bsl', '*.os' + + KEYWORDS = /(?<=[^\wа-яё]|^)(?: + КонецПроцедуры | EndProcedure | КонецФункции | EndFunction + | Прервать | Break | Продолжить | Continue + | Возврат | Return | Если | If + | Иначе | Else | ИначеЕсли | ElsIf + | Тогда | Then | КонецЕсли | EndIf + | Попытка | Try | Исключение | Except + | КонецПопытки | EndTry | Raise | ВызватьИсключение + | Пока | While | Для | For + | Каждого | Each | Из | In + | По | To | Цикл | Do + | КонецЦикла | EndDo | НЕ | NOT + | И | AND | ИЛИ | OR + | Новый | New | Процедура | Procedure + | Функция | Function | Перем | Var + | Экспорт | Export | Знач | Val + )(?=[^\wа-яё]|$)/ix + + BUILTINS = /(?<=[^\wа-яё]|^)(?: + СтрДлина|StrLen|СокрЛ|TrimL|СокрП|TrimR|СокрЛП|TrimAll|Лев|Left|Прав|Right|Сред|Mid|СтрНайти|StrFind|ВРег|Upper|НРег|Lower|ТРег|Title|Символ|Char|КодСимвола|CharCode|ПустаяСтрока|IsBlankString|СтрЗаменить|StrReplace|СтрЧислоСтрок|StrLineCount|СтрПолучитьСтроку|StrGetLine|СтрЧислоВхождений|StrOccurrenceCount|СтрСравнить|StrCompare|СтрНачинаетсяС|StrStartWith|СтрЗаканчиваетсяНа|StrEndsWith|СтрРазделить|StrSplit|СтрСоединить|StrConcat + | Цел|Int|Окр|Round|ACos|ACos|ASin|ASin|ATan|ATan|Cos|Cos|Exp|Exp|Log|Log|Log10|Log10|Pow|Pow|Sin|Sin|Sqrt|Sqrt|Tan|Tan + | Год|Year|Месяц|Month|День|Day|Час|Hour|Минута|Minute|Секунда|Second|НачалоГода|BegOfYear|НачалоДня|BegOfDay|НачалоКвартала|BegOfQuarter|НачалоМесяца|BegOfMonth|НачалоМинуты|BegOfMinute|НачалоНедели|BegOfWeek|НачалоЧаса|BegOfHour|КонецГода|EndOfYear|КонецДня|EndOfDay|КонецКвартала|EndOfQuarter|КонецМесяца|EndOfMonth|КонецМинуты|EndOfMinute|КонецНедели|EndOfWeek|КонецЧаса|EndOfHour|НеделяГода|WeekOfYear|ДеньГода|DayOfYear|ДеньНедели|WeekDay|ТекущаяДата|CurrentDate|ДобавитьМесяц|AddMonth + | Тип|Type|ТипЗнч|TypeOf + | Булево|Boolean|Число|Number|Строка|String|Дата|Date + | ПоказатьВопрос|ShowQueryBox|Вопрос|DoQueryBox|ПоказатьПредупреждение|ShowMessageBox|Предупреждение|DoMessageBox|Сообщить|Message|ОчиститьСообщения|ClearMessages|ОповеститьОбИзменении|NotifyChanged|Состояние|Status|Сигнал|Beep|ПоказатьЗначение|ShowValue|ОткрытьЗначение|OpenValue|Оповестить|Notify|ОбработкаПрерыванияПользователя|UserInterruptProcessing|ОткрытьСодержаниеСправки|OpenHelpContent|ОткрытьИндексСправки|OpenHelpIndex|ОткрытьСправку|OpenHelp|ПоказатьИнформациюОбОшибке|ShowErrorInfo|КраткоеПредставлениеОшибки|BriefErrorDescription|ПодробноеПредставлениеОшибки|DetailErrorDescription|ПолучитьФорму|GetForm|ЗакрытьСправку|CloseHelp|ПоказатьОповещениеПользователя|ShowUserNotification|ОткрытьФорму|OpenForm|ОткрытьФормуМодально|OpenFormModal|АктивноеОкно|ActiveWindow|ВыполнитьОбработкуОповещения|ExecuteNotifyProcessing + | ПоказатьВводЗначения|ShowInputValue|ВвестиЗначение|InputValue|ПоказатьВводЧисла|ShowInputNumber|ВвестиЧисло|InputNumber|ПоказатьВводСтроки|ShowInputString|ВвестиСтроку|InputString|ПоказатьВводДаты|ShowInputDate|ВвестиДату|InputDate + | Формат|Format|ЧислоПрописью|NumberInWords|НСтр|NStr|ПредставлениеПериода|PeriodPresentation|СтрШаблон|StrTemplate + | ПолучитьОбщийМакет|GetCommonTemplate|ПолучитьОбщуюФорму|GetCommonForm|ПредопределенноеЗначение|PredefinedValue|ПолучитьПолноеИмяПредопределенногоЗначения|GetPredefinedValueFullName + | ПолучитьЗаголовокСистемы|GetCaption|ПолучитьСкоростьКлиентскогоСоединения|GetClientConnectionSpeed|ПодключитьОбработчикОжидания|AttachIdleHandler|УстановитьЗаголовокСистемы|SetCaption|ОтключитьОбработчикОжидания|DetachIdleHandler|ИмяКомпьютера|ComputerName|ЗавершитьРаботуСистемы|Exit|ИмяПользователя|UserName|ПрекратитьРаботуСистемы|Terminate|ПолноеИмяПользователя|UserFullName|ЗаблокироватьРаботуПользователя|LockApplication|КаталогПрограммы|BinDir|КаталогВременныхФайлов|TempFilesDir|ПравоДоступа|AccessRight|РольДоступна|IsInRole|ТекущийЯзык|CurrentLanguage|ТекущийКодЛокализации|CurrentLocaleCode|СтрокаСоединенияИнформационнойБазы|InfoBaseConnectionString|ПодключитьОбработчикОповещения|AttachNotificationHandler|ОтключитьОбработчикОповещения|DetachNotificationHandler|ПолучитьСообщенияПользователю|GetUserMessages|ПараметрыДоступа|AccessParameters|ПредставлениеПриложения|ApplicationPresentation|ТекущийЯзыкСистемы|CurrentSystemLanguage|ЗапуститьСистему|RunSystem|ТекущийРежимЗапуска|CurrentRunMode|УстановитьЧасовойПоясСеанса|SetSessionTimeZone|ЧасовойПоясСеанса|SessionTimeZone|ТекущаяДатаСеанса|CurrentSessionDate|УстановитьКраткийЗаголовокПриложения|SetShortApplicationCaption|ПолучитьКраткийЗаголовокПриложения|GetShortApplicationCaption|ПредставлениеПрава|RightPresentation|ВыполнитьПроверкуПравДоступа|VerifyAccessRights|РабочийКаталогДанныхПользователя|UserDataWorkDir|КаталогДокументов|DocumentsDir|ПолучитьИнформациюЭкрановКлиента|GetClientDisplaysInformation|ТекущийВариантОсновногоШрифтаКлиентскогоПриложения|ClientApplicationBaseFontCurrentVariant|ТекущийВариантИнтерфейсаКлиентскогоПриложения|ClientApplicationInterfaceCurrentVariant|УстановитьЗаголовокКлиентскогоПриложения|SetClientApplicationCaption|ПолучитьЗаголовокКлиентскогоПриложения|GetClientApplicationCaption|НачатьПолучениеКаталогаВременныхФайлов|BeginGettingTempFilesDir|НачатьПолучениеКаталогаДокументов|BeginGettingDocumentsDir|НачатьПолучениеРабочегоКаталогаДанныхПользователя|BeginGettingUserDataWorkDir|ПодключитьОбработчикЗапросаНастроекКлиентаЛицензирования|AttachLicensingClientParametersRequestHandler|ОтключитьОбработчикЗапросаНастроекКлиентаЛицензирования|DetachLicensingClientParametersRequestHandler + | ЗначениеВСтрокуВнутр|ValueToStringInternal|ЗначениеИзСтрокиВнутр|ValueFromStringInternal|ЗначениеВФайл|ValueToFile|ЗначениеИзФайла|ValueFromFile + | КомандаСистемы|System|ЗапуститьПриложение|RunApp|ПолучитьCOMОбъект|GetCOMObject|ПользователиОС|OSUsers|НачатьЗапускПриложения|BeginRunningApplication + | ПодключитьВнешнююКомпоненту|AttachAddIn|НачатьУстановкуВнешнейКомпоненты|BeginInstallAddIn|УстановитьВнешнююКомпоненту|InstallAddIn|НачатьПодключениеВнешнейКомпоненты|BeginAttachingAddIn + | КопироватьФайл|FileCopy|ПереместитьФайл|MoveFile|УдалитьФайлы|DeleteFiles|НайтиФайлы|FindFiles|СоздатьКаталог|CreateDirectory|ПолучитьИмяВременногоФайла|GetTempFileName|РазделитьФайл|SplitFile|ОбъединитьФайлы|MergeFiles|ПолучитьФайл|GetFile|НачатьПомещениеФайла|BeginPutFile|ПоместитьФайл|PutFile|ЭтоАдресВременногоХранилища|IsTempStorageURL|УдалитьИзВременногоХранилища|DeleteFromTempStorage|ПолучитьИзВременногоХранилища|GetFromTempStorage|ПоместитьВоВременноеХранилище|PutToTempStorage|ПодключитьРасширениеРаботыСФайлами|AttachFileSystemExtension|НачатьУстановкуРасширенияРаботыСФайлами|BeginInstallFileSystemExtension|УстановитьРасширениеРаботыСФайлами|InstallFileSystemExtension|ПолучитьФайлы|GetFiles|ПоместитьФайлы|PutFiles|ЗапроситьРазрешениеПользователя|RequestUserPermission|ПолучитьМаскуВсеФайлы|GetAllFilesMask|ПолучитьМаскуВсеФайлыКлиента|GetClientAllFilesMask|ПолучитьМаскуВсеФайлыСервера|GetServerAllFilesMask|ПолучитьРазделительПути|GetPathSeparator|ПолучитьРазделительПутиКлиента|GetClientPathSeparator|ПолучитьРазделительПутиСервера|GetServerPathSeparator|НачатьПодключениеРасширенияРаботыСФайлами|BeginAttachingFileSystemExtension|НачатьЗапросРазрешенияПользователя|BeginRequestingUserPermission|НачатьПоискФайлов|BeginFindingFiles|НачатьСозданиеКаталога|BeginCreatingDirectory|НачатьКопированиеФайла|BeginCopyingFile|НачатьПеремещениеФайла|BeginMovingFile|НачатьУдалениеФайлов|BeginDeletingFiles|НачатьПолучениеФайлов|BeginGettingFiles|НачатьПомещениеФайлов|BeginPuttingFiles + | НачатьТранзакцию|BeginTransaction|ЗафиксироватьТранзакцию|CommitTransaction|ОтменитьТранзакцию|RollbackTransaction|УстановитьМонопольныйРежим|SetExclusiveMode|МонопольныйРежим|ExclusiveMode|ПолучитьОперативнуюОтметкуВремени|GetRealTimeTimestamp|ПолучитьСоединенияИнформационнойБазы|GetInfoBaseConnections|НомерСоединенияИнформационнойБазы|InfoBaseConnectionNumber|КонфигурацияИзменена|ConfigurationChanged|КонфигурацияБазыДанныхИзмененаДинамически|DataBaseConfigurationChangedDynamically|УстановитьВремяОжиданияБлокировкиДанных|SetLockWaitTime|ОбновитьНумерациюОбъектов|RefreshObjectsNumbering|ПолучитьВремяОжиданияБлокировкиДанных|GetLockWaitTime|КодЛокализацииИнформационнойБазы|InfoBaseLocaleCode|УстановитьМинимальнуюДлинуПаролейПользователей|SetUserPasswordMinLength|ПолучитьМинимальнуюДлинуПаролейПользователей|GetUserPasswordMinLength|ИнициализироватьПредопределенныеДанные|InitializePredefinedData|УдалитьДанныеИнформационнойБазы|EraseInfoBaseData|УстановитьПроверкуСложностиПаролейПользователей|SetUserPasswordStrengthCheck|ПолучитьПроверкуСложностиПаролейПользователей|GetUserPasswordStrengthCheck|ПолучитьСтруктуруХраненияБазыДанных|GetDBStorageStructureInfo|УстановитьПривилегированныйРежим|SetPrivilegedMode|ПривилегированныйРежим|PrivilegedMode|ТранзакцияАктивна|TransactionActive|НеобходимостьЗавершенияСоединения|ConnectionStopRequest|НомерСеансаИнформационнойБазы|InfoBaseSessionNumber|ПолучитьСеансыИнформационнойБазы|GetInfoBaseSessions|ЗаблокироватьДанныеДляРедактирования|LockDataForEdit|УстановитьСоединениеСВнешнимИсточникомДанных|ConnectExternalDataSource|РазблокироватьДанныеДляРедактирования|UnlockDataForEdit|РазорватьСоединениеСВнешнимИсточникомДанных|DisconnectExternalDataSource|ПолучитьБлокировкуСеансов|GetSessionsLock|УстановитьБлокировкуСеансов|SetSessionsLock|ОбновитьПовторноИспользуемыеЗначения|RefreshReusableValues|УстановитьБезопасныйРежим|SetSafeMode|БезопасныйРежим|SafeMode|ПолучитьДанныеВыбора|GetChoiceData|УстановитьЧасовойПоясИнформационнойБазы|SetInfoBaseTimeZone|ПолучитьЧасовойПоясИнформационнойБазы|GetInfoBaseTimeZone|ПолучитьОбновлениеКонфигурацииБазыДанных|GetDataBaseConfigurationUpdate|УстановитьБезопасныйРежимРазделенияДанных|SetDataSeparationSafeMode|БезопасныйРежимРазделенияДанных|DataSeparationSafeMode|УстановитьВремяЗасыпанияПассивногоСеанса|SetPassiveSessionHibernateTime|ПолучитьВремяЗасыпанияПассивногоСеанса|GetPassiveSessionHibernateTime|УстановитьВремяЗавершенияСпящегоСеанса|SetHibernateSessionTerminateTime|ПолучитьВремяЗавершенияСпящегоСеанса|GetHibernateSessionTerminateTime|ПолучитьТекущийСеансИнформационнойБазы|GetCurrentInfoBaseSession|ПолучитьИдентификаторКонфигурации|GetConfigurationID|УстановитьНастройкиКлиентаЛицензирования|SetLicensingClientParameters|ПолучитьИмяКлиентаЛицензирования|GetLicensingClientName|ПолучитьДополнительныйПараметрКлиентаЛицензирования|GetLicensingClientAdditionalParameter + | НайтиПомеченныеНаУдаление|FindMarkedForDeletion|НайтиПоСсылкам|FindByRef|УдалитьОбъекты|DeleteObjects|УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы|SetInfoBasePredefinedDataUpdate|ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы|GetInfoBasePredefinedData + | XMLСтрока|XMLString|XMLЗначение|XMLValue|XMLТип|XMLType|XMLТипЗнч|XMLTypeOf|ИзXMLТипа|FromXMLType|ВозможностьЧтенияXML|CanReadXML|ПолучитьXMLТип|GetXMLType|ПрочитатьXML|ReadXML|ЗаписатьXML|WriteXML|НайтиНедопустимыеСимволыXML|FindDisallowedXMLCharacters|ИмпортМоделиXDTO|ImportXDTOModel|СоздатьФабрикуXDTO|CreateXDTOFactory + | ЗаписатьJSON|WriteJSON|ПрочитатьJSON|ReadJSON|ПрочитатьДатуJSON|ReadJSONDate|ЗаписатьДатуJSON|WriteJSONDate + | ЗаписьЖурналаРегистрации|WriteLogEvent|ПолучитьИспользованиеЖурналаРегистрации|GetEventLogUsing|УстановитьИспользованиеЖурналаРегистрации|SetEventLogUsing|ПредставлениеСобытияЖурналаРегистрации|EventLogEventPresentation|ВыгрузитьЖурналРегистрации|UnloadEventLog|ПолучитьЗначенияОтбораЖурналаРегистрации|GetEventLogFilterValues|УстановитьИспользованиеСобытияЖурналаРегистрации|SetEventLogEventUse|ПолучитьИспользованиеСобытияЖурналаРегистрации|GetEventLogEventUse|СкопироватьЖурналРегистрации|CopyEventLog|ОчиститьЖурналРегистрации|ClearEventLog + | ЗначениеВДанныеФормы|ValueToFormData|ДанныеФормыВЗначение|FormDataToValue|КопироватьДанныеФормы|CopyFormData|УстановитьСоответствиеОбъектаИФормы|SetObjectAndFormConformity|ПолучитьСоответствиеОбъектаИФормы|GetObjectAndFormConformity + | ПолучитьФункциональнуюОпцию|GetFunctionalOption|ПолучитьФункциональнуюОпциюИнтерфейса|GetInterfaceFunctionalOption|УстановитьПараметрыФункциональныхОпцийИнтерфейса|SetInterfaceFunctionalOptionParameters|ПолучитьПараметрыФункциональныхОпцийИнтерфейса|GetInterfaceFunctionalOptionParameters|ОбновитьИнтерфейс|RefreshInterface + | УстановитьРасширениеРаботыСКриптографией|InstallCryptoExtension|НачатьУстановкуРасширенияРаботыСКриптографией|BeginInstallCryptoExtension|ПодключитьРасширениеРаботыСКриптографией|AttachCryptoExtension|НачатьПодключениеРасширенияРаботыСКриптографией|BeginAttachingCryptoExtension + | УстановитьСоставСтандартногоИнтерфейсаOData|SetStandardODataInterfaceContent|ПолучитьСоставСтандартногоИнтерфейсаOData|GetStandardODataInterfaceContent + | Мин|Min|Макс|Max|ОписаниеОшибки|ErrorDescription|Вычислить|Eval|ИнформацияОбОшибке|ErrorInfo|Base64Значение|Base64Value|Base64Строка|Base64String|ЗаполнитьЗначенияСвойств|FillPropertyValues|ЗначениеЗаполнено|ValueIsFilled|ПолучитьПредставленияНавигационныхСсылок|GetURLsPresentations|НайтиОкноПоНавигационнойСсылке|FindWindowByURL|ПолучитьОкна|GetWindows|ПерейтиПоНавигационнойСсылке|GotoURL|ПолучитьНавигационнуюСсылку|GetURL|ПолучитьДопустимыеКодыЛокализации|GetAvailableLocaleCodes|ПолучитьНавигационнуюСсылкуИнформационнойБазы|GetInfoBaseURL|ПредставлениеКодаЛокализации|LocaleCodePresentation|ПолучитьДопустимыеЧасовыеПояса|GetAvailableTimeZones|ПредставлениеЧасовогоПояса|TimeZonePresentation|ТекущаяУниверсальнаяДата|CurrentUniversalDate|ТекущаяУниверсальнаяДатаВМиллисекундах|CurrentUniversalDateInMilliseconds|МестноеВремя|ToLocalTime|УниверсальноеВремя|ToUniversalTime|ЧасовойПояс|TimeZone|СмещениеЛетнегоВремени|DaylightTimeOffset|СмещениеСтандартногоВремени|StandardTimeOffset|КодироватьСтроку|EncodeString|РаскодироватьСтроку|DecodeString|Найти|Find + | ПередНачаломРаботыСистемы|BeforeStart|ПриНачалеРаботыСистемы|OnStart|ПередЗавершениемРаботыСистемы|BeforeExit|ПриЗавершенииРаботыСистемы|OnExit|ОбработкаВнешнегоСобытия|ExternEventProcessing|УстановкаПараметровСеанса|SessionParametersSetting|ПриИзмененииПараметровЭкрана|OnChangeDisplaySettings + | WSСсылки|WSReferences|БиблиотекаКартинок|PictureLib|БиблиотекаМакетовОформленияКомпоновкиДанных|DataCompositionAppearanceTemplateLib|БиблиотекаСтилей|StyleLib|БизнесПроцессы|BusinessProcesses|ВнешниеИсточникиДанных|ExternalDataSources|ВнешниеОбработки|ExternalDataProcessors|ВнешниеОтчеты|ExternalReports|Документы|Documents|ДоставляемыеУведомления|DeliverableNotifications|ЖурналыДокументов|DocumentJournals|Задачи|Tasks|ИспользованиеРабочейДаты|WorkingDateUse|ИсторияРаботыПользователя|UserWorkHistory|Константы|Constants|КритерииОтбора|FilterCriteria|Метаданные|Metadata|Обработки|DataProcessors|ОтправкаДоставляемыхУведомлений|DeliverableNotificationSend|Отчеты|Reports|ПараметрыСеанса|SessionParameters|Перечисления|Enums|ПланыВидовРасчета|ChartsOfCalculationTypes|ПланыВидовХарактеристик|ChartsOfCharacteristicTypes|ПланыОбмена|ExchangePlans|ПланыСчетов|ChartsOfAccounts|ПолнотекстовыйПоиск|FullTextSearch|ПользователиИнформационнойБазы|InfoBaseUsers|Последовательности|Sequences|РасширенияКонфигурации|ConfigurationExtensions|РегистрыБухгалтерии|AccountingRegisters|РегистрыНакопления|AccumulationRegisters|РегистрыРасчета|CalculationRegisters|РегистрыСведений|InformationRegisters|РегламентныеЗадания|ScheduledJobs|СериализаторXDTO|XDTOSerializer|Справочники|Catalogs|СредстваГеопозиционирования|LocationTools|СредстваКриптографии|CryptoToolsManager|СредстваМультимедиа|MultimediaTools|СредстваПочты|MailTools|СредстваТелефонии|TelephonyTools|ФабрикаXDTO|XDTOFactory|ФоновыеЗадания|BackgroundJobs|ХранилищаНастроек + | ГлавныйИнтерфейс|MainInterface|ГлавныйСтиль|MainStyle|ПараметрЗапуска|LaunchParameter|РабочаяДата|WorkingDate|SettingsStorages|ХранилищеВариантовОтчетов|ReportsVariantsStorage|ХранилищеНастроекДанныхФорм|FormDataSettingsStorage|ХранилищеОбщихНастроек|CommonSettingsStorage|ХранилищеПользовательскихНастроекДинамическихСписков|DynamicListsUserSettingsStorage|ХранилищеПользовательскихНастроекОтчетов|ReportsUserSettingsStorage|ХранилищеСистемныхНастроек|SystemSettingsStorage + | Если|If|ИначеЕсли|ElsIf|Иначе|Else|КонецЕсли|EndIf|Тогда|Then + | Неопределено|Undefined|Истина|True|Ложь|False|NULL + )\s*(?=\()/ix + + state :root do + rule %r/\n/, Text + rule %r/[^\S\n]+/, Text + rule %r(//.*$), Comment::Single + rule %r/[\[\]:(),;]/, Punctuation + rule %r/(?<=[^\wа-яё]|^)\&.*$/, Keyword::Declaration + rule %r/[-+\/*%=<>.?&]/, Operator + rule %r/(?<=[^\wа-яё]|^)\#.*$/, Keyword::Declaration + rule KEYWORDS, Keyword + rule BUILTINS, Name::Builtin + rule %r/[\wа-яё][\wа-яё]*/i, Name::Variable + + #literals + rule %r/\b((\h{8}-(\h{4}-){3}\h{12})|\d+\.?\d*)\b/, Literal::Number + rule %r/\'.*\'/, Literal::Date + rule %r/".*?("|$)/, Literal::String::Single + rule %r/(?<=[^\wа-яё]|^)\|((?!\"\").)*?(\"|$)/, Literal::String + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/c.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/c.rb new file mode 100644 index 000000000000..d08bda55d156 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/c.rb @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class C < RegexLexer + tag 'c' + filenames '*.c', '*.h', '*.idc' + mimetypes 'text/x-chdr', 'text/x-csrc' + + title "C" + desc "The C programming language" + + # optional comment or whitespace + ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+) + id = /[a-zA-Z_][a-zA-Z0-9_]*/ + + def self.keywords + @keywords ||= Set.new %w( + auto break case const continue default do else enum extern + for goto if register restricted return sizeof static struct + switch typedef union volatile virtual while + + _Alignas _Alignof _Atomic _Generic _Imaginary + _Noreturn _Static_assert _Thread_local + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + int long float short double char unsigned signed void + + jmp_buf FILE DIR div_t ldiv_t mbstate_t sig_atomic_t fpos_t + clock_t time_t va_list size_t ssize_t off_t wchar_t ptrdiff_t + wctrans_t wint_t wctype_t + + _Bool _Complex int8_t int16_t int32_t int64_t + uint8_t uint16_t uint32_t uint64_t int_least8_t + int_least16_t int_least32_t int_least64_t + uint_least8_t uint_least16_t uint_least32_t + uint_least64_t int_fast8_t int_fast16_t int_fast32_t + int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t + uint_fast64_t intptr_t uintptr_t intmax_t + uintmax_t + + char16_t char32_t + ) + end + + def self.reserved + @reserved ||= Set.new %w( + __asm __int8 __based __except __int16 __stdcall __cdecl + __fastcall __int32 __declspec __finally __int61 __try __leave + inline _inline __inline naked _naked __naked restrict _restrict + __restrict thread _thread __thread typename _typename __typename + ) + end + + def self.builtins + @builtins ||= [] + end + + start { push :bol } + + state :expr_bol do + mixin :inline_whitespace + + rule %r/#if\s0/, Comment, :if_0 + rule %r/#/, Comment::Preproc, :macro + + rule(//) { pop! } + end + + # :expr_bol is the same as :bol but without labels, since + # labels can only appear at the beginning of a statement. + state :bol do + rule %r/#{id}:(?!:)/, Name::Label + mixin :expr_bol + end + + state :inline_whitespace do + rule %r/[ \t\r]+/, Text + rule %r/\\\n/, Text # line continuation + rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline + end + + state :whitespace do + rule %r/\n+/m, Text, :bol + rule %r(//(\\.|.)*?$), Comment::Single, :bol + mixin :inline_whitespace + end + + state :expr_whitespace do + rule %r/\n+/m, Text, :expr_bol + mixin :whitespace + end + + state :statements do + mixin :whitespace + rule %r/(u8|u|U|L)?"/, Str, :string + rule %r((u8|u|U|L)?'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char + rule %r((\d+[.]\d*|[.]?\d+)e[+-]?\d+[lu]*)i, Num::Float + rule %r(\d+e[+-]?\d+[lu]*)i, Num::Float + rule %r/0x[0-9a-f]+[lu]*/i, Num::Hex + rule %r/0[0-7]+[lu]*/i, Num::Oct + rule %r/\d+[lu]*/i, Num::Integer + rule %r(\*/), Error + rule %r([~!%^&*+=\|?:<>/-]), Operator + rule %r/[()\[\],.;]/, Punctuation + rule %r/\bcase\b/, Keyword, :case + rule %r/(?:true|false|NULL)\b/, Name::Builtin + rule id do |m| + name = m[0] + + if self.class.keywords.include? name + token Keyword + elsif self.class.keywords_type.include? name + token Keyword::Type + elsif self.class.reserved.include? name + token Keyword::Reserved + elsif self.class.builtins.include? name + token Name::Builtin + else + token Name + end + end + end + + state :case do + rule %r/:/, Punctuation, :pop! + mixin :statements + end + + state :root do + mixin :expr_whitespace + rule %r( + ([\w*\s]+?[\s*]) # return arguments + (#{id}) # function name + (\s*\([^;]*?\)) # signature + (#{ws}?)({|;) # open brace or semicolon + )mx do |m| + # TODO: do this better. + recurse m[1] + token Name::Function, m[2] + recurse m[3] + recurse m[4] + token Punctuation, m[5] + if m[5] == ?{ + push :function + end + end + rule %r/\{/, Punctuation, :function + mixin :statements + end + + state :function do + mixin :whitespace + mixin :statements + rule %r/;/, Punctuation + rule %r/{/, Punctuation, :function + rule %r/}/, Punctuation, :pop! + end + + state :string do + rule %r/"/, Str, :pop! + rule %r/\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape + rule %r/[^\\"\n]+/, Str + rule %r/\\\n/, Str + rule %r/\\/, Str # stray backslash + end + + state :macro do + # NB: pop! goes back to :bol + rule %r/\n/, Comment::Preproc, :pop! + rule %r([^/\n\\]+), Comment::Preproc + rule %r/\\./m, Comment::Preproc + mixin :inline_whitespace + rule %r(/), Comment::Preproc + end + + state :if_0 do + # NB: no \b here, to cover #ifdef and #ifndef + rule %r/^\s*#if/, Comment, :if_0 + rule %r/^\s*#\s*el(?:se|if)/, Comment, :pop! + rule %r/^\s*#\s*endif\b.*?(?<!\\)\n/m, Comment, :pop! + rule %r/.*?\n/, Comment + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ceylon.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ceylon.rb new file mode 100644 index 000000000000..763e4de0640d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ceylon.rb @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Ceylon < RegexLexer + tag 'ceylon' + filenames '*.ceylon' + mimetypes 'text/x-ceylon' + + title "Ceylon" + desc 'Say more, more clearly.' + + state :whitespace do + rule %r([^\S\n]+), Text + rule %r(//.*?\n), Comment::Single + rule %r(/\*), Comment::Multiline + end + + state :root do + mixin :whitespace + + rule %r((shared|abstract|formal|default|actual|variable|deprecated|small| + late|literal|doc|by|see|throws|optional|license|tagged|final|native| + annotation|sealed)\b), Name::Decorator + + rule %r((break|case|catch|continue|else|finally|for|in| + if|return|switch|this|throw|try|while|is|exists|dynamic| + nonempty|then|outer|assert|let)\b), Keyword + + rule %r((abstracts|extends|satisfies|super|given|of|out|assign)\b), Keyword::Declaration + + rule %r((function|value|void|new)\b), Keyword::Type + + rule %r((assembly|module|package)(\s+)) do + groups Keyword::Namespace, Text + push :import + end + + rule %r((true|false|null)\b), Keyword::Constant + + rule %r((class|interface|object|alias)(\s+)) do + groups Keyword::Declaration, Text + push :class + end + + rule %r((import)(\s+)) do + groups Keyword::Namespace, Text + push :import + end + + rule %r("(\\\\|\\"|[^"])*"), Literal::String + rule %r('\\.'|'[^\\]'|'\\\{#[0-9a-fA-F]{4}\}'), Literal::String::Char + rule %r(".*``.*``.*"', String::Interpol + rule %r(\.)([a-z_]\w*)) do + groups Operator, Name::Attribute + end + rule %r([a-zA-Z_]\w*:), Name::Label + rule %r((\\I[a-z]|[A-Z])\w*), Name::Decorator + rule %r([a-zA-Z_]\w*), Name + rule %r([~^*!%&\[\](){}<>|+=:;,./?`-]), Operator + rule %r(\d{1,3}(_\d{3})+\.\d{1,3}(_\d{3})+[kMGTPmunpf]?), Literal::Number::Float + rule %r(\d{1,3}(_\d{3})+\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?), + Literal::Number::Float + rule %r([0-9][0-9]*\.\d{1,3}(_\d{3})+[kMGTPmunpf]?), Literal::Number::Float + rule %r([0-9][0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?), + Literal::Number::Float + rule %r(#([0-9a-fA-F]{4})(_[0-9a-fA-F]{4})+), Literal::Number::Hex + rule %r(#[0-9a-fA-F]+), Literal::Number::Hex + rule %r(\$([01]{4})(_[01]{4})+), Literal::Number::Bin + rule %r(\$[01]+), Literal::Number::Bin + rule %r(\d{1,3}(_\d{3})+[kMGTP]?), Literal::Number::Integer + rule %r([0-9]+[kMGTP]?), Literal::Number::Integer + rule %r(\n), Text + + end + + state :class do + mixin :whitespace + rule %r([A-Za-z_]\w*), Name::Class, :pop! + end + + state :import do + rule %r([a-z][\w.]*), Name::Namespace, :pop! + rule %r("(\\\\|\\"|[^"])*"), Literal::String, :pop! + end + + state :comment do + rule %r([^*/]), Comment.Multiline + rule %r(/\*), Comment::Multiline, :push! + rule %r(\*/), Comment::Multiline, :pop! + rule %r([*/]), Comment::Multiline + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cfscript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cfscript.rb new file mode 100644 index 000000000000..6b083ce7bee4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cfscript.rb @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + + class Cfscript < RegexLexer + title "CFScript" + desc 'CFScript, the CFML scripting language' + tag 'cfscript' + aliases 'cfc' + filenames '*.cfc' + + def self.keywords + @keywords ||= %w( + if else var xml default break switch do try catch throw in continue for return while required + ) + end + + def self.declarations + @declarations ||= %w( + component property function remote public package private + ) + end + + def self.types + @types ||= %w( + any array binary boolean component date guid numeric query string struct uuid void xml + ) + end + + constants = %w(application session client cookie super this variables arguments cgi) + + + operators = %w(\+\+ -- && \|\| <= >= < > == != mod eq lt gt lte gte not is and or xor eqv imp equal contains \? ) + dotted_id = /[$a-zA-Z_][a-zA-Z0-9_.]*/ + + state :root do + mixin :comments_and_whitespace + rule %r/(?:#{operators.join('|')}|does not contain|greater than(?: or equal to)?|less than(?: or equal to)?)\b/i, Operator, :expr_start + rule %r([-<>+*%&|\^/!=]=?), Operator, :expr_start + + rule %r/[(\[,]/, Punctuation, :expr_start + rule %r/;/, Punctuation, :statement + rule %r/[)\].]/, Punctuation + + rule %r/[?]/ do + token Punctuation + push :ternary + push :expr_start + end + + rule %r/[{}]/, Punctuation, :statement + + rule %r/(?:#{constants.join('|')})\b/, Name::Constant + rule %r/(?:true|false|null)\b/, Keyword::Constant + rule %r/import\b/, Keyword::Namespace, :import + rule %r/(#{dotted_id})(\s*)(:)(\s*)/ do + groups Name, Text, Punctuation, Text + push :expr_start + end + + rule %r/([A-Za-z_$][\w.]*)(\s*)(\()/ do |m| + if self.class.keywords.include? m[1] + token Keyword, m[1] + token Text, m[2] + token Punctuation, m[3] + else + token Name::Function, m[1] + token Text, m[2] + token Punctuation, m[3] + end + end + + rule dotted_id do |m| + if self.class.declarations.include? m[0] + token Keyword::Declaration + push :expr_start + elsif self.class.keywords.include? m[0] + token Keyword + push :expr_start + elsif self.class.types.include? m[0] + token Keyword::Type + push :expr_start + else + token Name::Other + end + end + + rule %r/[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float + rule %r/0x[0-9a-fA-F]+/, Num::Hex + rule %r/[0-9]+/, Num::Integer + rule %r/"(\\\\|\\"|[^"])*"/, Str::Double + rule %r/'(\\\\|\\'|[^'])*'/, Str::Single + + end + + # same as java, broken out + state :comments_and_whitespace do + rule %r/\s+/, Text + rule %r(//.*?$), Comment::Single + rule %r(/\*.*?\*/)m, Comment::Multiline + end + + state :expr_start do + mixin :comments_and_whitespace + + rule %r/[{]/, Punctuation, :object + + rule %r//, Text, :pop! + end + + state :statement do + + rule %r/[{}]/, Punctuation + + mixin :expr_start + end + + # object literals + state :object do + mixin :comments_and_whitespace + rule %r/[}]/ do + token Punctuation + push :expr_start + end + + rule %r/(#{dotted_id})(\s*)(:)/ do + groups Name::Other, Text, Punctuation + push :expr_start + end + + rule %r/:/, Punctuation + mixin :root + end + + # ternary expressions, where <dotted_id>: is not a label! + state :ternary do + rule %r/:/ do + token Punctuation + goto :expr_start + end + + mixin :root + end + + state :import do + rule %r/\s+/m, Text + rule %r/[a-z0-9_.]+\*?/i, Name::Namespace, :pop! + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/clean.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/clean.rb new file mode 100644 index 000000000000..894c5289ece7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/clean.rb @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Clean < RegexLexer + title "Clean" + desc "The Clean programming language (clean.cs.ru.nl)" + + tag 'clean' + filenames '*.dcl', '*.icl' + + def self.keywords + @keywords ||= Set.new %w( + if otherwise + let in + with where + case of + infix infixl infixr + class instance + generic derive + special + implementation definition system module + from import qualified as + dynamic + code inline foreign export ccall stdcall + ) + end + + # These are literal patterns common to the ABC intermediate language and + # Clean. Clean has more extensive literal patterns (see :basic below). + state :common_literals do + rule %r/'(?:[^'\\]|\\(?:x[0-9a-fA-F]+|\d+|.))'/, Str::Char + + rule %r/[+~-]?\d+\.\d+(?:E[+-]?\d+)?\b/, Num::Float + rule %r/[+~-]?\d+E[+-]?\d+\b/, Num::Float + rule %r/[+~-]?\d+/, Num::Integer + + rule %r/"/, Str::Double, :string + end + + state :basic do + rule %r/\s+/m, Text::Whitespace + + rule %r/\/\/\*.*/, Comment::Doc + rule %r/\/\/.*/, Comment::Single + rule %r/\/\*\*/, Comment::Doc, :comment_doc + rule %r/\/\*/, Comment::Multiline, :comment + + rule %r/[+~-]?0[0-7]+/, Num::Oct + rule %r/[+~-]?0x[0-9a-fA-F]+/, Num::Hex + mixin :common_literals + rule %r/(\[)(\s*)(')(?=.*?'\])/ do + groups Punctuation, Text::Whitespace, Str::Single, Punctuation + push :charlist + end + end + + # nested commenting + state :comment_doc do + rule %r/\*\//, Comment::Doc, :pop! + rule %r/\/\/.*/, Comment::Doc # Singleline comments in multiline comments are skipped + rule %r/\/\*/, Comment::Doc, :comment + rule %r/[^*\/]+/, Comment::Doc + rule %r/[*\/]/, Comment::Doc + end + + # This is the same as the above, but with Multiline instead of Doc + state :comment do + rule %r/\*\//, Comment::Multiline, :pop! + rule %r/\/\/.*/, Comment::Multiline # Singleline comments in multiline comments are skipped + rule %r/\/\*/, Comment::Multiline, :comment + rule %r/[^*\/]+/, Comment::Multiline + rule %r/[*\/]/, Comment::Multiline + end + + state :root do + mixin :basic + + rule %r/code(\s+inline)?\s*{/, Comment::Preproc, :abc + + rule %r/_*[a-z][\w_`]*/ do |m| + if self.class.keywords.include?(m[0]) + token Keyword + else + token Name + end + end + + rule %r/_*[A-Z][\w_`]*/ do |m| + if m[0]=='True' || m[0]=='False' + token Keyword::Constant + else + token Keyword::Type + end + end + + rule %r/[^\w_\s`]/, Punctuation + rule %r/_\b/, Punctuation + end + + state :escapes do + rule %r/\\x[0-9a-fA-F]{1,2}/i, Str::Escape + rule %r/\\d\d{0,3}/i, Str::Escape + rule %r/\\0[0-7]{0,3}/, Str::Escape + rule %r/\\[0-7]{1,3}/, Str::Escape + rule %r/\\[nrfbtv\\"']/, Str::Escape + end + + state :string do + rule %r/"/, Str::Double, :pop! + mixin :escapes + rule %r/[^\\"]+/, Str::Double + end + + state :charlist do + rule %r/(')(\])/ do + groups Str::Single, Punctuation + pop! + end + mixin :escapes + rule %r/[^\\']/, Str::Single + end + + state :abc_basic do + rule %r/\s+/, Text::Whitespace + rule %r/\|.*/, Comment::Single + mixin :common_literals + end + + # The ABC intermediate language can be included, similar to C's inline + # assembly. For some information about ABC, see: + # https://en.wikipedia.org/wiki/Clean_(programming_language)#The_ABC-Machine + state :abc do + mixin :abc_basic + + rule %r/}/, Comment::Preproc, :pop! + rule %r/\.\w*/, Keyword, :abc_rest_of_line + rule %r/[\w_]+/, Name::Builtin, :abc_rest_of_line + end + + state :abc_rest_of_line do + rule %r/\n/, Text::Whitespace, :pop! + rule %r/}/ do + token Comment::Preproc + pop! + pop! + end + + mixin :abc_basic + + rule %r/\S+/, Name + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/clojure.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/clojure.rb new file mode 100644 index 000000000000..06b34e0f764b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/clojure.rb @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Clojure < RegexLexer + title "Clojure" + desc "The Clojure programming language (clojure.org)" + + tag 'clojure' + aliases 'clj', 'cljs' + + filenames '*.clj', '*.cljs', '*.cljc', 'build.boot', '*.edn' + + mimetypes 'text/x-clojure', 'application/x-clojure' + + def self.keywords + @keywords ||= Set.new %w( + fn def defn defmacro defmethod defmulti defn- defstruct if + cond let for + ) + end + + def self.builtins + @builtins ||= Set.new %w( + . .. * + - -> / < <= = == > >= accessor agent agent-errors + aget alength all-ns alter and append-child apply array-map + aset aset-boolean aset-byte aset-char aset-double aset-float + aset-int aset-long aset-short assert assoc await await-for bean + binding bit-and bit-not bit-or bit-shift-left bit-shift-right + bit-xor boolean branch? butlast byte cast char children + class clear-agent-errors comment commute comp comparator + complement concat conj cons constantly construct-proxy + contains? count create-ns create-struct cycle dec deref + difference disj dissoc distinct doall doc dorun doseq dosync + dotimes doto double down drop drop-while edit end? ensure eval + every? false? ffirst file-seq filter find find-doc find-ns + find-var first float flush fnseq frest gensym get-proxy-class + get hash-map hash-set identical? identity if-let import in-ns + inc index insert-child insert-left insert-right inspect-table + inspect-tree instance? int interleave intersection into + into-array iterate join key keys keyword keyword? last lazy-cat + lazy-cons left lefts line-seq list* list load load-file locking + long loop macroexpand macroexpand-1 make-array make-node map + map-invert map? mapcat max max-key memfn merge merge-with meta + min min-key name namespace neg? new newline next nil? node not + not-any? not-every? not= ns-imports ns-interns ns-map ns-name + ns-publics ns-refers ns-resolve ns-unmap nth nthrest or parse + partial path peek pop pos? pr pr-str print print-str println + println-str prn prn-str project proxy proxy-mappings quot + rand rand-int range re-find re-groups re-matcher re-matches + re-pattern re-seq read read-line reduce ref ref-set refer rem + remove remove-method remove-ns rename rename-keys repeat replace + replicate resolve rest resultset-seq reverse rfirst right + rights root rrest rseq second select select-keys send send-off + seq seq-zip seq? set short slurp some sort sort-by sorted-map + sorted-map-by sorted-set special-symbol? split-at split-with + str string? struct struct-map subs subvec symbol symbol? + sync take take-nth take-while test time to-array to-array-2d + tree-seq true? union up update-proxy val vals var-get var-set + var? vector vector-zip vector? when when-first when-let + when-not with-local-vars with-meta with-open with-out-str + xml-seq xml-zip zero? zipmap zipper' + ) + end + + identifier = %r([\w!$%*+,<=>?/.-]+) + keyword = %r([\w!\#$%*+,<=>?/.-]+) + + def name_token(name) + return Keyword if self.class.keywords.include?(name) + return Name::Builtin if self.class.builtins.include?(name) + nil + end + + state :root do + rule %r/;.*?$/, Comment::Single + rule %r/\s+/m, Text::Whitespace + + rule %r/-?\d+\.\d+/, Num::Float + rule %r/-?\d+/, Num::Integer + rule %r/0x-?[0-9a-fA-F]+/, Num::Hex + + rule %r/"(\\.|[^"])*"/, Str + rule %r/'#{keyword}/, Str::Symbol + rule %r/::?#{keyword}/, Name::Constant + rule %r/\\(.|[a-z]+)/i, Str::Char + + + rule %r/~@|[`\'#^~&@]/, Operator + + rule %r/(\()(\s*)(#{identifier})/m do |m| + token Punctuation, m[1] + token Text::Whitespace, m[2] + token(name_token(m[3]) || Name::Function, m[3]) + end + + rule identifier do |m| + token name_token(m[0]) || Name + end + + # vectors + rule %r/[\[\]]/, Punctuation + + # maps + rule %r/[{}]/, Punctuation + + # parentheses + rule %r/[()]/, Punctuation + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cmake.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cmake.rb new file mode 100644 index 000000000000..a22169cde3e5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cmake.rb @@ -0,0 +1,218 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class CMake < RegexLexer + title 'CMake' + desc 'The cross-platform, open-source build system' + tag 'cmake' + filenames 'CMakeLists.txt', '*.cmake' + mimetypes 'text/x-cmake' + + SPACE = '[ \t]' + BRACKET_OPEN = '\[=*\[' + + STATES_MAP = { + :root => Text, + :bracket_string => Str::Double, + :quoted_argument => Str::Double, + :bracket_comment => Comment::Multiline, + :variable_reference => Name::Variable, + } + + BUILTIN_COMMANDS = Set.new %w[ + add_compile_definitions + add_compile_options + add_custom_command + add_custom_target + add_definitions + add_dependencies + add_executable + add_library + add_link_options + add_subdirectory + add_test + aux_source_directory + break + build_command + build_name + cmake_host_system_information + cmake_language + cmake_minimum_required + cmake_parse_arguments + cmake_policy + configure_file + create_test_sourcelist + define_property + else + elseif + enable_language + enable_testing + endforeach + endfunction + endif + endmacro + endwhile + exec_program + execute_process + export + export_library_dependencies + file + find_file + find_library + find_package + find_path + find_program + fltk_wrap_ui + foreach + function + get_cmake_property + get_directory_property + get_filename_component + get_property + get_source_file_property + get_target_property + get_test_property + if + include + include_directories + include_external_msproject + include_guard + include_regular_expression + install + install_files + install_programs + install_targets + link_directories + link_libraries + list + load_cache + load_command + macro + make_directory + mark_as_advanced + math + message + option + output_required_files + project + qt_wrap_cpp + qt_wrap_ui + remove + remove_definitions + return + separate_arguments + set + set_directory_properties + set_property + set_source_files_properties + set_target_properties + set_tests_properties + site_name + source_group + string + subdir_depends + subdirs + target_compile_definitions + target_compile_features + target_compile_options + target_include_directories + target_link_directories + target_link_libraries + target_link_options + target_precompile_headers + target_sources + try_compile + try_run + unset + use_mangled_mesa + utility_source + variable_requires + variable_watch + while + write_file + ] + + state :default do + rule %r/\r\n?|\n/ do + token STATES_MAP[state.name.to_sym] + end + rule %r/./ do + token STATES_MAP[state.name.to_sym] + end + end + + state :variable_interpolation do + rule %r/\$\{/ do + token Str::Interpol + push :variable_reference + end + end + + state :bracket_close do + rule %r/\]=*\]/ do |m| + token STATES_MAP[state.name.to_sym] + goto :root if m[0].length == @bracket_len + end + end + + state :root do + mixin :variable_interpolation + + rule %r/#{SPACE}/, Text + rule %r/[()]/, Punctuation + + rule %r/##{BRACKET_OPEN}/ do |m| + token Comment::Multiline + @bracket_len = m[0].length - 1 # decount '#' + goto :bracket_comment + end + rule %r/#{BRACKET_OPEN}/ do |m| + token Str::Double + @bracket_len = m[0].length + goto :bracket_string + end + + rule %r/\\"/, Text + rule %r/"/, Str::Double, :quoted_argument + + rule %r/([A-Za-z_][A-Za-z0-9_]*)(#{SPACE}*)(\()/ do |m| + groups BUILTIN_COMMANDS.include?(m[1]) ? Name::Builtin : Name::Function, Text, Punctuation + end + + rule %r/#.*/, Comment::Single + + mixin :default + end + + state :bracket_string do + mixin :bracket_close + mixin :variable_interpolation + mixin :default + end + + state :bracket_comment do + mixin :bracket_close + mixin :default + end + + state :variable_reference do + mixin :variable_interpolation + + rule %r/}/, Str::Interpol, :pop! + + mixin :default + end + + state :quoted_argument do + mixin :variable_interpolation + + rule %r/"/, Str::Double, :root + rule %r/\\[()#" \\$@^trn;]/, Str::Escape + + mixin :default + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cmhg.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cmhg.rb new file mode 100644 index 000000000000..338a3faec9e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cmhg.rb @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class CMHG < RegexLexer + title "CMHG" + desc "RISC OS C module header generator source file" + tag 'cmhg' + filenames '*.cmhg' + + def self.preproc_keyword + @preproc_keyword ||= %w( + define elif else endif error if ifdef ifndef include line pragma undef warning + ) + end + + state :root do + rule %r/;[^\n]*/, Comment + rule %r/^([ \t]*)(#[ \t]*(?:(?:#{CMHG.preproc_keyword.join('|')})(?:[ \t].*)?)?)(?=\n)/ do + groups Text, Comment::Preproc + end + rule %r/[-a-z]+:/, Keyword::Declaration + rule %r/[a-z_]\w+/i, Name::Entity + rule %r/"[^"]*"/, Literal::String + rule %r/(?:&|0x)\h+/, Literal::Number::Hex + rule %r/\d+/, Literal::Number + rule %r/[,\/()]/, Punctuation + rule %r/[ \t]+/, Text + rule %r/\n+/, Text + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/coffeescript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/coffeescript.rb new file mode 100644 index 000000000000..032943b93197 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/coffeescript.rb @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Coffeescript < RegexLexer + tag 'coffeescript' + aliases 'coffee', 'coffee-script' + filenames '*.coffee', 'Cakefile' + mimetypes 'text/coffeescript' + + title "CoffeeScript" + desc 'The Coffeescript programming language (coffeescript.org)' + + def self.detect?(text) + return true if text.shebang? 'coffee' + end + + def self.keywords + @keywords ||= Set.new %w( + for by while until loop break continue return + switch when then if else do yield throw try catch finally await + new delete typeof instanceof super extends this class + import export debugger + ) + end + + def self.reserved + @reserved ||= Set.new %w( + case function var void with const let enum + native implements interface package private protected public static + ) + end + + def self.constants + @constants ||= Set.new %w( + true false yes no on off null NaN Infinity undefined + ) + end + + def self.builtins + @builtins ||= Set.new %w( + Array Boolean Date Error Function Math netscape Number Object + Packages RegExp String sun decodeURI decodeURIComponent + encodeURI encodeURIComponent eval isFinite isNaN parseFloat + parseInt document window + ) + end + + id = /[$a-zA-Z_][a-zA-Z0-9_]*/ + + state :comments do + rule %r/###[^#].*?###/m, Comment::Multiline + rule %r/#.*$/, Comment::Single + end + + state :whitespace do + rule %r/\s+/m, Text + end + + state :regex_comment do + rule %r/^#(?!\{).*$/, Comment::Single + rule %r/(\s+)(#(?!\{).*)$/ do + groups Text, Comment::Single + end + end + + state :multiline_regex_begin do + rule %r(///) do + token Str::Regex + goto :multiline_regex + end + end + + state :multiline_regex_end do + rule %r(///([gimy]+\b|\B)), Str::Regex, :pop! + end + + state :multiline_regex do + mixin :multiline_regex_end + mixin :regex_comment + mixin :has_interpolation + mixin :comments + mixin :whitespace + mixin :code_escape + + rule %r/\\\D/, Str::Escape + rule %r/\\\d+/, Name::Variable + rule %r/./m, Str::Regex + end + + state :slash_starts_regex do + mixin :comments + mixin :whitespace + mixin :multiline_regex_begin + + rule %r( + /(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/ # a regex + ([gimy]+\b|\B) + )x, Str::Regex, :pop! + + rule(//) { pop! } + end + + state :root do + rule(%r(^(?=\s|/|<!--))) { push :slash_starts_regex } + mixin :comments + mixin :whitespace + + rule %r( + [+][+]|--|~|&&|\band\b|\bor\b|\bis\b|\bisnt\b|\bnot\b|\bin\b|\bof\b| + [?]|:|=|[|][|]|\\(?=\n)|(<<|>>>?|==?|!=?|[-<>+*`%&|^/])=? + )x, Operator, :slash_starts_regex + + rule %r/[-=]>/, Name::Function + + rule %r/(@)([ \t]*)(#{id})/ do + groups Name::Variable::Instance, Text, Name::Attribute + push :slash_starts_regex + end + + rule %r/([.])([ \t]*)(#{id})/ do + groups Punctuation, Text, Name::Attribute + push :slash_starts_regex + end + + rule %r/#{id}(?=\s*:)/, Name::Attribute, :slash_starts_regex + + rule %r/#{id}/ do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.constants.include? m[0] + token Name::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Other + end + + push :slash_starts_regex + end + + rule %r/[{(\[;,]/, Punctuation, :slash_starts_regex + rule %r/[})\].]/, Punctuation + + rule %r/\d+[.]\d+([eE]\d+)?[fd]?/, Num::Float + rule %r/0x[0-9a-fA-F]+/, Num::Hex + rule %r/\d+/, Num::Integer + rule %r/"""/, Str, :tdqs + rule %r/'''/, Str, :tsqs + rule %r/"/, Str, :dqs + rule %r/'/, Str, :sqs + end + + state :code_escape do + rule %r(\\( + c[A-Z]| + x[0-9a-fA-F]{2}| + u[0-9a-fA-F]{4}| + u\{[0-9a-fA-F]{4}\} + ))x, Str::Escape + end + + state :strings do + # all coffeescript strings are multi-line + rule %r/[^#\\'"]+/m, Str + mixin :code_escape + rule %r/\\./, Str::Escape + rule %r/#/, Str + end + + state :double_strings do + rule %r/'/, Str + mixin :has_interpolation + mixin :strings + end + + state :single_strings do + rule %r/"/, Str + mixin :strings + end + + state :interpolation do + rule %r/}/, Str::Interpol, :pop! + mixin :root + end + + state :has_interpolation do + rule %r/[#][{]/, Str::Interpol, :interpolation + end + + state :dqs do + rule %r/"/, Str, :pop! + mixin :double_strings + end + + state :tdqs do + rule %r/"""/, Str, :pop! + rule %r/"/, Str + mixin :double_strings + end + + state :sqs do + rule %r/'/, Str, :pop! + mixin :single_strings + end + + state :tsqs do + rule %r/'''/, Str, :pop! + rule %r/'/, Str + mixin :single_strings + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/common_lisp.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/common_lisp.rb new file mode 100644 index 000000000000..bd779ef6bc80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/common_lisp.rb @@ -0,0 +1,346 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class CommonLisp < RegexLexer + title "Common Lisp" + desc "The Common Lisp variant of Lisp (common-lisp.net)" + tag 'common_lisp' + aliases 'cl', 'common-lisp', 'elisp', 'emacs-lisp', 'lisp' + + filenames '*.cl', '*.lisp', '*.asd', '*.el' # used for Elisp too + mimetypes 'text/x-common-lisp' + + # 638 functions + BUILTIN_FUNCTIONS = Set.new %w( + < <= = > >= - / /= * + 1- 1+ abort abs acons acos acosh add-method + adjoin adjustable-array-p adjust-array allocate-instance + alpha-char-p alphanumericp append apply apropos apropos-list + aref arithmetic-error-operands arithmetic-error-operation + array-dimension array-dimensions array-displacement + array-element-type array-has-fill-pointer-p array-in-bounds-p + arrayp array-rank array-row-major-index array-total-size + ash asin asinh assoc assoc-if assoc-if-not atan atanh atom + bit bit-and bit-andc1 bit-andc2 bit-eqv bit-ior bit-nand + bit-nor bit-not bit-orc1 bit-orc2 bit-vector-p bit-xor boole + both-case-p boundp break broadcast-stream-streams butlast + byte byte-position byte-size caaaar caaadr caaar caadar + caaddr caadr caar cadaar cadadr cadar caddar cadddr caddr + cadr call-next-method car cdaaar cdaadr cdaar cdadar cdaddr + cdadr cdar cddaar cddadr cddar cdddar cddddr cdddr cddr cdr + ceiling cell-error-name cerror change-class char char< char<= + char= char> char>= char/= character characterp char-code + char-downcase char-equal char-greaterp char-int char-lessp + char-name char-not-equal char-not-greaterp char-not-lessp + char-upcase cis class-name class-of clear-input clear-output + close clrhash code-char coerce compile compiled-function-p + compile-file compile-file-pathname compiler-macro-function + complement complex complexp compute-applicable-methods + compute-restarts concatenate concatenated-stream-streams conjugate + cons consp constantly constantp continue copy-alist copy-list + copy-pprint-dispatch copy-readtable copy-seq copy-structure + copy-symbol copy-tree cos cosh count count-if count-if-not + decode-float decode-universal-time delete delete-duplicates + delete-file delete-if delete-if-not delete-package denominator + deposit-field describe describe-object digit-char digit-char-p + directory directory-namestring disassemble documentation dpb + dribble echo-stream-input-stream echo-stream-output-stream + ed eighth elt encode-universal-time endp enough-namestring + ensure-directories-exist ensure-generic-function eq + eql equal equalp error eval evenp every exp export expt + fboundp fceiling fdefinition ffloor fifth file-author + file-error-pathname file-length file-namestring file-position + file-string-length file-write-date fill fill-pointer find + find-all-symbols find-class find-if find-if-not find-method + find-package find-restart find-symbol finish-output first + float float-digits floatp float-precision float-radix + float-sign floor fmakunbound force-output format fourth + fresh-line fround ftruncate funcall function-keywords + function-lambda-expression functionp gcd gensym gentemp get + get-decoded-time get-dispatch-macro-character getf gethash + get-internal-real-time get-internal-run-time get-macro-character + get-output-stream-string get-properties get-setf-expansion + get-universal-time graphic-char-p hash-table-count hash-table-p + hash-table-rehash-size hash-table-rehash-threshold + hash-table-size hash-table-test host-namestring identity + imagpart import initialize-instance input-stream-p inspect + integer-decode-float integer-length integerp interactive-stream-p + intern intersection invalid-method-error invoke-debugger + invoke-restart invoke-restart-interactively isqrt keywordp + last lcm ldb ldb-test ldiff length lisp-implementation-type + lisp-implementation-version list list* list-all-packages listen + list-length listp load load-logical-pathname-translations + log logand logandc1 logandc2 logbitp logcount logeqv + logical-pathname logical-pathname-translations logior + lognand lognor lognot logorc1 logorc2 logtest logxor + long-site-name lower-case-p machine-instance machine-type + machine-version macroexpand macroexpand-1 macro-function + make-array make-broadcast-stream make-concatenated-stream + make-condition make-dispatch-macro-character make-echo-stream + make-hash-table make-instance make-instances-obsolete make-list + make-load-form make-load-form-saving-slots make-package + make-pathname make-random-state make-sequence make-string + make-string-input-stream make-string-output-stream make-symbol + make-synonym-stream make-two-way-stream makunbound map mapc + mapcan mapcar mapcon maphash map-into mapl maplist mask-field + max member member-if member-if-not merge merge-pathnames + method-combination-error method-qualifiers min minusp mismatch mod + muffle-warning name-char namestring nbutlast nconc next-method-p + nintersection ninth no-applicable-method no-next-method not notany + notevery nreconc nreverse nset-difference nset-exclusive-or + nstring-capitalize nstring-downcase nstring-upcase nsublis + nsubst nsubst-if nsubst-if-not nsubstitute nsubstitute-if + nsubstitute-if-not nth nthcdr null numberp numerator nunion + oddp open open-stream-p output-stream-p package-error-package + package-name package-nicknames packagep package-shadowing-symbols + package-used-by-list package-use-list pairlis parse-integer + parse-namestring pathname pathname-device pathname-directory + pathname-host pathname-match-p pathname-name pathnamep + pathname-type pathname-version peek-char phase plusp + position position-if position-if-not pprint pprint-dispatch + pprint-fill pprint-indent pprint-linear pprint-newline pprint-tab + pprint-tabular prin1 prin1-to-string princ princ-to-string print + print-object probe-file proclaim provide random random-state-p + rassoc rassoc-if rassoc-if-not rational rationalize rationalp + read read-byte read-char read-char-no-hang read-delimited-list + read-from-string read-line read-preserving-whitespace + read-sequence readtable-case readtablep realp realpart + reduce reinitialize-instance rem remhash remove + remove-duplicates remove-if remove-if-not remove-method + remprop rename-file rename-package replace require rest + restart-name revappend reverse room round row-major-aref + rplaca rplacd sbit scale-float schar search second set + set-difference set-dispatch-macro-character set-exclusive-or + set-macro-character set-pprint-dispatch set-syntax-from-char + seventh shadow shadowing-import shared-initialize + short-site-name signal signum simple-bit-vector-p + simple-condition-format-arguments simple-condition-format-control + simple-string-p simple-vector-p sin sinh sixth sleep slot-boundp + slot-exists-p slot-makunbound slot-missing slot-unbound slot-value + software-type software-version some sort special-operator-p + sqrt stable-sort standard-char-p store-value stream-element-type + stream-error-stream stream-external-format streamp string string< + string<= string= string> string>= string/= string-capitalize + string-downcase string-equal string-greaterp string-left-trim + string-lessp string-not-equal string-not-greaterp string-not-lessp + stringp string-right-trim string-trim string-upcase sublis subseq + subsetp subst subst-if subst-if-not substitute substitute-if + substitute-if-not subtypepsvref sxhash symbol-function + symbol-name symbolp symbol-package symbol-plist symbol-value + synonym-stream-symbol syntax: tailp tan tanh tenth terpri third + translate-logical-pathname translate-pathname tree-equal truename + truncate two-way-stream-input-stream two-way-stream-output-stream + type-error-datum type-error-expected-type type-of + typep unbound-slot-instance unexport unintern union + unread-char unuse-package update-instance-for-different-class + update-instance-for-redefined-class upgraded-array-element-type + upgraded-complex-part-type upper-case-p use-package + user-homedir-pathname use-value values values-list vector vectorp + vector-pop vector-push vector-push-extend warn wild-pathname-p + write write-byte write-char write-line write-sequence write-string + write-to-string yes-or-no-p y-or-n-p zerop + ).freeze + + SPECIAL_FORMS = Set.new %w( + block catch declare eval-when flet function go if labels lambda + let let* load-time-value locally macrolet multiple-value-call + multiple-value-prog1 progn progv quote return-from setq + symbol-macrolet tagbody the throw unwind-protect + ) + + MACROS = Set.new %w( + and assert call-method case ccase check-type cond ctypecase decf + declaim defclass defconstant defgeneric define-compiler-macro + define-condition define-method-combination define-modify-macro + define-setf-expander define-symbol-macro defmacro defmethod + defpackage defparameter defsetf defstruct defsystem deftype defun defvar + destructuring-bind do do* do-all-symbols do-external-symbols + dolist do-symbols dotimes ecase etypecase formatter + handler-bind handler-case ignore-errors incf in-package + lambda loop loop-finish make-method multiple-value-bind + multiple-value-list multiple-value-setq nth-value or pop + pprint-exit-if-list-exhausted pprint-logical-block pprint-pop + print-unreadable-object prog prog* prog1 prog2 psetf psetq + push pushnew remf restart-bind restart-case return rotatef + setf shiftf step time trace typecase unless untrace when + with-accessors with-compilation-unit with-condition-restarts + with-hash-table-iterator with-input-from-string with-open-file + with-open-stream with-output-to-string with-package-iterator + with-simple-restart with-slots with-standard-io-syntax + ) + + LAMBDA_LIST_KEYWORDS = Set.new %w( + &allow-other-keys &aux &body &environment &key &optional &rest + &whole + ) + + DECLARATIONS = Set.new %w( + dynamic-extent ignore optimize ftype inline special ignorable + notinline type + ) + + BUILTIN_TYPES = Set.new %w( + atom boolean base-char base-string bignum bit compiled-function + extended-char fixnum keyword nil signed-byte short-float + single-float double-float long-float simple-array + simple-base-string simple-bit-vector simple-string simple-vector + standard-char unsigned-byte + + arithmetic-error cell-error condition control-error + division-by-zero end-of-file error file-error + floating-point-inexact floating-point-overflow + floating-point-underflow floating-point-invalid-operation + parse-error package-error print-not-readable program-error + reader-error serious-condition simple-condition simple-error + simple-type-error simple-warning stream-error storage-condition + style-warning type-error unbound-variable unbound-slot + undefined-function warning + ) + + BUILTIN_CLASSES = Set.new %w( + array broadcast-stream bit-vector built-in-class character + class complex concatenated-stream cons echo-stream file-stream + float function generic-function hash-table integer list + logical-pathname method-combination method null number package + pathname ratio rational readtable real random-state restart + sequence standard-class standard-generic-function standard-method + standard-object string-stream stream string structure-class + structure-object symbol synonym-stream t two-way-stream vector + ) + + nonmacro = /\\.|[a-zA-Z0-9!$%&*+-\/<=>?@\[\]^_{}~]/ + constituent = /#{nonmacro}|[#.:]/ + terminated = /(?=[ "'()\n,;`])/ # whitespace or terminating macro chars + symbol = /(\|[^\|]+\||#{nonmacro}#{constituent}*)/ + + state :root do + rule %r/\s+/m, Text + rule %r/;.*$/, Comment::Single + rule %r/#\|/, Comment::Multiline, :multiline_comment + + # encoding comment + rule %r/#\d*Y.*$/, Comment::Special + rule %r/"(\\.|[^"\\])*"/, Str + + rule %r/[:']#{symbol}/, Str::Symbol + rule %r/['`]/, Operator + + # numbers + rule %r/[-+]?\d+\.?#{terminated}/, Num::Integer + rule %r([-+]?\d+/\d+#{terminated}), Num::Integer + rule %r( + [-+]? + (\d*\.\d+([defls][-+]?\d+)? + |\d+(\.\d*)?[defls][-+]?\d+) + #{terminated} + )x, Num::Float + + # sharpsign strings and characters + rule %r/#\\.#{terminated}/, Str::Char + rule %r/#\\#{symbol}/, Str::Char + + rule %r/#\(/, Operator, :root + + # bitstring + rule %r/#\d*\*[01]*/, Other + + # uninterned symbol + rule %r/#:#{symbol}/, Str::Symbol + + # read-time and load-time evaluation + rule %r/#[.,]/, Operator + + # function shorthand + rule %r/#'/, Name::Function + + # binary rational + rule %r/#b[+-]?[01]+(\/[01]+)?/i, Num + + # octal rational + rule %r/#o[+-]?[0-7]+(\/[0-7]+)?/i, Num::Oct + + # hex rational + rule %r/#x[+-]?[0-9a-f]+(\/[0-9a-f]+)?/i, Num + + # complex + rule %r/(#c)(\()/i do + groups Num, Punctuation + push :root + end + + # arrays and structures + rule %r/(#(?:\d+a|s))(\()/i do + groups Str::Other, Punctuation + push :root + end + + # path + rule %r/#p?"(\\.|[^"])*"/i, Str::Symbol + + # reference + rule %r/#\d+[=#]/, Operator + + # read-time comment + rule %r/#+nil#{terminated}\s*\(/, Comment, :commented_form + + # read-time conditional + rule %r/#[+-]/, Operator + + # special operators that should have been parsed already + rule %r/(,@|,|\.)/, Operator + + # special constants + rule %r/(t|nil)#{terminated}/, Name::Constant + + # functions and variables + # note that these get filtered through in stream_tokens + rule %r/\*#{symbol}\*/, Name::Variable::Global + rule symbol do |m| + sym = m[0] + + if BUILTIN_FUNCTIONS.include? sym + token Name::Builtin + elsif SPECIAL_FORMS.include? sym + token Keyword + elsif MACROS.include? sym + token Name::Builtin + elsif LAMBDA_LIST_KEYWORDS.include? sym + token Keyword + elsif DECLARATIONS.include? sym + token Keyword + elsif BUILTIN_TYPES.include? sym + token Keyword::Type + elsif BUILTIN_CLASSES.include? sym + token Name::Class + else + token Name::Variable + end + end + + rule %r/\(/, Punctuation, :root + rule %r/\)/, Punctuation do + if stack.size == 1 + token Error + else + token Punctuation + pop! + end + end + end + + state :multiline_comment do + rule %r/#\|/, Comment::Multiline, :multiline_comment + rule %r/\|#/, Comment::Multiline, :pop! + rule %r/[^\|#]+/, Comment::Multiline + rule %r/[\|#]/, Comment::Multiline + end + + state :commented_form do + rule %r/\(/, Comment, :commented_form + rule %r/\)/, Comment, :pop! + rule %r/[^()]+/, Comment + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/conf.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/conf.rb new file mode 100644 index 000000000000..79a0f92d4c83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/conf.rb @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Conf < RegexLexer + tag 'conf' + aliases 'config', 'configuration' + + title "Config File" + desc 'A generic lexer for configuration files' + filenames '*.conf', '*.config' + + # short and sweet + state :root do + rule %r/#.*?\n/, Comment + rule %r/".*?"/, Str::Double + rule %r/'.*?'/, Str::Single + rule %r/[a-z]\w*/i, Name + rule %r/\d+/, Num + rule %r/[^\w#"']+/, Text + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/console.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/console.rb new file mode 100644 index 000000000000..effa51c9234c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/console.rb @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + # The {ConsoleLexer} class is intended to lex content that represents the + # text that would display in a console/terminal. As distinct from the + # {Shell} lexer, {ConsoleLexer} will try to parse out the prompt from each + # line before passing the remainder of the line to the language lexer for + # the shell (by default, the {Shell} lexer). + # + # The {ConsoleLexer} class accepts five options: + # 1. **lang**: the shell language to lex (default: `shell`); + # 2. **output**: the output language (default: `plaintext?token=Generic.Output`); + # 3. **prompt**: comma-separated list of strings that indicate the end of a + # prompt (default: `$,#,>,;`); + # 4. **comments**: whether to enable comments. + # 5. **error**: comma-separated list of strings that indicate the start of an + # error message + # + # The comments option, if enabled, will lex lines that begin with a `#` as a + # comment. Please note that this option will only work if the prompt is + # either not manually specified or, if manually specified, does not include + # the `#` character. + # + # Most Markdown lexers that recognise GitHub-Flavored Markdown syntax, will + # pass the language string to Rouge as written in the original document. + # This allows an end user to pass options to {ConsoleLexer} by passing them + # as CGI-style parameters as in the example below. + # + # @example + # <pre>Here's some regular text. + # + # ```console?comments=true + # # This is a comment + # $ cp foo bar + # ``` + # + # Some more regular text.</pre> + class ConsoleLexer < Lexer + tag 'console' + aliases 'terminal', 'shell_session', 'shell-session' + filenames '*.cap' + desc 'A generic lexer for shell sessions. Accepts ?lang and ?output lexer options, a ?prompt option, ?comments to enable # comments, and ?error to handle error messages.' + + option :lang, 'the shell language to lex (default: shell)' + option :output, 'the output language (default: plaintext?token=Generic.Output)' + option :prompt, 'comma-separated list of strings that indicate the end of a prompt. (default: $,#,>,;)' + option :comments, 'enable hash-comments at the start of a line - otherwise interpreted as a prompt. (default: false, implied by ?prompt not containing `#`)' + option :error, 'comma-separated list of strings that indicate the start of an error message' + + def initialize(*) + super + @prompt = list_option(:prompt) { nil } + @lang = lexer_option(:lang) { 'shell' } + @output = lexer_option(:output) { PlainText.new(token: Generic::Output) } + @comments = bool_option(:comments) { :guess } + @error = list_option(:error) { nil } + end + + # whether to allow comments. if manually specifying a prompt that isn't + # simply "#", we flag this to on + def allow_comments? + case @comments + when :guess + @prompt && !@prompt.empty? && !end_chars.include?('#') + else + @comments + end + end + + def comment_regex + /\A\s*?#/ + end + + def end_chars + @end_chars ||= if @prompt.any? + @prompt.reject { |c| c.empty? } + elsif allow_comments? + %w($ > ;) + else + %w($ # > ;) + end + end + + def error_regex + @error_regex ||= if @error.any? + /^(?:#{@error.map(&Regexp.method(:escape)).join('|')})/ + end + end + + def lang_lexer + @lang_lexer ||= case @lang + when Lexer + @lang + when nil + Shell.new(options) + when Class + @lang.new(options) + when String + Lexer.find(@lang).new(options) + end + end + + def line_regex + /(\\.|[^\\])*?(\n|$)/m + end + + def output_lexer + @output_lexer ||= case @output + when nil + PlainText.new(token: Generic::Output) + when Lexer + @output + when Class + @output.new(options) + when String + Lexer.find(@output).new(options) + end + end + + def process_line(input, &output) + input.scan(line_regex) + + # As a nicety, support the use of elisions in input text. A user can + # write a line with only `<...>` or one or more `.` characters and + # Rouge will treat it as a comment. + if input[0] =~ /\A\s*(?:<[.]+>|[.]+)\s*\z/ + puts "console: matched snip #{input[0].inspect}" if @debug + output_lexer.reset! + lang_lexer.reset! + + yield Comment, input[0] + elsif prompt_regex =~ input[0] + puts "console: matched prompt #{input[0].inspect}" if @debug + output_lexer.reset! + + yield Generic::Prompt, $& + + # make sure to take care of initial whitespace + # before we pass to the lang lexer so it can determine where + # the "real" beginning of the line is + $' =~ /\A\s*/ + yield Text::Whitespace, $& unless $&.empty? + + lang_lexer.continue_lex($', &output) + elsif comment_regex =~ input[0].strip + puts "console: matched comment #{input[0].inspect}" if @debug + output_lexer.reset! + lang_lexer.reset! + + yield Comment, input[0] + elsif error_regex =~ input[0] + puts "console: matched error #{input[0].inspect}" if @debug + output_lexer.reset! + lang_lexer.reset! + + yield Generic::Error, input[0] + else + puts "console: matched output #{input[0].inspect}" if @debug + lang_lexer.reset! + + output_lexer.continue_lex(input[0], &output) + end + end + + def prompt_prefix_regex + if allow_comments? + /[^<#]*?/m + else + /.*?/m + end + end + + def prompt_regex + @prompt_regex ||= begin + /^#{prompt_prefix_regex}(?:#{end_chars.map(&Regexp.method(:escape)).join('|')})/ + end + end + + def stream_tokens(input, &output) + input = StringScanner.new(input) + lang_lexer.reset! + output_lexer.reset! + + process_line(input, &output) while !input.eos? + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/coq.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/coq.rb new file mode 100644 index 000000000000..d414e1261207 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/coq.rb @@ -0,0 +1,191 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Coq < RegexLexer + title "Coq" + desc 'Coq (coq.inria.fr)' + tag 'coq' + mimetypes 'text/x-coq' + + def self.gallina + @gallina ||= Set.new %w( + as fun if in let match then else return end Type Set Prop + forall + ) + end + + def self.coq + @coq ||= Set.new %w( + Definition Theorem Lemma Remark Example Fixpoint CoFixpoint + Record Inductive CoInductive Corollary Goal Proof + Ltac Require Import Export Module Section End Variable + Context Polymorphic Monomorphic Universe Universes + Variables Class Instance Global Local Include + Printing Notation Infix Arguments Hint Rewrite Immediate + Qed Defined Opaque Transparent Existing + Compute Eval Print SearchAbout Search About Check + ) + end + + def self.ltac + @ltac ||= Set.new %w( + apply eapply auto eauto rewrite setoid_rewrite + with in as at destruct split inversion injection + intro intros unfold fold cbv cbn lazy subst + clear symmetry transitivity etransitivity erewrite + edestruct constructor econstructor eexists exists + f_equal refine instantiate revert simpl + specialize generalize dependent red induction + beta iota zeta delta exfalso autorewrite setoid_rewrite + compute vm_compute native_compute + ) + end + + def self.tacticals + @tacticals ||= Set.new %w( + repeat first try + ) + end + + def self.terminators + @terminators ||= Set.new %w( + omega solve congruence reflexivity exact + assumption eassumption + ) + end + + def self.keyopts + @keyopts ||= Set.new %w( + := => -> /\\ \\/ _ ; :> : ⇒ → ↔ ⇔ ≔ ≡ ∀ ∃ ∧ ∨ ¬ ⊤ ⊥ ⊢ ⊨ ∈ + ) + end + + def self.end_sentence + @end_sentence ||= Punctuation::Indicator + end + + def self.classify(x) + if self.coq.include? x + return Keyword + elsif self.gallina.include? x + return Keyword::Reserved + elsif self.ltac.include? x + return Keyword::Pseudo + elsif self.terminators.include? x + return Name::Exception + elsif self.tacticals.include? x + return Keyword::Pseudo + else + return Name::Constant + end + end + + operator = %r([\[\];,{}_()!$%&*+./:<=>?@^|~#-]+) + id = /(?:[a-z][\w']*)|(?:[_a-z][\w']+)/i + dot_id = /\.((?:[a-z][\w']*)|(?:[_a-z][\w']+))/i + dot_space = /\.(\s+)/ + module_type = /Module(\s+)Type(\s+)/ + set_options = /(Set|Unset)(\s+)(Universe|Printing|Implicit|Strict)(\s+)(Polymorphism|All|Notations|Arguments|Universes|Implicit)(\s*)\./m + + state :root do + rule %r/[(][*](?![)])/, Comment, :comment + rule %r/\s+/m, Text::Whitespace + rule module_type do |m| + token Keyword , 'Module' + token Text::Whitespace , m[1] + token Keyword , 'Type' + token Text::Whitespace , m[2] + end + rule set_options do |m| + token Keyword , m[1] + i = 2 + while m[i] != '' + token Text::Whitespace , m[i] + token Keyword , m[i+1] + i += 2 + end + token self.class.end_sentence , '.' + end + rule id do |m| + @name = m[0] + @continue = false + push :continue_id + end + rule %r(/\\), Operator + rule %r/\\\//, Operator + + rule %r/-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float + rule %r/\d[\d_]*/, Num::Integer + + rule %r/'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char + rule %r/'/, Keyword + rule %r/"/, Str::Double, :string + rule %r/[~?]#{id}/, Name::Variable + + rule %r/./ do |m| + match = m[0] + if self.class.keyopts.include? match + token Punctuation + elsif match =~ operator + token Operator + else + token Error + end + end + end + + state :comment do + rule %r/[^(*)]+/, Comment + rule(/[(][*]/) { token Comment; push } + rule %r/[*][)]/, Comment, :pop! + rule %r/[(*)]/, Comment + end + + state :string do + rule %r/(?:\\")+|[^"]/, Str::Double + mixin :escape_sequence + rule %r/\\\n/, Str::Double + rule %r/"/, Str::Double, :pop! + end + + state :escape_sequence do + rule %r/\\[\\"'ntbr]/, Str::Escape + end + + state :continue_id do + # the stream starts with an id (stored in @name) and continues here + rule dot_id do |m| + token Name::Namespace , @name + token Punctuation , '.' + @continue = true + @name = m[1] + end + rule dot_space do |m| + if @continue + token Name::Constant , @name + else + token self.class.classify(@name) , @name + end + token self.class.end_sentence , '.' + token Text::Whitespace , m[1] + @name = false + @continue = false + pop! + end + rule %r// do + if @continue + token Name::Constant , @name + else + token self.class.classify(@name) , @name + end + @name = false + @continue = false + pop! + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cpp.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cpp.rb new file mode 100644 index 000000000000..0181efaf122a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cpp.rb @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'c.rb' + + class Cpp < C + title "C++" + desc "The C++ programming language" + + tag 'cpp' + aliases 'c++' + # the many varied filenames of c++ source files... + filenames '*.cpp', '*.hpp', + '*.c++', '*.h++', + '*.cc', '*.hh', + '*.cxx', '*.hxx', + '*.pde', '*.ino', + '*.tpp', '*.h' + mimetypes 'text/x-c++hdr', 'text/x-c++src' + + def self.keywords + @keywords ||= super + Set.new(%w( + asm auto catch const_cast delete dynamic_cast explicit export friend + mutable namespace new operator private protected public + reinterpret_cast restrict size_of static_cast this throw throws + typeid typename using virtual final override + + alignas alignof constexpr decltype noexcept static_assert + thread_local try + )) + end + + def self.keywords_type + @keywords_type ||= super + Set.new(%w( + bool + )) + end + + def self.reserved + @reserved ||= super + Set.new(%w( + __virtual_inheritance __uuidof __super __single_inheritance + __multiple_inheritance __interface __event + )) + end + + id = /[a-zA-Z_][a-zA-Z0-9_]*/ + + prepend :root do + # Offload C++ extensions, http://offload.codeplay.com/ + rule %r/(?:__offload|__blockingoffload|__outer)\b/, Keyword::Pseudo + end + + # digits with optional inner quotes + # see www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3781.pdf + dq = /\d('?\d)*/ + + prepend :statements do + rule %r/(class|struct)\b/, Keyword, :classname + rule %r/template\b/, Keyword, :template + rule %r/\d+(\.\d+)?(?:h|(?:min)|s|(?:ms)|(?:us)|(?:ns))/, Num::Other + rule %r((#{dq}[.]#{dq}?|[.]#{dq})(e[+-]?#{dq}[lu]*)?)i, Num::Float + rule %r(#{dq}e[+-]?#{dq}[lu]*)i, Num::Float + rule %r/0x\h('?\h)*[lu]*/i, Num::Hex + rule %r/0b[01]+('[01]+)*/, Num::Bin + rule %r/0[0-7]('?[0-7])*[lu]*/i, Num::Oct + rule %r/#{dq}[lu]*/i, Num::Integer + rule %r/\bnullptr\b/, Name::Builtin + rule %r/(?:u8|u|U|L)?R"([a-zA-Z0-9_{}\[\]#<>%:;.?*\+\-\/\^&|~!=,"']{,16})\(.*?\)\1"/m, Str + rule %r/::/, Operator + end + + state :classname do + rule id, Name::Class, :pop! + + # template specification + mixin :whitespace + rule %r/[.]{3}/, Operator + rule %r/,/, Punctuation, :pop! + rule(//) { pop! } + end + + state :template do + rule %r/[>;]/, Punctuation, :pop! + rule %r/typename\b/, Keyword, :classname + mixin :statements + end + + state :case do + rule %r/:(?!:)/, Punctuation, :pop! + mixin :statements + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/crystal.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/crystal.rb new file mode 100644 index 000000000000..603b4ecca264 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/crystal.rb @@ -0,0 +1,435 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Crystal < RegexLexer + title "Crystal" + desc "Crystal The Programming Language (crystal-lang.org)" + tag 'crystal' + aliases 'cr' + filenames '*.cr' + + mimetypes 'text/x-crystal', 'application/x-crystal' + + def self.detect?(text) + return true if text.shebang? 'crystal' + end + + state :symbols do + # symbols + rule %r( + : # initial : + @{0,2} # optional ivar, for :@foo and :@@foo + [a-z_]\w*[!?]? # the symbol + )xi, Str::Symbol + + # special symbols + rule %r(:(?:===|=?~|\[\][=?]?|\*\*=?|\/\/=?|[=^*/+-]=?|&[&*+-]?=?|\|\|?=?|![=~]?|%=?|<=>|<<?=?|>>?=?|\.\.\.?)), Str::Symbol + + rule %r/:'(\\\\|\\'|[^'])*'/, Str::Symbol + rule %r/:"/, Str::Symbol, :simple_sym + end + + state :sigil_strings do + # %-sigiled strings + # %(abc), %[abc], %<abc>, %.abc., %r.abc., etc + delimiter_map = { '{' => '}', '[' => ']', '(' => ')', '<' => '>' } + rule %r/%([rqswQWxiI])?([^\w\s}])/ do |m| + open = Regexp.escape(m[2]) + close = Regexp.escape(delimiter_map[m[2]] || m[2]) + interp = /[rQWxI]/ === m[1] + toktype = Str::Other + + puts " open: #{open.inspect}" if @debug + puts " close: #{close.inspect}" if @debug + + # regexes + if m[1] == 'r' + toktype = Str::Regex + push :regex_flags + end + + token toktype + + push do + rule %r/\\[##{open}#{close}\\]/, Str::Escape + # nesting rules only with asymmetric delimiters + if open != close + rule %r/#{open}/ do + token toktype + push + end + end + rule %r/#{close}/, toktype, :pop! + + if interp + mixin :string_intp_escaped + rule %r/#/, toktype + else + rule %r/[\\#]/, toktype + end + + rule %r/[^##{open}#{close}\\]+/m, toktype + end + end + end + + state :strings do + mixin :symbols + rule %r/\b[a-z_]\w*?[?!]?:\s+/, Str::Symbol, :expr_start + rule %r/"/, Str::Double, :simple_string + rule %r/(?<!\.)`/, Str::Backtick, :simple_backtick + rule %r/(')(\\u[a-fA-F0-9]{4}|\\u\{[a-fA-F0-9]{1,6}\}|\\[abefnrtv])?(\\\\|\\'|[^'])*(')/ do + groups Str::Single, Str::Escape, Str::Single, Str::Single + end + end + + state :regex_flags do + rule %r/[mixounse]*/, Str::Regex, :pop! + end + + # double-quoted string and symbol + [[:string, Str::Double, '"'], + [:sym, Str::Symbol, '"'], + [:backtick, Str::Backtick, '`']].each do |name, tok, fin| + state :"simple_#{name}" do + mixin :string_intp_escaped + rule %r/[^\\#{fin}#]+/m, tok + rule %r/[\\#]/, tok + rule %r/#{fin}/, tok, :pop! + end + end + + keywords = %w( + BEGIN END alias begin break case defined\? do else elsif end + ensure for if ifdef in next redo rescue raise retry return super then + undef unless until when while yield lib fun type of as + ) + + keywords_pseudo = %w( + initialize new loop include extend raise attr_reader attr_writer + attr_accessor alias_method attr catch throw private module_function + public protected true false nil __FILE__ __LINE__ + getter getter? getter! property property? property! struct record + ) + + builtins_g = %w( + abort ancestors at_exit + caller catch chomp chop clone constants + display dup eval exec exit extend fail fork format freeze + getc gets global_variables gsub hash id included_modules + inspect instance_eval instance_method instance_methods + lambda loop method method_missing + methods module_eval name object_id open p print printf + proc putc puts raise rand + readline readlines require scan select self send + sleep split sprintf srand sub syscall system + test throw to_a to_s trap warn + ) + + builtins_q = %w( + eql equal include is_a iterator kind_of nil + ) + + builtins_b = %w(chomp chop exit gsub sub) + + start do + push :expr_start + @heredoc_queue = [] + end + + state :whitespace do + mixin :inline_whitespace + rule %r/\n\s*/m, Text, :expr_start + rule %r/#.*$/, Comment::Single + + rule %r(=begin\b.*?\n=end\b)m, Comment::Multiline + end + + state :inline_whitespace do + rule %r/[ \t\r]+/, Text + end + + state :root do + mixin :whitespace + rule %r/__END__/, Comment::Preproc, :end_part + + rule %r/0o[0-7]+(?:_[0-7]+)*/, Num::Oct + rule %r/0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex + rule %r/0b[01]+(?:_[01]+)*/, Num::Bin + rule %r/\d+\.\d+(e[\+\-]?\d+)?(_f32)?/i, Num::Float + rule %r/\d+(e[\+\-]?\d+)/i, Num::Float + rule %r/\d+_f32/i, Num::Float + rule %r/[\d]+(?:_\d+)*(_[iu]\d+)?/, Num::Integer + + rule %r/@\[([^\]]+)\]/, Name::Decorator + + # names + rule %r/@@[a-z_]\w*/i, Name::Variable::Class + rule %r/@[a-z_]\w*/i, Name::Variable::Instance + rule %r/\$\w+/, Name::Variable::Global + rule %r(\$[!@&`'+~=/\\,;.<>_*\$?:"]), Name::Variable::Global + rule %r/\$-[0adFiIlpvw]/, Name::Variable::Global + rule %r/::/, Operator + + mixin :strings + + rule %r/(?:#{keywords.join('|')})\b/, Keyword, :expr_start + rule %r/(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start + + rule %r( + (module) + (\s+) + ([a-zA-Z_][a-zA-Z0-9_]*(::[a-zA-Z_][a-zA-Z0-9_]*)*) + )x do + groups Keyword, Text, Name::Namespace + end + + rule %r/(def|macro\b)(\s*)/ do + groups Keyword, Text + push :funcname + end + + rule %r/(class\b)(\s*)/ do + groups Keyword, Text + push :classname + end + + rule %r/(?:#{builtins_q.join('|')})[?]/, Name::Builtin, :expr_start + rule %r/(?:#{builtins_b.join('|')})!/, Name::Builtin, :expr_start + rule %r/(?<!\.)(?:#{builtins_g.join('|')})\b/, + Name::Builtin, :method_call + + mixin :has_heredocs + + # `..` and `...` for ranges must have higher priority than `.` + # Otherwise, they will be parsed as :method_call + rule %r/\.{2,3}/, Operator, :expr_start + + rule %r/[A-Z][a-zA-Z0-9_]*/, Name::Constant, :method_call + rule %r/(\.|::)(\s*)([a-z_]\w*[!?]?|[*%&^`~+-\/\[<>=])/ do + groups Punctuation, Text, Name::Function + push :method_call + end + + rule %r/[a-zA-Z_]\w*[?!]/, Name, :expr_start + rule %r/[a-zA-Z_]\w*/, Name, :method_call + rule %r/\*\*|\/\/|>=|<=|<=>|<<?|>>?|=~|={3}|!~|&&?|\|\||\./, + Operator, :expr_start + rule %r/{%|%}/, Punctuation + rule %r/[-+\/*%=<>&!^|~]=?/, Operator, :expr_start + rule(/[?]/) { token Punctuation; push :ternary; push :expr_start } + rule %r<[\[({,:\\;/]>, Punctuation, :expr_start + rule %r<[\])}]>, Punctuation + end + + state :has_heredocs do + rule %r/(?<!\w)(<<[-~]?)(["`']?)([a-zA-Z_]\w*)(\2)/ do |m| + token Operator, m[1] + token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}" + @heredoc_queue << [['<<-', '<<~'].include?(m[1]), m[3]] + push :heredoc_queue unless state? :heredoc_queue + end + + rule %r/(<<[-~]?)(["'])(\2)/ do |m| + token Operator, m[1] + token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}" + @heredoc_queue << [['<<-', '<<~'].include?(m[1]), ''] + push :heredoc_queue unless state? :heredoc_queue + end + end + + state :heredoc_queue do + rule %r/(?=\n)/ do + goto :resolve_heredocs + end + + mixin :root + end + + state :resolve_heredocs do + mixin :string_intp_escaped + + rule %r/\n/, Str::Heredoc, :test_heredoc + rule %r/[#\\\n]/, Str::Heredoc + rule %r/[^#\\\n]+/, Str::Heredoc + end + + state :test_heredoc do + rule %r/[^#\\\n]*$/ do |m| + tolerant, heredoc_name = @heredoc_queue.first + check = tolerant ? m[0].strip : m[0].rstrip + + # check if we found the end of the heredoc + puts " end heredoc check #{check.inspect} = #{heredoc_name.inspect}" if @debug + if check == heredoc_name + @heredoc_queue.shift + # if there's no more, we're done looking. + pop! if @heredoc_queue.empty? + token Name::Constant + else + token Str::Heredoc + end + + pop! + end + + rule(//) { pop! } + end + + state :funcname do + rule %r/\s+/, Text + rule %r/\(/, Punctuation, :defexpr + rule %r( + (?:([a-zA-Z_]\w*)(\.))? + ( + [a-zA-Z_]\w*[!?]? | + \*\*? | [-+]@? | [/%&\|^`~] | \[\]=? | + <<? | >>? | <=>? | >= | ===? + ) + )x do |m| + puts "matches: #{[m[0], m[1], m[2], m[3]].inspect}" if @debug + groups Name::Class, Operator, Name::Function + pop! + end + + rule(//) { pop! } + end + + state :classname do + rule %r/\s+/, Text + rule %r/\(/ do + token Punctuation + push :defexpr + push :expr_start + end + + # class << expr + rule %r/<</ do + token Operator + goto :expr_start + end + + rule %r/[A-Z_]\w*/, Name::Class, :pop! + + rule(//) { pop! } + end + + state :ternary do + rule(/:(?!:)/) { token Punctuation; goto :expr_start } + + mixin :root + end + + state :defexpr do + rule %r/(\))(\.|::)?/ do + groups Punctuation, Operator + pop! + end + rule %r/\(/ do + token Punctuation + push :defexpr + push :expr_start + end + + mixin :root + end + + state :in_interp do + rule %r/}/, Str::Interpol, :pop! + mixin :root + end + + state :string_intp do + rule %r/[#][{]/, Str::Interpol, :in_interp + rule %r/#(@@?|\$)[a-z_]\w*/i, Str::Interpol + end + + state :string_intp_escaped do + mixin :string_intp + rule %r/\\([\\abefnrstv#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})/, + Str::Escape + rule %r/\\u([a-fA-F0-9]{4}|\{[^}]+\})/, Str::Escape + rule %r/\\./, Str::Escape + end + + state :method_call do + rule %r(/) do + token Operator + goto :expr_start + end + + rule(/(?=\n)/) { pop! } + + rule(//) { goto :method_call_spaced } + end + + state :method_call_spaced do + mixin :whitespace + + rule %r([%/]=) do + token Operator + goto :expr_start + end + + rule %r((/)(?=\S|\s*/)) do + token Str::Regex + goto :slash_regex + end + + mixin :sigil_strings + + rule(%r((?=\s*/))) { pop! } + + rule(/\s+/) { token Text; goto :expr_start } + rule(//) { pop! } + end + + state :expr_start do + mixin :inline_whitespace + + rule %r(/) do + token Str::Regex + goto :slash_regex + end + + # char operator. ?x evaulates to "x", unless there's a digit + # beforehand like x>=0?n[x]:"" + rule %r( + [?](\\[MC]-)* # modifiers + (\\([\\abefnrstv\#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S) + (?!\w) + )x, Str::Char, :pop! + + # special case for using a single space. Ruby demands that + # these be in a single line, otherwise it would make no sense. + rule %r/(\s*)(%[rqswQWxiI]? \S* )/ do + groups Text, Str::Other + pop! + end + + mixin :sigil_strings + + rule(//) { pop! } + end + + state :slash_regex do + mixin :string_intp + rule %r(\\\\), Str::Regex + rule %r(\\/), Str::Regex + rule %r([\\#]), Str::Regex + rule %r([^\\/#]+)m, Str::Regex + rule %r(/) do + token Str::Regex + goto :regex_flags + end + end + + state :end_part do + # eat up the rest of the stream as Comment::Preproc + rule %r/.+/m, Comment::Preproc, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/csharp.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/csharp.rb new file mode 100644 index 000000000000..cdb6ed31d190 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/csharp.rb @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class CSharp < RegexLexer + tag 'csharp' + aliases 'c#', 'cs' + filenames '*.cs' + mimetypes 'text/x-csharp' + + title "C#" + desc 'a multi-paradigm language targeting .NET' + + # TODO: support more of unicode + id = /@?[_a-z]\w*/i + + #Reserved Identifiers + #Contextual Keywords + #LINQ Query Expressions + keywords = %w( + abstract as base break case catch checked const continue + default delegate do else enum event explicit extern false + finally fixed for foreach goto if implicit in interface + internal is lock new null operator out override params private + protected public readonly ref return sealed sizeof stackalloc + static switch this throw true try typeof unchecked unsafe + virtual void volatile while + add alias async await get global partial remove set value where + yield nameof + ascending by descending equals from group in into join let on + orderby select + ) + + keywords_type = %w( + bool byte char decimal double dynamic float int long object + sbyte short string uint ulong ushort var + ) + + cpp_keywords = %w( + if endif else elif define undef line error warning region + endregion pragma + ) + + state :whitespace do + rule %r/\s+/m, Text + rule %r(//.*?$), Comment::Single + rule %r(/[*].*?[*]/)m, Comment::Multiline + end + + state :nest do + rule %r/{/, Punctuation, :nest + rule %r/}/, Punctuation, :pop! + mixin :root + end + + state :splice_string do + rule %r/\\./, Str + rule %r/{/, Punctuation, :nest + rule %r/"|\n/, Str, :pop! + rule %r/./, Str + end + + state :splice_literal do + rule %r/""/, Str + rule %r/{/, Punctuation, :nest + rule %r/"/, Str, :pop! + rule %r/./, Str + end + + state :root do + mixin :whitespace + + rule %r/[$]\s*"/, Str, :splice_string + rule %r/[$]@\s*"/, Str, :splice_literal + + rule %r/(<\[)\s*(#{id}:)?/, Keyword + rule %r/\]>/, Keyword + + rule %r/[~!%^&*()+=|\[\]{}:;,.<>\/?-]/, Punctuation + rule %r/@"(""|[^"])*"/m, Str + rule %r/"(\\.|.)*?["\n]/, Str + rule %r/'(\\.|.)'/, Str::Char + rule %r/0x[0-9a-f]+[lu]?/i, Num + rule %r( + [0-9] + ([.][0-9]*)? # decimal + (e[+-][0-9]+)? # exponent + [fldu]? # type + )ix, Num + rule %r/\b(?:class|struct|interface)\b/, Keyword, :class + rule %r/\b(?:namespace|using)\b/, Keyword, :namespace + rule %r/^#[ \t]*(#{cpp_keywords.join('|')})\b.*?\n/, + Comment::Preproc + rule %r/\b(#{keywords.join('|')})\b/, Keyword + rule %r/\b(#{keywords_type.join('|')})\b/, Keyword::Type + rule %r/#{id}(?=\s*[(])/, Name::Function + rule id, Name + end + + state :class do + mixin :whitespace + rule id, Name::Class, :pop! + end + + state :namespace do + mixin :whitespace + rule %r/(?=[(])/, Text, :pop! + rule %r/(#{id}|[.])+/, Name::Namespace, :pop! + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/css.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/css.rb new file mode 100644 index 000000000000..911045f110b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/css.rb @@ -0,0 +1,276 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class CSS < RegexLexer + title "CSS" + desc "Cascading Style Sheets, used to style web pages" + + tag 'css' + filenames '*.css' + mimetypes 'text/css' + + # Documentation: https://www.w3.org/TR/CSS21/syndata.html#characters + + identifier = /[\p{L}_-][\p{Word}\p{Cf}-]*/ + number = /-?(?:[0-9]+(\.[0-9]+)?|\.[0-9]+)/ + + def self.attributes + @attributes ||= Set.new %w( + align-content align-items align-self alignment-adjust + alignment-baseline all anchor-point animation + animation-delay animation-direction animation-duration + animation-fill-mode animation-iteration-count animation-name + animation-play-state animation-timing-function appearance + azimuth backface-visibility background background-attachment + background-clip background-color background-image + background-origin background-position background-repeat + background-size baseline-shift binding bleed bookmark-label + bookmark-level bookmark-state bookmark-target border + border-bottom border-bottom-color border-bottom-left-radius + border-bottom-right-radius border-bottom-style + border-bottom-width border-collapse border-color + border-image border-image-outset border-image-repeat + border-image-slice border-image-source border-image-width + border-left border-left-color border-left-style + border-left-width border-radius border-right + border-right-color border-right-style border-right-width + border-spacing border-style border-top border-top-color + border-top-left-radius border-top-right-radius + border-top-style border-top-width border-width bottom + box-align box-decoration-break box-direction box-flex + box-flex-group box-lines box-ordinal-group box-orient + box-pack box-shadow box-sizing break-after break-before + break-inside caption-side clear clip clip-path + clip-rule color color-profile columns column-count + column-fill column-gap column-rule column-rule-color + column-rule-style column-rule-width column-span + column-width content counter-increment counter-reset + crop cue cue-after cue-before cursor direction display + dominant-baseline drop-initial-after-adjust + drop-initial-after-align drop-initial-before-adjust + drop-initial-before-align drop-initial-size + drop-initial-value elevation empty-cells filter fit + fit-position flex flex-basis flex-direction flex-flow + flex-grow flex-shrink flex-wrap float float-offset + font font-family font-feature-settings + font-kerning font-language-override font-size + font-size-adjust font-stretch font-style font-synthesis + font-variant font-variant-alternates font-variant-caps + font-variant-east-asian font-variant-ligatures + font-variant-numeric font-variant-position font-weight + grid-cell grid-column grid-column-align grid-column-sizing + grid-column-span grid-columns grid-flow grid-row + grid-row-align grid-row-sizing grid-row-span + grid-rows grid-template hanging-punctuation height + hyphenate-after hyphenate-before hyphenate-character + hyphenate-lines hyphenate-resource hyphens icon + image-orientation image-rendering image-resolution + ime-mode inline-box-align justify-content + left letter-spacing line-break line-height + line-stacking line-stacking-ruby line-stacking-shift + line-stacking-strategy list-style list-style-image + list-style-position list-style-type margin + margin-bottom margin-left margin-right margin-top + mark marker-offset marks mark-after mark-before + marquee-direction marquee-loop marquee-play-count + marquee-speed marquee-style mask max-height max-width + min-height min-width move-to nav-down + nav-index nav-left nav-right nav-up object-fit + object-position opacity order orphans outline + outline-color outline-offset outline-style + outline-width overflow overflow-style overflow-wrap + overflow-x overflow-y padding padding-bottom + padding-left padding-right padding-top + page page-break-after page-break-before + page-break-inside page-policy pause pause-after + pause-before perspective perspective-origin + phonemes pitch pitch-range play-during pointer-events + position presentation-level punctuation-trim quotes + rendering-intent resize rest rest-after rest-before + richness right rotation rotation-point ruby-align + ruby-overhang ruby-position ruby-span size speak + speak-as speak-header speak-numeral speak-punctuation + speech-rate src stress string-set + tab-size table-layout target target-name + target-new target-position text-align + text-align-last text-combine-horizontal + text-decoration text-decoration-color + text-decoration-line text-decoration-skip + text-decoration-style text-emphasis + text-emphasis-color text-emphasis-position + text-emphasis-style text-height text-indent + text-justify text-orientation text-outline + text-overflow text-rendering text-shadow + text-space-collapse text-transform + text-underline-position text-wrap top + transform transform-origin transform-style + transition transition-delay transition-duration + transition-property transition-timing-function + unicode-bidi vertical-align + visibility voice-balance voice-duration + voice-family voice-pitch voice-pitch-range + voice-range voice-rate voice-stress voice-volume + volume white-space widows width word-break + word-spacing word-wrap writing-mode z-index + ) + end + + def self.builtins + @builtins ||= Set.new %w( + above absolute always armenian aural auto avoid left bottom + baseline behind below bidi-override blink block bold bolder + both bottom capitalize center center-left center-right circle + cjk-ideographic close-quote collapse condensed continuous crop + cross crosshair cursive dashed decimal decimal-leading-zero + default digits disc dotted double e-resize embed expanded + extra-condensed extra-expanded fantasy far-left far-right fast + faster fixed georgian groove hebrew help hidden hide high higher + hiragana hiragana-iroha icon inherit inline inline-table inset + inside invert italic justify katakana katakana-iroha landscape + large larger left left-side leftwards level lighter line-through + list-item loud low lower lower-alpha lower-greek lower-roman + lowercase ltr medium message-box middle mix monospace n-resize + narrower ne-resize no-close-quote no-open-quote no-repeat none + normal nowrap nw-resize oblique once open-quote outset outside + overline pointer portrait px relative repeat repeat-x repeat-y + rgb ridge right right-side rightwards s-resize sans-serif scroll + se-resize semi-condensed semi-expanded separate serif show + silent slow slower small-caps small-caption smaller soft solid + spell-out square static status-bar super sw-resize table-caption + table-cell table-column table-column-group table-footer-group + table-header-group table-row table-row-group text text-bottom + text-top thick thin top transparent ultra-condensed + ultra-expanded underline upper-alpha upper-latin upper-roman + uppercase url visible w-resize wait wider x-fast x-high x-large + x-loud x-low x-small x-soft xx-large xx-small yes + ) + end + + def self.constants + @constants ||= Set.new %w( + indigo gold firebrick indianred yellow darkolivegreen + darkseagreen mediumvioletred mediumorchid chartreuse + mediumslateblue black springgreen crimson lightsalmon brown + turquoise olivedrab cyan silver skyblue gray darkturquoise + goldenrod darkgreen darkviolet darkgray lightpink teal + darkmagenta lightgoldenrodyellow lavender yellowgreen thistle + violet navy orchid blue ghostwhite honeydew cornflowerblue + darkblue darkkhaki mediumpurple cornsilk red bisque slategray + darkcyan khaki wheat deepskyblue darkred steelblue aliceblue + gainsboro mediumturquoise floralwhite coral purple lightgrey + lightcyan darksalmon beige azure lightsteelblue oldlace + greenyellow royalblue lightseagreen mistyrose sienna lightcoral + orangered navajowhite lime palegreen burlywood seashell + mediumspringgreen fuchsia papayawhip blanchedalmond peru + aquamarine white darkslategray ivory dodgerblue lemonchiffon + chocolate orange forestgreen slateblue olive mintcream + antiquewhite darkorange cadetblue moccasin limegreen saddlebrown + darkslateblue lightskyblue deeppink plum aqua darkgoldenrod + maroon sandybrown magenta tan rosybrown pink lightblue + palevioletred mediumseagreen dimgray powderblue seagreen snow + mediumblue midnightblue paleturquoise palegoldenrod whitesmoke + darkorchid salmon lightslategray lawngreen lightgreen tomato + hotpink lightyellow lavenderblush linen mediumaquamarine green + blueviolet peachpuff + ) + end + + # source: http://www.w3.org/TR/CSS21/syndata.html#vendor-keyword-history + def self.vendor_prefixes + @vendor_prefixes ||= Set.new %w( + -ah- -atsc- -hp- -khtml- -moz- -ms- -o- -rim- -ro- -tc- -wap- + -webkit- -xv- mso- prince- + ) + end + + state :root do + mixin :basics + rule %r/{/, Punctuation, :stanza + rule %r/:[:]?#{identifier}/, Name::Decorator + rule %r/\.#{identifier}/, Name::Class + rule %r/##{identifier}/, Name::Function + rule %r/@#{identifier}/, Keyword, :at_rule + rule identifier, Name::Tag + rule %r([~^*!%&\[\]()<>|+=@:;,./?-]), Operator + rule %r/"(\\\\|\\"|[^"])*"/, Str::Single + rule %r/'(\\\\|\\'|[^'])*'/, Str::Double + end + + state :value do + mixin :basics + rule %r/url\(.*?\)/, Str::Other + rule %r/#[0-9a-f]{1,6}/i, Num # colors + rule %r/#{number}(?:%|(?:em|px|pt|pc|in|mm|cm|ex|rem|ch|vw|vh|vmin|vmax|dpi|dpcm|dppx|deg|grad|rad|turn|s|ms|Hz|kHz)\b)?/, Num + rule %r/[\[\]():\/.,]/, Punctuation + rule %r/"(\\\\|\\"|[^"])*"/, Str::Single + rule %r/'(\\\\|\\'|[^'])*'/, Str::Double + rule(identifier) do |m| + if self.class.constants.include? m[0] + token Name::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name + end + end + end + + state :at_rule do + rule %r/{(?=\s*#{identifier}\s*:)/m, Punctuation, :at_stanza + rule %r/{/, Punctuation, :at_body + rule %r/;/, Punctuation, :pop! + mixin :value + end + + state :at_body do + mixin :at_content + mixin :root + end + + state :at_stanza do + mixin :at_content + mixin :stanza + end + + state :at_content do + rule %r/}/ do + token Punctuation + pop! 2 + end + end + + state :basics do + rule %r/\s+/m, Text + rule %r(/\*(?:.*?)\*/)m, Comment + end + + state :stanza do + mixin :basics + rule %r/}/, Punctuation, :pop! + rule %r/(#{identifier})(\s*)(:)/m do |m| + name_tok = if self.class.attributes.include? m[1] + Name::Label + elsif self.class.vendor_prefixes.any? { |p| m[1].start_with?(p) } + Name::Label + else + Name::Property + end + + groups name_tok, Text, Punctuation + + push :stanza_value + end + end + + state :stanza_value do + rule %r/;/, Punctuation, :pop! + rule(/(?=})/) { pop! } + rule %r/!\s*important\b/, Comment::Preproc + rule %r/^@.*?$/, Comment::Preproc + mixin :value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/csvs.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/csvs.rb new file mode 100644 index 000000000000..e4294453ea64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/csvs.rb @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class CSVS < RegexLexer + tag 'csvs' + title "csvs" + desc 'The CSV Schema Language (digital-preservation.github.io)' + filenames '*.csvs' + + state :root do + rule %r/\s+/m, Text + + rule %r(//[\S\t ]*), Comment::Single + rule %r(/\*[^*]*\*/)m, Comment::Multiline + + rule %r/(version)( )(\d+\.\d+)/ do + groups Keyword, Text::Whitespace, Num::Float + end + + rule %r/T?\d{2}:\d{2}:\d{2}(\.\d{5})?(Z|(?:[-+]\d{2}:\d{2}))?/, Literal::Date + rule %r/\d{4}-\d{2}-\d{2}/, Literal::Date + rule %r/\d{2}\/\d{2}\/\d{4}/, Literal::Date + + rule %r((\d+[.]?\d*|\d*[.]\d+)(e[+-]?[0-9]+)?)i, Num::Float + rule %r/\d+/, Num::Integer + + rule %r/@\w+/, Keyword::Pseudo + + rule %r/[-.\w]+:/, Name::Variable + rule %r/^"[^"]+"/, Name::Variable + rule %r/\$([-.\w]+|("[^"]+"))\/?/, Name::Variable + + rule %r/[A-Z]+/i, Keyword + + rule %r/"[^"]*"/, Str::Double + rule %r/'[^\r\n\f']'/, Str::Char + + rule %r/[,()*]/, Punctuation + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cuda.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cuda.rb new file mode 100644 index 000000000000..c973ddd62a78 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cuda.rb @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- # + +module Rouge + module Lexers + load_lexer 'cpp.rb' + + class CUDA < Cpp + title "CUDA" + desc "Compute Unified Device Architecture, used for programming with NVIDIA GPU" + + tag 'cuda' + filenames '*.cu', '*.cuh' + + def self.keywords + @keywords ||= super + Set.new(%w( + __global__ __device__ __host__ __noinline__ __forceinline__ + __constant__ __shared__ __managed__ __restrict__ + )) + end + + def self.keywords_type + @keywords_type ||= super + Set.new(%w( + char1 char2 char3 char4 uchar1 uchar2 uchar3 uchar4 + short1 short2 short3 short4 ushort1 ushort2 ushort3 ushort4 + int1 int2 int3 int4 uint1 uint2 uint3 uint4 + long1 long2 long3 long4 ulong1 ulong2 ulong3 ulong4 + longlong1 longlong2 longlong3 longlong4 + ulonglong1 ulonglong2 ulonglong3 ulonglong4 + float1 float2 float3 float4 double1 double2 double3 double4 + dim3 + )) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cypher.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cypher.rb new file mode 100644 index 000000000000..956cb6dca129 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cypher.rb @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Cypher < RegexLexer + tag 'cypher' + aliases 'cypher' + filenames '*.cypher' + mimetypes 'application/x-cypher-query' + + title "Cypher" + desc 'The Cypher query language (neo4j.com/docs/cypher-manual)' + + def self.functions + @functions ||= Set.new %w( + ABS ACOS ALLSHORTESTPATHS ASIN ATAN ATAN2 AVG CEIL COALESCE COLLECT + COS COT COUNT DATE DEGREES E ENDNODE EXP EXTRACT FILTER FLOOR + HAVERSIN HEAD ID KEYS LABELS LAST LEFT LENGTH LOG LOG10 LOWER LTRIM + MAX MIN NODE NODES PERCENTILECONT PERCENTILEDISC PI RADIANS RAND + RANGE REDUCE REL RELATIONSHIP RELATIONSHIPS REPLACE REVERSE RIGHT + ROUND RTRIM SHORTESTPATH SIGN SIN SIZE SPLIT SQRT STARTNODE STDEV + STDEVP STR SUBSTRING SUM TAIL TAN TIMESTAMP TOFLOAT TOINT TOINTEGER + TOSTRING TRIM TYPE UPPER + ) + end + + def self.predicates + @predicates ||= Set.new %w( + ALL AND ANY CONTAINS EXISTS HAS IN NONE NOT OR SINGLE XOR + ) + end + + def self.keywords + @keywords ||= Set.new %w( + AS ASC ASCENDING ASSERT BY CASE COMMIT CONSTRAINT CREATE CSV CYPHER + DELETE DESC DESCENDING DETACH DISTINCT DROP ELSE END ENDS EXPLAIN + FALSE FIELDTERMINATOR FOREACH FROM HEADERS IN INDEX IS JOIN LIMIT + LOAD MATCH MERGE NULL ON OPTIONAL ORDER PERIODIC PROFILE REMOVE + RETURN SCAN SET SKIP START STARTS THEN TRUE UNION UNIQUE UNWIND USING + WHEN WHERE WITH CALL YIELD + ) + end + + state :root do + rule %r/[\s]+/, Text + rule %r(//.*?$), Comment::Single + + rule %r([*+\-<>=&|~%^]), Operator + rule %r/[{}),;\[\]]/, Str::Symbol + + # literal number + rule %r/(\w+)(:)(\s*)(-?[._\d]+)/ do + groups Name::Label, Str::Delimiter, Text::Whitespace, Num + end + + # function-like + # - "name(" + # - "name (" + # - "name (" + rule %r/(\w+)(\s*)(\()/ do |m| + name = m[1].upcase + if self.class.functions.include? name + groups Name::Function, Text::Whitespace, Str::Symbol + elsif self.class.keywords.include? name + groups Keyword, Text::Whitespace, Str::Symbol + else + groups Name, Text::Whitespace, Str::Symbol + end + end + + rule %r/:\w+/, Name::Class + + # number range + rule %r/(-?\d+)(\.\.)(-?\d+)/ do + groups Num, Operator, Num + end + + # numbers + rule %r/(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?/i, Num::Float + rule %r/\d+e[+-]?\d+/i, Num::Float + rule %r/0[0-7]+/, Num::Oct + rule %r/0x[a-f0-9]+/i, Num::Hex + rule %r/\d+/, Num::Integer + + rule %r([.\w]+:), Name::Property + + # remaining "(" + rule %r/\(/, Str::Symbol + + rule %r/[.\w$]+/ do |m| + match = m[0].upcase + if self.class.predicates.include? match + token Operator::Word + elsif self.class.keywords.include? match + token Keyword + else + token Name + end + end + + rule %r/"(\\\\|\\"|[^"])*"/, Str::Double + rule %r/'(\\\\|\\'|[^'])*'/, Str::Single + rule %r/`(\\\\|\\`|[^`])*`/, Str::Backtick + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cython.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cython.rb new file mode 100644 index 000000000000..945cbc198dab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/cython.rb @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'python.rb' + + class Cython < Python + title "Cython" + desc "Cython and Pyrex source code (cython.org)" + tag 'cython' + aliases 'pyx', 'pyrex' + filenames '*.pyx', '*.pxd', '*.pxi' + mimetypes 'text/x-cython', 'application/x-cython' + + def initialize(opts = {}) + super opts + @indentation = nil + end + + def self.keywords + @keywords ||= super + %w( + by except? fused gil nogil + ) + end + + def self.c_keywords + @ckeywords ||= %w( + public readonly extern api inline enum union + ) + end + + identifier = /[a-z_]\w*/i + dotted_identifier = /[a-z_.][\w.]*/i + + prepend :root do + rule %r/cp?def|ctypedef/ do + token Keyword + push :c_definitions + push :c_start + end + + rule %r/(from)((?:\\\s|\s)+)(#{dotted_identifier})((?:\\\s|\s)+)(cimport)/ do + groups Keyword::Namespace, + Text, + Name::Namespace, + Text, + Keyword::Namespace + end + + rule %r/(cimport)(\s+)(#{dotted_identifier})/ do + groups Keyword::Namespace, Text, Name::Namespace + end + + rule %r/(struct)((?:\\\s|\s)+)/ do + groups Keyword, Text + push :classname + end + + mixin :func_call_fix + + rule %r/[(,]/, Punctuation, :c_start + end + + prepend :classname do + rule %r/(?:\\\s|\s)+/, Text + end + + prepend :funcname do + rule %r/(?:\\\s|\s)+/, Text + end + # This is a fix for the way that function calls are lexed in the Python + # lexer. This should be moved to the Python lexer once confirmed that it + # does not cause any regressions. + state :func_call_fix do + rule %r/#{identifier}(?=\()/ do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.exceptions.include? m[0] + token Name::Builtin + elsif self.class.builtins.include? m[0] + token Name::Builtin + elsif self.class.builtins_pseudo.include? m[0] + token Name::Builtin::Pseudo + else + token Name::Function + end + end + end + + # The Cython lexer adds three states to those already in the Python lexer. + # Calls to `cdef`, `cpdef` and `ctypedef` move the lexer into the :c_start + # state. The primary purpose of this state is to highlight datatypes. Once + # this has been done, the lexer moves to the :c_definitions state where + # the majority of text in a definition is lexed. Finally, newlines cause + # the lexer to move to :c_indent. This state is used to check whether we + # have moved out of a C block. + + state :c_start do + rule %r/[^\S\n]+/, Text + + rule %r/cp?def|ctypedef/, Keyword + + rule %r/(?:un)?signed/, Keyword::Type + + # This rule matches identifiers that could be type declarations. The + # lookahead matches (1) pointers, (2) arrays and (3) variable names. + rule %r/#{identifier}(?=(?:\*+)|(?:[ \t]*\[)|(?:[ \t]+\w))/ do |m| + if self.class.keywords.include? m[0] + token Keyword + pop! + elsif %w(def).include? m[0] + token Keyword + goto :funcname + elsif %w(struct class).include? m[0] + token Keyword::Reserved + goto :classname + elsif self.class.c_keywords.include? m[0] + token Keyword::Reserved + else + token Keyword::Type + pop! + end + end + + rule(//) { pop! } + end + + state :c_definitions do + rule %r/\n/, Text, :c_indent + mixin :root + end + + state :c_indent do + rule %r/[ \t]+/ do |m| + token Text + goto :c_start + + if @indentation.nil? + @indentation = m[0] + elsif @indentation.length > m[0].length + @indentation = nil + pop! 2 # Pop :c_start and :c_definitions + end + end + + rule(//) { @indentation = nil; reset_stack } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/d.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/d.rb new file mode 100644 index 000000000000..de52e30a27a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/d.rb @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class D < RegexLexer + tag 'd' + aliases 'dlang' + filenames '*.d', '*.di' + mimetypes 'application/x-dsrc', 'text/x-dsrc' + + title "D" + desc 'The D programming language(dlang.org)' + + keywords = %w( + abstract alias align asm assert auto body + break case cast catch class const continue + debug default delegate delete deprecated do else + enum export extern finally final foreach_reverse + foreach for function goto if immutable import + interface invariant inout in is lazy mixin + module new nothrow out override package pragma + private protected public pure ref return scope + shared static struct super switch synchronized + template this throw try typedef typeid typeof + union unittest version volatile while with + __gshared __traits __vector __parameters + ) + + keywords_type = %w( + bool byte cdouble cent cfloat char creal + dchar double float idouble ifloat int ireal + long real short ubyte ucent uint ulong + ushort void wchar + ) + + keywords_pseudo = %w( + __FILE__ __FILE_FULL_PATH__ __MODULE__ __LINE__ __FUNCTION__ + __PRETTY_FUNCTION__ __DATE__ __EOF__ __TIME__ __TIMESTAMP__ + __VENDOR__ __VERSION__ + ) + + state :whitespace do + rule %r/\n/m, Text + rule %r/\s+/m, Text + end + + state :root do + mixin :whitespace + # Comments + rule %r(//.*), Comment::Single + rule %r(/(\\\n)?[*](.|\n)*?[*](\\\n)?/), Comment::Multiline + rule %r(/\+), Comment::Multiline, :nested_comment + # Keywords + rule %r/(#{keywords.join('|')})\b/, Keyword + rule %r/(#{keywords_type.join('|')})\b/, Keyword::Type + rule %r/(false|true|null)\b/, Keyword::Constant + rule %r/(#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo + rule %r/macro\b/, Keyword::Reserved + rule %r/(string|wstring|dstring|size_t|ptrdiff_t)\b/, Name::Builtin + # Literals + # HexFloat + rule %r/0[xX]([0-9a-fA-F_]*\.[0-9a-fA-F_]+|[0-9a-fA-F_]+)[pP][+\-]?[0-9_]+[fFL]?[i]?/, Num::Float + # DecimalFloat + rule %r/[0-9_]+(\.[0-9_]+[eE][+\-]?[0-9_]+|\.[0-9_]*|[eE][+\-]?[0-9_]+)[fFL]?[i]?/, Num::Float + rule %r/\.(0|[1-9][0-9_]*)([eE][+\-]?[0-9_]+)?[fFL]?[i]?/, Num::Float + # IntegerLiteral + # Binary + rule %r/0[Bb][01_]+/, Num::Bin + # Octal + # TODO: 0[0-7] isn't supported use octal![0-7] instead + rule %r/0[0-7_]+/, Num::Oct + # Hexadecimal + rule %r/0[xX][0-9a-fA-F_]+/, Num::Hex + # Decimal + rule %r/(0|[1-9][0-9_]*)([LUu]|Lu|LU|uL|UL)?/, Num::Integer + # CharacterLiteral + rule %r/'(\\['"?\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\&\w+;|.)'/, Str::Char + # StringLiteral + # WysiwygString + rule %r/r"[^"]*"[cwd]?/, Str + # Alternate WysiwygString + rule %r/`[^`]*`[cwd]?/, Str + # DoubleQuotedString + rule %r/"(\\\\|\\"|[^"])*"[cwd]?/, Str + # EscapeSequence + rule %r/\\(['\"?\\abfnrtv]|x[0-9a-fA-F]{2}|[0-7]{1,3}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|&\w+;)/, Str + # HexString + rule %r/x"[0-9a-fA-F_\s]*"[cwd]?/, Str + # DelimitedString + rule %r/q"\[/, Str, :delimited_bracket + rule %r/q"\(/, Str, :delimited_parenthesis + rule %r/q"</, Str, :delimited_angle + rule %r/q"\{/, Str, :delimited_curly + rule %r/q"([a-zA-Z_]\w*)\n.*?\n\1"/, Str + rule %r/q"(.).*?\1"/, Str + # TokenString + rule %r/q\{/, Str, :token_string + # Attributes + rule %r/@([a-zA-Z_]\w*)?/, Name::Decorator + # Tokens + rule %r`(~=|\^=|%=|\*=|==|!>=|!<=|!<>=|!<>|!<|!>|!=|>>>=|>>>|>>=|>>|>=|<>=|<>|<<=|<<|<=|\+\+|\+=|--|-=|\|\||\|=|&&|&=|\.\.\.|\.\.|/=)|[/.&|\-+<>!()\[\]{}?,;:$=*%^~]`, Punctuation + # Identifier + rule %r/[a-zA-Z_]\w*/, Name + # Line + rule %r/#line\s.*\n/, Comment::Special + end + + state :nested_comment do + rule %r([^+/]+), Comment::Multiline + rule %r(/\+), Comment::Multiline, :push + rule %r(\+/), Comment::Multiline, :pop! + rule %r([+/]), Comment::Multiline + end + + state :token_string do + rule %r/\{/, Punctuation, :token_string_nest + rule %r/\}/, Str, :pop! + mixin :root + end + + state :token_string_nest do + rule %r/\{/, Punctuation, :push + rule %r/\}/, Punctuation, :pop! + mixin :root + end + + state :delimited_bracket do + rule %r/[^\[\]]+/, Str + rule %r/\[/, Str, :delimited_inside_bracket + rule %r/\]"/, Str, :pop! + end + + state :delimited_inside_bracket do + rule %r/[^\[\]]+/, Str + rule %r/\[/, Str, :push + rule %r/\]/, Str, :pop! + end + + state :delimited_parenthesis do + rule %r/[^()]+/, Str + rule %r/\(/, Str, :delimited_inside_parenthesis + rule %r/\)"/, Str, :pop! + end + + state :delimited_inside_parenthesis do + rule %r/[^()]+/, Str + rule %r/\(/, Str, :push + rule %r/\)/, Str, :pop! + end + + state :delimited_angle do + rule %r/[^<>]+/, Str + rule %r/</, Str, :delimited_inside_angle + rule %r/>"/, Str, :pop! + end + + state :delimited_inside_angle do + rule %r/[^<>]+/, Str + rule %r/</, Str, :push + rule %r/>/, Str, :pop! + end + + state :delimited_curly do + rule %r/[^{}]+/, Str + rule %r/\{/, Str, :delimited_inside_curly + rule %r/\}"/, Str, :pop! + end + + state :delimited_inside_curly do + rule %r/[^{}]+/, Str + rule %r/\{/, Str, :push + rule %r/\}/, Str, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/dart.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/dart.rb new file mode 100644 index 000000000000..a95a3a22e970 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/dart.rb @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Dart < RegexLexer + title "Dart" + desc "The Dart programming language (dartlang.com)" + + tag 'dart' + filenames '*.dart' + mimetypes 'text/x-dart' + + keywords = %w( + as assert break case catch continue default do else finally for + if in is new rethrow return super switch this throw try while with + ) + + declarations = %w( + abstract dynamic const external extends factory final get implements + native operator set static typedef var + ) + + types = %w(bool double Dynamic enum int num Object Set String void) + + imports = %w(import export library part\s*of part source) + + id = /[a-zA-Z_]\w*/ + + state :root do + rule %r(^ + (\s*(?:[a-zA-Z_][a-zA-Z\d_.\[\]]*\s+)+?) # return arguments + ([a-zA-Z_]\w*) # method name + (\s*)(\() # signature start + )mx do |m| + # TODO: do this better, this shouldn't need a delegation + delegate Dart, m[1] + token Name::Function, m[2] + token Text, m[3] + token Punctuation, m[4] + end + + rule %r/\s+/, Text + rule %r(//.*?$), Comment::Single + rule %r(/\*.*?\*/)m, Comment::Multiline + rule %r/"/, Str, :dqs + rule %r/'/, Str, :sqs + rule %r/r"[^"]*"/, Str::Other + rule %r/r'[^']*'/, Str::Other + rule %r/##{id}*/i, Str::Symbol + rule %r/@#{id}/, Name::Decorator + rule %r/(?:#{keywords.join('|')})\b/, Keyword + rule %r/(?:#{declarations.join('|')})\b/, Keyword::Declaration + rule %r/(?:#{types.join('|')})\b/, Keyword::Type + rule %r/(?:true|false|null)\b/, Keyword::Constant + rule %r/(?:class|interface)\b/, Keyword::Declaration, :class + rule %r/(?:#{imports.join('|')})\b/, Keyword::Namespace, :import + rule %r/(\.)(#{id})/ do + groups Operator, Name::Attribute + end + + rule %r/#{id}:/, Name::Label + rule %r/\$?#{id}/, Name + rule %r/[~^*!%&\[\](){}<>\|+=:;,.\/?-]/, Operator + rule %r/\d*\.\d+([eE]\-?\d+)?/, Num::Float + rule %r/0x[\da-fA-F]+/, Num::Hex + rule %r/\d+L?/, Num::Integer + rule %r/\n/, Text + end + + state :class do + rule %r/\s+/m, Text + rule id, Name::Class, :pop! + end + + state :dqs do + rule %r/"/, Str, :pop! + rule %r/[^\\\$"]+/, Str + mixin :string + end + + state :sqs do + rule %r/'/, Str, :pop! + rule %r/[^\\\$']+/, Str + mixin :string + end + + state :import do + rule %r/;/, Operator, :pop! + rule %r/(?:show|hide)\b/, Keyword::Declaration + mixin :root + end + + state :string do + mixin :interpolation + rule %r/\\[nrt\"\'\\]/, Str::Escape + end + + state :interpolation do + rule %r/\$#{id}/, Str::Interpol + rule %r/\$\{[^\}]+\}/, Str::Interpol + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/datastudio.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/datastudio.rb new file mode 100644 index 000000000000..7508aaaa3831 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/datastudio.rb @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Datastudio < RegexLexer + tag 'datastudio' + filenames '*.job' + mimetypes 'text/x-datastudio' + + title "Datastudio" + desc 'Datastudio scripting language' + + id = /@?[_a-z]\w*/i + + def self.sql_keywords + @sql_keywords ||= %w( + ABORT ABS ABSOLUTE ACCESS ADA ADD ADMIN AFTER AGGREGATE ALIAS + ALL ALLOCATE ALTER ANALYSE ANALYZE AND ANY ARE AS ASC ASENSITIVE + ASSERTION ASSIGNMENT ASYMMETRIC AT ATOMIC AUTHORIZATION + AVG BACKWARD BEFORE BEGIN BETWEEN BITVAR BIT_LENGTH BOTH + BREADTH BY C CACHE CALL CALLED CARDINALITY CASCADE CASCADED + CASE CAST CATALOG CATALOG_NAME CHAIN CHARACTERISTICS + CHARACTER_LENGTH CHARACTER_SET_CATALOG CHARACTER_SET_NAME + CHARACTER_SET_SCHEMA CHAR_LENGTH CHECK CHECKED CHECKPOINT + CLASS CLASS_ORIGIN CLOB CLOSE CLUSTER COALSECE COBOL COLLATE + COLLATION COLLATION_CATALOG COLLATION_NAME COLLATION_SCHEMA + COLUMN COLUMN_NAME COMMAND_FUNCTION COMMAND_FUNCTION_CODE + COMMENT COMMIT COMMITTED COMPLETION CONDITION_NUMBER + CONNECT CONNECTION CONNECTION_NAME CONSTRAINT CONSTRAINTS + CONSTRAINT_CATALOG CONSTRAINT_NAME CONSTRAINT_SCHEMA + CONSTRUCTOR CONTAINS CONTINUE CONVERSION CONVERT COPY + CORRESPONTING COUNT CREATE CREATEDB CREATEUSER CROSS CUBE + CURRENT CURRENT_DATE CURRENT_PATH CURRENT_ROLE CURRENT_TIME + CURRENT_TIMESTAMP CURRENT_USER CURSOR CURSOR_NAME CYCLE DATA + DATABASE DATETIME_INTERVAL_CODE DATETIME_INTERVAL_PRECISION + DAY DEALLOCATE DECLARE DEFAULT DEFAULTS DEFERRABLE DEFERRED + DEFINED DEFINER DELETE DELIMITER DELIMITERS DEREF DESC DESCRIBE + DESCRIPTOR DESTROY DESTRUCTOR DETERMINISTIC DIAGNOSTICS + DICTIONARY DISCONNECT DISPATCH DISTINCT DO DOMAIN DROP + DYNAMIC DYNAMIC_FUNCTION DYNAMIC_FUNCTION_CODE EACH ELSE + ENCODING ENCRYPTED END END-EXEC EQUALS ESCAPE EVERY EXCEPT + ESCEPTION EXCLUDING EXCLUSIVE EXEC EXECUTE EXISTING EXISTS + EXPLAIN EXTERNAL EXTRACT FALSE FETCH FINAL FIRST FOR FORCE + FOREIGN FORTRAN FORWARD FOUND FREE FREEZE FROM FULL FUNCTION + G GENERAL GENERATED GET GLOBAL GO GOTO GRANT GRANTED GROUP + GROUPING HANDLER HAVING HIERARCHY HOLD HOST IDENTITY IGNORE + ILIKE IMMEDIATE IMMUTABLE IMPLEMENTATION IMPLICIT IN INCLUDING + INCREMENT INDEX INDITCATOR INFIX INHERITS INITIALIZE INITIALLY + INNER INOUT INPUT INSENSITIVE INSERT INSTANTIABLE INSTEAD + INTERSECT INTO INVOKER IS ISNULL ISOLATION ITERATE JOIN KEY + KEY_MEMBER KEY_TYPE LANCOMPILER LANGUAGE LARGE LAST LATERAL + LEADING LEFT LENGTH LESS LEVEL LIKE LIMIT LISTEN LOAD LOCAL + LOCALTIME LOCALTIMESTAMP LOCATION LOCATOR LOCK LOWER MAP MATCH + MAX MAXVALUE MESSAGE_LENGTH MESSAGE_OCTET_LENGTH MESSAGE_TEXT + METHOD MIN MINUTE MINVALUE MOD MODE MODIFIES MODIFY MONTH + MORE MOVE MUMPS NAMES NATURAL NCLOB NEW NEXT + NO NOCREATEDB NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL + NULL NULLABLE NULLIF OBJECT OCTET_LENGTH OF OFF OFFSET OIDS + OLD ON ONLY OPEN OPERATION OPERATOR OPTION OPTIONS OR ORDER + ORDINALITY OUT OUTER OUTPUT OVERLAPS OVERLAY OVERRIDING + OWNER PAD PARAMETER PARAMETERS PARAMETER_MODE PARAMATER_NAME + PARAMATER_ORDINAL_POSITION PARAMETER_SPECIFIC_CATALOG + PARAMETER_SPECIFIC_NAME PARAMATER_SPECIFIC_SCHEMA PARTIAL PASCAL + PENDANT PLACING PLI POSITION POSTFIX PREFIX PREORDER + PREPARE PRESERVE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE + PUBLIC READ READS RECHECK RECURSIVE REF REFERENCES REFERENCING + REINDEX RELATIVE RENAME REPEATABLE REPLACE RESET RESTART + RESTRICT RESULT RETURN RETURNED_LENGTH RETURNED_OCTET_LENGTH + RETURNED_SQLSTATE RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP + ROUTINE ROUTINE_CATALOG ROUTINE_NAME ROUTINE_SCHEMA ROW ROWS + ROW_COUNT RULE SAVE_POINT SCALE SCHEMA SCHEMA_NAME SCOPE SCROLL + SEARCH SECOND SECURITY SELECT SELF SENSITIVE SERIALIZABLE + SERVER_NAME SESSION SESSION_USER SET SETOF SETS SHARE SHOW + SIMILAR SIMPLE SIZE SOME SOURCE SPACE SPECIFIC SPECIFICTYPE + SPECIFIC_NAME SQL SQLCODE SQLERROR SQLEXCEPTION SQLSTATE + SQLWARNINIG STABLE START STATE STATEMENT STATIC STATISTICS + STDIN STDOUT STORAGE STRICT STRUCTURE STYPE SUBCLASS_ORIGIN + SUBLIST SUBSTRING SUM SYMMETRIC SYSID SYSTEM SYSTEM_USER + TABLE TABLE_NAME TEMP TEMPLATE TEMPORARY TERMINATE THAN THEN + TIMEZONE_HOUR TIMEZONE_MINUTE TO TOAST TRAILING + TRANSATION TRANSACTIONS_COMMITTED TRANSACTIONS_ROLLED_BACK + TRANSATION_ACTIVE TRANSFORM TRANSFORMS TRANSLATE TRANSLATION + TREAT TRIGGER TRIGGER_CATALOG TRIGGER_NAME TRIGGER_SCHEMA TRIM + TRUE TRUNCATE TRUSTED TYPE UNCOMMITTED UNDER UNENCRYPTED UNION + UNIQUE UNKNOWN UNLISTEN UNNAMED UNNEST UNTIL UPDATE UPPER + USAGE USER USER_DEFINED_TYPE_CATALOG USER_DEFINED_TYPE_NAME + USER_DEFINED_TYPE_SCHEMA USING VACUUM VALID VALIDATOR VALUES + VARIABLE VERBOSE VERSION VIEW VOLATILE WHEN WHENEVER WHERE + WITH WITHOUT WORK WRITE ZONE + ) + end + + state :whitespace do + rule %r/\s+/m, Text + rule %r(//.*?$), Comment::Single + rule %r(/[*].*?[*]/)m, Comment::Multiline + end + + state :string do + rule %r/%(\\.|.)+?%/, Str::Escape + rule %r/\\"/, Str::Double + rule %r/"/, Str::Double, :pop! + rule %r/./m, Str::Double + end + + state :string_s do + rule %r/%(\\.|.)+?%/, Str::Escape + rule %r/\\'/, Str::Single + rule %r/'/, Str::Single, :pop! + rule %r/./m, Str::Single + end + + state :root do + mixin :whitespace + + rule %r/^:#{id}/, Name::Label + rule %r/@#{id}(\.#{id})?/m, Name::Entity + rule %r/%(\\.|.)+?%/, Name::Variable + rule %r/[~!%^&*()+=|\[\]{}:;,.<>\/?-]/, Punctuation + rule %r/"/, Str::Double, :string + rule %r/'/, Str::Single, :string_s + rule %r/\d(\.\d*)?/i, Num + rule %r/#{id}(?=\s*[(])/, Name::Function + rule id do |m| + name = m[0].upcase + + if self.class.sql_keywords.include? name + token Keyword + else + token Name + end + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/diff.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/diff.rb new file mode 100644 index 000000000000..d97e94fc484a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/diff.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + class Diff < RegexLexer + title 'diff' + desc 'Lexes unified diffs or patches' + + tag 'diff' + aliases 'patch', 'udiff' + filenames '*.diff', '*.patch' + mimetypes 'text/x-diff', 'text/x-patch' + + def self.detect?(text) + return true if text.start_with?('Index: ') + return true if text =~ %r(\Adiff[^\n]*?\ba/[^\n]*\bb/) + return true if text =~ /---.*?\n[+][+][+]/ || text =~ /[+][+][+].*?\n---/ + end + + state :root do + rule(/^ .*$\n?/, Text) + rule(/^---$\n?/, Punctuation) + rule(/^[+>]+.*$\n?/, Generic::Inserted) + rule(/^\+.*$\n?/, Generic::Inserted) + rule(/^[-<]+.*$\n?/, Generic::Deleted) + rule(/^!.*$\n?/, Generic::Strong) + rule(/^([Ii]ndex|diff).*$\n?/, Generic::Heading) + rule(/^(@@[^@]*@@)([^\n]*\n)/) do + groups Punctuation, Text + end + rule(/^\w.*$\n?/, Punctuation) + rule(/^=.*$\n?/, Generic::Heading) + rule(/\s.*$\n?/, Text) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/digdag.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/digdag.rb new file mode 100644 index 000000000000..407d646ea729 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/digdag.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require 'set' +module Rouge + module Lexers + load_lexer 'yaml.rb' + + class Digdag < YAML + title 'digdag' + desc 'A simple, open source, multi-cloud workflow engine (https://www.digdag.io/)' + tag 'digdag' + filenames '*.dig' + + mimetypes 'application/x-digdag' + + # http://docs.digdag.io/operators.html + # as of digdag v0.9.10 + KEYWORD_PATTERN = Regexp.union(%w( + call + require + loop + for_each + if + fail + echo + + td + td_run + td_ddl + td_load + td_for_each + td_wait + td_wait_table + td_partial_delete + td_table_export + + pg + + mail + http + s3_wait + redshift + redshift_load + redshift_unload + emr + + gcs_wait + bq + bq_ddl + bq_extract + bq_load + + sh + py + rb + embulk + ).map { |name| "#{name}>"} + %w( + _do + _parallel + )) + + prepend :block_nodes do + rule %r/(#{KEYWORD_PATTERN})(:)(?=\s|$)/ do |m| + groups Keyword::Reserved, Punctuation::Indicator + set_indent m[0], :implicit => true + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/docker.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/docker.rb new file mode 100644 index 000000000000..9b026dc196e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/docker.rb @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Docker < RegexLexer + title "Docker" + desc "Dockerfile syntax" + tag 'docker' + aliases 'dockerfile', 'Dockerfile' + filenames 'Dockerfile', '*.Dockerfile', '*.docker' + mimetypes 'text/x-dockerfile-config' + + KEYWORDS = %w( + FROM MAINTAINER CMD LABEL EXPOSE ENV ADD COPY ENTRYPOINT VOLUME USER WORKDIR ARG STOPSIGNAL HEALTHCHECK SHELL + ).join('|') + + start { @shell = Shell.new(@options) } + + state :root do + rule %r/\s+/, Text + + rule %r/^(ONBUILD)(\s+)(#{KEYWORDS})(.*)/io do + groups Keyword, Text::Whitespace, Keyword, Str + end + + rule %r/^(#{KEYWORDS})\b(.*)/io do + groups Keyword, Str + end + + rule %r/#.*?$/, Comment + + rule %r/^(ONBUILD\s+)?RUN(\s+)/i do + token Keyword + push :run + @shell.reset! + end + + rule %r/\w+/, Text + rule %r/[^\w]+/, Text + rule %r/./, Text + end + + state :run do + rule %r/\n/, Text, :pop! + rule %r/\\./m, Str::Escape + rule(/(\\.|[^\n\\])+/) { delegate @shell } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/dot.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/dot.rb new file mode 100644 index 000000000000..5742e945ddb0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/dot.rb @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Dot < RegexLexer + title "DOT" + desc "graph description language" + + tag 'dot' + filenames '*.dot' + mimetypes 'text/vnd.graphviz' + + start do + @html = HTML.new(options) + end + + state :comments_and_whitespace do + rule %r/\s+/, Text + rule %r(#.*), Comment::Single + rule %r(//.*?$), Comment::Single + rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline + end + + state :html do + rule %r/[^<>]+/ do + delegate @html + end + rule %r/<.+?>/m do + delegate @html + end + rule %r/>/, Punctuation, :pop! + end + + state :ID do + rule %r/([a-zA-Z][a-zA-Z_0-9]*)(\s*)(=)/ do |m| + token Name, m[1] + token Text, m[2] + token Punctuation, m[3] + end + rule %r/[a-zA-Z][a-zA-Z_0-9]*/, Name::Variable + rule %r/([0-9]+)?\.[0-9]+/, Num::Float + rule %r/[0-9]+/, Num::Integer + rule %r/"(\\"|[^"])*"/, Str::Double + rule %r/</ do + token Punctuation + @html.reset! + push :html + end + end + + state :a_list do + mixin :comments_and_whitespace + mixin :ID + rule %r/[=;,]/, Punctuation + rule %r/\]/, Operator, :pop! + end + + state :root do + mixin :comments_and_whitespace + rule %r/\b(strict|graph|digraph|subgraph|node|edge)\b/i, Keyword + rule %r/[{};:=]/, Punctuation + rule %r/-[->]/, Operator + rule %r/\[/, Operator, :a_list + mixin :ID + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ecl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ecl.rb new file mode 100644 index 000000000000..4fe7d6d2a187 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ecl.rb @@ -0,0 +1,175 @@ +# -*- codding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class ECL < RegexLexer + tag 'ecl' + filenames '*.ecl' + mimetypes 'application/x-ecl' + + title "ECL" + desc "Enterprise Control Language (hpccsystems.com)" + + id = /(#?)\b([a-z_][\w]*?)(\d*)\b/i + + def self.class_first + @class_first ||= Set.new %w( + file date str math metaphone metaphone3 uni audit blas system + ) + end + + def self.class_second + @class_second ||= Set.new %w( + debug email job log thorlib util workunit + ) + end + + def self.functions + @functions ||= Set.new %w( + abs acos aggregate allnodes apply ascii asin asstring atan _token ave + case catch choose choosen choosesets clustersize combine correlation + cos cosh count covariance cron dataset dedup define denormalize + dictionary distribute distributed distribution ebcdic enth error + evaluate event eventextra eventname exists exp failcode failmessage + fetch fromunicode fromxml getenv getisvalid global graph group hash + hashcrc having httpcall httpheader if iff index intformat isvalid + iterate join keyunicode length library limit ln local log loop map + matched matchlength matchposition matchtext matchunicode max merge + mergejoin min nofold nolocal nonempty normalize parse pipe power + preload process project pull random range rank ranked realformat + recordof regexfind regexreplace regroup rejected rollup round roundup + row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt + stepped stored sum table tan tanh thisnode topn tounicode toxml + transfer transform trim truncate typeof ungroup unicodeorder variance + which workunit xmldecode xmlencode xmltext xmlunicode apply assert + build buildindex evaluate fail keydiff keypatch loadxml nothor notify + output parallel sequential soapcall wait + ) + end + + def self.keywords + @keywords ||= Set.new %w( + and or in not all any as from atmost before best between case const + counter csv descend encrypt end endmacro enum except exclusive expire + export extend fail few first flat full function functionmacro group + heading hole ifblock import joined keep keyed last left limit load + local locale lookup many maxcount maxlength _token module interface + named nocase noroot noscan nosort of only opt outer overwrite packed + partition penalty physicallength pipe quote record repeat return + right rows scan self separator service shared skew skip sql store + terminator thor threshold token transform trim type unicodeorder + unsorted validate virtual whole wild within xml xpath after cluster + compressed compression default encoding escape fileposition forward + grouped inner internal linkcounted literal lzw mofn multiple + namespace wnotrim noxpath onfail prefetch retry rowset scope smart + soapaction stable timelimit timeout unordered unstable update use + width + ) + end + + def self.template + @template ||= Set.new %w( + append apply break constant debug declare demangle else elseif end + endregion error expand export exportxml for forall getdatatype if + ifdefined inmodule isdefined isvalid line link loop mangle onwarning + option region set stored text trace uniquename warning webservice + workunit loadxml + ) + end + + def self.type + @type ||= Set.new %w( + ascii big_endian boolean data decimal ebcdic grouped integer + linkcounted pattern qstring real record rule set of streamed string + token udecimal unicode utf8 unsigned varstring varunicode + ) + end + + def self.typed + @typed ||= Set.new %w( + data string qstring varstring varunicode unicode utf8 + ) + end + + state :single_quote do + rule %r([xDQUV]?'([^'\\]*(?:\\.[^'\\]*)*)'), Str::Single + rule %r/\\(x\\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)/, Text + end + + state :inline_whitespace do + rule %r/[ \t\r]+/, Text + rule %r/\\\n/, Text # line continuation + rule %r(/[*].*?[*]/)m, Comment::Multiline + end + + state :whitespace do + rule %r/\n+/m, Text + rule %r(//.*), Comment::Single + mixin :inline_whitespace + end + + state :root do + mixin :whitespace + mixin :single_quote + + rule %r(\b(?i:(and|not|or|in))\b), Operator::Word + rule %r([:=|>|<|<>|/|\\|\+|-|=]), Operator + rule %r([\[\]{}();,\&,\.,\%]), Punctuation + + rule %r(\b(?i:(beginc\+\+.*?endc\+\+)))m, Str::Single + rule %r(\b(?i:(embed.*?endembed)))m, Str::Single + + rule %r(\b(\w+)\.(\w+)\.(\w+)) do |m| + if m[1] == "std" && + self.class.class_first.include?(m[2]) && + self.class.class_second.include?(m[3]) + token Name::Class + else + token Name::Variable + end + end + + rule %r(\b(?i:(u)?decimal)(\d+(_\d+)?)\b), Keyword::Type + + rule %r/\d+\.\d+(e[\+\-]?\d+)?/i, Num::Float + rule %r/x[0-9a-f]+/i, Num::Hex + + rule %r/0x[0-9a-f]+/i, Num::Hex + rule %r/0[0-9a-f]+x/i, Num::Hex + rule %r(0[bB][01]+), Num::Bin + rule %r([01]+[bB]), Num::Bin + rule %r(\d+), Num::Integer + + rule id do |m| + name_only = m[2].downcase + name = name_only + m[3] + number = (m[3] == "") ? nil : m[3].to_i + if m[1] == "#" + if self.class.template.include? name + token Keyword::Type + else + token Error + end + elsif self.class.typed.include?(name_only) && number != nil + token Keyword::Type + elsif self.class.type.include? name + token Keyword::Type + elsif self.class.keywords.include? name + token Keyword + elsif self.class.functions.include? name + token Name::Function + elsif ["integer", "unsigned"].include?(name_only) && (1..8).cover?(number) + token Keyword::Type + elsif name_only == "real" && [4, 8].include?(number) + token Keyword::Type + elsif ["true", "false"].include? name + token Keyword::Constant + else + token Name::Other + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/eex.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/eex.rb new file mode 100644 index 000000000000..c95371007389 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/eex.rb @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- # + +module Rouge + module Lexers + class EEX < TemplateLexer + title "EEX" + desc "Embedded Elixir" + + tag 'eex' + aliases 'leex' + + filenames '*.eex', '*.leex' + + def initialize(opts={}) + @elixir_lexer = Elixir.new(opts) + + super(opts) + end + + start do + parent.reset! + @elixir_lexer.reset! + end + + open = /<%%|<%=|<%#|<%/ + close = /%%>|%>/ + + state :root do + rule %r/<%#/, Comment, :comment + + rule open, Comment::Preproc, :elixir + + rule %r/.+?(?=#{open})|.+/mo do + delegate parent + end + end + + state :comment do + rule close, Comment, :pop! + rule %r/.+?(?=#{close})|.+/mo, Comment + end + + state :elixir do + rule close, Comment::Preproc, :pop! + + rule %r/.+?(?=#{close})|.+/mo do + delegate @elixir_lexer + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/eiffel.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/eiffel.rb new file mode 100644 index 000000000000..5089a6944656 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/eiffel.rb @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Eiffel < RegexLexer + title "Eiffel" + desc "Eiffel programming language" + + tag 'eiffel' + filenames '*.e' + mimetypes 'text/x-eiffel' + + LanguageKeywords = %w( + across agent alias all and attached as assign attribute check + class convert create debug deferred detachable do else elseif end + ensure expanded export external feature from frozen if implies inherit + inspect invariant like local loop not note obsolete old once or + Precursor redefine rename require rescue retry select separate + some then undefine until variant Void when xor + ) + + BooleanConstants = %w(True False) + + LanguageVariables = %w(Current Result) + + SimpleString = /(?:[^"%\b\f\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)+?/ + + state :root do + rule %r/"\[/, Str::Other, :aligned_verbatim_string + rule %r/"\{/, Str::Other, :non_aligned_verbatim_string + rule %r/"(?:[^%\b\f\n\r\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)*?"/, Str::Double + rule %r/--.*/, Comment::Single + rule %r/'(?:[^%\b\f\n\r\t\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)'/, Str::Char + + rule %r/(?:#{LanguageKeywords.join('|')})\b/, Keyword + rule %r/(?:#{LanguageVariables.join('|')})\b/, Keyword::Variable + rule %r/(?:#{BooleanConstants.join('|')})\b/, Keyword::Constant + + rule %r/\b0[xX][\da-fA-F](?:_*[\da-fA-F])*b/, Num::Hex + rule %r/\b0[cC][0-7](?:_*[0-7])*\b/, Num::Oct + rule %r/\b0[bB][01](?:_*[01])*\b/, Num::Bin + rule %r/\d(?:_*\d)*/, Num::Integer + rule %r/(?:\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?[eE][+-]?)?\d(?:_*\d)*|\d(?:_*\d)*\.?/, Num::Float + + rule %r/:=|<<|>>|\(\||\|\)|->|\.|[{}\[\];(),:?]/, Punctuation::Indicator + rule %r/\\\\|\|\.\.\||\.\.|\/[~\/]?|[><\/]=?|[-+*^=~]/, Operator + + rule %r/[A-Z][\dA-Z_]*/, Name::Class + rule %r/[A-Za-z][\dA-Za-z_]*/, Name + rule %r/\s+/, Text + end + + state :aligned_verbatim_string do + rule %r/]"/, Str::Other, :pop! + rule SimpleString, Str::Other + end + + state :non_aligned_verbatim_string do + rule %r/}"/, Str::Other, :pop! + rule SimpleString, Str::Other + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/elixir.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/elixir.rb new file mode 100644 index 000000000000..edfe5badd5e4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/elixir.rb @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + # Direct port of pygments Lexer. + # See: https://bitbucket.org/birkenfeld/pygments-main/src/7304e4759ae65343d89a51359ca538912519cc31/pygments/lexers/functional.py?at=default#cl-2362 + class Elixir < RegexLexer + title "Elixir" + desc "Elixir language (elixir-lang.org)" + + tag 'elixir' + aliases 'elixir', 'exs' + + filenames '*.ex', '*.exs' + + mimetypes 'text/x-elixir', 'application/x-elixir' + + state :root do + rule %r/\s+/m, Text + rule %r/#.*$/, Comment::Single + rule %r{\b(case|cond|end|bc|lc|if|unless|try|loop|receive|fn|defmodule| + defp?|defprotocol|defimpl|defrecord|defmacrop?|defdelegate| + defexception|defguardp?|defstruct|exit|raise|throw|after|rescue|catch|else)\b(?![?!])| + (?<!\.)\b(do|\-\>)\b}x, Keyword + rule %r/\b(import|require|use|recur|quote|unquote|super|refer)\b(?![?!])/, Keyword::Namespace + rule %r/(?<!\.)\b(and|not|or|when|xor|in)\b/, Operator::Word + rule %r{%=|\*=|\*\*=|\+=|\-=|\^=|\|\|=| + <=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|(?=[\s])\?| + (?<=[\s])!+|&(&&?|(?!\d))|\|\||\^|\*|\+|\-|/| + \||\+\+|\-\-|\*\*|\/\/|\<\-|\<\>|<<|>>|=|\.|~~~}x, Operator + rule %r{(?<!:)(:)([a-zA-Z_]\w*([?!]|=(?![>=]))?|\<\>|===?|>=?|<=?| + <=>|&&?|%\(\)|%\[\]|%\{\}|\+\+?|\-\-?|\|\|?|\!|//|[%&`/\|]| + \*\*?|=?~|<\-)|([a-zA-Z_]\w*([?!])?)(:)(?!:)}, Str::Symbol + rule %r/:"/, Str::Symbol, :interpoling_symbol + rule %r/\b(nil|true|false)\b(?![?!])|\b[A-Z]\w*\b/, Name::Constant + rule %r/\b(__(FILE|LINE|MODULE|MAIN|FUNCTION)__)\b(?![?!])/, Name::Builtin::Pseudo + rule %r/[a-zA-Z_!]\w*[!\?]?/, Name + rule %r{::|[%(){};,/\|:\\\[\]]}, Punctuation + rule %r/@[a-zA-Z_]\w*|&\d/, Name::Variable + rule %r{\b\d(_?\d)*(\.(?![^\d\s])(_?\d)+)([eE][-+]?\d(_?\d)*)?\b}, Num::Float + rule %r{\b0x[0-9A-Fa-f](_?[0-9A-Fa-f])*\b}, Num::Hex + rule %r{\b0o[0-7](_?[0-7])*\b}, Num::Oct + rule %r{\b0b[01](_?[01])*\b}, Num::Bin + rule %r{\b\d(_?\d)*\b}, Num::Integer + + mixin :strings + mixin :sigil_strings + end + + state :strings do + rule %r/(%[A-Ba-z])?"""(?:.|\n)*?"""/, Str::Doc + rule %r/'''(?:.|\n)*?'''/, Str::Doc + rule %r/"/, Str::Double, :dqs + rule %r/'/, Str::Single, :sqs + rule %r{(?<!\w)\?(\\(x\d{1,2}|\h{1,2}(?!\h)\b|0[0-7]{0,2}(?![0-7])\b[^x0MC])|(\\[MC]-)+\w|[^\s\\])}, Str::Other + end + + state :dqs do + mixin :escapes + mixin :interpoling + rule %r/[^#"\\]+/, Str::Double + rule %r/"/, Str::Double, :pop! + rule %r/[#\\]/, Str::Double + end + + state :sqs do + mixin :escapes + mixin :interpoling + rule %r/[^#'\\]+/, Str::Single + rule %r/'/, Str::Single, :pop! + rule %r/[#\\]/, Str::Single + end + + state :interpoling do + rule %r/#\{/, Str::Interpol, :interpoling_string + end + + state :interpoling_string do + rule %r/\}/, Str::Interpol, :pop! + mixin :root + end + + state :escapes do + rule %r/\\x\h{2}/, Str::Escape + rule %r/\\u\{?\d+\}?/, Str::Escape + rule %r/\\[\\abdefnrstv0"']/, Str::Escape + end + + state :interpoling_symbol do + rule %r/"/, Str::Symbol, :pop! + mixin :interpoling + rule %r/[^#"]+/, Str::Symbol + end + + state :sigil_strings do + # ~-sigiled strings + # ~(abc), ~[abc], ~<abc>, ~|abc|, ~r/abc/, etc + # Cribbed and adjusted from Ruby lexer + delimiter_map = { '{' => '}', '[' => ']', '(' => ')', '<' => '>' } + # Match a-z for custom sigils too + sigil_opens = Regexp.union(delimiter_map.keys + %w(| / ' ")) + rule %r/~([A-Za-z])?(#{sigil_opens})/ do |m| + open = Regexp.escape(m[2]) + close = Regexp.escape(delimiter_map[m[2]] || m[2]) + interp = /[SRCW]/ === m[1] + toktype = Str::Other + + puts " open: #{open.inspect}" if @debug + puts " close: #{close.inspect}" if @debug + + # regexes + if 'Rr'.include? m[1] + toktype = Str::Regex + push :regex_flags + end + + if 'Ww'.include? m[1] + push :list_flags + end + + token toktype + + push do + rule %r/#{close}/, toktype, :pop! + + if interp + mixin :interpoling + rule %r/#/, toktype + else + rule %r/[\\#]/, toktype + end + + uniq_chars = "#{open}#{close}".squeeze + rule %r/[^##{uniq_chars}\\]+/m, toktype + end + end + end + + state :regex_flags do + rule %r/[fgimrsux]*/, Str::Regex, :pop! + end + + state :list_flags do + rule %r/[csa]?/, Str::Other, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/elm.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/elm.rb new file mode 100644 index 000000000000..526c33f337e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/elm.rb @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Elm < RegexLexer + title "Elm" + desc "The Elm programming language (http://elm-lang.org/)" + + tag 'elm' + filenames '*.elm' + mimetypes 'text/x-elm' + + # Keywords are logically grouped by lines + keywords = %w( + module exposing port + import as + type alias + if then else + case of + let in + ) + + state :root do + # Whitespaces + rule %r/\s+/m, Text + # Single line comments + rule %r/--.*/, Comment::Single + # Multiline comments + rule %r/{-/, Comment::Multiline, :multiline_comment + + # Keywords + rule %r/\b(#{keywords.join('|')})\b/, Keyword + + # Variable or a function + rule %r/[a-z]\w*/, Name + # Underscore is a name for a variable, when it won't be used later + rule %r/_/, Name + # Type + rule %r/[A-Z]\w*/, Keyword::Type + + # Two symbol operators: -> :: // .. && || ++ |> <| << >> == /= <= >= + rule %r/(->|::|\/\/|\.\.|&&|\|\||\+\+|\|>|<\||>>|<<|==|\/=|<=|>=)/, Operator + # One symbol operators: + - / * % = < > ^ | ! + rule %r/[+-\/*%=<>^\|!]/, Operator + # Lambda operator + rule %r/\\/, Operator + # Not standard Elm operators, but these symbols can be used for custom inflix operators. We need to highlight them as operators as well. + rule %r/[@\#$&~?]/, Operator + + # Single, double quotes, and triple double quotes + rule %r/"""/, Str, :multiline_string + rule %r/'(\\.|.)'/, Str::Char + rule %r/"/, Str, :double_quote + + # Numbers + rule %r/0x[\da-f]+/i, Num::Hex + rule %r/\d+e[+-]?\d+/i, Num::Float + rule %r/\d+\.\d+(e[+-]?\d+)?/i, Num::Float + rule %r/\d+/, Num::Integer + + # Punctuation: [ ] ( ) , ; ` { } : + rule %r/[\[\](),;`{}:]/, Punctuation + end + + # Multiline and nested commenting + state :multiline_comment do + rule %r/-}/, Comment::Multiline, :pop! + rule %r/{-/, Comment::Multiline, :multiline_comment + rule %r/[^-{}]+/, Comment::Multiline + rule %r/[-{}]/, Comment::Multiline + end + + # Double quotes + state :double_quote do + rule %r/[^\\"]+/, Str::Double + rule %r/\\"/, Str::Escape + rule %r/"/, Str::Double, :pop! + end + + # Multiple line string with triple double quotes, e.g. """ multi """ + state :multiline_string do + rule %r/\\"/, Str::Escape + rule %r/"""/, Str, :pop! + rule %r/[^"]+/, Str + rule %r/"/, Str + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/email.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/email.rb new file mode 100644 index 000000000000..b9413fdf98e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/email.rb @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Email < RegexLexer + tag 'email' + aliases 'eml', 'e-mail' + filenames '*.eml' + mimetypes 'message/rfc822' + + title "Email" + desc "An email message" + + start do + push :fields + end + + state :fields do + rule %r/[:]/, Operator, :field_body + rule %r/[^\n\r:]+/, Name::Tag + rule %r/[\n\r]/, Name::Tag + end + + state :field_body do + rule(/(\r?\n){2}/) { token Text; pop!(2) } + rule %r/\r?\n(?![ \v\t\f])/, Text, :pop! + rule %r/[^\n\r]+/, Name::Attribute + rule %r/[\n\r]/, Name::Attribute + end + + state :root do + rule %r/\n/, Text + rule %r/^>.*/, Comment + rule %r/.+/, Text + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/epp.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/epp.rb new file mode 100644 index 000000000000..dfec78455b83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/epp.rb @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- # + +module Rouge + module Lexers + class EPP < TemplateLexer + title "EPP" + desc "Embedded Puppet template files" + + tag 'epp' + + filenames '*.epp' + + def initialize(opts={}) + super(opts) + @parent = lexer_option(:parent) { PlainText.new(opts) } + @puppet_lexer = Puppet.new(opts) + end + + start do + parent.reset! + @puppet_lexer.reset! + end + + open = /<%%|<%=|<%#|(<%-|<%)(\s*\|)?/ + close = /%%>|(\|\s*)?(-%>|%>)/ + + state :root do + rule %r/<%#/, Comment, :comment + + rule open, Comment::Preproc, :puppet + + rule %r/.+?(?=#{open})|.+/m do + delegate parent + end + end + + state :comment do + rule close, Comment, :pop! + rule %r/.+?(?=#{close})|.+/m, Comment + end + + state :puppet do + rule close, Comment::Preproc, :pop! + + rule %r/.+?(?=#{close})|.+/m do + delegate @puppet_lexer + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/erb.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/erb.rb new file mode 100644 index 000000000000..6c0aab1f5aae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/erb.rb @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class ERB < TemplateLexer + title "ERB" + desc "Embedded ruby template files" + + tag 'erb' + aliases 'eruby', 'rhtml' + + filenames '*.erb', '*.erubis', '*.rhtml', '*.eruby' + + def initialize(opts={}) + @ruby_lexer = Ruby.new(opts) + + super(opts) + end + + start do + parent.reset! + @ruby_lexer.reset! + end + + open = /<%%|<%=|<%#|<%-|<%/ + close = /%%>|-%>|%>/ + + state :root do + rule %r/<%#/, Comment, :comment + + rule open, Comment::Preproc, :ruby + + rule %r/.+?(?=#{open})|.+/m do + delegate parent + end + end + + state :comment do + rule close, Comment, :pop! + rule %r/.+?(?=#{close})|.+/m, Comment + end + + state :ruby do + rule close, Comment::Preproc, :pop! + + rule %r/.+?(?=#{close})|.+/m do + delegate @ruby_lexer + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/erlang.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/erlang.rb new file mode 100644 index 000000000000..031f2bd2bcb0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/erlang.rb @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Erlang < RegexLexer + title "Erlang" + desc "The Erlang programming language (erlang.org)" + tag 'erlang' + aliases 'erl' + filenames '*.erl', '*.hrl' + + mimetypes 'text/x-erlang', 'application/x-erlang' + + keywords = %w( + after begin case catch cond end fun if + let of query receive try when + ) + + builtins = %w( + abs append_element apply atom_to_list binary_to_list + bitstring_to_list binary_to_term bit_size bump_reductions + byte_size cancel_timer check_process_code delete_module + demonitor disconnect_node display element erase exit + float float_to_list fun_info fun_to_list + function_exported garbage_collect get get_keys + group_leader hash hd integer_to_list iolist_to_binary + iolist_size is_atom is_binary is_bitstring is_boolean + is_builtin is_float is_function is_integer is_list + is_number is_pid is_port is_process_alive is_record + is_reference is_tuple length link list_to_atom + list_to_binary list_to_bitstring list_to_existing_atom + list_to_float list_to_integer list_to_pid list_to_tuple + load_module localtime_to_universaltime make_tuple md5 + md5_final md5_update memory module_loaded monitor + monitor_node node nodes open_port phash phash2 + pid_to_list port_close port_command port_connect + port_control port_call port_info port_to_list + process_display process_flag process_info purge_module + put read_timer ref_to_list register resume_process + round send send_after send_nosuspend set_cookie + setelement size spawn spawn_link spawn_monitor + spawn_opt split_binary start_timer statistics + suspend_process system_flag system_info system_monitor + system_profile term_to_binary tl trace trace_delivered + trace_info trace_pattern trunc tuple_size tuple_to_list + universaltime_to_localtime unlink unregister whereis + ) + + operators = %r{(\+\+?|--?|\*|/|<|>|/=|=:=|=/=|=<|>=|==?|<-|!|\?)} + word_operators = %w( + and andalso band bnot bor bsl bsr bxor + div not or orelse rem xor + ) + + atom_re = %r{(?:[a-z][a-zA-Z0-9_]*|'[^\n']*[^\\]')} + + variable_re = %r{(?:[A-Z_][a-zA-Z0-9_]*)} + + escape_re = %r{(?:\\(?:[bdefnrstv\'"\\/]|[0-7][0-7]?[0-7]?|\^[a-zA-Z]))} + + macro_re = %r{(?:#{variable_re}|#{atom_re})} + + base_re = %r{(?:[2-9]|[12][0-9]|3[0-6])} + + state :root do + rule(/\s+/, Text) + rule(/%.*\n/, Comment) + rule(%r{(#{keywords.join('|')})\b}, Keyword) + rule(%r{(#{builtins.join('|')})\b}, Name::Builtin) + rule(%r{(#{word_operators.join('|')})\b}, Operator::Word) + rule(/^-/, Punctuation, :directive) + rule(operators, Operator) + rule(/"/, Str, :string) + rule(/<</, Name::Label) + rule(/>>/, Name::Label) + rule %r{(#{atom_re})(:)} do + groups Name::Namespace, Punctuation + end + rule %r{(?:^|(?<=:))(#{atom_re})(\s*)(\()} do + groups Name::Function, Text, Punctuation + end + rule(%r{[+-]?#{base_re}#[0-9a-zA-Z]+}, Num::Integer) + rule(/[+-]?\d+/, Num::Integer) + rule(/[+-]?\d+.\d+/, Num::Float) + rule(%r{[\]\[:_@\".{}()|;,]}, Punctuation) + rule(variable_re, Name::Variable) + rule(atom_re, Name) + rule(%r{\?#{macro_re}}, Name::Constant) + rule(%r{\$(?:#{escape_re}|\\[ %]|[^\\])}, Str::Char) + rule(%r{##{atom_re}(:?\.#{atom_re})?}, Name::Label) + end + + state :string do + rule(escape_re, Str::Escape) + rule(/"/, Str, :pop!) + rule(%r{~[0-9.*]*[~#+bBcdefginpPswWxX]}, Str::Interpol) + rule(%r{[^"\\~]+}, Str) + rule(/~/, Str) + end + + state :directive do + rule %r{(define)(\s*)(\()(#{macro_re})} do + groups Name::Entity, Text, Punctuation, Name::Constant + pop! + end + rule %r{(record)(\s*)(\()(#{macro_re})} do + groups Name::Entity, Text, Punctuation, Name::Label + pop! + end + rule(atom_re, Name::Entity, :pop!) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/escape.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/escape.rb new file mode 100644 index 000000000000..8c66d3811fdf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/escape.rb @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Escape < Lexer + tag 'escape' + aliases 'esc' + + desc 'A generic lexer for including escaped content - see Formatter.enable_escape!' + + option :start, 'the beginning of the escaped section, default "<!"' + option :end, 'the end of the escaped section, e.g. "!>"' + option :lang, 'the language to lex in unescaped sections' + + attr_reader :start + attr_reader :end + attr_reader :lang + + def initialize(*) + super + @start = string_option(:start) { '<!' } + @end = string_option(:end) { '!>' } + @lang = lexer_option(:lang) { PlainText.new } + end + + def to_start_regex + @to_start_regex ||= /(.*?)(#{Regexp.escape(@start)})/m + end + + def to_end_regex + @to_end_regex ||= /(.*?)(#{Regexp.escape(@end)})/m + end + + def stream_tokens(str, &b) + stream = StringScanner.new(str) + + loop do + if stream.scan(to_start_regex) + puts "pre-escape: #{stream[1].inspect}" if @debug + @lang.continue_lex(stream[1], &b) + else + # no more start delimiters, scan til the end + @lang.continue_lex(stream.rest, &b) + return + end + + if stream.scan(to_end_regex) + yield Token::Tokens::Escape, stream[1] + else + yield Token::Tokens::Escape, stream.rest + return + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/factor.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/factor.rb new file mode 100644 index 000000000000..2a18f7152324 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/factor.rb @@ -0,0 +1,303 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Factor < RegexLexer + title "Factor" + desc "Factor, the practical stack language (factorcode.org)" + tag 'factor' + filenames '*.factor' + mimetypes 'text/x-factor' + + def self.detect?(text) + return true if text.shebang? 'factor' + end + + def self.builtins + @builtins ||= {}.tap do |builtins| + builtins[:kernel] = Set.new %w( + or 2bi 2tri while wrapper nip 4dip wrapper? bi* + callstack>array both? hashcode die dupd callstack + callstack? 3dup tri@ pick curry build ?execute 3bi prepose + >boolean if clone eq? tri* ? = swapd 2over 2keep 3keep clear + 2dup when not tuple? dup 2bi* 2tri* call tri-curry object bi@ + do unless* if* loop bi-curry* drop when* assert= retainstack + assert? -rot execute 2bi@ 2tri@ boa with either? 3drop bi + curry? datastack until 3dip over 3curry tri-curry* tri-curry@ + swap and 2nip throw bi-curry (clone) hashcode* compose 2dip if + 3tri unless compose? tuple keep 2curry equal? assert tri 2drop + most <wrapper> boolean? identity-hashcode identity-tuple? + null new dip bi-curry@ rot xor identity-tuple boolean + ) + + builtins[:assocs] = Set.new %w( + ?at assoc? assoc-clone-like assoc= delete-at* assoc-partition + extract-keys new-assoc value? assoc-size map>assoc push-at + assoc-like key? assoc-intersect assoc-refine update + assoc-union assoc-combine at* assoc-empty? at+ set-at + assoc-all? assoc-subset? assoc-hashcode change-at assoc-each + assoc-diff zip values value-at rename-at inc-at enum? at cache + assoc>map <enum> assoc assoc-map enum value-at* assoc-map-as + >alist assoc-filter-as clear-assoc assoc-stack maybe-set-at + substitute assoc-filter 2cache delete-at assoc-find keys + assoc-any? unzip + ) + + builtins[:combinators] = Set.new %w( + case execute-effect no-cond no-case? 3cleave>quot 2cleave + cond>quot wrong-values? no-cond? cleave>quot no-case case>quot + 3cleave wrong-values to-fixed-point alist>quot case-find + cond cleave call-effect 2cleave>quot recursive-hashcode + linear-case-quot spread spread>quot + ) + + builtins[:math] = Set.new %w( + number= if-zero next-power-of-2 each-integer ?1+ + fp-special? imaginary-part unless-zero float>bits number? + fp-infinity? bignum? fp-snan? denominator fp-bitwise= * + + power-of-2? - u>= / >= bitand log2-expects-positive < + log2 > integer? number bits>double 2/ zero? (find-integer) + bits>float float? shift ratio? even? ratio fp-sign bitnot + >fixnum complex? /i /f byte-array>bignum when-zero sgn >bignum + next-float u< u> mod recip rational find-last-integer >float + (all-integers?) 2^ times integer fixnum? neg fixnum sq bignum + (each-integer) bit? fp-qnan? find-integer complex <fp-nan> + real double>bits bitor rem fp-nan-payload all-integers? + real-part log2-expects-positive? prev-float align unordered? + float fp-nan? abs bitxor u<= odd? <= /mod rational? >integer + real? numerator + ) + + builtins[:sequences] = Set.new %w( + member-eq? append assert-sequence= find-last-from + trim-head-slice clone-like 3sequence assert-sequence? map-as + last-index-from reversed index-from cut* pad-tail + remove-eq! concat-as but-last snip trim-tail nths + nth 2selector sequence slice? <slice> partition + remove-nth tail-slice empty? tail* if-empty + find-from virtual-sequence? member? set-length + drop-prefix unclip unclip-last-slice iota map-sum + bounds-error? sequence-hashcode-step selector-for + accumulate-as map start midpoint@ (accumulate) rest-slice + prepend fourth sift accumulate! new-sequence follow map! like + first4 1sequence reverse slice unless-empty padding virtual@ + repetition? set-last index 4sequence max-length set-second + immutable-sequence first2 first3 replicate-as reduce-index + unclip-slice supremum suffix! insert-nth trim-tail-slice + tail 3append short count suffix concat flip filter sum + immutable? reverse! 2sequence map-integers delete-all start* + indices snip-slice check-slice sequence? head map-find + filter! append-as reduce sequence= halves collapse-slice + interleave 2map filter-as binary-reduce slice-error? product + bounds-check? bounds-check harvest immutable virtual-exemplar + find produce remove pad-head last replicate set-fourth + remove-eq shorten reversed? map-find-last 3map-as + 2unclip-slice shorter? 3map find-last head-slice pop* 2map-as + tail-slice* but-last-slice 2map-reduce iota? collector-for + accumulate each selector append! new-resizable cut-slice + each-index head-slice* 2reverse-each sequence-hashcode + pop set-nth ?nth <flat-slice> second join when-empty + collector immutable-sequence? <reversed> all? 3append-as + virtual-sequence subseq? remove-nth! push-either new-like + length last-index push-if 2all? lengthen assert-sequence + copy map-reduce move third first 3each tail? set-first prefix + bounds-error any? <repetition> trim-slice exchange surround + 2reduce cut change-nth min-length set-third produce-as + push-all head? delete-slice rest sum-lengths 2each head* + infimum remove! glue slice-error subseq trim replace-slice + push repetition map-index trim-head unclip-last mismatch + ) + + builtins[:namespaces] = Set.new %w( + global +@ change set-namestack change-global init-namespaces + on off set-global namespace set with-scope bind with-variable + inc dec counter initialize namestack get get-global make-assoc + ) + + builtins[:arrays] = Set.new %w( + <array> 2array 3array pair >array 1array 4array pair? + array resize-array array? + ) + + builtins[:io] = Set.new %w( + +character+ bad-seek-type? readln each-morsel + stream-seek read print with-output-stream contents + write1 stream-write1 stream-copy stream-element-type + with-input-stream stream-print stream-read stream-contents + stream-tell tell-output bl seek-output bad-seek-type nl + stream-nl write flush stream-lines +byte+ stream-flush + read1 seek-absolute? stream-read1 lines stream-readln + stream-read-until each-line seek-end with-output-stream* + seek-absolute with-streams seek-input seek-relative? + input-stream stream-write read-partial seek-end? + seek-relative error-stream read-until with-input-stream* + with-streams* tell-input each-block output-stream + stream-read-partial each-stream-block each-stream-line + ) + + builtins[:strings] = Set.new %w( + resize-string >string <string> 1string string string? + ) + + builtins[:vectors] = Set.new %w( + with-return restarts return-continuation with-datastack + recover rethrow-restarts <restart> ifcc set-catchstack + >continuation< cleanup ignore-errors restart? + compute-restarts attempt-all-error error-thread + continue <continuation> attempt-all-error? condition? + <condition> throw-restarts error catchstack continue-with + thread-error-hook continuation rethrow callcc1 + error-continuation callcc0 attempt-all condition + continuation? restart return + ) + + builtins[:continuations] = Set.new %w( + with-return restarts return-continuation with-datastack + recover rethrow-restarts <restart> ifcc set-catchstack + >continuation< cleanup ignore-errors restart? + compute-restarts attempt-all-error error-thread + continue <continuation> attempt-all-error? condition? + <condition> throw-restarts error catchstack continue-with + thread-error-hook continuation rethrow callcc1 + error-continuation callcc0 attempt-all condition + continuation? restart return + ) + end + end + + state :root do + rule %r/\s+/m, Text + + rule %r/(:|::|MACRO:|MEMO:|GENERIC:|HELP:)(\s+)(\S+)/m do + groups Keyword, Text, Name::Function + end + + rule %r/(M:|HOOK:|GENERIC#)(\s+)(\S+)(\s+)(\S+)/m do + groups Keyword, Text, Name::Class, Text, Name::Function + end + + rule %r/\((?=\s)/, Name::Function, :stack_effect + rule %r/;(?=\s)/, Keyword + + rule %r/(USING:)((?:\s|\\\s)+)/m do + groups Keyword::Namespace, Text + push :import + end + + rule %r/(IN:|USE:|UNUSE:|QUALIFIED:|QUALIFIED-WITH:)(\s+)(\S+)/m do + groups Keyword::Namespace, Text, Name::Namespace + end + + rule %r/(FROM:|EXCLUDE:)(\s+)(\S+)(\s+)(=>)/m do + groups Keyword::Namespace, Text, Name::Namespace, Text, Punctuation + end + + rule %r/(?:ALIAS|DEFER|FORGET|POSTPONE):/, Keyword::Namespace + + rule %r/(TUPLE:)(\s+)(\S+)(\s+)(<)(\s+)(\S+)/m do + groups( + Keyword, Text, + Name::Class, Text, + Punctuation, Text, + Name::Class + ) + push :slots + end + + rule %r/(TUPLE:)(\s+)(\S+)/m do + groups Keyword, Text, Name::Class + push :slots + end + + rule %r/(UNION:|INTERSECTION:)(\s+)(\S+)/m do + groups Keyword, Text, Name::Class + end + + rule %r/(PREDICATE:)(\s+)(\S+)(\s+)(<)(\s+)(\S+)/m do + groups( + Keyword, Text, + Name::Class, Text, + Punctuation, Text, + Name::Class + ) + end + + rule %r/(C:)(\s+)(\S+)(\s+)(\S+)/m do + groups( + Keyword, Text, + Name::Function, Text, + Name::Class + ) + end + + rule %r( + (INSTANCE|SLOT|MIXIN|SINGLETONS?|CONSTANT|SYMBOLS?|ERROR|SYNTAX + |ALIEN|TYPEDEF|FUNCTION|STRUCT): + )x, Keyword + + rule %r/(?:<PRIVATE|PRIVATE>)/, Keyword::Namespace + + rule %r/(MAIN:)(\s+)(\S+)/ do + groups Keyword::Namespace, Text, Name::Function + end + + # strings + rule %r/"""\s+.*?\s+"""/, Str + rule %r/"(\\.|[^\\])*?"/, Str + rule %r/(CHAR:)(\s+)(\\[\\abfnrstv]*|\S)(?=\s)/, Str::Char + + # comments + rule %r/!\s+.*$/, Comment + rule %r/#!\s+.*$/, Comment + + # booleans + rule %r/[tf](?=\s)/, Name::Constant + + # numbers + rule %r/-?\d+\.\d+(?=\s)/, Num::Float + rule %r/-?\d+(?=\s)/, Num::Integer + + rule %r/HEX:\s+[a-fA-F\d]+(?=\s)/m, Num::Hex + rule %r/BIN:\s+[01]+(?=\s)/, Num::Bin + rule %r/OCT:\s+[0-7]+(?=\s)/, Num::Oct + + rule %r([-+/*=<>^](?=\s)), Operator + + rule %r/(?:deprecated|final|foldable|flushable|inline|recursive)(?=\s)/, + Keyword + + rule %r/\S+/ do |m| + name = m[0] + + if self.class.builtins.values.any? { |b| b.include? name } + token Name::Builtin + else + token Name + end + end + end + + state :stack_effect do + rule %r/\s+/, Text + rule %r/\(/, Name::Function, :stack_effect + rule %r/\)/, Name::Function, :pop! + + rule %r/--/, Name::Function + rule %r/\S+/, Name::Variable + end + + state :slots do + rule %r/\s+/, Text + rule %r/;(?=\s)/, Keyword, :pop! + rule %r/\S+/, Name::Variable + end + + state :import do + rule %r/;(?=\s)/, Keyword, :pop! + rule %r/\s+/, Text + rule %r/\S+/, Name::Namespace + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/fortran.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/fortran.rb new file mode 100644 index 000000000000..ccc8d36b05b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/fortran.rb @@ -0,0 +1,178 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# vim: set ts=2 sw=2 et: + +# TODO: Implement format list support. + +module Rouge + module Lexers + class Fortran < RegexLexer + title "Fortran" + desc "Fortran 2008 (free-form)" + + tag 'fortran' + filenames '*.f', '*.f90', '*.f95', '*.f03', '*.f08', + '*.F', '*.F90', '*.F95', '*.F03', '*.F08' + mimetypes 'text/x-fortran' + + name = /[A-Z][_A-Z0-9]*/i + kind_param = /(\d+|#{name})/ + exponent = /[ED][+-]?\d+/i + + def self.keywords + # Special rules for two-word keywords are defined further down. + # Note: Fortran allows to omit whitespace between certain keywords. + @keywords ||= Set.new %w( + abstract allocatable allocate assign assignment associate asynchronous + backspace bind block blockdata call case class close codimension + common concurrent contains contiguous continue critical cycle data + deallocate deferred dimension do elemental else elseif elsewhere end + endassociate endblock endblockdata enddo endenum endfile endforall + endfunction endif endinterface endmodule endprogram endselect + endsubmodule endsubroutine endtype endwhere endwhile entry enum + enumerator equivalence exit extends external final flush forall format + function generic goto if implicit import in include inout inquire + intent interface intrinsic is lock module namelist non_overridable + none nopass nullify only open operator optional out parameter pass + pause pointer print private procedure program protected public pure + read recursive result return rewind save select selectcase sequence + stop submodule subroutine target then type unlock use value volatile + wait where while write + ) + end + + def self.types + # A special rule for the two-word version "double precision" is + # defined further down. + @types ||= Set.new %w( + character complex doubleprecision integer logical real + ) + end + + def self.intrinsics + @intrinsics ||= Set.new %w( + abs achar acos acosh adjustl adjustr aimag aint all allocated anint + any asin asinh associated atan atan2 atanh atomic_define atomic_ref + bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn bge bgt + bit_size ble blt btest c_associated c_f_pointer c_f_procpointer + c_funloc c_loc c_sizeof ceiling char cmplx command_argument_count + compiler_options compiler_version conjg cos cosh count cpu_time cshift + date_and_time dble digits dim dot_product dprod dshiftl dshiftr + eoshift epsilon erf erfc_scaled erfc execute_command_line exp exponent + extends_type_of findloc floor fraction gamma get_command_argument + get_command get_environment_variable huge hypot iachar iall iand iany + ibclr ibits ibset ichar ieee_class ieee_copy_sign ieee_get_flag + ieee_get_halting_mode ieee_get_rounding_mode ieee_get_status + ieee_get_underflow_mode ieee_is_finite ieee_is_nan ieee_is_normal + ieee_logb ieee_next_after ieee_rem ieee_rint ieee_scalb + ieee_selected_real_kind ieee_set_flag ieee_set_halting_mode + ieee_set_rounding_mode ieee_set_status ieee_set_underflow_mode + ieee_support_datatype ieee_support_denormal ieee_support_divide + ieee_support_flag ieee_support_halting ieee_support_inf + ieee_support_io ieee_support_nan ieee_support_rounding + ieee_support_sqrt ieee_support_standard ieee_support_underflow_control + ieee_unordered ieee_value ieor image_index index int ior iparity + is_contiguous is_iostat_end is_iostat_eor ishft ishftc kind lbound + lcobound leadz len_trim len lge lgt lle llt log_gamma log log10 + logical maskl maskr matmul max maxexponent maxloc maxval merge_bits + merge min minexponent minloc minval mod modulo move_alloc mvbits + nearest new_line nint norm2 not null num_images pack parity popcnt + poppar present product radix random_number random_seed range real + repeat reshape rrspacing same_type_as scale scan selected_char_kind + selected_int_kind selected_real_kind set_exponent shape shifta shiftl + shiftr sign sin sinh size spacing spread sqrt storage_size sum + system_clock tan tanh this_image tiny trailz transfer transpose trim + ubound ucobound unpack verify + ) + end + + state :root do + rule %r/[\s]+/, Text::Whitespace + rule %r/!.*$/, Comment::Single + rule %r/^#.*$/, Comment::Preproc + + rule %r/::|[()\/;,:&\[\]]/, Punctuation + + # TODO: This does not take into account line continuation. + rule %r/^(\s*)([0-9]+)\b/m do |m| + token Text::Whitespace, m[1] + token Name::Label, m[2] + end + + # Format statements are quite a strange beast. + # Better process them in their own state. + rule %r/\b(FORMAT)(\s*)(\()/mi do |m| + token Keyword, m[1] + token Text::Whitespace, m[2] + token Punctuation, m[3] + push :format_spec + end + + rule %r( + [+-]? # sign + ( + (\d+[.]\d*|[.]\d+)(#{exponent})? + | \d+#{exponent} # exponent is mandatory + ) + (_#{kind_param})? # kind parameter + )xi, Num::Float + + rule %r/[+-]?\d+(_#{kind_param})?/i, Num::Integer + rule %r/B'[01]+'|B"[01]+"/i, Num::Bin + rule %r/O'[0-7]+'|O"[0-7]+"/i, Num::Oct + rule %r/Z'[0-9A-F]+'|Z"[0-9A-F]+"/i, Num::Hex + rule %r/(#{kind_param}_)?'/, Str::Single, :string_single + rule %r/(#{kind_param}_)?"/, Str::Double, :string_double + rule %r/[.](TRUE|FALSE)[.](_#{kind_param})?/i, Keyword::Constant + + rule %r{\*\*|//|==|/=|<=|>=|=>|[-+*/<>=%]}, Operator + rule %r/\.(?:EQ|NE|LT|LE|GT|GE|NOT|AND|OR|EQV|NEQV|[A-Z]+)\./i, Operator::Word + + # Special rules for two-word keywords and types. + # Note: "doubleprecision" is covered by the normal keyword rule. + rule %r/double\s+precision\b/i, Keyword::Type + rule %r/go\s+to\b/i, Keyword + rule %r/sync\s+(all|images|memory)\b/i, Keyword + rule %r/error\s+stop\b/i, Keyword + + rule %r/#{name}/m do |m| + match = m[0].downcase + if self.class.keywords.include? match + token Keyword + elsif self.class.types.include? match + token Keyword::Type + elsif self.class.intrinsics.include? match + token Name::Builtin + else + token Name + end + end + + end + + state :string_single do + rule %r/[^']+/, Str::Single + rule %r/''/, Str::Escape + rule %r/'/, Str::Single, :pop! + end + + state :string_double do + rule %r/[^"]+/, Str::Double + rule %r/""/, Str::Escape + rule %r/"/, Str::Double, :pop! + end + + state :format_spec do + rule %r/'/, Str::Single, :string_single + rule %r/"/, Str::Double, :string_double + rule %r/\(/, Punctuation, :format_spec + rule %r/\)/, Punctuation, :pop! + rule %r/,/, Punctuation + rule %r/[\s]+/, Text::Whitespace + # Edit descriptors could be seen as a kind of "format literal". + rule %r/[^\s'"(),]+/, Literal + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/freefem.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/freefem.rb new file mode 100644 index 000000000000..11df6676da4b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/freefem.rb @@ -0,0 +1,240 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'cpp.rb' + + class FreeFEM < Cpp + title "FreeFEM" + desc "The FreeFEM programming language (freefem.org)" + + tag 'freefem' + aliases 'ff' + filenames '*.edp', '*.idp' + mimetypes 'text/x-ffhdr', 'text/x-ffsrc' + + # Override C/C++ ones (for example, `do` does not exists) + def self.keywords + @keywords ||= Set.new(%w( + break catch continue else for if return try while + )) + end + + # Override C/C++ ones (for example, `double` does not exists) + def self.keywords_type + @keywords_type ||= Set.new(%w( + bool border complex dmatrix fespace func gslspline ifstream int macro + matrix mesh mesh3 mpiComm mpiGroup mpiRequest NewMacro EndMacro + ofstream Pmmap problem Psemaphore real solve string varf + )) + end + + # Override C/C++ ones (totally different) + def self.reserved + @reserved ||= Set.new(%w( + BDM1 BDM1Ortho Edge03d Edge13d Edge23d FEQF HCT P0 P03d P0Edge P1 + P13d P1b P1b3d P1bl P1bl3d P1dc P1Edge P1nc P2 P23d P2b P2BR P2dc + P2Edge P2h P2Morley P2pnc P3 P3dc P3Edge P4 P4dc P4Edge P5Edge RT0 + RT03d RT0Ortho RT1 RT1Ortho RT2 RT2Ortho + + qf1pE qf1pElump qf1pT qf1pTlump qfV1 qfV1lump qf2pE qf2pT qf2pT4P1 + qfV2 qf3pE qf4pE qf5pE qf5pT qfV5 qf7pT qf9pT qfnbpE + + ARGV append area be binary BoundaryEdge bordermeasure CG Cholesky cin + cout Crout default diag edgeOrientation endl FILE fixed GMRES good + hTriangle im imax imin InternalEdge l1 l2 label lenEdge length LINE + linfty LU m max measure min mpiAnySource mpiBAND mpiBXOR mpiCommWorld + mpiLAND mpiLOR mpiLXOR mpiMAX mpiMIN mpiPROD mpirank mpisize mpiSUM + mpiUndefined n N nbe ndof ndofK noshowbase noshowpos notaregion nt + nTonEdge nuEdge nuTriangle nv P pi precision quantile re region + scientific searchMethod setw showbase showpos sparsesolver sum tellp + true UMFPACK unused whoinElement verbosity version volume x y z + )) + end + + def self.builtins + @builtins ||= Set.new(%w( + abs acos acosh adaptmesh adj AffineCG AffineGMRES arg asin asinh + assert atan atan2 atanh atof atoi BFGS broadcast buildlayers + buildmesh ceil chi complexEigenValue copysign change checkmovemesh + clock cmaes conj convect cos cosh cube d dd dfft diffnp diffpos + dimKrylov dist dumptable dx dxx dxy dxz dy dyx dyy dyz dz dzx dzy dzz + EigenValue emptymesh erf erfc exec exit exp fdim ffind find floor + flush fmax fmin fmod freeyams getARGV getline gmshload gmshload3 + gslcdfugaussianP gslcdfugaussianQ gslcdfugaussianPinv + gslcdfugaussianQinv gslcdfgaussianP gslcdfgaussianQ + gslcdfgaussianPinv gslcdfgaussianQinv gslcdfgammaP gslcdfgammaQ + gslcdfgammaPinv gslcdfgammaQinv gslcdfcauchyP gslcdfcauchyQ + gslcdfcauchyPinv gslcdfcauchyQinv gslcdflaplaceP gslcdflaplaceQ + gslcdflaplacePinv gslcdflaplaceQinv gslcdfrayleighP gslcdfrayleighQ + gslcdfrayleighPinv gslcdfrayleighQinv gslcdfchisqP gslcdfchisqQ + gslcdfchisqPinv gslcdfchisqQinv gslcdfexponentialP gslcdfexponentialQ + gslcdfexponentialPinv gslcdfexponentialQinv gslcdfexppowP + gslcdfexppowQ gslcdftdistP gslcdftdistQ gslcdftdistPinv + gslcdftdistQinv gslcdffdistP gslcdffdistQ gslcdffdistPinv + gslcdffdistQinv gslcdfbetaP gslcdfbetaQ gslcdfbetaPinv gslcdfbetaQinv + gslcdfflatP gslcdfflatQ gslcdfflatPinv gslcdfflatQinv + gslcdflognormalP gslcdflognormalQ gslcdflognormalPinv + gslcdflognormalQinv gslcdfgumbel1P gslcdfgumbel1Q gslcdfgumbel1Pinv + gslcdfgumbel1Qinv gslcdfgumbel2P gslcdfgumbel2Q gslcdfgumbel2Pinv + gslcdfgumbel2Qinv gslcdfweibullP gslcdfweibullQ gslcdfweibullPinv + gslcdfweibullQinv gslcdfparetoP gslcdfparetoQ gslcdfparetoPinv + gslcdfparetoQinv gslcdflogisticP gslcdflogisticQ gslcdflogisticPinv + gslcdflogisticQinv gslcdfbinomialP gslcdfbinomialQ gslcdfpoissonP + gslcdfpoissonQ gslcdfgeometricP gslcdfgeometricQ + gslcdfnegativebinomialP gslcdfnegativebinomialQ gslcdfpascalP + gslcdfpascalQ gslinterpakima gslinterpakimaperiodic + gslinterpcsplineperiodic gslinterpcspline gslinterpsteffen + gslinterplinear gslinterppolynomial gslranbernoullipdf gslranbeta + gslranbetapdf gslranbinomialpdf gslranexponential + gslranexponentialpdf gslranexppow gslranexppowpdf gslrancauchy + gslrancauchypdf gslranchisq gslranchisqpdf gslranerlang + gslranerlangpdf gslranfdist gslranfdistpdf gslranflat gslranflatpdf + gslrangamma gslrangammaint gslrangammapdf gslrangammamt + gslrangammaknuth gslrangaussian gslrangaussianratiomethod + gslrangaussianziggurat gslrangaussianpdf gslranugaussian + gslranugaussianratiomethod gslranugaussianpdf gslrangaussiantail + gslrangaussiantailpdf gslranugaussiantail gslranugaussiantailpdf + gslranlandau gslranlandaupdf gslrangeometricpdf gslrangumbel1 + gslrangumbel1pdf gslrangumbel2 gslrangumbel2pdf gslranlogistic + gslranlogisticpdf gslranlognormal gslranlognormalpdf + gslranlogarithmicpdf gslrannegativebinomialpdf gslranpascalpdf + gslranpareto gslranparetopdf gslranpoissonpdf gslranrayleigh + gslranrayleighpdf gslranrayleightail gslranrayleightailpdf + gslrantdist gslrantdistpdf gslranlaplace gslranlaplacepdf gslranlevy + gslranweibull gslranweibullpdf gslsfairyAi gslsfairyBi + gslsfairyAiscaled gslsfairyBiscaled gslsfairyAideriv gslsfairyBideriv + gslsfairyAiderivscaled gslsfairyBiderivscaled gslsfairyzeroAi + gslsfairyzeroBi gslsfairyzeroAideriv gslsfairyzeroBideriv + gslsfbesselJ0 gslsfbesselJ1 gslsfbesselJn gslsfbesselY0 gslsfbesselY1 + gslsfbesselYn gslsfbesselI0 gslsfbesselI1 gslsfbesselIn + gslsfbesselI0scaled gslsfbesselI1scaled gslsfbesselInscaled + gslsfbesselK0 gslsfbesselK1 gslsfbesselKn gslsfbesselK0scaled + gslsfbesselK1scaled gslsfbesselKnscaled gslsfbesselj0 gslsfbesselj1 + gslsfbesselj2 gslsfbesseljl gslsfbessely0 gslsfbessely1 gslsfbessely2 + gslsfbesselyl gslsfbesseli0scaled gslsfbesseli1scaled + gslsfbesseli2scaled gslsfbesselilscaled gslsfbesselk0scaled + gslsfbesselk1scaled gslsfbesselk2scaled gslsfbesselklscaled + gslsfbesselJnu gslsfbesselYnu gslsfbesselInuscaled gslsfbesselInu + gslsfbesselKnuscaled gslsfbesselKnu gslsfbessellnKnu + gslsfbesselzeroJ0 gslsfbesselzeroJ1 gslsfbesselzeroJnu gslsfclausen + gslsfhydrogenicR1 gslsfdawson gslsfdebye1 gslsfdebye2 gslsfdebye3 + gslsfdebye4 gslsfdebye5 gslsfdebye6 gslsfdilog gslsfmultiply + gslsfellintKcomp gslsfellintEcomp gslsfellintPcomp gslsfellintDcomp + gslsfellintF gslsfellintE gslsfellintRC gslsferfc gslsflogerfc + gslsferf gslsferfZ gslsferfQ gslsfhazard gslsfexp gslsfexpmult + gslsfexpm1 gslsfexprel gslsfexprel2 gslsfexpreln gslsfexpintE1 + gslsfexpintE2 gslsfexpintEn gslsfexpintE1scaled gslsfexpintE2scaled + gslsfexpintEnscaled gslsfexpintEi gslsfexpintEiscaled gslsfShi + gslsfChi gslsfexpint3 gslsfSi gslsfCi gslsfatanint gslsffermidiracm1 + gslsffermidirac0 gslsffermidirac1 gslsffermidirac2 gslsffermidiracint + gslsffermidiracmhalf gslsffermidirachalf gslsffermidirac3half + gslsffermidiracinc0 gslsflngamma gslsfgamma gslsfgammastar + gslsfgammainv gslsftaylorcoeff gslsffact gslsfdoublefact gslsflnfact + gslsflndoublefact gslsflnchoose gslsfchoose gslsflnpoch gslsfpoch + gslsfpochrel gslsfgammaincQ gslsfgammaincP gslsfgammainc gslsflnbeta + gslsfbeta gslsfbetainc gslsfgegenpoly1 gslsfgegenpoly2 + gslsfgegenpoly3 gslsfgegenpolyn gslsfhyperg0F1 gslsfhyperg1F1int + gslsfhyperg1F1 gslsfhypergUint gslsfhypergU gslsfhyperg2F0 + gslsflaguerre1 gslsflaguerre2 gslsflaguerre3 gslsflaguerren + gslsflambertW0 gslsflambertWm1 gslsflegendrePl gslsflegendreP1 + gslsflegendreP2 gslsflegendreP3 gslsflegendreQ0 gslsflegendreQ1 + gslsflegendreQl gslsflegendrePlm gslsflegendresphPlm + gslsflegendrearraysize gslsfconicalPhalf gslsfconicalPmhalf + gslsfconicalP0 gslsfconicalP1 gslsfconicalPsphreg gslsfconicalPcylreg + gslsflegendreH3d0 gslsflegendreH3d1 gslsflegendreH3d gslsflog + gslsflogabs gslsflog1plusx gslsflog1plusxmx gslsfpowint gslsfpsiint + gslsfpsi gslsfpsi1piy gslsfpsi1int gslsfpsi1 gslsfpsin + gslsfsynchrotron1 gslsfsynchrotron2 gslsftransport2 gslsftransport3 + gslsftransport4 gslsftransport5 gslsfsin gslsfcos gslsfhypot + gslsfsinc gslsflnsinh gslsflncosh gslsfanglerestrictsymm + gslsfanglerestrictpos gslsfzetaint gslsfzeta gslsfzetam1 + gslsfzetam1int gslsfhzeta gslsfetaint gslsfeta imag int1d int2d int3d + intalledges intallfaces interpolate invdiff invdiffnp invdiffpos + Isend isInf isNaN isoline Irecv j0 j1 jn jump lgamma LinearCG + LinearGMRES log log10 lrint lround max mean medit min mmg3d movemesh + movemesh23 mpiAlltoall mpiAlltoallv mpiAllgather mpiAllgatherv + mpiAllReduce mpiBarrier mpiGather mpiGatherv mpiRank mpiReduce + mpiScatter mpiScatterv mpiSize mpiWait mpiWaitAny mpiWtick mpiWtime + mshmet NLCG on plot polar Post pow processor processorblock + projection randinit randint31 randint32 random randreal1 randreal2 + randreal3 randres53 Read readmesh readmesh3 Recv rfind rint round + savemesh savesol savevtk seekg Sent set sign signbit sin sinh sort + splitComm splitmesh sqrt square srandom srandomdev Stringification + swap system tan tanh tellg tetg tetgconvexhull tetgreconstruction + tetgtransfo tgamma triangulate trunc Wait Write y0 y1 yn + )) + end + + def self.attributes + @builtinsParameters ||= Set.new(%w( + A A1 abserror absolute aniso aspectratio B B1 bb beginend bin + boundary bw close cmm coef composante cutoff datafilename dataname + dim distmax displacement doptions dparams eps err errg facemerge + facetcl factorize file fill fixedborder flabel flags floatmesh + floatsol fregion gradation grey hmax hmin holelist hsv init inquire + inside IsMetric iso ivalue keepbackvertices label labeldown labelmid + labelup levelset loptions lparams maxit maxsubdiv meditff mem memory + metric mode nbarrow nbiso nbiter nbjacoby nboffacetcl nbofholes + nbofregions nbregul nbsmooth nbvx ncv nev nomeshgeneration + normalization omega op optimize option options order orientation + periodic power precon prev ps ptmerge qfe qforder qft qfV ratio + rawvector reffacelow reffacemid reffaceup refnum reftet reftri region + regionlist renumv rescaling ridgeangle save sigma sizeofvolume + smoothing solver sparams split splitin2 splitpbedge stop strategy + swap switch sym t tgv thetamax tol tolpivot tolpivotsym transfo U2Vc + value varrow vector veps viso wait width withsurfacemesh WindowIndex + which zbound + )) + end + + id = /[a-z_]\w*/i + + state :expr_bol do + mixin :inline_whitespace + + rule %r/include/, Comment::Preproc, :macro + rule %r/load/, Comment::Preproc, :macro + rule %r/ENDIFMACRO/, Comment::Preproc, :macro + rule %r/IFMACRO/, Comment::Preproc, :macro + + rule(//) { pop! } + end + + state :statements do + mixin :whitespace + rule %r/(u8|u|U|L)?"/, Str, :string + rule %r((u8|u|U|L)?'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char + rule %r((\d+[.]\d*|[.]?\d+)e[+-]?\d+[lu]*)i, Num::Float + rule %r(\d+e[+-]?\d+[lu]*)i, Num::Float + rule %r/0x[0-9a-f]+[lu]*/i, Num::Hex + rule %r/0[0-7]+[lu]*/i, Num::Oct + rule %r/\d+[lu]*/i, Num::Integer + rule %r(\*/), Error + rule %r([~!%^&*+=\|?:<>/-]), Operator + rule %r/'/, Operator + rule %r/[()\[\],.;]/, Punctuation + rule %r/\bcase\b/, Keyword, :case + rule %r/(?:true|false|NaN)\b/, Name::Builtin + rule id do |m| + name = m[0] + + if self.class.keywords.include? name + token Keyword + elsif self.class.keywords_type.include? name + token Keyword::Type + elsif self.class.reserved.include? name + token Keyword::Reserved + elsif self.class.builtins.include? name + token Name::Builtin + elsif self.class.attributes.include? name + token Name::Attribute + else + token Name + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/fsharp.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/fsharp.rb new file mode 100644 index 000000000000..8640b6c4851e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/fsharp.rb @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class FSharp < RegexLexer + title "FSharp" + desc 'F# (fsharp.net)' + tag 'fsharp' + filenames '*.fs', '*.fsi', '*.fsx' + mimetypes 'application/fsharp-script', 'text/x-fsharp', 'text/x-fsi' + + def self.keywords + @keywords ||= Set.new %w( + abstract and as assert base begin class default delegate do + done downcast downto elif else end exception extern false + finally for fun function global if in inherit inline interface + internal lazy let let! match member module mutable namespace + new not null of open or override private public rec return + return! select static struct then to true try type upcast + use use! val void when while with yield yield! sig atomic + break checked component const constraint constructor + continue eager event external fixed functor include method + mixin object parallel process protected pure sealed tailcall + trait virtual volatile + ) + end + + def self.keyopts + @keyopts ||= Set.new %w( + != # & && ( ) * \+ , - -. -> . .. : :: := :> ; ;; < <- = + > >] >} ? ?? [ [< [> [| ] _ ` { {< | |] } ~ |> <| <> + ) + end + + def self.word_operators + @word_operators ||= Set.new %w(and asr land lor lsl lxor mod or) + end + + def self.primitives + @primitives ||= Set.new %w(unit int float bool string char list array) + end + + operator = %r([\[\];,{}_()!$%&*+./:<=>?@^|~#-]+) + id = /([a-z][\w']*)|(``[^`\n\r\t]+``)/i + upper_id = /[A-Z][\w']*/ + + state :root do + rule %r/\s+/m, Text + rule %r/false|true|[(][)]|\[\]/, Name::Builtin::Pseudo + rule %r/#{upper_id}(?=\s*[.])/, Name::Namespace, :dotted + rule upper_id, Name::Class + rule %r/[(][*](?![)])/, Comment, :comment + rule %r(//.*?$), Comment::Single + rule id do |m| + match = m[0] + if self.class.keywords.include? match + token Keyword + elsif self.class.word_operators.include? match + token Operator::Word + elsif self.class.primitives.include? match + token Keyword::Type + else + token Name + end + end + + rule operator do |m| + match = m[0] + if self.class.keyopts.include? match + token Punctuation + else + token Operator + end + end + + rule %r/-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float + rule %r/0x\h[\h_]*/i, Num::Hex + rule %r/0o[0-7][0-7_]*/i, Num::Oct + rule %r/0b[01][01_]*/i, Num::Bin + rule %r/\d[\d_]*/, Num::Integer + + rule %r/'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char + rule %r/'[.]'/, Str::Char + rule %r/'/, Keyword + rule %r/"/, Str::Double, :string + rule %r/[~?]#{id}/, Name::Variable + end + + state :comment do + rule %r/[^(*)]+/, Comment + rule(/[(][*]/) { token Comment; push } + rule %r/[*][)]/, Comment, :pop! + rule %r/[(*)]/, Comment + end + + state :string do + rule %r/[^\\"]+/, Str::Double + mixin :escape_sequence + rule %r/\\\n/, Str::Double + rule %r/"/, Str::Double, :pop! + end + + state :escape_sequence do + rule %r/\\[\\"'ntbr]/, Str::Escape + rule %r/\\\d{3}/, Str::Escape + rule %r/\\x\h{2}/, Str::Escape + end + + state :dotted do + rule %r/\s+/m, Text + rule %r/[.]/, Punctuation + rule %r/#{upper_id}(?=\s*[.])/, Name::Namespace + rule upper_id, Name::Class, :pop! + rule id, Name, :pop! + rule %r/\[/, Punctuation, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gdscript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gdscript.rb new file mode 100644 index 000000000000..372b6c1ded08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gdscript.rb @@ -0,0 +1,171 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class GDScript < RegexLexer + title "GDScript" + desc "The Godot Engine programming language (https://godotengine.org/)" + tag 'gdscript' + aliases 'gd', 'gdscript' + filenames '*.gd' + mimetypes 'text/x-gdscript', 'application/x-gdscript' + + def self.keywords + @keywords = %w( + and in not or as breakpoint class class_name extends is func setget + signal tool const enum export onready static var break continue + if elif else for pass return match while remote master puppet + remotesync mastersync puppetsync + ).join('|') + end + + # Reserved for future implementation + def self.keywords_reserved + @keywords_reserved = %w( + do switch case + ).join('|') + end + + def self.builtins + builtins = %w( + Color8 ColorN abs acos asin assert atan atan2 bytes2var ceil char + clamp convert cos cosh db2linear decimals dectime deg2rad dict2inst + ease exp floor fmod fposmod funcref hash inst2dict instance_from_id + is_inf is_nan lerp linear2db load log max min nearest_po2 pow + preload print print_stack printerr printraw prints printt rad2deg + rand_range rand_seed randf randi randomize range round seed sign + sin sinh sqrt stepify str str2var tan tan tanh type_exist typeof + var2bytes var2str weakref yield + ).join('|') + end + + def self.builtins_type + @builtins_type = %w( + bool int float String Vector2 Rect2 Transform2D Vector3 AABB + Plane Quat Basis Transform Color RID Object NodePath Dictionary + Array PoolByteArray PoolIntArray PoolRealArray PoolStringArray + PoolVector2Array PoolVector3Array PoolColorArray null + ).join('|') + end + + state :root do + rule %r/\n/, Text + rule %r/[^\S\n]+/, Text + rule %r/#.*/, Comment::Single + rule %r/[\[\]{}:(),;]/, Punctuation + rule %r/\\\n/, Text + rule %r/(in|and|or|not)\b/, Operator::Word + rule %r/!=|==|<<|>>|&&|\+=|-=|\*=|\/=|%=|&=|\|=|\|\||[-~+\/*%=<>&^.!|$]/, Operator + rule %r/(func)((?:\s|\\)+)/ do + groups Keyword, Text + push :funcname + end + rule %r/(class)((?:\s|\\)+)/ do + groups Keyword, Text + push :classname + end + mixin :keywords + mixin :builtins + rule %r/"""/, Str::Double, :escape_tdqs + rule %r/'''/, Str::Double, :escape_tsqs + rule %r/"/, Str::Double, :escape_dqs + rule %r/'/, Str::Double, :escape_sqs + mixin :name + mixin :numbers + end + + state :keywords do + rule %r/\b(#{GDScript.keywords})\b/, Keyword + rule %r/\b(#{GDScript.keywords_reserved})\b/, Keyword::Reserved + end + + state :builtins do + rule %r/\b(#{GDScript.builtins})\b/, Name::Builtin + rule %r/\b((self|false|true)|(PI|TAU|NAN|INF))\b/, Name::Builtin::Pseudo + rule %r/\b(#{GDScript.builtins_type})\b/, Keyword::Type + end + + state :numbers do + rule %r/(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?/, Num::Float + rule %r/\d+[eE][+-]?[0-9]+j?/, Num::Float + rule %r/0[xX][a-fA-F0-9]+/, Num::Hex + rule %r/\d+j?/, Num::Integer + end + + state :name do + rule %r/[a-zA-Z_]\w*/, Name + end + + state :funcname do + rule %r/[a-zA-Z_]\w*/, Name::Function, :pop! + end + + state :classname do + rule %r/[a-zA-Z_]\w*/, Name::Class, :pop! + end + + state :string_escape do + rule %r/\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})/, Str::Escape + end + + state :strings_single do + rule %r/%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]/, Str::Interpol + rule %r/[^\\'%\n]+/, Str::Single + rule %r/["\\]/, Str::Single + rule %r/%/, Str::Single + end + + state :strings_double do + rule %r/%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]/, Str::Interpol + rule %r/[^\\"%\n]+/, Str::Double + rule %r/['\\]/, Str::Double + rule %r/%/, Str::Double + end + + state :dqs do + rule %r/"/, Str::Double, :pop! + rule %r/\\\\|\\"|\\\n/, Str::Escape + mixin :strings_double + end + + state :escape_dqs do + mixin :string_escape + mixin :dqs + end + + state :sqs do + rule %r/'/, Str::Single, :pop! + rule %r/\\\\|\\'|\\\n/, Str::Escape + mixin :strings_single + end + + state :escape_sqs do + mixin :string_escape + mixin :sqs + end + + state :tdqs do + rule %r/"""/, Str::Double, :pop! + mixin :strings_double + rule %r/\n/, Str::Double + end + + state :escape_tdqs do + mixin :string_escape + mixin :tdqs + end + + state :tsqs do + rule %r/'''/, Str::Single, :pop! + mixin :strings_single + rule %r/\n/, Str::Single + end + + state :escape_tsqs do + mixin :string_escape + mixin :tsqs + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ghc_cmm.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ghc_cmm.rb new file mode 100644 index 000000000000..481bf20f93cb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ghc_cmm.rb @@ -0,0 +1,340 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# C minus minus (Cmm) is a pun on the name C++. It's an intermediate language +# of the Glasgow Haskell Compiler (GHC) that is very similar to C, but with +# many features missing and some special constructs. +# +# Cmm is a dialect of C--. The goal of this lexer is to use what GHC produces +# and parses (Cmm); C-- itself is not supported. +# +# https://gitlab.haskell.org/ghc/ghc/wikis/commentary/compiler/cmm-syntax +# +module Rouge + module Lexers + class GHCCmm < RegexLexer + title "GHC Cmm (C--)" + desc "GHC Cmm is the intermediate representation of the GHC Haskell compiler" + tag 'ghc-cmm' + filenames '*.cmm', '*.dump-cmm', '*.dump-cmm-*' + aliases 'cmm' + + ws = %r(\s|//.*?\n|/[*](?:[^*]|(?:[*][^/]))*[*]+/)mx + + # Make sure that this is not a preprocessor macro, e.g. `#if` or `#define`. + id = %r((?!#[a-zA-Z])[\w#\$%_']+) + + complex_id = %r( + (?:[\w#$%_']|\(\)|\(,\)|\[\]|[0-9])* + (?:[\w#$%_']+) + )mx + + state :root do + rule %r/\s+/m, Text + + # sections markers + rule %r/^=====.*=====$/, Generic::Heading + + # timestamps + rule %r/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+ UTC$/, Comment::Single + + mixin :detect_section + mixin :preprocessor_macros + + mixin :info_tbls + mixin :comments + mixin :literals + mixin :keywords + mixin :types + mixin :infos + mixin :names + mixin :operators + + # escaped newline + rule %r/\\\n/, Text + + # rest is Text + rule %r/./, Text + end + + state :detect_section do + rule %r/(section)(\s+)/ do |m| + token Keyword, m[1] + token Text, m[2] + push :section + end + end + + state :section do + rule %r/"(data|cstring|text|rodata|relrodata|bss)"/, Name::Builtin + + rule %r/{/, Punctuation, :pop! + + mixin :names + mixin :operators + mixin :keywords + + rule %r/\s+/, Text + end + + state :preprocessor_macros do + rule %r/#(include|endif|else|if)/, Comment::Preproc + + rule %r{ + (\#define) + (#{ws}*) + (#{id}) + }mx do |m| + token Comment::Preproc, m[1] + recurse m[2] + token Name::Label, m[3] + end + end + + state :info_tbls do + rule %r/({ )(info_tbls)(:)/ do |m| + token Punctuation, m[1] + token Name::Entity, m[2] + token Punctuation, m[3] + + push :info_tbls_body + end + end + + state :info_tbls_body do + rule %r/}/, Punctuation, :pop! + rule %r/{/, Punctuation, :info_tbls_body + + rule %r/(?=label:)/ do + push :label + end + + rule %r{(\()(#{complex_id})(,)}mx do |m| + token Punctuation, m[1] + token Name::Label, m[2] + token Punctuation, m[3] + end + + mixin :literals + mixin :infos + mixin :keywords + mixin :operators + + rule %r/#{id}/, Text + rule %r/\s+/, Text + end + + state :label do + mixin :infos + mixin :names + mixin :keywords + mixin :operators + + rule %r/[^\S\n]+/, Text # Tab, space, etc. but not newline! + rule %r/\n/, Text, :pop! + end + + state :comments do + rule %r/\/{2}.*/, Comment::Single + rule %r/\(likely.*?\)/, Comment + rule %r/\/\*.*?\*\//m, Comment::Multiline + end + + state :literals do + rule %r/-?[0-9]+\.[0-9]+/, Literal::Number::Float + rule %r/-?[0-9]+/, Literal::Number::Integer + rule %r/"/, Literal::String::Delimiter, :literal_string + end + + state :literal_string do + # quotes + rule %r/\\./, Literal::String::Escape + rule %r/%./, Literal::String::Symbol + rule %r/"/, Literal::String::Delimiter, :pop! + rule %r/./, Literal::String + end + + state :operators do + rule %r/\.\./, Operator + rule %r/[+\-*\/<>=!&|~]/, Operator + rule %r/[\[\].{}:;,()]/, Punctuation + end + + state :keywords do + rule %r/(const)(\s+)/ do |m| + token Keyword::Constant, m[1] + token Text, m[2] + end + + rule %r/"/, Literal::String::Double + + rule %r/(switch)([^{]*)({)/ do |m| + token Keyword, m[1] + recurse m[2] + token Punctuation, m[3] + end + + rule %r/(arg|result)(#{ws}+)(hints)(:)/ do |m| + token Name::Property, m[1] + recurse m[2] + token Name::Property, m[3] + token Punctuation, m[4] + end + + rule %r/(returns)(#{ws}*)(to)/ do |m| + token Keyword, m[1] + recurse m[2] + token Keyword, m[3] + end + + rule %r/(never)(#{ws}*)(returns)/ do |m| + token Keyword, m[1] + recurse m[2] + token Keyword, m[3] + end + + rule %r{(return)(#{ws}*)(\()} do |m| + token Keyword, m[1] + recurse m[2] + token Punctuation, m[3] + end + + rule %r{(if|else|goto|call|offset|import|jump|ccall|foreign|prim|case|unwind|export|reserve|push)(#{ws})} do |m| + token Keyword, m[1] + recurse m[2] + end + + rule %r{(default)(#{ws}*)(:)} do |m| + token Keyword, m[1] + recurse m[2] + token Punctuation, m[3] + end + end + + state :types do + # Memory access: `type[42]` + # Note: Only a token for type is produced. + rule %r/(#{id})(?=\[[^\]])/ do |m| + token Keyword::Type, m[1] + end + + # Array type: `type[]` + rule %r/(#{id}\[\])/ do |m| + token Keyword::Type, m[1] + end + + # Capture macro substitutions before lexing typed declarations + # I.e. there is no type in `PREPROCESSOR_MACRO_VARIABLE someFun()` + rule %r{ + (^#{id}) + (#{ws}+) + (#{id}) + (#{ws}*) + (\() + }mx do |m| + token Name::Label, m[1] + recurse m[2] + token Name::Function, m[3] + recurse m[4] + token Punctuation, m[5] + end + + # Type in variable or parameter declaration: + # `type /* optional whitespace */ var_name /* optional whitespace */;` + # `type /* optional whitespace */ var_name /* optional whitespace */, var_name2` + # `(type /* optional whitespace */ var_name /* optional whitespace */)` + # Note: Only the token for type is produced here. + rule %r{ + (^#{id}) + (#{ws}+) + (#{id}) + }mx do |m| + token Keyword::Type, m[1] + recurse m[2] + token Name::Label, m[3] + end + end + + state :infos do + rule %r/(args|res|upd|label|rep|srt|arity|fun_type|arg_space|updfr_space)(:)/ do |m| + token Name::Property, m[1] + token Punctuation, m[2] + end + + rule %r/(stack_info)(:)/ do |m| + token Name::Entity, m[1] + token Punctuation, m[2] + end + end + + state :names do + rule %r/(::)(#{ws}*)([A-Z]\w+)/ do |m| + token Operator, m[1] + recurse m[2] + token Keyword::Type, m[3] + end + + rule %r/<(#{id})>/, Name::Builtin + + rule %r/(Sp|SpLim|Hp|HpLim|HpAlloc|BaseReg|CurrentNursery|CurrentTSO|R\d{1,2}|gcptr)(?!#{id})/, Name::Variable::Global + rule %r/([A-Z]#{id})(\.)/ do |m| + token Name::Namespace, m[1] + token Punctuation, m[2] + push :namespace_name + end + + # Inline function calls: + # ``` + # arg1 `lt` arg2 + # ``` + rule %r/(`)(#{id})(`)/ do |m| + token Punctuation, m[1] + token Name::Function, m[2] + token Punctuation, m[3] + end + + # Function: `name /* optional whitespace */ (` + # Function (arguments via explicit stack handling): `name /* optional whitespace */ {` + rule %r{(?= + #{complex_id} + #{ws}* + [\{\(] + )}mx do + push :function + end + + rule %r/CLOSURE/, Keyword::Type + rule %r/#{complex_id}/, Name::Label + end + + state :namespace_name do + rule %r/([A-Z]#{id})(\.)/ do |m| + token Name::Namespace, m[1] + token Punctuation, m[2] + end + + rule %r{(#{complex_id})(#{ws}*)([\{\(])}mx do |m| + token Name::Function, m[1] + recurse m[2] + token Punctuation, m[3] + pop! + end + + rule %r/#{complex_id}/, Name::Label, :pop! + + rule %r/(?=.)/m do + pop! + end + end + + state :function do + rule %r/INFO_TABLE_FUN|INFO_TABLE_CONSTR|INFO_TABLE_SELECTOR|INFO_TABLE_RET|INFO_TABLE/, Name::Builtin + rule %r/%#{id}/, Name::Builtin + rule %r/#{complex_id}/, Name::Function + rule %r/\s+/, Text + rule %r/[({]/, Punctuation, :pop! + mixin :comments + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ghc_core.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ghc_core.rb new file mode 100644 index 000000000000..ddcc14ea30be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ghc_core.rb @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# See http://www.cs.cmu.edu/afs/andrew/course/15/411/ghc/share/doc/ghc/ext-core/core.pdf for a description of the syntax +# of the language and https://www.aosabook.org/en/ghc.html for a high level overview. +module Rouge + module Lexers + class GHCCore < RegexLexer + title "GHC Core" + desc "Intermediate representation of the GHC Haskell compiler." + tag 'ghc-core' + + filenames '*.dump-simpl', '*.dump-cse', '*.dump-ds', '*.dump-spec' + + state :root do + # sections + rule %r/^=====.*=====$/, Generic::Heading + # timestamps + rule %r/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+ UTC$/, Comment::Single + rule %r/^Result size of .+\s*.*}/, Comment::Multiline + rule %r/--.*$/, Comment::Single + + rule %r/\[/, Comment::Special, :annotation + + mixin :recursive_binding + mixin :ghc_rule + mixin :function + + # rest is Text + # TODO: this is really inefficient + rule %r/\s/m, Text + rule %r/./, Text + end + + state :expression do + rule %r/[\n]+/, Text + rule %r/(?=^\S)/ do + pop! + end + + rule %r/\s+/, Text, :expression_line + end + + state :expression_line do + rule %r/ /, Text + + mixin :common + + rule %r/\n/, Text, :pop! + end + + state :annotation do + rule %r/\]/, Comment::Special, :pop! + rule %r/\[/, Comment::Special, :annotation + rule %r/[^\[\]]+/, Comment::Special + end + + state :common do + # array, e.g. '[]' or '[Char]' + rule %r/\[[^=]*\]/, Keyword::Type + + rule %r/\[/, Comment::Special, :annotation + + mixin :literal + mixin :constants + mixin :punctuation + mixin :operator + mixin :name + end + + state :literal do + rule %r/\d+\.\d+\#{0,2}/, Literal::Number::Float + rule %r/\d+\#{0,2}/, Literal::Number::Integer + rule %r/".*"#/, Literal::String + rule %r/'.'#/, Literal::String::Char + end + + state :constants do + rule %r/__DEFAULT/, Name::Constant + end + + state :name do + rule %r/^([A-Z]\w*)(\.)/ do |m| + token Name::Namespace, m[0] + token Punctuation, m[1] + end + + rule %r/[A-Z][^\s.,(){}]*/, Keyword::Type + + # packages, e.g. 'ghc-prim-0.5.3:' + rule %r/(^[a-z].*?\d+\.\d+\.\d+)(:)(?=\S)/ do |m| + token Name::Namespace, m[1] + token Punctuation, m[2] + end + + rule %r/\S*\(,\)\S*/, Name::Variable # '(,)' is a name, not punctuation + rule %r/\S[^\s.,(){}]*/, Name::Variable + end + + state :punctuation do + rule %r/[.,(){};]/, Punctuation + end + + state :operator do + rule %r/=>/, Operator + rule %r/->/, Operator + rule %r/::/, Operator + rule %r/=/, Operator + rule %r/forall/, Keyword + rule %r/case/, Keyword + rule %r/of/, Keyword + rule %r/letrec/, Keyword + rule %r/let/, Keyword + rule %r/join/, Keyword + rule %r/@/, Operator + rule %r/\\/, Operator + end + + state :recursive_binding do + rule %r/(Rec)(\s*)({)/ do |m| + token Keyword, m[1] + token Text, m[2] + token Punctuation, m[3] + end + + rule %r/^(end)(\s*)(Rec)(\s*)(})/ do |m| + token Keyword, m[1] + token Text, m[2] + token Keyword, m[3] + token Text, m[4] + token Punctuation, m[5] + end + end + + state :ghc_rule do + rule %r/^(".*?")/m do |m| + token Name::Label, m[0] + + push :expression + end + end + + state :function do + rule %r/^(\S+)(?=.*?(=|::))/m do |m| + token Name::Function, m[0] + + push :expression + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gherkin.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gherkin.rb new file mode 100644 index 000000000000..0b655b093d48 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gherkin.rb @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Gherkin < RegexLexer + tag 'gherkin' + aliases 'cucumber', 'behat' + + title "Gherkin" + desc 'A business-readable spec DSL (github.com/cucumber/cucumber/wiki/Gherkin)' + + filenames '*.feature' + mimetypes 'text/x-gherkin' + + def self.detect?(text) + return true if text.shebang? 'cucumber' + end + + # self-modifying method that loads the keywords file + def self.keywords + Kernel::load File.join(Lexers::BASE_DIR, 'gherkin/keywords.rb') + keywords + end + + def self.step_regex + # in Gherkin's config, keywords that end in < don't + # need word boundaries at the ends - all others do. + @step_regex ||= Regexp.new( + keywords[:step].map do |w| + if w.end_with? '<' + Regexp.escape(w.chop) + elsif w.end_with?(' ') + Regexp.escape(w) + else + "#{Regexp.escape(w)}\\b" + end + end.join('|') + ) + end + + rest_of_line = /.*?(?=[#\n])/ + + state :basic do + rule %r(#.*$), Comment + rule %r/[ \r\t]+/, Text + end + + state :root do + mixin :basic + rule %r(\n), Text + rule %r(""".*?""")m, Str + rule %r(@[^\s@]+), Name::Tag + mixin :has_table + mixin :has_examples + end + + state :has_scenarios do + rule %r((.*?)(:)) do |m| + reset_stack + + keyword = m[1] + keyword_tok = if self.class.keywords[:element].include? keyword + push :description; Keyword::Namespace + elsif self.class.keywords[:feature].include? keyword + push :feature_description; Keyword::Declaration + elsif self.class.keywords[:examples].include? keyword + push :example_description; Name::Namespace + else + Error + end + + groups keyword_tok, Punctuation + end + end + + state :has_examples do + mixin :has_scenarios + rule Gherkin.step_regex, Name::Function do + token Name::Function + reset_stack; push :step + end + end + + state :has_table do + rule(/(?=[|])/) { push :table_header } + end + + state :table_header do + rule %r/[^|\s]+/, Name::Variable + rule %r/\n/ do + token Text + goto :table + end + mixin :table + end + + state :table do + mixin :basic + rule %r/\n/, Text, :table_bol + rule %r/[|]/, Punctuation + rule %r/[^|\s]+/, Name + end + + state :table_bol do + rule(/(?=\s*[^\s|])/) { reset_stack } + rule(//) { pop! } + end + + state :description do + mixin :basic + mixin :has_examples + rule %r/\n/, Text + rule rest_of_line, Text + end + + state :feature_description do + mixin :basic + mixin :has_scenarios + rule %r/\n/, Text + rule rest_of_line, Text + end + + state :example_description do + mixin :basic + mixin :has_table + rule %r/\n/, Text + rule rest_of_line, Text + end + + state :step do + mixin :basic + rule %r/<.*?>/, Name::Variable + rule %r/".*?"/, Str + rule %r/\S[^\s<]*/, Text + rule rest_of_line, Text, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gherkin/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gherkin/keywords.rb new file mode 100644 index 000000000000..ddb6aa6e58fd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gherkin/keywords.rb @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# DO NOT EDIT +# This file is automatically generated by `rake builtins:gherkin`. +# See tasks/builtins/gherkin.rake for more info. + +module Rouge + module Lexers + def Gherkin.keywords + @keywords ||= {}.tap do |k| + k[:step] = Set.new ["'a ", "'ach ", "'ej ", "* ", "7 ", "A ", "A taktiež ", "A také ", "A tiež ", "A zároveň ", "AN ", "Aber ", "Ac ", "Ach", "Adott ", "Agus", "Ak ", "Akkor ", "Alavez ", "Ale ", "Aleshores ", "Ali ", "Allora ", "Alors ", "Als ", "Ama ", "Amennyiben ", "Amikor ", "Amma ", "Ampak ", "An ", "Ananging ", "Ancaq ", "And ", "Angenommen ", "Anrhegedig a ", "Ansin", "Antonces ", "Apabila ", "Atesa ", "Atunci ", "Atès ", "Avast! ", "Aye ", "BUT ", "Bagi ", "Banjur ", "Bet ", "Bila ", "Biết ", "Blimey! ", "Buh ", "But ", "But at the end of the day I reckon ", "Cal ", "Cand ", "Cando ", "Ce ", "Cho ", "Cuan ", "Cuando ", "Cuir i gcás go", "Cuir i gcás gur", "Cuir i gcás nach", "Cuir i gcás nár", "Când ", "DEN ", "DaH ghu' bejlu' ", "Dada ", "Dadas ", "Dadena ", "Dadeno ", "Dado ", "Dados ", "Daes ", "Dan ", "Dann ", "Dano ", "Daos ", "Dar ", "Dat fiind ", "Data ", "Date ", "Date fiind ", "Dati ", "Dati fiind ", "Dato ", "Dată fiind", "Dau ", "Daus ", "Daţi fiind ", "Dați fiind ", "De ", "Den youse gotta ", "Dengan ", "Diasumsikan ", "Diberi ", "Diketahui ", "Diyelim ki ", "Do ", "Donada ", "Donat ", "Donc ", "Donitaĵo ", "Dun ", "Duota ", "Dáu ", "E ", "Eeldades ", "Ef ", "En ", "Entao ", "Entonces ", "Então ", "Entón ", "Entós ", "Epi ", "Et ", "Et qu'", "Et que ", "Etant donné ", "Etant donné qu'", "Etant donné que ", "Etant donnée ", "Etant données ", "Etant donnés ", "Eğer ki ", "Fakat ", "Gangway! ", "Gdy ", "Gegeben sei ", "Gegeben seien ", "Gegeven ", "Gegewe ", "Gitt ", "Given ", "Givet ", "Givun ", "Ha ", "Həm ", "I ", "I CAN HAZ ", "In ", "Ir ", "It's just unbelievable ", "Ja ", "Jeśli ", "Jeżeli ", "Jika ", "Kad ", "Kada ", "Kadar ", "Kai ", "Kaj ", "Když ", "Kemudian ", "Ketika ", "Keď ", "Khi ", "Kiedy ", "Ko ", "Koga ", "Komence ", "Kui ", "Kuid ", "Kun ", "Lan ", "Le ", "Le sa a ", "Let go and haul ", "Logo ", "Lorsqu'", "Lorsque ", "Lè ", "Lè sa a ", "Ma ", "Maar ", "Mais ", "Mais qu'", "Mais que ", "Majd ", "Mając ", "Maka ", "Manawa ", "Mas ", "Men ", "Menawa ", "Mutta ", "Nalika ", "Nalikaning ", "Nanging ", "Nato ", "Nhưng ", "Niin ", "Njuk ", "No ", "Nuair a", "Nuair ba", "Nuair nach", "Nuair nár", "När ", "Når ", "Nə vaxt ki ", "O halda ", "O zaman ", "Och ", "Og ", "Oletetaan ", "Ond ", "Onda ", "Oraz ", "Pak ", "Pero ", "Peru ", "Però ", "Podano ", "Pokiaľ ", "Pokud ", "Potem ", "Potom ", "Privzeto ", "Pryd ", "Quan ", "Quand ", "Quando ", "Sachant ", "Sachant qu'", "Sachant que ", "Se ", "Sed ", "Si ", "Siis ", "Sipoze ", "Sipoze Ke ", "Sipoze ke ", "Soit ", "Stel ", "Så ", "Tad ", "Tada ", "Tak ", "Takrat ", "Tapi ", "Ter ", "Tetapi ", "Tha ", "Tha the ", "Then ", "Thurh ", "Thì ", "Toda ", "Togash ", "Too right ", "Tutaq ki ", "Ukoliko ", "Un ", "Und ", "Ve ", "Vendar ", "Verilir ", "Và ", "Və ", "WEN ", "Wanneer ", "Wenn ", "When ", "Wtedy ", "Wun ", "Y ", "Y'know ", "Ya ", "Yeah nah ", "Yna ", "Youse know like when ", "Youse know when youse got ", "Za date ", "Za dati ", "Za dato ", "Za predpokladu ", "Za předpokladu ", "Zadan ", "Zadani ", "Zadano ", "Zakładając ", "Zakładając, że ", "Zaradi ", "Zatim ", "a ", "an ", "awer ", "dann ", "ghu' noblu' ", "latlh ", "mä ", "qaSDI' ", "ugeholl ", "vaj ", "wann ", "És ", "Étant donné ", "Étant donné qu'", "Étant donné que ", "Étant donnée ", "Étant données ", "Étant donnés ", "Ða ", "Ða ðe ", "Ðurh ", "Þa ", "Þa þe ", "Þegar ", "Þurh ", "Þá ", "Če ", "Şi ", "Əgər ", "Și ", "Όταν ", "Αλλά ", "Δεδομένου ", "Και ", "Τότε ", "І ", "А ", "А також ", "Агар ", "Але ", "Али ", "Аммо ", "Анх ", "Бирок ", "Ва ", "Вә ", "Гэхдээ ", "Дадена ", "Дадено ", "Дано ", "Допустим ", "Если ", "За дате ", "За дати ", "За дато ", "Затем ", "И ", "Иначе ", "К тому же ", "Кад ", "Када ", "Кога ", "Когато ", "Когда ", "Коли ", "Лекин ", "Ләкин ", "Мөн ", "Нехай ", "Но ", "Нәтиҗәдә ", "Онда ", "Припустимо ", "Припустимо, що ", "Пусть ", "Та ", "Также ", "То ", "Тогаш ", "Тогда ", "Тоді ", "Тэгэхэд ", "Тэгээд ", "Унда ", "Харин ", "Хэрэв ", "Якщо ", "Үүний дараа ", "Һәм ", "Әгәр ", "Әйтик ", "Әмма ", "Өгөгдсөн нь ", "Ապա ", "Բայց ", "Դիցուք ", "Եթե ", "Եվ ", "Երբ ", "אבל ", "אז ", "אזי ", "בהינתן ", "וגם ", "כאשר ", "آنگاه ", "اذاً ", "اما ", "اور ", "اگر ", "با فرض ", "بالفرض ", "بفرض ", "تب ", "ثم ", "جب ", "عندما ", "فرض کیا ", "لكن ", "لیکن ", "متى ", "هنگامی ", "و ", "پھر ", "अगर ", "अनी ", "आणि ", "और ", "कदा ", "किन्तु ", "चूंकि ", "जब ", "जर", "जेव्हा ", "तथा ", "तदा ", "तब ", "तर ", "तसेच ", "तेव्हा ", "त्यसपछि ", "दिइएको ", "दिएको ", "दिलेल्या प्रमाणे ", "पण ", "पर ", "परंतु ", "परन्तु ", "मग ", "यदि ", "र ", "ਅਤੇ ", "ਜਦੋਂ ", "ਜਿਵੇਂ ਕਿ ", "ਜੇਕਰ ", "ਤਦ ", "ਪਰ ", "અને ", "આપેલ છે ", "ક્યારે ", "પછી ", "પણ ", "அப்பொழுது ", "ஆனால் ", "எப்போது ", "கொடுக்கப்பட்ட ", "மற்றும் ", "மேலும் ", "అప్పుడు ", "ఈ పరిస్థితిలో ", "కాని ", "చెప్పబడినది ", "మరియు ", "ಆದರೆ ", "ನಂತರ ", "ನೀಡಿದ ", "ಮತ್ತು ", "ಸ್ಥಿತಿಯನ್ನು ", "กำหนดให้ ", "ดังนั้น ", "เมื่อ ", "แต่ ", "และ ", "და", "მაგ­რამ", "მაშინ", "მოცემული", "როდესაც", "かつ", "しかし", "ただし", "ならば", "もし", "並且", "但し", "但是", "假如", "假定", "假設", "假设", "前提", "同时", "同時", "并且", "当", "當", "而且", "那么", "那麼", "그러면", "그리고", "단", "만약", "만일", "먼저", "조건", "하지만", "🎬", "😂", "😐", "😔", "🙏"] + k[:element] = Set.new ["Abstract Scenario", "Abstrakt Scenario", "Achtergrond", "Aer", "Agtergrond", "Antecedentes", "Antecedents", "Atburðarás", "Awww, look mate", "B4", "Background", "Baggrund", "Bakgrund", "Bakgrunn", "Bakgrunnur", "Beispiel", "Beispill", "Bối cảnh", "Caso", "Casu", "Cefndir", "Cenario", "Cenario de Fundo", "Cenário", "Cenário de Fundo", "Contesto", "Context", "Contexte", "Contexto", "Cás", "Cás Achomair", "Cúlra", "Dasar", "Delineacao do Cenario", "Delineação do Cenário", "Dis is what went down", "Dyagram Senaryo", "Dyagram senaryo", "Eixemplo", "Ejemplo", "Eksempel", "Ekzemplo", "Enghraifft", "Esbozo do escenario", "Esbozu del casu", "Escenari", "Escenario", "Esempio", "Esquema de l'escenari", "Esquema del caso", "Esquema del escenario", "Esquema do Cenario", "Esquema do Cenário", "Example", "Exemple", "Exemplo", "Exemplu", "First off", "Fono", "Forgatókönyv", "Forgatókönyv vázlat", "Fundo", "Garis Panduan Senario", "Garis-Besar Skenario", "Geçmiş", "Grundlage", "Hannergrond", "Heave to", "Hintergrund", "Háttér", "Istorik", "Juhtum", "Kazo", "Kazo-skizo", "Keadaan", "Kerangka Keadaan", "Kerangka Senario", "Kerangka Situasi", "Keçmiş", "Khung kịch bản", "Khung tình huống", "Koncept", "Konsep skenario", "Kontekst", "Kontekstas", "Konteksts", "Kontext", "Konturo de la scenaro", "Kontèks", "Kịch bản", "Latar Belakang", "Lýsing Atburðarásar", "Lýsing Dæma", "MISHUN", "MISHUN SRSLY", "Na primer", "Náčrt Scenára", "Náčrt Scenáru", "Náčrt Scénáře", "Nümunə", "Oris scenarija", "Osnova", "Osnova Scenára", "Osnova scénáře", "Osnutek", "Ozadje", "Pavyzdys", "Piemērs", "Plan Senaryo", "Plan du Scénario", "Plan du scénario", "Plan senaryo", "Plang vum Szenario", "Pozadie", "Pozadina", "Pozadí", "Pregled na scenarija", "Primer", "Primjer", "Przykład", "Príklad", "Példa", "Příklad", "Raamjuhtum", "Raamstsenaarium", "Reckon it's like", "Rerefons", "Sampla", "Scenarie", "Scenarij", "Scenarijaus šablonas", "Scenariju", "Scenariju-obris", "Scenarijus", "Scenario", "Scenario Amlinellol", "Scenario Outline", "Scenario Template", "Scenario-outline", "Scenariomal", "Scenariomall", "Scenariu", "Scenariusz", "Scenaro", "Scenár", "Scenārijs", "Scenārijs pēc parauga", "Schema dello scenario", "Scénario", "Scénář", "Senario", "Senaryo", "Senaryo Deskripsyon", "Senaryo deskripsyon", "Senaryo taslağı", "Shiver me timbers", "Situasi", "Situasie", "Situasie Uiteensetting", "Situācija", "Skenario", "Skenario konsep", "Skica", "Skizo", "Sodrzhina", "Ssenari", "Ssenarinin strukturu", "Structura scenariu", "Structură scenariu", "Struktura scenarija", "Stsenaarium", "Swa", "Swa hwaer swa", "Swa hwær swa", "Szablon scenariusza", "Szenarien", "Szenario", "Szenariogrundriss", "Tapaus", "Tapausaihio", "Taust", "Tausta", "The thing of it is", "Tình huống", "Voorbeeld", "Voraussetzungen", "Vorbedingungen", "Wharrimean is", "Yo-ho-ho", "Założenia", "lut", "lut chovnatlh", "mo'", "Ær", "Örnek", "Παράδειγμα", "Περίγραμμα Σεναρίου", "Περιγραφή Σεναρίου", "Σενάριο", "Υπόβαθρο", "Агуулга", "Кереш", "Контекст", "Концепт", "На пример", "Основа", "Передумова", "Позадина", "Преглед на сценарија", "Предистория", "Предыстория", "Приклад", "Пример", "Рамка на сценарий", "Скица", "Содржина", "Структура сценария", "Структура сценарија", "Структура сценарію", "Сценар", "Сценарий", "Сценарий структураси", "Сценарийның төзелеше", "Сценарио", "Сценарын төлөвлөгөө", "Сценарій", "Тарих", "Կոնտեքստ", "Սցենար", "Սցենարի կառուցվացքը", "Օրինակ", "דוגמא", "רקע", "תבנית תרחיש", "תרחיש", "الخلفية", "الگوی سناریو", "زمینه", "سناریو", "سيناريو", "سيناريو مخطط", "مثال", "منظر نامے کا خاکہ", "منظرنامہ", "پس منظر", "परिदृश्य", "परिदृश्य रूपरेखा", "पार्श्वभूमी", "पृष्ठभूमि", "पृष्ठभूमी", "ਉਦਾਹਰਨ", "ਪਟਕਥਾ", "ਪਟਕਥਾ ਢਾਂਚਾ", "ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ", "ਪਿਛੋਕੜ", "ઉદાહરણ", "પરિદ્દશ્ય ઢાંચો", "પરિદ્દશ્ય રૂપરેખા", "બેકગ્રાઉન્ડ", "સ્થિતિ", "உதாரணமாக", "காட்சி", "காட்சி சுருக்கம்", "காட்சி வார்ப்புரு", "பின்னணி", "ఉదాహరణ", "కథనం", "నేపథ్యం", "సన్నివేశం", "ಉದಾಹರಣೆ", "ಕಥಾಸಾರಾಂಶ", "ವಿವರಣೆ", "ಹಿನ್ನೆಲೆ", "สรุปเหตุการณ์", "เหตุการณ์", "แนวคิด", "โครงสร้างของเหตุการณ์", "კონტექსტი", "მაგალითად", "სცენარის", "სცენარის ნიმუში", "シナリオ", "シナリオアウトライン", "シナリオテンプレ", "シナリオテンプレート", "テンプレ", "剧本", "剧本大纲", "劇本", "劇本大綱", "场景", "场景大纲", "場景", "場景大綱", "背景", "배경", "시나리오", "시나리오 개요", "💤", "📕", "📖", "🥒"] + k[:examples] = Set.new ["Atburðarásir", "Beispiele", "Beispiller", "Cenarios", "Cenários", "Conto", "Contoh", "Contone", "Dead men tell no tales", "Dæmi", "Dữ liệu", "EXAMPLZ", "Egzanp", "Eixemplos", "Ejemplos", "Eksempler", "Ekzemploj", "Enghreifftiau", "Esempi", "Examples", "Exempel", "Exemple", "Exemples", "Exemplos", "Juhtumid", "Misal", "Nümunələr", "Paraugs", "Pavyzdžiai", "Piemēri", "Primeri", "Primjeri", "Przykłady", "Príklady", "Példák", "Příklady", "Samplaí", "Scenaria", "Scenarijai", "Scenariji", "Scenarios", "Se the", "Se ðe", "Se þe", "Tapaukset", "Variantai", "Voorbeelde", "Voorbeelden", "You'll wanna", "ghantoH", "lutmey", "Örnekler", "Παραδείγματα", "Σενάρια", "Мисаллар", "Мисоллар", "Приклади", "Примери", "Примеры", "Сценарија", "Сценарији", "Тухайлбал", "Үрнәкләр", "Օրինակներ", "דוגמאות", "امثلة", "مثالیں", "نمونه ها", "उदाहरण", "उदाहरणहरु", "ਉਦਾਹਰਨਾਂ", "ઉદાહરણો", "எடுத்துக்காட்டுகள்", "காட்சிகள்", "நிலைமைகளில்", "ఉదాహరణలు", "ಉದಾಹರಣೆಗಳು", "ชุดของตัวอย่าง", "ชุดของเหตุการณ์", "მაგალითები", "サンプル", "例", "例子", "예", "📓"] + k[:feature] = Set.new ["Ability", "Ahoy matey!", "Arwedd", "Aspekt", "Besigheid Behoefte", "Biznis potreba", "Business Need", "Caracteristica", "Característica", "Carauterística", "Egenskab", "Egenskap", "Eiginleiki", "Feature", "Fitur", "Fonctionnalité", "Fonksyonalite", "Funcionalidade", "Funcionalitat", "Functionalitate", "Functionaliteit", "Funcţionalitate", "Funcționalitate", "Fungsi", "Funkcia", "Funkcija", "Funkcionalitāte", "Funkcionalnost", "Funkcja", "Funksie", "Funktion", "Funktionalität", "Funktionalitéit", "Funzionalità", "Fīča", "Gné", "Hwaet", "Hwæt", "Jellemző", "Karakteristik", "Karakteristika", "Lastnost", "Mak", "Mogucnost", "Mogućnost", "Mozhnost", "Moznosti", "Možnosti", "OH HAI", "Omadus", "Ominaisuus", "Osobina", "Potrzeba biznesowa", "Požadavek", "Požiadavka", "Pretty much", "Qap", "Qu'meH 'ut", "Savybė", "Trajto", "Tính năng", "Vermoë", "Vlastnosť", "Właściwość", "Značilnost", "laH", "perbogh", "poQbogh malja'", "Özellik", "Özəllik", "Δυνατότητα", "Λειτουργία", "Бизнис потреба", "Могућност", "Можност", "Мөмкинлек", "Особина", "Свойство", "Функц", "Функционал", "Функционалност", "Функциональность", "Функция", "Функціонал", "Үзенчәлеклелек", "Հատկություն", "Ֆունկցիոնալություն", "תכונה", "خاصية", "خصوصیت", "صلاحیت", "وِیژگی", "کاروبار کی ضرورت", "रूप लेख", "विशेषता", "वैशिष्ट्य", "सुविधा", "ਖਾਸੀਅਤ", "ਨਕਸ਼ ਨੁਹਾਰ", "ਮੁਹਾਂਦਰਾ", "ક્ષમતા", "લક્ષણ", "વ્યાપાર જરૂર", "அம்சம்", "திறன்", "வணிக தேவை", "గుణము", "ಹೆಚ್ಚಳ", "ความต้องการทางธุรกิจ", "ความสามารถ", "โครงหลัก", "თვისება", "フィーチャ", "功能", "機能", "기능", "📚"] + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/glsl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/glsl.rb new file mode 100644 index 000000000000..aea62eaa0b40 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/glsl.rb @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'c.rb' + + # This file defines the GLSL language lexer to the Rouge + # syntax highlighter. + # + # Author: Sri Harsha Chilakapati + class Glsl < C + tag 'glsl' + filenames '*.glsl', '*.frag', '*.vert', '*.geom', '*.vs', '*.gs', '*.shader' + mimetypes 'x-shader/x-vertex', 'x-shader/x-fragment', 'x-shader/x-geometry' + + title "GLSL" + desc "The GLSL shader language" + + def self.keywords + @keywords ||= Set.new %w( + attribute const uniform varying + layout + centroid flat smooth noperspective + patch sample + break continue do for while switch case default + if else + subroutine + in out inout + invariant + discard return struct precision + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + float double int void bool true false + lowp mediump highp + mat2 mat3 mat4 dmat2 dmat3 dmat4 + mat2x2 mat2x3 mat2x4 dmat2x2 dmat2x3 dmat2x4 + mat3x2 mat3x3 mat3x4 dmat3x2 dmat3x3 dmat3x4 + mat4x2 mat4x3 mat4x4 dmat4x2 dmat4x3 dmat4x4 + vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 dvec2 dvec3 dvec4 + uint uvec2 uvec3 uvec4 + sampler1D sampler2D sampler3D samplerCube + sampler1DShadow sampler2DShadow samplerCubeShadow + sampler1DArray sampler2DArray + sampler1DArrayShadow sampler2DArrayShadow + isampler1D isampler2D isampler3D isamplerCube + isampler1DArray isampler2DArray + usampler1D usampler2D usampler3D usamplerCube + usampler1DArray usampler2DArray + sampler2DRect sampler2DRectShadow isampler2DRect usampler2DRect + samplerBuffer isamplerBuffer usamplerBuffer + sampler2DMS isampler2DMS usampler2DMS + sampler2DMSArray isampler2DMSArray usampler2DMSArray + samplerCubeArray samplerCubeArrayShadow isamplerCubeArray usamplerCubeArray + ) + end + + def self.reserved + @reserved ||= Set.new %w( + common partition active + asm + class union enum typedef template this packed + goto + inline noinline volatile public static extern external interface + long short half fixed unsigned superp + input output + hvec2 hvec3 hvec4 fvec2 fvec3 fvec4 + sampler3DRect + filter + image1D image2D image3D imageCube + iimage1D iimage2D iimage3D iimageCube + uimage1D uimage2D uimage3D uimageCube + image1DArray image2DArray + iimage1DArray iimage2DArray uimage1DArray uimage2DArray + image1DShadow image2DShadow + image1DArrayShadow image2DArrayShadow + imageBuffer iimageBuffer uimageBuffer + sizeof cast + namespace using + row_major + ) + end + + def self.builtins + @builtins ||= Set.new %w( + gl_VertexID gl_InstanceID gl_PerVertex gl_Position gl_PointSize gl_ClipDistance + gl_PrimitiveIDIn gl_InvocationID gl_PrimitiveID gl_Layer gl_ViewportIndex + gl_MaxPatchVertices gl_PatchVerticesIn gl_TessLevelOuter gl_TessLevelInner + gl_TessCoord gl_FragCoord gl_FrontFacing gl_PointCoord gl_SampleID gl_SamplePosition + gl_FragColor gl_FragData gl_MaxDrawBuffers gl_FragDepth gl_SampleMask + gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor + gl_TexCoord gl_FogFragCoord gl_Color gl_SecondaryColor gl_Normal gl_VertexID + gl_MultiTexCord0 gl_MultiTexCord1 gl_MultiTexCord2 gl_MultiTexCord3 + gl_MultiTexCord4 gl_MultiTexCord5 gl_MultiTexCord6 gl_MultiTexCord7 + gl_FogCoord gl_MaxVertexAttribs gl_MaxVertexUniformComponents + gl_MaxVaryingFloats gl_MaxVaryingComponents gl_MaxVertexOutputComponents + gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents + gl_MaxFragmentInputComponents gl_MaxVertexTextureImageUnits + gl_MaxCombinedTextureImageUnits gl_MaxTextureImageUnits + gl_MaxFragmentUniformComponents gl_MaxClipDistances + gl_MaxGeometryTextureImageUnits gl_MaxGeometryUniformComponents + gl_MaxGeometryVaryingComponents gl_MaxTessControlInputComponents + gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits + gl_MaxTessControlUniformComponents gl_MaxTessControlTotalOutputComponents + gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents + gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents + gl_MaxTessPatchComponents gl_MaxTessGenLevel gl_MaxViewports + gl_MaxVertexUniformVectors gl_MaxFragmentUniformVectors gl_MaxVaryingVectors + gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxClipPlanes gl_DepthRange + gl_DepthRangeParameters gl_ModelViewMatrix gl_ProjectionMatrix + gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix + gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse + gl_TextureMatrixInverse gl_ModelViewMatrixTranspose + gl_ModelViewProjectionMatrixTranspose gl_TextureMatrixTranspose + gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose + gl_ModelViewProjectionMatrixInverseTranspose + gl_TextureMatrixInverseTranspose gl_NormalScale gl_ClipPlane gl_PointParameters + gl_Point gl_MaterialParameters gl_FrontMaterial gl_BackMaterial + gl_LightSourceParameters gl_LightSource gl_MaxLights gl_LightModelParameters + gl_LightModel gl_LightModelProducts gl_FrontLightModelProduct + gl_BackLightModelProduct gl_LightProducts gl_FrontLightProduct + gl_BackLightProduct gl_TextureEnvColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR + gl_EyePlaneQ gl_ObjectPlaneS gl_ObjectPlaneT gl_ObjectPlaneR gl_ObjectPlaneQ + gl_FogParameters gl_Fog + ) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/go.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/go.rb new file mode 100644 index 000000000000..62ae519ce7e0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/go.rb @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Go < RegexLexer + title "Go" + desc 'The Go programming language (http://golang.org)' + tag 'go' + aliases 'go', 'golang' + filenames '*.go' + + mimetypes 'text/x-go', 'application/x-go' + + # Characters + + WHITE_SPACE = /\s+/ + + NEWLINE = /\n/ + UNICODE_CHAR = /[^\n]/ + UNICODE_LETTER = /[[:alpha:]]/ + UNICODE_DIGIT = /[[:digit:]]/ + + # Letters and digits + + LETTER = /#{UNICODE_LETTER}|_/ + DECIMAL_DIGIT = /[0-9]/ + OCTAL_DIGIT = /[0-7]/ + HEX_DIGIT = /[0-9A-Fa-f]/ + + # Comments + + LINE_COMMENT = /\/\/(?:(?!#{NEWLINE}).)*/ + GENERAL_COMMENT = /\/\*(?:(?!\*\/).)*\*\//m + COMMENT = /#{LINE_COMMENT}|#{GENERAL_COMMENT}/ + + # Keywords + + KEYWORD = /\b(?: + break | default | func + | interface | select | case + | defer | go | map + | struct | chan | else + | goto | package | switch + | const | fallthrough | if + | range | type | continue + | for | import | return + | var + )\b/x + + # Identifiers + + IDENTIFIER = / (?!#{KEYWORD}) + #{LETTER}(?:#{LETTER}|#{UNICODE_DIGIT})* /x + + # Operators and delimiters + + OPERATOR = / \+= | \+\+ | \+ | &\^= | &\^ + | &= | && | & | == | = + | \!= | \! | -= | -- | - + | \|= | \|\| | \| | <= | <- + | <<= | << | < | \*= | \* + | \^= | \^ | >>= | >> | >= + | > | \/ | \/= | := | % + | %= | \.\.\. | \. | : + /x + + SEPARATOR = / \( | \) | \[ | \] | \{ + | \} | , | ; + /x + + # Integer literals + + DECIMAL_LIT = /[0-9]#{DECIMAL_DIGIT}*/ + OCTAL_LIT = /0#{OCTAL_DIGIT}*/ + HEX_LIT = /0[xX]#{HEX_DIGIT}+/ + INT_LIT = /#{HEX_LIT}|#{DECIMAL_LIT}|#{OCTAL_LIT}/ + + # Floating-point literals + + DECIMALS = /#{DECIMAL_DIGIT}+/ + EXPONENT = /[eE][+\-]?#{DECIMALS}/ + FLOAT_LIT = / #{DECIMALS} \. #{DECIMALS}? #{EXPONENT}? + | #{DECIMALS} #{EXPONENT} + | \. #{DECIMALS} #{EXPONENT}? + /x + + # Imaginary literals + + IMAGINARY_LIT = /(?:#{DECIMALS}|#{FLOAT_LIT})i/ + + # Rune literals + + ESCAPED_CHAR = /\\[abfnrtv\\'"]/ + LITTLE_U_VALUE = /\\u#{HEX_DIGIT}{4}/ + BIG_U_VALUE = /\\U#{HEX_DIGIT}{8}/ + UNICODE_VALUE = / #{UNICODE_CHAR} | #{LITTLE_U_VALUE} + | #{BIG_U_VALUE} | #{ESCAPED_CHAR} + /x + OCTAL_BYTE_VALUE = /\\#{OCTAL_DIGIT}{3}/ + HEX_BYTE_VALUE = /\\x#{HEX_DIGIT}{2}/ + BYTE_VALUE = /#{OCTAL_BYTE_VALUE}|#{HEX_BYTE_VALUE}/ + CHAR_LIT = /'(?:#{UNICODE_VALUE}|#{BYTE_VALUE})'/ + ESCAPE_SEQUENCE = / #{ESCAPED_CHAR} + | #{LITTLE_U_VALUE} + | #{BIG_U_VALUE} + | #{HEX_BYTE_VALUE} + /x + + # String literals + + RAW_STRING_LIT = /`(?:#{UNICODE_CHAR}|#{NEWLINE})*`/ + INTERPRETED_STRING_LIT = / "(?: (?!") + (?: #{UNICODE_VALUE} | #{BYTE_VALUE} ) + )*" /x + STRING_LIT = /#{RAW_STRING_LIT}|#{INTERPRETED_STRING_LIT}/ + + # Predeclared identifiers + + PREDECLARED_TYPES = /\b(?: + bool | byte | complex64 + | complex128 | error | float32 + | float64 | int8 | int16 + | int32 | int64 | int + | rune | string | uint8 + | uint16 | uint32 | uint64 + | uintptr | uint + )\b/x + + PREDECLARED_CONSTANTS = /\b(?:true|false|iota|nil)\b/ + + PREDECLARED_FUNCTIONS = /\b(?: + append | cap | close | complex + | copy | delete | imag | len + | make | new | panic | print + | println | real | recover + )\b/x + + state :simple_tokens do + rule(COMMENT, Comment) + rule(KEYWORD, Keyword) + rule(PREDECLARED_TYPES, Keyword::Type) + rule(PREDECLARED_FUNCTIONS, Name::Builtin) + rule(PREDECLARED_CONSTANTS, Name::Constant) + rule(IMAGINARY_LIT, Num) + rule(FLOAT_LIT, Num) + rule(INT_LIT, Num) + rule(CHAR_LIT, Str::Char) + rule(OPERATOR, Operator) + rule(SEPARATOR, Punctuation) + rule(IDENTIFIER, Name) + rule(WHITE_SPACE, Text) + end + + state :root do + mixin :simple_tokens + + rule(/`/, Str, :raw_string) + rule(/"/, Str, :interpreted_string) + end + + state :interpreted_string do + rule(ESCAPE_SEQUENCE, Str::Escape) + rule(/\\./, Error) + rule(/"/, Str, :pop!) + rule(/[^"\\]+/, Str) + end + + state :raw_string do + rule(/`/, Str, :pop!) + rule(/[^`]+/m, Str) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gradle.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gradle.rb new file mode 100644 index 000000000000..27b5f967eba4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/gradle.rb @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'groovy.rb' + + class Gradle < Groovy + title "Gradle" + desc "A powerful build system for the JVM" + + tag 'gradle' + filenames '*.gradle' + mimetypes 'text/x-gradle' + + def self.keywords + @keywords ||= super + Set.new(%w( + allprojects artifacts buildscript configuration dependencies + repositories sourceSets subprojects publishing + )) + end + + def self.types + @types ||= super + Set.new(%w( + Project Task Gradle Settings Script JavaToolChain SourceSet + SourceSetOutput IncrementalTaskInputs Configuration + ResolutionStrategy ArtifactResolutionQuery ComponentSelection + ComponentSelectionRules ConventionProperty ExtensionAware + ExtraPropertiesExtension PublishingExtension IvyPublication + IvyArtifact IvyArtifactSet IvyModuleDescriptorSpec + MavenPublication MavenArtifact MavenArtifactSet MavenPom + PluginDependenciesSpec PluginDependencySpec ResourceHandler + TextResourceFactory + )) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/graphql.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/graphql.rb new file mode 100644 index 000000000000..e94dce57b644 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/graphql.rb @@ -0,0 +1,261 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class GraphQL < RegexLexer + desc 'GraphQL' + tag 'graphql' + filenames '*.graphql', '*.gql' + mimetypes 'application/graphql' + + name = /[_A-Za-z][_0-9A-Za-z]*/ + + state :root do + rule %r/\b(?:query|mutation|subscription)\b/, Keyword, :query_definition + rule %r/\{/ do + token Punctuation + push :query_definition + push :selection_set + end + + rule %r/\bfragment\b/, Keyword, :fragment_definition + + rule %r/\bscalar\b/, Keyword, :value + + rule %r/\b(?:type|interface|enum)\b/, Keyword, :type_definition + + rule %r/\b(?:input|schema)\b/, Keyword, :type_definition + + rule %r/\bunion\b/, Keyword, :union_definition + + rule %r/\bextend\b/, Keyword + + mixin :basic + + # Markdown descriptions + rule %r/(""")(\n)(.*?)(\n)(""")/m do |m| + token Str::Double, m[1] + token Text::Whitespace, m[2] + delegate Markdown, m[3] + token Text::Whitespace, m[4] + token Str::Double, m[5] + end + end + + state :basic do + rule %r/\s+/m, Text::Whitespace + rule %r/#.*$/, Comment + + rule %r/[!,]/, Punctuation + end + + state :has_directives do + rule %r/(@#{name})(\s*)(\()/ do + groups Keyword, Text::Whitespace, Punctuation + push :arguments + end + rule %r/@#{name}\b/, Keyword + end + + state :fragment_definition do + rule %r/\bon\b/, Keyword + + mixin :query_definition + end + + state :query_definition do + mixin :has_directives + + rule %r/\b#{name}\b/, Name + rule %r/\(/, Punctuation, :variable_definitions + rule %r/\{/, Punctuation, :selection_set + + mixin :basic + end + + state :type_definition do + rule %r/\bimplements\b/, Keyword + rule %r/\b#{name}\b/, Name + rule %r/\(/, Punctuation, :variable_definitions + rule %r/\{/, Punctuation, :type_definition_set + + mixin :basic + end + + state :union_definition do + rule %r/\b#{name}\b/, Name + rule %r/\=/, Punctuation, :union_definition_variant + + mixin :basic + end + + state :union_definition_variant do + rule %r/\b#{name}\b/ do + token Name + pop! + push :union_definition_pipe + end + + mixin :basic + end + + state :union_definition_pipe do + rule %r/\|/ do + token Punctuation + pop! + push :union_definition_variant + end + + rule %r/(?!\||\s+|#[^\n]*)/ do + pop! 2 + end + + mixin :basic + end + + state :type_definition_set do + rule %r/\}/ do + token Punctuation + pop! 2 + end + + rule %r/\b(#{name})(\s*)(\()/ do + groups Name, Text::Whitespace, Punctuation + push :variable_definitions + end + rule %r/\b#{name}\b/, Name + + rule %r/:/, Punctuation, :type_names + + mixin :basic + end + + state :arguments do + rule %r/\)/ do + token Punctuation + pop! + end + + rule %r/\b#{name}\b/, Name + rule %r/:/, Punctuation, :value + + mixin :basic + end + + state :variable_definitions do + rule %r/\)/ do + token Punctuation + pop! + end + + rule %r/\$#{name}\b/, Name::Variable + rule %r/\b#{name}\b/, Name + rule %r/:/, Punctuation, :type_names + rule %r/\=/, Punctuation, :value + + mixin :basic + end + + state :type_names do + rule %r/\b(?:Int|Float|String|Boolean|ID)\b/, Name::Builtin, :pop! + rule %r/\b#{name}\b/, Name, :pop! + + rule %r/\[/, Punctuation, :type_name_list + + mixin :basic + end + + state :type_name_list do + rule %r/\b(?:Int|Float|String|Boolean|ID)\b/, Name::Builtin + rule %r/\b#{name}\b/, Name + + rule %r/\]/ do + token Punctuation + pop! 2 + end + + mixin :basic + end + + state :selection_set do + mixin :has_directives + + rule %r/\}/ do + token Punctuation + pop! + pop! if state?(:query_definition) || state?(:fragment_definition) + end + + rule %r/\b(#{name})(\s*)(\()/ do + groups Name, Text::Whitespace, Punctuation + push :arguments + end + + rule %r/\b(#{name})(\s*)(:)/ do + groups Name, Text::Whitespace, Punctuation + end + + rule %r/\b#{name}\b/, Name + + rule %r/(\.\.\.)(\s+)(on)\b/ do + groups Punctuation, Text::Whitespace, Keyword + end + rule %r/\.\.\./, Punctuation + + rule %r/\{/, Punctuation, :selection_set + + mixin :basic + end + + state :list do + rule %r/\]/ do + token Punctuation + pop! + pop! if state?(:value) + end + + mixin :value + end + + state :object do + rule %r/\}/ do + token Punctuation + pop! + pop! if state?(:value) + end + + rule %r/\b(#{name})(\s*)(:)/ do + groups Name, Text::Whitespace, Punctuation + push :value + end + + mixin :basic + end + + state :value do + pop_unless_list = ->(t) { + ->(m) { + token t + pop! unless state?(:list) + } + } + + # Multiline strings + rule %r/""".*?"""/m, Str::Double + + rule %r/\$#{name}\b/, &pop_unless_list[Name::Variable] + rule %r/\b(?:true|false|null)\b/, &pop_unless_list[Keyword::Constant] + rule %r/[+-]?[0-9]+\.[0-9]+(?:[eE][+-]?[0-9]+)?/, &pop_unless_list[Num::Float] + rule %r/[+-]?[1-9][0-9]*(?:[eE][+-]?[0-9]+)?/, &pop_unless_list[Num::Integer] + rule %r/"(\\[\\"]|[^"])*"/, &pop_unless_list[Str::Double] + rule %r/\b#{name}\b/, &pop_unless_list[Name] + + rule %r/\{/, Punctuation, :object + rule %r/\[/, Punctuation, :list + + mixin :basic + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/groovy.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/groovy.rb new file mode 100644 index 000000000000..81cb16a3b302 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/groovy.rb @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Groovy < RegexLexer + title "Groovy" + desc 'The Groovy programming language (http://www.groovy-lang.org/)' + tag 'groovy' + filenames '*.groovy', 'Jenkinsfile' + mimetypes 'text/x-groovy' + + def self.detect?(text) + return true if text.shebang?(/groovy/) + end + + def self.keywords + @keywords ||= Set.new %w( + assert break case catch continue default do else finally for + if goto instanceof new return switch this throw try while in as + ) + end + + def self.declarations + @declarations ||= Set.new %w( + abstract const enum extends final implements native private + protected public static strictfp super synchronized throws + transient volatile + ) + end + + def self.types + @types ||= Set.new %w( + def boolean byte char double float int long short void + ) + end + + def self.constants + @constants ||= Set.new %w(true false null) + end + + state :root do + rule %r(^ + (\s*(?:\w[\w.\[\]]*\s+)+?) # return arguments + (\w\w*) # method name + (\s*) (\() # signature start + )x do |m| + delegate self.clone, m[1] + token Name::Function, m[2] + token Text, m[3] + token Operator, m[4] + end + + # whitespace + rule %r/[^\S\n]+/, Text + rule %r(//.*?$), Comment::Single + rule %r(/[*].*?[*]/)m, Comment::Multiline + rule %r/@\w[\w.]*/, Name::Decorator + rule %r/(class|interface|trait)\b/, Keyword::Declaration, :class + rule %r/package\b/, Keyword::Namespace, :import + rule %r/import\b/, Keyword::Namespace, :import + + # TODO: highlight backslash escapes + rule %r/""".*?"""/m, Str::Double + rule %r/'''.*?'''/m, Str::Single + + rule %r/"(\\.|\\\n|.)*?"/, Str::Double + rule %r/'(\\.|\\\n|.)*?'/, Str::Single + rule %r(\$/(\$.|.)*?/\$)m, Str + rule %r(/(\\.|\\\n|.)*?/), Str + rule %r/'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'/, Str::Char + rule %r/(\.)([a-zA-Z_][a-zA-Z0-9_]*)/ do + groups Operator, Name::Attribute + end + + rule %r/[a-zA-Z_][a-zA-Z0-9_]*:/, Name::Label + rule %r/[a-zA-Z_\$][a-zA-Z0-9_]*/ do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.declarations.include? m[0] + token Keyword::Declaration + elsif self.class.types.include? m[0] + token Keyword::Type + elsif self.class.constants.include? m[0] + token Keyword::Constant + else + token Name + end + end + + rule %r([~^*!%&\[\](){}<>\|+=:;,./?-]), Operator + + # numbers + rule %r/\d+\.\d+([eE]\d+)?[fd]?/, Num::Float + rule %r/0x[0-9a-f]+/, Num::Hex + rule %r/[0-9]+L?/, Num::Integer + rule %r/\n/, Text + end + + state :class do + rule %r/\s+/, Text + rule %r/\w\w*/, Name::Class, :pop! + end + + state :import do + rule %r/\s+/, Text + rule %r/[\w.]+[*]?/, Name::Namespace, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hack.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hack.rb new file mode 100644 index 000000000000..1e8f8317b52f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hack.rb @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'php.rb' + + class Hack < PHP + title 'Hack' + desc 'The Hack programming language (hacklang.org)' + tag 'hack' + aliases 'hack', 'hh' + filenames '*.php', '*.hh' + + def self.detect?(text) + return true if /<\?hh/ =~ text + return true if text.shebang?('hhvm') + return true if /async function [a-zA-Z]/ =~ text + return true if /\): Awaitable</ =~ text + + return false + end + + def self.keywords + @hh_keywords ||= super.merge Set.new %w( + type newtype enum + as super + async await Awaitable + vec dict keyset + void int string bool float double + arraykey num Stringish + ) + end + + prepend :root do + rule %r/<\?hh(\s*\/\/\s*(strict|decl|partial))?$/, Comment::Preproc, :php + end + + prepend :php do + rule %r((/\*\s*)(HH_(?:IGNORE_ERROR|FIXME)\[\d+\])([^*]*)(\*/)) do + groups Comment::Preproc, Comment::Preproc, Comment::Multiline, Comment::Preproc + end + + rule %r(// UNSAFE(?:_EXPR|_BLOCK)?), Comment::Preproc + rule %r(/\*\s*UNSAFE_EXPR\s*\*/), Comment::Preproc + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/haml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/haml.rb new file mode 100644 index 000000000000..e63486aa8f88 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/haml.rb @@ -0,0 +1,226 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + # A lexer for the Haml templating system for Ruby. + # @see http://haml.info + class Haml < RegexLexer + include Indentation + + title "Haml" + desc "The Haml templating system for Ruby (haml.info)" + + tag 'haml' + aliases 'HAML' + + filenames '*.haml' + mimetypes 'text/x-haml' + + option 'filters[filter_name]', 'Mapping of lexers to use for haml :filters' + attr_reader :filters + # @option opts :filters + # A hash of filter name to lexer of how various filters should be + # highlighted. By default, :javascript, :css, :ruby, and :erb + # are supported. + def initialize(opts={}) + super + + default_filters = { + 'javascript' => Javascript.new(options), + 'css' => CSS.new(options), + 'ruby' => ruby, + 'erb' => ERB.new(options), + 'markdown' => Markdown.new(options), + 'sass' => Sass.new(options), + # TODO + # 'textile' => Textile.new(options), + # 'maruku' => Maruku.new(options), + } + + @filters = hash_option(:filters, default_filters) do |v| + as_lexer(v) || PlainText.new(@options) + end + end + + def ruby + @ruby ||= Ruby.new(@options) + end + + def html + @html ||= HTML.new(@options) + end + + def ruby!(state) + ruby.reset! + push state + end + + start { ruby.reset!; html.reset! } + + identifier = /[\w:-]+/ + ruby_var = /[a-z]\w*/ + + # Haml can include " |\n" anywhere, + # which is ignored and used to wrap long lines. + # To accomodate this, use this custom faux dot instead. + dot = /[ ]\|\n(?=.*[ ]\|)|./ + + state :root do + rule %r/\s*\n/, Text + rule(/\s*/) { |m| token Text; indentation(m[0]) } + end + + state :content do + mixin :css + rule(/%#{identifier}/) { token Name::Tag; goto :tag } + rule %r/!!!#{dot}*\n/, Name::Namespace, :pop! + rule %r( + (/) (\[#{dot}*?\]) (#{dot}*\n) + )x do + groups Comment, Comment::Special, Comment + pop! + end + + rule %r(/#{dot}*\n) do + token Comment + pop! + starts_block :html_comment_block + end + + rule %r/-##{dot}*\n/ do + token Comment + pop! + starts_block :haml_comment_block + end + + rule %r/-/ do + token Punctuation + reset_stack + ruby! :ruby_line + end + + # filters + rule %r/:(#{dot}*)\n/ do |m| + token Name::Decorator + pop! + starts_block :filter_block + + filter_name = m[1].strip + + @filter_lexer = self.filters[filter_name] + @filter_lexer.reset! unless @filter_lexer.nil? + + puts " haml: filter #{filter_name.inspect} #{@filter_lexer.inspect}" if @debug + end + + mixin :eval_or_plain + end + + state :css do + rule(/\.#{identifier}/) { token Name::Class; goto :tag } + rule(/##{identifier}/) { token Name::Function; goto :tag } + end + + state :tag do + mixin :css + rule(/[{]/) { token Punctuation; ruby! :ruby_tag } + rule(/\[#{dot}*?\]/) { delegate ruby } + + rule %r/\(/, Punctuation, :html_attributes + rule %r/\s*\n/, Text, :pop! + + # whitespace chompers + rule %r/[<>]{1,2}(?=[ \t=])/, Punctuation + + mixin :eval_or_plain + end + + state :plain do + rule(/([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/) { delegate html } + mixin :interpolation + rule(/\n/) { token Text; reset_stack } + end + + state :eval_or_plain do + rule %r/[&!]?==/, Punctuation, :plain + rule %r/[&!]?[=!]/ do + token Punctuation + reset_stack + ruby! :ruby_line + end + + rule(//) { push :plain } + end + + state :ruby_line do + rule %r/\n/, Text, :pop! + rule(/,[ \t]*\n/) { delegate ruby } + rule %r/[ ]\|[ \t]*\n/, Str::Escape + rule(/.*?(?=(,$| \|)?[ \t]*$)/) { delegate ruby } + end + + state :ruby_tag do + mixin :ruby_inner + end + + state :html_attributes do + rule %r/\s+/, Text + rule %r/#{identifier}\s*=/, Name::Attribute, :html_attribute_value + rule identifier, Name::Attribute + rule %r/\)/, Text, :pop! + end + + state :html_attribute_value do + rule %r/\s+/, Text + rule ruby_var, Name::Variable, :pop! + rule %r/@#{ruby_var}/, Name::Variable::Instance, :pop! + rule %r/\$#{ruby_var}/, Name::Variable::Global, :pop! + rule %r/'(\\\\|\\'|[^'\n])*'/, Str, :pop! + rule %r/"(\\\\|\\"|[^"\n])*"/, Str, :pop! + end + + state :html_comment_block do + rule %r/#{dot}+/, Comment + mixin :indented_block + end + + state :haml_comment_block do + rule %r/#{dot}+/, Comment::Preproc + mixin :indented_block + end + + state :filter_block do + rule %r/([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do + if @filter_lexer + delegate @filter_lexer + else + token Name::Decorator + end + end + + mixin :interpolation + mixin :indented_block + end + + state :interpolation do + rule %r/#[{]/, Str::Interpol, :ruby + end + + state :ruby do + rule %r/[}]/, Str::Interpol, :pop! + mixin :ruby_inner + end + + state :ruby_inner do + rule(/[{]/) { delegate ruby; push :ruby_inner } + rule(/[}]/) { delegate ruby; pop! } + rule(/[^{}]+/) { delegate ruby } + end + + state :indented_block do + rule(/\n/) { token Text; reset_stack } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/handlebars.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/handlebars.rb new file mode 100644 index 000000000000..81f37d2df9b1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/handlebars.rb @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Handlebars < TemplateLexer + title "Handlebars" + desc 'the Handlebars and Mustache templating languages' + tag 'handlebars' + aliases 'hbs', 'mustache' + filenames '*.handlebars', '*.hbs', '*.mustache' + mimetypes 'text/x-handlebars', 'text/x-mustache' + + id = %r([\w$-]+) + + state :root do + # escaped slashes + rule(/\\{+/) { delegate parent } + + # block comments + rule %r/{{!--/, Comment, :comment + rule %r/{{!.*?}}/, Comment + + rule %r/{{{?/ do + token Keyword + push :stache + push :open_sym + end + + rule(/(.+?)(?=\\|{{)/m) do + delegate parent + + # if parent state is attr, then we have an html attribute without quotes + # pop the parent state to return to the tag state + if parent.state?('attr') + parent.pop! + end + end + + # if we get here, there's no more mustache tags, so we eat + # the rest of the doc + rule(/.+/m) { delegate parent } + end + + state :comment do + rule(/{{/) { token Comment; push } + rule(/}}/) { token Comment; pop! } + rule(/[^{}]+/m) { token Comment } + rule(/[{}]/) { token Comment } + end + + state :stache do + rule %r/}}}?/, Keyword, :pop! + rule %r/\|/, Punctuation + rule %r/~/, Keyword + rule %r/\s+/m, Text + rule %r/[=]/, Operator + rule %r/[\[\]]/, Punctuation + rule %r/[\(\)]/, Punctuation + rule %r/[.](?=[}\s])/, Name::Variable + rule %r/[.][.]/, Name::Variable + rule %r([/.]), Punctuation + rule %r/"(\\.|.)*?"/, Str::Double + rule %r/'(\\.|.)*?'/, Str::Single + rule %r/\d+(?=}\s)/, Num + rule %r/(true|false)(?=[}\s])/, Keyword::Constant + rule %r/else(?=[}\s])/, Keyword + rule %r/this(?=[}\s])/, Name::Builtin::Pseudo + rule %r/@#{id}/, Name::Attribute + rule id, Name::Variable + end + + state :open_sym do + rule %r([#/]) do + token Keyword + goto :block_name + end + + rule %r/[>^&~]/, Keyword + + rule(//) { pop! } + end + + state :block_name do + rule %r/if(?=[}\s])/, Keyword + rule id, Name::Namespace, :pop! + rule(//) { pop! } + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/haskell.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/haskell.rb new file mode 100644 index 000000000000..6891847d15fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/haskell.rb @@ -0,0 +1,207 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Haskell < RegexLexer + title "Haskell" + desc "The Haskell programming language (haskell.org)" + + tag 'haskell' + aliases 'hs' + filenames '*.hs', '*.hs-boot' + mimetypes 'text/x-haskell' + + def self.detect?(text) + return true if text.shebang?('runhaskell') + end + + reserved = %w( + _ case class data default deriving do else if in infix infixl infixr + instance let newtype of then type where + ) + + ascii = %w( + NUL SOH [SE]TX EOT ENQ ACK BEL BS HT LF VT FF CR S[OI] DLE + DC[1-4] NAK SYN ETB CAN EM SUB ESC [FGRU]S SP DEL + ) + + state :basic do + rule %r/\s+/m, Text + rule %r/{-#/, Comment::Preproc, :comment_preproc + rule %r/{-/, Comment::Multiline, :comment + rule %r/^--\s+\|.*?$/, Comment::Doc + # this is complicated in order to support custom symbols + # like --> + rule %r/--(?![!#\$\%&*+.\/<=>?@\^\|_~]).*?$/, Comment::Single + end + + # nested commenting + state :comment do + rule %r/-}/, Comment::Multiline, :pop! + rule %r/{-/, Comment::Multiline, :comment + rule %r/[^-{}]+/, Comment::Multiline + rule %r/[-{}]/, Comment::Multiline + end + + state :comment_preproc do + rule %r/-}/, Comment::Preproc, :pop! + rule %r/{-/, Comment::Preproc, :comment + rule %r/[^-{}]+/, Comment::Preproc + rule %r/[-{}]/, Comment::Preproc + end + + state :root do + mixin :basic + + rule %r/'(?=(?:.|\\\S+)')/, Str::Char, :character + rule %r/"/, Str, :string + + rule %r/\d+e[+-]?\d+/i, Num::Float + rule %r/\d+\.\d+(e[+-]?\d+)?/i, Num::Float + rule %r/0o[0-7]+/i, Num::Oct + rule %r/0x[\da-f]+/i, Num::Hex + rule %r/\d+/, Num::Integer + + rule %r/[\w']+/ do |m| + match = m[0] + if match == "import" + token Keyword::Reserved + push :import + elsif match == "module" + token Keyword::Reserved + push :module + elsif reserved.include?(match) + token Keyword::Reserved + elsif match =~ /\A'?[A-Z]/ + token Keyword::Type + else + token Name + end + end + + # lambda operator + rule %r(\\(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Name::Function + # special operators + rule %r((<-|::|->|=>|=)(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Operator + # constructor/type operators + rule %r(:[:!#\$\%&*+.\\/<=>?@^\|~-]*), Operator + # other operators + rule %r([:!#\$\%&*+.\\/<=>?@^\|~-]+), Operator + + rule %r/\[\s*\]/, Keyword::Type + rule %r/\(\s*\)/, Name::Builtin + + # Quasiquotations + rule %r/(\[)([_a-z][\w']*)(\|)/ do |m| + token Operator, m[1] + token Name, m[2] + token Operator, m[3] + push :quasiquotation + end + + rule %r/[\[\](),;`{}]/, Punctuation + end + + state :import do + rule %r/\s+/, Text + rule %r/"/, Str, :string + rule %r/\bqualified\b/, Keyword + # import X as Y + rule %r/([A-Z][\w.]*)(\s+)(as)(\s+)([A-Z][a-zA-Z0-9_.]*)/ do + groups( + Name::Namespace, # X + Text, Keyword, # as + Text, Name # Y + ) + pop! + end + + # import X hiding (functions) + rule %r/([A-Z][\w.]*)(\s+)(hiding)(\s+)(\()/ do + groups( + Name::Namespace, # X + Text, Keyword, # hiding + Text, Punctuation # ( + ) + goto :funclist + end + + # import X (functions) + rule %r/([A-Z][\w.]*)(\s+)(\()/ do + groups( + Name::Namespace, # X + Text, + Punctuation # ( + ) + goto :funclist + end + + rule %r/[\w.]+/, Name::Namespace, :pop! + end + + state :module do + rule %r/\s+/, Text + # module Foo (functions) + rule %r/([A-Z][\w.]*)(\s+)(\()/ do + groups Name::Namespace, Text, Punctuation + push :funclist + end + + rule %r/\bwhere\b/, Keyword::Reserved, :pop! + + rule %r/[A-Z][a-zA-Z0-9_.]*/, Name::Namespace, :pop! + end + + state :funclist do + mixin :basic + rule %r/[A-Z]\w*/, Keyword::Type + rule %r/(_[\w\']+|[a-z][\w\']*)/, Name::Function + rule %r/,/, Punctuation + rule %r/[:!#\$\%&*+.\\\/<=>?@^\|~-]+/, Operator + rule %r/\(/, Punctuation, :funclist + rule %r/\)/, Punctuation, :pop! + end + + state :character do + rule %r/\\/ do + token Str::Escape + goto :character_end + push :escape + end + + rule %r/./ do + token Str::Char + goto :character_end + end + end + + state :character_end do + rule %r/'/, Str::Char, :pop! + rule %r/./, Error, :pop! + end + + state :quasiquotation do + rule %r/\|\]/, Operator, :pop! + rule %r/[^\|]+/m, Text + rule %r/\|/, Text + end + + state :string do + rule %r/"/, Str, :pop! + rule %r/\\/, Str::Escape, :escape + rule %r/[^\\"]+/, Str + end + + state :escape do + rule %r/[abfnrtv"'&\\]/, Str::Escape, :pop! + rule %r/\^[\]\[A-Z@\^_]/, Str::Escape, :pop! + rule %r/#{ascii.join('|')}/, Str::Escape, :pop! + rule %r/o[0-7]+/i, Str::Escape, :pop! + rule %r/x[\da-f]+/i, Str::Escape, :pop! + rule %r/\d+/, Str::Escape, :pop! + rule %r/\s+\\/, Str::Escape, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/haxe.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/haxe.rb new file mode 100644 index 000000000000..df2c73b45459 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/haxe.rb @@ -0,0 +1,246 @@ +# -*- coding: utf-8 -*- # + +module Rouge + module Lexers + class Haxe < RegexLexer + title "Haxe" + desc "Haxe Cross-platform Toolkit (http://haxe.org)" + + tag 'haxe' + aliases 'hx', 'haxe' + filenames '*.hx' + mimetypes 'text/haxe', 'text/x-haxe', 'text/x-hx' + + def self.detect?(text) + return true if text.shebang? "haxe" + end + + def self.keywords + @keywords ||= Set.new %w( + break case cast catch class continue default do else enum false for + function if import interface macro new null override package private + public return switch this throw true try untyped while + ) + end + + def self.imports + @imports ||= Set.new %w( + import using + ) + end + + def self.declarations + @declarations ||= Set.new %w( + abstract dynamic extern extends from implements inline static to + typedef var + ) + end + + def self.reserved + @reserved ||= Set.new %w( + super trace inline build autoBuild enum + ) + end + + def self.constants + @constants ||= Set.new %w(true false null) + end + + def self.builtins + @builtins ||= %w( + Void Dynamic Math Class Any Float Int UInt String StringTools Sys + EReg isNaN parseFloat parseInt this Array Map Date DateTools Bool + Lambda Reflect Std File FileSystem + ) + end + + id = /[$a-zA-Z_][a-zA-Z0-9_]*/ + + state :comments_and_whitespace do + rule %r/\s+/, Text + rule %r(//.*?$), Comment::Single + rule %r(/\*.*?\*/)m, Comment::Multiline + end + + state :expr_start do + mixin :comments_and_whitespace + + rule %r/#(?:if|elseif|else|end).*/, Comment::Preproc + + rule %r(~) do + token Str::Regex + goto :regex + end + + rule %r/[{]/, Punctuation, :object + + rule %r//, Text, :pop! + end + + state :regex do + rule %r(/) do + token Str::Regex + goto :regex_end + end + + rule %r([^/]\n), Error, :pop! + + rule %r/\n/, Error, :pop! + rule %r/\[\^/, Str::Escape, :regex_group + rule %r/\[/, Str::Escape, :regex_group + rule %r/\\./, Str::Escape + rule %r{[(][?][:=<!]}, Str::Escape + rule %r/[{][\d,]+[}]/, Str::Escape + rule %r/[()?]/, Str::Escape + rule %r/./, Str::Regex + end + + state :regex_end do + rule %r/[gim]+/, Str::Regex, :pop! + rule(//) { pop! } + end + + state :regex_group do + # specially highlight / in a group to indicate that it doesn't + # close the regex + rule %r/\//, Str::Escape + + rule %r([^/]\n) do + token Error + pop! 2 + end + + rule %r/\]/, Str::Escape, :pop! + rule %r/\\./, Str::Escape + rule %r/./, Str::Regex + end + + state :bad_regex do + rule %r/[^\n]+/, Error, :pop! + end + + state :root do + rule %r/\n/, Text, :statement + rule %r(\{), Punctuation, :expr_start + + mixin :comments_and_whitespace + + rule %r/@/, Name::Decorator, :metadata + rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >> | == + | != )x, + Operator, :expr_start + rule %r([-:<>+*%&|\^/!=]=?), Operator, :expr_start + rule %r/[(\[,]/, Punctuation, :expr_start + rule %r/;/, Punctuation, :statement + rule %r/[)\]}.]/, Punctuation + + rule %r/[?]/ do + token Punctuation + push :ternary + push :expr_start + end + + rule id do |m| + if self.class.keywords.include? m[0] + token Keyword + push :expr_start + elsif self.class.imports.include? m[0] + token Keyword + push :namespace + elsif self.class.declarations.include? m[0] + token Keyword::Declaration + push :expr_start + elsif self.class.reserved.include? m[0] + token Keyword::Reserved + elsif self.class.constants.include? m[0] + token Keyword::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Other + end + end + + rule %r/\-?\d+\.\d+(?:[eE]\d+)?[fd]?/, Num::Float + rule %r/0x\h+/, Num::Hex + rule %r/\-?[0-9]+/, Num::Integer + rule %r/"/, Str::Double, :str_double + rule %r/'/, Str::Single, :str_single + end + + # braced parts that aren't object literals + state :statement do + rule %r/(#{id})(\s*)(:)/ do + groups Name::Label, Text, Punctuation + end + + mixin :expr_start + end + + # object literals + state :object do + mixin :comments_and_whitespace + rule %r/[}]/ do + token Punctuation + goto :statement + end + + rule %r/(#{id})(\s*)(:)/ do + groups Name::Attribute, Text, Punctuation + push :expr_start + end + + rule %r/:/, Punctuation + mixin :root + end + + state :metadata do + rule %r/(#{id})(\()?/ do |m| + groups Name::Decorator, Punctuation + pop! unless m[2] + end + rule %r/:#{id}(?:\.#{id})*/, Name::Decorator, :pop! + rule %r/\)/, Name::Decorator, :pop! + mixin :root + end + + # ternary expressions, where <id>: is not a label! + state :ternary do + rule %r/:/ do + token Punctuation + goto :expr_start + end + + mixin :root + end + + state :str_double do + mixin :str_escape + rule %r/"/, Str::Double, :pop! + rule %r/[^\\"]+/, Str::Double + end + + state :str_single do + mixin :str_escape + rule %r/'/, Str::Single, :pop! + rule %r/\$\$/, Str::Single + rule %r/\$#{id}/, Str::Interpol + rule %r/\$\{/, Str::Interpol, :str_interpol + rule %r/[^\\$']+/, Str::Single + end + + state :str_escape do + rule %r/\\[\\tnr'"]/, Str::Escape + rule %r/\\[0-7]{3}/, Str::Escape + rule %r/\\x\h{2}/, Str::Escape + rule %r/\\u\h{4}/, Str::Escape + rule %r/\\u\{\h{1,6}\}/, Str::Escape + end + + state :str_interpol do + rule %r/\}/, Str::Interpol, :pop! + mixin :root + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hcl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hcl.rb new file mode 100644 index 000000000000..347ee5bfd0ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hcl.rb @@ -0,0 +1,163 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Hcl < RegexLexer + tag 'hcl' + + title 'Hashicorp Configuration Language' + desc 'Hashicorp Configuration Language, used by Terraform and other Hashicorp tools' + + state :multiline_comment do + rule %r([*]/), Comment::Multiline, :pop! + rule %r([^*/]+), Comment::Multiline + rule %r([*/]), Comment::Multiline + end + + state :comments_and_whitespace do + rule %r/\s+/, Text + rule %r(//.*?$), Comment::Single + rule %r(#.*?$), Comment::Single + rule %r(/[*]), Comment::Multiline, :multiline_comment + end + + state :primitives do + rule %r/[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?([kKmMgG]b?)?/, Num::Float + rule %r/[0-9]+([kKmMgG]b?)?/, Num::Integer + + rule %r/"/, Str::Double, :dq + rule %r/'/, Str::Single, :sq + rule %r/(<<-?)(\s*)(\'?)(\\?)(\w+)(\3)/ do |m| + groups Operator, Text, Str::Heredoc, Str::Heredoc, Name::Constant, Str::Heredoc + @heredocstr = Regexp.escape(m[5]) + push :heredoc + end + end + + def self.keywords + @keywords ||= Set.new %w() + end + + def self.declarations + @declarations ||= Set.new %w() + end + + def self.reserved + @reserved ||= Set.new %w() + end + + def self.constants + @constants ||= Set.new %w(true false null) + end + + def self.builtins + @builtins ||= %w() + end + + id = /[$a-z_][a-z0-9_]*/io + + state :root do + mixin :comments_and_whitespace + mixin :primitives + + rule %r/\{/ do + token Punctuation + push :hash + end + rule %r/\[/ do + token Punctuation + push :array + end + + rule id do |m| + if self.class.keywords.include? m[0] + token Keyword + push :composite + elsif self.class.declarations.include? m[0] + token Keyword::Declaration + push :composite + elsif self.class.reserved.include? m[0] + token Keyword::Reserved + elsif self.class.constants.include? m[0] + token Keyword::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Other + push :composite + end + end + end + + state :composite do + mixin :comments_and_whitespace + + rule %r/[{]/ do + token Punctuation + pop! + push :hash + end + + rule %r/[\[]/ do + token Punctuation + pop! + push :array + end + + mixin :root + + rule %r//, Text, :pop! + end + + state :hash do + mixin :comments_and_whitespace + + rule %r/\=/, Punctuation + rule %r/\}/, Punctuation, :pop! + + mixin :root + end + + state :array do + mixin :comments_and_whitespace + + rule %r/,/, Punctuation + rule %r/\]/, Punctuation, :pop! + + mixin :root + end + + state :dq do + rule %r/[^\\"]+/, Str::Double + rule %r/\\"/, Str::Escape + rule %r/"/, Str::Double, :pop! + end + + state :sq do + rule %r/[^\\']+/, Str::Single + rule %r/\\'/, Str::Escape + rule %r/'/, Str::Single, :pop! + end + + state :heredoc do + rule %r/\n/, Str::Heredoc, :heredoc_nl + rule %r/[^$\n]+/, Str::Heredoc + rule %r/[$]/, Str::Heredoc + end + + state :heredoc_nl do + rule %r/\s*(\w+)\s*\n/ do |m| + if m[1] == @heredocstr + token Name::Constant + pop! 2 + else + token Str::Heredoc + end + end + + rule(//) { pop! } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hlsl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hlsl.rb new file mode 100644 index 000000000000..8fac6fa86e99 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hlsl.rb @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'c.rb' + + class HLSL < C + title "HLSL" + desc "HLSL, the High Level Shading Language for DirectX (docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl)" + tag 'hlsl' + filenames '*.hlsl', '*.hlsli' + mimetypes 'text/x-hlsl' + + def self.keywords + @keywords ||= Set.new %w( + asm asm_fragment break case cbuffer centroid class column_major + compile compile_fragment const continue default discard do else export + extern for fxgroup globallycoherent groupshared if in inline inout + interface line lineadj linear namespace nointerpolation noperspective + NULL out packoffset pass pixelfragment point precise return register + row_major sample sampler shared stateblock stateblock_state static + struct switch tbuffer technique technique10 technique11 texture + typedef triangle uniform vertexfragment volatile while + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + dword matrix snorm string unorm unsigned void vector BlendState Buffer + ByteAddressBuffer ComputeShader DepthStencilState DepthStencilView + DomainShader GeometryShader HullShader InputPatch LineStream + OutputPatch PixelShader PointStream RasterizerState RenderTargetView + RasterizerOrderedBuffer RasterizerOrderedByteAddressBuffer + RasterizerOrderedStructuredBuffer RasterizerOrderedTexture1D + RasterizerOrderedTexture1DArray RasterizerOrderedTexture2D + RasterizerOrderedTexture2DArray RasterizerOrderedTexture3D RWBuffer + RWByteAddressBuffer RWStructuredBuffer RWTexture1D RWTexture1DArray + RWTexture2D RWTexture2DArray RWTexture3D SamplerState + SamplerComparisonState StructuredBuffer Texture1D Texture1DArray + Texture2D Texture2DArray Texture2DMS Texture2DMSArray Texture3D + TextureCube TextureCubeArray TriangleStream VertexShader + + bool1 bool2 bool3 bool4 BOOL1 BOOL2 BOOL3 BOOL4 + int1 int2 int3 int4 + half1 half2 half3 half4 + float1 float2 float3 float4 + double1 double2 double3 double4 + + bool1x1 bool1x2 bool1x3 bool1x4 bool2x1 bool2x2 bool2x3 bool2x4 + bool3x1 bool3x2 bool3x3 bool3x4 bool4x1 bool4x2 bool4x3 bool4x4 + BOOL1x1 BOOL1x2 BOOL1x3 BOOL1x4 BOOL2x1 BOOL2x2 BOOL2x3 BOOL2x4 + BOOL3x1 BOOL3x2 BOOL3x3 BOOL3x4 BOOL4x1 BOOL4x2 BOOL4x3 BOOL4x4 + half1x1 half1x2 half1x3 half1x4 half2x1 half2x2 half2x3 half2x4 + half3x1 half3x2 half3x3 half3x4 half4x1 half4x2 half4x3 half4x4 + int1x1 int1x2 int1x3 int1x4 int2x1 int2x2 int2x3 int2x4 + int3x1 int3x2 int3x3 int3x4 int4x1 int4x2 int4x3 int4x4 + float1x1 float1x2 float1x3 float1x4 float2x1 float2x2 float2x3 float2x4 + float3x1 float3x2 float3x3 float3x4 float4x1 float4x2 float4x3 float4x4 + double1x1 double1x2 double1x3 double1x4 double2x1 double2x2 double2x3 double2x4 + double3x1 double3x2 double3x3 double3x4 double4x1 double4x2 double4x3 double4x4 + ) + end + + def self.reserved + @reserved ||= Set.new %w( + auto catch char const_cast delete dynamic_cast enum explicit friend + goto long mutable new operator private protected public + reinterpret_cast short signed sizeof static_cast template this throw + try typename union unsigned using virtual + ) + end + + def self.builtins + @builtins ||= Set.new %w( + abort abs acos all AllMemoryBarrier AllMemoryBarrierWithGroupSync any + AppendStructuredBuffer asdouble asfloat asin asint asuint asuint atan + atan2 ceil CheckAccessFullyMapped clamp clip CompileShader + ConsumeStructuredBuffer cos cosh countbits cross D3DCOLORtoUBYTE4 ddx + ddx_coarse ddx_fine ddy ddy_coarse ddy_fine degrees determinant + DeviceMemoryBarrier DeviceMemoryBarrierWithGroupSync distance dot dst + errorf EvaluateAttributeAtCentroid EvaluateAttributeAtSample + EvaluateAttributeSnapped exp exp2 f16tof32 f32tof16 faceforward + firstbithigh firstbitlow floor fma fmod frac frexp fwidth + GetRenderTargetSampleCount GetRenderTargetSamplePosition + GlobalOrderedCountIncrement GroupMemoryBarrier + GroupMemoryBarrierWithGroupSync InterlockedAdd InterlockedAnd + InterlockedCompareExchange InterlockedCompareStore InterlockedExchange + InterlockedMax InterlockedMin InterlockedOr InterlockedXor isfinite + isinf isnan ldexp length lerp lit log log10 log2 mad max min modf + msad4 mul noise normalize pow printf Process2DQuadTessFactorsAvg + Process2DQuadTessFactorsMax Process2DQuadTessFactorsMin + ProcessIsolineTessFactors ProcessQuadTessFactorsAvg + ProcessQuadTessFactorsMax ProcessQuadTessFactorsMin + ProcessTriTessFactorsAvg ProcessTriTessFactorsMax + ProcessTriTessFactorsMin QuadReadLaneAt QuadSwapX QuadSwapY radians + rcp reflect refract reversebits round rsqrt saturate sign sin sincos + sinh smoothstep sqrt step tan tanh tex1D tex1D tex1Dbias tex1Dgrad + tex1Dlod tex1Dproj tex2D tex2D tex2Dbias tex2Dgrad tex2Dlod tex2Dproj + tex3D tex3D tex3Dbias tex3Dgrad tex3Dlod tex3Dproj texCUBE texCUBE + texCUBEbias texCUBEgrad texCUBElod texCUBEproj transpose trunc + WaveAllBitAnd WaveAllMax WaveAllMin WaveAllBitOr WaveAllBitXor + WaveAllEqual WaveAllProduct WaveAllSum WaveAllTrue WaveAnyTrue + WaveBallot WaveGetLaneCount WaveGetLaneIndex WaveGetOrderedIndex + WaveIsHelperLane WaveOnce WavePrefixProduct WavePrefixSum + WaveReadFirstLane WaveReadLaneAt + + SV_CLIPDISTANCE SV_CLIPDISTANCE0 SV_CLIPDISTANCE1 SV_CULLDISTANCE + SV_CULLDISTANCE0 SV_CULLDISTANCE1 SV_COVERAGE SV_DEPTH + SV_DEPTHGREATEREQUAL SV_DEPTHLESSEQUAL SV_DISPATCHTHREADID + SV_DOMAINLOCATION SV_GROUPID SV_GROUPINDEX SV_GROUPTHREADID + SV_GSINSTANCEID SV_INNERCOVERAGE SV_INSIDETESSFACTOR SV_INSTANCEID + SV_ISFRONTFACE SV_OUTPUTCONTROLPOINTID SV_POSITION SV_PRIMITIVEID + SV_RENDERTARGETARRAYINDEX SV_SAMPLEINDEX SV_STENCILREF SV_TESSFACTOR + SV_VERTEXID SV_VIEWPORTARRAYINDEX + + allow_uav_condition branch call domain earlydepthstencil fastopt + flatten forcecase instance loop maxtessfactor numthreads + outputcontrolpoints outputtopology partitioning patchconstantfunc + unroll + + BINORMAL BINORMAL0 BINORMAL1 BINORMAL2 BINORMAL3 BINORMAL4 + BLENDINDICES0 BLENDINDICES1 BLENDINDICES2 BLENDINDICES3 BLENDINDICES4 + BLENDWEIGHT0 BLENDWEIGHT1 BLENDWEIGHT2 BLENDWEIGHT3 BLENDWEIGHT4 COLOR + COLOR0 COLOR1 COLOR2 COLOR3 COLOR4 NORMAL NORMAL0 NORMAL1 NORMAL2 + NORMAL3 NORMAL4 POSITION POSITION0 POSITION1 POSITION2 POSITION3 + POSITION4 POSITIONT PSIZE0 PSIZE1 PSIZE2 PSIZE3 PSIZE4 TANGENT + TANGENT0 TANGENT1 TANGENT2 TANGENT3 TANGENT4 TESSFACTOR0 TESSFACTOR1 + TESSFACTOR2 TESSFACTOR3 TESSFACTOR4 TEXCOORD0 TEXCOORD1 TEXCOORD2 + TEXCOORD3 TEXCOORD4 + + FOG PSIZE + + VFACE VPOS + + DEPTH0 DEPTH1 DEPTH2 DEPTH3 DEPTH4 + ) + end + + ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+) + id = /[a-zA-Z_][a-zA-Z0-9_]*/ + + state :root do + mixin :expr_whitespace + rule %r( + ([\w*\s]+?[\s*]) # return arguments + (#{id}) # function name + (\s*\([^;]*?\)(?:\s*:\s+#{id})?) # signature + (#{ws}?)({|;) # open brace or semicolon + )mx do |m| + # This is copied from the C lexer + recurse m[1] + token Name::Function, m[2] + recurse m[3] + recurse m[4] + token Punctuation, m[5] + if m[5] == ?{ + push :function + end + end + rule %r/\{/, Punctuation, :function + mixin :statements + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hocon.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hocon.rb new file mode 100644 index 000000000000..881a969a00da --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hocon.rb @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'json.rb' + + class HOCON < JSON + title 'HOCON' + desc "Human-Optimized Config Object Notation (https://github.com/lightbend/config)" + tag 'hocon' + filenames '*.hocon' + + state :comments do + # Comments + rule %r(//.*?$), Comment::Single + rule %r(#.*?$), Comment::Single + end + + prepend :root do + mixin :comments + end + + prepend :object do + # Keywords + rule %r/\b(?:include|url|file|classpath)\b/, Keyword + end + + state :name do + rule %r/("(?:\"|[^"\n])*?")(\s*)([:=]|(?={))/ do + groups Name::Label, Text::Whitespace, Punctuation + end + + rule %r/([-\w.]+)(\s*)([:=]|(?={))/ do + groups Name::Label, Text::Whitespace, Punctuation + end + end + + state :value do + mixin :comments + + rule %r/\n/, Text::Whitespace + rule %r/\s+/, Text::Whitespace + + mixin :constants + + # Interpolation + rule %r/[$][{][?]?/, Literal::String::Interpol, :interpolation + + # Strings + rule %r/"""/, Literal::String::Double, :multiline_string + rule %r/"/, Str::Double, :string + + rule %r/\[/, Punctuation, :array + rule %r/{/, Punctuation, :object + + # Symbols (only those not handled by JSON) + rule %r/[()=]/, Punctuation + + # Values + rule %r/[^$"{}\[\]:=,\+#`^?!@*&]+?/, Literal + end + + state :interpolation do + rule %r/[\w\-\.]+?/, Name::Variable + rule %r/}/, Literal::String::Interpol, :pop! + end + + prepend :string do + rule %r/[$][{][?]?/, Literal::String::Interpol, :interpolation + rule %r/[^\\"\${]+/, Literal::String::Double + end + + state :multiline_string do + rule %r/"[^"]{1,2}/, Literal::String::Double + mixin :string + rule %r/"""/, Literal::String::Double, :pop! + end + + prepend :constants do + # Numbers (handle the case where we have multiple periods, ie. IP addresses) + rule %r/\d+\.(\d+\.?){3,}/, Literal + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hql.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hql.rb new file mode 100644 index 000000000000..ba7dab474a83 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hql.rb @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- # + +module Rouge + module Lexers + load_lexer 'sql.rb' + + class HQL < SQL + title "HQL" + desc "Hive Query Language SQL dialect" + tag 'hql' + filenames '*.hql' + + def self.keywords + # sources: + # https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL + # https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF + @keywords ||= Set.new(%w( + ADD ADMIN AFTER ANALYZE ARCHIVE ASC BEFORE BUCKET BUCKETS CASCADE + CHANGE CLUSTER CLUSTERED CLUSTERSTATUS COLLECTION COLUMNS COMMENT + COMPACT COMPACTIONS COMPUTE CONCATENATE CONTINUE DATA DATABASES + DATETIME DAY DBPROPERTIES DEFERRED DEFINED DELIMITED DEPENDENCY DESC + DIRECTORIES DIRECTORY DISABLE DISTRIBUTE ELEM_TYPE ENABLE ESCAPED + EXCLUSIVE EXPLAIN EXPORT FIELDS FILE FILEFORMAT FIRST FORMAT FORMATTED + FUNCTIONS HOLD_DDLTIME HOUR IDXPROPERTIES IGNORE INDEX INDEXES INPATH + INPUTDRIVER INPUTFORMAT ITEMS JAR KEYS KEY_TYPE LIMIT LINES LOAD + LOCATION LOCK LOCKS LOGICAL LONG MAPJOIN MATERIALIZED METADATA MINUS + MINUTE MONTH MSCK NOSCAN NO_DROP OFFLINE OPTION OUTPUTDRIVER + OUTPUTFORMAT OVERWRITE OWNER PARTITIONED PARTITIONS PLUS PRETTY + PRINCIPALS PROTECTION PURGE READ READONLY REBUILD RECORDREADER + RECORDWRITER REGEXP RELOAD RENAME REPAIR REPLACE REPLICATION RESTRICT + REWRITE RLIKE ROLE ROLES SCHEMA SCHEMAS SECOND SEMI SERDE + SERDEPROPERTIES SERVER SETS SHARED SHOW SHOW_DATABASE SKEWED SORT + SORTED SSL STATISTICS STORED STREAMTABLE STRING STRUCT TABLES + TBLPROPERTIES TEMPORARY TERMINATED TINYINT TOUCH TRANSACTIONS UNARCHIVE + UNDO UNIONTYPE UNLOCK UNSET UNSIGNED URI USE UTC UTCTIMESTAMP + VALUE_TYPE VIEW WHILE YEAR IF + + ALL ALTER AND ARRAY AS AUTHORIZATION BETWEEN BIGINT BINARY BOOLEAN + BOTH BY CASE CAST CHAR COLUMN CONF CREATE CROSS CUBE CURRENT + CURRENT_DATE CURRENT_TIMESTAMP CURSOR DATABASE DATE DECIMAL DELETE + DESCRIBE DISTINCT DOUBLE DROP ELSE END EXCHANGE EXISTS EXTENDED + EXTERNAL FALSE FETCH FLOAT FOLLOWING FOR FROM FULL FUNCTION GRANT + GROUP GROUPING HAVING IF IMPORT IN INNER INSERT INT INTERSECT + INTERVAL INTO IS JOIN LATERAL LEFT LESS LIKE LOCAL MACRO MAP MORE + NONE NOT NULL OF ON OR ORDER OUT OUTER OVER PARTIALSCAN PARTITION + PERCENT PRECEDING PRESERVE PROCEDURE RANGE READS REDUCE REVOKE RIGHT + ROLLUP ROW ROWS SELECT SET SMALLINT TABLE TABLESAMPLE THEN TIMESTAMP + TO TRANSFORM TRIGGER TRUE TRUNCATE UNBOUNDED UNION UNIQUEJOIN UPDATE + USER USING UTC_TMESTAMP VALUES VARCHAR WHEN WHERE WINDOW WITH + + AUTOCOMMIT ISOLATION LEVEL OFFSET SNAPSHOT TRANSACTION WORK WRITE + + COMMIT ONLY REGEXP RLIKE ROLLBACK START + + ABORT KEY LAST NORELY NOVALIDATE NULLS RELY VALIDATE + + CACHE CONSTRAINT FOREIGN PRIMARY REFERENCES + + DETAIL DOW EXPRESSION OPERATOR QUARTER SUMMARY VECTORIZATION WEEK YEARS MONTHS WEEKS DAYS HOURS MINUTES SECONDS + + DAYOFWEEK EXTRACT FLOOR INTEGER PRECISION VIEWS + + TIMESTAMPTZ ZONE + + TIME NUMERIC + + NAMED_STRUCT CREATE_UNION + + ROUND BROUND FLOOR CEIL CEILING RAND EXP LN LOG10 LOG2 LOG POW POWER SQRT BIN + HEX UNHEX CONV ABS PMOD SIN ASIN COS ACOS TAN ATAN DEGREES RADIANS POSITIVE + NEGATIVE SIGN E PI FACTORIAL CBRT SHIFTLEFT SHIFTRIGHT SHIFTRIGHTUNSIGNED + GREATEST LEAST WIDTH_BUCKET SIZE SIZE MAP_KEYS MAP_VALUES ARRAY_CONTAINS + SORT_ARRAY BINARY CAST FROM_UNIXTIME UNIX_TIMESTAMP UNIX_TIMESTAMP + UNIX_TIMESTAMP TO_DATE YEAR QUARTER MONTH DAY DAYOFMONTH HOUR MINUTE SECOND + WEEKOFYEAR EXTRACT DATEDIFF DATE_ADD DATE_SUB FROM_UTC_TIMESTAMP + TO_UTC_TIMESTAMP CURRENT_DATE CURRENT_TIMESTAMP ADD_MONTHS LAST_DAY NEXT_DAY + TRUNC MONTHS_BETWEEN DATE_FORMAT IF ISNULL ISNOTNULL NVL COALESCE CASE WHEN + then else end NULLIF ASSERT_TRUE ASCII BASE64 CHARACTER_LENGTH CHR CONCAT + CONTEXT_NGRAMS CONCAT_WS CONCAT_WS DECODE ELT ENCODE FIELD FIND_IN_SET + FORMAT_NUMBER GET_JSON_OBJECT IN_FILE INSTR LENGTH LOCATE LOWER LCASE LPAD LTRIM + NGRAMS OCTET_LENGTH PARSE_URL PRINTF REGEXP_EXTRACT REGEXP_REPLACE REPEAT + REPLACE REVERSE RPAD RTRIM SENTENCES SPACE SPLIT STR_TO_MAP SUBSTR SUBSTRING + SUBSTRING_INDEX TRANSLATE TRIM UNBASE64 UPPER UCASE INITCAP LEVENSHTEIN SOUNDEX + MASK MASK_FIRST_N MASK_LAST_N MASK_SHOW_FIRST_N MASK_SHOW_LAST_N MASK_HASH + JAVA_METHOD REFLECT HASH CURRENT_USER LOGGED_IN_USER CURRENT_DATABASE MD5 SHA1 + SHA CRC32 SHA2 AES_ENCRYPT AES_DECRYPT VERSION COUNT SUM AVG MIN MAX VARIANCE + VAR_POP VAR_SAMP STDDEV_POP STDDEV_SAMP COVAR_POP COVAR_SAMP CORR PERCENTILE + PERCENTILE_APPROX PERCENTILE_APPROX REGR_AVGX REGR_AVGY REGR_COUNT + REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY HISTOGRAM_NUMERIC + COLLECT_SET COLLECT_LIST NTILE EXPLODE EXPLODE POSEXPLODE INLINE STACK + + JSON_TUPLE PARSE_URL_TUPLE + + XPATH XPATH_SHORT XPATH_INT XPATH_LONG XPATH_FLOAT XPATH_DOUBLE + XPATH_NUMBER XPATH_STRING GET_JSON_OBJECT JSON_TUPLE + + PARSE_URL_TUPLE + )) + end + + def self.keywords_type + # source: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types + @keywords_type ||= Set.new(%w( + TINYINT SMALLINT INT INTEGER BIGINT FLOAT DOUBLE PRECISION DECIMAL NUMERIC + TIMESTAMP DATE INTERVAL + STRING VARCHAR CHAR + BOOLEAN BINARY + ARRAY MAP STRUCT UNIONTYPE + )) + end + + prepend :root do + # a double-quoted string is a string literal in Hive QL. + rule %r/"/, Str::Double, :double_string + + # interpolation of variables through ${...} + rule %r/\$\{/, Name::Variable, :hive_variable + end + + prepend :single_string do + rule %r/\$\{/, Name::Variable, :hive_variable + rule %r/[^\\'\$]+/, Str::Single + end + + prepend :double_string do + rule %r/\$\{/, Name::Variable, :hive_variable + # double-quoted strings are string literals so need to change token + rule %r/"/, Str::Double, :pop! + rule %r/[^\\"\$]+/, Str::Double + end + + state :hive_variable do + rule %r/\}/, Name::Variable, :pop! + rule %r/[^\}]+/, Name::Variable + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/html.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/html.rb new file mode 100644 index 000000000000..3ed80deaf096 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/html.rb @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class HTML < RegexLexer + title "HTML" + desc "HTML, the markup language of the web" + tag 'html' + filenames '*.htm', '*.html', '*.xhtml', '*.cshtml' + mimetypes 'text/html', 'application/xhtml+xml' + + def self.detect?(text) + return true if text.doctype?(/\bhtml\b/i) + return false if text =~ /\A<\?xml\b/ + return true if text =~ /<\s*html\b/ + end + + start do + @javascript = Javascript.new(options) + @css = CSS.new(options) + end + + state :root do + rule %r/[^<&]+/m, Text + rule %r/&\S*?;/, Name::Entity + rule %r/<!DOCTYPE .*?>/im, Comment::Preproc + rule %r/<!\[CDATA\[.*?\]\]>/m, Comment::Preproc + rule %r/<!--/, Comment, :comment + rule %r/<\?.*?\?>/m, Comment::Preproc # php? really? + + rule %r/<\s*script\s*/m do + token Name::Tag + @javascript.reset! + push :script_content + push :tag + end + + rule %r/<\s*style\s*/m do + token Name::Tag + @css.reset! + @lang = @css + push :style_content + push :tag + end + + rule %r(</), Name::Tag, :tag_end + rule %r/</, Name::Tag, :tag_start + + rule %r(<\s*[\p{L}:_-][\p{Word}\p{Cf}:.·-]*), Name::Tag, :tag # opening tags + rule %r(<\s*/\s*[\p{L}:_-][\p{Word}\p{Cf}:.·-]*\s*>), Name::Tag # closing tags + end + + state :tag_end do + mixin :tag_end_end + rule %r/[\p{L}:_-][\p{Word}\p{Cf}:.·-]*/ do + token Name::Tag + goto :tag_end_end + end + end + + state :tag_end_end do + rule %r/\s+/, Text + rule %r/>/, Name::Tag, :pop! + end + + state :tag_start do + rule %r/\s+/, Text + + rule %r/[\p{L}:_-][\p{Word}\p{Cf}:.·-]*/ do + token Name::Tag + goto :tag + end + + rule(//) { goto :tag } + end + + state :comment do + rule %r/[^-]+/, Comment + rule %r/-->/, Comment, :pop! + rule %r/-/, Comment + end + + state :tag do + rule %r/\s+/m, Text + rule %r/[\p{L}:_\[\]()*.-][\p{Word}\p{Cf}:.·\[\]()*-]*\s*=\s*/m, Name::Attribute, :attr + rule %r/[\p{L}:_*#-][\p{Word}\p{Cf}:.·*#-]*/, Name::Attribute + rule %r(/?\s*>)m, Name::Tag, :pop! + end + + state :attr do + # TODO: are backslash escapes valid here? + rule %r/"/ do + token Str + goto :dq + end + + rule %r/'/ do + token Str + goto :sq + end + + rule %r/[^\s>]+/, Str, :pop! + end + + state :dq do + rule %r/"/, Str, :pop! + rule %r/[^"]+/, Str + end + + state :sq do + rule %r/'/, Str, :pop! + rule %r/[^']+/, Str + end + + state :script_content do + rule %r([^<]+) do + delegate @javascript + end + + rule %r(<\s*/\s*script\s*>)m, Name::Tag, :pop! + + rule %r(<) do + delegate @javascript + end + end + + state :style_content do + rule %r/[^<]+/ do + delegate @lang + end + + rule %r(<\s*/\s*style\s*>)m, Name::Tag, :pop! + + rule %r/</ do + delegate @lang + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/http.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/http.rb new file mode 100644 index 000000000000..8e4b0fbf23d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/http.rb @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class HTTP < RegexLexer + tag 'http' + title "HTTP" + desc 'http requests and responses' + + option :content, "the language for the content (default: auto-detect)" + + def self.http_methods + @http_methods ||= %w(GET POST PUT DELETE HEAD OPTIONS TRACE PATCH) + end + + def content_lexer + @content_lexer ||= (lexer_option(:content) || guess_content_lexer) + end + + def guess_content_lexer + return Lexers::PlainText unless @content_type + + Lexer.guess_by_mimetype(@content_type) + rescue Lexer::AmbiguousGuess + Lexers::PlainText + end + + start { @content_type = 'text/plain' } + + state :root do + # request + rule %r( + (#{HTTP.http_methods.join('|')})([ ]+) # method + ([^ ]+)([ ]+) # path + (HTTPS?)(/)(\d(?:\.\d)?)(\r?\n|$) # http version + )ox do + groups( + Name::Function, Text, + Name::Namespace, Text, + Keyword, Operator, Num, Text + ) + + push :headers + end + + # response + rule %r( + (HTTPS?)(/)(\d(?:\.\d))([ ]+) # http version + (\d{3})([ ]+)? # status + ([^\r\n]*)?(\r?\n|$) # status message + )x do + groups( + Keyword, Operator, Num, Text, + Num, Text, + Name::Exception, Text + ) + push :headers + end + end + + state :headers do + rule %r/([^\s:]+)( *)(:)( *)([^\r\n]+)(\r?\n|$)/ do |m| + key = m[1] + value = m[5] + if key.strip.casecmp('content-type').zero? + @content_type = value.split(';')[0].downcase + end + + groups Name::Attribute, Text, Punctuation, Text, Str, Text + end + + rule %r/([^\r\n]+)(\r?\n|$)/ do + groups Str, Text + end + + rule %r/\r?\n/, Text, :content + end + + state :content do + rule %r/.+/m do + delegate(content_lexer) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hylang.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hylang.rb new file mode 100644 index 000000000000..018e2072713f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/hylang.rb @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class HyLang < RegexLexer + title "HyLang" + desc "The HyLang programming language (hylang.org)" + + tag 'hylang' + aliases 'hy' + + filenames '*.hy' + + mimetypes 'text/x-hy', 'application/x-hy' + + def self.keywords + @keywords ||= Set.new %w( + False None True and as assert break class continue def + del elif else except finally for from global if import + in is lambda nonlocal not or pass raise return try + ) + end + + def self.builtins + @builtins ||= Set.new %w( + != % %= & &= * ** **= *= *map + + += , - -= -> ->> . / // + //= /= < << <<= <= = > >= >> + >>= @ @= ^ ^= accumulate apply as-> assoc butlast + calling-module-name car cdr chain coll? combinations comp complement compress cond + cons cons? constantly count cut cycle dec defclass defmacro defmacro! + defmacro/g! defmain defn defreader dict-comp disassemble dispatch-reader-macro distinct do doto + drop drop-last drop-while empty? eval eval-and-compile eval-when-compile even? every? filter + first flatten float? fn for* fraction genexpr gensym get group-by + identity if* if-not if-python2 inc input instance? integer integer-char? integer? + interleave interpose islice iterable? iterate iterator? juxt keyword keyword? last + let lif lif-not list* list-comp macro-error macroexpand macroexpand-1 map merge-with + multicombinations name neg? none? not-in not? nth numeric? odd? partition + permutations pos? product quasiquote quote range read read-str reduce remove + repeat repeatedly require rest second set-comp setv some string string? + symbol? take take-nth take-while tee unless unquote unquote-splicing when with* + with-decorator with-gensyms xor yield-from zero? zip zip-longest | |= ~ + ) + end + + identifier = %r([\w!$%*+,<=>?/.-]+) + keyword = %r([\w!\#$%*+,<=>?/.-]+) + + def name_token(name) + return Keyword if self.class.keywords.include?(name) + return Name::Builtin if self.class.builtins.include?(name) + nil + end + + state :root do + rule %r/;.*?$/, Comment::Single + rule %r/\s+/m, Text::Whitespace + + rule %r/-?\d+\.\d+/, Num::Float + rule %r/-?\d+/, Num::Integer + rule %r/0x-?[0-9a-fA-F]+/, Num::Hex + + rule %r/"(\\.|[^"])*"/, Str + rule %r/'#{keyword}/, Str::Symbol + rule %r/::?#{keyword}/, Name::Constant + rule %r/\\(.|[a-z]+)/i, Str::Char + + + rule %r/~@|[`\'#^~&@]/, Operator + + rule %r/(\()(\s*)(#{identifier})/m do |m| + token Punctuation, m[1] + token Text::Whitespace, m[2] + token(name_token(m[3]) || Name::Function, m[3]) + end + + rule identifier do |m| + token name_token(m[0]) || Name + end + + # vectors + rule %r/[\[\]]/, Punctuation + + # maps + rule %r/[{}]/, Punctuation + + # parentheses + rule %r/[()]/, Punctuation + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/idlang.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/idlang.rb new file mode 100644 index 000000000000..6431ce4ad203 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/idlang.rb @@ -0,0 +1,312 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# vim: set ts=2 sw=2 et: + +module Rouge + module Lexers + class IDLang < RegexLexer + title "IDL" + desc "Interactive Data Language" + + tag 'idlang' + filenames '*.idl' + + name = /[_A-Z]\w*/i + kind_param = /(\d+|#{name})/ + exponent = /[dDeE][+-]\d+/ + + def self.exec_unit + @exec_unit ||= Set.new %w( + PRO FUNCTION + ) + end + + def self.keywords + @keywords ||= Set.new %w( + STRUCT INHERITS + RETURN CONTINUE BEGIN END BREAK GOTO + ) + end + + def self.standalone_statements + # Must not have a comma afterwards + @standalone_statements ||= Set.new %w( + COMMON FORWARD_FUNCTION + ) + end + + def self.decorators + # Must not have a comma afterwards + @decorators ||= Set.new %w( + COMPILE_OPT + ) + end + + def self.operators + @operators ||= Set.new %w( + AND= EQ= GE= GT= LE= LT= MOD= NE= OR= XOR= NOT= + ) + end + + def self.conditionals + @conditionals ||= Set.new %w( + OF DO ENDIF ENDELSE ENDFOR ENDFOREACH ENDWHILE ENDREP ENDCASE ENDSWITCH + IF THEN ELSE FOR FOREACH WHILE REPEAT UNTIL CASE SWITCH + AND EQ GE GT LE LT MOD NE OR XOR NOT + ) + end + + def self.routines + @routines ||= Set.new %w( + A_CORRELATE ABS ACOS ADAPT_HIST_EQUAL ALOG ALOG10 + AMOEBA ANNOTATE ARG_PRESENT ARRAY_EQUAL + ARRAY_INDICES ARROW ASCII_TEMPLATE ASIN ASSOC ATAN + AXIS BAR_PLOT BESELI BESELJ BESELK BESELY BETA + BILINEAR BIN_DATE BINARY_TEMPLATE BINDGEN BINOMIAL + BLAS_AXPY BLK_CON BOX_CURSOR BREAK BREAKPOINT + BROYDEN BYTARR BYTE BYTEORDER BYTSCL C_CORRELATE + CALDAT CALENDAR CALL_EXTERNAL CALL_FUNCTION + CALL_METHOD CALL_PROCEDURE CATCH CD CEIL CHEBYSHEV + CHECK_MATH CHISQR_CVF CHISQR_PDF CHOLDC CHOLSOL + CINDGEN CIR_3PNT CLOSE CLUST_WTS CLUSTER + COLOR_CONVERT COLOR_QUAN COLORMAP_APPLICABLE COMFIT + COMPLEX COMPLEXARR COMPLEXROUND + COMPUTE_MESH_NORMALS COND CONGRID CONJ + CONSTRAINED_MIN CONTOUR CONVERT_COORD CONVOL + COORD2TO3 CORRELATE COS COSH CRAMER CREATE_STRUCT + CREATE_VIEW CROSSP CRVLENGTH CT_LUMINANCE CTI_TEST + CURSOR CURVEFIT CV_COORD CVTTOBM CW_ANIMATE + CW_ANIMATE_GETP CW_ANIMATE_LOAD CW_ANIMATE_RUN + CW_ARCBALL CW_BGROUP CW_CLR_INDEX CW_COLORSEL + CW_DEFROI CW_FIELD CW_FILESEL CW_FORM CW_FSLIDER + CW_LIGHT_EDITOR CW_LIGHT_EDITOR_GET + CW_LIGHT_EDITOR_SET CW_ORIENT CW_PALETTE_EDITOR + CW_PALETTE_EDITOR_GET CW_PALETTE_EDITOR_SET + CW_PDMENU CW_RGBSLIDER CW_TMPL CW_ZOOM DBLARR + DCINDGEN DCOMPLEX DCOMPLEXARR DEFINE_KEY DEFROI + DEFSYSV DELETE_SYMBOL DELLOG DELVAR DERIV DERIVSIG + DETERM DEVICE DFPMIN DIALOG_MESSAGE + DIALOG_PICKFILE DIALOG_PRINTERSETUP + DIALOG_PRINTJOB DIALOG_READ_IMAGE + DIALOG_WRITE_IMAGE DICTIONARY DIGITAL_FILTER DILATE DINDGEN + DISSOLVE DIST DLM_LOAD DLM_REGISTER + DO_APPLE_SCRIPT DOC_LIBRARY DOUBLE DRAW_ROI EFONT + EIGENQL EIGENVEC ELMHES EMPTY ENABLE_SYSRTN EOF + ERASE ERODE ERRORF ERRPLOT EXECUTE EXIT EXP EXPAND + EXPAND_PATH EXPINT EXTRAC EXTRACT_SLICE F_CVF + F_PDF FACTORIAL FFT FILE_CHMOD FILE_DELETE + FILE_EXPAND_PATH FILE_MKDIR FILE_TEST FILE_WHICH + FILE_SEARCH PATH_SEP FILE_DIRNAME FILE_BASENAME + FILE_INFO FILE_MOVE FILE_COPY FILE_LINK FILE_POLL_INPUT + FILEPATH FINDFILE FINDGEN FINITE FIX FLICK FLOAT + FLOOR FLOW3 FLTARR FLUSH FORMAT_AXIS_VALUES + FORWARD_FUNCTION FREE_LUN FSTAT FULSTR FUNCT + FV_TEST FX_ROOT FZ_ROOTS GAMMA GAMMA_CT + GAUSS_CVF GAUSS_PDF GAUSS2DFIT GAUSSFIT GAUSSINT + GET_DRIVE_LIST GET_KBRD GET_LUN GET_SCREEN_SIZE + GET_SYMBOL GETENV GOTO GREG2JUL GRID_TPS GRID3 GS_ITER + H_EQ_CT H_EQ_INT HANNING HASH HEAP_GC HELP HILBERT + HIST_2D HIST_EQUAL HISTOGRAM HLS HOUGH HQR HSV + IBETA IDENTITY IDL_CONTAINER IDLANROI + IDLANROIGROUP IDLFFDICOM IDLFFDXF IDLFFLANGUAGECAT + IDLFFSHAPE IDLGRAXIS IDLGRBUFFER IDLGRCLIPBOARD + IDLGRCOLORBAR IDLGRCONTOUR IDLGRFONT IDLGRIMAGE + IDLGRLEGEND IDLGRLIGHT IDLGRMODEL IDLGRMPEG + IDLGRPALETTE IDLGRPATTERN IDLGRPLOT IDLGRPOLYGON + IDLGRPOLYLINE IDLGRPRINTER IDLGRROI IDLGRROIGROUP + IDLGRSCENE IDLGRSURFACE IDLGRSYMBOL + IDLGRTESSELLATOR IDLGRTEXT IDLGRVIEW + IDLGRVIEWGROUP IDLGRVOLUME IDLGRVRML IDLGRWINDOW + IGAMMA IMAGE_CONT IMAGE_STATISTICS IMAGINARY + INDGEN INT_2D INT_3D INT_TABULATED INTARR INTERPOL + INTERPOLATE INVERT IOCTL ISA ISHFT ISOCONTOUR + ISOSURFACE JOURNAL JUL2GREG JULDAY KEYWORD_SET KRIG2D + KURTOSIS KW_TEST L64INDGEN LABEL_DATE LABEL_REGION + LADFIT LAGUERRE LEEFILT LEGENDRE LINBCG LINDGEN + LINFIT LINKIMAGE LIST LIVE_CONTOUR LIVE_CONTROL + LIVE_DESTROY LIVE_EXPORT LIVE_IMAGE LIVE_INFO + LIVE_LINE LIVE_LOAD LIVE_OPLOT LIVE_PLOT + LIVE_PRINT LIVE_RECT LIVE_STYLE LIVE_SURFACE + LIVE_TEXT LJLCT LL_ARC_DISTANCE LMFIT LMGR LNGAMMA + LNP_TEST LOADCT LOCALE_GET LON64ARR LONARR LONG + LONG64 LSODE LU_COMPLEX LUDC LUMPROVE LUSOL + M_CORRELATE MACHAR MAKE_ARRAY MAKE_DLL MAP_2POINTS + MAP_CONTINENTS MAP_GRID MAP_IMAGE MAP_PATCH + MAP_PROJ_INFO MAP_SET MAX MATRIX_MULTIPLY MD_TEST MEAN + MEANABSDEV MEDIAN MEMORY MESH_CLIP MESH_DECIMATE + MESH_ISSOLID MESH_MERGE MESH_NUMTRIANGLES MESH_OBJ + MESH_SMOOTH MESH_SURFACEAREA MESH_VALIDATE + MESH_VOLUME MESSAGE MIN MIN_CURVE_SURF MK_HTML_HELP + MODIFYCT MOMENT MORPH_CLOSE MORPH_DISTANCE + MORPH_GRADIENT MORPH_HITORMISS MORPH_OPEN + MORPH_THIN MORPH_TOPHAT MPEG_CLOSE MPEG_OPEN + MPEG_PUT MPEG_SAVE MSG_CAT_CLOSE MSG_CAT_COMPILE + MSG_CAT_OPEN MULTI N_ELEMENTS N_PARAMS N_TAGS + NEWTON NORM OBJ_CLASS OBJ_DESTROY OBJ_ISA OBJ_NEW + OBJ_VALID OBJARR ON_ERROR ON_IOERROR ONLINE_HELP + OPEN OPENR OPENW OPENU OPLOT OPLOTERR ORDEREDHASH P_CORRELATE + PARTICLE_TRACE PCOMP PLOT PLOT_3DBOX PLOT_FIELD + PLOTERR PLOTS PNT_LINE POINT_LUN POLAR_CONTOUR + POLAR_SURFACE POLY POLY_2D POLY_AREA POLY_FIT + POLYFILL POLYFILLV POLYSHADE POLYWARP POPD POWELL + PRIMES PRINT PRINTF PRINTD PRODUCT PROFILE PROFILER + PROFILES PROJECT_VOL PS_SHOW_FONTS PSAFM PSEUDO + PTR_FREE PTR_NEW PTR_VALID PTRARR PUSHD QROMB + QROMO QSIMP QUERY_CSV R_CORRELATE R_TEST RADON RANDOMN + RANDOMU RANKS RDPIX READ READF READ_ASCII + READ_BINARY READ_BMP READ_CSV READ_DICOM READ_IMAGE + READ_INTERFILE READ_JPEG READ_PICT READ_PNG + READ_PPM READ_SPR READ_SRF READ_SYLK READ_TIFF + READ_WAV READ_WAVE READ_X11_BITMAP READ_XWD READS + READU REBIN RECALL_COMMANDS RECON3 REDUCE_COLORS + REFORM REGRESS REPLICATE REPLICATE_INPLACE + RESOLVE_ALL RESOLVE_ROUTINE RESTORE RETALL + REVERSE REWIND RK4 ROBERTS ROT ROTATE ROUND + ROUTINE_INFO RS_TEST S_TEST SAVE SAVGOL SCALE3 + SCALE3D SCOPE_LEVEL SCOPE_TRACEBACK SCOPE_VARFETCH + SCOPE_VARNAME SEARCH2D SEARCH3D SET_PLOT SET_SHADING + SET_SYMBOL SETENV SETLOG SETUP_KEYS SFIT + SHADE_SURF SHADE_SURF_IRR SHADE_VOLUME SHIFT SHOW3 + SHOWFONT SIGNUM SIN SINDGEN SINH SIZE SKEWNESS SKIPF + SLICER3 SLIDE_IMAGE SMOOTH SOBEL SOCKET SORT SPAWN + SPH_4PNT SPH_SCAT SPHER_HARM SPL_INIT SPL_INTERP + SPLINE SPLINE_P SPRSAB SPRSAX SPRSIN SPRSTP SQRT + STANDARDIZE STDDEV STOP STRARR STRCMP STRCOMPRESS + STREAMLINE STREGEX STRETCH STRING STRJOIN STRLEN + STRLOWCASE STRMATCH STRMESSAGE STRMID STRPOS + STRPUT STRSPLIT STRTRIM STRUCT_ASSIGN STRUCT_HIDE + STRUPCASE SURFACE SURFR SVDC SVDFIT SVSOL + SWAP_ENDIAN SWITCH SYSTIME T_CVF T_PDF T3D + TAG_NAMES TAN TANH TAPRD TAPWRT TEK_COLOR + TEMPORARY TETRA_CLIP TETRA_SURFACE TETRA_VOLUME + THIN THREED TIME_TEST2 TIMEGEN TM_TEST TOTAL TRACE + TRANSPOSE TRI_SURF TRIANGULATE TRIGRID TRIQL + TRIRED TRISOL TRNLOG TS_COEF TS_DIFF TS_FCAST + TS_SMOOTH TV TVCRS TVLCT TVRD TVSCL TYPENAME UINDGEN UINT + UINTARR UL64INDGEN ULINDGEN ULON64ARR ULONARR + ULONG ULONG64 UNIQ USERSYM VALUE_LOCATE VARIANCE + VAX_FLOAT VECTOR_FIELD VEL VELOVECT VERT_T3D VOIGT + VORONOI VOXEL_PROJ WAIT WARP_TRI WATERSHED WDELETE + WEOF WF_DRAW WHERE WIDGET_BASE WIDGET_BUTTON + WIDGET_CONTROL WIDGET_DRAW WIDGET_DROPLIST + WIDGET_EVENT WIDGET_INFO WIDGET_LABEL WIDGET_LIST + WIDGET_SLIDER WIDGET_TABLE WIDGET_TEXT WINDOW + WRITE_BMP WRITE_CSV WRITE_IMAGE WRITE_JPEG WRITE_NRIF + WRITE_PICT WRITE_PNG WRITE_PPM WRITE_SPR WRITE_SRF + WRITE_SYLK WRITE_TIFF WRITE_WAV WRITE_WAVE WRITEU + WSET WSHOW WTN WV_APPLET WV_CW_WAVELET WV_CWT + WV_DENOISE WV_DWT WV_FN_COIFLET WV_FN_DAUBECHIES + WV_FN_GAUSSIAN WV_FN_HAAR WV_FN_MORLET WV_FN_PAUL + WV_FN_SYMLET WV_IMPORT_DATA WV_IMPORT_WAVELET + WV_PLOT3D_WPS WV_PLOT_MULTIRES WV_PWT + WV_TOOL_DENOISE XBM_EDIT XDISPLAYFILE XDXF XFONT + XINTERANIMATE XLOADCT XMANAGER XMNG_TMPL XMTOOL + XOBJVIEW XPALETTE XPCOLOR XPLOT3D XREGISTERED XROI + XSQ_TEST XSURFACE XVAREDIT XVOLUME XVOLUME_ROTATE + XVOLUME_WRITE_IMAGE XYOUTS ZOOM ZOOM_24 + ) + end + + state :root do + rule %r/\s+/, Text::Whitespace + # Normal comments + rule %r/;.*$/, Comment::Single + rule %r/\,\s*\,/, Error + rule %r/\!#{name}/, Name::Variable::Global + + rule %r/[(),:\&\$]/, Punctuation + + ## Format statements are quite a strange beast. + ## Better process them in their own state. + #rule %r/\b(FORMAT)(\s*)(\()/mi do |m| + # token Keyword, m[1] + # token Text::Whitespace, m[2] + # token Punctuation, m[3] + # push :format_spec + #end + + rule %r( + [+-]? # sign + ( + (\d+[.]\d*|[.]\d+)(#{exponent})? + | \d+#{exponent} # exponent is mandatory + ) + (_#{kind_param})? # kind parameter + )xi, Num::Float + + rule %r/\d+(B|S|U|US|LL|L|ULL|UL)?/i, Num::Integer + rule %r/"[0-7]+(B|O|U|ULL|UL|LL|L)?/i, Num::Oct + rule %r/'[0-9A-F]+'X(B|S|US|ULL|UL|U|LL|L)?/i, Num::Hex + rule %r/(#{kind_param}_)?'/, Str::Single, :string_single + rule %r/(#{kind_param}_)?"/, Str::Double, :string_double + + rule %r{\#\#|\#|\&\&|\|\||/=|<=|>=|->|\@|\?|[-+*/<=~^{}]}, Operator + # Structures and the like + rule %r/(#{name})(\.)([^\s,]*)/i do + groups Name, Operator, Name + #delegate IDLang, m[3] + end + + rule %r/(function|pro)((?:\s|\$\s)+)/i do + groups Keyword, Text::Whitespace + push :funcname + end + + rule %r/#{name}/m do |m| + match = m[0].upcase + if self.class.keywords.include? match + token Keyword + elsif self.class.conditionals.include? match + token Keyword + elsif self.class.decorators.include? match + token Name::Decorator + elsif self.class.standalone_statements.include? match + token Keyword::Reserved + elsif self.class.operators.include? match + token Operator::Word + elsif self.class.routines.include? match + token Name::Builtin + else + token Name + end + end + + end + + state :funcname do + rule %r/#{name}/, Name::Function + + rule %r/\s+/, Text::Whitespace + rule %r/(:+|\$)/, Operator + rule %r/;.*/, Comment::Single + + # Be done with this state if we hit EOL or comma + rule %r/$/, Text::Whitespace, :pop! + rule %r/,/, Operator, :pop! + end + + state :string_single do + rule %r/[^']+/, Str::Single + rule %r/''/, Str::Escape + rule %r/'/, Str::Single, :pop! + end + + state :string_double do + rule %r/[^"]+/, Str::Double + rule %r/"/, Str::Double, :pop! + end + + state :format_spec do + rule %r/'/, Str::Single, :string_single + rule %r/"/, Str::Double, :string_double + rule %r/\(/, Punctuation, :format_spec + rule %r/\)/, Punctuation, :pop! + rule %r/,/, Punctuation + rule %r/\s+/, Text::Whitespace + # Edit descriptors could be seen as a kind of "format literal". + rule %r/[^\s'"(),]+/, Literal + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/igorpro.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/igorpro.rb new file mode 100644 index 000000000000..a542cea90e69 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/igorpro.rb @@ -0,0 +1,664 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class IgorPro < RegexLexer + tag 'igorpro' + filenames '*.ipf' + mimetypes 'text/x-igorpro' + + title "IgorPro" + desc "WaveMetrics Igor Pro" + + def self.keywords + @keywords ||= Set.new %w( + structure endstructure + threadsafe static + macro proc window menu function end + if else elseif endif switch strswitch endswitch + break return continue + for endfor do while + case default + try catch endtry + abortonrte + ) + end + + def self.preprocessor + @preprocessor ||= Set.new %w( + pragma include + define ifdef ifndef undef + if elif else endif + ) + end + + def self.igorDeclarations + @igorDeclarations ||= Set.new %w( + variable string wave strconstant constant + nvar svar dfref funcref struct + char uchar int16 uint16 int32 uint32 int64 uint64 float double + ) + end + + def self.igorConstants + @igorConstants ||= Set.new %w( + nan inf + ) + end + + def self.igorFunction + @igorFunction ||= Set.new %w( + AddListItem AiryA AiryAD AiryB AiryBD AnnotationInfo + AnnotationList AxisInfo AxisList AxisValFromPixel + AxonTelegraphAGetDataNum AxonTelegraphAGetDataString + AxonTelegraphAGetDataStruct AxonTelegraphGetDataNum + AxonTelegraphGetDataString AxonTelegraphGetDataStruct + AxonTelegraphGetTimeoutMs AxonTelegraphSetTimeoutMs + Base64Decode Base64Encode Besseli Besselj Besselk + Bessely BinarySearch BinarySearchInterp CTabList + CaptureHistory CaptureHistoryStart CheckName + ChildWindowList CleanupName ContourInfo ContourNameList + ContourNameToWaveRef ContourZ ControlNameList + ConvertTextEncoding CountObjects CountObjectsDFR + CreationDate CsrInfo CsrWave CsrWaveRef CsrXWave + CsrXWaveRef DataFolderDir DataFolderExists + DataFolderRefStatus DataFolderRefsEqual DateToJulian + Dawson DimDelta DimOffset DimSize Faddeeva FetchURL + FindDimLabel FindListItem FontList FontSizeHeight + FontSizeStringWidth FresnelCos FresnelSin FuncRefInfo + FunctionInfo FunctionList FunctionPath + GISGetAllFileFormats GISSRefsAreEqual Gauss Gauss1D + Gauss2D GetBrowserLine GetBrowserSelection + GetDataFolder GetDataFolderDFR GetDefaultFont + GetDefaultFontSize GetDefaultFontStyle GetDimLabel + GetEnvironmentVariable GetErrMessage GetFormula + GetIndependentModuleName GetIndexedObjName + GetIndexedObjNameDFR GetKeyState GetRTErrMessage + GetRTError GetRTLocInfo GetRTLocation GetRTStackInfo + GetScrapText GetUserData GetWavesDataFolder + GetWavesDataFolderDFR GizmoInfo GizmoScale GrepList + GrepString GuideInfo GuideNameList HDF5AttributeInfo + HDF5DatasetInfo HDF5LibraryInfo HDF5TypeInfo Hash + HyperG0F1 HyperG1F1 HyperG2F1 HyperGNoise HyperGPFQ + IgorInfo IgorVersion ImageInfo ImageNameList + ImageNameToWaveRef IndependentModuleList IndexToScale + IndexedDir IndexedFile Inf Integrate1D Interp2D + Interp3D ItemsInList JacobiCn JacobiSn JulianToDate + Laguerre LaguerreA LaguerreGauss LambertW LayoutInfo + LegendreA ListMatch ListToTextWave ListToWaveRefWave + LowerStr MCC_AutoBridgeBal MCC_AutoFastComp + MCC_AutoPipetteOffset MCC_AutoSlowComp + MCC_AutoWholeCellComp MCC_GetBridgeBalEnable + MCC_GetBridgeBalResist MCC_GetFastCompCap + MCC_GetFastCompTau MCC_GetHolding MCC_GetHoldingEnable + MCC_GetMode MCC_GetNeutralizationCap + MCC_GetNeutralizationEnable MCC_GetOscKillerEnable + MCC_GetPipetteOffset MCC_GetPrimarySignalGain + MCC_GetPrimarySignalHPF MCC_GetPrimarySignalLPF + MCC_GetRsCompBandwidth MCC_GetRsCompCorrection + MCC_GetRsCompEnable MCC_GetRsCompPrediction + MCC_GetSecondarySignalGain MCC_GetSecondarySignalLPF + MCC_GetSlowCompCap MCC_GetSlowCompTau + MCC_GetSlowCompTauX20Enable MCC_GetSlowCurrentInjEnable + MCC_GetSlowCurrentInjLevel + MCC_GetSlowCurrentInjSetlTime MCC_GetWholeCellCompCap + MCC_GetWholeCellCompEnable MCC_GetWholeCellCompResist + MCC_SelectMultiClamp700B MCC_SetBridgeBalEnable + MCC_SetBridgeBalResist MCC_SetFastCompCap + MCC_SetFastCompTau MCC_SetHolding MCC_SetHoldingEnable + MCC_SetMode MCC_SetNeutralizationCap + MCC_SetNeutralizationEnable MCC_SetOscKillerEnable + MCC_SetPipetteOffset MCC_SetPrimarySignalGain + MCC_SetPrimarySignalHPF MCC_SetPrimarySignalLPF + MCC_SetRsCompBandwidth MCC_SetRsCompCorrection + MCC_SetRsCompEnable MCC_SetRsCompPrediction + MCC_SetSecondarySignalGain MCC_SetSecondarySignalLPF + MCC_SetSlowCompCap MCC_SetSlowCompTau + MCC_SetSlowCompTauX20Enable MCC_SetSlowCurrentInjEnable + MCC_SetSlowCurrentInjLevel + MCC_SetSlowCurrentInjSetlTime MCC_SetTimeoutMs + MCC_SetWholeCellCompCap MCC_SetWholeCellCompEnable + MCC_SetWholeCellCompResist MPFXEMGPeak + MPFXExpConvExpPeak MPFXGaussPeak MPFXLorenzianPeak + MPFXVoigtPeak MacroList MandelbrotPoint MarcumQ + MatrixCondition MatrixDet MatrixDot MatrixRank + MatrixTrace ModDate NVAR_Exists NaN NameOfWave + NewFreeDataFolder NewFreeWave NormalizeUnicode + NumVarOrDefault NumberByKey OperationList PICTInfo + PICTList PadString PanelResolution ParamIsDefault + ParseFilePath PathList Pi PixelFromAxisVal PolygonArea + PossiblyQuoteName ProcedureText RemoveByKey + RemoveEnding RemoveFromList RemoveListItem + ReplaceNumberByKey ReplaceString ReplaceStringByKey + SQL2DBinaryWaveToTextWave SQLAllocHandle SQLAllocStmt + SQLBinaryWavesToTextWave SQLBindCol SQLBindParameter + SQLBrowseConnect SQLBulkOperations SQLCancel + SQLCloseCursor SQLColAttributeNum SQLColAttributeStr + SQLColumnPrivileges SQLColumns SQLConnect + SQLDataSources SQLDescribeCol SQLDescribeParam + SQLDisconnect SQLDriverConnect SQLDrivers SQLEndTran + SQLError SQLExecDirect SQLExecute SQLFetch + SQLFetchScroll SQLForeignKeys SQLFreeConnect SQLFreeEnv + SQLFreeHandle SQLFreeStmt SQLGetConnectAttrNum + SQLGetConnectAttrStr SQLGetCursorName SQLGetDataNum + SQLGetDataStr SQLGetDescFieldNum SQLGetDescFieldStr + SQLGetDescRec SQLGetDiagFieldNum SQLGetDiagFieldStr + SQLGetDiagRec SQLGetEnvAttrNum SQLGetEnvAttrStr + SQLGetFunctions SQLGetInfoNum SQLGetInfoStr + SQLGetStmtAttrNum SQLGetStmtAttrStr SQLGetTypeInfo + SQLMoreResults SQLNativeSql SQLNumParams + SQLNumResultCols SQLNumResultRowsIfKnown + SQLNumRowsFetched SQLParamData SQLPrepare + SQLPrimaryKeys SQLProcedureColumns SQLProcedures + SQLPutData SQLReinitialize SQLRowCount + SQLSetConnectAttrNum SQLSetConnectAttrStr + SQLSetCursorName SQLSetDescFieldNum SQLSetDescFieldStr + SQLSetDescRec SQLSetEnvAttrNum SQLSetEnvAttrStr + SQLSetPos SQLSetStmtAttrNum SQLSetStmtAttrStr + SQLSpecialColumns SQLStatistics SQLTablePrivileges + SQLTables SQLTextWaveTo2DBinaryWave + SQLTextWaveToBinaryWaves SQLUpdateBoundValues + SQLXOPCheckState SVAR_Exists ScreenResolution Secs2Date + Secs2Time SelectNumber SelectString + SetEnvironmentVariable SortList SpecialCharacterInfo + SpecialCharacterList SpecialDirPath SphericalBessJ + SphericalBessJD SphericalBessY SphericalBessYD + SphericalHarmonics StartMSTimer StatsBetaCDF + StatsBetaPDF StatsBinomialCDF StatsBinomialPDF + StatsCMSSDCDF StatsCauchyCDF StatsCauchyPDF StatsChiCDF + StatsChiPDF StatsCorrelation StatsDExpCDF StatsDExpPDF + StatsEValueCDF StatsEValuePDF StatsErlangCDF + StatsErlangPDF StatsErrorPDF StatsExpCDF StatsExpPDF + StatsFCDF StatsFPDF StatsFriedmanCDF StatsGEVCDF + StatsGEVPDF StatsGammaCDF StatsGammaPDF + StatsGeometricCDF StatsGeometricPDF StatsHyperGCDF + StatsHyperGPDF StatsInvBetaCDF StatsInvBinomialCDF + StatsInvCMSSDCDF StatsInvCauchyCDF StatsInvChiCDF + StatsInvDExpCDF StatsInvEValueCDF StatsInvExpCDF + StatsInvFCDF StatsInvFriedmanCDF StatsInvGammaCDF + StatsInvGeometricCDF StatsInvKuiperCDF + StatsInvLogNormalCDF StatsInvLogisticCDF + StatsInvMaxwellCDF StatsInvMooreCDF + StatsInvNBinomialCDF StatsInvNCChiCDF StatsInvNCFCDF + StatsInvNormalCDF StatsInvParetoCDF StatsInvPoissonCDF + StatsInvPowerCDF StatsInvQCDF StatsInvQpCDF + StatsInvRayleighCDF StatsInvRectangularCDF + StatsInvSpearmanCDF StatsInvStudentCDF + StatsInvTopDownCDF StatsInvTriangularCDF + StatsInvUsquaredCDF StatsInvVonMisesCDF + StatsInvWeibullCDF StatsKuiperCDF StatsLogNormalCDF + StatsLogNormalPDF StatsLogisticCDF StatsLogisticPDF + StatsMaxwellCDF StatsMaxwellPDF StatsMedian + StatsMooreCDF StatsNBinomialCDF StatsNBinomialPDF + StatsNCChiCDF StatsNCChiPDF StatsNCFCDF StatsNCFPDF + StatsNCTCDF StatsNCTPDF StatsNormalCDF StatsNormalPDF + StatsParetoCDF StatsParetoPDF StatsPermute + StatsPoissonCDF StatsPoissonPDF StatsPowerCDF + StatsPowerNoise StatsPowerPDF StatsQCDF StatsQpCDF + StatsRayleighCDF StatsRayleighPDF StatsRectangularCDF + StatsRectangularPDF StatsRunsCDF StatsSpearmanRhoCDF + StatsStudentCDF StatsStudentPDF StatsTopDownCDF + StatsTriangularCDF StatsTriangularPDF StatsTrimmedMean + StatsUSquaredCDF StatsVonMisesCDF StatsVonMisesNoise + StatsVonMisesPDF StatsWaldCDF StatsWaldPDF + StatsWeibullCDF StatsWeibullPDF StopMSTimer + StrVarOrDefault StringByKey StringFromList StringList + StudentA StudentT TDMAddChannel TDMAddGroup + TDMAppendDataValues TDMAppendDataValuesTime + TDMChannelPropertyExists TDMCloseChannel TDMCloseFile + TDMCloseGroup TDMCreateChannelProperty TDMCreateFile + TDMCreateFileProperty TDMCreateGroupProperty + TDMFilePropertyExists TDMGetChannelPropertyNames + TDMGetChannelPropertyNum TDMGetChannelPropertyStr + TDMGetChannelPropertyTime TDMGetChannelPropertyType + TDMGetChannelStringPropertyLen TDMGetChannels + TDMGetDataType TDMGetDataValues TDMGetDataValuesTime + TDMGetFilePropertyNames TDMGetFilePropertyNum + TDMGetFilePropertyStr TDMGetFilePropertyTime + TDMGetFilePropertyType TDMGetFileStringPropertyLen + TDMGetGroupPropertyNames TDMGetGroupPropertyNum + TDMGetGroupPropertyStr TDMGetGroupPropertyTime + TDMGetGroupPropertyType TDMGetGroupStringPropertyLen + TDMGetGroups TDMGetLibraryErrorDescription + TDMGetNumChannelProperties TDMGetNumChannels + TDMGetNumDataValues TDMGetNumFileProperties + TDMGetNumGroupProperties TDMGetNumGroups + TDMGroupPropertyExists TDMOpenFile TDMOpenFileEx + TDMRemoveChannel TDMRemoveGroup TDMReplaceDataValues + TDMReplaceDataValuesTime TDMSaveFile + TDMSetChannelPropertyNum TDMSetChannelPropertyStr + TDMSetChannelPropertyTime TDMSetDataValues + TDMSetDataValuesTime TDMSetFilePropertyNum + TDMSetFilePropertyStr TDMSetFilePropertyTime + TDMSetGroupPropertyNum TDMSetGroupPropertyStr + TDMSetGroupPropertyTime TableInfo TagVal TagWaveRef + TextEncodingCode TextEncodingName TextFile + ThreadGroupCreate ThreadGroupGetDF ThreadGroupGetDFR + ThreadGroupRelease ThreadGroupWait ThreadProcessorCount + ThreadReturnValue TraceFromPixel TraceInfo + TraceNameList TraceNameToWaveRef TrimString URLDecode + URLEncode UnPadString UniqueName + UnsetEnvironmentVariable UpperStr VariableList Variance + VoigtFunc VoigtPeak WaveCRC WaveDims WaveExists + WaveHash WaveInfo WaveList WaveMax WaveMin WaveName + WaveRefIndexed WaveRefIndexedDFR WaveRefWaveToList + WaveRefsEqual WaveTextEncoding WaveType WaveUnits + WhichListItem WinList WinName WinRecreation WinType + XWaveName XWaveRefFromTrace ZernikeR abs acos acosh + alog area areaXY asin asinh atan atan2 atanh beta betai + binomial binomialNoise binomialln cabs ceil cequal + char2num chebyshev chebyshevU cmplx cmpstr conj cos + cosIntegral cosh cot coth cpowi csc csch date date2secs + datetime defined deltax digamma dilogarithm ei enoise + equalWaves erf erfc erfcw exists exp expInt + expIntegralE1 expNoise fDAQmx_AI_GetReader + fDAQmx_AO_UpdateOutputs fDAQmx_CTR_Finished + fDAQmx_CTR_IsFinished fDAQmx_CTR_IsPulseFinished + fDAQmx_CTR_ReadCounter fDAQmx_CTR_ReadWithOptions + fDAQmx_CTR_SetPulseFrequency fDAQmx_CTR_Start + fDAQmx_ConnectTerminals fDAQmx_DIO_Finished + fDAQmx_DIO_PortWidth fDAQmx_DIO_Read fDAQmx_DIO_Write + fDAQmx_DeviceNames fDAQmx_DisconnectTerminals + fDAQmx_ErrorString fDAQmx_ExternalCalDate + fDAQmx_NumAnalogInputs fDAQmx_NumAnalogOutputs + fDAQmx_NumCounters fDAQmx_NumDIOPorts fDAQmx_ReadChan + fDAQmx_ReadNamedChan fDAQmx_ResetDevice + fDAQmx_ScanGetAvailable fDAQmx_ScanGetNextIndex + fDAQmx_ScanStart fDAQmx_ScanStop fDAQmx_ScanWait + fDAQmx_ScanWaitWithTimeout fDAQmx_SelfCalDate + fDAQmx_SelfCalibration fDAQmx_WF_IsFinished + fDAQmx_WF_WaitUntilFinished fDAQmx_WaveformStart + fDAQmx_WaveformStop fDAQmx_WriteChan factorial fakedata + faverage faverageXY floor gamma gammaEuler gammaInc + gammaNoise gammln gammp gammq gcd gnoise hcsr hermite + hermiteGauss imag interp inverseERF inverseERFC leftx + limit ln log logNormalNoise lorentzianNoise magsqr max + mean median min mod norm note num2char num2istr num2str + numpnts numtype p2rect pcsr pnt2x poissonNoise poly + poly2D qcsr r2polar real rightx round sawtooth + scaleToIndex sec sech sign sin sinIntegral sinc sinh + sqrt str2num stringCRC stringmatch strlen strsearch sum + tan tango_close_device tango_command_inout + tango_compute_image_proj tango_get_dev_attr_list + tango_get_dev_black_box tango_get_dev_cmd_list + tango_get_dev_status tango_get_dev_timeout + tango_get_error_stack tango_open_device + tango_ping_device tango_read_attribute + tango_read_attributes tango_reload_dev_interface + tango_resume_attr_monitor tango_set_attr_monitor_period + tango_set_dev_timeout tango_start_attr_monitor + tango_stop_attr_monitor tango_suspend_attr_monitor + tango_write_attribute tango_write_attributes tanh ticks + time trunc vcsr viAssertIntrSignal viAssertTrigger + viAssertUtilSignal viClear viClose viDisableEvent + viDiscardEvents viEnableEvent viFindNext viFindRsrc + viGetAttribute viGetAttributeString viGpibCommand + viGpibControlATN viGpibControlREN viGpibPassControl + viGpibSendIFC viIn16 viIn32 viIn8 viLock viMapAddress + viMapTrigger viMemAlloc viMemFree viMoveIn16 viMoveIn32 + viMoveIn8 viMoveOut16 viMoveOut32 viMoveOut8 viOpen + viOpenDefaultRM viOut16 viOut32 viOut8 viPeek16 + viPeek32 viPeek8 viPoke16 viPoke32 viPoke8 viRead + viReadSTB viSetAttribute viSetAttributeString + viStatusDesc viTerminate viUnlock viUnmapAddress + viUnmapTrigger viUsbControlIn viUsbControlOut + viVxiCommandQuery viWaitOnEvent viWrite wnoise x2pnt + xcsr zcsr zeromq_client_connect zeromq_client_connect + zeromq_client_recv zeromq_client_recv + zeromq_client_send zeromq_client_send + zeromq_handler_start zeromq_handler_start + zeromq_handler_stop zeromq_handler_stop + zeromq_server_bind zeromq_server_bind + zeromq_server_recv zeromq_server_recv + zeromq_server_send zeromq_server_send zeromq_set + zeromq_set zeromq_stop zeromq_stop + zeromq_test_callfunction zeromq_test_callfunction + zeromq_test_serializeWave zeromq_test_serializeWave + zeta + ) + end + + def self.igorOperation + @igorOperation ||= Set.new %w( + APMath Abort AddFIFOData AddFIFOVectData AddMovieAudio + AddMovieFrame AddWavesToBoxPlot AddWavesToViolinPlot + AdoptFiles Append AppendBoxPlot AppendImage + AppendLayoutObject AppendMatrixContour AppendText + AppendToGizmo AppendToGraph AppendToLayout + AppendToTable AppendViolinPlot AppendXYZContour + AutoPositionWindow AxonTelegraphFindServers + BackgroundInfo Beep BoundingBall BoxSmooth BrowseURL + BuildMenu Button CWT Chart CheckBox CheckDisplayed + ChooseColor Close CloseHelp CloseMovie CloseProc + ColorScale ColorTab2Wave Concatenate ControlBar + ControlInfo ControlUpdate + ConvertGlobalStringTextEncoding ConvexHull Convolve + CopyDimLabels CopyFile CopyFolder CopyScales Correlate + CreateAliasShortcut CreateBrowser Cross CtrlBackground + CtrlFIFO CtrlNamedBackground Cursor CurveFit + CustomControl DAQmx_AI_SetupReader DAQmx_AO_SetOutputs + DAQmx_CTR_CountEdges DAQmx_CTR_OutputPulse + DAQmx_CTR_Period DAQmx_CTR_PulseWidth DAQmx_DIO_Config + DAQmx_DIO_WriteNewData DAQmx_Scan DAQmx_WaveformGen + DPSS DSPDetrend DSPPeriodogram DWT Debugger + DebuggerOptions DefaultFont DefaultGuiControls + DefaultGuiFont DefaultTextEncoding DefineGuide + DelayUpdate DeleteAnnotations DeleteFile DeleteFolder + DeletePoints Differentiate Display DisplayHelpTopic + DisplayProcedure DoAlert DoIgorMenu DoUpdate DoWindow + DoXOPIdle DrawAction DrawArc DrawBezier DrawLine + DrawOval DrawPICT DrawPoly DrawRRect DrawRect DrawText + DrawUserShape Duplicate DuplicateDataFolder EdgeStats + Edit ErrorBars EstimatePeakSizes Execute + ExecuteScriptText ExperimentInfo ExperimentModified + ExportGizmo Extract FBinRead FBinWrite FFT FGetPos + FIFO2Wave FIFOStatus FMaxFlat FPClustering FReadLine + FSetPos FStatus FTPCreateDirectory FTPDelete + FTPDownload FTPUpload FastGaussTransform FastOp + FilterFIR FilterIIR FindAPeak FindContour + FindDuplicates FindLevel FindLevels FindPeak + FindPointsInPoly FindRoots FindSequence FindValue + FuncFit FuncFitMD GBLoadWave GISCreateVectorLayer + GISGetRasterInfo GISGetRegisteredFileInfo + GISGetVectorLayerInfo GISLoadRasterData + GISLoadVectorData GISRasterizeVectorData + GISRegisterFile GISTransformCoords GISUnRegisterFile + GISWriteFieldData GISWriteGeometryData GISWriteRaster + GPIB2 GPIBRead2 GPIBReadBinary2 GPIBReadBinaryWave2 + GPIBReadWave2 GPIBWrite2 GPIBWriteBinary2 + GPIBWriteBinaryWave2 GPIBWriteWave2 GetAxis GetCamera + GetFileFolderInfo GetGizmo GetLastUserMenuInfo + GetMarquee GetMouse GetSelection GetWindow GraphNormal + GraphWaveDraw GraphWaveEdit Grep GroupBox + HDF5CloseFile HDF5CloseGroup HDF5ConvertColors + HDF5CreateFile HDF5CreateGroup HDF5CreateLink HDF5Dump + HDF5DumpErrors HDF5DumpState HDF5FlushFile + HDF5ListAttributes HDF5ListGroup HDF5LoadData + HDF5LoadGroup HDF5LoadImage HDF5OpenFile HDF5OpenGroup + HDF5SaveData HDF5SaveGroup HDF5SaveImage + HDF5TestOperation HDF5UnlinkObject HDFInfo + HDFReadImage HDFReadSDS HDFReadVset Hanning + HideIgorMenus HideInfo HideProcedures HideTools + HilbertTransform Histogram ICA IFFT ITCCloseAll2 + ITCCloseDevice2 ITCConfigAllChannels2 + ITCConfigChannel2 ITCConfigChannelReset2 + ITCConfigChannelUpload2 ITCFIFOAvailable2 + ITCFIFOAvailableAll2 ITCGetAllChannelsConfig2 + ITCGetChannelConfig2 ITCGetCurrentDevice2 + ITCGetDeviceInfo2 ITCGetDevices2 ITCGetErrorString2 + ITCGetSerialNumber2 ITCGetState2 ITCGetVersions2 + ITCInitialize2 ITCOpenDevice2 ITCReadADC2 + ITCReadDigital2 ITCReadTimer2 ITCSelectDevice2 + ITCSetDAC2 ITCSetGlobals2 ITCSetModes2 ITCSetState2 + ITCStartAcq2 ITCStopAcq2 ITCUpdateFIFOPosition2 + ITCUpdateFIFOPositionAll2 ITCWriteDigital2 + ImageAnalyzeParticles ImageBlend ImageBoundaryToMask + ImageComposite ImageEdgeDetection ImageFileInfo + ImageFilter ImageFocus ImageFromXYZ ImageGLCM + ImageGenerateROIMask ImageHistModification + ImageHistogram ImageInterpolate ImageLineProfile + ImageLoad ImageMorphology ImageRegistration + ImageRemoveBackground ImageRestore ImageRotate + ImageSave ImageSeedFill ImageSkeleton3d ImageSnake + ImageStats ImageThreshold ImageTransform + ImageUnwrapPhase ImageWindow IndexSort InsertPoints + Integrate Integrate2D IntegrateODE Interp3DPath + Interpolate2 Interpolate3D JCAMPLoadWave + JointHistogram KMeans KillBackground KillControl + KillDataFolder KillFIFO KillFreeAxis KillPICTs + KillPath KillStrings KillVariables KillWaves + KillWindow Label Layout LayoutPageAction + LayoutSlideShow Legend LinearFeedbackShiftRegister + ListBox LoadData LoadPICT LoadPackagePreferences + LoadWave Loess LombPeriodogram MCC_FindServers + MFR_CheckForNewBricklets MFR_CloseResultFile + MFR_CreateOverviewTable MFR_GetBrickletCount + MFR_GetBrickletData MFR_GetBrickletDeployData + MFR_GetBrickletMetaData MFR_GetBrickletRawData + MFR_GetReportTemplate MFR_GetResultFileMetaData + MFR_GetResultFileName MFR_GetVernissageVersion + MFR_GetVersion MFR_GetXOPErrorMessage + MFR_OpenResultFile + MLLoadWave Make MakeIndex MarkPerfTestTime + MatrixConvolve MatrixCorr MatrixEigenV MatrixFilter + MatrixGLM MatrixGaussJ MatrixInverse MatrixLLS + MatrixLUBkSub MatrixLUD MatrixLUDTD MatrixLinearSolve + MatrixLinearSolveTD MatrixMultiply MatrixOP + MatrixSVBkSub MatrixSVD MatrixSchur MatrixSolve + MatrixTranspose MeasureStyledText Modify ModifyBoxPlot + ModifyBrowser ModifyCamera ModifyContour ModifyControl + ModifyControlList ModifyFreeAxis ModifyGizmo + ModifyGraph ModifyImage ModifyLayout ModifyPanel + ModifyTable ModifyViolinPlot ModifyWaterfall + MoveDataFolder MoveFile MoveFolder MoveString + MoveSubwindow MoveVariable MoveWave MoveWindow + MultiTaperPSD MultiThreadingControl NC_CloseFile + NC_DumpErrors NC_Inquire NC_ListAttributes + NC_ListObjects NC_LoadData NC_OpenFile NI4882 + NILoadWave NeuralNetworkRun NeuralNetworkTrain + NewCamera NewDataFolder NewFIFO NewFIFOChan + NewFreeAxis NewGizmo NewImage NewLayout NewMovie + NewNotebook NewPanel NewPath NewWaterfall Note + Notebook NotebookAction Open OpenHelp OpenNotebook + Optimize PCA ParseOperationTemplate PathInfo + PauseForUser PauseUpdate PlayMovie PlayMovieAction + PlaySound PopupContextualMenu PopupMenu Preferences + PrimeFactors Print PrintGraphs PrintLayout + PrintNotebook PrintSettings PrintTable Project + PulseStats PutScrapText Quit RatioFromNumber + Redimension Remez Remove RemoveContour RemoveFromGizmo + RemoveFromGraph RemoveFromLayout RemoveFromTable + RemoveImage RemoveLayoutObjects RemovePath Rename + RenameDataFolder RenamePICT RenamePath RenameWindow + ReorderImages ReorderTraces ReplaceText ReplaceWave + Resample ResumeUpdate Reverse Rotate SQLHighLevelOp + STFT Save SaveData SaveExperiment SaveGizmoCopy + SaveGraphCopy SaveNotebook SavePICT + SavePackagePreferences SaveTableCopy + SetActiveSubwindow SetAxis SetBackground + SetDashPattern SetDataFolder SetDimLabel SetDrawEnv + SetDrawLayer SetFileFolderInfo SetFormula + SetIdlePeriod SetIgorHook SetIgorMenuMode + SetIgorOption SetMarquee SetProcessSleep SetRandomSeed + SetScale SetVariable SetWaveLock SetWaveTextEncoding + SetWindow ShowIgorMenus ShowInfo ShowTools Silent + Sleep Slider Smooth SmoothCustom Sort SortColumns + SoundInRecord SoundInSet SoundInStartChart + SoundInStatus SoundInStopChart SoundLoadWave + SoundSaveWave SphericalInterpolate + SphericalTriangulate SplitString SplitWave Stack + StackWindows StatsANOVA1Test StatsANOVA2NRTest + StatsANOVA2RMTest StatsANOVA2Test + StatsAngularDistanceTest StatsChiTest + StatsCircularCorrelationTest StatsCircularMeans + StatsCircularMoments StatsCircularTwoSampleTest + StatsCochranTest StatsContingencyTable StatsDIPTest + StatsDunnettTest StatsFTest StatsFriedmanTest + StatsHodgesAjneTest StatsJBTest StatsKDE StatsKSTest + StatsKWTest StatsKendallTauTest + StatsLinearCorrelationTest StatsLinearRegression + StatsMultiCorrelationTest StatsNPMCTest + StatsNPNominalSRTest StatsQuantiles + StatsRankCorrelationTest StatsResample StatsSRTest + StatsSample StatsScheffeTest StatsShapiroWilkTest + StatsSignTest StatsTTest StatsTukeyTest + StatsVariancesTest StatsWRCorrelationTest + StatsWatsonUSquaredTest StatsWatsonWilliamsTest + StatsWheelerWatsonTest StatsWilcoxonRankTest String + StructFill StructGet StructPut SumDimension SumSeries + TDMLoadData TDMSaveData TabControl Tag TextBox + ThreadGroupPutDF ThreadStart TickWavesFromAxis Tile + TileWindows TitleBox ToCommandLine ToolsGrid + Triangulate3d URLRequest Unwrap VDT2 VDTClosePort2 + VDTGetPortList2 VDTGetStatus2 VDTOpenPort2 + VDTOperationsPort2 VDTRead2 VDTReadBinary2 + VDTReadBinaryWave2 VDTReadHex2 VDTReadHexWave2 + VDTReadWave2 VDTTerminalPort2 VDTWrite2 + VDTWriteBinary2 VDTWriteBinaryWave2 VDTWriteHex2 + VDTWriteHexWave2 VDTWriteWave2 VISAControl VISARead + VISAReadBinary VISAReadBinaryWave VISAReadWave + VISAWrite VISAWriteBinary VISAWriteBinaryWave + VISAWriteWave ValDisplay Variable WaveMeanStdv + WaveStats WaveTransform WignerTransform WindowFunction + XLLoadWave cd dir fprintf printf pwd sprintf sscanf + wfprintf + ) + end + + def self.object_name + /\b[a-z][a-z0-9_\.]*?\b/i + end + + object = self.object_name + noLineBreak = /(?:[ \t]|(?:\\\s*[\r\n]))+/ + operator = %r([\#$~!%^&*+=\|?:<>/-]) + punctuation = /[{}()\[\],.;]/ + number_float= /0x[a-f0-9]+/i + number_hex = /\d+\.\d+(e[\+\-]?\d+)?/ + number_int = /[\d]+(?:_\d+)*/ + + state :root do + rule %r(//), Comment, :comments + + rule %r/#{object}/ do |m| + if m[0].downcase =~ /function/ + token Keyword::Declaration + push :parse_function + elsif self.class.igorDeclarations.include? m[0].downcase + token Keyword::Declaration + push :parse_variables + elsif self.class.keywords.include? m[0].downcase + token Keyword + elsif self.class.igorConstants.include? m[0].downcase + token Keyword::Constant + elsif self.class.igorFunction.include? m[0].downcase + token Name::Builtin + elsif self.class.igorOperation.include? m[0].downcase + token Keyword::Reserved + push :operationFlags + elsif m[0].downcase =~ /\b(v|s|w)_[a-z]+[a-z0-9]*/ + token Name::Constant + else + token Name + end + end + + mixin :preprocessor + mixin :waveFlag + + mixin :characters + mixin :numbers + mixin :whitespace + end + + state :preprocessor do + rule %r((\#)(#{object})) do |m| + if self.class.preprocessor.include? m[2].downcase + token Comment::Preproc + else + token Punctuation, m[1] #i.e. ModuleFunctions + token Name, m[2] + end + + + end + end + + state :assignment do + mixin :whitespace + rule %r/\"/, Literal::String::Double, :string1 #punctuation for string + mixin :string2 + rule %r/#{number_float}/, Literal::Number::Float, :pop! + rule %r/#{number_int}/, Literal::Number::Integer, :pop! + rule %r/[\(\[\{][^\)\]\}]+[\)\]\}]/, Generic, :pop! + rule %r/[^\s\/\(]+/, Generic, :pop! + rule(//) { pop! } + end + + state :parse_variables do + mixin :whitespace + rule %r/[=]/, Punctuation, :assignment + rule object, Name::Variable + rule %r/[\[\]]/, Punctuation # optional variables in functions + rule %r/[,]/, Punctuation, :parse_variables + rule %r/\)/, Punctuation, :pop! # end of function + rule %r([/][a-z]+)i, Keyword::Pseudo, :parse_variables + rule(//) { pop! } + end + + state :parse_function do + rule %r([/][a-z]+)i, Keyword::Pseudo # only one flag + mixin :whitespace + rule object, Name::Function + rule %r/[\(]/, Punctuation, :parse_variables + rule(//) { pop! } + end + + state :operationFlags do + rule %r/#{noLineBreak}/, Text + rule %r/[=]/, Punctuation, :assignment + rule %r([/][a-z]+)i, Keyword::Pseudo, :operationFlags + rule %r/(as)(\s*)(#{object})/i do + groups Keyword::Type, Text, Name::Label + end + rule(//) { pop! } + end + + # inline variable assignments (i.e. for Make) with strict syntax + state :waveFlag do + rule %r( + (/(?:wave|X|Y)) + (\s*)(=)(\s*) + (#{object}) + )ix do |m| + token Keyword::Pseudo, m[1] + token Text, m[2] + token Punctuation, m[3] + token Text, m[4] + token Name::Variable, m[5] + end + end + + state :characters do + rule %r/\s/, Text + rule %r/#{operator}/, Operator + rule %r/#{punctuation}/, Punctuation + rule %r/\"/, Literal::String::Double, :string1 #punctuation for string + mixin :string2 + end + + state :numbers do + rule %r/#{number_float}/, Literal::Number::Float + rule %r/#{number_hex}/, Literal::Number::Hex + rule %r/#{number_int}/, Literal::Number::Integer + end + + state :whitespace do + rule %r/#{noLineBreak}/, Text + end + + state :string1 do + rule %r/%\w\b/, Literal::String::Other + rule %r/\\\\/, Literal::String::Escape + rule %r/\\\"/, Literal::String::Escape + rule %r/\\/, Literal::String::Escape + rule %r/[^"]/, Literal::String + rule %r/\"/, Literal::String::Double, :pop! #punctuation for string + end + + state :string2 do + rule %r/\'[^']*\'/, Literal::String::Single + end + + state :comments do + rule %r{([/]\s*)([@]\w+\b)}i do + # doxygen comments + groups Comment, Comment::Special + end + rule %r/[^\r\n]/, Comment + rule(//) { pop! } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ini.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ini.rb new file mode 100644 index 000000000000..b44014e7b9d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ini.rb @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class INI < RegexLexer + title "INI" + desc 'the INI configuration format' + tag 'ini' + + # TODO add more here + filenames '*.ini', '*.INI', '*.gitconfig' + mimetypes 'text/x-ini' + + identifier = /[\w\-.]+/ + + state :basic do + rule %r/[;#].*?\n/, Comment + rule %r/\s+/, Text + rule %r/\\\n/, Str::Escape + end + + state :root do + mixin :basic + + rule %r/(#{identifier})(\s*)(=)/ do + groups Name::Property, Text, Punctuation + push :value + end + + rule %r/\[.*?\]/, Name::Namespace + end + + state :value do + rule %r/\n/, Text, :pop! + mixin :basic + rule %r/"/, Str, :dq + rule %r/'.*?'/, Str + mixin :esc_str + rule %r/[^\\\n]+/, Str + end + + state :dq do + rule %r/"/, Str, :pop! + mixin :esc_str + rule %r/[^\\"]+/m, Str + end + + state :esc_str do + rule %r/\\./m, Str::Escape + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/io.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/io.rb new file mode 100644 index 000000000000..9e049a9ca3de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/io.rb @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class IO < RegexLexer + tag 'io' + title "Io" + desc 'The IO programming language (http://iolanguage.com)' + mimetypes 'text/x-iosrc' + filenames '*.io' + + def self.detect?(text) + return true if text.shebang? 'io' + end + + def self.constants + @constants ||= Set.new %w(nil false true) + end + + def self.builtins + @builtins ||= Set.new %w( + args call clone do doFile doString else elseif for if list + method return super then + ) + end + + state :root do + rule %r/\s+/m, Text + rule %r(//.*), Comment::Single + rule %r(#.*), Comment::Single + rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline + rule %r(/[+]), Comment::Multiline, :nested_comment + + rule %r/"(\\\\|\\"|[^"])*"/, Str + + rule %r(:?:=), Keyword + rule %r/[()]/, Punctuation + + rule %r([-=;,*+><!/|^.%&\[\]{}]), Operator + + rule %r/[A-Z]\w*/, Name::Class + + rule %r/[a-z_]\w*/ do |m| + name = m[0] + + if self.class.constants.include? name + token Keyword::Constant + elsif self.class.builtins.include? name + token Name::Builtin + else + token Name + end + end + + rule %r((\d+[.]?\d*|\d*[.]\d+)(e[+-]?[0-9]+)?)i, Num::Float + rule %r/\d+/, Num::Integer + + rule %r/@@?/, Keyword + end + + state :nested_comment do + rule %r([^/+]+)m, Comment::Multiline + rule %r(/[+]), Comment::Multiline, :nested_comment + rule %r([+]/), Comment::Multiline, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/irb.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/irb.rb new file mode 100644 index 000000000000..ed912f4ee72b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/irb.rb @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'console.rb' + + class IRBLexer < ConsoleLexer + tag 'irb' + aliases 'pry' + + desc 'Shell sessions in IRB or Pry' + + # unlike the superclass, we do not accept any options + @option_docs = {} + + def output_lexer + @output_lexer ||= IRBOutputLexer.new(@options) + end + + def lang_lexer + @lang_lexer ||= Ruby.new(@options) + end + + def prompt_regex + /^.*?(irb|pry).*?[>"*]/ + end + + def allow_comments? + true + end + end + + load_lexer 'ruby.rb' + class IRBOutputLexer < Ruby + tag 'irb_output' + + start do + push :stdout + end + + state :has_irb_output do + rule %r(=>), Punctuation, :pop! + rule %r/.+?(\n|$)/, Generic::Output + end + + state :irb_error do + rule %r/.+?(\n|$)/, Generic::Error + mixin :has_irb_output + end + + state :stdout do + rule %r/\w+?(Error|Exception):.+?(\n|$)/, Generic::Error, :irb_error + mixin :has_irb_output + end + + prepend :root do + rule %r/#</, Keyword::Type, :irb_object + end + + state :irb_object do + rule %r/>/, Keyword::Type, :pop! + mixin :root + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/isbl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/isbl.rb new file mode 100644 index 000000000000..2e1184b79fab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/isbl.rb @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class ISBL < RegexLexer + title "ISBL" + desc "The ISBL programming language" + tag 'isbl' + filenames '*.isbl' + + def self.builtins + Kernel::load File.join(Lexers::BASE_DIR, 'isbl/builtins.rb') + self.builtins + end + + def self.constants + @constants ||= self.builtins["const"].merge(self.builtins["enum"]).collect!(&:downcase) + end + + def self.interfaces + @interfaces ||= self.builtins["interface"].collect!(&:downcase) + end + + def self.globals + @globals ||= self.builtins["global"].collect!(&:downcase) + end + + def self.keywords + @keywords = Set.new %w( + and и else иначе endexcept endfinally endforeach конецвсе endif конецесли endwhile + конецпока except exitfor finally foreach все if если in в not не or или try while пока + ) + end + + state :whitespace do + rule %r/\s+/m, Text + rule %r(//.*?$), Comment::Single + rule %r(/[*].*?[*]/)m, Comment::Multiline + end + + state :dotted do + mixin :whitespace + rule %r/[a-zа-яё_0-9]+/i do |m| + name = m[0] + if self.class.constants.include? name.downcase + token Name::Builtin + elsif in_state? :type + token Keyword::Type + else + token Name + end + pop! + end + end + + state :type do + mixin :whitespace + rule %r/[a-zа-яё_0-9]+/i do |m| + name = m[0] + if self.class.interfaces.include? name.downcase + token Keyword::Type + else + token Name + end + pop! + end + rule %r/[.]/, Punctuation, :dotted + rule(//) { pop! } + end + + state :root do + mixin :whitespace + rule %r/[:]/, Punctuation, :type + rule %r/[.]/, Punctuation, :dotted + rule %r/[\[\]();]/, Punctuation + rule %r([&*+=<>/-]), Operator + rule %r/\b[a-zа-яё_][a-zа-яё_0-9]*(?=[(])/i, Name::Function + rule %r/[a-zа-яё_!][a-zа-яё_0-9]*/i do |m| + name = m[0] + if self.class.keywords.include? name.downcase + token Keyword + elsif self.class.constants.include? name.downcase + token Name::Builtin + elsif self.class.globals.include? name.downcase + token Name::Variable::Global + else + token Name::Variable + end + end + rule %r/\b(\d+(\.\d+)?)\b/, Literal::Number + rule %r(["].*?["])m, Literal::String::Double + rule %r(['].*?['])m, Literal::String::Single + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/isbl/builtins.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/isbl/builtins.rb new file mode 100644 index 000000000000..5e9eeeb433fb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/isbl/builtins.rb @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class ISBL + def self.builtins + @builtins ||= {}.tap do |b| + b["const"] = Set.new %w(SYSRES_CONST_ACCES_RIGHT_TYPE_EDIT SYSRES_CONST_ACCES_RIGHT_TYPE_FULL SYSRES_CONST_ACCES_RIGHT_TYPE_VIEW SYSRES_CONST_ACCESS_MODE_REQUISITE_CODE SYSRES_CONST_ACCESS_NO_ACCESS_VIEW SYSRES_CONST_ACCESS_NO_ACCESS_VIEW_CODE SYSRES_CONST_ACCESS_RIGHTS_ADD_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_ADD_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_CHANGE_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_CHANGE_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_DELETE_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_DELETE_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_EXECUTE_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_EXECUTE_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_NO_ACCESS_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_NO_ACCESS_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_RATIFY_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_RATIFY_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_VIEW SYSRES_CONST_ACCESS_RIGHTS_VIEW_CODE SYSRES_CONST_ACCESS_RIGHTS_VIEW_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_VIEW_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_TYPE_CHANGE SYSRES_CONST_ACCESS_TYPE_CHANGE_CODE SYSRES_CONST_ACCESS_TYPE_EXISTS SYSRES_CONST_ACCESS_TYPE_EXISTS_CODE SYSRES_CONST_ACCESS_TYPE_FULL SYSRES_CONST_ACCESS_TYPE_FULL_CODE SYSRES_CONST_ACCESS_TYPE_VIEW SYSRES_CONST_ACCESS_TYPE_VIEW_CODE SYSRES_CONST_ACTION_TYPE_ABORT SYSRES_CONST_ACTION_TYPE_ACCEPT SYSRES_CONST_ACTION_TYPE_ACCESS_RIGHTS SYSRES_CONST_ACTION_TYPE_ADD_ATTACHMENT SYSRES_CONST_ACTION_TYPE_CHANGE_CARD SYSRES_CONST_ACTION_TYPE_CHANGE_KIND SYSRES_CONST_ACTION_TYPE_CHANGE_STORAGE SYSRES_CONST_ACTION_TYPE_CONTINUE SYSRES_CONST_ACTION_TYPE_COPY SYSRES_CONST_ACTION_TYPE_CREATE SYSRES_CONST_ACTION_TYPE_CREATE_VERSION SYSRES_CONST_ACTION_TYPE_DELETE SYSRES_CONST_ACTION_TYPE_DELETE_ATTACHMENT SYSRES_CONST_ACTION_TYPE_DELETE_VERSION SYSRES_CONST_ACTION_TYPE_DISABLE_DELEGATE_ACCESS_RIGHTS SYSRES_CONST_ACTION_TYPE_ENABLE_DELEGATE_ACCESS_RIGHTS SYSRES_CONST_ACTION_TYPE_ENCRYPTION_BY_CERTIFICATE SYSRES_CONST_ACTION_TYPE_ENCRYPTION_BY_CERTIFICATE_AND_PASSWORD SYSRES_CONST_ACTION_TYPE_ENCRYPTION_BY_PASSWORD SYSRES_CONST_ACTION_TYPE_EXPORT_WITH_LOCK SYSRES_CONST_ACTION_TYPE_EXPORT_WITHOUT_LOCK SYSRES_CONST_ACTION_TYPE_IMPORT_WITH_UNLOCK SYSRES_CONST_ACTION_TYPE_IMPORT_WITHOUT_UNLOCK SYSRES_CONST_ACTION_TYPE_LIFE_CYCLE_STAGE SYSRES_CONST_ACTION_TYPE_LOCK SYSRES_CONST_ACTION_TYPE_LOCK_FOR_SERVER SYSRES_CONST_ACTION_TYPE_LOCK_MODIFY SYSRES_CONST_ACTION_TYPE_MARK_AS_READED SYSRES_CONST_ACTION_TYPE_MARK_AS_UNREADED SYSRES_CONST_ACTION_TYPE_MODIFY SYSRES_CONST_ACTION_TYPE_MODIFY_CARD SYSRES_CONST_ACTION_TYPE_MOVE_TO_ARCHIVE SYSRES_CONST_ACTION_TYPE_OFF_ENCRYPTION SYSRES_CONST_ACTION_TYPE_PASSWORD_CHANGE SYSRES_CONST_ACTION_TYPE_PERFORM SYSRES_CONST_ACTION_TYPE_RECOVER_FROM_LOCAL_COPY SYSRES_CONST_ACTION_TYPE_RESTART SYSRES_CONST_ACTION_TYPE_RESTORE_FROM_ARCHIVE SYSRES_CONST_ACTION_TYPE_REVISION SYSRES_CONST_ACTION_TYPE_SEND_BY_MAIL SYSRES_CONST_ACTION_TYPE_SIGN SYSRES_CONST_ACTION_TYPE_START SYSRES_CONST_ACTION_TYPE_UNLOCK SYSRES_CONST_ACTION_TYPE_UNLOCK_FROM_SERVER SYSRES_CONST_ACTION_TYPE_VERSION_STATE SYSRES_CONST_ACTION_TYPE_VERSION_VISIBILITY SYSRES_CONST_ACTION_TYPE_VIEW SYSRES_CONST_ACTION_TYPE_VIEW_SHADOW_COPY SYSRES_CONST_ACTION_TYPE_WORKFLOW_DESCRIPTION_MODIFY SYSRES_CONST_ACTION_TYPE_WRITE_HISTORY SYSRES_CONST_ACTIVE_VERSION_STATE_PICK_VALUE SYSRES_CONST_ADD_REFERENCE_MODE_NAME SYSRES_CONST_ADDITION_REQUISITE_CODE SYSRES_CONST_ADDITIONAL_PARAMS_REQUISITE_CODE SYSRES_CONST_ADITIONAL_JOB_END_DATE_REQUISITE_NAME SYSRES_CONST_ADITIONAL_JOB_READ_REQUISITE_NAME SYSRES_CONST_ADITIONAL_JOB_START_DATE_REQUISITE_NAME SYSRES_CONST_ADITIONAL_JOB_STATE_REQUISITE_NAME SYSRES_CONST_ADMINISTRATION_HISTORY_ADDING_USER_TO_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_ADDING_USER_TO_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_COMP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_COMP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_USER_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_USER_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_DATABASE_USER_CREATION SYSRES_CONST_ADMINISTRATION_HISTORY_DATABASE_USER_CREATION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DATABASE_USER_DELETION SYSRES_CONST_ADMINISTRATION_HISTORY_DATABASE_USER_DELETION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_COMP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_COMP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_USER_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_USER_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_USER_FROM_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_USER_FROM_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_FILTERER_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_FILTERER_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_FILTERER_RESTRICTION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_FILTERER_RESTRICTION_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_PRIVILEGE_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_PRIVILEGE_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_RIGHTS_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_RIGHTS_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_IS_MAIN_SERVER_CHANGED_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_IS_MAIN_SERVER_CHANGED_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_IS_PUBLIC_CHANGED_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_IS_PUBLIC_CHANGED_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_FILTERER_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_FILTERER_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_FILTERER_RESTRICTION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_FILTERER_RESTRICTION_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_PRIVILEGE_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_PRIVILEGE_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_RIGHTS_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_RIGHTS_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_SERVER_LOGIN_CREATION SYSRES_CONST_ADMINISTRATION_HISTORY_SERVER_LOGIN_CREATION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_SERVER_LOGIN_DELETION SYSRES_CONST_ADMINISTRATION_HISTORY_SERVER_LOGIN_DELETION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_CATEGORY_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_CATEGORY_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_COMP_TITLE_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_COMP_TITLE_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_FULL_NAME_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_FULL_NAME_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_PARENT_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_PARENT_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_AUTH_TYPE_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_AUTH_TYPE_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_LOGIN_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_LOGIN_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_STATUS_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_STATUS_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_USER_PASSWORD_CHANGE SYSRES_CONST_ADMINISTRATION_HISTORY_USER_PASSWORD_CHANGE_ACTION SYSRES_CONST_ALL_ACCEPT_CONDITION_RUS SYSRES_CONST_ALL_USERS_GROUP SYSRES_CONST_ALL_USERS_GROUP_NAME SYSRES_CONST_ALL_USERS_SERVER_GROUP_NAME SYSRES_CONST_ALLOWED_ACCESS_TYPE_CODE SYSRES_CONST_ALLOWED_ACCESS_TYPE_NAME SYSRES_CONST_APP_VIEWER_TYPE_REQUISITE_CODE SYSRES_CONST_APPROVING_SIGNATURE_NAME SYSRES_CONST_APPROVING_SIGNATURE_REQUISITE_CODE SYSRES_CONST_ASSISTANT_SUBSTITUE_TYPE SYSRES_CONST_ASSISTANT_SUBSTITUE_TYPE_CODE SYSRES_CONST_ATTACH_TYPE_COMPONENT_TOKEN SYSRES_CONST_ATTACH_TYPE_DOC SYSRES_CONST_ATTACH_TYPE_EDOC SYSRES_CONST_ATTACH_TYPE_FOLDER SYSRES_CONST_ATTACH_TYPE_JOB SYSRES_CONST_ATTACH_TYPE_REFERENCE SYSRES_CONST_ATTACH_TYPE_TASK SYSRES_CONST_AUTH_ENCODED_PASSWORD SYSRES_CONST_AUTH_ENCODED_PASSWORD_CODE SYSRES_CONST_AUTH_NOVELL SYSRES_CONST_AUTH_PASSWORD SYSRES_CONST_AUTH_PASSWORD_CODE SYSRES_CONST_AUTH_WINDOWS SYSRES_CONST_AUTHENTICATING_SIGNATURE_NAME SYSRES_CONST_AUTHENTICATING_SIGNATURE_REQUISITE_CODE SYSRES_CONST_AUTO_ENUM_METHOD_FLAG SYSRES_CONST_AUTO_NUMERATION_CODE SYSRES_CONST_AUTO_STRONG_ENUM_METHOD_FLAG SYSRES_CONST_AUTOTEXT_NAME_REQUISITE_CODE SYSRES_CONST_AUTOTEXT_TEXT_REQUISITE_CODE SYSRES_CONST_AUTOTEXT_USAGE_ALL SYSRES_CONST_AUTOTEXT_USAGE_ALL_CODE SYSRES_CONST_AUTOTEXT_USAGE_SIGN SYSRES_CONST_AUTOTEXT_USAGE_SIGN_CODE SYSRES_CONST_AUTOTEXT_USAGE_WORK SYSRES_CONST_AUTOTEXT_USAGE_WORK_CODE SYSRES_CONST_AUTOTEXT_USE_ANYWHERE_CODE SYSRES_CONST_AUTOTEXT_USE_ON_SIGNING_CODE SYSRES_CONST_AUTOTEXT_USE_ON_WORK_CODE SYSRES_CONST_BEGIN_DATE_REQUISITE_CODE SYSRES_CONST_BLACK_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_BLUE_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_BTN_PART SYSRES_CONST_CALCULATED_ROLE_TYPE_CODE SYSRES_CONST_CALL_TYPE_VARIABLE_BUTTON_VALUE SYSRES_CONST_CALL_TYPE_VARIABLE_PROGRAM_VALUE SYSRES_CONST_CANCEL_MESSAGE_FUNCTION_RESULT SYSRES_CONST_CARD_PART SYSRES_CONST_CARD_REFERENCE_MODE_NAME SYSRES_CONST_CERTIFICATE_TYPE_REQUISITE_ENCRYPT_VALUE SYSRES_CONST_CERTIFICATE_TYPE_REQUISITE_SIGN_AND_ENCRYPT_VALUE SYSRES_CONST_CERTIFICATE_TYPE_REQUISITE_SIGN_VALUE SYSRES_CONST_CHECK_PARAM_VALUE_DATE_PARAM_TYPE SYSRES_CONST_CHECK_PARAM_VALUE_FLOAT_PARAM_TYPE SYSRES_CONST_CHECK_PARAM_VALUE_INTEGER_PARAM_TYPE SYSRES_CONST_CHECK_PARAM_VALUE_PICK_PARAM_TYPE SYSRES_CONST_CHECK_PARAM_VALUE_REEFRENCE_PARAM_TYPE SYSRES_CONST_CLOSED_RECORD_FLAG_VALUE_FEMININE SYSRES_CONST_CLOSED_RECORD_FLAG_VALUE_MASCULINE SYSRES_CONST_CODE_COMPONENT_TYPE_ADMIN SYSRES_CONST_CODE_COMPONENT_TYPE_DEVELOPER SYSRES_CONST_CODE_COMPONENT_TYPE_DOCS SYSRES_CONST_CODE_COMPONENT_TYPE_EDOC_CARDS SYSRES_CONST_CODE_COMPONENT_TYPE_EXTERNAL_EXECUTABLE SYSRES_CONST_CODE_COMPONENT_TYPE_OTHER SYSRES_CONST_CODE_COMPONENT_TYPE_REFERENCE SYSRES_CONST_CODE_COMPONENT_TYPE_REPORT SYSRES_CONST_CODE_COMPONENT_TYPE_SCRIPT SYSRES_CONST_CODE_COMPONENT_TYPE_URL SYSRES_CONST_CODE_REQUISITE_ACCESS SYSRES_CONST_CODE_REQUISITE_CODE SYSRES_CONST_CODE_REQUISITE_COMPONENT SYSRES_CONST_CODE_REQUISITE_DESCRIPTION SYSRES_CONST_CODE_REQUISITE_EXCLUDE_COMPONENT SYSRES_CONST_CODE_REQUISITE_RECORD SYSRES_CONST_COMMENT_REQ_CODE SYSRES_CONST_COMMON_SETTINGS_REQUISITE_CODE SYSRES_CONST_COMP_CODE_GRD SYSRES_CONST_COMPONENT_GROUP_TYPE_REQUISITE_CODE SYSRES_CONST_COMPONENT_TYPE_ADMIN_COMPONENTS SYSRES_CONST_COMPONENT_TYPE_DEVELOPER_COMPONENTS SYSRES_CONST_COMPONENT_TYPE_DOCS SYSRES_CONST_COMPONENT_TYPE_EDOC_CARDS SYSRES_CONST_COMPONENT_TYPE_EDOCS SYSRES_CONST_COMPONENT_TYPE_EXTERNAL_EXECUTABLE SYSRES_CONST_COMPONENT_TYPE_OTHER SYSRES_CONST_COMPONENT_TYPE_REFERENCE_TYPES SYSRES_CONST_COMPONENT_TYPE_REFERENCES SYSRES_CONST_COMPONENT_TYPE_REPORTS SYSRES_CONST_COMPONENT_TYPE_SCRIPTS SYSRES_CONST_COMPONENT_TYPE_URL SYSRES_CONST_COMPONENTS_REMOTE_SERVERS_VIEW_CODE SYSRES_CONST_CONDITION_BLOCK_DESCRIPTION SYSRES_CONST_CONST_FIRM_STATUS_COMMON SYSRES_CONST_CONST_FIRM_STATUS_INDIVIDUAL SYSRES_CONST_CONST_NEGATIVE_VALUE SYSRES_CONST_CONST_POSITIVE_VALUE SYSRES_CONST_CONST_SERVER_STATUS_DONT_REPLICATE SYSRES_CONST_CONST_SERVER_STATUS_REPLICATE SYSRES_CONST_CONTENTS_REQUISITE_CODE SYSRES_CONST_DATA_TYPE_BOOLEAN SYSRES_CONST_DATA_TYPE_DATE SYSRES_CONST_DATA_TYPE_FLOAT SYSRES_CONST_DATA_TYPE_INTEGER SYSRES_CONST_DATA_TYPE_PICK SYSRES_CONST_DATA_TYPE_REFERENCE SYSRES_CONST_DATA_TYPE_STRING SYSRES_CONST_DATA_TYPE_TEXT SYSRES_CONST_DATA_TYPE_VARIANT SYSRES_CONST_DATE_CLOSE_REQ_CODE SYSRES_CONST_DATE_FORMAT_DATE_ONLY_CHAR SYSRES_CONST_DATE_OPEN_REQ_CODE SYSRES_CONST_DATE_REQUISITE SYSRES_CONST_DATE_REQUISITE_CODE SYSRES_CONST_DATE_REQUISITE_NAME SYSRES_CONST_DATE_REQUISITE_TYPE SYSRES_CONST_DATE_TYPE_CHAR SYSRES_CONST_DATETIME_FORMAT_VALUE SYSRES_CONST_DEA_ACCESS_RIGHTS_ACTION_CODE SYSRES_CONST_DESCRIPTION_LOCALIZE_ID_REQUISITE_CODE SYSRES_CONST_DESCRIPTION_REQUISITE_CODE SYSRES_CONST_DET1_PART SYSRES_CONST_DET2_PART SYSRES_CONST_DET3_PART SYSRES_CONST_DET4_PART SYSRES_CONST_DET5_PART SYSRES_CONST_DET6_PART SYSRES_CONST_DETAIL_DATASET_KEY_REQUISITE_CODE SYSRES_CONST_DETAIL_PICK_REQUISITE_CODE SYSRES_CONST_DETAIL_REQ_CODE SYSRES_CONST_DO_NOT_USE_ACCESS_TYPE_CODE SYSRES_CONST_DO_NOT_USE_ACCESS_TYPE_NAME SYSRES_CONST_DO_NOT_USE_ON_VIEW_ACCESS_TYPE_CODE SYSRES_CONST_DO_NOT_USE_ON_VIEW_ACCESS_TYPE_NAME SYSRES_CONST_DOCUMENT_STORAGES_CODE SYSRES_CONST_DOCUMENT_TEMPLATES_TYPE_NAME SYSRES_CONST_DOUBLE_REQUISITE_CODE SYSRES_CONST_EDITOR_CLOSE_FILE_OBSERV_TYPE_CODE SYSRES_CONST_EDITOR_CLOSE_PROCESS_OBSERV_TYPE_CODE SYSRES_CONST_EDITOR_TYPE_REQUISITE_CODE SYSRES_CONST_EDITORS_APPLICATION_NAME_REQUISITE_CODE SYSRES_CONST_EDITORS_CREATE_SEVERAL_PROCESSES_REQUISITE_CODE SYSRES_CONST_EDITORS_EXTENSION_REQUISITE_CODE SYSRES_CONST_EDITORS_OBSERVER_BY_PROCESS_TYPE SYSRES_CONST_EDITORS_REFERENCE_CODE SYSRES_CONST_EDITORS_REPLACE_SPEC_CHARS_REQUISITE_CODE SYSRES_CONST_EDITORS_USE_PLUGINS_REQUISITE_CODE SYSRES_CONST_EDITORS_VIEW_DOCUMENT_OPENED_TO_EDIT_CODE SYSRES_CONST_EDOC_CARD_TYPE_REQUISITE_CODE SYSRES_CONST_EDOC_CARD_TYPES_LINK_REQUISITE_CODE SYSRES_CONST_EDOC_CERTIFICATE_AND_PASSWORD_ENCODE_CODE SYSRES_CONST_EDOC_CERTIFICATE_ENCODE_CODE SYSRES_CONST_EDOC_DATE_REQUISITE_CODE SYSRES_CONST_EDOC_KIND_REFERENCE_CODE SYSRES_CONST_EDOC_KINDS_BY_TEMPLATE_ACTION_CODE SYSRES_CONST_EDOC_MANAGE_ACCESS_CODE SYSRES_CONST_EDOC_NONE_ENCODE_CODE SYSRES_CONST_EDOC_NUMBER_REQUISITE_CODE SYSRES_CONST_EDOC_PASSWORD_ENCODE_CODE SYSRES_CONST_EDOC_READONLY_ACCESS_CODE SYSRES_CONST_EDOC_SHELL_LIFE_TYPE_VIEW_VALUE SYSRES_CONST_EDOC_SIZE_RESTRICTION_PRIORITY_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_CHECK_ACCESS_RIGHTS_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_COMPUTER_NAME_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_DATABASE_NAME_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_EDIT_IN_STORAGE_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_LOCAL_PATH_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_SHARED_SOURCE_NAME_REQUISITE_CODE SYSRES_CONST_EDOC_TEMPLATE_REQUISITE_CODE SYSRES_CONST_EDOC_TYPES_REFERENCE_CODE SYSRES_CONST_EDOC_VERSION_ACTIVE_STAGE_CODE SYSRES_CONST_EDOC_VERSION_DESIGN_STAGE_CODE SYSRES_CONST_EDOC_VERSION_OBSOLETE_STAGE_CODE SYSRES_CONST_EDOC_WRITE_ACCES_CODE SYSRES_CONST_EDOCUMENT_CARD_REQUISITES_REFERENCE_CODE_SELECTED_REQUISITE SYSRES_CONST_ENCODE_CERTIFICATE_TYPE_CODE SYSRES_CONST_END_DATE_REQUISITE_CODE SYSRES_CONST_ENUMERATION_TYPE_REQUISITE_CODE SYSRES_CONST_EXECUTE_ACCESS_RIGHTS_TYPE_CODE SYSRES_CONST_EXECUTIVE_FILE_STORAGE_TYPE SYSRES_CONST_EXIST_CONST SYSRES_CONST_EXIST_VALUE SYSRES_CONST_EXPORT_LOCK_TYPE_ASK SYSRES_CONST_EXPORT_LOCK_TYPE_WITH_LOCK SYSRES_CONST_EXPORT_LOCK_TYPE_WITHOUT_LOCK SYSRES_CONST_EXPORT_VERSION_TYPE_ASK SYSRES_CONST_EXPORT_VERSION_TYPE_LAST SYSRES_CONST_EXPORT_VERSION_TYPE_LAST_ACTIVE SYSRES_CONST_EXTENSION_REQUISITE_CODE SYSRES_CONST_FILTER_NAME_REQUISITE_CODE SYSRES_CONST_FILTER_REQUISITE_CODE SYSRES_CONST_FILTER_TYPE_COMMON_CODE SYSRES_CONST_FILTER_TYPE_COMMON_NAME SYSRES_CONST_FILTER_TYPE_USER_CODE SYSRES_CONST_FILTER_TYPE_USER_NAME SYSRES_CONST_FILTER_VALUE_REQUISITE_NAME SYSRES_CONST_FLOAT_NUMBER_FORMAT_CHAR SYSRES_CONST_FLOAT_REQUISITE_TYPE SYSRES_CONST_FOLDER_AUTHOR_VALUE SYSRES_CONST_FOLDER_KIND_ANY_OBJECTS SYSRES_CONST_FOLDER_KIND_COMPONENTS SYSRES_CONST_FOLDER_KIND_EDOCS SYSRES_CONST_FOLDER_KIND_JOBS SYSRES_CONST_FOLDER_KIND_TASKS SYSRES_CONST_FOLDER_TYPE_COMMON SYSRES_CONST_FOLDER_TYPE_COMPONENT SYSRES_CONST_FOLDER_TYPE_FAVORITES SYSRES_CONST_FOLDER_TYPE_INBOX SYSRES_CONST_FOLDER_TYPE_OUTBOX SYSRES_CONST_FOLDER_TYPE_QUICK_LAUNCH SYSRES_CONST_FOLDER_TYPE_SEARCH SYSRES_CONST_FOLDER_TYPE_SHORTCUTS SYSRES_CONST_FOLDER_TYPE_USER SYSRES_CONST_FROM_DICTIONARY_ENUM_METHOD_FLAG SYSRES_CONST_FULL_SUBSTITUTE_TYPE SYSRES_CONST_FULL_SUBSTITUTE_TYPE_CODE SYSRES_CONST_FUNCTION_CANCEL_RESULT SYSRES_CONST_FUNCTION_CATEGORY_SYSTEM SYSRES_CONST_FUNCTION_CATEGORY_USER SYSRES_CONST_FUNCTION_FAILURE_RESULT SYSRES_CONST_FUNCTION_SAVE_RESULT SYSRES_CONST_GENERATED_REQUISITE SYSRES_CONST_GREEN_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_GROUP_ACCOUNT_TYPE_VALUE_CODE SYSRES_CONST_GROUP_CATEGORY_NORMAL_CODE SYSRES_CONST_GROUP_CATEGORY_NORMAL_NAME SYSRES_CONST_GROUP_CATEGORY_SERVICE_CODE SYSRES_CONST_GROUP_CATEGORY_SERVICE_NAME SYSRES_CONST_GROUP_COMMON_CATEGORY_FIELD_VALUE SYSRES_CONST_GROUP_FULL_NAME_REQUISITE_CODE SYSRES_CONST_GROUP_NAME_REQUISITE_CODE SYSRES_CONST_GROUP_RIGHTS_T_REQUISITE_CODE SYSRES_CONST_GROUP_SERVER_CODES_REQUISITE_CODE SYSRES_CONST_GROUP_SERVER_NAME_REQUISITE_CODE SYSRES_CONST_GROUP_SERVICE_CATEGORY_FIELD_VALUE SYSRES_CONST_GROUP_USER_REQUISITE_CODE SYSRES_CONST_GROUPS_REFERENCE_CODE SYSRES_CONST_GROUPS_REQUISITE_CODE SYSRES_CONST_HIDDEN_MODE_NAME SYSRES_CONST_HIGH_LVL_REQUISITE_CODE SYSRES_CONST_HISTORY_ACTION_CREATE_CODE SYSRES_CONST_HISTORY_ACTION_DELETE_CODE SYSRES_CONST_HISTORY_ACTION_EDIT_CODE SYSRES_CONST_HOUR_CHAR SYSRES_CONST_ID_REQUISITE_CODE SYSRES_CONST_IDSPS_REQUISITE_CODE SYSRES_CONST_IMAGE_MODE_COLOR SYSRES_CONST_IMAGE_MODE_GREYSCALE SYSRES_CONST_IMAGE_MODE_MONOCHROME SYSRES_CONST_IMPORTANCE_HIGH SYSRES_CONST_IMPORTANCE_LOW SYSRES_CONST_IMPORTANCE_NORMAL SYSRES_CONST_IN_DESIGN_VERSION_STATE_PICK_VALUE SYSRES_CONST_INCOMING_WORK_RULE_TYPE_CODE SYSRES_CONST_INT_REQUISITE SYSRES_CONST_INT_REQUISITE_TYPE SYSRES_CONST_INTEGER_NUMBER_FORMAT_CHAR SYSRES_CONST_INTEGER_TYPE_CHAR SYSRES_CONST_IS_GENERATED_REQUISITE_NEGATIVE_VALUE SYSRES_CONST_IS_PUBLIC_ROLE_REQUISITE_CODE SYSRES_CONST_IS_REMOTE_USER_NEGATIVE_VALUE SYSRES_CONST_IS_REMOTE_USER_POSITIVE_VALUE SYSRES_CONST_IS_STORED_REQUISITE_NEGATIVE_VALUE SYSRES_CONST_IS_STORED_REQUISITE_STORED_VALUE SYSRES_CONST_ITALIC_LIFE_CYCLE_STAGE_DRAW_STYLE SYSRES_CONST_JOB_BLOCK_DESCRIPTION SYSRES_CONST_JOB_KIND_CONTROL_JOB SYSRES_CONST_JOB_KIND_JOB SYSRES_CONST_JOB_KIND_NOTICE SYSRES_CONST_JOB_STATE_ABORTED SYSRES_CONST_JOB_STATE_COMPLETE SYSRES_CONST_JOB_STATE_WORKING SYSRES_CONST_KIND_REQUISITE_CODE SYSRES_CONST_KIND_REQUISITE_NAME SYSRES_CONST_KINDS_CREATE_SHADOW_COPIES_REQUISITE_CODE SYSRES_CONST_KINDS_DEFAULT_EDOC_LIFE_STAGE_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_ALL_TEPLATES_ALLOWED_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_ALLOW_LIFE_CYCLE_STAGE_CHANGING_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_ALLOW_MULTIPLE_ACTIVE_VERSIONS_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_SHARE_ACCES_RIGHTS_BY_DEFAULT_CODE SYSRES_CONST_KINDS_EDOC_TEMPLATE_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_TYPE_REQUISITE_CODE SYSRES_CONST_KINDS_SIGNERS_REQUISITES_CODE SYSRES_CONST_KOD_INPUT_TYPE SYSRES_CONST_LAST_UPDATE_DATE_REQUISITE_CODE SYSRES_CONST_LIFE_CYCLE_START_STAGE_REQUISITE_CODE SYSRES_CONST_LILAC_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_LINK_OBJECT_KIND_COMPONENT SYSRES_CONST_LINK_OBJECT_KIND_DOCUMENT SYSRES_CONST_LINK_OBJECT_KIND_EDOC SYSRES_CONST_LINK_OBJECT_KIND_FOLDER SYSRES_CONST_LINK_OBJECT_KIND_JOB SYSRES_CONST_LINK_OBJECT_KIND_REFERENCE SYSRES_CONST_LINK_OBJECT_KIND_TASK SYSRES_CONST_LINK_REF_TYPE_REQUISITE_CODE SYSRES_CONST_LIST_REFERENCE_MODE_NAME SYSRES_CONST_LOCALIZATION_DICTIONARY_MAIN_VIEW_CODE SYSRES_CONST_MAIN_VIEW_CODE SYSRES_CONST_MANUAL_ENUM_METHOD_FLAG SYSRES_CONST_MASTER_COMP_TYPE_REQUISITE_CODE SYSRES_CONST_MASTER_TABLE_REC_ID_REQUISITE_CODE SYSRES_CONST_MAXIMIZED_MODE_NAME SYSRES_CONST_ME_VALUE SYSRES_CONST_MESSAGE_ATTENTION_CAPTION SYSRES_CONST_MESSAGE_CONFIRMATION_CAPTION SYSRES_CONST_MESSAGE_ERROR_CAPTION SYSRES_CONST_MESSAGE_INFORMATION_CAPTION SYSRES_CONST_MINIMIZED_MODE_NAME SYSRES_CONST_MINUTE_CHAR SYSRES_CONST_MODULE_REQUISITE_CODE SYSRES_CONST_MONITORING_BLOCK_DESCRIPTION SYSRES_CONST_MONTH_FORMAT_VALUE SYSRES_CONST_NAME_LOCALIZE_ID_REQUISITE_CODE SYSRES_CONST_NAME_REQUISITE_CODE SYSRES_CONST_NAME_SINGULAR_REQUISITE_CODE SYSRES_CONST_NAMEAN_INPUT_TYPE SYSRES_CONST_NEGATIVE_PICK_VALUE SYSRES_CONST_NEGATIVE_VALUE SYSRES_CONST_NO SYSRES_CONST_NO_PICK_VALUE SYSRES_CONST_NO_SIGNATURE_REQUISITE_CODE SYSRES_CONST_NO_VALUE SYSRES_CONST_NONE_ACCESS_RIGHTS_TYPE_CODE SYSRES_CONST_NONOPERATING_RECORD_FLAG_VALUE SYSRES_CONST_NONOPERATING_RECORD_FLAG_VALUE_MASCULINE SYSRES_CONST_NORMAL_ACCESS_RIGHTS_TYPE_CODE SYSRES_CONST_NORMAL_LIFE_CYCLE_STAGE_DRAW_STYLE SYSRES_CONST_NORMAL_MODE_NAME SYSRES_CONST_NOT_ALLOWED_ACCESS_TYPE_CODE SYSRES_CONST_NOT_ALLOWED_ACCESS_TYPE_NAME SYSRES_CONST_NOTE_REQUISITE_CODE SYSRES_CONST_NOTICE_BLOCK_DESCRIPTION SYSRES_CONST_NUM_REQUISITE SYSRES_CONST_NUM_STR_REQUISITE_CODE SYSRES_CONST_NUMERATION_AUTO_NOT_STRONG SYSRES_CONST_NUMERATION_AUTO_STRONG SYSRES_CONST_NUMERATION_FROM_DICTONARY SYSRES_CONST_NUMERATION_MANUAL SYSRES_CONST_NUMERIC_TYPE_CHAR SYSRES_CONST_NUMREQ_REQUISITE_CODE SYSRES_CONST_OBSOLETE_VERSION_STATE_PICK_VALUE SYSRES_CONST_OPERATING_RECORD_FLAG_VALUE SYSRES_CONST_OPERATING_RECORD_FLAG_VALUE_CODE SYSRES_CONST_OPERATING_RECORD_FLAG_VALUE_FEMININE SYSRES_CONST_OPERATING_RECORD_FLAG_VALUE_MASCULINE SYSRES_CONST_OPTIONAL_FORM_COMP_REQCODE_PREFIX SYSRES_CONST_ORANGE_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_ORIGINALREF_REQUISITE_CODE SYSRES_CONST_OURFIRM_REF_CODE SYSRES_CONST_OURFIRM_REQUISITE_CODE SYSRES_CONST_OURFIRM_VAR SYSRES_CONST_OUTGOING_WORK_RULE_TYPE_CODE SYSRES_CONST_PICK_NEGATIVE_RESULT SYSRES_CONST_PICK_POSITIVE_RESULT SYSRES_CONST_PICK_REQUISITE SYSRES_CONST_PICK_REQUISITE_TYPE SYSRES_CONST_PICK_TYPE_CHAR SYSRES_CONST_PLAN_STATUS_REQUISITE_CODE SYSRES_CONST_PLATFORM_VERSION_COMMENT SYSRES_CONST_PLUGINS_SETTINGS_DESCRIPTION_REQUISITE_CODE SYSRES_CONST_POSITIVE_PICK_VALUE SYSRES_CONST_POWER_TO_CREATE_ACTION_CODE SYSRES_CONST_POWER_TO_SIGN_ACTION_CODE SYSRES_CONST_PRIORITY_REQUISITE_CODE SYSRES_CONST_QUALIFIED_TASK_TYPE SYSRES_CONST_QUALIFIED_TASK_TYPE_CODE SYSRES_CONST_RECSTAT_REQUISITE_CODE SYSRES_CONST_RED_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_REF_ID_T_REF_TYPE_REQUISITE_CODE SYSRES_CONST_REF_REQUISITE SYSRES_CONST_REF_REQUISITE_TYPE SYSRES_CONST_REF_REQUISITES_REFERENCE_CODE_SELECTED_REQUISITE SYSRES_CONST_REFERENCE_RECORD_HISTORY_CREATE_ACTION_CODE SYSRES_CONST_REFERENCE_RECORD_HISTORY_DELETE_ACTION_CODE SYSRES_CONST_REFERENCE_RECORD_HISTORY_MODIFY_ACTION_CODE SYSRES_CONST_REFERENCE_TYPE_CHAR SYSRES_CONST_REFERENCE_TYPE_REQUISITE_NAME SYSRES_CONST_REFERENCES_ADD_PARAMS_REQUISITE_CODE SYSRES_CONST_REFERENCES_DISPLAY_REQUISITE_REQUISITE_CODE SYSRES_CONST_REMOTE_SERVER_STATUS_WORKING SYSRES_CONST_REMOTE_SERVER_TYPE_MAIN SYSRES_CONST_REMOTE_SERVER_TYPE_SECONDARY SYSRES_CONST_REMOTE_USER_FLAG_VALUE_CODE SYSRES_CONST_REPORT_APP_EDITOR_INTERNAL SYSRES_CONST_REPORT_BASE_REPORT_ID_REQUISITE_CODE SYSRES_CONST_REPORT_BASE_REPORT_REQUISITE_CODE SYSRES_CONST_REPORT_SCRIPT_REQUISITE_CODE SYSRES_CONST_REPORT_TEMPLATE_REQUISITE_CODE SYSRES_CONST_REPORT_VIEWER_CODE_REQUISITE_CODE SYSRES_CONST_REQ_ALLOW_COMPONENT_DEFAULT_VALUE SYSRES_CONST_REQ_ALLOW_RECORD_DEFAULT_VALUE SYSRES_CONST_REQ_ALLOW_SERVER_COMPONENT_DEFAULT_VALUE SYSRES_CONST_REQ_MODE_AVAILABLE_CODE SYSRES_CONST_REQ_MODE_EDIT_CODE SYSRES_CONST_REQ_MODE_HIDDEN_CODE SYSRES_CONST_REQ_MODE_NOT_AVAILABLE_CODE SYSRES_CONST_REQ_MODE_VIEW_CODE SYSRES_CONST_REQ_NUMBER_REQUISITE_CODE SYSRES_CONST_REQ_SECTION_VALUE SYSRES_CONST_REQ_TYPE_VALUE SYSRES_CONST_REQUISITE_FORMAT_BY_UNIT SYSRES_CONST_REQUISITE_FORMAT_DATE_FULL SYSRES_CONST_REQUISITE_FORMAT_DATE_TIME SYSRES_CONST_REQUISITE_FORMAT_LEFT SYSRES_CONST_REQUISITE_FORMAT_RIGHT SYSRES_CONST_REQUISITE_FORMAT_WITHOUT_UNIT SYSRES_CONST_REQUISITE_NUMBER_REQUISITE_CODE SYSRES_CONST_REQUISITE_SECTION_ACTIONS SYSRES_CONST_REQUISITE_SECTION_BUTTON SYSRES_CONST_REQUISITE_SECTION_BUTTONS SYSRES_CONST_REQUISITE_SECTION_CARD SYSRES_CONST_REQUISITE_SECTION_TABLE SYSRES_CONST_REQUISITE_SECTION_TABLE10 SYSRES_CONST_REQUISITE_SECTION_TABLE11 SYSRES_CONST_REQUISITE_SECTION_TABLE12 SYSRES_CONST_REQUISITE_SECTION_TABLE13 SYSRES_CONST_REQUISITE_SECTION_TABLE14 SYSRES_CONST_REQUISITE_SECTION_TABLE15 SYSRES_CONST_REQUISITE_SECTION_TABLE16 SYSRES_CONST_REQUISITE_SECTION_TABLE17 SYSRES_CONST_REQUISITE_SECTION_TABLE18 SYSRES_CONST_REQUISITE_SECTION_TABLE19 SYSRES_CONST_REQUISITE_SECTION_TABLE2 SYSRES_CONST_REQUISITE_SECTION_TABLE20 SYSRES_CONST_REQUISITE_SECTION_TABLE21 SYSRES_CONST_REQUISITE_SECTION_TABLE22 SYSRES_CONST_REQUISITE_SECTION_TABLE23 SYSRES_CONST_REQUISITE_SECTION_TABLE24 SYSRES_CONST_REQUISITE_SECTION_TABLE3 SYSRES_CONST_REQUISITE_SECTION_TABLE4 SYSRES_CONST_REQUISITE_SECTION_TABLE5 SYSRES_CONST_REQUISITE_SECTION_TABLE6 SYSRES_CONST_REQUISITE_SECTION_TABLE7 SYSRES_CONST_REQUISITE_SECTION_TABLE8 SYSRES_CONST_REQUISITE_SECTION_TABLE9 SYSRES_CONST_REQUISITES_PSEUDOREFERENCE_REQUISITE_NUMBER_REQUISITE_CODE SYSRES_CONST_RIGHT_ALIGNMENT_CODE SYSRES_CONST_ROLES_REFERENCE_CODE SYSRES_CONST_ROUTE_STEP_AFTER_RUS SYSRES_CONST_ROUTE_STEP_AND_CONDITION_RUS SYSRES_CONST_ROUTE_STEP_OR_CONDITION_RUS SYSRES_CONST_ROUTE_TYPE_COMPLEX SYSRES_CONST_ROUTE_TYPE_PARALLEL SYSRES_CONST_ROUTE_TYPE_SERIAL SYSRES_CONST_SBDATASETDESC_NEGATIVE_VALUE SYSRES_CONST_SBDATASETDESC_POSITIVE_VALUE SYSRES_CONST_SBVIEWSDESC_POSITIVE_VALUE SYSRES_CONST_SCRIPT_BLOCK_DESCRIPTION SYSRES_CONST_SEARCH_BY_TEXT_REQUISITE_CODE SYSRES_CONST_SEARCHES_COMPONENT_CONTENT SYSRES_CONST_SEARCHES_CRITERIA_ACTION_NAME SYSRES_CONST_SEARCHES_EDOC_CONTENT SYSRES_CONST_SEARCHES_FOLDER_CONTENT SYSRES_CONST_SEARCHES_JOB_CONTENT SYSRES_CONST_SEARCHES_REFERENCE_CODE SYSRES_CONST_SEARCHES_TASK_CONTENT SYSRES_CONST_SECOND_CHAR SYSRES_CONST_SECTION_REQUISITE_ACTIONS_VALUE SYSRES_CONST_SECTION_REQUISITE_CARD_VALUE SYSRES_CONST_SECTION_REQUISITE_CODE SYSRES_CONST_SECTION_REQUISITE_DETAIL_1_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_2_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_3_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_4_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_5_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_6_VALUE SYSRES_CONST_SELECT_REFERENCE_MODE_NAME SYSRES_CONST_SELECT_TYPE_SELECTABLE SYSRES_CONST_SELECT_TYPE_SELECTABLE_ONLY_CHILD SYSRES_CONST_SELECT_TYPE_SELECTABLE_WITH_CHILD SYSRES_CONST_SELECT_TYPE_UNSLECTABLE SYSRES_CONST_SERVER_TYPE_MAIN SYSRES_CONST_SERVICE_USER_CATEGORY_FIELD_VALUE SYSRES_CONST_SETTINGS_USER_REQUISITE_CODE SYSRES_CONST_SIGNATURE_AND_ENCODE_CERTIFICATE_TYPE_CODE SYSRES_CONST_SIGNATURE_CERTIFICATE_TYPE_CODE SYSRES_CONST_SINGULAR_TITLE_REQUISITE_CODE SYSRES_CONST_SQL_SERVER_AUTHENTIFICATION_FLAG_VALUE_CODE SYSRES_CONST_SQL_SERVER_ENCODE_AUTHENTIFICATION_FLAG_VALUE_CODE SYSRES_CONST_STANDART_ROUTE_REFERENCE_CODE SYSRES_CONST_STANDART_ROUTE_REFERENCE_COMMENT_REQUISITE_CODE SYSRES_CONST_STANDART_ROUTES_GROUPS_REFERENCE_CODE SYSRES_CONST_STATE_REQ_NAME SYSRES_CONST_STATE_REQUISITE_ACTIVE_VALUE SYSRES_CONST_STATE_REQUISITE_CLOSED_VALUE SYSRES_CONST_STATE_REQUISITE_CODE SYSRES_CONST_STATIC_ROLE_TYPE_CODE SYSRES_CONST_STATUS_PLAN_DEFAULT_VALUE SYSRES_CONST_STATUS_VALUE_AUTOCLEANING SYSRES_CONST_STATUS_VALUE_BLUE_SQUARE SYSRES_CONST_STATUS_VALUE_COMPLETE SYSRES_CONST_STATUS_VALUE_GREEN_SQUARE SYSRES_CONST_STATUS_VALUE_ORANGE_SQUARE SYSRES_CONST_STATUS_VALUE_PURPLE_SQUARE SYSRES_CONST_STATUS_VALUE_RED_SQUARE SYSRES_CONST_STATUS_VALUE_SUSPEND SYSRES_CONST_STATUS_VALUE_YELLOW_SQUARE SYSRES_CONST_STDROUTE_SHOW_TO_USERS_REQUISITE_CODE SYSRES_CONST_STORAGE_TYPE_FILE SYSRES_CONST_STORAGE_TYPE_SQL_SERVER SYSRES_CONST_STR_REQUISITE SYSRES_CONST_STRIKEOUT_LIFE_CYCLE_STAGE_DRAW_STYLE SYSRES_CONST_STRING_FORMAT_LEFT_ALIGN_CHAR SYSRES_CONST_STRING_FORMAT_RIGHT_ALIGN_CHAR SYSRES_CONST_STRING_REQUISITE_CODE SYSRES_CONST_STRING_REQUISITE_TYPE SYSRES_CONST_STRING_TYPE_CHAR SYSRES_CONST_SUBSTITUTES_PSEUDOREFERENCE_CODE SYSRES_CONST_SUBTASK_BLOCK_DESCRIPTION SYSRES_CONST_SYSTEM_SETTING_CURRENT_USER_PARAM_VALUE SYSRES_CONST_SYSTEM_SETTING_EMPTY_VALUE_PARAM_VALUE SYSRES_CONST_SYSTEM_VERSION_COMMENT SYSRES_CONST_TASK_ACCESS_TYPE_ALL SYSRES_CONST_TASK_ACCESS_TYPE_ALL_MEMBERS SYSRES_CONST_TASK_ACCESS_TYPE_MANUAL SYSRES_CONST_TASK_ENCODE_TYPE_CERTIFICATION SYSRES_CONST_TASK_ENCODE_TYPE_CERTIFICATION_AND_PASSWORD SYSRES_CONST_TASK_ENCODE_TYPE_NONE SYSRES_CONST_TASK_ENCODE_TYPE_PASSWORD SYSRES_CONST_TASK_ROUTE_ALL_CONDITION SYSRES_CONST_TASK_ROUTE_AND_CONDITION SYSRES_CONST_TASK_ROUTE_OR_CONDITION SYSRES_CONST_TASK_STATE_ABORTED SYSRES_CONST_TASK_STATE_COMPLETE SYSRES_CONST_TASK_STATE_CONTINUED SYSRES_CONST_TASK_STATE_CONTROL SYSRES_CONST_TASK_STATE_INIT SYSRES_CONST_TASK_STATE_WORKING SYSRES_CONST_TASK_TITLE SYSRES_CONST_TASK_TYPES_GROUPS_REFERENCE_CODE SYSRES_CONST_TASK_TYPES_REFERENCE_CODE SYSRES_CONST_TEMPLATES_REFERENCE_CODE SYSRES_CONST_TEST_DATE_REQUISITE_NAME SYSRES_CONST_TEST_DEV_DATABASE_NAME SYSRES_CONST_TEST_DEV_SYSTEM_CODE SYSRES_CONST_TEST_EDMS_DATABASE_NAME SYSRES_CONST_TEST_EDMS_MAIN_CODE SYSRES_CONST_TEST_EDMS_MAIN_DB_NAME SYSRES_CONST_TEST_EDMS_SECOND_CODE SYSRES_CONST_TEST_EDMS_SECOND_DB_NAME SYSRES_CONST_TEST_EDMS_SYSTEM_CODE SYSRES_CONST_TEST_NUMERIC_REQUISITE_NAME SYSRES_CONST_TEXT_REQUISITE SYSRES_CONST_TEXT_REQUISITE_CODE SYSRES_CONST_TEXT_REQUISITE_TYPE SYSRES_CONST_TEXT_TYPE_CHAR SYSRES_CONST_TYPE_CODE_REQUISITE_CODE SYSRES_CONST_TYPE_REQUISITE_CODE SYSRES_CONST_UNDEFINED_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_UNITS_SECTION_ID_REQUISITE_CODE SYSRES_CONST_UNITS_SECTION_REQUISITE_CODE SYSRES_CONST_UNOPERATING_RECORD_FLAG_VALUE_CODE SYSRES_CONST_UNSTORED_DATA_REQUISITE_CODE SYSRES_CONST_UNSTORED_DATA_REQUISITE_NAME SYSRES_CONST_USE_ACCESS_TYPE_CODE SYSRES_CONST_USE_ACCESS_TYPE_NAME SYSRES_CONST_USER_ACCOUNT_TYPE_VALUE_CODE SYSRES_CONST_USER_ADDITIONAL_INFORMATION_REQUISITE_CODE SYSRES_CONST_USER_AND_GROUP_ID_FROM_PSEUDOREFERENCE_REQUISITE_CODE SYSRES_CONST_USER_CATEGORY_NORMAL SYSRES_CONST_USER_CERTIFICATE_REQUISITE_CODE SYSRES_CONST_USER_CERTIFICATE_STATE_REQUISITE_CODE SYSRES_CONST_USER_CERTIFICATE_SUBJECT_NAME_REQUISITE_CODE SYSRES_CONST_USER_CERTIFICATE_THUMBPRINT_REQUISITE_CODE SYSRES_CONST_USER_COMMON_CATEGORY SYSRES_CONST_USER_COMMON_CATEGORY_CODE SYSRES_CONST_USER_FULL_NAME_REQUISITE_CODE SYSRES_CONST_USER_GROUP_TYPE_REQUISITE_CODE SYSRES_CONST_USER_LOGIN_REQUISITE_CODE SYSRES_CONST_USER_REMOTE_CONTROLLER_REQUISITE_CODE SYSRES_CONST_USER_REMOTE_SYSTEM_REQUISITE_CODE SYSRES_CONST_USER_RIGHTS_T_REQUISITE_CODE SYSRES_CONST_USER_SERVER_NAME_REQUISITE_CODE SYSRES_CONST_USER_SERVICE_CATEGORY SYSRES_CONST_USER_SERVICE_CATEGORY_CODE SYSRES_CONST_USER_STATUS_ADMINISTRATOR_CODE SYSRES_CONST_USER_STATUS_ADMINISTRATOR_NAME SYSRES_CONST_USER_STATUS_DEVELOPER_CODE SYSRES_CONST_USER_STATUS_DEVELOPER_NAME SYSRES_CONST_USER_STATUS_DISABLED_CODE SYSRES_CONST_USER_STATUS_DISABLED_NAME SYSRES_CONST_USER_STATUS_SYSTEM_DEVELOPER_CODE SYSRES_CONST_USER_STATUS_USER_CODE SYSRES_CONST_USER_STATUS_USER_NAME SYSRES_CONST_USER_STATUS_USER_NAME_DEPRECATED SYSRES_CONST_USER_TYPE_FIELD_VALUE_USER SYSRES_CONST_USER_TYPE_REQUISITE_CODE SYSRES_CONST_USERS_CONTROLLER_REQUISITE_CODE SYSRES_CONST_USERS_IS_MAIN_SERVER_REQUISITE_CODE SYSRES_CONST_USERS_REFERENCE_CODE SYSRES_CONST_USERS_REGISTRATION_CERTIFICATES_ACTION_NAME SYSRES_CONST_USERS_REQUISITE_CODE SYSRES_CONST_USERS_SYSTEM_REQUISITE_CODE SYSRES_CONST_USERS_USER_ACCESS_RIGHTS_TYPR_REQUISITE_CODE SYSRES_CONST_USERS_USER_AUTHENTICATION_REQUISITE_CODE SYSRES_CONST_USERS_USER_COMPONENT_REQUISITE_CODE SYSRES_CONST_USERS_USER_GROUP_REQUISITE_CODE SYSRES_CONST_USERS_VIEW_CERTIFICATES_ACTION_NAME SYSRES_CONST_VIEW_DEFAULT_CODE SYSRES_CONST_VIEW_DEFAULT_NAME SYSRES_CONST_VIEWER_REQUISITE_CODE SYSRES_CONST_WAITING_BLOCK_DESCRIPTION SYSRES_CONST_WIZARD_FORM_LABEL_TEST_STRING SYSRES_CONST_WIZARD_QUERY_PARAM_HEIGHT_ETALON_STRING SYSRES_CONST_WIZARD_REFERENCE_COMMENT_REQUISITE_CODE SYSRES_CONST_WORK_RULES_DESCRIPTION_REQUISITE_CODE SYSRES_CONST_WORK_TIME_CALENDAR_REFERENCE_CODE SYSRES_CONST_WORK_WORKFLOW_HARD_ROUTE_TYPE_VALUE SYSRES_CONST_WORK_WORKFLOW_HARD_ROUTE_TYPE_VALUE_CODE SYSRES_CONST_WORK_WORKFLOW_HARD_ROUTE_TYPE_VALUE_CODE_RUS SYSRES_CONST_WORK_WORKFLOW_SOFT_ROUTE_TYPE_VALUE_CODE_RUS SYSRES_CONST_WORKFLOW_ROUTE_TYPR_HARD SYSRES_CONST_WORKFLOW_ROUTE_TYPR_SOFT SYSRES_CONST_XML_ENCODING SYSRES_CONST_XREC_STAT_REQUISITE_CODE SYSRES_CONST_XRECID_FIELD_NAME SYSRES_CONST_YES SYSRES_CONST_YES_NO_2_REQUISITE_CODE SYSRES_CONST_YES_NO_REQUISITE_CODE SYSRES_CONST_YES_NO_T_REF_TYPE_REQUISITE_CODE SYSRES_CONST_YES_PICK_VALUE SYSRES_CONST_YES_VALUE CR FALSE nil NO_VALUE NULL TAB TRUE YES_VALUE ADMINISTRATORS_GROUP_NAME CUSTOMIZERS_GROUP_NAME DEVELOPERS_GROUP_NAME SERVICE_USERS_GROUP_NAME DECISION_BLOCK_FIRST_OPERAND_PROPERTY DECISION_BLOCK_NAME_PROPERTY DECISION_BLOCK_OPERATION_PROPERTY DECISION_BLOCK_RESULT_TYPE_PROPERTY DECISION_BLOCK_SECOND_OPERAND_PROPERTY ANY_FILE_EXTENTION COMPRESSED_DOCUMENT_EXTENSION EXTENDED_DOCUMENT_EXTENSION SHORT_COMPRESSED_DOCUMENT_EXTENSION SHORT_EXTENDED_DOCUMENT_EXTENSION JOB_BLOCK_ABORT_DEADLINE_PROPERTY JOB_BLOCK_AFTER_FINISH_EVENT JOB_BLOCK_AFTER_QUERY_PARAMETERS_EVENT JOB_BLOCK_ATTACHMENT_PROPERTY JOB_BLOCK_ATTACHMENTS_RIGHTS_GROUP_PROPERTY JOB_BLOCK_ATTACHMENTS_RIGHTS_TYPE_PROPERTY JOB_BLOCK_BEFORE_QUERY_PARAMETERS_EVENT JOB_BLOCK_BEFORE_START_EVENT JOB_BLOCK_CREATED_JOBS_PROPERTY JOB_BLOCK_DEADLINE_PROPERTY JOB_BLOCK_EXECUTION_RESULTS_PROPERTY JOB_BLOCK_IS_PARALLEL_PROPERTY JOB_BLOCK_IS_RELATIVE_ABORT_DEADLINE_PROPERTY JOB_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY JOB_BLOCK_JOB_TEXT_PROPERTY JOB_BLOCK_NAME_PROPERTY JOB_BLOCK_NEED_SIGN_ON_PERFORM_PROPERTY JOB_BLOCK_PERFORMER_PROPERTY JOB_BLOCK_RELATIVE_ABORT_DEADLINE_TYPE_PROPERTY JOB_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY JOB_BLOCK_SUBJECT_PROPERTY ENGLISH_LANGUAGE_CODE RUSSIAN_LANGUAGE_CODE smHidden smMaximized smMinimized smNormal wmNo wmYes COMPONENT_TOKEN_LINK_KIND DOCUMENT_LINK_KIND EDOCUMENT_LINK_KIND FOLDER_LINK_KIND JOB_LINK_KIND REFERENCE_LINK_KIND TASK_LINK_KIND COMPONENT_TOKEN_LOCK_TYPE EDOCUMENT_VERSION_LOCK_TYPE MONITOR_BLOCK_AFTER_FINISH_EVENT MONITOR_BLOCK_BEFORE_START_EVENT MONITOR_BLOCK_DEADLINE_PROPERTY MONITOR_BLOCK_INTERVAL_PROPERTY MONITOR_BLOCK_INTERVAL_TYPE_PROPERTY MONITOR_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY MONITOR_BLOCK_NAME_PROPERTY MONITOR_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY MONITOR_BLOCK_SEARCH_SCRIPT_PROPERTY NOTICE_BLOCK_AFTER_FINISH_EVENT NOTICE_BLOCK_ATTACHMENT_PROPERTY NOTICE_BLOCK_ATTACHMENTS_RIGHTS_GROUP_PROPERTY NOTICE_BLOCK_ATTACHMENTS_RIGHTS_TYPE_PROPERTY NOTICE_BLOCK_BEFORE_START_EVENT NOTICE_BLOCK_CREATED_NOTICES_PROPERTY NOTICE_BLOCK_DEADLINE_PROPERTY NOTICE_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY NOTICE_BLOCK_NAME_PROPERTY NOTICE_BLOCK_NOTICE_TEXT_PROPERTY NOTICE_BLOCK_PERFORMER_PROPERTY NOTICE_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY NOTICE_BLOCK_SUBJECT_PROPERTY dseAfterCancel dseAfterClose dseAfterDelete dseAfterDeleteOutOfTransaction dseAfterInsert dseAfterOpen dseAfterScroll dseAfterUpdate dseAfterUpdateOutOfTransaction dseBeforeCancel dseBeforeClose dseBeforeDelete dseBeforeDetailUpdate dseBeforeInsert dseBeforeOpen dseBeforeUpdate dseOnAnyRequisiteChange dseOnCloseRecord dseOnDeleteError dseOnOpenRecord dseOnPrepareUpdate dseOnUpdateError dseOnUpdateRatifiedRecord dseOnValidDelete dseOnValidUpdate reOnChange reOnChangeValues SELECTION_BEGIN_ROUTE_EVENT SELECTION_END_ROUTE_EVENT CURRENT_PERIOD_IS_REQUIRED PREVIOUS_CARD_TYPE_NAME SHOW_RECORD_PROPERTIES_FORM ACCESS_RIGHTS_SETTING_DIALOG_CODE ADMINISTRATOR_USER_CODE ANALYTIC_REPORT_TYPE asrtHideLocal asrtHideRemote CALCULATED_ROLE_TYPE_CODE COMPONENTS_REFERENCE_DEVELOPER_VIEW_CODE DCTS_TEST_PROTOCOLS_FOLDER_PATH E_EDOC_VERSION_ALREADY_APPROVINGLY_SIGNED E_EDOC_VERSION_ALREADY_APPROVINGLY_SIGNED_BY_USER E_EDOC_VERSION_ALREDY_SIGNED E_EDOC_VERSION_ALREDY_SIGNED_BY_USER EDOC_TYPES_CODE_REQUISITE_FIELD_NAME EDOCUMENTS_ALIAS_NAME FILES_FOLDER_PATH FILTER_OPERANDS_DELIMITER FILTER_OPERATIONS_DELIMITER FORMCARD_NAME FORMLIST_NAME GET_EXTENDED_DOCUMENT_EXTENSION_CREATION_MODE GET_EXTENDED_DOCUMENT_EXTENSION_IMPORT_MODE INTEGRATED_REPORT_TYPE IS_BUILDER_APPLICATION_ROLE IS_BUILDER_APPLICATION_ROLE2 IS_BUILDER_USERS ISBSYSDEV LOG_FOLDER_PATH mbCancel mbNo mbNoToAll mbOK mbYes mbYesToAll MEMORY_DATASET_DESRIPTIONS_FILENAME mrNo mrNoToAll mrYes mrYesToAll MULTIPLE_SELECT_DIALOG_CODE NONOPERATING_RECORD_FLAG_FEMININE NONOPERATING_RECORD_FLAG_MASCULINE OPERATING_RECORD_FLAG_FEMININE OPERATING_RECORD_FLAG_MASCULINE PROFILING_SETTINGS_COMMON_SETTINGS_CODE_VALUE PROGRAM_INITIATED_LOOKUP_ACTION ratDelete ratEdit ratInsert REPORT_TYPE REQUIRED_PICK_VALUES_VARIABLE rmCard rmList SBRTE_PROGID_DEV SBRTE_PROGID_RELEASE STATIC_ROLE_TYPE_CODE SUPPRESS_EMPTY_TEMPLATE_CREATION SYSTEM_USER_CODE UPDATE_DIALOG_DATASET USED_IN_OBJECT_HINT_PARAM USER_INITIATED_LOOKUP_ACTION USER_NAME_FORMAT USER_SELECTION_RESTRICTIONS WORKFLOW_TEST_PROTOCOLS_FOLDER_PATH ELS_SUBTYPE_CONTROL_NAME ELS_FOLDER_KIND_CONTROL_NAME REPEAT_PROCESS_CURRENT_OBJECT_EXCEPTION_NAME PRIVILEGE_COMPONENT_FULL_ACCESS PRIVILEGE_DEVELOPMENT_EXPORT PRIVILEGE_DEVELOPMENT_IMPORT PRIVILEGE_DOCUMENT_DELETE PRIVILEGE_ESD PRIVILEGE_FOLDER_DELETE PRIVILEGE_MANAGE_ACCESS_RIGHTS PRIVILEGE_MANAGE_REPLICATION PRIVILEGE_MANAGE_SESSION_SERVER PRIVILEGE_OBJECT_FULL_ACCESS PRIVILEGE_OBJECT_VIEW PRIVILEGE_RESERVE_LICENSE PRIVILEGE_SYSTEM_CUSTOMIZE PRIVILEGE_SYSTEM_DEVELOP PRIVILEGE_SYSTEM_INSTALL PRIVILEGE_TASK_DELETE PRIVILEGE_USER_PLUGIN_SETTINGS_CUSTOMIZE PRIVILEGES_PSEUDOREFERENCE_CODE ACCESS_TYPES_PSEUDOREFERENCE_CODE ALL_AVAILABLE_COMPONENTS_PSEUDOREFERENCE_CODE ALL_AVAILABLE_PRIVILEGES_PSEUDOREFERENCE_CODE ALL_REPLICATE_COMPONENTS_PSEUDOREFERENCE_CODE AVAILABLE_DEVELOPERS_COMPONENTS_PSEUDOREFERENCE_CODE COMPONENTS_PSEUDOREFERENCE_CODE FILTRATER_SETTINGS_CONFLICTS_PSEUDOREFERENCE_CODE GROUPS_PSEUDOREFERENCE_CODE RECEIVE_PROTOCOL_PSEUDOREFERENCE_CODE REFERENCE_REQUISITE_PSEUDOREFERENCE_CODE REFERENCE_REQUISITES_PSEUDOREFERENCE_CODE REFTYPES_PSEUDOREFERENCE_CODE REPLICATION_SEANCES_DIARY_PSEUDOREFERENCE_CODE SEND_PROTOCOL_PSEUDOREFERENCE_CODE SUBSTITUTES_PSEUDOREFERENCE_CODE SYSTEM_SETTINGS_PSEUDOREFERENCE_CODE UNITS_PSEUDOREFERENCE_CODE USERS_PSEUDOREFERENCE_CODE VIEWERS_PSEUDOREFERENCE_CODE CERTIFICATE_TYPE_ENCRYPT CERTIFICATE_TYPE_SIGN CERTIFICATE_TYPE_SIGN_AND_ENCRYPT STORAGE_TYPE_FILE STORAGE_TYPE_NAS_CIFS STORAGE_TYPE_SAPERION STORAGE_TYPE_SQL_SERVER COMPTYPE2_REQUISITE_DOCUMENTS_VALUE COMPTYPE2_REQUISITE_TASKS_VALUE COMPTYPE2_REQUISITE_FOLDERS_VALUE COMPTYPE2_REQUISITE_REFERENCES_VALUE SYSREQ_CODE SYSREQ_COMPTYPE2 SYSREQ_CONST_AVAILABLE_FOR_WEB SYSREQ_CONST_COMMON_CODE SYSREQ_CONST_COMMON_VALUE SYSREQ_CONST_FIRM_CODE SYSREQ_CONST_FIRM_STATUS SYSREQ_CONST_FIRM_VALUE SYSREQ_CONST_SERVER_STATUS SYSREQ_CONTENTS SYSREQ_DATE_OPEN SYSREQ_DATE_CLOSE SYSREQ_DESCRIPTION SYSREQ_DESCRIPTION_LOCALIZE_ID SYSREQ_DOUBLE SYSREQ_EDOC_ACCESS_TYPE SYSREQ_EDOC_AUTHOR SYSREQ_EDOC_CREATED SYSREQ_EDOC_DELEGATE_RIGHTS_REQUISITE_CODE SYSREQ_EDOC_EDITOR SYSREQ_EDOC_ENCODE_TYPE SYSREQ_EDOC_ENCRYPTION_PLUGIN_NAME SYSREQ_EDOC_ENCRYPTION_PLUGIN_VERSION SYSREQ_EDOC_EXPORT_DATE SYSREQ_EDOC_EXPORTER SYSREQ_EDOC_KIND SYSREQ_EDOC_LIFE_STAGE_NAME SYSREQ_EDOC_LOCKED_FOR_SERVER_CODE SYSREQ_EDOC_MODIFIED SYSREQ_EDOC_NAME SYSREQ_EDOC_NOTE SYSREQ_EDOC_QUALIFIED_ID SYSREQ_EDOC_SESSION_KEY SYSREQ_EDOC_SESSION_KEY_ENCRYPTION_PLUGIN_NAME SYSREQ_EDOC_SESSION_KEY_ENCRYPTION_PLUGIN_VERSION SYSREQ_EDOC_SIGNATURE_TYPE SYSREQ_EDOC_SIGNED SYSREQ_EDOC_STORAGE SYSREQ_EDOC_STORAGES_ARCHIVE_STORAGE SYSREQ_EDOC_STORAGES_CHECK_RIGHTS SYSREQ_EDOC_STORAGES_COMPUTER_NAME SYSREQ_EDOC_STORAGES_EDIT_IN_STORAGE SYSREQ_EDOC_STORAGES_EXECUTIVE_STORAGE SYSREQ_EDOC_STORAGES_FUNCTION SYSREQ_EDOC_STORAGES_INITIALIZED SYSREQ_EDOC_STORAGES_LOCAL_PATH SYSREQ_EDOC_STORAGES_SAPERION_DATABASE_NAME SYSREQ_EDOC_STORAGES_SEARCH_BY_TEXT SYSREQ_EDOC_STORAGES_SERVER_NAME SYSREQ_EDOC_STORAGES_SHARED_SOURCE_NAME SYSREQ_EDOC_STORAGES_TYPE SYSREQ_EDOC_TEXT_MODIFIED SYSREQ_EDOC_TYPE_ACT_CODE SYSREQ_EDOC_TYPE_ACT_DESCRIPTION SYSREQ_EDOC_TYPE_ACT_DESCRIPTION_LOCALIZE_ID SYSREQ_EDOC_TYPE_ACT_ON_EXECUTE SYSREQ_EDOC_TYPE_ACT_ON_EXECUTE_EXISTS SYSREQ_EDOC_TYPE_ACT_SECTION SYSREQ_EDOC_TYPE_ADD_PARAMS SYSREQ_EDOC_TYPE_COMMENT SYSREQ_EDOC_TYPE_EVENT_TEXT SYSREQ_EDOC_TYPE_NAME_IN_SINGULAR SYSREQ_EDOC_TYPE_NAME_IN_SINGULAR_LOCALIZE_ID SYSREQ_EDOC_TYPE_NAME_LOCALIZE_ID SYSREQ_EDOC_TYPE_NUMERATION_METHOD SYSREQ_EDOC_TYPE_PSEUDO_REQUISITE_CODE SYSREQ_EDOC_TYPE_REQ_CODE SYSREQ_EDOC_TYPE_REQ_DESCRIPTION SYSREQ_EDOC_TYPE_REQ_DESCRIPTION_LOCALIZE_ID SYSREQ_EDOC_TYPE_REQ_IS_LEADING SYSREQ_EDOC_TYPE_REQ_IS_REQUIRED SYSREQ_EDOC_TYPE_REQ_NUMBER SYSREQ_EDOC_TYPE_REQ_ON_CHANGE SYSREQ_EDOC_TYPE_REQ_ON_CHANGE_EXISTS SYSREQ_EDOC_TYPE_REQ_ON_SELECT SYSREQ_EDOC_TYPE_REQ_ON_SELECT_KIND SYSREQ_EDOC_TYPE_REQ_SECTION SYSREQ_EDOC_TYPE_VIEW_CARD SYSREQ_EDOC_TYPE_VIEW_CODE SYSREQ_EDOC_TYPE_VIEW_COMMENT SYSREQ_EDOC_TYPE_VIEW_IS_MAIN SYSREQ_EDOC_TYPE_VIEW_NAME SYSREQ_EDOC_TYPE_VIEW_NAME_LOCALIZE_ID SYSREQ_EDOC_VERSION_AUTHOR SYSREQ_EDOC_VERSION_CRC SYSREQ_EDOC_VERSION_DATA SYSREQ_EDOC_VERSION_EDITOR SYSREQ_EDOC_VERSION_EXPORT_DATE SYSREQ_EDOC_VERSION_EXPORTER SYSREQ_EDOC_VERSION_HIDDEN SYSREQ_EDOC_VERSION_LIFE_STAGE SYSREQ_EDOC_VERSION_MODIFIED SYSREQ_EDOC_VERSION_NOTE SYSREQ_EDOC_VERSION_SIGNATURE_TYPE SYSREQ_EDOC_VERSION_SIGNED SYSREQ_EDOC_VERSION_SIZE SYSREQ_EDOC_VERSION_SOURCE SYSREQ_EDOC_VERSION_TEXT_MODIFIED SYSREQ_EDOCKIND_DEFAULT_VERSION_STATE_CODE SYSREQ_FOLDER_KIND SYSREQ_FUNC_CATEGORY SYSREQ_FUNC_COMMENT SYSREQ_FUNC_GROUP SYSREQ_FUNC_GROUP_COMMENT SYSREQ_FUNC_GROUP_NUMBER SYSREQ_FUNC_HELP SYSREQ_FUNC_PARAM_DEF_VALUE SYSREQ_FUNC_PARAM_IDENT SYSREQ_FUNC_PARAM_NUMBER SYSREQ_FUNC_PARAM_TYPE SYSREQ_FUNC_TEXT SYSREQ_GROUP_CATEGORY SYSREQ_ID SYSREQ_LAST_UPDATE SYSREQ_LEADER_REFERENCE SYSREQ_LINE_NUMBER SYSREQ_MAIN_RECORD_ID SYSREQ_NAME SYSREQ_NAME_LOCALIZE_ID SYSREQ_NOTE SYSREQ_ORIGINAL_RECORD SYSREQ_OUR_FIRM SYSREQ_PROFILING_SETTINGS_BATCH_LOGING SYSREQ_PROFILING_SETTINGS_BATCH_SIZE SYSREQ_PROFILING_SETTINGS_PROFILING_ENABLED SYSREQ_PROFILING_SETTINGS_SQL_PROFILING_ENABLED SYSREQ_PROFILING_SETTINGS_START_LOGGED SYSREQ_RECORD_STATUS SYSREQ_REF_REQ_FIELD_NAME SYSREQ_REF_REQ_FORMAT SYSREQ_REF_REQ_GENERATED SYSREQ_REF_REQ_LENGTH SYSREQ_REF_REQ_PRECISION SYSREQ_REF_REQ_REFERENCE SYSREQ_REF_REQ_SECTION SYSREQ_REF_REQ_STORED SYSREQ_REF_REQ_TOKENS SYSREQ_REF_REQ_TYPE SYSREQ_REF_REQ_VIEW SYSREQ_REF_TYPE_ACT_CODE SYSREQ_REF_TYPE_ACT_DESCRIPTION SYSREQ_REF_TYPE_ACT_DESCRIPTION_LOCALIZE_ID SYSREQ_REF_TYPE_ACT_ON_EXECUTE SYSREQ_REF_TYPE_ACT_ON_EXECUTE_EXISTS SYSREQ_REF_TYPE_ACT_SECTION SYSREQ_REF_TYPE_ADD_PARAMS SYSREQ_REF_TYPE_COMMENT SYSREQ_REF_TYPE_COMMON_SETTINGS SYSREQ_REF_TYPE_DISPLAY_REQUISITE_NAME SYSREQ_REF_TYPE_EVENT_TEXT SYSREQ_REF_TYPE_MAIN_LEADING_REF SYSREQ_REF_TYPE_NAME_IN_SINGULAR SYSREQ_REF_TYPE_NAME_IN_SINGULAR_LOCALIZE_ID SYSREQ_REF_TYPE_NAME_LOCALIZE_ID SYSREQ_REF_TYPE_NUMERATION_METHOD SYSREQ_REF_TYPE_REQ_CODE SYSREQ_REF_TYPE_REQ_DESCRIPTION SYSREQ_REF_TYPE_REQ_DESCRIPTION_LOCALIZE_ID SYSREQ_REF_TYPE_REQ_IS_CONTROL SYSREQ_REF_TYPE_REQ_IS_FILTER SYSREQ_REF_TYPE_REQ_IS_LEADING SYSREQ_REF_TYPE_REQ_IS_REQUIRED SYSREQ_REF_TYPE_REQ_NUMBER SYSREQ_REF_TYPE_REQ_ON_CHANGE SYSREQ_REF_TYPE_REQ_ON_CHANGE_EXISTS SYSREQ_REF_TYPE_REQ_ON_SELECT SYSREQ_REF_TYPE_REQ_ON_SELECT_KIND SYSREQ_REF_TYPE_REQ_SECTION SYSREQ_REF_TYPE_VIEW_CARD SYSREQ_REF_TYPE_VIEW_CODE SYSREQ_REF_TYPE_VIEW_COMMENT SYSREQ_REF_TYPE_VIEW_IS_MAIN SYSREQ_REF_TYPE_VIEW_NAME SYSREQ_REF_TYPE_VIEW_NAME_LOCALIZE_ID SYSREQ_REFERENCE_TYPE_ID SYSREQ_STATE SYSREQ_STATЕ SYSREQ_SYSTEM_SETTINGS_VALUE SYSREQ_TYPE SYSREQ_UNIT SYSREQ_UNIT_ID SYSREQ_USER_GROUPS_GROUP_FULL_NAME SYSREQ_USER_GROUPS_GROUP_NAME SYSREQ_USER_GROUPS_GROUP_SERVER_NAME SYSREQ_USERS_ACCESS_RIGHTS SYSREQ_USERS_AUTHENTICATION SYSREQ_USERS_CATEGORY SYSREQ_USERS_COMPONENT SYSREQ_USERS_COMPONENT_USER_IS_PUBLIC SYSREQ_USERS_DOMAIN SYSREQ_USERS_FULL_USER_NAME SYSREQ_USERS_GROUP SYSREQ_USERS_IS_MAIN_SERVER SYSREQ_USERS_LOGIN SYSREQ_USERS_REFERENCE_USER_IS_PUBLIC SYSREQ_USERS_STATUS SYSREQ_USERS_USER_CERTIFICATE SYSREQ_USERS_USER_CERTIFICATE_INFO SYSREQ_USERS_USER_CERTIFICATE_PLUGIN_NAME SYSREQ_USERS_USER_CERTIFICATE_PLUGIN_VERSION SYSREQ_USERS_USER_CERTIFICATE_STATE SYSREQ_USERS_USER_CERTIFICATE_SUBJECT_NAME SYSREQ_USERS_USER_CERTIFICATE_THUMBPRINT SYSREQ_USERS_USER_DEFAULT_CERTIFICATE SYSREQ_USERS_USER_DESCRIPTION SYSREQ_USERS_USER_GLOBAL_NAME SYSREQ_USERS_USER_LOGIN SYSREQ_USERS_USER_MAIN_SERVER SYSREQ_USERS_USER_TYPE SYSREQ_WORK_RULES_FOLDER_ID RESULT_VAR_NAME RESULT_VAR_NAME_ENG AUTO_NUMERATION_RULE_ID CANT_CHANGE_ID_REQUISITE_RULE_ID CANT_CHANGE_OURFIRM_REQUISITE_RULE_ID CHECK_CHANGING_REFERENCE_RECORD_USE_RULE_ID CHECK_CODE_REQUISITE_RULE_ID CHECK_DELETING_REFERENCE_RECORD_USE_RULE_ID CHECK_FILTRATER_CHANGES_RULE_ID CHECK_RECORD_INTERVAL_RULE_ID CHECK_REFERENCE_INTERVAL_RULE_ID CHECK_REQUIRED_DATA_FULLNESS_RULE_ID CHECK_REQUIRED_REQUISITES_FULLNESS_RULE_ID MAKE_RECORD_UNRATIFIED_RULE_ID RESTORE_AUTO_NUMERATION_RULE_ID SET_FIRM_CONTEXT_FROM_RECORD_RULE_ID SET_FIRST_RECORD_IN_LIST_FORM_RULE_ID SET_IDSPS_VALUE_RULE_ID SET_NEXT_CODE_VALUE_RULE_ID SET_OURFIRM_BOUNDS_RULE_ID SET_OURFIRM_REQUISITE_RULE_ID SCRIPT_BLOCK_AFTER_FINISH_EVENT SCRIPT_BLOCK_BEFORE_START_EVENT SCRIPT_BLOCK_EXECUTION_RESULTS_PROPERTY SCRIPT_BLOCK_NAME_PROPERTY SCRIPT_BLOCK_SCRIPT_PROPERTY SUBTASK_BLOCK_ABORT_DEADLINE_PROPERTY SUBTASK_BLOCK_AFTER_FINISH_EVENT SUBTASK_BLOCK_ASSIGN_PARAMS_EVENT SUBTASK_BLOCK_ATTACHMENTS_PROPERTY SUBTASK_BLOCK_ATTACHMENTS_RIGHTS_GROUP_PROPERTY SUBTASK_BLOCK_ATTACHMENTS_RIGHTS_TYPE_PROPERTY SUBTASK_BLOCK_BEFORE_START_EVENT SUBTASK_BLOCK_CREATED_TASK_PROPERTY SUBTASK_BLOCK_CREATION_EVENT SUBTASK_BLOCK_DEADLINE_PROPERTY SUBTASK_BLOCK_IMPORTANCE_PROPERTY SUBTASK_BLOCK_INITIATOR_PROPERTY SUBTASK_BLOCK_IS_RELATIVE_ABORT_DEADLINE_PROPERTY SUBTASK_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY SUBTASK_BLOCK_JOBS_TYPE_PROPERTY SUBTASK_BLOCK_NAME_PROPERTY SUBTASK_BLOCK_PARALLEL_ROUTE_PROPERTY SUBTASK_BLOCK_PERFORMERS_PROPERTY SUBTASK_BLOCK_RELATIVE_ABORT_DEADLINE_TYPE_PROPERTY SUBTASK_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY SUBTASK_BLOCK_REQUIRE_SIGN_PROPERTY SUBTASK_BLOCK_STANDARD_ROUTE_PROPERTY SUBTASK_BLOCK_START_EVENT SUBTASK_BLOCK_STEP_CONTROL_PROPERTY SUBTASK_BLOCK_SUBJECT_PROPERTY SUBTASK_BLOCK_TASK_CONTROL_PROPERTY SUBTASK_BLOCK_TEXT_PROPERTY SUBTASK_BLOCK_UNLOCK_ATTACHMENTS_ON_STOP_PROPERTY SUBTASK_BLOCK_USE_STANDARD_ROUTE_PROPERTY SUBTASK_BLOCK_WAIT_FOR_TASK_COMPLETE_PROPERTY SYSCOMP_CONTROL_JOBS SYSCOMP_FOLDERS SYSCOMP_JOBS SYSCOMP_NOTICES SYSCOMP_TASKS SYSDLG_CREATE_EDOCUMENT SYSDLG_CREATE_EDOCUMENT_VERSION SYSDLG_CURRENT_PERIOD SYSDLG_EDIT_FUNCTION_HELP SYSDLG_EDOCUMENT_KINDS_FOR_TEMPLATE SYSDLG_EXPORT_MULTIPLE_EDOCUMENTS SYSDLG_EXPORT_SINGLE_EDOCUMENT SYSDLG_IMPORT_EDOCUMENT SYSDLG_MULTIPLE_SELECT SYSDLG_SETUP_ACCESS_RIGHTS SYSDLG_SETUP_DEFAULT_RIGHTS SYSDLG_SETUP_FILTER_CONDITION SYSDLG_SETUP_SIGN_RIGHTS SYSDLG_SETUP_TASK_OBSERVERS SYSDLG_SETUP_TASK_ROUTE SYSDLG_SETUP_USERS_LIST SYSDLG_SIGN_EDOCUMENT SYSDLG_SIGN_MULTIPLE_EDOCUMENTS SYSREF_ACCESS_RIGHTS_TYPES SYSREF_ADMINISTRATION_HISTORY SYSREF_ALL_AVAILABLE_COMPONENTS SYSREF_ALL_AVAILABLE_PRIVILEGES SYSREF_ALL_REPLICATING_COMPONENTS SYSREF_AVAILABLE_DEVELOPERS_COMPONENTS SYSREF_CALENDAR_EVENTS SYSREF_COMPONENT_TOKEN_HISTORY SYSREF_COMPONENT_TOKENS SYSREF_COMPONENTS SYSREF_CONSTANTS SYSREF_DATA_RECEIVE_PROTOCOL SYSREF_DATA_SEND_PROTOCOL SYSREF_DIALOGS SYSREF_DIALOGS_REQUISITES SYSREF_EDITORS SYSREF_EDOC_CARDS SYSREF_EDOC_TYPES SYSREF_EDOCUMENT_CARD_REQUISITES SYSREF_EDOCUMENT_CARD_TYPES SYSREF_EDOCUMENT_CARD_TYPES_REFERENCE SYSREF_EDOCUMENT_CARDS SYSREF_EDOCUMENT_HISTORY SYSREF_EDOCUMENT_KINDS SYSREF_EDOCUMENT_REQUISITES SYSREF_EDOCUMENT_SIGNATURES SYSREF_EDOCUMENT_TEMPLATES SYSREF_EDOCUMENT_TEXT_STORAGES SYSREF_EDOCUMENT_VIEWS SYSREF_FILTERER_SETUP_CONFLICTS SYSREF_FILTRATER_SETTING_CONFLICTS SYSREF_FOLDER_HISTORY SYSREF_FOLDERS SYSREF_FUNCTION_GROUPS SYSREF_FUNCTION_PARAMS SYSREF_FUNCTIONS SYSREF_JOB_HISTORY SYSREF_LINKS SYSREF_LOCALIZATION_DICTIONARY SYSREF_LOCALIZATION_LANGUAGES SYSREF_MODULES SYSREF_PRIVILEGES SYSREF_RECORD_HISTORY SYSREF_REFERENCE_REQUISITES SYSREF_REFERENCE_TYPE_VIEWS SYSREF_REFERENCE_TYPES SYSREF_REFERENCES SYSREF_REFERENCES_REQUISITES SYSREF_REMOTE_SERVERS SYSREF_REPLICATION_SESSIONS_LOG SYSREF_REPLICATION_SESSIONS_PROTOCOL SYSREF_REPORTS SYSREF_ROLES SYSREF_ROUTE_BLOCK_GROUPS SYSREF_ROUTE_BLOCKS SYSREF_SCRIPTS SYSREF_SEARCHES SYSREF_SERVER_EVENTS SYSREF_SERVER_EVENTS_HISTORY SYSREF_STANDARD_ROUTE_GROUPS SYSREF_STANDARD_ROUTES SYSREF_STATUSES SYSREF_SYSTEM_SETTINGS SYSREF_TASK_HISTORY SYSREF_TASK_KIND_GROUPS SYSREF_TASK_KINDS SYSREF_TASK_RIGHTS SYSREF_TASK_SIGNATURES SYSREF_TASKS SYSREF_UNITS SYSREF_USER_GROUPS SYSREF_USER_GROUPS_REFERENCE SYSREF_USER_SUBSTITUTION SYSREF_USERS SYSREF_USERS_REFERENCE SYSREF_VIEWERS SYSREF_WORKING_TIME_CALENDARS ACCESS_RIGHTS_TABLE_NAME EDMS_ACCESS_TABLE_NAME EDOC_TYPES_TABLE_NAME TEST_DEV_DB_NAME TEST_DEV_SYSTEM_CODE TEST_EDMS_DB_NAME TEST_EDMS_MAIN_CODE TEST_EDMS_MAIN_DB_NAME TEST_EDMS_SECOND_CODE TEST_EDMS_SECOND_DB_NAME TEST_EDMS_SYSTEM_CODE TEST_ISB5_MAIN_CODE TEST_ISB5_SECOND_CODE TEST_SQL_SERVER_2005_NAME TEST_SQL_SERVER_NAME ATTENTION_CAPTION cbsCommandLinks cbsDefault CONFIRMATION_CAPTION ERROR_CAPTION INFORMATION_CAPTION mrCancel mrOk EDOC_VERSION_ACTIVE_STAGE_CODE EDOC_VERSION_DESIGN_STAGE_CODE EDOC_VERSION_OBSOLETE_STAGE_CODE cpDataEnciphermentEnabled cpDigitalSignatureEnabled cpID cpIssuer cpPluginVersion cpSerial cpSubjectName cpSubjSimpleName cpValidFromDate cpValidToDate ISBL_SYNTAX NO_SYNTAX XML_SYNTAX WAIT_BLOCK_AFTER_FINISH_EVENT WAIT_BLOCK_BEFORE_START_EVENT WAIT_BLOCK_DEADLINE_PROPERTY WAIT_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY WAIT_BLOCK_NAME_PROPERTY WAIT_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY SYSRES_COMMON SYSRES_CONST SYSRES_MBFUNC SYSRES_SBDATA SYSRES_SBGUI SYSRES_SBINTF SYSRES_SBREFDSC SYSRES_SQLERRORS SYSRES_SYSCOMP) + b["enum"] = Set.new %w(atUser atGroup atRole aemEnabledAlways aemDisabledAlways aemEnabledOnBrowse aemEnabledOnEdit aemDisabledOnBrowseEmpty apBegin apEnd alLeft alRight asmNever asmNoButCustomize asmAsLastTime asmYesButCustomize asmAlways cirCommon cirRevoked ctSignature ctEncode ctSignatureEncode clbUnchecked clbChecked clbGrayed ceISB ceAlways ceNever ctDocument ctReference ctScript ctUnknown ctReport ctDialog ctFunction ctFolder ctEDocument ctTask ctJob ctNotice ctControlJob cfInternal cfDisplay ciUnspecified ciWrite ciRead ckFolder ckEDocument ckTask ckJob ckComponentToken ckAny ckReference ckScript ckReport ckDialog ctISBLEditor ctBevel ctButton ctCheckListBox ctComboBox ctComboEdit ctGrid ctDBCheckBox ctDBComboBox ctDBEdit ctDBEllipsis ctDBMemo ctDBNavigator ctDBRadioGroup ctDBStatusLabel ctEdit ctGroupBox ctInplaceHint ctMemo ctPanel ctListBox ctRadioButton ctRichEdit ctTabSheet ctWebBrowser ctImage ctHyperLink ctLabel ctDBMultiEllipsis ctRibbon ctRichView ctInnerPanel ctPanelGroup ctBitButton cctDate cctInteger cctNumeric cctPick cctReference cctString cctText cltInternal cltPrimary cltGUI dseBeforeOpen dseAfterOpen dseBeforeClose dseAfterClose dseOnValidDelete dseBeforeDelete dseAfterDelete dseAfterDeleteOutOfTransaction dseOnDeleteError dseBeforeInsert dseAfterInsert dseOnValidUpdate dseBeforeUpdate dseOnUpdateRatifiedRecord dseAfterUpdate dseAfterUpdateOutOfTransaction dseOnUpdateError dseAfterScroll dseOnOpenRecord dseOnCloseRecord dseBeforeCancel dseAfterCancel dseOnUpdateDeadlockError dseBeforeDetailUpdate dseOnPrepareUpdate dseOnAnyRequisiteChange dssEdit dssInsert dssBrowse dssInActive dftDate dftShortDate dftDateTime dftTimeStamp dotDays dotHours dotMinutes dotSeconds dtkndLocal dtkndUTC arNone arView arEdit arFull ddaView ddaEdit emLock emEdit emSign emExportWithLock emImportWithUnlock emChangeVersionNote emOpenForModify emChangeLifeStage emDelete emCreateVersion emImport emUnlockExportedWithLock emStart emAbort emReInit emMarkAsReaded emMarkAsUnreaded emPerform emAccept emResume emChangeRights emEditRoute emEditObserver emRecoveryFromLocalCopy emChangeWorkAccessType emChangeEncodeTypeToCertificate emChangeEncodeTypeToPassword emChangeEncodeTypeToNone emChangeEncodeTypeToCertificatePassword emChangeStandardRoute emGetText emOpenForView emMoveToStorage emCreateObject emChangeVersionHidden emDeleteVersion emChangeLifeCycleStage emApprovingSign emExport emContinue emLockFromEdit emUnLockForEdit emLockForServer emUnlockFromServer emDelegateAccessRights emReEncode ecotFile ecotProcess eaGet eaCopy eaCreate eaCreateStandardRoute edltAll edltNothing edltQuery essmText essmCard esvtLast esvtLastActive esvtSpecified edsfExecutive edsfArchive edstSQLServer edstFile edvstNone edvstEDocumentVersionCopy edvstFile edvstTemplate edvstScannedFile vsDefault vsDesign vsActive vsObsolete etNone etCertificate etPassword etCertificatePassword ecException ecWarning ecInformation estAll estApprovingOnly evtLast evtLastActive evtQuery fdtString fdtNumeric fdtInteger fdtDate fdtText fdtUnknown fdtWideString fdtLargeInteger ftInbox ftOutbox ftFavorites ftCommonFolder ftUserFolder ftComponents ftQuickLaunch ftShortcuts ftSearch grhAuto grhX1 grhX2 grhX3 hltText hltRTF hltHTML iffBMP iffJPEG iffMultiPageTIFF iffSinglePageTIFF iffTIFF iffPNG im8bGrayscale im24bRGB im1bMonochrome itBMP itJPEG itWMF itPNG ikhInformation ikhWarning ikhError ikhNoIcon icUnknown icScript icFunction icIntegratedReport icAnalyticReport icDataSetEventHandler icActionHandler icFormEventHandler icLookUpEventHandler icRequisiteChangeEventHandler icBeforeSearchEventHandler icRoleCalculation icSelectRouteEventHandler icBlockPropertyCalculation icBlockQueryParamsEventHandler icChangeSearchResultEventHandler icBlockEventHandler icSubTaskInitEventHandler icEDocDataSetEventHandler icEDocLookUpEventHandler icEDocActionHandler icEDocFormEventHandler icEDocRequisiteChangeEventHandler icStructuredConversionRule icStructuredConversionEventBefore icStructuredConversionEventAfter icWizardEventHandler icWizardFinishEventHandler icWizardStepEventHandler icWizardStepFinishEventHandler icWizardActionEnableEventHandler icWizardActionExecuteEventHandler icCreateJobsHandler icCreateNoticesHandler icBeforeLookUpEventHandler icAfterLookUpEventHandler icTaskAbortEventHandler icWorkflowBlockActionHandler icDialogDataSetEventHandler icDialogActionHandler icDialogLookUpEventHandler icDialogRequisiteChangeEventHandler icDialogFormEventHandler icDialogValidCloseEventHandler icBlockFormEventHandler icTaskFormEventHandler icReferenceMethod icEDocMethod icDialogMethod icProcessMessageHandler isShow isHide isByUserSettings jkJob jkNotice jkControlJob jtInner jtLeft jtRight jtFull jtCross lbpAbove lbpBelow lbpLeft lbpRight eltPerConnection eltPerUser sfcUndefined sfcBlack sfcGreen sfcRed sfcBlue sfcOrange sfcLilac sfsItalic sfsStrikeout sfsNormal ldctStandardRoute ldctWizard ldctScript ldctFunction ldctRouteBlock ldctIntegratedReport ldctAnalyticReport ldctReferenceType ldctEDocumentType ldctDialog ldctServerEvents mrcrtNone mrcrtUser mrcrtMaximal mrcrtCustom vtEqual vtGreaterOrEqual vtLessOrEqual vtRange rdYesterday rdToday rdTomorrow rdThisWeek rdThisMonth rdThisYear rdNextMonth rdNextWeek rdLastWeek rdLastMonth rdWindow rdFile rdPrinter rdtString rdtNumeric rdtInteger rdtDate rdtReference rdtAccount rdtText rdtPick rdtUnknown rdtLargeInteger rdtDocument reOnChange reOnChangeValues ttGlobal ttLocal ttUser ttSystem ssmBrowse ssmSelect ssmMultiSelect ssmBrowseModal smSelect smLike smCard stNone stAuthenticating stApproving sctString sctStream sstAnsiSort sstNaturalSort svtEqual svtContain soatString soatNumeric soatInteger soatDatetime soatReferenceRecord soatText soatPick soatBoolean soatEDocument soatAccount soatIntegerCollection soatNumericCollection soatStringCollection soatPickCollection soatDatetimeCollection soatBooleanCollection soatReferenceRecordCollection soatEDocumentCollection soatAccountCollection soatContents soatUnknown tarAbortByUser tarAbortByWorkflowException tvtAllWords tvtExactPhrase tvtAnyWord usNone usCompleted usRedSquare usBlueSquare usYellowSquare usGreenSquare usOrangeSquare usPurpleSquare usFollowUp utUnknown utUser utDeveloper utAdministrator utSystemDeveloper utDisconnected btAnd btDetailAnd btOr btNotOr btOnly vmView vmSelect vmNavigation vsmSingle vsmMultiple vsmMultipleCheck vsmNoSelection wfatPrevious wfatNext wfatCancel wfatFinish wfepUndefined wfepText3 wfepText6 wfepText9 wfepSpinEdit wfepDropDown wfepRadioGroup wfepFlag wfepText12 wfepText15 wfepText18 wfepText21 wfepText24 wfepText27 wfepText30 wfepRadioGroupColumn1 wfepRadioGroupColumn2 wfepRadioGroupColumn3 wfetQueryParameter wfetText wfetDelimiter wfetLabel wptString wptInteger wptNumeric wptBoolean wptDateTime wptPick wptText wptUser wptUserList wptEDocumentInfo wptEDocumentInfoList wptReferenceRecordInfo wptReferenceRecordInfoList wptFolderInfo wptTaskInfo wptContents wptFileName wptDate wsrComplete wsrGoNext wsrGoPrevious wsrCustom wsrCancel wsrGoFinal wstForm wstEDocument wstTaskCard wstReferenceRecordCard wstFinal waAll waPerformers waManual wsbStart wsbFinish wsbNotice wsbStep wsbDecision wsbWait wsbMonitor wsbScript wsbConnector wsbSubTask wsbLifeCycleStage wsbPause wdtInteger wdtFloat wdtString wdtPick wdtDateTime wdtBoolean wdtTask wdtJob wdtFolder wdtEDocument wdtReferenceRecord wdtUser wdtGroup wdtRole wdtIntegerCollection wdtFloatCollection wdtStringCollection wdtPickCollection wdtDateTimeCollection wdtBooleanCollection wdtTaskCollection wdtJobCollection wdtFolderCollection wdtEDocumentCollection wdtReferenceRecordCollection wdtUserCollection wdtGroupCollection wdtRoleCollection wdtContents wdtUserList wdtSearchDescription wdtDeadLine wdtPickSet wdtAccountCollection wiLow wiNormal wiHigh wrtSoft wrtHard wsInit wsRunning wsDone wsControlled wsAborted wsContinued wtmFull wtmFromCurrent wtmOnlyCurrent) + b["global"] = Set.new %w(AltState Application CallType ComponentTokens CreatedJobs CreatedNotices ControlState DialogResult Dialogs EDocuments EDocumentVersionSource Folders GlobalIDs Job Jobs InputValue LookUpReference LookUpRequisiteNames LookUpSearch Object ParentComponent Processes References Requisite ReportName Reports Result Scripts Searches SelectedAttachments SelectedItems SelectMode Sender ServerEvents ServiceFactory ShiftState SubTask SystemDialogs Tasks Wizard Wizards Work ВызовСпособ ИмяОтчета РеквЗнач) + b["interface"] = Set.new %w(IApplication IAccessRights IAccountRepository IAccountSelectionRestrictions IAction IActionList IAdministrationHistoryDescription IAnchors IApplication IArchiveInfo IAttachment IAttachmentList ICheckListBox ICheckPointedList IColumn IComponent IComponentDescription IComponentToken IComponentTokenFactory IComponentTokenInfo ICompRecordInfo IConnection IContents IControl IControlJob IControlJobInfo IControlList ICrypto ICrypto2 ICustomJob ICustomJobInfo ICustomListBox ICustomObjectWizardStep ICustomWork ICustomWorkInfo IDataSet IDataSetAccessInfo IDataSigner IDateCriterion IDateRequisite IDateRequisiteDescription IDateValue IDeaAccessRights IDeaObjectInfo IDevelopmentComponentLock IDialog IDialogFactory IDialogPickRequisiteItems IDialogsFactory IDICSFactory IDocRequisite IDocumentInfo IDualListDialog IECertificate IECertificateInfo IECertificates IEditControl IEditorForm IEdmsExplorer IEdmsObject IEdmsObjectDescription IEdmsObjectFactory IEdmsObjectInfo IEDocument IEDocumentAccessRights IEDocumentDescription IEDocumentEditor IEDocumentFactory IEDocumentInfo IEDocumentStorage IEDocumentVersion IEDocumentVersionListDialog IEDocumentVersionSource IEDocumentWizardStep IEDocVerSignature IEDocVersionState IEnabledMode IEncodeProvider IEncrypter IEvent IEventList IException IExternalEvents IExternalHandler IFactory IField IFileDialog IFolder IFolderDescription IFolderDialog IFolderFactory IFolderInfo IForEach IForm IFormTitle IFormWizardStep IGlobalIDFactory IGlobalIDInfo IGrid IHasher IHistoryDescription IHyperLinkControl IImageButton IImageControl IInnerPanel IInplaceHint IIntegerCriterion IIntegerList IIntegerRequisite IIntegerValue IISBLEditorForm IJob IJobDescription IJobFactory IJobForm IJobInfo ILabelControl ILargeIntegerCriterion ILargeIntegerRequisite ILargeIntegerValue ILicenseInfo ILifeCycleStage IList IListBox ILocalIDInfo ILocalization ILock IMemoryDataSet IMessagingFactory IMetadataRepository INotice INoticeInfo INumericCriterion INumericRequisite INumericValue IObject IObjectDescription IObjectImporter IObjectInfo IObserver IPanelGroup IPickCriterion IPickProperty IPickRequisite IPickRequisiteDescription IPickRequisiteItem IPickRequisiteItems IPickValue IPrivilege IPrivilegeList IProcess IProcessFactory IProcessMessage IProgress IProperty IPropertyChangeEvent IQuery IReference IReferenceCriterion IReferenceEnabledMode IReferenceFactory IReferenceHistoryDescription IReferenceInfo IReferenceRecordCardWizardStep IReferenceRequisiteDescription IReferencesFactory IReferenceValue IRefRequisite IReport IReportFactory IRequisite IRequisiteDescription IRequisiteDescriptionList IRequisiteFactory IRichEdit IRouteStep IRule IRuleList ISchemeBlock IScript IScriptFactory ISearchCriteria ISearchCriterion ISearchDescription ISearchFactory ISearchFolderInfo ISearchForObjectDescription ISearchResultRestrictions ISecuredContext ISelectDialog IServerEvent IServerEventFactory IServiceDialog IServiceFactory ISignature ISignProvider ISignProvider2 ISignProvider3 ISimpleCriterion IStringCriterion IStringList IStringRequisite IStringRequisiteDescription IStringValue ISystemDialogsFactory ISystemInfo ITabSheet ITask ITaskAbortReasonInfo ITaskCardWizardStep ITaskDescription ITaskFactory ITaskInfo ITaskRoute ITextCriterion ITextRequisite ITextValue ITreeListSelectDialog IUser IUserList IValue IView IWebBrowserControl IWizard IWizardAction IWizardFactory IWizardFormElement IWizardParam IWizardPickParam IWizardReferenceParam IWizardStep IWorkAccessRights IWorkDescription IWorkflowAskableParam IWorkflowAskableParams IWorkflowBlock IWorkflowBlockResult IWorkflowEnabledMode IWorkflowParam IWorkflowPickParam IWorkflowReferenceParam IWorkState IWorkTreeCustomNode IWorkTreeJobNode IWorkTreeTaskNode IXMLEditorForm SBCrypto) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/j.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/j.rb new file mode 100644 index 000000000000..7a5ede1e665e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/j.rb @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class J < RegexLexer + title 'J' + desc "The J programming language (jsoftware.com)" + tag 'j' + filenames '*.ijs', '*.ijt' + + # For J-specific terms we use, see: + # https://code.jsoftware.com/wiki/Vocabulary/AET + # https://code.jsoftware.com/wiki/Vocabulary/Glossary + + # https://code.jsoftware.com/wiki/Vocabulary/PartsOfSpeech + def self.token_map + @token_map ||= { + noun: Keyword::Constant, + verb: Name::Function, + modifier: Operator, + name: Name, + param: Name::Builtin::Pseudo, + other: Punctuation, + nil => Error, + } + end + + # https://code.jsoftware.com/wiki/NuVoc + def self.inflection_list + @inflection_list ||= ['', '.', ':', '..', '.:', ':.', '::'] + end + + def self.primitive_table + @primitive_table ||= Hash.new([:name]).tap do |h| + { + '()' => [:other], + '=' => [:verb, :other, :other], + '<>+-*%$|,#' => [:verb, :verb, :verb], + '^' => [:verb, :verb, :modifier], + '~"' => [:modifier, :verb, :verb], + '.:@' => [:modifier, :modifier, :modifier], + ';' => [:verb, :modifier, :verb], + '!' => [:verb, :modifier, :modifier], + '/\\' => [:modifier, :modifier, :verb], + '[' => [:verb, nil, :verb], + ']' => [:verb], + '{' => [:verb, :verb, :verb, nil, nil, nil, :verb], + '}' => [:modifier, :verb, :verb, nil, nil, nil, :modifier], + '`' => [:modifier, nil, :modifier], + '&' => [:modifier, :modifier, :modifier, nil, :modifier], + '?' => [:verb, :verb], + 'a' => [:name, :noun, :noun], + 'ACeEIjorv' => [:name, :verb], + 'bdfHMT' => [:name, :modifier], + 'Dt' => [:name, :modifier, :modifier], + 'F' => [:name, :modifier, :modifier, :modifier, :modifier, + :modifier, :modifier], + 'iu' => [:name, :verb, :verb], + 'L' => [:name, :verb, :modifier], + 'mny' => [:param], + 'p' => [:name, :verb, :verb, :verb], + 'qsZ' => [:name, nil, :verb], + 'S' => [:name, nil, :modifier], + 'u' => [:param, :verb, :verb], + 'v' => [:param, :verb], + 'x' => [:param, nil, :verb], + }.each {|k, v| k.each_char {|c| h[c] = v } } + end + end + + def self.primitive(char, inflection) + i = inflection_list.index(inflection) or return Error + token_map[primitive_table[char][i]] + end + + def self.control_words + @control_words ||= Set.new %w( + assert break case catch catchd catcht continue do else elseif end + fcase for if return select throw try while whilst + ) + end + + def self.control_words_id + @control_words_id ||= Set.new %w(for goto label) + end + + state :expr do + rule %r/\s+/, Text + + rule %r'([!-&(-/:-@\[-^`{-~]|[A-Za-z]\b)([.:]*)' do |m| + token J.primitive(m[1], m[2]) + end + + rule %r/(?:\d|_\d?):([.:]*)/ do |m| + token m[1].empty? ? J.token_map[:verb] : Error + end + + rule %r/[\d_][\w.]*([.:]*)/ do |m| + token m[1].empty? ? Num : Error + end + + rule %r/'/, Str::Single, :str + + rule %r/NB\.(?![.:]).*/, Comment::Single + + rule %r/([A-Za-z]\w*)([.:]*)/ do |m| + if m[2] == '.' + word, sep, id = m[1].partition '_' + list = if sep.empty? + J.control_words + elsif not id.empty? + J.control_words_id + end + if list and list.include? word + token Keyword, word + sep + token((word == 'for' ? Name : Name::Label), id) + token Keyword, m[2] + else + token Error + end + else + token m[2].empty? ? Name : Error + end + end + end + + state :str do + rule %r/''/, Str::Escape + rule %r/[^'\n]+/, Str::Single + rule %r/'|$/, Str::Single, :pop! + end + + start do + @note_next = false + end + + state :root do + rule %r/\n/ do + token Text + if @note_next + push :note + @note_next = false + end + end + + # https://code.jsoftware.com/wiki/Vocabulary/com + # https://code.jsoftware.com/wiki/Vocabulary/NounExplicitDefinition + rule %r/ + ([0-4]|13|adverb|conjunction|dyad|monad|noun|verb)([\ \t]+) + (def(?:ine)?\b|:)(?![.:])([\ \t]*) + /x do |m| + groups Keyword::Pseudo, Text, Keyword::Pseudo, Text + @def_body = (m[1] == '0' || m[1] == 'noun') ? :noun : :code + if m[3] == 'define' + # stack: [:root] + # or [:root, ..., :def_next] + pop! if stack.size > 1 + push @def_body + push :def_next # [:root, ..., @def_body, :def_next] + else + push :expl_def + end + end + + rule %r/^([ \t]*)(Note\b(?![.:]))([ \t\r]*)(?!=[.:]|$)/ do + groups Text, Name, Text + @note_next = true + end + + rule %r/[mnuvxy]\b(?![.:])/, Name + mixin :expr + end + + state :def_next do + rule %r/\n/, Text, :pop! + mixin :root + end + + state :expl_def do + rule %r/0\b(?![.:])/ do + token Keyword::Pseudo + # stack: [:root, :expl_def] + # or [:root, ..., :def_next, :expl_def] + pop! if stack.size > 2 + goto @def_body + push :def_next # [:root, ..., @def_body, :def_next] + end + rule %r/'/ do + if @def_body == :noun + token Str::Single + goto :str + else + token Punctuation + goto :q_expr + end + end + rule(//) { pop! } + end + + # `q_expr` lexes the content of a string literal which is a part of an + # explicit definition. + # e.g. dyad def 'x + y' + state :q_expr do + rule %r/''/, Str::Single, :q_str + rule %r/'|$/, Punctuation, :pop! + rule %r/NB\.(?![.:])([^'\n]|'')*/, Comment::Single + mixin :expr + end + + state :q_str do + rule %r/''''/, Str::Escape + rule %r/[^'\n]+/, Str::Single + rule %r/''/, Str::Single, :pop! + rule(/'|$/) { token Punctuation; pop! 2 } + end + + state :note do + mixin :delimiter + rule %r/.+\n?/, Comment::Multiline + end + + state :noun do + mixin :delimiter + rule %r/.+\n?/, Str::Heredoc + end + + state :code do + mixin :delimiter + rule %r/^([ \t]*)(:)([ \t\r]*)$/ do + groups Text, Punctuation, Text + end + mixin :expr + end + + state :delimiter do + rule %r/^([ \t]*)(\))([ \t\r]*$\n?)/ do + groups Text, Punctuation, Text + pop! + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/janet.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/janet.rb new file mode 100644 index 000000000000..18b2465b1488 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/janet.rb @@ -0,0 +1,218 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Janet < RegexLexer + title "Janet" + desc "The Janet programming language (janet-lang.org)" + + tag 'janet' + aliases 'jdn' + + filenames '*.janet', '*.jdn' + + mimetypes 'text/x-janet', 'application/x-janet' + + def self.specials + @specials ||= Set.new %w( + break def do fn if quote quasiquote splice set unquote var while + ) + end + + def self.bundled + @bundled ||= Set.new %w( + % %= * *= + ++ += - -- -= -> ->> -?> -?>> / /= < <= = > >= + abstract? accumulate accumulate2 all all-bindings + all-dynamics and apply array array/concat array/ensure + array/fill array/insert array/new array/new-filled + array/peek array/pop array/push array/remove array/slice + array? as-> as?-> asm assert bad-compile bad-parse band + blshift bnot boolean? bor brshift brushift buffer buffer/bit + buffer/bit-clear buffer/bit-set buffer/bit-toggle + buffer/blit buffer/clear buffer/fill buffer/format + buffer/new buffer/new-filled buffer/popn buffer/push-byte + buffer/push-string buffer/push-word buffer/slice buffer? + bxor bytes? case cfunction? chr cli-main comment comp + compare compare= compare< compare<= compare> compare>= + compile complement comptime cond coro count debug + debug/arg-stack debug/break debug/fbreak debug/lineage + debug/stack debug/stacktrace debug/step debug/unbreak + debug/unfbreak debugger-env dec deep-not= deep= default + default-peg-grammar def- defer defmacro defmacro- defn defn- + defglobal describe dictionary? disasm distinct doc doc* + doc-format dofile drop drop-until drop-while dyn each eachk + eachp eachy edefer eflush empty? env-lookup eprin eprinf + eprint eprintf error errorf eval eval-string even? every? + extreme false? fiber/can-resume? fiber/current fiber/getenv + fiber/maxstack fiber/new fiber/root fiber/setenv + fiber/setmaxstack fiber/status fiber? file/close file/flush + file/open file/popen file/read file/seek file/temp + file/write filter find find-index first flatten flatten-into + flush for forv freeze frequencies function? gccollect + gcinterval gcsetinterval generate gensym get get-in getline + hash idempotent? identity import import* if-let if-not + if-with in inc indexed? int/s64 int/u64 int? interleave + interpose invert janet/build janet/config-bits janet/version + juxt juxt* keep keys keyword keyword? kvs label last length + let load-image load-image-dict loop macex macex1 make-env + make-image make-image-dict map mapcat marshal math/-inf + math/abs math/acos math/acosh math/asin math/asinh math/atan + math/atan2 math/atanh math/cbrt math/ceil math/cos math/cosh + math/e math/erf math/erfc math/exp math/exp2 math/expm1 + math/floor math/gamma math/hypot math/inf math/log + math/log10 math/log1p math/log2 math/next math/pi math/pow + math/random math/rng math/rng-buffer math/rng-int + math/rng-uniform math/round math/seedrandom math/sin + math/sinh math/sqrt math/tan math/tanh math/trunc match max + mean merge merge-into min mod module/add-paths module/cache + module/expand-path module/find module/loaders module/loading + module/paths nan? nat? native neg? net/chunk net/close + net/connect net/read net/server net/write next nil? not not= + number? odd? one? or os/arch os/cd os/chmod os/clock + os/cryptorand os/cwd os/date os/dir os/environ os/execute + os/exit os/getenv os/link os/lstat os/mkdir os/mktime + os/perm-int os/perm-string os/readlink os/realpath os/rename + os/rm os/rmdir os/setenv os/shell os/sleep os/stat + os/symlink os/time os/touch os/umask os/which pairs parse + parser/byte parser/clone parser/consume parser/eof + parser/error parser/flush parser/has-more parser/insert + parser/new parser/produce parser/state parser/status + parser/where partial partition peg/compile peg/match pos? + postwalk pp prewalk prin prinf print printf product prompt + propagate protect put put-in quit range reduce reduce2 + repeat repl require resume return reverse reversed root-env + run-context scan-number seq setdyn shortfn signal slice + slurp some sort sort-by sorted sorted-by spit stderr stdin + stdout string string/ascii-lower string/ascii-upper + string/bytes string/check-set string/find string/find-all + string/format string/from-bytes string/has-prefix? + string/has-suffix? string/join string/repeat string/replace + string/replace-all string/reverse string/slice string/split + string/trim string/triml string/trimr string? struct struct? + sum symbol symbol? table table/clone table/getproto + table/new table/rawget table/setproto table/to-struct table? + take take-until take-while tarray/buffer tarray/copy-bytes + tarray/length tarray/new tarray/properties tarray/slice + tarray/swap-bytes thread/close thread/current thread/new + thread/receive thread/send trace tracev true? truthy? try + tuple tuple/brackets tuple/setmap tuple/slice + tuple/sourcemap tuple/type tuple? type unless unmarshal + untrace update update-in use values var- varfn varglobal + walk walk-ind walk-dict when when-let when-with with + with-dyns with-syms with-vars yield zero? zipcoll + ) + end + + def name_token(name) + if self.class.specials.include? name + Keyword + elsif self.class.bundled.include? name + Keyword::Reserved + else + Name::Function + end + end + + punctuation = %r/[_!$%^&*+=~<>.?\/-]/o + symbol = %r/([[:alpha:]]|#{punctuation})([[:word:]]|#{punctuation}|:)*/o + + state :root do + rule %r/#.*?$/, Comment::Single + rule %r/\s+/m, Text::Whitespace + + rule %r/(true|false|nil)\b/, Name::Constant + rule %r/(['~])(#{symbol})/ do + groups Operator, Str::Symbol + end + rule %r/:([[:word:]]|#{punctuation}|:)*/, Keyword::Constant + + # radix-specified numbers + rule %r/[+-]?\d{1,2}r[\w.]+(&[+-]?\w+)?/, Num::Float + + # hex numbers + rule %r/[+-]?0x\h[\h_]*(\.\h[\h_]*)?/, Num::Hex + rule %r/[+-]?0x\.\h[\h_]*/, Num::Hex + + # decimal numbers (Janet treats all decimals as floats) + rule %r/[+-]?\d[\d_]*(\.\d[\d_]*)?([e][+-]?\d+)?/i, Num::Float + rule %r/[+-]?\.\d[\d_]*([e][+-]?\d+)?/i, Num::Float + + rule %r/@?"/, Str::Double, :string + rule %r/@?(`+).*?\1/m, Str::Heredoc + + rule %r/\(/, Punctuation, :function + + rule %r/(')(@?[(\[{])/ do + groups Operator, Punctuation + push :quote + end + + rule %r/(~)(@?[(\[{])/ do + groups Operator, Punctuation + push :quasiquote + end + + rule %r/[\#~,';\|]/, Operator + + rule %r/@?[(){}\[\]]/, Punctuation + + rule symbol, Name + end + + state :string do + rule %r/"/, Str::Double, :pop! + rule %r/\\(u\h{4}|U\h{6})/, Str::Escape + rule %r/\\./, Str::Escape + rule %r/[^"\\]+/, Str::Double + end + + state :function do + rule %r/[\)]/, Punctuation, :pop! + + rule symbol do |m| + case m[0] + when "quote" + token Keyword + goto :quote + when "quasiquote" + token Keyword + goto :quasiquote + else + token name_token(m[0]) + goto :root + end + end + + mixin :root + end + + state :quote do + rule %r/[(\[{]/, Punctuation, :push + rule %r/[)\]}]/, Punctuation, :pop! + rule symbol, Str::Escape + mixin :root + end + + state :quasiquote do + rule %r/(,)(\()/ do + groups Operator, Punctuation + push :function + end + rule %r/(\()(\s*)(unquote)(\s+)(\()/ do + groups Punctuation, Text, Keyword, Text, Punctuation + push :function + end + + rule %r/(,)(#{symbol})/ do + groups Operator, Name + end + rule %r/(\()(\s*)(unquote)(\s+)(#{symbol})/ do + groups Punctuation, Text, Keyword, Text, Name + end + + mixin :quote + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/java.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/java.rb new file mode 100644 index 000000000000..14b2a691ce6d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/java.rb @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Java < RegexLexer + title "Java" + desc "The Java programming language (java.com)" + + tag 'java' + filenames '*.java' + mimetypes 'text/x-java' + + keywords = %w( + assert break case catch continue default do else finally for + if goto instanceof new return switch this throw try while + ) + + declarations = %w( + abstract const enum extends final implements native private protected + public static strictfp super synchronized throws transient volatile + ) + + types = %w(boolean byte char double float int long short var void) + + id = /[[:alpha:]_][[:word:]]*/ + const_name = /[[:upper:]][[:upper:][:digit:]_]*\b/ + class_name = /[[:upper:]][[:alnum:]]*\b/ + + state :root do + rule %r/[^\S\n]+/, Text + rule %r(//.*?$), Comment::Single + rule %r(/\*.*?\*/)m, Comment::Multiline + # keywords: go before method names to avoid lexing "throw new XYZ" + # as a method signature + rule %r/(?:#{keywords.join('|')})\b/, Keyword + + rule %r( + (\s*(?:[a-zA-Z_][a-zA-Z0-9_.\[\]<>]*\s+)+?) # return arguments + ([a-zA-Z_][a-zA-Z0-9_]*) # method name + (\s*)(\() # signature start + )mx do |m| + # TODO: do this better, this shouldn't need a delegation + delegate Java, m[1] + token Name::Function, m[2] + token Text, m[3] + token Operator, m[4] + end + + rule %r/@#{id}/, Name::Decorator + rule %r/(?:#{declarations.join('|')})\b/, Keyword::Declaration + rule %r/(?:#{types.join('|')})\b/, Keyword::Type + rule %r/(?:true|false|null)\b/, Keyword::Constant + rule %r/(?:class|interface)\b/, Keyword::Declaration, :class + rule %r/(?:import|package)\b/, Keyword::Namespace, :import + rule %r/"(\\\\|\\"|[^"])*"/, Str + rule %r/'(?:\\.|[^\\]|\\u[0-9a-f]{4})'/, Str::Char + rule %r/(\.)(#{id})/ do + groups Operator, Name::Attribute + end + + rule %r/#{id}:/, Name::Label + rule const_name, Name::Constant + rule class_name, Name::Class + rule %r/\$?#{id}/, Name + rule %r/[~^*!%&\[\](){}<>\|+=:;,.\/?-]/, Operator + + digit = /[0-9]_+[0-9]|[0-9]/ + bin_digit = /[01]_+[01]|[01]/ + oct_digit = /[0-7]_+[0-7]|[0-7]/ + hex_digit = /[0-9a-f]_+[0-9a-f]|[0-9a-f]/i + rule %r/#{digit}+\.#{digit}+([eE]#{digit}+)?[fd]?/, Num::Float + rule %r/0b#{bin_digit}+/i, Num::Bin + rule %r/0x#{hex_digit}+/i, Num::Hex + rule %r/0#{oct_digit}+/, Num::Oct + rule %r/#{digit}+L?/, Num::Integer + rule %r/\n/, Text + end + + state :class do + rule %r/\s+/m, Text + rule id, Name::Class, :pop! + end + + state :import do + rule %r/\s+/m, Text + rule %r/[a-z0-9_.]+\*?/i, Name::Namespace, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/javascript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/javascript.rb new file mode 100644 index 000000000000..c5508fe83c6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/javascript.rb @@ -0,0 +1,285 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + # IMPORTANT NOTICE: + # + # Please do not copy this lexer and open a pull request + # for a new language. It will not get merged, you will + # be unhappy, and kittens will cry. + # + class Javascript < RegexLexer + title "JavaScript" + desc "JavaScript, the browser scripting language" + + tag 'javascript' + aliases 'js' + filenames '*.cjs', '*.js', '*.mjs' + mimetypes 'application/javascript', 'application/x-javascript', + 'text/javascript', 'text/x-javascript' + + # Pseudo-documentation: https://stackoverflow.com/questions/1661197/what-characters-are-valid-for-javascript-variable-names + + def self.detect?(text) + return 1 if text.shebang?('node') + return 1 if text.shebang?('jsc') + # TODO: rhino, spidermonkey, etc + end + + state :multiline_comment do + rule %r([*]/), Comment::Multiline, :pop! + rule %r([^*/]+), Comment::Multiline + rule %r([*/]), Comment::Multiline + end + + state :comments_and_whitespace do + rule %r/\s+/, Text + rule %r/<!--/, Comment # really...? + rule %r(//.*?$), Comment::Single + rule %r(/[*]), Comment::Multiline, :multiline_comment + end + + state :expr_start do + mixin :comments_and_whitespace + + rule %r(/) do + token Str::Regex + goto :regex + end + + rule %r/[{]/ do + token Punctuation + goto :object + end + + rule %r//, Text, :pop! + end + + state :regex do + rule %r(/) do + token Str::Regex + goto :regex_end + end + + rule %r([^/]\n), Error, :pop! + + rule %r/\n/, Error, :pop! + rule %r/\[\^/, Str::Escape, :regex_group + rule %r/\[/, Str::Escape, :regex_group + rule %r/\\./, Str::Escape + rule %r{[(][?][:=<!]}, Str::Escape + rule %r/[{][\d,]+[}]/, Str::Escape + rule %r/[()?]/, Str::Escape + rule %r/./, Str::Regex + end + + state :regex_end do + rule %r/[gimuy]+/, Str::Regex, :pop! + rule(//) { pop! } + end + + state :regex_group do + # specially highlight / in a group to indicate that it doesn't + # close the regex + rule %r(/), Str::Escape + + rule %r([^/]\n) do + token Error + pop! 2 + end + + rule %r/\]/, Str::Escape, :pop! + rule %r/\\./, Str::Escape + rule %r/./, Str::Regex + end + + state :bad_regex do + rule %r/[^\n]+/, Error, :pop! + end + + def self.keywords + @keywords ||= Set.new %w( + as async await break case catch continue debugger default delete + do else export finally from for if import in instanceof new of + return super switch this throw try typeof void while yield + ) + end + + def self.declarations + @declarations ||= Set.new %w( + var let const with function class + extends constructor get set static + ) + end + + def self.reserved + @reserved ||= Set.new %w( + enum implements interface + package private protected public + ) + end + + def self.constants + @constants ||= Set.new %w(true false null NaN Infinity undefined) + end + + def self.builtins + @builtins ||= %w( + Array Boolean Date Error Function Math netscape + Number Object Packages RegExp String sun decodeURI + decodeURIComponent encodeURI encodeURIComponent + Error eval isFinite isNaN parseFloat parseInt + document window navigator self global + Promise Set Map WeakSet WeakMap Symbol Proxy Reflect + Int8Array Uint8Array Uint8ClampedArray + Int16Array Uint16Array Uint16ClampedArray + Int32Array Uint32Array Uint32ClampedArray + Float32Array Float64Array DataView ArrayBuffer + ) + end + + def self.id_regex + /[\p{L}\p{Nl}$_][\p{Word}]*/io + end + + id = self.id_regex + + state :root do + rule %r/\A\s*#!.*?\n/m, Comment::Preproc, :statement + rule %r((?<=\n)(?=\s|/|<!--)), Text, :expr_start + mixin :comments_and_whitespace + rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | === + | !== )x, + Operator, :expr_start + rule %r([-<>+*%&|\^/!=]=?), Operator, :expr_start + rule %r/[(\[,]/, Punctuation, :expr_start + rule %r/;/, Punctuation, :statement + rule %r/[)\].]/, Punctuation + + rule %r/`/ do + token Str::Double + push :template_string + end + + # special case for the safe navigation operator ?. + # so that we don't start detecting a ternary expr + rule %r/[?][.]/, Punctuation + + rule %r/[?]/ do + token Punctuation + push :ternary + push :expr_start + end + + rule %r/(\@)(\w+)?/ do + groups Punctuation, Name::Decorator + push :expr_start + end + + rule %r/[{}]/, Punctuation, :statement + + rule id do |m| + if self.class.keywords.include? m[0] + token Keyword + push :expr_start + elsif self.class.declarations.include? m[0] + token Keyword::Declaration + push :expr_start + elsif self.class.reserved.include? m[0] + token Keyword::Reserved + elsif self.class.constants.include? m[0] + token Keyword::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Other + end + end + + rule %r/[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float + rule %r/0x[0-9a-fA-F]+/i, Num::Hex + rule %r/0o[0-7][0-7_]*/i, Num::Oct + rule %r/0b[01][01_]*/i, Num::Bin + rule %r/[0-9]+/, Num::Integer + + rule %r/"/, Str::Delimiter, :dq + rule %r/'/, Str::Delimiter, :sq + rule %r/:/, Punctuation + end + + state :dq do + rule %r/\\[\\nrt"]?/, Str::Escape + rule %r/[^\\"]+/, Str::Double + rule %r/"/, Str::Delimiter, :pop! + end + + state :sq do + rule %r/\\[\\nrt']?/, Str::Escape + rule %r/[^\\']+/, Str::Single + rule %r/'/, Str::Delimiter, :pop! + end + + # braced parts that aren't object literals + state :statement do + rule %r/case\b/ do + token Keyword + goto :expr_start + end + + rule %r/(#{id})(\s*)(:)/ do + groups Name::Label, Text, Punctuation + end + + mixin :expr_start + end + + # object literals + state :object do + mixin :comments_and_whitespace + + rule %r/[{]/ do + token Punctuation + push + end + + rule %r/[}]/ do + token Punctuation + goto :statement + end + + rule %r/(#{id})(\s*)(:)/ do + groups Name::Attribute, Text, Punctuation + push :expr_start + end + + rule %r/:/, Punctuation + mixin :root + end + + # ternary expressions, where <id>: is not a label! + state :ternary do + rule %r/:/ do + token Punctuation + goto :expr_start + end + + mixin :root + end + + # template strings + state :template_string do + rule %r/[$]{/, Punctuation, :template_string_expr + rule %r/`/, Str::Double, :pop! + rule %r/\\[$`]/, Str::Escape + rule %r/[^$`\\]+/, Str::Double + rule %r/[\\$]/, Str::Double + end + + state :template_string_expr do + rule %r/}/, Punctuation, :pop! + mixin :root + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jinja.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jinja.rb new file mode 100644 index 000000000000..bcf0f7646998 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jinja.rb @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Jinja < TemplateLexer + title "Jinja" + desc "Django/Jinja template engine (jinja.pocoo.org)" + + tag 'jinja' + aliases 'django' + + mimetypes 'application/x-django-templating', 'application/x-jinja', + 'text/html+django', 'text/html+jinja' + + def self.keywords + @@keywords ||= %w(as context do else extends from ignore missing + import include reversed recursive scoped + autoescape endautoescape block endblock call endcall + filter endfilter for endfor if endif macro endmacro + set endset trans endtrans with endwith without) + end + + def self.tests + @@tests ||= %w(callable defined divisibleby equalto escaped even iterable + lower mapping none number odd sameas sequence string + undefined upper) + end + + def self.pseudo_keywords + @@pseudo_keywords ||= %w(true false none True False None) + end + + def self.word_operators + @@word_operators ||= %w(is in and or not) + end + + state :root do + # Comments + rule %r/{#/, Comment, :comment + rule %r/##.*/, Comment + + # Raw and verbatim + rule %r/({%-?)(\s*)(raw|verbatim)(\s*)(-?%})/ do |m| + groups Comment::Preproc, Text, Keyword, Text, Comment::Preproc + case m[3] + when "raw" + push :raw + when "verbatim" + push :verbatim + end + end + + # Statements + rule %r/\{\%/ do + token Comment::Preproc + push :statement + end + + # Expressions + rule %r/\{\{/ do + token Comment::Preproc + push :expression + end + + rule(/(.+?)(?=\\|{{|{%|{#|##)/m) { delegate parent } + rule(/.+/m) { delegate parent } + end + + state :filter do + # Filters are called like variable|foo(arg1, ...) + rule %r/(\|\s*)(\w+)/ do + groups Operator, Name::Function + end + end + + state :function do + rule %r/(\w+)(\()/ do + groups Name::Function, Punctuation + end + end + + state :text do + rule %r/\s+/m, Text + end + + state :literal do + # Strings + rule %r/"(\\.|.)*?"/, Str::Double + rule %r/'(\\.|.)*?'/, Str::Single + + # Numbers + rule %r/\d+(?=}\s)/, Num + + # Arithmetic operators (+, -, *, **, //, /) + # TODO : implement modulo (%) + rule %r/(\+|\-|\*|\/\/?|\*\*?|=)/, Operator + + # Comparisons operators (<=, <, >=, >, ==, ===, !=) + rule %r/(<=?|>=?|===?|!=)/, Operator + + # Punctuation (the comma, [], ()) + rule %r/,/, Punctuation + rule %r/\[/, Punctuation + rule %r/\]/, Punctuation + rule %r/\(/, Punctuation + rule %r/\)/, Punctuation + end + + state :comment do + rule %r/[^#]+/m, Comment + rule(/#}/) { token Comment; pop! } + rule %r/#/, Comment + end + + state :expression do + rule %r/\w+\.?/m, Name::Variable + + mixin :filter + mixin :function + mixin :literal + mixin :text + + rule %r/%}|}}/, Comment::Preproc, :pop! + end + + state :statement do + rule %r/(\w+\.?)/ do |m| + if self.class.keywords.include?(m[0]) + groups Keyword + elsif self.class.pseudo_keywords.include?(m[0]) + groups Keyword::Pseudo + elsif self.class.word_operators.include?(m[0]) + groups Operator::Word + elsif self.class.tests.include?(m[0]) + groups Name::Builtin + else + groups Name::Variable + end + end + + mixin :filter + mixin :function + mixin :literal + mixin :text + + rule %r/\%\}/, Comment::Preproc, :pop! + end + + state :raw do + rule %r/({%-?)(\s*)(endraw)(\s*)(-?%})/ do + groups Comment::Preproc, Text, Keyword, Text, Comment::Preproc + pop! + end + rule %r/[^{]+/, Text + rule %r/{/, Text + end + + state :verbatim do + rule %r/({%-?)(\s*)(endverbatim)(\s*)(-?%})/ do + groups Comment::Preproc, Text, Keyword, Text, Comment::Preproc + pop! + end + rule %r/[^{]+/, Text + rule %r/{/, Text + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsl.rb new file mode 100644 index 000000000000..2c435dec969a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsl.rb @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class JSL < RegexLexer + title "JSL" + desc "The JMP Scripting Language (JSL) (jmp.com)" + + tag 'jsl' + filenames '*.jsl' + + state :root do + rule %r/\s+/m, Text::Whitespace + + rule %r(//.*?$), Comment::Single + rule %r'/[*].*', Comment::Multiline, :comment + + # messages + rule %r/<</, Operator, :message + + # covers built-in and custom functions + rule %r/([a-z_][\w\s'%.\\]*)(\()/i do |m| + groups Keyword, Punctuation + end + + rule %r/\d{2}(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{2}(\d{2})?(:\d{2}:\d{2}(:\d{2}(\.\d*)?)?)?/i, Literal::Date + + rule %r/-?(?:[0-9]+(?:[.][0-9]+)?|[.][0-9]*)(?:e[+-]?[0-9]+)?i?/i, Num + + rule %r/::[a-z_][\w\s'%.\\]*/i, Name::Variable + rule %r/:\w+/, Name + rule %r/[a-z_][\w\s'%.\\]*/i, Name::Variable + rule %r/"(?:\\!"|[^"])*?"n/m, Name::Variable + + rule %r/(")(\\\[)(.*?)(\]\\)(")/m do + groups Str::Double, Str::Escape, Str::Double, Str::Escape, Str::Double # escaped string + end + rule %r/"/, Str::Double, :dq + + rule %r/[-+*\/!%&<>\|=:`^]/, Operator + rule %r/[\[\](){},;]/, Punctuation + end + + state :message do + rule %r/\s+/m, Text::Whitespace + rule %r/[a-z_][\w\s'%.\\]*/i, Name::Function + rule %r/[(),;]/, Punctuation, :pop! + rule %r/[&|!=<>]/, Operator, :pop! + end + + state :dq do + rule %r/\\![btrnNf0\\"]/, Str::Escape + rule %r/\\/, Str::Double + rule %r/"/, Str::Double, :pop! + rule %r/[^\\"]+/m, Str::Double + end + + state :comment do + rule %r'/[*]', Comment::Multiline, :comment + rule %r'[*]/', Comment::Multiline, :pop! + rule %r'[^/*]+', Comment::Multiline + rule %r'[/*]', Comment::Multiline + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/json.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/json.rb new file mode 100644 index 000000000000..85228bf43e8b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/json.rb @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class JSON < RegexLexer + title 'JSON' + desc "JavaScript Object Notation (json.org)" + tag 'json' + filenames '*.json', 'Pipfile.lock' + mimetypes 'application/json', 'application/vnd.api+json', + 'application/hal+json', 'application/problem+json', + 'application/schema+json' + + state :whitespace do + rule %r/\s+/, Text::Whitespace + end + + state :root do + mixin :whitespace + rule %r/{/, Punctuation, :object + rule %r/\[/, Punctuation, :array + + mixin :name + mixin :value + + # These characters may be invalid but syntax correctness is a non-goal + rule %r/[\]}]/, Punctuation + end + + state :object do + mixin :whitespace + mixin :name + mixin :value + rule %r/}/, Punctuation, :pop! + rule %r/,/, Punctuation + end + + state :name do + rule %r/("(?:\\.|[^"\\\n])*?")(\s*)(:)/ do + groups Name::Label, Text::Whitespace, Punctuation + end + end + + state :value do + mixin :whitespace + mixin :constants + rule %r/"/, Str::Double, :string + rule %r/\[/, Punctuation, :array + rule %r/{/, Punctuation, :object + end + + state :string do + rule %r/[^\\"]+/, Str::Double + rule %r/\\./, Str::Escape + rule %r/"/, Str::Double, :pop! + end + + state :array do + mixin :value + rule %r/\]/, Punctuation, :pop! + rule %r/,/, Punctuation + end + + state :constants do + rule %r/(?:true|false|null)/, Keyword::Constant + rule %r/-?(?:0|[1-9]\d*)\.\d+(?:e[+-]?\d+)?/i, Num::Float + rule %r/-?(?:0|[1-9]\d*)(?:e[+-]?\d+)?/i, Num::Integer + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/json_doc.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/json_doc.rb new file mode 100644 index 000000000000..c243709100f2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/json_doc.rb @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'json.rb' + + class JSONDOC < JSON + desc "JavaScript Object Notation with extensions for documentation" + tag 'json-doc' + aliases 'jsonc' + + prepend :name do + rule %r/([$\w]+)(\s*)(:)/ do + groups Name::Attribute, Text, Punctuation + end + end + + prepend :value do + rule %r(/[*].*?[*]/), Comment + rule %r(//.*?$), Comment::Single + rule %r/(\.\.\.)/, Comment::Single + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsonnet.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsonnet.rb new file mode 100644 index 000000000000..6544366313b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsonnet.rb @@ -0,0 +1,153 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Jsonnet < RegexLexer + title 'Jsonnet' + desc 'An elegant, formally-specified config language for JSON' + tag 'jsonnet' + filenames '*.jsonnet', '*.libsonnet' + mimetypes 'text/x-jsonnet' + + def self.keywords + @keywords ||= Set.new %w( + self super local for in if then else import importstr error + tailstrict assert + ) + end + + def self.declarations + @declarations ||= Set.new %w( + function + ) + end + + def self.constants + @constants ||= Set.new %w( + null true false + ) + end + + def self.builtins + @builtins ||= Set.new %w( + acos + asin + atan + ceil + char + codepoint + cos + exp + exponent + filter + floor + force + length + log + makeArray + mantissa + objectFields + objectHas + pow + sin + sqrt + tan + thisFile + type + abs + assertEqual + escapeStringBash + escapeStringDollars + escapeStringJson + escapeStringPython + filterMap + flattenArrays + foldl + foldr + format + join + lines + manifestIni + manifestPython + manifestPythonVars + map + max + min + mod + range + set + setDiff + setInter + setMember + setUnion + sort + split + stringChars + substr + toString + uniq + ) + end + + identifier = /[a-zA-Z_][a-zA-Z0-9_]*/ + + state :root do + rule %r/\s+/, Text + rule %r(//.*?$), Comment::Single + rule %r(#.*?$), Comment::Single + rule %r(/\*.*?\*/)m, Comment::Multiline + + rule %r/-?(?:0|[1-9]\d*)\.\d+(?:e[+-]\d+)?/i, Num::Float + rule %r/-?(?:0|[1-9]\d*)(?:e[+-]\d+)?/i, Num::Integer + + rule %r/[{}:\.,;+\[\]=%\(\)]/, Punctuation + + rule %r/"/, Str, :string_double + rule %r/'/, Str, :string_single + rule %r/\|\|\|/, Str, :string_block + + rule %r/\$/, Keyword + + rule identifier do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.declarations.include? m[0] + token Keyword::Declaration + elsif self.class.constants.include? m[0] + token Keyword::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Other + end + end + end + + state :string do + rule %r/\\([\\\/bfnrt]|(u[0-9a-fA-F]{4}))/, Str::Escape + rule %r/\\./, Str::Escape + end + + state :string_double do + mixin :string + rule %r/\\"/, Str::Escape + rule %r/"/, Str, :pop! + rule %r/[^\\"]+/, Str + end + + state :string_single do + mixin :string + rule %r/'/, Str, :pop! + rule %r/[^\\']+/, Str + end + + state :string_block do + mixin :string + rule %r/[|][|][|]/, Str, :pop! + rule %r/[^|\\]+/, Str + rule %r/[|]/, Str + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsp.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsp.rb new file mode 100644 index 000000000000..509885b49c6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsp.rb @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class JSP < TemplateLexer + desc 'JSP' + tag 'jsp' + filenames '*.jsp' + mimetypes 'text/x-jsp', 'application/x-jsp' + + def initialize(*) + super + @java = Java.new + end + + directives = %w(page include taglib) + actions = %w(scriptlet declaration expression) + + state :root do + + rule %r/<%--/, Comment, :jsp_comment + + rule %r/<%@\s*(#{directives.join('|')})\s*/, Name::Tag, :jsp_directive + + rule %r/<jsp:directive\.(#{directives.join('|')})/, Name::Tag, :jsp_directive2 + + rule %r/<jsp:(#{actions.join('|')})>/, Name::Tag, :jsp_expression + + # start of tag, e.g. <c:if> + rule %r/<[a-zA-Z]*:[a-zA-Z]*\s*/, Name::Tag, :jsp_tag + + # end of tag, e.g. </c:if> + rule %r(</[a-zA-Z]*:[a-zA-Z]*>), Name::Tag + + rule %r/<%[!=]?/, Name::Tag, :jsp_expression2 + + # fallback to HTML + rule(/(.+?)(?=(<%|<\/?[a-zA-Z]*:))/m) { delegate parent } + rule(/.+/m) { delegate parent } + end + + state :jsp_comment do + rule %r/(--%>)/, Comment, :pop! + rule %r/./m, Comment + end + + state :jsp_directive do + rule %r/(%>)/, Name::Tag, :pop! + mixin :attributes + rule(/(.+?)(?=%>)/m) { delegate parent } + end + + state :jsp_directive2 do + rule %r!(/>)!, Name::Tag, :pop! + mixin :attributes + rule(/(.+?)(?=\/>)/m) { delegate parent } + end + + state :jsp_expression do + rule %r/<\/jsp:(#{actions.join('|')})>/, Name::Tag, :pop! + mixin :attributes + rule(/[^<\/]+/) { delegate @java } + end + + state :jsp_expression2 do + rule %r/%>/, Name::Tag, :pop! + rule(/[^%>]+/) { delegate @java } + end + + state :jsp_tag do + rule %r/\/?>/, Name::Tag, :pop! + mixin :attributes + rule(/(.+?)(?=\/?>)/m) { delegate parent } + end + + state :attributes do + rule %r/\s*[a-zA-Z0-9_:-]+\s*=\s*/m, Name::Attribute, :attr + end + + state :attr do + rule %r/"/ do + token Str + goto :double_quotes + end + + rule %r/'/ do + token Str + goto :single_quotes + end + + rule %r/[^\s>]+/, Str, :pop! + end + + state :double_quotes do + rule %r/"/, Str, :pop! + rule %r/\$\{/, Str::Interpol, :jsp_interp + rule %r/[^"]+/, Str + end + + state :single_quotes do + rule %r/'/, Str, :pop! + rule %r/\$\{/, Str::Interpol, :jsp_interp + rule %r/[^']+/, Str + end + + state :jsp_interp do + rule %r/\}/, Str::Interpol, :pop! + rule %r/'/, Literal, :jsp_interp_literal_start + rule(/[^'\}]+/) { delegate @java } + end + + state :jsp_interp_literal_start do + rule %r/'/, Literal, :pop! + rule %r/[^']+/, Literal + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsx.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsx.rb new file mode 100644 index 000000000000..90f3cc69cc6b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/jsx.rb @@ -0,0 +1,92 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'javascript.rb' + + class JSX < Javascript + title 'JSX' + desc 'An XML-like syntax extension to JavaScript (facebook.github.io/jsx/)' + tag 'jsx' + aliases 'jsx', 'react' + filenames '*.jsx' + + mimetypes 'text/x-jsx', 'application/x-jsx' + + start { @html = HTML.new(options); push :expr_start } + + prepend :expr_start do + mixin :tag + end + + state :tag do + rule %r/</ do + token Punctuation + push :tag_opening + push :element + push :element_name + end + end + + state :tag_opening do + rule %r/<\// do + token Punctuation + goto :element + push :element_name + end + mixin :tag + rule %r/{/ do + token Str::Interpol + push :interpol + push :expr_start + end + rule %r/[^<{]+/ do + delegate @html + end + end + + state :element do + mixin :comments_and_whitespace + rule %r/\/>/ do + token Punctuation + pop! 2 + end + rule %r/>/, Punctuation, :pop! + rule %r/{/ do + token Str::Interpol + push :interpol + push :expr_start + end + rule %r/\w+/, Name::Attribute + rule %r/=/, Punctuation + rule %r/(["']).*?(\1)/, Str + end + + state :element_name do + rule %r/[A-Z]\w*/, Name::Class + rule %r/\w+/, Name::Tag + rule %r/\./, Punctuation + rule(//) { pop! } + end + + state :interpol do + rule %r/}/, Str::Interpol, :pop! + rule %r/{/ do + token Punctuation + push :interpol_inner + push :statement + end + mixin :root + end + + state :interpol_inner do + rule %r/}/ do + token Punctuation + goto :statement + end + mixin :root + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/julia.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/julia.rb new file mode 100644 index 000000000000..2820f330d177 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/julia.rb @@ -0,0 +1,292 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Julia < RegexLexer + title "Julia" + desc "The Julia programming language" + tag 'julia' + aliases 'jl' + filenames '*.jl' + mimetypes 'text/x-julia', 'application/x-julia' + + # Documentation: https://docs.julialang.org/en/v1/manual/variables/#Allowed-Variable-Names-1 + + def self.detect?(text) + return true if text.shebang? 'julia' + end + + BUILTINS = /\b(?: + true | false | missing | nothing + | Inf | Inf16 | Inf32 | Inf64 + | NaN | NaN16 | NaN32 | NaN64 + | stdout | stderr | stdin | devnull + | pi | π | ℯ | im + | ARGS | C_NULL | ENV | ENDIAN_BOM + | VERSION | undef | (LOAD|DEPOT)_PATH + )\b/x + + KEYWORDS = /\b(?: + function | return | module | import | export + | if | else | elseif | end | for + | in | isa | while | try | catch + | const | local | global | using | struct + | mutable struct | abstract type | finally + | begin | do | quote | macro | for outer + | where + )\b/x + + # NOTE: The list of types was generated automatically using the following script: + # using Pkg, InteractiveUtils + # + # allnames = [names(Core); names(Base, imported=true)] + # + # for stdlib in readdir(Pkg.Types.stdlib_dir()) + # mod = Symbol(basename(stdlib)) + # @eval begin + # using $mod + # append!(allnames, names($mod)) + # end + # end + # + # sort!(unique!(allnames)) + # + # i = 1 + # for sym in allnames + # global i # needed at the top level, e.g. in the REPL + # isdefined(Main, sym) || continue + # getfield(which(Main, sym), sym) isa Type || continue + # sym === :(=>) && continue # Actually an alias for Pair + # print("| ", sym) + # i % 3 == 0 ? println() : print(" ") # print 3 to a line + # i += 1 + # end + TYPES = /\b(?: + ARPACKException | AbstractArray | AbstractChannel + | AbstractChar | AbstractDict | AbstractDisplay + | AbstractFloat | AbstractIrrational | AbstractLogger + | AbstractMatrix | AbstractREPL | AbstractRNG + | AbstractRange | AbstractSerializer | AbstractSet + | AbstractSparseArray | AbstractSparseMatrix | AbstractSparseVector + | AbstractString | AbstractUnitRange | AbstractVecOrMat + | AbstractVector | AbstractWorkerPool | Adjoint + | Any | ArgumentError | Array + | AssertionError | Base64DecodePipe | Base64EncodePipe + | BasicREPL | Bidiagonal | BigFloat + | BigInt | BitArray | BitMatrix + | BitSet | BitVector | Bool + | BoundsError | BunchKaufman | CachingPool + | CapturedException | CartesianIndex | CartesianIndices + | Cchar | Cdouble | Cfloat + | Channel | Char | Cholesky + | CholeskyPivoted | Cint | Cintmax_t + | Clong | Clonglong | ClusterManager + | Cmd | Colon | Complex + | ComplexF16 | ComplexF32 | ComplexF64 + | CompositeException | Condition | ConsoleLogger + | Cptrdiff_t | Cshort | Csize_t + | Cssize_t | Cstring | Cuchar + | Cuint | Cuintmax_t | Culong + | Culonglong | Cushort | Cvoid + | Cwchar_t | Cwstring | DataType + | Date | DateFormat | DatePeriod + | DateTime | Day | DenseArray + | DenseMatrix | DenseVecOrMat | DenseVector + | Diagonal | Dict | DimensionMismatch + | Dims | DivideError | DomainError + | EOFError | Eigen | Enum + | ErrorException | Exception | ExponentialBackOff + | Expr | FDWatcher | Factorization + | FileMonitor | Float16 | Float32 + | Float64 | FolderMonitor | Function + | GeneralizedEigen | GeneralizedSVD | GeneralizedSchur + | GenericArray | GenericDict | GenericSet + | GenericString | GitConfig | GitRepo + | GlobalRef | HMAC_CTX | HTML + | Hermitian | Hessenberg | Hour + | IO | IOBuffer | IOContext + | IOStream | IPAddr | IPv4 + | IPv6 | IdDict | IndexCartesian + | IndexLinear | IndexStyle | InexactError + | InitError | Int | Int128 + | Int16 | Int32 | Int64 + | Int8 | Integer | InterruptException + | InvalidStateException | Irrational | KeyError + | LAPACKException | LDLt | LQ + | LU | LinRange | LineEditREPL + | LineNumberNode | LinearIndices | LoadError + | LogLevel | LowerTriangular | MIME + | Matrix | MersenneTwister | Method + | MethodError | Microsecond | Millisecond + | Minute | Missing | MissingException + | Module | Month | NTuple + | NamedTuple | Nanosecond | Nothing + | NullLogger | Number | OrdinalRange + | OutOfMemoryError | OverflowError | PackageMode + | PackageSpec | Pair | PartialQuickSort + | Period | PermutedDimsArray | Pipe + | PollingFileWatcher | PosDefException | ProcessExitedException + | Ptr | QR | QRPivoted + | QuoteNode | RandomDevice | RankDeficientException + | Rational | RawFD | ReadOnlyMemoryError + | Real | ReentrantLock | Ref + | Regex | RegexMatch | RemoteChannel + | RemoteException | RoundingMode | SHA1_CTX + | SHA224_CTX | SHA256_CTX | SHA2_224_CTX + | SHA2_256_CTX | SHA2_384_CTX | SHA2_512_CTX + | SHA384_CTX | SHA3_224_CTX | SHA3_256_CTX + | SHA3_384_CTX | SHA3_512_CTX | SHA512_CTX + | SVD | Schur | Second + | SegmentationFault | Serializer | Set + | SharedArray | SharedMatrix | SharedVector + | Signed | SimpleLogger | SingularException + | Some | SparseMatrixCSC | SparseVector + | StackOverflowError | StepRange | StepRangeLen + | StreamREPL | StridedArray | StridedMatrix + | StridedVecOrMat | StridedVector | String + | StringIndexError | SubArray | SubString + | SubstitutionString | SymTridiagonal | Symbol + | Symmetric | SystemError | TCPSocket + | Task | TestSetException | Text + | TextDisplay | Time | TimePeriod + | TimeType | TimeZone | Timer + | Transpose | Tridiagonal | Tuple + | Type | TypeError | TypeVar + | UDPSocket | UInt | UInt128 + | UInt16 | UInt32 | UInt64 + | UInt8 | UTC | UUID + | UndefInitializer | UndefKeywordError | UndefRefError + | UndefVarError | UniformScaling | Union + | UnionAll | UnitLowerTriangular | UnitRange + | UnitUpperTriangular | Unsigned | UpgradeLevel + | UpperTriangular | Val | Vararg + | VecElement | VecOrMat | Vector + | VersionNumber | WeakKeyDict | WeakRef + | Week | WorkerConfig | WorkerPool + | Year + )\b/x + + OPERATORS = / \+ | = | - | \* | \/ + | \\ | & | \| | \$ | ~ + | \^ | % | ! | >>> | >> + | << | && | \|\| | \+= | -= + | \*= | \/= | \\= | ÷= | %= + | \^= | &= | \|= | \$= | >>>= + | >>= | <<= | == | != | ≠ + | <= | ≤ | >= | ≥ | \. + | :: | <: | -> | \? | \.\* + | \.\^ | \.\\ | \.\/ | \\ | < + | > | ÷ | >: | : | === + | !== | => + /x + + PUNCTUATION = /[\[\]{}\(\),;]/ + + + state :root do + rule %r/\n/, Text + rule %r/[^\S\n]+/, Text + rule %r/#=/, Comment::Multiline, :blockcomment + rule %r/#.*$/, Comment + rule OPERATORS, Operator + rule %r/\\\n/, Text + rule %r/\\/, Text + + + # functions and macros + rule %r/(function|macro)((?:\s|\\\s)+)/ do + groups Keyword, Name::Function + push :funcname + end + + # types + rule %r/((?:mutable )?struct|(?:abstract|primitive) type)((?:\s|\\\s)+)/ do + groups Keyword, Name::Class + push :typename + end + rule TYPES, Keyword::Type + + # keywords + rule %r/(local|global|const)\b/, Keyword::Declaration + rule KEYWORDS, Keyword + + # TODO: end is a builtin when inside of an indexing expression + rule BUILTINS, Name::Builtin + + # TODO: symbols + + # backticks + rule %r/`.*?`/, Literal::String::Backtick + + # chars + rule %r/'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'/, Literal::String::Char + + # try to match trailing transpose + rule %r/(?<=[.\w)\]])\'+/, Operator + + # strings + # TODO: triple quoted string literals + # TODO: Detect string interpolation + rule %r/(?:[IL])"/, Literal::String, :string + rule %r/[E]?"/, Literal::String, :string + + # names + rule %r/@[\w.]+/, Name::Decorator + rule %r/(?:[a-zA-Z_\u00A1-\uffff]|[\u1000-\u10ff])(?:[a-zA-Z_0-9\u00A1-\uffff]|[\u1000-\u10ff])*!*/, Name + + rule PUNCTUATION, Other + + # numbers + rule %r/(\d+(_\d+)+\.\d*|\d*\.\d+(_\d+)+)([eEf][+-]?[0-9]+)?/, Literal::Number::Float + rule %r/(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?/, Literal::Number::Float + rule %r/\d+(_\d+)+[eEf][+-]?[0-9]+/, Literal::Number::Float + rule %r/\d+[eEf][+-]?[0-9]+/, Literal::Number::Float + rule %r/0b[01]+(_[01]+)+/, Literal::Number::Bin + rule %r/0b[01]+/, Literal::Number::Bin + rule %r/0o[0-7]+(_[0-7]+)+/, Literal::Number::Oct + rule %r/0o[0-7]+/, Literal::Number::Oct + rule %r/0x[a-fA-F0-9]+(_[a-fA-F0-9]+)+/, Literal::Number::Hex + rule %r/0x[a-fA-F0-9]+/, Literal::Number::Hex + rule %r/\d+(_\d+)+/, Literal::Number::Integer + rule %r/\d+/, Literal::Number::Integer + end + + + state :funcname do + rule %r/[\p{L}\p{Nl}\p{S}_][\p{Word}\p{S}\p{Po}!]*/, Name::Function, :pop! + rule %r/\([^\s\w{]{1,2}\)/, Operator, :pop! + rule %r/[^\s\w{]{1,2}/, Operator, :pop! + end + + state :typename do + rule %r/[\p{L}\p{Nl}\p{S}_][\p{Word}\p{S}\p{Po}!]*/, Name::Class, :pop! + end + + state :stringescape do + rule %r/\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})/, + Literal::String::Escape + end + + state :blockcomment do + rule %r/[^=#]/, Comment::Multiline + rule %r/#=/, Comment::Multiline, :blockcomment + rule %r/\=#/, Comment::Multiline, :pop! + rule %r/[=#]/, Comment::Multiline + end + + state :string do + mixin :stringescape + + rule %r/"/, Literal::String, :pop! + rule %r/\\\\|\\"|\\\n/, Literal::String::Escape # included here for raw strings + rule %r/\$(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?/, Literal::String::Interpol + rule %r/[^\\"$]+/, Literal::String + # quotes, dollar signs, and backslashes must be parsed one at a time + rule %r/["\\]/, Literal::String + # unhandled string formatting sign + rule %r/\$/, Literal::String + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/kotlin.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/kotlin.rb new file mode 100644 index 000000000000..b92c7de77e03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/kotlin.rb @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Kotlin < RegexLexer + # https://kotlinlang.org/docs/reference/grammar.html + + title "Kotlin" + desc "Kotlin Programming Language (http://kotlinlang.org)" + + tag 'kotlin' + filenames '*.kt', '*.kts' + mimetypes 'text/x-kotlin' + + keywords = %w( + abstract annotation as break by catch class companion const + constructor continue crossinline do dynamic else enum + external false final finally for fun get if import in infix + inline inner interface internal is lateinit noinline null + object open operator out override package private protected + public reified return sealed set super suspend tailrec this + throw true try typealias typeof val var vararg when where + while yield + ) + + name_chars = %r'[-_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}\p{Nd}\p{Pc}\p{Cf}\p{Mn}\p{Mc}]*' + + class_name = %r'`?[\p{Lu}]#{name_chars}`?' + name = %r'`?[_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}]#{name_chars}`?' + + state :root do + rule %r'\b(companion)(\s+)(object)\b' do + groups Keyword, Text, Keyword + end + rule %r'\b(class|data\s+class|interface|object)(\s+)' do + groups Keyword::Declaration, Text + push :class + end + rule %r'\b(fun)(\s+)' do + groups Keyword, Text + push :function + end + rule %r'\b(package|import)(\s+)' do + groups Keyword, Text + push :package + end + rule %r'\b(val|var)(\s+)(\()' do + groups Keyword::Declaration, Text, Punctuation + push :destructure + end + rule %r'\b(val|var)(\s+)' do + groups Keyword::Declaration, Text + push :property + end + rule %r'(return|continue|break|this|super)(@#{name})?\b' do + groups Keyword, Name::Decorator + end + rule %r'\bfun\b', Keyword + rule %r'\b(?:#{keywords.join('|')})\b', Keyword + rule %r'^\s*\[.*?\]', Name::Attribute + rule %r'[^\S\n]+', Text + rule %r'\\\n', Text # line continuation + rule %r'//.*?$', Comment::Single + rule %r'/[*].*[*]/', Comment::Multiline # single line block comment + rule %r'/[*].*', Comment::Multiline, :comment # multiline block comment + rule %r'\n', Text + rule %r'(::)(class)' do + groups Operator, Keyword + end + rule %r'::|!!|\?[:.]', Operator + rule %r"(\.\.)", Operator + # Number literals + decDigits = %r"([0-9][0-9_]*[0-9])|[0-9]" + exponent = %r"[eE][+-]?(#{decDigits})" + double = %r"((#{decDigits})?\.#{decDigits}(#{exponent})?)|(#{decDigits}#{exponent})" + rule %r"(#{double}[fF]?)|(#{decDigits}[fF])", Num::Float + rule %r"0[bB]([01][01_]*[01]|[01])[uU]?L?", Num::Bin + rule %r"0[xX]([0-9a-fA-F][0-9a-fA-F_]*[0-9a-fA-F]|[0-9a-fA-F])[uU]?L?", Num::Hex + rule %r"(([1-9][0-9_]*[0-9])|[0-9])[uU]?L?", Num::Integer + rule %r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation + rule %r'[{}]', Punctuation + rule %r'@"(""|[^"])*"'m, Str + rule %r'""".*?"""'m, Str + rule %r'"(\\\\|\\"|[^"\n])*["\n]'m, Str + rule %r"'\\.'|'[^\\]'", Str::Char + rule %r'(@#{class_name})', Name::Decorator + rule %r'(#{class_name})(<)' do + groups Name::Class, Punctuation + push :generic_parameters + end + rule class_name, Name::Class + rule %r'(#{name})(?=\s*[({])', Name::Function + rule %r'(#{name})@', Name::Decorator # label + rule name, Name + end + + state :package do + rule %r'\S+', Name::Namespace, :pop! + end + + state :class do + rule class_name, Name::Class, :pop! + end + + state :function do + rule %r'(<)', Punctuation, :generic_parameters + rule %r'(\s+)', Text + rule %r'(#{class_name})(\.)' do + groups Name::Class, Punctuation + end + rule name, Name::Function, :pop! + end + + state :generic_parameters do + rule class_name, Name::Class + rule %r'(<)', Punctuation, :generic_parameters + rule %r'(reified|out|in)', Keyword + rule %r'([,:])', Punctuation + rule %r'(\s+)', Text + rule %r'(>)', Punctuation, :pop! + end + + state :property do + rule name, Name::Property, :pop! + end + + state :destructure do + rule %r'(,)', Punctuation + rule %r'(\))', Punctuation, :pop! + rule %r'(\s+)', Text + rule name, Name::Property + end + + state :comment do + rule %r'/[*]', Comment::Multiline, :comment + rule %r'[*]/', Comment::Multiline, :pop! + rule %r'[^/*]+', Comment::Multiline + rule %r'[/*]', Comment::Multiline + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lasso.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lasso.rb new file mode 100644 index 000000000000..cad38e9ec224 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lasso.rb @@ -0,0 +1,214 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +require 'yaml' + +module Rouge + module Lexers + class Lasso < TemplateLexer + title "Lasso" + desc "The Lasso programming language (lassosoft.com)" + tag 'lasso' + aliases 'lassoscript' + filenames '*.lasso', '*.lasso[89]' + mimetypes 'text/x-lasso', 'text/html+lasso', 'application/x-httpd-lasso' + + option :start_inline, 'Whether to start inline instead of requiring <?lasso or [' + + def self.detect?(text) + return true if text.shebang?('lasso9') + return true if text =~ /\A.*?<\?(lasso(script)?|=)/ + end + + def initialize(*) + super + + @start_inline = bool_option(:start_inline) + end + + def start_inline? + @start_inline + end + + start do + push :lasso if start_inline? + end + + # self-modifying method that loads the keywords file + def self.keywords + Kernel::load File.join(Lexers::BASE_DIR, 'lasso/keywords.rb') + keywords + end + + id = /[a-z_][\w.]*/i + + state :root do + rule %r/^#![ \S]+lasso9\b/, Comment::Preproc, :lasso + rule(/(?=\[|<)/) { push :delimiters } + rule %r/\s+/, Text::Whitespace + rule(//) { push :delimiters; push :lassofile } + end + + state :delimiters do + rule %r/\[no_square_brackets\]/, Comment::Preproc, :nosquarebrackets + rule %r/\[noprocess\]/, Comment::Preproc, :noprocess + rule %r/\[/, Comment::Preproc, :squarebrackets + rule %r/<\?(lasso(script)?|=)/i, Comment::Preproc, :anglebrackets + rule(/([^\[<]|<!--.*?-->|<(script|style).*?\2>|<(?!\?(lasso(script)?|=)))+/im) { delegate parent } + end + + state :nosquarebrackets do + rule %r/\[noprocess\]/, Comment::Preproc, :noprocess + rule %r/<\?(lasso(script)?|=)/i, Comment::Preproc, :anglebrackets + rule(/([^\[<]|<!--.*?-->|<(script|style).*?\2>|<(?!\?(lasso(script)?|=))|\[(?!noprocess))+/im) { delegate parent } + end + + state :noprocess do + rule %r(\[/noprocess\]), Comment::Preproc, :pop! + rule(%r(([^\[]|\[(?!/noprocess))+)i) { delegate parent } + end + + state :squarebrackets do + rule %r/\]/, Comment::Preproc, :pop! + mixin :lasso + end + + state :anglebrackets do + rule %r/\?>/, Comment::Preproc, :pop! + mixin :lasso + end + + state :lassofile do + rule %r/\]|\?>/, Comment::Preproc, :pop! + mixin :lasso + end + + state :whitespacecomments do + rule %r/\s+/, Text + rule %r(//.*?\n), Comment::Single + rule %r(/\*\*!.*?\*/)m, Comment::Doc + rule %r(/\*.*?\*/)m, Comment::Multiline + end + + state :lasso do + mixin :whitespacecomments + + # literals + rule %r/\d*\.\d+(e[+-]?\d+)?/i, Num::Float + rule %r/0x[\da-f]+/i, Num::Hex + rule %r/\d+/, Num::Integer + rule %r/(infinity|NaN)\b/i, Num + rule %r/'[^'\\]*(\\.[^'\\]*)*'/m, Str::Single + rule %r/"[^"\\]*(\\.[^"\\]*)*"/m, Str::Double + rule %r/`[^`]*`/m, Str::Backtick + + # names + rule %r/\$#{id}/, Name::Variable + rule %r/#(#{id}|\d+\b)/, Name::Variable::Instance + rule %r/(\.\s*)('#{id}')/ do + groups Name::Builtin::Pseudo, Name::Variable::Class + end + rule %r/(self)(\s*->\s*)('#{id}')/i do + groups Name::Builtin::Pseudo, Operator, Name::Variable::Class + end + rule %r/(\.\.?\s*)(#{id}(=(?!=))?)/ do + groups Name::Builtin::Pseudo, Name::Other + end + rule %r/(->\\?\s*|&\s*)(#{id}(=(?!=))?)/ do + groups Operator, Name::Other + end + rule %r/(?<!->)(self|inherited|currentcapture|givenblock)\b/i, Name::Builtin::Pseudo + rule %r/-(?!infinity)#{id}/i, Name::Attribute + rule %r/::\s*#{id}/, Name::Label + + # definitions + rule %r/(define)(\s+)(#{id})(\s*=>\s*)(type|trait|thread)\b/i do + groups Keyword::Declaration, Text, Name::Class, Operator, Keyword + end + rule %r((define)(\s+)(#{id})(\s*->\s*)(#{id}=?|[-+*/%]))i do + groups Keyword::Declaration, Text, Name::Class, Operator, Name::Function + push :signature + end + rule %r/(define)(\s+)(#{id})/i do + groups Keyword::Declaration, Text, Name::Function + push :signature + end + rule %r((public|protected|private|provide)(\s+)((#{id}=?|[-+*/%])(?=\s*\()))i do + groups Keyword, Text, Name::Function + push :signature + end + rule %r/(public|protected|private|provide)(\s+)(#{id})/i do + groups Keyword, Text, Name::Function + end + + # keywords + rule %r/(true|false|none|minimal|full|all|void)\b/i, Keyword::Constant + rule %r/(local|var|variable|global|data(?=\s))\b/i, Keyword::Declaration + rule %r/(#{id})(\s+)(in)\b/i do + groups Name, Text, Keyword + end + rule %r/(let|into)(\s+)(#{id})/i do + groups Keyword, Text, Name + end + + # other + rule %r/,/, Punctuation, :commamember + rule %r/(and|or|not)\b/i, Operator::Word + rule %r/(#{id})(\s*::\s*#{id})?(\s*=(?!=|>))/ do + groups Name, Name::Label, Operator + end + + rule %r((/?)([\w.]+)) do |m| + name = m[2].downcase + + if m[1] != '' + token Punctuation, m[1] + end + + if name == 'namespace_using' + token Keyword::Namespace, m[2] + elsif self.class.keywords[:exceptions].include? name + token Name::Exception, m[2] + elsif self.class.keywords[:types].include? name + token Keyword::Type, m[2] + elsif self.class.keywords[:traits].include? name + token Name::Decorator, m[2] + elsif self.class.keywords[:keywords].include? name + token Keyword, m[2] + elsif self.class.keywords[:builtins].include? name + token Name::Builtin, m[2] + else + token Name::Other, m[2] + end + end + + rule %r/(=)(n?bw|n?ew|n?cn|lte?|gte?|n?eq|n?rx|ft)\b/i do + groups Operator, Operator::Word + end + rule %r(:=|[-+*/%=<>&|!?\\]+), Operator + rule %r/[{}():;,@^]/, Punctuation + end + + state :signature do + rule %r/\=>/, Operator, :pop! + rule %r/\)/, Punctuation, :pop! + rule %r/[(,]/, Punctuation, :parameter + mixin :lasso + end + + state :parameter do + rule %r/\)/, Punctuation, :pop! + rule %r/-?#{id}/, Name::Attribute, :pop! + rule %r/\.\.\./, Name::Builtin::Pseudo + mixin :lasso + end + + state :commamember do + rule %r((#{id}=?|[-+*/%])(?=\s*(\(([^()]*\([^()]*\))*[^\)]*\)\s*)?(::[\w.\s]+)?=>)), Name::Function, :signature + mixin :whitespacecomments + rule %r//, Text, :pop! + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lasso/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lasso/keywords.rb new file mode 100644 index 000000000000..250d9d1bf824 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lasso/keywords.rb @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# DO NOT EDIT +# This file is automatically generated by `rake builtins:lasso`. +# See tasks/builtins/lasso.rake for more info. + +module Rouge + module Lexers + def Lasso.keywords + @keywords ||= {}.tap do |h| + h[:types] = Set.new ["array", "date", "decimal", "duration", "integer", "map", "pair", "string", "tag", "xml", "null", "boolean", "bytes", "keyword", "list", "locale", "queue", "set", "stack", "staticarray", "atbegin", "bson_iter", "bson", "bytes_document_body", "cache_server_element", "cache_server", "capture", "client_address", "client_ip", "component_container", "component_render_state", "component", "curl", "curltoken", "currency", "custom", "data_document", "database_registry", "dateandtime", "dbgp_packet", "dbgp_server", "debugging_stack", "delve", "dir", "dirdesc", "dns_response", "document_base", "document_body", "document_header", "dsinfo", "eacher", "email_compose", "email_parse", "email_pop", "email_queue_impl_base", "email_queue_impl", "email_smtp", "email_stage_impl_base", "email_stage_impl", "fastcgi_each_fcgi_param", "fastcgi_server", "fcgi_record", "fcgi_request", "file", "filedesc", "filemaker_datasource", "generateforeachkeyed", "generateforeachunkeyed", "generateseries", "hash_map", "html_atomic_element", "html_attr", "html_base", "html_binary", "html_br", "html_cdata", "html_container_element", "html_div", "html_document_body", "html_document_head", "html_eol", "html_fieldset", "html_form", "html_h1", "html_h2", "html_h3", "html_h4", "html_h5", "html_h6", "html_hr", "html_img", "html_input", "html_json", "html_label", "html_legend", "html_link", "html_meta", "html_object", "html_option", "html_raw", "html_script", "html_select", "html_span", "html_style", "html_table", "html_td", "html_text", "html_th", "html_tr", "http_document_header", "http_document", "http_error", "http_header_field", "http_server_connection_handler_globals", "http_server_connection_handler", "http_server_request_logger_thread", "http_server_web_connection", "http_server", "image", "include_cache", "inline_type", "java_jnienv", "jbyte", "jbytearray", "jchar", "jchararray", "jfieldid", "jfloat", "jint", "jmethodid", "jobject", "jshort", "json_decode", "json_encode", "json_literal", "json_object", "lassoapp_compiledsrc_appsource", "lassoapp_compiledsrc_fileresource", "lassoapp_content_rep_halt", "lassoapp_dirsrc_appsource", "lassoapp_dirsrc_fileresource", "lassoapp_installer", "lassoapp_livesrc_appsource", "lassoapp_livesrc_fileresource", "lassoapp_long_expiring_bytes", "lassoapp_manualsrc_appsource", "lassoapp_zip_file_server", "lassoapp_zipsrc_appsource", "lassoapp_zipsrc_fileresource", "ldap", "library_thread_loader", "list_node", "log_impl_base", "log_impl", "magick_image", "map_node", "memberstream", "memory_session_driver_impl_entry", "memory_session_driver_impl", "memory_session_driver", "mime_reader", "mongo_client", "mongo_collection", "mongo_cursor", "mustache_ctx", "mysql_session_driver_impl", "mysql_session_driver", "net_named_pipe", "net_tcp_ssl", "net_tcp", "net_udp_packet", "net_udp", "odbc_session_driver_impl", "odbc_session_driver", "opaque", "os_process", "pair_compare", "pairup", "pdf_barcode", "pdf_chunk", "pdf_color", "pdf_doc", "pdf_font", "pdf_hyphenator", "pdf_image", "pdf_list", "pdf_paragraph", "pdf_phrase", "pdf_read", "pdf_table", "pdf_text", "pdf_typebase", "percent", "portal_impl", "queriable_groupby", "queriable_grouping", "queriable_groupjoin", "queriable_join", "queriable_orderby", "queriable_orderbydescending", "queriable_select", "queriable_selectmany", "queriable_skip", "queriable_take", "queriable_thenby", "queriable_thenbydescending", "queriable_where", "raw_document_body", "regexp", "repeat", "scientific", "security_registry", "serialization_element", "serialization_object_identity_compare", "serialization_reader", "serialization_writer_ref", "serialization_writer_standin", "serialization_writer", "session_delete_expired_thread", "signature", "sourcefile", "sqlite_column", "sqlite_currentrow", "sqlite_db", "sqlite_results", "sqlite_session_driver_impl_entry", "sqlite_session_driver_impl", "sqlite_session_driver", "sqlite_table", "sqlite3_stmt", "sqlite3", "sys_process", "text_document", "tie", "timeonly", "tree_base", "tree_node", "tree_nullnode", "ucal", "usgcpu", "usgvm", "web_error_atend", "web_node_base", "web_node_content_representation_css_specialized", "web_node_content_representation_html_specialized", "web_node_content_representation_js_specialized", "web_node_content_representation_xhr_container", "web_node_echo", "web_node_root", "web_request_impl", "web_request", "web_response_impl", "web_response", "web_router", "websocket_handler", "worker_pool", "xml_attr", "xml_cdatasection", "xml_characterdata", "xml_comment", "xml_document", "xml_documentfragment", "xml_documenttype", "xml_domimplementation", "xml_element", "xml_entity", "xml_entityreference", "xml_namednodemap_attr", "xml_namednodemap_ht", "xml_namednodemap", "xml_node", "xml_nodelist", "xml_notation", "xml_processinginstruction", "xml_text", "xmlstream", "zip_file_impl", "zip_file", "zip_impl", "zip"] + h[:traits] = Set.new ["any", "formattingbase", "html_attributed", "html_element_coreattrs", "html_element_eventsattrs", "html_element_i18nattrs", "lassoapp_capabilities", "lassoapp_resource", "lassoapp_source", "queriable_asstring", "session_driver", "trait_array", "trait_asstring", "trait_backcontractible", "trait_backended", "trait_backexpandable", "trait_close", "trait_contractible", "trait_decompose_assignment", "trait_doubleended", "trait_each_sub", "trait_encodeurl", "trait_endedfullymutable", "trait_expandable", "trait_file", "trait_finite", "trait_finiteforeach", "trait_foreach", "trait_foreachtextelement", "trait_frontcontractible", "trait_frontended", "trait_frontexpandable", "trait_fullymutable", "trait_generator", "trait_generatorcentric", "trait_hashable", "trait_json_serialize", "trait_keyed", "trait_keyedfinite", "trait_keyedforeach", "trait_keyedmutable", "trait_list", "trait_map", "trait_net", "trait_pathcomponents", "trait_positionallykeyed", "trait_positionallysearchable", "trait_queriable", "trait_queriablelambda", "trait_readbytes", "trait_readstring", "trait_scalar", "trait_searchable", "trait_serializable", "trait_setencoding", "trait_setoperations", "trait_stack", "trait_treenode", "trait_writebytes", "trait_writestring", "trait_xml_elementcompat", "trait_xml_nodecompat", "web_connection", "web_node_container", "web_node_content_css_specialized", "web_node_content_document", "web_node_content_html_specialized", "web_node_content_js_specialized", "web_node_content_json_specialized", "web_node_content_representation", "web_node_content", "web_node_postable", "web_node"] + h[:builtins] = Set.new ["__char", "__sync_timestamp__", "_admin_addgroup", "_admin_adduser", "_admin_defaultconnector", "_admin_defaultconnectornames", "_admin_defaultdatabase", "_admin_defaultfield", "_admin_defaultgroup", "_admin_defaulthost", "_admin_defaulttable", "_admin_defaultuser", "_admin_deleteconnector", "_admin_deletedatabase", "_admin_deletefield", "_admin_deletegroup", "_admin_deletehost", "_admin_deletetable", "_admin_deleteuser", "_admin_duplicategroup", "_admin_internaldatabase", "_admin_listconnectors", "_admin_listdatabases", "_admin_listfields", "_admin_listgroups", "_admin_listhosts", "_admin_listtables", "_admin_listusers", "_admin_refreshconnector", "_admin_refreshsecurity", "_admin_servicepath", "_admin_updateconnector", "_admin_updatedatabase", "_admin_updatefield", "_admin_updategroup", "_admin_updatehost", "_admin_updatetable", "_admin_updateuser", "_chartfx_activation_string", "_chartfx_getchallengestring", "_chop_args", "_chop_mimes", "_client_addr_old", "_client_address_old", "_client_ip_old", "_database_names", "_datasource_reload", "_date_current", "_date_format", "_date_msec", "_date_parse", "_execution_timelimit", "_file_chmod", "_initialize", "_jdbc_acceptsurl", "_jdbc_debug", "_jdbc_deletehost", "_jdbc_driverclasses", "_jdbc_driverinfo", "_jdbc_metainfo", "_jdbc_propertyinfo", "_jdbc_setdriver", "_lasso_param", "_log_helper", "_proc_noparam", "_proc_withparam", "_recursion_limit", "_request_param", "_security_binaryexpiration", "_security_flushcaches", "_security_isserialized", "_security_serialexpiration", "_srand", "_strict_literals", "_substring", "_xmlrpc_exconverter", "_xmlrpc_inconverter", "_xmlrpc_xmlinconverter", "action_addinfo", "action_addrecord", "action_setfoundcount", "action_setrecordid", "action_settotalcount", "admin_allowedfileroots", "admin_changeuser", "admin_createuser", "admin_groupassignuser", "admin_grouplistusers", "admin_groupremoveuser", "admin_listgroups", "admin_refreshlicensing", "admin_refreshsecurity", "admin_reloaddatasource", "admin_userlistgroups", "array_iterator", "auth_auth", "auth", "base64", "bean", "bigint", "cache_delete", "cache_empty", "cache_exists", "cache_fetch", "cache_internal", "cache_maintenance", "cache_object", "cache_preferences", "cache_store", "chartfx_records", "chartfx_serve", "chartfx", "choice_list", "choice_listitem", "choicelistitem", "click_text", "client_ipfrominteger", "compare_beginswith", "compare_contains", "compare_endswith", "compare_equalto", "compare_greaterthan", "compare_greaterthanorequals", "compare_greaterthanorequls", "compare_lessthan", "compare_lessthanorequals", "compare_notbeginswith", "compare_notcontains", "compare_notendswith", "compare_notequalto", "compare_notregexp", "compare_regexp", "compare_strictequalto", "compare_strictnotequalto", "compiler_removecacheddoc", "compiler_setdefaultparserflags", "curl_ftp_getfile", "curl_ftp_getlisting", "curl_ftp_putfile", "curl_include_url", "database_changecolumn", "database_changefield", "database_createcolumn", "database_createfield", "database_createtable", "database_fmcontainer", "database_hostinfo", "database_inline", "database_nameitem", "database_realname", "database_removecolumn", "database_removefield", "database_removetable", "database_repeating_valueitem", "database_repeating", "database_repeatingvalueitem", "database_schemanameitem", "database_tablecolumn", "database_tablenameitem", "datasource_name", "datasource_register", "date__date_current", "date__date_format", "date__date_msec", "date__date_parse", "date_add", "date_date", "date_difference", "date_duration", "date_format", "date_getcurrentdate", "date_getday", "date_getdayofweek", "date_gethour", "date_getlocaltimezone", "date_getminute", "date_getmonth", "date_getsecond", "date_gettime", "date_getyear", "date_gmttolocal", "date_localtogmt", "date_maximum", "date_minimum", "date_msec", "date_setformat", "date_subtract", "db_layoutnameitem", "db_layoutnames", "db_nameitem", "db_names", "db_tablenameitem", "db_tablenames", "dbi_column_names", "dbi_field_names", "decimal_setglobaldefaultprecision", "decode_base64", "decode_bheader", "decode_hex", "decode_html", "decode_json", "decode_qheader", "decode_quotedprintable", "decode_quotedprintablebytes", "decode_url", "decode_xml", "decrypt_blowfish2", "default", "define_constant", "define_prototype", "define_tagp", "define_typep", "deserialize", "directory_directorynameitem", "directory_lister", "directory_nameitem", "directorynameitem", "email_mxerror", "encode_base64", "encode_bheader", "encode_break", "encode_breaks", "encode_crc32", "encode_hex", "encode_html", "encode_htmltoxml", "encode_json", "encode_quotedprintable", "encode_quotedprintablebytes", "encode_smart", "encode_sql", "encode_sql92", "encode_stricturl", "encode_url", "encode_xml", "encrypt_blowfish2", "error_currenterror", "error_norecordsfound", "error_seterrorcode", "error_seterrormessage", "euro", "event_schedule", "file_autoresolvefullpaths", "file_chmod", "file_control", "file_copy", "file_create", "file_creationdate", "file_currenterror", "file_delete", "file_exists", "file_getlinecount", "file_getsize", "file_isdirectory", "file_listdirectory", "file_moddate", "file_move", "file_openread", "file_openreadwrite", "file_openwrite", "file_openwriteappend", "file_openwritetruncate", "file_probeeol", "file_processuploads", "file_read", "file_readline", "file_rename", "file_serve", "file_setsize", "file_stream", "file_streamcopy", "file_uploads", "file_waitread", "file_waittimeout", "file_waitwrite", "file_write", "find_soap_ops", "form_param", "global_defined", "global_remove", "global_reset", "globals", "http_getfile", "ical_alarm", "ical_attribute", "ical_calendar", "ical_daylight", "ical_event", "ical_freebusy", "ical_item", "ical_journal", "ical_parse", "ical_standard", "ical_timezone", "ical_todo", "image_url", "img", "include_cgi", "iterator", "java_bean", "java", "json_records", "lasso_comment", "lasso_datasourceis", "lasso_datasourceis4d", "lasso_datasourceisfilemaker", "lasso_datasourceisfilemaker7", "lasso_datasourceisfilemaker9", "lasso_datasourceisfilemakersa", "lasso_datasourceisjdbc", "lasso_datasourceislassomysql", "lasso_datasourceismysql", "lasso_datasourceisodbc", "lasso_datasourceisopenbase", "lasso_datasourceisoracle", "lasso_datasourceispostgresql", "lasso_datasourceisspotlight", "lasso_datasourceissqlite", "lasso_datasourceissqlserver", "lasso_datasourcemodulename", "lasso_datatype", "lasso_disableondemand", "lasso_parser", "lasso_process", "lasso_sessionid", "lasso_siteid", "lasso_siteisrunning", "lasso_sitename", "lasso_siterestart", "lasso_sitestart", "lasso_sitestop", "lasso_tagmodulename", "lasso_updatecheck", "lasso_uptime", "lassoapp_create", "lassoapp_dump", "lassoapp_flattendir", "lassoapp_getappdata", "lassoapp_list", "lassoapp_process", "lassoapp_unitize", "ldml_ldml", "ldml", "link_currentactionparams", "link_currentactionurl", "link_currentgroupparams", "link_currentgroupurl", "link_currentrecordparams", "link_currentrecordurl", "link_currentsearch", "link_currentsearchparams", "link_currentsearchurl", "link_detailparams", "link_detailurl", "link_firstgroupparams", "link_firstgroupurl", "link_firstrecordparams", "link_firstrecordurl", "link_lastgroupparams", "link_lastgroupurl", "link_lastrecordparams", "link_lastrecordurl", "link_nextgroupparams", "link_nextgroupurl", "link_nextrecordparams", "link_nextrecordurl", "link_params", "link_prevgroupparams", "link_prevgroupurl", "link_prevrecordparams", "link_prevrecordurl", "link_setformat", "link_url", "list_additem", "list_fromlist", "list_fromstring", "list_getitem", "list_itemcount", "list_iterator", "list_removeitem", "list_replaceitem", "list_reverseiterator", "list_tostring", "literal", "ljax_end", "ljax_hastarget", "ljax_include", "ljax_start", "local_defined", "local_remove", "local_reset", "locals", "logicalop_value", "logicaloperator_value", "map_iterator", "match_comparator", "match_notrange", "match_notregexp", "match_range", "match_regexp", "math_abs", "math_acos", "math_add", "math_asin", "math_atan", "math_atan2", "math_ceil", "math_converteuro", "math_cos", "math_div", "math_exp", "math_floor", "math_internal_rand", "math_internal_randmax", "math_internal_srand", "math_ln", "math_log", "math_log10", "math_max", "math_min", "math_mod", "math_mult", "math_pow", "math_random", "math_range", "math_rint", "math_roman", "math_round", "math_sin", "math_sqrt", "math_sub", "math_tan", "mime_type", "misc__srand", "misc_randomnumber", "misc_roman", "misc_valid_creditcard", "named_param", "namespace_current", "namespace_delimiter", "namespace_exists", "namespace_file_fullpathexists", "namespace_load", "namespace_page", "namespace_unload", "net", "no_default_output", "object", "once", "oneoff", "op_logicalvalue", "operator_logicalvalue", "option", "postcondition", "precondition", "prettyprintingnsmap", "prettyprintingtypemap", "priorityqueue", "proc_convert", "proc_convertbody", "proc_convertone", "proc_extract", "proc_extractone", "proc_find", "proc_first", "proc_foreach", "proc_get", "proc_join", "proc_lasso", "proc_last", "proc_map_entry", "proc_null", "proc_regexp", "proc_xml", "proc_xslt", "rand", "randomnumber", "raw", "recid_value", "record_count", "recordcount", "recordid_value", "reference", "repeating_valueitem", "repeatingvalueitem", "repetition", "req_column", "req_field", "required_column", "required_field", "response_fileexists", "reverseiterator", "roman", "row_count", "search_columnitem", "search_fielditem", "search_operatoritem", "search_opitem", "search_valueitem", "searchfielditem", "searchoperatoritem", "searchopitem", "searchvalueitem", "serialize", "server_date", "server_day", "server_siteisrunning", "server_sitestart", "server_sitestop", "server_time", "session_addoutputfilter", "session_addvariable", "session_removevariable", "session_setdriver", "set_iterator", "set_reverseiterator", "site_atbegin", "site_restart", "soap_convertpartstopairs", "soap_info", "soap_stub", "sort_columnitem", "sort_fielditem", "sort_orderitem", "sortcolumnitem", "sortfielditem", "sortorderitem", "srand", "stock_quote", "string_charfromname", "string_concatenate", "string_countfields", "string_endswith", "string_extract", "string_findposition", "string_findregexp", "string_fordigit", "string_getfield", "string_getunicodeversion", "string_insert", "string_isalpha", "string_isalphanumeric", "string_isdigit", "string_ishexdigit", "string_islower", "string_isnumeric", "string_ispunctuation", "string_isspace", "string_isupper", "string_length", "string_lowercase", "string_remove", "string_removeleading", "string_removetrailing", "string_replace", "string_replaceregexp", "string_todecimal", "string_tointeger", "string_uppercase", "table_realname", "tags_find", "tags_list", "tags", "tcp_close", "tcp_open", "tcp_send", "tcp_tcp_close", "tcp_tcp_open", "tcp_tcp_send", "thread_abort", "thread_event", "thread_exists", "thread_getcurrentid", "thread_getpriority", "thread_info", "thread_list", "thread_lock", "thread_pipe", "thread_priority_default", "thread_priority_high", "thread_priority_low", "thread_rwlock", "thread_semaphore", "thread_setpriority", "total_records", "treemap_iterator", "url_rewrite", "valid_creditcard", "valid_date", "valid_email", "valid_url", "var_defined", "var_remove", "var_reset", "var_set", "variable_defined", "variable_set", "variables", "variant_count", "vars", "wsdl_extract", "wsdl_getbinding", "wsdl_getbindingforoperation", "wsdl_getbindingoperations", "wsdl_getmessagenamed", "wsdl_getmessageparts", "wsdl_getmessagetriofromporttype", "wsdl_getopbodystyle", "wsdl_getopbodyuse", "wsdl_getoperation", "wsdl_getoplocation", "wsdl_getopmessagetypes", "wsdl_getopsoapaction", "wsdl_getportaddress", "wsdl_getportsforservice", "wsdl_getporttype", "wsdl_getporttypeoperation", "wsdl_getservicedocumentation", "wsdl_getservices", "wsdl_gettargetnamespace", "wsdl_issoapoperation", "wsdl_listoperations", "wsdl_maketest", "xml_extract", "xml_rpc", "xml_rpccall", "xml_rw", "xml_serve", "xml_xml", "xml_xmlstream", "xsd_attribute", "xsd_blankarraybase", "xsd_blankbase", "xsd_buildtype", "xsd_cache", "xsd_checkcardinality", "xsd_continueall", "xsd_continueannotation", "xsd_continueany", "xsd_continueanyattribute", "xsd_continueattribute", "xsd_continueattributegroup", "xsd_continuechoice", "xsd_continuecomplexcontent", "xsd_continuecomplextype", "xsd_continuedocumentation", "xsd_continueextension", "xsd_continuegroup", "xsd_continuekey", "xsd_continuelist", "xsd_continuerestriction", "xsd_continuesequence", "xsd_continuesimplecontent", "xsd_continuesimpletype", "xsd_continueunion", "xsd_deserialize", "xsd_fullyqualifyname", "xsd_generate", "xsd_generateblankfromtype", "xsd_generateblanksimpletype", "xsd_generatetype", "xsd_getschematype", "xsd_issimpletype", "xsd_loadschema", "xsd_lookupnamespaceuri", "xsd_lookuptype", "xsd_processany", "xsd_processattribute", "xsd_processattributegroup", "xsd_processcomplextype", "xsd_processelement", "xsd_processgroup", "xsd_processimport", "xsd_processinclude", "xsd_processschema", "xsd_processsimpletype", "xsd_ref", "xsd_type", "_ffi", "abort_clear", "abort_now", "action_param", "action_params", "action_statement", "admin_authorization", "admin_currentgroups", "admin_currentuserid", "admin_currentusername", "admin_getpref", "admin_initialize", "admin_lassoservicepath", "admin_removepref", "admin_setpref", "admin_userexists", "auth_admin", "auth_check", "auth_custom", "auth_group", "auth_prompt", "auth_user", "bom_utf16be", "bom_utf16le", "bom_utf32be", "bom_utf32le", "bom_utf8", "capture_nearestloopabort", "capture_nearestloopcontinue", "capture_nearestloopcount", "checked", "cipher_decrypt_private", "cipher_decrypt_public", "cipher_decrypt", "cipher_digest", "cipher_encrypt_private", "cipher_encrypt_public", "cipher_encrypt", "cipher_generate_key", "cipher_hmac", "cipher_keylength", "cipher_list", "cipher_open", "cipher_seal", "cipher_sign", "cipher_verify", "client_addr", "client_authorization", "client_browser", "client_contentlength", "client_contenttype", "client_cookielist", "client_cookies", "client_encoding", "client_formmethod", "client_getargs", "client_getparam", "client_getparams", "client_headers", "client_integertoip", "client_iptointeger", "client_password", "client_postargs", "client_postparam", "client_postparams", "client_type", "client_url", "client_username", "column_name", "column_names", "column_type", "column", "compress", "content_addheader", "content_body", "content_encoding", "content_header", "content_replaceheader", "content_type", "cookie_set", "cookie", "curl_easy_cleanup", "curl_easy_duphandle", "curl_easy_getinfo", "curl_easy_init", "curl_easy_reset", "curl_easy_setopt", "curl_easy_strerror", "curl_getdate", "curl_http_version_1_0", "curl_http_version_1_1", "curl_http_version_none", "curl_ipresolve_v4", "curl_ipresolve_v6", "curl_ipresolve_whatever", "curl_multi_perform", "curl_multi_result", "curl_netrc_ignored", "curl_netrc_optional", "curl_netrc_required", "curl_sslversion_default", "curl_sslversion_sslv2", "curl_sslversion_sslv3", "curl_sslversion_tlsv1", "curl_version_asynchdns", "curl_version_debug", "curl_version_gssnegotiate", "curl_version_idn", "curl_version_info", "curl_version_ipv6", "curl_version_kerberos4", "curl_version_largefile", "curl_version_libz", "curl_version_ntlm", "curl_version_spnego", "curl_version_ssl", "curl_version", "curlauth_any", "curlauth_anysafe", "curlauth_basic", "curlauth_digest", "curlauth_gssnegotiate", "curlauth_none", "curlauth_ntlm", "curle_aborted_by_callback", "curle_bad_calling_order", "curle_bad_content_encoding", "curle_bad_download_resume", "curle_bad_function_argument", "curle_bad_password_entered", "curle_couldnt_connect", "curle_couldnt_resolve_host", "curle_couldnt_resolve_proxy", "curle_failed_init", "curle_file_couldnt_read_file", "curle_filesize_exceeded", "curle_ftp_access_denied", "curle_ftp_cant_get_host", "curle_ftp_cant_reconnect", "curle_ftp_couldnt_get_size", "curle_ftp_couldnt_retr_file", "curle_ftp_couldnt_set_ascii", "curle_ftp_couldnt_set_binary", "curle_ftp_couldnt_use_rest", "curle_ftp_port_failed", "curle_ftp_quote_error", "curle_ftp_ssl_failed", "curle_ftp_user_password_incorrect", "curle_ftp_weird_227_format", "curle_ftp_weird_pass_reply", "curle_ftp_weird_pasv_reply", "curle_ftp_weird_server_reply", "curle_ftp_weird_user_reply", "curle_ftp_write_error", "curle_function_not_found", "curle_got_nothing", "curle_http_post_error", "curle_http_range_error", "curle_http_returned_error", "curle_interface_failed", "curle_ldap_cannot_bind", "curle_ldap_invalid_url", "curle_ldap_search_failed", "curle_library_not_found", "curle_login_denied", "curle_malformat_user", "curle_obsolete", "curle_ok", "curle_operation_timeouted", "curle_out_of_memory", "curle_partial_file", "curle_read_error", "curle_recv_error", "curle_send_error", "curle_send_fail_rewind", "curle_share_in_use", "curle_ssl_cacert", "curle_ssl_certproblem", "curle_ssl_cipher", "curle_ssl_connect_error", "curle_ssl_engine_initfailed", "curle_ssl_engine_notfound", "curle_ssl_engine_setfailed", "curle_ssl_peer_certificate", "curle_telnet_option_syntax", "curle_too_many_redirects", "curle_unknown_telnet_option", "curle_unsupported_protocol", "curle_url_malformat_user", "curle_url_malformat", "curle_write_error", "curlftpauth_default", "curlftpauth_ssl", "curlftpauth_tls", "curlftpssl_all", "curlftpssl_control", "curlftpssl_last", "curlftpssl_none", "curlftpssl_try", "curlinfo_connect_time", "curlinfo_content_length_download", "curlinfo_content_length_upload", "curlinfo_content_type", "curlinfo_effective_url", "curlinfo_filetime", "curlinfo_header_size", "curlinfo_http_connectcode", "curlinfo_httpauth_avail", "curlinfo_namelookup_time", "curlinfo_num_connects", "curlinfo_os_errno", "curlinfo_pretransfer_time", "curlinfo_proxyauth_avail", "curlinfo_redirect_count", "curlinfo_redirect_time", "curlinfo_request_size", "curlinfo_response_code", "curlinfo_size_download", "curlinfo_size_upload", "curlinfo_speed_download", "curlinfo_speed_upload", "curlinfo_ssl_engines", "curlinfo_ssl_verifyresult", "curlinfo_starttransfer_time", "curlinfo_total_time", "curlmsg_done", "curlopt_autoreferer", "curlopt_buffersize", "curlopt_cainfo", "curlopt_capath", "curlopt_connecttimeout", "curlopt_cookie", "curlopt_cookiefile", "curlopt_cookiejar", "curlopt_cookiesession", "curlopt_crlf", "curlopt_customrequest", "curlopt_dns_use_global_cache", "curlopt_egdsocket", "curlopt_encoding", "curlopt_failonerror", "curlopt_filetime", "curlopt_followlocation", "curlopt_forbid_reuse", "curlopt_fresh_connect", "curlopt_ftp_account", "curlopt_ftp_create_missing_dirs", "curlopt_ftp_response_timeout", "curlopt_ftp_ssl", "curlopt_ftp_use_eprt", "curlopt_ftp_use_epsv", "curlopt_ftpappend", "curlopt_ftplistonly", "curlopt_ftpport", "curlopt_ftpsslauth", "curlopt_header", "curlopt_http_version", "curlopt_http200aliases", "curlopt_httpauth", "curlopt_httpget", "curlopt_httpheader", "curlopt_httppost", "curlopt_httpproxytunnel", "curlopt_infilesize_large", "curlopt_infilesize", "curlopt_interface", "curlopt_ipresolve", "curlopt_krb4level", "curlopt_low_speed_limit", "curlopt_low_speed_time", "curlopt_mail_from", "curlopt_mail_rcpt", "curlopt_maxconnects", "curlopt_maxfilesize_large", "curlopt_maxfilesize", "curlopt_maxredirs", "curlopt_netrc_file", "curlopt_netrc", "curlopt_nobody", "curlopt_noprogress", "curlopt_port", "curlopt_post", "curlopt_postfields", "curlopt_postfieldsize_large", "curlopt_postfieldsize", "curlopt_postquote", "curlopt_prequote", "curlopt_proxy", "curlopt_proxyauth", "curlopt_proxyport", "curlopt_proxytype", "curlopt_proxyuserpwd", "curlopt_put", "curlopt_quote", "curlopt_random_file", "curlopt_range", "curlopt_readdata", "curlopt_referer", "curlopt_resume_from_large", "curlopt_resume_from", "curlopt_ssl_cipher_list", "curlopt_ssl_verifyhost", "curlopt_ssl_verifypeer", "curlopt_sslcert", "curlopt_sslcerttype", "curlopt_sslengine_default", "curlopt_sslengine", "curlopt_sslkey", "curlopt_sslkeypasswd", "curlopt_sslkeytype", "curlopt_sslversion", "curlopt_tcp_nodelay", "curlopt_timecondition", "curlopt_timeout", "curlopt_timevalue", "curlopt_transfertext", "curlopt_unrestricted_auth", "curlopt_upload", "curlopt_url", "curlopt_use_ssl", "curlopt_useragent", "curlopt_userpwd", "curlopt_verbose", "curlopt_writedata", "curlproxy_http", "curlproxy_socks4", "curlproxy_socks5", "database_adddefaultsqlitehost", "database_database", "database_initialize", "database_name", "database_qs", "database_table_database_tables", "database_table_datasource_databases", "database_table_datasource_hosts", "database_table_datasources", "database_table_table_fields", "database_util_cleanpath", "dbgp_stop_stack_name", "debugging_break", "debugging_breakpoint_get", "debugging_breakpoint_list", "debugging_breakpoint_remove", "debugging_breakpoint_set", "debugging_breakpoint_update", "debugging_context_locals", "debugging_context_self", "debugging_context_vars", "debugging_detach", "debugging_enabled", "debugging_get_context", "debugging_get_stack", "debugging_run", "debugging_step_in", "debugging_step_out", "debugging_step_over", "debugging_stop", "debugging_terminate", "decimal_random", "decompress", "decrypt_blowfish", "define_atbegin", "define_atend", "dns_default", "dns_lookup", "document", "email_attachment_mime_type", "email_digestchallenge", "email_digestresponse", "email_extract", "email_findemails", "email_fix_address_list", "email_fix_address", "email_fs_error_clean", "email_immediate", "email_initialize", "email_merge", "email_mxlookup", "email_pop_priv_extract", "email_pop_priv_quote", "email_pop_priv_substring", "email_queue", "email_result", "email_safeemail", "email_send", "email_status", "email_token", "email_translatebreakstocrlf", "encode_qheader", "encoding_iso88591", "encoding_utf8", "encrypt_blowfish", "encrypt_crammd5", "encrypt_hmac", "encrypt_md5", "eol", "error_code", "error_msg", "error_obj", "error_pop", "error_push", "error_reset", "error_stack", "escape_tag", "evdns_resolve_ipv4", "evdns_resolve_ipv6", "evdns_resolve_reverse_ipv6", "evdns_resolve_reverse", "fail_now", "failure_clear", "fastcgi_createfcgirequest", "fastcgi_handlecon", "fastcgi_handlereq", "fastcgi_initialize", "fastcgi_initiate_request", "fcgi_abort_request", "fcgi_authorize", "fcgi_begin_request", "fcgi_bodychunksize", "fcgi_cant_mpx_conn", "fcgi_data", "fcgi_end_request", "fcgi_filter", "fcgi_get_values_result", "fcgi_get_values", "fcgi_keep_conn", "fcgi_makeendrequestbody", "fcgi_makestdoutbody", "fcgi_max_conns", "fcgi_max_reqs", "fcgi_mpxs_conns", "fcgi_null_request_id", "fcgi_overloaded", "fcgi_params", "fcgi_read_timeout_seconds", "fcgi_readparam", "fcgi_request_complete", "fcgi_responder", "fcgi_stderr", "fcgi_stdin", "fcgi_stdout", "fcgi_unknown_role", "fcgi_unknown_type", "fcgi_version_1", "fcgi_x_stdin", "field_name", "field_names", "field", "file_copybuffersize", "file_defaultencoding", "file_forceroot", "file_modechar", "file_modeline", "file_stderr", "file_stdin", "file_stdout", "file_tempfile", "filemakerds_initialize", "filemakerds", "found_count", "ftp_deletefile", "ftp_getdata", "ftp_getfile", "ftp_getlisting", "ftp_putdata", "ftp_putfile", "generateforeach", "hash_primes", "http_char_colon", "http_char_cr", "http_char_htab", "http_char_lf", "http_char_question", "http_char_space", "http_default_files", "http_read_headers", "http_read_timeout_secs", "http_server_apps_path", "http_server_request_logger", "include_cache_compare", "include_currentpath", "include_filepath", "include_localpath", "include_once", "include_path", "include_raw", "include_url", "include", "includes", "inline_colinfo_name_pos", "inline_colinfo_type_pos", "inline_colinfo_valuelist_pos", "inline_columninfo_pos", "inline_foundcount_pos", "inline_namedget", "inline_namedput", "inline_resultrows_pos", "inline_scopeget", "inline_scopepop", "inline_scopepush", "integer_bitor", "integer_random", "io_dir_dt_blk", "io_dir_dt_chr", "io_dir_dt_dir", "io_dir_dt_fifo", "io_dir_dt_lnk", "io_dir_dt_reg", "io_dir_dt_sock", "io_dir_dt_unknown", "io_dir_dt_wht", "io_file_access", "io_file_chdir", "io_file_chmod", "io_file_chown", "io_file_dirname", "io_file_f_dupfd", "io_file_f_getfd", "io_file_f_getfl", "io_file_f_getlk", "io_file_f_rdlck", "io_file_f_setfd", "io_file_f_setfl", "io_file_f_setlk", "io_file_f_setlkw", "io_file_f_test", "io_file_f_tlock", "io_file_f_ulock", "io_file_f_unlck", "io_file_f_wrlck", "io_file_fd_cloexec", "io_file_fioasync", "io_file_fioclex", "io_file_fiodtype", "io_file_fiogetown", "io_file_fionbio", "io_file_fionclex", "io_file_fionread", "io_file_fiosetown", "io_file_getcwd", "io_file_lchown", "io_file_link", "io_file_lockf", "io_file_lstat_atime", "io_file_lstat_mode", "io_file_lstat_mtime", "io_file_lstat_size", "io_file_mkdir", "io_file_mkfifo", "io_file_mkstemp", "io_file_o_append", "io_file_o_async", "io_file_o_creat", "io_file_o_excl", "io_file_o_exlock", "io_file_o_fsync", "io_file_o_nofollow", "io_file_o_nonblock", "io_file_o_rdonly", "io_file_o_rdwr", "io_file_o_shlock", "io_file_o_sync", "io_file_o_trunc", "io_file_o_wronly", "io_file_pipe", "io_file_readlink", "io_file_realpath", "io_file_remove", "io_file_rename", "io_file_rmdir", "io_file_s_ifblk", "io_file_s_ifchr", "io_file_s_ifdir", "io_file_s_ififo", "io_file_s_iflnk", "io_file_s_ifmt", "io_file_s_ifreg", "io_file_s_ifsock", "io_file_s_irgrp", "io_file_s_iroth", "io_file_s_irusr", "io_file_s_irwxg", "io_file_s_irwxo", "io_file_s_irwxu", "io_file_s_isgid", "io_file_s_isuid", "io_file_s_isvtx", "io_file_s_iwgrp", "io_file_s_iwoth", "io_file_s_iwusr", "io_file_s_ixgrp", "io_file_s_ixoth", "io_file_s_ixusr", "io_file_seek_cur", "io_file_seek_end", "io_file_seek_set", "io_file_stat_atime", "io_file_stat_mode", "io_file_stat_mtime", "io_file_stat_size", "io_file_stderr", "io_file_stdin", "io_file_stdout", "io_file_symlink", "io_file_tempnam", "io_file_truncate", "io_file_umask", "io_file_unlink", "io_net_accept", "io_net_af_inet", "io_net_af_inet6", "io_net_af_unix", "io_net_bind", "io_net_connect", "io_net_getpeername", "io_net_getsockname", "io_net_ipproto_ip", "io_net_ipproto_udp", "io_net_listen", "io_net_msg_oob", "io_net_msg_peek", "io_net_msg_waitall", "io_net_recv", "io_net_recvfrom", "io_net_send", "io_net_sendto", "io_net_shut_rd", "io_net_shut_rdwr", "io_net_shut_wr", "io_net_shutdown", "io_net_so_acceptconn", "io_net_so_broadcast", "io_net_so_debug", "io_net_so_dontroute", "io_net_so_error", "io_net_so_keepalive", "io_net_so_linger", "io_net_so_oobinline", "io_net_so_rcvbuf", "io_net_so_rcvlowat", "io_net_so_rcvtimeo", "io_net_so_reuseaddr", "io_net_so_sndbuf", "io_net_so_sndlowat", "io_net_so_sndtimeo", "io_net_so_timestamp", "io_net_so_type", "io_net_so_useloopback", "io_net_sock_dgram", "io_net_sock_raw", "io_net_sock_rdm", "io_net_sock_seqpacket", "io_net_sock_stream", "io_net_socket", "io_net_sol_socket", "io_net_ssl_accept", "io_net_ssl_begin", "io_net_ssl_connect", "io_net_ssl_end", "io_net_ssl_error", "io_net_ssl_errorstring", "io_net_ssl_funcerrorstring", "io_net_ssl_liberrorstring", "io_net_ssl_read", "io_net_ssl_reasonerrorstring", "io_net_ssl_setacceptstate", "io_net_ssl_setconnectstate", "io_net_ssl_setverifylocations", "io_net_ssl_shutdown", "io_net_ssl_usecertificatechainfile", "io_net_ssl_useprivatekeyfile", "io_net_ssl_write", "java_jvm_create", "java_jvm_getenv", "jdbc_initialize", "json_back_slash", "json_back_space", "json_close_array", "json_close_object", "json_colon", "json_comma", "json_consume_array", "json_consume_object", "json_consume_string", "json_consume_token", "json_cr", "json_debug", "json_deserialize", "json_e_lower", "json_e_upper", "json_f_lower", "json_form_feed", "json_forward_slash", "json_lf", "json_n_lower", "json_negative", "json_open_array", "json_open_object", "json_period", "json_positive", "json_quote_double", "json_rpccall", "json_serialize", "json_t_lower", "json_tab", "json_white_space", "keycolumn_name", "keycolumn_value", "keyfield_name", "keyfield_value", "lasso_currentaction", "lasso_errorreporting", "lasso_executiontimelimit", "lasso_methodexists", "lasso_tagexists", "lasso_uniqueid", "lasso_version", "lassoapp_current_app", "lassoapp_current_include", "lassoapp_do_with_include", "lassoapp_exists", "lassoapp_find_missing_file", "lassoapp_format_mod_date", "lassoapp_get_capabilities_name", "lassoapp_include_current", "lassoapp_include", "lassoapp_initialize_db", "lassoapp_initialize", "lassoapp_invoke_resource", "lassoapp_issourcefileextension", "lassoapp_link", "lassoapp_load_module", "lassoapp_mime_get", "lassoapp_mime_type_appcache", "lassoapp_mime_type_css", "lassoapp_mime_type_csv", "lassoapp_mime_type_doc", "lassoapp_mime_type_docx", "lassoapp_mime_type_eof", "lassoapp_mime_type_eot", "lassoapp_mime_type_gif", "lassoapp_mime_type_html", "lassoapp_mime_type_ico", "lassoapp_mime_type_jpg", "lassoapp_mime_type_js", "lassoapp_mime_type_lasso", "lassoapp_mime_type_map", "lassoapp_mime_type_pdf", "lassoapp_mime_type_png", "lassoapp_mime_type_ppt", "lassoapp_mime_type_rss", "lassoapp_mime_type_svg", "lassoapp_mime_type_swf", "lassoapp_mime_type_tif", "lassoapp_mime_type_ttf", "lassoapp_mime_type_txt", "lassoapp_mime_type_woff", "lassoapp_mime_type_xaml", "lassoapp_mime_type_xap", "lassoapp_mime_type_xbap", "lassoapp_mime_type_xhr", "lassoapp_mime_type_xml", "lassoapp_mime_type_zip", "lassoapp_path_to_method_name", "lassoapp_settingsdb", "layout_name", "lcapi_datasourceadd", "lcapi_datasourcecloseconnection", "lcapi_datasourcedelete", "lcapi_datasourceduplicate", "lcapi_datasourceexecsql", "lcapi_datasourcefindall", "lcapi_datasourceimage", "lcapi_datasourceinfo", "lcapi_datasourceinit", "lcapi_datasourcematchesname", "lcapi_datasourcenames", "lcapi_datasourcenothing", "lcapi_datasourceopand", "lcapi_datasourceopany", "lcapi_datasourceopbw", "lcapi_datasourceopct", "lcapi_datasourceopeq", "lcapi_datasourceopew", "lcapi_datasourceopft", "lcapi_datasourceopgt", "lcapi_datasourceopgteq", "lcapi_datasourceopin", "lcapi_datasourceoplt", "lcapi_datasourceoplteq", "lcapi_datasourceopnbw", "lcapi_datasourceopnct", "lcapi_datasourceopneq", "lcapi_datasourceopnew", "lcapi_datasourceopnin", "lcapi_datasourceopno", "lcapi_datasourceopnot", "lcapi_datasourceopnrx", "lcapi_datasourceopor", "lcapi_datasourceoprx", "lcapi_datasourcepreparesql", "lcapi_datasourceprotectionnone", "lcapi_datasourceprotectionreadonly", "lcapi_datasourcerandom", "lcapi_datasourceschemanames", "lcapi_datasourcescripts", "lcapi_datasourcesearch", "lcapi_datasourcesortascending", "lcapi_datasourcesortcustom", "lcapi_datasourcesortdescending", "lcapi_datasourcetablenames", "lcapi_datasourceterm", "lcapi_datasourcetickle", "lcapi_datasourcetypeblob", "lcapi_datasourcetypeboolean", "lcapi_datasourcetypedate", "lcapi_datasourcetypedecimal", "lcapi_datasourcetypeinteger", "lcapi_datasourcetypestring", "lcapi_datasourceunpreparesql", "lcapi_datasourceupdate", "lcapi_fourchartointeger", "lcapi_listdatasources", "lcapi_loadmodule", "lcapi_loadmodules", "lcapi_updatedatasourceslist", "ldap_scope_base", "ldap_scope_children", "ldap_scope_onelevel", "ldap_scope_subtree", "library_once", "library", "ljapi_initialize", "locale_availablelocales", "locale_canada", "locale_canadafrench", "locale_china", "locale_chinese", "locale_default", "locale_english", "locale_format_style_date_time", "locale_format_style_default", "locale_format_style_full", "locale_format_style_long", "locale_format_style_medium", "locale_format_style_none", "locale_format_style_short", "locale_format", "locale_france", "locale_french", "locale_german", "locale_germany", "locale_isocountries", "locale_isolanguages", "locale_italian", "locale_italy", "locale_japan", "locale_japanese", "locale_korea", "locale_korean", "locale_prc", "locale_setdefault", "locale_simplifiedchinese", "locale_taiwan", "locale_traditionalchinese", "locale_uk", "locale_us", "log_always", "log_critical", "log_deprecated", "log_destination_console", "log_destination_database", "log_destination_file", "log_detail", "log_initialize", "log_level_critical", "log_level_deprecated", "log_level_detail", "log_level_sql", "log_level_warning", "log_max_file_size", "log_setdestination", "log_sql", "log_trim_file_size", "log_warning", "loop_key_pop", "loop_key_push", "loop_key", "loop_pop", "loop_push", "loop_value_pop", "loop_value_push", "loop_value", "main_thread_only", "maxrecords_value", "median", "method_name", "micros", "millis", "mongo_insert_continue_on_error", "mongo_insert_no_validate", "mongo_insert_none", "mongo_query_await_data", "mongo_query_exhaust", "mongo_query_no_cursor_timeout", "mongo_query_none", "mongo_query_oplog_replay", "mongo_query_partial", "mongo_query_slave_ok", "mongo_query_tailable_cursor", "mongo_remove_none", "mongo_remove_single_remove", "mongo_update_multi_update", "mongo_update_no_validate", "mongo_update_none", "mongo_update_upsert", "mustache_compile_file", "mustache_compile_string", "mustache_include", "mysqlds", "namespace_global", "namespace_import", "net_connectinprogress", "net_connectok", "net_typessl", "net_typessltcp", "net_typessludp", "net_typetcp", "net_typeudp", "net_waitread", "net_waittimeout", "net_waitwrite", "nslookup", "odbc_session_driver_mssql", "odbc", "output", "pdf_package", "pdf_rectangle", "pdf_serve", "pi", "postgresql", "process", "protect_now", "queriable_average", "queriable_defaultcompare", "queriable_do", "queriable_internal_combinebindings", "queriable_max", "queriable_min", "queriable_qsort", "queriable_reversecompare", "queriable_sum", "random_seed", "range", "records_array", "records_map", "redirect_url", "referer_url", "referrer_url", "register_thread", "register", "response_filepath", "response_localpath", "response_path", "response_realm", "response_root", "resultset_count", "resultsets", "rows_array", "rows_impl", "schema_name", "security_database", "security_default_realm", "security_initialize", "security_table_groups", "security_table_ug_map", "security_table_users", "selected", "series", "server_admin", "server_ip", "server_name", "server_port", "server_protocol", "server_push", "server_signature", "server_software", "session_abort", "session_addvar", "session_decorate", "session_deleteexpired", "session_end", "session_getdefaultdriver", "session_id", "session_initialize", "session_removevar", "session_result", "session_setdefaultdriver", "session_start", "shown_count", "shown_first", "shown_last", "site_id", "site_name", "skiprecords_value", "sleep", "sqlite_abort", "sqlite_auth", "sqlite_blob", "sqlite_busy", "sqlite_cantopen", "sqlite_constraint", "sqlite_corrupt", "sqlite_createdb", "sqlite_done", "sqlite_empty", "sqlite_error", "sqlite_float", "sqlite_format", "sqlite_full", "sqlite_integer", "sqlite_internal", "sqlite_interrupt", "sqlite_ioerr", "sqlite_locked", "sqlite_mismatch", "sqlite_misuse", "sqlite_nolfs", "sqlite_nomem", "sqlite_notadb", "sqlite_notfound", "sqlite_null", "sqlite_ok", "sqlite_perm", "sqlite_protocol", "sqlite_range", "sqlite_readonly", "sqlite_row", "sqlite_schema", "sqlite_setsleepmillis", "sqlite_setsleeptries", "sqlite_text", "sqlite_toobig", "sqliteconnector", "staticarray_join", "stdout", "stdoutnl", "string_validcharset", "suspend", "sys_appspath", "sys_chroot", "sys_clock", "sys_clockspersec", "sys_credits", "sys_daemon", "sys_databasespath", "sys_detach_exec", "sys_difftime", "sys_dll_ext", "sys_drand48", "sys_environ", "sys_eol", "sys_erand48", "sys_errno", "sys_exec_pid_to_os_pid", "sys_exec", "sys_exit", "sys_fork", "sys_garbagecollect", "sys_getbytessincegc", "sys_getchar", "sys_getegid", "sys_getenv", "sys_geteuid", "sys_getgid", "sys_getgrnam", "sys_getheapfreebytes", "sys_getheapsize", "sys_getlogin", "sys_getpid", "sys_getppid", "sys_getpwnam", "sys_getpwuid", "sys_getstartclock", "sys_getthreadcount", "sys_getuid", "sys_growheapby", "sys_homepath", "sys_is_full_path", "sys_is_windows", "sys_isfullpath", "sys_iswindows", "sys_iterate", "sys_jrand48", "sys_kill_exec", "sys_kill", "sys_lcong48", "sys_librariespath", "sys_library", "sys_listtraits", "sys_listtypes", "sys_listunboundmethods", "sys_load_dynamic_library", "sys_loadlibrary", "sys_lrand48", "sys_masterhomepath", "sys_mrand48", "sys_nrand48", "sys_pid_exec", "sys_pointersize", "sys_rand", "sys_random", "sys_seed48", "sys_setenv", "sys_setgid", "sys_setsid", "sys_setuid", "sys_sigabrt", "sys_sigalrm", "sys_sigbus", "sys_sigchld", "sys_sigcont", "sys_sigfpe", "sys_sighup", "sys_sigill", "sys_sigint", "sys_sigkill", "sys_sigpipe", "sys_sigprof", "sys_sigquit", "sys_sigsegv", "sys_sigstop", "sys_sigsys", "sys_sigterm", "sys_sigtrap", "sys_sigtstp", "sys_sigttin", "sys_sigttou", "sys_sigurg", "sys_sigusr1", "sys_sigusr2", "sys_sigvtalrm", "sys_sigxcpu", "sys_sigxfsz", "sys_srand", "sys_srand48", "sys_srandom", "sys_strerror", "sys_supportpath", "sys_test_exec", "sys_time", "sys_uname", "sys_unsetenv", "sys_usercapimodulepath", "sys_userstartuppath", "sys_version", "sys_wait_exec", "sys_waitpid", "sys_wcontinued", "sys_while", "sys_wnohang", "sys_wuntraced", "table_name", "tag_exists", "thread_var_get", "thread_var_pop", "thread_var_push", "threadvar_find", "threadvar_get", "threadvar_set_asrt", "threadvar_set", "timer", "token_value", "treemap", "u_lb_alphabetic", "u_lb_ambiguous", "u_lb_break_after", "u_lb_break_before", "u_lb_break_both", "u_lb_break_symbols", "u_lb_carriage_return", "u_lb_close_punctuation", "u_lb_combining_mark", "u_lb_complex_context", "u_lb_contingent_break", "u_lb_exclamation", "u_lb_glue", "u_lb_h2", "u_lb_h3", "u_lb_hyphen", "u_lb_ideographic", "u_lb_infix_numeric", "u_lb_inseparable", "u_lb_jl", "u_lb_jt", "u_lb_jv", "u_lb_line_feed", "u_lb_mandatory_break", "u_lb_next_line", "u_lb_nonstarter", "u_lb_numeric", "u_lb_open_punctuation", "u_lb_postfix_numeric", "u_lb_prefix_numeric", "u_lb_quotation", "u_lb_space", "u_lb_surrogate", "u_lb_unknown", "u_lb_word_joiner", "u_lb_zwspace", "u_nt_decimal", "u_nt_digit", "u_nt_none", "u_nt_numeric", "u_sb_aterm", "u_sb_close", "u_sb_format", "u_sb_lower", "u_sb_numeric", "u_sb_oletter", "u_sb_other", "u_sb_sep", "u_sb_sp", "u_sb_sterm", "u_sb_upper", "u_wb_aletter", "u_wb_extendnumlet", "u_wb_format", "u_wb_katakana", "u_wb_midletter", "u_wb_midnum", "u_wb_numeric", "u_wb_other", "ucal_ampm", "ucal_dayofmonth", "ucal_dayofweek", "ucal_dayofweekinmonth", "ucal_dayofyear", "ucal_daysinfirstweek", "ucal_dowlocal", "ucal_dstoffset", "ucal_era", "ucal_extendedyear", "ucal_firstdayofweek", "ucal_hour", "ucal_hourofday", "ucal_julianday", "ucal_lenient", "ucal_listtimezones", "ucal_millisecond", "ucal_millisecondsinday", "ucal_minute", "ucal_month", "ucal_second", "ucal_weekofmonth", "ucal_weekofyear", "ucal_year", "ucal_yearwoy", "ucal_zoneoffset", "uchar_age", "uchar_alphabetic", "uchar_ascii_hex_digit", "uchar_bidi_class", "uchar_bidi_control", "uchar_bidi_mirrored", "uchar_bidi_mirroring_glyph", "uchar_bidi_paired_bracket", "uchar_block", "uchar_canonical_combining_class", "uchar_case_folding", "uchar_case_sensitive", "uchar_dash", "uchar_decomposition_type", "uchar_default_ignorable_code_point", "uchar_deprecated", "uchar_diacritic", "uchar_east_asian_width", "uchar_extender", "uchar_full_composition_exclusion", "uchar_general_category_mask", "uchar_general_category", "uchar_grapheme_base", "uchar_grapheme_cluster_break", "uchar_grapheme_extend", "uchar_grapheme_link", "uchar_hangul_syllable_type", "uchar_hex_digit", "uchar_hyphen", "uchar_id_continue", "uchar_ideographic", "uchar_ids_binary_operator", "uchar_ids_trinary_operator", "uchar_iso_comment", "uchar_join_control", "uchar_joining_group", "uchar_joining_type", "uchar_lead_canonical_combining_class", "uchar_line_break", "uchar_logical_order_exception", "uchar_lowercase_mapping", "uchar_lowercase", "uchar_math", "uchar_name", "uchar_nfc_inert", "uchar_nfc_quick_check", "uchar_nfd_inert", "uchar_nfd_quick_check", "uchar_nfkc_inert", "uchar_nfkc_quick_check", "uchar_nfkd_inert", "uchar_nfkd_quick_check", "uchar_noncharacter_code_point", "uchar_numeric_type", "uchar_numeric_value", "uchar_pattern_syntax", "uchar_pattern_white_space", "uchar_posix_alnum", "uchar_posix_blank", "uchar_posix_graph", "uchar_posix_print", "uchar_posix_xdigit", "uchar_quotation_mark", "uchar_radical", "uchar_s_term", "uchar_script", "uchar_segment_starter", "uchar_sentence_break", "uchar_simple_case_folding", "uchar_simple_lowercase_mapping", "uchar_simple_titlecase_mapping", "uchar_simple_uppercase_mapping", "uchar_soft_dotted", "uchar_terminal_punctuation", "uchar_titlecase_mapping", "uchar_trail_canonical_combining_class", "uchar_unicode_1_name", "uchar_unified_ideograph", "uchar_uppercase_mapping", "uchar_uppercase", "uchar_variation_selector", "uchar_white_space", "uchar_word_break", "uchar_xid_continue", "uncompress", "usage", "uuid_compare", "uuid_copy", "uuid_generate_random", "uuid_generate_time", "uuid_generate", "uuid_is_null", "uuid_parse", "uuid_unparse_lower", "uuid_unparse_upper", "uuid_unparse", "value_listitem", "valuelistitem", "var_keys", "var_values", "wap_isenabled", "wap_maxbuttons", "wap_maxcolumns", "wap_maxhorzpixels", "wap_maxrows", "wap_maxvertpixels", "web_handlefcgirequest", "web_node_content_representation_css", "web_node_content_representation_html", "web_node_content_representation_js", "web_node_content_representation_xhr", "web_node_forpath", "web_nodes_initialize", "web_nodes_normalizeextension", "web_nodes_processcontentnode", "web_nodes_requesthandler", "web_response_nodesentry", "web_router_database", "web_router_initialize", "websocket_handler_timeout", "wexitstatus", "wifcontinued", "wifexited", "wifsignaled", "wifstopped", "wstopsig", "wtermsig", "xml_transform", "zip_add_dir", "zip_add", "zip_checkcons", "zip_close", "zip_cm_bzip2", "zip_cm_default", "zip_cm_deflate", "zip_cm_deflate64", "zip_cm_implode", "zip_cm_pkware_implode", "zip_cm_reduce_1", "zip_cm_reduce_2", "zip_cm_reduce_3", "zip_cm_reduce_4", "zip_cm_shrink", "zip_cm_store", "zip_create", "zip_delete", "zip_em_3des_112", "zip_em_3des_168", "zip_em_aes_128", "zip_em_aes_192", "zip_em_aes_256", "zip_em_des", "zip_em_none", "zip_em_rc2_old", "zip_em_rc2", "zip_em_rc4", "zip_em_trad_pkware", "zip_em_unknown", "zip_er_changed", "zip_er_close", "zip_er_compnotsupp", "zip_er_crc", "zip_er_deleted", "zip_er_eof", "zip_er_exists", "zip_er_incons", "zip_er_internal", "zip_er_inval", "zip_er_memory", "zip_er_multidisk", "zip_er_noent", "zip_er_nozip", "zip_er_ok", "zip_er_open", "zip_er_read", "zip_er_remove", "zip_er_rename", "zip_er_seek", "zip_er_tmpopen", "zip_er_write", "zip_er_zipclosed", "zip_er_zlib", "zip_error_get_sys_type", "zip_error_get", "zip_error_to_str", "zip_et_none", "zip_et_sys", "zip_et_zlib", "zip_excl", "zip_fclose", "zip_file_error_get", "zip_file_strerror", "zip_fl_compressed", "zip_fl_nocase", "zip_fl_nodir", "zip_fl_unchanged", "zip_fopen_index", "zip_fopen", "zip_fread", "zip_get_archive_comment", "zip_get_file_comment", "zip_get_name", "zip_get_num_files", "zip_name_locate", "zip_open", "zip_rename", "zip_replace", "zip_set_archive_comment", "zip_set_file_comment", "zip_stat_index", "zip_stat", "zip_strerror", "zip_unchange_all", "zip_unchange_archive", "zip_unchange", "zlib_version"] + h[:keywords] = Set.new ["cache", "database_names", "database_schemanames", "database_tablenames", "define_tag", "define_type", "email_batch", "encode_set", "html_comment", "handle", "handle_error", "header", "if", "inline", "iterate", "ljax_target", "link", "link_currentaction", "link_currentgroup", "link_currentrecord", "link_detail", "link_firstgroup", "link_firstrecord", "link_lastgroup", "link_lastrecord", "link_nextgroup", "link_nextrecord", "link_prevgroup", "link_prevrecord", "log", "loop", "namespace_using", "output_none", "portal", "private", "protect", "records", "referer", "referrer", "repeating", "resultset", "rows", "search_args", "search_arguments", "select", "sort_args", "sort_arguments", "thread_atomic", "value_list", "while", "abort", "case", "else", "fail_if", "fail_ifnot", "fail", "if_empty", "if_false", "if_null", "if_true", "loop_abort", "loop_continue", "loop_count", "params", "params_up", "return", "return_value", "run_children", "soap_definetag", "soap_lastrequest", "soap_lastresponse", "tag_name", "ascending", "average", "by", "define", "descending", "do", "equals", "frozen", "group", "handle_failure", "import", "in", "into", "join", "let", "match", "max", "min", "on", "order", "parent", "protected", "provide", "public", "require", "returnhome", "skip", "split_thread", "sum", "take", "thread", "to", "trait", "type", "where", "with", "yield", "yieldhome"] + h[:exceptions] = Set.new ["error_adderror", "error_columnrestriction", "error_databaseconnectionunavailable", "error_databasetimeout", "error_deleteerror", "error_fieldrestriction", "error_filenotfound", "error_invaliddatabase", "error_invalidpassword", "error_invalidusername", "error_modulenotfound", "error_noerror", "error_nopermission", "error_outofmemory", "error_reqcolumnmissing", "error_reqfieldmissing", "error_requiredcolumnmissing", "error_requiredfieldmissing", "error_updateerror"] + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/liquid.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/liquid.rb new file mode 100644 index 000000000000..75ca9b3225a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/liquid.rb @@ -0,0 +1,285 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Liquid < RegexLexer + title "Liquid" + desc 'Liquid is a templating engine for Ruby (liquidmarkup.org)' + tag 'liquid' + filenames '*.liquid' + + state :root do + rule %r/[^\{]+/, Text + + rule %r/(\{%-?)(\s*)/ do + groups Punctuation, Text::Whitespace + push :tag_or_block + end + + rule %r/(\{\{-?)(\s*)/ do + groups Punctuation, Text::Whitespace + push :output + end + + rule %r/\{/, Text + end + + state :tag_or_block do + # builtin logic blocks + rule %r/(if|elsif|unless|case)\b/, Keyword::Reserved, :condition + rule %r/(when)\b/, Keyword::Reserved, :when + + rule %r/(else)(\s*)(-?%\})/ do + groups Keyword::Reserved, Text::Whitespace, Punctuation + pop! + end + + # other builtin blocks + rule %r/(capture|(?:in|de)crement)(\s+)([^\s%]+)(\s*)(-?%\})/ do + groups Name::Tag, Text::Whitespace, Name::Variable, Text::Whitespace, Punctuation + pop! + end + + rule %r/(comment)(\s*)(-?%\})/ do + groups Name::Tag, Text::Whitespace, Punctuation + push :comment + end + + rule %r/(raw)(\s*)(-?%\})/ do + groups Name::Tag, Text::Whitespace, Punctuation + push :raw + end + + # end of block + rule %r/(end(?:if|unless|case))(\s*)(-?%\})/ do + groups Keyword::Reserved, Text::Whitespace, Punctuation + pop! + end + + rule %r/(end(?:[^\s%]+))(\s*)(-?%\})/ do + groups Name::Tag, Text::Whitespace, Punctuation + pop! + end + + # builtin tags + rule %r/(assign|echo)\b/, Name::Tag, :assign + rule %r/(include|render)\b/, Name::Tag, :include + + rule %r/(cycle)(\s+)(?:([^\s:]*)(\s*)(:))?(\s*)/ do |m| + token_class = case m[3] + when %r/'[^']*'/ then Str::Single + when %r/"[^"]*"/ then Str::Double + else + Name::Attribute + end + + groups Name::Tag, Text::Whitespace, token_class, + Text::Whitespace, Punctuation, Text::Whitespace + + push :variable_tag_markup + end + + # iteration + rule %r/ + (for|tablerow)(\s+) + ([\w-]+)(\s+) + (in)(\s+) + ( + (?: [^\s%,\|'"] | (?:"[^"]*"|'[^']*') )+ + )(\s*) + /x do |m| + groups Name::Tag, Text::Whitespace, Name::Variable, Text::Whitespace, + Name::Tag, Text::Whitespace + + token_class = case m[7] + when %r/'[^']*'/ then Str::Single + when %r/"[^"]*"/ then Str::Double + else + Name::Variable + end + token token_class, m[7] + token Text::Whitespace, m[8] + push :tag_markup + end + + # other tags or blocks + rule %r/([^\s%]+)(\s*)/ do + groups Name::Tag, Text::Whitespace + push :tag_markup + end + end + + state :output do + rule %r/(\|)(\s*)([a-zA-Z_][^\s}\|:]*)/ do + groups Punctuation, Text::Whitespace, Name::Function + push :filters + end + + mixin :end_of_tag + mixin :generic + end + + state :filters do + rule %r/(\|)(\s*)([a-zA-Z_][^\s%}\|:]*)/ do + groups Punctuation, Text::Whitespace, Name::Function + end + + mixin :end_of_tag + mixin :end_of_block + mixin :variable_param_markup + end + + state :condition do + rule %r/([=!]=|[<>]=?)/, Operator + rule %r/(and|or|contains)\b/, Operator::Word + + mixin :end_of_block + mixin :generic + end + + state :when do + mixin :end_of_block + mixin :generic + end + + state :end_of_tag do + rule(/-?\}\}/) { token Punctuation; reset_stack } + end + + state :end_of_block do + rule(/-?%\}/) { token Punctuation; reset_stack } + end + + # states for unknown markup + state :param_markup do + mixin :whitespace + mixin :keyword + mixin :string + mixin :number + + rule %r/([^\s=:]+)(\s*)(=|:)/ do + groups Name::Attribute, Text::Whitespace, Operator + end + + rule %r/[,:]/, Punctuation + end + + state :default_param_markup do + mixin :param_markup + + rule %r/\S+/, Text + end + + state :variable_param_markup do + mixin :param_markup + mixin :variable + + rule %r/\S+/, Text + end + + state :tag_markup do + rule %r/(reversed)\b/, Name::Attribute + + mixin :end_of_block + mixin :default_param_markup + end + + state :variable_tag_markup do + mixin :end_of_block + mixin :variable_param_markup + end + + # states for different values types + state :keyword do + rule %r/(false|true|nil)\b/, Keyword::Constant + end + + state :variable do + rule %r/(empty|blank|forloop\.[^\s%}\|:]+)\b/, Name::Builtin + rule %r/\.(?=\w)|\[|\]/, Punctuation + rule %r/(first|last|size)\b/, Name::Function + rule %r/[a-zA-Z_][\w-]*\??/, Name::Variable + end + + state :string do + rule %r/'[^']*'/, Str::Single + rule %r/"[^"]*"/, Str::Double + end + + state :number do + rule %r/-/, Operator + rule %r/\d+\.\d+/, Num::Float + rule %r/\d+/, Num::Integer + end + + state :generic do + mixin :whitespace + mixin :keyword + mixin :string + mixin :number + mixin :variable + end + + state :whitespace do + rule %r/[ \t]+/, Text::Whitespace + end + + state :comment do + rule %r/[^\{]+/, Comment + + rule %r/(\{%-?)(\s*)(endcomment)(\s*)(-?%\})/ do + groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation + reset_stack + end + + rule %r/\{/, Comment + end + + state :raw do + rule %r/[^\{]+/, Text + + rule %r/(\{%-?)(\s*)(endraw)(\s*)(-?%\})/ do + groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation + reset_stack + end + + rule %r/\{/, Text + end + + state :assign do + rule %r/=/, Operator + + rule %r/(\|)(\s*)([a-zA-Z_][^\s%\|:]*)/ do + groups Punctuation, Text::Whitespace, Name::Function + push :filters + end + + mixin :end_of_block + mixin :generic + end + + state :include do + rule %r/(\{\{-?)(\s*)/ do + groups Punctuation, Text::Whitespace + push :output_embed + end + + rule %r/(with|for)\b/, Name::Tag + rule %r/[\/\w-]+(\.[\w-]+)+\b/, Text + + mixin :variable_tag_markup + end + + state :output_embed do + rule %r/(\|)(\s*)([a-zA-Z_][^\s}\|:]*)/ do + groups Punctuation, Text::Whitespace, Name::Function + end + + rule %r/-?\}\}/, Punctuation, :pop! + + mixin :variable_param_markup + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/literate_coffeescript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/literate_coffeescript.rb new file mode 100644 index 000000000000..b991fdfed871 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/literate_coffeescript.rb @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class LiterateCoffeescript < RegexLexer + tag 'literate_coffeescript' + title "Literate CoffeeScript" + desc 'Literate coffeescript' + aliases 'litcoffee' + filenames '*.litcoffee' + + def markdown + @markdown ||= Markdown.new(options) + end + + def coffee + @coffee ||= Coffeescript.new(options) + end + + start { markdown.reset!; coffee.reset! } + + state :root do + rule %r/^( .*?\n)+/m do + delegate coffee + end + + rule %r/^([ ]{0,3}(\S.*?|)\n)*/m do + delegate markdown + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/literate_haskell.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/literate_haskell.rb new file mode 100644 index 000000000000..cf43e8509bc9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/literate_haskell.rb @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class LiterateHaskell < RegexLexer + title "Literate Haskell" + desc 'Literate haskell' + tag 'literate_haskell' + aliases 'lithaskell', 'lhaskell', 'lhs' + filenames '*.lhs' + mimetypes 'text/x-literate-haskell' + + def haskell + @haskell ||= Haskell.new(options) + end + + start { haskell.reset! } + + # TODO: support TeX versions as well. + state :root do + rule %r/\s*?\n(?=>)/, Text, :code + rule %r/.*?\n/, Text + rule %r/.+\z/, Text + end + + state :code do + rule %r/(>)( .*?(\n|\z))/ do |m| + token Name::Label, m[1] + delegate haskell, m[2] + end + + rule %r/\s*\n(?=\s*[^>])/, Text, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/livescript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/livescript.rb new file mode 100644 index 000000000000..0825e6386de5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/livescript.rb @@ -0,0 +1,310 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Livescript < RegexLexer + tag 'livescript' + aliases 'ls' + filenames '*.ls' + mimetypes 'text/livescript' + + title 'LiveScript' + desc 'LiveScript, a language which compiles to JavaScript (livescript.net)' + + def self.detect?(text) + return text.shebang? 'lsc' + end + + def self.declarations + @declarations ||= Set.new %w(const let var function class extends implements) + end + + def self.keywords + @keywords ||= Set.new %w( + loop until for in of while break return continue switch case + fallthrough default otherwise when then if unless else throw try + catch finally new delete typeof instanceof super by from to til + with require do debugger import export yield + ) + end + + def self.constants + @constants ||= Javascript.constants + %w(yes no on off void) + end + + def self.builtins + @builtins ||= Javascript.builtins + %w(this it that arguments) + end + + def self.loop_control_keywords + @loop_control_keywords ||= Set.new %w(break continue) + end + + id = /[$a-z_]((-(?=[a-z]))?[a-z0-9_])*/i + int_number = /\d[\d_]*/ + int = /#{int_number}(e[+-]?#{int_number})?[$\w]*/ # the last class matches units + + state :root do + rule(%r(^(?=\s|/))) { push :slash_starts_regex } + mixin :comments + mixin :whitespace + + # list of words + rule %r/(<\[)(.*?)(\]>)/m do + groups Punctuation, Str, Punctuation + end + + # function declarations + rule %r/!\s*function\b/, Keyword::Declaration + rule %r/!?[-~]>|<[-~]!?/, Keyword::Declaration + + # switch arrow + rule %r/(=>)/, Keyword + + # prototype attributes + rule %r/(::)(#{id})/ do + groups Punctuation, Name::Attribute + push :id + end + rule %r/(::)(#{int})/ do + groups Punctuation, Num::Integer + push :id + end + + # instance attributes + rule %r/(@)(#{id})/ do + groups Name::Variable::Instance, Name::Attribute + push :id + end + rule %r/([.])(#{id})/ do + groups Punctuation, Name::Attribute + push :id + end + rule %r/([.])(\d+)/ do + groups Punctuation, Num::Integer + push :id + end + rule %r/#{id}(?=\s*:[^:=])/, Name::Attribute + + # operators + rule %r( + [+][+]|--|&&|\b(and|x?or|is(nt)?|not)\b(?!-[a-zA-Z]|_)|[|][|]| + [.]([|&^]|<<|>>>?)[.]|\\(?=\n)|[.:]=|<<<<?|<[|]|[|]>| + (<<|>>|==?|!=?|[-<>+*%^/~?])=? + )x, Operator, :slash_starts_regex + + # arguments shorthand + rule %r/(&)(#{id})?/ do + groups Name::Builtin, Name::Attribute + end + + # switch case + rule %r/[|]|\bcase(?=\s)/, Keyword, :switch_underscore + + rule %r/@/, Name::Variable::Instance + rule %r/[.]{3}/, Punctuation + rule %r/:/, Punctuation + + # keywords + rule %r/#{id}/ do |m| + if self.class.loop_control_keywords.include? m[0] + token Keyword + push :loop_control + next + elsif self.class.keywords.include? m[0] + token Keyword + elsif self.class.constants.include? m[0] + token Name::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + elsif self.class.declarations.include? m[0] + token Keyword::Declaration + elsif /^[A-Z]/.match(m[0]) && /[^-][a-z]/.match(m[0]) + token Name::Class + else + token Name::Variable + end + push :id + end + + # punctuation and brackets + rule %r/\](?=[!?.]|#{id})/, Punctuation, :id + rule %r/[{(\[;,]/, Punctuation, :slash_starts_regex + rule %r/[})\].]/, Punctuation + + # literals + rule %r/#{int_number}[.]#{int}/, Num::Float + rule %r/0x[0-9A-Fa-f]+/, Num::Hex + rule %r/#{int}/, Num::Integer + + # strings + rule %r/"""/ do + token Str + push do + rule %r/"""/, Str, :pop! + rule %r/"/, Str + mixin :double_strings + end + end + + rule %r/'''/ do + token Str + push do + rule %r/'''/, Str, :pop! + rule %r/'/, Str + mixin :single_strings + end + end + + rule %r/"/ do + token Str + push do + rule %r/"/, Str, :pop! + mixin :double_strings + end + end + + rule %r/'/ do + token Str + push do + rule %r/'/, Str, :pop! + mixin :single_strings + end + end + + # words + rule %r/\\\S[^\s,;\])}]*/, Str + end + + state :code_escape do + rule %r(\\( + c[A-Z]| + x[0-9a-fA-F]{2}| + u[0-9a-fA-F]{4}| + u\{[0-9a-fA-F]{4}\} + ))x, Str::Escape + end + + state :interpolated_expression do + rule %r/}/, Str::Interpol, :pop! + mixin :root + end + + state :interpolation do + # with curly braces + rule %r/[#][{]/, Str::Interpol, :interpolated_expression + # without curly braces + rule %r/(#)(#{id})/ do |m| + groups Str::Interpol, (self.class.builtins.include? m[2]) ? Name::Builtin : Name::Variable + end + end + + state :whitespace do + # white space and loop labels + rule %r/(\s+?)(?:^([^\S\n]*)(:#{id}))?/m do + groups Text, Text, Name::Label + end + end + + state :whitespace_single_line do + rule %r([^\S\n]+), Text + end + + state :slash_starts_regex do + mixin :comments + mixin :whitespace + mixin :multiline_regex_begin + + rule %r( + /(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/ # a regex + ([gimy]+\b|\B) + )x, Str::Regex, :pop! + + rule(//) { pop! } + end + + state :multiline_regex_begin do + rule %r(//) do + token Str::Regex + goto :multiline_regex + end + end + + state :multiline_regex_end do + rule %r(//([gimy]+\b|\B)), Str::Regex, :pop! + end + + state :multiline_regex do + mixin :multiline_regex_end + mixin :regex_comment + mixin :interpolation + mixin :code_escape + rule %r/\\\D/, Str::Escape + rule %r/\\\d+/, Name::Variable + rule %r/./m, Str::Regex + end + + state :regex_comment do + rule %r/^#(\s+.*)?$/, Comment::Single + rule %r/(\s+)(#)(\s+.*)?$/ do + groups Text, Comment::Single, Comment::Single + end + end + + state :comments do + rule %r(/\*.*?\*/)m, Comment::Multiline + rule %r/#.*$/, Comment::Single + end + + state :switch_underscore do + mixin :whitespace_single_line + rule %r/_(?=\s*=>|\s+then\b)/, Keyword + rule(//) { pop! } + end + + state :loop_control do + mixin :whitespace_single_line + rule %r/#{id}(?=[);\n])/, Name::Label + rule(//) { pop! } + end + + state :id do + rule %r/[!?]|[.](?!=)/, Punctuation + rule %r/[{]/ do + # destructuring + token Punctuation + push do + rule %r/[,;]/, Punctuation + rule %r/#{id}/, Name::Attribute + rule %r/#{int}/, Num::Integer + mixin :whitespace + rule %r/[}]/, Punctuation, :pop! + end + end + rule %r/#{id}/, Name::Attribute + rule %r/#{int}/, Num::Integer + rule(//) { goto :slash_starts_regex } + end + + state :strings do + # all strings are multi-line + rule %r/[^#\\'"]+/m, Str + mixin :code_escape + rule %r/\\./, Str::Escape + rule %r/#/, Str + end + + state :double_strings do + rule %r/'/, Str + mixin :interpolation + mixin :strings + end + + state :single_strings do + rule %r/"/, Str + mixin :strings + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/llvm.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/llvm.rb new file mode 100644 index 000000000000..b5ffa4459c7f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/llvm.rb @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class LLVM < RegexLexer + title "LLVM" + desc 'The LLVM Compiler Infrastructure (http://llvm.org/)' + tag 'llvm' + + filenames '*.ll' + mimetypes 'text/x-llvm' + + string = /"[^"]*?"/ + identifier = /([-a-zA-Z$._][-a-zA-Z$._0-9]*|#{string})/ + + def self.keywords + Kernel::load File.join(Lexers::BASE_DIR, "llvm/keywords.rb") + keywords + end + + def self.instructions + Kernel::load File.join(Lexers::BASE_DIR, "llvm/keywords.rb") + instructions + end + + def self.types + Kernel::load File.join(Lexers::BASE_DIR, "llvm/keywords.rb") + types + end + + state :basic do + rule %r/;.*?$/, Comment::Single + rule %r/\s+/, Text + + rule %r/#{identifier}\s*:/, Name::Label + + rule %r/@(#{identifier}|\d+)/, Name::Variable::Global + rule %r/#\d+/, Name::Variable::Global + rule %r/(%|!)#{identifier}/, Name::Variable + rule %r/(%|!)\d+/, Name::Variable + + rule %r/c?#{string}/, Str + + rule %r/0[xX][a-fA-F0-9]+/, Num + rule %r/-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?/, Num + + rule %r/[=<>{}\[\]()*.,!]|x/, Punctuation + end + + state :root do + mixin :basic + + rule %r/i[1-9]\d*/, Keyword::Type + + rule %r/\w+/ do |m| + if self.class.types.include? m[0] + token Keyword::Type + elsif self.class.instructions.include? m[0] + token Keyword + elsif self.class.keywords.include? m[0] + token Keyword + else + token Error + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/llvm/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/llvm/keywords.rb new file mode 100644 index 000000000000..0c0db22ea32c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/llvm/keywords.rb @@ -0,0 +1,25 @@ +# encoding: utf-8 +# frozen_string_literal: true + +# DO NOT EDIT +# This file is automatically generated by `rake builtins:llvm`. +# See tasks/builtins/llvm.rake for more info. + +module Rouge + module Lexers + class LLVM + def self.keywords + @keywords ||= Set.new ["aarch64_sve_vector_pcs", "aarch64_vector_pcs", "acq_rel", "acquire", "addrspace", "afn", "alias", "aliasee", "align", "alignLog2", "alignstack", "allOnes", "allocsize", "alwaysInline", "alwaysinline", "amdgpu_cs", "amdgpu_es", "amdgpu_gs", "amdgpu_hs", "amdgpu_kernel", "amdgpu_ls", "amdgpu_ps", "amdgpu_vs", "any", "anyregcc", "appending", "arcp", "argmemonly", "args", "arm_aapcs_vfpcc", "arm_aapcscc", "arm_apcscc", "asm", "atomic", "attributes", "available_externally", "avr_intrcc", "avr_signalcc", "bit", "bitMask", "blockaddress", "branchFunnel", "builtin", "byArg", "byte", "byteArray", "byval", "c", "callee", "caller", "calls", "canAutoHide", "catch", "cc", "ccc", "cfguard_checkcc", "cleanup", "cold", "coldcc", "comdat", "common", "constant", "contract", "convergent", "critical", "cxx_fast_tlscc", "datalayout", "declare", "default", "define", "deplibs", "dereferenceable", "dereferenceable_or_null", "distinct", "dllexport", "dllimport", "dsoLocal", "dso_local", "dso_preemptable", "eq", "exact", "exactmatch", "extern_weak", "external", "externally_initialized", "false", "fast", "fastcc", "filter", "flags", "from", "funcFlags", "function", "gc", "ghccc", "global", "guid", "gv", "hash", "hhvm_ccc", "hhvmcc", "hidden", "hot", "hotness", "ifunc", "immarg", "inaccessiblemem_or_argmemonly", "inaccessiblememonly", "inalloca", "inbounds", "indir", "info", "initialexec", "inline", "inlineBits", "inlinehint", "inrange", "inreg", "insts", "intel_ocl_bicc", "inteldialect", "internal", "jumptable", "kind", "largest", "linkage", "linkonce", "linkonce_odr", "live", "local_unnamed_addr", "localdynamic", "localexec", "max", "min", "minsize", "module", "monotonic", "msp430_intrcc", "musttail", "naked", "name", "nand", "ne", "nest", "ninf", "nnan", "noInline", "noRecurse", "noalias", "nobuiltin", "nocapture", "nocf_check", "noduplicate", "noduplicates", "nofree", "noimplicitfloat", "noinline", "none", "nonlazybind", "nonnull", "norecurse", "noredzone", "noreturn", "nosync", "notEligibleToImport", "notail", "nounwind", "nsw", "nsz", "null", "nuw", "oeq", "offset", "oge", "ogt", "ole", "olt", "one", "opaque", "optforfuzzing", "optnone", "optsize", "ord", "partition", "path", "personality", "prefix", "preserve_allcc", "preserve_mostcc", "private", "prologue", "protected", "ptx_device", "ptx_kernel", "readNone", "readOnly", "readnone", "readonly", "reassoc", "refs", "relbf", "release", "resByArg", "returnDoesNotAlias", "returned", "returns_twice", "safestack", "samesize", "sanitize_address", "sanitize_hwaddress", "sanitize_memory", "sanitize_memtag", "sanitize_thread", "section", "seq_cst", "sge", "sgt", "shadowcallstack", "sideeffect", "signext", "single", "singleImpl", "singleImplName", "sizeM1", "sizeM1BitWidth", "sle", "slt", "source_filename", "speculatable", "speculative_load_hardening", "spir_func", "spir_kernel", "sret", "ssp", "sspreq", "sspstrong", "strictfp", "summaries", "summary", "swiftcc", "swifterror", "swiftself", "syncscope", "tail", "tailcc", "target", "thread_local", "to", "triple", "true", "type", "typeCheckedLoadConstVCalls", "typeCheckedLoadVCalls", "typeIdInfo", "typeTestAssumeConstVCalls", "typeTestAssumeVCalls", "typeTestRes", "typeTests", "typeid", "typeidCompatibleVTable", "ueq", "uge", "ugt", "ule", "ult", "umax", "umin", "undef", "une", "uniformRetVal", "uniqueRetVal", "unknown", "unnamed_addr", "uno", "unordered", "unsat", "unwind", "uselistorder", "uselistorder_bb", "uwtable", "vFuncId", "vTableFuncs", "varFlags", "variable", "vcall_visibility", "virtFunc", "virtualConstProp", "volatile", "vscale", "weak", "weak_odr", "webkit_jscc", "willreturn", "win64cc", "within", "wpdRes", "wpdResolutions", "writeonly", "x", "x86_64_sysvcc", "x86_fastcallcc", "x86_intrcc", "x86_regcallcc", "x86_stdcallcc", "x86_thiscallcc", "x86_vectorcallcc", "xchg", "zeroext", "zeroinitializer"] + end + + def self.types + @types ||= Set.new ["double", "float", "fp128", "half", "label", "metadata", "ppc_fp128", "token", "void", "x86_fp80", "x86_mmx"] + end + + def self.instructions + @instructions ||= Set.new ["add", "addrspacecast", "alloca", "and", "ashr", "atomicrmw", "bitcast", "br", "call", "callbr", "catchpad", "catchret", "catchswitch", "cleanuppad", "cleanupret", "cmpxchg", "extractelement", "extractvalue", "fadd", "fcmp", "fdiv", "fence", "fmul", "fneg", "fpext", "fptosi", "fptoui", "fptrunc", "freeze", "frem", "fsub", "getelementptr", "icmp", "indirectbr", "insertelement", "insertvalue", "inttoptr", "invoke", "landingpad", "load", "lshr", "mul", "or", "phi", "ptrtoint", "resume", "ret", "sdiv", "select", "sext", "shl", "shufflevector", "sitofp", "srem", "store", "sub", "switch", "trunc", "udiv", "uitofp", "unreachable", "urem", "va_arg", "xor", "zext"] + end + + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lua.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lua.rb new file mode 100644 index 000000000000..6e1887b084e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lua.rb @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Lua < RegexLexer + title "Lua" + desc "Lua (http://www.lua.org)" + tag 'lua' + filenames '*.lua', '*.wlua' + + mimetypes 'text/x-lua', 'application/x-lua' + + option :function_highlighting, 'Whether to highlight builtin functions (default: true)' + option :disabled_modules, 'builtin modules to disable' + + def initialize(opts={}) + @function_highlighting = opts.delete(:function_highlighting) { true } + @disabled_modules = opts.delete(:disabled_modules) { [] } + super(opts) + end + + def self.detect?(text) + return true if text.shebang? 'lua' + end + + def self.builtins + Kernel::load File.join(Lexers::BASE_DIR, 'lua/keywords.rb') + builtins + end + + def builtins + return [] unless @function_highlighting + + @builtins ||= Set.new.tap do |builtins| + self.class.builtins.each do |mod, fns| + next if @disabled_modules.include? mod + builtins.merge(fns) + end + end + end + + state :root do + # lua allows a file to start with a shebang + rule %r(#!(.*?)$), Comment::Preproc + rule %r//, Text, :base + end + + state :base do + rule %r(--\[(=*)\[.*?\]\1\])m, Comment::Multiline + rule %r(--.*$), Comment::Single + + rule %r((?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?'), Num::Float + rule %r((?i)\d+e[+-]?\d+), Num::Float + rule %r((?i)0x[0-9a-f]*), Num::Hex + rule %r(\d+), Num::Integer + + rule %r(\n), Text + rule %r([^\S\n]), Text + # multiline strings + rule %r(\[(=*)\[.*?\]\1\])m, Str + + rule %r((==|~=|<=|>=|\.\.\.|\.\.|[=+\-*/%^<>#])), Operator + rule %r([\[\]\{\}\(\)\.,:;]), Punctuation + rule %r((and|or|not)\b), Operator::Word + + rule %r((break|do|else|elseif|end|for|if|in|repeat|return|then|until|while)\b), Keyword + rule %r((local)\b), Keyword::Declaration + rule %r((true|false|nil)\b), Keyword::Constant + + rule %r((function)\b), Keyword, :function_name + + rule %r([A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?) do |m| + name = m[0] + if name == "gsub" + token Name::Builtin + push :gsub + elsif self.builtins.include?(name) + token Name::Builtin + elsif name =~ /\./ + a, b = name.split('.', 2) + token Name, a + token Punctuation, '.' + token Name, b + else + token Name + end + end + + rule %r('), Str::Single, :escape_sqs + rule %r("), Str::Double, :escape_dqs + end + + state :function_name do + rule %r/\s+/, Text + rule %r((?:([A-Za-z_][A-Za-z0-9_]*)(\.))?([A-Za-z_][A-Za-z0-9_]*)) do + groups Name::Class, Punctuation, Name::Function + pop! + end + # inline function + rule %r(\(), Punctuation, :pop! + end + + state :gsub do + rule %r/\)/, Punctuation, :pop! + rule %r/[(,]/, Punctuation + rule %r/\s+/, Text + rule %r/"/, Str::Regex, :regex + end + + state :regex do + rule %r(") do + token Str::Regex + goto :regex_end + end + + rule %r/\[\^?/, Str::Escape, :regex_group + rule %r/\\./, Str::Escape + rule %r{[(][?][:=<!]}, Str::Escape + rule %r/[{][\d,]+[}]/, Str::Escape + rule %r/[()?]/, Str::Escape + rule %r/./, Str::Regex + end + + state :regex_end do + rule %r/[$]+/, Str::Regex, :pop! + rule(//) { pop! } + end + + state :regex_group do + rule %r(/), Str::Escape + rule %r/\]/, Str::Escape, :pop! + rule %r/(\\)(.)/ do |m| + groups Str::Escape, Str::Regex + end + rule %r/./, Str::Regex + end + + state :escape_sqs do + mixin :string_escape + mixin :sqs + end + + state :escape_dqs do + mixin :string_escape + mixin :dqs + end + + state :string_escape do + rule %r(\\([abfnrtv\\"']|\d{1,3})), Str::Escape + end + + state :sqs do + rule %r('), Str::Single, :pop! + rule %r([^']+), Str::Single + end + + state :dqs do + rule %r("), Str::Double, :pop! + rule %r([^"]+), Str::Double + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lua/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lua/keywords.rb new file mode 100644 index 000000000000..c0c5b90f9f8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lua/keywords.rb @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# DO NOT EDIT + +# This file is automatically generated by `rake builtins:lua`. +# See tasks/builtins/lua.rake for more info. + +module Rouge + module Lexers + class Lua + def self.builtins + @builtins ||= {}.tap do |b| + b["basic"] = Set.new ["_g", "_version", "assert", "collectgarbage", "dofile", "error", "getmetatable", "ipairs", "load", "loadfile", "next", "pairs", "pcall", "print", "rawequal", "rawget", "rawlen", "rawset", "select", "setmetatable", "tonumber", "tostring", "type", "xpcall", "file:close", "file:flush", "file:lines", "file:read", "file:seek", "file:setvbuf", "file:write", "lua_cpath", "lua_cpath_5_3", "lua_init", "lua_init_5_3", "lua_path", "lua_path_5_3", "luaopen_base", "luaopen_coroutine", "luaopen_debug", "luaopen_io", "luaopen_math", "luaopen_os", "luaopen_package", "luaopen_string", "luaopen_table", "luaopen_utf8", "lua_errerr", "lua_errfile", "lua_errgcmm", "lua_errmem", "lua_errrun", "lua_errsyntax", "lua_hookcall", "lua_hookcount", "lua_hookline", "lua_hookret", "lua_hooktailcall", "lua_maskcall", "lua_maskcount", "lua_maskline", "lua_maskret", "lua_maxinteger", "lua_mininteger", "lua_minstack", "lua_multret", "lua_noref", "lua_ok", "lua_opadd", "lua_opband", "lua_opbnot", "lua_opbor", "lua_opbxor", "lua_opdiv", "lua_opeq", "lua_opidiv", "lua_ople", "lua_oplt", "lua_opmod", "lua_opmul", "lua_oppow", "lua_opshl", "lua_opshr", "lua_opsub", "lua_opunm", "lua_refnil", "lua_registryindex", "lua_ridx_globals", "lua_ridx_mainthread", "lua_tboolean", "lua_tfunction", "lua_tlightuserdata", "lua_tnil", "lua_tnone", "lua_tnumber", "lua_tstring", "lua_ttable", "lua_tthread", "lua_tuserdata", "lua_use_apicheck", "lua_yield", "lual_buffersize"] + b["modules"] = Set.new ["require", "package.config", "package.cpath", "package.loaded", "package.loadlib", "package.path", "package.preload", "package.searchers", "package.searchpath"] + b["coroutine"] = Set.new ["coroutine.create", "coroutine.isyieldable", "coroutine.resume", "coroutine.running", "coroutine.status", "coroutine.wrap", "coroutine.yield"] + b["debug"] = Set.new ["debug.debug", "debug.gethook", "debug.getinfo", "debug.getlocal", "debug.getmetatable", "debug.getregistry", "debug.getupvalue", "debug.getuservalue", "debug.sethook", "debug.setlocal", "debug.setmetatable", "debug.setupvalue", "debug.setuservalue", "debug.traceback", "debug.upvalueid", "debug.upvaluejoin"] + b["io"] = Set.new ["io.close", "io.flush", "io.input", "io.lines", "io.open", "io.output", "io.popen", "io.read", "io.stderr", "io.stdin", "io.stdout", "io.tmpfile", "io.type", "io.write"] + b["math"] = Set.new ["math.abs", "math.acos", "math.asin", "math.atan", "math.ceil", "math.cos", "math.deg", "math.exp", "math.floor", "math.fmod", "math.huge", "math.log", "math.max", "math.maxinteger", "math.min", "math.mininteger", "math.modf", "math.pi", "math.rad", "math.random", "math.randomseed", "math.sin", "math.sqrt", "math.tan", "math.tointeger", "math.type", "math.ult"] + b["os"] = Set.new ["os.clock", "os.date", "os.difftime", "os.execute", "os.exit", "os.getenv", "os.remove", "os.rename", "os.setlocale", "os.time", "os.tmpname"] + b["string"] = Set.new ["string.byte", "string.char", "string.dump", "string.find", "string.format", "string.gmatch", "string.gsub", "string.len", "string.lower", "string.match", "string.pack", "string.packsize", "string.rep", "string.reverse", "string.sub", "string.unpack", "string.upper"] + b["table"] = Set.new ["table.concat", "table.insert", "table.move", "table.pack", "table.remove", "table.sort", "table.unpack"] + b["utf8"] = Set.new ["utf8.char", "utf8.charpattern", "utf8.codepoint", "utf8.codes", "utf8.len", "utf8.offset"] + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lustre.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lustre.rb new file mode 100644 index 000000000000..65cced8998d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lustre.rb @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Lustre < RegexLexer + title "Lustre" + desc 'The Lustre programming language (Verimag)' + tag 'lustre' + filenames '*.lus' + mimetypes 'text/x-lustre' + + def self.keywords + @keywords ||= Set.new %w( + extern unsafe assert const current enum function let node operator + returns step struct tel type var model package needs provides uses is + body end include merge + ) + end + + def self.word_operators + @word_operators ||= Set.new %w( + div and xor mod or not nor if then else fby pre when with + ) + end + + def self.primitives + @primitives ||= Set.new %w(int real bool) + end + + operator = %r([,!$%&*+./:<=>?@^|~#-]+) + id = /[a-z_][\w']*/i + + state :root do + rule %r/\s+/m, Text + rule %r/false|true/, Keyword::Constant + rule %r(\-\-.*), Comment::Single + rule %r(/\*.*?\*/)m, Comment::Multiline + rule %r(\(\*.*?\*\))m, Comment::Multiline + rule id do |m| + match = m[0] + if self.class.keywords.include? match + token Keyword + elsif self.class.word_operators.include? match + token Operator::Word + elsif self.class.primitives.include? match + token Keyword::Type + else + token Name + end + end + + rule %r/[(){}\[\];]+/, Punctuation + rule operator, Operator + + rule %r/-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float + rule %r/\d[\d_]*/, Num::Integer + + rule %r/'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char + rule %r/'[.]'/, Str::Char + rule %r/"/, Str::Double, :string + rule %r/[~?]#{id}/, Name::Variable + end + + state :string do + rule %r/[^\\"]+/, Str::Double + mixin :escape_sequence + rule %r/\\\n/, Str::Double + rule %r/"/, Str::Double, :pop! + end + + state :escape_sequence do + rule %r/\\[\\"'ntbr]/, Str::Escape + rule %r/\\\d{3}/, Str::Escape + rule %r/\\x\h{2}/, Str::Escape + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lutin.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lutin.rb new file mode 100644 index 000000000000..cc1ac539ed19 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/lutin.rb @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true +# +# adapted from lustre.rf (adapted from ocaml.rb), hence some ocaml-ism migth remains +module Rouge + module Lexers + load_lexer 'lustre.rb' + + class Lutin < Lustre + title "Lutin" + desc 'The Lutin programming language (Verimag)' + tag 'lutin' + filenames '*.lut' + mimetypes 'text/x-lutin' + + def self.keywords + @keywords ||= Set.new %w( + let in node extern system returns weak strong assert raise try catch + trap do exist erun run type ref exception include false true + ) + end + + def self.word_operators + @word_operators ||= Set.new %w( + div and xor mod or not nor if then else pre) + end + + def self.primitives + @primitives ||= Set.new %w(int real bool trace loop fby) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/m68k.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/m68k.rb new file mode 100644 index 000000000000..cb610b747745 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/m68k.rb @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class M68k < RegexLexer + tag 'm68k' + + title "M68k" + desc "Motorola 68k Assembler" + + id = /[a-zA-Z_][a-zA-Z0-9_]*/ + + def self.keywords + @keywords ||= Set.new %w( + abcd add adda addi addq addx and andi asl asr + + bcc bcs beq bge bgt bhi ble bls blt bmi bne bpl bvc bvs bhs blo + bchg bclr bfchg bfclr bfests bfextu bfffo bfins bfset bftst bkpt bra bse bsr btst + + callm cas cas2 chk chk2 clr cmp cmpa cmpi cmpm cmp2 + + dbcc dbcs dbeq dbge dbgt dbhi dble dbls dblt dbmi dbne dbpl dbvc dbvs dbhs dblo + dbra dbf dbt divs divsl divu divul + + eor eori exg ext extb + + illegal jmp jsr lea link lsl lsr + + move movea move16 movem movep moveq muls mulu + + nbcd neg negx nop not or ori + + pack pea rol ror roxl roxr rtd rtm rtr rts + + sbcd + + seq sne spl smi svc svs st sf sge sgt sle slt scc shi sls scs shs slo + sub suba subi subq subx swap + + tas trap trapcc TODO trapv tst + + unlk unpk eori + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + dc ds dcb + ) + end + + def self.reserved + @reserved ||= Set.new %w( + include incdir incbin end endf endfunc endmain endproc fpu func machine main mmu opword proc set opt section + rept endr + ifeq ifne ifgt ifge iflt ifle iif ifd ifnd ifc ifnc elseif else endc + even cnop fail machine + output radix __G2 __LK + list nolist plen llen ttl subttl spc page listchar format + equ equenv equr set reg + rsreset rsset offset + cargs + fequ.s fequ.d fequ.x fequ.p fequ.w fequ.l fopt + macro endm mexit narg + ) + end + + def self.builtins + @builtins ||=Set.new %w( + d0 d1 d2 d3 d4 d5 d6 d7 + a0 a1 a2 a3 a4 a5 a6 a7 a7' + pc usp ssp ccr + ) + end + + start { push :expr_bol } + + state :expr_bol do + mixin :inline_whitespace + rule(//) { pop! } + end + + state :inline_whitespace do + rule %r/\s+/, Text + end + + state :whitespace do + rule %r/\n+/m, Text, :expr_bol + rule %r(^\*(\\.|.)*?$), Comment::Single, :expr_bol + rule %r(;(\\.|.)*?$), Comment::Single, :expr_bol + mixin :inline_whitespace + end + + state :root do + rule(//) { push :statements } + end + + state :statements do + mixin :whitespace + rule %r/"/, Str, :string + rule %r/#/, Name::Decorator + rule %r/^\.?[a-zA-Z0-9_]+:?/, Name::Label + rule %r/\.[bswl]\s/i, Name::Decorator + rule %r('(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char + rule %r/\$[0-9a-f]+/i, Num::Hex + rule %r/@[0-8]+/i, Num::Oct + rule %r/%[01]+/i, Num::Bin + rule %r/\d+/i, Num::Integer + rule %r([*~&+=\|?:<>/-]), Operator + rule %r/\\./, Comment::Preproc + rule %r/[(),.]/, Punctuation + rule %r/\[[a-zA-Z0-9]*\]/, Punctuation + + rule id do |m| + name = m[0] + + if self.class.keywords.include? name.downcase + token Keyword + elsif self.class.keywords_type.include? name.downcase + token Keyword::Type + elsif self.class.reserved.include? name.downcase + token Keyword::Reserved + elsif self.class.builtins.include? name.downcase + token Name::Builtin + elsif name =~ /[a-zA-Z0-9]+/ + token Name::Variable + else + token Name + end + end + end + + state :string do + rule %r/"/, Str, :pop! + rule %r/\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape + rule %r/[^\\"\n]+/, Str + rule %r/\\\n/, Str + rule %r/\\/, Str # stray backslash + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/magik.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/magik.rb new file mode 100644 index 000000000000..0a3f47aa1b24 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/magik.rb @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Magik < RegexLexer + title "Magik" + desc "Smallworld Magik" + tag 'magik' + filenames '*.magik' + mimetypes 'text/x-magik', 'application/x-magik' + + def self.keywords + @keywords ||= %w( + _package + _pragma + _block _endblock + _handling _default + _protect _protection _endprotect + _try _with _when _endtry + _catch _endcatch + _throw + _lock _endlock + _if _then _elif _else _endif + _for _over _while _loop _finally _endloop _loopbody _continue _leave + _return + _class + _local _constant _recursive _global _dynamic _import + _private _iter _abstract _method _endmethod + _proc _endproc + _gather _scatter _allresults _optional + _thisthread _self _clone _super + _primitive + _unset _true _false _maybe + _is _isnt _not _and _or _xor _cf _andif _orif + _div _mod + ) + end + + def self.string_double + @string_double ||= /"[^"\n]*?"/ + end + def self.string_single + @string_single ||= /'[^'\n]*?'/ + end + + def self.digits + @digits ||= /[0-9]+/ + end + def self.radix + @radix ||= /r[0-9a-z]/i + end + def self.exponent + @exponent ||= /(e|&)[+-]?#{Magik.digits}/i + end + def self.decimal + @decimal ||= /\.#{Magik.digits}/ + end + def self.number + @number = /#{Magik.digits}(#{Magik.radix}|#{Magik.exponent}|#{Magik.decimal})*/ + end + + def self.character + @character ||= /%u[0-9a-z]{4}|%[^\s]+/i + end + + def self.simple_identifier + @simple_identifier ||= /(?>(?:[a-z0-9_!?]|\\.)+)/i + end + def self.piped_identifier + @piped_identifier ||= /\|[^\|\n]*\|/ + end + def self.identifier + @identifier ||= /(?:#{Magik.simple_identifier}|#{Magik.piped_identifier})+/i + end + def self.package_identifier + @package_identifier ||= /#{Magik.identifier}:#{Magik.identifier}/ + end + def self.symbol + @symbol ||= /:#{Magik.identifier}/i + end + def self.global_ref + @global_ref ||= /@[\s]*#{Magik.identifier}:#{Magik.identifier}/ + end + def self.label + @label = /@[\s]*#{Magik.identifier}/ + end + + state :root do + rule %r/##(.*)?/, Comment::Doc + rule %r/#(.*)?/, Comment::Single + + rule %r/(_method)(\s+)/ do + groups Keyword, Text::Whitespace + push :method_name + end + + rule %r/(?:#{Magik.keywords.join('|')})\b/, Keyword + + rule Magik.string_double, Literal::String + rule Magik.string_single, Literal::String + rule Magik.symbol, Str::Symbol + rule Magik.global_ref, Name::Label + rule Magik.label, Name::Label + rule Magik.character, Literal::String::Char + rule Magik.number, Literal::Number + rule Magik.package_identifier, Name + rule Magik.identifier, Name + + rule %r/[\[\]{}()\.,;]/, Punctuation + rule %r/\$/, Punctuation + rule %r/(<<|^<<)/, Operator + rule %r/(>>)/, Operator + rule %r/[-~+\/*%=&^<>]|!=/, Operator + + rule %r/[\s]+/, Text::Whitespace + end + + state :method_name do + rule %r/(#{Magik.identifier})(\.)(#{Magik.identifier})/ do + groups Name::Class, Punctuation, Name::Function + pop! + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/make.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/make.rb new file mode 100644 index 000000000000..f4b57c4a1d95 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/make.rb @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Make < RegexLexer + title "Make" + desc "Makefile syntax" + tag 'make' + aliases 'makefile', 'mf', 'gnumake', 'bsdmake' + filenames '*.make', '*.mak', '*.mk', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile', '*,fe1' + mimetypes 'text/x-makefile' + + def self.functions + @functions ||= %w( + abspath addprefix addsuffix and basename call dir error eval file + filter filter-out findstring firstword flavor foreach if join lastword + notdir or origin patsubst realpath shell sort strip subst suffix value + warning wildcard word wordlist words + ) + end + + # TODO: Add support for special keywords + # bsd_special = %w( + # include undef error warning if else elif endif for endfor + # ) + + def initialize(opts={}) + super + @shell = Shell.new(opts) + end + + start { @shell.reset! } + + state :root do + rule %r/\s+/, Text + + rule %r/#.*?\n/, Comment + + rule %r/([-s]?include)((?:[\t ]+[^\t\n #]+)+)/ do + groups Keyword, Literal::String::Other + end + + rule %r/(ifn?def|ifn?eq)([\t ]+)([^#\n]+)/ do + groups Keyword, Text, Name::Variable + end + + rule %r/(?:else|endif)[\t ]*(?=[#\n])/, Keyword + + rule %r/(export)([\t ]+)(?=[\w\${}()\t -]+\n)/ do + groups Keyword, Text + push :export + end + + rule %r/export[\t ]+/, Keyword + + # assignment + rule %r/([\w${}().-]+)([\t ]*)([!?:+]?=)/m do |m| + token Name::Variable, m[1] + token Text, m[2] + token Operator, m[3] + push :shell_line + end + + rule %r/"(\\\\|\\.|[^"\\])*"/, Str::Double + rule %r/'(\\\\|\\.|[^'\\])*'/, Str::Single + rule %r/([^\n:]+)(:+)([ \t]*)/ do + groups Name::Label, Operator, Text + push :block_header + end + end + + state :export do + rule %r/[\w\${}()-]/, Name::Variable + rule %r/\n/, Text, :pop! + rule %r/[\t ]+/, Text + end + + state :block_header do + rule %r/[^,\\\n#]+/, Name::Function + rule %r/,/, Punctuation + rule %r/#.*?/, Comment + rule %r/\\\n/, Text + rule %r/\\./, Text + rule %r/\n/ do + token Text + goto :block_body + end + end + + state :block_body do + rule %r/(ifn?def|ifn?eq)([\t ]+)([^#\n]+)(#.*)?(\n)/ do + groups Keyword, Text, Name::Variable, Comment, Text + end + + rule %r/(else|endif)([\t ]*)(#.*)?(\n)/ do + groups Keyword, Text, Comment, Text + end + + rule %r/(\t[\t ]*)([@-]?)/ do + groups Text, Punctuation + push :shell_line + end + + rule(//) { @shell.reset!; pop! } + end + + state :shell do + # macro interpolation + rule %r/\$[({][\t ]*\w[\w:=%.]*[\t ]*[)}]/i, Name::Variable + # function invocation + rule %r/(\$[({])([\t ]*)(#{Make.functions.join('|')})([\t ]+)/m do + groups Name::Function, Text, Name::Builtin, Text + push :shell_expr + end + + rule(/\\./m) { delegate @shell } + stop = /\$\(|\$\{|\(|\)|\}|\\|$/ + rule(/.+?(?=#{stop})/m) { delegate @shell } + rule(stop) { delegate @shell } + end + + state :shell_expr do + rule(/[({]/) { delegate @shell; push } + rule %r/[)}]/, Name::Function, :pop! + mixin :shell + end + + state :shell_line do + rule %r/\n/, Text, :pop! + mixin :shell + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/markdown.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/markdown.rb new file mode 100644 index 000000000000..d9e368a14ead --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/markdown.rb @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Markdown < RegexLexer + title "Markdown" + desc "Markdown, a light-weight markup language for authors" + + tag 'markdown' + aliases 'md', 'mkd' + filenames '*.markdown', '*.md', '*.mkd' + mimetypes 'text/x-markdown' + + def html + @html ||= HTML.new(options) + end + + start { html.reset! } + + edot = /\\.|[^\\\n]/ + + state :root do + # YAML frontmatter + rule(/\A(---\s*\n.*?\n?)^(---\s*$\n?)/m) { delegate YAML } + + rule %r/\\./, Str::Escape + + rule %r/^[\S ]+\n(?:---*)\n/, Generic::Heading + rule %r/^[\S ]+\n(?:===*)\n/, Generic::Subheading + + rule %r/^#(?=[^#]).*?$/, Generic::Heading + rule %r/^##*.*?$/, Generic::Subheading + + rule %r/^([ \t]*)(`{3,}|~{3,})([^\n]*\n)((.*?)(\n\1)(\2))?/m do |m| + name = m[3].strip + sublexer = + begin + Lexer.find_fancy(name.empty? ? "guess" : name, m[5], @options) + rescue Guesser::Ambiguous => e + e.alternatives.first.new(@options) + end + + sublexer ||= PlainText.new(@options.merge(:token => Str::Backtick)) + sublexer.reset! + + token Text, m[1] + token Punctuation, m[2] + token Name::Label, m[3] + if m[5] + delegate sublexer, m[5] + end + + token Text, m[6] + + if m[7] + token Punctuation, m[7] + else + push do + rule %r/^([ \t]*)(#{m[2]})/ do |mb| + pop! + token Text, mb[1] + token Punctuation, mb[2] + end + rule %r/^.*\n/ do |mb| + delegate sublexer, mb[1] + end + end + end + end + + rule %r/\n\n(( |\t).*?\n|\n)+/, Str::Backtick + + rule %r/(`+)(?:#{edot}|\n)+?\1/, Str::Backtick + + # various uses of * are in order of precedence + + # line breaks + rule %r/^(\s*[*]){3,}\s*$/, Punctuation + rule %r/^(\s*[-]){3,}\s*$/, Punctuation + + # bulleted lists + rule %r/^\s*[*+-](?=\s)/, Punctuation + + # numbered lists + rule %r/^\s*\d+\./, Punctuation + + # blockquotes + rule %r/^\s*>.*?$/, Generic::Traceback + + # link references + # [foo]: bar "baz" + rule %r(^ + (\s*) # leading whitespace + (\[) (#{edot}+?) (\]) # the reference + (\s*) (:) # colon + )x do + groups Text, Punctuation, Str::Symbol, Punctuation, Text, Punctuation + + push :title + push :url + end + + # links and images + rule %r/(!?\[)(#{edot}*?|[^\]]*?)(\])(?=[\[(])/ do + groups Punctuation, Name::Variable, Punctuation + push :link + end + + rule %r/[*][*]#{edot}*?[*][*]/, Generic::Strong + rule %r/__#{edot}*?__/, Generic::Strong + + rule %r/[*]#{edot}*?[*]/, Generic::Emph + rule %r/_#{edot}*?_/, Generic::Emph + + # Automatic links + rule %r/<.*?@.+[.].+>/, Name::Variable + rule %r[<(https?|mailto|ftp)://#{edot}*?>], Name::Variable + + rule %r/[^\\`\[*\n&<]+/, Text + + # inline html + rule(/&\S*;/) { delegate html } + rule(/<#{edot}*?>/) { delegate html } + rule %r/[&<]/, Text + + # An opening square bracket that is not a link + rule %r/\[/, Text + + rule %r/\n/, Text + end + + state :link do + rule %r/(\[)(#{edot}*?)(\])/ do + groups Punctuation, Str::Symbol, Punctuation + pop! + end + + rule %r/[(]/ do + token Punctuation + push :inline_title + push :inline_url + end + + rule %r/[ \t]+/, Text + + rule(//) { pop! } + end + + state :url do + rule %r/[ \t]+/, Text + + # the url + rule %r/(<)(#{edot}*?)(>)/ do + groups Name::Tag, Str::Other, Name::Tag + pop! + end + + rule %r/\S+/, Str::Other, :pop! + end + + state :title do + rule %r/"#{edot}*?"/, Name::Namespace + rule %r/'#{edot}*?'/, Name::Namespace + rule %r/[(]#{edot}*?[)]/, Name::Namespace + rule %r/\s*(?=["'()])/, Text + rule(//) { pop! } + end + + state :inline_title do + rule %r/[)]/, Punctuation, :pop! + mixin :title + end + + state :inline_url do + rule %r/[^<\s)]+/, Str::Other, :pop! + rule %r/\s+/m, Text + mixin :url + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mason.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mason.rb new file mode 100644 index 000000000000..06e9f9de0ec5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mason.rb @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Mason < TemplateLexer + title 'Mason' + desc 'The HTML::Mason framework (https://metacpan.org/pod/HTML::Mason)' + tag 'mason' + filenames '*.mi', '*.mc', '*.mas', '*.m', '*.mhtml', '*.mcomp', 'autohandler', 'dhandler' + mimetypes 'text/x-mason', 'application/x-mason' + + def initialize(*) + super + @perl = Perl.new + end + + # Note: If you add a tag in the lines below, you also need to modify "disambiguate '*.m'" in file disambiguation.rb + TEXT_BLOCKS = %w(text doc) + PERL_BLOCKS = %w(args flags attr init once shared perl cleanup filter) + COMPONENTS = %w(def method) + + state :root do + mixin :mason_tags + end + + state :mason_tags do + rule %r/\s+/, Text::Whitespace + + rule %r/<%(#{TEXT_BLOCKS.join('|')})>/oi, Comment::Preproc, :text_block + + rule %r/<%(#{PERL_BLOCKS.join('|')})>/oi, Comment::Preproc, :perl_block + + rule %r/(<%(#{COMPONENTS.join('|')}))([^>]*)(>)/oi do |m| + token Comment::Preproc, m[1] + token Name, m[3] + token Comment::Preproc, m[4] + push :component_block + end + + # perl line + rule %r/^(%)(.*)$/ do |m| + token Comment::Preproc, m[1] + delegate @perl, m[2] + end + + # start of component call + rule %r/<%/, Comment::Preproc, :component_call + + # start of component with content + rule %r/<&\|/ do + token Comment::Preproc + push :component_with_content + push :component_sub + end + + # start of component substitution + rule %r/<&/, Comment::Preproc, :component_sub + + # fallback to HTML until a mason tag is encountered + rule(/(.+?)(?=(<\/?&|<\/?%|^%|^#))/m) { delegate parent } + + # if we get here, there's no more mason tags, so we parse the rest of the doc as HTML + rule(/.+/m) { delegate parent } + end + + state :perl_block do + rule %r/<\/%(#{PERL_BLOCKS.join('|')})>/oi, Comment::Preproc, :pop! + rule %r/\s+/, Text::Whitespace + rule %r/^(#.*)$/, Comment + rule(/(.*?[^"])(?=<\/%)/m) { delegate @perl } + end + + state :text_block do + rule %r/<\/%(#{TEXT_BLOCKS.join('|')})>/oi, Comment::Preproc, :pop! + rule %r/\s+/, Text::Whitespace + rule %r/^(#.*)$/, Comment + rule %r/(.*?[^"])(?=<\/%)/m, Comment + end + + state :component_block do + rule %r/<\/%(#{COMPONENTS.join('|')})>/oi, Comment::Preproc, :pop! + rule %r/\s+/, Text::Whitespace + rule %r/^(#.*)$/, Comment + mixin :mason_tags + end + + state :component_with_content do + rule %r/<\/&>/ do + token Comment::Preproc + pop! + end + + mixin :mason_tags + end + + state :component_sub do + rule %r/&>/, Comment::Preproc, :pop! + + rule(/(.*?)(?=&>)/m) { delegate @perl } + end + + state :component_call do + rule %r/%>/, Comment::Preproc, :pop! + + rule(/(.*?)(?=%>)/m) { delegate @perl } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mathematica.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mathematica.rb new file mode 100644 index 000000000000..2fdeefc5a51f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mathematica.rb @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Mathematica < RegexLexer + title "Mathematica" + desc "Wolfram Mathematica, the world's definitive system for modern technical computing." + tag 'mathematica' + aliases 'wl' + filenames '*.m', '*.wl' + mimetypes 'application/vnd.wolfram.mathematica.package', 'application/vnd.wolfram.wl' + + # Mathematica has various input forms for numbers. We need to handle numbers in bases, precision, accuracy, + # and *^ scientific notation. All this works for integers and real numbers. Some examples + # 1 1234567 1.1 .3 0.2 1*^10 2*^+10 3*^-10 + # 1`1 1``1 1.2` 1.2``1.234*^-10 1.2``1.234*^+10 1.2``1.234*^10 + # 2^^01001 10^^1.2``20.1234*^-10 + base = /(?:\d+)/ + number = /(?:\.\d+|\d+\.\d*|\d+)/ + number_base = /(?:\.\w+|\w+\.\w*|\w+)/ + precision = /`(`?#{number})?/ + + operators = /[+\-*\/|,;.:@~=><&`'^?!_%]/ + braces = /[\[\](){}]/ + + string = /"(\\\\|\\"|[^"])*"/ + + # symbols and namespaced symbols. Note the special form \[Gamma] for named characters. These are also symbols. + # Module With Block Integrate Table Plot + # x32 $x x$ $Context` Context123`$x `Private`Context + # \[Gamma] \[Alpha]x32 Context`\[Xi] + identifier = /[a-zA-Z$][$a-zA-Z0-9]*/ + named_character = /\\\[#{identifier}\]/ + symbol = /(#{identifier}|#{named_character})+/ + context_symbol = /`?#{symbol}(`#{symbol})*`?/ + + # Slots for pure functions. + # Examples: # ## #1 ##3 #Test #"Test" #[Test] #["Test"] + association_slot = /#(#{identifier}|\"#{identifier}\")/ + slot = /#{association_slot}|#[0-9]*/ + + # Handling of message like symbol::usage or symbol::"argx" + message = /::(#{identifier}|#{string})/ + + # Highlighting of the special in and out markers that are prepended when you copy a cell + in_out = /(In|Out)\[[0-9]+\]:?=/ + + # Although Module, With and Block are normal built-in symbols, we give them a special treatment as they are + # the most important expressions for defining local variables + def self.keywords + @keywords = Set.new %w( + Module With Block + ) + end + + # The list of built-in symbols comes from a wolfram server and is created automatically by rake + def self.builtins + Kernel::load File.join(Lexers::BASE_DIR, 'mathematica/keywords.rb') + builtins + end + + state :root do + rule %r/\s+/, Text::Whitespace + rule %r/\(\*/, Comment, :comment + rule %r/#{base}\^\^#{number_base}#{precision}?(\*\^[+-]?\d+)?/, Num # a number with a base + rule %r/(?:#{number}#{precision}?(?:\*\^[+-]?\d+)?)/, Num # all other numbers + rule message, Name::Tag + rule in_out, Generic::Prompt + rule %r/#{context_symbol}/m do |m| + match = m[0] + if self.class.keywords.include? match + token Name::Builtin::Pseudo + elsif self.class.builtins.include? match + token Name::Builtin + else + token Name::Variable + end + end + rule slot, Name::Function + rule operators, Operator + rule braces, Punctuation + rule string, Str + end + + # Allow for nested comments and special treatment of ::Section:: or :Author: markup + state :comment do + rule %r/\(\*/, Comment, :comment + rule %r/\*\)/, Comment, :pop! + rule %r/::#{identifier}::/, Comment::Preproc + rule %r/[ ]:(#{identifier}|[^\S])+:[ ]/, Comment::Preproc + rule %r/./, Comment + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mathematica/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mathematica/keywords.rb new file mode 100644 index 000000000000..e9081da92d02 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mathematica/keywords.rb @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# DO NOT EDIT + +# This file is automatically generated by `rake builtins:mathematica`. +# See tasks/builtins/mathematica.rake for more info. + +module Rouge + module Lexers + class Mathematica + def self.builtins + @builtins ||= Set.new ["AASTriangle", "AngleVector", "AsymptoticDSolveValue", "AbelianGroup", "AngularGauge", "AsymptoticEqual", "Abort", "Animate", "AsymptoticEquivalent", "AbortKernels", "AnimationDirection", "AsymptoticGreater", "AbortProtect", "AnimationRate", "AsymptoticGreaterEqual", "Above", "AnimationRepetitions", "AsymptoticIntegrate", "Abs", "AnimationRunning", "AsymptoticLess", "AbsArg", "AnimationRunTime", "AsymptoticLessEqual", "AbsArgPlot", "AnimationTimeIndex", "AsymptoticOutputTracker", "AbsoluteCorrelation", "Animator", "AsymptoticProduct", "AbsoluteCorrelationFunction", "Annotate", "AsymptoticRSolveValue", "AbsoluteCurrentValue", "Annotation", "AsymptoticSolve", "AbsoluteDashing", "AnnotationDelete", "AsymptoticSum", "AbsoluteFileName", "AnnotationKeys", "Asynchronous", "AbsoluteOptions", "AnnotationRules", "Atom", "AbsolutePointSize", "AnnotationValue", "AtomCoordinates", "AbsoluteThickness", "Annuity", "AtomCount", "AbsoluteTime", "AnnuityDue", "AtomDiagramCoordinates", "AbsoluteTiming", "Annulus", "AtomList", "AcceptanceThreshold", "AnomalyDetection", "AtomQ", "AccountingForm", "AnomalyDetector", "AttentionLayer", "Accumulate", "AnomalyDetectorFunction", "Attributes", "Accuracy", "Anonymous", "Audio", "AccuracyGoal", "Antialiasing", "AudioAmplify", "ActionMenu", "AntihermitianMatrixQ", "AudioAnnotate", "Activate", "Antisymmetric", "AudioAnnotationLookup", "ActiveClassification", "AntisymmetricMatrixQ", "AudioBlockMap", "ActiveClassificationObject", "Antonyms", "AudioCapture", "ActivePrediction", "AnyOrder", "AudioChannelAssignment", "ActivePredictionObject", "AnySubset", "AudioChannelCombine", "ActiveStyle", "AnyTrue", "AudioChannelMix", "AcyclicGraphQ", "Apart", "AudioChannels", "AddSides", "ApartSquareFree", "AudioChannelSeparate", "AddTo", "APIFunction", "AudioData", "AddToSearchIndex", "Appearance", "AudioDelay", "AddUsers", "AppearanceElements", "AudioDelete", "AdjacencyGraph", "AppearanceRules", "AudioDistance", "AdjacencyList", "AppellF1", "AudioEncoding", "AdjacencyMatrix", "Append", "AudioFade", "AdjacentMeshCells", "AppendLayer", "AudioFrequencyShift", "AdjustmentBox", "AppendTo", "AudioGenerator", "AdjustmentBoxOptions", "Apply", "AudioIdentify", "AdjustTimeSeriesForecast", "ApplySides", "AudioInputDevice", "AdministrativeDivisionData", "ArcCos", "AudioInsert", "AffineHalfSpace", "ArcCosh", "AudioInstanceQ", "AffineSpace", "ArcCot", "AudioIntervals", "AffineStateSpaceModel", "ArcCoth", "AudioJoin", "AffineTransform", "ArcCsc", "AudioLabel", "After", "ArcCsch", "AudioLength", "AggregatedEntityClass", "ArcCurvature", "AudioLocalMeasurements", "AggregationLayer", "ARCHProcess", "AudioLoudness", "AircraftData", "ArcLength", "AudioMeasurements", "AirportData", "ArcSec", "AudioNormalize", "AirPressureData", "ArcSech", "AudioOutputDevice", "AirTemperatureData", "ArcSin", "AudioOverlay", "AiryAi", "ArcSinDistribution", "AudioPad", "AiryAiPrime", "ArcSinh", "AudioPan", "AiryAiZero", "ArcTan", "AudioPartition", "AiryBi", "ArcTanh", "AudioPause", "AiryBiPrime", "Area", "AudioPitchShift", "AiryBiZero", "Arg", "AudioPlay", "AlgebraicIntegerQ", "ArgMax", "AudioPlot", "AlgebraicNumber", "ArgMin", "AudioQ", "AlgebraicNumberDenominator", "ARIMAProcess", "AudioRecord", "AlgebraicNumberNorm", "ArithmeticGeometricMean", "AudioReplace", "AlgebraicNumberPolynomial", "ARMAProcess", "AudioResample", "AlgebraicNumberTrace", "Around", "AudioReverb", "Algebraics", "AroundReplace", "AudioReverse", "AlgebraicUnitQ", "ARProcess", "AudioSampleRate", "Alignment", "Array", "AudioSpectralMap", "AlignmentPoint", "ArrayComponents", "AudioSpectralTransformation", "All", "ArrayDepth", "AudioSplit", "AllowedCloudExtraParameters", "ArrayFilter", "AudioStop", "AllowedCloudParameterExtensions", "ArrayFlatten", "AudioStream", "AllowedDimensions", "ArrayMesh", "AudioStreams", "AllowedFrequencyRange", "ArrayPad", "AudioTimeStretch", "AllowedHeads", "ArrayPlot", "AudioTracks", "AllowGroupClose", "ArrayQ", "AudioTrim", "AllowInlineCells", "ArrayResample", "AudioType", "AllowLooseGrammar", "ArrayReshape", "AugmentedPolyhedron", "AllowReverseGroupClose", "ArrayRules", "AugmentedSymmetricPolynomial", "AllowVersionUpdate", "Arrays", "Authentication", "AllTrue", "Arrow", "AuthenticationDialog", "Alphabet", "Arrowheads", "AutoAction", "AlphabeticOrder", "ASATriangle", "Autocomplete", "AlphabeticSort", "Ask", "AutocompletionFunction", "AlphaChannel", "AskAppend", "AutoCopy", "AlternatingFactorial", "AskConfirm", "AutocorrelationTest", "AlternatingGroup", "AskDisplay", "AutoDelete", "AlternativeHypothesis", "AskedQ", "AutoIndent", "Alternatives", "AskedValue", "AutoItalicWords", "AltitudeMethod", "AskFunction", "Automatic", "AmbiguityFunction", "AskState", "AutoMultiplicationSymbol", "AmbiguityList", "AskTemplateDisplay", "AutoRefreshed", "AnatomyData", "AspectRatio", "AutoRemove", "AnatomyPlot3D", "Assert", "AutorunSequencing", "AnatomySkinStyle", "AssociateTo", "AutoScroll", "AnatomyStyling", "Association", "AutoSpacing", "AnchoredSearch", "AssociationFormat", "AutoSubmitting", "And", "AssociationMap", "Axes", "AndersonDarlingTest", "AssociationQ", "AxesEdge", "AngerJ", "AssociationThread", "AxesLabel", "AngleBisector", "AssumeDeterministic", "AxesOrigin", "AngleBracket", "Assuming", "AxesStyle", "AnglePath", "Assumptions", "AxiomaticTheory", "AnglePath3D", "Asymptotic", "Axis", "BabyMonsterGroupB", "BezierFunction", "BooleanCountingFunction", "Back", "BilateralFilter", "BooleanFunction", "Background", "Binarize", "BooleanGraph", "Backslash", "BinaryDeserialize", "BooleanMaxterms", "Backward", "BinaryDistance", "BooleanMinimize", "Ball", "BinaryFormat", "BooleanMinterms", "Band", "BinaryImageQ", "BooleanQ", "BandpassFilter", "BinaryRead", "BooleanRegion", "BandstopFilter", "BinaryReadList", "Booleans", "BarabasiAlbertGraphDistribution", "BinarySerialize", "BooleanStrings", "BarChart", "BinaryWrite", "BooleanTable", "BarChart3D", "BinCounts", "BooleanVariables", "BarcodeImage", "BinLists", "BorderDimensions", "BarcodeRecognize", "Binomial", "BorelTannerDistribution", "BaringhausHenzeTest", "BinomialDistribution", "Bottom", "BarLegend", "BinomialProcess", "BottomHatTransform", "BarlowProschanImportance", "BinormalDistribution", "BoundaryDiscretizeGraphics", "BarnesG", "BiorthogonalSplineWavelet", "BoundaryDiscretizeRegion", "BarOrigin", "BipartiteGraphQ", "BoundaryMesh", "BarSpacing", "BiquadraticFilterModel", "BoundaryMeshRegion", "BartlettHannWindow", "BirnbaumImportance", "BoundaryMeshRegionQ", "BartlettWindow", "BirnbaumSaundersDistribution", "BoundaryStyle", "BaseDecode", "BitAnd", "BoundedRegionQ", "BaseEncode", "BitClear", "BoundingRegion", "BaseForm", "BitGet", "BoxData", "Baseline", "BitLength", "Boxed", "BaselinePosition", "BitNot", "Boxes", "BaseStyle", "BitOr", "BoxMatrix", "BasicRecurrentLayer", "BitSet", "BoxObject", "BatchNormalizationLayer", "BitShiftLeft", "BoxRatios", "BatchSize", "BitShiftRight", "BoxStyle", "BatesDistribution", "BitXor", "BoxWhiskerChart", "BattleLemarieWavelet", "BiweightLocation", "BracketingBar", "BayesianMaximization", "BiweightMidvariance", "BrayCurtisDistance", "BayesianMaximizationObject", "Black", "BreadthFirstScan", "BayesianMinimization", "BlackmanHarrisWindow", "Break", "BayesianMinimizationObject", "BlackmanNuttallWindow", "BridgeData", "Because", "BlackmanWindow", "BrightnessEqualize", "BeckmannDistribution", "Blank", "BroadcastStationData", "Beep", "BlankNullSequence", "Brown", "Before", "BlankSequence", "BrownForsytheTest", "Begin", "Blend", "BrownianBridgeProcess", "BeginDialogPacket", "Block", "BSplineBasis", "BeginPackage", "BlockchainAddressData", "BSplineCurve", "BellB", "BlockchainBase", "BSplineFunction", "BellY", "BlockchainBlockData", "BSplineSurface", "Below", "BlockchainContractValue", "BubbleChart", "BenfordDistribution", "BlockchainData", "BubbleChart3D", "BeniniDistribution", "BlockchainGet", "BubbleScale", "BenktanderGibratDistribution", "BlockchainKeyEncode", "BubbleSizes", "BenktanderWeibullDistribution", "BlockchainPut", "BuildingData", "BernoulliB", "BlockchainTokenData", "BulletGauge", "BernoulliDistribution", "BlockchainTransaction", "BusinessDayQ", "BernoulliGraphDistribution", "BlockchainTransactionData", "ButterflyGraph", "BernoulliProcess", "BlockchainTransactionSign", "ButterworthFilterModel", "BernsteinBasis", "BlockchainTransactionSubmit", "Button", "BesselFilterModel", "BlockMap", "ButtonBar", "BesselI", "BlockRandom", "ButtonBox", "BesselJ", "BlomqvistBeta", "ButtonBoxOptions", "BesselJZero", "BlomqvistBetaTest", "ButtonData", "BesselK", "Blue", "ButtonFunction", "BesselY", "Blur", "ButtonMinHeight", "BesselYZero", "BodePlot", "ButtonNotebook", "Beta", "BohmanWindow", "ButtonSource", "BetaBinomialDistribution", "Bold", "Byte", "BetaDistribution", "Bond", "ByteArray", "BetaNegativeBinomialDistribution", "BondCount", "ByteArrayFormat", "BetaPrimeDistribution", "BondList", "ByteArrayQ", "BetaRegularized", "BondQ", "ByteArrayToString", "Between", "Bookmarks", "ByteCount", "BetweennessCentrality", "Boole", "ByteOrdering", "BeveledPolyhedron", "BooleanConsecutiveFunction", "BezierCurve", "BooleanConvert", "C", "ClearSystemCache", "Construct", "CachePersistence", "ClebschGordan", "Containing", "CalendarConvert", "ClickPane", "ContainsAll", "CalendarData", "Clip", "ContainsAny", "CalendarType", "ClippingStyle", "ContainsExactly", "Callout", "ClipPlanes", "ContainsNone", "CalloutMarker", "ClipPlanesStyle", "ContainsOnly", "CalloutStyle", "ClipRange", "ContentFieldOptions", "CallPacket", "Clock", "ContentLocationFunction", "CanberraDistance", "ClockGauge", "ContentObject", "Cancel", "Close", "ContentPadding", "CancelButton", "CloseKernels", "ContentSelectable", "CandlestickChart", "ClosenessCentrality", "ContentSize", "CanonicalGraph", "Closing", "Context", "CanonicalizePolygon", "CloudAccountData", "Contexts", "CanonicalizePolyhedron", "CloudBase", "ContextToFileName", "CanonicalName", "CloudConnect", "Continue", "CanonicalWarpingCorrespondence", "CloudDeploy", "ContinuedFraction", "CanonicalWarpingDistance", "CloudDirectory", "ContinuedFractionK", "CantorMesh", "CloudDisconnect", "ContinuousAction", "CantorStaircase", "CloudEvaluate", "ContinuousMarkovProcess", "Cap", "CloudExport", "ContinuousTask", "CapForm", "CloudExpression", "ContinuousTimeModelQ", "CapitalDifferentialD", "CloudExpressions", "ContinuousWaveletData", "Capitalize", "CloudFunction", "ContinuousWaveletTransform", "CapsuleShape", "CloudGet", "ContourDetect", "CaptureRunning", "CloudImport", "ContourLabels", "CarlemanLinearize", "CloudLoggingData", "ContourPlot", "CarmichaelLambda", "CloudObject", "ContourPlot3D", "CaseOrdering", "CloudObjectNameFormat", "Contours", "Cases", "CloudObjects", "ContourShading", "CaseSensitive", "CloudObjectURLType", "ContourStyle", "Cashflow", "CloudPublish", "ContraharmonicMean", "Casoratian", "CloudPut", "ContrastiveLossLayer", "Catalan", "CloudRenderingMethod", "Control", "CatalanNumber", "CloudSave", "ControlActive", "Catch", "CloudShare", "ControllabilityGramian", "CategoricalDistribution", "CloudSubmit", "ControllabilityMatrix", "Catenate", "CloudSymbol", "ControllableDecomposition", "CatenateLayer", "CloudUnshare", "ControllableModelQ", "CauchyDistribution", "ClusterClassify", "ControllerInformation", "CauchyWindow", "ClusterDissimilarityFunction", "ControllerLinking", "CayleyGraph", "ClusteringComponents", "ControllerManipulate", "CDF", "ClusteringTree", "ControllerMethod", "CDFDeploy", "CMYKColor", "ControllerPath", "CDFWavelet", "CodeAssistOptions", "ControllerState", "Ceiling", "Coefficient", "ControlPlacement", "CelestialSystem", "CoefficientArrays", "ControlsRendering", "Cell", "CoefficientList", "ControlType", "CellAutoOverwrite", "CoefficientRules", "Convergents", "CellBaseline", "CoifletWavelet", "ConversionRules", "CellBracketOptions", "Collect", "ConvexHullMesh", "CellChangeTimes", "Colon", "ConvexPolygonQ", "CellContext", "ColorBalance", "ConvexPolyhedronQ", "CellDingbat", "ColorCombine", "ConvolutionLayer", "CellDynamicExpression", "ColorConvert", "Convolve", "CellEditDuplicate", "ColorCoverage", "ConwayGroupCo1", "CellEpilog", "ColorData", "ConwayGroupCo2", "CellEvaluationDuplicate", "ColorDataFunction", "ConwayGroupCo3", "CellEvaluationFunction", "ColorDetect", "CookieFunction", "CellEventActions", "ColorDistance", "CoordinateBoundingBox", "CellFrame", "ColorFunction", "CoordinateBoundingBoxArray", "CellFrameColor", "ColorFunctionScaling", "CoordinateBounds", "CellFrameLabelMargins", "Colorize", "CoordinateBoundsArray", "CellFrameLabels", "ColorNegate", "CoordinateChartData", "CellFrameMargins", "ColorProfileData", "CoordinatesToolOptions", "CellGroup", "ColorQ", "CoordinateTransform", "CellGroupData", "ColorQuantize", "CoordinateTransformData", "CellGrouping", "ColorReplace", "CoprimeQ", "CellID", "ColorRules", "Coproduct", "CellLabel", "ColorSeparate", "CopulaDistribution", "CellLabelAutoDelete", "ColorSetter", "Copyable", "CellLabelStyle", "ColorSlider", "CopyDatabin", "CellMargins", "ColorsNear", "CopyDirectory", "CellObject", "ColorSpace", "CopyFile", "CellOpen", "ColorToneMapping", "CopyToClipboard", "CellPrint", "Column", "CornerFilter", "CellProlog", "ColumnAlignments", "CornerNeighbors", "Cells", "ColumnLines", "Correlation", "CellStyle", "ColumnsEqual", "CorrelationDistance", "CellTags", "ColumnSpacings", "CorrelationFunction", "CellularAutomaton", "ColumnWidths", "CorrelationTest", "CensoredDistribution", "CombinedEntityClass", "Cos", "Censoring", "CombinerFunction", "Cosh", "Center", "CometData", "CoshIntegral", "CenterArray", "Commonest", "CosineDistance", "CenterDot", "CommonestFilter", "CosineWindow", "CentralFeature", "CommonName", "CosIntegral", "CentralMoment", "CommonUnits", "Cot", "CentralMomentGeneratingFunction", "CommunityBoundaryStyle", "Coth", "Cepstrogram", "CommunityGraphPlot", "Count", "CepstrogramArray", "CommunityLabels", "CountDistinct", "CepstrumArray", "CommunityRegionStyle", "CountDistinctBy", "CForm", "CompanyData", "CountRoots", "ChampernowneNumber", "CompatibleUnitQ", "CountryData", "ChannelBase", "CompilationOptions", "Counts", "ChannelBrokerAction", "CompilationTarget", "CountsBy", "ChannelHistoryLength", "Compile", "Covariance", "ChannelListen", "Compiled", "CovarianceEstimatorFunction", "ChannelListener", "CompiledCodeFunction", "CovarianceFunction", "ChannelListeners", "CompiledFunction", "CoxianDistribution", "ChannelObject", "CompilerOptions", "CoxIngersollRossProcess", "ChannelReceiverFunction", "Complement", "CoxModel", "ChannelSend", "ComplementedEntityClass", "CoxModelFit", "ChannelSubscribers", "CompleteGraph", "CramerVonMisesTest", "ChanVeseBinarize", "CompleteGraphQ", "CreateArchive", "Character", "CompleteKaryTree", "CreateCellID", "CharacterCounts", "Complex", "CreateChannel", "CharacterEncoding", "ComplexContourPlot", "CreateCloudExpression", "CharacteristicFunction", "Complexes", "CreateDatabin", "CharacteristicPolynomial", "ComplexExpand", "CreateDataStructure", "CharacterName", "ComplexInfinity", "CreateDataSystemModel", "CharacterNormalize", "ComplexityFunction", "CreateDialog", "CharacterRange", "ComplexListPlot", "CreateDirectory", "Characters", "ComplexPlot", "CreateDocument", "ChartBaseStyle", "ComplexPlot3D", "CreateFile", "ChartElementFunction", "ComplexRegionPlot", "CreateIntermediateDirectories", "ChartElements", "ComplexStreamPlot", "CreateManagedLibraryExpression", "ChartLabels", "ComplexVectorPlot", "CreateNotebook", "ChartLayout", "ComponentMeasurements", "CreatePacletArchive", "ChartLegends", "ComposeList", "CreatePalette", "ChartStyle", "ComposeSeries", "CreatePermissionsGroup", "Chebyshev1FilterModel", "CompositeQ", "CreateSearchIndex", "Chebyshev2FilterModel", "Composition", "CreateSystemModel", "ChebyshevT", "CompoundElement", "CreateUUID", "ChebyshevU", "CompoundExpression", "CreateWindow", "Check", "CompoundPoissonDistribution", "CriterionFunction", "CheckAbort", "CompoundPoissonProcess", "CriticalityFailureImportance", "Checkbox", "CompoundRenewalProcess", "CriticalitySuccessImportance", "CheckboxBar", "Compress", "CriticalSection", "ChemicalData", "CompressionLevel", "Cross", "ChessboardDistance", "ComputeUncertainty", "CrossEntropyLossLayer", "ChiDistribution", "Condition", "CrossingCount", "ChineseRemainder", "ConditionalExpression", "CrossingDetect", "ChiSquareDistribution", "Conditioned", "CrossingPolygon", "ChoiceButtons", "Cone", "CrossMatrix", "ChoiceDialog", "ConfidenceLevel", "Csc", "CholeskyDecomposition", "ConfidenceRange", "Csch", "Chop", "ConfidenceTransform", "CTCLossLayer", "ChromaticityPlot", "ConformAudio", "Cube", "ChromaticityPlot3D", "ConformImages", "CubeRoot", "ChromaticPolynomial", "Congruent", "Cubics", "Circle", "ConicHullRegion", "Cuboid", "CircleDot", "ConicOptimization", "Cumulant", "CircleMinus", "Conjugate", "CumulantGeneratingFunction", "CirclePlus", "ConjugateTranspose", "Cup", "CirclePoints", "Conjunction", "CupCap", "CircleThrough", "ConnectedComponents", "Curl", "CircleTimes", "ConnectedGraphComponents", "CurrencyConvert", "CirculantGraph", "ConnectedGraphQ", "CurrentDate", "CircularOrthogonalMatrixDistribution", "ConnectedMeshComponents", "CurrentImage", "CircularQuaternionMatrixDistribution", "ConnectedMoleculeComponents", "CurrentNotebookImage", "CircularRealMatrixDistribution", "ConnectedMoleculeQ", "CurrentScreenImage", "CircularSymplecticMatrixDistribution", "ConnectionSettings", "CurrentValue", "CircularUnitaryMatrixDistribution", "ConnectLibraryCallbackFunction", "CurryApplied", "Circumsphere", "ConnectSystemModelComponents", "CurvatureFlowFilter", "CityData", "ConnesWindow", "CurveClosed", "ClassifierFunction", "ConoverTest", "Cyan", "ClassifierMeasurements", "Constant", "CycleGraph", "ClassifierMeasurementsObject", "ConstantArray", "CycleIndexPolynomial", "Classify", "ConstantArrayLayer", "Cycles", "ClassPriors", "ConstantImage", "CyclicGroup", "Clear", "ConstantPlusLayer", "Cyclotomic", "ClearAll", "ConstantRegionQ", "Cylinder", "ClearAttributes", "Constants", "CylindricalDecomposition", "ClearCookies", "ConstantTimesLayer", "ClearPermissions", "ConstellationData", "D", "DeleteFile", "DiscreteLyapunovSolve", "DagumDistribution", "DeleteMissing", "DiscreteMarkovProcess", "DamData", "DeleteObject", "DiscreteMaxLimit", "DamerauLevenshteinDistance", "DeletePermissionsKey", "DiscreteMinLimit", "Darker", "DeleteSearchIndex", "DiscretePlot", "Dashed", "DeleteSmallComponents", "DiscretePlot3D", "Dashing", "DeleteStopwords", "DiscreteRatio", "DatabaseConnect", "DelimitedSequence", "DiscreteRiccatiSolve", "DatabaseDisconnect", "Delimiter", "DiscreteShift", "DatabaseReference", "DelimiterFlashTime", "DiscreteTimeModelQ", "Databin", "Delimiters", "DiscreteUniformDistribution", "DatabinAdd", "DeliveryFunction", "DiscreteVariables", "DatabinRemove", "Dendrogram", "DiscreteWaveletData", "Databins", "Denominator", "DiscreteWaveletPacketTransform", "DatabinUpload", "DensityHistogram", "DiscreteWaveletTransform", "DataDistribution", "DensityPlot", "DiscretizeGraphics", "DataRange", "DensityPlot3D", "DiscretizeRegion", "DataReversed", "DependentVariables", "Discriminant", "Dataset", "Deploy", "DisjointQ", "DataStructure", "Deployed", "Disjunction", "DataStructureQ", "Depth", "Disk", "DateBounds", "DepthFirstScan", "DiskMatrix", "Dated", "Derivative", "DiskSegment", "DateDifference", "DerivativeFilter", "Dispatch", "DatedUnit", "DerivedKey", "DispersionEstimatorFunction", "DateFormat", "DescriptorStateSpace", "DisplayAllSteps", "DateFunction", "DesignMatrix", "DisplayEndPacket", "DateHistogram", "Det", "DisplayForm", "DateInterval", "DeviceClose", "DisplayFunction", "DateList", "DeviceConfigure", "DisplayPacket", "DateListLogPlot", "DeviceExecute", "DistanceFunction", "DateListPlot", "DeviceExecuteAsynchronous", "DistanceMatrix", "DateListStepPlot", "DeviceObject", "DistanceTransform", "DateObject", "DeviceOpen", "Distribute", "DateObjectQ", "DeviceRead", "Distributed", "DateOverlapsQ", "DeviceReadBuffer", "DistributedContexts", "DatePattern", "DeviceReadLatest", "DistributeDefinitions", "DatePlus", "DeviceReadList", "DistributionChart", "DateRange", "DeviceReadTimeSeries", "DistributionFitTest", "DateReduction", "Devices", "DistributionParameterAssumptions", "DateString", "DeviceStreams", "DistributionParameterQ", "DateTicksFormat", "DeviceWrite", "Dithering", "DateValue", "DeviceWriteBuffer", "Div", "DateWithinQ", "DGaussianWavelet", "Divide", "DaubechiesWavelet", "Diagonal", "DivideBy", "DavisDistribution", "DiagonalizableMatrixQ", "Dividers", "DawsonF", "DiagonalMatrix", "DivideSides", "DayCount", "DiagonalMatrixQ", "Divisible", "DayCountConvention", "Dialog", "Divisors", "DayHemisphere", "DialogInput", "DivisorSigma", "DaylightQ", "DialogNotebook", "DivisorSum", "DayMatchQ", "DialogProlog", "DMSList", "DayName", "DialogReturn", "DMSString", "DayNightTerminator", "DialogSymbols", "Do", "DayPlus", "Diamond", "DockedCells", "DayRange", "DiamondMatrix", "DocumentGenerator", "DayRound", "DiceDissimilarity", "DocumentGeneratorInformation", "DeBruijnGraph", "DictionaryLookup", "DocumentGenerators", "DeBruijnSequence", "DictionaryWordQ", "DocumentNotebook", "Decapitalize", "DifferenceDelta", "DocumentWeightingRules", "DecimalForm", "DifferenceQuotient", "Dodecahedron", "DeclarePackage", "DifferenceRoot", "DominantColors", "Decompose", "DifferenceRootReduce", "Dot", "DeconvolutionLayer", "Differences", "DotDashed", "Decrement", "DifferentialD", "DotEqual", "Decrypt", "DifferentialRoot", "DotLayer", "DecryptFile", "DifferentialRootReduce", "Dotted", "DedekindEta", "DifferentiatorFilter", "DoubleBracketingBar", "DeepSpaceProbeData", "DigitalSignature", "DoubleDownArrow", "Default", "DigitBlock", "DoubleLeftArrow", "DefaultAxesStyle", "DigitCharacter", "DoubleLeftRightArrow", "DefaultBaseStyle", "DigitCount", "DoubleLeftTee", "DefaultBoxStyle", "DigitQ", "DoubleLongLeftArrow", "DefaultButton", "DihedralAngle", "DoubleLongLeftRightArrow", "DefaultDuplicateCellStyle", "DihedralGroup", "DoubleLongRightArrow", "DefaultDuration", "Dilation", "DoubleRightArrow", "DefaultElement", "DimensionalCombinations", "DoubleRightTee", "DefaultFaceGridsStyle", "DimensionalMeshComponents", "DoubleUpArrow", "DefaultFieldHintStyle", "DimensionReduce", "DoubleUpDownArrow", "DefaultFrameStyle", "DimensionReducerFunction", "DoubleVerticalBar", "DefaultFrameTicksStyle", "DimensionReduction", "DownArrow", "DefaultGridLinesStyle", "Dimensions", "DownArrowBar", "DefaultLabelStyle", "DiracComb", "DownArrowUpArrow", "DefaultMenuStyle", "DiracDelta", "DownLeftRightVector", "DefaultNaturalLanguage", "DirectedEdge", "DownLeftTeeVector", "DefaultNewCellStyle", "DirectedEdges", "DownLeftVector", "DefaultOptions", "DirectedGraph", "DownLeftVectorBar", "DefaultPrintPrecision", "DirectedGraphQ", "DownRightTeeVector", "DefaultTicksStyle", "DirectedInfinity", "DownRightVector", "DefaultTooltipStyle", "Direction", "DownRightVectorBar", "Defer", "Directive", "Downsample", "DefineInputStreamMethod", "Directory", "DownTee", "DefineOutputStreamMethod", "DirectoryName", "DownTeeArrow", "DefineResourceFunction", "DirectoryQ", "DownValues", "Definition", "DirectoryStack", "Drop", "Degree", "DirichletBeta", "DropoutLayer", "DegreeCentrality", "DirichletCharacter", "DSolve", "DegreeGraphDistribution", "DirichletCondition", "DSolveValue", "DEigensystem", "DirichletConvolve", "Dt", "DEigenvalues", "DirichletDistribution", "DualPolyhedron", "Deinitialization", "DirichletEta", "DualSystemsModel", "Del", "DirichletL", "DumpSave", "DelaunayMesh", "DirichletLambda", "DuplicateFreeQ", "Delayed", "DirichletTransform", "Duration", "Deletable", "DirichletWindow", "Dynamic", "Delete", "DisableFormatting", "DynamicEvaluationTimeout", "DeleteAnomalies", "DiscreteAsymptotic", "DynamicGeoGraphics", "DeleteBorderComponents", "DiscreteChirpZTransform", "DynamicImage", "DeleteCases", "DiscreteConvolve", "DynamicModule", "DeleteChannel", "DiscreteDelta", "DynamicModuleValues", "DeleteCloudExpression", "DiscreteHadamardTransform", "DynamicSetting", "DeleteContents", "DiscreteIndicator", "DynamicUpdating", "DeleteDirectory", "DiscreteLimit", "DynamicWrapper", "DeleteDuplicates", "DiscreteLQEstimatorGains", "DeleteDuplicatesBy", "DiscreteLQRegulatorGains", "E", "EndOfFile", "EventHandler", "EarthImpactData", "EndOfLine", "EventLabels", "EarthquakeData", "EndOfString", "EventSeries", "EccentricityCentrality", "EndPackage", "ExactBlackmanWindow", "Echo", "EngineeringForm", "ExactNumberQ", "EchoFunction", "EnterExpressionPacket", "ExampleData", "EclipseType", "EnterTextPacket", "Except", "EdgeAdd", "Entity", "ExcludedForms", "EdgeBetweennessCentrality", "EntityClass", "ExcludedLines", "EdgeCapacity", "EntityClassList", "ExcludedPhysicalQuantities", "EdgeConnectivity", "EntityCopies", "ExcludePods", "EdgeContract", "EntityFunction", "Exclusions", "EdgeCost", "EntityGroup", "ExclusionsStyle", "EdgeCount", "EntityInstance", "Exists", "EdgeCoverQ", "EntityList", "Exit", "EdgeCycleMatrix", "EntityPrefetch", "ExoplanetData", "EdgeDelete", "EntityProperties", "Exp", "EdgeDetect", "EntityProperty", "Expand", "EdgeForm", "EntityPropertyClass", "ExpandAll", "EdgeIndex", "EntityRegister", "ExpandDenominator", "EdgeLabels", "EntityStore", "ExpandFileName", "EdgeLabelStyle", "EntityStores", "ExpandNumerator", "EdgeList", "EntityTypeName", "Expectation", "EdgeQ", "EntityUnregister", "ExpGammaDistribution", "EdgeRules", "EntityValue", "ExpIntegralE", "EdgeShapeFunction", "Entropy", "ExpIntegralEi", "EdgeStyle", "EntropyFilter", "ExpirationDate", "EdgeTaggedGraph", "Environment", "Exponent", "EdgeTaggedGraphQ", "Epilog", "ExponentFunction", "EdgeTags", "EpilogFunction", "ExponentialDistribution", "EdgeWeight", "Equal", "ExponentialFamily", "EdgeWeightedGraphQ", "EqualTilde", "ExponentialGeneratingFunction", "Editable", "EqualTo", "ExponentialMovingAverage", "EditDistance", "Equilibrium", "ExponentialPowerDistribution", "EffectiveInterest", "EquirippleFilterKernel", "ExponentStep", "Eigensystem", "Equivalent", "Export", "Eigenvalues", "Erf", "ExportByteArray", "EigenvectorCentrality", "Erfc", "ExportForm", "Eigenvectors", "Erfi", "ExportString", "Element", "ErlangB", "Expression", "ElementData", "ErlangC", "ExpressionCell", "ElementwiseLayer", "ErlangDistribution", "ExpressionGraph", "ElidedForms", "Erosion", "ExpToTrig", "Eliminate", "ErrorBox", "ExtendedEntityClass", "Ellipsoid", "EscapeRadius", "ExtendedGCD", "EllipticE", "EstimatedBackground", "Extension", "EllipticExp", "EstimatedDistribution", "ExtentElementFunction", "EllipticExpPrime", "EstimatedProcess", "ExtentMarkers", "EllipticF", "EstimatorGains", "ExtentSize", "EllipticFilterModel", "EstimatorRegulator", "ExternalBundle", "EllipticK", "EuclideanDistance", "ExternalEvaluate", "EllipticLog", "EulerAngles", "ExternalFunction", "EllipticNomeQ", "EulerCharacteristic", "ExternalIdentifier", "EllipticPi", "EulerE", "ExternalObject", "EllipticTheta", "EulerGamma", "ExternalOptions", "EllipticThetaPrime", "EulerianGraphQ", "ExternalSessionObject", "EmbedCode", "EulerMatrix", "ExternalSessions", "EmbeddedHTML", "EulerPhi", "ExternalStorageBase", "EmbeddedService", "Evaluatable", "ExternalStorageDownload", "EmbeddingLayer", "Evaluate", "ExternalStorageGet", "EmitSound", "EvaluatePacket", "ExternalStorageObject", "EmpiricalDistribution", "EvaluationBox", "ExternalStoragePut", "EmptyGraphQ", "EvaluationCell", "ExternalStorageUpload", "EmptyRegion", "EvaluationData", "ExternalTypeSignature", "Enabled", "EvaluationElements", "ExternalValue", "Encode", "EvaluationEnvironment", "Extract", "Encrypt", "EvaluationMonitor", "ExtractArchive", "EncryptedObject", "EvaluationNotebook", "ExtractLayer", "EncryptFile", "EvaluationObject", "ExtractPacletArchive", "End", "Evaluator", "ExtremeValueDistribution", "EndDialogPacket", "EvenQ", "EndOfBuffer", "EventData", "FaceAlign", "FindFaces", "ForceVersionInstall", "FaceForm", "FindFile", "Format", "FaceGrids", "FindFit", "FormatType", "FaceGridsStyle", "FindFormula", "FormBox", "FacialFeatures", "FindFundamentalCycles", "FormBoxOptions", "Factor", "FindGeneratingFunction", "FormControl", "Factorial", "FindGeoLocation", "FormFunction", "Factorial2", "FindGeometricConjectures", "FormLayoutFunction", "FactorialMoment", "FindGeometricTransform", "FormObject", "FactorialMomentGeneratingFunction", "FindGraphCommunities", "FormPage", "FactorialPower", "FindGraphIsomorphism", "FormulaData", "FactorInteger", "FindGraphPartition", "FormulaLookup", "FactorList", "FindHamiltonianCycle", "FortranForm", "FactorSquareFree", "FindHamiltonianPath", "Forward", "FactorSquareFreeList", "FindHiddenMarkovStates", "ForwardBackward", "FactorTerms", "FindImageText", "Fourier", "FactorTermsList", "FindIndependentEdgeSet", "FourierCoefficient", "Failure", "FindIndependentVertexSet", "FourierCosCoefficient", "FailureAction", "FindInstance", "FourierCosSeries", "FailureDistribution", "FindIntegerNullVector", "FourierCosTransform", "FailureQ", "FindKClan", "FourierDCT", "False", "FindKClique", "FourierDCTFilter", "FareySequence", "FindKClub", "FourierDCTMatrix", "FARIMAProcess", "FindKPlex", "FourierDST", "FeatureDistance", "FindLibrary", "FourierDSTMatrix", "FeatureExtract", "FindLinearRecurrence", "FourierMatrix", "FeatureExtraction", "FindList", "FourierParameters", "FeatureExtractor", "FindMatchingColor", "FourierSequenceTransform", "FeatureExtractorFunction", "FindMaximum", "FourierSeries", "FeatureNames", "FindMaximumCut", "FourierSinCoefficient", "FeatureNearest", "FindMaximumFlow", "FourierSinSeries", "FeatureSpacePlot", "FindMaxValue", "FourierSinTransform", "FeatureSpacePlot3D", "FindMeshDefects", "FourierTransform", "FeatureTypes", "FindMinimum", "FourierTrigSeries", "FeedbackLinearize", "FindMinimumCostFlow", "FractionalBrownianMotionProcess", "FeedbackSector", "FindMinimumCut", "FractionalGaussianNoiseProcess", "FeedbackSectorStyle", "FindMinValue", "FractionalPart", "FeedbackType", "FindMoleculeSubstructure", "FractionBox", "FetalGrowthData", "FindPath", "FractionBoxOptions", "Fibonacci", "FindPeaks", "Frame", "Fibonorial", "FindPermutation", "FrameBox", "FieldCompletionFunction", "FindPostmanTour", "FrameBoxOptions", "FieldHint", "FindProcessParameters", "Framed", "FieldHintStyle", "FindRepeat", "FrameLabel", "FieldMasked", "FindRoot", "FrameMargins", "FieldSize", "FindSequenceFunction", "FrameRate", "File", "FindSettings", "FrameStyle", "FileBaseName", "FindShortestPath", "FrameTicks", "FileByteCount", "FindShortestTour", "FrameTicksStyle", "FileConvert", "FindSpanningTree", "FRatioDistribution", "FileDate", "FindSystemModelEquilibrium", "FrechetDistribution", "FileExistsQ", "FindTextualAnswer", "FreeQ", "FileExtension", "FindThreshold", "FrenetSerretSystem", "FileFormat", "FindTransientRepeat", "FrequencySamplingFilterKernel", "FileHash", "FindVertexCover", "FresnelC", "FileNameDepth", "FindVertexCut", "FresnelF", "FileNameDrop", "FindVertexIndependentPaths", "FresnelG", "FileNameForms", "FinishDynamic", "FresnelS", "FileNameJoin", "FiniteAbelianGroupCount", "Friday", "FileNames", "FiniteGroupCount", "FrobeniusNumber", "FileNameSetter", "FiniteGroupData", "FrobeniusSolve", "FileNameSplit", "First", "FromAbsoluteTime", "FileNameTake", "FirstCase", "FromCharacterCode", "FilePrint", "FirstPassageTimeDistribution", "FromCoefficientRules", "FileSize", "FirstPosition", "FromContinuedFraction", "FileSystemMap", "FischerGroupFi22", "FromDigits", "FileSystemScan", "FischerGroupFi23", "FromDMS", "FileTemplate", "FischerGroupFi24Prime", "FromEntity", "FileTemplateApply", "FisherHypergeometricDistribution", "FromJulianDate", "FileType", "FisherRatioTest", "FromLetterNumber", "FilledCurve", "FisherZDistribution", "FromPolarCoordinates", "Filling", "Fit", "FromRomanNumeral", "FillingStyle", "FitRegularization", "FromSphericalCoordinates", "FillingTransform", "FittedModel", "FromUnixTime", "FilteredEntityClass", "FixedOrder", "Front", "FilterRules", "FixedPoint", "FrontEndDynamicExpression", "FinancialBond", "FixedPointList", "FrontEndEventActions", "FinancialData", "Flat", "FrontEndExecute", "FinancialDerivative", "Flatten", "FrontEndToken", "FinancialIndicator", "FlattenAt", "FrontEndTokenExecute", "Find", "FlattenLayer", "Full", "FindAnomalies", "FlatTopWindow", "FullDefinition", "FindArgMax", "FlipView", "FullForm", "FindArgMin", "Floor", "FullGraphics", "FindChannels", "FlowPolynomial", "FullInformationOutputRegulator", "FindClique", "Fold", "FullRegion", "FindClusters", "FoldList", "FullSimplify", "FindCookies", "FoldPair", "Function", "FindCurvePath", "FoldPairList", "FunctionCompile", "FindCycle", "FollowRedirects", "FunctionCompileExport", "FindDevices", "FontColor", "FunctionCompileExportByteArray", "FindDistribution", "FontFamily", "FunctionCompileExportLibrary", "FindDistributionParameters", "FontSize", "FunctionCompileExportString", "FindDivisions", "FontSlant", "FunctionDomain", "FindEdgeCover", "FontSubstitutions", "FunctionExpand", "FindEdgeCut", "FontTracking", "FunctionInterpolation", "FindEdgeIndependentPaths", "FontVariations", "FunctionPeriod", "FindEquationalProof", "FontWeight", "FunctionRange", "FindEulerianCycle", "For", "FunctionSpace", "FindExternalEvaluators", "ForAll", "FussellVeselyImportance", "GaborFilter", "GeoGraphics", "Graph", "GaborMatrix", "GeogravityModelData", "Graph3D", "GaborWavelet", "GeoGridDirectionDifference", "GraphAssortativity", "GainMargins", "GeoGridLines", "GraphAutomorphismGroup", "GainPhaseMargins", "GeoGridLinesStyle", "GraphCenter", "GalaxyData", "GeoGridPosition", "GraphComplement", "GalleryView", "GeoGridRange", "GraphData", "Gamma", "GeoGridRangePadding", "GraphDensity", "GammaDistribution", "GeoGridUnitArea", "GraphDiameter", "GammaRegularized", "GeoGridUnitDistance", "GraphDifference", "GapPenalty", "GeoGridVector", "GraphDisjointUnion", "GARCHProcess", "GeoGroup", "GraphDistance", "GatedRecurrentLayer", "GeoHemisphere", "GraphDistanceMatrix", "Gather", "GeoHemisphereBoundary", "GraphEmbedding", "GatherBy", "GeoHistogram", "GraphHighlight", "GaugeFaceElementFunction", "GeoIdentify", "GraphHighlightStyle", "GaugeFaceStyle", "GeoImage", "GraphHub", "GaugeFrameElementFunction", "GeoLabels", "Graphics", "GaugeFrameSize", "GeoLength", "Graphics3D", "GaugeFrameStyle", "GeoListPlot", "GraphicsColumn", "GaugeLabels", "GeoLocation", "GraphicsComplex", "GaugeMarkers", "GeologicalPeriodData", "GraphicsGrid", "GaugeStyle", "GeomagneticModelData", "GraphicsGroup", "GaussianFilter", "GeoMarker", "GraphicsRow", "GaussianIntegers", "GeometricAssertion", "GraphIntersection", "GaussianMatrix", "GeometricBrownianMotionProcess", "GraphLayout", "GaussianOrthogonalMatrixDistribution", "GeometricDistribution", "GraphLinkEfficiency", "GaussianSymplecticMatrixDistribution", "GeometricMean", "GraphPeriphery", "GaussianUnitaryMatrixDistribution", "GeometricMeanFilter", "GraphPlot", "GaussianWindow", "GeometricOptimization", "GraphPlot3D", "GCD", "GeometricScene", "GraphPower", "GegenbauerC", "GeometricTransformation", "GraphPropertyDistribution", "General", "GeoModel", "GraphQ", "GeneralizedLinearModelFit", "GeoNearest", "GraphRadius", "GenerateAsymmetricKeyPair", "GeoPath", "GraphReciprocity", "GenerateConditions", "GeoPosition", "GraphUnion", "GeneratedCell", "GeoPositionENU", "Gray", "GeneratedDocumentBinding", "GeoPositionXYZ", "GrayLevel", "GenerateDerivedKey", "GeoProjection", "Greater", "GenerateDigitalSignature", "GeoProjectionData", "GreaterEqual", "GenerateDocument", "GeoRange", "GreaterEqualLess", "GeneratedParameters", "GeoRangePadding", "GreaterEqualThan", "GeneratedQuantityMagnitudes", "GeoRegionValuePlot", "GreaterFullEqual", "GenerateFileSignature", "GeoResolution", "GreaterGreater", "GenerateHTTPResponse", "GeoScaleBar", "GreaterLess", "GenerateSecuredAuthenticationKey", "GeoServer", "GreaterSlantEqual", "GenerateSymmetricKey", "GeoSmoothHistogram", "GreaterThan", "GeneratingFunction", "GeoStreamPlot", "GreaterTilde", "GeneratorDescription", "GeoStyling", "Green", "GeneratorHistoryLength", "GeoStylingImageFunction", "GreenFunction", "GeneratorOutputType", "GeoVariant", "Grid", "GenericCylindricalDecomposition", "GeoVector", "GridBox", "GenomeData", "GeoVectorENU", "GridDefaultElement", "GenomeLookup", "GeoVectorPlot", "GridGraph", "GeoAntipode", "GeoVectorXYZ", "GridLines", "GeoArea", "GeoVisibleRegion", "GridLinesStyle", "GeoArraySize", "GeoVisibleRegionBoundary", "GroebnerBasis", "GeoBackground", "GeoWithinQ", "GroupActionBase", "GeoBoundingBox", "GeoZoomLevel", "GroupBy", "GeoBounds", "GestureHandler", "GroupCentralizer", "GeoBoundsRegion", "Get", "GroupElementFromWord", "GeoBubbleChart", "GetEnvironment", "GroupElementPosition", "GeoCenter", "Glaisher", "GroupElementQ", "GeoCircle", "GlobalClusteringCoefficient", "GroupElements", "GeoContourPlot", "Glow", "GroupElementToWord", "GeoDensityPlot", "GoldenAngle", "GroupGenerators", "GeodesicClosing", "GoldenRatio", "Groupings", "GeodesicDilation", "GompertzMakehamDistribution", "GroupMultiplicationTable", "GeodesicErosion", "GoochShading", "GroupOrbits", "GeodesicOpening", "GoodmanKruskalGamma", "GroupOrder", "GeoDestination", "GoodmanKruskalGammaTest", "GroupPageBreakWithin", "GeodesyData", "Goto", "GroupSetwiseStabilizer", "GeoDirection", "Grad", "GroupStabilizer", "GeoDisk", "Gradient", "GroupStabilizerChain", "GeoDisplacement", "GradientFilter", "GrowCutComponents", "GeoDistance", "GradientOrientationFilter", "Gudermannian", "GeoDistanceList", "GrammarApply", "GuidedFilter", "GeoElevationData", "GrammarRules", "GumbelDistribution", "GeoEntities", "GrammarToken", "HaarWavelet", "HermiteH", "HoldComplete", "HadamardMatrix", "HermitianMatrixQ", "HoldFirst", "HalfLine", "HessenbergDecomposition", "HoldForm", "HalfNormalDistribution", "HeunB", "HoldPattern", "HalfPlane", "HeunBPrime", "HoldRest", "HalfSpace", "HeunC", "HolidayCalendar", "HalftoneShading", "HeunCPrime", "HorizontalGauge", "HamiltonianGraphQ", "HeunD", "HornerForm", "HammingDistance", "HeunDPrime", "HostLookup", "HammingWindow", "HeunG", "HotellingTSquareDistribution", "HandlerFunctions", "HeunGPrime", "HoytDistribution", "HandlerFunctionsKeys", "HeunT", "HTTPErrorResponse", "HankelH1", "HeunTPrime", "HTTPRedirect", "HankelH2", "HexadecimalCharacter", "HTTPRequest", "HankelMatrix", "Hexahedron", "HTTPRequestData", "HankelTransform", "HiddenItems", "HTTPResponse", "HannPoissonWindow", "HiddenMarkovProcess", "Hue", "HannWindow", "Highlighted", "HumanGrowthData", "HaradaNortonGroupHN", "HighlightGraph", "HumpDownHump", "HararyGraph", "HighlightImage", "HumpEqual", "HarmonicMean", "HighlightMesh", "HurwitzLerchPhi", "HarmonicMeanFilter", "HighpassFilter", "HurwitzZeta", "HarmonicNumber", "HigmanSimsGroupHS", "HyperbolicDistribution", "Hash", "HilbertCurve", "HypercubeGraph", "HatchFilling", "HilbertFilter", "HyperexponentialDistribution", "HatchShading", "HilbertMatrix", "Hyperfactorial", "Haversine", "Histogram", "Hypergeometric0F1", "HazardFunction", "Histogram3D", "Hypergeometric0F1Regularized", "Head", "HistogramDistribution", "Hypergeometric1F1", "HeaderAlignment", "HistogramList", "Hypergeometric1F1Regularized", "HeaderBackground", "HistogramTransform", "Hypergeometric2F1", "HeaderDisplayFunction", "HistogramTransformInterpolation", "Hypergeometric2F1Regularized", "HeaderLines", "HistoricalPeriodData", "HypergeometricDistribution", "HeaderSize", "HitMissTransform", "HypergeometricPFQ", "HeaderStyle", "HITSCentrality", "HypergeometricPFQRegularized", "Heads", "HjorthDistribution", "HypergeometricU", "HeavisideLambda", "HodgeDual", "Hyperlink", "HeavisidePi", "HoeffdingD", "HyperlinkAction", "HeavisideTheta", "HoeffdingDTest", "Hyperplane", "HeldGroupHe", "Hold", "Hyphenation", "Here", "HoldAll", "HypoexponentialDistribution", "HermiteDecomposition", "HoldAllComplete", "HypothesisTestData", "I", "ImageSizeMultipliers", "IntegerName", "IconData", "ImageSubtract", "IntegerPart", "Iconize", "ImageTake", "IntegerPartitions", "IconRules", "ImageTransformation", "IntegerQ", "Icosahedron", "ImageTrim", "IntegerReverse", "Identity", "ImageType", "Integers", "IdentityMatrix", "ImageValue", "IntegerString", "If", "ImageValuePositions", "Integrate", "IgnoreCase", "ImagingDevice", "Interactive", "IgnoreDiacritics", "ImplicitRegion", "InteractiveTradingChart", "IgnorePunctuation", "Implies", "Interleaving", "IgnoringInactive", "Import", "InternallyBalancedDecomposition", "Im", "ImportByteArray", "InterpolatingFunction", "Image", "ImportOptions", "InterpolatingPolynomial", "Image3D", "ImportString", "Interpolation", "Image3DProjection", "ImprovementImportance", "InterpolationOrder", "Image3DSlices", "In", "InterpolationPoints", "ImageAccumulate", "Inactivate", "Interpretation", "ImageAdd", "Inactive", "InterpretationBox", "ImageAdjust", "IncidenceGraph", "InterpretationBoxOptions", "ImageAlign", "IncidenceList", "Interpreter", "ImageApply", "IncidenceMatrix", "InterquartileRange", "ImageApplyIndexed", "IncludeAromaticBonds", "Interrupt", "ImageAspectRatio", "IncludeConstantBasis", "IntersectedEntityClass", "ImageAssemble", "IncludeDefinitions", "IntersectingQ", "ImageAugmentationLayer", "IncludeDirectories", "Intersection", "ImageBoundingBoxes", "IncludeGeneratorTasks", "Interval", "ImageCapture", "IncludeHydrogens", "IntervalIntersection", "ImageCaptureFunction", "IncludeInflections", "IntervalMarkers", "ImageCases", "IncludeMetaInformation", "IntervalMarkersStyle", "ImageChannels", "IncludePods", "IntervalMemberQ", "ImageClip", "IncludeQuantities", "IntervalSlider", "ImageCollage", "IncludeRelatedTables", "IntervalUnion", "ImageColorSpace", "IncludeWindowTimes", "Inverse", "ImageCompose", "Increment", "InverseBetaRegularized", "ImageContainsQ", "IndefiniteMatrixQ", "InverseCDF", "ImageContents", "IndependenceTest", "InverseChiSquareDistribution", "ImageConvolve", "IndependentEdgeSetQ", "InverseContinuousWaveletTransform", "ImageCooccurrence", "IndependentPhysicalQuantity", "InverseDistanceTransform", "ImageCorners", "IndependentUnit", "InverseEllipticNomeQ", "ImageCorrelate", "IndependentUnitDimension", "InverseErf", "ImageCorrespondingPoints", "IndependentVertexSetQ", "InverseErfc", "ImageCrop", "Indeterminate", "InverseFourier", "ImageData", "IndeterminateThreshold", "InverseFourierCosTransform", "ImageDeconvolve", "Indexed", "InverseFourierSequenceTransform", "ImageDemosaic", "IndexEdgeTaggedGraph", "InverseFourierSinTransform", "ImageDifference", "IndexGraph", "InverseFourierTransform", "ImageDimensions", "InexactNumberQ", "InverseFunction", "ImageDisplacements", "InfiniteFuture", "InverseFunctions", "ImageDistance", "InfiniteLine", "InverseGammaDistribution", "ImageEffect", "InfinitePast", "InverseGammaRegularized", "ImageExposureCombine", "InfinitePlane", "InverseGaussianDistribution", "ImageFeatureTrack", "Infinity", "InverseGudermannian", "ImageFileApply", "Infix", "InverseHankelTransform", "ImageFileFilter", "InflationAdjust", "InverseHaversine", "ImageFileScan", "InflationMethod", "InverseImagePyramid", "ImageFilter", "Information", "InverseJacobiCD", "ImageFocusCombine", "Inherited", "InverseJacobiCN", "ImageForestingComponents", "InheritScope", "InverseJacobiCS", "ImageFormattingWidth", "InhomogeneousPoissonProcess", "InverseJacobiDC", "ImageForwardTransformation", "InitialEvaluationHistory", "InverseJacobiDN", "ImageGraphics", "Initialization", "InverseJacobiDS", "ImageHistogram", "InitializationCell", "InverseJacobiNC", "ImageIdentify", "InitializationObjects", "InverseJacobiND", "ImageInstanceQ", "InitializationValue", "InverseJacobiNS", "ImageKeypoints", "Initialize", "InverseJacobiSC", "ImageLabels", "InitialSeeding", "InverseJacobiSD", "ImageLegends", "Inner", "InverseJacobiSN", "ImageLevels", "InnerPolygon", "InverseLaplaceTransform", "ImageLines", "InnerPolyhedron", "InverseMellinTransform", "ImageMargins", "Inpaint", "InversePermutation", "ImageMarker", "Input", "InverseRadon", "ImageMeasurements", "InputAliases", "InverseRadonTransform", "ImageMesh", "InputAssumptions", "InverseSeries", "ImageMultiply", "InputAutoReplacements", "InverseShortTimeFourier", "ImagePad", "InputField", "InverseSpectrogram", "ImagePadding", "InputForm", "InverseSurvivalFunction", "ImagePartition", "InputNamePacket", "InverseTransformedRegion", "ImagePeriodogram", "InputNotebook", "InverseWaveletTransform", "ImagePerspectiveTransformation", "InputPacket", "InverseWeierstrassP", "ImagePosition", "InputStream", "InverseWishartMatrixDistribution", "ImagePreviewFunction", "InputString", "InverseZTransform", "ImagePyramid", "InputStringPacket", "Invisible", "ImagePyramidApply", "Insert", "IPAddress", "ImageQ", "InsertionFunction", "IrreduciblePolynomialQ", "ImageRecolor", "InsertLinebreaks", "IslandData", "ImageReflect", "InsertResults", "IsolatingInterval", "ImageResize", "Inset", "IsomorphicGraphQ", "ImageResolution", "Insphere", "IsotopeData", "ImageRestyle", "Install", "Italic", "ImageRotate", "InstallService", "Item", "ImageSaliencyFilter", "InString", "ItemAspectRatio", "ImageScaled", "Integer", "ItemDisplayFunction", "ImageScan", "IntegerDigits", "ItemSize", "ImageSize", "IntegerExponent", "ItemStyle", "ImageSizeAction", "IntegerLength", "ItoProcess", "JaccardDissimilarity", "JacobiSC", "JoinAcross", "JacobiAmplitude", "JacobiSD", "Joined", "JacobiCD", "JacobiSN", "JoinedCurve", "JacobiCN", "JacobiSymbol", "JoinForm", "JacobiCS", "JacobiZeta", "JordanDecomposition", "JacobiDC", "JankoGroupJ1", "JordanModelDecomposition", "JacobiDN", "JankoGroupJ2", "JulianDate", "JacobiDS", "JankoGroupJ3", "JuliaSetBoettcher", "JacobiNC", "JankoGroupJ4", "JuliaSetIterationCount", "JacobiND", "JarqueBeraALMTest", "JuliaSetPlot", "JacobiNS", "JohnsonDistribution", "JuliaSetPoints", "JacobiP", "Join", "KagiChart", "KernelObject", "Khinchin", "KaiserBesselWindow", "Kernels", "KillProcess", "KaiserWindow", "Key", "KirchhoffGraph", "KalmanEstimator", "KeyCollisionFunction", "KirchhoffMatrix", "KalmanFilter", "KeyComplement", "KleinInvariantJ", "KarhunenLoeveDecomposition", "KeyDrop", "KnapsackSolve", "KaryTree", "KeyDropFrom", "KnightTourGraph", "KatzCentrality", "KeyExistsQ", "KnotData", "KCoreComponents", "KeyFreeQ", "KnownUnitQ", "KDistribution", "KeyIntersection", "KochCurve", "KEdgeConnectedComponents", "KeyMap", "KolmogorovSmirnovTest", "KEdgeConnectedGraphQ", "KeyMemberQ", "KroneckerDelta", "KeepExistingVersion", "KeypointStrength", "KroneckerModelDecomposition", "KelvinBei", "Keys", "KroneckerProduct", "KelvinBer", "KeySelect", "KroneckerSymbol", "KelvinKei", "KeySort", "KuiperTest", "KelvinKer", "KeySortBy", "KumaraswamyDistribution", "KendallTau", "KeyTake", "Kurtosis", "KendallTauTest", "KeyUnion", "KuwaharaFilter", "KernelFunction", "KeyValueMap", "KVertexConnectedComponents", "KernelMixtureDistribution", "KeyValuePattern", "KVertexConnectedGraphQ", "LABColor", "LetterQ", "ListPickerBox", "Label", "Level", "ListPickerBoxOptions", "Labeled", "LeveneTest", "ListPlay", "LabelingFunction", "LeviCivitaTensor", "ListPlot", "LabelingSize", "LevyDistribution", "ListPlot3D", "LabelStyle", "LibraryDataType", "ListPointPlot3D", "LabelVisibility", "LibraryFunction", "ListPolarPlot", "LaguerreL", "LibraryFunctionError", "ListQ", "LakeData", "LibraryFunctionInformation", "ListSliceContourPlot3D", "LambdaComponents", "LibraryFunctionLoad", "ListSliceDensityPlot3D", "LaminaData", "LibraryFunctionUnload", "ListSliceVectorPlot3D", "LanczosWindow", "LibraryLoad", "ListStepPlot", "LandauDistribution", "LibraryUnload", "ListStreamDensityPlot", "Language", "LiftingFilterData", "ListStreamPlot", "LanguageCategory", "LiftingWaveletTransform", "ListSurfacePlot3D", "LanguageData", "LightBlue", "ListVectorDensityPlot", "LanguageIdentify", "LightBrown", "ListVectorPlot", "LaplaceDistribution", "LightCyan", "ListVectorPlot3D", "LaplaceTransform", "Lighter", "ListZTransform", "Laplacian", "LightGray", "LocalAdaptiveBinarize", "LaplacianFilter", "LightGreen", "LocalCache", "LaplacianGaussianFilter", "Lighting", "LocalClusteringCoefficient", "Large", "LightingAngle", "LocalizeVariables", "Larger", "LightMagenta", "LocalObject", "Last", "LightOrange", "LocalObjects", "Latitude", "LightPink", "LocalResponseNormalizationLayer", "LatitudeLongitude", "LightPurple", "LocalSubmit", "LatticeData", "LightRed", "LocalSymbol", "LatticeReduce", "LightYellow", "LocalTime", "LaunchKernels", "Likelihood", "LocalTimeZone", "LayeredGraphPlot", "Limit", "LocationEquivalenceTest", "LayerSizeFunction", "LimitsPositioning", "LocationTest", "LCHColor", "LindleyDistribution", "Locator", "LCM", "Line", "LocatorAutoCreate", "LeaderSize", "LinearFractionalOptimization", "LocatorPane", "LeafCount", "LinearFractionalTransform", "LocatorRegion", "LeapYearQ", "LinearGradientImage", "Locked", "LearnDistribution", "LinearizingTransformationData", "Log", "LearnedDistribution", "LinearLayer", "Log10", "LearningRate", "LinearModelFit", "Log2", "LearningRateMultipliers", "LinearOffsetFunction", "LogBarnesG", "LeastSquares", "LinearOptimization", "LogGamma", "LeastSquaresFilterKernel", "LinearProgramming", "LogGammaDistribution", "Left", "LinearRecurrence", "LogicalExpand", "LeftArrow", "LinearSolve", "LogIntegral", "LeftArrowBar", "LinearSolveFunction", "LogisticDistribution", "LeftArrowRightArrow", "LineBreakChart", "LogisticSigmoid", "LeftDownTeeVector", "LineGraph", "LogitModelFit", "LeftDownVector", "LineIndent", "LogLikelihood", "LeftDownVectorBar", "LineIndentMaxFraction", "LogLinearPlot", "LeftRightArrow", "LineIntegralConvolutionPlot", "LogLogisticDistribution", "LeftRightVector", "LineIntegralConvolutionScale", "LogLogPlot", "LeftTee", "LineLegend", "LogMultinormalDistribution", "LeftTeeArrow", "LineSpacing", "LogNormalDistribution", "LeftTeeVector", "LinkActivate", "LogPlot", "LeftTriangle", "LinkClose", "LogRankTest", "LeftTriangleBar", "LinkConnect", "LogSeriesDistribution", "LeftTriangleEqual", "LinkCreate", "Longest", "LeftUpDownVector", "LinkFunction", "LongestCommonSequence", "LeftUpTeeVector", "LinkInterrupt", "LongestCommonSequencePositions", "LeftUpVector", "LinkLaunch", "LongestCommonSubsequence", "LeftUpVectorBar", "LinkObject", "LongestCommonSubsequencePositions", "LeftVector", "LinkPatterns", "LongestOrderedSequence", "LeftVectorBar", "LinkProtocol", "Longitude", "LegendAppearance", "LinkRankCentrality", "LongLeftArrow", "Legended", "LinkRead", "LongLeftRightArrow", "LegendFunction", "LinkReadyQ", "LongRightArrow", "LegendLabel", "Links", "LongShortTermMemoryLayer", "LegendLayout", "LinkWrite", "Lookup", "LegendMargins", "LiouvilleLambda", "LoopFreeGraphQ", "LegendMarkers", "List", "Looping", "LegendMarkerSize", "Listable", "LossFunction", "LegendreP", "ListAnimate", "LowerCaseQ", "LegendreQ", "ListContourPlot", "LowerLeftArrow", "Length", "ListContourPlot3D", "LowerRightArrow", "LengthWhile", "ListConvolve", "LowerTriangularize", "LerchPhi", "ListCorrelate", "LowerTriangularMatrixQ", "Less", "ListCurvePathPlot", "LowpassFilter", "LessEqual", "ListDeconvolve", "LQEstimatorGains", "LessEqualGreater", "ListDensityPlot", "LQGRegulator", "LessEqualThan", "ListDensityPlot3D", "LQOutputRegulatorGains", "LessFullEqual", "ListFormat", "LQRegulatorGains", "LessGreater", "ListFourierSequenceTransform", "LucasL", "LessLess", "ListInterpolation", "LuccioSamiComponents", "LessSlantEqual", "ListLineIntegralConvolutionPlot", "LUDecomposition", "LessThan", "ListLinePlot", "LunarEclipse", "LessTilde", "ListLogLinearPlot", "LUVColor", "LetterCharacter", "ListLogLogPlot", "LyapunovSolve", "LetterCounts", "ListLogPlot", "LyonsGroupLy", "LetterNumber", "ListPicker", "MachineNumberQ", "MaxMemoryUsed", "MinimalPolynomial", "MachinePrecision", "MaxMixtureKernels", "MinimalStateSpaceModel", "Magenta", "MaxOverlapFraction", "Minimize", "Magnification", "MaxPlotPoints", "MinimumTimeIncrement", "Magnify", "MaxRecursion", "MinIntervalSize", "MailAddressValidation", "MaxStableDistribution", "MinkowskiQuestionMark", "MailExecute", "MaxStepFraction", "MinLimit", "MailFolder", "MaxSteps", "MinMax", "MailItem", "MaxStepSize", "MinorPlanetData", "MailReceiverFunction", "MaxTrainingRounds", "Minors", "MailResponseFunction", "MaxValue", "MinStableDistribution", "MailSearch", "MaxwellDistribution", "Minus", "MailServerConnect", "MaxWordGap", "MinusPlus", "MailServerConnection", "McLaughlinGroupMcL", "MinValue", "MailSettings", "Mean", "Missing", "Majority", "MeanAbsoluteLossLayer", "MissingBehavior", "MakeBoxes", "MeanAround", "MissingDataMethod", "MakeExpression", "MeanClusteringCoefficient", "MissingDataRules", "ManagedLibraryExpressionID", "MeanDegreeConnectivity", "MissingQ", "ManagedLibraryExpressionQ", "MeanDeviation", "MissingString", "MandelbrotSetBoettcher", "MeanFilter", "MissingStyle", "MandelbrotSetDistance", "MeanGraphDistance", "MissingValuePattern", "MandelbrotSetIterationCount", "MeanNeighborDegree", "MittagLefflerE", "MandelbrotSetMemberQ", "MeanShift", "MixedFractionParts", "MandelbrotSetPlot", "MeanShiftFilter", "MixedGraphQ", "MangoldtLambda", "MeanSquaredLossLayer", "MixedMagnitude", "ManhattanDistance", "Median", "MixedRadix", "Manipulate", "MedianDeviation", "MixedRadixQuantity", "Manipulator", "MedianFilter", "MixedUnit", "MannedSpaceMissionData", "MedicalTestData", "MixtureDistribution", "MannWhitneyTest", "Medium", "Mod", "MantissaExponent", "MeijerG", "Modal", "Manual", "MeijerGReduce", "ModularInverse", "Map", "MeixnerDistribution", "ModularLambda", "MapAll", "MellinConvolve", "Module", "MapAt", "MellinTransform", "Modulus", "MapIndexed", "MemberQ", "MoebiusMu", "MAProcess", "MemoryAvailable", "Molecule", "MapThread", "MemoryConstrained", "MoleculeContainsQ", "MarchenkoPasturDistribution", "MemoryConstraint", "MoleculeEquivalentQ", "MarcumQ", "MemoryInUse", "MoleculeGraph", "MardiaCombinedTest", "MengerMesh", "MoleculeModify", "MardiaKurtosisTest", "MenuCommandKey", "MoleculePattern", "MardiaSkewnessTest", "MenuPacket", "MoleculePlot", "MarginalDistribution", "MenuSortingValue", "MoleculePlot3D", "MarkovProcessProperties", "MenuStyle", "MoleculeProperty", "Masking", "MenuView", "MoleculeQ", "MatchingDissimilarity", "Merge", "MoleculeRecognize", "MatchLocalNames", "MergingFunction", "MoleculeValue", "MatchQ", "MersennePrimeExponent", "Moment", "MathematicalFunctionData", "MersennePrimeExponentQ", "MomentConvert", "MathieuC", "Mesh", "MomentEvaluate", "MathieuCharacteristicA", "MeshCellCentroid", "MomentGeneratingFunction", "MathieuCharacteristicB", "MeshCellCount", "MomentOfInertia", "MathieuCharacteristicExponent", "MeshCellHighlight", "Monday", "MathieuCPrime", "MeshCellIndex", "Monitor", "MathieuGroupM11", "MeshCellLabel", "MonomialList", "MathieuGroupM12", "MeshCellMarker", "MonsterGroupM", "MathieuGroupM22", "MeshCellMeasure", "MoonPhase", "MathieuGroupM23", "MeshCellQuality", "MoonPosition", "MathieuGroupM24", "MeshCells", "MorletWavelet", "MathieuS", "MeshCellShapeFunction", "MorphologicalBinarize", "MathieuSPrime", "MeshCellStyle", "MorphologicalBranchPoints", "MathMLForm", "MeshConnectivityGraph", "MorphologicalComponents", "Matrices", "MeshCoordinates", "MorphologicalEulerNumber", "MatrixExp", "MeshFunctions", "MorphologicalGraph", "MatrixForm", "MeshPrimitives", "MorphologicalPerimeter", "MatrixFunction", "MeshQualityGoal", "MorphologicalTransform", "MatrixLog", "MeshRefinementFunction", "MortalityData", "MatrixNormalDistribution", "MeshRegion", "Most", "MatrixPlot", "MeshRegionQ", "MountainData", "MatrixPower", "MeshShading", "MouseAnnotation", "MatrixPropertyDistribution", "MeshStyle", "MouseAppearance", "MatrixQ", "Message", "Mouseover", "MatrixRank", "MessageDialog", "MousePosition", "MatrixTDistribution", "MessageList", "MovieData", "Max", "MessageName", "MovingAverage", "MaxCellMeasure", "MessagePacket", "MovingMap", "MaxColorDistance", "Messages", "MovingMedian", "MaxDate", "MetaInformation", "MoyalDistribution", "MaxDetect", "MeteorShowerData", "Multicolumn", "MaxDuration", "Method", "MultiedgeStyle", "MaxExtraBandwidths", "MexicanHatWavelet", "MultigraphQ", "MaxExtraConditions", "MeyerWavelet", "Multinomial", "MaxFeatureDisplacement", "Midpoint", "MultinomialDistribution", "MaxFeatures", "Min", "MultinormalDistribution", "MaxFilter", "MinColorDistance", "MultiplicativeOrder", "MaximalBy", "MinDate", "MultiplySides", "Maximize", "MinDetect", "Multiselection", "MaxItems", "MineralData", "MultivariateHypergeometricDistribution", "MaxIterations", "MinFilter", "MultivariatePoissonDistribution", "MaxLimit", "MinimalBy", "MultivariateTDistribution", "N", "NHoldFirst", "NotificationFunction", "NakagamiDistribution", "NHoldRest", "NotLeftTriangle", "NameQ", "NicholsGridLines", "NotLeftTriangleBar", "Names", "NicholsPlot", "NotLeftTriangleEqual", "Nand", "NightHemisphere", "NotLess", "NArgMax", "NIntegrate", "NotLessEqual", "NArgMin", "NMaximize", "NotLessFullEqual", "NBodySimulation", "NMaxValue", "NotLessGreater", "NBodySimulationData", "NMinimize", "NotLessLess", "NCache", "NMinValue", "NotLessSlantEqual", "NDEigensystem", "NominalVariables", "NotLessTilde", "NDEigenvalues", "NoncentralBetaDistribution", "NotNestedGreaterGreater", "NDSolve", "NoncentralChiSquareDistribution", "NotNestedLessLess", "NDSolveValue", "NoncentralFRatioDistribution", "NotPrecedes", "Nearest", "NoncentralStudentTDistribution", "NotPrecedesEqual", "NearestFunction", "NonCommutativeMultiply", "NotPrecedesSlantEqual", "NearestMeshCells", "NonConstants", "NotPrecedesTilde", "NearestNeighborGraph", "NondimensionalizationTransform", "NotReverseElement", "NearestTo", "None", "NotRightTriangle", "NebulaData", "NoneTrue", "NotRightTriangleBar", "NeedlemanWunschSimilarity", "NonlinearModelFit", "NotRightTriangleEqual", "Needs", "NonlinearStateSpaceModel", "NotSquareSubset", "Negative", "NonlocalMeansFilter", "NotSquareSubsetEqual", "NegativeBinomialDistribution", "NonNegative", "NotSquareSuperset", "NegativeDefiniteMatrixQ", "NonNegativeIntegers", "NotSquareSupersetEqual", "NegativeIntegers", "NonNegativeRationals", "NotSubset", "NegativeMultinomialDistribution", "NonNegativeReals", "NotSubsetEqual", "NegativeRationals", "NonPositive", "NotSucceeds", "NegativeReals", "NonPositiveIntegers", "NotSucceedsEqual", "NegativeSemidefiniteMatrixQ", "NonPositiveRationals", "NotSucceedsSlantEqual", "NeighborhoodData", "NonPositiveReals", "NotSucceedsTilde", "NeighborhoodGraph", "Nor", "NotSuperset", "Nest", "NorlundB", "NotSupersetEqual", "NestedGreaterGreater", "Norm", "NotTilde", "NestedLessLess", "Normal", "NotTildeEqual", "NestGraph", "NormalDistribution", "NotTildeFullEqual", "NestList", "NormalizationLayer", "NotTildeTilde", "NestWhile", "Normalize", "NotVerticalBar", "NestWhileList", "Normalized", "Now", "NetAppend", "NormalizedSquaredEuclideanDistance", "NoWhitespace", "NetBidirectionalOperator", "NormalMatrixQ", "NProbability", "NetChain", "NormalsFunction", "NProduct", "NetDecoder", "NormFunction", "NRoots", "NetDelete", "Not", "NSolve", "NetDrop", "NotCongruent", "NSum", "NetEncoder", "NotCupCap", "NuclearExplosionData", "NetEvaluationMode", "NotDoubleVerticalBar", "NuclearReactorData", "NetExtract", "Notebook", "Null", "NetFlatten", "NotebookApply", "NullRecords", "NetFoldOperator", "NotebookAutoSave", "NullSpace", "NetGANOperator", "NotebookClose", "NullWords", "NetGraph", "NotebookDelete", "Number", "NetInitialize", "NotebookDirectory", "NumberCompose", "NetInsert", "NotebookDynamicExpression", "NumberDecompose", "NetInsertSharedArrays", "NotebookEvaluate", "NumberExpand", "NetJoin", "NotebookEventActions", "NumberFieldClassNumber", "NetMapOperator", "NotebookFileName", "NumberFieldDiscriminant", "NetMapThreadOperator", "NotebookFind", "NumberFieldFundamentalUnits", "NetMeasurements", "NotebookGet", "NumberFieldIntegralBasis", "NetModel", "NotebookImport", "NumberFieldNormRepresentatives", "NetNestOperator", "NotebookInformation", "NumberFieldRegulator", "NetPairEmbeddingOperator", "NotebookLocate", "NumberFieldRootsOfUnity", "NetPort", "NotebookObject", "NumberFieldSignature", "NetPortGradient", "NotebookOpen", "NumberForm", "NetPrepend", "NotebookPrint", "NumberFormat", "NetRename", "NotebookPut", "NumberLinePlot", "NetReplace", "NotebookRead", "NumberMarks", "NetReplacePart", "Notebooks", "NumberMultiplier", "NetSharedArray", "NotebookSave", "NumberPadding", "NetStateObject", "NotebookSelection", "NumberPoint", "NetTake", "NotebooksMenu", "NumberQ", "NetTrain", "NotebookTemplate", "NumberSeparator", "NetTrainResultsObject", "NotebookWrite", "NumberSigns", "NetworkPacketCapture", "NotElement", "NumberString", "NetworkPacketRecording", "NotEqualTilde", "Numerator", "NetworkPacketTrace", "NotExists", "NumeratorDenominator", "NeumannValue", "NotGreater", "NumericalOrder", "NevilleThetaC", "NotGreaterEqual", "NumericalSort", "NevilleThetaD", "NotGreaterFullEqual", "NumericArray", "NevilleThetaN", "NotGreaterGreater", "NumericArrayQ", "NevilleThetaS", "NotGreaterLess", "NumericArrayType", "NExpectation", "NotGreaterSlantEqual", "NumericFunction", "NextCell", "NotGreaterTilde", "NumericQ", "NextDate", "Nothing", "NuttallWindow", "NextPrime", "NotHumpDownHump", "NyquistGridLines", "NHoldAll", "NotHumpEqual", "NyquistPlot", "O", "OperatingSystem", "OuterPolyhedron", "ObservabilityGramian", "OperatorApplied", "OutputControllabilityMatrix", "ObservabilityMatrix", "OptimumFlowData", "OutputControllableModelQ", "ObservableDecomposition", "Optional", "OutputForm", "ObservableModelQ", "OptionalElement", "OutputNamePacket", "OceanData", "Options", "OutputResponse", "Octahedron", "OptionsPattern", "OutputSizeLimit", "OddQ", "OptionValue", "OutputStream", "Off", "Or", "OverBar", "Offset", "Orange", "OverDot", "On", "Order", "Overflow", "ONanGroupON", "OrderDistribution", "OverHat", "Once", "OrderedQ", "Overlaps", "OneIdentity", "Ordering", "Overlay", "Opacity", "OrderingBy", "Overscript", "OpacityFunction", "OrderingLayer", "OverscriptBox", "OpacityFunctionScaling", "Orderless", "OverscriptBoxOptions", "OpenAppend", "OrderlessPatternSequence", "OverTilde", "Opener", "OrnsteinUhlenbeckProcess", "OverVector", "OpenerView", "Orthogonalize", "OverwriteTarget", "Opening", "OrthogonalMatrixQ", "OwenT", "OpenRead", "Out", "OwnValues", "OpenWrite", "Outer", "Operate", "OuterPolygon", "PacletDataRebuild", "PeriodicBoundaryCondition", "PolynomialLCM", "PacletDirectoryLoad", "Periodogram", "PolynomialMod", "PacletDirectoryUnload", "PeriodogramArray", "PolynomialQ", "PacletDisable", "Permanent", "PolynomialQuotient", "PacletEnable", "Permissions", "PolynomialQuotientRemainder", "PacletFind", "PermissionsGroup", "PolynomialReduce", "PacletFindRemote", "PermissionsGroups", "PolynomialRemainder", "PacletInstall", "PermissionsKey", "PoolingLayer", "PacletInstallSubmit", "PermissionsKeys", "PopupMenu", "PacletNewerQ", "PermutationCycles", "PopupView", "PacletObject", "PermutationCyclesQ", "PopupWindow", "PacletSite", "PermutationGroup", "Position", "PacletSiteObject", "PermutationLength", "PositionIndex", "PacletSiteRegister", "PermutationList", "Positive", "PacletSites", "PermutationListQ", "PositiveDefiniteMatrixQ", "PacletSiteUnregister", "PermutationMax", "PositiveIntegers", "PacletSiteUpdate", "PermutationMin", "PositiveRationals", "PacletUninstall", "PermutationOrder", "PositiveReals", "PaddedForm", "PermutationPower", "PositiveSemidefiniteMatrixQ", "Padding", "PermutationProduct", "PossibleZeroQ", "PaddingLayer", "PermutationReplace", "Postfix", "PaddingSize", "Permutations", "Power", "PadeApproximant", "PermutationSupport", "PowerDistribution", "PadLeft", "Permute", "PowerExpand", "PadRight", "PeronaMalikFilter", "PowerMod", "PageBreakAbove", "PerpendicularBisector", "PowerModList", "PageBreakBelow", "PersistenceLocation", "PowerRange", "PageBreakWithin", "PersistenceTime", "PowerSpectralDensity", "PageFooters", "PersistentObject", "PowersRepresentations", "PageHeaders", "PersistentObjects", "PowerSymmetricPolynomial", "PageRankCentrality", "PersistentValue", "PrecedenceForm", "PageTheme", "PersonData", "Precedes", "PageWidth", "PERTDistribution", "PrecedesEqual", "Pagination", "PetersenGraph", "PrecedesSlantEqual", "PairedBarChart", "PhaseMargins", "PrecedesTilde", "PairedHistogram", "PhaseRange", "Precision", "PairedSmoothHistogram", "PhysicalSystemData", "PrecisionGoal", "PairedTTest", "Pi", "PreDecrement", "PairedZTest", "Pick", "Predict", "PaletteNotebook", "PIDData", "PredictorFunction", "PalindromeQ", "PIDDerivativeFilter", "PredictorMeasurements", "Pane", "PIDFeedforward", "PredictorMeasurementsObject", "Panel", "PIDTune", "PreemptProtect", "Paneled", "Piecewise", "Prefix", "PaneSelector", "PiecewiseExpand", "PreIncrement", "ParabolicCylinderD", "PieChart", "Prepend", "ParagraphIndent", "PieChart3D", "PrependLayer", "ParagraphSpacing", "PillaiTrace", "PrependTo", "ParallelArray", "PillaiTraceTest", "PreprocessingRules", "ParallelCombine", "PingTime", "PreserveColor", "ParallelDo", "Pink", "PreserveImageOptions", "Parallelepiped", "PitchRecognize", "PreviousCell", "ParallelEvaluate", "PixelValue", "PreviousDate", "Parallelization", "PixelValuePositions", "PriceGraphDistribution", "Parallelize", "Placed", "Prime", "ParallelMap", "Placeholder", "PrimeNu", "ParallelNeeds", "PlaceholderReplace", "PrimeOmega", "Parallelogram", "Plain", "PrimePi", "ParallelProduct", "PlanarAngle", "PrimePowerQ", "ParallelSubmit", "PlanarGraph", "PrimeQ", "ParallelSum", "PlanarGraphQ", "Primes", "ParallelTable", "PlanckRadiationLaw", "PrimeZetaP", "ParallelTry", "PlaneCurveData", "PrimitivePolynomialQ", "ParameterEstimator", "PlanetaryMoonData", "PrimitiveRoot", "ParameterMixtureDistribution", "PlanetData", "PrimitiveRootList", "ParametricFunction", "PlantData", "PrincipalComponents", "ParametricNDSolve", "Play", "PrincipalValue", "ParametricNDSolveValue", "PlayRange", "Print", "ParametricPlot", "Plot", "PrintableASCIIQ", "ParametricPlot3D", "Plot3D", "PrintingStyleEnvironment", "ParametricRampLayer", "PlotLabel", "Printout3D", "ParametricRegion", "PlotLabels", "Printout3DPreviewer", "ParentBox", "PlotLayout", "PrintTemporary", "ParentCell", "PlotLegends", "Prism", "ParentDirectory", "PlotMarkers", "PrivateCellOptions", "ParentNotebook", "PlotPoints", "PrivateFontOptions", "ParetoDistribution", "PlotRange", "PrivateKey", "ParetoPickandsDistribution", "PlotRangeClipping", "PrivateNotebookOptions", "ParkData", "PlotRangePadding", "Probability", "Part", "PlotRegion", "ProbabilityDistribution", "PartBehavior", "PlotStyle", "ProbabilityPlot", "PartialCorrelationFunction", "PlotTheme", "ProbabilityScalePlot", "ParticleAcceleratorData", "Pluralize", "ProbitModelFit", "ParticleData", "Plus", "ProcessConnection", "Partition", "PlusMinus", "ProcessDirectory", "PartitionGranularity", "Pochhammer", "ProcessEnvironment", "PartitionsP", "PodStates", "Processes", "PartitionsQ", "PodWidth", "ProcessEstimator", "PartLayer", "Point", "ProcessInformation", "PartOfSpeech", "PointFigureChart", "ProcessObject", "PartProtection", "PointLegend", "ProcessParameterAssumptions", "ParzenWindow", "PointSize", "ProcessParameterQ", "PascalDistribution", "PoissonConsulDistribution", "ProcessStatus", "PassEventsDown", "PoissonDistribution", "Product", "PassEventsUp", "PoissonProcess", "ProductDistribution", "Paste", "PoissonWindow", "ProductLog", "PasteButton", "PolarAxes", "ProgressIndicator", "Path", "PolarAxesOrigin", "Projection", "PathGraph", "PolarGridLines", "Prolog", "PathGraphQ", "PolarPlot", "ProofObject", "Pattern", "PolarTicks", "Proportion", "PatternFilling", "PoleZeroMarkers", "Proportional", "PatternSequence", "PolyaAeppliDistribution", "Protect", "PatternTest", "PolyGamma", "Protected", "PauliMatrix", "Polygon", "ProteinData", "PaulWavelet", "PolygonalNumber", "Pruning", "Pause", "PolygonAngle", "PseudoInverse", "PDF", "PolygonCoordinates", "PsychrometricPropertyData", "PeakDetect", "PolygonDecomposition", "PublicKey", "PeanoCurve", "Polyhedron", "PublisherID", "PearsonChiSquareTest", "PolyhedronAngle", "PulsarData", "PearsonCorrelationTest", "PolyhedronCoordinates", "PunctuationCharacter", "PearsonDistribution", "PolyhedronData", "Purple", "PercentForm", "PolyhedronDecomposition", "Put", "PerfectNumber", "PolyhedronGenus", "PutAppend", "PerfectNumberQ", "PolyLog", "Pyramid", "PerformanceGoal", "PolynomialExtendedGCD", "Perimeter", "PolynomialGCD", "QBinomial", "Quantity", "Quartics", "QFactorial", "QuantityArray", "QuartileDeviation", "QGamma", "QuantityDistribution", "Quartiles", "QHypergeometricPFQ", "QuantityForm", "QuartileSkewness", "QnDispersion", "QuantityMagnitude", "Query", "QPochhammer", "QuantityQ", "QueueingNetworkProcess", "QPolyGamma", "QuantityUnit", "QueueingProcess", "QRDecomposition", "QuantityVariable", "QueueProperties", "QuadraticIrrationalQ", "QuantityVariableCanonicalUnit", "Quiet", "QuadraticOptimization", "QuantityVariableDimensions", "Quit", "Quantile", "QuantityVariableIdentifier", "Quotient", "QuantilePlot", "QuantityVariablePhysicalQuantity", "QuotientRemainder", "RadialGradientImage", "RegionEqual", "Restricted", "RadialityCentrality", "RegionFillingStyle", "Resultant", "RadicalBox", "RegionFunction", "Return", "RadicalBoxOptions", "RegionImage", "ReturnExpressionPacket", "RadioButton", "RegionIntersection", "ReturnPacket", "RadioButtonBar", "RegionMeasure", "ReturnReceiptFunction", "Radon", "RegionMember", "ReturnTextPacket", "RadonTransform", "RegionMemberFunction", "Reverse", "RamanujanTau", "RegionMoment", "ReverseApplied", "RamanujanTauL", "RegionNearest", "ReverseBiorthogonalSplineWavelet", "RamanujanTauTheta", "RegionNearestFunction", "ReverseElement", "RamanujanTauZ", "RegionPlot", "ReverseEquilibrium", "Ramp", "RegionPlot3D", "ReverseGraph", "RandomChoice", "RegionProduct", "ReverseSort", "RandomColor", "RegionQ", "ReverseSortBy", "RandomComplex", "RegionResize", "ReverseUpEquilibrium", "RandomEntity", "RegionSize", "RevolutionAxis", "RandomFunction", "RegionSymmetricDifference", "RevolutionPlot3D", "RandomGeoPosition", "RegionUnion", "RGBColor", "RandomGraph", "RegionWithin", "RiccatiSolve", "RandomImage", "RegisterExternalEvaluator", "RiceDistribution", "RandomInstance", "RegularExpression", "RidgeFilter", "RandomInteger", "Regularization", "RiemannR", "RandomPermutation", "RegularlySampledQ", "RiemannSiegelTheta", "RandomPoint", "RegularPolygon", "RiemannSiegelZ", "RandomPolygon", "ReIm", "RiemannXi", "RandomPolyhedron", "ReImLabels", "Riffle", "RandomPrime", "ReImPlot", "Right", "RandomReal", "ReImStyle", "RightArrow", "RandomSample", "RelationalDatabase", "RightArrowBar", "RandomSeeding", "RelationGraph", "RightArrowLeftArrow", "RandomVariate", "ReleaseHold", "RightComposition", "RandomWalkProcess", "ReliabilityDistribution", "RightCosetRepresentative", "RandomWord", "ReliefImage", "RightDownTeeVector", "Range", "ReliefPlot", "RightDownVector", "RangeFilter", "RemoteAuthorizationCaching", "RightDownVectorBar", "RankedMax", "RemoteConnect", "RightTee", "RankedMin", "RemoteConnectionObject", "RightTeeArrow", "RarerProbability", "RemoteFile", "RightTeeVector", "Raster", "RemoteRun", "RightTriangle", "Raster3D", "RemoteRunProcess", "RightTriangleBar", "Rasterize", "Remove", "RightTriangleEqual", "RasterSize", "RemoveAlphaChannel", "RightUpDownVector", "Rational", "RemoveAudioStream", "RightUpTeeVector", "Rationalize", "RemoveBackground", "RightUpVector", "Rationals", "RemoveChannelListener", "RightUpVectorBar", "Ratios", "RemoveChannelSubscribers", "RightVector", "RawBoxes", "RemoveDiacritics", "RightVectorBar", "RawData", "RemoveInputStreamMethod", "RiskAchievementImportance", "RayleighDistribution", "RemoveOutputStreamMethod", "RiskReductionImportance", "Re", "RemoveUsers", "RogersTanimotoDissimilarity", "Read", "RemoveVideoStream", "RollPitchYawAngles", "ReadByteArray", "RenameDirectory", "RollPitchYawMatrix", "ReadLine", "RenameFile", "RomanNumeral", "ReadList", "RenderingOptions", "Root", "ReadProtected", "RenewalProcess", "RootApproximant", "ReadString", "RenkoChart", "RootIntervals", "Real", "RepairMesh", "RootLocusPlot", "RealAbs", "Repeated", "RootMeanSquare", "RealBlockDiagonalForm", "RepeatedNull", "RootOfUnityQ", "RealDigits", "RepeatedTiming", "RootReduce", "RealExponent", "RepeatingElement", "Roots", "Reals", "Replace", "RootSum", "RealSign", "ReplaceAll", "Rotate", "Reap", "ReplaceImageValue", "RotateLabel", "RecognitionPrior", "ReplaceList", "RotateLeft", "Record", "ReplacePart", "RotateRight", "RecordLists", "ReplacePixelValue", "RotationAction", "RecordSeparators", "ReplaceRepeated", "RotationMatrix", "Rectangle", "ReplicateLayer", "RotationTransform", "RectangleChart", "RequiredPhysicalQuantities", "Round", "RectangleChart3D", "Resampling", "RoundingRadius", "RectangularRepeatingElement", "ResamplingAlgorithmData", "Row", "RecurrenceFilter", "ResamplingMethod", "RowAlignments", "RecurrenceTable", "Rescale", "RowBox", "Red", "RescalingTransform", "RowLines", "Reduce", "ResetDirectory", "RowMinHeight", "ReferenceLineStyle", "ReshapeLayer", "RowReduce", "Refine", "Residue", "RowsEqual", "ReflectionMatrix", "ResizeLayer", "RowSpacings", "ReflectionTransform", "Resolve", "RSolve", "Refresh", "ResourceData", "RSolveValue", "RefreshRate", "ResourceFunction", "RudinShapiro", "Region", "ResourceObject", "RudvalisGroupRu", "RegionBinarize", "ResourceRegister", "Rule", "RegionBoundary", "ResourceRemove", "RuleDelayed", "RegionBoundaryStyle", "ResourceSearch", "RulePlot", "RegionBounds", "ResourceSubmit", "RulerUnits", "RegionCentroid", "ResourceSystemBase", "Run", "RegionDifference", "ResourceSystemPath", "RunProcess", "RegionDimension", "ResourceUpdate", "RunThrough", "RegionDisjoint", "ResourceVersion", "RuntimeAttributes", "RegionDistance", "ResponseForm", "RuntimeOptions", "RegionDistanceFunction", "Rest", "RussellRaoDissimilarity", "RegionEmbeddingDimension", "RestartInterval", "SameQ", "SingularValueDecomposition", "StreamDensityPlot", "SameTest", "SingularValueList", "StreamMarkers", "SameTestProperties", "SingularValuePlot", "StreamPlot", "SampledEntityClass", "Sinh", "StreamPoints", "SampleDepth", "SinhIntegral", "StreamPosition", "SampledSoundFunction", "SinIntegral", "Streams", "SampledSoundList", "SixJSymbol", "StreamScale", "SampleRate", "Skeleton", "StreamStyle", "SamplingPeriod", "SkeletonTransform", "String", "SARIMAProcess", "SkellamDistribution", "StringCases", "SARMAProcess", "Skewness", "StringContainsQ", "SASTriangle", "SkewNormalDistribution", "StringCount", "SatelliteData", "Skip", "StringDelete", "SatisfiabilityCount", "SliceContourPlot3D", "StringDrop", "SatisfiabilityInstances", "SliceDensityPlot3D", "StringEndsQ", "SatisfiableQ", "SliceDistribution", "StringExpression", "Saturday", "SliceVectorPlot3D", "StringExtract", "Save", "Slider", "StringForm", "SaveConnection", "Slider2D", "StringFormat", "SaveDefinitions", "SlideView", "StringFreeQ", "SavitzkyGolayMatrix", "Slot", "StringInsert", "SawtoothWave", "SlotSequence", "StringJoin", "Scale", "Small", "StringLength", "Scaled", "SmallCircle", "StringMatchQ", "ScaleDivisions", "Smaller", "StringPadLeft", "ScaleOrigin", "SmithDecomposition", "StringPadRight", "ScalePadding", "SmithDelayCompensator", "StringPart", "ScaleRanges", "SmithWatermanSimilarity", "StringPartition", "ScaleRangeStyle", "SmoothDensityHistogram", "StringPosition", "ScalingFunctions", "SmoothHistogram", "StringQ", "ScalingMatrix", "SmoothHistogram3D", "StringRepeat", "ScalingTransform", "SmoothKernelDistribution", "StringReplace", "Scan", "SnDispersion", "StringReplaceList", "ScheduledTask", "Snippet", "StringReplacePart", "SchurDecomposition", "SnubPolyhedron", "StringReverse", "ScientificForm", "SocialMediaData", "StringRiffle", "ScientificNotationThreshold", "SocketConnect", "StringRotateLeft", "ScorerGi", "SocketListen", "StringRotateRight", "ScorerGiPrime", "SocketListener", "StringSkeleton", "ScorerHi", "SocketObject", "StringSplit", "ScorerHiPrime", "SocketOpen", "StringStartsQ", "ScreenStyleEnvironment", "SocketReadMessage", "StringTake", "ScriptBaselineShifts", "SocketReadyQ", "StringTemplate", "ScriptMinSize", "Sockets", "StringToByteArray", "ScriptSizeMultipliers", "SocketWaitAll", "StringToStream", "Scrollbars", "SocketWaitNext", "StringTrim", "ScrollingOptions", "SoftmaxLayer", "StripBoxes", "ScrollPosition", "SokalSneathDissimilarity", "StripOnInput", "SearchAdjustment", "SolarEclipse", "StripWrapperBoxes", "SearchIndexObject", "SolarSystemFeatureData", "StructuralImportance", "SearchIndices", "SolidAngle", "StructuredSelection", "SearchQueryString", "SolidData", "StruveH", "SearchResultObject", "SolidRegionQ", "StruveL", "Sec", "Solve", "Stub", "Sech", "SolveAlways", "StudentTDistribution", "SechDistribution", "Sort", "Style", "SecondOrderConeOptimization", "SortBy", "StyleBox", "SectorChart", "SortedBy", "StyleData", "SectorChart3D", "SortedEntityClass", "StyleDefinitions", "SectorOrigin", "Sound", "Subdivide", "SectorSpacing", "SoundNote", "Subfactorial", "SecuredAuthenticationKey", "SoundVolume", "Subgraph", "SecuredAuthenticationKeys", "SourceLink", "SubMinus", "SeedRandom", "Sow", "SubPlus", "Select", "SpaceCurveData", "SubresultantPolynomialRemainders", "Selectable", "Spacer", "SubresultantPolynomials", "SelectComponents", "Spacings", "Subresultants", "SelectedCells", "Span", "Subscript", "SelectedNotebook", "SpanFromAbove", "SubscriptBox", "SelectFirst", "SpanFromBoth", "SubscriptBoxOptions", "SelectionCreateCell", "SpanFromLeft", "Subsequences", "SelectionEvaluate", "SparseArray", "Subset", "SelectionEvaluateCreateCell", "SpatialGraphDistribution", "SubsetCases", "SelectionMove", "SpatialMedian", "SubsetCount", "SelfLoopStyle", "SpatialTransformationLayer", "SubsetEqual", "SemanticImport", "Speak", "SubsetMap", "SemanticImportString", "SpeakerMatchQ", "SubsetPosition", "SemanticInterpretation", "SpearmanRankTest", "SubsetQ", "SemialgebraicComponentInstances", "SpearmanRho", "SubsetReplace", "SemidefiniteOptimization", "SpeciesData", "Subsets", "SendMail", "SpecificityGoal", "SubStar", "SendMessage", "SpectralLineData", "SubstitutionSystem", "Sequence", "Spectrogram", "Subsuperscript", "SequenceAlignment", "SpectrogramArray", "SubsuperscriptBox", "SequenceCases", "Specularity", "SubsuperscriptBoxOptions", "SequenceCount", "SpeechCases", "SubtitleEncoding", "SequenceFold", "SpeechInterpreter", "SubtitleTracks", "SequenceFoldList", "SpeechRecognize", "Subtract", "SequenceHold", "SpeechSynthesize", "SubtractFrom", "SequenceLastLayer", "SpellingCorrection", "SubtractSides", "SequenceMostLayer", "SpellingCorrectionList", "Succeeds", "SequencePosition", "SpellingOptions", "SucceedsEqual", "SequencePredict", "Sphere", "SucceedsSlantEqual", "SequencePredictorFunction", "SpherePoints", "SucceedsTilde", "SequenceReplace", "SphericalBesselJ", "Success", "SequenceRestLayer", "SphericalBesselY", "SuchThat", "SequenceReverseLayer", "SphericalHankelH1", "Sum", "SequenceSplit", "SphericalHankelH2", "SumConvergence", "Series", "SphericalHarmonicY", "SummationLayer", "SeriesCoefficient", "SphericalPlot3D", "Sunday", "SeriesData", "SphericalRegion", "SunPosition", "SeriesTermGoal", "SphericalShell", "Sunrise", "ServiceConnect", "SpheroidalEigenvalue", "Sunset", "ServiceDisconnect", "SpheroidalJoiningFactor", "SuperDagger", "ServiceExecute", "SpheroidalPS", "SuperMinus", "ServiceObject", "SpheroidalPSPrime", "SupernovaData", "ServiceRequest", "SpheroidalQS", "SuperPlus", "ServiceSubmit", "SpheroidalQSPrime", "Superscript", "SessionSubmit", "SpheroidalRadialFactor", "SuperscriptBox", "SessionTime", "SpheroidalS1", "SuperscriptBoxOptions", "Set", "SpheroidalS1Prime", "Superset", "SetAccuracy", "SpheroidalS2", "SupersetEqual", "SetAlphaChannel", "SpheroidalS2Prime", "SuperStar", "SetAttributes", "Splice", "Surd", "SetCloudDirectory", "SplicedDistribution", "SurdForm", "SetCookies", "SplineClosed", "SurfaceArea", "SetDelayed", "SplineDegree", "SurfaceData", "SetDirectory", "SplineKnots", "SurvivalDistribution", "SetEnvironment", "SplineWeights", "SurvivalFunction", "SetFileDate", "Split", "SurvivalModel", "SetOptions", "SplitBy", "SurvivalModelFit", "SetPermissions", "SpokenString", "SuzukiDistribution", "SetPrecision", "Sqrt", "SuzukiGroupSuz", "SetSelectedNotebook", "SqrtBox", "SwatchLegend", "SetSharedFunction", "SqrtBoxOptions", "Switch", "SetSharedVariable", "Square", "Symbol", "SetStreamPosition", "SquaredEuclideanDistance", "SymbolName", "SetSystemModel", "SquareFreeQ", "SymletWavelet", "SetSystemOptions", "SquareIntersection", "Symmetric", "Setter", "SquareMatrixQ", "SymmetricGroup", "SetterBar", "SquareRepeatingElement", "SymmetricKey", "Setting", "SquaresR", "SymmetricMatrixQ", "SetUsers", "SquareSubset", "SymmetricPolynomial", "Shallow", "SquareSubsetEqual", "SymmetricReduction", "ShannonWavelet", "SquareSuperset", "Symmetrize", "ShapiroWilkTest", "SquareSupersetEqual", "SymmetrizedArray", "Share", "SquareUnion", "SymmetrizedArrayRules", "SharingList", "SquareWave", "SymmetrizedDependentComponents", "Sharpen", "SSSTriangle", "SymmetrizedIndependentComponents", "ShearingMatrix", "StabilityMargins", "SymmetrizedReplacePart", "ShearingTransform", "StabilityMarginsStyle", "SynchronousInitialization", "ShellRegion", "StableDistribution", "SynchronousUpdating", "ShenCastanMatrix", "Stack", "Synonyms", "ShiftedGompertzDistribution", "StackBegin", "SyntaxForm", "ShiftRegisterSequence", "StackComplete", "SyntaxInformation", "Short", "StackedDateListPlot", "SyntaxLength", "ShortDownArrow", "StackedListPlot", "SyntaxPacket", "Shortest", "StackInhibit", "SyntaxQ", "ShortestPathFunction", "StadiumShape", "SynthesizeMissingValues", "ShortLeftArrow", "StandardAtmosphereData", "SystemCredential", "ShortRightArrow", "StandardDeviation", "SystemCredentialData", "ShortTimeFourier", "StandardDeviationFilter", "SystemCredentialKey", "ShortTimeFourierData", "StandardForm", "SystemCredentialKeys", "ShortUpArrow", "Standardize", "SystemCredentialStoreObject", "Show", "Standardized", "SystemDialogInput", "ShowAutoSpellCheck", "StandardOceanData", "SystemInformation", "ShowAutoStyles", "StandbyDistribution", "SystemInstall", "ShowCellBracket", "Star", "SystemModel", "ShowCellLabel", "StarClusterData", "SystemModeler", "ShowCellTags", "StarData", "SystemModelExamples", "ShowCursorTracker", "StarGraph", "SystemModelLinearize", "ShowGroupOpener", "StartExternalSession", "SystemModelParametricSimulate", "ShowPageBreaks", "StartingStepSize", "SystemModelPlot", "ShowSelection", "StartOfLine", "SystemModelProgressReporting", "ShowSpecialCharacters", "StartOfString", "SystemModelReliability", "ShowStringCharacters", "StartProcess", "SystemModels", "ShrinkingDelay", "StartWebSession", "SystemModelSimulate", "SiderealTime", "StateFeedbackGains", "SystemModelSimulateSensitivity", "SiegelTheta", "StateOutputEstimator", "SystemModelSimulationData", "SiegelTukeyTest", "StateResponse", "SystemOpen", "SierpinskiCurve", "StateSpaceModel", "SystemOptions", "SierpinskiMesh", "StateSpaceRealization", "SystemProcessData", "Sign", "StateSpaceTransform", "SystemProcesses", "Signature", "StateTransformationLinearize", "SystemsConnectionsModel", "SignedRankTest", "StationaryDistribution", "SystemsModelDelay", "SignedRegionDistance", "StationaryWaveletPacketTransform", "SystemsModelDelayApproximate", "SignificanceLevel", "StationaryWaveletTransform", "SystemsModelDelete", "SignPadding", "StatusArea", "SystemsModelDimensions", "SignTest", "StatusCentrality", "SystemsModelExtract", "SimilarityRules", "StepMonitor", "SystemsModelFeedbackConnect", "SimpleGraph", "StereochemistryElements", "SystemsModelLabels", "SimpleGraphQ", "StieltjesGamma", "SystemsModelLinearity", "SimplePolygonQ", "StippleShading", "SystemsModelMerge", "SimplePolyhedronQ", "StirlingS1", "SystemsModelOrder", "Simplex", "StirlingS2", "SystemsModelParallelConnect", "Simplify", "StoppingPowerData", "SystemsModelSeriesConnect", "Sin", "StrataVariables", "SystemsModelStateFeedbackConnect", "Sinc", "StratonovichProcess", "SystemsModelVectorRelativeOrders", "SinghMaddalaDistribution", "StreamColorFunction", "SingleLetterItalics", "StreamColorFunctionScaling", "Table", "Thickness", "TraceDepth", "TableAlignments", "Thin", "TraceDialog", "TableDepth", "Thinning", "TraceForward", "TableDirections", "ThompsonGroupTh", "TraceOff", "TableForm", "Thread", "TraceOn", "TableHeadings", "ThreadingLayer", "TraceOriginal", "TableSpacing", "ThreeJSymbol", "TracePrint", "TableView", "Threshold", "TraceScan", "TabView", "Through", "TrackedSymbols", "TagBox", "Throw", "TrackingFunction", "TagBoxOptions", "ThueMorse", "TracyWidomDistribution", "TaggingRules", "Thumbnail", "TradingChart", "TagSet", "Thursday", "TraditionalForm", "TagSetDelayed", "Ticks", "TrainingProgressCheckpointing", "TagUnset", "TicksStyle", "TrainingProgressFunction", "Take", "TideData", "TrainingProgressMeasurements", "TakeDrop", "Tilde", "TrainingProgressReporting", "TakeLargest", "TildeEqual", "TrainingStoppingCriterion", "TakeLargestBy", "TildeFullEqual", "TrainingUpdateSchedule", "TakeList", "TildeTilde", "TransferFunctionCancel", "TakeSmallest", "TimeConstrained", "TransferFunctionExpand", "TakeSmallestBy", "TimeConstraint", "TransferFunctionFactor", "TakeWhile", "TimeDirection", "TransferFunctionModel", "Tally", "TimeFormat", "TransferFunctionPoles", "Tan", "TimeGoal", "TransferFunctionTransform", "Tanh", "TimelinePlot", "TransferFunctionZeros", "TargetDevice", "TimeObject", "TransformationClass", "TargetFunctions", "TimeObjectQ", "TransformationFunction", "TargetSystem", "TimeRemaining", "TransformationFunctions", "TargetUnits", "Times", "TransformationMatrix", "TaskAbort", "TimesBy", "TransformedDistribution", "TaskExecute", "TimeSeries", "TransformedField", "TaskObject", "TimeSeriesAggregate", "TransformedProcess", "TaskRemove", "TimeSeriesForecast", "TransformedRegion", "TaskResume", "TimeSeriesInsert", "TransitionDirection", "Tasks", "TimeSeriesInvertibility", "TransitionDuration", "TaskSuspend", "TimeSeriesMap", "TransitionEffect", "TaskWait", "TimeSeriesMapThread", "TransitiveClosureGraph", "TautologyQ", "TimeSeriesModel", "TransitiveReductionGraph", "TelegraphProcess", "TimeSeriesModelFit", "Translate", "TemplateApply", "TimeSeriesResample", "TranslationOptions", "TemplateBox", "TimeSeriesRescale", "TranslationTransform", "TemplateBoxOptions", "TimeSeriesShift", "Transliterate", "TemplateExpression", "TimeSeriesThread", "Transparent", "TemplateIf", "TimeSeriesWindow", "Transpose", "TemplateObject", "TimeUsed", "TransposeLayer", "TemplateSequence", "TimeValue", "TravelDirections", "TemplateSlot", "TimeZone", "TravelDirectionsData", "TemplateWith", "TimeZoneConvert", "TravelDistance", "TemporalData", "TimeZoneOffset", "TravelDistanceList", "TemporalRegularity", "Timing", "TravelMethod", "Temporary", "Tiny", "TravelTime", "TensorContract", "TitsGroupT", "TreeForm", "TensorDimensions", "ToBoxes", "TreeGraph", "TensorExpand", "ToCharacterCode", "TreeGraphQ", "TensorProduct", "ToContinuousTimeModel", "TreePlot", "TensorRank", "Today", "TrendStyle", "TensorReduce", "ToDiscreteTimeModel", "Triangle", "TensorSymmetry", "ToEntity", "TriangleCenter", "TensorTranspose", "ToeplitzMatrix", "TriangleConstruct", "TensorWedge", "ToExpression", "TriangleMeasurement", "TestID", "Together", "TriangleWave", "TestReport", "Toggler", "TriangularDistribution", "TestReportObject", "TogglerBar", "TriangulateMesh", "TestResultObject", "ToInvertibleTimeSeries", "Trig", "Tetrahedron", "TokenWords", "TrigExpand", "TeXForm", "Tolerance", "TrigFactor", "Text", "ToLowerCase", "TrigFactorList", "TextAlignment", "Tomorrow", "Trigger", "TextCases", "ToNumberField", "TrigReduce", "TextCell", "Tooltip", "TrigToExp", "TextClipboardType", "TooltipDelay", "TrimmedMean", "TextContents", "TooltipStyle", "TrimmedVariance", "TextData", "ToonShading", "TropicalStormData", "TextElement", "Top", "True", "TextGrid", "TopHatTransform", "TrueQ", "TextJustification", "ToPolarCoordinates", "TruncatedDistribution", "TextPacket", "TopologicalSort", "TruncatedPolyhedron", "TextPosition", "ToRadicals", "TsallisQExponentialDistribution", "TextRecognize", "ToRules", "TsallisQGaussianDistribution", "TextSearch", "ToSphericalCoordinates", "TTest", "TextSearchReport", "ToString", "Tube", "TextSentences", "Total", "Tuesday", "TextString", "TotalLayer", "TukeyLambdaDistribution", "TextStructure", "TotalVariationFilter", "TukeyWindow", "TextTranslation", "TotalWidth", "TunnelData", "Texture", "TouchPosition", "Tuples", "TextureCoordinateFunction", "TouchscreenAutoZoom", "TuranGraph", "TextureCoordinateScaling", "TouchscreenControlPlacement", "TuringMachine", "TextWords", "ToUpperCase", "TuttePolynomial", "Therefore", "Tr", "TwoWayRule", "ThermodynamicData", "Trace", "Typed", "ThermometerGauge", "TraceAbove", "TypeSpecifier", "Thick", "TraceBackward", "UnateQ", "UnitaryMatrixQ", "UpperCaseQ", "Uncompress", "UnitBox", "UpperLeftArrow", "UnconstrainedParameters", "UnitConvert", "UpperRightArrow", "Undefined", "UnitDimensions", "UpperTriangularize", "UnderBar", "Unitize", "UpperTriangularMatrixQ", "Underflow", "UnitRootTest", "Upsample", "Underlined", "UnitSimplify", "UpSet", "Underoverscript", "UnitStep", "UpSetDelayed", "UnderoverscriptBox", "UnitSystem", "UpTee", "UnderoverscriptBoxOptions", "UnitTriangle", "UpTeeArrow", "Underscript", "UnitVector", "UpTo", "UnderscriptBox", "UnitVectorLayer", "UpValues", "UnderscriptBoxOptions", "UnityDimensions", "URL", "UnderseaFeatureData", "UniverseModelData", "URLBuild", "UndirectedEdge", "UniversityData", "URLDecode", "UndirectedGraph", "UnixTime", "URLDispatcher", "UndirectedGraphQ", "Unprotect", "URLDownload", "UndoOptions", "UnregisterExternalEvaluator", "URLDownloadSubmit", "UndoTrackedVariables", "UnsameQ", "URLEncode", "Unequal", "UnsavedVariables", "URLExecute", "UnequalTo", "Unset", "URLExpand", "Unevaluated", "UnsetShared", "URLParse", "UniformDistribution", "UpArrow", "URLQueryDecode", "UniformGraphDistribution", "UpArrowBar", "URLQueryEncode", "UniformPolyhedron", "UpArrowDownArrow", "URLRead", "UniformSumDistribution", "Update", "URLResponseTime", "Uninstall", "UpdateInterval", "URLShorten", "Union", "UpdatePacletSites", "URLSubmit", "UnionedEntityClass", "UpdateSearchIndex", "UsingFrontEnd", "UnionPlus", "UpDownArrow", "UtilityFunction", "Unique", "UpEquilibrium", "ValenceErrorHandling", "VerifyDigitalSignature", "VertexStyle", "ValidationLength", "VerifyFileSignature", "VertexTextureCoordinates", "ValidationSet", "VerifyInterpretation", "VertexWeight", "ValueDimensions", "VerifySecurityCertificates", "VertexWeightedGraphQ", "ValuePreprocessingFunction", "VerifySolutions", "VerticalBar", "ValueQ", "VerifyTestAssumptions", "VerticalGauge", "Values", "VersionedPreferences", "VerticalSeparator", "Variables", "VertexAdd", "VerticalSlider", "Variance", "VertexCapacity", "VerticalTilde", "VarianceEquivalenceTest", "VertexColors", "Video", "VarianceEstimatorFunction", "VertexComponent", "VideoEncoding", "VarianceGammaDistribution", "VertexConnectivity", "VideoExtractFrames", "VarianceTest", "VertexContract", "VideoFrameList", "VectorAngle", "VertexCoordinates", "VideoFrameMap", "VectorAround", "VertexCorrelationSimilarity", "VideoPause", "VectorAspectRatio", "VertexCosineSimilarity", "VideoPlay", "VectorColorFunction", "VertexCount", "VideoQ", "VectorColorFunctionScaling", "VertexCoverQ", "VideoStop", "VectorDensityPlot", "VertexDataCoordinates", "VideoStream", "VectorGreater", "VertexDegree", "VideoStreams", "VectorGreaterEqual", "VertexDelete", "VideoTimeSeries", "VectorLess", "VertexDiceSimilarity", "VideoTracks", "VectorLessEqual", "VertexEccentricity", "VideoTrim", "VectorMarkers", "VertexInComponent", "ViewAngle", "VectorPlot", "VertexInDegree", "ViewCenter", "VectorPlot3D", "VertexIndex", "ViewMatrix", "VectorPoints", "VertexJaccardSimilarity", "ViewPoint", "VectorQ", "VertexLabels", "ViewProjection", "VectorRange", "VertexLabelStyle", "ViewRange", "Vectors", "VertexList", "ViewVector", "VectorScaling", "VertexNormals", "ViewVertical", "VectorSizes", "VertexOutComponent", "Visible", "VectorStyle", "VertexOutDegree", "VoiceStyleData", "Vee", "VertexQ", "VoigtDistribution", "Verbatim", "VertexReplace", "VolcanoData", "VerificationTest", "VertexShape", "Volume", "VerifyConvergence", "VertexShapeFunction", "VonMisesDistribution", "VerifyDerivedKey", "VertexSize", "VoronoiMesh", "WaitAll", "WeierstrassEta2", "WindowElements", "WaitNext", "WeierstrassEta3", "WindowFloating", "WakebyDistribution", "WeierstrassHalfPeriods", "WindowFrame", "WalleniusHypergeometricDistribution", "WeierstrassHalfPeriodW1", "WindowFrameElements", "WaringYuleDistribution", "WeierstrassHalfPeriodW2", "WindowMargins", "WarpingCorrespondence", "WeierstrassHalfPeriodW3", "WindowOpacity", "WarpingDistance", "WeierstrassInvariantG2", "WindowSize", "WatershedComponents", "WeierstrassInvariantG3", "WindowStatusArea", "WatsonUSquareTest", "WeierstrassInvariants", "WindowTitle", "WattsStrogatzGraphDistribution", "WeierstrassP", "WindowToolbars", "WaveletBestBasis", "WeierstrassPPrime", "WindSpeedData", "WaveletFilterCoefficients", "WeierstrassSigma", "WindVectorData", "WaveletImagePlot", "WeierstrassZeta", "WinsorizedMean", "WaveletListPlot", "WeightedAdjacencyGraph", "WinsorizedVariance", "WaveletMapIndexed", "WeightedAdjacencyMatrix", "WishartMatrixDistribution", "WaveletMatrixPlot", "WeightedData", "With", "WaveletPhi", "WeightedGraphQ", "WolframAlpha", "WaveletPsi", "Weights", "WolframLanguageData", "WaveletScale", "WelchWindow", "Word", "WaveletScalogram", "WheelGraph", "WordBoundary", "WaveletThreshold", "WhenEvent", "WordCharacter", "WeaklyConnectedComponents", "Which", "WordCloud", "WeaklyConnectedGraphComponents", "While", "WordCount", "WeaklyConnectedGraphQ", "White", "WordCounts", "WeakStationarity", "WhiteNoiseProcess", "WordData", "WeatherData", "WhitePoint", "WordDefinition", "WeatherForecastData", "Whitespace", "WordFrequency", "WebAudioSearch", "WhitespaceCharacter", "WordFrequencyData", "WebElementObject", "WhittakerM", "WordList", "WeberE", "WhittakerW", "WordOrientation", "WebExecute", "WienerFilter", "WordSearch", "WebImage", "WienerProcess", "WordSelectionFunction", "WebImageSearch", "WignerD", "WordSeparators", "WebSearch", "WignerSemicircleDistribution", "WordSpacings", "WebSessionObject", "WikidataData", "WordStem", "WebSessions", "WikidataSearch", "WordTranslation", "WebWindowObject", "WikipediaData", "WorkingPrecision", "Wedge", "WikipediaSearch", "WrapAround", "Wednesday", "WilksW", "Write", "WeibullDistribution", "WilksWTest", "WriteLine", "WeierstrassE1", "WindDirectionData", "WriteString", "WeierstrassE2", "WindingCount", "Wronskian", "WeierstrassE3", "WindingPolygon", "WeierstrassEta1", "WindowClickSelect", "XMLElement", "XMLTemplate", "Xor", "XMLObject", "Xnor", "XYZColor", "Yellow", "Yesterday", "YuleDissimilarity", "ZernikeR", "ZetaZero", "ZoomFactor", "ZeroSymmetric", "ZIPCodeData", "ZTest", "ZeroTest", "ZipfDistribution", "ZTransform", "Zeta", "ZoomCenter"] + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/matlab.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/matlab.rb new file mode 100644 index 000000000000..f667951abd45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/matlab.rb @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Matlab < RegexLexer + title "MATLAB" + desc "Matlab" + tag 'matlab' + aliases 'm' + filenames '*.m' + mimetypes 'text/x-matlab', 'application/x-matlab' + + def self.keywords + @keywords = Set.new %w( + break case catch classdef continue else elseif end for function + global if otherwise parfor persistent return spmd switch try while + ) + end + + # self-modifying method that loads the builtins file + def self.builtins + Kernel::load File.join(Lexers::BASE_DIR, 'matlab/keywords.rb') + builtins + end + + state :root do + rule %r/\s+/m, Text # Whitespace + rule %r([{]%.*?%[}])m, Comment::Multiline + rule %r/%.*$/, Comment::Single + rule %r/([.][.][.])(.*?)$/ do + groups(Keyword, Comment) + end + + rule %r/^(!)(.*?)(?=%|$)/ do |m| + token Keyword, m[1] + delegate Shell, m[2] + end + + + rule %r/[a-zA-Z][_a-zA-Z0-9]*/m do |m| + match = m[0] + if self.class.keywords.include? match + token Keyword + elsif self.class.builtins.include? match + token Name::Builtin + else + token Name + end + end + + rule %r{[(){};:,\/\\\]\[]}, Punctuation + + rule %r/~=|==|<<|>>|[-~+\/*%=<>&^|.@]/, Operator + + + rule %r/(\d+\.\d*|\d*\.\d+)(e[+-]?[0-9]+)?/i, Num::Float + rule %r/\d+e[+-]?[0-9]+/i, Num::Float + rule %r/\d+L/, Num::Integer::Long + rule %r/\d+/, Num::Integer + + rule %r/'(?=(.*'))/, Str::Single, :chararray + rule %r/"(?=(.*"))/, Str::Double, :string + rule %r/'/, Operator + end + + state :chararray do + rule %r/[^']+/, Str::Single + rule %r/''/, Str::Escape + rule %r/'/, Str::Single, :pop! + end + + state :string do + rule %r/[^"]+/, Str::Double + rule %r/""/, Str::Escape + rule %r/"/, Str::Double, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/matlab/builtins.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/matlab/builtins.rb new file mode 100644 index 000000000000..63d9bb595d6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/matlab/builtins.rb @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# automatically generated by `rake builtins:matlab` +module Rouge + module Lexers + def Matlab.builtins + @builtins ||= Set.new ["abs", "accumarray", "acos", "acosd", "acosh", "acot", "acotd", "acoth", "acsc", "acscd", "acsch", "actxcontrol", "actxcontrollist", "actxcontrolselect", "actxGetRunningServer", "actxserver", "add", "addboundary", "addcats", "addCause", "addClass", "addCondition", "addConditionsFrom", "addConstructor", "addCorrection", "addedge", "addevent", "addFields", "addFields", "addFile", "addFolderIncludingChildFiles", "addFunction", "addLabel", "addlistener", "addMethod", "addmulti", "addnode", "addOptional", "addParameter", "addParamValue", "addPath", "addpath", "addPlugin", "addpoints", "addpref", "addprop", "addprop", "addproperty", "addProperty", "addReference", "addRequired", "addsample", "addsampletocollection", "addShortcut", "addShutdownFile", "addStartupFile", "addTeardown", "addTeardown", "addtodate", "addToolbarExplorationButtons", "addts", "addvars", "adjacency", "airy", "align", "alim", "all", "allchild", "allowModelReferenceDiscreteSampleTimeInheritanceImpl", "alpha", "alphamap", "alphaShape", "alphaSpectrum", "alphaTriangulation", "amd", "analyzeCodeCompatibility", "ancestor", "and", "angle", "animatedline", "annotation", "ans", "any", "appdesigner", "append", "append", "applyFixture", "applyFixture", "area", "area", "area", "array2table", "array2timetable", "arrayfun", "ascii", "asec", "asecd", "asech", "asin", "asind", "asinh", "assert", "assertAccessed", "assertCalled", "assertClass", "assertEmpty", "assertEqual", "assertError", "assertFail", "assertFalse", "assertGreaterThan", "assertGreaterThanOrEqual", "assertInstanceOf", "assertLength", "assertLessThan", "assertLessThanOrEqual", "assertMatches", "assertNotAccessed", "assertNotCalled", "assertNotEmpty", "assertNotEqual", "assertNotSameHandle", "assertNotSet", "assertNumElements", "assertReturnsTrue", "assertSameHandle", "assertSet", "assertSize", "assertSubstring", "assertThat", "assertTrue", "assertUsing", "assertWarning", "assertWarningFree", "assignin", "assignOutputsWhen", "assumeAccessed", "assumeCalled", "assumeClass", "assumeEmpty", "assumeEqual", "assumeError", "assumeFail", "assumeFalse", "assumeGreaterThan", "assumeGreaterThanOrEqual", "assumeInstanceOf", "assumeLength", "assumeLessThan", "assumeLessThanOrEqual", "assumeMatches", "assumeNotAccessed", "assumeNotCalled", "assumeNotEmpty", "assumeNotEqual", "assumeNotSameHandle", "assumeNotSet", "assumeNumElements", "assumeReturnsTrue", "assumeSameHandle", "assumeSet", "assumeSize", "assumeSubstring", "assumeThat", "assumeTrue", "assumeUsing", "assumeWarning", "assumeWarningFree", "atan", "atan2", "atan2d", "atand", "atanh", "audiodevinfo", "audioinfo", "audioplayer", "audioread", "audiorecorder", "audiowrite", "autumn", "aviinfo", "axes", "axis", "axtoolbar", "axtoolbarbtn", "balance", "bandwidth", "bar", "bar3", "bar3h", "barh", "barycentricToCartesian", "baryToCart", "base2dec", "batchStartupOptionUsed", "bctree", "beep", "BeginInvoke", "bench", "besselh", "besseli", "besselj", "besselk", "bessely", "beta", "betainc", "betaincinv", "betaln", "between", "bfsearch", "bicg", "bicgstab", "bicgstabl", "biconncomp", "bin2dec", "binary", "binscatter", "bitand", "bitcmp", "bitget", "bitnot", "bitor", "bitset", "bitshift", "bitxor", "blanks", "blkdiag", "bone", "boundary", "boundary", "boundaryFacets", "boundaryshape", "boundingbox", "bounds", "box", "break", "brighten", "brush", "bsxfun", "build", "builddocsearchdb", "builtin", "bvp4c", "bvp5c", "bvpget", "bvpinit", "bvpset", "bvpxtend", "caldays", "caldiff", "calendar", "calendarDuration", "calllib", "callSoapService", "calmonths", "calquarters", "calweeks", "calyears", "camdolly", "cameratoolbar", "camlight", "camlookat", "camorbit", "campan", "campos", "camproj", "camroll", "camtarget", "camup", "camva", "camzoom", "cancel", "cancelled", "cart2pol", "cart2sph", "cartesianToBarycentric", "cartToBary", "cast", "cat", "cat", "categorical", "categories", "caxis", "cd", "cd", "cdf2rdf", "cdfepoch", "cdfinfo", "cdflib", "cdflib.close", "cdflib.closeVar", "cdflib.computeEpoch", "cdflib.computeEpoch16", "cdflib.create", "cdflib.createAttr", "cdflib.createVar", "cdflib.delete", "cdflib.deleteAttr", "cdflib.deleteAttrEntry", "cdflib.deleteAttrgEntry", "cdflib.deleteVar", "cdflib.deleteVarRecords", "cdflib.epoch16Breakdown", "cdflib.epochBreakdown", "cdflib.getAttrEntry", "cdflib.getAttrgEntry", "cdflib.getAttrMaxEntry", "cdflib.getAttrMaxgEntry", "cdflib.getAttrName", "cdflib.getAttrNum", "cdflib.getAttrScope", "cdflib.getCacheSize", "cdflib.getChecksum", "cdflib.getCompression", "cdflib.getCompressionCacheSize", "cdflib.getConstantNames", "cdflib.getConstantValue", "cdflib.getCopyright", "cdflib.getFileBackward", "cdflib.getFormat", "cdflib.getLibraryCopyright", "cdflib.getLibraryVersion", "cdflib.getMajority", "cdflib.getName", "cdflib.getNumAttrEntries", "cdflib.getNumAttrgEntries", "cdflib.getNumAttributes", "cdflib.getNumgAttributes", "cdflib.getReadOnlyMode", "cdflib.getStageCacheSize", "cdflib.getValidate", "cdflib.getVarAllocRecords", "cdflib.getVarBlockingFactor", "cdflib.getVarCacheSize", "cdflib.getVarCompression", "cdflib.getVarData", "cdflib.getVarMaxAllocRecNum", "cdflib.getVarMaxWrittenRecNum", "cdflib.getVarName", "cdflib.getVarNum", "cdflib.getVarNumRecsWritten", "cdflib.getVarPadValue", "cdflib.getVarRecordData", "cdflib.getVarReservePercent", "cdflib.getVarsMaxWrittenRecNum", "cdflib.getVarSparseRecords", "cdflib.getVersion", "cdflib.hyperGetVarData", "cdflib.hyperPutVarData", "cdflib.inquire", "cdflib.inquireAttr", "cdflib.inquireAttrEntry", "cdflib.inquireAttrgEntry", "cdflib.inquireVar", "cdflib.open", "cdflib.putAttrEntry", "cdflib.putAttrgEntry", "cdflib.putVarData", "cdflib.putVarRecordData", "cdflib.renameAttr", "cdflib.renameVar", "cdflib.setCacheSize", "cdflib.setChecksum", "cdflib.setCompression", "cdflib.setCompressionCacheSize", "cdflib.setFileBackward", "cdflib.setFormat", "cdflib.setMajority", "cdflib.setReadOnlyMode", "cdflib.setStageCacheSize", "cdflib.setValidate", "cdflib.setVarAllocBlockRecords", "cdflib.setVarBlockingFactor", "cdflib.setVarCacheSize", "cdflib.setVarCompression", "cdflib.setVarInitialRecs", "cdflib.setVarPadValue", "cdflib.SetVarReservePercent", "cdflib.setVarsCacheSize", "cdflib.setVarSparseRecords", "cdfread", "cdfwrite", "ceil", "cell", "cell2mat", "cell2struct", "cell2table", "celldisp", "cellfun", "cellplot", "cellstr", "centrality", "centroid", "cgs", "changeFields", "changeFields", "char", "char", "checkcode", "checkin", "checkout", "chol", "cholupdate", "choose", "circshift", "circumcenter", "circumcenters", "cla", "clabel", "class", "classdef", "classUnderlying", "clc", "clear", "clear", "clearAllMemoizedCaches", "clearCache", "clearMockHistory", "clearPersonalValue", "clearpoints", "clearTemporaryValue", "clearvars", "clf", "clibgen.buildInterface", "clibgen.ClassDefinition", "clibgen.ConstructorDefinition", "clibgen.EnumDefinition", "clibgen.FunctionDefinition", "clibgen.generateLibraryDefinition", "clibgen.LibraryDefinition", "clibgen.MethodDefinition", "clibgen.PropertyDefinition", "clibRelease", "clipboard", "clock", "clone", "close", "close", "close", "close", "close", "closeFile", "closereq", "cmopts", "cmpermute", "cmunique", "CodeCompatibilityAnalysis", "codeCompatibilityReport", "colamd", "collapse", "colon", "colorbar", "colorcube", "colordef", "colormap", "ColorSpec", "colperm", "COM", "com.mathworks.engine.MatlabEngine", "com.mathworks.matlab.types.CellStr", "com.mathworks.matlab.types.Complex", "com.mathworks.matlab.types.HandleObject", "com.mathworks.matlab.types.Struct", "combine", "Combine", "CombinedDatastore", "comet", "comet3", "compan", "compass", "complete", "complete", "complete", "complete", "complete", "complete", "complete", "complex", "compose", "computer", "cond", "condeig", "condensation", "condest", "coneplot", "conj", "conncomp", "containers.Map", "contains", "continue", "contour", "contour3", "contourc", "contourf", "contourslice", "contrast", "conv", "conv2", "convert", "convert", "convert", "convertCharsToStrings", "convertContainedStringsToChars", "convertLike", "convertStringsToChars", "convertvars", "convexHull", "convexHull", "convhull", "convhull", "convhulln", "convn", "cool", "copper", "copy", "copyElement", "copyfile", "copyHDU", "copyobj", "copyTo", "corrcoef", "cos", "cosd", "cosh", "cospi", "cot", "cotd", "coth", "count", "countcats", "countEachLabel", "cov", "cplxpair", "cputime", "createCategory", "createClassFromWsdl", "createFile", "createImg", "createLabel", "createMock", "createSampleTime", "createSharedTestFixture", "createSoapMessage", "createTbl", "createTestClassInstance", "createTestMethodInstance", "criticalAlpha", "cross", "csc", "cscd", "csch", "csvread", "csvwrite", "ctranspose", "cummax", "cummin", "cumprod", "cumsum", "cumtrapz", "curl", "currentProject", "customverctrl", "cylinder", "daqread", "daspect", "datacursormode", "datastore", "dataTipInteraction", "dataTipTextRow", "date", "datenum", "dateshift", "datestr", "datetick", "datetime", "datevec", "day", "days", "dbclear", "dbcont", "dbdown", "dblquad", "dbmex", "dbquit", "dbstack", "dbstatus", "dbstep", "dbstop", "dbtype", "dbup", "dde23", "ddeget", "ddensd", "ddesd", "ddeset", "deal", "deblank", "dec2base", "dec2bin", "dec2hex", "decic", "decomposition", "deconv", "defineArgument", "defineArgument", "defineArgument", "defineOutput", "defineOutput", "deg2rad", "degree", "del2", "delaunay", "delaunayn", "DelaunayTri", "DelaunayTri", "delaunayTriangulation", "delegateTo", "delegateTo", "delete", "delete", "delete", "delete", "delete", "deleteCol", "deleteFile", "deleteHDU", "deleteKey", "deleteproperty", "deleteRecord", "deleteRows", "delevent", "delimitedTextImportOptions", "delsample", "delsamplefromcollection", "demo", "det", "details", "detectImportOptions", "detrend", "detrend", "deval", "dfsearch", "diag", "diagnose", "dialog", "diary", "diff", "diffuse", "digraph", "dir", "dir", "disableDefaultInteractivity", "discretize", "disp", "disp", "disp", "display", "displayEmptyObject", "displayNonScalarObject", "displayScalarHandleToDeletedObject", "displayScalarObject", "dissect", "distances", "dither", "divergence", "dlmread", "dlmwrite", "dmperm", "doc", "docsearch", "done", "done", "dos", "dot", "double", "drag", "dragrect", "drawnow", "dsearchn", "duration", "dynamicprops", "echo", "echodemo", "edgeAttachments", "edgeAttachments", "edgecount", "edges", "edges", "edit", "eig", "eigs", "ellipj", "ellipke", "ellipsoid", "empty", "enableDefaultInteractivity", "enableNETfromNetworkDrive", "enableservice", "end", "EndInvoke", "endsWith", "enumeration", "eomday", "eps", "eq", "eq", "equilibrate", "erase", "eraseBetween", "erf", "erfc", "erfcinv", "erfcx", "erfinv", "error", "errorbar", "errordlg", "etime", "etree", "etreeplot", "eval", "evalc", "evalin", "event.DynamicPropertyEvent", "event.EventData", "event.hasListener", "event.listener", "event.PropertyEvent", "event.proplistener", "eventlisteners", "events", "events", "exceltime", "Execute", "exist", "exit", "exp", "expand", "expectedContentLength", "expectedContentLength", "expint", "expm", "expm1", "export", "export2wsdlg", "exportsetupdlg", "extractAfter", "extractBefore", "extractBetween", "eye", "ezcontour", "ezcontourf", "ezmesh", "ezmeshc", "ezplot", "ezplot3", "ezpolar", "ezsurf", "ezsurfc", "faceNormal", "faceNormals", "factor", "factorial", "false", "fatalAssertAccessed", "fatalAssertCalled", "fatalAssertClass", "fatalAssertEmpty", "fatalAssertEqual", "fatalAssertError", "fatalAssertFail", "fatalAssertFalse", "fatalAssertGreaterThan", "fatalAssertGreaterThanOrEqual", "fatalAssertInstanceOf", "fatalAssertLength", "fatalAssertLessThan", "fatalAssertLessThanOrEqual", "fatalAssertMatches", "fatalAssertNotAccessed", "fatalAssertNotCalled", "fatalAssertNotEmpty", "fatalAssertNotEqual", "fatalAssertNotSameHandle", "fatalAssertNotSet", "fatalAssertNumElements", "fatalAssertReturnsTrue", "fatalAssertSameHandle", "fatalAssertSet", "fatalAssertSize", "fatalAssertSubstring", "fatalAssertThat", "fatalAssertTrue", "fatalAssertUsing", "fatalAssertWarning", "fatalAssertWarningFree", "fclose", "fclose", "fcontour", "feather", "featureEdges", "featureEdges", "feof", "ferror", "feval", "Feval", "feval", "fewerbins", "fft", "fft2", "fftn", "fftshift", "fftw", "fgetl", "fgetl", "fgets", "fgets", "fieldnames", "figure", "figurepalette", "fileattrib", "fileDatastore", "filemarker", "fileMode", "fileName", "fileparts", "fileread", "filesep", "fill", "fill3", "fillmissing", "filloutliers", "filter", "filter", "filter2", "fimplicit", "fimplicit3", "find", "findall", "findCategory", "findedge", "findEvent", "findfigs", "findFile", "findgroups", "findLabel", "findnode", "findobj", "findobj", "findprop", "findstr", "finish", "fitsdisp", "fitsinfo", "fitsread", "fitswrite", "fix", "fixedWidthImportOptions", "flag", "flintmax", "flip", "flipdim", "flipedge", "fliplr", "flipud", "floor", "flow", "fmesh", "fminbnd", "fminsearch", "fopen", "fopen", "for", "format", "fplot", "fplot3", "fprintf", "fprintf", "frame2im", "fread", "fread", "freeBoundary", "freeBoundary", "freqspace", "frewind", "fscanf", "fscanf", "fseek", "fsurf", "ftell", "ftp", "full", "fullfile", "func2str", "function", "functions", "FunctionTestCase", "functiontests", "funm", "fwrite", "fwrite", "fzero", "gallery", "gamma", "gammainc", "gammaincinv", "gammaln", "gather", "gca", "gcbf", "gcbo", "gcd", "gcf", "gcmr", "gco", "ge", "genpath", "genvarname", "geoaxes", "geobasemap", "geobubble", "geodensityplot", "geolimits", "geoplot", "geoscatter", "geotickformat", "get", "get", "get", "get", "get", "get", "get", "get", "get", "get", "get", "getabstime", "getabstime", "getAColParms", "getappdata", "getaudiodata", "getBColParms", "GetCharArray", "getClass", "getColName", "getColType", "getConstantValue", "getCurrentTime", "getData", "getData", "getData", "getData", "getData", "getdatasamples", "getdatasamplesize", "getDiagnosticFor", "getDiagnosticFor", "getDiscreteStateImpl", "getDiscreteStateSpecificationImpl", "getdisp", "getenv", "getEqColType", "getfield", "getFields", "getFields", "getFileFormats", "getFooter", "getframe", "GetFullMatrix", "getGlobalNamesImpl", "getHdrSpace", "getHDUnum", "getHDUtype", "getHeader", "getHeaderImpl", "getIconImpl", "getImgSize", "getImgType", "getImpulseResponseLengthImpl", "getInputDimensionConstraintImpl", "getinterpmethod", "getLocation", "getLocation", "getMockHistory", "getNegativeDiagnosticFor", "getnext", "getNumCols", "getNumHDUs", "getNumInputs", "getNumInputsImpl", "getNumOutputs", "getNumOutputsImpl", "getNumRows", "getOpenFiles", "getOutputDataTypeImpl", "getOutputDimensionConstraintImpl", "getOutputSizeImpl", "getParameter", "getParameter", "getParameter", "getpixelposition", "getplayer", "getpoints", "getPostActValString", "getPostConditionString", "getPostDescriptionString", "getPostExpValString", "getPreDescriptionString", "getpref", "getProfiles", "getPropertyGroups", "getPropertyGroupsImpl", "getqualitydesc", "getReasonPhrase", "getReasonPhrase", "getReport", "getsamples", "getSampleTime", "getSampleTimeImpl", "getsampleusingtime", "getsampleusingtime", "getSharedTestFixtures", "getSimulateUsingImpl", "getSimulinkFunctionNamesImpl", "gettimeseriesnames", "getTimeStr", "gettsafteratevent", "gettsafterevent", "gettsatevent", "gettsbeforeatevent", "gettsbeforeevent", "gettsbetweenevents", "GetVariable", "getvaropts", "getVersion", "GetWorkspaceData", "ginput", "global", "gmres", "gobjects", "gplot", "grabcode", "gradient", "graph", "GraphPlot", "gray", "graymon", "grid", "griddata", "griddatan", "griddedInterpolant", "groot", "groupcounts", "groupsummary", "grouptransform", "gsvd", "gt", "gtext", "guidata", "guide", "guihandles", "gunzip", "gzip", "H5.close", "H5.garbage_collect", "H5.get_libversion", "H5.open", "H5.set_free_list_limits", "H5A.close", "H5A.create", "H5A.delete", "H5A.get_info", "H5A.get_name", "H5A.get_space", "H5A.get_type", "H5A.iterate", "H5A.open", "H5A.open_by_idx", "H5A.open_by_name", "H5A.read", "H5A.write", "h5create", "H5D.close", "H5D.create", "H5D.get_access_plist", "H5D.get_create_plist", "H5D.get_offset", "H5D.get_space", "H5D.get_space_status", "H5D.get_storage_size", "H5D.get_type", "H5D.open", "H5D.read", "H5D.set_extent", "H5D.vlen_get_buf_size", "H5D.write", "h5disp", "H5DS.attach_scale", "H5DS.detach_scale", "H5DS.get_label", "H5DS.get_num_scales", "H5DS.get_scale_name", "H5DS.is_scale", "H5DS.iterate_scales", "H5DS.set_label", "H5DS.set_scale", "H5E.clear", "H5E.get_major", "H5E.get_minor", "H5E.walk", "H5F.close", "H5F.create", "H5F.flush", "H5F.get_access_plist", "H5F.get_create_plist", "H5F.get_filesize", "H5F.get_freespace", "H5F.get_info", "H5F.get_mdc_config", "H5F.get_mdc_hit_rate", "H5F.get_mdc_size", "H5F.get_name", "H5F.get_obj_count", "H5F.get_obj_ids", "H5F.is_hdf5", "H5F.mount", "H5F.open", "H5F.reopen", "H5F.set_mdc_config", "H5F.unmount", "H5G.close", "H5G.create", "H5G.get_info", "H5G.open", "H5I.dec_ref", "H5I.get_file_id", "H5I.get_name", "H5I.get_ref", "H5I.get_type", "H5I.inc_ref", "H5I.is_valid", "h5info", "H5L.copy", "H5L.create_external", "H5L.create_hard", "H5L.create_soft", "H5L.delete", "H5L.exists", "H5L.get_info", "H5L.get_name_by_idx", "H5L.get_val", "H5L.iterate", "H5L.iterate_by_name", "H5L.move", "H5L.visit", "H5L.visit_by_name", "H5ML.compare_values", "H5ML.get_constant_names", "H5ML.get_constant_value", "H5ML.get_function_names", "H5ML.get_mem_datatype", "H5ML.hoffset", "H5ML.sizeof", "H5O.close", "H5O.copy", "H5O.get_comment", "H5O.get_comment_by_name", "H5O.get_info", "H5O.link", "H5O.open", "H5O.open_by_idx", "H5O.set_comment", "H5O.set_comment_by_name", "H5O.visit", "H5O.visit_by_name", "H5P.all_filters_avail", "H5P.close", "H5P.close_class", "H5P.copy", "H5P.create", "H5P.equal", "H5P.exist", "H5P.fill_value_defined", "H5P.get", "H5P.get_alignment", "H5P.get_alloc_time", "H5P.get_attr_creation_order", "H5P.get_attr_phase_change", "H5P.get_btree_ratios", "H5P.get_char_encoding", "H5P.get_chunk", "H5P.get_chunk_cache", "H5P.get_class", "H5P.get_class_name", "H5P.get_class_parent", "H5P.get_copy_object", "H5P.get_create_intermediate_group", "H5P.get_driver", "H5P.get_edc_check", "H5P.get_external", "H5P.get_external_count", "H5P.get_family_offset", "H5P.get_fapl_core", "H5P.get_fapl_family", "H5P.get_fapl_multi", "H5P.get_fclose_degree", "H5P.get_fill_time", "H5P.get_fill_value", "H5P.get_filter", "H5P.get_filter_by_id", "H5P.get_gc_references", "H5P.get_hyper_vector_size", "H5P.get_istore_k", "H5P.get_layout", "H5P.get_libver_bounds", "H5P.get_link_creation_order", "H5P.get_link_phase_change", "H5P.get_mdc_config", "H5P.get_meta_block_size", "H5P.get_multi_type", "H5P.get_nfilters", "H5P.get_nprops", "H5P.get_sieve_buf_size", "H5P.get_size", "H5P.get_sizes", "H5P.get_small_data_block_size", "H5P.get_sym_k", "H5P.get_userblock", "H5P.get_version", "H5P.isa_class", "H5P.iterate", "H5P.modify_filter", "H5P.remove_filter", "H5P.set", "H5P.set_alignment", "H5P.set_alloc_time", "H5P.set_attr_creation_order", "H5P.set_attr_phase_change", "H5P.set_btree_ratios", "H5P.set_char_encoding", "H5P.set_chunk", "H5P.set_chunk_cache", "H5P.set_copy_object", "H5P.set_create_intermediate_group", "H5P.set_deflate", "H5P.set_edc_check", "H5P.set_external", "H5P.set_family_offset", "H5P.set_fapl_core", "H5P.set_fapl_family", "H5P.set_fapl_log", "H5P.set_fapl_multi", "H5P.set_fapl_sec2", "H5P.set_fapl_split", "H5P.set_fapl_stdio", "H5P.set_fclose_degree", "H5P.set_fill_time", "H5P.set_fill_value", "H5P.set_filter", "H5P.set_fletcher32", "H5P.set_gc_references", "H5P.set_hyper_vector_size", "H5P.set_istore_k", "H5P.set_layout", "H5P.set_libver_bounds", "H5P.set_link_creation_order", "H5P.set_link_phase_change", "H5P.set_mdc_config", "H5P.set_meta_block_size", "H5P.set_multi_type", "H5P.set_nbit", "H5P.set_scaleoffset", "H5P.set_shuffle", "H5P.set_sieve_buf_size", "H5P.set_sizes", "H5P.set_small_data_block_size", "H5P.set_sym_k", "H5P.set_userblock", "H5R.create", "H5R.dereference", "H5R.get_name", "H5R.get_obj_type", "H5R.get_region", "h5read", "h5readatt", "H5S.close", "H5S.copy", "H5S.create", "H5S.create_simple", "H5S.extent_copy", "H5S.get_select_bounds", "H5S.get_select_elem_npoints", "H5S.get_select_elem_pointlist", "H5S.get_select_hyper_blocklist", "H5S.get_select_hyper_nblocks", "H5S.get_select_npoints", "H5S.get_select_type", "H5S.get_simple_extent_dims", "H5S.get_simple_extent_ndims", "H5S.get_simple_extent_npoints", "H5S.get_simple_extent_type", "H5S.is_simple", "H5S.offset_simple", "H5S.select_all", "H5S.select_elements", "H5S.select_hyperslab", "H5S.select_none", "H5S.select_valid", "H5S.set_extent_none", "H5S.set_extent_simple", "H5T.array_create", "H5T.close", "H5T.commit", "H5T.committed", "H5T.copy", "H5T.create", "H5T.detect_class", "H5T.enum_create", "H5T.enum_insert", "H5T.enum_nameof", "H5T.enum_valueof", "H5T.equal", "H5T.get_array_dims", "H5T.get_array_ndims", "H5T.get_class", "H5T.get_create_plist", "H5T.get_cset", "H5T.get_ebias", "H5T.get_fields", "H5T.get_inpad", "H5T.get_member_class", "H5T.get_member_index", "H5T.get_member_name", "H5T.get_member_offset", "H5T.get_member_type", "H5T.get_member_value", "H5T.get_native_type", "H5T.get_nmembers", "H5T.get_norm", "H5T.get_offset", "H5T.get_order", "H5T.get_pad", "H5T.get_precision", "H5T.get_sign", "H5T.get_size", "H5T.get_strpad", "H5T.get_super", "H5T.get_tag", "H5T.insert", "H5T.is_variable_str", "H5T.lock", "H5T.open", "H5T.pack", "H5T.set_cset", "H5T.set_ebias", "H5T.set_fields", "H5T.set_inpad", "H5T.set_norm", "H5T.set_offset", "H5T.set_order", "H5T.set_pad", "H5T.set_precision", "H5T.set_sign", "H5T.set_size", "H5T.set_strpad", "H5T.set_tag", "H5T.vlen_create", "h5write", "h5writeatt", "H5Z.filter_avail", "H5Z.get_filter_info", "hadamard", "handle", "hankel", "hasdata", "hasdata", "hasFactoryValue", "hasfile", "hasFrame", "hasnext", "hasPersonalValue", "hasTemporaryValue", "hdf5info", "hdf5read", "hdf5write", "hdfan", "hdfdf24", "hdfdfr8", "hdfh", "hdfhd", "hdfhe", "hdfhx", "hdfinfo", "hdfml", "hdfpt", "hdfread", "hdftool", "hdfv", "hdfvf", "hdfvh", "hdfvs", "head", "heatmap", "height", "help", "helpbrowser", "helpdesk", "helpdlg", "helpwin", "hess", "hex2dec", "hex2num", "hgexport", "hggroup", "hgload", "hgsave", "hgtransform", "hidden", "highlight", "hilb", "hist", "histc", "histcounts", "histcounts2", "histogram", "histogram2", "hms", "hold", "holes", "home", "horzcat", "horzcat", "horzcat", "hot", "hour", "hours", "hover", "hsv", "hsv2rgb", "hypot", "ichol", "idealfilter", "idivide", "ifft", "ifft2", "ifftn", "ifftshift", "ilu", "im2double", "im2frame", "im2java", "imag", "image", "imageDatastore", "imagesc", "imapprox", "imfinfo", "imformats", "imgCompress", "import", "importdata", "imread", "imresize", "imshow", "imtile", "imwrite", "incenter", "incenters", "incidence", "ind2rgb", "ind2sub", "indegree", "inedges", "Inf", "info", "infoImpl", "initialize", "initialize", "initialize", "initialize", "initialize", "initializeDatastore", "initializeDatastore", "inline", "inmem", "inner2outer", "innerjoin", "inOutStatus", "inpolygon", "input", "inputdlg", "inputname", "inputParser", "insertAfter", "insertATbl", "insertBefore", "insertBTbl", "insertCol", "insertImg", "insertRows", "inShape", "inspect", "instrcallback", "instrfind", "instrfindall", "int16", "int2str", "int32", "int64", "int8", "integral", "integral2", "integral3", "interp1", "interp1q", "interp2", "interp3", "interpft", "interpn", "interpstreamspeed", "intersect", "intersect", "intmax", "intmin", "inv", "invhilb", "invoke", "ipermute", "iqr", "is*", "isa", "isappdata", "isaUnderlying", "isbanded", "isbetween", "iscalendarduration", "iscategorical", "iscategory", "iscell", "iscellstr", "ischange", "ischar", "iscolumn", "iscom", "isCompatible", "isCompressedImg", "isConnected", "isdag", "isdatetime", "isdiag", "isdir", "isDiscreteStateSpecificationMutableImpl", "isDone", "isDoneImpl", "isdst", "isduration", "isEdge", "isempty", "isempty", "isenum", "isequal", "isequaln", "isequalwithequalnans", "isevent", "isfield", "isfile", "isfinite", "isfloat", "isfolder", "isfullfile", "isfullfile", "isgraphics", "ishandle", "ishermitian", "ishghandle", "ishold", "ishole", "isIllConditioned", "isInactivePropertyImpl", "isinf", "isInputComplexityMutableImpl", "isInputDataTypeMutableImpl", "isInputDirectFeedthroughImpl", "isInputSizeLockedImpl", "isInputSizeMutableImpl", "isinteger", "isinterface", "isInterior", "isinterior", "isisomorphic", "isjava", "isKey", "iskeyword", "isletter", "isLoaded", "islocalmax", "islocalmin", "isLocked", "islogical", "ismac", "ismatrix", "ismember", "ismembertol", "ismethod", "ismissing", "ismultigraph", "isnan", "isnat", "isNull", "isnumeric", "isobject", "isocaps", "isocolors", "isomorphism", "isonormals", "isordinal", "isosurface", "isoutlier", "isOutputComplexImpl", "isOutputFixedSizeImpl", "ispc", "isplaying", "ispref", "isprime", "isprop", "isprotected", "isreal", "isrecording", "isregular", "isrow", "isscalar", "issimplified", "issorted", "issortedrows", "isspace", "issparse", "isstr", "isstring", "isStringScalar", "isstrprop", "isstruct", "isstudent", "issymmetric", "istable", "istall", "istimetable", "istril", "istriu", "isTunablePropertyDataTypeMutableImpl", "isundefined", "isunix", "isvalid", "isvalid", "isvalid", "isvarname", "isvector", "isweekend", "javaaddpath", "javaArray", "javachk", "javaclasspath", "javaMethod", "javaMethodEDT", "javaObject", "javaObjectEDT", "javarmpath", "jet", "join", "join", "join", "jsondecode", "jsonencode", "juliandate", "keepMeasuring", "keyboard", "keys", "KeyValueDatastore", "KeyValueStore", "kron", "labeledge", "labelnode", "lag", "laplacian", "lasterr", "lasterror", "lastwarn", "layout", "lcm", "ldivide", "ldl", "le", "legend", "legendre", "length", "length", "length", "length", "lib.pointer", "libfunctions", "libfunctionsview", "libisloaded", "libpointer", "libstruct", "license", "light", "lightangle", "lighting", "lin2mu", "line", "lines", "LineSpec", "linkaxes", "linkdata", "linkprop", "linsolve", "linspace", "listdlg", "listener", "listfonts", "listModifiedFiles", "listRequiredFiles", "load", "load", "load", "loadlibrary", "loadobj", "loadObjectImpl", "localfunctions", "log", "log", "log", "log10", "log1p", "log2", "logical", "Logical", "loglog", "logm", "logspace", "lookfor", "lower", "ls", "lscov", "lsqminnorm", "lsqnonneg", "lsqr", "lt", "lu", "magic", "makehgtform", "mapreduce", "mapreducer", "mat2cell", "mat2str", "matchpairs", "material", "matfile", "matlab", "matlab", "matlab", "matlab.addons.disableAddon", "matlab.addons.enableAddon", "matlab.addons.install", "matlab.addons.installedAddons", "matlab.addons.isAddonEnabled", "matlab.addons.toolbox.installedToolboxes", "matlab.addons.toolbox.installToolbox", "matlab.addons.toolbox.packageToolbox", "matlab.addons.toolbox.toolboxVersion", "matlab.addons.toolbox.uninstallToolbox", "matlab.addons.uninstall", "matlab.apputil.create", "matlab.apputil.getInstalledAppInfo", "matlab.apputil.install", "matlab.apputil.package", "matlab.apputil.run", "matlab.apputil.uninstall", "matlab.codetools.requiredFilesAndProducts", "matlab.engine.connect_matlab", "matlab.engine.engineName", "matlab.engine.find_matlab", "matlab.engine.FutureResult", "matlab.engine.isEngineShared", "matlab.engine.MatlabEngine", "matlab.engine.shareEngine", "matlab.engine.start_matlab", "matlab.exception.JavaException", "matlab.exception.PyException", "matlab.graphics.Graphics", "matlab.graphics.GraphicsPlaceholder", "matlab.io.Datastore", "matlab.io.datastore.DsFileReader", "matlab.io.datastore.DsFileSet", "matlab.io.datastore.HadoopFileBased", "matlab.io.datastore.HadoopLocationBased", "matlab.io.datastore.Partitionable", "matlab.io.datastore.Shuffleable", "matlab.io.hdf4.sd", "matlab.io.hdf4.sd.attrInfo", "matlab.io.hdf4.sd.close", "matlab.io.hdf4.sd.create", "matlab.io.hdf4.sd.dimInfo", "matlab.io.hdf4.sd.endAccess", "matlab.io.hdf4.sd.fileInfo", "matlab.io.hdf4.sd.findAttr", "matlab.io.hdf4.sd.getCal", "matlab.io.hdf4.sd.getChunkInfo", "matlab.io.hdf4.sd.getCompInfo", "matlab.io.hdf4.sd.getDataStrs", "matlab.io.hdf4.sd.getDimID", "matlab.io.hdf4.sd.getDimScale", "matlab.io.hdf4.sd.getDimStrs", "matlab.io.hdf4.sd.getFilename", "matlab.io.hdf4.sd.getFillValue", "matlab.io.hdf4.sd.getInfo", "matlab.io.hdf4.sd.getRange", "matlab.io.hdf4.sd.idToRef", "matlab.io.hdf4.sd.idType", "matlab.io.hdf4.sd.isCoordVar", "matlab.io.hdf4.sd.isRecord", "matlab.io.hdf4.sd.nameToIndex", "matlab.io.hdf4.sd.nameToIndices", "matlab.io.hdf4.sd.readAttr", "matlab.io.hdf4.sd.readChunk", "matlab.io.hdf4.sd.readData", "matlab.io.hdf4.sd.refToIndex", "matlab.io.hdf4.sd.select", "matlab.io.hdf4.sd.setAttr", "matlab.io.hdf4.sd.setCal", "matlab.io.hdf4.sd.setChunk", "matlab.io.hdf4.sd.setCompress", "matlab.io.hdf4.sd.setDataStrs", "matlab.io.hdf4.sd.setDimName", "matlab.io.hdf4.sd.setDimScale", "matlab.io.hdf4.sd.setDimStrs", "matlab.io.hdf4.sd.setExternalFile", "matlab.io.hdf4.sd.setFillMode", "matlab.io.hdf4.sd.setFillValue", "matlab.io.hdf4.sd.setNBitDataSet", "matlab.io.hdf4.sd.setRange", "matlab.io.hdf4.sd.start", "matlab.io.hdf4.sd.writeChunk", "matlab.io.hdf4.sd.writeData", "matlab.io.hdfeos.gd", "matlab.io.hdfeos.gd.attach", "matlab.io.hdfeos.gd.close", "matlab.io.hdfeos.gd.compInfo", "matlab.io.hdfeos.gd.create", "matlab.io.hdfeos.gd.defBoxRegion", "matlab.io.hdfeos.gd.defComp", "matlab.io.hdfeos.gd.defDim", "matlab.io.hdfeos.gd.defField", "matlab.io.hdfeos.gd.defOrigin", "matlab.io.hdfeos.gd.defPixReg", "matlab.io.hdfeos.gd.defProj", "matlab.io.hdfeos.gd.defTile", "matlab.io.hdfeos.gd.defVrtRegion", "matlab.io.hdfeos.gd.detach", "matlab.io.hdfeos.gd.dimInfo", "matlab.io.hdfeos.gd.extractRegion", "matlab.io.hdfeos.gd.fieldInfo", "matlab.io.hdfeos.gd.getFillValue", "matlab.io.hdfeos.gd.getPixels", "matlab.io.hdfeos.gd.getPixValues", "matlab.io.hdfeos.gd.gridInfo", "matlab.io.hdfeos.gd.ij2ll", "matlab.io.hdfeos.gd.inqAttrs", "matlab.io.hdfeos.gd.inqDims", "matlab.io.hdfeos.gd.inqFields", "matlab.io.hdfeos.gd.inqGrid", "matlab.io.hdfeos.gd.interpolate", "matlab.io.hdfeos.gd.ll2ij", "matlab.io.hdfeos.gd.nEntries", "matlab.io.hdfeos.gd.open", "matlab.io.hdfeos.gd.originInfo", "matlab.io.hdfeos.gd.pixRegInfo", "matlab.io.hdfeos.gd.projInfo", "matlab.io.hdfeos.gd.readAttr", "matlab.io.hdfeos.gd.readBlkSomOffset", "matlab.io.hdfeos.gd.readField", "matlab.io.hdfeos.gd.readTile", "matlab.io.hdfeos.gd.regionInfo", "matlab.io.hdfeos.gd.setFillValue", "matlab.io.hdfeos.gd.setTileComp", "matlab.io.hdfeos.gd.sphereCodeToName", "matlab.io.hdfeos.gd.sphereNameToCode", "matlab.io.hdfeos.gd.tileInfo", "matlab.io.hdfeos.gd.writeAttr", "matlab.io.hdfeos.gd.writeBlkSomOffset", "matlab.io.hdfeos.gd.writeField", "matlab.io.hdfeos.gd.writeTile", "matlab.io.hdfeos.sw", "matlab.io.hdfeos.sw.attach", "matlab.io.hdfeos.sw.close", "matlab.io.hdfeos.sw.compInfo", "matlab.io.hdfeos.sw.create", "matlab.io.hdfeos.sw.defBoxRegion", "matlab.io.hdfeos.sw.defComp", "matlab.io.hdfeos.sw.defDataField", "matlab.io.hdfeos.sw.defDim", "matlab.io.hdfeos.sw.defDimMap", "matlab.io.hdfeos.sw.defGeoField", "matlab.io.hdfeos.sw.defTimePeriod", "matlab.io.hdfeos.sw.defVrtRegion", "matlab.io.hdfeos.sw.detach", "matlab.io.hdfeos.sw.dimInfo", "matlab.io.hdfeos.sw.extractPeriod", "matlab.io.hdfeos.sw.extractRegion", "matlab.io.hdfeos.sw.fieldInfo", "matlab.io.hdfeos.sw.geoMapInfo", "matlab.io.hdfeos.sw.getFillValue", "matlab.io.hdfeos.sw.idxMapInfo", "matlab.io.hdfeos.sw.inqAttrs", "matlab.io.hdfeos.sw.inqDataFields", "matlab.io.hdfeos.sw.inqDims", "matlab.io.hdfeos.sw.inqGeoFields", "matlab.io.hdfeos.sw.inqIdxMaps", "matlab.io.hdfeos.sw.inqMaps", "matlab.io.hdfeos.sw.inqSwath", "matlab.io.hdfeos.sw.mapInfo", "matlab.io.hdfeos.sw.nEntries", "matlab.io.hdfeos.sw.open", "matlab.io.hdfeos.sw.periodInfo", "matlab.io.hdfeos.sw.readAttr", "matlab.io.hdfeos.sw.readField", "matlab.io.hdfeos.sw.regionInfo", "matlab.io.hdfeos.sw.setFillValue", "matlab.io.hdfeos.sw.writeAttr", "matlab.io.hdfeos.sw.writeField", "matlab.io.MatFile", "matlab.io.saveVariablesToScript", "matlab.lang.correction.AppendArgumentsCorrection", "matlab.lang.makeUniqueStrings", "matlab.lang.makeValidName", "matlab.lang.OnOffSwitchState", "matlab.mex.MexHost", "matlab.mixin.Copyable", "matlab.mixin.CustomDisplay", "matlab.mixin.CustomDisplay.convertDimensionsToString", "matlab.mixin.CustomDisplay.displayPropertyGroups", "matlab.mixin.CustomDisplay.getClassNameForHeader", "matlab.mixin.CustomDisplay.getDeletedHandleText", "matlab.mixin.CustomDisplay.getDetailedFooter", "matlab.mixin.CustomDisplay.getDetailedHeader", "matlab.mixin.CustomDisplay.getHandleText", "matlab.mixin.CustomDisplay.getSimpleHeader", "matlab.mixin.Heterogeneous", "matlab.mixin.Heterogeneous.getDefaultScalarElement", "matlab.mixin.SetGet", "matlab.mixin.SetGetExactNames", "matlab.mixin.util.PropertyGroup", "matlab.mock.actions.AssignOutputs", "matlab.mock.actions.Invoke", "matlab.mock.actions.ReturnStoredValue", "matlab.mock.actions.StoreValue", "matlab.mock.actions.ThrowException", "matlab.mock.AnyArguments", "matlab.mock.constraints.Occurred", "matlab.mock.constraints.WasAccessed", "matlab.mock.constraints.WasCalled", "matlab.mock.constraints.WasSet", "matlab.mock.history.MethodCall", "matlab.mock.history.PropertyAccess", "matlab.mock.history.PropertyModification", "matlab.mock.history.SuccessfulMethodCall", "matlab.mock.history.SuccessfulPropertyAccess", "matlab.mock.history.SuccessfulPropertyModification", "matlab.mock.history.UnsuccessfulMethodCall", "matlab.mock.history.UnsuccessfulPropertyAccess", "matlab.mock.history.UnsuccessfulPropertyModification", "matlab.mock.InteractionHistory", "matlab.mock.InteractionHistory.forMock", "matlab.mock.MethodCallBehavior", "matlab.mock.PropertyBehavior", "matlab.mock.PropertyGetBehavior", "matlab.mock.PropertySetBehavior", "matlab.mock.TestCase", "matlab.mock.TestCase.forInteractiveUse", "matlab.net.ArrayFormat", "matlab.net.base64decode", "matlab.net.base64encode", "matlab.net.http.AuthenticationScheme", "matlab.net.http.AuthInfo", "matlab.net.http.Cookie", "matlab.net.http.CookieInfo", "matlab.net.http.CookieInfo.collectFromLog", "matlab.net.http.Credentials", "matlab.net.http.Disposition", "matlab.net.http.field.AcceptField", "matlab.net.http.field.AuthenticateField", "matlab.net.http.field.AuthenticationInfoField", "matlab.net.http.field.AuthorizationField", "matlab.net.http.field.ContentDispositionField", "matlab.net.http.field.ContentLengthField", "matlab.net.http.field.ContentLocationField", "matlab.net.http.field.ContentTypeField", "matlab.net.http.field.CookieField", "matlab.net.http.field.DateField", "matlab.net.http.field.GenericField", "matlab.net.http.field.GenericParameterizedField", "matlab.net.http.field.HTTPDateField", "matlab.net.http.field.IntegerField", "matlab.net.http.field.LocationField", "matlab.net.http.field.MediaRangeField", "matlab.net.http.field.SetCookieField", "matlab.net.http.field.URIReferenceField", "matlab.net.http.HeaderField", "matlab.net.http.HeaderField.displaySubclasses", "matlab.net.http.HTTPException", "matlab.net.http.HTTPOptions", "matlab.net.http.io.BinaryConsumer", "matlab.net.http.io.ContentConsumer", "matlab.net.http.io.ContentProvider", "matlab.net.http.io.FileConsumer", "matlab.net.http.io.FileProvider", "matlab.net.http.io.FormProvider", "matlab.net.http.io.GenericConsumer", "matlab.net.http.io.GenericProvider", "matlab.net.http.io.ImageConsumer", "matlab.net.http.io.ImageProvider", "matlab.net.http.io.JSONConsumer", "matlab.net.http.io.JSONProvider", "matlab.net.http.io.MultipartConsumer", "matlab.net.http.io.MultipartFormProvider", "matlab.net.http.io.MultipartProvider", "matlab.net.http.io.StringConsumer", "matlab.net.http.io.StringProvider", "matlab.net.http.LogRecord", "matlab.net.http.MediaType", "matlab.net.http.Message", "matlab.net.http.MessageBody", "matlab.net.http.MessageType", "matlab.net.http.ProgressMonitor", "matlab.net.http.ProtocolVersion", "matlab.net.http.RequestLine", "matlab.net.http.RequestMessage", "matlab.net.http.RequestMethod", "matlab.net.http.ResponseMessage", "matlab.net.http.StartLine", "matlab.net.http.StatusClass", "matlab.net.http.StatusCode", "matlab.net.http.StatusCode.fromValue", "matlab.net.http.StatusLine", "matlab.net.QueryParameter", "matlab.net.URI", "matlab.perftest.FixedTimeExperiment", "matlab.perftest.FrequentistTimeExperiment", "matlab.perftest.TestCase", "matlab.perftest.TimeExperiment", "matlab.perftest.TimeExperiment.limitingSamplingError", "matlab.perftest.TimeExperiment.withFixedSampleSize", "matlab.perftest.TimeResult", "matlab.project.createProject", "matlab.project.loadProject", "matlab.project.Project", "matlab.project.rootProject", "matlab.System", "matlab.system.display.Action", "matlab.system.display.Header", "matlab.system.display.Icon", "matlab.system.display.Section", "matlab.system.display.SectionGroup", "matlab.system.mixin.CustomIcon", "matlab.system.mixin.FiniteSource", "matlab.system.mixin.Nondirect", "matlab.system.mixin.Propagates", "matlab.system.mixin.SampleTime", "matlab.system.StringSet", "matlab.tall.blockMovingWindow", "matlab.tall.movingWindow", "matlab.tall.reduce", "matlab.tall.transform", "matlab.test.behavior.Missing", "matlab.uitest.TestCase", "matlab.uitest.TestCase.forInteractiveUse", "matlab.uitest.unlock", "matlab.unittest.constraints.AbsoluteTolerance", "matlab.unittest.constraints.AnyCellOf", "matlab.unittest.constraints.AnyElementOf", "matlab.unittest.constraints.BooleanConstraint", "matlab.unittest.constraints.CellComparator", "matlab.unittest.constraints.Constraint", "matlab.unittest.constraints.ContainsSubstring", "matlab.unittest.constraints.EndsWithSubstring", "matlab.unittest.constraints.Eventually", "matlab.unittest.constraints.EveryCellOf", "matlab.unittest.constraints.EveryElementOf", "matlab.unittest.constraints.HasElementCount", "matlab.unittest.constraints.HasField", "matlab.unittest.constraints.HasInf", "matlab.unittest.constraints.HasLength", "matlab.unittest.constraints.HasNaN", "matlab.unittest.constraints.HasSize", "matlab.unittest.constraints.HasUniqueElements", "matlab.unittest.constraints.IsAnything", "matlab.unittest.constraints.IsEmpty", "matlab.unittest.constraints.IsEqualTo", "matlab.unittest.constraints.IsFalse", "matlab.unittest.constraints.IsFile", "matlab.unittest.constraints.IsFinite", "matlab.unittest.constraints.IsFolder", "matlab.unittest.constraints.IsGreaterThan", "matlab.unittest.constraints.IsGreaterThanOrEqualTo", "matlab.unittest.constraints.IsInstanceOf", "matlab.unittest.constraints.IsLessThan", "matlab.unittest.constraints.IsLessThanOrEqualTo", "matlab.unittest.constraints.IsOfClass", "matlab.unittest.constraints.IsReal", "matlab.unittest.constraints.IsSameHandleAs", "matlab.unittest.constraints.IsSameSetAs", "matlab.unittest.constraints.IsScalar", "matlab.unittest.constraints.IsSparse", "matlab.unittest.constraints.IsSubsetOf", "matlab.unittest.constraints.IsSubstringOf", "matlab.unittest.constraints.IssuesNoWarnings", "matlab.unittest.constraints.IssuesWarnings", "matlab.unittest.constraints.IsSupersetOf", "matlab.unittest.constraints.IsTrue", "matlab.unittest.constraints.LogicalComparator", "matlab.unittest.constraints.Matches", "matlab.unittest.constraints.NumericComparator", "matlab.unittest.constraints.ObjectComparator", "matlab.unittest.constraints.PublicPropertyComparator", "matlab.unittest.constraints.PublicPropertyComparator.supportingAllValues", "matlab.unittest.constraints.RelativeTolerance", "matlab.unittest.constraints.ReturnsTrue", "matlab.unittest.constraints.StartsWithSubstring", "matlab.unittest.constraints.StringComparator", "matlab.unittest.constraints.StructComparator", "matlab.unittest.constraints.TableComparator", "matlab.unittest.constraints.Throws", "matlab.unittest.constraints.Tolerance", "matlab.unittest.diagnostics.ConstraintDiagnostic", "matlab.unittest.diagnostics.ConstraintDiagnostic.getDisplayableString", "matlab.unittest.diagnostics.Diagnostic", "matlab.unittest.diagnostics.DiagnosticResult", "matlab.unittest.diagnostics.DisplayDiagnostic", "matlab.unittest.diagnostics.FigureDiagnostic", "matlab.unittest.diagnostics.FileArtifact", "matlab.unittest.diagnostics.FrameworkDiagnostic", "matlab.unittest.diagnostics.FunctionHandleDiagnostic", "matlab.unittest.diagnostics.LoggedDiagnosticEventData", "matlab.unittest.diagnostics.ScreenshotDiagnostic", "matlab.unittest.diagnostics.StringDiagnostic", "matlab.unittest.fixtures.CurrentFolderFixture", "matlab.unittest.fixtures.Fixture", "matlab.unittest.fixtures.PathFixture", "matlab.unittest.fixtures.ProjectFixture", "matlab.unittest.fixtures.SuppressedWarningsFixture", "matlab.unittest.fixtures.TemporaryFolderFixture", "matlab.unittest.fixtures.WorkingFolderFixture", "matlab.unittest.measurement.DefaultMeasurementResult", "matlab.unittest.measurement.MeasurementResult", "matlab.unittest.parameters.ClassSetupParameter", "matlab.unittest.parameters.EmptyParameter", "matlab.unittest.parameters.MethodSetupParameter", "matlab.unittest.parameters.Parameter", "matlab.unittest.parameters.Parameter.fromData", "matlab.unittest.parameters.TestParameter", "matlab.unittest.plugins.codecoverage.CoberturaFormat", "matlab.unittest.plugins.codecoverage.CoverageReport", "matlab.unittest.plugins.codecoverage.ProfileReport", "matlab.unittest.plugins.CodeCoveragePlugin", "matlab.unittest.plugins.CodeCoveragePlugin.forFile", "matlab.unittest.plugins.CodeCoveragePlugin.forFolder", "matlab.unittest.plugins.CodeCoveragePlugin.forPackage", "matlab.unittest.plugins.diagnosticrecord.DiagnosticRecord", "matlab.unittest.plugins.diagnosticrecord.ExceptionDiagnosticRecord", "matlab.unittest.plugins.diagnosticrecord.LoggedDiagnosticRecord", "matlab.unittest.plugins.diagnosticrecord.QualificationDiagnosticRecord", "matlab.unittest.plugins.DiagnosticsOutputPlugin", "matlab.unittest.plugins.DiagnosticsRecordingPlugin", "matlab.unittest.plugins.DiagnosticsValidationPlugin", "matlab.unittest.plugins.FailOnWarningsPlugin", "matlab.unittest.plugins.LoggingPlugin", "matlab.unittest.plugins.LoggingPlugin.withVerbosity", "matlab.unittest.plugins.OutputStream", "matlab.unittest.plugins.plugindata.FinalizedResultPluginData", "matlab.unittest.plugins.plugindata.ImplicitFixturePluginData", "matlab.unittest.plugins.plugindata.PluginData", "matlab.unittest.plugins.plugindata.QualificationContext", "matlab.unittest.plugins.plugindata.SharedTestFixturePluginData", "matlab.unittest.plugins.plugindata.TestContentCreationPluginData", "matlab.unittest.plugins.plugindata.TestSuiteRunPluginData", "matlab.unittest.plugins.QualifyingPlugin", "matlab.unittest.plugins.StopOnFailuresPlugin", "matlab.unittest.plugins.TAPPlugin", "matlab.unittest.plugins.TAPPlugin.producingOriginalFormat", "matlab.unittest.plugins.TAPPlugin.producingVersion13", "matlab.unittest.plugins.testreport.DOCXTestReportPlugin", "matlab.unittest.plugins.testreport.HTMLTestReportPlugin", "matlab.unittest.plugins.testreport.PDFTestReportPlugin", "matlab.unittest.plugins.TestReportPlugin", "matlab.unittest.plugins.TestReportPlugin.producingDOCX", "matlab.unittest.plugins.TestReportPlugin.producingHTML", "matlab.unittest.plugins.TestReportPlugin.producingPDF", "matlab.unittest.plugins.TestRunnerPlugin", "matlab.unittest.plugins.TestRunProgressPlugin", "matlab.unittest.plugins.ToFile", "matlab.unittest.plugins.ToStandardOutput", "matlab.unittest.plugins.ToUniqueFile", "matlab.unittest.plugins.XMLPlugin", "matlab.unittest.plugins.XMLPlugin.producingJUnitFormat", "matlab.unittest.qualifications.Assertable", "matlab.unittest.qualifications.AssertionFailedException", "matlab.unittest.qualifications.Assumable", "matlab.unittest.qualifications.AssumptionFailedException", "matlab.unittest.qualifications.ExceptionEventData", "matlab.unittest.qualifications.FatalAssertable", "matlab.unittest.qualifications.FatalAssertionFailedException", "matlab.unittest.qualifications.QualificationEventData", "matlab.unittest.qualifications.Verifiable", "matlab.unittest.Scope", "matlab.unittest.selectors.AndSelector", "matlab.unittest.selectors.HasBaseFolder", "matlab.unittest.selectors.HasName", "matlab.unittest.selectors.HasParameter", "matlab.unittest.selectors.HasProcedureName", "matlab.unittest.selectors.HasSharedTestFixture", "matlab.unittest.selectors.HasSuperclass", "matlab.unittest.selectors.HasTag", "matlab.unittest.selectors.NotSelector", "matlab.unittest.selectors.OrSelector", "matlab.unittest.Test", "matlab.unittest.TestCase", "matlab.unittest.TestCase.forInteractiveUse", "matlab.unittest.TestResult", "matlab.unittest.TestRunner", "matlab.unittest.TestRunner.withNoPlugins", "matlab.unittest.TestRunner.withTextOutput", "matlab.unittest.TestSuite", "matlab.unittest.TestSuite.fromClass", "matlab.unittest.TestSuite.fromFile", "matlab.unittest.TestSuite.fromFolder", "matlab.unittest.TestSuite.fromMethod", "matlab.unittest.TestSuite.fromName", "matlab.unittest.TestSuite.fromPackage", "matlab.unittest.TestSuite.fromProject", "matlab.unittest.Verbosity", "matlab.wsdl.createWSDLClient", "matlab.wsdl.setWSDLToolPath", "matlabrc", "matlabroot", "matlabshared.supportpkg.checkForUpdate", "matlabshared.supportpkg.getInstalled", "matlabshared.supportpkg.getSupportPackageRoot", "matlabshared.supportpkg.setSupportPackageRoot", "max", "max", "maxflow", "MaximizeCommandWindow", "maxk", "maxNumCompThreads", "maxpartitions", "maxpartitions", "mean", "mean", "median", "median", "memmapfile", "memoize", "MemoizedFunction", "memory", "menu", "mergecats", "mergevars", "mesh", "meshc", "meshgrid", "meshz", "meta.abstractDetails", "meta.ArrayDimension", "meta.class", "meta.class.fromName", "meta.DynamicProperty", "meta.EnumeratedValue", "meta.event", "meta.FixedDimension", "meta.MetaData", "meta.method", "meta.package", "meta.package.fromName", "meta.package.getAllPackages", "meta.property", "meta.UnrestrictedDimension", "meta.Validation", "metaclass", "methods", "methodsview", "mex", "mex.getCompilerConfigurations", "MException", "MException.last", "mexext", "mexhost", "mfilename", "mget", "milliseconds", "min", "min", "MinimizeCommandWindow", "mink", "minres", "minspantree", "minus", "minute", "minutes", "mislocked", "missing", "mkdir", "mkdir", "mkpp", "mldivide", "mlint", "mlintrpt", "mlock", "mmfileinfo", "mod", "mode", "month", "more", "morebins", "movAbsHDU", "move", "move", "movefile", "movegui", "movevars", "movie", "movmad", "movmax", "movmean", "movmedian", "movmin", "movNamHDU", "movprod", "movRelHDU", "movstd", "movsum", "movvar", "mpower", "mput", "mrdivide", "msgbox", "mtimes", "mu2lin", "multibandread", "multibandwrite", "munlock", "mustBeFinite", "mustBeGreaterThan", "mustBeGreaterThanOrEqual", "mustBeInteger", "mustBeLessThan", "mustBeLessThanOrEqual", "mustBeMember", "mustBeNegative", "mustBeNonempty", "mustBeNonNan", "mustBeNonnegative", "mustBeNonpositive", "mustBeNonsparse", "mustBeNonzero", "mustBeNumeric", "mustBeNumericOrLogical", "mustBePositive", "mustBeReal", "namelengthmax", "NaN", "nargchk", "nargin", "nargin", "narginchk", "nargout", "nargout", "nargoutchk", "NaT", "native2unicode", "nccreate", "ncdisp", "nchoosek", "ncinfo", "ncread", "ncreadatt", "ncwrite", "ncwriteatt", "ncwriteschema", "ndgrid", "ndims", "ne", "nearest", "nearestNeighbor", "nearestNeighbor", "nearestNeighbor", "nearestvertex", "neighbors", "neighbors", "neighbors", "NET", "NET.addAssembly", "NET.Assembly", "NET.convertArray", "NET.createArray", "NET.createGeneric", "NET.disableAutoRelease", "NET.enableAutoRelease", "NET.GenericClass", "NET.invokeGenericMethod", "NET.isNETSupported", "NET.NetException", "NET.setStaticProperty", "netcdf.abort", "netcdf.close", "netcdf.copyAtt", "netcdf.create", "netcdf.defDim", "netcdf.defGrp", "netcdf.defVar", "netcdf.defVarChunking", "netcdf.defVarDeflate", "netcdf.defVarFill", "netcdf.defVarFletcher32", "netcdf.delAtt", "netcdf.endDef", "netcdf.getAtt", "netcdf.getChunkCache", "netcdf.getConstant", "netcdf.getConstantNames", "netcdf.getVar", "netcdf.inq", "netcdf.inqAtt", "netcdf.inqAttID", "netcdf.inqAttName", "netcdf.inqDim", "netcdf.inqDimID", "netcdf.inqDimIDs", "netcdf.inqFormat", "netcdf.inqGrpName", "netcdf.inqGrpNameFull", "netcdf.inqGrpParent", "netcdf.inqGrps", "netcdf.inqLibVers", "netcdf.inqNcid", "netcdf.inqUnlimDims", "netcdf.inqVar", "netcdf.inqVarChunking", "netcdf.inqVarDeflate", "netcdf.inqVarFill", "netcdf.inqVarFletcher32", "netcdf.inqVarID", "netcdf.inqVarIDs", "netcdf.open", "netcdf.putAtt", "netcdf.putVar", "netcdf.reDef", "netcdf.renameAtt", "netcdf.renameDim", "netcdf.renameVar", "netcdf.setChunkCache", "netcdf.setDefaultFormat", "netcdf.setFill", "netcdf.sync", "newline", "newplot", "nextfile", "nextpow2", "nnz", "nonzeros", "norm", "normalize", "normest", "not", "notebook", "notify", "now", "nsidedpoly", "nthroot", "null", "num2cell", "num2hex", "num2ruler", "num2str", "numArgumentsFromSubscript", "numboundaries", "numedges", "numel", "numnodes", "numpartitions", "numpartitions", "numRegions", "numsides", "nzmax", "ode113", "ode15i", "ode15s", "ode23", "ode23s", "ode23t", "ode23tb", "ode45", "odeget", "odeset", "odextend", "onCleanup", "ones", "onFailure", "onFailure", "open", "open", "openDiskFile", "openfig", "openFile", "opengl", "openProject", "openvar", "optimget", "optimset", "or", "ordeig", "orderfields", "ordqz", "ordschur", "orient", "orth", "outdegree", "outedges", "outerjoin", "outputImpl", "overlaps", "pack", "pad", "padecoef", "pagesetupdlg", "pan", "panInteraction", "parallelplot", "pareto", "parfor", "parquetDatastore", "parquetinfo", "parquetread", "parquetwrite", "parse", "parse", "parseSoapResponse", "partition", "partition", "partition", "parula", "pascal", "patch", "path", "path2rc", "pathsep", "pathtool", "pause", "pause", "pbaspect", "pcg", "pchip", "pcode", "pcolor", "pdepe", "pdeval", "peaks", "perimeter", "perimeter", "perl", "perms", "permute", "persistent", "pi", "pie", "pie3", "pink", "pinv", "planerot", "play", "play", "playblocking", "plot", "plot", "plot", "plot", "plot", "plot3", "plotbrowser", "plotedit", "plotmatrix", "plottools", "plotyy", "plus", "plus", "pointLocation", "pointLocation", "pol2cart", "polar", "polaraxes", "polarhistogram", "polarplot", "polarscatter", "poly", "polyarea", "polybuffer", "polyder", "polyeig", "polyfit", "polyint", "polyshape", "polyval", "polyvalm", "posixtime", "pow2", "power", "ppval", "predecessors", "prefdir", "preferences", "preferredBufferSize", "preferredBufferSize", "press", "preview", "preview", "primes", "print", "print", "printdlg", "printopt", "printpreview", "prism", "processInputSpecificationChangeImpl", "processTunedPropertiesImpl", "prod", "profile", "profsave", "progress", "propagatedInputComplexity", "propagatedInputDataType", "propagatedInputFixedSize", "propagatedInputSize", "propedit", "propedit", "properties", "propertyeditor", "psi", "publish", "PutCharArray", "putData", "putData", "putData", "putData", "putData", "putData", "putData", "putData", "PutFullMatrix", "PutWorkspaceData", "pwd", "pyargs", "pyversion", "qmr", "qr", "qrdelete", "qrinsert", "qrupdate", "quad", "quad2d", "quadgk", "quadl", "quadv", "quarter", "questdlg", "Quit", "quit", "quiver", "quiver3", "qz", "rad2deg", "rand", "rand", "randi", "randi", "randn", "randn", "randperm", "randperm", "RandStream", "RandStream", "RandStream.create", "RandStream.getGlobalStream", "RandStream.list", "RandStream.setGlobalStream", "rank", "rat", "rats", "rbbox", "rcond", "rdivide", "read", "read", "read", "read", "read", "readall", "readasync", "readATblHdr", "readBTblHdr", "readCard", "readcell", "readCol", "readFrame", "readimage", "readImg", "readKey", "readKeyCmplx", "readKeyDbl", "readKeyLongLong", "readKeyLongStr", "readKeyUnit", "readmatrix", "readRecord", "readtable", "readtimetable", "readvars", "real", "reallog", "realmax", "realmin", "realpow", "realsqrt", "record", "record", "recordblocking", "rectangle", "rectint", "recycle", "reducepatch", "reducevolume", "refresh", "refreshdata", "refreshSourceControl", "regexp", "regexpi", "regexprep", "regexptranslate", "regions", "regionZoomInteraction", "registerevent", "regmatlabserver", "rehash", "relationaloperators", "release", "release", "releaseImpl", "reload", "rem", "Remove", "remove", "RemoveAll", "removeCategory", "removecats", "removeFields", "removeFields", "removeFile", "removeLabel", "removeParameter", "removeParameter", "removePath", "removeReference", "removeShortcut", "removeShutdownFile", "removeStartupFile", "removeToolbarExplorationButtons", "removets", "removevars", "rename", "renamecats", "rendererinfo", "reordercats", "reordernodes", "repeat", "repeat", "repeat", "repeat", "repeat", "repelem", "replace", "replaceBetween", "replaceFields", "replaceFields", "repmat", "reportFinalizedResult", "resample", "resample", "rescale", "reset", "reset", "reset", "reset", "reset", "resetImpl", "reshape", "reshape", "residue", "resolve", "restartable", "restartable", "restartable", "restoredefaultpath", "result", "resume", "rethrow", "rethrow", "retime", "return", "returnStoredValueWhen", "reusable", "reusable", "reusable", "reverse", "rgb2gray", "rgb2hsv", "rgb2ind", "rgbplot", "ribbon", "rlim", "rmappdata", "rmboundary", "rmdir", "rmdir", "rmedge", "rmfield", "rmholes", "rmmissing", "rmnode", "rmoutliers", "rmpath", "rmpref", "rmprop", "rmslivers", "rng", "roots", "rose", "rosser", "rot90", "rotate", "rotate", "rotate3d", "rotateInteraction", "round", "rowfun", "rows2vars", "rref", "rsf2csf", "rtickangle", "rtickformat", "rticklabels", "rticks", "ruler2num", "rulerPanInteraction", "run", "run", "run", "run", "run", "runInParallel", "runperf", "runTest", "runTestClass", "runTestMethod", "runtests", "runTestSuite", "samplefun", "sampleSummary", "satisfiedBy", "satisfiedBy", "save", "save", "save", "saveas", "savefig", "saveobj", "saveObjectImpl", "savepath", "scale", "scatter", "scatter3", "scatteredInterpolant", "scatterhistogram", "schur", "scroll", "sec", "secd", "sech", "second", "seconds", "seek", "selectFailed", "selectIf", "selectIncomplete", "selectLogged", "selectmoveresize", "selectPassed", "semilogx", "semilogy", "send", "sendmail", "serial", "serialbreak", "seriallist", "set", "set", "set", "set", "set", "set", "set", "set", "set", "set", "set", "setabstime", "setabstime", "setappdata", "setBscale", "setcats", "setCompressionType", "setdatatype", "setdiff", "setdisp", "setenv", "setfield", "setHCompScale", "setHCompSmooth", "setinterpmethod", "setParameter", "setParameter", "setParameter", "setpixelposition", "setpref", "setProperties", "setstr", "setTileDim", "settimeseriesnames", "Setting", "settings", "SettingsGroup", "setToValue", "setTscale", "setuniformtime", "setup", "setupImpl", "setupSharedTestFixture", "setupTestClass", "setupTestMethod", "setvaropts", "setvartype", "setxor", "sgtitle", "shading", "sheetnames", "shg", "shiftdim", "shortestpath", "shortestpathtree", "show", "show", "show", "show", "showFiSettingsImpl", "showplottool", "showSimulateUsingImpl", "shrinkfaces", "shuffle", "shuffle", "sign", "simplify", "simplify", "sin", "sind", "single", "sinh", "sinpi", "size", "size", "size", "size", "size", "size", "size", "slice", "smooth3", "smoothdata", "snapnow", "sort", "sortboundaries", "sortByFixtures", "sortregions", "sortrows", "sortx", "sorty", "sound", "soundsc", "spalloc", "sparse", "spaugment", "spconvert", "spdiags", "specular", "speye", "spfun", "sph2cart", "sphere", "spinmap", "spline", "split", "split", "splitapply", "splitEachLabel", "splitlines", "splitvars", "spones", "spparms", "sprand", "sprandn", "sprandsym", "sprank", "spreadsheetDatastore", "spreadsheetImportOptions", "spring", "sprintf", "spy", "sqrt", "sqrtm", "squeeze", "ss2tf", "sscanf", "stack", "stackedplot", "stairs", "standardizeMissing", "start", "start", "start", "start", "start", "start", "start", "start", "start", "start", "start", "start", "startat", "startMeasuring", "startsWith", "startup", "stats", "std", "std", "stem", "stem3", "step", "stepImpl", "stlread", "stlwrite", "stop", "stop", "stopasync", "stopMeasuring", "storeValueWhen", "str2double", "str2func", "str2mat", "str2num", "strcat", "strcmp", "strcmpi", "stream2", "stream3", "streamline", "streamparticles", "streamribbon", "streamslice", "streamtube", "strfind", "string", "string", "string", "string", "string", "string", "strings", "strip", "strjoin", "strjust", "strlength", "strmatch", "strncmp", "strncmpi", "strread", "strrep", "strsplit", "strtok", "strtrim", "struct", "struct2cell", "struct2table", "structfun", "strvcat", "sub2ind", "subgraph", "subplot", "subsasgn", "subset", "subsindex", "subspace", "subsref", "substruct", "subtract", "subvolume", "successors", "sum", "sum", "summary", "summary", "summer", "superclasses", "support", "supportPackageInstaller", "supports", "supportsMultipleInstanceImpl", "surf", "surf2patch", "surface", "surfaceArea", "surfc", "surfl", "surfnorm", "svd", "svds", "swapbytes", "sylvester", "symamd", "symbfact", "symmlq", "symrcm", "symvar", "synchronize", "synchronize", "syntax", "system", "table", "table2array", "table2cell", "table2struct", "table2timetable", "tabularTextDatastore", "tail", "tall", "TallDatastore", "tallrng", "tan", "tand", "tanh", "tar", "tcpclient", "teardown", "teardownSharedTestFixture", "teardownTestClass", "teardownTestMethod", "tempdir", "tempname", "testsuite", "tetramesh", "texlabel", "text", "textread", "textscan", "textwrap", "tfqmr", "then", "then", "then", "then", "then", "thetalim", "thetatickformat", "thetaticklabels", "thetaticks", "thingSpeakRead", "thingSpeakWrite", "throw", "throwAsCaller", "throwExceptionWhen", "tic", "Tiff", "Tiff.computeStrip", "Tiff.computeTile", "Tiff.currentDirectory", "Tiff.getTag", "Tiff.getTagNames", "Tiff.getVersion", "Tiff.isTiled", "Tiff.lastDirectory", "Tiff.nextDirectory", "Tiff.numberOfStrips", "Tiff.numberOfTiles", "Tiff.readEncodedStrip", "Tiff.readEncodedTile", "Tiff.readRGBAImage", "Tiff.readRGBAStrip", "Tiff.readRGBATile", "Tiff.rewriteDirectory", "Tiff.setDirectory", "Tiff.setSubDirectory", "Tiff.setTag", "Tiff.writeDirectory", "Tiff.writeEncodedStrip", "Tiff.writeEncodedTile", "time", "timeit", "timeofday", "timer", "timerange", "timerfind", "timerfindall", "times", "timeseries", "timetable", "timetable2table", "timezones", "title", "toc", "todatenum", "toeplitz", "toolboxdir", "topkrows", "toposort", "trace", "transclosure", "transform", "TransformedDatastore", "translate", "transpose", "transreduction", "trapz", "treelayout", "treeplot", "triangulation", "triangulation", "tril", "trimesh", "triplequad", "triplot", "TriRep", "TriRep", "TriScatteredInterp", "TriScatteredInterp", "trisurf", "triu", "true", "tscollection", "tsdata.event", "tsearchn", "turningdist", "type", "type", "typecast", "tzoffset", "uialert", "uiaxes", "uibutton", "uibuttongroup", "uicheckbox", "uiconfirm", "uicontextmenu", "uicontrol", "uidatepicker", "uidropdown", "uieditfield", "uifigure", "uigauge", "uigetdir", "uigetfile", "uigetpref", "uigridlayout", "uiimage", "uiimport", "uiknob", "uilabel", "uilamp", "uilistbox", "uimenu", "uint16", "uint32", "uint64", "uint8", "uiopen", "uipanel", "uiprogressdlg", "uipushtool", "uiputfile", "uiradiobutton", "uiresume", "uisave", "uisetcolor", "uisetfont", "uisetpref", "uislider", "uispinner", "uistack", "uiswitch", "uitab", "uitabgroup", "uitable", "uitextarea", "uitogglebutton", "uitoggletool", "uitoolbar", "uitree", "uitreenode", "uiwait", "uminus", "underlyingValue", "undocheckout", "unicode2native", "union", "union", "unique", "uniquetol", "unix", "unloadlibrary", "unmesh", "unmkpp", "unregisterallevents", "unregisterevent", "unstack", "untar", "unwrap", "unzip", "updateDependencies", "updateImpl", "upgradePreviouslyInstalledSupportPackages", "uplus", "upper", "urlread", "urlwrite", "usejava", "userpath", "validate", "validate", "validate", "validate", "validateattributes", "validateFunctionSignaturesJSON", "validateInputsImpl", "validatePropertiesImpl", "validatestring", "ValueIterator", "values", "vander", "var", "var", "varargin", "varargout", "varfun", "vartype", "vecnorm", "vectorize", "ver", "verctrl", "verifyAccessed", "verifyCalled", "verifyClass", "verifyEmpty", "verifyEqual", "verifyError", "verifyFail", "verifyFalse", "verifyGreaterThan", "verifyGreaterThanOrEqual", "verifyInstanceOf", "verifyLength", "verifyLessThan", "verifyLessThanOrEqual", "verifyMatches", "verifyNotAccessed", "verifyNotCalled", "verifyNotEmpty", "verifyNotEqual", "verifyNotSameHandle", "verifyNotSet", "verifyNumElements", "verifyReturnsTrue", "verifySameHandle", "verifySet", "verifySize", "verifySubstring", "verifyThat", "verifyTrue", "verifyUsing", "verifyWarning", "verifyWarningFree", "verLessThan", "version", "vertcat", "vertcat", "vertcat", "vertexAttachments", "vertexAttachments", "vertexNormal", "VideoReader", "VideoWriter", "view", "viewmtx", "visdiff", "volume", "volumebounds", "voronoi", "voronoiDiagram", "voronoiDiagram", "voronoin", "wait", "waitbar", "waitfor", "waitforbuttonpress", "warndlg", "warning", "waterfall", "web", "weboptions", "webread", "websave", "webwrite", "week", "weekday", "what", "whatsnew", "when", "when", "when", "which", "while", "whitebg", "who", "who", "whos", "whos", "width", "wilkinson", "winopen", "winqueryreg", "winter", "withAnyInputs", "withExactInputs", "withNargout", "withtol", "wordcloud", "write", "write", "write", "writecell", "writeChecksum", "writeCol", "writeComment", "writeDate", "writeHistory", "writeImg", "writeKey", "writeKeyUnit", "writematrix", "writetable", "writetimetable", "writeVideo", "xcorr", "xcov", "xlabel", "xlim", "xline", "xlsfinfo", "xlsread", "xlswrite", "xmlread", "xmlwrite", "xor", "xor", "xslt", "xtickangle", "xtickformat", "xticklabels", "xticks", "year", "years", "ylabel", "ylim", "yline", "ymd", "ytickangle", "ytickformat", "yticklabels", "yticks", "yyaxis", "yyyymmdd", "zeros", "zip", "zlabel", "zlim", "zoom", "zoomInteraction", "ztickangle", "ztickformat", "zticklabels", "zticks"] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/matlab/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/matlab/keywords.rb new file mode 100644 index 000000000000..4c9aa5d72692 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/matlab/keywords.rb @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# DO NOT EDIT + +# This file is automatically generated by `rake builtins:matlab`. +# See tasks/builtins/matlab.rake for more info. + +module Rouge + module Lexers + def Matlab.builtins + @builtins ||= Set.new ["abs", "accumarray", "acos", "acosd", "acosh", "acot", "acotd", "acoth", "acsc", "acscd", "acsch", "actxcontrol", "actxcontrollist", "actxcontrolselect", "actxGetRunningServer", "actxserver", "add", "addboundary", "addcats", "addCause", "addClass", "addCondition", "addConditionsFrom", "addConstructor", "addCorrection", "addedge", "addevent", "addFields", "addFields", "addFile", "addFolderIncludingChildFiles", "addFunction", "addLabel", "addlistener", "addMethod", "addmulti", "addnode", "addOptional", "addParameter", "addParamValue", "addPath", "addpath", "addPlugin", "addpoints", "addpref", "addprop", "addprop", "addproperty", "addProperty", "addReference", "addRequired", "addsample", "addsampletocollection", "addShortcut", "addShutdownFile", "addStartupFile", "addTeardown", "addTeardown", "addtodate", "addToolbarExplorationButtons", "addts", "addvars", "adjacency", "airy", "align", "alim", "all", "allchild", "allowModelReferenceDiscreteSampleTimeInheritanceImpl", "alpha", "alphamap", "alphaShape", "alphaSpectrum", "alphaTriangulation", "amd", "analyzeCodeCompatibility", "ancestor", "and", "angle", "animatedline", "annotation", "ans", "any", "appdesigner", "append", "append", "applyFixture", "applyFixture", "area", "area", "area", "array2table", "array2timetable", "arrayfun", "ascii", "asec", "asecd", "asech", "asin", "asind", "asinh", "assert", "assertAccessed", "assertCalled", "assertClass", "assertEmpty", "assertEqual", "assertError", "assertFail", "assertFalse", "assertGreaterThan", "assertGreaterThanOrEqual", "assertInstanceOf", "assertLength", "assertLessThan", "assertLessThanOrEqual", "assertMatches", "assertNotAccessed", "assertNotCalled", "assertNotEmpty", "assertNotEqual", "assertNotSameHandle", "assertNotSet", "assertNumElements", "assertReturnsTrue", "assertSameHandle", "assertSet", "assertSize", "assertSubstring", "assertThat", "assertTrue", "assertUsing", "assertWarning", "assertWarningFree", "assignin", "assignOutputsWhen", "assumeAccessed", "assumeCalled", "assumeClass", "assumeEmpty", "assumeEqual", "assumeError", "assumeFail", "assumeFalse", "assumeGreaterThan", "assumeGreaterThanOrEqual", "assumeInstanceOf", "assumeLength", "assumeLessThan", "assumeLessThanOrEqual", "assumeMatches", "assumeNotAccessed", "assumeNotCalled", "assumeNotEmpty", "assumeNotEqual", "assumeNotSameHandle", "assumeNotSet", "assumeNumElements", "assumeReturnsTrue", "assumeSameHandle", "assumeSet", "assumeSize", "assumeSubstring", "assumeThat", "assumeTrue", "assumeUsing", "assumeWarning", "assumeWarningFree", "atan", "atan2", "atan2d", "atand", "atanh", "audiodevinfo", "audioinfo", "audioplayer", "audioread", "audiorecorder", "audiowrite", "autumn", "aviinfo", "axes", "axis", "axtoolbar", "axtoolbarbtn", "balance", "bandwidth", "bar", "bar3", "bar3h", "barh", "barycentricToCartesian", "baryToCart", "base2dec", "batchStartupOptionUsed", "bctree", "beep", "BeginInvoke", "bench", "besselh", "besseli", "besselj", "besselk", "bessely", "beta", "betainc", "betaincinv", "betaln", "between", "bfsearch", "bicg", "bicgstab", "bicgstabl", "biconncomp", "bin2dec", "binary", "binscatter", "bitand", "bitcmp", "bitget", "bitnot", "bitor", "bitset", "bitshift", "bitxor", "blanks", "blkdiag", "bone", "boundary", "boundary", "boundaryFacets", "boundaryshape", "boundingbox", "bounds", "box", "break", "brighten", "brush", "bsxfun", "build", "builddocsearchdb", "builtin", "bvp4c", "bvp5c", "bvpget", "bvpinit", "bvpset", "bvpxtend", "caldays", "caldiff", "calendar", "calendarDuration", "calllib", "callSoapService", "calmonths", "calquarters", "calweeks", "calyears", "camdolly", "cameratoolbar", "camlight", "camlookat", "camorbit", "campan", "campos", "camproj", "camroll", "camtarget", "camup", "camva", "camzoom", "cancel", "cancelled", "cart2pol", "cart2sph", "cartesianToBarycentric", "cartToBary", "cast", "cat", "cat", "categorical", "categories", "caxis", "cd", "cd", "cdf2rdf", "cdfepoch", "cdfinfo", "cdflib", "cdflib.close", "cdflib.closeVar", "cdflib.computeEpoch", "cdflib.computeEpoch16", "cdflib.create", "cdflib.createAttr", "cdflib.createVar", "cdflib.delete", "cdflib.deleteAttr", "cdflib.deleteAttrEntry", "cdflib.deleteAttrgEntry", "cdflib.deleteVar", "cdflib.deleteVarRecords", "cdflib.epoch16Breakdown", "cdflib.epochBreakdown", "cdflib.getAttrEntry", "cdflib.getAttrgEntry", "cdflib.getAttrMaxEntry", "cdflib.getAttrMaxgEntry", "cdflib.getAttrName", "cdflib.getAttrNum", "cdflib.getAttrScope", "cdflib.getCacheSize", "cdflib.getChecksum", "cdflib.getCompression", "cdflib.getCompressionCacheSize", "cdflib.getConstantNames", "cdflib.getConstantValue", "cdflib.getCopyright", "cdflib.getFileBackward", "cdflib.getFormat", "cdflib.getLibraryCopyright", "cdflib.getLibraryVersion", "cdflib.getMajority", "cdflib.getName", "cdflib.getNumAttrEntries", "cdflib.getNumAttrgEntries", "cdflib.getNumAttributes", "cdflib.getNumgAttributes", "cdflib.getReadOnlyMode", "cdflib.getStageCacheSize", "cdflib.getValidate", "cdflib.getVarAllocRecords", "cdflib.getVarBlockingFactor", "cdflib.getVarCacheSize", "cdflib.getVarCompression", "cdflib.getVarData", "cdflib.getVarMaxAllocRecNum", "cdflib.getVarMaxWrittenRecNum", "cdflib.getVarName", "cdflib.getVarNum", "cdflib.getVarNumRecsWritten", "cdflib.getVarPadValue", "cdflib.getVarRecordData", "cdflib.getVarReservePercent", "cdflib.getVarsMaxWrittenRecNum", "cdflib.getVarSparseRecords", "cdflib.getVersion", "cdflib.hyperGetVarData", "cdflib.hyperPutVarData", "cdflib.inquire", "cdflib.inquireAttr", "cdflib.inquireAttrEntry", "cdflib.inquireAttrgEntry", "cdflib.inquireVar", "cdflib.open", "cdflib.putAttrEntry", "cdflib.putAttrgEntry", "cdflib.putVarData", "cdflib.putVarRecordData", "cdflib.renameAttr", "cdflib.renameVar", "cdflib.setCacheSize", "cdflib.setChecksum", "cdflib.setCompression", "cdflib.setCompressionCacheSize", "cdflib.setFileBackward", "cdflib.setFormat", "cdflib.setMajority", "cdflib.setReadOnlyMode", "cdflib.setStageCacheSize", "cdflib.setValidate", "cdflib.setVarAllocBlockRecords", "cdflib.setVarBlockingFactor", "cdflib.setVarCacheSize", "cdflib.setVarCompression", "cdflib.setVarInitialRecs", "cdflib.setVarPadValue", "cdflib.SetVarReservePercent", "cdflib.setVarsCacheSize", "cdflib.setVarSparseRecords", "cdfread", "cdfwrite", "ceil", "cell", "cell2mat", "cell2struct", "cell2table", "celldisp", "cellfun", "cellplot", "cellstr", "centrality", "centroid", "cgs", "changeFields", "changeFields", "char", "char", "checkcode", "checkin", "checkout", "chol", "cholupdate", "choose", "circshift", "circumcenter", "circumcenters", "cla", "clabel", "class", "classdef", "classUnderlying", "clc", "clear", "clear", "clearAllMemoizedCaches", "clearCache", "clearMockHistory", "clearPersonalValue", "clearpoints", "clearTemporaryValue", "clearvars", "clf", "clibgen.buildInterface", "clibgen.ClassDefinition", "clibgen.ConstructorDefinition", "clibgen.EnumDefinition", "clibgen.FunctionDefinition", "clibgen.generateLibraryDefinition", "clibgen.LibraryDefinition", "clibgen.MethodDefinition", "clibgen.PropertyDefinition", "clibRelease", "clipboard", "clock", "clone", "close", "close", "close", "close", "close", "closeFile", "closereq", "cmopts", "cmpermute", "cmunique", "CodeCompatibilityAnalysis", "codeCompatibilityReport", "colamd", "collapse", "colon", "colorbar", "colorcube", "colordef", "colormap", "ColorSpec", "colperm", "COM", "com.mathworks.engine.MatlabEngine", "com.mathworks.matlab.types.CellStr", "com.mathworks.matlab.types.Complex", "com.mathworks.matlab.types.HandleObject", "com.mathworks.matlab.types.Struct", "combine", "Combine", "CombinedDatastore", "comet", "comet3", "compan", "compass", "complete", "complete", "complete", "complete", "complete", "complete", "complete", "complex", "compose", "computer", "cond", "condeig", "condensation", "condest", "coneplot", "conj", "conncomp", "containers.Map", "contains", "continue", "contour", "contour3", "contourc", "contourf", "contourslice", "contrast", "conv", "conv2", "convert", "convert", "convert", "convertCharsToStrings", "convertContainedStringsToChars", "convertLike", "convertStringsToChars", "convertvars", "convexHull", "convexHull", "convhull", "convhull", "convhulln", "convn", "cool", "copper", "copy", "copyElement", "copyfile", "copyHDU", "copyobj", "copyTo", "corrcoef", "cos", "cosd", "cosh", "cospi", "cot", "cotd", "coth", "count", "countcats", "countEachLabel", "cov", "cplxpair", "cputime", "createCategory", "createClassFromWsdl", "createFile", "createImg", "createLabel", "createMock", "createSampleTime", "createSharedTestFixture", "createSoapMessage", "createTbl", "createTestClassInstance", "createTestMethodInstance", "criticalAlpha", "cross", "csc", "cscd", "csch", "csvread", "csvwrite", "ctranspose", "cummax", "cummin", "cumprod", "cumsum", "cumtrapz", "curl", "currentProject", "customverctrl", "cylinder", "daqread", "daspect", "datacursormode", "datastore", "dataTipInteraction", "dataTipTextRow", "date", "datenum", "dateshift", "datestr", "datetick", "datetime", "datevec", "day", "days", "dbclear", "dbcont", "dbdown", "dblquad", "dbmex", "dbquit", "dbstack", "dbstatus", "dbstep", "dbstop", "dbtype", "dbup", "dde23", "ddeget", "ddensd", "ddesd", "ddeset", "deal", "deblank", "dec2base", "dec2bin", "dec2hex", "decic", "decomposition", "deconv", "defineArgument", "defineArgument", "defineArgument", "defineOutput", "defineOutput", "deg2rad", "degree", "del2", "delaunay", "delaunayn", "DelaunayTri", "DelaunayTri", "delaunayTriangulation", "delegateTo", "delegateTo", "delete", "delete", "delete", "delete", "delete", "deleteCol", "deleteFile", "deleteHDU", "deleteKey", "deleteproperty", "deleteRecord", "deleteRows", "delevent", "delimitedTextImportOptions", "delsample", "delsamplefromcollection", "demo", "det", "details", "detectImportOptions", "detrend", "detrend", "deval", "dfsearch", "diag", "diagnose", "dialog", "diary", "diff", "diffuse", "digraph", "dir", "dir", "disableDefaultInteractivity", "discretize", "disp", "disp", "disp", "display", "displayEmptyObject", "displayNonScalarObject", "displayScalarHandleToDeletedObject", "displayScalarObject", "dissect", "distances", "dither", "divergence", "dlmread", "dlmwrite", "dmperm", "doc", "docsearch", "done", "done", "dos", "dot", "double", "drag", "dragrect", "drawnow", "dsearchn", "duration", "dynamicprops", "echo", "echodemo", "edgeAttachments", "edgeAttachments", "edgecount", "edges", "edges", "edit", "eig", "eigs", "ellipj", "ellipke", "ellipsoid", "empty", "enableDefaultInteractivity", "enableNETfromNetworkDrive", "enableservice", "end", "EndInvoke", "endsWith", "enumeration", "eomday", "eps", "eq", "eq", "equilibrate", "erase", "eraseBetween", "erf", "erfc", "erfcinv", "erfcx", "erfinv", "error", "errorbar", "errordlg", "etime", "etree", "etreeplot", "eval", "evalc", "evalin", "event.DynamicPropertyEvent", "event.EventData", "event.hasListener", "event.listener", "event.PropertyEvent", "event.proplistener", "eventlisteners", "events", "events", "exceltime", "Execute", "exist", "exit", "exp", "expand", "expectedContentLength", "expectedContentLength", "expint", "expm", "expm1", "export", "export2wsdlg", "exportsetupdlg", "extractAfter", "extractBefore", "extractBetween", "eye", "ezcontour", "ezcontourf", "ezmesh", "ezmeshc", "ezplot", "ezplot3", "ezpolar", "ezsurf", "ezsurfc", "faceNormal", "faceNormals", "factor", "factorial", "false", "fatalAssertAccessed", "fatalAssertCalled", "fatalAssertClass", "fatalAssertEmpty", "fatalAssertEqual", "fatalAssertError", "fatalAssertFail", "fatalAssertFalse", "fatalAssertGreaterThan", "fatalAssertGreaterThanOrEqual", "fatalAssertInstanceOf", "fatalAssertLength", "fatalAssertLessThan", "fatalAssertLessThanOrEqual", "fatalAssertMatches", "fatalAssertNotAccessed", "fatalAssertNotCalled", "fatalAssertNotEmpty", "fatalAssertNotEqual", "fatalAssertNotSameHandle", "fatalAssertNotSet", "fatalAssertNumElements", "fatalAssertReturnsTrue", "fatalAssertSameHandle", "fatalAssertSet", "fatalAssertSize", "fatalAssertSubstring", "fatalAssertThat", "fatalAssertTrue", "fatalAssertUsing", "fatalAssertWarning", "fatalAssertWarningFree", "fclose", "fclose", "fcontour", "feather", "featureEdges", "featureEdges", "feof", "ferror", "feval", "Feval", "feval", "fewerbins", "fft", "fft2", "fftn", "fftshift", "fftw", "fgetl", "fgetl", "fgets", "fgets", "fieldnames", "figure", "figurepalette", "fileattrib", "fileDatastore", "filemarker", "fileMode", "fileName", "fileparts", "fileread", "filesep", "fill", "fill3", "fillmissing", "filloutliers", "filter", "filter", "filter2", "fimplicit", "fimplicit3", "find", "findall", "findCategory", "findedge", "findEvent", "findfigs", "findFile", "findgroups", "findLabel", "findnode", "findobj", "findobj", "findprop", "findstr", "finish", "fitsdisp", "fitsinfo", "fitsread", "fitswrite", "fix", "fixedWidthImportOptions", "flag", "flintmax", "flip", "flipdim", "flipedge", "fliplr", "flipud", "floor", "flow", "fmesh", "fminbnd", "fminsearch", "fopen", "fopen", "for", "format", "fplot", "fplot3", "fprintf", "fprintf", "frame2im", "fread", "fread", "freeBoundary", "freeBoundary", "freqspace", "frewind", "fscanf", "fscanf", "fseek", "fsurf", "ftell", "ftp", "full", "fullfile", "func2str", "function", "functions", "FunctionTestCase", "functiontests", "funm", "fwrite", "fwrite", "fzero", "gallery", "gamma", "gammainc", "gammaincinv", "gammaln", "gather", "gca", "gcbf", "gcbo", "gcd", "gcf", "gcmr", "gco", "ge", "genpath", "genvarname", "geoaxes", "geobasemap", "geobubble", "geodensityplot", "geolimits", "geoplot", "geoscatter", "geotickformat", "get", "get", "get", "get", "get", "get", "get", "get", "get", "get", "get", "getabstime", "getabstime", "getAColParms", "getappdata", "getaudiodata", "getBColParms", "GetCharArray", "getClass", "getColName", "getColType", "getConstantValue", "getCurrentTime", "getData", "getData", "getData", "getData", "getData", "getdatasamples", "getdatasamplesize", "getDiagnosticFor", "getDiagnosticFor", "getDiscreteStateImpl", "getDiscreteStateSpecificationImpl", "getdisp", "getenv", "getEqColType", "getfield", "getFields", "getFields", "getFileFormats", "getFooter", "getframe", "GetFullMatrix", "getGlobalNamesImpl", "getHdrSpace", "getHDUnum", "getHDUtype", "getHeader", "getHeaderImpl", "getIconImpl", "getImgSize", "getImgType", "getImpulseResponseLengthImpl", "getInputDimensionConstraintImpl", "getinterpmethod", "getLocation", "getLocation", "getMockHistory", "getNegativeDiagnosticFor", "getnext", "getNumCols", "getNumHDUs", "getNumInputs", "getNumInputsImpl", "getNumOutputs", "getNumOutputsImpl", "getNumRows", "getOpenFiles", "getOutputDataTypeImpl", "getOutputDimensionConstraintImpl", "getOutputSizeImpl", "getParameter", "getParameter", "getParameter", "getpixelposition", "getplayer", "getpoints", "getPostActValString", "getPostConditionString", "getPostDescriptionString", "getPostExpValString", "getPreDescriptionString", "getpref", "getProfiles", "getPropertyGroups", "getPropertyGroupsImpl", "getqualitydesc", "getReasonPhrase", "getReasonPhrase", "getReport", "getsamples", "getSampleTime", "getSampleTimeImpl", "getsampleusingtime", "getsampleusingtime", "getSharedTestFixtures", "getSimulateUsingImpl", "getSimulinkFunctionNamesImpl", "gettimeseriesnames", "getTimeStr", "gettsafteratevent", "gettsafterevent", "gettsatevent", "gettsbeforeatevent", "gettsbeforeevent", "gettsbetweenevents", "GetVariable", "getvaropts", "getVersion", "GetWorkspaceData", "ginput", "global", "gmres", "gobjects", "gplot", "grabcode", "gradient", "graph", "GraphPlot", "gray", "graymon", "grid", "griddata", "griddatan", "griddedInterpolant", "groot", "groupcounts", "groupsummary", "grouptransform", "gsvd", "gt", "gtext", "guidata", "guide", "guihandles", "gunzip", "gzip", "H5.close", "H5.garbage_collect", "H5.get_libversion", "H5.open", "H5.set_free_list_limits", "H5A.close", "H5A.create", "H5A.delete", "H5A.get_info", "H5A.get_name", "H5A.get_space", "H5A.get_type", "H5A.iterate", "H5A.open", "H5A.open_by_idx", "H5A.open_by_name", "H5A.read", "H5A.write", "h5create", "H5D.close", "H5D.create", "H5D.get_access_plist", "H5D.get_create_plist", "H5D.get_offset", "H5D.get_space", "H5D.get_space_status", "H5D.get_storage_size", "H5D.get_type", "H5D.open", "H5D.read", "H5D.set_extent", "H5D.vlen_get_buf_size", "H5D.write", "h5disp", "H5DS.attach_scale", "H5DS.detach_scale", "H5DS.get_label", "H5DS.get_num_scales", "H5DS.get_scale_name", "H5DS.is_scale", "H5DS.iterate_scales", "H5DS.set_label", "H5DS.set_scale", "H5E.clear", "H5E.get_major", "H5E.get_minor", "H5E.walk", "H5F.close", "H5F.create", "H5F.flush", "H5F.get_access_plist", "H5F.get_create_plist", "H5F.get_filesize", "H5F.get_freespace", "H5F.get_info", "H5F.get_mdc_config", "H5F.get_mdc_hit_rate", "H5F.get_mdc_size", "H5F.get_name", "H5F.get_obj_count", "H5F.get_obj_ids", "H5F.is_hdf5", "H5F.mount", "H5F.open", "H5F.reopen", "H5F.set_mdc_config", "H5F.unmount", "H5G.close", "H5G.create", "H5G.get_info", "H5G.open", "H5I.dec_ref", "H5I.get_file_id", "H5I.get_name", "H5I.get_ref", "H5I.get_type", "H5I.inc_ref", "H5I.is_valid", "h5info", "H5L.copy", "H5L.create_external", "H5L.create_hard", "H5L.create_soft", "H5L.delete", "H5L.exists", "H5L.get_info", "H5L.get_name_by_idx", "H5L.get_val", "H5L.iterate", "H5L.iterate_by_name", "H5L.move", "H5L.visit", "H5L.visit_by_name", "H5ML.compare_values", "H5ML.get_constant_names", "H5ML.get_constant_value", "H5ML.get_function_names", "H5ML.get_mem_datatype", "H5ML.hoffset", "H5ML.sizeof", "H5O.close", "H5O.copy", "H5O.get_comment", "H5O.get_comment_by_name", "H5O.get_info", "H5O.link", "H5O.open", "H5O.open_by_idx", "H5O.set_comment", "H5O.set_comment_by_name", "H5O.visit", "H5O.visit_by_name", "H5P.all_filters_avail", "H5P.close", "H5P.close_class", "H5P.copy", "H5P.create", "H5P.equal", "H5P.exist", "H5P.fill_value_defined", "H5P.get", "H5P.get_alignment", "H5P.get_alloc_time", "H5P.get_attr_creation_order", "H5P.get_attr_phase_change", "H5P.get_btree_ratios", "H5P.get_char_encoding", "H5P.get_chunk", "H5P.get_chunk_cache", "H5P.get_class", "H5P.get_class_name", "H5P.get_class_parent", "H5P.get_copy_object", "H5P.get_create_intermediate_group", "H5P.get_driver", "H5P.get_edc_check", "H5P.get_external", "H5P.get_external_count", "H5P.get_family_offset", "H5P.get_fapl_core", "H5P.get_fapl_family", "H5P.get_fapl_multi", "H5P.get_fclose_degree", "H5P.get_fill_time", "H5P.get_fill_value", "H5P.get_filter", "H5P.get_filter_by_id", "H5P.get_gc_references", "H5P.get_hyper_vector_size", "H5P.get_istore_k", "H5P.get_layout", "H5P.get_libver_bounds", "H5P.get_link_creation_order", "H5P.get_link_phase_change", "H5P.get_mdc_config", "H5P.get_meta_block_size", "H5P.get_multi_type", "H5P.get_nfilters", "H5P.get_nprops", "H5P.get_sieve_buf_size", "H5P.get_size", "H5P.get_sizes", "H5P.get_small_data_block_size", "H5P.get_sym_k", "H5P.get_userblock", "H5P.get_version", "H5P.isa_class", "H5P.iterate", "H5P.modify_filter", "H5P.remove_filter", "H5P.set", "H5P.set_alignment", "H5P.set_alloc_time", "H5P.set_attr_creation_order", "H5P.set_attr_phase_change", "H5P.set_btree_ratios", "H5P.set_char_encoding", "H5P.set_chunk", "H5P.set_chunk_cache", "H5P.set_copy_object", "H5P.set_create_intermediate_group", "H5P.set_deflate", "H5P.set_edc_check", "H5P.set_external", "H5P.set_family_offset", "H5P.set_fapl_core", "H5P.set_fapl_family", "H5P.set_fapl_log", "H5P.set_fapl_multi", "H5P.set_fapl_sec2", "H5P.set_fapl_split", "H5P.set_fapl_stdio", "H5P.set_fclose_degree", "H5P.set_fill_time", "H5P.set_fill_value", "H5P.set_filter", "H5P.set_fletcher32", "H5P.set_gc_references", "H5P.set_hyper_vector_size", "H5P.set_istore_k", "H5P.set_layout", "H5P.set_libver_bounds", "H5P.set_link_creation_order", "H5P.set_link_phase_change", "H5P.set_mdc_config", "H5P.set_meta_block_size", "H5P.set_multi_type", "H5P.set_nbit", "H5P.set_scaleoffset", "H5P.set_shuffle", "H5P.set_sieve_buf_size", "H5P.set_sizes", "H5P.set_small_data_block_size", "H5P.set_sym_k", "H5P.set_userblock", "H5R.create", "H5R.dereference", "H5R.get_name", "H5R.get_obj_type", "H5R.get_region", "h5read", "h5readatt", "H5S.close", "H5S.copy", "H5S.create", "H5S.create_simple", "H5S.extent_copy", "H5S.get_select_bounds", "H5S.get_select_elem_npoints", "H5S.get_select_elem_pointlist", "H5S.get_select_hyper_blocklist", "H5S.get_select_hyper_nblocks", "H5S.get_select_npoints", "H5S.get_select_type", "H5S.get_simple_extent_dims", "H5S.get_simple_extent_ndims", "H5S.get_simple_extent_npoints", "H5S.get_simple_extent_type", "H5S.is_simple", "H5S.offset_simple", "H5S.select_all", "H5S.select_elements", "H5S.select_hyperslab", "H5S.select_none", "H5S.select_valid", "H5S.set_extent_none", "H5S.set_extent_simple", "H5T.array_create", "H5T.close", "H5T.commit", "H5T.committed", "H5T.copy", "H5T.create", "H5T.detect_class", "H5T.enum_create", "H5T.enum_insert", "H5T.enum_nameof", "H5T.enum_valueof", "H5T.equal", "H5T.get_array_dims", "H5T.get_array_ndims", "H5T.get_class", "H5T.get_create_plist", "H5T.get_cset", "H5T.get_ebias", "H5T.get_fields", "H5T.get_inpad", "H5T.get_member_class", "H5T.get_member_index", "H5T.get_member_name", "H5T.get_member_offset", "H5T.get_member_type", "H5T.get_member_value", "H5T.get_native_type", "H5T.get_nmembers", "H5T.get_norm", "H5T.get_offset", "H5T.get_order", "H5T.get_pad", "H5T.get_precision", "H5T.get_sign", "H5T.get_size", "H5T.get_strpad", "H5T.get_super", "H5T.get_tag", "H5T.insert", "H5T.is_variable_str", "H5T.lock", "H5T.open", "H5T.pack", "H5T.set_cset", "H5T.set_ebias", "H5T.set_fields", "H5T.set_inpad", "H5T.set_norm", "H5T.set_offset", "H5T.set_order", "H5T.set_pad", "H5T.set_precision", "H5T.set_sign", "H5T.set_size", "H5T.set_strpad", "H5T.set_tag", "H5T.vlen_create", "h5write", "h5writeatt", "H5Z.filter_avail", "H5Z.get_filter_info", "hadamard", "handle", "hankel", "hasdata", "hasdata", "hasFactoryValue", "hasfile", "hasFrame", "hasnext", "hasPersonalValue", "hasTemporaryValue", "hdf5info", "hdf5read", "hdf5write", "hdfan", "hdfdf24", "hdfdfr8", "hdfh", "hdfhd", "hdfhe", "hdfhx", "hdfinfo", "hdfml", "hdfpt", "hdfread", "hdftool", "hdfv", "hdfvf", "hdfvh", "hdfvs", "head", "heatmap", "height", "help", "helpbrowser", "helpdesk", "helpdlg", "helpwin", "hess", "hex2dec", "hex2num", "hgexport", "hggroup", "hgload", "hgsave", "hgtransform", "hidden", "highlight", "hilb", "hist", "histc", "histcounts", "histcounts2", "histogram", "histogram2", "hms", "hold", "holes", "home", "horzcat", "horzcat", "horzcat", "hot", "hour", "hours", "hover", "hsv", "hsv2rgb", "hypot", "ichol", "idealfilter", "idivide", "ifft", "ifft2", "ifftn", "ifftshift", "ilu", "im2double", "im2frame", "im2java", "imag", "image", "imageDatastore", "imagesc", "imapprox", "imfinfo", "imformats", "imgCompress", "import", "importdata", "imread", "imresize", "imshow", "imtile", "imwrite", "incenter", "incenters", "incidence", "ind2rgb", "ind2sub", "indegree", "inedges", "Inf", "info", "infoImpl", "initialize", "initialize", "initialize", "initialize", "initialize", "initializeDatastore", "initializeDatastore", "inline", "inmem", "inner2outer", "innerjoin", "inOutStatus", "inpolygon", "input", "inputdlg", "inputname", "inputParser", "insertAfter", "insertATbl", "insertBefore", "insertBTbl", "insertCol", "insertImg", "insertRows", "inShape", "inspect", "instrcallback", "instrfind", "instrfindall", "int16", "int2str", "int32", "int64", "int8", "integral", "integral2", "integral3", "interp1", "interp1q", "interp2", "interp3", "interpft", "interpn", "interpstreamspeed", "intersect", "intersect", "intmax", "intmin", "inv", "invhilb", "invoke", "ipermute", "iqr", "is*", "isa", "isappdata", "isaUnderlying", "isbanded", "isbetween", "iscalendarduration", "iscategorical", "iscategory", "iscell", "iscellstr", "ischange", "ischar", "iscolumn", "iscom", "isCompatible", "isCompressedImg", "isConnected", "isdag", "isdatetime", "isdiag", "isdir", "isDiscreteStateSpecificationMutableImpl", "isDone", "isDoneImpl", "isdst", "isduration", "isEdge", "isempty", "isempty", "isenum", "isequal", "isequaln", "isequalwithequalnans", "isevent", "isfield", "isfile", "isfinite", "isfloat", "isfolder", "isfullfile", "isfullfile", "isgraphics", "ishandle", "ishermitian", "ishghandle", "ishold", "ishole", "isIllConditioned", "isInactivePropertyImpl", "isinf", "isInputComplexityMutableImpl", "isInputDataTypeMutableImpl", "isInputDirectFeedthroughImpl", "isInputSizeLockedImpl", "isInputSizeMutableImpl", "isinteger", "isinterface", "isInterior", "isinterior", "isisomorphic", "isjava", "isKey", "iskeyword", "isletter", "isLoaded", "islocalmax", "islocalmin", "isLocked", "islogical", "ismac", "ismatrix", "ismember", "ismembertol", "ismethod", "ismissing", "ismultigraph", "isnan", "isnat", "isNull", "isnumeric", "isobject", "isocaps", "isocolors", "isomorphism", "isonormals", "isordinal", "isosurface", "isoutlier", "isOutputComplexImpl", "isOutputFixedSizeImpl", "ispc", "isplaying", "ispref", "isprime", "isprop", "isprotected", "isreal", "isrecording", "isregular", "isrow", "isscalar", "issimplified", "issorted", "issortedrows", "isspace", "issparse", "isstr", "isstring", "isStringScalar", "isstrprop", "isstruct", "isstudent", "issymmetric", "istable", "istall", "istimetable", "istril", "istriu", "isTunablePropertyDataTypeMutableImpl", "isundefined", "isunix", "isvalid", "isvalid", "isvalid", "isvarname", "isvector", "isweekend", "javaaddpath", "javaArray", "javachk", "javaclasspath", "javaMethod", "javaMethodEDT", "javaObject", "javaObjectEDT", "javarmpath", "jet", "join", "join", "join", "jsondecode", "jsonencode", "juliandate", "keepMeasuring", "keyboard", "keys", "KeyValueDatastore", "KeyValueStore", "kron", "labeledge", "labelnode", "lag", "laplacian", "lasterr", "lasterror", "lastwarn", "layout", "lcm", "ldivide", "ldl", "le", "legend", "legendre", "length", "length", "length", "length", "lib.pointer", "libfunctions", "libfunctionsview", "libisloaded", "libpointer", "libstruct", "license", "light", "lightangle", "lighting", "lin2mu", "line", "lines", "LineSpec", "linkaxes", "linkdata", "linkprop", "linsolve", "linspace", "listdlg", "listener", "listfonts", "listModifiedFiles", "listRequiredFiles", "load", "load", "load", "loadlibrary", "loadobj", "loadObjectImpl", "localfunctions", "log", "log", "log", "log10", "log1p", "log2", "logical", "Logical", "loglog", "logm", "logspace", "lookfor", "lower", "ls", "lscov", "lsqminnorm", "lsqnonneg", "lsqr", "lt", "lu", "magic", "makehgtform", "mapreduce", "mapreducer", "mat2cell", "mat2str", "matchpairs", "material", "matfile", "matlab", "matlab", "matlab", "matlab.addons.disableAddon", "matlab.addons.enableAddon", "matlab.addons.install", "matlab.addons.installedAddons", "matlab.addons.isAddonEnabled", "matlab.addons.toolbox.installedToolboxes", "matlab.addons.toolbox.installToolbox", "matlab.addons.toolbox.packageToolbox", "matlab.addons.toolbox.toolboxVersion", "matlab.addons.toolbox.uninstallToolbox", "matlab.addons.uninstall", "matlab.apputil.create", "matlab.apputil.getInstalledAppInfo", "matlab.apputil.install", "matlab.apputil.package", "matlab.apputil.run", "matlab.apputil.uninstall", "matlab.codetools.requiredFilesAndProducts", "matlab.engine.connect_matlab", "matlab.engine.engineName", "matlab.engine.find_matlab", "matlab.engine.FutureResult", "matlab.engine.isEngineShared", "matlab.engine.MatlabEngine", "matlab.engine.shareEngine", "matlab.engine.start_matlab", "matlab.exception.JavaException", "matlab.exception.PyException", "matlab.graphics.Graphics", "matlab.graphics.GraphicsPlaceholder", "matlab.io.Datastore", "matlab.io.datastore.DsFileReader", "matlab.io.datastore.DsFileSet", "matlab.io.datastore.HadoopFileBased", "matlab.io.datastore.HadoopLocationBased", "matlab.io.datastore.Partitionable", "matlab.io.datastore.Shuffleable", "matlab.io.hdf4.sd", "matlab.io.hdf4.sd.attrInfo", "matlab.io.hdf4.sd.close", "matlab.io.hdf4.sd.create", "matlab.io.hdf4.sd.dimInfo", "matlab.io.hdf4.sd.endAccess", "matlab.io.hdf4.sd.fileInfo", "matlab.io.hdf4.sd.findAttr", "matlab.io.hdf4.sd.getCal", "matlab.io.hdf4.sd.getChunkInfo", "matlab.io.hdf4.sd.getCompInfo", "matlab.io.hdf4.sd.getDataStrs", "matlab.io.hdf4.sd.getDimID", "matlab.io.hdf4.sd.getDimScale", "matlab.io.hdf4.sd.getDimStrs", "matlab.io.hdf4.sd.getFilename", "matlab.io.hdf4.sd.getFillValue", "matlab.io.hdf4.sd.getInfo", "matlab.io.hdf4.sd.getRange", "matlab.io.hdf4.sd.idToRef", "matlab.io.hdf4.sd.idType", "matlab.io.hdf4.sd.isCoordVar", "matlab.io.hdf4.sd.isRecord", "matlab.io.hdf4.sd.nameToIndex", "matlab.io.hdf4.sd.nameToIndices", "matlab.io.hdf4.sd.readAttr", "matlab.io.hdf4.sd.readChunk", "matlab.io.hdf4.sd.readData", "matlab.io.hdf4.sd.refToIndex", "matlab.io.hdf4.sd.select", "matlab.io.hdf4.sd.setAttr", "matlab.io.hdf4.sd.setCal", "matlab.io.hdf4.sd.setChunk", "matlab.io.hdf4.sd.setCompress", "matlab.io.hdf4.sd.setDataStrs", "matlab.io.hdf4.sd.setDimName", "matlab.io.hdf4.sd.setDimScale", "matlab.io.hdf4.sd.setDimStrs", "matlab.io.hdf4.sd.setExternalFile", "matlab.io.hdf4.sd.setFillMode", "matlab.io.hdf4.sd.setFillValue", "matlab.io.hdf4.sd.setNBitDataSet", "matlab.io.hdf4.sd.setRange", "matlab.io.hdf4.sd.start", "matlab.io.hdf4.sd.writeChunk", "matlab.io.hdf4.sd.writeData", "matlab.io.hdfeos.gd", "matlab.io.hdfeos.gd.attach", "matlab.io.hdfeos.gd.close", "matlab.io.hdfeos.gd.compInfo", "matlab.io.hdfeos.gd.create", "matlab.io.hdfeos.gd.defBoxRegion", "matlab.io.hdfeos.gd.defComp", "matlab.io.hdfeos.gd.defDim", "matlab.io.hdfeos.gd.defField", "matlab.io.hdfeos.gd.defOrigin", "matlab.io.hdfeos.gd.defPixReg", "matlab.io.hdfeos.gd.defProj", "matlab.io.hdfeos.gd.defTile", "matlab.io.hdfeos.gd.defVrtRegion", "matlab.io.hdfeos.gd.detach", "matlab.io.hdfeos.gd.dimInfo", "matlab.io.hdfeos.gd.extractRegion", "matlab.io.hdfeos.gd.fieldInfo", "matlab.io.hdfeos.gd.getFillValue", "matlab.io.hdfeos.gd.getPixels", "matlab.io.hdfeos.gd.getPixValues", "matlab.io.hdfeos.gd.gridInfo", "matlab.io.hdfeos.gd.ij2ll", "matlab.io.hdfeos.gd.inqAttrs", "matlab.io.hdfeos.gd.inqDims", "matlab.io.hdfeos.gd.inqFields", "matlab.io.hdfeos.gd.inqGrid", "matlab.io.hdfeos.gd.interpolate", "matlab.io.hdfeos.gd.ll2ij", "matlab.io.hdfeos.gd.nEntries", "matlab.io.hdfeos.gd.open", "matlab.io.hdfeos.gd.originInfo", "matlab.io.hdfeos.gd.pixRegInfo", "matlab.io.hdfeos.gd.projInfo", "matlab.io.hdfeos.gd.readAttr", "matlab.io.hdfeos.gd.readBlkSomOffset", "matlab.io.hdfeos.gd.readField", "matlab.io.hdfeos.gd.readTile", "matlab.io.hdfeos.gd.regionInfo", "matlab.io.hdfeos.gd.setFillValue", "matlab.io.hdfeos.gd.setTileComp", "matlab.io.hdfeos.gd.sphereCodeToName", "matlab.io.hdfeos.gd.sphereNameToCode", "matlab.io.hdfeos.gd.tileInfo", "matlab.io.hdfeos.gd.writeAttr", "matlab.io.hdfeos.gd.writeBlkSomOffset", "matlab.io.hdfeos.gd.writeField", "matlab.io.hdfeos.gd.writeTile", "matlab.io.hdfeos.sw", "matlab.io.hdfeos.sw.attach", "matlab.io.hdfeos.sw.close", "matlab.io.hdfeos.sw.compInfo", "matlab.io.hdfeos.sw.create", "matlab.io.hdfeos.sw.defBoxRegion", "matlab.io.hdfeos.sw.defComp", "matlab.io.hdfeos.sw.defDataField", "matlab.io.hdfeos.sw.defDim", "matlab.io.hdfeos.sw.defDimMap", "matlab.io.hdfeos.sw.defGeoField", "matlab.io.hdfeos.sw.defTimePeriod", "matlab.io.hdfeos.sw.defVrtRegion", "matlab.io.hdfeos.sw.detach", "matlab.io.hdfeos.sw.dimInfo", "matlab.io.hdfeos.sw.extractPeriod", "matlab.io.hdfeos.sw.extractRegion", "matlab.io.hdfeos.sw.fieldInfo", "matlab.io.hdfeos.sw.geoMapInfo", "matlab.io.hdfeos.sw.getFillValue", "matlab.io.hdfeos.sw.idxMapInfo", "matlab.io.hdfeos.sw.inqAttrs", "matlab.io.hdfeos.sw.inqDataFields", "matlab.io.hdfeos.sw.inqDims", "matlab.io.hdfeos.sw.inqGeoFields", "matlab.io.hdfeos.sw.inqIdxMaps", "matlab.io.hdfeos.sw.inqMaps", "matlab.io.hdfeos.sw.inqSwath", "matlab.io.hdfeos.sw.mapInfo", "matlab.io.hdfeos.sw.nEntries", "matlab.io.hdfeos.sw.open", "matlab.io.hdfeos.sw.periodInfo", "matlab.io.hdfeos.sw.readAttr", "matlab.io.hdfeos.sw.readField", "matlab.io.hdfeos.sw.regionInfo", "matlab.io.hdfeos.sw.setFillValue", "matlab.io.hdfeos.sw.writeAttr", "matlab.io.hdfeos.sw.writeField", "matlab.io.MatFile", "matlab.io.saveVariablesToScript", "matlab.lang.correction.AppendArgumentsCorrection", "matlab.lang.makeUniqueStrings", "matlab.lang.makeValidName", "matlab.lang.OnOffSwitchState", "matlab.mex.MexHost", "matlab.mixin.Copyable", "matlab.mixin.CustomDisplay", "matlab.mixin.CustomDisplay.convertDimensionsToString", "matlab.mixin.CustomDisplay.displayPropertyGroups", "matlab.mixin.CustomDisplay.getClassNameForHeader", "matlab.mixin.CustomDisplay.getDeletedHandleText", "matlab.mixin.CustomDisplay.getDetailedFooter", "matlab.mixin.CustomDisplay.getDetailedHeader", "matlab.mixin.CustomDisplay.getHandleText", "matlab.mixin.CustomDisplay.getSimpleHeader", "matlab.mixin.Heterogeneous", "matlab.mixin.Heterogeneous.getDefaultScalarElement", "matlab.mixin.SetGet", "matlab.mixin.SetGetExactNames", "matlab.mixin.util.PropertyGroup", "matlab.mock.actions.AssignOutputs", "matlab.mock.actions.Invoke", "matlab.mock.actions.ReturnStoredValue", "matlab.mock.actions.StoreValue", "matlab.mock.actions.ThrowException", "matlab.mock.AnyArguments", "matlab.mock.constraints.Occurred", "matlab.mock.constraints.WasAccessed", "matlab.mock.constraints.WasCalled", "matlab.mock.constraints.WasSet", "matlab.mock.history.MethodCall", "matlab.mock.history.PropertyAccess", "matlab.mock.history.PropertyModification", "matlab.mock.history.SuccessfulMethodCall", "matlab.mock.history.SuccessfulPropertyAccess", "matlab.mock.history.SuccessfulPropertyModification", "matlab.mock.history.UnsuccessfulMethodCall", "matlab.mock.history.UnsuccessfulPropertyAccess", "matlab.mock.history.UnsuccessfulPropertyModification", "matlab.mock.InteractionHistory", "matlab.mock.InteractionHistory.forMock", "matlab.mock.MethodCallBehavior", "matlab.mock.PropertyBehavior", "matlab.mock.PropertyGetBehavior", "matlab.mock.PropertySetBehavior", "matlab.mock.TestCase", "matlab.mock.TestCase.forInteractiveUse", "matlab.net.ArrayFormat", "matlab.net.base64decode", "matlab.net.base64encode", "matlab.net.http.AuthenticationScheme", "matlab.net.http.AuthInfo", "matlab.net.http.Cookie", "matlab.net.http.CookieInfo", "matlab.net.http.CookieInfo.collectFromLog", "matlab.net.http.Credentials", "matlab.net.http.Disposition", "matlab.net.http.field.AcceptField", "matlab.net.http.field.AuthenticateField", "matlab.net.http.field.AuthenticationInfoField", "matlab.net.http.field.AuthorizationField", "matlab.net.http.field.ContentDispositionField", "matlab.net.http.field.ContentLengthField", "matlab.net.http.field.ContentLocationField", "matlab.net.http.field.ContentTypeField", "matlab.net.http.field.CookieField", "matlab.net.http.field.DateField", "matlab.net.http.field.GenericField", "matlab.net.http.field.GenericParameterizedField", "matlab.net.http.field.HTTPDateField", "matlab.net.http.field.IntegerField", "matlab.net.http.field.LocationField", "matlab.net.http.field.MediaRangeField", "matlab.net.http.field.SetCookieField", "matlab.net.http.field.URIReferenceField", "matlab.net.http.HeaderField", "matlab.net.http.HeaderField.displaySubclasses", "matlab.net.http.HTTPException", "matlab.net.http.HTTPOptions", "matlab.net.http.io.BinaryConsumer", "matlab.net.http.io.ContentConsumer", "matlab.net.http.io.ContentProvider", "matlab.net.http.io.FileConsumer", "matlab.net.http.io.FileProvider", "matlab.net.http.io.FormProvider", "matlab.net.http.io.GenericConsumer", "matlab.net.http.io.GenericProvider", "matlab.net.http.io.ImageConsumer", "matlab.net.http.io.ImageProvider", "matlab.net.http.io.JSONConsumer", "matlab.net.http.io.JSONProvider", "matlab.net.http.io.MultipartConsumer", "matlab.net.http.io.MultipartFormProvider", "matlab.net.http.io.MultipartProvider", "matlab.net.http.io.StringConsumer", "matlab.net.http.io.StringProvider", "matlab.net.http.LogRecord", "matlab.net.http.MediaType", "matlab.net.http.Message", "matlab.net.http.MessageBody", "matlab.net.http.MessageType", "matlab.net.http.ProgressMonitor", "matlab.net.http.ProtocolVersion", "matlab.net.http.RequestLine", "matlab.net.http.RequestMessage", "matlab.net.http.RequestMethod", "matlab.net.http.ResponseMessage", "matlab.net.http.StartLine", "matlab.net.http.StatusClass", "matlab.net.http.StatusCode", "matlab.net.http.StatusCode.fromValue", "matlab.net.http.StatusLine", "matlab.net.QueryParameter", "matlab.net.URI", "matlab.perftest.FixedTimeExperiment", "matlab.perftest.FrequentistTimeExperiment", "matlab.perftest.TestCase", "matlab.perftest.TimeExperiment", "matlab.perftest.TimeExperiment.limitingSamplingError", "matlab.perftest.TimeExperiment.withFixedSampleSize", "matlab.perftest.TimeResult", "matlab.project.createProject", "matlab.project.loadProject", "matlab.project.Project", "matlab.project.rootProject", "matlab.System", "matlab.system.display.Action", "matlab.system.display.Header", "matlab.system.display.Icon", "matlab.system.display.Section", "matlab.system.display.SectionGroup", "matlab.system.mixin.CustomIcon", "matlab.system.mixin.FiniteSource", "matlab.system.mixin.Nondirect", "matlab.system.mixin.Propagates", "matlab.system.mixin.SampleTime", "matlab.system.StringSet", "matlab.tall.blockMovingWindow", "matlab.tall.movingWindow", "matlab.tall.reduce", "matlab.tall.transform", "matlab.test.behavior.Missing", "matlab.uitest.TestCase", "matlab.uitest.TestCase.forInteractiveUse", "matlab.uitest.unlock", "matlab.unittest.constraints.AbsoluteTolerance", "matlab.unittest.constraints.AnyCellOf", "matlab.unittest.constraints.AnyElementOf", "matlab.unittest.constraints.BooleanConstraint", "matlab.unittest.constraints.CellComparator", "matlab.unittest.constraints.Constraint", "matlab.unittest.constraints.ContainsSubstring", "matlab.unittest.constraints.EndsWithSubstring", "matlab.unittest.constraints.Eventually", "matlab.unittest.constraints.EveryCellOf", "matlab.unittest.constraints.EveryElementOf", "matlab.unittest.constraints.HasElementCount", "matlab.unittest.constraints.HasField", "matlab.unittest.constraints.HasInf", "matlab.unittest.constraints.HasLength", "matlab.unittest.constraints.HasNaN", "matlab.unittest.constraints.HasSize", "matlab.unittest.constraints.HasUniqueElements", "matlab.unittest.constraints.IsAnything", "matlab.unittest.constraints.IsEmpty", "matlab.unittest.constraints.IsEqualTo", "matlab.unittest.constraints.IsFalse", "matlab.unittest.constraints.IsFile", "matlab.unittest.constraints.IsFinite", "matlab.unittest.constraints.IsFolder", "matlab.unittest.constraints.IsGreaterThan", "matlab.unittest.constraints.IsGreaterThanOrEqualTo", "matlab.unittest.constraints.IsInstanceOf", "matlab.unittest.constraints.IsLessThan", "matlab.unittest.constraints.IsLessThanOrEqualTo", "matlab.unittest.constraints.IsOfClass", "matlab.unittest.constraints.IsReal", "matlab.unittest.constraints.IsSameHandleAs", "matlab.unittest.constraints.IsSameSetAs", "matlab.unittest.constraints.IsScalar", "matlab.unittest.constraints.IsSparse", "matlab.unittest.constraints.IsSubsetOf", "matlab.unittest.constraints.IsSubstringOf", "matlab.unittest.constraints.IssuesNoWarnings", "matlab.unittest.constraints.IssuesWarnings", "matlab.unittest.constraints.IsSupersetOf", "matlab.unittest.constraints.IsTrue", "matlab.unittest.constraints.LogicalComparator", "matlab.unittest.constraints.Matches", "matlab.unittest.constraints.NumericComparator", "matlab.unittest.constraints.ObjectComparator", "matlab.unittest.constraints.PublicPropertyComparator", "matlab.unittest.constraints.PublicPropertyComparator.supportingAllValues", "matlab.unittest.constraints.RelativeTolerance", "matlab.unittest.constraints.ReturnsTrue", "matlab.unittest.constraints.StartsWithSubstring", "matlab.unittest.constraints.StringComparator", "matlab.unittest.constraints.StructComparator", "matlab.unittest.constraints.TableComparator", "matlab.unittest.constraints.Throws", "matlab.unittest.constraints.Tolerance", "matlab.unittest.diagnostics.ConstraintDiagnostic", "matlab.unittest.diagnostics.ConstraintDiagnostic.getDisplayableString", "matlab.unittest.diagnostics.Diagnostic", "matlab.unittest.diagnostics.DiagnosticResult", "matlab.unittest.diagnostics.DisplayDiagnostic", "matlab.unittest.diagnostics.FigureDiagnostic", "matlab.unittest.diagnostics.FileArtifact", "matlab.unittest.diagnostics.FrameworkDiagnostic", "matlab.unittest.diagnostics.FunctionHandleDiagnostic", "matlab.unittest.diagnostics.LoggedDiagnosticEventData", "matlab.unittest.diagnostics.ScreenshotDiagnostic", "matlab.unittest.diagnostics.StringDiagnostic", "matlab.unittest.fixtures.CurrentFolderFixture", "matlab.unittest.fixtures.Fixture", "matlab.unittest.fixtures.PathFixture", "matlab.unittest.fixtures.ProjectFixture", "matlab.unittest.fixtures.SuppressedWarningsFixture", "matlab.unittest.fixtures.TemporaryFolderFixture", "matlab.unittest.fixtures.WorkingFolderFixture", "matlab.unittest.measurement.DefaultMeasurementResult", "matlab.unittest.measurement.MeasurementResult", "matlab.unittest.parameters.ClassSetupParameter", "matlab.unittest.parameters.EmptyParameter", "matlab.unittest.parameters.MethodSetupParameter", "matlab.unittest.parameters.Parameter", "matlab.unittest.parameters.Parameter.fromData", "matlab.unittest.parameters.TestParameter", "matlab.unittest.plugins.codecoverage.CoberturaFormat", "matlab.unittest.plugins.codecoverage.CoverageReport", "matlab.unittest.plugins.codecoverage.ProfileReport", "matlab.unittest.plugins.CodeCoveragePlugin", "matlab.unittest.plugins.CodeCoveragePlugin.forFile", "matlab.unittest.plugins.CodeCoveragePlugin.forFolder", "matlab.unittest.plugins.CodeCoveragePlugin.forPackage", "matlab.unittest.plugins.diagnosticrecord.DiagnosticRecord", "matlab.unittest.plugins.diagnosticrecord.ExceptionDiagnosticRecord", "matlab.unittest.plugins.diagnosticrecord.LoggedDiagnosticRecord", "matlab.unittest.plugins.diagnosticrecord.QualificationDiagnosticRecord", "matlab.unittest.plugins.DiagnosticsOutputPlugin", "matlab.unittest.plugins.DiagnosticsRecordingPlugin", "matlab.unittest.plugins.DiagnosticsValidationPlugin", "matlab.unittest.plugins.FailOnWarningsPlugin", "matlab.unittest.plugins.LoggingPlugin", "matlab.unittest.plugins.LoggingPlugin.withVerbosity", "matlab.unittest.plugins.OutputStream", "matlab.unittest.plugins.plugindata.FinalizedResultPluginData", "matlab.unittest.plugins.plugindata.ImplicitFixturePluginData", "matlab.unittest.plugins.plugindata.PluginData", "matlab.unittest.plugins.plugindata.QualificationContext", "matlab.unittest.plugins.plugindata.SharedTestFixturePluginData", "matlab.unittest.plugins.plugindata.TestContentCreationPluginData", "matlab.unittest.plugins.plugindata.TestSuiteRunPluginData", "matlab.unittest.plugins.QualifyingPlugin", "matlab.unittest.plugins.StopOnFailuresPlugin", "matlab.unittest.plugins.TAPPlugin", "matlab.unittest.plugins.TAPPlugin.producingOriginalFormat", "matlab.unittest.plugins.TAPPlugin.producingVersion13", "matlab.unittest.plugins.testreport.DOCXTestReportPlugin", "matlab.unittest.plugins.testreport.HTMLTestReportPlugin", "matlab.unittest.plugins.testreport.PDFTestReportPlugin", "matlab.unittest.plugins.TestReportPlugin", "matlab.unittest.plugins.TestReportPlugin.producingDOCX", "matlab.unittest.plugins.TestReportPlugin.producingHTML", "matlab.unittest.plugins.TestReportPlugin.producingPDF", "matlab.unittest.plugins.TestRunnerPlugin", "matlab.unittest.plugins.TestRunProgressPlugin", "matlab.unittest.plugins.ToFile", "matlab.unittest.plugins.ToStandardOutput", "matlab.unittest.plugins.ToUniqueFile", "matlab.unittest.plugins.XMLPlugin", "matlab.unittest.plugins.XMLPlugin.producingJUnitFormat", "matlab.unittest.qualifications.Assertable", "matlab.unittest.qualifications.AssertionFailedException", "matlab.unittest.qualifications.Assumable", "matlab.unittest.qualifications.AssumptionFailedException", "matlab.unittest.qualifications.ExceptionEventData", "matlab.unittest.qualifications.FatalAssertable", "matlab.unittest.qualifications.FatalAssertionFailedException", "matlab.unittest.qualifications.QualificationEventData", "matlab.unittest.qualifications.Verifiable", "matlab.unittest.Scope", "matlab.unittest.selectors.AndSelector", "matlab.unittest.selectors.HasBaseFolder", "matlab.unittest.selectors.HasName", "matlab.unittest.selectors.HasParameter", "matlab.unittest.selectors.HasProcedureName", "matlab.unittest.selectors.HasSharedTestFixture", "matlab.unittest.selectors.HasSuperclass", "matlab.unittest.selectors.HasTag", "matlab.unittest.selectors.NotSelector", "matlab.unittest.selectors.OrSelector", "matlab.unittest.Test", "matlab.unittest.TestCase", "matlab.unittest.TestCase.forInteractiveUse", "matlab.unittest.TestResult", "matlab.unittest.TestRunner", "matlab.unittest.TestRunner.withNoPlugins", "matlab.unittest.TestRunner.withTextOutput", "matlab.unittest.TestSuite", "matlab.unittest.TestSuite.fromClass", "matlab.unittest.TestSuite.fromFile", "matlab.unittest.TestSuite.fromFolder", "matlab.unittest.TestSuite.fromMethod", "matlab.unittest.TestSuite.fromName", "matlab.unittest.TestSuite.fromPackage", "matlab.unittest.TestSuite.fromProject", "matlab.unittest.Verbosity", "matlab.wsdl.createWSDLClient", "matlab.wsdl.setWSDLToolPath", "matlabrc", "matlabroot", "matlabshared.supportpkg.checkForUpdate", "matlabshared.supportpkg.getInstalled", "matlabshared.supportpkg.getSupportPackageRoot", "matlabshared.supportpkg.setSupportPackageRoot", "max", "max", "maxflow", "MaximizeCommandWindow", "maxk", "maxNumCompThreads", "maxpartitions", "maxpartitions", "mean", "mean", "median", "median", "memmapfile", "memoize", "MemoizedFunction", "memory", "menu", "mergecats", "mergevars", "mesh", "meshc", "meshgrid", "meshz", "meta.abstractDetails", "meta.ArrayDimension", "meta.class", "meta.class.fromName", "meta.DynamicProperty", "meta.EnumeratedValue", "meta.event", "meta.FixedDimension", "meta.MetaData", "meta.method", "meta.package", "meta.package.fromName", "meta.package.getAllPackages", "meta.property", "meta.UnrestrictedDimension", "meta.Validation", "metaclass", "methods", "methodsview", "mex", "mex.getCompilerConfigurations", "MException", "MException.last", "mexext", "mexhost", "mfilename", "mget", "milliseconds", "min", "min", "MinimizeCommandWindow", "mink", "minres", "minspantree", "minus", "minute", "minutes", "mislocked", "missing", "mkdir", "mkdir", "mkpp", "mldivide", "mlint", "mlintrpt", "mlock", "mmfileinfo", "mod", "mode", "month", "more", "morebins", "movAbsHDU", "move", "move", "movefile", "movegui", "movevars", "movie", "movmad", "movmax", "movmean", "movmedian", "movmin", "movNamHDU", "movprod", "movRelHDU", "movstd", "movsum", "movvar", "mpower", "mput", "mrdivide", "msgbox", "mtimes", "mu2lin", "multibandread", "multibandwrite", "munlock", "mustBeFinite", "mustBeGreaterThan", "mustBeGreaterThanOrEqual", "mustBeInteger", "mustBeLessThan", "mustBeLessThanOrEqual", "mustBeMember", "mustBeNegative", "mustBeNonempty", "mustBeNonNan", "mustBeNonnegative", "mustBeNonpositive", "mustBeNonsparse", "mustBeNonzero", "mustBeNumeric", "mustBeNumericOrLogical", "mustBePositive", "mustBeReal", "namelengthmax", "NaN", "nargchk", "nargin", "nargin", "narginchk", "nargout", "nargout", "nargoutchk", "NaT", "native2unicode", "nccreate", "ncdisp", "nchoosek", "ncinfo", "ncread", "ncreadatt", "ncwrite", "ncwriteatt", "ncwriteschema", "ndgrid", "ndims", "ne", "nearest", "nearestNeighbor", "nearestNeighbor", "nearestNeighbor", "nearestvertex", "neighbors", "neighbors", "neighbors", "NET", "NET.addAssembly", "NET.Assembly", "NET.convertArray", "NET.createArray", "NET.createGeneric", "NET.disableAutoRelease", "NET.enableAutoRelease", "NET.GenericClass", "NET.invokeGenericMethod", "NET.isNETSupported", "NET.NetException", "NET.setStaticProperty", "netcdf.abort", "netcdf.close", "netcdf.copyAtt", "netcdf.create", "netcdf.defDim", "netcdf.defGrp", "netcdf.defVar", "netcdf.defVarChunking", "netcdf.defVarDeflate", "netcdf.defVarFill", "netcdf.defVarFletcher32", "netcdf.delAtt", "netcdf.endDef", "netcdf.getAtt", "netcdf.getChunkCache", "netcdf.getConstant", "netcdf.getConstantNames", "netcdf.getVar", "netcdf.inq", "netcdf.inqAtt", "netcdf.inqAttID", "netcdf.inqAttName", "netcdf.inqDim", "netcdf.inqDimID", "netcdf.inqDimIDs", "netcdf.inqFormat", "netcdf.inqGrpName", "netcdf.inqGrpNameFull", "netcdf.inqGrpParent", "netcdf.inqGrps", "netcdf.inqLibVers", "netcdf.inqNcid", "netcdf.inqUnlimDims", "netcdf.inqVar", "netcdf.inqVarChunking", "netcdf.inqVarDeflate", "netcdf.inqVarFill", "netcdf.inqVarFletcher32", "netcdf.inqVarID", "netcdf.inqVarIDs", "netcdf.open", "netcdf.putAtt", "netcdf.putVar", "netcdf.reDef", "netcdf.renameAtt", "netcdf.renameDim", "netcdf.renameVar", "netcdf.setChunkCache", "netcdf.setDefaultFormat", "netcdf.setFill", "netcdf.sync", "newline", "newplot", "nextfile", "nextpow2", "nnz", "nonzeros", "norm", "normalize", "normest", "not", "notebook", "notify", "now", "nsidedpoly", "nthroot", "null", "num2cell", "num2hex", "num2ruler", "num2str", "numArgumentsFromSubscript", "numboundaries", "numedges", "numel", "numnodes", "numpartitions", "numpartitions", "numRegions", "numsides", "nzmax", "ode113", "ode15i", "ode15s", "ode23", "ode23s", "ode23t", "ode23tb", "ode45", "odeget", "odeset", "odextend", "onCleanup", "ones", "onFailure", "onFailure", "open", "open", "openDiskFile", "openfig", "openFile", "opengl", "openProject", "openvar", "optimget", "optimset", "or", "ordeig", "orderfields", "ordqz", "ordschur", "orient", "orth", "outdegree", "outedges", "outerjoin", "outputImpl", "overlaps", "pack", "pad", "padecoef", "pagesetupdlg", "pan", "panInteraction", "parallelplot", "pareto", "parfor", "parquetDatastore", "parquetinfo", "parquetread", "parquetwrite", "parse", "parse", "parseSoapResponse", "partition", "partition", "partition", "parula", "pascal", "patch", "path", "path2rc", "pathsep", "pathtool", "pause", "pause", "pbaspect", "pcg", "pchip", "pcode", "pcolor", "pdepe", "pdeval", "peaks", "perimeter", "perimeter", "perl", "perms", "permute", "persistent", "pi", "pie", "pie3", "pink", "pinv", "planerot", "play", "play", "playblocking", "plot", "plot", "plot", "plot", "plot", "plot3", "plotbrowser", "plotedit", "plotmatrix", "plottools", "plotyy", "plus", "plus", "pointLocation", "pointLocation", "pol2cart", "polar", "polaraxes", "polarhistogram", "polarplot", "polarscatter", "poly", "polyarea", "polybuffer", "polyder", "polyeig", "polyfit", "polyint", "polyshape", "polyval", "polyvalm", "posixtime", "pow2", "power", "ppval", "predecessors", "prefdir", "preferences", "preferredBufferSize", "preferredBufferSize", "press", "preview", "preview", "primes", "print", "print", "printdlg", "printopt", "printpreview", "prism", "processInputSpecificationChangeImpl", "processTunedPropertiesImpl", "prod", "profile", "profsave", "progress", "propagatedInputComplexity", "propagatedInputDataType", "propagatedInputFixedSize", "propagatedInputSize", "propedit", "propedit", "properties", "propertyeditor", "psi", "publish", "PutCharArray", "putData", "putData", "putData", "putData", "putData", "putData", "putData", "putData", "PutFullMatrix", "PutWorkspaceData", "pwd", "pyargs", "pyversion", "qmr", "qr", "qrdelete", "qrinsert", "qrupdate", "quad", "quad2d", "quadgk", "quadl", "quadv", "quarter", "questdlg", "Quit", "quit", "quiver", "quiver3", "qz", "rad2deg", "rand", "rand", "randi", "randi", "randn", "randn", "randperm", "randperm", "RandStream", "RandStream", "RandStream.create", "RandStream.getGlobalStream", "RandStream.list", "RandStream.setGlobalStream", "rank", "rat", "rats", "rbbox", "rcond", "rdivide", "read", "read", "read", "read", "read", "readall", "readasync", "readATblHdr", "readBTblHdr", "readCard", "readcell", "readCol", "readFrame", "readimage", "readImg", "readKey", "readKeyCmplx", "readKeyDbl", "readKeyLongLong", "readKeyLongStr", "readKeyUnit", "readmatrix", "readRecord", "readtable", "readtimetable", "readvars", "real", "reallog", "realmax", "realmin", "realpow", "realsqrt", "record", "record", "recordblocking", "rectangle", "rectint", "recycle", "reducepatch", "reducevolume", "refresh", "refreshdata", "refreshSourceControl", "regexp", "regexpi", "regexprep", "regexptranslate", "regions", "regionZoomInteraction", "registerevent", "regmatlabserver", "rehash", "relationaloperators", "release", "release", "releaseImpl", "reload", "rem", "Remove", "remove", "RemoveAll", "removeCategory", "removecats", "removeFields", "removeFields", "removeFile", "removeLabel", "removeParameter", "removeParameter", "removePath", "removeReference", "removeShortcut", "removeShutdownFile", "removeStartupFile", "removeToolbarExplorationButtons", "removets", "removevars", "rename", "renamecats", "rendererinfo", "reordercats", "reordernodes", "repeat", "repeat", "repeat", "repeat", "repeat", "repelem", "replace", "replaceBetween", "replaceFields", "replaceFields", "repmat", "reportFinalizedResult", "resample", "resample", "rescale", "reset", "reset", "reset", "reset", "reset", "resetImpl", "reshape", "reshape", "residue", "resolve", "restartable", "restartable", "restartable", "restoredefaultpath", "result", "resume", "rethrow", "rethrow", "retime", "return", "returnStoredValueWhen", "reusable", "reusable", "reusable", "reverse", "rgb2gray", "rgb2hsv", "rgb2ind", "rgbplot", "ribbon", "rlim", "rmappdata", "rmboundary", "rmdir", "rmdir", "rmedge", "rmfield", "rmholes", "rmmissing", "rmnode", "rmoutliers", "rmpath", "rmpref", "rmprop", "rmslivers", "rng", "roots", "rose", "rosser", "rot90", "rotate", "rotate", "rotate3d", "rotateInteraction", "round", "rowfun", "rows2vars", "rref", "rsf2csf", "rtickangle", "rtickformat", "rticklabels", "rticks", "ruler2num", "rulerPanInteraction", "run", "run", "run", "run", "run", "runInParallel", "runperf", "runTest", "runTestClass", "runTestMethod", "runtests", "runTestSuite", "samplefun", "sampleSummary", "satisfiedBy", "satisfiedBy", "save", "save", "save", "saveas", "savefig", "saveobj", "saveObjectImpl", "savepath", "scale", "scatter", "scatter3", "scatteredInterpolant", "scatterhistogram", "schur", "scroll", "sec", "secd", "sech", "second", "seconds", "seek", "selectFailed", "selectIf", "selectIncomplete", "selectLogged", "selectmoveresize", "selectPassed", "semilogx", "semilogy", "send", "sendmail", "serial", "serialbreak", "seriallist", "set", "set", "set", "set", "set", "set", "set", "set", "set", "set", "set", "setabstime", "setabstime", "setappdata", "setBscale", "setcats", "setCompressionType", "setdatatype", "setdiff", "setdisp", "setenv", "setfield", "setHCompScale", "setHCompSmooth", "setinterpmethod", "setParameter", "setParameter", "setParameter", "setpixelposition", "setpref", "setProperties", "setstr", "setTileDim", "settimeseriesnames", "Setting", "settings", "SettingsGroup", "setToValue", "setTscale", "setuniformtime", "setup", "setupImpl", "setupSharedTestFixture", "setupTestClass", "setupTestMethod", "setvaropts", "setvartype", "setxor", "sgtitle", "shading", "sheetnames", "shg", "shiftdim", "shortestpath", "shortestpathtree", "show", "show", "show", "show", "showFiSettingsImpl", "showplottool", "showSimulateUsingImpl", "shrinkfaces", "shuffle", "shuffle", "sign", "simplify", "simplify", "sin", "sind", "single", "sinh", "sinpi", "size", "size", "size", "size", "size", "size", "size", "slice", "smooth3", "smoothdata", "snapnow", "sort", "sortboundaries", "sortByFixtures", "sortregions", "sortrows", "sortx", "sorty", "sound", "soundsc", "spalloc", "sparse", "spaugment", "spconvert", "spdiags", "specular", "speye", "spfun", "sph2cart", "sphere", "spinmap", "spline", "split", "split", "splitapply", "splitEachLabel", "splitlines", "splitvars", "spones", "spparms", "sprand", "sprandn", "sprandsym", "sprank", "spreadsheetDatastore", "spreadsheetImportOptions", "spring", "sprintf", "spy", "sqrt", "sqrtm", "squeeze", "ss2tf", "sscanf", "stack", "stackedplot", "stairs", "standardizeMissing", "start", "start", "start", "start", "start", "start", "start", "start", "start", "start", "start", "start", "startat", "startMeasuring", "startsWith", "startup", "stats", "std", "std", "stem", "stem3", "step", "stepImpl", "stlread", "stlwrite", "stop", "stop", "stopasync", "stopMeasuring", "storeValueWhen", "str2double", "str2func", "str2mat", "str2num", "strcat", "strcmp", "strcmpi", "stream2", "stream3", "streamline", "streamparticles", "streamribbon", "streamslice", "streamtube", "strfind", "string", "string", "string", "string", "string", "string", "strings", "strip", "strjoin", "strjust", "strlength", "strmatch", "strncmp", "strncmpi", "strread", "strrep", "strsplit", "strtok", "strtrim", "struct", "struct2cell", "struct2table", "structfun", "strvcat", "sub2ind", "subgraph", "subplot", "subsasgn", "subset", "subsindex", "subspace", "subsref", "substruct", "subtract", "subvolume", "successors", "sum", "sum", "summary", "summary", "summer", "superclasses", "support", "supportPackageInstaller", "supports", "supportsMultipleInstanceImpl", "surf", "surf2patch", "surface", "surfaceArea", "surfc", "surfl", "surfnorm", "svd", "svds", "swapbytes", "sylvester", "symamd", "symbfact", "symmlq", "symrcm", "symvar", "synchronize", "synchronize", "syntax", "system", "table", "table2array", "table2cell", "table2struct", "table2timetable", "tabularTextDatastore", "tail", "tall", "TallDatastore", "tallrng", "tan", "tand", "tanh", "tar", "tcpclient", "teardown", "teardownSharedTestFixture", "teardownTestClass", "teardownTestMethod", "tempdir", "tempname", "testsuite", "tetramesh", "texlabel", "text", "textread", "textscan", "textwrap", "tfqmr", "then", "then", "then", "then", "then", "thetalim", "thetatickformat", "thetaticklabels", "thetaticks", "thingSpeakRead", "thingSpeakWrite", "throw", "throwAsCaller", "throwExceptionWhen", "tic", "Tiff", "Tiff.computeStrip", "Tiff.computeTile", "Tiff.currentDirectory", "Tiff.getTag", "Tiff.getTagNames", "Tiff.getVersion", "Tiff.isTiled", "Tiff.lastDirectory", "Tiff.nextDirectory", "Tiff.numberOfStrips", "Tiff.numberOfTiles", "Tiff.readEncodedStrip", "Tiff.readEncodedTile", "Tiff.readRGBAImage", "Tiff.readRGBAStrip", "Tiff.readRGBATile", "Tiff.rewriteDirectory", "Tiff.setDirectory", "Tiff.setSubDirectory", "Tiff.setTag", "Tiff.writeDirectory", "Tiff.writeEncodedStrip", "Tiff.writeEncodedTile", "time", "timeit", "timeofday", "timer", "timerange", "timerfind", "timerfindall", "times", "timeseries", "timetable", "timetable2table", "timezones", "title", "toc", "todatenum", "toeplitz", "toolboxdir", "topkrows", "toposort", "trace", "transclosure", "transform", "TransformedDatastore", "translate", "transpose", "transreduction", "trapz", "treelayout", "treeplot", "triangulation", "triangulation", "tril", "trimesh", "triplequad", "triplot", "TriRep", "TriRep", "TriScatteredInterp", "TriScatteredInterp", "trisurf", "triu", "true", "tscollection", "tsdata.event", "tsearchn", "turningdist", "type", "type", "typecast", "tzoffset", "uialert", "uiaxes", "uibutton", "uibuttongroup", "uicheckbox", "uiconfirm", "uicontextmenu", "uicontrol", "uidatepicker", "uidropdown", "uieditfield", "uifigure", "uigauge", "uigetdir", "uigetfile", "uigetpref", "uigridlayout", "uiimage", "uiimport", "uiknob", "uilabel", "uilamp", "uilistbox", "uimenu", "uint16", "uint32", "uint64", "uint8", "uiopen", "uipanel", "uiprogressdlg", "uipushtool", "uiputfile", "uiradiobutton", "uiresume", "uisave", "uisetcolor", "uisetfont", "uisetpref", "uislider", "uispinner", "uistack", "uiswitch", "uitab", "uitabgroup", "uitable", "uitextarea", "uitogglebutton", "uitoggletool", "uitoolbar", "uitree", "uitreenode", "uiwait", "uminus", "underlyingValue", "undocheckout", "unicode2native", "union", "union", "unique", "uniquetol", "unix", "unloadlibrary", "unmesh", "unmkpp", "unregisterallevents", "unregisterevent", "unstack", "untar", "unwrap", "unzip", "updateDependencies", "updateImpl", "upgradePreviouslyInstalledSupportPackages", "uplus", "upper", "urlread", "urlwrite", "usejava", "userpath", "validate", "validate", "validate", "validate", "validateattributes", "validateFunctionSignaturesJSON", "validateInputsImpl", "validatePropertiesImpl", "validatestring", "ValueIterator", "values", "vander", "var", "var", "varargin", "varargout", "varfun", "vartype", "vecnorm", "vectorize", "ver", "verctrl", "verifyAccessed", "verifyCalled", "verifyClass", "verifyEmpty", "verifyEqual", "verifyError", "verifyFail", "verifyFalse", "verifyGreaterThan", "verifyGreaterThanOrEqual", "verifyInstanceOf", "verifyLength", "verifyLessThan", "verifyLessThanOrEqual", "verifyMatches", "verifyNotAccessed", "verifyNotCalled", "verifyNotEmpty", "verifyNotEqual", "verifyNotSameHandle", "verifyNotSet", "verifyNumElements", "verifyReturnsTrue", "verifySameHandle", "verifySet", "verifySize", "verifySubstring", "verifyThat", "verifyTrue", "verifyUsing", "verifyWarning", "verifyWarningFree", "verLessThan", "version", "vertcat", "vertcat", "vertcat", "vertexAttachments", "vertexAttachments", "vertexNormal", "VideoReader", "VideoWriter", "view", "viewmtx", "visdiff", "volume", "volumebounds", "voronoi", "voronoiDiagram", "voronoiDiagram", "voronoin", "wait", "waitbar", "waitfor", "waitforbuttonpress", "warndlg", "warning", "waterfall", "web", "weboptions", "webread", "websave", "webwrite", "week", "weekday", "what", "whatsnew", "when", "when", "when", "which", "while", "whitebg", "who", "who", "whos", "whos", "width", "wilkinson", "winopen", "winqueryreg", "winter", "withAnyInputs", "withExactInputs", "withNargout", "withtol", "wordcloud", "write", "write", "write", "writecell", "writeChecksum", "writeCol", "writeComment", "writeDate", "writeHistory", "writeImg", "writeKey", "writeKeyUnit", "writematrix", "writetable", "writetimetable", "writeVideo", "xcorr", "xcov", "xlabel", "xlim", "xline", "xlsfinfo", "xlsread", "xlswrite", "xmlread", "xmlwrite", "xor", "xor", "xslt", "xtickangle", "xtickformat", "xticklabels", "xticks", "year", "years", "ylabel", "ylim", "yline", "ymd", "ytickangle", "ytickformat", "yticklabels", "yticks", "yyaxis", "yyyymmdd", "zeros", "zip", "zlabel", "zlim", "zoom", "zoomInteraction", "ztickangle", "ztickformat", "zticklabels", "zticks"] + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/minizinc.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/minizinc.rb new file mode 100644 index 000000000000..937a140a0001 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/minizinc.rb @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# Based on Chroma's MiniZinc lexer: +# https://github.com/alecthomas/chroma/blob/5152194c717b394686d3d7a7e1946a360ec0728f/lexers/m/minizinc.go + +module Rouge + module Lexers + class MiniZinc < RegexLexer + title "MiniZinc" + desc "MiniZinc is a free and open-source constraint modeling language (minizinc.org)" + tag 'minizinc' + filenames '*.mzn', '*.fzn', '*.dzn' + mimetypes 'text/minizinc' + + def self.builtins + @builtins = Set.new %w[ + abort abs acosh array_intersect array_union array1d array2d array3d + array4d array5d array6d asin assert atan bool2int card ceil concat + cos cosh dom dom_array dom_size fix exp floor index_set + index_set_1of2 index_set_2of2 index_set_1of3 index_set_2of3 + index_set_3of3 int2float is_fixed join lb lb_array length ln log log2 + log10 min max pow product round set2array show show_int show_float + sin sinh sqrt sum tan tanh trace ub ub_array + ] + end + + def self.keywords + @keywords = Set.new %w[ + ann annotation any constraint else endif function for forall if + include list of op output minimize maximize par predicate record + satisfy solve test then type var where + ] + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + array set bool enum float int string tuple + ) + end + + def self.operators + @operators ||= Set.new %w( + in subset superset union diff symdiff intersect + ) + end + + id = /[$a-zA-Z_]\w*/ + + state :root do + rule %r(\s+)m, Text::Whitespace + rule %r(\\\n)m, Text::Whitespace + rule %r(%.*), Comment::Single + rule %r(/(\\\n)?[*](.|\n)*?[*](\\\n)?/)m, Comment::Multiline + rule %r/"(\\\\|\\"|[^"])*"/, Literal::String + + rule %r(not|<->|->|<-|\\/|xor|/\\), Operator + rule %r(<|>|<=|>=|==|=|!=), Operator + rule %r(\+|-|\*|/|div|mod), Operator + rule %r(\\|\.\.|\+\+), Operator + rule %r([|()\[\]{},:;]), Punctuation + rule %r((true|false)\b), Keyword::Constant + rule %r(([+-]?)\d+(\.(?!\.)\d*)?([eE][-+]?\d+)?), Literal::Number + + rule id do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.keywords_type.include? m[0] + token Keyword::Type + elsif self.class.builtins.include? m[0] + token Name::Builtin + elsif self.class.operators.include? m[0] + token Operator + else + token Name::Other + end + end + + rule %r(::\s*([^\W\d]\w*)(\s*\([^\)]*\))?), Name::Decorator + rule %r(\b([^\W\d]\w*)\b(\()) do + groups Name::Function, Punctuation + end + rule %r([^\W\d]\w*), Name::Other + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/moonscript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/moonscript.rb new file mode 100644 index 000000000000..055422b640c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/moonscript.rb @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'lua.rb' + + class Moonscript < RegexLexer + title "MoonScript" + desc "Moonscript (http://www.moonscript.org)" + tag 'moonscript' + aliases 'moon' + filenames '*.moon' + mimetypes 'text/x-moonscript', 'application/x-moonscript' + + option :function_highlighting, 'Whether to highlight builtin functions (default: true)' + option :disabled_modules, 'builtin modules to disable' + + def initialize(*) + super + + @function_highlighting = bool_option(:function_highlighting) { true } + @disabled_modules = list_option(:disabled_modules) + end + + def self.detect?(text) + return true if text.shebang? 'moon' + end + + def builtins + return [] unless @function_highlighting + + @builtins ||= Set.new.tap do |builtins| + Rouge::Lexers::Lua.builtins.each do |mod, fns| + next if @disabled_modules.include? mod + builtins.merge(fns) + end + end + end + + state :root do + rule %r(#!(.*?)$), Comment::Preproc # shebang + rule %r//, Text, :main + end + + state :base do + ident = '(?:\w\w*)' + + rule %r((?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?'), Num::Float + rule %r((?i)\d+e[+-]?\d+), Num::Float + rule %r((?i)0x[0-9a-f]*), Num::Hex + rule %r(\d+), Num::Integer + rule %r(@#{ident}*), Name::Variable::Instance + rule %r([A-Z]\w*), Name::Class + rule %r("?[^"]+":), Literal::String::Symbol + rule %r(#{ident}:), Literal::String::Symbol + rule %r(:#{ident}), Literal::String::Symbol + + rule %r(\s+), Text::Whitespace + rule %r((==|~=|!=|<=|>=|\.\.\.|\.\.|->|=>|[=+\-*/%^<>#!\\])), Operator + rule %r([\[\]\{\}\(\)\.,:;]), Punctuation + rule %r((and|or|not)\b), Operator::Word + + keywords = %w{ + break class continue do else elseif end extends for if import in + repeat return switch super then unless until using when with while + } + rule %r((#{keywords.join('|')})\b), Keyword + rule %r((local|export)\b), Keyword::Declaration + rule %r((true|false|nil)\b), Keyword::Constant + + rule %r([A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?) do |m| + name = m[0] + if self.builtins.include?(name) + token Name::Builtin + elsif name =~ /\./ + a, b = name.split('.', 2) + token Name, a + token Punctuation, '.' + token Name, b + else + token Name + end + end + end + + state :main do + rule %r(--.*$), Comment::Single + rule %r(\[(=*)\[.*?\]\1\])m, Str::Heredoc + + mixin :base + + rule %r('), Str::Single, :sqs + rule %r("), Str::Double, :dqs + end + + state :sqs do + rule %r('), Str::Single, :pop! + rule %r([^']+), Str::Single + end + + state :interpolation do + rule %r(\}), Str::Interpol, :pop! + mixin :base + end + + state :dqs do + rule %r(#\{), Str::Interpol, :interpolation + rule %r("), Str::Double, :pop! + rule %r(#[^{]), Str::Double + rule %r([^"#]+), Str::Double + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mosel.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mosel.rb new file mode 100644 index 000000000000..8ad0c516f85b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mosel.rb @@ -0,0 +1,232 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Mosel < RegexLexer + tag 'mosel' + filenames '*.mos' + title "Mosel" + desc "An optimization language used by Fico's Xpress." + # http://www.fico.com/en/products/fico-xpress-optimization-suite + filenames '*.mos' + + mimetypes 'text/x-mosel' + + def self.detect?(text) + return true if text =~ /^\s*(model|package)\s+/ + end + + id = /[a-zA-Z_][a-zA-Z0-9_]*/ + + ############################################################################################################################ + # General language lements + ############################################################################################################################ + + core_keywords = %w( + and array as + boolean break + case count counter + declarations div do dynamic + elif else end evaluation exit + false forall forward from function + if imports in include initialisations initializations integer inter is_binary is_continuous is_free is_integer is_partint is_semcont is_semint is_sos1 is_sos2 + linctr list + max min mod model mpvar + next not of options or + package parameters procedure + public prod range real record repeat requirements + set string sum + then to true + union until uses + version + while with + ) + + core_functions = %w( + abs arctan assert + bitflip bitneg bitset bitshift bittest bitval + ceil cos create currentdate currenttime cuthead cuttail + delcell exists exit exp exportprob + fclose fflush finalize findfirst findlast floor fopen fselect fskipline + getact getcoeff getcoeffs getdual getfid getfirst gethead getfname getlast getobjval getparam getrcost getreadcnt getreverse getsize getslack getsol gettail gettype getvars + iseof ishidden isodd ln log + makesos1 makesos2 maxlist minlist + publish + random read readln reset reverse round + setcoeff sethidden setioerr setname setparam setrandseed settype sin splithead splittail sqrt strfmt substr + timestamp + unpublish + write writeln + ) + + ############################################################################################################################ + # mmxprs module elements + ############################################################################################################################ + + mmxprs_functions = %w( + addmipsol + basisstability + calcsolinfo clearmipdir clearmodcut command copysoltoinit + defdelayedrows defsecurevecs + estimatemarginals + fixglobal + getbstat getdualray getiis getiissense getiistype getinfcause getinfeas getlb getloadedlinctrs getloadedmpvars getname getprimalray getprobstat getrange getsensrng getsize getsol getub getvars + implies indicator isiisvalid isintegral loadbasis + loadmipsol loadprob + maximize minimize + postsolve + readbasis readdirs readsol refinemipsol rejectintsol repairinfeas resetbasis resetiis resetsol + savebasis savemipsol savesol savestate selectsol setbstat setcallback setcbcutoff setgndata setlb setmipdir setmodcut setsol setub setucbdata stopoptimize + unloadprob + writebasis writedirs writeprob writesol + xor + ) + + mmxpres_constants = %w(XPRS_OPT XPRS_UNF XPRS_INF XPRS_UNB XPRS_OTH) + + mmxprs_parameters = %w(XPRS_colorder XPRS_enumduplpol XPRS_enummaxsol XPRS_enumsols XPRS_fullversion XPRS_loadnames XPRS_problem XPRS_probname XPRS_verbose) + + + ############################################################################################################################ + # mmsystem module elements + ############################################################################################################################ + + mmsystem_functions = %w( + addmonths + copytext cuttext + deltext + endswith expandpath + fcopy fdelete findfiles findtext fmove + getasnumber getchar getcwd getdate getday getdaynum getdays getdirsep + getendparse setendparse + getenv getfsize getfstat getftime gethour getminute getmonth getmsec getpathsep + getqtype setqtype + getsecond + getsepchar setsepchar + getsize + getstart setstart + getsucc setsucc + getsysinfo getsysstat gettime + gettmpdir + gettrim settrim + getweekday getyear + inserttext isvalid + makedir makepath newtar + newzip nextfield + openpipe + parseextn parseint parsereal parsetext pastetext pathmatch pathsplit + qsort quote + readtextline regmatch regreplace removedir removefiles + setchar setdate setday setenv sethour + setminute setmonth setmsec setsecond settime setyear sleep startswith system + tarlist textfmt tolower toupper trim + untar unzip + ziplist + ) + + mmsystem_parameters = %w(datefmt datetimefmt monthnames sys_endparse sys_fillchar sys_pid sys_qtype sys_regcache sys_sepchar) + + ############################################################################################################################ + # mmjobs module elements + ############################################################################################################################ + + mmjobs_instance_mgmt_functions = %w( + clearaliases connect + disconnect + findxsrvs + getaliases getbanner gethostalias + sethostalias + ) + + mmjobs_model_mgmt_functions = %w( + compile + detach + getannidents getannotations getexitcode getgid getid getnode getrmtid getstatus getuid + load + reset resetmodpar run + setcontrol setdefstream setmodpar setworkdir stop + unload + ) + + mmjobs_synchornization_functions = %w( + dropnextevent + getclass getfromgid getfromid getfromuid getnextevent getvalue + isqueueempty + nullevent + peeknextevent + send setgid setuid + wait waitfor + ) + + mmjobs_functions = mmjobs_instance_mgmt_functions + mmjobs_model_mgmt_functions + mmjobs_synchornization_functions + + mmjobs_parameters = %w(conntmpl defaultnode fsrvdelay fsrvnbiter fsrvport jobid keepalive nodenumber parentnumber) + + + state :whitespace do + # Spaces + rule %r/\s+/m, Text + # ! Comments + rule %r((!).*$\n?), Comment::Single + # (! Comments !) + rule %r(\(!.*?!\))m, Comment::Multiline + + end + + + # From Mosel documentation: + # Constant strings of characters must be quoted with single (') or double quote (") and may extend over several lines. Strings enclosed in double quotes may contain C-like escape sequences introduced by the 'backslash' + # character (\a \b \f \n \r \t \v \xxx with xxx being the character code as an octal number). + # Each sequence is replaced by the corresponding control character (e.g. \n is the `new line' command) or, if no control character exists, by the second character of the sequence itself (e.g. \\ is replaced by '\'). + # The escape sequences are not interpreted if they are contained in strings that are enclosed in single quotes. + + state :single_quotes do + rule %r/'/, Str::Single, :pop! + rule %r/[^']+/, Str::Single + end + + state :double_quotes do + rule %r/"/, Str::Double, :pop! + rule %r/(\\"|\\[0-7]{1,3}\D|\\[abfnrtv]|\\\\)/, Str::Escape + rule %r/[^"]/, Str::Double + end + + state :base do + + rule %r{"}, Str::Double, :double_quotes + rule %r{'}, Str::Single, :single_quotes + + rule %r{((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?}, Num + rule %r{[~!@#\$%\^&\*\(\)\+`\-={}\[\]:;<>\?,\.\/\|\\]}, Punctuation +# rule %r{'([^']|'')*'}, Str +# rule %r/"(\\\\|\\"|[^"])*"/, Str + + + + rule %r/(true|false)\b/i, Name::Builtin + rule %r/\b(#{core_keywords.join('|')})\b/i, Keyword + rule %r/\b(#{core_functions.join('|')})\b/, Name::Builtin + + + + rule %r/\b(#{mmxprs_functions.join('|')})\b/, Name::Function + rule %r/\b(#{mmxpres_constants.join('|')})\b/, Name::Constant + rule %r/\b(#{mmxprs_parameters.join('|')})\b/i, Name::Property + + rule %r/\b(#{mmsystem_functions.join('|')})\b/i, Name::Function + rule %r/\b(#{mmsystem_parameters.join('|')})\b/, Name::Property + + rule %r/\b(#{mmjobs_functions.join('|')})\b/i, Name::Function + rule %r/\b(#{mmjobs_parameters.join('|')})\b/, Name::Property + + rule id, Name + end + + state :root do + mixin :whitespace + mixin :base + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/msgtrans.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/msgtrans.rb new file mode 100644 index 000000000000..4f21ca11ba14 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/msgtrans.rb @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class MsgTrans < RegexLexer + title "MessageTrans" + desc "RISC OS message translator messages file" + tag 'msgtrans' + filenames 'Messages', 'Message[0-9]', 'Message[1-9][0-9]', 'Message[1-9][0-9][0-9]' + + state :root do + rule %r/^#[^\n]*/, Comment + rule %r/[^\t\n\r ,):?\/]+/, Name::Variable + rule %r/[\n\/?]/, Operator + rule %r/:/, Operator, :value + end + + state :value do + rule %r/\n/, Text, :pop! + rule %r/%[0-3%]/, Operator + rule %r/[^\n%]/, Literal::String + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mxml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mxml.rb new file mode 100644 index 000000000000..4a9145ac6720 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/mxml.rb @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class MXML < RegexLexer + title "MXML" + desc "MXML" + tag 'mxml' + filenames '*.mxml' + mimetypes 'application/xv+xml' + + state :root do + rule %r/[^<&]+/, Text + rule %r/&\S*?;/, Name::Entity + + rule %r/<!\[CDATA\[/m do + token Comment::Preproc + push :actionscript_content + end + + rule %r/<!--/, Comment, :comment + rule %r/<\?.*?\?>/, Comment::Preproc + rule %r/<![^>]*>/, Comment::Preproc + + rule %r(<\s*[\w:.-]+)m, Name::Tag, :tag # opening tags + rule %r(<\s*/\s*[\w:.-]+\s*>)m, Name::Tag # closing tags + end + + state :comment do + rule %r/[^-]+/m, Comment + rule %r/-->/, Comment, :pop! + rule %r/-/, Comment + end + + state :tag do + rule %r/\s+/m, Text + rule %r/[\w.:-]+\s*=/m, Name::Attribute, :attribute + rule %r(/?\s*>), Name::Tag, :root + end + + state :attribute do + rule %r/\s+/m, Text + rule %r/(")({|@{)/m do + groups Str, Punctuation + push :actionscript_attribute + end + rule %r/".*?"|'.*?'|[^\s>]+/, Str, :tag + end + + state :actionscript_content do + rule %r/\]\]\>/m, Comment::Preproc, :pop! + rule %r/.*?(?=\]\]\>)/m do + delegate Actionscript + end + end + + state :actionscript_attribute do + rule %r/(})(")/m do + groups Punctuation, Str + push :tag + end + rule %r/.*?(?=}")/m do + delegate Actionscript + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nasm.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nasm.rb new file mode 100644 index 000000000000..cbf491ec9b4b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nasm.rb @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# Based on Chroma's NASM lexer implementation +# https://github.com/alecthomas/chroma/blob/498eaa690f5ac6ab0e3d6f46237e547a8935cdc7/lexers/n/nasm.go +module Rouge + module Lexers + class Nasm < RegexLexer + title "Nasm" + desc "Netwide Assembler" + + tag 'nasm' + filenames '*.asm' + mimetypes 'text/x-nasm' + + state :root do + rule %r/^\s*%/, Comment::Preproc, :preproc + + mixin :whitespace + + rule %r/[a-z$._?][\w$.?#@~]*:/i, Name::Label + + rule %r/([a-z$._?][\w$.?#@~]*)(\s+)(equ)/i do + groups Name::Constant, Keyword::Declaration, Keyword::Declaration + push :instruction_args + end + rule %r/BITS|USE16|USE32|SECTION|SEGMENT|ABSOLUTE|EXTERN|GLOBAL|ORG|ALIGN|STRUC|ENDSTRUC|COMMON|CPU|GROUP|UPPERCASE|IMPORT|EXPORT|LIBRARY|MODULE/, Keyword, :instruction_args + rule %r/(?:res|d)[bwdqt]|times/i, Keyword::Declaration, :instruction_args + rule %r/[a-z$._?][\w$.?#@~]*/i, Name::Function, :instruction_args + + rule %r/[\r\n]+/, Text + end + + state :instruction_args do + rule %r/"(\\\\"|[^"\\n])*"|'(\\\\'|[^'\\n])*'|`(\\\\`|[^`\\n])*`/, Str + rule %r/(?:0x[\da-f]+|$0[\da-f]*|\d+[\da-f]*h)/i, Num::Hex + rule %r/[0-7]+q/i, Num::Oct + rule %r/[01]+b/i, Num::Bin + rule %r/\d+\.e?\d+/i, Num::Float + rule %r/\d+/, Num::Integer + + mixin :punctuation + + rule %r/r\d[0-5]?[bwd]|[a-d][lh]|[er]?[a-d]x|[er]?[sb]p|[er]?[sd]i|[c-gs]s|st[0-7]|mm[0-7]|cr[0-4]|dr[0-367]|tr[3-7]/i, Name::Builtin + rule %r/[a-z$._?][\w$.?#@~]*/i, Name::Variable + rule %r/[\r\n]+/, Text, :pop! + + mixin :whitespace + end + + state :preproc do + rule %r/[^;\n]+/, Comment::Preproc + rule %r/;.*?\n/, Comment::Single, :pop! + rule %r/\n/, Comment::Preproc, :pop! + end + + state :whitespace do + rule %r/\n/, Text + rule %r/[ \t]+/, Text + rule %r/;.*/, Comment::Single + end + + state :punctuation do + rule %r/[,():\[\]]+/, Punctuation + rule %r/[&|^<>+*\/%~-]+/, Operator + rule %r/\$+/, Keyword::Constant + rule %r/seg|wrt|strict/i, Operator::Word + rule %r/byte|[dq]?word/i, Keyword::Type + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nesasm.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nesasm.rb new file mode 100644 index 000000000000..a296414e0413 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nesasm.rb @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class NesAsm < RegexLexer + title "NesAsm" + desc "Nesasm3 assembly (6502 asm)" + tag 'nesasm' + aliases 'nes' + filenames '*.nesasm' + + def self.keywords + @keywords ||= %w( + ADC AND ASL BIT BRK CMP CPX CPY DEC EOR INC JMP JSR LDA LDX LDY LSR + NOP ORA ROL ROR RTI RTS SBC STA STX STY TAX TXA DEX INX TAY TYA DEY + INY BPL BMI BVC BVS BCC BCS BNE BEQ CLC SEC CLI SEI CLV CLD SED TXS + TSX PHA PLA PHP PLP + ) + end + + def self.keywords_type + @keywords_type ||= %w( + DB DW BYTE WORD + ) + end + + def self.keywords_reserved + @keywords_reserved ||= %w( + INCBIN INCLUDE ORG BANK RSSET RS MACRO ENDM DS PROC ENDP PROCGROUP + ENDPROCGROUP INCCHR DEFCHR ZP BSS CODE DATA IF IFDEF IFNDEF ELSE + ENDIF FAIL INESPRG INESCHR INESMAP INESMIR FUNC + ) + end + + state :root do + rule %r/\s+/m, Text + rule %r(;.*), Comment::Single + + rule %r/[\(\)\,\.\[\]]/, Punctuation + rule %r/\#?\%[0-1]+/, Num::Bin # #%00110011 %00110011 + rule %r/\#?\$\h+/, Num::Hex # $1f #$1f + rule %r/\#?\d+/, Num # 10 #10 + rule %r([~&*+=\|?:<>/-]), Operator + + rule %r/\#?\w+:?/i do |m| + name = m[0].upcase + + if self.class.keywords.include? name + token Keyword + elsif self.class.keywords_type.include? name + token Keyword::Type + elsif self.class.keywords_reserved.include? name + token Keyword::Reserved + else + token Name::Function + end + end + + rule %r/\#?(?:LOW|HIGH)\(.*\)/i, Keyword::Reserved # LOW() #HIGH() + + rule %r/\#\(/, Punctuation # #() + + rule %r/"/, Str, :string + + rule %r/'\w'/, Str::Char # 'A' for example + + rule %r/\\\??[\d@#]/, Name::Builtin # builtin parameters for use inside macros and functions: \1-\9 , \?1-\?9 , \# , \@ + end + + state :string do + rule %r/"/, Str, :pop! + rule %r/\\"?/, Str::Escape + rule %r/[^"\\]+/m, Str + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nginx.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nginx.rb new file mode 100644 index 000000000000..f654762eafe5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nginx.rb @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Nginx < RegexLexer + title "nginx" + desc 'configuration files for the nginx web server (nginx.org)' + tag 'nginx' + mimetypes 'text/x-nginx-conf' + filenames 'nginx.conf' + + id = /[^\s$;{}()#]+/ + + state :root do + rule %r/(include)(\s+)([^\s;]+)/ do + groups Keyword, Text, Name + end + + rule id, Keyword, :statement + + mixin :base + end + + state :block do + rule %r/}/, Punctuation, :pop! + rule id, Keyword::Namespace, :statement + mixin :base + end + + state :statement do + rule %r/{/ do + token Punctuation; pop!; push :block + end + + rule %r/;/, Punctuation, :pop! + + mixin :base + end + + state :base do + rule %r/\s+/, Text + + rule %r/#.*/, Comment::Single + rule %r/(?:on|off)\b/, Name::Constant + rule %r/[$][\w-]+/, Name::Variable + + # host/port + rule %r/([a-z0-9.-]+)(:)([0-9]+)/i do + groups Name::Function, Punctuation, Num::Integer + end + + # mimetype + rule %r([a-z-]+/[a-z-]+)i, Name::Class + + rule %r/[0-9]+[kmg]?\b/i, Num::Integer + rule %r/(~)(\s*)([^\s{]+)/ do + groups Punctuation, Text, Str::Regex + end + + rule %r/[:=~]/, Punctuation + + # pathname + rule %r(/#{id}?), Name + + rule %r/[^#\s;{}$\\]+/, Str # catchall + + rule %r/[$;]/, Text + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nim.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nim.rb new file mode 100644 index 000000000000..958b5f0b1660 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nim.rb @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Nim < RegexLexer + # This is pretty much a 1-1 port of the pygments NimrodLexer class + title "Nim" + desc "The Nim programming language (http://nim-lang.org/)" + + tag 'nim' + aliases 'nimrod' + filenames '*.nim' + + KEYWORDS = %w( + addr as asm atomic bind block break case cast const continue + converter defer discard distinct do elif else end enum except export + func finally for from generic if import include interface iterator let + macro method mixin nil object of out proc ptr raise ref return static + template try tuple type using var when while with without yield + ) + + OPWORDS = %w( + and or not xor shl shr div mod in notin is isnot + ) + + PSEUDOKEYWORDS = %w( + nil true false + ) + + TYPES = %w( + int int8 int16 int32 int64 float float32 float64 bool char range array + seq set string + ) + + NAMESPACE = %w( + from import include + ) + + def self.underscorize(words) + words.map do |w| + w.gsub(/./) { |x| "#{Regexp.escape(x)}_?" } + end.join('|') + end + + state :chars do + rule(/\\([\\abcefnrtvl"\']|x[a-fA-F0-9]{2}|[0-9]{1,3})/, Str::Escape) + rule(/'/, Str::Char, :pop!) + rule(/./, Str::Char) + end + + state :strings do + rule(/(?<!\$)\$(\d+|#|\w+)+/, Str::Interpol) + rule(/[^\\\'"\$\n]+/, Str) + rule(/[\'"\\]/, Str) + rule(/\$/, Str) + end + + state :dqs do + rule(/\\([\\abcefnrtvl"\']|\n|x[a-fA-F0-9]{2}|[0-9]{1,3})/, + Str::Escape) + rule(/"/, Str, :pop!) + mixin :strings + end + + state :rdqs do + rule(/"(?!")/, Str, :pop!) + rule(/"/, Str::Escape, :pop!) + mixin :strings + end + + state :tdqs do + rule(/"""(?!")/, Str, :pop!) + mixin :strings + mixin :nl + end + + state :funcname do + rule(/((?![\d_])\w)(((?!_)\w)|(_(?!_)\w))*/, Name::Function, :pop!) + rule(/`.+`/, Name::Function, :pop!) + end + + state :nl do + rule(/\n/, Str) + end + + state :floatnumber do + rule(/\.(?!\.)[0-9_]*/, Num::Float) + rule(/[eE][+-]?[0-9][0-9_]*/, Num::Float) + rule(//, Text, :pop!) + end + + # Making apostrophes optional, as only hexadecimal with type suffix + # possibly ambiguous. + state :floatsuffix do + rule(/'?[fF](32|64)/, Num::Float) + rule(//, Text, :pop!) + end + + state :intsuffix do + rule(/'?[iI](32|64)/, Num::Integer::Long) + rule(/'?[iI](8|16)/, Num::Integer) + rule(/'?[uU]/, Num::Integer) + rule(//, Text, :pop!) + end + + state :root do + rule(/##.*$/, Str::Doc) + rule(/#.*$/, Comment) + rule(/\*|=|>|<|\+|-|\/|@|\$|~|&|%|\!|\?|\||\\|\[|\]/, Operator) + rule(/\.\.|\.|,|\[\.|\.\]|{\.|\.}|\(\.|\.\)|{|}|\(|\)|:|\^|`|;/, + Punctuation) + + # Strings + rule(/(?:\w+)"/,Str, :rdqs) + rule(/"""/, Str, :tdqs) + rule(/"/, Str, :dqs) + + # Char + rule(/'/, Str::Char, :chars) + + # Keywords + rule(%r[(#{Nim.underscorize(OPWORDS)})\b], Operator::Word) + rule(/(p_?r_?o_?c_?\s)(?![\(\[\]])/, Keyword, :funcname) + rule(%r[(#{Nim.underscorize(KEYWORDS)})\b], Keyword) + rule(%r[(#{Nim.underscorize(NAMESPACE)})\b], Keyword::Namespace) + rule(/(v_?a_?r)\b/, Keyword::Declaration) + rule(%r[(#{Nim.underscorize(TYPES)})\b], Keyword::Type) + rule(%r[(#{Nim.underscorize(PSEUDOKEYWORDS)})\b], Keyword::Pseudo) + # Identifiers + rule(/\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*/, Name) + + # Numbers + # Note: Have to do this with a block to push multiple states first, + # since we can't pass array of states like w/ Pygments. + rule(/[0-9][0-9_]*(?=([eE.]|'?[fF](32|64)))/) do + push :floatsuffix + push :floatnumber + token Num::Float + end + + rule(/0[xX][a-fA-F0-9][a-fA-F0-9_]*/, Num::Hex, :intsuffix) + rule(/0[bB][01][01_]*/, Num, :intsuffix) + rule(/0o[0-7][0-7_]*/, Num::Oct, :intsuffix) + rule(/[0-9][0-9_]*/, Num::Integer, :intsuffix) + + # Whitespace + rule(/\s+/, Text) + rule(/.+$/, Error) + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nix.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nix.rb new file mode 100644 index 000000000000..7cc9a3a39479 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/nix.rb @@ -0,0 +1,211 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Nix < RegexLexer + title 'Nix' + desc 'The Nix expression language (https://nixos.org/nix/manual/#ch-expression-language)' + tag 'nix' + aliases 'nixos' + filenames '*.nix' + + state :whitespaces do + rule %r/^\s*\n\s*$/m, Text + rule %r/\s+/, Text + end + + state :comment do + rule %r/#.*$/, Comment + rule %r(/\*), Comment, :multiline_comment + end + + state :multiline_comment do + rule %r(\*/), Comment, :pop! + rule %r/./, Comment + end + + state :number do + rule %r/[0-9]/, Num::Integer + end + + state :null do + rule %r/(null)/, Keyword::Constant + end + + state :boolean do + rule %r/(true|false)/, Keyword::Constant + end + + state :binding do + rule %r/[a-zA-Z_][a-zA-Z0-9-]*/, Name::Variable + end + + state :path do + word = "[a-zA-Z0-9\._-]+" + section = "(\/#{word})" + prefix = "[a-z\+]+:\/\/" + root = /#{section}+/.source + tilde = /~#{section}+/.source + basic = /#{word}(\/#{word})+/.source + url = /#{prefix}(\/?#{basic})/.source + rule %r/(#{root}|#{tilde}|#{basic}|#{url})/, Str::Other + end + + state :string do + rule %r/"/, Str::Double, :double_quoted_string + rule %r/''/, Str::Double, :indented_string + end + + state :string_content do + rule %r/\\./, Str::Escape + rule %r/\$\$/, Str::Escape + rule %r/\${/, Str::Interpol, :string_interpolated_arg + end + + state :indented_string_content do + rule %r/'''/, Str::Escape + rule %r/''\$/, Str::Escape + rule %r/\$\$/, Str::Escape + rule %r/''\\./, Str::Escape + rule %r/\${/, Str::Interpol, :string_interpolated_arg + end + + state :string_interpolated_arg do + mixin :expression + rule %r/}/, Str::Interpol, :pop! + end + + state :indented_string do + mixin :indented_string_content + rule %r/''/, Str::Double, :pop! + rule %r/./, Str::Double + end + + state :double_quoted_string do + mixin :string_content + rule %r/"/, Str::Double, :pop! + rule %r/./, Str::Double + end + + state :operator do + rule %r/(\.|\?|\+\+|\+|!=|!|\/\/|\=\=|&&|\|\||->|\/|\*|-|<|>|<=|=>)/, Operator + end + + state :assignment do + rule %r/(=)/, Operator + rule %r/(@)/, Operator + end + + state :accessor do + rule %r/(\$)/, Punctuation + end + + state :delimiter do + rule %r/(;|,|:)/, Punctuation + end + + state :atom_content do + mixin :expression + rule %r/\)/, Punctuation, :pop! + end + + state :atom do + rule %r/\(/, Punctuation, :atom_content + end + + state :list do + rule %r/\[/, Punctuation, :list_content + end + + state :list_content do + rule %r/\]/, Punctuation, :pop! + mixin :expression + end + + state :set do + rule %r/{/, Punctuation, :set_content + end + + state :set_content do + rule %r/}/, Punctuation, :pop! + mixin :expression + end + + state :expression do + mixin :ignore + mixin :comment + mixin :boolean + mixin :null + mixin :number + mixin :path + mixin :string + mixin :keywords + mixin :operator + mixin :accessor + mixin :assignment + mixin :delimiter + mixin :binding + mixin :atom + mixin :set + mixin :list + end + + state :keywords do + mixin :keywords_namespace + mixin :keywords_declaration + mixin :keywords_conditional + mixin :keywords_reserved + mixin :keywords_builtin + end + + state :keywords_namespace do + keywords = %w(with in inherit) + rule %r/(?:#{keywords.join('|')})\b/, Keyword::Namespace + end + + state :keywords_declaration do + keywords = %w(let) + rule %r/(?:#{keywords.join('|')})\b/, Keyword::Declaration + end + + state :keywords_conditional do + keywords = %w(if then else) + rule %r/(?:#{keywords.join('|')})\b/, Keyword + end + + state :keywords_reserved do + keywords = %w(rec assert map) + rule %r/(?:#{keywords.join('|')})\b/, Keyword::Reserved + end + + state :keywords_builtin do + keywords = %w( + abort + baseNameOf + builtins + derivation + fetchTarball + import + isNull + removeAttrs + throw + toString + ) + rule %r/(?:#{keywords.join('|')})\b/, Keyword::Reserved + end + + state :ignore do + mixin :whitespaces + end + + state :root do + mixin :ignore + mixin :expression + end + + start do + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/objective_c.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/objective_c.rb new file mode 100644 index 000000000000..36ab6c54423b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/objective_c.rb @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'c.rb' + load_lexer 'objective_c/common.rb' + + class ObjectiveC < C + extend ObjectiveCCommon + + tag 'objective_c' + title "Objective-C" + desc 'an extension of C commonly used to write Apple software' + aliases 'objc', 'obj-c', 'obj_c', 'objectivec' + filenames '*.m', '*.h' + + mimetypes 'text/x-objective_c', 'application/x-objective_c' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/objective_c/common.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/objective_c/common.rb new file mode 100644 index 000000000000..a0e69e7d5ea4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/objective_c/common.rb @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + module ObjectiveCCommon + id = /[a-z$_][a-z0-9$_]*/i + + def at_keywords + @at_keywords ||= %w( + selector private protected public encode synchronized try + throw catch finally end property synthesize dynamic optional + interface implementation import autoreleasepool + ) + end + + def at_builtins + @at_builtins ||= %w(true false YES NO) + end + + def builtins + @builtins ||= %w(YES NO nil) + end + + def self.extended(base) + base.prepend :statements do + rule %r/@"/, base::Str, :string + rule %r/@'(\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|\\.|[^\\'\n]')/, + base::Str::Char + rule %r/@(\d+[.]\d*|[.]\d+|\d+)e[+-]?\d+l?/i, + base::Num::Float + rule %r/@(\d+[.]\d*|[.]\d+|\d+f)f?/i, base::Num::Float + rule %r/@0x\h+[lL]?/, base::Num::Hex + rule %r/@0[0-7]+l?/i, base::Num::Oct + rule %r/@\d+l?/, base::Num::Integer + rule %r/\bin\b/, base::Keyword + + rule %r/@(?:interface|implementation)\b/, base::Keyword, :objc_classname + rule %r/@(?:class|protocol)\b/, base::Keyword, :forward_classname + + rule %r/@([[:alnum:]]+)/ do |m| + if base.at_keywords.include? m[1] + token base::Keyword + elsif base.at_builtins.include? m[1] + token base::Name::Builtin + else + token base::Error + end + end + + rule %r/[?]/, base::Punctuation, :ternary + rule %r/\[/, base::Punctuation, :message + rule %r/@\[/, base::Punctuation, :array_literal + rule %r/@\{/, base::Punctuation, :dictionary_literal + end + + id = /[a-z$_][a-z0-9$_]*/i + + base.state :ternary do + rule %r/:/, base::Punctuation, :pop! + mixin :statements + end + + base.state :message_shared do + rule %r/\]/, base::Punctuation, :pop! + rule %r/\{/, base::Punctuation, :pop! + rule %r/;/, base::Error + + mixin :statements + end + + base.state :message do + rule %r/(#{id})(\s*)(:)/ do + groups(base::Name::Function, base::Text, base::Punctuation) + goto :message_with_args + end + + rule %r/(#{id})(\s*)(\])/ do + groups(base::Name::Function, base::Text, base::Punctuation) + pop! + end + + mixin :message_shared + end + + base.state :message_with_args do + rule %r/\{/, base::Punctuation, :function + rule %r/(#{id})(\s*)(:)/ do + groups(base::Name::Function, base::Text, base::Punctuation) + pop! + end + + mixin :message_shared + end + + base.state :array_literal do + rule %r/]/, base::Punctuation, :pop! + rule %r/,/, base::Punctuation + mixin :statements + end + + base.state :dictionary_literal do + rule %r/}/, base::Punctuation, :pop! + rule %r/,/, base::Punctuation + mixin :statements + end + + base.state :objc_classname do + mixin :whitespace + + rule %r/(#{id})(\s*)(:)(\s*)(#{id})/ do + groups(base::Name::Class, base::Text, + base::Punctuation, base::Text, + base::Name::Class) + pop! + end + + rule %r/(#{id})(\s*)([(])(\s*)(#{id})(\s*)([)])/ do + groups(base::Name::Class, base::Text, + base::Punctuation, base::Text, + base::Name::Label, base::Text, + base::Punctuation) + pop! + end + + rule id, base::Name::Class, :pop! + end + + base.state :forward_classname do + mixin :whitespace + + rule %r/(#{id})(\s*)(,)(\s*)/ do + groups(base::Name::Class, base::Text, base::Punctuation, base::Text) + push + end + + rule %r/(#{id})(\s*)(;?)/ do + groups(base::Name::Class, base::Text, base::Punctuation) + pop! + end + end + + base.prepend :root do + rule %r( + ([-+])(\s*) + ([(].*?[)])?(\s*) + (?=#{id}:?) + )ix do |m| + token base::Keyword, m[1] + token base::Text, m[2] + recurse(m[3]) if m[3] + token base::Text, m[4] + push :method_definition + end + end + + base.state :method_definition do + rule %r/,/, base::Punctuation + rule %r/[.][.][.]/, base::Punctuation + rule %r/([(].*?[)])(#{id})/ do |m| + recurse m[1]; token base::Name::Variable, m[2] + end + + rule %r/(#{id})(\s*)(:)/m do + groups(base::Name::Function, base::Text, base::Punctuation) + end + + rule %r/;/, base::Punctuation, :pop! + + rule %r/{/ do + token base::Punctuation + goto :function + end + + mixin :inline_whitespace + rule %r(//.*?\n), base::Comment::Single + rule %r/\s+/m, base::Text + + rule(//) { pop! } + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/objective_cpp.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/objective_cpp.rb new file mode 100644 index 000000000000..21606922b308 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/objective_cpp.rb @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'cpp.rb' + load_lexer 'objective_c/common.rb' + + class ObjectiveCpp < Cpp + extend ObjectiveCCommon + + tag 'objective_cpp' + title "Objective-C++" + desc 'an extension of C++ uncommonly used to write Apple software' + aliases 'objcpp', 'obj-cpp', 'obj_cpp', 'objectivecpp', + 'objc++', 'obj-c++', 'obj_c++', 'objectivec++' + filenames '*.mm', '*.h' + + mimetypes 'text/x-objective-c++', 'application/x-objective-c++' + + prepend :statements do + rule %r/(\.)(class)/ do + groups(Operator, Name::Builtin::Pseudo) + end + rule %r/(@selector)(\()(class)(\))/ do + groups(Keyword, Punctuation, Name::Builtin::Pseudo, Punctuation) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ocaml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ocaml.rb new file mode 100644 index 000000000000..684b367229b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ocaml.rb @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'ocaml/common.rb' + + class OCaml < OCamlCommon + title "OCaml" + desc 'Objective Caml (ocaml.org)' + tag 'ocaml' + filenames '*.ml', '*.mli', '*.mll', '*.mly' + mimetypes 'text/x-ocaml' + + def self.keywords + @keywords ||= super + Set.new(%w( + match raise + )) + end + + state :root do + rule %r/\s+/m, Text + rule %r/false|true|[(][)]|\[\]/, Name::Builtin::Pseudo + rule %r/#{@@upper_id}(?=\s*[.])/, Name::Namespace, :dotted + rule %r/`#{@@id}/, Name::Tag + rule @@upper_id, Name::Class + rule %r/[(][*](?![)])/, Comment, :comment + rule @@id do |m| + match = m[0] + if self.class.keywords.include? match + token Keyword + elsif self.class.word_operators.include? match + token Operator::Word + elsif self.class.primitives.include? match + token Keyword::Type + else + token Name + end + end + + rule %r/[(){}\[\];]+/, Punctuation + rule @@operator, Operator + + rule %r/-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float + rule %r/0x\h[\h_]*/i, Num::Hex + rule %r/0o[0-7][0-7_]*/i, Num::Oct + rule %r/0b[01][01_]*/i, Num::Bin + rule %r/\d[\d_]*/, Num::Integer + + rule %r/'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char + rule %r/'[.]'/, Str::Char + rule %r/'/, Keyword + rule %r/"/, Str::Double, :string + rule %r/[~?]#{@@id}/, Name::Variable + end + + state :comment do + rule %r/[^(*)]+/, Comment + rule(/[(][*]/) { token Comment; push } + rule %r/[*][)]/, Comment, :pop! + rule %r/[(*)]/, Comment + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ocaml/common.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ocaml/common.rb new file mode 100644 index 000000000000..bd6f93d9ef0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ocaml/common.rb @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + # shared states with Reasonml and ReScript + class OCamlCommon < RegexLexer + def self.keywords + @keywords ||= Set.new %w( + as assert begin class constraint do done downto else end + exception external false for fun function functor if in + include inherit initializer lazy let module mutable new + nonrec object of open rec sig struct then to true try type + val virtual when while with + ) + end + + def self.word_operators + @word_operators ||= Set.new %w(and asr land lor lsl lxor mod or) + end + + def self.primitives + @primitives ||= Set.new %w(unit int float bool string char list array) + end + + @@operator = %r([;,_!$%&*+./:<=>?@^|~#-]+) + @@id = /[a-z_][\w']*/i + @@upper_id = /[A-Z][\w']*/ + + state :string do + rule %r/[^\\"]+/, Str::Double + mixin :escape_sequence + rule %r/\\\n/, Str::Double + rule %r/"/, Str::Double, :pop! + end + + state :escape_sequence do + rule %r/\\[\\"'ntbr]/, Str::Escape + rule %r/\\\d{3}/, Str::Escape + rule %r/\\x\h{2}/, Str::Escape + end + + state :dotted do + rule %r/\s+/m, Text + rule %r/[.]/, Punctuation + rule %r/#{@@upper_id}(?=\s*[.])/, Name::Namespace + rule @@upper_id, Name::Class, :pop! + rule @@id, Name, :pop! + rule %r/[({\[]/, Punctuation, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ocl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ocl.rb new file mode 100644 index 000000000000..ab27a115d66c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ocl.rb @@ -0,0 +1,85 @@ +module Rouge + module Lexers + class OCL < RegexLexer + title "OCL" + desc "OMG Object Constraint Language (omg.org/spec/OCL)" + tag 'ocl' + aliases 'OCL' + filenames '*.ocl' + mimetypes 'text/x-ocl' + + def self.keywords + @keywords ||= Set.new %w( + context pre post inv init body def derive if then else endif import + package endpackage let in + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + Boolean Integer UnlimitedNatural Real String OrderedSet Tuple Bag Set + Sequence OclInvalid OclVoid TupleType OclState Collection OclMessage + ) + end + + def self.builtins + @builtins ||= Set.new %w( + self null result true false invalid @pre + ) + end + + def self.operators + @operators ||= Set.new %w( + or xor and not implies + ) + end + + def self.functions + @functions ||= Set.new %w( + oclAsSet oclIsNew oclIsUndefined oclIsInvalid oclAsType oclIsTypeOf + oclIsKindOf oclInState oclType oclLocale hasReturned result + isSignalSent isOperationCallabs floor round max min toString div mod + size substring concat toInteger toReal toUpperCase toLowerCase + indexOf equalsIgnoreCase at characters toBoolean includes excludes + count includesAll excludesAll isEmpty notEmpty sum product + selectByKind selectByType asBag asSequence asOrderedSet asSet flatten + union intersection including excluding symmetricDifferencecount + append prepend insertAt subOrderedSet first last reverse subSequence + any closure collect collectNested exists forAll isUnique iterate one + reject select sortedBy allInstances average conformsTo + ) + end + + state :single_string do + rule %r/\\./, Str::Escape + rule %r/'/, Str::Single, :pop! + rule %r/[^\\']+/, Str::Single + end + + state :root do + rule %r/\s+/m, Text + rule %r/--.*/, Comment::Single + rule %r/\d+/, Num::Integer + rule %r/'/, Str::Single, :single_string + rule %r([->|+*/<>=~!@#%&|?^-]), Operator + rule %r/[;:()\[\],.]/, Punctuation + rule %r/\w[\w\d]*/ do |m| + if self.class.operators.include? m[0] + token Operator + elsif self.class.keywords_type.include? m[0] + token Keyword::Declaration + elsif self.class.keywords.include? m[0] + token Keyword + elsif self.class.builtins.include? m[0] + token Name::Builtin + elsif self.class.functions.include? m[0] + token Name::Function + else + token Name + end + end + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/openedge.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/openedge.rb new file mode 100644 index 000000000000..49a84a9105fd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/openedge.rb @@ -0,0 +1,429 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class OpenEdge < RegexLexer + tag 'openedge' + filenames '*.w', '*.i' + mimetypes 'text/x-openedge' + + title "OpenEdge ABL" + desc "The OpenEdge ABL programming language" + + # optional comment or whitespace + ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+) + id = /[a-zA-Z_&{}][a-zA-Z0-9_\-&}]*/ + + def self.keywords + @keywords ||= Set.new %w( + &ELSE &ELSEIF &ENDIF &GLOB &GLOBAL-DEFINE &IF &MESSAGE &SCOP + &SCOPED-DEFINE &THEN &UNDEF &UNDEFINE &WEBSTREAM @ {&BATCH} + {&BATCH-MODE} {&FILE-NAME} {&LINE-NUMBE} {&LINE-NUMBER} {&OPSYS} + {&PROCESS-ARCHITECTURE} {&SEQUENCE} {&WINDOW-SYS} {&WINDOW-SYSTEM} ABS + ABSOLUTE ABSTRACT ACCELERATOR ACCUM ACCUM ACCUMULATE ACTIVE-FORM + ACTIVE-WINDOW ADD ADD-BUFFER ADD-CALC-COLUMN ADD-COLUMNS-FROM + ADD-EVENTS-PROCEDURE ADD-FIELDS-FROM ADD-FIRST ADD-INDEX-FIELD + ADD-LAST ADD-LIKE-COLUMN ADD-LIKE-FIELD ADD-LIKE-INDEX ADD-NEW-FIELD + ADD-NEW-INDEX ADD-SCHEMA-LOCATION ADD-SUPER-PROCEDURE ADM-DATA ADVISE + ALERT-BOX ALIAS ALL ALLOW-COLUMN-SEARCHING ALLOW-REPLICATION ALTER + ALWAYS-ON-TOP AMBIG AMBIGUOUS ANALYZ ANALYZE AND ANSI-ONLY ANY + ANYWHERE APPEND APPL-ALERT APPL-ALERT-BOXES APPL-CONTEXT-ID + APPLICATION APPLY APPSERVER-INFO APPSERVER-PASSWORD APPSERVER-USERID + ARRAY-MESSAGE AS ASC ASCENDING ASK-OVERWRITE ASSEMBLY ASSIGN + ASYNCHRONOUS ASYNC-REQUEST-COUNT ASYNC-REQUEST-HANDLE AT + ATTACHED-PAIRLIST ATTR ATTR-SPACE AUDIT-CONTROL AUDIT-ENABLED + AUDIT-EVENT-CONTEXT AUDIT-POLICY AUTHENTICATION-FAILED AUTHORIZATION + AUTO-COMP AUTO-COMPLETION AUTO-ENDKEY AUTO-END-KEY AUTO-GO AUTO-IND + AUTO-INDENT AUTOMATIC AUTO-RESIZE AUTO-RET AUTO-RETURN + AUTO-SYNCHRONIZE AUTO-Z AUTO-ZAP AVAIL AVAILABLE AVAILABLE-FORMATS AVE + AVERAGE AVG BACK BACKGROUND BACKWARD BACKWARDS BASE64-DECODE + BASE64-ENCODE BASE-ADE BASE-KEY BATCH BATCH-MODE BATCH-SIZE BEFORE-H + BEFORE-HIDE BEGIN-EVENT-GROUP BEGINS BELL BETWEEN BGC BGCOLOR + BIG-ENDIAN BINARY BIND BIND-WHERE BLANK BLOCK-ITERATION-DISPLAY + BLOCK-LEV BLOCK-LEVEL BORDER-B BORDER-BOTTOM-CHARS BORDER-BOTTOM-P + BORDER-BOTTOM-PIXELS BORDER-L BORDER-LEFT-CHARS BORDER-LEFT-P + BORDER-LEFT-PIXELS BORDER-R BORDER-RIGHT-CHARS BORDER-RIGHT-P + BORDER-RIGHT-PIXELS BORDER-T BORDER-TOP-CHARS BORDER-TOP-P + BORDER-TOP-PIXELS BOX BOX-SELECT BOX-SELECTABLE BREAK BROWSE BUFFER + BUFFER-CHARS BUFFER-COMPARE BUFFER-COPY BUFFER-CREATE BUFFER-DELETE + BUFFER-FIELD BUFFER-HANDLE BUFFER-LINES BUFFER-NAME + BUFFER-PARTITION-ID BUFFER-RELEASE BUFFER-VALUE BUTTON BUTTON BUTTONS + BY BY-POINTER BY-VARIANT-POINTER CACHE CACHE-SIZE CALL CALL-NAME + CALL-TYPE CANCEL-BREAK CANCEL-BUTTON CAN-CREATE CAN-DELETE CAN-DO + CAN-DO-DOMAIN-SUPPORT CAN-FIND CAN-QUERY CAN-READ CAN-SET CAN-WRITE + CAPS CAREFUL-PAINT CASE CASE-SEN CASE-SENSITIVE CAST CATCH CDECL + CENTER CENTERED CHAINED CHARACTER_LENGTH CHARSET CHECK CHECKED CHOOSE + CHR CLASS CLASS-TYPE CLEAR CLEAR-APPL-CONTEXT CLEAR-LOG CLEAR-SELECT + CLEAR-SELECTION CLEAR-SORT-ARROW CLEAR-SORT-ARROWS + CLIENT-CONNECTION-ID CLIENT-PRINCIPAL CLIENT-TTY CLIENT-TYPE + CLIENT-WORKSTATION CLIPBOARD CLOSE CLOSE-LOG CODE CODEBASE-LOCATOR + CODEPAGE CODEPAGE-CONVERT COL COLLATE COL-OF COLON COLON-ALIGN + COLON-ALIGNED COLOR COLOR-TABLE COLUMN COLUMN-BGCOLOR COLUMN-DCOLOR + COLUMN-FGCOLOR COLUMN-FONT COLUMN-LAB COLUMN-LABEL COLUMN-MOVABLE + COLUMN-OF COLUMN-PFCOLOR COLUMN-READ-ONLY COLUMN-RESIZABLE COLUMNS + COLUMN-SCROLLING COMBO-BOX COM-HANDLE COMMAND COMPARES COMPILE + COMPILER COMPLETE COM-SELF CONFIG-NAME CONNECT CONNECTED CONSTRUCTOR + CONTAINS CONTENTS CONTEXT CONTEXT-HELP CONTEXT-HELP-FILE + CONTEXT-HELP-ID CONTEXT-POPUP CONTROL CONTROL-BOX CONTROL-FRAME + CONVERT CONVERT-3D-COLORS CONVERT-TO-OFFS CONVERT-TO-OFFSET + COPY-DATASET COPY-LOB COPY-SAX-ATTRIBUTES COPY-TEMP-TABLE COUNT + COUNT-OF CPCASE CPCOLL CPINTERNAL CPLOG CPPRINT CPRCODEIN CPRCODEOUT + CPSTREAM CPTERM CRC-VALUE CREATE CREATE-LIKE CREATE-LIKE-SEQUENTIAL + CREATE-NODE-NAMESPACE CREATE-RESULT-LIST-ENTRY CREATE-TEST-FILE + CURRENT CURRENT_DATE CURRENT_DATE CURRENT-CHANGED CURRENT-COLUMN + CURRENT-ENV CURRENT-ENVIRONMENT CURRENT-ITERATION CURRENT-LANG + CURRENT-LANGUAGE CURRENT-QUERY CURRENT-REQUEST-INFO + CURRENT-RESPONSE-INFO CURRENT-RESULT-ROW CURRENT-ROW-MODIFIED + CURRENT-VALUE CURRENT-WINDOW CURS CURSOR CURSOR-CHAR CURSOR-LINE + CURSOR-OFFSET DATABASE DATA-BIND DATA-ENTRY-RET DATA-ENTRY-RETURN + DATA-REL DATA-RELATION DATASERVERS DATASET DATASET-HANDLE DATA-SOURCE + DATA-SOURCE-COMPLETE-MAP DATA-SOURCE-MODIFIED DATA-SOURCE-ROWID DATA-T + DATA-TYPE DATE-F DATE-FORMAT DAY DBCODEPAGE DBCOLLATION DB-CONTEXT + DBNAME DBPARAM DB-REFERENCES DBREST DBRESTRICTIONS DBTASKID DBTYPE + DBVERS DBVERSION DCOLOR DDE DDE-ERROR DDE-I DDE-ID DDE-ITEM DDE-NAME + DDE-TOPIC DEBLANK DEBU DEBUG DEBUG-ALERT DEBUGGER DEBUG-LIST DECIMALS + DECLARE DECLARE-NAMESPACE DECRYPT DEF DEFAULT DEFAULT-BUFFER-HANDLE + DEFAULT-BUTTON DEFAULT-COMMIT DEFAULT-EX DEFAULT-EXTENSION + DEFAULT-NOXL DEFAULT-NOXLATE DEFAULT-VALUE DEFAULT-WINDOW DEFAUT-B + DEFINE DEFINED DEFINE-USER-EVENT-MANAGER DEL DELEGATE DELETE DELETE + PROCEDURE DELETE-CHAR DELETE-CURRENT-ROW DELETE-LINE + DELETE-RESULT-LIST-ENTRY DELETE-SELECTED-ROW DELETE-SELECTED-ROWS + DELIMITER DESC DESCENDING DESELECT-FOCUSED-ROW DESELECTION + DESELECT-ROWS DESELECT-SELECTED-ROW DESTRUCTOR DIALOG-BOX DICT + DICTIONARY DIR DISABLE DISABLE-AUTO-ZAP DISABLED DISABLE-DUMP-TRIGGERS + DISABLE-LOAD-TRIGGERS DISCON DISCONNECT DISP DISPLAY DISPLAY-MESSAGE + DISPLAY-T DISPLAY-TYPE DISTINCT DO DOMAIN-DESCRIPTION DOMAIN-NAME + DOMAIN-TYPE DOS DOUBLE DOWN DRAG-ENABLED DROP DROP-DOWN DROP-DOWN-LIST + DROP-FILE-NOTIFY DROP-TARGET ds-close-cursor DSLOG-MANAGER DUMP + DYNAMIC DYNAMIC-ENUM DYNAMIC-FUNCTION DYNAMIC-INVOKE EACH ECHO EDGE + EDGE-CHARS EDGE-P EDGE-PIXELS EDIT-CAN-PASTE EDIT-CAN-UNDO EDIT-CLEAR + EDIT-COPY EDIT-CUT EDITING EDITOR EDIT-PASTE EDIT-UNDO ELSE EMPTY + EMPTY-TEMP-TABLE ENABLE ENABLED-FIELDS ENCODE ENCRYPT + ENCRYPT-AUDIT-MAC-KEY ENCRYPTION-SALT END END-DOCUMENT END-ELEMENT + END-EVENT-GROUP END-FILE-DROP ENDKEY END-KEY END-MOVE END-RESIZE + END-ROW-RESIZE END-USER-PROMPT ENTERED ENTITY-EXPANSION-LIMIT ENTRY + ENUM EQ ERROR ERROR-COL ERROR-COLUMN ERROR-ROW ERROR-STACK-TRACE + ERROR-STAT ERROR-STATUS ESCAPE ETIME EVENT EVENT-GROUP-ID + EVENT-PROCEDURE EVENT-PROCEDURE-CONTEXT EVENTS EVENT-T EVENT-TYPE + EXCEPT EXCLUSIVE EXCLUSIVE-ID EXCLUSIVE-LOCK EXCLUSIVE-WEB-USER + EXECUTE EXISTS EXP EXPAND EXPANDABLE EXPLICIT EXPORT EXPORT-PRINCIPAL + EXTENDED EXTENT EXTERNAL FALSE FETCH FETCH-SELECTED-ROW FGC FGCOLOR + FIELD FIELD FIELDS FILE FILE-CREATE-DATE FILE-CREATE-TIME FILE-INFO + FILE-INFORMATION FILE-MOD-DATE FILE-MOD-TIME FILENAME FILE-NAME + FILE-OFF FILE-OFFSET FILE-SIZE FILE-TYPE FILL FILLED FILL-IN FILTERS + FINAL FINALLY FIND FIND-BY-ROWID FIND-CASE-SENSITIVE FIND-CURRENT + FINDER FIND-FIRST FIND-GLOBAL FIND-LAST FIND-NEXT-OCCURRENCE + FIND-PREV-OCCURRENCE FIND-SELECT FIND-UNIQUE FIND-WRAP-AROUND FIRST + FIRST-ASYNCH-REQUEST FIRST-CHILD FIRST-COLUMN FIRST-FORM FIRST-OBJECT + FIRST-OF FIRST-PROC FIRST-PROCEDURE FIRST-SERVER FIRST-TAB-I + FIRST-TAB-ITEM FIT-LAST-COLUMN FIXED-ONLY FLAT-BUTTON FLOAT FOCUS + FOCUSED-ROW FOCUSED-ROW-SELECTED FONT FONT-TABLE FOR FORCE-FILE FORE + FOREGROUND FORM FORMAT FORMATTE FORMATTED FORM-LONG-INPUT FORWARD + FORWARD FORWARDS FRAGMEN FRAGMENT FRAM FRAME FRAME-COL FRAME-DB + FRAME-DOWN FRAME-FIELD FRAME-FILE FRAME-INDE FRAME-INDEX FRAME-LINE + FRAME-NAME FRAME-ROW FRAME-SPA FRAME-SPACING FRAME-VAL FRAME-VALUE + FRAME-X FRAME-Y FREQUENCY FROM FROM-C FROM-CHARS FROM-CUR FROM-CURRENT + FROM-P FROM-PIXELS FULL-HEIGHT FULL-HEIGHT-CHARS FULL-HEIGHT-P + FULL-HEIGHT-PIXELS FULL-PATHN FULL-PATHNAME FULL-WIDTH + FULL-WIDTH-CHARS FULL-WIDTH-P FULL-WIDTH-PIXELS FUNCTION + FUNCTION-CALL-TYPE GATEWAY GATEWAYS GE GENERATE-MD5 GENERATE-PBE-KEY + GENERATE-PBE-SALT GENERATE-RANDOM-KEY GENERATE-UUID GET + GET-ATTR-CALL-TYPE GET-ATTRIBUTE-NODE GET-BINARY-DATA GET-BLUE + GET-BLUE-VALUE GET-BROWSE-COLUMN GET-BUFFER-HANDLE GETBYTE GET-BYTE + GET-CALLBACK-PROC-CONTEXT GET-CALLBACK-PROC-NAME GET-CGI-LIST + GET-CGI-LONG-VALUE GET-CGI-VALUE GET-CLASS GET-CODEPAGES + GET-COLLATIONS GET-CONFIG-VALUE GET-CURRENT GET-DOUBLE + GET-DROPPED-FILE GET-DYNAMIC GET-ERROR-COLUMN GET-ERROR-ROW GET-FILE + GET-FILE-NAME GET-FILE-OFFSE GET-FILE-OFFSET GET-FIRST GET-FLOAT + GET-GREEN GET-GREEN-VALUE GET-INDEX-BY-NAMESPACE-NAME + GET-INDEX-BY-QNAME GET-INT64 GET-ITERATION GET-KEY-VAL GET-KEY-VALUE + GET-LAST GET-LOCALNAME-BY-INDEX GET-LONG GET-MESSAGE GET-NEXT + GET-NUMBER GET-POINTER-VALUE GET-PREV GET-PRINTERS GET-PROPERTY + GET-QNAME-BY-INDEX GET-RED GET-RED-VALUE GET-REPOSITIONED-ROW + GET-RGB-VALUE GET-SELECTED GET-SELECTED-WIDGET GET-SHORT GET-SIGNATURE + GET-SIZE GET-STRING GET-TAB-ITEM GET-TEXT-HEIGHT GET-TEXT-HEIGHT-CHARS + GET-TEXT-HEIGHT-P GET-TEXT-HEIGHT-PIXELS GET-TEXT-WIDTH + GET-TEXT-WIDTH-CHARS GET-TEXT-WIDTH-P GET-TEXT-WIDTH-PIXELS + GET-TYPE-BY-INDEX GET-TYPE-BY-NAMESPACE-NAME GET-TYPE-BY-QNAME + GET-UNSIGNED-LONG GET-UNSIGNED-SHORT GET-URI-BY-INDEX + GET-VALUE-BY-INDEX GET-VALUE-BY-NAMESPACE-NAME GET-VALUE-BY-QNAME + GET-WAIT-STATE GLOBAL GO-ON GO-PEND GO-PENDING GRANT GRAPHIC-E + GRAPHIC-EDGE GRID-FACTOR-H GRID-FACTOR-HORIZONTAL GRID-FACTOR-V + GRID-FACTOR-VERTICAL GRID-SNAP GRID-UNIT-HEIGHT GRID-UNIT-HEIGHT-CHARS + GRID-UNIT-HEIGHT-P GRID-UNIT-HEIGHT-PIXELS GRID-UNIT-WIDTH + GRID-UNIT-WIDTH-CHARS GRID-UNIT-WIDTH-P GRID-UNIT-WIDTH-PIXELS + GRID-VISIBLE GROUP GT GUID HANDLER HAS-RECORDS HAVING HEADER HEIGHT + HEIGHT HEIGHT-CHARS HEIGHT-P HEIGHT-P HEIGHT-PIXELS HELP HEX-DECODE + HEX-ENCODE HIDDEN HIDE HORI HORIZONTAL HOST-BYTE-ORDER HTML-CHARSET + HTML-END-OF-LINE HTML-END-OF-PAGE HTML-FRAME-BEGIN HTML-FRAME-END + HTML-HEADER-BEGIN HTML-HEADER-END HTML-TITLE-BEGIN HTML-TITLE-END HWND + ICON IF IMAGE IMAGE-DOWN IMAGE-INSENSITIVE IMAGE-SIZE IMAGE-SIZE-C + IMAGE-SIZE-CHARS IMAGE-SIZE-P IMAGE-SIZE-PIXELS IMAGE-UP + IMMEDIATE-DISPLAY IMPLEMENTS IMPORT IMPORT-PRINCIPAL IN + INCREMENT-EXCLUSIVE-ID INDEX INDEXED-REPOSITION INDEX-HINT + INDEX-INFORMATION INDICATOR INFO INFORMATION IN-HANDLE INHERIT-BGC + INHERIT-BGCOLOR INHERIT-FGC INHERIT-FGCOLOR INHERITS INIT INITIAL + INITIAL-DIR INITIAL-FILTER INITIALIZE-DOCUMENT-TYPE INITIATE + INNER-CHARS INNER-LINES INPUT INPUT-O INPUT-OUTPUT INPUT-VALUE INSERT + INSERT-ATTRIBUTE INSERT-B INSERT-BACKTAB INSERT-FILE INSERT-ROW + INSERT-STRING INSERT-T INSERT-TAB INTERFACE INTERNAL-ENTRIES INTO + INVOKE IS IS-ATTR IS-ATTR IS-ATTR-SPACE IS-CLAS IS-CLASS IS-JSON + IS-LEAD-BYTE IS-OPEN IS-PARAMETER-SET IS-PARTITIONE IS-PARTITIONED + IS-ROW-SELECTED IS-SELECTED IS-XML ITEM ITEMS-PER-ROW JOIN + JOIN-BY-SQLDB KBLABEL KEEP-CONNECTION-OPEN KEEP-FRAME-Z + KEEP-FRAME-Z-ORDER KEEP-MESSAGES KEEP-SECURITY-CACHE KEEP-TAB-ORDER + KEY KEYCODE KEY-CODE KEYFUNC KEY-FUNC KEYFUNCTION KEY-FUNCTION + KEYLABEL KEY-LABEL KEYS KEYWORD KEYWORD-ALL LABEL LABEL-BGC + LABEL-BGCOLOR LABEL-DC LABEL-DCOLOR LABEL-FGC LABEL-FGCOLOR LABEL-FONT + LABEL-PFC LABEL-PFCOLOR LABELS LABELS-HAVE-COLONS LANDSCAPE LANGUAGE + LANGUAGES LARGE LARGE-TO-SMALL LAST LAST-ASYNCH-REQUEST LAST-BATCH + LAST-CHILD LAST-EVEN LAST-EVENT LAST-FORM LASTKEY LAST-KEY LAST-OBJECT + LAST-OF LAST-PROCE LAST-PROCEDURE LAST-SERVER LAST-TAB-I LAST-TAB-ITEM + LC LDBNAME LE LEAVE LEFT-ALIGN LEFT-ALIGNED LEFT-TRIM LENGTH LIBRARY + LIKE LIKE-SEQUENTIAL LINE LINE-COUNT LINE-COUNTER LIST-EVENTS LISTI + LISTING LIST-ITEM-PAIRS LIST-ITEMS LIST-PROPERTY-NAMES + LIST-QUERY-ATTRS LIST-SET-ATTRS LIST-WIDGETS LITERAL-QUESTION + LITTLE-ENDIAN LOAD LOAD-DOMAINS LOAD-ICON LOAD-IMAGE LOAD-IMAGE-DOWN + LOAD-IMAGE-INSENSITIVE LOAD-IMAGE-UP LOAD-MOUSE-P LOAD-MOUSE-POINTER + LOAD-PICTURE LOAD-SMALL-ICON LOCAL-NAME LOCAL-VERSION-INFO + LOCATOR-COLUMN-NUMBER LOCATOR-LINE-NUMBER LOCATOR-PUBLIC-ID + LOCATOR-SYSTEM-ID LOCATOR-TYPE LOCKED LOCK-REGISTRATION LOG + LOG-AUDIT-EVENT LOGIN-EXPIRATION-TIMESTAMP LOGIN-HOST LOGIN-STATE + LOG-MANAGER LOGOUT LOOKAHEAD LOOKUP LT MACHINE-CLASS MANDATORY + MANUAL-HIGHLIGHT MAP MARGIN-EXTRA MARGIN-HEIGHT MARGIN-HEIGHT-CHARS + MARGIN-HEIGHT-P MARGIN-HEIGHT-PIXELS MARGIN-WIDTH MARGIN-WIDTH-CHARS + MARGIN-WIDTH-P MARGIN-WIDTH-PIXELS MARK-NEW MARK-ROW-STATE MATCHES MAX + MAX MAX-BUTTON MAX-CHARS MAX-DATA-GUESS MAX-HEIGHT MAX-HEIGHT-C + MAX-HEIGHT-CHARS MAX-HEIGHT-P MAX-HEIGHT-PIXELS MAXIMIZE MAXIMUM + MAXIMUM-LEVEL MAX-ROWS MAX-SIZE MAX-VAL MAX-VALUE MAX-WIDTH MAX-WIDTH + MAX-WIDTH-CHARS MAX-WIDTH-P MAX-WIDTH-PIXELS MD5-DIGEST MEMBER + MEMPTR-TO-NODE-VALUE MENU MENUBAR MENU-BAR MENU-ITEM MENU-K MENU-KEY + MENU-M MENU-MOUSE MERGE-BY-FIELD MESSAGE MESSAGE-AREA + MESSAGE-AREA-FONT MESSAGE-LINES METHOD MIN MIN MIN-BUTTON + MIN-COLUMN-WIDTH-C MIN-COLUMN-WIDTH-CHARS MIN-COLUMN-WIDTH-P + MIN-COLUMN-WIDTH-PIXELS MIN-HEIGHT MIN-HEIGHT-CHARS MIN-HEIGHT-P + MIN-HEIGHT-PIXELS MINIMUM MIN-SIZE MIN-VAL MIN-VALUE MIN-WIDTH + MIN-WIDTH-CHARS MIN-WIDTH-P MIN-WIDTH-PIXELS MOD MODIFIED MODULO MONTH + MOUSE MOUSE-P MOUSE-POINTER MOVABLE MOVE-AFTER MOVE-AFTER-TAB-ITEM + MOVE-BEFOR MOVE-BEFORE-TAB-ITEM MOVE-COL MOVE-COLUMN MOVE-TO-B + MOVE-TO-BOTTOM MOVE-TO-EOF MOVE-TO-T MOVE-TO-TOP MPE MTIME + MULTI-COMPILE MULTIPLE MULTIPLE-KEY MULTITASKING-INTERVAL MUST-EXIST + NAME NAMESPACE-PREFIX NAMESPACE-URI NATIVE NE NEEDS-APPSERVER-PROMPT + NEEDS-PROMPT NEW NEW-INSTANCE NEW-ROW NEXT NEXT-COLUMN NEXT-PROMPT + NEXT-ROWID NEXT-SIBLING NEXT-TAB-I NEXT-TAB-ITEM NEXT-VALUE NO + NO-APPLY NO-ARRAY-MESSAGE NO-ASSIGN NO-ATTR NO-ATTR NO-ATTR-LIST + NO-ATTR-SPACE NO-AUTO-VALIDATE NO-BIND-WHERE NO-BOX NO-CONSOLE + NO-CONVERT NO-CONVERT-3D-COLORS NO-CURRENT-VALUE NO-DEBUG + NODE-VALUE-TO-MEMPTR NO-DRAG NO-ECHO NO-EMPTY-SPACE NO-ERROR NO-F + NO-FILL NO-FOCUS NO-HELP NO-HIDE NO-INDEX-HINT NO-INHERIT-BGC + NO-INHERIT-BGCOLOR NO-INHERIT-FGC NO-INHERIT-FGCOLOR NO-JOIN-BY-SQLDB + NO-LABEL NO-LABELS NO-LOBS NO-LOCK NO-LOOKAHEAD NO-MAP NO-MES + NO-MESSAGE NONAMESPACE-SCHEMA-LOCATION NONE NO-PAUSE NO-PREFE + NO-PREFETCH NORMALIZE NO-ROW-MARKERS NO-SCROLLBAR-VERTICAL + NO-SEPARATE-CONNECTION NO-SEPARATORS NOT NO-TAB-STOP NOT-ACTIVE NO-UND + NO-UNDERLINE NO-UNDO NO-VAL NO-VALIDATE NOW NO-WAIT NO-WORD-WRAP NULL + NUM-ALI NUM-ALIASES NUM-BUFFERS NUM-BUT NUM-BUTTONS NUM-COL + NUM-COLUMNS NUM-COPIES NUM-DBS NUM-DROPPED-FILES NUM-ENTRIES NUMERIC + NUMERIC-F NUMERIC-FORMAT NUM-FIELDS NUM-FORMATS NUM-ITEMS + NUM-ITERATIONS NUM-LINES NUM-LOCKED-COL NUM-LOCKED-COLUMNS + NUM-MESSAGES NUM-PARAMETERS NUM-REFERENCES NUM-REPLACED NUM-RESULTS + NUM-SELECTED NUM-SELECTED-ROWS NUM-SELECTED-WIDGETS NUM-TABS + NUM-TO-RETAIN NUM-VISIBLE-COLUMNS OBJECT OCTET-LENGTH OF OFF OK + OK-CANCEL OLD ON ON-FRAME ON-FRAME-BORDER OPEN OPSYS OPTION OR + ORDERED-JOIN ORDINAL OS-APPEND OS-COMMAND OS-COPY OS-CREATE-DIR + OS-DELETE OS-DIR OS-DRIVE OS-DRIVES OS-ERROR OS-GETENV OS-RENAME + OTHERWISE OUTPUT OVERLAY OVERRIDE OWNER PAGE PAGE-BOT PAGE-BOTTOM + PAGED PAGE-NUM PAGE-NUMBER PAGE-SIZE PAGE-TOP PAGE-WID PAGE-WIDTH + PARAM PARAMETER PARENT PARSE-STATUS PARTIAL-KEY PASCAL PASSWORD-FIELD + PATHNAME PAUSE PBE-HASH-ALG PBE-HASH-ALGORITHM PBE-KEY-ROUNDS PDBNAME + PERSIST PERSISTENT PERSISTENT-CACHE-DISABLED PFC PFCOLOR PIXELS + PIXELS-PER-COL PIXELS-PER-COLUMN PIXELS-PER-ROW POPUP-M POPUP-MENU + POPUP-O POPUP-ONLY PORTRAIT POSITION PRECISION PREFER-DATASET PREPARED + PREPARE-STRING PREPROC PREPROCESS PRESEL PRESELECT PREV PREV-COLUMN + PREV-SIBLING PREV-TAB-I PREV-TAB-ITEM PRIMARY PRINTER + PRINTER-CONTROL-HANDLE PRINTER-HDC PRINTER-NAME PRINTER-PORT + PRINTER-SETUP PRIVATE PRIVATE-D PRIVATE-DATA PRIVILEGES PROCE + PROCEDURE PROCEDURE-CALL-TYPE PROCEDURE-TYPE PROCESS PROC-HA + PROC-HANDLE PROC-ST PROC-STATUS proc-text proc-text-buffer PROFILER + PROGRAM-NAME PROGRESS PROGRESS-S PROGRESS-SOURCE PROMPT PROMPT-F + PROMPT-FOR PROMSGS PROPATH PROPERTY PROTECTED PROVERS PROVERSION PROXY + PROXY-PASSWORD PROXY-USERID PUBLIC PUBLIC-ID PUBLISH PUBLISHED-EVENTS + PUT PUTBYTE PUT-BYTE PUT-DOUBLE PUT-FLOAT PUT-INT64 PUT-KEY-VAL + PUT-KEY-VALUE PUT-LONG PUT-SHORT PUT-STRING PUT-UNSIGNED-LONG QUERY + QUERY-CLOSE QUERY-OFF-END QUERY-OPEN QUERY-PREPARE QUERY-TUNING + QUESTION QUIT QUOTER RADIO-BUTTONS RADIO-SET RANDOM RAW-TRANSFER + RCODE-INFO RCODE-INFORMATION READ-AVAILABLE READ-EXACT-NUM READ-FILE + READ-JSON READKEY READ-ONLY READ-XML REAL RECORD-LENGTH RECT RECTANGLE + RECURSIVE REFERENCE-ONLY REFRESH REFRESHABLE REFRESH-AUDIT-POLICY + REGISTER-DOMAIN RELEASE REMOTE REMOVE-EVENTS-PROCEDURE + REMOVE-SUPER-PROCEDURE REPEAT REPLACE REPLACE-SELECTION-TEXT + REPOSITION REPOSITION-BACKWARD REPOSITION-FORWARD REPOSITION-MODE + REPOSITION-TO-ROW REPOSITION-TO-ROWID REQUEST REQUEST-INFO RESET + RESIZA RESIZABLE RESIZE RESPONSE-INFO RESTART-ROW RESTART-ROWID RETAIN + RETAIN-SHAPE RETRY RETRY-CANCEL RETURN RETURN-ALIGN RETURN-INS + RETURN-INSERTED RETURNS RETURN-TO-START-DI RETURN-TO-START-DIR + RETURN-VAL RETURN-VALUE RETURN-VALUE-DATA-TYPE REVERSE-FROM REVERT + REVOKE RGB-VALUE RIGHT-ALIGNED RIGHT-TRIM R-INDEX ROLES ROUND + ROUTINE-LEVEL ROW ROW-HEIGHT-CHARS ROW-HEIGHT-PIXELS ROW-MARKERS + ROW-OF ROW-RESIZABLE RULE RUN RUN-PROCEDURE SAVE SAVE CACHE SAVE-AS + SAVE-FILE SAX-COMPLE SAX-COMPLETE SAX-PARSE SAX-PARSE-FIRST + SAX-PARSE-NEXT SAX-PARSER-ERROR SAX-RUNNING SAX-UNINITIALIZED + SAX-WRITE-BEGIN SAX-WRITE-COMPLETE SAX-WRITE-CONTENT SAX-WRITE-ELEMENT + SAX-WRITE-ERROR SAX-WRITE-IDLE SAX-WRITER SAX-WRITE-TAG SCHEMA + SCHEMA-LOCATION SCHEMA-MARSHAL SCHEMA-PATH SCREEN SCREEN-IO + SCREEN-LINES SCREEN-VAL SCREEN-VALUE SCROLL SCROLLABLE SCROLLBAR-H + SCROLLBAR-HORIZONTAL SCROLL-BARS SCROLLBAR-V SCROLLBAR-VERTICAL + SCROLL-DELTA SCROLLED-ROW-POS SCROLLED-ROW-POSITION SCROLLING + SCROLL-OFFSET SCROLL-TO-CURRENT-ROW SCROLL-TO-I SCROLL-TO-ITEM + SCROLL-TO-SELECTED-ROW SDBNAME SEAL SEAL-TIMESTAMP SEARCH SEARCH-SELF + SEARCH-TARGER SECTION SECURITY-POLICY SEEK SELECT SELECTABLE + SELECT-ALL SELECTED SELECT-FOCUSED-ROW SELECTION SELECTION-END + SELECTION-LIST SELECTION-START SELECTION-TEXT SELECT-NEXT-ROW + SELECT-PREV-ROW SELECT-ROW SELF SEND send-sql send-sql-statement + SENSITIVE SEPARATE-CONNECTION SEPARATOR-FGCOLOR SEPARATORS + SERIALIZABLE SERIALIZE-HIDDEN SERIALIZE-NAME SERVER + SERVER-CONNECTION-BOUND SERVER-CONNECTION-BOUND-REQUEST + SERVER-CONNECTION-CONTEXT SERVER-CONNECTION-ID SERVER-OPERATING-MODE + SESSION SESSION-IDSET SET-APPL-CONTEXT SET-ATTR-CALL-TYPE + SET-ATTRIBUTE-NODE SET-BLUE SET-BLUE-VALUE SET-BREAK SET-BUFFERS + SET-CALLBACK SET-CLIENT SET-COMMIT SET-CONTENTS SET-CURRENT-VALUE + SET-DB-CLIENT SET-DYNAMIC SET-EVENT-MANAGER-OPTION SET-GREEN + SET-GREEN-VALUE SET-INPUT-SOURCE SET-OPTION SET-OUTPUT-DESTINATION + SET-PARAMETER SET-POINTER-VALUE SET-PROPERTY SET-RED SET-RED-VALUE + SET-REPOSITIONED-ROW SET-RGB-VALUE SET-ROLLBACK SET-SELECTION SET-SIZE + SET-SORT-ARROW SETUSER SETUSERID SET-WAIT-STATE SHA1-DIGEST SHARE + SHARED SHARE-LOCK SHOW-IN-TASKBAR SHOW-STAT SHOW-STATS SIDE-LAB + SIDE-LABEL-H SIDE-LABEL-HANDLE SIDE-LABELS SIGNATURE SILENT SIMPLE + SINGLE SINGLE-RUN SINGLETON SIZE SIZE-C SIZE-CHARS SIZE-P SIZE-PIXELS + SKIP SKIP-DELETED-RECORD SLIDER SMALL-ICON SMALLINT SMALL-TITLE SOME + SORT SORT-ASCENDING SORT-NUMBER SOURCE SOURCE-PROCEDURE SPACE SQL SQRT + SSL-SERVER-NAME STANDALONE START START-DOCUMENT START-ELEMENT + START-MOVE START-RESIZE START-ROW-RESIZE STATE-DETAIL STATIC STATUS + STATUS-AREA STATUS-AREA-FONT STDCALL STOP STOP-AFTER STOP-PARSING + STOPPE STOPPED STORED-PROC STORED-PROCEDURE STREAM STREAM-HANDLE + STREAM-IO STRETCH-TO-FIT STRICT STRICT-ENTITY-RESOLUTION STRING + STRING-VALUE STRING-XREF SUB- SUB-AVE SUB-AVERAGE SUB-COUNT + SUB-MAXIMUM SUB-MENU SUB-MIN SUB-MINIMUM SUBSCRIBE SUBST SUBSTITUTE + SUBSTR SUBSTRING SUB-TOTAL SUBTYPE SUM SUM-MAX SUPER SUPER-PROCEDURES + SUPPRESS-NAMESPACE-PROCESSING SUPPRESS-W SUPPRESS-WARNINGS + SYMMETRIC-ENCRYPTION-ALGORITHM SYMMETRIC-ENCRYPTION-IV + SYMMETRIC-ENCRYPTION-KEY SYMMETRIC-SUPPORT SYSTEM-ALERT + SYSTEM-ALERT-BOXES SYSTEM-DIALOG SYSTEM-HELP SYSTEM-ID TABLE + TABLE-HANDLE TABLE-NUMBER TABLE-SCAN TAB-POSITION TAB-STOP TARGET + TARGET-PROCEDURE TEMP-DIR TEMP-DIRECTORY TEMP-TABLE TEMP-TABLE-PREPARE + TERM TERMINAL TERMINATETEXT TEXT TEXT-CURSOR TEXT-SEG-GROW + TEXT-SELECTED THEN THIS-OBJECT THIS-PROCEDURE THREAD-SAFE THREE-D + THROUGH THROW THRU TIC-MARKS TIME TIME-SOURCE TITLE TITLE-BGC + TITLE-BGCOLOR TITLE-DC TITLE-DCOLORTITLE-FGC TITLE-FGCOLOR TITLE-FO + TITLE-FONT TO TODAY TOGGLE-BOX TOOLTIP TOOLTIPS TOPIC TOP-NAV-QUERY + TOP-ONLY TO-ROWID TOTAL TRAILING TRANS TRANSACTION TRANSACTION-MODE + TRANS-INIT-PROCEDURE TRANSPARENT TRIGGER TRIGGERS TRIM TRUE TRUNC + TRUNCATE TYPE TYPE-OF UNBOX UNBUFF UNBUFFERED UNDERL UNDERLINE UNDO + UNFORM UNFORMATTED UNION UNIQUE UNIQUE-ID UNIQUE-MATCH UNIX + UNLESS-HIDDEN UNLOAD UNSIGNED-LONG UNSUBSCRIBE UP UPDATE + UPDATE-ATTRIBUTE URL URL-DECODE URL-ENCODE URL-PASSWORD URL-USERID USE + USE-DICT-EXPS USE-FILENAME USE-INDEX USER USE-REVVIDEO USERID USER-ID + USE-TEXT USE-UNDERLINE USE-WIDGET-POOL USING V6DISPLAY V6FRAME + VALIDATE VALIDATE-EXPRESSION VALIDATE-MESSAGE VALIDATE-SEAL + VALIDATION-ENABLED VALID-EVENT VALID-HANDLE VALID-OBJECT VALUE + VALUE-CHANGED VALUES VAR VARIABLE VERBOSE VERSION VERT VERTICAL VIEW + VIEW-AS VIEW-FIRST-COLUMN-ON-REOPEN VIRTUAL-HEIGHT + VIRTUAL-HEIGHT-CHARS VIRTUAL-HEIGHT-P VIRTUAL-HEIGHT-PIXELS + VIRTUAL-WIDTH VIRTUAL-WIDTH-CHARS VIRTUAL-WIDTH-P VIRTUAL-WIDTH-PIXELS + VISIBLE VOID WAIT WAIT-FOR WARNING WEB-CONTEXT WEEKDAY WHEN WHERE + WHILE WIDGET WIDGET-E WIDGET-ENTER WIDGET-ID WIDGET-L WIDGET-LEAVE + WIDGET-POOL WIDTH WIDTH WIDTH-CHARS WIDTH-P WIDTH-PIXELS WINDOW + WINDOW-MAXIM WINDOW-MAXIMIZED WINDOW-MINIM WINDOW-MINIMIZED + WINDOW-NAME WINDOW-NORMAL WINDOW-STA WINDOW-STATE WINDOW-SYSTEM WITH + WORD-INDEX WORD-WRAP WORK-AREA-HEIGHT-PIXELS WORK-AREA-WIDTH-PIXELS + WORK-AREA-X WORK-AREA-Y WORKFILE WORK-TAB WORK-TABLE WRITE WRITE-CDATA + WRITE-CHARACTERS WRITE-COMMENT WRITE-DATA-ELEMENT WRITE-EMPTY-ELEMENT + WRITE-ENTITY-REF WRITE-EXTERNAL-DTD WRITE-FRAGMENT WRITE-JSON + WRITE-MESSAGE WRITE-PROCESSING-INSTRUCTION WRITE-STATUS WRITE-XML + WRITE-XMLSCHEMA X XCODE XML-DATA-TYPE XML-ENTITY-EXPANSION-LIMIT + XML-NODE-TYPE XML-SCHEMA-PATH XML-STRICT-ENTITY-RESOLUTION + XML-SUPPRESS-NAMESPACE-PROCESSING X-OF XREF XREF-XML Y YEAR + YEAR-OFFSET YES YES-NO YES-NO-CANCEL Y-OF + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + BLOB CHARACTER CHAR CLOB COM-HANDLE DATE DATETIME DATETIME-TZ DECIMAL + DEC HANDLE INT64 INTEGER INT LOGICAL LONGCHAR MEMPTR RAW RECID ROWID + WIDGET-HANDLE + ) + end + + state :root do + rule %r(\s+), Text + + rule %r((\.)(\s+)) do + groups Operator, Text + end + + rule %r(//[^\n]*), Comment::Single + rule %r(/[*].*?[*]/)m, Comment::Multiline + + rule %r/(\{?&)(\S+)/ do + groups Comment::Preproc, Name::Other + push :preproc + end + + rule %r/"/, Str, :string + rule %r('(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char + + mixin :numbers + + rule %r(\*/), Error + + rule %r([~!%^*+=\|?:<>/-]), Operator + rule %r/[()\[\],]/, Punctuation + + rule %r/(?:TRUE|FALSE|NULL)\b/i, Keyword::Constant + + rule id do |m| + name = m[0].upcase + + if self.class.keywords.include? name + token Name::Builtin + elsif self.class.keywords_type.include? name + token Keyword::Type + else + token Name::Variable + end + end + end + + state :numbers do + rule %r((?:\d+[.]\d*|[.]\d+)(?:e[+-]?\d+[lu]*)?)i, Num::Float + rule %r(\d+e[+-]?\d+[lu]*)i, Num::Float + rule %r/0x[0-9a-f]+[lu]*/i, Num::Hex + rule %r/0[0-7]+[lu]*/i, Num::Oct + rule %r/\d+[lu]*/i, Num::Integer + end + + state :string do + rule %r/"/, Str, :pop! + rule %r/\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape + rule %r/[^\\"]+/, Str + rule %r/\\/, Str # stray backslash + end + + state :preproc do + rule %r/\n/, Text, :pop! + rule %r/\s+/, Text + + rule %r/({?&)(\S+)/ do + groups Comment::Preproc, Name::Other + end + + rule %r/"/, Str, :string + mixin :numbers + + rule %r/\S+/, Name + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/opentype_feature_file.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/opentype_feature_file.rb new file mode 100644 index 000000000000..943d6ab6757e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/opentype_feature_file.rb @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class OpenTypeFeatureFile < RegexLexer + title "OpenType Feature File" + desc "Feature specifications for an OpenType font (adobe-type-tools.github.io/afdko)" + tag 'opentype_feature_file' + aliases 'fea', 'opentype', 'opentypefeature' + filenames '*.fea' + + def self.keywords + @keywords ||= %w( + Ascender Attach AxisValue CapHeight CaretOffset CodePageRange + DesignAxis Descender ElidedFallbackName ElidedFallbackNameID + ElidableAxisValueName FeatUILabelNameID FeatUITooltipTextNameID + FontRevision FSType GlyphClassDef HorizAxis.BaseScriptList + HorizAxis.BaseTagList HorizAxis.MinMax IgnoreBaseGlyphs + IgnoreLigatures IgnoreMarks LigatureCaretByDev LigatureCaretByIndex + LigatureCaretByPos LineGap MarkAttachClass MarkAttachmentType NULL + OlderSiblingFontAttribute Panose ParamUILabelNameID RightToLeft + SampleTextNameID TypoAscender TypoDescender TypoLineGap UnicodeRange + UseMarkFilteringSet Vendor VertAdvanceY VertAxis.BaseScriptList + VertAxis.BaseTagList VertAxis.MinMax VertOriginY VertTypoAscender + VertTypoDescender VertTypoLineGap WeightClass WidthClass XHeight + + anchorDef anchor anonymous anon by contour cursive device enumerate + enum exclude_dflt featureNames feature flag from ignore include_dflt + include languagesystem language location lookupflag lookup markClass + mark nameid name parameters position pos required reversesub rsub + script sizemenuname substitute subtable sub table useExtension + valueRecordDef winAscent winDescent + ) + end + + + identifier = %r/[a-z_][a-z0-9\/_.-]*/i + + state :root do + rule %r/\s+/m, Text::Whitespace + rule %r/#.*$/, Comment + + # feature <tag> + rule %r/(anonymous|anon|feature|lookup|table)((?:\s)+)/ do + groups Keyword, Text + push :featurename + end + # } <tag> ; + rule %r/(\})((?:\s))/ do + groups Punctuation, Text + push :featurename + end + # solve include( ../path) + rule %r/include\b/i, Keyword, :includepath + + rule %r/[\-\[\]\/(){},.:;=%*<>']/, Punctuation + + rule %r/`.*?/, Str::Backtick + rule %r/\"/, Str, :strings + rule %r/\\[^.*\s]+/i, Str::Escape + + # classes, start with @<nameOfClass> + rule %r/@#{identifier}/, Name::Class + + # using negative lookbehind so we don't match property names + rule %r/(?<!\.)#{identifier}/ do |m| + if self.class.keywords.include? m[0] + token Keyword + else + token Name + end + end + + rule identifier, Name + rule %r/(?:0x|\\)[0-9A-Fa-f]+/, Num::Hex + rule %r/-?\d+/, Num::Integer + end + + state :featurename do + rule identifier, Name::Function, :pop! + end + + state :includepath do + rule %r/\s+/, Text::Whitespace + rule %r/\)/, Punctuation, :pop! + rule %r/\(/, Punctuation + rule %r/[^\s()]+/, Str + end + + state :strings do + rule %r/"/, Str, :pop! + rule %r/[^"%\n]+/, Str + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/pascal.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/pascal.rb new file mode 100644 index 000000000000..40bf7f0539bf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/pascal.rb @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Pascal < RegexLexer + tag 'pascal' + title "Pascal" + desc 'a procedural programming language commonly used as a teaching language.' + filenames '*.pas', '*.lpr' + + mimetypes 'text/x-pascal' + + id = /@?[_a-z]\w*/i + + keywords = %w( + absolute abstract all and and_then array as asm assembler attribute + begin bindable case class const constructor delay destructor div do + downto else end except exit export exports external far file finalization + finally for forward function goto if implementation import in inc index + inherited initialization inline interface interrupt is label library + message mod module near nil not object of on only operator or or_else + otherwise out overload override packed pascal pow private procedure program + property protected public published qualified raise read record register + repeat resident resourcestring restricted safecall segment set shl shr + stdcall stored string then threadvar to try type unit until uses value var + view virtual while with write writeln xor + ) + + keywords_type = %w( + ansichar ansistring bool boolean byte bytebool cardinal char comp currency + double dword extended int64 integer iunknown longbool longint longword pansichar + pansistring pbool pboolean pbyte pbytearray pcardinal pchar pcomp pcurrency + pdate pdatetime pdouble pdword pextended phandle pint64 pinteger plongint plongword + pointer ppointer pshortint pshortstring psingle psmallint pstring pvariant pwidechar + pwidestring pword pwordarray pwordbool real real48 shortint shortstring single + smallint string tclass tdate tdatetime textfile thandle tobject ttime variant + widechar widestring word wordbool + ) + + state :whitespace do + # Spaces + rule %r/\s+/m, Text + # // Comments + rule %r((//).*$\n?), Comment::Single + # -- Comments + rule %r((--).*$\n?), Comment::Single + # (* Comments *) + rule %r(\(\*.*?\*\))m, Comment::Multiline + # { Comments } + rule %r(\{.*?\})m, Comment::Multiline + end + + state :root do + mixin :whitespace + + rule %r{((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?}, Num + rule %r{[~!@#\$%\^&\*\(\)\+`\-={}\[\]:;<>\?,\.\/\|\\]}, Punctuation + rule %r{'([^']|'')*'}, Str + rule %r/(true|false|nil)\b/i, Name::Builtin + rule %r/\b(#{keywords.join('|')})\b/i, Keyword + rule %r/\b(#{keywords_type.join('|')})\b/i, Keyword::Type + rule id, Name + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/perl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/perl.rb new file mode 100644 index 000000000000..78d6bc62a230 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/perl.rb @@ -0,0 +1,251 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Perl < RegexLexer + title "Perl" + desc "The Perl scripting language (perl.org)" + + tag 'perl' + aliases 'pl' + + filenames '*.pl', '*.pm', '*.t' + mimetypes 'text/x-perl', 'application/x-perl' + + def self.detect?(text) + return true if text.shebang? 'perl' + end + + keywords = %w( + case continue do else elsif for foreach if last my next our + redo reset then unless until while use print new BEGIN CHECK + INIT END return + ) + + builtins = %w( + abs accept alarm atan2 bind binmode bless caller chdir chmod + chomp chop chown chr chroot close closedir connect continue cos + crypt dbmclose dbmopen defined delete die dump each endgrent + endhostent endnetent endprotoent endpwent endservent eof eval + exec exists exit exp fcntl fileno flock fork format formline getc + getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent + getlogin getnetbyaddr getnetbyname getnetent getpeername + getpgrp getppid getpriority getprotobyname getprotobynumber + getprotoent getpwent getpwnam getpwuid getservbyname getservbyport + getservent getsockname getsockopt glob gmtime goto grep hex + import index int ioctl join keys kill last lc lcfirst length + link listen local localtime log lstat map mkdir msgctl msgget + msgrcv msgsnd my next no oct open opendir ord our pack package + pipe pop pos printf prototype push quotemeta rand read readdir + readline readlink readpipe recv redo ref rename require reverse + rewinddir rindex rmdir scalar seek seekdir select semctl semget + semop send setgrent sethostent setnetent setpgrp setpriority + setprotoent setpwent setservent setsockopt shift shmctl shmget + shmread shmwrite shutdown sin sleep socket socketpair sort splice + split sprintf sqrt srand stat study substr symlink syscall sysopen + sysread sysseek system syswrite tell telldir tie tied time times + tr truncate uc ucfirst umask undef unlink unpack unshift untie + utime values vec wait waitpid wantarray warn write + ) + + re_tok = Str::Regex + + state :balanced_regex do + rule %r(/(\\[\\/]|[^/])*/[egimosx]*)m, re_tok, :pop! + rule %r(!(\\[\\!]|[^!])*![egimosx]*)m, re_tok, :pop! + rule %r(\\(\\\\|[^\\])*\\[egimosx]*)m, re_tok, :pop! + rule %r({(\\[\\}]|[^}])*}[egimosx]*), re_tok, :pop! + rule %r(<(\\[\\>]|[^>])*>[egimosx]*), re_tok, :pop! + rule %r(\[(\\[\\\]]|[^\]])*\][egimosx]*), re_tok, :pop! + rule %r[\((\\[\\\)]|[^\)])*\)[egimosx]*], re_tok, :pop! + rule %r(@(\\[\\@]|[^@])*@[egimosx]*), re_tok, :pop! + rule %r(%(\\[\\%]|[^%])*%[egimosx]*), re_tok, :pop! + rule %r(\$(\\[\\\$]|[^\$])*\$[egimosx]*), re_tok, :pop! + end + + state :root do + rule %r/#.*/, Comment::Single + rule %r/^=[a-zA-Z0-9]+\s+.*?\n=cut/m, Comment::Multiline + rule %r/(?:#{keywords.join('|')})\b/, Keyword + + rule %r/(format)(\s+)([a-zA-Z0-9_]+)(\s*)(=)(\s*\n)/ do + groups Keyword, Text, Name, Text, Punctuation, Text + + push :format + end + + rule %r/(?:eq|lt|gt|le|ge|ne|not|and|or|cmp)\b/, Operator::Word + + # substitution/transliteration: balanced delimiters + rule %r((?:s|tr|y){(\\\\|\\}|[^}])*}\s*), re_tok, :balanced_regex + rule %r((?:s|tr|y)<(\\\\|\\>|[^>])*>\s*), re_tok, :balanced_regex + rule %r((?:s|tr|y)\[(\\\\|\\\]|[^\]])*\]\s*), re_tok, :balanced_regex + rule %r[(?:s|tr|y)\((\\\\|\\\)|[^\)])*\)\s*], re_tok, :balanced_regex + + # substitution/transliteration: arbitrary non-whitespace delimiters + rule %r((?:s|tr|y)\s*([^\w\s])((\\\\|\\\1)|[^\1])*?\1((\\\\|\\\1)|[^\1])*?\1[msixpodualngcr]*)m, re_tok + rule %r((?:s|tr|y)\s+(\w)((\\\\|\\\1)|[^\1])*?\1((\\\\|\\\1)|[^\1])*?\1[msixpodualngcr]*)m, re_tok + + # matches: common case, m-optional + rule %r(m?/(\\\\|\\/|[^/\n])*/[msixpodualngc]*), re_tok + rule %r(m(?=[/!\\{<\[\(@%\$])), re_tok, :balanced_regex + + # arbitrary non-whitespace delimiters + rule %r(m\s*([^\w\s])((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok + rule %r(m\s+(\w)((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok + + rule %r(((?<==~)|(?<=\())\s*/(\\\\|\\/|[^/])*/[msixpodualngc]*), + re_tok, :balanced_regex + + rule %r/\s+/, Text + + rule(/(?=[a-z_]\w*(\s*#.*\n)*\s*=>)/i) { push :fat_comma } + + rule %r/(?:#{builtins.join('|')})\b/, Name::Builtin + rule %r/((__(DIE|WARN)__)|(DATA|STD(IN|OUT|ERR)))\b/, + Name::Builtin::Pseudo + + rule %r/<<([\'"]?)([a-zA-Z_][a-zA-Z0-9_]*)\1;?\n.*?\n\2\n/m, Str + + rule %r/(__(END|DATA)__)\b/, Comment::Preproc, :end_part + rule %r/\$\^[ADEFHILMOPSTWX]/, Name::Variable::Global + rule %r/\$[\\"'\[\]&`+*.,;=%~?@$!<>(^\|\/_-](?!\w)/, Name::Variable::Global + rule %r/[$@%&*][$@%&*#_]*(?=[a-z{\[;])/i, Name::Variable, :varname + + rule %r/[-+\/*%=<>&^\|!\\~]=?/, Operator + + rule %r/0_?[0-7]+(_[0-7]+)*/, Num::Oct + rule %r/0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*/, Num::Hex + rule %r/0b[01]+(_[01]+)*/, Num::Bin + rule %r/(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?/i, + Num::Float + rule %r/\d+(_\d*)*e[+-]?\d+(_\d*)*/i, Num::Float + rule %r/\d+(_\d+)*/, Num::Integer + + rule %r/'/, Punctuation, :sq + rule %r/"/, Punctuation, :dq + rule %r/`/, Punctuation, :bq + rule %r/<([^\s>]+)>/, re_tok + rule %r/(q|qq|qw|qr|qx)\{/, Str::Other, :cb_string + rule %r/(q|qq|qw|qr|qx)\(/, Str::Other, :rb_string + rule %r/(q|qq|qw|qr|qx)\[/, Str::Other, :sb_string + rule %r/(q|qq|qw|qr|qx)</, Str::Other, :lt_string + rule %r/(q|qq|qw|qr|qx)(\W)(.|\n)*?\2/, Str::Other + + rule %r/package\s+/, Keyword, :modulename + rule %r/sub\s+/, Keyword, :funcname + rule %r/\[\]|\*\*|::|<<|>>|>=|<=|<=>|={3}|!=|=~|!~|&&?|\|\||\.{1,3}/, + Operator + rule %r/[()\[\]:;,<>\/?{}]/, Punctuation + rule(/(?=\w)/) { push :name } + end + + state :format do + rule %r/\.\n/, Str::Interpol, :pop! + rule %r/.*?\n/, Str::Interpol + end + + state :fat_comma do + rule %r/#.*/, Comment::Single + rule %r/\w+/, Str + rule %r/\s+/, Text + rule %r/=>/, Operator, :pop! + end + + state :name_common do + rule %r/\w+::/, Name::Namespace + rule %r/[\w:]+/, Name::Variable, :pop! + end + + state :varname do + rule %r/\s+/, Text + rule %r/[{\[]/, Punctuation, :pop! # hash syntax + rule %r/[),]/, Punctuation, :pop! # arg specifier + rule %r/[;]/, Punctuation, :pop! # postfix + mixin :name_common + end + + state :name do + mixin :name_common + rule %r/[A-Z_]+(?=[^a-zA-Z0-9_])/, Name::Constant, :pop! + rule(/(?=\W)/) { pop! } + end + + state :modulename do + rule %r/[a-z_]\w*/i, Name::Namespace, :pop! + end + + state :funcname do + rule %r/[a-zA-Z_]\w*[!?]?/, Name::Function + rule %r/\s+/, Text + + # argument declaration + rule %r/(\([$@%]*\))(\s*)/ do + groups Punctuation, Text + end + + rule %r/.*?{/, Punctuation, :pop! + rule %r/;/, Punctuation, :pop! + end + + state :sq do + rule %r/\\[\\']/, Str::Escape + rule %r/[^\\']+/, Str::Single + rule %r/'/, Punctuation, :pop! + rule %r/\\/, Str::Single + end + + state :dq do + mixin :string_intp + rule %r/\\[\\tnrabefluLUE"$@]/, Str::Escape + rule %r/\\0\d{2}/, Str::Escape + rule %r/\\o\{\d+\}/, Str::Escape + rule %r/\\x\h{2}/, Str::Escape + rule %r/\\x\{\h+\}/, Str::Escape + rule %r/\\c./, Str::Escape + rule %r/\\N\{[^\}]+\}/, Str::Escape + rule %r/[^\\"]+?/, Str::Double + rule %r/"/, Punctuation, :pop! + rule %r/\\/, Str::Escape + end + + state :bq do + mixin :string_intp + rule %r/\\[\\tnr`]/, Str::Escape + rule %r/[^\\`]+?/, Str::Backtick + rule %r/`/, Punctuation, :pop! + end + + [[:cb, '\{', '\}'], + [:rb, '\(', '\)'], + [:sb, '\[', '\]'], + [:lt, '<', '>']].each do |name, open, close| + tok = Str::Other + state :"#{name}_string" do + rule %r/\\[#{open}#{close}\\]/, tok + rule %r/\\/, tok + rule(/#{open}/) { token tok; push } + rule %r/#{close}/, tok, :pop! + rule %r/[^#{open}#{close}\\]+/, tok + end + end + + state :in_interp do + rule %r/}/, Str::Interpol, :pop! + rule %r/\s+/, Text + rule %r/[a-z_]\w*/i, Str::Interpol + end + + state :string_intp do + rule %r/[$@][{]/, Str::Interpol, :in_interp + rule %r/[$@][a-z_]\w*/i, Str::Interpol + end + + state :end_part do + # eat the rest of the stream + rule %r/.+/m, Comment::Preproc, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/php.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/php.rb new file mode 100644 index 000000000000..fa254f68cbc1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/php.rb @@ -0,0 +1,377 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class PHP < TemplateLexer + title "PHP" + desc "The PHP scripting language (php.net)" + tag 'php' + aliases 'php', 'php3', 'php4', 'php5' + filenames '*.php', '*.php[345t]','*.phtml', + # Support Drupal file extensions, see: + # https://github.com/gitlabhq/gitlabhq/issues/8900 + '*.module', '*.inc', '*.profile', '*.install', '*.test' + mimetypes 'text/x-php' + + option :start_inline, 'Whether to start with inline php or require <?php ... ?>. (default: best guess)' + option :funcnamehighlighting, 'Whether to highlight builtin functions (default: true)' + option :disabledmodules, 'Disable certain modules from being highlighted as builtins (default: empty)' + + def initialize(*) + super + + # if truthy, the lexer starts highlighting with php code + # (no <?php required) + @start_inline = bool_option(:start_inline) { :guess } + @funcnamehighlighting = bool_option(:funcnamehighlighting) { true } + @disabledmodules = list_option(:disabledmodules) + end + + def self.detect?(text) + return true if text.shebang?('php') + return false if /^<\?hh/ =~ text + return true if /^<\?php/ =~ text + end + + def self.keywords + @keywords ||= Set.new %w( + old_function cfunction + __class__ __dir__ __file__ __function__ __halt_compiler __line__ + __method__ __namespace__ __trait__ abstract and array as break case + catch clone continue declare default die do echo else elseif + enddeclare endfor endforeach endif endswitch endwhile eval exit + extends final finally fn for foreach global goto if implements + include include_once instanceof insteadof isset list new or parent + print private protected public require require_once return self + static switch throw try var while xor yield + ) + end + + def self.builtins + Kernel::load File.join(Lexers::BASE_DIR, 'php/keywords.rb') + builtins + end + + def builtins + return [] unless @funcnamehighlighting + + @builtins ||= Set.new.tap do |builtins| + self.class.builtins.each do |mod, fns| + next if @disabledmodules.include? mod + builtins.merge(fns) + end + end + end + + id = /[\p{L}_][\p{L}\p{N}_]*/ + ns = /(?:#{id}\\)+/ + id_with_ns = /(?:#{ns})?#{id}/ + + start do + case @start_inline + when true + push :php + when :guess + push :start + end + end + + state :escape do + rule %r/\?>/ do + token Comment::Preproc + reset_stack + end + end + + state :return do + rule(//) { pop! } + end + + state :start do + # We enter this state if we aren't sure whether the PHP in the text is + # delimited by <?php (or <?=) tags or not. These two rules check + # whether there is an opening angle bracket and, if there is, delegates + # the tokens before it to the HTML lexer. + rule(/\s*(?=<)/m) { delegate parent; pop! } + rule(/[^$]+(?=<\?(php|=))/i) { delegate parent; pop! } + + rule(//) { goto :php } + end + + state :names do + rule %r/#{id_with_ns}(?=\s*\()/ do |m| + name = m[0].downcase + if self.class.keywords.include? name + token Keyword + elsif self.builtins.include? name + token Name::Builtin + else + token Name::Function + end + end + + rule id_with_ns do |m| + name = m[0].downcase + if name == "use" + push :in_use + token Keyword::Namespace + elsif name == "const" + push :in_const + token Keyword + elsif name == "catch" + push :in_catch + token Keyword + elsif %w(public protected private).include? name + push :in_visibility + token Keyword + elsif name == "stdClass" + token Name::Class + elsif self.class.keywords.include? name + token Keyword + elsif m[0] =~ /^__.*?__$/ + token Name::Builtin + elsif m[0] =~ /^(E|PHP)(_[[:upper:]]+)+$/ + token Keyword::Constant + elsif m[0] =~ /(\\|^)[[:upper:]][[[:upper:]][[:digit:]]_]+$/ + token Name::Constant + elsif m[0] =~ /(\\|^)[[:upper:]][[:alnum:]]*?$/ + token Name::Class + else + token Name + end + end + end + + state :operators do + rule %r/[~!%^&*+\|:.<>\/@-]+/, Operator + end + + state :string do + rule %r/"/, Str::Double, :pop! + rule %r/[^\\{$"]+/, Str::Double + rule %r/\\u\{[0-9a-fA-F]+\}/, Str::Escape + rule %r/\\([efrntv\"$\\]|[0-7]{1,3}|[xX][0-9a-fA-F]{1,2})/, Str::Escape + rule %r/\$#{id}(\[\S+\]|->#{id})?/, Name::Variable + + rule %r/\{\$\{/, Str::Interpol, :string_interp_double + rule %r/\{(?=\$)/, Str::Interpol, :string_interp_single + rule %r/(\{)(\S+)(\})/ do + groups Str::Interpol, Name::Variable, Str::Interpol + end + + rule %r/[${\\]+/, Str::Double + end + + state :string_interp_double do + rule %r/\}\}/, Str::Interpol, :pop! + mixin :php + end + + state :string_interp_single do + rule %r/\}/, Str::Interpol, :pop! + mixin :php + end + + state :values do + # heredocs + rule %r/<<<(["']?)(#{id})\1\n.*?\n\s*\2;?/im, Str::Heredoc + + # numbers + rule %r/(\d[_\d]*)?\.(\d[_\d]*)?(e[+-]?\d[_\d]*)?/i, Num::Float + rule %r/0[0-7][0-7_]*/, Num::Oct + rule %r/0b[01][01_]*/i, Num::Bin + rule %r/0x[a-f0-9][a-f0-9_]*/i, Num::Hex + rule %r/\d[_\d]*/, Num::Integer + + # strings + rule %r/'([^'\\]*(?:\\.[^'\\]*)*)'/, Str::Single + rule %r/`([^`\\]*(?:\\.[^`\\]*)*)`/, Str::Backtick + rule %r/"/, Str::Double, :string + + # functions + rule %r/(function|fn)\b/i do + push :in_function_return + push :in_function_params + push :in_function_name + token Keyword + end + + # constants + rule %r/(true|false|null)\b/i, Keyword::Constant + + # objects + rule %r/new\b/i, Keyword, :in_new + end + + state :variables do + rule %r/\$\{\$+#{id}\}/, Name::Variable + rule %r/\$+#{id}/, Name::Variable + end + + state :whitespace do + rule %r/\s+/, Text + rule %r/#.*?$/, Comment::Single + rule %r(//.*?$), Comment::Single + rule %r(/\*\*(?!/).*?\*/)m, Comment::Doc + rule %r(/\*.*?\*/)m, Comment::Multiline + end + + state :root do + rule %r/<\?(php|=)?/i, Comment::Preproc, :php + rule(/.*?(?=<\?)|.*/m) { delegate parent } + end + + state :php do + mixin :escape + + mixin :whitespace + mixin :variables + mixin :values + + rule %r/(namespace) + (\s+) + (#{id_with_ns})/ix do |m| + groups Keyword::Namespace, Text, Name::Namespace + end + + rule %r/(class|interface|trait|extends|implements) + (\s+) + (#{id_with_ns})/ix do |m| + groups Keyword::Declaration, Text, Name::Class + end + + mixin :names + + rule %r/[;,\(\)\{\}\[\]]/, Punctuation + + mixin :operators + rule %r/[=?]/, Operator + end + + state :in_assign do + rule %r/,/, Punctuation, :pop! + rule %r/[\[\]]/, Punctuation + rule %r/\(/, Punctuation, :in_assign_function + mixin :escape + mixin :whitespace + mixin :values + mixin :variables + mixin :names + mixin :operators + mixin :return + end + + state :in_assign_function do + rule %r/\)/, Punctuation, :pop! + rule %r/,/, Punctuation + mixin :in_assign + end + + state :in_catch do + rule %r/\(/, Punctuation + rule %r/\|/, Operator + rule id, Name::Class + mixin :escape + mixin :whitespace + mixin :return + end + + state :in_const do + rule id, Name::Constant + rule %r/=/, Operator, :in_assign + mixin :escape + mixin :whitespace + mixin :return + end + + state :in_function_body do + rule %r/{/, Punctuation, :push + rule %r/}/, Punctuation, :pop! + mixin :php + end + + state :in_function_name do + rule %r/&/, Operator + rule id, Name + rule %r/\(/, Punctuation, :pop! + mixin :escape + mixin :whitespace + mixin :return + end + + state :in_function_params do + rule %r/\)/, Punctuation, :pop! + rule %r/,/, Punctuation + rule %r/[.]{3}/, Punctuation + rule %r/=/, Operator, :in_assign + rule %r/\??#{id}/, Keyword::Type, :in_assign + mixin :escape + mixin :whitespace + mixin :variables + mixin :return + end + + state :in_function_return do + rule %r/:/, Punctuation + rule %r/use\b/i, Keyword, :in_function_use + rule %r/\??#{id}/, Keyword::Type, :in_assign + rule %r/\{/ do + token Punctuation + goto :in_function_body + end + mixin :escape + mixin :whitespace + mixin :return + end + + state :in_function_use do + rule %r/[,\(]/, Punctuation + rule %r/&/, Operator + rule %r/\)/, Punctuation, :pop! + mixin :escape + mixin :whitespace + mixin :variables + mixin :return + end + + state :in_new do + rule %r/class\b/i do + token Keyword::Declaration + goto :in_new_class + end + rule id_with_ns, Name::Class, :pop! + mixin :escape + mixin :whitespace + mixin :return + end + + state :in_new_class do + rule %r/\}/, Punctuation, :pop! + rule %r/\{/, Punctuation + mixin :php + end + + state :in_use do + rule %r/[,\}]/, Punctuation + rule %r/(function|const)\b/i, Keyword + rule %r/(#{ns})(\{)/ do + groups Name::Namespace, Punctuation + end + rule %r/#{id_with_ns}(_#{id})+/, Name::Function + mixin :escape + mixin :whitespace + mixin :names + mixin :return + end + + state :in_visibility do + rule %r/(?=(abstract|const|function|static)\b)/i, Keyword, :pop! + rule %r/\??#{id}/, Keyword::Type, :pop! + mixin :escape + mixin :whitespace + mixin :return + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/php/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/php/keywords.rb new file mode 100644 index 000000000000..c9c9043a7ab3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/php/keywords.rb @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# DO NOT EDIT +# This file is automatically generated by `rake builtins:php`. +# See tasks/builtins/php.rake for more info. + +module Rouge + module Lexers + class PHP + def self.builtins + @builtins ||= {}.tap do |b| + b["Apache"] = Set.new ["apache_child_terminate", "apache_get_modules", "apache_get_version", "apache_getenv", "apache_lookup_uri", "apache_note", "apache_request_headers", "apache_reset_timeout", "apache_response_headers", "apache_setenv", "getallheaders", "virtual"] + b["APC"] = Set.new ["apc_add", "apc_bin_dump", "apc_bin_dumpfile", "apc_bin_load", "apc_bin_loadfile", "apc_cache_info", "apc_cas", "apc_clear_cache", "apc_compile_file", "apc_dec", "apc_define_constants", "apc_delete_file", "apc_delete", "apc_exists", "apc_fetch", "apc_inc", "apc_load_constants", "apc_sma_info", "apc_store"] + b["APCu"] = Set.new ["apcu_add", "apcu_cache_info", "apcu_cas", "apcu_clear_cache", "apcu_dec", "apcu_delete", "apcu_enabled", "apcu_entry", "apcu_exists", "apcu_fetch", "apcu_inc", "apcu_sma_info", "apcu_store"] + b["APD"] = Set.new ["apd_breakpoint", "apd_callstack", "apd_clunk", "apd_continue", "apd_croak", "apd_dump_function_table", "apd_dump_persistent_resources", "apd_dump_regular_resources", "apd_echo", "apd_get_active_symbols", "apd_set_pprof_trace", "apd_set_session_trace_socket", "apd_set_session_trace", "apd_set_session", "override_function", "rename_function"] + b["Array"] = Set.new ["array_change_key_case", "array_chunk", "array_column", "array_combine", "array_count_values", "array_diff_assoc", "array_diff_key", "array_diff_uassoc", "array_diff_ukey", "array_diff", "array_fill_keys", "array_fill", "array_filter", "array_flip", "array_intersect_assoc", "array_intersect_key", "array_intersect_uassoc", "array_intersect_ukey", "array_intersect", "array_key_exists", "array_key_first", "array_key_last", "array_keys", "array_map", "array_merge_recursive", "array_merge", "array_multisort", "array_pad", "array_pop", "array_product", "array_push", "array_rand", "array_reduce", "array_replace_recursive", "array_replace", "array_reverse", "array_search", "array_shift", "array_slice", "array_splice", "array_sum", "array_udiff_assoc", "array_udiff_uassoc", "array_udiff", "array_uintersect_assoc", "array_uintersect_uassoc", "array_uintersect", "array_unique", "array_unshift", "array_values", "array_walk_recursive", "array_walk", "array", "arsort", "asort", "compact", "count", "current", "each", "end", "extract", "in_array", "key_exists", "key", "krsort", "ksort", "list", "natcasesort", "natsort", "next", "pos", "prev", "range", "reset", "rsort", "shuffle", "sizeof", "sort", "uasort", "uksort", "usort"] + b["BBCode"] = Set.new ["bbcode_add_element", "bbcode_add_smiley", "bbcode_create", "bbcode_destroy", "bbcode_parse", "bbcode_set_arg_parser", "bbcode_set_flags"] + b["BC Math"] = Set.new ["bcadd", "bccomp", "bcdiv", "bcmod", "bcmul", "bcpow", "bcpowmod", "bcscale", "bcsqrt", "bcsub"] + b["bcompiler"] = Set.new ["bcompiler_load_exe", "bcompiler_load", "bcompiler_parse_class", "bcompiler_read", "bcompiler_write_class", "bcompiler_write_constant", "bcompiler_write_exe_footer", "bcompiler_write_file", "bcompiler_write_footer", "bcompiler_write_function", "bcompiler_write_functions_from_file", "bcompiler_write_header", "bcompiler_write_included_filename"] + b["Blenc"] = Set.new ["blenc_encrypt"] + b["Bzip2"] = Set.new ["bzclose", "bzcompress", "bzdecompress", "bzerrno", "bzerror", "bzerrstr", "bzflush", "bzopen", "bzread", "bzwrite"] + b["Cairo"] = Set.new ["cairo_create", "cairo_font_options_create", "cairo_font_options_equal", "cairo_font_options_get_antialias", "cairo_font_options_get_hint_metrics", "cairo_font_options_get_hint_style", "cairo_font_options_get_subpixel_order", "cairo_font_options_hash", "cairo_font_options_merge", "cairo_font_options_set_antialias", "cairo_font_options_set_hint_metrics", "cairo_font_options_set_hint_style", "cairo_font_options_set_subpixel_order", "cairo_font_options_status", "cairo_format_stride_for_width", "cairo_image_surface_create_for_data", "cairo_image_surface_create_from_png", "cairo_image_surface_create", "cairo_image_surface_get_data", "cairo_image_surface_get_format", "cairo_image_surface_get_height", "cairo_image_surface_get_stride", "cairo_image_surface_get_width", "cairo_matrix_create_scale", "cairo_matrix_create_translate", "cairo_matrix_invert", "cairo_matrix_multiply", "cairo_matrix_transform_distance", "cairo_matrix_transform_point", "cairo_matrix_translate", "cairo_pattern_add_color_stop_rgb", "cairo_pattern_add_color_stop_rgba", "cairo_pattern_create_for_surface", "cairo_pattern_create_linear", "cairo_pattern_create_radial", "cairo_pattern_create_rgb", "cairo_pattern_create_rgba", "cairo_pattern_get_color_stop_count", "cairo_pattern_get_color_stop_rgba", "cairo_pattern_get_extend", "cairo_pattern_get_filter", "cairo_pattern_get_linear_points", "cairo_pattern_get_matrix", "cairo_pattern_get_radial_circles", "cairo_pattern_get_rgba", "cairo_pattern_get_surface", "cairo_pattern_get_type", "cairo_pattern_set_extend", "cairo_pattern_set_filter", "cairo_pattern_set_matrix", "cairo_pattern_status", "cairo_pdf_surface_create", "cairo_pdf_surface_set_size", "cairo_ps_get_levels", "cairo_ps_level_to_string", "cairo_ps_surface_create", "cairo_ps_surface_dsc_begin_page_setup", "cairo_ps_surface_dsc_begin_setup", "cairo_ps_surface_dsc_comment", "cairo_ps_surface_get_eps", "cairo_ps_surface_restrict_to_level", "cairo_ps_surface_set_eps", "cairo_ps_surface_set_size", "cairo_scaled_font_create", "cairo_scaled_font_extents", "cairo_scaled_font_get_ctm", "cairo_scaled_font_get_font_face", "cairo_scaled_font_get_font_matrix", "cairo_scaled_font_get_font_options", "cairo_scaled_font_get_scale_matrix", "cairo_scaled_font_get_type", "cairo_scaled_font_glyph_extents", "cairo_scaled_font_status", "cairo_scaled_font_text_extents", "cairo_surface_copy_page", "cairo_surface_create_similar", "cairo_surface_finish", "cairo_surface_flush", "cairo_surface_get_content", "cairo_surface_get_device_offset", "cairo_surface_get_font_options", "cairo_surface_get_type", "cairo_surface_mark_dirty_rectangle", "cairo_surface_mark_dirty", "cairo_surface_set_device_offset", "cairo_surface_set_fallback_resolution", "cairo_surface_show_page", "cairo_surface_status", "cairo_surface_write_to_png", "cairo_svg_surface_create", "cairo_svg_surface_restrict_to_version", "cairo_svg_version_to_string"] + b["Calendar"] = Set.new ["cal_days_in_month", "cal_from_jd", "cal_info", "cal_to_jd", "easter_date", "easter_days", "frenchtojd", "gregoriantojd", "jddayofweek", "jdmonthname", "jdtofrench", "jdtogregorian", "jdtojewish", "jdtojulian", "jdtounix", "jewishtojd", "juliantojd", "unixtojd"] + b["chdb"] = Set.new ["chdb_create"] + b["Classkit"] = Set.new ["classkit_import", "classkit_method_add", "classkit_method_copy", "classkit_method_redefine", "classkit_method_remove", "classkit_method_rename"] + b["Classes/Object"] = Set.new ["__autoload", "call_user_method_array", "call_user_method", "class_alias", "class_exists", "get_called_class", "get_class_methods", "get_class_vars", "get_class", "get_declared_classes", "get_declared_interfaces", "get_declared_traits", "get_object_vars", "get_parent_class", "interface_exists", "is_a", "is_subclass_of", "method_exists", "property_exists", "trait_exists"] + b["CommonMark"] = Set.new ["CommonMark\\Parse", "CommonMark\\Render", "CommonMark\\Render\\HTML", "CommonMark\\Render\\Latex", "CommonMark\\Render\\Man", "CommonMark\\Render\\XML"] + b["COM"] = Set.new ["com_create_guid", "com_event_sink", "com_get_active_object", "com_load_typelib", "com_message_pump", "com_print_typeinfo", "variant_abs", "variant_add", "variant_and", "variant_cast", "variant_cat", "variant_cmp", "variant_date_from_timestamp", "variant_date_to_timestamp", "variant_div", "variant_eqv", "variant_fix", "variant_get_type", "variant_idiv", "variant_imp", "variant_int", "variant_mod", "variant_mul", "variant_neg", "variant_not", "variant_or", "variant_pow", "variant_round", "variant_set_type", "variant_set", "variant_sub", "variant_xor"] + b["Crack"] = Set.new ["crack_check", "crack_closedict", "crack_getlastmessage", "crack_opendict"] + b["CSPRNG"] = Set.new ["random_bytes", "random_int"] + b["Ctype"] = Set.new ["ctype_alnum", "ctype_alpha", "ctype_cntrl", "ctype_digit", "ctype_graph", "ctype_lower", "ctype_print", "ctype_punct", "ctype_space", "ctype_upper", "ctype_xdigit"] + b["CUBRID"] = Set.new ["cubrid_bind", "cubrid_close_prepare", "cubrid_close_request", "cubrid_col_get", "cubrid_col_size", "cubrid_column_names", "cubrid_column_types", "cubrid_commit", "cubrid_connect_with_url", "cubrid_connect", "cubrid_current_oid", "cubrid_disconnect", "cubrid_drop", "cubrid_error_code_facility", "cubrid_error_code", "cubrid_error_msg", "cubrid_execute", "cubrid_fetch", "cubrid_free_result", "cubrid_get_autocommit", "cubrid_get_charset", "cubrid_get_class_name", "cubrid_get_client_info", "cubrid_get_db_parameter", "cubrid_get_query_timeout", "cubrid_get_server_info", "cubrid_get", "cubrid_insert_id", "cubrid_is_instance", "cubrid_lob_close", "cubrid_lob_export", "cubrid_lob_get", "cubrid_lob_send", "cubrid_lob_size", "cubrid_lob2_bind", "cubrid_lob2_close", "cubrid_lob2_export", "cubrid_lob2_import", "cubrid_lob2_new", "cubrid_lob2_read", "cubrid_lob2_seek64", "cubrid_lob2_seek", "cubrid_lob2_size64", "cubrid_lob2_size", "cubrid_lob2_tell64", "cubrid_lob2_tell", "cubrid_lob2_write", "cubrid_lock_read", "cubrid_lock_write", "cubrid_move_cursor", "cubrid_next_result", "cubrid_num_cols", "cubrid_num_rows", "cubrid_pconnect_with_url", "cubrid_pconnect", "cubrid_prepare", "cubrid_put", "cubrid_rollback", "cubrid_schema", "cubrid_seq_drop", "cubrid_seq_insert", "cubrid_seq_put", "cubrid_set_add", "cubrid_set_autocommit", "cubrid_set_db_parameter", "cubrid_set_drop", "cubrid_set_query_timeout", "cubrid_version"] + b["cURL"] = Set.new ["curl_close", "curl_copy_handle", "curl_errno", "curl_error", "curl_escape", "curl_exec", "curl_file_create", "curl_getinfo", "curl_init", "curl_multi_add_handle", "curl_multi_close", "curl_multi_errno", "curl_multi_exec", "curl_multi_getcontent", "curl_multi_info_read", "curl_multi_init", "curl_multi_remove_handle", "curl_multi_select", "curl_multi_setopt", "curl_multi_strerror", "curl_pause", "curl_reset", "curl_setopt_array", "curl_setopt", "curl_share_close", "curl_share_errno", "curl_share_init", "curl_share_setopt", "curl_share_strerror", "curl_strerror", "curl_unescape", "curl_version"] + b["Cyrus"] = Set.new ["cyrus_authenticate", "cyrus_bind", "cyrus_close", "cyrus_connect", "cyrus_query", "cyrus_unbind"] + b["Date/Time"] = Set.new ["checkdate", "date_add", "date_create_from_format", "date_create_immutable_from_format", "date_create_immutable", "date_create", "date_date_set", "date_default_timezone_get", "date_default_timezone_set", "date_diff", "date_format", "date_get_last_errors", "date_interval_create_from_date_string", "date_interval_format", "date_isodate_set", "date_modify", "date_offset_get", "date_parse_from_format", "date_parse", "date_sub", "date_sun_info", "date_sunrise", "date_sunset", "date_time_set", "date_timestamp_get", "date_timestamp_set", "date_timezone_get", "date_timezone_set", "date", "getdate", "gettimeofday", "gmdate", "gmmktime", "gmstrftime", "idate", "localtime", "microtime", "mktime", "strftime", "strptime", "strtotime", "time", "timezone_abbreviations_list", "timezone_identifiers_list", "timezone_location_get", "timezone_name_from_abbr", "timezone_name_get", "timezone_offset_get", "timezone_open", "timezone_transitions_get", "timezone_version_get"] + b["DBA"] = Set.new ["dba_close", "dba_delete", "dba_exists", "dba_fetch", "dba_firstkey", "dba_handlers", "dba_insert", "dba_key_split", "dba_list", "dba_nextkey", "dba_open", "dba_optimize", "dba_popen", "dba_replace", "dba_sync"] + b["dBase"] = Set.new ["dbase_add_record", "dbase_close", "dbase_create", "dbase_delete_record", "dbase_get_header_info", "dbase_get_record_with_names", "dbase_get_record", "dbase_numfields", "dbase_numrecords", "dbase_open", "dbase_pack", "dbase_replace_record"] + b["DB++"] = Set.new ["dbplus_add", "dbplus_aql", "dbplus_chdir", "dbplus_close", "dbplus_curr", "dbplus_errcode", "dbplus_errno", "dbplus_find", "dbplus_first", "dbplus_flush", "dbplus_freealllocks", "dbplus_freelock", "dbplus_freerlocks", "dbplus_getlock", "dbplus_getunique", "dbplus_info", "dbplus_last", "dbplus_lockrel", "dbplus_next", "dbplus_open", "dbplus_prev", "dbplus_rchperm", "dbplus_rcreate", "dbplus_rcrtexact", "dbplus_rcrtlike", "dbplus_resolve", "dbplus_restorepos", "dbplus_rkeys", "dbplus_ropen", "dbplus_rquery", "dbplus_rrename", "dbplus_rsecindex", "dbplus_runlink", "dbplus_rzap", "dbplus_savepos", "dbplus_setindex", "dbplus_setindexbynumber", "dbplus_sql", "dbplus_tcl", "dbplus_tremove", "dbplus_undo", "dbplus_undoprepare", "dbplus_unlockrel", "dbplus_unselect", "dbplus_update", "dbplus_xlockrel", "dbplus_xunlockrel"] + b["dbx"] = Set.new ["dbx_close", "dbx_compare", "dbx_connect", "dbx_error", "dbx_escape_string", "dbx_fetch_row", "dbx_query", "dbx_sort"] + b["Direct IO"] = Set.new ["dio_close", "dio_fcntl", "dio_open", "dio_read", "dio_seek", "dio_stat", "dio_tcsetattr", "dio_truncate", "dio_write"] + b["Directory"] = Set.new ["chdir", "chroot", "closedir", "dir", "getcwd", "opendir", "readdir", "rewinddir", "scandir"] + b["DOM"] = Set.new ["dom_import_simplexml"] + b["Eio"] = Set.new ["eio_busy", "eio_cancel", "eio_chmod", "eio_chown", "eio_close", "eio_custom", "eio_dup2", "eio_event_loop", "eio_fallocate", "eio_fchmod", "eio_fchown", "eio_fdatasync", "eio_fstat", "eio_fstatvfs", "eio_fsync", "eio_ftruncate", "eio_futime", "eio_get_event_stream", "eio_get_last_error", "eio_grp_add", "eio_grp_cancel", "eio_grp_limit", "eio_grp", "eio_init", "eio_link", "eio_lstat", "eio_mkdir", "eio_mknod", "eio_nop", "eio_npending", "eio_nready", "eio_nreqs", "eio_nthreads", "eio_open", "eio_poll", "eio_read", "eio_readahead", "eio_readdir", "eio_readlink", "eio_realpath", "eio_rename", "eio_rmdir", "eio_seek", "eio_sendfile", "eio_set_max_idle", "eio_set_max_parallel", "eio_set_max_poll_reqs", "eio_set_max_poll_time", "eio_set_min_parallel", "eio_stat", "eio_statvfs", "eio_symlink", "eio_sync_file_range", "eio_sync", "eio_syncfs", "eio_truncate", "eio_unlink", "eio_utime", "eio_write"] + b["Enchant"] = Set.new ["enchant_broker_describe", "enchant_broker_dict_exists", "enchant_broker_free_dict", "enchant_broker_free", "enchant_broker_get_dict_path", "enchant_broker_get_error", "enchant_broker_init", "enchant_broker_list_dicts", "enchant_broker_request_dict", "enchant_broker_request_pwl_dict", "enchant_broker_set_dict_path", "enchant_broker_set_ordering", "enchant_dict_add_to_personal", "enchant_dict_add_to_session", "enchant_dict_check", "enchant_dict_describe", "enchant_dict_get_error", "enchant_dict_is_in_session", "enchant_dict_quick_check", "enchant_dict_store_replacement", "enchant_dict_suggest"] + b["Error Handling"] = Set.new ["debug_backtrace", "debug_print_backtrace", "error_clear_last", "error_get_last", "error_log", "error_reporting", "restore_error_handler", "restore_exception_handler", "set_error_handler", "set_exception_handler", "trigger_error", "user_error"] + b["Program execution"] = Set.new ["escapeshellarg", "escapeshellcmd", "exec", "passthru", "proc_close", "proc_get_status", "proc_nice", "proc_open", "proc_terminate", "shell_exec", "system"] + b["Exif"] = Set.new ["exif_imagetype", "exif_read_data", "exif_tagname", "exif_thumbnail", "read_exif_data"] + b["Expect"] = Set.new ["expect_expectl", "expect_popen"] + b["FAM"] = Set.new ["fam_cancel_monitor", "fam_close", "fam_monitor_collection", "fam_monitor_directory", "fam_monitor_file", "fam_next_event", "fam_open", "fam_pending", "fam_resume_monitor", "fam_suspend_monitor"] + b["Fann"] = Set.new ["fann_cascadetrain_on_data", "fann_cascadetrain_on_file", "fann_clear_scaling_params", "fann_copy", "fann_create_from_file", "fann_create_shortcut_array", "fann_create_shortcut", "fann_create_sparse_array", "fann_create_sparse", "fann_create_standard_array", "fann_create_standard", "fann_create_train_from_callback", "fann_create_train", "fann_descale_input", "fann_descale_output", "fann_descale_train", "fann_destroy_train", "fann_destroy", "fann_duplicate_train_data", "fann_get_activation_function", "fann_get_activation_steepness", "fann_get_bias_array", "fann_get_bit_fail_limit", "fann_get_bit_fail", "fann_get_cascade_activation_functions_count", "fann_get_cascade_activation_functions", "fann_get_cascade_activation_steepnesses_count", "fann_get_cascade_activation_steepnesses", "fann_get_cascade_candidate_change_fraction", "fann_get_cascade_candidate_limit", "fann_get_cascade_candidate_stagnation_epochs", "fann_get_cascade_max_cand_epochs", "fann_get_cascade_max_out_epochs", "fann_get_cascade_min_cand_epochs", "fann_get_cascade_min_out_epochs", "fann_get_cascade_num_candidate_groups", "fann_get_cascade_num_candidates", "fann_get_cascade_output_change_fraction", "fann_get_cascade_output_stagnation_epochs", "fann_get_cascade_weight_multiplier", "fann_get_connection_array", "fann_get_connection_rate", "fann_get_errno", "fann_get_errstr", "fann_get_layer_array", "fann_get_learning_momentum", "fann_get_learning_rate", "fann_get_MSE", "fann_get_network_type", "fann_get_num_input", "fann_get_num_layers", "fann_get_num_output", "fann_get_quickprop_decay", "fann_get_quickprop_mu", "fann_get_rprop_decrease_factor", "fann_get_rprop_delta_max", "fann_get_rprop_delta_min", "fann_get_rprop_delta_zero", "fann_get_rprop_increase_factor", "fann_get_sarprop_step_error_shift", "fann_get_sarprop_step_error_threshold_factor", "fann_get_sarprop_temperature", "fann_get_sarprop_weight_decay_shift", "fann_get_total_connections", "fann_get_total_neurons", "fann_get_train_error_function", "fann_get_train_stop_function", "fann_get_training_algorithm", "fann_init_weights", "fann_length_train_data", "fann_merge_train_data", "fann_num_input_train_data", "fann_num_output_train_data", "fann_print_error", "fann_randomize_weights", "fann_read_train_from_file", "fann_reset_errno", "fann_reset_errstr", "fann_reset_MSE", "fann_run", "fann_save_train", "fann_save", "fann_scale_input_train_data", "fann_scale_input", "fann_scale_output_train_data", "fann_scale_output", "fann_scale_train_data", "fann_scale_train", "fann_set_activation_function_hidden", "fann_set_activation_function_layer", "fann_set_activation_function_output", "fann_set_activation_function", "fann_set_activation_steepness_hidden", "fann_set_activation_steepness_layer", "fann_set_activation_steepness_output", "fann_set_activation_steepness", "fann_set_bit_fail_limit", "fann_set_callback", "fann_set_cascade_activation_functions", "fann_set_cascade_activation_steepnesses", "fann_set_cascade_candidate_change_fraction", "fann_set_cascade_candidate_limit", "fann_set_cascade_candidate_stagnation_epochs", "fann_set_cascade_max_cand_epochs", "fann_set_cascade_max_out_epochs", "fann_set_cascade_min_cand_epochs", "fann_set_cascade_min_out_epochs", "fann_set_cascade_num_candidate_groups", "fann_set_cascade_output_change_fraction", "fann_set_cascade_output_stagnation_epochs", "fann_set_cascade_weight_multiplier", "fann_set_error_log", "fann_set_input_scaling_params", "fann_set_learning_momentum", "fann_set_learning_rate", "fann_set_output_scaling_params", "fann_set_quickprop_decay", "fann_set_quickprop_mu", "fann_set_rprop_decrease_factor", "fann_set_rprop_delta_max", "fann_set_rprop_delta_min", "fann_set_rprop_delta_zero", "fann_set_rprop_increase_factor", "fann_set_sarprop_step_error_shift", "fann_set_sarprop_step_error_threshold_factor", "fann_set_sarprop_temperature", "fann_set_sarprop_weight_decay_shift", "fann_set_scaling_params", "fann_set_train_error_function", "fann_set_train_stop_function", "fann_set_training_algorithm", "fann_set_weight_array", "fann_set_weight", "fann_shuffle_train_data", "fann_subset_train_data", "fann_test_data", "fann_test", "fann_train_epoch", "fann_train_on_data", "fann_train_on_file", "fann_train"] + b["FrontBase"] = Set.new ["fbsql_affected_rows", "fbsql_autocommit", "fbsql_blob_size", "fbsql_change_user", "fbsql_clob_size", "fbsql_close", "fbsql_commit", "fbsql_connect", "fbsql_create_blob", "fbsql_create_clob", "fbsql_create_db", "fbsql_data_seek", "fbsql_database_password", "fbsql_database", "fbsql_db_query", "fbsql_db_status", "fbsql_drop_db", "fbsql_errno", "fbsql_error", "fbsql_fetch_array", "fbsql_fetch_assoc", "fbsql_fetch_field", "fbsql_fetch_lengths", "fbsql_fetch_object", "fbsql_fetch_row", "fbsql_field_flags", "fbsql_field_len", "fbsql_field_name", "fbsql_field_seek", "fbsql_field_table", "fbsql_field_type", "fbsql_free_result", "fbsql_get_autostart_info", "fbsql_hostname", "fbsql_insert_id", "fbsql_list_dbs", "fbsql_list_fields", "fbsql_list_tables", "fbsql_next_result", "fbsql_num_fields", "fbsql_num_rows", "fbsql_password", "fbsql_pconnect", "fbsql_query", "fbsql_read_blob", "fbsql_read_clob", "fbsql_result", "fbsql_rollback", "fbsql_rows_fetched", "fbsql_select_db", "fbsql_set_characterset", "fbsql_set_lob_mode", "fbsql_set_password", "fbsql_set_transaction", "fbsql_start_db", "fbsql_stop_db", "fbsql_table_name", "fbsql_tablename", "fbsql_username", "fbsql_warnings"] + b["FDF"] = Set.new ["fdf_add_doc_javascript", "fdf_add_template", "fdf_close", "fdf_create", "fdf_enum_values", "fdf_errno", "fdf_error", "fdf_get_ap", "fdf_get_attachment", "fdf_get_encoding", "fdf_get_file", "fdf_get_flags", "fdf_get_opt", "fdf_get_status", "fdf_get_value", "fdf_get_version", "fdf_header", "fdf_next_field_name", "fdf_open_string", "fdf_open", "fdf_remove_item", "fdf_save_string", "fdf_save", "fdf_set_ap", "fdf_set_encoding", "fdf_set_file", "fdf_set_flags", "fdf_set_javascript_action", "fdf_set_on_import_javascript", "fdf_set_opt", "fdf_set_status", "fdf_set_submit_form_action", "fdf_set_target_frame", "fdf_set_value", "fdf_set_version"] + b["Fileinfo"] = Set.new ["finfo_buffer", "finfo_close", "finfo_file", "finfo_open", "finfo_set_flags", "mime_content_type"] + b["filePro"] = Set.new ["filepro_fieldcount", "filepro_fieldname", "filepro_fieldtype", "filepro_fieldwidth", "filepro_retrieve", "filepro_rowcount", "filepro"] + b["Filesystem"] = Set.new ["basename", "chgrp", "chmod", "chown", "clearstatcache", "copy", "delete", "dirname", "disk_free_space", "disk_total_space", "diskfreespace", "fclose", "feof", "fflush", "fgetc", "fgetcsv", "fgets", "fgetss", "file_exists", "file_get_contents", "file_put_contents", "file", "fileatime", "filectime", "filegroup", "fileinode", "filemtime", "fileowner", "fileperms", "filesize", "filetype", "flock", "fnmatch", "fopen", "fpassthru", "fputcsv", "fputs", "fread", "fscanf", "fseek", "fstat", "ftell", "ftruncate", "fwrite", "glob", "is_dir", "is_executable", "is_file", "is_link", "is_readable", "is_uploaded_file", "is_writable", "is_writeable", "lchgrp", "lchown", "link", "linkinfo", "lstat", "mkdir", "move_uploaded_file", "parse_ini_file", "parse_ini_string", "pathinfo", "pclose", "popen", "readfile", "readlink", "realpath_cache_get", "realpath_cache_size", "realpath", "rename", "rewind", "rmdir", "set_file_buffer", "stat", "symlink", "tempnam", "tmpfile", "touch", "umask", "unlink"] + b["Filter"] = Set.new ["filter_has_var", "filter_id", "filter_input_array", "filter_input", "filter_list", "filter_var_array", "filter_var"] + b["FPM"] = Set.new ["fastcgi_finish_request"] + b["FriBiDi"] = Set.new ["fribidi_log2vis"] + b["FTP"] = Set.new ["ftp_alloc", "ftp_append", "ftp_cdup", "ftp_chdir", "ftp_chmod", "ftp_close", "ftp_connect", "ftp_delete", "ftp_exec", "ftp_fget", "ftp_fput", "ftp_get_option", "ftp_get", "ftp_login", "ftp_mdtm", "ftp_mkdir", "ftp_mlsd", "ftp_nb_continue", "ftp_nb_fget", "ftp_nb_fput", "ftp_nb_get", "ftp_nb_put", "ftp_nlist", "ftp_pasv", "ftp_put", "ftp_pwd", "ftp_quit", "ftp_raw", "ftp_rawlist", "ftp_rename", "ftp_rmdir", "ftp_set_option", "ftp_site", "ftp_size", "ftp_ssl_connect", "ftp_systype"] + b["Function handling"] = Set.new ["call_user_func_array", "call_user_func", "create_function", "forward_static_call_array", "forward_static_call", "func_get_arg", "func_get_args", "func_num_args", "function_exists", "get_defined_functions", "register_shutdown_function", "register_tick_function", "unregister_tick_function"] + b["GeoIP"] = Set.new ["geoip_asnum_by_name", "geoip_continent_code_by_name", "geoip_country_code_by_name", "geoip_country_code3_by_name", "geoip_country_name_by_name", "geoip_database_info", "geoip_db_avail", "geoip_db_filename", "geoip_db_get_all_info", "geoip_domain_by_name", "geoip_id_by_name", "geoip_isp_by_name", "geoip_netspeedcell_by_name", "geoip_org_by_name", "geoip_record_by_name", "geoip_region_by_name", "geoip_region_name_by_code", "geoip_setup_custom_directory", "geoip_time_zone_by_country_and_region"] + b["Gettext"] = Set.new ["bind_textdomain_codeset", "bindtextdomain", "dcgettext", "dcngettext", "dgettext", "dngettext", "gettext", "ngettext", "textdomain"] + b["GMP"] = Set.new ["gmp_abs", "gmp_add", "gmp_and", "gmp_binomial", "gmp_clrbit", "gmp_cmp", "gmp_com", "gmp_div_q", "gmp_div_qr", "gmp_div_r", "gmp_div", "gmp_divexact", "gmp_export", "gmp_fact", "gmp_gcd", "gmp_gcdext", "gmp_hamdist", "gmp_import", "gmp_init", "gmp_intval", "gmp_invert", "gmp_jacobi", "gmp_kronecker", "gmp_lcm", "gmp_legendre", "gmp_mod", "gmp_mul", "gmp_neg", "gmp_nextprime", "gmp_or", "gmp_perfect_power", "gmp_perfect_square", "gmp_popcount", "gmp_pow", "gmp_powm", "gmp_prob_prime", "gmp_random_bits", "gmp_random_range", "gmp_random_seed", "gmp_random", "gmp_root", "gmp_rootrem", "gmp_scan0", "gmp_scan1", "gmp_setbit", "gmp_sign", "gmp_sqrt", "gmp_sqrtrem", "gmp_strval", "gmp_sub", "gmp_testbit", "gmp_xor"] + b["GnuPG"] = Set.new ["gnupg_adddecryptkey", "gnupg_addencryptkey", "gnupg_addsignkey", "gnupg_cleardecryptkeys", "gnupg_clearencryptkeys", "gnupg_clearsignkeys", "gnupg_decrypt", "gnupg_decryptverify", "gnupg_encrypt", "gnupg_encryptsign", "gnupg_export", "gnupg_geterror", "gnupg_getprotocol", "gnupg_import", "gnupg_init", "gnupg_keyinfo", "gnupg_setarmor", "gnupg_seterrormode", "gnupg_setsignmode", "gnupg_sign", "gnupg_verify"] + b["Gupnp"] = Set.new ["gupnp_context_get_host_ip", "gupnp_context_get_port", "gupnp_context_get_subscription_timeout", "gupnp_context_host_path", "gupnp_context_new", "gupnp_context_set_subscription_timeout", "gupnp_context_timeout_add", "gupnp_context_unhost_path", "gupnp_control_point_browse_start", "gupnp_control_point_browse_stop", "gupnp_control_point_callback_set", "gupnp_control_point_new", "gupnp_device_action_callback_set", "gupnp_device_info_get_service", "gupnp_device_info_get", "gupnp_root_device_get_available", "gupnp_root_device_get_relative_location", "gupnp_root_device_new", "gupnp_root_device_set_available", "gupnp_root_device_start", "gupnp_root_device_stop", "gupnp_service_action_get", "gupnp_service_action_return_error", "gupnp_service_action_return", "gupnp_service_action_set", "gupnp_service_freeze_notify", "gupnp_service_info_get_introspection", "gupnp_service_info_get", "gupnp_service_introspection_get_state_variable", "gupnp_service_notify", "gupnp_service_proxy_action_get", "gupnp_service_proxy_action_set", "gupnp_service_proxy_add_notify", "gupnp_service_proxy_callback_set", "gupnp_service_proxy_get_subscribed", "gupnp_service_proxy_remove_notify", "gupnp_service_proxy_set_subscribed", "gupnp_service_thaw_notify"] + b["Hash"] = Set.new ["hash_algos", "hash_copy", "hash_equals", "hash_file", "hash_final", "hash_hkdf", "hash_hmac_algos", "hash_hmac_file", "hash_hmac", "hash_init", "hash_pbkdf2", "hash_update_file", "hash_update_stream", "hash_update", "hash"] + b["Hyperwave API"] = Set.new ["hwapi_attribute_new", "hwapi_content_new", "hwapi_hgcsp", "hwapi_object_new"] + b["Firebird/InterBase"] = Set.new ["fbird_add_user", "fbird_affected_rows", "fbird_backup", "fbird_blob_add", "fbird_blob_cancel", "fbird_blob_close", "fbird_blob_create", "fbird_blob_echo", "fbird_blob_get", "fbird_blob_import", "fbird_blob_info", "fbird_blob_open", "fbird_close", "fbird_commit_ret", "fbird_commit", "fbird_connect", "fbird_db_info", "fbird_delete_user", "fbird_drop_db", "fbird_errcode", "fbird_errmsg", "fbird_execute", "fbird_fetch_assoc", "fbird_fetch_object", "fbird_fetch_row", "fbird_field_info", "fbird_free_event_handler", "fbird_free_query", "fbird_free_result", "fbird_gen_id", "fbird_maintain_db", "fbird_modify_user", "fbird_name_result", "fbird_num_fields", "fbird_num_params", "fbird_param_info", "fbird_pconnect", "fbird_prepare", "fbird_query", "fbird_restore", "fbird_rollback_ret", "fbird_rollback", "fbird_server_info", "fbird_service_attach", "fbird_service_detach", "fbird_set_event_handler", "fbird_trans", "fbird_wait_event", "ibase_add_user", "ibase_affected_rows", "ibase_backup", "ibase_blob_add", "ibase_blob_cancel", "ibase_blob_close", "ibase_blob_create", "ibase_blob_echo", "ibase_blob_get", "ibase_blob_import", "ibase_blob_info", "ibase_blob_open", "ibase_close", "ibase_commit_ret", "ibase_commit", "ibase_connect", "ibase_db_info", "ibase_delete_user", "ibase_drop_db", "ibase_errcode", "ibase_errmsg", "ibase_execute", "ibase_fetch_assoc", "ibase_fetch_object", "ibase_fetch_row", "ibase_field_info", "ibase_free_event_handler", "ibase_free_query", "ibase_free_result", "ibase_gen_id", "ibase_maintain_db", "ibase_modify_user", "ibase_name_result", "ibase_num_fields", "ibase_num_params", "ibase_param_info", "ibase_pconnect", "ibase_prepare", "ibase_query", "ibase_restore", "ibase_rollback_ret", "ibase_rollback", "ibase_server_info", "ibase_service_attach", "ibase_service_detach", "ibase_set_event_handler", "ibase_trans", "ibase_wait_event"] + b["IBM DB2"] = Set.new ["db2_autocommit", "db2_bind_param", "db2_client_info", "db2_close", "db2_column_privileges", "db2_columns", "db2_commit", "db2_conn_error", "db2_conn_errormsg", "db2_connect", "db2_cursor_type", "db2_escape_string", "db2_exec", "db2_execute", "db2_fetch_array", "db2_fetch_assoc", "db2_fetch_both", "db2_fetch_object", "db2_fetch_row", "db2_field_display_size", "db2_field_name", "db2_field_num", "db2_field_precision", "db2_field_scale", "db2_field_type", "db2_field_width", "db2_foreign_keys", "db2_free_result", "db2_free_stmt", "db2_get_option", "db2_last_insert_id", "db2_lob_read", "db2_next_result", "db2_num_fields", "db2_num_rows", "db2_pclose", "db2_pconnect", "db2_prepare", "db2_primary_keys", "db2_procedure_columns", "db2_procedures", "db2_result", "db2_rollback", "db2_server_info", "db2_set_option", "db2_special_columns", "db2_statistics", "db2_stmt_error", "db2_stmt_errormsg", "db2_table_privileges", "db2_tables"] + b["iconv"] = Set.new ["iconv_get_encoding", "iconv_mime_decode_headers", "iconv_mime_decode", "iconv_mime_encode", "iconv_set_encoding", "iconv_strlen", "iconv_strpos", "iconv_strrpos", "iconv_substr", "iconv", "ob_iconv_handler"] + b["ID3"] = Set.new ["id3_get_frame_long_name", "id3_get_frame_short_name", "id3_get_genre_id", "id3_get_genre_list", "id3_get_genre_name", "id3_get_tag", "id3_get_version", "id3_remove_tag", "id3_set_tag"] + b["Informix"] = Set.new ["ifx_affected_rows", "ifx_blobinfile_mode", "ifx_byteasvarchar", "ifx_close", "ifx_connect", "ifx_copy_blob", "ifx_create_blob", "ifx_create_char", "ifx_do", "ifx_error", "ifx_errormsg", "ifx_fetch_row", "ifx_fieldproperties", "ifx_fieldtypes", "ifx_free_blob", "ifx_free_char", "ifx_free_result", "ifx_get_blob", "ifx_get_char", "ifx_getsqlca", "ifx_htmltbl_result", "ifx_nullformat", "ifx_num_fields", "ifx_num_rows", "ifx_pconnect", "ifx_prepare", "ifx_query", "ifx_textasvarchar", "ifx_update_blob", "ifx_update_char", "ifxus_close_slob", "ifxus_create_slob", "ifxus_free_slob", "ifxus_open_slob", "ifxus_read_slob", "ifxus_seek_slob", "ifxus_tell_slob", "ifxus_write_slob"] + b["IIS"] = Set.new ["iis_add_server", "iis_get_dir_security", "iis_get_script_map", "iis_get_server_by_comment", "iis_get_server_by_path", "iis_get_server_rights", "iis_get_service_state", "iis_remove_server", "iis_set_app_settings", "iis_set_dir_security", "iis_set_script_map", "iis_set_server_rights", "iis_start_server", "iis_start_service", "iis_stop_server", "iis_stop_service"] + b["GD and Image"] = Set.new ["gd_info", "getimagesize", "getimagesizefromstring", "image_type_to_extension", "image_type_to_mime_type", "image2wbmp", "imageaffine", "imageaffinematrixconcat", "imageaffinematrixget", "imagealphablending", "imageantialias", "imagearc", "imagebmp", "imagechar", "imagecharup", "imagecolorallocate", "imagecolorallocatealpha", "imagecolorat", "imagecolorclosest", "imagecolorclosestalpha", "imagecolorclosesthwb", "imagecolordeallocate", "imagecolorexact", "imagecolorexactalpha", "imagecolormatch", "imagecolorresolve", "imagecolorresolvealpha", "imagecolorset", "imagecolorsforindex", "imagecolorstotal", "imagecolortransparent", "imageconvolution", "imagecopy", "imagecopymerge", "imagecopymergegray", "imagecopyresampled", "imagecopyresized", "imagecreate", "imagecreatefrombmp", "imagecreatefromgd2", "imagecreatefromgd2part", "imagecreatefromgd", "imagecreatefromgif", "imagecreatefromjpeg", "imagecreatefrompng", "imagecreatefromstring", "imagecreatefromwbmp", "imagecreatefromwebp", "imagecreatefromxbm", "imagecreatefromxpm", "imagecreatetruecolor", "imagecrop", "imagecropauto", "imagedashedline", "imagedestroy", "imageellipse", "imagefill", "imagefilledarc", "imagefilledellipse", "imagefilledpolygon", "imagefilledrectangle", "imagefilltoborder", "imagefilter", "imageflip", "imagefontheight", "imagefontwidth", "imageftbbox", "imagefttext", "imagegammacorrect", "imagegd2", "imagegd", "imagegetclip", "imagegif", "imagegrabscreen", "imagegrabwindow", "imageinterlace", "imageistruecolor", "imagejpeg", "imagelayereffect", "imageline", "imageloadfont", "imageopenpolygon", "imagepalettecopy", "imagepalettetotruecolor", "imagepng", "imagepolygon", "imagepsbbox", "imagepsencodefont", "imagepsextendfont", "imagepsfreefont", "imagepsloadfont", "imagepsslantfont", "imagepstext", "imagerectangle", "imageresolution", "imagerotate", "imagesavealpha", "imagescale", "imagesetbrush", "imagesetclip", "imagesetinterpolation", "imagesetpixel", "imagesetstyle", "imagesetthickness", "imagesettile", "imagestring", "imagestringup", "imagesx", "imagesy", "imagetruecolortopalette", "imagettfbbox", "imagettftext", "imagetypes", "imagewbmp", "imagewebp", "imagexbm", "iptcembed", "iptcparse", "jpeg2wbmp", "png2wbmp"] + b["IMAP"] = Set.new ["imap_8bit", "imap_alerts", "imap_append", "imap_base64", "imap_binary", "imap_body", "imap_bodystruct", "imap_check", "imap_clearflag_full", "imap_close", "imap_create", "imap_createmailbox", "imap_delete", "imap_deletemailbox", "imap_errors", "imap_expunge", "imap_fetch_overview", "imap_fetchbody", "imap_fetchheader", "imap_fetchmime", "imap_fetchstructure", "imap_fetchtext", "imap_gc", "imap_get_quota", "imap_get_quotaroot", "imap_getacl", "imap_getmailboxes", "imap_getsubscribed", "imap_header", "imap_headerinfo", "imap_headers", "imap_last_error", "imap_list", "imap_listmailbox", "imap_listscan", "imap_listsubscribed", "imap_lsub", "imap_mail_compose", "imap_mail_copy", "imap_mail_move", "imap_mail", "imap_mailboxmsginfo", "imap_mime_header_decode", "imap_msgno", "imap_mutf7_to_utf8", "imap_num_msg", "imap_num_recent", "imap_open", "imap_ping", "imap_qprint", "imap_rename", "imap_renamemailbox", "imap_reopen", "imap_rfc822_parse_adrlist", "imap_rfc822_parse_headers", "imap_rfc822_write_address", "imap_savebody", "imap_scan", "imap_scanmailbox", "imap_search", "imap_set_quota", "imap_setacl", "imap_setflag_full", "imap_sort", "imap_status", "imap_subscribe", "imap_thread", "imap_timeout", "imap_uid", "imap_undelete", "imap_unsubscribe", "imap_utf7_decode", "imap_utf7_encode", "imap_utf8_to_mutf7", "imap_utf8"] + b["inclued"] = Set.new ["inclued_get_data"] + b["PHP Options/Info"] = Set.new ["assert_options", "assert", "cli_get_process_title", "cli_set_process_title", "dl", "extension_loaded", "gc_collect_cycles", "gc_disable", "gc_enable", "gc_enabled", "gc_mem_caches", "gc_status", "get_cfg_var", "get_current_user", "get_defined_constants", "get_extension_funcs", "get_include_path", "get_included_files", "get_loaded_extensions", "get_magic_quotes_gpc", "get_magic_quotes_runtime", "get_required_files", "get_resources", "getenv", "getlastmod", "getmygid", "getmyinode", "getmypid", "getmyuid", "getopt", "getrusage", "ini_alter", "ini_get_all", "ini_get", "ini_restore", "ini_set", "magic_quotes_runtime", "main", "memory_get_peak_usage", "memory_get_usage", "php_ini_loaded_file", "php_ini_scanned_files", "php_logo_guid", "php_sapi_name", "php_uname", "phpcredits", "phpinfo", "phpversion", "putenv", "restore_include_path", "set_include_path", "set_magic_quotes_runtime", "set_time_limit", "sys_get_temp_dir", "version_compare", "zend_logo_guid", "zend_thread_id", "zend_version"] + b["Ingres"] = Set.new ["ingres_autocommit_state", "ingres_autocommit", "ingres_charset", "ingres_close", "ingres_commit", "ingres_connect", "ingres_cursor", "ingres_errno", "ingres_error", "ingres_errsqlstate", "ingres_escape_string", "ingres_execute", "ingres_fetch_array", "ingres_fetch_assoc", "ingres_fetch_object", "ingres_fetch_proc_return", "ingres_fetch_row", "ingres_field_length", "ingres_field_name", "ingres_field_nullable", "ingres_field_precision", "ingres_field_scale", "ingres_field_type", "ingres_free_result", "ingres_next_error", "ingres_num_fields", "ingres_num_rows", "ingres_pconnect", "ingres_prepare", "ingres_query", "ingres_result_seek", "ingres_rollback", "ingres_set_environment", "ingres_unbuffered_query"] + b["Inotify"] = Set.new ["inotify_add_watch", "inotify_init", "inotify_queue_len", "inotify_read", "inotify_rm_watch"] + b["Grapheme"] = Set.new ["grapheme_extract", "grapheme_stripos", "grapheme_stristr", "grapheme_strlen", "grapheme_strpos", "grapheme_strripos", "grapheme_strrpos", "grapheme_strstr", "grapheme_substr"] + b["intl"] = Set.new ["intl_error_name", "intl_get_error_code", "intl_get_error_message", "intl_is_failure"] + b["IDN"] = Set.new ["idn_to_ascii", "idn_to_utf8"] + b["JSON"] = Set.new ["json_decode", "json_encode", "json_last_error_msg", "json_last_error"] + b["Judy"] = Set.new ["judy_type", "judy_version"] + b["KADM5"] = Set.new ["kadm5_chpass_principal", "kadm5_create_principal", "kadm5_delete_principal", "kadm5_destroy", "kadm5_flush", "kadm5_get_policies", "kadm5_get_principal", "kadm5_get_principals", "kadm5_init_with_password", "kadm5_modify_principal"] + b["LDAP"] = Set.new ["ldap_8859_to_t61", "ldap_add_ext", "ldap_add", "ldap_bind_ext", "ldap_bind", "ldap_close", "ldap_compare", "ldap_connect", "ldap_control_paged_result_response", "ldap_control_paged_result", "ldap_count_entries", "ldap_delete_ext", "ldap_delete", "ldap_dn2ufn", "ldap_err2str", "ldap_errno", "ldap_error", "ldap_escape", "ldap_exop_passwd", "ldap_exop_refresh", "ldap_exop_whoami", "ldap_exop", "ldap_explode_dn", "ldap_first_attribute", "ldap_first_entry", "ldap_first_reference", "ldap_free_result", "ldap_get_attributes", "ldap_get_dn", "ldap_get_entries", "ldap_get_option", "ldap_get_values_len", "ldap_get_values", "ldap_list", "ldap_mod_add_ext", "ldap_mod_add", "ldap_mod_del_ext", "ldap_mod_del", "ldap_mod_replace_ext", "ldap_mod_replace", "ldap_modify_batch", "ldap_modify", "ldap_next_attribute", "ldap_next_entry", "ldap_next_reference", "ldap_parse_exop", "ldap_parse_reference", "ldap_parse_result", "ldap_read", "ldap_rename_ext", "ldap_rename", "ldap_sasl_bind", "ldap_search", "ldap_set_option", "ldap_set_rebind_proc", "ldap_sort", "ldap_start_tls", "ldap_t61_to_8859", "ldap_unbind"] + b["Libevent"] = Set.new ["event_add", "event_base_free", "event_base_loop", "event_base_loopbreak", "event_base_loopexit", "event_base_new", "event_base_priority_init", "event_base_reinit", "event_base_set", "event_buffer_base_set", "event_buffer_disable", "event_buffer_enable", "event_buffer_fd_set", "event_buffer_free", "event_buffer_new", "event_buffer_priority_set", "event_buffer_read", "event_buffer_set_callback", "event_buffer_timeout_set", "event_buffer_watermark_set", "event_buffer_write", "event_del", "event_free", "event_new", "event_priority_set", "event_set", "event_timer_add", "event_timer_del", "event_timer_new", "event_timer_set"] + b["libxml"] = Set.new ["libxml_clear_errors", "libxml_disable_entity_loader", "libxml_get_errors", "libxml_get_last_error", "libxml_set_external_entity_loader", "libxml_set_streams_context", "libxml_use_internal_errors"] + b["LZF"] = Set.new ["lzf_compress", "lzf_decompress", "lzf_optimized_for"] + b["Mail"] = Set.new ["ezmlm_hash", "mail"] + b["Mailparse"] = Set.new ["mailparse_determine_best_xfer_encoding", "mailparse_msg_create", "mailparse_msg_extract_part_file", "mailparse_msg_extract_part", "mailparse_msg_extract_whole_part_file", "mailparse_msg_free", "mailparse_msg_get_part_data", "mailparse_msg_get_part", "mailparse_msg_get_structure", "mailparse_msg_parse_file", "mailparse_msg_parse", "mailparse_rfc822_parse_addresses", "mailparse_stream_encode", "mailparse_uudecode_all"] + b["Math"] = Set.new ["abs", "acos", "acosh", "asin", "asinh", "atan2", "atan", "atanh", "base_convert", "bindec", "ceil", "cos", "cosh", "decbin", "dechex", "decoct", "deg2rad", "exp", "expm1", "floor", "fmod", "getrandmax", "hexdec", "hypot", "intdiv", "is_finite", "is_infinite", "is_nan", "lcg_value", "log10", "log1p", "log", "max", "min", "mt_getrandmax", "mt_rand", "mt_srand", "octdec", "pi", "pow", "rad2deg", "rand", "round", "sin", "sinh", "sqrt", "srand", "tan", "tanh"] + b["MaxDB"] = Set.new ["maxdb_affected_rows", "maxdb_autocommit", "maxdb_bind_param", "maxdb_bind_result", "maxdb_change_user", "maxdb_character_set_name", "maxdb_client_encoding", "maxdb_close_long_data", "maxdb_close", "maxdb_commit", "maxdb_connect_errno", "maxdb_connect_error", "maxdb_connect", "maxdb_data_seek", "maxdb_debug", "maxdb_disable_reads_from_master", "maxdb_disable_rpl_parse", "maxdb_dump_debug_info", "maxdb_embedded_connect", "maxdb_enable_reads_from_master", "maxdb_enable_rpl_parse", "maxdb_errno", "maxdb_error", "maxdb_escape_string", "maxdb_execute", "maxdb_fetch_array", "maxdb_fetch_assoc", "maxdb_fetch_field_direct", "maxdb_fetch_field", "maxdb_fetch_fields", "maxdb_fetch_lengths", "maxdb_fetch_object", "maxdb_fetch_row", "maxdb_fetch", "maxdb_field_count", "maxdb_field_seek", "maxdb_field_tell", "maxdb_free_result", "maxdb_get_client_info", "maxdb_get_client_version", "maxdb_get_host_info", "maxdb_get_metadata", "maxdb_get_proto_info", "maxdb_get_server_info", "maxdb_get_server_version", "maxdb_info", "maxdb_init", "maxdb_insert_id", "maxdb_kill", "maxdb_master_query", "maxdb_more_results", "maxdb_multi_query", "maxdb_next_result", "maxdb_num_fields", "maxdb_num_rows", "maxdb_options", "maxdb_param_count", "maxdb_ping", "maxdb_prepare", "maxdb_query", "maxdb_real_connect", "maxdb_real_escape_string", "maxdb_real_query", "maxdb_report", "maxdb_rollback", "maxdb_rpl_parse_enabled", "maxdb_rpl_probe", "maxdb_rpl_query_type", "maxdb_select_db", "maxdb_send_long_data", "maxdb_send_query", "maxdb_server_end", "maxdb_server_init", "maxdb_set_opt", "maxdb_sqlstate", "maxdb_ssl_set", "maxdb_stat", "maxdb_stmt_affected_rows", "maxdb_stmt_bind_param", "maxdb_stmt_bind_result", "maxdb_stmt_close_long_data", "maxdb_stmt_close", "maxdb_stmt_data_seek", "maxdb_stmt_errno", "maxdb_stmt_error", "maxdb_stmt_execute", "maxdb_stmt_fetch", "maxdb_stmt_free_result", "maxdb_stmt_init", "maxdb_stmt_num_rows", "maxdb_stmt_param_count", "maxdb_stmt_prepare", "maxdb_stmt_reset", "maxdb_stmt_result_metadata", "maxdb_stmt_send_long_data", "maxdb_stmt_sqlstate", "maxdb_stmt_store_result", "maxdb_store_result", "maxdb_thread_id", "maxdb_thread_safe", "maxdb_use_result", "maxdb_warning_count"] + b["Multibyte String"] = Set.new ["mb_check_encoding", "mb_chr", "mb_convert_case", "mb_convert_encoding", "mb_convert_kana", "mb_convert_variables", "mb_decode_mimeheader", "mb_decode_numericentity", "mb_detect_encoding", "mb_detect_order", "mb_encode_mimeheader", "mb_encode_numericentity", "mb_encoding_aliases", "mb_ereg_match", "mb_ereg_replace_callback", "mb_ereg_replace", "mb_ereg_search_getpos", "mb_ereg_search_getregs", "mb_ereg_search_init", "mb_ereg_search_pos", "mb_ereg_search_regs", "mb_ereg_search_setpos", "mb_ereg_search", "mb_ereg", "mb_eregi_replace", "mb_eregi", "mb_get_info", "mb_http_input", "mb_http_output", "mb_internal_encoding", "mb_language", "mb_list_encodings", "mb_ord", "mb_output_handler", "mb_parse_str", "mb_preferred_mime_name", "mb_regex_encoding", "mb_regex_set_options", "mb_scrub", "mb_send_mail", "mb_split", "mb_str_split", "mb_strcut", "mb_strimwidth", "mb_stripos", "mb_stristr", "mb_strlen", "mb_strpos", "mb_strrchr", "mb_strrichr", "mb_strripos", "mb_strrpos", "mb_strstr", "mb_strtolower", "mb_strtoupper", "mb_strwidth", "mb_substitute_character", "mb_substr_count", "mb_substr"] + b["Mcrypt"] = Set.new ["mcrypt_cbc", "mcrypt_cfb", "mcrypt_create_iv", "mcrypt_decrypt", "mcrypt_ecb", "mcrypt_enc_get_algorithms_name", "mcrypt_enc_get_block_size", "mcrypt_enc_get_iv_size", "mcrypt_enc_get_key_size", "mcrypt_enc_get_modes_name", "mcrypt_enc_get_supported_key_sizes", "mcrypt_enc_is_block_algorithm_mode", "mcrypt_enc_is_block_algorithm", "mcrypt_enc_is_block_mode", "mcrypt_enc_self_test", "mcrypt_encrypt", "mcrypt_generic_deinit", "mcrypt_generic_end", "mcrypt_generic_init", "mcrypt_generic", "mcrypt_get_block_size", "mcrypt_get_cipher_name", "mcrypt_get_iv_size", "mcrypt_get_key_size", "mcrypt_list_algorithms", "mcrypt_list_modes", "mcrypt_module_close", "mcrypt_module_get_algo_block_size", "mcrypt_module_get_algo_key_size", "mcrypt_module_get_supported_key_sizes", "mcrypt_module_is_block_algorithm_mode", "mcrypt_module_is_block_algorithm", "mcrypt_module_is_block_mode", "mcrypt_module_open", "mcrypt_module_self_test", "mcrypt_ofb", "mdecrypt_generic"] + b["MCVE"] = Set.new ["m_checkstatus", "m_completeauthorizations", "m_connect", "m_connectionerror", "m_deletetrans", "m_destroyconn", "m_destroyengine", "m_getcell", "m_getcellbynum", "m_getcommadelimited", "m_getheader", "m_initconn", "m_initengine", "m_iscommadelimited", "m_maxconntimeout", "m_monitor", "m_numcolumns", "m_numrows", "m_parsecommadelimited", "m_responsekeys", "m_responseparam", "m_returnstatus", "m_setblocking", "m_setdropfile", "m_setip", "m_setssl_cafile", "m_setssl_files", "m_setssl", "m_settimeout", "m_sslcert_gen_hash", "m_transactionssent", "m_transinqueue", "m_transkeyval", "m_transnew", "m_transsend", "m_uwait", "m_validateidentifier", "m_verifyconnection", "m_verifysslcert"] + b["Memcache"] = Set.new ["memcache_debug"] + b["Mhash"] = Set.new ["mhash_count", "mhash_get_block_size", "mhash_get_hash_name", "mhash_keygen_s2k", "mhash"] + b["Ming"] = Set.new ["ming_keypress", "ming_setcubicthreshold", "ming_setscale", "ming_setswfcompression", "ming_useconstants", "ming_useswfversion"] + b["Misc."] = Set.new ["connection_aborted", "connection_status", "constant", "define", "defined", "die", "eval", "exit", "get_browser", "__halt_compiler", "highlight_file", "highlight_string", "hrtime", "ignore_user_abort", "pack", "php_check_syntax", "php_strip_whitespace", "sapi_windows_cp_conv", "sapi_windows_cp_get", "sapi_windows_cp_is_utf8", "sapi_windows_cp_set", "sapi_windows_generate_ctrl_event", "sapi_windows_set_ctrl_handler", "sapi_windows_vt100_support", "show_source", "sleep", "sys_getloadavg", "time_nanosleep", "time_sleep_until", "uniqid", "unpack", "usleep"] + b["mnoGoSearch"] = Set.new ["udm_add_search_limit", "udm_alloc_agent_array", "udm_alloc_agent", "udm_api_version", "udm_cat_list", "udm_cat_path", "udm_check_charset", "udm_clear_search_limits", "udm_crc32", "udm_errno", "udm_error", "udm_find", "udm_free_agent", "udm_free_ispell_data", "udm_free_res", "udm_get_doc_count", "udm_get_res_field", "udm_get_res_param", "udm_hash32", "udm_load_ispell_data", "udm_set_agent_param"] + b["Mongo"] = Set.new ["bson_decode", "bson_encode"] + b["mqseries"] = Set.new ["mqseries_back", "mqseries_begin", "mqseries_close", "mqseries_cmit", "mqseries_conn", "mqseries_connx", "mqseries_disc", "mqseries_get", "mqseries_inq", "mqseries_open", "mqseries_put1", "mqseries_put", "mqseries_set", "mqseries_strerror"] + b["Msession"] = Set.new ["msession_connect", "msession_count", "msession_create", "msession_destroy", "msession_disconnect", "msession_find", "msession_get_array", "msession_get_data", "msession_get", "msession_inc", "msession_list", "msession_listvar", "msession_lock", "msession_plugin", "msession_randstr", "msession_set_array", "msession_set_data", "msession_set", "msession_timeout", "msession_uniq", "msession_unlock"] + b["mSQL"] = Set.new ["msql_affected_rows", "msql_close", "msql_connect", "msql_create_db", "msql_createdb", "msql_data_seek", "msql_db_query", "msql_dbname", "msql_drop_db", "msql_error", "msql_fetch_array", "msql_fetch_field", "msql_fetch_object", "msql_fetch_row", "msql_field_flags", "msql_field_len", "msql_field_name", "msql_field_seek", "msql_field_table", "msql_field_type", "msql_fieldflags", "msql_fieldlen", "msql_fieldname", "msql_fieldtable", "msql_fieldtype", "msql_free_result", "msql_list_dbs", "msql_list_fields", "msql_list_tables", "msql_num_fields", "msql_num_rows", "msql_numfields", "msql_numrows", "msql_pconnect", "msql_query", "msql_regcase", "msql_result", "msql_select_db", "msql_tablename", "msql"] + b["Mssql"] = Set.new ["mssql_bind", "mssql_close", "mssql_connect", "mssql_data_seek", "mssql_execute", "mssql_fetch_array", "mssql_fetch_assoc", "mssql_fetch_batch", "mssql_fetch_field", "mssql_fetch_object", "mssql_fetch_row", "mssql_field_length", "mssql_field_name", "mssql_field_seek", "mssql_field_type", "mssql_free_result", "mssql_free_statement", "mssql_get_last_message", "mssql_guid_string", "mssql_init", "mssql_min_error_severity", "mssql_min_message_severity", "mssql_next_result", "mssql_num_fields", "mssql_num_rows", "mssql_pconnect", "mssql_query", "mssql_result", "mssql_rows_affected", "mssql_select_db"] + b["Mysql_xdevapi"] = Set.new ["expression", "getSession"] + b["MySQL"] = Set.new ["mysql_affected_rows", "mysql_client_encoding", "mysql_close", "mysql_connect", "mysql_create_db", "mysql_data_seek", "mysql_db_name", "mysql_db_query", "mysql_drop_db", "mysql_errno", "mysql_error", "mysql_escape_string", "mysql_fetch_array", "mysql_fetch_assoc", "mysql_fetch_field", "mysql_fetch_lengths", "mysql_fetch_object", "mysql_fetch_row", "mysql_field_flags", "mysql_field_len", "mysql_field_name", "mysql_field_seek", "mysql_field_table", "mysql_field_type", "mysql_free_result", "mysql_get_client_info", "mysql_get_host_info", "mysql_get_proto_info", "mysql_get_server_info", "mysql_info", "mysql_insert_id", "mysql_list_dbs", "mysql_list_fields", "mysql_list_processes", "mysql_list_tables", "mysql_num_fields", "mysql_num_rows", "mysql_pconnect", "mysql_ping", "mysql_query", "mysql_real_escape_string", "mysql_result", "mysql_select_db", "mysql_set_charset", "mysql_stat", "mysql_tablename", "mysql_thread_id", "mysql_unbuffered_query"] + b["Aliases and deprecated Mysqli"] = Set.new ["mysqli_bind_param", "mysqli_bind_result", "mysqli_client_encoding", "mysqli_connect", "mysqli_disable_rpl_parse", "mysqli_enable_reads_from_master", "mysqli_enable_rpl_parse", "mysqli_escape_string", "mysqli_execute", "mysqli_fetch", "mysqli_get_cache_stats", "mysqli_get_client_stats", "mysqli_get_links_stats", "mysqli_get_metadata", "mysqli_master_query", "mysqli_param_count", "mysqli_report", "mysqli_rpl_parse_enabled", "mysqli_rpl_probe", "mysqli_send_long_data", "mysqli_slave_query"] + b["Mysqlnd_memcache"] = Set.new ["mysqlnd_memcache_get_config", "mysqlnd_memcache_set"] + b["Mysqlnd_ms"] = Set.new ["mysqlnd_ms_dump_servers", "mysqlnd_ms_fabric_select_global", "mysqlnd_ms_fabric_select_shard", "mysqlnd_ms_get_last_gtid", "mysqlnd_ms_get_last_used_connection", "mysqlnd_ms_get_stats", "mysqlnd_ms_match_wild", "mysqlnd_ms_query_is_select", "mysqlnd_ms_set_qos", "mysqlnd_ms_set_user_pick_server", "mysqlnd_ms_xa_begin", "mysqlnd_ms_xa_commit", "mysqlnd_ms_xa_gc", "mysqlnd_ms_xa_rollback"] + b["mysqlnd_qc"] = Set.new ["mysqlnd_qc_clear_cache", "mysqlnd_qc_get_available_handlers", "mysqlnd_qc_get_cache_info", "mysqlnd_qc_get_core_stats", "mysqlnd_qc_get_normalized_query_trace_log", "mysqlnd_qc_get_query_trace_log", "mysqlnd_qc_set_cache_condition", "mysqlnd_qc_set_is_select", "mysqlnd_qc_set_storage_handler", "mysqlnd_qc_set_user_handlers"] + b["Mysqlnd_uh"] = Set.new ["mysqlnd_uh_convert_to_mysqlnd", "mysqlnd_uh_set_connection_proxy", "mysqlnd_uh_set_statement_proxy"] + b["Ncurses"] = Set.new ["ncurses_addch", "ncurses_addchnstr", "ncurses_addchstr", "ncurses_addnstr", "ncurses_addstr", "ncurses_assume_default_colors", "ncurses_attroff", "ncurses_attron", "ncurses_attrset", "ncurses_baudrate", "ncurses_beep", "ncurses_bkgd", "ncurses_bkgdset", "ncurses_border", "ncurses_bottom_panel", "ncurses_can_change_color", "ncurses_cbreak", "ncurses_clear", "ncurses_clrtobot", "ncurses_clrtoeol", "ncurses_color_content", "ncurses_color_set", "ncurses_curs_set", "ncurses_def_prog_mode", "ncurses_def_shell_mode", "ncurses_define_key", "ncurses_del_panel", "ncurses_delay_output", "ncurses_delch", "ncurses_deleteln", "ncurses_delwin", "ncurses_doupdate", "ncurses_echo", "ncurses_echochar", "ncurses_end", "ncurses_erase", "ncurses_erasechar", "ncurses_filter", "ncurses_flash", "ncurses_flushinp", "ncurses_getch", "ncurses_getmaxyx", "ncurses_getmouse", "ncurses_getyx", "ncurses_halfdelay", "ncurses_has_colors", "ncurses_has_ic", "ncurses_has_il", "ncurses_has_key", "ncurses_hide_panel", "ncurses_hline", "ncurses_inch", "ncurses_init_color", "ncurses_init_pair", "ncurses_init", "ncurses_insch", "ncurses_insdelln", "ncurses_insertln", "ncurses_insstr", "ncurses_instr", "ncurses_isendwin", "ncurses_keyok", "ncurses_keypad", "ncurses_killchar", "ncurses_longname", "ncurses_meta", "ncurses_mouse_trafo", "ncurses_mouseinterval", "ncurses_mousemask", "ncurses_move_panel", "ncurses_move", "ncurses_mvaddch", "ncurses_mvaddchnstr", "ncurses_mvaddchstr", "ncurses_mvaddnstr", "ncurses_mvaddstr", "ncurses_mvcur", "ncurses_mvdelch", "ncurses_mvgetch", "ncurses_mvhline", "ncurses_mvinch", "ncurses_mvvline", "ncurses_mvwaddstr", "ncurses_napms", "ncurses_new_panel", "ncurses_newpad", "ncurses_newwin", "ncurses_nl", "ncurses_nocbreak", "ncurses_noecho", "ncurses_nonl", "ncurses_noqiflush", "ncurses_noraw", "ncurses_pair_content", "ncurses_panel_above", "ncurses_panel_below", "ncurses_panel_window", "ncurses_pnoutrefresh", "ncurses_prefresh", "ncurses_putp", "ncurses_qiflush", "ncurses_raw", "ncurses_refresh", "ncurses_replace_panel", "ncurses_reset_prog_mode", "ncurses_reset_shell_mode", "ncurses_resetty", "ncurses_savetty", "ncurses_scr_dump", "ncurses_scr_init", "ncurses_scr_restore", "ncurses_scr_set", "ncurses_scrl", "ncurses_show_panel", "ncurses_slk_attr", "ncurses_slk_attroff", "ncurses_slk_attron", "ncurses_slk_attrset", "ncurses_slk_clear", "ncurses_slk_color", "ncurses_slk_init", "ncurses_slk_noutrefresh", "ncurses_slk_refresh", "ncurses_slk_restore", "ncurses_slk_set", "ncurses_slk_touch", "ncurses_standend", "ncurses_standout", "ncurses_start_color", "ncurses_termattrs", "ncurses_termname", "ncurses_timeout", "ncurses_top_panel", "ncurses_typeahead", "ncurses_ungetch", "ncurses_ungetmouse", "ncurses_update_panels", "ncurses_use_default_colors", "ncurses_use_env", "ncurses_use_extended_names", "ncurses_vidattr", "ncurses_vline", "ncurses_waddch", "ncurses_waddstr", "ncurses_wattroff", "ncurses_wattron", "ncurses_wattrset", "ncurses_wborder", "ncurses_wclear", "ncurses_wcolor_set", "ncurses_werase", "ncurses_wgetch", "ncurses_whline", "ncurses_wmouse_trafo", "ncurses_wmove", "ncurses_wnoutrefresh", "ncurses_wrefresh", "ncurses_wstandend", "ncurses_wstandout", "ncurses_wvline"] + b["Gopher"] = Set.new ["gopher_parsedir"] + b["Network"] = Set.new ["checkdnsrr", "closelog", "define_syslog_variables", "dns_check_record", "dns_get_mx", "dns_get_record", "fsockopen", "gethostbyaddr", "gethostbyname", "gethostbynamel", "gethostname", "getmxrr", "getprotobyname", "getprotobynumber", "getservbyname", "getservbyport", "header_register_callback", "header_remove", "header", "headers_list", "headers_sent", "http_response_code", "inet_ntop", "inet_pton", "ip2long", "long2ip", "openlog", "pfsockopen", "setcookie", "setrawcookie", "socket_get_status", "socket_set_blocking", "socket_set_timeout", "syslog"] + b["Newt"] = Set.new ["newt_bell", "newt_button_bar", "newt_button", "newt_centered_window", "newt_checkbox_get_value", "newt_checkbox_set_flags", "newt_checkbox_set_value", "newt_checkbox_tree_add_item", "newt_checkbox_tree_find_item", "newt_checkbox_tree_get_current", "newt_checkbox_tree_get_entry_value", "newt_checkbox_tree_get_multi_selection", "newt_checkbox_tree_get_selection", "newt_checkbox_tree_multi", "newt_checkbox_tree_set_current", "newt_checkbox_tree_set_entry_value", "newt_checkbox_tree_set_entry", "newt_checkbox_tree_set_width", "newt_checkbox_tree", "newt_checkbox", "newt_clear_key_buffer", "newt_cls", "newt_compact_button", "newt_component_add_callback", "newt_component_takes_focus", "newt_create_grid", "newt_cursor_off", "newt_cursor_on", "newt_delay", "newt_draw_form", "newt_draw_root_text", "newt_entry_get_value", "newt_entry_set_filter", "newt_entry_set_flags", "newt_entry_set", "newt_entry", "newt_finished", "newt_form_add_component", "newt_form_add_components", "newt_form_add_hot_key", "newt_form_destroy", "newt_form_get_current", "newt_form_run", "newt_form_set_background", "newt_form_set_height", "newt_form_set_size", "newt_form_set_timer", "newt_form_set_width", "newt_form_watch_fd", "newt_form", "newt_get_screen_size", "newt_grid_add_components_to_form", "newt_grid_basic_window", "newt_grid_free", "newt_grid_get_size", "newt_grid_h_close_stacked", "newt_grid_h_stacked", "newt_grid_place", "newt_grid_set_field", "newt_grid_simple_window", "newt_grid_v_close_stacked", "newt_grid_v_stacked", "newt_grid_wrapped_window_at", "newt_grid_wrapped_window", "newt_init", "newt_label_set_text", "newt_label", "newt_listbox_append_entry", "newt_listbox_clear_selection", "newt_listbox_clear", "newt_listbox_delete_entry", "newt_listbox_get_current", "newt_listbox_get_selection", "newt_listbox_insert_entry", "newt_listbox_item_count", "newt_listbox_select_item", "newt_listbox_set_current_by_key", "newt_listbox_set_current", "newt_listbox_set_data", "newt_listbox_set_entry", "newt_listbox_set_width", "newt_listbox", "newt_listitem_get_data", "newt_listitem_set", "newt_listitem", "newt_open_window", "newt_pop_help_line", "newt_pop_window", "newt_push_help_line", "newt_radio_get_current", "newt_radiobutton", "newt_redraw_help_line", "newt_reflow_text", "newt_refresh", "newt_resize_screen", "newt_resume", "newt_run_form", "newt_scale_set", "newt_scale", "newt_scrollbar_set", "newt_set_help_callback", "newt_set_suspend_callback", "newt_suspend", "newt_textbox_get_num_lines", "newt_textbox_reflowed", "newt_textbox_set_height", "newt_textbox_set_text", "newt_textbox", "newt_vertical_scrollbar", "newt_wait_for_key", "newt_win_choice", "newt_win_entries", "newt_win_menu", "newt_win_message", "newt_win_messagev", "newt_win_ternary"] + b["YP/NIS"] = Set.new ["yp_all", "yp_cat", "yp_err_string", "yp_errno", "yp_first", "yp_get_default_domain", "yp_master", "yp_match", "yp_next", "yp_order"] + b["NSAPI"] = Set.new ["nsapi_request_headers", "nsapi_response_headers", "nsapi_virtual"] + b["OAuth"] = Set.new ["oauth_get_sbs", "oauth_urlencode"] + b["OCI8"] = Set.new ["oci_bind_array_by_name", "oci_bind_by_name", "oci_cancel", "oci_client_version", "oci_close", "oci_commit", "oci_connect", "oci_define_by_name", "oci_error", "oci_execute", "oci_fetch_all", "oci_fetch_array", "oci_fetch_assoc", "oci_fetch_object", "oci_fetch_row", "oci_fetch", "oci_field_is_null", "oci_field_name", "oci_field_precision", "oci_field_scale", "oci_field_size", "oci_field_type_raw", "oci_field_type", "oci_free_descriptor", "oci_free_statement", "oci_get_implicit_resultset", "oci_internal_debug", "oci_lob_copy", "oci_lob_is_equal", "oci_new_collection", "oci_new_connect", "oci_new_cursor", "oci_new_descriptor", "oci_num_fields", "oci_num_rows", "oci_parse", "oci_password_change", "oci_pconnect", "oci_register_taf_callback", "oci_result", "oci_rollback", "oci_server_version", "oci_set_action", "oci_set_call_timeout", "oci_set_client_identifier", "oci_set_client_info", "oci_set_db_operation", "oci_set_edition", "oci_set_module_name", "oci_set_prefetch", "oci_statement_type", "oci_unregister_taf_callback"] + b["OPcache"] = Set.new ["opcache_compile_file", "opcache_get_configuration", "opcache_get_status", "opcache_invalidate", "opcache_is_script_cached", "opcache_reset"] + b["OpenAL"] = Set.new ["openal_buffer_create", "openal_buffer_data", "openal_buffer_destroy", "openal_buffer_get", "openal_buffer_loadwav", "openal_context_create", "openal_context_current", "openal_context_destroy", "openal_context_process", "openal_context_suspend", "openal_device_close", "openal_device_open", "openal_listener_get", "openal_listener_set", "openal_source_create", "openal_source_destroy", "openal_source_get", "openal_source_pause", "openal_source_play", "openal_source_rewind", "openal_source_set", "openal_source_stop", "openal_stream"] + b["OpenSSL"] = Set.new ["openssl_cipher_iv_length", "openssl_csr_export_to_file", "openssl_csr_export", "openssl_csr_get_public_key", "openssl_csr_get_subject", "openssl_csr_new", "openssl_csr_sign", "openssl_decrypt", "openssl_dh_compute_key", "openssl_digest", "openssl_encrypt", "openssl_error_string", "openssl_free_key", "openssl_get_cert_locations", "openssl_get_cipher_methods", "openssl_get_curve_names", "openssl_get_md_methods", "openssl_get_privatekey", "openssl_get_publickey", "openssl_open", "openssl_pbkdf2", "openssl_pkcs12_export_to_file", "openssl_pkcs12_export", "openssl_pkcs12_read", "openssl_pkcs7_decrypt", "openssl_pkcs7_encrypt", "openssl_pkcs7_read", "openssl_pkcs7_sign", "openssl_pkcs7_verify", "openssl_pkey_export_to_file", "openssl_pkey_export", "openssl_pkey_free", "openssl_pkey_get_details", "openssl_pkey_get_private", "openssl_pkey_get_public", "openssl_pkey_new", "openssl_private_decrypt", "openssl_private_encrypt", "openssl_public_decrypt", "openssl_public_encrypt", "openssl_random_pseudo_bytes", "openssl_seal", "openssl_sign", "openssl_spki_export_challenge", "openssl_spki_export", "openssl_spki_new", "openssl_spki_verify", "openssl_verify", "openssl_x509_check_private_key", "openssl_x509_checkpurpose", "openssl_x509_export_to_file", "openssl_x509_export", "openssl_x509_fingerprint", "openssl_x509_free", "openssl_x509_parse", "openssl_x509_read", "openssl_x509_verify"] + b["Output Control"] = Set.new ["flush", "ob_clean", "ob_end_clean", "ob_end_flush", "ob_flush", "ob_get_clean", "ob_get_contents", "ob_get_flush", "ob_get_length", "ob_get_level", "ob_get_status", "ob_gzhandler", "ob_implicit_flush", "ob_list_handlers", "ob_start", "output_add_rewrite_var", "output_reset_rewrite_vars"] + b["Paradox"] = Set.new ["px_close", "px_create_fp", "px_date2string", "px_delete_record", "px_delete", "px_get_field", "px_get_info", "px_get_parameter", "px_get_record", "px_get_schema", "px_get_value", "px_insert_record", "px_new", "px_numfields", "px_numrecords", "px_open_fp", "px_put_record", "px_retrieve_record", "px_set_blob_file", "px_set_parameter", "px_set_tablename", "px_set_targetencoding", "px_set_value", "px_timestamp2string", "px_update_record"] + b["Parsekit"] = Set.new ["parsekit_compile_file", "parsekit_compile_string", "parsekit_func_arginfo"] + b["Password Hashing"] = Set.new ["password_get_info", "password_hash", "password_needs_rehash", "password_verify"] + b["PCNTL"] = Set.new ["pcntl_alarm", "pcntl_async_signals", "pcntl_errno", "pcntl_exec", "pcntl_fork", "pcntl_get_last_error", "pcntl_getpriority", "pcntl_setpriority", "pcntl_signal_dispatch", "pcntl_signal_get_handler", "pcntl_signal", "pcntl_sigprocmask", "pcntl_sigtimedwait", "pcntl_sigwaitinfo", "pcntl_strerror", "pcntl_wait", "pcntl_waitpid", "pcntl_wexitstatus", "pcntl_wifexited", "pcntl_wifsignaled", "pcntl_wifstopped", "pcntl_wstopsig", "pcntl_wtermsig"] + b["PCRE"] = Set.new ["preg_filter", "preg_grep", "preg_last_error", "preg_match_all", "preg_match", "preg_quote", "preg_replace_callback_array", "preg_replace_callback", "preg_replace", "preg_split"] + b["PDF"] = Set.new ["PDF_activate_item", "PDF_add_annotation", "PDF_add_bookmark", "PDF_add_launchlink", "PDF_add_locallink", "PDF_add_nameddest", "PDF_add_note", "PDF_add_outline", "PDF_add_pdflink", "PDF_add_table_cell", "PDF_add_textflow", "PDF_add_thumbnail", "PDF_add_weblink", "PDF_arc", "PDF_arcn", "PDF_attach_file", "PDF_begin_document", "PDF_begin_font", "PDF_begin_glyph", "PDF_begin_item", "PDF_begin_layer", "PDF_begin_page_ext", "PDF_begin_page", "PDF_begin_pattern", "PDF_begin_template_ext", "PDF_begin_template", "PDF_circle", "PDF_clip", "PDF_close_image", "PDF_close_pdi_page", "PDF_close_pdi", "PDF_close", "PDF_closepath_fill_stroke", "PDF_closepath_stroke", "PDF_closepath", "PDF_concat", "PDF_continue_text", "PDF_create_3dview", "PDF_create_action", "PDF_create_annotation", "PDF_create_bookmark", "PDF_create_field", "PDF_create_fieldgroup", "PDF_create_gstate", "PDF_create_pvf", "PDF_create_textflow", "PDF_curveto", "PDF_define_layer", "PDF_delete_pvf", "PDF_delete_table", "PDF_delete_textflow", "PDF_delete", "PDF_encoding_set_char", "PDF_end_document", "PDF_end_font", "PDF_end_glyph", "PDF_end_item", "PDF_end_layer", "PDF_end_page_ext", "PDF_end_page", "PDF_end_pattern", "PDF_end_template", "PDF_endpath", "PDF_fill_imageblock", "PDF_fill_pdfblock", "PDF_fill_stroke", "PDF_fill_textblock", "PDF_fill", "PDF_findfont", "PDF_fit_image", "PDF_fit_pdi_page", "PDF_fit_table", "PDF_fit_textflow", "PDF_fit_textline", "PDF_get_apiname", "PDF_get_buffer", "PDF_get_errmsg", "PDF_get_errnum", "PDF_get_font", "PDF_get_fontname", "PDF_get_fontsize", "PDF_get_image_height", "PDF_get_image_width", "PDF_get_majorversion", "PDF_get_minorversion", "PDF_get_parameter", "PDF_get_pdi_parameter", "PDF_get_pdi_value", "PDF_get_value", "PDF_info_font", "PDF_info_matchbox", "PDF_info_table", "PDF_info_textflow", "PDF_info_textline", "PDF_initgraphics", "PDF_lineto", "PDF_load_3ddata", "PDF_load_font", "PDF_load_iccprofile", "PDF_load_image", "PDF_makespotcolor", "PDF_moveto", "PDF_new", "PDF_open_ccitt", "PDF_open_file", "PDF_open_gif", "PDF_open_image_file", "PDF_open_image", "PDF_open_jpeg", "PDF_open_memory_image", "PDF_open_pdi_document", "PDF_open_pdi_page", "PDF_open_pdi", "PDF_open_tiff", "PDF_pcos_get_number", "PDF_pcos_get_stream", "PDF_pcos_get_string", "PDF_place_image", "PDF_place_pdi_page", "PDF_process_pdi", "PDF_rect", "PDF_restore", "PDF_resume_page", "PDF_rotate", "PDF_save", "PDF_scale", "PDF_set_border_color", "PDF_set_border_dash", "PDF_set_border_style", "PDF_set_char_spacing", "PDF_set_duration", "PDF_set_gstate", "PDF_set_horiz_scaling", "PDF_set_info_author", "PDF_set_info_creator", "PDF_set_info_keywords", "PDF_set_info_subject", "PDF_set_info_title", "PDF_set_info", "PDF_set_layer_dependency", "PDF_set_leading", "PDF_set_parameter", "PDF_set_text_matrix", "PDF_set_text_pos", "PDF_set_text_rendering", "PDF_set_text_rise", "PDF_set_value", "PDF_set_word_spacing", "PDF_setcolor", "PDF_setdash", "PDF_setdashpattern", "PDF_setflat", "PDF_setfont", "PDF_setgray_fill", "PDF_setgray_stroke", "PDF_setgray", "PDF_setlinecap", "PDF_setlinejoin", "PDF_setlinewidth", "PDF_setmatrix", "PDF_setmiterlimit", "PDF_setpolydash", "PDF_setrgbcolor_fill", "PDF_setrgbcolor_stroke", "PDF_setrgbcolor", "PDF_shading_pattern", "PDF_shading", "PDF_shfill", "PDF_show_boxed", "PDF_show_xy", "PDF_show", "PDF_skew", "PDF_stringwidth", "PDF_stroke", "PDF_suspend_page", "PDF_translate", "PDF_utf16_to_utf8", "PDF_utf32_to_utf16", "PDF_utf8_to_utf16"] + b["PostgreSQL"] = Set.new ["pg_affected_rows", "pg_cancel_query", "pg_client_encoding", "pg_close", "pg_connect_poll", "pg_connect", "pg_connection_busy", "pg_connection_reset", "pg_connection_status", "pg_consume_input", "pg_convert", "pg_copy_from", "pg_copy_to", "pg_dbname", "pg_delete", "pg_end_copy", "pg_escape_bytea", "pg_escape_identifier", "pg_escape_literal", "pg_escape_string", "pg_execute", "pg_fetch_all_columns", "pg_fetch_all", "pg_fetch_array", "pg_fetch_assoc", "pg_fetch_object", "pg_fetch_result", "pg_fetch_row", "pg_field_is_null", "pg_field_name", "pg_field_num", "pg_field_prtlen", "pg_field_size", "pg_field_table", "pg_field_type_oid", "pg_field_type", "pg_flush", "pg_free_result", "pg_get_notify", "pg_get_pid", "pg_get_result", "pg_host", "pg_insert", "pg_last_error", "pg_last_notice", "pg_last_oid", "pg_lo_close", "pg_lo_create", "pg_lo_export", "pg_lo_import", "pg_lo_open", "pg_lo_read_all", "pg_lo_read", "pg_lo_seek", "pg_lo_tell", "pg_lo_truncate", "pg_lo_unlink", "pg_lo_write", "pg_meta_data", "pg_num_fields", "pg_num_rows", "pg_options", "pg_parameter_status", "pg_pconnect", "pg_ping", "pg_port", "pg_prepare", "pg_put_line", "pg_query_params", "pg_query", "pg_result_error_field", "pg_result_error", "pg_result_seek", "pg_result_status", "pg_select", "pg_send_execute", "pg_send_prepare", "pg_send_query_params", "pg_send_query", "pg_set_client_encoding", "pg_set_error_verbosity", "pg_socket", "pg_trace", "pg_transaction_status", "pg_tty", "pg_unescape_bytea", "pg_untrace", "pg_update", "pg_version"] + b["phpdbg"] = Set.new ["phpdbg_break_file", "phpdbg_break_function", "phpdbg_break_method", "phpdbg_break_next", "phpdbg_clear", "phpdbg_color", "phpdbg_end_oplog", "phpdbg_exec", "phpdbg_get_executable", "phpdbg_prompt", "phpdbg_start_oplog"] + b["POSIX"] = Set.new ["posix_access", "posix_ctermid", "posix_errno", "posix_get_last_error", "posix_getcwd", "posix_getegid", "posix_geteuid", "posix_getgid", "posix_getgrgid", "posix_getgrnam", "posix_getgroups", "posix_getlogin", "posix_getpgid", "posix_getpgrp", "posix_getpid", "posix_getppid", "posix_getpwnam", "posix_getpwuid", "posix_getrlimit", "posix_getsid", "posix_getuid", "posix_initgroups", "posix_isatty", "posix_kill", "posix_mkfifo", "posix_mknod", "posix_setegid", "posix_seteuid", "posix_setgid", "posix_setpgid", "posix_setrlimit", "posix_setsid", "posix_setuid", "posix_strerror", "posix_times", "posix_ttyname", "posix_uname"] + b["Proctitle"] = Set.new ["setproctitle", "setthreadtitle"] + b["PS"] = Set.new ["ps_add_bookmark", "ps_add_launchlink", "ps_add_locallink", "ps_add_note", "ps_add_pdflink", "ps_add_weblink", "ps_arc", "ps_arcn", "ps_begin_page", "ps_begin_pattern", "ps_begin_template", "ps_circle", "ps_clip", "ps_close_image", "ps_close", "ps_closepath_stroke", "ps_closepath", "ps_continue_text", "ps_curveto", "ps_delete", "ps_end_page", "ps_end_pattern", "ps_end_template", "ps_fill_stroke", "ps_fill", "ps_findfont", "ps_get_buffer", "ps_get_parameter", "ps_get_value", "ps_hyphenate", "ps_include_file", "ps_lineto", "ps_makespotcolor", "ps_moveto", "ps_new", "ps_open_file", "ps_open_image_file", "ps_open_image", "ps_open_memory_image", "ps_place_image", "ps_rect", "ps_restore", "ps_rotate", "ps_save", "ps_scale", "ps_set_border_color", "ps_set_border_dash", "ps_set_border_style", "ps_set_info", "ps_set_parameter", "ps_set_text_pos", "ps_set_value", "ps_setcolor", "ps_setdash", "ps_setflat", "ps_setfont", "ps_setgray", "ps_setlinecap", "ps_setlinejoin", "ps_setlinewidth", "ps_setmiterlimit", "ps_setoverprintmode", "ps_setpolydash", "ps_shading_pattern", "ps_shading", "ps_shfill", "ps_show_boxed", "ps_show_xy2", "ps_show_xy", "ps_show2", "ps_show", "ps_string_geometry", "ps_stringwidth", "ps_stroke", "ps_symbol_name", "ps_symbol_width", "ps_symbol", "ps_translate"] + b["Pspell"] = Set.new ["pspell_add_to_personal", "pspell_add_to_session", "pspell_check", "pspell_clear_session", "pspell_config_create", "pspell_config_data_dir", "pspell_config_dict_dir", "pspell_config_ignore", "pspell_config_mode", "pspell_config_personal", "pspell_config_repl", "pspell_config_runtogether", "pspell_config_save_repl", "pspell_new_config", "pspell_new_personal", "pspell_new", "pspell_save_wordlist", "pspell_store_replacement", "pspell_suggest"] + b["Radius"] = Set.new ["radius_acct_open", "radius_add_server", "radius_auth_open", "radius_close", "radius_config", "radius_create_request", "radius_cvt_addr", "radius_cvt_int", "radius_cvt_string", "radius_demangle_mppe_key", "radius_demangle", "radius_get_attr", "radius_get_tagged_attr_data", "radius_get_tagged_attr_tag", "radius_get_vendor_attr", "radius_put_addr", "radius_put_attr", "radius_put_int", "radius_put_string", "radius_put_vendor_addr", "radius_put_vendor_attr", "radius_put_vendor_int", "radius_put_vendor_string", "radius_request_authenticator", "radius_salt_encrypt_attr", "radius_send_request", "radius_server_secret", "radius_strerror"] + b["Rar"] = Set.new ["rar_wrapper_cache_stats"] + b["Readline"] = Set.new ["readline_add_history", "readline_callback_handler_install", "readline_callback_handler_remove", "readline_callback_read_char", "readline_clear_history", "readline_completion_function", "readline_info", "readline_list_history", "readline_on_new_line", "readline_read_history", "readline_redisplay", "readline_write_history", "readline"] + b["Recode"] = Set.new ["recode_file", "recode_string", "recode"] + b["POSIX Regex"] = Set.new ["ereg_replace", "ereg", "eregi_replace", "eregi", "split", "spliti", "sql_regcase"] + b["RpmInfo"] = Set.new ["rpmaddtag", "rpmdbinfo", "rpmdbsearch", "rpminfo", "rpmvercmp"] + b["RPM Reader"] = Set.new ["rpm_close", "rpm_get_tag", "rpm_is_valid", "rpm_open", "rpm_version"] + b["RRD"] = Set.new ["rrd_create", "rrd_error", "rrd_fetch", "rrd_first", "rrd_graph", "rrd_info", "rrd_last", "rrd_lastupdate", "rrd_restore", "rrd_tune", "rrd_update", "rrd_version", "rrd_xport", "rrdc_disconnect"] + b["runkit"] = Set.new ["runkit_class_adopt", "runkit_class_emancipate", "runkit_constant_add", "runkit_constant_redefine", "runkit_constant_remove", "runkit_function_add", "runkit_function_copy", "runkit_function_redefine", "runkit_function_remove", "runkit_function_rename", "runkit_import", "runkit_lint_file", "runkit_lint", "runkit_method_add", "runkit_method_copy", "runkit_method_redefine", "runkit_method_remove", "runkit_method_rename", "runkit_return_value_used", "runkit_sandbox_output_handler", "runkit_superglobals"] + b["runkit7"] = Set.new ["runkit7_constant_add", "runkit7_constant_redefine", "runkit7_constant_remove", "runkit7_function_add", "runkit7_function_copy", "runkit7_function_redefine", "runkit7_function_remove", "runkit7_function_rename", "runkit7_import", "runkit7_method_add", "runkit7_method_copy", "runkit7_method_redefine", "runkit7_method_remove", "runkit7_method_rename", "runkit7_object_id", "runkit7_superglobals", "runkit7_zval_inspect"] + b["Scoutapm"] = Set.new ["scoutapm_get_calls", "scoutapm_list_instrumented_functions"] + b["Seaslog"] = Set.new ["seaslog_get_author", "seaslog_get_version"] + b["Semaphore"] = Set.new ["ftok", "msg_get_queue", "msg_queue_exists", "msg_receive", "msg_remove_queue", "msg_send", "msg_set_queue", "msg_stat_queue", "sem_acquire", "sem_get", "sem_release", "sem_remove", "shm_attach", "shm_detach", "shm_get_var", "shm_has_var", "shm_put_var", "shm_remove_var", "shm_remove"] + b["Session PgSQL"] = Set.new ["session_pgsql_add_error", "session_pgsql_get_error", "session_pgsql_get_field", "session_pgsql_reset", "session_pgsql_set_field", "session_pgsql_status"] + b["Session"] = Set.new ["session_abort", "session_cache_expire", "session_cache_limiter", "session_commit", "session_create_id", "session_decode", "session_destroy", "session_encode", "session_gc", "session_get_cookie_params", "session_id", "session_is_registered", "session_module_name", "session_name", "session_regenerate_id", "session_register_shutdown", "session_register", "session_reset", "session_save_path", "session_set_cookie_params", "session_set_save_handler", "session_start", "session_status", "session_unregister", "session_unset", "session_write_close"] + b["Shared Memory"] = Set.new ["shmop_close", "shmop_delete", "shmop_open", "shmop_read", "shmop_size", "shmop_write"] + b["SimpleXML"] = Set.new ["simplexml_import_dom", "simplexml_load_file", "simplexml_load_string"] + b["SNMP"] = Set.new ["snmp_get_quick_print", "snmp_get_valueretrieval", "snmp_read_mib", "snmp_set_enum_print", "snmp_set_oid_numeric_print", "snmp_set_oid_output_format", "snmp_set_quick_print", "snmp_set_valueretrieval", "snmp2_get", "snmp2_getnext", "snmp2_real_walk", "snmp2_set", "snmp2_walk", "snmp3_get", "snmp3_getnext", "snmp3_real_walk", "snmp3_set", "snmp3_walk", "snmpget", "snmpgetnext", "snmprealwalk", "snmpset", "snmpwalk", "snmpwalkoid"] + b["SOAP"] = Set.new ["is_soap_fault", "use_soap_error_handler"] + b["Socket"] = Set.new ["socket_accept", "socket_addrinfo_bind", "socket_addrinfo_connect", "socket_addrinfo_explain", "socket_addrinfo_lookup", "socket_bind", "socket_clear_error", "socket_close", "socket_cmsg_space", "socket_connect", "socket_create_listen", "socket_create_pair", "socket_create", "socket_export_stream", "socket_get_option", "socket_getopt", "socket_getpeername", "socket_getsockname", "socket_import_stream", "socket_last_error", "socket_listen", "socket_read", "socket_recv", "socket_recvfrom", "socket_recvmsg", "socket_select", "socket_send", "socket_sendmsg", "socket_sendto", "socket_set_block", "socket_set_nonblock", "socket_set_option", "socket_setopt", "socket_shutdown", "socket_strerror", "socket_write", "socket_wsaprotocol_info_export", "socket_wsaprotocol_info_import", "socket_wsaprotocol_info_release"] + b["Sodium"] = Set.new ["sodium_add", "sodium_base642bin", "sodium_bin2base64", "sodium_bin2hex", "sodium_compare", "sodium_crypto_aead_aes256gcm_decrypt", "sodium_crypto_aead_aes256gcm_encrypt", "sodium_crypto_aead_aes256gcm_is_available", "sodium_crypto_aead_aes256gcm_keygen", "sodium_crypto_aead_chacha20poly1305_decrypt", "sodium_crypto_aead_chacha20poly1305_encrypt", "sodium_crypto_aead_chacha20poly1305_ietf_decrypt", "sodium_crypto_aead_chacha20poly1305_ietf_encrypt", "sodium_crypto_aead_chacha20poly1305_ietf_keygen", "sodium_crypto_aead_chacha20poly1305_keygen", "sodium_crypto_aead_xchacha20poly1305_ietf_decrypt", "sodium_crypto_aead_xchacha20poly1305_ietf_encrypt", "sodium_crypto_aead_xchacha20poly1305_ietf_keygen", "sodium_crypto_auth_keygen", "sodium_crypto_auth_verify", "sodium_crypto_auth", "sodium_crypto_box_keypair_from_secretkey_and_publickey", "sodium_crypto_box_keypair", "sodium_crypto_box_open", "sodium_crypto_box_publickey_from_secretkey", "sodium_crypto_box_publickey", "sodium_crypto_box_seal_open", "sodium_crypto_box_seal", "sodium_crypto_box_secretkey", "sodium_crypto_box_seed_keypair", "sodium_crypto_box", "sodium_crypto_generichash_final", "sodium_crypto_generichash_init", "sodium_crypto_generichash_keygen", "sodium_crypto_generichash_update", "sodium_crypto_generichash", "sodium_crypto_kdf_derive_from_key", "sodium_crypto_kdf_keygen", "sodium_crypto_kx_client_session_keys", "sodium_crypto_kx_keypair", "sodium_crypto_kx_publickey", "sodium_crypto_kx_secretkey", "sodium_crypto_kx_seed_keypair", "sodium_crypto_kx_server_session_keys", "sodium_crypto_pwhash_scryptsalsa208sha256_str_verify", "sodium_crypto_pwhash_scryptsalsa208sha256_str", "sodium_crypto_pwhash_scryptsalsa208sha256", "sodium_crypto_pwhash_str_needs_rehash", "sodium_crypto_pwhash_str_verify", "sodium_crypto_pwhash_str", "sodium_crypto_pwhash", "sodium_crypto_scalarmult_base", "sodium_crypto_scalarmult", "sodium_crypto_secretbox_keygen", "sodium_crypto_secretbox_open", "sodium_crypto_secretbox", "sodium_crypto_secretstream_xchacha20poly1305_init_pull", "sodium_crypto_secretstream_xchacha20poly1305_init_push", "sodium_crypto_secretstream_xchacha20poly1305_keygen", "sodium_crypto_secretstream_xchacha20poly1305_pull", "sodium_crypto_secretstream_xchacha20poly1305_push", "sodium_crypto_secretstream_xchacha20poly1305_rekey", "sodium_crypto_shorthash_keygen", "sodium_crypto_shorthash", "sodium_crypto_sign_detached", "sodium_crypto_sign_ed25519_pk_to_curve25519", "sodium_crypto_sign_ed25519_sk_to_curve25519", "sodium_crypto_sign_keypair_from_secretkey_and_publickey", "sodium_crypto_sign_keypair", "sodium_crypto_sign_open", "sodium_crypto_sign_publickey_from_secretkey", "sodium_crypto_sign_publickey", "sodium_crypto_sign_secretkey", "sodium_crypto_sign_seed_keypair", "sodium_crypto_sign_verify_detached", "sodium_crypto_sign", "sodium_crypto_stream_keygen", "sodium_crypto_stream_xor", "sodium_crypto_stream", "sodium_hex2bin", "sodium_increment", "sodium_memcmp", "sodium_memzero", "sodium_pad", "sodium_unpad"] + b["Solr"] = Set.new ["solr_get_version"] + b["SPL"] = Set.new ["class_implements", "class_parents", "class_uses", "iterator_apply", "iterator_count", "iterator_to_array", "spl_autoload_call", "spl_autoload_extensions", "spl_autoload_functions", "spl_autoload_register", "spl_autoload_unregister", "spl_autoload", "spl_classes", "spl_object_hash", "spl_object_id"] + b["SQLite"] = Set.new ["sqlite_array_query", "sqlite_busy_timeout", "sqlite_changes", "sqlite_close", "sqlite_column", "sqlite_create_aggregate", "sqlite_create_function", "sqlite_current", "sqlite_error_string", "sqlite_escape_string", "sqlite_exec", "sqlite_factory", "sqlite_fetch_all", "sqlite_fetch_array", "sqlite_fetch_column_types", "sqlite_fetch_object", "sqlite_fetch_single", "sqlite_fetch_string", "sqlite_field_name", "sqlite_has_more", "sqlite_has_prev", "sqlite_key", "sqlite_last_error", "sqlite_last_insert_rowid", "sqlite_libencoding", "sqlite_libversion", "sqlite_next", "sqlite_num_fields", "sqlite_num_rows", "sqlite_open", "sqlite_popen", "sqlite_prev", "sqlite_query", "sqlite_rewind", "sqlite_seek", "sqlite_single_query", "sqlite_udf_decode_binary", "sqlite_udf_encode_binary", "sqlite_unbuffered_query", "sqlite_valid"] + b["SQLSRV"] = Set.new ["sqlsrv_begin_transaction", "sqlsrv_cancel", "sqlsrv_client_info", "sqlsrv_close", "sqlsrv_commit", "sqlsrv_configure", "sqlsrv_connect", "sqlsrv_errors", "sqlsrv_execute", "sqlsrv_fetch_array", "sqlsrv_fetch_object", "sqlsrv_fetch", "sqlsrv_field_metadata", "sqlsrv_free_stmt", "sqlsrv_get_config", "sqlsrv_get_field", "sqlsrv_has_rows", "sqlsrv_next_result", "sqlsrv_num_fields", "sqlsrv_num_rows", "sqlsrv_prepare", "sqlsrv_query", "sqlsrv_rollback", "sqlsrv_rows_affected", "sqlsrv_send_stream_data", "sqlsrv_server_info"] + b["ssdeep"] = Set.new ["ssdeep_fuzzy_compare", "ssdeep_fuzzy_hash_filename", "ssdeep_fuzzy_hash"] + b["SSH2"] = Set.new ["ssh2_auth_agent", "ssh2_auth_hostbased_file", "ssh2_auth_none", "ssh2_auth_password", "ssh2_auth_pubkey_file", "ssh2_connect", "ssh2_disconnect", "ssh2_exec", "ssh2_fetch_stream", "ssh2_fingerprint", "ssh2_methods_negotiated", "ssh2_publickey_add", "ssh2_publickey_init", "ssh2_publickey_list", "ssh2_publickey_remove", "ssh2_scp_recv", "ssh2_scp_send", "ssh2_sftp_chmod", "ssh2_sftp_lstat", "ssh2_sftp_mkdir", "ssh2_sftp_readlink", "ssh2_sftp_realpath", "ssh2_sftp_rename", "ssh2_sftp_rmdir", "ssh2_sftp_stat", "ssh2_sftp_symlink", "ssh2_sftp_unlink", "ssh2_sftp", "ssh2_shell", "ssh2_tunnel"] + b["Statistic"] = Set.new ["stats_absolute_deviation", "stats_cdf_beta", "stats_cdf_binomial", "stats_cdf_cauchy", "stats_cdf_chisquare", "stats_cdf_exponential", "stats_cdf_f", "stats_cdf_gamma", "stats_cdf_laplace", "stats_cdf_logistic", "stats_cdf_negative_binomial", "stats_cdf_noncentral_chisquare", "stats_cdf_noncentral_f", "stats_cdf_noncentral_t", "stats_cdf_normal", "stats_cdf_poisson", "stats_cdf_t", "stats_cdf_uniform", "stats_cdf_weibull", "stats_covariance", "stats_dens_beta", "stats_dens_cauchy", "stats_dens_chisquare", "stats_dens_exponential", "stats_dens_f", "stats_dens_gamma", "stats_dens_laplace", "stats_dens_logistic", "stats_dens_normal", "stats_dens_pmf_binomial", "stats_dens_pmf_hypergeometric", "stats_dens_pmf_negative_binomial", "stats_dens_pmf_poisson", "stats_dens_t", "stats_dens_uniform", "stats_dens_weibull", "stats_harmonic_mean", "stats_kurtosis", "stats_rand_gen_beta", "stats_rand_gen_chisquare", "stats_rand_gen_exponential", "stats_rand_gen_f", "stats_rand_gen_funiform", "stats_rand_gen_gamma", "stats_rand_gen_ibinomial_negative", "stats_rand_gen_ibinomial", "stats_rand_gen_int", "stats_rand_gen_ipoisson", "stats_rand_gen_iuniform", "stats_rand_gen_noncentral_chisquare", "stats_rand_gen_noncentral_f", "stats_rand_gen_noncentral_t", "stats_rand_gen_normal", "stats_rand_gen_t", "stats_rand_get_seeds", "stats_rand_phrase_to_seeds", "stats_rand_ranf", "stats_rand_setall", "stats_skew", "stats_standard_deviation", "stats_stat_binomial_coef", "stats_stat_correlation", "stats_stat_factorial", "stats_stat_independent_t", "stats_stat_innerproduct", "stats_stat_paired_t", "stats_stat_percentile", "stats_stat_powersum", "stats_variance"] + b["Stomp"] = Set.new ["stomp_connect_error", "stomp_version"] + b["Stream"] = Set.new ["set_socket_blocking", "stream_bucket_append", "stream_bucket_make_writeable", "stream_bucket_new", "stream_bucket_prepend", "stream_context_create", "stream_context_get_default", "stream_context_get_options", "stream_context_get_params", "stream_context_set_default", "stream_context_set_option", "stream_context_set_params", "stream_copy_to_stream", "stream_filter_append", "stream_filter_prepend", "stream_filter_register", "stream_filter_remove", "stream_get_contents", "stream_get_filters", "stream_get_line", "stream_get_meta_data", "stream_get_transports", "stream_get_wrappers", "stream_is_local", "stream_isatty", "stream_notification_callback", "stream_register_wrapper", "stream_resolve_include_path", "stream_select", "stream_set_blocking", "stream_set_chunk_size", "stream_set_read_buffer", "stream_set_timeout", "stream_set_write_buffer", "stream_socket_accept", "stream_socket_client", "stream_socket_enable_crypto", "stream_socket_get_name", "stream_socket_pair", "stream_socket_recvfrom", "stream_socket_sendto", "stream_socket_server", "stream_socket_shutdown", "stream_supports_lock", "stream_wrapper_register", "stream_wrapper_restore", "stream_wrapper_unregister"] + b["String"] = Set.new ["addcslashes", "addslashes", "bin2hex", "chop", "chr", "chunk_split", "convert_cyr_string", "convert_uudecode", "convert_uuencode", "count_chars", "crc32", "crypt", "echo", "explode", "fprintf", "get_html_translation_table", "hebrev", "hebrevc", "hex2bin", "html_entity_decode", "htmlentities", "htmlspecialchars_decode", "htmlspecialchars", "implode", "join", "lcfirst", "levenshtein", "localeconv", "ltrim", "md5_file", "md5", "metaphone", "money_format", "nl_langinfo", "nl2br", "number_format", "ord", "parse_str", "print", "printf", "quoted_printable_decode", "quoted_printable_encode", "quotemeta", "rtrim", "setlocale", "sha1_file", "sha1", "similar_text", "soundex", "sprintf", "sscanf", "str_getcsv", "str_ireplace", "str_pad", "str_repeat", "str_replace", "str_rot13", "str_shuffle", "str_split", "str_word_count", "strcasecmp", "strchr", "strcmp", "strcoll", "strcspn", "strip_tags", "stripcslashes", "stripos", "stripslashes", "stristr", "strlen", "strnatcasecmp", "strnatcmp", "strncasecmp", "strncmp", "strpbrk", "strpos", "strrchr", "strrev", "strripos", "strrpos", "strspn", "strstr", "strtok", "strtolower", "strtoupper", "strtr", "substr_compare", "substr_count", "substr_replace", "substr", "trim", "ucfirst", "ucwords", "vfprintf", "vprintf", "vsprintf", "wordwrap"] + b["SVN"] = Set.new ["svn_add", "svn_auth_get_parameter", "svn_auth_set_parameter", "svn_blame", "svn_cat", "svn_checkout", "svn_cleanup", "svn_client_version", "svn_commit", "svn_delete", "svn_diff", "svn_export", "svn_fs_abort_txn", "svn_fs_apply_text", "svn_fs_begin_txn2", "svn_fs_change_node_prop", "svn_fs_check_path", "svn_fs_contents_changed", "svn_fs_copy", "svn_fs_delete", "svn_fs_dir_entries", "svn_fs_file_contents", "svn_fs_file_length", "svn_fs_is_dir", "svn_fs_is_file", "svn_fs_make_dir", "svn_fs_make_file", "svn_fs_node_created_rev", "svn_fs_node_prop", "svn_fs_props_changed", "svn_fs_revision_prop", "svn_fs_revision_root", "svn_fs_txn_root", "svn_fs_youngest_rev", "svn_import", "svn_log", "svn_ls", "svn_mkdir", "svn_repos_create", "svn_repos_fs_begin_txn_for_commit", "svn_repos_fs_commit_txn", "svn_repos_fs", "svn_repos_hotcopy", "svn_repos_open", "svn_repos_recover", "svn_revert", "svn_status", "svn_update"] + b["Swoole"] = Set.new ["swoole_async_dns_lookup", "swoole_async_read", "swoole_async_readfile", "swoole_async_set", "swoole_async_write", "swoole_async_writefile", "swoole_client_select", "swoole_cpu_num", "swoole_errno", "swoole_event_add", "swoole_event_defer", "swoole_event_del", "swoole_event_exit", "swoole_event_set", "swoole_event_wait", "swoole_event_write", "swoole_get_local_ip", "swoole_last_error", "swoole_load_module", "swoole_select", "swoole_set_process_name", "swoole_strerror", "swoole_timer_after", "swoole_timer_exists", "swoole_timer_tick", "swoole_version"] + b["Sybase"] = Set.new ["sybase_affected_rows", "sybase_close", "sybase_connect", "sybase_data_seek", "sybase_deadlock_retry_count", "sybase_fetch_array", "sybase_fetch_assoc", "sybase_fetch_field", "sybase_fetch_object", "sybase_fetch_row", "sybase_field_seek", "sybase_free_result", "sybase_get_last_message", "sybase_min_client_severity", "sybase_min_error_severity", "sybase_min_message_severity", "sybase_min_server_severity", "sybase_num_fields", "sybase_num_rows", "sybase_pconnect", "sybase_query", "sybase_result", "sybase_select_db", "sybase_set_message_handler", "sybase_unbuffered_query"] + b["Taint"] = Set.new ["is_tainted", "taint", "untaint"] + b["TCP"] = Set.new ["tcpwrap_check"] + b["Tidy"] = Set.new ["ob_tidyhandler", "tidy_access_count", "tidy_config_count", "tidy_error_count", "tidy_get_output", "tidy_warning_count"] + b["Tokenizer"] = Set.new ["token_get_all", "token_name"] + b["Trader"] = Set.new ["trader_acos", "trader_ad", "trader_add", "trader_adosc", "trader_adx", "trader_adxr", "trader_apo", "trader_aroon", "trader_aroonosc", "trader_asin", "trader_atan", "trader_atr", "trader_avgprice", "trader_bbands", "trader_beta", "trader_bop", "trader_cci", "trader_cdl2crows", "trader_cdl3blackcrows", "trader_cdl3inside", "trader_cdl3linestrike", "trader_cdl3outside", "trader_cdl3starsinsouth", "trader_cdl3whitesoldiers", "trader_cdlabandonedbaby", "trader_cdladvanceblock", "trader_cdlbelthold", "trader_cdlbreakaway", "trader_cdlclosingmarubozu", "trader_cdlconcealbabyswall", "trader_cdlcounterattack", "trader_cdldarkcloudcover", "trader_cdldoji", "trader_cdldojistar", "trader_cdldragonflydoji", "trader_cdlengulfing", "trader_cdleveningdojistar", "trader_cdleveningstar", "trader_cdlgapsidesidewhite", "trader_cdlgravestonedoji", "trader_cdlhammer", "trader_cdlhangingman", "trader_cdlharami", "trader_cdlharamicross", "trader_cdlhighwave", "trader_cdlhikkake", "trader_cdlhikkakemod", "trader_cdlhomingpigeon", "trader_cdlidentical3crows", "trader_cdlinneck", "trader_cdlinvertedhammer", "trader_cdlkicking", "trader_cdlkickingbylength", "trader_cdlladderbottom", "trader_cdllongleggeddoji", "trader_cdllongline", "trader_cdlmarubozu", "trader_cdlmatchinglow", "trader_cdlmathold", "trader_cdlmorningdojistar", "trader_cdlmorningstar", "trader_cdlonneck", "trader_cdlpiercing", "trader_cdlrickshawman", "trader_cdlrisefall3methods", "trader_cdlseparatinglines", "trader_cdlshootingstar", "trader_cdlshortline", "trader_cdlspinningtop", "trader_cdlstalledpattern", "trader_cdlsticksandwich", "trader_cdltakuri", "trader_cdltasukigap", "trader_cdlthrusting", "trader_cdltristar", "trader_cdlunique3river", "trader_cdlupsidegap2crows", "trader_cdlxsidegap3methods", "trader_ceil", "trader_cmo", "trader_correl", "trader_cos", "trader_cosh", "trader_dema", "trader_div", "trader_dx", "trader_ema", "trader_errno", "trader_exp", "trader_floor", "trader_get_compat", "trader_get_unstable_period", "trader_ht_dcperiod", "trader_ht_dcphase", "trader_ht_phasor", "trader_ht_sine", "trader_ht_trendline", "trader_ht_trendmode", "trader_kama", "trader_linearreg_angle", "trader_linearreg_intercept", "trader_linearreg_slope", "trader_linearreg", "trader_ln", "trader_log10", "trader_ma", "trader_macd", "trader_macdext", "trader_macdfix", "trader_mama", "trader_mavp", "trader_max", "trader_maxindex", "trader_medprice", "trader_mfi", "trader_midpoint", "trader_midprice", "trader_min", "trader_minindex", "trader_minmax", "trader_minmaxindex", "trader_minus_di", "trader_minus_dm", "trader_mom", "trader_mult", "trader_natr", "trader_obv", "trader_plus_di", "trader_plus_dm", "trader_ppo", "trader_roc", "trader_rocp", "trader_rocr100", "trader_rocr", "trader_rsi", "trader_sar", "trader_sarext", "trader_set_compat", "trader_set_unstable_period", "trader_sin", "trader_sinh", "trader_sma", "trader_sqrt", "trader_stddev", "trader_stoch", "trader_stochf", "trader_stochrsi", "trader_sub", "trader_sum", "trader_t3", "trader_tan", "trader_tanh", "trader_tema", "trader_trange", "trader_trima", "trader_trix", "trader_tsf", "trader_typprice", "trader_ultosc", "trader_var", "trader_wclprice", "trader_willr", "trader_wma"] + b["UI"] = Set.new ["UI\\Draw\\Text\\Font\\fontFamilies", "UI\\quit", "UI\\run"] + b["ODBC"] = Set.new ["odbc_autocommit", "odbc_binmode", "odbc_close_all", "odbc_close", "odbc_columnprivileges", "odbc_columns", "odbc_commit", "odbc_connect", "odbc_cursor", "odbc_data_source", "odbc_do", "odbc_error", "odbc_errormsg", "odbc_exec", "odbc_execute", "odbc_fetch_array", "odbc_fetch_into", "odbc_fetch_object", "odbc_fetch_row", "odbc_field_len", "odbc_field_name", "odbc_field_num", "odbc_field_precision", "odbc_field_scale", "odbc_field_type", "odbc_foreignkeys", "odbc_free_result", "odbc_gettypeinfo", "odbc_longreadlen", "odbc_next_result", "odbc_num_fields", "odbc_num_rows", "odbc_pconnect", "odbc_prepare", "odbc_primarykeys", "odbc_procedurecolumns", "odbc_procedures", "odbc_result_all", "odbc_result", "odbc_rollback", "odbc_setoption", "odbc_specialcolumns", "odbc_statistics", "odbc_tableprivileges", "odbc_tables"] + b["Uopz"] = Set.new ["uopz_add_function", "uopz_allow_exit", "uopz_backup", "uopz_compose", "uopz_copy", "uopz_del_function", "uopz_delete", "uopz_extend", "uopz_flags", "uopz_function", "uopz_get_exit_status", "uopz_get_hook", "uopz_get_mock", "uopz_get_property", "uopz_get_return", "uopz_get_static", "uopz_implement", "uopz_overload", "uopz_redefine", "uopz_rename", "uopz_restore", "uopz_set_hook", "uopz_set_mock", "uopz_set_property", "uopz_set_return", "uopz_set_static", "uopz_undefine", "uopz_unset_hook", "uopz_unset_mock", "uopz_unset_return"] + b["URL"] = Set.new ["base64_decode", "base64_encode", "get_headers", "get_meta_tags", "http_build_query", "parse_url", "rawurldecode", "rawurlencode", "urldecode", "urlencode"] + b["Variable handling"] = Set.new ["boolval", "debug_zval_dump", "doubleval", "empty", "floatval", "get_defined_vars", "get_resource_type", "gettype", "import_request_variables", "intval", "is_array", "is_bool", "is_callable", "is_countable", "is_double", "is_float", "is_int", "is_integer", "is_iterable", "is_long", "is_null", "is_numeric", "is_object", "is_real", "is_resource", "is_scalar", "is_string", "isset", "print_r", "serialize", "settype", "strval", "unserialize", "unset", "var_dump", "var_export"] + b["vpopmail"] = Set.new ["vpopmail_add_alias_domain_ex", "vpopmail_add_alias_domain", "vpopmail_add_domain_ex", "vpopmail_add_domain", "vpopmail_add_user", "vpopmail_alias_add", "vpopmail_alias_del_domain", "vpopmail_alias_del", "vpopmail_alias_get_all", "vpopmail_alias_get", "vpopmail_auth_user", "vpopmail_del_domain_ex", "vpopmail_del_domain", "vpopmail_del_user", "vpopmail_error", "vpopmail_passwd", "vpopmail_set_user_quota"] + b["WDDX"] = Set.new ["wddx_add_vars", "wddx_deserialize", "wddx_packet_end", "wddx_packet_start", "wddx_serialize_value", "wddx_serialize_vars"] + b["win32ps"] = Set.new ["win32_ps_list_procs", "win32_ps_stat_mem", "win32_ps_stat_proc"] + b["win32service"] = Set.new ["win32_continue_service", "win32_create_service", "win32_delete_service", "win32_get_last_control_message", "win32_pause_service", "win32_query_service_status", "win32_send_custom_control", "win32_set_service_exit_code", "win32_set_service_exit_mode", "win32_set_service_status", "win32_start_service_ctrl_dispatcher", "win32_start_service", "win32_stop_service"] + b["WinCache"] = Set.new ["wincache_fcache_fileinfo", "wincache_fcache_meminfo", "wincache_lock", "wincache_ocache_fileinfo", "wincache_ocache_meminfo", "wincache_refresh_if_changed", "wincache_rplist_fileinfo", "wincache_rplist_meminfo", "wincache_scache_info", "wincache_scache_meminfo", "wincache_ucache_add", "wincache_ucache_cas", "wincache_ucache_clear", "wincache_ucache_dec", "wincache_ucache_delete", "wincache_ucache_exists", "wincache_ucache_get", "wincache_ucache_inc", "wincache_ucache_info", "wincache_ucache_meminfo", "wincache_ucache_set", "wincache_unlock"] + b["xattr"] = Set.new ["xattr_get", "xattr_list", "xattr_remove", "xattr_set", "xattr_supported"] + b["xdiff"] = Set.new ["xdiff_file_bdiff_size", "xdiff_file_bdiff", "xdiff_file_bpatch", "xdiff_file_diff_binary", "xdiff_file_diff", "xdiff_file_merge3", "xdiff_file_patch_binary", "xdiff_file_patch", "xdiff_file_rabdiff", "xdiff_string_bdiff_size", "xdiff_string_bdiff", "xdiff_string_bpatch", "xdiff_string_diff_binary", "xdiff_string_diff", "xdiff_string_merge3", "xdiff_string_patch_binary", "xdiff_string_patch", "xdiff_string_rabdiff"] + b["Xhprof"] = Set.new ["xhprof_disable", "xhprof_enable", "xhprof_sample_disable", "xhprof_sample_enable"] + b["XML Parser"] = Set.new ["utf8_decode", "utf8_encode", "xml_error_string", "xml_get_current_byte_index", "xml_get_current_column_number", "xml_get_current_line_number", "xml_get_error_code", "xml_parse_into_struct", "xml_parse", "xml_parser_create_ns", "xml_parser_create", "xml_parser_free", "xml_parser_get_option", "xml_parser_set_option", "xml_set_character_data_handler", "xml_set_default_handler", "xml_set_element_handler", "xml_set_end_namespace_decl_handler", "xml_set_external_entity_ref_handler", "xml_set_notation_decl_handler", "xml_set_object", "xml_set_processing_instruction_handler", "xml_set_start_namespace_decl_handler", "xml_set_unparsed_entity_decl_handler"] + b["XML-RPC"] = Set.new ["xmlrpc_decode_request", "xmlrpc_decode", "xmlrpc_encode_request", "xmlrpc_encode", "xmlrpc_get_type", "xmlrpc_is_fault", "xmlrpc_parse_method_descriptions", "xmlrpc_server_add_introspection_data", "xmlrpc_server_call_method", "xmlrpc_server_create", "xmlrpc_server_destroy", "xmlrpc_server_register_introspection_callback", "xmlrpc_server_register_method", "xmlrpc_set_type"] + b["Yaml"] = Set.new ["yaml_emit_file", "yaml_emit", "yaml_parse_file", "yaml_parse_url", "yaml_parse"] + b["YAZ"] = Set.new ["yaz_addinfo", "yaz_ccl_conf", "yaz_ccl_parse", "yaz_close", "yaz_connect", "yaz_database", "yaz_element", "yaz_errno", "yaz_error", "yaz_es_result", "yaz_es", "yaz_get_option", "yaz_hits", "yaz_itemorder", "yaz_present", "yaz_range", "yaz_record", "yaz_scan_result", "yaz_scan", "yaz_schema", "yaz_search", "yaz_set_option", "yaz_sort", "yaz_syntax", "yaz_wait"] + b["Zip"] = Set.new ["zip_close", "zip_entry_close", "zip_entry_compressedsize", "zip_entry_compressionmethod", "zip_entry_filesize", "zip_entry_name", "zip_entry_open", "zip_entry_read", "zip_open", "zip_read"] + b["Zlib"] = Set.new ["deflate_add", "deflate_init", "gzclose", "gzcompress", "gzdecode", "gzdeflate", "gzencode", "gzeof", "gzfile", "gzgetc", "gzgets", "gzgetss", "gzinflate", "gzopen", "gzpassthru", "gzputs", "gzread", "gzrewind", "gzseek", "gztell", "gzuncompress", "gzwrite", "inflate_add", "inflate_get_read_len", "inflate_get_status", "inflate_init", "readgzfile", "zlib_decode", "zlib_encode", "zlib_get_coding_type"] + b["ZooKeeper"] = Set.new ["zookeeper_dispatch"] + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/plain_text.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/plain_text.rb new file mode 100644 index 000000000000..db49767aad16 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/plain_text.rb @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class PlainText < Lexer + title "Plain Text" + desc "A boring lexer that doesn't highlight anything" + + tag 'plaintext' + aliases 'text' + filenames '*.txt', 'Messages' + mimetypes 'text/plain' + + attr_reader :token + def initialize(*) + super + + @token = token_option(:token) || Text + end + + def stream_tokens(string, &b) + yield self.token, string + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/plist.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/plist.rb new file mode 100644 index 000000000000..bd0ed9bdf893 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/plist.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + class Plist < RegexLexer + desc 'plist' + tag 'plist' + aliases 'plist' + filenames '*.plist', '*.pbxproj' + + mimetypes 'text/x-plist', 'application/x-plist' + + state :whitespace do + rule %r/\s+/, Text::Whitespace + end + + state :root do + rule %r{//.*$}, Comment + rule %r{/\*.+?\*/}m, Comment + mixin :whitespace + rule %r/{/, Punctuation, :dictionary + rule %r/\(/, Punctuation, :array + rule %r/"([^"\\]|\\.)*"/, Literal::String::Double + rule %r/'([^'\\]|\\.)*'/, Literal::String::Single + rule %r/</, Punctuation, :data + rule %r{[\w$/:.-]+}, Literal + end + + state :dictionary do + mixin :root + rule %r/[=;]/, Punctuation + rule %r/}/, Punctuation, :pop! + end + + state :array do + mixin :root + rule %r/[,]/, Punctuation + rule %r/\)/, Punctuation, :pop! + end + + state :data do + rule %r/[\h\s]+/, Literal::Number::Hex + rule %r/>/, Punctuation, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/pony.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/pony.rb new file mode 100644 index 000000000000..b0510b6505bd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/pony.rb @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Pony < RegexLexer + tag 'pony' + filenames '*.pony' + + keywords = Set.new %w( + actor addressof and as + be break + class compiler_intrinsic consume continue + do + else elseif embed end error + for fun + if ifdef in interface is isnt + lambda let + match + new not + object + primitive + recover repeat return + struct + then this trait try type + until use + var + where while with + ) + + capabilities = Set.new %w( + box iso ref tag trn val + ) + + types = Set.new %w( + Number Signed Unsigned Float + I8 I16 I32 I64 I128 U8 U32 U64 U128 F32 F64 + EventID Align IntFormat NumberPrefix FloatFormat + Type + ) + + state :whitespace do + rule %r/\s+/m, Text + end + + state :root do + mixin :whitespace + rule %r/"""/, Str::Doc, :docstring + rule %r{//.*}, Comment::Single + rule %r{/(\\\n)?[*](.|\n)*?[*](\\\n)?/}, Comment::Multiline + rule %r/"/, Str, :string + rule %r([~!%^&*+=\|?:<>/-]), Operator + rule %r/(true|false|NULL)\b/, Name::Constant + rule %r{(?:[A-Z_][a-zA-Z0-9_]*)}, Name::Class + rule %r/[()\[\],.';]/, Punctuation + + # Numbers + rule %r/0[xX]([0-9a-fA-F_]*\.[0-9a-fA-F_]+|[0-9a-fA-F_]+)[pP][+\-]?[0-9_]+[fFL]?[i]?/, Num::Float + rule %r/[0-9_]+(\.[0-9_]+[eE][+\-]?[0-9_]+|\.[0-9_]*|[eE][+\-]?[0-9_]+)[fFL]?[i]?/, Num::Float + rule %r/\.(0|[1-9][0-9_]*)([eE][+\-]?[0-9_]+)?[fFL]?[i]?/, Num::Float + rule %r/0[xX][0-9a-fA-F_]+/, Num::Hex + rule %r/(0|[1-9][0-9_]*)([LUu]|Lu|LU|uL|UL)?/, Num::Integer + + rule %r/[a-z_][a-z0-9_]*/io do |m| + match = m[0] + + if capabilities.include?(match) + token Keyword::Declaration + elsif keywords.include?(match) + token Keyword::Reserved + elsif types.include?(match) + token Keyword::Type + else + token Name + end + end + end + + state :string do + rule %r/"/, Str, :pop! + rule %r/\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape + rule %r/[^\\"\n]+/, Str + rule %r/\\\n/, Str + rule %r/\\/, Str # stray backslash + end + + state :docstring do + rule %r/"""/, Str::Doc, :pop! + rule %r/\n/, Str::Doc + rule %r/./, Str::Doc + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/postscript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/postscript.rb new file mode 100644 index 000000000000..57e8b61c0b45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/postscript.rb @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# Adapted from pygments PostScriptLexer +module Rouge + module Lexers + class PostScript < RegexLexer + title "PostScript" + desc "The PostScript language (adobe.com/devnet/postscript.html)" + tag "postscript" + aliases "postscr", "postscript", "ps", "eps" + filenames "*.ps", "*.eps" + mimetypes "application/postscript" + + def self.detect?(text) + return true if /^%!/ =~ text + end + + delimiter = %s"()<>\[\]{}/%\s" + delimiter_end = Regexp.new("(?=[#{delimiter}])") + valid_name_chars = Regexp.new("[^#{delimiter}]") + valid_name = /#{valid_name_chars}+#{delimiter_end}/ + + # These keywords taken from + # <http://www.math.ubc.ca/~cass/graphics/manual/pdf/a1.pdf> + # Is there an authoritative list anywhere that doesn't involve + # trawling documentation? + keywords = %w/abs add aload arc arcn array atan begin + bind ceiling charpath clip closepath concat + concatmatrix copy cos currentlinewidth currentmatrix + currentpoint curveto cvi cvs def defaultmatrix + dict dictstackoverflow div dtransform dup end + exch exec exit exp fill findfont floor get + getinterval grestore gsave identmatrix idiv + idtransform index invertmatrix itransform length + lineto ln load log loop matrix mod moveto + mul neg newpath pathforall pathbbox pop print + pstack put quit rand rangecheck rcurveto repeat + restore rlineto rmoveto roll rotate round run + save scale scalefont setdash setfont setgray + setlinecap setlinejoin setlinewidth setmatrix + setrgbcolor shfill show showpage sin sqrt + stack stringwidth stroke strokepath sub syntaxerror + transform translate truncate typecheck undefined + undefinedfilename undefinedresult/ + + state :root do + # All comment types + rule %r'^%!.+?$', Comment::Preproc + rule %r'%%.*?$', Comment::Special + rule %r'(^%.*?$){2,}', Comment::Multiline + rule %r'%.*?$', Comment::Single + + # String literals are awkward; enter separate state. + rule %r'\(', Str, :stringliteral + + # References + rule %r'/#{valid_name}', Name::Variable + + rule %r'[{}<>\[\]]', Punctuation + + rule %r'(?:#{keywords.join('|')})#{delimiter_end}', Name::Builtin + + # Conditionals / flow control + rule %r'(eq|ne|g[et]|l[et]|and|or|not|if(?:else)?|for(?:all)?)#{delimiter_end}', Keyword::Reserved + rule %r'(false|true)#{delimiter_end}', Keyword::Constant + + # Numbers + rule %r'<[0-9A-Fa-f]+>#{delimiter_end}', Num::Hex + # Slight abuse: use Oct to signify any explicit base system + rule %r'[0-9]+\#(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)((e|E)[0-9]+)?#{delimiter_end}', Num::Oct + rule %r'(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)((e|E)[0-9]+)?#{delimiter_end}', Num::Float + rule %r'(\-|\+)?[0-9]+#{delimiter_end}', Num::Integer + + # Names + rule valid_name, Name::Function # Anything else is executed + + rule %r'\s+', Text + end + + state :stringliteral do + rule %r'[^()\\]+', Str + rule %r'\\', Str::Escape, :escape + rule %r'\(', Str, :stringliteral + rule %r'\)', Str, :pop! + end + + state :escape do + rule %r'[0-8]{3}|n|r|t|b|f|\\|\(|\)', Str::Escape, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/powershell.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/powershell.rb new file mode 100644 index 000000000000..58f015f86158 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/powershell.rb @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + + class Powershell < RegexLexer + title 'powershell' + desc 'powershell' + tag 'powershell' + aliases 'posh', 'microsoftshell', 'msshell' + filenames '*.ps1', '*.psm1', '*.psd1', '*.psrc', '*.pssc' + mimetypes 'text/x-powershell' + + # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_cmdletbindingattribute?view=powershell-6 + ATTRIBUTES = %w( + ConfirmImpact DefaultParameterSetName HelpURI PositionalBinding + SupportsPaging SupportsShouldProcess + ) + + # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-6 + AUTO_VARS = %w( + \$\$ \$\? \$\^ \$_ + \$args \$ConsoleFileName \$Error \$Event \$EventArgs \$EventSubscriber + \$ExecutionContext \$false \$foreach \$HOME \$Host \$input \$IsCoreCLR + \$IsLinux \$IsMacOS \$IsWindows \$LastExitCode \$Matches \$MyInvocation + \$NestedPromptLevel \$null \$PID \$PROFILE \$PSBoundParameters \$PSCmdlet + \$PSCommandPath \$PSCulture \$PSDebugContext \$PSHOME \$PSItem + \$PSScriptRoot \$PSSenderInfo \$PSUICulture \$PSVersionTable \$PWD + \$REPORTERRORSHOWEXCEPTIONCLASS \$REPORTERRORSHOWINNEREXCEPTION + \$REPORTERRORSHOWSOURCE \$REPORTERRORSHOWSTACKTRACE + \$SENDER \$ShellId \$StackTrace \$switch \$this \$true + ).join('|') + + # https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_reserved_words?view=powershell-6 + KEYWORDS = %w( + assembly exit process base filter public begin finally return break for + sequence catch foreach static class from switch command function throw + configuration hidden trap continue if try data in type define + inlinescript until do interface using dynamicparam module var else + namespace while elseif parallel workflow end param enum private + ).join('|') + + # https://devblogs.microsoft.com/scripting/powertip-find-a-list-of-powershell-type-accelerators/ + # ([PSObject].Assembly.GetType("System.Management.Automation.TypeAccelerators")::Get).Keys -join ' ' + KEYWORDS_TYPE = %w( + Alias AllowEmptyCollection AllowEmptyString AllowNull ArgumentCompleter + array bool byte char CmdletBinding datetime decimal double DscResource + float single guid hashtable int int32 int16 long int64 ciminstance + cimclass cimtype cimconverter IPEndpoint NullString OutputType + ObjectSecurity Parameter PhysicalAddress pscredential PSDefaultValue + pslistmodifier psobject pscustomobject psprimitivedictionary ref + PSTypeNameAttribute regex DscProperty sbyte string SupportsWildcards + switch cultureinfo bigint securestring timespan uint16 uint32 uint64 + uri ValidateCount ValidateDrive ValidateLength ValidateNotNull + ValidateNotNullOrEmpty ValidatePattern ValidateRange ValidateScript + ValidateSet ValidateTrustedData ValidateUserDrive version void + ipaddress DscLocalConfigurationManager WildcardPattern X509Certificate + X500DistinguishedName xml CimSession adsi adsisearcher wmiclass wmi + wmisearcher mailaddress scriptblock psvariable type psmoduleinfo + powershell runspacefactory runspace initialsessionstate psscriptmethod + psscriptproperty psnoteproperty psaliasproperty psvariableproperty + ).join('|') + + OPERATORS = %w( + -split -isplit -csplit -join -is -isnot -as -eq -ieq -ceq -ne -ine -cne + -gt -igt -cgt -ge -ige -cge -lt -ilt -clt -le -ile -cle -like -ilike + -clike -notlike -inotlike -cnotlike -match -imatch -cmatch -notmatch + -inotmatch -cnotmatch -contains -icontains -ccontains -notcontains + -inotcontains -cnotcontains -replace -ireplace -creplace -shl -shr -band + -bor -bxor -and -or -xor -not \+= -= \*= \/= %= + ).join('|') + + MULTILINE_KEYWORDS = %w( + synopsis description parameter example inputs outputs notes link + component role functionality forwardhelptargetname forwardhelpcategory + remotehelprunspace externalhelp + ).join('|') + + state :variable do + rule %r/#{AUTO_VARS}/, Name::Builtin::Pseudo + rule %r/(\$)(?:(\w+)(:))?(\w+|\{(?:[^`]|`.)+?\})/ do + groups Name::Variable, Name::Namespace, Punctuation, Name::Variable + end + rule %r/\$\w+/, Name::Variable + rule %r/\$\{(?:[^`]|`.)+?\}/, Name::Variable + end + + state :multiline do + rule %r/\.(?:#{MULTILINE_KEYWORDS})/i, Comment::Special + rule %r/#>/, Comment::Multiline, :pop! + rule %r/[^#.]+?/m, Comment::Multiline + rule %r/[#.]+/, Comment::Multiline + end + + state :interpol do + rule %r/\)/, Str::Interpol, :pop! + mixin :root + end + + state :dq do + # NB: "abc$" is literally the string abc$. + # Here we prevent :interp from interpreting $" as a variable. + rule %r/(?:\$#?)?"/, Str::Double, :pop! + rule %r/\$\(/, Str::Interpol, :interpol + rule %r/`$/, Str::Escape # line continuation + rule %r/`./, Str::Escape + rule %r/[^"`$]+/, Str::Double + mixin :variable + end + + state :sq do + rule %r/'/, Str::Single, :pop! + rule %r/[^']+/, Str::Single + end + + state :heredoc do + rule %r/(?:\$#?)?"@/, Str::Heredoc, :pop! + rule %r/\$\(/, Str::Interpol, :interpol + rule %r/`$/, Str::Escape # line continuation + rule %r/`./, Str::Escape + rule %r/[^"`$]+?/m, Str::Heredoc + rule %r/"+/, Str::Heredoc + mixin :variable + end + + state :class do + rule %r/\{/, Punctuation, :pop! + rule %r/\s+/, Text::Whitespace + rule %r/\w+/, Name::Class + rule %r/[:,]/, Punctuation + end + + state :expr do + mixin :comments + rule %r/"/, Str::Double, :dq + rule %r/'/, Str::Single, :sq + rule %r/@"/, Str::Heredoc, :heredoc + rule %r/@'.*?'@/m, Str::Heredoc + rule %r/\d*\.\d+/, Num::Float + rule %r/\d+/, Num::Integer + rule %r/@\{/, Punctuation, :hasht + rule %r/@\(/, Punctuation, :array + rule %r/{/, Punctuation, :brace + rule %r/\[/, Punctuation, :bracket + end + + state :hasht do + rule %r/\}/, Punctuation, :pop! + rule %r/=/, Operator + rule %r/[,;]/, Punctuation + mixin :expr + rule %r/\w+/, Name::Other + mixin :variable + end + + state :array do + rule %r/\s+/, Text::Whitespace + rule %r/\)/, Punctuation, :pop! + rule %r/[,;]/, Punctuation + mixin :expr + mixin :variable + end + + state :brace do + rule %r/[}]/, Punctuation, :pop! + mixin :root + end + + state :bracket do + rule %r/\]/, Punctuation, :pop! + rule %r/[A-Za-z]\w+\./, Name + rule %r/([A-Za-z]\w+)/ do |m| + if ATTRIBUTES.include? m[0] + token Name::Builtin::Pseudo + else + token Name + end + end + mixin :root + end + + state :parameters do + rule %r/`./m, Str::Escape + rule %r/\s*?\n/, Text::Whitespace, :pop! + rule %r/[;(){}\]]/, Punctuation, :pop! + rule %r/[|=]/, Operator, :pop! + rule %r/[\/\\~\w][-.:\/\\~\w]*/, Name::Other + rule %r/\w[-\w]+/, Name::Other + mixin :root + end + + state :comments do + rule %r/\s+/, Text::Whitespace + rule %r/#.*/, Comment + rule %r/<#/, Comment::Multiline, :multiline + end + + state :root do + mixin :comments + rule %r/#requires\s-version \d(?:\.\d+)?/, Comment::Preproc + + rule %r/\.\.(?=\.?\d)/, Operator + rule %r/(?:#{OPERATORS})\b/i, Operator + + rule %r/(class)(\s+)(\w+)/i do + groups Keyword::Reserved, Text::Whitespace, Name::Class + push :class + end + rule %r/(function)(\s+)(?:(\w+)(:))?(\w[-\w]+)/i do + groups Keyword::Reserved, Text::Whitespace, Name::Namespace, Punctuation, Name::Function + end + rule %r/(?:#{KEYWORDS})\b(?![-.])/i, Keyword::Reserved + + rule %r/-{1,2}\w+/, Name::Tag + + rule %r/(\.)?([-\w]+)(\[)/ do |m| + groups Operator, Name, Punctuation + push :bracket + end + + rule %r/([\/\\~[a-z]][-.:\/\\~\w]*)(\n)?/i do |m| + groups Name, Text::Whitespace + push :parameters + end + + rule %r/(\.)([-\w]+)(?:(\()|(\n))?/ do |m| + groups Operator, Name::Function, Punctuation, Text::Whitespace + push :parameters unless m[3].nil? + end + + rule %r/\?/, Name::Function, :parameters + + mixin :expr + mixin :variable + + rule %r/[-+*\/%=!.&|]/, Operator + rule %r/[{}(),:;]/, Punctuation + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/praat.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/praat.rb new file mode 100644 index 000000000000..b08b1015064c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/praat.rb @@ -0,0 +1,351 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Praat < RegexLexer + title "Praat" + desc "The Praat scripting language (praat.org)" + + tag 'praat' + + filenames '*.praat', '*.proc', '*.psc' + + def self.detect?(text) + return true if text.shebang? 'praat' + end + + keywords = %w( + if then else elsif elif endif fi for from to endfor endproc while + endwhile repeat until select plus minus demo assert stopwatch + nocheck nowarn noprogress editor endeditor clearinfo + ) + + functions_string = %w( + backslashTrigraphsToUnicode chooseDirectory chooseReadFile + chooseWriteFile date demoKey do environment extractLine extractWord + fixed info left mid percent readFile replace replace_regex right + selected string unicodeToBackslashTrigraphs + ) + + functions_numeric = %w( + abs appendFile appendFileLine appendInfo appendInfoLine arccos arccosh + arcsin arcsinh arctan arctan2 arctanh barkToHertz beginPause + beginSendPraat besselI besselK beta beta2 binomialP binomialQ boolean + ceiling chiSquareP chiSquareQ choice comment cos cosh createDirectory + deleteFile demoClicked demoClickedIn demoCommandKeyPressed + demoExtraControlKeyPressed demoInput demoKeyPressed + demoOptionKeyPressed demoShiftKeyPressed demoShow demoWaitForInput + demoWindowTitle demoX demoY differenceLimensToPhon do editor endPause + endSendPraat endsWith erb erbToHertz erf erfc exitScript exp + extractNumber fileReadable fisherP fisherQ floor gaussP gaussQ hash + hertzToBark hertzToErb hertzToMel hertzToSemitones imax imin + incompleteBeta incompleteGammaP index index_regex integer invBinomialP + invBinomialQ invChiSquareQ invFisherQ invGaussQ invSigmoid invStudentQ + length ln lnBeta lnGamma log10 log2 max melToHertz min minusObject + natural number numberOfColumns numberOfRows numberOfSelected + objectsAreIdentical option optionMenu pauseScript + phonToDifferenceLimens plusObject positive randomBinomial randomGauss + randomInteger randomPoisson randomUniform real readFile removeObject + rindex rindex_regex round runScript runSystem runSystem_nocheck + selectObject selected semitonesToHertz sentence sentencetext sigmoid + sin sinc sincpi sinh soundPressureToPhon sqrt startsWith studentP + studentQ tan tanh text variableExists word writeFile writeFileLine + writeInfo writeInfoLine + ) + + functions_array = %w( + linear randomGauss randomInteger randomUniform zero + ) + + objects = %w( + Activation AffineTransform AmplitudeTier Art Artword Autosegment + BarkFilter BarkSpectrogram CCA Categories Cepstrogram Cepstrum + Cepstrumc ChebyshevSeries ClassificationTable Cochleagram Collection + ComplexSpectrogram Configuration Confusion ContingencyTable Corpus + Correlation Covariance CrossCorrelationTable CrossCorrelationTableList + CrossCorrelationTables DTW DataModeler Diagonalizer Discriminant + Dissimilarity Distance Distributions DurationTier EEG ERP ERPTier + EditCostsTable EditDistanceTable Eigen Excitation Excitations + ExperimentMFC FFNet FeatureWeights FileInMemory FilesInMemory Formant + FormantFilter FormantGrid FormantModeler FormantPoint FormantTier + GaussianMixture HMM HMM_Observation HMM_ObservationSequence HMM_State + HMM_StateSequence HMMObservation HMMObservationSequence HMMState + HMMStateSequence Harmonicity ISpline Index Intensity IntensityTier + IntervalTier KNN KlattGrid KlattTable LFCC LPC Label LegendreSeries + LinearRegression LogisticRegression LongSound Ltas MFCC MSpline ManPages + Manipulation Matrix MelFilter MelSpectrogram MixingMatrix Movie Network + OTGrammar OTHistory OTMulti PCA PairDistribution ParamCurve Pattern + Permutation Photo Pitch PitchModeler PitchTier PointProcess Polygon + Polynomial PowerCepstrogram PowerCepstrum Procrustes RealPoint RealTier + ResultsMFC Roots SPINET SSCP SVD Salience ScalarProduct Similarity + SimpleString SortedSetOfString Sound Speaker Spectrogram Spectrum + SpectrumTier SpeechSynthesizer SpellingChecker Strings StringsIndex + Table TableOfReal TextGrid TextInterval TextPoint TextTier Tier + Transition VocalTract VocalTractTier Weight WordList + ) + + variables_numeric = %w( + all average e left macintosh mono pi praatVersion right stereo + undefined unix windows + ) + + variables_string = %w( + praatVersion tab shellDirectory homeDirectory + preferencesDirectory newline temporaryDirectory + defaultDirectory + ) + + object_attributes = %w( + ncol nrow xmin ymin xmax ymax nx ny dx dy + ) + + state :root do + rule %r/(\s+)(#.*?$)/ do + groups Text, Comment::Single + end + + rule %r/^#.*?$/, Comment::Single + rule %r/;[^\n]*/, Comment::Single + rule %r/\s+/, Text + + rule %r/(\bprocedure)(\s+)/ do + groups Keyword, Text + push :procedure_definition + end + + rule %r/(\bcall)(\s+)/ do + groups Keyword, Text + push :procedure_call + end + + rule %r/@/, Name::Function, :procedure_call + + mixin :function_call + + rule %r/\b(?:select all)\b/, Keyword + rule %r/\b(?:#{keywords.join('|')})\b/, Keyword + + rule %r/(\bform\b)(\s+)([^\n]+)/ do + groups Keyword, Text, Literal::String + push :old_form + end + + rule %r/(print(?:line|tab)?|echo|exit|asserterror|pause|send(?:praat|socket)|include|execute|system(?:_nocheck)?)(\s+)/ do + groups Keyword, Text + push :string_unquoted + end + + rule %r/(goto|label)(\s+)(\w+)/ do + groups Keyword, Text, Name::Label + end + + mixin :variable_name + mixin :number + + rule %r/"/, Literal::String, :string + + rule %r/\b(?:#{objects.join('|')})(?=\s+\S+\n)/, Name::Class, :string_unquoted + + rule %r/\b(?=[A-Z])/, Text, :command + rule %r/(\.{3}|[)(,\$])/, Punctuation + end + + state :command do + rule %r/( ?([^\s:\.'])+ ?)/, Keyword + mixin :string_interpolated + + rule %r/\.{3}/ do + token Keyword + pop! + push :old_arguments + end + + rule %r/:/ do + token Keyword + pop! + push :comma_list + end + + rule %r/[\s]/, Text, :pop! + end + + state :procedure_call do + mixin :string_interpolated + + rule %r/(:|\s*\()/, Punctuation, :pop! + + rule %r/'/, Name::Function + rule %r/[^:\('\s]+/, Name::Function + + rule %r/(?=\s+)/ do + token Text + pop! + push :old_arguments + end + end + + state :procedure_definition do + rule %r/(:|\s*\()/, Punctuation, :pop! + + rule %r/[^:\(\s]+/, Name::Function + + rule %r/(\s+)/, Text, :pop! + end + + state :function_call do + rule %r/\b(#{functions_string.join('|')})\$(?=\s*[:(])/, Name::Function, :function + rule %r/\b(#{functions_array.join('|')})#(?=\s*[:(])/, Name::Function, :function + rule %r/\b(#{functions_numeric.join('|')})(?=\s*[:(])/, Name::Function, :function + end + + state :function do + rule %r/\s+/, Text + + rule %r/(?::|\s*\()/ do + token Text + pop! + push :comma_list + end + end + + state :comma_list do + rule %r/(\s*\n\s*)(\.{3})/ do + groups Text, Punctuation + end + + rule %r/\s*[\])\n]/, Text, :pop! + + rule %r/\s+/, Text + rule %r/"/, Literal::String, :string + rule %r/\b(if|then|else|fi|endif)\b/, Keyword + + mixin :function_call + mixin :variable_name + mixin :operator + mixin :number + + rule %r/[()]/, Text + rule %r/,/, Punctuation + end + + state :old_arguments do + rule %r/\n/, Text, :pop! + + mixin :variable_name + mixin :operator + mixin :number + + rule %r/"/, Literal::String, :string + rule %r/[^\n]/, Text + end + + state :number do + rule %r/\n/, Text, :pop! + rule %r/\b\d+(\.\d*)?([eE][-+]?\d+)?%?/, Literal::Number + end + + state :variable_name do + mixin :operator + mixin :number + + rule %r/\b(?:#{variables_string.join('|')})\$/, Name::Builtin + rule %r/\b(?:#{variables_numeric.join('|')})(?!\$)\b/, Name::Builtin + + rule %r/\b(Object|#{objects.join('|')})_/ do + token Name::Builtin + push :object_reference + end + + rule %r/\.?[a-z][a-zA-Z0-9_.]*(\$|#)?/, Text + rule %r/[\[\]]/, Text, :comma_list + mixin :string_interpolated + end + + state :object_reference do + mixin :string_interpolated + rule %r/([a-z][a-zA-Z0-9_]*|\d+)/, Name::Builtin + + rule %r/\.(#{object_attributes.join('|')})\b/, Name::Builtin, :pop! + + rule %r/\$/, Name::Builtin + rule %r/\[/, Text, :pop! + end + + state :operator do + # This rule incorrectly matches === or +++++, which are not operators + rule %r/([+\/*<>=!-]=?|[&*|][&*|]?|\^|<>)/, Operator + rule %r/(?<![\w.])(and|or|not|div|mod)(?![\w.])/, Operator::Word + end + + state :string_interpolated do + rule %r/'[\._a-z][^\[\]'":]*(\[([\d,]+|"[\w,]+")\])?(:[0-9]+)?'/, Literal::String::Interpol + end + + state :string_unquoted do + rule %r/\n\s*\.{3}/, Punctuation + rule %r/\n/, Text, :pop! + rule %r/\s/, Text + + mixin :string_interpolated + + rule %r/'/, Literal::String + rule %r/[^'\n]+/, Literal::String + end + + state :string do + rule %r/\n\s*\.{3}/, Punctuation + rule %r/"/, Literal::String, :pop! + + mixin :string_interpolated + + rule %r/'/, Literal::String + rule %r/[^'"\n]+/, Literal::String + end + + state :old_form do + rule %r/(\s+)(#.*?$)/ do + groups Text, Comment::Single + end + + rule %r/\s+/, Text + + rule %r/(optionmenu|choice)([ \t]+\S+:[ \t]+)/ do + groups Keyword, Text + push :number + end + + rule %r/(option|button)([ \t]+)/ do + groups Keyword, Text + push :string_unquoted + end + + rule %r/(sentence|text)([ \t]+\S+)/ do + groups Keyword, Text + push :string_unquoted + end + + rule %r/(word)([ \t]+\S+[ \t]*)(\S+)?([ \t]+.*)?/ do + groups Keyword, Text, Literal::String, Text + end + + rule %r/(boolean)(\s+\S+\s*)(0|1|"?(?:yes|no)"?)/ do + groups Keyword, Text, Name::Variable + end + + rule %r/(real|natural|positive|integer)([ \t]+\S+[ \t]*)([+-]?)/ do + groups Keyword, Text, Operator + push :number + end + + rule %r/(comment)(\s+)/ do + groups Keyword, Text + push :string_unquoted + end + + rule %r/\bendform\b/, Keyword, :pop! + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/prolog.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/prolog.rb new file mode 100644 index 000000000000..5f1d23e7a7ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/prolog.rb @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Prolog < RegexLexer + title "Prolog" + desc "The Prolog programming language (http://en.wikipedia.org/wiki/Prolog)" + tag 'prolog' + aliases 'prolog' + filenames '*.pro', '*.P', '*.prolog', '*.pl' + mimetypes 'text/x-prolog' + + start { push :bol } + + state :bol do + rule %r/#.*/, Comment::Single + rule(//) { pop! } + end + + state :basic do + rule %r/\s+/, Text + rule %r/%.*/, Comment::Single + rule %r/\/\*/, Comment::Multiline, :nested_comment + + rule %r/[\[\](){}|.,;!]/, Punctuation + rule %r/:-|-->/, Punctuation + + rule %r/"[^"]*"/, Str::Double + + rule %r/\d+\.\d+/, Num::Float + rule %r/\d+/, Num + end + + state :atoms do + rule %r/[[:lower:]]([[:word:]])*/, Str::Symbol + rule %r/'[^']*'/, Str::Symbol + end + + state :operators do + rule %r/(<|>|=<|>=|==|=:=|=|\/|\/\/|\*|\+|-)(?=\s|[a-zA-Z0-9\[])/, + Operator + rule %r/is/, Operator + rule %r/(mod|div|not)/, Operator + rule %r/[#&*+-.\/:<=>?@^~]+/, Operator + end + + state :variables do + rule %r/[A-Z]+\w*/, Name::Variable + rule %r/_[[:word:]]*/, Name::Variable + end + + state :root do + mixin :basic + mixin :atoms + mixin :variables + mixin :operators + end + + state :nested_comment do + rule %r(/\*), Comment::Multiline, :push + rule %r/\s*\*[^*\/]+/, Comment::Multiline + rule %r(\*/), Comment::Multiline, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/prometheus.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/prometheus.rb new file mode 100644 index 000000000000..310fc32ec2dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/prometheus.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + class Prometheus < RegexLexer + desc 'prometheus' + tag 'prometheus' + aliases 'prometheus' + filenames '*.prometheus' + + mimetypes 'text/x-prometheus', 'application/x-prometheus' + + def self.functions + @functions ||= Set.new %w( + abs absent ceil changes clamp_max clamp_min count_scalar day_of_month + day_of_week days_in_month delta deriv drop_common_labels exp floor + histogram_quantile holt_winters hour idelta increase irate label_replace + ln log2 log10 month predict_linear rate resets round scalar sort + sort_desc sqrt time vector year avg_over_time min_over_time + max_over_time sum_over_time count_over_time quantile_over_time + stddev_over_time stdvar_over_time + ) + end + + state :root do + mixin :strings + mixin :whitespace + + rule %r/-?\d+\.\d+/, Num::Float + rule %r/-?\d+[smhdwy]?/, Num::Integer + + mixin :operators + + rule %r/(ignoring|on)(\()/ do + groups Keyword::Pseudo, Punctuation + push :label_list + end + rule %r/(group_left|group_right)(\()/ do + groups Keyword::Type, Punctuation + end + rule %r/(bool|offset)\b/, Keyword + rule %r/(without|by)\b/, Keyword, :label_list + rule %r/[\w:]+/ do |m| + if self.class.functions.include?(m[0]) + token Name::Builtin + else + token Name + end + end + + mixin :metrics + end + + state :metrics do + rule %r/[a-zA-Z0-9_-]+/, Name + + rule %r/[\(\)\]:.,]/, Punctuation + rule %r/\{/, Punctuation, :filters + rule %r/\[/, Punctuation + end + + state :strings do + rule %r/"/, Str::Double, :double_string_escaped + rule %r/'/, Str::Single, :single_string_escaped + rule %r/`.*`/, Str::Backtick + end + + [ + [:double, Str::Double, '"'], + [:single, Str::Single, "'"] + ].each do |name, tok, fin| + state :"#{name}_string_escaped" do + rule %r/\\[\\abfnrtv#{fin}]/, Str::Escape + rule %r/[^\\#{fin}]+/m, tok + rule %r/#{fin}/, tok, :pop! + end + end + + state :filters do + mixin :inline_whitespace + rule %r/,/, Punctuation + mixin :labels + mixin :filter_matching_operators + mixin :strings + rule %r/}/, Punctuation, :pop! + end + + state :label_list do + rule %r/\(/, Punctuation + rule %r/[a-zA-Z0-9_:-]+/, Name::Attribute + rule %r/,/, Punctuation + mixin :whitespace + rule %r/\)/, Punctuation, :pop! + end + + state :labels do + rule %r/[a-zA-Z0-9_:-]+/, Name::Attribute + end + + state :operators do + rule %r([+\-\*/%\^]), Operator # Arithmetic + rule %r(=|==|!=|<|>|<=|>=), Operator # Comparison + rule %r/and|or|unless/, Operator # Logical/Set + rule %r/(sum|min|max|avg|stddev|stdvar|count|count_values|bottomk|topk)\b/, Name::Function + end + + state :filter_matching_operators do + rule %r/!(=|~)|=~?/, Operator + end + + state :inline_whitespace do + rule %r/[ \t\r]+/, Text + end + + state :whitespace do + mixin :inline_whitespace + rule %r/\n\s*/m, Text + rule %r/#.*?$/, Comment + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/properties.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/properties.rb new file mode 100644 index 000000000000..12ec8075e878 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/properties.rb @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Properties < RegexLexer + title ".properties" + desc '.properties config files for Java' + tag 'properties' + + filenames '*.properties' + mimetypes 'text/x-java-properties' + + identifier = /[\w.-]+/ + + state :basic do + rule %r/[!#].*?\n/, Comment + rule %r/\s+/, Text + rule %r/\\\n/, Str::Escape + end + + state :root do + mixin :basic + + rule %r/(#{identifier})(\s*)([=:])/ do + groups Name::Property, Text, Punctuation + push :value + end + end + + state :value do + rule %r/\n/, Text, :pop! + mixin :basic + rule %r/"/, Str, :dq + rule %r/'.*?'/, Str + mixin :esc_str + rule %r/[^\\\n]+/, Str + end + + state :dq do + rule %r/"/, Str, :pop! + mixin :esc_str + rule %r/[^\\"]+/m, Str + end + + state :esc_str do + rule %r/\\u[0-9]{4}/, Str::Escape + rule %r/\\./m, Str::Escape + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/protobuf.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/protobuf.rb new file mode 100644 index 000000000000..9ac6c97722cc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/protobuf.rb @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Protobuf < RegexLexer + title 'Protobuf' + desc 'Google\'s language-neutral, platform-neutral, extensible mechanism for serializing structured data' + tag 'protobuf' + aliases 'proto' + filenames '*.proto' + mimetypes 'text/x-proto' + + kw = /\b(ctype|default|extensions|import|max|oneof|option|optional|packed|repeated|required|returns|rpc|to)\b/ + datatype = /\b(bool|bytes|double|fixed32|fixed64|float|int32|int64|sfixed32|sfixed64|sint32|sint64|string|uint32|uint64)\b/ + + state :root do + rule %r/[\s]+/, Text + rule %r/[,;{}\[\]()]/, Punctuation + rule %r/\/(\\\n)?\/($|(.|\n)*?[^\\]$)/, Comment::Single + rule %r/\/(\\\n)?\*(.|\n)*?\*(\\\n)?\//, Comment::Multiline + rule kw, Keyword + rule datatype, Keyword::Type + rule %r/true|false/, Keyword::Constant + rule %r/(package)(\s+)/ do + groups Keyword::Namespace, Text + push :package + end + + rule %r/(message|extend)(\s+)/ do + groups Keyword::Declaration, Text + push :message + end + + rule %r/(enum|group|service)(\s+)/ do + groups Keyword::Declaration, Text + push :type + end + + rule %r/".*?"/, Str + rule %r/'.*?'/, Str + rule %r/(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*/, Num::Float + rule %r/(\d+\.\d*|\.\d+|\d+[fF])[fF]?/, Num::Float + rule %r/(\-?(inf|nan))\b/, Num::Float + rule %r/0x[0-9a-fA-F]+[LlUu]*/, Num::Hex + rule %r/0[0-7]+[LlUu]*/, Num::Oct + rule %r/\d+[LlUu]*/, Num::Integer + rule %r/[+-=]/, Operator + rule %r/([a-zA-Z_][\w.]*)([ \t]*)(=)/ do + groups Name::Attribute, Text, Operator + end + rule %r/[a-zA-Z_][\w.]*/, Name + end + + state :package do + rule %r/[a-zA-Z_]\w*/, Name::Namespace, :pop! + rule(//) { pop! } + end + + state :message do + rule %r/[a-zA-Z_]\w*/, Name::Class, :pop! + rule(//) { pop! } + end + + state :type do + rule %r/[a-zA-Z_]\w*/, Name, :pop! + rule(//) { pop! } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/puppet.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/puppet.rb new file mode 100644 index 000000000000..9726bd9ecfb7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/puppet.rb @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Puppet < RegexLexer + title "Puppet" + desc 'The Puppet configuration management language (puppetlabs.org)' + tag 'puppet' + aliases 'pp' + filenames '*.pp' + + def self.detect?(text) + return true if text.shebang? 'puppet-apply' + return true if text.shebang? 'puppet' + end + + def self.keywords + @keywords ||= Set.new %w( + and case class default define else elsif if in import inherits + node unless + ) + end + + def self.constants + @constants ||= Set.new %w( + false true undef + ) + end + + def self.metaparameters + @metaparameters ||= Set.new %w( + before require notify subscribe + ) + end + + id = /[a-z]\w*/ + cap_id = /[A-Z]\w*/ + qualname = /(::)?(#{id}::)*\w+/ + + state :whitespace do + rule %r/\s+/m, Text + rule %r/#.*?\n/, Comment + end + + state :root do + mixin :whitespace + + rule %r/[$]#{qualname}/, Name::Variable + rule %r/(#{id})(?=\s*[=+]>)/m do |m| + if self.class.metaparameters.include? m[0] + token Keyword::Pseudo + else + token Name::Property + end + end + + rule %r/(#{qualname})(?=\s*[(])/m, Name::Function + rule cap_id, Name::Class + + rule %r/[+=|~-]>|<[|~-]/, Punctuation + rule %r/[|:}();\[\]]/, Punctuation + + # HACK for case statements and selectors + rule %r/{/, Punctuation, :regex_allowed + rule %r/,/, Punctuation, :regex_allowed + + rule %r/(in|and|or)\b/, Operator::Word + rule %r/[=!<>]=/, Operator + rule %r/[=!]~/, Operator, :regex_allowed + rule %r([.=<>!+*/-]), Operator + + rule %r/(class|include)(\s*)(#{qualname})/ do + groups Keyword, Text, Name::Class + end + + rule %r/node\b/, Keyword, :regex_allowed + + rule %r/'(\\[\\']|[^'])*'/m, Str::Single + rule %r/"/, Str::Double, :dquotes + + rule %r/\d+([.]\d+)?(e[+-]\d+)?/, Num + + # a valid regex. TODO: regexes are only allowed + # in certain places in puppet. + rule qualname do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.constants.include? m[0] + token Keyword::Constant + else + token Name + end + end + end + + state :regex_allowed do + mixin :whitespace + rule %r(/), Str::Regex, :regex + + rule(//) { pop! } + end + + state :regex do + rule %r(/), Str::Regex, :pop! + rule %r/\\./, Str::Escape + rule %r/[(){}]/, Str::Interpol + rule %r/\[/, Str::Interpol, :regex_class + rule %r/./, Str::Regex + end + + state :regex_class do + rule %r/\]/, Str::Interpol, :pop! + rule %r/(?<!\[)-(?=\])/, Str::Regex + rule %r/-/, Str::Interpol + rule %r/\\./, Str::Escape + rule %r/[^\\\]-]+/, Str::Regex + end + + state :dquotes do + rule %r/"/, Str::Double, :pop! + rule %r/[^$\\"]+/m, Str::Double + rule %r/\\./m, Str::Escape + rule %r/[$]#{qualname}/, Name::Variable + rule %r/[$][{]#{qualname}[}]/, Name::Variable + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/python.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/python.rb new file mode 100644 index 000000000000..02d43550a870 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/python.rb @@ -0,0 +1,249 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Python < RegexLexer + title "Python" + desc "The Python programming language (python.org)" + tag 'python' + aliases 'py' + filenames '*.py', '*.pyw', '*.sc', 'SConstruct', 'SConscript', '*.tac', + '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE' + mimetypes 'text/x-python', 'application/x-python' + + def self.detect?(text) + return true if text.shebang?(/pythonw?(?:[23](?:\.\d+)?)?/) + end + + def self.keywords + @keywords ||= %w( + assert break continue del elif else except exec + finally for global if lambda pass print raise + return try while yield as with from import yield + async await nonlocal + ) + end + + def self.builtins + @builtins ||= %w( + __import__ abs all any apply ascii basestring bin bool buffer + bytearray bytes callable chr classmethod cmp coerce compile + complex delattr dict dir divmod enumerate eval execfile exit + file filter float format frozenset getattr globals hasattr hash hex id + input int intern isinstance issubclass iter len list locals + long map max memoryview min next object oct open ord pow property range + raw_input reduce reload repr reversed round set setattr slice + sorted staticmethod str sum super tuple type unichr unicode + vars xrange zip + ) + end + + def self.builtins_pseudo + @builtins_pseudo ||= %w(self None Ellipsis NotImplemented False True) + end + + def self.exceptions + @exceptions ||= %w( + ArithmeticError AssertionError AttributeError + BaseException BlockingIOError BrokenPipeError BufferError + BytesWarning ChildProcessError ConnectionAbortedError + ConnectionError ConnectionRefusedError ConnectionResetError + DeprecationWarning EOFError EnvironmentError + Exception FileExistsError FileNotFoundError + FloatingPointError FutureWarning GeneratorExit IOError + ImportError ImportWarning IndentationError IndexError + InterruptedError IsADirectoryError KeyError KeyboardInterrupt + LookupError MemoryError ModuleNotFoundError NameError + NotADirectoryError NotImplemented NotImplementedError OSError + OverflowError OverflowWarning PendingDeprecationWarning + ProcessLookupError RecursionError ReferenceError ResourceWarning + RuntimeError RuntimeWarning StandardError StopAsyncIteration + StopIteration SyntaxError SyntaxWarning SystemError SystemExit + TabError TimeoutError TypeError UnboundLocalError UnicodeDecodeError + UnicodeEncodeError UnicodeError UnicodeTranslateError + UnicodeWarning UserWarning ValueError VMSError Warning + WindowsError ZeroDivisionError + ) + end + + identifier = /[[:alpha:]_][[:alnum:]_]*/ + dotted_identifier = /[[:alpha:]_.][[:alnum:]_.]*/ + + def current_string + @string_register ||= StringRegister.new + end + + state :root do + rule %r/\n+/m, Text + rule %r/^(:)(\s*)([ru]{,2}""".*?""")/mi do + groups Punctuation, Text, Str::Doc + end + + rule %r/[^\S\n]+/, Text + rule %r(#(.*)?\n?), Comment::Single + rule %r/[\[\]{}:(),;.]/, Punctuation + rule %r/\\\n/, Text + rule %r/\\/, Text + + rule %r/(in|is|and|or|not)\b/, Operator::Word + rule %r/(<<|>>|\/\/|\*\*)=?/, Operator + rule %r/[-~+\/*%=<>&^|@]=?|!=/, Operator + + rule %r/(from)((?:\\\s|\s)+)(#{dotted_identifier})((?:\\\s|\s)+)(import)/ do + groups Keyword::Namespace, + Text, + Name::Namespace, + Text, + Keyword::Namespace + end + + rule %r/(import)(\s+)(#{dotted_identifier})/ do + groups Keyword::Namespace, Text, Name::Namespace + end + + rule %r/(def)((?:\s|\\\s)+)/ do + groups Keyword, Text + push :funcname + end + + rule %r/(class)((?:\s|\\\s)+)/ do + groups Keyword, Text + push :classname + end + + # TODO: not in python 3 + rule %r/`.*?`/, Str::Backtick + rule %r/([rfbu]{0,2})('''|"""|['"])/i do |m| + groups Str::Affix, Str + current_string.register type: m[1].downcase, delim: m[2] + push :generic_string + end + + rule %r/@#{dotted_identifier}/i, Name::Decorator + + # using negative lookbehind so we don't match property names + rule %r/(?<!\.)#{identifier}/ do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.exceptions.include? m[0] + token Name::Builtin + elsif self.class.builtins.include? m[0] + token Name::Builtin + elsif self.class.builtins_pseudo.include? m[0] + token Name::Builtin::Pseudo + else + token Name + end + end + + rule identifier, Name + + digits = /[0-9](_?[0-9])*/ + decimal = /((#{digits})?\.#{digits}|#{digits}\.)/ + exponent = /e[+-]?#{digits}/i + rule %r/#{decimal}(#{exponent})?j?/i, Num::Float + rule %r/#{digits}#{exponent}j?/i, Num::Float + rule %r/#{digits}j/i, Num::Float + + rule %r/0b(_?[0-1])+/i, Num::Bin + rule %r/0o(_?[0-7])+/i, Num::Oct + rule %r/0x(_?[a-f0-9])+/i, Num::Hex + rule %r/\d+L/, Num::Integer::Long + rule %r/([1-9](_?[0-9])*|0(_?0)*)/, Num::Integer + end + + state :funcname do + rule identifier, Name::Function, :pop! + end + + state :classname do + rule identifier, Name::Class, :pop! + end + + state :raise do + rule %r/from\b/, Keyword + rule %r/raise\b/, Keyword + rule %r/yield\b/, Keyword + rule %r/\n/, Text, :pop! + rule %r/;/, Punctuation, :pop! + mixin :root + end + + state :yield do + mixin :raise + end + + state :generic_string do + rule %r/[^'"\\{]+/, Str + rule %r/{{/, Str + + rule %r/'''|"""|['"]/ do |m| + token Str + if current_string.delim? m[0] + current_string.remove + pop! + end + end + + rule %r/(?=\\)/, Str, :generic_escape + + rule %r/{/ do |m| + if current_string.type? "f" + token Str::Interpol + push :generic_interpol + else + token Str + end + end + end + + state :generic_escape do + rule %r(\\ + ( [\\abfnrtv"'] + | \n + | newline + | N{[a-zA-Z][a-zA-Z ]+[a-zA-Z]} + | u[a-fA-F0-9]{4} + | U[a-fA-F0-9]{8} + | x[a-fA-F0-9]{2} + | [0-7]{1,3} + ) + )x do + current_string.type?("r") ? token(Str) : token(Str::Escape) + pop! + end + + rule %r/\\./, Str, :pop! + end + + state :generic_interpol do + rule %r/[^{}]+/ do |m| + recurse m[0] + end + rule %r/{/, Str::Interpol, :generic_interpol + rule %r/}/, Str::Interpol, :pop! + end + + class StringRegister < Array + def delim?(delim) + self.last[1] == delim + end + + def register(type: "u", delim: "'") + self.push [type, delim] + end + + def remove + self.pop + end + + def type?(type) + self.last[0].include? type + end + end + + private_constant :StringRegister + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/q.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/q.rb new file mode 100644 index 000000000000..30193b991de1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/q.rb @@ -0,0 +1,126 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + class Q < RegexLexer + title 'Q' + desc 'The Q programming language (kx.com)' + tag 'q' + aliases 'kdb+' + filenames '*.q' + mimetypes 'text/x-q', 'application/x-q' + + identifier = /\.?[a-z][a-z0-9_.]*/i + + def self.keywords + @keywords ||= %w[do if while select update delete exec from by] + end + + def self.word_operators + @word_operators ||= %w[ + and or except inter like each cross vs sv within where in asof bin binr cor cov cut ej fby + div ij insert lj ljf mavg mcount mdev mmax mmin mmu mod msum over prior peach pj scan scov setenv ss + sublist uj union upsert wavg wsum xasc xbar xcol xcols xdesc xexp xgroup xkey xlog xprev xrank + ] + end + + def self.builtins + @builtins ||= %w[ + first enlist value type get set count string key max min sum prd last flip distinct raze neg + desc differ dsave dev eval exit exp fills fkeys floor getenv group gtime hclose hcount hdel hopen hsym + iasc idesc inv keys load log lsq ltime ltrim maxs md5 med meta mins next parse plist prds prev rand rank ratios + read0 read1 reciprocal reverse rload rotate rsave rtrim save sdev show signum sin sqrt ssr sums svar system + tables tan til trim txf ungroup var view views wj wj1 ww + ] + end + + state :root do + # q allows a file to start with a shebang + rule %r/#!(.*?)$/, Comment::Preproc, :top + rule %r//, Text, :top + end + + state :top do + # indented lines at the top of the file are ignored by q + rule %r/^[ \t\r]+.*$/, Comment::Special + rule %r/\n+/, Text + rule %r//, Text, :base + end + + state :base do + rule %r/\n+/m, Text + rule(/^.\)/, Keyword::Declaration) + + # Identifiers, word operators, etc. + rule %r/#{identifier}/ do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.word_operators.include? m[0] + token Operator::Word + elsif self.class.builtins.include? m[0] + token Name::Builtin + elsif /^\.[zQqho]\./ =~ m[0] + token Name::Constant + else + token Name + end + end + + # White space and comments + rule(%r{\s+/.*}, Comment::Single) + rule(/[ \t\r]+/, Text::Whitespace) + rule(%r{^/$.*?^\\$}m, Comment::Multiline) + rule(%r{^\/[^\n]*$(\n[^\S\n]+.*$)*}, Comment::Multiline) + # til EOF comment + rule(/^\\$/, Comment, :bottom) + rule(/^\\\\\s+/, Keyword, :bottom) + + # Literals + ## strings + rule(/"/, Str, :string) + ## timespan/stamp constants + rule(/(?:\d+D|\d{4}\.[01]\d\.[0123]\d[DT])(?:[012]\d:[0-5]\d(?::[0-5]\d(?:\.\d+)?)?|([012]\d)?)[zpn]?\b/, + Literal::Date) + ## time/minute/second constants + rule(/[012]\d:[0-5]\d(?::[0-5]\d(\.\d+)?)?[uvtpn]?\b/, Literal::Date) + ## date constants + rule(/\d{4}\.[01]\d\.[0-3]\d[dpnzm]?\b/, Literal::Date) + ## special values + rule(/0[nNwW][hijefcpmdznuvt]?/, Keyword::Constant) + + # operators to match before numbers + rule(%r{'|\/:|\\:|':|\\|\/|0:|1:|2:}, Operator) + + ## numbers + rule(/(\d+[.]\d*|[.]\d+)(e[+-]?\d+)?[ef]?/, Num::Float) + rule(/\d+e[+-]?\d+[ef]?/, Num::Float) + rule(/\d+[ef]/, Num::Float) + rule(/0x[0-9a-f]+/i, Num::Hex) + rule(/[01]+b/, Num::Bin) + rule(/[0-9]+[hij]?/, Num::Integer) + ## symbols and paths + rule(%r{(`:[:a-z0-9._\/]*|`(?:[a-z0-9.][:a-z0-9._]*)?)}i, Str::Symbol) + rule(/(?:<=|>=|<>|::)|[?:$%&|@._#*^\-+~,!><=]:?/, Operator) + + rule %r/[{}\[\]();]/, Punctuation + + # commands + rule(/\\.*\n/, Text) + + end + + state :string do + rule %r/\\"/, Str + rule %r/"/, Str, :pop! + rule %r/\\([\\nr]|[01][0-7]{2})/, Str::Escape + rule %r/[^\\"\n]+/, Str + rule %r/\\/, Str # stray backslash + end + + state :bottom do + rule %r/.+\z/m, Comment::Multiline + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/qml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/qml.rb new file mode 100644 index 000000000000..577939fa2e8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/qml.rb @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'javascript.rb' + + class Qml < Javascript + title "QML" + desc 'QML, a UI markup language' + tag 'qml' + aliases 'qml' + filenames '*.qml' + + mimetypes 'application/x-qml', 'text/x-qml' + + id_with_dots = /[$a-zA-Z_][a-zA-Z0-9_.]*/ + + prepend :root do + rule %r/(#{id_with_dots})(\s*)({)/ do + groups Keyword::Type, Text, Punctuation + push :type_block + end + rule %r/(#{id_with_dots})(\s+)(on)(\s+)(#{id_with_dots})(\s*)({)/ do + groups Keyword::Type, Text, Keyword, Text, Name::Label, Text, Punctuation + push :type_block + end + + rule %r/[{]/, Punctuation, :push + end + + state :type_block do + rule %r/(id)(\s*)(:)(\s*)(#{id_with_dots})/ do + groups Name::Label, Text, Punctuation, Text, Keyword::Declaration + end + + rule %r/(#{id_with_dots})(\s*)(:)/ do + groups Name::Label, Text, Punctuation + push :expr_start + end + + rule %r/(signal)(\s+)(#{id_with_dots})/ do + groups Keyword::Declaration, Text, Name::Label + push :signal + end + + rule %r/(property)(\s+)(#{id_with_dots})(\s+)(#{id_with_dots})(\s*)(:?)/ do + groups Keyword::Declaration, Text, Keyword::Type, Text, Name::Label, Text, Punctuation + push :expr_start + end + + rule %r/[}]/, Punctuation, :pop! + mixin :root + end + + state :signal do + mixin :comments_and_whitespace + rule %r/\(/ do + token Punctuation + goto :signal_args + end + rule %r//, Text, :pop! + end + + state :signal_args do + mixin :comments_and_whitespace + rule %r/(#{id_with_dots})(\s+)(#{id_with_dots})(\s*)(,?)/ do + groups Keyword::Type, Text, Name, Text, Punctuation + end + rule %r/\)/ , Punctuation, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/r.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/r.rb new file mode 100644 index 000000000000..dc500e64a4ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/r.rb @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class R < RegexLexer + title "R" + desc 'The R statistics language (r-project.org)' + tag 'r' + aliases 'r', 'R', 's', 'S' + filenames '*.R', '*.r', '.Rhistory', '.Rprofile' + mimetypes 'text/x-r-source', 'text/x-r', 'text/x-R' + + mimetypes 'text/x-r', 'application/x-r' + + KEYWORDS = %w(if else for while repeat in next break function) + + KEYWORD_CONSTANTS = %w( + NULL Inf TRUE FALSE NaN NA + NA_integer_ NA_real_ NA_complex_ NA_character_ + ) + + BUILTIN_CONSTANTS = %w(LETTERS letters month.abb month.name pi T F) + + # These are all the functions in `base` that are implemented as a + # `.Primitive`, minus those functions that are also keywords. + PRIMITIVE_FUNCTIONS = %w( + abs acos acosh all any anyNA Arg as.call as.character + as.complex as.double as.environment as.integer as.logical + as.null.default as.numeric as.raw asin asinh atan atanh attr + attributes baseenv browser c call ceiling class Conj cos cosh + cospi cummax cummin cumprod cumsum digamma dim dimnames + emptyenv exp expression floor forceAndCall gamma gc.time + globalenv Im interactive invisible is.array is.atomic is.call + is.character is.complex is.double is.environment is.expression + is.finite is.function is.infinite is.integer is.language + is.list is.logical is.matrix is.na is.name is.nan is.null + is.numeric is.object is.pairlist is.raw is.recursive is.single + is.symbol lazyLoadDBfetch length lgamma list log max min + missing Mod names nargs nzchar oldClass on.exit pos.to.env + proc.time prod quote range Re rep retracemem return round + seq_along seq_len seq.int sign signif sin sinh sinpi sqrt + standardGeneric substitute sum switch tan tanh tanpi tracemem + trigamma trunc unclass untracemem UseMethod xtfrm + ) + + def self.detect?(text) + return true if text.shebang? 'Rscript' + end + + state :root do + rule %r/#'.*?$/, Comment::Doc + rule %r/#.*?$/, Comment::Single + rule %r/\s+/m, Text::Whitespace + + rule %r/`[^`]+?`/, Name + rule %r/'(\\.|.)*?'/m, Str::Single + rule %r/"(\\.|.)*?"/m, Str::Double + + rule %r/%[^%]*?%/, Operator + + rule %r/0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/, Num::Hex + rule %r/[+-]?(\d+([.]\d+)?|[.]\d+)([eE][+-]?\d+)?[Li]?/, Num + + # Only recognize built-in functions when they are actually used as a + # function call, i.e. followed by an opening parenthesis. + # `Name::Builtin` would be more logical, but is usually not + # highlighted specifically; thus use `Name::Function`. + rule %r/\b(?<!.)(#{PRIMITIVE_FUNCTIONS.join('|')})(?=\()/, Name::Function + + rule %r/(?:(?:[[:alpha:]]|[.][._[:alpha:]])[._[:alnum:]]*)|[.]/ do |m| + if KEYWORDS.include? m[0] + token Keyword + elsif KEYWORD_CONSTANTS.include? m[0] + token Keyword::Constant + elsif BUILTIN_CONSTANTS.include? m[0] + token Name::Builtin + else + token Name + end + end + + rule %r/[\[\]{}();,]/, Punctuation + + rule %r([-<>?*+^/!=~$@:%&|]), Operator + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/racket.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/racket.rb new file mode 100644 index 000000000000..a005439ac73d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/racket.rb @@ -0,0 +1,568 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Racket < RegexLexer + title "Racket" + desc "Racket is a Lisp descended from Scheme (racket-lang.org)" + + tag 'racket' + filenames '*.rkt', '*.rktd', '*.rktl' + mimetypes 'text/x-racket', 'application/x-racket' + + def self.detect?(text) + text =~ /\A#lang\s*(.*?)$/ + lang_attr = $1 + return false unless lang_attr + return true if lang_attr =~ /racket|scribble/ + end + + def self.keywords + @keywords ||= Set.new %w( + ... and begin begin-for-syntax begin0 case case-lambda cond + datum->syntax-object define define-for-syntax define-logger + define-struct define-syntax define-syntax-rule + define-syntaxes define-values define-values-for-syntax delay + do expand-path fluid-let force hash-table-copy + hash-table-count hash-table-for-each hash-table-get + hash-table-iterate-first hash-table-iterate-key + hash-table-iterate-next hash-table-iterate-value + hash-table-map hash-table-put! hash-table-remove! + hash-table? if lambda let let* let*-values let-struct + let-syntax let-syntaxes let-values let/cc let/ec letrec + letrec-syntax letrec-syntaxes letrec-syntaxes+values + letrec-values list-immutable make-hash-table + make-immutable-hash-table make-namespace module module* + module-identifier=? module-label-identifier=? + module-template-identifier=? module-transformer-identifier=? + namespace-transformer-require or parameterize parameterize* + parameterize-break promise? prop:method-arity-error provide + provide-for-label provide-for-syntax quasiquote quasisyntax + quasisyntax/loc quote quote-syntax quote-syntax/prune + require require-for-label require-for-syntax + require-for-template set! set!-values syntax syntax-case + syntax-case* syntax-id-rules syntax-object->datum + syntax-rules syntax/loc tcp-abandon-port tcp-accept + tcp-accept-evt tcp-accept-ready? tcp-accept/enable-break + tcp-addresses tcp-close tcp-connect tcp-connect/enable-break + tcp-listen tcp-listener? tcp-port? time transcript-off + transcript-on udp-addresses udp-bind! udp-bound? udp-close + udp-connect! udp-connected? udp-multicast-interface + udp-multicast-join-group! udp-multicast-leave-group! + udp-multicast-loopback? udp-multicast-set-interface! + udp-multicast-set-loopback! udp-multicast-set-ttl! + udp-multicast-ttl udp-open-socket udp-receive! udp-receive!* + udp-receive!-evt udp-receive!/enable-break + udp-receive-ready-evt udp-send udp-send* udp-send-evt + udp-send-ready-evt udp-send-to udp-send-to* udp-send-to-evt + udp-send-to/enable-break udp-send/enable-break udp? unless + unquote unquote-splicing unsyntax unsyntax-splicing when + with-continuation-mark with-handlers with-handlers* + with-syntax λ) + end + + def self.builtins + @builtins ||= Set.new %w( + * + - / < <= = > >= + abort-current-continuation abs absolute-path? acos add1 + alarm-evt always-evt andmap angle append apply + arithmetic-shift arity-at-least arity-at-least-value + arity-at-least? asin assoc assq assv atan banner bitwise-and + bitwise-bit-field bitwise-bit-set? bitwise-ior bitwise-not + bitwise-xor boolean? bound-identifier=? box box-cas! + box-immutable box? break-enabled break-thread build-path + build-path/convention-type byte-pregexp byte-pregexp? + byte-ready? byte-regexp byte-regexp? byte? bytes + bytes->immutable-bytes bytes->list bytes->path + bytes->path-element bytes->string/latin-1 + bytes->string/locale bytes->string/utf-8 bytes-append + bytes-close-converter bytes-convert bytes-convert-end + bytes-converter? bytes-copy bytes-copy! + bytes-environment-variable-name? bytes-fill! bytes-length + bytes-open-converter bytes-ref bytes-set! bytes-utf-8-index + bytes-utf-8-length bytes-utf-8-ref bytes<? bytes=? bytes>? + bytes? caaaar caaadr caaar caadar caaddr caadr caar cadaar + cadadr cadar caddar cadddr caddr cadr call-in-nested-thread + call-with-break-parameterization + call-with-composable-continuation + call-with-continuation-barrier call-with-continuation-prompt + call-with-current-continuation + call-with-default-reading-parameterization + call-with-escape-continuation call-with-exception-handler + call-with-immediate-continuation-mark call-with-input-file + call-with-output-file call-with-parameterization + call-with-semaphore call-with-semaphore/enable-break + call-with-values call/cc call/ec car cdaaar cdaadr cdaar + cdadar cdaddr cdadr cdar cddaar cddadr cddar cdddar cddddr + cdddr cddr cdr ceiling channel-get channel-put + channel-put-evt channel-put-evt? channel-try-get channel? + chaperone-box chaperone-continuation-mark-key chaperone-evt + chaperone-hash chaperone-of? chaperone-procedure + chaperone-prompt-tag chaperone-struct chaperone-struct-type + chaperone-vector chaperone? char->integer char-alphabetic? + char-blank? char-ci<=? char-ci<? char-ci=? char-ci>=? + char-ci>? char-downcase char-foldcase char-general-category + char-graphic? char-iso-control? char-lower-case? + char-numeric? char-punctuation? char-ready? char-symbolic? + char-title-case? char-titlecase char-upcase char-upper-case? + char-utf-8-length char-whitespace? char<=? char<? char=? + char>=? char>? char? check-duplicate-identifier + checked-procedure-check-and-extract choice-evt cleanse-path + close-input-port close-output-port collect-garbage + collection-file-path collection-path compile + compile-allow-set!-undefined + compile-context-preservation-enabled + compile-enforce-module-constants compile-syntax + compiled-expression? compiled-module-expression? + complete-path? complex? cons continuation-mark-key? + continuation-mark-set->context continuation-mark-set->list + continuation-mark-set->list* continuation-mark-set-first + continuation-mark-set? continuation-marks + continuation-prompt-available? continuation-prompt-tag? + continuation? copy-file cos current-break-parameterization + current-code-inspector current-command-line-arguments + current-compile current-compiled-file-roots + current-continuation-marks current-custodian + current-directory current-directory-for-user current-drive + current-environment-variables current-error-port + current-eval current-evt-pseudo-random-generator + current-gc-milliseconds current-get-interaction-input-port + current-inexact-milliseconds current-input-port + current-inspector current-library-collection-paths + current-load current-load-extension + current-load-relative-directory current-load/use-compiled + current-locale current-memory-use current-milliseconds + current-module-declare-name current-module-declare-source + current-module-name-resolver current-module-path-for-load + current-namespace current-output-port + current-parameterization + current-preserved-thread-cell-values current-print + current-process-milliseconds current-prompt-read + current-pseudo-random-generator current-read-interaction + current-reader-guard current-readtable current-seconds + current-security-guard current-subprocess-custodian-mode + current-thread current-thread-group + current-thread-initial-stack-size + current-write-relative-directory custodian-box-value + custodian-box? custodian-limit-memory custodian-managed-list + custodian-memory-accounting-available? + custodian-require-memory custodian-shutdown-all custodian? + custom-print-quotable-accessor custom-print-quotable? + custom-write-accessor custom-write? date date* + date*-nanosecond date*-time-zone-name date*? date-day + date-dst? date-hour date-minute date-month date-second + date-time-zone-offset date-week-day date-year date-year-day + date? datum-intern-literal default-continuation-prompt-tag + delete-directory delete-file denominator directory-exists? + directory-list display displayln dump-memory-stats + dynamic-require dynamic-require-for-syntax dynamic-wind + environment-variables-copy environment-variables-names + environment-variables-ref environment-variables-set! + environment-variables? eof eof-object? ephemeron-value + ephemeron? eprintf eq-hash-code eq? equal-hash-code + equal-secondary-hash-code equal? equal?/recur eqv-hash-code + eqv? error error-display-handler error-escape-handler + error-print-context-length error-print-source-location + error-print-width error-value->string-handler eval + eval-jit-enabled eval-syntax even? evt? exact->inexact + exact-integer? exact-nonnegative-integer? + exact-positive-integer? exact? executable-yield-handler exit + exit-handler exn exn-continuation-marks exn-message + exn:break exn:break-continuation exn:break:hang-up + exn:break:hang-up? exn:break:terminate exn:break:terminate? + exn:break? exn:fail exn:fail:contract + exn:fail:contract:arity exn:fail:contract:arity? + exn:fail:contract:continuation + exn:fail:contract:continuation? + exn:fail:contract:divide-by-zero + exn:fail:contract:divide-by-zero? + exn:fail:contract:non-fixnum-result + exn:fail:contract:non-fixnum-result? + exn:fail:contract:variable exn:fail:contract:variable-id + exn:fail:contract:variable? exn:fail:contract? + exn:fail:filesystem exn:fail:filesystem:errno + exn:fail:filesystem:errno-errno exn:fail:filesystem:errno? + exn:fail:filesystem:exists exn:fail:filesystem:exists? + exn:fail:filesystem:missing-module + exn:fail:filesystem:missing-module-path + exn:fail:filesystem:missing-module? + exn:fail:filesystem:version exn:fail:filesystem:version? + exn:fail:filesystem? exn:fail:network exn:fail:network:errno + exn:fail:network:errno-errno exn:fail:network:errno? + exn:fail:network? exn:fail:out-of-memory + exn:fail:out-of-memory? exn:fail:read exn:fail:read-srclocs + exn:fail:read:eof exn:fail:read:eof? exn:fail:read:non-char + exn:fail:read:non-char? exn:fail:read? exn:fail:syntax + exn:fail:syntax-exprs exn:fail:syntax:missing-module + exn:fail:syntax:missing-module-path + exn:fail:syntax:missing-module? exn:fail:syntax:unbound + exn:fail:syntax:unbound? exn:fail:syntax? + exn:fail:unsupported exn:fail:unsupported? exn:fail:user + exn:fail:user? exn:fail? exn:missing-module-accessor + exn:missing-module? exn:srclocs-accessor exn:srclocs? exn? + exp expand expand-once expand-syntax expand-syntax-once + expand-syntax-to-top-form expand-to-top-form + expand-user-path explode-path expt file-exists? + file-or-directory-identity file-or-directory-modify-seconds + file-or-directory-permissions file-position file-position* + file-size file-stream-buffer-mode file-stream-port? + file-truncate filesystem-change-evt + filesystem-change-evt-cancel filesystem-change-evt? + filesystem-root-list find-executable-path + find-library-collection-paths find-system-path fixnum? + floating-point-bytes->real flonum? floor flush-output + for-each format fprintf free-identifier=? gcd + generate-temporaries gensym get-output-bytes + get-output-string getenv global-port-print-handler guard-evt + handle-evt handle-evt? hash hash-equal? hash-eqv? + hash-has-key? hash-placeholder? hash-ref! hasheq hasheqv + identifier-binding identifier-binding-symbol + identifier-label-binding identifier-prune-lexical-context + identifier-prune-to-source-module + identifier-remove-from-definition-context + identifier-template-binding identifier-transformer-binding + identifier? imag-part immutable? impersonate-box + impersonate-continuation-mark-key impersonate-hash + impersonate-procedure impersonate-prompt-tag + impersonate-struct impersonate-vector impersonator-ephemeron + impersonator-of? impersonator-prop:application-mark + impersonator-property-accessor-procedure? + impersonator-property? impersonator? inexact->exact + inexact-real? inexact? input-port? inspector? integer->char + integer->integer-bytes integer-bytes->integer integer-length + integer-sqrt integer-sqrt/remainder integer? + internal-definition-context-seal + internal-definition-context? keyword->string keyword<? + keyword? kill-thread lcm length liberal-define-context? + link-exists? list list* list->bytes list->string + list->vector list-ref list-tail list? load load-extension + load-on-demand-enabled load-relative load-relative-extension + load/cd load/use-compiled local-expand + local-expand/capture-lifts local-transformer-expand + local-transformer-expand/capture-lifts + locale-string-encoding log log-max-level magnitude + make-arity-at-least make-bytes make-channel + make-continuation-mark-key make-continuation-prompt-tag + make-custodian make-custodian-box make-date make-date* + make-derived-parameter make-directory + make-environment-variables make-ephemeron make-exn + make-exn:break make-exn:break:hang-up + make-exn:break:terminate make-exn:fail + make-exn:fail:contract make-exn:fail:contract:arity + make-exn:fail:contract:continuation + make-exn:fail:contract:divide-by-zero + make-exn:fail:contract:non-fixnum-result + make-exn:fail:contract:variable make-exn:fail:filesystem + make-exn:fail:filesystem:errno + make-exn:fail:filesystem:exists + make-exn:fail:filesystem:missing-module + make-exn:fail:filesystem:version make-exn:fail:network + make-exn:fail:network:errno make-exn:fail:out-of-memory + make-exn:fail:read make-exn:fail:read:eof + make-exn:fail:read:non-char make-exn:fail:syntax + make-exn:fail:syntax:missing-module + make-exn:fail:syntax:unbound make-exn:fail:unsupported + make-exn:fail:user make-file-or-directory-link + make-hash-placeholder make-hasheq-placeholder make-hasheqv + make-hasheqv-placeholder make-immutable-hasheqv + make-impersonator-property make-input-port make-inspector + make-known-char-range-list make-output-port make-parameter + make-phantom-bytes make-pipe make-placeholder make-polar + make-prefab-struct make-pseudo-random-generator + make-reader-graph make-readtable make-rectangular + make-rename-transformer make-resolved-module-path + make-security-guard make-semaphore make-set!-transformer + make-shared-bytes make-sibling-inspector + make-special-comment make-srcloc make-string + make-struct-field-accessor make-struct-field-mutator + make-struct-type make-struct-type-property + make-syntax-delta-introducer make-syntax-introducer + make-thread-cell make-thread-group make-vector make-weak-box + make-weak-hasheqv make-will-executor map max mcar mcdr mcons + member memq memv min module->exports module->imports + module->language-info module->namespace + module-compiled-cross-phase-persistent? + module-compiled-exports module-compiled-imports + module-compiled-language-info module-compiled-name + module-compiled-submodules module-declared? + module-path-index-join module-path-index-resolve + module-path-index-split module-path-index-submodule + module-path-index? module-path? module-predefined? + module-provide-protected? modulo mpair? nack-guard-evt + namespace-attach-module namespace-attach-module-declaration + namespace-base-phase namespace-mapped-symbols + namespace-module-identifier namespace-module-registry + namespace-require namespace-require/constant + namespace-require/copy namespace-require/expansion-time + namespace-set-variable-value! namespace-symbol->identifier + namespace-syntax-introduce namespace-undefine-variable! + namespace-unprotect-module namespace-variable-value + namespace? negative? never-evt newline normal-case-path not + null null? number->string number? numerator object-name odd? + open-input-bytes open-input-file open-input-output-file + open-input-string open-output-bytes open-output-file + open-output-string ormap output-port? pair? + parameter-procedure=? parameter? parameterization? + path->bytes path->complete-path path->directory-path + path->string path-add-suffix path-convention-type + path-element->bytes path-element->string + path-for-some-system? path-list-string->path-list + path-replace-suffix path-string? path? peek-byte + peek-byte-or-special peek-bytes peek-bytes! + peek-bytes-avail! peek-bytes-avail!* + peek-bytes-avail!/enable-break peek-char + peek-char-or-special peek-string peek-string! phantom-bytes? + pipe-content-length placeholder-get placeholder-set! + placeholder? poll-guard-evt port-closed-evt port-closed? + port-commit-peeked port-count-lines! + port-count-lines-enabled port-counts-lines? + port-display-handler port-file-identity port-file-unlock + port-next-location port-print-handler port-progress-evt + port-provides-progress-evts? port-read-handler + port-try-file-lock? port-write-handler port-writes-atomic? + port-writes-special? port? positive? prefab-key->struct-type + prefab-key? prefab-struct-key pregexp pregexp? + primitive-closure? primitive-result-arity primitive? print + print-as-expression print-boolean-long-form print-box + print-graph print-hash-table print-mpair-curly-braces + print-pair-curly-braces print-reader-abbreviations + print-struct print-syntax-width print-unreadable + print-vector-length printf procedure->method procedure-arity + procedure-arity-includes? procedure-arity? + procedure-closure-contents-eq? procedure-extract-target + procedure-reduce-arity procedure-rename + procedure-struct-type? procedure? progress-evt? + prop:arity-string prop:checked-procedure + prop:custom-print-quotable prop:custom-write prop:equal+hash + prop:evt prop:exn:missing-module prop:exn:srclocs + prop:impersonator-of prop:input-port + prop:liberal-define-context prop:output-port prop:procedure + prop:rename-transformer prop:set!-transformer + pseudo-random-generator->vector + pseudo-random-generator-vector? pseudo-random-generator? + putenv quotient quotient/remainder raise + raise-argument-error raise-arguments-error raise-arity-error + raise-mismatch-error raise-range-error raise-result-error + raise-syntax-error raise-type-error raise-user-error random + random-seed rational? rationalize read read-accept-bar-quote + read-accept-box read-accept-compiled read-accept-dot + read-accept-graph read-accept-infix-dot read-accept-lang + read-accept-quasiquote read-accept-reader read-byte + read-byte-or-special read-bytes read-bytes! + read-bytes-avail! read-bytes-avail!* + read-bytes-avail!/enable-break read-bytes-line + read-case-sensitive read-char read-char-or-special + read-curly-brace-as-paren read-decimal-as-inexact + read-eval-print-loop read-language read-line + read-on-demand-source read-square-bracket-as-paren + read-string read-string! read-syntax read-syntax/recursive + read/recursive readtable-mapping readtable? + real->double-flonum real->floating-point-bytes + real->single-flonum real-part real? regexp regexp-match + regexp-match-peek regexp-match-peek-immediate + regexp-match-peek-positions + regexp-match-peek-positions-immediate + regexp-match-peek-positions-immediate/end + regexp-match-peek-positions/end regexp-match-positions + regexp-match-positions/end regexp-match/end regexp-match? + regexp-max-lookbehind regexp-replace regexp-replace* regexp? + relative-path? remainder rename-file-or-directory + rename-transformer-target rename-transformer? reroot-path + resolve-path resolved-module-path-name resolved-module-path? + reverse round seconds->date security-guard? + semaphore-peek-evt semaphore-peek-evt? semaphore-post + semaphore-try-wait? semaphore-wait + semaphore-wait/enable-break semaphore? + set!-transformer-procedure set!-transformer? set-box! + set-mcar! set-mcdr! set-phantom-bytes! + set-port-next-location! shared-bytes shell-execute + simplify-path sin single-flonum? sleep special-comment-value + special-comment? split-path sqrt srcloc srcloc->string + srcloc-column srcloc-line srcloc-position srcloc-source + srcloc-span srcloc? string string->bytes/latin-1 + string->bytes/locale string->bytes/utf-8 + string->immutable-string string->keyword string->list + string->number string->path string->path-element + string->symbol string->uninterned-symbol + string->unreadable-symbol string-append string-ci<=? + string-ci<? string-ci=? string-ci>=? string-ci>? string-copy + string-copy! string-downcase + string-environment-variable-name? string-fill! + string-foldcase string-length string-locale-ci<? + string-locale-ci=? string-locale-ci>? string-locale-downcase + string-locale-upcase string-locale<? string-locale=? + string-locale>? string-normalize-nfc string-normalize-nfd + string-normalize-nfkc string-normalize-nfkd string-ref + string-set! string-titlecase string-upcase + string-utf-8-length string<=? string<? string=? string>=? + string>? string? struct->vector struct-accessor-procedure? + struct-constructor-procedure? struct-info + struct-mutator-procedure? struct-predicate-procedure? + struct-type-info struct-type-make-constructor + struct-type-make-predicate + struct-type-property-accessor-procedure? + struct-type-property? struct-type? struct:arity-at-least + struct:date struct:date* struct:exn struct:exn:break + struct:exn:break:hang-up struct:exn:break:terminate + struct:exn:fail struct:exn:fail:contract + struct:exn:fail:contract:arity + struct:exn:fail:contract:continuation + struct:exn:fail:contract:divide-by-zero + struct:exn:fail:contract:non-fixnum-result + struct:exn:fail:contract:variable struct:exn:fail:filesystem + struct:exn:fail:filesystem:errno + struct:exn:fail:filesystem:exists + struct:exn:fail:filesystem:missing-module + struct:exn:fail:filesystem:version struct:exn:fail:network + struct:exn:fail:network:errno struct:exn:fail:out-of-memory + struct:exn:fail:read struct:exn:fail:read:eof + struct:exn:fail:read:non-char struct:exn:fail:syntax + struct:exn:fail:syntax:missing-module + struct:exn:fail:syntax:unbound struct:exn:fail:unsupported + struct:exn:fail:user struct:srcloc struct? sub1 subbytes + subprocess subprocess-group-enabled subprocess-kill + subprocess-pid subprocess-status subprocess-wait subprocess? + substring symbol->string symbol-interned? symbol-unreadable? + symbol? sync sync/enable-break sync/timeout + sync/timeout/enable-break syntax->list syntax-arm + syntax-column syntax-disarm syntax-e syntax-line + syntax-local-bind-syntaxes syntax-local-certifier + syntax-local-context syntax-local-expand-expression + syntax-local-get-shadower syntax-local-introduce + syntax-local-lift-context syntax-local-lift-expression + syntax-local-lift-module-end-declaration + syntax-local-lift-provide syntax-local-lift-require + syntax-local-lift-values-expression + syntax-local-make-definition-context + syntax-local-make-delta-introducer + syntax-local-module-defined-identifiers + syntax-local-module-exports + syntax-local-module-required-identifiers syntax-local-name + syntax-local-phase-level syntax-local-submodules + syntax-local-transforming-module-provides? + syntax-local-value syntax-local-value/immediate + syntax-original? syntax-position syntax-property + syntax-property-symbol-keys syntax-protect syntax-rearm + syntax-recertify syntax-shift-phase-level syntax-source + syntax-source-module syntax-span syntax-taint + syntax-tainted? syntax-track-origin + syntax-transforming-module-expression? syntax-transforming? + syntax? system-big-endian? system-idle-evt + system-language+country system-library-subpath + system-path-convention-type system-type tan terminal-port? + thread thread-cell-ref thread-cell-set! thread-cell-values? + thread-cell? thread-dead-evt thread-dead? thread-group? + thread-resume thread-resume-evt thread-rewind-receive + thread-running? thread-suspend thread-suspend-evt + thread-wait thread/suspend-to-kill thread? time-apply + truncate unbox uncaught-exception-handler + use-collection-link-paths use-compiled-file-paths + use-user-specific-search-paths values + variable-reference->empty-namespace + variable-reference->module-base-phase + variable-reference->module-declaration-inspector + variable-reference->module-path-index + variable-reference->module-source + variable-reference->namespace variable-reference->phase + variable-reference->resolved-module-path + variable-reference-constant? variable-reference? vector + vector->immutable-vector vector->list + vector->pseudo-random-generator + vector->pseudo-random-generator! vector->values vector-fill! + vector-immutable vector-length vector-ref vector-set! + vector-set-performance-stats! vector? version void void? + weak-box-value weak-box? will-execute will-executor? + will-register will-try-execute with-input-from-file + with-output-to-file wrap-evt write write-byte write-bytes + write-bytes-avail write-bytes-avail* write-bytes-avail-evt + write-bytes-avail/enable-break write-char write-special + write-special-avail* write-special-evt write-string zero? + ) + end + + # Since Racket allows identifiers to consist of nearly anything, + # it's simpler to describe what an ID is _not_. + id = /[^\s\(\)\[\]\{\}'`,.]+/i + + state :root do + # comments + rule %r/;.*$/, Comment::Single + rule %r/#!.*/, Comment::Single + rule %r/#\|/, Comment::Multiline, :block_comment + rule %r/#;/, Comment::Multiline, :sexp_comment + rule %r/\s+/m, Text + + rule %r/[+-]inf[.][f0]/, Num::Float + rule %r/[+-]nan[.]0/, Num::Float + rule %r/[-]min[.]0/, Num::Float + rule %r/[+]max[.]0/, Num::Float + + rule %r/-?\d+\.\d+/, Num::Float + rule %r/-?\d+/, Num::Integer + + rule %r/#:#{id}+/, Name::Tag # keyword + + rule %r/#b[01]+/, Num::Bin + rule %r/#o[0-7]+/, Num::Oct + rule %r/#d[0-9]+/, Num::Integer + rule %r/#x[0-9a-f]+/i, Num::Hex + rule %r/#[ei][\d.]+/, Num::Other + + rule %r/"(\\\\|\\"|[^"])*"/, Str + rule %r/['`]#{id}/i, Str::Symbol + rule %r/#\\([()\/'"._!\$%& ?=+-]{1}|[a-z0-9]+)/i, + Str::Char + rule %r/#t(rue)?|#f(alse)?/i, Name::Constant + rule %r/(?:'|#|`|,@|,|\.)/, Operator + + rule %r/(['#])(\s*)(\()/m do + groups Str::Symbol, Text, Punctuation + end + + # () [] {} are all permitted as like pairs + rule %r/\(|\[|\{/, Punctuation, :command + rule %r/\)|\]|\}/, Punctuation + + rule id, Name::Variable + end + + state :block_comment do + rule %r/[^|#]+/, Comment::Multiline + rule %r/\|#/, Comment::Multiline, :pop! + rule %r/#\|/, Comment::Multiline, :block_comment + rule %r/[|#]/, Comment::Multiline + end + + state :sexp_comment do + rule %r/[({\[]/, Comment::Multiline, :sexp_comment_inner + rule %r/"(?:\\"|[^"])*?"/, Comment::Multiline, :pop! + rule %r/[^\s]+/, Comment::Multiline, :pop! + rule(//) { pop! } + end + + state :sexp_comment_inner do + rule %r/[^(){}\[\]]+/, Comment::Multiline + rule %r/[)}\]]/, Comment::Multiline, :pop! + rule %r/[({\[]/, Comment::Multiline, :sexp_comment_inner + end + + state :command do + rule id, Name::Function do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Function + end + + pop! + end + + rule(//) { pop! } + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/reasonml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/reasonml.rb new file mode 100644 index 000000000000..07c9f6c4e1b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/reasonml.rb @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'ocaml/common.rb' + + class ReasonML < OCamlCommon + title "ReasonML" + desc 'New syntax on top of OCaml ecosystem (reasonml.github.io)' + tag 'reasonml' + filenames '*.re', '*.rei' + mimetypes 'text/x-reasonml' + + def self.keywords + @keywords ||= super + Set.new(%w( + switch + )) + end + + state :root do + rule %r/\s+/m, Text + rule %r/false|true|[(][)]|\[\]/, Name::Builtin::Pseudo + rule %r/#{@@upper_id}(?=\s*[.])/, Name::Namespace, :dotted + rule %r/`#{@@id}/, Name::Tag + rule @@upper_id, Name::Class + rule %r(//.*), Comment::Single + rule %r(/\*), Comment::Multiline, :comment + rule @@id do |m| + match = m[0] + if self.class.keywords.include? match + token Keyword + elsif self.class.word_operators.include? match + token Operator::Word + elsif self.class.primitives.include? match + token Keyword::Type + else + token Name + end + end + + rule %r/[(){}\[\];]+/, Punctuation + rule @@operator, Operator + + rule %r/-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float + rule %r/0x\h[\h_]*/i, Num::Hex + rule %r/0o[0-7][0-7_]*/i, Num::Oct + rule %r/0b[01][01_]*/i, Num::Bin + rule %r/\d[\d_]*/, Num::Integer + + rule %r/'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char + rule %r/'[^'\/]'/, Str::Char + rule %r/'/, Keyword + rule %r/"/, Str::Double, :string + rule %r/[~?]#{@@id}/, Name::Variable + end + + state :comment do + rule %r([^/*]+), Comment::Multiline + rule %r(/\*), Comment::Multiline, :comment + rule %r(\*/), Comment::Multiline, :pop! + rule %r([*/]), Comment::Multiline + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/rego.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/rego.rb new file mode 100644 index 000000000000..6ca1a5d5d8e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/rego.rb @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Rego < RegexLexer + title "Rego" + desc "The Rego open-policy-agent (OPA) policy language (openpolicyagent.org)" + tag 'rego' + filenames '*.rego' + + def self.constants + @constants ||= Set.new %w( + true false null + ) + end + + def self.operators + @operators ||= Set.new %w( + as default else import not package some with + ) + end + + state :basic do + rule %r/\s+/, Text + rule %r/#.*/, Comment::Single + + rule %r/[\[\](){}|.,;!]/, Punctuation + + rule %r/"[^"]*"/, Str::Double + + rule %r/-?\d+\.\d+([eE][+-]?\d+)?/, Num::Float + rule %r/-?\d+([eE][+-]?\d+)?/, Num + + rule %r/\\u[0-9a-fA-F]{4}/, Num::Hex + rule %r/\\["\/bfnrt]/, Str::Escape + end + + state :operators do + rule %r/(=|!=|>=|<=|>|<|\+|-|\*|%|\/|\||&|:=)/, Operator + rule %r/[\/:?@^~]+/, Operator + end + + state :root do + mixin :basic + mixin :operators + + rule %r/[[:word:]]+/ do |m| + if self.class.constants.include? m[0] + token Keyword::Constant + elsif self.class.operators.include? m[0] + token Operator::Word + else + token Name + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/rescript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/rescript.rb new file mode 100644 index 000000000000..35daf1265807 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/rescript.rb @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'ocaml/common.rb' + + class ReScript < OCamlCommon + title "ReScript" + desc "The ReScript programming language (rescript-lang.org)" + tag 'rescript' + filenames '*.res', '*.resi' + mimetypes 'text/x-rescript' + + def self.keywords + @keywords ||= Set.new(%w( + open let rec and as exception assert lazy if else + for in to downto while switch when external type private + mutable constraint include module of with try import export + )) + end + + def self.types + @types ||= Set.new(%w( + bool int float char string + unit list array option ref exn format + )) + end + + def self.word_operators + @word_operators ||= Set.new(%w(mod land lor lxor lsl lsr asr or)) + end + + state :root do + rule %r/\s+/m, Text + rule %r([,.:?~\\]), Text + + # Boolean Literal + rule %r/\btrue|false\b/, Keyword::Constant + + # Module chain + rule %r/#{@@upper_id}(?=\s*[.])/, Name::Namespace, :dotted + + # Decorator + rule %r/@#{@@id}(\.#{@@id})*/, Name::Decorator + + # Poly variant + rule %r/\##{@@id}/, Name::Class + + # Variant or Module + rule @@upper_id, Name::Class + + # Comments + rule %r(//.*), Comment::Single + rule %r(/\*), Comment::Multiline, :comment + + # Keywords and identifiers + rule @@id do |m| + match = m[0] + if self.class.keywords.include? match + token Keyword + elsif self.class.word_operators.include? match + token Operator::Word + elsif self.class.types.include? match + token Keyword::Type + else + token Name + end + end + + # Braces + rule %r/[(){}\[\];]+/, Punctuation + + # Operators + rule %r([;_!$%&*+/<=>@^|-]+), Operator + + # Numbers + rule %r/-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float + rule %r/0x\h[\h_]*/i, Num::Hex + rule %r/0o[0-7][0-7_]*/i, Num::Oct + rule %r/0b[01][01_]*/i, Num::Bin + rule %r/\d[\d_]*/, Num::Integer + + # String and Char + rule %r/'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char + rule %r/'[^'\/]'/, Str::Char + rule %r/'/, Keyword + rule %r/"/, Str::Double, :string + + # Interpolated string + rule %r/`/ do + token Str::Double + push :interpolated_string + end + end + + state :comment do + rule %r([^/\*]+), Comment::Multiline + rule %r(/\*), Comment::Multiline, :comment + rule %r(\*/), Comment::Multiline, :pop! + rule %r([*/]), Comment::Multiline + end + + state :interpolated_string do + rule %r/[$]{/, Punctuation, :interpolated_expression + rule %r/`/, Str::Double, :pop! + rule %r/\\[$`]/, Str::Escape + rule %r/[^$`\\]+/, Str::Double + rule %r/[\\$]/, Str::Double + end + + state :interpolated_expression do + rule %r/}/, Punctuation, :pop! + mixin :root + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/robot_framework.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/robot_framework.rb new file mode 100644 index 000000000000..3675594fc342 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/robot_framework.rb @@ -0,0 +1,249 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class RobotFramework < RegexLexer + tag 'robot_framework' + aliases 'robot', 'robot-framework' + + title "Robot Framework" + desc 'Robot Framework is a generic open source automation testing framework (robotframework.org)' + + filenames '*.robot' + mimetypes 'text/x-robot' + + def initialize(opts = {}) + super(opts) + @col = 0 + @next = nil + @is_template = false + end + + def self.settings_with_keywords + @settings_with_keywords ||= Set.new [ + "library", "resource", "setup", "teardown", "template", "suite setup", + "suite teardown", "task setup", "task teardown", "task template", + "test setup", "test teardown", "test template", "variables" + ] + end + + def self.settings_with_args + @settings_with_args ||= Set.new [ + "arguments", "default tags", "documentation", "force tags", + "metadata", "return", "tags", "timeout", "task timeout", + "test timeout" + ] + end + + id = %r/(?:\\|[^|$@&% \t\n])+(?: (?:\\.|[^|$@&% \t\n])+)*/ + bdd = %r/(?:Given|When|Then|And|But) /i + sep = %r/ +\| +|[ ]{2,}|\t+/ + + start do + push :prior_text + end + + state :prior_text do + rule %r/^[^*].*/, Text + rule(//) { pop! } + end + + # Mixins + + state :whitespace do + rule %r/\s+/, Text::Whitespace + end + + state :section_include do + mixin :end_section + mixin :sep + mixin :newline + end + + state :end_section do + rule(/(?=^(?:\| )?\*)/) { pop! } + end + + state :return do + rule(//) { pop! } + end + + state :sep do + rule %r/\| /, Text::Whitespace + + rule sep do + token Text::Whitespace + @col = @col + 1 + if @next + push @next + elsif @is_template + push :args + elsif @col == 1 + @next = :keyword + push :keyword + else + push :args + end + push :cell_start + end + + rule %r/\.\.\. */ do + token Text::Whitespace + @col = @col + 1 + push :args + end + + rule %r/ ?\|/, Text::Whitespace + end + + state :newline do + rule %r/\n/ do + token Text::Whitespace + @col = 0 + @next = nil + push :cell_start + end + end + + # States + + state :root do + mixin :whitespace + + rule %r/^(?:\| )?\*[* ]*([A-Z]+(?: [A-Z]+)?).*/i do |m| + token Generic::Heading, m[0] + case m[1].chomp("s").downcase + when "setting" then push :section_settings + when "test case" then push :section_tests + when "task" then push :section_tasks + when "keyword" then push :section_keywords + when "variable" then push :section_variables + end + end + end + + state :section_settings do + mixin :section_include + + rule %r/([A-Z]+(?: [A-Z]+)?)(:?)/i do |m| + match = m[1].downcase + @next = if self.class.settings_with_keywords.include? match + :keyword + elsif self.class.settings_with_args.include? match + :args + end + groups Name::Builtin::Pseudo, Punctuation + end + end + + state :section_tests do + mixin :section_include + + rule %r/[$@&%{}]+/, Name::Label + rule %r/( )(?![ |])/, Name::Label + + rule id do + @is_template = false + token Name::Label + end + end + + state :section_tasks do + mixin :section_tests + end + + state :section_keywords do + mixin :section_include + + rule %r/[$@&%]\{/ do + token Name::Variable + push :var + end + + rule %r/[$@&%{}]+/, Name::Label + rule %r/( )(?![ |])/, Name::Label + + rule id, Name::Label + end + + state :section_variables do + mixin :section_include + + rule %r/[$@&%]\{/ do + token Name::Variable + @next = :args + push :var + end + end + + state :cell_start do + rule %r/#.*/, Comment + mixin :return + end + + state :keyword do + rule %r/(\[)([A-Z]+(?: [A-Z]+)?)(\])/i do |m| + groups Punctuation, Name::Builtin::Pseudo, Punctuation + + match = m[2].downcase + @is_template = true if match == "template" + if self.class.settings_with_keywords.include? match + @next = :keyword + elsif self.class.settings_with_args.include? match + @next = :args + end + + pop! + end + + rule %r/[$@&%]\{/ do + token Name::Variable + @next = :keyword unless @next.nil? + push :var + end + + rule %r/FOR/i do + token Name::Function + @next = :keyword unless @next.nil? + end + + rule %r/( )(?![ |])/, Name::Function + + rule bdd, Name::Builtin + rule id do + token Name::Function + @next = nil + end + + mixin :return + end + + state :args do + rule %r/[$@&%]\{/ do + token Name::Variable + @next = :keyword unless @next.nil? + push :var + end + + rule %r/[$@&%]+/, Str + rule %r/( )(?![ |])/, Str + rule id, Str + + mixin :return + end + + state :var do + rule %r/(\})( )(=)/ do + groups Name::Variable, Text::Whitespace, Punctuation + pop! + end + rule %r/[$@&%]\{/, Name::Variable, :var + rule %r/[{\[]/, Name::Variable, :var + rule %r/[}\]]/, Name::Variable, :pop! + rule %r/[^$@&%{}\[\]]+/, Name::Variable + rule %r/\}\[/, Name::Variable + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ruby.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ruby.rb new file mode 100644 index 000000000000..f3094f3c1f62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ruby.rb @@ -0,0 +1,454 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Ruby < RegexLexer + title "Ruby" + desc "The Ruby programming language (ruby-lang.org)" + tag 'ruby' + aliases 'rb' + filenames '*.rb', '*.ruby', '*.rbw', '*.rake', '*.gemspec', '*.podspec', + 'Rakefile', 'Guardfile', 'Gemfile', 'Capfile', 'Podfile', + 'Vagrantfile', '*.ru', '*.prawn', 'Berksfile', '*.arb', + 'Dangerfile', 'Fastfile', 'Deliverfile', 'Appfile' + + mimetypes 'text/x-ruby', 'application/x-ruby' + + def self.detect?(text) + return true if text.shebang? 'ruby' + end + + state :symbols do + # symbols + rule %r( + : # initial : + @{0,2} # optional ivar, for :@foo and :@@foo + [a-z_]\w*[!?]? # the symbol + )xi, Str::Symbol + + # special symbols + rule %r(:(?:\*\*|[-+]@|[/\%&\|^`~]|\[\]=?|<<|>>|<=?>|<=?|===?)), + Str::Symbol + + rule %r/:'(\\\\|\\'|[^'])*'/, Str::Symbol + rule %r/:"/, Str::Symbol, :simple_sym + end + + state :sigil_strings do + # %-sigiled strings + # %(abc), %[abc], %<abc>, %.abc., %r.abc., etc + delimiter_map = { '{' => '}', '[' => ']', '(' => ')', '<' => '>' } + rule %r/%([rqswQWxiI])?([^\w\s])/ do |m| + open = Regexp.escape(m[2]) + close = Regexp.escape(delimiter_map[m[2]] || m[2]) + interp = /[rQWxI]/ === m[1] + toktype = Str::Other + + puts " open: #{open.inspect}" if @debug + puts " close: #{close.inspect}" if @debug + + # regexes + if m[1] == 'r' + toktype = Str::Regex + push :regex_flags + end + + token toktype + + push do + uniq_chars = "#{open}#{close}".squeeze + uniq_chars = '' if open == close && open == "\\#" + rule %r/\\[##{uniq_chars}\\]/, Str::Escape + # nesting rules only with asymmetric delimiters + if open != close + rule %r/#{open}/ do + token toktype + push + end + end + rule %r/#{close}/, toktype, :pop! + + if interp + mixin :string_intp_escaped + rule %r/#/, toktype + else + rule %r/[\\#]/, toktype + end + + rule %r/[^##{uniq_chars}\\]+/m, toktype + end + end + end + + state :strings do + mixin :symbols + rule %r/\b[a-z_]\w*?[?!]?:\s+/, Str::Symbol, :expr_start + rule %r/'(\\\\|\\'|[^'])*'/, Str::Single + rule %r/"/, Str::Double, :simple_string + rule %r/(?<!\.)`/, Str::Backtick, :simple_backtick + end + + state :regex_flags do + rule %r/[mixounse]*/, Str::Regex, :pop! + end + + # double-quoted string and symbol + [[:string, Str::Double, '"'], + [:sym, Str::Symbol, '"'], + [:backtick, Str::Backtick, '`']].each do |name, tok, fin| + state :"simple_#{name}" do + mixin :string_intp_escaped + rule %r/[^\\#{fin}#]+/m, tok + rule %r/[\\#]/, tok + rule %r/#{fin}/, tok, :pop! + end + end + + keywords = %w( + BEGIN END alias begin break case defined\? do else elsif end + ensure for if in next redo rescue raise retry return super then + undef unless until when while yield + ) + + keywords_pseudo = %w( + loop include extend raise + alias_method attr catch throw private module_function + public protected true false nil __FILE__ __LINE__ + ) + + builtins_g = %w( + attr_reader attr_writer attr_accessor + + __id__ __send__ abort ancestors at_exit autoload binding callcc + caller catch chomp chop class_eval class_variables clone + const_defined\? const_get const_missing const_set constants + display dup eval exec exit extend fail fork format freeze + getc gets global_variables gsub hash id included_modules + inspect instance_eval instance_method instance_methods + instance_variable_get instance_variable_set instance_variables + lambda load local_variables loop method method_missing + methods module_eval name object_id open p print printf + private_class_method private_instance_methods private_methods proc + protected_instance_methods protected_methods public_class_method + public_instance_methods public_methods putc puts raise rand + readline readlines require require_relative scan select self send set_trace_func + singleton_methods sleep split sprintf srand sub syscall system + taint test throw to_a to_s trace_var trap untaint untrace_var warn + ) + + builtins_q = %w( + autoload block_given const_defined eql equal frozen + include instance_of is_a iterator kind_of method_defined + nil private_method_defined protected_method_defined + public_method_defined respond_to tainted + ) + + builtins_b = %w(chomp chop exit gsub sub) + + start do + push :expr_start + @heredoc_queue = [] + end + + state :whitespace do + mixin :inline_whitespace + rule %r/\n\s*/m, Text, :expr_start + rule %r/#.*$/, Comment::Single + + rule %r(=begin\b.*?\n=end\b)m, Comment::Multiline + end + + state :inline_whitespace do + rule %r/[ \t\r]+/, Text + end + + state :root do + mixin :whitespace + rule %r/__END__/, Comment::Preproc, :end_part + + rule %r/0_?[0-7]+(?:_[0-7]+)*/, Num::Oct + rule %r/0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex + rule %r/0b[01]+(?:_[01]+)*/, Num::Bin + + decimal = %r/[\d]+(?:_\d+)*/ + exp = %r/e[+-]?\d+/i + rule %r/#{decimal}(?:\.#{decimal}#{exp}?|#{exp})/, Num::Float + rule decimal, Num::Integer + + # names + rule %r/@@[a-z_]\w*/i, Name::Variable::Class + rule %r/@[a-z_]\w*/i, Name::Variable::Instance + rule %r/\$\w+/, Name::Variable::Global + rule %r(\$[!@&`'+~=/\\,;.<>_*\$?:"]), Name::Variable::Global + rule %r/\$-[0adFiIlpvw]/, Name::Variable::Global + rule %r/::/, Operator + + mixin :strings + + rule %r/(?:#{keywords.join('|')})(?=\W|$)/, Keyword, :expr_start + rule %r/(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start + + rule %r( + (module) + (\s+) + ([a-zA-Z_][a-zA-Z0-9_]*(::[a-zA-Z_][a-zA-Z0-9_]*)*) + )x do + groups Keyword, Text, Name::Namespace + end + + rule %r/(def\b)(\s*)/ do + groups Keyword, Text + push :funcname + end + + rule %r/(class\b)(\s*)/ do + groups Keyword, Text + push :classname + end + + rule %r/(?:#{builtins_q.join('|')})[?]/, Name::Builtin, :expr_start + rule %r/(?:#{builtins_b.join('|')})!/, Name::Builtin, :expr_start + rule %r/(?<!\.)(?:#{builtins_g.join('|')})\b/, + Name::Builtin, :method_call + + mixin :has_heredocs + + # `..` and `...` for ranges must have higher priority than `.` + # Otherwise, they will be parsed as :method_call + rule %r/\.{2,3}/, Operator, :expr_start + + rule %r/[A-Z][a-zA-Z0-9_]*/, Name::Constant, :method_call + rule %r/(\.|::)(\s*)([a-z_]\w*[!?]?|[*%&^`~+-\/\[<>=])/ do + groups Punctuation, Text, Name::Function + push :method_call + end + + rule %r/[a-zA-Z_]\w*[?!]/, Name, :expr_start + rule %r/[a-zA-Z_]\w*/, Name, :method_call + rule %r/\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\./, + Operator, :expr_start + rule %r/[-+\/*%=<>&!^|~]=?/, Operator, :expr_start + rule(/[?]/) { token Punctuation; push :ternary; push :expr_start } + rule %r<[\[({,:\\;/]>, Punctuation, :expr_start + rule %r<[\])}]>, Punctuation + end + + state :has_heredocs do + rule %r/(?<!\w)(<<[-~]?)(["`']?)([a-zA-Z_]\w*)(\2)/ do |m| + token Operator, m[1] + token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}" + @heredoc_queue << [['<<-', '<<~'].include?(m[1]), m[3]] + push :heredoc_queue unless state? :heredoc_queue + end + + rule %r/(<<[-~]?)(["'])(\2)/ do |m| + token Operator, m[1] + token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}" + @heredoc_queue << [['<<-', '<<~'].include?(m[1]), ''] + push :heredoc_queue unless state? :heredoc_queue + end + end + + state :heredoc_queue do + rule %r/(?=\n)/ do + goto :resolve_heredocs + end + + mixin :root + end + + state :resolve_heredocs do + mixin :string_intp_escaped + + rule %r/\n/, Str::Heredoc, :test_heredoc + rule %r/[#\\\n]/, Str::Heredoc + rule %r/[^#\\\n]+/, Str::Heredoc + end + + state :test_heredoc do + rule %r/[^#\\\n]*$/ do |m| + tolerant, heredoc_name = @heredoc_queue.first + check = tolerant ? m[0].strip : m[0].rstrip + + # check if we found the end of the heredoc + puts " end heredoc check #{check.inspect} = #{heredoc_name.inspect}" if @debug + if check == heredoc_name + @heredoc_queue.shift + # if there's no more, we're done looking. + pop! if @heredoc_queue.empty? + token Name::Constant + else + token Str::Heredoc + end + + pop! + end + + rule(//) { pop! } + end + + state :funcname do + rule %r/\s+/, Text + rule %r/\(/, Punctuation, :defexpr + rule %r( + (?:([a-zA-Z_]\w*)(\.))? + ( + [a-zA-Z_]\w*[!?]? | + \*\*? | [-+]@? | [/%&\|^`~] | \[\]=? | + <<? | >>? | <=>? | >= | ===? + ) + )x do |m| + puts "matches: #{[m[0], m[1], m[2], m[3]].inspect}" if @debug + groups Name::Class, Operator, Name::Function + pop! + end + + rule(//) { pop! } + end + + state :classname do + rule %r/\s+/, Text + rule %r/\w+(::\w+)+/, Name::Class + + rule %r/\(/ do + token Punctuation + push :defexpr + push :expr_start + end + + # class << expr + rule %r/<</ do + token Operator + goto :expr_start + end + + rule %r/[A-Z_]\w*/, Name::Class, :pop! + + rule(//) { pop! } + end + + state :ternary do + rule %r/(:)(\s+)/ do + groups Punctuation, Text + goto :expr_start + end + + rule %r/:(?![^#\n]*?[:\\])/ do + token Punctuation + goto :expr_start + end + + mixin :root + end + + state :defexpr do + rule %r/(\))(\.|::)?/ do + groups Punctuation, Operator + pop! + end + rule %r/\(/ do + token Punctuation + push :defexpr + push :expr_start + end + + mixin :root + end + + state :in_interp do + rule %r/}/, Str::Interpol, :pop! + mixin :root + end + + state :string_intp do + rule %r/[#][{]/, Str::Interpol, :in_interp + rule %r/#(@@?|\$)[a-z_]\w*/i, Str::Interpol + end + + state :string_intp_escaped do + mixin :string_intp + rule %r/\\([\\abefnrstv#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})/, + Str::Escape + rule %r/\\./, Str::Escape + end + + state :method_call do + rule %r(/|%) do + token Operator + goto :expr_start + end + + rule(/(?=\n)/) { pop! } + + rule(//) { goto :method_call_spaced } + end + + state :method_call_spaced do + mixin :whitespace + + rule %r([%/]=) do + token Operator + goto :expr_start + end + + rule %r((/)(?=\S|\s*/)) do + token Str::Regex + goto :slash_regex + end + + mixin :sigil_strings + + rule(%r((?=\s*/))) { pop! } + + rule(/\s+/) { token Text; goto :expr_start } + rule(//) { pop! } + end + + state :expr_start do + mixin :inline_whitespace + + rule %r(/) do + token Str::Regex + goto :slash_regex + end + + # char operator. ?x evaulates to "x", unless there's a digit + # beforehand like x>=0?n[x]:"" + rule %r( + [?](\\[MC]-)* # modifiers + (\\([\\abefnrstv\#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S) + (?!\w) + )x, Str::Char, :pop! + + # special case for using a single space. Ruby demands that + # these be in a single line, otherwise it would make no sense. + rule %r/(\s*)(%[rqswQWxiI]? \S* )/ do + groups Text, Str::Other + pop! + end + + mixin :sigil_strings + + rule(//) { pop! } + end + + state :slash_regex do + mixin :string_intp + rule %r(\\\\), Str::Regex + rule %r(\\/), Str::Regex + rule %r([\\#]), Str::Regex + rule %r([^\\/#]+)m, Str::Regex + rule %r(/) do + token Str::Regex + goto :regex_flags + end + end + + state :end_part do + # eat up the rest of the stream as Comment::Preproc + rule %r/.+/m, Comment::Preproc, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/rust.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/rust.rb new file mode 100644 index 000000000000..af5ed3a8594c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/rust.rb @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Rust < RegexLexer + title "Rust" + desc 'The Rust programming language (rust-lang.org)' + tag 'rust' + aliases 'rs', + # So that directives from https://github.com/budziq/rust-skeptic + # do not prevent highlighting. + 'rust,no_run', 'rs,no_run', + 'rust,ignore', 'rs,ignore', + 'rust,should_panic', 'rs,should_panic' + filenames '*.rs' + mimetypes 'text/x-rust' + + def self.detect?(text) + return true if text.shebang? 'rustc' + end + + def self.keywords + @keywords ||= %w( + as assert async await break const continue copy do drop else enum extern + fail false fn for if impl let log loop match mod move mut priv pub pure + ref return self static struct true trait type unsafe use where + while box + ) + end + + def self.builtins + @builtins ||= Set.new %w( + Add BitAnd BitOr BitXor bool c_char c_double c_float char + c_int clock_t c_long c_longlong Cons Const Copy c_schar c_short + c_uchar c_uint c_ulong c_ulonglong c_ushort c_void dev_t DIR + dirent Div Either Eq Err f32 f64 Failure FILE float fpos_t + i16 i32 i64 i8 isize Index ino_t int intptr_t Left mode_t Modulo Mul + Neg Nil None Num off_t Ok Option Ord Owned pid_t Ptr ptrdiff_t + Right Send Shl Shr size_t Some ssize_t str Sub Success time_t + u16 u32 u64 u8 usize uint uintptr_t + Box Vec String Gc Rc Arc + ) + end + + def macro_closed? + @macro_delims.values.all?(&:zero?) + end + + start { + @macro_delims = { ']' => 0, ')' => 0, '}' => 0 } + push :bol + } + + delim_map = { '[' => ']', '(' => ')', '{' => '}' } + + id = /[a-z_]\w*/i + hex = /[0-9a-f]/i + escapes = %r( + \\ ([nrt'"\\0] | x#{hex}{2} | u#{hex}{4} | U#{hex}{8}) + )x + size = /8|16|32|64/ + + # Although not officially part of Rust, the rustdoc tool allows code in + # comments to begin with `#`. Code like this will be evaluated but not + # included in the HTML output produced by rustdoc. So that code intended + # for these comments can be higlighted with Rouge, the Rust lexer needs + # to check if the beginning of the line begins with a `# `. + state :bol do + mixin :whitespace + rule %r/#\s[^\n]*/, Comment::Special + rule(//) { pop! } + end + + state :attribute do + mixin :whitespace + mixin :has_literals + rule %r/[(,)=:]/, Name::Decorator + rule %r/\]/, Name::Decorator, :pop! + rule id, Name::Decorator + end + + state :whitespace do + rule %r/\s+/, Text + rule %r(//[^\n]*), Comment + rule %r(/[*].*?[*]/)m, Comment::Multiline + end + + state :root do + rule %r/\n/, Text, :bol + mixin :whitespace + rule %r/#!?\[/, Name::Decorator, :attribute + rule %r/\b(?:#{Rust.keywords.join('|')})\b/, Keyword + mixin :has_literals + + rule %r([=-]>), Keyword + rule %r(<->), Keyword + rule %r/[()\[\]{}|,:;]/, Punctuation + rule %r/[*\/!@~&+%^<>=\?-]|\.{2,3}/, Operator + + rule %r/([.]\s*)?#{id}(?=\s*[(])/m, Name::Function + rule %r/[.]\s*await\b/, Keyword + rule %r/[.]\s*#{id}/, Name::Property + rule %r/[.]\s*\d+/, Name::Attribute + rule %r/(#{id})(::)/m do + groups Name::Namespace, Punctuation + end + + # macros + rule %r/\bmacro_rules!/, Name::Decorator, :macro_rules + rule %r/#{id}!/, Name::Decorator, :macro + + rule %r/'#{id}/, Name::Variable + rule %r/#{id}/ do |m| + name = m[0] + if self.class.builtins.include? name + token Name::Builtin + else + token Name + end + end + end + + state :macro do + mixin :has_literals + + rule %r/[\[{(]/ do |m| + @macro_delims[delim_map[m[0]]] += 1 + puts " macro_delims: #{@macro_delims.inspect}" if @debug + token Punctuation + end + + rule %r/[\]})]/ do |m| + @macro_delims[m[0]] -= 1 + puts " macro_delims: #{@macro_delims.inspect}" if @debug + pop! if macro_closed? + token Punctuation + end + + # same as the rule in root, but don't push another macro state + rule %r/#{id}!/, Name::Decorator + mixin :root + + # No syntax errors in macros + rule %r/./, Text + end + + state :macro_rules do + rule %r/[$]#{id}(:#{id})?/, Name::Variable + rule %r/[$]/, Name::Variable + + mixin :macro + end + + state :has_literals do + # constants + rule %r/\b(?:true|false|nil)\b/, Keyword::Constant + # characters + rule %r( + ' (?: #{escapes} | [^\\] ) ' + )x, Str::Char + + rule %r/"/, Str, :string + rule %r/r(#*)".*?"\1/m, Str + + # numbers + dot = /[.][0-9_]+/ + exp = /e[-+]?[0-9_]+/ + flt = /f32|f64/ + + rule %r( + [0-9_]+ + (#{dot} #{exp}? #{flt}? + |#{dot}? #{exp} #{flt}? + |#{dot}? #{exp}? #{flt} + ) + )x, Num::Float + + rule %r( + ( 0b[10_]+ + | 0x[0-9a-fA-F_]+ + | 0o[0-7]+ + | [0-9_]+ + ) (u#{size}?|i#{size})? + )x, Num::Integer + + end + + state :string do + rule %r/"/, Str, :pop! + rule escapes, Str::Escape + rule %r/[^"\\]+/m, Str + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sas.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sas.rb new file mode 100644 index 000000000000..6095854d6304 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sas.rb @@ -0,0 +1,563 @@ +# -*- coding: utf-8 -*- # + +module Rouge + module Lexers + class SAS < RegexLexer + title "SAS" + desc "SAS (Statistical Analysis Software)" + tag 'sas' + filenames '*.sas' + mimetypes 'application/x-sas', 'application/x-stat-sas', 'application/x-sas-syntax' + + def self.data_step_statements + # from Data step statements - SAS 9.4 Statements reference + # http://support.sas.com/documentation/cdl/en/lestmtsref/68024/PDF/default/lestmtsref.pdf + @data_step_statements ||= Set.new %w( + ABORT ARRAY ATTRIB BY CALL CARDS CARDS4 CATNAME CHECKPOINT + EXECUTE_ALWAYS CONTINUE DATA DATALINES DATALINES4 DELETE DESCRIBE + DISPLAY DM DO UNTIL WHILE DROP END ENDSAS ERROR EXECUTE FILE FILENAME + FOOTNOTE FORMAT GO TO IF THEN ELSE INFILE INFORMAT INPUT + KEEP LABEL LEAVE LENGTH LIBNAME LINK LIST LOCK LOSTCARD MERGE + MISSING MODIFY OPTIONS OUTPUT PAGE PUT PUTLOG REDIRECT REMOVE RENAME + REPLACE RESETLINE RETAIN RETURN RUN SASFILE SELECT SET SKIP STOP + SYSECHO TITLE UPDATE WHERE WINDOW X + ) + # label: + # Sum + end + + def self.sas_functions + # from SAS 9.4 Functions and CALL Routines reference + # http://support.sas.com/documentation/cdl/en/lefunctionsref/67960/PDF/default/lefunctionsref.pdf + @sas_functions ||= Set.new %w( + ABS ADDR ADDRLONG AIRY ALLCOMB ALLPERM ANYALNUM ANYALPHA ANYCNTRL + ANYDIGIT ANYFIRST ANYGRAPH ANYLOWER ANYNAME ANYPRINT ANYPUNCT + ANYSPACE ANYUPPER ANYXDIGIT ARCOS ARCOSH ARSIN ARSINH ARTANH ATAN + ATAN2 ATTRC ATTRN BAND BETA BETAINV BLACKCLPRC BLACKPTPRC + BLKSHCLPRC BLKSHPTPRC BLSHIFT BNOT BOR BRSHIFT BXOR BYTE CAT CATQ + CATS CATT CATX CDF CEIL CEILZ CEXIST CHAR CHOOSEC CHOOSEN CINV + CLOSE CMISS CNONCT COALESCE COALESCEC COLLATE COMB COMPARE COMPBL + COMPFUZZ COMPGED COMPLEV COMPOUND COMPRESS CONSTANT CONVX CONVXP + COS COSH COT COUNT COUNTC COUNTW CSC CSS CUMIPMT CUMPRINC CUROBS + CV DACCDB DACCDBSL DACCSL DACCSYD DACCTAB DAIRY DATDIF DATE + DATEJUL DATEPART DATETIME DAY DCLOSE DCREATE DEPDB DEPDBSL DEPSL + DEPSYD DEPTAB DEQUOTE DEVIANCE DHMS DIF DIGAMMA DIM DINFO DIVIDE + DNUM DOPEN DOPTNAME DOPTNUM DOSUBL DREAD DROPNOTE DSNAME + DSNCATLGD DUR DURP EFFRATE ENVLEN ERF ERFC EUCLID EXIST EXP FACT + FAPPEND FCLOSE FCOL FCOPY FDELETE FETCH FETCHOBS FEXIST FGET + FILEEXIST FILENAME FILEREF FINANCE FIND FINDC FINDW FINFO FINV + FIPNAME FIPNAMEL FIPSTATE FIRST FLOOR FLOORZ FMTINFO FNONCT FNOTE + FOPEN FOPTNAME FOPTNUM FPOINT FPOS FPUT FREAD FREWIND FRLEN FSEP + FUZZ FWRITE GAMINV GAMMA GARKHCLPRC GARKHPTPRC GCD GEODIST + GEOMEAN GEOMEANZ GETOPTION GETVARC GETVARN GRAYCODE HARMEAN + HARMEANZ HBOUND HMS HOLIDAY HOLIDAYCK HOLIDAYCOUNT HOLIDAYNAME + HOLIDAYNX HOLIDAYNY HOLIDAYTEST HOUR HTMLDECODE HTMLENCODE + IBESSEL IFC IFN INDEX INDEXC INDEXW INPUT INPUTC INPUTN INT + INTCINDEX INTCK INTCYCLE INTFIT INTFMT INTGET INTINDEX INTNX + INTRR INTSEAS INTSHIFT INTTEST INTZ IORCMSG IPMT IQR IRR JBESSEL + JULDATE JULDATE7 KURTOSIS LAG LARGEST LBOUND LCM LCOMB LEFT + LENGTH LENGTHC LENGTHM LENGTHN LEXCOMB LEXCOMBI LEXPERK LEXPERM + LFACT LGAMMA LIBNAME LIBREF LOG LOG1PX LOG10 LOG2 LOGBETA LOGCDF + LOGISTIC LOGPDF LOGSDF LOWCASE LPERM LPNORM MAD MARGRCLPRC + MARGRPTPRC MAX MD5 MDY MEAN MEDIAN MIN MINUTE MISSING MOD + MODEXIST MODULE MODULEC MODULEN MODZ MONTH MOPEN MORT MSPLINT + MVALID N NETPV NLITERAL NMISS NOMRATE NORMAL NOTALNUM NOTALPHA + NOTCNTRL NOTDIGIT NOTE NOTFIRST NOTGRAPH NOTLOWER NOTNAME + NOTPRINT NOTPUNCT NOTSPACE NOTUPPER NOTXDIGIT NPV NVALID NWKDOM + OPEN ORDINAL PATHNAME PCTL PDF PEEK PEEKC PEEKCLONG PEEKLONG PERM + PMT POINT POISSON PPMT PROBBETA PROBBNML PROBBNRM PROBCHI PROBF + PROBGAM PROBHYPR PROBIT PROBMC PROBNEGB PROBNORM PROBT PROPCASE + PRXCHANGE PRXMATCH PRXPAREN PRXPARSE PRXPOSN PTRLONGADD PUT PUTC + PUTN PVP QTR QUANTILE QUOTE RANBIN RANCAU RAND RANEXP RANGAM + RANGE RANK RANNOR RANPOI RANTBL RANTRI RANUNI RENAME REPEAT + RESOLVE REVERSE REWIND RIGHT RMS ROUND ROUNDE ROUNDZ SAVING + SAVINGS SCAN SDF SEC SECOND SHA256 SHA256HEX SHA256HMACHEX SIGN + SIN SINH SKEWNESS SLEEP SMALLEST SOAPWEB SOAPWEBMETA + SOAPWIPSERVICE SOAPWIPSRS SOAPWS SOAPWSMETA SOUNDEX SPEDIS SQRT + SQUANTILE STD STDERR STFIPS STNAME STNAMEL STRIP SUBPAD SUBSTR + SUBSTRN SUM SUMABS SYMEXIST SYMGET SYMGLOBL SYMLOCAL SYSEXIST + SYSGET SYSMSG SYSPARM SYSPROCESSID SYSPROCESSNAME SYSPROD SYSRC + SYSTEM TAN TANH TIME TIMEPART TIMEVALUE TINV TNONCT TODAY + TRANSLATE TRANSTRN TRANWRD TRIGAMMA TRIM TRIMN TRUNC TSO TYPEOF + TZONEID TZONENAME TZONEOFF TZONES2U TZONEU2S UNIFORM UPCASE + URLDECODE URLENCODE USS UUIDGEN VAR VARFMT VARINFMT VARLABEL + VARLEN VARNAME VARNUM VARRAY VARRAYX VARTYPE VERIFY VFORMAT + VFORMATD VFORMATDX VFORMATN VFORMATNX VFORMATW VFORMATWX VFORMATX + VINARRAY VINARRAYX VINFORMAT VINFORMATD VINFORMATDX VINFORMATN + VINFORMATNX VINFORMATW VINFORMATWX VINFORMATX VLABEL VLABELX + VLENGTH VLENGTHX VNAME VNAMEX VTYPE VTYPEX VVALUE VVALUEX WEEK + WEEKDAY WHICHC WHICHN WTO YEAR YIELDP YRDIF YYQ ZIPCITY + ZIPCITYDISTANCE ZIPFIPS ZIPNAME ZIPNAMEL ZIPSTATE + ) + end + + def self.sas_macro_statements + # from SAS 9.4 Macro Language Reference + # Chapter 12 + @sas_macro_statements ||= Set.new %w( + %COPY %DISPLAY %GLOBAL %INPUT %LET %MACRO %PUT %SYMDEL %SYSCALL + %SYSEXEC %SYSLPUT %SYSMACDELETE %SYSMSTORECLEAR %SYSRPUT %WINDOW + %ABORT %DO %TO %UNTIL %WHILE %END %GOTO %IF %THEN %ELSE %LOCAL + %RETURN + %INCLUDE %LIST %RUN + ) + # Omitted: + # %label: Identifies the destination of a %GOTO statement. + # %MEND + end + + def self.sas_macro_functions + # from SAS 9.4 Macro Language Reference + # Chapter 12 + + @sas_macro_functions ||= Set.new %w( + %BQUOTE %NRBQUOTE %EVAL %INDEX %LENGTH %QUOTE %NRQUOTE %SCAN + %QSCAN %STR %NRSTR %SUBSTR %QSUBSTR %SUPERQ %SYMEXIST %SYMGLOBL + %SYMLOCAL %SYSEVALF %SYSFUNC %QSYSFUNC %SYSGET %SYSMACEXEC + %SYSMACEXIST %SYSMEXECDEPTH %SYSMEXECNAME %SYSPROD %UNQUOTE + %UPCASE %QUPCASE + ) + end + + def self.sas_auto_macro_vars + # from SAS 9.4 Macro Language Reference + # Chapter 12 + + @sas_auto_macro_vars ||= Set.new %w( + &SYSADDRBITS &SYSBUFFR &SYSCC &SYSCHARWIDTH &SYSCMD &SYSDATASTEPPHASE &SYSDATE + &SYSDATE9 &SYSDAY &SYSDEVIC &SYSDMG &SYSDSN &SYSENCODING &SYSENDIAN &SYSENV + &SYSERR &SYSERRORTEXT &SYSFILRC &SYSHOSTINFOLONG &SYSHOSTNAME &SYSINDEX + &SYSINFO &SYSJOBID &SYSLAST &SYSLCKRC &SYSLIBRC &SYSLOGAPPLNAME &SYSMACRONAME + &SYSMENV &SYSMSG &SYSNCPU &SYSNOBS &SYSODSESCAPECHAR &SYSODSPATH &SYSPARM + &SYSPBUFF &SYSPRINTTOLIST &SYSPRINTTOLOG &SYSPROCESSID &SYSPROCESSMODE + &SYSPROCESSNAME &SYSPROCNAME &SYSRC &SYSSCP &SYSSCPL &SYSSITE &SYSSIZEOFLONG + &SYSSIZEOFPTR &SYSSIZEOFUNICODE &SYSSTARTID &SYSSTARTNAME &SYSTCPIPHOSTNAME + &SYSTIME &SYSTIMEZONE &SYSTIMEZONEIDENT &SYSTIMEZONEOFFSET &SYSUSERID &SYSVER + &SYSVLONG &SYSVLONG4 &SYSWARNINGTEXT + ) + end + + def self.proc_keywords + # Create a hash with keywords for common PROCs, keyed by PROC name + @proc_keywords ||= {} + + @proc_keywords["SQL"] ||= Set.new %w( + ALTER TABLE CONNECT CREATE INDEX VIEW DELETE DESCRIBE DISCONNECT DROP EXECUTE + INSERT RESET SELECT UPDATE VALIDATE ADD CONSTRAINT DROP FOREIGN KEY PRIMARY + MODIFY LIKE AS ORDER BY USING FROM INTO SET VALUES RESET DISTINCT UNIQUE + WHERE GROUP HAVING LEFT RIGHT INNER JOIN ON + ) + # from SAS 9.4 SQL Procedure User's Guide + + @proc_keywords["MEANS"] ||= Set.new %w( + BY CLASS FREQ ID OUTPUT OUT TYPES VAR WAYS WEIGHT + ATTRIB FORMAT LABEL WHERE + DESCENDING NOTSORTED + NOTHREADS NOTRAP PCTLDEF SUMSIZE THREADS CLASSDATA COMPLETETYPES + EXCLUSIVE MISSING FW MAXDEC NONOBS NOPRINT ORDER FORMATTED FREQ + UNFORMATTED PRINT PRINTALLTYPES PRINTIDVARS STACKODSOUTPUT + CHARTYPE DESCENDTYPES IDMIN + ALPHA EXCLNPWGT QMARKERS QMETHOD QNTLDEF VARDEF + CLM CSS CV KURTOSIS KURT LCLM MAX MEAN MIN MODE N + NMISS RANGE SKEWNESS SKEW STDDEV STD STDERR SUM SUMWGT UCLM USS VAR + MEDIAN P50 Q1 P25 Q3 P75 P1 P90 P5 P95 P10 P99 P20 P30 P40 P60 P70 + P80 QRANGE + PROBT PRT T + ASCENDING GROUPINTERNAL MLF PRELOADFMT + MAXID AUTOLABEL AUTONAME KEEPLEN LEVELS NOINHERIT + ) + # from BASE SAS 9.4 Procedures Guide, Fifth Edition + + @proc_keywords["DATASETS"] ||= Set.new %w( + AGE APPEND ATTRIB AUDIT CHANGE CONTENTS COPY DELETE EXCHANGE + EXCLUDE FORMAT IC CREATE DELETE REACTIVATE INDEX CENTILES INFORMAT + INITIATE LABEL LOG MODIFY REBUILD RENAME REPAIR RESUME SAVE SELECT + SUSPEND TERMINATE USER_VAR XATTR ADD OPTIONS REMOVE SET + ) + # from BASE SAS 9.4 Procedures Guide, Fifth Edition + + @proc_keywords["SORT"] ||= Set.new %w( + BY DESCENDING KEY ASCENDING ASC DESC DATECOPY FORCE OVERWRITE + PRESORTED SORTSIZE TAGSORT DUPOUT OUT UNIQUEOUT NODUPKEY NOUNIQUEKEY + NOTHREADS THREADS EQUALS NOEQUALS + ATTRIB FORMAT LABEL WHERE + ) + # from BASE SAS 9.4 Procedures Guide, Fifth Edition + + @proc_keywords["PRINT"] ||= Set.new %w( + BY DESCENDING NOTSORTED PAGEBY SUMBY ID STYLE SUM VAR CONTENTS DATA + GRANDTOTAL_LABEL HEADING LABEL SPLIT SUMLABEL NOSUMLABEL + BLANKLINE COUNT DOUBLE N NOOBS OBS ROUND + ROWS UNIFORM WIDTH + ATTRIB FORMAT LABEL WHERE + ) + # from BASE SAS 9.4 Procedures Guide, Fifth Edition + + @proc_keywords["APPEND"] ||= Set.new %w( + BASE APPENDVER DATA ENCRYPTKEY FORCE GETSORT NOWARN + ATTRIB FORMAT LABEL WHERE + ) + # from BASE SAS 9.4 Procedures Guide, Fifth Edition + + @proc_keywords["TRANSPOSE"] ||= Set.new %w( + DELIMITER LABEL LET NAME OUT PREFIX SUFFIX BY DESCENDING NOTSORTED + COPY ID IDLABEL VAR INDB + ATTRIB FORMAT LABEL WHERE + ) + # from BASE SAS 9.4 Procedures Guide, Fifth Edition + + @proc_keywords["FREQ"] ||= Set.new %w( + BY EXACT OUTPUT TABLES TEST WEIGHT + COMPRESS DATA FORMCHAR NLEVELS NOPRINT ORDER PAGE FORMATTED FREQ + INTERNAL + AGREE BARNARD BINOMIAL BIN CHISQ COMOR EQOR ZELEN FISHER JT KAPPA + KENTB TAUB LRCHI MCNEM MEASURES MHCHI OR ODDSRATIO PCHI PCORR RELRISK + RISKDIFF SCORR SMDCR SMDRC STUTC TAUC TREND WTKAP WTKAPPA + OUT AJCHI ALL BDCHI CMH CMH1 CMH2 CMHCOR CMHGA CMHRMS COCHQ CONTGY + CRAMV EQKAP EQWKP GAMMA GS GAILSIMON LAMCR LAMDAS LAMRC LGOR LGRRC1 + LGRRC2 MHOR MHRRC1 MHRRC2 N NMISS PHI PLCORR RDIF1 RDIF2 RISKDIFF1 + RISKDIFF2 RRC1 RELRISK1 RRC2 RELRISK2 RSK1 RISK1 RSK11 RISK11 RSK12 + RISK12 RSK21 RISK21 RSK22 RISK22 TSYMM BOWKER U UCR URC + CELLCHI2 CUMCOL DEVIATION EXPECTED MISSPRINT PEARSONREF PRINTWKTS + SCOROUT SPARSE STDRES TOTPCT + CONTENTS CROSSLIST FORMAT LIST MAXLEVELS NOCOL NOCUM NOFREQ NOPERCENT + NOPRINT NOROW NOSPARSE NOWARN PLOTS OUT OUTCUM OUTEXPECT OUTPCT + ZEROS + ) + # from Base SAS 9.4 Procedures Guide: Statistical Procedures, Fourth Edition + + @proc_keywords["CORR"] ||= Set.new %w( + BY FREQ ID PARTIAL VAR WEIGHT WITH + DATA OUTH OUTK OUTP OUTPLC OUTPLS OUTS + EXCLNPWGHT FISHER HOEFFDING KENDALL NOMISS PEARSON POLYCHORIC + POLYSERIAL ALPHA COV CSSCP SINGULAR SSCP VARDEF PLOTS MATRIX SCATTER + BEST NOCORR NOPRINT NOPROB NOSIMPLE RANK + ) + # from Base SAS 9.4 Procedures Guide: Statistical Procedures, Fourth Edition + + @proc_keywords["REPORT"] ||= Set.new %w( + BREAK BY DESCENDING NOTSORTED COLUMN COMPUTE STYLE LINE ENDCOMP + CALL DEFINE _ROW_ FREQ RBREAK WEIGHT + ATTRIB FORMAT LABEL WHERE + DATA NOALIAS NOCENTER NOCOMPLETECOLS NOCOMPLETEROWS NOTHREADS + NOWINDOWS OUT PCTLDEF THREADS WINDOWS COMPLETECOLS NOCOMPLETECOLS + COMPLETEROWS NOCOMPLETEROWS CONTENTS SPANROWS COMMAND HELP PROMPT + BOX BYPAGENO CENTER NOCENTER COLWIDTH FORMCHAR LS MISSING PANELS PS + PSPACE SHOWALL SPACING WRAP EXCLNPWGT QMARKERS QMETHOD QNTLDEF VARDEF + NAMED NOHEADER SPLIT HEADLINE HEADSKIP LIST NOEXEC OUTREPT PROFILE + REPORT + COLOR DOL DUL OL PAGE SKIP SUMMARIZE SUPPRESS UL + BLINK COMMAND HIGHLIGHT RVSVIDEO MERGE REPLACE URL URLBP URLP + AFTER BEFORE _PAGE_ LEFT RIGHT CHARACTER LENGTH + EXCLUSIVE MISSING MLF ORDER DATA FORMATTED FREQ INTERNAL PRELOADFMT + WIDTH + ACROSS ANALYSIS COMPUTED DISPLAY GROUP ORDER + CONTENTS FLOW ID NOPRINT NOZERO PAGE + CSS CV MAX MEAN MIN MODE N NMISS PCTN PCTSUM RANGE STD STDERR SUM + SUMWGT USS VAR + MEDIAN P50 Q1 P25 Q3 P75 P1 P90 P5 P95 P10 P99 P20 P30 P40 P60 P70 + P80 QRANGE + PROBT PRT T + ) + # from BASE SAS 9.4 Procedures Guide, Fifth Edition + + @proc_keywords["METALIB"] ||= Set.new %w( + OMR DBAUTH DBUSER DBPASSWORD EXCLUDE SELECT READ FOLDER FOLDERID + IMPACT_LIMIT NOEXEC PREFIX REPORT UPDATE_RULE DELETE NOADD NODELDUP + NOUPDATE + LIBID LIBRARY LIBURI + TYPE DETAIL SUMMARY + ) + # from SAS 9.4 Language Interfaces to Metadata, Third Edition + + @proc_keywords["GCHART"] ||= Set.new %w( + DATA ANNOTATE GOUT IMAGEMAP BLOCK HBAR HBAR3D VBAR VBAR3D PIE PIE3D + DONUT STAR ANNO + BY NOTE FORMAT LABEL WHERE + BLOCKMAX CAXIS COUTLINE CTEXT LEGEND NOHEADING NOLEGEND PATTERNID + GROUP MIDPOINT SUBGROUP WOUTLINE DESCRIPTION NAME DISCRETE LEVELS + OLD MISSING HTML_LEGEND HTML URL FREQ G100 SUMVAR TYPE + CAUTOREF CERROR CFRAME CLM CREF FRAME NOFRAME GSPACE IFRAME + IMAGESTYLE TILE FIT LAUTOREF NOSYMBOL PATTERNID SHAPE SPACE + SUBOUTSIDE WAUTOREF WIDTH WOUTLINE WREF + ASCENDING AUTOREF CLIPREF DESCENDING FRONTREF GAXIS MAXIS MINOR + NOAXIS NOBASEREF NOZERO RANGE AXIS REF CFREQ CFREQLABEL NONE CPERCENT + CPERCENTLABEL ERRORBAR BARS BOTH TOP FREQLABEL INSIDE MEAN MEANLABEL + NOSTATS OUTSIDE PERCENT PERCENTLABEL PERCENTSUM SUM + CFILL COUTLINE DETAIL_RADIUS EXPLODE FILL SOLID X INVISIBLE NOHEADING + RADIUS WOUTLINE DETAIL_THRESHOLD DETAIL_PERCENT DETAIL_SLICE + DETAIL_VALUE DONUTPCT LABEL ACROSS DOWN GROUP NOGROUPHEADING SUBGROUP + MATCHCOLOR OTHERCOLOR OTHERLABEL PERCENT ARROW PLABEL PPERCENT SLICE + VALUE + ANGLE ASCENDING CLOCKWISE DESCENDING JSTYLE + NOCONNECT STARMAX STARMIN + ) + # from SAS GRAPH 9.4 Reference, Fourth Edition + + @proc_keywords["GPLOT"] ||= Set.new %w( + DATA ANNOTATE GOUT IMAGEMAP UNIFORM BUBBLE BUBBLE2 PLOT PLOT2 + BCOLOR BFILL BFONT BLABEL BSCALE AREA RADIUS BSIZE DESCRIPTION NAME + AUTOHREF CAUTOHREF CHREF HAXIS HMINOR HREF HREVERSE HZERO LAUTOHREF + LHREF WAUTOHREF WHREF HTML URL + CAXIS CFRAME CTEXT DATAORDER FRAME NOFRAME FRONTREF GRID IFRAME + IMAGESTYLE TILE FIT NOAXIS + AUTOVREF CAUTOVREF CVREF LAUTOVREF LVREF VAXIS VMINOR VREF VREVERSE + VZERO WAUTOVREF WVREF + CBASELINE COUTLINE + AREAS GRID LEGEND NOLASTAREA NOLEGEND OVERLAY REGEQN SKIPMISS + ) + # from SAS GRAPH 9.4 Reference, Fourth Edition + + @proc_keywords["REG"] ||= Set.new %w( + MODEL BY FREQ ID VAR WEIGHT ADD CODE DELETE MTEST OUTPUT PAINT + PLOT PRINT REFIT RESTRICT REWEIGHT STORE TEST + ) + # from SAS/STAT 15.1 User's Guide + + @proc_keywords["SGPLOT"] ||= Set.new %w( + STYLEATTRS BAND X Y UPPER LOWER BLOCK BUBBLE DENSITY DOT DROPLINE + ELLIPSE ELLIPSEPARM FRINGE GRADLEGEND HBAR HBARBASIC HBARPARM + HBOX HEATMAP HEATMAPPARM HIGHLOW HISTOGRAM HLINE INSET KEYLEGEND + LINEPARM LOESS NEEDLE PBSPLINE POLYGON REFLINE REG SCATTER SERIES + SPLINE STEP SYMBOLCHAR SYMBOLIMAGE TEXT VBAR VBARBASIC VBARPARM + VBOX VECTOR VLINE WATERFALL XAXIS X2AXIS XAXISTABLE YAXIS Y2AXIS + YAXISTABLE + ) + # from ODS Graphics: Procedures Guide, Sixth Edition + return @proc_keywords + end + + def self.sas_proc_names + # from SAS Procedures by Name + # http://support.sas.com/documentation/cdl/en/allprodsproc/68038/HTML/default/viewer.htm#procedures.htm + + @sas_proc_names ||= Set.new %w( + ACCESS ACECLUS ADAPTIVEREG ALLELE ANOM ANOVA APPEND APPSRV ARIMA + AUTHLIB AUTOREG BCHOICE BOM BOXPLOT BTL BUILD CALENDAR CALIS CALLRFC + CANCORR CANDISC CAPABILITY CASECONTROL CATALOG CATMOD CDISC CDISC + CHART CIMPORT CLP CLUSTER COMPARE COMPILE COMPUTAB CONTENTS CONVERT + COPULA COPY CORR CORRESP COUNTREG CPM CPORT CUSUM CV2VIEW DATEKEYS + DATASETS DATASOURCE DB2EXT DB2UTIL DBCSTAB DBF DBLOAD DELETE DIF + DISCRIM DISPLAY DISTANCE DMSRVADM DMSRVDATASVC DMSRVPROCESSSVC + DOCUMENT DOWNLOAD DQLOCLST DQMATCH DQSCHEME DS2 DTREE ENTROPY ESM + EXPAND EXPLODE EXPORT FACTEX FACTOR FAMILY FASTCLUS FCMP FEDSQL FMM + FONTREG FORECAST FORMAT FORMS FREQ FSBROWSE FSEDIT FSLETTER FSLIST + FSVIEW G3D G3GRID GA GAM GAMPL GANNO GANTT GAREABAR GBARLINE GCHART + GCONTOUR GDEVICE GEE GENESELECT GENMOD GEOCODE GFONT GINSIDE GIS GKPI + GLIMMIX GLM GLMMOD GLMPOWER GLMSELECT GMAP GOPTIONS GPLOT GPROJECT + GRADAR GREDUCE GREMOVE GREPLAY GROOVY GSLIDE GTILE HADOOP HAPLOTYPE + HDMD HPBIN HPCANDISC HPCDM HPCOPULA HPCORR HPCOUNTREG HPDMDB HPDS2 + HPFMM HPGENSELECT HPIMPUTE HPLMIXED HPLOGISTIC HPMIXED HPNLMOD + HPPANEL HPPLS HPPRINCOMP HPQUANTSELECT HPQLIM HPREG HPSAMPLE + HPSEVERITY HPSPLIT HPSUMMARY HTSNP HTTP ICLIFETEST ICPHREG IML IMPORT + IMSTAT IMXFER INBREED INFOMAPS INTPOINT IOMOPERATE IRT ISHIKAWA ITEMS + JAVAINFO JSON KDE KRIGE2D LASR LATTICE LIFEREG LIFETEST LOAN + LOCALEDATA LOESS LOGISTIC LP LUA MACONTROL MAPIMPORT MCMC MDC MDDB + MDS MEANS METADATA METALIB METAOPERATE MI MIANALYZE MIGRATE MIXED + MODECLUS MODEL MSCHART MULTTEST MVPDIAGNOSE MVPMODEL MVPMONITOR + NESTED NETDRAW NETFLOW NLIN NLMIXED NLP NPAR1WAY ODSLIST ODSTABLE + ODSTEXT OLAP OLAPCONTENTS OLAPOPERATE OPERATE OPTEX OPTGRAPH OPTIONS + OPTLOAD OPTLP OPTLSO OPTMILP OPTMODEL OPTNET OPTQP OPTSAVE ORTHOREG + PANEL PARETO PDLREG PDS PDSCOPY PHREG PLAN PLM PLOT PLS PM PMENU + POWER PRESENV PRINCOMP PRINQUAL PRINT PRINTTO PROBIT PROTO PRTDEF + PRTEXP PSMOOTH PWENCODE QDEVICE QLIM QUANTLIFE QUANTREG QUANTSELECT + QUEST RANK RAREEVENTS RDC RDPOOL RDSEC RECOMMEND REG REGISTRY RELEASE + RELIABILITY REPORT RISK ROBUSTREG RSREG SCAPROC SCORE SEQDESIGN + SEQTEST SERVER SEVERITY SGDESIGN SGPANEL SGPLOT SGRENDER SGSCATTER + SHEWHART SIM2D SIMILARITY SIMLIN SIMNORMAL SOAP SORT SOURCE SPECTRA + SPP SQL SQOOP SSM STANDARD STATESPACE STDIZE STDRATE STEPDISC STP + STREAM SUMMARY SURVEYFREQ SURVEYIMPUTE SURVEYLOGISTIC SURVEYMEANS + SURVEYPHREG SURVEYREG SURVEYSELECT SYSLIN TABULATE TAPECOPY TAPELABEL + TEMPLATE TIMEDATA TIMEID TIMEPLOT TIMESERIES TPSPLINE TRANSPOSE + TRANSREG TRANTAB TREE TSCSREG TTEST UCM UNIVARIATE UPLOAD VARCLUS + VARCOMP VARIOGRAM VARMAX VASMP X11 X12 X13 XSL + ) + end + + state :basics do + # Rules to be parsed before the keywords (which are different depending + # on the context) + + rule %r/\s+/m, Text + + # Single-line comments (between * and ;) - these can actually go onto multiple lines + # case 1 - where it starts a line + rule %r/^\s*%?\*[^;]*;/m, Comment::Single + # case 2 - where it follows the previous statement on the line (after a semicolon) + rule %r/(;)(\s*)(%?\*[^;]*;)/m do + groups Punctuation, Text, Comment::Single + end + + # True multiline comments! + rule %r(/[*].*?[*]/)m, Comment::Multiline + + # date/time constants (Language Reference pp91-2) + rule %r/'[0-9a-z]+?'d/i, Literal::Date + rule %r/'.+?'dt/i, Literal::Date + rule %r/'[0-9:]+?([a|p]m)?'t/i, Literal::Date + + rule %r/'/, Str::Single, :single_string + rule %r/"/, Str::Double, :double_string + rule %r/&[a-z0-9_&.]+/i, Name::Variable + + # numeric constants (Language Reference p91) + rule %r/\d[0-9a-f]*x/i, Num::Hex + rule %r/\d[0-9e\-.]+/i, Num # scientific notation + + # auto variables from DATA step (Language Reference p46, p37) + rule %r/\b(_n_|_error_|_file_|_infile_|_msg_|_iorc_|_cmd_)\b/i, Name::Builtin::Pseudo + + # auto variable list names + rule %r/\b(_character_|_numeric_|_all_)\b/i, Name::Builtin + + # datalines/cards etc + rule %r/\b(datalines|cards)(\s*)(;)/i do + groups Keyword, Text, Punctuation + push :datalines + end + rule %r/\b(datalines4|cards4)(\s*)(;)/i do + groups Keyword, Text, Punctuation + push :datalines4 + end + + + # operators (Language Reference p96) + rule %r(\*\*|[\*/\+-]), Operator + rule %r/[^¬~]?=:?|[<>]=?:?/, Operator + rule %r/\b(eq|ne|gt|lt|ge|le|in)\b/i, Operator::Word + rule %r/[&|!¦¬∘~]/, Operator + rule %r/\b(and|or|not)\b/i, Operator::Word + rule %r/(<>|><)/, Operator # min/max + rule %r/\|\|/, Operator # concatenation + + # The OF operator should also be highlighted (Language Reference p49) + rule %r/\b(of)\b/i, Operator::Word + rule %r/\b(like)\b/i, Operator::Word # Language Ref p181 + + rule %r/\d+/, Num::Integer + + rule %r/\$/, Keyword::Type + + # Macro definitions + rule %r/(%macro|%mend)(\s*)(\w+)/i do + groups Keyword, Text, Name::Function + end + rule %r/%mend/, Keyword + + rule %r/%\w+/ do |m| + if self.class.sas_macro_statements.include? m[0].upcase + token Keyword + elsif self.class.sas_macro_functions.include? m[0].upcase + token Keyword + else + token Name + end + end + end + + state :basics2 do + # Rules to be parsed after the keywords (which are different depending + # on the context) + + # Missing values (Language Reference p81) + rule %r/\s\.[;\s]/, Keyword::Constant # missing + rule %r/\s\.[a-z_]/, Name::Constant # user-defined missing + + rule %r/[\(\),;:\{\}\[\]\\\.]/, Punctuation + + rule %r/@/, Str::Symbol # line hold specifiers + rule %r/\?/, Str::Symbol # used for format modifiers + + rule %r/[^\s]+/, Text # Fallback for anything we haven't matched so far + end + + state :root do + mixin :basics + + # PROC definitions + rule %r!(proc)(\s+)(\w+)!ix do |m| + @proc_name = m[3].upcase + puts " proc name: #{@proc_name}" if @debug + if self.class.sas_proc_names.include? @proc_name + groups Keyword, Text, Keyword + else + groups Keyword, Text, Name + end + + push :proc + end + + # Data step definitions + rule %r/(data)(\s+)([\w\.]+)/i do + groups Keyword, Text, Name::Variable + end + # Libname definitions + rule %r/(libname)(\s+)(\w+)/i do + groups Keyword, Text, Name::Variable + end + + rule %r/\w+/ do |m| + if self.class.data_step_statements.include? m[0].upcase + token Keyword + elsif self.class.sas_functions.include? m[0].upcase + token Keyword + else + token Name + end + end + + mixin :basics2 + end + + + state :single_string do + rule %r/''/, Str::Escape + rule %r/'/, Str::Single, :pop! + rule %r/[^']+/, Str::Single + end + + state :double_string do + rule %r/&[a-z0-9_&]+\.?/i, Str::Interpol + rule %r/""/, Str::Escape + rule %r/"/, Str::Double, :pop! + + rule %r/[^&"]+/, Str::Double + # Allow & to be used as character if not already matched as macro variable + rule %r/&/, Str::Double + end + + state :datalines do + rule %r/[^;]/, Literal::String::Heredoc + rule %r/;/, Punctuation, :pop! + end + + state :datalines4 do + rule %r/;{4}/, Punctuation, :pop! + rule %r/[^;]/, Literal::String::Heredoc + rule %r/;{,3}/, Literal::String::Heredoc + end + + + # PROCS + state :proc do + rule %r/(quit|run)/i, Keyword, :pop! + + mixin :basics + rule %r/\w+/ do |m| + if self.class.data_step_statements.include? m[0].upcase + token Keyword + elsif self.class.sas_functions.include? m[0].upcase + token Keyword + elsif self.class.proc_keywords.has_key?(@proc_name) and self.class.proc_keywords[@proc_name].include? m[0].upcase + token Keyword + else + token Name + end + end + + mixin :basics2 + end + + end #class SAS + end #module Lexers +end #module Rouge diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sass.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sass.rb new file mode 100644 index 000000000000..7758beb1bee0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sass.rb @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'sass/common.rb' + + class Sass < SassCommon + include Indentation + + title "Sass" + desc 'The Sass stylesheet language language (sass-lang.com)' + + tag 'sass' + filenames '*.sass' + mimetypes 'text/x-sass' + + id = /[\w-]+/ + + state :root do + rule %r/[ \t]*\n/, Text + rule(/[ \t]*/) { |m| token Text; indentation(m[0]) } + end + + state :content do + # block comments + rule %r(//.*?$) do + token Comment::Single + pop!; starts_block :single_comment + end + + rule %r(/[*].*?\n) do + token Comment::Multiline + pop!; starts_block :multi_comment + end + + rule %r/@import\b/, Keyword, :import + + mixin :content_common + + rule %r(=#{id}), Name::Function, :value + rule %r([+]#{id}), Name::Decorator, :value + + rule %r/:/, Name::Attribute, :old_style_attr + + rule(/(?=[^\[\n]+?:([^a-z]|$))/) { push :attribute } + + rule(//) { push :selector } + end + + state :single_comment do + rule %r/.*?$/, Comment::Single, :pop! + end + + state :multi_comment do + rule %r/.*?\n/, Comment::Multiline, :pop! + end + + state :import do + rule %r/[ \t]+/, Text + rule %r/\S+/, Str + rule %r/\n/, Text, :pop! + end + + state :old_style_attr do + mixin :attr_common + rule(//) { pop!; push :value } + end + + state :end_section do + rule(/\n/) { token Text; reset_stack } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sass/common.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sass/common.rb new file mode 100644 index 000000000000..ed92c5c9a6ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sass/common.rb @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + # shared states with SCSS + class SassCommon < RegexLexer + id = /[\w-]+/ + + state :content_common do + rule %r/@for\b/, Keyword, :for + rule %r/@(debug|warn|if|each|while|else|return|media)/, Keyword, :value + + rule %r/(@mixin)(\s+)(#{id})/ do + groups Keyword, Text, Name::Function + push :value + end + + rule %r/(@function)(\s+)(#{id})/ do + groups Keyword, Text, Name::Function + push :value + end + + rule %r/@extend\b/, Keyword, :selector + + rule %r/(@include)(\s+)(#{id})/ do + groups Keyword, Text, Name::Decorator + push :value + end + + rule %r/@#{id}/, Keyword, :selector + rule %r/&/, Keyword, :selector + + # $variable: assignment + rule %r/([$]#{id})([ \t]*)(:)/ do + groups Name::Variable, Text, Punctuation + push :value + end + end + + state :value do + mixin :end_section + rule %r/[ \t]+/, Text + rule %r/[$]#{id}/, Name::Variable + rule %r/url[(]/, Str::Other, :string_url + rule %r/#{id}(?=\s*[(])/, Name::Function + rule %r/%#{id}/, Name::Decorator + + # named literals + rule %r/(true|false)\b/, Name::Builtin::Pseudo + rule %r/(and|or|not)\b/, Operator::Word + + # colors and numbers + rule %r/#[a-z0-9]{1,6}/i, Num::Hex + rule %r/-?\d+(%|[a-z]+)?/, Num + rule %r/-?\d*\.\d+(%|[a-z]+)?/, Num::Integer + + mixin :has_strings + mixin :has_interp + + rule %r/[~^*!&%<>\|+=@:,.\/?-]+/, Operator + rule %r/[\[\]()]+/, Punctuation + rule %r(/[*]), Comment::Multiline, :inline_comment + rule %r(//[^\n]*), Comment::Single + + # identifiers + rule(id) do |m| + if CSS.builtins.include? m[0] + token Name::Builtin + elsif CSS.constants.include? m[0] + token Name::Constant + else + token Name + end + end + end + + state :has_interp do + rule %r/[#][{]/, Str::Interpol, :interpolation + end + + state :has_strings do + rule %r/"/, Str::Double, :dq + rule %r/'/, Str::Single, :sq + end + + state :interpolation do + rule %r/}/, Str::Interpol, :pop! + mixin :value + end + + state :selector do + mixin :end_section + + mixin :has_strings + mixin :has_interp + rule %r/[ \t]+/, Text + rule %r/:/, Name::Decorator, :pseudo_class + rule %r/[.]/, Name::Class, :class + rule %r/#/, Name::Namespace, :id + rule %r/%/, Name::Variable, :placeholder + rule id, Name::Tag + rule %r/&/, Keyword + rule %r/[~^*!&\[\]()<>\|+=@:;,.\/?-]/, Operator + end + + state :dq do + rule %r/"/, Str::Double, :pop! + mixin :has_interp + rule %r/(\\.|#(?![{])|[^\n"#])+/, Str::Double + end + + state :sq do + rule %r/'/, Str::Single, :pop! + mixin :has_interp + rule %r/(\\.|#(?![{])|[^\n'#])+/, Str::Single + end + + state :string_url do + rule %r/[)]/, Str::Other, :pop! + rule %r/(\\.|#(?![{])|[^\n)#])+/, Str::Other + mixin :has_interp + end + + state :selector_piece do + mixin :has_interp + rule(//) { pop! } + end + + state :pseudo_class do + rule id, Name::Decorator + mixin :selector_piece + end + + state :class do + rule id, Name::Class + mixin :selector_piece + end + + state :id do + rule id, Name::Namespace + mixin :selector_piece + end + + state :placeholder do + rule id, Name::Variable + mixin :selector_piece + end + + state :for do + rule %r/(from|to|through)/, Operator::Word + mixin :value + end + + state :attr_common do + mixin :has_interp + rule id do |m| + if CSS.attributes.include? m[0] + token Name::Label + else + token Name::Attribute + end + end + end + + state :attribute do + mixin :attr_common + + rule %r/([ \t]*)(:)/ do + groups Text, Punctuation + push :value + end + end + + state :inline_comment do + rule %r/(\\#|#(?=[^\n{])|\*(?=[^\n\/])|[^\n#*])+/, Comment::Multiline + mixin :has_interp + rule %r([*]/), Comment::Multiline, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/scala.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/scala.rb new file mode 100644 index 000000000000..d13dbcbd94cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/scala.rb @@ -0,0 +1,169 @@ +# -*- coding: utf-8 # +# frozen_string_literal: true + +module Rouge + module Lexers + class Scala < RegexLexer + title "Scala" + desc "The Scala programming language (scala-lang.org)" + tag 'scala' + aliases 'scala' + filenames '*.scala', '*.sbt' + + mimetypes 'text/x-scala', 'application/x-scala' + + # As documented in the ENBF section of the scala specification + # http://www.scala-lang.org/docu/files/ScalaReference.pdf + whitespace = /\p{Space}/ + letter = /[\p{L}$_]/ + upper = /[\p{Lu}$_]/ + digits = /[0-9]/ + parens = /[(){}\[\]]/ + delims = %r([‘’".;,]) + + # negative lookahead to filter out other classes + op = %r( + (?!#{whitespace}|#{letter}|#{digits}|#{parens}|#{delims}) + [\u0020-\u007F\p{Sm}\p{So}] + )x + + idrest = %r(#{letter}(?:#{letter}|#{digits})*(?:(?<=_)#{op}+)?)x + + keywords = %w( + abstract case catch def do else extends final finally for forSome + if implicit lazy match new override private protected requires return + sealed super this throw try val var while with yield + ) + + state :root do + rule %r/(class|trait|object)(\s+)/ do + groups Keyword, Text + push :class + end + rule %r/'#{idrest}(?!')/, Str::Symbol + rule %r/[^\S\n]+/, Text + + rule %r(//.*), Comment::Single + rule %r(/\*), Comment::Multiline, :comment + + rule %r/@#{idrest}/, Name::Decorator + + rule %r/(def)(\s+)(#{idrest}|#{op}+|`[^`]+`)(\s*)/ do + groups Keyword, Text, Name::Function, Text + end + + rule %r/(val)(\s+)(#{idrest}|#{op}+|`[^`]+`)(\s*)/ do + groups Keyword, Text, Name::Variable, Text + end + + rule %r/(this)(\n*)(\.)(#{idrest})/ do + groups Keyword, Text, Operator, Name::Property + end + + rule %r/(#{idrest}|_)(\n*)(\.)(#{idrest})/ do + groups Name::Variable, Text, Operator, Name::Property + end + + rule %r/#{upper}#{idrest}\b/, Name::Class + + rule %r/(#{idrest})(#{whitespace}*)(\()/ do + groups Name::Function, Text, Operator + end + + rule %r/(\.)(#{idrest})/ do + groups Operator, Name::Property + end + + rule %r( + (#{keywords.join("|")})\b| + (<[%:-]|=>|>:|[#=@_\u21D2\u2190])(\b|(?=\s)|$) + )x, Keyword + rule %r/:(?!#{op})/, Keyword, :type + rule %r/(true|false|null)\b/, Keyword::Constant + rule %r/(import|package)(\s+)/ do + groups Keyword, Text + push :import + end + + rule %r/(type)(\s+)/ do + groups Keyword, Text + push :type + end + + rule %r/""".*?"""(?!")/m, Str + rule %r/"(\\\\|\\"|[^"])*"/, Str + rule %r/'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'/, Str::Char + + rule idrest, Name + rule %r/`[^`]+`/, Name + + rule %r/\[/, Operator, :typeparam + rule %r/[\(\)\{\};,.#]/, Operator + rule %r/#{op}+/, Operator + + rule %r/([0-9][0-9]*\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?[fFdD]?/, Num::Float + rule %r/([0-9][0-9]*[fFdD])/, Num::Float + rule %r/0x[0-9a-fA-F]+/, Num::Hex + rule %r/[0-9]+L?/, Num::Integer + rule %r/\n/, Text + end + + state :class do + rule %r/(#{idrest}|#{op}+|`[^`]+`)(\s*)(\[)/ do + groups Name::Class, Text, Operator + push :typeparam + end + + rule %r/\s+/, Text + rule %r/{/, Operator, :pop! + rule %r/\(/, Operator, :pop! + rule %r(//.*), Comment::Single, :pop! + rule %r(#{idrest}|#{op}+|`[^`]+`), Name::Class, :pop! + end + + state :type do + rule %r/\s+/, Text + rule %r/<[%:]|>:|[#_\u21D2]|forSome|type/, Keyword + rule %r/([,\);}]|=>|=)(\s*)/ do + groups Operator, Text + pop! + end + rule %r/[\(\{]/, Operator, :type + + typechunk = /(?:#{idrest}|#{op}+\`[^`]+`)/ + rule %r/(#{typechunk}(?:\.#{typechunk})*)(\s*)(\[)/ do + groups Keyword::Type, Text, Operator + pop! + push :typeparam + end + + rule %r/(#{typechunk}(?:\.#{typechunk})*)(\s*)$/ do + groups Keyword::Type, Text + pop! + end + + rule %r(//.*), Comment::Single, :pop! + rule %r/\.|#{idrest}|#{op}+|`[^`]+`/, Keyword::Type + end + + state :typeparam do + rule %r/[\s,]+/, Text + rule %r/<[%:]|=>|>:|[#_\u21D2]|forSome|type/, Keyword + rule %r/([\]\)\}])/, Operator, :pop! + rule %r/[\(\[\{]/, Operator, :typeparam + rule %r/\.|#{idrest}|#{op}+|`[^`]+`/, Keyword::Type + end + + state :comment do + rule %r([^/\*]+), Comment::Multiline + rule %r(/\*), Comment::Multiline, :comment + rule %r(\*/), Comment::Multiline, :pop! + rule %r([*/]), Comment::Multiline + end + + state :import do + rule %r((#{idrest}|\.)+), Name::Namespace, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/scheme.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/scheme.rb new file mode 100644 index 000000000000..96965d9765b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/scheme.rb @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Scheme < RegexLexer + title "Scheme" + desc "The Scheme variant of Lisp" + + tag 'scheme' + filenames '*.scm', '*.ss' + mimetypes 'text/x-scheme', 'application/x-scheme' + + def self.keywords + @keywords ||= Set.new %w( + lambda define if else cond and or case let let* letrec begin + do delay set! => quote quasiquote unquote unquote-splicing + define-syntax let-syntax letrec-syntax syntax-rules + ) + end + + def self.builtins + @builtins ||= Set.new %w( + * + - / < <= = > >= abs acos angle append apply asin + assoc assq assv atan boolean? caaaar caaadr caaar caadar + caaddr caadr caar cadaar cadadr cadar caddar cadddr caddr + cadr call-with-current-continuation call-with-input-file + call-with-output-file call-with-values call/cc car cdaaar cdaadr + cdaar cdadar cdaddr cdadr cdar cddaar cddadr cddar cdddar cddddr + cdddr cddr cdr ceiling char->integer char-alphabetic? char-ci<=? + char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase + char-lower-case? char-numeric? char-ready? char-upcase + char-upper-case? char-whitespace? char<=? char<? char=? char>=? + char>? char? close-input-port close-output-port complex? cons + cos current-input-port current-output-port denominator + display dynamic-wind eof-object? eq? equal? eqv? eval + even? exact->inexact exact? exp expt floor for-each force gcd + imag-part inexact->exact inexact? input-port? integer->char + integer? interaction-environment lcm length list list->string + list->vector list-ref list-tail list? load log magnitude + make-polar make-rectangular make-string make-vector map + max member memq memv min modulo negative? newline not + null-environment null? number->string number? numerator odd? + open-input-file open-output-file output-port? pair? peek-char + port? positive? procedure? quotient rational? rationalize + read read-char real-part real? remainder reverse round + scheme-report-environment set-car! set-cdr! sin sqrt string + string->list string->number string->symbol string-append + string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? + string-copy string-fill! string-length string-ref + string-set! string<=? string<? string=? string>=? + string>? string? substring symbol->string symbol? + tan transcript-off transcript-on truncate values vector + vector->list vector-fill! vector-length vector-ref + vector-set! vector? with-input-from-file with-output-to-file + write write-char zero? + ) + end + + id = /[a-z0-9!$\%&*+,\/:<=>?@^_~|-]+/i + + state :root do + # comments + rule %r/;.*$/, Comment::Single + rule %r/\s+/m, Text + rule %r/-?\d+\.\d+/, Num::Float + rule %r/-?\d+/, Num::Integer + + # Racket infinitites + rule %r/[+-]inf[.][f0]/, Num + + rule %r/#b[01]+/, Num::Bin + rule %r/#o[0-7]+/, Num::Oct + rule %r/#d[0-9]+/, Num::Integer + rule %r/#x[0-9a-f]+/i, Num::Hex + rule %r/#[ei][\d.]+/, Num::Other + + rule %r/"(\\\\|\\"|[^"])*"/, Str + rule %r/'#{id}/i, Str::Symbol + rule %r/#\\([()\/'"._!\$%& ?=+-]{1}|[a-z0-9]+)/i, + Str::Char + rule %r/#t|#f/, Name::Constant + rule %r/(?:'|#|`|,@|,|\.)/, Operator + + rule %r/(['#])(\s*)(\()/m do + groups Str::Symbol, Text, Punctuation + end + + rule %r/\(|\[/, Punctuation, :command + rule %r/\)|\]/, Punctuation + + rule id, Name::Variable + end + + state :command do + rule id, Name::Function do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Function + end + + pop! + end + + rule(//) { pop! } + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/scss.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/scss.rb new file mode 100644 index 000000000000..7cf178ca939d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/scss.rb @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'sass/common.rb' + + class Scss < SassCommon + title "SCSS" + desc "SCSS stylesheets (sass-lang.com)" + tag 'scss' + filenames '*.scss' + mimetypes 'text/x-scss' + + state :root do + rule %r/\s+/, Text + rule %r(//.*?$), Comment::Single + rule %r(/[*].*?[*]/)m, Comment::Multiline + rule %r/@import\b/, Keyword, :value + + mixin :content_common + + rule(/(?=[^;{}][;}])/) { push :attribute } + rule(/(?=[^;{}:\[]+:[^a-z])/) { push :attribute } + + rule(//) { push :selector } + end + + state :end_section do + rule %r/\n/, Text + rule(/[;{}]/) { token Punctuation; reset_stack } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sed.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sed.rb new file mode 100644 index 000000000000..b3efe50df534 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sed.rb @@ -0,0 +1,173 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Sed < RegexLexer + title "sed" + desc 'sed, the ultimate stream editor' + + tag 'sed' + filenames '*.sed' + mimetypes 'text/x-sed' + + def self.detect?(text) + return true if text.shebang? 'sed' + end + + class Regex < RegexLexer + state :root do + rule %r/\\./, Str::Escape + rule %r/\[/, Punctuation, :brackets + rule %r/[$^.*]/, Operator + rule %r/[()]/, Punctuation + rule %r/./, Str::Regex + end + + state :brackets do + rule %r/\^/ do + token Punctuation + goto :brackets_int + end + + rule(//) { goto :brackets_int } + end + + state :brackets_int do + # ranges + rule %r/.-./, Name::Variable + rule %r/\]/, Punctuation, :pop! + rule %r/./, Str::Regex + end + end + + class Replacement < RegexLexer + state :root do + rule %r/\\./m, Str::Escape + rule %r/&/, Operator + rule %r/[^\\&]+/m, Text + end + end + + def regex + @regex ||= Regex.new(options) + end + + def replacement + @replacement ||= Replacement.new(options) + end + + start { regex.reset!; replacement.reset! } + + state :whitespace do + rule %r/\s+/m, Text + rule(/#.*?\n/) { token Comment; reset_stack } + rule(/\n/) { token Text; reset_stack } + rule(/;/) { token Punctuation; reset_stack } + end + + state :root do + mixin :addr_range + end + + edot = /\\.|./m + + state :command do + mixin :whitespace + + # subst and transliteration + rule %r/(s)(.)(#{edot}*?)(\2)(#{edot}*?)(\2)/m do |m| + token Keyword, m[1] + token Punctuation, m[2] + delegate regex, m[3] + token Punctuation, m[4] + delegate replacement, m[5] + token Punctuation, m[6] + + + goto :flags + end + + rule %r/(y)(.)(#{edot}*?)(\2)(#{edot}*?)(\2)/m do |m| + token Keyword, m[1] + token Punctuation, m[2] + delegate replacement, m[3] + token Punctuation, m[4] + delegate replacement, m[5] + token Punctuation, m[6] + + pop! + end + + # commands that take a text segment as an argument + rule %r/([aic])(\s*)/ do + groups Keyword, Text; goto :text + end + + rule %r/[pd]/, Keyword + + # commands that take a number argument + rule %r/([qQl])(\s+)(\d+)/i do + groups Keyword, Text, Num + pop! + end + + # no-argument commands + rule %r/[={}dDgGhHlnpPqx]/, Keyword, :pop! + + # commands that take a filename argument + rule %r/([rRwW])(\s+)(\S+)/ do + groups Keyword, Text, Name + pop! + end + + # commands that take a label argument + rule %r/([:btT])(\s+)(\S+)/ do + groups Keyword, Text, Name::Label + pop! + end + end + + state :addr_range do + mixin :whitespace + + ### address ranges ### + addr_tok = Keyword::Namespace + rule %r/\d+/, addr_tok + rule %r/[$,~+!]/, addr_tok + + rule %r((/)((?:\\.|.)*?)(/)) do |m| + token addr_tok, m[1]; delegate regex, m[2]; token addr_tok, m[3] + end + + # alternate regex rage delimiters + rule %r((\\)(.)((?:\\.|.)*?)(\2)) do |m| + token addr_tok, m[1] + m[2] + delegate regex, m[3] + token addr_tok, m[4] + end + + rule(//) { push :command } + end + + state :text do + rule %r/[^\\\n]+/, Str + rule %r/\\\n/, Str::Escape + rule %r/\\/, Str + rule %r/\n/, Text, :pop! + end + + state :flags do + rule %r/[gp]+/, Keyword, :pop! + + # writing to a file with the subst command. + # who'da thunk...? + rule %r/([wW])(\s+)(\S+)/ do + token Keyword; token Text; token Name + end + + rule(//) { pop! } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/shell.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/shell.rb new file mode 100644 index 000000000000..8981698c50bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/shell.rb @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Shell < RegexLexer + title "shell" + desc "Various shell languages, including sh and bash" + + tag 'shell' + aliases 'bash', 'zsh', 'ksh', 'sh' + filenames '*.sh', '*.bash', '*.zsh', '*.ksh', '.bashrc', '.zshrc', + '.kshrc', '.profile', 'APKBUILD', 'PKGBUILD', '*.ebuild', + '*.eclass', '*.exheres-0', '*.exlib' + + mimetypes 'application/x-sh', 'application/x-shellscript', 'text/x-sh', + 'text/x-shellscript' + + def self.detect?(text) + return true if text.shebang?(/(ba|z|k)?sh/) + end + + KEYWORDS = %w( + if fi else while do done for then return function + select continue until esac elif in + ).join('|') + + BUILTINS = %w( + alias bg bind break builtin caller cd command compgen + complete declare dirs disown enable eval exec exit + export false fc fg getopts hash help history jobs let + local logout mapfile popd pushd pwd read readonly set + shift shopt source suspend test time times trap true type + typeset ulimit umask unalias unset wait + + cat tac nl od base32 base64 fmt pr fold head tail split csplit + wc sum cksum b2sum md5sum sha1sum sha224sum sha256sum sha384sum + sha512sum sort shuf uniq comm ptx tsort cut paste join tr expand + unexpand ls dir vdir dircolors cp dd install mv rm shred link ln + mkdir mkfifo mknod readlink rmdir unlink chown chgrp chmod touch + df du stat sync truncate echo printf yes expr tee basename dirname + pathchk mktemp realpath pwd stty printenv tty id logname whoami + groups users who date arch nproc uname hostname hostid uptime chcon + runcon chroot env nice nohup stdbuf timeout kill sleep factor numfmt + seq tar grep sudo awk sed gzip gunzip + ).join('|') + + state :basic do + rule %r/#.*$/, Comment + + rule %r/\b(#{KEYWORDS})\s*\b/, Keyword + rule %r/\bcase\b/, Keyword, :case + + rule %r/\b(#{BUILTINS})\s*\b(?!(\.|-))/, Name::Builtin + rule %r/[.](?=\s)/, Name::Builtin + + rule %r/(\b\w+)(=)/ do + groups Name::Variable, Operator + end + + rule %r/[\[\]{}()!=>]/, Operator + rule %r/&&|\|\|/, Operator + + # here-string + rule %r/<<</, Operator + + rule %r/(<<-?)(\s*)(['"]?)(\\?)(\w+)(\3)/ do |m| + groups Operator, Text, Str::Heredoc, Str::Heredoc, Name::Constant, Str::Heredoc + @heredocstr = Regexp.escape(m[5]) + push :heredoc + end + end + + state :heredoc do + rule %r/\n/, Str::Heredoc, :heredoc_nl + rule %r/[^$\n\\]+/, Str::Heredoc + mixin :interp + rule %r/[$]/, Str::Heredoc + end + + state :heredoc_nl do + rule %r/\s*(\w+)\s*\n/ do |m| + if m[1] == @heredocstr + token Name::Constant + pop! 2 + else + token Str::Heredoc + end + end + + rule(//) { pop! } + end + + + state :double_quotes do + # NB: "abc$" is literally the string abc$. + # Here we prevent :interp from interpreting $" as a variable. + rule %r/(?:\$#?)?"/, Str::Double, :pop! + mixin :interp + rule %r/[^"`\\$]+/, Str::Double + end + + state :ansi_string do + rule %r/\\./, Str::Escape + rule %r/[^\\']+/, Str::Single + mixin :single_quotes + end + + state :single_quotes do + rule %r/'/, Str::Single, :pop! + rule %r/[^']+/, Str::Single + end + + state :data do + rule %r/\s+/, Text + rule %r/\\./, Str::Escape + rule %r/\$?"/, Str::Double, :double_quotes + rule %r/\$'/, Str::Single, :ansi_string + + # single quotes are much easier than double quotes - we can + # literally just scan until the next single quote. + # POSIX: Enclosing characters in single-quotes ( '' ) + # shall preserve the literal value of each character within the + # single-quotes. A single-quote cannot occur within single-quotes. + rule %r/'/, Str::Single, :single_quotes + + rule %r/\*/, Keyword + + rule %r/;/, Punctuation + + rule %r/--?[\w-]+/, Name::Tag + rule %r/[^=\*\s{}()$"'`;\\<]+/, Text + rule %r/\d+(?= |\Z)/, Num + rule %r/</, Text + mixin :interp + end + + state :curly do + rule %r/}/, Keyword, :pop! + rule %r/:-/, Keyword + rule %r/[a-zA-Z0-9_]+/, Name::Variable + rule %r/[^}:"`'$]+/, Punctuation + mixin :root + end + + # the state inside $(...) + state :paren_interp do + rule %r/\)/, Str::Interpol, :pop! + rule %r/\(/, Operator, :paren_inner + mixin :root + end + + # used to balance parentheses inside interpolation + state :paren_inner do + rule %r/\(/, Operator, :push + rule %r/\)/, Operator, :pop! + mixin :root + end + + state :math do + rule %r/\)\)/, Keyword, :pop! + rule %r([-+*/%^|&!]|\*\*|\|\|), Operator + rule %r/\d+(#\w+)?/, Num + mixin :root + end + + state :case do + rule %r/\besac\b/, Keyword, :pop! + rule %r/\|/, Punctuation + rule %r/\)/, Punctuation, :case_stanza + mixin :root + end + + state :case_stanza do + rule %r/;;/, Punctuation, :pop! + mixin :root + end + + state :backticks do + rule %r/`/, Str::Backtick, :pop! + mixin :root + end + + state :interp do + rule %r/\\$/, Str::Escape # line continuation + rule %r/\\./, Str::Escape + rule %r/\$\(\(/, Keyword, :math + rule %r/\$\(/, Str::Interpol, :paren_interp + rule %r/\${#?/, Keyword, :curly + rule %r/`/, Str::Backtick, :backticks + rule %r/\$#?(\w+|.)/, Name::Variable + rule %r/\$[*@]/, Name::Variable + end + + state :root do + mixin :basic + mixin :data + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sieve.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sieve.rb new file mode 100644 index 000000000000..08d60327e5ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sieve.rb @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Sieve < RegexLexer + title "Sieve" + desc "mail filtering language" + + tag 'sieve' + filenames '*.sieve' + + id = /:?[a-zA-Z_][a-zA-Z0-9_]*/ + + # control commands (rfc5228 § 3) + def self.controls + @controls ||= %w(if elsif else require stop) + end + + def self.actions + @actions ||= Set.new( + # action commands (rfc5228 § 2.9) + %w(keep fileinto redirect discard) + + # Editheader Extension (rfc5293) + %w(addheader deleteheader) + + # Reject and Extended Reject Extensions (rfc5429) + %w(reject ereject) + + # Extension for Notifications (rfc5435) + %w(notify) + + # Imap4flags Extension (rfc5232) + %w(setflag addflag removeflag) + + # Vacation Extension (rfc5230) + %w(vacation) + + # MIME Part Tests, Iteration, Extraction, Replacement, and Enclosure (rfc5703) + %w(replace enclose extracttext) + ) + end + + def self.tests + @tests ||= Set.new( + # test commands (rfc5228 § 5) + %w(address allof anyof exists false header not size true) + + # Body Extension (rfc5173) + %w(body) + + # Imap4flags Extension (rfc5232) + %w(hasflag) + + # Spamtest and Virustest Extensions (rfc5235) + %w(spamtest virustest) + + # Date and Index Extensions (rfc5260) + %w(date currentdate) + + # Extension for Notifications (rfc5435) + %w(valid_notify_method notify_method_capability) + + # Extensions for Checking Mailbox Status and Accessing Mailbox + # Metadata (rfc5490) + %w(mailboxexists metadata metadataexists servermetadata servermetadataexists) + ) + end + + state :comments_and_whitespace do + rule %r/\s+/, Text + rule %r(#.*), Comment::Single + rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline + end + + state :string do + rule %r/\\./, Str::Escape + rule %r/"/, Str::Double, :pop! + # Variables Extension (rfc5229) + rule %r/\${(?:[0-9][.0-9]*|[a-zA-Z_][.a-zA-Z0-9_]*)}/, Str::Interpol + rule %r/./, Str::Double + end + + state :root do + mixin :comments_and_whitespace + + rule %r/[\[\](),;{}]/, Punctuation + + rule id do |m| + if self.class.controls.include? m[0] + token Keyword + elsif self.class.tests.include? m[0] + token Name::Variable + elsif self.class.actions.include? m[0] + token Name::Function + elsif m[0] =~ /^:/ # tags like :contains, :matches etc. + token Operator + else + token Name::Other + end + end + + rule %r/"/, Str::Double, :string + rule %r/[0-9]+[KMG]/, Num::Integer + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/slice.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/slice.rb new file mode 100644 index 000000000000..f2739cbd953f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/slice.rb @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'c.rb' + + class Slice < C + tag 'slice' + filenames '*.ice' + mimetypes 'text/slice' + + title "Slice" + desc "Specification Language for Ice (doc.zeroc.com)" + + def self.keywords + @keywords ||= Set.new %w( + extends implements enum interface struct class module dictionary + const optional out throws exception local idempotent sequence + + Object LocalObject Value + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + bool string byte long float double int void short + ) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/slim.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/slim.rb new file mode 100644 index 000000000000..2df5be5fb043 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/slim.rb @@ -0,0 +1,229 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + # A lexer for the Slim tempalte language + # @see http://slim-lang.org + class Slim < RegexLexer + include Indentation + + title "Slim" + desc 'The Slim template language' + + tag 'slim' + + filenames '*.slim' + + # Ruby identifier characters + ruby_chars = /[\w\!\?\@\$]/ + + # Since you are allowed to wrap lines with a backslash, include \\\n in characters + dot = /(\\\n|.)/ + + def ruby + @ruby ||= Ruby.new(options) + end + + def html + @html ||= HTML.new(options) + end + + def filters + @filters ||= { + 'ruby' => ruby, + 'erb' => ERB.new(options), + 'javascript' => Javascript.new(options), + 'css' => CSS.new(options), + 'coffee' => Coffeescript.new(options), + 'markdown' => Markdown.new(options), + 'scss' => Scss.new(options), + 'sass' => Sass.new(options) + } + end + + start { ruby.reset!; html.reset! } + + state :root do + rule %r/\s*\n/, Text + rule(/\s*/) { |m| token Text; indentation(m[0]) } + end + + state :content do + mixin :css + + rule %r/\/#{dot}*/, Comment, :indented_block + + rule %r/(doctype)(\s+)(.*)/ do + groups Name::Namespace, Text::Whitespace, Text + pop! + end + + # filters, shamelessly ripped from HAML + rule %r/(\w*):\s*\n/ do |m| + token Name::Decorator + pop! + starts_block :filter_block + + filter_name = m[1].strip + + @filter_lexer = self.filters[filter_name] + @filter_lexer.reset! unless @filter_lexer.nil? + + puts " slim: filter #{filter_name.inspect} #{@filter_lexer.inspect}" if @debug + end + + # Text + rule %r([\|'](?=\s)) do + token Punctuation + pop! + starts_block :plain_block + goto :plain_block + end + + rule %r/-|==|=/, Punctuation, :ruby_line + + # Dynamic tags + rule %r/(\*)(#{ruby_chars}+\(.*?\))/ do |m| + token Punctuation, m[1] + delegate ruby, m[2] + push :tag + end + + rule %r/(\*)(#{ruby_chars}+)/ do |m| + token Punctuation, m[1] + delegate ruby, m[2] + push :tag + end + + #rule %r/<\w+(?=.*>)/, Keyword::Constant, :tag # Maybe do this, look ahead and stuff + rule %r((</?[\w\s\=\'\"]+?/?>)) do |m| # Dirty html + delegate html, m[1] + pop! + end + + # Ordinary slim tags + rule %r/\w+/, Name::Tag, :tag + + end + + state :tag do + mixin :css + mixin :indented_block + mixin :interpolation + + # Whitespace control + rule %r/[<>]/, Punctuation + + # Trim whitespace + rule %r/\s+?/, Text::Whitespace + + # Splats, these two might be mergable? + rule %r/(\*)(#{ruby_chars}+)/ do |m| + token Punctuation, m[1] + delegate ruby, m[2] + end + + rule %r/(\*)(\{#{dot}+?\})/ do |m| + token Punctuation, m[1] + delegate ruby, m[2] + end + + # Attributes + rule %r/([\w\-]+)(\s*)(\=)/ do |m| + token Name::Attribute, m[1] + token Text::Whitespace, m[2] + token Punctuation, m[3] + push :html_attr + end + + # Ruby value + rule %r/(\=)(#{dot}+)/ do |m| + token Punctuation, m[1] + #token Keyword::Constant, m[2] + delegate ruby, m[2] + end + + # HTML Entities + rule(/&\S*?;/, Name::Entity) + + rule %r/#{dot}+?/, Text + + rule %r/\s*\n/, Text::Whitespace, :pop! + end + + state :css do + rule(/\.[\w-]*/) { token Name::Class; goto :tag } + rule(/#[a-zA-Z][\w:-]*/) { token Name::Function; goto :tag } + end + + state :html_attr do + # Strings, double/single quoted + rule(/\s*(['"])#{dot}*?\1/, Literal::String, :pop!) + + # Ruby stuff + rule(/(#{ruby_chars}+\(.*?\))/) { |m| delegate ruby, m[1]; pop! } + rule(/(#{ruby_chars}+)/) { |m| delegate ruby, m[1]; pop! } + + rule %r/\s+/, Text::Whitespace + end + + state :ruby_line do + # Need at top + mixin :indented_block + + rule(/[,\\]\s*\n/) { delegate ruby } + rule %r/[ ]\|[ \t]*\n/, Str::Escape + rule(/.*?(?=([,\\]$| \|)?[ \t]*$)/) { delegate ruby } + end + + state :filter_block do + rule %r/([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do + if @filter_lexer + delegate @filter_lexer + else + token Name::Decorator + end + end + + mixin :interpolation + mixin :indented_block + end + + state :plain_block do + mixin :interpolation + + rule %r((</?[\w\s\=\'\"]+?/?>)) do |m| # Dirty html + delegate html, m[1] + end + + # HTML Entities + rule(/&\S*?;/, Name::Entity) + + #rule %r/([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do + rule %r/#{dot}+?/, Text + + mixin :indented_block + end + + state :interpolation do + rule %r/#[{]/, Str::Interpol, :ruby_interp + end + + state :ruby_interp do + rule %r/[}]/, Str::Interpol, :pop! + mixin :ruby_interp_inner + end + + state :ruby_interp_inner do + rule(/[{]/) { delegate ruby; push :ruby_interp_inner } + rule(/[}]/) { delegate ruby; pop! } + rule(/[^{}]+/) { delegate ruby } + end + + state :indented_block do + rule(/(?<!\\)\n/) { token Text; reset_stack } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/smalltalk.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/smalltalk.rb new file mode 100644 index 000000000000..8beed2c3a4c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/smalltalk.rb @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Smalltalk < RegexLexer + title "Smalltalk" + desc 'The Smalltalk programming language' + + tag 'smalltalk' + aliases 'st', 'squeak' + filenames '*.st' + mimetypes 'text/x-smalltalk' + + ops = %r([-+*/\\~<>=|&!?,@%]) + + state :root do + rule %r/(<)(\w+:)(.*?)(>)/ do + groups Punctuation, Keyword, Text, Punctuation + end + + # mixin :squeak_fileout + mixin :whitespaces + mixin :method_definition + rule %r/([|])([\w\s]*)([|])/ do + groups Punctuation, Name::Variable, Punctuation + end + mixin :objects + rule %r/\^|:=|_/, Operator + + rule %r/[)}\]]/, Punctuation, :after_object + rule %r/[({\[!]/, Punctuation + end + + state :method_definition do + rule %r/([a-z]\w*:)(\s*)(\w+)/i do + groups Name::Function, Text, Name::Variable + end + + rule %r/^(\s*)(\b[a-z]\w*\b)(\s*)$/i do + groups Text, Name::Function, Text + end + + rule %r(^(\s*)(#{ops}+)(\s*)(\w+)(\s*)$) do + groups Text, Name::Function, Text, Name::Variable, Text + end + end + + state :block_variables do + mixin :whitespaces + rule %r/(:)(\s*)(\w+)/ do + groups Operator, Text, Name::Variable + end + + rule %r/[|]/, Punctuation, :pop! + + rule(//) { pop! } + end + + state :literals do + rule %r/'(''|.)*?'/m, Str, :after_object + rule %r/[$]./, Str::Char, :after_object + rule %r/#[(]/, Str::Symbol, :parenth + rule %r/(\d+r)?-?\d+(\.\d+)?(e-?\d+)?/, + Num, :after_object + rule %r/#("[^"]*"|#{ops}+|[\w:]+)/, + Str::Symbol, :after_object + end + + state :parenth do + rule %r/[)]/ do + token Str::Symbol + goto :after_object + end + + mixin :inner_parenth + end + + state :inner_parenth do + rule %r/#[(]/, Str::Symbol, :inner_parenth + rule %r/[)]/, Str::Symbol, :pop! + mixin :whitespaces + mixin :literals + rule %r/(#{ops}|[\w:])+/, Str::Symbol + end + + state :whitespaces do + rule %r/! !$/, Keyword # squeak chunk delimiter + rule %r/\s+/m, Text + rule %r/".*?"/m, Comment + end + + state :objects do + rule %r/\[/, Punctuation, :block_variables + rule %r/(self|super|true|false|nil|thisContext)\b/, + Name::Builtin::Pseudo, :after_object + rule %r/[A-Z]\w*(?!:)\b/, Name::Class, :after_object + rule %r/[a-z]\w*(?!:)\b/, Name::Variable, :after_object + mixin :literals + end + + state :after_object do + mixin :whitespaces + rule %r/(ifTrue|ifFalse|whileTrue|whileFalse|timesRepeat):/, + Name::Builtin, :pop! + rule %r/new(?!:)\b/, Name::Builtin + rule %r/:=|_/, Operator, :pop! + rule %r/[a-z]+\w*:/i, Name::Function, :pop! + rule %r/[a-z]+\w*/i, Name::Function + rule %r/#{ops}+/, Name::Function, :pop! + rule %r/[.]/, Punctuation, :pop! + rule %r/;/, Punctuation + rule(//) { pop! } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/smarty.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/smarty.rb new file mode 100644 index 000000000000..9870e8b1f568 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/smarty.rb @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Smarty < TemplateLexer + title "Smarty" + desc 'Smarty Template Engine' + tag 'smarty' + aliases 'smarty' + filenames '*.tpl', '*.smarty' + mimetypes 'application/x-smarty', 'text/x-smarty' + + def self.builtins + @builtins ||= %w( + append assign block call capture config_load debug extends + for foreach foreachelse break continue function if elseif + else include include_php insert ldelim rdelim literal nocache + php section sectionelse setfilter strip while + counter cycle eval fetch html_checkboxes html_image html_options + html_radios html_select_date html_select_time html_table + mailto math textformat + capitalize cat count_characters count_paragraphs + count_sentences count_words date_format default escape + from_charset indent lower nl2br regex_replace replace spacify + string_format strip strip_tags to_charset truncate unescape + upper wordwrap + ) + end + + + state :root do + rule(/\{\s+/) { delegate parent } + + # block comments + rule %r/\{\*.*?\*\}/m, Comment + + rule %r/\{\/?(?![\s*])/ do + token Keyword + push :smarty + end + + + rule(/.+?(?={[\/a-zA-Z0-9$#*"'])/m) { delegate parent } + rule(/.+/m) { delegate parent } + end + + state :comment do + rule(/{\*/) { token Comment; push } + rule(/\*}/) { token Comment; pop! } + rule(/[^{}]+/m) { token Comment } + end + + state :smarty do + # allow nested tags + rule %r/\{\/?(?![\s*])/ do + token Keyword + push :smarty + end + + rule %r/}/, Keyword, :pop! + rule %r/\s+/m, Text + rule %r([~!%^&*()+=|\[\]:;,.<>/@?-]), Operator + rule %r/#[a-zA-Z_]\w*#/, Name::Variable + rule %r/\$[a-zA-Z_]\w*(\.\w+)*/, Name::Variable + rule %r/(true|false|null)\b/, Keyword::Constant + rule %r/[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?/, Num + rule %r/"(\\.|.)*?"/, Str::Double + rule %r/'(\\.|.)*?'/, Str::Single + + rule %r/([a-zA-Z_]\w*)/ do |m| + if self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Attribute + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sml.rb new file mode 100644 index 000000000000..08ed1bf200a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sml.rb @@ -0,0 +1,345 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class SML < RegexLexer + title "SML" + desc 'Standard ML' + tag 'sml' + aliases 'ml' + filenames '*.sml', '*.sig', '*.fun' + + mimetypes 'text/x-standardml', 'application/x-standardml' + + def self.keywords + @keywords ||= Set.new %w( + abstype and andalso as case datatype do else end exception + fn fun handle if in infix infixr let local nonfix of op open + orelse raise rec then type val with withtype while + eqtype functor include sharing sig signature struct structure + where + ) + end + + def self.symbolic_reserved + @symbolic_reserved ||= Set.new %w(: | = => -> # :>) + end + + id = /[\w']+/i + symbol = %r([!%&$#/:<=>?@\\~`^|*+-]+) + + state :whitespace do + rule %r/\s+/m, Text + rule %r/[(][*]/, Comment, :comment + end + + state :delimiters do + rule %r/[(\[{]/, Punctuation, :main + rule %r/[)\]}]/, Punctuation, :pop! + + rule %r/\b(let|if|local)\b(?!')/ do + token Keyword::Reserved + push; push + end + + rule %r/\b(struct|sig|while)\b(?!')/ do + token Keyword::Reserved + push + end + + rule %r/\b(do|else|end|in|then)\b(?!')/, Keyword::Reserved, :pop! + end + + def token_for_id_with_dot(id) + if self.class.keywords.include? id + Error + else + Name::Namespace + end + end + + def token_for_final_id(id) + if self.class.keywords.include? id or self.class.symbolic_reserved.include? id + Error + else + Name + end + end + + def token_for_id(id) + if self.class.keywords.include? id + Keyword::Reserved + elsif self.class.symbolic_reserved.include? id + Punctuation + else + Name + end + end + + state :core do + rule %r/[()\[\]{},;_]|[.][.][.]/, Punctuation + rule %r/#"/, Str::Char, :char + rule %r/"/, Str::Double, :string + rule %r/~?0x[0-9a-fA-F]+/, Num::Hex + rule %r/0wx[0-9a-fA-F]+/, Num::Hex + rule %r/0w\d+/, Num::Integer + rule %r/~?\d+([.]\d+)?[eE]~?\d+/, Num::Float + rule %r/~?\d+[.]\d+/, Num::Float + rule %r/~?\d+/, Num::Integer + + rule %r/#\s*[1-9][0-9]*/, Name::Label + rule %r/#\s*#{id}/, Name::Label + rule %r/#\s+#{symbol}/, Name::Label + + rule %r/\b(datatype|abstype)\b(?!')/, Keyword::Reserved, :dname + rule(/(?=\bexception\b(?!'))/) { push :ename } + rule %r/\b(functor|include|open|signature|structure)\b(?!')/, + Keyword::Reserved, :sname + rule %r/\b(type|eqtype)\b(?!')/, Keyword::Reserved, :tname + + rule %r/'#{id}/, Name::Decorator + rule %r/(#{id})([.])/ do |m| + groups(token_for_id_with_dot(m[1]), Punctuation) + push :dotted + end + + rule id do |m| + token token_for_id(m[0]) + end + + rule symbol do |m| + token token_for_id(m[0]) + end + end + + state :dotted do + rule %r/(#{id})([.])/ do |m| + groups(token_for_id_with_dot(m[1]), Punctuation) + end + + rule id do |m| + token token_for_id(m[0]) + pop! + end + + rule symbol do |m| + token token_for_id(m[0]) + pop! + end + end + + state :root do + rule %r/#!.*?\n/, Comment::Preproc + rule(//) { push :main } + end + + state :main do + mixin :whitespace + + rule %r/\b(val|and)\b(?!')/, Keyword::Reserved, :vname + rule %r/\b(fun)\b(?!')/ do + token Keyword::Reserved + goto :main_fun + push :fname + end + + mixin :delimiters + mixin :core + end + + state :main_fun do + mixin :whitespace + rule %r/\b(fun|and)\b(?!')/, Keyword::Reserved, :fname + rule %r/\bval\b(?!')/ do + token Keyword::Reserved + goto :main + push :vname + end + + rule %r/[|]/, Punctuation, :fname + rule %r/\b(case|handle)\b(?!')/ do + token Keyword::Reserved + goto :main + end + + mixin :delimiters + mixin :core + end + + state :has_escapes do + rule %r/\\[\\"abtnvfr]/, Str::Escape + rule %r/\\\^[\x40-\x5e]/, Str::Escape + rule %r/\\[0-9]{3}/, Str::Escape + rule %r/\\u\h{4}/, Str::Escape + rule %r/\\\s+\\/, Str::Interpol + end + + state :string do + rule %r/[^"\\]+/, Str::Double + rule %r/"/, Str::Double, :pop! + mixin :has_escapes + end + + state :char do + rule %r/[^"\\]+/, Str::Char + rule %r/"/, Str::Char, :pop! + mixin :has_escapes + end + + state :breakout do + rule %r/(?=\b(#{SML.keywords.to_a.join('|')})\b(?!'))/ do + pop! + end + end + + state :sname do + mixin :whitespace + mixin :breakout + rule id, Name::Namespace + rule(//) { pop! } + end + + state :has_annotations do + rule %r/'[\w']*/, Name::Decorator + rule %r/[(]/, Punctuation, :tyvarseq + end + + state :fname do + mixin :whitespace + mixin :has_annotations + + rule id, Name::Function, :pop! + rule symbol, Name::Function, :pop! + end + + state :vname do + mixin :whitespace + mixin :has_annotations + + rule %r/(#{id})(\s*)(=(?!#{symbol}))/m do + groups Name::Variable, Text, Punctuation + pop! + end + + rule %r/(#{symbol})(\s*)(=(?!#{symbol}))/m do + groups Name::Variable, Text, Punctuation + end + + rule id, Name::Variable, :pop! + rule symbol, Name::Variable, :pop! + + rule(//) { pop! } + end + + state :tname do + mixin :whitespace + mixin :breakout + mixin :has_annotations + + rule %r/'[\w']*/, Name::Decorator + rule %r/[(]/, Punctuation, :tyvarseq + + rule %r(=(?!#{symbol})) do + token Punctuation + goto :typbind + end + + rule id, Keyword::Type + rule symbol, Keyword::Type + end + + state :typbind do + mixin :whitespace + + rule %r/\b(and)\b(?!')/ do + token Keyword::Reserved + goto :tname + end + + mixin :breakout + mixin :core + end + + state :dname do + mixin :whitespace + mixin :breakout + mixin :has_annotations + + rule %r/(=)(\s*)(datatype)\b/ do + groups Punctuation, Text, Keyword::Reserved + pop! + end + + rule %r(=(?!#{symbol})) do + token Punctuation + goto :datbind + push :datcon + end + + rule id, Keyword::Type + rule symbol, Keyword::Type + end + + state :datbind do + mixin :whitespace + rule %r/\b(and)\b(?!')/ do + token Keyword::Reserved; goto :dname + end + rule %r/\b(withtype)\b(?!')/ do + token Keyword::Reserved; goto :tname + end + rule %r/\bof\b(?!')/, Keyword::Reserved + rule %r/([|])(\s*)(#{id})/ do + groups(Punctuation, Text, Name::Class) + end + + rule %r/([|])(\s+)(#{symbol})/ do + groups(Punctuation, Text, Name::Class) + end + + mixin :breakout + mixin :core + end + + state :ename do + mixin :whitespace + rule %r/(exception|and)(\s+)(#{id})/ do + groups Keyword::Reserved, Text, Name::Class + end + + rule %r/(exception|and)(\s*)(#{symbol})/ do + groups Keyword::Reserved, Text, Name::Class + end + + rule %r/\b(of)\b(?!')/, Keyword::Reserved + mixin :breakout + mixin :core + end + + state :datcon do + mixin :whitespace + rule id, Name::Class, :pop! + rule symbol, Name::Class, :pop! + end + + state :tyvarseq do + mixin :whitespace + rule %r/'[\w']*/, Name::Decorator + rule id, Name + rule %r/,/, Punctuation + rule %r/[)]/, Punctuation, :pop! + rule symbol, Name + end + + state :comment do + rule %r/[^(*)]+/, Comment::Multiline + rule %r/[(][*]/ do + token Comment::Multiline; push + end + rule %r/[*][)]/, Comment::Multiline, :pop! + rule %r/[(*)]/, Comment::Multiline + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/solidity.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/solidity.rb new file mode 100644 index 000000000000..cd6000665e4d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/solidity.rb @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- # + +module Rouge + module Lexers + class Solidity < RegexLexer + title "Solidity" + desc "Solidity, an Ethereum smart contract programming language" + tag 'solidity' + filenames '*.sol', '*.solidity' + mimetypes 'text/x-solidity' + + # optional comment or whitespace + ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+) + id = /[a-zA-Z$_][\w$_]*/ + + def self.detect?(text) + return true if text.start_with? 'pragma solidity' + end + + # TODO: seperate by "type" + def self.keywords + @keywords ||= Set.new %w( + abstract anonymous as assembly break catch calldata constant + constructor continue contract do delete else emit enum event + external fallback for function hex if indexed interface + internal import is library mapping memory modifier new + override payable public pure pragma private receive return + returns storage struct throw try type using var view virtual + while + ) + end + + def self.builtins + return @builtins if @builtins + + @builtins = Set.new %w( + now + false true + balance now selector super this + blockhash gasleft + assert require revert + selfdestruct suicide + call callcode delegatecall + send transfer + addmod ecrecover keccak256 mulmod sha256 sha3 ripemd160 + ) + + # TODO: use (currently shadowed by catch-all in :statements) + abi = %w(decode encode encodePacked encodeWithSelector encodeWithSignature) + @builtins.merge( abi.map { |i| "abi.#{i}" } ) + block = %w(coinbase difficulty gaslimit hash number timestamp) + @builtins.merge( block.map { |i| "block.#{i}" } ) + msg = %w(data gas sender sig value) + @builtins.merge( msg.map { |i| "msg.#{i}" } ) + tx = %w(gasprice origin) + @builtins.merge( tx.map { |i| "tx.#{i}" } ) + end + + def self.constants + @constants ||= Set.new %w( + wei finney szabo ether + seconds minutes hours days weeks years + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + address bool byte bytes int string uint + ) + end + + def self.reserved + @reserved ||= Set.new %w( + alias after apply auto case copyof default define final fixed + immutable implements in inline let macro match mutable null of + partial promise reference relocatable sealed sizeof static + supports switch typedef typeof ufixed unchecked + ) + end + + start { push :bol } + + state :expr_bol do + mixin :inline_whitespace + + rule(//) { pop! } + end + + # :expr_bol is the same as :bol but without labels, since + # labels can only appear at the beginning of a statement. + state :bol do + mixin :expr_bol + end + + # TODO: natspec in comments + state :inline_whitespace do + rule %r/[ \t\r]+/, Text + rule %r/\\\n/, Text # line continuation + rule %r(/\*), Comment::Multiline, :comment_multi + end + + state :whitespace do + rule %r/\n+/m, Text, :bol + rule %r(//(\\.|.)*?\n), Comment::Single, :bol + mixin :inline_whitespace + end + + state :expr_whitespace do + rule %r/\n+/m, Text, :expr_bol + mixin :whitespace + end + + state :statements do + mixin :whitespace + rule %r/(hex)?\"/, Str, :string_double + rule %r/(hex)?\'/, Str, :string_single + rule %r('(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char + rule %r/\d\d*\.\d+([eE]\d+)?/i, Num::Float + rule %r/0x[0-9a-f]+/i, Num::Hex + rule %r/\d+([eE]\d+)?/i, Num::Integer + rule %r(\*/), Error + rule %r([~!%^&*+=\|?:<>/-]), Operator + rule %r/[()\[\],.]/, Punctuation + rule %r/u?fixed\d+x\d+/, Keyword::Reserved + rule %r/bytes\d+/, Keyword::Type + rule %r/u?int\d+/, Keyword::Type + rule id do |m| + name = m[0] + + if self.class.keywords.include? name + token Keyword + elsif self.class.builtins.include? name + token Name::Builtin + elsif self.class.constants.include? name + token Keyword::Constant + elsif self.class.keywords_type.include? name + token Keyword::Type + elsif self.class.reserved.include? name + token Keyword::Reserved + else + token Name + end + end + end + + state :root do + mixin :expr_whitespace + rule(//) { push :statement } + # TODO: function declarations + end + + state :statement do + rule %r/;/, Punctuation, :pop! + mixin :expr_whitespace + mixin :statements + rule %r/[{}]/, Punctuation + end + + state :string_common do + rule %r/\\(u[a-fA-F0-9]{4}|x..|[^x])/, Str::Escape + rule %r/[^\\\"\'\n]+/, Str + rule %r/\\\n/, Str # line continuation + rule %r/\\/, Str # stray backslash + end + + state :string_double do + mixin :string_common + rule %r/\"/, Str, :pop! + rule %r/\'/, Str + end + + state :string_single do + mixin :string_common + rule %r/\'/, Str, :pop! + rule %r/\"/, Str + end + + state :comment_multi do + rule %r(\*/), Comment::Multiline, :pop! + rule %r([^*/]+), Comment::Multiline + rule %r([*/]), Comment::Multiline + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sparql.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sparql.rb new file mode 100644 index 000000000000..4a9c2a48310b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sparql.rb @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class SPARQL < RegexLexer + title "SPARQL" + desc "Semantic Query Language, for RDF data" + tag 'sparql' + filenames '*.rq' + mimetypes 'application/sparql-query' + + def self.builtins + @builtins = Set.new %w[ + ABS AVG BNODE BOUND CEIL COALESCE CONCAT CONTAINS COUNT DATATYPE DAY + ENCODE_FOR_URI FLOOR GROUP_CONCAT HOURS IF IRI isBLANK isIRI + isLITERAL isNUMERIC isURI LANG LANGMATCHES LCASE MAX MD5 MIN MINUTES + MONTH NOW RAND REGEX REPLACE ROUND SAMETERM SAMPLE SECONDS SEPARATOR + SHA1 SHA256 SHA384 SHA512 STR STRAFTER STRBEFORE STRDT STRENDS + STRLANG STRLEN STRSTARTS STRUUID SUBSTR SUM TIMEZONE TZ UCASE URI + UUID YEAR + ] + end + + def self.keywords + @keywords = Set.new %w[ + ADD ALL AS ASC ASK BASE BIND BINDINGS BY CLEAR CONSTRUCT COPY CREATE + DATA DEFAULT DELETE DESC DESCRIBE DISTINCT DROP EXISTS FILTER FROM + GRAPH GROUP BY HAVING IN INSERT LIMIT LOAD MINUS MOVE NAMED NOT + OFFSET OPTIONAL ORDER PREFIX SELECT REDUCED SERVICE SILENT TO UNDEF + UNION USING VALUES WHERE WITH + ] + end + + state :root do + rule %r(\s+)m, Text::Whitespace + rule %r(#.*), Comment::Single + + rule %r("""), Str::Double, :string_double_literal + rule %r("), Str::Double, :string_double + rule %r('''), Str::Single, :string_single_literal + rule %r('), Str::Single, :string_single + + rule %r([$?]\w+), Name::Variable + rule %r((\w*:)(\w+)?) do |m| + token Name::Namespace, m[1] + token Str::Symbol, m[2] + end + rule %r(<[^>]*>), Name::Namespace + rule %r(true|false)i, Keyword::Constant + rule %r/a\b/, Keyword + + rule %r([A-Z]\w+\b)i do |m| + if self.class.builtins.include? m[0].upcase + token Name::Builtin + elsif self.class.keywords.include? m[0].upcase + token Keyword + else + token Error + end + end + + rule %r([+\-]?(?:\d+\.\d*|\.\d+)(?:[e][+\-]?[0-9]+)?)i, Num::Float + rule %r([+\-]?\d+), Num::Integer + rule %r([\]\[(){}.,;=]), Punctuation + rule %r([/?*+=!<>]|&&|\|\||\^\^), Operator + end + + state :string_double_common do + mixin :string_escapes + rule %r(\\), Str::Double + rule %r([^"\\]+), Str::Double + end + + state :string_double do + rule %r(") do + token Str::Double + goto :string_end + end + mixin :string_double_common + end + + state :string_double_literal do + rule %r(""") do + token Str::Double + goto :string_end + end + rule %r("), Str::Double + mixin :string_double_common + end + + state :string_single_common do + mixin :string_escapes + rule %r(\\), Str::Single + rule %r([^'\\]+), Str::Single + end + + state :string_single do + rule %r(') do + token Str::Single + goto :string_end + end + mixin :string_single_common + end + + state :string_single_literal do + rule %r(''') do + token Str::Single + goto :string_end + end + rule %r('), Str::Single + mixin :string_single_common + end + + state :string_escapes do + rule %r(\\[tbnrf"'\\]), Str::Escape + rule %r(\\u\h{4}), Str::Escape + rule %r(\\U\h{8}), Str::Escape + end + + state :string_end do + rule %r((@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)) do + groups Operator, Name::Property + end + rule %r(\^\^), Operator + rule(//) { pop! } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sqf.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sqf.rb new file mode 100644 index 000000000000..331dafc29fbe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sqf.rb @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class SQF < RegexLexer + tag "sqf" + filenames "*.sqf" + + title "SQF" + desc "Status Quo Function, a Real Virtuality engine scripting language" + + def self.wordoperators + @wordoperators ||= Set.new %w( + and or not + ) + end + + def self.initializers + @initializers ||= Set.new %w( + private param params + ) + end + + def self.controlflow + @controlflow ||= Set.new %w( + if then else exitwith switch do case default while for from to step + foreach + ) + end + + def self.constants + @constants ||= Set.new %w( + true false player confignull controlnull displaynull grpnull + locationnull netobjnull objnull scriptnull tasknull teammembernull + ) + end + + def self.namespaces + @namespaces ||= Set.new %w( + currentnamespace missionnamespace parsingnamespace profilenamespace + uinamespace + ) + end + + def self.diag_commands + @diag_commands ||= Set.new %w( + diag_activemissionfsms diag_activesqfscripts diag_activesqsscripts + diag_activescripts diag_captureframe diag_captureframetofile + diag_captureslowframe diag_codeperformance diag_drawmode diag_enable + diag_enabled diag_fps diag_fpsmin diag_frameno diag_lightnewload + diag_list diag_log diag_logslowframe diag_mergeconfigfile + diag_recordturretlimits diag_setlightnew diag_ticktime diag_toggle + ) + end + + def self.commands + Kernel::load File.join(Lexers::BASE_DIR, "sqf/keywords.rb") + commands + end + + state :root do + # Whitespace + rule %r"\s+", Text + + # Preprocessor instructions + rule %r"/\*.*?\*/"m, Comment::Multiline + rule %r"//.*", Comment::Single + rule %r"#(define|undef|if(n)?def|else|endif|include)", Comment::Preproc + rule %r"\\\r?\n", Comment::Preproc + rule %r"__(EVAL|EXEC|LINE__|FILE__)", Name::Builtin + + # Literals + rule %r"\".*?\"", Literal::String + rule %r"'.*?'", Literal::String + rule %r"(\$|0x)[0-9a-fA-F]+", Literal::Number::Hex + rule %r"[0-9]+(\.)?(e[0-9]+)?", Literal::Number::Float + + # Symbols + rule %r"[\!\%\&\*\+\-\/\<\=\>\^\|\#]", Operator + rule %r"[\(\)\{\}\[\]\,\:\;]", Punctuation + + # Identifiers (variables and functions) + rule %r"[a-zA-Z0-9_]+" do |m| + name = m[0].downcase + if self.class.wordoperators.include? name + token Operator::Word + elsif self.class.initializers.include? name + token Keyword::Declaration + elsif self.class.controlflow.include? name + token Keyword::Reserved + elsif self.class.constants.include? name + token Keyword::Constant + elsif self.class.namespaces.include? name + token Keyword::Namespace + elsif self.class.diag_commands.include? name + token Name::Function + elsif self.class.commands.include? name + token Name::Function + elsif %r"_.+" =~ name + token Name::Variable + else + token Name::Variable::Global + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sqf/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sqf/keywords.rb new file mode 100644 index 000000000000..aaf2d77d6b3c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sqf/keywords.rb @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class SQF + def self.commands + @commands ||= Set.new ["abs", "acos", "actionids", "actionkeys", "actionkeysimages", "actionkeysnames", "actionkeysnamesarray", "actionname", "activateaddons", "activatekey", "add3denconnection", "add3deneventhandler", "addcamshake", "addforcegeneratorrtd", "additempool", "addmagazinepool", "addmissioneventhandler", "addmusiceventhandler", "addswitchableunit", "addtoremainscollector", "addweaponpool", "admin", "agent", "agltoasl", "aimpos", "airdensityrtd", "airplanethrottle", "airportside", "aisfinishheal", "alive", "allcontrols", "allmissionobjects", "allsimpleobjects", "allturrets", "allturrets", "allvariables", "allvariables", "allvariables", "allvariables", "allvariables", "allvariables", "allvariables", "animationnames", "animationstate", "asin", "asltoagl", "asltoatl", "assert", "assignedcargo", "assignedcommander", "assigneddriver", "assignedgunner", "assigneditems", "assignedtarget", "assignedteam", "assignedvehicle", "assignedvehiclerole", "atan", "atg", "atltoasl", "attachedobject", "attachedobjects", "attachedto", "attackenabled", "backpack", "backpackcargo", "backpackcontainer", "backpackitems", "backpackmagazines", "behaviour", "binocular", "boundingbox", "boundingboxreal", "boundingcenter", "breakout", "breakto", "buldozer_enableroaddiag", "buldozer_loadnewroads", "buttonaction", "buttonaction", "buttonsetaction", "calculatepath", "calculateplayervisibilitybyfriendly", "call", "camcommitted", "camdestroy", "cameraeffectenablehud", "camerainterest", "campreloaded", "camtarget", "camusenvg", "cancelsimpletaskdestination", "canfire", "canmove", "canstand", "cantriggerdynamicsimulation", "canunloadincombat", "captive", "captivenum", "case", "cbchecked", "ceil", "channelenabled", "checkaifeature", "classname", "clear3deninventory", "clearallitemsfrombackpack", "clearbackpackcargo", "clearbackpackcargoglobal", "cleargroupicons", "clearitemcargo", "clearitemcargoglobal", "clearmagazinecargo", "clearmagazinecargoglobal", "clearoverlay", "clearweaponcargo", "clearweaponcargoglobal", "closedialog", "closeoverlay", "collapseobjecttree", "collect3denhistory", "collectivertd", "combatmode", "commander", "commandgetout", "commandstop", "comment", "commitoverlay", "compile", "compilefinal", "completedfsm", "composetext", "confighierarchy", "configname", "configproperties", "configsourceaddonlist", "configsourcemod", "configsourcemodlist", "copytoclipboard", "cos", "count", "count", "count", "create3dencomposition", "create3denentity", "createagent", "createcenter", "createdialog", "creatediarylink", "creategeardialog", "creategroup", "createguardedpoint", "createlocation", "createmarker", "createmarkerlocal", "createmine", "createsimpleobject", "createsoundsource", "createteam", "createtrigger", "createvehicle", "createvehiclecrew", "crew", "ctaddheader", "ctaddrow", "ctclear", "ctcursel", "ctheadercount", "ctrlactivate", "ctrlangle", "ctrlautoscrolldelay", "ctrlautoscrollrewind", "ctrlautoscrollspeed", "ctrlchecked", "ctrlclassname", "ctrlcommitted", "ctrldelete", "ctrlenable", "ctrlenabled", "ctrlenabled", "ctrlfade", "ctrlhtmlloaded", "ctrlidc", "ctrlidd", "ctrlmapanimclear", "ctrlmapanimcommit", "ctrlmapanimdone", "ctrlmapmouseover", "ctrlmapscale", "ctrlmodel", "ctrlmodeldirandup", "ctrlmodelscale", "ctrlparent", "ctrlparentcontrolsgroup", "ctrlposition", "ctrlscale", "ctrlsetfocus", "ctrlsettext", "ctrlshow", "ctrlshown", "ctrltext", "ctrltext", "ctrltextheight", "ctrltextsecondary", "ctrltextwidth", "ctrltype", "ctrlvisible", "ctrowcount", "curatoraddons", "curatorcameraarea", "curatorcameraareaceiling", "curatoreditableobjects", "curatoreditingarea", "curatoreditingareatype", "curatorpoints", "curatorregisteredobjects", "curatorwaypointcost", "currentcommand", "currentmagazine", "currentmagazinedetail", "currentmuzzle", "currentpilot", "currenttask", "currenttasks", "currentthrowable", "currentvisionmode", "currentwaypoint", "currentweapon", "currentweaponmode", "currentzeroing", "cutobj", "cutrsc", "cuttext", "damage", "datetonumber", "deactivatekey", "debriefingtext", "debuglog", "decaygraphvalues", "default", "deg", "delete3denentities", "deletecenter", "deletecollection", "deletegroup", "deleteidentity", "deletelocation", "deletemarker", "deletemarkerlocal", "deletesite", "deletestatus", "deleteteam", "deletevehicle", "deletewaypoint", "detach", "detectedmines", "diag_captureframe", "diag_captureframetofile", "diag_captureslowframe", "diag_codeperformance", "diag_dynamicsimulationend", "diag_lightnewload", "diag_log", "diag_logslowframe", "diag_setlightnew", "didjipowner", "difficultyenabled", "difficultyoption", "direction", "direction", "disablemapindicators", "disableremotesensors", "disableuserinput", "displayparent", "dissolveteam", "do3denaction", "dogetout", "dostop", "drawicon3d", "drawline3d", "driver", "drop", "dynamicsimulationdistance", "dynamicsimulationdistancecoef", "dynamicsimulationenabled", "dynamicsimulationenabled", "echo", "edit3denmissionattributes", "effectivecommander", "enableaudiofeature", "enablecamshake", "enablecaustics", "enabledebriefingstats", "enablediaglegend", "enabledynamicsimulationsystem", "enableengineartillery", "enableenvironment", "enableradio", "enablesatnormalondetail", "enablesaving", "enablesentences", "enablestressdamage", "enableteamswitch", "enabletraffic", "enableweapondisassembly", "endmission", "enginesisonrtd", "enginespowerrtd", "enginesrpmrtd", "enginestorquertd", "entities", "entities", "estimatedtimeleft", "everybackpack", "everycontainer", "execfsm", "execvm", "exp", "expecteddestination", "exportjipmessages", "eyedirection", "eyepos", "face", "faction", "failmission", "fillweaponsfrompool", "finddisplay", "finite", "firstbackpack", "flag", "flaganimationphase", "flagowner", "flagside", "flagtexture", "fleeing", "floor", "for", "for", "forceatpositionrtd", "forcegeneratorrtd", "forcemap", "forcerespawn", "format", "formation", "formation", "formationdirection", "formationleader", "formationmembers", "formationposition", "formationtask", "formattext", "formleader", "fromeditor", "fuel", "fullcrew", "fullcrew", "gearidcammocount", "gearslotammocount", "gearslotdata", "get3denactionstate", "get3denconnections", "get3denentity", "get3denentityid", "get3dengrid", "get3denlayerentities", "get3denselected", "getaimingcoef", "getallenvsoundcontrollers", "getallhitpointsdamage", "getallownedmines", "getallsoundcontrollers", "getammocargo", "getanimaimprecision", "getanimspeedcoef", "getarray", "getartilleryammo", "getassignedcuratorlogic", "getassignedcuratorunit", "getbackpackcargo", "getbleedingremaining", "getburningvalue", "getcameraviewdirection", "getcenterofmass", "getconnecteduav", "getcontainermaxload", "getcustomaimcoef", "getcustomsoundcontroller", "getcustomsoundcontrollercount", "getdammage", "getdescription", "getdir", "getdirvisual", "getdiverstate", "getdlcassetsusagebyname", "getdlcs", "getdlcusagetime", "geteditorcamera", "geteditormode", "getenginetargetrpmrtd", "getfatigue", "getfieldmanualstartpage", "getforcedflagtexture", "getfuelcargo", "getgraphvalues", "getgroupiconparams", "getgroupicons", "getitemcargo", "getmagazinecargo", "getmarkercolor", "getmarkerpos", "getmarkerpos", "getmarkersize", "getmarkertype", "getmass", "getmissionconfig", "getmissionconfigvalue", "getmissionlayerentities", "getmissionpath", "getmodelinfo", "getnumber", "getobjectdlc", "getobjectfov", "getobjectmaterials", "getobjecttextures", "getobjecttype", "getoxygenremaining", "getpersonuseddlcs", "getpilotcameradirection", "getpilotcameraposition", "getpilotcamerarotation", "getpilotcameratarget", "getplatenumber", "getplayerchannel", "getplayerscores", "getplayeruid", "getpos", "getpos", "getposasl", "getposaslvisual", "getposaslw", "getposatl", "getposatlvisual", "getposvisual", "getposworld", "getposworldvisual", "getpylonmagazines", "getrepaircargo", "getrotorbrakertd", "getshotparents", "getslingload", "getstamina", "getstatvalue", "getsuppression", "getterrainheightasl", "gettext", "gettrimoffsetrtd", "getunitloadout", "getunitloadout", "getunitloadout", "getusermfdtext", "getusermfdvalue", "getvehiclecargo", "getweaponcargo", "getweaponsway", "getwingsorientationrtd", "getwingspositionrtd", "getwppos", "goggles", "goto", "group", "groupfromnetid", "groupid", "groupowner", "groupselectedunits", "gunner", "handgunitems", "handgunmagazine", "handgunweapon", "handshit", "haspilotcamera", "hcallgroups", "hcleader", "hcremoveallgroups", "hcselected", "hcshowbar", "headgear", "hidebody", "hideobject", "hideobjectglobal", "hint", "hintc", "hintcadet", "hintsilent", "hmd", "hostmission", "if", "image", "importallgroups", "importance", "incapacitatedstate", "inflamed", "infopanel", "infopanels", "ingameuiseteventhandler", "inheritsfrom", "inputaction", "isabletobreathe", "isagent", "isaimprecisionenabled", "isarray", "isautohoveron", "isautonomous", "isautostartupenabledrtd", "isautotrimonrtd", "isbleeding", "isburning", "isclass", "iscollisionlighton", "iscopilotenabled", "isdamageallowed", "isdlcavailable", "isengineon", "isforcedwalk", "isformationleader", "isgroupdeletedwhenempty", "ishidden", "isinremainscollector", "iskeyactive", "islaseron", "islighton", "islocalized", "ismanualfire", "ismarkedforcollection", "isnil", "isnull", "isnull", "isnull", "isnull", "isnull", "isnull", "isnull", "isnull", "isnull", "isnumber", "isobjecthidden", "isobjectrtd", "isonroad", "isplayer", "isrealtime", "isshowing3dicons", "issimpleobject", "issprintallowed", "isstaminaenabled", "istext", "istouchingground", "isturnedout", "isuavconnected", "isvehiclecargo", "isvehicleradaron", "iswalking", "isweapondeployed", "isweaponrested", "itemcargo", "items", "itemswithmagazines", "keyimage", "keyname", "landresult", "lasertarget", "lbadd", "lbclear", "lbclear", "lbcolor", "lbcolorright", "lbcursel", "lbcursel", "lbdata", "lbdelete", "lbpicture", "lbpictureright", "lbselection", "lbsetcolor", "lbsetcolorright", "lbsetcursel", "lbsetdata", "lbsetpicture", "lbsetpicturecolor", "lbsetpicturecolordisabled", "lbsetpicturecolorselected", "lbsetpictureright", "lbsetselectcolor", "lbsetselectcolorright", "lbsettext", "lbsettooltip", "lbsetvalue", "lbsize", "lbsize", "lbsort", "lbsort", "lbsort", "lbsortbyvalue", "lbsortbyvalue", "lbtext", "lbtextright", "lbvalue", "leader", "leader", "leader", "leaderboarddeinit", "leaderboardgetrows", "leaderboardinit", "leaderboardrequestrowsfriends", "leaderboardrequestrowsglobal", "leaderboardrequestrowsglobalarounduser", "leaderboardsrequestuploadscore", "leaderboardsrequestuploadscorekeepbest", "leaderboardstate", "lifestate", "lightdetachobject", "lightison", "linearconversion", "lineintersects", "lineintersectsobjs", "lineintersectssurfaces", "lineintersectswith", "list", "listremotetargets", "listvehiclesensors", "ln", "lnbaddarray", "lnbaddcolumn", "lnbaddrow", "lnbclear", "lnbclear", "lnbcolor", "lnbcolorright", "lnbcurselrow", "lnbcurselrow", "lnbdata", "lnbdeletecolumn", "lnbdeleterow", "lnbgetcolumnsposition", "lnbgetcolumnsposition", "lnbpicture", "lnbpictureright", "lnbsetcolor", "lnbsetcolorright", "lnbsetcolumnspos", "lnbsetcurselrow", "lnbsetdata", "lnbsetpicture", "lnbsetpicturecolor", "lnbsetpicturecolorright", "lnbsetpicturecolorselected", "lnbsetpicturecolorselectedright", "lnbsetpictureright", "lnbsettext", "lnbsettextright", "lnbsettooltip", "lnbsetvalue", "lnbsize", "lnbsize", "lnbsort", "lnbsortbyvalue", "lnbtext", "lnbtextright", "lnbvalue", "load", "loadabs", "loadbackpack", "loadfile", "loaduniform", "loadvest", "local", "local", "localize", "locationposition", "locked", "lockeddriver", "lockidentity", "log", "lognetwork", "lognetworkterminate", "magazinecargo", "magazines", "magazinesallturrets", "magazinesammo", "magazinesammocargo", "magazinesammofull", "magazinesdetail", "magazinesdetailbackpack", "magazinesdetailuniform", "magazinesdetailvest", "mapanimadd", "mapcenteroncamera", "mapgridposition", "markeralpha", "markerbrush", "markercolor", "markerdir", "markerpos", "markerpos", "markershape", "markersize", "markertext", "markertype", "matrixtranspose", "members", "menuaction", "menuadd", "menuchecked", "menuclear", "menuclear", "menucollapse", "menudata", "menudelete", "menuenable", "menuenabled", "menuexpand", "menuhover", "menuhover", "menupicture", "menusetaction", "menusetcheck", "menusetdata", "menusetpicture", "menusetvalue", "menushortcut", "menushortcuttext", "menusize", "menusort", "menutext", "menuurl", "menuvalue", "mineactive", "missiletarget", "missiletargetpos", "modparams", "moonphase", "morale", "move3dencamera", "moveout", "movetime", "movetocompleted", "movetofailed", "name", "name", "namesound", "nearestbuilding", "nearestbuilding", "nearestlocation", "nearestlocations", "nearestlocationwithdubbing", "nearestobject", "nearestobjects", "nearestterrainobjects", "needreload", "netid", "netid", "nextmenuitemindex", "not", "numberofenginesrtd", "numbertodate", "objectcurators", "objectfromnetid", "objectparent", "onbriefinggroup", "onbriefingnotes", "onbriefingplan", "onbriefingteamswitch", "oncommandmodechanged", "oneachframe", "ongroupiconclick", "ongroupiconoverenter", "ongroupiconoverleave", "onhcgroupselectionchanged", "onmapsingleclick", "onplayerconnected", "onplayerdisconnected", "onpreloadfinished", "onpreloadstarted", "onteamswitch", "opendlcpage", "openmap", "openmap", "opensteamapp", "openyoutubevideo", "owner", "param", "params", "parsenumber", "parsenumber", "parsesimplearray", "parsetext", "pickweaponpool", "pitch", "playableslotsnumber", "playersnumber", "playmission", "playmusic", "playmusic", "playscriptedmission", "playsound", "playsound", "playsound3d", "position", "position", "positioncameratoworld", "ppeffectcommitted", "ppeffectcommitted", "ppeffectcreate", "ppeffectdestroy", "ppeffectdestroy", "ppeffectenabled", "precision", "preloadcamera", "preloadsound", "preloadtitleobj", "preloadtitlersc", "preprocessfile", "preprocessfilelinenumbers", "primaryweapon", "primaryweaponitems", "primaryweaponmagazine", "priority", "private", "processdiarylink", "progressloadingscreen", "progressposition", "publicvariable", "publicvariableserver", "putweaponpool", "queryitemspool", "querymagazinepool", "queryweaponpool", "rad", "radiochannelcreate", "random", "random", "rank", "rankid", "rating", "rectangular", "registeredtasks", "reload", "reloadenabled", "remoteexec", "remoteexeccall", "remove3denconnection", "remove3deneventhandler", "remove3denlayer", "removeall3deneventhandlers", "removeallactions", "removeallassigneditems", "removeallcontainers", "removeallcuratoraddons", "removeallcuratorcameraareas", "removeallcuratoreditingareas", "removeallhandgunitems", "removeallitems", "removeallitemswithmagazines", "removeallmissioneventhandlers", "removeallmusiceventhandlers", "removeallownedmines", "removeallprimaryweaponitems", "removeallweapons", "removebackpack", "removebackpackglobal", "removefromremainscollector", "removegoggles", "removeheadgear", "removemissioneventhandler", "removemusiceventhandler", "removeswitchableunit", "removeuniform", "removevest", "requiredversion", "resetsubgroupdirection", "resources", "restarteditorcamera", "reverse", "roadat", "roadsconnectedto", "roledescription", "ropeattachedobjects", "ropeattachedto", "ropeattachenabled", "ropecreate", "ropecut", "ropedestroy", "ropeendposition", "ropelength", "ropes", "ropeunwind", "ropeunwound", "rotorsforcesrtd", "rotorsrpmrtd", "round", "save3deninventory", "saveoverlay", "savevar", "scopename", "score", "scoreside", "screenshot", "screentoworld", "scriptdone", "scriptname", "scudstate", "secondaryweapon", "secondaryweaponitems", "secondaryweaponmagazine", "selectbestplaces", "selectededitorobjects", "selectionnames", "selectmax", "selectmin", "selectplayer", "selectrandom", "selectrandomweighted", "sendaumessage", "sendudpmessage", "servercommand", "servercommandavailable", "servercommandexecutable", "set3denattributes", "set3dengrid", "set3deniconsvisible", "set3denlinesvisible", "set3denmissionattributes", "set3denmodelsvisible", "set3denselected", "setacctime", "setaperture", "setaperturenew", "setarmorypoints", "setcamshakedefparams", "setcamshakeparams", "setcompassoscillation", "setcurrentchannel", "setcustommissiondata", "setcustomsoundcontroller", "setdate", "setdefaultcamera", "setdetailmapblendpars", "setgroupiconsselectable", "setgroupiconsvisible", "sethorizonparallaxcoef", "sethudmovementlevels", "setinfopanel", "setlocalwindparams", "setmouseposition", "setmusiceventhandler", "setobjectviewdistance", "setobjectviewdistance", "setplayable", "setplayerrespawntime", "setshadowdistance", "setsimulweatherlayers", "setstaminascheme", "setstatvalue", "setsystemofunits", "setterraingrid", "settimemultiplier", "settrafficdensity", "settrafficdistance", "settrafficgap", "settrafficspeed", "setviewdistance", "setwind", "setwinddir", "showchat", "showcinemaborder", "showcommandingmenu", "showcompass", "showcuratorcompass", "showgps", "showhud", "showhud", "showmap", "showpad", "showradio", "showscoretable", "showsubtitles", "showuavfeed", "showwarrant", "showwatch", "showwaypoints", "side", "side", "side", "simpletasks", "simulationenabled", "simulclouddensity", "simulcloudocclusion", "simulinclouds", "sin", "size", "sizeof", "skill", "skiptime", "sleep", "sliderposition", "sliderposition", "sliderrange", "sliderrange", "slidersetposition", "slidersetrange", "slidersetspeed", "sliderspeed", "sliderspeed", "soldiermagazines", "someammo", "speaker", "speed", "speedmode", "sqrt", "squadparams", "stance", "startloadingscreen", "stopenginertd", "stopped", "str", "supportinfo", "surfaceiswater", "surfacenormal", "surfacetype", "switch", "switchcamera", "synchronizedobjects", "synchronizedtriggers", "synchronizedwaypoints", "synchronizedwaypoints", "systemchat", "tan", "taskalwaysvisible", "taskchildren", "taskcompleted", "taskcustomdata", "taskdescription", "taskdestination", "taskhint", "taskmarkeroffset", "taskparent", "taskresult", "taskstate", "tasktype", "teammember", "teamname", "teamtype", "terminate", "terrainintersect", "terrainintersectasl", "terrainintersectatasl", "text", "text", "textlog", "textlogformat", "tg", "throw", "titlecut", "titlefadeout", "titleobj", "titlersc", "titletext", "toarray", "tofixed", "tolower", "toloweransi", "tostring", "toupper", "toupperansi", "triggeractivated", "triggeractivation", "triggerammo", "triggerarea", "triggerattachedvehicle", "triggerstatements", "triggertext", "triggertimeout", "triggertimeoutcurrent", "triggertype", "try", "tvadd", "tvclear", "tvclear", "tvcollapse", "tvcollapseall", "tvcollapseall", "tvcount", "tvcursel", "tvcursel", "tvdata", "tvdelete", "tvexpand", "tvexpandall", "tvexpandall", "tvpicture", "tvpictureright", "tvsetcursel", "tvsetdata", "tvsetpicture", "tvsetpicturecolor", "tvsetpictureright", "tvsetpicturerightcolor", "tvsettext", "tvsettooltip", "tvsetvalue", "tvsort", "tvsortbyvalue", "tvtext", "tvtooltip", "tvvalue", "type", "type", "typename", "typeof", "uavcontrol", "uisleep", "unassigncurator", "unassignteam", "unassignvehicle", "underwater", "uniform", "uniformcontainer", "uniformitems", "uniformmagazines", "unitaddons", "unitaimposition", "unitaimpositionvisual", "unitbackpack", "unitisuav", "unitpos", "unitready", "unitrecoilcoefficient", "units", "units", "unlockachievement", "updateobjecttree", "useaiopermapobstructiontest", "useaisteeringcomponent", "vectordir", "vectordirvisual", "vectorlinearconversion", "vectormagnitude", "vectormagnitudesqr", "vectornormalized", "vectorup", "vectorupvisual", "vehicle", "vehiclecargoenabled", "vehiclereceiveremotetargets", "vehiclereportownposition", "vehiclereportremotetargets", "vehiclevarname", "velocity", "velocitymodelspace", "verifysignature", "vest", "vestcontainer", "vestitems", "vestmagazines", "visibleposition", "visiblepositionasl", "waituntil", "waypointattachedobject", "waypointattachedvehicle", "waypointbehaviour", "waypointcombatmode", "waypointcompletionradius", "waypointdescription", "waypointforcebehaviour", "waypointformation", "waypointhouseposition", "waypointloiterradius", "waypointloitertype", "waypointname", "waypointposition", "waypoints", "waypointscript", "waypointsenableduav", "waypointshow", "waypointspeed", "waypointstatements", "waypointtimeout", "waypointtimeoutcurrent", "waypointtype", "waypointvisible", "weaponcargo", "weaponinertia", "weaponlowered", "weapons", "weaponsitems", "weaponsitemscargo", "weaponstate", "weaponstate", "weightrtd", "wfsidetext", "wfsidetext", "wfsidetext", "while", "wingsforcesrtd", "with", "worldtoscreen", "action", "actionparams", "add3denlayer", "addaction", "addbackpack", "addbackpackcargo", "addbackpackcargoglobal", "addbackpackglobal", "addcuratoraddons", "addcuratorcameraarea", "addcuratoreditableobjects", "addcuratoreditingarea", "addcuratorpoints", "addeditorobject", "addeventhandler", "addforce", "addgoggles", "addgroupicon", "addhandgunitem", "addheadgear", "additem", "additemcargo", "additemcargoglobal", "additemtobackpack", "additemtouniform", "additemtovest", "addlivestats", "addmagazine", "addmagazine", "addmagazineammocargo", "addmagazinecargo", "addmagazinecargoglobal", "addmagazineglobal", "addmagazines", "addmagazineturret", "addmenu", "addmenuitem", "addmpeventhandler", "addownedmine", "addplayerscores", "addprimaryweaponitem", "addpublicvariableeventhandler", "addpublicvariableeventhandler", "addrating", "addresources", "addscore", "addscoreside", "addsecondaryweaponitem", "addteammember", "addtorque", "adduniform", "addvehicle", "addvest", "addwaypoint", "addweapon", "addweaponcargo", "addweaponcargoglobal", "addweaponglobal", "addweaponitem", "addweaponturret", "addweaponwithattachmentscargo", "addweaponwithattachmentscargoglobal", "aimedattarget", "allow3dmode", "allowcrewinimmobile", "allowcuratorlogicignoreareas", "allowdamage", "allowdammage", "allowfileoperations", "allowfleeing", "allowgetin", "allowsprint", "ammo", "ammoonpylon", "and", "and", "animate", "animatebay", "animatedoor", "animatepylon", "animatesource", "animationphase", "animationsourcephase", "append", "apply", "arrayintersect", "assignascargo", "assignascargoindex", "assignascommander", "assignasdriver", "assignasgunner", "assignasturret", "assigncurator", "assignitem", "assignteam", "assigntoairport", "atan2", "attachobject", "attachto", "backpackspacefor", "bezierinterpolation", "boundingbox", "boundingboxreal", "breakout", "buildingexit", "buildingpos", "buttonsetaction", "call", "callextension", "callextension", "camcommand", "camcommit", "camcommitprepared", "camconstuctionsetparams", "camcreate", "cameraeffect", "campreload", "campreparebank", "campreparedir", "campreparedive", "campreparefocus", "campreparefov", "campreparefovrange", "campreparepos", "campreparerelpos", "campreparetarget", "campreparetarget", "camsetbank", "camsetdir", "camsetdive", "camsetfocus", "camsetfov", "camsetfovrange", "camsetpos", "camsetrelpos", "camsettarget", "camsettarget", "canadd", "canadditemtobackpack", "canadditemtouniform", "canadditemtovest", "canslingload", "canvehiclecargo", "catch", "cbsetchecked", "checkaifeature", "checkvisibility", "clear3denattribute", "closedisplay", "commandartilleryfire", "commandchat", "commandfire", "commandfollow", "commandfsm", "commandmove", "commandradio", "commandsuppressivefire", "commandtarget", "commandwatch", "commandwatch", "configclasses", "confirmsensortarget", "connectterminaltouav", "controlsgroupctrl", "copywaypoints", "count", "countenemy", "countfriendly", "countside", "counttype", "countunknown", "create3denentity", "creatediaryrecord", "creatediarysubject", "createdisplay", "createmenu", "createmissiondisplay", "createmissiondisplay", "creatempcampaigndisplay", "createsimpletask", "createsite", "createtask", "createunit", "createunit", "createvehicle", "createvehiclelocal", "ctdata", "ctfindheaderrows", "ctfindrowheader", "ctheadercontrols", "ctremoveheaders", "ctremoverows", "ctrladdeventhandler", "ctrlanimatemodel", "ctrlanimationphasemodel", "ctrlchecked", "ctrlcommit", "ctrlcreate", "ctrlenable", "ctrlmapanimadd", "ctrlmapcursor", "ctrlmapscreentoworld", "ctrlmapworldtoscreen", "ctrlremovealleventhandlers", "ctrlremoveeventhandler", "ctrlsetactivecolor", "ctrlsetangle", "ctrlsetautoscrolldelay", "ctrlsetautoscrollrewind", "ctrlsetautoscrollspeed", "ctrlsetbackgroundcolor", "ctrlsetchecked", "ctrlsetchecked", "ctrlsetdisabledcolor", "ctrlseteventhandler", "ctrlsetfade", "ctrlsetfont", "ctrlsetfonth1", "ctrlsetfonth1b", "ctrlsetfonth2", "ctrlsetfonth2b", "ctrlsetfonth3", "ctrlsetfonth3b", "ctrlsetfonth4", "ctrlsetfonth4b", "ctrlsetfonth5", "ctrlsetfonth5b", "ctrlsetfonth6", "ctrlsetfonth6b", "ctrlsetfontheight", "ctrlsetfontheighth1", "ctrlsetfontheighth2", "ctrlsetfontheighth3", "ctrlsetfontheighth4", "ctrlsetfontheighth5", "ctrlsetfontheighth6", "ctrlsetfontheightsecondary", "ctrlsetfontp", "ctrlsetfontp", "ctrlsetfontpb", "ctrlsetfontsecondary", "ctrlsetforegroundcolor", "ctrlsetmodel", "ctrlsetmodeldirandup", "ctrlsetmodelscale", "ctrlsetpixelprecision", "ctrlsetpixelprecision", "ctrlsetposition", "ctrlsetpositionh", "ctrlsetpositionw", "ctrlsetpositionx", "ctrlsetpositiony", "ctrlsetscale", "ctrlsetstructuredtext", "ctrlsettext", "ctrlsettextcolor", "ctrlsettextcolorsecondary", "ctrlsettextsecondary", "ctrlsettooltip", "ctrlsettooltipcolorbox", "ctrlsettooltipcolorshade", "ctrlsettooltipcolortext", "ctrlshow", "ctrowcontrols", "ctsetcursel", "ctsetdata", "ctsetheadertemplate", "ctsetrowtemplate", "ctsetvalue", "ctvalue", "curatorcoef", "currentmagazinedetailturret", "currentmagazineturret", "currentweaponturret", "customchat", "customradio", "cutfadeout", "cutfadeout", "cutobj", "cutobj", "cutrsc", "cutrsc", "cuttext", "cuttext", "debugfsm", "deleteat", "deleteeditorobject", "deletegroupwhenempty", "deleterange", "deleteresources", "deletevehiclecrew", "diarysubjectexists", "directsay", "disableai", "disablecollisionwith", "disableconversation", "disablenvgequipment", "disabletiequipment", "disableuavconnectability", "displayaddeventhandler", "displayctrl", "displayremovealleventhandlers", "displayremoveeventhandler", "displayseteventhandler", "distance", "distance", "distance", "distance", "distance2d", "distancesqr", "distancesqr", "distancesqr", "distancesqr", "do", "do", "do", "do", "doartilleryfire", "dofire", "dofollow", "dofsm", "domove", "doorphase", "dosuppressivefire", "dotarget", "dowatch", "dowatch", "drawarrow", "drawellipse", "drawicon", "drawline", "drawlink", "drawlocation", "drawpolygon", "drawrectangle", "drawtriangle", "editobject", "editorseteventhandler", "else", "emptypositions", "enableai", "enableaifeature", "enableaifeature", "enableaimprecision", "enableattack", "enableautostartuprtd", "enableautotrimrtd", "enablechannel", "enablechannel", "enablecollisionwith", "enablecopilot", "enabledynamicsimulation", "enabledynamicsimulation", "enablefatigue", "enablegunlights", "enableinfopanelcomponent", "enableirlasers", "enablemimics", "enablepersonturret", "enablereload", "enableropeattach", "enablesimulation", "enablesimulationglobal", "enablestamina", "enableuavconnectability", "enableuavwaypoints", "enablevehiclecargo", "enablevehiclesensor", "enableweapondisassembly", "engineon", "evalobjectargument", "exec", "execeditorscript", "execfsm", "execvm", "exitwith", "fademusic", "faderadio", "fadesound", "fadespeech", "find", "find", "findcover", "findeditorobject", "findeditorobject", "findemptyposition", "findemptypositionready", "findif", "findnearestenemy", "fire", "fire", "fireattarget", "flyinheight", "flyinheightasl", "forceadduniform", "forceflagtexture", "forcefollowroad", "forcespeed", "forcewalk", "forceweaponfire", "foreach", "foreachmember", "foreachmemberagent", "foreachmemberteam", "forgettarget", "from", "get3denattribute", "get3denattribute", "get3denattribute", "get3denattribute", "get3denattribute", "get3denmissionattribute", "getartilleryeta", "getcargoindex", "getcompatiblepylonmagazines", "getcompatiblepylonmagazines", "getdir", "geteditorobjectscope", "getenvsoundcontroller", "getfriend", "getfsmvariable", "getgroupicon", "gethidefrom", "gethit", "gethitindex", "gethitpointdamage", "getobjectargument", "getobjectchildren", "getobjectproxy", "getpos", "getreldir", "getrelpos", "getsoundcontroller", "getsoundcontrollerresult", "getspeed", "getunittrait", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "getvariable", "glanceat", "globalchat", "globalradio", "groupchat", "groupradio", "groupselectunit", "hasweapon", "hcgroupparams", "hcremovegroup", "hcselectgroup", "hcsetgroup", "hideobject", "hideobjectglobal", "hideselection", "hintc", "hintc", "hintc", "htmlload", "in", "in", "in", "in", "inarea", "inarea", "inarea", "inarea", "inarea", "inareaarray", "inareaarray", "inareaarray", "inareaarray", "inflame", "infopanelcomponentenabled", "infopanelcomponents", "inpolygon", "inrangeofartillery", "inserteditorobject", "intersect", "isequalto", "isequaltype", "isequaltypeall", "isequaltypeany", "isequaltypearray", "isequaltypeparams", "isflashlighton", "isflatempty", "isirlaseron", "iskindof", "iskindof", "iskindof", "issensortargetconfirmed", "isuavconnectable", "isuniformallowed", "isvehiclesensorenabled", "join", "joinas", "joinassilent", "joinsilent", "joinstring", "kbadddatabase", "kbadddatabasetargets", "kbaddtopic", "kbhastopic", "kbreact", "kbremovetopic", "kbtell", "kbwassaid", "knowsabout", "knowsabout", "land", "landat", "lbadd", "lbcolor", "lbcolorright", "lbdata", "lbdelete", "lbisselected", "lbpicture", "lbpictureright", "lbsetcolor", "lbsetcolorright", "lbsetcursel", "lbsetdata", "lbsetpicture", "lbsetpicturecolor", "lbsetpicturecolordisabled", "lbsetpicturecolorselected", "lbsetpictureright", "lbsetpicturerightcolor", "lbsetpicturerightcolordisabled", "lbsetpicturerightcolorselected", "lbsetselectcolor", "lbsetselectcolorright", "lbsetselected", "lbsettext", "lbsettextright", "lbsettooltip", "lbsetvalue", "lbtext", "lbtextright", "lbvalue", "leavevehicle", "leavevehicle", "lightattachobject", "limitspeed", "linkitem", "listobjects", "lnbaddcolumn", "lnbaddrow", "lnbcolor", "lnbcolorright", "lnbdata", "lnbdeletecolumn", "lnbdeleterow", "lnbpicture", "lnbpictureright", "lnbsetcolor", "lnbsetcolorright", "lnbsetcolumnspos", "lnbsetcurselrow", "lnbsetdata", "lnbsetpicture", "lnbsetpicturecolor", "lnbsetpicturecolorright", "lnbsetpicturecolorselected", "lnbsetpicturecolorselectedright", "lnbsetpictureright", "lnbsettext", "lnbsettextright", "lnbsettooltip", "lnbsetvalue", "lnbsort", "lnbsortbyvalue", "lnbtext", "lnbtextright", "lnbvalue", "loadidentity", "loadmagazine", "loadoverlay", "loadstatus", "lock", "lock", "lockcamerato", "lockcargo", "lockcargo", "lockdriver", "lockedcargo", "lockedturret", "lockturret", "lockwp", "lookat", "lookatpos", "magazinesturret", "magazineturretammo", "mapcenteroncamera", "matrixmultiply", "max", "menuaction", "menuadd", "menuchecked", "menucollapse", "menudata", "menudelete", "menuenable", "menuenabled", "menuexpand", "menupicture", "menusetaction", "menusetcheck", "menusetdata", "menusetpicture", "menusetvalue", "menushortcut", "menushortcuttext", "menusize", "menusort", "menutext", "menuurl", "menuvalue", "min", "minedetectedby", "mod", "modeltoworld", "modeltoworldvisual", "modeltoworldvisualworld", "modeltoworldworld", "move", "moveinany", "moveincargo", "moveincargo", "moveincommander", "moveindriver", "moveingunner", "moveinturret", "moveobjecttoend", "moveto", "nearentities", "nearestobject", "nearestobject", "nearobjects", "nearobjectsready", "nearroads", "nearsupplies", "neartargets", "newoverlay", "nmenuitems", "objstatus", "ondoubleclick", "onmapsingleclick", "onshownewobject", "or", "or", "ordergetin", "param", "params", "playaction", "playactionnow", "playgesture", "playmove", "playmovenow", "posscreentoworld", "posworldtoscreen", "ppeffectadjust", "ppeffectadjust", "ppeffectcommit", "ppeffectcommit", "ppeffectcommit", "ppeffectenable", "ppeffectenable", "ppeffectenable", "ppeffectforceinnvg", "preloadobject", "progresssetposition", "publicvariableclient", "pushback", "pushbackunique", "radiochanneladd", "radiochannelremove", "radiochannelsetcallsign", "radiochannelsetlabel", "random", "registertask", "remotecontrol", "remoteexec", "remoteexeccall", "removeaction", "removealleventhandlers", "removeallmpeventhandlers", "removecuratoraddons", "removecuratorcameraarea", "removecuratoreditableobjects", "removecuratoreditingarea", "removediaryrecord", "removediarysubject", "removedrawicon", "removedrawlinks", "removeeventhandler", "removegroupicon", "removehandgunitem", "removeitem", "removeitemfrombackpack", "removeitemfromuniform", "removeitemfromvest", "removeitems", "removemagazine", "removemagazineglobal", "removemagazines", "removemagazinesturret", "removemagazineturret", "removemenuitem", "removemenuitem", "removempeventhandler", "removeownedmine", "removeprimaryweaponitem", "removesecondaryweaponitem", "removesimpletask", "removeteammember", "removeweapon", "removeweaponattachmentcargo", "removeweaponcargo", "removeweaponglobal", "removeweaponturret", "reportremotetarget", "resize", "respawnvehicle", "reveal", "reveal", "revealmine", "ropeattachto", "ropedetach", "saveidentity", "savestatus", "say", "say", "say2d", "say2d", "say3d", "say3d", "select", "select", "select", "select", "select", "select", "selectdiarysubject", "selecteditorobject", "selectionposition", "selectleader", "selectrandomweighted", "selectweapon", "selectweaponturret", "sendsimplecommand", "sendtask", "sendtaskresult", "servercommand", "set", "set3denattribute", "set3denlayer", "set3denlogictype", "set3denmissionattribute", "set3denobjecttype", "setactualcollectivertd", "setairplanethrottle", "setairportside", "setammo", "setammocargo", "setammoonpylon", "setanimspeedcoef", "setattributes", "setautonomous", "setbehaviour", "setbehaviourstrong", "setbleedingremaining", "setbrakesrtd", "setcamerainterest", "setcamuseti", "setcaptive", "setcenterofmass", "setcollisionlight", "setcombatmode", "setcombatmode", "setconvoyseparation", "setcuratorcameraareaceiling", "setcuratorcoef", "setcuratoreditingareatype", "setcuratorwaypointcost", "setcurrenttask", "setcurrentwaypoint", "setcustomaimcoef", "setcustomweightrtd", "setdamage", "setdammage", "setdebriefingtext", "setdestination", "setdiaryrecordtext", "setdir", "setdirection", "setdrawicon", "setdriveonpath", "setdropinterval", "setdynamicsimulationdistance", "setdynamicsimulationdistancecoef", "seteditormode", "seteditorobjectscope", "seteffectcondition", "seteffectivecommander", "setenginerpmrtd", "setface", "setfaceanimation", "setfatigue", "setfeaturetype", "setflaganimationphase", "setflagowner", "setflagside", "setflagtexture", "setfog", "setforcegeneratorrtd", "setformation", "setformation", "setformationtask", "setformdir", "setfriend", "setfromeditor", "setfsmvariable", "setfuel", "setfuelcargo", "setgroupicon", "setgroupiconparams", "setgroupid", "setgroupidglobal", "setgroupowner", "setgusts", "sethidebehind", "sethit", "sethitindex", "sethitpointdamage", "setidentity", "setimportance", "setleader", "setlightambient", "setlightattenuation", "setlightbrightness", "setlightcolor", "setlightdaylight", "setlightflaremaxdistance", "setlightflaresize", "setlightintensity", "setlightnings", "setlightuseflare", "setmagazineturretammo", "setmarkeralpha", "setmarkeralphalocal", "setmarkerbrush", "setmarkerbrushlocal", "setmarkercolor", "setmarkercolorlocal", "setmarkerdir", "setmarkerdirlocal", "setmarkerpos", "setmarkerposlocal", "setmarkershape", "setmarkershapelocal", "setmarkersize", "setmarkersizelocal", "setmarkertext", "setmarkertextlocal", "setmarkertype", "setmarkertypelocal", "setmass", "setmimic", "setmissiletarget", "setmissiletargetpos", "setmusiceffect", "setname", "setname", "setname", "setnamesound", "setobjectarguments", "setobjectmaterial", "setobjectmaterialglobal", "setobjectproxy", "setobjecttexture", "setobjecttextureglobal", "setovercast", "setowner", "setoxygenremaining", "setparticlecircle", "setparticleclass", "setparticlefire", "setparticleparams", "setparticlerandom", "setpilotcameradirection", "setpilotcamerarotation", "setpilotcameratarget", "setpilotlight", "setpipeffect", "setpitch", "setplatenumber", "setpos", "setposasl", "setposasl2", "setposaslw", "setposatl", "setposition", "setposworld", "setpylonloadout", "setpylonspriority", "setradiomsg", "setrain", "setrainbow", "setrandomlip", "setrank", "setrectangular", "setrepaircargo", "setrotorbrakertd", "setshotparents", "setside", "setsimpletaskalwaysvisible", "setsimpletaskcustomdata", "setsimpletaskdescription", "setsimpletaskdestination", "setsimpletasktarget", "setsimpletasktype", "setsize", "setskill", "setskill", "setslingload", "setsoundeffect", "setspeaker", "setspeech", "setspeedmode", "setstamina", "setsuppression", "settargetage", "settaskmarkeroffset", "settaskresult", "settaskstate", "settext", "settitleeffect", "settriggeractivation", "settriggerarea", "settriggerstatements", "settriggertext", "settriggertimeout", "settriggertype", "settype", "setunconscious", "setunitability", "setunitloadout", "setunitloadout", "setunitloadout", "setunitpos", "setunitposweak", "setunitrank", "setunitrecoilcoefficient", "setunittrait", "setunloadincombat", "setuseractiontext", "setusermfdtext", "setusermfdvalue", "setvariable", "setvariable", "setvariable", "setvariable", "setvariable", "setvariable", "setvariable", "setvariable", "setvectordir", "setvectordirandup", "setvectorup", "setvehicleammo", "setvehicleammodef", "setvehiclearmor", "setvehiclecargo", "setvehicleid", "setvehiclelock", "setvehicleposition", "setvehicleradar", "setvehiclereceiveremotetargets", "setvehiclereportownposition", "setvehiclereportremotetargets", "setvehicletipars", "setvehiclevarname", "setvelocity", "setvelocitymodelspace", "setvelocitytransformation", "setvisibleiftreecollapsed", "setwantedrpmrtd", "setwaves", "setwaypointbehaviour", "setwaypointcombatmode", "setwaypointcompletionradius", "setwaypointdescription", "setwaypointforcebehaviour", "setwaypointformation", "setwaypointhouseposition", "setwaypointloiterradius", "setwaypointloitertype", "setwaypointname", "setwaypointposition", "setwaypointscript", "setwaypointspeed", "setwaypointstatements", "setwaypointtimeout", "setwaypointtype", "setwaypointvisible", "setweaponreloadingtime", "setwinddir", "setwindforce", "setwindstr", "setwingforcescalertd", "setwppos", "show3dicons", "showlegend", "showneweditorobject", "showwaypoint", "sidechat", "sideradio", "skill", "skillfinal", "slidersetposition", "slidersetrange", "slidersetspeed", "sort", "spawn", "splitstring", "step", "stop", "suppressfor", "swimindepth", "switchaction", "switchcamera", "switchgesture", "switchlight", "switchmove", "synchronizeobjectsadd", "synchronizeobjectsremove", "synchronizetrigger", "synchronizewaypoint", "synchronizewaypoint", "targetknowledge", "targets", "targetsaggregate", "targetsquery", "then", "then", "throw", "to", "tofixed", "triggerattachobject", "triggerattachvehicle", "triggerdynamicsimulation", "try", "turretlocal", "turretowner", "turretunit", "tvadd", "tvcollapse", "tvcount", "tvdata", "tvdelete", "tvexpand", "tvpicture", "tvpictureright", "tvsetcolor", "tvsetcursel", "tvsetdata", "tvsetpicture", "tvsetpicturecolor", "tvsetpicturecolordisabled", "tvsetpicturecolorselected", "tvsetpictureright", "tvsetpicturerightcolor", "tvsetpicturerightcolordisabled", "tvsetpicturerightcolorselected", "tvsetselectcolor", "tvsettext", "tvsettooltip", "tvsetvalue", "tvsort", "tvsortbyvalue", "tvtext", "tvtooltip", "tvvalue", "unassignitem", "unitsbelowheight", "unitsbelowheight", "unlinkitem", "unregistertask", "updatedrawicon", "updatemenuitem", "useaudiotimeformoves", "vectoradd", "vectorcos", "vectorcrossproduct", "vectordiff", "vectordistance", "vectordistancesqr", "vectordotproduct", "vectorfromto", "vectormodeltoworld", "vectormodeltoworldvisual", "vectormultiply", "vectorworldtomodel", "vectorworldtomodelvisual", "vehiclechat", "vehicleradio", "waypointattachobject", "waypointattachvehicle", "weaponaccessories", "weaponaccessoriescargo", "weapondirection", "weaponsturret", "worldtomodel", "worldtomodelvisual", "acctime", "activatedaddons", "agents", "airdensitycurvertd", "all3denentities", "allairports", "allcurators", "allcutlayers", "alldead", "alldeadmen", "alldisplays", "allgroups", "allmapmarkers", "allmines", "allplayers", "allsites", "allunits", "allunitsuav", "armorypoints", "benchmark", "blufor", "briefingname", "buldozer_isenabledroaddiag", "buldozer_reloadopermap", "cadetmode", "cameraon", "cameraview", "campaignconfigfile", "cansuspend", "cheatsenabled", "civilian", "clearforcesrtd", "clearitempool", "clearmagazinepool", "clearradio", "clearweaponpool", "clientowner", "commandingmenu", "configfile", "confignull", "controlnull", "copyfromclipboard", "curatorcamera", "curatormouseover", "curatorselected", "current3denoperation", "currentchannel", "currentnamespace", "cursorobject", "cursortarget", "customwaypointposition", "date", "daytime", "diag_activemissionfsms", "diag_activescripts", "diag_activesqfscripts", "diag_activesqsscripts", "diag_deltatime", "diag_fps", "diag_fpsmin", "diag_frameno", "diag_ticktime", "dialog", "didjip", "difficulty", "difficultyenabledrtd", "disabledebriefingstats", "disableserialization", "displaynull", "distributionregion", "dynamicsimulationsystemenabled", "east", "enableenddialog", "endl", "endloadingscreen", "environmentenabled", "estimatedendservertime", "exit", "false", "finishmissioninit", "fog", "fogforecast", "fogparams", "forcedmap", "forceend", "forceweatherchange", "freelook", "get3dencamera", "get3deniconsvisible", "get3denlinesvisible", "get3denmouseover", "getartillerycomputersettings", "getaudiooptionvolumes", "getcalculateplayervisibilitybyfriendly", "getclientstate", "getclientstatenumber", "getcursorobjectparams", "getdlcassetsusage", "getelevationoffset", "getmissiondlcs", "getmissionlayers", "getmouseposition", "getmusicplayedtime", "getobjectviewdistance", "getremotesensorsdisabled", "getresolution", "getshadowdistance", "getsubtitleoptions", "getterraingrid", "gettotaldlcusagetime", "groupiconselectable", "groupiconsvisible", "grpnull", "gusts", "halt", "hasinterface", "hcshownbar", "hudmovementlevels", "humidity", "independent", "initambientlife", "is3den", "is3denmultiplayer", "isactionmenuvisible", "isautotest", "isdedicated", "isfilepatchingenabled", "isgamefocused", "isgamepaused", "isinstructorfigureenabled", "ismultiplayer", "ismultiplayersolo", "ispipenabled", "isremoteexecuted", "isremoteexecutedjip", "isserver", "issteammission", "isstreamfriendlyuienabled", "isstressdamageenabled", "istuthintsenabled", "isuicontext", "language", "librarycredits", "librarydisclaimers", "lightnings", "linebreak", "loadgame", "locationnull", "logentities", "mapanimclear", "mapanimcommit", "mapanimdone", "markasfinishedonsteam", "missionconfigfile", "missiondifficulty", "missionname", "missionnamespace", "missionstart", "missionversion", "moonintensity", "musicvolume", "netobjnull", "nextweatherchange", "nil", "objnull", "opencuratorinterface", "opfor", "overcast", "overcastforecast", "parsingnamespace", "particlesquality", "pi", "pixelgrid", "pixelgridbase", "pixelgridnouiscale", "pixelh", "pixelw", "playableunits", "player", "playerrespawntime", "playerside", "productversion", "profilename", "profilenamespace", "profilenamesteam", "radiovolume", "rain", "rainbow", "remoteexecutedowner", "resetcamshake", "resistance", "reversedmousey", "runinitscript", "safezoneh", "safezonew", "safezonewabs", "safezonex", "safezonexabs", "safezoney", "savegame", "savejoysticks", "saveprofilenamespace", "savingenabled", "scriptnull", "selectnoplayer", "servername", "servertime", "shownartillerycomputer", "shownchat", "showncompass", "showncuratorcompass", "showngps", "shownhud", "shownmap", "shownpad", "shownradio", "shownscoretable", "shownuavfeed", "shownwarrant", "shownwatch", "sideambientlife", "sideempty", "sideenemy", "sidefriendly", "sidelogic", "sideunknown", "simulweathersync", "slingloadassistantshown", "soundvolume", "sunormoon", "switchableunits", "systemofunits", "tasknull", "teammembernull", "teams", "teamswitch", "teamswitchenabled", "time", "timemultiplier", "true", "uinamespace", "userinputdisabled", "vehicles", "viewdistance", "visiblecompass", "visiblegps", "visiblemap", "visiblescoretable", "visiblewatch", "waves", "west", "wind", "winddir", "windrtd", "windstr", "worldname", "worldsize"] + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sql.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sql.rb new file mode 100644 index 000000000000..1d2913b51bef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/sql.rb @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class SQL < RegexLexer + title "SQL" + desc "Structured Query Language, for relational databases" + tag 'sql' + filenames '*.sql' + mimetypes 'text/x-sql' + + def self.keywords + @keywords ||= Set.new %w( + ABORT ABS ABSOLUTE ACCESS ADA ADD ADMIN AFTER AGGREGATE ALIAS + ALL ALLOCATE ALTER ANALYSE ANALYZE AND ANY ARE AS ASC ASENSITIVE + ASSERTION ASSIGNMENT ASYMMETRIC AT ATOMIC AUTHORIZATION + AVG BACKWARD BEFORE BEGIN BETWEEN BITVAR BIT_LENGTH BOTH + BREADTH BY C CACHE CALL CALLED CARDINALITY CASCADE CASCADED + CASE CAST CATALOG CATALOG_NAME CHAIN CHARACTERISTICS + CHARACTER_LENGTH CHARACTER_SET_CATALOG CHARACTER_SET_NAME + CHARACTER_SET_SCHEMA CHAR_LENGTH CHECK CHECKED CHECKPOINT + CLASS CLASS_ORIGIN CLOB CLOSE CLUSTER COALSECE COBOL COLLATE + COLLATION COLLATION_CATALOG COLLATION_NAME COLLATION_SCHEMA + COLUMN COLUMN_NAME COMMAND_FUNCTION COMMAND_FUNCTION_CODE + COMMENT COMMIT COMMITTED COMPLETION CONDITION_NUMBER + CONNECT CONNECTION CONNECTION_NAME CONSTRAINT CONSTRAINTS + CONSTRAINT_CATALOG CONSTRAINT_NAME CONSTRAINT_SCHEMA + CONSTRUCTOR CONTAINS CONTINUE CONVERSION CONVERT COPY + CORRESPONTING COUNT CREATE CREATEDB CREATEUSER CROSS CUBE + CURRENT CURRENT_DATE CURRENT_PATH CURRENT_ROLE CURRENT_TIME + CURRENT_TIMESTAMP CURRENT_USER CURSOR CURSOR_NAME CYCLE DATA + DATABASE DATETIME_INTERVAL_CODE DATETIME_INTERVAL_PRECISION + DAY DEALLOCATE DECLARE DEFAULT DEFAULTS DEFERRABLE DEFERRED + DEFINED DEFINER DELETE DELIMITER DELIMITERS DEREF DESC DESCRIBE + DESCRIPTOR DESTROY DESTRUCTOR DETERMINISTIC DIAGNOSTICS + DICTIONARY DISCONNECT DISPATCH DISTINCT DO DOMAIN DROP + DYNAMIC DYNAMIC_FUNCTION DYNAMIC_FUNCTION_CODE EACH ELSE + ENCODING ENCRYPTED END END-EXEC EQUALS ESCAPE EVERY EXCEPT + ESCEPTION EXCLUDING EXCLUSIVE EXEC EXECUTE EXISTING EXISTS + EXPLAIN EXTERNAL EXTRACT FALSE FETCH FINAL FIRST FOR FORCE + FOREIGN FORTRAN FORWARD FOUND FREE FREEZE FROM FULL FUNCTION + G GENERAL GENERATED GET GLOBAL GO GOTO GRANT GRANTED GROUP + GROUPING HANDLER HAVING HIERARCHY HOLD HOST IDENTITY IGNORE + ILIKE IMMEDIATE IMMUTABLE IMPLEMENTATION IMPLICIT IN INCLUDING + INCREMENT INDEX INDITCATOR INFIX INHERITS INITIALIZE INITIALLY + INNER INOUT INPUT INSENSITIVE INSERT INSTANTIABLE INSTEAD + INTERSECT INTO INVOKER IS ISNULL ISOLATION ITERATE JOIN KEY + KEY_MEMBER KEY_TYPE LANCOMPILER LANGUAGE LARGE LAST LATERAL + LEADING LEFT LENGTH LESS LEVEL LIKE LIMIT LISTEN LOAD LOCAL + LOCALTIME LOCALTIMESTAMP LOCATION LOCATOR LOCK LOWER MAP MATCH + MAX MAXVALUE MESSAGE_LENGTH MESSAGE_OCTET_LENGTH MESSAGE_TEXT + METHOD MIN MINUTE MINVALUE MOD MODE MODIFIES MODIFY MONTH + MORE MOVE MUMPS NAMES NATURAL NCLOB NEW NEXT + NO NOCREATEDB NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL + NULL NULLABLE NULLIF OBJECT OCTET_LENGTH OF OFF OFFSET OIDS + OLD ON ONLY OPEN OPERATION OPERATOR OPTION OPTIONS OR ORDER + ORDINALITY OUT OUTER OUTPUT OVERLAPS OVERLAY OVERRIDING + OWNER PAD PARAMETER PARAMETERS PARAMETER_MODE PARAMATER_NAME + PARAMATER_ORDINAL_POSITION PARAMETER_SPECIFIC_CATALOG + PARAMETER_SPECIFIC_NAME PARAMATER_SPECIFIC_SCHEMA PARTIAL PASCAL + PENDANT PLACING PLI POSITION POSTFIX PREFIX PREORDER + PREPARE PRESERVE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE + PUBLIC READ READS RECHECK RECURSIVE REF REFERENCES REFERENCING + REINDEX RELATIVE RENAME REPEATABLE REPLACE RESET RESTART + RESTRICT RESULT RETURN RETURNED_LENGTH RETURNED_OCTET_LENGTH + RETURNED_SQLSTATE RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP + ROUTINE ROUTINE_CATALOG ROUTINE_NAME ROUTINE_SCHEMA ROW ROWS + ROW_COUNT RULE SAVE_POINT SCALE SCHEMA SCHEMA_NAME SCOPE SCROLL + SEARCH SECOND SECURITY SELECT SELF SENSITIVE SERIALIZABLE + SERVER_NAME SESSION SESSION_USER SET SETOF SETS SHARE SHOW + SIMILAR SIMPLE SIZE SOME SOURCE SPACE SPECIFIC SPECIFICTYPE + SPECIFIC_NAME SQL SQLCODE SQLERROR SQLEXCEPTION SQLSTATE + SQLWARNINIG STABLE START STATE STATEMENT STATIC STATISTICS + STDIN STDOUT STORAGE STRICT STRUCTURE STYPE SUBCLASS_ORIGIN + SUBLIST SUBSTRING SUM SYMMETRIC SYSID SYSTEM SYSTEM_USER + TABLE TABLE_NAME TEMP TEMPLATE TEMPORARY TERMINATE THAN THEN + TIMEZONE_HOUR TIMEZONE_MINUTE TO TOAST TRAILING + TRANSATION TRANSACTIONS_COMMITTED TRANSACTIONS_ROLLED_BACK + TRANSATION_ACTIVE TRANSFORM TRANSFORMS TRANSLATE TRANSLATION + TREAT TRIGGER TRIGGER_CATALOG TRIGGER_NAME TRIGGER_SCHEMA TRIM + TRUE TRUNCATE TRUSTED TYPE UNCOMMITTED UNDER UNENCRYPTED UNION + UNIQUE UNKNOWN UNLISTEN UNNAMED UNNEST UNTIL UPDATE UPPER + USAGE USER USER_DEFINED_TYPE_CATALOG USER_DEFINED_TYPE_NAME + USER_DEFINED_TYPE_SCHEMA USING VACUUM VALID VALIDATOR VALUES + VARIABLE VERBOSE VERSION VIEW VOLATILE WHEN WHENEVER WHERE + WITH WITHOUT WORK WRITE ZONE + ) + end + + def self.keywords_type + # sources: + # https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html + # https://dev.mysql.com/doc/refman/5.7/en/date-and-time-type-overview.html + # https://dev.mysql.com/doc/refman/5.7/en/string-type-overview.html + @keywords_type ||= Set.new(%w( + ZEROFILL UNSIGNED SIGNED SERIAL BIT TINYINT BOOL BOOLEAN SMALLINT + MEDIUMINT INT INTEGER BIGINT DECIMAL DEC NUMERIC FIXED FLOAT DOUBLE + PRECISION REAL + DATE DATETIME TIMESTAMP TIME YEAR + NATIONAL CHAR CHARACTER NCHAR BYTE + VARCHAR VARYING BINARY VARBINARY TINYBLOB TINYTEXT BLOB TEXT + MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT ENUM + )) + end + + state :root do + rule %r/\s+/m, Text + rule %r/--.*/, Comment::Single + rule %r(/\*), Comment::Multiline, :multiline_comments + rule %r/\d+/, Num::Integer + rule %r/'/, Str::Single, :single_string + # A double-quoted string refers to a database object in our default SQL + # dialect, which is apropriate for e.g. MS SQL and PostgreSQL. + rule %r/"/, Name::Variable, :double_string + rule %r/`/, Name::Variable, :backtick + + rule %r/\w[\w\d]*/ do |m| + if self.class.keywords_type.include? m[0].upcase + token Name::Builtin + elsif self.class.keywords.include? m[0].upcase + token Keyword + else + token Name + end + end + + rule %r([+*/<>=~!@#%&|?^-]), Operator + rule %r/[;:()\[\],.]/, Punctuation + end + + state :multiline_comments do + rule %r(/[*]), Comment::Multiline, :multiline_comments + rule %r([*]/), Comment::Multiline, :pop! + rule %r([^/*]+), Comment::Multiline + rule %r([/*]), Comment::Multiline + end + + state :backtick do + rule %r/\\./, Str::Escape + rule %r/``/, Str::Escape + rule %r/`/, Name::Variable, :pop! + rule %r/[^\\`]+/, Name::Variable + end + + state :single_string do + rule %r/\\./, Str::Escape + rule %r/''/, Str::Escape + rule %r/'/, Str::Single, :pop! + rule %r/[^\\']+/, Str::Single + end + + state :double_string do + rule %r/\\./, Str::Escape + rule %r/""/, Str::Escape + rule %r/"/, Name::Variable, :pop! + rule %r/[^\\"]+/, Name::Variable + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ssh.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ssh.rb new file mode 100644 index 000000000000..11369e6faff1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ssh.rb @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class SSH < RegexLexer + tag 'ssh' + + title "SSH Config File" + desc 'A lexer for SSH configuration files' + filenames 'ssh_config' + + state :root do + rule %r/[a-z0-9]+/i, Keyword, :statement + mixin :base + end + + state :statement do + rule %r/\n/, Text, :pop! + rule %r/(?:yes|no|confirm|ask|always|auto|none|force)\b/, Name::Constant + + rule %r/\d+/, Num + rule %r/[^#\s;{}$\\]+/, Text + mixin :base + end + + state :base do + rule %r/\s+/, Text + rule %r/#.*/, Comment::Single + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/supercollider.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/supercollider.rb new file mode 100644 index 000000000000..51bf90c96593 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/supercollider.rb @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class SuperCollider < RegexLexer + tag 'supercollider' + filenames '*.sc', '*.scd' + + title "SuperCollider" + desc 'A cross-platform interpreted programming language for sound synthesis, algorithmic composition, and realtime performance' + + def self.keywords + @keywords ||= Set.new %w( + var arg classvar const super this + ) + end + + # these aren't technically keywords, but we treat + # them as such because it makes things clearer 99% + # of the time + def self.reserved + @reserved ||= Set.new %w( + case do for forBy loop if while new newCopyArgs + ) + end + + def self.constants + @constants ||= Set.new %w( + true false nil inf thisThread + thisMethod thisFunction thisProcess + thisFunctionDef currentEnvironment + topEnvironment + ) + end + + state :whitespace do + rule %r/\s+/m, Text + end + + state :comments do + rule %r(//.*?$), Comment::Single + rule %r(/[*]) do + token Comment::Multiline + push :nested_comment + end + end + + state :nested_comment do + rule %r(/[*]), Comment::Multiline, :nested_comment + rule %r([*]/), Comment::Multiline, :pop! + rule %r([^*/]+)m, Comment::Multiline + rule %r/./, Comment::Multiline + end + + state :root do + mixin :whitespace + mixin :comments + + rule %r/[\-+]?0[xX]\h+/, Num::Hex + + # radix float + rule %r/[\-+]?\d+r[0-9a-zA-Z]*(\.[0-9A-Z]*)?/, Num::Float + + # normal float + rule %r/[\-+]?((\d+(\.\d+)?([eE][\-+]?\d+)?(pi)?)|pi)/, Num::Float + + rule %r/[\-+]?\d+/, Num::Integer + + rule %r/\$(\\.|.)/, Str::Char + + rule %r/"([^\\"]|\\.)*"/, Str + + # symbols (single-quote notation) + rule %r/'([^\\']|\\.)*'/, Str::Other + + # symbols (backslash notation) + rule %r/\\\w+/, Str::Other + + # symbol arg + rule %r/[A-Za-z_]\w*:/, Name::Label + + rule %r/[A-Z]\w*/, Name::Class + + # primitive + rule %r/_\w+/, Name::Function + + # main identifiers section + rule %r/[a-z]\w*/ do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.constants.include? m[0] + token Keyword::Constant + elsif self.class.reserved.include? m[0] + token Keyword::Reserved + else + token Name + end + end + + # environment variables + rule %r/~\w+/, Name::Variable::Global + + rule %r/[\{\}()\[\];,\.]/, Punctuation + + # operators. treat # (array unpack) as an operator + rule %r/[\+\-\*\/&\|%<>=]+/, Operator + rule %r/[\^:#]/, Operator + + # treat curry argument as a special operator + rule %r/\b_\b/, Name::Builtin + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/swift.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/swift.rb new file mode 100644 index 000000000000..45c04c56f939 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/swift.rb @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Swift < RegexLexer + tag 'swift' + filenames '*.swift' + + title "Swift" + desc 'Multi paradigm, compiled programming language developed by Apple for iOS and OS X development. (developer.apple.com/swift)' + + id_head = /_|(?!\p{Mc})\p{Alpha}|[^\u0000-\uFFFF]/ + id_rest = /[\p{Alnum}_]|[^\u0000-\uFFFF]/ + id = /#{id_head}#{id_rest}*/ + + keywords = Set.new %w( + break case continue default do else fallthrough if in for return switch where while try catch throw guard defer repeat + + as dynamicType is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ __LINE__ + + associativity didSet get infix inout mutating none nonmutating operator override postfix precedence prefix set unowned weak willSet throws rethrows precedencegroup + + #available #colorLiteral #column #else #elseif #endif #error #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation #warning + ) + + declarations = Set.new %w( + class deinit enum convenience extension final func import init internal lazy let optional private protocol public required static struct subscript typealias var dynamic indirect associatedtype open fileprivate some + ) + + constants = Set.new %w( + true false nil + ) + + start { push :bol } + + # beginning of line + state :bol do + rule %r/#.*/, Comment::Preproc + + mixin :inline_whitespace + + rule(//) { pop! } + end + + state :inline_whitespace do + rule %r/\s+/m, Text + mixin :has_comments + end + + state :whitespace do + rule %r/\n+/m, Text, :bol + rule %r(\/\/.*?$), Comment::Single, :bol + mixin :inline_whitespace + end + + state :has_comments do + rule %r(/[*]), Comment::Multiline, :nested_comment + end + + state :nested_comment do + mixin :has_comments + rule %r([*]/), Comment::Multiline, :pop! + rule %r([^*/]+)m, Comment::Multiline + rule %r/./, Comment::Multiline + end + + state :root do + mixin :whitespace + + rule %r/\$(([1-9]\d*)?\d)/, Name::Variable + + rule %r{[()\[\]{}:;,?\\]}, Punctuation + rule %r([-/=+*%<>!&|^.~]+), Operator + rule %r/@?"/, Str, :dq + rule %r/'(\\.|.)'/, Str::Char + rule %r/(\d+(?:_\d+)*\*|(?:\d+(?:_\d+)*)*\.\d+(?:_\d)*)(e[+-]?\d+(?:_\d)*)?/i, Num::Float + rule %r/\d+e[+-]?[0-9]+/i, Num::Float + rule %r/0o?[0-7]+(?:_[0-7]+)*/, Num::Oct + rule %r/0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*((\.[0-9A-F]+(?:_[0-9A-F]+)*)?p[+-]?\d+)?/, Num::Hex + rule %r/0b[01]+(?:_[01]+)*/, Num::Bin + rule %r{[\d]+(?:_\d+)*}, Num::Integer + + rule %r/@#{id}/, Keyword::Declaration + + rule %r/(private|internal)(\([ ]*)(\w+)([ ]*\))/ do |m| + if m[3] == 'set' + token Keyword::Declaration + else + groups Keyword::Declaration, Keyword::Declaration, Error, Keyword::Declaration + end + end + + rule %r/(unowned\([ ]*)(\w+)([ ]*\))/ do |m| + if m[2] == 'safe' || m[2] == 'unsafe' + token Keyword::Declaration + else + groups Keyword::Declaration, Error, Keyword::Declaration + end + end + + rule %r/#available\([^)]+\)/, Keyword::Declaration + + rule %r/(#(?:selector|keyPath)\()([^)]+?(?:[(].*?[)])?)(\))/ do + groups Keyword::Declaration, Name::Function, Keyword::Declaration + end + + rule %r/#(line|file|column|function|dsohandle)/, Keyword::Declaration + + rule %r/(let|var)\b(\s*)(#{id})/ do + groups Keyword, Text, Name::Variable + end + + rule %r/(let|var)\b(\s*)([(])/ do + groups Keyword, Text, Punctuation + push :tuple + end + + rule %r/(?!\b(if|while|for|private|internal|unowned|switch|case)\b)\b#{id}(?=(\?|!)?\s*[(])/ do |m| + if m[0] =~ /^[[:upper:]]/ + token Keyword::Type + else + token Name::Function + end + end + + rule %r/as[?!]?(?=\s)/, Keyword + rule %r/try[!]?(?=\s)/, Keyword + + rule %r/(#?(?!default)(?![[:upper:]])#{id})(\s*)(:)/ do + groups Name::Variable, Text, Punctuation + end + + rule id do |m| + if keywords.include? m[0] + token Keyword + elsif declarations.include? m[0] + token Keyword::Declaration + elsif constants.include? m[0] + token Keyword::Constant + elsif m[0] =~ /^[[:upper:]]/ + token Keyword::Type + else + token Name + end + end + + rule %r/(`)(#{id})(`)/ do + groups Punctuation, Name::Variable, Punctuation + end + end + + state :tuple do + rule %r/(#{id})/, Name::Variable + rule %r/(`)(#{id})(`)/ do + groups Punctuation, Name::Variable, Punctuation + end + rule %r/,/, Punctuation + rule %r/[(]/, Punctuation, :push + rule %r/[)]/, Punctuation, :pop! + mixin :inline_whitespace + end + + state :dq do + rule %r/\\[\\0tnr'"]/, Str::Escape + rule %r/\\[(]/, Str::Escape, :interp + rule %r/\\u\{\h{1,8}\}/, Str::Escape + rule %r/[^\\"]+/, Str + rule %r/"""/, Str, :pop! + rule %r/"/, Str, :pop! + end + + state :interp do + rule %r/[(]/, Punctuation, :interp_inner + rule %r/[)]/, Str::Escape, :pop! + mixin :root + end + + state :interp_inner do + rule %r/[(]/, Punctuation, :push + rule %r/[)]/, Punctuation, :pop! + mixin :root + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/systemd.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/systemd.rb new file mode 100644 index 000000000000..5d0ee7c921af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/systemd.rb @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class SystemD < RegexLexer + tag 'systemd' + aliases 'unit-file' + filenames '*.service' + mimetypes 'text/x-systemd-unit' + desc 'A lexer for systemd unit files' + + state :root do + rule %r/\s+/, Text + rule %r/[;#].*/, Comment + rule %r/\[.*?\]$/, Keyword + rule %r/(.*?)(=)(.*)(\\\n)/ do + groups Name::Tag, Punctuation, Text, Str::Escape + push :continuation + end + rule %r/(.*?)(=)(.*)/ do + groups Name::Tag, Punctuation, Text + end + end + + state :continuation do + rule %r/(.*?)(\\\n)/ do + groups Text, Str::Escape + end + rule %r/(.*)'/, Text, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tap.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tap.rb new file mode 100644 index 000000000000..6fbc93534071 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tap.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + class Tap < RegexLexer + title 'TAP' + desc 'Test Anything Protocol' + tag 'tap' + aliases 'tap' + filenames '*.tap' + + mimetypes 'text/x-tap', 'application/x-tap' + + state :root do + # A TAP version may be specified. + rule %r/^TAP version \d+\n/, Name::Namespace + + # Specify a plan with a plan line. + rule %r/^1\.\.\d+/, Keyword::Declaration, :plan + + # A test failure + rule %r/^(not ok)([^\S\n]*)(\d*)/ do + groups Generic::Error, Text, Literal::Number::Integer + push :test + end + + # A test success + rule %r/^(ok)([^\S\n]*)(\d*)/ do + groups Keyword::Reserved, Text, Literal::Number::Integer + push :test + end + + # Diagnostics start with a hash. + rule %r/^#.*\n/, Comment + + # TAP's version of an abort statement. + rule %r/^Bail out!.*\n/, Generic::Error + + # # TAP ignores any unrecognized lines. + rule %r/^.*\n/, Text + end + + state :plan do + # Consume whitespace (but not newline). + rule %r/[^\S\n]+/, Text + + # A plan may have a directive with it. + rule %r/#/, Comment, :directive + + # Or it could just end. + rule %r/\n/, Comment, :pop! + + # Anything else is wrong. + rule %r/.*\n/, Generic::Error, :pop! + end + + state :test do + # Consume whitespace (but not newline). + rule %r/[^\S\n]+/, Text + + # A test may have a directive with it. + rule %r/#/, Comment, :directive + + rule %r/\S+/, Text + + rule %r/\n/, Text, :pop! + end + + state :directive do + # Consume whitespace (but not newline). + rule %r/[^\S\n]+/, Comment + + # Extract todo items. + rule %r/(?i)\bTODO\b/, Comment::Preproc + + # Extract skip items. + rule %r/(?i)\bSKIP\S*/, Comment::Preproc + + rule %r/\S+/, Comment + + rule %r/\n/ do + token Comment + pop! 2 + end + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tcl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tcl.rb new file mode 100644 index 000000000000..e73730ae3fe7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tcl.rb @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class TCL < RegexLexer + title "Tcl" + desc "The Tool Command Language (tcl.tk)" + tag 'tcl' + filenames '*.tcl' + mimetypes 'text/x-tcl', 'text/x-script.tcl', 'application/x-tcl' + + def self.detect?(text) + return true if text.shebang? 'tclsh' + return true if text.shebang? 'wish' + return true if text.shebang? 'jimsh' + end + + KEYWORDS = %w( + after apply array break catch continue elseif else error + eval expr for foreach global if namespace proc rename return + set switch then trace unset update uplevel upvar variable + vwait while + ) + + BUILTINS = %w( + append bgerror binary cd chan clock close concat dde dict + encoding eof exec exit fblocked fconfigure fcopy file + fileevent flush format gets glob history http incr info interp + join lappend lassign lindex linsert list llength load loadTk + lrange lrepeat lreplace lreverse lsearch lset lsort mathfunc + mathop memory msgcat open package pid pkg::create pkg_mkIndex + platform platform::shell puts pwd re_syntax read refchan + regexp registry regsub scan seek socket source split string + subst tell time tm unknown unload + ) + + OPEN = %w| \( \[ \{ " | + CLOSE = %w| \) \] \} | + ALL = OPEN + CLOSE + END_LINE = CLOSE + %w(; \n) + END_WORD = END_LINE + %w(\r \t \v) + + CHARS = lambda { |list| Regexp.new %/[#{list.join}]/ } + NOT_CHARS = lambda { |list| Regexp.new %/[^#{list.join}]/ } + + state :word do + rule %r/\{\*\}/, Keyword + + mixin :brace_abort + mixin :interp + rule %r/\{/, Punctuation, :brace + rule %r/\(/, Punctuation, :paren + rule %r/"/, Str::Double, :string + rule %r/#{NOT_CHARS[END_WORD]}+?(?=#{CHARS[OPEN+['\\\\']]})/, Text + end + + def self.gen_command_state(name='') + state(:"command#{name}") do + mixin :word + + rule %r/##{NOT_CHARS[END_LINE]}+/, Comment::Single + + rule %r/(?=#{CHARS[END_WORD]})/ do + push :"params#{name}" + end + + rule %r/#{NOT_CHARS[END_WORD]}+/ do |m| + if KEYWORDS.include? m[0] + token Keyword + elsif BUILTINS.include? m[0] + token Name::Builtin + else + token Text + end + end + + mixin :whitespace + end + end + + def self.gen_delimiter_states(name, close, opts={}) + gen_command_state("_in_#{name}") + + state :"params_in_#{name}" do + rule close do + token Punctuation + pop! 2 + end + + # mismatched delimiters. Braced strings with mismatched + # closing delimiters should be okay, since this is standard + # practice, like {]]]]} + if opts[:strict] + rule CHARS[CLOSE - [close]], Error + else + rule CHARS[CLOSE - [close]], Text + end + + mixin :params + end + + state name do + rule close, Punctuation, :pop! + mixin :"command_in_#{name}" + end + end + + + # tcl is freaking impossible. If we're in braces and we encounter + # a close brace, we have to drop everything and close the brace. + # This is so silly things like {abc"def} and {abc]def} don't b0rk + # everything after them. + + # TODO: TCL seems to have this aborting behavior quite a lot. + # such things as [ abc" ] are a runtime error, but will still + # parse. Currently something like this will muck up the lex. + state :brace_abort do + rule %r/}/ do + if in_state? :brace + pop! until state? :brace + pop! + token Punctuation + else + token Error + end + end + end + + state :params do + rule %r/;/, Punctuation, :pop! + rule %r/\n/, Text, :pop! + rule %r/else|elseif|then/, Keyword + mixin :word + mixin :whitespace + rule %r/#{NOT_CHARS[END_WORD]}+/, Text + end + + gen_delimiter_states :brace, /\}/, :strict => false + gen_delimiter_states :paren, /\)/, :strict => true + gen_delimiter_states :bracket, /\]/, :strict => true + gen_command_state + + state :root do + mixin :command + end + + state :whitespace do + # not a multiline regex because we want to capture \n sometimes + rule %r/\s+/, Text + end + + state :interp do + rule %r/\[/, Punctuation, :bracket + rule %r/\$[a-z0-9.:-]+/, Name::Variable + rule %r/\$\{.*?\}/m, Name::Variable + rule %r/\$/, Text + + # escape sequences + rule %r/\\[0-7]{3}/, Str::Escape + rule %r/\\x[0-9a-f]{2}/i, Str::Escape + rule %r/\\u[0-9a-f]{4}/i, Str::Escape + rule %r/\\./m, Str::Escape + end + + state :string do + rule %r/"/, Str::Double, :pop! + mixin :interp + rule %r/[^\\\[\$"{}]+/m, Str::Double + + # strings have to keep count of their internal braces, to support + # for example { "{ }" }. + rule %r/{/ do + @brace_count ||= 0 + @brace_count += 1 + + token Str::Double + end + + rule %r/}/ do + if in_state? :brace and @brace_count.to_i == 0 + pop! until state? :brace + pop! + token Punctuation + else + @brace_count -= 1 + token Str::Double + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/terraform.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/terraform.rb new file mode 100644 index 000000000000..8b9545552fc2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/terraform.rb @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'hcl.rb' + + class Terraform < Hcl + title "Terraform" + desc "Terraform HCL Interpolations" + + tag 'terraform' + aliases 'tf' + filenames '*.tf' + + def self.keywords + @keywords ||= Set.new %w( + terraform module provider variable resource data provisioner output + ) + end + + def self.declarations + @declarations ||= Set.new %w( + var local + ) + end + + def self.reserved + @reserved ||= Set.new %w() + end + + def self.constants + @constants ||= Set.new %w(true false null) + end + + def self.builtins + @builtins ||= %w() + end + + prepend :hash do + rule %r/[.,()*]/, Punctuation + end + + prepend :array do + rule %r/[.,()*]/, Punctuation + end + + state :strings do + rule %r/\\./, Str::Escape + rule %r/\$\{/ do + token Keyword + push :interpolation + end + end + + state :dq do + rule %r/[^\\"\$]+/, Str::Double + mixin :strings + rule %r/"/, Str::Double, :pop! + end + + state :sq do + rule %r/[^\\'\$]+/, Str::Single + mixin :strings + rule %r/'/, Str::Single, :pop! + end + + state :heredoc do + rule %r/\n/, Str::Heredoc, :heredoc_nl + rule %r/[^$\n]+/, Str::Heredoc + rule %r/[$]/, Str::Heredoc + mixin :strings + end + + state :interpolation do + rule %r/\}/ do + token Keyword + pop! + end + + mixin :expression + end + + state :regexps do + rule %r/"\// do + token Str::Delimiter + goto :regexp_inner + end + end + + state :regexp_inner do + rule %r/[^"\/\\]+/, Str::Regex + rule %r/\\./, Str::Regex + rule %r/\/"/, Str::Delimiter, :pop! + rule %r/["\/]/, Str::Regex + end + + id = /[$a-z_\-][a-z0-9_\-]*/io + + state :expression do + mixin :regexps + mixin :primitives + rule %r/\s+/, Text + + rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | == | != )x, Operator + rule %r([-<>+*%&|\^/!=?:]=?), Operator + rule %r/[(\[,]/, Punctuation + rule %r/[)\].]/, Punctuation + + rule id do |m| + if self.class.keywords.include? m[0] + token Keyword + elsif self.class.declarations.include? m[0] + token Keyword::Declaration + elsif self.class.reserved.include? m[0] + token Keyword::Reserved + elsif self.class.constants.include? m[0] + token Keyword::Constant + elsif self.class.builtins.include? m[0] + token Name::Builtin + else + token Name::Other + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tex.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tex.rb new file mode 100644 index 000000000000..52f4f58ab0af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tex.rb @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class TeX < RegexLexer + title "TeX" + desc "The TeX typesetting system" + tag 'tex' + aliases 'TeX', 'LaTeX', 'latex' + + filenames '*.tex', '*.aux', '*.toc', '*.sty', '*.cls' + mimetypes 'text/x-tex', 'text/x-latex' + + def self.detect?(text) + return true if text =~ /\A\s*\\(documentclass|input|documentstyle|relax|ProvidesPackage|ProvidesClass)/ + end + + command = /\\([a-z]+|\s+|.)/i + + state :general do + rule %r/%.*$/, Comment + rule %r/[{}&_^]/, Punctuation + end + + state :root do + rule %r/\\\[/, Punctuation, :displaymath + rule %r/\\\(/, Punctuation, :inlinemath + rule %r/\$\$/, Punctuation, :displaymath + rule %r/\$/, Punctuation, :inlinemath + rule %r/\\(begin|end)\{.*?\}/, Name::Tag + + rule %r/(\\verb)\b(\S)(.*?)(\2)/ do + groups Name::Builtin, Keyword::Pseudo, Str::Other, Keyword::Pseudo + end + + rule command, Keyword, :command + mixin :general + rule %r/[^\\$%&_^{}]+/, Text + end + + state :math do + rule command, Name::Variable + mixin :general + rule %r/[0-9]+/, Num + rule %r/[-=!+*\/()\[\]]/, Operator + rule %r/[^=!+*\/()\[\]\\$%&_^{}0-9-]+/, Name::Builtin + end + + state :inlinemath do + rule %r/\\\)/, Punctuation, :pop! + rule %r/\$/, Punctuation, :pop! + mixin :math + end + + state :displaymath do + rule %r/\\\]/, Punctuation, :pop! + rule %r/\$\$/, Punctuation, :pop! + rule %r/\$/, Name::Builtin + mixin :math + end + + state :command do + rule %r/\[.*?\]/, Name::Attribute + rule %r/\*/, Keyword + rule(//) { pop! } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/toml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/toml.rb new file mode 100644 index 000000000000..f931e26898ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/toml.rb @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class TOML < RegexLexer + title "TOML" + desc 'the TOML configuration format (https://github.com/mojombo/toml)' + tag 'toml' + + filenames '*.toml', 'Pipfile' + mimetypes 'text/x-toml' + + identifier = /\S+/ + + state :basic do + rule %r/\s+/, Text + rule %r/#.*?$/, Comment + rule %r/(true|false)/, Keyword::Constant + + rule %r/(\S+)(\s*)(=)(\s*)(\{)/ do |m| + groups Name::Namespace, Text, Operator, Text, Punctuation + push :inline + end + + rule %r/(?<!=)\s*\[[\S]+\]/, Name::Namespace + + rule %r/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z/, Literal::Date + + rule %r/(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?/, Num::Float + rule %r/\d+[eE][+-]?[0-9]+j?/, Num::Float + rule %r/\-?\d+/, Num::Integer + end + + state :root do + mixin :basic + + rule %r/(#{identifier})(\s*)(=)/ do + groups Name::Property, Text, Punctuation + push :value + end + end + + state :value do + rule %r/\n/, Text, :pop! + mixin :content + end + + state :content do + mixin :basic + rule %r/"""/, Str, :mdq + rule %r/"/, Str, :dq + rule %r/'''/, Str, :msq + rule %r/'/, Str, :sq + mixin :esc_str + rule %r/\,/, Punctuation + rule %r/\[/, Punctuation, :array + end + + state :dq do + rule %r/"/, Str, :pop! + rule %r/\n/, Error, :pop! + mixin :esc_str + rule %r/[^\\"\n]+/, Str + end + + state :mdq do + rule %r/"""/, Str, :pop! + mixin :esc_str + rule %r/[^\\"]+/, Str + rule %r/"+/, Str + end + + state :sq do + rule %r/'/, Str, :pop! + rule %r/\n/, Error, :pop! + rule %r/[^'\n]+/, Str + end + + state :msq do + rule %r/'''/, Str, :pop! + rule %r/[^']+/, Str + rule %r/'+/, Str + end + + state :esc_str do + rule %r/\\[0t\tn\n "\\r]/, Str::Escape + end + + state :array do + mixin :content + rule %r/\]/, Punctuation, :pop! + end + + state :inline do + mixin :content + + rule %r/(#{identifier})(\s*)(=)/ do + groups Name::Property, Text, Punctuation + end + + rule %r/\}/, Punctuation, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tsx.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tsx.rb new file mode 100644 index 000000000000..e1b670adffba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tsx.rb @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'jsx.rb' + load_lexer 'typescript/common.rb' + + class TSX < JSX + extend TypescriptCommon + + title 'TSX' + desc 'TypeScript-compatible JSX (www.typescriptlang.org/docs/handbook/jsx.html)' + + tag 'tsx' + filenames '*.tsx' + + prepend :element_name do + rule %r/(\w+)(,)/ do + groups Name::Other, Punctuation + pop! 3 + end + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ttcn3.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ttcn3.rb new file mode 100644 index 000000000000..4b8b27d35c21 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/ttcn3.rb @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class TTCN3 < RegexLexer + title "TTCN3" + desc "The TTCN3 programming language (ttcn-3.org)" + + tag 'ttcn3' + filenames '*.ttcn', '*.ttcn3' + mimetypes 'text/x-ttcn3', 'text/x-ttcn' + + def self.keywords + @keywords ||= %w( + module import group type port component signature external + execute const template function altstep testcase var timer if + else select case for while do label goto start stop return + break int2char int2unichar int2bit int2enum int2hex int2oct + int2str int2float float2int char2int char2oct unichar2int + unichar2oct bit2int bit2hex bit2oct bit2str hex2int hex2bit + hex2oct hex2str oct2int oct2bit oct2hex oct2str oct2char + oct2unichar str2int str2hex str2oct str2float enum2int + any2unistr lengthof sizeof ispresent ischosen isvalue isbound + istemplatekind regexp substr replace encvalue decvalue + encvalue_unichar decvalue_unichar encvalue_o decvalue_o + get_stringencoding remove_bom rnd hostid send receive + setverdict + ) + end + + def self.reserved + @reserved ||= %w( + all alt apply assert at configuration conjunct const control + delta deterministic disjunct duration fail finished fuzzy from + history implies inconc inv lazy mod mode notinv now omit + onentry onexit par pass prev realtime seq setstate static + stepsize stream timestamp until values wait + ) + end + + def self.types + @types ||= %w( + anytype address boolean bitstring charstring hexstring octetstring + component enumerated float integer port record set of union universal + ) + end + + # optional comment or whitespace + ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+) + id = /[a-zA-Z_]\w*/ + digit = /\d_+\d|\d/ + bin_digit = /[01]_+[01]|[01]/ + oct_digit = /[0-7]_+[0-7]|[0-7]/ + hex_digit = /\h_+\h|\h/ + + state :statements do + rule %r/\n+/m, Text + rule %r/[ \t\r]+/, Text + rule %r/\\\n/, Text # line continuation + + rule %r(//(\\.|.)*?$), Comment::Single + rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline + + rule %r/"/, Str, :string + rule %r/'(?:\\.|[^\\]|\\u[0-9a-f]{4})'/, Str::Char + + rule %r/#{digit}+\.#{digit}+([eE]#{digit}+)?[fd]?/i, Num::Float + rule %r/'#{bin_digit}+'B/i, Num::Bin + rule %r/'#{hex_digit}+'H/i, Num::Hex + rule %r/'#{oct_digit}+'O/i, Num::Oct + rule %r/#{digit}+/i, Num::Integer + + rule %r([~!%^&*+:=\|?<>/-]), Operator + rule %r/[()\[\]{},.;:]/, Punctuation + + rule %r/(?:true|false|null)\b/, Name::Builtin + + rule id do |m| + name = m[0] + if self.class.keywords.include? name + token Keyword + elsif self.class.types.include? name + token Keyword::Type + elsif self.class.reserved.include? name + token Keyword::Reserved + else + token Name + end + end + end + + state :root do + rule %r/module\b/, Keyword::Declaration, :module + rule %r/import\b/, Keyword::Namespace, :import + + mixin :statements + end + + state :string do + rule %r/"/, Str, :pop! + rule %r/\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape + rule %r/[^\\"\n]+/, Str + rule %r/\\\n/, Str + rule %r/\\/, Str # stray backslash + end + + state :module do + rule %r/\s+/m, Text + rule id, Name::Class, :pop! + end + + state :import do + rule %r/\s+/m, Text + rule %r/[\w.]+\*?/, Name::Namespace, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tulip.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tulip.rb new file mode 100644 index 000000000000..acf45240151f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/tulip.rb @@ -0,0 +1,108 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + class Tulip < RegexLexer + desc 'the tulip programming language (twitter.com/tuliplang)' + tag 'tulip' + aliases 'tulip' + + filenames '*.tlp' + + mimetypes 'text/x-tulip', 'application/x-tulip' + + def self.detect?(text) + return true if text.shebang? 'tulip' + end + + id = /[a-z][\w-]*/i + upper_id = /[A-Z][\w-]*/ + + state :comments_and_whitespace do + rule %r/\s+/, Text + rule %r/#.*?$/, Comment + end + + state :root do + mixin :comments_and_whitespace + + rule %r/@#{id}/, Keyword + + + rule %r/(\\#{id})([{])/ do + groups Name::Function, Str + push :nested_string + end + + rule %r/([+]#{id})([{])/ do + groups Name::Decorator, Str + push :nested_string + end + + rule %r/\\#{id}/, Name::Function + rule %r/[+]#{id}/, Name::Decorator + + rule %r/"[{]/, Str, :dqi + rule %r/"/, Str, :dq + + rule %r/'{/, Str, :nested_string + rule %r/'#{id}/, Str + + rule %r/[.]#{id}/, Name::Tag + rule %r/[$]#{id}?/, Name::Variable + rule %r/-#{id}:?/, Name::Label + rule %r/%#{id}/, Name::Function + rule %r/`#{id}/, Operator::Word + + rule %r/[?~%._>,!\[\]:{}()=;\/-]/, Punctuation + + rule %r/[0-9]+([.][0-9]+)?/, Num + + rule %r/#{id}/, Name + + rule %r/</, Comment::Preproc, :angle_brackets + end + + state :dq do + rule %r/[^\\"]+/, Str + rule %r/"/, Str, :pop! + rule %r/\\./, Str::Escape + end + + state :dqi do + rule %r/[$][(]/, Str::Interpol, :interp_root + rule %r/[{]/, Str, :dqi + rule %r/[}]/, Str, :pop! + rule %r/[^{}$]+/, Str + rule %r/./, Str + end + + state :interp_root do + rule %r/[)]/, Str::Interpol, :pop! + mixin :interp + end + + state :interp do + rule %r/[(]/, Punctuation, :interp + rule %r/[)]/, Punctuation, :pop! + mixin :root + end + + state :nested_string do + rule %r/\\./, Str::Escape + rule(/{/) { token Str; push :nested_string } + rule(/}/) { token Str; pop! } + rule(/[^{}\\]+/) { token Str } + end + + state :angle_brackets do + mixin :comments_and_whitespace + rule %r/>/, Comment::Preproc, :pop! + rule %r/[*:]/, Punctuation + rule %r/#{upper_id}/, Keyword::Type + rule %r/#{id}/, Name::Variable + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/turtle.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/turtle.rb new file mode 100644 index 000000000000..46d5f4c6a2c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/turtle.rb @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Turtle < RegexLexer + title "Turtle/TriG" + desc "Terse RDF Triple Language, TriG" + tag 'turtle' + filenames '*.ttl', '*.trig' + mimetypes 'text/turtle', 'application/trig' + + state :root do + rule %r/@base\b/, Keyword::Declaration + rule %r/@prefix\b/, Keyword::Declaration + rule %r/true\b/, Keyword::Constant + rule %r/false\b/, Keyword::Constant + + rule %r/""".*?"""/m, Literal::String + rule %r/"([^"\\]|\\.)*"/, Literal::String + rule %r/'''.*?'''/m, Literal::String + rule %r/'([^'\\]|\\.)*'/, Literal::String + + rule %r/#.*$/, Comment::Single + + rule %r/@[^\s,.;]+/, Name::Attribute + + rule %r/[+-]?[0-9]+\.[0-9]*E[+-]?[0-9]+/, Literal::Number::Float + rule %r/[+-]?\.[0-9]+E[+-]?[0-9]+/, Literal::Number::Float + rule %r/[+-]?[0-9]+E[+-]?[0-9]+/, Literal::Number::Float + + rule %r/[+-]?[0-9]*\.[0-9]+?/, Literal::Number::Float + + rule %r/[+-]?[0-9]+/, Literal::Number::Integer + + rule %r/\./, Punctuation + rule %r/,/, Punctuation + rule %r/;/, Punctuation + rule %r/\(/, Punctuation + rule %r/\)/, Punctuation + rule %r/\{/, Punctuation + rule %r/\}/, Punctuation + rule %r/\[/, Punctuation + rule %r/\]/, Punctuation + rule %r/\^\^/, Punctuation + + rule %r/<[^>]*>/, Name::Label + + rule %r/base\b/i, Keyword::Declaration + rule %r/prefix\b/i, Keyword::Declaration + rule %r/GRAPH\b/, Keyword + rule %r/a\b/, Keyword + + rule %r/\s+/, Text::Whitespace + + rule %r/[^:;<>#\@"\(\).\[\]\{\} ]*:/, Name::Namespace + rule %r/[^:;<>#\@"\(\).\[\]\{\} ]+/, Name + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/twig.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/twig.rb new file mode 100644 index 000000000000..a33d0556d459 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/twig.rb @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'jinja.rb' + + class Twig < Jinja + title "Twig" + desc "Twig template engine (twig.sensiolabs.org)" + + tag "twig" + + filenames '*.twig' + + mimetypes 'application/x-twig', 'text/html+twig' + + def self.keywords + @@keywords ||= %w(as do extends flush from import include use else starts + ends with without autoescape endautoescape block + endblock embed endembed filter endfilter for endfor + if endif macro endmacro sandbox endsandbox set endset + spaceless endspaceless) + end + + def self.tests + @@tests ||= %w(constant defined divisibleby empty even iterable null odd + sameas) + end + + def self.pseudo_keywords + @@pseudo_keywords ||= %w(true false none) + end + + def self.word_operators + @@word_operators ||= %w(b-and b-or b-xor is in and or not) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/typescript.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/typescript.rb new file mode 100644 index 000000000000..270d97df43e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/typescript.rb @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'javascript.rb' + load_lexer 'typescript/common.rb' + + class Typescript < Javascript + extend TypescriptCommon + + title "TypeScript" + desc "TypeScript, a superset of JavaScript" + + tag 'typescript' + aliases 'ts' + + filenames '*.ts', '*.d.ts' + + mimetypes 'text/typescript' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/typescript/common.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/typescript/common.rb new file mode 100644 index 000000000000..6611d155ccf2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/typescript/common.rb @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + module TypescriptCommon + def keywords + @keywords ||= super + Set.new(%w( + is namespace static private protected public + implements readonly + )) + end + + def declarations + @declarations ||= super + Set.new(%w( + type abstract + )) + end + + def reserved + @reserved ||= super + Set.new(%w( + string any void number namespace module + declare default interface keyof + )) + end + + def builtins + @builtins ||= super + %w( + Pick Partial Readonly Record + ) + end + + def self.extended(base) + base.prepend :root do + rule %r/[?][.]/, base::Punctuation + rule %r/[?]{2}/, base::Operator + end + + base.prepend :statement do + rule %r/(#{Javascript.id_regex})(\??)(\s*)(:)/ do + groups base::Name::Label, base::Punctuation, base::Text, base::Punctuation + push :expr_start + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vala.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vala.rb new file mode 100644 index 000000000000..26b8933c47b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vala.rb @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Vala < RegexLexer + tag 'vala' + filenames '*.vala' + mimetypes 'text/x-vala' + + title "Vala" + desc 'A programming language similar to csharp.' + + id = /@?[_a-z]\w*/i + + keywords = %w( + abstract as async base break case catch const construct continue + default delegate delete do dynamic else ensures enum errordomain + extern false finally for foreach get global if in inline interface + internal is lock new null out override owned private protected + public ref requires return set signal sizeof static switch this + throw throws true try typeof unowned var value virtual void weak + while yield + ) + + keywords_type = %w( + bool char double float int int8 int16 int32 int64 long short size_t + ssize_t string unichar uint uint8 uint16 uint32 uint64 ulong ushort + ) + + state :whitespace do + rule %r/\s+/m, Text + rule %r(//.*?$), Comment::Single + rule %r(/[*].*?[*]/)m, Comment::Multiline + end + + state :root do + mixin :whitespace + + rule %r/^\s*\[.*?\]/, Name::Attribute + + rule %r/(<\[)\s*(#{id}:)?/, Keyword + rule %r/\]>/, Keyword + + rule %r/[~!%^&*()+=|\[\]{}:;,.<>\/?-]/, Punctuation + rule %r/@"(\\.|.)*?"/, Str + rule %r/"(\\.|.)*?["\n]/, Str + rule %r/'(\\.|.)'/, Str::Char + rule %r/0x[0-9a-f]+[lu]?/i, Num + rule %r( + [0-9] + ([.][0-9]*)? # decimal + (e[+-][0-9]+)? # exponent + [fldu]? # type + )ix, Num + rule %r/\b(#{keywords.join('|')})\b/, Keyword + rule %r/\b(#{keywords_type.join('|')})\b/, Keyword::Type + rule %r/class|struct/, Keyword, :class + rule %r/namespace|using/, Keyword, :namespace + rule %r/#{id}(?=\s*[(])/, Name::Function + rule id, Name + + rule %r/#.*/, Comment::Preproc + end + + state :class do + mixin :whitespace + rule id, Name::Class, :pop! + end + + state :namespace do + mixin :whitespace + rule %r/(?=[(])/, Text, :pop! + rule %r/(#{id}|[.])+/, Name::Namespace, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/varnish.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/varnish.rb new file mode 100644 index 000000000000..07c0c67085b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/varnish.rb @@ -0,0 +1,168 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Varnish < RegexLexer + title 'VCL: Varnish Configuration Language' + desc 'The configuration language for Varnish HTTP Cache (varnish-cache.org)' + + tag 'vcl' + aliases 'varnishconf', 'varnish' + filenames '*.vcl' + mimetypes 'text/x-varnish', 'text/x-vcl' + + SPACE = '[ \f\n\r\t\v]+' + + # backend acl + def self.keywords + @keywords ||= Set.new %w[ + vcl set unset include import if else elseif elif elsif director probe + backend acl + + declare local + BOOL FLOAT INTEGER IP RTIME STRING TIME + ] + end + + def self.functions + @functions ||= Set.new %w[ + ban call hash_data new regsub regsuball return rollback + std.cache_req_body std.collect std.duration std.fileread std.healthy + std.integer std.ip std.log std.port std.querysort std.random std.real + std.real2time std.rollback std.set_ip_tos std.strstr std.syslog + std.time std.time2integer std.time2real std.timestamp std.tolower + std.toupper synth synthetic + ] + end + + def self.variables + @variables ||= Set.new %w[ + bereq bereq.backend bereq.between_bytes_timeout bereq.connect_timeout + bereq.first_byte_timeout bereq.method bereq.proto bereq.retries + bereq.uncacheable bereq.url bereq.xid beresp beresp.age + beresp.backend beresp.backend.ip beresp.backend.name beresp.do_esi + beresp.do_gunzip beresp.do_gzip beresp.do_stream beresp.grace + beresp.keep beresp.proto beresp.reason beresp.status + beresp.storage_hint beresp.ttl beresp.uncacheable beresp.was_304 + client.identity client.ip local.ip now obj.age obj.grace obj.hits + obj.keep obj.proto obj.reason obj.status obj.ttl obj.uncacheable + remote.ip req req.backend_hint req.can_gzip req.esi req.esi_level + req.hash_always_miss req.hash_ignore_busy req.method req.proto + req.restarts req.ttl req.url req.xid resp resp.proto resp.reason + resp.status server.hostname server.identity server.ip + ] + end + + # This is never used + # def self.routines + # @routines ||= Set.new %w[ + # backend_error backend_fetch backend_response purge deliver fini hash + # hit init miss pass pipe recv synth + # ] + # end + + state :root do + # long strings ({" ... "}) + rule %r/\{".*?"}/m, Str::Single + + # heredoc style long strings ({xyz"..."xyz}) + rule %r/\{(\w+)".*?"(\1)\}/m, Str::Single + + # comments + rule %r'/\*.*?\*/'m, Comment::Multiline + rule %r'(?://|#).*', Comment::Single + + rule %r/true|false/, Keyword::Constant + + # "wildcard variables" + var_prefix = Regexp.union(%w(beresp bereq resp req obj)) + rule %r/(?:#{var_prefix})\.http\.[\w.-]+/ do + token Name::Variable + end + + # local variables (var.*) + rule %r/(?:var)\.[\w.-]+/ do + token Name::Variable + end + + rule %r/(sub)(#{SPACE})([\w-]+)/ do + groups Keyword, Text, Name::Function + end + + # inline C (C{ ... }C) + rule %r/C\{/ do + token Comment::Preproc + push :inline_c + end + + rule %r/\.?[a-z_][\w.-]*/i do |m| + next token Keyword if self.class.keywords.include? m[0] + next token Name::Function if self.class.functions.include? m[0] + next token Name::Variable if self.class.variables.include? m[0] + token Text + end + + ## for number literals + + decimal = %r/[0-9]+/ + hex = %r/[0-9a-f]+/i + + numeric = %r{ + (?: + 0x#{hex} + (?:\.#{hex})? + (?:p[+-]?#{hex})? + ) + | + (?: + #{decimal} + (?:\.#{decimal})? + (?:e[+-]?#{decimal})? + ) + }xi + + # duration literals + duration_suffix = Regexp.union(%w(ms s m h d w y)) + rule %r/#{numeric}#{duration_suffix}/, Num::Other + + # numeric literals (integer / float) + rule numeric do |m| + case m[0] + when /^#{decimal}$/ + token Num::Integer + when /^0x#{hex}$/ + token Num::Integer + else + token Num::Float + end + end + + # standard strings + rule %r/"/, Str::Double, :string + + rule %r'[&|+-]{2}|[<=>!*/+-]=|<<|>>|!~|[-+*/%><=!&|~]', Operator + + rule %r/[{}();.,]/, Punctuation + + rule %r/\r\n?|\n/, Text + rule %r/./, Text + end + + state :string do + rule %r/"/, Str::Double, :pop! + rule %r/\\[\\"nt]/, Str::Escape + + rule %r/\r\n?|\n/, Str::Double + rule %r/./, Str::Double + end + + state :inline_c do + rule %r/}C/, Comment::Preproc, :pop! + rule %r/.*?(?=}C)/m do + delegate C + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vb.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vb.rb new file mode 100644 index 000000000000..74870ea16102 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vb.rb @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class VisualBasic < RegexLexer + title "Visual Basic" + desc "Visual Basic" + tag 'vb' + aliases 'visualbasic' + filenames '*.vbs', '*.vb' + mimetypes 'text/x-visualbasic', 'application/x-visualbasic' + + def self.keywords + @keywords ||= Set.new %w( + AddHandler Alias ByRef ByVal CBool CByte CChar CDate CDbl CDec + CInt CLng CObj CSByte CShort CSng CStr CType CUInt CULng CUShort + Call Case Catch Class Const Continue Declare Default Delegate + Dim DirectCast Do Each Else ElseIf End EndIf Enum Erase Error + Event Exit False Finally For Friend Function Get Global GoSub + GoTo Handles If Implements Imports Inherits Interface Let + Lib Loop Me Module MustInherit MustOverride MyBase MyClass + Namespace Narrowing New Next Not NotInheritable NotOverridable + Nothing Of On Operator Option Optional Overloads Overridable + Overrides ParamArray Partial Private Property Protected Public + RaiseEvent ReDim ReadOnly RemoveHandler Resume Return Select Set + Shadows Shared Single Static Step Stop Structure Sub SyncLock + Then Throw To True Try TryCast Using Wend When While Widening + With WithEvents WriteOnly + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + Boolean Byte Char Date Decimal Double Integer Long Object + SByte Short Single String Variant UInteger ULong UShort + ) + end + + def self.operator_words + @operator_words ||= Set.new %w( + AddressOf And AndAlso As GetType In Is IsNot Like Mod Or OrElse + TypeOf Xor + ) + end + + def self.builtins + @builtins ||= Set.new %w( + Console ConsoleColor + ) + end + + id = /[a-z_]\w*/i + upper_id = /[A-Z]\w*/ + + state :whitespace do + rule %r/\s+/, Text + rule %r/\n/, Text, :bol + rule %r/rem\b.*?$/i, Comment::Single + rule %r(%\{.*?%\})m, Comment::Multiline + rule %r/'.*$/, Comment::Single + end + + state :bol do + rule %r/\s+/, Text + rule %r/<.*?>/, Name::Attribute + rule(//) { :pop! } + end + + state :root do + mixin :whitespace + rule %r( + [#]If\b .*? \bThen + | [#]ElseIf\b .*? \bThen + | [#]End \s+ If + | [#]Const + | [#]ExternalSource .*? \n + | [#]End \s+ ExternalSource + | [#]Region .*? \n + | [#]End \s+ Region + | [#]ExternalChecksum + )x, Comment::Preproc + rule %r/[.]/, Punctuation, :dotted + rule %r/[(){}!#,:]/, Punctuation + rule %r/Option\s+(Strict|Explicit|Compare)\s+(On|Off|Binary|Text)/, + Keyword::Declaration + rule %r/End\b/, Keyword, :end + rule %r/(Dim|Const)\b/, Keyword, :dim + rule %r/(Function|Sub|Property)\b/, Keyword, :funcname + rule %r/(Class|Structure|Enum)\b/, Keyword, :classname + rule %r/(Module|Namespace|Imports)\b/, Keyword, :namespace + + rule upper_id do |m| + match = m[0] + if self.class.keywords.include? match + token Keyword + elsif self.class.keywords_type.include? match + token Keyword::Type + elsif self.class.operator_words.include? match + token Operator::Word + elsif self.class.builtins.include? match + token Name::Builtin + else + token Name + end + end + + rule( + %r(&=|[*]=|/=|\\=|\^=|\+=|-=|<<=|>>=|<<|>>|:=|<=|>=|<>|[-&*/\\^+=<>.]), + Operator + ) + + rule %r/"/, Str, :string + rule %r/#{id}[%&@!#\$]?/, Name + rule %r/#.*?#/, Literal::Date + + rule %r/(\d+\.\d*|\d*\.\d+)(f[+-]?\d+)?/i, Num::Float + rule %r/\d+([SILDFR]|US|UI|UL)?/, Num::Integer + rule %r/&H[0-9a-f]+([SILDFR]|US|UI|UL)?/, Num::Integer + rule %r/&O[0-7]+([SILDFR]|US|UI|UL)?/, Num::Integer + + rule %r/_\n/, Keyword + end + + state :dotted do + mixin :whitespace + rule id, Name, :pop! + end + + state :string do + rule %r/""/, Str::Escape + rule %r/"C?/, Str, :pop! + rule %r/[^"]+/, Str + end + + state :dim do + mixin :whitespace + rule id, Name::Variable, :pop! + rule(//) { pop! } + end + + state :funcname do + mixin :whitespace + rule id, Name::Function, :pop! + end + + state :classname do + mixin :whitespace + rule id, Name::Class, :pop! + end + + state :namespace do + mixin :whitespace + rule %r/#{id}([.]#{id})*/, Name::Namespace, :pop! + end + + state :end do + mixin :whitespace + rule %r/(Function|Sub|Property|Class|Structure|Enum|Module|Namespace)\b/, + Keyword, :pop! + rule(//) { pop! } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/velocity.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/velocity.rb new file mode 100644 index 000000000000..4aa23ad44c53 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/velocity.rb @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- # + +module Rouge + module Lexers + class Velocity < TemplateLexer + title 'Velocity' + desc 'Velocity is a Java-based template engine (velocity.apache.org)' + tag 'velocity' + filenames '*.vm', '*.velocity', '*.fhtml' + mimetypes 'text/html+velocity' + + id = /[a-z_]\w*/i + + state :root do + rule %r/[^{#$]+/ do + delegate parent + end + + rule %r/(#)(\*.*?\*)(#)/m, Comment::Multiline + rule %r/(##)(.*?$)/, Comment::Single + + rule %r/(#\{?)(#{id})(\}?)(\s?\()/m do + groups Punctuation, Name::Function, Punctuation, Punctuation + push :directive_params + end + + rule %r/(#\{?)(#{id})(\}|\b)/m do + groups Punctuation, Name::Function, Punctuation + end + + rule %r/\$\{?/, Punctuation, :variable + end + + state :variable do + rule %r/#{id}/, Name::Variable + rule %r/\(/, Punctuation, :func_params + rule %r/(\.)(#{id})/ do + groups Punctuation, Name::Variable + end + rule %r/\}/, Punctuation, :pop! + rule(//) { pop! } + end + + state :directive_params do + rule %r/(&&|\|\||==?|!=?|[-<>+*%&|^\/])|\b(eq|ne|gt|lt|ge|le|not|in)\b/, Operator + rule %r/\[/, Operator, :range_operator + rule %r/\b#{id}\b/, Name::Function + mixin :func_params + end + + state :range_operator do + rule %r/[.]{2}/, Operator + mixin :func_params + rule %r/\]/, Operator, :pop! + end + + state :func_params do + rule %r/\$\{?/, Punctuation, :variable + rule %r/\s+/, Text + rule %r/,/, Punctuation + rule %r/"(\\\\|\\"|[^"])*"/, Str::Double + rule %r/'(\\\\|\\'|[^'])*'/, Str::Single + rule %r/0[xX][0-9a-fA-F]+[Ll]?/, Num::Hex + rule %r/\b[0-9]+\b/, Num::Integer + rule %r/(true|false|null)\b/, Keyword::Constant + rule %r/[(\[]/, Punctuation, :push + rule %r/[)\]}]/, Punctuation, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/verilog.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/verilog.rb new file mode 100644 index 000000000000..820c4350f1d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/verilog.rb @@ -0,0 +1,163 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Verilog < RegexLexer + title "Verilog and System Verilog" + desc "The System Verilog hardware description language" + tag 'verilog' + filenames '*.v', '*.sv', '*.svh' + mimetypes 'text/x-verilog', 'text/x-systemverilog' + + id = /[a-zA-Z_][a-zA-Z0-9_]*/ + + def self.keywords + @keywords ||= Set.new %w( + alias always always_comb always_ff always_latch assert assert_strobe + assign assume automatic attribute before begin bind bins binsof break + case casex casez clocking config constraint context continue cover + covergroup coverpoint cross deassign defparam default design dist do + else end endattribute endcase endclass endclocking endconfig + endfunction endgenerate endgroup endinterface endmodule endpackage + endprimitive endprogram endproperty endspecify endsequence endtable + endtask expect export extends extern final first_match for force + foreach fork forkjoin forever function generate genvar if iff ifnone + ignore_bins illegal_bins import incdir include initial inside instance + interface intersect join join_any join_none liblist library local + localparam matches module modport new noshowcancelled null package + parameter primitive priority program property protected + pulsestyle_onevent pulsestyle_ondetect pure rand randc randcase + randsequence release return sequence showcancelled solve specify super + table task this throughout timeprecision timeunit type typedef unique + use wait wait_order while wildcard with within + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + and bit buf bufif0 bufif1 byte cell chandle class cmos const disable + edge enum event highz0 highz1 initial inout input int integer join + logic longint macromodule medium nand negedge nmos nor not + notif0 notif1 or output packed parameter pmos posedge pull0 pull1 + pulldown pullup rcmos real realtime ref reg repeat rnmos rpmos rtran + rtranif0 rtranif1 scalared shortint shortreal signed specparam + static string strength strong0 strong1 struct supply0 supply1 tagged + time tran tranif0 tranif1 tri tri0 tri1 triand trior trireg union + unsigned uwire var vectored virtual void wait wand weak[01] wire wor + xnor xor + ) + end + + def self.keywords_system_task + @keyword_system_task ||= Set.new %w( + acos acosh asin asinh assertfailoff assertfailon assertkill + assertnonvacuouson assertoff asserton assertpassoff assertpasson + assertvacuousoff atan atan2 atanh bits bitstoreal bitstoshortreal + cast ceil changed changed_gclk changing_gclk clog2 cos cosh countones + coverage_control coverage_get coverage_get_max coverage_merge + coverage_save dimensions display displayb displayh displayo + dist_chi_square dist_erlang dist_exponential dist_normal dist_poisson + dist_t dist_uniform dumpall dumpfile dumpflush dumplimit dumpoff + dumpon dumpports dumpportsall dumpportsflush dumpportslimit + dumpportsoff dumpportson dumpvars error exit exp falling_gclk fclose + fdisplay fdisplayb fdisplayh fdisplayo fell fell_gclk feof ferror + fflush fgetc fgets finish floor fmonitor fmonitorb fmonitorh fmonitoro + fopen fread fscanf fseek fstrobe fstrobeb fstrobeh fstrobeo ftell + future_gclk fwrite fwriteb fwriteh fwriteo get_coverage high hypot + increment info isunbounded isunknown itor left ln load_coverage_db + log10 low monitor monitorb monitorh monitoro monitoroff monitoron + onehot onehot0 past past_gclk pow printtimescale q_add q_exam q_full + q_initialize q_remove random readmemb readmemh realtime realtobits + rewind right rising_gclk rose rose_gclk rtoi sampled + set_coverage_db_name sformat sformatf shortrealtobits signed sin sinh + size sqrt sscanf stable stable_gclk steady_gclk stime stop strobe + strobeb strobeh strobeo swrite swriteb swriteh swriteo system tan tanh + time timeformat typename ungetc unpacked_dimensions unsigned warning + write writeb writeh writememb writememh writeo + ) + end + + state :expr_bol do + mixin :inline_whitespace + rule %r/`define/, Comment::Preproc, :macro + + rule(//) { pop! } + end + + # :expr_bol is the same as :bol but without labels, since + # labels can only appear at the beginning of a statement. + state :bol do + rule %r/#{id}:(?!:)/, Name::Label + mixin :expr_bol + end + + state :inline_whitespace do + rule %r/[ \t\r]+/, Text + rule %r/\\\n/, Text # line continuation + rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline + end + + state :whitespace do + rule %r/\n+/m, Text, :bol + rule %r(//(\\.|.)*?$), Comment::Single, :bol + mixin :inline_whitespace + end + + state :expr_whitespace do + rule %r/\n+/m, Text, :expr_bol + mixin :whitespace + end + + state :string do + rule %r/"/, Str, :pop! + rule %r/\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape + rule %r/[^\\"\n]+/, Str + rule %r/\\\n/, Str + rule %r/\\/, Str # stray backslash + end + + state :statement do + mixin :whitespace + rule %r/L?"/, Str, :string + rule %r/([0-9_]+\.[0-9_]*|[0-9_]*\.[0-9_]+)(e[+-]?[0-9_]+)?/i, Num::Float + rule %r/[0-9_]+e[+-]?[0-9_]+/i, Num::Float + rule %r/[0-9]*'h[0-9a-fA-F_?]+/, Num::Hex + rule %r/[0-9]*'b?[01xz_?]+/, Num::Bin + rule %r/[0-9]*'d[0-9_?]+/, Num::Integer + rule %r/[0-9_]+[lu]*/i, Num::Integer + rule %r([-~!%^&*+=\|?:<>/@{}]), Operator + rule %r/[()\[\],.$\#;]/, Punctuation + rule %r/`(\w+)/, Comment::Preproc + + rule id do |m| + name = m[0] + + if self.class.keywords.include? name + token Keyword + elsif self.class.keywords_type.include? name + token Keyword::Type + elsif self.class.keywords_system_task.include? name + token Name::Builtin + else + token Name + end + end + end + + state :root do + mixin :expr_whitespace + rule(//) { push :statement } + end + + state :macro do + rule %r/\n/, Comment::Preproc, :pop! + mixin :inline_whitespace + rule %r/;/, Punctuation + rule %r/\=/, Operator + rule %r/(\w+)/, Text + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vhdl.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vhdl.rb new file mode 100644 index 000000000000..38ff5fcf9291 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vhdl.rb @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class VHDL < RegexLexer + title "VHDL 2008" + desc "Very High Speed Integrated Circuit Hardware Description Language" + tag 'vhdl' + + filenames '*.vhd', '*.vhdl', '*.vho' + + mimetypes 'text/x-vhdl' + def self.keywords + @keywords ||= Set.new %w( + access after alias all architecture array assert assume assume_guarantee attribute + begin block body buffer bus case component configuration constant context cover + default disconnect downto else elsif end entity exit fairness file for force function + generate generic group guarded if impure in inertial inout is label library linkage + literal loop map new next null of on open others out package parameter port postponed + procedure process property protected pure range record register reject release report + return select sequence severity shared signal strong subtype then to transport type + unaffected units until use variable vmode vprop vunit wait when while with + ) + end + + def self.keywords_type + @keywords_type ||= Set.new %w( + bit bit_vector boolean boolean_vector character integer integer_vector natural positive + real real_vector severity_level signed std_logic std_logic_vector std_ulogic + std_ulogic_vector string unsigned time time_vector + ) + end + + def self.operator_words + @operator_words ||= Set.new %w( + abs and mod nand nor not or rem rol ror sla sll sra srl xnor xor + ) + end + + id = /[a-zA-Z][a-zA-Z0-9_]*/ + + state :whitespace do + rule %r/\s+/, Text + rule %r/\n/, Text + # Find Comments (VHDL doesn't support multiline comments) + rule %r/--.*$/, Comment::Single + end + + state :statements do + + # Find Numbers + rule %r/-?\d+/i, Num::Integer + rule %r/-?\d+[.]\d+/i, Num::Float + + # Find Strings + rule %r/[box]?"[^"]*"/i, Str::Single + rule %r/'[^']?'/i, Str::Char + + # Find Attributes + rule %r/'#{id}/i, Name::Attribute + + # Punctuations + rule %r/[(),:;]/, Punctuation + + # Boolean and NULL + rule %r/(?:true|false|null)\b/i, Name::Builtin + + rule id do |m| + match = m[0].downcase #convert to lower case + if self.class.keywords.include? match + token Keyword + elsif self.class.keywords_type.include? match + token Keyword::Type + elsif self.class.operator_words.include? match + token Operator::Word + else + token Name + end + end + + rule( + %r(=>|[*][*]|:=|\/=|>=|<=|<>|\?\?|\?=|\?\/=|\?>|\?<|\?>=|\?<=|<<|>>|[#&'*+-.\/:<=>\?@^]), + Operator + ) + + end + + state :root do + + mixin :whitespace + mixin :statements + + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/viml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/viml.rb new file mode 100644 index 000000000000..9ef1776b52be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/viml.rb @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class VimL < RegexLexer + title "VimL" + desc "VimL, the scripting language for the Vim editor (vim.org)" + tag 'viml' + aliases 'vim', 'vimscript', 'ex' + filenames '*.vim', '*.vba', '.vimrc', '.exrc', '.gvimrc', + '_vimrc', '_exrc', '_gvimrc' # _ names for windows + + mimetypes 'text/x-vim' + + def self.keywords + Kernel::load File.join(Lexers::BASE_DIR, 'viml/keywords.rb') + self.keywords + end + + state :root do + rule %r/^(\s*)(".*?)$/ do + groups Text, Comment + end + + rule %r/^\s*\\/, Str::Escape + + rule %r/[ \t]+/, Text + + # TODO: regexes can have other delimiters + rule %r(/(\\\\|\\/|[^\n/])*/), Str::Regex + rule %r("(\\\\|\\"|[^\n"])*"), Str::Double + rule %r('(\\\\|\\'|[^\n'])*'), Str::Single + + # if it's not a string, it's a comment. + rule %r/(?<=\s)"[^-:.%#=*].*?$/, Comment + + rule %r/-?\d+/, Num + rule %r/#[0-9a-f]{6}/i, Num::Hex + rule %r/^:/, Punctuation + rule %r/[():<>+=!\[\]{}\|,~.-]/, Punctuation + rule %r/\b(let|if|else|endif|elseif|fun|function|endfunction)\b/, + Keyword + + rule %r/\b(NONE|bold|italic|underline|dark|light)\b/, Name::Builtin + + rule %r/[absg]:\w+\b/, Name::Variable + rule %r/\b\w+\b/ do |m| + name = m[0] + keywords = self.class.keywords + + if keywords[:command].include? name + token Keyword + elsif keywords[:function].include? name + token Name::Builtin + elsif keywords[:option].include? name + token Name::Builtin + elsif keywords[:auto].include? name + token Name::Builtin + else + token Text + end + end + + # no errors in VimL! + rule %r/./m, Text + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/viml/keywords.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/viml/keywords.rb new file mode 100644 index 000000000000..21d5d3b3423f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/viml/keywords.rb @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# DO NOT EDIT +# This file is automatically generated by `rake builtins:viml`. +# See tasks/builtins/viml.rake for more info. + +module Rouge + module Lexers + class VimL + def self.keywords + @keywords ||= {}.tap do |kw| + kw[:command] = Set.new ["a", "ar", "args", "argl", "arglocal", "ba", "ball", "bm", "bmodified", "breaka", "breakadd", "bun", "bunload", "cabc", "cabclear", "cal", "call", "cc", "cf", "cfile", "changes", "cla", "clast", "cnf", "cnfile", "comc", "comclear", "cp", "cprevious", "cstag", "debugg", "debuggreedy", "deletl", "dep", "diffpu", "diffput", "dl", "dr", "drop", "ec", "em", "emenu", "ene", "enew", "files", "fini", "finish", "folddoc", "folddoclosed", "gr", "grep", "helpc", "helpclose", "his", "history", "il", "ilist", "isp", "isplit", "keepa", "l", "list", "laf", "lafter", "lbel", "lbelow", "lcscope", "lfdo", "lgrepa", "lgrepadd", "lma", "lo", "loadview", "lop", "lopen", "lua", "m", "move", "mes", "mkvie", "mkview", "nbc", "nbclose", "noh", "nohlsearch", "ol", "oldfiles", "pa", "packadd", "po", "pop", "prof", "profile", "pta", "ptag", "ptr", "ptrewind", "py3f", "py3file", "pythonx", "quita", "quitall", "redraws", "redrawstatus", "rew", "rewind", "rubyf", "rubyfile", "sIg", "sa", "sargument", "sba", "sball", "sbr", "sbrewind", "scl", "scscope", "sfir", "sfirst", "sgl", "sic", "sin", "sm", "smap", "snoreme", "spelld", "spelldump", "spellw", "spellwrong", "srg", "st", "stop", "stj", "stjump", "sunmenu", "syn", "tN", "tNext", "tabd", "tabdo", "tabm", "tabmove", "tabr", "tabrewind", "tch", "tchdir", "tf", "tfirst", "tlmenu", "tm", "tmenu", "to", "topleft", "tu", "tunmenu", "undol", "undolist", "up", "update", "vi", "visual", "vmapc", "vmapclear", "wa", "wall", "winp", "winpos", "wundo", "xme", "xr", "xrestore", "ab", "arga", "argadd", "argu", "argument", "bad", "badd", "bn", "bnext", "breakd", "breakdel", "bw", "bwipeout", "cabo", "cabove", "cat", "catch", "ccl", "cclose", "cfdo", "chd", "chdir", "cle", "clearjumps", "cnor", "comp", "compiler", "cpf", "cpfile", "cun", "delc", "delcommand", "deletp", "di", "display", "diffs", "diffsplit", "dli", "dlist", "ds", "dsearch", "echoe", "echoerr", "en", "endif", "eval", "filet", "fir", "first", "foldo", "foldopen", "grepa", "grepadd", "helpf", "helpfind", "i", "imapc", "imapclear", "iuna", "iunabbrev", "keepalt", "la", "last", "lan", "language", "lbo", "lbottom", "ld", "ldo", "lfir", "lfirst", "lh", "lhelpgrep", "lmak", "lmake", "loadk", "lp", "lprevious", "luado", "ma", "mark", "messages", "mod", "mode", "nbs", "nbstart", "nor", "omapc", "omapclear", "packl", "packloadall", "popu", "popup", "profd", "profdel", "ptf", "ptfirst", "pts", "ptselect", "pyx", "r", "read", "redrawt", "redrawtabline", "ri", "right", "rundo", "sIl", "sal", "sall", "sbf", "sbfirst", "sc", "scp", "se", "set", "sg", "sgn", "sie", "sip", "sme", "snoremenu", "spelli", "spellinfo", "spr", "sprevious", "sri", "sta", "stag", "stopi", "stopinsert", "sus", "suspend", "sync", "ta", "tag", "tabe", "tabedit", "tabn", "tabnext", "tabs", "tcld", "tcldo", "th", "throw", "tln", "tma", "tmap", "tp", "tprevious", "tunma", "tunmap", "unh", "unhide", "v", "vie", "view", "vne", "vnew", "wh", "while", "wn", "wnext", "wv", "wviminfo", "xmenu", "xunme", "abc", "abclear", "argd", "argdelete", "as", "ascii", "bd", "bdelete", "bo", "botright", "breakl", "breaklist", "cN", "cNext", "cad", "caddbuffer", "cb", "cbuffer", "cd", "cfir", "cfirst", "che", "checkpath", "clo", "close", "co", "copy", "con", "continue", "cq", "cquit", "cuna", "cunabbrev", "delel", "delf", "delfunction", "dif", "diffupdate", "difft", "diffthis", "do", "dsp", "dsplit", "echom", "echomsg", "endf", "endfunction", "ex", "filetype", "fix", "fixdel", "for", "gui", "helpg", "helpgrep", "ia", "in", "j", "join", "keepj", "keepjumps", "lab", "labove", "lat", "lc", "lcd", "le", "left", "lg", "lgetfile", "lhi", "lhistory", "lmapc", "lmapclear", "loadkeymap", "lpf", "lpfile", "luafile", "mak", "make", "mk", "mkexrc", "mz", "mzscheme", "new", "nore", "on", "only", "pc", "pclose", "pp", "ppop", "promptf", "promptfind", "ptj", "ptjump", "pu", "put", "py", "python", "pyxdo", "rec", "recover", "reg", "registers", "rightb", "rightbelow", "rv", "rviminfo", "sIn", "san", "sandbox", "sbl", "sblast", "scI", "scr", "scriptnames", "setf", "setfiletype", "sgI", "sgp", "sig", "sir", "smenu", "so", "source", "spellr", "spellrare", "sr", "srl", "star", "startinsert", "sts", "stselect", "sv", "sview", "syncbind", "tab", "tabf", "tabfind", "tabnew", "tags", "tclf", "tclfile", "tj", "tjump", "tlnoremenu", "tmapc", "tmapclear", "tr", "trewind", "u", "undo", "unl", "ve", "version", "vim", "vimgrep", "vs", "vsplit", "win", "winsize", "wp", "wprevious", "x", "xit", "xnoreme", "xunmenu", "abo", "aboveleft", "argdo", "au", "bel", "belowright", "bp", "bprevious", "bro", "browse", "cNf", "cNfile", "cadde", "caddexpr", "cbe", "cbefore", "cdo", "cg", "cgetfile", "checkt", "checktime", "cmapc", "cmapclear", "col", "colder", "conf", "confirm", "cr", "crewind", "cw", "cwindow", "delep", "dell", "diffg", "diffget", "dig", "digraphs", "doau", "e", "edit", "echon", "endfo", "endfor", "exi", "exit", "filt", "filter", "fo", "fold", "fu", "function", "gvim", "helpt", "helptags", "iabc", "iabclear", "inor", "ju", "jumps", "keepp", "keeppatterns", "lad", "laddexpr", "later", "lch", "lchdir", "lefta", "leftabove", "lgetb", "lgetbuffer", "ll", "lne", "lnext", "loc", "lockmarks", "lr", "lrewind", "lv", "lvimgrep", "marks", "mks", "mksession", "mzf", "mzfile", "nmapc", "nmapclear", "nos", "noswapfile", "opt", "options", "pe", "perl", "pre", "preserve", "promptr", "promptrepl", "ptl", "ptlast", "pw", "pwd", "pydo", "pyxfile", "red", "redo", "res", "resize", "ru", "runtime", "sI", "sIp", "sav", "saveas", "sbm", "sbmodified", "sce", "scripte", "scriptencoding", "setg", "setglobal", "sgc", "sgr", "sign", "sl", "sleep", "smile", "sor", "sort", "spellrepall", "srI", "srn", "startg", "startgreplace", "sun", "sunhide", "sw", "swapname", "syntime", "tabN", "tabNext", "tabfir", "tabfirst", "tabo", "tabonly", "tc", "tcl", "te", "tearoff", "tl", "tlast", "tlu", "tn", "tnext", "try", "una", "unabbreviate", "unlo", "unlockvar", "verb", "verbose", "vimgrepa", "vimgrepadd", "wN", "wNext", "winc", "wincmd", "wq", "xa", "xall", "xnoremenu", "xwininfo", "addd", "arge", "argedit", "bN", "bNext", "bf", "bfirst", "br", "brewind", "bufdo", "c", "change", "caddf", "caddfile", "cbel", "cbelow", "ce", "center", "cgetb", "cgetbuffer", "chi", "chistory", "cn", "cnext", "colo", "colorscheme", "cons", "const", "cs", "d", "delete", "deletel", "delm", "delmarks", "diffo", "diffoff", "dir", "doaut", "ea", "el", "else", "endt", "endtry", "exu", "exusage", "fin", "find", "foldc", "foldclose", "g", "h", "help", "hi", "if", "intro", "k", "lN", "lNext", "laddb", "laddbuffer", "lb", "lbuffer", "lcl", "lclose", "lex", "lexpr", "lgete", "lgetexpr", "lla", "llast", "lnew", "lnewer", "lockv", "lockvar", "ls", "lvimgrepa", "lvimgrepadd", "mat", "match", "mksp", "mkspell", "n", "next", "noa", "nu", "number", "ownsyntax", "ped", "pedit", "prev", "previous", "ps", "psearch", "ptn", "ptnext", "py3", "pyf", "pyfile", "q", "quit", "redi", "redir", "ret", "retab", "rub", "ruby", "sIc", "sIr", "sbN", "sbNext", "sbn", "sbnext", "scg", "scriptv", "scriptversion", "setl", "setlocal", "sge", "sh", "shell", "sil", "silent", "sla", "slast", "sn", "snext", "sp", "split", "spellrrare", "src", "srp", "startr", "startreplace", "sunme", "sy", "t", "tabc", "tabclose", "tabl", "tablast", "tabp", "tabprevious", "tcd", "ter", "terminal", "tlm", "tlunmenu", "tno", "tnoremap", "ts", "tselect", "undoj", "undojoin", "uns", "unsilent", "vert", "vertical", "viu", "viusage", "w", "write", "windo", "wqa", "wqall", "xmapc", "xmapclear", "xprop", "y", "yank", "al", "all", "argg", "argglobal", "b", "buffer", "bl", "blast", "brea", "break", "buffers", "ca", "caf", "cafter", "cbo", "cbottom", "cex", "cexpr", "cgete", "cgetexpr", "cl", "clist", "cnew", "cnewer", "com", "cope", "copen", "cscope", "debug", "deletep", "delp", "diffp", "diffpatch", "dj", "djump", "dp", "earlier", "elsei", "elseif", "endw", "endwhile", "f", "file", "fina", "finally", "foldd", "folddoopen", "go", "goto", "ha", "hardcopy", "hid", "hide", "ij", "ijump", "is", "isearch", "kee", "keepmarks", "lNf", "lNfile", "laddf", "laddfile", "lbe", "lbefore", "lcs", "lf", "lfile", "lgr", "lgrep", "lli", "llist", "lnf", "lnfile", "lol", "lolder", "lt", "ltag", "lw", "lwindow", "menut", "menutranslate", "mkv", "mkvimrc", "nb", "nbkey", "noautocmd", "o", "open", "p", "print", "perld", "perldo", "pro", "ptN", "ptNext", "ptp", "ptprevious", "py3do", "python3", "qa", "qall", "redr", "redraw", "retu", "return", "rubyd", "rubydo", "sIe", "sN", "sNext", "sb", "sbuffer", "sbp", "sbprevious", "sci", "scs", "sf", "sfind", "sgi", "si", "sim", "simalt", "smagic", "sno", "snomagic", "spe", "spellgood", "spellu", "spellundo", "sre", "srewind", "def", "endd", "enddef", "disa", "disassemble", "vim9", "vim9script", "imp", "import", "exp", "export"] + kw[:option] = Set.new ["acd", "ambw", "arshape", "background", "ballooneval", "bex", "bl", "brk", "buftype", "cf", "cinkeys", "cmdwinheight", "com", "completeslash", "cpoptions", "cscoperelative", "csre", "cursorcolumn", "delcombine", "digraph", "eadirection", "emo", "equalprg", "expandtab", "fdls", "fex", "fileignorecase", "fml", "foldlevel", "formatexpr", "gcr", "go", "guifontset", "helpheight", "history", "hlsearch", "imaf", "ims", "includeexpr", "infercase", "iskeyword", "keywordprg", "laststatus", "lispwords", "lrm", "magic", "maxfuncdepth", "menuitems", "mm", "modifiable", "mousemodel", "mzq", "numberwidth", "opfunc", "patchexpr", "pfn", "pp", "printfont", "pumwidth", "pythonthreehome", "redrawtime", "ri", "rs", "sb", "scroll", "sect", "sft", "shellredir", "shiftwidth", "showmatch", "signcolumn", "smarttab", "sp", "spf", "srr", "startofline", "suffixes", "switchbuf", "ta", "tagfunc", "tbi", "term", "termwintype", "tgc", "titlelen", "toolbariconsize", "ttimeout", "ttymouse", "twt", "undofile", "varsofttabstop", "verbosefile", "viminfofile", "wak", "weirdinvert", "wig", "wildoptions", "winheight", "wm", "wrapscan", "ai", "anti", "autochdir", "backspace", "balloonevalterm", "bexpr", "bo", "browsedir", "casemap", "cfu", "cino", "cmp", "comments", "concealcursor", "cpp", "cscopetag", "cst", "cursorline", "dex", "dip", "eb", "emoji", "errorbells", "exrc", "fdm", "ff", "filetype", "fmr", "foldlevelstart", "formatlistpat", "gd", "gp", "guifontwide", "helplang", "hk", "ic", "imak", "imsearch", "incsearch", "insertmode", "isp", "km", "lazyredraw", "list", "ls", "makeef", "maxmapdepth", "mfd", "mmd", "modified", "mouses", "mzquantum", "nuw", "osfiletype", "patchmode", "ph", "preserveindent", "printheader", "pvh", "pyx", "regexpengine", "rightleft", "rtp", "sbo", "scrollbind", "sections", "sh", "shellslash", "shm", "showmode", "siso", "smc", "spc", "spl", "ss", "statusline", "suffixesadd", "sws", "tabline", "taglength", "tbidi", "termbidi", "terse", "tgst", "titleold", "top", "ttimeoutlen", "ttyscroll", "tx", "undolevels", "vartabstop", "vfile", "virtualedit", "warn", "wfh", "wildchar", "wim", "winminheight", "wmh", "write", "akm", "antialias", "autoindent", "backup", "balloonexpr", "bg", "bomb", "bs", "cb", "ch", "cinoptions", "cms", "commentstring", "conceallevel", "cpt", "cscopetagorder", "csto", "cursorlineopt", "dg", "dir", "ed", "enc", "errorfile", "fcl", "fdn", "ffs", "fillchars", "fo", "foldmarker", "formatoptions", "gdefault", "grepformat", "guiheadroom", "hf", "hkmap", "icon", "imc", "imsf", "inde", "is", "isprint", "kmp", "lbr", "listchars", "lsp", "makeencoding", "maxmem", "mh", "mmp", "more", "mouseshape", "mzschemedll", "odev", "pa", "path", "pheader", "previewheight", "printmbcharset", "pvp", "pyxversion", "relativenumber", "rightleftcmd", "ru", "sbr", "scrollfocus", "secure", "shcf", "shelltemp", "shortmess", "showtabline", "sj", "smd", "spell", "splitbelow", "ssl", "stl", "sw", "sxe", "tabpagemax", "tagrelative", "tbis", "termencoding", "textauto", "thesaurus", "titlestring", "tpm", "ttm", "ttytype", "uc", "undoreload", "vb", "vi", "visualbell", "wb", "wfw", "wildcharm", "winaltkeys", "winminwidth", "wmnu", "writeany", "al", "ar", "autoread", "backupcopy", "bdir", "bh", "breakat", "bsdir", "cc", "charconvert", "cinw", "co", "compatible", "confirm", "crb", "cscopeverbose", "csverb", "cwh", "dict", "directory", "edcompatible", "encoding", "errorformat", "fcs", "fdo", "fic", "fixendofline", "foldclose", "foldmethod", "formatprg", "gfm", "grepprg", "guioptions", "hh", "hkmapp", "iconstring", "imcmdline", "imst", "indentexpr", "isf", "joinspaces", "kp", "lcs", "lm", "luadll", "makeprg", "maxmempattern", "mis", "mmt", "mouse", "mouset", "mzschemegcdll", "oft", "packpath", "pdev", "pi", "previewpopup", "printmbfont", "pvw", "qe", "remap", "rl", "rubydll", "sc", "scrolljump", "sel", "shell", "shelltype", "shortname", "shq", "slm", "sn", "spellcapcheck", "splitright", "ssop", "stmp", "swapfile", "sxq", "tabstop", "tags", "tbs", "termguicolors", "textmode", "tildeop", "tl", "tr", "tty", "tw", "udf", "updatecount", "vbs", "viewdir", "vop", "wc", "wh", "wildignore", "wincolor", "winptydll", "wmw", "writebackup", "aleph", "arab", "autowrite", "backupdir", "bdlay", "bin", "breakindent", "bsk", "ccv", "ci", "cinwords", "cocu", "complete", "copyindent", "cryptmethod", "csl", "cuc", "debug", "dictionary", "display", "ef", "endofline", "esckeys", "fdc", "fdt", "fileencoding", "fixeol", "foldcolumn", "foldminlines", "fp", "gfn", "gtl", "guipty", "hi", "hkp", "ignorecase", "imd", "imstatusfunc", "indentkeys", "isfname", "js", "langmap", "linebreak", "lmap", "lw", "mat", "maxmemtot", "mkspellmem", "mod", "mousef", "mousetime", "nf", "ofu", "para", "penc", "pm", "previewwindow", "printoptions", "pw", "quoteescape", "renderoptions", "rlc", "ruf", "scb", "scrolloff", "selection", "shellcmdflag", "shellxescape", "showbreak", "si", "sm", "so", "spellfile", "spr", "st", "sts", "swapsync", "syn", "tag", "tagstack", "tc", "termwinkey", "textwidth", "timeout", "tm", "ts", "ttybuiltin", "twk", "udir", "updatetime", "vdir", "viewoptions", "vsts", "wcm", "whichwrap", "wildignorecase", "window", "winwidth", "wop", "writedelay", "allowrevins", "arabic", "autowriteall", "backupext", "belloff", "binary", "breakindentopt", "bt", "cd", "cin", "clipboard", "cole", "completefunc", "cot", "cscopepathcomp", "cspc", "cul", "deco", "diff", "dy", "efm", "eol", "et", "fde", "fen", "fileencodings", "fk", "foldenable", "foldnestmax", "fs", "gfs", "gtt", "guitablabel", "hid", "hl", "im", "imdisable", "imstyle", "indk", "isi", "key", "langmenu", "lines", "lnr", "lz", "matchpairs", "mco", "ml", "modeline", "mousefocus", "mp", "nrformats", "omnifunc", "paragraphs", "perldll", "pmbcs", "printdevice", "prompt", "pythondll", "rdt", "report", "rnu", "ruler", "scf", "scrollopt", "selectmode", "shellpipe", "shellxquote", "showcmd", "sidescroll", "smartcase", "softtabstop", "spelllang", "sps", "sta", "su", "swb", "synmaxcol", "tagbsearch", "tal", "tcldll", "termwinscroll", "tf", "timeoutlen", "to", "tsl", "ttyfast", "tws", "ul", "ur", "ve", "vif", "vts", "wcr", "wi", "wildmenu", "winfixheight", "wiv", "wrap", "ws", "altkeymap", "arabicshape", "aw", "backupskip", "beval", "bk", "bri", "bufhidden", "cdpath", "cindent", "cm", "colorcolumn", "completeopt", "cp", "cscopeprg", "csprg", "culopt", "def", "diffexpr", "ea", "ei", "ep", "eventignore", "fdi", "fenc", "fileformat", "fkmap", "foldexpr", "foldopen", "fsync", "gfw", "guicursor", "guitabtooltip", "hidden", "hlg", "imactivatefunc", "imi", "inc", "inex", "isident", "keymap", "langnoremap", "linespace", "loadplugins", "ma", "matchtime", "mef", "mle", "modelineexpr", "mousehide", "mps", "nu", "opendevice", "paste", "pex", "pmbfn", "printencoding", "pt", "pythonhome", "re", "restorescreen", "ro", "rulerformat", "scl", "scs", "sessionoptions", "shellquote", "shiftround", "showfulltag", "sidescrolloff", "smartindent", "sol", "spellsuggest", "sr", "stal", "sua", "swf", "syntax", "tagcase", "tb", "tenc", "termwinsize", "tfu", "title", "toolbar", "tsr", "ttym", "twsl", "undodir", "ut", "verbose", "viminfo", "wa", "wd", "wic", "wildmode", "winfixwidth", "wiw", "wrapmargin", "ww", "ambiwidth", "ari", "awa", "balloondelay", "bevalterm", "bkc", "briopt", "buflisted", "cedit", "cink", "cmdheight", "columns", "completepopup", "cpo", "cscopequickfix", "csqf", "cursorbind", "define", "diffopt", "ead", "ek", "equalalways", "ex", "fdl", "fencs", "fileformats", "flp", "foldignore", "foldtext", "ft", "ghr", "guifont", "helpfile", "highlight", "hls", "imactivatekey", "iminsert", "include", "inf", "isk", "keymodel", "langremap", "lisp", "lpl", "macatsui", "maxcombine", "menc", "mls", "modelines", "mousem", "msm", "number", "operatorfunc", "pastetoggle", "pexpr", "popt", "printexpr", "pumheight", "pythonthreedll", "readonly", "revins", "rop", "runtimepath", "scr", "noacd", "noallowrevins", "noantialias", "noarabic", "noarshape", "noautoread", "noaw", "noballooneval", "nobevalterm", "nobk", "nobreakindent", "nocf", "nocindent", "nocopyindent", "nocscoperelative", "nocsre", "nocuc", "nocursorcolumn", "nodelcombine", "nodigraph", "noed", "noemo", "noeol", "noesckeys", "noexpandtab", "nofic", "nofixeol", "nofoldenable", "nogd", "nohid", "nohkmap", "nohls", "noicon", "noimc", "noimdisable", "noinfercase", "nojoinspaces", "nolangremap", "nolinebreak", "nolnr", "nolrm", "nomacatsui", "noml", "nomod", "nomodelineexpr", "nomodified", "nomousef", "nomousehide", "nonumber", "noopendevice", "nopi", "nopreviewwindow", "nopvw", "norelativenumber", "norestorescreen", "nori", "norl", "noro", "noru", "nosb", "noscb", "noscrollbind", "noscs", "nosft", "noshelltemp", "noshortname", "noshowfulltag", "noshowmode", "nosm", "nosmartindent", "nosmd", "nosol", "nosplitbelow", "nospr", "nossl", "nostartofline", "noswapfile", "nota", "notagrelative", "notbi", "notbs", "noterse", "notextmode", "notgst", "notimeout", "noto", "notr", "nottybuiltin", "notx", "noundofile", "novisualbell", "nowarn", "noweirdinvert", "nowfw", "nowildignorecase", "nowinfixheight", "nowiv", "nowrap", "nowrite", "nowritebackup", "noai", "noaltkeymap", "noar", "noarabicshape", "noautochdir", "noautowrite", "noawa", "noballoonevalterm", "nobin", "nobl", "nobri", "noci", "nocompatible", "nocp", "nocscopetag", "nocst", "nocul", "nocursorline", "nodg", "noea", "noedcompatible", "noemoji", "noequalalways", "noet", "noexrc", "nofileignorecase", "nofk", "nofs", "nogdefault", "nohidden", "nohkmapp", "nohlsearch", "noignorecase", "noimcmdline", "noincsearch", "noinsertmode", "nojs", "nolazyredraw", "nolisp", "noloadplugins", "nolz", "nomagic", "nomle", "nomodeline", "nomodifiable", "nomore", "nomousefocus", "nonu", "noodev", "nopaste", "nopreserveindent", "noprompt", "noreadonly", "noremap", "norevins", "norightleft", "nornu", "nors", "noruler", "nosc", "noscf", "noscrollfocus", "nosecure", "noshellslash", "noshiftround", "noshowcmd", "noshowmatch", "nosi", "nosmartcase", "nosmarttab", "nosn", "nospell", "nosplitright", "nosr", "nosta", "nostmp", "noswf", "notagbsearch", "notagstack", "notbidi", "notermbidi", "notextauto", "notf", "notildeop", "notitle", "notop", "nottimeout", "nottyfast", "noudf", "novb", "nowa", "nowb", "nowfh", "nowic", "nowildmenu", "nowinfixwidth", "nowmnu", "nowrapscan", "nowriteany", "nows", "noakm", "noanti", "noarab", "noari", "noautoindent", "noautowriteall", "nobackup", "nobeval", "nobinary", "nobomb", "nobuflisted", "nocin", "noconfirm", "nocrb", "nocscopeverbose", "nocsverb", "nocursorbind", "nodeco", "nodiff", "noeb", "noek", "noendofline", "noerrorbells", "noex", "nofen", "nofixendofline", "nofkmap", "nofsync", "noguipty", "nohk", "nohkp", "noic", "noim", "noimd", "noinf", "nois", "nolangnoremap", "nolbr", "nolist", "nolpl", "noma", "nomh", "invacd", "invallowrevins", "invantialias", "invarabic", "invarshape", "invautoread", "invaw", "invballooneval", "invbevalterm", "invbk", "invbreakindent", "invcf", "invcindent", "invcopyindent", "invcscoperelative", "invcsre", "invcuc", "invcursorcolumn", "invdelcombine", "invdigraph", "inved", "invemo", "inveol", "invesckeys", "invexpandtab", "invfic", "invfixeol", "invfoldenable", "invgd", "invhid", "invhkmap", "invhls", "invicon", "invimc", "invimdisable", "invinfercase", "invjoinspaces", "invlangremap", "invlinebreak", "invlnr", "invlrm", "invmacatsui", "invml", "invmod", "invmodelineexpr", "invmodified", "invmousef", "invmousehide", "invnumber", "invopendevice", "invpi", "invpreviewwindow", "invpvw", "invrelativenumber", "invrestorescreen", "invri", "invrl", "invro", "invru", "invsb", "invscb", "invscrollbind", "invscs", "invsft", "invshelltemp", "invshortname", "invshowfulltag", "invshowmode", "invsm", "invsmartindent", "invsmd", "invsol", "invsplitbelow", "invspr", "invssl", "invstartofline", "invswapfile", "invta", "invtagrelative", "invtbi", "invtbs", "invterse", "invtextmode", "invtgst", "invtimeout", "invto", "invtr", "invttybuiltin", "invtx", "invundofile", "invvisualbell", "invwarn", "invweirdinvert", "invwfw", "invwildignorecase", "invwinfixheight", "invwiv", "invwrap", "invwrite", "invwritebackup", "invai", "invaltkeymap", "invar", "invarabicshape", "invautochdir", "invautowrite", "invawa", "invballoonevalterm", "invbin", "invbl", "invbri", "invci", "invcompatible", "invcp", "invcscopetag", "invcst", "invcul", "invcursorline", "invdg", "invea", "invedcompatible", "invemoji", "invequalalways", "invet", "invexrc", "invfileignorecase", "invfk", "invfs", "invgdefault", "invhidden", "invhkmapp", "invhlsearch", "invignorecase", "invimcmdline", "invincsearch", "invinsertmode", "invjs", "invlazyredraw", "invlisp", "invloadplugins", "invlz", "invmagic", "invmle", "invmodeline", "invmodifiable", "invmore", "invmousefocus", "invnu", "invodev", "invpaste", "invpreserveindent", "invprompt", "invreadonly", "invremap", "invrevins", "invrightleft", "invrnu", "invrs", "invruler", "invsc", "invscf", "invscrollfocus", "invsecure", "invshellslash", "invshiftround", "invshowcmd", "invshowmatch", "invsi", "invsmartcase", "invsmarttab", "invsn", "invspell", "invsplitright", "invsr", "invsta", "invstmp", "invswf", "invtagbsearch", "invtagstack", "invtbidi", "invtermbidi", "invtextauto", "invtf", "invtildeop", "invtitle", "invtop", "invttimeout", "invttyfast", "invudf", "invvb", "invwa", "invwb", "invwfh", "invwic", "invwildmenu", "invwinfixwidth", "invwmnu", "invwrapscan", "invwriteany", "invws", "invakm", "invanti", "invarab", "invari", "invautoindent", "invautowriteall", "invbackup", "invbeval", "invbinary", "invbomb", "invbuflisted", "invcin", "invconfirm", "invcrb", "invcscopeverbose", "invcsverb", "invcursorbind", "invdeco", "invdiff", "inveb", "invek", "invendofline", "inverrorbells", "invex", "invfen", "invfixendofline", "invfkmap", "invfsync", "invguipty", "invhk", "invhkp", "invic", "invim", "invimd", "invinf", "invis", "invlangnoremap", "invlbr", "invlist", "invlpl", "invma", "invmh", "t_8b", "t_AB", "t_al", "t_bc", "t_BE", "t_ce", "t_cl", "t_Co", "t_Cs", "t_CV", "t_db", "t_DL", "t_EI", "t_F2", "t_F4", "t_F6", "t_F8", "t_fs", "t_IE", "t_k1", "t_k2", "t_K3", "t_K4", "t_K5", "t_K6", "t_K7", "t_K8", "t_K9", "t_kb", "t_KB", "t_kd", "t_KD", "t_ke", "t_KE", "t_KF", "t_KG", "t_kh", "t_KH", "t_kI", "t_KI", "t_KJ", "t_KK", "t_kl", "t_KL", "t_kN", "t_kP", "t_kr", "t_ks", "t_ku", "t_le", "t_mb", "t_md", "t_me", "t_mr", "t_ms", "t_nd", "t_op", "t_PE", "t_PS", "t_RB", "t_RC", "t_RF", "t_Ri", "t_RI", "t_RS", "t_RT", "t_RV", "t_Sb", "t_SC", "t_se", "t_Sf", "t_SH", "t_Si", "t_SI", "t_so", "t_sr", "t_SR", "t_ST", "t_te", "t_Te", "t_TE", "t_ti", "t_TI", "t_ts", "t_Ts", "t_u7", "t_ue", "t_us", "t_ut", "t_vb", "t_ve", "t_vi", "t_vs", "t_VS", "t_WP", "t_WS", "t_xn", "t_xs", "t_ZH", "t_ZR", "t_8f", "t_AF", "t_AL", "t_BD", "t_cd", "t_Ce", "t_cm", "t_cs", "t_CS", "t_da", "t_dl", "t_EC", "t_F1", "t_F3", "t_F5", "t_F7", "t_F9", "t_GP", "t_IS", "t_K1", "t_k3", "t_k4", "t_k5", "t_k6", "t_k7", "t_k8", "t_k9", "t_KA", "t_kB", "t_KC", "t_kD"] + kw[:auto] = Set.new ["BufAdd", "BufDelete", "BufFilePost", "BufHidden", "BufNew", "BufRead", "BufReadPost", "BufUnload", "BufWinEnter", "BufWinLeave", "BufWipeout", "BufWrite", "BufWriteCmd", "BufWritePost", "BufWritePre", "CmdlineChanged", "CmdlineEnter", "CmdlineLeave", "CmdUndefined", "CmdwinEnter", "CmdwinLeave", "ColorScheme", "ColorSchemePre", "CompleteChanged", "CompleteDone", "CompleteDonePre", "CursorHold", "CursorHoldI", "CursorMoved", "CursorMovedI", "DiffUpdated", "DirChanged", "EncodingChanged", "ExitPre", "FileAppendCmd", "FileAppendPost", "FileAppendPre", "FileChangedRO", "FileChangedShell", "FileChangedShellPost", "FileEncoding", "FileReadCmd", "FileReadPost", "FileReadPre", "FileType", "FileWriteCmd", "FileWritePost", "FileWritePre", "FilterReadPost", "FilterReadPre", "FilterWritePost", "FilterWritePre", "FocusGained", "FocusLost", "FuncUndefined", "GUIEnter", "GUIFailed", "InsertChange", "InsertCharPre", "InsertEnter", "InsertLeave", "MenuPopup", "OptionSet", "QuickFixCmdPost", "QuickFixCmdPre", "QuitPre", "RemoteReply", "SafeState", "SafeStateAgain", "SessionLoadPost", "ShellCmdPost", "ShellFilterPost", "SourceCmd", "SourcePost", "SourcePre", "SpellFileMissing", "StdinReadPost", "StdinReadPre", "SwapExists", "Syntax", "TabClosed", "TabEnter", "TabLeave", "TabNew", "TermChanged", "TerminalOpen", "TerminalWinOpen", "TermResponse", "TextChanged", "TextChangedI", "TextChangedP", "TextYankPost", "User", "VimEnter", "VimLeave", "VimLeavePre", "VimResized", "WinEnter", "WinLeave", "WinNew", "BufCreate", "BufEnter", "BufFilePre", "BufLeave", "BufNewFile", "BufReadCmd", "BufReadPre"] + kw[:function] = Set.new ["abs", "appendbufline", "asin", "assert_fails", "assert_notmatch", "balloon_gettext", "bufadd", "bufname", "byteidx", "char2nr", "ch_evalexpr", "ch_log", "ch_readraw", "cindent", "complete_check", "cosh", "deepcopy", "diff_hlID", "eval", "exists", "feedkeys", "findfile", "fnamemodify", "foldtextresult", "get", "getchar", "getcmdtype", "getenv", "getftype", "getmatches", "getreg", "gettagstack", "getwinvar", "has_key", "histget", "iconv", "inputlist", "interrupt", "isnan", "job_start", "js_encode", "libcall", "list2str", "log", "mapcheck", "matchdelete", "max", "nextnonblank", "popup_atcursor", "popup_dialog", "popup_getoptions", "popup_notification", "prevnonblank", "prop_add", "prop_type_add", "pum_getpos", "rand", "reg_recording", "remote_foreground", "remove", "round", "screencol", "searchdecl", "serverlist", "setenv", "setpos", "settagstack", "sign_define", "sign_placelist", "sin", "sound_playevent", "split", "str2list", "strftime", "strpart", "submatch", "synID", "systemlist", "taglist", "term_dumpload", "term_getcursor", "term_getstatus", "term_sendkeys", "term_setsize", "test_autochdir", "test_getvalue", "test_null_dict", "test_null_string", "test_scrollbar", "test_unknown", "timer_start", "toupper", "type", "values", "winbufnr", "win_findbuf", "winheight", "winline", "winsaveview", "winwidth", "acos", "argc", "assert_beeps", "assert_false", "assert_report", "balloon_show", "bufexists", "bufnr", "byteidxcomp", "ch_canread", "ch_evalraw", "ch_logfile", "ch_sendexpr", "clearmatches", "complete_info", "count", "delete", "echoraw", "eventhandler", "exp", "filereadable", "float2nr", "foldclosed", "foreground", "getbufinfo", "getcharmod", "getcmdwintype", "getfontname", "getimstatus", "getmousepos", "getregtype", "getwininfo", "glob", "haslocaldir", "histnr", "indent", "inputrestore", "invert", "items", "job_status", "json_decode", "libcallnr", "listener_add", "log10", "match", "matchend", "min", "nr2char", "popup_beval", "popup_filter_menu", "popup_getpos", "popup_setoptions", "printf", "prop_clear", "prop_type_change", "pumvisible", "range", "reltime", "remote_peek", "rename", "rubyeval", "screenpos", "searchpair", "setbufline", "setfperm", "setqflist", "setwinvar", "sign_getdefined", "sign_undefine", "sinh", "sound_playfile", "sqrt", "str2nr", "strgetchar", "strptime", "substitute", "synIDattr", "tabpagebuflist", "tan", "term_dumpwrite", "term_getjob", "term_gettitle", "term_setansicolors", "term_start", "test_feedinput", "test_ignore_error", "test_null_job", "test_option_not_set", "test_setmouse", "test_void", "timer_stop", "tr", "undofile", "virtcol", "wincol", "win_getid", "win_id2tabwin", "winnr", "win_screenpos", "wordcount", "add", "argidx", "assert_equal", "assert_inrange", "assert_true", "balloon_split", "buflisted", "bufwinid", "call", "ch_close", "ch_getbufnr", "ch_open", "ch_sendraw", "col", "confirm", "cscope_connection", "deletebufline", "empty", "executable", "expand", "filewritable", "floor", "foldclosedend", "funcref", "getbufline", "getcharsearch", "getcompletion", "getfperm", "getjumplist", "getpid", "gettabinfo", "getwinpos", "glob2regpat", "hasmapto", "hlexists", "index", "inputsave", "isdirectory", "job_getchannel", "job_stop", "json_encode", "line", "listener_flush", "luaeval", "matchadd", "matchlist", "mkdir", "or", "popup_clear", "popup_filter_yesno", "popup_hide", "popup_settext", "prompt_setcallback", "prop_find", "prop_type_delete", "py3eval", "readdir", "reltimefloat", "remote_read", "repeat", "screenattr", "screenrow", "searchpairpos", "setbufvar", "setline", "setreg", "sha256", "sign_getplaced", "sign_unplace", "sort", "sound_stop", "srand", "strcharpart", "stridx", "strridx", "swapinfo", "synIDtrans", "tabpagenr", "tanh", "term_getaltscreen", "term_getline", "term_gettty", "term_setapi", "term_wait", "test_garbagecollect_now", "test_null_blob", "test_null_list", "test_override", "test_settime", "timer_info", "timer_stopall", "trim", "undotree", "visualmode", "windowsversion", "win_gettype", "win_id2win", "winrestcmd", "win_splitmove", "writefile", "and", "arglistid", "assert_equalfile", "assert_match", "atan", "browse", "bufload", "bufwinnr", "ceil", "ch_close_in", "ch_getjob", "ch_read", "ch_setoptions", "complete", "copy", "cursor", "did_filetype", "environ", "execute", "expandcmd", "filter", "fmod", "foldlevel", "function", "getbufvar", "getcmdline", "getcurpos", "getfsize", "getline", "getpos", "gettabvar", "getwinposx", "globpath", "histadd", "hlID", "input", "inputsecret", "isinf", "job_info", "join", "keys", "line2byte", "listener_remove", "map", "matchaddpos", "matchstr", "mode", "pathshorten", "popup_close", "popup_findinfo", "popup_menu", "popup_show", "prompt_setinterrupt", "prop_list", "prop_type_get", "pyeval", "readfile", "reltimestr", "remote_send", "resolve", "screenchar", "screenstring", "searchpos", "setcharsearch", "setloclist", "settabvar", "shellescape", "sign_jump", "sign_unplacelist", "sound_clear", "spellbadword", "state", "strchars", "string", "strtrans", "swapname", "synstack", "tabpagewinnr", "tempname", "term_getansicolors", "term_getscrolled", "term_list", "term_setkill", "test_alloc_fail", "test_garbagecollect_soon", "test_null_channel", "test_null_partial", "test_refcount", "test_srand_seed", "timer_pause", "tolower", "trunc", "uniq", "wildmenumode", "win_execute", "win_gotoid", "winlayout", "winrestview", "win_type", "xor", "append", "argv", "assert_exception", "assert_notequal", "atan2", "browsedir", "bufloaded", "byte2line", "changenr", "chdir", "ch_info", "ch_readblob", "ch_status", "complete_add", "cos", "debugbreak", "diff_filler", "escape", "exepath", "extend", "finddir", "fnameescape", "foldtext", "garbagecollect", "getchangelist", "getcmdpos", "getcwd", "getftime", "getloclist", "getqflist", "gettabwinvar", "getwinposy", "has", "histdel", "hostname", "inputdialog", "insert", "islocked", "job_setoptions", "js_decode", "len", "lispindent", "localtime", "maparg", "matcharg", "matchstrpos", "mzeval", "perleval", "popup_create", "popup_findpreview", "popup_move", "pow", "prompt_setprompt", "prop_remove", "prop_type_list", "pyxeval", "reg_executing", "remote_expr", "remote_startserver", "reverse", "screenchars", "search", "server2client", "setcmdpos", "setmatches", "settabwinvar", "shiftwidth", "sign_place", "simplify", "soundfold", "spellsuggest", "str2float", "strdisplaywidth", "strlen", "strwidth", "synconcealed", "system", "tagfiles", "term_dumpdiff", "term_getattr", "term_getsize", "term_scrape", "term_setrestore"] + end + end + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vue.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vue.rb new file mode 100644 index 000000000000..5b64f3d037df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/vue.rb @@ -0,0 +1,127 @@ +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'html.rb' + + class Vue < HTML + desc 'Vue.js single-file components' + tag 'vue' + aliases 'vuejs' + filenames '*.vue' + + mimetypes 'text/x-vue', 'application/x-vue' + + def initialize(*) + super + @js = Javascript.new(options) + end + + def lookup_lang(lang) + lang.downcase! + lang = lang.gsub(/["']*/, '') + case lang + when 'html' then HTML + when 'css' then CSS + when 'javascript' then Javascript + when 'sass' then Sass + when 'scss' then Scss + when 'coffee' then Coffeescript + # TODO: add more when the lexers are done + else + PlainText + end + end + + start { @js.reset! } + + prepend :root do + rule %r/(<)(\s*)(template)/ do + groups Name::Tag, Text, Keyword + @lang = HTML + push :template + push :lang_tag + end + + rule %r/(<)(\s*)(style)/ do + groups Name::Tag, Text, Keyword + @lang = CSS + push :style + push :lang_tag + end + + rule %r/(<)(\s*)(script)/ do + groups Name::Tag, Text, Keyword + @lang = Javascript + push :script + push :lang_tag + end + end + + prepend :tag do + rule %r/[a-zA-Z0-9_:#\[\]()*.-]+\s*=\s*/m, Name::Attribute, :attr + end + + state :style do + rule %r/(<\s*\/\s*)(style)(\s*>)/ do + groups Name::Tag, Keyword, Name::Tag + pop! + end + + mixin :style_content + mixin :embed + end + + state :script do + rule %r/(<\s*\/\s*)(script)(\s*>)/ do + groups Name::Tag, Keyword, Name::Tag + pop! + end + + mixin :script_content + mixin :embed + end + + state :lang_tag do + rule %r/(lang\s*=)(\s*)("(?:\\.|[^\\])*?"|'(\\.|[^\\])*?'|[^\s>]+)/ do |m| + groups Name::Attribute, Text, Str + @lang = lookup_lang(m[3]) + end + + mixin :tag + end + + state :template do + rule %r((<\s*/\s*)(template)(\s*>)) do + groups Name::Tag, Keyword, Name::Tag + pop! + end + + rule %r/{{/ do + token Str::Interpol + push :template_interpol + @js.reset! + end + + mixin :embed + end + + state :template_interpol do + rule %r/}}/, Str::Interpol, :pop! + rule %r/}/, Error + mixin :template_interpol_inner + end + + state :template_interpol_inner do + rule(/{/) { delegate @js; push } + rule(/}/) { delegate @js; pop! } + rule(/[^{}]+/) { delegate @js } + end + + state :embed do + rule(/[^{<]+/) { delegate @lang } + rule(/[<{][^<{]*/) { delegate @lang } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/wollok.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/wollok.rb new file mode 100644 index 000000000000..a25b2539f42a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/wollok.rb @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Wollok < RegexLexer + title 'Wollok' + desc 'Wollok lang' + tag 'wollok' + filenames '*.wlk', '*.wtest', '*.wpgm' + + keywords = %w(new super return if else var const override constructor) + + entity_name = /[a-zA-Z][a-zA-Z0-9]*/ + variable_naming = /_?#{entity_name}/ + + entities = [] + + state :whitespaces_and_comments do + rule %r/\s+/m, Text::Whitespace + rule %r(//.*$), Comment::Single + rule %r(/\*(.|\s)*?\*/)m, Comment::Multiline + end + + state :root do + mixin :whitespaces_and_comments + rule %r/(import)(.+$)/ do + groups Keyword::Reserved, Text + end + rule %r/(class|object|mixin)/, Keyword::Reserved, :foo + rule %r/test|program/, Keyword::Reserved #, :chunk_naming + rule %r/(package)(\s+)(#{entity_name})/ do + groups Keyword::Reserved, Text::Whitespace, Name::Class + end + rule %r/{|}/, Text + mixin :keywords + mixin :symbols + mixin :objects + end + + state :foo do + mixin :whitespaces_and_comments + rule %r/inherits|mixed|with|and/, Keyword::Reserved + rule %r/#{entity_name}(?=\s*{)/ do |m| + token Name::Class + entities << m[0] + pop! + end + rule %r/#{entity_name}/ do |m| + token Name::Class + entities << m[0] + end + end + + state :keywords do + def any(expressions) + /#{expressions.map { |keyword| "#{keyword}\\b" }.join('|')}/ + end + + rule %r/self\b/, Name::Builtin::Pseudo + rule any(keywords), Keyword::Reserved + rule %r/(method)(\s+)(#{variable_naming})/ do + groups Keyword::Reserved, Text::Whitespace, Text + end + end + + state :objects do + rule variable_naming do |m| + variable = m[0] + if entities.include?(variable) || ('A'..'Z').cover?(variable[0]) + token Name::Class + else + token Keyword::Variable + end + end + rule %r/\.#{entity_name}/, Text + mixin :literals + end + + state :literals do + mixin :whitespaces_and_comments + rule %r/[0-9]+\.?[0-9]*/, Literal::Number + rule %r/"[^"]*"/m, Literal::String + rule %r/\[|\#{/, Punctuation, :lists + end + + state :lists do + rule %r/,/, Punctuation + rule %r/]|}/, Punctuation, :pop! + mixin :objects + end + + state :symbols do + rule %r/\+\+|--|\+=|-=|\*\*|!/, Operator + rule %r/\+|-|\*|\/|%/, Operator + rule %r/<=|=>|===|==|<|>/, Operator + rule %r/and\b|or\b|not\b/, Operator + rule %r/\(|\)|=/, Text + rule %r/,/, Punctuation + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xml.rb new file mode 100644 index 000000000000..e313e02d9649 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xml.rb @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class XML < RegexLexer + title "XML" + desc %q(<desc for="this-lexer">XML</desc>) + tag 'xml' + filenames '*.xml', '*.xsl', '*.rss', '*.xslt', '*.xsd', '*.wsdl', '*.svg', + '*.plist' + mimetypes 'text/xml', 'application/xml', 'image/svg+xml', + 'application/rss+xml', 'application/atom+xml' + + # Documentation: https://www.w3.org/TR/xml11/#charsets and https://www.w3.org/TR/xml11/#sec-suggested-names + + def self.detect?(text) + return false if text.doctype?(/html/) + return true if text =~ /\A<\?xml\b/ + return true if text.doctype? + end + + state :root do + rule %r/[^<&]+/, Text + rule %r/&\S*?;/, Name::Entity + rule %r/<!\[CDATA\[.*?\]\]\>/, Comment::Preproc + rule %r/<!--/, Comment, :comment + rule %r/<\?.*?\?>/, Comment::Preproc + rule %r/<![^>]*>/, Comment::Preproc + + # open tags + rule %r(<\s*[\p{L}:_][\p{Word}\p{Cf}:.·-]*)m, Name::Tag, :tag + + # self-closing tags + rule %r(<\s*/\s*[\p{L}:_][\p{Word}\p{Cf}:.·-]*\s*>)m, Name::Tag + end + + state :comment do + rule %r/[^-]+/m, Comment + rule %r/-->/, Comment, :pop! + rule %r/-/, Comment + end + + state :tag do + rule %r/\s+/m, Text + rule %r/[\p{L}:_][\p{Word}\p{Cf}:.·-]*\s*=/m, Name::Attribute, :attr + rule %r(/?\s*>), Name::Tag, :pop! + end + + state :attr do + rule %r/\s+/m, Text + rule %r/".*?"|'.*?'|[^\s>]+/m, Str, :pop! + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xojo.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xojo.rb new file mode 100644 index 000000000000..426990e93bb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xojo.rb @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Xojo < RegexLexer + title "Xojo" + desc "Xojo" + tag 'xojo' + aliases 'realbasic' + filenames '*.xojo_code', '*.xojo_window', '*.xojo_toolbar', '*.xojo_menu', '*.xojo_image', '*.rbbas', '*.rbfrm', '*.rbmnu', '*.rbres', '*.rbtbar' + + keywords = %w( + addhandler aggregates array asc assigns attributes begin break + byref byval call case catch class const continue char ctype declare + delegate dim do downto each else elseif end enum event exception + exit extends false finally for function global goto if + implements inherits interface lib loop mod module + new next nil object of optional paramarray + private property protected public raise raiseevent rect redim + removehandler return select shared soft static step sub super + then to true try until using uend uhile + ) + + keywords_type = %w( + boolean cfstringref cgfloat cstring curency date double int8 int16 + int32 int64 integer ostype pstring ptr short single + single string structure variant uinteger uint8 uint16 uint32 uint64 + ushort windowptr wstring + ) + + operator_words = %w( + addressof weakaddressof and as in is isa mod not or xor + ) + + state :root do + rule %r/\s+/, Text::Whitespace + + rule %r/rem\b.*?$/i, Comment::Single + rule %r([//'].*$), Comment::Single + rule %r/\#tag Note.*?\#tag EndNote/mi, Comment::Preproc + rule %r/\s*[#].*$/x, Comment::Preproc + + rule %r/".*?"/, Literal::String::Double + rule %r/[(){}!#,:]/, Punctuation + + rule %r/\b(?:#{keywords.join('|')})\b/i, Keyword + rule %r/\b(?:#{keywords_type.join('|')})\b/i, Keyword::Declaration + + rule %r/\b(?:#{operator_words.join('|')})\b/i, Operator + rule %r/[+-]?(\d+\.\d*|\d*\.\d+)/i, Literal::Number::Float + rule %r/[+-]?\d+/, Literal::Number::Integer + rule %r/&[CH][0-9a-f]+/i, Literal::Number::Hex + rule %r/&O[0-7]+/i, Literal::Number::Oct + + rule %r/\b[\w\.]+\b/i, Text + rule(%r(<=|>=|<>|[=><\+\-\*\/\\]), Operator) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xpath.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xpath.rb new file mode 100644 index 000000000000..fb1d4a4d9870 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xpath.rb @@ -0,0 +1,332 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class XPath < RegexLexer + title 'XPath' + desc 'XML Path Language (XPath) 3.1' + tag 'xpath' + filenames '*.xpath' + + # Terminal literals: + # https://www.w3.org/TR/xpath-31/#terminal-symbols + def self.digits + @digits ||= %r/[0-9]+/ + end + + def self.decimalLiteral + @decimalLiteral ||= %r/\.#{digits}|#{digits}\.[0-9]*/ + end + + def self.doubleLiteral + @doubleLiteral ||= %r/(\.#{digits})|#{digits}(\.[0-9]*)?[eE][+-]?#{digits}/ + end + + def self.stringLiteral + @stringLiteral ||= %r/("(("")|[^"])*")|('(('')|[^'])*')/ + end + + def self.ncName + @ncName ||= %r/[a-z_][a-z_\-.0-9]*/i + end + + def self.qName + @qName ||= %r/(?:#{ncName})(?::#{ncName})?/ + end + + def self.uriQName + @uriQName ||= %r/Q\{[^{}]*\}#{ncName}/ + end + + def self.eqName + @eqName ||= %r/(?:#{uriQName}|#{qName})/ + end + + def self.commentStart + @commentStart ||= %r/\(:/ + end + + def self.openParen + @openParen ||= %r/\((?!:)/ + end + + # Terminal symbols: + # https://www.w3.org/TR/xpath-30/#id-terminal-delimitation + def self.kindTest + @kindTest ||= Regexp.union %w( + element attribute schema-element schema-attribute + comment text node document-node namespace-node + ) + end + + def self.kindTestForPI + @kindTestForPI ||= Regexp.union %w(processing-instruction) + end + + def self.axes + @axes ||= Regexp.union %w( + child descendant attribute self descendant-or-self + following-sibling following namespace + parent ancestor preceding-sibling preceding ancestor-or-self + ) + end + + def self.operators + @operators ||= Regexp.union %w(, => = := : >= >> > <= << < - * != + // / || |) + end + + def self.keywords + @keywords ||= Regexp.union %w(let for some every if then else return in satisfies) + end + + def self.word_operators + @word_operators ||= Regexp.union %w( + and or eq ge gt le lt ne is + div mod idiv + intersect except union + to + ) + end + + def self.constructorTypes + @constructorTypes ||= Regexp.union %w(function array map empty-sequence) + end + + # Mixin states: + + state :commentsAndWhitespace do + rule XPath.commentStart, Comment, :comment + rule %r/\s+/m, Text::Whitespace + end + + # Lexical states: + # https://www.w3.org/TR/xquery-xpath-parsing/#XPath-lexical-states + # https://lists.w3.org/Archives/Public/public-qt-comments/2004Aug/0127.html + # https://www.w3.org/TR/xpath-30/#id-revision-log + # https://www.w3.org/TR/xpath-31/#id-revision-log + + state :root do + mixin :commentsAndWhitespace + + # Literals + rule XPath.doubleLiteral, Num::Float + rule XPath.decimalLiteral, Num::Float + rule XPath.digits, Num + rule XPath.stringLiteral, Literal::String + + # Variables + rule %r/\$/, Name::Variable, :varname + + # Operators + rule XPath.operators, Operator + rule %r/#{XPath.word_operators}\b/, Operator::Word + rule %r/#{XPath.keywords}\b/, Keyword + rule %r/[?,{}()\[\]]/, Punctuation + + # Functions + rule %r/(function)(\s*)(#{XPath.openParen})/ do # function declaration + groups Keyword, Text::Whitespace, Punctuation + end + rule %r/(map|array|empty-sequence)/, Keyword # constructors + rule %r/(#{XPath.kindTest})(\s*)(#{XPath.openParen})/ do # kindtest + groups Keyword, Text::Whitespace, Punctuation + push :kindtest + end + rule %r/(#{XPath.kindTestForPI})(\s*)(#{XPath.openParen})/ do # processing instruction kindtest + groups Keyword, Text::Whitespace, Punctuation + push :kindtestforpi + end + rule %r/(#{XPath.eqName})(\s*)(#{XPath.openParen})/ do # function call + groups Name::Function, Text::Whitespace, Punctuation + end + rule %r/(#{XPath.eqName})(\s*)(#)(\s*)(\d+)/ do # namedFunctionRef + groups Name::Function, Text::Whitespace, Name::Function, Text::Whitespace, Name::Function + end + + # Type commands + rule %r/(cast|castable)(\s+)(as)/ do + groups Keyword, Text::Whitespace, Keyword + push :singletype + end + rule %r/(treat)(\s+)(as)/ do + groups Keyword, Text::Whitespace, Keyword + push :itemtype + end + rule %r/(instance)(\s+)(of)/ do + groups Keyword, Text::Whitespace, Keyword + push :itemtype + end + rule %r/(as)\b/ do + token Keyword + push :itemtype + end + + # Paths + rule %r/(#{XPath.ncName})(\s*)(:)(\s*)(\*)/ do + groups Name::Tag, Text::Whitespace, Punctuation, Text::Whitespace, Operator + end + rule %r/(\*)(\s*)(:)(\s*)(#{XPath.ncName})/ do + groups Operator, Text::Whitespace, Punctuation, Text::Whitespace, Name::Tag + end + rule %r/(#{XPath.axes})(\s*)(::)/ do + groups Keyword, Text::Whitespace, Operator + end + rule %r/\.\.|\.|\*/, Operator + rule %r/@/, Name::Attribute, :attrname + rule XPath.eqName, Name::Tag + end + + state :singletype do + mixin :commentsAndWhitespace + + # Type name + rule XPath.eqName do + token Keyword::Type + pop! + end + end + + state :itemtype do + mixin :commentsAndWhitespace + + # Type tests + rule %r/(#{XPath.kindTest})(\s*)(#{XPath.openParen})/ do + groups Keyword::Type, Text::Whitespace, Punctuation + # go to kindtest then occurrenceindicator + goto :occurrenceindicator + push :kindtest + end + rule %r/(#{XPath.kindTestForPI})(\s*)(#{XPath.openParen})/ do + groups Keyword::Type, Text::Whitespace, Punctuation + # go to kindtestforpi then occurrenceindicator + goto :occurrenceindicator + push :kindtestforpi + end + rule %r/(item)(\s*)(#{XPath.openParen})(\s*)(\))/ do + groups Keyword::Type, Text::Whitespace, Punctuation, Text::Whitespace, Punctuation + goto :occurrenceindicator + end + rule %r/(#{XPath.constructorTypes})(\s*)(#{XPath.openParen})/ do + groups Keyword::Type, Text::Whitespace, Punctuation + end + + # Type commands + rule %r/(cast|castable)(\s+)(as)/ do + groups Keyword, Text::Whitespace, Keyword + goto :singletype + end + rule %r/(treat)(\s+)(as)/ do + groups Keyword, Text::Whitespace, Keyword + goto :itemtype + end + rule %r/(instance)(\s+)(of)/ do + groups Keyword, Text::Whitespace, Keyword + goto :itemtype + end + rule %r/(as)\b/, Keyword + + # Operators + rule XPath.operators do + token Operator + pop! + end + rule %r/#{XPath.word_operators}\b/ do + token Operator::Word + pop! + end + rule %r/#{XPath.keywords}\b/ do + token Keyword + pop! + end + rule %r/[\[),]/ do + token Punctuation + pop! + end + + # Other types (e.g. xs:double) + rule XPath.eqName do + token Keyword::Type + goto :occurrenceindicator + end + end + + # For pseudo-parameters for the KindTest productions + state :kindtest do + mixin :commentsAndWhitespace + + # Pseudo-parameters: + rule %r/[?*]/, Operator + rule %r/,/, Punctuation + rule %r/(element|schema-element)(\s*)(#{XPath.openParen})/ do + groups Keyword::Type, Text::Whitespace, Punctuation + push :kindtest + end + rule XPath.eqName, Name::Tag + + # End of pseudo-parameters + rule %r/\)/, Punctuation, :pop! + end + + # Similar to :kindtest, but recognizes NCNames instead of EQNames + state :kindtestforpi do + mixin :commentsAndWhitespace + + # Pseudo-parameters + rule XPath.ncName, Name + rule XPath.stringLiteral, Literal::String + + # End of pseudo-parameters + rule %r/\)/, Punctuation, :pop! + end + + state :occurrenceindicator do + mixin :commentsAndWhitespace + + # Occurrence indicator + rule %r/[?*+]/ do + token Operator + pop! + end + + # Otherwise, lex it in root state: + rule %r/(?![?*+])/ do + pop! + end + end + + state :varname do + mixin :commentsAndWhitespace + + # Function call + rule %r/(#{XPath.eqName})(\s*)(#{XPath.openParen})/ do + groups Name::Variable, Text::Whitespace, Punctuation + pop! + end + + # Variable name + rule XPath.eqName, Name::Variable, :pop! + end + + state :attrname do + mixin :commentsAndWhitespace + + # Attribute name + rule XPath.eqName, Name::Attribute, :pop! + rule %r/\*/, Operator, :pop! + end + + state :comment do + # Comment end + rule %r/:\)/, Comment, :pop! + + # Nested comment + rule XPath.commentStart, Comment, :comment + + # Comment contents + rule %r/[^:(]+/m, Comment + rule %r/[:(]/, Comment + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xquery.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xquery.rb new file mode 100644 index 000000000000..2d23bb77d00c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/xquery.rb @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + load_lexer 'xpath.rb' + class XQuery < XPath + title 'XQuery' + desc 'XQuery 3.1: An XML Query Language' + tag 'xquery' + filenames '*.xquery', '*.xq' + mimetypes 'application/xquery' + + def self.keywords + @keywords ||= Regexp.union super, Regexp.union(%w( + xquery encoding version declare module + namespace copy-namespaces boundary-space construction + default collation base-uri preserve strip + ordering ordered unordered order empty greatest least + preserve no-preserve inherit no-inherit + decimal-format decimal-separator grouping-separator + infinity minus-sign NaN percent per-mille + zero-digit digit pattern-separator exponent-separator + import schema at element option + function external context item + typeswitch switch case + try catch + validate lax strict type + document element attribute text comment processing-instruction + for let where order group by return + allowing tumbling stable sliding window + start end only when previous next count collation + ascending descending + )) + end + + # Mixin states: + + state :tags do + rule %r/<#{XPath.qName}/, Name::Tag, :start_tag + rule %r/<!--/, Comment, :xml_comment + rule %r/<\?.*?\?>/, Comment::Preproc + rule %r/<!\[CDATA\[.*?\]\]>/, Comment::Preproc + rule %r/&\S*?;/, Name::Entity + end + + # Lexical states: + + prepend :root do + mixin :tags + + rule %r/\{/, Punctuation + rule %r/\}`?/ do + token Punctuation + if stack.length > 1 + pop! + end + end + + rule %r/(namespace)(\s+)(#{XPath.ncName})/ do + groups Keyword, Text::Whitespace, Name::Namespace + end + + rule %r/(#{XQuery.keywords})\b/, Keyword + rule %r/;/, Punctuation + rule %r/%/, Keyword::Declaration, :annotation + + rule %r/(\(#)(\s*)(#{XPath.eqName})/ do + groups Comment::Preproc, Text::Whitespace, Name::Tag + push :pragma + end + + rule %r/``\[/, Str, :str_constructor + end + + state :annotation do + mixin :commentsAndWhitespace + rule XPath.eqName, Keyword::Declaration, :pop! + end + + state :pragma do + mixin :commentsAndWhitespace + rule %r/#\)/, Comment::Preproc, :pop! + rule %r/./, Comment::Preproc + end + + # https://www.w3.org/TR/xquery-31/#id-string-constructors + state :str_constructor do + rule %r/`\{/, Punctuation, :root + rule %r/\]``/, Str, :pop! + rule %r/[^`\]]+/m, Str + rule %r/[`\]]/, Str + end + + state :xml_comment do + rule %r/[^-]+/m, Comment + rule %r/-->/, Comment, :pop! + rule %r/-/, Comment + end + + state :start_tag do + rule %r/\s+/m, Text::Whitespace + rule %r/([\w.:-]+\s*=)(")/m do + groups Name::Attribute, Str + push :quot_attr + end + rule %r/([\w.:-]+\s*=)(')/m do + groups Name::Attribute, Str + push :apos_attr + end + rule %r/>/, Name::Tag, :tag_content + rule %r(/>), Name::Tag, :pop! + end + + state :quot_attr do + rule %r/"/, Str, :pop! + rule %r/\{\{/, Str + rule %r/\{/, Punctuation, :root + rule %r/[^"{>]+/m, Str + end + + state :apos_attr do + rule %r/'/, Str, :pop! + rule %r/\{\{/, Str + rule %r/\{/, Punctuation, :root + rule %r/[^'{>]+/m, Str + end + + state :tag_content do + rule %r/\s+/m, Text::Whitespace + mixin :tags + + rule %r/(\{\{|\}\})/, Text + rule %r/\{/, Punctuation, :root + + rule %r/[^{}<&]/, Text + + rule %r(</#{XPath.qName}(\s*)>) do + token Name::Tag + pop! 2 # pop self and tag_start + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/yaml.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/yaml.rb new file mode 100644 index 000000000000..2444fc6bc8df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/yaml.rb @@ -0,0 +1,378 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class YAML < RegexLexer + title "YAML" + desc "Yaml Ain't Markup Language (yaml.org)" + mimetypes 'text/x-yaml' + tag 'yaml' + aliases 'yml' + filenames '*.yaml', '*.yml' + + # Documentation: https://yaml.org/spec/1.2/spec.html + + def self.detect?(text) + # look for the %YAML directive + return true if text =~ /\A\s*%YAML/m + end + + SPECIAL_VALUES = Regexp.union(%w(true false null)) + + # NB: Tabs are forbidden in YAML, which is why you see things + # like /[ ]+/. + + # reset the indentation levels + def reset_indent + puts " yaml: reset_indent" if @debug + @indent_stack = [0] + @next_indent = 0 + @block_scalar_indent = nil + end + + def indent + raise 'empty indent stack!' if @indent_stack.empty? + @indent_stack.last + end + + def dedent?(level) + level < self.indent + end + + def indent?(level) + level > self.indent + end + + # Save a possible indentation level + def save_indent(match) + @next_indent = match.size + puts " yaml: indent: #{self.indent}/#@next_indent" if @debug + puts " yaml: popping indent stack - before: #@indent_stack" if @debug + if dedent?(@next_indent) + @indent_stack.pop while dedent?(@next_indent) + puts " yaml: popping indent stack - after: #@indent_stack" if @debug + puts " yaml: indent: #{self.indent}/#@next_indent" if @debug + + # dedenting to a state not previously indented to is an error + [match[0...self.indent], match[self.indent..-1]] + else + [match, ''] + end + end + + def continue_indent(match) + puts " yaml: continue_indent" if @debug + @next_indent += match.size + end + + def set_indent(match, opts={}) + if indent < @next_indent + puts " yaml: indenting #{indent}/#{@next_indent}" if @debug + @indent_stack << @next_indent + end + + @next_indent += match.size unless opts[:implicit] + end + + plain_scalar_start = /[^ \t\n\r\f\v?:,\[\]{}#&*!\|>'"%@`]/ + + start { reset_indent } + + state :basic do + rule %r/#.*$/, Comment::Single + end + + state :root do + mixin :basic + + rule %r/\n+/, Text + + # trailing or pre-comment whitespace + rule %r/[ ]+(?=#|$)/, Text + + rule %r/^%YAML\b/ do + token Name::Tag + reset_indent + push :yaml_directive + end + + rule %r/^%TAG\b/ do + token Name::Tag + reset_indent + push :tag_directive + end + + # doc-start and doc-end indicators + rule %r/^(?:---|\.\.\.)(?= |$)/ do + token Name::Namespace + reset_indent + push :block_line + end + + # indentation spaces + rule %r/[ ]*(?!\s|$)/ do |m| + text, err = save_indent(m[0]) + token Text, text + token Error, err + push :block_line; push :indentation + end + end + + state :indentation do + rule(/\s*?\n/) { token Text; pop! 2 } + # whitespace preceding block collection indicators + rule %r/[ ]+(?=[-:?](?:[ ]|$))/ do |m| + token Text + continue_indent(m[0]) + end + + # block collection indicators + rule(/[?:-](?=[ ]|$)/) do |m| + set_indent m[0] + token Punctuation::Indicator + end + + # the beginning of a block line + rule(/[ ]*/) { |m| token Text; continue_indent(m[0]); pop! } + end + + # indented line in the block context + state :block_line do + # line end + rule %r/[ ]*(?=#|$)/, Text, :pop! + rule %r/[ ]+/, Text + # tags, anchors, and aliases + mixin :descriptors + # block collections and scalars + mixin :block_nodes + # flow collections and quoed scalars + mixin :flow_nodes + + # a plain scalar + rule %r/(?=#{plain_scalar_start}|[?:-][^ \t\n\r\f\v])/ do + token Name::Variable + push :plain_scalar_in_block_context + end + end + + state :descriptors do + # a full-form tag + rule %r/!<[0-9A-Za-z;\/?:@&=+$,_.!~*'()\[\]%-]+>/, Keyword::Type + + # a tag in the form '!', '!suffix' or '!handle!suffix' + rule %r( + (?:![\w-]+)? # handle + !(?:[\w;/?:@&=+$,.!~*\'()\[\]%-]*) # suffix + )x, Keyword::Type + + # an anchor + rule %r/&[\p{L}\p{Nl}\p{Nd}_-]+/, Name::Label + + # an alias + rule %r/\*[\p{L}\p{Nl}\p{Nd}_-]+/, Name::Variable + end + + state :block_nodes do + # implicit key + rule %r/((?:[\p{L}\p{Nl}\p{Nd}_][\p{L}\p{Nl}\p{Nd}\p{Blank}_-]*)?)(:)(?=\s|$)/ do |m| + groups Name::Attribute, Punctuation::Indicator + set_indent m[0], :implicit => true + end + + # literal and folded scalars + rule %r/[\|>][+-]?/ do + token Punctuation::Indicator + push :block_scalar_content + push :block_scalar_header + end + end + + state :flow_nodes do + rule %r/\[/, Punctuation::Indicator, :flow_sequence + rule %r/\{/, Punctuation::Indicator, :flow_mapping + rule %r/'/, Str::Single, :single_quoted_scalar + rule %r/"/, Str::Double, :double_quoted_scalar + end + + state :flow_collection do + rule %r/\s+/m, Text + mixin :basic + rule %r/[?:,]/, Punctuation::Indicator + mixin :descriptors + mixin :flow_nodes + + rule %r/(?=#{plain_scalar_start})/ do + push :plain_scalar_in_flow_context + end + end + + state :flow_sequence do + rule %r/\]/, Punctuation::Indicator, :pop! + mixin :flow_collection + end + + state :flow_mapping do + rule %r/\}/, Punctuation::Indicator, :pop! + mixin :flow_collection + end + + state :block_scalar_content do + rule %r/\n+/, Text + + # empty lines never dedent, but they might be part of the scalar. + rule %r/^[ ]+$/ do |m| + text = m[0] + indent_size = text.size + + indent_mark = @block_scalar_indent || indent_size + + token Text, text[0...indent_mark] + token Name::Constant, text[indent_mark..-1] + end + + # TODO: ^ doesn't actually seem to affect the match at all. + # Find a way to work around this limitation. + rule %r/^[ ]*/ do |m| + token Text + + indent_size = m[0].size + + dedent_level = @block_scalar_indent || self.indent + @block_scalar_indent ||= indent_size + + if indent_size < dedent_level + save_indent m[0] + pop! + push :indentation + end + end + + rule %r/[^\n\r\f\v]+/, Str + end + + state :block_scalar_header do + # optional indentation indicator and chomping flag, in either order + rule %r( + ( + ([1-9])[+-]? | [+-]?([1-9])? + )(?=[ ]|$) + )x do |m| + @block_scalar_indent = nil + goto :ignored_line + next if m[0].empty? + + increment = m[1] || m[2] + if increment + @block_scalar_indent = indent + increment.to_i + end + + token Punctuation::Indicator + end + end + + state :ignored_line do + mixin :basic + rule %r/[ ]+/, Text + rule %r/\n/, Text, :pop! + end + + state :quoted_scalar_whitespaces do + # leading and trailing whitespace is ignored + rule %r/^[ ]+/, Text + rule %r/[ ]+$/, Text + + rule %r/\n+/m, Text + + rule %r/[ ]+/, Name::Variable + end + + state :single_quoted_scalar do + mixin :quoted_scalar_whitespaces + rule %r/\\'/, Str::Escape + rule %r/'/, Str, :pop! + rule %r/[^\s']+/, Str + end + + state :double_quoted_scalar do + rule %r/"/, Str, :pop! + mixin :quoted_scalar_whitespaces + # escapes + rule %r/\\[0abt\tn\nvfre "\\N_LP]/, Str::Escape + rule %r/\\(?:x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/, + Str::Escape + rule %r/[^ \t\n\r\f\v"\\]+/, Str + end + + state :plain_scalar_in_block_context_new_line do + rule %r/^[ ]+\n/, Text + rule %r/\n+/m, Text + rule %r/^(?=---|\.\.\.)/ do + pop! 3 + end + + # dedent detection + rule %r/^[ ]*/ do |m| + token Text + pop! + + indent_size = m[0].size + + # dedent = end of scalar + if indent_size <= self.indent + pop! + save_indent(m[0]) + push :indentation + end + end + end + + state :plain_scalar_in_block_context do + # the : indicator ends a scalar + rule %r/[ ]*(?=:[ \n]|:$)/, Text, :pop! + rule %r/[ ]*:\S+/, Str + rule %r/[ ]+(?=#)/, Text, :pop! + rule %r/[ ]+$/, Text + # check for new documents or dedents at the new line + rule %r/\n+/ do + token Text + push :plain_scalar_in_block_context_new_line + end + + rule %r/[ ]+/, Str + rule SPECIAL_VALUES, Name::Constant + rule %r/\d+(?:\.\d+)?(?=(\r?\n)| +#)/, Literal::Number, :pop! + + # regular non-whitespace characters + rule %r/[^\s:]+/, Str + end + + state :plain_scalar_in_flow_context do + rule %r/[ ]*(?=[,:?\[\]{}])/, Text, :pop! + rule %r/[ ]+(?=#)/, Text, :pop! + rule %r/^[ ]+/, Text + rule %r/[ ]+$/, Text + rule %r/\n+/, Text + rule %r/[ ]+/, Name::Variable + rule %r/[^\s,:?\[\]{}]+/, Name::Variable + end + + state :yaml_directive do + rule %r/([ ]+)(\d+\.\d+)/ do + groups Text, Num + goto :ignored_line + end + end + + state :tag_directive do + rule %r( + ([ ]+)(!|![\w-]*!) # prefix + ([ ]+)(!|!?[\w;/?:@&=+$,.!~*'()\[\]%-]+) # tag handle + )x do + groups Text, Keyword::Type, Text, Keyword::Type + goto :ignored_line + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/yang.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/yang.rb new file mode 100644 index 000000000000..ce237e77058e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/yang.rb @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class YANG < RegexLexer + title 'YANG' + desc "Lexer for the YANG 1.1 modeling language (RFC7950)" + tag 'yang' + filenames '*.yang' + mimetypes 'application/yang' + + id = /[\w_-]+(?=[^\w\-\:])\b/ + + #Keywords from RFC7950 ; oriented at BNF style + def self.top_stmts_keywords + @top_stms_keywords ||= Set.new %w( + module submodule + ) + end + + def self.module_header_stmts_keywords + @module_header_stmts_keywords ||= Set.new %w( + belongs-to namespace prefix yang-version + ) + end + + def self.meta_stmts_keywords + @meta_stmts_keywords ||= Set.new %w( + contact description organization reference revision + ) + end + + def self.linkage_stmts_keywords + @linkage_stmts_keywords ||= Set.new %w( + import include revision-date + ) + end + + def self.body_stmts_keywords + @body_stms_keywords ||= Set.new %w( + action argument augment deviation extension feature grouping identity + if-feature input notification output rpc typedef + ) + end + + def self.data_def_stmts_keywords + @data_def_stms_keywords ||= Set.new %w( + anydata anyxml case choice config container deviate leaf leaf-list + list must presence refine uses when + ) + end + + def self.type_stmts_keywords + @type_stmts_keywords ||= Set.new %w( + base bit default enum error-app-tag error-message fraction-digits + length max-elements min-elements modifier ordered-by path pattern + position range require-instance status type units value yin-element + ) + end + + def self.list_stmts_keywords + @list_stmts_keywords ||= Set.new %w( + key mandatory unique + ) + end + + #RFC7950 other keywords + def self.constants_keywords + @constants_keywords ||= Set.new %w( + add current delete deprecated false invert-match max min + not-supported obsolete replace true unbounded user + ) + end + + #RFC7950 Built-In Types + def self.types + @types ||= Set.new %w( + binary bits boolean decimal64 empty enumeration identityref + instance-identifier int16 int32 int64 int8 leafref string uint16 + uint32 uint64 uint8 union + ) + end + + state :comment do + rule %r/[^*\/]/, Comment + rule %r/\/\*/, Comment, :comment + rule %r/\*\//, Comment, :pop! + rule %r/[*\/]/, Comment + end + + #Keyword::Reserved + #groups Name::Tag, Text::Whitespace + state :root do + rule %r/\s+/, Text::Whitespace + rule %r/[\{\}\;]+/, Punctuation + rule %r/(?<![\-\w])(and|or|not|\+|\.)(?![\-\w])/, Operator + + rule %r/"(?:\\"|[^"])*?"/, Str::Double #for double quotes + rule %r/'(?:\\'|[^'])*?'/, Str::Single #for single quotes + + rule %r/\/\*/, Comment, :comment + rule %r/\/\/.*?$/, Comment + + #match BNF stmt for `node-identifier` with [ prefix ":"] + rule %r/(?:^|(?<=[\s{};]))([\w.-]+)(:)([\w.-]+)(?=[\s{};])/ do + groups Name::Namespace, Punctuation, Name + end + + #match BNF stmt `date-arg-str` + rule %r/([0-9]{4}\-[0-9]{2}\-[0-9]{2})(?=[\s\{\}\;])/, Name::Label + rule %r/([0-9]+\.[0-9]+)(?=[\s\{\}\;])/, Num::Float + rule %r/([0-9]+)(?=[\s\{\}\;])/, Num::Integer + + rule id do |m| + name = m[0].downcase + + if self.class.top_stmts_keywords.include? name + token Keyword::Declaration + elsif self.class.module_header_stmts_keywords.include? name + token Keyword::Declaration + elsif self.class.meta_stmts_keywords.include? name + token Keyword::Declaration + elsif self.class.linkage_stmts_keywords.include? name + token Keyword::Declaration + elsif self.class.body_stmts_keywords.include? name + token Keyword::Declaration + elsif self.class.data_def_stmts_keywords.include? name + token Keyword::Declaration + elsif self.class.type_stmts_keywords.include? name + token Keyword::Declaration + elsif self.class.list_stmts_keywords.include? name + token Keyword::Declaration + elsif self.class.types.include? name + token Keyword::Type + elsif self.class.constants_keywords.include? name + token Name::Constant + else + token Name + end + end + + rule %r/[^;{}\s'"]+/, Name + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/zig.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/zig.rb new file mode 100644 index 000000000000..d278a36d0ee0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/lexers/zig.rb @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Zig < RegexLexer + tag 'zig' + aliases 'zir' + filenames '*.zig' + mimetypes 'text/x-zig' + + title 'Zig' + desc 'The Zig programming language (ziglang.org)' + + def self.keywords + @keywords ||= %w( + align linksection threadlocal struct enum union error break return + anyframe fn c_longlong c_ulonglong c_longdouble c_void comptime_float + c_short c_ushort c_int c_uint c_long c_ulong continue asm defer + errdefer const var extern packed export pub if else switch and or + orelse while for bool unreachable try catch async suspend nosuspend + await resume undefined usingnamespace test void noreturn type + anyerror usize noalias inline noinline comptime callconv volatile + allowzero + ) + end + + def self.builtins + @builtins ||= %w( + @addWithOverflow @as @atomicLoad @atomicStore @bitCast @breakpoint + @alignCast @alignOf @cDefine @cImport @cInclude @bitOffsetOf + @atomicRmw @bytesToSlice @byteOffsetOf @OpaqueType @panic @ptrCast + @bitReverse @Vector @sin @cUndef @canImplicitCast @clz @cmpxchgWeak + @cmpxchgStrong @compileError @compileLog @ctz @popCount @divExact + @divFloor @cos @divTrunc @embedFile @export @tagName @TagType + @errorName @call @errorReturnTrace @fence @fieldParentPtr @field + @unionInit @errorToInt @intToEnum @enumToInt @setAlignStack @frame + @Frame @exp @exp2 @log @log2 @log10 @fabs @floor @ceil @trunc @round + @floatCast @intToFloat @floatToInt @boolToInt @errSetCast @intToError + @frameAddress @import @newStackCall @asyncCall @intToPtr @intCast + @frameSize @memcpy @memset @mod @mulWithOverflow @splat @ptrToInt + @rem @returnAddress @setCold @Type @shuffle @setGlobalLinkage + @setGlobalSection @shlExact @This @hasDecl @hasField + @setRuntimeSafety @setEvalBranchQuota @setFloatMode @shlWithOverflow + @shrExact @sizeOf @bitSizeOf @sqrt @byteSwap @subWithOverflow + @sliceToBytes comptime_int @truncate @typeInfo @typeName @TypeOf + ) + end + + id = /[a-z_]\w*/i + escapes = /\\ ([nrt'"\\0] | x\h{2} | u\h{4} | U\h{8})/x + + state :bol do + mixin :whitespace + rule %r/#\s[^\n]*/, Comment::Special + rule(//) { pop! } + end + + state :attribute do + mixin :whitespace + mixin :literals + rule %r/[(,)=:]/, Name::Decorator + rule %r/\]/, Name::Decorator, :pop! + rule id, Name::Decorator + end + + state :whitespace do + rule %r/\s+/, Text + rule %r(//[^\n]*), Comment + end + + state :root do + rule %r/\n/, Text, :bol + + mixin :whitespace + + rule %r/\b(?:(i|u)[0-9]+)\b/, Keyword::Type + rule %r/\b(?:f(16|32|64|128))\b/, Keyword::Type + rule %r/\b(?:(isize|usize))\b/, Keyword::Type + + mixin :literals + + rule %r/'#{id}/, Name::Variable + rule %r/([.]?)(\s*)(@?#{id})(\s*)([(]?)/ do |m| + name = m[3] + t = if self.class.keywords.include? name + Keyword + elsif self.class.builtins.include? name + Name::Builtin + elsif !m[1].empty? && !m[5].empty? + Name::Function + elsif !m[1].empty? + Name::Property + else + Name + end + + groups Punctuation, Text, t, Text, Punctuation + end + + rule %r/[()\[\]{}|,:;]/, Punctuation + rule %r/[*\/!@~&+%^<>=\?-]|\.{1,3}/, Operator + end + + state :literals do + rule %r/\b(?:true|false|null)\b/, Keyword::Constant + rule %r( + ' (?: #{escapes} | [^\\] ) ' + )x, Str::Char + + rule %r/"/, Str, :string + rule %r/r(#*)".*?"\1/m, Str + + dot = /[.][0-9_]+/ + exp = /e[-+]?[0-9_]+/ + + rule %r( + [0-9]+ + (#{dot} #{exp}? + |#{dot}? #{exp} + ) + )x, Num::Float + + rule %r( + ( 0b[10_]+ + | 0x[0-9a-fA-F_]+ + | [0-9_]+ + ) + )x, Num::Integer + end + + state :string do + rule %r/"/, Str, :pop! + rule escapes, Str::Escape + rule %r/[^"\\]+/m, Str + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/plugins/redcarpet.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/plugins/redcarpet.rb new file mode 100644 index 000000000000..2558e1b60339 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/plugins/redcarpet.rb @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# this file is not require'd from the root. To use this plugin, run: +# +# require 'rouge/plugins/redcarpet' + +module Rouge + module Plugins + module Redcarpet + def block_code(code, language) + lexer = + begin + Lexer.find_fancy(language, code) + rescue Guesser::Ambiguous => e + e.alternatives.first + end + lexer ||= Lexers::PlainText + + # XXX HACK: Redcarpet strips hard tabs out of code blocks, + # so we assume you're not using leading spaces that aren't tabs, + # and just replace them here. + if lexer.tag == 'make' + code.gsub! %r/^ /, "\t" + end + + formatter = rouge_formatter(lexer) + formatter.format(lexer.lex(code)) + end + + # override this method for custom formatting behavior + def rouge_formatter(lexer) + Formatters::HTMLLegacy.new(:css_class => "highlight #{lexer.tag}") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/regex_lexer.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/regex_lexer.rb new file mode 100644 index 000000000000..a61883aaf128 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/regex_lexer.rb @@ -0,0 +1,498 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + # @abstract + # A stateful lexer that uses sets of regular expressions to + # tokenize a string. Most lexers are instances of RegexLexer. + class RegexLexer < Lexer + class InvalidRegex < StandardError + def initialize(re) + @re = re + end + + def to_s + "regex #{@re.inspect} matches empty string, but has no predicate!" + end + end + + class ClosedState < StandardError + attr_reader :state + def initialize(state) + @state = state + end + + def rule + @state.rules.last + end + + def to_s + rule = @state.rules.last + msg = "State :#{state.name} cannot continue after #{rule.inspect}, which will always match." + if rule.re.source.include?('*') + msg += " Consider replacing * with +." + end + + msg + end + end + + # A rule is a tuple of a regular expression to test, and a callback + # to perform if the test succeeds. + # + # @see StateDSL#rule + class Rule + attr_reader :callback + attr_reader :re + attr_reader :beginning_of_line + def initialize(re, callback) + @re = re + @callback = callback + @beginning_of_line = re.source[0] == ?^ + end + + def inspect + "#<Rule #{@re.inspect}>" + end + end + + # a State is a named set of rules that can be tested for or + # mixed in. + # + # @see RegexLexer.state + class State + attr_reader :name, :rules + def initialize(name, rules) + @name = name + @rules = rules + end + + def inspect + "#<#{self.class.name} #{@name.inspect}>" + end + end + + class StateDSL + attr_reader :rules, :name + def initialize(name, &defn) + @name = name + @defn = defn + @rules = [] + @loaded = false + @closed = false + end + + def to_state(lexer_class) + load! + rules = @rules.map do |rule| + rule.is_a?(String) ? lexer_class.get_state(rule) : rule + end + State.new(@name, rules) + end + + def prepended(&defn) + parent_defn = @defn + StateDSL.new(@name) do + instance_eval(&defn) + instance_eval(&parent_defn) + end + end + + def appended(&defn) + parent_defn = @defn + StateDSL.new(@name) do + instance_eval(&parent_defn) + instance_eval(&defn) + end + end + + protected + # Define a new rule for this state. + # + # @overload rule(re, token, next_state=nil) + # @overload rule(re, &callback) + # + # @param [Regexp] re + # a regular expression for this rule to test. + # @param [String] tok + # the token type to yield if `re` matches. + # @param [#to_s] next_state + # (optional) a state to push onto the stack if `re` matches. + # If `next_state` is `:pop!`, the state stack will be popped + # instead. + # @param [Proc] callback + # a block that will be evaluated in the context of the lexer + # if `re` matches. This block has access to a number of lexer + # methods, including {RegexLexer#push}, {RegexLexer#pop!}, + # {RegexLexer#token}, and {RegexLexer#delegate}. The first + # argument can be used to access the match groups. + def rule(re, tok=nil, next_state=nil, &callback) + raise ClosedState.new(self) if @closed + + if tok.nil? && callback.nil? + raise "please pass `rule` a token to yield or a callback" + end + + matches_empty = re =~ '' + + callback ||= case next_state + when :pop! + proc do |stream| + puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug + @output_stream.call(tok, stream[0]) + puts " popping stack: 1" if @debug + @stack.pop or raise 'empty stack!' + end + when :push + proc do |stream| + puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug + @output_stream.call(tok, stream[0]) + puts " pushing :#{@stack.last.name}" if @debug + @stack.push(@stack.last) + end + when Symbol + proc do |stream| + puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug + @output_stream.call(tok, stream[0]) + state = @states[next_state] || self.class.get_state(next_state) + puts " pushing :#{state.name}" if @debug + @stack.push(state) + end + when nil + # cannot use an empty-matching regexp with no predicate + raise InvalidRegex.new(re) if matches_empty + + proc do |stream| + puts " yielding: #{tok.qualname}, #{stream[0].inspect}" if @debug + @output_stream.call(tok, stream[0]) + end + else + raise "invalid next state: #{next_state.inspect}" + end + + rules << Rule.new(re, callback) + + close! if matches_empty && !context_sensitive?(re) + end + + def context_sensitive?(re) + source = re.source + return true if source =~ /[(][?]<?[!=]/ + + # anchors count as lookahead/behind + return true if source =~ /[$^]/ + + false + end + + def close! + @closed = true + end + + # Mix in the rules from another state into this state. The rules + # from the mixed-in state will be tried in order before moving on + # to the rest of the rules in this state. + def mixin(state) + rules << state.to_s + end + + private + def load! + return if @loaded + @loaded = true + instance_eval(&@defn) + end + end + + # The states hash for this lexer. + # @see state + def self.states + @states ||= {} + end + + def self.state_definitions + @state_definitions ||= InheritableHash.new(superclass.state_definitions) + end + @state_definitions = {} + + def self.replace_state(name, new_defn) + states[name] = nil + state_definitions[name] = new_defn + end + + # The routines to run at the beginning of a fresh lex. + # @see start + def self.start_procs + @start_procs ||= InheritableList.new(superclass.start_procs) + end + @start_procs = [] + + # Specify an action to be run every fresh lex. + # + # @example + # start { puts "I'm lexing a new string!" } + def self.start(&b) + start_procs << b + end + + # Define a new state for this lexer with the given name. + # The block will be evaluated in the context of a {StateDSL}. + def self.state(name, &b) + name = name.to_sym + state_definitions[name] = StateDSL.new(name, &b) + end + + def self.prepend(name, &b) + name = name.to_sym + dsl = state_definitions[name] or raise "no such state #{name.inspect}" + replace_state(name, dsl.prepended(&b)) + end + + def self.append(name, &b) + name = name.to_sym + dsl = state_definitions[name] or raise "no such state #{name.inspect}" + replace_state(name, dsl.appended(&b)) + end + + # @private + def self.get_state(name) + return name if name.is_a? State + + states[name.to_sym] ||= begin + defn = state_definitions[name.to_sym] or raise "unknown state: #{name.inspect}" + defn.to_state(self) + end + end + + # @private + def get_state(state_name) + self.class.get_state(state_name) + end + + # The state stack. This is initially the single state `[:root]`. + # It is an error for this stack to be empty. + # @see #state + def stack + @stack ||= [get_state(:root)] + end + + # The current state - i.e. one on top of the state stack. + # + # NB: if the state stack is empty, this will throw an error rather + # than returning nil. + def state + stack.last or raise 'empty stack!' + end + + # reset this lexer to its initial state. This runs all of the + # start_procs. + def reset! + @stack = nil + @current_stream = nil + + puts "start blocks" if @debug && self.class.start_procs.any? + self.class.start_procs.each do |pr| + instance_eval(&pr) + end + end + + # This implements the lexer protocol, by yielding [token, value] pairs. + # + # The process for lexing works as follows, until the stream is empty: + # + # 1. We look at the state on top of the stack (which by default is + # `[:root]`). + # 2. Each rule in that state is tried until one is successful. If one + # is found, that rule's callback is evaluated - which may yield + # tokens and manipulate the state stack. Otherwise, one character + # is consumed with an `'Error'` token, and we continue at (1.) + # + # @see #step #step (where (2.) is implemented) + def stream_tokens(str, &b) + stream = StringScanner.new(str) + + @current_stream = stream + @output_stream = b + @states = self.class.states + @null_steps = 0 + + until stream.eos? + if @debug + puts + puts "lexer: #{self.class.tag}" + puts "stack: #{stack.map(&:name).map(&:to_sym).inspect}" + puts "stream: #{stream.peek(20).inspect}" + end + + success = step(state, stream) + + if !success + puts " no match, yielding Error" if @debug + b.call(Token::Tokens::Error, stream.getch) + end + end + end + + # The number of successive scans permitted without consuming + # the input stream. If this is exceeded, the match fails. + MAX_NULL_SCANS = 5 + + # Runs one step of the lex. Rules in the current state are tried + # until one matches, at which point its callback is called. + # + # @return true if a rule was tried successfully + # @return false otherwise. + def step(state, stream) + state.rules.each do |rule| + if rule.is_a?(State) + puts " entering: mixin :#{rule.name}" if @debug + return true if step(rule, stream) + puts " exiting: mixin :#{rule.name}" if @debug + else + puts " trying: #{rule.inspect}" if @debug + + # XXX HACK XXX + # StringScanner's implementation of ^ is b0rken. + # see http://bugs.ruby-lang.org/issues/7092 + # TODO: this doesn't cover cases like /(a|^b)/, but it's + # the most common, for now... + next if rule.beginning_of_line && !stream.beginning_of_line? + + if (size = stream.skip(rule.re)) + puts " got: #{stream[0].inspect}" if @debug + + instance_exec(stream, &rule.callback) + + if size.zero? + @null_steps += 1 + if @null_steps > MAX_NULL_SCANS + puts " warning: too many scans without consuming the string!" if @debug + return false + end + else + @null_steps = 0 + end + + return true + end + end + end + + false + end + + # Yield a token. + # + # @param tok + # the token type + # @param val + # (optional) the string value to yield. If absent, this defaults + # to the entire last match. + def token(tok, val=@current_stream[0]) + yield_token(tok, val) + end + + # @deprecated + # + # Yield a token with the next matched group. Subsequent calls + # to this method will yield subsequent groups. + def group(tok) + raise "RegexLexer#group is deprecated: use #groups instead" + end + + # Yield tokens corresponding to the matched groups of the current + # match. + def groups(*tokens) + tokens.each_with_index do |tok, i| + yield_token(tok, @current_stream[i+1]) + end + end + + # Delegate the lex to another lexer. We use the `continue_lex` method + # so that #reset! will not be called. In this way, a single lexer + # can be repeatedly delegated to while maintaining its own internal + # state stack. + # + # @param [#lex] lexer + # The lexer or lexer class to delegate to + # @param [String] text + # The text to delegate. This defaults to the last matched string. + def delegate(lexer, text=nil) + puts " delegating to: #{lexer.inspect}" if @debug + text ||= @current_stream[0] + + lexer.continue_lex(text) do |tok, val| + puts " delegated token: #{tok.inspect}, #{val.inspect}" if @debug + yield_token(tok, val) + end + end + + def recurse(text=nil) + delegate(self.class, text) + end + + # Push a state onto the stack. If no state name is given and you've + # passed a block, a state will be dynamically created using the + # {StateDSL}. + def push(state_name=nil, &b) + push_state = if state_name + get_state(state_name) + elsif block_given? + StateDSL.new(b.inspect, &b).to_state(self.class) + else + # use the top of the stack by default + self.state + end + + puts " pushing: :#{push_state.name}" if @debug + stack.push(push_state) + end + + # Pop the state stack. If a number is passed in, it will be popped + # that number of times. + def pop!(times=1) + raise 'empty stack!' if stack.empty? + + puts " popping stack: #{times}" if @debug + + stack.pop(times) + + nil + end + + # replace the head of the stack with the given state + def goto(state_name) + raise 'empty stack!' if stack.empty? + + puts " going to: state :#{state_name} " if @debug + stack[-1] = get_state(state_name) + end + + # reset the stack back to `[:root]`. + def reset_stack + puts ' resetting stack' if @debug + stack.clear + stack.push get_state(:root) + end + + # Check if `state_name` is in the state stack. + def in_state?(state_name) + state_name = state_name.to_sym + stack.any? do |state| + state.name == state_name.to_sym + end + end + + # Check if `state_name` is the state on top of the state stack. + def state?(state_name) + state_name.to_sym == state.name + end + + private + def yield_token(tok, val) + return if val.nil? || val.empty? + puts " yielding: #{tok.qualname}, #{val.inspect}" if @debug + @output_stream.yield(tok, val) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/template_lexer.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/template_lexer.rb new file mode 100644 index 000000000000..384b37b359bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/template_lexer.rb @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + # @abstract + # A TemplateLexer is one that accepts a :parent option, to specify + # which language is being templated. The lexer class can specify its + # own default for the parent lexer, which is otherwise defaulted to + # HTML. + class TemplateLexer < RegexLexer + # the parent lexer - the one being templated. + def parent + return @parent if instance_variable_defined? :@parent + @parent = lexer_option(:parent) || Lexers::HTML.new(@options) + end + + option :parent, "the parent language (default: html)" + + start { parent.reset! } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/tex_theme_renderer.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/tex_theme_renderer.rb new file mode 100644 index 000000000000..e107d1657900 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/tex_theme_renderer.rb @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + class TexThemeRenderer + def initialize(theme, opts={}) + @theme = theme + @prefix = opts.fetch(:prefix) { 'RG' } + end + + # Our general strategy is this: + # + # * First, define the \RG{tokname}{content} command, which will + # expand into \RG@tok@tokname{content}. We use \csname...\endcsname + # to interpolate into a command. + # + # * Define the default RG* environment, which will enclose the whole + # thing. By default this will simply set \ttfamily (select monospace font) + # but it can be overridden with \renewcommand by the user to be + # any other formatting. + # + # * Define all the colors using xcolors \definecolor command. First we define + # every palette color with a name such as RG@palette@themneame@colorname. + # Then we find all foreground and background colors that have literal html + # colors embedded in them and define them with names such as + # RG@palette@themename@000000. While html allows three-letter colors such + # as #FFF, xcolor requires all six characters to be present, so we make sure + # to normalize that as well as the case convention in #inline_name. + # + # * Define the token commands RG@tok@xx. These will take the content as the + # argument and format it according to the theme, referring to the color + # in the palette. + def render(&b) + yield <<'END'.gsub('RG', @prefix) +\makeatletter +\def\RG#1#2{\csname RG@tok@#1\endcsname{#2}}% +\newenvironment{RG*}{\ttfamily}{\relax}% +END + + base = @theme.class.base_style + yield "\\definecolor{#{@prefix}@fgcolor}{HTML}{#{inline_name(base.fg || '#000000')}}" + yield "\\definecolor{#{@prefix}@bgcolor}{HTML}{#{inline_name(base.bg || '#FFFFFF')}}" + + render_palette(@theme.palette, &b) + + @theme.styles.each do |tok, style| + render_inline_pallete(style, &b) + end + + Token.each_token do |tok| + style = @theme.class.get_own_style(tok) + style ? render_style(tok, style, &b) : render_blank(tok, &b) + end + yield '\makeatother' + end + + def render_palette(palette, &b) + palette.each do |name, color| + hex = inline_name(color) + + yield "\\definecolor{#{palette_name(name)}}{HTML}{#{hex}}%" + end + end + + def render_inline_pallete(style, &b) + gen_inline(style[:fg], &b) + gen_inline(style[:bg], &b) + end + + def inline_name(color) + color =~ /^#(\h+)/ or return nil + + # xcolor does not support 3-character HTML colors, + # so we convert them here + case $1.size + when 6 + $1 + when 3 + # duplicate every character: abc -> aabbcc + $1.gsub(/\h/, '\0\0') + else + raise "invalid HTML color: #{$1}" + end.upcase + end + + def gen_inline(name, &b) + # detect inline colors + hex = inline_name(name) + return unless hex + + @gen_inline ||= {} + @gen_inline[hex] ||= begin + yield "\\definecolor{#{palette_name(hex)}}{HTML}{#{hex}}%" + end + end + + def camelize(name) + name.gsub(/_(.)/) { $1.upcase } + end + + def palette_name(name) + name = inline_name(name) || name.to_s + + "#{@prefix}@palette@#{camelize(@theme.name)}@#{camelize(name.to_s)}" + end + + def token_name(tok) + "\\csname #@prefix@tok@#{tok.shortname}\\endcsname" + end + + def render_blank(tok, &b) + out = "\\expandafter\\def#{token_name(tok)}#1{#1}" + end + + def render_style(tok, style, &b) + out = String.new('') + out << "\\expandafter\\def#{token_name(tok)}#1{" + out << "\\fboxsep=0pt\\colorbox{#{palette_name(style[:bg])}}{" if style[:bg] + out << '\\textbf{' if style[:bold] + out << '\\textit{' if style[:italic] + out << "\\textcolor{#{palette_name(style[:fg])}}{" if style[:fg] + out << "#1" + # close the right number of curlies + out << "}" if style[:bold] + out << "}" if style[:italic] + out << "}" if style[:fg] + out << "}" if style[:bg] + out << "}%" + yield out + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/text_analyzer.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/text_analyzer.rb new file mode 100644 index 000000000000..0540ca4252eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/text_analyzer.rb @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + class TextAnalyzer < String + # Find a shebang. Returns nil if no shebang is present. + def shebang + return @shebang if instance_variable_defined? :@shebang + + self =~ /\A\s*#!(.*)$/ + @shebang = $1 + end + + # Check if the given shebang is present. + # + # This normalizes things so that `text.shebang?('bash')` will detect + # `#!/bash`, '#!/bin/bash', '#!/usr/bin/env bash', and '#!/bin/bash -x' + def shebang?(match) + return false unless shebang + match = /\b#{match}(\s|$)/ + match === shebang + end + + # Return the contents of the doctype tag if present, nil otherwise. + def doctype + return @doctype if instance_variable_defined? :@doctype + + self =~ %r(\A\s* + (?:<\?.*?\?>\s*)? # possible <?xml...?> tag + <!DOCTYPE\s+(.+?)> + )xm + @doctype = $1 + end + + # Check if the doctype matches a given regexp or string + def doctype?(type=//) + type === doctype + end + + # Return true if the result of lexing with the given lexer contains no + # error tokens. + def lexes_cleanly?(lexer) + lexer.lex(self) do |(tok, _)| + return false if tok.name == 'Error' + end + + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/theme.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/theme.rb new file mode 100644 index 000000000000..4fae98b3bd42 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/theme.rb @@ -0,0 +1,218 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + class Theme + include Token::Tokens + + class Style < Hash + def initialize(theme, hsh={}) + super() + @theme = theme + merge!(hsh) + end + + [:fg, :bg].each do |mode| + define_method mode do + return self[mode] unless @theme + @theme.palette(self[mode]) if self[mode] + end + end + + def render(selector, &b) + return enum_for(:render, selector).to_a.join("\n") unless b + + return if empty? + + yield "#{selector} {" + rendered_rules.each do |rule| + yield " #{rule};" + end + yield "}" + end + + def rendered_rules(&b) + return enum_for(:rendered_rules) unless b + yield "color: #{fg}" if fg + yield "background-color: #{bg}" if bg + yield "font-weight: bold" if self[:bold] + yield "font-style: italic" if self[:italic] + yield "text-decoration: underline" if self[:underline] + + (self[:rules] || []).each(&b) + end + end + + def styles + @styles ||= self.class.styles.dup + end + + @palette = {} + def self.palette(arg={}) + @palette ||= InheritableHash.new(superclass.palette) + + if arg.is_a? Hash + @palette.merge! arg + @palette + else + case arg + when /#[0-9a-f]+/i + arg + else + @palette[arg] or raise "not in palette: #{arg.inspect}" + end + end + end + + def palette(*a) self.class.palette(*a) end + + @styles = {} + def self.styles + @styles ||= InheritableHash.new(superclass.styles) + end + + def self.render(opts={}, &b) + new(opts).render(&b) + end + + def get_own_style(token) + self.class.get_own_style(token) + end + + def get_style(token) + self.class.get_style(token) + end + + def name + self.class.name + end + + class << self + def style(*tokens) + style = tokens.last.is_a?(Hash) ? tokens.pop : {} + + tokens.each do |tok| + styles[tok] = style + end + end + + def get_own_style(token) + token.token_chain.reverse_each do |anc| + return Style.new(self, styles[anc]) if styles[anc] + end + + nil + end + + def get_style(token) + get_own_style(token) || base_style + end + + def base_style + get_own_style(Token::Tokens::Text) + end + + def name(n=nil) + return @name if n.nil? + + @name = n.to_s + register(@name) + end + + def register(name) + Theme.registry[name.to_s] = self + end + + def find(n) + registry[n.to_s] + end + + def registry + @registry ||= {} + end + end + end + + module HasModes + def mode(arg=:absent) + return @mode if arg == :absent + + @modes ||= {} + @modes[arg] ||= get_mode(arg) + end + + def get_mode(mode) + return self if self.mode == mode + + new_name = "#{self.name}.#{mode}" + Class.new(self) { name(new_name); set_mode!(mode) } + end + + def set_mode!(mode) + @mode = mode + send("make_#{mode}!") + end + + def mode!(arg) + alt_name = "#{self.name}.#{arg}" + register(alt_name) + set_mode!(arg) + end + end + + class CSSTheme < Theme + def initialize(opts={}) + @scope = opts[:scope] || '.highlight' + end + + def render(&b) + return enum_for(:render).to_a.join("\n") unless b + + # shared styles for tableized line numbers + yield "#{@scope} table td { padding: 5px; }" + yield "#{@scope} table pre { margin: 0; }" + + styles.each do |tok, style| + Style.new(self, style).render(css_selector(tok), &b) + end + end + + def render_base(selector, &b) + self.class.base_style.render(selector, &b) + end + + def style_for(tok) + self.class.get_style(tok) + end + + private + def css_selector(token) + inflate_token(token).map do |tok| + raise "unknown token: #{tok.inspect}" if tok.shortname.nil? + + single_css_selector(tok) + end.join(', ') + end + + def single_css_selector(token) + return @scope if token == Text + + "#{@scope} .#{token.shortname}" + end + + # yield all of the tokens that should be styled the same + # as the given token. Essentially this recursively all of + # the subtokens, except those which are more specifically + # styled. + def inflate_token(tok, &b) + return enum_for(:inflate_token, tok) unless block_given? + + yield tok + tok.sub_tokens.each do |(_, st)| + next if styles[st] + + inflate_token(st, &b) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/base16.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/base16.rb new file mode 100644 index 000000000000..56e0dae72bcb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/base16.rb @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + # default base16 theme + # by Chris Kempson (http://chriskempson.com) + class Base16 < CSSTheme + name 'base16' + + palette base00: "#151515" + palette base01: "#202020" + palette base02: "#303030" + palette base03: "#505050" + palette base04: "#b0b0b0" + palette base05: "#d0d0d0" + palette base06: "#e0e0e0" + palette base07: "#f5f5f5" + palette base08: "#ac4142" + palette base09: "#d28445" + palette base0A: "#f4bf75" + palette base0B: "#90a959" + palette base0C: "#75b5aa" + palette base0D: "#6a9fb5" + palette base0E: "#aa759f" + palette base0F: "#8f5536" + + extend HasModes + + def self.light! + mode :dark # indicate that there is a dark variant + mode! :light + end + + def self.dark! + mode :light # indicate that there is a light variant + mode! :dark + end + + def self.make_dark! + style Text, :fg => :base05, :bg => :base00 + end + + def self.make_light! + style Text, :fg => :base02 + end + + light! + + style Error, :fg => :base00, :bg => :base08 + style Comment, :fg => :base03 + + style Comment::Preproc, + Name::Tag, :fg => :base0A + + style Operator, + Punctuation, :fg => :base05 + + style Generic::Inserted, :fg => :base0B + style Generic::Deleted, :fg => :base08 + style Generic::Heading, :fg => :base0D, :bg => :base00, :bold => true + + style Keyword, :fg => :base0E + style Keyword::Constant, + Keyword::Type, :fg => :base09 + + style Keyword::Declaration, :fg => :base09 + + style Literal::String, :fg => :base0B + style Literal::String::Affix, :fg => :base0E + style Literal::String::Regex, :fg => :base0C + + style Literal::String::Interpol, + Literal::String::Escape, :fg => :base0F + + style Name::Namespace, + Name::Class, + Name::Constant, :fg => :base0A + + style Name::Attribute, :fg => :base0D + + style Literal::Number, + Literal::String::Symbol, :fg => :base0B + + class Solarized < Base16 + name 'base16.solarized' + light! + # author "Ethan Schoonover (http://ethanschoonover.com/solarized)" + + palette base00: "#002b36" + palette base01: "#073642" + palette base02: "#586e75" + palette base03: "#657b83" + palette base04: "#839496" + palette base05: "#93a1a1" + palette base06: "#eee8d5" + palette base07: "#fdf6e3" + palette base08: "#dc322f" + palette base09: "#cb4b16" + palette base0A: "#b58900" + palette base0B: "#859900" + palette base0C: "#2aa198" + palette base0D: "#268bd2" + palette base0E: "#6c71c4" + palette base0F: "#d33682" + end + + class Monokai < Base16 + name 'base16.monokai' + dark! + + # author "Wimer Hazenberg (http://www.monokai.nl)" + palette base00: "#272822" + palette base01: "#383830" + palette base02: "#49483e" + palette base03: "#75715e" + palette base04: "#a59f85" + palette base05: "#f8f8f2" + palette base06: "#f5f4f1" + palette base07: "#f9f8f5" + palette base08: "#f92672" + palette base09: "#fd971f" + palette base0A: "#f4bf75" + palette base0B: "#a6e22e" + palette base0C: "#a1efe4" + palette base0D: "#66d9ef" + palette base0E: "#ae81ff" + palette base0F: "#cc6633" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/bw.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/bw.rb new file mode 100644 index 000000000000..0752ed5b5aba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/bw.rb @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + # A port of the bw style from Pygments. + # See https://bitbucket.org/birkenfeld/pygments-main/src/default/pygments/styles/bw.py + class BlackWhiteTheme < CSSTheme + name 'bw' + + style Text, :fg => '#000000', :bg => '#ffffff' + + style Comment, :italic => true + style Comment::Preproc, :italic => false + + style Keyword, :bold => true + style Keyword::Pseudo, :bold => false + style Keyword::Type, :bold => false + + style Operator, :bold => true + + style Name::Class, :bold => true + style Name::Namespace, :bold => true + style Name::Exception, :bold => true + style Name::Entity, :bold => true + style Name::Tag, :bold => true + + style Literal::String, :italic => true + style Literal::String::Affix, :bold => true + style Literal::String::Interpol, :bold => true + style Literal::String::Escape, :bold => true + + style Generic::Heading, :bold => true + style Generic::Subheading, :bold => true + style Generic::Emph, :italic => true + style Generic::Strong, :bold => true + style Generic::Prompt, :bold => true + + style Error, :fg => '#FF0000' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/colorful.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/colorful.rb new file mode 100644 index 000000000000..abdd6788eabc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/colorful.rb @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + # stolen from pygments + class Colorful < CSSTheme + name 'colorful' + + style Text, :fg => "#bbbbbb", :bg => '#000' + + style Comment, :fg => "#888" + style Comment::Preproc, :fg => "#579" + style Comment::Special, :fg => "#cc0000", :bold => true + + style Keyword, :fg => "#080", :bold => true + style Keyword::Pseudo, :fg => "#038" + style Keyword::Type, :fg => "#339" + + style Operator, :fg => "#333" + style Operator::Word, :fg => "#000", :bold => true + + style Name::Builtin, :fg => "#007020" + style Name::Function, :fg => "#06B", :bold => true + style Name::Class, :fg => "#B06", :bold => true + style Name::Namespace, :fg => "#0e84b5", :bold => true + style Name::Exception, :fg => "#F00", :bold => true + style Name::Variable, :fg => "#963" + style Name::Variable::Instance, :fg => "#33B" + style Name::Variable::Class, :fg => "#369" + style Name::Variable::Global, :fg => "#d70", :bold => true + style Name::Constant, :fg => "#036", :bold => true + style Name::Label, :fg => "#970", :bold => true + style Name::Entity, :fg => "#800", :bold => true + style Name::Attribute, :fg => "#00C" + style Name::Tag, :fg => "#070" + style Name::Decorator, :fg => "#555", :bold => true + + style Literal::String, :bg => "#fff0f0" + style Literal::String::Affix, :fg => "#080", :bold => true + style Literal::String::Char, :fg => "#04D" + style Literal::String::Doc, :fg => "#D42" + style Literal::String::Interpol, :bg => "#eee" + style Literal::String::Escape, :fg => "#666", :bold => true + style Literal::String::Regex, :fg => "#000", :bg => "#fff0ff" + style Literal::String::Symbol, :fg => "#A60" + style Literal::String::Other, :fg => "#D20" + + style Literal::Number, :fg => "#60E", :bold => true + style Literal::Number::Integer, :fg => "#00D", :bold => true + style Literal::Number::Float, :fg => "#60E", :bold => true + style Literal::Number::Hex, :fg => "#058", :bold => true + style Literal::Number::Oct, :fg => "#40E", :bold => true + + style Generic::Heading, :fg => "#000080", :bold => true + style Generic::Subheading, :fg => "#800080", :bold => true + style Generic::Deleted, :fg => "#A00000" + style Generic::Inserted, :fg => "#00A000" + style Generic::Error, :fg => "#FF0000" + style Generic::Emph, :italic => true + style Generic::Strong, :bold => true + style Generic::Prompt, :fg => "#c65d09", :bold => true + style Generic::Output, :fg => "#888" + style Generic::Traceback, :fg => "#04D" + + style Error, :fg => "#F00", :bg => "#FAA" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/github.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/github.rb new file mode 100644 index 000000000000..88bfdc80f95c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/github.rb @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + class Github < CSSTheme + name 'github' + + style Comment::Multiline, :fg => '#999988', :italic => true + style Comment::Preproc, :fg => '#999999', :bold => true + style Comment::Single, :fg => '#999988', :italic => true + style Comment::Special, :fg => '#999999', :italic => true, :bold => true + style Comment, :fg => '#999988', :italic => true + style Error, :fg => '#a61717', :bg => '#e3d2d2' + style Generic::Deleted, :fg => '#000000', :bg => '#ffdddd' + style Generic::Emph, :fg => '#000000', :italic => true + style Generic::Error, :fg => '#aa0000' + style Generic::Heading, :fg => '#999999' + style Generic::Inserted, :fg => '#000000', :bg => '#ddffdd' + style Generic::Output, :fg => '#888888' + style Generic::Prompt, :fg => '#555555' + style Generic::Strong, :bold => true + style Generic::Subheading, :fg => '#aaaaaa' + style Generic::Traceback, :fg => '#aa0000' + style Keyword::Constant, :fg => '#000000', :bold => true + style Keyword::Declaration, :fg => '#000000', :bold => true + style Keyword::Namespace, :fg => '#000000', :bold => true + style Keyword::Pseudo, :fg => '#000000', :bold => true + style Keyword::Reserved, :fg => '#000000', :bold => true + style Keyword::Type, :fg => '#445588', :bold => true + style Keyword, :fg => '#000000', :bold => true + style Literal::Number::Float, :fg => '#009999' + style Literal::Number::Hex, :fg => '#009999' + style Literal::Number::Integer::Long, :fg => '#009999' + style Literal::Number::Integer, :fg => '#009999' + style Literal::Number::Oct, :fg => '#009999' + style Literal::Number, :fg => '#009999' + style Literal::String::Affix, :fg => '#000000', :bold => true + style Literal::String::Backtick, :fg => '#d14' + style Literal::String::Char, :fg => '#d14' + style Literal::String::Doc, :fg => '#d14' + style Literal::String::Double, :fg => '#d14' + style Literal::String::Escape, :fg => '#d14' + style Literal::String::Heredoc, :fg => '#d14' + style Literal::String::Interpol, :fg => '#d14' + style Literal::String::Other, :fg => '#d14' + style Literal::String::Regex, :fg => '#009926' + style Literal::String::Single, :fg => '#d14' + style Literal::String::Symbol, :fg => '#990073' + style Literal::String, :fg => '#d14' + style Name::Attribute, :fg => '#008080' + style Name::Builtin::Pseudo, :fg => '#999999' + style Name::Builtin, :fg => '#0086B3' + style Name::Class, :fg => '#445588', :bold => true + style Name::Constant, :fg => '#008080' + style Name::Decorator, :fg => '#3c5d5d', :bold => true + style Name::Entity, :fg => '#800080' + style Name::Exception, :fg => '#990000', :bold => true + style Name::Function, :fg => '#990000', :bold => true + style Name::Label, :fg => '#990000', :bold => true + style Name::Namespace, :fg => '#555555' + style Name::Tag, :fg => '#000080' + style Name::Variable::Class, :fg => '#008080' + style Name::Variable::Global, :fg => '#008080' + style Name::Variable::Instance, :fg => '#008080' + style Name::Variable, :fg => '#008080' + style Operator::Word, :fg => '#000000', :bold => true + style Operator, :fg => '#000000', :bold => true + style Text::Whitespace, :fg => '#bbbbbb' + style Text, :bg => '#f8f8f8' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/gruvbox.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/gruvbox.rb new file mode 100644 index 000000000000..116b13617205 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/gruvbox.rb @@ -0,0 +1,170 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +# TODO how are we going to handle soft/hard contrast? + +module Rouge + module Themes + # Based on https://github.com/morhetz/gruvbox, with help from + # https://github.com/daveyarwood/gruvbox-pygments + class Gruvbox < CSSTheme + name 'gruvbox' + + # global Gruvbox colours {{{ + C_dark0_hard = '#1d2021' + C_dark0 ='#282828' + C_dark0_soft = '#32302f' + C_dark1 = '#3c3836' + C_dark2 = '#504945' + C_dark3 = '#665c54' + C_dark4 = '#7c6f64' + C_dark4_256 = '#7c6f64' + + C_gray_245 = '#928374' + C_gray_244 = '#928374' + + C_light0_hard = '#f9f5d7' + C_light0 = '#fbf1c7' + C_light0_soft = '#f2e5bc' + C_light1 = '#ebdbb2' + C_light2 = '#d5c4a1' + C_light3 = '#bdae93' + C_light4 = '#a89984' + C_light4_256 = '#a89984' + + C_bright_red = '#fb4934' + C_bright_green = '#b8bb26' + C_bright_yellow = '#fabd2f' + C_bright_blue = '#83a598' + C_bright_purple = '#d3869b' + C_bright_aqua = '#8ec07c' + C_bright_orange = '#fe8019' + + C_neutral_red = '#cc241d' + C_neutral_green = '#98971a' + C_neutral_yellow = '#d79921' + C_neutral_blue = '#458588' + C_neutral_purple = '#b16286' + C_neutral_aqua = '#689d6a' + C_neutral_orange = '#d65d0e' + + C_faded_red = '#9d0006' + C_faded_green = '#79740e' + C_faded_yellow = '#b57614' + C_faded_blue = '#076678' + C_faded_purple = '#8f3f71' + C_faded_aqua = '#427b58' + C_faded_orange = '#af3a03' + # }}} + + extend HasModes + + def self.light! + mode :dark # indicate that there is a dark variant + mode! :light + end + + def self.dark! + mode :light # indicate that there is a light variant + mode! :dark + end + + def self.make_dark! + palette bg0: C_dark0 + palette bg1: C_dark1 + palette bg2: C_dark2 + palette bg3: C_dark3 + palette bg4: C_dark4 + + palette gray: C_gray_245 + + palette fg0: C_light0 + palette fg1: C_light1 + palette fg2: C_light2 + palette fg3: C_light3 + palette fg4: C_light4 + + palette fg4_256: C_light4_256 + + palette red: C_bright_red + palette green: C_bright_green + palette yellow: C_bright_yellow + palette blue: C_bright_blue + palette purple: C_bright_purple + palette aqua: C_bright_aqua + palette orange: C_bright_orange + + end + + def self.make_light! + palette bg0: C_light0 + palette bg1: C_light1 + palette bg2: C_light2 + palette bg3: C_light3 + palette bg4: C_light4 + + palette gray: C_gray_244 + + palette fg0: C_dark0 + palette fg1: C_dark1 + palette fg2: C_dark2 + palette fg3: C_dark3 + palette fg4: C_dark4 + + palette fg4_256: C_dark4_256 + + palette red: C_faded_red + palette green: C_faded_green + palette yellow: C_faded_yellow + palette blue: C_faded_blue + palette purple: C_faded_purple + palette aqua: C_faded_aqua + palette orange: C_faded_orange + end + + dark! + mode :light + + style Text, :fg => :fg0, :bg => :bg0 + style Error, :fg => :red, :bg => :bg0, :bold => true + style Comment, :fg => :gray, :italic => true + + style Comment::Preproc, :fg => :aqua + + style Name::Tag, :fg => :red + + style Operator, + Punctuation, :fg => :fg0 + + style Generic::Inserted, :fg => :green, :bg => :bg0 + style Generic::Deleted, :fg => :red, :bg => :bg0 + style Generic::Heading, :fg => :green, :bold => true + + style Keyword, :fg => :red + style Keyword::Constant, :fg => :purple + style Keyword::Type, :fg => :yellow + + style Keyword::Declaration, :fg => :orange + + style Literal::String, + Literal::String::Interpol, + Literal::String::Regex, :fg => :green, :italic => true + + style Literal::String::Affix, :fg => :red + + style Literal::String::Escape, :fg => :orange + + style Name::Namespace, + Name::Class, :fg => :aqua + + style Name::Constant, :fg => :purple + + style Name::Attribute, :fg => :green + + style Literal::Number, :fg => :purple + + style Literal::String::Symbol, :fg => :blue + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/igor_pro.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/igor_pro.rb new file mode 100644 index 000000000000..17c9dd3ef3e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/igor_pro.rb @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + class IgorPro < CSSTheme + name 'igorpro' + + style Text, :fg => '#444444' + style Comment::Preproc, :fg => '#CC00A3' + style Comment::Special, :fg => '#CC00A3' + style Comment, :fg => '#FF0000' + style Keyword::Constant, :fg => '#C34E00' + style Keyword::Declaration, :fg => '#0000FF' + style Keyword::Reserved, :fg => '#007575' + style Keyword, :fg => '#0000FF' + style Literal::String, :fg => '#009C00' + style Literal::String::Affix, :fg => '#0000FF' + style Name::Builtin, :fg => '#C34E00' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/magritte.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/magritte.rb new file mode 100644 index 000000000000..13a21a1f74ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/magritte.rb @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + class Magritte < CSSTheme + name 'magritte' + + palette :dragon => '#006c6c' + palette :black => '#000000' + palette :forest => '#007500' + palette :candy => '#ff0089' + palette :wine => '#7c0000' + palette :grape => '#4c48fe' + palette :dark => '#000707' + palette :cherry => '#f22700' + palette :white => '#ffffff' + palette :royal => '#19003a' + + palette :purple => '#840084' + palette :chocolate => '#920241' + palette :lavender => '#d8d9ff' + palette :eggshell => '#f3ffff' + palette :yellow => '#ffff3f' + + palette :lightgray => '#BBBBBB' + palette :darkgray => '#999999' + + style Text, :fg => :dark, :bg => :eggshell + style Generic::Lineno, :fg => :eggshell, :bg => :dark + + # style Generic::Prompt, :fg => :chilly, :bold => true + + style Comment, :fg => :dragon, :italic => true + style Comment::Preproc, :fg => :chocolate, :bold => true + style Error, :fg => :eggshell, :bg => :cherry + style Generic::Error, :fg => :cherry, :italic => true, :bold => true + style Keyword, :fg => :royal, :bold => true + style Operator, :fg => :grape, :bold => true + style Punctuation, :fg => :grape + style Generic::Deleted, :fg => :cherry + style Generic::Inserted, :fg => :forest + style Generic::Emph, :italic => true + style Generic::Strong, :bold => true + style Generic::Traceback, :fg => :black, :bg => :lavender + style Keyword::Constant, :fg => :forest, :bold => true + style Keyword::Namespace, + Keyword::Pseudo, + Keyword::Reserved, + Generic::Heading, + Generic::Subheading, :fg => :forest, :bold => true + style Keyword::Type, + Name::Constant, + Name::Class, + Name::Decorator, + Name::Namespace, + Name::Builtin::Pseudo, + Name::Exception, :fg => :chocolate, :bold => true + style Name::Label, + Name::Tag, :fg => :purple, :bold => true + style Literal::Number, + Literal::Date, :fg => :forest, :bold => true + style Literal::String::Symbol, :fg => :forest + style Literal::String, :fg => :wine, :bold => true + style Literal::String::Affix, :fg => :royal, :bold => true + style Literal::String::Escape, + Literal::String::Char, + Literal::String::Interpol, :fg => :purple, :bold => true + style Name::Builtin, :bold => true + style Name::Entity, :fg => :darkgray, :bold => true + style Text::Whitespace, :fg => :lightgray + style Generic::Output, :fg => :royal + style Name::Function, + Name::Property, + Name::Attribute, :fg => :candy + style Name::Variable, :fg => :candy, :bold => true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/molokai.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/molokai.rb new file mode 100644 index 000000000000..119422f29c7d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/molokai.rb @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + class Molokai < CSSTheme + name 'molokai' + + palette :black => '#1b1d1e' + palette :white => '#f8f8f2' + palette :blue => '#66d9ef' + palette :green => '#a6e22e' + palette :grey => '#403d3d' + palette :red => '#f92672' + palette :light_grey => '#465457' + palette :dark_blue => '#5e5d83' + palette :violet => '#af87ff' + palette :yellow => '#d7d787' + + style Comment, + Comment::Multiline, + Comment::Single, :fg => :dark_blue, :italic => true + style Comment::Preproc, :fg => :light_grey, :bold => true + style Comment::Special, :fg => :light_grey, :italic => true, :bold => true + style Error, :fg => :white, :bg => :grey + style Generic::Inserted, :fg => :green + style Generic::Deleted, :fg => :red + style Generic::Emph, :fg => :black, :italic => true + style Generic::Error, + Generic::Traceback, :fg => :red + style Generic::Heading, :fg => :grey + style Generic::Output, :fg => :grey + style Generic::Prompt, :fg => :blue + style Generic::Strong, :bold => true + style Generic::Subheading, :fg => :light_grey + style Keyword, + Keyword::Constant, + Keyword::Declaration, + Keyword::Pseudo, + Keyword::Reserved, + Keyword::Type, :fg => :blue, :bold => true + style Keyword::Namespace, + Operator::Word, + Operator, :fg => :red, :bold => true + style Literal::Number::Float, + Literal::Number::Hex, + Literal::Number::Integer::Long, + Literal::Number::Integer, + Literal::Number::Oct, + Literal::Number, + Literal::String::Escape, :fg => :violet + style Literal::String::Backtick, + Literal::String::Char, + Literal::String::Doc, + Literal::String::Double, + Literal::String::Heredoc, + Literal::String::Interpol, + Literal::String::Other, + Literal::String::Regex, + Literal::String::Single, + Literal::String::Symbol, + Literal::String, :fg => :yellow + style Name::Attribute, :fg => :green + style Name::Class, + Name::Decorator, + Name::Exception, + Name::Function, :fg => :green, :bold => true + style Name::Constant, :fg => :blue + style Name::Builtin::Pseudo, + Name::Builtin, + Name::Entity, + Name::Namespace, + Name::Variable::Class, + Name::Variable::Global, + Name::Variable::Instance, + Name::Variable, + Text::Whitespace, :fg => :white + style Name::Label, :fg => :white, :bold => true + style Name::Tag, :fg => :red + style Text, :fg => :white, :bg => :black + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/monokai.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/monokai.rb new file mode 100644 index 000000000000..5469c0e55a3c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/monokai.rb @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + class Monokai < CSSTheme + name 'monokai' + + palette :black => '#000000' + palette :bright_green => '#a6e22e' + palette :bright_pink => '#f92672' + palette :carmine => '#960050' + palette :dark => '#49483e' + palette :dark_grey => '#888888' + palette :dark_red => '#aa0000' + palette :dimgrey => '#75715e' + palette :dimgreen => '#324932' + palette :dimred => '#493131' + palette :emperor => '#555555' + palette :grey => '#999999' + palette :light_grey => '#aaaaaa' + palette :light_violet => '#ae81ff' + palette :soft_cyan => '#66d9ef' + palette :soft_yellow => '#e6db74' + palette :very_dark => '#1e0010' + palette :whitish => '#f8f8f2' + palette :orange => '#f6aa11' + palette :white => '#ffffff' + + style Comment, + Comment::Multiline, + Comment::Single, :fg => :dimgrey, :italic => true + style Comment::Preproc, :fg => :dimgrey, :bold => true + style Comment::Special, :fg => :dimgrey, :italic => true, :bold => true + style Error, :fg => :carmine, :bg => :very_dark + style Generic::Inserted, :fg => :white, :bg => :dimgreen + style Generic::Deleted, :fg => :white, :bg => :dimred + style Generic::Emph, :fg => :black, :italic => true + style Generic::Error, + Generic::Traceback, :fg => :dark_red + style Generic::Heading, :fg => :grey + style Generic::Output, :fg => :dark_grey + style Generic::Prompt, :fg => :emperor + style Generic::Strong, :bold => true + style Generic::Subheading, :fg => :light_grey + style Keyword, + Keyword::Constant, + Keyword::Declaration, + Keyword::Pseudo, + Keyword::Reserved, + Keyword::Type, :fg => :soft_cyan, :bold => true + style Keyword::Namespace, + Operator::Word, + Operator, :fg => :bright_pink, :bold => true + style Literal::Number::Float, + Literal::Number::Hex, + Literal::Number::Integer::Long, + Literal::Number::Integer, + Literal::Number::Oct, + Literal::Number, + Literal::String::Escape, :fg => :light_violet + style Literal::String::Affix, :fg => :soft_cyan, :bold => true + style Literal::String::Backtick, + Literal::String::Char, + Literal::String::Doc, + Literal::String::Double, + Literal::String::Heredoc, + Literal::String::Interpol, + Literal::String::Other, + Literal::String::Regex, + Literal::String::Single, + Literal::String::Symbol, + Literal::String, :fg => :soft_yellow + style Name::Attribute, :fg => :bright_green + style Name::Class, + Name::Decorator, + Name::Exception, + Name::Function, :fg => :bright_green, :bold => true + style Name::Constant, :fg => :soft_cyan + style Name::Builtin::Pseudo, + Name::Builtin, + Name::Entity, + Name::Namespace, + Name::Variable::Class, + Name::Variable::Global, + Name::Variable::Instance, + Name::Variable, + Text::Whitespace, :fg => :whitish + style Name::Label, :fg => :whitish, :bold => true + style Name::Tag, :fg => :bright_pink + style Text, :fg => :whitish, :bg => :dark + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/monokai_sublime.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/monokai_sublime.rb new file mode 100644 index 000000000000..050150b68932 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/monokai_sublime.rb @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + class MonokaiSublime < CSSTheme + name 'monokai.sublime' + + palette :black => '#000000' + palette :bright_green => '#a6e22e' + palette :bright_pink => '#f92672' + palette :carmine => '#960050' + palette :dark => '#49483e' + palette :dark_graphite => '#272822' + palette :dark_grey => '#888888' + palette :dark_red => '#aa0000' + palette :dimgrey => '#75715e' + palette :emperor => '#555555' + palette :grey => '#999999' + palette :light_grey => '#aaaaaa' + palette :light_violet => '#ae81ff' + palette :soft_cyan => '#66d9ef' + palette :soft_yellow => '#e6db74' + palette :very_dark => '#1e0010' + palette :whitish => '#f8f8f2' + palette :orange => '#f6aa11' + palette :white => '#ffffff' + + style Generic::Heading, :fg => :grey + style Literal::String::Regex, :fg => :orange + style Generic::Output, :fg => :dark_grey + style Generic::Prompt, :fg => :emperor + style Generic::Strong, :bold => false + style Generic::Subheading, :fg => :light_grey + style Name::Builtin, :fg => :orange + style Comment::Multiline, + Comment::Preproc, + Comment::Single, + Comment::Special, + Comment, :fg => :dimgrey + style Error, + Generic::Error, + Generic::Traceback, :fg => :carmine + style Generic::Deleted, + Generic::Inserted, + Generic::Emph, :fg => :dark + style Keyword::Constant, + Keyword::Declaration, + Keyword::Reserved, + Name::Constant, + Keyword::Type, :fg => :soft_cyan + style Literal::Number::Float, + Literal::Number::Hex, + Literal::Number::Integer::Long, + Literal::Number::Integer, + Literal::Number::Oct, + Literal::Number, + Literal::String::Char, + Literal::String::Escape, + Literal::String::Symbol, :fg => :light_violet + style Literal::String::Doc, + Literal::String::Double, + Literal::String::Backtick, + Literal::String::Heredoc, + Literal::String::Interpol, + Literal::String::Other, + Literal::String::Single, + Literal::String, :fg => :soft_yellow + style Name::Attribute, + Name::Class, + Name::Decorator, + Name::Exception, + Name::Function, :fg => :bright_green + style Name::Variable::Class, + Name::Namespace, + Name::Label, + Name::Entity, + Name::Builtin::Pseudo, + Name::Variable::Global, + Name::Variable::Instance, + Name::Variable, + Text::Whitespace, + Text, + Name, :fg => :white, :bg => :dark_graphite + style Operator::Word, + Name::Tag, + Keyword, + Keyword::Namespace, + Keyword::Pseudo, + Operator, :fg => :bright_pink + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/pastie.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/pastie.rb new file mode 100644 index 000000000000..be1e48850d8b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/pastie.rb @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + # A port of the pastie style from Pygments. + # See https://bitbucket.org/birkenfeld/pygments-main/src/default/pygments/styles/pastie.py + class Pastie < CSSTheme + name 'pastie' + + style Comment, :fg => '#888888' + style Comment::Preproc, :fg => '#cc0000', :bold => true + style Comment::Special, :fg => '#cc0000', :bg => '#fff0f0', :bold => true + + style Error, :fg => '#a61717', :bg => '#e3d2d2' + style Generic::Error, :fg => '#aa0000' + + style Generic::Heading, :fg => '#333333' + style Generic::Subheading, :fg => '#666666' + + style Generic::Deleted, :fg => '#000000', :bg => '#ffdddd' + style Generic::Inserted, :fg => '#000000', :bg => '#ddffdd' + + style Generic::Emph, :italic => true + style Generic::Strong, :bold => true + + style Generic::Lineno, :fg => '#888888' + style Generic::Output, :fg => '#888888' + style Generic::Prompt, :fg => '#555555' + style Generic::Traceback, :fg => '#aa0000' + + style Keyword, :fg => '#008800', :bold => true + style Keyword::Pseudo, :fg => '#008800' + style Keyword::Type, :fg => '#888888', :bold => true + + style Num, :fg => '#0000dd', :bold => true + + style Str, :fg => '#dd2200', :bg => '#fff0f0' + style Str::Affix, :fg => '#008800', :bold => true + style Str::Escape, :fg => '#0044dd', :bg => '#fff0f0' + style Str::Interpol, :fg => '#3333bb', :bg => '#fff0f0' + style Str::Other, :fg => '#22bb22', :bg => '#f0fff0' + #style Str::Regex, :fg => '#008800', :bg => '#fff0ff' + # The background color on regex really doesn't look good, so let's drop it + style Str::Regex, :fg => '#008800' + style Str::Symbol, :fg => '#aa6600', :bg => '#fff0f0' + + style Name::Attribute, :fg => '#336699' + style Name::Builtin, :fg => '#003388' + style Name::Class, :fg => '#bb0066', :bold => true + style Name::Constant, :fg => '#003366', :bold => true + style Name::Decorator, :fg => '#555555' + style Name::Exception, :fg => '#bb0066', :bold => true + style Name::Function, :fg => '#0066bb', :bold => true + #style Name::Label, :fg => '#336699', :italic => true + # Name::Label is used for built-in CSS properties in Rouge, so let's drop italics + style Name::Label, :fg => '#336699' + style Name::Namespace, :fg => '#bb0066', :bold => true + style Name::Property, :fg => '#336699', :bold => true + style Name::Tag, :fg => '#bb0066', :bold => true + style Name::Variable, :fg => '#336699' + style Name::Variable::Global, :fg => '#dd7700' + style Name::Variable::Instance, :fg => '#3333bb' + + style Operator::Word, :fg => '#008800' + + style Text, {} + style Text::Whitespace, :fg => '#bbbbbb' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/thankful_eyes.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/thankful_eyes.rb new file mode 100644 index 000000000000..d13fae78a9ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/thankful_eyes.rb @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + class ThankfulEyes < CSSTheme + name 'thankful_eyes' + + # pallette, from GTKSourceView's ThankfulEyes + palette :cool_as_ice => '#6c8b9f' + palette :slate_blue => '#4e5d62' + palette :eggshell_cloud => '#dee5e7' + palette :krasna => '#122b3b' + palette :aluminum1 => '#fefeec' + palette :scarletred2 => '#cc0000' + palette :butter3 => '#c4a000' + palette :go_get_it => '#b2fd6d' + palette :chilly => '#a8e1fe' + palette :unicorn => '#faf6e4' + palette :sandy => '#f6dd62' + palette :pink_merengue => '#f696db' + palette :dune => '#fff0a6' + palette :backlit => '#4df4ff' + palette :schrill => '#ffb000' + + style Text, :fg => :unicorn, :bg => :krasna + style Generic::Lineno, :fg => :eggshell_cloud, :bg => :slate_blue + + style Generic::Prompt, :fg => :chilly, :bold => true + + style Comment, :fg => :cool_as_ice, :italic => true + style Comment::Preproc, :fg => :go_get_it, :bold => true + style Error, :fg => :aluminum1, :bg => :scarletred2 + style Generic::Error, :fg => :scarletred2, :italic => true, :bold => true + style Keyword, :fg => :sandy, :bold => true + style Operator, :fg => :backlit, :bold => true + style Punctuation, :fg => :backlit + style Generic::Deleted, :fg => :scarletred2 + style Generic::Inserted, :fg => :go_get_it + style Generic::Emph, :italic => true + style Generic::Strong, :bold => true + style Generic::Traceback, :fg => :eggshell_cloud, :bg => :slate_blue + style Keyword::Constant, :fg => :pink_merengue, :bold => true + style Keyword::Namespace, + Keyword::Pseudo, + Keyword::Reserved, + Generic::Heading, + Generic::Subheading, :fg => :schrill, :bold => true + style Keyword::Type, + Name::Constant, + Name::Class, + Name::Decorator, + Name::Namespace, + Name::Builtin::Pseudo, + Name::Exception, :fg => :go_get_it, :bold => true + style Name::Label, + Name::Tag, :fg => :schrill, :bold => true + style Literal::Number, + Literal::Date, + Literal::String::Symbol, :fg => :pink_merengue, :bold => true + style Literal::String, :fg => :dune, :bold => true + style Literal::String::Affix, :fg => :sandy, :bold => true + style Literal::String::Escape, + Literal::String::Char, + Literal::String::Interpol, :fg => :backlit, :bold => true + style Name::Builtin, :bold => true + style Name::Entity, :fg => '#999999', :bold => true + style Text::Whitespace, + Generic::Output, :fg => '#BBBBBB' + style Name::Function, + Name::Property, + Name::Attribute, :fg => :chilly + style Name::Variable, :fg => :chilly, :bold => true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/tulip.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/tulip.rb new file mode 100644 index 000000000000..df3ad71433f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/themes/tulip.rb @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Themes + class Tulip < CSSTheme + name 'tulip' + + palette :purple => '#766DAF' + palette :lpurple => '#9f93e6' + palette :orange => '#FAAF4C' + palette :green => '#3FB34F' + palette :lgreen => '#41ff5b' + palette :yellow => '#FFF02A' + palette :black => '#000000' + palette :gray => '#6D6E70' + palette :red => '#CC0000' + palette :dark_purple => '#231529' + palette :lunicorn => '#faf8ed' + palette :white => '#FFFFFF' + palette :earth => '#181a27' + palette :dune => '#fff0a6' + + style Text, :fg => :white, :bg => :dark_purple + + style Comment, :fg => :gray, :italic => true + style Comment::Preproc, :fg => :lgreen, :bold => true + style Error, + Generic::Error, :fg => :white, :bg => :red + style Keyword, :fg => :yellow, :bold => true + style Operator, + Punctuation, :fg => :lgreen + style Generic::Deleted, :fg => :red + style Generic::Inserted, :fg => :green + style Generic::Emph, :italic => true + style Generic::Strong, :bold => true + style Generic::Traceback, + Generic::Lineno, :fg => :white, :bg => :purple + style Keyword::Constant, :fg => :lpurple, :bold => true + style Keyword::Namespace, + Keyword::Pseudo, + Keyword::Reserved, + Generic::Heading, + Generic::Subheading, :fg => :white, :bold => true + style Keyword::Type, + Name::Constant, + Name::Class, + Name::Decorator, + Name::Namespace, + Name::Builtin::Pseudo, + Name::Exception, :fg => :orange, :bold => true + style Name::Label, + Name::Tag, :fg => :lpurple, :bold => true + style Literal::Number, + Literal::Date, + Literal::String::Symbol, :fg => :lpurple, :bold => true + style Literal::String, :fg => :dune, :bold => true + style Literal::String::Affix, :fg => :yellow, :bold => true + style Literal::String::Escape, + Literal::String::Char, + Literal::String::Interpol, :fg => :orange, :bold => true + style Name::Builtin, :bold => true + style Name::Entity, :fg => '#999999', :bold => true + style Text::Whitespace, :fg => '#BBBBBB' + style Name::Function, + Name::Property, + Name::Attribute, :fg => :lgreen + style Name::Variable, :fg => :lgreen, :bold => true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/token.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/token.rb new file mode 100644 index 000000000000..c6de5313e0c2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/token.rb @@ -0,0 +1,191 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + class Token + class << self + attr_reader :name + attr_reader :parent + attr_reader :shortname + + def cache + @cache ||= {} + end + + def sub_tokens + @sub_tokens ||= {} + end + + def [](qualname) + return qualname unless qualname.is_a? ::String + + Token.cache[qualname] + end + + def inspect + "<Token #{qualname}>" + end + + def matches?(other) + other.token_chain.include? self + end + + def token_chain + @token_chain ||= ancestors.take_while { |x| x != Token }.reverse + end + + def qualname + @qualname ||= token_chain.map(&:name).join('.') + end + + def register! + Token.cache[self.qualname] = self + parent.sub_tokens[self.name] = self + end + + def make_token(name, shortname, &b) + parent = self + Class.new(parent) do + @parent = parent + @name = name + @shortname = shortname + register! + class_eval(&b) if b + end + end + + def token(name, shortname, &b) + tok = make_token(name, shortname, &b) + const_set(name, tok) + end + + def each_token(&b) + Token.cache.each do |(_, t)| + b.call(t) + end + end + end + + module Tokens + def self.token(name, shortname, &b) + tok = Token.make_token(name, shortname, &b) + const_set(name, tok) + end + + # XXX IMPORTANT XXX + # For compatibility, this list must be kept in sync with + # pygments.token.STANDARD_TYPES + # please see https://github.com/jneen/rouge/wiki/List-of-tokens + token :Text, '' do + token :Whitespace, 'w' + end + + token :Escape, 'esc' + token :Error, 'err' + token :Other, 'x' + + token :Keyword, 'k' do + token :Constant, 'kc' + token :Declaration, 'kd' + token :Namespace, 'kn' + token :Pseudo, 'kp' + token :Reserved, 'kr' + token :Type, 'kt' + token :Variable, 'kv' + end + + token :Name, 'n' do + token :Attribute, 'na' + token :Builtin, 'nb' do + token :Pseudo, 'bp' + end + token :Class, 'nc' + token :Constant, 'no' + token :Decorator, 'nd' + token :Entity, 'ni' + token :Exception, 'ne' + token :Function, 'nf' do + token :Magic, 'fm' + end + token :Property, 'py' + token :Label, 'nl' + token :Namespace, 'nn' + token :Other, 'nx' + token :Tag, 'nt' + token :Variable, 'nv' do + token :Class, 'vc' + token :Global, 'vg' + token :Instance, 'vi' + token :Magic, 'vm' + end + end + + token :Literal, 'l' do + token :Date, 'ld' + + token :String, 's' do + token :Affix, 'sa' + token :Backtick, 'sb' + token :Char, 'sc' + token :Delimiter, 'dl' + token :Doc, 'sd' + token :Double, 's2' + token :Escape, 'se' + token :Heredoc, 'sh' + token :Interpol, 'si' + token :Other, 'sx' + token :Regex, 'sr' + token :Single, 's1' + token :Symbol, 'ss' + end + + token :Number, 'm' do + token :Bin, 'mb' + token :Float, 'mf' + token :Hex, 'mh' + token :Integer, 'mi' do + token :Long, 'il' + end + token :Oct, 'mo' + token :Other, 'mx' + end + end + + token :Operator, 'o' do + token :Word, 'ow' + end + + token :Punctuation, 'p' do + token :Indicator, 'pi' + end + + token :Comment, 'c' do + token :Hashbang, 'ch' + token :Doc, 'cd' + token :Multiline, 'cm' + token :Preproc, 'cp' + token :PreprocFile, 'cpf' + token :Single, 'c1' + token :Special, 'cs' + end + + token :Generic, 'g' do + token :Deleted, 'gd' + token :Emph, 'ge' + token :Error, 'gr' + token :Heading, 'gh' + token :Inserted, 'gi' + token :Output, 'go' + token :Prompt, 'gp' + token :Strong, 'gs' + token :Subheading, 'gu' + token :Traceback, 'gt' + token :Lineno, 'gl' + end + + # convenience + Num = Literal::Number + Str = Literal::String + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/util.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/util.rb new file mode 100644 index 000000000000..d20468611522 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/util.rb @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + class InheritableHash < Hash + def initialize(parent=nil) + @parent = parent + end + + def [](k) + value = super + return value if own_keys.include?(k) + + value || parent[k] + end + + def parent + @parent ||= {} + end + + def include?(k) + super or parent.include?(k) + end + + def each(&b) + keys.each do |k| + b.call(k, self[k]) + end + end + + alias own_keys keys + def keys + keys = own_keys.concat(parent.keys) + keys.uniq! + keys + end + end + + class InheritableList + include Enumerable + + def initialize(parent=nil) + @parent = parent + end + + def parent + @parent ||= [] + end + + def each(&b) + return enum_for(:each) unless block_given? + + parent.each(&b) + own_entries.each(&b) + end + + def own_entries + @own_entries ||= [] + end + + def push(o) + own_entries << o + end + alias << push + end + + # shared methods for some indentation-sensitive lexers + module Indentation + def reset! + super + @block_state = @block_indentation = nil + end + + # push a state for the next indented block + def starts_block(block_state) + @block_state = block_state + @block_indentation = @last_indentation || '' + puts " starts_block: #{block_state.inspect}" if @debug + puts " block_indentation: #{@block_indentation.inspect}" if @debug + end + + # handle a single indented line + def indentation(indent_str) + puts " indentation: #{indent_str.inspect}" if @debug + puts " block_indentation: #{@block_indentation.inspect}" if @debug + @last_indentation = indent_str + + # if it's an indent and we know where to go next, + # push that state. otherwise, push content and + # clear the block state. + if (@block_state && + indent_str.start_with?(@block_indentation) && + indent_str != @block_indentation + ) + push @block_state + else + @block_state = @block_indentation = nil + push :content + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/version.rb b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/version.rb new file mode 100644 index 000000000000..cad1c5e98f4e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/lib/rouge/version.rb @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + def self.version + "3.26.0" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/rouge.gemspec b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/rouge.gemspec new file mode 100644 index 000000000000..c03687639c84 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rouge-3.26.0/rouge.gemspec @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require './lib/rouge/version' + +Gem::Specification.new do |s| + s.name = "rouge" + s.version = Rouge.version + s.authors = ["Jeanine Adkisson"] + s.email = ["jneen@jneen.net"] + s.summary = "A pure-ruby colorizer based on pygments" + s.description = <<-desc.strip.gsub(/\s+/, ' ') + Rouge aims to a be a simple, easy-to-extend drop-in replacement + for pygments. + desc + s.homepage = "http://rouge.jneen.net/" + s.files = Dir['Gemfile', 'LICENSE', 'rouge.gemspec', 'lib/**/*.rb', 'lib/**/*.yml', 'bin/rougify', 'lib/rouge/demos/*'] + s.executables = %w(rougify) + s.licenses = ['MIT', 'BSD-2-Clause'] + s.required_ruby_version = '>= 2.0' + s.metadata = { + "bug_tracker_uri" => "https://github.com/rouge-ruby/rouge/issues", + "changelog_uri" => "https://github.com/rouge-ruby/rouge/blob/master/CHANGELOG.md", + "documentation_uri" => "https://rouge-ruby.github.io/docs/", + "source_code_uri" => "https://github.com/rouge-ruby/rouge" + } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/CHANGELOG.md new file mode 100644 index 000000000000..6566fe7d8c0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/CHANGELOG.md @@ -0,0 +1,50 @@ +### 0.9.0 (2021/01/21) + +* [#34](https://github.com/dblock/ruby-enum/pull/34): Added support for Ruby 3.0 - [@dblock](https://github.com/dblock). +* [#29](https://github.com/dblock/ruby-enum/pull/29): Added superclass values when enumerating with `Ruby::Enum#values` - [@gi](https://github.com/gi). +* [#30](https://github.com/dblock/ruby-enum/pull/30): Default value to key - [@gi](https://github.com/gi). +* [#34](https://github.com/dblock/ruby-enum/pull/34): Replaced Travis-CI with Github Actions, added Danger PR linter - [@dblock](https://github.com/dblock). +* [#37](https://github.com/dblock/ruby-enum/pull/37): Added code coverage - [@dblock](https://github.com/dblock). + +### 0.8.0 (2020/03/27) + +* [#22](https://github.com/dblock/ruby-enum/pull/22): Added `Ruby::Enum#each_key` and `Ruby::Enum#each_value` - [@dblock](https://github.com/dblock). +* [#22](https://github.com/dblock/ruby-enum/pull/22): Dropped support for Ruby 2.2 - [@dblock](https://github.com/dblock). +* [#22](https://github.com/dblock/ruby-enum/pull/22): Upgraded RuboCop to 0.80.1 - [@dblock](https://github.com/dblock). + +### 0.7.2 (2017/03/15) + +* [#18](https://github.com/dblock/ruby-enum/pull/18): Added support for non constant definition - [@laertispappas](https://github.com/laertispappas). + +### 0.7.1 (2017/02/23) + +* [#16](https://github.com/dblock/ruby-enum/pull/16): Replaced `const_missing` with `const_set` - [@laertispappas](https://github.com/laertispappas). + +### 0.7.0 (2017/02/21) + +* [#3](https://github.com/dblock/ruby-enum/pull/13): Added support for subclassing an Enum - [@laertispappas](https://github.com/laertispappas). + +### 0.6.0 (2016/05/12) + +* [#12](https://github.com/dblock/ruby-enum/pull/12): A `Ruby::Enum::Errors::DuplicateKeyError` or a `Ruby::Enum::Errors::DuplciateKeyValyeError` will now be raised when duplicate keys / values are defined - [@laertispappas](https://github.com/laertispappas). + +### 0.5.0 (2015/11/20) + +* [#8](https://github.com/dblock/ruby-enum/pull/8): Added `Ruby::Enum#key`, `Ruby::Enum#value`, `Ruby::Enum#key?`, and `Ruby::Enum#value?` - [@dmolesUC3](https://github.com/dmolesUC3). + +### 0.4.0 (2014/06/29) + +* [#5](https://github.com/dblock/ruby-enum/pull/5): Mixed in `Enumerable` - [@kgann](https://github.com/kgann). + +### 0.3.0 (2014/05/19) + +* [#4](https://github.com/dblock/ruby-enum/pull/4): Added `Ruby::Enum#map` - [@ArnaudRinquin](https://github.com/ArnaudRinquin). + +### 0.2.1 (2013/05/15) + +* Added `Ruby::Enum#values`, `Ruby::Enum#keys` and `Ruby::Enum#to_h` - [@dblock](https://github.com/dblock). +* A `Ruby::Enum::Errors::UninitializedConstantError` will now be raised when referencing an undefined enum - [@dblock](https://github.com/dblock). + +### 0.1.0 (2013/05/14) + +* Initial public release, live-coded during [May 2013 NYC.rb](http://code.dblock.org/your-first-ruby-gem) - [@dblock](https://github.com/dblock). diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/CONTRIBUTING.md b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/CONTRIBUTING.md new file mode 100644 index 000000000000..976b05b7fd88 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/CONTRIBUTING.md @@ -0,0 +1,125 @@ +# Contributing to Ruby-Enum + +This project is work of [many contributors](https://github.com/dblock/ruby-enum/graphs/contributors). + +You're encouraged to submit [pull requests](https://github.com/dblock/ruby-enum/pulls), [propose features and discuss issues](https://github.com/dblock/ruby-enum/issues). + +In the examples below, substitute your Github username for `contributor` in URLs. + +### Fork the Project + +Fork the [project on Github](https://github.com/dblock/ruby-enum) and check out your copy. + +``` +git clone https://github.com/contributor/ruby-enum.git +cd ruby-enum +git remote add upstream https://github.com/dblock/ruby-enum.git +``` + +### Bundle Install and Test + +Ensure that you can build the project and run tests. + +``` +bundle install +bundle exec rake +``` + +## Contribute Code + +### Create a Topic Branch + +Make sure your fork is up-to-date and create a topic branch for your feature or bug fix. + +``` +git checkout master +git pull upstream master +git checkout -b my-feature-branch +``` + +### Write Tests + +Try to write a test that reproduces the problem you're trying to fix or describes a feature that you want to build. Add tests to [spec](spec). + +We definitely appreciate pull requests that highlight or reproduce a problem, even without a fix. + +### Write Code + +Implement your feature or bug fix. + +Ruby style is enforced with [Rubocop](https://github.com/bbatsov/rubocop). Run `bundle exec rubocop` and fix any style issues highlighted, auto-correct issues when possible with `bundle exec rubocop -a`. To silence generally ingored issues, including line lengths or code complexity metrics, run `bundle exec rubocop --auto-gen-config`. + +Make sure that `bundle exec rake` completes without errors. + +### Write Documentation + +Document any external behavior in the [README](README.md). + +### Update Changelog + +Add a line to [CHANGELOG](CHANGELOG.md) under *Next Release*. Don't remove *Your contribution here*. + +Make it look like every other line, including a link to the issue being fixed, your name and link to your Github account. + +### Commit Changes + +Make sure git knows your name and email address: + +``` +git config --global user.name "Your Name" +git config --global user.email "contributor@example.com" +``` + +Writing good commit logs is important. A commit log should describe what changed and why. + +``` +git add ... +git commit +``` + +### Push + +``` +git push origin my-feature-branch +``` + +### Make a Pull Request + +Go to https://github.com/contributor/ruby-enum and select your feature branch. Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days. + +### Update CHANGELOG Again + +Update the [CHANGELOG](CHANGELOG.md) with the pull request number. A typical entry looks as follows. + +``` +* [#123](https://github.com/dblock/ruby-enum/pull/123): Reticulated splines - [@contributor](https://github.com/contributor). +``` + +Amend your previous commit and force push the changes. + +``` +git commit --amend +git push origin my-feature-branch -f +``` + +### Rebase + +If you've been working on a change for a while, rebase with upstream/master. + +``` +git fetch upstream +git rebase upstream/master +git push origin my-feature-branch -f +``` + +### Check on Your Pull Request + +Go back to your pull request after a few minutes and see whether it passed muster with Travis-CI. Everything should look green, otherwise fix issues and amend your commit as described above. + +### Be Patient + +It's likely that your change will not be merged and that the nitpicky maintainers will ask you to do more, or fix seemingly benign problems. Hang on there! + +## Thank You + +Please do know that we really appreciate and value your time and work. We love you, really. diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Dangerfile b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Dangerfile new file mode 100644 index 000000000000..a0a4a57e0ced --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Dangerfile @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +changelog.check! +toc.check! diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Gemfile new file mode 100644 index 000000000000..56badd57881d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Gemfile @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +source 'http://rubygems.org' + +gemspec + +gem 'rake' + +group :development, :test do + gem 'danger' + gem 'danger-changelog', '0.6.1' + gem 'danger-toc', '0.2.0' + gem 'rspec', '~> 3.0' + gem 'rubocop', '0.80.1' +end + +group :test do + gem 'simplecov', require: false +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Gemfile.lock b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Gemfile.lock new file mode 100644 index 000000000000..f2954cdbdc56 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Gemfile.lock @@ -0,0 +1,136 @@ +PATH + remote: . + specs: + ruby-enum (0.9.0) + i18n + +GEM + remote: http://rubygems.org/ + specs: + activesupport (6.1.0) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + ast (2.4.2) + claide (1.0.3) + claide-plugins (0.9.2) + cork + nap + open4 (~> 1.3) + colored2 (3.1.2) + concurrent-ruby (1.1.7) + cork (0.3.0) + colored2 (~> 3.1) + danger (8.2.1) + claide (~> 1.0) + claide-plugins (>= 0.9.2) + colored2 (~> 3.1) + cork (~> 0.1) + faraday (>= 0.9.0, < 2.0) + faraday-http-cache (~> 2.0) + git (~> 1.7) + kramdown (~> 2.3) + kramdown-parser-gfm (~> 1.0) + no_proxy_fix + octokit (~> 4.7) + terminal-table (~> 1) + danger-changelog (0.6.1) + danger-plugin-api (~> 1.0) + danger-plugin-api (1.0.0) + danger (> 2.0) + danger-toc (0.2.0) + activesupport + danger-plugin-api (~> 1.0) + kramdown + diff-lcs (1.3) + docile (1.3.5) + faraday (1.3.0) + faraday-net_http (~> 1.0) + multipart-post (>= 1.2, < 3) + ruby2_keywords + faraday-http-cache (2.2.0) + faraday (>= 0.8) + faraday-net_http (1.0.0) + git (1.8.1) + rchardet (~> 1.8) + i18n (1.8.7) + concurrent-ruby (~> 1.0) + jaro_winkler (1.5.4) + kramdown (2.3.0) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + minitest (5.14.3) + multipart-post (2.1.1) + nap (1.1.0) + no_proxy_fix (0.1.2) + octokit (4.20.0) + faraday (>= 0.9) + sawyer (~> 0.8.0, >= 0.5.3) + open4 (1.3.4) + parallel (1.20.1) + parser (3.0.0.0) + ast (~> 2.4.1) + public_suffix (4.0.6) + rainbow (3.0.0) + rake (13.0.1) + rchardet (1.8.0) + rexml (3.2.4) + rspec (3.9.0) + rspec-core (~> 3.9.0) + rspec-expectations (~> 3.9.0) + rspec-mocks (~> 3.9.0) + rspec-core (3.9.1) + rspec-support (~> 3.9.1) + rspec-expectations (3.9.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.9.0) + rspec-mocks (3.9.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.9.0) + rspec-support (3.9.2) + rubocop (0.80.1) + jaro_winkler (~> 1.5.1) + parallel (~> 1.10) + parser (>= 2.7.0.1) + rainbow (>= 2.2.2, < 4.0) + rexml + ruby-progressbar (~> 1.7) + unicode-display_width (>= 1.4.0, < 1.7) + ruby-progressbar (1.11.0) + ruby2_keywords (0.0.2) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) + simplecov (0.21.2) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.12.3) + simplecov_json_formatter (0.1.2) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + tzinfo (2.0.4) + concurrent-ruby (~> 1.0) + unicode-display_width (1.6.1) + zeitwerk (2.4.2) + +PLATFORMS + ruby + +DEPENDENCIES + danger + danger-changelog (= 0.6.1) + danger-toc (= 0.2.0) + rake + rspec (~> 3.0) + rubocop (= 0.80.1) + ruby-enum! + simplecov + +BUNDLED WITH + 2.1.4 diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/LICENSE.md new file mode 100644 index 000000000000..a450dc3728e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/LICENSE.md @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2013-2021 Daniel Doubrovkine. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/README.md b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/README.md new file mode 100644 index 000000000000..1e6e66d61e20 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/README.md @@ -0,0 +1,275 @@ +Ruby::Enum +========== + +[![Gem Version](http://img.shields.io/gem/v/ruby-enum.svg)](http://badge.fury.io/rb/ruby-enum) +[![Build Status](https://github.com/dblock/ruby-enum/workflows/test/badge.svg?branch=master)](https://github.com/dblock/ruby-enum/actions) +[![Code Climate](https://codeclimate.com/github/dblock/ruby-enum.svg)](https://codeclimate.com/github/dblock/ruby-enum) + +Enum-like behavior for Ruby, heavily inspired by [this](http://www.rubyfleebie.com/enumerations-and-ruby), and improved upon [another blog post](http://code.dblock.org/how-to-define-enums-in-ruby). + +## Table of Contents + +- [Usage](#usage) + - [Constants](#constants) + - [Class Methods](#class-methods) + - [Default Value](#default-value) + - [Enumerating](#enumerating) + - [Iterating](#iterating) + - [Mapping](#mapping) + - [Reducing](#reducing) + - [Sorting](#sorting) + - [Hashing](#hashing) + - [Retrieving keys and values](#retrieving-keys-and-values) + - [Mapping keys to values](#mapping-keys-to-values) + - [Mapping values to keys](#mapping-values-to-keys) + - [Duplicate enumerator keys or duplicate values](#duplicate-enumerator-keys-or-duplicate-values) + - [Inheritance](#inheritance) +- [Contributing](#contributing) +- [Copyright and License](#copyright-and-license) +- [Related Projects](#related-projects) + +## Usage + +Enums can be defined and accessed either as constants, or class methods, which is a matter of preference. + +### Constants + +Define enums, and reference them as constants. + +``` ruby +class OrderState + include Ruby::Enum + + define :CREATED, 'created' + define :PAID, 'paid' +end +``` + +``` ruby +OrderState::CREATED # 'created' +OrderState::PAID # 'paid' +OrderState::UNKNOWN # raises Ruby::Enum::Errors::UninitializedConstantError +OrderState.keys # [ :CREATED, :PAID ] +OrderState.values # [ 'created', 'paid' ] +OrderState.to_h # { :CREATED => 'created', :PAID => 'paid' } +``` + +### Class Methods + +Define enums, and reference them as class methods. + +``` ruby +class OrderState + include Ruby::Enum + + define :created, 'created' + define :paid, 'paid' +end +``` + +```ruby +OrderState.created # 'created' +OrderState.paid # 'paid' +OrderState.undefined # NoMethodError is raised +OrderState.keys # [ :created, :paid ] +OrderState.values # ['created', 'paid'] +OrderState.to_h # { :created => 'created', :paid => 'paid' } +``` + +### Default Value + +The value is optional. If unspecified, the value will default to the key. + +``` ruby +class OrderState + include Ruby::Enum + + define :UNSPECIFIED + define :unspecified +end +``` + +``` ruby +OrderState::UNSPECIFIED # :UNSPECIFIED +OrderState.unspecified # :unspecified +``` + +### Enumerating + +Enums support all `Enumerable` methods. + +#### Iterating + +``` ruby +OrderState.each do |key, enum| + # key and enum.key are :CREATED, :PAID + # enum.value is 'created', 'paid' +end +``` + +``` ruby +OrderState.each_key do |key| + # :CREATED, :PAID +end +``` + +``` ruby +OrderState.each_value do |value| + # 'created', 'paid' +end +``` + +#### Mapping + +``` ruby +OrderState.map do |key, enum| + # key and enum.key are :CREATED, :PAID + # enum.value is 'created', 'paid' + [enum.value, key] +end + +# => [ ['created', :CREATED], ['paid', :PAID] ] +``` + +#### Reducing + +``` ruby +OrderState.reduce([]) do |arr, (key, enum)| + # key and enum.key are :CREATED, :PAID + # enum.value is 'created', 'paid' + arr << [enum.value, key] +end + +# => [ ['created', :CREATED], ['paid', :PAID] ] +``` + +#### Sorting + +``` ruby +OrderState.sort_by do |key, enum| + # key and enum.key are :CREATED, :PAID + # enum.value is 'created', 'paid' + enum.value.length +end + +# => [[:PAID, #<OrderState:0x0 @key=:PAID, @value="paid">], [:CREATED, #<OrderState:0x1 @key=:CREATED, @value="created">]] +``` + +### Hashing + +Several hash-like methods are supported. + +#### Retrieving keys and values + +``` ruby +OrderState.keys +# => [:CREATED, :PAID] + +OrderState.values +# => ['created', 'paid'] +``` + +#### Mapping keys to values + +``` ruby +OrderState.key?(:CREATED) +# => true + +OrderState.value(:CREATED) +# => 'created' + +OrderState.key?(:FAILED) +# => false + +OrderState.value(:FAILED) +# => nil +``` + +#### Mapping values to keys + +``` ruby +OrderState.value?('paid') +# => true + +OrderState.key('paid') +# => :PAID + +OrderState.value?('failed') +# => false + +OrderState.key('failed') +# => nil +``` + +### Duplicate enumerator keys or duplicate values + +Defining duplicate enums raises `Ruby::Enum::Errors::DuplicateKeyError`. + +```ruby +class OrderState + include Ruby::Enum + + define :CREATED, 'created' + define :CREATED, 'recreated' # raises DuplicateKeyError +end +``` + +Defining a duplicate value raises `Ruby::Enum::Errors::DuplicateValueError`. + +```ruby +class OrderState + include Ruby::Enum + + define :CREATED, 'created' + define :RECREATED, 'created' # raises DuplicateValueError +end +``` + +The `DuplicateValueError` exception is raised to be consistent with the unique key constraint. Since keys are unique, there needs to be a way to map values to keys using `OrderState.value('created')`. + +### Inheritance + +When inheriting from a `Ruby::Enum` class, all defined enums in the parent class will be accessible in sub classes as well. Sub classes can also provide extra enums, as usual. + +``` ruby +class OrderState + include Ruby::Enum + + define :CREATED, 'CREATED' + define :PAID, 'PAID' +end + +class ShippedOrderState < OrderState + define :PREPARED, 'PREPARED' + define :SHIPPED, 'SHIPPED' +end +``` + +``` ruby +ShippedOrderState::CREATED # 'CREATED' +ShippedOrderState::PAID # 'PAID' +ShippedOrderState::PREPARED # 'PREPARED' +ShippedOrderState::SHIPPED # 'SHIPPED' +``` + +The `values` class method will enumerate the values from all base classes. + +``` ruby +OrderState.values # ['CREATED', 'PAID'] +ShippedOrderState.values # ['CREATED', 'PAID', 'PREPARED', SHIPPED'] +``` + +## Contributing + +You're encouraged to contribute to ruby-enum. See [CONTRIBUTING](CONTRIBUTING.md) for details. + +## Copyright and License + +Copyright (c) 2013-2021, Daniel Doubrovkine and [Contributors](CHANGELOG.md). + +This project is licensed under the [MIT License](LICENSE.md). + +## Related Projects + +* [typesafe_enum](https://github.com/dmolesUC3/typesafe_enum): Typesafe enums, inspired by Java. +* [renum](https://github.com/duelinmarkers/renum): A readable, but terse enum. diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/RELEASING.md b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/RELEASING.md new file mode 100644 index 000000000000..756915c617ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/RELEASING.md @@ -0,0 +1,60 @@ +# Releasing Ruby-Enum + +There are no hard rules about when to release ruby-enum. Release bug fixes frequently, features not so frequently and breaking API changes rarely. + +### Release + +Run tests, check that all tests succeed locally. + +``` +bundle install +rake +``` + +Check that the last build succeeded in [Travis CI](https://travis-ci.org/dblock/ruby-enum) for all supported platforms. + +Add a date to this release in [CHANGELOG.md](CHANGELOG.md). + +``` +### 0.2.2 (2015/7/10) +``` + +Remove the line with "Your contribution here.", since there will be no more contributions to this release. + +Commit your changes. + +``` +git add README.md CHANGELOG.md lib/ruby-enum/version.rb +git commit -m "Preparing for release, 0.2.2." +``` + +Release. + +``` +$ rake release + +ruby-enum 0.2.2 built to pkg/ruby-enum-0.2.2.gem. +Tagged v0.2.2. +Pushed git commits and tags. +Pushed ruby-enum 0.2.2 to rubygems.org. +``` + +### Prepare for the Next Version + +Add the next release to [CHANGELOG.md](CHANGELOG.md). + +``` +### 0.2.3 (Next) + +* Your contribution here. +``` + +Increment the third version number in [lib/ruby-enum/version.rb](lib/ruby-enum/version.rb). + +Commit your changes. + +``` +git add CHANGELOG.md lib/ruby-enum/version.rb +git commit -m "Preparing for next development iteration, 0.2.3." +git push origin master +``` diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Rakefile new file mode 100644 index 000000000000..dd0ed122911d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/Rakefile @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'rubygems' +require 'bundler/gem_tasks' + +Bundler.setup :default, :development + +require 'rspec/core' +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) do |spec| + spec.pattern = FileList['spec/**/*_spec.rb'] +end + +require 'rubocop/rake_task' +RuboCop::RakeTask.new(:rubocop) + +task default: %i[rubocop spec] diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/UPGRADING.md b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/UPGRADING.md new file mode 100644 index 000000000000..1a25311a22e0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/UPGRADING.md @@ -0,0 +1,44 @@ +# Upgrading Ruby::Enum + +## Upgrading to >= 0.9.0 + +### Inheritance & `Ruby::Enum.values` + +This only applies to classes that inherit from another which is a `Ruby::Enum`. + +Prior to version `0.9.0`, the `values` class method would enumerate only the +values defined in the class. + +As of version `0.9.0`, the `values` class method enumerates values defined in +the entire class heirarchy, ancestors first. + +``` ruby +class PrimaryColors + include Ruby::Enum + + define :RED, 'RED' + define :GREEN, 'GREEN' + define :BLUE, 'BLUE' +end + +class RainbowColors < PrimaryColors + define :ORANGE, 'ORANGE' + define :YELLOW, 'YELLOW' + define :INIDGO, 'INIDGO' + define :VIOLET, 'VIOLET' +end +``` + +`gem 'ruby-enum', '< 0.9.0'` + +``` ruby +RainbowColors.values # ['ORANGE', 'YELLOW', 'INIDGO', 'VIOLET'] +``` + +`gem 'ruby-enum', '>= 0.9.0'` + +``` ruby +RainbowColors.values # ['RED', 'ORANGE', 'YELLOW', 'GREEN', 'BLUE', 'INIDGO', 'VIOLET'] +``` + +See [#29](https://github.com/dblock/ruby-enum/pull/29) for more information. diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png new file mode 100644 index 000000000000..e1ba61a8055f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png new file mode 100644 index 000000000000..fb11dfe24a6c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png new file mode 100644 index 000000000000..af5bc7c5a10b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png new file mode 100644 index 000000000000..0e156deb5f61 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png new file mode 100644 index 000000000000..c9fdd8a1502f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/application.css b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/application.css new file mode 100644 index 000000000000..916699ed2ae2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/application.css @@ -0,0 +1 @@ +html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,code,del,dfn,em,img,q,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,dialog,figure,footer,header,hgroup,nav,section{margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline}article,aside,dialog,figure,footer,header,hgroup,nav,section{display:block}body{line-height:1.5}table{border-collapse:separate;border-spacing:0}caption,th,td{text-align:left;font-weight:normal}table,td,th{vertical-align:middle}blockquote:before,blockquote:after,q:before,q:after{content:""}blockquote,q{quotes:"" ""}a img{border:0}html{font-size:100.01%}body{font-size:82%;color:#222;background:#fff;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif}h1,h2,h3,h4,h5,h6{font-weight:normal;color:#111}h1{font-size:3em;line-height:1;margin-bottom:.5em}h2{font-size:2em;margin-bottom:.75em}h3{font-size:1.5em;line-height:1;margin-bottom:1em}h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}h5{font-size:1em;font-weight:bold;margin-bottom:1.5em}h6{font-size:1em;font-weight:bold}h1 img,h2 img,h3 img,h4 img,h5 img,h6 img{margin:0}p{margin:0 0 1.5em}p img.left{float:left;margin:1.5em 1.5em 1.5em 0;padding:0}p img.right{float:right;margin:1.5em 0 1.5em 1.5em}a:focus,a:hover{color:#000}a{color:#009;text-decoration:underline}blockquote{margin:1.5em;color:#666;font-style:italic}strong{font-weight:bold}em,dfn{font-style:italic}dfn{font-weight:bold}sup,sub{line-height:0}abbr,acronym{border-bottom:1px dotted #666}address{margin:0 0 1.5em;font-style:italic}del{color:#666}pre{margin:1.5em 0;white-space:pre}pre,code,tt{font:1em 'andale mono','lucida console',monospace;line-height:1.5}li ul,li ol{margin:0}ul,ol{margin:0 1.5em 1.5em 0;padding-left:3.333em}ul{list-style-type:disc}ol{list-style-type:decimal}dl{margin:0 0 1.5em 0}dl dt{font-weight:bold}dd{margin-left:1.5em}table{margin-bottom:1.4em;width:100%}th{font-weight:bold}thead th{background:#c3d9ff}th,td,caption{padding:4px 10px 4px 5px}tr.even td{background:#efefef}tfoot{font-style:italic}caption{background:#eee}.small{font-size:.8em;margin-bottom:1.875em;line-height:1.875em}.large{font-size:1.2em;line-height:2.5em;margin-bottom:1.25em}.hide{display:none}.quiet{color:#666}.loud{color:#000}.highlight{background:#ff0}.added{background:#060;color:#fff}.removed{background:#900;color:#fff}.first{margin-left:0;padding-left:0}.last{margin-right:0;padding-right:0}.top{margin-top:0;padding-top:0}.bottom{margin-bottom:0;padding-bottom:0}label{font-weight:bold}fieldset{padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc}legend{font-weight:bold;font-size:1.2em}input[type=text],input[type=password],input.text,input.title,textarea,select{background-color:#fff;border:1px solid #bbb}input[type=text]:focus,input[type=password]:focus,input.text:focus,input.title:focus,textarea:focus,select:focus{border-color:#666}input[type=text],input[type=password],input.text,input.title,textarea,select{margin:.5em 0}input.text,input.title{width:300px;padding:5px}input.title{font-size:1.5em}textarea{width:390px;height:250px;padding:5px}input[type=checkbox],input[type=radio],input.checkbox,input.radio{position:relative;top:.25em}form.inline{line-height:3}form.inline p{margin-bottom:0}.error,.notice,.success{padding:.8em;margin-bottom:1em;border:2px solid #ddd}.error{background:#fbe3e4;color:#8a1f11;border-color:#fbc2c4}.notice{background:#fff6bf;color:#514721;border-color:#ffd324}.success{background:#e6efc2;color:#264409;border-color:#c6d880}.error a{color:#8a1f11}.notice a{color:#514721}.success a{color:#264409}.box{padding:1.5em;margin-bottom:1.5em;background:#e5ecf9}hr{background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:0}hr.space{background:#fff;color:#fff;visibility:hidden}.clearfix:after,.container:after{content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden}.clearfix,.container{display:block}.clear{clear:both}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:0}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("DataTables-1.10.20/images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("DataTables-1.10.20/images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("DataTables-1.10.20/images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("DataTables-1.10.20/images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("DataTables-1.10.20/images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:0}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:0}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,white),color-stop(100%,#dcdcdc));background:-webkit-linear-gradient(top,white 0,#dcdcdc 100%);background:-moz-linear-gradient(top,white 0,#dcdcdc 100%);background:-ms-linear-gradient(top,white 0,#dcdcdc 100%);background:-o-linear-gradient(top,white 0,#dcdcdc 100%);background:linear-gradient(to bottom,white 0,#dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#585858),color-stop(100%,#111));background:-webkit-linear-gradient(top,#585858 0,#111 100%);background:-moz-linear-gradient(top,#585858 0,#111 100%);background:-ms-linear-gradient(top,#585858 0,#111 100%);background:-o-linear-gradient(top,#585858 0,#111 100%);background:linear-gradient(to bottom,#585858 0,#111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:0;background-color:#2b2b2b;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#2b2b2b),color-stop(100%,#0c0c0c));background:-webkit-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-moz-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-ms-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-o-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:linear-gradient(to bottom,#2b2b2b 0,#0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),color-stop(25%,rgba(255,255,255,0.9)),color-stop(75%,rgba(255,255,255,0.9)),color-stop(100%,rgba(255,255,255,0)));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:0}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width:767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width:640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}pre .comment,pre .template_comment,pre .diff .header,pre .javadoc{color:#998;font-style:italic}pre .keyword,pre .css .rule .keyword,pre .winutils,pre .javascript .title,pre .lisp .title{color:#000;font-weight:bold}pre .number,pre .hexcolor{color:#458}pre .string,pre .tag .value,pre .phpdoc,pre .tex .formula{color:#d14}pre .subst{color:#712}pre .constant,pre .title,pre .id{color:#900;font-weight:bold}pre .javascript .title,pre .lisp .title,pre .subst{font-weight:normal}pre .class .title,pre .haskell .label,pre .tex .command{color:#458;font-weight:bold}pre .tag,pre .tag .title,pre .rules .property,pre .django .tag .keyword{color:navy;font-weight:normal}pre .attribute,pre .variable,pre .instancevar,pre .lisp .body{color:teal}pre .regexp{color:#009926}pre .class{color:#458;font-weight:bold}pre .symbol,pre .ruby .symbol .string,pre .ruby .symbol .keyword,pre .ruby .symbol .keymethods,pre .lisp .keyword,pre .tex .special,pre .input_number{color:#990073}pre .builtin,pre .built_in,pre .lisp .title{color:#0086b3}pre .preprocessor,pre .pi,pre .doctype,pre .shebang,pre .cdata{color:#999;font-weight:bold}pre .deletion{background:#fdd}pre .addition{background:#dfd}pre .diff .change{background:#0086b3}pre .chunk{color:#aaa}pre .tex .formula{opacity:.5}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute;left:-99999999px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ui-helper-clearfix{display:inline-block}/*\*/* html .ui-helper-clearfix{height:1%}.ui-helper-clearfix{display:block}/**/.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-widget :active{outline:0}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-off{background-position:-96px -144px}.ui-icon-radio-on{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-corner-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-bottom{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-corner-right{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-corner-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.30;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.30;filter:Alpha(Opacity=30);-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px}#colorbox,#cboxOverlay,#cboxWrapper{position:absolute;top:0;left:0;z-index:9999;overflow:hidden}#cboxOverlay{position:fixed;width:100%;height:100%}#cboxMiddleLeft,#cboxBottomLeft{clear:left}#cboxContent{position:relative}#cboxLoadedContent{overflow:auto}#cboxTitle{margin:0}#cboxLoadingOverlay,#cboxLoadingGraphic{position:absolute;top:0;left:0;width:100%;height:100%}#cboxPrevious,#cboxNext,#cboxClose,#cboxSlideshow{cursor:pointer}.cboxPhoto{float:left;margin:auto;border:0;display:block;max-width:none}.cboxIframe{width:100%;height:100%;display:block;border:0}#colorbox,#cboxContent,#cboxLoadedContent{box-sizing:content-box}#cboxOverlay{background:#000}#cboxTopLeft{width:14px;height:14px;background:url(colorbox/controls.png) no-repeat 0 0}#cboxTopCenter{height:14px;background:url(colorbox/border.png) repeat-x top left}#cboxTopRight{width:14px;height:14px;background:url(colorbox/controls.png) no-repeat -36px 0}#cboxBottomLeft{width:14px;height:43px;background:url(colorbox/controls.png) no-repeat 0 -32px}#cboxBottomCenter{height:43px;background:url(colorbox/border.png) repeat-x bottom left}#cboxBottomRight{width:14px;height:43px;background:url(colorbox/controls.png) no-repeat -36px -32px}#cboxMiddleLeft{width:14px;background:url(colorbox/controls.png) repeat-y -175px 0}#cboxMiddleRight{width:14px;background:url(colorbox/controls.png) repeat-y -211px 0}#cboxContent{background:#fff;overflow:visible}.cboxIframe{background:#fff}#cboxError{padding:50px;border:1px solid #ccc}#cboxLoadedContent{margin-bottom:5px}#cboxLoadingOverlay{background:url(colorbox/loading_background.png) no-repeat center center}#cboxLoadingGraphic{background:url(colorbox/loading.gif) no-repeat center center}#cboxTitle{position:absolute;bottom:-25px;left:0;text-align:center;width:100%;font-weight:bold;color:#7c7c7c}#cboxCurrent{position:absolute;bottom:-25px;left:58px;font-weight:bold;color:#7c7c7c}#cboxPrevious,#cboxNext,#cboxClose,#cboxSlideshow{position:absolute;bottom:-29px;background:url(colorbox/controls.png) no-repeat 0 0;width:23px;height:23px;text-indent:-9999px}#cboxPrevious{left:0;background-position:-51px -25px}#cboxPrevious:hover{background-position:-51px 0}#cboxNext{left:27px;background-position:-75px -25px}#cboxNext:hover{background-position:-75px 0}#cboxClose{right:0;background-position:-100px -25px}#cboxClose:hover{background-position:-100px 0}.cboxSlideshow_on #cboxSlideshow{background-position:-125px 0;right:27px}.cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0}.cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px;right:27px}.cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0}#loading{position:fixed;left:40%;top:50%}a{color:#333;text-decoration:none}a:hover{color:#000;text-decoration:underline}body{font-family:"Lucida Grande",Helvetica,"Helvetica Neue",Arial,sans-serif;padding:12px;background-color:#333}h1,h2,h3,h4{color:#1c2324;margin:0;padding:0;margin-bottom:12px}table{width:100%}#content{clear:left;background-color:white;border:2px solid #ddd;border-top:8px solid #ddd;padding:18px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;-webkit-border-top-right-radius:5px;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-moz-border-radius-topright:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top-right-radius:5px}.dataTables_filter,.dataTables_info{padding:2px 6px}abbr.timeago{text-decoration:none;border:0;font-weight:bold}.timestamp{float:right;color:#ddd}.group_tabs{list-style:none;float:left;margin:0;padding:0}.group_tabs li{display:inline;float:left}.group_tabs li a{font-family:Helvetica,Arial,sans-serif;display:block;float:left;text-decoration:none;padding:4px 8px;background-color:#aaa;background:-webkit-gradient(linear,0 0,0 bottom,from(#ddd),to(#aaa));background:-moz-linear-gradient(#ddd,#aaa);background:linear-gradient(#ddd,#aaa);text-shadow:#e5e5e5 1px 1px 0;border-bottom:0;color:#333;font-weight:bold;margin-right:8px;border-top:1px solid #efefef;-webkit-border-top-left-radius:2px;-webkit-border-top-right-radius:2px;-moz-border-radius-topleft:2px;-moz-border-radius-topright:2px;border-top-left-radius:2px;border-top-right-radius:2px}.group_tabs li a:hover{background-color:#ccc;background:-webkit-gradient(linear,0 0,0 bottom,from(#eee),to(#aaa));background:-moz-linear-gradient(#eee,#aaa);background:linear-gradient(#eee,#aaa)}.group_tabs li a:active{padding-top:5px;padding-bottom:3px}.group_tabs li.active a{color:black;text-shadow:#fff 1px 1px 0;background-color:#ddd;background:-webkit-gradient(linear,0 0,0 bottom,from(white),to(#ddd));background:-moz-linear-gradient(white,#ddd);background:linear-gradient(white,#ddd)}.file_list{margin-bottom:18px}.file_list--responsive{overflow-x:auto;overflow-y:hidden}a.src_link{background:url("./magnify.png") no-repeat left 50%;padding-left:18px}tr,td{margin:0;padding:0}th{white-space:nowrap}th.ui-state-default{cursor:pointer}th span.ui-icon{float:left}td{padding:4px 8px}td.strong{font-weight:bold}.cell--number{text-align:right}.source_table h3,.source_table h4{padding:0;margin:0;margin-bottom:4px}.source_table .header{padding:10px}.source_table pre{margin:0;padding:0;white-space:normal;color:#000;font-family:"Monaco","Inconsolata","Consolas",monospace}.source_table code{color:#000;font-family:"Monaco","Inconsolata","Consolas",monospace}.source_table pre{background-color:#333}.source_table pre ol{margin:0;padding:0;margin-left:45px;font-size:12px;color:white}.source_table pre li{margin:0;padding:2px 6px;border-left:5px solid white}.source_table pre li code{white-space:pre;white-space:pre-wrap}.source_table pre .hits{float:right;margin-left:10px;padding:2px 4px;background-color:#444;background:-webkit-gradient(linear,0 0,0 bottom,from(#222),to(#666));background:-moz-linear-gradient(#222,#666);background:linear-gradient(#222,#666);color:white;font-family:Helvetica,"Helvetica Neue",Arial,sans-serif;font-size:10px;font-weight:bold;text-align:center;border-radius:6px}#footer{color:#ddd;font-size:12px;font-weight:bold;margin-top:12px;text-align:right}#footer a{color:#eee;text-decoration:underline}#footer a:hover{color:#fff;text-decoration:none}.green{color:#090}.red{color:#900}.yellow{color:#da0}.blue{color:blue}thead th{background:white}.source_table .covered{border-color:#090}.source_table .missed{border-color:#900}.source_table .never{border-color:black}.source_table .skipped{border-color:#fc0}.source_table .missed-branch{border-color:#bf0000}.source_table .covered:nth-child(odd){background-color:#cdf2cd}.source_table .covered:nth-child(even){background-color:#dbf2db}.source_table .missed:nth-child(odd){background-color:#f7c0c0}.source_table .missed:nth-child(even){background-color:#f7cfcf}.source_table .never:nth-child(odd){background-color:#efefef}.source_table .never:nth-child(even){background-color:#f4f4f4}.source_table .skipped:nth-child(odd){background-color:#fbf0c0}.source_table .skipped:nth-child(even){background-color:#fbffcf}.source_table .missed-branch:nth-child(odd){background-color:#cc8e8e}.source_table .missed-branch:nth-child(even){background-color:#cc6e6e} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/application.js b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/application.js new file mode 100644 index 000000000000..e1c2ab2346ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/application.js @@ -0,0 +1,7 @@ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(T,e){"use strict";function g(e,t,n){var r,a,i=(n=n||le).createElement("script");if(i.text=e,t)for(r in Se)(a=t[r]||t.getAttribute&&t.getAttribute(r))&&i.setAttribute(r,a);n.head.appendChild(i).parentNode.removeChild(i)}function m(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?pe[ge.call(e)]||"object":typeof e}function s(e){var t=!!e&&"length"in e&&e.length,n=m(e);return!we(e)&&!xe(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function u(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}function t(e,n,r){return we(n)?Te.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?Te.grep(e,function(e){return e===n!==r}):"string"!=typeof n?Te.grep(e,function(e){return-1<he.call(n,e)!==r}):Te.filter(n,e,r)}function n(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function c(e){var n={};return Te.each(e.match(Fe)||[],function(e,t){n[t]=!0}),n}function f(e){return e}function d(e){throw e}function l(e,t,n,r){var a;try{e&&we(a=e.promise)?a.call(e).done(t).fail(n):e&&we(a=e.then)?a.call(e,t,n):t.apply(undefined,[e].slice(r))}catch(e){n.apply(undefined,[e])}}function r(){le.removeEventListener("DOMContentLoaded",r),T.removeEventListener("load",r),Te.ready()}function a(e,t){return t.toUpperCase()}function h(e){return e.replace(Oe,"ms-").replace(qe,a)}function i(){this.expando=Te.expando+i.uid++}function o(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Ue.test(e)?JSON.parse(e):e)}function p(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(ze,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=o(n)}catch(a){}$e.set(e,t,n)}else n=undefined;return n}function v(e,t,n,r){var a,i,o=20,s=r?function(){return r.cur()}:function(){return Te.css(e,t,"")},l=s(),u=n&&n[3]||(Te.cssNumber[t]?"":"px"),c=e.nodeType&&(Te.cssNumber[t]||"px"!==u&&+l)&&Ve.exec(Te.css(e,t));if(c&&c[3]!==u){for(l/=2,u=u||c[3],c=+l||1;o--;)Te.style(e,t,c+u),(1-i)*(1-(i=s()/l||.5))<=0&&(o=0),c/=i;c*=2,Te.style(e,t,c+u),n=n||[]}return n&&(c=+c||+l||0,a=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=u,r.start=c,r.end=a)),a}function y(e){var t,n=e.ownerDocument,r=e.nodeName,a=et[r];return a||(t=n.body.appendChild(n.createElement(r)),a=Te.css(t,"display"),t.parentNode.removeChild(t),"none"===a&&(a="block"),et[r]=a)}function b(e,t){for(var n,r,a=[],i=0,o=e.length;i<o;i++)(r=e[i]).style&&(n=r.style.display,t?("none"===n&&(a[i]=Be.get(r,"display")||null,a[i]||(r.style.display="")),""===r.style.display&&Ke(r)&&(a[i]=y(r))):"none"!==n&&(a[i]="none",Be.set(r,"display",n)));for(i=0;i<o;i++)null!=a[i]&&(e[i].style.display=a[i]);return e}function w(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],t===undefined||t&&u(e,t)?Te.merge([e],n):n}function x(e,t){for(var n=0,r=e.length;n<r;n++)Be.set(e[n],"globalEval",!t||Be.get(t[n],"globalEval"))}function S(e,t,n,r,a){for(var i,o,s,l,u,c,f=t.createDocumentFragment(),d=[],h=0,p=e.length;h<p;h++)if((i=e[h])||0===i)if("object"===m(i))Te.merge(d,i.nodeType?[i]:i);else if(st.test(i)){for(o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),l=at[s]||at._default,o.innerHTML=l[1]+Te.htmlPrefilter(i)+l[2],c=l[0];c--;)o=o.lastChild;Te.merge(d,o.childNodes),(o=f.firstChild).textContent=""}else d.push(t.createTextNode(i));for(f.textContent="",h=0;i=d[h++];)if(r&&-1<Te.inArray(i,r))a&&a.push(i);else if(u=Ye(i),o=w(f.appendChild(i),"script"),u&&x(o),n)for(c=0;i=o[c++];)rt.test(i.type||"")&&n.push(i);return f}function D(){return!0}function C(){return!1}function _(e,t){return e===A()==("focus"===t)}function A(){try{return le.activeElement}catch(e){}}function N(e,t,n,r,a,i){var o,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=undefined),t)N(e,s,n,r,t[s],i);return e}if(null==r&&null==a?(a=n,r=n=undefined):null==a&&("string"==typeof n?(a=r,r=undefined):(a=r,r=n,n=undefined)),!1===a)a=C;else if(!a)return e;return 1===i&&(o=a,(a=function(e){return Te().off(e),o.apply(this,arguments)}).guid=o.guid||(o.guid=Te.guid++)),e.each(function(){Te.event.add(this,t,a,r,n)})}function k(e,a,i){i?(Be.set(e,a,!1),Te.event.add(e,a,{namespace:!1,handler:function(e){var t,n,r=Be.get(this,a);if(1&e.isTrigger&&this[a]){if(r.length)(Te.event.special[a]||{}).delegateType&&e.stopPropagation();else if(r=ce.call(arguments),Be.set(this,a,r),t=i(this,a),this[a](),r!==(n=Be.get(this,a))||t?Be.set(this,a,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Be.set(this,a,{value:Te.event.trigger(Te.extend(r[0],Te.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):Be.get(e,a)===undefined&&Te.event.add(e,a,D)}function I(e,t){return u(e,"table")&&u(11!==t.nodeType?t:t.firstChild,"tr")&&Te(e).children("tbody")[0]||e}function j(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function L(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function E(e,t){var n,r,a,i,o,s,l,u;if(1===t.nodeType){if(Be.hasData(e)&&(i=Be.access(e),o=Be.set(t,i),u=i.events))for(a in delete o.handle,o.events={},u)for(n=0,r=u[a].length;n<r;n++)Te.event.add(t,a,u[a][n]);$e.hasData(e)&&(s=$e.access(e),l=Te.extend({},s),$e.set(t,l))}}function R(e,t){var n=t.nodeName.toLowerCase();"input"===n&&tt.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function F(n,r,a,i){r=fe.apply([],r);var e,t,o,s,l,u,c=0,f=n.length,d=f-1,h=r[0],p=we(h);if(p||1<f&&"string"==typeof h&&!be.checkClone&&ht.test(h))return n.each(function(e){var t=n.eq(e);p&&(r[0]=h.call(this,e,t.html())),F(t,r,a,i)});if(f&&(t=(e=S(r,n[0].ownerDocument,!1,n,i)).firstChild,1===e.childNodes.length&&(e=t),t||i)){for(s=(o=Te.map(w(e,"script"),j)).length;c<f;c++)l=e,c!==d&&(l=Te.clone(l,!0,!0),s&&Te.merge(o,w(l,"script"))),a.call(n[c],l,c);if(s)for(u=o[o.length-1].ownerDocument,Te.map(o,L),c=0;c<s;c++)l=o[c],rt.test(l.type||"")&&!Be.access(l,"globalEval")&&Te.contains(u,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?Te._evalUrl&&!l.noModule&&Te._evalUrl(l.src,{nonce:l.nonce||l.getAttribute("nonce")}):g(l.textContent.replace(pt,""),l,u))}return n}function P(e,t,n){for(var r,a=t?Te.filter(t,e):e,i=0;null!=(r=a[i]);i++)n||1!==r.nodeType||Te.cleanData(w(r)),r.parentNode&&(n&&Ye(r)&&x(w(r,"script")),r.parentNode.removeChild(r));return e}function H(e,t,n){var r,a,i,o,s=e.style;return(n=n||mt(e))&&(""!==(o=n.getPropertyValue(t)||n[t])||Ye(e)||(o=Te.style(e,t)),!be.pixelBoxStyles()&&gt.test(o)&&vt.test(t)&&(r=s.width,a=s.minWidth,i=s.maxWidth,s.minWidth=s.maxWidth=s.width=o,o=n.width,s.width=r,s.minWidth=a,s.maxWidth=i)),o!==undefined?o+"":o}function M(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}function O(e){for(var t=e[0].toUpperCase()+e.slice(1),n=yt.length;n--;)if((e=yt[n]+t)in bt)return e}function q(e){var t=Te.cssProps[e]||wt[e];return t||(e in bt?e:wt[e]=O(e)||e)}function W(e,t,n){var r=Ve.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function B(e,t,n,r,a,i){var o="width"===t?1:0,s=0,l=0;if(n===(r?"border":"content"))return 0;for(;o<4;o+=2)"margin"===n&&(l+=Te.css(e,n+Ge[o],!0,a)),r?("content"===n&&(l-=Te.css(e,"padding"+Ge[o],!0,a)),"margin"!==n&&(l-=Te.css(e,"border"+Ge[o]+"Width",!0,a))):(l+=Te.css(e,"padding"+Ge[o],!0,a),"padding"!==n?l+=Te.css(e,"border"+Ge[o]+"Width",!0,a):s+=Te.css(e,"border"+Ge[o]+"Width",!0,a));return!r&&0<=i&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-i-l-s-.5))||0),l}function $(e,t,n){var r=mt(e),a=(!be.boxSizingReliable()||n)&&"border-box"===Te.css(e,"boxSizing",!1,r),i=a,o=H(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(gt.test(o)){if(!n)return o;o="auto"}return(!be.boxSizingReliable()&&a||"auto"===o||!parseFloat(o)&&"inline"===Te.css(e,"display",!1,r))&&e.getClientRects().length&&(a="border-box"===Te.css(e,"boxSizing",!1,r),(i=s in e)&&(o=e[s])),(o=parseFloat(o)||0)+B(e,t,n||(a?"border":"content"),i,r,o)+"px"}function U(e,t,n,r,a){return new U.prototype.init(e,t,n,r,a)}function z(){_t&&(!1===le.hidden&&T.requestAnimationFrame?T.requestAnimationFrame(z):T.setTimeout(z,Te.fx.interval),Te.fx.tick())}function X(){return T.setTimeout(function(){Ct=undefined}),Ct=Date.now()}function V(e,t){var n,r=0,a={height:e};for(t=t?1:0;r<4;r+=2-t)a["margin"+(n=Ge[r])]=a["padding"+n]=e;return t&&(a.opacity=a.width=e),a}function G(e,t,n){for(var r,a=(Z.tweeners[t]||[]).concat(Z.tweeners["*"]),i=0,o=a.length;i<o;i++)if(r=a[i].call(n,t,e))return r}function J(e,t,n){var r,a,i,o,s,l,u,c,f="width"in t||"height"in t,d=this,h={},p=e.style,g=e.nodeType&&Ke(e),m=Be.get(e,"fxshow");for(r in n.queue||(null==(o=Te._queueHooks(e,"fx")).unqueued&&(o.unqueued=0,s=o.empty.fire,o.empty.fire=function(){o.unqueued||s()}),o.unqueued++,d.always(function(){d.always(function(){o.unqueued--,Te.queue(e,"fx").length||o.empty.fire()})})),t)if(a=t[r],kt.test(a)){if(delete t[r],i=i||"toggle"===a,a===(g?"hide":"show")){if("show"!==a||!m||m[r]===undefined)continue;g=!0}h[r]=m&&m[r]||Te.style(e,r)}if((l=!Te.isEmptyObject(t))||!Te.isEmptyObject(h))for(r in f&&1===e.nodeType&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],null==(u=m&&m.display)&&(u=Be.get(e,"display")),"none"===(c=Te.css(e,"display"))&&(u?c=u:(b([e],!0),u=e.style.display||u,c=Te.css(e,"display"),b([e]))),("inline"===c||"inline-block"===c&&null!=u)&&"none"===Te.css(e,"float")&&(l||(d.done(function(){p.display=u}),null==u&&(c=p.display,u="none"===c?"":c)),p.display="inline-block")),n.overflow&&(p.overflow="hidden",d.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]})),l=!1,h)l||(m?"hidden"in m&&(g=m.hidden):m=Be.access(e,"fxshow",{display:u}),i&&(m.hidden=!g),g&&b([e],!0),d.done(function(){for(r in g||b([e]),Be.remove(e,"fxshow"),h)Te.style(e,r,h[r])})),l=G(g?m[r]:0,r,d),r in m||(m[r]=l.start,g&&(l.end=l.start,l.start=0))}function Y(e,t){var n,r,a,i,o;for(n in e)if(a=t[r=h(n)],i=e[n],Array.isArray(i)&&(a=i[1],i=e[n]=i[0]),n!==r&&(e[r]=i,delete e[n]),(o=Te.cssHooks[r])&&"expand"in o)for(n in i=o.expand(i),delete e[r],i)n in e||(e[n]=i[n],t[n]=a);else t[r]=a}function Z(i,e,t){var n,o,r=0,a=Z.prefilters.length,s=Te.Deferred().always(function(){delete l.elem}),l=function(){if(o)return!1;for(var e=Ct||X(),t=Math.max(0,u.startTime+u.duration-e),n=1-(t/u.duration||0),r=0,a=u.tweens.length;r<a;r++)u.tweens[r].run(n);return s.notifyWith(i,[u,n,t]),n<1&&a?t:(a||s.notifyWith(i,[u,1,0]),s.resolveWith(i,[u]),!1)},u=s.promise({elem:i,props:Te.extend({},e),opts:Te.extend(!0,{specialEasing:{},easing:Te.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ct||X(),duration:t.duration,tweens:[],createTween:function(e,t){var n=Te.Tween(i,u.opts,e,t,u.opts.specialEasing[e]||u.opts.easing);return u.tweens.push(n),n},stop:function(e){var t=0,n=e?u.tweens.length:0;if(o)return this;for(o=!0;t<n;t++)u.tweens[t].run(1);return e?(s.notifyWith(i,[u,1,0]),s.resolveWith(i,[u,e])):s.rejectWith(i,[u,e]),this}}),c=u.props;for(Y(c,u.opts.specialEasing);r<a;r++)if(n=Z.prefilters[r].call(u,i,c,u.opts))return we(n.stop)&&(Te._queueHooks(u.elem,u.opts.queue).stop=n.stop.bind(n)),n;return Te.map(c,G,u),we(u.opts.start)&&u.opts.start.call(i,u),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always),Te.fx.timer(Te.extend(l,{elem:i,anim:u,queue:u.opts.queue})),u}function K(e){return(e.match(Fe)||[]).join(" ")}function Q(e){return e.getAttribute&&e.getAttribute("class")||""}function ee(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(Fe)||[]}function te(n,e,r,a){var t;if(Array.isArray(e))Te.each(e,function(e,t){r||Wt.test(n)?a(n,t):te(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,a)});else if(r||"object"!==m(e))a(n,e);else for(t in e)te(n+"["+t+"]",e[t],r,a)}function ne(i){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,a=e.toLowerCase().match(Fe)||[];if(we(t))for(;n=a[r++];)"+"===n[0]?(n=n.slice(1)||"*",(i[n]=i[n]||[]).unshift(t)):(i[n]=i[n]||[]).push(t)}}function re(t,a,i,o){function s(e){var r;return l[e]=!0,Te.each(t[e]||[],function(e,t){var n=t(a,i,o);return"string"!=typeof n||u||l[n]?u?!(r=n):void 0:(a.dataTypes.unshift(n),s(n),!1)}),r}var l={},u=t===Qt;return s(a.dataTypes[0])||!l["*"]&&s("*")}function ae(e,t){var n,r,a=Te.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((a[n]?e:r||(r={}))[n]=t[n]);return r&&Te.extend(!0,e,r),e}function ie(e,t,n){for(var r,a,i,o,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(a in s)if(s[a]&&s[a].test(r)){l.unshift(a);break}if(l[0]in n)i=l[0];else{for(a in n){if(!l[0]||e.converters[a+" "+l[0]]){i=a;break}o||(o=a)}i=i||o}if(i)return i!==l[0]&&l.unshift(i),n[i]}function oe(e,t,n,r){var a,i,o,s,l,u={},c=e.dataTypes.slice();if(c[1])for(o in e.converters)u[o.toLowerCase()]=e.converters[o];for(i=c.shift();i;)if(e.responseFields[i]&&(n[e.responseFields[i]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=i,i=c.shift())if("*"===i)i=l;else if("*"!==l&&l!==i){if(!(o=u[l+" "+i]||u["* "+i]))for(a in u)if((s=a.split(" "))[1]===i&&(o=u[l+" "+s[0]]||u["* "+s[0]])){!0===o?o=u[a]:!0!==u[a]&&(i=s[0],c.unshift(s[1]));break}if(!0!==o)if(o&&e["throws"])t=o(t);else try{t=o(t)}catch(f){return{state:"parsererror",error:o?f:"No conversion from "+l+" to "+i}}}return{state:"success",data:t}}var se=[],le=T.document,ue=Object.getPrototypeOf,ce=se.slice,fe=se.concat,de=se.push,he=se.indexOf,pe={},ge=pe.toString,me=pe.hasOwnProperty,ve=me.toString,ye=ve.call(Object),be={},we=function we(e){return"function"==typeof e&&"number"!=typeof e.nodeType},xe=function xe(e){return null!=e&&e===e.window},Se={type:!0,src:!0,nonce:!0,noModule:!0},De="3.4.1",Te=function(e,t){return new Te.fn.init(e,t)},Ce=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;Te.fn=Te.prototype={jquery:De,constructor:Te,length:0,toArray:function(){return ce.call(this)},get:function(e){return null==e?ce.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=Te.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return Te.each(this,e)},map:function(n){return this.pushStack(Te.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ce.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:de,sort:se.sort,splice:se.splice},Te.extend=Te.fn.extend=function(e){var t,n,r,a,i,o,s=e||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[l]||{},l++),"object"==typeof s||we(s)||(s={}),l===u&&(s=this,l--);l<u;l++)if(null!=(t=arguments[l]))for(n in t)a=t[n],"__proto__"!==n&&s!==a&&(c&&a&&(Te.isPlainObject(a)||(i=Array.isArray(a)))?(r=s[n],o=i&&!Array.isArray(r)?[]:i||Te.isPlainObject(r)?r:{},i=!1,s[n]=Te.extend(c,o,a)):a!==undefined&&(s[n]=a));return s},Te.extend({expando:"jQuery"+(De+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==ge.call(e))&&(!(t=ue(e))||"function"==typeof(n=me.call(t,"constructor")&&t.constructor)&&ve.call(n)===ye)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){g(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(s(e))for(n=e.length;r<n&&!1!==t.call(e[r],r,e[r]);r++);else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(Ce,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(s(Object(e))?Te.merge(n,"string"==typeof e?[e]:e):de.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:he.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,a=e.length;r<n;r++)e[a++]=t[r];return e.length=a,e},grep:function(e,t,n){for(var r=[],a=0,i=e.length,o=!n;a<i;a++)!t(e[a],a)!==o&&r.push(e[a]);return r},map:function(e,t,n){var r,a,i=0,o=[];if(s(e))for(r=e.length;i<r;i++)null!=(a=t(e[i],i,n))&&o.push(a);else for(i in e)null!=(a=t(e[i],i,n))&&o.push(a);return fe.apply([],o)},guid:1,support:be}),"function"==typeof Symbol&&(Te.fn[Symbol.iterator]=se[Symbol.iterator]),Te.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){pe["[object "+t+"]"]=t.toLowerCase()});var _e=function(n){function w(e,t,n,r){var a,i,o,s,l,u,c,f=t&&t.ownerDocument,d=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==d&&9!==d&&11!==d)return n;if(!r&&((t?t.ownerDocument||t:W)!==E&&L(t),t=t||E,F)){if(11!==d&&(l=be.exec(e)))if(a=l[1]){if(9===d){if(!(o=t.getElementById(a)))return n;if(o.id===a)return n.push(o),n}else if(f&&(o=f.getElementById(a))&&O(t,o)&&o.id===a)return n.push(o),n}else{if(l[2])return Q.apply(n,t.getElementsByTagName(e)),n;if((a=l[3])&&S.getElementsByClassName&&t.getElementsByClassName)return Q.apply(n,t.getElementsByClassName(a)),n}if(S.qsa&&!V[e+" "]&&(!P||!P.test(e))&&(1!==d||"object"!==t.nodeName.toLowerCase())){if(c=e,f=t,1===d&&fe.test(e)){for((s=t.getAttribute("id"))?s=s.replace(De,Te):t.setAttribute("id",s=q),i=(u=_(e)).length;i--;)u[i]="#"+s+" "+g(u[i]);c=u.join(","),f=we.test(e)&&p(t.parentNode)||t}try{return Q.apply(n,f.querySelectorAll(c)),n}catch(h){V(e,!0)}finally{s===q&&t.removeAttribute("id")}}}return N(e.replace(le,"$1"),t,n,r)}function e(){function n(e,t){return r.push(e+" ")>D.cacheLength&&delete n[r.shift()],n[e+" "]=t}var r=[];return n}function l(e){return e[q]=!0,e}function a(e){var t=E.createElement("fieldset");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function t(e,t){for(var n=e.split("|"),r=n.length;r--;)D.attrHandle[n[r]]=t}function u(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function r(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function i(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function o(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&_e(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function s(o){return l(function(i){return i=+i,l(function(e,t){for(var n,r=o([],e.length,i),a=r.length;a--;)e[n=r[a]]&&(e[n]=!(t[n]=e[n]))})})}function p(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function c(){}function g(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function f(s,e,t){var l=e.dir,u=e.next,c=u||l,f=t&&"parentNode"===c,d=$++;return e.first?function(e,t,n){for(;e=e[l];)if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,a,i,o=[B,d];if(n){for(;e=e[l];)if((1===e.nodeType||f)&&s(e,t,n))return!0}else for(;e=e[l];)if(1===e.nodeType||f)if(a=(i=e[q]||(e[q]={}))[e.uniqueID]||(i[e.uniqueID]={}),u&&u===e.nodeName.toLowerCase())e=e[l]||e;else{if((r=a[c])&&r[0]===B&&r[1]===d)return o[2]=r[2];if((a[c]=o)[2]=s(e,t,n))return!0}return!1}}function d(a){return 1<a.length?function(e,t,n){for(var r=a.length;r--;)if(!a[r](e,t,n))return!1;return!0}:a[0]}function y(e,t,n){for(var r=0,a=t.length;r<a;r++)w(e,t[r],n);return n}function x(e,t,n,r,a){for(var i,o=[],s=0,l=e.length,u=null!=t;s<l;s++)(i=e[s])&&(n&&!n(i,r,a)||(o.push(i),u&&t.push(s)));return o}function b(h,p,g,m,v,e){return m&&!m[q]&&(m=b(m)),v&&!v[q]&&(v=b(v,e)),l(function(e,t,n,r){var a,i,o,s=[],l=[],u=t.length,c=e||y(p||"*",n.nodeType?[n]:n,[]),f=!h||!e&&p?c:x(c,s,h,n,r),d=g?v||(e?h:u||m)?[]:t:f;if(g&&g(f,d,n,r),m)for(a=x(d,l),m(a,[],n,r),i=a.length;i--;)(o=a[i])&&(d[l[i]]=!(f[l[i]]=o));if(e){if(v||h){if(v){for(a=[],i=d.length;i--;)(o=d[i])&&a.push(f[i]=o);v(null,d=[],a,r)}for(i=d.length;i--;)(o=d[i])&&-1<(a=v?te(e,o):s[i])&&(e[a]=!(t[a]=o))}}else d=x(d===t?d.splice(u,d.length):d),v?v(null,t,d,r):Q.apply(t,d)})}function h(e){for(var a,t,n,r=e.length,i=D.relative[e[0].type],o=i||D.relative[" "],s=i?1:0,l=f(function(e){return e===a},o,!0),u=f(function(e){return-1<te(a,e)},o,!0),c=[function(e,t,n){var r=!i&&(n||t!==k)||((a=t).nodeType?l(e,t,n):u(e,t,n));return a=null,r}];s<r;s++)if(t=D.relative[e[s].type])c=[f(d(c),t)];else{if((t=D.filter[e[s].type].apply(null,e[s].matches))[q]){for(n=++s;n<r&&!D.relative[e[n].type];n++);return b(1<s&&d(c),1<s&&g(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(le,"$1"),t,s<n&&h(e.slice(s,n)),n<r&&h(e=e.slice(n)),n<r&&g(e))}c.push(t)}return d(c)}function m(m,v){var y=0<v.length,b=0<m.length,e=function(e,t,n,r,a){var i,o,s,l=0,u="0",c=e&&[],f=[],d=k,h=e||b&&D.find.TAG("*",a),p=B+=null==d?1:Math.random()||.1,g=h.length;for(a&&(k=t===E||t||a);u!==g&&null!=(i=h[u]);u++){if(b&&i){for(o=0,t||i.ownerDocument===E||(L(i),n=!F);s=m[o++];)if(s(i,t||E,n)){r.push(i);break}a&&(B=p)}y&&((i=!s&&i)&&l--,e&&c.push(i))}if(l+=u,y&&u!==l){for(o=0;s=v[o++];)s(c,f,t,n);if(e){if(0<l)for(;u--;)c[u]||f[u]||(f[u]=Z.call(r));f=x(f)}Q.apply(r,f),a&&!e&&0<f.length&&1<l+v.length&&w.uniqueSort(r)}return a&&(B=p,k=d),c};return y?l(e):e}var v,S,D,T,C,_,A,N,k,I,j,L,E,R,F,P,H,M,O,q="sizzle"+1*new Date,W=n.document,B=0,$=0,U=e(),z=e(),X=e(),V=e(),G=function(e,t){return e===t&&(j=!0),0},J={}.hasOwnProperty,Y=[],Z=Y.pop,K=Y.push,Q=Y.push,ee=Y.slice,te=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},ne="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",re="[\\x20\\t\\r\\n\\f]",ae="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",ie="\\["+re+"*("+ae+")(?:"+re+"*([*^$|!~]?=)"+re+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+ae+"))|)"+re+"*\\]",oe=":("+ae+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ie+")*)|.*)\\)|)",se=new RegExp(re+"+","g"),le=new RegExp("^"+re+"+|((?:^|[^\\\\])(?:\\\\.)*)"+re+"+$","g"),ue=new RegExp("^"+re+"*,"+re+"*"),ce=new RegExp("^"+re+"*([>+~]|"+re+")"+re+"*"),fe=new RegExp(re+"|>"),de=new RegExp(oe),he=new RegExp("^"+ae+"$"),pe={ID:new RegExp("^#("+ae+")"),CLASS:new RegExp("^\\.("+ae+")"),TAG:new RegExp("^("+ae+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+re+"*(even|odd|(([+-]|)(\\d*)n|)"+re+"*(?:([+-]|)"+re+"*(\\d+)|))"+re+"*\\)|)","i"),bool:new RegExp("^(?:"+ne+")$","i"),needsContext:new RegExp("^"+re+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+re+"*((?:-\\d)?\\d*)"+re+"*\\)|)(?=[^-]|$)","i")},ge=/HTML$/i,me=/^(?:input|select|textarea|button)$/i,ve=/^h\d$/i,ye=/^[^{]+\{\s*\[native \w/,be=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,we=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+re+"?|("+re+")|.)","ig"),Se=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},De=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){L()},_e=f(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{Q.apply(Y=ee.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(Ae){Q={apply:Y.length?function(e,t){K.apply(e,ee.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}for(v in S=w.support={},C=w.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!ge.test(t||n&&n.nodeName||"HTML")},L=w.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==E&&9===r.nodeType&&r.documentElement&&(R=(E=r).documentElement,F=!C(E),W!==E&&(n=E.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),S.attributes=a(function(e){return e.className="i",!e.getAttribute("className")}),S.getElementsByTagName=a(function(e){return e.appendChild(E.createComment("")),!e.getElementsByTagName("*").length}),S.getElementsByClassName=ye.test(E.getElementsByClassName),S.getById=a(function(e){return R.appendChild(e).id=q,!E.getElementsByName||!E.getElementsByName(q).length}),S.getById?(D.filter.ID=function(e){var t=e.replace(xe,Se);return function(e){return e.getAttribute("id")===t}},D.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(D.filter.ID=function(e){var n=e.replace(xe,Se);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},D.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,a,i=t.getElementById(e);if(i){if((n=i.getAttributeNode("id"))&&n.value===e)return[i];for(a=t.getElementsByName(e),r=0;i=a[r++];)if((n=i.getAttributeNode("id"))&&n.value===e)return[i]}return[]}}),D.find.TAG=S.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):S.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],a=0,i=t.getElementsByTagName(e);if("*"!==e)return i;for(;n=i[a++];)1===n.nodeType&&r.push(n);return r},D.find.CLASS=S.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},H=[],P=[],(S.qsa=ye.test(E.querySelectorAll))&&(a(function(e){R.appendChild(e).innerHTML="<a id='"+q+"'></a><select id='"+q+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&P.push("[*^$]="+re+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||P.push("\\["+re+"*(?:value|"+ne+")"),e.querySelectorAll("[id~="+q+"-]").length||P.push("~="),e.querySelectorAll(":checked").length||P.push(":checked"),e.querySelectorAll("a#"+q+"+*").length||P.push(".#.+[+~]")}),a(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=E.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&P.push("name"+re+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&P.push(":enabled",":disabled"),R.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&P.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),P.push(",.*:")})),(S.matchesSelector=ye.test(M=R.matches||R.webkitMatchesSelector||R.mozMatchesSelector||R.oMatchesSelector||R.msMatchesSelector))&&a(function(e){S.disconnectedMatch=M.call(e,"*"),M.call(e,"[s!='']:x"),H.push("!=",oe)}),P=P.length&&new RegExp(P.join("|")),H=H.length&&new RegExp(H.join("|")),t=ye.test(R.compareDocumentPosition),O=t||ye.test(R.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},G=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!S.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument===W&&O(W,e)?-1:t===E||t.ownerDocument===W&&O(W,t)?1:I?te(I,e)-te(I,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,a=e.parentNode,i=t.parentNode,o=[e],s=[t];if(!a||!i)return e===E?-1:t===E?1:a?-1:i?1:I?te(I,e)-te(I,t):0;if(a===i)return u(e,t);for(n=e;n=n.parentNode;)o.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;o[r]===s[r];)r++;return r?u(o[r],s[r]):o[r]===W?-1:s[r]===W?1:0}),E},w.matches=function(e,t){return w(e,null,null,t)},w.matchesSelector=function(e,t){if((e.ownerDocument||e)!==E&&L(e),S.matchesSelector&&F&&!V[t+" "]&&(!H||!H.test(t))&&(!P||!P.test(t)))try{var n=M.call(e,t);if(n||S.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(Ae){V(t,!0)}return 0<w(t,E,null,[e]).length},w.contains=function(e,t){return(e.ownerDocument||e)!==E&&L(e),O(e,t)},w.attr=function(e,t){(e.ownerDocument||e)!==E&&L(e);var n=D.attrHandle[t.toLowerCase()],r=n&&J.call(D.attrHandle,t.toLowerCase())?n(e,t,!F):undefined;return r!==undefined?r:S.attributes||!F?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},w.escape=function(e){return(e+"").replace(De,Te)},w.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},w.uniqueSort=function(e){var t,n=[],r=0,a=0;if(j=!S.detectDuplicates,I=!S.sortStable&&e.slice(0),e.sort(G),j){for(;t=e[a++];)t===e[a]&&(r=n.push(a));for(;r--;)e.splice(n[r],1)}return I=null,e},T=w.getText=function(e){var t,n="",r=0,a=e.nodeType;if(a){if(1===a||9===a||11===a){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=T(e)}else if(3===a||4===a)return e.nodeValue}else for(;t=e[r++];)n+=T(t);return n},(D=w.selectors={cacheLength:50,createPseudo:l,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,Se),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,Se),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||w.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&w.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&de.test(n)&&(t=_(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,Se).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+re+")"+e+"("+re+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,a){return function(e){var t=w.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===a:"!="===r?t!==a:"^="===r?a&&0===t.indexOf(a):"*="===r?a&&-1<t.indexOf(a):"$="===r?a&&t.slice(-a.length)===a:"~="===r?-1<(" "+t.replace(se," ")+" ").indexOf(a):"|="===r&&(t===a||t.slice(0,a.length+1)===a+"-"))}},CHILD:function(p,e,t,g,m){var v="nth"!==p.slice(0,3),y="last"!==p.slice(-4),b="of-type"===e;return 1===g&&0===m?function(e){return!!e.parentNode}:function(e,t,n){var r,a,i,o,s,l,u=v!==y?"nextSibling":"previousSibling",c=e.parentNode,f=b&&e.nodeName.toLowerCase(),d=!n&&!b,h=!1;if(c){if(v){for(;u;){for(o=e;o=o[u];)if(b?o.nodeName.toLowerCase()===f:1===o.nodeType)return!1;l=u="only"===p&&!l&&"nextSibling"}return!0}if(l=[y?c.firstChild:c.lastChild],y&&d){for(h=(s=(r=(a=(i=(o=c)[q]||(o[q]={}))[o.uniqueID]||(i[o.uniqueID]={}))[p]||[])[0]===B&&r[1])&&r[2],o=s&&c.childNodes[s];o=++s&&o&&o[u]||(h=s=0)||l.pop();)if(1===o.nodeType&&++h&&o===e){a[p]=[B,s,h];break}}else if(d&&(h=s=(r=(a=(i=(o=e)[q]||(o[q]={}))[o.uniqueID]||(i[o.uniqueID]={}))[p]||[])[0]===B&&r[1]),!1===h)for(;(o=++s&&o&&o[u]||(h=s=0)||l.pop())&&((b?o.nodeName.toLowerCase()!==f:1!==o.nodeType)||!++h||(d&&((a=(i=o[q]||(o[q]={}))[o.uniqueID]||(i[o.uniqueID]={}))[p]=[B,h]),o!==e)););return(h-=m)===g||h%g==0&&0<=h/g}}},PSEUDO:function(e,i){var t,o=D.pseudos[e]||D.setFilters[e.toLowerCase()]||w.error("unsupported pseudo: "+e);return o[q]?o(i):1<o.length?(t=[e,e,"",i],D.setFilters.hasOwnProperty(e.toLowerCase())?l(function(e,t){for(var n,r=o(e,i),a=r.length;a--;)e[n=te(e,r[a])]=!(t[n]=r[a])}):function(e){return o(e,0,t)}):o}},pseudos:{not:l(function(e){var r=[],a=[],s=A(e.replace(le,"$1"));return s[q]?l(function(e,t,n,r){for(var a,i=s(e,null,r,[]),o=e.length;o--;)(a=i[o])&&(e[o]=!(t[o]=a))}):function(e,t,n){return r[0]=e,s(r,null,n,a),r[0]=null,!a.pop()}}),has:l(function(t){return function(e){return 0<w(t,e).length}}),contains:l(function(t){return t=t.replace(xe,Se),function(e){return-1<(e.textContent||T(e)).indexOf(t)}}),lang:l(function(n){return he.test(n||"")||w.error("unsupported lang: "+n),n=n.replace(xe,Se).toLowerCase(),function(e){var t;do{if(t=F?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash +;return t&&t.slice(1)===e.id},root:function(e){return e===R},focus:function(e){return e===E.activeElement&&(!E.hasFocus||E.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:o(!1),disabled:o(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!D.pseudos.empty(e)},header:function(e){return ve.test(e.nodeName)},input:function(e){return me.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:s(function(){return[0]}),last:s(function(e,t){return[t-1]}),eq:s(function(e,t,n){return[n<0?n+t:n]}),even:s(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:s(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:s(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:s(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=D.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})D.pseudos[v]=r(v);for(v in{submit:!0,reset:!0})D.pseudos[v]=i(v);return c.prototype=D.filters=D.pseudos,D.setFilters=new c,_=w.tokenize=function(e,t){var n,r,a,i,o,s,l,u=z[e+" "];if(u)return t?0:u.slice(0);for(o=e,s=[],l=D.preFilter;o;){for(i in n&&!(r=ue.exec(o))||(r&&(o=o.slice(r[0].length)||o),s.push(a=[])),n=!1,(r=ce.exec(o))&&(n=r.shift(),a.push({value:n,type:r[0].replace(le," ")}),o=o.slice(n.length)),D.filter)!(r=pe[i].exec(o))||l[i]&&!(r=l[i](r))||(n=r.shift(),a.push({value:n,type:i,matches:r}),o=o.slice(n.length));if(!n)break}return t?o.length:o?w.error(e):z(e,s).slice(0)},A=w.compile=function(e,t){var n,r=[],a=[],i=X[e+" "];if(!i){for(t||(t=_(e)),n=t.length;n--;)(i=h(t[n]))[q]?r.push(i):a.push(i);(i=X(e,m(a,r))).selector=e}return i},N=w.select=function(e,t,n,r){var a,i,o,s,l,u="function"==typeof e&&e,c=!r&&_(e=u.selector||e);if(n=n||[],1===c.length){if(2<(i=c[0]=c[0].slice(0)).length&&"ID"===(o=i[0]).type&&9===t.nodeType&&F&&D.relative[i[1].type]){if(!(t=(D.find.ID(o.matches[0].replace(xe,Se),t)||[])[0]))return n;u&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(a=pe.needsContext.test(e)?0:i.length;a--&&(o=i[a],!D.relative[s=o.type]);)if((l=D.find[s])&&(r=l(o.matches[0].replace(xe,Se),we.test(i[0].type)&&p(t.parentNode)||t))){if(i.splice(a,1),!(e=r.length&&g(i)))return Q.apply(n,r),n;break}}return(u||A(e,c))(r,t,!F,n,!t||we.test(e)&&p(t.parentNode)||t),n},S.sortStable=q.split("").sort(G).join("")===q,S.detectDuplicates=!!j,L(),S.sortDetached=a(function(e){return 1&e.compareDocumentPosition(E.createElement("fieldset"))}),a(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||t("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),S.attributes&&a(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||t("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),a(function(e){return null==e.getAttribute("disabled")})||t(ne,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),w}(T);Te.find=_e,Te.expr=_e.selectors,Te.expr[":"]=Te.expr.pseudos,Te.uniqueSort=Te.unique=_e.uniqueSort,Te.text=_e.getText,Te.isXMLDoc=_e.isXML,Te.contains=_e.contains,Te.escapeSelector=_e.escape;var Ae=function(e,t,n){for(var r=[],a=n!==undefined;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(a&&Te(e).is(n))break;r.push(e)}return r},Ne=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},ke=Te.expr.match.needsContext,Ie=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;Te.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?Te.find.matchesSelector(r,e)?[r]:[]:Te.find.matches(e,Te.grep(t,function(e){return 1===e.nodeType}))},Te.fn.extend({find:function(e){var t,n,r=this.length,a=this;if("string"!=typeof e)return this.pushStack(Te(e).filter(function(){for(t=0;t<r;t++)if(Te.contains(a[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)Te.find(e,a[t],n);return 1<r?Te.uniqueSort(n):n},filter:function(e){return this.pushStack(t(this,e||[],!1))},not:function(e){return this.pushStack(t(this,e||[],!0))},is:function(e){return!!t(this,"string"==typeof e&&ke.test(e)?Te(e):e||[],!1).length}});var je,Le=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(Te.fn.init=function(e,t,n){var r,a;if(!e)return this;if(n=n||je,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):we(e)?n.ready!==undefined?n.ready(e):e(Te):Te.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:Le.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof Te?t[0]:t,Te.merge(this,Te.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:le,!0)),Ie.test(r[1])&&Te.isPlainObject(t))for(r in t)we(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(a=le.getElementById(r[2]))&&(this[0]=a,this.length=1),this}).prototype=Te.fn,je=Te(le);var Ee=/^(?:parents|prev(?:Until|All))/,Re={children:!0,contents:!0,next:!0,prev:!0};Te.fn.extend({has:function(e){var t=Te(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(Te.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,a=this.length,i=[],o="string"!=typeof e&&Te(e);if(!ke.test(e))for(;r<a;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(o?-1<o.index(n):1===n.nodeType&&Te.find.matchesSelector(n,e))){i.push(n);break}return this.pushStack(1<i.length?Te.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?he.call(Te(e),this[0]):he.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(Te.uniqueSort(Te.merge(this.get(),Te(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),Te.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return Ae(e,"parentNode")},parentsUntil:function(e,t,n){return Ae(e,"parentNode",n)},next:function(e){return n(e,"nextSibling")},prev:function(e){return n(e,"previousSibling")},nextAll:function(e){return Ae(e,"nextSibling")},prevAll:function(e){return Ae(e,"previousSibling")},nextUntil:function(e,t,n){return Ae(e,"nextSibling",n)},prevUntil:function(e,t,n){return Ae(e,"previousSibling",n)},siblings:function(e){return Ne((e.parentNode||{}).firstChild,e)},children:function(e){return Ne(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(u(e,"template")&&(e=e.content||e),Te.merge([],e.childNodes))}},function(r,a){Te.fn[r]=function(e,t){var n=Te.map(this,a,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=Te.filter(t,n)),1<this.length&&(Re[r]||Te.uniqueSort(n),Ee.test(r)&&n.reverse()),this.pushStack(n)}});var Fe=/[^\x20\t\r\n\f]+/g;Te.Callbacks=function(r){r="string"==typeof r?c(r):Te.extend({},r);var a,e,t,n,i=[],o=[],s=-1,l=function(){for(n=n||r.once,t=a=!0;o.length;s=-1)for(e=o.shift();++s<i.length;)!1===i[s].apply(e[0],e[1])&&r.stopOnFalse&&(s=i.length,e=!1);r.memory||(e=!1),a=!1,n&&(i=e?[]:"")},u={add:function(){return i&&(e&&!a&&(s=i.length-1,o.push(e)),function n(e){Te.each(e,function(e,t){we(t)?r.unique&&u.has(t)||i.push(t):t&&t.length&&"string"!==m(t)&&n(t)})}(arguments),e&&!a&&l()),this},remove:function(){return Te.each(arguments,function(e,t){for(var n;-1<(n=Te.inArray(t,i,n));)i.splice(n,1),n<=s&&s--}),this},has:function(e){return e?-1<Te.inArray(e,i):0<i.length},empty:function(){return i&&(i=[]),this},disable:function(){return n=o=[],i=e="",this},disabled:function(){return!i},lock:function(){return n=o=[],e||a||(i=e=""),this},locked:function(){return!!n},fireWith:function(e,t){return n||(t=[e,(t=t||[]).slice?t.slice():t],o.push(t),a||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!t}};return u},Te.extend({Deferred:function(e){var i=[["notify","progress",Te.Callbacks("memory"),Te.Callbacks("memory"),2],["resolve","done",Te.Callbacks("once memory"),Te.Callbacks("once memory"),0,"resolved"],["reject","fail",Te.Callbacks("once memory"),Te.Callbacks("once memory"),1,"rejected"]],a="pending",o={state:function(){return a},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return o.then(null,e)},pipe:function(){var a=arguments;return Te.Deferred(function(r){Te.each(i,function(e,t){var n=we(a[t[4]])&&a[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&we(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),a=null}).promise()},then:function(t,n,r){function u(i,o,s,l){return function(){var n=this,r=arguments,t=function(){var e,t;if(!(i<c)){if((e=s.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,we(t)?l?t.call(e,u(c,o,f,l),u(c,o,d,l)):(c++,t.call(e,u(c,o,f,l),u(c,o,d,l),u(c,o,f,o.notifyWith))):(s!==f&&(n=undefined,r=[e]),(l||o.resolveWith)(n,r))}},a=l?t:function(){try{t()}catch(e){Te.Deferred.exceptionHook&&Te.Deferred.exceptionHook(e,a.stackTrace),c<=i+1&&(s!==d&&(n=undefined,r=[e]),o.rejectWith(n,r))}};i?a():(Te.Deferred.getStackHook&&(a.stackTrace=Te.Deferred.getStackHook()),T.setTimeout(a))}}var c=0;return Te.Deferred(function(e){i[0][3].add(u(0,e,we(r)?r:f,e.notifyWith)),i[1][3].add(u(0,e,we(t)?t:f)),i[2][3].add(u(0,e,we(n)?n:d))}).promise()},promise:function(e){return null!=e?Te.extend(e,o):o}},s={};return Te.each(i,function(e,t){var n=t[2],r=t[5];o[t[1]]=n.add,r&&n.add(function(){a=r},i[3-e][2].disable,i[3-e][3].disable,i[0][2].lock,i[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?undefined:this,arguments),this},s[t[0]+"With"]=n.fireWith}),o.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),a=ce.call(arguments),i=Te.Deferred(),o=function(t){return function(e){r[t]=this,a[t]=1<arguments.length?ce.call(arguments):e,--n||i.resolveWith(r,a)}};if(n<=1&&(l(e,i.done(o(t)).resolve,i.reject,!n),"pending"===i.state()||we(a[t]&&a[t].then)))return i.then();for(;t--;)l(a[t],o(t),i.reject);return i.promise()}});var Pe=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;Te.Deferred.exceptionHook=function(e,t){T.console&&T.console.warn&&e&&Pe.test(e.name)&&T.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},Te.readyException=function(e){T.setTimeout(function(){throw e})};var He=Te.Deferred();Te.fn.ready=function(e){return He.then(e)["catch"](function(e){Te.readyException(e)}),this},Te.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--Te.readyWait:Te.isReady)||(Te.isReady=!0)!==e&&0<--Te.readyWait||He.resolveWith(le,[Te])}}),Te.ready.then=He.then,"complete"===le.readyState||"loading"!==le.readyState&&!le.documentElement.doScroll?T.setTimeout(Te.ready):(le.addEventListener("DOMContentLoaded",r),T.addEventListener("load",r));var Me=function(e,t,n,r,a,i,o){var s=0,l=e.length,u=null==n;if("object"===m(n))for(s in a=!0,n)Me(e,t,s,n[s],!0,i,o);else if(r!==undefined&&(a=!0,we(r)||(o=!0),u&&(o?(t.call(e,r),t=null):(u=t,t=function(e,t,n){return u.call(Te(e),n)})),t))for(;s<l;s++)t(e[s],n,o?r:r.call(e[s],s,t(e[s],n)));return a?e:u?t.call(e):l?t(e[0],n):i},Oe=/^-ms-/,qe=/-([a-z])/g,We=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};i.uid=1,i.prototype={cache:function(e){var t=e[this.expando];return t||(t={},We(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,a=this.cache(e);if("string"==typeof t)a[h(t)]=n;else for(r in t)a[h(r)]=t[r];return a},get:function(e,t){return t===undefined?this.cache(e):e[this.expando]&&e[this.expando][h(t)]},access:function(e,t,n){return t===undefined||t&&"string"==typeof t&&n===undefined?this.get(e,t):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r=e[this.expando];if(r!==undefined){if(t!==undefined){n=(t=Array.isArray(t)?t.map(h):(t=h(t))in r?[t]:t.match(Fe)||[]).length;for(;n--;)delete r[t[n]]}(t===undefined||Te.isEmptyObject(r))&&(e.nodeType?e[this.expando]=undefined:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return t!==undefined&&!Te.isEmptyObject(t)}};var Be=new i,$e=new i,Ue=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ze=/[A-Z]/g;Te.extend({hasData:function(e){return $e.hasData(e)||Be.hasData(e)},data:function(e,t,n){return $e.access(e,t,n)},removeData:function(e,t){$e.remove(e,t)},_data:function(e,t,n){return Be.access(e,t,n)},_removeData:function(e,t){Be.remove(e,t)}}),Te.fn.extend({data:function(n,e){var t,r,a,i=this[0],o=i&&i.attributes;if(n!==undefined)return"object"==typeof n?this.each(function(){$e.set(this,n)}):Me(this,function(e){var t;if(i&&e===undefined)return(t=$e.get(i,n))!==undefined?t:(t=p(i,n))!==undefined?t:void 0;this.each(function(){$e.set(this,n,e)})},null,e,1<arguments.length,null,!0);if(this.length&&(a=$e.get(i),1===i.nodeType&&!Be.get(i,"hasDataAttrs"))){for(t=o.length;t--;)o[t]&&0===(r=o[t].name).indexOf("data-")&&(r=h(r.slice(5)),p(i,r,a[r]));Be.set(i,"hasDataAttrs",!0)}return a},removeData:function(e){return this.each(function(){$e.remove(this,e)})}}),Te.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Be.get(e,t),n&&(!r||Array.isArray(n)?r=Be.access(e,t,Te.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=Te.queue(e,t),r=n.length,a=n.shift(),i=Te._queueHooks(e,t),o=function(){Te.dequeue(e,t)};"inprogress"===a&&(a=n.shift(),r--),a&&("fx"===t&&n.unshift("inprogress"),delete i.stop,a.call(e,o,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Be.get(e,n)||Be.access(e,n,{empty:Te.Callbacks("once memory").add(function(){Be.remove(e,[t+"queue",n])})})}}),Te.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?Te.queue(this[0],t):n===undefined?this:this.each(function(){var e=Te.queue(this,t,n);Te._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&Te.dequeue(this,t)})},dequeue:function(e){return this.each(function(){Te.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,a=Te.Deferred(),i=this,o=this.length,s=function(){--r||a.resolveWith(i,[i])};for("string"!=typeof e&&(t=e,e=undefined),e=e||"fx";o--;)(n=Be.get(i[o],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),a.promise(t)}});var Xe=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Ve=new RegExp("^(?:([+-])=|)("+Xe+")([a-z%]*)$","i"),Ge=["Top","Right","Bottom","Left"],Je=le.documentElement,Ye=function(e){return Te.contains(e.ownerDocument,e)},Ze={composed:!0};Je.getRootNode&&(Ye=function(e){return Te.contains(e.ownerDocument,e)||e.getRootNode(Ze)===e.ownerDocument});var Ke=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&Ye(e)&&"none"===Te.css(e,"display")},Qe=function(e,t,n,r){var a,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in a=n.apply(e,r||[]),t)e.style[i]=o[i];return a},et={};Te.fn.extend({show:function(){return b(this,!0)},hide:function(){return b(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Ke(this)?Te(this).show():Te(this).hide()})}});var tt=/^(?:checkbox|radio)$/i,nt=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,rt=/^$|^module$|\/(?:java|ecma)script/i,at={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};at.optgroup=at.option,at.tbody=at.tfoot=at.colgroup=at.caption=at.thead,at.th=at.td;var it,ot,st=/<|&#?\w+;/;it=le.createDocumentFragment().appendChild(le.createElement("div")),(ot=le.createElement("input")).setAttribute("type","radio"),ot.setAttribute("checked","checked"),ot.setAttribute("name","t"),it.appendChild(ot),be.checkClone=it.cloneNode(!0).cloneNode(!0).lastChild.checked,it.innerHTML="<textarea>x</textarea>",be.noCloneChecked=!!it.cloneNode(!0).lastChild.defaultValue;var lt=/^key/,ut=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ct=/^([^.]*)(?:\.(.+)|)/;Te.event={global:{},add:function(t,e,n,r,a){var i,o,s,l,u,c,f,d,h,p,g,m=Be.get(t);if(m)for(n.handler&&(n=(i=n).handler,a=i.selector),a&&Te.find.matchesSelector(Je,a),n.guid||(n.guid=Te.guid++),(l=m.events)||(l=m.events={}),(o=m.handle)||(o=m.handle=function(e){return void 0!==Te&&Te.event.triggered!==e.type?Te.event.dispatch.apply(t,arguments):undefined}),u=(e=(e||"").match(Fe)||[""]).length;u--;)h=g=(s=ct.exec(e[u])||[])[1],p=(s[2]||"").split(".").sort(),h&&(f=Te.event.special[h]||{},h=(a?f.delegateType:f.bindType)||h,f=Te.event.special[h]||{},c=Te.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:a,needsContext:a&&Te.expr.match.needsContext.test(a),namespace:p.join(".")},i),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,p,o)||t.addEventListener&&t.addEventListener(h,o)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),a?d.splice(d.delegateCount++,0,c):d.push(c),Te.event.global[h]=!0)},remove:function(e,t,n,r,a){var i,o,s,l,u,c,f,d,h,p,g,m=Be.hasData(e)&&Be.get(e);if(m&&(l=m.events)){for(u=(t=(t||"").match(Fe)||[""]).length;u--;)if(h=g=(s=ct.exec(t[u])||[])[1],p=(s[2]||"").split(".").sort(),h){for(f=Te.event.special[h]||{},d=l[h=(r?f.delegateType:f.bindType)||h]||[],s=s[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),o=i=d.length;i--;)c=d[i],!a&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(d.splice(i,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));o&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,p,m.handle)||Te.removeEvent(e,h,m.handle),delete l[h])}else for(h in l)Te.event.remove(e,h+t[u],n,r,!0);Te.isEmptyObject(l)&&Be.remove(e,"handle events")}},dispatch:function(e){var t,n,r,a,i,o,s=Te.event.fix(e),l=new Array(arguments.length),u=(Be.get(this,"events")||{})[s.type]||[],c=Te.event.special[s.type]||{};for(l[0]=s,t=1;t<arguments.length;t++)l[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){for(o=Te.event.handlers.call(this,s,u),t=0;(a=o[t++])&&!s.isPropagationStopped();)for(s.currentTarget=a.elem,n=0;(i=a.handlers[n++])&&!s.isImmediatePropagationStopped();)s.rnamespace&&!1!==i.namespace&&!s.rnamespace.test(i.namespace)||(s.handleObj=i,s.data=i.data,(r=((Te.event.special[i.origType]||{}).handle||i.handler).apply(a.elem,l))!==undefined&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,a,i,o,s=[],l=t.delegateCount,u=e.target;if(l&&u.nodeType&&!("click"===e.type&&1<=e.button))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==e.type||!0!==u.disabled)){for(i=[],o={},n=0;n<l;n++)o[a=(r=t[n]).selector+" "]===undefined&&(o[a]=r.needsContext?-1<Te(a,this).index(u):Te.find(a,this,null,[u]).length),o[a]&&i.push(r);i.length&&s.push({elem:u,handlers:i})}return u=this,l<t.length&&s.push({elem:u,handlers:t.slice(l)}),s},addProp:function(t,e){Object.defineProperty(Te.Event.prototype,t,{enumerable:!0,configurable:!0,get:we(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[Te.expando]?e:new Te.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return tt.test(t.type)&&t.click&&u(t,"input")&&k(t,"click",D),!1},trigger:function(e){var t=this||e;return tt.test(t.type)&&t.click&&u(t,"input")&&k(t,"click"),!0},_default:function(e){var t=e.target;return tt.test(t.type)&&t.click&&u(t,"input")&&Be.get(t,"click")||u(t,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},Te.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},Te.Event=function(e,t){if(!(this instanceof Te.Event))return new Te.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.defaultPrevented===undefined&&!1===e.returnValue?D:C,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&Te.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[Te.expando]=!0},Te.Event.prototype={constructor:Te.Event,isDefaultPrevented:C,isPropagationStopped:C,isImmediatePropagationStopped:C,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=D,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=D,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=D,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},Te.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&lt.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&t!==undefined&&ut.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},Te.event.addProp),Te.each({focus:"focusin",blur:"focusout"},function(e,t){Te.event.special[e]={setup:function(){return k(this,e,_),!1},trigger:function(){return k(this,e),!0},delegateType:t}}),Te.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){Te.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=this,r=e.relatedTarget,a=e.handleObj;return r&&(r===n||Te.contains(n,r))||(e.type=a.origType,t=a.handler.apply(this,arguments),e.type=i),t}}}),Te.fn.extend({on:function(e,t,n,r){return N(this,e,t,n,r)},one:function(e,t,n,r){return N(this,e,t,n,r,1)},off:function(e,t,n){var r,a;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,Te(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"!=typeof e)return!1!==t&&"function"!=typeof t||(n=t,t=undefined),!1===n&&(n=C),this.each(function(){Te.event.remove(this,e,n,t)});for(a in e)this.off(a,t,e[a]);return this}});var ft=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,dt=/<script|<style|<link/i,ht=/checked\s*(?:[^=]|=\s*.checked.)/i,pt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;Te.extend({htmlPrefilter:function(e){return e.replace(ft,"<$1></$2>")},clone:function(e,t,n){var r,a,i,o,s=e.cloneNode(!0),l=Ye(e);if(!(be.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||Te.isXMLDoc(e)))for(o=w(s),r=0,a=(i=w(e)).length;r<a;r++)R(i[r],o[r]);if(t)if(n)for(i=i||w(e),o=o||w(s),r=0,a=i.length;r<a;r++)E(i[r],o[r]);else E(e,s);return 0<(o=w(s,"script")).length&&x(o,!l&&w(e,"script")),s},cleanData:function(e){for(var t,n,r,a=Te.event.special,i=0;(n=e[i])!==undefined;i++)if(We(n)){if(t=n[Be.expando]){if(t.events)for(r in t.events)a[r]?Te.event.remove(n,r):Te.removeEvent(n,r,t.handle);n[Be.expando]=undefined}n[$e.expando]&&(n[$e.expando]=undefined)}}}),Te.fn.extend({detach:function(e){return P(this,e,!0)},remove:function(e){return P(this,e)},text:function(e){return Me(this,function(e){return e===undefined?Te.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return F(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||I(this,e).appendChild(e)})},prepend:function(){return F(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=I(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return F(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return F(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(Te.cleanData(w(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return Te.clone(this,e,t)})},html:function(e){return Me(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!dt.test(e)&&!at[(nt.exec(e)||["",""])[1].toLowerCase()]){e=Te.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(Te.cleanData(w(t,!1)),t.innerHTML=e);t=0}catch(a){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return F(this,arguments,function(e){var t=this.parentNode;Te.inArray(this,n)<0&&(Te.cleanData(w(this)),t&&t.replaceChild(e,this))},n)}}),Te.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,o){Te.fn[e]=function(e){for(var t,n=[],r=Te(e),a=r.length-1,i=0;i<=a;i++)t=i===a?this:this.clone(!0),Te(r[i])[o](t),de.apply(n,t.get());return this.pushStack(n)}});var gt=new RegExp("^("+Xe+")(?!px)[a-z%]+$","i"),mt=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=T),t.getComputedStyle(e)},vt=new RegExp(Ge.join("|"),"i");!function(){function e(){if(l){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",Je.appendChild(s).appendChild(l);var e=T.getComputedStyle(l);n="1%"!==e.top,o=12===t(e.marginLeft),l.style.right="60%",i=36===t(e.right),r=36===t(e.width),l.style.position="absolute",a=12===t(l.offsetWidth/3),Je.removeChild(s),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,a,i,o,s=le.createElement("div"),l=le.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",be.clearCloneStyle="content-box"===l.style.backgroundClip,Te.extend(be,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),i},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),o},scrollboxSize:function(){return e(),a}}))}();var yt=["Webkit","Moz","ms"],bt=le.createElement("div").style,wt={},xt=/^(none|table(?!-c[ea]).+)/,St=/^--/,Dt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"};Te.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=H(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var a,i,o,s=h(t),l=St.test(t),u=e.style;if(l||(t=q(s)),o=Te.cssHooks[t]||Te.cssHooks[s],n===undefined)return o&&"get"in o&&(a=o.get(e,!1,r))!==undefined?a:u[t];"string"===(i=typeof n)&&(a=Ve.exec(n))&&a[1]&&(n=v(e,t,a),i="number"),null!=n&&n==n&&("number"!==i||l||(n+=a&&a[3]||(Te.cssNumber[s]?"":"px")),be.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),o&&"set"in o&&(n=o.set(e,n,r))===undefined||(l?u.setProperty(t,n):u[t]=n))}},css:function(e,t,n,r){var a,i,o,s=h(t);return St.test(t)||(t=q(s)),(o=Te.cssHooks[t]||Te.cssHooks[s])&&"get"in o&&(a=o.get(e,!0,n)),a===undefined&&(a=H(e,t,r)),"normal"===a&&t in Tt&&(a=Tt[t]),""===n||n?(i=parseFloat(a),!0===n||isFinite(i)?i||0:a):a}}),Te.each(["height","width"],function(e,l){Te.cssHooks[l]={get:function(e,t,n){if(t)return!xt.test(Te.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?$(e,l,n):Qe(e,Dt,function(){return $(e,l,n)})},set:function(e,t,n){var r,a=mt(e),i=!be.scrollboxSize()&&"absolute"===a.position,o=(i||n)&&"border-box"===Te.css(e,"boxSizing",!1,a),s=n?B(e,l,n,o,a):0;return o&&i&&(s-=Math.ceil(e["offset"+l[0].toUpperCase()+l.slice(1)]-parseFloat(a[l])-B(e,l,"border",!1,a)-.5)),s&&(r=Ve.exec(t))&&"px"!==(r[3]||"px")&&(e.style[l]=t,t=Te.css(e,l)),W(e,t,s)}}}),Te.cssHooks.marginLeft=M(be.reliableMarginLeft,function(e,t){if(t)return(parseFloat(H(e,"marginLeft"))||e.getBoundingClientRect().left-Qe(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),Te.each({margin:"",padding:"",border:"Width"},function(a,i){Te.cssHooks[a+i]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[a+Ge[t]+i]=r[t]||r[t-2]||r[0];return n}},"margin"!==a&&(Te.cssHooks[a+i].set=W)}),Te.fn.extend({css:function(e,t){return Me(this,function(e,t,n){var r,a,i={},o=0;if(Array.isArray(t)){for(r=mt(e),a=t.length;o<a;o++)i[t[o]]=Te.css(e,t[o],!1,r);return i}return n!==undefined?Te.style(e,t,n):Te.css(e,t)},e,t,1<arguments.length)}}),(Te.Tween=U).prototype={constructor:U,init:function(e,t,n,r,a,i){this.elem=e,this.prop=n,this.easing=a||Te.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(Te.cssNumber[n]?"":"px")},cur:function(){var e=U.propHooks[this.prop];return e&&e.get?e.get(this):U.propHooks._default.get(this)},run:function(e){var t,n=U.propHooks[this.prop];return this.options.duration?this.pos=t=Te.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):U.propHooks._default.set(this),this}},U.prototype.init.prototype=U.prototype,U.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=Te.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){Te.fx.step[e.prop]?Te.fx.step[e.prop](e):1!==e.elem.nodeType||!Te.cssHooks[e.prop]&&null==e.elem.style[q(e.prop)]?e.elem[e.prop]=e.now:Te.style(e.elem,e.prop,e.now+e.unit)}}},U.propHooks.scrollTop=U.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},Te.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},Te.fx=U.prototype.init,Te.fx.step={};var Ct,_t,At,Nt,kt=/^(?:toggle|show|hide)$/,It=/queueHooks$/;Te.Animation=Te.extend(Z,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return v(n.elem,e,Ve.exec(t),n),n}]},tweener:function(e,t){we(e)?(t=e,e=["*"]):e=e.match(Fe);for(var n,r=0,a=e.length;r<a;r++)n=e[r],Z.tweeners[n]=Z.tweeners[n]||[],Z.tweeners[n].unshift(t)},prefilters:[J],prefilter:function(e,t){t?Z.prefilters.unshift(e):Z.prefilters.push(e)}}),Te.speed=function(e,t,n){var r=e&&"object"==typeof e?Te.extend({},e):{complete:n||!n&&t||we(e)&&e,duration:e,easing:n&&t||t&&!we(t)&&t};return Te.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in Te.fx.speeds?r.duration=Te.fx.speeds[r.duration]:r.duration=Te.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){we(r.old)&&r.old.call(this),r.queue&&Te.dequeue(this,r.queue)},r},Te.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Ke).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var a=Te.isEmptyObject(t),i=Te.speed(e,n,r),o=function(){var e=Z(this,Te.extend({},t),i);(a||Be.get(this,"finish"))&&e.stop(!0)};return o.finish=o,a||!1===i.queue?this.each(o):this.queue(i.queue,o)},stop:function(a,e,i){var o=function(e){var t=e.stop;delete e.stop,t(i)};return"string"!=typeof a&&(i=e,e=a,a=undefined),e&&!1!==a&&this.queue(a||"fx",[]),this.each(function(){var e=!0,t=null!=a&&a+"queueHooks",n=Te.timers,r=Be.get(this);if(t)r[t]&&r[t].stop&&o(r[t]);else for(t in r)r[t]&&r[t].stop&&It.test(t)&&o(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=a&&n[t].queue!==a||(n[t].anim.stop(i),e=!1,n.splice(t,1));!e&&i||Te.dequeue(this,a)})},finish:function(o){return!1!==o&&(o=o||"fx"),this.each(function(){var e,t=Be.get(this),n=t[o+"queue"], +r=t[o+"queueHooks"],a=Te.timers,i=n?n.length:0;for(t.finish=!0,Te.queue(this,o,[]),r&&r.stop&&r.stop.call(this,!0),e=a.length;e--;)a[e].elem===this&&a[e].queue===o&&(a[e].anim.stop(!0),a.splice(e,1));for(e=0;e<i;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),Te.each(["toggle","show","hide"],function(e,r){var a=Te.fn[r];Te.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?a.apply(this,arguments):this.animate(V(r,!0),e,t,n)}}),Te.each({slideDown:V("show"),slideUp:V("hide"),slideToggle:V("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){Te.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),Te.timers=[],Te.fx.tick=function(){var e,t=0,n=Te.timers;for(Ct=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||Te.fx.stop(),Ct=undefined},Te.fx.timer=function(e){Te.timers.push(e),Te.fx.start()},Te.fx.interval=13,Te.fx.start=function(){_t||(_t=!0,z())},Te.fx.stop=function(){_t=null},Te.fx.speeds={slow:600,fast:200,_default:400},Te.fn.delay=function(r,e){return r=Te.fx&&Te.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=T.setTimeout(e,r);t.stop=function(){T.clearTimeout(n)}})},At=le.createElement("input"),Nt=le.createElement("select").appendChild(le.createElement("option")),At.type="checkbox",be.checkOn=""!==At.value,be.optSelected=Nt.selected,(At=le.createElement("input")).value="t",At.type="radio",be.radioValue="t"===At.value;var jt,Lt=Te.expr.attrHandle;Te.fn.extend({attr:function(e,t){return Me(this,Te.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){Te.removeAttr(this,e)})}}),Te.extend({attr:function(e,t,n){var r,a,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return"undefined"==typeof e.getAttribute?Te.prop(e,t,n):(1===i&&Te.isXMLDoc(e)||(a=Te.attrHooks[t.toLowerCase()]||(Te.expr.match.bool.test(t)?jt:undefined)),n!==undefined?null===n?void Te.removeAttr(e,t):a&&"set"in a&&(r=a.set(e,n,t))!==undefined?r:(e.setAttribute(t,n+""),n):a&&"get"in a&&null!==(r=a.get(e,t))?r:null==(r=Te.find.attr(e,t))?undefined:r)},attrHooks:{type:{set:function(e,t){if(!be.radioValue&&"radio"===t&&u(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,a=t&&t.match(Fe);if(a&&1===e.nodeType)for(;n=a[r++];)e.removeAttribute(n)}}),jt={set:function(e,t,n){return!1===t?Te.removeAttr(e,n):e.setAttribute(n,n),n}},Te.each(Te.expr.match.bool.source.match(/\w+/g),function(e,t){var o=Lt[t]||Te.find.attr;Lt[t]=function(e,t,n){var r,a,i=t.toLowerCase();return n||(a=Lt[i],Lt[i]=r,r=null!=o(e,t,n)?i:null,Lt[i]=a),r}});var Et=/^(?:input|select|textarea|button)$/i,Rt=/^(?:a|area)$/i;Te.fn.extend({prop:function(e,t){return Me(this,Te.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[Te.propFix[e]||e]})}}),Te.extend({prop:function(e,t,n){var r,a,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&Te.isXMLDoc(e)||(t=Te.propFix[t]||t,a=Te.propHooks[t]),n!==undefined?a&&"set"in a&&(r=a.set(e,n,t))!==undefined?r:e[t]=n:a&&"get"in a&&null!==(r=a.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=Te.find.attr(e,"tabindex");return t?parseInt(t,10):Et.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),be.optSelected||(Te.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),Te.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){Te.propFix[this.toLowerCase()]=this}),Te.fn.extend({addClass:function(t){var e,n,r,a,i,o,s,l=0;if(we(t))return this.each(function(e){Te(this).addClass(t.call(this,e,Q(this)))});if((e=ee(t)).length)for(;n=this[l++];)if(a=Q(n),r=1===n.nodeType&&" "+K(a)+" "){for(o=0;i=e[o++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a!==(s=K(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,a,i,o,s,l=0;if(we(t))return this.each(function(e){Te(this).removeClass(t.call(this,e,Q(this)))});if(!arguments.length)return this.attr("class","");if((e=ee(t)).length)for(;n=this[l++];)if(a=Q(n),r=1===n.nodeType&&" "+K(a)+" "){for(o=0;i=e[o++];)for(;-1<r.indexOf(" "+i+" ");)r=r.replace(" "+i+" "," ");a!==(s=K(r))&&n.setAttribute("class",s)}return this},toggleClass:function(a,t){var i=typeof a,o="string"===i||Array.isArray(a);return"boolean"==typeof t&&o?t?this.addClass(a):this.removeClass(a):we(a)?this.each(function(e){Te(this).toggleClass(a.call(this,e,Q(this),t),t)}):this.each(function(){var e,t,n,r;if(o)for(t=0,n=Te(this),r=ee(a);e=r[t++];)n.hasClass(e)?n.removeClass(e):n.addClass(e);else a!==undefined&&"boolean"!==i||((e=Q(this))&&Be.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===a?"":Be.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&-1<(" "+K(Q(n))+" ").indexOf(t))return!0;return!1}});var Ft=/\r/g;Te.fn.extend({val:function(n){var r,e,a,t=this[0];return arguments.length?(a=we(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=a?n.call(this,e,Te(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=Te.map(t,function(e){return null==e?"":e+""})),(r=Te.valHooks[this.type]||Te.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&r.set(this,t,"value")!==undefined||(this.value=t))})):t?(r=Te.valHooks[t.type]||Te.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&(e=r.get(t,"value"))!==undefined?e:"string"==typeof(e=t.value)?e.replace(Ft,""):null==e?"":e:void 0}}),Te.extend({valHooks:{option:{get:function(e){var t=Te.find.attr(e,"value");return null!=t?t:K(Te.text(e))}},select:{get:function(e){var t,n,r,a=e.options,i=e.selectedIndex,o="select-one"===e.type,s=o?null:[],l=o?i+1:a.length;for(r=i<0?l:o?i:0;r<l;r++)if(((n=a[r]).selected||r===i)&&!n.disabled&&(!n.parentNode.disabled||!u(n.parentNode,"optgroup"))){if(t=Te(n).val(),o)return t;s.push(t)}return s},set:function(e,t){for(var n,r,a=e.options,i=Te.makeArray(t),o=a.length;o--;)((r=a[o]).selected=-1<Te.inArray(Te.valHooks.option.get(r),i))&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),Te.each(["radio","checkbox"],function(){Te.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<Te.inArray(Te(e).val(),t)}},be.checkOn||(Te.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),be.focusin="onfocusin"in T;var Pt=/^(?:focusinfocus|focusoutblur)$/,Ht=function(e){e.stopPropagation()};Te.extend(Te.event,{trigger:function(e,t,n,r){var a,i,o,s,l,u,c,f,d=[n||le],h=me.call(e,"type")?e.type:e,p=me.call(e,"namespace")?e.namespace.split("."):[];if(i=f=o=n=n||le,3!==n.nodeType&&8!==n.nodeType&&!Pt.test(h+Te.event.triggered)&&(-1<h.indexOf(".")&&(h=(p=h.split(".")).shift(),p.sort()),l=h.indexOf(":")<0&&"on"+h,(e=e[Te.expando]?e:new Te.Event(h,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=p.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=undefined,e.target||(e.target=n),t=null==t?[e]:Te.makeArray(t,[e]),c=Te.event.special[h]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!xe(n)){for(s=c.delegateType||h,Pt.test(s+h)||(i=i.parentNode);i;i=i.parentNode)d.push(i),o=i;o===(n.ownerDocument||le)&&d.push(o.defaultView||o.parentWindow||T)}for(a=0;(i=d[a++])&&!e.isPropagationStopped();)f=i,e.type=1<a?s:c.bindType||h,(u=(Be.get(i,"events")||{})[e.type]&&Be.get(i,"handle"))&&u.apply(i,t),(u=l&&i[l])&&u.apply&&We(i)&&(e.result=u.apply(i,t),!1===e.result&&e.preventDefault());return e.type=h,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(d.pop(),t)||!We(n)||l&&we(n[h])&&!xe(n)&&((o=n[l])&&(n[l]=null),Te.event.triggered=h,e.isPropagationStopped()&&f.addEventListener(h,Ht),n[h](),e.isPropagationStopped()&&f.removeEventListener(h,Ht),Te.event.triggered=undefined,o&&(n[l]=o)),e.result}},simulate:function(e,t,n){var r=Te.extend(new Te.Event,n,{type:e,isSimulated:!0});Te.event.trigger(r,null,t)}}),Te.fn.extend({trigger:function(e,t){return this.each(function(){Te.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return Te.event.trigger(e,t,n,!0)}}),be.focusin||Te.each({focus:"focusin",blur:"focusout"},function(n,r){var a=function(e){Te.event.simulate(r,e.target,Te.event.fix(e))};Te.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Be.access(e,r);t||e.addEventListener(n,a,!0),Be.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Be.access(e,r)-1;t?Be.access(e,r,t):(e.removeEventListener(n,a,!0),Be.remove(e,r))}}});var Mt=T.location,Ot=Date.now(),qt=/\?/;Te.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new T.DOMParser).parseFromString(e,"text/xml")}catch(n){t=undefined}return t&&!t.getElementsByTagName("parsererror").length||Te.error("Invalid XML: "+e),t};var Wt=/\[\]$/,Bt=/\r?\n/g,$t=/^(?:submit|button|image|reset|file)$/i,Ut=/^(?:input|select|textarea|keygen)/i;Te.param=function(e,t){var n,r=[],a=function(e,t){var n=we(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!Te.isPlainObject(e))Te.each(e,function(){a(this.name,this.value)});else for(n in e)te(n,e[n],t,a);return r.join("&")},Te.fn.extend({serialize:function(){return Te.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=Te.prop(this,"elements");return e?Te.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!Te(this).is(":disabled")&&Ut.test(this.nodeName)&&!$t.test(e)&&(this.checked||!tt.test(e))}).map(function(e,t){var n=Te(this).val();return null==n?null:Array.isArray(n)?Te.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}});var zt=/%20/g,Xt=/#.*$/,Vt=/([?&])_=[^&]*/,Gt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Jt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Zt=/^\/\//,Kt={},Qt={},en="*/".concat("*"),tn=le.createElement("a");tn.href=Mt.href,Te.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Mt.href,type:"GET",isLocal:Jt.test(Mt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":en,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":Te.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?ae(ae(e,Te.ajaxSettings),t):ae(Te.ajaxSettings,e)},ajaxPrefilter:ne(Kt),ajaxTransport:ne(Qt),ajax:function(e,t){function n(e,t,n,r){var a,i,o,s,l,u=t;p||(p=!0,h&&T.clearTimeout(h),c=undefined,d=r||"",S.readyState=0<e?4:0,a=200<=e&&e<300||304===e,n&&(s=ie(m,S,n)),s=oe(m,s,S,a),a?(m.ifModified&&((l=S.getResponseHeader("Last-Modified"))&&(Te.lastModified[f]=l),(l=S.getResponseHeader("etag"))&&(Te.etag[f]=l)),204===e||"HEAD"===m.type?u="nocontent":304===e?u="notmodified":(u=s.state,i=s.data,a=!(o=s.error))):(o=u,!e&&u||(u="error",e<0&&(e=0))),S.status=e,S.statusText=(t||u)+"",a?b.resolveWith(v,[i,u,S]):b.rejectWith(v,[S,u,o]),S.statusCode(x),x=undefined,g&&y.trigger(a?"ajaxSuccess":"ajaxError",[S,m,a?i:o]),w.fireWith(v,[S,u]),g&&(y.trigger("ajaxComplete",[S,m]),--Te.active||Te.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=undefined),t=t||{};var c,f,d,r,h,a,p,g,i,o,m=Te.ajaxSetup({},t),v=m.context||m,y=m.context&&(v.nodeType||v.jquery)?Te(v):Te.event,b=Te.Deferred(),w=Te.Callbacks("once memory"),x=m.statusCode||{},s={},l={},u="canceled",S={readyState:0,getResponseHeader:function(e){var t;if(p){if(!r)for(r={};t=Gt.exec(d);)r[t[1].toLowerCase()+" "]=(r[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=r[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return p?d:null},setRequestHeader:function(e,t){return null==p&&(e=l[e.toLowerCase()]=l[e.toLowerCase()]||e,s[e]=t),this},overrideMimeType:function(e){return null==p&&(m.mimeType=e),this},statusCode:function(e){var t;if(e)if(p)S.always(e[S.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),n(0,t),this}};if(b.promise(S),m.url=((e||m.url||Mt.href)+"").replace(Zt,Mt.protocol+"//"),m.type=t.method||t.type||m.method||m.type,m.dataTypes=(m.dataType||"*").toLowerCase().match(Fe)||[""],null==m.crossDomain){a=le.createElement("a");try{a.href=m.url,a.href=a.href,m.crossDomain=tn.protocol+"//"+tn.host!=a.protocol+"//"+a.host}catch(D){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=Te.param(m.data,m.traditional)),re(Kt,m,t,S),p)return S;for(i in(g=Te.event&&m.global)&&0==Te.active++&&Te.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!Yt.test(m.type),f=m.url.replace(Xt,""),m.hasContent?m.data&&m.processData&&0===(m.contentType||"").indexOf("application/x-www-form-urlencoded")&&(m.data=m.data.replace(zt,"+")):(o=m.url.slice(f.length),m.data&&(m.processData||"string"==typeof m.data)&&(f+=(qt.test(f)?"&":"?")+m.data,delete m.data),!1===m.cache&&(f=f.replace(Vt,"$1"),o=(qt.test(f)?"&":"?")+"_="+Ot+++o),m.url=f+o),m.ifModified&&(Te.lastModified[f]&&S.setRequestHeader("If-Modified-Since",Te.lastModified[f]),Te.etag[f]&&S.setRequestHeader("If-None-Match",Te.etag[f])),(m.data&&m.hasContent&&!1!==m.contentType||t.contentType)&&S.setRequestHeader("Content-Type",m.contentType),S.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+en+"; q=0.01":""):m.accepts["*"]),m.headers)S.setRequestHeader(i,m.headers[i]);if(m.beforeSend&&(!1===m.beforeSend.call(v,S,m)||p))return S.abort();if(u="abort",w.add(m.complete),S.done(m.success),S.fail(m.error),c=re(Qt,m,t,S)){if(S.readyState=1,g&&y.trigger("ajaxSend",[S,m]),p)return S;m.async&&0<m.timeout&&(h=T.setTimeout(function(){S.abort("timeout")},m.timeout));try{p=!1,c.send(s,n)}catch(D){if(p)throw D;n(-1,D)}}else n(-1,"No Transport");return S},getJSON:function(e,t,n){return Te.get(e,t,n,"json")},getScript:function(e,t){return Te.get(e,undefined,t,"script")}}),Te.each(["get","post"],function(e,a){Te[a]=function(e,t,n,r){return we(t)&&(r=r||n,n=t,t=undefined),Te.ajax(Te.extend({url:e,type:a,dataType:r,data:t,success:n},Te.isPlainObject(e)&&e))}}),Te._evalUrl=function(e,t){return Te.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){Te.globalEval(e,t)}})},Te.fn.extend({wrapAll:function(e){var t;return this[0]&&(we(e)&&(e=e.call(this[0])),t=Te(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return we(n)?this.each(function(e){Te(this).wrapInner(n.call(this,e))}):this.each(function(){var e=Te(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=we(t);return this.each(function(e){Te(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){Te(this).replaceWith(this.childNodes)}),this}}),Te.expr.pseudos.hidden=function(e){return!Te.expr.pseudos.visible(e)},Te.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},Te.ajaxSettings.xhr=function(){try{return new T.XMLHttpRequest}catch(e){}};var nn={0:200,1223:204},rn=Te.ajaxSettings.xhr();be.cors=!!rn&&"withCredentials"in rn,be.ajax=rn=!!rn,Te.ajaxTransport(function(i){var o,s;if(be.cors||rn&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=s=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(nn[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),s=r.onerror=r.ontimeout=o("error"),r.onabort!==undefined?r.onabort=s:r.onreadystatechange=function(){4===r.readyState&&T.setTimeout(function(){o&&s()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(a){if(o)throw a}},abort:function(){o&&o()}}}),Te.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),Te.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return Te.globalEval(e),e}}}),Te.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),Te.ajaxTransport("script",function(n){var r,a;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=Te("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",a=function(e){r.remove(),a=null,e&&t("error"===e.type?404:200,e.type)}),le.head.appendChild(r[0])},abort:function(){a&&a()}}});var an,on=[],sn=/(=)\?(?=&|$)|\?\?/;Te.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=on.pop()||Te.expando+"_"+Ot++;return this[e]=!0,e}}),Te.ajaxPrefilter("json jsonp",function(e,t,n){var r,a,i,o=!1!==e.jsonp&&(sn.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&sn.test(e.data)&&"data");if(o||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=we(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,o?e[o]=e[o].replace(sn,"$1"+r):!1!==e.jsonp&&(e.url+=(qt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return i||Te.error(r+" was not called"),i[0]},e.dataTypes[0]="json",a=T[r],T[r]=function(){i=arguments},n.always(function(){a===undefined?Te(T).removeProp(r):T[r]=a,e[r]&&(e.jsonpCallback=t.jsonpCallback,on.push(r)),i&&we(a)&&a(i[0]),i=a=undefined}),"script"}),be.createHTMLDocument=((an=le.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===an.childNodes.length),Te.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(be.createHTMLDocument?((r=(t=le.implementation.createHTMLDocument("")).createElement("base")).href=le.location.href,t.head.appendChild(r)):t=le),i=!n&&[],(a=Ie.exec(e))?[t.createElement(a[1])]:(a=S([e],t,i),i&&i.length&&Te(i).remove(),Te.merge([],a.childNodes)));var r,a,i},Te.fn.load=function(e,t,n){var r,a,i,o=this,s=e.indexOf(" ");return-1<s&&(r=K(e.slice(s)),e=e.slice(0,s)),we(t)?(n=t,t=undefined):t&&"object"==typeof t&&(a="POST"),0<o.length&&Te.ajax({url:e,type:a||"GET",dataType:"html",data:t}).done(function(e){i=arguments,o.html(r?Te("<div>").append(Te.parseHTML(e)).find(r):e)}).always(n&&function(e,t){o.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},Te.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){Te.fn[t]=function(e){return this.on(t,e)}}),Te.expr.pseudos.animated=function(t){return Te.grep(Te.timers,function(e){return t===e.elem}).length},Te.offset={setOffset:function(e,t,n){var r,a,i,o,s,l,u=Te.css(e,"position"),c=Te(e),f={};"static"===u&&(e.style.position="relative"),s=c.offset(),i=Te.css(e,"top"),l=Te.css(e,"left"),("absolute"===u||"fixed"===u)&&-1<(i+l).indexOf("auto")?(o=(r=c.position()).top,a=r.left):(o=parseFloat(i)||0,a=parseFloat(l)||0),we(t)&&(t=t.call(e,n,Te.extend({},s))),null!=t.top&&(f.top=t.top-s.top+o),null!=t.left&&(f.left=t.left-s.left+a),"using"in t?t.using.call(e,f):c.css(f)}},Te.fn.extend({offset:function(t){if(arguments.length)return t===undefined?this:this.each(function(e){Te.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],a={top:0,left:0};if("fixed"===Te.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===Te.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((a=Te(e).offset()).top+=Te.css(e,"borderTopWidth",!0),a.left+=Te.css(e,"borderLeftWidth",!0))}return{top:t.top-a.top-Te.css(r,"marginTop",!0),left:t.left-a.left-Te.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===Te.css(e,"position");)e=e.offsetParent;return e||Je})}}),Te.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,a){var i="pageYOffset"===a;Te.fn[t]=function(e){return Me(this,function(e,t,n){var r;if(xe(e)?r=e:9===e.nodeType&&(r=e.defaultView),n===undefined)return r?r[a]:e[t];r?r.scrollTo(i?r.pageXOffset:n,i?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),Te.each(["top","left"],function(e,n){Te.cssHooks[n]=M(be.pixelPosition,function(e,t){if(t)return t=H(e,n),gt.test(t)?Te(e).position()[n]+"px":t})}),Te.each({Height:"height",Width:"width"},function(o,s){Te.each({padding:"inner"+o,content:s,"":"outer"+o},function(r,i){Te.fn[i]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),a=r||(!0===e||!0===t?"margin":"border");return Me(this,function(e,t,n){var r;return xe(e)?0===i.indexOf("outer")?e["inner"+o]:e.document.documentElement["client"+o]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+o],r["scroll"+o],e.body["offset"+o],r["offset"+o],r["client"+o])):n===undefined?Te.css(e,t,a):Te.style(e,t,n,a)},s,n?e:undefined,n)}})}),Te.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){Te.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),Te.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),Te.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),Te.proxy=function(e,t){var n,r,a;return"string"==typeof t&&(n=e[t],t=e,e=n),we(e)?(r=ce.call(arguments,2),(a=function(){return e.apply(t||this,r.concat(ce.call(arguments)))}).guid=e.guid=e.guid||Te.guid++,a):undefined},Te.holdReady=function(e){e?Te.readyWait++:Te.ready(!0)},Te.isArray=Array.isArray,Te.parseJSON=JSON.parse,Te.nodeName=u,Te.isFunction=we,Te.isWindow=xe,Te.camelCase=h,Te.type=m,Te.now=Date.now,Te.isNumeric=function(e){var t=Te.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return Te});var ln=T.jQuery,un=T.$;return Te.noConflict=function(e){return T.$===Te&&(T.$=un),e&&T.jQuery===Te&&(T.jQuery=ln),Te},e||(T.jQuery=T.$=Te),Te});var hljs=new function(){function x(e){return e.replace(/&/gm,"&amp;").replace(/</gm,"&lt;")}function S(e,t,n){return RegExp(t,"m"+(e.cI?"i":"")+(n?"g":""))}function r(e){for(var t=0;t<e.childNodes.length;t++){var n=e.childNodes[t];if("CODE"==n.nodeName)return n;if(3!=n.nodeType||!n.nodeValue.match(/\s+/))break}}function h(e,t){for(var n="",r=0;r<e.childNodes.length;r++)if(3==e.childNodes[r].nodeType){var a=e.childNodes[r].nodeValue;t&&(a=a.replace(/\n/g,"")),n+=a}else"BR"==e.childNodes[r].nodeName?n+="\n":n+=h(e.childNodes[r]);return/MSIE [678]/.test(navigator.userAgent)&&(n=n.replace(/\r/g,"\n")),n}function p(e){var t=e.className.split(/\s+/);t=t.concat(e.parentNode.className.split(/\s+/));for(var n=0;n<t.length;n++){var r=t[n].replace(/^language-/,"");if(T[r]||"no-highlight"==r)return r}}function g(e){var r=[];return function(e,t){for(var n=0;n<e.childNodes.length;n++)3==e.childNodes[n].nodeType?t+=e.childNodes[n].nodeValue.length:"BR"==e.childNodes[n].nodeName?t+=1:(r.push({event:"start",offset:t,node:e.childNodes[n]}),t=arguments.callee(e.childNodes[n],t),r.push({event:"stop",offset:t,node:e.childNodes[n]}))}(e,0),r}function m(e,t,n){function r(){return e.length&&t.length?e[0].offset!=t[0].offset?e[0].offset<t[0].offset?e:t:"start"==t[0].event?e:t:e.length?e:t}function a(e){for(var t="<"+e.nodeName.toLowerCase(),n=0;n<e.attributes.length;n++){var r=e.attributes[n];t+=" "+r.nodeName.toLowerCase(),r.nodeValue!=undefined&&(t+='="'+x(r.nodeValue)+'"')}return t+">"}for(var i=0,o="",s=[];e.length||t.length;){var l=r().splice(0,1)[0];if(o+=x(n.substr(i,l.offset-i)),i=l.offset,"start"==l.event)o+=a(l.node),s.push(l.node);else if("stop"==l.event){var u=s.length;do{var c=s[--u];o+="</"+c.nodeName.toLowerCase()+">"}while(c!=l.node);for(s.splice(u,1);u<s.length;)o+=a(s[u]),u++}}return o+=n.substr(i)}function D(e,t){function l(e,t){for(var n=0;n<t.c.length;n++)if(t.c[n].bR.test(e))return t.c[n]}function u(e,t){if(h[e].e&&h[e].eR.test(t))return 1;if(h[e].eW){var n=u(e-1,t);return n?n+1:0}return 0}function c(e,t){return t.iR&&t.iR.test(e)}function a(e,t){for(var n=[],r=0;r<e.c.length;r++)n.push(e.c[r].b);for(var a=h.length-1;h[a].e&&n.push(h[a].e),h[--a+1].eW;);return e.i&&n.push(e.i),S(t,"("+n.join("|")+")",!0)}function n(e,t){var n=h[h.length-1];n.t||(n.t=a(n,s)),n.t.lastIndex=t;var r=n.t.exec(e);return r?[e.substr(t,r.index-t),r[0],!1]:[e.substr(t),"",!0]}function o(e,t){var n=s.cI?t[0].toLowerCase():t[0];for(var r in e.kG)if(e.kG.hasOwnProperty(r)){var a=e.kG[r].hasOwnProperty(n);if(a)return[r,a]}return!1}function r(e,t){if(!t.k)return x(e);var n="",r=0;t.lR.lastIndex=0;for(var a=t.lR.exec(e);a;){n+=x(e.substr(r,a.index-r));var i=o(t,a);i?(g+=i[1],n+='<span class="'+i[0]+'">'+x(a[0])+"</span>"):n+=x(a[0]),r=t.lR.lastIndex,a=t.lR.exec(e)}return n+=x(e.substr(r,e.length-r))}function f(e,t){if(t.sL&&T[t.sL]){var n=D(t.sL,e);return g+=n.keyword_count,n.value}return r(e,t)}function d(e,t){var n=e.cN?'<span class="'+e.cN+'">':"";e.rB?(m+=n,e.buffer=""):e.eB?(m+=x(t)+n,e.buffer=""):(m+=n,e.buffer=t),h.push(e),p+=e.r}function i(e,t,n){var r=h[h.length-1];if(n)return m+=f(r.buffer+e,r),!1;var a=l(t,r);if(a)return m+=f(r.buffer+e,r),d(a,t),a.rB;var i=u(h.length-1,t);if(i){var o=r.cN?"</span>":"";for(r.rE?m+=f(r.buffer+e,r)+o:r.eE?m+=f(r.buffer+e,r)+o+x(t):m+=f(r.buffer+e+t,r)+o;1<i;)o=h[h.length-2].cN?"</span>":"",m+=o,i--,h.length--;var s=h[h.length-1];return h.length--,h[h.length-1].buffer="",s.starts&&d(s.starts,""),r.rE}if(c(t,r))throw"Illegal"}var s=T[e],h=[s.dM],p=0,g=0,m="";try{var v=0;s.dM.buffer="";do{var y=n(t,v),b=i(y[0],y[1],y[2]);v+=y[0].length,b||(v+=y[1].length)}while(!y[2]);if(1<h.length)throw"Illegal";return{language:e,r:p,keyword_count:g,value:m}}catch(w){if("Illegal"==w)return{language:null,r:0,keyword_count:0,value:x(t)};throw w}}function e(){function i(e,t,n){if(!e.compiled){for(var r in n||(e.bR=S(t,e.b?e.b:"\\B|\\b"),e.e||e.eW||(e.e="\\B|\\b"),e.e&&(e.eR=S(t,e.e))),e.i&&(e.iR=S(t,e.i)),e.r==undefined&&(e.r=1),e.k&&(e.lR=S(t,e.l||hljs.IR,!0)),e.k)if(e.k.hasOwnProperty(r)){e.k[r]instanceof Object?e.kG=e.k:e.kG={keyword:e.k};break}e.c||(e.c=[]),e.compiled=!0;for(var a=0;a<e.c.length;a++)i(e.c[a],t,!1);e.starts&&i(e.starts,t,!1)}}for(var e in T)T.hasOwnProperty(e)&&i(T[e].dM,T[e],!0)}function v(){v.called||(v.called=!0,e())}function a(e,n,t){v();var r=h(e,t),a=p(e);if("no-highlight"!=a){if(a)var i=D(a,r);else{var o=i={language:"",keyword_count:0,r:0,value:x(r)};for(var s in T)if(T.hasOwnProperty(s)){var l=D(s,r);l.keyword_count+l.r>o.keyword_count+o.r&&(o=l),l.keyword_count+l.r>i.keyword_count+i.r&&(o=i,i=l)}}var u=e.className;u.match(i.language)||(u=u?u+" "+i.language:i.language);var c=g(e);if(c.length)(f=document.createElement("pre")).innerHTML=i.value,i.value=m(c,g(f),r);if(n&&(i.value=i.value.replace(/^((<[^>]+>|\t)+)/gm,function(e,t){return t.replace(/\t/g,n)})),t&&(i.value=i.value.replace(/\n/g,"<br>")),/MSIE [678]/.test(navigator.userAgent)&&"CODE"==e.tagName&&"PRE"==e.parentNode.tagName){var f=e.parentNode,d=document.createElement("div");d.innerHTML="<pre><code>"+i.value+"</code></pre>",e=d.firstChild.firstChild,d.firstChild.cN=f.cN,f.parentNode.replaceChild(d.firstChild,f)}else e.innerHTML=i.value;e.className=u,e.dataset={},e.dataset.result={language:i.language,kw:i.keyword_count,re:i.r},o&&o.language&&(e.dataset.second_best={language:o.language,kw:o.keyword_count,re:o.r})}}function i(){if(!i.called){i.called=!0,v();for(var e=document.getElementsByTagName("pre"),t=0;t<e.length;t++){var n=r(e[t]);n&&a(n,hljs.tabReplace)}}}function t(){var e=arguments,t=function(){i.apply(null,e)};window.addEventListener?(window.addEventListener("DOMContentLoaded",t,!1),window.addEventListener("load",t,!1)):window.attachEvent?window.attachEvent("onload",t):window.onload=t}var T={};this.LANGUAGES=T,this.initHighlightingOnLoad=t,this.highlightBlock=a,this.initHighlighting=i,this.IR="[a-zA-Z][a-zA-Z0-9_]*",this.UIR="[a-zA-Z_][a-zA-Z0-9_]*",this.NR="\\b\\d+(\\.\\d+)?",this.CNR="\\b(0x[A-Za-z0-9]+|\\d+(\\.\\d+)?)",this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",this.BE={b:"\\\\.",r:0},this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0},this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0},this.CLCM={cN:"comment",b:"//",e:"$"},this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"},this.HCM={cN:"comment",b:"#",e:"$"},this.NM={cN:"number",b:this.NR,r:0},this.CNM={cN:"number",b:this.CNR,r:0},this.inherit=function(e,t){var n={};for(var r in e)n[r]=e[r];if(t)for(var r in t)n[r]=t[r];return n}};hljs.LANGUAGES.ruby=function(){var e="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?",t="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,"yield":1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,eval:1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1, +"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}},r={cN:"yardoctag",b:"@[A-Za-z]+"},a={cN:"comment",b:"#",e:"$",c:[r]},i={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[r],r:10},o={cN:"comment",b:"^__END__",e:"\\n$"},s={cN:"subst",b:"#\\{",e:"}",l:e,k:n},l=[hljs.BE,s],u={cN:"string",b:"'",e:"'",c:l,r:0},c={cN:"string",b:'"',e:'"',c:l,r:0},f={cN:"string",b:"%[qw]?\\(",e:"\\)",c:l,r:10},d={cN:"string",b:"%[qw]?\\[",e:"\\]",c:l,r:10},h={cN:"string",b:"%[qw]?{",e:"}",c:l,r:10},p={cN:"string",b:"%[qw]?<",e:">",c:l,r:10},g={cN:"string",b:"%[qw]?/",e:"/",c:l,r:10},m={cN:"string",b:"%[qw]?%",e:"%",c:l,r:10},v={cN:"string",b:"%[qw]?-",e:"-",c:l,r:10},y={cN:"string",b:"%[qw]?\\|",e:"\\|",c:l,r:10},b={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:e,k:n,c:[{cN:"title",b:t,l:e,k:n},{cN:"params",b:"\\(",e:"\\)",l:e,k:n},a,i,o]},w={cN:"identifier",b:e,l:e,k:n,r:0},x=[a,i,o,u,c,f,d,h,p,g,m,v,y,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},a,i,o]},b,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[u,c,f,d,h,p,g,m,v,y,w],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},w,{b:"("+hljs.RSR+")\\s*",c:[a,i,o,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];return s.c=x,{dM:{l:e,k:n,c:b.c[1].c=x}}}(),function(c,s,o){function l(e,t,n){var r=s.createElement(e);return t&&(r.id=te+t),n&&(r.style.cssText=n),c(r)}function f(){return o.innerHeight?o.innerHeight:c(o).height()}function u(e,n){n!==Object(n)&&(n={}),this.cache={},this.el=e,this.value=function(e){var t;return this.cache[e]===undefined&&((t=c(this.el).attr("data-cbox-"+e))!==undefined?this.cache[e]=t:n[e]!==undefined?this.cache[e]=n[e]:Q[e]!==undefined&&(this.cache[e]=Q[e])),this.cache[e]},this.get=function(e){var t=this.value(e);return c.isFunction(t)?t.call(this.el,this):t}}function i(e){var t=k.length,n=(X+e)%t;return n<0?t+n:n}function d(e,t){return Math.round((/%/.test(e)?("x"===t?I.width():f())/100:1)*parseInt(e,10))}function h(e,t){return e.get("photo")||e.get("photoRegex").test(t)}function p(e,t){return e.get("retinaUrl")&&1<o.devicePixelRatio?t.replace(e.get("photoRegex"),e.get("retinaSuffix")):t}function g(e){"contains"in S[0]&&!S[0].contains(e.target)&&e.target!==x[0]&&(e.stopPropagation(),S.focus())}function m(e){m.str!==e&&(S.add(x).removeClass(m.str).addClass(e),m.str=e)}function v(e){X=0,e&&!1!==e&&"nofollow"!==e?(k=c("."+ne).filter(function(){return new u(this,c.data(this,ee)).get("rel")===e}),-1===(X=k.index(W.el))&&(k=k.add(W.el),X=k.length-1)):k=c(W.el)}function y(e){c(s).trigger(e),ue.triggerHandler(e)}function r(e){var t;if(!Y){if(t=c(e).data(ee),v((W=new u(e,t)).get("rel")),!G){G=J=!0,m(W.get("className")),S.css({visibility:"hidden",display:"block",opacity:""}),j=l(ce,"LoadedContent","width:0; height:0; overflow:hidden; visibility:hidden"),T.css({width:"",height:""}).append(j),B=C.height()+N.height()+T.outerHeight(!0)-T.height(),$=_.width()+A.width()+T.outerWidth(!0)-T.width(),U=j.outerHeight(!0),z=j.outerWidth(!0);var n=d(W.get("initialWidth"),"x"),r=d(W.get("initialHeight"),"y"),a=W.get("maxWidth"),i=W.get("maxHeight");W.w=Math.max((!1!==a?Math.min(n,d(a,"x")):n)-z-$,0),W.h=Math.max((!1!==i?Math.min(r,d(i,"y")):r)-U-B,0),j.css({width:"",height:W.h}),K.position(),y(re),W.get("onOpen"),q.add(R).hide(),S.focus(),W.get("trapFocus")&&s.addEventListener&&(s.addEventListener("focus",g,!0),ue.one(se,function(){s.removeEventListener("focus",g,!0)})),W.get("returnFocus")&&ue.one(se,function(){c(W.el).focus()})}var o=parseFloat(W.get("opacity"));x.css({opacity:o==o?o:"",cursor:W.get("overlayClose")?"pointer":"",visibility:"visible"}).show(),W.get("closeButton")?O.html(W.get("close")).appendTo(T):O.appendTo("<div/>"),w()}}function a(){S||(t=!1,I=c(o),S=l(ce).attr({id:ee,"class":!1===c.support.opacity?te+"IE":"",role:"dialog",tabindex:"-1"}).hide(),x=l(ce,"Overlay").hide(),E=c([l(ce,"LoadingOverlay")[0],l(ce,"LoadingGraphic")[0]]),D=l(ce,"Wrapper"),T=l(ce,"Content").append(R=l(ce,"Title"),F=l(ce,"Current"),M=c('<button type="button"/>').attr({id:te+"Previous"}),H=c('<button type="button"/>').attr({id:te+"Next"}),P=c('<button type="button"/>').attr({id:te+"Slideshow"}),E),O=c('<button type="button"/>').attr({id:te+"Close"}),D.append(l(ce).append(l(ce,"TopLeft"),C=l(ce,"TopCenter"),l(ce,"TopRight")),l(ce,!1,"clear:left").append(_=l(ce,"MiddleLeft"),T,A=l(ce,"MiddleRight")),l(ce,!1,"clear:left").append(l(ce,"BottomLeft"),N=l(ce,"BottomCenter"),l(ce,"BottomRight"))).find("div div").css({"float":"left"}),L=l(ce,!1,"position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;"),q=H.add(M).add(F).add(P)),s.body&&!S.parent().length&&c(s.body).append(x,S.append(D,L))}function b(){function e(e){1<e.which||e.shiftKey||e.altKey||e.metaKey||e.ctrlKey||(e.preventDefault(),r(this))}return!!S&&(t||(t=!0,H.click(function(){K.next()}),M.click(function(){K.prev()}),O.click(function(){K.close()}),x.click(function(){W.get("overlayClose")&&K.close()}),c(s).bind("keydown."+te,function(e){var t=e.keyCode;G&&W.get("escKey")&&27===t&&(e.preventDefault(),K.close()),G&&W.get("arrowKey")&&k[1]&&!e.altKey&&(37===t?(e.preventDefault(),M.click()):39===t&&(e.preventDefault(),H.click()))}),c.isFunction(c.fn.on)?c(s).on("click."+te,"."+ne,e):c("."+ne).live("click."+te,e)),!0)}function w(){var e,t,n,r=K.prep,a=++fe;if(V=!(J=!0),y(le),y(ae),W.get("onLoad"),W.h=W.get("height")?d(W.get("height"),"y")-U-B:W.get("innerHeight")&&d(W.get("innerHeight"),"y"),W.w=W.get("width")?d(W.get("width"),"x")-z-$:W.get("innerWidth")&&d(W.get("innerWidth"),"x"),W.mw=W.w,W.mh=W.h,W.get("maxWidth")&&(W.mw=d(W.get("maxWidth"),"x")-z-$,W.mw=W.w&&W.w<W.mw?W.w:W.mw),W.get("maxHeight")&&(W.mh=d(W.get("maxHeight"),"y")-U-B,W.mh=W.h&&W.h<W.mh?W.h:W.mh),e=W.get("href"),Z=setTimeout(function(){E.show()},100),W.get("inline")){var i=c(e).eq(0);n=c("<div>").hide().insertBefore(i),ue.one(le,function(){n.replaceWith(i)}),r(i)}else W.get("iframe")?r(" "):W.get("html")?r(W.get("html")):h(W,e)?(e=p(W,e),V=W.get("createImg"),c(V).addClass(te+"Photo").bind("error."+te,function(){r(l(ce,"Error").html(W.get("imgError")))}).one("load",function(){a===fe&&setTimeout(function(){var e;W.get("retinaImage")&&1<o.devicePixelRatio&&(V.height=V.height/o.devicePixelRatio,V.width=V.width/o.devicePixelRatio),W.get("scalePhotos")&&(t=function(){V.height-=V.height*e,V.width-=V.width*e},W.mw&&V.width>W.mw&&(e=(V.width-W.mw)/V.width,t()),W.mh&&V.height>W.mh&&(e=(V.height-W.mh)/V.height,t())),W.h&&(V.style.marginTop=Math.max(W.mh-V.height,0)/2+"px"),k[1]&&(W.get("loop")||k[X+1])&&(V.style.cursor="pointer",c(V).bind("click."+te,function(){K.next()})),V.style.width=V.width+"px",V.style.height=V.height+"px",r(V)},1)}),V.src=e):e&&L.load(e,W.get("data"),function(e,t){a===fe&&r("error"===t?l(ce,"Error").html(W.get("xhrError")):c(this).contents())})}var x,S,D,T,C,_,A,N,k,I,j,L,E,R,F,P,H,M,O,q,W,B,$,U,z,X,V,G,J,Y,Z,K,t,Q={html:!1,photo:!1,iframe:!1,inline:!1,transition:"elastic",speed:300,fadeOut:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,opacity:.9,preloading:!0,className:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:undefined,closeButton:!0,fastIframe:!0,open:!1,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",photoRegex:/\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,retinaImage:!1,retinaUrl:!1,retinaSuffix:"@2x.$1",current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",returnFocus:!0,trapFocus:!0,onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,rel:function(){return this.rel},href:function(){return c(this).attr("href")},title:function(){return this.title},createImg:function(){var n=new Image,e=c(this).data("cbox-img-attrs");return"object"==typeof e&&c.each(e,function(e,t){n[e]=t}),n},createIframe:function(){var n=s.createElement("iframe"),e=c(this).data("cbox-iframe-attrs");return"object"==typeof e&&c.each(e,function(e,t){n[e]=t}),"frameBorder"in n&&(n.frameBorder=0),"allowTransparency"in n&&(n.allowTransparency="true"),n.name=(new Date).getTime(),n.allowFullscreen=!0,n}},ee="colorbox",te="cbox",ne=te+"Element",re=te+"_open",ae=te+"_load",ie=te+"_complete",oe=te+"_cleanup",se=te+"_closed",le=te+"_purge",ue=c("<a/>"),ce="div",fe=0,de={},he=function(){function e(){clearTimeout(o)}function t(){(W.get("loop")||k[X+1])&&(e(),o=setTimeout(K.next,W.get("slideshowSpeed")))}function n(){P.html(W.get("slideshowStop")).unbind(l).one(l,r),ue.bind(ie,t).bind(ae,e),S.removeClass(s+"off").addClass(s+"on")}function r(){e(),ue.unbind(ie,t).unbind(ae,e),P.html(W.get("slideshowStart")).unbind(l).one(l,function(){K.next(),n()}),S.removeClass(s+"on").addClass(s+"off")}function a(){i=!1,P.hide(),e(),ue.unbind(ie,t).unbind(ae,e),S.removeClass(s+"off "+s+"on")}var i,o,s=te+"Slideshow_",l="click."+te;return function(){i?W.get("slideshow")||(ue.unbind(oe,a),a()):W.get("slideshow")&&k[1]&&(i=!0,ue.one(oe,a),W.get("slideshowAuto")?n():r(),P.show())}}();c[ee]||(c(a),(K=c.fn[ee]=c[ee]=function(t,e){var n=this;return t=t||{},c.isFunction(n)&&(n=c("<a/>"),t.open=!0),n[0]&&(a(),b()&&(e&&(t.onComplete=e),n.each(function(){var e=c.data(this,ee)||{};c.data(this,ee,c.extend(e,t))}).addClass(ne),new u(n[0],t).get("open")&&r(n[0]))),n}).position=function(t,e){function n(){C[0].style.width=N[0].style.width=T[0].style.width=parseInt(S[0].style.width,10)-$+"px",T[0].style.height=_[0].style.height=A[0].style.height=parseInt(S[0].style.height,10)-B+"px"}var r,a,i,o=0,s=0,l=S.offset();if(I.unbind("resize."+te),S.css({top:-9e4,left:-9e4}),a=I.scrollTop(),i=I.scrollLeft(),W.get("fixed")?(l.top-=a,l.left-=i,S.css({position:"fixed"})):(o=a,s=i,S.css({position:"absolute"})),!1!==W.get("right")?s+=Math.max(I.width()-W.w-z-$-d(W.get("right"),"x"),0):!1!==W.get("left")?s+=d(W.get("left"),"x"):s+=Math.round(Math.max(I.width()-W.w-z-$,0)/2),!1!==W.get("bottom")?o+=Math.max(f()-W.h-U-B-d(W.get("bottom"),"y"),0):!1!==W.get("top")?o+=d(W.get("top"),"y"):o+=Math.round(Math.max(f()-W.h-U-B,0)/2),S.css({top:l.top,left:l.left,visibility:"visible"}),D[0].style.width=D[0].style.height="9999px",r={width:W.w+z+$,height:W.h+U+B,top:o,left:s},t){var u=0;c.each(r,function(e){r[e]===de[e]||(u=t)}),t=u}de=r,t||S.css(r),S.dequeue().animate(r,{duration:t||0,complete:function(){n(),J=!1,D[0].style.width=W.w+z+$+"px",D[0].style.height=W.h+U+B+"px",W.get("reposition")&&setTimeout(function(){I.bind("resize."+te,K.position)},1),c.isFunction(e)&&e()},step:n})},K.resize=function(e){var t;G&&((e=e||{}).width&&(W.w=d(e.width,"x")-z-$),e.innerWidth&&(W.w=d(e.innerWidth,"x")),j.css({width:W.w}),e.height&&(W.h=d(e.height,"y")-U-B),e.innerHeight&&(W.h=d(e.innerHeight,"y")),e.innerHeight||e.height||(t=j.scrollTop(),j.css({height:"auto"}),W.h=j.height()),j.css({height:W.h}),t&&j.scrollTop(t),K.position("none"===W.get("transition")?0:W.get("speed")))},K.prep=function(e){function t(){return W.w=W.w||j.width(),W.w=W.mw&&W.mw<W.w?W.mw:W.w,W.w}function n(){return W.h=W.h||j.height(),W.h=W.mh&&W.mh<W.h?W.mh:W.h,W.h}if(G){var r,a="none"===W.get("transition")?0:W.get("speed");j.remove(),(j=l(ce,"LoadedContent").append(e)).hide().appendTo(L.show()).css({width:t(),overflow:W.get("scrolling")?"auto":"hidden"}).css({height:n()}).prependTo(T),L.hide(),c(V).css({"float":"none"}),m(W.get("className")),r=function(){function e(){!1===c.support.opacity&&S[0].style.removeAttribute("filter")}var t,n,r=k.length;G&&(n=function(){clearTimeout(Z),E.hide(),y(ie),W.get("onComplete")},R.html(W.get("title")).show(),j.show(),1<r?("string"==typeof W.get("current")&&F.html(W.get("current").replace("{current}",X+1).replace("{total}",r)).show(),H[W.get("loop")||X<r-1?"show":"hide"]().html(W.get("next")),M[W.get("loop")||X?"show":"hide"]().html(W.get("previous")),he(),W.get("preloading")&&c.each([i(-1),i(1)],function(){var e=k[this],t=new u(e,c.data(e,ee)),n=t.get("href");n&&h(t,n)&&(n=p(t,n),s.createElement("img").src=n)})):q.hide(),W.get("iframe")?(t=W.get("createIframe"),W.get("scrolling")||(t.scrolling="no"),c(t).attr({src:W.get("href"),"class":te+"Iframe"}).one("load",n).appendTo(j),ue.one(le,function(){t.src="//about:blank"}),W.get("fastIframe")&&c(t).trigger("load")):n(),"fade"===W.get("transition")?S.fadeTo(a,1,e):e())},"fade"===W.get("transition")?S.fadeTo(a,0,function(){K.position(0,r)}):K.position(a,r)}},K.next=function(){!J&&k[1]&&(W.get("loop")||k[X+1])&&(X=i(1),r(k[X]))},K.prev=function(){!J&&k[1]&&(W.get("loop")||X)&&(X=i(-1),r(k[X]))},K.close=function(){G&&!Y&&(G=!(Y=!0),y(oe),W.get("onCleanup"),I.unbind("."+te),x.fadeTo(W.get("fadeOut")||0,0),S.stop().fadeTo(W.get("fadeOut")||0,0,function(){S.hide(),x.hide(),y(le),j.remove(),setTimeout(function(){Y=!1,y(se),W.get("onClosed")},1)}))},K.remove=function(){S&&(S.stop(),c[ee].close(),S.stop(!1,!0).remove(),x.remove(),Y=!1,S=null,c("."+ne).removeData(ee).removeClass(ne),c(s).unbind("click."+te).unbind("keydown."+te))},K.element=function(){return c(W.el)},K.settings=Q)}(jQuery,document,window),function(n){"use strict";"function"==typeof define&&define.amd?define(["jquery"],function(e){return n(e,window,document)}):"object"==typeof exports?module.exports=function(e,t){return e||(e=window),t||(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t,e,e.document)}:n(jQuery,window,document)}(function(B,N,w,$){"use strict";function o(t){var n,r,a="a aa ai ao as b fn i m o s ",i={};B.each(t,function(e){(n=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!==a.indexOf(n[1]+" ")&&(r=e.replace(n[0],n[2].toLowerCase()),i[r]=e,"o"===n[1]&&o(t[e]))}),t._hungarianMap=i}function A(t,n,r){var a;t._hungarianMap||o(t),B.each(n,function(e){(a=t._hungarianMap[e])===$||!r&&n[a]!==$||("o"===a.charAt(0)?(n[a]||(n[a]={}),B.extend(!0,n[a],n[e]),A(t[a],n[a],r)):n[a]=n[e])})}function k(e){var t=Ge.defaults.oLanguage,n=t.sDecimal;if(n&&Be(n),e){var r=e.sZeroRecords;!e.sEmptyTable&&r&&"No data available in table"===t.sEmptyTable&&Ee(e,e,"sZeroRecords","sEmptyTable"),!e.sLoadingRecords&&r&&"Loading..."===t.sLoadingRecords&&Ee(e,e,"sZeroRecords","sLoadingRecords"),e.sInfoThousands&&(e.sThousands=e.sInfoThousands);var a=e.sDecimal;a&&n!==a&&Be(a)}}function I(e){pt(e,"ordering","bSort"),pt(e,"orderMulti","bSortMulti"),pt(e,"orderClasses","bSortClasses"),pt(e,"orderCellsTop","bSortCellsTop"),pt(e,"order","aaSorting"),pt(e,"orderFixed","aaSortingFixed"),pt(e,"paging","bPaginate"),pt(e,"pagingType","sPaginationType"),pt(e,"pageLength","iDisplayLength"),pt(e,"searching","bFilter"),"boolean"==typeof e.sScrollX&&(e.sScrollX=e.sScrollX?"100%":""),"boolean"==typeof e.scrollX&&(e.scrollX=e.scrollX?"100%":"");var t=e.aoSearchCols;if(t)for(var n=0,r=t.length;n<r;n++)t[n]&&A(Ge.models.oSearch,t[n])}function j(e){pt(e,"orderable","bSortable"),pt(e,"orderData","aDataSort"),pt(e,"orderSequence","asSorting"),pt(e,"orderDataType","sortDataType");var t=e.aDataSort;"number"!=typeof t||B.isArray(t)||(e.aDataSort=[t])}function L(e){if(!Ge.__browser){var t={};Ge.__browser=t;var n=B("<div/>").css({position:"fixed",top:0,left:-1*B(N).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(B("<div/>").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(B("<div/>").css({width:"100%",height:10}))).appendTo("body"),r=n.children(),a=r.children();t.barWidth=r[0].offsetWidth-r[0].clientWidth,t.bScrollOversize=100===a[0].offsetWidth&&100!==r[0].clientWidth,t.bScrollbarLeft=1!==Math.round(a.offset().left),t.bBounding=!!n[0].getBoundingClientRect().width,n.remove()}B.extend(e.oBrowser,Ge.__browser),e.oScroll.iBarWidth=Ge.__browser.barWidth}function n(e,t,n,r,a,i){var o,s=r,l=!1;for(n!==$&&(o=n,l=!0);s!==a;)e.hasOwnProperty(s)&&(o=l?t(o,e[s],s,e):e[s],l=!0,s+=i);return o}function E(e,t){var n=Ge.defaults.column,r=e.aoColumns.length,a=B.extend({},Ge.models.oColumn,n,{nTh:t||w.createElement("th"),sTitle:n.sTitle?n.sTitle:t?t.innerHTML:"",aDataSort:n.aDataSort?n.aDataSort:[r],mData:n.mData?n.mData:r,idx:r});e.aoColumns.push(a);var i=e.aoPreSearchCols;i[r]=B.extend({},Ge.models.oSearch,i[r]),R(e,r,B(t).data())}function R(e,t,n){var r=e.aoColumns[t],a=e.oClasses,i=B(r.nTh);if(!r.sWidthOrig){r.sWidthOrig=i.attr("width")||null;var o=(i.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);o&&(r.sWidthOrig=o[1])}n!==$&&null!==n&&(j(n),A(Ge.defaults.column,n,!0),n.mDataProp===$||n.mData||(n.mData=n.mDataProp),n.sType&&(r._sManualType=n.sType),n.className&&!n.sClass&&(n.sClass=n.className),n.sClass&&i.addClass(n.sClass),B.extend(r,n),Ee(r,n,"sWidth","sWidthOrig"),n.iDataSort!==$&&(r.aDataSort=[n.iDataSort]),Ee(r,n,"aDataSort"));var s=r.mData,l=q(s),u=r.mRender?q(r.mRender):null,c=function(e){return"string"==typeof e&&-1!==e.indexOf("@")};r._bAttrSrc=B.isPlainObject(s)&&(c(s.sort)||c(s.type)||c(s.filter)),r._setter=null,r.fnGetData=function(e,t,n){var r=l(e,t,$,n);return u&&t?u(r,t,e,n):r},r.fnSetData=function(e,t,n){return y(s)(e,t,n)},"number"!=typeof s&&(e._rowReadObject=!0),e.oFeatures.bSort||(r.bSortable=!1,i.addClass(a.sSortableNone));var f=-1!==B.inArray("asc",r.asSorting),d=-1!==B.inArray("desc",r.asSorting);r.bSortable&&(f||d)?f&&!d?(r.sSortingClass=a.sSortableAsc,r.sSortingClassJUI=a.sSortJUIAscAllowed):!f&&d?(r.sSortingClass=a.sSortableDesc,r.sSortingClassJUI=a.sSortJUIDescAllowed):(r.sSortingClass=a.sSortable,r.sSortingClassJUI=a.sSortJUI):(r.sSortingClass=a.sSortableNone,r.sSortingClassJUI="")}function U(e){if(!1!==e.oFeatures.bAutoWidth){var t=e.aoColumns;ve(e);for(var n=0,r=t.length;n<r;n++)t[n].nTh.style.width=t[n].sWidth}var a=e.oScroll;""===a.sY&&""===a.sX||ge(e),He(e,null,"column-sizing",[e])}function z(e,t){var n=P(e,"bVisible");return"number"==typeof n[t]?n[t]:null}function c(e,t){var n=P(e,"bVisible"),r=B.inArray(t,n);return-1!==r?r:null}function F(e){var n=0;return B.each(e.aoColumns,function(e,t){t.bVisible&&"none"!==B(t.nTh).css("display")&&n++}),n}function P(e,n){var r=[];return B.map(e.aoColumns,function(e,t){e[n]&&r.push(t)}),r}function l(e){var t,n,r,a,i,o,s,l,u,c=e.aoColumns,f=e.aoData,d=Ge.ext.type.detect;for(t=0,n=c.length;t<n;t++)if(u=[],!(s=c[t]).sType&&s._sManualType)s.sType=s._sManualType;else if(!s.sType){for(r=0,a=d.length;r<a;r++){for(i=0,o=f.length;i<o&&(u[i]===$&&(u[i]=g(e,i,t,"type")),(l=d[r](u[i],e))||r===d.length-1)&&"html"!==l;i++);if(l){s.sType=l;break}}s.sType||(s.sType="string")}}function H(e,t,n,r){var a,i,o,s,l,u,c,f=e.aoColumns;if(t)for(a=t.length-1;0<=a;a--){var d=(c=t[a]).targets!==$?c.targets:c.aTargets;for(B.isArray(d)||(d=[d]),o=0,s=d.length;o<s;o++)if("number"==typeof d[o]&&0<=d[o]){for(;f.length<=d[o];)E(e);r(d[o],c)}else if("number"==typeof d[o]&&d[o]<0)r(f.length+d[o],c);else if("string"==typeof d[o])for(l=0,u=f.length;l<u;l++)("_all"==d[o]||B(f[l].nTh).hasClass(d[o]))&&r(l,c)}if(n)for(a=0,i=n.length;a<i;a++)r(a,n[a])}function M(e,t,n,r){var a=e.aoData.length,i=B.extend(!0,{},Ge.models.oRow,{src:n?"dom":"data",idx:a});i._aData=t,e.aoData.push(i);for(var o=e.aoColumns,s=0,l=o.length;s<l;s++)o[s].sType=null;e.aiDisplayMaster.push(a);var u=e.rowIdFn(t);return u!==$&&(e.aIds[u]=i),!n&&e.oFeatures.bDeferRender||S(e,a,n,r),a}function O(n,e){var r;return e instanceof B||(e=B(e)),e.map(function(e,t){return r=f(n,t),M(n,r.data,t,r.cells)})}function e(e,t){return t._DT_RowIndex!==$?t._DT_RowIndex:null}function t(e,t,n){return B.inArray(n,e.aoData[t].anCells)}function g(e,t,n,r){var a=e.iDraw,i=e.aoColumns[n],o=e.aoData[t]._aData,s=i.sDefaultContent,l=i.fnGetData(o,r,{settings:e,row:t,col:n});if(l===$)return e.iDrawError!=a&&null===s&&(Le(e,0,"Requested unknown parameter "+("function"==typeof i.mData?"{function}":"'"+i.mData+"'")+" for row "+t+", column "+n,4),e.iDrawError=a),s;if(l!==o&&null!==l||null===s||r===$){if("function"==typeof l)return l.call(o)}else l=s;return null===l&&"display"==r?"":l}function r(e,t,n,r){var a=e.aoColumns[n],i=e.aoData[t]._aData;a.fnSetData(i,r,{settings:e,row:t,col:n})}function m(e){return B.map(e.match(/(\\.|[^\.])+/g)||[""],function(e){return e.replace(/\\\./g,".")})}function q(a){if(B.isPlainObject(a)){var i={};return B.each(a,function(e,t){t&&(i[e]=q(t))}),function(e,t,n,r){var a=i[t]||i._;return a!==$?a(e,t,n,r):e}}if(null===a)return function(e){return e};if("function"==typeof a)return function(e,t,n,r){return a(e,t,n,r)};if("string"!=typeof a||-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("("))return function(e){return e[a]};var h=function(e,t,n){var r,a,i,o;if(""!==n)for(var s=m(n),l=0,u=s.length;l<u;l++){if(r=s[l].match(gt),a=s[l].match(mt),r){if(s[l]=s[l].replace(gt,""),""!==s[l]&&(e=e[s[l]]),i=[],s.splice(0,l+1),o=s.join("."),B.isArray(e))for(var c=0,f=e.length;c<f;c++)i.push(h(e[c],t,o));var d=r[0].substring(1,r[0].length-1);e=""===d?i:i.join(d);break}if(a)s[l]=s[l].replace(mt,""),e=e[s[l]]();else{if(null===e||e[s[l]]===$)return $;e=e[s[l]]}}return e};return function(e,t){return h(e,t,a)}}function y(r){if(B.isPlainObject(r))return y(r._);if(null===r)return function(){};if("function"==typeof r)return function(e,t,n){r(e,"set",t,n)};if("string"!=typeof r||-1===r.indexOf(".")&&-1===r.indexOf("[")&&-1===r.indexOf("("))return function(e,t){e[r]=t};var p=function(e,t,n){for(var r,a,i,o,s,l=m(n),u=l[l.length-1],c=0,f=l.length-1;c<f;c++){if(a=l[c].match(gt),i=l[c].match(mt),a){if(l[c]=l[c].replace(gt,""),e[l[c]]=[],(r=l.slice()).splice(0,c+1),s=r.join("."),B.isArray(t))for(var d=0,h=t.length;d<h;d++)p(o={},t[d],s),e[l[c]].push(o);else e[l[c]]=t;return}i&&(l[c]=l[c].replace(mt,""),e=e[l[c]](t)),null!==e[l[c]]&&e[l[c]]!==$||(e[l[c]]={}),e=e[l[c]]}u.match(mt)?e=e[u.replace(mt,"")](t):e[u.replace(gt,"")]=t};return function(e,t){return p(e,t,r)}}function x(e){return st(e.aoData,"_aData")}function u(e){e.aoData.length=0,e.aiDisplayMaster.length=0,e.aiDisplay.length=0,e.aIds={}}function h(e,t,n){for(var r=-1,a=0,i=e.length;a<i;a++)e[a]==t?r=a:e[a]>t&&e[a]--;-1!=r&&n===$&&e.splice(r,1)}function a(n,r,e,t){var a,i,o=n.aoData[r],s=function(e,t){for(;e.childNodes.length;)e.removeChild(e.firstChild);e.innerHTML=g(n,r,t,"display")};if("dom"!==e&&(e&&"auto"!==e||"dom"!==o.src)){var l=o.anCells;if(l)if(t!==$)s(l[t],t);else for(a=0,i=l.length;a<i;a++)s(l[a],a)}else o._aData=f(n,o,t,t===$?$:o._aData).data;o._aSortData=null,o._aFilterData=null;var u=n.aoColumns;if(t!==$)u[t].sType=null;else{for(a=0,i=u.length;a<i;a++)u[a].sType=null;p(n,o)}}function f(e,t,n,a){var r,i,o,s=[],l=t.firstChild,u=0,c=e.aoColumns,f=e._rowReadObject;a=a!==$?a:f?{}:[];var d=function(e,t){if("string"==typeof e){var n=e.indexOf("@");if(-1!==n){var r=e.substring(n+1);y(e)(a,t.getAttribute(r))}}},h=function(e){n!==$&&n!==u||(i=c[u],o=B.trim(e.innerHTML),i&&i._bAttrSrc?(y(i.mData._)(a,o),d(i.mData.sort,e),d(i.mData.type,e),d(i.mData.filter,e)):f?(i._setter||(i._setter=y(i.mData)),i._setter(a,o)):a[u]=o);u++};if(l)for(;l;)"TD"!=(r=l.nodeName.toUpperCase())&&"TH"!=r||(h(l),s.push(l)),l=l.nextSibling;else for(var p=0,g=(s=t.anCells).length;p<g;p++)h(s[p]);var m=t.firstChild?t:t.nTr;if(m){var v=m.getAttribute("id");v&&y(e.rowId)(a,v)}return{data:a,cells:s}}function S(e,t,n,r){var a,i,o,s,l,u,c=e.aoData[t],f=c._aData,d=[];if(null===c.nTr){for(a=n||w.createElement("tr"),c.nTr=a,c.anCells=d,a._DT_RowIndex=t,p(e,c),s=0,l=e.aoColumns.length;s<l;s++)o=e.aoColumns[s],(i=(u=!n)?w.createElement(o.sCellType):r[s])._DT_CellIndex={row:t,column:s},d.push(i),!u&&(n&&!o.mRender&&o.mData===s||B.isPlainObject(o.mData)&&o.mData._===s+".display")||(i.innerHTML=g(e,t,s,"display")),o.sClass&&(i.className+=" "+o.sClass),o.bVisible&&!n?a.appendChild(i):!o.bVisible&&n&&i.parentNode.removeChild(i),o.fnCreatedCell&&o.fnCreatedCell.call(e.oInstance,i,g(e,t,s),f,t,s);He(e,"aoRowCreatedCallback",null,[a,f,t,d])}c.nTr.setAttribute("role","row")}function p(e,t){var n=t.nTr,r=t._aData;if(n){var a=e.rowIdFn(r);if(a&&(n.id=a),r.DT_RowClass){var i=r.DT_RowClass.split(" ");t.__rowc=t.__rowc?ht(t.__rowc.concat(i)):i,B(n).removeClass(t.__rowc.join(" ")).addClass(r.DT_RowClass)}r.DT_RowAttr&&B(n).attr(r.DT_RowAttr),r.DT_RowData&&B(n).data(r.DT_RowData)}}function d(e){var t,n,r,a,i,o=e.nTHead,s=e.nTFoot,l=0===B("th, td",o).length,u=e.oClasses,c=e.aoColumns;for(l&&(a=B("<tr/>").appendTo(o)),t=0,n=c.length;t<n;t++)i=c[t],r=B(i.nTh).addClass(i.sClass),l&&r.appendTo(a),e.oFeatures.bSort&&(r.addClass(i.sSortingClass),!1!==i.bSortable&&(r.attr("tabindex",e.iTabIndex).attr("aria-controls",e.sTableId),_e(e,i.nTh,t))),i.sTitle!=r[0].innerHTML&&r.html(i.sTitle),Oe(e,"header")(e,r,i,u);if(l&&W(e.aoHeader,o),B(o).find(">tr").attr("role","row"),B(o).find(">tr>th, >tr>td").addClass(u.sHeaderTH),B(s).find(">tr>th, >tr>td").addClass(u.sFooterTH),null!==s){var f=e.aoFooter[0];for(t=0,n=f.length;t<n;t++)(i=c[t]).nTf=f[t].cell,i.sClass&&B(i.nTf).addClass(i.sClass)}}function v(e,t,n){var r,a,i,o,s,l,u,c,f,d=[],h=[],p=e.aoColumns.length;if(t){for(n===$&&(n=!1),r=0,a=t.length;r<a;r++){for(d[r]=t[r].slice(),d[r].nTr=t[r].nTr,i=p-1;0<=i;i--)e.aoColumns[i].bVisible||n||d[r].splice(i,1);h.push([])}for(r=0,a=d.length;r<a;r++){if(u=d[r].nTr)for(;l=u.firstChild;)u.removeChild(l);for(i=0,o=d[r].length;i<o;i++)if(f=c=1,h[r][i]===$){for(u.appendChild(d[r][i].cell),h[r][i]=1;d[r+c]!==$&&d[r][i].cell==d[r+c][i].cell;)h[r+c][i]=1,c++;for(;d[r][i+f]!==$&&d[r][i].cell==d[r][i+f].cell;){for(s=0;s<c;s++)h[r+s][i+f]=1;f++}B(d[r][i].cell).attr("rowspan",c).attr("colspan",f)}}}}function b(e){var t=He(e,"aoPreDrawCallback","preDraw",[e]);if(-1===B.inArray(!1,t)){var n=[],r=0,a=e.asStripeClasses,i=a.length,o=(e.aoOpenRows.length,e.oLanguage),s=e.iInitDisplayStart,l="ssp"==qe(e),u=e.aiDisplay;e.bDrawing=!0,s!==$&&-1!==s&&(e._iDisplayStart=l?s:s>=e.fnRecordsDisplay()?0:s,e.iInitDisplayStart=-1);var c=e._iDisplayStart,f=e.fnDisplayEnd();if(e.bDeferLoading)e.bDeferLoading=!1,e.iDraw++,he(e,!1);else if(l){if(!e.bDestroying&&!_(e))return}else e.iDraw++;if(0!==u.length)for(var d=l?0:c,h=l?e.aoData.length:f,p=d;p<h;p++){var g=u[p],m=e.aoData[g];null===m.nTr&&S(e,g);var v=m.nTr;if(0!==i){var y=a[r%i];m._sRowStripe!=y&&(B(v).removeClass(m._sRowStripe).addClass(y),m._sRowStripe=y)}He(e,"aoRowCallback",null,[v,m._aData,r,p,g]),n.push(v),r++}else{var b=o.sZeroRecords;1==e.iDraw&&"ajax"==qe(e)?b=o.sLoadingRecords:o.sEmptyTable&&0===e.fnRecordsTotal()&&(b=o.sEmptyTable),n[0]=B("<tr/>",{"class":i?a[0]:""}).append(B("<td />",{valign:"top",colSpan:F(e),"class":e.oClasses.sRowEmpty}).html(b))[0]}He(e,"aoHeaderCallback","header",[B(e.nTHead).children("tr")[0],x(e),c,f,u]),He(e,"aoFooterCallback","footer",[B(e.nTFoot).children("tr")[0],x(e),c,f,u]);var w=B(e.nTBody);w.children().detach(),w.append(B(n)),He(e,"aoDrawCallback","draw",[e]),e.bSorted=!1,e.bFiltered=!1,e.bDrawing=!1}else he(e,!1)}function D(e,t){var n=e.oFeatures,r=n.bSort,a=n.bFilter;r&&De(e),a?J(e,e.oPreviousSearch):e.aiDisplay=e.aiDisplayMaster.slice(),!0!==t&&(e._iDisplayStart=0),e._drawHold=t,b(e),e._drawHold=!1}function T(e){var t=e.oClasses,n=B(e.nTable),r=B("<div/>").insertBefore(n),a=e.oFeatures,i=B("<div/>",{id:e.sTableId+"_wrapper","class":t.sWrapper+(e.nTFoot?"":" "+t.sNoFooter)});e.nHolding=r[0],e.nTableWrapper=i[0],e.nTableReinsertBefore=e.nTable.nextSibling;for(var o,s,l,u,c,f,d=e.sDom.split(""),h=0;h<d.length;h++){if(o=null,"<"==(s=d[h])){if(l=B("<div/>")[0],"'"==(u=d[h+1])||'"'==u){for(c="",f=2;d[h+f]!=u;)c+=d[h+f],f++;if("H"==c?c=t.sJUIHeader:"F"==c&&(c=t.sJUIFooter),-1!=c.indexOf(".")){var p=c.split(".");l.id=p[0].substr(1,p[0].length-1),l.className=p[1]}else"#"==c.charAt(0)?l.id=c.substr(1,c.length-1):l.className=c;h+=f}i.append(l),i=B(l)}else if(">"==s)i=i.parent();else if("l"==s&&a.bPaginate&&a.bLengthChange)o=ue(e);else if("f"==s&&a.bFilter)o=G(e);else if("r"==s&&a.bProcessing)o=de(e);else if("t"==s)o=pe(e);else if("i"==s&&a.bInfo)o=re(e);else if("p"==s&&a.bPaginate)o=ce(e);else if(0!==Ge.ext.feature.length)for(var g=Ge.ext.feature,m=0,v=g.length;m<v;m++)if(s==g[m].cFeature){o=g[m].fnInit(e);break}if(o){var y=e.aanFeatures;y[s]||(y[s]=[]),y[s].push(o),i.append(o)}}r.replaceWith(i),e.nHolding=null}function W(e,t){var n,r,a,i,o,s,l,u,c,f,d,h=B(t).children("tr"),p=function(e,t,n){for(var r=e[t];r[n];)n++;return n};for(e.splice(0,e.length),a=0,s=h.length;a<s;a++)e.push([]);for(a=0,s=h.length;a<s;a++)for(u=0,r=(n=h[a]).firstChild;r;){if("TD"==r.nodeName.toUpperCase()||"TH"==r.nodeName.toUpperCase())for(c=(c=1*r.getAttribute("colspan"))&&0!==c&&1!==c?c:1,f=(f=1*r.getAttribute("rowspan"))&&0!==f&&1!==f?f:1,l=p(e,a,u),d=1===c,o=0;o<c;o++)for(i=0;i<f;i++)e[a+i][l+o]={cell:r,unique:d},e[a+i].nTr=n;r=r.nextSibling}}function X(e,t,n){var r=[];n||(n=e.aoHeader,t&&W(n=[],t));for(var a=0,i=n.length;a<i;a++)for(var o=0,s=n[a].length;o<s;o++)!n[a][o].unique||r[o]&&e.bSortCellsTop||(r[o]=n[a][o].cell);return r}function C(r,e,t){if(He(r,"aoServerParams","serverParams",[e]),e&&B.isArray(e)){var a={},i=/(.*?)\[\]$/;B.each(e,function(e,t){var n=t.name.match(i);if(n){var r=n[0];a[r]||(a[r]=[]),a[r].push(t.value)}else a[t.name]=t.value}),e=a}var n,o=r.ajax,s=r.oInstance,l=function(e){He(r,null,"xhr",[r,e,r.jqXHR]),t(e)};if(B.isPlainObject(o)&&o.data){var u="function"==typeof(n=o.data)?n(e,r):n;e="function"==typeof n&&u?u:B.extend(!0,e,u),delete o.data}var c={data:e,success:function(e){var t=e.error||e.sError;t&&Le(r,0,t),r.json=e,l(e)},dataType:"json",cache:!1,type:r.sServerMethod,error:function(e,t){var n=He(r,null,"xhr",[r,null,r.jqXHR]);-1===B.inArray(!0,n)&&("parsererror"==t?Le(r,0,"Invalid JSON response",1):4===e.readyState&&Le(r,0,"Ajax error",7)),he(r,!1)}};r.oAjaxData=e,He(r,null,"preXhr",[r,e]),r.fnServerData?r.fnServerData.call(s,r.sAjaxSource,B.map(e,function(e,t){return{name:t,value:e}}),l,r):r.sAjaxSource||"string"==typeof o?r.jqXHR=B.ajax(B.extend(c,{url:o||r.sAjaxSource})):"function"==typeof o?r.jqXHR=o.call(s,e,l,r):(r.jqXHR=B.ajax(B.extend(c,o)),o.data=n)}function _(t){return!t.bAjaxDataGet||(t.iDraw++,he(t,!0),C(t,i(t),function(e){s(t,e)}),!1)}function i(e){var t,n,r,a,i=e.aoColumns,o=i.length,s=e.oFeatures,l=e.oPreviousSearch,u=e.aoPreSearchCols,c=[],f=Se(e),d=e._iDisplayStart,h=!1!==s.bPaginate?e._iDisplayLength:-1,p=function(e,t){c.push({name:e,value:t})};p("sEcho",e.iDraw),p("iColumns",o),p("sColumns",st(i,"sName").join(",")),p("iDisplayStart",d),p("iDisplayLength",h);var g={draw:e.iDraw,columns:[],order:[],start:d,length:h,search:{value:l.sSearch,regex:l.bRegex}};for(t=0;t<o;t++)r=i[t],a=u[t],n="function"==typeof r.mData?"function":r.mData,g.columns.push({data:n,name:r.sName,searchable:r.bSearchable,orderable:r.bSortable,search:{value:a.sSearch,regex:a.bRegex}}),p("mDataProp_"+t,n),s.bFilter&&(p("sSearch_"+t,a.sSearch),p("bRegex_"+t,a.bRegex),p("bSearchable_"+t,r.bSearchable)),s.bSort&&p("bSortable_"+t,r.bSortable);s.bFilter&&(p("sSearch",l.sSearch),p("bRegex",l.bRegex)),s.bSort&&(B.each(f,function(e,t){g.order.push({column:t.col,dir:t.dir}),p("iSortCol_"+e,t.col),p("sSortDir_"+e,t.dir)}),p("iSortingCols",f.length));var m=Ge.ext.legacy.ajax;return null===m?e.sAjaxSource?c:g:m?c:g}function s(e,n){var t=function(e,t){return n[e]!==$?n[e]:n[t]},r=V(e,n),a=t("sEcho","draw"),i=t("iTotalRecords","recordsTotal"),o=t("iTotalDisplayRecords","recordsFiltered");if(a){if(1*a<e.iDraw)return;e.iDraw=1*a}u(e),e._iRecordsTotal=parseInt(i,10),e._iRecordsDisplay=parseInt(o,10);for(var s=0,l=r.length;s<l;s++)M(e,r[s]) +;e.aiDisplay=e.aiDisplayMaster.slice(),e.bAjaxDataGet=!1,b(e),e._bInitComplete||se(e,n),e.bAjaxDataGet=!0,he(e,!1)}function V(e,t){var n=B.isPlainObject(e.ajax)&&e.ajax.dataSrc!==$?e.ajax.dataSrc:e.sAjaxDataProp;return"data"===n?t.aaData||t[n]:""!==n?q(n)(t):t}function G(r){var e=r.oClasses,t=r.sTableId,n=r.oLanguage,a=r.oPreviousSearch,i=r.aanFeatures,o='<input type="search" class="'+e.sFilterInput+'"/>',s=n.sSearch;s=s.match(/_INPUT_/)?s.replace("_INPUT_",o):s+o;var l=B("<div/>",{id:i.f?null:t+"_filter","class":e.sFilter}).append(B("<label/>").append(s)),u=function(){i.f;var e=this.value?this.value:"";e!=a.sSearch&&(J(r,{sSearch:e,bRegex:a.bRegex,bSmart:a.bSmart,bCaseInsensitive:a.bCaseInsensitive}),r._iDisplayStart=0,b(r))},c=null!==r.searchDelay?r.searchDelay:"ssp"===qe(r)?400:0,f=B("input",l).val(a.sSearch).attr("placeholder",n.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",c?xt(u,c):u).on("keypress.DT",function(e){if(13==e.keyCode)return!1}).attr("aria-controls",t);return B(r.nTable).on("search.dt.DT",function(e,t){if(r===t)try{f[0]!==w.activeElement&&f.val(a.sSearch)}catch(n){}}),l[0]}function J(e,t,n){var r=e.oPreviousSearch,a=e.aoPreSearchCols,i=function(e){r.sSearch=e.sSearch,r.bRegex=e.bRegex,r.bSmart=e.bSmart,r.bCaseInsensitive=e.bCaseInsensitive},o=function(e){return e.bEscapeRegex!==$?!e.bEscapeRegex:e.bRegex};if(l(e),"ssp"!=qe(e)){K(e,t.sSearch,n,o(t),t.bSmart,t.bCaseInsensitive),i(t);for(var s=0;s<a.length;s++)Z(e,a[s].sSearch,s,o(a[s]),a[s].bSmart,a[s].bCaseInsensitive);Y(e)}else i(t);e.bFiltered=!0,He(e,null,"search",[e])}function Y(e){for(var t,n,r=Ge.ext.search,a=e.aiDisplay,i=0,o=r.length;i<o;i++){for(var s=[],l=0,u=a.length;l<u;l++)n=a[l],t=e.aoData[n],r[i](e,t._aFilterData,n,t._aData,l)&&s.push(n);a.length=0,B.merge(a,s)}}function Z(e,t,n,r,a,i){if(""!==t){for(var o,s=[],l=e.aiDisplay,u=Q(t,r,a,i),c=0;c<l.length;c++)o=e.aoData[l[c]]._aFilterData[n],u.test(o)&&s.push(l[c]);e.aiDisplay=s}}function K(e,t,n,r,a,i){var o,s,l,u=Q(t,r,a,i),c=e.oPreviousSearch.sSearch,f=e.aiDisplayMaster,d=[];if(0!==Ge.ext.search.length&&(n=!0),s=ee(e),t.length<=0)e.aiDisplay=f.slice();else{for((s||n||r||c.length>t.length||0!==t.indexOf(c)||e.bSorted)&&(e.aiDisplay=f.slice()),o=e.aiDisplay,l=0;l<o.length;l++)u.test(e.aoData[o[l]]._sFilterRow)&&d.push(o[l]);e.aiDisplay=d}}function Q(e,t,n,r){(e=t?e:vt(e),n)&&(e="^(?=.*?"+B.map(e.match(/"[^"]+"|[^ ]+/g)||[""],function(e){if('"'===e.charAt(0)){var t=e.match(/^"(.*)"$/);e=t?t[1]:e}return e.replace('"',"")}).join(")(?=.*?")+").*$");return new RegExp(e,r?"i":"")}function ee(e){var t,n,r,a,i,o,s,l,u=e.aoColumns,c=Ge.ext.type.search,f=!1;for(n=0,a=e.aoData.length;n<a;n++)if(!(l=e.aoData[n])._aFilterData){for(o=[],r=0,i=u.length;r<i;r++)(t=u[r]).bSearchable?(s=g(e,n,r,"filter"),c[t.sType]&&(s=c[t.sType](s)),null===s&&(s=""),"string"!=typeof s&&s.toString&&(s=s.toString())):s="",s.indexOf&&-1!==s.indexOf("&")&&(yt.innerHTML=s,s=bt?yt.textContent:yt.innerText),s.replace&&(s=s.replace(/[\r\n\u2028]/g,"")),o.push(s);l._aFilterData=o,l._sFilterRow=o.join(" "),f=!0}return f}function te(e){return{search:e.sSearch,smart:e.bSmart,regex:e.bRegex,caseInsensitive:e.bCaseInsensitive}}function ne(e){return{sSearch:e.search,bSmart:e.smart,bRegex:e.regex,bCaseInsensitive:e.caseInsensitive}}function re(e){var t=e.sTableId,n=e.aanFeatures.i,r=B("<div/>",{"class":e.oClasses.sInfo,id:n?null:t+"_info"});return n||(e.aoDrawCallback.push({fn:ae,sName:"information"}),r.attr("role","status").attr("aria-live","polite"),B(e.nTable).attr("aria-describedby",t+"_info")),r[0]}function ae(e){var t=e.aanFeatures.i;if(0!==t.length){var n=e.oLanguage,r=e._iDisplayStart+1,a=e.fnDisplayEnd(),i=e.fnRecordsTotal(),o=e.fnRecordsDisplay(),s=o?n.sInfo:n.sInfoEmpty;o!==i&&(s+=" "+n.sInfoFiltered),s=ie(e,s+=n.sInfoPostFix);var l=n.fnInfoCallback;null!==l&&(s=l.call(e.oInstance,e,r,a,i,o,s)),B(t).html(s)}}function ie(e,t){var n=e.fnFormatNumber,r=e._iDisplayStart+1,a=e._iDisplayLength,i=e.fnRecordsDisplay(),o=-1===a;return t.replace(/_START_/g,n.call(e,r)).replace(/_END_/g,n.call(e,e.fnDisplayEnd())).replace(/_MAX_/g,n.call(e,e.fnRecordsTotal())).replace(/_TOTAL_/g,n.call(e,i)).replace(/_PAGE_/g,n.call(e,o?1:Math.ceil(r/a))).replace(/_PAGES_/g,n.call(e,o?1:Math.ceil(i/a)))}function oe(n){var r,e,t,a=n.iInitDisplayStart,i=n.aoColumns,o=n.oFeatures,s=n.bDeferLoading;if(n.bInitialised){for(T(n),d(n),v(n,n.aoHeader),v(n,n.aoFooter),he(n,!0),o.bAutoWidth&&ve(n),r=0,e=i.length;r<e;r++)(t=i[r]).sWidth&&(t.nTh.style.width=xe(t.sWidth));He(n,null,"preInit",[n]),D(n);var l=qe(n);("ssp"!=l||s)&&("ajax"==l?C(n,[],function(e){var t=V(n,e);for(r=0;r<t.length;r++)M(n,t[r]);n.iInitDisplayStart=a,D(n),he(n,!1),se(n,e)},n):(he(n,!1),se(n)))}else setTimeout(function(){oe(n)},200)}function se(e,t){e._bInitComplete=!0,(t||e.oInit.aaData)&&U(e),He(e,null,"plugin-init",[e,t]),He(e,"aoInitComplete","init",[e,t])}function le(e,t){var n=parseInt(t,10);e._iDisplayLength=n,Me(e),He(e,null,"length",[e,n])}function ue(r){for(var e=r.oClasses,t=r.sTableId,n=r.aLengthMenu,a=B.isArray(n[0]),i=a?n[0]:n,o=a?n[1]:n,s=B("<select/>",{name:t+"_length","aria-controls":t,"class":e.sLengthSelect}),l=0,u=i.length;l<u;l++)s[0][l]=new Option("number"==typeof o[l]?r.fnFormatNumber(o[l]):o[l],i[l]);var c=B("<div><label/></div>").addClass(e.sLength);return r.aanFeatures.l||(c[0].id=t+"_length"),c.children().append(r.oLanguage.sLengthMenu.replace("_MENU_",s[0].outerHTML)),B("select",c).val(r._iDisplayLength).on("change.DT",function(){le(r,B(this).val()),b(r)}),B(r.nTable).on("length.dt.DT",function(e,t,n){r===t&&B("select",c).val(n)}),c[0]}function ce(e){var t=e.sPaginationType,c=Ge.ext.pager[t],f="function"==typeof c,d=function(e){b(e)},n=B("<div/>").addClass(e.oClasses.sPaging+t)[0],h=e.aanFeatures;return f||c.fnInit(e,n,d),h.p||(n.id=e.sTableId+"_paginate",e.aoDrawCallback.push({fn:function(e){if(f){var t,n,r=e._iDisplayStart,a=e._iDisplayLength,i=e.fnRecordsDisplay(),o=-1===a,s=o?0:Math.ceil(r/a),l=o?1:Math.ceil(i/a),u=c(s,l);for(t=0,n=h.p.length;t<n;t++)Oe(e,"pageButton")(e,h.p[t],t,u,s,l)}else c.fnUpdate(e,d)},sName:"pagination"})),n}function fe(e,t,n){var r=e._iDisplayStart,a=e._iDisplayLength,i=e.fnRecordsDisplay();0===i||-1===a?r=0:"number"==typeof t?i<(r=t*a)&&(r=0):"first"==t?r=0:"previous"==t?(r=0<=a?r-a:0)<0&&(r=0):"next"==t?r+a<i&&(r+=a):"last"==t?r=Math.floor((i-1)/a)*a:Le(e,0,"Unknown paging action: "+t,5);var o=e._iDisplayStart!==r;return e._iDisplayStart=r,o&&(He(e,null,"page",[e]),n&&b(e)),o}function de(e){return B("<div/>",{id:e.aanFeatures.r?null:e.sTableId+"_processing","class":e.oClasses.sProcessing}).html(e.oLanguage.sProcessing).insertBefore(e.nTable)[0]}function he(e,t){e.oFeatures.bProcessing&&B(e.aanFeatures.r).css("display",t?"block":"none"),He(e,null,"processing",[e,t])}function pe(e){var t=B(e.nTable);t.attr("role","grid");var n=e.oScroll;if(""===n.sX&&""===n.sY)return e.nTable;var r=n.sX,a=n.sY,i=e.oClasses,o=t.children("caption"),s=o.length?o[0]._captionSide:null,l=B(t[0].cloneNode(!1)),u=B(t[0].cloneNode(!1)),c=t.children("tfoot"),f="<div/>",d=function(e){return e?xe(e):null};c.length||(c=null);var h=B(f,{"class":i.sScrollWrapper}).append(B(f,{"class":i.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:r?d(r):"100%"}).append(B(f,{"class":i.sScrollHeadInner}).css({"box-sizing":"content-box",width:n.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===s?o:null).append(t.children("thead"))))).append(B(f,{"class":i.sScrollBody}).css({position:"relative",overflow:"auto",width:d(r)}).append(t));c&&h.append(B(f,{"class":i.sScrollFoot}).css({overflow:"hidden",border:0,width:r?d(r):"100%"}).append(B(f,{"class":i.sScrollFootInner}).append(u.removeAttr("id").css("margin-left",0).append("bottom"===s?o:null).append(t.children("tfoot")))));var p=h.children(),g=p[0],m=p[1],v=c?p[2]:null;return r&&B(m).on("scroll.DT",function(){var e=this.scrollLeft;g.scrollLeft=e,c&&(v.scrollLeft=e)}),B(m).css(a&&n.bCollapse?"max-height":"height",a),e.nScrollHead=g,e.nScrollBody=m,e.nScrollFoot=v,e.aoDrawCallback.push({fn:ge,sName:"scrolling"}),h[0]}function ge(n){var e,t,r,a,i,o,s,l,u,c=n.oScroll,f=c.sX,d=c.sXInner,h=c.sY,p=c.iBarWidth,g=B(n.nScrollHead),m=g[0].style,v=g.children("div"),y=v[0].style,b=v.children("table"),w=n.nScrollBody,x=B(w),S=w.style,D=B(n.nScrollFoot).children("div"),T=D.children("table"),C=B(n.nTHead),_=B(n.nTable),A=_[0],N=A.style,k=n.nTFoot?B(n.nTFoot):null,I=n.oBrowser,j=I.bScrollOversize,L=st(n.aoColumns,"nTh"),E=[],R=[],F=[],P=[],H=function(e){var t=e.style;t.paddingTop="0",t.paddingBottom="0",t.borderTopWidth="0",t.borderBottomWidth="0",t.height=0},M=w.scrollHeight>w.clientHeight;if(n.scrollBarVis!==M&&n.scrollBarVis!==$)return n.scrollBarVis=M,void U(n);n.scrollBarVis=M,_.children("thead, tfoot").remove(),k&&(o=k.clone().prependTo(_),t=k.find("tr"),a=o.find("tr")),i=C.clone().prependTo(_),e=C.find("tr"),r=i.find("tr"),i.find("th, td").removeAttr("tabindex"),f||(S.width="100%",g[0].style.width="100%"),B.each(X(n,i),function(e,t){s=z(n,e),t.style.width=n.aoColumns[s].sWidth}),k&&me(function(e){e.style.width=""},a),u=_.outerWidth(),""===f?(N.width="100%",j&&(_.find("tbody").height()>w.offsetHeight||"scroll"==x.css("overflow-y"))&&(N.width=xe(_.outerWidth()-p)),u=_.outerWidth()):""!==d&&(N.width=xe(d),u=_.outerWidth()),me(H,r),me(function(e){F.push(e.innerHTML),E.push(xe(B(e).css("width")))},r),me(function(e,t){-1!==B.inArray(e,L)&&(e.style.width=E[t])},e),B(r).height(0),k&&(me(H,a),me(function(e){P.push(e.innerHTML),R.push(xe(B(e).css("width")))},a),me(function(e,t){e.style.width=R[t]},t),B(a).height(0)),me(function(e,t){e.innerHTML='<div class="dataTables_sizing">'+F[t]+"</div>",e.childNodes[0].style.height="0",e.childNodes[0].style.overflow="hidden",e.style.width=E[t]},r),k&&me(function(e,t){e.innerHTML='<div class="dataTables_sizing">'+P[t]+"</div>",e.childNodes[0].style.height="0",e.childNodes[0].style.overflow="hidden",e.style.width=R[t]},a),_.outerWidth()<u?(l=w.scrollHeight>w.offsetHeight||"scroll"==x.css("overflow-y")?u+p:u,j&&(w.scrollHeight>w.offsetHeight||"scroll"==x.css("overflow-y"))&&(N.width=xe(l-p)),""!==f&&""===d||Le(n,1,"Possible column misalignment",6)):l="100%",S.width=xe(l),m.width=xe(l),k&&(n.nScrollFoot.style.width=xe(l)),h||j&&(S.height=xe(A.offsetHeight+p));var O=_.outerWidth();b[0].style.width=xe(O),y.width=xe(O);var q=_.height()>w.clientHeight||"scroll"==x.css("overflow-y"),W="padding"+(I.bScrollbarLeft?"Left":"Right");y[W]=q?p+"px":"0px",k&&(T[0].style.width=xe(O),D[0].style.width=xe(O),D[0].style[W]=q?p+"px":"0px"),_.children("colgroup").insertBefore(_.children("thead")),x.trigger("scroll"),!n.bSorted&&!n.bFiltered||n._drawHold||(w.scrollTop=0)}function me(e,t,n){for(var r,a,i=0,o=0,s=t.length;o<s;){for(r=t[o].firstChild,a=n?n[o].firstChild:null;r;)1===r.nodeType&&(n?e(r,a,i):e(r,i),i++),r=r.nextSibling,a=n?a.nextSibling:null;o++}}function ve(e){var t,n,r,a=e.nTable,i=e.aoColumns,o=e.oScroll,s=o.sY,l=o.sX,u=o.sXInner,c=i.length,f=P(e,"bVisible"),d=B("th",e.nTHead),h=a.getAttribute("width"),p=a.parentNode,g=!1,m=e.oBrowser,v=m.bScrollOversize,y=a.style.width;for(y&&-1!==y.indexOf("%")&&(h=y),t=0;t<f.length;t++)null!==(n=i[f[t]]).sWidth&&(n.sWidth=ye(n.sWidthOrig,p),g=!0);if(v||!g&&!l&&!s&&c==F(e)&&c==d.length)for(t=0;t<c;t++){var b=z(e,t);null!==b&&(i[b].sWidth=xe(d.eq(t).width()))}else{var w=B(a).clone().css("visibility","hidden").removeAttr("id");w.find("tbody tr").remove();var x=B("<tr/>").appendTo(w.find("tbody"));for(w.find("thead, tfoot").remove(),w.append(B(e.nTHead).clone()).append(B(e.nTFoot).clone()),w.find("tfoot th, tfoot td").css("width",""),d=X(e,w.find("thead")[0]),t=0;t<f.length;t++)n=i[f[t]],d[t].style.width=null!==n.sWidthOrig&&""!==n.sWidthOrig?xe(n.sWidthOrig):"",n.sWidthOrig&&l&&B(d[t]).append(B("<div/>").css({width:n.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(e.aoData.length)for(t=0;t<f.length;t++)n=i[r=f[t]],B(be(e,r)).clone(!1).append(n.sContentPadding).appendTo(x);B("[name]",w).removeAttr("name");var S=B("<div/>").css(l||s?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(w).appendTo(p);l&&u?w.width(u):l?(w.css("width","auto"),w.removeAttr("width"),w.width()<p.clientWidth&&h&&w.width(p.clientWidth)):s?w.width(p.clientWidth):h&&w.width(h);var D=0;for(t=0;t<f.length;t++){var T=B(d[t]),C=T.outerWidth()-T.width(),_=m.bBounding?Math.ceil(d[t].getBoundingClientRect().width):T.outerWidth();D+=_,i[f[t]].sWidth=xe(_-C)}a.style.width=xe(D),S.remove()}if(h&&(a.style.width=xe(h)),(h||l)&&!e._reszEvt){var A=function(){B(N).on("resize.DT-"+e.sInstance,xt(function(){U(e)}))};v?setTimeout(A,1e3):A(),e._reszEvt=!0}}function ye(e,t){if(!e)return 0;var n=B("<div/>").css("width",xe(e)).appendTo(t||w.body),r=n[0].offsetWidth;return n.remove(),r}function be(e,t){var n=we(e,t);if(n<0)return null;var r=e.aoData[n];return r.nTr?r.anCells[t]:B("<td/>").html(g(e,n,t,"display"))[0]}function we(e,t){for(var n,r=-1,a=-1,i=0,o=e.aoData.length;i<o;i++)(n=(n=(n=g(e,i,t,"display")+"").replace(wt,"")).replace(/&nbsp;/g," ")).length>r&&(r=n.length,a=i);return a}function xe(e){return null===e?"0px":"number"==typeof e?e<0?"0px":e+"px":e.match(/\d$/)?e+"px":e}function Se(e){var t,n,r,a,i,o,s,l=[],u=e.aoColumns,c=e.aaSortingFixed,f=B.isPlainObject(c),d=[],h=function(e){e.length&&!B.isArray(e[0])?d.push(e):B.merge(d,e)};for(B.isArray(c)&&h(c),f&&c.pre&&h(c.pre),h(e.aaSorting),f&&c.post&&h(c.post),t=0;t<d.length;t++)for(n=0,r=(a=u[s=d[t][0]].aDataSort).length;n<r;n++)o=u[i=a[n]].sType||"string",d[t]._idx===$&&(d[t]._idx=B.inArray(d[t][1],u[i].asSorting)),l.push({src:s,col:i,dir:d[t][1],index:d[t]._idx,type:o,formatter:Ge.ext.type.order[o+"-pre"]});return l}function De(e){var t,n,r,a,c,f=[],d=Ge.ext.type.order,h=e.aoData,i=(e.aoColumns,0),o=e.aiDisplayMaster;for(l(e),t=0,n=(c=Se(e)).length;t<n;t++)(a=c[t]).formatter&&i++,Ne(e,a.col);if("ssp"!=qe(e)&&0!==c.length){for(t=0,r=o.length;t<r;t++)f[o[t]]=t;i===c.length?o.sort(function(e,t){var n,r,a,i,o,s=c.length,l=h[e]._aSortData,u=h[t]._aSortData;for(a=0;a<s;a++)if(0!==(i=(n=l[(o=c[a]).col])<(r=u[o.col])?-1:r<n?1:0))return"asc"===o.dir?i:-i;return(n=f[e])<(r=f[t])?-1:r<n?1:0}):o.sort(function(e,t){var n,r,a,i,o,s=c.length,l=h[e]._aSortData,u=h[t]._aSortData;for(a=0;a<s;a++)if(n=l[(o=c[a]).col],r=u[o.col],0!==(i=(d[o.type+"-"+o.dir]||d["string-"+o.dir])(n,r)))return i;return(n=f[e])<(r=f[t])?-1:r<n?1:0})}e.bSorted=!0}function Te(e){for(var t,n,r=e.aoColumns,a=Se(e),i=e.oLanguage.oAria,o=0,s=r.length;o<s;o++){var l=r[o],u=l.asSorting,c=l.sTitle.replace(/<.*?>/g,""),f=l.nTh;f.removeAttribute("aria-sort"),l.bSortable?(0<a.length&&a[0].col==o?(f.setAttribute("aria-sort","asc"==a[0].dir?"ascending":"descending"),n=u[a[0].index+1]||u[0]):n=u[0],t=c+("asc"===n?i.sSortAscending:i.sSortDescending)):t=c,f.setAttribute("aria-label",t)}}function Ce(e,t,n,r){var a,i=e.aoColumns[t],o=e.aaSorting,s=i.asSorting,l=function(e,t){var n=e._idx;return n===$&&(n=B.inArray(e[1],s)),n+1<s.length?n+1:t?null:0};if("number"==typeof o[0]&&(o=e.aaSorting=[o]),n&&e.oFeatures.bSortMulti){var u=B.inArray(t,st(o,"0"));-1!==u?(null===(a=l(o[u],!0))&&1===o.length&&(a=0),null===a?o.splice(u,1):(o[u][1]=s[a],o[u]._idx=a)):(o.push([t,s[0],0]),o[o.length-1]._idx=0)}else o.length&&o[0][0]==t?(a=l(o[0]),o.length=1,o[0][1]=s[a],o[0]._idx=a):(o.length=0,o.push([t,s[0]]),o[0]._idx=0);D(e),"function"==typeof r&&r(e)}function _e(t,e,n,r){var a=t.aoColumns[n];Fe(e,{},function(e){!1!==a.bSortable&&(t.oFeatures.bProcessing?(he(t,!0),setTimeout(function(){Ce(t,n,e.shiftKey,r),"ssp"!==qe(t)&&he(t,!1)},0)):Ce(t,n,e.shiftKey,r))})}function Ae(e){var t,n,r,a=e.aLastSort,i=e.oClasses.sSortColumn,o=Se(e),s=e.oFeatures;if(s.bSort&&s.bSortClasses){for(t=0,n=a.length;t<n;t++)r=a[t].src,B(st(e.aoData,"anCells",r)).removeClass(i+(t<2?t+1:3));for(t=0,n=o.length;t<n;t++)r=o[t].src,B(st(e.aoData,"anCells",r)).addClass(i+(t<2?t+1:3))}e.aLastSort=o}function Ne(e,t){var n,r,a,i=e.aoColumns[t],o=Ge.ext.order[i.sSortDataType];o&&(n=o.call(e.oInstance,e,t,c(e,t)));for(var s=Ge.ext.type.order[i.sType+"-pre"],l=0,u=e.aoData.length;l<u;l++)(r=e.aoData[l])._aSortData||(r._aSortData=[]),r._aSortData[t]&&!o||(a=o?n[l]:g(e,l,t,"sort"),r._aSortData[t]=s?s(a):a)}function ke(n){if(n.oFeatures.bStateSave&&!n.bDestroying){var e={time:+new Date,start:n._iDisplayStart,length:n._iDisplayLength,order:B.extend(!0,[],n.aaSorting),search:te(n.oPreviousSearch),columns:B.map(n.aoColumns,function(e,t){return{visible:e.bVisible,search:te(n.aoPreSearchCols[t])}})};He(n,"aoStateSaveParams","stateSaveParams",[n,e]),n.oSavedState=e,n.fnStateSaveCallback.call(n.oInstance,n,e)}}function Ie(a,e,i){var o,s,l=a.aoColumns,t=function(e){if(e&&e.time){var t=He(a,"aoStateLoadParams","stateLoadParams",[a,e]);if(-1===B.inArray(!1,t)){var n=a.iStateDuration;if(0<n&&e.time<+new Date-1e3*n)i();else if(e.columns&&l.length!==e.columns.length)i();else{if(a.oLoadedState=B.extend(!0,{},e),e.start!==$&&(a._iDisplayStart=e.start,a.iInitDisplayStart=e.start),e.length!==$&&(a._iDisplayLength=e.length),e.order!==$&&(a.aaSorting=[],B.each(e.order,function(e,t){a.aaSorting.push(t[0]>=l.length?[0,t[1]]:t)})),e.search!==$&&B.extend(a.oPreviousSearch,ne(e.search)),e.columns)for(o=0,s=e.columns.length;o<s;o++){var r=e.columns[o];r.visible!==$&&(l[o].bVisible=r.visible),r.search!==$&&B.extend(a.aoPreSearchCols[o],ne(r.search))}He(a,"aoStateLoaded","stateLoaded",[a,e]),i()}}else i()}else i()};if(a.oFeatures.bStateSave){var n=a.fnStateLoadCallback.call(a.oInstance,a,t);n!==$&&t(n)}else i()}function je(e){var t=Ge.settings,n=B.inArray(e,st(t,"nTable"));return-1!==n?t[n]:null}function Le(e,t,n,r){if(n="DataTables warning: "+(e?"table id="+e.sTableId+" - ":"")+n,r&&(n+=". For more information about this error, please see http://datatables.net/tn/"+r),t)N.console&&console.log&&console.log(n);else{var a=Ge.ext,i=a.sErrMode||a.errMode;if(e&&He(e,null,"error",[e,r,n]),"alert"==i)alert(n);else{if("throw"==i)throw new Error(n);"function"==typeof i&&i(e,r,n)}}}function Ee(n,r,e,t){B.isArray(e)?B.each(e,function(e,t){B.isArray(t)?Ee(n,r,t[0],t[1]):Ee(n,r,t)}):(t===$&&(t=e),r[e]!==$&&(n[t]=r[e]))}function Re(e,t,n){var r;for(var a in t)t.hasOwnProperty(a)&&(r=t[a],B.isPlainObject(r)?(B.isPlainObject(e[a])||(e[a]={}),B.extend(!0,e[a],r)):n&&"data"!==a&&"aaData"!==a&&B.isArray(r)?e[a]=r.slice():e[a]=r);return e}function Fe(t,e,n){B(t).on("click.DT",e,function(e){B(t).blur(),n(e)}).on("keypress.DT",e,function(e){13===e.which&&(e.preventDefault(),n(e))}).on("selectstart.DT",function(){return!1})}function Pe(e,t,n,r){n&&e[t].push({fn:n,sName:r})}function He(t,e,n,r){var a=[];if(e&&(a=B.map(t[e].slice().reverse(),function(e){return e.fn.apply(t.oInstance,r)})),null!==n){var i=B.Event(n+".dt");B(t.nTable).trigger(i,r),a.push(i.result)}return a}function Me(e){var t=e._iDisplayStart,n=e.fnDisplayEnd(),r=e._iDisplayLength;n<=t&&(t=n-r),t-=t%r,(-1===r||t<0)&&(t=0),e._iDisplayStart=t}function Oe(e,t){var n=e.renderer,r=Ge.ext.renderer[t];return B.isPlainObject(n)&&n[t]?r[n[t]]||r._:"string"==typeof n&&r[n]||r._}function qe(e){return e.oFeatures.bServerSide?"ssp":e.ajax||e.sAjaxSource?"ajax":"dom"}function We(e,t){var n=[],r=$t.numbers_length,a=Math.floor(r/2);return t<=r?n=ut(0,t):e<=a?((n=ut(0,r-2)).push("ellipsis"),n.push(t-1)):(t-1-a<=e?(n=ut(t-(r-2),t)).splice(0,0,"ellipsis"):((n=ut(e-a+2,e+a-1)).push("ellipsis"),n.push(t-1),n.splice(0,0,"ellipsis")),n.splice(0,0,0)),n.DT_el="span",n}function Be(n){B.each({num:function(e){return Ut(e,n)},"num-fmt":function(e){return Ut(e,n,et)},"html-num":function(e){return Ut(e,n,Ze)},"html-num-fmt":function(e){return Ut(e,n,Ze,et)}},function(e,t){Ue.type.order[e+n+"-pre"]=t,e.match(/^html\-/)&&(Ue.type.search[e+n]=Ue.type.search.html)})}function $e(t){return function(){var e=[je(this[Ge.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return Ge.ext.internal[t].apply(this,e)}}var Ue,ze,Xe,Ve,Ge=function(D){this.$=function(e,t){return this.api(!0).$(e,t)},this._=function(e,t){return this.api(!0).rows(e,t).data()},this.api=function(e){return new ze(e?je(this[Ue.iApiIndex]):this)},this.fnAddData=function(e,t){var n=this.api(!0),r=B.isArray(e)&&(B.isArray(e[0])||B.isPlainObject(e[0]))?n.rows.add(e):n.row.add(e);return(t===$||t)&&n.draw(),r.flatten().toArray()},this.fnAdjustColumnSizing=function(e){var t=this.api(!0).columns.adjust(),n=t.settings()[0],r=n.oScroll;e===$||e?t.draw(!1):""===r.sX&&""===r.sY||ge(n)},this.fnClearTable=function(e){var t=this.api(!0).clear();(e===$||e)&&t.draw()},this.fnClose=function(e){this.api(!0).row(e).child.hide()},this.fnDeleteRow=function(e,t,n){var r=this.api(!0),a=r.rows(e),i=a.settings()[0],o=i.aoData[a[0][0]];return a.remove(),t&&t.call(this,i,o),(n===$||n)&&r.draw(),o},this.fnDestroy=function(e){this.api(!0).destroy(e)},this.fnDraw=function(e){this.api(!0).draw(e)},this.fnFilter=function(e,t,n,r,a,i){var o=this.api(!0);null===t||t===$?o.search(e,n,r,i):o.column(t).search(e,n,r,i),o.draw()},this.fnGetData=function(e,t){var n=this.api(!0);if(e===$)return n.data().toArray();var r=e.nodeName?e.nodeName.toLowerCase():"";return t!==$||"td"==r||"th"==r?n.cell(e,t).data():n.row(e).data()||null},this.fnGetNodes=function(e){var t=this.api(!0);return e!==$?t.row(e).node():t.rows().nodes().flatten().toArray()},this.fnGetPosition=function(e){var t=this.api(!0),n=e.nodeName.toUpperCase();if("TR"==n)return t.row(e).index();if("TD"!=n&&"TH"!=n)return null;var r=t.cell(e).index();return[r.row,r.columnVisible,r.column]},this.fnIsOpen=function(e){return this.api(!0).row(e).child.isShown()},this.fnOpen=function(e,t,n){return this.api(!0).row(e).child(t,n).show().child()[0]},this.fnPageChange=function(e,t){var n=this.api(!0).page(e);(t===$||t)&&n.draw(!1)},this.fnSetColumnVis=function(e,t,n){var r=this.api(!0).column(e).visible(t);(n===$||n)&&r.columns.adjust().draw()},this.fnSettings=function(){return je(this[Ue.iApiIndex])},this.fnSort=function(e){this.api(!0).order(e).draw()},this.fnSortListener=function(e,t,n){this.api(!0).order.listener(e,t,n)},this.fnUpdate=function(e,t,n,r,a){var i=this.api(!0);return n===$||null===n?i.row(t).data(e):i.cell(t,n).data(e),(a===$||a)&&i.columns.adjust(),(r===$||r)&&i.draw(),0},this.fnVersionCheck=Ue.fnVersionCheck;var T=this,C=D===$,_=this.length;for(var e in C&&(D={}),this.oApi=this.internal=Ue.internal,Ge.ext.internal)e&&(this[e]=$e(e));return this.each(function(){var i,o=1<_?Re({},D,!0):D,s=0,e=this.getAttribute("id"),l=!1,t=Ge.defaults,u=B(this);if("table"==this.nodeName.toLowerCase()){I(t),j(t.column),A(t,t,!0),A(t.column,t.column,!0),A(t,B.extend(o,u.data()),!0);var n=Ge.settings;for(s=0,i=n.length;s<i;s++){var r=n[s];if(r.nTable==this||r.nTHead&&r.nTHead.parentNode==this||r.nTFoot&&r.nTFoot.parentNode==this){var a=o.bRetrieve!==$?o.bRetrieve:t.bRetrieve,c=o.bDestroy!==$?o.bDestroy:t.bDestroy;if(C||a)return r.oInstance;if(c){r.oInstance.fnDestroy();break}return void Le(r,0,"Cannot reinitialise DataTable",3)}if(r.sTableId==this.id){n.splice(s,1);break}}null!==e&&""!==e||(e="DataTables_Table_"+Ge.ext._unique++,this.id=e);var f=B.extend(!0,{},Ge.models.oSettings,{sDestroyWidth:u[0].style.width,sInstance:e,sTableId:e});f.nTable=this,f.oApi=T.internal,f.oInit=o,n.push(f),f.oInstance=1===T.length?T:u.dataTable(),I(o),k(o.oLanguage),o.aLengthMenu&&!o.iDisplayLength&&(o.iDisplayLength=B.isArray(o.aLengthMenu[0])?o.aLengthMenu[0][0]:o.aLengthMenu[0]),o=Re(B.extend(!0,{},t),o),Ee(f.oFeatures,o,["bPaginate","bLengthChange","bFilter","bSort","bSortMulti","bInfo","bProcessing","bAutoWidth","bSortClasses","bServerSide","bDeferRender"]),Ee(f,o,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]),Ee(f.oScroll,o,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]),Ee(f.oLanguage,o,"fnInfoCallback"),Pe(f,"aoDrawCallback",o.fnDrawCallback,"user"),Pe(f,"aoServerParams",o.fnServerParams,"user"),Pe(f,"aoStateSaveParams",o.fnStateSaveParams,"user"),Pe(f,"aoStateLoadParams",o.fnStateLoadParams,"user"),Pe(f,"aoStateLoaded",o.fnStateLoaded,"user"),Pe(f,"aoRowCallback",o.fnRowCallback,"user"),Pe(f,"aoRowCreatedCallback",o.fnCreatedRow,"user"),Pe(f,"aoHeaderCallback",o.fnHeaderCallback,"user"),Pe(f,"aoFooterCallback",o.fnFooterCallback,"user"),Pe(f,"aoInitComplete",o.fnInitComplete,"user"),Pe(f,"aoPreDrawCallback",o.fnPreDrawCallback,"user"),f.rowIdFn=q(o.rowId),L(f);var d=f.oClasses;if(B.extend(d,Ge.ext.classes,o.oClasses),u.addClass(d.sTable),f.iInitDisplayStart===$&&(f.iInitDisplayStart=o.iDisplayStart,f._iDisplayStart=o.iDisplayStart),null!==o.iDeferLoading){f.bDeferLoading=!0;var h=B.isArray(o.iDeferLoading);f._iRecordsDisplay=h?o.iDeferLoading[0]:o.iDeferLoading,f._iRecordsTotal=h?o.iDeferLoading[1]:o.iDeferLoading}var p=f.oLanguage;B.extend(!0,p,o.oLanguage),p.sUrl&&(B.ajax({dataType:"json",url:p.sUrl,success:function(e){k(e),A(t.oLanguage,e),B.extend(!0,p,e),oe(f)},error:function(){oe(f)}}),l=!0),null===o.asStripeClasses&&(f.asStripeClasses=[d.sStripeOdd,d.sStripeEven]);var g=f.asStripeClasses,m=u.children("tbody").find("tr").eq(0);-1!==B.inArray(!0,B.map(g,function(e){return m.hasClass(e)}))&&(B("tbody tr",this).removeClass(g.join(" ")),f.asDestroyStripes=g.slice());var v,y=[],b=this.getElementsByTagName("thead");if(0!==b.length&&(W(f.aoHeader,b[0]),y=X(f)),null===o.aoColumns)for(v=[],s=0,i=y.length;s<i;s++)v.push(null);else v=o.aoColumns;for(s=0,i=v.length;s<i;s++)E(f,y?y[s]:null);if(H(f,o.aoColumnDefs,v,function(e,t){R(f,e,t)}),m.length){var w=function(e,t){return null!==e.getAttribute("data-"+t)?t:null};B(m[0]).children("th, td").each(function(e,t){var n=f.aoColumns[e];if(n.mData===e){var r=w(t,"sort")||w(t,"order"),a=w(t,"filter")||w(t,"search");null===r&&null===a||(n.mData={_:e+".display",sort:null!==r?e+".@data-"+r:$,type:null!==r?e+".@data-"+r:$,filter:null!==a?e+".@data-"+a:$},R(f,e))}})}var x=f.oFeatures,S=function(){if(o.aaSorting===$){var e=f.aaSorting;for(s=0,i=e.length;s<i;s++)e[s][1]=f.aoColumns[s].asSorting[0]}Ae(f),x.bSort&&Pe(f,"aoDrawCallback",function(){if(f.bSorted){var e=Se(f),n={};B.each(e,function(e,t){n[t.src]=t.dir}),He(f,null,"order",[f,e,n]),Te(f)}}),Pe(f,"aoDrawCallback",function(){(f.bSorted||"ssp"===qe(f)||x.bDeferRender)&&Ae(f)},"sc");var t=u.children("caption").each(function(){this._captionSide=B(this).css("caption-side")}),n=u.children("thead");0===n.length&&(n=B("<thead/>").appendTo(u)),f.nTHead=n[0];var r=u.children("tbody");0===r.length&&(r=B("<tbody/>").appendTo(u)),f.nTBody=r[0];var a=u.children("tfoot");if(0===a.length&&0<t.length&&(""!==f.oScroll.sX||""!==f.oScroll.sY)&&(a=B("<tfoot/>").appendTo(u)),0===a.length||0===a.children().length?u.addClass(d.sNoFooter):0<a.length&&(f.nTFoot=a[0],W(f.aoFooter,f.nTFoot)),o.aaData)for(s=0;s<o.aaData.length;s++)M(f,o.aaData[s]);else(f.bDeferLoading||"dom"==qe(f))&&O(f,B(f.nTBody).children("tr"));f.aiDisplay=f.aiDisplayMaster.slice(),!(f.bInitialised=!0)===l&&oe(f)};o.bStateSave?(x.bStateSave=!0,Pe(f,"aoDrawCallback",ke,"state_save"),Ie(f,o,S)):S()}else Le(null,0,"Non-table node initialisation ("+this.nodeName+")",2)}),T=null,this},Je={},Ye=/[\r\n\u2028]/g,Ze=/<.*?>/g,Ke=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,Qe=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^","-"].join("|\\")+")","g"),et=/[',$\xa3\u20ac\xa5%\u2009\u202F\u20BD\u20a9\u20BArfk\u0243\u039e]/gi,tt=function(e){return!e||!0===e||"-"===e},nt=function(e){var t=parseInt(e,10);return!isNaN(t)&&isFinite(e)?t:null},rt=function(e,t){return Je[t]||(Je[t]=new RegExp(vt(t),"g")),"string"==typeof e&&"."!==t?e.replace(/\./g,"").replace(Je[t],"."):e},at=function(e,t,n){var r="string"==typeof e;return!!tt(e)||(t&&r&&(e=rt(e,t)),n&&r&&(e=e.replace(et,"")),!isNaN(parseFloat(e))&&isFinite(e))},it=function(e){return tt(e)||"string"==typeof e},ot=function(e,t,n){return!!tt(e)||(it(e)&&!!at(ft(e),t,n)||null)},st=function(e,t,n){var r=[],a=0,i=e.length;if(n!==$)for(;a<i;a++)e[a]&&e[a][t]&&r.push(e[a][t][n]);else for(;a<i;a++)e[a]&&r.push(e[a][t]);return r},lt=function(e,t,n,r){var a=[],i=0,o=t.length;if(r!==$)for(;i<o;i++)e[t[i]][n]&&a.push(e[t[i]][n][r]);else for(;i<o;i++)a.push(e[t[i]][n]);return a},ut=function(e,t){var n,r=[];t===$?(t=0,n=e):(n=t,t=e);for(var a=t;a<n;a++)r.push(a);return r},ct=function(e){for(var t=[],n=0,r=e.length;n<r;n++)e[n]&&t.push(e[n]);return t},ft=function(e){return e.replace(Ze,"")},dt=function(e){if(e.length<2)return!0;for(var t=e.slice().sort(),n=t[0],r=1,a=t.length;r<a;r++){if(t[r]===n)return!1;n=t[r]}return!0},ht=function(e){if(dt(e))return e.slice();var t,n,r,a=[],i=e.length,o=0;e:for(n=0;n<i;n++){for(t=e[n],r=0;r<o;r++)if(a[r]===t)continue e;a.push(t),o++}return a};Ge.util={throttle:function(r,e){var a,i,o=e!==$?e:200;return function(){var e=this,t=+new Date,n=arguments;a&&t<a+o?(clearTimeout(i),i=setTimeout(function(){a=$,r.apply(e,n)},o)):(a=t,r.apply(e,n))}},escapeRegex:function(e){return e.replace(Qe,"\\$1")}};var pt=function(e,t,n){e[t]!==$&&(e[n]=e[t])},gt=/\[.*?\]$/,mt=/\(\)$/,vt=Ge.util.escapeRegex,yt=B("<div>")[0],bt=yt.textContent!==$,wt=/<.*?>/g,xt=Ge.util.throttle,St=[],Dt=Array.prototype,Tt=function(e){var t,n,r=Ge.settings,a=B.map(r,function(e){return e.nTable});return e?e.nTable&&e.oApi?[e]:e.nodeName&&"table"===e.nodeName.toLowerCase()?-1!==(t=B.inArray(e,a))?[r[t]]:null:e&&"function"==typeof e.settings?e.settings().toArray():("string"==typeof e?n=B(e):e instanceof B&&(n=e),n?n.map(function(){return-1!==(t=B.inArray(this,a))?r[t]:null}).toArray():void 0):[]};ze=function(e,t){if(!(this instanceof ze))return new ze(e,t);var n=[],r=function(e){var t=Tt(e);t&&n.push.apply(n,t)};if(B.isArray(e))for(var a=0,i=e.length;a<i;a++)r(e[a]);else r(e);this.context=ht(n),t&&B.merge(this,t),this.selector={rows:null,cols:null,opts:null},ze.extend(this,this,St)},Ge.Api=ze,B.extend(ze.prototype,{any:function(){return 0!==this.count()},concat:Dt.concat,context:[],count:function(){return this.flatten().length},each:function(e){for(var t=0,n=this.length;t<n;t++)e.call(this,this[t],t,this);return this},eq:function(e){var t=this.context;return t.length>e?new ze(t[e],this[e]):null},filter:function(e){var t=[];if(Dt.filter)t=Dt.filter.call(this,e,this);else for(var n=0,r=this.length;n<r;n++)e.call(this,this[n],n,this)&&t.push(this[n]);return new ze(this.context,t)},flatten:function(){var e=[];return new ze(this.context,e.concat.apply(e,this.toArray()))},join:Dt.join,indexOf:Dt.indexOf||function(e,t){for(var n=t||0,r=this.length;n<r;n++)if(this[n]===e)return n;return-1},iterator:function(e,t,n,r){var a,i,o,s,l,u,c,f,d=[],h=this.context,p=this.selector;for("string"==typeof e&&(r=n,n=t,t=e,e=!1),i=0,o=h.length;i<o;i++){var g=new ze(h[i]);if("table"===t)(a=n.call(g,h[i],i))!==$&&d.push(a);else if("columns"===t||"rows"===t)(a=n.call(g,h[i],this[i],i))!==$&&d.push(a);else if("column"===t||"column-rows"===t||"row"===t||"cell"===t)for(c=this[i],"column-rows"===t&&(u=It(h[i],p.opts)),s=0,l=c.length;s<l;s++)f=c[s],(a="cell"===t?n.call(g,h[i],f.row,f.column,i,s):n.call(g,h[i],f,i,s,u))!==$&&d.push(a)}if(d.length||r){var m=new ze(h,e?d.concat.apply([],d):d),v=m.selector;return v.rows=p.rows,v.cols=p.cols,v.opts=p.opts,m}return this},lastIndexOf:Dt.lastIndexOf||function(){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(e){var t=[];if(Dt.map)t=Dt.map.call(this,e,this);else for(var n=0,r=this.length;n<r;n++)t.push(e.call(this,this[n],n));return new ze(this.context,t)},pluck:function(t){return this.map(function(e){return e[t]})},pop:Dt.pop,push:Dt.push,reduce:Dt.reduce||function(e,t){return n(this,e,t,0,this.length,1)},reduceRight:Dt.reduceRight||function(e,t){return n(this,e,t,this.length-1,-1,-1)},reverse:Dt.reverse,selector:null,shift:Dt.shift,slice:function(){return new ze(this.context,this)},sort:Dt.sort,splice:Dt.splice,toArray:function(){return Dt.slice.call(this)},to$:function(){return B(this)},toJQuery:function(){return B(this)},unique:function(){return new ze(this.context,ht(this))},unshift:Dt.unshift}),ze.extend=function(e,t,n){if(n.length&&t&&(t instanceof ze||t.__dt_wrapper)){var r,a,i,o=function(t,n,r){return function(){var e=n.apply(t,arguments);return ze.extend(e,e,r.methodExt),e}};for(r=0,a=n.length;r<a;r++)t[(i=n[r]).name]="function"===i.type?o(e,i.val,i):"object"===i.type?{}:i.val,t[i.name].__dt_wrapper=!0,ze.extend(e,t[i.name],i.propExt)}},ze.register=Xe=function(e,t){if( +B.isArray(e))for(var n=0,r=e.length;n<r;n++)ze.register(e[n],t);else{var a,i,o,s,l=e.split("."),u=St,c=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n].name===t)return e[n];return null};for(a=0,i=l.length;a<i;a++){var f=c(u,o=(s=-1!==l[a].indexOf("()"))?l[a].replace("()",""):l[a]);f||(f={name:o,val:{},methodExt:[],propExt:[],type:"object"},u.push(f)),a===i-1?(f.val=t,f.type="function"==typeof t?"function":B.isPlainObject(t)?"object":"other"):u=s?f.methodExt:f.propExt}}},ze.registerPlural=Ve=function(e,t,n){ze.register(e,n),ze.register(t,function(){var e=n.apply(this,arguments);return e===this?this:e instanceof ze?e.length?B.isArray(e[0])?new ze(e.context,e[0]):e[0]:$:e})};var Ct=function(e,t){if("number"==typeof e)return[t[e]];var n=B.map(t,function(e){return e.nTable});return B(n).filter(e).map(function(){var e=B.inArray(this,n);return t[e]}).toArray()};Xe("tables()",function(e){return e?new ze(Ct(e,this.context)):this}),Xe("table()",function(e){var t=this.tables(e),n=t.context;return n.length?new ze(n[0]):t}),Ve("tables().nodes()","table().node()",function(){return this.iterator("table",function(e){return e.nTable},1)}),Ve("tables().body()","table().body()",function(){return this.iterator("table",function(e){return e.nTBody},1)}),Ve("tables().header()","table().header()",function(){return this.iterator("table",function(e){return e.nTHead},1)}),Ve("tables().footer()","table().footer()",function(){return this.iterator("table",function(e){return e.nTFoot},1)}),Ve("tables().containers()","table().container()",function(){return this.iterator("table",function(e){return e.nTableWrapper},1)}),Xe("draw()",function(t){return this.iterator("table",function(e){"page"===t?b(e):("string"==typeof t&&(t="full-hold"!==t),D(e,!1===t))})}),Xe("page()",function(t){return t===$?this.page.info().page:this.iterator("table",function(e){fe(e,t)})}),Xe("page.info()",function(){if(0===this.context.length)return $;var e=this.context[0],t=e._iDisplayStart,n=e.oFeatures.bPaginate?e._iDisplayLength:-1,r=e.fnRecordsDisplay(),a=-1===n;return{page:a?0:Math.floor(t/n),pages:a?1:Math.ceil(r/n),start:t,end:e.fnDisplayEnd(),length:n,recordsTotal:e.fnRecordsTotal(),recordsDisplay:r,serverSide:"ssp"===qe(e)}}),Xe("page.len()",function(t){return t===$?0!==this.context.length?this.context[0]._iDisplayLength:$:this.iterator("table",function(e){le(e,t)})});var _t=function(a,i,e){if(e){var t=new ze(a);t.one("draw",function(){e(t.ajax.json())})}if("ssp"==qe(a))D(a,i);else{he(a,!0);var n=a.jqXHR;n&&4!==n.readyState&&n.abort(),C(a,[],function(e){u(a);for(var t=V(a,e),n=0,r=t.length;n<r;n++)M(a,t[n]);D(a,i),he(a,!1)})}};Xe("ajax.json()",function(){var e=this.context;if(0<e.length)return e[0].json}),Xe("ajax.params()",function(){var e=this.context;if(0<e.length)return e[0].oAjaxData}),Xe("ajax.reload()",function(t,n){return this.iterator("table",function(e){_t(e,!1===n,t)})}),Xe("ajax.url()",function(t){var e=this.context;return t===$?0===e.length?$:(e=e[0]).ajax?B.isPlainObject(e.ajax)?e.ajax.url:e.ajax:e.sAjaxSource:this.iterator("table",function(e){B.isPlainObject(e.ajax)?e.ajax.url=t:e.ajax=t})}),Xe("ajax.url().load()",function(t,n){return this.iterator("table",function(e){_t(e,!1===n,t)})});var At=function(e,t,n,r,a){var i,o,s,l,u,c,f=[],d=typeof t;for(t&&"string"!==d&&"function"!==d&&t.length!==$||(t=[t]),s=0,l=t.length;s<l;s++)for(u=0,c=(o=t[s]&&t[s].split&&!t[s].match(/[\[\(:]/)?t[s].split(","):[t[s]]).length;u<c;u++)(i=n("string"==typeof o[u]?B.trim(o[u]):o[u]))&&i.length&&(f=f.concat(i));var h=Ue.selector[e];if(h.length)for(s=0,l=h.length;s<l;s++)f=h[s](r,a,f);return ht(f)},Nt=function(e){return e||(e={}),e.filter&&e.search===$&&(e.search=e.filter),B.extend({search:"none",order:"current",page:"all"},e)},kt=function(e){for(var t=0,n=e.length;t<n;t++)if(0<e[t].length)return e[0]=e[t],e[0].length=1,e.length=1,e.context=[e.context[t]],e;return e.length=0,e},It=function(e,t){var n,r=[],a=e.aiDisplay,i=e.aiDisplayMaster,o=t.search,s=t.order,l=t.page;if("ssp"==qe(e))return"removed"===o?[]:ut(0,i.length);if("current"==l)for(c=e._iDisplayStart,f=e.fnDisplayEnd();c<f;c++)r.push(a[c]);else if("current"==s||"applied"==s){if("none"==o)r=i.slice();else if("applied"==o)r=a.slice();else if("removed"==o){for(var u={},c=0,f=a.length;c<f;c++)u[a[c]]=null;r=B.map(i,function(e){return u.hasOwnProperty(e)?null:e})}}else if("index"==s||"original"==s)for(c=0,f=e.aoData.length;c<f;c++)"none"==o?r.push(c):(-1===(n=B.inArray(c,a))&&"removed"==o||0<=n&&"applied"==o)&&r.push(c);return r},jt=function(l,e,u){var c;return At("row",e,function(n){var e=nt(n),r=l.aoData;if(null!==e&&!u)return[e];if(c||(c=It(l,u)),null!==e&&-1!==B.inArray(e,c))return[e];if(null===n||n===$||""===n)return c;if("function"==typeof n)return B.map(c,function(e){var t=r[e];return n(e,t._aData,t.nTr)?e:null});if(n.nodeName){var t=n._DT_RowIndex,a=n._DT_CellIndex;if(t!==$)return r[t]&&r[t].nTr===n?[t]:[];if(a)return r[a.row]&&r[a.row].nTr===n.parentNode?[a.row]:[];var i=B(n).closest("*[data-dt-row]");return i.length?[i.data("dt-row")]:[]}if("string"==typeof n&&"#"===n.charAt(0)){var o=l.aIds[n.replace(/^#/,"")];if(o!==$)return[o.idx]}var s=ct(lt(l.aoData,c,"nTr"));return B(s).filter(n).map(function(){return this._DT_RowIndex}).toArray()},l,u)};Xe("rows()",function(t,n){t===$?t="":B.isPlainObject(t)&&(n=t,t=""),n=Nt(n);var e=this.iterator("table",function(e){return jt(e,t,n)},1);return e.selector.rows=t,e.selector.opts=n,e}),Xe("rows().nodes()",function(){return this.iterator("row",function(e,t){return e.aoData[t].nTr||$},1)}),Xe("rows().data()",function(){return this.iterator(!0,"rows",function(e,t){return lt(e.aoData,t,"_aData")},1)}),Ve("rows().cache()","row().cache()",function(r){return this.iterator("row",function(e,t){var n=e.aoData[t];return"search"===r?n._aFilterData:n._aSortData},1)}),Ve("rows().invalidate()","row().invalidate()",function(n){return this.iterator("row",function(e,t){a(e,t,n)})}),Ve("rows().indexes()","row().index()",function(){return this.iterator("row",function(e,t){return t},1)}),Ve("rows().ids()","row().id()",function(e){for(var t=[],n=this.context,r=0,a=n.length;r<a;r++)for(var i=0,o=this[r].length;i<o;i++){var s=n[r].rowIdFn(n[r].aoData[this[r][i]]._aData);t.push((!0===e?"#":"")+s)}return new ze(n,t)}),Ve("rows().remove()","row().remove()",function(){var d=this;return this.iterator("row",function(e,t,n){var r,a,i,o,s,l,u=e.aoData,c=u[t];for(u.splice(t,1),r=0,a=u.length;r<a;r++)if(l=(s=u[r]).anCells,null!==s.nTr&&(s.nTr._DT_RowIndex=r),null!==l)for(i=0,o=l.length;i<o;i++)l[i]._DT_CellIndex.row=r;h(e.aiDisplayMaster,t),h(e.aiDisplay,t),h(d[n],t,!1),0<e._iRecordsDisplay&&e._iRecordsDisplay--,Me(e);var f=e.rowIdFn(c._aData);f!==$&&delete e.aIds[f]}),this.iterator("table",function(e){for(var t=0,n=e.aoData.length;t<n;t++)e.aoData[t].idx=t}),this}),Xe("rows.add()",function(i){var e=this.iterator("table",function(e){var t,n,r,a=[];for(n=0,r=i.length;n<r;n++)(t=i[n]).nodeName&&"TR"===t.nodeName.toUpperCase()?a.push(O(e,t)[0]):a.push(M(e,t));return a},1),t=this.rows(-1);return t.pop(),B.merge(t,e),t}),Xe("row()",function(e,t){return kt(this.rows(e,t))}),Xe("row().data()",function(e){var t=this.context;if(e===$)return t.length&&this.length?t[0].aoData[this[0]]._aData:$;var n=t[0].aoData[this[0]];return n._aData=e,B.isArray(e)&&n.nTr.id&&y(t[0].rowId)(e,n.nTr.id),a(t[0],this[0],"data"),this}),Xe("row().node()",function(){var e=this.context;return e.length&&this.length&&e[0].aoData[this[0]].nTr||null}),Xe("row.add()",function(t){t instanceof B&&t.length&&(t=t[0]);var e=this.iterator("table",function(e){return t.nodeName&&"TR"===t.nodeName.toUpperCase()?O(e,t)[0]:M(e,t)});return this.row(e[0])});var Lt=function(i,e,t,n){var o=[],s=function(e,t){if(B.isArray(e)||e instanceof B)for(var n=0,r=e.length;n<r;n++)s(e[n],t);else if(e.nodeName&&"tr"===e.nodeName.toLowerCase())o.push(e);else{var a=B("<tr><td/></tr>").addClass(t);B("td",a).addClass(t).html(e)[0].colSpan=F(i),o.push(a[0])}};s(t,n),e._details&&e._details.detach(),e._details=B(o),e._detailsShow&&e._details.insertAfter(e.nTr)},Et=function(e,t){var n=e.context;if(n.length){var r=n[0].aoData[t!==$?t:e[0]];r&&r._details&&(r._details.remove(),r._detailsShow=$,r._details=$)}},Rt=function(e,t){var n=e.context;if(n.length&&e.length){var r=n[0].aoData[e[0]];r._details&&((r._detailsShow=t)?r._details.insertAfter(r.nTr):r._details.detach(),Ft(n[0]))}},Ft=function(o){var a=new ze(o),e=".dt.DT_details",t="draw"+e,n="column-visibility"+e,r="destroy"+e,s=o.aoData;a.off(t+" "+n+" "+r),0<st(s,"_details").length&&(a.on(t,function(e,t){o===t&&a.rows({page:"current"}).eq(0).each(function(e){var t=s[e];t._detailsShow&&t._details.insertAfter(t.nTr)})}),a.on(n,function(e,t){if(o===t)for(var n,r=F(t),a=0,i=s.length;a<i;a++)(n=s[a])._details&&n._details.children("td[colspan]").attr("colspan",r)}),a.on(r,function(e,t){if(o===t)for(var n=0,r=s.length;n<r;n++)s[n]._details&&Et(a,n)}))},Pt=""+"row().child",Ht=Pt+"()";Xe(Ht,function(e,t){var n=this.context;return e===$?n.length&&this.length?n[0].aoData[this[0]]._details:$:(!0===e?this.child.show():!1===e?Et(this):n.length&&this.length&&Lt(n[0],n[0].aoData[this[0]],e,t),this)}),Xe([Pt+".show()",Ht+".show()"],function(){return Rt(this,!0),this}),Xe([Pt+".hide()",Ht+".hide()"],function(){return Rt(this,!1),this}),Xe([Pt+".remove()",Ht+".remove()"],function(){return Et(this),this}),Xe(Pt+".isShown()",function(){var e=this.context;return e.length&&this.length&&e[0].aoData[this[0]]._detailsShow||!1});var Mt=/^([^:]+):(name|visIdx|visible)$/,Ot=function(e,t,n,r,a){for(var i=[],o=0,s=a.length;o<s;o++)i.push(g(e,a[o],t));return i},qt=function(l,e,u){var c=l.aoColumns,f=st(c,"sName"),d=st(c,"nTh");return At("column",e,function(n){var e=nt(n);if(""===n)return ut(c.length);if(null!==e)return[0<=e?e:c.length+e];if("function"==typeof n){var r=It(l,u);return B.map(c,function(e,t){return n(t,Ot(l,t,0,0,r),d[t])?t:null})}var a="string"==typeof n?n.match(Mt):"";if(a)switch(a[2]){case"visIdx":case"visible":var t=parseInt(a[1],10);if(t<0){var i=B.map(c,function(e,t){return e.bVisible?t:null});return[i[i.length+t]]}return[z(l,t)];case"name":return B.map(f,function(e,t){return e===a[1]?t:null});default:return[]}if(n.nodeName&&n._DT_CellIndex)return[n._DT_CellIndex.column];var o=B(d).filter(n).map(function(){return B.inArray(this,d)}).toArray();if(o.length||!n.nodeName)return o;var s=B(n).closest("*[data-dt-column]");return s.length?[s.data("dt-column")]:[]},l,u)},Wt=function(e,t,n){var r,a,i,o,s=e.aoColumns,l=s[t],u=e.aoData;if(n===$)return l.bVisible;if(l.bVisible!==n){if(n){var c=B.inArray(!0,st(s,"bVisible"),t+1);for(a=0,i=u.length;a<i;a++)o=u[a].nTr,r=u[a].anCells,o&&o.insertBefore(r[t],r[c]||null)}else B(st(e.aoData,"anCells",t)).detach();l.bVisible=n}};Xe("columns()",function(t,n){t===$?t="":B.isPlainObject(t)&&(n=t,t=""),n=Nt(n);var e=this.iterator("table",function(e){return qt(e,t,n)},1);return e.selector.cols=t,e.selector.opts=n,e}),Ve("columns().header()","column().header()",function(){return this.iterator("column",function(e,t){return e.aoColumns[t].nTh},1)}),Ve("columns().footer()","column().footer()",function(){return this.iterator("column",function(e,t){return e.aoColumns[t].nTf},1)}),Ve("columns().data()","column().data()",function(){return this.iterator("column-rows",Ot,1)}),Ve("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(e,t){return e.aoColumns[t].mData},1)}),Ve("columns().cache()","column().cache()",function(i){return this.iterator("column-rows",function(e,t,n,r,a){return lt(e.aoData,a,"search"===i?"_aFilterData":"_aSortData",t)},1)}),Ve("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(e,t,n,r,a){return lt(e.aoData,a,"anCells",t)},1)}),Ve("columns().visible()","column().visible()",function(n,r){var t=this,e=this.iterator("column",function(e,t){if(n===$)return e.aoColumns[t].bVisible;Wt(e,t,n)});return n!==$&&this.iterator("table",function(e){v(e,e.aoHeader),v(e,e.aoFooter),e.aiDisplay.length||B(e.nTBody).find("td[colspan]").attr("colspan",F(e)),ke(e),t.iterator("column",function(e,t){He(e,null,"column-visibility",[e,t,n,r])}),(r===$||r)&&t.columns.adjust()}),e}),Ve("columns().indexes()","column().index()",function(n){return this.iterator("column",function(e,t){return"visible"===n?c(e,t):t},1)}),Xe("columns.adjust()",function(){return this.iterator("table",function(e){U(e)},1)}),Xe("column.index()",function(e,t){if(0!==this.context.length){var n=this.context[0];if("fromVisible"===e||"toData"===e)return z(n,t);if("fromData"===e||"toVisible"===e)return c(n,t)}}),Xe("column()",function(e,t){return kt(this.columns(e,t))});var Bt=function(r,e,t){var a,i,o,s,l,u,c,f=r.aoData,d=It(r,t),n=ct(lt(f,d,"anCells")),h=B([].concat.apply([],n)),p=r.aoColumns.length;return At("cell",e,function(e){var t="function"==typeof e;if(null===e||e===$||t){for(i=[],o=0,s=d.length;o<s;o++)for(a=d[o],l=0;l<p;l++)u={row:a,column:l},t?(c=f[a],e(u,g(r,a,l),c.anCells?c.anCells[l]:null)&&i.push(u)):i.push(u);return i}if(B.isPlainObject(e))return e.column!==$&&e.row!==$&&-1!==B.inArray(e.row,d)?[e]:[];var n=h.filter(e).map(function(e,t){return{row:t._DT_CellIndex.row,column:t._DT_CellIndex.column}}).toArray();return n.length||!e.nodeName?n:(c=B(e).closest("*[data-dt-row]")).length?[{row:c.data("dt-row"),column:c.data("dt-column")}]:[]},r,t)};Xe("cells()",function(t,e,n){if(B.isPlainObject(t)&&(t.row===$?(n=t,t=null):(n=e,e=null)),B.isPlainObject(e)&&(n=e,e=null),null===e||e===$)return this.iterator("table",function(e){return Bt(e,t,Nt(n))});var r,a,i,o,s=n?{page:n.page,order:n.order,search:n.search}:{},l=this.columns(e,s),u=this.rows(t,s),c=this.iterator("table",function(e,t){var n=[];for(r=0,a=u[t].length;r<a;r++)for(i=0,o=l[t].length;i<o;i++)n.push({row:u[t][r],column:l[t][i]});return n},1),f=n&&n.selected?this.cells(c,n):c;return B.extend(f.selector,{cols:e,rows:t,opts:n}),f}),Ve("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(e,t,n){var r=e.aoData[t];return r&&r.anCells?r.anCells[n]:$},1)}),Xe("cells().data()",function(){return this.iterator("cell",function(e,t,n){return g(e,t,n)},1)}),Ve("cells().cache()","cell().cache()",function(r){return r="search"===r?"_aFilterData":"_aSortData",this.iterator("cell",function(e,t,n){return e.aoData[t][r][n]},1)}),Ve("cells().render()","cell().render()",function(r){return this.iterator("cell",function(e,t,n){return g(e,t,n,r)},1)}),Ve("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(e,t,n){return{row:t,column:n,columnVisible:c(e,n)}},1)}),Ve("cells().invalidate()","cell().invalidate()",function(r){return this.iterator("cell",function(e,t,n){a(e,t,r,n)})}),Xe("cell()",function(e,t,n){return kt(this.cells(e,t,n))}),Xe("cell().data()",function(e){var t=this.context,n=this[0];return e===$?t.length&&n.length?g(t[0],n[0].row,n[0].column):$:(r(t[0],n[0].row,n[0].column,e),a(t[0],n[0].row,"data",n[0].column),this)}),Xe("order()",function(t,e){var n=this.context;return t===$?0!==n.length?n[0].aaSorting:$:("number"==typeof t?t=[[t,e]]:t.length&&!B.isArray(t[0])&&(t=Array.prototype.slice.call(arguments)),this.iterator("table",function(e){e.aaSorting=t.slice()}))}),Xe("order.listener()",function(t,n,r){return this.iterator("table",function(e){_e(e,t,n,r)})}),Xe("order.fixed()",function(t){if(t)return this.iterator("table",function(e){e.aaSortingFixed=B.extend(!0,{},t)});var e=this.context,n=e.length?e[0].aaSortingFixed:$;return B.isArray(n)?{pre:n}:n}),Xe(["columns().order()","column().order()"],function(r){var a=this;return this.iterator("table",function(e,t){var n=[];B.each(a[t],function(e,t){n.push([t,r])}),e.aaSorting=n})}),Xe("search()",function(t,n,r,a){var e=this.context;return t===$?0!==e.length?e[0].oPreviousSearch.sSearch:$:this.iterator("table",function(e){e.oFeatures.bFilter&&J(e,B.extend({},e.oPreviousSearch,{sSearch:t+"",bRegex:null!==n&&n,bSmart:null===r||r,bCaseInsensitive:null===a||a}),1)})}),Ve("columns().search()","column().search()",function(r,a,i,o){return this.iterator("column",function(e,t){var n=e.aoPreSearchCols;if(r===$)return n[t].sSearch;e.oFeatures.bFilter&&(B.extend(n[t],{sSearch:r+"",bRegex:null!==a&&a,bSmart:null===i||i,bCaseInsensitive:null===o||o}),J(e,e.oPreviousSearch,1))})}),Xe("state()",function(){return this.context.length?this.context[0].oSavedState:null}),Xe("state.clear()",function(){return this.iterator("table",function(e){e.fnStateSaveCallback.call(e.oInstance,e,{})})}),Xe("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null}),Xe("state.save()",function(){return this.iterator("table",function(e){ke(e)})}),Ge.versionCheck=Ge.fnVersionCheck=function(e){for(var t,n,r=Ge.version.split("."),a=e.split("."),i=0,o=a.length;i<o;i++)if((t=parseInt(r[i],10)||0)!==(n=parseInt(a[i],10)||0))return n<t;return!0},Ge.isDataTable=Ge.fnIsDataTable=function(e){var a=B(e).get(0),i=!1;return e instanceof Ge.Api||(B.each(Ge.settings,function(e,t){var n=t.nScrollHead?B("table",t.nScrollHead)[0]:null,r=t.nScrollFoot?B("table",t.nScrollFoot)[0]:null;t.nTable!==a&&n!==a&&r!==a||(i=!0)}),i)},Ge.tables=Ge.fnTables=function(t){var e=!1;B.isPlainObject(t)&&(e=t.api,t=t.visible);var n=B.map(Ge.settings,function(e){if(!t||t&&B(e.nTable).is(":visible"))return e.nTable});return e?new ze(n):n},Ge.camelToHungarian=A,Xe("$()",function(e,t){var n=this.rows(t).nodes(),r=B(n);return B([].concat(r.filter(e).toArray(),r.find(e).toArray()))}),B.each(["on","one","off"],function(e,n){Xe(n+"()",function(){var e=Array.prototype.slice.call(arguments);e[0]=B.map(e[0].split(/\s/),function(e){return e.match(/\.dt\b/)?e:e+".dt"}).join(" ");var t=B(this.tables().nodes());return t[n].apply(t,e),this})}),Xe("clear()",function(){return this.iterator("table",function(e){u(e)})}),Xe("settings()",function(){return new ze(this.context,this.context)}),Xe("init()",function(){var e=this.context;return e.length?e[0].oInit:null}),Xe("data()",function(){return this.iterator("table",function(e){return st(e.aoData,"_aData")}).flatten()}),Xe("destroy()",function(p){return p=p||!1,this.iterator("table",function(t){var n,e=t.nTableWrapper.parentNode,r=t.oClasses,a=t.nTable,i=t.nTBody,o=t.nTHead,s=t.nTFoot,l=B(a),u=B(i),c=B(t.nTableWrapper),f=B.map(t.aoData,function(e){return e.nTr});t.bDestroying=!0,He(t,"aoDestroyCallback","destroy",[t]),p||new ze(t).columns().visible(!0),c.off(".DT").find(":not(tbody *)").off(".DT"),B(N).off(".DT-"+t.sInstance),a!=o.parentNode&&(l.children("thead").detach(),l.append(o)),s&&a!=s.parentNode&&(l.children("tfoot").detach(),l.append(s)),t.aaSorting=[],t.aaSortingFixed=[],Ae(t),B(f).removeClass(t.asStripeClasses.join(" ")),B("th, td",o).removeClass(r.sSortable+" "+r.sSortableAsc+" "+r.sSortableDesc+" "+r.sSortableNone),u.children().detach(),u.append(f);var d=p?"remove":"detach";l[d](),c[d](),!p&&e&&(e.insertBefore(a,t.nTableReinsertBefore),l.css("width",t.sDestroyWidth).removeClass(r.sTable),(n=t.asDestroyStripes.length)&&u.children().each(function(e){B(this).addClass(t.asDestroyStripes[e%n])}));var h=B.inArray(t,Ge.settings);-1!==h&&Ge.settings.splice(h,1)})}),B.each(["column","row","cell"],function(e,l){Xe(l+"s().every()",function(i){var o=this.selector.opts,s=this;return this.iterator(l,function(e,t,n,r,a){i.call(s[l](t,"cell"===l?n:o,"cell"===l?o:$),t,n,r,a)})})}),Xe("i18n()",function(e,t,n){var r=this.context[0],a=q(e)(r.oLanguage);return a===$&&(a=t),n!==$&&B.isPlainObject(a)&&(a=a[n]!==$?a[n]:a._),a.replace("%d",n)}),Ge.version="1.10.20",Ge.settings=[],Ge.models={},Ge.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0},Ge.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1},Ge.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null},Ge.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(e){return e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(e){try{return JSON.parse((-1===e.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+e.sInstance+"_"+location.pathname))}catch(t){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(e,t){try{(-1===e.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+e.sInstance+"_"+location.pathname,JSON.stringify(t))}catch(n){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:B.extend({},Ge.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"},o(Ge.defaults),Ge.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null},o(Ge.defaults.column),Ge.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:$,oAjaxData:$,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==qe(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==qe(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var e=this._iDisplayLength,t=this._iDisplayStart,n=t+e,r=this.aiDisplay.length,a=this.oFeatures,i=a.bPaginate;return a.bServerSide?!1===i||-1===e?t+r:Math.min(t+e,this._iRecordsDisplay):!i||r<n||-1===e?r:n},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null},Ge.ext=Ue={buttons:{},classes:{},build:"dt/dt-1.10.20",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:Ge.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:Ge.version},B.extend(Ue,{afnFiltering:Ue.search,aTypes:Ue.type.detect,ofnSearch:Ue.type.search,oSort:Ue.type.order,afnSortData:Ue.order,aoFeatures:Ue.feature,oApi:Ue.internal,oStdClasses:Ue.classes,oPagination:Ue.pager}),B.extend(Ge.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var $t=Ge.ext.pager;B.extend($t,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(e,t){return[We(e,t)]},simple_numbers:function(e,t){return["previous",We(e,t),"next"]},full_numbers:function(e,t){return["first","previous",We(e,t),"next","last"]},first_last_numbers:function(e,t){return["first",We(e,t),"last"]},_numbers:We,numbers_length:7}),B.extend(!0,Ge.ext.renderer,{pageButton:{_:function(u,e,c,t,f,d){var h,p,n,g=u.oClasses,m=u.oLanguage.oPaginate,v=u.oLanguage.oAria.paginate||{},y=0,b=function(e,t){var n,r,a,i,o=g.sPageButtonDisabled,s=function(e){fe(u,e.data.action,!0)};for(n=0,r=t.length;n<r;n++)if(a=t[n],B.isArray(a)){var l=B("<"+(a.DT_el||"div")+"/>").appendTo(e);b(l,a)}else{switch(h=null,p=a,i=u.iTabIndex,a){case"ellipsis":e.append('<span class="ellipsis">&#x2026;</span>');break;case"first":h=m.sFirst,0===f&&(i=-1,p+=" "+o);break;case"previous":h=m.sPrevious,0===f&&(i=-1,p+=" "+o);break;case"next":h=m.sNext,f===d-1&&(i=-1,p+=" "+o);break;case"last":h=m.sLast,f===d-1&&(i=-1,p+=" "+o);break;default:h=a+1,p=f===a?g.sPageButtonActive:""}null!==h&&(Fe(B("<a>",{"class":g.sPageButton+" "+p,"aria-controls":u.sTableId,"aria-label":v[a],"data-dt-idx":y,tabindex:i,id:0===c&&"string"==typeof a?u.sTableId+"_"+a:null}).html(h).appendTo(e),{action:a},s),y++)}};try{n=B(e).find(w.activeElement).data("dt-idx")}catch(r){}b(B(e).empty(),t),n!==$&&B(e).find("[data-dt-idx="+n+"]").focus()}}}),B.extend(Ge.ext.type.detect,[function(e,t){var n=t.oLanguage.sDecimal;return at(e,n)?"num"+n:null},function(e){if(e&&!(e instanceof Date)&&!Ke.test(e))return null;var t=Date.parse(e);return null!==t&&!isNaN(t)||tt(e)?"date":null},function(e,t){var n=t.oLanguage.sDecimal;return at(e,n,!0)?"num-fmt"+n:null},function(e,t){var n=t.oLanguage.sDecimal;return ot(e,n)?"html-num"+n:null},function(e,t){var n=t.oLanguage.sDecimal;return ot(e,n,!0)?"html-num-fmt"+n:null},function(e){return tt(e)||"string"==typeof e&&-1!==e.indexOf("<")?"html":null}]),B.extend(Ge.ext.type.search,{html:function(e){return tt(e)?e:"string"==typeof e?e.replace(Ye," ").replace(Ze,""):""},string:function(e){return tt(e)?e:"string"==typeof e?e.replace(Ye," "):e}});var Ut=function(e,t,n,r){return 0===e||e&&"-"!==e?(t&&(e=rt(e,t)),e.replace&&(n&&(e=e.replace(n,"")),r&&(e=e.replace(r,""))),1*e):-Infinity};B.extend(Ue.type.order,{"date-pre":function(e){var t=Date.parse(e);return isNaN(t)?-Infinity:t},"html-pre":function(e){return tt(e)?"":e.replace?e.replace(/<.*?>/g,"").toLowerCase():e+""},"string-pre":function(e){return tt(e)?"":"string"==typeof e?e.toLowerCase():e.toString?e.toString():""},"string-asc":function(e,t){return e<t?-1:t<e?1:0},"string-desc":function(e,t){return e<t?1:t<e?-1:0}}),Be(""),B.extend(!0,Ge.ext.renderer,{header:{_:function(i,o,s,l){B(i.nTable).on("order.dt.DT",function(e,t,n,r){if(i===t){var a=s.idx;o.removeClass(s.sSortingClass+" "+l.sSortAsc+" "+l.sSortDesc).addClass("asc"==r[a]?l.sSortAsc:"desc"==r[a]?l.sSortDesc:s.sSortingClass)}})},jqueryui:function(i,o,s,l){B("<div/>").addClass(l.sSortJUIWrapper).append(o.contents()).append(B("<span/>").addClass(l.sSortIcon+" "+s.sSortingClassJUI)).appendTo(o),B(i.nTable).on("order.dt.DT",function(e,t,n,r){if(i===t){var a=s.idx;o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==r[a]?l.sSortAsc:"desc"==r[a]?l.sSortDesc:s.sSortingClass),o.find("span."+l.sSortIcon).removeClass(l.sSortJUIAsc+" "+l.sSortJUIDesc+" "+l.sSortJUI+" "+l.sSortJUIAscAllowed+" "+l.sSortJUIDescAllowed).addClass("asc"==r[a]?l.sSortJUIAsc:"desc"==r[a]?l.sSortJUIDesc:s.sSortingClassJUI)}})}}});var zt=function(e){return"string"==typeof e?e.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):e};return Ge.render={number:function(i,o,s,l,u){return{display:function(e){if("number"!=typeof e&&"string"!=typeof e)return e;var t=e<0?"-":"",n=parseFloat(e);if(isNaN(n))return zt(e);n=n.toFixed(s),e=Math.abs(n);var r=parseInt(e,10),a=s?o+(e-r).toFixed(s).substring(2):"";return t+(l||"")+r.toString().replace(/\B(?=(\d{3})+(?!\d))/g,i)+a+(u||"")}}},text:function(){return{display:zt,filter:zt}}},B.extend(Ge.ext.internal,{_fnExternApiFunc:$e,_fnBuildAjax:C,_fnAjaxUpdate:_,_fnAjaxParameters:i,_fnAjaxUpdateDraw:s,_fnAjaxDataSrc:V,_fnAddColumn:E,_fnColumnOptions:R,_fnAdjustColumnSizing:U,_fnVisibleToColumnIndex:z,_fnColumnIndexToVisible:c,_fnVisbleColumns:F,_fnGetColumns:P,_fnColumnTypes:l,_fnApplyColumnDefs:H,_fnHungarianMap:o,_fnCamelToHungarian:A,_fnLanguageCompat:k,_fnBrowserDetect:L,_fnAddData:M,_fnAddTr:O,_fnNodeToDataIndex:e,_fnNodeToColumnIndex:t,_fnGetCellData:g,_fnSetCellData:r,_fnSplitObjNotation:m,_fnGetObjectDataFn:q,_fnSetObjectDataFn:y,_fnGetDataMaster:x,_fnClearTable:u,_fnDeleteIndex:h,_fnInvalidate:a,_fnGetRowElements:f,_fnCreateTr:S,_fnBuildHead:d,_fnDrawHead:v,_fnDraw:b,_fnReDraw:D,_fnAddOptionsHtml:T,_fnDetectHeader:W,_fnGetUniqueThs:X,_fnFeatureHtmlFilter:G,_fnFilterComplete:J,_fnFilterCustom:Y,_fnFilterColumn:Z,_fnFilter:K,_fnFilterCreateSearch:Q,_fnEscapeRegex:vt,_fnFilterData:ee,_fnFeatureHtmlInfo:re,_fnUpdateInfo:ae,_fnInfoMacros:ie,_fnInitialise:oe,_fnInitComplete:se,_fnLengthChange:le,_fnFeatureHtmlLength:ue,_fnFeatureHtmlPaginate:ce,_fnPageChange:fe,_fnFeatureHtmlProcessing:de,_fnProcessingDisplay:he,_fnFeatureHtmlTable:pe,_fnScrollDraw:ge,_fnApplyToChildren:me,_fnCalculateColumnWidths:ve,_fnThrottle:xt,_fnConvertToWidth:ye,_fnGetWidestNode:be,_fnGetMaxLenString:we,_fnStringToCss:xe,_fnSortFlatten:Se,_fnSort:De,_fnSortAria:Te,_fnSortListener:Ce,_fnSortAttachListener:_e,_fnSortingClasses:Ae,_fnSortData:Ne,_fnSaveState:ke,_fnLoadState:Ie,_fnSettingsFromNode:je,_fnLog:Le,_fnMap:Ee,_fnBindAction:Fe,_fnCallbackReg:Pe,_fnCallbackFire:He,_fnLengthOverflow:Me,_fnRenderer:Oe,_fnDataSource:qe,_fnRowAttributes:p,_fnExtend:Re,_fnCalculateEnd:function(){}}),((B.fn.dataTable=Ge).$=B).fn.dataTableSettings=Ge.settings,B.fn.dataTableExt=Ge.ext,B.fn.DataTable=function(e){return B(this).dataTable(e).api()},B.each(Ge,function(e,t){B.fn.DataTable[e]=t}),B.fn.dataTable}),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&"object"==typeof module.exports?e(require("jquery")):e(jQuery)}(function(d){function n(){var e=o.settings;if(e.autoDispose&&!d.contains(document.documentElement,this))return d(this).timeago("dispose"),this;var t=r(this);return isNaN(t.datetime)||(0===e.cutoff||Math.abs(i(t.datetime))<e.cutoff?d(this).text(a(t.datetime)):0<d(this).attr("title").length&&d(this).text(d(this).attr("title"))),this}function r(e){if(!(e=d(e)).data("timeago")){e.data("timeago",{datetime:o.datetime(e)});var t=d.trim(e.text()) +;o.settings.localeTitle?e.attr("title",e.data("timeago").datetime.toLocaleString()):!(0<t.length)||o.isTime(e)&&e.attr("title")||e.attr("title",t)}return e.data("timeago")}function a(e){return o.inWords(i(e))}function i(e){return(new Date).getTime()-e.getTime()}d.timeago=function(e){return e instanceof Date?a(e):a("string"==typeof e?d.timeago.parse(e):"number"==typeof e?new Date(e):d.timeago.datetime(e))};var o=d.timeago;d.extend(d.timeago,{settings:{refreshMillis:6e4,allowPast:!0,allowFuture:!1,localeTitle:!1,cutoff:0,autoDispose:!0,strings:{prefixAgo:null,prefixFromNow:null,suffixAgo:"ago",suffixFromNow:"from now",inPast:"any moment now",seconds:"less than a minute",minute:"about a minute",minutes:"%d minutes",hour:"about an hour",hours:"about %d hours",day:"a day",days:"%d days",month:"about a month",months:"%d months",year:"about a year",years:"%d years",wordSeparator:" ",numbers:[]}},inWords:function(a){function e(e,t){var n=d.isFunction(e)?e(t,a):e,r=i.numbers&&i.numbers[t]||t;return n.replace(/%d/i,r)}if(!this.settings.allowPast&&!this.settings.allowFuture)throw"timeago allowPast and allowFuture settings can not both be set to false.";var i=this.settings.strings,t=i.prefixAgo,n=i.suffixAgo;if(this.settings.allowFuture&&a<0&&(t=i.prefixFromNow,n=i.suffixFromNow),!this.settings.allowPast&&0<=a)return this.settings.strings.inPast;var r=Math.abs(a)/1e3,o=r/60,s=o/60,l=s/24,u=l/365,c=r<45&&e(i.seconds,Math.round(r))||r<90&&e(i.minute,1)||o<45&&e(i.minutes,Math.round(o))||o<90&&e(i.hour,1)||s<24&&e(i.hours,Math.round(s))||s<42&&e(i.day,1)||l<30&&e(i.days,Math.round(l))||l<45&&e(i.month,1)||l<365&&e(i.months,Math.round(l/30))||u<1.5&&e(i.year,1)||e(i.years,Math.round(u)),f=i.wordSeparator||"";return i.wordSeparator===undefined&&(f=" "),d.trim([t,c,n].join(f))},parse:function(e){var t=d.trim(e);return t=(t=(t=(t=(t=t.replace(/\.\d+/,"")).replace(/-/,"/").replace(/-/,"/")).replace(/T/," ").replace(/Z/," UTC")).replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2")).replace(/([\+\-]\d\d)$/," $100"),new Date(t)},datetime:function(e){var t=o.isTime(e)?d(e).attr("datetime"):d(e).attr("title");return o.parse(t)},isTime:function(e){return"time"===d(e).get(0).tagName.toLowerCase()}});var s={init:function(){s.dispose.call(this);var e=d.proxy(n,this);e();var t=o.settings;0<t.refreshMillis&&(this._timeagoInterval=setInterval(e,t.refreshMillis))},update:function(e){var t=e instanceof Date?e:o.parse(e);d(this).data("timeago",{datetime:t}),o.settings.localeTitle&&d(this).attr("title",t.toLocaleString()),n.apply(this)},updateFromDOM:function(){d(this).data("timeago",{datetime:o.parse(o.isTime(this)?d(this).attr("datetime"):d(this).attr("title"))}),n.apply(this)},dispose:function(){this._timeagoInterval&&(window.clearInterval(this._timeagoInterval),this._timeagoInterval=null)}};d.fn.timeago=function(e,t){var n=e?s[e]:s.init;if(!n)throw new Error("Unknown function name '"+e+"' for timeago");return this.each(function(){n.call(this,t)}),this},document.createElement("abbr"),document.createElement("time")}),$(document).ready(function(){var t,n;$(".file_list").dataTable({order:[[1,"asc"]],paging:!1}),$("a.src_link").click(function(){var e=$($(this).attr("href"));e.hasClass("highlighted")||(e.find("pre code").each(function(e,t){hljs.highlightBlock(t," ")}),e.addClass("highlighted"))}),$("a.src_link").colorbox({transition:"none",inline:!0,opacity:1,width:"95%",height:"95%",onLoad:function(){t=n||window.location.hash.substring(1),n=this.href.split("#")[1],window.location.hash=n,$(".file_list_container").hide()},onCleanup:function(){t&&t!=n?($('a[href="#'+t+'"]').click(),n=t):($(".group_tabs a:first").click(),t=n,n="#_AllFiles"),window.location.hash=n;var e=$(".group_tabs li.active a").attr("class");$("#"+e+".file_list_container").show()}}),window.onpopstate=function(){"#_"==window.location.hash.substring(0,2)?($.colorbox.close(),n=window.location.hash.substring(1)):$("#colorbox").is(":hidden")&&$('a.src_link[href="'+window.location.hash+'"]').colorbox({open:!0})},$(".source_files").hide(),$(".file_list_container").hide(),$(".file_list_container h2").each(function(){var e=$(this).parent().attr("id"),t=$(this).find(".group_name").first().html(),n=$(this).find(".covered_percent").first().html();$(".group_tabs").append('<li><a href="#'+e+'">'+t+" ("+n+")</a></li>")}),$(".group_tabs a").each(function(){$(this).addClass($(this).attr("href").replace("#",""))}),$(".group_tabs").on("focus","a",function(){$(this).blur()});var e=$('link[rel="shortcut icon"]').attr("href");if($(".group_tabs").on("click","a",function(){return $(this).parent().hasClass("active")||($(".group_tabs a").parent().removeClass("active"),$(this).parent().addClass("active"),$(".file_list_container").hide(),$(".file_list_container"+$(this).attr("href")).show(),window.location.href=window.location.href.split("#")[0]+$(this).attr("href").replace("#","#_"),$('link[rel="shortcut icon"]').remove(),$("head").append('<link rel="shortcut icon" type="image/png" href="'+e+'" />')),!1}),window.location.hash){var r=window.location.hash.substring(1);40==r.length?$('a.src_link[href="#'+r+'"]').click():$(".group_tabs a."+r.replace("_","")).click()}else $(".group_tabs a:first").click();$("abbr.timeago").timeago(),$("#loading").fadeOut(),$("#wrapper").show(),$(".dataTables_filter input").focus()}); \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/border.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/border.png new file mode 100644 index 000000000000..df13bb6daf79 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/border.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/controls.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/controls.png new file mode 100644 index 000000000000..65cfd1dc95c5 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/controls.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/loading.gif b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/loading.gif new file mode 100644 index 000000000000..b4695d811d4f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/loading.gif differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/loading_background.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/loading_background.png new file mode 100644 index 000000000000..9de11f46719e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/colorbox/loading_background.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/favicon_green.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/favicon_green.png new file mode 100644 index 000000000000..74db330cd052 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/favicon_green.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/favicon_red.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/favicon_red.png new file mode 100644 index 000000000000..fbe093a55111 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/favicon_red.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/favicon_yellow.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/favicon_yellow.png new file mode 100644 index 000000000000..e53847ea09ae Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/favicon_yellow.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 000000000000..5b5dab2ab7b1 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 000000000000..ac8b229af950 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 000000000000..ad3d6346e00f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 000000000000..42ccba269b6e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 000000000000..5a46b47cb166 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 000000000000..86c2baa655ea Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 000000000000..4443fdc1a156 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 000000000000..7c9fa6c6edcf Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_222222_256x240.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_222222_256x240.png new file mode 100644 index 000000000000..b273ff111d21 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_222222_256x240.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 000000000000..09d1cdc856c2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png new file mode 100644 index 000000000000..59bd45b907c4 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_888888_256x240.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_888888_256x240.png new file mode 100644 index 000000000000..6d02426c114b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_888888_256x240.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 000000000000..2ab019b73ec1 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/loading.gif b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/loading.gif new file mode 100644 index 000000000000..3596a61f3af9 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/loading.gif differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/magnify.png b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/magnify.png new file mode 100644 index 000000000000..6073b9530ed1 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/assets/0.12.3/magnify.png differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/index.html b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/index.html new file mode 100644 index 000000000000..fb8b4b34ddc9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/coverage/index.html @@ -0,0 +1,3841 @@ +<!DOCTYPE html> +<html xmlns='http://www.w3.org/1999/xhtml'> + <head> + <title>Code coverage for Ruby-enum</title> + <meta http-equiv="content-type" content="text/html; charset=utf-8" /> + <script src='./assets/0.12.3/application.js' type='text/javascript'></script> + <link href='./assets/0.12.3/application.css' media='screen, projection, print' rel='stylesheet' type='text/css' /> + <link rel="shortcut icon" type="image/png" href="./assets/0.12.3/favicon_green.png" /> + <link rel="icon" type="image/png" href="./assets/0.12.3/favicon.png" /> + </head> + + <body> + <div id="loading"> + <img src="./assets/0.12.3/loading.gif" alt="loading"/> + </div> + <div id="wrapper" class="hide"> + <div class="timestamp">Generated <abbr class="timeago" title="2021-01-31T14:34:10-05:00">2021-01-31T14:34:10-05:00</abbr></div> + <ul class="group_tabs"></ul> + + <div id="content"> + <div class="file_list_container" id="AllFiles"> + <h2> + <span class="group_name">All Files</span> + (<span class="covered_percent"> + <span class="green"> + 100.0% +</span> + + </span> + covered at + <span class="covered_strength"> + <span class="green"> + 3.01 + </span> + </span> hits/line + ) + </h2> + + <a name="AllFiles"></a> + + <div> + <b>7</b> files in total. + </div> + + <div class="t-line-summary"> + <b>119</b> relevant lines, + <span class="green"><b>119</b> lines covered</span> and + <span class="red"><b>0</b> lines missed. </span> + (<span class="green"> + 100.0% +</span> +) + </div> + + + + <div class="file_list--responsive"> + <table class="file_list"> + <thead> + <tr> + <th>File</th> + <th class="cell--number">% covered</th> + <th class="cell--number">Lines</th> + <th class="cell--number">Relevant Lines</th> + <th class="cell--number">Lines covered</th> + <th class="cell--number">Lines missed</th> + <th class="cell--number">Avg. Hits / Line</th> + + </tr> + </thead> + <tbody> + + <tr class="t-file"> + <td class="strong t-file__name"><a href="#ee900552ffcf61e4cbcb7de088bb27ce8e102d72" class="src_link" title="lib/ruby-enum.rb">lib/ruby-enum.rb</a></td> + <td class="green strong cell--number t-file__coverage">100.00 %</td> + <td class="cell--number">13</td> + <td class="cell--number">8</td> + <td class="cell--number">8</td> + <td class="cell--number">0</td> + <td class="cell--number">1.00</td> + + </tr> + + <tr class="t-file"> + <td class="strong t-file__name"><a href="#5d0cbf07eac0368481292a8c6bf5e85f636264b0" class="src_link" title="lib/ruby-enum/enum.rb">lib/ruby-enum/enum.rb</a></td> + <td class="green strong cell--number t-file__coverage">100.00 %</td> + <td class="cell--number">171</td> + <td class="cell--number">67</td> + <td class="cell--number">67</td> + <td class="cell--number">0</td> + <td class="cell--number">3.91</td> + + </tr> + + <tr class="t-file"> + <td class="strong t-file__name"><a href="#8f10848d362db72f4a966812244e1a180d9c0a87" class="src_link" title="lib/ruby-enum/errors/base.rb">lib/ruby-enum/errors/base.rb</a></td> + <td class="green strong cell--number t-file__coverage">100.00 %</td> + <td class="cell--number">80</td> + <td class="cell--number">22</td> + <td class="cell--number">22</td> + <td class="cell--number">0</td> + <td class="cell--number">2.91</td> + + </tr> + + <tr class="t-file"> + <td class="strong t-file__name"><a href="#c5a5d6fc57bbd314608d88cf9410ed4d56aa0350" class="src_link" title="lib/ruby-enum/errors/duplicate_key_error.rb">lib/ruby-enum/errors/duplicate_key_error.rb</a></td> + <td class="green strong cell--number t-file__coverage">100.00 %</td> + <td class="cell--number">14</td> + <td class="cell--number">6</td> + <td class="cell--number">6</td> + <td class="cell--number">0</td> + <td class="cell--number">1.00</td> + + </tr> + + <tr class="t-file"> + <td class="strong t-file__name"><a href="#ef6bd6993c68332cd8e116fa109f64e85b49458a" class="src_link" title="lib/ruby-enum/errors/duplicate_value_error.rb">lib/ruby-enum/errors/duplicate_value_error.rb</a></td> + <td class="green strong cell--number t-file__coverage">100.00 %</td> + <td class="cell--number">14</td> + <td class="cell--number">6</td> + <td class="cell--number">6</td> + <td class="cell--number">0</td> + <td class="cell--number">1.00</td> + + </tr> + + <tr class="t-file"> + <td class="strong t-file__name"><a href="#f2d20eed6db8053addd5fc1fae785eee6e7d3715" class="src_link" title="lib/ruby-enum/errors/uninitialized_constant_error.rb">lib/ruby-enum/errors/uninitialized_constant_error.rb</a></td> + <td class="green strong cell--number t-file__coverage">100.00 %</td> + <td class="cell--number">13</td> + <td class="cell--number">6</td> + <td class="cell--number">6</td> + <td class="cell--number">0</td> + <td class="cell--number">1.33</td> + + </tr> + + <tr class="t-file"> + <td class="strong t-file__name"><a href="#bcbac193211da2bce91236b5d521e23005d4dc30" class="src_link" title="spec/ruby-enum/version_spec.rb">spec/ruby-enum/version_spec.rb</a></td> + <td class="green strong cell--number t-file__coverage">100.00 %</td> + <td class="cell--number">9</td> + <td class="cell--number">4</td> + <td class="cell--number">4</td> + <td class="cell--number">0</td> + <td class="cell--number">1.00</td> + + </tr> + + </tbody> + </table> + </div> +</div> + + + + </div> + + <div id="footer"> + Generated by <a href="https://github.com/simplecov-ruby/simplecov">simplecov</a> v0.21.2 + and simplecov-html v0.12.3<br/> + using RSpec + </div> + + <div class="source_files"> + + <div class="source_table" id="ee900552ffcf61e4cbcb7de088bb27ce8e102d72"> + <div class="header"> + <h3>lib/ruby-enum.rb</h3> + <h4> + <span class="green"> + 100.0% +</span> + + lines covered + </h4> + + + + <div class="t-line-summary"> + <b>8</b> relevant lines. + <span class="green"><b>8</b> lines covered</span> and + <span class="red"><b>0</b> lines missed.</span> + </div> + + + + </div> + + <pre> + <ol> + + <div> + <li class="never" data-hits="" data-linenumber="1"> + + + + + + <code class="ruby"># frozen_string_literal: true</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="2"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="3"> + <span class="hits">1</span> + + + + + <code class="ruby">require &#39;i18n&#39;</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="4"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="5"> + <span class="hits">1</span> + + + + + <code class="ruby">require &#39;ruby-enum/version&#39;</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="6"> + <span class="hits">1</span> + + + + + <code class="ruby">require &#39;ruby-enum/enum&#39;</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="7"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="8"> + <span class="hits">1</span> + + + + + <code class="ruby">I18n.load_path &lt;&lt; File.join(File.dirname(__FILE__), &#39;config&#39;, &#39;locales&#39;, &#39;en.yml&#39;)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="9"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="10"> + <span class="hits">1</span> + + + + + <code class="ruby">require &#39;ruby-enum/errors/base&#39;</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="11"> + <span class="hits">1</span> + + + + + <code class="ruby">require &#39;ruby-enum/errors/uninitialized_constant_error&#39;</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="12"> + <span class="hits">1</span> + + + + + <code class="ruby">require &#39;ruby-enum/errors/duplicate_key_error&#39;</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="13"> + <span class="hits">1</span> + + + + + <code class="ruby">require &#39;ruby-enum/errors/duplicate_value_error&#39;</code> + </li> + </div> + + </ol> + </pre> +</div> + + + <div class="source_table" id="5d0cbf07eac0368481292a8c6bf5e85f636264b0"> + <div class="header"> + <h3>lib/ruby-enum/enum.rb</h3> + <h4> + <span class="green"> + 100.0% +</span> + + lines covered + </h4> + + + + <div class="t-line-summary"> + <b>67</b> relevant lines. + <span class="green"><b>67</b> lines covered</span> and + <span class="red"><b>0</b> lines missed.</span> + </div> + + + + </div> + + <pre> + <ol> + + <div> + <li class="never" data-hits="" data-linenumber="1"> + + + + + + <code class="ruby"># frozen_string_literal: true</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="2"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="3"> + <span class="hits">1</span> + + + + + <code class="ruby">module Ruby</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="4"> + <span class="hits">1</span> + + + + + <code class="ruby"> module Enum</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="5"> + <span class="hits">1</span> + + + + + <code class="ruby"> attr_reader :key, :value</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="6"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="7"> + <span class="hits">1</span> + + + + + <code class="ruby"> def initialize(key, value)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="8" data-linenumber="8"> + <span class="hits">8</span> + + + + + <code class="ruby"> @key = key</code> + </li> + </div> + + <div> + <li class="covered" data-hits="8" data-linenumber="9"> + <span class="hits">8</span> + + + + + <code class="ruby"> @value = value</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="10"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="11"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="12"> + <span class="hits">1</span> + + + + + <code class="ruby"> def self.included(base)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="4" data-linenumber="13"> + <span class="hits">4</span> + + + + + <code class="ruby"> base.extend Enumerable</code> + </li> + </div> + + <div> + <li class="covered" data-hits="4" data-linenumber="14"> + <span class="hits">4</span> + + + + + <code class="ruby"> base.extend ClassMethods</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="15"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="4" data-linenumber="16"> + <span class="hits">4</span> + + + + + <code class="ruby"> base.private_class_method(:new)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="17"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="18"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="19"> + <span class="hits">1</span> + + + + + <code class="ruby"> module ClassMethods</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="20"> + + + + + + <code class="ruby"> # Define an enumerated value.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="21"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="22"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="23"> + + + + + + <code class="ruby"> # [key] Enumerator key.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="24"> + + + + + + <code class="ruby"> # [value] Enumerator value.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="25"> + <span class="hits">1</span> + + + + + <code class="ruby"> def define(key, value = key)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="10" data-linenumber="26"> + <span class="hits">10</span> + + + + + <code class="ruby"> @_enum_hash ||= {}</code> + </li> + </div> + + <div> + <li class="covered" data-hits="10" data-linenumber="27"> + <span class="hits">10</span> + + + + + <code class="ruby"> @_enums_by_value ||= {}</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="28"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="10" data-linenumber="29"> + <span class="hits">10</span> + + + + + <code class="ruby"> validate_key!(key)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="9" data-linenumber="30"> + <span class="hits">9</span> + + + + + <code class="ruby"> validate_value!(value)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="31"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="8" data-linenumber="32"> + <span class="hits">8</span> + + + + + <code class="ruby"> store_new_instance(key, value)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="33"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="8" data-linenumber="34"> + <span class="hits">8</span> + + + + + <code class="ruby"> if upper?(key.to_s)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="35"> + <span class="hits">5</span> + + + + + <code class="ruby"> const_set key, value</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="36"> + + + + + + <code class="ruby"> else</code> + </li> + </div> + + <div> + <li class="covered" data-hits="6" data-linenumber="37"> + <span class="hits">6</span> + + + + + <code class="ruby"> define_singleton_method(key) { value }</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="38"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="39"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="40"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="41"> + <span class="hits">1</span> + + + + + <code class="ruby"> def store_new_instance(key, value)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="8" data-linenumber="42"> + <span class="hits">8</span> + + + + + <code class="ruby"> new_instance = new(key, value)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="8" data-linenumber="43"> + <span class="hits">8</span> + + + + + <code class="ruby"> @_enum_hash[key] = new_instance</code> + </li> + </div> + + <div> + <li class="covered" data-hits="8" data-linenumber="44"> + <span class="hits">8</span> + + + + + <code class="ruby"> @_enums_by_value[value] = new_instance</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="45"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="46"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="47"> + <span class="hits">1</span> + + + + + <code class="ruby"> def const_missing(key)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="3" data-linenumber="48"> + <span class="hits">3</span> + + + + + <code class="ruby"> raise Ruby::Enum::Errors::UninitializedConstantError, name: name, key: key</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="49"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="50"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="51"> + + + + + + <code class="ruby"> # Iterate over all enumerated values.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="52"> + + + + + + <code class="ruby"> # Required for Enumerable mixin</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="53"> + <span class="hits">1</span> + + + + + <code class="ruby"> def each(&amp;block)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="8" data-linenumber="54"> + <span class="hits">8</span> + + + + + <code class="ruby"> @_enum_hash.each(&amp;block)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="55"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="56"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="57"> + + + + + + <code class="ruby"> # Attempt to parse an enum key and return the</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="58"> + + + + + + <code class="ruby"> # corresponding value.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="59"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="60"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="61"> + + + + + + <code class="ruby"> # [k] The key string to parse.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="62"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="63"> + + + + + + <code class="ruby"> # Returns the corresponding value or nil.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="64"> + <span class="hits">1</span> + + + + + <code class="ruby"> def parse(k)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="4" data-linenumber="65"> + <span class="hits">4</span> + + + + + <code class="ruby"> k = k.to_s.upcase</code> + </li> + </div> + + <div> + <li class="covered" data-hits="4" data-linenumber="66"> + <span class="hits">4</span> + + + + + <code class="ruby"> each do |key, enum|</code> + </li> + </div> + + <div> + <li class="covered" data-hits="6" data-linenumber="67"> + <span class="hits">6</span> + + + + + <code class="ruby"> return enum.value if key.to_s.upcase == k</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="68"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="69"> + + + + + + <code class="ruby"> nil</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="70"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="71"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="72"> + + + + + + <code class="ruby"> # Whether the specified key exists in this enum.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="73"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="74"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="75"> + + + + + + <code class="ruby"> # [k] The string key to check.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="76"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="77"> + + + + + + <code class="ruby"> # Returns true if the key exists, false otherwise.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="78"> + <span class="hits">1</span> + + + + + <code class="ruby"> def key?(k)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="7" data-linenumber="79"> + <span class="hits">7</span> + + + + + <code class="ruby"> @_enum_hash.key?(k)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="80"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="81"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="82"> + + + + + + <code class="ruby"> # Gets the string value for the specified key.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="83"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="84"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="85"> + + + + + + <code class="ruby"> # [k] The key symbol to get the value for.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="86"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="87"> + + + + + + <code class="ruby"> # Returns the corresponding enum instance or nil.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="88"> + <span class="hits">1</span> + + + + + <code class="ruby"> def value(k)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="89"> + <span class="hits">5</span> + + + + + <code class="ruby"> enum = @_enum_hash[k]</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="90"> + <span class="hits">5</span> + + + + + <code class="ruby"> enum&amp;.value</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="91"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="92"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="93"> + + + + + + <code class="ruby"> # Whether the specified value exists in this enum.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="94"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="95"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="96"> + + + + + + <code class="ruby"> # [k] The string value to check.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="97"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="98"> + + + + + + <code class="ruby"> # Returns true if the value exists, false otherwise.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="99"> + <span class="hits">1</span> + + + + + <code class="ruby"> def value?(v)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="7" data-linenumber="100"> + <span class="hits">7</span> + + + + + <code class="ruby"> @_enums_by_value.key?(v)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="101"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="102"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="103"> + + + + + + <code class="ruby"> # Gets the key symbol for the specified value.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="104"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="105"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="106"> + + + + + + <code class="ruby"> # [v] The string value to parse.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="107"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="108"> + + + + + + <code class="ruby"> # Returns the corresponding key symbol or nil.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="109"> + <span class="hits">1</span> + + + + + <code class="ruby"> def key(v)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="110"> + <span class="hits">5</span> + + + + + <code class="ruby"> enum = @_enums_by_value[v]</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="111"> + <span class="hits">5</span> + + + + + <code class="ruby"> enum&amp;.key</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="112"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="113"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="114"> + + + + + + <code class="ruby"> # Returns all enum keys.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="115"> + <span class="hits">1</span> + + + + + <code class="ruby"> def keys</code> + </li> + </div> + + <div> + <li class="covered" data-hits="2" data-linenumber="116"> + <span class="hits">2</span> + + + + + <code class="ruby"> @_enum_hash.values.map(&amp;:key)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="117"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="118"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="119"> + + + + + + <code class="ruby"> # Returns all enum values.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="120"> + <span class="hits">1</span> + + + + + <code class="ruby"> def values</code> + </li> + </div> + + <div> + <li class="covered" data-hits="7" data-linenumber="121"> + <span class="hits">7</span> + + + + + <code class="ruby"> result = @_enum_hash.values.map(&amp;:value)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="122"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="7" data-linenumber="123"> + <span class="hits">7</span> + + + + + <code class="ruby"> if superclass &lt; Ruby::Enum</code> + </li> + </div> + + <div> + <li class="covered" data-hits="3" data-linenumber="124"> + <span class="hits">3</span> + + + + + <code class="ruby"> superclass.values + result</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="125"> + + + + + + <code class="ruby"> else</code> + </li> + </div> + + <div> + <li class="covered" data-hits="4" data-linenumber="126"> + <span class="hits">4</span> + + + + + <code class="ruby"> result</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="127"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="128"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="129"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="130"> + + + + + + <code class="ruby"> # Iterate over all enumerated values.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="131"> + + + + + + <code class="ruby"> # Required for Enumerable mixin</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="132"> + <span class="hits">1</span> + + + + + <code class="ruby"> def each_value(&amp;_block)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="133"> + <span class="hits">1</span> + + + + + <code class="ruby"> @_enum_hash.each_value do |v|</code> + </li> + </div> + + <div> + <li class="covered" data-hits="2" data-linenumber="134"> + <span class="hits">2</span> + + + + + <code class="ruby"> yield v.value</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="135"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="136"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="137"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="138"> + + + + + + <code class="ruby"> # Iterate over all enumerated keys.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="139"> + + + + + + <code class="ruby"> # Required for Enumerable mixin</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="140"> + <span class="hits">1</span> + + + + + <code class="ruby"> def each_key(&amp;_block)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="141"> + <span class="hits">1</span> + + + + + <code class="ruby"> @_enum_hash.each_value do |v|</code> + </li> + </div> + + <div> + <li class="covered" data-hits="2" data-linenumber="142"> + <span class="hits">2</span> + + + + + <code class="ruby"> yield v.key</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="143"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="144"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="145"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="146"> + <span class="hits">1</span> + + + + + <code class="ruby"> def to_h</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="147"> + <span class="hits">1</span> + + + + + <code class="ruby"> Hash[@_enum_hash.map do |key, enum|</code> + </li> + </div> + + <div> + <li class="covered" data-hits="2" data-linenumber="148"> + <span class="hits">2</span> + + + + + <code class="ruby"> [key, enum.value]</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="149"> + + + + + + <code class="ruby"> end]</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="150"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="151"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="152"> + <span class="hits">1</span> + + + + + <code class="ruby"> private</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="153"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="154"> + <span class="hits">1</span> + + + + + <code class="ruby"> def upper?(s)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="8" data-linenumber="155"> + <span class="hits">8</span> + + + + + <code class="ruby"> !/[[:upper:]]/.match(s).nil?</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="156"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="157"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="158"> + <span class="hits">1</span> + + + + + <code class="ruby"> def validate_key!(key)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="10" data-linenumber="159"> + <span class="hits">10</span> + + + + + <code class="ruby"> return unless @_enum_hash.key?(key)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="160"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="161"> + <span class="hits">1</span> + + + + + <code class="ruby"> raise Ruby::Enum::Errors::DuplicateKeyError, name: name, key: key</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="162"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="163"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="164"> + <span class="hits">1</span> + + + + + <code class="ruby"> def validate_value!(value)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="9" data-linenumber="165"> + <span class="hits">9</span> + + + + + <code class="ruby"> return unless @_enums_by_value.key?(value)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="166"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="167"> + <span class="hits">1</span> + + + + + <code class="ruby"> raise Ruby::Enum::Errors::DuplicateValueError, name: name, value: value</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="168"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="169"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="170"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="171"> + + + + + + <code class="ruby">end</code> + </li> + </div> + + </ol> + </pre> +</div> + + + <div class="source_table" id="8f10848d362db72f4a966812244e1a180d9c0a87"> + <div class="header"> + <h3>lib/ruby-enum/errors/base.rb</h3> + <h4> + <span class="green"> + 100.0% +</span> + + lines covered + </h4> + + + + <div class="t-line-summary"> + <b>22</b> relevant lines. + <span class="green"><b>22</b> lines covered</span> and + <span class="red"><b>0</b> lines missed.</span> + </div> + + + + </div> + + <pre> + <ol> + + <div> + <li class="never" data-hits="" data-linenumber="1"> + + + + + + <code class="ruby"># frozen_string_literal: true</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="2"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="3"> + <span class="hits">1</span> + + + + + <code class="ruby">module Ruby</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="4"> + <span class="hits">1</span> + + + + + <code class="ruby"> module Enum</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="5"> + <span class="hits">1</span> + + + + + <code class="ruby"> module Errors</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="6"> + <span class="hits">1</span> + + + + + <code class="ruby"> class Base &lt; StandardError</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="7"> + + + + + + <code class="ruby"> # Problem occurred.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="8"> + <span class="hits">1</span> + + + + + <code class="ruby"> attr_reader :problem</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="9"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="10"> + + + + + + <code class="ruby"> # Summary of the problem.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="11"> + <span class="hits">1</span> + + + + + <code class="ruby"> attr_reader :summary</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="12"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="13"> + + + + + + <code class="ruby"> # Suggested problem resolution.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="14"> + <span class="hits">1</span> + + + + + <code class="ruby"> attr_reader :resolution</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="15"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="16"> + + + + + + <code class="ruby"> # Compose the message.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="17"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="18"> + + + + + + <code class="ruby"> # [key] Lookup key in the translation table.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="19"> + + + + + + <code class="ruby"> # [attributes] The objects to pass to create the message.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="20"> + <span class="hits">1</span> + + + + + <code class="ruby"> def compose_message(key, attributes = {})</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="21"> + <span class="hits">5</span> + + + + + <code class="ruby"> @problem = create_problem(key, attributes)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="22"> + <span class="hits">5</span> + + + + + <code class="ruby"> @summary = create_summary(key, attributes)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="23"> + <span class="hits">5</span> + + + + + <code class="ruby"> @resolution = create_resolution(key, attributes)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="24"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="25"> + <span class="hits">5</span> + + + + + <code class="ruby"> &quot;\nProblem:\n #{@problem}&quot;\</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="26"> + + + + + + <code class="ruby"> &quot;\nSummary:\n #{@summary}&quot; + &quot;\nResolution:\n #{@resolution}&quot;</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="27"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="28"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="29"> + <span class="hits">1</span> + + + + + <code class="ruby"> private</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="30"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="31"> + <span class="hits">1</span> + + + + + <code class="ruby"> BASE_KEY = &#39;ruby.enum.errors.messages&#39; #:nodoc:</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="32"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="33"> + + + + + + <code class="ruby"> # Given the key of the specific error and the options hash, translate the</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="34"> + + + + + + <code class="ruby"> # message.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="35"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="36"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="37"> + + + + + + <code class="ruby"> # [key] The key of the error in the locales.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="38"> + + + + + + <code class="ruby"> # [options] The objects to pass to create the message.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="39"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="40"> + + + + + + <code class="ruby"> # Returns a localized error message string.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="41"> + <span class="hits">1</span> + + + + + <code class="ruby"> def translate(key, options)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="15" data-linenumber="42"> + <span class="hits">15</span> + + + + + <code class="ruby"> ::I18n.translate(&quot;#{BASE_KEY}.#{key}&quot;, **{ locale: :en }.merge(options)).strip</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="43"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="44"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="45"> + + + + + + <code class="ruby"> # Create the problem.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="46"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="47"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="48"> + + + + + + <code class="ruby"> # [key] The error key.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="49"> + + + + + + <code class="ruby"> # [attributes] The attributes to interpolate.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="50"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="51"> + + + + + + <code class="ruby"> # Returns the problem.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="52"> + <span class="hits">1</span> + + + + + <code class="ruby"> def create_problem(key, attributes)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="53"> + <span class="hits">5</span> + + + + + <code class="ruby"> translate(&quot;#{key}.message&quot;, attributes)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="54"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="55"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="56"> + + + + + + <code class="ruby"> # Create the summary.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="57"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="58"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="59"> + + + + + + <code class="ruby"> # [key] The error key.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="60"> + + + + + + <code class="ruby"> # [attributes] The attributes to interpolate.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="61"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="62"> + + + + + + <code class="ruby"> # Returns the summary.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="63"> + <span class="hits">1</span> + + + + + <code class="ruby"> def create_summary(key, attributes)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="64"> + <span class="hits">5</span> + + + + + <code class="ruby"> translate(&quot;#{key}.summary&quot;, attributes)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="65"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="66"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="67"> + + + + + + <code class="ruby"> # Create the resolution.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="68"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="69"> + + + + + + <code class="ruby"> # === Parameters</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="70"> + + + + + + <code class="ruby"> # [key] The error key.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="71"> + + + + + + <code class="ruby"> # [attributes] The attributes to interpolate.</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="72"> + + + + + + <code class="ruby"> #</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="73"> + + + + + + <code class="ruby"> # Returns the resolution.</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="74"> + <span class="hits">1</span> + + + + + <code class="ruby"> def create_resolution(key, attributes)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="5" data-linenumber="75"> + <span class="hits">5</span> + + + + + <code class="ruby"> translate(&quot;#{key}.resolution&quot;, attributes)</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="76"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="77"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="78"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="79"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="80"> + + + + + + <code class="ruby">end</code> + </li> + </div> + + </ol> + </pre> +</div> + + + <div class="source_table" id="c5a5d6fc57bbd314608d88cf9410ed4d56aa0350"> + <div class="header"> + <h3>lib/ruby-enum/errors/duplicate_key_error.rb</h3> + <h4> + <span class="green"> + 100.0% +</span> + + lines covered + </h4> + + + + <div class="t-line-summary"> + <b>6</b> relevant lines. + <span class="green"><b>6</b> lines covered</span> and + <span class="red"><b>0</b> lines missed.</span> + </div> + + + + </div> + + <pre> + <ol> + + <div> + <li class="never" data-hits="" data-linenumber="1"> + + + + + + <code class="ruby"># frozen_string_literal: true</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="2"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="3"> + <span class="hits">1</span> + + + + + <code class="ruby">module Ruby</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="4"> + <span class="hits">1</span> + + + + + <code class="ruby"> module Enum</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="5"> + <span class="hits">1</span> + + + + + <code class="ruby"> module Errors</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="6"> + + + + + + <code class="ruby"> # Error raised when a duplicate enum key is found</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="7"> + <span class="hits">1</span> + + + + + <code class="ruby"> class DuplicateKeyError &lt; Base</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="8"> + <span class="hits">1</span> + + + + + <code class="ruby"> def initialize(attrs)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="9"> + <span class="hits">1</span> + + + + + <code class="ruby"> super(compose_message(&#39;duplicate_key&#39;, attrs))</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="10"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="11"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="12"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="13"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="14"> + + + + + + <code class="ruby">end</code> + </li> + </div> + + </ol> + </pre> +</div> + + + <div class="source_table" id="ef6bd6993c68332cd8e116fa109f64e85b49458a"> + <div class="header"> + <h3>lib/ruby-enum/errors/duplicate_value_error.rb</h3> + <h4> + <span class="green"> + 100.0% +</span> + + lines covered + </h4> + + + + <div class="t-line-summary"> + <b>6</b> relevant lines. + <span class="green"><b>6</b> lines covered</span> and + <span class="red"><b>0</b> lines missed.</span> + </div> + + + + </div> + + <pre> + <ol> + + <div> + <li class="never" data-hits="" data-linenumber="1"> + + + + + + <code class="ruby"># frozen_string_literal: true</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="2"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="3"> + <span class="hits">1</span> + + + + + <code class="ruby">module Ruby</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="4"> + <span class="hits">1</span> + + + + + <code class="ruby"> module Enum</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="5"> + <span class="hits">1</span> + + + + + <code class="ruby"> module Errors</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="6"> + + + + + + <code class="ruby"> # Error raised when a duplicate enum value is found</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="7"> + <span class="hits">1</span> + + + + + <code class="ruby"> class DuplicateValueError &lt; Base</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="8"> + <span class="hits">1</span> + + + + + <code class="ruby"> def initialize(attrs)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="9"> + <span class="hits">1</span> + + + + + <code class="ruby"> super(compose_message(&#39;duplicate_value&#39;, attrs))</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="10"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="11"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="12"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="13"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="14"> + + + + + + <code class="ruby">end</code> + </li> + </div> + + </ol> + </pre> +</div> + + + <div class="source_table" id="f2d20eed6db8053addd5fc1fae785eee6e7d3715"> + <div class="header"> + <h3>lib/ruby-enum/errors/uninitialized_constant_error.rb</h3> + <h4> + <span class="green"> + 100.0% +</span> + + lines covered + </h4> + + + + <div class="t-line-summary"> + <b>6</b> relevant lines. + <span class="green"><b>6</b> lines covered</span> and + <span class="red"><b>0</b> lines missed.</span> + </div> + + + + </div> + + <pre> + <ol> + + <div> + <li class="never" data-hits="" data-linenumber="1"> + + + + + + <code class="ruby"># frozen_string_literal: true</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="2"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="3"> + <span class="hits">1</span> + + + + + <code class="ruby">module Ruby</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="4"> + <span class="hits">1</span> + + + + + <code class="ruby"> module Enum</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="5"> + <span class="hits">1</span> + + + + + <code class="ruby"> module Errors</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="6"> + <span class="hits">1</span> + + + + + <code class="ruby"> class UninitializedConstantError &lt; Base</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="7"> + <span class="hits">1</span> + + + + + <code class="ruby"> def initialize(attrs)</code> + </li> + </div> + + <div> + <li class="covered" data-hits="3" data-linenumber="8"> + <span class="hits">3</span> + + + + + <code class="ruby"> super(compose_message(&#39;uninitialized_constant&#39;, attrs))</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="9"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="10"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="11"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="12"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="13"> + + + + + + <code class="ruby">end</code> + </li> + </div> + + </ol> + </pre> +</div> + + + <div class="source_table" id="bcbac193211da2bce91236b5d521e23005d4dc30"> + <div class="header"> + <h3>spec/ruby-enum/version_spec.rb</h3> + <h4> + <span class="green"> + 100.0% +</span> + + lines covered + </h4> + + + + <div class="t-line-summary"> + <b>4</b> relevant lines. + <span class="green"><b>4</b> lines covered</span> and + <span class="red"><b>0</b> lines missed.</span> + </div> + + + + </div> + + <pre> + <ol> + + <div> + <li class="never" data-hits="" data-linenumber="1"> + + + + + + <code class="ruby"># frozen_string_literal: true</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="2"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="3"> + <span class="hits">1</span> + + + + + <code class="ruby">require &#39;spec_helper&#39;</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="4"> + + + + + + <code class="ruby"></code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="5"> + <span class="hits">1</span> + + + + + <code class="ruby">describe Ruby::Enum do</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="6"> + <span class="hits">1</span> + + + + + <code class="ruby"> it &#39;has a version&#39; do</code> + </li> + </div> + + <div> + <li class="covered" data-hits="1" data-linenumber="7"> + <span class="hits">1</span> + + + + + <code class="ruby"> expect(Ruby::Enum::VERSION).not_to be_nil</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="8"> + + + + + + <code class="ruby"> end</code> + </li> + </div> + + <div> + <li class="never" data-hits="" data-linenumber="9"> + + + + + + <code class="ruby">end</code> + </li> + </div> + + </ol> + </pre> +</div> + + + </div> + </div> + </body> +</html> diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/config/locales/en.yml b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/config/locales/en.yml new file mode 100644 index 000000000000..c93b29cdee54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/config/locales/en.yml @@ -0,0 +1,22 @@ +en: + ruby: + enum: + errors: + messages: + uninitialized_constant: + message: "Uninitialized constant." + summary: "The constant %{name}::%{key} has not been defined." + resolution: "The enumerated value could not be found in class %{name}. Use 'define' to declare it.\n + \_Example:\n + \_\_module %{name}\n + \_\_\_include Ruby::Enum\n + \_\_\_define %{key}, 'value'\n + \_\_end" + duplicate_key: + message: 'Duplicate key.' + summary: "The constant %{name}::%{key} has already been defined." + resolution: "The enumerated key is already defined in class %{name}%. Please use a different name to declare it." + duplicate_value: + message: 'Duplicate value found.' + summary: "The value %{value} has already been defined in %{name}%." + resolution: "The enumerated value %{value} is already defined in class %{name}%. Please use a different value." diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum.rb new file mode 100644 index 000000000000..855c8ee03693 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'i18n' + +require 'ruby-enum/version' +require 'ruby-enum/enum' + +I18n.load_path << File.join(File.dirname(__FILE__), 'config', 'locales', 'en.yml') + +require 'ruby-enum/errors/base' +require 'ruby-enum/errors/uninitialized_constant_error' +require 'ruby-enum/errors/duplicate_key_error' +require 'ruby-enum/errors/duplicate_value_error' diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/enum.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/enum.rb new file mode 100644 index 000000000000..f7abb4c78a80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/enum.rb @@ -0,0 +1,171 @@ +# frozen_string_literal: true + +module Ruby + module Enum + attr_reader :key, :value + + def initialize(key, value) + @key = key + @value = value + end + + def self.included(base) + base.extend Enumerable + base.extend ClassMethods + + base.private_class_method(:new) + end + + module ClassMethods + # Define an enumerated value. + # + # === Parameters + # [key] Enumerator key. + # [value] Enumerator value. + def define(key, value = key) + @_enum_hash ||= {} + @_enums_by_value ||= {} + + validate_key!(key) + validate_value!(value) + + store_new_instance(key, value) + + if upper?(key.to_s) + const_set key, value + else + define_singleton_method(key) { value } + end + end + + def store_new_instance(key, value) + new_instance = new(key, value) + @_enum_hash[key] = new_instance + @_enums_by_value[value] = new_instance + end + + def const_missing(key) + raise Ruby::Enum::Errors::UninitializedConstantError, name: name, key: key + end + + # Iterate over all enumerated values. + # Required for Enumerable mixin + def each(&block) + @_enum_hash.each(&block) + end + + # Attempt to parse an enum key and return the + # corresponding value. + # + # === Parameters + # [k] The key string to parse. + # + # Returns the corresponding value or nil. + def parse(k) + k = k.to_s.upcase + each do |key, enum| + return enum.value if key.to_s.upcase == k + end + nil + end + + # Whether the specified key exists in this enum. + # + # === Parameters + # [k] The string key to check. + # + # Returns true if the key exists, false otherwise. + def key?(k) + @_enum_hash.key?(k) + end + + # Gets the string value for the specified key. + # + # === Parameters + # [k] The key symbol to get the value for. + # + # Returns the corresponding enum instance or nil. + def value(k) + enum = @_enum_hash[k] + enum&.value + end + + # Whether the specified value exists in this enum. + # + # === Parameters + # [k] The string value to check. + # + # Returns true if the value exists, false otherwise. + def value?(v) + @_enums_by_value.key?(v) + end + + # Gets the key symbol for the specified value. + # + # === Parameters + # [v] The string value to parse. + # + # Returns the corresponding key symbol or nil. + def key(v) + enum = @_enums_by_value[v] + enum&.key + end + + # Returns all enum keys. + def keys + @_enum_hash.values.map(&:key) + end + + # Returns all enum values. + def values + result = @_enum_hash.values.map(&:value) + + if superclass < Ruby::Enum + superclass.values + result + else + result + end + end + + # Iterate over all enumerated values. + # Required for Enumerable mixin + def each_value(&_block) + @_enum_hash.each_value do |v| + yield v.value + end + end + + # Iterate over all enumerated keys. + # Required for Enumerable mixin + def each_key(&_block) + @_enum_hash.each_value do |v| + yield v.key + end + end + + def to_h + Hash[@_enum_hash.map do |key, enum| + [key, enum.value] + end] + end + + private + + def upper?(s) + !/[[:upper:]]/.match(s).nil? + end + + def validate_key!(key) + return unless @_enum_hash.key?(key) + + raise Ruby::Enum::Errors::DuplicateKeyError, name: name, key: key + end + + def validate_value!(value) + return unless @_enums_by_value.key?(value) + + raise Ruby::Enum::Errors::DuplicateValueError, name: name, value: value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/base.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/base.rb new file mode 100644 index 000000000000..c4a726c2f8db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/base.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +module Ruby + module Enum + module Errors + class Base < StandardError + # Problem occurred. + attr_reader :problem + + # Summary of the problem. + attr_reader :summary + + # Suggested problem resolution. + attr_reader :resolution + + # Compose the message. + # === Parameters + # [key] Lookup key in the translation table. + # [attributes] The objects to pass to create the message. + def compose_message(key, attributes = {}) + @problem = create_problem(key, attributes) + @summary = create_summary(key, attributes) + @resolution = create_resolution(key, attributes) + + "\nProblem:\n #{@problem}"\ + "\nSummary:\n #{@summary}" + "\nResolution:\n #{@resolution}" + end + + private + + BASE_KEY = 'ruby.enum.errors.messages' #:nodoc: + + # Given the key of the specific error and the options hash, translate the + # message. + # + # === Parameters + # [key] The key of the error in the locales. + # [options] The objects to pass to create the message. + # + # Returns a localized error message string. + def translate(key, options) + ::I18n.translate("#{BASE_KEY}.#{key}", **{ locale: :en }.merge(options)).strip + end + + # Create the problem. + # + # === Parameters + # [key] The error key. + # [attributes] The attributes to interpolate. + # + # Returns the problem. + def create_problem(key, attributes) + translate("#{key}.message", attributes) + end + + # Create the summary. + # + # === Parameters + # [key] The error key. + # [attributes] The attributes to interpolate. + # + # Returns the summary. + def create_summary(key, attributes) + translate("#{key}.summary", attributes) + end + + # Create the resolution. + # + # === Parameters + # [key] The error key. + # [attributes] The attributes to interpolate. + # + # Returns the resolution. + def create_resolution(key, attributes) + translate("#{key}.resolution", attributes) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/duplicate_key_error.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/duplicate_key_error.rb new file mode 100644 index 000000000000..64b0bd72eed1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/duplicate_key_error.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Ruby + module Enum + module Errors + # Error raised when a duplicate enum key is found + class DuplicateKeyError < Base + def initialize(attrs) + super(compose_message('duplicate_key', attrs)) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/duplicate_value_error.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/duplicate_value_error.rb new file mode 100644 index 000000000000..b3be267acd38 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/duplicate_value_error.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Ruby + module Enum + module Errors + # Error raised when a duplicate enum value is found + class DuplicateValueError < Base + def initialize(attrs) + super(compose_message('duplicate_value', attrs)) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/uninitialized_constant_error.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/uninitialized_constant_error.rb new file mode 100644 index 000000000000..42200c7bdce3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/errors/uninitialized_constant_error.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Ruby + module Enum + module Errors + class UninitializedConstantError < Base + def initialize(attrs) + super(compose_message('uninitialized_constant', attrs)) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/version.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/version.rb new file mode 100644 index 000000000000..1a3c94ba3319 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby-enum/version.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Ruby + module Enum + VERSION = '0.9.0' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby_enum.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby_enum.rb new file mode 100644 index 000000000000..c1af8f6251ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/lib/ruby_enum.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require 'ruby-enum' diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/pkg/ruby-enum-0.8.0.gem b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/pkg/ruby-enum-0.8.0.gem new file mode 100644 index 000000000000..1949d89202c8 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/pkg/ruby-enum-0.8.0.gem differ diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/ruby-enum.gemspec b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/ruby-enum.gemspec new file mode 100644 index 000000000000..9eee0bd06f08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/ruby-enum.gemspec @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +$LOAD_PATH.push File.expand_path('lib', __dir__) +require 'ruby-enum/version' + +Gem::Specification.new do |s| + s.name = 'ruby-enum' + s.version = Ruby::Enum::VERSION + s.authors = ['Daniel Doubrovkine'] + s.email = 'dblock@dblock.org' + s.platform = Gem::Platform::RUBY + s.required_rubygems_version = '>= 1.3.6' + s.files = Dir['**/*'] + s.require_paths = ['lib'] + s.homepage = 'http://github.com/dblock/ruby-enum' + s.licenses = ['MIT'] + s.summary = 'Enum-like behavior for Ruby.' + s.add_dependency 'i18n' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/spec/ruby-enum/enum_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/spec/ruby-enum/enum_spec.rb new file mode 100644 index 000000000000..6a7e5605b56f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/spec/ruby-enum/enum_spec.rb @@ -0,0 +1,248 @@ +# frozen_string_literal: true + +require 'spec_helper' + +class Colors + include Ruby::Enum + + define :RED, 'red' + define :GREEN, 'green' +end + +class FirstSubclass < Colors + define :ORANGE, 'orange' +end + +class SecondSubclass < FirstSubclass + define :PINK, 'pink' +end + +describe Ruby::Enum do + it 'returns an enum value' do + expect(Colors::RED).to eq 'red' + expect(Colors::GREEN).to eq 'green' + end + it 'raises UninitializedConstantError on an invalid constant' do + expect { Colors::ANYTHING }.to raise_error Ruby::Enum::Errors::UninitializedConstantError, /The constant Colors::ANYTHING has not been defined./ + end + context '#each' do + it 'iterates over constants' do + keys = [] + enum_keys = [] + enum_values = [] + Colors.each do |key, enum| + keys << key + enum_keys << enum.key + enum_values << enum.value + end + expect(keys).to eq %i[RED GREEN] + expect(enum_keys).to eq %i[RED GREEN] + expect(enum_values).to eq %w[red green] + end + end + context '#map' do + it 'maps constants' do + key_key_values = Colors.map do |key, enum| + [key, enum.key, enum.value] + end + expect(key_key_values.count).to eq 2 + expect(key_key_values[0]).to eq [:RED, :RED, 'red'] + expect(key_key_values[1]).to eq [:GREEN, :GREEN, 'green'] + end + end + context '#parse' do + it 'parses exact value' do + expect(Colors.parse('red')).to eq(Colors::RED) + end + it 'is case-insensitive' do + expect(Colors.parse('ReD')).to eq(Colors::RED) + end + it 'returns nil for a null value' do + expect(Colors.parse(nil)).to be_nil + end + it 'returns nil for an invalid value' do + expect(Colors.parse('invalid')).to be_nil + end + end + context '#key?' do + it 'returns true for valid keys accessed directly' do + Colors.keys.each do |key| # rubocop:disable Style/HashEachMethods + expect(Colors.key?(key)).to eq(true) + end + end + it 'returns true for valid keys accessed via each_keys' do + Colors.each_key do |key| + expect(Colors.key?(key)).to eq(true) + end + end + it 'returns false for invalid keys' do + expect(Colors.key?(:NOT_A_KEY)).to eq(false) + end + end + context '#value' do + it 'returns string values for keys' do + Colors.each do |key, enum| + expect(Colors.value(key)).to eq(enum.value) + end + end + it 'returns nil for an invalid key' do + expect(Colors.value(:NOT_A_KEY)).to be_nil + end + end + context '#value?' do + it 'returns true for valid values accessed directly' do + Colors.values.each do |value| # rubocop:disable Style/HashEachMethods + expect(Colors.value?(value)).to eq(true) + end + end + it 'returns true for valid values accessed via each_value' do + Colors.each_value do |value| + expect(Colors.value?(value)).to eq(true) + end + end + it 'returns false for invalid values' do + expect(Colors.value?('I am not a value')).to eq(false) + end + end + context '#key' do + it 'returns enum instances for values' do + Colors.each do |_, enum| + expect(Colors.key(enum.value)).to eq(enum.key) + end + end + it 'returns nil for an invalid value' do + expect(Colors.key('invalid')).to be_nil + end + end + context '#keys' do + it 'returns keys' do + expect(Colors.keys).to eq(%i[RED GREEN]) + end + end + context '#values' do + it 'returns values' do + expect(Colors.values).to eq(%w[red green]) + end + end + context '#to_h' do + it 'returns a hash of key:values' do + expect(Colors.to_h).to eq(RED: 'red', GREEN: 'green') + end + end + + context 'on duplicate keys' do + it 'raises DuplicateKeyError' do + expect do + Colors.class_eval do + define :RED, 'some' + end + end.to raise_error Ruby::Enum::Errors::DuplicateKeyError, /The constant Colors::RED has already been defined./ + end + end + + context 'on duplicate values' do + it 'raises a DuplicateValueError' do + expect do + Colors.class_eval do + define :Other, 'red' + end + end.to raise_error Ruby::Enum::Errors::DuplicateValueError, /The value red has already been defined./ + end + end + + describe 'Given a class that has not defined any enums' do + class EmptyEnums + include Ruby::Enum + end + it do + expect { EmptyEnums::ORANGE }.to raise_error Ruby::Enum::Errors::UninitializedConstantError + end + end + + context 'when a constant is redefined in a global namespace' do + before do + RED = 'black' + end + + it { expect(Colors::RED).to eq 'red' } + end + + describe 'Subclass behavior' do + it 'contains the enums defined in the parent class' do + expect(FirstSubclass::GREEN).to eq 'green' + expect(FirstSubclass::RED).to eq 'red' + end + + it 'contains its own enums' do + expect(FirstSubclass::ORANGE).to eq 'orange' + end + it 'parent class should not have enums defined in child classes' do + expect { Colors::ORANGE }.to raise_error Ruby::Enum::Errors::UninitializedConstantError + end + context 'Given a 2 level depth subclass' do + subject { SecondSubclass } + it 'contains its own enums and all the enums defined in the parent classes' do + expect(subject::RED).to eq 'red' + expect(subject::GREEN).to eq 'green' + expect(subject::ORANGE).to eq 'orange' + expect(subject::PINK).to eq 'pink' + end + + describe '#values' do + subject { SecondSubclass.values } + + it 'contains the values from all of the parent classes' do + expect(subject).to eq(%w[red green orange pink]) + end + end + end + + describe '#values' do + subject { FirstSubclass.values } + + it 'contains the values from the parent class' do + expect(subject).to eq(%w[red green orange]) + end + end + end + + describe 'default value' do + class Default + include Ruby::Enum + define :KEY + end + + subject { Default::KEY } + + it 'equals the key' do + expect(subject).to eq(:KEY) + end + end + + describe 'non constant definitions' do + class States + include Ruby::Enum + define :created, 'Created' + define :published, 'Published' + define :undefined + end + subject { States } + it 'behaves like an enum' do + expect(subject.created).to eq 'Created' + expect(subject.published).to eq 'Published' + expect(subject.undefined).to eq :undefined + + expect(subject.key?(:created)).to be true + expect(subject.key('Created')).to eq :created + + expect(subject.value?('Created')).to be true + expect(subject.value(:created)).to eq 'Created' + + expect(subject.key?(:undefined)).to be true + expect(subject.key(:undefined)).to eq :undefined + + expect(subject.value?(:undefined)).to be true + expect(subject.value(:undefined)).to eq :undefined + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/spec/ruby-enum/version_spec.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/spec/ruby-enum/version_spec.rb new file mode 100644 index 000000000000..e32d337bf5da --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/spec/ruby-enum/version_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Ruby::Enum do + it 'has a version' do + expect(Ruby::Enum::VERSION).not_to be_nil + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/spec/spec_helper.rb new file mode 100644 index 000000000000..38a174f71e5a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby-enum-0.9.0/spec/spec_helper.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) + +require 'rubygems' + +require 'simplecov' +SimpleCov.start + +require 'rspec' +require 'ruby-enum' + +RSpec.configure(&:raise_errors_for_deprecations!) diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby2_keywords-0.0.4/LICENSE b/vendor/bundler/ruby/2.5.0/gems/ruby2_keywords-0.0.4/LICENSE new file mode 100644 index 000000000000..3b9d3835d61d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby2_keywords-0.0.4/LICENSE @@ -0,0 +1,22 @@ +Copyright 2019-2020 Nobuyoshi Nakada, Yusuke Endoh + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby2_keywords-0.0.4/README.md b/vendor/bundler/ruby/2.5.0/gems/ruby2_keywords-0.0.4/README.md new file mode 100644 index 000000000000..4cc028268944 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby2_keywords-0.0.4/README.md @@ -0,0 +1,67 @@ +# ruby2_keywords + +Provides empty `Module#ruby2_keywords` method, for the forward +source-level compatibility against ruby2.7 and ruby3. + +## Installation + +Add this line to your application's Gemfile: + +```ruby +gem 'ruby2_keywords' +``` + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install ruby2_keywords + +## Usage + +For class/module instance methods: + +```ruby +require 'ruby2_keywords' + +module YourModule + ruby2_keywords def delegating_method(*args) + other_method(*args) + end +end +``` + +For global methods: + +```ruby +require 'ruby2_keywords' + +ruby2_keywords def oldstyle_keywords(options = {}) +end +``` + +You can do the same for a method defined by `Module#define_method`: + +```ruby +define_method :delegating_method do |*args, &block| + other_method(*args, &block) +end +ruby2_keywords :delegating_method +``` + +## Contributing + +Bug reports and pull requests are welcome on [GitHub] or +[Ruby Issue Tracking System]. + +## License + +The gem is available as open source under the terms of the +[Ruby License] or the [2-Clause BSD License]. + +[GitHub]: https://github.com/ruby/ruby2_keywords/ +[Ruby Issue Tracking System]: https://bugs.ruby-lang.org +[Ruby License]: https://www.ruby-lang.org/en/about/license.txt +[2-Clause BSD License]: https://opensource.org/licenses/BSD-2-Clause diff --git a/vendor/bundler/ruby/2.5.0/gems/ruby2_keywords-0.0.4/lib/ruby2_keywords.rb b/vendor/bundler/ruby/2.5.0/gems/ruby2_keywords-0.0.4/lib/ruby2_keywords.rb new file mode 100644 index 000000000000..7a3f2fa858ec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/ruby2_keywords-0.0.4/lib/ruby2_keywords.rb @@ -0,0 +1,57 @@ +class Module + unless private_method_defined?(:ruby2_keywords) + private + # call-seq: + # ruby2_keywords(method_name, ...) + # + # Does nothing. + def ruby2_keywords(name, *) + # nil + end + end +end + +main = TOPLEVEL_BINDING.receiver +unless main.respond_to?(:ruby2_keywords, true) + # call-seq: + # ruby2_keywords(method_name, ...) + # + # Does nothing. + def main.ruby2_keywords(name, *) + # nil + end +end + +class Proc + unless method_defined?(:ruby2_keywords) + # call-seq: + # proc.ruby2_keywords -> proc + # + # Does nothing and just returns the receiver. + def ruby2_keywords + self + end + end +end + +class << Hash + unless method_defined?(:ruby2_keywords_hash?) + # call-seq: + # Hash.ruby2_keywords_hash?(hash) -> false + # + # Returns false. + def ruby2_keywords_hash?(hash) + false + end + end + + unless method_defined?(:ruby2_keywords_hash) + # call-seq: + # Hash.ruby2_keywords_hash(hash) -> new_hash + # + # Duplicates a given hash and returns the new hash. + def ruby2_keywords_hash(hash) + hash.dup + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/README.md b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/README.md new file mode 100644 index 000000000000..059f22d10389 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/README.md @@ -0,0 +1,354 @@ +# rubyzip + +[![Gem Version](https://badge.fury.io/rb/rubyzip.svg)](http://badge.fury.io/rb/rubyzip) +[![Build Status](https://secure.travis-ci.org/rubyzip/rubyzip.svg)](http://travis-ci.org/rubyzip/rubyzip) +[![Code Climate](https://codeclimate.com/github/rubyzip/rubyzip.svg)](https://codeclimate.com/github/rubyzip/rubyzip) +[![Coverage Status](https://img.shields.io/coveralls/rubyzip/rubyzip.svg)](https://coveralls.io/r/rubyzip/rubyzip?branch=master) + +Rubyzip is a ruby library for reading and writing zip files. + +## Important note + +The Rubyzip interface has changed!!! No need to do `require "zip/zip"` and `Zip` prefix in class names removed. + +If you have issues with any third-party gems that require an old version of rubyzip, you can use this workaround: + +```ruby +gem 'rubyzip', '>= 1.0.0' # will load new rubyzip version +gem 'zip-zip' # will load compatibility for old rubyzip API. +``` + +## Requirements + +- Ruby 2.4 or greater (for rubyzip 2.0; use 1.x for older rubies) + +## Installation + +Rubyzip is available on RubyGems: + +``` +gem install rubyzip +``` + +Or in your Gemfile: + +```ruby +gem 'rubyzip' +``` + +## Usage + +### Basic zip archive creation + +```ruby +require 'rubygems' +require 'zip' + +folder = "Users/me/Desktop/stuff_to_zip" +input_filenames = ['image.jpg', 'description.txt', 'stats.csv'] + +zipfile_name = "/Users/me/Desktop/archive.zip" + +Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile| + input_filenames.each do |filename| + # Two arguments: + # - The name of the file as it will appear in the archive + # - The original file, including the path to find it + zipfile.add(filename, File.join(folder, filename)) + end + zipfile.get_output_stream("myFile") { |f| f.write "myFile contains just this" } +end +``` + +### Zipping a directory recursively + +Copy from [here](https://github.com/rubyzip/rubyzip/blob/9d891f7353e66052283562d3e252fe380bb4b199/samples/example_recursive.rb) + +```ruby +require 'zip' + +# This is a simple example which uses rubyzip to +# recursively generate a zip file from the contents of +# a specified directory. The directory itself is not +# included in the archive, rather just its contents. +# +# Usage: +# directory_to_zip = "/tmp/input" +# output_file = "/tmp/out.zip" +# zf = ZipFileGenerator.new(directory_to_zip, output_file) +# zf.write() +class ZipFileGenerator + # Initialize with the directory to zip and the location of the output archive. + def initialize(input_dir, output_file) + @input_dir = input_dir + @output_file = output_file + end + + # Zip the input directory. + def write + entries = Dir.entries(@input_dir) - %w[. ..] + + ::Zip::File.open(@output_file, ::Zip::File::CREATE) do |zipfile| + write_entries entries, '', zipfile + end + end + + private + + # A helper method to make the recursion work. + def write_entries(entries, path, zipfile) + entries.each do |e| + zipfile_path = path == '' ? e : File.join(path, e) + disk_file_path = File.join(@input_dir, zipfile_path) + + if File.directory? disk_file_path + recursively_deflate_directory(disk_file_path, zipfile, zipfile_path) + else + put_into_archive(disk_file_path, zipfile, zipfile_path) + end + end + end + + def recursively_deflate_directory(disk_file_path, zipfile, zipfile_path) + zipfile.mkdir zipfile_path + subdir = Dir.entries(disk_file_path) - %w[. ..] + write_entries subdir, zipfile_path, zipfile + end + + def put_into_archive(disk_file_path, zipfile, zipfile_path) + zipfile.add(zipfile_path, disk_file_path) + end +end +``` + +### Save zip archive entries in sorted by name state + +To save zip archives in sorted order like below, you need to set `::Zip.sort_entries` to `true` + +``` +Vegetable/ +Vegetable/bean +Vegetable/carrot +Vegetable/celery +fruit/ +fruit/apple +fruit/kiwi +fruit/mango +fruit/orange +``` + +After this, entries in the zip archive will be saved in ordered state. + +### Default permissions of zip archives + +On Posix file systems the default file permissions applied to a new archive +are (0666 - umask), which mimics the behavior of standard tools such as `touch`. + +On Windows the default file permissions are set to 0644 as suggested by the +[Ruby File documentation](http://ruby-doc.org/core-2.2.2/File.html). + +When modifying a zip archive the file permissions of the archive are preserved. + +### Reading a Zip file + +```ruby +MAX_SIZE = 1024**2 # 1MiB (but of course you can increase this) +Zip::File.open('foo.zip') do |zip_file| + # Handle entries one by one + zip_file.each do |entry| + puts "Extracting #{entry.name}" + raise 'File too large when extracted' if entry.size > MAX_SIZE + + # Extract to file or directory based on name in the archive + entry.extract + + # Read into memory + content = entry.get_input_stream.read + end + + # Find specific entry + entry = zip_file.glob('*.csv').first + raise 'File too large when extracted' if entry.size > MAX_SIZE + puts entry.get_input_stream.read +end +``` + +#### Notice about ::Zip::InputStream + +`::Zip::InputStream` usable for fast reading zip file content because it not read Central directory. + +But there is one exception when it is not working - General Purpose Flag Bit 3. + +> If bit 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the header is written. The fields in the local header are filled with zero, and the CRC-32 and size are appended in a 12-byte structure (optionally preceded by a 4-byte signature) immediately after the compressed data + +If `::Zip::InputStream` finds such entry in the zip archive it will raise an exception. + +### Password Protection (Experimental) + +Rubyzip supports reading/writing zip files with traditional zip encryption (a.k.a. "ZipCrypto"). AES encryption is not yet supported. It can be used with buffer streams, e.g.: + +```ruby +Zip::OutputStream.write_buffer(::StringIO.new(''), Zip::TraditionalEncrypter.new('password')) do |out| + out.put_next_entry("my_file.txt") + out.write my_data +end.string +``` + +This is an experimental feature and the interface for encryption may change in future versions. + +## Known issues + +### Modify docx file with rubyzip + +Use `write_buffer` instead `open`. Thanks to @jondruse + +```ruby +buffer = Zip::OutputStream.write_buffer do |out| + @zip_file.entries.each do |e| + unless [DOCUMENT_FILE_PATH, RELS_FILE_PATH].include?(e.name) + out.put_next_entry(e.name) + out.write e.get_input_stream.read + end + end + + out.put_next_entry(DOCUMENT_FILE_PATH) + out.write xml_doc.to_xml(:indent => 0).gsub("\n","") + + out.put_next_entry(RELS_FILE_PATH) + out.write rels.to_xml(:indent => 0).gsub("\n","") +end + +File.open(new_path, "wb") {|f| f.write(buffer.string) } +``` + +## Configuration + +### Existing Files + +By default, rubyzip will not overwrite files if they already exist inside of the extracted path. To change this behavior, you may specify a configuration option like so: + +```ruby +Zip.on_exists_proc = true +``` + +If you're using rubyzip with rails, consider placing this snippet of code in an initializer file such as `config/initializers/rubyzip.rb` + +Additionally, if you want to configure rubyzip to overwrite existing files while creating a .zip file, you can do so with the following: + +```ruby +Zip.continue_on_exists_proc = true +``` + +### Non-ASCII Names + +If you want to store non-english names and want to open them on Windows(pre 7) you need to set this option: + +```ruby +Zip.unicode_names = true +``` + +Sometimes file names inside zip contain non-ASCII characters. If you can assume which encoding was used for such names and want to be able to find such entries using `find_entry` then you can force assumed encoding like so: + +```ruby +Zip.force_entry_names_encoding = 'UTF-8' +``` + +Allowed encoding names are the same as accepted by `String#force_encoding` + +### Date Validation + +Some zip files might have an invalid date format, which will raise a warning. You can hide this warning with the following setting: + +```ruby +Zip.warn_invalid_date = false +``` + +### Size Validation + +By default (in rubyzip >= 2.0), rubyzip's `extract` method checks that an entry's reported uncompressed size is not (significantly) smaller than its actual size. This is to help you protect your application against [zip bombs](https://en.wikipedia.org/wiki/Zip_bomb). Before `extract`ing an entry, you should check that its size is in the range you expect. For example, if your application supports processing up to 100 files at once, each up to 10MiB, your zip extraction code might look like: + +```ruby +MAX_FILE_SIZE = 10 * 1024**2 # 10MiB +MAX_FILES = 100 +Zip::File.open('foo.zip') do |zip_file| + num_files = 0 + zip_file.each do |entry| + num_files += 1 if entry.file? + raise 'Too many extracted files' if num_files > MAX_FILES + raise 'File too large when extracted' if entry.size > MAX_FILE_SIZE + entry.extract + end +end +``` + +If you need to extract zip files that report incorrect uncompressed sizes and you really trust them not too be too large, you can disable this setting with +```ruby +Zip.validate_entry_sizes = false +``` + +Note that if you use the lower level `Zip::InputStream` interface, `rubyzip` does *not* check the entry `size`s. In this case, the caller is responsible for making sure it does not read more data than expected from the input stream. + +### Default Compression + +You can set the default compression level like so: + +```ruby +Zip.default_compression = Zlib::DEFAULT_COMPRESSION +``` + +It defaults to `Zlib::DEFAULT_COMPRESSION`. Possible values are `Zlib::BEST_COMPRESSION`, `Zlib::DEFAULT_COMPRESSION` and `Zlib::NO_COMPRESSION` + +### Zip64 Support + +By default, Zip64 support is disabled for writing. To enable it do this: + +```ruby +Zip.write_zip64_support = true +``` + +_NOTE_: If you will enable Zip64 writing then you will need zip extractor with Zip64 support to extract archive. + +### Block Form + +You can set multiple settings at the same time by using a block: + +```ruby + Zip.setup do |c| + c.on_exists_proc = true + c.continue_on_exists_proc = true + c.unicode_names = true + c.default_compression = Zlib::BEST_COMPRESSION + end +``` + +## Developing + +To run the test you need to do this: + +``` +bundle install +rake +``` + +## Website and Project Home + +http://github.com/rubyzip/rubyzip + +http://rdoc.info/github/rubyzip/rubyzip/master/frames + +## Authors + +Alexander Simonov ( alex at simonov.me) + +Alan Harper ( alan at aussiegeek.net) + +Thomas Sondergaard (thomas at sondergaard.cc) + +Technorama Ltd. (oss-ruby-zip at technorama.net) + +extra-field support contributed by Tatsuki Sugiura (sugi at nemui.org) + +## License + +Rubyzip is distributed under the same license as ruby. See +http://www.ruby-lang.org/en/LICENSE.txt diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/Rakefile new file mode 100644 index 000000000000..717c6b735f7c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/Rakefile @@ -0,0 +1,21 @@ +require 'bundler/gem_tasks' +require 'rake/testtask' +require 'rubocop/rake_task' + +task default: :test + +Rake::TestTask.new(:test) do |test| + test.libs << 'lib' + test.libs << 'test' + test.pattern = 'test/**/*_test.rb' + test.verbose = true +end + +RuboCop::RakeTask.new + +# Rake::TestTask.new(:zip64_full_test) do |test| +# test.libs << File.join(File.dirname(__FILE__), 'lib') +# test.libs << File.join(File.dirname(__FILE__), 'test') +# test.pattern = File.join(File.dirname(__FILE__), 'test/zip64_full_test.rb') +# test.verbose = true +# end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/TODO b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/TODO new file mode 100644 index 000000000000..16b9a2e7987c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/TODO @@ -0,0 +1,15 @@ + +* ZipInputStream: Support zip-files with trailing data descriptors +* Adjust rdoc stylesheet to advertise inherited methods if possible +* Suggestion: Add ZipFile/ZipInputStream example that demonstrates extracting all entries. +* Suggestion: ZipFile#extract destination should default to "." +* Suggestion: ZipEntry should have extract(), get_input_stream() methods etc +* (is buffering used anywhere with write?) +* Inflater.sysread should pass the buffer to produce_input. +* Implement ZipFsDir.glob +* ZipFile.checkIntegrity method +* non-MSDOS permission attributes +** See mail from Ned Konz to ruby-talk subj. "Re: SV: [ANN] Archive 0.2" +* Packager version, required unpacker version in zip headers +** See mail from Ned Konz to ruby-talk subj. "Re: SV: [ANN] Archive 0.2" +* implement storing attributes and ownership information diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip.rb new file mode 100644 index 000000000000..8cf982a5a1e0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip.rb @@ -0,0 +1,72 @@ +require 'English' +require 'delegate' +require 'singleton' +require 'tempfile' +require 'fileutils' +require 'stringio' +require 'zlib' +require 'zip/constants' +require 'zip/dos_time' +require 'zip/ioextras' +require 'rbconfig' +require 'zip/entry' +require 'zip/extra_field' +require 'zip/entry_set' +require 'zip/central_directory' +require 'zip/file' +require 'zip/input_stream' +require 'zip/output_stream' +require 'zip/decompressor' +require 'zip/compressor' +require 'zip/null_decompressor' +require 'zip/null_compressor' +require 'zip/null_input_stream' +require 'zip/pass_thru_compressor' +require 'zip/pass_thru_decompressor' +require 'zip/crypto/decrypted_io' +require 'zip/crypto/encryption' +require 'zip/crypto/null_encryption' +require 'zip/crypto/traditional_encryption' +require 'zip/inflater' +require 'zip/deflater' +require 'zip/streamable_stream' +require 'zip/streamable_directory' +require 'zip/errors' + +module Zip + extend self + attr_accessor :unicode_names, + :on_exists_proc, + :continue_on_exists_proc, + :sort_entries, + :default_compression, + :write_zip64_support, + :warn_invalid_date, + :case_insensitive_match, + :force_entry_names_encoding, + :validate_entry_sizes + + def reset! + @_ran_once = false + @unicode_names = false + @on_exists_proc = false + @continue_on_exists_proc = false + @sort_entries = false + @default_compression = ::Zlib::DEFAULT_COMPRESSION + @write_zip64_support = false + @warn_invalid_date = true + @case_insensitive_match = false + @validate_entry_sizes = true + end + + def setup + yield self unless @_ran_once + @_ran_once = true + end + + reset! +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/central_directory.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/central_directory.rb new file mode 100644 index 000000000000..9975884c6f14 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/central_directory.rb @@ -0,0 +1,212 @@ +module Zip + class CentralDirectory + include Enumerable + + END_OF_CDS = 0x06054b50 + ZIP64_END_OF_CDS = 0x06064b50 + ZIP64_EOCD_LOCATOR = 0x07064b50 + MAX_END_OF_CDS_SIZE = 65_536 + 18 + STATIC_EOCD_SIZE = 22 + + attr_reader :comment + + # Returns an Enumerable containing the entries. + def entries + @entry_set.entries + end + + def initialize(entries = EntrySet.new, comment = '') #:nodoc: + super() + @entry_set = entries.kind_of?(EntrySet) ? entries : EntrySet.new(entries) + @comment = comment + end + + def write_to_stream(io) #:nodoc: + cdir_offset = io.tell + @entry_set.each { |entry| entry.write_c_dir_entry(io) } + eocd_offset = io.tell + cdir_size = eocd_offset - cdir_offset + if ::Zip.write_zip64_support + need_zip64_eocd = cdir_offset > 0xFFFFFFFF || cdir_size > 0xFFFFFFFF || @entry_set.size > 0xFFFF + need_zip64_eocd ||= @entry_set.any? { |entry| entry.extra['Zip64'] } + if need_zip64_eocd + write_64_e_o_c_d(io, cdir_offset, cdir_size) + write_64_eocd_locator(io, eocd_offset) + end + end + write_e_o_c_d(io, cdir_offset, cdir_size) + end + + def write_e_o_c_d(io, offset, cdir_size) #:nodoc: + tmp = [ + END_OF_CDS, + 0, # @numberOfThisDisk + 0, # @numberOfDiskWithStartOfCDir + @entry_set ? [@entry_set.size, 0xFFFF].min : 0, + @entry_set ? [@entry_set.size, 0xFFFF].min : 0, + [cdir_size, 0xFFFFFFFF].min, + [offset, 0xFFFFFFFF].min, + @comment ? @comment.bytesize : 0 + ] + io << tmp.pack('VvvvvVVv') + io << @comment + end + + private :write_e_o_c_d + + def write_64_e_o_c_d(io, offset, cdir_size) #:nodoc: + tmp = [ + ZIP64_END_OF_CDS, + 44, # size of zip64 end of central directory record (excludes signature and field itself) + VERSION_MADE_BY, + VERSION_NEEDED_TO_EXTRACT_ZIP64, + 0, # @numberOfThisDisk + 0, # @numberOfDiskWithStartOfCDir + @entry_set ? @entry_set.size : 0, # number of entries on this disk + @entry_set ? @entry_set.size : 0, # number of entries total + cdir_size, # size of central directory + offset # offset of start of central directory in its disk + ] + io << tmp.pack('VQ<vvVVQ<Q<Q<Q<') + end + + private :write_64_e_o_c_d + + def write_64_eocd_locator(io, zip64_eocd_offset) + tmp = [ + ZIP64_EOCD_LOCATOR, + 0, # number of disk containing the start of zip64 eocd record + zip64_eocd_offset, # offset of the start of zip64 eocd record in its disk + 1 # total number of disks + ] + io << tmp.pack('VVQ<V') + end + + private :write_64_eocd_locator + + def read_64_e_o_c_d(buf) #:nodoc: + buf = get_64_e_o_c_d(buf) + @size_of_zip64_e_o_c_d = Entry.read_zip_64_long(buf) + @version_made_by = Entry.read_zip_short(buf) + @version_needed_for_extract = Entry.read_zip_short(buf) + @number_of_this_disk = Entry.read_zip_long(buf) + @number_of_disk_with_start_of_cdir = Entry.read_zip_long(buf) + @total_number_of_entries_in_cdir_on_this_disk = Entry.read_zip_64_long(buf) + @size = Entry.read_zip_64_long(buf) + @size_in_bytes = Entry.read_zip_64_long(buf) + @cdir_offset = Entry.read_zip_64_long(buf) + @zip_64_extensible = buf.slice!(0, buf.bytesize) + raise Error, 'Zip consistency problem while reading eocd structure' unless buf.empty? + end + + def read_e_o_c_d(buf) #:nodoc: + buf = get_e_o_c_d(buf) + @number_of_this_disk = Entry.read_zip_short(buf) + @number_of_disk_with_start_of_cdir = Entry.read_zip_short(buf) + @total_number_of_entries_in_cdir_on_this_disk = Entry.read_zip_short(buf) + @size = Entry.read_zip_short(buf) + @size_in_bytes = Entry.read_zip_long(buf) + @cdir_offset = Entry.read_zip_long(buf) + comment_length = Entry.read_zip_short(buf) + @comment = if comment_length.to_i <= 0 + buf.slice!(0, buf.size) + else + buf.read(comment_length) + end + raise Error, 'Zip consistency problem while reading eocd structure' unless buf.empty? + end + + def read_central_directory_entries(io) #:nodoc: + begin + io.seek(@cdir_offset, IO::SEEK_SET) + rescue Errno::EINVAL + raise Error, 'Zip consistency problem while reading central directory entry' + end + @entry_set = EntrySet.new + @size.times do + @entry_set << Entry.read_c_dir_entry(io) + end + end + + def read_from_stream(io) #:nodoc: + buf = start_buf(io) + if zip64_file?(buf) + read_64_e_o_c_d(buf) + else + read_e_o_c_d(buf) + end + read_central_directory_entries(io) + end + + def get_e_o_c_d(buf) #:nodoc: + sig_index = buf.rindex([END_OF_CDS].pack('V')) + raise Error, 'Zip end of central directory signature not found' unless sig_index + + buf = buf.slice!((sig_index + 4)..(buf.bytesize)) + + def buf.read(count) + slice!(0, count) + end + + buf + end + + def zip64_file?(buf) + buf.rindex([ZIP64_END_OF_CDS].pack('V')) && buf.rindex([ZIP64_EOCD_LOCATOR].pack('V')) + end + + def start_buf(io) + begin + io.seek(-MAX_END_OF_CDS_SIZE, IO::SEEK_END) + rescue Errno::EINVAL + io.seek(0, IO::SEEK_SET) + end + io.read + end + + def get_64_e_o_c_d(buf) #:nodoc: + zip_64_start = buf.rindex([ZIP64_END_OF_CDS].pack('V')) + raise Error, 'Zip64 end of central directory signature not found' unless zip_64_start + + zip_64_locator = buf.rindex([ZIP64_EOCD_LOCATOR].pack('V')) + raise Error, 'Zip64 end of central directory signature locator not found' unless zip_64_locator + + buf = buf.slice!((zip_64_start + 4)..zip_64_locator) + + def buf.read(count) + slice!(0, count) + end + + buf + end + + # For iterating over the entries. + def each(&a_proc) + @entry_set.each(&a_proc) + end + + # Returns the number of entries in the central directory (and + # consequently in the zip archive). + def size + @entry_set.size + end + + def self.read_from_stream(io) #:nodoc: + cdir = new + cdir.read_from_stream(io) + cdir + rescue Error + nil + end + + def ==(other) #:nodoc: + return false unless other.kind_of?(CentralDirectory) + + @entry_set.entries.sort == other.entries.sort && comment == other.comment + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/compressor.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/compressor.rb new file mode 100644 index 000000000000..079c1cb07078 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/compressor.rb @@ -0,0 +1,9 @@ +module Zip + class Compressor #:nodoc:all + def finish; end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/constants.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/constants.rb new file mode 100644 index 000000000000..fe89847a6263 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/constants.rb @@ -0,0 +1,115 @@ +module Zip + RUNNING_ON_WINDOWS = RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/i + + CENTRAL_DIRECTORY_ENTRY_SIGNATURE = 0x02014b50 + CDIR_ENTRY_STATIC_HEADER_LENGTH = 46 + + LOCAL_ENTRY_SIGNATURE = 0x04034b50 + LOCAL_ENTRY_STATIC_HEADER_LENGTH = 30 + LOCAL_ENTRY_TRAILING_DESCRIPTOR_LENGTH = 4 + 4 + 4 + VERSION_MADE_BY = 52 # this library's version + VERSION_NEEDED_TO_EXTRACT = 20 + VERSION_NEEDED_TO_EXTRACT_ZIP64 = 45 + + FILE_TYPE_FILE = 0o10 + FILE_TYPE_DIR = 0o04 + FILE_TYPE_SYMLINK = 0o12 + + FSTYPE_FAT = 0 + FSTYPE_AMIGA = 1 + FSTYPE_VMS = 2 + FSTYPE_UNIX = 3 + FSTYPE_VM_CMS = 4 + FSTYPE_ATARI = 5 + FSTYPE_HPFS = 6 + FSTYPE_MAC = 7 + FSTYPE_Z_SYSTEM = 8 + FSTYPE_CPM = 9 + FSTYPE_TOPS20 = 10 + FSTYPE_NTFS = 11 + FSTYPE_QDOS = 12 + FSTYPE_ACORN = 13 + FSTYPE_VFAT = 14 + FSTYPE_MVS = 15 + FSTYPE_BEOS = 16 + FSTYPE_TANDEM = 17 + FSTYPE_THEOS = 18 + FSTYPE_MAC_OSX = 19 + FSTYPE_ATHEOS = 30 + + FSTYPES = { + FSTYPE_FAT => 'FAT'.freeze, + FSTYPE_AMIGA => 'Amiga'.freeze, + FSTYPE_VMS => 'VMS (Vax or Alpha AXP)'.freeze, + FSTYPE_UNIX => 'Unix'.freeze, + FSTYPE_VM_CMS => 'VM/CMS'.freeze, + FSTYPE_ATARI => 'Atari ST'.freeze, + FSTYPE_HPFS => 'OS/2 or NT HPFS'.freeze, + FSTYPE_MAC => 'Macintosh'.freeze, + FSTYPE_Z_SYSTEM => 'Z-System'.freeze, + FSTYPE_CPM => 'CP/M'.freeze, + FSTYPE_TOPS20 => 'TOPS-20'.freeze, + FSTYPE_NTFS => 'NTFS'.freeze, + FSTYPE_QDOS => 'SMS/QDOS'.freeze, + FSTYPE_ACORN => 'Acorn RISC OS'.freeze, + FSTYPE_VFAT => 'Win32 VFAT'.freeze, + FSTYPE_MVS => 'MVS'.freeze, + FSTYPE_BEOS => 'BeOS'.freeze, + FSTYPE_TANDEM => 'Tandem NSK'.freeze, + FSTYPE_THEOS => 'Theos'.freeze, + FSTYPE_MAC_OSX => 'Mac OS/X (Darwin)'.freeze, + FSTYPE_ATHEOS => 'AtheOS'.freeze + }.freeze + + COMPRESSION_METHOD_STORE = 0 + COMPRESSION_METHOD_SHRINK = 1 + COMPRESSION_METHOD_REDUCE_1 = 2 + COMPRESSION_METHOD_REDUCE_2 = 3 + COMPRESSION_METHOD_REDUCE_3 = 4 + COMPRESSION_METHOD_REDUCE_4 = 5 + COMPRESSION_METHOD_IMPLODE = 6 + # RESERVED = 7 + COMPRESSION_METHOD_DEFLATE = 8 + COMPRESSION_METHOD_DEFLATE_64 = 9 + COMPRESSION_METHOD_PKWARE_DCLI = 10 + # RESERVED = 11 + COMPRESSION_METHOD_BZIP2 = 12 + # RESERVED = 13 + COMPRESSION_METHOD_LZMA = 14 + # RESERVED = 15 + COMPRESSION_METHOD_IBM_CMPSC = 16 + # RESERVED = 17 + COMPRESSION_METHOD_IBM_TERSE = 18 + COMPRESSION_METHOD_IBM_LZ77 = 19 + COMPRESSION_METHOD_JPEG = 96 + COMPRESSION_METHOD_WAVPACK = 97 + COMPRESSION_METHOD_PPMD = 98 + COMPRESSION_METHOD_AES = 99 + + COMPRESSION_METHODS = { + COMPRESSION_METHOD_STORE => 'Store (no compression)', + COMPRESSION_METHOD_SHRINK => 'Shrink', + COMPRESSION_METHOD_REDUCE_1 => 'Reduce with compression factor 1', + COMPRESSION_METHOD_REDUCE_2 => 'Reduce with compression factor 2', + COMPRESSION_METHOD_REDUCE_3 => 'Reduce with compression factor 3', + COMPRESSION_METHOD_REDUCE_4 => 'Reduce with compression factor 4', + COMPRESSION_METHOD_IMPLODE => 'Implode', + # RESERVED = 7 + COMPRESSION_METHOD_DEFLATE => 'Deflate', + COMPRESSION_METHOD_DEFLATE_64 => 'Deflate64(tm)', + COMPRESSION_METHOD_PKWARE_DCLI => 'PKWARE Data Compression Library Imploding (old IBM TERSE)', + # RESERVED = 11 + COMPRESSION_METHOD_BZIP2 => 'BZIP2', + # RESERVED = 13 + COMPRESSION_METHOD_LZMA => 'LZMA', + # RESERVED = 15 + COMPRESSION_METHOD_IBM_CMPSC => 'IBM z/OS CMPSC Compression', + # RESERVED = 17 + COMPRESSION_METHOD_IBM_TERSE => 'IBM TERSE (new)', + COMPRESSION_METHOD_IBM_LZ77 => 'IBM LZ77 z Architecture (PFS)', + COMPRESSION_METHOD_JPEG => 'JPEG variant', + COMPRESSION_METHOD_WAVPACK => 'WavPack compressed data', + COMPRESSION_METHOD_PPMD => 'PPMd version I, Rev 1', + COMPRESSION_METHOD_AES => 'AES encryption' + }.freeze +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/decrypted_io.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/decrypted_io.rb new file mode 100644 index 000000000000..61a377dae00b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/decrypted_io.rb @@ -0,0 +1,40 @@ +module Zip + class DecryptedIo #:nodoc:all + CHUNK_SIZE = 32_768 + + def initialize(io, decrypter) + @io = io + @decrypter = decrypter + end + + def read(length = nil, outbuf = +'') + return (length.nil? || length.zero? ? '' : nil) if eof + + while length.nil? || (buffer.bytesize < length) + break if input_finished? + + buffer << produce_input + end + + outbuf.replace(buffer.slice!(0...(length || output_buffer.bytesize))) + end + + private + + def eof + buffer.empty? && input_finished? + end + + def buffer + @buffer ||= +'' + end + + def input_finished? + @io.eof + end + + def produce_input + @decrypter.decrypt(@io.read(CHUNK_SIZE)) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/encryption.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/encryption.rb new file mode 100644 index 000000000000..4351be1c3b9d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/encryption.rb @@ -0,0 +1,11 @@ +module Zip + class Encrypter #:nodoc:all + end + + class Decrypter + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/null_encryption.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/null_encryption.rb new file mode 100644 index 000000000000..a93f707c4c08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/null_encryption.rb @@ -0,0 +1,43 @@ +module Zip + module NullEncryption + def header_bytesize + 0 + end + + def gp_flags + 0 + end + end + + class NullEncrypter < Encrypter + include NullEncryption + + def header(_mtime) + '' + end + + def encrypt(data) + data + end + + def data_descriptor(_crc32, _compressed_size, _uncomprssed_size) + '' + end + + def reset!; end + end + + class NullDecrypter < Decrypter + include NullEncryption + + def decrypt(data) + data + end + + def reset!(_header); end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/traditional_encryption.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/traditional_encryption.rb new file mode 100644 index 000000000000..270e9efd8b58 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/crypto/traditional_encryption.rb @@ -0,0 +1,99 @@ +module Zip + module TraditionalEncryption + def initialize(password) + @password = password + reset_keys! + end + + def header_bytesize + 12 + end + + def gp_flags + 0x0001 | 0x0008 + end + + protected + + def reset_keys! + @key0 = 0x12345678 + @key1 = 0x23456789 + @key2 = 0x34567890 + @password.each_byte do |byte| + update_keys(byte.chr) + end + end + + def update_keys(num) + @key0 = ~Zlib.crc32(num, ~@key0) + @key1 = ((@key1 + (@key0 & 0xff)) * 134_775_813 + 1) & 0xffffffff + @key2 = ~Zlib.crc32((@key1 >> 24).chr, ~@key2) + end + + def decrypt_byte + temp = (@key2 & 0xffff) | 2 + ((temp * (temp ^ 1)) >> 8) & 0xff + end + end + + class TraditionalEncrypter < Encrypter + include TraditionalEncryption + + def header(mtime) + [].tap do |header| + (header_bytesize - 2).times do + header << Random.rand(0..255) + end + header << (mtime.to_binary_dos_time & 0xff) + header << (mtime.to_binary_dos_time >> 8) + end.map { |x| encode x }.pack('C*') + end + + def encrypt(data) + data.unpack('C*').map { |x| encode x }.pack('C*') + end + + def data_descriptor(crc32, compressed_size, uncomprssed_size) + [0x08074b50, crc32, compressed_size, uncomprssed_size].pack('VVVV') + end + + def reset! + reset_keys! + end + + private + + def encode(num) + t = decrypt_byte + update_keys(num.chr) + t ^ num + end + end + + class TraditionalDecrypter < Decrypter + include TraditionalEncryption + + def decrypt(data) + data.unpack('C*').map { |x| decode x }.pack('C*') + end + + def reset!(header) + reset_keys! + header.each_byte do |x| + decode x + end + end + + private + + def decode(num) + num ^= decrypt_byte + update_keys(num.chr) + num + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/decompressor.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/decompressor.rb new file mode 100644 index 000000000000..2f89545c1569 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/decompressor.rb @@ -0,0 +1,31 @@ +module Zip + class Decompressor #:nodoc:all + CHUNK_SIZE = 32_768 + + def self.decompressor_classes + @decompressor_classes ||= {} + end + + def self.register(compression_method, decompressor_class) + decompressor_classes[compression_method] = decompressor_class + end + + def self.find_by_compression_method(compression_method) + decompressor_classes[compression_method] + end + + attr_reader :input_stream + attr_reader :decompressed_size + + def initialize(input_stream, decompressed_size = nil) + super() + + @input_stream = input_stream + @decompressed_size = decompressed_size + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/deflater.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/deflater.rb new file mode 100644 index 000000000000..8509cf474186 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/deflater.rb @@ -0,0 +1,34 @@ +module Zip + class Deflater < Compressor #:nodoc:all + def initialize(output_stream, level = Zip.default_compression, encrypter = NullEncrypter.new) + super() + @output_stream = output_stream + @zlib_deflater = ::Zlib::Deflate.new(level, -::Zlib::MAX_WBITS) + @size = 0 + @crc = ::Zlib.crc32 + @encrypter = encrypter + end + + def <<(data) + val = data.to_s + @crc = Zlib.crc32(val, @crc) + @size += val.bytesize + buffer = @zlib_deflater.deflate(data) + if buffer.empty? + @output_stream + else + @output_stream << @encrypter.encrypt(buffer) + end + end + + def finish + @output_stream << @encrypter.encrypt(@zlib_deflater.finish) until @zlib_deflater.finished? + end + + attr_reader :size, :crc + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/dos_time.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/dos_time.rb new file mode 100644 index 000000000000..1d77aa4054c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/dos_time.rb @@ -0,0 +1,53 @@ +module Zip + class DOSTime < Time #:nodoc:all + # MS-DOS File Date and Time format as used in Interrupt 21H Function 57H: + + # Register CX, the Time: + # Bits 0-4 2 second increments (0-29) + # Bits 5-10 minutes (0-59) + # bits 11-15 hours (0-24) + + # Register DX, the Date: + # Bits 0-4 day (1-31) + # bits 5-8 month (1-12) + # bits 9-15 year (four digit year minus 1980) + + def to_binary_dos_time + (sec / 2) + + (min << 5) + + (hour << 11) + end + + def to_binary_dos_date + day + + (month << 5) + + ((year - 1980) << 9) + end + + # Dos time is only stored with two seconds accuracy + def dos_equals(other) + to_i / 2 == other.to_i / 2 + end + + # Create a DOSTime instance from a vanilla Time instance. + def self.from_time(time) + local(time.year, time.month, time.day, time.hour, time.min, time.sec) + end + + def self.parse_binary_dos_format(bin_dos_date, bin_dos_time) + second = 2 * (0b11111 & bin_dos_time) + minute = (0b11111100000 & bin_dos_time) >> 5 + hour = (0b1111100000000000 & bin_dos_time) >> 11 + day = (0b11111 & bin_dos_date) + month = (0b111100000 & bin_dos_date) >> 5 + year = ((0b1111111000000000 & bin_dos_date) >> 9) + 1980 + begin + local(year, month, day, hour, minute, second) + end + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/entry.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/entry.rb new file mode 100644 index 000000000000..a67c65685fb7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/entry.rb @@ -0,0 +1,719 @@ +require 'pathname' +module Zip + class Entry + STORED = 0 + DEFLATED = 8 + # Language encoding flag (EFS) bit + EFS = 0b100000000000 + + attr_accessor :comment, :compressed_size, :crc, :extra, :compression_method, + :name, :size, :local_header_offset, :zipfile, :fstype, :external_file_attributes, + :internal_file_attributes, + :gp_flags, :header_signature, :follow_symlinks, + :restore_times, :restore_permissions, :restore_ownership, + :unix_uid, :unix_gid, :unix_perms, + :dirty + attr_reader :ftype, :filepath # :nodoc: + + def set_default_vars_values + @local_header_offset = 0 + @local_header_size = nil # not known until local entry is created or read + @internal_file_attributes = 1 + @external_file_attributes = 0 + @header_signature = ::Zip::CENTRAL_DIRECTORY_ENTRY_SIGNATURE + + @version_needed_to_extract = VERSION_NEEDED_TO_EXTRACT + @version = VERSION_MADE_BY + + @ftype = nil # unspecified or unknown + @filepath = nil + @gp_flags = 0 + if ::Zip.unicode_names + @gp_flags |= EFS + @version = 63 + end + @follow_symlinks = false + + @restore_times = false + @restore_permissions = false + @restore_ownership = false + # BUG: need an extra field to support uid/gid's + @unix_uid = nil + @unix_gid = nil + @unix_perms = nil + # @posix_acl = nil + # @ntfs_acl = nil + @dirty = false + end + + def check_name(name) + return unless name.start_with?('/') + + raise ::Zip::EntryNameError, "Illegal ZipEntry name '#{name}', name must not start with /" + end + + def initialize(*args) + name = args[1] || '' + check_name(name) + + set_default_vars_values + @fstype = ::Zip::RUNNING_ON_WINDOWS ? ::Zip::FSTYPE_FAT : ::Zip::FSTYPE_UNIX + + @zipfile = args[0] || '' + @name = name + @comment = args[2] || '' + @extra = args[3] || '' + @compressed_size = args[4] || 0 + @crc = args[5] || 0 + @compression_method = args[6] || ::Zip::Entry::DEFLATED + @size = args[7] || 0 + @time = args[8] || ::Zip::DOSTime.now + + @ftype = name_is_directory? ? :directory : :file + @extra = ::Zip::ExtraField.new(@extra.to_s) unless @extra.kind_of?(::Zip::ExtraField) + end + + def encrypted? + gp_flags & 1 == 1 + end + + def incomplete? + gp_flags & 8 == 8 + end + + def time + if @extra['UniversalTime'] + @extra['UniversalTime'].mtime + elsif @extra['NTFS'] + @extra['NTFS'].mtime + else + # Standard time field in central directory has local time + # under archive creator. Then, we can't get timezone. + @time + end + end + + alias mtime time + + def time=(value) + unless @extra.member?('UniversalTime') || @extra.member?('NTFS') + @extra.create('UniversalTime') + end + (@extra['UniversalTime'] || @extra['NTFS']).mtime = value + @time = value + end + + def file_type_is?(type) + raise InternalError, "current filetype is unknown: #{inspect}" unless @ftype + + @ftype == type + end + + # Dynamic checkers + %w[directory file symlink].each do |k| + define_method "#{k}?" do + file_type_is?(k.to_sym) + end + end + + def name_is_directory? #:nodoc:all + @name.end_with?('/') + end + + # Is the name a relative path, free of `..` patterns that could lead to + # path traversal attacks? This does NOT handle symlinks; if the path + # contains symlinks, this check is NOT enough to guarantee safety. + def name_safe? + cleanpath = Pathname.new(@name).cleanpath + return false unless cleanpath.relative? + + root = ::File::SEPARATOR + naive_expanded_path = ::File.join(root, cleanpath.to_s) + ::File.absolute_path(cleanpath.to_s, root) == naive_expanded_path + end + + def local_entry_offset #:nodoc:all + local_header_offset + @local_header_size + end + + def name_size + @name ? @name.bytesize : 0 + end + + def extra_size + @extra ? @extra.local_size : 0 + end + + def comment_size + @comment ? @comment.bytesize : 0 + end + + def calculate_local_header_size #:nodoc:all + LOCAL_ENTRY_STATIC_HEADER_LENGTH + name_size + extra_size + end + + # check before rewriting an entry (after file sizes are known) + # that we didn't change the header size (and thus clobber file data or something) + def verify_local_header_size! + return if @local_header_size.nil? + + new_size = calculate_local_header_size + raise Error, "local header size changed (#{@local_header_size} -> #{new_size})" if @local_header_size != new_size + end + + def cdir_header_size #:nodoc:all + CDIR_ENTRY_STATIC_HEADER_LENGTH + name_size + + (@extra ? @extra.c_dir_size : 0) + comment_size + end + + def next_header_offset #:nodoc:all + local_entry_offset + compressed_size + data_descriptor_size + end + + # Extracts entry to file dest_path (defaults to @name). + # NB: The caller is responsible for making sure dest_path is safe, if it + # is passed. + def extract(dest_path = nil, &block) + if dest_path.nil? && !name_safe? + warn "WARNING: skipped '#{@name}' as unsafe." + return self + end + + dest_path ||= @name + block ||= proc { ::Zip.on_exists_proc } + + raise "unknown file type #{inspect}" unless directory? || file? || symlink? + + __send__("create_#{@ftype}", dest_path, &block) + self + end + + def to_s + @name + end + + class << self + def read_zip_short(io) # :nodoc: + io.read(2).unpack1('v') + end + + def read_zip_long(io) # :nodoc: + io.read(4).unpack1('V') + end + + def read_zip_64_long(io) # :nodoc: + io.read(8).unpack1('Q<') + end + + def read_c_dir_entry(io) #:nodoc:all + path = if io.respond_to?(:path) + io.path + else + io + end + entry = new(path) + entry.read_c_dir_entry(io) + entry + rescue Error + nil + end + + def read_local_entry(io) + entry = new(io) + entry.read_local_entry(io) + entry + rescue Error + nil + end + end + + def unpack_local_entry(buf) + @header_signature, + @version, + @fstype, + @gp_flags, + @compression_method, + @last_mod_time, + @last_mod_date, + @crc, + @compressed_size, + @size, + @name_length, + @extra_length = buf.unpack('VCCvvvvVVVvv') + end + + def read_local_entry(io) #:nodoc:all + @local_header_offset = io.tell + + static_sized_fields_buf = io.read(::Zip::LOCAL_ENTRY_STATIC_HEADER_LENGTH) || '' + + unless static_sized_fields_buf.bytesize == ::Zip::LOCAL_ENTRY_STATIC_HEADER_LENGTH + raise Error, 'Premature end of file. Not enough data for zip entry local header' + end + + unpack_local_entry(static_sized_fields_buf) + + unless @header_signature == ::Zip::LOCAL_ENTRY_SIGNATURE + raise ::Zip::Error, "Zip local header magic not found at location '#{local_header_offset}'" + end + + set_time(@last_mod_date, @last_mod_time) + + @name = io.read(@name_length) + extra = io.read(@extra_length) + + @name.tr!('\\', '/') + if ::Zip.force_entry_names_encoding + @name.force_encoding(::Zip.force_entry_names_encoding) + end + + if extra && extra.bytesize != @extra_length + raise ::Zip::Error, 'Truncated local zip entry header' + end + + if @extra.kind_of?(::Zip::ExtraField) + @extra.merge(extra) if extra + else + @extra = ::Zip::ExtraField.new(extra) + end + + parse_zip64_extra(true) + @local_header_size = calculate_local_header_size + end + + def pack_local_entry + zip64 = @extra['Zip64'] + [::Zip::LOCAL_ENTRY_SIGNATURE, + @version_needed_to_extract, # version needed to extract + @gp_flags, # @gp_flags + @compression_method, + @time.to_binary_dos_time, # @last_mod_time + @time.to_binary_dos_date, # @last_mod_date + @crc, + zip64 && zip64.compressed_size ? 0xFFFFFFFF : @compressed_size, + zip64 && zip64.original_size ? 0xFFFFFFFF : @size, + name_size, + @extra ? @extra.local_size : 0].pack('VvvvvvVVVvv') + end + + def write_local_entry(io, rewrite = false) #:nodoc:all + prep_zip64_extra(true) + verify_local_header_size! if rewrite + @local_header_offset = io.tell + + io << pack_local_entry + + io << @name + io << @extra.to_local_bin if @extra + @local_header_size = io.tell - @local_header_offset + end + + def unpack_c_dir_entry(buf) + @header_signature, + @version, # version of encoding software + @fstype, # filesystem type + @version_needed_to_extract, + @gp_flags, + @compression_method, + @last_mod_time, + @last_mod_date, + @crc, + @compressed_size, + @size, + @name_length, + @extra_length, + @comment_length, + _, # diskNumberStart + @internal_file_attributes, + @external_file_attributes, + @local_header_offset, + @name, + @extra, + @comment = buf.unpack('VCCvvvvvVVVvvvvvVV') + end + + def set_ftype_from_c_dir_entry + @ftype = case @fstype + when ::Zip::FSTYPE_UNIX + @unix_perms = (@external_file_attributes >> 16) & 0o7777 + case (@external_file_attributes >> 28) + when ::Zip::FILE_TYPE_DIR + :directory + when ::Zip::FILE_TYPE_FILE + :file + when ::Zip::FILE_TYPE_SYMLINK + :symlink + else + # best case guess for whether it is a file or not + # Otherwise this would be set to unknown and that entry would never be able to extracted + if name_is_directory? + :directory + else + :file + end + end + else + if name_is_directory? + :directory + else + :file + end + end + end + + def check_c_dir_entry_static_header_length(buf) + return if buf.bytesize == ::Zip::CDIR_ENTRY_STATIC_HEADER_LENGTH + + raise Error, 'Premature end of file. Not enough data for zip cdir entry header' + end + + def check_c_dir_entry_signature + return if header_signature == ::Zip::CENTRAL_DIRECTORY_ENTRY_SIGNATURE + + raise Error, "Zip local header magic not found at location '#{local_header_offset}'" + end + + def check_c_dir_entry_comment_size + return if @comment && @comment.bytesize == @comment_length + + raise ::Zip::Error, 'Truncated cdir zip entry header' + end + + def read_c_dir_extra_field(io) + if @extra.kind_of?(::Zip::ExtraField) + @extra.merge(io.read(@extra_length)) + else + @extra = ::Zip::ExtraField.new(io.read(@extra_length)) + end + end + + def read_c_dir_entry(io) #:nodoc:all + static_sized_fields_buf = io.read(::Zip::CDIR_ENTRY_STATIC_HEADER_LENGTH) + check_c_dir_entry_static_header_length(static_sized_fields_buf) + unpack_c_dir_entry(static_sized_fields_buf) + check_c_dir_entry_signature + set_time(@last_mod_date, @last_mod_time) + @name = io.read(@name_length) + if ::Zip.force_entry_names_encoding + @name.force_encoding(::Zip.force_entry_names_encoding) + end + read_c_dir_extra_field(io) + @comment = io.read(@comment_length) + check_c_dir_entry_comment_size + set_ftype_from_c_dir_entry + parse_zip64_extra(false) + end + + def file_stat(path) # :nodoc: + if @follow_symlinks + ::File.stat(path) + else + ::File.lstat(path) + end + end + + def get_extra_attributes_from_path(path) # :nodoc: + return if Zip::RUNNING_ON_WINDOWS + + stat = file_stat(path) + @unix_uid = stat.uid + @unix_gid = stat.gid + @unix_perms = stat.mode & 0o7777 + @time = ::Zip::DOSTime.from_time(stat.mtime) + end + + def set_unix_attributes_on_path(dest_path) + # ignore setuid/setgid bits by default. honor if @restore_ownership + unix_perms_mask = 0o1777 + unix_perms_mask = 0o7777 if @restore_ownership + ::FileUtils.chmod(@unix_perms & unix_perms_mask, dest_path) if @restore_permissions && @unix_perms + ::FileUtils.chown(@unix_uid, @unix_gid, dest_path) if @restore_ownership && @unix_uid && @unix_gid && ::Process.egid == 0 + + # Restore the timestamp on a file. This will either have come from the + # original source file that was copied into the archive, or from the + # creation date of the archive if there was no original source file. + ::FileUtils.touch(dest_path, mtime: time) if @restore_times + end + + def set_extra_attributes_on_path(dest_path) # :nodoc: + return unless file? || directory? + + case @fstype + when ::Zip::FSTYPE_UNIX + set_unix_attributes_on_path(dest_path) + end + end + + def pack_c_dir_entry + zip64 = @extra['Zip64'] + [ + @header_signature, + @version, # version of encoding software + @fstype, # filesystem type + @version_needed_to_extract, # @versionNeededToExtract + @gp_flags, # @gp_flags + @compression_method, + @time.to_binary_dos_time, # @last_mod_time + @time.to_binary_dos_date, # @last_mod_date + @crc, + zip64 && zip64.compressed_size ? 0xFFFFFFFF : @compressed_size, + zip64 && zip64.original_size ? 0xFFFFFFFF : @size, + name_size, + @extra ? @extra.c_dir_size : 0, + comment_size, + zip64 && zip64.disk_start_number ? 0xFFFF : 0, # disk number start + @internal_file_attributes, # file type (binary=0, text=1) + @external_file_attributes, # native filesystem attributes + zip64 && zip64.relative_header_offset ? 0xFFFFFFFF : @local_header_offset, + @name, + @extra, + @comment + ].pack('VCCvvvvvVVVvvvvvVV') + end + + def write_c_dir_entry(io) #:nodoc:all + prep_zip64_extra(false) + case @fstype + when ::Zip::FSTYPE_UNIX + ft = case @ftype + when :file + @unix_perms ||= 0o644 + ::Zip::FILE_TYPE_FILE + when :directory + @unix_perms ||= 0o755 + ::Zip::FILE_TYPE_DIR + when :symlink + @unix_perms ||= 0o755 + ::Zip::FILE_TYPE_SYMLINK + end + + unless ft.nil? + @external_file_attributes = (ft << 12 | (@unix_perms & 0o7777)) << 16 + end + end + + io << pack_c_dir_entry + + io << @name + io << (@extra ? @extra.to_c_dir_bin : '') + io << @comment + end + + def ==(other) + return false unless other.class == self.class + + # Compares contents of local entry and exposed fields + keys_equal = %w[compression_method crc compressed_size size name extra filepath].all? do |k| + other.__send__(k.to_sym) == __send__(k.to_sym) + end + keys_equal && time.dos_equals(other.time) + end + + def <=>(other) + to_s <=> other.to_s + end + + # Returns an IO like object for the given ZipEntry. + # Warning: may behave weird with symlinks. + def get_input_stream(&block) + if @ftype == :directory + yield ::Zip::NullInputStream if block_given? + ::Zip::NullInputStream + elsif @filepath + case @ftype + when :file + ::File.open(@filepath, 'rb', &block) + when :symlink + linkpath = ::File.readlink(@filepath) + stringio = ::StringIO.new(linkpath) + yield(stringio) if block_given? + stringio + else + raise "unknown @file_type #{@ftype}" + end + else + zis = ::Zip::InputStream.new(@zipfile, local_header_offset) + zis.instance_variable_set(:@complete_entry, self) + zis.get_next_entry + if block_given? + begin + yield(zis) + ensure + zis.close + end + else + zis + end + end + end + + def gather_fileinfo_from_srcpath(src_path) # :nodoc: + stat = file_stat(src_path) + @ftype = case stat.ftype + when 'file' + if name_is_directory? + raise ArgumentError, + "entry name '#{newEntry}' indicates directory entry, but " \ + "'#{src_path}' is not a directory" + end + :file + when 'directory' + @name += '/' unless name_is_directory? + :directory + when 'link' + if name_is_directory? + raise ArgumentError, + "entry name '#{newEntry}' indicates directory entry, but " \ + "'#{src_path}' is not a directory" + end + :symlink + else + raise "unknown file type: #{src_path.inspect} #{stat.inspect}" + end + + @filepath = src_path + get_extra_attributes_from_path(@filepath) + end + + def write_to_zip_output_stream(zip_output_stream) #:nodoc:all + if @ftype == :directory + zip_output_stream.put_next_entry(self, nil, nil, ::Zip::Entry::STORED) + elsif @filepath + zip_output_stream.put_next_entry(self, nil, nil, compression_method || ::Zip::Entry::DEFLATED) + get_input_stream { |is| ::Zip::IOExtras.copy_stream(zip_output_stream, is) } + else + zip_output_stream.copy_raw_entry(self) + end + end + + def parent_as_string + entry_name = name.chomp('/') + slash_index = entry_name.rindex('/') + slash_index ? entry_name.slice(0, slash_index + 1) : nil + end + + def get_raw_input_stream(&block) + if @zipfile.respond_to?(:seek) && @zipfile.respond_to?(:read) + yield @zipfile + else + ::File.open(@zipfile, 'rb', &block) + end + end + + def clean_up + # By default, do nothing + end + + private + + def set_time(binary_dos_date, binary_dos_time) + @time = ::Zip::DOSTime.parse_binary_dos_format(binary_dos_date, binary_dos_time) + rescue ArgumentError + warn 'WARNING: invalid date/time in zip entry.' if ::Zip.warn_invalid_date + end + + def create_file(dest_path, _continue_on_exists_proc = proc { Zip.continue_on_exists_proc }) + if ::File.exist?(dest_path) && !yield(self, dest_path) + raise ::Zip::DestinationFileExistsError, + "Destination '#{dest_path}' already exists" + end + ::File.open(dest_path, 'wb') do |os| + get_input_stream do |is| + bytes_written = 0 + warned = false + buf = +'' + while (buf = is.sysread(::Zip::Decompressor::CHUNK_SIZE, buf)) + os << buf + bytes_written += buf.bytesize + next unless bytes_written > size && !warned + + message = "entry '#{name}' should be #{size}B, but is larger when inflated." + raise ::Zip::EntrySizeError, message if ::Zip.validate_entry_sizes + + warn "WARNING: #{message}" + warned = true + end + end + end + + set_extra_attributes_on_path(dest_path) + end + + def create_directory(dest_path) + return if ::File.directory?(dest_path) + + if ::File.exist?(dest_path) + if block_given? && yield(self, dest_path) + ::FileUtils.rm_f dest_path + else + raise ::Zip::DestinationFileExistsError, + "Cannot create directory '#{dest_path}'. " \ + 'A file already exists with that name' + end + end + ::FileUtils.mkdir_p(dest_path) + set_extra_attributes_on_path(dest_path) + end + + # BUG: create_symlink() does not use &block + def create_symlink(dest_path) + # TODO: Symlinks pose security challenges. Symlink support temporarily + # removed in view of https://github.com/rubyzip/rubyzip/issues/369 . + warn "WARNING: skipped symlink '#{dest_path}'." + end + + # apply missing data from the zip64 extra information field, if present + # (required when file sizes exceed 2**32, but can be used for all files) + def parse_zip64_extra(for_local_header) #:nodoc:all + return if @extra['Zip64'].nil? + + if for_local_header + @size, @compressed_size = @extra['Zip64'].parse(@size, @compressed_size) + else + @size, @compressed_size, @local_header_offset = @extra['Zip64'].parse(@size, @compressed_size, @local_header_offset) + end + end + + def data_descriptor_size + (@gp_flags & 0x0008) > 0 ? 16 : 0 + end + + # create a zip64 extra information field if we need one + def prep_zip64_extra(for_local_header) #:nodoc:all + return unless ::Zip.write_zip64_support + + need_zip64 = @size >= 0xFFFFFFFF || @compressed_size >= 0xFFFFFFFF + need_zip64 ||= @local_header_offset >= 0xFFFFFFFF unless for_local_header + if need_zip64 + @version_needed_to_extract = VERSION_NEEDED_TO_EXTRACT_ZIP64 + @extra.delete('Zip64Placeholder') + zip64 = @extra.create('Zip64') + if for_local_header + # local header always includes size and compressed size + zip64.original_size = @size + zip64.compressed_size = @compressed_size + else + # central directory entry entries include whichever fields are necessary + zip64.original_size = @size if @size >= 0xFFFFFFFF + zip64.compressed_size = @compressed_size if @compressed_size >= 0xFFFFFFFF + zip64.relative_header_offset = @local_header_offset if @local_header_offset >= 0xFFFFFFFF + end + else + @extra.delete('Zip64') + + # if this is a local header entry, create a placeholder + # so we have room to write a zip64 extra field afterward + # (we won't know if it's needed until the file data is written) + if for_local_header + @extra.create('Zip64Placeholder') + else + @extra.delete('Zip64Placeholder') + end + end + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/entry_set.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/entry_set.rb new file mode 100644 index 000000000000..9c5037817aa2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/entry_set.rb @@ -0,0 +1,88 @@ +module Zip + class EntrySet #:nodoc:all + include Enumerable + attr_accessor :entry_set, :entry_order + + def initialize(an_enumerable = []) + super() + @entry_set = {} + an_enumerable.each { |o| push(o) } + end + + def include?(entry) + @entry_set.include?(to_key(entry)) + end + + def find_entry(entry) + @entry_set[to_key(entry)] + end + + def <<(entry) + @entry_set[to_key(entry)] = entry if entry + end + + alias push << + + def size + @entry_set.size + end + + alias length size + + def delete(entry) + entry if @entry_set.delete(to_key(entry)) + end + + def each + @entry_set = sorted_entries.dup.each do |_, value| + yield(value) + end + end + + def entries + sorted_entries.values + end + + # deep clone + def dup + EntrySet.new(@entry_set.values.map(&:dup)) + end + + def ==(other) + return false unless other.kind_of?(EntrySet) + + @entry_set.values == other.entry_set.values + end + + def parent(entry) + @entry_set[to_key(entry.parent_as_string)] + end + + def glob(pattern, flags = ::File::FNM_PATHNAME | ::File::FNM_DOTMATCH | ::File::FNM_EXTGLOB) + entries.map do |entry| + next nil unless ::File.fnmatch(pattern, entry.name.chomp('/'), flags) + + yield(entry) if block_given? + entry + end.compact + end + + protected + + def sorted_entries + ::Zip.sort_entries ? Hash[@entry_set.sort] : @entry_set + end + + private + + def to_key(entry) + k = entry.to_s.chomp('/') + k.downcase! if ::Zip.case_insensitive_match + k + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/errors.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/errors.rb new file mode 100644 index 000000000000..0ff0e1e19ef6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/errors.rb @@ -0,0 +1,19 @@ +module Zip + class Error < StandardError; end + class EntryExistsError < Error; end + class DestinationFileExistsError < Error; end + class CompressionMethodError < Error; end + class EntryNameError < Error; end + class EntrySizeError < Error; end + class InternalError < Error; end + class GPFBit3Error < Error; end + class DecompressionError < Error; end + + # Backwards compatibility with v1 (delete in v2) + ZipError = Error + ZipEntryExistsError = EntryExistsError + ZipDestinationFileExistsError = DestinationFileExistsError + ZipCompressionMethodError = CompressionMethodError + ZipEntryNameError = EntryNameError + ZipInternalError = InternalError +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field.rb new file mode 100644 index 000000000000..aa3ef8a8816b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field.rb @@ -0,0 +1,103 @@ +module Zip + class ExtraField < Hash + ID_MAP = {} + + def initialize(binstr = nil) + merge(binstr) if binstr + end + + def extra_field_type_exist(binstr, id, len, index) + field_name = ID_MAP[id].name + if member?(field_name) + self[field_name].merge(binstr[index, len + 4]) + else + field_obj = ID_MAP[id].new(binstr[index, len + 4]) + self[field_name] = field_obj + end + end + + def extra_field_type_unknown(binstr, len, index) + create_unknown_item unless self['Unknown'] + if !len || len + 4 > binstr[index..-1].bytesize + self['Unknown'] << binstr[index..-1] + return + end + self['Unknown'] << binstr[index, len + 4] + end + + def create_unknown_item + s = +'' + class << s + alias_method :to_c_dir_bin, :to_s + alias_method :to_local_bin, :to_s + end + self['Unknown'] = s + end + + def merge(binstr) + return if binstr.empty? + + i = 0 + while i < binstr.bytesize + id = binstr[i, 2] + len = binstr[i + 2, 2].to_s.unpack1('v') + if id && ID_MAP.member?(id) + extra_field_type_exist(binstr, id, len, i) + elsif id + create_unknown_item unless self['Unknown'] + break unless extra_field_type_unknown(binstr, len, i) + end + i += len + 4 + end + end + + def create(name) + unless (field_class = ID_MAP.values.find { |k| k.name == name }) + raise Error, "Unknown extra field '#{name}'" + end + + self[name] = field_class.new + end + + # place Unknown last, so "extra" data that is missing the proper signature/size + # does not prevent known fields from being read back in + def ordered_values + result = [] + each { |k, v| k == 'Unknown' ? result.push(v) : result.unshift(v) } + result + end + + def to_local_bin + ordered_values.map! { |v| v.to_local_bin.force_encoding('BINARY') }.join + end + + alias to_s to_local_bin + + def to_c_dir_bin + ordered_values.map! { |v| v.to_c_dir_bin.force_encoding('BINARY') }.join + end + + def c_dir_size + to_c_dir_bin.bytesize + end + + def local_size + to_local_bin.bytesize + end + + alias length local_size + alias size local_size + end +end + +require 'zip/extra_field/generic' +require 'zip/extra_field/universal_time' +require 'zip/extra_field/old_unix' +require 'zip/extra_field/unix' +require 'zip/extra_field/zip64' +require 'zip/extra_field/zip64_placeholder' +require 'zip/extra_field/ntfs' + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/generic.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/generic.rb new file mode 100644 index 000000000000..5eb702d630c5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/generic.rb @@ -0,0 +1,44 @@ +module Zip + class ExtraField::Generic + def self.register_map + return unless const_defined?(:HEADER_ID) + + ::Zip::ExtraField::ID_MAP[const_get(:HEADER_ID)] = self + end + + def self.name + @name ||= to_s.split('::')[-1] + end + + # return field [size, content] or false + def initial_parse(binstr) + return false unless binstr + + if binstr[0, 2] != self.class.const_get(:HEADER_ID) + warn 'WARNING: weird extra field header ID. Skip parsing it.' + return false + end + + [binstr[2, 2].unpack1('v'), binstr[4..-1]] + end + + def ==(other) + return false if self.class != other.class + + each do |k, v| + return false if v != other[k] + end + true + end + + def to_local_bin + s = pack_for_local + self.class.const_get(:HEADER_ID) + [s.bytesize].pack('v') << s + end + + def to_c_dir_bin + s = pack_for_c_dir + self.class.const_get(:HEADER_ID) + [s.bytesize].pack('v') << s + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/ntfs.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/ntfs.rb new file mode 100644 index 000000000000..f4f11b2d26a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/ntfs.rb @@ -0,0 +1,94 @@ +module Zip + # PKWARE NTFS Extra Field (0x000a) + # Only Tag 0x0001 is supported + class ExtraField::NTFS < ExtraField::Generic + HEADER_ID = [0x000A].pack('v') + register_map + + WINDOWS_TICK = 10_000_000.0 + SEC_TO_UNIX_EPOCH = 11_644_473_600 + + def initialize(binstr = nil) + @ctime = nil + @mtime = nil + @atime = nil + binstr && merge(binstr) + end + + attr_accessor :atime, :ctime, :mtime + + def merge(binstr) + return if binstr.empty? + + size, content = initial_parse(binstr) + (size && content) || return + + content = content[4..-1] + tags = parse_tags(content) + + tag1 = tags[1] + return unless tag1 + + ntfs_mtime, ntfs_atime, ntfs_ctime = tag1.unpack('Q<Q<Q<') + ntfs_mtime && @mtime ||= from_ntfs_time(ntfs_mtime) + ntfs_atime && @atime ||= from_ntfs_time(ntfs_atime) + ntfs_ctime && @ctime ||= from_ntfs_time(ntfs_ctime) + end + + def ==(other) + @mtime == other.mtime && + @atime == other.atime && + @ctime == other.ctime + end + + # Info-ZIP note states this extra field is stored at local header + def pack_for_local + pack_for_c_dir + end + + # But 7-zip for Windows only stores at central dir + def pack_for_c_dir + # reserved 0 and tag 1 + s = [0, 1].pack('Vv') + + tag1 = ''.force_encoding(Encoding::BINARY) + if @mtime + tag1 << [to_ntfs_time(@mtime)].pack('Q<') + if @atime + tag1 << [to_ntfs_time(@atime)].pack('Q<') + tag1 << [to_ntfs_time(@ctime)].pack('Q<') if @ctime + end + end + s << [tag1.bytesize].pack('v') << tag1 + s + end + + private + + def parse_tags(content) + return {} if content.nil? + + tags = {} + i = 0 + while i < content.bytesize + tag, size = content[i, 4].unpack('vv') + i += 4 + break unless tag && size + + value = content[i, size] + i += size + tags[tag] = value + end + + tags + end + + def from_ntfs_time(ntfs_time) + ::Zip::DOSTime.at(ntfs_time / WINDOWS_TICK - SEC_TO_UNIX_EPOCH) + end + + def to_ntfs_time(time) + ((time.to_f + SEC_TO_UNIX_EPOCH) * WINDOWS_TICK).to_i + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/old_unix.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/old_unix.rb new file mode 100644 index 000000000000..dfd2ba562802 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/old_unix.rb @@ -0,0 +1,46 @@ +module Zip + # Olf Info-ZIP Extra for UNIX uid/gid and file timestampes + class ExtraField::OldUnix < ExtraField::Generic + HEADER_ID = 'UX' + register_map + + def initialize(binstr = nil) + @uid = 0 + @gid = 0 + @atime = nil + @mtime = nil + binstr && merge(binstr) + end + + attr_accessor :uid, :gid, :atime, :mtime + + def merge(binstr) + return if binstr.empty? + + size, content = initial_parse(binstr) + # size: 0 for central directory. 4 for local header + return if !size || size == 0 + + atime, mtime, uid, gid = content.unpack('VVvv') + @uid ||= uid + @gid ||= gid + @atime ||= atime + @mtime ||= mtime # rubocop:disable Naming/MemoizedInstanceVariableName + end + + def ==(other) + @uid == other.uid && + @gid == other.gid && + @atime == other.atime && + @mtime == other.mtime + end + + def pack_for_local + [@atime, @mtime, @uid, @gid].pack('VVvv') + end + + def pack_for_c_dir + [@atime, @mtime].pack('VV') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/universal_time.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/universal_time.rb new file mode 100644 index 000000000000..424c281d8086 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/universal_time.rb @@ -0,0 +1,77 @@ +module Zip + # Info-ZIP Additional timestamp field + class ExtraField::UniversalTime < ExtraField::Generic + HEADER_ID = 'UT' + register_map + + ATIME_MASK = 0b010 + CTIME_MASK = 0b100 + MTIME_MASK = 0b001 + + def initialize(binstr = nil) + @ctime = nil + @mtime = nil + @atime = nil + @flag = 0 + + merge(binstr) unless binstr.nil? + end + + attr_reader :atime, :ctime, :mtime, :flag + + def atime=(time) + @flag = time.nil? ? @flag & ~ATIME_MASK : @flag | ATIME_MASK + @atime = time + end + + def ctime=(time) + @flag = time.nil? ? @flag & ~CTIME_MASK : @flag | CTIME_MASK + @ctime = time + end + + def mtime=(time) + @flag = time.nil? ? @flag & ~MTIME_MASK : @flag | MTIME_MASK + @mtime = time + end + + def merge(binstr) + return if binstr.empty? + + size, content = initial_parse(binstr) + return if !size || size <= 0 + + @flag, *times = content.unpack('Cl<l<l<') + + # Parse the timestamps, in order, based on which flags are set. + return if times[0].nil? + + @mtime ||= ::Zip::DOSTime.at(times.shift) unless @flag & MTIME_MASK == 0 + return if times[0].nil? + + @atime ||= ::Zip::DOSTime.at(times.shift) unless @flag & ATIME_MASK == 0 + return if times[0].nil? + + @ctime ||= ::Zip::DOSTime.at(times.shift) unless @flag & CTIME_MASK == 0 + end + + def ==(other) + @mtime == other.mtime && + @atime == other.atime && + @ctime == other.ctime + end + + def pack_for_local + s = [@flag].pack('C') + s << [@mtime.to_i].pack('l<') unless @flag & MTIME_MASK == 0 + s << [@atime.to_i].pack('l<') unless @flag & ATIME_MASK == 0 + s << [@ctime.to_i].pack('l<') unless @flag & CTIME_MASK == 0 + s + end + + def pack_for_c_dir + s = [@flag].pack('C') + s << [@mtime.to_i].pack('l<') unless @flag & MTIME_MASK == 0 + s + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/unix.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/unix.rb new file mode 100644 index 000000000000..9a66c81dc2ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/unix.rb @@ -0,0 +1,39 @@ +module Zip + # Info-ZIP Extra for UNIX uid/gid + class ExtraField::IUnix < ExtraField::Generic + HEADER_ID = 'Ux' + register_map + + def initialize(binstr = nil) + @uid = 0 + @gid = 0 + binstr && merge(binstr) + end + + attr_accessor :uid, :gid + + def merge(binstr) + return if binstr.empty? + + size, content = initial_parse(binstr) + # size: 0 for central directory. 4 for local header + return if !size || size == 0 + + uid, gid = content.unpack('vv') + @uid ||= uid + @gid ||= gid # rubocop:disable Naming/MemoizedInstanceVariableName + end + + def ==(other) + @uid == other.uid && @gid == other.gid + end + + def pack_for_local + [@uid, @gid].pack('vv') + end + + def pack_for_c_dir + '' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/zip64.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/zip64.rb new file mode 100644 index 000000000000..9826c6cfb1df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/zip64.rb @@ -0,0 +1,70 @@ +module Zip + # Info-ZIP Extra for Zip64 size + class ExtraField::Zip64 < ExtraField::Generic + attr_accessor :original_size, :compressed_size, :relative_header_offset, :disk_start_number + HEADER_ID = ['0100'].pack('H*') + register_map + + def initialize(binstr = nil) + # unparsed binary; we don't actually know what this contains + # without looking for FFs in the associated file header + # call parse after initializing with a binary string + @content = nil + @original_size = nil + @compressed_size = nil + @relative_header_offset = nil + @disk_start_number = nil + binstr && merge(binstr) + end + + def ==(other) + other.original_size == @original_size && + other.compressed_size == @compressed_size && + other.relative_header_offset == @relative_header_offset && + other.disk_start_number == @disk_start_number + end + + def merge(binstr) + return if binstr.empty? + + _, @content = initial_parse(binstr) + end + + # pass the values from the base entry (if applicable) + # wider values are only present in the extra field for base values set to all FFs + # returns the final values for the four attributes (from the base or zip64 extra record) + def parse(original_size, compressed_size, relative_header_offset = nil, disk_start_number = nil) + @original_size = extract(8, 'Q<') if original_size == 0xFFFFFFFF + @compressed_size = extract(8, 'Q<') if compressed_size == 0xFFFFFFFF + @relative_header_offset = extract(8, 'Q<') if relative_header_offset && relative_header_offset == 0xFFFFFFFF + @disk_start_number = extract(4, 'V') if disk_start_number && disk_start_number == 0xFFFF + @content = nil + [@original_size || original_size, + @compressed_size || compressed_size, + @relative_header_offset || relative_header_offset, + @disk_start_number || disk_start_number] + end + + def extract(size, format) + @content.slice!(0, size).unpack1(format) + end + private :extract + + def pack_for_local + # local header entries must contain original size and compressed size; other fields do not apply + return '' unless @original_size && @compressed_size + + [@original_size, @compressed_size].pack('Q<Q<') + end + + def pack_for_c_dir + # central directory entries contain only fields that didn't fit in the main entry part + packed = ''.force_encoding('BINARY') + packed << [@original_size].pack('Q<') if @original_size + packed << [@compressed_size].pack('Q<') if @compressed_size + packed << [@relative_header_offset].pack('Q<') if @relative_header_offset + packed << [@disk_start_number].pack('V') if @disk_start_number + packed + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/zip64_placeholder.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/zip64_placeholder.rb new file mode 100644 index 000000000000..dfaa56e8f387 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/extra_field/zip64_placeholder.rb @@ -0,0 +1,15 @@ +module Zip + # placeholder to reserve space for a Zip64 extra information record, for the + # local file header only, that we won't know if we'll need until after + # we write the file data + class ExtraField::Zip64Placeholder < ExtraField::Generic + HEADER_ID = ['9999'].pack('H*') # this ID is used by other libraries such as .NET's Ionic.zip + register_map + + def initialize(_binstr = nil); end + + def pack_for_local + "\x00" * 16 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/file.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/file.rb new file mode 100644 index 000000000000..999d9728d49b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/file.rb @@ -0,0 +1,468 @@ +module Zip + # ZipFile is modeled after java.util.zip.ZipFile from the Java SDK. + # The most important methods are those inherited from + # ZipCentralDirectory for accessing information about the entries in + # the archive and methods such as get_input_stream and + # get_output_stream for reading from and writing entries to the + # archive. The class includes a few convenience methods such as + # #extract for extracting entries to the filesystem, and #remove, + # #replace, #rename and #mkdir for making simple modifications to + # the archive. + # + # Modifications to a zip archive are not committed until #commit or + # #close is called. The method #open accepts a block following + # the pattern from File.open offering a simple way to + # automatically close the archive when the block returns. + # + # The following example opens zip archive <code>my.zip</code> + # (creating it if it doesn't exist) and adds an entry + # <code>first.txt</code> and a directory entry <code>a_dir</code> + # to it. + # + # require 'zip' + # + # Zip::File.open("my.zip", Zip::File::CREATE) { + # |zipfile| + # zipfile.get_output_stream("first.txt") { |f| f.puts "Hello from ZipFile" } + # zipfile.mkdir("a_dir") + # } + # + # The next example reopens <code>my.zip</code> writes the contents of + # <code>first.txt</code> to standard out and deletes the entry from + # the archive. + # + # require 'zip' + # + # Zip::File.open("my.zip", Zip::File::CREATE) { + # |zipfile| + # puts zipfile.read("first.txt") + # zipfile.remove("first.txt") + # } + # + # ZipFileSystem offers an alternative API that emulates ruby's + # interface for accessing the filesystem, ie. the File and Dir classes. + + class File < CentralDirectory + CREATE = true + SPLIT_SIGNATURE = 0x08074b50 + ZIP64_EOCD_SIGNATURE = 0x06064b50 + MAX_SEGMENT_SIZE = 3_221_225_472 + MIN_SEGMENT_SIZE = 65_536 + DATA_BUFFER_SIZE = 8192 + IO_METHODS = [:tell, :seek, :read, :eof, :close] + + DEFAULT_OPTIONS = { + restore_ownership: false, + restore_permissions: false, + restore_times: false + }.freeze + + attr_reader :name + + # default -> false. + attr_accessor :restore_ownership + + # default -> false, but will be set to true in a future version. + attr_accessor :restore_permissions + + # default -> false, but will be set to true in a future version. + attr_accessor :restore_times + + # Returns the zip files comment, if it has one + attr_accessor :comment + + # Opens a zip archive. Pass true as the second parameter to create + # a new archive if it doesn't exist already. + def initialize(path_or_io, create = false, buffer = false, options = {}) + super() + options = DEFAULT_OPTIONS.merge(options) + @name = path_or_io.respond_to?(:path) ? path_or_io.path : path_or_io + @comment = '' + @create = create ? true : false # allow any truthy value to mean true + + if ::File.size?(@name.to_s) + # There is a file, which exists, that is associated with this zip. + @create = false + @file_permissions = ::File.stat(@name).mode + + if buffer + read_from_stream(path_or_io) + else + ::File.open(@name, 'rb') do |f| + read_from_stream(f) + end + end + elsif buffer && path_or_io.size > 0 + # This zip is probably a non-empty StringIO. + read_from_stream(path_or_io) + elsif @create + # This zip is completely new/empty and is to be created. + @entry_set = EntrySet.new + elsif ::File.zero?(@name) + # A file exists, but it is empty. + raise Error, "File #{@name} has zero size. Did you mean to pass the create flag?" + else + # Everything is wrong. + raise Error, "File #{@name} not found" + end + + @stored_entries = @entry_set.dup + @stored_comment = @comment + @restore_ownership = options[:restore_ownership] + @restore_permissions = options[:restore_permissions] + @restore_times = options[:restore_times] + end + + class << self + # Similar to ::new. If a block is passed the Zip::File object is passed + # to the block and is automatically closed afterwards, just as with + # ruby's builtin File::open method. + def open(file_name, create = false, options = {}) + zf = ::Zip::File.new(file_name, create, false, options) + return zf unless block_given? + + begin + yield zf + ensure + zf.close + end + end + + # Same as #open. But outputs data to a buffer instead of a file + def add_buffer + io = ::StringIO.new('') + zf = ::Zip::File.new(io, true, true) + yield zf + zf.write_buffer(io) + end + + # Like #open, but reads zip archive contents from a String or open IO + # stream, and outputs data to a buffer. + # (This can be used to extract data from a + # downloaded zip archive without first saving it to disk.) + def open_buffer(io, options = {}) + unless IO_METHODS.map { |method| io.respond_to?(method) }.all? || io.kind_of?(String) + raise "Zip::File.open_buffer expects a String or IO-like argument (responds to #{IO_METHODS.join(', ')}). Found: #{io.class}" + end + + io = ::StringIO.new(io) if io.kind_of?(::String) + + # https://github.com/rubyzip/rubyzip/issues/119 + io.binmode if io.respond_to?(:binmode) + + zf = ::Zip::File.new(io, true, true, options) + return zf unless block_given? + + yield zf + + begin + zf.write_buffer(io) + rescue IOError => e + raise unless e.message == 'not opened for writing' + end + end + + # Iterates over the contents of the ZipFile. This is more efficient + # than using a ZipInputStream since this methods simply iterates + # through the entries in the central directory structure in the archive + # whereas ZipInputStream jumps through the entire archive accessing the + # local entry headers (which contain the same information as the + # central directory). + def foreach(zip_file_name, &block) + ::Zip::File.open(zip_file_name) do |zip_file| + zip_file.each(&block) + end + end + + def get_segment_size_for_split(segment_size) + if MIN_SEGMENT_SIZE > segment_size + MIN_SEGMENT_SIZE + elsif MAX_SEGMENT_SIZE < segment_size + MAX_SEGMENT_SIZE + else + segment_size + end + end + + def get_partial_zip_file_name(zip_file_name, partial_zip_file_name) + unless partial_zip_file_name.nil? + partial_zip_file_name = zip_file_name.sub(/#{::File.basename(zip_file_name)}\z/, + partial_zip_file_name + ::File.extname(zip_file_name)) + end + partial_zip_file_name ||= zip_file_name + partial_zip_file_name + end + + def get_segment_count_for_split(zip_file_size, segment_size) + (zip_file_size / segment_size).to_i + (zip_file_size % segment_size == 0 ? 0 : 1) + end + + def put_split_signature(szip_file, segment_size) + signature_packed = [SPLIT_SIGNATURE].pack('V') + szip_file << signature_packed + segment_size - signature_packed.size + end + + # + # TODO: Make the code more understandable + # + def save_splited_part(zip_file, partial_zip_file_name, zip_file_size, szip_file_index, segment_size, segment_count) + ssegment_size = zip_file_size - zip_file.pos + ssegment_size = segment_size if ssegment_size > segment_size + szip_file_name = "#{partial_zip_file_name}.#{format('%03d', szip_file_index)}" + ::File.open(szip_file_name, 'wb') do |szip_file| + if szip_file_index == 1 + ssegment_size = put_split_signature(szip_file, segment_size) + end + chunk_bytes = 0 + until ssegment_size == chunk_bytes || zip_file.eof? + segment_bytes_left = ssegment_size - chunk_bytes + buffer_size = segment_bytes_left < DATA_BUFFER_SIZE ? segment_bytes_left : DATA_BUFFER_SIZE + chunk = zip_file.read(buffer_size) + chunk_bytes += buffer_size + szip_file << chunk + # Info for track splitting + yield segment_count, szip_file_index, chunk_bytes, ssegment_size if block_given? + end + end + end + + # Splits an archive into parts with segment size + def split(zip_file_name, segment_size = MAX_SEGMENT_SIZE, delete_zip_file = true, partial_zip_file_name = nil) + raise Error, "File #{zip_file_name} not found" unless ::File.exist?(zip_file_name) + raise Errno::ENOENT, zip_file_name unless ::File.readable?(zip_file_name) + + zip_file_size = ::File.size(zip_file_name) + segment_size = get_segment_size_for_split(segment_size) + return if zip_file_size <= segment_size + + segment_count = get_segment_count_for_split(zip_file_size, segment_size) + # Checking for correct zip structure + ::Zip::File.open(zip_file_name) {} + partial_zip_file_name = get_partial_zip_file_name(zip_file_name, partial_zip_file_name) + szip_file_index = 0 + ::File.open(zip_file_name, 'rb') do |zip_file| + until zip_file.eof? + szip_file_index += 1 + save_splited_part(zip_file, partial_zip_file_name, zip_file_size, szip_file_index, segment_size, segment_count) + end + end + ::File.delete(zip_file_name) if delete_zip_file + szip_file_index + end + end + + # Returns an input stream to the specified entry. If a block is passed + # the stream object is passed to the block and the stream is automatically + # closed afterwards just as with ruby's builtin File.open method. + def get_input_stream(entry, &a_proc) + get_entry(entry).get_input_stream(&a_proc) + end + + # Returns an output stream to the specified entry. If entry is not an instance + # of Zip::Entry, a new Zip::Entry will be initialized using the arguments + # specified. If a block is passed the stream object is passed to the block and + # the stream is automatically closed afterwards just as with ruby's builtin + # File.open method. + def get_output_stream(entry, permission_int = nil, comment = nil, + extra = nil, compressed_size = nil, crc = nil, + compression_method = nil, size = nil, time = nil, + &a_proc) + + new_entry = + if entry.kind_of?(Entry) + entry + else + Entry.new(@name, entry.to_s, comment, extra, compressed_size, crc, compression_method, size, time) + end + if new_entry.directory? + raise ArgumentError, + "cannot open stream to directory entry - '#{new_entry}'" + end + new_entry.unix_perms = permission_int + zip_streamable_entry = StreamableStream.new(new_entry) + @entry_set << zip_streamable_entry + zip_streamable_entry.get_output_stream(&a_proc) + end + + # Returns the name of the zip archive + def to_s + @name + end + + # Returns a string containing the contents of the specified entry + def read(entry) + get_input_stream(entry, &:read) + end + + # Convenience method for adding the contents of a file to the archive + def add(entry, src_path, &continue_on_exists_proc) + continue_on_exists_proc ||= proc { ::Zip.continue_on_exists_proc } + check_entry_exists(entry, continue_on_exists_proc, 'add') + new_entry = entry.kind_of?(::Zip::Entry) ? entry : ::Zip::Entry.new(@name, entry.to_s) + new_entry.gather_fileinfo_from_srcpath(src_path) + new_entry.dirty = true + @entry_set << new_entry + end + + # Convenience method for adding the contents of a file to the archive + # in Stored format (uncompressed) + def add_stored(entry, src_path, &continue_on_exists_proc) + entry = ::Zip::Entry.new(@name, entry.to_s, nil, nil, nil, nil, ::Zip::Entry::STORED) + add(entry, src_path, &continue_on_exists_proc) + end + + # Removes the specified entry. + def remove(entry) + @entry_set.delete(get_entry(entry)) + end + + # Renames the specified entry. + def rename(entry, new_name, &continue_on_exists_proc) + found_entry = get_entry(entry) + check_entry_exists(new_name, continue_on_exists_proc, 'rename') + @entry_set.delete(found_entry) + found_entry.name = new_name + @entry_set << found_entry + end + + # Replaces the specified entry with the contents of src_path (from + # the file system). + def replace(entry, src_path) + check_file(src_path) + remove(entry) + add(entry, src_path) + end + + # Extracts entry to file dest_path. + def extract(entry, dest_path, &block) + block ||= proc { ::Zip.on_exists_proc } + found_entry = get_entry(entry) + found_entry.extract(dest_path, &block) + end + + # Commits changes that has been made since the previous commit to + # the zip archive. + def commit + return if name.kind_of?(StringIO) || !commit_required? + + on_success_replace do |tmp_file| + ::Zip::OutputStream.open(tmp_file) do |zos| + @entry_set.each do |e| + e.write_to_zip_output_stream(zos) + e.dirty = false + e.clean_up + end + zos.comment = comment + end + true + end + initialize(name) + end + + # Write buffer write changes to buffer and return + def write_buffer(io = ::StringIO.new('')) + ::Zip::OutputStream.write_buffer(io) do |zos| + @entry_set.each { |e| e.write_to_zip_output_stream(zos) } + zos.comment = comment + end + end + + # Closes the zip file committing any changes that has been made. + def close + commit + end + + # Returns true if any changes has been made to this archive since + # the previous commit + def commit_required? + @entry_set.each do |e| + return true if e.dirty + end + @comment != @stored_comment || @entry_set != @stored_entries || @create + end + + # Searches for entry with the specified name. Returns nil if + # no entry is found. See also get_entry + def find_entry(entry_name) + selected_entry = @entry_set.find_entry(entry_name) + return if selected_entry.nil? + + selected_entry.restore_ownership = @restore_ownership + selected_entry.restore_permissions = @restore_permissions + selected_entry.restore_times = @restore_times + selected_entry + end + + # Searches for entries given a glob + def glob(*args, &block) + @entry_set.glob(*args, &block) + end + + # Searches for an entry just as find_entry, but throws Errno::ENOENT + # if no entry is found. + def get_entry(entry) + selected_entry = find_entry(entry) + raise Errno::ENOENT, entry if selected_entry.nil? + + selected_entry + end + + # Creates a directory + def mkdir(entry_name, permission = 0o755) + raise Errno::EEXIST, "File exists - #{entry_name}" if find_entry(entry_name) + + entry_name = entry_name.dup.to_s + entry_name << '/' unless entry_name.end_with?('/') + @entry_set << ::Zip::StreamableDirectory.new(@name, entry_name, nil, permission) + end + + private + + def directory?(new_entry, src_path) + path_is_directory = ::File.directory?(src_path) + if new_entry.directory? && !path_is_directory + raise ArgumentError, + "entry name '#{new_entry}' indicates directory entry, but " \ + "'#{src_path}' is not a directory" + elsif !new_entry.directory? && path_is_directory + new_entry.name += '/' + end + new_entry.directory? && path_is_directory + end + + def check_entry_exists(entry_name, continue_on_exists_proc, proc_name) + continue_on_exists_proc ||= proc { Zip.continue_on_exists_proc } + return unless @entry_set.include?(entry_name) + + if continue_on_exists_proc.call + remove get_entry(entry_name) + else + raise ::Zip::EntryExistsError, + proc_name + " failed. Entry #{entry_name} already exists" + end + end + + def check_file(path) + raise Errno::ENOENT, path unless ::File.readable?(path) + end + + def on_success_replace + dirname, basename = ::File.split(name) + ::Dir::Tmpname.create(basename, dirname) do |tmp_filename| + begin + if yield tmp_filename + ::File.rename(tmp_filename, name) + ::File.chmod(@file_permissions, name) unless @create + end + ensure + ::File.unlink(tmp_filename) if ::File.exist?(tmp_filename) + end + end + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/filesystem.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/filesystem.rb new file mode 100644 index 000000000000..d9928d4ae8ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/filesystem.rb @@ -0,0 +1,643 @@ +require 'zip' + +module Zip + # The ZipFileSystem API provides an API for accessing entries in + # a zip archive that is similar to ruby's builtin File and Dir + # classes. + # + # Requiring 'zip/filesystem' includes this module in Zip::File + # making the methods in this module available on Zip::File objects. + # + # Using this API the following example creates a new zip file + # <code>my.zip</code> containing a normal entry with the name + # <code>first.txt</code>, a directory entry named <code>mydir</code> + # and finally another normal entry named <code>second.txt</code> + # + # require 'zip/filesystem' + # + # Zip::File.open("my.zip", Zip::File::CREATE) { + # |zipfile| + # zipfile.file.open("first.txt", "w") { |f| f.puts "Hello world" } + # zipfile.dir.mkdir("mydir") + # zipfile.file.open("mydir/second.txt", "w") { |f| f.puts "Hello again" } + # } + # + # Reading is as easy as writing, as the following example shows. The + # example writes the contents of <code>first.txt</code> from zip archive + # <code>my.zip</code> to standard out. + # + # require 'zip/filesystem' + # + # Zip::File.open("my.zip") { + # |zipfile| + # puts zipfile.file.read("first.txt") + # } + + module FileSystem + def initialize # :nodoc: + mapped_zip = ZipFileNameMapper.new(self) + @zip_fs_dir = ZipFsDir.new(mapped_zip) + @zip_fs_file = ZipFsFile.new(mapped_zip) + @zip_fs_dir.file = @zip_fs_file + @zip_fs_file.dir = @zip_fs_dir + end + + # Returns a ZipFsDir which is much like ruby's builtin Dir (class) + # object, except it works on the Zip::File on which this method is + # invoked + def dir + @zip_fs_dir + end + + # Returns a ZipFsFile which is much like ruby's builtin File (class) + # object, except it works on the Zip::File on which this method is + # invoked + def file + @zip_fs_file + end + + # Instances of this class are normally accessed via the accessor + # Zip::File::file. An instance of ZipFsFile behaves like ruby's + # builtin File (class) object, except it works on Zip::File entries. + # + # The individual methods are not documented due to their + # similarity with the methods in File + class ZipFsFile + attr_writer :dir + # protected :dir + + class ZipFsStat + class << self + def delegate_to_fs_file(*methods) + methods.each do |method| + class_eval <<-END_EVAL, __FILE__, __LINE__ + 1 + def #{method} # def file? + @zip_fs_file.#{method}(@entry_name) # @zip_fs_file.file?(@entry_name) + end # end + END_EVAL + end + end + end + + def initialize(zip_fs_file, entry_name) + @zip_fs_file = zip_fs_file + @entry_name = entry_name + end + + def kind_of?(type) + super || type == ::File::Stat + end + + delegate_to_fs_file :file?, :directory?, :pipe?, :chardev?, :symlink?, + :socket?, :blockdev?, :readable?, :readable_real?, :writable?, :ctime, + :writable_real?, :executable?, :executable_real?, :sticky?, :owned?, + :grpowned?, :setuid?, :setgid?, :zero?, :size, :size?, :mtime, :atime + + def blocks + nil + end + + def get_entry + @zip_fs_file.__send__(:get_entry, @entry_name) + end + private :get_entry + + def gid + e = get_entry + if e.extra.member? 'IUnix' + e.extra['IUnix'].gid || 0 + else + 0 + end + end + + def uid + e = get_entry + if e.extra.member? 'IUnix' + e.extra['IUnix'].uid || 0 + else + 0 + end + end + + def ino + 0 + end + + def dev + 0 + end + + def rdev + 0 + end + + def rdev_major + 0 + end + + def rdev_minor + 0 + end + + def ftype + if file? + 'file' + elsif directory? + 'directory' + else + raise StandardError, 'Unknown file type' + end + end + + def nlink + 1 + end + + def blksize + nil + end + + def mode + e = get_entry + if e.fstype == 3 + e.external_file_attributes >> 16 + else + 33_206 # 33206 is equivalent to -rw-rw-rw- + end + end + end + + def initialize(mapped_zip) + @mapped_zip = mapped_zip + end + + def get_entry(filename) + unless exists?(filename) + raise Errno::ENOENT, "No such file or directory - #{filename}" + end + + @mapped_zip.find_entry(filename) + end + private :get_entry + + def unix_mode_cmp(filename, mode) + e = get_entry(filename) + e.fstype == 3 && ((e.external_file_attributes >> 16) & mode) != 0 + rescue Errno::ENOENT + false + end + private :unix_mode_cmp + + def exists?(filename) + expand_path(filename) == '/' || !@mapped_zip.find_entry(filename).nil? + end + alias exist? exists? + + # Permissions not implemented, so if the file exists it is accessible + alias owned? exists? + alias grpowned? exists? + + def readable?(filename) + unix_mode_cmp(filename, 0o444) + end + alias readable_real? readable? + + def writable?(filename) + unix_mode_cmp(filename, 0o222) + end + alias writable_real? writable? + + def executable?(filename) + unix_mode_cmp(filename, 0o111) + end + alias executable_real? executable? + + def setuid?(filename) + unix_mode_cmp(filename, 0o4000) + end + + def setgid?(filename) + unix_mode_cmp(filename, 0o2000) + end + + def sticky?(filename) + unix_mode_cmp(filename, 0o1000) + end + + def umask(*args) + ::File.umask(*args) + end + + def truncate(_filename, _len) + raise StandardError, 'truncate not supported' + end + + def directory?(filename) + entry = @mapped_zip.find_entry(filename) + expand_path(filename) == '/' || (!entry.nil? && entry.directory?) + end + + def open(filename, mode = 'r', permissions = 0o644, &block) + mode.delete!('b') # ignore b option + case mode + when 'r' + @mapped_zip.get_input_stream(filename, &block) + when 'w' + @mapped_zip.get_output_stream(filename, permissions, &block) + else + raise StandardError, "openmode '#{mode} not supported" unless mode == 'r' + end + end + + def new(filename, mode = 'r') + self.open(filename, mode) + end + + def size(filename) + @mapped_zip.get_entry(filename).size + end + + # Returns nil for not found and nil for directories + def size?(filename) + entry = @mapped_zip.find_entry(filename) + entry.nil? || entry.directory? ? nil : entry.size + end + + def chown(owner, group, *filenames) + filenames.each do |filename| + e = get_entry(filename) + e.extra.create('IUnix') unless e.extra.member?('IUnix') + e.extra['IUnix'].uid = owner + e.extra['IUnix'].gid = group + end + filenames.size + end + + def chmod(mode, *filenames) + filenames.each do |filename| + e = get_entry(filename) + e.fstype = 3 # force convertion filesystem type to unix + e.unix_perms = mode + e.external_file_attributes = mode << 16 + e.dirty = true + end + filenames.size + end + + def zero?(filename) + sz = size(filename) + sz.nil? || sz == 0 + rescue Errno::ENOENT + false + end + + def file?(filename) + entry = @mapped_zip.find_entry(filename) + !entry.nil? && entry.file? + end + + def dirname(filename) + ::File.dirname(filename) + end + + def basename(filename) + ::File.basename(filename) + end + + def split(filename) + ::File.split(filename) + end + + def join(*fragments) + ::File.join(*fragments) + end + + def utime(modified_time, *filenames) + filenames.each do |filename| + get_entry(filename).time = modified_time + end + end + + def mtime(filename) + @mapped_zip.get_entry(filename).mtime + end + + def atime(filename) + e = get_entry(filename) + if e.extra.member? 'UniversalTime' + e.extra['UniversalTime'].atime + elsif e.extra.member? 'NTFS' + e.extra['NTFS'].atime + end + end + + def ctime(filename) + e = get_entry(filename) + if e.extra.member? 'UniversalTime' + e.extra['UniversalTime'].ctime + elsif e.extra.member? 'NTFS' + e.extra['NTFS'].ctime + end + end + + def pipe?(_filename) + false + end + + def blockdev?(_filename) + false + end + + def chardev?(_filename) + false + end + + def symlink?(_filename) + false + end + + def socket?(_filename) + false + end + + def ftype(filename) + @mapped_zip.get_entry(filename).directory? ? 'directory' : 'file' + end + + def readlink(_filename) + raise NotImplementedError, 'The readlink() function is not implemented' + end + + def symlink(_filename, _symlink_name) + raise NotImplementedError, 'The symlink() function is not implemented' + end + + def link(_filename, _symlink_name) + raise NotImplementedError, 'The link() function is not implemented' + end + + def pipe + raise NotImplementedError, 'The pipe() function is not implemented' + end + + def stat(filename) + raise Errno::ENOENT, filename unless exists?(filename) + + ZipFsStat.new(self, filename) + end + + alias lstat stat + + def readlines(filename) + self.open(filename, &:readlines) + end + + def read(filename) + @mapped_zip.read(filename) + end + + def popen(*args, &a_proc) + ::File.popen(*args, &a_proc) + end + + def foreach(filename, sep = $INPUT_RECORD_SEPARATOR, &a_proc) + self.open(filename) { |is| is.each_line(sep, &a_proc) } + end + + def delete(*args) + args.each do |filename| + if directory?(filename) + raise Errno::EISDIR, "Is a directory - \"#{filename}\"" + end + + @mapped_zip.remove(filename) + end + end + + def rename(file_to_rename, new_name) + @mapped_zip.rename(file_to_rename, new_name) { true } + end + + alias unlink delete + + def expand_path(path) + @mapped_zip.expand_path(path) + end + end + + # Instances of this class are normally accessed via the accessor + # ZipFile::dir. An instance of ZipFsDir behaves like ruby's + # builtin Dir (class) object, except it works on ZipFile entries. + # + # The individual methods are not documented due to their + # similarity with the methods in Dir + class ZipFsDir + def initialize(mapped_zip) + @mapped_zip = mapped_zip + end + + attr_writer :file + + def new(directory_name) + ZipFsDirIterator.new(entries(directory_name)) + end + + def open(directory_name) + dir_iter = new(directory_name) + if block_given? + begin + yield(dir_iter) + return nil + ensure + dir_iter.close + end + end + dir_iter + end + + def pwd + @mapped_zip.pwd + end + alias getwd pwd + + def chdir(directory_name) + unless @file.stat(directory_name).directory? + raise Errno::EINVAL, "Invalid argument - #{directory_name}" + end + + @mapped_zip.pwd = @file.expand_path(directory_name) + end + + def entries(directory_name) + entries = [] + foreach(directory_name) { |e| entries << e } + entries + end + + def glob(*args, &block) + @mapped_zip.glob(*args, &block) + end + + def foreach(directory_name) + unless @file.stat(directory_name).directory? + raise Errno::ENOTDIR, directory_name + end + + path = @file.expand_path(directory_name) + path << '/' unless path.end_with?('/') + path = Regexp.escape(path) + subdir_entry_regex = Regexp.new("^#{path}([^/]+)$") + @mapped_zip.each do |filename| + match = subdir_entry_regex.match(filename) + yield(match[1]) unless match.nil? + end + end + + def delete(entry_name) + unless @file.stat(entry_name).directory? + raise Errno::EINVAL, "Invalid argument - #{entry_name}" + end + + @mapped_zip.remove(entry_name) + end + alias rmdir delete + alias unlink delete + + def mkdir(entry_name, permissions = 0o755) + @mapped_zip.mkdir(entry_name, permissions) + end + + def chroot(*_args) + raise NotImplementedError, 'The chroot() function is not implemented' + end + end + + class ZipFsDirIterator # :nodoc:all + include Enumerable + + def initialize(filenames) + @filenames = filenames + @index = 0 + end + + def close + @filenames = nil + end + + def each(&a_proc) + raise IOError, 'closed directory' if @filenames.nil? + + @filenames.each(&a_proc) + end + + def read + raise IOError, 'closed directory' if @filenames.nil? + + @filenames[(@index += 1) - 1] + end + + def rewind + raise IOError, 'closed directory' if @filenames.nil? + + @index = 0 + end + + def seek(position) + raise IOError, 'closed directory' if @filenames.nil? + + @index = position + end + + def tell + raise IOError, 'closed directory' if @filenames.nil? + + @index + end + end + + # All access to Zip::File from ZipFsFile and ZipFsDir goes through a + # ZipFileNameMapper, which has one responsibility: ensure + class ZipFileNameMapper # :nodoc:all + include Enumerable + + def initialize(zip_file) + @zip_file = zip_file + @pwd = '/' + end + + attr_accessor :pwd + + def find_entry(filename) + @zip_file.find_entry(expand_to_entry(filename)) + end + + def get_entry(filename) + @zip_file.get_entry(expand_to_entry(filename)) + end + + def get_input_stream(filename, &a_proc) + @zip_file.get_input_stream(expand_to_entry(filename), &a_proc) + end + + def get_output_stream(filename, permissions = nil, &a_proc) + @zip_file.get_output_stream( + expand_to_entry(filename), permissions, &a_proc + ) + end + + def glob(pattern, *flags, &block) + @zip_file.glob(expand_to_entry(pattern), *flags, &block) + end + + def read(filename) + @zip_file.read(expand_to_entry(filename)) + end + + def remove(filename) + @zip_file.remove(expand_to_entry(filename)) + end + + def rename(filename, new_name, &continue_on_exists_proc) + @zip_file.rename( + expand_to_entry(filename), + expand_to_entry(new_name), + &continue_on_exists_proc + ) + end + + def mkdir(filename, permissions = 0o755) + @zip_file.mkdir(expand_to_entry(filename), permissions) + end + + # Turns entries into strings and adds leading / + # and removes trailing slash on directories + def each + @zip_file.each do |e| + yield('/' + e.to_s.chomp('/')) + end + end + + def expand_path(path) + expanded = path.start_with?('/') ? path : ::File.join(@pwd, path) + expanded.gsub!(/\/\.(\/|$)/, '') + expanded.gsub!(/[^\/]+\/\.\.(\/|$)/, '') + expanded.empty? ? '/' : expanded + end + + private + + def expand_to_entry(path) + expand_path(path)[1..-1] + end + end + end + + class File + include FileSystem + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/inflater.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/inflater.rb new file mode 100644 index 000000000000..530f98aa43c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/inflater.rb @@ -0,0 +1,54 @@ +module Zip + class Inflater < Decompressor #:nodoc:all + def initialize(*args) + super + + @buffer = +'' + @zlib_inflater = ::Zlib::Inflate.new(-Zlib::MAX_WBITS) + end + + def read(length = nil, outbuf = '') + return (length.nil? || length.zero? ? '' : nil) if eof + + while length.nil? || (@buffer.bytesize < length) + break if input_finished? + + @buffer << produce_input + end + + outbuf.replace(@buffer.slice!(0...(length || @buffer.bytesize))) + end + + def eof + @buffer.empty? && input_finished? + end + + alias eof? eof + + private + + def produce_input + retried = 0 + begin + @zlib_inflater.inflate(input_stream.read(Decompressor::CHUNK_SIZE)) + rescue Zlib::BufError + raise if retried >= 5 # how many times should we retry? + + retried += 1 + retry + end + rescue Zlib::Error + raise(::Zip::DecompressionError, 'zlib error while inflating') + end + + def input_finished? + @zlib_inflater.finished? + end + end + + ::Zip::Decompressor.register(::Zip::COMPRESSION_METHOD_DEFLATE, ::Zip::Inflater) +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/input_stream.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/input_stream.rb new file mode 100644 index 000000000000..f942d19041ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/input_stream.rb @@ -0,0 +1,180 @@ +module Zip + # InputStream is the basic class for reading zip entries in a + # zip file. It is possible to create a InputStream object directly, + # passing the zip file name to the constructor, but more often than not + # the InputStream will be obtained from a File (perhaps using the + # ZipFileSystem interface) object for a particular entry in the zip + # archive. + # + # A InputStream inherits IOExtras::AbstractInputStream in order + # to provide an IO-like interface for reading from a single zip + # entry. Beyond methods for mimicking an IO-object it contains + # the method get_next_entry for iterating through the entries of + # an archive. get_next_entry returns a Entry object that describes + # the zip entry the InputStream is currently reading from. + # + # Example that creates a zip archive with ZipOutputStream and reads it + # back again with a InputStream. + # + # require 'zip' + # + # Zip::OutputStream.open("my.zip") do |io| + # + # io.put_next_entry("first_entry.txt") + # io.write "Hello world!" + # + # io.put_next_entry("adir/first_entry.txt") + # io.write "Hello again!" + # end + # + # + # Zip::InputStream.open("my.zip") do |io| + # + # while (entry = io.get_next_entry) + # puts "Contents of #{entry.name}: '#{io.read}'" + # end + # end + # + # java.util.zip.ZipInputStream is the original inspiration for this + # class. + + class InputStream + CHUNK_SIZE = 32_768 + + include ::Zip::IOExtras::AbstractInputStream + + # Opens the indicated zip file. An exception is thrown + # if the specified offset in the specified filename is + # not a local zip entry header. + # + # @param context [String||IO||StringIO] file path or IO/StringIO object + # @param offset [Integer] offset in the IO/StringIO + def initialize(context, offset = 0, decrypter = nil) + super() + @archive_io = get_io(context, offset) + @decompressor = ::Zip::NullDecompressor + @decrypter = decrypter || ::Zip::NullDecrypter.new + @current_entry = nil + end + + def close + @archive_io.close + end + + # Returns a Entry object. It is necessary to call this + # method on a newly created InputStream before reading from + # the first entry in the archive. Returns nil when there are + # no more entries. + def get_next_entry + @archive_io.seek(@current_entry.next_header_offset, IO::SEEK_SET) if @current_entry + open_entry + end + + # Rewinds the stream to the beginning of the current entry + def rewind + return if @current_entry.nil? + + @lineno = 0 + @pos = 0 + @archive_io.seek(@current_entry.local_header_offset, IO::SEEK_SET) + open_entry + end + + # Modeled after IO.sysread + def sysread(length = nil, outbuf = '') + @decompressor.read(length, outbuf) + end + + class << self + # Same as #initialize but if a block is passed the opened + # stream is passed to the block and closed when the block + # returns. + def open(filename_or_io, offset = 0, decrypter = nil) + zio = new(filename_or_io, offset, decrypter) + return zio unless block_given? + + begin + yield zio + ensure + zio.close if zio + end + end + + def open_buffer(filename_or_io, offset = 0) + warn 'open_buffer is deprecated!!! Use open instead!' + ::Zip::InputStream.open(filename_or_io, offset) + end + end + + protected + + def get_io(io_or_file, offset = 0) + if io_or_file.respond_to?(:seek) + io = io_or_file.dup + io.seek(offset, ::IO::SEEK_SET) + io + else + file = ::File.open(io_or_file, 'rb') + file.seek(offset, ::IO::SEEK_SET) + file + end + end + + def open_entry + @current_entry = ::Zip::Entry.read_local_entry(@archive_io) + if @current_entry && @current_entry.encrypted? && @decrypter.kind_of?(NullEncrypter) + raise Error, 'password required to decode zip file' + end + + if @current_entry && @current_entry.incomplete? && @current_entry.crc == 0 \ + && @current_entry.compressed_size == 0 \ + && @current_entry.size == 0 && !@complete_entry + raise GPFBit3Error, + 'General purpose flag Bit 3 is set so not possible to get proper info from local header.' \ + 'Please use ::Zip::File instead of ::Zip::InputStream' + end + @decrypted_io = get_decrypted_io + @decompressor = get_decompressor + flush + @current_entry + end + + def get_decrypted_io + header = @archive_io.read(@decrypter.header_bytesize) + @decrypter.reset!(header) + + ::Zip::DecryptedIo.new(@archive_io, @decrypter) + end + + def get_decompressor + return ::Zip::NullDecompressor if @current_entry.nil? + + decompressed_size = + if @current_entry.incomplete? && @current_entry.crc == 0 && @current_entry.size == 0 && @complete_entry + @complete_entry.size + else + @current_entry.size + end + + decompressor_class = ::Zip::Decompressor.find_by_compression_method(@current_entry.compression_method) + if decompressor_class.nil? + raise ::Zip::CompressionMethodError, + "Unsupported compression method #{@current_entry.compression_method}" + end + + decompressor_class.new(@decrypted_io, decompressed_size) + end + + def produce_input + @decompressor.read(CHUNK_SIZE) + end + + def input_finished? + @decompressor.eof + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/ioextras.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/ioextras.rb new file mode 100644 index 000000000000..63774d33ee0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/ioextras.rb @@ -0,0 +1,36 @@ +module Zip + module IOExtras #:nodoc: + CHUNK_SIZE = 131_072 + + RANGE_ALL = 0..-1 + + class << self + def copy_stream(ostream, istream) + ostream.write(istream.read(CHUNK_SIZE, '')) until istream.eof? + end + + def copy_stream_n(ostream, istream, nbytes) + toread = nbytes + while toread > 0 && !istream.eof? + tr = toread > CHUNK_SIZE ? CHUNK_SIZE : toread + ostream.write(istream.read(tr, '')) + toread -= tr + end + end + end + + # Implements kind_of? in order to pretend to be an IO object + module FakeIO + def kind_of?(object) + object == IO || super + end + end + end +end + +require 'zip/ioextras/abstract_input_stream' +require 'zip/ioextras/abstract_output_stream' + +# Copyright (C) 2002-2004 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/ioextras/abstract_input_stream.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/ioextras/abstract_input_stream.rb new file mode 100644 index 000000000000..8392d240edfd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/ioextras/abstract_input_stream.rb @@ -0,0 +1,122 @@ +module Zip + module IOExtras + # Implements many of the convenience methods of IO + # such as gets, getc, readline and readlines + # depends on: input_finished?, produce_input and read + module AbstractInputStream + include Enumerable + include FakeIO + + def initialize + super + @lineno = 0 + @pos = 0 + @output_buffer = '' + end + + attr_accessor :lineno + attr_reader :pos + + def read(number_of_bytes = nil, buf = '') + tbuf = if @output_buffer.bytesize > 0 + if number_of_bytes <= @output_buffer.bytesize + @output_buffer.slice!(0, number_of_bytes) + else + number_of_bytes -= @output_buffer.bytesize if number_of_bytes + rbuf = sysread(number_of_bytes, buf) + out = @output_buffer + out << rbuf if rbuf + @output_buffer = '' + out + end + else + sysread(number_of_bytes, buf) + end + + if tbuf.nil? || tbuf.empty? + return nil if number_of_bytes + + return '' + end + + @pos += tbuf.length + + if buf + buf.replace(tbuf) + else + buf = tbuf + end + buf + end + + def readlines(a_sep_string = $INPUT_RECORD_SEPARATOR) + ret_val = [] + each_line(a_sep_string) { |line| ret_val << line } + ret_val + end + + def gets(a_sep_string = $INPUT_RECORD_SEPARATOR, number_of_bytes = nil) + @lineno = @lineno.next + + if number_of_bytes.respond_to?(:to_int) + number_of_bytes = number_of_bytes.to_int + a_sep_string = a_sep_string.to_str if a_sep_string + elsif a_sep_string.respond_to?(:to_int) + number_of_bytes = a_sep_string.to_int + a_sep_string = $INPUT_RECORD_SEPARATOR + else + number_of_bytes = nil + a_sep_string = a_sep_string.to_str if a_sep_string + end + + return read(number_of_bytes) if a_sep_string.nil? + + a_sep_string = "#{$INPUT_RECORD_SEPARATOR}#{$INPUT_RECORD_SEPARATOR}" if a_sep_string.empty? + + buffer_index = 0 + over_limit = (number_of_bytes && @output_buffer.bytesize >= number_of_bytes) + while (match_index = @output_buffer.index(a_sep_string, buffer_index)).nil? && !over_limit + buffer_index = [buffer_index, @output_buffer.bytesize - a_sep_string.bytesize].max + return @output_buffer.empty? ? nil : flush if input_finished? + + @output_buffer << produce_input + over_limit = (number_of_bytes && @output_buffer.bytesize >= number_of_bytes) + end + sep_index = [match_index + a_sep_string.bytesize, number_of_bytes || @output_buffer.bytesize].min + @pos += sep_index + @output_buffer.slice!(0...sep_index) + end + + def ungetc(byte) + @output_buffer = byte.chr + @output_buffer + end + + def flush + ret_val = @output_buffer + @output_buffer = '' + ret_val + end + + def readline(a_sep_string = $INPUT_RECORD_SEPARATOR) + ret_val = gets(a_sep_string) + raise EOFError unless ret_val + + ret_val + end + + def each_line(a_sep_string = $INPUT_RECORD_SEPARATOR) + loop { yield readline(a_sep_string) } + rescue EOFError + # We just need to catch this; we don't need to handle it. + end + + alias each each_line + + def eof + @output_buffer.empty? && input_finished? + end + + alias eof? eof + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/ioextras/abstract_output_stream.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/ioextras/abstract_output_stream.rb new file mode 100644 index 000000000000..b94c9d49a31a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/ioextras/abstract_output_stream.rb @@ -0,0 +1,43 @@ +module Zip + module IOExtras + # Implements many of the output convenience methods of IO. + # relies on << + module AbstractOutputStream + include FakeIO + + def write(data) + self << data + data.to_s.bytesize + end + + def print(*params) + self << params.join($OUTPUT_FIELD_SEPARATOR) << $OUTPUT_RECORD_SEPARATOR.to_s + end + + def printf(a_format_string, *params) + self << format(a_format_string, *params) + end + + def putc(an_object) + self << case an_object + when Integer + an_object.chr + when String + an_object + else + raise TypeError, 'putc: Only Integer and String supported' + end + an_object + end + + def puts(*params) + params << "\n" if params.empty? + params.flatten.each do |element| + val = element.to_s + self << val + self << "\n" unless val[-1, 1] == "\n" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/null_compressor.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/null_compressor.rb new file mode 100644 index 000000000000..70fd3294e899 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/null_compressor.rb @@ -0,0 +1,15 @@ +module Zip + class NullCompressor < Compressor #:nodoc:all + include Singleton + + def <<(_data) + raise IOError, 'closed stream' + end + + attr_reader :size, :compressed_size + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/null_decompressor.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/null_decompressor.rb new file mode 100644 index 000000000000..6534b16179ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/null_decompressor.rb @@ -0,0 +1,19 @@ +module Zip + module NullDecompressor #:nodoc:all + module_function + + def read(_length = nil, _outbuf = nil) + nil + end + + def eof + true + end + + alias eof? eof + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/null_input_stream.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/null_input_stream.rb new file mode 100644 index 000000000000..2cd366162d3d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/null_input_stream.rb @@ -0,0 +1,10 @@ +module Zip + module NullInputStream #:nodoc:all + include ::Zip::NullDecompressor + include ::Zip::IOExtras::AbstractInputStream + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/output_stream.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/output_stream.rb new file mode 100644 index 000000000000..266083cd6bda --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/output_stream.rb @@ -0,0 +1,198 @@ +module Zip + # ZipOutputStream is the basic class for writing zip files. It is + # possible to create a ZipOutputStream object directly, passing + # the zip file name to the constructor, but more often than not + # the ZipOutputStream will be obtained from a ZipFile (perhaps using the + # ZipFileSystem interface) object for a particular entry in the zip + # archive. + # + # A ZipOutputStream inherits IOExtras::AbstractOutputStream in order + # to provide an IO-like interface for writing to a single zip + # entry. Beyond methods for mimicking an IO-object it contains + # the method put_next_entry that closes the current entry + # and creates a new. + # + # Please refer to ZipInputStream for example code. + # + # java.util.zip.ZipOutputStream is the original inspiration for this + # class. + + class OutputStream + include ::Zip::IOExtras::AbstractOutputStream + + attr_accessor :comment + + # Opens the indicated zip file. If a file with that name already + # exists it will be overwritten. + def initialize(file_name, stream = false, encrypter = nil) + super() + @file_name = file_name + @output_stream = if stream + iostream = @file_name.dup + iostream.reopen(@file_name) + iostream.rewind + iostream + else + ::File.new(@file_name, 'wb') + end + @entry_set = ::Zip::EntrySet.new + @compressor = ::Zip::NullCompressor.instance + @encrypter = encrypter || ::Zip::NullEncrypter.new + @closed = false + @current_entry = nil + @comment = nil + end + + # Same as #initialize but if a block is passed the opened + # stream is passed to the block and closed when the block + # returns. + class << self + def open(file_name, encrypter = nil) + return new(file_name) unless block_given? + + zos = new(file_name, false, encrypter) + yield zos + ensure + zos.close if zos + end + + # Same as #open but writes to a filestream instead + def write_buffer(io = ::StringIO.new(''), encrypter = nil) + io.binmode if io.respond_to?(:binmode) + zos = new(io, true, encrypter) + yield zos + zos.close_buffer + end + end + + # Closes the stream and writes the central directory to the zip file + def close + return if @closed + + finalize_current_entry + update_local_headers + write_central_directory + @output_stream.close + @closed = true + end + + # Closes the stream and writes the central directory to the zip file + def close_buffer + return @output_stream if @closed + + finalize_current_entry + update_local_headers + write_central_directory + @closed = true + @output_stream + end + + # Closes the current entry and opens a new for writing. + # +entry+ can be a ZipEntry object or a string. + def put_next_entry(entry_name, comment = nil, extra = nil, compression_method = Entry::DEFLATED, level = Zip.default_compression) + raise Error, 'zip stream is closed' if @closed + + new_entry = if entry_name.kind_of?(Entry) + entry_name + else + Entry.new(@file_name, entry_name.to_s) + end + new_entry.comment = comment unless comment.nil? + unless extra.nil? + new_entry.extra = extra.kind_of?(ExtraField) ? extra : ExtraField.new(extra.to_s) + end + new_entry.compression_method = compression_method unless compression_method.nil? + init_next_entry(new_entry, level) + @current_entry = new_entry + end + + def copy_raw_entry(entry) + entry = entry.dup + raise Error, 'zip stream is closed' if @closed + raise Error, 'entry is not a ZipEntry' unless entry.kind_of?(Entry) + + finalize_current_entry + @entry_set << entry + src_pos = entry.local_header_offset + entry.write_local_entry(@output_stream) + @compressor = NullCompressor.instance + entry.get_raw_input_stream do |is| + is.seek(src_pos, IO::SEEK_SET) + ::Zip::Entry.read_local_entry(is) + IOExtras.copy_stream_n(@output_stream, is, entry.compressed_size) + end + @compressor = NullCompressor.instance + @current_entry = nil + end + + private + + def finalize_current_entry + return unless @current_entry + + finish + @current_entry.compressed_size = @output_stream.tell - \ + @current_entry.local_header_offset - \ + @current_entry.calculate_local_header_size + @current_entry.size = @compressor.size + @current_entry.crc = @compressor.crc + @output_stream << @encrypter.data_descriptor(@current_entry.crc, @current_entry.compressed_size, @current_entry.size) + @current_entry.gp_flags |= @encrypter.gp_flags + @current_entry = nil + @compressor = ::Zip::NullCompressor.instance + end + + def init_next_entry(entry, level = Zip.default_compression) + finalize_current_entry + @entry_set << entry + entry.write_local_entry(@output_stream) + @encrypter.reset! + @output_stream << @encrypter.header(entry.mtime) + @compressor = get_compressor(entry, level) + end + + def get_compressor(entry, level) + case entry.compression_method + when Entry::DEFLATED + ::Zip::Deflater.new(@output_stream, level, @encrypter) + when Entry::STORED + ::Zip::PassThruCompressor.new(@output_stream) + else + raise ::Zip::CompressionMethodError, + "Invalid compression method: '#{entry.compression_method}'" + end + end + + def update_local_headers + pos = @output_stream.pos + @entry_set.each do |entry| + @output_stream.pos = entry.local_header_offset + entry.write_local_entry(@output_stream, true) + end + @output_stream.pos = pos + end + + def write_central_directory + cdir = CentralDirectory.new(@entry_set, @comment) + cdir.write_to_stream(@output_stream) + end + + protected + + def finish + @compressor.finish + end + + public + + # Modeled after IO.<< + def <<(data) + @compressor << data + self + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/pass_thru_compressor.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/pass_thru_compressor.rb new file mode 100644 index 000000000000..2dbaa273402f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/pass_thru_compressor.rb @@ -0,0 +1,23 @@ +module Zip + class PassThruCompressor < Compressor #:nodoc:all + def initialize(output_stream) + super() + @output_stream = output_stream + @crc = Zlib.crc32 + @size = 0 + end + + def <<(data) + val = data.to_s + @crc = Zlib.crc32(val, @crc) + @size += val.bytesize + @output_stream << val + end + + attr_reader :size, :crc + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/pass_thru_decompressor.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/pass_thru_decompressor.rb new file mode 100644 index 000000000000..e638540e0e8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/pass_thru_decompressor.rb @@ -0,0 +1,31 @@ +module Zip + class PassThruDecompressor < Decompressor #:nodoc:all + def initialize(*args) + super + @read_so_far = 0 + end + + def read(length = nil, outbuf = '') + return (length.nil? || length.zero? ? '' : nil) if eof + + if length.nil? || (@read_so_far + length) > decompressed_size + length = decompressed_size - @read_so_far + end + + @read_so_far += length + input_stream.read(length, outbuf) + end + + def eof + @read_so_far >= decompressed_size + end + + alias eof? eof + end + + ::Zip::Decompressor.register(::Zip::COMPRESSION_METHOD_STORE, ::Zip::PassThruDecompressor) +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/streamable_directory.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/streamable_directory.rb new file mode 100644 index 000000000000..3738ce2c7811 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/streamable_directory.rb @@ -0,0 +1,15 @@ +module Zip + class StreamableDirectory < Entry + def initialize(zipfile, entry, src_path = nil, permission = nil) + super(zipfile, entry) + + @ftype = :directory + entry.get_extra_attributes_from_path(src_path) if src_path + @unix_perms = permission if permission + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/streamable_stream.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/streamable_stream.rb new file mode 100644 index 000000000000..68f3e0e8c3f9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/streamable_stream.rb @@ -0,0 +1,52 @@ +module Zip + class StreamableStream < DelegateClass(Entry) # :nodoc:all + def initialize(entry) + super(entry) + @temp_file = Tempfile.new(::File.basename(name)) + @temp_file.binmode + end + + def get_output_stream + if block_given? + begin + yield(@temp_file) + ensure + @temp_file.close + end + else + @temp_file + end + end + + def get_input_stream + unless @temp_file.closed? + raise StandardError, "cannot open entry for reading while its open for writing - #{name}" + end + + @temp_file.open # reopens tempfile from top + @temp_file.binmode + if block_given? + begin + yield(@temp_file) + ensure + @temp_file.close + end + else + @temp_file + end + end + + def write_to_zip_output_stream(output_stream) + output_stream.put_next_entry(self) + get_input_stream { |is| ::Zip::IOExtras.copy_stream(output_stream, is) } + end + + def clean_up + @temp_file.unlink + end + end +end + +# Copyright (C) 2002, 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/version.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/version.rb new file mode 100644 index 000000000000..0b20c2144ce1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/lib/zip/version.rb @@ -0,0 +1,3 @@ +module Zip + VERSION = '2.3.0' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/example.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/example.rb new file mode 100644 index 000000000000..345e7e190478 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/example.rb @@ -0,0 +1,81 @@ +#!/usr/bin/env ruby + +$LOAD_PATH << '../lib' +system('zip example.zip example.rb gtk_ruby_zip.rb') + +require 'zip' + +####### Using ZipInputStream alone: ####### + +Zip::InputStream.open('example.zip') do |zis| + entry = zis.get_next_entry + print "First line of '#{entry.name} (#{entry.size} bytes): " + puts "'#{zis.gets.chomp}'" + entry = zis.get_next_entry + print "First line of '#{entry.name} (#{entry.size} bytes): " + puts "'#{zis.gets.chomp}'" +end + +####### Using ZipFile to read the directory of a zip file: ####### + +zf = Zip::File.new('example.zip') +zf.each_with_index do |entry, index| + puts "entry #{index} is #{entry.name}, size = #{entry.size}, compressed size = #{entry.compressed_size}" + # use zf.get_input_stream(entry) to get a ZipInputStream for the entry + # entry can be the ZipEntry object or any object which has a to_s method that + # returns the name of the entry. +end + +####### Using ZipOutputStream to write a zip file: ####### + +Zip::OutputStream.open('exampleout.zip') do |zos| + zos.put_next_entry('the first little entry') + zos.puts 'Hello hello hello hello hello hello hello hello hello' + + zos.put_next_entry('the second little entry') + zos.puts 'Hello again' + + # Use rubyzip or your zip client of choice to verify + # the contents of exampleout.zip +end + +####### Using ZipFile to change a zip file: ####### + +Zip::File.open('exampleout.zip') do |zip_file| + zip_file.add('thisFile.rb', 'example.rb') + zip_file.rename('thisFile.rb', 'ILikeThisName.rb') + zip_file.add('Again', 'example.rb') +end + +# Lets check +Zip::File.open('exampleout.zip') do |zip_file| + puts "Changed zip file contains: #{zip_file.entries.join(', ')}" + zip_file.remove('Again') + puts "Without 'Again': #{zip_file.entries.join(', ')}" +end + +####### Using ZipFile to split a zip file: ####### + +# Creating large zip file for splitting +Zip::OutputStream.open('large_zip_file.zip') do |zos| + puts 'Creating zip file...' + 10.times do |i| + zos.put_next_entry("large_entry_#{i}.txt") + zos.puts 'Hello' * 104_857_600 + end +end + +# Splitting created large zip file +part_zips_count = Zip::File.split('large_zip_file.zip', 2_097_152, false) +puts "Zip file splitted in #{part_zips_count} parts" + +# Track splitting an archive +Zip::File.split('large_zip_file.zip', 1_048_576, true, 'part_zip_file') do |part_count, part_index, chunk_bytes, segment_bytes| + puts "#{part_index} of #{part_count} part splitting: #{(chunk_bytes.to_f / segment_bytes * 100).to_i}%" +end + +# For other examples, look at zip.rb and ziptest.rb + +# Copyright (C) 2002 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/example_filesystem.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/example_filesystem.rb new file mode 100644 index 000000000000..0d93ab6bcd93 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/example_filesystem.rb @@ -0,0 +1,31 @@ +#!/usr/bin/env ruby + +$LOAD_PATH << '../lib' + +require 'zip/filesystem' + +EXAMPLE_ZIP = 'filesystem.zip' + +File.delete(EXAMPLE_ZIP) if File.exist?(EXAMPLE_ZIP) + +Zip::File.open(EXAMPLE_ZIP, Zip::File::CREATE) do |zf| + zf.file.open('file1.txt', 'w') { |os| os.write 'first file1.txt' } + zf.dir.mkdir('dir1') + zf.dir.chdir('dir1') + zf.file.open('file1.txt', 'w') { |os| os.write 'second file1.txt' } + puts zf.file.read('file1.txt') + puts zf.file.read('../file1.txt') + zf.dir.chdir('..') + zf.file.open('file2.txt', 'w') { |os| os.write 'first file2.txt' } + puts "Entries: #{zf.entries.join(', ')}" +end + +Zip::File.open(EXAMPLE_ZIP) do |zf| + puts "Entries from reloaded zip: #{zf.entries.join(', ')}" +end + +# For other examples, look at zip.rb and ziptest.rb + +# Copyright (C) 2003 Thomas Sondergaard +# rubyzip is free software; you can redistribute it and/or +# modify it under the terms of the ruby license. diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/example_recursive.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/example_recursive.rb new file mode 100644 index 000000000000..56a5cc7c2fa9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/example_recursive.rb @@ -0,0 +1,54 @@ +require 'zip' + +# This is a simple example which uses rubyzip to +# recursively generate a zip file from the contents of +# a specified directory. The directory itself is not +# included in the archive, rather just its contents. +# +# Usage: +# directory_to_zip = "/tmp/input" +# output_file = "/tmp/out.zip" +# zf = ZipFileGenerator.new(directory_to_zip, output_file) +# zf.write() +class ZipFileGenerator + # Initialize with the directory to zip and the location of the output archive. + def initialize(input_dir, output_file) + @input_dir = input_dir + @output_file = output_file + end + + # Zip the input directory. + def write + entries = Dir.entries(@input_dir) - %w[. ..] + + ::Zip::File.open(@output_file, ::Zip::File::CREATE) do |zipfile| + write_entries entries, '', zipfile + end + end + + private + + # A helper method to make the recursion work. + def write_entries(entries, path, zipfile) + entries.each do |e| + zipfile_path = path == '' ? e : File.join(path, e) + disk_file_path = File.join(@input_dir, zipfile_path) + + if File.directory? disk_file_path + recursively_deflate_directory(disk_file_path, zipfile, zipfile_path) + else + put_into_archive(disk_file_path, zipfile, zipfile_path) + end + end + end + + def recursively_deflate_directory(disk_file_path, zipfile, zipfile_path) + zipfile.mkdir zipfile_path + subdir = Dir.entries(disk_file_path) - %w[. ..] + write_entries subdir, zipfile_path, zipfile + end + + def put_into_archive(disk_file_path, zipfile, zipfile_path) + zipfile.add(zipfile_path, disk_file_path) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/gtk_ruby_zip.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/gtk_ruby_zip.rb new file mode 100644 index 000000000000..a86f0a9ee532 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/gtk_ruby_zip.rb @@ -0,0 +1,84 @@ +#!/usr/bin/env ruby + +$LOAD_PATH << '../lib' + +$VERBOSE = true + +require 'gtk' +require 'zip' + +class MainApp < Gtk::Window + def initialize + super() + set_usize(400, 256) + set_title('rubyzip') + signal_connect(Gtk::Window::SIGNAL_DESTROY) { Gtk.main_quit } + + box = Gtk::VBox.new(false, 0) + add(box) + + @zipfile = nil + @button_panel = ButtonPanel.new + @button_panel.open_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do + show_file_selector + end + @button_panel.extract_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do + puts 'Not implemented!' + end + box.pack_start(@button_panel, false, false, 0) + + sw = Gtk::ScrolledWindow.new + sw.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC) + box.pack_start(sw, true, true, 0) + + @clist = Gtk::CList.new(%w[Name Size Compression]) + @clist.set_selection_mode(Gtk::SELECTION_BROWSE) + @clist.set_column_width(0, 120) + @clist.set_column_width(1, 120) + @clist.signal_connect(Gtk::CList::SIGNAL_SELECT_ROW) do |_w, row, _column, _event| + @selected_row = row + end + sw.add(@clist) + end + + class ButtonPanel < Gtk::HButtonBox + attr_reader :open_button, :extract_button + def initialize + super + set_layout(Gtk::BUTTONBOX_START) + set_spacing(0) + @open_button = Gtk::Button.new('Open archive') + @extract_button = Gtk::Button.new('Extract entry') + pack_start(@open_button) + pack_start(@extract_button) + end + end + + def show_file_selector + @file_selector = Gtk::FileSelection.new('Open zip file') + @file_selector.show + @file_selector.ok_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do + open_zip(@file_selector.filename) + @file_selector.destroy + end + @file_selector.cancel_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do + @file_selector.destroy + end + end + + def open_zip(filename) + @zipfile = Zip::File.open(filename) + @clist.clear + @zipfile.each do |entry| + @clist.append([entry.name, + entry.size.to_s, + (100.0 * entry.compressedSize / entry.size).to_s + '%']) + end + end +end + +main_app = MainApp.new + +main_app.show_all + +Gtk.main diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/qtzip.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/qtzip.rb new file mode 100644 index 000000000000..2c189ed639e0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/qtzip.rb @@ -0,0 +1,92 @@ +#!/usr/bin/env ruby + +$VERBOSE = true + +$LOAD_PATH << '../lib' + +require 'Qt' +system('rbuic -o zipdialogui.rb zipdialogui.ui') +require 'zipdialogui.rb' +require 'zip' + +a = Qt::Application.new(ARGV) + +class ZipDialog < ZipDialogUI + def initialize + super() + connect(child('add_button'), SIGNAL('clicked()'), + self, SLOT('add_files()')) + connect(child('extract_button'), SIGNAL('clicked()'), + self, SLOT('extract_files()')) + end + + def zipfile(&a_proc) + Zip::File.open(@zip_filename, &a_proc) + end + + def each(&a_proc) + Zip::File.foreach(@zip_filename, &a_proc) + end + + def refresh + lv = child('entry_list_view') + lv.clear + each do |e| + lv.insert_item(Qt::ListViewItem.new(lv, e.name, e.size.to_s)) + end + end + + def load(zipfile) + @zip_filename = zipfile + refresh + end + + def add_files + l = Qt::FileDialog.getOpenFileNames(nil, nil, self) + zipfile do |zf| + l.each do |path| + zf.add(File.basename(path), path) + end + end + refresh + end + + def extract_files + selected_items = [] + unselected_items = [] + lv_item = entry_list_view.first_child + while lv_item + if entry_list_view.is_selected(lv_item) + selected_items << lv_item.text(0) + else + unselected_items << lv_item.text(0) + end + lv_item = lv_item.next_sibling + end + puts "selected_items.size = #{selected_items.size}" + puts "unselected_items.size = #{unselected_items.size}" + items = !selected_items.empty? ? selected_items : unselected_items + puts "items.size = #{items.size}" + + d = Qt::FileDialog.get_existing_directory(nil, self) + if !d + puts 'No directory chosen' + else + zipfile { |zf| items.each { |e| zf.extract(e, File.join(d, e)) } } + end + end + + slots 'add_files()', 'extract_files()' +end + +unless ARGV[0] + puts "usage: #{$PROGRAM_NAME} zipname" + exit +end + +zd = ZipDialog.new +zd.load(ARGV[0]) + +a.mainWidget = zd +zd.show +a.exec diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/write_simple.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/write_simple.rb new file mode 100644 index 000000000000..8bb31bb37397 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/write_simple.rb @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby + +$LOAD_PATH << '../lib' + +require 'zip' + +::Zip::OutputStream.open('simple.zip') do |zos| + zos.put_next_entry 'entry.txt' + zos.puts 'Hello world' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/zipfind.rb b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/zipfind.rb new file mode 100644 index 000000000000..8f0dbf2e4981 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/rubyzip-2.3.0/samples/zipfind.rb @@ -0,0 +1,67 @@ +#!/usr/bin/env ruby + +$VERBOSE = true + +$LOAD_PATH << '../lib' + +require 'zip' +require 'find' + +module Zip + module ZipFind + def self.find(path, zip_file_pattern = /\.zip$/i) + Find.find(path) do |filename| + yield(filename) + next unless zip_file_pattern.match(filename) && File.file?(filename) + + begin + Zip::File.foreach(filename) do |entry| + yield(filename + File::SEPARATOR + entry.to_s) + end + rescue Errno::EACCES => e + puts e + end + end + end + + def self.find_file(path, filename_pattern, zip_file_pattern = /\.zip$/i) + find(path, zip_file_pattern) do |filename| + yield(filename) if filename_pattern.match(filename) + end + end + end +end + +if $PROGRAM_NAME == __FILE__ + module ZipFindConsoleRunner + PATH_ARG_INDEX = 0 + FILENAME_PATTERN_ARG_INDEX = 1 + ZIPFILE_PATTERN_ARG_INDEX = 2 + + def self.run(args) + check_args(args) + Zip::ZipFind.find_file(args[PATH_ARG_INDEX], + args[FILENAME_PATTERN_ARG_INDEX], + args[ZIPFILE_PATTERN_ARG_INDEX]) do |filename| + report_entry_found filename + end + end + + def self.check_args(args) + return if args.size == 3 + + usage + exit + end + + def self.usage + puts "Usage: #{$PROGRAM_NAME} PATH ZIPFILENAME_PATTERN FILNAME_PATTERN" + end + + def self.report_entry_found(filename) + puts filename + end + end + + ZipFindConsoleRunner.run(ARGV) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/.gitignore b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/.gitignore new file mode 100644 index 000000000000..5fb70cb09796 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/.gitignore @@ -0,0 +1,3 @@ +*.gem +Gemfile.lock +spec/store.yaml diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/.travis.yml new file mode 100644 index 000000000000..231fdbaf0511 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/.travis.yml @@ -0,0 +1,48 @@ +language: + ruby + +before_install: + gem install bundler + +script: + bundle exec rake spec + +rvm: + - ruby-head + - 2.0.0 + - 1.9.3 + - 1.9.2 + - 1.8.7 + - rbx-19mode + - rbx-18mode + - jruby-head + - jruby-19mode + - jruby-18mode + - ree + +env: + - YAMLER=syck + - YAMLER=psych + +matrix: + allow_failures: + - rvm: ruby-head + - rvm: rbx-19mode + - rvm: rbx-18mode + - rvm: jruby-head + - rvm: ree + + exclude: + - rvm: 1.8.7 + env: YAMLER=psych + - rvm: jruby-head + env: YAMLER=syck + - rvm: jruby-19mode + env: YAMLER=syck + - rvm: jruby-18mode + env: YAMLER=syck + +branches: + only: + - master + diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/CHANGES.md b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/CHANGES.md new file mode 100644 index 000000000000..2120a0b7a52d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/CHANGES.md @@ -0,0 +1,154 @@ +1.0.5 +----- + +- fixed [#80](https://github.com/dtao/safe_yaml/issues/80): uninitialized constant DateTime + +1.0.2 +----- + +- added warning when using Psych + an older version of libyaml + +1.0.1 +----- + +- fixed handling for strings that look like (invalid) dates + +1.0.0 +----- + +- updated date parsing to use local timezone +- **now requiring "safe_yaml/load" provides `SafeYAML.load` without clobbering `YAML`** +- fixed handling of empty files +- fixed some (edge case) integer parsing bugs +- fixed some JRuby-specific issues + +0.9.7 +----- + +- made handling of document frontmatter more robust +- added more descriptive message to the warning for omitting the :safe option + +0.9.6 +----- + +- fixed handling of files with trailing content (after closing `---`) + +0.9.5 +----- + +- fixed permissions AGAIN + +0.9.4 +----- + +- corrected handling of symbols + +0.9.3 +----- + +- fixed permissions :( + +0.9.2 +----- + +- fixed error w/ parsing "!" when whitelisting tags +- fixed parsing of the number 0 (d'oh!) + +0.9.1 +----- + +- added Yecht support (JRuby) +- more bug fixes + +0.9.0 +----- + +- added `whitelist!` method for easily whitelisting tags +- added support for call-specific options +- removed deprecated methods + +0.8.6 +----- + +- fixed bug in float matcher + +0.8.5 +----- + +- performance improvements +- made less verbose by default +- bug fixes + +0.8.4 +----- + +- enhancements to parsing of integers, floats, and dates +- updated built-in whitelist +- more bug fixes + +0.8.3 +----- + +- fixed exception on parsing empty document +- fixed handling of octal & hexadecimal numbers + +0.8.2 +----- + +- bug fixes + +0.8.1 +----- + +- added `:raise_on_unknown_tag` option +- renamed `reset_defaults!` to `restore_defaults!` + +0.8 +--- + +- added tag whitelisting +- more API changes + +0.7 +--- + +- separated YAML engine support from Ruby version +- added support for binary scalars +- numerous bug fixes and enhancements + +0.6 +--- + +- several API changes +- added `SafeYAML::OPTIONS` for specifying default behavior + +0.5 +--- + +Added support for dates + +0.4 +--- + +- efficiency improvements +- made `YAML.load` use `YAML.safe_load` by default +- made symbol deserialization optional + +0.3 +--- + +Added Syck support + +0.2 +--- + +Added support for: + +- anchors & aliases +- booleans +- nils + +0.1 +--- + +Initial release \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/Gemfile b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/Gemfile new file mode 100644 index 000000000000..24d7e3e5cc0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/Gemfile @@ -0,0 +1,11 @@ +source "https://rubygems.org" + +gemspec + +group :development do + gem "hashie" + gem "heredoc_unindent" + gem "rake" + gem "rspec" + gem "travis-lint" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/LICENSE.txt new file mode 100644 index 000000000000..4b276dd15fce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2013 Dan Tao + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/README.md b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/README.md new file mode 100644 index 000000000000..a7b7bdcfea15 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/README.md @@ -0,0 +1,191 @@ +SafeYAML +======== + +[![Build Status](https://travis-ci.org/dtao/safe_yaml.png)](http://travis-ci.org/dtao/safe_yaml) +[![Gem Version](https://badge.fury.io/rb/safe_yaml.png)](http://badge.fury.io/rb/safe_yaml) + +The **SafeYAML** gem provides an alternative implementation of `YAML.load` suitable for accepting user input in Ruby applications. Unlike Ruby's built-in implementation of `YAML.load`, SafeYAML's version will not expose apps to arbitrary code execution exploits (such as [the ones discovered](http://www.reddit.com/r/netsec/comments/167c11/serious_vulnerability_in_ruby_on_rails_allowing/) [in Rails in early 2013](http://www.h-online.com/open/news/item/Rails-developers-close-another-extremely-critical-flaw-1793511.html)). + +**If you encounter any issues with SafeYAML, check out the 'Common Issues' section below.** If you don't see anything that addresses the problem you're experiencing, by all means, [create an issue](https://github.com/dtao/safe_yaml/issues/new)! + +Installation +------------ + +Add this line to your application's Gemfile: + +```ruby +gem "safe_yaml" +``` + +Configuration +------------- + +If *all you do* is add SafeYAML to your project, then `YAML.load` will operate in "safe" mode, which means it won't deserialize arbitrary objects. However, it will issue a warning the first time you call it because you haven't explicitly specified whether you want safe or unsafe behavior by default. To specify this behavior (e.g., in a Rails initializer): + +```ruby +SafeYAML::OPTIONS[:default_mode] = :safe # or :unsafe +``` + +Another important option you might want to specify on startup is whether or not to allow *symbols* to be deserialized. The default setting is `false`, since symbols are not garbage collected in Ruby and so deserializing them from YAML may render your application vulnerable to a DOS (denial of service) attack. To allow symbol deserialization by default: + +```ruby +SafeYAML::OPTIONS[:deserialize_symbols] = true +``` + +For more information on these and other options, see the "Usage" section down below. + +What is this gem for, exactly? +------------------------------ + +Suppose your application were to use a popular open source library which contained code like this: + +```ruby +class ClassBuilder + def []=(key, value) + @class ||= Class.new + + @class.class_eval <<-EOS + def #{key} + #{value} + end + EOS + end + + def create + @class.new + end +end +``` + +Now, if you were to use `YAML.load` on user input anywhere in your application without the SafeYAML gem installed, an attacker who suspected you were using this library could send a request with a carefully-crafted YAML string to execute arbitrary code (yes, including `system("unix command")`) on your servers. + +This simple example demonstrates the vulnerability: + +```ruby +yaml = <<-EOYAML +--- !ruby/hash:ClassBuilder +"foo; end; puts %(I'm in yr system!); def bar": "baz" +EOYAML +``` + + > YAML.load(yaml) + I'm in yr system! + => #<ClassBuilder:0x007fdbbe2e25d8 @class=#<Class:0x007fdbbe2e2510>> + +With SafeYAML, the same attacker would be thwarted: + + > require "safe_yaml" + => true + > YAML.load(yaml, :safe => true) + => {"foo; end; puts %(I'm in yr system!); def bar"=>"baz"} + +Usage +----- + +When you require the safe_yaml gem in your project, `YAML.load` is patched to accept one additional (optional) `options` parameter. This changes the method signature as follows: + +- for Syck and Psych prior to Ruby 1.9.3: `YAML.load(yaml, options={})` +- for Psych in 1.9.3 and later: `YAML.load(yaml, filename=nil, options={})` + +The most important option is the `:safe` option (default: `true`), which controls whether or not to deserialize arbitrary objects when parsing a YAML document. The other options, along with explanations, are as follows. + +- `:deserialize_symbols` (default: `false`): Controls whether or not YAML will deserialize symbols. It is probably best to only enable this option where necessary, e.g. to make trusted libraries work. Symbols receive special treatment in Ruby and are not garbage collected, which means deserializing them indiscriminately may render your site vulnerable to a DOS attack. + +- `:whitelisted_tags`: Accepts an array of YAML tags that designate trusted types, e.g., ones that can be deserialized without worrying about any resulting security vulnerabilities. When any of the given tags are encountered in a YAML document, the associated data will be parsed by the underlying YAML engine (Syck or Psych) for the version of Ruby you are using. See the "Whitelisting Trusted Types" section below for more information. + +- `:custom_initializers`: Similar to the `:whitelisted_tags` option, but allows you to provide your own initializers for specified tags rather than using Syck or Psyck. Accepts a hash with string tags for keys and lambdas for values. + +- `:raise_on_unknown_tag` (default: `false`): Represents the highest possible level of paranoia. If the YAML engine encounters any tag other than ones that are automatically trusted by SafeYAML or that you've explicitly whitelisted, it will raise an exception. This may be a good choice if you expect to always be dealing with perfectly safe YAML and want your application to fail loudly upon encountering questionable data. + +All of the above options can be set at the global level via `SafeYAML::OPTIONS`. You can also set each one individually per call to `YAML.load`; an option explicitly passed to `load` will take precedence over an option specified globally. + +What if I don't *want* to patch `YAML`? +--------------------------------------- + +[Excellent question](https://github.com/dtao/safe_yaml/issues/47)! You can also get the methods `SafeYAML.load` and `SafeYAML.load_file` without touching the `YAML` module at all like this: + +```ruby +require "safe_yaml/load" # instead of require "safe_yaml" +``` + +This way, you can use `SafeYAML.load` to parse YAML that *you* don't trust, without affecting the rest of an application (if you're developing a library, for example). + +Supported Types +--------------- + +The way that SafeYAML works is by restricting the kinds of objects that can be deserialized via `YAML.load`. More specifically, only the following types of objects can be deserialized by default: + +- Hashes +- Arrays +- Strings +- Numbers +- Dates +- Times +- Booleans +- Nils + +Again, deserialization of symbols can be enabled globally by setting `SafeYAML::OPTIONS[:deserialize_symbols] = true`, or in a specific call to `YAML.load([some yaml], :deserialize_symbols => true)`. + +Whitelisting Trusted Types +-------------------------- + +SafeYAML supports whitelisting certain YAML tags for trusted types. This is handy when your application uses YAML to serialize and deserialize certain types not listed above, which you know to be free of any deserialization-related vulnerabilities. + +The easiest way to whitelist types is by calling `SafeYAML.whitelist!`, which can accept a variable number of safe types, e.g.: + +```ruby +SafeYAML.whitelist!(Foo, Bar) +``` + +You can also whitelist YAML *tags* via the `:whitelisted_tags` option: + +```ruby +# Using Syck +SafeYAML::OPTIONS[:whitelisted_tags] = ["tag:ruby.yaml.org,2002:object:OpenStruct"] + +# Using Psych +SafeYAML::OPTIONS[:whitelisted_tags] = ["!ruby/object:OpenStruct"] +``` + +And in case you were wondering: no, this feature will *not* allow would-be attackers to embed untrusted types within trusted types: + +```ruby +yaml = <<-EOYAML +--- !ruby/object:OpenStruct +table: + :backdoor: !ruby/hash:ClassBuilder + "foo; end; puts %(I'm in yr system!); def bar": "baz" +EOYAML +``` + + > YAML.safe_load(yaml) + => #<OpenStruct :backdoor={"foo; end; puts %(I'm in yr system!); def bar"=>"baz"}> + +Known Issues +------------ + +If you add SafeYAML to your project and start seeing any errors about missing keys, or you notice mysterious strings that look like `":foo"` (i.e., start with a colon), it's likely you're seeing errors from symbols being saved in YAML format. If you are able to modify the offending code, you might want to consider changing your YAML content to use plain vanilla strings instead of symbols. If not, you may need to set the `:deserialize_symbols` option to `true`, either in calls to `YAML.load` or---as a last resort---globally, with `SafeYAML::OPTIONS[:deserialize_symbols]`. + +Also be aware that some Ruby libraries, particularly those requiring inter-process communication, leverage YAML's object deserialization functionality and therefore may break or otherwise be impacted by SafeYAML. The following list includes known instances of SafeYAML's interaction with other Ruby gems: + +- [**ActiveRecord**](https://github.com/rails/rails/tree/master/activerecord): uses YAML to control serialization of model objects using the `serialize` class method. If you find that accessing serialized properties on your ActiveRecord models is causing errors, chances are you may need to: + 1. set the `:deserialize_symbols` option to `true`, + 2. whitelist some of the types in your serialized data via `SafeYAML.whitelist!` or the `:whitelisted_tags` option, or + 3. both +- [**delayed_job**](https://github.com/collectiveidea/delayed_job): Uses YAML to serialize the objects on which delayed methods are invoked (with `delay`). The safest solution in this case is to use `SafeYAML.whitelist!` to whitelist the types you need to serialize. +- [**Guard**](https://github.com/guard/guard): Uses YAML as a serialization format for notifications. The data serialized uses symbolic keys, so setting `SafeYAML::OPTIONS[:deserialize_symbols] = true` is necessary to allow Guard to work. +- [**sidekiq**](https://github.com/mperham/sidekiq): Uses a YAML configiuration file with symbolic keys, so setting `SafeYAML::OPTIONS[:deserialize_symbols] = true` should allow it to work. + +The above list will grow over time, as more issues are discovered. + +Versioning +---------- + +SafeYAML will follow [semantic versioning](http://semver.org/) so any updates to the first major version will maintain backwards compatability. So expect primarily bug fixes and feature enhancements (if anything!) from here on out... unless it makes sense to break the interface at some point and introduce a version 2.0, which I honestly think is unlikely. + +Requirements +------------ + +SafeYAML requires Ruby 1.8.7 or newer and works with both [Syck](http://www.ruby-doc.org/stdlib-1.8.7/libdoc/yaml/rdoc/YAML.html) and [Psych](http://github.com/tenderlove/psych). + +If you are using a version of Ruby where Psych is the default YAML engine (e.g., 1.9.3) but you want to use Syck, be sure to set `YAML::ENGINE.yamler = "syck"` **before** requiring the safe_yaml gem. diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/Rakefile b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/Rakefile new file mode 100644 index 000000000000..2d9dbc30e750 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/Rakefile @@ -0,0 +1,26 @@ +require "rspec/core/rake_task" + +desc "Run specs" +task :spec => ['spec:app', 'spec:lib'] + +namespace :spec do + desc "Run only specs tagged 'solo'" + RSpec::Core::RakeTask.new(:solo) do |t| + t.verbose = false + t.rspec_opts = %w(--color --tag solo) + end + + desc "Run only specs tagged NOT tagged 'libraries' (for applications)" + RSpec::Core::RakeTask.new(:app) do |t| + t.verbose = false + ENV["MONKEYPATCH_YAML"] = "true" + t.rspec_opts = %w(--color --tag ~libraries) + end + + desc "Run only specs tagged 'libraries'" + RSpec::Core::RakeTask.new(:lib) do |t| + t.verbose = false + ENV["MONKEYPATCH_YAML"] = "false" + t.rspec_opts = %w(--color --tag libraries) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/bin/safe_yaml b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/bin/safe_yaml new file mode 100644 index 000000000000..1751a72c8094 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/bin/safe_yaml @@ -0,0 +1,75 @@ +#!/usr/bin/env ruby + +$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') + +require 'optparse' +require 'safe_yaml/load' + +options = {} +option_parser = OptionParser.new do |opts| + opts.banner = "Usage: safe_yaml [options]" + + opts.on("-f", "--file=<path>", "Parse the given YAML file, dump the result to STDOUT") do |file| + options[:file] = file + end + + opts.on("--libyaml-check", "Check for libyaml vulnerability CVE-2014-2525 on your system") do + options[:libyaml_check] = true + end +end + +option_parser.parse! + +def report_libyaml_ok + puts "\e[32mGood news! You definitely have either a patched or up-to-date libyaml version :)\e[39m" +end + +def check_for_overflow_bug + YAML.load("--- !#{'%20' * 100}") + report_libyaml_ok +end + +def perform_libyaml_check(force=false) + unless SafeYAML::LibyamlChecker.libyaml_version_ok? + warn <<-EOM.gsub(/^ +/, ' ') + + \e[33mSafeYAML Warning\e[39m + \e[33m----------------\e[39m + + \e[31mYou may have an outdated version of libyaml (#{SafeYAML::LibyamlChecker::LIBYAML_VERSION}) installed on your system.\e[39m + + Prior to 0.1.6, libyaml is vulnerable to a heap overflow exploit from malicious YAML payloads. + + For more info, see: + https://www.ruby-lang.org/en/news/2014/03/29/heap-overflow-in-yaml-uri-escape-parsing-cve-2014-2525/ + EOM + end + + puts <<-EOM.gsub(/^ +/, ' ') + + Hit Enter to check if your version of libyaml is vulnerable. This will run a test \e[31mwhich may crash\e[39m + \e[31mthe current process\e[39m. If it does, your system is vulnerable and you should do something about it. + + Type "nm" and hit Enter if you don't want to run the check. + + See the project wiki for more info: + + https://github.com/dtao/safe_yaml/wiki/The-libyaml-vulnerability + EOM + + if STDIN.readline.chomp("\n") != 'nm' + check_for_overflow_bug + end +end + +if options[:libyaml_check] + perform_libyaml_check(options[:force_libyaml_check]) + +elsif options[:file] + yaml = File.read(options[:file]) + result = SafeYAML.load(yaml) + puts result.inspect + +else + puts option_parser.help +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/bundle_install_all_ruby_versions.sh b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/bundle_install_all_ruby_versions.sh new file mode 100644 index 000000000000..902d127c56e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/bundle_install_all_ruby_versions.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" + +declare -a versions=("1.8.7" "1.9.2" "1.9.3" "2.0.0" "2.1.0" "2.1.1" "2.1.2" "ruby-head" "jruby") + +for i in "${versions[@]}" +do + rvm use $i + bundle install +done diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml.rb new file mode 100644 index 000000000000..db1957d33627 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml.rb @@ -0,0 +1,94 @@ +require "safe_yaml/load" + +module YAML + def self.load_with_options(yaml, *original_arguments) + filename, options = filename_and_options_from_arguments(original_arguments) + safe_mode = safe_mode_from_options("load", options) + arguments = [yaml] + + if safe_mode == :safe + arguments << filename if SafeYAML::YAML_ENGINE == "psych" + arguments << options_for_safe_load(options) + safe_load(*arguments) + else + arguments << filename if SafeYAML::MULTI_ARGUMENT_YAML_LOAD + unsafe_load(*arguments) + end + end + + def self.load_file_with_options(file, options={}) + safe_mode = safe_mode_from_options("load_file", options) + if safe_mode == :safe + safe_load_file(file, options_for_safe_load(options)) + else + unsafe_load_file(file) + end + end + + def self.safe_load(*args) + SafeYAML.load(*args) + end + + def self.safe_load_file(*args) + SafeYAML.load_file(*args) + end + + if SafeYAML::MULTI_ARGUMENT_YAML_LOAD + def self.unsafe_load_file(filename) + # https://github.com/tenderlove/psych/blob/v1.3.2/lib/psych.rb#L296-298 + File.open(filename, 'r:bom|utf-8') { |f| self.unsafe_load(f, filename) } + end + + else + def self.unsafe_load_file(filename) + # https://github.com/tenderlove/psych/blob/v1.2.2/lib/psych.rb#L231-233 + self.unsafe_load File.open(filename) + end + end + + class << self + alias_method :unsafe_load, :load + alias_method :load, :load_with_options + alias_method :load_file, :load_file_with_options + + private + def filename_and_options_from_arguments(arguments) + if arguments.count == 1 + if arguments.first.is_a?(String) + return arguments.first, {} + else + return nil, arguments.first || {} + end + + else + return arguments.first, arguments.last || {} + end + end + + def safe_mode_from_options(method, options={}) + if options[:safe].nil? + safe_mode = SafeYAML::OPTIONS[:default_mode] || :safe + + if SafeYAML::OPTIONS[:default_mode].nil? && !SafeYAML::OPTIONS[:suppress_warnings] + + Kernel.warn <<-EOWARNING.gsub(/^\s+/, '') + Called '#{method}' without the :safe option -- defaulting to #{safe_mode} mode. + You can avoid this warning in the future by setting the SafeYAML::OPTIONS[:default_mode] option (to :safe or :unsafe). + EOWARNING + + SafeYAML::OPTIONS[:suppress_warnings] = true + end + + return safe_mode + end + + options[:safe] ? :safe : :unsafe + end + + def options_for_safe_load(base_options) + options = base_options.dup + options.delete(:safe) + options + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/deep.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/deep.rb new file mode 100644 index 000000000000..6a5e037fbb55 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/deep.rb @@ -0,0 +1,34 @@ +module SafeYAML + class Deep + def self.freeze(object) + object.each do |*entry| + value = entry.last + case value + when String, Regexp + value.freeze + when Enumerable + Deep.freeze(value) + end + end + + return object.freeze + end + + def self.copy(object) + duplicate = object.dup rescue object + + case object + when Array + (0...duplicate.count).each do |i| + duplicate[i] = Deep.copy(duplicate[i]) + end + when Hash + duplicate.keys.each do |key| + duplicate[key] = Deep.copy(duplicate[key]) + end + end + + duplicate + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/libyaml_checker.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/libyaml_checker.rb new file mode 100644 index 000000000000..1ae242363cab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/libyaml_checker.rb @@ -0,0 +1,36 @@ +require "set" + +module SafeYAML + class LibyamlChecker + LIBYAML_VERSION = Psych::LIBYAML_VERSION rescue nil + + # Do proper version comparison (e.g. so 0.1.10 is >= 0.1.6) + SAFE_LIBYAML_VERSION = Gem::Version.new("0.1.6") + + KNOWN_PATCHED_LIBYAML_VERSIONS = Set.new([ + # http://people.canonical.com/~ubuntu-security/cve/2014/CVE-2014-2525.html + "0.1.4-2ubuntu0.12.04.3", + "0.1.4-2ubuntu0.12.10.3", + "0.1.4-2ubuntu0.13.10.3", + "0.1.4-3ubuntu3", + + # https://security-tracker.debian.org/tracker/CVE-2014-2525 + "0.1.3-1+deb6u4", + "0.1.4-2+deb7u4", + "0.1.4-3.2" + ]).freeze + + def self.libyaml_version_ok? + return true if YAML_ENGINE != "psych" || defined?(JRUBY_VERSION) + return true if Gem::Version.new(LIBYAML_VERSION || "0") >= SAFE_LIBYAML_VERSION + return libyaml_patched? + end + + def self.libyaml_patched? + return false if (`which dpkg` rescue '').empty? + libyaml_version = `dpkg -s libyaml-0-2`.match(/^Version: (.*)$/) + return false if libyaml_version.nil? + KNOWN_PATCHED_LIBYAML_VERSIONS.include?(libyaml_version[1]) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/load.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/load.rb new file mode 100644 index 000000000000..5ea0f60a8c87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/load.rb @@ -0,0 +1,181 @@ +require "set" +require "yaml" + +# This needs to be defined up front in case any internal classes need to base +# their behavior off of this. +module SafeYAML + YAML_ENGINE = defined?(YAML::ENGINE) ? YAML::ENGINE.yamler : (defined?(Psych) && YAML == Psych ? "psych" : "syck") +end + +require "safe_yaml/libyaml_checker" +require "safe_yaml/deep" +require "safe_yaml/parse/hexadecimal" +require "safe_yaml/parse/sexagesimal" +require "safe_yaml/parse/date" +require "safe_yaml/transform/transformation_map" +require "safe_yaml/transform/to_boolean" +require "safe_yaml/transform/to_date" +require "safe_yaml/transform/to_float" +require "safe_yaml/transform/to_integer" +require "safe_yaml/transform/to_nil" +require "safe_yaml/transform/to_symbol" +require "safe_yaml/transform" +require "safe_yaml/resolver" +require "safe_yaml/syck_hack" if SafeYAML::YAML_ENGINE == "syck" && defined?(JRUBY_VERSION) + +module SafeYAML + MULTI_ARGUMENT_YAML_LOAD = YAML.method(:load).arity != 1 + + DEFAULT_OPTIONS = Deep.freeze({ + :default_mode => nil, + :suppress_warnings => false, + :deserialize_symbols => false, + :whitelisted_tags => [], + :custom_initializers => {}, + :raise_on_unknown_tag => false + }) + + OPTIONS = Deep.copy(DEFAULT_OPTIONS) + + PREDEFINED_TAGS = {} + + if YAML_ENGINE == "syck" + YAML.tagged_classes.each do |tag, klass| + PREDEFINED_TAGS[klass] = tag + end + + else + # Special tags appear to be hard-coded in Psych: + # https://github.com/tenderlove/psych/blob/v1.3.4/lib/psych/visitors/to_ruby.rb + # Fortunately, there aren't many that SafeYAML doesn't already support. + PREDEFINED_TAGS.merge!({ + Exception => "!ruby/exception", + Range => "!ruby/range", + Regexp => "!ruby/regexp", + }) + end + + Deep.freeze(PREDEFINED_TAGS) + + module_function + + def restore_defaults! + OPTIONS.clear.merge!(Deep.copy(DEFAULT_OPTIONS)) + end + + def tag_safety_check!(tag, options) + return if tag.nil? || tag == "!" + if options[:raise_on_unknown_tag] && !options[:whitelisted_tags].include?(tag) && !tag_is_explicitly_trusted?(tag) + raise "Unknown YAML tag '#{tag}'" + end + end + + def whitelist!(*classes) + classes.each do |klass| + whitelist_class!(klass) + end + end + + def whitelist_class!(klass) + raise "#{klass} not a Class" unless klass.is_a?(::Class) + + klass_name = klass.name + raise "#{klass} cannot be anonymous" if klass_name.nil? || klass_name.empty? + + # Whitelist any built-in YAML tags supplied by Syck or Psych. + predefined_tag = PREDEFINED_TAGS[klass] + if predefined_tag + OPTIONS[:whitelisted_tags] << predefined_tag + return + end + + # Exception is exceptional (har har). + tag_class = klass < Exception ? "exception" : "object" + + tag_prefix = case YAML_ENGINE + when "psych" then "!ruby/#{tag_class}" + when "syck" then "tag:ruby.yaml.org,2002:#{tag_class}" + else raise "unknown YAML_ENGINE #{YAML_ENGINE}" + end + OPTIONS[:whitelisted_tags] << "#{tag_prefix}:#{klass_name}" + end + + if YAML_ENGINE == "psych" + def tag_is_explicitly_trusted?(tag) + false + end + + else + TRUSTED_TAGS = Set.new([ + "tag:yaml.org,2002:binary", + "tag:yaml.org,2002:bool#no", + "tag:yaml.org,2002:bool#yes", + "tag:yaml.org,2002:float", + "tag:yaml.org,2002:float#fix", + "tag:yaml.org,2002:int", + "tag:yaml.org,2002:map", + "tag:yaml.org,2002:null", + "tag:yaml.org,2002:seq", + "tag:yaml.org,2002:str", + "tag:yaml.org,2002:timestamp", + "tag:yaml.org,2002:timestamp#ymd" + ]).freeze + + def tag_is_explicitly_trusted?(tag) + TRUSTED_TAGS.include?(tag) + end + end + + if SafeYAML::YAML_ENGINE == "psych" + require "safe_yaml/psych_handler" + require "safe_yaml/psych_resolver" + require "safe_yaml/safe_to_ruby_visitor" + + def self.load(yaml, filename=nil, options={}) + # If the user hasn't whitelisted any tags, we can go with this implementation which is + # significantly faster. + if (options && options[:whitelisted_tags] || SafeYAML::OPTIONS[:whitelisted_tags]).empty? + safe_handler = SafeYAML::PsychHandler.new(options) do |result| + return result + end + arguments_for_parse = [yaml] + arguments_for_parse << filename if SafeYAML::MULTI_ARGUMENT_YAML_LOAD + Psych::Parser.new(safe_handler).parse(*arguments_for_parse) + return safe_handler.result + + else + safe_resolver = SafeYAML::PsychResolver.new(options) + tree = SafeYAML::MULTI_ARGUMENT_YAML_LOAD ? + Psych.parse(yaml, filename) : + Psych.parse(yaml) + return safe_resolver.resolve_node(tree) + end + end + + def self.load_file(filename, options={}) + if SafeYAML::MULTI_ARGUMENT_YAML_LOAD + File.open(filename, 'r:bom|utf-8') { |f| self.load(f, filename, options) } + + else + # Ruby pukes on 1.9.2 if we try to open an empty file w/ 'r:bom|utf-8'; + # so we'll not specify those flags here. This mirrors the behavior for + # unsafe_load_file so it's probably preferable anyway. + self.load File.open(filename), nil, options + end + end + + else + require "safe_yaml/syck_resolver" + require "safe_yaml/syck_node_monkeypatch" + + def self.load(yaml, options={}) + resolver = SafeYAML::SyckResolver.new(SafeYAML::OPTIONS.merge(options || {})) + tree = YAML.parse(yaml) + return resolver.resolve_node(tree) + end + + def self.load_file(filename, options={}) + File.open(filename) { |f| self.load(f, options) } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/parse/date.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/parse/date.rb new file mode 100644 index 000000000000..3a30a8b03196 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/parse/date.rb @@ -0,0 +1,37 @@ +require 'time' + +module SafeYAML + class Parse + class Date + # This one's easy enough :) + DATE_MATCHER = /\A(\d{4})-(\d{2})-(\d{2})\Z/.freeze + + # This unbelievable little gem is taken basically straight from the YAML spec, but made + # slightly more readable (to my poor eyes at least) to me: + # http://yaml.org/type/timestamp.html + TIME_MATCHER = /\A\d{4}-\d{1,2}-\d{1,2}(?:[Tt]|\s+)\d{1,2}:\d{2}:\d{2}(?:\.\d*)?\s*(?:Z|[-+]\d{1,2}(?::?\d{2})?)?\Z/.freeze + + SECONDS_PER_DAY = 60 * 60 * 24 + MICROSECONDS_PER_SECOND = 1000000 + + # So this is weird. In Ruby 1.8.7, the DateTime#sec_fraction method returned fractional + # seconds in units of DAYS for some reason. In 1.9.2, they changed the units -- much more + # reasonably -- to seconds. + SEC_FRACTION_MULTIPLIER = RUBY_VERSION == "1.8.7" ? (SECONDS_PER_DAY * MICROSECONDS_PER_SECOND) : MICROSECONDS_PER_SECOND + + # The DateTime class has a #to_time method in Ruby 1.9+; + # Before that we'll just need to convert DateTime to Time ourselves. + TO_TIME_AVAILABLE = DateTime.instance_methods.include?(:to_time) + + def self.value(value) + d = DateTime.parse(value) + + return d.to_time if TO_TIME_AVAILABLE + + usec = d.sec_fraction * SEC_FRACTION_MULTIPLIER + time = Time.utc(d.year, d.month, d.day, d.hour, d.min, d.sec, usec) - (d.offset * SECONDS_PER_DAY) + time.getlocal + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/parse/hexadecimal.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/parse/hexadecimal.rb new file mode 100644 index 000000000000..8da3624952d2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/parse/hexadecimal.rb @@ -0,0 +1,12 @@ +module SafeYAML + class Parse + class Hexadecimal + MATCHER = /\A[-+]?0x[0-9a-fA-F_]+\Z/.freeze + + def self.value(value) + # This is safe to do since we already validated the value. + return Integer(value.gsub(/_/, "")) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/parse/sexagesimal.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/parse/sexagesimal.rb new file mode 100644 index 000000000000..3fff5bb16fa7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/parse/sexagesimal.rb @@ -0,0 +1,26 @@ +module SafeYAML + class Parse + class Sexagesimal + INTEGER_MATCHER = /\A[-+]?[0-9][0-9_]*(:[0-5]?[0-9])+\Z/.freeze + FLOAT_MATCHER = /\A[-+]?[0-9][0-9_]*(:[0-5]?[0-9])+\.[0-9_]*\Z/.freeze + + def self.value(value) + before_decimal, after_decimal = value.split(".") + + whole_part = 0 + multiplier = 1 + + before_decimal = before_decimal.split(":") + until before_decimal.empty? + whole_part += (Float(before_decimal.pop) * multiplier) + multiplier *= 60 + end + + result = whole_part + result += Float("." + after_decimal) unless after_decimal.nil? + result *= -1 if value[0] == "-" + result + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/psych_handler.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/psych_handler.rb new file mode 100644 index 000000000000..cf016a32375a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/psych_handler.rb @@ -0,0 +1,99 @@ +require "psych" +require "base64" + +module SafeYAML + class PsychHandler < Psych::Handler + def initialize(options, &block) + @options = SafeYAML::OPTIONS.merge(options || {}) + @block = block + @initializers = @options[:custom_initializers] || {} + @anchors = {} + @stack = [] + @current_key = nil + @result = nil + @begun = false + end + + def result + @begun ? @result : false + end + + def add_to_current_structure(value, anchor=nil, quoted=nil, tag=nil) + value = Transform.to_proper_type(value, quoted, tag, @options) + + @anchors[anchor] = value if anchor + + if !@begun + @begun = true + @result = value + @current_structure = @result + return + end + + if @current_structure.respond_to?(:<<) + @current_structure << value + + elsif @current_structure.respond_to?(:[]=) + if @current_key.nil? + @current_key = value + + else + if @current_key == "<<" + @current_structure.merge!(value) + else + @current_structure[@current_key] = value + end + + @current_key = nil + end + + else + raise "Don't know how to add to a #{@current_structure.class}!" + end + end + + def end_current_structure + @stack.pop + @current_structure = @stack.last + end + + def streaming? + true + end + + # event handlers + def alias(anchor) + add_to_current_structure(@anchors[anchor]) + end + + def scalar(value, anchor, tag, plain, quoted, style) + add_to_current_structure(value, anchor, quoted, tag) + end + + def end_document(implicit) + @block.call(@result) + end + + def start_mapping(anchor, tag, implicit, style) + map = @initializers.include?(tag) ? @initializers[tag].call : {} + self.add_to_current_structure(map, anchor) + @current_structure = map + @stack.push(map) + end + + def end_mapping + self.end_current_structure() + end + + def start_sequence(anchor, tag, implicit, style) + seq = @initializers.include?(tag) ? @initializers[tag].call : [] + self.add_to_current_structure(seq, anchor) + @current_structure = seq + @stack.push(seq) + end + + def end_sequence + self.end_current_structure() + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/psych_resolver.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/psych_resolver.rb new file mode 100644 index 000000000000..851989bef918 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/psych_resolver.rb @@ -0,0 +1,52 @@ +module SafeYAML + class PsychResolver < Resolver + NODE_TYPES = { + Psych::Nodes::Document => :root, + Psych::Nodes::Mapping => :map, + Psych::Nodes::Sequence => :seq, + Psych::Nodes::Scalar => :scalar, + Psych::Nodes::Alias => :alias + }.freeze + + def initialize(options={}) + super + @aliased_nodes = {} + end + + def resolve_root(root) + resolve_seq(root).first + end + + def resolve_alias(node) + resolve_node(@aliased_nodes[node.anchor]) + end + + def native_resolve(node) + @visitor ||= SafeYAML::SafeToRubyVisitor.new(self) + @visitor.accept(node) + end + + def get_node_type(node) + NODE_TYPES[node.class] + end + + def get_node_tag(node) + node.tag + end + + def get_node_value(node) + @aliased_nodes[node.anchor] = node if node.respond_to?(:anchor) && node.anchor + + case get_node_type(node) + when :root, :map, :seq + node.children + when :scalar + node.value + end + end + + def value_is_quoted?(node) + node.quoted + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/resolver.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/resolver.rb new file mode 100644 index 000000000000..e4de1579789a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/resolver.rb @@ -0,0 +1,94 @@ +module SafeYAML + class Resolver + def initialize(options) + @options = SafeYAML::OPTIONS.merge(options || {}) + @whitelist = @options[:whitelisted_tags] || [] + @initializers = @options[:custom_initializers] || {} + @raise_on_unknown_tag = @options[:raise_on_unknown_tag] + end + + def resolve_node(node) + return node if !node + return self.native_resolve(node) if tag_is_whitelisted?(self.get_node_tag(node)) + + case self.get_node_type(node) + when :root + resolve_root(node) + when :map + resolve_map(node) + when :seq + resolve_seq(node) + when :scalar + resolve_scalar(node) + when :alias + resolve_alias(node) + else + raise "Don't know how to resolve this node: #{node.inspect}" + end + end + + def resolve_map(node) + tag = get_and_check_node_tag(node) + hash = @initializers.include?(tag) ? @initializers[tag].call : {} + map = normalize_map(self.get_node_value(node)) + + # Take the "<<" key nodes first, as these are meant to approximate a form of inheritance. + inheritors = map.select { |key_node, value_node| resolve_node(key_node) == "<<" } + inheritors.each do |key_node, value_node| + merge_into_hash(hash, resolve_node(value_node)) + end + + # All that's left should be normal (non-"<<") nodes. + (map - inheritors).each do |key_node, value_node| + hash[resolve_node(key_node)] = resolve_node(value_node) + end + + return hash + end + + def resolve_seq(node) + seq = self.get_node_value(node) + + tag = get_and_check_node_tag(node) + arr = @initializers.include?(tag) ? @initializers[tag].call : [] + + seq.inject(arr) { |array, n| array << resolve_node(n) } + end + + def resolve_scalar(node) + Transform.to_proper_type(self.get_node_value(node), self.value_is_quoted?(node), get_and_check_node_tag(node), @options) + end + + def get_and_check_node_tag(node) + tag = self.get_node_tag(node) + SafeYAML.tag_safety_check!(tag, @options) + tag + end + + def tag_is_whitelisted?(tag) + @whitelist.include?(tag) + end + + def options + @options + end + + private + def normalize_map(map) + # Syck creates Hashes from maps. + if map.is_a?(Hash) + map.inject([]) { |arr, key_and_value| arr << key_and_value } + + # Psych is really weird; it flattens out a Hash completely into: [key, value, key, value, ...] + else + map.each_slice(2).to_a + end + end + + def merge_into_hash(hash, array) + array.each do |key, value| + hash[key] = value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/safe_to_ruby_visitor.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/safe_to_ruby_visitor.rb new file mode 100644 index 000000000000..b980445a9ca0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/safe_to_ruby_visitor.rb @@ -0,0 +1,29 @@ +module SafeYAML + class SafeToRubyVisitor < Psych::Visitors::ToRuby + INITIALIZE_ARITY = superclass.instance_method(:initialize).arity + + def initialize(resolver) + case INITIALIZE_ARITY + when 2 + # https://github.com/tenderlove/psych/blob/v2.0.0/lib/psych/visitors/to_ruby.rb#L14-L28 + loader = Psych::ClassLoader.new + scanner = Psych::ScalarScanner.new(loader) + super(scanner, loader) + + else + super() + end + + @resolver = resolver + end + + def accept(node) + if node.tag + SafeYAML.tag_safety_check!(node.tag, @resolver.options) + return super + end + + @resolver.resolve_node(node) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/store.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/store.rb new file mode 100644 index 000000000000..e02a0fc2624d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/store.rb @@ -0,0 +1,39 @@ +require 'safe_yaml/load' +require 'yaml/store' + +module SafeYAML + + class Store < YAML::Store + + # Override YAML::Store#initialize to accept additional option + # +safe_yaml_opts+. + def initialize(file_name, yaml_opts = {}, safe_yaml_opts = {}) + @safe_yaml_opts = safe_yaml_opts + super(file_name, yaml_opts) + end + + # Override YAML::Store#load to use SafeYAML.load instead of + # YAML.load (via #safe_yaml_load). + #-- + # PStore#load is private, while YAML::Store#load is public. + #++ + def load(content) + table = safe_yaml_load(content) + table == false ? {} : table + end + + private + + if SafeYAML::YAML_ENGINE == 'psych' + def safe_yaml_load(content) + SafeYAML.load(content, nil, @safe_yaml_opts) + end + else + def safe_yaml_load(content) + SafeYAML.load(content, @safe_yaml_opts) + end + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/syck_hack.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/syck_hack.rb new file mode 100644 index 000000000000..08a5e478ea52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/syck_hack.rb @@ -0,0 +1,36 @@ +# Hack to JRuby 1.8's YAML Parser Yecht +# +# This file is always loaded AFTER either syck or psych are already +# loaded. It then looks at what constants are available and creates +# a consistent view on all rubys. +# +# Taken from rubygems and modified. +# See https://github.com/rubygems/rubygems/blob/master/lib/rubygems/syck_hack.rb + +module YAML + # In newer 1.9.2, there is a Syck toplevel constant instead of it + # being underneith YAML. If so, reference it back under YAML as + # well. + if defined? ::Syck + # for tests that change YAML::ENGINE + # 1.8 does not support the second argument to const_defined? + remove_const :Syck rescue nil + + Syck = ::Syck + + # JRuby's "Syck" is called "Yecht" + elsif defined? YAML::Yecht + Syck = YAML::Yecht + end +end + +# Sometime in the 1.9 dev cycle, the Syck constant was moved from under YAML +# to be a toplevel constant. So gemspecs created under these versions of Syck +# will have references to Syck::DefaultKey. +# +# So we need to be sure that we reference Syck at the toplevel too so that +# we can always load these kind of gemspecs. +# +if !defined?(Syck) + Syck = YAML::Syck +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/syck_node_monkeypatch.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/syck_node_monkeypatch.rb new file mode 100644 index 000000000000..c026376cd530 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/syck_node_monkeypatch.rb @@ -0,0 +1,43 @@ +# This is, admittedly, pretty insane. Fundamentally the challenge here is this: if we want to allow +# whitelisting of tags (while still leveraging Syck's internal functionality), then we have to +# change how Syck::Node#transform works. But since we (SafeYAML) do not control instantiation of +# Syck::Node objects, we cannot, for example, subclass Syck::Node and override #tranform the "easy" +# way. So the only choice is to monkeypatch, like this. And the only way to make this work +# recursively with potentially call-specific options (that my feeble brain can think of) is to set +# pseudo-global options on the first call and unset them once the recursive stack has fully unwound. + +monkeypatch = <<-EORUBY + class Node + @@safe_transform_depth = 0 + @@safe_transform_whitelist = nil + + def safe_transform(options={}) + begin + @@safe_transform_depth += 1 + @@safe_transform_whitelist ||= options[:whitelisted_tags] + + if self.type_id + SafeYAML.tag_safety_check!(self.type_id, options) + return unsafe_transform if @@safe_transform_whitelist.include?(self.type_id) + end + + SafeYAML::SyckResolver.new.resolve_node(self) + + ensure + @@safe_transform_depth -= 1 + if @@safe_transform_depth == 0 + @@safe_transform_whitelist = nil + end + end + end + + alias_method :unsafe_transform, :transform + alias_method :transform, :safe_transform + end +EORUBY + +if defined?(YAML::Syck::Node) + YAML::Syck.module_eval monkeypatch +else + Syck.module_eval monkeypatch +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/syck_resolver.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/syck_resolver.rb new file mode 100644 index 000000000000..10d55ab37e94 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/syck_resolver.rb @@ -0,0 +1,38 @@ +module SafeYAML + class SyckResolver < Resolver + QUOTE_STYLES = [ + :quote1, + :quote2 + ].freeze + + NODE_TYPES = { + Hash => :map, + Array => :seq, + String => :scalar + }.freeze + + def initialize(options={}) + super + end + + def native_resolve(node) + node.transform(self.options) + end + + def get_node_type(node) + NODE_TYPES[node.value.class] + end + + def get_node_tag(node) + node.type_id + end + + def get_node_value(node) + node.value + end + + def value_is_quoted?(node) + QUOTE_STYLES.include?(node.instance_variable_get(:@style)) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform.rb new file mode 100644 index 000000000000..d61d1a995249 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform.rb @@ -0,0 +1,41 @@ +require 'base64' + +module SafeYAML + class Transform + TRANSFORMERS = [ + Transform::ToSymbol.new, + Transform::ToInteger.new, + Transform::ToFloat.new, + Transform::ToNil.new, + Transform::ToBoolean.new, + Transform::ToDate.new + ] + + def self.to_guessed_type(value, quoted=false, options=nil) + return value if quoted + + if value.is_a?(String) + TRANSFORMERS.each do |transformer| + success, transformed_value = transformer.method(:transform?).arity == 1 ? + transformer.transform?(value) : + transformer.transform?(value, options) + + return transformed_value if success + end + end + + value + end + + def self.to_proper_type(value, quoted=false, tag=nil, options=nil) + case tag + when "tag:yaml.org,2002:binary", "x-private:binary", "!binary" + decoded = Base64.decode64(value) + decoded = decoded.force_encoding(value.encoding) if decoded.respond_to?(:force_encoding) + decoded + else + self.to_guessed_type(value, quoted, options) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_boolean.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_boolean.rb new file mode 100644 index 000000000000..99dc85efe554 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_boolean.rb @@ -0,0 +1,21 @@ +module SafeYAML + class Transform + class ToBoolean + include TransformationMap + + set_predefined_values({ + "yes" => true, + "on" => true, + "true" => true, + "no" => false, + "off" => false, + "false" => false + }) + + def transform?(value) + return false if value.length > 5 + return PREDEFINED_VALUES.include?(value), PREDEFINED_VALUES[value] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_date.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_date.rb new file mode 100644 index 000000000000..4bfe5520b9ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_date.rb @@ -0,0 +1,13 @@ +module SafeYAML + class Transform + class ToDate + def transform?(value) + return true, Date.parse(value) if Parse::Date::DATE_MATCHER.match(value) + return true, Parse::Date.value(value) if Parse::Date::TIME_MATCHER.match(value) + false + rescue ArgumentError + return true, value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_float.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_float.rb new file mode 100644 index 000000000000..4ee3f5fbf71d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_float.rb @@ -0,0 +1,33 @@ +module SafeYAML + class Transform + class ToFloat + Infinity = 1.0 / 0.0 + NaN = 0.0 / 0.0 + + PREDEFINED_VALUES = { + ".inf" => Infinity, + ".Inf" => Infinity, + ".INF" => Infinity, + "-.inf" => -Infinity, + "-.Inf" => -Infinity, + "-.INF" => -Infinity, + ".nan" => NaN, + ".NaN" => NaN, + ".NAN" => NaN, + }.freeze + + MATCHER = /\A[-+]?(?:\d[\d_]*)?\.[\d_]+(?:[eE][-+][\d]+)?\Z/.freeze + + def transform?(value) + return true, Float(value) if MATCHER.match(value) + try_edge_cases?(value) + end + + def try_edge_cases?(value) + return true, PREDEFINED_VALUES[value] if PREDEFINED_VALUES.include?(value) + return true, Parse::Sexagesimal.value(value) if Parse::Sexagesimal::FLOAT_MATCHER.match(value) + return false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_integer.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_integer.rb new file mode 100644 index 000000000000..9a5f5634d2a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_integer.rb @@ -0,0 +1,26 @@ +module SafeYAML + class Transform + class ToInteger + MATCHERS = Deep.freeze([ + /\A[-+]?(0|([1-9][0-9_,]*))\Z/, # decimal + /\A0[0-7]+\Z/, # octal + /\A0x[0-9a-f]+\Z/i, # hexadecimal + /\A0b[01_]+\Z/ # binary + ]) + + def transform?(value) + MATCHERS.each_with_index do |matcher, idx| + value = value.gsub(/[_,]/, "") if idx == 0 + return true, Integer(value) if matcher.match(value) + end + try_edge_cases?(value) + end + + def try_edge_cases?(value) + return true, Parse::Hexadecimal.value(value) if Parse::Hexadecimal::MATCHER.match(value) + return true, Parse::Sexagesimal.value(value) if Parse::Sexagesimal::INTEGER_MATCHER.match(value) + return false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_nil.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_nil.rb new file mode 100644 index 000000000000..1f617562b071 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_nil.rb @@ -0,0 +1,18 @@ +module SafeYAML + class Transform + class ToNil + include TransformationMap + + set_predefined_values({ + "" => nil, + "~" => nil, + "null" => nil + }) + + def transform?(value) + return false if value.length > 4 + return PREDEFINED_VALUES.include?(value), PREDEFINED_VALUES[value] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_symbol.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_symbol.rb new file mode 100644 index 000000000000..36a72bbe4854 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/to_symbol.rb @@ -0,0 +1,17 @@ +module SafeYAML + class Transform + class ToSymbol + def transform?(value, options=SafeYAML::OPTIONS) + if options[:deserialize_symbols] && value =~ /\A:./ + if value =~ /\A:(["'])(.*)\1\Z/ + return true, $2.sub(/^:/, "").to_sym + else + return true, value.sub(/^:/, "").to_sym + end + end + + return false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/transformation_map.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/transformation_map.rb new file mode 100644 index 000000000000..d4e45ec52c18 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/transform/transformation_map.rb @@ -0,0 +1,47 @@ +module SafeYAML + class Transform + module TransformationMap + def self.included(base) + base.extend(ClassMethods) + end + + class CaseAgnosticMap < Hash + def initialize(*args) + super + end + + def include?(key) + super(key.downcase) + end + + def [](key) + super(key.downcase) + end + + # OK, I actually don't think it's all that important that this map be + # frozen. + def freeze + self + end + end + + module ClassMethods + def set_predefined_values(predefined_values) + if SafeYAML::YAML_ENGINE == "syck" + expanded_map = predefined_values.inject({}) do |hash, (key, value)| + hash[key] = value + hash[key.capitalize] = value + hash[key.upcase] = value + hash + end + else + expanded_map = CaseAgnosticMap.new + expanded_map.merge!(predefined_values) + end + + self.const_set(:PREDEFINED_VALUES, expanded_map.freeze) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/version.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/version.rb new file mode 100644 index 000000000000..89ff3b09eda9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/lib/safe_yaml/version.rb @@ -0,0 +1,3 @@ +module SafeYAML + VERSION = "1.0.5" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/run_specs_all_ruby_versions.sh b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/run_specs_all_ruby_versions.sh new file mode 100644 index 000000000000..54a1f4b4442a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/run_specs_all_ruby_versions.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" + +rvm use 1.8.7 +bundle exec rake spec + +rvm use 1.9.2 +YAMLER=syck bundle exec rake spec + +YAMLER=psych bundle exec rake spec + +rvm use 1.9.3 +YAMLER=syck bundle exec rake spec + +YAMLER=psych bundle exec rake spec + +rvm use 2.0.0 +bundle exec rake spec + +rvm use 2.1.0 +bundle exec rake spec + +rvm use 2.1.1 +bundle exec rake spec + +rvm use 2.1.2 +bundle exec rake spec + +rvm use ruby-head +bundle exec rake spec + +rvm use jruby +JRUBY_OPTS=--1.8 bundle exec rake spec + +JRUBY_OPTS=--1.9 bundle exec rake spec + +JRUBY_OPTS=--2.0 bundle exec rake spec diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/safe_yaml.gemspec b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/safe_yaml.gemspec new file mode 100644 index 000000000000..4f4432a82916 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/safe_yaml.gemspec @@ -0,0 +1,19 @@ +# -*- encoding: utf-8 -*- +require File.join(File.dirname(__FILE__), "lib", "safe_yaml", "version") + +Gem::Specification.new do |gem| + gem.name = "safe_yaml" + gem.version = SafeYAML::VERSION + gem.authors = "Dan Tao" + gem.email = "daniel.tao@gmail.com" + gem.description = %q{Parse YAML safely} + gem.summary = %q{SameYAML provides an alternative implementation of YAML.load suitable for accepting user input in Ruby applications.} + gem.homepage = "https://github.com/dtao/safe_yaml" + gem.license = "MIT" + gem.files = `git ls-files`.split($\) + gem.test_files = gem.files.grep(%r{^spec/}) + gem.require_paths = ["lib"] + gem.executables = ["safe_yaml"] + + gem.required_ruby_version = ">= 1.8.7" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/exploit.1.9.2.yaml b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/exploit.1.9.2.yaml new file mode 100644 index 000000000000..bdd70cc679ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/exploit.1.9.2.yaml @@ -0,0 +1,2 @@ +--- !ruby/object:ExploitableBackDoor +foo: bar diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/exploit.1.9.3.yaml b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/exploit.1.9.3.yaml new file mode 100644 index 000000000000..c24e04b8dd52 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/exploit.1.9.3.yaml @@ -0,0 +1,2 @@ +--- !ruby/hash:ExploitableBackDoor +foo: bar diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/issue48.txt b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/issue48.txt new file mode 100644 index 000000000000..97d1f6841453 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/issue48.txt @@ -0,0 +1,20 @@ +--- +title: Blah +key: value +--- + +I'm going to inject a bunch of YAML-looking stuff below and it should all just get ignored. + +foo: bar + +- foo +- bar + +:foo +42 +~ + +--- +text: | + Look, I'm another YAML document! +--- diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/issue49.yml b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/issue49.yml new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/libyaml_checker_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/libyaml_checker_spec.rb new file mode 100644 index 000000000000..b5b290b26746 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/libyaml_checker_spec.rb @@ -0,0 +1,69 @@ +require "spec_helper" + +describe SafeYAML::LibyamlChecker do + describe "check_libyaml_version" do + REAL_YAML_ENGINE = SafeYAML::YAML_ENGINE + REAL_LIBYAML_VERSION = SafeYAML::LibyamlChecker::LIBYAML_VERSION + + let(:libyaml_patched) { false } + + before :each do + allow(SafeYAML::LibyamlChecker).to receive(:libyaml_patched?).and_return(libyaml_patched) + end + + after :each do + silence_warnings do + SafeYAML::YAML_ENGINE = REAL_YAML_ENGINE + SafeYAML::LibyamlChecker::LIBYAML_VERSION = REAL_LIBYAML_VERSION + end + end + + def test_libyaml_version_ok(expected_result, yaml_engine, libyaml_version=nil) + silence_warnings do + SafeYAML.const_set("YAML_ENGINE", yaml_engine) + SafeYAML::LibyamlChecker.const_set("LIBYAML_VERSION", libyaml_version) + expect(SafeYAML::LibyamlChecker.libyaml_version_ok?).to eq(expected_result) + end + end + + unless defined?(JRUBY_VERSION) + it "issues no warnings when 'Syck' is the YAML engine" do + test_libyaml_version_ok(true, "syck") + end + + it "issues a warning if Psych::LIBYAML_VERSION is not defined" do + test_libyaml_version_ok(false, "psych") + end + + it "issues a warning if Psych::LIBYAML_VERSION is < 0.1.6" do + test_libyaml_version_ok(false, "psych", "0.1.5") + end + + it "issues no warning if Psych::LIBYAML_VERSION is == 0.1.6" do + test_libyaml_version_ok(true, "psych", "0.1.6") + end + + it "issues no warning if Psych::LIBYAML_VERSION is > 0.1.6" do + test_libyaml_version_ok(true, "psych", "1.0.0") + end + + it "does a proper version comparison (not just a string comparison)" do + test_libyaml_version_ok(true, "psych", "0.1.10") + end + + context "when the system has a known patched libyaml version" do + let(:libyaml_patched) { true } + + it "issues no warning, even when Psych::LIBYAML_VERSION < 0.1.6" do + test_libyaml_version_ok(true, "psych", "0.1.4") + end + end + end + + if defined?(JRUBY_VERSION) + it "issues no warning, as JRuby doesn't use libyaml" do + test_libyaml_version_ok(true, "psych", "0.1.4") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/psych_resolver_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/psych_resolver_spec.rb new file mode 100644 index 000000000000..a9e76b5c0348 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/psych_resolver_spec.rb @@ -0,0 +1,10 @@ +require "spec_helper" + +if SafeYAML::YAML_ENGINE == "psych" + require "safe_yaml/psych_resolver" + + describe SafeYAML::PsychResolver do + include ResolverSpecs + let(:resolver) { SafeYAML::PsychResolver.new } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/resolver_specs.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/resolver_specs.rb new file mode 100644 index 000000000000..1b981e54c816 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/resolver_specs.rb @@ -0,0 +1,278 @@ +module ResolverSpecs + def self.included(base) + base.module_eval do + let(:resolver) { nil } + let(:result) { @result } + + before :each do + # See the comment in the first before :each block in safe_yaml_spec.rb. + require "safe_yaml" + end + + def parse(yaml) + tree = YAML.parse(yaml.unindent) + @result = resolver.resolve_node(tree) + end + + # Isn't this how I should've been doing it all along? + def parse_and_test(yaml) + safe_result = parse(yaml) + + exception_thrown = nil + + unsafe_result = begin + YAML.unsafe_load(yaml) + rescue Exception => e + exception_thrown = e + end + + if exception_thrown + # If the underlying YAML parser (e.g. Psych) threw an exception, I'm + # honestly not sure what the right thing to do is. For now I'll just + # print a warning. Should SafeYAML fail when Psych fails? + Kernel.warn "\n" + Kernel.warn "Discrepancy between SafeYAML and #{SafeYAML::YAML_ENGINE} on input:\n" + Kernel.warn "#{yaml.unindent}\n" + Kernel.warn "SafeYAML result:" + Kernel.warn "#{safe_result.inspect}\n" + Kernel.warn "#{SafeYAML::YAML_ENGINE} result:" + Kernel.warn "#{exception_thrown.inspect}\n" + + else + expect(safe_result).to eq(unsafe_result) + end + end + + context "by default" do + it "translates maps to hashes" do + parse <<-YAML + potayto: potahto + tomayto: tomahto + YAML + + expect(result).to eq({ + "potayto" => "potahto", + "tomayto" => "tomahto" + }) + end + + it "translates sequences to arrays" do + parse <<-YAML + - foo + - bar + - baz + YAML + + expect(result).to eq(["foo", "bar", "baz"]) + end + + it "translates most values to strings" do + parse "string: value" + expect(result).to eq({ "string" => "value" }) + end + + it "does not deserialize symbols" do + parse ":symbol: value" + expect(result).to eq({ ":symbol" => "value" }) + end + + it "translates valid integral numbers to integers" do + parse "integer: 1" + expect(result).to eq({ "integer" => 1 }) + end + + it "translates valid decimal numbers to floats" do + parse "float: 3.14" + expect(result).to eq({ "float" => 3.14 }) + end + + it "translates valid dates" do + parse "date: 2013-01-24" + expect(result).to eq({ "date" => Date.parse("2013-01-24") }) + end + + it "translates valid true/false values to booleans" do + parse <<-YAML + - yes + - true + - no + - false + YAML + + expect(result).to eq([true, true, false, false]) + end + + it "translates valid nulls to nil" do + parse <<-YAML + - + - ~ + - null + YAML + + expect(result).to eq([nil] * 3) + end + + it "matches the behavior of the underlying YAML engine w/ respect to capitalization of boolean values" do + parse_and_test <<-YAML + - true + - True + - TRUE + - tRue + - TRue + - False + - FALSE + - fAlse + - FALse + YAML + + # using Syck: [true, true, true, "tRue", "TRue", false, false, "fAlse", "FALse"] + # using Psych: all booleans + end + + it "matches the behavior of the underlying YAML engine w/ respect to capitalization of nil values" do + parse_and_test <<-YAML + - Null + - NULL + - nUll + - NUll + YAML + + # using Syck: [nil, nil, "nUll", "NUll"] + # using Psych: all nils + end + + it "translates quoted empty strings to strings (not nil)" do + parse "foo: ''" + expect(result).to eq({ "foo" => "" }) + end + + it "correctly reverse-translates strings encoded via #to_yaml" do + parse "5.10".to_yaml + expect(result).to eq("5.10") + end + + it "does not specially parse any double-quoted strings" do + parse <<-YAML + - "1" + - "3.14" + - "true" + - "false" + - "2013-02-03" + - "2013-02-03 16:27:00 -0600" + YAML + + expect(result).to eq(["1", "3.14", "true", "false", "2013-02-03", "2013-02-03 16:27:00 -0600"]) + end + + it "does not specially parse any single-quoted strings" do + parse <<-YAML + - '1' + - '3.14' + - 'true' + - 'false' + - '2013-02-03' + - '2013-02-03 16:27:00 -0600' + YAML + + expect(result).to eq(["1", "3.14", "true", "false", "2013-02-03", "2013-02-03 16:27:00 -0600"]) + end + + it "deals just fine with nested maps" do + parse <<-YAML + foo: + bar: + marco: polo + YAML + + expect(result).to eq({ "foo" => { "bar" => { "marco" => "polo" } } }) + end + + it "deals just fine with nested sequences" do + parse <<-YAML + - foo + - + - bar1 + - bar2 + - + - baz1 + - baz2 + YAML + + expect(result).to eq(["foo", ["bar1", "bar2", ["baz1", "baz2"]]]) + end + + it "applies the same transformations to keys as to values" do + parse <<-YAML + foo: string + :bar: symbol + 1: integer + 3.14: float + 2013-01-24: date + YAML + + expect(result).to eq({ + "foo" => "string", + ":bar" => "symbol", + 1 => "integer", + 3.14 => "float", + Date.parse("2013-01-24") => "date", + }) + end + + it "applies the same transformations to elements in sequences as to all values" do + parse <<-YAML + - foo + - :bar + - 1 + - 3.14 + - 2013-01-24 + YAML + + expect(result).to eq(["foo", ":bar", 1, 3.14, Date.parse("2013-01-24")]) + end + end + + context "for Ruby version #{RUBY_VERSION}" do + it "translates valid time values" do + parse "time: 2013-01-29 05:58:00 -0800" + expect(result).to eq({ "time" => Time.utc(2013, 1, 29, 13, 58, 0) }) + end + + it "applies the same transformation to elements in sequences" do + parse "- 2013-01-29 05:58:00 -0800" + expect(result).to eq([Time.utc(2013, 1, 29, 13, 58, 0)]) + end + + it "applies the same transformation to keys" do + parse "2013-01-29 05:58:00 -0800: time" + expect(result).to eq({ Time.utc(2013, 1, 29, 13, 58, 0) => "time" }) + end + end + + context "with symbol deserialization enabled" do + before :each do + SafeYAML::OPTIONS[:deserialize_symbols] = true + end + + after :each do + SafeYAML.restore_defaults! + end + + it "translates values starting with ':' to symbols" do + parse "symbol: :value" + expect(result).to eq({ "symbol" => :value }) + end + + it "applies the same transformation to keys" do + parse ":bar: symbol" + expect(result).to eq({ :bar => "symbol" }) + end + + it "applies the same transformation to elements in sequences" do + parse "- :bar" + expect(result).to eq([:bar]) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/safe_yaml_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/safe_yaml_spec.rb new file mode 100644 index 000000000000..aa701a4534ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/safe_yaml_spec.rb @@ -0,0 +1,731 @@ +require "spec_helper" + +describe YAML do + def safe_load_round_trip(object, options={}) + yaml = object.to_yaml + if SafeYAML::YAML_ENGINE == "psych" + YAML.safe_load(yaml, nil, options) + else + YAML.safe_load(yaml, options) + end + end + + before :each do + # Need to require this here (as opposed to somewhere up higher in the file) + # to ensure that safe_yaml isn't loaded and therefore YAML isn't monkey- + # patched, for tests that require only safe_yaml/load. + require "safe_yaml" + require "exploitable_back_door" + + SafeYAML.restore_defaults! + end + + after :each do + SafeYAML.restore_defaults! + end + + describe "unsafe_load" do + if SafeYAML::YAML_ENGINE == "psych" && RUBY_VERSION >= "1.9.3" + it "allows exploits through objects defined in YAML w/ !ruby/hash via custom :[]= methods" do + backdoor = YAML.unsafe_load("--- !ruby/hash:ExploitableBackDoor\nfoo: bar\n") + expect(backdoor).to be_exploited_through_setter + end + + it "allows exploits through objects defined in YAML w/ !ruby/object via the :init_with method" do + backdoor = YAML.unsafe_load("--- !ruby/object:ExploitableBackDoor\nfoo: bar\n") + expect(backdoor).to be_exploited_through_init_with + end + end + + it "allows exploits through objects w/ sensitive instance variables defined in YAML w/ !ruby/object" do + backdoor = YAML.unsafe_load("--- !ruby/object:ExploitableBackDoor\nfoo: bar\n") + expect(backdoor).to be_exploited_through_ivars + end + + context "with special whitelisted tags defined" do + before :each do + SafeYAML::whitelist!(OpenStruct) + end + + it "effectively ignores the whitelist (since everything is whitelisted)" do + result = YAML.unsafe_load <<-YAML.unindent + --- !ruby/object:OpenStruct + table: + :backdoor: !ruby/object:ExploitableBackDoor + foo: bar + YAML + + expect(result).to be_a(OpenStruct) + expect(result.backdoor).to be_exploited_through_ivars + end + end + end + + describe "safe_load" do + it "does NOT allow exploits through objects defined in YAML w/ !ruby/hash" do + object = YAML.safe_load("--- !ruby/hash:ExploitableBackDoor\nfoo: bar\n") + expect(object).not_to be_a(ExploitableBackDoor) + end + + it "does NOT allow exploits through objects defined in YAML w/ !ruby/object" do + object = YAML.safe_load("--- !ruby/object:ExploitableBackDoor\nfoo: bar\n") + expect(object).not_to be_a(ExploitableBackDoor) + end + + context "for YAML engine #{SafeYAML::YAML_ENGINE}" do + if SafeYAML::YAML_ENGINE == "psych" + let(:options) { nil } + let(:arguments) { ["foo: bar", nil, options] } + + context "when no tags are whitelisted" do + it "constructs a SafeYAML::PsychHandler to resolve nodes as they're parsed, for optimal performance" do + expect(Psych::Parser).to receive(:new).with an_instance_of(SafeYAML::PsychHandler) + # This won't work now; we just want to ensure Psych::Parser#parse was in fact called. + YAML.safe_load(*arguments) rescue nil + end + end + + context "when whitelisted tags are specified" do + let(:options) { + { :whitelisted_tags => ["foo"] } + } + + it "instead uses Psych to construct a full tree before examining the nodes" do + expect(Psych).to receive(:parse) + # This won't work now; we just want to ensure Psych::Parser#parse was in fact called. + YAML.safe_load(*arguments) rescue nil + end + end + end + + if SafeYAML::YAML_ENGINE == "syck" + it "uses Syck internally to parse YAML" do + expect(YAML).to receive(:parse).with("foo: bar") + # This won't work now; we just want to ensure YAML::parse was in fact called. + YAML.safe_load("foo: bar") rescue nil + end + end + end + + it "loads a plain ol' YAML document just fine" do + result = YAML.safe_load <<-YAML.unindent + foo: + number: 1 + boolean: true + nil: ~ + string: Hello, there! + symbol: :blah + sequence: + - hi + - bye + YAML + + expect(result).to eq({ + "foo" => { + "number" => 1, + "boolean" => true, + "nil" => nil, + "string" => "Hello, there!", + "symbol" => ":blah", + "sequence" => ["hi", "bye"] + } + }) + end + + it "works for YAML documents with anchors and aliases" do + result = YAML.safe_load <<-YAML + - &id001 {} + - *id001 + - *id001 + YAML + + expect(result).to eq([{}, {}, {}]) + end + + it "works for YAML documents with binary tagged keys" do + result = YAML.safe_load <<-YAML + ? !!binary > + Zm9v + : "bar" + ? !!binary > + YmFy + : "baz" + YAML + + expect(result).to eq({"foo" => "bar", "bar" => "baz"}) + end + + it "works for YAML documents with binary tagged values" do + result = YAML.safe_load <<-YAML + "foo": !!binary > + YmFy + "bar": !!binary > + YmF6 + YAML + + expect(result).to eq({"foo" => "bar", "bar" => "baz"}) + end + + it "works for YAML documents with binary tagged array values" do + result = YAML.safe_load <<-YAML + - !binary |- + Zm9v + - !binary |- + YmFy + YAML + + expect(result).to eq(["foo", "bar"]) + end + + it "works for YAML documents with sections" do + result = YAML.safe_load <<-YAML + mysql: &mysql + adapter: mysql + pool: 30 + login: &login + username: user + password: password123 + development: &development + <<: *mysql + <<: *login + host: localhost + YAML + + expect(result).to eq({ + "mysql" => { + "adapter" => "mysql", + "pool" => 30 + }, + "login" => { + "username" => "user", + "password" => "password123" + }, + "development" => { + "adapter" => "mysql", + "pool" => 30, + "username" => "user", + "password" => "password123", + "host" => "localhost" + } + }) + end + + it "correctly prefers explicitly defined values over default values from included sections" do + # Repeating this test 100 times to increase the likelihood of running into an issue caused by + # non-deterministic hash key enumeration. + 100.times do + result = YAML.safe_load <<-YAML + defaults: &defaults + foo: foo + bar: bar + baz: baz + custom: + <<: *defaults + bar: custom_bar + baz: custom_baz + YAML + + expect(result["custom"]).to eq({ + "foo" => "foo", + "bar" => "custom_bar", + "baz" => "custom_baz" + }) + end + end + + it "works with multi-level inheritance" do + result = YAML.safe_load <<-YAML + defaults: &defaults + foo: foo + bar: bar + baz: baz + custom: &custom + <<: *defaults + bar: custom_bar + baz: custom_baz + grandcustom: &grandcustom + <<: *custom + YAML + + expect(result).to eq({ + "defaults" => { "foo" => "foo", "bar" => "bar", "baz" => "baz" }, + "custom" => { "foo" => "foo", "bar" => "custom_bar", "baz" => "custom_baz" }, + "grandcustom" => { "foo" => "foo", "bar" => "custom_bar", "baz" => "custom_baz" } + }) + end + + it "returns false when parsing an empty document" do + expect([ + YAML.safe_load(""), + YAML.safe_load(" "), + YAML.safe_load("\n") + ]).to eq([false, false, false]) + end + + it "returns nil when parsing a single value representing nil" do + expect([ + YAML.safe_load("~"), + YAML.safe_load("null") + ]).to eq([nil, nil]) + end + + context "with custom initializers defined" do + before :each do + if SafeYAML::YAML_ENGINE == "psych" + SafeYAML::OPTIONS[:custom_initializers] = { + "!set" => lambda { Set.new }, + "!hashiemash" => lambda { Hashie::Mash.new } + } + else + SafeYAML::OPTIONS[:custom_initializers] = { + "tag:yaml.org,2002:set" => lambda { Set.new }, + "tag:yaml.org,2002:hashiemash" => lambda { Hashie::Mash.new } + } + end + end + + it "will use a custom initializer to instantiate an array-like class upon deserialization" do + result = YAML.safe_load <<-YAML.unindent + --- !set + - 1 + - 2 + - 3 + YAML + + expect(result).to be_a(Set) + expect(result.to_a).to match_array([1, 2, 3]) + end + + it "will use a custom initializer to instantiate a hash-like class upon deserialization" do + result = YAML.safe_load <<-YAML.unindent + --- !hashiemash + foo: bar + YAML + + expect(result).to be_a(Hashie::Mash) + expect(result.to_hash).to eq({ "foo" => "bar" }) + end + end + + context "with special whitelisted tags defined" do + before :each do + SafeYAML::whitelist!(OpenStruct) + + # Necessary for deserializing OpenStructs properly. + SafeYAML::OPTIONS[:deserialize_symbols] = true + end + + it "will allow objects to be deserialized for whitelisted tags" do + result = YAML.safe_load("--- !ruby/object:OpenStruct\ntable:\n foo: bar\n") + expect(result).to be_a(OpenStruct) + expect(result.instance_variable_get(:@table)).to eq({ "foo" => "bar" }) + end + + it "will not deserialize objects without whitelisted tags" do + result = YAML.safe_load("--- !ruby/hash:ExploitableBackDoor\nfoo: bar\n") + expect(result).not_to be_a(ExploitableBackDoor) + expect(result).to eq({ "foo" => "bar" }) + end + + it "will not allow non-whitelisted objects to be embedded within objects with whitelisted tags" do + result = YAML.safe_load <<-YAML.unindent + --- !ruby/object:OpenStruct + table: + :backdoor: !ruby/object:ExploitableBackDoor + foo: bar + YAML + + expect(result).to be_a(OpenStruct) + expect(result.backdoor).not_to be_a(ExploitableBackDoor) + expect(result.backdoor).to eq({ "foo" => "bar" }) + end + + context "with the :raise_on_unknown_tag option enabled" do + before :each do + SafeYAML::OPTIONS[:raise_on_unknown_tag] = true + end + + after :each do + SafeYAML.restore_defaults! + end + + it "raises an exception if a non-nil, non-whitelisted tag is encountered" do + expect { + YAML.safe_load <<-YAML.unindent + --- !ruby/object:Unknown + foo: bar + YAML + }.to raise_error + end + + it "checks all tags, even those within objects with trusted tags" do + expect { + YAML.safe_load <<-YAML.unindent + --- !ruby/object:OpenStruct + table: + :backdoor: !ruby/object:Unknown + foo: bar + YAML + }.to raise_error + end + + it "does not raise an exception as long as all tags are whitelisted" do + result = YAML.safe_load <<-YAML.unindent + --- !ruby/object:OpenStruct + table: + :backdoor: + string: foo + integer: 1 + float: 3.14 + symbol: :bar + date: 2013-02-20 + array: [] + hash: {} + YAML + + expect(result).to be_a(OpenStruct) + expect(result.backdoor).to eq({ + "string" => "foo", + "integer" => 1, + "float" => 3.14, + "symbol" => :bar, + "date" => Date.parse("2013-02-20"), + "array" => [], + "hash" => {} + }) + end + + it "does not raise an exception on the non-specific '!' tag" do + result = nil + expect { result = YAML.safe_load "--- ! 'foo'" }.to_not raise_error + expect(result).to eq("foo") + end + + context "with whitelisted custom class" do + class SomeClass + attr_accessor :foo + end + let(:instance) { SomeClass.new } + + before do + SafeYAML::whitelist!(SomeClass) + instance.foo = 'with trailing whitespace: ' + end + + it "does not raise an exception on the non-specific '!' tag" do + result = nil + expect { result = YAML.safe_load(instance.to_yaml) }.to_not raise_error + expect(result.foo).to eq('with trailing whitespace: ') + end + end + end + end + + context "when options are passed direclty to #load which differ from the defaults" do + let(:default_options) { {} } + + before :each do + SafeYAML::OPTIONS.merge!(default_options) + end + + context "(for example, when symbol deserialization is enabled by default)" do + let(:default_options) { { :deserialize_symbols => true } } + + it "goes with the default option when it is not overridden" do + silence_warnings do + expect(YAML.load(":foo: bar")).to eq({ :foo => "bar" }) + end + end + + it "allows the default option to be overridden on a per-call basis" do + silence_warnings do + expect(YAML.load(":foo: bar", :deserialize_symbols => false)).to eq({ ":foo" => "bar" }) + expect(YAML.load(":foo: bar", :deserialize_symbols => true)).to eq({ :foo => "bar" }) + end + end + end + + context "(or, for example, when certain tags are whitelisted)" do + let(:default_options) { + { + :deserialize_symbols => true, + :whitelisted_tags => SafeYAML::YAML_ENGINE == "psych" ? + ["!ruby/object:OpenStruct"] : + ["tag:ruby.yaml.org,2002:object:OpenStruct"] + } + } + + it "goes with the default option when it is not overridden" do + result = safe_load_round_trip(OpenStruct.new(:foo => "bar")) + expect(result).to be_a(OpenStruct) + expect(result.foo).to eq("bar") + end + + it "allows the default option to be overridden on a per-call basis" do + result = safe_load_round_trip(OpenStruct.new(:foo => "bar"), :whitelisted_tags => []) + expect(result).to eq({ "table" => { :foo => "bar" } }) + + result = safe_load_round_trip(OpenStruct.new(:foo => "bar"), :deserialize_symbols => false, :whitelisted_tags => []) + expect(result).to eq({ "table" => { ":foo" => "bar" } }) + end + end + end + end + + describe "unsafe_load_file" do + if SafeYAML::YAML_ENGINE == "psych" && RUBY_VERSION >= "1.9.3" + it "allows exploits through objects defined in YAML w/ !ruby/hash via custom :[]= methods" do + backdoor = YAML.unsafe_load_file "spec/exploit.1.9.3.yaml" + expect(backdoor).to be_exploited_through_setter + end + end + + if SafeYAML::YAML_ENGINE == "psych" && RUBY_VERSION >= "1.9.2" + it "allows exploits through objects defined in YAML w/ !ruby/object via the :init_with method" do + backdoor = YAML.unsafe_load_file "spec/exploit.1.9.2.yaml" + expect(backdoor).to be_exploited_through_init_with + end + end + + it "allows exploits through objects w/ sensitive instance variables defined in YAML w/ !ruby/object" do + backdoor = YAML.unsafe_load_file "spec/exploit.1.9.2.yaml" + expect(backdoor).to be_exploited_through_ivars + end + end + + describe "safe_load_file" do + it "does NOT allow exploits through objects defined in YAML w/ !ruby/hash" do + object = YAML.safe_load_file "spec/exploit.1.9.3.yaml" + expect(object).not_to be_a(ExploitableBackDoor) + end + + it "does NOT allow exploits through objects defined in YAML w/ !ruby/object" do + object = YAML.safe_load_file "spec/exploit.1.9.2.yaml" + expect(object).not_to be_a(ExploitableBackDoor) + end + + it "returns false when parsing an empty file" do + expect(YAML.safe_load_file("spec/issue49.yml")).to eq(false) + end + end + + describe "load" do + let(:options) { {} } + + let (:arguments) { + if SafeYAML::MULTI_ARGUMENT_YAML_LOAD + ["foo: bar", nil, options] + else + ["foo: bar", options] + end + } + + context "as long as a :default_mode has been specified" do + it "doesn't issue a warning for safe mode, since an explicit mode has been set" do + SafeYAML::OPTIONS[:default_mode] = :safe + expect(Kernel).not_to receive(:warn) + YAML.load(*arguments) + end + + it "doesn't issue a warning for unsafe mode, since an explicit mode has been set" do + SafeYAML::OPTIONS[:default_mode] = :unsafe + expect(Kernel).not_to receive(:warn) + YAML.load(*arguments) + end + end + + context "when the :safe options is specified" do + let(:safe_mode) { true } + let(:options) { { :safe => safe_mode } } + + it "doesn't issue a warning" do + expect(Kernel).not_to receive(:warn) + YAML.load(*arguments) + end + + it "calls #safe_load if the :safe option is set to true" do + expect(YAML).to receive(:safe_load) + YAML.load(*arguments) + end + + context "when the :safe option is set to false" do + let(:safe_mode) { false } + + it "calls #unsafe_load if the :safe option is set to false" do + expect(YAML).to receive(:unsafe_load) + YAML.load(*arguments) + end + end + end + + it "issues a warning when the :safe option is omitted" do + silence_warnings do + expect(Kernel).to receive(:warn) + YAML.load(*arguments) + end + end + + it "only issues a warning once (to avoid spamming an app's output)" do + silence_warnings do + expect(Kernel).to receive(:warn).once + 2.times { YAML.load(*arguments) } + end + end + + it "defaults to safe mode if the :safe option is omitted" do + silence_warnings do + expect(YAML).to receive(:safe_load) + YAML.load(*arguments) + end + end + + context "with the default mode set to :unsafe" do + before :each do + SafeYAML::OPTIONS[:default_mode] = :unsafe + end + + it "defaults to unsafe mode if the :safe option is omitted" do + silence_warnings do + expect(YAML).to receive(:unsafe_load) + YAML.load(*arguments) + end + end + + it "calls #safe_load if the :safe option is set to true" do + expect(YAML).to receive(:safe_load) + YAML.load(*(arguments + [{ :safe => true }])) + end + end + end + + describe "load_file" do + let(:filename) { "spec/exploit.1.9.2.yaml" } # doesn't really matter + + it "issues a warning if the :safe option is omitted" do + silence_warnings do + expect(Kernel).to receive(:warn) + YAML.load_file(filename) + end + end + + it "doesn't issue a warning as long as the :safe option is specified" do + expect(Kernel).not_to receive(:warn) + YAML.load_file(filename, :safe => true) + end + + it "defaults to safe mode if the :safe option is omitted" do + silence_warnings do + expect(YAML).to receive(:safe_load_file) + YAML.load_file(filename) + end + end + + it "calls #safe_load_file if the :safe option is set to true" do + expect(YAML).to receive(:safe_load_file) + YAML.load_file(filename, :safe => true) + end + + it "calls #unsafe_load_file if the :safe option is set to false" do + expect(YAML).to receive(:unsafe_load_file) + YAML.load_file(filename, :safe => false) + end + + context "with arbitrary object deserialization enabled by default" do + before :each do + SafeYAML::OPTIONS[:default_mode] = :unsafe + end + + it "defaults to unsafe mode if the :safe option is omitted" do + silence_warnings do + expect(YAML).to receive(:unsafe_load_file) + YAML.load_file(filename) + end + end + + it "calls #safe_load if the :safe option is set to true" do + expect(YAML).to receive(:safe_load_file) + YAML.load_file(filename, :safe => true) + end + end + + it "handles files starting with --- (see issue #48)" do + expect(YAML.load_file("spec/issue48.txt", :safe => true)).to eq({ + "title" => "Blah", + "key" => "value" + }) + end + + it "handles content starting with --- (see issue #48)" do + yaml = File.read("spec/issue48.txt") + expect(YAML.load(yaml, :safe => true)).to eq({ + "title" => "Blah", + "key" => "value" + }) + end + end + + describe "whitelist!" do + context "not a class" do + it "should raise" do + expect { SafeYAML::whitelist! :foo }.to raise_error(/not a Class/) + expect(SafeYAML::OPTIONS[:whitelisted_tags]).to be_empty + end + end + + context "anonymous class" do + it "should raise" do + expect { SafeYAML::whitelist! Class.new }.to raise_error(/cannot be anonymous/) + expect(SafeYAML::OPTIONS[:whitelisted_tags]).to be_empty + end + end + + context "with a Class as its argument" do + it "should configure correctly" do + expect { SafeYAML::whitelist! OpenStruct }.to_not raise_error + expect(SafeYAML::OPTIONS[:whitelisted_tags].grep(/OpenStruct\Z/)).not_to be_empty + end + + it "successfully deserializes the specified class" do + SafeYAML.whitelist!(OpenStruct) + + # necessary for properly assigning OpenStruct attributes + SafeYAML::OPTIONS[:deserialize_symbols] = true + + result = safe_load_round_trip(OpenStruct.new(:foo => "bar")) + expect(result).to be_a(OpenStruct) + expect(result.foo).to eq("bar") + end + + it "works for ranges" do + SafeYAML.whitelist!(Range) + expect(safe_load_round_trip(1..10)).to eq(1..10) + end + + it "works for regular expressions" do + SafeYAML.whitelist!(Regexp) + expect(safe_load_round_trip(/foo/)).to eq(/foo/) + end + + it "works for multiple classes" do + SafeYAML.whitelist!(Range, Regexp) + expect(safe_load_round_trip([(1..10), /bar/])).to eq([(1..10), /bar/]) + end + + it "works for arbitrary Exception subclasses" do + class CustomException < Exception + attr_reader :custom_message + + def initialize(custom_message) + @custom_message = custom_message + end + end + + SafeYAML.whitelist!(CustomException) + + ex = safe_load_round_trip(CustomException.new("blah")) + expect(ex).to be_a(CustomException) + expect(ex.custom_message).to eq("blah") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/spec_helper.rb new file mode 100644 index 000000000000..967b2d303b7e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/spec_helper.rb @@ -0,0 +1,42 @@ +HERE = File.dirname(__FILE__) unless defined?(HERE) +ROOT = File.join(HERE, "..") unless defined?(ROOT) + +$LOAD_PATH << File.join(ROOT, "lib") +$LOAD_PATH << File.join(HERE, "support") + +require "yaml" +if ENV["YAMLER"] && defined?(YAML::ENGINE) + YAML::ENGINE.yamler = ENV["YAMLER"] +end + +ruby_version = defined?(JRUBY_VERSION) ? "JRuby #{JRUBY_VERSION} in #{RUBY_VERSION} mode" : "Ruby #{RUBY_VERSION}" +yaml_engine = defined?(YAML::ENGINE) ? YAML::ENGINE.yamler : "syck" +libyaml_version = yaml_engine == "psych" && Psych.const_defined?("LIBYAML_VERSION", false) ? Psych::LIBYAML_VERSION : "N/A" + +env_info = [ + ruby_version, + "YAML: #{yaml_engine} (#{YAML::VERSION}) (libyaml: #{libyaml_version})", + "Monkeypatch: #{ENV['MONKEYPATCH_YAML']}" +] + +puts env_info.join(", ") + +# Caching references to these methods before loading safe_yaml in order to test +# that they aren't touched unless you actually require safe_yaml (see yaml_spec.rb). +ORIGINAL_YAML_LOAD = YAML.method(:load) +ORIGINAL_YAML_LOAD_FILE = YAML.method(:load_file) + +require "safe_yaml/load" +require "ostruct" +require "hashie" +require "heredoc_unindent" + +# Stolen from Rails: +# https://github.com/rails/rails/blob/3-2-stable/activesupport/lib/active_support/core_ext/kernel/reporting.rb#L10-25 +def silence_warnings + $VERBOSE = nil; yield +ensure + $VERBOSE = true +end + +require File.join(HERE, "resolver_specs") diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/store_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/store_spec.rb new file mode 100644 index 000000000000..aafcfd43215f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/store_spec.rb @@ -0,0 +1,57 @@ +require 'spec_helper' + +require 'safe_yaml/store' + +describe SafeYAML::Store do + + let(:file) { 'spec/store.yaml' } + let(:content) { "--- \nfoo: 42\n:bar: \"party\"\n" } + + before do + # Rewrite file on every test, as its contents are potentially modified by + # SafeYAML::Store#transaction + File.open(file, 'w') { |f| f.write(content) } + end + + def expect_safe_load(options = {}) + load_args = [content, options] + load_args.insert(1, nil) if SafeYAML::YAML_ENGINE == 'psych' + + expect(SafeYAML).to receive(:load).with(*load_args).and_call_original + expect(YAML).not_to receive(:load) + end + + let(:init_args) { [file] } + subject { described_class.new(*init_args) } + + it 'should be a YAML::Store' do + expect(subject).to be_a(YAML::Store) + end + + it 'should be a SafeYAML::Store' do + expect(subject).to be_a(SafeYAML::Store) + end + + it 'should use SafeYAML.load instead of YAML.load' do + expect_safe_load + expect(subject.transaction { subject['foo'] }).to eq(42) + end + + it 'preserves default SafeYAML behavior' do + expect(subject.transaction { subject[:bar] }).to eq(nil) + expect(subject.transaction { subject[':bar'] }).to eq('party') + end + + + describe 'with options' do + + let(:init_args) { super().insert(2, :deserialize_symbols => true) } + + it 'should accept options for SafeYAML.load' do + expect_safe_load(:deserialize_symbols => true) + expect(subject.transaction { subject[:bar] }).to eq('party') + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/support/exploitable_back_door.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/support/exploitable_back_door.rb new file mode 100644 index 000000000000..48754b4639a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/support/exploitable_back_door.rb @@ -0,0 +1,29 @@ +class ExploitableBackDoor + def exploited? + @exploited_through_setter || @exploited_through_init_with || @exploited_through_ivars + end + + def exploited_through_setter? + @exploited_through_setter + end + + def exploited_through_init_with? + @exploited_through_init_with + end + + def exploited_through_ivars? + self.instance_variables.any? + end + + def init_with(command) + # Note: this is how bad this COULD be. + # system("#{command}") + @exploited_through_init_with = true + end + + def []=(command, arguments) + # Note: this is how bad this COULD be. + # system("#{command} #{arguments}") + @exploited_through_setter = true + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/syck_resolver_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/syck_resolver_spec.rb new file mode 100644 index 000000000000..bec729bfbeb0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/syck_resolver_spec.rb @@ -0,0 +1,10 @@ +require "spec_helper" + +if SafeYAML::YAML_ENGINE == "syck" + require "safe_yaml/syck_resolver" + + describe SafeYAML::SyckResolver do + include ResolverSpecs + let(:resolver) { SafeYAML::SyckResolver.new } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/base64_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/base64_spec.rb new file mode 100644 index 000000000000..f4d83d033d25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/base64_spec.rb @@ -0,0 +1,11 @@ +require "spec_helper" + +describe SafeYAML::Transform do + it "should return the same encoding when decoding Base64" do + value = "c3VyZS4=" + decoded = SafeYAML::Transform.to_proper_type(value, false, "!binary") + + expect(decoded).to eq("sure.") + expect(decoded.encoding).to eq(value.encoding) if decoded.respond_to?(:encoding) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_date_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_date_spec.rb new file mode 100644 index 000000000000..31bdb411afe2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_date_spec.rb @@ -0,0 +1,60 @@ +require "spec_helper" + +describe SafeYAML::Transform::ToDate do + it "returns true when the value matches a valid Date" do + expect(subject.transform?("2013-01-01")).to eq([true, Date.parse("2013-01-01")]) + end + + it "returns false when the value does not match a valid Date" do + expect(subject.transform?("foobar")).to be_falsey + end + + it "returns false when the value does not end with a Date" do + expect(subject.transform?("2013-01-01\nNOT A DATE")).to be_falsey + end + + it "returns false when the value does not begin with a Date" do + expect(subject.transform?("NOT A DATE\n2013-01-01")).to be_falsey + end + + it "correctly parses the remaining formats of the YAML spec" do + equivalent_values = [ + "2001-12-15T02:59:43.1Z", # canonical + "2001-12-14t21:59:43.10-05:00", # iso8601 + "2001-12-14 21:59:43.10 -5", # space separated + "2001-12-15 2:59:43.10" # no time zone (Z) + ] + + equivalent_values.each do |value| + success, result = subject.transform?(value) + expect(success).to be_truthy + expect(result).to eq(Time.utc(2001, 12, 15, 2, 59, 43, 100000)) + end + end + + it "converts times to the local timezone" do + success, result = subject.transform?("2012-12-01 10:33:45 +11:00") + expect(success).to be_truthy + expect(result).to eq(Time.utc(2012, 11, 30, 23, 33, 45)) + expect(result.gmt_offset).to eq(Time.local(2012, 11, 30).gmt_offset) + end + + it "returns strings for invalid dates" do + expect(subject.transform?("0000-00-00")).to eq([true, "0000-00-00"]) + expect(subject.transform?("2013-13-01")).to eq([true, "2013-13-01"]) + expect(subject.transform?("2014-01-32")).to eq([true, "2014-01-32"]) + end + + it "returns strings for invalid date/times" do + expect(subject.transform?("0000-00-00 00:00:00 -0000")).to eq([true, "0000-00-00 00:00:00 -0000"]) + expect(subject.transform?("2013-13-01 21:59:43 -05:00")).to eq([true, "2013-13-01 21:59:43 -05:00"]) + expect(subject.transform?("2013-01-32 21:59:43 -05:00")).to eq([true, "2013-01-32 21:59:43 -05:00"]) + expect(subject.transform?("2013-01-30 25:59:43 -05:00")).to eq([true, "2013-01-30 25:59:43 -05:00"]) + expect(subject.transform?("2013-01-30 21:69:43 -05:00")).to eq([true, "2013-01-30 21:69:43 -05:00"]) + + # Interesting. It seems that in some older Ruby versions, the below actually parses successfully + # w/ DateTime.parse; but it fails w/ YAML.load. Whom to follow??? + + # subject.transform?("2013-01-30 21:59:63 -05:00").should == [true, "2013-01-30 21:59:63 -05:00"] + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_float_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_float_spec.rb new file mode 100644 index 000000000000..d4d813fb700a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_float_spec.rb @@ -0,0 +1,42 @@ +require "spec_helper" + +describe SafeYAML::Transform::ToFloat do + it "returns true when the value matches a valid Float" do + expect(subject.transform?("20.00")).to eq([true, 20.0]) + end + + it "returns false when the value does not match a valid Float" do + expect(subject.transform?("foobar")).to be_falsey + end + + it "returns false when the value spans multiple lines" do + expect(subject.transform?("20.00\nNOT A FLOAT")).to be_falsey + end + + it "correctly parses all formats in the YAML spec" do + # canonical + expect(subject.transform?("6.8523015e+5")).to eq([true, 685230.15]) + + # exponentioal + expect(subject.transform?("685.230_15e+03")).to eq([true, 685230.15]) + + # fixed + expect(subject.transform?("685_230.15")).to eq([true, 685230.15]) + + # sexagesimal + expect(subject.transform?("190:20:30.15")).to eq([true, 685230.15]) + + # infinity + expect(subject.transform?("-.inf")).to eq([true, (-1.0 / 0.0)]) + + # not a number + # NOTE: can't use == here since NaN != NaN + success, result = subject.transform?(".NaN") + expect(success).to be_truthy; expect(result).to be_nan + end + + # issue 29 + it "returns false for the string '.'" do + expect(subject.transform?(".")).to be_falsey + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_integer_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_integer_spec.rb new file mode 100644 index 000000000000..6c6723bb45ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_integer_spec.rb @@ -0,0 +1,64 @@ +require "spec_helper" + +describe SafeYAML::Transform::ToInteger do + it "returns true when the value matches a valid Integer" do + expect(subject.transform?("10")).to eq([true, 10]) + end + + it "returns false when the value does not match a valid Integer" do + expect(subject.transform?("foobar")).to be_falsey + end + + it "returns false when the value spans multiple lines" do + expect(subject.transform?("10\nNOT AN INTEGER")).to be_falsey + end + + it "allows commas in the number" do + expect(subject.transform?("1,000")).to eq([true, 1000]) + end + + it "correctly parses numbers in octal format" do + expect(subject.transform?("010")).to eq([true, 8]) + end + + it "correctly parses numbers in hexadecimal format" do + expect(subject.transform?("0x1FF")).to eq([true, 511]) + end + + it "defaults to a string for a number that resembles octal format but is not" do + expect(subject.transform?("09")).to be_falsey + end + + it "correctly parses 0 in decimal" do + expect(subject.transform?("0")).to eq([true, 0]) + end + + it "defaults to a string for a number that resembles hexadecimal format but is not" do + expect(subject.transform?("0x1G")).to be_falsey + end + + it "correctly parses all formats in the YAML spec" do + # canonical + expect(subject.transform?("685230")).to eq([true, 685230]) + + # decimal + expect(subject.transform?("+685_230")).to eq([true, 685230]) + + # octal + expect(subject.transform?("02472256")).to eq([true, 685230]) + + # hexadecimal: + expect(subject.transform?("0x_0A_74_AE")).to eq([true, 685230]) + + # binary + expect(subject.transform?("0b1010_0111_0100_1010_1110")).to eq([true, 685230]) + + # sexagesimal + expect(subject.transform?("190:20:30")).to eq([true, 685230]) + end + + # see https://github.com/dtao/safe_yaml/pull/51 + it "strips out underscores before parsing decimal values" do + expect(subject.transform?("_850_")).to eq([true, 850]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_symbol_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_symbol_spec.rb new file mode 100644 index 000000000000..59cd24267a9c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/transform/to_symbol_spec.rb @@ -0,0 +1,51 @@ +require "spec_helper" + +describe SafeYAML::Transform::ToSymbol do + def with_symbol_deserialization_value(value) + symbol_deserialization_flag = SafeYAML::OPTIONS[:deserialize_symbols] + SafeYAML::OPTIONS[:deserialize_symbols] = value + + yield + + ensure + SafeYAML::OPTIONS[:deserialize_symbols] = symbol_deserialization_flag + end + + def with_symbol_deserialization(&block) + with_symbol_deserialization_value(true, &block) + end + + def without_symbol_deserialization(&block) + with_symbol_deserialization_value(false, &block) + end + + it "returns true when the value matches a valid Symbol" do + with_symbol_deserialization { expect(subject.transform?(":foo")[0]).to be_truthy } + end + + it "returns true when the value matches a valid String+Symbol" do + with_symbol_deserialization { expect(subject.transform?(':"foo"')[0]).to be_truthy } + end + + it "returns true when the value matches a valid String+Symbol with 's" do + with_symbol_deserialization { expect(subject.transform?(":'foo'")[0]).to be_truthy } + end + + it "returns true when the value has special characters and is wrapped in a String" do + with_symbol_deserialization { expect(subject.transform?(':"foo.bar"')[0]).to be_truthy } + end + + it "returns false when symbol deserialization is disabled" do + without_symbol_deserialization { expect(subject.transform?(":foo")).to be_falsey } + end + + it "returns false when the value does not match a valid Symbol" do + with_symbol_deserialization { expect(subject.transform?("foo")).to be_falsey } + end + + it "returns false when the symbol does not begin the line" do + with_symbol_deserialization do + expect(subject.transform?("NOT A SYMBOL\n:foo")).to be_falsey + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/yaml_spec.rb b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/yaml_spec.rb new file mode 100644 index 000000000000..2c2bd181e3de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/safe_yaml-1.0.5/spec/yaml_spec.rb @@ -0,0 +1,15 @@ +# See https://github.com/dtao/safe_yaml/issues/47 + +require "spec_helper" + +describe YAML do + context "when you've only required safe_yaml/load", :libraries => true do + it "YAML.load doesn't get monkey patched" do + expect(YAML.method(:load)).to eq(ORIGINAL_YAML_LOAD) + end + + it "YAML.load_file doesn't get monkey patched" do + expect(YAML.method(:load_file)).to eq(ORIGINAL_YAML_LOAD_FILE) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/.yardopts b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/.yardopts new file mode 100644 index 000000000000..a380440c627f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/.yardopts @@ -0,0 +1,13 @@ +--readme README.md +--markup markdown +--markup-provider redcarpet +--default-return "" +--title "Sass Documentation" +--query 'object.type != :classvariable' +--query 'object.type != :constant || @api && @api.text == "public"' +--hide-void-return +--protected +--no-private +--no-highlight +--tag comment +--hide-tag comment diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/CODE_OF_CONDUCT.md b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/CODE_OF_CONDUCT.md new file mode 100644 index 000000000000..c4164af109f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/CODE_OF_CONDUCT.md @@ -0,0 +1,10 @@ +Sass is more than a technology; Sass is driven by the community of individuals +that power its development and use every day. As a community, we want to embrace +the very differences that have made our collaboration so powerful, and work +together to provide the best environment for learning, growing, and sharing of +ideas. It is imperative that we keep Sass a fun, welcoming, challenging, and +fair place to play. + +[The full community guidelines can be found on the Sass website.][link] + +[link]: https://sass-lang.com/community-guidelines diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/CONTRIBUTING.md b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/CONTRIBUTING.md new file mode 100644 index 000000000000..a4e671d94614 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/CONTRIBUTING.md @@ -0,0 +1,148 @@ +Contributions are welcomed. Please see the following site for guidelines: + +[https://sass-lang.com/community#Contribute](https://sass-lang.com/community#Contribute) + +* [Branches](#main-development-branches) + * [Feature Branches](#feature-branches) + * [Experimental Branches](#experimental-branches) + * [Old Stable Branches](#old-stable-branches) +* [Versioning](#versioning) + * [Making Breaking Changes](#making-breaking-changes) + * [Exceptional Breakages](#exceptional-breakages) + +## Branches + +The Sass repository has three primary development branches, each of which tracks +a different line of releases (see [versioning](#versioning) below). Each branch +is regularly merged into the one below: `stable` into `next`, `next` into +`master`. + +* The `stable` branch is the default—it's what GitHub shows if you go to + [sass/ruby-sass](https://github.com/sass/ruby-sass), and it's the default place for pull + requests to go. This branch is where we work on the next patch release. Bug + fixes and documentation improvements belong here, but not new features. + +* The `next` branch is where we work on the next minor release. It's where most + new features go, as long as they're not breaking changes. Very occasionally + breaking changes will go here as well—see + [exceptional breakages](#exceptional-breakages) below for details. + +* The `master` branch is where we work on the next major release. It's where + breaking changes go. We also occasionally decide that a non-breaking feature + is big enough to warrant saving until the next major release, in which case it + will also be developed here. + +Ideally, pull requests would be made against the appropriate +branch, but don't worry about it too much; if you make a request against the +wrong branch, the maintainer will take responsibility for rebasing it before +merging. + +### Testing + +Tests for changes to the Sass language go in +[sass-spec](https://github.com/sass/sass-spec) so that other +implementations (E.g. libSass) can be tested against the same test +suite. The sass-spec repo follows a "trunk development" model in that +the tests there test against different version of the Sass language (as +opposed to having branches that track different Sass versions). When +contributing changes to Sass, update the Gemfile to use sass-spec from a +branch or fork that has the new tests. When the feature lands in Sass, +the committer will also merge the corresponding sass-spec changes. + +The [documentation of +sass-spec](https://github.com/sass/sass-spec/blob/master/README.md) +explains how to run sass-spec and contribute changes. In development, +Change the Gemfile(s) to use the `:path` option against the sass-spec gem +to link your local checkout of sass and sass-spec together in one or +both directions. + +Changes to Sass internals or Ruby Sass specific features (E.g. +the `sass-convert` tool) should always have tests in the Sass `test` +directory following the conventions you see there. + +### Feature Branches + +Sometimes it won't be possible to merge a new feature into `next` or `master` +immediately. It may require longer-term work before it's complete, or we may not +want to release it as part of any alpha releases of the branch in question. +Branches like this are labeled `feature.#{name}` and stay on GitHub until +they're ready to be merged. + +### Experimental Branches + +Not all features pan out, and not all code is a good fit for merging into the +main codebase. Usually when this happens the code is just discarded, but every +so often it's interesting or promising enough that it's worth keeping around. +This is what experimental branches (labeled `experimental.#{name}`) are for. +While they're not currently in use, they contain code that might be useful in +the future. + +### Old Stable Branches + +Usually Sass doesn't have the development time to do long-term maintenance of +old release. But occasionally, very rarely, it becomes necessary. In cases like +that, a branch named `stable_#{version}` will be created, starting from the last +tag in that version series. + +## Versioning + +Starting with version 3.5.0, Sass uses [semantic versioning](http://semver.org/) +to indicate the evolution of its language semantics as much as possible. This +means that patch releases (such as 3.5.3) contain only bug fixes, minor releases +(such as 3.6.0) contain backwards-compatible features, and only major releases +(such as 4.0.0) are allowed to have backwards-incompatible behavior. There are +[exceptions](#exceptional-breakages), but we try to follow this rule as closely +as possible. + +Note, however, that the semantic versioning applies only to the language's +semantics, not to the Ruby APIs. Although we try hard to keep widely-used APIs +like [`Sass::Engine`][Sass::Engine] stable, we don't have a strong distinction +between public and private APIs and we need to be able to freely refactor our +code. + +[Sass::Engine]: https://sass-lang.com/documentation/Sass/Engine.html + +### Making Breaking Changes + +Sometimes the old way of doing something just isn't going to work anymore, and +the new way just can't be made backwards-compatible. In that case, a breaking +change is necessary. These changes are rarely pleasant, but they contribute to +making the language better in the long term. + +Our breaking change process tries to make such changes as clear to users and as +easy to adapt to as possible. We want to ensure that there's a clear path +forward for users using functionality that will no longer exist, and that they +are able to understand what's changing and what they need to do. We've developed +the following process for this: + +1. Deprecate the old behavior [in `stable`](#branches). At minimum, deprecating + some behavior involves printing a warning when that behavior is used + explaining that it's going to go away in the future. Ideally, this message + will also include code that will do the same thing in a non-deprecated way. + If there's a thorough prose explanation of the change available online, the + message should link to that as well. + +2. If possible, make `sass-convert` (also in `stable`) convert the deprecated + behavior into a non-deprecated form. This allows users to run `sass-convert + -R -i` to automatically update their stylesheets. + +3. Implement the new behavior in `master`. The sooner this happens, the better: + it may be unclear exactly what needs to be deprecated until the new + implementation exists. + +4. Release an alpha version of `master` that includes the new behavior. This + allows users who are dissatisfied with the workaround to use the new + behavior early. Normally a maintainer will take care of this. + +### Exceptional Breakages + +Because Sass's syntax and semantics are closely tied to those of CSS, there are +occasionally times when CSS syntax is introduced that overlaps with +previously-valid Sass. In this case in particular, we may introduce a breaking +change in a minor version to get back to CSS compatibility as soon as possible. + +Exceptional breakages still require the full deprecation process; the only +change is that the new behavior is implemented in `next` rather than `master`. +Because there are no minor releases between the deprecation and the removal of +the old behavior, the deprecation warning should be introduced soon as it +becomes clear that an exceptional breakage is necessary. diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/MIT-LICENSE b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/MIT-LICENSE new file mode 100644 index 000000000000..5c184eba81be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2006-2016 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/README.md b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/README.md new file mode 100644 index 000000000000..4ae836e67f93 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/README.md @@ -0,0 +1,235 @@ +## Ruby Sass Has Reached End-of-Life + +Ruby Sass should no longer be used, and will no longer be receiving any updates. +See [the Sass blog][], and consider switching to the [`sassc` gem]. + +[the Sass blog]: https://sass-lang.com/blog/posts/7828841 +[`sassc` gem]: https://rubygems.org/gems/sassc + +# Sass [![Travis Build Status](https://travis-ci.org/sass/ruby-sass.svg?branch=next)](https://travis-ci.org/sass/ruby-sass) [![Gem Version](https://badge.fury.io/rb/sass.svg)](http://badge.fury.io/rb/sass) [![Inline docs](http://inch-ci.org/github/sass/sass.svg)](http://inch-ci.org/github/sass/sass) + +**Sass makes CSS fun again**. Sass is an extension of CSS, +adding nested rules, variables, mixins, selector inheritance, and more. +It's translated to well-formatted, standard CSS +using the command line tool or a web-framework plugin. + +Sass has two syntaxes. The new main syntax (as of Sass 3) +is known as "SCSS" (for "Sassy CSS"), +and is a superset of CSS's syntax. +This means that every valid CSS stylesheet is valid SCSS as well. +SCSS files use the extension `.scss`. + +The second, older syntax is known as the indented syntax (or just "Sass"). +Inspired by Haml's terseness, it's intended for people +who prefer conciseness over similarity to CSS. +Instead of brackets and semicolons, +it uses the indentation of lines to specify blocks. +Although no longer the primary syntax, +the indented syntax will continue to be supported. +Files in the indented syntax use the extension `.sass`. + +## Using + +Sass can be used from the command line +or as part of a web framework. +The first step is to install the gem: + + gem install sass + +After you convert some CSS to Sass, you can run + + sass style.scss + +to compile it back to CSS. +For more information on these commands, check out + + sass --help + +To install Sass in Rails 2, +just add `config.gem "sass"` to `config/environment.rb`. +In Rails 3, add `gem "sass"` to your Gemfile instead. +`.sass` or `.scss` files should be placed in `public/stylesheets/sass`, +where they'll be automatically compiled +to corresponding CSS files in `public/stylesheets` when needed +(the Sass template directory is customizable... +see [the Sass reference](https://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#template_location-option) for details). + +Sass can also be used with any Rack-enabled web framework. +To do so, just add + +```ruby +require 'sass/plugin/rack' +use Sass::Plugin::Rack +``` + +to `config.ru`. +Then any Sass files in `public/stylesheets/sass` +will be compiled into CSS files in `public/stylesheets` on every request. + +To use Sass programmatically, +check out the [YARD documentation](https://sass-lang.com/documentation/file.SASS_REFERENCE.html#using_sass). + +## Formatting + +Sass is an extension of CSS +that adds power and elegance to the basic language. +It allows you to use [variables][vars], [nested rules][nested], +[mixins][mixins], [inline imports][imports], +and more, all with a fully CSS-compatible syntax. +Sass helps keep large stylesheets well-organized, +and get small stylesheets up and running quickly, +particularly with the help of +[the Compass style library](http://compass-style.org). + +[vars]: https://sass-lang.com/documentation/file.SASS_REFERENCE.html#variables_ +[nested]: https://sass-lang.com/documentation/file.SASS_REFERENCE.html#nested_rules +[mixins]: https://sass-lang.com/documentation/file.SASS_REFERENCE.html#mixins +[imports]: https://sass-lang.com/documentation/file.SASS_REFERENCE.html#import + +Sass has two syntaxes. +The one presented here, known as "SCSS" (for "Sassy CSS"), +is fully CSS-compatible. +The other (older) syntax, known as the indented syntax or just "Sass", +is whitespace-sensitive and indentation-based. +For more information, see the [reference documentation][syntax]. + +[syntax]: https://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax + +To run the following examples and see the CSS they produce, +put them in a file called `test.scss` and run `sass test.scss`. + +### Nesting + +Sass avoids repetition by nesting selectors within one another. +The same thing works for properties. + +```scss +table.hl { + margin: 2em 0; + td.ln { text-align: right; } +} + +li { + font: { + family: serif; + weight: bold; + size: 1.2em; + } +} +``` + +### Variables + +Use the same color all over the place? +Need to do some math with height and width and text size? +Sass supports variables, math operations, and many useful functions. + +```scss +$blue: #3bbfce; +$margin: 16px; + +.content_navigation { + border-color: $blue; + color: darken($blue, 10%); +} + +.border { + padding: $margin / 2; + margin: $margin / 2; + border-color: $blue; +} +``` + +### Mixins + +Even more powerful than variables, +mixins allow you to re-use whole chunks of CSS, +properties or selectors. +You can even give them arguments. + +```scss +@mixin table-scaffolding { + th { + text-align: center; + font-weight: bold; + } + td, th { padding: 2px; } +} + +@mixin left($dist) { + float: left; + margin-left: $dist; +} + +#data { + @include left(10px); + @include table-scaffolding; +} +``` + +A comprehensive list of features is available +in the [Sass reference](https://sass-lang.com/documentation/file.SASS_REFERENCE.html). + +## Executables + +The Sass gem includes several executables that are useful +for dealing with Sass from the command line. + +### `sass` + +The `sass` executable transforms a source Sass file into CSS. +See `sass --help` for further information and options. + +### `sass-convert` + +The `sass-convert` executable converts between CSS, Sass, and SCSS. +When converting from CSS to Sass or SCSS, +nesting is applied where appropriate. +See `sass-convert --help` for further information and options. + +### Running locally + +To run the Sass executables from a source checkout instead of from rubygems: + +``` +$ cd sass +$ bundle +$ bundle exec sass ... +$ bundle exec scss ... +$ bundle exec sass-convert ... +``` + +## Authors + +Sass was envisioned by [Hampton Catlin](http://www.hamptoncatlin.com) +(@hcatlin). However, Hampton doesn't even know his way around the code anymore +and now occasionally consults on the language issues. Hampton lives in San +Francisco, California and works as VP of Technology +at [Moovweb](http://www.moovweb.com/). + +[Natalie Weizenbaum](https://twitter.com/nex3) is the primary developer and +architect of Sass. Her hard work has kept the project alive by endlessly +answering forum posts, fixing bugs, refactoring, finding speed improvements, +writing documentation, implementing new features, and designing the language. +Natalie lives in Seattle, Washington and works on [Dart](http://dartlang.org) +application libraries at Google. + +[Chris Eppstein](http://twitter.com/chriseppstein) is a core contributor to +Sass and the creator of [Compass](http://compass-style.org/), the first Sass-based framework, and +[Eyeglass](http://github.com/sass-eyeglass/eyeglass), a node-sass plugin ecosystem for NPM. Chris focuses +on making Sass more powerful, easy to use, and on ways to speed its adoption +through the web development community. Chris lives in San Jose, California with +his wife and two children. He is an Engineer for +[LinkedIn.com](http://linkedin.com), where his primary responsibility is to +maintain Sass and many other Sass-related open source projects. + +If you use this software, we'd be truly honored if you'd make a +tax-deductible donation to a non-profit organization and then +[let us know on twitter](http://twitter.com/SassCSS), so that we can +thank you. Here's a few that we endorse: + +* [Trans Justice Funding Project](http://www.transjusticefundingproject.org/) +* [United Mitochondrial Disease Foundation](http://umdf.org/compass) +* [Girl Develop It](https://www.girldevelopit.com/donate) + +Sass is licensed under the MIT License. diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/REVISION b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/REVISION new file mode 100644 index 000000000000..54798d678b4b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/REVISION @@ -0,0 +1 @@ +(release) diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/VERSION b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/VERSION new file mode 100644 index 000000000000..0833a98f1405 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/VERSION @@ -0,0 +1 @@ +3.7.4 diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/VERSION_DATE b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/VERSION_DATE new file mode 100644 index 000000000000..ad0300ccef58 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/VERSION_DATE @@ -0,0 +1 @@ +04 April 2019 00:49:58 UTC diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/VERSION_NAME b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/VERSION_NAME new file mode 100644 index 000000000000..ee5e396d755f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/VERSION_NAME @@ -0,0 +1 @@ +Bleeding Edge diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/bin/sass b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/bin/sass new file mode 100644 index 000000000000..62d6d0c9f590 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/bin/sass @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby +# The command line Sass parser. + +THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__ +begin + require File.dirname(THIS_FILE) + '/../lib/sass' +rescue LoadError + require 'sass' +end +require 'sass/exec' + +opts = Sass::Exec::SassScss.new(ARGV, :sass) +opts.parse! diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/bin/sass-convert b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/bin/sass-convert new file mode 100644 index 000000000000..b27625311b8f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/bin/sass-convert @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby + +THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__ +begin + require File.dirname(THIS_FILE) + '/../lib/sass' +rescue LoadError + require 'sass' +end +require 'sass/exec' + +opts = Sass::Exec::SassConvert.new(ARGV) +opts.parse! diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/bin/scss b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/bin/scss new file mode 100644 index 000000000000..ce3c4ad09022 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/bin/scss @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby +# The command line Sass parser. + +THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__ +begin + require File.dirname(THIS_FILE) + '/../lib/sass' +rescue LoadError + require 'sass' +end +require 'sass/exec' + +opts = Sass::Exec::SassScss.new(ARGV, :scss) +opts.parse! diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/extra/sass-spec-ref.sh b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/extra/sass-spec-ref.sh new file mode 100644 index 000000000000..5e0f885d717b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/extra/sass-spec-ref.sh @@ -0,0 +1,40 @@ +#!/bin/bash -e +# Copyright 2016 Google Inc. Use of this source code is governed by an MIT-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/MIT. + +# Echoes the sass-spec Git ref that should be checked out for the current Travis +# run. If we're running specs for a pull request which refers to a sass-spec +# pull request, we'll run against the latter rather than sass-spec master. + +default=master + +if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then + >&2 echo "TRAVIS_PULL_REQUEST: $TRAVIS_PULL_REQUEST." + >&2 echo "Ref: $default." + echo "$default" + exit 0 +fi + +>&2 echo "Fetching pull request $TRAVIS_PULL_REQUEST..." + +url=https://api.github.com/repos/sass/ruby-sass/pulls/$TRAVIS_PULL_REQUEST +if [ -z "$GITHUB_AUTH" ]; then + >&2 echo "Fetching pull request info without authentication" + JSON=$(curl -L -sS $url) +else + >&2 echo "Fetching pull request info as sassbot" + JSON=$(curl -u "sassbot:$GITHUB_AUTH" -L -sS $url) +fi +>&2 echo "$JSON" + +RE_SPEC_PR="sass\/sass-spec(#|\/pull\/)([0-9]+)" + +if [[ $JSON =~ $RE_SPEC_PR ]]; then + ref="pull/${BASH_REMATCH[2]}/head" + >&2 echo "Ref: $ref." + echo "$ref" +else + >&2 echo "Ref: $default." + echo "$default" +fi diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/extra/update_watch.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/extra/update_watch.rb new file mode 100644 index 000000000000..dc90685becd9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/extra/update_watch.rb @@ -0,0 +1,13 @@ +require 'rubygems' +require 'sinatra' +require 'json' +set :port, 3124 +set :environment, :production +enable :lock +Dir.chdir(File.dirname(__FILE__) + "/..") + +post "/" do + puts "Received payload!" + puts "Rev: #{`git name-rev HEAD`.strip}" + system %{rake handle_update --trace REF=#{JSON.parse(params["payload"])["ref"].inspect}} +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/init.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/init.rb new file mode 100644 index 000000000000..5a3bceb4a46f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/init.rb @@ -0,0 +1,18 @@ +begin + require File.join(File.dirname(__FILE__), 'lib', 'sass') # From here +rescue LoadError + begin + require 'sass' # From gem + rescue LoadError => e + # gems:install may be run to install Haml with the skeleton plugin + # but not the gem itself installed. + # Don't die if this is the case. + raise e unless defined?(Rake) && + (Rake.application.top_level_tasks.include?('gems') || + Rake.application.top_level_tasks.include?('gems:install')) + end +end + +# Load Sass. +# Sass may be undefined if we're running gems:install. +require 'sass/plugin' if defined?(Sass) diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass.rb new file mode 100644 index 000000000000..a569bc3b0c77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass.rb @@ -0,0 +1,102 @@ +dir = File.dirname(__FILE__) +$LOAD_PATH.unshift dir unless $LOAD_PATH.include?(dir) + +require 'sass/version' + +# The module that contains everything Sass-related: +# +# * {Sass::Engine} is the class used to render Sass/SCSS within Ruby code. +# * {Sass::Plugin} is interfaces with web frameworks (Rails and Merb in particular). +# * {Sass::SyntaxError} is raised when Sass encounters an error. +# * {Sass::CSS} handles conversion of CSS to Sass. +# +# Also see the {file:SASS_REFERENCE.md full Sass reference}. +module Sass + class << self + # @private + attr_accessor :tests_running + end + + # The global load paths for Sass files. This is meant for plugins and + # libraries to register the paths to their Sass stylesheets to that they may + # be `@imported`. This load path is used by every instance of {Sass::Engine}. + # They are lower-precedence than any load paths passed in via the + # {file:SASS_REFERENCE.md#load_paths-option `:load_paths` option}. + # + # If the `SASS_PATH` environment variable is set, + # the initial value of `load_paths` will be initialized based on that. + # The variable should be a colon-separated list of path names + # (semicolon-separated on Windows). + # + # Note that files on the global load path are never compiled to CSS + # themselves, even if they aren't partials. They exist only to be imported. + # + # @example + # Sass.load_paths << File.dirname(__FILE__ + '/sass') + # @return [Array<String, Pathname, Sass::Importers::Base>] + def self.load_paths + @load_paths ||= if ENV['SASS_PATH'] + ENV['SASS_PATH'].split(Sass::Util.windows? ? ';' : ':') + else + [] + end + end + + # Compile a Sass or SCSS string to CSS. + # Defaults to SCSS. + # + # @param contents [String] The contents of the Sass file. + # @param options [{Symbol => Object}] An options hash; + # see {file:SASS_REFERENCE.md#Options the Sass options documentation} + # @raise [Sass::SyntaxError] if there's an error in the document + # @raise [Encoding::UndefinedConversionError] if the source encoding + # cannot be converted to UTF-8 + # @raise [ArgumentError] if the document uses an unknown encoding with `@charset` + def self.compile(contents, options = {}) + options[:syntax] ||= :scss + Engine.new(contents, options).to_css + end + + # Compile a file on disk to CSS. + # + # @raise [Sass::SyntaxError] if there's an error in the document + # @raise [Encoding::UndefinedConversionError] if the source encoding + # cannot be converted to UTF-8 + # @raise [ArgumentError] if the document uses an unknown encoding with `@charset` + # + # @overload compile_file(filename, options = {}) + # Return the compiled CSS rather than writing it to a file. + # + # @param filename [String] The path to the Sass, SCSS, or CSS file on disk. + # @param options [{Symbol => Object}] An options hash; + # see {file:SASS_REFERENCE.md#Options the Sass options documentation} + # @return [String] The compiled CSS. + # + # @overload compile_file(filename, css_filename, options = {}) + # Write the compiled CSS to a file. + # + # @param filename [String] The path to the Sass, SCSS, or CSS file on disk. + # @param options [{Symbol => Object}] An options hash; + # see {file:SASS_REFERENCE.md#Options the Sass options documentation} + # @param css_filename [String] The location to which to write the compiled CSS. + def self.compile_file(filename, *args) + options = args.last.is_a?(Hash) ? args.pop : {} + css_filename = args.shift + result = Sass::Engine.for_file(filename, options).render + if css_filename + options[:css_filename] ||= css_filename + open(css_filename, "w") {|css_file| css_file.write(result)} + nil + else + result + end + end +end + +require 'sass/logger' +require 'sass/util' + +require 'sass/engine' +require 'sass/plugin' if defined?(Merb::Plugins) +require 'sass/railtie' +require 'sass/features' diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores.rb new file mode 100644 index 000000000000..62259b3281a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores.rb @@ -0,0 +1,15 @@ +require 'stringio' + +module Sass + # Sass cache stores are in charge of storing cached information, + # especially parse trees for Sass documents. + # + # User-created importers must inherit from {CacheStores::Base}. + module CacheStores + end +end + +require 'sass/cache_stores/base' +require 'sass/cache_stores/filesystem' +require 'sass/cache_stores/memory' +require 'sass/cache_stores/chain' diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/base.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/base.rb new file mode 100644 index 000000000000..e239666d1d05 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/base.rb @@ -0,0 +1,88 @@ +module Sass + module CacheStores + # An abstract base class for backends for the Sass cache. + # Any key-value store can act as such a backend; + # it just needs to implement the + # \{#_store} and \{#_retrieve} methods. + # + # To use a cache store with Sass, + # use the {file:SASS_REFERENCE.md#cache_store-option `:cache_store` option}. + # + # @abstract + class Base + # Store cached contents for later retrieval + # Must be implemented by all CacheStore subclasses + # + # Note: cache contents contain binary data. + # + # @param key [String] The key to store the contents under + # @param version [String] The current sass version. + # Cached contents must not be retrieved across different versions of sass. + # @param sha [String] The sha of the sass source. + # Cached contents must not be retrieved if the sha has changed. + # @param contents [String] The contents to store. + def _store(key, version, sha, contents) + raise "#{self.class} must implement #_store." + end + + # Retrieved cached contents. + # Must be implemented by all subclasses. + # + # Note: if the key exists but the sha or version have changed, + # then the key may be deleted by the cache store, if it wants to do so. + # + # @param key [String] The key to retrieve + # @param version [String] The current sass version. + # Cached contents must not be retrieved across different versions of sass. + # @param sha [String] The sha of the sass source. + # Cached contents must not be retrieved if the sha has changed. + # @return [String] The contents that were previously stored. + # @return [NilClass] when the cache key is not found or the version or sha have changed. + def _retrieve(key, version, sha) + raise "#{self.class} must implement #_retrieve." + end + + # Store a {Sass::Tree::RootNode}. + # + # @param key [String] The key to store it under. + # @param sha [String] The checksum for the contents that are being stored. + # @param root [Object] The root node to cache. + def store(key, sha, root) + _store(key, Sass::VERSION, sha, Marshal.dump(root)) + rescue TypeError, LoadError => e + Sass::Util.sass_warn "Warning. Error encountered while saving cache #{path_to(key)}: #{e}" + nil + end + + # Retrieve a {Sass::Tree::RootNode}. + # + # @param key [String] The key the root element was stored under. + # @param sha [String] The checksum of the root element's content. + # @return [Object] The cached object. + def retrieve(key, sha) + contents = _retrieve(key, Sass::VERSION, sha) + Marshal.load(contents) if contents + rescue EOFError, TypeError, ArgumentError, LoadError => e + Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}" + nil + end + + # Return the key for the sass file. + # + # The `(sass_dirname, sass_basename)` pair + # should uniquely identify the Sass document, + # but otherwise there are no restrictions on their content. + # + # @param sass_dirname [String] + # The fully-expanded location of the Sass file. + # This corresponds to the directory name on a filesystem. + # @param sass_basename [String] The name of the Sass file that is being referenced. + # This corresponds to the basename on a filesystem. + def key(sass_dirname, sass_basename) + dir = Digest::SHA1.hexdigest(sass_dirname) + filename = "#{sass_basename}c" + "#{dir}/#{filename}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/chain.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/chain.rb new file mode 100644 index 000000000000..914c1117c87d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/chain.rb @@ -0,0 +1,34 @@ +module Sass + module CacheStores + # A meta-cache that chains multiple caches together. + # Specifically: + # + # * All `#store`s are passed to all caches. + # * `#retrieve`s are passed to each cache until one has a hit. + # * When one cache has a hit, the value is `#store`d in all earlier caches. + class Chain < Base + # Create a new cache chaining the given caches. + # + # @param caches [Array<Sass::CacheStores::Base>] The caches to chain. + def initialize(*caches) + @caches = caches + end + + # @see Base#store + def store(key, sha, obj) + @caches.each {|c| c.store(key, sha, obj)} + end + + # @see Base#retrieve + def retrieve(key, sha) + @caches.each_with_index do |c, i| + obj = c.retrieve(key, sha) + next unless obj + @caches[0...i].each {|prev| prev.store(key, sha, obj)} + return obj + end + nil + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/filesystem.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/filesystem.rb new file mode 100644 index 000000000000..140f5f1c3e3f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/filesystem.rb @@ -0,0 +1,60 @@ +require 'fileutils' + +module Sass + module CacheStores + # A backend for the Sass cache using the filesystem. + class Filesystem < Base + # The directory where the cached files will be stored. + # + # @return [String] + attr_accessor :cache_location + + # @param cache_location [String] see \{#cache\_location} + def initialize(cache_location) + @cache_location = cache_location + end + + # @see Base#\_retrieve + def _retrieve(key, version, sha) + return unless File.readable?(path_to(key)) + begin + File.open(path_to(key), "rb") do |f| + if f.readline("\n").strip == version && f.readline("\n").strip == sha + return f.read + end + end + File.unlink path_to(key) + rescue Errno::ENOENT + # Already deleted. Race condition? + end + nil + rescue EOFError, TypeError, ArgumentError => e + Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}" + end + + # @see Base#\_store + def _store(key, version, sha, contents) + compiled_filename = path_to(key) + FileUtils.mkdir_p(File.dirname(compiled_filename)) + Sass::Util.atomic_create_and_write_file(compiled_filename) do |f| + f.puts(version) + f.puts(sha) + f.write(contents) + end + rescue Errno::EACCES + # pass + end + + private + + # Returns the path to a file for the given key. + # + # @param key [String] + # @return [String] The path to the cache file. + def path_to(key) + key = key.gsub(/[<>:\\|?*%]/) {|c| "%%%03d" % c.ord} + File.join(cache_location, key) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/memory.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/memory.rb new file mode 100644 index 000000000000..ccf64beaab6d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/memory.rb @@ -0,0 +1,46 @@ +module Sass + module CacheStores + # A backend for the Sass cache using in-process memory. + class Memory < Base + # Since the {Memory} store is stored in the Sass tree's options hash, + # when the options get serialized as part of serializing the tree, + # you get crazy exponential growth in the size of the cached objects + # unless you don't dump the cache. + # + # @private + def _dump(depth) + "" + end + + # If we deserialize this class, just make a new empty one. + # + # @private + def self._load(repr) + Memory.new + end + + # Create a new, empty cache store. + def initialize + @contents = {} + end + + # @see Base#retrieve + def retrieve(key, sha) + return unless @contents.has_key?(key) + return unless @contents[key][:sha] == sha + obj = @contents[key][:obj] + obj.respond_to?(:deep_copy) ? obj.deep_copy : obj.dup + end + + # @see Base#store + def store(key, sha, obj) + @contents[key] = {:sha => sha, :obj => obj} + end + + # Destructively clear the cache. + def reset! + @contents = {} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/null.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/null.rb new file mode 100644 index 000000000000..f14f4c7ed5b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/cache_stores/null.rb @@ -0,0 +1,25 @@ +module Sass + module CacheStores + # Doesn't store anything, but records what things it should have stored. + # This doesn't currently have any use except for testing and debugging. + # + # @private + class Null < Base + def initialize + @keys = {} + end + + def _retrieve(key, version, sha) + nil + end + + def _store(key, version, sha, contents) + @keys[key] = true + end + + def was_set?(key) + @keys[key] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/callbacks.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/callbacks.rb new file mode 100644 index 000000000000..a33a50903459 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/callbacks.rb @@ -0,0 +1,67 @@ +module Sass + # A lightweight infrastructure for defining and running callbacks. + # Callbacks are defined using \{#define\_callback\} at the class level, + # and called using `run_#{name}` at the instance level. + # + # Clients can add callbacks by calling the generated `on_#{name}` method, + # and passing in a block that's run when the callback is activated. + # + # @example Define a callback + # class Munger + # extend Sass::Callbacks + # define_callback :string_munged + # + # def munge(str) + # res = str.gsub(/[a-z]/, '\1\1') + # run_string_munged str, res + # res + # end + # end + # + # @example Use a callback + # m = Munger.new + # m.on_string_munged {|str, res| puts "#{str} was munged into #{res}!"} + # m.munge "bar" #=> bar was munged into bbaarr! + module Callbacks + # Automatically includes {InstanceMethods} + # when something extends this module. + # + # @param base [Module] + def self.extended(base) + base.send(:include, InstanceMethods) + end + + protected + + module InstanceMethods + # Removes all callbacks registered against this object. + def clear_callbacks! + @_sass_callbacks = {} + end + end + + # Define a callback with the given name. + # This will define an `on_#{name}` method + # that registers a block, + # and a `run_#{name}` method that runs that block + # (optionall with some arguments). + # + # @param name [Symbol] The name of the callback + # @return [void] + def define_callback(name) + class_eval <<RUBY, __FILE__, __LINE__ + 1 +def on_#{name}(&block) + @_sass_callbacks = {} unless defined? @_sass_callbacks + (@_sass_callbacks[#{name.inspect}] ||= []) << block +end + +def run_#{name}(*args) + return unless defined? @_sass_callbacks + return unless @_sass_callbacks[#{name.inspect}] + @_sass_callbacks[#{name.inspect}].each {|c| c[*args]} +end +private :run_#{name} +RUBY + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/css.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/css.rb new file mode 100644 index 000000000000..47928bd1fdf0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/css.rb @@ -0,0 +1,407 @@ +require File.dirname(__FILE__) + '/../sass' +require 'sass/tree/node' +require 'sass/scss/css_parser' + +module Sass + # This class converts CSS documents into Sass or SCSS templates. + # It works by parsing the CSS document into a {Sass::Tree} structure, + # and then applying various transformations to the structure + # to produce more concise and idiomatic Sass/SCSS. + # + # Example usage: + # + # Sass::CSS.new("p { color: blue }").render(:sass) #=> "p\n color: blue" + # Sass::CSS.new("p { color: blue }").render(:scss) #=> "p {\n color: blue; }" + class CSS + # @param template [String] The CSS stylesheet. + # This stylesheet can be encoded using any encoding + # that can be converted to Unicode. + # If the stylesheet contains an `@charset` declaration, + # that overrides the Ruby encoding + # (see {file:SASS_REFERENCE.md#Encodings the encoding documentation}) + # @option options :old [Boolean] (false) + # Whether or not to output old property syntax + # (`:color blue` as opposed to `color: blue`). + # This is only meaningful when generating Sass code, + # rather than SCSS. + # @option options :indent [String] (" ") + # The string to use for indenting each line. Defaults to two spaces. + def initialize(template, options = {}) + if template.is_a? IO + template = template.read + end + + @options = options.merge(:_convert => true) + # Backwards compatibility + @options[:old] = true if @options[:alternate] == false + @template = template + @checked_encoding = false + end + + # Converts the CSS template into Sass or SCSS code. + # + # @param fmt [Symbol] `:sass` or `:scss`, designating the format to return. + # @return [String] The resulting Sass or SCSS code + # @raise [Sass::SyntaxError] if there's an error parsing the CSS template + def render(fmt = :sass) + check_encoding! + build_tree.send("to_#{fmt}", @options).strip + "\n" + rescue Sass::SyntaxError => err + err.modify_backtrace(:filename => @options[:filename] || '(css)') + raise err + end + + # Returns the original encoding of the document. + # + # @return [Encoding, nil] + # @raise [Encoding::UndefinedConversionError] if the source encoding + # cannot be converted to UTF-8 + # @raise [ArgumentError] if the document uses an unknown encoding with `@charset` + def source_encoding + check_encoding! + @original_encoding + end + + private + + def check_encoding! + return if @checked_encoding + @checked_encoding = true + @template, @original_encoding = Sass::Util.check_sass_encoding(@template) + end + + # Parses the CSS template and applies various transformations + # + # @return [Tree::Node] The root node of the parsed tree + def build_tree + root = Sass::SCSS::CssParser.new(@template, @options[:filename], nil).parse + parse_selectors(root) + expand_commas(root) + nest_seqs(root) + parent_ref_rules(root) + flatten_rules(root) + bubble_subject(root) + fold_commas(root) + dump_selectors(root) + root + end + + # Parse all the selectors in the document and assign them to + # {Sass::Tree::RuleNode#parsed_rules}. + # + # @param root [Tree::Node] The parent node + def parse_selectors(root) + root.children.each do |child| + next parse_selectors(child) if child.is_a?(Tree::DirectiveNode) + next unless child.is_a?(Tree::RuleNode) + parser = Sass::SCSS::CssParser.new(child.rule.first, child.filename, nil, child.line) + child.parsed_rules = parser.parse_selector + end + end + + # Transform + # + # foo, bar, baz + # color: blue + # + # into + # + # foo + # color: blue + # bar + # color: blue + # baz + # color: blue + # + # @param root [Tree::Node] The parent node + def expand_commas(root) + root.children.map! do |child| + # child.parsed_rules.members.size > 1 iff the rule contains a comma + unless child.is_a?(Tree::RuleNode) && child.parsed_rules.members.size > 1 + expand_commas(child) if child.is_a?(Tree::DirectiveNode) + next child + end + child.parsed_rules.members.map do |seq| + node = Tree::RuleNode.new([]) + node.parsed_rules = make_cseq(seq) + node.children = child.children + node + end + end + root.children.flatten! + end + + # Make rules use nesting so that + # + # foo + # color: green + # foo bar + # color: red + # foo baz + # color: blue + # + # becomes + # + # foo + # color: green + # bar + # color: red + # baz + # color: blue + # + # @param root [Tree::Node] The parent node + def nest_seqs(root) + current_rule = nil + root.children.map! do |child| + unless child.is_a?(Tree::RuleNode) + nest_seqs(child) if child.is_a?(Tree::DirectiveNode) + next child + end + + seq = first_seq(child) + seq.members.reject! {|sseq| sseq == "\n"} + first, rest = seq.members.first, seq.members[1..-1] + + if current_rule.nil? || first_sseq(current_rule) != first + current_rule = Tree::RuleNode.new([]) + current_rule.parsed_rules = make_seq(first) + end + + if rest.empty? + current_rule.children += child.children + else + child.parsed_rules = make_seq(*rest) + current_rule << child + end + + current_rule + end + root.children.compact! + root.children.uniq! + + root.children.each {|v| nest_seqs(v)} + end + + # Make rules use parent refs so that + # + # foo + # color: green + # foo.bar + # color: blue + # + # becomes + # + # foo + # color: green + # &.bar + # color: blue + # + # @param root [Tree::Node] The parent node + def parent_ref_rules(root) + current_rule = nil + root.children.map! do |child| + unless child.is_a?(Tree::RuleNode) + parent_ref_rules(child) if child.is_a?(Tree::DirectiveNode) + next child + end + + sseq = first_sseq(child) + next child unless sseq.is_a?(Sass::Selector::SimpleSequence) + + firsts, rest = [sseq.members.first], sseq.members[1..-1] + firsts.push rest.shift if firsts.first.is_a?(Sass::Selector::Parent) + + last_simple_subject = rest.empty? && sseq.subject? + if current_rule.nil? || first_sseq(current_rule).members != firsts || + !!first_sseq(current_rule).subject? != !!last_simple_subject + current_rule = Tree::RuleNode.new([]) + current_rule.parsed_rules = make_sseq(last_simple_subject, *firsts) + end + + if rest.empty? + current_rule.children += child.children + else + rest.unshift Sass::Selector::Parent.new + child.parsed_rules = make_sseq(sseq.subject?, *rest) + current_rule << child + end + + current_rule + end + root.children.compact! + root.children.uniq! + + root.children.each {|v| parent_ref_rules(v)} + end + + # Flatten rules so that + # + # foo + # bar + # color: red + # + # becomes + # + # foo bar + # color: red + # + # and + # + # foo + # &.bar + # color: blue + # + # becomes + # + # foo.bar + # color: blue + # + # @param root [Tree::Node] The parent node + def flatten_rules(root) + root.children.each do |child| + case child + when Tree::RuleNode + flatten_rule(child) + when Tree::DirectiveNode + flatten_rules(child) + end + end + end + + # Flattens a single rule. + # + # @param rule [Tree::RuleNode] The candidate for flattening + # @see #flatten_rules + def flatten_rule(rule) + while rule.children.size == 1 && rule.children.first.is_a?(Tree::RuleNode) + child = rule.children.first + + if first_simple_sel(child).is_a?(Sass::Selector::Parent) + rule.parsed_rules = child.parsed_rules.resolve_parent_refs(rule.parsed_rules) + else + rule.parsed_rules = make_seq(*(first_seq(rule).members + first_seq(child).members)) + end + + rule.children = child.children + end + + flatten_rules(rule) + end + + def bubble_subject(root) + root.children.each do |child| + bubble_subject(child) if child.is_a?(Tree::RuleNode) || child.is_a?(Tree::DirectiveNode) + next unless child.is_a?(Tree::RuleNode) && !child.children.empty? + next unless child.children.all? do |c| + next unless c.is_a?(Tree::RuleNode) + first_simple_sel(c).is_a?(Sass::Selector::Parent) && first_sseq(c).subject? + end + first_sseq(child).subject = true + child.children.each {|c| first_sseq(c).subject = false} + end + end + + # Transform + # + # foo + # bar + # color: blue + # baz + # color: blue + # + # into + # + # foo + # bar, baz + # color: blue + # + # @param root [Tree::Node] The parent node + def fold_commas(root) + prev_rule = nil + root.children.map! do |child| + unless child.is_a?(Tree::RuleNode) + fold_commas(child) if child.is_a?(Tree::DirectiveNode) + next child + end + + if prev_rule && prev_rule.children.map {|c| c.to_sass} == child.children.map {|c| c.to_sass} + prev_rule.parsed_rules.members << first_seq(child) + next nil + end + + fold_commas(child) + prev_rule = child + child + end + root.children.compact! + end + + # Dump all the parsed {Sass::Tree::RuleNode} selectors to strings. + # + # @param root [Tree::Node] The parent node + def dump_selectors(root) + root.children.each do |child| + next dump_selectors(child) if child.is_a?(Tree::DirectiveNode) + next unless child.is_a?(Tree::RuleNode) + child.rule = [child.parsed_rules.to_s] + dump_selectors(child) + end + end + + # Create a {Sass::Selector::CommaSequence}. + # + # @param seqs [Array<Sass::Selector::Sequence>] + # @return [Sass::Selector::CommaSequence] + def make_cseq(*seqs) + Sass::Selector::CommaSequence.new(seqs) + end + + # Create a {Sass::Selector::CommaSequence} containing only a single + # {Sass::Selector::Sequence}. + # + # @param sseqs [Array<Sass::Selector::Sequence, String>] + # @return [Sass::Selector::CommaSequence] + def make_seq(*sseqs) + make_cseq(Sass::Selector::Sequence.new(sseqs)) + end + + # Create a {Sass::Selector::CommaSequence} containing only a single + # {Sass::Selector::Sequence} which in turn contains only a single + # {Sass::Selector::SimpleSequence}. + # + # @param subject [Boolean] Whether this is a subject selector + # @param sseqs [Array<Sass::Selector::Sequence, String>] + # @return [Sass::Selector::CommaSequence] + def make_sseq(subject, *sseqs) + make_seq(Sass::Selector::SimpleSequence.new(sseqs, subject)) + end + + # Return the first {Sass::Selector::Sequence} in a {Sass::Tree::RuleNode}. + # + # @param rule [Sass::Tree::RuleNode] + # @return [Sass::Selector::Sequence] + def first_seq(rule) + rule.parsed_rules.members.first + end + + # Return the first {Sass::Selector::SimpleSequence} in a + # {Sass::Tree::RuleNode}. + # + # @param rule [Sass::Tree::RuleNode] + # @return [Sass::Selector::SimpleSequence, String] + def first_sseq(rule) + first_seq(rule).members.first + end + + # Return the first {Sass::Selector::Simple} in a {Sass::Tree::RuleNode}, + # unless the rule begins with a combinator. + # + # @param rule [Sass::Tree::RuleNode] + # @return [Sass::Selector::Simple?] + def first_simple_sel(rule) + sseq = first_sseq(rule) + return unless sseq.is_a?(Sass::Selector::SimpleSequence) + sseq.members.first + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/deprecation.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/deprecation.rb new file mode 100644 index 000000000000..16ccacab8db5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/deprecation.rb @@ -0,0 +1,55 @@ +module Sass + # A deprecation warning that should only be printed once for a given line in a + # given file. + # + # A global Deprecation instance should be created for each type of deprecation + # warning, and `warn` should be called each time a warning is needed. + class Deprecation + @@allow_double_warnings = false + + # Runs a block in which double deprecation warnings for the same location + # are allowed. + def self.allow_double_warnings + old_allow_double_warnings = @@allow_double_warnings + @@allow_double_warnings = true + yield + ensure + @@allow_double_warnings = old_allow_double_warnings + end + + def initialize + # A set of filename, line pairs for which warnings have been emitted. + @seen = Set.new + end + + # Prints `message` as a deprecation warning associated with `filename`, + # `line`, and optionally `column`. + # + # This ensures that only one message will be printed for each line of a + # given file. + # + # @overload warn(filename, line, message) + # @param filename [String, nil] + # @param line [Number] + # @param message [String] + # @overload warn(filename, line, column, message) + # @param filename [String, nil] + # @param line [Number] + # @param column [Number] + # @param message [String] + def warn(filename, line, column_or_message, message = nil) + return if !@@allow_double_warnings && @seen.add?([filename, line]).nil? + if message + column = column_or_message + else + message = column_or_message + end + + location = "line #{line}" + location << ", column #{column}" if column + location << " of #{filename}" if filename + + Sass::Util.sass_warn("DEPRECATION WARNING on #{location}:\n#{message}") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/engine.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/engine.rb new file mode 100644 index 000000000000..b777e8add7e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/engine.rb @@ -0,0 +1,1236 @@ +require 'set' +require 'digest/sha1' +require 'sass/cache_stores' +require 'sass/deprecation' +require 'sass/source/position' +require 'sass/source/range' +require 'sass/source/map' +require 'sass/tree/node' +require 'sass/tree/root_node' +require 'sass/tree/rule_node' +require 'sass/tree/comment_node' +require 'sass/tree/prop_node' +require 'sass/tree/directive_node' +require 'sass/tree/media_node' +require 'sass/tree/supports_node' +require 'sass/tree/css_import_node' +require 'sass/tree/variable_node' +require 'sass/tree/mixin_def_node' +require 'sass/tree/mixin_node' +require 'sass/tree/trace_node' +require 'sass/tree/content_node' +require 'sass/tree/function_node' +require 'sass/tree/return_node' +require 'sass/tree/extend_node' +require 'sass/tree/if_node' +require 'sass/tree/while_node' +require 'sass/tree/for_node' +require 'sass/tree/each_node' +require 'sass/tree/debug_node' +require 'sass/tree/warn_node' +require 'sass/tree/import_node' +require 'sass/tree/charset_node' +require 'sass/tree/at_root_node' +require 'sass/tree/keyframe_rule_node' +require 'sass/tree/error_node' +require 'sass/tree/visitors/base' +require 'sass/tree/visitors/perform' +require 'sass/tree/visitors/cssize' +require 'sass/tree/visitors/extend' +require 'sass/tree/visitors/convert' +require 'sass/tree/visitors/to_css' +require 'sass/tree/visitors/deep_copy' +require 'sass/tree/visitors/set_options' +require 'sass/tree/visitors/check_nesting' +require 'sass/selector' +require 'sass/environment' +require 'sass/script' +require 'sass/scss' +require 'sass/stack' +require 'sass/error' +require 'sass/importers' +require 'sass/shared' +require 'sass/media' +require 'sass/supports' + +module Sass + # A Sass mixin or function. + # + # `name`: `String` + # : The name of the mixin/function. + # + # `args`: `Array<(Script::Tree::Node, Script::Tree::Node)>` + # : The arguments for the mixin/function. + # Each element is a tuple containing the variable node of the argument + # and the parse tree for the default value of the argument. + # + # `splat`: `Script::Tree::Node?` + # : The variable node of the splat argument for this callable, or null. + # + # `environment`: {Sass::Environment} + # : The environment in which the mixin/function was defined. + # This is captured so that the mixin/function can have access + # to local variables defined in its scope. + # + # `tree`: `Array<Tree::Node>` + # : The parse tree for the mixin/function. + # + # `has_content`: `Boolean` + # : Whether the callable accepts a content block. + # + # `type`: `String` + # : The user-friendly name of the type of the callable. + # + # `origin`: `Symbol` + # : From whence comes the callable: `:stylesheet`, `:builtin`, `:css` + # A callable with an origin of `:stylesheet` was defined in the stylesheet itself. + # A callable with an origin of `:builtin` was defined in ruby. + # A callable (function) with an origin of `:css` returns a function call with arguments to CSS. + Callable = Struct.new(:name, :args, :splat, :environment, :tree, :has_content, :type, :origin) + + # This class handles the parsing and compilation of the Sass template. + # Example usage: + # + # template = File.read('stylesheets/sassy.sass') + # sass_engine = Sass::Engine.new(template) + # output = sass_engine.render + # puts output + class Engine + @@old_property_deprecation = Deprecation.new + + # A line of Sass code. + # + # `text`: `String` + # : The text in the line, without any whitespace at the beginning or end. + # + # `tabs`: `Integer` + # : The level of indentation of the line. + # + # `index`: `Integer` + # : The line number in the original document. + # + # `offset`: `Integer` + # : The number of bytes in on the line that the text begins. + # This ends up being the number of bytes of leading whitespace. + # + # `filename`: `String` + # : The name of the file in which this line appeared. + # + # `children`: `Array<Line>` + # : The lines nested below this one. + # + # `comment_tab_str`: `String?` + # : The prefix indentation for this comment, if it is a comment. + class Line < Struct.new(:text, :tabs, :index, :offset, :filename, :children, :comment_tab_str) + def comment? + text[0] == COMMENT_CHAR && (text[1] == SASS_COMMENT_CHAR || text[1] == CSS_COMMENT_CHAR) + end + end + + # The character that begins a CSS property. + PROPERTY_CHAR = ?: + + # The character that designates the beginning of a comment, + # either Sass or CSS. + COMMENT_CHAR = ?/ + + # The character that follows the general COMMENT_CHAR and designates a Sass comment, + # which is not output as a CSS comment. + SASS_COMMENT_CHAR = ?/ + + # The character that indicates that a comment allows interpolation + # and should be preserved even in `:compressed` mode. + SASS_LOUD_COMMENT_CHAR = ?! + + # The character that follows the general COMMENT_CHAR and designates a CSS comment, + # which is embedded in the CSS document. + CSS_COMMENT_CHAR = ?* + + # The character used to denote a compiler directive. + DIRECTIVE_CHAR = ?@ + + # Designates a non-parsed rule. + ESCAPE_CHAR = ?\\ + + # Designates block as mixin definition rather than CSS rules to output + MIXIN_DEFINITION_CHAR = ?= + + # Includes named mixin declared using MIXIN_DEFINITION_CHAR + MIXIN_INCLUDE_CHAR = ?+ + + # The regex that matches and extracts data from + # properties of the form `:name prop`. + PROPERTY_OLD = /^:([^\s=:"]+)\s*(?:\s+|$)(.*)/ + + # The default options for Sass::Engine. + # @api public + DEFAULT_OPTIONS = { + :style => :nested, + :load_paths => [], + :cache => true, + :cache_location => './.sass-cache', + :syntax => :sass, + :filesystem_importer => Sass::Importers::Filesystem + }.freeze + + # Converts a Sass options hash into a standard form, filling in + # default values and resolving aliases. + # + # @param options [{Symbol => Object}] The options hash; + # see {file:SASS_REFERENCE.md#Options the Sass options documentation} + # @return [{Symbol => Object}] The normalized options hash. + # @private + def self.normalize_options(options) + options = DEFAULT_OPTIONS.merge(options.reject {|_k, v| v.nil?}) + + # If the `:filename` option is passed in without an importer, + # assume it's using the default filesystem importer. + options[:importer] ||= options[:filesystem_importer].new(".") if options[:filename] + + # Tracks the original filename of the top-level Sass file + options[:original_filename] ||= options[:filename] + + options[:cache_store] ||= Sass::CacheStores::Chain.new( + Sass::CacheStores::Memory.new, Sass::CacheStores::Filesystem.new(options[:cache_location])) + # Support both, because the docs said one and the other actually worked + # for quite a long time. + options[:line_comments] ||= options[:line_numbers] + + options[:load_paths] = (options[:load_paths] + Sass.load_paths).map do |p| + next p unless p.is_a?(String) || (defined?(Pathname) && p.is_a?(Pathname)) + options[:filesystem_importer].new(p.to_s) + end + + # Remove any deprecated importers if the location is imported explicitly + options[:load_paths].reject! do |importer| + importer.is_a?(Sass::Importers::DeprecatedPath) && + options[:load_paths].find do |other_importer| + other_importer.is_a?(Sass::Importers::Filesystem) && + other_importer != importer && + other_importer.root == importer.root + end + end + + # Backwards compatibility + options[:property_syntax] ||= options[:attribute_syntax] + case options[:property_syntax] + when :alternate; options[:property_syntax] = :new + when :normal; options[:property_syntax] = :old + end + options[:sourcemap] = :auto if options[:sourcemap] == true + options[:sourcemap] = :none if options[:sourcemap] == false + + options + end + + # Returns the {Sass::Engine} for the given file. + # This is preferable to Sass::Engine.new when reading from a file + # because it properly sets up the Engine's metadata, + # enables parse-tree caching, + # and infers the syntax from the filename. + # + # @param filename [String] The path to the Sass or SCSS file + # @param options [{Symbol => Object}] The options hash; + # See {file:SASS_REFERENCE.md#Options the Sass options documentation}. + # @return [Sass::Engine] The Engine for the given Sass or SCSS file. + # @raise [Sass::SyntaxError] if there's an error in the document. + def self.for_file(filename, options) + had_syntax = options[:syntax] + + if had_syntax + # Use what was explicitly specified + elsif filename =~ /\.scss$/ + options.merge!(:syntax => :scss) + elsif filename =~ /\.sass$/ + options.merge!(:syntax => :sass) + end + + Sass::Engine.new(File.read(filename), options.merge(:filename => filename)) + end + + # The options for the Sass engine. + # See {file:SASS_REFERENCE.md#Options the Sass options documentation}. + # + # @return [{Symbol => Object}] + attr_reader :options + + # Creates a new Engine. Note that Engine should only be used directly + # when compiling in-memory Sass code. + # If you're compiling a single Sass file from the filesystem, + # use \{Sass::Engine.for\_file}. + # If you're compiling multiple files from the filesystem, + # use {Sass::Plugin}. + # + # @param template [String] The Sass template. + # This template can be encoded using any encoding + # that can be converted to Unicode. + # If the template contains an `@charset` declaration, + # that overrides the Ruby encoding + # (see {file:SASS_REFERENCE.md#Encodings the encoding documentation}) + # @param options [{Symbol => Object}] An options hash. + # See {file:SASS_REFERENCE.md#Options the Sass options documentation}. + # @see {Sass::Engine.for_file} + # @see {Sass::Plugin} + def initialize(template, options = {}) + @options = self.class.normalize_options(options) + @template = template + @checked_encoding = false + @filename = nil + @line = nil + end + + # Render the template to CSS. + # + # @return [String] The CSS + # @raise [Sass::SyntaxError] if there's an error in the document + # @raise [Encoding::UndefinedConversionError] if the source encoding + # cannot be converted to UTF-8 + # @raise [ArgumentError] if the document uses an unknown encoding with `@charset` + def render + return _to_tree.render unless @options[:quiet] + Sass::Util.silence_sass_warnings {_to_tree.render} + end + + # Render the template to CSS and return the source map. + # + # @param sourcemap_uri [String] The sourcemap URI to use in the + # `@sourceMappingURL` comment. If this is relative, it should be relative + # to the location of the CSS file. + # @return [(String, Sass::Source::Map)] The rendered CSS and the associated + # source map + # @raise [Sass::SyntaxError] if there's an error in the document, or if the + # public URL for this document couldn't be determined. + # @raise [Encoding::UndefinedConversionError] if the source encoding + # cannot be converted to UTF-8 + # @raise [ArgumentError] if the document uses an unknown encoding with `@charset` + def render_with_sourcemap(sourcemap_uri) + return _render_with_sourcemap(sourcemap_uri) unless @options[:quiet] + Sass::Util.silence_sass_warnings {_render_with_sourcemap(sourcemap_uri)} + end + + alias_method :to_css, :render + + # Parses the document into its parse tree. Memoized. + # + # @return [Sass::Tree::Node] The root of the parse tree. + # @raise [Sass::SyntaxError] if there's an error in the document + def to_tree + @tree ||= if @options[:quiet] + Sass::Util.silence_sass_warnings {_to_tree} + else + _to_tree + end + end + + # Returns the original encoding of the document. + # + # @return [Encoding, nil] + # @raise [Encoding::UndefinedConversionError] if the source encoding + # cannot be converted to UTF-8 + # @raise [ArgumentError] if the document uses an unknown encoding with `@charset` + def source_encoding + check_encoding! + @source_encoding + end + + # Gets a set of all the documents + # that are (transitive) dependencies of this document, + # not including the document itself. + # + # @return [[Sass::Engine]] The dependency documents. + def dependencies + _dependencies(Set.new, engines = Set.new) + Sass::Util.array_minus(engines, [self]) + end + + # Helper for \{#dependencies}. + # + # @private + def _dependencies(seen, engines) + key = [@options[:filename], @options[:importer]] + return if seen.include?(key) + seen << key + engines << self + to_tree.grep(Tree::ImportNode) do |n| + next if n.css_import? + n.imported_file._dependencies(seen, engines) + end + end + + private + + def _render_with_sourcemap(sourcemap_uri) + filename = @options[:filename] + importer = @options[:importer] + sourcemap_dir = @options[:sourcemap_filename] && + File.dirname(File.expand_path(@options[:sourcemap_filename])) + if filename.nil? + raise Sass::SyntaxError.new(<<ERR) +Error generating source map: couldn't determine public URL for the source stylesheet. + No filename is available so there's nothing for the source map to link to. +ERR + elsif importer.nil? + raise Sass::SyntaxError.new(<<ERR) +Error generating source map: couldn't determine public URL for "#{filename}". + Without a public URL, there's nothing for the source map to link to. + An importer was not set for this file. +ERR + elsif Sass::Util.silence_sass_warnings do + sourcemap_dir = nil if @options[:sourcemap] == :file + importer.public_url(filename, sourcemap_dir).nil? + end + raise Sass::SyntaxError.new(<<ERR) +Error generating source map: couldn't determine public URL for "#{filename}". + Without a public URL, there's nothing for the source map to link to. + Custom importers should define the #public_url method. +ERR + end + + rendered, sourcemap = _to_tree.render_with_sourcemap + compressed = @options[:style] == :compressed + rendered << "\n" if rendered[-1] != ?\n + rendered << "\n" unless compressed + rendered << "/*# sourceMappingURL=" + rendered << URI::DEFAULT_PARSER.escape(sourcemap_uri) + rendered << " */\n" + return rendered, sourcemap + end + + def _to_tree + check_encoding! + + if (@options[:cache] || @options[:read_cache]) && + @options[:filename] && @options[:importer] + key = sassc_key + sha = Digest::SHA1.hexdigest(@template) + + if (root = @options[:cache_store].retrieve(key, sha)) + root.options = @options + return root + end + end + + if @options[:syntax] == :scss + root = Sass::SCSS::Parser.new(@template, @options[:filename], @options[:importer]).parse + else + root = Tree::RootNode.new(@template) + append_children(root, tree(tabulate(@template)).first, true) + end + + root.options = @options + if @options[:cache] && key && sha + begin + old_options = root.options + root.options = {} + @options[:cache_store].store(key, sha, root) + ensure + root.options = old_options + end + end + root + rescue SyntaxError => e + e.modify_backtrace(:filename => @options[:filename], :line => @line) + e.sass_template = @template + raise e + end + + def sassc_key + @options[:cache_store].key(*@options[:importer].key(@options[:filename], @options)) + end + + def check_encoding! + return if @checked_encoding + @checked_encoding = true + @template, @source_encoding = Sass::Util.check_sass_encoding(@template) + end + + def tabulate(string) + tab_str = nil + comment_tab_str = nil + first = true + lines = [] + string.scan(/^[^\n]*?$/).each_with_index do |line, index| + index += (@options[:line] || 1) + if line.strip.empty? + lines.last.text << "\n" if lines.last && lines.last.comment? + next + end + + line_tab_str = line[/^\s*/] + unless line_tab_str.empty? + if tab_str.nil? + comment_tab_str ||= line_tab_str + next if try_comment(line, lines.last, "", comment_tab_str, index) + comment_tab_str = nil + end + + tab_str ||= line_tab_str + + raise SyntaxError.new("Indenting at the beginning of the document is illegal.", + :line => index) if first + + raise SyntaxError.new("Indentation can't use both tabs and spaces.", + :line => index) if tab_str.include?(?\s) && tab_str.include?(?\t) + end + first &&= !tab_str.nil? + if tab_str.nil? + lines << Line.new(line.strip, 0, index, 0, @options[:filename], []) + next + end + + comment_tab_str ||= line_tab_str + if try_comment(line, lines.last, tab_str * lines.last.tabs, comment_tab_str, index) + next + else + comment_tab_str = nil + end + + line_tabs = line_tab_str.scan(tab_str).size + if tab_str * line_tabs != line_tab_str + message = <<END.strip.tr("\n", ' ') +Inconsistent indentation: #{Sass::Shared.human_indentation line_tab_str, true} used for indentation, +but the rest of the document was indented using #{Sass::Shared.human_indentation tab_str}. +END + raise SyntaxError.new(message, :line => index) + end + + lines << Line.new(line.strip, line_tabs, index, line_tab_str.size, @options[:filename], []) + end + lines + end + + def try_comment(line, last, tab_str, comment_tab_str, index) + return unless last && last.comment? + # Nested comment stuff must be at least one whitespace char deeper + # than the normal indentation + return unless line =~ /^#{tab_str}\s/ + unless line =~ /^(?:#{comment_tab_str})(.*)$/ + raise SyntaxError.new(<<MSG.strip.tr("\n", " "), :line => index) +Inconsistent indentation: +previous line was indented by #{Sass::Shared.human_indentation comment_tab_str}, +but this line was indented by #{Sass::Shared.human_indentation line[/^\s*/]}. +MSG + end + + last.comment_tab_str ||= comment_tab_str + last.text << "\n" << line + true + end + + def tree(arr, i = 0) + return [], i if arr[i].nil? + + base = arr[i].tabs + nodes = [] + while (line = arr[i]) && line.tabs >= base + if line.tabs > base + nodes.last.children, i = tree(arr, i) + else + nodes << line + i += 1 + end + end + return nodes, i + end + + def build_tree(parent, line, root = false) + @line = line.index + @offset = line.offset + node_or_nodes = parse_line(parent, line, root) + + Array(node_or_nodes).each do |node| + # Node is a symbol if it's non-outputting, like a variable assignment + next unless node.is_a? Tree::Node + + node.line = line.index + node.filename = line.filename + + append_children(node, line.children, false) + end + + node_or_nodes + end + + def append_children(parent, children, root) + continued_rule = nil + continued_comment = nil + children.each do |line| + child = build_tree(parent, line, root) + + if child.is_a?(Tree::RuleNode) + if child.continued? && child.children.empty? + if continued_rule + continued_rule.add_rules child + else + continued_rule = child + end + next + elsif continued_rule + continued_rule.add_rules child + continued_rule.children = child.children + continued_rule, child = nil, continued_rule + end + elsif continued_rule + continued_rule = nil + end + + if child.is_a?(Tree::CommentNode) && child.type == :silent + if continued_comment && + child.line == continued_comment.line + + continued_comment.lines + 1 + continued_comment.value.last.sub!(%r{ \*/\Z}, '') + child.value.first.gsub!(%r{\A/\*}, ' *') + continued_comment.value += ["\n"] + child.value + next + end + + continued_comment = child + end + + check_for_no_children(child) + validate_and_append_child(parent, child, line, root) + end + + parent + end + + def validate_and_append_child(parent, child, line, root) + case child + when Array + child.each {|c| validate_and_append_child(parent, c, line, root)} + when Tree::Node + parent << child + end + end + + def check_for_no_children(node) + return unless node.is_a?(Tree::RuleNode) && node.children.empty? + Sass::Util.sass_warn(<<WARNING.strip) +WARNING on line #{node.line}#{" of #{node.filename}" if node.filename}: +This selector doesn't have any properties and will not be rendered. +WARNING + end + + def parse_line(parent, line, root) + case line.text[0] + when PROPERTY_CHAR + if line.text[1] == PROPERTY_CHAR || + (@options[:property_syntax] == :new && + line.text =~ PROPERTY_OLD && $2.empty?) + # Support CSS3-style pseudo-elements, + # which begin with ::, + # as well as pseudo-classes + # if we're using the new property syntax + Tree::RuleNode.new(parse_interp(line.text), full_line_range(line)) + else + name_start_offset = line.offset + 1 # +1 for the leading ':' + name, value = line.text.scan(PROPERTY_OLD)[0] + raise SyntaxError.new("Invalid property: \"#{line.text}\".", + :line => @line) if name.nil? || value.nil? + + @@old_property_deprecation.warn(@options[:filename], @line, <<WARNING) +Old-style properties like "#{line.text}" are deprecated and will be an error in future versions of Sass. +Use "#{name}: #{value}" instead. +WARNING + + value_start_offset = name_end_offset = name_start_offset + name.length + unless value.empty? + # +1 and -1 both compensate for the leading ':', which is part of line.text + value_start_offset = name_start_offset + line.text.index(value, name.length + 1) - 1 + end + + property = parse_property(name, parse_interp(name), value, :old, line, value_start_offset) + property.name_source_range = Sass::Source::Range.new( + Sass::Source::Position.new(@line, to_parser_offset(name_start_offset)), + Sass::Source::Position.new(@line, to_parser_offset(name_end_offset)), + @options[:filename], @options[:importer]) + property + end + when ?$ + parse_variable(line) + when COMMENT_CHAR + parse_comment(line) + when DIRECTIVE_CHAR + parse_directive(parent, line, root) + when ESCAPE_CHAR + Tree::RuleNode.new(parse_interp(line.text[1..-1]), full_line_range(line)) + when MIXIN_DEFINITION_CHAR + parse_mixin_definition(line) + when MIXIN_INCLUDE_CHAR + if line.text[1].nil? || line.text[1] == ?\s + Tree::RuleNode.new(parse_interp(line.text), full_line_range(line)) + else + parse_mixin_include(line, root) + end + else + parse_property_or_rule(line) + end + end + + def parse_property_or_rule(line) + scanner = Sass::Util::MultibyteStringScanner.new(line.text) + hack_char = scanner.scan(/[:\*\.]|\#(?!\{)/) + offset = line.offset + offset += hack_char.length if hack_char + parser = Sass::SCSS::Parser.new(scanner, + @options[:filename], @options[:importer], + @line, to_parser_offset(offset)) + + unless (res = parser.parse_interp_ident) + parsed = parse_interp(line.text, line.offset) + return Tree::RuleNode.new(parsed, full_line_range(line)) + end + + ident_range = Sass::Source::Range.new( + Sass::Source::Position.new(@line, to_parser_offset(line.offset)), + Sass::Source::Position.new(@line, parser.offset), + @options[:filename], @options[:importer]) + offset = parser.offset - 1 + res.unshift(hack_char) if hack_char + + # Handle comments after a property name but before the colon. + if (comment = scanner.scan(Sass::SCSS::RX::COMMENT)) + res << comment + offset += comment.length + end + + name = line.text[0...scanner.pos] + could_be_property = + if name.start_with?('--') + (scanned = scanner.scan(/\s*:/)) + else + (scanned = scanner.scan(/\s*:(?:\s+|$)/)) + end + + if could_be_property # test for a property + offset += scanned.length + property = parse_property(name, res, scanner.rest, :new, line, offset) + property.name_source_range = ident_range + property + else + res.pop if comment + + if (trailing = (scanner.scan(/\s*#{Sass::SCSS::RX::COMMENT}/) || + scanner.scan(/\s*#{Sass::SCSS::RX::SINGLE_LINE_COMMENT}/))) + trailing.strip! + end + interp_parsed = parse_interp(scanner.rest) + selector_range = Sass::Source::Range.new( + ident_range.start_pos, + Sass::Source::Position.new(@line, to_parser_offset(line.offset) + line.text.length), + @options[:filename], @options[:importer]) + rule = Tree::RuleNode.new(res + interp_parsed, selector_range) + rule << Tree::CommentNode.new([trailing], :silent) if trailing + rule + end + end + + def parse_property(name, parsed_name, value, prop, line, start_offset) + + if name.start_with?('--') + unless line.children.empty? + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath custom properties.", + :line => @line + 1) + end + + parser = Sass::SCSS::Parser.new(value, + @options[:filename], @options[:importer], + @line, to_parser_offset(@offset)) + parsed_value = parser.parse_declaration_value + end_offset = start_offset + value.length + elsif value.strip.empty? + parsed_value = [Sass::Script::Tree::Literal.new(Sass::Script::Value::String.new(""))] + end_offset = start_offset + else + expr = parse_script(value, :offset => to_parser_offset(start_offset)) + end_offset = expr.source_range.end_pos.offset - 1 + parsed_value = [expr] + end + node = Tree::PropNode.new(parse_interp(name), parsed_value, prop) + node.value_source_range = Sass::Source::Range.new( + Sass::Source::Position.new(line.index, to_parser_offset(start_offset)), + Sass::Source::Position.new(line.index, to_parser_offset(end_offset)), + @options[:filename], @options[:importer]) + if !node.custom_property? && value.strip.empty? && line.children.empty? + raise SyntaxError.new( + "Invalid property: \"#{node.declaration}\" (no value)." + + node.pseudo_class_selector_message) + end + + node + end + + def parse_variable(line) + name, value, flags = line.text.scan(Script::MATCH)[0] + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath variable declarations.", + :line => @line + 1) unless line.children.empty? + raise SyntaxError.new("Invalid variable: \"#{line.text}\".", + :line => @line) unless name && value + flags = flags ? flags.split(/\s+/) : [] + if (invalid_flag = flags.find {|f| f != '!default' && f != '!global'}) + raise SyntaxError.new("Invalid flag \"#{invalid_flag}\".", :line => @line) + end + + # This workaround is needed for the case when the variable value is part of the identifier, + # otherwise we end up with the offset equal to the value index inside the name: + # $red_color: red; + var_lhs_length = 1 + name.length # 1 stands for '$' + index = line.text.index(value, line.offset + var_lhs_length) || 0 + expr = parse_script(value, :offset => to_parser_offset(line.offset + index)) + + Tree::VariableNode.new(name, expr, flags.include?('!default'), flags.include?('!global')) + end + + def parse_comment(line) + if line.text[1] == CSS_COMMENT_CHAR || line.text[1] == SASS_COMMENT_CHAR + silent = line.text[1] == SASS_COMMENT_CHAR + loud = !silent && line.text[2] == SASS_LOUD_COMMENT_CHAR + if silent + value = [line.text] + else + value = self.class.parse_interp( + line.text, line.index, to_parser_offset(line.offset), :filename => @filename) + end + value = Sass::Util.with_extracted_values(value) do |str| + str = str.gsub(/^#{line.comment_tab_str}/m, '')[2..-1] # get rid of // or /* + format_comment_text(str, silent) + end + type = if silent + :silent + elsif loud + :loud + else + :normal + end + comment = Tree::CommentNode.new(value, type) + comment.line = line.index + text = line.text.rstrip + if text.include?("\n") + end_offset = text.length - text.rindex("\n") + else + end_offset = to_parser_offset(line.offset + text.length) + end + comment.source_range = Sass::Source::Range.new( + Sass::Source::Position.new(@line, to_parser_offset(line.offset)), + Sass::Source::Position.new(@line + text.count("\n"), end_offset), + @options[:filename]) + comment + else + Tree::RuleNode.new(parse_interp(line.text), full_line_range(line)) + end + end + + DIRECTIVES = Set[:mixin, :include, :function, :return, :debug, :warn, :for, + :each, :while, :if, :else, :extend, :import, :media, :charset, :content, + :at_root, :error] + + def parse_directive(parent, line, root) + directive, whitespace, value = line.text[1..-1].split(/(\s+)/, 2) + raise SyntaxError.new("Invalid directive: '@'.") unless directive + offset = directive.size + whitespace.size + 1 if whitespace + + directive_name = directive.tr('-', '_').to_sym + if DIRECTIVES.include?(directive_name) + return send("parse_#{directive_name}_directive", parent, line, root, value, offset) + end + + unprefixed_directive = directive.gsub(/^-[a-z0-9]+-/i, '') + if unprefixed_directive == 'supports' + parser = Sass::SCSS::Parser.new(value, @options[:filename], @line) + return Tree::SupportsNode.new(directive, parser.parse_supports_condition) + end + + Tree::DirectiveNode.new( + value.nil? ? ["@#{directive}"] : ["@#{directive} "] + parse_interp(value, offset)) + end + + def parse_while_directive(parent, line, root, value, offset) + raise SyntaxError.new("Invalid while directive '@while': expected expression.") unless value + Tree::WhileNode.new(parse_script(value, :offset => offset)) + end + + def parse_if_directive(parent, line, root, value, offset) + raise SyntaxError.new("Invalid if directive '@if': expected expression.") unless value + Tree::IfNode.new(parse_script(value, :offset => offset)) + end + + def parse_debug_directive(parent, line, root, value, offset) + raise SyntaxError.new("Invalid debug directive '@debug': expected expression.") unless value + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath debug directives.", + :line => @line + 1) unless line.children.empty? + offset = line.offset + line.text.index(value).to_i + Tree::DebugNode.new(parse_script(value, :offset => offset)) + end + + def parse_error_directive(parent, line, root, value, offset) + raise SyntaxError.new("Invalid error directive '@error': expected expression.") unless value + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath error directives.", + :line => @line + 1) unless line.children.empty? + offset = line.offset + line.text.index(value).to_i + Tree::ErrorNode.new(parse_script(value, :offset => offset)) + end + + def parse_extend_directive(parent, line, root, value, offset) + raise SyntaxError.new("Invalid extend directive '@extend': expected expression.") unless value + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath extend directives.", + :line => @line + 1) unless line.children.empty? + optional = !!value.gsub!(/\s+#{Sass::SCSS::RX::OPTIONAL}$/, '') + offset = line.offset + line.text.index(value).to_i + interp_parsed = parse_interp(value, offset) + selector_range = Sass::Source::Range.new( + Sass::Source::Position.new(@line, to_parser_offset(offset)), + Sass::Source::Position.new(@line, to_parser_offset(line.offset) + line.text.length), + @options[:filename], @options[:importer] + ) + Tree::ExtendNode.new(interp_parsed, optional, selector_range) + end + + def parse_warn_directive(parent, line, root, value, offset) + raise SyntaxError.new("Invalid warn directive '@warn': expected expression.") unless value + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath warn directives.", + :line => @line + 1) unless line.children.empty? + offset = line.offset + line.text.index(value).to_i + Tree::WarnNode.new(parse_script(value, :offset => offset)) + end + + def parse_return_directive(parent, line, root, value, offset) + raise SyntaxError.new("Invalid @return: expected expression.") unless value + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath return directives.", + :line => @line + 1) unless line.children.empty? + offset = line.offset + line.text.index(value).to_i + Tree::ReturnNode.new(parse_script(value, :offset => offset)) + end + + def parse_charset_directive(parent, line, root, value, offset) + name = value && value[/\A(["'])(.*)\1\Z/, 2] # " + raise SyntaxError.new("Invalid charset directive '@charset': expected string.") unless name + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath charset directives.", + :line => @line + 1) unless line.children.empty? + Tree::CharsetNode.new(name) + end + + def parse_media_directive(parent, line, root, value, offset) + parser = Sass::SCSS::Parser.new(value, + @options[:filename], @options[:importer], + @line, to_parser_offset(@offset)) + offset = line.offset + line.text.index('media').to_i - 1 + parsed_media_query_list = parser.parse_media_query_list.to_a + node = Tree::MediaNode.new(parsed_media_query_list) + node.source_range = Sass::Source::Range.new( + Sass::Source::Position.new(@line, to_parser_offset(offset)), + Sass::Source::Position.new(@line, to_parser_offset(line.offset) + line.text.length), + @options[:filename], @options[:importer]) + node + end + + def parse_at_root_directive(parent, line, root, value, offset) + return Sass::Tree::AtRootNode.new unless value + + if value.start_with?('(') + parser = Sass::SCSS::Parser.new(value, + @options[:filename], @options[:importer], + @line, to_parser_offset(@offset)) + offset = line.offset + line.text.index('at-root').to_i - 1 + return Tree::AtRootNode.new(parser.parse_at_root_query) + end + + at_root_node = Tree::AtRootNode.new + parsed = parse_interp(value, offset) + rule_node = Tree::RuleNode.new(parsed, full_line_range(line)) + + # The caller expects to automatically add children to the returned node + # and we want it to add children to the rule node instead, so we + # manually handle the wiring here and return nil so the caller doesn't + # duplicate our efforts. + append_children(rule_node, line.children, false) + at_root_node << rule_node + parent << at_root_node + nil + end + + def parse_for_directive(parent, line, root, value, offset) + var, from_expr, to_name, to_expr = + value.scan(/^([^\s]+)\s+from\s+(.+)\s+(to|through)\s+(.+)$/).first + + if var.nil? # scan failed, try to figure out why for error message + if value !~ /^[^\s]+/ + expected = "variable name" + elsif value !~ /^[^\s]+\s+from\s+.+/ + expected = "'from <expr>'" + else + expected = "'to <expr>' or 'through <expr>'" + end + raise SyntaxError.new("Invalid for directive '@for #{value}': expected #{expected}.") + end + raise SyntaxError.new("Invalid variable \"#{var}\".") unless var =~ Script::VALIDATE + + var = var[1..-1] + parsed_from = parse_script(from_expr, :offset => line.offset + line.text.index(from_expr)) + parsed_to = parse_script(to_expr, :offset => line.offset + line.text.index(to_expr)) + Tree::ForNode.new(var, parsed_from, parsed_to, to_name == 'to') + end + + def parse_each_directive(parent, line, root, value, offset) + vars, list_expr = value.scan(/^([^\s]+(?:\s*,\s*[^\s]+)*)\s+in\s+(.+)$/).first + + if vars.nil? # scan failed, try to figure out why for error message + if value !~ /^[^\s]+/ + expected = "variable name" + elsif value !~ /^[^\s]+(?:\s*,\s*[^\s]+)*[^\s]+\s+from\s+.+/ + expected = "'in <expr>'" + end + raise SyntaxError.new("Invalid each directive '@each #{value}': expected #{expected}.") + end + + vars = vars.split(',').map do |var| + var.strip! + raise SyntaxError.new("Invalid variable \"#{var}\".") unless var =~ Script::VALIDATE + var[1..-1] + end + + parsed_list = parse_script(list_expr, :offset => line.offset + line.text.index(list_expr)) + Tree::EachNode.new(vars, parsed_list) + end + + def parse_else_directive(parent, line, root, value, offset) + previous = parent.children.last + raise SyntaxError.new("@else must come after @if.") unless previous.is_a?(Tree::IfNode) + + if value + if value !~ /^if\s+(.+)/ + raise SyntaxError.new("Invalid else directive '@else #{value}': expected 'if <expr>'.") + end + expr = parse_script($1, :offset => line.offset + line.text.index($1)) + end + + node = Tree::IfNode.new(expr) + append_children(node, line.children, false) + previous.add_else node + nil + end + + def parse_import_directive(parent, line, root, value, offset) + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath import directives.", + :line => @line + 1) unless line.children.empty? + + scanner = Sass::Util::MultibyteStringScanner.new(value) + values = [] + + loop do + unless (node = parse_import_arg(scanner, offset + scanner.pos)) + raise SyntaxError.new( + "Invalid @import: expected file to import, was #{scanner.rest.inspect}", + :line => @line) + end + values << node + break unless scanner.scan(/,\s*/) + end + + if scanner.scan(/;/) + raise SyntaxError.new("Invalid @import: expected end of line, was \";\".", + :line => @line) + end + + values + end + + def parse_import_arg(scanner, offset) + return if scanner.eos? + + if scanner.match?(/url\(/i) + script_parser = Sass::Script::Parser.new(scanner, @line, to_parser_offset(offset), @options) + str = script_parser.parse_string + + if scanner.eos? + end_pos = str.source_range.end_pos + node = Tree::CssImportNode.new(str) + else + supports_parser = Sass::SCSS::Parser.new(scanner, + @options[:filename], @options[:importer], + @line, str.source_range.end_pos.offset) + supports_condition = supports_parser.parse_supports_clause + + if scanner.eos? + node = Tree::CssImportNode.new(str, [], supports_condition) + else + media_parser = Sass::SCSS::Parser.new(scanner, + @options[:filename], @options[:importer], + @line, str.source_range.end_pos.offset) + media = media_parser.parse_media_query_list + end_pos = Sass::Source::Position.new(@line, media_parser.offset + 1) + node = Tree::CssImportNode.new(str, media.to_a, supports_condition) + end + end + + node.source_range = Sass::Source::Range.new( + str.source_range.start_pos, end_pos, + @options[:filename], @options[:importer]) + return node + end + + unless (quoted_val = scanner.scan(Sass::SCSS::RX::STRING)) + scanned = scanner.scan(/[^,;]+/) + node = Tree::ImportNode.new(scanned) + start_parser_offset = to_parser_offset(offset) + node.source_range = Sass::Source::Range.new( + Sass::Source::Position.new(@line, start_parser_offset), + Sass::Source::Position.new(@line, start_parser_offset + scanned.length), + @options[:filename], @options[:importer]) + return node + end + + start_offset = offset + offset += scanner.matched.length + val = Sass::Script::Value::String.value(scanner[1] || scanner[2]) + scanned = scanner.scan(/\s*/) + if !scanner.match?(/[,;]|$/) + offset += scanned.length if scanned + media_parser = Sass::SCSS::Parser.new(scanner, + @options[:filename], @options[:importer], @line, offset) + media = media_parser.parse_media_query_list + node = Tree::CssImportNode.new(quoted_val, media.to_a) + node.source_range = Sass::Source::Range.new( + Sass::Source::Position.new(@line, to_parser_offset(start_offset)), + Sass::Source::Position.new(@line, media_parser.offset), + @options[:filename], @options[:importer]) + elsif val =~ %r{^(https?:)?//} + node = Tree::CssImportNode.new(quoted_val) + node.source_range = Sass::Source::Range.new( + Sass::Source::Position.new(@line, to_parser_offset(start_offset)), + Sass::Source::Position.new(@line, to_parser_offset(offset)), + @options[:filename], @options[:importer]) + else + node = Tree::ImportNode.new(val) + node.source_range = Sass::Source::Range.new( + Sass::Source::Position.new(@line, to_parser_offset(start_offset)), + Sass::Source::Position.new(@line, to_parser_offset(offset)), + @options[:filename], @options[:importer]) + end + node + end + + def parse_mixin_directive(parent, line, root, value, offset) + parse_mixin_definition(line) + end + + MIXIN_DEF_RE = /^(?:=|@mixin)\s*(#{Sass::SCSS::RX::IDENT})(.*)$/ + def parse_mixin_definition(line) + name, arg_string = line.text.scan(MIXIN_DEF_RE).first + raise SyntaxError.new("Invalid mixin \"#{line.text[1..-1]}\".") if name.nil? + + offset = line.offset + line.text.size - arg_string.size + args, splat = Script::Parser.new(arg_string.strip, @line, to_parser_offset(offset), @options). + parse_mixin_definition_arglist + Tree::MixinDefNode.new(name, args, splat) + end + + CONTENT_RE = /^@content\s*(.+)?$/ + def parse_content_directive(parent, line, root, value, offset) + trailing = line.text.scan(CONTENT_RE).first.first + unless trailing.nil? + raise SyntaxError.new( + "Invalid content directive. Trailing characters found: \"#{trailing}\".") + end + raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath @content directives.", + :line => line.index + 1) unless line.children.empty? + Tree::ContentNode.new + end + + def parse_include_directive(parent, line, root, value, offset) + parse_mixin_include(line, root) + end + + MIXIN_INCLUDE_RE = /^(?:\+|@include)\s*(#{Sass::SCSS::RX::IDENT})(.*)$/ + def parse_mixin_include(line, root) + name, arg_string = line.text.scan(MIXIN_INCLUDE_RE).first + raise SyntaxError.new("Invalid mixin include \"#{line.text}\".") if name.nil? + + offset = line.offset + line.text.size - arg_string.size + args, keywords, splat, kwarg_splat = + Script::Parser.new(arg_string.strip, @line, to_parser_offset(offset), @options). + parse_mixin_include_arglist + Tree::MixinNode.new(name, args, keywords, splat, kwarg_splat) + end + + FUNCTION_RE = /^@function\s*(#{Sass::SCSS::RX::IDENT})(.*)$/ + def parse_function_directive(parent, line, root, value, offset) + name, arg_string = line.text.scan(FUNCTION_RE).first + raise SyntaxError.new("Invalid function definition \"#{line.text}\".") if name.nil? + + offset = line.offset + line.text.size - arg_string.size + args, splat = Script::Parser.new(arg_string.strip, @line, to_parser_offset(offset), @options). + parse_function_definition_arglist + Tree::FunctionNode.new(name, args, splat) + end + + def parse_script(script, options = {}) + line = options[:line] || @line + offset = options[:offset] || @offset + 1 + Script.parse(script, line, offset, @options) + end + + def format_comment_text(text, silent) + content = text.split("\n") + + if content.first && content.first.strip.empty? + removed_first = true + content.shift + end + + return "/* */" if content.empty? + content.last.gsub!(%r{ ?\*/ *$}, '') + first = content.shift unless removed_first + content.map! {|l| l.gsub!(/^\*( ?)/, '\1') || (l.empty? ? "" : " ") + l} + content.unshift first unless removed_first + if silent + "/*" + content.join("\n *") + " */" + else + # The #gsub fixes the case of a trailing */ + "/*" + content.join("\n *").gsub(/ \*\Z/, '') + " */" + end + end + + def parse_interp(text, offset = 0) + self.class.parse_interp(text, @line, offset, :filename => @filename) + end + + # Parser tracks 1-based line and offset, so our offset should be converted. + def to_parser_offset(offset) + offset + 1 + end + + def full_line_range(line) + Sass::Source::Range.new( + Sass::Source::Position.new(@line, to_parser_offset(line.offset)), + Sass::Source::Position.new(@line, to_parser_offset(line.offset) + line.text.length), + @options[:filename], @options[:importer]) + end + + # It's important that this have strings (at least) + # at the beginning, the end, and between each Script::Tree::Node. + # + # @private + def self.parse_interp(text, line, offset, options) + res = [] + rest = Sass::Shared.handle_interpolation text do |scan| + escapes = scan[2].size + res << scan.matched[0...-2 - escapes] + if escapes.odd? + res << "\\" * (escapes - 1) << '#{' + else + res << "\\" * [0, escapes - 1].max + if scan[1].include?("\n") + line += scan[1].count("\n") + offset = scan.matched_size - scan[1].rindex("\n") + else + offset += scan.matched_size + end + node = Script::Parser.new(scan, line, offset, options).parse_interpolated + offset = node.source_range.end_pos.offset + res << node + end + end + res << rest + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/environment.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/environment.rb new file mode 100644 index 000000000000..04502a88805f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/environment.rb @@ -0,0 +1,236 @@ +require 'set' + +module Sass + # The abstract base class for lexical environments for SassScript. + class BaseEnvironment + class << self + # Note: when updating this, + # update sass/yard/inherited_hash.rb as well. + def inherited_hash_accessor(name) + inherited_hash_reader(name) + inherited_hash_writer(name) + end + + def inherited_hash_reader(name) + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name}(name) + _#{name}(name.tr('_', '-')) + end + + def _#{name}(name) + (@#{name}s && @#{name}s[name]) || @parent && @parent._#{name}(name) + end + protected :_#{name} + + def is_#{name}_global?(name) + return !@parent if @#{name}s && @#{name}s.has_key?(name) + @parent && @parent.is_#{name}_global?(name) + end + RUBY + end + + def inherited_hash_writer(name) + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def set_#{name}(name, value) + name = name.tr('_', '-') + @#{name}s[name] = value unless try_set_#{name}(name, value) + end + + def try_set_#{name}(name, value) + @#{name}s ||= {} + if @#{name}s.include?(name) + @#{name}s[name] = value + true + elsif @parent && !@parent.global? + @parent.try_set_#{name}(name, value) + else + false + end + end + protected :try_set_#{name} + + def set_local_#{name}(name, value) + @#{name}s ||= {} + @#{name}s[name.tr('_', '-')] = value + end + + def set_global_#{name}(name, value) + global_env.set_#{name}(name, value) + end + RUBY + end + end + + # The options passed to the Sass Engine. + attr_reader :options + + attr_writer :caller + attr_writer :content + attr_writer :selector + + # variable + # Script::Value + inherited_hash_reader :var + + # mixin + # Sass::Callable + inherited_hash_reader :mixin + + # function + # Sass::Callable + inherited_hash_reader :function + + # @param options [{Symbol => Object}] The options hash. See + # {file:SASS_REFERENCE.md#Options the Sass options documentation}. + # @param parent [Environment] See \{#parent} + def initialize(parent = nil, options = nil) + @parent = parent + @options = options || (parent && parent.options) || {} + @stack = @parent.nil? ? Sass::Stack.new : nil + @caller = nil + @content = nil + @filename = nil + @functions = nil + @mixins = nil + @selector = nil + @vars = nil + end + + # Returns whether this is the global environment. + # + # @return [Boolean] + def global? + @parent.nil? + end + + # The environment of the caller of this environment's mixin or function. + # @return {Environment?} + def caller + @caller || (@parent && @parent.caller) + end + + # The content passed to this environment. This is naturally only set + # for mixin body environments with content passed in. + # + # @return {[Array<Sass::Tree::Node>, Environment]?} The content nodes and + # the lexical environment of the content block. + def content + @content || (@parent && @parent.content) + end + + # The selector for the current CSS rule, or nil if there is no + # current CSS rule. + # + # @return [Selector::CommaSequence?] The current selector, with any + # nesting fully resolved. + def selector + @selector || (@caller && @caller.selector) || (@parent && @parent.selector) + end + + # The top-level Environment object. + # + # @return [Environment] + def global_env + @global_env ||= global? ? self : @parent.global_env + end + + # The import/mixin stack. + # + # @return [Sass::Stack] + def stack + @stack || global_env.stack + end + end + + # The lexical environment for SassScript. + # This keeps track of variable, mixin, and function definitions. + # + # A new environment is created for each level of Sass nesting. + # This allows variables to be lexically scoped. + # The new environment refers to the environment in the upper scope, + # so it has access to variables defined in enclosing scopes, + # but new variables are defined locally. + # + # Environment also keeps track of the {Engine} options + # so that they can be made available to {Sass::Script::Functions}. + class Environment < BaseEnvironment + # The enclosing environment, + # or nil if this is the global environment. + # + # @return [Environment] + attr_reader :parent + + # variable + # Script::Value + inherited_hash_writer :var + + # mixin + # Sass::Callable + inherited_hash_writer :mixin + + # function + # Sass::Callable + inherited_hash_writer :function + end + + # A read-only wrapper for a lexical environment for SassScript. + class ReadOnlyEnvironment < BaseEnvironment + def initialize(parent = nil, options = nil) + super + @content_cached = nil + end + # The read-only environment of the caller of this environment's mixin or function. + # + # @see BaseEnvironment#caller + # @return {ReadOnlyEnvironment} + def caller + return @caller if @caller + env = super + @caller ||= env.is_a?(ReadOnlyEnvironment) ? env : ReadOnlyEnvironment.new(env, env.options) + end + + # The content passed to this environment. If the content's environment isn't already + # read-only, it's made read-only. + # + # @see BaseEnvironment#content + # + # @return {[Array<Sass::Tree::Node>, ReadOnlyEnvironment]?} The content nodes and + # the lexical environment of the content block. + # Returns `nil` when there is no content in this environment. + def content + # Return the cached content from a previous invocation if any + return @content if @content_cached + # get the content with a read-write environment from the superclass + read_write_content = super + if read_write_content + tree, env = read_write_content + # make the content's environment read-only + if env && !env.is_a?(ReadOnlyEnvironment) + env = ReadOnlyEnvironment.new(env, env.options) + end + @content_cached = true + @content = [tree, env] + else + @content_cached = true + @content = nil + end + end + end + + # An environment that can write to in-scope global variables, but doesn't + # create new variables in the global scope. Useful for top-level control + # directives. + class SemiGlobalEnvironment < Environment + def try_set_var(name, value) + @vars ||= {} + if @vars.include?(name) + @vars[name] = value + true + elsif @parent + @parent.try_set_var(name, value) + else + false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/error.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/error.rb new file mode 100644 index 000000000000..7ee7460356b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/error.rb @@ -0,0 +1,198 @@ +module Sass + # An exception class that keeps track of + # the line of the Sass template it was raised on + # and the Sass file that was being parsed (if applicable). + # + # All Sass errors are raised as {Sass::SyntaxError}s. + # + # When dealing with SyntaxErrors, + # it's important to provide filename and line number information. + # This will be used in various error reports to users, including backtraces; + # see \{#sass\_backtrace} for details. + # + # Some of this information is usually provided as part of the constructor. + # New backtrace entries can be added with \{#add\_backtrace}, + # which is called when an exception is raised between files (e.g. with `@import`). + # + # Often, a chunk of code will all have similar backtrace information - + # the same filename or even line. + # It may also be useful to have a default line number set. + # In those situations, the default values can be used + # by omitting the information on the original exception, + # and then calling \{#modify\_backtrace} in a wrapper `rescue`. + # When doing this, be sure that all exceptions ultimately end up + # with the information filled in. + class SyntaxError < StandardError + # The backtrace of the error within Sass files. + # This is an array of hashes containing information for a single entry. + # The hashes have the following keys: + # + # `:filename` + # : The name of the file in which the exception was raised, + # or `nil` if no filename is available. + # + # `:mixin` + # : The name of the mixin in which the exception was raised, + # or `nil` if it wasn't raised in a mixin. + # + # `:line` + # : The line of the file on which the error occurred. Never nil. + # + # This information is also included in standard backtrace format + # in the output of \{#backtrace}. + # + # @return [Aray<{Symbol => Object>}] + attr_accessor :sass_backtrace + + # The text of the template where this error was raised. + # + # @return [String] + attr_accessor :sass_template + + # @param msg [String] The error message + # @param attrs [{Symbol => Object}] The information in the backtrace entry. + # See \{#sass\_backtrace} + def initialize(msg, attrs = {}) + @message = msg + @sass_backtrace = [] + add_backtrace(attrs) + end + + # The name of the file in which the exception was raised. + # This could be `nil` if no filename is available. + # + # @return [String, nil] + def sass_filename + sass_backtrace.first[:filename] + end + + # The name of the mixin in which the error occurred. + # This could be `nil` if the error occurred outside a mixin. + # + # @return [String] + def sass_mixin + sass_backtrace.first[:mixin] + end + + # The line of the Sass template on which the error occurred. + # + # @return [Integer] + def sass_line + sass_backtrace.first[:line] + end + + # Adds an entry to the exception's Sass backtrace. + # + # @param attrs [{Symbol => Object}] The information in the backtrace entry. + # See \{#sass\_backtrace} + def add_backtrace(attrs) + sass_backtrace << attrs.reject {|_k, v| v.nil?} + end + + # Modify the top Sass backtrace entries + # (that is, the most deeply nested ones) + # to have the given attributes. + # + # Specifically, this goes through the backtrace entries + # from most deeply nested to least, + # setting the given attributes for each entry. + # If an entry already has one of the given attributes set, + # the pre-existing attribute takes precedence + # and is not used for less deeply-nested entries + # (even if they don't have that attribute set). + # + # @param attrs [{Symbol => Object}] The information to add to the backtrace entry. + # See \{#sass\_backtrace} + def modify_backtrace(attrs) + attrs = attrs.reject {|_k, v| v.nil?} + # Move backwards through the backtrace + (0...sass_backtrace.size).to_a.reverse_each do |i| + entry = sass_backtrace[i] + sass_backtrace[i] = attrs.merge(entry) + attrs.reject! {|k, _v| entry.include?(k)} + break if attrs.empty? + end + end + + # @return [String] The error message + def to_s + @message + end + + # Returns the standard exception backtrace, + # including the Sass backtrace. + # + # @return [Array<String>] + def backtrace + return nil if super.nil? + return super if sass_backtrace.all? {|h| h.empty?} + sass_backtrace.map do |h| + "#{h[:filename] || '(sass)'}:#{h[:line]}" + + (h[:mixin] ? ":in `#{h[:mixin]}'" : "") + end + super + end + + # Returns a string representation of the Sass backtrace. + # + # @param default_filename [String] The filename to use for unknown files + # @see #sass_backtrace + # @return [String] + def sass_backtrace_str(default_filename = "an unknown file") + lines = message.split("\n") + msg = lines[0] + lines[1..-1]. + map {|l| "\n" + (" " * "Error: ".size) + l}.join + "Error: #{msg}" + + sass_backtrace.each_with_index.map do |entry, i| + "\n #{i == 0 ? 'on' : 'from'} line #{entry[:line]}" + + " of #{entry[:filename] || default_filename}" + + (entry[:mixin] ? ", in `#{entry[:mixin]}'" : "") + end.join + end + + class << self + # Returns an error report for an exception in CSS format. + # + # @param e [Exception] + # @param line_offset [Integer] The number of the first line of the Sass template. + # @return [String] The error report + # @raise [Exception] `e`, if the + # {file:SASS_REFERENCE.md#full_exception-option `:full_exception`} option + # is set to false. + def exception_to_css(e, line_offset = 1) + header = header_string(e, line_offset) + + <<END +/* +#{header.gsub('*/', '*\\/')} + +Backtrace:\n#{e.backtrace.join("\n").gsub('*/', '*\\/')} +*/ +body:before { + white-space: pre; + font-family: monospace; + content: "#{header.gsub('"', '\"').gsub("\n", '\\A ')}"; } +END + end + + private + + def header_string(e, line_offset) + unless e.is_a?(Sass::SyntaxError) && e.sass_line && e.sass_template + return "#{e.class}: #{e.message}" + end + + line_num = e.sass_line + 1 - line_offset + min = [line_num - 6, 0].max + section = e.sass_template.rstrip.split("\n")[min...line_num + 5] + return e.sass_backtrace_str if section.nil? || section.empty? + + e.sass_backtrace_str + "\n\n" + section.each_with_index. + map {|line, i| "#{line_offset + min + i}: #{line}"}.join("\n") + end + end + end + + # The class for Sass errors that are raised due to invalid unit conversions + # in SassScript. + class UnitConversionError < SyntaxError; end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec.rb new file mode 100644 index 000000000000..8add324f6813 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec.rb @@ -0,0 +1,9 @@ +module Sass + # This module handles the Sass executables (`sass` and `sass-convert`). + module Exec + end +end + +require 'sass/exec/base' +require 'sass/exec/sass_scss' +require 'sass/exec/sass_convert' diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec/base.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec/base.rb new file mode 100644 index 000000000000..4b5c6782c810 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec/base.rb @@ -0,0 +1,188 @@ +require 'optparse' + +module Sass::Exec + # The abstract base class for Sass executables. + class Base + # @param args [Array<String>] The command-line arguments + def initialize(args) + @args = args + @options = {} + end + + # Parses the command-line arguments and runs the executable. + # Calls `Kernel#exit` at the end, so it never returns. + # + # @see #parse + def parse! + begin + parse + rescue Exception => e + # Exit code 65 indicates invalid data per + # http://www.freebsd.org/cgi/man.cgi?query=sysexits. Setting it via + # at_exit is a bit of a hack, but it allows us to rethrow when --trace + # is active and get both the built-in exception formatting and the + # correct exit code. + at_exit {exit Sass::Util.windows? ? 13 : 65} if e.is_a?(Sass::SyntaxError) + + raise e if @options[:trace] || e.is_a?(SystemExit) + + if e.is_a?(Sass::SyntaxError) + $stderr.puts e.sass_backtrace_str("standard input") + else + $stderr.print "#{e.class}: " unless e.class == RuntimeError + $stderr.puts e.message.to_s + end + $stderr.puts " Use --trace for backtrace." + + exit 1 + end + exit 0 + end + + # Parses the command-line arguments and runs the executable. + # This does not handle exceptions or exit the program. + # + # @see #parse! + def parse + @opts = OptionParser.new(&method(:set_opts)) + @opts.parse!(@args) + + process_result + + @options + end + + # @return [String] A description of the executable + def to_s + @opts.to_s + end + + protected + + # Finds the line of the source template + # on which an exception was raised. + # + # @param exception [Exception] The exception + # @return [String] The line number + def get_line(exception) + # SyntaxErrors have weird line reporting + # when there's trailing whitespace + if exception.is_a?(::SyntaxError) + return (exception.message.scan(/:(\d+)/).first || ["??"]).first + end + (exception.backtrace[0].scan(/:(\d+)/).first || ["??"]).first + end + + # Tells optparse how to parse the arguments + # available for all executables. + # + # This is meant to be overridden by subclasses + # so they can add their own options. + # + # @param opts [OptionParser] + def set_opts(opts) + Sass::Util.abstract(this) + end + + # Set an option for specifying `Encoding.default_external`. + # + # @param opts [OptionParser] + def encoding_option(opts) + encoding_desc = 'Specify the default encoding for input files.' + opts.on('-E', '--default-encoding ENCODING', encoding_desc) do |encoding| + Encoding.default_external = encoding + end + end + + # Processes the options set by the command-line arguments. In particular, + # sets `@options[:input]` and `@options[:output]` to appropriate IO streams. + # + # This is meant to be overridden by subclasses + # so they can run their respective programs. + def process_result + input, output = @options[:input], @options[:output] + args = @args.dup + input ||= + begin + filename = args.shift + @options[:filename] = filename + open_file(filename) || $stdin + end + @options[:output_filename] = args.shift + output ||= @options[:output_filename] || $stdout + @options[:input], @options[:output] = input, output + end + + COLORS = {:red => 31, :green => 32, :yellow => 33} + + # Prints a status message about performing the given action, + # colored using the given color (via terminal escapes) if possible. + # + # @param name [#to_s] A short name for the action being performed. + # Shouldn't be longer than 11 characters. + # @param color [Symbol] The name of the color to use for this action. + # Can be `:red`, `:green`, or `:yellow`. + def puts_action(name, color, arg) + return if @options[:for_engine][:quiet] + printf color(color, "%11s %s\n"), name, arg + STDOUT.flush + end + + # Same as `Kernel.puts`, but doesn't print anything if the `--quiet` option is set. + # + # @param args [Array] Passed on to `Kernel.puts` + def puts(*args) + return if @options[:for_engine][:quiet] + Kernel.puts(*args) + end + + # Wraps the given string in terminal escapes + # causing it to have the given color. + # If terminal escapes aren't supported on this platform, + # just returns the string instead. + # + # @param color [Symbol] The name of the color to use. + # Can be `:red`, `:green`, or `:yellow`. + # @param str [String] The string to wrap in the given color. + # @return [String] The wrapped string. + def color(color, str) + raise "[BUG] Unrecognized color #{color}" unless COLORS[color] + + # Almost any real Unix terminal will support color, + # so we just filter for Windows terms (which don't set TERM) + # and not-real terminals, which aren't ttys. + return str if ENV["TERM"].nil? || ENV["TERM"].empty? || !STDOUT.tty? + "\e[#{COLORS[color]}m#{str}\e[0m" + end + + def write_output(text, destination) + if destination.is_a?(String) + open_file(destination, 'w') {|file| file.write(text)} + else + destination.write(text) + end + end + + private + + def open_file(filename, flag = 'r') + return if filename.nil? + flag = 'wb' if @options[:unix_newlines] && flag == 'w' + file = File.open(filename, flag) + return file unless block_given? + yield file + file.close + end + + def handle_load_error(err) + dep = err.message[/^no such file to load -- (.*)/, 1] + raise err if @options[:trace] || dep.nil? || dep.empty? + $stderr.puts <<MESSAGE +Required dependency #{dep} not found! + Run "gem install #{dep}" to get it. + Use --trace for backtrace. +MESSAGE + exit 1 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec/sass_convert.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec/sass_convert.rb new file mode 100644 index 000000000000..8e68977108ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec/sass_convert.rb @@ -0,0 +1,283 @@ +require 'optparse' +require 'fileutils' + +module Sass::Exec + # The `sass-convert` executable. + class SassConvert < Base + # @param args [Array<String>] The command-line arguments + def initialize(args) + super + require 'sass' + @options[:for_tree] = {} + @options[:for_engine] = {:cache => false, :read_cache => true} + end + + # Tells optparse how to parse the arguments. + # + # @param opts [OptionParser] + def set_opts(opts) + opts.banner = <<END +Usage: sass-convert [options] [INPUT] [OUTPUT] + +Description: + Converts between CSS, indented syntax, and SCSS files. For example, + this can convert from the indented syntax to SCSS, or from CSS to + SCSS (adding appropriate nesting). +END + + common_options(opts) + style(opts) + input_and_output(opts) + miscellaneous(opts) + end + + # Processes the options set by the command-line arguments, + # and runs the CSS compiler appropriately. + def process_result + require 'sass' + + if @options[:recursive] + process_directory + return + end + + super + input = @options[:input] + if File.directory?(input) + raise "Error: '#{input.path}' is a directory (did you mean to use --recursive?)" + end + output = @options[:output] + output = input if @options[:in_place] + process_file(input, output) + end + + private + + def common_options(opts) + opts.separator '' + opts.separator 'Common Options:' + + opts.on('-F', '--from FORMAT', + 'The format to convert from. Can be css, scss, sass.', + 'By default, this is inferred from the input filename.', + 'If there is none, defaults to css.') do |name| + @options[:from] = name.downcase.to_sym + raise "sass-convert no longer supports LessCSS." if @options[:from] == :less + unless [:css, :scss, :sass].include?(@options[:from]) + raise "Unknown format for sass-convert --from: #{name}" + end + end + + opts.on('-T', '--to FORMAT', + 'The format to convert to. Can be scss or sass.', + 'By default, this is inferred from the output filename.', + 'If there is none, defaults to sass.') do |name| + @options[:to] = name.downcase.to_sym + unless [:scss, :sass].include?(@options[:to]) + raise "Unknown format for sass-convert --to: #{name}" + end + end + + opts.on('-i', '--in-place', + 'Convert a file to its own syntax.', + 'This can be used to update some deprecated syntax.') do + @options[:in_place] = true + end + + opts.on('-R', '--recursive', + 'Convert all the files in a directory. Requires --from and --to.') do + @options[:recursive] = true + end + + opts.on("-?", "-h", "--help", "Show this help message.") do + puts opts + exit + end + + opts.on("-v", "--version", "Print the Sass version.") do + puts("Sass #{Sass.version[:string]}") + exit + end + end + + def style(opts) + opts.separator '' + opts.separator 'Style:' + + opts.on('--dasherize', 'Convert underscores to dashes.') do + @options[:for_tree][:dasherize] = true + end + + opts.on( + '--indent NUM', + 'How many spaces to use for each level of indentation. Defaults to 2.', + '"t" means use hard tabs.' + ) do |indent| + if indent == 't' + @options[:for_tree][:indent] = "\t" + else + @options[:for_tree][:indent] = " " * indent.to_i + end + end + + opts.on('--old', 'Output the old-style ":prop val" property syntax.', + 'Only meaningful when generating Sass.') do + @options[:for_tree][:old] = true + end + end + + def input_and_output(opts) + opts.separator '' + opts.separator 'Input and Output:' + + opts.on('-s', '--stdin', :NONE, + 'Read input from standard input instead of an input file.', + 'This is the default if no input file is specified. Requires --from.') do + @options[:input] = $stdin + end + + encoding_option(opts) + + opts.on('--unix-newlines', 'Use Unix-style newlines in written files.', + ('Always true on Unix.' unless Sass::Util.windows?)) do + @options[:unix_newlines] = true if Sass::Util.windows? + end + end + + def miscellaneous(opts) + opts.separator '' + opts.separator 'Miscellaneous:' + + opts.on('--cache-location PATH', + 'The path to save parsed Sass files. Defaults to .sass-cache.') do |loc| + @options[:for_engine][:cache_location] = loc + end + + opts.on('-C', '--no-cache', "Don't cache to sassc files.") do + @options[:for_engine][:read_cache] = false + end + + opts.on('-q', '--quiet', 'Silence warnings and status messages during conversion.') do |bool| + @options[:for_engine][:quiet] = bool + end + + opts.on('--trace', :NONE, 'Show a full Ruby stack trace on error') do + @options[:trace] = true + end + end + + def process_directory + @options[:input] = @args.shift + unless @options[:input] + raise "Error: directory required when using --recursive." + end + + output = @options[:output] = @args.shift + raise "Error: --from required when using --recursive." unless @options[:from] + raise "Error: --to required when using --recursive." unless @options[:to] + unless File.directory?(@options[:input]) + raise "Error: '#{@options[:input]}' is not a directory" + end + if @options[:output] && File.exist?(@options[:output]) && + !File.directory?(@options[:output]) + raise "Error: '#{@options[:output]}' is not a directory" + end + @options[:output] ||= @options[:input] + + if @options[:to] == @options[:from] && !@options[:in_place] + fmt = @options[:from] + raise "Error: converting from #{fmt} to #{fmt} without --in-place" + end + + ext = @options[:from] + Sass::Util.glob("#{@options[:input]}/**/*.#{ext}") do |f| + output = + if @options[:in_place] + f + elsif @options[:output] + output_name = f.gsub(/\.(c|sa|sc|le)ss$/, ".#{@options[:to]}") + output_name[0...@options[:input].size] = @options[:output] + output_name + else + f.gsub(/\.(c|sa|sc|le)ss$/, ".#{@options[:to]}") + end + + unless File.directory?(File.dirname(output)) + puts_action :directory, :green, File.dirname(output) + FileUtils.mkdir_p(File.dirname(output)) + end + puts_action :convert, :green, f + if File.exist?(output) + puts_action :overwrite, :yellow, output + else + puts_action :create, :green, output + end + + process_file(f, output) + end + end + + def process_file(input, output) + input_path, output_path = path_for(input), path_for(output) + if input_path + @options[:from] ||= + case input_path + when /\.scss$/; :scss + when /\.sass$/; :sass + when /\.less$/; raise "sass-convert no longer supports LessCSS." + when /\.css$/; :css + end + elsif @options[:in_place] + raise "Error: the --in-place option requires a filename." + end + + if output_path + @options[:to] ||= + case output_path + when /\.scss$/; :scss + when /\.sass$/; :sass + end + end + + @options[:from] ||= :css + @options[:to] ||= :sass + @options[:for_engine][:syntax] = @options[:from] + + out = + Sass::Util.silence_sass_warnings do + if @options[:from] == :css + require 'sass/css' + Sass::CSS.new(read(input), @options[:for_tree]).render(@options[:to]) + else + if input_path + Sass::Engine.for_file(input_path, @options[:for_engine]) + else + Sass::Engine.new(read(input), @options[:for_engine]) + end.to_tree.send("to_#{@options[:to]}", @options[:for_tree]) + end + end + + output = input_path if @options[:in_place] + write_output(out, output) + rescue Sass::SyntaxError => e + raise e if @options[:trace] + file = " of #{e.sass_filename}" if e.sass_filename + raise "Error on line #{e.sass_line}#{file}: #{e.message}\n Use --trace for backtrace" + rescue LoadError => err + handle_load_error(err) + end + + def path_for(file) + return file.path if file.is_a?(File) + return file if file.is_a?(String) + end + + def read(file) + if file.respond_to?(:read) + file.read + else + open(file, 'rb') {|f| f.read} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec/sass_scss.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec/sass_scss.rb new file mode 100644 index 000000000000..baea0a9429d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/exec/sass_scss.rb @@ -0,0 +1,436 @@ +module Sass::Exec + # The `sass` and `scss` executables. + class SassScss < Base + attr_reader :default_syntax + + # @param args [Array<String>] The command-line arguments + def initialize(args, default_syntax) + super(args) + @options[:sourcemap] = :auto + @options[:for_engine] = { + :load_paths => default_sass_path + } + @default_syntax = default_syntax + end + + protected + + # Tells optparse how to parse the arguments. + # + # @param opts [OptionParser] + def set_opts(opts) + opts.banner = <<END +Usage: #{default_syntax} [options] [INPUT] [OUTPUT] + +Description: + Converts SCSS or Sass files to CSS. +END + + common_options(opts) + watching_and_updating(opts) + input_and_output(opts) + miscellaneous(opts) + end + + # Processes the options set by the command-line arguments, + # and runs the Sass compiler appropriately. + def process_result + require 'sass' + + if !@options[:update] && !@options[:watch] && + @args.first && colon_path?(@args.first) + if @args.size == 1 + @args = split_colon_path(@args.first) + else + @fake_update = true + @options[:update] = true + end + end + load_compass if @options[:compass] + return interactive if @options[:interactive] + return watch_or_update if @options[:watch] || @options[:update] + super + + if @options[:sourcemap] != :none && @options[:output_filename] + @options[:sourcemap_filename] = Sass::Util.sourcemap_name(@options[:output_filename]) + end + + @options[:for_engine][:filename] = @options[:filename] + @options[:for_engine][:css_filename] = @options[:output] if @options[:output].is_a?(String) + @options[:for_engine][:sourcemap_filename] = @options[:sourcemap_filename] + @options[:for_engine][:sourcemap] = @options[:sourcemap] + + run + end + + private + + def common_options(opts) + opts.separator '' + opts.separator 'Common Options:' + + opts.on('-I', '--load-path PATH', 'Specify a Sass import path.') do |path| + (@options[:for_engine][:load_paths] ||= []) << path + end + + opts.on('-r', '--require LIB', 'Require a Ruby library before running Sass.') do |lib| + require lib + end + + opts.on('--compass', 'Make Compass imports available and load project configuration.') do + @options[:compass] = true + end + + opts.on('-t', '--style NAME', 'Output style. Can be nested (default), compact, ' \ + 'compressed, or expanded.') do |name| + @options[:for_engine][:style] = name.to_sym + end + + opts.on("-?", "-h", "--help", "Show this help message.") do + puts opts + exit + end + + opts.on("-v", "--version", "Print the Sass version.") do + puts("Ruby Sass #{Sass.version[:string]}") + exit + end + end + + def watching_and_updating(opts) + opts.separator '' + opts.separator 'Watching and Updating:' + + opts.on('--watch', 'Watch files or directories for changes.', + 'The location of the generated CSS can be set using a colon:', + " #{@default_syntax} --watch input.#{@default_syntax}:output.css", + " #{@default_syntax} --watch input-dir:output-dir") do + @options[:watch] = true + end + + # Polling is used by default on Windows. + unless Sass::Util.windows? + opts.on('--poll', 'Check for file changes manually, rather than relying on the OS.', + 'Only meaningful for --watch.') do + @options[:poll] = true + end + end + + opts.on('--update', 'Compile files or directories to CSS.', + 'Locations are set like --watch.') do + @options[:update] = true + end + + opts.on('-f', '--force', 'Recompile every Sass file, even if the CSS file is newer.', + 'Only meaningful for --update.') do + @options[:force] = true + end + + opts.on('--stop-on-error', 'If a file fails to compile, exit immediately.', + 'Only meaningful for --watch and --update.') do + @options[:stop_on_error] = true + end + end + + def input_and_output(opts) + opts.separator '' + opts.separator 'Input and Output:' + + if @default_syntax == :sass + opts.on('--scss', + 'Use the CSS-superset SCSS syntax.') do + @options[:for_engine][:syntax] = :scss + end + else + opts.on('--sass', + 'Use the indented Sass syntax.') do + @options[:for_engine][:syntax] = :sass + end + end + + # This is optional for backwards-compatibility with Sass 3.3, which didn't + # enable sourcemaps by default and instead used "--sourcemap" to do so. + opts.on(:OPTIONAL, '--sourcemap=TYPE', + 'How to link generated output to the source files.', + ' auto (default): relative paths where possible, file URIs elsewhere', + ' file: always absolute file URIs', + ' inline: include the source text in the sourcemap', + ' none: no sourcemaps') do |type| + if type && !%w(auto file inline none).include?(type) + $stderr.puts "Unknown sourcemap type #{type}.\n\n" + $stderr.puts opts + exit + elsif type.nil? + Sass::Util.sass_warn <<MESSAGE.rstrip +DEPRECATION WARNING: Passing --sourcemap without a value is deprecated. +Sourcemaps are now generated by default, so this flag has no effect. +MESSAGE + end + + @options[:sourcemap] = (type || :auto).to_sym + end + + opts.on('-s', '--stdin', :NONE, + 'Read input from standard input instead of an input file.', + 'This is the default if no input file is specified.') do + @options[:input] = $stdin + end + + encoding_option(opts) + + opts.on('--unix-newlines', 'Use Unix-style newlines in written files.', + ('Always true on Unix.' unless Sass::Util.windows?)) do + @options[:unix_newlines] = true if Sass::Util.windows? + end + + opts.on('-g', '--debug-info', + 'Emit output that can be used by the FireSass Firebug plugin.') do + @options[:for_engine][:debug_info] = true + end + + opts.on('-l', '--line-numbers', '--line-comments', + 'Emit comments in the generated CSS indicating the corresponding source line.') do + @options[:for_engine][:line_numbers] = true + end + end + + def miscellaneous(opts) + opts.separator '' + opts.separator 'Miscellaneous:' + + opts.on('-i', '--interactive', + 'Run an interactive SassScript shell.') do + @options[:interactive] = true + end + + opts.on('-c', '--check', "Just check syntax, don't evaluate.") do + require 'stringio' + @options[:check_syntax] = true + @options[:output] = StringIO.new + end + + opts.on('--precision NUMBER_OF_DIGITS', Integer, + "How many digits of precision to use when outputting decimal numbers.", + "Defaults to #{Sass::Script::Value::Number.precision}.") do |precision| + Sass::Script::Value::Number.precision = precision + end + + opts.on('--cache-location PATH', + 'The path to save parsed Sass files. Defaults to .sass-cache.') do |loc| + @options[:for_engine][:cache_location] = loc + end + + opts.on('-C', '--no-cache', "Don't cache parsed Sass files.") do + @options[:for_engine][:cache] = false + end + + opts.on('--trace', :NONE, 'Show a full Ruby stack trace on error.') do + @options[:trace] = true + end + + opts.on('-q', '--quiet', 'Silence warnings and status messages during compilation.') do + @options[:for_engine][:quiet] = true + end + end + + def load_compass + begin + require 'compass' + rescue LoadError + require 'rubygems' + begin + require 'compass' + rescue LoadError + puts "ERROR: Cannot load compass." + exit 1 + end + end + Compass.add_project_configuration + Compass.configuration.project_path ||= Dir.pwd + @options[:for_engine][:load_paths] ||= [] + @options[:for_engine][:load_paths] += Compass.configuration.sass_load_paths + end + + def interactive + require 'sass/repl' + Sass::Repl.new(@options).run + end + + def watch_or_update + require 'sass/plugin' + Sass::Plugin.options.merge! @options[:for_engine] + Sass::Plugin.options[:unix_newlines] = @options[:unix_newlines] + Sass::Plugin.options[:poll] = @options[:poll] + Sass::Plugin.options[:sourcemap] = @options[:sourcemap] + + if @options[:force] + raise "The --force flag may only be used with --update." unless @options[:update] + Sass::Plugin.options[:always_update] = true + end + + raise <<MSG if @args.empty? +What files should I watch? Did you mean something like: + #{@default_syntax} --watch input.#{@default_syntax}:output.css + #{@default_syntax} --watch input-dir:output-dir +MSG + + if !colon_path?(@args[0]) && probably_dest_dir?(@args[1]) + flag = @options[:update] ? "--update" : "--watch" + err = + if !File.exist?(@args[1]) + "doesn't exist" + elsif @args[1] =~ /\.css$/ + "is a CSS file" + end + raise <<MSG if err +File #{@args[1]} #{err}. + Did you mean: #{@default_syntax} #{flag} #{@args[0]}:#{@args[1]} +MSG + end + + dirs, files = @args.map {|name| split_colon_path(name)}. + partition {|i, _| File.directory? i} + + if @fake_update && !dirs.empty? + # Issue 1602. + Sass::Util.sass_warn <<WARNING.strip +DEPRECATION WARNING: Compiling directories without --update or --watch is +deprecated and won't work in future versions of Sass. Instead use: + #{@default_syntax} --update #{@args} +WARNING + end + + files.map! do |from, to| + to ||= from.gsub(/\.[^.]*?$/, '.css') + sourcemap = Sass::Util.sourcemap_name(to) if @options[:sourcemap] + [from, to, sourcemap] + end + dirs.map! {|from, to| [from, to || from]} + Sass::Plugin.options[:template_location] = dirs + + Sass::Plugin.on_updated_stylesheet do |_, css, sourcemap| + [css, sourcemap].each do |file| + next unless file + puts_action :write, :green, file + end + end + + had_error = false + Sass::Plugin.on_creating_directory {|dirname| puts_action :directory, :green, dirname} + Sass::Plugin.on_deleting_css {|filename| puts_action :delete, :yellow, filename} + Sass::Plugin.on_deleting_sourcemap {|filename| puts_action :delete, :yellow, filename} + Sass::Plugin.on_compilation_error do |error, _, _| + if error.is_a?(SystemCallError) && !@options[:stop_on_error] + had_error = true + puts_action :error, :red, error.message + STDOUT.flush + next + end + + raise error unless error.is_a?(Sass::SyntaxError) && !@options[:stop_on_error] + had_error = true + puts_action :error, :red, + "#{error.sass_filename} (Line #{error.sass_line}: #{error.message})" + STDOUT.flush + end + + if @options[:update] + Sass::Plugin.update_stylesheets(files) + exit 1 if had_error + return + end + + puts ">>> Sass is watching for changes. Press Ctrl-C to stop." + + Sass::Plugin.on_template_modified do |template| + puts ">>> Change detected to: #{template}" + STDOUT.flush + end + Sass::Plugin.on_template_created do |template| + puts ">>> New template detected: #{template}" + STDOUT.flush + end + Sass::Plugin.on_template_deleted do |template| + puts ">>> Deleted template detected: #{template}" + STDOUT.flush + end + + Sass::Plugin.watch(files) + end + + def run + input = @options[:input] + output = @options[:output] + + if input == $stdin + # See issue 1745 + (@options[:for_engine][:load_paths] ||= []) << ::Sass::Importers::DeprecatedPath.new(".") + end + + @options[:for_engine][:syntax] ||= :scss if input.is_a?(File) && input.path =~ /\.scss$/ + @options[:for_engine][:syntax] ||= @default_syntax + engine = + if input.is_a?(File) && !@options[:check_syntax] + Sass::Engine.for_file(input.path, @options[:for_engine]) + else + # We don't need to do any special handling of @options[:check_syntax] here, + # because the Sass syntax checking happens alongside evaluation + # and evaluation doesn't actually evaluate any code anyway. + Sass::Engine.new(input.read, @options[:for_engine]) + end + + input.close if input.is_a?(File) + + if @options[:sourcemap] != :none && @options[:sourcemap_filename] + relative_sourcemap_path = Sass::Util.relative_path_from( + @options[:sourcemap_filename], Sass::Util.pathname(@options[:output_filename]).dirname) + rendered, mapping = engine.render_with_sourcemap(relative_sourcemap_path.to_s) + write_output(rendered, output) + write_output( + mapping.to_json( + :type => @options[:sourcemap], + :css_path => @options[:output_filename], + :sourcemap_path => @options[:sourcemap_filename]) + "\n", + @options[:sourcemap_filename]) + else + write_output(engine.render, output) + end + rescue Sass::SyntaxError => e + write_output(Sass::SyntaxError.exception_to_css(e), output) if output.is_a?(String) + raise e + ensure + output.close if output.is_a? File + end + + def colon_path?(path) + !split_colon_path(path)[1].nil? + end + + def split_colon_path(path) + one, two = path.split(':', 2) + if one && two && Sass::Util.windows? && + one =~ /\A[A-Za-z]\Z/ && two =~ %r{\A[/\\]} + # If we're on Windows and we were passed a drive letter path, + # don't split on that colon. + one2, two = two.split(':', 2) + one = one + ':' + one2 + end + return one, two + end + + # Whether path is likely to be meant as the destination + # in a source:dest pair. + def probably_dest_dir?(path) + return false unless path + return false if colon_path?(path) + Sass::Util.glob(File.join(path, "*.s[ca]ss")).empty? + end + + def default_sass_path + return unless ENV['SASS_PATH'] + # The select here prevents errors when the environment's + # load paths specified do not exist. + ENV['SASS_PATH'].split(File::PATH_SEPARATOR).select {|d| File.directory?(d)} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/features.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/features.rb new file mode 100644 index 000000000000..78d32992f2ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/features.rb @@ -0,0 +1,48 @@ +require 'set' +module Sass + # Provides `Sass.has_feature?` which allows for simple feature detection + # by providing a feature name. + module Features + # This is the set of features that can be detected. + # + # When this is updated, the documentation of `feature-exists()` should be + # updated as well. + KNOWN_FEATURES = Set[*%w( + global-variable-shadowing + extend-selector-pseudoclass + units-level-3 + at-error + custom-property + )] + + # Check if a feature exists by name. This is used to implement + # the Sass function `feature-exists($feature)` + # + # @param feature_name [String] The case sensitive name of the feature to + # check if it exists in this version of Sass. + # @return [Boolean] whether the feature of that name exists. + def has_feature?(feature_name) + KNOWN_FEATURES.include?(feature_name) + end + + # Add a feature to Sass. Plugins can use this to easily expose their + # availability to end users. Plugins must prefix their feature + # names with a dash to distinguish them from official features. + # + # @example + # Sass.add_feature("-import-globbing") + # Sass.add_feature("-math-cos") + # + # + # @param feature_name [String] The case sensitive name of the feature to + # to add to Sass. Must begin with a dash. + def add_feature(feature_name) + unless feature_name[0] == ?- + raise ArgumentError.new("Plugin feature names must begin with a dash") + end + KNOWN_FEATURES << feature_name + end + end + + extend Features +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers.rb new file mode 100644 index 000000000000..6178b2015893 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers.rb @@ -0,0 +1,23 @@ +module Sass + # Sass importers are in charge of taking paths passed to `@import` + # and finding the appropriate Sass code for those paths. + # By default, this code is always loaded from the filesystem, + # but importers could be added to load from a database or over HTTP. + # + # Each importer is in charge of a single load path + # (or whatever the corresponding notion is for the backend). + # Importers can be placed in the {file:SASS_REFERENCE.md#load_paths-option `:load_paths` array} + # alongside normal filesystem paths. + # + # When resolving an `@import`, Sass will go through the load paths + # looking for an importer that successfully imports the path. + # Once one is found, the imported file is used. + # + # User-created importers must inherit from {Importers::Base}. + module Importers + end +end + +require 'sass/importers/base' +require 'sass/importers/filesystem' +require 'sass/importers/deprecated_path' diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers/base.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers/base.rb new file mode 100644 index 000000000000..a634d34bb8a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers/base.rb @@ -0,0 +1,182 @@ +module Sass + module Importers + # The abstract base class for Sass importers. + # All importers should inherit from this. + # + # At the most basic level, an importer is given a string + # and must return a {Sass::Engine} containing some Sass code. + # This string can be interpreted however the importer wants; + # however, subclasses are encouraged to use the URI format + # for pathnames. + # + # Importers that have some notion of "relative imports" + # should take a single load path in their constructor, + # and interpret paths as relative to that. + # They should also implement the \{#find\_relative} method. + # + # Importers should be serializable via `Marshal.dump`. + # + # @abstract + class Base + # Find a Sass file relative to another file. + # Importers without a notion of "relative paths" + # should just return nil here. + # + # If the importer does have a notion of "relative paths", + # it should ignore its load path during this method. + # + # See \{#find} for important information on how this method should behave. + # + # The `:filename` option passed to the returned {Sass::Engine} + # should be of a format that could be passed to \{#find}. + # + # @param uri [String] The URI to import. This is not necessarily relative, + # but this method should only return true if it is. + # @param base [String] The base filename. If `uri` is relative, + # it should be interpreted as relative to `base`. + # `base` is guaranteed to be in a format importable by this importer. + # @param options [{Symbol => Object}] Options for the Sass file + # containing the `@import` that's currently being resolved. + # @return [Sass::Engine, nil] An Engine containing the imported file, + # or nil if it couldn't be found or was in the wrong format. + def find_relative(uri, base, options) + Sass::Util.abstract(self) + end + + # Find a Sass file, if it exists. + # + # This is the primary entry point of the Importer. + # It corresponds directly to an `@import` statement in Sass. + # It should do three basic things: + # + # * Determine if the URI is in this importer's format. + # If not, return nil. + # * Determine if the file indicated by the URI actually exists and is readable. + # If not, return nil. + # * Read the file and place the contents in a {Sass::Engine}. + # Return that engine. + # + # If this importer's format allows for file extensions, + # it should treat them the same way as the default {Filesystem} importer. + # If the URI explicitly has a `.sass` or `.scss` filename, + # the importer should look for that exact file + # and import it as the syntax indicated. + # If it doesn't exist, the importer should return nil. + # + # If the URI doesn't have either of these extensions, + # the importer should look for files with the extensions. + # If no such files exist, it should return nil. + # + # The {Sass::Engine} to be returned should be passed `options`, + # with a few modifications. `:syntax` should be set appropriately, + # `:filename` should be set to `uri`, + # and `:importer` should be set to this importer. + # + # @param uri [String] The URI to import. + # @param options [{Symbol => Object}] Options for the Sass file + # containing the `@import` that's currently being resolved. + # This is safe for subclasses to modify destructively. + # Callers should only pass in a value they don't mind being destructively modified. + # @return [Sass::Engine, nil] An Engine containing the imported file, + # or nil if it couldn't be found or was in the wrong format. + def find(uri, options) + Sass::Util.abstract(self) + end + + # Returns the time the given Sass file was last modified. + # + # If the given file has been deleted or the time can't be accessed + # for some other reason, this should return nil. + # + # @param uri [String] The URI of the file to check. + # Comes from a `:filename` option set on an engine returned by this importer. + # @param options [{Symbol => Object}] Options for the Sass file + # containing the `@import` currently being checked. + # @return [Time, nil] + def mtime(uri, options) + Sass::Util.abstract(self) + end + + # Get the cache key pair for the given Sass URI. + # The URI need not be checked for validity. + # + # The only strict requirement is that the returned pair of strings + # uniquely identify the file at the given URI. + # However, the first component generally corresponds roughly to the directory, + # and the second to the basename, of the URI. + # + # Note that keys must be unique *across importers*. + # Thus it's probably a good idea to include the importer name + # at the beginning of the first component. + # + # @param uri [String] A URI known to be valid for this importer. + # @param options [{Symbol => Object}] Options for the Sass file + # containing the `@import` currently being checked. + # @return [(String, String)] The key pair which uniquely identifies + # the file at the given URI. + def key(uri, options) + Sass::Util.abstract(self) + end + + # Get the publicly-visible URL for an imported file. This URL is used by + # source maps to link to the source stylesheet. This may return `nil` to + # indicate that no public URL is available; however, this will cause + # sourcemap generation to fail if any CSS is generated from files imported + # from this importer. + # + # If an absolute "file:" URI can be produced for an imported file, that + # should be preferred to returning `nil`. However, a URL relative to + # `sourcemap_directory` should be preferred over an absolute "file:" URI. + # + # @param uri [String] A URI known to be valid for this importer. + # @param sourcemap_directory [String, NilClass] The absolute path to a + # directory on disk where the sourcemap will be saved. If uri refers to + # a file on disk that's accessible relative to sourcemap_directory, this + # may return a relative URL. This may be `nil` if the sourcemap's + # eventual location is unknown. + # @return [String?] The publicly-visible URL for this file, or `nil` + # indicating that no publicly-visible URL exists. This should be + # appropriately URL-escaped. + def public_url(uri, sourcemap_directory) + return if @public_url_warning_issued + @public_url_warning_issued = true + Sass::Util.sass_warn <<WARNING +WARNING: #{self.class.name} should define the #public_url method. +WARNING + nil + end + + # A string representation of the importer. + # Should be overridden by subclasses. + # + # This is used to help debugging, + # and should usually just show the load path encapsulated by this importer. + # + # @return [String] + def to_s + Sass::Util.abstract(self) + end + + # If the importer is based on files on the local filesystem + # this method should return folders which should be watched + # for changes. + # + # @return [Array<String>] List of absolute paths of directories to watch + def directories_to_watch + [] + end + + # If this importer is based on files on the local filesystem This method + # should return true if the file, when changed, should trigger a + # recompile. + # + # It is acceptable for non-sass files to be watched and trigger a recompile. + # + # @param filename [String] The absolute filename for a file that has changed. + # @return [Boolean] When the file changed should cause a recompile. + def watched_file?(filename) + false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers/deprecated_path.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers/deprecated_path.rb new file mode 100644 index 000000000000..d817c9de87bd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers/deprecated_path.rb @@ -0,0 +1,51 @@ +module Sass + module Importers + # This importer emits a deprecation warning the first time it is used to + # import a file. It is used to deprecate the current working + # directory from the list of automatic sass load paths. + class DeprecatedPath < Filesystem + # @param root [String] The absolute, expanded path to the folder that is deprecated. + def initialize(root) + @specified_root = root + @warning_given = false + super + end + + # @see Sass::Importers::Base#find + def find(*args) + found = super + if found && !@warning_given + @warning_given = true + Sass::Util.sass_warn deprecation_warning + end + found + end + + # @see Base#directories_to_watch + def directories_to_watch + # The current working directory was not watched in Sass 3.2, + # so we continue not to watch it while it's deprecated. + [] + end + + # @see Sass::Importers::Base#to_s + def to_s + "#{@root} (DEPRECATED)" + end + + protected + + # @return [String] The deprecation warning that will be printed the first + # time an import occurs. + def deprecation_warning + path = @specified_root == "." ? "the current working directory" : @specified_root + <<WARNING +DEPRECATION WARNING: Importing from #{path} will not be +automatic in future versions of Sass. To avoid future errors, you can add it +to your environment explicitly by setting `SASS_PATH=#{@specified_root}`, by using the -I command +line option, or by changing your Sass configuration options. +WARNING + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers/filesystem.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers/filesystem.rb new file mode 100644 index 000000000000..d4d02dbe4673 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/importers/filesystem.rb @@ -0,0 +1,221 @@ +require 'set' + +module Sass + module Importers + # The default importer, used for any strings found in the load path. + # Simply loads Sass files from the filesystem using the default logic. + class Filesystem < Base + attr_accessor :root + + # Creates a new filesystem importer that imports files relative to a given path. + # + # @param root [String] The root path. + # This importer will import files relative to this path. + def initialize(root) + @root = File.expand_path(root) + @real_root = Sass::Util.realpath(@root).to_s + @same_name_warnings = Set.new + end + + # @see Base#find_relative + def find_relative(name, base, options) + _find(File.dirname(base), name, options) + end + + # @see Base#find + def find(name, options) + _find(@root, name, options) + end + + # @see Base#mtime + def mtime(name, options) + file, _ = Sass::Util.destructure(find_real_file(@root, name, options)) + File.mtime(file) if file + rescue Errno::ENOENT + nil + end + + # @see Base#key + def key(name, options) + [self.class.name + ":" + File.dirname(File.expand_path(name)), + File.basename(name)] + end + + # @see Base#to_s + def to_s + @root + end + + def hash + @root.hash + end + + def eql?(other) + !other.nil? && other.respond_to?(:root) && root.eql?(other.root) + end + + # @see Base#directories_to_watch + def directories_to_watch + [root] + end + + # @see Base#watched_file? + def watched_file?(filename) + # Check against the root with symlinks resolved, since Listen + # returns fully-resolved paths. + filename =~ /\.s[ac]ss$/ && filename.start_with?(@real_root + File::SEPARATOR) + end + + def public_url(name, sourcemap_directory) + file_pathname = Sass::Util.cleanpath(File.absolute_path(name, @root)) + return Sass::Util.file_uri_from_path(file_pathname) if sourcemap_directory.nil? + + sourcemap_pathname = Sass::Util.cleanpath(sourcemap_directory) + begin + Sass::Util.file_uri_from_path( + Sass::Util.relative_path_from(file_pathname, sourcemap_pathname)) + rescue ArgumentError # when a relative path cannot be constructed + Sass::Util.file_uri_from_path(file_pathname) + end + end + + protected + + # If a full uri is passed, this removes the root from it + # otherwise returns the name unchanged + def remove_root(name) + if name.index(@root + "/") == 0 + name[(@root.length + 1)..-1] + else + name + end + end + + # A hash from file extensions to the syntaxes for those extensions. + # The syntaxes must be `:sass` or `:scss`. + # + # This can be overridden by subclasses that want normal filesystem importing + # with unusual extensions. + # + # @return [{String => Symbol}] + def extensions + {'sass' => :sass, 'scss' => :scss} + end + + # Given an `@import`ed path, returns an array of possible + # on-disk filenames and their corresponding syntaxes for that path. + # + # @param name [String] The filename. + # @return [Array(String, Symbol)] An array of pairs. + # The first element of each pair is a filename to look for; + # the second element is the syntax that file would be in (`:sass` or `:scss`). + def possible_files(name) + name = escape_glob_characters(name) + dirname, basename, extname = split(name) + sorted_exts = extensions.sort + syntax = extensions[extname] + + if syntax + ret = [["#{dirname}/{_,}#{basename}.#{extensions.invert[syntax]}", syntax]] + else + ret = sorted_exts.map {|ext, syn| ["#{dirname}/{_,}#{basename}.#{ext}", syn]} + end + + # JRuby chokes when trying to import files from JARs when the path starts with './'. + ret.map {|f, s| [f.sub(%r{^\./}, ''), s]} + end + + def escape_glob_characters(name) + name.gsub(/[\*\[\]\{\}\?]/) do |char| + "\\#{char}" + end + end + + REDUNDANT_DIRECTORY = /#{Regexp.escape(File::SEPARATOR)}\.#{Regexp.escape(File::SEPARATOR)}/ + # Given a base directory and an `@import`ed name, + # finds an existent file that matches the name. + # + # @param dir [String] The directory relative to which to search. + # @param name [String] The filename to search for. + # @return [(String, Symbol)] A filename-syntax pair. + def find_real_file(dir, name, options) + # On windows 'dir' or 'name' can be in native File::ALT_SEPARATOR form. + dir = dir.gsub(File::ALT_SEPARATOR, File::SEPARATOR) unless File::ALT_SEPARATOR.nil? + name = name.gsub(File::ALT_SEPARATOR, File::SEPARATOR) unless File::ALT_SEPARATOR.nil? + + found = possible_files(remove_root(name)).map do |f, s| + path = if dir == "." || Sass::Util.pathname(f).absolute? + f + else + "#{escape_glob_characters(dir)}/#{f}" + end + Dir[path].map do |full_path| + full_path.gsub!(REDUNDANT_DIRECTORY, File::SEPARATOR) + [Sass::Util.cleanpath(full_path).to_s, s] + end + end.flatten(1) + if found.empty? && split(name)[2].nil? && File.directory?("#{dir}/#{name}") + return find_real_file("#{dir}/#{name}", "index", options) + end + + if found.size > 1 && !@same_name_warnings.include?(found.first.first) + found.each {|(f, _)| @same_name_warnings << f} + relative_to = Sass::Util.pathname(dir) + if options[:_from_import_node] + # If _line exists, we're here due to an actual import in an + # import_node and we want to print a warning for a user writing an + # ambiguous import. + candidates = found.map do |(f, _)| + " " + Sass::Util.pathname(f).relative_path_from(relative_to).to_s + end.join("\n") + raise Sass::SyntaxError.new(<<MESSAGE) +It's not clear which file to import for '@import "#{name}"'. +Candidates: +#{candidates} +Please delete or rename all but one of these files. +MESSAGE + else + # Otherwise, we're here via StalenessChecker, and we want to print a + # warning for a user running `sass --watch` with two ambiguous files. + candidates = found.map {|(f, _)| " " + File.basename(f)}.join("\n") + Sass::Util.sass_warn <<WARNING +WARNING: In #{File.dirname(name)}: + There are multiple files that match the name "#{File.basename(name)}": +#{candidates} +WARNING + end + end + found.first + end + + # Splits a filename into three parts, a directory part, a basename, and an extension + # Only the known extensions returned from the extensions method will be recognized as such. + def split(name) + extension = nil + dirname, basename = File.dirname(name), File.basename(name) + if basename =~ /^(.*)\.(#{extensions.keys.map {|e| Regexp.escape(e)}.join('|')})$/ + basename = $1 + extension = $2 + end + [dirname, basename, extension] + end + + private + + def _find(dir, name, options) + full_filename, syntax = Sass::Util.destructure(find_real_file(dir, name, options)) + return unless full_filename && File.file?(full_filename) && File.readable?(full_filename) + + # TODO: this preserves historical behavior, but it's possible + # :filename should be either normalized to the native format + # or consistently URI-format. + full_filename = full_filename.tr("\\", "/") if Sass::Util.windows? + + options[:syntax] = syntax + options[:filename] = full_filename + options[:importer] = self + Sass::Engine.new(File.read(full_filename), options) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger.rb new file mode 100644 index 000000000000..7b0fdf9ee232 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger.rb @@ -0,0 +1,17 @@ +module Sass::Logger; end + +require "sass/logger/log_level" +require "sass/logger/base" +require "sass/logger/delayed" + +module Sass + class << self + def logger=(l) + Thread.current[:sass_logger] = l + end + + def logger + Thread.current[:sass_logger] ||= Sass::Logger::Base.new + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger/base.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger/base.rb new file mode 100644 index 000000000000..1910b8fe1724 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger/base.rb @@ -0,0 +1,47 @@ +require 'sass/logger/log_level' + +class Sass::Logger::Base + include Sass::Logger::LogLevel + + attr_accessor :log_level + attr_accessor :disabled + attr_accessor :io + + log_level :trace + log_level :debug + log_level :info + log_level :warn + log_level :error + + def initialize(log_level = :debug, io = nil) + self.log_level = log_level + self.io = io + end + + def logging_level?(level) + !disabled && self.class.log_level?(level, log_level) + end + + # Captures all logger messages emitted during a block and returns them as a + # string. + def capture + old_io = io + self.io = StringIO.new + yield + io.string + ensure + self.io = old_io + end + + def log(level, message) + _log(level, message) if logging_level?(level) + end + + def _log(level, message) + if io + io.puts(message) + else + Kernel.warn(message) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger/delayed.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger/delayed.rb new file mode 100644 index 000000000000..393d8962fa2a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger/delayed.rb @@ -0,0 +1,50 @@ +require 'sass/logger/log_level' + +# A logger that delays messages until they're explicitly flushed to an inner +# logger. +# +# This can be installed around the current logger by calling \{#install!}, and +# the original logger can be replaced by calling \{#uninstall!}. The log +# messages can be flushed by calling \{#flush}. +class Sass::Logger::Delayed < Sass::Logger::Base + # Installs a new delayed logger as the current Sass logger, wrapping the + # original logger. + # + # This can be undone by calling \{#uninstall!}. + # + # @return [Sass::Logger::Delayed] The newly-created logger. + def self.install! + logger = Sass::Logger::Delayed.new(Sass.logger) + Sass.logger = logger + logger + end + + # Creates a delayed logger wrapping `inner`. + # + # @param inner [Sass::Logger::Base] The wrapped logger. + def initialize(inner) + self.log_level = inner.log_level + @inner = inner + @messages = [] + end + + # Flushes all queued logs to the wrapped logger. + def flush + @messages.each {|(l, m)| @inner.log(l, m)} + end + + # Uninstalls this logger from \{Sass.logger\}. This should only be called if + # the logger was installed using \{#install!} + def uninstall! + if Sass.logger != self + throw Exception.new("Can't uninstall a logger that's not currently installed.") + end + + @inner.log_level = log_level + Sass.logger = @inner + end + + def _log(level, message) + @messages << [level, message] + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger/log_level.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger/log_level.rb new file mode 100644 index 000000000000..39e7cec0efb3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/logger/log_level.rb @@ -0,0 +1,45 @@ +module Sass + module Logger + module LogLevel + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def inherited(subclass) + subclass.log_levels = subclass.superclass.log_levels.dup + end + + attr_writer :log_levels + + def log_levels + @log_levels ||= {} + end + + def log_level?(level, min_level) + log_levels[level] >= log_levels[min_level] + end + + def log_level(name, options = {}) + if options[:prepend] + level = log_levels.values.min + level = level.nil? ? 0 : level - 1 + else + level = log_levels.values.max + level = level.nil? ? 0 : level + 1 + end + log_levels.update(name => level) + define_logger(name) + end + + def define_logger(name, options = {}) + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{name}(message) + #{options.fetch(:to, :log)}(#{name.inspect}, message) + end + RUBY + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/media.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/media.rb new file mode 100644 index 000000000000..dc4542d4b854 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/media.rb @@ -0,0 +1,210 @@ +# A namespace for the `@media` query parse tree. +module Sass::Media + # A comma-separated list of queries. + # + # media_query [ ',' S* media_query ]* + class QueryList + # The queries contained in this list. + # + # @return [Array<Query>] + attr_accessor :queries + + # @param queries [Array<Query>] See \{#queries} + def initialize(queries) + @queries = queries + end + + # Merges this query list with another. The returned query list + # queries for the intersection between the two inputs. + # + # Both query lists should be resolved. + # + # @param other [QueryList] + # @return [QueryList?] The merged list, or nil if there is no intersection. + def merge(other) + new_queries = queries.map {|q1| other.queries.map {|q2| q1.merge(q2)}}.flatten.compact + return if new_queries.empty? + QueryList.new(new_queries) + end + + # Returns the CSS for the media query list. + # + # @return [String] + def to_css + queries.map {|q| q.to_css}.join(', ') + end + + # Returns the Sass/SCSS code for the media query list. + # + # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}). + # @return [String] + def to_src(options) + queries.map {|q| q.to_src(options)}.join(', ') + end + + # Returns a representation of the query as an array of strings and + # potentially {Sass::Script::Tree::Node}s (if there's interpolation in it). + # When the interpolation is resolved and the strings are joined together, + # this will be the string representation of this query. + # + # @return [Array<String, Sass::Script::Tree::Node>] + def to_a + Sass::Util.intersperse(queries.map {|q| q.to_a}, ', ').flatten + end + + # Returns a deep copy of this query list and all its children. + # + # @return [QueryList] + def deep_copy + QueryList.new(queries.map {|q| q.deep_copy}) + end + end + + # A single media query. + # + # [ [ONLY | NOT]? S* media_type S* | expression ] [ AND S* expression ]* + class Query + # The modifier for the query. + # + # When parsed as Sass code, this contains strings and SassScript nodes. When + # parsed as CSS, it contains a single string (accessible via + # \{#resolved_modifier}). + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :modifier + + # The type of the query (e.g. `"screen"` or `"print"`). + # + # When parsed as Sass code, this contains strings and SassScript nodes. When + # parsed as CSS, it contains a single string (accessible via + # \{#resolved_type}). + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :type + + # The trailing expressions in the query. + # + # When parsed as Sass code, each expression contains strings and SassScript + # nodes. When parsed as CSS, each one contains a single string. + # + # @return [Array<Array<String, Sass::Script::Tree::Node>>] + attr_accessor :expressions + + # @param modifier [Array<String, Sass::Script::Tree::Node>] See \{#modifier} + # @param type [Array<String, Sass::Script::Tree::Node>] See \{#type} + # @param expressions [Array<Array<String, Sass::Script::Tree::Node>>] See \{#expressions} + def initialize(modifier, type, expressions) + @modifier = modifier + @type = type + @expressions = expressions + end + + # See \{#modifier}. + # @return [String] + def resolved_modifier + # modifier should contain only a single string + modifier.first || '' + end + + # See \{#type}. + # @return [String] + def resolved_type + # type should contain only a single string + type.first || '' + end + + # Merges this query with another. The returned query queries for + # the intersection between the two inputs. + # + # Both queries should be resolved. + # + # @param other [Query] + # @return [Query?] The merged query, or nil if there is no intersection. + def merge(other) + m1, t1 = resolved_modifier.downcase, resolved_type.downcase + m2, t2 = other.resolved_modifier.downcase, other.resolved_type.downcase + t1 = t2 if t1.empty? + t2 = t1 if t2.empty? + if (m1 == 'not') ^ (m2 == 'not') + return if t1 == t2 + type = m1 == 'not' ? t2 : t1 + mod = m1 == 'not' ? m2 : m1 + elsif m1 == 'not' && m2 == 'not' + # CSS has no way of representing "neither screen nor print" + return unless t1 == t2 + type = t1 + mod = 'not' + elsif t1 != t2 + return + else # t1 == t2, neither m1 nor m2 are "not" + type = t1 + mod = m1.empty? ? m2 : m1 + end + Query.new([mod], [type], other.expressions + expressions) + end + + # Returns the CSS for the media query. + # + # @return [String] + def to_css + css = '' + css << resolved_modifier + css << ' ' unless resolved_modifier.empty? + css << resolved_type + css << ' and ' unless resolved_type.empty? || expressions.empty? + css << expressions.map do |e| + # It's possible for there to be script nodes in Expressions even when + # we're converting to CSS in the case where we parsed the document as + # CSS originally (as in css_test.rb). + e.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.to_sass : c.to_s}.join + end.join(' and ') + css + end + + # Returns the Sass/SCSS code for the media query. + # + # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}). + # @return [String] + def to_src(options) + src = '' + src << Sass::Media._interp_to_src(modifier, options) + src << ' ' unless modifier.empty? + src << Sass::Media._interp_to_src(type, options) + src << ' and ' unless type.empty? || expressions.empty? + src << expressions.map do |e| + Sass::Media._interp_to_src(e, options) + end.join(' and ') + src + end + + # @see \{MediaQuery#to\_a} + def to_a + res = [] + res += modifier + res << ' ' unless modifier.empty? + res += type + res << ' and ' unless type.empty? || expressions.empty? + res += Sass::Util.intersperse(expressions, ' and ').flatten + res + end + + # Returns a deep copy of this query and all its children. + # + # @return [Query] + def deep_copy + Query.new( + modifier.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}, + type.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}, + expressions.map {|e| e.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}}) + end + end + + # Converts an interpolation array to source. + # + # @param interp [Array<String, Sass::Script::Tree::Node>] The interpolation array to convert. + # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}). + # @return [String] + def self._interp_to_src(interp, options) + interp.map {|r| r.is_a?(String) ? r : r.to_sass(options)}.join + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin.rb new file mode 100644 index 000000000000..b558a9771139 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin.rb @@ -0,0 +1,134 @@ +require 'fileutils' + +require 'sass' +require 'sass/plugin/compiler' + +module Sass + # This module provides a single interface to the compilation of Sass/SCSS files + # for an application. It provides global options and checks whether CSS files + # need to be updated. + # + # This module is used as the primary interface with Sass + # when it's used as a plugin for various frameworks. + # All Rack-enabled frameworks are supported out of the box. + # The plugin is + # {file:SASS_REFERENCE.md#Rack_Rails_Merb_Plugin automatically activated for Rails and Merb}. + # Other frameworks must enable it explicitly; see {Sass::Plugin::Rack}. + # + # This module has a large set of callbacks available + # to allow users to run code (such as logging) when certain things happen. + # All callback methods are of the form `on_#{name}`, + # and they all take a block that's called when the given action occurs. + # + # Note that this class proxies almost all methods to its {Sass::Plugin::Compiler} instance. + # See \{#compiler}. + # + # @example Using a callback + # Sass::Plugin.on_updating_stylesheet do |template, css| + # puts "Compiling #{template} to #{css}" + # end + # Sass::Plugin.update_stylesheets + # #=> Compiling app/sass/screen.scss to public/stylesheets/screen.css + # #=> Compiling app/sass/print.scss to public/stylesheets/print.css + # #=> Compiling app/sass/ie.scss to public/stylesheets/ie.css + # @see Sass::Plugin::Compiler + module Plugin + extend self + + @checked_for_updates = false + + # Whether or not Sass has **ever** checked if the stylesheets need to be updated + # (in this Ruby instance). + # + # @return [Boolean] + attr_accessor :checked_for_updates + + # Same as \{#update\_stylesheets}, but respects \{#checked\_for\_updates} + # and the {file:SASS_REFERENCE.md#always_update-option `:always_update`} + # and {file:SASS_REFERENCE.md#always_check-option `:always_check`} options. + # + # @see #update_stylesheets + def check_for_updates + return unless !Sass::Plugin.checked_for_updates || + Sass::Plugin.options[:always_update] || Sass::Plugin.options[:always_check] + update_stylesheets + end + + # Returns the singleton compiler instance. + # This compiler has been pre-configured according + # to the plugin configuration. + # + # @return [Sass::Plugin::Compiler] + def compiler + @compiler ||= Compiler.new + end + + # Updates out-of-date stylesheets. + # + # Checks each Sass/SCSS file in + # {file:SASS_REFERENCE.md#template_location-option `:template_location`} + # to see if it's been modified more recently than the corresponding CSS file + # in {file:SASS_REFERENCE.md#css_location-option `:css_location`}. + # If it has, it updates the CSS file. + # + # @param individual_files [Array<(String, String)>] + # A list of files to check for updates + # **in addition to those specified by the + # {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.** + # The first string in each pair is the location of the Sass/SCSS file, + # the second is the location of the CSS file that it should be compiled to. + def update_stylesheets(individual_files = []) + return if options[:never_update] + compiler.update_stylesheets(individual_files) + end + + # Updates all stylesheets, even those that aren't out-of-date. + # Ignores the cache. + # + # @param individual_files [Array<(String, String)>] + # A list of files to check for updates + # **in addition to those specified by the + # {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.** + # The first string in each pair is the location of the Sass/SCSS file, + # the second is the location of the CSS file that it should be compiled to. + # @see #update_stylesheets + def force_update_stylesheets(individual_files = []) + Compiler.new( + options.dup.merge( + :never_update => false, + :always_update => true, + :cache => false)).update_stylesheets(individual_files) + end + + # All other method invocations are proxied to the \{#compiler}. + # + # @see #compiler + # @see Sass::Plugin::Compiler + def method_missing(method, *args, &block) + if compiler.respond_to?(method) + compiler.send(method, *args, &block) + else + super + end + end + + # For parity with method_missing + def respond_to?(method) + super || compiler.respond_to?(method) + end + + # There's a small speedup by not using method missing for frequently delegated methods. + def options + compiler.options + end + end +end + +if defined?(ActionController) + # On Rails 3+ the rails plugin is loaded at the right time in railtie.rb + require 'sass/plugin/rails' unless Sass::Util.ap_geq_3? +elsif defined?(Merb::Plugins) + require 'sass/plugin/merb' +else + require 'sass/plugin/generic' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/compiler.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/compiler.rb new file mode 100644 index 000000000000..f3ae6e3d8072 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/compiler.rb @@ -0,0 +1,552 @@ +require 'fileutils' + +require 'sass' +# XXX CE: is this still necessary now that we have the compiler class? +require 'sass/callbacks' +require 'sass/plugin/configuration' +require 'sass/plugin/staleness_checker' + +module Sass::Plugin + # The Compiler class handles compilation of multiple files and/or directories, + # including checking which CSS files are out-of-date and need to be updated + # and calling Sass to perform the compilation on those files. + # + # {Sass::Plugin} uses this class to update stylesheets for a single application. + # Unlike {Sass::Plugin}, though, the Compiler class has no global state, + # and so multiple instances may be created and used independently. + # + # If you need to compile a Sass string into CSS, + # please see the {Sass::Engine} class. + # + # Unlike {Sass::Plugin}, this class doesn't keep track of + # whether or how many times a stylesheet should be updated. + # Therefore, the following `Sass::Plugin` options are ignored by the Compiler: + # + # * `:never_update` + # * `:always_check` + class Compiler + include Configuration + extend Sass::Callbacks + + # Creates a new compiler. + # + # @param opts [{Symbol => Object}] + # See {file:SASS_REFERENCE.md#Options the Sass options documentation}. + def initialize(opts = {}) + @watched_files = Set.new + options.merge!(opts) + end + + # Register a callback to be run before stylesheets are mass-updated. + # This is run whenever \{#update\_stylesheets} is called, + # unless the \{file:SASS_REFERENCE.md#never_update-option `:never_update` option} + # is enabled. + # + # @yield [files] + # @yieldparam files [<(String, String, String)>] + # Individual files to be updated. Files in directories specified are included in this list. + # The first element of each pair is the source file, + # the second is the target CSS file, + # the third is the target sourcemap file. + define_callback :updating_stylesheets + + # Register a callback to be run after stylesheets are mass-updated. + # This is run whenever \{#update\_stylesheets} is called, + # unless the \{file:SASS_REFERENCE.md#never_update-option `:never_update` option} + # is enabled. + # + # @yield [updated_files] + # @yieldparam updated_files [<(String, String)>] + # Individual files that were updated. + # The first element of each pair is the source file, the second is the target CSS file. + define_callback :updated_stylesheets + + # Register a callback to be run after a single stylesheet is updated. + # The callback is only run if the stylesheet is really updated; + # if the CSS file is fresh, this won't be run. + # + # Even if the \{file:SASS_REFERENCE.md#full_exception-option `:full_exception` option} + # is enabled, this callback won't be run + # when an exception CSS file is being written. + # To run an action for those files, use \{#on\_compilation\_error}. + # + # @yield [template, css, sourcemap] + # @yieldparam template [String] + # The location of the Sass/SCSS file being updated. + # @yieldparam css [String] + # The location of the CSS file being generated. + # @yieldparam sourcemap [String] + # The location of the sourcemap being generated, if any. + define_callback :updated_stylesheet + + # Register a callback to be run when compilation starts. + # + # In combination with on_updated_stylesheet, this could be used + # to collect compilation statistics like timing or to take a + # diff of the changes to the output file. + # + # @yield [template, css, sourcemap] + # @yieldparam template [String] + # The location of the Sass/SCSS file being updated. + # @yieldparam css [String] + # The location of the CSS file being generated. + # @yieldparam sourcemap [String] + # The location of the sourcemap being generated, if any. + define_callback :compilation_starting + + # Register a callback to be run when Sass decides not to update a stylesheet. + # In particular, the callback is run when Sass finds that + # the template file and none of its dependencies + # have been modified since the last compilation. + # + # Note that this is **not** run when the + # \{file:SASS_REFERENCE.md#never-update_option `:never_update` option} is set, + # nor when Sass decides not to compile a partial. + # + # @yield [template, css] + # @yieldparam template [String] + # The location of the Sass/SCSS file not being updated. + # @yieldparam css [String] + # The location of the CSS file not being generated. + define_callback :not_updating_stylesheet + + # Register a callback to be run when there's an error + # compiling a Sass file. + # This could include not only errors in the Sass document, + # but also errors accessing the file at all. + # + # @yield [error, template, css] + # @yieldparam error [Exception] The exception that was raised. + # @yieldparam template [String] + # The location of the Sass/SCSS file being updated. + # @yieldparam css [String] + # The location of the CSS file being generated. + define_callback :compilation_error + + # Register a callback to be run when Sass creates a directory + # into which to put CSS files. + # + # Note that even if multiple levels of directories need to be created, + # the callback may only be run once. + # For example, if "foo/" exists and "foo/bar/baz/" needs to be created, + # this may only be run for "foo/bar/baz/". + # This is not a guarantee, however; + # it may also be run for "foo/bar/". + # + # @yield [dirname] + # @yieldparam dirname [String] + # The location of the directory that was created. + define_callback :creating_directory + + # Register a callback to be run when Sass detects + # that a template has been modified. + # This is only run when using \{#watch}. + # + # @yield [template] + # @yieldparam template [String] + # The location of the template that was modified. + define_callback :template_modified + + # Register a callback to be run when Sass detects + # that a new template has been created. + # This is only run when using \{#watch}. + # + # @yield [template] + # @yieldparam template [String] + # The location of the template that was created. + define_callback :template_created + + # Register a callback to be run when Sass detects + # that a template has been deleted. + # This is only run when using \{#watch}. + # + # @yield [template] + # @yieldparam template [String] + # The location of the template that was deleted. + define_callback :template_deleted + + # Register a callback to be run when Sass deletes a CSS file. + # This happens when the corresponding Sass/SCSS file has been deleted + # and when the compiler cleans the output files. + # + # @yield [filename] + # @yieldparam filename [String] + # The location of the CSS file that was deleted. + define_callback :deleting_css + + # Register a callback to be run when Sass deletes a sourcemap file. + # This happens when the corresponding Sass/SCSS file has been deleted + # and when the compiler cleans the output files. + # + # @yield [filename] + # @yieldparam filename [String] + # The location of the sourcemap file that was deleted. + define_callback :deleting_sourcemap + + # Updates out-of-date stylesheets. + # + # Checks each Sass/SCSS file in + # {file:SASS_REFERENCE.md#template_location-option `:template_location`} + # to see if it's been modified more recently than the corresponding CSS file + # in {file:SASS_REFERENCE.md#css_location-option `:css_location`}. + # If it has, it updates the CSS file. + # + # @param individual_files [Array<(String, String[, String])>] + # A list of files to check for updates + # **in addition to those specified by the + # {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.** + # The first string in each pair is the location of the Sass/SCSS file, + # the second is the location of the CSS file that it should be compiled to. + # The third string, if provided, is the location of the Sourcemap file. + def update_stylesheets(individual_files = []) + Sass::Plugin.checked_for_updates = true + staleness_checker = StalenessChecker.new(engine_options) + + files = file_list(individual_files) + run_updating_stylesheets(files) + + updated_stylesheets = [] + files.each do |file, css, sourcemap| + # TODO: Does staleness_checker need to check the sourcemap file as well? + if options[:always_update] || staleness_checker.stylesheet_needs_update?(css, file) + # XXX For consistency, this should return the sourcemap too, but it would + # XXX be an API change. + updated_stylesheets << [file, css] + update_stylesheet(file, css, sourcemap) + else + run_not_updating_stylesheet(file, css, sourcemap) + end + end + run_updated_stylesheets(updated_stylesheets) + end + + # Construct a list of files that might need to be compiled + # from the provided individual_files and the template_locations. + # + # Note: this method does not cache the results as they can change + # across invocations when sass files are added or removed. + # + # @param individual_files [Array<(String, String[, String])>] + # A list of files to check for updates + # **in addition to those specified by the + # {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.** + # The first string in each pair is the location of the Sass/SCSS file, + # the second is the location of the CSS file that it should be compiled to. + # The third string, if provided, is the location of the Sourcemap file. + # @return [Array<(String, String, String)>] + # A list of [sass_file, css_file, sourcemap_file] tuples similar + # to what was passed in, but expanded to include the current state + # of the directories being updated. + def file_list(individual_files = []) + files = individual_files.map do |tuple| + if engine_options[:sourcemap] == :none + tuple[0..1] + elsif tuple.size < 3 + [tuple[0], tuple[1], Sass::Util.sourcemap_name(tuple[1])] + else + tuple.dup + end + end + + template_location_array.each do |template_location, css_location| + Sass::Util.glob(File.join(template_location, "**", "[^_]*.s[ca]ss")).sort.each do |file| + # Get the relative path to the file + name = Sass::Util.relative_path_from(file, template_location).to_s + css = css_filename(name, css_location) + sourcemap = Sass::Util.sourcemap_name(css) unless engine_options[:sourcemap] == :none + files << [file, css, sourcemap] + end + end + files + end + + # Watches the template directory (or directories) + # and updates the CSS files whenever the related Sass/SCSS files change. + # `watch` never returns. + # + # Whenever a change is detected to a Sass/SCSS file in + # {file:SASS_REFERENCE.md#template_location-option `:template_location`}, + # the corresponding CSS file in {file:SASS_REFERENCE.md#css_location-option `:css_location`} + # will be recompiled. + # The CSS files of any Sass/SCSS files that import the changed file will also be recompiled. + # + # Before the watching starts in earnest, `watch` calls \{#update\_stylesheets}. + # + # Note that `watch` uses the [Listen](http://github.com/guard/listen) library + # to monitor the filesystem for changes. + # Listen isn't loaded until `watch` is run. + # The version of Listen distributed with Sass is loaded by default, + # but if another version has already been loaded that will be used instead. + # + # @param individual_files [Array<(String, String[, String])>] + # A list of files to check for updates + # **in addition to those specified by the + # {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.** + # The first string in each pair is the location of the Sass/SCSS file, + # the second is the location of the CSS file that it should be compiled to. + # The third string, if provided, is the location of the Sourcemap file. + # @param options [Hash] The options that control how watching works. + # @option options [Boolean] :skip_initial_update + # Don't do an initial update when starting the watcher when true + def watch(individual_files = [], options = {}) + @inferred_directories = [] + options, individual_files = individual_files, [] if individual_files.is_a?(Hash) + update_stylesheets(individual_files) unless options[:skip_initial_update] + + directories = watched_paths + individual_files.each do |(source, _, _)| + source = File.expand_path(source) + @watched_files << Sass::Util.realpath(source).to_s + @inferred_directories << File.dirname(source) + end + + directories += @inferred_directories + directories = remove_redundant_directories(directories) + + # TODO: Keep better track of what depends on what + # so we don't have to run a global update every time anything changes. + # XXX The :additional_watch_paths option exists for Compass to use until + # a deprecated feature is removed. It may be removed without warning. + directories += Array(options[:additional_watch_paths]) + + options = { + :relative_paths => false, + # The native windows listener is much slower than the polling option, according to + # https://github.com/nex3/sass/commit/a3031856b22bc834a5417dedecb038b7be9b9e3e + :force_polling => @options[:poll] || Sass::Util.windows? + } + + listener = create_listener(*directories, options) do |modified, added, removed| + on_file_changed(individual_files, modified, added, removed) + yield(modified, added, removed) if block_given? + end + + begin + listener.start + sleep + rescue Interrupt + # Squelch Interrupt for clean exit from Listen::Listener + end + end + + # Non-destructively modifies \{#options} so that default values are properly set, + # and returns the result. + # + # @param additional_options [{Symbol => Object}] An options hash with which to merge \{#options} + # @return [{Symbol => Object}] The modified options hash + def engine_options(additional_options = {}) + opts = options.merge(additional_options) + opts[:load_paths] = load_paths(opts) + options[:sourcemap] = :auto if options[:sourcemap] == true + options[:sourcemap] = :none if options[:sourcemap] == false + opts + end + + # Compass expects this to exist + def stylesheet_needs_update?(css_file, template_file) + StalenessChecker.stylesheet_needs_update?(css_file, template_file) + end + + # Remove all output files that would be created by calling update_stylesheets, if they exist. + # + # This method runs the deleting_css and deleting_sourcemap callbacks for + # the files that are deleted. + # + # @param individual_files [Array<(String, String[, String])>] + # A list of files to check for updates + # **in addition to those specified by the + # {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.** + # The first string in each pair is the location of the Sass/SCSS file, + # the second is the location of the CSS file that it should be compiled to. + # The third string, if provided, is the location of the Sourcemap file. + def clean(individual_files = []) + file_list(individual_files).each do |(_, css_file, sourcemap_file)| + if File.exist?(css_file) + run_deleting_css css_file + File.delete(css_file) + end + if sourcemap_file && File.exist?(sourcemap_file) + run_deleting_sourcemap sourcemap_file + File.delete(sourcemap_file) + end + end + nil + end + + private + + # This is mocked out in compiler_test.rb. + def create_listener(*args, &block) + require 'sass-listen' + SassListen.to(*args, &block) + end + + def remove_redundant_directories(directories) + dedupped = [] + directories.each do |new_directory| + # no need to add a directory that is already watched. + next if dedupped.any? do |existing_directory| + child_of_directory?(existing_directory, new_directory) + end + # get rid of any sub directories of this new directory + dedupped.reject! do |existing_directory| + child_of_directory?(new_directory, existing_directory) + end + dedupped << new_directory + end + dedupped + end + + def on_file_changed(individual_files, modified, added, removed) + recompile_required = false + + modified.uniq.each do |f| + next unless watched_file?(f) + recompile_required = true + run_template_modified(relative_to_pwd(f)) + end + + added.uniq.each do |f| + next unless watched_file?(f) + recompile_required = true + run_template_created(relative_to_pwd(f)) + end + + removed.uniq.each do |f| + next unless watched_file?(f) + run_template_deleted(relative_to_pwd(f)) + if (files = individual_files.find {|(source, _, _)| File.expand_path(source) == f}) + recompile_required = true + # This was a file we were watching explicitly and compiling to a particular location. + # Delete the corresponding file. + try_delete_css files[1] + else + next unless watched_file?(f) + recompile_required = true + # Look for the sass directory that contained the sass file + # And try to remove the css file that corresponds to it + template_location_array.each do |(sass_dir, css_dir)| + sass_dir = File.expand_path(sass_dir) + next unless child_of_directory?(sass_dir, f) + remainder = f[(sass_dir.size + 1)..-1] + try_delete_css(css_filename(remainder, css_dir)) + break + end + end + end + + return unless recompile_required + + # In case a file we're watching is removed and then recreated we + # prune out the non-existant files here. + watched_files_remaining = individual_files.select {|(source, _, _)| File.exist?(source)} + update_stylesheets(watched_files_remaining) + end + + def update_stylesheet(filename, css, sourcemap) + dir = File.dirname(css) + unless File.exist?(dir) + run_creating_directory dir + FileUtils.mkdir_p dir + end + + begin + File.read(filename) unless File.readable?(filename) # triggers an error for handling + engine_opts = engine_options(:css_filename => css, + :filename => filename, + :sourcemap_filename => sourcemap) + mapping = nil + run_compilation_starting(filename, css, sourcemap) + engine = Sass::Engine.for_file(filename, engine_opts) + if sourcemap + rendered, mapping = engine.render_with_sourcemap(File.basename(sourcemap)) + else + rendered = engine.render + end + rescue StandardError => e + compilation_error_occurred = true + run_compilation_error e, filename, css, sourcemap + raise e unless options[:full_exception] + rendered = Sass::SyntaxError.exception_to_css(e, options[:line] || 1) + end + + write_file(css, rendered) + if mapping + write_file( + sourcemap, + mapping.to_json( + :css_path => css, :sourcemap_path => sourcemap, :type => options[:sourcemap])) + end + run_updated_stylesheet(filename, css, sourcemap) unless compilation_error_occurred + end + + def write_file(fileName, content) + flag = 'w' + flag = 'wb' if Sass::Util.windows? && options[:unix_newlines] + File.open(fileName, flag) do |file| + file.set_encoding(content.encoding) + file.print(content) + end + end + + def try_delete_css(css) + if File.exist?(css) + run_deleting_css css + File.delete css + end + map = Sass::Util.sourcemap_name(css) + + return unless File.exist?(map) + + run_deleting_sourcemap map + File.delete map + end + + def watched_file?(file) + @watched_files.include?(file) || + normalized_load_paths.any? {|lp| lp.watched_file?(file)} || + @inferred_directories.any? {|d| sass_file_in_directory?(d, file)} + end + + def sass_file_in_directory?(directory, filename) + filename =~ /\.s[ac]ss$/ && filename.start_with?(directory + File::SEPARATOR) + end + + def watched_paths + @watched_paths ||= normalized_load_paths.map {|lp| lp.directories_to_watch}.compact.flatten + end + + def normalized_load_paths + @normalized_load_paths ||= + Sass::Engine.normalize_options(:load_paths => load_paths)[:load_paths] + end + + def load_paths(opts = options) + (opts[:load_paths] || []) + template_locations + end + + def template_locations + template_location_array.to_a.map {|l| l.first} + end + + def css_locations + template_location_array.to_a.map {|l| l.last} + end + + def css_filename(name, path) + "#{path}#{File::SEPARATOR unless path.end_with?(File::SEPARATOR)}#{name}". + gsub(/\.s[ac]ss$/, '.css') + end + + def relative_to_pwd(f) + Sass::Util.relative_path_from(f, Dir.pwd).to_s + rescue ArgumentError # when a relative path cannot be computed + f + end + + def child_of_directory?(parent, child) + parent_dir = parent.end_with?(File::SEPARATOR) ? parent : (parent + File::SEPARATOR) + child.start_with?(parent_dir) || parent == child + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/configuration.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/configuration.rb new file mode 100644 index 000000000000..93a8aa807da7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/configuration.rb @@ -0,0 +1,134 @@ +module Sass + module Plugin + # We keep configuration in its own self-contained file so that we can load + # it independently in Rails 3, where the full plugin stuff is lazy-loaded. + # + # Note that this is not guaranteed to be thread-safe. For guaranteed thread + # safety, use a separate {Sass::Plugin} for each thread. + module Configuration + # Returns the default options for a {Sass::Plugin::Compiler}. + # + # @return [{Symbol => Object}] + def default_options + @default_options ||= { + :css_location => './public/stylesheets', + :always_update => false, + :always_check => true, + :full_exception => true, + :cache_location => ".sass-cache" + }.freeze + end + + # Resets the options and + # {Sass::Callbacks::InstanceMethods#clear_callbacks! clears all callbacks}. + def reset! + @options = nil + clear_callbacks! + end + + # An options hash. See {file:SASS_REFERENCE.md#Options the Sass options + # documentation}. + # + # @return [{Symbol => Object}] + def options + @options ||= default_options.dup + end + + # Adds a new template-location/css-location mapping. + # This means that Sass/SCSS files in `template_location` + # will be compiled to CSS files in `css_location`. + # + # This is preferred over manually manipulating the + # {file:SASS_REFERENCE.md#template_location-option `:template_location` option} + # since the option can be in multiple formats. + # + # Note that this method will change `options[:template_location]` + # to be in the Array format. + # This means that even if `options[:template_location]` + # had previously been a Hash or a String, + # it will now be an Array. + # + # @param template_location [String] The location where Sass/SCSS files will be. + # @param css_location [String] The location where compiled CSS files will go. + def add_template_location(template_location, css_location = options[:css_location]) + normalize_template_location! + template_location_array << [template_location, css_location] + end + + # Removes a template-location/css-location mapping. + # This means that Sass/SCSS files in `template_location` + # will no longer be compiled to CSS files in `css_location`. + # + # This is preferred over manually manipulating the + # {file:SASS_REFERENCE.md#template_location-option `:template_location` option} + # since the option can be in multiple formats. + # + # Note that this method will change `options[:template_location]` + # to be in the Array format. + # This means that even if `options[:template_location]` + # had previously been a Hash or a String, + # it will now be an Array. + # + # @param template_location [String] + # The location where Sass/SCSS files were, + # which is now going to be ignored. + # @param css_location [String] + # The location where compiled CSS files went, but will no longer go. + # @return [Boolean] + # Non-`nil` if the given mapping already existed and was removed, + # or `nil` if nothing was changed. + def remove_template_location(template_location, css_location = options[:css_location]) + normalize_template_location! + template_location_array.delete([template_location, css_location]) + end + + # Returns the template locations configured for Sass + # as an array of `[template_location, css_location]` pairs. + # See the {file:SASS_REFERENCE.md#template_location-option `:template_location` option} + # for details. + # + # Modifications to the returned array may not be persistent. Use {#add_template_location} + # and {#remove_template_location} instead. + # + # @return [Array<(String, String)>] + # An array of `[template_location, css_location]` pairs. + def template_location_array + convert_template_location(options[:template_location], options[:css_location]) + end + + private + + # Returns the given template location, as an array. If it's already an array, + # it is returned unmodified. Otherwise, a new array is created and returned. + # + # @param template_location [String, Array<(String, String)>] + # A single template location, or a pre-normalized array of template + # locations and CSS locations. + # @param css_location [String?] + # The location for compiled CSS files. + # @return [Array<(String, String)>] + # An array of `[template_location, css_location]` pairs. + def convert_template_location(template_location, css_location) + return template_location if template_location.is_a?(Array) + + case template_location + when nil + if css_location + [[File.join(css_location, 'sass'), css_location]] + else + [] + end + when String + [[template_location, css_location]] + else + template_location.to_a + end + end + + def normalize_template_location! + options[:template_location] = convert_template_location( + options[:template_location], options[:css_location]) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/generic.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/generic.rb new file mode 100644 index 000000000000..3e82d2d0e4d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/generic.rb @@ -0,0 +1,15 @@ +# The reason some options are declared here rather than in sass/plugin/configuration.rb +# is that otherwise they'd clobber the Rails-specific options. +# Since Rails' options are lazy-loaded in Rails 3, +# they're reverse-merged with the default options +# so that user configuration is preserved. +# This means that defaults that differ from Rails' +# must be declared here. + +unless defined?(Sass::GENERIC_LOADED) + Sass::GENERIC_LOADED = true + + Sass::Plugin.options.merge!(:css_location => './public/stylesheets', + :always_update => false, + :always_check => true) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/merb.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/merb.rb new file mode 100644 index 000000000000..c8f66b1e0bd9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/merb.rb @@ -0,0 +1,48 @@ +unless defined?(Sass::MERB_LOADED) + Sass::MERB_LOADED = true + + module Sass::Plugin::Configuration + # Different default options in a m environment. + def default_options + @default_options ||= begin + version = Merb::VERSION.split('.').map {|n| n.to_i} + if version[0] <= 0 && version[1] < 5 + root = MERB_ROOT + env = MERB_ENV + else + root = Merb.root.to_s + env = Merb.environment + end + + { + :always_update => false, + :template_location => root + '/public/stylesheets/sass', + :css_location => root + '/public/stylesheets', + :cache_location => root + '/tmp/sass-cache', + :always_check => env != "production", + :quiet => env != "production", + :full_exception => env != "production" + }.freeze + end + end + end + + config = Merb::Plugins.config[:sass] || Merb::Plugins.config["sass"] || {} + + if defined? config.symbolize_keys! + config.symbolize_keys! + end + + Sass::Plugin.options.merge!(config) + + require 'sass/plugin/rack' + class Sass::Plugin::MerbBootLoader < Merb::BootLoader + after Merb::BootLoader::RackUpApplication + + def self.run + # Apparently there's no better way than this to add Sass + # to Merb's Rack stack. + Merb::Config[:app] = Sass::Plugin::Rack.new(Merb::Config[:app]) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/rack.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/rack.rb new file mode 100644 index 000000000000..a147aea94f1f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/rack.rb @@ -0,0 +1,60 @@ +module Sass + module Plugin + # Rack middleware for compiling Sass code. + # + # ## Activate + # + # require 'sass/plugin/rack' + # use Sass::Plugin::Rack + # + # ## Customize + # + # Sass::Plugin.options.merge!( + # :cache_location => './tmp/sass-cache', + # :never_update => environment != :production, + # :full_exception => environment != :production) + # + # {file:SASS_REFERENCE.md#Options See the Reference for more options}. + # + # ## Use + # + # Put your Sass files in `public/stylesheets/sass`. + # Your CSS will be generated in `public/stylesheets`, + # and regenerated every request if necessary. + # The locations and frequency {file:SASS_REFERENCE.md#Options can be customized}. + # That's all there is to it! + class Rack + # The delay, in seconds, between update checks. + # Useful when many resources are requested for a single page. + # `nil` means no delay at all. + # + # @return [Float] + attr_accessor :dwell + + # Initialize the middleware. + # + # @param app [#call] The Rack application + # @param dwell [Float] See \{#dwell} + def initialize(app, dwell = 1.0) + @app = app + @dwell = dwell + @check_after = Time.now.to_f + end + + # Process a request, checking the Sass stylesheets for changes + # and updating them if necessary. + # + # @param env The Rack request environment + # @return [(#to_i, {String => String}, Object)] The Rack response + def call(env) + if @dwell.nil? || Time.now.to_f > @check_after + Sass::Plugin.check_for_updates + @check_after = Time.now.to_f + @dwell if @dwell + end + @app.call(env) + end + end + end +end + +require 'sass/plugin' diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/rails.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/rails.rb new file mode 100644 index 000000000000..9e1677f7bcee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/rails.rb @@ -0,0 +1,47 @@ +unless defined?(Sass::RAILS_LOADED) + Sass::RAILS_LOADED = true + + module Sass::Plugin::Configuration + # Different default options in a rails environment. + def default_options + return @default_options if @default_options + opts = { + :quiet => Sass::Util.rails_env != "production", + :full_exception => Sass::Util.rails_env != "production", + :cache_location => Sass::Util.rails_root + '/tmp/sass-cache' + } + + opts.merge!( + :always_update => false, + :template_location => Sass::Util.rails_root + '/public/stylesheets/sass', + :css_location => Sass::Util.rails_root + '/public/stylesheets', + :always_check => Sass::Util.rails_env == "development") + + @default_options = opts.freeze + end + end + + Sass::Plugin.options.reverse_merge!(Sass::Plugin.default_options) + + # Rails 3.1 loads and handles Sass all on its own + if defined?(ActionController::Metal) + # 3.1 > Rails >= 3.0 + require 'sass/plugin/rack' + Rails.configuration.middleware.use(Sass::Plugin::Rack) + elsif defined?(ActionController::Dispatcher) && + defined?(ActionController::Dispatcher.middleware) + # Rails >= 2.3 + require 'sass/plugin/rack' + ActionController::Dispatcher.middleware.use(Sass::Plugin::Rack) + else + module ActionController + class Base + alias_method :sass_old_process, :process + def process(*args) + Sass::Plugin.check_for_updates + sass_old_process(*args) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/staleness_checker.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/staleness_checker.rb new file mode 100644 index 000000000000..cecc0014cc1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/plugin/staleness_checker.rb @@ -0,0 +1,199 @@ +require 'thread' + +module Sass + module Plugin + # The class handles `.s[ca]ss` file staleness checks via their mtime timestamps. + # + # To speed things up two level of caches are employed: + # + # * A class-level dependency cache which stores @import paths for each file. + # This is a long-lived cache that is reused by every StalenessChecker instance. + # * Three short-lived instance-level caches, one for file mtimes, + # one for whether a file is stale during this particular run. + # and one for the parse tree for a file. + # These are only used by a single StalenessChecker instance. + # + # Usage: + # + # * For a one-off staleness check of a single `.s[ca]ss` file, + # the class-level {stylesheet_needs_update?} method + # should be used. + # * For a series of staleness checks (e.g. checking all files for staleness) + # a StalenessChecker instance should be created, + # and the instance-level \{#stylesheet\_needs\_update?} method should be used. + # the caches should make the whole process significantly faster. + # *WARNING*: It is important not to retain the instance for too long, + # as its instance-level caches are never explicitly expired. + class StalenessChecker + @dependencies_cache = {} + @dependency_cache_mutex = Mutex.new + + class << self + # TODO: attach this to a compiler instance. + # @private + attr_accessor :dependencies_cache + attr_reader :dependency_cache_mutex + end + + # Creates a new StalenessChecker + # for checking the staleness of several stylesheets at once. + # + # @param options [{Symbol => Object}] + # See {file:SASS_REFERENCE.md#Options the Sass options documentation}. + def initialize(options) + # URIs that are being actively checked for staleness. Protects against + # import loops. + @actively_checking = Set.new + + # Entries in the following instance-level caches are never explicitly expired. + # Instead they are supposed to automatically go out of scope when a series of staleness + # checks (this instance of StalenessChecker was created for) is finished. + @mtimes, @dependencies_stale, @parse_trees = {}, {}, {} + @options = Sass::Engine.normalize_options(options) + end + + # Returns whether or not a given CSS file is out of date + # and needs to be regenerated. + # + # @param css_file [String] The location of the CSS file to check. + # @param template_file [String] The location of the Sass or SCSS template + # that is compiled to `css_file`. + # @return [Boolean] Whether the stylesheet needs to be updated. + def stylesheet_needs_update?(css_file, template_file, importer = nil) + template_file = File.expand_path(template_file) + begin + css_mtime = File.mtime(css_file) + rescue Errno::ENOENT + return true + end + stylesheet_modified_since?(template_file, css_mtime, importer) + end + + # Returns whether a Sass or SCSS stylesheet has been modified since a given time. + # + # @param template_file [String] The location of the Sass or SCSS template. + # @param mtime [Time] The modification time to check against. + # @param importer [Sass::Importers::Base] The importer used to locate the stylesheet. + # Defaults to the filesystem importer. + # @return [Boolean] Whether the stylesheet has been modified. + def stylesheet_modified_since?(template_file, mtime, importer = nil) + importer ||= @options[:filesystem_importer].new(".") + dependency_updated?(mtime).call(template_file, importer) + end + + # Returns whether or not a given CSS file is out of date + # and needs to be regenerated. + # + # The distinction between this method and the instance-level \{#stylesheet\_needs\_update?} + # is that the instance method preserves mtime and stale-dependency caches, + # so it's better to use when checking multiple stylesheets at once. + # + # @param css_file [String] The location of the CSS file to check. + # @param template_file [String] The location of the Sass or SCSS template + # that is compiled to `css_file`. + # @return [Boolean] Whether the stylesheet needs to be updated. + def self.stylesheet_needs_update?(css_file, template_file, importer = nil) + new(Plugin.engine_options).stylesheet_needs_update?(css_file, template_file, importer) + end + + # Returns whether a Sass or SCSS stylesheet has been modified since a given time. + # + # The distinction between this method and the instance-level \{#stylesheet\_modified\_since?} + # is that the instance method preserves mtime and stale-dependency caches, + # so it's better to use when checking multiple stylesheets at once. + # + # @param template_file [String] The location of the Sass or SCSS template. + # @param mtime [Time] The modification time to check against. + # @param importer [Sass::Importers::Base] The importer used to locate the stylesheet. + # Defaults to the filesystem importer. + # @return [Boolean] Whether the stylesheet has been modified. + def self.stylesheet_modified_since?(template_file, mtime, importer = nil) + new(Plugin.engine_options).stylesheet_modified_since?(template_file, mtime, importer) + end + + private + + def dependencies_stale?(uri, importer, css_mtime) + timestamps = @dependencies_stale[[uri, importer]] ||= {} + timestamps.each_pair do |checked_css_mtime, is_stale| + if checked_css_mtime <= css_mtime && !is_stale + return false + elsif checked_css_mtime > css_mtime && is_stale + return true + end + end + timestamps[css_mtime] = dependencies(uri, importer).any?(&dependency_updated?(css_mtime)) + rescue Sass::SyntaxError + # If there's an error finding dependencies, default to recompiling. + true + end + + def mtime(uri, importer) + @mtimes[[uri, importer]] ||= + begin + mtime = importer.mtime(uri, @options) + if mtime.nil? + with_dependency_cache {|cache| cache.delete([uri, importer])} + nil + else + mtime + end + end + end + + def dependencies(uri, importer) + stored_mtime, dependencies = + with_dependency_cache {|cache| Sass::Util.destructure(cache[[uri, importer]])} + + if !stored_mtime || stored_mtime < mtime(uri, importer) + dependencies = compute_dependencies(uri, importer) + with_dependency_cache do |cache| + cache[[uri, importer]] = [mtime(uri, importer), dependencies] + end + end + + dependencies + end + + def dependency_updated?(css_mtime) + proc do |uri, importer| + next true if @actively_checking.include?(uri) + begin + @actively_checking << uri + sass_mtime = mtime(uri, importer) + !sass_mtime || + sass_mtime > css_mtime || + dependencies_stale?(uri, importer, css_mtime) + ensure + @actively_checking.delete uri + end + end + end + + def compute_dependencies(uri, importer) + tree(uri, importer).grep(Tree::ImportNode) do |n| + next if n.css_import? + file = n.imported_file + key = [file.options[:filename], file.options[:importer]] + @parse_trees[key] = file.to_tree + key + end.compact + end + + def tree(uri, importer) + @parse_trees[[uri, importer]] ||= importer.find(uri, @options).to_tree + end + + # Get access to the global dependency cache in a threadsafe manner. + # Inside the block, no other thread can access the dependency cache. + # + # @yieldparam cache [Hash] The hash that is the global dependency cache + # @return The value returned by the block to which this method yields + def with_dependency_cache + StalenessChecker.dependency_cache_mutex.synchronize do + yield StalenessChecker.dependencies_cache + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/railtie.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/railtie.rb new file mode 100644 index 000000000000..ad1f03d034b2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/railtie.rb @@ -0,0 +1,10 @@ +# Rails 3.0.0.beta.2+, < 3.1 +if defined?(ActiveSupport) && ActiveSupport.public_methods.include?(:on_load) && + !Sass::Util.ap_geq?('3.1.0.beta') + require 'sass/plugin/configuration' + ActiveSupport.on_load(:before_configuration) do + require 'sass' + require 'sass/plugin' + require 'sass/plugin/rails' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/repl.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/repl.rb new file mode 100644 index 000000000000..e9b9e6ccc772 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/repl.rb @@ -0,0 +1,57 @@ +require 'readline' + +module Sass + # Runs a SassScript read-eval-print loop. + # It presents a prompt on the terminal, + # reads in SassScript expressions, + # evaluates them, + # and prints the result. + class Repl + # @param options [{Symbol => Object}] An options hash. + def initialize(options = {}) + @options = options + end + + # Starts the read-eval-print loop. + def run + environment = Environment.new + @line = 0 + loop do + @line += 1 + unless (text = Readline.readline('>> ')) + puts + return + end + + Readline::HISTORY << text + parse_input(environment, text) + end + end + + private + + def parse_input(environment, text) + case text + when Script::MATCH + name = $1 + guarded = !!$3 + val = Script::Parser.parse($2, @line, text.size - ($3 || '').size - $2.size) + + unless guarded && environment.var(name) + environment.set_var(name, val.perform(environment)) + end + + p environment.var(name) + else + p Script::Parser.parse(text, @line, 0).perform(environment) + end + rescue Sass::SyntaxError => e + puts "SyntaxError: #{e.message}" + if @options[:trace] + e.backtrace.each do |line| + puts "\tfrom #{line}" + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/root.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/root.rb new file mode 100644 index 000000000000..31e19c506539 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/root.rb @@ -0,0 +1,7 @@ +module Sass + # The root directory of the Sass source tree. + # This may be overridden by the package manager + # if the lib directory is separated from the main source tree. + # @api public + ROOT_DIR = File.expand_path(File.join(__FILE__, "../../..")) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script.rb new file mode 100644 index 000000000000..c852f06d7f0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script.rb @@ -0,0 +1,66 @@ +require 'sass/scss/rx' + +module Sass + # SassScript is code that's embedded in Sass documents + # to allow for property values to be computed from variables. + # + # This module contains code that handles the parsing and evaluation of SassScript. + module Script + # The regular expression used to parse variables. + MATCH = /^\$(#{Sass::SCSS::RX::IDENT})\s*:\s*(.+?) + (!#{Sass::SCSS::RX::IDENT}(?:\s+!#{Sass::SCSS::RX::IDENT})*)?$/x + + # The regular expression used to validate variables without matching. + VALIDATE = /^\$#{Sass::SCSS::RX::IDENT}$/ + + # Parses a string of SassScript + # + # @param value [String] The SassScript + # @param line [Integer] The number of the line on which the SassScript appeared. + # Used for error reporting + # @param offset [Integer] The number of characters in on `line` that the SassScript started. + # Used for error reporting + # @param options [{Symbol => Object}] An options hash; + # see {file:SASS_REFERENCE.md#Options the Sass options documentation} + # @return [Script::Tree::Node] The root node of the parse tree + def self.parse(value, line, offset, options = {}) + Parser.parse(value, line, offset, options) + rescue Sass::SyntaxError => e + e.message << ": #{value.inspect}." if e.message == "SassScript error" + e.modify_backtrace(:line => line, :filename => options[:filename]) + raise e + end + + require 'sass/script/functions' + require 'sass/script/parser' + require 'sass/script/tree' + require 'sass/script/value' + + # @private + CONST_RENAMES = { + :Literal => Sass::Script::Value::Base, + :ArgList => Sass::Script::Value::ArgList, + :Bool => Sass::Script::Value::Bool, + :Color => Sass::Script::Value::Color, + :List => Sass::Script::Value::List, + :Null => Sass::Script::Value::Null, + :Number => Sass::Script::Value::Number, + :String => Sass::Script::Value::String, + :Node => Sass::Script::Tree::Node, + :Funcall => Sass::Script::Tree::Funcall, + :Interpolation => Sass::Script::Tree::Interpolation, + :Operation => Sass::Script::Tree::Operation, + :StringInterpolation => Sass::Script::Tree::StringInterpolation, + :UnaryOperation => Sass::Script::Tree::UnaryOperation, + :Variable => Sass::Script::Tree::Variable, + } + + # @private + def self.const_missing(name) + klass = CONST_RENAMES[name] + super unless klass + CONST_RENAMES.each {|n, k| const_set(n, k)} + klass + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/css_lexer.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/css_lexer.rb new file mode 100644 index 000000000000..6362a9dac4b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/css_lexer.rb @@ -0,0 +1,33 @@ +module Sass + module Script + # This is a subclass of {Lexer} for use in parsing plain CSS properties. + # + # @see Sass::SCSS::CssParser + class CssLexer < Lexer + private + + def token + important || super + end + + def string(re, *args) + if re == :uri + uri = scan(URI) + return unless uri + return [:string, Script::Value::String.new(uri)] + end + + return unless scan(STRING) + string_value = Sass::Script::Value::String.value(@scanner[1] || @scanner[2]) + value = Script::Value::String.new(string_value, :string) + [:string, value] + end + + def important + s = scan(IMPORTANT) + return unless s + [:raw, s] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/css_parser.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/css_parser.rb new file mode 100644 index 000000000000..32f05afa7e96 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/css_parser.rb @@ -0,0 +1,36 @@ +require 'sass/script' +require 'sass/script/css_lexer' + +module Sass + module Script + # This is a subclass of {Parser} for use in parsing plain CSS properties. + # + # @see Sass::SCSS::CssParser + class CssParser < Parser + private + + # @private + def lexer_class; CssLexer; end + + # We need a production that only does /, + # since * and % aren't allowed in plain CSS + production :div, :unary_plus, :div + + def string + tok = try_tok(:string) + return number unless tok + return if @lexer.peek && @lexer.peek.type == :begin_interpolation + literal_node(tok.value, tok.source_range) + end + + # Short-circuit all the SassScript-only productions + def interpolation(first: nil, inner: :space) + first || send(inner) + end + + alias_method :or_expr, :div + alias_method :unary_div, :ident + alias_method :paren, :string + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/functions.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/functions.rb new file mode 100644 index 000000000000..5bd9593d8a37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/functions.rb @@ -0,0 +1,2920 @@ +require 'sass/script/value/helpers' + +module Sass::Script + # YARD can't handle some multiline tags, and we need really long tags for function declarations. + # Methods in this module are accessible from the SassScript context. + # For example, you can write + # + # $color: hsl(120deg, 100%, 50%) + # + # and it will call {Functions#hsl}. + # + # The following functions are provided: + # + # *Note: These functions are described in more detail below.* + # + # ## RGB Functions + # + # \{#rgb rgb($red, $green, $blue)} + # : Creates a {Sass::Script::Value::Color Color} from red, green, and blue + # values. + # + # \{#rgba rgba($red, $green, $blue, $alpha)} + # : Creates a {Sass::Script::Value::Color Color} from red, green, blue, and + # alpha values. + # + # \{#red red($color)} + # : Gets the red component of a color. + # + # \{#green green($color)} + # : Gets the green component of a color. + # + # \{#blue blue($color)} + # : Gets the blue component of a color. + # + # \{#mix mix($color1, $color2, \[$weight\])} + # : Mixes two colors together. + # + # ## HSL Functions + # + # \{#hsl hsl($hue, $saturation, $lightness)} + # : Creates a {Sass::Script::Value::Color Color} from hue, saturation, and + # lightness values. + # + # \{#hsla hsla($hue, $saturation, $lightness, $alpha)} + # : Creates a {Sass::Script::Value::Color Color} from hue, saturation, + # lightness, and alpha values. + # + # \{#hue hue($color)} + # : Gets the hue component of a color. + # + # \{#saturation saturation($color)} + # : Gets the saturation component of a color. + # + # \{#lightness lightness($color)} + # : Gets the lightness component of a color. + # + # \{#adjust_hue adjust-hue($color, $degrees)} + # : Changes the hue of a color. + # + # \{#lighten lighten($color, $amount)} + # : Makes a color lighter. + # + # \{#darken darken($color, $amount)} + # : Makes a color darker. + # + # \{#saturate saturate($color, $amount)} + # : Makes a color more saturated. + # + # \{#desaturate desaturate($color, $amount)} + # : Makes a color less saturated. + # + # \{#grayscale grayscale($color)} + # : Converts a color to grayscale. + # + # \{#complement complement($color)} + # : Returns the complement of a color. + # + # \{#invert invert($color, \[$weight\])} + # : Returns the inverse of a color. + # + # ## Opacity Functions + # + # \{#alpha alpha($color)} / \{#opacity opacity($color)} + # : Gets the alpha component (opacity) of a color. + # + # \{#rgba rgba($color, $alpha)} + # : Changes the alpha component for a color. + # + # \{#opacify opacify($color, $amount)} / \{#fade_in fade-in($color, $amount)} + # : Makes a color more opaque. + # + # \{#transparentize transparentize($color, $amount)} / \{#fade_out fade-out($color, $amount)} + # : Makes a color more transparent. + # + # ## Other Color Functions + # + # \{#adjust_color adjust-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])} + # : Increases or decreases one or more components of a color. + # + # \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\], \[$saturation\], \[$lightness\], \[$alpha\])} + # : Fluidly scales one or more properties of a color. + # + # \{#change_color change-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])} + # : Changes one or more properties of a color. + # + # \{#ie_hex_str ie-hex-str($color)} + # : Converts a color into the format understood by IE filters. + # + # ## String Functions + # + # \{#unquote unquote($string)} + # : Removes quotes from a string. + # + # \{#quote quote($string)} + # : Adds quotes to a string. + # + # \{#str_length str-length($string)} + # : Returns the number of characters in a string. + # + # \{#str_insert str-insert($string, $insert, $index)} + # : Inserts `$insert` into `$string` at `$index`. + # + # \{#str_index str-index($string, $substring)} + # : Returns the index of the first occurrence of `$substring` in `$string`. + # + # \{#str_slice str-slice($string, $start-at, [$end-at])} + # : Extracts a substring from `$string`. + # + # \{#to_upper_case to-upper-case($string)} + # : Converts a string to upper case. + # + # \{#to_lower_case to-lower-case($string)} + # : Converts a string to lower case. + # + # ## Number Functions + # + # \{#percentage percentage($number)} + # : Converts a unitless number to a percentage. + # + # \{#round round($number)} + # : Rounds a number to the nearest whole number. + # + # \{#ceil ceil($number)} + # : Rounds a number up to the next whole number. + # + # \{#floor floor($number)} + # : Rounds a number down to the previous whole number. + # + # \{#abs abs($number)} + # : Returns the absolute value of a number. + # + # \{#min min($numbers...)\} + # : Finds the minimum of several numbers. + # + # \{#max max($numbers...)\} + # : Finds the maximum of several numbers. + # + # \{#random random([$limit])\} + # : Returns a random number. + # + # ## List Functions {#list-functions} + # + # Lists in Sass are immutable; all list functions return a new list rather + # than updating the existing list in-place. + # + # All list functions work for maps as well, treating them as lists of pairs. + # + # \{#length length($list)} + # : Returns the length of a list. + # + # \{#nth nth($list, $n)} + # : Returns a specific item in a list. + # + # \{#set-nth set-nth($list, $n, $value)} + # : Replaces the nth item in a list. + # + # \{#join join($list1, $list2, \[$separator, $bracketed\])} + # : Joins together two lists into one. + # + # \{#append append($list1, $val, \[$separator\])} + # : Appends a single value onto the end of a list. + # + # \{#zip zip($lists...)} + # : Combines several lists into a single multidimensional list. + # + # \{#index index($list, $value)} + # : Returns the position of a value within a list. + # + # \{#list_separator list-separator($list)} + # : Returns the separator of a list. + # + # \{#is_bracketed is-bracketed($list)} + # : Returns whether a list has square brackets. + # + # ## Map Functions {#map-functions} + # + # Maps in Sass are immutable; all map functions return a new map rather than + # updating the existing map in-place. + # + # \{#map_get map-get($map, $key)} + # : Returns the value in a map associated with a given key. + # + # \{#map_merge map-merge($map1, $map2)} + # : Merges two maps together into a new map. + # + # \{#map_remove map-remove($map, $keys...)} + # : Returns a new map with keys removed. + # + # \{#map_keys map-keys($map)} + # : Returns a list of all keys in a map. + # + # \{#map_values map-values($map)} + # : Returns a list of all values in a map. + # + # \{#map_has_key map-has-key($map, $key)} + # : Returns whether a map has a value associated with a given key. + # + # \{#keywords keywords($args)} + # : Returns the keywords passed to a function that takes variable arguments. + # + # ## Selector Functions + # + # Selector functions are very liberal in the formats they support + # for selector arguments. They can take a plain string, a list of + # lists as returned by `&` or anything in between: + # + # * A plain string, such as `".foo .bar, .baz .bang"`. + # * A space-separated list of strings such as `(".foo" ".bar")`. + # * A comma-separated list of strings such as `(".foo .bar", ".baz .bang")`. + # * A comma-separated list of space-separated lists of strings such + # as `((".foo" ".bar"), (".baz" ".bang"))`. + # + # In general, selector functions allow placeholder selectors + # (`%foo`) but disallow parent-reference selectors (`&`). + # + # \{#selector_nest selector-nest($selectors...)} + # : Nests selector beneath one another like they would be nested in the + # stylesheet. + # + # \{#selector_append selector-append($selectors...)} + # : Appends selectors to one another without spaces in between. + # + # \{#selector_extend selector-extend($selector, $extendee, $extender)} + # : Extends `$extendee` with `$extender` within `$selector`. + # + # \{#selector_replace selector-replace($selector, $original, $replacement)} + # : Replaces `$original` with `$replacement` within `$selector`. + # + # \{#selector_unify selector-unify($selector1, $selector2)} + # : Unifies two selectors to produce a selector that matches + # elements matched by both. + # + # \{#is_superselector is-superselector($super, $sub)} + # : Returns whether `$super` matches all the elements `$sub` does, and + # possibly more. + # + # \{#simple_selectors simple-selectors($selector)} + # : Returns the simple selectors that comprise a compound selector. + # + # \{#selector_parse selector-parse($selector)} + # : Parses a selector into the format returned by `&`. + # + # ## Introspection Functions + # + # \{#feature_exists feature-exists($feature)} + # : Returns whether a feature exists in the current Sass runtime. + # + # \{#variable_exists variable-exists($name)} + # : Returns whether a variable with the given name exists in the current scope. + # + # \{#global_variable_exists global-variable-exists($name)} + # : Returns whether a variable with the given name exists in the global scope. + # + # \{#function_exists function-exists($name)} + # : Returns whether a function with the given name exists. + # + # \{#mixin_exists mixin-exists($name)} + # : Returns whether a mixin with the given name exists. + # + # \{#content_exists content-exists()} + # : Returns whether the current mixin was passed a content block. + # + # \{#inspect inspect($value)} + # : Returns the string representation of a value as it would be represented in Sass. + # + # \{#type_of type-of($value)} + # : Returns the type of a value. + # + # \{#unit unit($number)} + # : Returns the unit(s) associated with a number. + # + # \{#unitless unitless($number)} + # : Returns whether a number has units. + # + # \{#comparable comparable($number1, $number2)} + # : Returns whether two numbers can be added, subtracted, or compared. + # + # \{#call call($function, $args...)} + # : Dynamically calls a Sass function reference returned by `get-function`. + # + # \{#get_function get-function($name, $css: false)} + # : Looks up a function with the given name in the current lexical scope + # and returns a reference to it. + # + # ## Miscellaneous Functions + # + # \{#if if($condition, $if-true, $if-false)} + # : Returns one of two values, depending on whether or not `$condition` is + # true. + # + # \{#unique_id unique-id()} + # : Returns a unique CSS identifier. + # + # ## Adding Custom Functions + # + # New Sass functions can be added by adding Ruby methods to this module. + # For example: + # + # module Sass::Script::Functions + # def reverse(string) + # assert_type string, :String + # Sass::Script::Value::String.new(string.value.reverse) + # end + # declare :reverse, [:string] + # end + # + # Calling {declare} tells Sass the argument names for your function. + # If omitted, the function will still work, but will not be able to accept keyword arguments. + # {declare} can also allow your function to take arbitrary keyword arguments. + # + # There are a few things to keep in mind when modifying this module. + # First of all, the arguments passed are {Value} objects. + # Value objects are also expected to be returned. + # This means that Ruby values must be unwrapped and wrapped. + # + # Most Value objects support the {Value::Base#value value} accessor for getting + # their Ruby values. Color objects, though, must be accessed using + # {Sass::Script::Value::Color#rgb rgb}, {Sass::Script::Value::Color#red red}, + # {Sass::Script::Value::Color#blue green}, or {Sass::Script::Value::Color#blue + # blue}. + # + # Second, making Ruby functions accessible from Sass introduces the temptation + # to do things like database access within stylesheets. + # This is generally a bad idea; + # since Sass files are by default only compiled once, + # dynamic code is not a great fit. + # + # If you really, really need to compile Sass on each request, + # first make sure you have adequate caching set up. + # Then you can use {Sass::Engine} to render the code, + # using the {file:SASS_REFERENCE.md#custom-option `options` parameter} + # to pass in data that {EvaluationContext#options can be accessed} + # from your Sass functions. + # + # Within one of the functions in this module, + # methods of {EvaluationContext} can be used. + # + # ### Caveats + # + # When creating new {Value} objects within functions, be aware that it's not + # safe to call {Value::Base#to_s #to_s} (or other methods that use the string + # representation) on those objects without first setting {Tree::Node#options= + # the #options attribute}. + # + module Functions + @signatures = {} + + # A class representing a Sass function signature. + # + # @attr args [Array<String>] The names of the arguments to the function. + # @attr delayed_args [Array<String>] The names of the arguments whose evaluation should be + # delayed. + # @attr var_args [Boolean] Whether the function takes a variable number of arguments. + # @attr var_kwargs [Boolean] Whether the function takes an arbitrary set of keyword arguments. + Signature = Struct.new(:args, :delayed_args, :var_args, :var_kwargs, :deprecated) + + # Declare a Sass signature for a Ruby-defined function. + # This includes the names of the arguments, + # whether the function takes a variable number of arguments, + # and whether the function takes an arbitrary set of keyword arguments. + # + # It's not necessary to declare a signature for a function. + # However, without a signature it won't support keyword arguments. + # + # A single function can have multiple signatures declared + # as long as each one takes a different number of arguments. + # It's also possible to declare multiple signatures + # that all take the same number of arguments, + # but none of them but the first will be used + # unless the user uses keyword arguments. + # + # @example + # declare :rgba, [:hex, :alpha] + # declare :rgba, [:red, :green, :blue, :alpha] + # declare :accepts_anything, [], :var_args => true, :var_kwargs => true + # declare :some_func, [:foo, :bar, :baz], :var_kwargs => true + # + # @param method_name [Symbol] The name of the method + # whose signature is being declared. + # @param args [Array<Symbol>] The names of the arguments for the function signature. + # @option options :var_args [Boolean] (false) + # Whether the function accepts a variable number of (unnamed) arguments + # in addition to the named arguments. + # @option options :var_kwargs [Boolean] (false) + # Whether the function accepts other keyword arguments + # in addition to those in `:args`. + # If this is true, the Ruby function will be passed a hash from strings + # to {Value}s as the last argument. + # In addition, if this is true and `:var_args` is not, + # Sass will ensure that the last argument passed is a hash. + def self.declare(method_name, args, options = {}) + delayed_args = [] + args = args.map do |a| + a = a.to_s + if a[0] == ?& + a = a[1..-1] + delayed_args << a + end + a + end + # We don't expose this functionality except to certain builtin methods. + if delayed_args.any? && method_name != :if + raise ArgumentError.new("Delayed arguments are not allowed for method #{method_name}") + end + @signatures[method_name] ||= [] + @signatures[method_name] << Signature.new( + args, + delayed_args, + options[:var_args], + options[:var_kwargs], + options[:deprecated] && options[:deprecated].map {|a| a.to_s}) + end + + # Determine the correct signature for the number of arguments + # passed in for a given function. + # If no signatures match, the first signature is returned for error messaging. + # + # @param method_name [Symbol] The name of the Ruby function to be called. + # @param arg_arity [Integer] The number of unnamed arguments the function was passed. + # @param kwarg_arity [Integer] The number of keyword arguments the function was passed. + # + # @return [{Symbol => Object}, nil] + # The signature options for the matching signature, + # or nil if no signatures are declared for this function. See {declare}. + def self.signature(method_name, arg_arity, kwarg_arity) + return unless @signatures[method_name] + @signatures[method_name].each do |signature| + sig_arity = signature.args.size + return signature if sig_arity == arg_arity + kwarg_arity + next unless sig_arity < arg_arity + kwarg_arity + + # We have enough args. + # Now we need to figure out which args are varargs + # and if the signature allows them. + t_arg_arity, t_kwarg_arity = arg_arity, kwarg_arity + if sig_arity > t_arg_arity + # we transfer some kwargs arity to args arity + # if it does not have enough args -- assuming the names will work out. + t_kwarg_arity -= (sig_arity - t_arg_arity) + t_arg_arity = sig_arity + end + + if (t_arg_arity == sig_arity || t_arg_arity > sig_arity && signature.var_args) && + (t_kwarg_arity == 0 || t_kwarg_arity > 0 && signature.var_kwargs) + return signature + end + end + @signatures[method_name].first + end + + # Sets the random seed used by Sass's internal random number generator. + # + # This can be used to ensure consistent random number sequences which + # allows for consistent results when testing, etc. + # + # @param seed [Integer] + # @return [Integer] The same seed. + def self.random_seed=(seed) + @random_number_generator = Random.new(seed) + end + + # Get Sass's internal random number generator. + # + # @return [Random] + def self.random_number_generator + @random_number_generator ||= Random.new + end + + # The context in which methods in {Script::Functions} are evaluated. + # That means that all instance methods of {EvaluationContext} + # are available to use in functions. + class EvaluationContext + include Functions + include Value::Helpers + + # The human-readable names for [Sass::Script::Value::Base]. The default is + # just the downcased name of the type. + TYPE_NAMES = {:ArgList => 'variable argument list'} + + # The environment for this function. This environment's + # {Environment#parent} is the global environment, and its + # {Environment#caller} is a read-only view of the local environment of the + # caller of this function. + # + # @return [Environment] + attr_reader :environment + + # The options hash for the {Sass::Engine} that is processing the function call + # + # @return [{Symbol => Object}] + attr_reader :options + + # @param environment [Environment] See \{#environment} + def initialize(environment) + @environment = environment + @options = environment.options + end + + # Asserts that the type of a given SassScript value + # is the expected type (designated by a symbol). + # + # Valid types are `:Bool`, `:Color`, `:Number`, and `:String`. + # Note that `:String` will match both double-quoted strings + # and unquoted identifiers. + # + # @example + # assert_type value, :String + # assert_type value, :Number + # @param value [Sass::Script::Value::Base] A SassScript value + # @param type [Symbol, Array<Symbol>] The name(s) of the type the value is expected to be + # @param name [String, Symbol, nil] The name of the argument. + # @raise [ArgumentError] if value is not of the correct type. + def assert_type(value, type, name = nil) + valid_types = Array(type) + found_type = valid_types.find do |t| + value.is_a?(Sass::Script::Value.const_get(t)) || + t == :Map && value.is_a?(Sass::Script::Value::List) && value.value.empty? + end + + if found_type + value.check_deprecated_interp if found_type == :String + return + end + + err = if valid_types.size == 1 + "#{value.inspect} is not a #{TYPE_NAMES[type] || type.to_s.downcase}" + else + type_names = valid_types.map {|t| TYPE_NAMES[t] || t.to_s.downcase} + "#{value.inspect} is not any of #{type_names.join(', ')}" + end + err = "$#{name.to_s.tr('_', '-')}: " + err if name + raise ArgumentError.new(err) + end + + # Asserts that the unit of the number is as expected. + # + # @example + # assert_unit number, "px" + # assert_unit number, nil + # @param number [Sass::Script::Value::Number] The number to be validated. + # @param unit [::String] + # The unit that the number must have. + # If nil, the number must be unitless. + # @param name [::String] The name of the parameter being validated. + # @raise [ArgumentError] if number is not of the correct unit or is not a number. + def assert_unit(number, unit, name = nil) + assert_type number, :Number, name + return if number.is_unit?(unit) + expectation = unit ? "have a unit of #{unit}" : "be unitless" + if name + raise ArgumentError.new("Expected $#{name} to #{expectation} but got #{number}") + else + raise ArgumentError.new("Expected #{number} to #{expectation}") + end + end + + # Asserts that the value is an integer. + # + # @example + # assert_integer 2px + # assert_integer 2.5px + # => SyntaxError: "Expected 2.5px to be an integer" + # assert_integer 2.5px, "width" + # => SyntaxError: "Expected width to be an integer but got 2.5px" + # @param number [Sass::Script::Value::Base] The value to be validated. + # @param name [::String] The name of the parameter being validated. + # @raise [ArgumentError] if number is not an integer or is not a number. + def assert_integer(number, name = nil) + assert_type number, :Number, name + return if number.int? + if name + raise ArgumentError.new("Expected $#{name} to be an integer but got #{number}") + else + raise ArgumentError.new("Expected #{number} to be an integer") + end + end + + # Performs a node that has been delayed for execution. + # + # @private + # @param node [Sass::Script::Tree::Node, + # Sass::Script::Value::Base] When this is a tree node, it's + # performed in the caller's environment. When it's a value + # (which can happen when the value had to be performed already + # -- like for a splat), it's returned as-is. + # @param env [Sass::Environment] The environment within which to perform the node. + # Defaults to the (read-only) environment of the caller. + def perform(node, env = environment.caller) + if node.is_a?(Sass::Script::Value::Base) + node + else + node.perform(env) + end + end + end + + class << self + # Returns whether user function with a given name exists. + # + # @param function_name [String] + # @return [Boolean] + alias_method :callable?, :public_method_defined? + + private + + def include(*args) + r = super + # We have to re-include ourselves into EvaluationContext to work around + # an icky Ruby restriction. + EvaluationContext.send :include, self + r + end + end + + # Creates a {Sass::Script::Value::Color Color} object from red, green, and + # blue values. + # + # @see #rgba + # @overload rgb($red, $green, $blue) + # @param $red [Sass::Script::Value::Number] The amount of red in the color. + # Must be between 0 and 255 inclusive, or between `0%` and `100%` + # inclusive + # @param $green [Sass::Script::Value::Number] The amount of green in the + # color. Must be between 0 and 255 inclusive, or between `0%` and `100%` + # inclusive + # @param $blue [Sass::Script::Value::Number] The amount of blue in the + # color. Must be between 0 and 255 inclusive, or between `0%` and `100%` + # inclusive + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if any parameter is the wrong type or out of bounds + def rgb(red, green = nil, blue = nil) + if green.nil? + return unquoted_string("rgb(#{red})") if var?(red) + raise ArgumentError.new("wrong number of arguments (1 for 3)") + elsif blue.nil? + return unquoted_string("rgb(#{red}, #{green})") if var?(red) || var?(green) + raise ArgumentError.new("wrong number of arguments (2 for 3)") + end + + if special_number?(red) || special_number?(green) || special_number?(blue) + return unquoted_string("rgb(#{red}, #{green}, #{blue})") + end + assert_type red, :Number, :red + assert_type green, :Number, :green + assert_type blue, :Number, :blue + + color_attrs = [ + percentage_or_unitless(red, 255, "red"), + percentage_or_unitless(green, 255, "green"), + percentage_or_unitless(blue, 255, "blue") + ] + + # Don't store the string representation for function-created colors, both + # because it's not very useful and because some functions aren't supported + # on older browsers. + Sass::Script::Value::Color.new(color_attrs) + end + declare :rgb, [:red, :green, :blue] + declare :rgb, [:red, :green] + declare :rgb, [:red] + + # Creates a {Sass::Script::Value::Color Color} from red, green, blue, and + # alpha values. + # @see #rgb + # + # @overload rgba($red, $green, $blue, $alpha) + # @param $red [Sass::Script::Value::Number] The amount of red in the + # color. Must be between 0 and 255 inclusive or 0% and 100% inclusive + # @param $green [Sass::Script::Value::Number] The amount of green in the + # color. Must be between 0 and 255 inclusive or 0% and 100% inclusive + # @param $blue [Sass::Script::Value::Number] The amount of blue in the + # color. Must be between 0 and 255 inclusive or 0% and 100% inclusive + # @param $alpha [Sass::Script::Value::Number] The opacity of the color. + # Must be between 0 and 1 inclusive + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if any parameter is the wrong type or out of + # bounds + # + # @overload rgba($color, $alpha) + # Sets the opacity of an existing color. + # + # @example + # rgba(#102030, 0.5) => rgba(16, 32, 48, 0.5) + # rgba(blue, 0.2) => rgba(0, 0, 255, 0.2) + # + # @param $color [Sass::Script::Value::Color] The color whose opacity will + # be changed. + # @param $alpha [Sass::Script::Value::Number] The new opacity of the + # color. Must be between 0 and 1 inclusive + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$alpha` is out of bounds or either parameter + # is the wrong type + def rgba(*args) + case args.size + when 1 + return unquoted_string("rgba(#{args.first})") if var?(args.first) + raise ArgumentError.new("wrong number of arguments (1 for 4)") + when 2 + color, alpha = args + + if var?(color) + return unquoted_string("rgba(#{color}, #{alpha})") + elsif var?(alpha) + if color.is_a?(Sass::Script::Value::Color) + return unquoted_string("rgba(#{color.red}, #{color.green}, #{color.blue}, #{alpha})") + else + return unquoted_string("rgba(#{color}, #{alpha})") + end + end + + assert_type color, :Color, :color + if special_number?(alpha) + unquoted_string("rgba(#{color.red}, #{color.green}, #{color.blue}, #{alpha})") + else + assert_type alpha, :Number, :alpha + color.with(:alpha => percentage_or_unitless(alpha, 1, "alpha")) + end + when 3 + if var?(args[0]) || var?(args[1]) || var?(args[2]) + unquoted_string("rgba(#{args.join(', ')})") + else + raise ArgumentError.new("wrong number of arguments (3 for 4)") + end + when 4 + red, green, blue, alpha = args + if special_number?(red) || special_number?(green) || + special_number?(blue) || special_number?(alpha) + unquoted_string("rgba(#{red}, #{green}, #{blue}, #{alpha})") + else + rgba(rgb(red, green, blue), alpha) + end + else + raise ArgumentError.new("wrong number of arguments (#{args.size} for 4)") + end + end + declare :rgba, [:red, :green, :blue, :alpha] + declare :rgba, [:red, :green, :blue] + declare :rgba, [:color, :alpha] + declare :rgba, [:red] + + # Creates a {Sass::Script::Value::Color Color} from hue, saturation, and + # lightness values. Uses the algorithm from the [CSS3 spec][]. + # + # [CSS3 spec]: http://www.w3.org/TR/css3-color/#hsl-color + # + # @see #hsla + # @overload hsl($hue, $saturation, $lightness) + # @param $hue [Sass::Script::Value::Number] The hue of the color. Should be + # between 0 and 360 degrees, inclusive + # @param $saturation [Sass::Script::Value::Number] The saturation of the + # color. Must be between `0%` and `100%`, inclusive + # @param $lightness [Sass::Script::Value::Number] The lightness of the + # color. Must be between `0%` and `100%`, inclusive + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$saturation` or `$lightness` are out of bounds + # or any parameter is the wrong type + def hsl(hue, saturation = nil, lightness = nil) + if saturation.nil? + return unquoted_string("hsl(#{hue})") if var?(hue) + raise ArgumentError.new("wrong number of arguments (1 for 3)") + elsif lightness.nil? + return unquoted_string("hsl(#{hue}, #{saturation})") if var?(hue) || var?(saturation) + raise ArgumentError.new("wrong number of arguments (2 for 3)") + end + + if special_number?(hue) || special_number?(saturation) || special_number?(lightness) + unquoted_string("hsl(#{hue}, #{saturation}, #{lightness})") + else + hsla(hue, saturation, lightness, number(1)) + end + end + declare :hsl, [:hue, :saturation, :lightness] + declare :hsl, [:hue, :saturation] + declare :hsl, [:hue] + + # Creates a {Sass::Script::Value::Color Color} from hue, + # saturation, lightness, and alpha values. Uses the algorithm from + # the [CSS3 spec][]. + # + # [CSS3 spec]: http://www.w3.org/TR/css3-color/#hsl-color + # + # @see #hsl + # @overload hsla($hue, $saturation, $lightness, $alpha) + # @param $hue [Sass::Script::Value::Number] The hue of the color. Should be + # between 0 and 360 degrees, inclusive + # @param $saturation [Sass::Script::Value::Number] The saturation of the + # color. Must be between `0%` and `100%`, inclusive + # @param $lightness [Sass::Script::Value::Number] The lightness of the + # color. Must be between `0%` and `100%`, inclusive + # @param $alpha [Sass::Script::Value::Number] The opacity of the color. Must + # be between 0 and 1, inclusive + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$saturation`, `$lightness`, or `$alpha` are out + # of bounds or any parameter is the wrong type + def hsla(hue, saturation = nil, lightness = nil, alpha = nil) + if saturation.nil? + return unquoted_string("hsla(#{hue})") if var?(hue) + raise ArgumentError.new("wrong number of arguments (1 for 4)") + elsif lightness.nil? + return unquoted_string("hsla(#{hue}, #{saturation})") if var?(hue) || var?(saturation) + raise ArgumentError.new("wrong number of arguments (2 for 4)") + elsif alpha.nil? + if var?(hue) || var?(saturation) || var?(lightness) + return unquoted_string("hsla(#{hue}, #{saturation}, #{lightness})") + else + raise ArgumentError.new("wrong number of arguments (2 for 4)") + end + end + + if special_number?(hue) || special_number?(saturation) || + special_number?(lightness) || special_number?(alpha) + return unquoted_string("hsla(#{hue}, #{saturation}, #{lightness}, #{alpha})") + end + assert_type hue, :Number, :hue + assert_type saturation, :Number, :saturation + assert_type lightness, :Number, :lightness + assert_type alpha, :Number, :alpha + + h = hue.value + s = saturation.value + l = lightness.value + + # Don't store the string representation for function-created colors, both + # because it's not very useful and because some functions aren't supported + # on older browsers. + Sass::Script::Value::Color.new( + :hue => h, :saturation => s, :lightness => l, + :alpha => percentage_or_unitless(alpha, 1, "alpha")) + end + declare :hsla, [:hue, :saturation, :lightness, :alpha] + declare :hsla, [:hue, :saturation, :lightness] + declare :hsla, [:hue, :saturation] + declare :hsla, [:hue] + + # Gets the red component of a color. Calculated from HSL where necessary via + # [this algorithm][hsl-to-rgb]. + # + # [hsl-to-rgb]: http://www.w3.org/TR/css3-color/#hsl-color + # + # @overload red($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Number] The red component, between 0 and 255 + # inclusive + # @raise [ArgumentError] if `$color` isn't a color + def red(color) + assert_type color, :Color, :color + number(color.red) + end + declare :red, [:color] + + # Gets the green component of a color. Calculated from HSL where necessary + # via [this algorithm][hsl-to-rgb]. + # + # [hsl-to-rgb]: http://www.w3.org/TR/css3-color/#hsl-color + # + # @overload green($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Number] The green component, between 0 and + # 255 inclusive + # @raise [ArgumentError] if `$color` isn't a color + def green(color) + assert_type color, :Color, :color + number(color.green) + end + declare :green, [:color] + + # Gets the blue component of a color. Calculated from HSL where necessary + # via [this algorithm][hsl-to-rgb]. + # + # [hsl-to-rgb]: http://www.w3.org/TR/css3-color/#hsl-color + # + # @overload blue($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Number] The blue component, between 0 and + # 255 inclusive + # @raise [ArgumentError] if `$color` isn't a color + def blue(color) + assert_type color, :Color, :color + number(color.blue) + end + declare :blue, [:color] + + # Returns the hue component of a color. See [the CSS3 HSL + # specification][hsl]. Calculated from RGB where necessary via [this + # algorithm][rgb-to-hsl]. + # + # [hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV + # [rgb-to-hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV + # + # @overload hue($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Number] The hue component, between 0deg and + # 360deg + # @raise [ArgumentError] if `$color` isn't a color + def hue(color) + assert_type color, :Color, :color + number(color.hue, "deg") + end + declare :hue, [:color] + + # Returns the saturation component of a color. See [the CSS3 HSL + # specification][hsl]. Calculated from RGB where necessary via [this + # algorithm][rgb-to-hsl]. + # + # [hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV + # [rgb-to-hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV + # + # @overload saturation($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Number] The saturation component, between 0% + # and 100% + # @raise [ArgumentError] if `$color` isn't a color + def saturation(color) + assert_type color, :Color, :color + number(color.saturation, "%") + end + declare :saturation, [:color] + + # Returns the lightness component of a color. See [the CSS3 HSL + # specification][hsl]. Calculated from RGB where necessary via [this + # algorithm][rgb-to-hsl]. + # + # [hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV + # [rgb-to-hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV + # + # @overload lightness($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Number] The lightness component, between 0% + # and 100% + # @raise [ArgumentError] if `$color` isn't a color + def lightness(color) + assert_type color, :Color, :color + number(color.lightness, "%") + end + declare :lightness, [:color] + + # Returns the alpha component (opacity) of a color. This is 1 unless + # otherwise specified. + # + # This function also supports the proprietary Microsoft `alpha(opacity=20)` + # syntax as a special case. + # + # @overload alpha($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Number] The alpha component, between 0 and 1 + # @raise [ArgumentError] if `$color` isn't a color + def alpha(*args) + if args.all? do |a| + a.is_a?(Sass::Script::Value::String) && a.type == :identifier && + a.value =~ /^[a-zA-Z]+\s*=/ + end + # Support the proprietary MS alpha() function + return identifier("alpha(#{args.map {|a| a.to_s}.join(', ')})") + end + + raise ArgumentError.new("wrong number of arguments (#{args.size} for 1)") if args.size != 1 + + assert_type args.first, :Color, :color + number(args.first.alpha) + end + declare :alpha, [:color] + + # Returns the alpha component (opacity) of a color. This is 1 unless + # otherwise specified. + # + # @overload opacity($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Number] The alpha component, between 0 and 1 + # @raise [ArgumentError] if `$color` isn't a color + def opacity(color) + if color.is_a?(Sass::Script::Value::Number) + return identifier("opacity(#{color})") + end + assert_type color, :Color, :color + number(color.alpha) + end + declare :opacity, [:color] + + # Makes a color more opaque. Takes a color and a number between 0 and 1, and + # returns a color with the opacity increased by that amount. + # + # @see #transparentize + # @example + # opacify(rgba(0, 0, 0, 0.5), 0.1) => rgba(0, 0, 0, 0.6) + # opacify(rgba(0, 0, 17, 0.8), 0.2) => #001 + # @overload opacify($color, $amount) + # @param $color [Sass::Script::Value::Color] + # @param $amount [Sass::Script::Value::Number] The amount to increase the + # opacity by, between 0 and 1 + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter + # is the wrong type + def opacify(color, amount) + _adjust(color, amount, :alpha, 0..1, :+) + end + declare :opacify, [:color, :amount] + + alias_method :fade_in, :opacify + declare :fade_in, [:color, :amount] + + # Makes a color more transparent. Takes a color and a number between 0 and + # 1, and returns a color with the opacity decreased by that amount. + # + # @see #opacify + # @example + # transparentize(rgba(0, 0, 0, 0.5), 0.1) => rgba(0, 0, 0, 0.4) + # transparentize(rgba(0, 0, 0, 0.8), 0.2) => rgba(0, 0, 0, 0.6) + # @overload transparentize($color, $amount) + # @param $color [Sass::Script::Value::Color] + # @param $amount [Sass::Script::Value::Number] The amount to decrease the + # opacity by, between 0 and 1 + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter + # is the wrong type + def transparentize(color, amount) + _adjust(color, amount, :alpha, 0..1, :-) + end + declare :transparentize, [:color, :amount] + + alias_method :fade_out, :transparentize + declare :fade_out, [:color, :amount] + + # Makes a color lighter. Takes a color and a number between `0%` and `100%`, + # and returns a color with the lightness increased by that amount. + # + # @see #darken + # @example + # lighten(hsl(0, 0%, 0%), 30%) => hsl(0, 0, 30) + # lighten(#800, 20%) => #e00 + # @overload lighten($color, $amount) + # @param $color [Sass::Script::Value::Color] + # @param $amount [Sass::Script::Value::Number] The amount to increase the + # lightness by, between `0%` and `100%` + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter + # is the wrong type + def lighten(color, amount) + _adjust(color, amount, :lightness, 0..100, :+, "%") + end + declare :lighten, [:color, :amount] + + # Makes a color darker. Takes a color and a number between 0% and 100%, and + # returns a color with the lightness decreased by that amount. + # + # @see #lighten + # @example + # darken(hsl(25, 100%, 80%), 30%) => hsl(25, 100%, 50%) + # darken(#800, 20%) => #200 + # @overload darken($color, $amount) + # @param $color [Sass::Script::Value::Color] + # @param $amount [Sass::Script::Value::Number] The amount to decrease the + # lightness by, between `0%` and `100%` + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter + # is the wrong type + def darken(color, amount) + _adjust(color, amount, :lightness, 0..100, :-, "%") + end + declare :darken, [:color, :amount] + + # Makes a color more saturated. Takes a color and a number between 0% and + # 100%, and returns a color with the saturation increased by that amount. + # + # @see #desaturate + # @example + # saturate(hsl(120, 30%, 90%), 20%) => hsl(120, 50%, 90%) + # saturate(#855, 20%) => #9e3f3f + # @overload saturate($color, $amount) + # @param $color [Sass::Script::Value::Color] + # @param $amount [Sass::Script::Value::Number] The amount to increase the + # saturation by, between `0%` and `100%` + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter + # is the wrong type + def saturate(color, amount = nil) + # Support the filter effects definition of saturate. + # https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html + return identifier("saturate(#{color})") if amount.nil? + _adjust(color, amount, :saturation, 0..100, :+, "%") + end + declare :saturate, [:color, :amount] + declare :saturate, [:amount] + + # Makes a color less saturated. Takes a color and a number between 0% and + # 100%, and returns a color with the saturation decreased by that value. + # + # @see #saturate + # @example + # desaturate(hsl(120, 30%, 90%), 20%) => hsl(120, 10%, 90%) + # desaturate(#855, 20%) => #726b6b + # @overload desaturate($color, $amount) + # @param $color [Sass::Script::Value::Color] + # @param $amount [Sass::Script::Value::Number] The amount to decrease the + # saturation by, between `0%` and `100%` + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter + # is the wrong type + def desaturate(color, amount) + _adjust(color, amount, :saturation, 0..100, :-, "%") + end + declare :desaturate, [:color, :amount] + + # Changes the hue of a color. Takes a color and a number of degrees (usually + # between `-360deg` and `360deg`), and returns a color with the hue rotated + # along the color wheel by that amount. + # + # @example + # adjust-hue(hsl(120, 30%, 90%), 60deg) => hsl(180, 30%, 90%) + # adjust-hue(hsl(120, 30%, 90%), -60deg) => hsl(60, 30%, 90%) + # adjust-hue(#811, 45deg) => #886a11 + # @overload adjust_hue($color, $degrees) + # @param $color [Sass::Script::Value::Color] + # @param $degrees [Sass::Script::Value::Number] The number of degrees to + # rotate the hue + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if either parameter is the wrong type + def adjust_hue(color, degrees) + assert_type color, :Color, :color + assert_type degrees, :Number, :degrees + color.with(:hue => color.hue + degrees.value) + end + declare :adjust_hue, [:color, :degrees] + + # Converts a color into the format understood by IE filters. + # + # @example + # ie-hex-str(#abc) => #FFAABBCC + # ie-hex-str(#3322BB) => #FF3322BB + # ie-hex-str(rgba(0, 255, 0, 0.5)) => #8000FF00 + # @overload ie_hex_str($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::String] The IE-formatted string + # representation of the color + # @raise [ArgumentError] if `$color` isn't a color + def ie_hex_str(color) + assert_type color, :Color, :color + alpha = Sass::Util.round(color.alpha * 255).to_s(16).rjust(2, '0') + identifier("##{alpha}#{color.send(:hex_str)[1..-1]}".upcase) + end + declare :ie_hex_str, [:color] + + # Increases or decreases one or more properties of a color. This can change + # the red, green, blue, hue, saturation, value, and alpha properties. The + # properties are specified as keyword arguments, and are added to or + # subtracted from the color's current value for that property. + # + # All properties are optional. You can't specify both RGB properties + # (`$red`, `$green`, `$blue`) and HSL properties (`$hue`, `$saturation`, + # `$value`) at the same time. + # + # @example + # adjust-color(#102030, $blue: 5) => #102035 + # adjust-color(#102030, $red: -5, $blue: 5) => #0b2035 + # adjust-color(hsl(25, 100%, 80%), $lightness: -30%, $alpha: -0.4) => hsla(25, 100%, 50%, 0.6) + # @overload adjust_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha]) + # @param $color [Sass::Script::Value::Color] + # @param $red [Sass::Script::Value::Number] The adjustment to make on the + # red component, between -255 and 255 inclusive + # @param $green [Sass::Script::Value::Number] The adjustment to make on the + # green component, between -255 and 255 inclusive + # @param $blue [Sass::Script::Value::Number] The adjustment to make on the + # blue component, between -255 and 255 inclusive + # @param $hue [Sass::Script::Value::Number] The adjustment to make on the + # hue component, in degrees + # @param $saturation [Sass::Script::Value::Number] The adjustment to make on + # the saturation component, between `-100%` and `100%` inclusive + # @param $lightness [Sass::Script::Value::Number] The adjustment to make on + # the lightness component, between `-100%` and `100%` inclusive + # @param $alpha [Sass::Script::Value::Number] The adjustment to make on the + # alpha component, between -1 and 1 inclusive + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if any parameter is the wrong type or out-of + # bounds, or if RGB properties and HSL properties are adjusted at the + # same time + def adjust_color(color, kwargs) + assert_type color, :Color, :color + with = Sass::Util.map_hash( + "red" => [-255..255, ""], + "green" => [-255..255, ""], + "blue" => [-255..255, ""], + "hue" => nil, + "saturation" => [-100..100, "%"], + "lightness" => [-100..100, "%"], + "alpha" => [-1..1, ""] + ) do |name, (range, units)| + val = kwargs.delete(name) + next unless val + assert_type val, :Number, name + Sass::Util.check_range("$#{name}: Amount", range, val, units) if range + adjusted = color.send(name) + val.value + adjusted = [0, Sass::Util.restrict(adjusted, range)].max if range + [name.to_sym, adjusted] + end + + unless kwargs.empty? + name, val = kwargs.to_a.first + raise ArgumentError.new("Unknown argument $#{name} (#{val})") + end + + color.with(with) + end + declare :adjust_color, [:color], :var_kwargs => true + + # Fluidly scales one or more properties of a color. Unlike + # \{#adjust_color adjust-color}, which changes a color's properties by fixed + # amounts, \{#scale_color scale-color} fluidly changes them based on how + # high or low they already are. That means that lightening an already-light + # color with \{#scale_color scale-color} won't change the lightness much, + # but lightening a dark color by the same amount will change it more + # dramatically. This has the benefit of making `scale-color($color, ...)` + # have a similar effect regardless of what `$color` is. + # + # For example, the lightness of a color can be anywhere between `0%` and + # `100%`. If `scale-color($color, $lightness: 40%)` is called, the resulting + # color's lightness will be 40% of the way between its original lightness + # and 100. If `scale-color($color, $lightness: -40%)` is called instead, the + # lightness will be 40% of the way between the original and 0. + # + # This can change the red, green, blue, saturation, value, and alpha + # properties. The properties are specified as keyword arguments. All + # arguments should be percentages between `0%` and `100%`. + # + # All properties are optional. You can't specify both RGB properties + # (`$red`, `$green`, `$blue`) and HSL properties (`$saturation`, `$value`) + # at the same time. + # + # @example + # scale-color(hsl(120, 70%, 80%), $lightness: 50%) => hsl(120, 70%, 90%) + # scale-color(rgb(200, 150%, 170%), $green: -40%, $blue: 70%) => rgb(200, 90, 229) + # scale-color(hsl(200, 70%, 80%), $saturation: -90%, $alpha: -30%) => hsla(200, 7%, 80%, 0.7) + # @overload scale_color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha]) + # @param $color [Sass::Script::Value::Color] + # @param $red [Sass::Script::Value::Number] + # @param $green [Sass::Script::Value::Number] + # @param $blue [Sass::Script::Value::Number] + # @param $saturation [Sass::Script::Value::Number] + # @param $lightness [Sass::Script::Value::Number] + # @param $alpha [Sass::Script::Value::Number] + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if any parameter is the wrong type or out-of + # bounds, or if RGB properties and HSL properties are adjusted at the + # same time + def scale_color(color, kwargs) + assert_type color, :Color, :color + with = Sass::Util.map_hash( + "red" => 255, + "green" => 255, + "blue" => 255, + "saturation" => 100, + "lightness" => 100, + "alpha" => 1 + ) do |name, max| + val = kwargs.delete(name) + next unless val + assert_type val, :Number, name + assert_unit val, '%', name + Sass::Util.check_range("$#{name}: Amount", -100..100, val, '%') + + current = color.send(name) + scale = val.value / 100.0 + diff = scale > 0 ? max - current : current + [name.to_sym, current + diff * scale] + end + + unless kwargs.empty? + name, val = kwargs.to_a.first + raise ArgumentError.new("Unknown argument $#{name} (#{val})") + end + + color.with(with) + end + declare :scale_color, [:color], :var_kwargs => true + + # Changes one or more properties of a color. This can change the red, green, + # blue, hue, saturation, value, and alpha properties. The properties are + # specified as keyword arguments, and replace the color's current value for + # that property. + # + # All properties are optional. You can't specify both RGB properties + # (`$red`, `$green`, `$blue`) and HSL properties (`$hue`, `$saturation`, + # `$value`) at the same time. + # + # @example + # change-color(#102030, $blue: 5) => #102005 + # change-color(#102030, $red: 120, $blue: 5) => #782005 + # change-color(hsl(25, 100%, 80%), $lightness: 40%, $alpha: 0.8) => hsla(25, 100%, 40%, 0.8) + # @overload change_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha]) + # @param $color [Sass::Script::Value::Color] + # @param $red [Sass::Script::Value::Number] The new red component for the + # color, within 0 and 255 inclusive + # @param $green [Sass::Script::Value::Number] The new green component for + # the color, within 0 and 255 inclusive + # @param $blue [Sass::Script::Value::Number] The new blue component for the + # color, within 0 and 255 inclusive + # @param $hue [Sass::Script::Value::Number] The new hue component for the + # color, in degrees + # @param $saturation [Sass::Script::Value::Number] The new saturation + # component for the color, between `0%` and `100%` inclusive + # @param $lightness [Sass::Script::Value::Number] The new lightness + # component for the color, within `0%` and `100%` inclusive + # @param $alpha [Sass::Script::Value::Number] The new alpha component for + # the color, within 0 and 1 inclusive + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if any parameter is the wrong type or out-of + # bounds, or if RGB properties and HSL properties are adjusted at the + # same time + def change_color(color, kwargs) + assert_type color, :Color, :color + with = Sass::Util.map_hash( + 'red' => ['Red value', 0..255], + 'green' => ['Green value', 0..255], + 'blue' => ['Blue value', 0..255], + 'hue' => [], + 'saturation' => ['Saturation', 0..100, '%'], + 'lightness' => ['Lightness', 0..100, '%'], + 'alpha' => ['Alpha channel', 0..1] + ) do |name, (desc, range, unit)| + val = kwargs.delete(name) + next unless val + assert_type val, :Number, name + + if range + val = Sass::Util.check_range(desc, range, val, unit) + else + val = val.value + end + + [name.to_sym, val] + end + + unless kwargs.empty? + name, val = kwargs.to_a.first + raise ArgumentError.new("Unknown argument $#{name} (#{val})") + end + + color.with(with) + end + declare :change_color, [:color], :var_kwargs => true + + # Mixes two colors together. Specifically, takes the average of each of the + # RGB components, optionally weighted by the given percentage. The opacity + # of the colors is also considered when weighting the components. + # + # The weight specifies the amount of the first color that should be included + # in the returned color. The default, `50%`, means that half the first color + # and half the second color should be used. `25%` means that a quarter of + # the first color and three quarters of the second color should be used. + # + # @example + # mix(#f00, #00f) => #7f007f + # mix(#f00, #00f, 25%) => #3f00bf + # mix(rgba(255, 0, 0, 0.5), #00f) => rgba(63, 0, 191, 0.75) + # @overload mix($color1, $color2, $weight: 50%) + # @param $color1 [Sass::Script::Value::Color] + # @param $color2 [Sass::Script::Value::Color] + # @param $weight [Sass::Script::Value::Number] The relative weight of each + # color. Closer to `100%` gives more weight to `$color1`, closer to `0%` + # gives more weight to `$color2` + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$weight` is out of bounds or any parameter is + # the wrong type + def mix(color1, color2, weight = number(50)) + assert_type color1, :Color, :color1 + assert_type color2, :Color, :color2 + assert_type weight, :Number, :weight + + Sass::Util.check_range("Weight", 0..100, weight, '%') + + # This algorithm factors in both the user-provided weight (w) and the + # difference between the alpha values of the two colors (a) to decide how + # to perform the weighted average of the two RGB values. + # + # It works by first normalizing both parameters to be within [-1, 1], + # where 1 indicates "only use color1", -1 indicates "only use color2", and + # all values in between indicated a proportionately weighted average. + # + # Once we have the normalized variables w and a, we apply the formula + # (w + a)/(1 + w*a) to get the combined weight (in [-1, 1]) of color1. + # This formula has two especially nice properties: + # + # * When either w or a are -1 or 1, the combined weight is also that number + # (cases where w * a == -1 are undefined, and handled as a special case). + # + # * When a is 0, the combined weight is w, and vice versa. + # + # Finally, the weight of color1 is renormalized to be within [0, 1] + # and the weight of color2 is given by 1 minus the weight of color1. + p = (weight.value / 100.0).to_f + w = p * 2 - 1 + a = color1.alpha - color2.alpha + + w1 = ((w * a == -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0 + w2 = 1 - w1 + + rgba = color1.rgb.zip(color2.rgb).map {|v1, v2| v1 * w1 + v2 * w2} + rgba << color1.alpha * p + color2.alpha * (1 - p) + rgb_color(*rgba) + end + declare :mix, [:color1, :color2] + declare :mix, [:color1, :color2, :weight] + + # Converts a color to grayscale. This is identical to `desaturate(color, + # 100%)`. + # + # @see #desaturate + # @overload grayscale($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$color` isn't a color + def grayscale(color) + if color.is_a?(Sass::Script::Value::Number) + return identifier("grayscale(#{color})") + end + desaturate color, number(100) + end + declare :grayscale, [:color] + + # Returns the complement of a color. This is identical to `adjust-hue(color, + # 180deg)`. + # + # @see #adjust_hue #adjust-hue + # @overload complement($color) + # @param $color [Sass::Script::Value::Color] + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$color` isn't a color + def complement(color) + adjust_hue color, number(180) + end + declare :complement, [:color] + + # Returns the inverse (negative) of a color. The red, green, and blue values + # are inverted, while the opacity is left alone. + # + # @overload invert($color) + # @param $color [Sass::Script::Value::Color] + # @overload invert($color, $weight: 100%) + # @param $color [Sass::Script::Value::Color] + # @param $weight [Sass::Script::Value::Number] The relative weight of the + # color color's inverse + # @return [Sass::Script::Value::Color] + # @raise [ArgumentError] if `$color` isn't a color or `$weight` + # isn't a percentage between 0% and 100% + def invert(color, weight = number(100)) + if color.is_a?(Sass::Script::Value::Number) + return identifier("invert(#{color})") + end + + assert_type color, :Color, :color + inv = color.with( + :red => (255 - color.red), + :green => (255 - color.green), + :blue => (255 - color.blue)) + + mix(inv, color, weight) + end + declare :invert, [:color] + declare :invert, [:color, :weight] + + # Removes quotes from a string. If the string is already unquoted, this will + # return it unmodified. + # + # @see #quote + # @example + # unquote("foo") => foo + # unquote(foo) => foo + # @overload unquote($string) + # @param $string [Sass::Script::Value::String] + # @return [Sass::Script::Value::String] + # @raise [ArgumentError] if `$string` isn't a string + def unquote(string) + unless string.is_a?(Sass::Script::Value::String) + # Don't warn multiple times for the same source line. + $_sass_warned_for_unquote ||= Set.new + frame = environment.stack.frames.last + key = [frame.filename, frame.line] if frame + return string if frame && $_sass_warned_for_unquote.include?(key) + $_sass_warned_for_unquote << key if frame + + Sass::Util.sass_warn(<<MESSAGE.strip) +DEPRECATION WARNING: Passing #{string.to_sass}, a non-string value, to unquote() +will be an error in future versions of Sass. +#{environment.stack.to_s.gsub(/^/, ' ' * 8)} +MESSAGE + return string + end + + string.check_deprecated_interp + return string if string.type == :identifier + identifier(string.value) + end + declare :unquote, [:string] + + # Add quotes to a string if the string isn't quoted, + # or returns the same string if it is. + # + # @see #unquote + # @example + # quote("foo") => "foo" + # quote(foo) => "foo" + # @overload quote($string) + # @param $string [Sass::Script::Value::String] + # @return [Sass::Script::Value::String] + # @raise [ArgumentError] if `$string` isn't a string + def quote(string) + assert_type string, :String, :string + if string.type != :string + quoted_string(string.value) + else + string + end + end + declare :quote, [:string] + + # Returns the number of characters in a string. + # + # @example + # str-length("foo") => 3 + # @overload str_length($string) + # @param $string [Sass::Script::Value::String] + # @return [Sass::Script::Value::Number] + # @raise [ArgumentError] if `$string` isn't a string + def str_length(string) + assert_type string, :String, :string + number(string.value.size) + end + declare :str_length, [:string] + + # Inserts `$insert` into `$string` at `$index`. + # + # Note that unlike some languages, the first character in a Sass string is + # number 1, the second number 2, and so forth. + # + # @example + # str-insert("abcd", "X", 1) => "Xabcd" + # str-insert("abcd", "X", 4) => "abcXd" + # str-insert("abcd", "X", 5) => "abcdX" + # + # @overload str_insert($string, $insert, $index) + # @param $string [Sass::Script::Value::String] + # @param $insert [Sass::Script::Value::String] + # @param $index [Sass::Script::Value::Number] The position at which + # `$insert` will be inserted. Negative indices count from the end of + # `$string`. An index that's outside the bounds of the string will insert + # `$insert` at the front or back of the string + # @return [Sass::Script::Value::String] The result string. This will be + # quoted if and only if `$string` was quoted + # @raise [ArgumentError] if any parameter is the wrong type + def str_insert(original, insert, index) + assert_type original, :String, :string + assert_type insert, :String, :insert + assert_integer index, :index + assert_unit index, nil, :index + insertion_point = if index.to_i > 0 + [index.to_i - 1, original.value.size].min + else + [index.to_i, -original.value.size - 1].max + end + result = original.value.dup.insert(insertion_point, insert.value) + Sass::Script::Value::String.new(result, original.type) + end + declare :str_insert, [:string, :insert, :index] + + # Returns the index of the first occurrence of `$substring` in `$string`. If + # there is no such occurrence, returns `null`. + # + # Note that unlike some languages, the first character in a Sass string is + # number 1, the second number 2, and so forth. + # + # @example + # str-index(abcd, a) => 1 + # str-index(abcd, ab) => 1 + # str-index(abcd, X) => null + # str-index(abcd, c) => 3 + # + # @overload str_index($string, $substring) + # @param $string [Sass::Script::Value::String] + # @param $substring [Sass::Script::Value::String] + # @return [Sass::Script::Value::Number, Sass::Script::Value::Null] + # @raise [ArgumentError] if any parameter is the wrong type + def str_index(string, substring) + assert_type string, :String, :string + assert_type substring, :String, :substring + index = string.value.index(substring.value) + index ? number(index + 1) : null + end + declare :str_index, [:string, :substring] + + # Extracts a substring from `$string`. The substring will begin at index + # `$start-at` and ends at index `$end-at`. + # + # Note that unlike some languages, the first character in a Sass string is + # number 1, the second number 2, and so forth. + # + # @example + # str-slice("abcd", 2, 3) => "bc" + # str-slice("abcd", 2) => "bcd" + # str-slice("abcd", -3, -2) => "bc" + # str-slice("abcd", 2, -2) => "bc" + # + # @overload str_slice($string, $start-at, $end-at: -1) + # @param $start-at [Sass::Script::Value::Number] The index of the first + # character of the substring. If this is negative, it counts from the end + # of `$string` + # @param $end-at [Sass::Script::Value::Number] The index of the last + # character of the substring. If this is negative, it counts from the end + # of `$string`. Defaults to -1 + # @return [Sass::Script::Value::String] The substring. This will be quoted + # if and only if `$string` was quoted + # @raise [ArgumentError] if any parameter is the wrong type + def str_slice(string, start_at, end_at = nil) + assert_type string, :String, :string + assert_unit start_at, nil, "start-at" + + end_at = number(-1) if end_at.nil? + assert_unit end_at, nil, "end-at" + + return Sass::Script::Value::String.new("", string.type) if end_at.value == 0 + s = start_at.value > 0 ? start_at.value - 1 : start_at.value + e = end_at.value > 0 ? end_at.value - 1 : end_at.value + s = string.value.length + s if s < 0 + s = 0 if s < 0 + e = string.value.length + e if e < 0 + return Sass::Script::Value::String.new("", string.type) if e < 0 + extracted = string.value.slice(s..e) + Sass::Script::Value::String.new(extracted || "", string.type) + end + declare :str_slice, [:string, :start_at] + declare :str_slice, [:string, :start_at, :end_at] + + # Converts a string to upper case. + # + # @example + # to-upper-case(abcd) => ABCD + # + # @overload to_upper_case($string) + # @param $string [Sass::Script::Value::String] + # @return [Sass::Script::Value::String] + # @raise [ArgumentError] if `$string` isn't a string + def to_upper_case(string) + assert_type string, :String, :string + Sass::Script::Value::String.new(Sass::Util.upcase(string.value), string.type) + end + declare :to_upper_case, [:string] + + # Convert a string to lower case, + # + # @example + # to-lower-case(ABCD) => abcd + # + # @overload to_lower_case($string) + # @param $string [Sass::Script::Value::String] + # @return [Sass::Script::Value::String] + # @raise [ArgumentError] if `$string` isn't a string + def to_lower_case(string) + assert_type string, :String, :string + Sass::Script::Value::String.new(Sass::Util.downcase(string.value), string.type) + end + declare :to_lower_case, [:string] + + # Returns the type of a value. + # + # @example + # type-of(100px) => number + # type-of(asdf) => string + # type-of("asdf") => string + # type-of(true) => bool + # type-of(#fff) => color + # type-of(blue) => color + # type-of(null) => null + # type-of(a b c) => list + # type-of((a: 1, b: 2)) => map + # type-of(get-function("foo")) => function + # + # @overload type_of($value) + # @param $value [Sass::Script::Value::Base] The value to inspect + # @return [Sass::Script::Value::String] The unquoted string name of the + # value's type + def type_of(value) + value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String) + identifier(value.class.name.gsub(/Sass::Script::Value::/, '').downcase) + end + declare :type_of, [:value] + + # Returns whether a feature exists in the current Sass runtime. + # + # The following features are supported: + # + # * `global-variable-shadowing` indicates that a local variable will shadow + # a global variable unless `!global` is used. + # + # * `extend-selector-pseudoclass` indicates that `@extend` will reach into + # selector pseudoclasses like `:not`. + # + # * `units-level-3` indicates full support for unit arithmetic using units + # defined in the [Values and Units Level 3][] spec. + # + # [Values and Units Level 3]: http://www.w3.org/TR/css3-values/ + # + # * `at-error` indicates that the Sass `@error` directive is supported. + # + # * `custom-property` indicates that the [Custom Properties Level 1][] spec + # is supported. This means that custom properties are parsed statically, + # with only interpolation treated as SassScript. + # + # [Custom Properties Level 1]: https://www.w3.org/TR/css-variables-1/ + # + # @example + # feature-exists(some-feature-that-exists) => true + # feature-exists(what-is-this-i-dont-know) => false + # + # @overload feature_exists($feature) + # @param $feature [Sass::Script::Value::String] The name of the feature + # @return [Sass::Script::Value::Bool] Whether the feature is supported in this version of Sass + # @raise [ArgumentError] if `$feature` isn't a string + def feature_exists(feature) + assert_type feature, :String, :feature + bool(Sass.has_feature?(feature.value)) + end + declare :feature_exists, [:feature] + + # Returns a reference to a function for later invocation with the `call()` function. + # + # If `$css` is `false`, the function reference may refer to a function + # defined in your stylesheet or built-in to the host environment. If it's + # `true` it will refer to a plain-CSS function. + # + # @example + # get-function("rgb") + # + # @function myfunc { @return "something"; } + # get-function("myfunc") + # + # @overload get_function($name, $css: false) + # @param name [Sass::Script::Value::String] The name of the function being referenced. + # @param css [Sass::Script::Value::Bool] Whether to get a plain CSS function. + # + # @return [Sass::Script::Value::Function] A function reference. + def get_function(name, kwargs = {}) + assert_type name, :String, :name + + css = if kwargs.has_key?("css") + v = kwargs.delete("css") + assert_type v, :Bool, :css + v.value + else + false + end + + if kwargs.any? + raise ArgumentError.new("Illegal keyword argument '#{kwargs.keys.first}'") + end + + if css + return Sass::Script::Value::Function.new( + Sass::Callable.new(name.value, nil, nil, nil, nil, nil, "function", :css)) + end + + callable = environment.caller.function(name.value) || + (Sass::Script::Functions.callable?(name.value.tr("-", "_")) && + Sass::Callable.new(name.value, nil, nil, nil, nil, nil, "function", :builtin)) + + if callable + Sass::Script::Value::Function.new(callable) + else + raise Sass::SyntaxError.new("Function not found: #{name}") + end + end + declare :get_function, [:name], :var_kwargs => true + + # Returns the unit(s) associated with a number. Complex units are sorted in + # alphabetical order by numerator and denominator. + # + # @example + # unit(100) => "" + # unit(100px) => "px" + # unit(3em) => "em" + # unit(10px * 5em) => "em*px" + # unit(10px * 5em / 30cm / 1rem) => "em*px/cm*rem" + # @overload unit($number) + # @param $number [Sass::Script::Value::Number] + # @return [Sass::Script::Value::String] The unit(s) of the number, as a + # quoted string + # @raise [ArgumentError] if `$number` isn't a number + def unit(number) + assert_type number, :Number, :number + quoted_string(number.unit_str) + end + declare :unit, [:number] + + # Returns whether a number has units. + # + # @example + # unitless(100) => true + # unitless(100px) => false + # @overload unitless($number) + # @param $number [Sass::Script::Value::Number] + # @return [Sass::Script::Value::Bool] + # @raise [ArgumentError] if `$number` isn't a number + def unitless(number) + assert_type number, :Number, :number + bool(number.unitless?) + end + declare :unitless, [:number] + + # Returns whether two numbers can added, subtracted, or compared. + # + # @example + # comparable(2px, 1px) => true + # comparable(100px, 3em) => false + # comparable(10cm, 3mm) => true + # @overload comparable($number1, $number2) + # @param $number1 [Sass::Script::Value::Number] + # @param $number2 [Sass::Script::Value::Number] + # @return [Sass::Script::Value::Bool] + # @raise [ArgumentError] if either parameter is the wrong type + def comparable(number1, number2) + assert_type number1, :Number, :number1 + assert_type number2, :Number, :number2 + bool(number1.comparable_to?(number2)) + end + declare :comparable, [:number1, :number2] + + # Converts a unitless number to a percentage. + # + # @example + # percentage(0.2) => 20% + # percentage(100px / 50px) => 200% + # @overload percentage($number) + # @param $number [Sass::Script::Value::Number] + # @return [Sass::Script::Value::Number] + # @raise [ArgumentError] if `$number` isn't a unitless number + def percentage(number) + unless number.is_a?(Sass::Script::Value::Number) && number.unitless? + raise ArgumentError.new("$number: #{number.inspect} is not a unitless number") + end + number(number.value * 100, '%') + end + declare :percentage, [:number] + + # Rounds a number to the nearest whole number. + # + # @example + # round(10.4px) => 10px + # round(10.6px) => 11px + # @overload round($number) + # @param $number [Sass::Script::Value::Number] + # @return [Sass::Script::Value::Number] + # @raise [ArgumentError] if `$number` isn't a number + def round(number) + numeric_transformation(number) {|n| Sass::Util.round(n)} + end + declare :round, [:number] + + # Rounds a number up to the next whole number. + # + # @example + # ceil(10.4px) => 11px + # ceil(10.6px) => 11px + # @overload ceil($number) + # @param $number [Sass::Script::Value::Number] + # @return [Sass::Script::Value::Number] + # @raise [ArgumentError] if `$number` isn't a number + def ceil(number) + numeric_transformation(number) {|n| n.ceil} + end + declare :ceil, [:number] + + # Rounds a number down to the previous whole number. + # + # @example + # floor(10.4px) => 10px + # floor(10.6px) => 10px + # @overload floor($number) + # @param $number [Sass::Script::Value::Number] + # @return [Sass::Script::Value::Number] + # @raise [ArgumentError] if `$number` isn't a number + def floor(number) + numeric_transformation(number) {|n| n.floor} + end + declare :floor, [:number] + + # Returns the absolute value of a number. + # + # @example + # abs(10px) => 10px + # abs(-10px) => 10px + # @overload abs($number) + # @param $number [Sass::Script::Value::Number] + # @return [Sass::Script::Value::Number] + # @raise [ArgumentError] if `$number` isn't a number + def abs(number) + numeric_transformation(number) {|n| n.abs} + end + declare :abs, [:number] + + # Finds the minimum of several numbers. This function takes any number of + # arguments. + # + # @example + # min(1px, 4px) => 1px + # min(5em, 3em, 4em) => 3em + # @overload min($numbers...) + # @param $numbers [[Sass::Script::Value::Number]] + # @return [Sass::Script::Value::Number] + # @raise [ArgumentError] if any argument isn't a number, or if not all of + # the arguments have comparable units + def min(*numbers) + numbers.each {|n| assert_type n, :Number} + numbers.inject {|min, num| min.lt(num).to_bool ? min : num} + end + declare :min, [], :var_args => :true + + # Finds the maximum of several numbers. This function takes any number of + # arguments. + # + # @example + # max(1px, 4px) => 4px + # max(5em, 3em, 4em) => 5em + # @overload max($numbers...) + # @param $numbers [[Sass::Script::Value::Number]] + # @return [Sass::Script::Value::Number] + # @raise [ArgumentError] if any argument isn't a number, or if not all of + # the arguments have comparable units + def max(*values) + values.each {|v| assert_type v, :Number} + values.inject {|max, val| max.gt(val).to_bool ? max : val} + end + declare :max, [], :var_args => :true + + # Return the length of a list. + # + # This can return the number of pairs in a map as well. + # + # @example + # length(10px) => 1 + # length(10px 20px 30px) => 3 + # length((width: 10px, height: 20px)) => 2 + # @overload length($list) + # @param $list [Sass::Script::Value::Base] + # @return [Sass::Script::Value::Number] + def length(list) + number(list.to_a.size) + end + declare :length, [:list] + + # Return a new list, based on the list provided, but with the nth + # element changed to the value given. + # + # Note that unlike some languages, the first item in a Sass list is number + # 1, the second number 2, and so forth. + # + # Negative index values address elements in reverse order, starting with the last element + # in the list. + # + # @example + # set-nth($list: 10px 20px 30px, $n: 2, $value: -20px) => 10px -20px 30px + # @overload set-nth($list, $n, $value) + # @param $list [Sass::Script::Value::Base] The list that will be copied, having the element + # at index `$n` changed. + # @param $n [Sass::Script::Value::Number] The index of the item to set. + # Negative indices count from the end of the list. + # @param $value [Sass::Script::Value::Base] The new value at index `$n`. + # @return [Sass::Script::Value::List] + # @raise [ArgumentError] if `$n` isn't an integer between 1 and the length + # of `$list` + def set_nth(list, n, value) + assert_type n, :Number, :n + Sass::Script::Value::List.assert_valid_index(list, n) + index = n.to_i > 0 ? n.to_i - 1 : n.to_i + new_list = list.to_a.dup + new_list[index] = value + list.with_contents(new_list) + end + declare :set_nth, [:list, :n, :value] + + # Gets the nth item in a list. + # + # Note that unlike some languages, the first item in a Sass list is number + # 1, the second number 2, and so forth. + # + # This can return the nth pair in a map as well. + # + # Negative index values address elements in reverse order, starting with the last element in + # the list. + # + # @example + # nth(10px 20px 30px, 1) => 10px + # nth((Helvetica, Arial, sans-serif), 3) => sans-serif + # nth((width: 10px, length: 20px), 2) => length, 20px + # @overload nth($list, $n) + # @param $list [Sass::Script::Value::Base] + # @param $n [Sass::Script::Value::Number] The index of the item to get. + # Negative indices count from the end of the list. + # @return [Sass::Script::Value::Base] + # @raise [ArgumentError] if `$n` isn't an integer between 1 and the length + # of `$list` + def nth(list, n) + assert_type n, :Number, :n + Sass::Script::Value::List.assert_valid_index(list, n) + + index = n.to_i > 0 ? n.to_i - 1 : n.to_i + list.to_a[index] + end + declare :nth, [:list, :n] + + # Joins together two lists into one. + # + # Unless `$separator` is passed, if one list is comma-separated and one is + # space-separated, the first parameter's separator is used for the resulting + # list. If both lists have fewer than two items, spaces are used for the + # resulting list. + # + # Unless `$bracketed` is passed, the resulting list is bracketed if the + # first parameter is. + # + # Like all list functions, `join()` returns a new list rather than modifying + # its arguments in place. + # + # @example + # join(10px 20px, 30px 40px) => 10px 20px 30px 40px + # join((blue, red), (#abc, #def)) => blue, red, #abc, #def + # join(10px, 20px) => 10px 20px + # join(10px, 20px, comma) => 10px, 20px + # join((blue, red), (#abc, #def), space) => blue red #abc #def + # join([10px], 20px) => [10px 20px] + # @overload join($list1, $list2, $separator: auto, $bracketed: auto) + # @param $list1 [Sass::Script::Value::Base] + # @param $list2 [Sass::Script::Value::Base] + # @param $separator [Sass::Script::Value::String] The list separator to use. + # If this is `comma` or `space`, that separator will be used. If this is + # `auto` (the default), the separator is determined as explained above. + # @param $bracketed [Sass::Script::Value::Base] Whether the resulting list + # will be bracketed. If this is `auto` (the default), the separator is + # determined as explained above. + # @return [Sass::Script::Value::List] + def join(list1, list2, + separator = identifier("auto"), bracketed = identifier("auto"), + kwargs = nil, *rest) + if separator.is_a?(Hash) + kwargs = separator + separator = identifier("auto") + elsif bracketed.is_a?(Hash) + kwargs = bracketed + bracketed = identifier("auto") + elsif rest.last.is_a?(Hash) + rest.unshift kwargs + kwargs = rest.pop + end + + unless rest.empty? + # Add 4 to rest.length because we don't want to count the kwargs hash, + # which is always passed. + raise ArgumentError.new("wrong number of arguments (#{rest.length + 4} for 2..4)") + end + + if kwargs + separator = kwargs.delete("separator") || separator + bracketed = kwargs.delete("bracketed") || bracketed + + unless kwargs.empty? + name, val = kwargs.to_a.first + raise ArgumentError.new("Unknown argument $#{name} (#{val})") + end + end + + assert_type separator, :String, :separator + unless %w(auto space comma).include?(separator.value) + raise ArgumentError.new("Separator name must be space, comma, or auto") + end + + list(list1.to_a + list2.to_a, + separator: + if separator.value == 'auto' + list1.separator || list2.separator || :space + else + separator.value.to_sym + end, + bracketed: + if bracketed.is_a?(Sass::Script::Value::String) && bracketed.value == 'auto' + list1.bracketed + else + bracketed.to_bool + end) + end + # We don't actually take variable arguments or keyword arguments, but this + # is the best way to take either `$separator` or `$bracketed` as keywords + # without complaining about the other missing. + declare :join, [:list1, :list2], :var_args => true, :var_kwargs => true + + # Appends a single value onto the end of a list. + # + # Unless the `$separator` argument is passed, if the list had only one item, + # the resulting list will be space-separated. + # + # Like all list functions, `append()` returns a new list rather than + # modifying its argument in place. + # + # @example + # append(10px 20px, 30px) => 10px 20px 30px + # append((blue, red), green) => blue, red, green + # append(10px 20px, 30px 40px) => 10px 20px (30px 40px) + # append(10px, 20px, comma) => 10px, 20px + # append((blue, red), green, space) => blue red green + # @overload append($list, $val, $separator: auto) + # @param $list [Sass::Script::Value::Base] + # @param $val [Sass::Script::Value::Base] + # @param $separator [Sass::Script::Value::String] The list separator to use. + # If this is `comma` or `space`, that separator will be used. If this is + # `auto` (the default), the separator is determined as explained above. + # @return [Sass::Script::Value::List] + def append(list, val, separator = identifier("auto")) + assert_type separator, :String, :separator + unless %w(auto space comma).include?(separator.value) + raise ArgumentError.new("Separator name must be space, comma, or auto") + end + list.with_contents(list.to_a + [val], + separator: + if separator.value == 'auto' + list.separator || :space + else + separator.value.to_sym + end) + end + declare :append, [:list, :val] + declare :append, [:list, :val, :separator] + + # Combines several lists into a single multidimensional list. The nth value + # of the resulting list is a space separated list of the source lists' nth + # values. + # + # The length of the resulting list is the length of the + # shortest list. + # + # @example + # zip(1px 1px 3px, solid dashed solid, red green blue) + # => 1px solid red, 1px dashed green, 3px solid blue + # @overload zip($lists...) + # @param $lists [[Sass::Script::Value::Base]] + # @return [Sass::Script::Value::List] + def zip(*lists) + length = nil + values = [] + lists.each do |list| + array = list.to_a + values << array.dup + length = length.nil? ? array.length : [length, array.length].min + end + values.each do |value| + value.slice!(length) + end + new_list_value = values.first.zip(*values[1..-1]) + list(new_list_value.map {|list| list(list, :space)}, :comma) + end + declare :zip, [], :var_args => true + + # Returns the position of a value within a list. If the value isn't found, + # returns `null` instead. + # + # Note that unlike some languages, the first item in a Sass list is number + # 1, the second number 2, and so forth. + # + # This can return the position of a pair in a map as well. + # + # @example + # index(1px solid red, solid) => 2 + # index(1px solid red, dashed) => null + # index((width: 10px, height: 20px), (height 20px)) => 2 + # @overload index($list, $value) + # @param $list [Sass::Script::Value::Base] + # @param $value [Sass::Script::Value::Base] + # @return [Sass::Script::Value::Number, Sass::Script::Value::Null] The + # 1-based index of `$value` in `$list`, or `null` + def index(list, value) + index = list.to_a.index {|e| e.eq(value).to_bool} + index ? number(index + 1) : null + end + declare :index, [:list, :value] + + # Returns the separator of a list. If the list doesn't have a separator due + # to having fewer than two elements, returns `space`. + # + # @example + # list-separator(1px 2px 3px) => space + # list-separator(1px, 2px, 3px) => comma + # list-separator('foo') => space + # @overload list_separator($list) + # @param $list [Sass::Script::Value::Base] + # @return [Sass::Script::Value::String] `comma` or `space` + def list_separator(list) + identifier((list.separator || :space).to_s) + end + declare :list_separator, [:list] + + # Returns whether a list uses square brackets. + # + # @example + # is-bracketed(1px 2px 3px) => false + # is-bracketed([1px, 2px, 3px]) => true + # @overload is_bracketed($list) + # @param $list [Sass::Script::Value::Base] + # @return [Sass::Script::Value::Bool] + def is_bracketed(list) + bool(list.bracketed) + end + declare :is_bracketed, [:list] + + # Returns the value in a map associated with the given key. If the map + # doesn't have such a key, returns `null`. + # + # @example + # map-get(("foo": 1, "bar": 2), "foo") => 1 + # map-get(("foo": 1, "bar": 2), "bar") => 2 + # map-get(("foo": 1, "bar": 2), "baz") => null + # @overload map_get($map, $key) + # @param $map [Sass::Script::Value::Map] + # @param $key [Sass::Script::Value::Base] + # @return [Sass::Script::Value::Base] The value indexed by `$key`, or `null` + # if the map doesn't contain the given key + # @raise [ArgumentError] if `$map` is not a map + def map_get(map, key) + assert_type map, :Map, :map + map.to_h[key] || null + end + declare :map_get, [:map, :key] + + # Merges two maps together into a new map. Keys in `$map2` will take + # precedence over keys in `$map1`. + # + # This is the best way to add new values to a map. + # + # All keys in the returned map that also appear in `$map1` will have the + # same order as in `$map1`. New keys from `$map2` will be placed at the end + # of the map. + # + # Like all map functions, `map-merge()` returns a new map rather than + # modifying its arguments in place. + # + # @example + # map-merge(("foo": 1), ("bar": 2)) => ("foo": 1, "bar": 2) + # map-merge(("foo": 1, "bar": 2), ("bar": 3)) => ("foo": 1, "bar": 3) + # @overload map_merge($map1, $map2) + # @param $map1 [Sass::Script::Value::Map] + # @param $map2 [Sass::Script::Value::Map] + # @return [Sass::Script::Value::Map] + # @raise [ArgumentError] if either parameter is not a map + def map_merge(map1, map2) + assert_type map1, :Map, :map1 + assert_type map2, :Map, :map2 + map(map1.to_h.merge(map2.to_h)) + end + declare :map_merge, [:map1, :map2] + + # Returns a new map with keys removed. + # + # Like all map functions, `map-merge()` returns a new map rather than + # modifying its arguments in place. + # + # @example + # map-remove(("foo": 1, "bar": 2), "bar") => ("foo": 1) + # map-remove(("foo": 1, "bar": 2, "baz": 3), "bar", "baz") => ("foo": 1) + # map-remove(("foo": 1, "bar": 2), "baz") => ("foo": 1, "bar": 2) + # @overload map_remove($map, $keys...) + # @param $map [Sass::Script::Value::Map] + # @param $keys [[Sass::Script::Value::Base]] + # @return [Sass::Script::Value::Map] + # @raise [ArgumentError] if `$map` is not a map + def map_remove(map, *keys) + assert_type map, :Map, :map + hash = map.to_h.dup + hash.delete_if {|key, _| keys.include?(key)} + map(hash) + end + declare :map_remove, [:map, :key], :var_args => true + + # Returns a list of all keys in a map. + # + # @example + # map-keys(("foo": 1, "bar": 2)) => "foo", "bar" + # @overload map_keys($map) + # @param $map [Map] + # @return [List] the list of keys, comma-separated + # @raise [ArgumentError] if `$map` is not a map + def map_keys(map) + assert_type map, :Map, :map + list(map.to_h.keys, :comma) + end + declare :map_keys, [:map] + + # Returns a list of all values in a map. This list may include duplicate + # values, if multiple keys have the same value. + # + # @example + # map-values(("foo": 1, "bar": 2)) => 1, 2 + # map-values(("foo": 1, "bar": 2, "baz": 1)) => 1, 2, 1 + # @overload map_values($map) + # @param $map [Map] + # @return [List] the list of values, comma-separated + # @raise [ArgumentError] if `$map` is not a map + def map_values(map) + assert_type map, :Map, :map + list(map.to_h.values, :comma) + end + declare :map_values, [:map] + + # Returns whether a map has a value associated with a given key. + # + # @example + # map-has-key(("foo": 1, "bar": 2), "foo") => true + # map-has-key(("foo": 1, "bar": 2), "baz") => false + # @overload map_has_key($map, $key) + # @param $map [Sass::Script::Value::Map] + # @param $key [Sass::Script::Value::Base] + # @return [Sass::Script::Value::Bool] + # @raise [ArgumentError] if `$map` is not a map + def map_has_key(map, key) + assert_type map, :Map, :map + bool(map.to_h.has_key?(key)) + end + declare :map_has_key, [:map, :key] + + # Returns the map of named arguments passed to a function or mixin that + # takes a variable argument list. The argument names are strings, and they + # do not contain the leading `$`. + # + # @example + # @mixin foo($args...) { + # @debug keywords($args); //=> (arg1: val, arg2: val) + # } + # + # @include foo($arg1: val, $arg2: val); + # @overload keywords($args) + # @param $args [Sass::Script::Value::ArgList] + # @return [Sass::Script::Value::Map] + # @raise [ArgumentError] if `$args` isn't a variable argument list + def keywords(args) + assert_type args, :ArgList, :args + map(Sass::Util.map_keys(args.keywords.as_stored) {|k| Sass::Script::Value::String.new(k)}) + end + declare :keywords, [:args] + + # Returns one of two values, depending on whether or not `$condition` is + # true. Just like in `@if`, all values other than `false` and `null` are + # considered to be true. + # + # @example + # if(true, 1px, 2px) => 1px + # if(false, 1px, 2px) => 2px + # @overload if($condition, $if-true, $if-false) + # @param $condition [Sass::Script::Value::Base] Whether the `$if-true` or + # `$if-false` will be returned + # @param $if-true [Sass::Script::Tree::Node] + # @param $if-false [Sass::Script::Tree::Node] + # @return [Sass::Script::Value::Base] `$if-true` or `$if-false` + def if(condition, if_true, if_false) + if condition.to_bool + perform(if_true) + else + perform(if_false) + end + end + declare :if, [:condition, :"&if_true", :"&if_false"] + + # Returns a unique CSS identifier. The identifier is returned as an unquoted + # string. The identifier returned is only guaranteed to be unique within the + # scope of a single Sass run. + # + # @overload unique_id() + # @return [Sass::Script::Value::String] + def unique_id + generator = Sass::Script::Functions.random_number_generator + Thread.current[:sass_last_unique_id] ||= generator.rand(36**8) + # avoid the temptation of trying to guess the next unique value. + value = (Thread.current[:sass_last_unique_id] += (generator.rand(10) + 1)) + # the u makes this a legal identifier if it would otherwise start with a number. + identifier("u" + value.to_s(36).rjust(8, '0')) + end + declare :unique_id, [] + + # Dynamically calls a function. This can call user-defined + # functions, built-in functions, or plain CSS functions. It will + # pass along all arguments, including keyword arguments, to the + # called function. + # + # @example + # call(rgb, 10, 100, 255) => #0a64ff + # call(scale-color, #0a64ff, $lightness: -10%) => #0058ef + # + # $fn: nth; + # call($fn, (a b c), 2) => b + # + # @overload call($function, $args...) + # @param $function [Sass::Script::Value::Function] The function to call. + def call(name, *args) + unless name.is_a?(Sass::Script::Value::String) || + name.is_a?(Sass::Script::Value::Function) + assert_type name, :Function, :function + end + if name.is_a?(Sass::Script::Value::String) + name = if function_exists(name).to_bool + get_function(name) + else + get_function(name, "css" => bool(true)) + end + Sass::Util.sass_warn(<<WARNING) +DEPRECATION WARNING: Passing a string to call() is deprecated and will be illegal +in Sass 4.0. Use call(#{name.to_sass}) instead. +WARNING + end + kwargs = args.last.is_a?(Hash) ? args.pop : {} + funcall = Sass::Script::Tree::Funcall.new( + name.value, + args.map {|a| Sass::Script::Tree::Literal.new(a)}, + Sass::Util.map_vals(kwargs) {|v| Sass::Script::Tree::Literal.new(v)}, + nil, + nil) + funcall.line = environment.stack.frames.last.line + funcall.filename = environment.stack.frames.last.filename + funcall.options = options + perform(funcall) + end + declare :call, [:name], :var_args => true, :var_kwargs => true + + # This function only exists as a workaround for IE7's [`content: + # counter` bug](http://jes.st/2013/ie7s-css-breaking-content-counter-bug/). + # It works identically to any other plain-CSS function, except it + # avoids adding spaces between the argument commas. + # + # @example + # counter(item, ".") => counter(item,".") + # @overload counter($args...) + # @return [Sass::Script::Value::String] + def counter(*args) + identifier("counter(#{args.map {|a| a.to_s(options)}.join(',')})") + end + declare :counter, [], :var_args => true + + # This function only exists as a workaround for IE7's [`content: + # counter` bug](http://jes.st/2013/ie7s-css-breaking-content-counter-bug/). + # It works identically to any other plain-CSS function, except it + # avoids adding spaces between the argument commas. + # + # @example + # counters(item, ".") => counters(item,".") + # @overload counters($args...) + # @return [Sass::Script::Value::String] + def counters(*args) + identifier("counters(#{args.map {|a| a.to_s(options)}.join(',')})") + end + declare :counters, [], :var_args => true + + # Check whether a variable with the given name exists in the current + # scope or in the global scope. + # + # @example + # $a-false-value: false; + # variable-exists(a-false-value) => true + # variable-exists(a-null-value) => true + # + # variable-exists(nonexistent) => false + # + # @overload variable_exists($name) + # @param $name [Sass::Script::Value::String] The name of the variable to + # check. The name should not include the `$`. + # @return [Sass::Script::Value::Bool] Whether the variable is defined in + # the current scope. + def variable_exists(name) + assert_type name, :String, :name + bool(environment.caller.var(name.value)) + end + declare :variable_exists, [:name] + + # Check whether a variable with the given name exists in the global + # scope (at the top level of the file). + # + # @example + # $a-false-value: false; + # global-variable-exists(a-false-value) => true + # global-variable-exists(a-null-value) => true + # + # .foo { + # $some-var: false; + # @if global-variable-exists(some-var) { /* false, doesn't run */ } + # } + # + # @overload global_variable_exists($name) + # @param $name [Sass::Script::Value::String] The name of the variable to + # check. The name should not include the `$`. + # @return [Sass::Script::Value::Bool] Whether the variable is defined in + # the global scope. + def global_variable_exists(name) + assert_type name, :String, :name + bool(environment.global_env.var(name.value)) + end + declare :global_variable_exists, [:name] + + # Check whether a function with the given name exists. + # + # @example + # function-exists(lighten) => true + # + # @function myfunc { @return "something"; } + # function-exists(myfunc) => true + # + # @overload function_exists($name) + # @param name [Sass::Script::Value::String] The name of the function to + # check or a function reference. + # @return [Sass::Script::Value::Bool] Whether the function is defined. + def function_exists(name) + assert_type name, :String, :name + exists = Sass::Script::Functions.callable?(name.value.tr("-", "_")) + exists ||= environment.caller.function(name.value) + bool(exists) + end + declare :function_exists, [:name] + + # Check whether a mixin with the given name exists. + # + # @example + # mixin-exists(nonexistent) => false + # + # @mixin red-text { color: red; } + # mixin-exists(red-text) => true + # + # @overload mixin_exists($name) + # @param name [Sass::Script::Value::String] The name of the mixin to + # check. + # @return [Sass::Script::Value::Bool] Whether the mixin is defined. + def mixin_exists(name) + assert_type name, :String, :name + bool(environment.mixin(name.value)) + end + declare :mixin_exists, [:name] + + # Check whether a mixin was passed a content block. + # + # Unless `content-exists()` is called directly from a mixin, an error will be raised. + # + # @example + # @mixin needs-content { + # @if not content-exists() { + # @error "You must pass a content block!" + # } + # @content; + # } + # + # @overload content_exists() + # @return [Sass::Script::Value::Bool] Whether a content block was passed to the mixin. + def content_exists + # frames.last is the stack frame for this function, + # so we use frames[-2] to get the frame before that. + mixin_frame = environment.stack.frames[-2] + unless mixin_frame && mixin_frame.type == :mixin + raise Sass::SyntaxError.new("Cannot call content-exists() except within a mixin.") + end + bool(!environment.caller.content.nil?) + end + declare :content_exists, [] + + # Return a string containing the value as its Sass representation. + # + # @overload inspect($value) + # @param $value [Sass::Script::Value::Base] The value to inspect. + # @return [Sass::Script::Value::String] A representation of the value as + # it would be written in Sass. + def inspect(value) + value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String) + unquoted_string(value.to_sass) + end + declare :inspect, [:value] + + # @overload random() + # Return a decimal between 0 and 1, inclusive of 0 but not 1. + # @return [Sass::Script::Value::Number] A decimal value. + # @overload random($limit) + # Return an integer between 1 and `$limit`, inclusive of both 1 and `$limit`. + # @param $limit [Sass::Script::Value::Number] The maximum of the random integer to be + # returned, a positive integer. + # @return [Sass::Script::Value::Number] An integer. + # @raise [ArgumentError] if the `$limit` is not 1 or greater + def random(limit = nil) + generator = Sass::Script::Functions.random_number_generator + if limit + assert_integer limit, "limit" + if limit.to_i < 1 + raise ArgumentError.new("$limit #{limit} must be greater than or equal to 1") + end + number(1 + generator.rand(limit.to_i)) + else + number(generator.rand) + end + end + declare :random, [] + declare :random, [:limit] + + # Parses a user-provided selector into a list of lists of strings + # as returned by `&`. + # + # @example + # selector-parse(".foo .bar, .baz .bang") => ('.foo' '.bar', '.baz' '.bang') + # + # @overload selector_parse($selector) + # @param $selector [Sass::Script::Value::String, Sass::Script::Value::List] + # The selector to parse. This can be either a string, a list of + # strings, or a list of lists of strings as returned by `&`. + # @return [Sass::Script::Value::List] + # A list of lists of strings representing `$selector`. This is + # in the same format as a selector returned by `&`. + def selector_parse(selector) + parse_selector(selector, :selector).to_sass_script + end + declare :selector_parse, [:selector] + + # Return a new selector with all selectors in `$selectors` nested beneath + # one another as though they had been nested in the stylesheet as + # `$selector1 { $selector2 { ... } }`. + # + # Unlike most selector functions, `selector-nest` allows the + # parent selector `&` to be used in any selector but the first. + # + # @example + # selector-nest(".foo", ".bar", ".baz") => .foo .bar .baz + # selector-nest(".a .foo", ".b .bar") => .a .foo .b .bar + # selector-nest(".foo", "&.bar") => .foo.bar + # + # @overload selector_nest($selectors...) + # @param $selectors [[Sass::Script::Value::String, Sass::Script::Value::List]] + # The selectors to nest. At least one selector must be passed. Each of + # these can be either a string, a list of strings, or a list of lists of + # strings as returned by `&`. + # @return [Sass::Script::Value::List] + # A list of lists of strings representing the result of nesting + # `$selectors`. This is in the same format as a selector returned by + # `&`. + def selector_nest(*selectors) + if selectors.empty? + raise ArgumentError.new("$selectors: At least one selector must be passed") + end + + parsed = [parse_selector(selectors.first, :selectors)] + parsed += selectors[1..-1].map {|sel| parse_selector(sel, :selectors, true)} + parsed.inject {|result, child| child.resolve_parent_refs(result)}.to_sass_script + end + declare :selector_nest, [], :var_args => true + + # Return a new selector with all selectors in `$selectors` appended one + # another as though they had been nested in the stylesheet as `$selector1 { + # &$selector2 { ... } }`. + # + # @example + # selector-append(".foo", ".bar", ".baz") => .foo.bar.baz + # selector-append(".a .foo", ".b .bar") => "a .foo.b .bar" + # selector-append(".foo", "-suffix") => ".foo-suffix" + # + # @overload selector_append($selectors...) + # @param $selectors [[Sass::Script::Value::String, Sass::Script::Value::List]] + # The selectors to append. At least one selector must be passed. Each of + # these can be either a string, a list of strings, or a list of lists of + # strings as returned by `&`. + # @return [Sass::Script::Value::List] + # A list of lists of strings representing the result of appending + # `$selectors`. This is in the same format as a selector returned by + # `&`. + # @raise [ArgumentError] if a selector could not be appended. + def selector_append(*selectors) + if selectors.empty? + raise ArgumentError.new("$selectors: At least one selector must be passed") + end + + selectors.map {|sel| parse_selector(sel, :selectors)}.inject do |parent, child| + child.members.each do |seq| + sseq = seq.members.first + unless sseq.is_a?(Sass::Selector::SimpleSequence) + raise ArgumentError.new("Can't append \"#{seq}\" to \"#{parent}\"") + end + + base = sseq.base + case base + when Sass::Selector::Universal + raise ArgumentError.new("Can't append \"#{seq}\" to \"#{parent}\"") + when Sass::Selector::Element + unless base.namespace.nil? + raise ArgumentError.new("Can't append \"#{seq}\" to \"#{parent}\"") + end + sseq.members[0] = Sass::Selector::Parent.new(base.name) + else + sseq.members.unshift Sass::Selector::Parent.new + end + end + child.resolve_parent_refs(parent) + end.to_sass_script + end + declare :selector_append, [], :var_args => true + + # Returns a new version of `$selector` with `$extendee` extended + # with `$extender`. This works just like the result of + # + # $selector { ... } + # $extender { @extend $extendee } + # + # @example + # selector-extend(".a .b", ".b", ".foo .bar") => .a .b, .a .foo .bar, .foo .a .bar + # + # @overload selector_extend($selector, $extendee, $extender) + # @param $selector [Sass::Script::Value::String, Sass::Script::Value::List] + # The selector within which `$extendee` is extended with + # `$extender`. This can be either a string, a list of strings, + # or a list of lists of strings as returned by `&`. + # @param $extendee [Sass::Script::Value::String, Sass::Script::Value::List] + # The selector being extended. This can be either a string, a + # list of strings, or a list of lists of strings as returned + # by `&`. + # @param $extender [Sass::Script::Value::String, Sass::Script::Value::List] + # The selector being injected into `$selector`. This can be + # either a string, a list of strings, or a list of lists of + # strings as returned by `&`. + # @return [Sass::Script::Value::List] + # A list of lists of strings representing the result of the + # extension. This is in the same format as a selector returned + # by `&`. + # @raise [ArgumentError] if the extension fails + def selector_extend(selector, extendee, extender) + selector = parse_selector(selector, :selector) + extendee = parse_selector(extendee, :extendee) + extender = parse_selector(extender, :extender) + + extends = Sass::Util::SubsetMap.new + begin + extender.populate_extends(extends, extendee, nil, [], true) + selector.do_extend(extends).to_sass_script + rescue Sass::SyntaxError => e + raise ArgumentError.new(e.to_s) + end + end + declare :selector_extend, [:selector, :extendee, :extender] + + # Replaces all instances of `$original` with `$replacement` in `$selector` + # + # This works by using `@extend` and throwing away the original + # selector. This means that it can be used to do very advanced + # replacements; see the examples below. + # + # @example + # selector-replace(".foo .bar", ".bar", ".baz") => ".foo .baz" + # selector-replace(".foo.bar.baz", ".foo.baz", ".qux") => ".bar.qux" + # + # @overload selector_replace($selector, $original, $replacement) + # @param $selector [Sass::Script::Value::String, Sass::Script::Value::List] + # The selector within which `$original` is replaced with + # `$replacement`. This can be either a string, a list of + # strings, or a list of lists of strings as returned by `&`. + # @param $original [Sass::Script::Value::String, Sass::Script::Value::List] + # The selector being replaced. This can be either a string, a + # list of strings, or a list of lists of strings as returned + # by `&`. + # @param $replacement [Sass::Script::Value::String, Sass::Script::Value::List] + # The selector that `$original` is being replaced with. This + # can be either a string, a list of strings, or a list of + # lists of strings as returned by `&`. + # @return [Sass::Script::Value::List] + # A list of lists of strings representing the result of the + # extension. This is in the same format as a selector returned + # by `&`. + # @raise [ArgumentError] if the replacement fails + def selector_replace(selector, original, replacement) + selector = parse_selector(selector, :selector) + original = parse_selector(original, :original) + replacement = parse_selector(replacement, :replacement) + + extends = Sass::Util::SubsetMap.new + begin + replacement.populate_extends(extends, original, nil, [], true) + selector.do_extend(extends, [], true).to_sass_script + rescue Sass::SyntaxError => e + raise ArgumentError.new(e.to_s) + end + end + declare :selector_replace, [:selector, :original, :replacement] + + # Unifies two selectors into a single selector that matches only + # elements matched by both input selectors. Returns `null` if + # there is no such selector. + # + # Like the selector unification done for `@extend`, this doesn't + # guarantee that the output selector will match *all* elements + # matched by both input selectors. For example, if `.a .b` is + # unified with `.x .y`, `.a .x .b.y, .x .a .b.y` will be returned, + # but `.a.x .b.y` will not. This avoids exponential output size + # while matching all elements that are likely to exist in + # practice. + # + # @example + # selector-unify(".a", ".b") => .a.b + # selector-unify(".a .b", ".x .y") => .a .x .b.y, .x .a .b.y + # selector-unify(".a.b", ".b.c") => .a.b.c + # selector-unify("#a", "#b") => null + # + # @overload selector_unify($selector1, $selector2) + # @param $selector1 [Sass::Script::Value::String, Sass::Script::Value::List] + # The first selector to be unified. This can be either a + # string, a list of strings, or a list of lists of strings as + # returned by `&`. + # @param $selector2 [Sass::Script::Value::String, Sass::Script::Value::List] + # The second selector to be unified. This can be either a + # string, a list of strings, or a list of lists of strings as + # returned by `&`. + # @return [Sass::Script::Value::List, Sass::Script::Value::Null] + # A list of lists of strings representing the result of the + # unification, or null if no unification exists. This is in + # the same format as a selector returned by `&`. + def selector_unify(selector1, selector2) + selector1 = parse_selector(selector1, :selector1) + selector2 = parse_selector(selector2, :selector2) + return null unless (unified = selector1.unify(selector2)) + unified.to_sass_script + end + declare :selector_unify, [:selector1, :selector2] + + # Returns the [simple + # selectors](http://dev.w3.org/csswg/selectors4/#simple) that + # comprise the compound selector `$selector`. + # + # Note that `$selector` **must be** a [compound + # selector](http://dev.w3.org/csswg/selectors4/#compound). That + # means it cannot contain commas or spaces. It also means that + # unlike other selector functions, this takes only strings, not + # lists. + # + # @example + # simple-selectors(".foo.bar") => ".foo", ".bar" + # simple-selectors(".foo.bar.baz") => ".foo", ".bar", ".baz" + # + # @overload simple_selectors($selector) + # @param $selector [Sass::Script::Value::String] + # The compound selector whose simple selectors will be extracted. + # @return [Sass::Script::Value::List] + # A list of simple selectors in the compound selector. + def simple_selectors(selector) + selector = parse_compound_selector(selector, :selector) + list(selector.members.map {|simple| unquoted_string(simple.to_s)}, :comma) + end + declare :simple_selectors, [:selector] + + # Returns whether `$super` is a superselector of `$sub`. This means that + # `$super` matches all the elements that `$sub` matches, as well as possibly + # additional elements. In general, simpler selectors tend to be + # superselectors of more complex oned. + # + # @example + # is-superselector(".foo", ".foo.bar") => true + # is-superselector(".foo.bar", ".foo") => false + # is-superselector(".bar", ".foo .bar") => true + # is-superselector(".foo .bar", ".bar") => false + # + # @overload is_superselector($super, $sub) + # @param $super [Sass::Script::Value::String, Sass::Script::Value::List] + # The potential superselector. This can be either a string, a list of + # strings, or a list of lists of strings as returned by `&`. + # @param $sub [Sass::Script::Value::String, Sass::Script::Value::List] + # The potential subselector. This can be either a string, a list of + # strings, or a list of lists of strings as returned by `&`. + # @return [Sass::Script::Value::Bool] + # Whether `$selector1` is a superselector of `$selector2`. + def is_superselector(sup, sub) + sup = parse_selector(sup, :super) + sub = parse_selector(sub, :sub) + bool(sup.superselector?(sub)) + end + declare :is_superselector, [:super, :sub] + + private + + # This method implements the pattern of transforming a numeric value into + # another numeric value with the same units. + # It yields a number to a block to perform the operation and return a number + def numeric_transformation(value) + assert_type value, :Number, :value + Sass::Script::Value::Number.new( + yield(value.value), value.numerator_units, value.denominator_units) + end + + def _adjust(color, amount, attr, range, op, units = "") + assert_type color, :Color, :color + assert_type amount, :Number, :amount + Sass::Util.check_range('Amount', range, amount, units) + + color.with(attr => color.send(attr).send(op, amount.value)) + end + + def percentage_or_unitless(number, max, name) + if number.unitless? + number.value + elsif number.is_unit?("%") + max * number.value / 100.0; + else + raise ArgumentError.new( + "$#{name}: Expected #{number} to have no units or \"%\""); + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/lexer.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/lexer.rb new file mode 100644 index 000000000000..5f02ad98960a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/lexer.rb @@ -0,0 +1,518 @@ +require 'sass/scss/rx' + +module Sass + module Script + # The lexical analyzer for SassScript. + # It takes a raw string and converts it to individual tokens + # that are easier to parse. + class Lexer + include Sass::SCSS::RX + + # A struct containing information about an individual token. + # + # `type`: \[`Symbol`\] + # : The type of token. + # + # `value`: \[`Object`\] + # : The Ruby object corresponding to the value of the token. + # + # `source_range`: \[`Sass::Source::Range`\] + # : The range in the source file in which the token appeared. + # + # `pos`: \[`Integer`\] + # : The scanner position at which the SassScript token appeared. + Token = Struct.new(:type, :value, :source_range, :pos) + + # The line number of the lexer's current position. + # + # @return [Integer] + def line + return @line unless @tok + @tok.source_range.start_pos.line + end + + # The number of bytes into the current line + # of the lexer's current position (1-based). + # + # @return [Integer] + def offset + return @offset unless @tok + @tok.source_range.start_pos.offset + end + + # A hash from operator strings to the corresponding token types. + OPERATORS = { + '+' => :plus, + '-' => :minus, + '*' => :times, + '/' => :div, + '%' => :mod, + '=' => :single_eq, + ':' => :colon, + '(' => :lparen, + ')' => :rparen, + '[' => :lsquare, + ']' => :rsquare, + ',' => :comma, + 'and' => :and, + 'or' => :or, + 'not' => :not, + '==' => :eq, + '!=' => :neq, + '>=' => :gte, + '<=' => :lte, + '>' => :gt, + '<' => :lt, + '#{' => :begin_interpolation, + '}' => :end_interpolation, + ';' => :semicolon, + '{' => :lcurly, + '...' => :splat, + } + + OPERATORS_REVERSE = Sass::Util.map_hash(OPERATORS) {|k, v| [v, k]} + + TOKEN_NAMES = Sass::Util.map_hash(OPERATORS_REVERSE) {|k, v| [k, v.inspect]}.merge( + :const => "variable (e.g. $foo)", + :ident => "identifier (e.g. middle)") + + # A list of operator strings ordered with longer names first + # so that `>` and `<` don't clobber `>=` and `<=`. + OP_NAMES = OPERATORS.keys.sort_by {|o| -o.size} + + # A sub-list of {OP_NAMES} that only includes operators + # with identifier names. + IDENT_OP_NAMES = OP_NAMES.select {|k, _v| k =~ /^\w+/} + + PARSEABLE_NUMBER = /(?:(\d*\.\d+)|(\d+))(?:[eE]([+-]?\d+))?(#{UNIT})?/ + + # A hash of regular expressions that are used for tokenizing. + REGULAR_EXPRESSIONS = { + :whitespace => /\s+/, + :comment => COMMENT, + :single_line_comment => SINGLE_LINE_COMMENT, + :variable => /(\$)(#{IDENT})/, + :ident => /(#{IDENT})(\()?/, + :number => PARSEABLE_NUMBER, + :unary_minus_number => /-#{PARSEABLE_NUMBER}/, + :color => HEXCOLOR, + :id => /##{IDENT}/, + :selector => /&/, + :ident_op => /(#{Regexp.union(*IDENT_OP_NAMES.map do |s| + Regexp.new(Regexp.escape(s) + "(?!#{NMCHAR}|\Z)") + end)})/, + :op => /(#{Regexp.union(*OP_NAMES)})/, + } + + class << self + private + + def string_re(open, close) + /#{open}((?:\\.|\#(?!\{)|[^#{close}\\#])*)(#{close}|#\{)/m + end + end + + # A hash of regular expressions that are used for tokenizing strings. + # + # The key is a `[Symbol, Boolean]` pair. + # The symbol represents which style of quotation to use, + # while the boolean represents whether or not the string + # is following an interpolated segment. + STRING_REGULAR_EXPRESSIONS = { + :double => { + false => string_re('"', '"'), + true => string_re('', '"') + }, + :single => { + false => string_re("'", "'"), + true => string_re('', "'") + }, + :uri => { + false => /url\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/, + true => /(#{URLCHAR}*?)(#{W}\)|#\{)/ + }, + # Defined in https://developer.mozilla.org/en/CSS/@-moz-document as a + # non-standard version of http://www.w3.org/TR/css3-conditional/ + :url_prefix => { + false => /url-prefix\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/, + true => /(#{URLCHAR}*?)(#{W}\)|#\{)/ + }, + :domain => { + false => /domain\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/, + true => /(#{URLCHAR}*?)(#{W}\)|#\{)/ + } + } + + # @param str [String, StringScanner] The source text to lex + # @param line [Integer] The 1-based line on which the SassScript appears. + # Used for error reporting and sourcemap building + # @param offset [Integer] The 1-based character (not byte) offset in the line in the source. + # Used for error reporting and sourcemap building + # @param options [{Symbol => Object}] An options hash; + # see {file:SASS_REFERENCE.md#Options the Sass options documentation} + def initialize(str, line, offset, options) + @scanner = str.is_a?(StringScanner) ? str : Sass::Util::MultibyteStringScanner.new(str) + @line = line + @offset = offset + @options = options + @interpolation_stack = [] + @prev = nil + @tok = nil + @next_tok = nil + end + + # Moves the lexer forward one token. + # + # @return [Token] The token that was moved past + def next + @tok ||= read_token + @tok, tok = nil, @tok + @prev = tok + tok + end + + # Returns whether or not there's whitespace before the next token. + # + # @return [Boolean] + def whitespace?(tok = @tok) + if tok + @scanner.string[0...tok.pos] =~ /\s\Z/ + else + @scanner.string[@scanner.pos, 1] =~ /^\s/ || + @scanner.string[@scanner.pos - 1, 1] =~ /\s\Z/ + end + end + + # Returns the given character. + # + # @return [String] + def char(pos = @scanner.pos) + @scanner.string[pos, 1] + end + + # Consumes and returns single raw character from the input stream. + # + # @return [String] + def next_char + unpeek! + scan(/./) + end + + # Returns the next token without moving the lexer forward. + # + # @return [Token] The next token + def peek + @tok ||= read_token + end + + # Rewinds the underlying StringScanner + # to before the token returned by \{#peek}. + def unpeek! + raise "[BUG] Can't unpeek before a queued token!" if @next_tok + return unless @tok + @scanner.pos = @tok.pos + @line = @tok.source_range.start_pos.line + @offset = @tok.source_range.start_pos.offset + end + + # @return [Boolean] Whether or not there's more source text to lex. + def done? + return if @next_tok + whitespace unless after_interpolation? && !@interpolation_stack.empty? + @scanner.eos? && @tok.nil? + end + + # @return [Boolean] Whether or not the last token lexed was `:end_interpolation`. + def after_interpolation? + @prev && @prev.type == :end_interpolation + end + + # Raise an error to the effect that `name` was expected in the input stream + # and wasn't found. + # + # This calls \{#unpeek!} to rewind the scanner to immediately after + # the last returned token. + # + # @param name [String] The name of the entity that was expected but not found + # @raise [Sass::SyntaxError] + def expected!(name) + unpeek! + Sass::SCSS::Parser.expected(@scanner, name, @line) + end + + # Records all non-comment text the lexer consumes within the block + # and returns it as a string. + # + # @yield A block in which text is recorded + # @return [String] + def str + old_pos = @tok ? @tok.pos : @scanner.pos + yield + new_pos = @tok ? @tok.pos : @scanner.pos + @scanner.string[old_pos...new_pos] + end + + # Runs a block, and rewinds the state of the lexer to the beginning of the + # block if it returns `nil` or `false`. + def try + old_pos = @scanner.pos + old_line = @line + old_offset = @offset + old_interpolation_stack = @interpolation_stack.dup + old_prev = @prev + old_tok = @tok + old_next_tok = @next_tok + + result = yield + return result if result + + @scanner.pos = old_pos + @line = old_line + @offset = old_offset + @interpolation_stack = old_interpolation_stack + @prev = old_prev + @tok = old_tok + @next_tok = old_next_tok + nil + end + + private + + def read_token + if (tok = @next_tok) + @next_tok = nil + return tok + end + + return if done? + start_pos = source_position + value = token + return unless value + type, val = value + Token.new(type, val, range(start_pos), @scanner.pos - @scanner.matched_size) + end + + def whitespace + nil while scan(REGULAR_EXPRESSIONS[:whitespace]) || + scan(REGULAR_EXPRESSIONS[:comment]) || + scan(REGULAR_EXPRESSIONS[:single_line_comment]) + end + + def token + if after_interpolation? + interp_type, interp_value = @interpolation_stack.pop + if interp_type == :special_fun + return special_fun_body(interp_value) + elsif interp_type.nil? + if @scanner.string[@scanner.pos - 1] == '}' && scan(REGULAR_EXPRESSIONS[:ident]) + return [@scanner[2] ? :funcall : :ident, Sass::Util.normalize_ident_escapes(@scanner[1], start: false)] + end + else + raise "[BUG]: Unknown interp_type #{interp_type}" unless interp_type == :string + return string(interp_value, true) + end + end + + variable || string(:double, false) || string(:single, false) || number || id || color || + selector || string(:uri, false) || raw(UNICODERANGE) || special_fun || special_val || + ident_op || ident || op + end + + def variable + _variable(REGULAR_EXPRESSIONS[:variable]) + end + + def _variable(rx) + return unless scan(rx) + [:const, Sass::Util.normalize_ident_escapes(@scanner[2])] + end + + def ident + return unless scan(REGULAR_EXPRESSIONS[:ident]) + [@scanner[2] ? :funcall : :ident, Sass::Util.normalize_ident_escapes(@scanner[1])] + end + + def string(re, open) + line, offset = @line, @offset + return unless scan(STRING_REGULAR_EXPRESSIONS[re][open]) + if @scanner[0] =~ /([^\\]|^)\n/ + filename = @options[:filename] + Sass::Util.sass_warn <<MESSAGE +DEPRECATION WARNING on line #{line}, column #{offset}#{" of #{filename}" if filename}: +Unescaped multiline strings are deprecated and will be removed in a future version of Sass. +To include a newline in a string, use "\\a" or "\\a " as in CSS. +MESSAGE + end + + if @scanner[2] == '#{' # ' + @interpolation_stack << [:string, re] + start_pos = Sass::Source::Position.new(@line, @offset - 2) + @next_tok = Token.new(:string_interpolation, range(start_pos), @scanner.pos - 2) + end + str = + if re == :uri + url = "#{'url(' unless open}#{@scanner[1]}#{')' unless @scanner[2] == '#{'}" + Script::Value::String.new(url) + else + Script::Value::String.new(Sass::Script::Value::String.value(@scanner[1]), :string) + end + [:string, str] + end + + def number + # Handling unary minus is complicated by the fact that whitespace is an + # operator in SassScript. We want "1-2" to be parsed as "1 - 2", but we + # want "1 -2" to be parsed as "1 (-2)". To accomplish this, we only + # parse a unary minus as part of a number literal if there's whitespace + # before and not after it. Cases like "(-2)" are handled by the unary + # minus logic in the parser instead. + if @scanner.peek(1) == '-' + return if @scanner.pos == 0 + unary_minus_allowed = + case @scanner.string[@scanner.pos - 1, 1] + when /\s/; true + when '/'; @scanner.pos != 1 && @scanner.string[@scanner.pos - 2, 1] == '*' + else; false + end + + return unless unary_minus_allowed + return unless scan(REGULAR_EXPRESSIONS[:unary_minus_number]) + minus = true + else + return unless scan(REGULAR_EXPRESSIONS[:number]) + minus = false + end + + value = (@scanner[1] ? @scanner[1].to_f : @scanner[2].to_i) * (minus ? -1 : 1) + value *= 10**@scanner[3].to_i if @scanner[3] + units = @scanner[4] + units = Sass::Util::normalize_ident_escapes(units) if units + script_number = Script::Value::Number.new(value, Array(units)) + [:number, script_number] + end + + def id + # Colors and ids are tough to tell apart, because they overlap but + # neither is a superset of the other. "#xyz" is an id but not a color, + # "#000" is a color but not an id, "#abc" is both, and "#0" is neither. + # We need to handle all these cases correctly. + # + # To do so, we first try to parse something as an id. If this works and + # the id is also a valid color, we return the color. Otherwise, we + # return the id. If it didn't parse as an id, we then try to parse it as + # a color. If *this* works, we return the color, and if it doesn't we + # give up and throw an error. + # + # IDs in properties are used in the Basic User Interface Module + # (http://www.w3.org/TR/css3-ui/). + return unless scan(REGULAR_EXPRESSIONS[:id]) + if @scanner[0] =~ /^\#[0-9a-fA-F]+$/ && + (@scanner[0].length == 4 || @scanner[0].length == 5 || + @scanner[0].length == 7 || @scanner[0].length == 9) + return [:color, Script::Value::Color.from_hex(@scanner[0])] + end + [:ident, Sass::Util.normalize_ident_escapes(@scanner[0])] + end + + def color + return unless @scanner.match?(REGULAR_EXPRESSIONS[:color]) + unless @scanner[0].length == 4 || @scanner[0].length == 5 || + @scanner[0].length == 7 || @scanner[0].length == 9 + return + end + script_color = Script::Value::Color.from_hex(scan(REGULAR_EXPRESSIONS[:color])) + [:color, script_color] + end + + def selector + start_pos = source_position + return unless scan(REGULAR_EXPRESSIONS[:selector]) + + if @scanner.peek(1) == '&' + filename = @options[:filename] + Sass::Util.sass_warn <<MESSAGE +WARNING on line #{line}, column #{offset}#{" of #{filename}" if filename}: +In Sass, "&&" means two copies of the parent selector. You probably want to use "and" instead. +MESSAGE + end + + script_selector = Script::Tree::Selector.new + script_selector.source_range = range(start_pos) + [:selector, script_selector] + end + + def special_fun + prefix = scan(/((-[\w-]+-)?(calc|element)|expression|progid:[a-z\.]*)\(/i) + return unless prefix + special_fun_body(1, prefix) + end + + def special_fun_body(parens, prefix = nil) + str = prefix || '' + while (scanned = scan(/.*?([()]|\#\{)/m)) + str << scanned + if scanned[-1] == ?( + parens += 1 + next + elsif scanned[-1] == ?) + parens -= 1 + next unless parens == 0 + else + raise "[BUG] Unreachable" unless @scanner[1] == '#{' # ' + str.slice!(-2..-1) + @interpolation_stack << [:special_fun, parens] + start_pos = Sass::Source::Position.new(@line, @offset - 2) + @next_tok = Token.new(:string_interpolation, range(start_pos), @scanner.pos - 2) + end + + return [:special_fun, Sass::Script::Value::String.new(str)] + end + + scan(/.*/) + expected!('")"') + end + + def special_val + return unless scan(/!#{W}important/i) + [:string, Script::Value::String.new("!important")] + end + + def ident_op + op = scan(REGULAR_EXPRESSIONS[:ident_op]) + return unless op + [OPERATORS[op]] + end + + def op + op = scan(REGULAR_EXPRESSIONS[:op]) + return unless op + name = OPERATORS[op] + @interpolation_stack << nil if name == :begin_interpolation + [name] + end + + def raw(rx) + val = scan(rx) + return unless val + [:raw, val] + end + + def scan(re) + str = @scanner.scan(re) + return unless str + c = str.count("\n") + @line += c + @offset = (c == 0 ? @offset + str.size : str.size - str.rindex("\n")) + str + end + + def range(start_pos, end_pos = source_position) + Sass::Source::Range.new(start_pos, end_pos, @options[:filename], @options[:importer]) + end + + def source_position + Sass::Source::Position.new(@line, @offset) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/parser.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/parser.rb new file mode 100644 index 000000000000..3d5d5105eb6b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/parser.rb @@ -0,0 +1,1001 @@ +require 'sass/script/lexer' + +module Sass + module Script + # The parser for SassScript. + # It parses a string of code into a tree of {Script::Tree::Node}s. + class Parser + # The line number of the parser's current position. + # + # @return [Integer] + def line + @lexer.line + end + + # The column number of the parser's current position. + # + # @return [Integer] + def offset + @lexer.offset + end + + # @param str [String, StringScanner] The source text to parse + # @param line [Integer] The line on which the SassScript appears. + # Used for error reporting and sourcemap building + # @param offset [Integer] The character (not byte) offset where the script starts in the line. + # Used for error reporting and sourcemap building + # @param options [{Symbol => Object}] An options hash; see + # {file:SASS_REFERENCE.md#Options the Sass options documentation}. + # This supports an additional `:allow_extra_text` option that controls + # whether the parser throws an error when extra text is encountered + # after the parsed construct. + def initialize(str, line, offset, options = {}) + @options = options + @allow_extra_text = options.delete(:allow_extra_text) + @lexer = lexer_class.new(str, line, offset, options) + @stop_at = nil + end + + # Parses a SassScript expression within an interpolated segment (`#{}`). + # This means that it stops when it comes across an unmatched `}`, + # which signals the end of an interpolated segment, + # it returns rather than throwing an error. + # + # @param warn_for_color [Boolean] Whether raw color values passed to + # interoplation should cause a warning. + # @return [Script::Tree::Node] The root node of the parse tree + # @raise [Sass::SyntaxError] if the expression isn't valid SassScript + def parse_interpolated(warn_for_color = false) + # Start two characters back to compensate for #{ + start_pos = Sass::Source::Position.new(line, offset - 2) + expr = assert_expr :expr + assert_tok :end_interpolation + expr = Sass::Script::Tree::Interpolation.new( + nil, expr, nil, false, false, :warn_for_color => warn_for_color) + check_for_interpolation expr + expr.options = @options + node(expr, start_pos) + rescue Sass::SyntaxError => e + e.modify_backtrace :line => @lexer.line, :filename => @options[:filename] + raise e + end + + # Parses a SassScript expression. + # + # @return [Script::Tree::Node] The root node of the parse tree + # @raise [Sass::SyntaxError] if the expression isn't valid SassScript + def parse + expr = assert_expr :expr + assert_done + expr.options = @options + check_for_interpolation expr + expr + rescue Sass::SyntaxError => e + e.modify_backtrace :line => @lexer.line, :filename => @options[:filename] + raise e + end + + # Parses a SassScript expression, + # ending it when it encounters one of the given identifier tokens. + # + # @param tokens [#include?(String | Symbol)] A set of strings or symbols that delimit the expression. + # @return [Script::Tree::Node] The root node of the parse tree + # @raise [Sass::SyntaxError] if the expression isn't valid SassScript + def parse_until(tokens) + @stop_at = tokens + expr = assert_expr :expr + assert_done + expr.options = @options + check_for_interpolation expr + expr + rescue Sass::SyntaxError => e + e.modify_backtrace :line => @lexer.line, :filename => @options[:filename] + raise e + end + + # Parses the argument list for a mixin include. + # + # @return [(Array<Script::Tree::Node>, + # {String => Script::Tree::Node}, + # Script::Tree::Node, + # Script::Tree::Node)] + # The root nodes of the positional arguments, keyword arguments, and + # splat argument(s). Keyword arguments are in a hash from names to values. + # @raise [Sass::SyntaxError] if the argument list isn't valid SassScript + def parse_mixin_include_arglist + args, keywords = [], {} + if try_tok(:lparen) + args, keywords, splat, kwarg_splat = mixin_arglist + assert_tok(:rparen) + end + assert_done + + args.each do |a| + check_for_interpolation a + a.options = @options + end + + keywords.each do |_, v| + check_for_interpolation v + v.options = @options + end + + if splat + check_for_interpolation splat + splat.options = @options + end + + if kwarg_splat + check_for_interpolation kwarg_splat + kwarg_splat.options = @options + end + + return args, keywords, splat, kwarg_splat + rescue Sass::SyntaxError => e + e.modify_backtrace :line => @lexer.line, :filename => @options[:filename] + raise e + end + + # Parses the argument list for a mixin definition. + # + # @return [(Array<Script::Tree::Node>, Script::Tree::Node)] + # The root nodes of the arguments, and the splat argument. + # @raise [Sass::SyntaxError] if the argument list isn't valid SassScript + def parse_mixin_definition_arglist + args, splat = defn_arglist!(false) + assert_done + + args.each do |k, v| + check_for_interpolation k + k.options = @options + + if v + check_for_interpolation v + v.options = @options + end + end + + if splat + check_for_interpolation splat + splat.options = @options + end + + return args, splat + rescue Sass::SyntaxError => e + e.modify_backtrace :line => @lexer.line, :filename => @options[:filename] + raise e + end + + # Parses the argument list for a function definition. + # + # @return [(Array<Script::Tree::Node>, Script::Tree::Node)] + # The root nodes of the arguments, and the splat argument. + # @raise [Sass::SyntaxError] if the argument list isn't valid SassScript + def parse_function_definition_arglist + args, splat = defn_arglist!(true) + assert_done + + args.each do |k, v| + check_for_interpolation k + k.options = @options + + if v + check_for_interpolation v + v.options = @options + end + end + + if splat + check_for_interpolation splat + splat.options = @options + end + + return args, splat + rescue Sass::SyntaxError => e + e.modify_backtrace :line => @lexer.line, :filename => @options[:filename] + raise e + end + + # Parse a single string value, possibly containing interpolation. + # Doesn't assert that the scanner is finished after parsing. + # + # @return [Script::Tree::Node] The root node of the parse tree. + # @raise [Sass::SyntaxError] if the string isn't valid SassScript + def parse_string + unless (peek = @lexer.peek) && + (peek.type == :string || + (peek.type == :funcall && peek.value.downcase == 'url')) + lexer.expected!("string") + end + + expr = assert_expr :funcall + check_for_interpolation expr + expr.options = @options + @lexer.unpeek! + expr + rescue Sass::SyntaxError => e + e.modify_backtrace :line => @lexer.line, :filename => @options[:filename] + raise e + end + + # Parses a SassScript expression. + # + # @overload parse(str, line, offset, filename = nil) + # @return [Script::Tree::Node] The root node of the parse tree + # @see Parser#initialize + # @see Parser#parse + def self.parse(*args) + new(*args).parse + end + + PRECEDENCE = [ + :comma, :single_eq, :space, :or, :and, + [:eq, :neq], + [:gt, :gte, :lt, :lte], + [:plus, :minus], + [:times, :div, :mod], + ] + + ASSOCIATIVE = [:plus, :times] + + class << self + # Returns an integer representing the precedence + # of the given operator. + # A lower integer indicates a looser binding. + # + # @private + def precedence_of(op) + PRECEDENCE.each_with_index do |e, i| + return i if Array(e).include?(op) + end + raise "[BUG] Unknown operator #{op.inspect}" + end + + # Returns whether or not the given operation is associative. + # + # @private + def associative?(op) + ASSOCIATIVE.include?(op) + end + + private + + # Defines a simple left-associative production. + # name is the name of the production, + # sub is the name of the production beneath it, + # and ops is a list of operators for this precedence level + def production(name, sub, *ops) + class_eval <<RUBY, __FILE__, __LINE__ + 1 + def #{name} + interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}) + return interp if interp + return unless e = #{sub} + + while tok = peek_toks(#{ops.map {|o| o.inspect}.join(', ')}) + return e if @stop_at && @stop_at.include?(tok.type) + @lexer.next + + if interp = try_op_before_interp(tok, e) + other_interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}, interp) + return interp unless other_interp + return other_interp + end + + e = node(Tree::Operation.new(e, assert_expr(#{sub.inspect}), tok.type), + e.source_range.start_pos) + end + e + end +RUBY + end + + def unary(op, sub) + class_eval <<RUBY, __FILE__, __LINE__ + 1 + def unary_#{op} + return #{sub} unless tok = try_tok(:#{op}) + interp = try_op_before_interp(tok) + return interp if interp + start_pos = source_position + node(Tree::UnaryOperation.new(assert_expr(:unary_#{op}), :#{op}), start_pos) + end +RUBY + end + end + + private + + def source_position + Sass::Source::Position.new(line, offset) + end + + def range(start_pos, end_pos = source_position) + Sass::Source::Range.new(start_pos, end_pos, @options[:filename], @options[:importer]) + end + + # @private + def lexer_class; Lexer; end + + def map + start_pos = source_position + e = interpolation + return unless e + return list e, start_pos unless @lexer.peek && @lexer.peek.type == :colon + + pair = map_pair(e) + map = node(Sass::Script::Tree::MapLiteral.new([pair]), start_pos) + while try_tok(:comma) + pair = map_pair + return map unless pair + map.pairs << pair + map.source_range.end_pos = map.pairs.last.last.source_range.end_pos + end + map + end + + def map_pair(key = nil) + return unless key ||= interpolation + assert_tok :colon + return key, assert_expr(:interpolation) + end + + def expr + start_pos = source_position + e = interpolation + return unless e + list e, start_pos + end + + def list(first, start_pos) + return first unless @lexer.peek && @lexer.peek.type == :comma + + list = node(Sass::Script::Tree::ListLiteral.new([first], separator: :comma), start_pos) + while (tok = try_tok(:comma)) + element_before_interp = list.elements.length == 1 ? list.elements.first : list + if (interp = try_op_before_interp(tok, element_before_interp)) + other_interp = try_ops_after_interp([:comma], :expr, interp) + return interp unless other_interp + return other_interp + end + return list unless (e = interpolation) + list.elements << e + list.source_range.end_pos = list.elements.last.source_range.end_pos + end + list + end + + production :equals, :interpolation, :single_eq + + def try_op_before_interp(op, prev = nil, after_interp = false) + return unless @lexer.peek && @lexer.peek.type == :begin_interpolation + unary = !prev && !after_interp + wb = @lexer.whitespace?(op) + str = literal_node(Script::Value::String.new(Lexer::OPERATORS_REVERSE[op.type]), + op.source_range) + + deprecation = + case op.type + when :comma; :potential + when :div, :single_eq; :none + when :plus; unary ? :none : :immediate + when :minus; @lexer.whitespace?(@lexer.peek) ? :immediate : :none + else; :immediate + end + + interp = node( + Script::Tree::Interpolation.new( + prev, str, nil, wb, false, :originally_text => true, :deprecation => deprecation), + (prev || str).source_range.start_pos) + interpolation(first: interp) + end + + def try_ops_after_interp(ops, name, prev = nil) + return unless @lexer.after_interpolation? + op = peek_toks(*ops) + return unless op + return if @stop_at && @stop_at.include?(op.type) + @lexer.next + + interp = try_op_before_interp(op, prev, :after_interp) + return interp if interp + + wa = @lexer.whitespace? + str = literal_node(Script::Value::String.new(Lexer::OPERATORS_REVERSE[op.type]), + op.source_range) + str.line = @lexer.line + + deprecation = + case op.type + when :comma; :potential + when :div, :single_eq; :none + when :minus; @lexer.whitespace?(op) ? :immediate : :none + else; :immediate + end + interp = node( + Script::Tree::Interpolation.new( + prev, str, assert_expr(name), false, wa, + :originally_text => true, :deprecation => deprecation), + (prev || str).source_range.start_pos) + interp + end + + def interpolation(first: nil, inner: :space) + e = first || send(inner) + while (interp = try_tok(:begin_interpolation)) + wb = @lexer.whitespace?(interp) + char_before = @lexer.char(interp.pos - 1) + mid = without_stop_at {assert_expr :expr} + assert_tok :end_interpolation + wa = @lexer.whitespace? + char_after = @lexer.char + + after = send(inner) + before_deprecation = e.is_a?(Script::Tree::Interpolation) ? e.deprecation : :none + after_deprecation = after.is_a?(Script::Tree::Interpolation) ? after.deprecation : :none + + deprecation = + if before_deprecation == :immediate || after_deprecation == :immediate || + # Warn for #{foo}$var and #{foo}(1) but not #{$foo}1. + (after && !wa && char_after =~ /[$(]/) || + # Warn for $var#{foo} and (a)#{foo} but not a#{foo}. + (e && !wb && is_unsafe_before?(e, char_before)) + :immediate + else + :potential + end + + e = node( + Script::Tree::Interpolation.new(e, mid, after, wb, wa, :deprecation => deprecation), + (e || interp).source_range.start_pos) + end + e + end + + # Returns whether `expr` is unsafe to include before an interpolation. + # + # @param expr [Node] The expression to check. + # @param char_before [String] The character immediately before the + # interpolation being checked (and presumably the last character of + # `expr`). + # @return [Boolean] + def is_unsafe_before?(expr, char_before) + return char_before == ')' if is_safe_value?(expr) + + # Otherwise, it's only safe if it was another interpolation. + !expr.is_a?(Script::Tree::Interpolation) + end + + # Returns whether `expr` is safe as the value immediately before an + # interpolation. + # + # It's safe as long as the previous expression is an identifier or number, + # or a list whose last element is also safe. + def is_safe_value?(expr) + return is_safe_value?(expr.elements.last) if expr.is_a?(Script::Tree::ListLiteral) + return false unless expr.is_a?(Script::Tree::Literal) + expr.value.is_a?(Script::Value::Number) || + (expr.value.is_a?(Script::Value::String) && expr.value.type == :identifier) + end + + def space + start_pos = source_position + e = or_expr + return unless e + arr = [e] + while (e = or_expr) + arr << e + end + if arr.size == 1 + arr.first + else + node(Sass::Script::Tree::ListLiteral.new(arr, separator: :space), start_pos) + end + end + + production :or_expr, :and_expr, :or + production :and_expr, :eq_or_neq, :and + production :eq_or_neq, :relational, :eq, :neq + production :relational, :plus_or_minus, :gt, :gte, :lt, :lte + production :plus_or_minus, :times_div_or_mod, :plus, :minus + production :times_div_or_mod, :unary_plus, :times, :div, :mod + + unary :plus, :unary_minus + unary :minus, :unary_div + unary :div, :unary_not # For strings, so /foo/bar works + unary :not, :ident + + def ident + return css_min_max unless @lexer.peek && @lexer.peek.type == :ident + return if @stop_at && @stop_at.include?(@lexer.peek.value) + + name = @lexer.next + if (color = Sass::Script::Value::Color::COLOR_NAMES[name.value.downcase]) + literal_node(Sass::Script::Value::Color.new(color, name.value), name.source_range) + elsif name.value == "true" + literal_node(Sass::Script::Value::Bool.new(true), name.source_range) + elsif name.value == "false" + literal_node(Sass::Script::Value::Bool.new(false), name.source_range) + elsif name.value == "null" + literal_node(Sass::Script::Value::Null.new, name.source_range) + else + literal_node(Sass::Script::Value::String.new(name.value, :identifier), name.source_range) + end + end + + def css_min_max + @lexer.try do + next unless tok = try_tok(:funcall) + next unless %w[min max].include?(tok.value.downcase) + next unless contents = min_max_contents + node(array_to_interpolation(["#{tok.value}(", *contents]), + tok.source_range.start_pos, source_position) + end || funcall + end + + def min_max_contents(allow_comma: true) + result = [] + loop do + if tok = try_tok(:number) + result << tok.value.to_s + elsif value = min_max_interpolation + result << value + elsif value = min_max_calc + result << value.value + elsif value = min_max_function || + min_max_parens || + nested_min_max + result.concat value + else + return + end + + if try_tok(:rparen) + result << ")" + return result + elsif tok = try_tok(:plus) || try_tok(:minus) || try_tok(:times) || try_tok(:div) + result << " #{Lexer::OPERATORS_REVERSE[tok.type]} " + elsif allow_comma && try_tok(:comma) + result << ", " + else + return + end + end + end + + def min_max_interpolation + without_stop_at do + tok = try_tok(:begin_interpolation) + return unless tok + expr = without_stop_at {assert_expr :expr} + assert_tok :end_interpolation + expr + end + end + + def min_max_function + return unless tok = peek_tok(:funcall) + return unless %w[calc env var].include?(tok.value.downcase) + @lexer.next + result = [tok.value, '(', *declaration_value, ')'] + assert_tok :rparen + result + end + + def min_max_calc + return unless tok = peek_tok(:special_fun) + return unless tok.value.value.downcase.start_with?("calc(") + @lexer.next.value + end + + def min_max_parens + return unless try_tok :lparen + return unless contents = min_max_contents(allow_comma: false) + ['(', *contents] + end + + def nested_min_max + return unless tok = peek_tok(:funcall) + return unless %w[min max].include?(tok.value.downcase) + @lexer.next + return unless contents = min_max_contents + [tok.value, '(', *contents] + end + + def declaration_value + result = [] + brackets = [] + loop do + result << @lexer.str do + until @lexer.done? || + peek_toks(:begin_interpolation, + :end_interpolation, + :lcurly, + :lparen, + :lsquare, + :rparen, + :rsquare) + @lexer.next || @lexer.next_char + end + end + + if try_tok(:begin_interpolation) + result << assert_expr(:expr) + assert_tok :end_interpolation + elsif tok = try_toks(:lcurly, :lparen, :lsquare) + brackets << case tok.type + when :lcurly; :end_interpolation + when :lparen; :rparen + when :lsquare; :rsquare + end + result << Lexer::OPERATORS_REVERSE[tok.type] + elsif brackets.empty? + return result + else + bracket = brackets.pop + assert_tok bracket + result << Lexer::OPERATORS_REVERSE[bracket] + end + end + end + + def funcall + tok = try_tok(:funcall) + return raw unless tok + args, keywords, splat, kwarg_splat = fn_arglist + assert_tok(:rparen) + node(Script::Tree::Funcall.new(tok.value, args, keywords, splat, kwarg_splat), + tok.source_range.start_pos, source_position) + end + + def defn_arglist!(must_have_parens) + if must_have_parens + assert_tok(:lparen) + else + return [], nil unless try_tok(:lparen) + end + + without_stop_at do + res = [] + splat = nil + must_have_default = false + loop do + break if peek_tok(:rparen) + c = assert_tok(:const) + var = node(Script::Tree::Variable.new(c.value), c.source_range) + if try_tok(:colon) + val = assert_expr(:space) + must_have_default = true + elsif try_tok(:splat) + splat = var + break + elsif must_have_default + raise SyntaxError.new( + "Required argument #{var.inspect} must come before any optional arguments.") + end + res << [var, val] + break unless try_tok(:comma) + end + assert_tok(:rparen) + return res, splat + end + end + + def fn_arglist + arglist(:equals, "function argument") + end + + def mixin_arglist + arglist(:interpolation, "mixin argument") + end + + def arglist(subexpr, description) + without_stop_at do + args = [] + keywords = Sass::Util::NormalizedMap.new + splat = nil + while (e = send(subexpr)) + if @lexer.peek && @lexer.peek.type == :colon + name = e + @lexer.expected!("comma") unless name.is_a?(Tree::Variable) + assert_tok(:colon) + value = assert_expr(subexpr, description) + + if keywords[name.name] + raise SyntaxError.new("Keyword argument \"#{name.to_sass}\" passed more than once") + end + + keywords[name.name] = value + else + if try_tok(:splat) + return args, keywords, splat, e if splat + splat, e = e, nil + elsif splat + raise SyntaxError.new("Only keyword arguments may follow variable arguments (...).") + elsif !keywords.empty? + raise SyntaxError.new("Positional arguments must come before keyword arguments.") + end + args << e if e + end + + return args, keywords, splat unless try_tok(:comma) + end + return args, keywords + end + end + + def raw + tok = try_tok(:raw) + return special_fun unless tok + literal_node(Script::Value::String.new(tok.value), tok.source_range) + end + + def special_fun + first = try_tok(:special_fun) + return square_list unless first + str = literal_node(first.value, first.source_range) + return str unless try_tok(:string_interpolation) + mid = without_stop_at {assert_expr :expr} + assert_tok :end_interpolation + last = assert_expr(:special_fun) + node( + Tree::Interpolation.new(str, mid, last, false, false), + first.source_range.start_pos) + end + + def square_list + start_pos = source_position + return paren unless try_tok(:lsquare) + + without_stop_at do + space_start_pos = source_position + e = interpolation(inner: :or_expr) + separator = nil + if e + elements = [e] + while (e = interpolation(inner: :or_expr)) + elements << e + end + + # If there's a comma after a space-separated list, it's actually a + # space-separated list nested in a comma-separated list. + if try_tok(:comma) + e = if elements.length == 1 + elements.first + else + node( + Sass::Script::Tree::ListLiteral.new(elements, separator: :space), + space_start_pos) + end + elements = [e] + + while (e = space) + elements << e + break unless try_tok(:comma) + end + separator = :comma + else + separator = :space if elements.length > 1 + end + else + elements = [] + end + + assert_tok(:rsquare) + end_pos = source_position + + node(Sass::Script::Tree::ListLiteral.new(elements, separator: separator, bracketed: true), + start_pos, end_pos) + end + end + + def paren + return variable unless try_tok(:lparen) + without_stop_at do + start_pos = source_position + e = map + e.force_division! if e + end_pos = source_position + assert_tok(:rparen) + e || node(Sass::Script::Tree::ListLiteral.new([]), start_pos, end_pos) + end + end + + def variable + start_pos = source_position + c = try_tok(:const) + return string unless c + node(Tree::Variable.new(*c.value), start_pos) + end + + def string + first = try_tok(:string) + return number unless first + str = literal_node(first.value, first.source_range) + return str unless try_tok(:string_interpolation) + mid = assert_expr :expr + assert_tok :end_interpolation + last = without_stop_at {assert_expr(:string)} + node(Tree::StringInterpolation.new(str, mid, last), first.source_range.start_pos) + end + + def number + tok = try_tok(:number) + return selector unless tok + num = tok.value + num.options = @options + num.original = num.to_s + literal_node(num, tok.source_range.start_pos) + end + + def selector + tok = try_tok(:selector) + return literal unless tok + node(tok.value, tok.source_range.start_pos) + end + + def literal + t = try_tok(:color) + return literal_node(t.value, t.source_range) if t + end + + # It would be possible to have unified #assert and #try methods, + # but detecting the method/token difference turns out to be quite expensive. + + EXPR_NAMES = { + :string => "string", + :default => "expression (e.g. 1px, bold)", + :mixin_arglist => "mixin argument", + :fn_arglist => "function argument", + :splat => "...", + :special_fun => '")"', + } + + def assert_expr(name, expected = nil) + e = send(name) + return e if e + @lexer.expected!(expected || EXPR_NAMES[name] || EXPR_NAMES[:default]) + end + + def assert_tok(name) + # Avoids an array allocation caused by argument globbing in assert_toks. + t = try_tok(name) + return t if t + @lexer.expected!(Lexer::TOKEN_NAMES[name] || name.to_s) + end + + def assert_toks(*names) + t = try_toks(*names) + return t if t + @lexer.expected!(names.map {|tok| Lexer::TOKEN_NAMES[tok] || tok}.join(" or ")) + end + + def peek_tok(name) + # Avoids an array allocation caused by argument globbing in the try_toks method. + peeked = @lexer.peek + peeked && name == peeked.type && peeked + end + + def peek_toks(*names) + peeked = @lexer.peek + peeked && names.include?(peeked.type) && peeked + end + + def try_tok(name) + peek_tok(name) && @lexer.next + end + + def try_toks(*names) + peek_toks(*names) && @lexer.next + end + + def assert_done + if @allow_extra_text + # If extra text is allowed, just rewind the lexer so that the + # StringScanner is pointing to the end of the parsed text. + @lexer.unpeek! + else + return if @lexer.done? + @lexer.expected!(EXPR_NAMES[:default]) + end + end + + def without_stop_at + old_stop_at = @stop_at + @stop_at = nil + yield + ensure + @stop_at = old_stop_at + end + + # @overload node(value, source_range) + # @param value [Sass::Script::Value::Base] + # @param source_range [Sass::Source::Range] + # @overload node(value, start_pos, end_pos = source_position) + # @param value [Sass::Script::Value::Base] + # @param start_pos [Sass::Source::Position] + # @param end_pos [Sass::Source::Position] + def literal_node(value, source_range_or_start_pos, end_pos = source_position) + node(Sass::Script::Tree::Literal.new(value), source_range_or_start_pos, end_pos) + end + + # @overload node(node, source_range) + # @param node [Sass::Script::Tree::Node] + # @param source_range [Sass::Source::Range] + # @overload node(node, start_pos, end_pos = source_position) + # @param node [Sass::Script::Tree::Node] + # @param start_pos [Sass::Source::Position] + # @param end_pos [Sass::Source::Position] + def node(node, source_range_or_start_pos, end_pos = source_position) + source_range = + if source_range_or_start_pos.is_a?(Sass::Source::Range) + source_range_or_start_pos + else + range(source_range_or_start_pos, end_pos) + end + + node.line = source_range.start_pos.line + node.source_range = source_range + node.filename = @options[:filename] + node + end + + # Converts an array of strings and expressions to a string interoplation + # object. + # + # @param array [Array<Script::Tree:Node | String>] + # @return [Script::Tree::StringInterpolation] + def array_to_interpolation(array) + Sass::Util.merge_adjacent_strings(array).reverse.inject(nil) do |after, value| + if value.is_a?(::String) + literal = Sass::Script::Tree::Literal.new( + Sass::Script::Value::String.new(value)) + next literal unless after + Sass::Script::Tree::StringInterpolation.new(literal, after.mid, after.after) + else + Sass::Script::Tree::StringInterpolation.new( + Sass::Script::Tree::Literal.new( + Sass::Script::Value::String.new('')), + value, + after || Sass::Script::Tree::Literal.new( + Sass::Script::Value::String.new(''))) + end + end + end + + # Checks a script node for any immediately-deprecated interpolations, and + # emits warnings for them. + # + # @param node [Sass::Script::Tree::Node] + def check_for_interpolation(node) + nodes = [node] + until nodes.empty? + node = nodes.pop + unless node.is_a?(Sass::Script::Tree::Interpolation) && + node.deprecation == :immediate + nodes.concat node.children + next + end + + interpolation_deprecation(node) + end + end + + # Emits a deprecation warning for an interpolation node. + # + # @param node [Sass::Script::Tree::Node] + def interpolation_deprecation(interpolation) + return if @options[:_convert] + location = "on line #{interpolation.line}" + location << " of #{interpolation.filename}" if interpolation.filename + Sass::Util.sass_warn <<WARNING +DEPRECATION WARNING #{location}: +\#{} interpolation near operators will be simplified in a future version of Sass. +To preserve the current behavior, use quotes: + + #{interpolation.to_quoted_equivalent.to_sass} + +You can use the sass-convert command to automatically fix most cases. +WARNING + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree.rb new file mode 100644 index 000000000000..8bd4686280a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree.rb @@ -0,0 +1,16 @@ +# The module containing nodes in the SassScript parse tree. These nodes are +# all subclasses of {Sass::Script::Tree::Node}. +module Sass::Script::Tree +end + +require 'sass/script/tree/node' +require 'sass/script/tree/variable' +require 'sass/script/tree/funcall' +require 'sass/script/tree/operation' +require 'sass/script/tree/unary_operation' +require 'sass/script/tree/interpolation' +require 'sass/script/tree/string_interpolation' +require 'sass/script/tree/literal' +require 'sass/script/tree/list_literal' +require 'sass/script/tree/map_literal' +require 'sass/script/tree/selector' diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/funcall.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/funcall.rb new file mode 100644 index 000000000000..215873c1d14a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/funcall.rb @@ -0,0 +1,314 @@ +require 'sass/script/functions' +require 'sass/util' + +module Sass::Script::Tree + # A SassScript parse node representing a function call. + # + # A function call either calls one of the functions in + # {Sass::Script::Functions}, or if no function with the given name exists it + # returns a string representation of the function call. + class Funcall < Node + # The name of the function. + # + # @return [String] + attr_reader :name + + # The callable to be invoked + # + # @return [Sass::Callable] or nil if no callable is provided. + attr_reader :callable + + # The arguments to the function. + # + # @return [Array<Node>] + attr_reader :args + + # The keyword arguments to the function. + # + # @return [Sass::Util::NormalizedMap<Node>] + attr_reader :keywords + + # The first splat argument for this function, if one exists. + # + # This could be a list of positional arguments, a map of keyword + # arguments, or an arglist containing both. + # + # @return [Node?] + attr_accessor :splat + + # The second splat argument for this function, if one exists. + # + # If this exists, it's always a map of keyword arguments, and + # \{#splat} is always either a list or an arglist. + # + # @return [Node?] + attr_accessor :kwarg_splat + + # @param name_or_callable [String, Sass::Callable] See \{#name} + # @param args [Array<Node>] See \{#args} + # @param keywords [Sass::Util::NormalizedMap<Node>] See \{#keywords} + # @param splat [Node] See \{#splat} + # @param kwarg_splat [Node] See \{#kwarg_splat} + def initialize(name_or_callable, args, keywords, splat, kwarg_splat) + if name_or_callable.is_a?(Sass::Callable) + @callable = name_or_callable + @name = name_or_callable.name + else + @callable = nil + @name = name_or_callable + end + @args = args + @keywords = keywords + @splat = splat + @kwarg_splat = kwarg_splat + super() + end + + # @return [String] A string representation of the function call + def inspect + args = @args.map {|a| a.inspect}.join(', ') + keywords = @keywords.as_stored.to_a.map {|k, v| "$#{k}: #{v.inspect}"}.join(', ') + if self.splat + splat = args.empty? && keywords.empty? ? "" : ", " + splat = "#{splat}#{self.splat.inspect}..." + splat = "#{splat}, #{kwarg_splat.inspect}..." if kwarg_splat + end + "#{name}(#{args}#{', ' unless args.empty? || keywords.empty?}#{keywords}#{splat})" + end + + # @see Node#to_sass + def to_sass(opts = {}) + arg_to_sass = lambda do |arg| + sass = arg.to_sass(opts) + sass = "(#{sass})" if arg.is_a?(Sass::Script::Tree::ListLiteral) && arg.separator == :comma + sass + end + + args = @args.map(&arg_to_sass) + keywords = @keywords.as_stored.to_a.map {|k, v| "$#{dasherize(k, opts)}: #{arg_to_sass[v]}"} + + if self.splat + splat = "#{arg_to_sass[self.splat]}..." + kwarg_splat = "#{arg_to_sass[self.kwarg_splat]}..." if self.kwarg_splat + end + + arglist = [args, splat, keywords, kwarg_splat].flatten.compact.join(', ') + "#{dasherize(name, opts)}(#{arglist})" + end + + # Returns the arguments to the function. + # + # @return [Array<Node>] + # @see Node#children + def children + res = @args + @keywords.values + res << @splat if @splat + res << @kwarg_splat if @kwarg_splat + res + end + + # @see Node#deep_copy + def deep_copy + node = dup + node.instance_variable_set('@args', args.map {|a| a.deep_copy}) + copied_keywords = Sass::Util::NormalizedMap.new + @keywords.as_stored.each {|k, v| copied_keywords[k] = v.deep_copy} + node.instance_variable_set('@keywords', copied_keywords) + node + end + + protected + + # Evaluates the function call. + # + # @param environment [Sass::Environment] The environment in which to evaluate the SassScript + # @return [Sass::Script::Value] The SassScript object that is the value of the function call + # @raise [Sass::SyntaxError] if the function call raises an ArgumentError + def _perform(environment) + args = @args.each_with_index. + map {|a, i| perform_arg(a, environment, signature && signature.args[i])} + keywords = Sass::Util.map_hash(@keywords) do |k, v| + [k, perform_arg(v, environment, k.tr('-', '_'))] + end + splat = Sass::Tree::Visitors::Perform.perform_splat( + @splat, keywords, @kwarg_splat, environment) + + fn = @callable || environment.function(@name) + + if fn && fn.origin == :stylesheet + environment.stack.with_function(filename, line, name) do + return without_original(perform_sass_fn(fn, args, splat, environment)) + end + end + + args = construct_ruby_args(ruby_name, args, splat, environment) + + if Sass::Script::Functions.callable?(ruby_name) && (!fn || fn.origin == :builtin) + local_environment = Sass::Environment.new(environment.global_env, environment.options) + local_environment.caller = Sass::ReadOnlyEnvironment.new(environment, environment.options) + result = local_environment.stack.with_function(filename, line, name) do + opts(Sass::Script::Functions::EvaluationContext.new( + local_environment).send(ruby_name, *args)) + end + without_original(result) + else + opts(to_literal(args)) + end + rescue ArgumentError => e + reformat_argument_error(e) + end + + # Compass historically overrode this before it changed name to {Funcall#to_value}. + # We should get rid of it in the future. + def to_literal(args) + to_value(args) + end + + # This method is factored out from `_perform` so that compass can override + # it with a cross-browser implementation for functions that require vendor prefixes + # in the generated css. + def to_value(args) + Sass::Script::Value::String.new("#{name}(#{args.join(', ')})") + end + + private + + def ruby_name + @ruby_name ||= @name.tr('-', '_') + end + + def perform_arg(argument, environment, name) + return argument if signature && signature.delayed_args.include?(name) + argument.perform(environment) + end + + def signature + @signature ||= Sass::Script::Functions.signature(name.to_sym, @args.size, @keywords.size) + end + + def without_original(value) + return value unless value.is_a?(Sass::Script::Value::Number) + value = value.dup + value.original = nil + value + end + + def construct_ruby_args(name, args, splat, environment) + args += splat.to_a if splat + + # All keywords are contained in splat.keywords for consistency, + # even if there were no splats passed in. + old_keywords_accessed = splat.keywords_accessed + keywords = splat.keywords + splat.keywords_accessed = old_keywords_accessed + + unless (signature = Sass::Script::Functions.signature(name.to_sym, args.size, keywords.size)) + return args if keywords.empty? + raise Sass::SyntaxError.new("Function #{name} doesn't support keyword arguments") + end + + # If the user passes more non-keyword args than the function expects, + # but it does expect keyword args, Ruby's arg handling won't raise an error. + # Since we don't want to make functions think about this, + # we'll handle it for them here. + if signature.var_kwargs && !signature.var_args && args.size > signature.args.size + raise Sass::SyntaxError.new( + "#{args[signature.args.size].inspect} is not a keyword argument for `#{name}'") + elsif keywords.empty? + args << {} if signature.var_kwargs + return args + end + + argnames = signature.args[args.size..-1] || [] + deprecated_argnames = (signature.deprecated && signature.deprecated[args.size..-1]) || [] + args += argnames.zip(deprecated_argnames).map do |(argname, deprecated_argname)| + if keywords.has_key?(argname) + keywords.delete(argname) + elsif deprecated_argname && keywords.has_key?(deprecated_argname) + deprecated_argname = keywords.denormalize(deprecated_argname) + Sass::Util.sass_warn("DEPRECATION WARNING: The `$#{deprecated_argname}' argument for " + + "`#{@name}()' has been renamed to `$#{argname}'.") + keywords.delete(deprecated_argname) + else + raise Sass::SyntaxError.new("Function #{name} requires an argument named $#{argname}") + end + end + + if keywords.size > 0 + if signature.var_kwargs + # Don't pass a NormalizedMap to a Ruby function. + args << keywords.to_hash + else + argname = keywords.keys.sort.first + if signature.args.include?(argname) + raise Sass::SyntaxError.new( + "Function #{name} was passed argument $#{argname} both by position and by name") + else + raise Sass::SyntaxError.new( + "Function #{name} doesn't have an argument named $#{argname}") + end + end + end + + args + end + + def perform_sass_fn(function, args, splat, environment) + Sass::Tree::Visitors::Perform.perform_arguments(function, args, splat, environment) do |env| + env.caller = Sass::Environment.new(environment) + + val = catch :_sass_return do + function.tree.each {|c| Sass::Tree::Visitors::Perform.visit(c, env)} + raise Sass::SyntaxError.new("Function #{@name} finished without @return") + end + val + end + end + + def reformat_argument_error(e) + message = e.message + + # If this is a legitimate Ruby-raised argument error, re-raise it. + # Otherwise, it's an error in the user's stylesheet, so wrap it. + if Sass::Util.rbx? + # Rubinius has a different error report string than vanilla Ruby. It + # also doesn't put the actual method for which the argument error was + # thrown in the backtrace, nor does it include `send`, so we look for + # `_perform`. + if e.message =~ /^method '([^']+)': given (\d+), expected (\d+)/ + error_name, given, expected = $1, $2, $3 + raise e if error_name != ruby_name || e.backtrace[0] !~ /:in `_perform'$/ + message = "wrong number of arguments (#{given} for #{expected})" + end + elsif Sass::Util.jruby? + should_maybe_raise = + e.message =~ /^wrong number of arguments calling `[^`]+` \((\d+) for (\d+)\)/ + given, expected = $1, $2 + + if should_maybe_raise + # JRuby 1.7 includes __send__ before send and _perform. + trace = e.backtrace.dup + raise e if trace.shift !~ /:in `__send__'$/ + + # JRuby (as of 1.7.2) doesn't put the actual method + # for which the argument error was thrown in the backtrace, so we + # detect whether our send threw an argument error. + if !(trace[0] =~ /:in `send'$/ && trace[1] =~ /:in `_perform'$/) + raise e + else + # JRuby 1.7 doesn't use standard formatting for its ArgumentErrors. + message = "wrong number of arguments (#{given} for #{expected})" + end + end + elsif (md = /^wrong number of arguments \(given (\d+), expected (\d+)\)/.match(e.message)) && + e.backtrace[0] =~ /:in `#{ruby_name}'$/ + # Handle ruby 2.3 error formatting + message = "wrong number of arguments (#{md[1]} for #{md[2]})" + elsif e.message =~ /^wrong number of arguments/ && + e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/ + raise e + end + raise Sass::SyntaxError.new("#{message} for `#{name}'") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/interpolation.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/interpolation.rb new file mode 100644 index 000000000000..c62ac4ec9061 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/interpolation.rb @@ -0,0 +1,220 @@ +module Sass::Script::Tree + # A SassScript object representing `#{}` interpolation outside a string. + # + # @see StringInterpolation + class Interpolation < Node + # @return [Node] The SassScript before the interpolation + attr_reader :before + + # @return [Node] The SassScript within the interpolation + attr_reader :mid + + # @return [Node] The SassScript after the interpolation + attr_reader :after + + # @return [Boolean] Whether there was whitespace between `before` and `#{` + attr_reader :whitespace_before + + # @return [Boolean] Whether there was whitespace between `}` and `after` + attr_reader :whitespace_after + + # @return [Boolean] Whether the original format of the interpolation was + # plain text, not an interpolation. This is used when converting back to + # SassScript. + attr_reader :originally_text + + # @return [Boolean] Whether a color value passed to the interpolation should + # generate a warning. + attr_reader :warn_for_color + + # The type of interpolation deprecation for this node. + # + # This can be `:none`, indicating that the node doesn't use deprecated + # interpolation; `:immediate`, indicating that a deprecation warning should + # be emitted as soon as possible; or `:potential`, indicating that a + # deprecation warning should be emitted if the resulting string is used in a + # way that would distinguish it from a list. + # + # @return [Symbol] + attr_reader :deprecation + + # Interpolation in a property is of the form `before #{mid} after`. + # + # @param before [Node] See {Interpolation#before} + # @param mid [Node] See {Interpolation#mid} + # @param after [Node] See {Interpolation#after} + # @param wb [Boolean] See {Interpolation#whitespace_before} + # @param wa [Boolean] See {Interpolation#whitespace_after} + # @param originally_text [Boolean] See {Interpolation#originally_text} + # @param warn_for_color [Boolean] See {Interpolation#warn_for_color} + def initialize(before, mid, after, wb, wa, opts = {}) + @before = before + @mid = mid + @after = after + @whitespace_before = wb + @whitespace_after = wa + @originally_text = opts[:originally_text] || false + @warn_for_color = opts[:warn_for_color] || false + @deprecation = opts[:deprecation] || :none + end + + # @return [String] A human-readable s-expression representation of the interpolation + def inspect + "(interpolation #{@before.inspect} #{@mid.inspect} #{@after.inspect})" + end + + # @see Node#to_sass + def to_sass(opts = {}) + return to_quoted_equivalent.to_sass if deprecation == :immediate + + res = "" + res << @before.to_sass(opts) if @before + res << ' ' if @before && @whitespace_before + res << '#{' unless @originally_text + res << @mid.to_sass(opts) + res << '}' unless @originally_text + res << ' ' if @after && @whitespace_after + res << @after.to_sass(opts) if @after + res + end + + # Returns an `unquote()` expression that will evaluate to the same value as + # this interpolation. + # + # @return [Sass::Script::Tree::Node] + def to_quoted_equivalent + Funcall.new( + "unquote", + [to_string_interpolation(self)], + Sass::Util::NormalizedMap.new, + nil, + nil) + end + + # Returns the three components of the interpolation, `before`, `mid`, and `after`. + # + # @return [Array<Node>] + # @see #initialize + # @see Node#children + def children + [@before, @mid, @after].compact + end + + # @see Node#deep_copy + def deep_copy + node = dup + node.instance_variable_set('@before', @before.deep_copy) if @before + node.instance_variable_set('@mid', @mid.deep_copy) + node.instance_variable_set('@after', @after.deep_copy) if @after + node + end + + protected + + # Converts a script node into a corresponding string interpolation + # expression. + # + # @param node_or_interp [Sass::Script::Tree::Node] + # @return [Sass::Script::Tree::StringInterpolation] + def to_string_interpolation(node_or_interp) + unless node_or_interp.is_a?(Interpolation) + node = node_or_interp + return string_literal(node.value.to_s) if node.is_a?(Literal) + if node.is_a?(StringInterpolation) + return concat(string_literal(node.quote), concat(node, string_literal(node.quote))) + end + return StringInterpolation.new(string_literal(""), node, string_literal("")) + end + + interp = node_or_interp + after_string_or_interp = + if interp.after + to_string_interpolation(interp.after) + else + string_literal("") + end + if interp.after && interp.whitespace_after + after_string_or_interp = concat(string_literal(' '), after_string_or_interp) + end + + mid_string_or_interp = to_string_interpolation(interp.mid) + + before_string_or_interp = + if interp.before + to_string_interpolation(interp.before) + else + string_literal("") + end + if interp.before && interp.whitespace_before + before_string_or_interp = concat(before_string_or_interp, string_literal(' ')) + end + + concat(before_string_or_interp, concat(mid_string_or_interp, after_string_or_interp)) + end + + private + + # Evaluates the interpolation. + # + # @param environment [Sass::Environment] The environment in which to evaluate the SassScript + # @return [Sass::Script::Value::String] + # The SassScript string that is the value of the interpolation + def _perform(environment) + res = "" + res << @before.perform(environment).to_s if @before + res << " " if @before && @whitespace_before + + val = @mid.perform(environment) + if @warn_for_color && val.is_a?(Sass::Script::Value::Color) && val.name + alternative = Operation.new(Sass::Script::Value::String.new("", :string), @mid, :plus) + Sass::Util.sass_warn <<MESSAGE +WARNING on line #{line}, column #{source_range.start_pos.offset}#{" of #{filename}" if filename}: +You probably don't mean to use the color value `#{val}' in interpolation here. +It may end up represented as #{val.inspect}, which will likely produce invalid CSS. +Always quote color names when using them as strings (for example, "#{val}"). +If you really want to use the color value here, use `#{alternative.to_sass}'. +MESSAGE + end + + res << val.to_s(:quote => :none) + res << " " if @after && @whitespace_after + res << @after.perform(environment).to_s if @after + str = Sass::Script::Value::String.new( + res, :identifier, + (to_quoted_equivalent.to_sass if deprecation == :potential)) + str.source_range = source_range + opts(str) + end + + # Concatenates two string literals or string interpolation expressions. + # + # @param string_or_interp1 [Sass::Script::Tree::Literal|Sass::Script::Tree::StringInterpolation] + # @param string_or_interp2 [Sass::Script::Tree::Literal|Sass::Script::Tree::StringInterpolation] + # @return [Sass::Script::Tree::StringInterpolation] + def concat(string_or_interp1, string_or_interp2) + if string_or_interp1.is_a?(Literal) && string_or_interp2.is_a?(Literal) + return string_literal(string_or_interp1.value.value + string_or_interp2.value.value) + end + + if string_or_interp1.is_a?(Literal) + string = string_or_interp1 + interp = string_or_interp2 + before = string_literal(string.value.value + interp.before.value.value) + return StringInterpolation.new(before, interp.mid, interp.after) + end + + StringInterpolation.new( + string_or_interp1.before, + string_or_interp1.mid, + concat(string_or_interp1.after, string_or_interp2)) + end + + # Returns a string literal with the given contents. + # + # @param string [String] + # @return string [Sass::Script::Tree::Literal] + def string_literal(string) + Literal.new(Sass::Script::Value::String.new(string, :string)) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/list_literal.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/list_literal.rb new file mode 100644 index 000000000000..9fbaad411f08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/list_literal.rb @@ -0,0 +1,119 @@ +module Sass::Script::Tree + # A parse tree node representing a list literal. When resolved, this returns a + # {Sass::Tree::Value::List}. + class ListLiteral < Node + # The parse nodes for members of this list. + # + # @return [Array<Node>] + attr_reader :elements + + # The operator separating the values of the list. Either `:comma` or + # `:space`. + # + # @return [Symbol] + attr_reader :separator + + # Whether the list is surrounded by square brackets. + # + # @return [Boolean] + attr_reader :bracketed + + # Creates a new list literal. + # + # @param elements [Array<Node>] See \{#elements} + # @param separator [Symbol] See \{#separator} + # @param bracketed [Boolean] See \{#bracketed} + def initialize(elements, separator: nil, bracketed: false) + @elements = elements + @separator = separator + @bracketed = bracketed + end + + # @see Node#children + def children; elements; end + + # @see Value#to_sass + def to_sass(opts = {}) + return bracketed ? "[]" : "()" if elements.empty? + members = elements.map do |v| + if element_needs_parens?(v) + "(#{v.to_sass(opts)})" + else + v.to_sass(opts) + end + end + + if separator == :comma && members.length == 1 + return "#{bracketed ? '[' : '('}#{members.first},#{bracketed ? ']' : ')'}" + end + + contents = members.join(sep_str(nil)) + bracketed ? "[#{contents}]" : contents + end + + # @see Node#deep_copy + def deep_copy + node = dup + node.instance_variable_set('@elements', elements.map {|e| e.deep_copy}) + node + end + + def inspect + (bracketed ? '[' : '(') + + elements.map {|e| e.inspect}.join(separator == :space ? ' ' : ', ') + + (bracketed ? ']' : ')') + end + + def force_division! + # Do nothing. Lists prevent division propagation. + end + + protected + + def _perform(environment) + list = Sass::Script::Value::List.new( + elements.map {|e| e.perform(environment)}, + separator: separator, + bracketed: bracketed) + list.source_range = source_range + list.options = options + list + end + + private + + # Returns whether an element in the list should be wrapped in parentheses + # when serialized to Sass. + def element_needs_parens?(element) + if element.is_a?(ListLiteral) + return false if element.elements.length < 2 + return false if element.bracketed + return Sass::Script::Parser.precedence_of(element.separator || :space) <= + Sass::Script::Parser.precedence_of(separator || :space) + end + + return false unless separator == :space + + if element.is_a?(UnaryOperation) + return element.operator == :minus || element.operator == :plus + end + + return false unless element.is_a?(Operation) + return true unless element.operator == :div + !(is_literal_number?(element.operand1) && is_literal_number?(element.operand2)) + end + + # Returns whether a value is a number literal that shouldn't be divided. + def is_literal_number?(value) + value.is_a?(Literal) && + value.value.is_a?((Sass::Script::Value::Number)) && + !value.value.original.nil? + end + + def sep_str(opts = options) + return ' ' if separator == :space + return ',' if opts && opts[:style] == :compressed + ', ' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/literal.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/literal.rb new file mode 100644 index 000000000000..d0dd6e3edf46 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/literal.rb @@ -0,0 +1,49 @@ +module Sass::Script::Tree + # The parse tree node for a literal scalar value. This wraps an instance of + # {Sass::Script::Value::Base}. + # + # List literals should use {ListLiteral} instead. + class Literal < Node + # The wrapped value. + # + # @return [Sass::Script::Value::Base] + attr_reader :value + + # Creates a new literal value. + # + # @param value [Sass::Script::Value::Base] + # @see #value + def initialize(value) + @value = value + end + + # @see Node#children + def children; []; end + + # @see Node#to_sass + def to_sass(opts = {}); value.to_sass(opts); end + + # @see Node#deep_copy + def deep_copy; dup; end + + # @see Node#options= + def options=(options) + value.options = options + end + + def inspect + value.inspect + end + + def force_division! + value.original = nil if value.is_a?(Sass::Script::Value::Number) + end + + protected + + def _perform(environment) + value.source_range = source_range + value + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/map_literal.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/map_literal.rb new file mode 100644 index 000000000000..5c2e88f382a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/map_literal.rb @@ -0,0 +1,64 @@ +module Sass::Script::Tree + # A class representing a map literal. When resolved, this returns a + # {Sass::Script::Node::Map}. + class MapLiteral < Node + # The key/value pairs that make up this map node. This isn't a Hash so that + # we can detect key collisions once all the keys have been performed. + # + # @return [Array<(Node, Node)>] + attr_reader :pairs + + # Creates a new map literal. + # + # @param pairs [Array<(Node, Node)>] See \{#pairs} + def initialize(pairs) + @pairs = pairs + end + + # @see Node#children + def children + @pairs.flatten + end + + # @see Node#to_sass + def to_sass(opts = {}) + return "()" if pairs.empty? + + to_sass = lambda do |value| + if value.is_a?(ListLiteral) && value.separator == :comma + "(#{value.to_sass(opts)})" + else + value.to_sass(opts) + end + end + + "(" + pairs.map {|(k, v)| "#{to_sass[k]}: #{to_sass[v]}"}.join(', ') + ")" + end + alias_method :inspect, :to_sass + + # @see Node#deep_copy + def deep_copy + node = dup + node.instance_variable_set('@pairs', + pairs.map {|(k, v)| [k.deep_copy, v.deep_copy]}) + node + end + + protected + + # @see Node#_perform + def _perform(environment) + keys = Set.new + map = Sass::Script::Value::Map.new(Hash[pairs.map do |(k, v)| + k, v = k.perform(environment), v.perform(environment) + if keys.include?(k) + raise Sass::SyntaxError.new("Duplicate key #{k.inspect} in map #{to_sass}.") + end + keys << k + [k, v] + end]) + map.options = options + map + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/node.rb new file mode 100644 index 000000000000..f68dd769e86a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/node.rb @@ -0,0 +1,119 @@ +module Sass::Script::Tree + # The abstract superclass for SassScript parse tree nodes. + # + # Use \{#perform} to evaluate a parse tree. + class Node + # The options hash for this node. + # + # @return [{Symbol => Object}] + attr_reader :options + + # The line of the document on which this node appeared. + # + # @return [Integer] + attr_accessor :line + + # The source range in the document on which this node appeared. + # + # @return [Sass::Source::Range] + attr_accessor :source_range + + # The file name of the document on which this node appeared. + # + # @return [String] + attr_accessor :filename + + # Sets the options hash for this node, + # as well as for all child nodes. + # See {file:SASS_REFERENCE.md#Options the Sass options documentation}. + # + # @param options [{Symbol => Object}] The options + def options=(options) + @options = options + children.each do |c| + if c.is_a? Hash + c.values.each {|v| v.options = options} + else + c.options = options + end + end + end + + # Evaluates the node. + # + # \{#perform} shouldn't be overridden directly; + # instead, override \{#\_perform}. + # + # @param environment [Sass::Environment] The environment in which to evaluate the SassScript + # @return [Sass::Script::Value] The SassScript object that is the value of the SassScript + def perform(environment) + _perform(environment) + rescue Sass::SyntaxError => e + e.modify_backtrace(:line => line) + raise e + end + + # Returns all child nodes of this node. + # + # @return [Array<Node>] + def children + Sass::Util.abstract(self) + end + + # Returns the text of this SassScript expression. + # + # @options opts :quote [String] + # The preferred quote style for quoted strings. If `:none`, strings are + # always emitted unquoted. + # + # @return [String] + def to_sass(opts = {}) + Sass::Util.abstract(self) + end + + # Returns a deep clone of this node. + # The child nodes are cloned, but options are not. + # + # @return [Node] + def deep_copy + Sass::Util.abstract(self) + end + + # Forces any division operations with number literals in this expression to + # do real division, rather than returning strings. + def force_division! + children.each {|c| c.force_division!} + end + + protected + + # Converts underscores to dashes if the :dasherize option is set. + def dasherize(s, opts) + if opts[:dasherize] + s.tr('_', '-') + else + s + end + end + + # Evaluates this node. + # Note that all {Sass::Script::Value} objects created within this method + # should have their \{#options} attribute set, probably via \{#opts}. + # + # @param environment [Sass::Environment] The environment in which to evaluate the SassScript + # @return [Sass::Script::Value] The SassScript object that is the value of the SassScript + # @see #perform + def _perform(environment) + Sass::Util.abstract(self) + end + + # Sets the \{#options} field on the given value and returns it. + # + # @param value [Sass::Script::Value] + # @return [Sass::Script::Value] + def opts(value) + value.options = options + value + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/operation.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/operation.rb new file mode 100644 index 000000000000..d8c4ea4a93f1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/operation.rb @@ -0,0 +1,149 @@ +module Sass::Script::Tree + # A SassScript parse node representing a binary operation, + # such as `$a + $b` or `"foo" + 1`. + class Operation < Node + @@color_arithmetic_deprecation = Sass::Deprecation.new + @@unitless_equals_deprecation = Sass::Deprecation.new + + attr_reader :operand1 + attr_reader :operand2 + attr_reader :operator + + # @param operand1 [Sass::Script::Tree::Node] The parse-tree node + # for the right-hand side of the operator + # @param operand2 [Sass::Script::Tree::Node] The parse-tree node + # for the left-hand side of the operator + # @param operator [Symbol] The operator to perform. + # This should be one of the binary operator names in {Sass::Script::Lexer::OPERATORS} + def initialize(operand1, operand2, operator) + @operand1 = operand1 + @operand2 = operand2 + @operator = operator + super() + end + + # @return [String] A human-readable s-expression representation of the operation + def inspect + "(#{@operator.inspect} #{@operand1.inspect} #{@operand2.inspect})" + end + + # @see Node#to_sass + def to_sass(opts = {}) + o1 = operand_to_sass @operand1, :left, opts + o2 = operand_to_sass @operand2, :right, opts + sep = + case @operator + when :comma; ", " + when :space; " " + else; " #{Sass::Script::Lexer::OPERATORS_REVERSE[@operator]} " + end + "#{o1}#{sep}#{o2}" + end + + # Returns the operands for this operation. + # + # @return [Array<Node>] + # @see Node#children + def children + [@operand1, @operand2] + end + + # @see Node#deep_copy + def deep_copy + node = dup + node.instance_variable_set('@operand1', @operand1.deep_copy) + node.instance_variable_set('@operand2', @operand2.deep_copy) + node + end + + protected + + # Evaluates the operation. + # + # @param environment [Sass::Environment] The environment in which to evaluate the SassScript + # @return [Sass::Script::Value] The SassScript object that is the value of the operation + # @raise [Sass::SyntaxError] if the operation is undefined for the operands + def _perform(environment) + value1 = @operand1.perform(environment) + + # Special-case :and and :or to support short-circuiting. + if @operator == :and + return value1.to_bool ? @operand2.perform(environment) : value1 + elsif @operator == :or + return value1.to_bool ? value1 : @operand2.perform(environment) + end + + value2 = @operand2.perform(environment) + + if (value1.is_a?(Sass::Script::Value::Null) || value2.is_a?(Sass::Script::Value::Null)) && + @operator != :eq && @operator != :neq + raise Sass::SyntaxError.new( + "Invalid null operation: \"#{value1.inspect} #{@operator} #{value2.inspect}\".") + end + + begin + result = opts(value1.send(@operator, value2)) + rescue NoMethodError => e + raise e unless e.name.to_s == @operator.to_s + raise Sass::SyntaxError.new("Undefined operation: \"#{value1} #{@operator} #{value2}\".") + end + + warn_for_color_arithmetic(value1, value2) + warn_for_unitless_equals(value1, value2, result) + + result + end + + private + + def warn_for_color_arithmetic(value1, value2) + return unless @operator == :plus || @operator == :times || @operator == :minus || + @operator == :div || @operator == :mod + + if value1.is_a?(Sass::Script::Value::Number) + return unless value2.is_a?(Sass::Script::Value::Color) + elsif value1.is_a?(Sass::Script::Value::Color) + return unless value2.is_a?(Sass::Script::Value::Color) || value2.is_a?(Sass::Script::Value::Number) + else + return + end + + @@color_arithmetic_deprecation.warn(filename, line, <<WARNING) +The operation `#{value1} #{@operator} #{value2}` is deprecated and will be an error in future versions. +Consider using Sass's color functions instead. +https://sass-lang.com/documentation/Sass/Script/Functions.html#other_color_functions +WARNING + end + + def warn_for_unitless_equals(value1, value2, result) + return unless @operator == :eq || @operator == :neq + return unless value1.is_a?(Sass::Script::Value::Number) + return unless value2.is_a?(Sass::Script::Value::Number) + return unless value1.unitless? != value2.unitless? + return unless result == (if @operator == :eq + Sass::Script::Value::Bool::TRUE + else + Sass::Script::Value::Bool::FALSE + end) + + operation = "#{value1.to_sass} #{@operator == :eq ? '==' : '!='} #{value2.to_sass}" + future_value = @operator == :neq + @@unitless_equals_deprecation.warn(filename, line, <<WARNING) +The result of `#{operation}` will be `#{future_value}` in future releases of Sass. +Unitless numbers will no longer be equal to the same numbers with units. +WARNING + end + + def operand_to_sass(op, side, opts) + return "(#{op.to_sass(opts)})" if op.is_a?(Sass::Script::Tree::ListLiteral) + return op.to_sass(opts) unless op.is_a?(Operation) + + pred = Sass::Script::Parser.precedence_of(@operator) + sub_pred = Sass::Script::Parser.precedence_of(op.operator) + assoc = Sass::Script::Parser.associative?(@operator) + return "(#{op.to_sass(opts)})" if sub_pred < pred || + (side == :right && sub_pred == pred && !assoc) + op.to_sass(opts) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/selector.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/selector.rb new file mode 100644 index 000000000000..4a852cdf99ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/selector.rb @@ -0,0 +1,26 @@ +module Sass::Script::Tree + # A SassScript node that will resolve to the current selector. + class Selector < Node + def initialize; end + + def children + [] + end + + def to_sass(opts = {}) + '&' + end + + def deep_copy + dup + end + + protected + + def _perform(environment) + selector = environment.selector + return opts(Sass::Script::Value::Null.new) unless selector + opts(selector.to_sass_script) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/string_interpolation.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/string_interpolation.rb new file mode 100644 index 000000000000..c373c36efe44 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/string_interpolation.rb @@ -0,0 +1,125 @@ +module Sass::Script::Tree + # A SassScript object representing `#{}` interpolation within a string. + # + # @see Interpolation + class StringInterpolation < Node + # @return [Literal] The string literal before this interpolation. + attr_reader :before + + # @return [Node] The SassScript within the interpolation + attr_reader :mid + + # @return [StringInterpolation, Literal] + # The string literal or string interpolation before this interpolation. + attr_reader :after + + # Whether this is a CSS string or a CSS identifier. The difference is that + # strings are written with double-quotes, while identifiers aren't. + # + # String interpolations are only ever identifiers if they're quote-like + # functions such as `url()`. + # + # @return [Symbol] `:string` or `:identifier` + def type + @before.value.type + end + + # Returns the quote character that should be used to wrap a Sass + # representation of this interpolation. + def quote + quote_for(self) || '"' + end + + # Interpolation in a string is of the form `"before #{mid} after"`, + # where `before` and `after` may include more interpolation. + # + # @param before [StringInterpolation, Literal] See {StringInterpolation#before} + # @param mid [Node] See {StringInterpolation#mid} + # @param after [Literal] See {StringInterpolation#after} + def initialize(before, mid, after) + @before = before + @mid = mid + @after = after + end + + # @return [String] A human-readable s-expression representation of the interpolation + def inspect + "(string_interpolation #{@before.inspect} #{@mid.inspect} #{@after.inspect})" + end + + # @see Node#to_sass + def to_sass(opts = {}) + quote = type == :string ? opts[:quote] || quote_for(self) || '"' : :none + opts = opts.merge(:quote => quote) + + res = "" + res << quote if quote != :none + res << _to_sass(before, opts) + res << '#{' << @mid.to_sass(opts.merge(:quote => nil)) << '}' + res << _to_sass(after, opts) + res << quote if quote != :none + res + end + + # Returns the three components of the interpolation, `before`, `mid`, and `after`. + # + # @return [Array<Node>] + # @see #initialize + # @see Node#children + def children + [@before, @mid, @after].compact + end + + # @see Node#deep_copy + def deep_copy + node = dup + node.instance_variable_set('@before', @before.deep_copy) if @before + node.instance_variable_set('@mid', @mid.deep_copy) + node.instance_variable_set('@after', @after.deep_copy) if @after + node + end + + protected + + # Evaluates the interpolation. + # + # @param environment [Sass::Environment] The environment in which to evaluate the SassScript + # @return [Sass::Script::Value::String] + # The SassScript string that is the value of the interpolation + def _perform(environment) + res = "" + before = @before.perform(environment) + res << before.value + mid = @mid.perform(environment) + res << (mid.is_a?(Sass::Script::Value::String) ? mid.value : mid.to_s(:quote => :none)) + res << @after.perform(environment).value + opts(Sass::Script::Value::String.new(res, before.type)) + end + + private + + def _to_sass(string_or_interp, opts) + result = string_or_interp.to_sass(opts) + opts[:quote] == :none ? result : result.slice(1...-1) + end + + def quote_for(string_or_interp) + if string_or_interp.is_a?(Sass::Script::Tree::Literal) + return nil if string_or_interp.value.value.empty? + return '"' if string_or_interp.value.value.include?("'") + return "'" if string_or_interp.value.value.include?('"') + return nil + end + + # Double-quotes take precedence over single quotes. + before_quote = quote_for(string_or_interp.before) + return '"' if before_quote == '"' + after_quote = quote_for(string_or_interp.after) + return '"' if after_quote == '"' + + # Returns "'" if either or both insist on single quotes, and nil + # otherwise. + before_quote || after_quote + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/unary_operation.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/unary_operation.rb new file mode 100644 index 000000000000..b32da087a9e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/unary_operation.rb @@ -0,0 +1,69 @@ +module Sass::Script::Tree + # A SassScript parse node representing a unary operation, + # such as `-$b` or `not true`. + # + # Currently only `-`, `/`, and `not` are unary operators. + class UnaryOperation < Node + # @return [Symbol] The operation to perform + attr_reader :operator + + # @return [Script::Node] The parse-tree node for the object of the operator + attr_reader :operand + + # @param operand [Script::Node] See \{#operand} + # @param operator [Symbol] See \{#operator} + def initialize(operand, operator) + @operand = operand + @operator = operator + super() + end + + # @return [String] A human-readable s-expression representation of the operation + def inspect + "(#{@operator.inspect} #{@operand.inspect})" + end + + # @see Node#to_sass + def to_sass(opts = {}) + operand = @operand.to_sass(opts) + if @operand.is_a?(Operation) || + (@operator == :minus && + (operand =~ Sass::SCSS::RX::IDENT) == 0) + operand = "(#{@operand.to_sass(opts)})" + end + op = Sass::Script::Lexer::OPERATORS_REVERSE[@operator] + op + (op =~ /[a-z]/ ? " " : "") + operand + end + + # Returns the operand of the operation. + # + # @return [Array<Node>] + # @see Node#children + def children + [@operand] + end + + # @see Node#deep_copy + def deep_copy + node = dup + node.instance_variable_set('@operand', @operand.deep_copy) + node + end + + protected + + # Evaluates the operation. + # + # @param environment [Sass::Environment] The environment in which to evaluate the SassScript + # @return [Sass::Script::Value] The SassScript object that is the value of the operation + # @raise [Sass::SyntaxError] if the operation is undefined for the operand + def _perform(environment) + operator = "unary_#{@operator}" + value = @operand.perform(environment) + value.send(operator) + rescue NoMethodError => e + raise e unless e.name.to_s == operator.to_s + raise Sass::SyntaxError.new("Undefined unary operation: \"#{@operator} #{value}\".") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/variable.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/variable.rb new file mode 100644 index 000000000000..7e197381e32b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/tree/variable.rb @@ -0,0 +1,57 @@ +module Sass::Script::Tree + # A SassScript parse node representing a variable. + class Variable < Node + # The name of the variable. + # + # @return [String] + attr_reader :name + + # The underscored name of the variable. + # + # @return [String] + attr_reader :underscored_name + + # @param name [String] See \{#name} + def initialize(name) + @name = name + @underscored_name = name.tr("-", "_") + super() + end + + # @return [String] A string representation of the variable + def inspect(opts = {}) + "$#{dasherize(name, opts)}" + end + alias_method :to_sass, :inspect + + # Returns an empty array. + # + # @return [Array<Node>] empty + # @see Node#children + def children + [] + end + + # @see Node#deep_copy + def deep_copy + dup + end + + protected + + # Evaluates the variable. + # + # @param environment [Sass::Environment] The environment in which to evaluate the SassScript + # @return [Sass::Script::Value] The SassScript object that is the value of the variable + # @raise [Sass::SyntaxError] if the variable is undefined + def _perform(environment) + val = environment.var(name) + raise Sass::SyntaxError.new("Undefined variable: \"$#{name}\".") unless val + if val.is_a?(Sass::Script::Value::Number) && val.original + val = val.dup + val.original = nil + end + val + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value.rb new file mode 100644 index 000000000000..4f35d634c873 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value.rb @@ -0,0 +1,13 @@ +module Sass::Script::Value; end + +require 'sass/script/value/base' +require 'sass/script/value/string' +require 'sass/script/value/number' +require 'sass/script/value/color' +require 'sass/script/value/bool' +require 'sass/script/value/null' +require 'sass/script/value/list' +require 'sass/script/value/arg_list' +require 'sass/script/value/map' +require 'sass/script/value/callable' +require 'sass/script/value/function' diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/arg_list.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/arg_list.rb new file mode 100644 index 000000000000..a68d7963c99c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/arg_list.rb @@ -0,0 +1,36 @@ +module Sass::Script::Value + # A SassScript object representing a variable argument list. This works just + # like a normal list, but can also contain keyword arguments. + # + # The keyword arguments attached to this list are unused except when this is + # passed as a glob argument to a function or mixin. + class ArgList < List + # Whether \{#keywords} has been accessed. If so, we assume that all keywords + # were valid for the function that created this ArgList. + # + # @return [Boolean] + attr_accessor :keywords_accessed + + # Creates a new argument list. + # + # @param value [Array<Value>] See \{List#value}. + # @param keywords [Hash<String, Value>, NormalizedMap<Value>] See \{#keywords} + # @param separator [String] See \{List#separator}. + def initialize(value, keywords, separator) + super(value, separator: separator) + if keywords.is_a?(Sass::Util::NormalizedMap) + @keywords = keywords + else + @keywords = Sass::Util::NormalizedMap.new(keywords) + end + end + + # The keyword arguments attached to this list. + # + # @return [NormalizedMap<Value>] + def keywords + @keywords_accessed = true + @keywords + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/base.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/base.rb new file mode 100644 index 000000000000..659635706961 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/base.rb @@ -0,0 +1,258 @@ +module Sass::Script::Value + # The abstract superclass for SassScript objects. + # + # Many of these methods, especially the ones that correspond to SassScript operations, + # are designed to be overridden by subclasses which may change the semantics somewhat. + # The operations listed here are just the defaults. + class Base + # Returns the Ruby value of the value. + # The type of this value varies based on the subclass. + # + # @return [Object] + attr_reader :value + + # The source range in the document on which this node appeared. + # + # @return [Sass::Source::Range] + attr_accessor :source_range + + # Creates a new value. + # + # @param value [Object] The object for \{#value} + def initialize(value = nil) + value.freeze unless value.nil? || value == true || value == false + @value = value + @options = nil + end + + # Sets the options hash for this node, + # as well as for all child nodes. + # See {file:SASS_REFERENCE.md#Options the Sass options documentation}. + # + # @param options [{Symbol => Object}] The options + attr_writer :options + + # Returns the options hash for this node. + # + # @return [{Symbol => Object}] + # @raise [Sass::SyntaxError] if the options hash hasn't been set. + # This should only happen when the value was created + # outside of the parser and \{#to\_s} was called on it + def options + return @options if @options + raise Sass::SyntaxError.new(<<MSG) +The #options attribute is not set on this #{self.class}. + This error is probably occurring because #to_s was called + on this value within a custom Sass function without first + setting the #options attribute. +MSG + end + + # The SassScript `==` operation. + # **Note that this returns a {Sass::Script::Value::Bool} object, + # not a Ruby boolean**. + # + # @param other [Value] The right-hand side of the operator + # @return [Sass::Script::Value::Bool] True if this value is the same as the other, + # false otherwise + def eq(other) + Sass::Script::Value::Bool.new(self.class == other.class && value == other.value) + end + + # The SassScript `!=` operation. + # **Note that this returns a {Sass::Script::Value::Bool} object, + # not a Ruby boolean**. + # + # @param other [Value] The right-hand side of the operator + # @return [Sass::Script::Value::Bool] False if this value is the same as the other, + # true otherwise + def neq(other) + Sass::Script::Value::Bool.new(!eq(other).to_bool) + end + + # The SassScript `==` operation. + # **Note that this returns a {Sass::Script::Value::Bool} object, + # not a Ruby boolean**. + # + # @param other [Value] The right-hand side of the operator + # @return [Sass::Script::Value::Bool] True if this value is the same as the other, + # false otherwise + def unary_not + Sass::Script::Value::Bool.new(!to_bool) + end + + # The SassScript `=` operation + # (used for proprietary MS syntax like `alpha(opacity=20)`). + # + # @param other [Value] The right-hand side of the operator + # @return [Script::Value::String] A string containing both values + # separated by `"="` + def single_eq(other) + Sass::Script::Value::String.new("#{self}=#{other}") + end + + # The SassScript `+` operation. + # + # @param other [Value] The right-hand side of the operator + # @return [Script::Value::String] A string containing both values + # without any separation + def plus(other) + type = other.is_a?(Sass::Script::Value::String) ? other.type : :identifier + Sass::Script::Value::String.new(to_s(:quote => :none) + other.to_s(:quote => :none), type) + end + + # The SassScript `-` operation. + # + # @param other [Value] The right-hand side of the operator + # @return [Script::Value::String] A string containing both values + # separated by `"-"` + def minus(other) + Sass::Script::Value::String.new("#{self}-#{other}") + end + + # The SassScript `/` operation. + # + # @param other [Value] The right-hand side of the operator + # @return [Script::Value::String] A string containing both values + # separated by `"/"` + def div(other) + Sass::Script::Value::String.new("#{self}/#{other}") + end + + # The SassScript unary `+` operation (e.g. `+$a`). + # + # @param other [Value] The right-hand side of the operator + # @return [Script::Value::String] A string containing the value + # preceded by `"+"` + def unary_plus + Sass::Script::Value::String.new("+#{self}") + end + + # The SassScript unary `-` operation (e.g. `-$a`). + # + # @param other [Value] The right-hand side of the operator + # @return [Script::Value::String] A string containing the value + # preceded by `"-"` + def unary_minus + Sass::Script::Value::String.new("-#{self}") + end + + # The SassScript unary `/` operation (e.g. `/$a`). + # + # @param other [Value] The right-hand side of the operator + # @return [Script::Value::String] A string containing the value + # preceded by `"/"` + def unary_div + Sass::Script::Value::String.new("/#{self}") + end + + # Returns the hash code of this value. Two objects' hash codes should be + # equal if the objects are equal. + # + # @return [Integer for Ruby 2.4.0+, Fixnum for earlier Ruby versions] The hash code. + def hash + value.hash + end + + def eql?(other) + self == other + end + + # @return [String] A readable representation of the value + def inspect + value.inspect + end + + # @return [Boolean] `true` (the Ruby boolean value) + def to_bool + true + end + + # Compares this object with another. + # + # @param other [Object] The object to compare with + # @return [Boolean] Whether or not this value is equivalent to `other` + def ==(other) + eq(other).to_bool + end + + # @return [Integer] The integer value of this value + # @raise [Sass::SyntaxError] if this value isn't an integer + def to_i + raise Sass::SyntaxError.new("#{inspect} is not an integer.") + end + + # @raise [Sass::SyntaxError] if this value isn't an integer + def assert_int!; to_i; end + + # Returns the separator for this value. For non-list-like values or the + # empty list, this will be `nil`. For lists or maps, it will be `:space` or + # `:comma`. + # + # @return [Symbol] + def separator; nil; end + + # Whether the value is surrounded by square brackets. For non-list values, + # this will be `false`. + # + # @return [Boolean] + def bracketed; false; end + + # Returns the value of this value as a list. + # Single values are considered the same as single-element lists. + # + # @return [Array<Value>] This value as a list + def to_a + [self] + end + + # Returns the value of this value as a hash. Most values don't have hash + # representations, but [Map]s and empty [List]s do. + # + # @return [Hash<Value, Value>] This value as a hash + # @raise [Sass::SyntaxError] if this value doesn't have a hash representation + def to_h + raise Sass::SyntaxError.new("#{inspect} is not a map.") + end + + # Returns the string representation of this value + # as it would be output to the CSS document. + # + # @options opts :quote [String] + # The preferred quote style for quoted strings. If `:none`, strings are + # always emitted unquoted. + # @return [String] + def to_s(opts = {}) + Sass::Util.abstract(self) + end + alias_method :to_sass, :to_s + + # Returns whether or not this object is null. + # + # @return [Boolean] `false` + def null? + false + end + + # Creates a new list containing `contents` but with the same brackets and + # separators as this object, when interpreted as a list. + # + # @param contents [Array<Value>] The contents of the new list. + # @param separator [Symbol] The separator of the new list. Defaults to \{#separator}. + # @param bracketed [Boolean] Whether the new list is bracketed. Defaults to \{#bracketed}. + # @return [Sass::Script::Value::List] + def with_contents(contents, separator: self.separator, bracketed: self.bracketed) + Sass::Script::Value::List.new(contents, separator: separator, bracketed: bracketed) + end + + protected + + # Evaluates the value. + # + # @param environment [Sass::Environment] The environment in which to evaluate the SassScript + # @return [Value] This value + def _perform(environment) + self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/bool.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/bool.rb new file mode 100644 index 000000000000..fd1789baec89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/bool.rb @@ -0,0 +1,35 @@ +module Sass::Script::Value + # A SassScript object representing a boolean (true or false) value. + class Bool < Base + # The true value in SassScript. + # + # This is assigned before new is overridden below so that we use the default implementation. + TRUE = new(true) + + # The false value in SassScript. + # + # This is assigned before new is overridden below so that we use the default implementation. + FALSE = new(false) + + # We override object creation so that users of the core API + # will not need to know that booleans are specific constants. + # + # @param value A ruby value that will be tested for truthiness. + # @return [Bool] TRUE if value is truthy, FALSE if value is falsey + def self.new(value) + value ? TRUE : FALSE + end + + # The Ruby value of the boolean. + # + # @return [Boolean] + attr_reader :value + alias_method :to_bool, :value + + # @return [String] "true" or "false" + def to_s(opts = {}) + @value.to_s + end + alias_method :to_sass, :to_s + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/callable.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/callable.rb new file mode 100644 index 000000000000..4e10d0dcb295 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/callable.rb @@ -0,0 +1,25 @@ +module Sass::Script::Value + # A SassScript object representing a null value. + class Callable < Base + # Constructs a Callable value for use in SassScript. + # + # @param callable [Sass::Callable] The callable to be used when the + # callable is called. + def initialize(callable) + super(callable) + end + + def to_s(opts = {}) + raise Sass::SyntaxError.new("#{to_sass} isn't a valid CSS value.") + end + + def inspect + to_sass + end + + # @abstract + def to_sass + Sass::Util.abstract(self) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/color.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/color.rb new file mode 100644 index 000000000000..ccd148dcf2db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/color.rb @@ -0,0 +1,704 @@ +module Sass::Script::Value + # A SassScript object representing a CSS color. + # + # A color may be represented internally as RGBA, HSLA, or both. + # It's originally represented as whatever its input is; + # if it's created with RGB values, it's represented as RGBA, + # and if it's created with HSL values, it's represented as HSLA. + # Once a property is accessed that requires the other representation -- + # for example, \{#red} for an HSL color -- + # that component is calculated and cached. + # + # The alpha channel of a color is independent of its RGB or HSL representation. + # It's always stored, as 1 if nothing else is specified. + # If only the alpha channel is modified using \{#with}, + # the cached RGB and HSL values are retained. + class Color < Base + # @private + # + # Convert a ruby integer to a rgba components + # @param color [Integer] + # @return [Array<Integer>] Array of 4 numbers representing r,g,b and alpha + def self.int_to_rgba(color) + rgba = (0..3).map {|n| color >> (n << 3) & 0xff}.reverse + rgba[-1] = rgba[-1] / 255.0 + rgba + end + + ALTERNATE_COLOR_NAMES = Sass::Util.map_vals( + { + 'aqua' => 0x00FFFFFF, + 'darkgrey' => 0xA9A9A9FF, + 'darkslategrey' => 0x2F4F4FFF, + 'dimgrey' => 0x696969FF, + 'fuchsia' => 0xFF00FFFF, + 'grey' => 0x808080FF, + 'lightgrey' => 0xD3D3D3FF, + 'lightslategrey' => 0x778899FF, + 'slategrey' => 0x708090FF, + }, &method(:int_to_rgba)) + + # A hash from color names to `[red, green, blue]` value arrays. + COLOR_NAMES = Sass::Util.map_vals( + { + 'aliceblue' => 0xF0F8FFFF, + 'antiquewhite' => 0xFAEBD7FF, + 'aquamarine' => 0x7FFFD4FF, + 'azure' => 0xF0FFFFFF, + 'beige' => 0xF5F5DCFF, + 'bisque' => 0xFFE4C4FF, + 'black' => 0x000000FF, + 'blanchedalmond' => 0xFFEBCDFF, + 'blue' => 0x0000FFFF, + 'blueviolet' => 0x8A2BE2FF, + 'brown' => 0xA52A2AFF, + 'burlywood' => 0xDEB887FF, + 'cadetblue' => 0x5F9EA0FF, + 'chartreuse' => 0x7FFF00FF, + 'chocolate' => 0xD2691EFF, + 'coral' => 0xFF7F50FF, + 'cornflowerblue' => 0x6495EDFF, + 'cornsilk' => 0xFFF8DCFF, + 'crimson' => 0xDC143CFF, + 'cyan' => 0x00FFFFFF, + 'darkblue' => 0x00008BFF, + 'darkcyan' => 0x008B8BFF, + 'darkgoldenrod' => 0xB8860BFF, + 'darkgray' => 0xA9A9A9FF, + 'darkgreen' => 0x006400FF, + 'darkkhaki' => 0xBDB76BFF, + 'darkmagenta' => 0x8B008BFF, + 'darkolivegreen' => 0x556B2FFF, + 'darkorange' => 0xFF8C00FF, + 'darkorchid' => 0x9932CCFF, + 'darkred' => 0x8B0000FF, + 'darksalmon' => 0xE9967AFF, + 'darkseagreen' => 0x8FBC8FFF, + 'darkslateblue' => 0x483D8BFF, + 'darkslategray' => 0x2F4F4FFF, + 'darkturquoise' => 0x00CED1FF, + 'darkviolet' => 0x9400D3FF, + 'deeppink' => 0xFF1493FF, + 'deepskyblue' => 0x00BFFFFF, + 'dimgray' => 0x696969FF, + 'dodgerblue' => 0x1E90FFFF, + 'firebrick' => 0xB22222FF, + 'floralwhite' => 0xFFFAF0FF, + 'forestgreen' => 0x228B22FF, + 'gainsboro' => 0xDCDCDCFF, + 'ghostwhite' => 0xF8F8FFFF, + 'gold' => 0xFFD700FF, + 'goldenrod' => 0xDAA520FF, + 'gray' => 0x808080FF, + 'green' => 0x008000FF, + 'greenyellow' => 0xADFF2FFF, + 'honeydew' => 0xF0FFF0FF, + 'hotpink' => 0xFF69B4FF, + 'indianred' => 0xCD5C5CFF, + 'indigo' => 0x4B0082FF, + 'ivory' => 0xFFFFF0FF, + 'khaki' => 0xF0E68CFF, + 'lavender' => 0xE6E6FAFF, + 'lavenderblush' => 0xFFF0F5FF, + 'lawngreen' => 0x7CFC00FF, + 'lemonchiffon' => 0xFFFACDFF, + 'lightblue' => 0xADD8E6FF, + 'lightcoral' => 0xF08080FF, + 'lightcyan' => 0xE0FFFFFF, + 'lightgoldenrodyellow' => 0xFAFAD2FF, + 'lightgreen' => 0x90EE90FF, + 'lightgray' => 0xD3D3D3FF, + 'lightpink' => 0xFFB6C1FF, + 'lightsalmon' => 0xFFA07AFF, + 'lightseagreen' => 0x20B2AAFF, + 'lightskyblue' => 0x87CEFAFF, + 'lightslategray' => 0x778899FF, + 'lightsteelblue' => 0xB0C4DEFF, + 'lightyellow' => 0xFFFFE0FF, + 'lime' => 0x00FF00FF, + 'limegreen' => 0x32CD32FF, + 'linen' => 0xFAF0E6FF, + 'magenta' => 0xFF00FFFF, + 'maroon' => 0x800000FF, + 'mediumaquamarine' => 0x66CDAAFF, + 'mediumblue' => 0x0000CDFF, + 'mediumorchid' => 0xBA55D3FF, + 'mediumpurple' => 0x9370DBFF, + 'mediumseagreen' => 0x3CB371FF, + 'mediumslateblue' => 0x7B68EEFF, + 'mediumspringgreen' => 0x00FA9AFF, + 'mediumturquoise' => 0x48D1CCFF, + 'mediumvioletred' => 0xC71585FF, + 'midnightblue' => 0x191970FF, + 'mintcream' => 0xF5FFFAFF, + 'mistyrose' => 0xFFE4E1FF, + 'moccasin' => 0xFFE4B5FF, + 'navajowhite' => 0xFFDEADFF, + 'navy' => 0x000080FF, + 'oldlace' => 0xFDF5E6FF, + 'olive' => 0x808000FF, + 'olivedrab' => 0x6B8E23FF, + 'orange' => 0xFFA500FF, + 'orangered' => 0xFF4500FF, + 'orchid' => 0xDA70D6FF, + 'palegoldenrod' => 0xEEE8AAFF, + 'palegreen' => 0x98FB98FF, + 'paleturquoise' => 0xAFEEEEFF, + 'palevioletred' => 0xDB7093FF, + 'papayawhip' => 0xFFEFD5FF, + 'peachpuff' => 0xFFDAB9FF, + 'peru' => 0xCD853FFF, + 'pink' => 0xFFC0CBFF, + 'plum' => 0xDDA0DDFF, + 'powderblue' => 0xB0E0E6FF, + 'purple' => 0x800080FF, + 'red' => 0xFF0000FF, + 'rebeccapurple' => 0x663399FF, + 'rosybrown' => 0xBC8F8FFF, + 'royalblue' => 0x4169E1FF, + 'saddlebrown' => 0x8B4513FF, + 'salmon' => 0xFA8072FF, + 'sandybrown' => 0xF4A460FF, + 'seagreen' => 0x2E8B57FF, + 'seashell' => 0xFFF5EEFF, + 'sienna' => 0xA0522DFF, + 'silver' => 0xC0C0C0FF, + 'skyblue' => 0x87CEEBFF, + 'slateblue' => 0x6A5ACDFF, + 'slategray' => 0x708090FF, + 'snow' => 0xFFFAFAFF, + 'springgreen' => 0x00FF7FFF, + 'steelblue' => 0x4682B4FF, + 'tan' => 0xD2B48CFF, + 'teal' => 0x008080FF, + 'thistle' => 0xD8BFD8FF, + 'tomato' => 0xFF6347FF, + 'transparent' => 0x00000000, + 'turquoise' => 0x40E0D0FF, + 'violet' => 0xEE82EEFF, + 'wheat' => 0xF5DEB3FF, + 'white' => 0xFFFFFFFF, + 'whitesmoke' => 0xF5F5F5FF, + 'yellow' => 0xFFFF00FF, + 'yellowgreen' => 0x9ACD32FF + }, &method(:int_to_rgba)) + + # A hash from `[red, green, blue, alpha]` value arrays to color names. + COLOR_NAMES_REVERSE = COLOR_NAMES.invert.freeze + + # We add the alternate color names after inverting because + # different ruby implementations and versions vary on the ordering of the result of invert. + COLOR_NAMES.update(ALTERNATE_COLOR_NAMES).freeze + + # The user's original representation of the color. + # + # @return [String] + attr_reader :representation + + # Constructs an RGB or HSL color object, + # optionally with an alpha channel. + # + # RGB values are clipped within 0 and 255. + # Saturation and lightness values are clipped within 0 and 100. + # The alpha value is clipped within 0 and 1. + # + # @raise [Sass::SyntaxError] if any color value isn't in the specified range + # + # @overload initialize(attrs) + # The attributes are specified as a hash. This hash must contain either + # `:hue`, `:saturation`, and `:lightness` keys, or `:red`, `:green`, and + # `:blue` keys. It cannot contain both HSL and RGB keys. It may also + # optionally contain an `:alpha` key, and a `:representation` key + # indicating the original representation of the color that the user wrote + # in their stylesheet. + # + # @param attrs [{Symbol => Numeric}] A hash of color attributes to values + # @raise [ArgumentError] if not enough attributes are specified, + # or both RGB and HSL attributes are specified + # + # @overload initialize(rgba, [representation]) + # The attributes are specified as an array. + # This overload only supports RGB or RGBA colors. + # + # @param rgba [Array<Numeric>] A three- or four-element array + # of the red, green, blue, and optionally alpha values (respectively) + # of the color + # @param representation [String] The original representation of the color + # that the user wrote in their stylesheet. + # @raise [ArgumentError] if not enough attributes are specified + def initialize(attrs, representation = nil, allow_both_rgb_and_hsl = false) + super(nil) + + if attrs.is_a?(Array) + unless (3..4).include?(attrs.size) + raise ArgumentError.new("Color.new(array) expects a three- or four-element array") + end + + red, green, blue = attrs[0...3].map {|c| Sass::Util.round(c)} + @attrs = {:red => red, :green => green, :blue => blue} + @attrs[:alpha] = attrs[3] ? attrs[3].to_f : 1 + @representation = representation + else + attrs = attrs.reject {|_k, v| v.nil?} + hsl = [:hue, :saturation, :lightness] & attrs.keys + rgb = [:red, :green, :blue] & attrs.keys + if !allow_both_rgb_and_hsl && !hsl.empty? && !rgb.empty? + raise ArgumentError.new("Color.new(hash) may not have both HSL and RGB keys specified") + elsif hsl.empty? && rgb.empty? + raise ArgumentError.new("Color.new(hash) must have either HSL or RGB keys specified") + elsif !hsl.empty? && hsl.size != 3 + raise ArgumentError.new("Color.new(hash) must have all three HSL values specified") + elsif !rgb.empty? && rgb.size != 3 + raise ArgumentError.new("Color.new(hash) must have all three RGB values specified") + end + + @attrs = attrs + @attrs[:hue] %= 360 if @attrs[:hue] + @attrs[:alpha] ||= 1 + @representation = @attrs.delete(:representation) + end + + [:red, :green, :blue].each do |k| + next if @attrs[k].nil? + @attrs[k] = Sass::Util.restrict(Sass::Util.round(@attrs[k]), 0..255) + end + + [:saturation, :lightness].each do |k| + next if @attrs[k].nil? + @attrs[k] = Sass::Util.restrict(@attrs[k], 0..100) + end + + @attrs[:alpha] = Sass::Util.restrict(@attrs[:alpha], 0..1) + end + + # Create a new color from a valid CSS hex string. + # + # The leading hash is optional. + # + # @return [Color] + def self.from_hex(hex_string, alpha = nil) + unless hex_string =~ /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i || + hex_string =~ /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i + raise ArgumentError.new("#{hex_string.inspect} is not a valid hex color.") + end + red = $1.ljust(2, $1).to_i(16) + green = $2.ljust(2, $2).to_i(16) + blue = $3.ljust(2, $3).to_i(16) + alpha = $4.ljust(2, $4).to_i(16).to_f / 0xff if $4 + + hex_string = "##{hex_string}" unless hex_string[0] == ?# + attrs = {:red => red, :green => green, :blue => blue, :representation => hex_string} + attrs[:alpha] = alpha if alpha + new(attrs) + end + + # The red component of the color. + # + # @return [Integer] + def red + hsl_to_rgb! + @attrs[:red] + end + + # The green component of the color. + # + # @return [Integer] + def green + hsl_to_rgb! + @attrs[:green] + end + + # The blue component of the color. + # + # @return [Integer] + def blue + hsl_to_rgb! + @attrs[:blue] + end + + # The hue component of the color. + # + # @return [Numeric] + def hue + rgb_to_hsl! + @attrs[:hue] + end + + # The saturation component of the color. + # + # @return [Numeric] + def saturation + rgb_to_hsl! + @attrs[:saturation] + end + + # The lightness component of the color. + # + # @return [Numeric] + def lightness + rgb_to_hsl! + @attrs[:lightness] + end + + # The alpha channel (opacity) of the color. + # This is 1 unless otherwise defined. + # + # @return [Integer] + def alpha + @attrs[:alpha].to_f + end + + # Returns whether this color object is translucent; + # that is, whether the alpha channel is non-1. + # + # @return [Boolean] + def alpha? + alpha < 1 + end + + # Returns the red, green, and blue components of the color. + # + # @return [Array<Integer>] A frozen three-element array of the red, green, and blue + # values (respectively) of the color + def rgb + [red, green, blue].freeze + end + + # Returns the red, green, blue, and alpha components of the color. + # + # @return [Array<Integer>] A frozen four-element array of the red, green, + # blue, and alpha values (respectively) of the color + def rgba + [red, green, blue, alpha].freeze + end + + # Returns the hue, saturation, and lightness components of the color. + # + # @return [Array<Integer>] A frozen three-element array of the + # hue, saturation, and lightness values (respectively) of the color + def hsl + [hue, saturation, lightness].freeze + end + + # Returns the hue, saturation, lightness, and alpha components of the color. + # + # @return [Array<Integer>] A frozen four-element array of the hue, + # saturation, lightness, and alpha values (respectively) of the color + def hsla + [hue, saturation, lightness, alpha].freeze + end + + # The SassScript `==` operation. + # **Note that this returns a {Sass::Script::Value::Bool} object, + # not a Ruby boolean**. + # + # @param other [Value] The right-hand side of the operator + # @return [Bool] True if this value is the same as the other, + # false otherwise + def eq(other) + Sass::Script::Value::Bool.new( + other.is_a?(Color) && rgb == other.rgb && alpha == other.alpha) + end + + def hash + [rgb, alpha].hash + end + + # Returns a copy of this color with one or more channels changed. + # RGB or HSL colors may be changed, but not both at once. + # + # For example: + # + # Color.new([10, 20, 30]).with(:blue => 40) + # #=> rgb(10, 40, 30) + # Color.new([126, 126, 126]).with(:red => 0, :green => 255) + # #=> rgb(0, 255, 126) + # Color.new([255, 0, 127]).with(:saturation => 60) + # #=> rgb(204, 51, 127) + # Color.new([1, 2, 3]).with(:alpha => 0.4) + # #=> rgba(1, 2, 3, 0.4) + # + # @param attrs [{Symbol => Numeric}] + # A map of channel names (`:red`, `:green`, `:blue`, + # `:hue`, `:saturation`, `:lightness`, or `:alpha`) to values + # @return [Color] The new Color object + # @raise [ArgumentError] if both RGB and HSL keys are specified + def with(attrs) + attrs = attrs.reject {|_k, v| v.nil?} + hsl = !([:hue, :saturation, :lightness] & attrs.keys).empty? + rgb = !([:red, :green, :blue] & attrs.keys).empty? + if hsl && rgb + raise ArgumentError.new("Cannot specify HSL and RGB values for a color at the same time") + end + + if hsl + [:hue, :saturation, :lightness].each {|k| attrs[k] ||= send(k)} + elsif rgb + [:red, :green, :blue].each {|k| attrs[k] ||= send(k)} + else + # If we're just changing the alpha channel, + # keep all the HSL/RGB stuff we've calculated + attrs = @attrs.merge(attrs) + end + attrs[:alpha] ||= alpha + + Color.new(attrs, nil, :allow_both_rgb_and_hsl) + end + + # The SassScript `+` operation. + # Its functionality depends on the type of its argument: + # + # {Number} + # : Adds the number to each of the RGB color channels. + # + # {Color} + # : Adds each of the RGB color channels together. + # + # {Value} + # : See {Value::Base#plus}. + # + # @param other [Value] The right-hand side of the operator + # @return [Color] The resulting color + # @raise [Sass::SyntaxError] if `other` is a number with units + def plus(other) + if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color) + piecewise(other, :+) + else + super + end + end + + # The SassScript `-` operation. + # Its functionality depends on the type of its argument: + # + # {Number} + # : Subtracts the number from each of the RGB color channels. + # + # {Color} + # : Subtracts each of the other color's RGB color channels from this color's. + # + # {Value} + # : See {Value::Base#minus}. + # + # @param other [Value] The right-hand side of the operator + # @return [Color] The resulting color + # @raise [Sass::SyntaxError] if `other` is a number with units + def minus(other) + if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color) + piecewise(other, :-) + else + super + end + end + + # The SassScript `*` operation. + # Its functionality depends on the type of its argument: + # + # {Number} + # : Multiplies the number by each of the RGB color channels. + # + # {Color} + # : Multiplies each of the RGB color channels together. + # + # @param other [Number, Color] The right-hand side of the operator + # @return [Color] The resulting color + # @raise [Sass::SyntaxError] if `other` is a number with units + def times(other) + if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color) + piecewise(other, :*) + else + raise NoMethodError.new(nil, :times) + end + end + + # The SassScript `/` operation. + # Its functionality depends on the type of its argument: + # + # {Number} + # : Divides each of the RGB color channels by the number. + # + # {Color} + # : Divides each of this color's RGB color channels by the other color's. + # + # {Value} + # : See {Value::Base#div}. + # + # @param other [Value] The right-hand side of the operator + # @return [Color] The resulting color + # @raise [Sass::SyntaxError] if `other` is a number with units + def div(other) + if other.is_a?(Sass::Script::Value::Number) || + other.is_a?(Sass::Script::Value::Color) + piecewise(other, :/) + else + super + end + end + + # The SassScript `%` operation. + # Its functionality depends on the type of its argument: + # + # {Number} + # : Takes each of the RGB color channels module the number. + # + # {Color} + # : Takes each of this color's RGB color channels modulo the other color's. + # + # @param other [Number, Color] The right-hand side of the operator + # @return [Color] The resulting color + # @raise [Sass::SyntaxError] if `other` is a number with units + def mod(other) + if other.is_a?(Sass::Script::Value::Number) || + other.is_a?(Sass::Script::Value::Color) + piecewise(other, :%) + else + raise NoMethodError.new(nil, :mod) + end + end + + # Returns a string representation of the color. + # This is usually the color's hex value, + # but if the color has a name that's used instead. + # + # @return [String] The string representation + def to_s(opts = {}) + return smallest if options[:style] == :compressed + return representation if representation + + # IE10 doesn't properly support the color name "transparent", so we emit + # generated transparent colors as rgba(0, 0, 0, 0) in favor of that. See + # #1782. + return rgba_str if Number.basically_equal?(alpha, 0) + return name if name + alpha? ? rgba_str : hex_str + end + alias_method :to_sass, :to_s + + # Returns a string representation of the color. + # + # @return [String] The hex value + def inspect + alpha? ? rgba_str : hex_str + end + + # Returns the color's name, if it has one. + # + # @return [String, nil] + def name + COLOR_NAMES_REVERSE[rgba] + end + + private + + def smallest + small_explicit_str = alpha? ? rgba_str : hex_str.gsub(/^#(.)\1(.)\2(.)\3$/, '#\1\2\3') + [representation, COLOR_NAMES_REVERSE[rgba], small_explicit_str]. + compact.min_by {|str| str.size} + end + + def rgba_str + split = options[:style] == :compressed ? ',' : ', ' + "rgba(#{rgb.join(split)}#{split}#{Number.round(alpha)})" + end + + def hex_str + red, green, blue = rgb.map {|num| num.to_s(16).rjust(2, '0')} + "##{red}#{green}#{blue}" + end + + def operation_name(operation) + case operation + when :+ + "add" + when :- + "subtract" + when :* + "multiply" + when :/ + "divide" + when :% + "modulo" + end + end + + def piecewise(other, operation) + other_num = other.is_a? Number + if other_num && !other.unitless? + raise Sass::SyntaxError.new( + "Cannot #{operation_name(operation)} a number with units (#{other}) to a color (#{self})." + ) + end + + result = [] + (0...3).each do |i| + res = rgb[i].to_f.send(operation, other_num ? other.value : other.rgb[i]) + result[i] = [[res, 255].min, 0].max + end + + if !other_num && other.alpha != alpha + raise Sass::SyntaxError.new("Alpha channels must be equal: #{self} #{operation} #{other}") + end + + with(:red => result[0], :green => result[1], :blue => result[2]) + end + + def hsl_to_rgb! + return if @attrs[:red] && @attrs[:blue] && @attrs[:green] + + h = @attrs[:hue] / 360.0 + s = @attrs[:saturation] / 100.0 + l = @attrs[:lightness] / 100.0 + + # Algorithm from the CSS3 spec: http://www.w3.org/TR/css3-color/#hsl-color. + m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s + m1 = l * 2 - m2 + @attrs[:red], @attrs[:green], @attrs[:blue] = [ + hue_to_rgb(m1, m2, h + 1.0 / 3), + hue_to_rgb(m1, m2, h), + hue_to_rgb(m1, m2, h - 1.0 / 3) + ].map {|c| Sass::Util.round(c * 0xff)} + end + + def hue_to_rgb(m1, m2, h) + h += 1 if h < 0 + h -= 1 if h > 1 + return m1 + (m2 - m1) * h * 6 if h * 6 < 1 + return m2 if h * 2 < 1 + return m1 + (m2 - m1) * (2.0 / 3 - h) * 6 if h * 3 < 2 + m1 + end + + def rgb_to_hsl! + return if @attrs[:hue] && @attrs[:saturation] && @attrs[:lightness] + r, g, b = [:red, :green, :blue].map {|k| @attrs[k] / 255.0} + + # Algorithm from http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV + max = [r, g, b].max + min = [r, g, b].min + d = max - min + + h = + case max + when min; 0 + when r; 60 * (g - b) / d + when g; 60 * (b - r) / d + 120 + when b; 60 * (r - g) / d + 240 + end + + l = (max + min) / 2.0 + + s = + if max == min + 0 + elsif l < 0.5 + d / (2 * l) + else + d / (2 - 2 * l) + end + + @attrs[:hue] = h % 360 + @attrs[:saturation] = s * 100 + @attrs[:lightness] = l * 100 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/function.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/function.rb new file mode 100644 index 000000000000..f0f59a258a4f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/function.rb @@ -0,0 +1,19 @@ +module Sass::Script::Value + # A SassScript object representing a function. + class Function < Callable + # Constructs a Function value for use in SassScript. + # + # @param function [Sass::Callable] The callable to be used when the + # function is invoked. + def initialize(function) + unless function.type == "function" + raise ArgumentError.new("A callable of type function was expected.") + end + super + end + + def to_sass + %{get-function("#{value.name}")} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/helpers.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/helpers.rb new file mode 100644 index 000000000000..dcde48750ec4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/helpers.rb @@ -0,0 +1,298 @@ +module Sass::Script::Value + # Provides helper functions for creating sass values from within ruby methods. + # @since `3.3.0` + module Helpers + # Construct a Sass Boolean. + # + # @param value [Object] A ruby object that will be tested for truthiness. + # @return [Sass::Script::Value::Bool] whether the ruby value is truthy. + def bool(value) + Bool.new(value) + end + + # Construct a Sass Color from a hex color string. + # + # @param value [::String] A string representing a hex color. + # The leading hash ("#") is optional. + # @param alpha [::Number] The alpha channel. A number between 0 and 1. + # @return [Sass::Script::Value::Color] the color object + def hex_color(value, alpha = nil) + Color.from_hex(value, alpha) + end + + # Construct a Sass Color from hsl values. + # + # @param hue [::Number] The hue of the color in degrees. + # A non-negative number, usually less than 360. + # @param saturation [::Number] The saturation of the color. + # Must be between 0 and 100 inclusive. + # @param lightness [::Number] The lightness of the color. + # Must be between 0 and 100 inclusive. + # @param alpha [::Number] The alpha channel. A number between 0 and 1. + # + # @return [Sass::Script::Value::Color] the color object + def hsl_color(hue, saturation, lightness, alpha = nil) + attrs = {:hue => hue, :saturation => saturation, :lightness => lightness} + attrs[:alpha] = alpha if alpha + Color.new(attrs) + end + + # Construct a Sass Color from rgb values. + # + # @param red [::Number] The red component. Must be between 0 and 255 inclusive. + # @param green [::Number] The green component. Must be between 0 and 255 inclusive. + # @param blue [::Number] The blue component. Must be between 0 and 255 inclusive. + # @param alpha [::Number] The alpha channel. A number between 0 and 1. + # + # @return [Sass::Script::Value::Color] the color object + def rgb_color(red, green, blue, alpha = nil) + attrs = {:red => red, :green => green, :blue => blue} + attrs[:alpha] = alpha if alpha + Color.new(attrs) + end + + # Construct a Sass Number from a ruby number. + # + # @param number [::Number] A numeric value. + # @param unit_string [::String] A unit string of the form + # `numeral_unit1 * numeral_unit2 ... / denominator_unit1 * denominator_unit2 ...` + # this is the same format that is returned by + # {Sass::Script::Value::Number#unit_str the `unit_str` method} + # + # @see Sass::Script::Value::Number#unit_str + # + # @return [Sass::Script::Value::Number] The sass number representing the given ruby number. + def number(number, unit_string = nil) + Number.new(number, *parse_unit_string(unit_string)) + end + + # @overload list(*elements, separator:, bracketed: false) + # Create a space-separated list from the arguments given. + # @param elements [Array<Sass::Script::Value::Base>] Each argument will be a list element. + # @param separator [Symbol] Either :space or :comma. + # @param bracketed [Boolean] Whether the list uses square brackets. + # @return [Sass::Script::Value::List] The space separated list. + # + # @overload list(array, separator:, bracketed: false) + # Create a space-separated list from the array given. + # @param array [Array<Sass::Script::Value::Base>] A ruby array of Sass values + # to make into a list. + # @param separator [Symbol] Either :space or :comma. + # @param bracketed [Boolean] Whether the list uses square brackets. + # @return [Sass::Script::Value::List] The space separated list. + def list(*elements, separator: nil, bracketed: false) + # Support passing separator as the last value in elements for + # backwards-compatibility. + if separator.nil? + if elements.last.is_a?(Symbol) + separator = elements.pop + else + raise ArgumentError.new("A separator of :space or :comma must be specified.") + end + end + + if elements.size == 1 && elements.first.is_a?(Array) + elements = elements.first + end + Sass::Script::Value::List.new(elements, separator: separator, bracketed: bracketed) + end + + # Construct a Sass map. + # + # @param hash [Hash<Sass::Script::Value::Base, + # Sass::Script::Value::Base>] A Ruby map to convert to a Sass map. + # @return [Sass::Script::Value::Map] The map. + def map(hash) + Map.new(hash) + end + + # Create a sass null value. + # + # @return [Sass::Script::Value::Null] + def null + Sass::Script::Value::Null.new + end + + # Create a quoted string. + # + # @param str [::String] A ruby string. + # @return [Sass::Script::Value::String] A quoted string. + def quoted_string(str) + Sass::Script::String.new(str, :string) + end + + # Create an unquoted string. + # + # @param str [::String] A ruby string. + # @return [Sass::Script::Value::String] An unquoted string. + def unquoted_string(str) + Sass::Script::String.new(str, :identifier) + end + alias_method :identifier, :unquoted_string + + # Parses a user-provided selector. + # + # @param value [Sass::Script::Value::String, Sass::Script::Value::List] + # The selector to parse. This can be either a string, a list of + # strings, or a list of lists of strings as returned by `&`. + # @param name [Symbol, nil] + # If provided, the name of the selector argument. This is used + # for error reporting. + # @param allow_parent_ref [Boolean] + # Whether the parsed selector should allow parent references. + # @return [Sass::Selector::CommaSequence] The parsed selector. + # @throw [ArgumentError] if the parse failed for any reason. + def parse_selector(value, name = nil, allow_parent_ref = false) + str = normalize_selector(value, name) + begin + Sass::SCSS::StaticParser.new(str, nil, nil, 1, 1, allow_parent_ref).parse_selector + rescue Sass::SyntaxError => e + err = "#{value.inspect} is not a valid selector: #{e}" + err = "$#{name.to_s.tr('_', '-')}: #{err}" if name + raise ArgumentError.new(err) + end + end + + # Parses a user-provided complex selector. + # + # A complex selector can contain combinators but cannot contain commas. + # + # @param value [Sass::Script::Value::String, Sass::Script::Value::List] + # The selector to parse. This can be either a string or a list of + # strings. + # @param name [Symbol, nil] + # If provided, the name of the selector argument. This is used + # for error reporting. + # @param allow_parent_ref [Boolean] + # Whether the parsed selector should allow parent references. + # @return [Sass::Selector::Sequence] The parsed selector. + # @throw [ArgumentError] if the parse failed for any reason. + def parse_complex_selector(value, name = nil, allow_parent_ref = false) + selector = parse_selector(value, name, allow_parent_ref) + return seq if selector.members.length == 1 + + err = "#{value.inspect} is not a complex selector" + err = "$#{name.to_s.tr('_', '-')}: #{err}" if name + raise ArgumentError.new(err) + end + + # Parses a user-provided compound selector. + # + # A compound selector cannot contain combinators or commas. + # + # @param value [Sass::Script::Value::String] The selector to parse. + # @param name [Symbol, nil] + # If provided, the name of the selector argument. This is used + # for error reporting. + # @param allow_parent_ref [Boolean] + # Whether the parsed selector should allow parent references. + # @return [Sass::Selector::SimpleSequence] The parsed selector. + # @throw [ArgumentError] if the parse failed for any reason. + def parse_compound_selector(value, name = nil, allow_parent_ref = false) + assert_type value, :String, name + selector = parse_selector(value, name, allow_parent_ref) + seq = selector.members.first + sseq = seq.members.first + if selector.members.length == 1 && seq.members.length == 1 && + sseq.is_a?(Sass::Selector::SimpleSequence) + return sseq + end + + err = "#{value.inspect} is not a compound selector" + err = "$#{name.to_s.tr('_', '-')}: #{err}" if name + raise ArgumentError.new(err) + end + + # Returns true when the literal is a string containing a calc(). + # + # Use \{#special_number?} in preference to this. + # + # @param literal [Sass::Script::Value::Base] The value to check + # @return Boolean + def calc?(literal) + literal.is_a?(Sass::Script::Value::String) && literal.value =~ /calc\(/ + end + + # Returns true when the literal is a string containing a var(). + # + # @param literal [Sass::Script::Value::Base] The value to check + # @return Boolean + def var?(literal) + literal.is_a?(Sass::Script::Value::String) && literal.value =~ /var\(/ + end + + # Returns whether the literal is a special CSS value that may evaluate to a + # number, such as `calc()` or `var()`. + # + # @param literal [Sass::Script::Value::Base] The value to check + # @return Boolean + def special_number?(literal) + literal.is_a?(Sass::Script::Value::String) && literal.value =~ /(calc|var)\(/ + end + + private + + # Converts a user-provided selector into string form or throws an + # ArgumentError if it's in an invalid format. + def normalize_selector(value, name) + if (str = selector_to_str(value)) + return str + end + + err = "#{value.inspect} is not a valid selector: it must be a string,\n" + + "a list of strings, or a list of lists of strings" + err = "$#{name.to_s.tr('_', '-')}: #{err}" if name + raise ArgumentError.new(err) + end + + # Converts a user-provided selector into string form or returns + # `nil` if it's in an invalid format. + def selector_to_str(value) + return value.value if value.is_a?(Sass::Script::String) + return unless value.is_a?(Sass::Script::List) + + if value.separator == :comma + return value.to_a.map do |complex| + next complex.value if complex.is_a?(Sass::Script::String) + return unless complex.is_a?(Sass::Script::List) && complex.separator == :space + return unless (str = selector_to_str(complex)) + str + end.join(', ') + end + + value.to_a.map do |compound| + return unless compound.is_a?(Sass::Script::String) + compound.value + end.join(' ') + end + + # @private + VALID_UNIT = /#{Sass::SCSS::RX::NMSTART}#{Sass::SCSS::RX::NMCHAR}|%*/ + + # @example + # parse_unit_string("em*px/in*%") # => [["em", "px], ["in", "%"]] + # + # @param unit_string [String] A string adhering to the output of a number with complex + # units. E.g. "em*px/in*%" + # @return [Array<Array<String>>] A list of numerator units and a list of denominator units. + def parse_unit_string(unit_string) + denominator_units = numerator_units = Sass::Script::Value::Number::NO_UNITS + return numerator_units, denominator_units unless unit_string && unit_string.length > 0 + num_over_denominator = unit_string.split(%r{ */ *}) + unless (1..2).include?(num_over_denominator.size) + raise ArgumentError.new("Malformed unit string: #{unit_string}") + end + numerator_units = num_over_denominator[0].split(/ *\* */) + denominator_units = (num_over_denominator[1] || "").split(/ *\* */) + [[numerator_units, "numerator"], [denominator_units, "denominator"]].each do |units, name| + if unit_string =~ %r{/} && units.size == 0 + raise ArgumentError.new("Malformed unit string: #{unit_string}") + end + if units.any? {|unit| unit !~ VALID_UNIT} + raise ArgumentError.new("Malformed #{name} in unit string: #{unit_string}") + end + end + [numerator_units, denominator_units] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/list.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/list.rb new file mode 100644 index 000000000000..689fdd0e0d33 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/list.rb @@ -0,0 +1,134 @@ +module Sass::Script::Value + # A SassScript object representing a CSS list. + # This includes both comma-separated lists and space-separated lists. + class List < Base + # The Ruby array containing the contents of the list. + # + # @return [Array<Value>] + attr_reader :value + alias_method :to_a, :value + + # The operator separating the values of the list. + # Either `:comma` or `:space`. + # + # @return [Symbol] + attr_reader :separator + + # Whether the list is surrounded by square brackets. + # + # @return [Boolean] + attr_reader :bracketed + + # Creates a new list. + # + # @param value [Array<Value>] See \{#value} + # @param separator [Symbol] See \{#separator} + # @param bracketed [Boolean] See \{#bracketed} + def initialize(value, separator: nil, bracketed: false) + super(value) + @separator = separator + @bracketed = bracketed + end + + # @see Value#options= + def options=(options) + super + value.each {|v| v.options = options} + end + + # @see Value#eq + def eq(other) + Sass::Script::Value::Bool.new( + other.is_a?(List) && value == other.value && + separator == other.separator && bracketed == other.bracketed) + end + + def hash + @hash ||= [value, separator, bracketed].hash + end + + # @see Value#to_s + def to_s(opts = {}) + if !bracketed && value.empty? + raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.") + end + + members = value. + reject {|e| e.is_a?(Null) || e.is_a?(List) && e.value.empty?}. + map {|e| e.to_s(opts)} + + contents = members.join(sep_str) + bracketed ? "[#{contents}]" : contents + end + + # @see Value#to_sass + def to_sass(opts = {}) + return bracketed ? "[]" : "()" if value.empty? + members = value.map do |v| + if element_needs_parens?(v) + "(#{v.to_sass(opts)})" + else + v.to_sass(opts) + end + end + + if separator == :comma && members.length == 1 + return "#{bracketed ? '[' : '('}#{members.first},#{bracketed ? ']' : ')'}" + end + + contents = members.join(sep_str(nil)) + bracketed ? "[#{contents}]" : contents + end + + # @see Value#to_h + def to_h + return {} if value.empty? + super + end + + # @see Value#inspect + def inspect + (bracketed ? '[' : '(') + + value.map {|e| e.inspect}.join(sep_str(nil)) + + (bracketed ? ']' : ')') + end + + # Asserts an index is within the list. + # + # @private + # + # @param list [Sass::Script::Value::List] The list for which the index should be checked. + # @param n [Sass::Script::Value::Number] The index being checked. + def self.assert_valid_index(list, n) + if !n.int? || n.to_i == 0 + raise ArgumentError.new("List index #{n} must be a non-zero integer") + elsif list.to_a.size == 0 + raise ArgumentError.new("List index is #{n} but list has no items") + elsif n.to_i.abs > (size = list.to_a.size) + raise ArgumentError.new( + "List index is #{n} but list is only #{size} item#{'s' if size != 1} long") + end + end + + private + + def element_needs_parens?(element) + if element.is_a?(List) + return false if element.value.length < 2 + return false if element.bracketed + precedence = Sass::Script::Parser.precedence_of(separator || :space) + return Sass::Script::Parser.precedence_of(element.separator || :space) <= precedence + end + + return false unless separator == :space + return false unless element.is_a?(Sass::Script::Tree::UnaryOperation) + element.operator == :minus || element.operator == :plus + end + + def sep_str(opts = options) + return ' ' if separator == :space + return ',' if opts && opts[:style] == :compressed + ', ' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/map.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/map.rb new file mode 100644 index 000000000000..2d1c6a3642ac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/map.rb @@ -0,0 +1,70 @@ +module Sass::Script::Value + # A SassScript object representing a map from keys to values. Both keys and + # values can be any SassScript object. + class Map < Base + # The Ruby hash containing the contents of this map. + # + # @return [Hash<Node, Node>] + attr_reader :value + alias_method :to_h, :value + + # Creates a new map. + # + # @param hash [Hash<Node, Node>] + def initialize(hash) + super(hash) + end + + # @see Value#options= + def options=(options) + super + value.each do |k, v| + k.options = options + v.options = options + end + end + + # @see Value#separator + def separator + :comma unless value.empty? + end + + # @see Value#to_a + def to_a + value.map do |k, v| + list = List.new([k, v], separator: :space) + list.options = options + list + end + end + + # @see Value#eq + def eq(other) + Bool.new(other.is_a?(Map) && value == other.value) + end + + def hash + @hash ||= value.hash + end + + # @see Value#to_s + def to_s(opts = {}) + raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.") + end + + def to_sass(opts = {}) + return "()" if value.empty? + + to_sass = lambda do |value| + if value.is_a?(List) && value.separator == :comma + "(#{value.to_sass(opts)})" + else + value.to_sass(opts) + end + end + + "(#{value.map {|(k, v)| "#{to_sass[k]}: #{to_sass[v]}"}.join(', ')})" + end + alias_method :inspect, :to_sass + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/null.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/null.rb new file mode 100644 index 000000000000..f6d573b7d77e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/null.rb @@ -0,0 +1,44 @@ +module Sass::Script::Value + # A SassScript object representing a null value. + class Null < Base + # The null value in SassScript. + # + # This is assigned before new is overridden below so that we use the default implementation. + NULL = new(nil) + + # We override object creation so that users of the core API + # will not need to know that null is a specific constant. + # + # @private + # @return [Null] the {NULL} constant. + def self.new + NULL + end + + # @return [Boolean] `false` (the Ruby boolean value) + def to_bool + false + end + + # @return [Boolean] `true` + def null? + true + end + + # @return [String] '' (An empty string) + def to_s(opts = {}) + '' + end + + def to_sass(opts = {}) + 'null' + end + + # Returns a string representing a null value. + # + # @return [String] + def inspect + 'null' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/number.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/number.rb new file mode 100644 index 000000000000..9c2139369fbe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/number.rb @@ -0,0 +1,564 @@ +module Sass::Script::Value + # A SassScript object representing a number. + # SassScript numbers can have decimal values, + # and can also have units. + # For example, `12`, `1px`, and `10.45em` + # are all valid values. + # + # Numbers can also have more complex units, such as `1px*em/in`. + # These cannot be inputted directly in Sass code at the moment. + class Number < Base + # The Ruby value of the number. + # + # @return [Numeric] + attr_reader :value + + # A list of units in the numerator of the number. + # For example, `1px*em/in*cm` would return `["px", "em"]` + # @return [Array<String>] + attr_reader :numerator_units + + # A list of units in the denominator of the number. + # For example, `1px*em/in*cm` would return `["in", "cm"]` + # @return [Array<String>] + attr_reader :denominator_units + + # The original representation of this number. + # For example, although the result of `1px/2px` is `0.5`, + # the value of `#original` is `"1px/2px"`. + # + # This is only non-nil when the original value should be used as the CSS value, + # as in `font: 1px/2px`. + # + # @return [Boolean, nil] + attr_accessor :original + + def self.precision + Thread.current[:sass_numeric_precision] || Thread.main[:sass_numeric_precision] || 10 + end + + # Sets the number of digits of precision + # For example, if this is `3`, + # `3.1415926` will be printed as `3.142`. + # The numeric precision is stored as a thread local for thread safety reasons. + # To set for all threads, be sure to set the precision on the main thread. + def self.precision=(digits) + Thread.current[:sass_numeric_precision] = digits.round + Thread.current[:sass_numeric_precision_factor] = nil + Thread.current[:sass_numeric_epsilon] = nil + end + + # the precision factor used in numeric output + # it is derived from the `precision` method. + def self.precision_factor + Thread.current[:sass_numeric_precision_factor] ||= 10.0**precision + end + + # Used in checking equality of floating point numbers. Any + # numbers within an `epsilon` of each other are considered functionally equal. + # The value for epsilon is one tenth of the current numeric precision. + def self.epsilon + Thread.current[:sass_numeric_epsilon] ||= 1 / (precision_factor * 10) + end + + # Used so we don't allocate two new arrays for each new number. + NO_UNITS = [] + + # @param value [Numeric] The value of the number + # @param numerator_units [::String, Array<::String>] See \{#numerator\_units} + # @param denominator_units [::String, Array<::String>] See \{#denominator\_units} + def initialize(value, numerator_units = NO_UNITS, denominator_units = NO_UNITS) + numerator_units = [numerator_units] if numerator_units.is_a?(::String) + denominator_units = [denominator_units] if denominator_units.is_a?(::String) + super(value) + @numerator_units = numerator_units + @denominator_units = denominator_units + @options = nil + normalize! + end + + # The SassScript `+` operation. + # Its functionality depends on the type of its argument: + # + # {Number} + # : Adds the two numbers together, converting units if possible. + # + # {Color} + # : Adds this number to each of the RGB color channels. + # + # {Value} + # : See {Value::Base#plus}. + # + # @param other [Value] The right-hand side of the operator + # @return [Value] The result of the operation + # @raise [Sass::UnitConversionError] if `other` is a number with incompatible units + def plus(other) + if other.is_a? Number + operate(other, :+) + elsif other.is_a?(Color) + other.plus(self) + else + super + end + end + + # The SassScript binary `-` operation (e.g. `$a - $b`). + # Its functionality depends on the type of its argument: + # + # {Number} + # : Subtracts this number from the other, converting units if possible. + # + # {Value} + # : See {Value::Base#minus}. + # + # @param other [Value] The right-hand side of the operator + # @return [Value] The result of the operation + # @raise [Sass::UnitConversionError] if `other` is a number with incompatible units + def minus(other) + if other.is_a? Number + operate(other, :-) + else + super + end + end + + # The SassScript unary `+` operation (e.g. `+$a`). + # + # @return [Number] The value of this number + def unary_plus + self + end + + # The SassScript unary `-` operation (e.g. `-$a`). + # + # @return [Number] The negative value of this number + def unary_minus + Number.new(-value, @numerator_units, @denominator_units) + end + + # The SassScript `*` operation. + # Its functionality depends on the type of its argument: + # + # {Number} + # : Multiplies the two numbers together, converting units appropriately. + # + # {Color} + # : Multiplies each of the RGB color channels by this number. + # + # @param other [Number, Color] The right-hand side of the operator + # @return [Number, Color] The result of the operation + # @raise [NoMethodError] if `other` is an invalid type + def times(other) + if other.is_a? Number + operate(other, :*) + elsif other.is_a? Color + other.times(self) + else + raise NoMethodError.new(nil, :times) + end + end + + # The SassScript `/` operation. + # Its functionality depends on the type of its argument: + # + # {Number} + # : Divides this number by the other, converting units appropriately. + # + # {Value} + # : See {Value::Base#div}. + # + # @param other [Value] The right-hand side of the operator + # @return [Value] The result of the operation + def div(other) + if other.is_a? Number + res = operate(other, :/) + if original && other.original + res.original = "#{original}/#{other.original}" + end + res + else + super + end + end + + # The SassScript `%` operation. + # + # @param other [Number] The right-hand side of the operator + # @return [Number] This number modulo the other + # @raise [NoMethodError] if `other` is an invalid type + # @raise [Sass::UnitConversionError] if `other` has incompatible units + def mod(other) + if other.is_a?(Number) + return Number.new(Float::NAN) if other.value == 0 + operate(other, :%) + else + raise NoMethodError.new(nil, :mod) + end + end + + # The SassScript `==` operation. + # + # @param other [Value] The right-hand side of the operator + # @return [Boolean] Whether this number is equal to the other object + def eq(other) + return Bool::FALSE unless other.is_a?(Sass::Script::Value::Number) + this = self + begin + if unitless? + this = this.coerce(other.numerator_units, other.denominator_units) + else + other = other.coerce(@numerator_units, @denominator_units) + end + rescue Sass::UnitConversionError + return Bool::FALSE + end + Bool.new(basically_equal?(this.value, other.value)) + end + + def hash + [value, numerator_units, denominator_units].hash + end + + # Hash-equality works differently than `==` equality for numbers. + # Hash-equality must be transitive, so it just compares the exact value, + # numerator units, and denominator units. + def eql?(other) + basically_equal?(value, other.value) && numerator_units == other.numerator_units && + denominator_units == other.denominator_units + end + + # The SassScript `>` operation. + # + # @param other [Number] The right-hand side of the operator + # @return [Boolean] Whether this number is greater than the other + # @raise [NoMethodError] if `other` is an invalid type + def gt(other) + raise NoMethodError.new(nil, :gt) unless other.is_a?(Number) + operate(other, :>) + end + + # The SassScript `>=` operation. + # + # @param other [Number] The right-hand side of the operator + # @return [Boolean] Whether this number is greater than or equal to the other + # @raise [NoMethodError] if `other` is an invalid type + def gte(other) + raise NoMethodError.new(nil, :gte) unless other.is_a?(Number) + operate(other, :>=) + end + + # The SassScript `<` operation. + # + # @param other [Number] The right-hand side of the operator + # @return [Boolean] Whether this number is less than the other + # @raise [NoMethodError] if `other` is an invalid type + def lt(other) + raise NoMethodError.new(nil, :lt) unless other.is_a?(Number) + operate(other, :<) + end + + # The SassScript `<=` operation. + # + # @param other [Number] The right-hand side of the operator + # @return [Boolean] Whether this number is less than or equal to the other + # @raise [NoMethodError] if `other` is an invalid type + def lte(other) + raise NoMethodError.new(nil, :lte) unless other.is_a?(Number) + operate(other, :<=) + end + + # @return [String] The CSS representation of this number + # @raise [Sass::SyntaxError] if this number has units that can't be used in CSS + # (e.g. `px*in`) + def to_s(opts = {}) + return original if original + raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.") unless legal_units? + inspect + end + + # Returns a readable representation of this number. + # + # This representation is valid CSS (and valid SassScript) + # as long as there is only one unit. + # + # @return [String] The representation + def inspect(opts = {}) + return original if original + + value = self.class.round(self.value) + str = value.to_s + + # Ruby will occasionally print in scientific notation if the number is + # small enough. That's technically valid CSS, but it's not well-supported + # and confusing. + str = ("%0.#{self.class.precision}f" % value).gsub(/0*$/, '') if str.include?('e') + + # Sometimes numeric formatting will result in a decimal number with a trailing zero (x.0) + if str =~ /(.*)\.0$/ + str = $1 + end + + # We omit a leading zero before the decimal point in compressed mode. + if @options && options[:style] == :compressed + str.sub!(/^(-)?0\./, '\1.') + end + + unitless? ? str : "#{str}#{unit_str}" + end + alias_method :to_sass, :inspect + + # @return [Integer] The integer value of the number + # @raise [Sass::SyntaxError] if the number isn't an integer + def to_i + super unless int? + value.to_i + end + + # @return [Boolean] Whether or not this number is an integer. + def int? + basically_equal?(value % 1, 0.0) + end + + # @return [Boolean] Whether or not this number has no units. + def unitless? + @numerator_units.empty? && @denominator_units.empty? + end + + # Checks whether the number has the numerator unit specified. + # + # @example + # number = Sass::Script::Value::Number.new(10, "px") + # number.is_unit?("px") => true + # number.is_unit?(nil) => false + # + # @param unit [::String, nil] The unit the number should have or nil if the number + # should be unitless. + # @see Number#unitless? The unitless? method may be more readable. + def is_unit?(unit) + if unit + denominator_units.size == 0 && numerator_units.size == 1 && numerator_units.first == unit + else + unitless? + end + end + + # @return [Boolean] Whether or not this number has units that can be represented in CSS + # (that is, zero or one \{#numerator\_units}). + def legal_units? + (@numerator_units.empty? || @numerator_units.size == 1) && @denominator_units.empty? + end + + # Returns this number converted to other units. + # The conversion takes into account the relationship between e.g. mm and cm, + # as well as between e.g. in and cm. + # + # If this number has no units, it will simply return itself + # with the given units. + # + # An incompatible coercion, e.g. between px and cm, will raise an error. + # + # @param num_units [Array<String>] The numerator units to coerce this number into. + # See {\#numerator\_units} + # @param den_units [Array<String>] The denominator units to coerce this number into. + # See {\#denominator\_units} + # @return [Number] The number with the new units + # @raise [Sass::UnitConversionError] if the given units are incompatible with the number's + # current units + def coerce(num_units, den_units) + Number.new(if unitless? + value + else + value * coercion_factor(@numerator_units, num_units) / + coercion_factor(@denominator_units, den_units) + end, num_units, den_units) + end + + # @param other [Number] A number to decide if it can be compared with this number. + # @return [Boolean] Whether or not this number can be compared with the other. + def comparable_to?(other) + operate(other, :+) + true + rescue Sass::UnitConversionError + false + end + + # Returns a human readable representation of the units in this number. + # For complex units this takes the form of: + # numerator_unit1 * numerator_unit2 / denominator_unit1 * denominator_unit2 + # @return [String] a string that represents the units in this number + def unit_str + rv = @numerator_units.sort.join("*") + if @denominator_units.any? + rv << "/" + rv << @denominator_units.sort.join("*") + end + rv + end + + private + + # @private + # @see Sass::Script::Number.basically_equal? + def basically_equal?(num1, num2) + self.class.basically_equal?(num1, num2) + end + + # Checks whether two numbers are within an epsilon of each other. + # @return [Boolean] + def self.basically_equal?(num1, num2) + (num1 - num2).abs < epsilon + end + + # @private + def self.round(num) + if num.is_a?(Float) && (num.infinite? || num.nan?) + num + elsif basically_equal?(num % 1, 0.0) + num.round + else + ((num * precision_factor).round / precision_factor).to_f + end + end + + OPERATIONS = [:+, :-, :<=, :<, :>, :>=, :%] + + def operate(other, operation) + this = self + if OPERATIONS.include?(operation) + if unitless? + this = this.coerce(other.numerator_units, other.denominator_units) + else + other = other.coerce(@numerator_units, @denominator_units) + end + end + # avoid integer division + value = :/ == operation ? this.value.to_f : this.value + result = value.send(operation, other.value) + + if result.is_a?(Numeric) + Number.new(result, *compute_units(this, other, operation)) + else # Boolean op + Bool.new(result) + end + end + + def coercion_factor(from_units, to_units) + # get a list of unmatched units + from_units, to_units = sans_common_units(from_units, to_units) + + if from_units.size != to_units.size || !convertable?(from_units | to_units) + raise Sass::UnitConversionError.new( + "Incompatible units: '#{from_units.join('*')}' and '#{to_units.join('*')}'.") + end + + from_units.zip(to_units).inject(1) {|m, p| m * conversion_factor(p[0], p[1])} + end + + def compute_units(this, other, operation) + case operation + when :* + [this.numerator_units + other.numerator_units, + this.denominator_units + other.denominator_units] + when :/ + [this.numerator_units + other.denominator_units, + this.denominator_units + other.numerator_units] + else + [this.numerator_units, this.denominator_units] + end + end + + def normalize! + return if unitless? + @numerator_units, @denominator_units = + sans_common_units(@numerator_units, @denominator_units) + + @denominator_units.each_with_index do |d, i| + next unless convertable?(d) && (u = @numerator_units.find {|n| convertable?([n, d])}) + @value /= conversion_factor(d, u) + @denominator_units.delete_at(i) + @numerator_units.delete_at(@numerator_units.index(u)) + end + end + + # This is the source data for all the unit logic. It's pre-processed to make + # it efficient to figure out whether a set of units is mutually compatible + # and what the conversion ratio is between two units. + # + # These come from http://www.w3.org/TR/2012/WD-css3-values-20120308/. + relative_sizes = [ + { + 'in' => Rational(1), + 'cm' => Rational(1, 2.54), + 'pc' => Rational(1, 6), + 'mm' => Rational(1, 25.4), + 'q' => Rational(1, 101.6), + 'pt' => Rational(1, 72), + 'px' => Rational(1, 96) + }, + { + 'deg' => Rational(1, 360), + 'grad' => Rational(1, 400), + 'rad' => Rational(1, 2 * Math::PI), + 'turn' => Rational(1) + }, + { + 's' => Rational(1), + 'ms' => Rational(1, 1000) + }, + { + 'Hz' => Rational(1), + 'kHz' => Rational(1000) + }, + { + 'dpi' => Rational(1), + 'dpcm' => Rational(254, 100), + 'dppx' => Rational(96) + } + ] + + # A hash from each known unit to the set of units that it's mutually + # convertible with. + MUTUALLY_CONVERTIBLE = {} + relative_sizes.map do |values| + set = values.keys.to_set + values.keys.each {|name| MUTUALLY_CONVERTIBLE[name] = set} + end + + # A two-dimensional hash from two units to the conversion ratio between + # them. Multiply `X` by `CONVERSION_TABLE[X][Y]` to convert it to `Y`. + CONVERSION_TABLE = {} + relative_sizes.each do |values| + values.each do |(name1, value1)| + CONVERSION_TABLE[name1] ||= {} + values.each do |(name2, value2)| + value = value1 / value2 + CONVERSION_TABLE[name1][name2] = value.denominator == 1 ? value.to_i : value.to_f + end + end + end + + def conversion_factor(from_unit, to_unit) + CONVERSION_TABLE[from_unit][to_unit] + end + + def convertable?(units) + units = Array(units).to_set + return true if units.empty? + return false unless (mutually_convertible = MUTUALLY_CONVERTIBLE[units.first]) + units.subset?(mutually_convertible) + end + + def sans_common_units(units1, units2) + units2 = units2.dup + # Can't just use -, because we want px*px to coerce properly to px*mm + units1 = units1.map do |u| + j = units2.index(u) + next u unless j + units2.delete_at(j) + nil + end + units1.compact! + return units1, units2 + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/string.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/string.rb new file mode 100644 index 000000000000..9c9b088f356f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/script/value/string.rb @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +module Sass::Script::Value + # A SassScript object representing a CSS string *or* a CSS identifier. + class String < Base + @@interpolation_deprecation = Sass::Deprecation.new + + # The Ruby value of the string. + # + # @return [String] + attr_reader :value + + # Whether this is a CSS string or a CSS identifier. + # The difference is that strings are written with double-quotes, + # while identifiers aren't. + # + # @return [Symbol] `:string` or `:identifier` + attr_reader :type + + def self.value(contents) + contents.gsub("\\\n", "").gsub(/\\(?:([0-9a-fA-F]{1,6})\s?|(.))/) do + next $2 if $2 + # Handle unicode escapes as per CSS Syntax Level 3 section 4.3.8. + code_point = $1.to_i(16) + if code_point == 0 || code_point > 0x10FFFF || + (code_point >= 0xD800 && code_point <= 0xDFFF) + '�' + else + [code_point].pack("U") + end + end + end + + # Returns the quoted string representation of `contents`. + # + # @options opts :quote [String] + # The preferred quote style for quoted strings. If `:none`, strings are + # always emitted unquoted. If `nil`, quoting is determined automatically. + # @options opts :sass [String] + # Whether to quote strings for Sass source, as opposed to CSS. Defaults to `false`. + def self.quote(contents, opts = {}) + quote = opts[:quote] + + # Short-circuit if there are no characters that need quoting. + unless contents =~ /[\n\\"']|\#\{/ + quote ||= '"' + return "#{quote}#{contents}#{quote}" + end + + if quote.nil? + if contents.include?('"') + if contents.include?("'") + quote = '"' + else + quote = "'" + end + else + quote = '"' + end + end + + # Replace single backslashes with multiples. + contents = contents.gsub("\\", "\\\\\\\\") + + # Escape interpolation. + contents = contents.gsub('#{', "\\\#{") if opts[:sass] + + if quote == '"' + contents = contents.gsub('"', "\\\"") + else + contents = contents.gsub("'", "\\'") + end + + contents = contents.gsub(/\n(?![a-fA-F0-9\s])/, "\\a").gsub("\n", "\\a ") + "#{quote}#{contents}#{quote}" + end + + # Creates a new string. + # + # @param value [String] See \{#value} + # @param type [Symbol] See \{#type} + # @param deprecated_interp_equivalent [String?] + # If this was created via a potentially-deprecated string interpolation, + # this is the replacement expression that should be suggested to the user. + def initialize(value, type = :identifier, deprecated_interp_equivalent = nil) + super(value) + @type = type + @deprecated_interp_equivalent = deprecated_interp_equivalent + end + + # @see Value#plus + def plus(other) + other_value = if other.is_a?(Sass::Script::Value::String) + other.value + else + other.to_s(:quote => :none) + end + Sass::Script::Value::String.new(value + other_value, type) + end + + # @see Value#to_s + def to_s(opts = {}) + return @value.gsub(/\n\s*/, ' ') if opts[:quote] == :none || @type == :identifier + String.quote(value, opts) + end + + # @see Value#to_sass + def to_sass(opts = {}) + to_s(opts.merge(:sass => true)) + end + + def separator + check_deprecated_interp + super + end + + def to_a + check_deprecated_interp + super + end + + # Prints a warning if this string was created using potentially-deprecated + # interpolation. + def check_deprecated_interp + return unless @deprecated_interp_equivalent + + @@interpolation_deprecation.warn(source_range.file, source_range.start_pos.line, <<WARNING) +\#{} interpolation near operators will be simplified in a future version of Sass. +To preserve the current behavior, use quotes: + + #{@deprecated_interp_equivalent} +WARNING + end + + def inspect + String.quote(value) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss.rb new file mode 100644 index 000000000000..f06ecdb35121 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss.rb @@ -0,0 +1,14 @@ +require 'sass/scss/rx' +require 'sass/scss/parser' +require 'sass/scss/static_parser' +require 'sass/scss/css_parser' + +module Sass + # SCSS is the CSS syntax for Sass. + # It parses into the same syntax tree as Sass, + # and generates the same sort of output CSS. + # + # This module contains code for the parsing of SCSS. + # The evaluation is handled by the broader {Sass} module. + module SCSS; end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/css_parser.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/css_parser.rb new file mode 100644 index 000000000000..69890ff8648a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/css_parser.rb @@ -0,0 +1,61 @@ +require 'sass/script/css_parser' + +module Sass + module SCSS + # This is a subclass of {Parser} which only parses plain CSS. + # It doesn't support any Sass extensions, such as interpolation, + # parent references, nested selectors, and so forth. + # It does support all the same CSS hacks as the SCSS parser, though. + class CssParser < StaticParser + private + + def placeholder_selector; nil; end + def parent_selector; nil; end + def interpolation(warn_for_color = false); nil; end + def use_css_import?; true; end + + def block_contents(node, context) + if node.is_a?(Sass::Tree::DirectiveNode) && node.normalized_name == '@keyframes' + context = :keyframes + end + super(node, context) + end + + def block_child(context) + case context + when :ruleset + declaration + when :stylesheet + directive || ruleset + when :directive + directive || declaration_or_ruleset + when :keyframes + keyframes_ruleset + end + end + + def nested_properties!(node) + expected('expression (e.g. 1px, bold)') + end + + def ruleset + start_pos = source_position + return unless (selector = selector_comma_sequence) + block(node(Sass::Tree::RuleNode.new(selector, range(start_pos)), start_pos), :ruleset) + end + + def keyframes_ruleset + start_pos = source_position + return unless (selector = keyframes_selector) + block( + node( + Sass::Tree::KeyframeRuleNode.new( + Sass::Util.strip_except_escapes(selector)), + start_pos), + :ruleset) + end + + @sass_script_parser = Sass::Script::CssParser + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/parser.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/parser.rb new file mode 100644 index 000000000000..55d1e1b73dac --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/parser.rb @@ -0,0 +1,1343 @@ +# -*- coding: utf-8 -*- +require 'set' + +module Sass + module SCSS + # The parser for SCSS. + # It parses a string of code into a tree of {Sass::Tree::Node}s. + class Parser + # Expose for the SASS parser. + attr_accessor :offset + + # @param str [String, StringScanner] The source document to parse. + # Note that `Parser` *won't* raise a nice error message if this isn't properly parsed; + # for that, you should use the higher-level {Sass::Engine} or {Sass::CSS}. + # @param filename [String] The name of the file being parsed. Used for + # warnings and source maps. + # @param importer [Sass::Importers::Base] The importer used to import the + # file being parsed. Used for source maps. + # @param line [Integer] The 1-based line on which the source string appeared, + # if it's part of another document. + # @param offset [Integer] The 1-based character (not byte) offset in the line on + # which the source string starts. Used for error reporting and sourcemap + # building. + def initialize(str, filename, importer, line = 1, offset = 1) + @template = str + @filename = filename + @importer = importer + @line = line + @offset = offset + @strs = [] + @expected = nil + @throw_error = false + end + + # Parses an SCSS document. + # + # @return [Sass::Tree::RootNode] The root node of the document tree + # @raise [Sass::SyntaxError] if there's a syntax error in the document + def parse + init_scanner! + root = stylesheet + expected("selector or at-rule") unless root && @scanner.eos? + root + end + + # Parses an identifier with interpolation. + # Note that this won't assert that the identifier takes up the entire input string; + # it's meant to be used with `StringScanner`s as part of other parsers. + # + # @return [Array<String, Sass::Script::Tree::Node>, nil] + # The interpolated identifier, or nil if none could be parsed + def parse_interp_ident + init_scanner! + interp_ident + end + + # Parses a supports clause for an @import directive + def parse_supports_clause + init_scanner! + ss + clause = supports_clause + ss + clause + end + + # Parses a media query list. + # + # @return [Sass::Media::QueryList] The parsed query list + # @raise [Sass::SyntaxError] if there's a syntax error in the query list, + # or if it doesn't take up the entire input string. + def parse_media_query_list + init_scanner! + ql = media_query_list + expected("media query list") unless ql && @scanner.eos? + ql + end + + # Parses an at-root query. + # + # @return [Array<String, Sass::Script;:Tree::Node>] The interpolated query. + # @raise [Sass::SyntaxError] if there's a syntax error in the query, + # or if it doesn't take up the entire input string. + def parse_at_root_query + init_scanner! + query = at_root_query + expected("@at-root query list") unless query && @scanner.eos? + query + end + + # Parses a supports query condition. + # + # @return [Sass::Supports::Condition] The parsed condition + # @raise [Sass::SyntaxError] if there's a syntax error in the condition, + # or if it doesn't take up the entire input string. + def parse_supports_condition + init_scanner! + condition = supports_condition + expected("supports condition") unless condition && @scanner.eos? + condition + end + + # Parses a custom property value. + # + # @return [Array<String, Sass::Script;:Tree::Node>] The interpolated value. + # @raise [Sass::SyntaxError] if there's a syntax error in the value, + # or if it doesn't take up the entire input string. + def parse_declaration_value + init_scanner! + value = declaration_value + expected('"}"') unless value && @scanner.eos? + value + end + + private + + include Sass::SCSS::RX + + def source_position + Sass::Source::Position.new(@line, @offset) + end + + def range(start_pos, end_pos = source_position) + Sass::Source::Range.new(start_pos, end_pos, @filename, @importer) + end + + def init_scanner! + @scanner = + if @template.is_a?(StringScanner) + @template + else + Sass::Util::MultibyteStringScanner.new(@template.tr("\r", "")) + end + end + + def stylesheet + node = node(Sass::Tree::RootNode.new(@scanner.string), source_position) + block_contents(node, :stylesheet) {s(node)} + end + + def s(node) + while tok(S) || tok(CDC) || tok(CDO) || (c = tok(SINGLE_LINE_COMMENT)) || (c = tok(COMMENT)) + next unless c + process_comment c, node + c = nil + end + true + end + + def ss + nil while tok(S) || tok(SINGLE_LINE_COMMENT) || tok(COMMENT) + true + end + + def ss_comments(node) + while tok(S) || (c = tok(SINGLE_LINE_COMMENT)) || (c = tok(COMMENT)) + next unless c + process_comment c, node + c = nil + end + + true + end + + def whitespace + return unless tok(S) || tok(SINGLE_LINE_COMMENT) || tok(COMMENT) + ss + end + + def process_comment(text, node) + silent = text =~ %r{\A//} + loud = !silent && text =~ %r{\A/[/*]!} + line = @line - text.count("\n") + comment_start = @scanner.pos - text.length + index_before_line = @scanner.string.rindex("\n", comment_start) || -1 + offset = comment_start - index_before_line + + if silent + value = [text.sub(%r{\A\s*//}, '/*').gsub(%r{^\s*//}, ' *') + ' */'] + else + value = Sass::Engine.parse_interp(text, line, offset, :filename => @filename) + line_before_comment = @scanner.string[index_before_line + 1...comment_start] + value.unshift(line_before_comment.gsub(/[^\s]/, ' ')) + end + + type = if silent + :silent + elsif loud + :loud + else + :normal + end + start_pos = Sass::Source::Position.new(line, offset) + comment = node(Sass::Tree::CommentNode.new(value, type), start_pos) + node << comment + end + + DIRECTIVES = Set[:mixin, :include, :function, :return, :debug, :warn, :for, + :each, :while, :if, :else, :extend, :import, :media, :charset, :content, + :_moz_document, :at_root, :error] + + PREFIXED_DIRECTIVES = Set[:supports] + + def directive + start_pos = source_position + return unless tok(/@/) + name = ident! + ss + + if (dir = special_directive(name, start_pos)) + return dir + elsif (dir = prefixed_directive(name, start_pos)) + return dir + end + + val = almost_any_value + val = val ? ["@#{name} "] + Sass::Util.strip_string_array(val) : ["@#{name}"] + directive_body(val, start_pos) + end + + def directive_body(value, start_pos) + node = Sass::Tree::DirectiveNode.new(value) + + if tok(/\{/) + node.has_children = true + block_contents(node, :directive) + tok!(/\}/) + end + + node(node, start_pos) + end + + def special_directive(name, start_pos) + sym = name.tr('-', '_').to_sym + DIRECTIVES.include?(sym) && send("#{sym}_directive", start_pos) + end + + def prefixed_directive(name, start_pos) + sym = deprefix(name).tr('-', '_').to_sym + PREFIXED_DIRECTIVES.include?(sym) && send("#{sym}_directive", name, start_pos) + end + + def mixin_directive(start_pos) + name = ident! + args, splat = sass_script(:parse_mixin_definition_arglist) + ss + block(node(Sass::Tree::MixinDefNode.new(name, args, splat), start_pos), :directive) + end + + def include_directive(start_pos) + name = ident! + args, keywords, splat, kwarg_splat = sass_script(:parse_mixin_include_arglist) + ss + include_node = node( + Sass::Tree::MixinNode.new(name, args, keywords, splat, kwarg_splat), start_pos) + if tok?(/\{/) + include_node.has_children = true + block(include_node, :directive) + else + include_node + end + end + + def content_directive(start_pos) + ss + node(Sass::Tree::ContentNode.new, start_pos) + end + + def function_directive(start_pos) + name = ident! + args, splat = sass_script(:parse_function_definition_arglist) + ss + block(node(Sass::Tree::FunctionNode.new(name, args, splat), start_pos), :function) + end + + def return_directive(start_pos) + node(Sass::Tree::ReturnNode.new(sass_script(:parse)), start_pos) + end + + def debug_directive(start_pos) + node(Sass::Tree::DebugNode.new(sass_script(:parse)), start_pos) + end + + def warn_directive(start_pos) + node(Sass::Tree::WarnNode.new(sass_script(:parse)), start_pos) + end + + def for_directive(start_pos) + tok!(/\$/) + var = ident! + ss + + tok!(/from/) + from = sass_script(:parse_until, Set["to", "through"]) + ss + + @expected = '"to" or "through"' + exclusive = (tok(/to/) || tok!(/through/)) == 'to' + to = sass_script(:parse) + ss + + block(node(Sass::Tree::ForNode.new(var, from, to, exclusive), start_pos), :directive) + end + + def each_directive(start_pos) + tok!(/\$/) + vars = [ident!] + ss + while tok(/,/) + ss + tok!(/\$/) + vars << ident! + ss + end + + tok!(/in/) + list = sass_script(:parse) + ss + + block(node(Sass::Tree::EachNode.new(vars, list), start_pos), :directive) + end + + def while_directive(start_pos) + expr = sass_script(:parse) + ss + block(node(Sass::Tree::WhileNode.new(expr), start_pos), :directive) + end + + def if_directive(start_pos) + expr = sass_script(:parse) + ss + node = block(node(Sass::Tree::IfNode.new(expr), start_pos), :directive) + pos = @scanner.pos + line = @line + ss + + else_block(node) || + begin + # Backtrack in case there are any comments we want to parse + @scanner.pos = pos + @line = line + node + end + end + + def else_block(node) + start_pos = source_position + return unless tok(/@else/) + ss + else_node = block( + node(Sass::Tree::IfNode.new((sass_script(:parse) if tok(/if/))), start_pos), + :directive) + node.add_else(else_node) + pos = @scanner.pos + line = @line + ss + + else_block(node) || + begin + # Backtrack in case there are any comments we want to parse + @scanner.pos = pos + @line = line + node + end + end + + def else_directive(start_pos) + err("Invalid CSS: @else must come after @if") + end + + def extend_directive(start_pos) + selector_start_pos = source_position + @expected = "selector" + selector = Sass::Util.strip_string_array(expr!(:almost_any_value)) + optional = tok(OPTIONAL) + ss + node(Sass::Tree::ExtendNode.new(selector, !!optional, range(selector_start_pos)), start_pos) + end + + def import_directive(start_pos) + values = [] + + loop do + values << expr!(:import_arg) + break if use_css_import? + break unless tok(/,/) + ss + end + + values + end + + def import_arg + start_pos = source_position + return unless (str = string) || (uri = tok?(/url\(/i)) + if uri + str = sass_script(:parse_string) + ss + supports = supports_clause + ss + media = media_query_list + ss + return node(Tree::CssImportNode.new(str, media.to_a, supports), start_pos) + end + ss + + supports = supports_clause + ss + media = media_query_list + if str =~ %r{^(https?:)?//} || media || supports || use_css_import? + return node( + Sass::Tree::CssImportNode.new( + Sass::Script::Value::String.quote(str), media.to_a, supports), start_pos) + end + + node(Sass::Tree::ImportNode.new(str.strip), start_pos) + end + + def use_css_import?; false; end + + def media_directive(start_pos) + block(node(Sass::Tree::MediaNode.new(expr!(:media_query_list).to_a), start_pos), :directive) + end + + # http://www.w3.org/TR/css3-mediaqueries/#syntax + def media_query_list + query = media_query + return unless query + queries = [query] + + ss + while tok(/,/) + ss; queries << expr!(:media_query) + end + ss + + Sass::Media::QueryList.new(queries) + end + + def media_query + if (ident1 = interp_ident) + ss + ident2 = interp_ident + ss + if ident2 && ident2.length == 1 && ident2[0].is_a?(String) && ident2[0].downcase == 'and' + query = Sass::Media::Query.new([], ident1, []) + else + if ident2 + query = Sass::Media::Query.new(ident1, ident2, []) + else + query = Sass::Media::Query.new([], ident1, []) + end + return query unless tok(/and/i) + ss + end + end + + if query + expr = expr!(:media_expr) + else + expr = media_expr + return unless expr + end + query ||= Sass::Media::Query.new([], [], []) + query.expressions << expr + + ss + while tok(/and/i) + ss; query.expressions << expr!(:media_expr) + end + + query + end + + def query_expr + interp = interpolation + return interp if interp + return unless tok(/\(/) + res = ['('] + ss + stop_at = Set[:single_eq, :lt, :lte, :gt, :gte] + res << sass_script(:parse_until, stop_at) + + if tok(/:/) + res << ': ' + ss + res << sass_script(:parse) + elsif comparison1 = tok(/=|[<>]=?/) + res << ' ' << comparison1 << ' ' + ss + res << sass_script(:parse_until, stop_at) + if ((comparison1 == ">" || comparison1 == ">=") && comparison2 = tok(/>=?/)) || + ((comparison1 == "<" || comparison1 == "<=") && comparison2 = tok(/<=?/)) + res << ' ' << comparison2 << ' ' + ss + res << sass_script(:parse_until, stop_at) + end + end + res << tok!(/\)/) + ss + res + end + + # Aliases allow us to use different descriptions if the same + # expression fails in different contexts. + alias_method :media_expr, :query_expr + alias_method :at_root_query, :query_expr + + def charset_directive(start_pos) + name = expr!(:string) + ss + node(Sass::Tree::CharsetNode.new(name), start_pos) + end + + # The document directive is specified in + # http://www.w3.org/TR/css3-conditional/, but Gecko allows the + # `url-prefix` and `domain` functions to omit quotation marks, contrary to + # the standard. + # + # We could parse all document directives according to Mozilla's syntax, + # but if someone's using e.g. @-webkit-document we don't want them to + # think WebKit works sans quotes. + def _moz_document_directive(start_pos) + res = ["@-moz-document "] + loop do + res << str {ss} << expr!(:moz_document_function) + if (c = tok(/,/)) + res << c + else + break + end + end + directive_body(res.flatten, start_pos) + end + + def moz_document_function + val = interp_uri || _interp_string(:url_prefix) || + _interp_string(:domain) || function(false) || interpolation + return unless val + ss + val + end + + def at_root_directive(start_pos) + if tok?(/\(/) && (expr = at_root_query) + return block(node(Sass::Tree::AtRootNode.new(expr), start_pos), :directive) + end + + at_root_node = node(Sass::Tree::AtRootNode.new, start_pos) + rule_node = ruleset + return block(at_root_node, :stylesheet) unless rule_node + at_root_node << rule_node + at_root_node + end + + def at_root_directive_list + return unless (first = ident) + arr = [first] + ss + while (e = ident) + arr << e + ss + end + arr + end + + def error_directive(start_pos) + node(Sass::Tree::ErrorNode.new(sass_script(:parse)), start_pos) + end + + # http://www.w3.org/TR/css3-conditional/ + def supports_directive(name, start_pos) + condition = expr!(:supports_condition) + node = Sass::Tree::SupportsNode.new(name, condition) + + tok!(/\{/) + node.has_children = true + block_contents(node, :directive) + tok!(/\}/) + + node(node, start_pos) + end + + def supports_clause + return unless tok(/supports\(/i) + ss + supports = import_supports_condition + ss + tok!(/\)/) + supports + end + + def supports_condition + supports_negation || supports_operator || supports_interpolation + end + + def import_supports_condition + supports_condition || supports_declaration + end + + def supports_negation + return unless tok(/not/i) + ss + Sass::Supports::Negation.new(expr!(:supports_condition_in_parens)) + end + + def supports_operator + cond = supports_condition_in_parens + return unless cond + re = /and|or/i + while (op = tok(re)) + re = /#{op}/i + ss + cond = Sass::Supports::Operator.new( + cond, expr!(:supports_condition_in_parens), op) + end + cond + end + + def supports_declaration + name = sass_script(:parse) + tok!(/:/); ss + value = sass_script(:parse) + Sass::Supports::Declaration.new(name, value) + end + + def supports_condition_in_parens + interp = supports_interpolation + return interp if interp + return unless tok(/\(/); ss + if (cond = supports_condition) + tok!(/\)/); ss + cond + else + decl = supports_declaration + tok!(/\)/); ss + decl + end + end + + def supports_interpolation + interp = interpolation + return unless interp + ss + Sass::Supports::Interpolation.new(interp) + end + + def variable + return unless tok(/\$/) + start_pos = source_position + name = ident! + ss; tok!(/:/); ss + + expr = sass_script(:parse) + while tok(/!/) + flag_name = ident! + if flag_name == 'default' + guarded ||= true + elsif flag_name == 'global' + global ||= true + else + raise Sass::SyntaxError.new("Invalid flag \"!#{flag_name}\".", :line => @line) + end + ss + end + + result = Sass::Tree::VariableNode.new(name, expr, guarded, global) + node(result, start_pos) + end + + def operator + # Many of these operators (all except / and ,) + # are disallowed by the CSS spec, + # but they're included here for compatibility + # with some proprietary MS properties + str {ss if tok(%r{[/,:.=]})} + end + + def ruleset + start_pos = source_position + return unless (rules = almost_any_value) + block( + node( + Sass::Tree::RuleNode.new(rules, range(start_pos)), start_pos), :ruleset) + end + + def block(node, context) + node.has_children = true + tok!(/\{/) + block_contents(node, context) + tok!(/\}/) + node + end + + # A block may contain declarations and/or rulesets + def block_contents(node, context) + block_given? ? yield : ss_comments(node) + node << (child = block_child(context)) + while tok(/;/) || has_children?(child) + block_given? ? yield : ss_comments(node) + node << (child = block_child(context)) + end + node + end + + def block_child(context) + return variable || directive if context == :function + return variable || directive || ruleset if context == :stylesheet + variable || directive || declaration_or_ruleset + end + + def has_children?(child_or_array) + return false unless child_or_array + return child_or_array.last.has_children if child_or_array.is_a?(Array) + child_or_array.has_children + end + + # When parsing the contents of a ruleset, it can be difficult to tell + # declarations apart from nested rulesets. Since we don't thoroughly parse + # selectors until after resolving interpolation, we can share a bunch of + # the parsing of the two, but we need to disambiguate them first. We use + # the following criteria: + # + # * If the entity doesn't start with an identifier followed by a colon, + # it's a selector. There are some additional mostly-unimportant cases + # here to support various declaration hacks. + # + # * If the colon is followed by another colon, it's a selector. + # + # * Otherwise, if the colon is followed by anything other than + # interpolation or a character that's valid as the beginning of an + # identifier, it's a declaration. + # + # * If the colon is followed by interpolation or a valid identifier, try + # parsing it as a declaration value. If this fails, backtrack and parse + # it as a selector. + # + # * If the declaration value value valid but is followed by "{", backtrack + # and parse it as a selector anyway. This ensures that ".foo:bar {" is + # always parsed as a selector and never as a property with nested + # properties beneath it. + def declaration_or_ruleset + start_pos = source_position + declaration = try_declaration + + if declaration.nil? + return unless (selector = almost_any_value) + elsif declaration.is_a?(Array) + selector = declaration + else + # Declaration should be a PropNode. + return declaration + end + + if (additional_selector = almost_any_value) + selector << additional_selector + end + + block( + node( + Sass::Tree::RuleNode.new(merge(selector), range(start_pos)), start_pos), :ruleset) + end + + # Tries to parse a declaration, and returns the value parsed so far if it + # fails. + # + # This has three possible return types. It can return `nil`, indicating + # that parsing failed completely and the scanner hasn't moved forward at + # all. It can return an Array, indicating that parsing failed after + # consuming some text (possibly containing interpolation), which is + # returned. Or it can return a PropNode, indicating that parsing + # succeeded. + def try_declaration + # This allows the "*prop: val", ":prop: val", "#prop: val", and ".prop: + # val" hacks. + name_start_pos = source_position + if (s = tok(/[:\*\.]|\#(?!\{)/)) + name = [s, str {ss}] + return name unless (ident = interp_ident) + name << ident + else + return unless (name = interp_ident) + name = Array(name) + end + + if (comment = tok(COMMENT)) + name << comment + end + name_end_pos = source_position + + mid = [str {ss}] + return name + mid unless tok(/:/) + mid << ':' + + # If this is a CSS variable, parse it as a property no matter what. + if name.first.is_a?(String) && name.first.start_with?("--") + return css_variable_declaration(name, name_start_pos, name_end_pos) + end + + return name + mid + [':'] if tok(/:/) + mid << str {ss} + post_colon_whitespace = !mid.last.empty? + could_be_selector = !post_colon_whitespace && (tok?(IDENT_START) || tok?(INTERP_START)) + + value_start_pos = source_position + value = nil + error = catch_error do + value = value! + if tok?(/\{/) + # Properties that are ambiguous with selectors can't have additional + # properties nested beneath them. + tok!(/;/) if could_be_selector + elsif !tok?(/[;{}]/) + # We want an exception if there's no valid end-of-property character + # exists, but we don't want to consume it if it does. + tok!(/[;{}]/) + end + end + + if error + rethrow error unless could_be_selector + + # If the value would be followed by a semicolon, it's definitely + # supposed to be a property, not a selector. + additional_selector = almost_any_value + rethrow error if tok?(/;/) + + return name + mid + (additional_selector || []) + end + + value_end_pos = source_position + ss + require_block = tok?(/\{/) + + node = node(Sass::Tree::PropNode.new(name.flatten.compact, [value], :new), + name_start_pos, value_end_pos) + node.name_source_range = range(name_start_pos, name_end_pos) + node.value_source_range = range(value_start_pos, value_end_pos) + + return node unless require_block + nested_properties! node + end + + def css_variable_declaration(name, name_start_pos, name_end_pos) + value_start_pos = source_position + value = declaration_value + value_end_pos = source_position + + node = node(Sass::Tree::PropNode.new(name.flatten.compact, value, :new), + name_start_pos, value_end_pos) + node.name_source_range = range(name_start_pos, name_end_pos) + node.value_source_range = range(value_start_pos, value_end_pos) + node + end + + # This production consumes values that could be a selector, an expression, + # or a combination of both. It respects strings and comments and supports + # interpolation. It will consume up to "{", "}", ";", or "!". + # + # Values consumed by this production will usually be parsed more + # thoroughly once interpolation has been resolved. + def almost_any_value + return unless (tok = almost_any_value_token) + sel = [tok] + while (tok = almost_any_value_token) + sel << tok + end + merge(sel) + end + + def almost_any_value_token + tok(%r{ + ( + \\. + | + (?!url\() + [^"'/\#!;\{\}] # " + | + # interp_uri will handle most url() calls, but not ones that take strings + url\(#{W}(?=") + | + /(?![/*]) + | + \#(?!\{) + | + !(?![a-z]) # TODO: never consume "!" when issue 1126 is fixed. + )+ + }xi) || tok(COMMENT) || tok(SINGLE_LINE_COMMENT) || interp_string || interp_uri || + interpolation(:warn_for_color) + end + + def declaration_value(top_level: true) + return unless (tok = declaration_value_token(top_level)) + value = [tok] + while (tok = declaration_value_token(top_level)) + value << tok + end + merge(value) + end + + def declaration_value_token(top_level) + # This comes, more or less, from the [token consumption algorithm][]. + # However, since we don't have to worry about the token semantics, we + # just consume everything until we come across a token with special + # semantics. + # + # [token consumption algorithm]: https://drafts.csswg.org/css-syntax-3/#consume-token. + result = tok(%r{ + ( + (?! + url\( + ) + [^()\[\]{}"'#/ \t\r\n\f#{top_level ? ";" : ""}] + | + \#(?!\{) + | + /(?!\*) + )+ + }xi) || interp_string || interp_uri || interpolation || tok(COMMENT) + return result if result + + # Fold together multiple characters of whitespace that don't include + # newlines. The value only cares about the tokenization, so this is safe + # as long as we don't delete whitespace entirely. It's important that we + # fold here rather than post-processing, since we aren't allowed to fold + # whitespace within strings and we lose that context later on. + if (ws = tok(S)) + return ws.include?("\n") ? ws.gsub(/\A[^\n]*/, '') : ' ' + end + + if tok(/\(/) + value = declaration_value(top_level: false) + tok!(/\)/) + ['(', *value, ')'] + elsif tok(/\[/) + value = declaration_value(top_level: false) + tok!(/\]/) + ['[', *value, ']'] + elsif tok(/\{/) + value = declaration_value(top_level: false) + tok!(/\}/) + ['{', *value, '}'] + end + end + + def declaration + # This allows the "*prop: val", ":prop: val", "#prop: val", and ".prop: + # val" hacks. + name_start_pos = source_position + if (s = tok(/[:\*\.]|\#(?!\{)/)) + name = [s, str {ss}, *expr!(:interp_ident)] + else + return unless (name = interp_ident) + name = Array(name) + end + + if (comment = tok(COMMENT)) + name << comment + end + name_end_pos = source_position + ss + + tok!(/:/) + ss + value_start_pos = source_position + value = value! + value_end_pos = source_position + ss + require_block = tok?(/\{/) + + node = node(Sass::Tree::PropNode.new(name.flatten.compact, [value], :new), + name_start_pos, value_end_pos) + node.name_source_range = range(name_start_pos, name_end_pos) + node.value_source_range = range(value_start_pos, value_end_pos) + + return node unless require_block + nested_properties! node + end + + def value! + if tok?(/\{/) + str = Sass::Script::Tree::Literal.new(Sass::Script::Value::String.new("")) + str.line = source_position.line + str.source_range = range(source_position) + return str + end + + start_pos = source_position + # This is a bit of a dirty trick: + # if the value is completely static, + # we don't parse it at all, and instead return a plain old string + # containing the value. + # This results in a dramatic speed increase. + if (val = tok(STATIC_VALUE)) + # If val ends with escaped whitespace, leave it be. + str = Sass::Script::Tree::Literal.new( + Sass::Script::Value::String.new( + Sass::Util.strip_except_escapes(val))) + str.line = start_pos.line + str.source_range = range(start_pos) + return str + end + sass_script(:parse) + end + + def nested_properties!(node) + @expected = 'expression (e.g. 1px, bold) or "{"' + block(node, :property) + end + + def expr(allow_var = true) + t = term(allow_var) + return unless t + res = [t, str {ss}] + + while (o = operator) && (t = term(allow_var)) + res << o << t << str {ss} + end + + res.flatten + end + + def term(allow_var) + e = tok(NUMBER) || + interp_uri || + function(allow_var) || + interp_string || + tok(UNICODERANGE) || + interp_ident || + tok(HEXCOLOR) || + (allow_var && var_expr) + return e if e + + op = tok(/[+-]/) + return unless op + @expected = "number or function" + [op, + tok(NUMBER) || function(allow_var) || (allow_var && var_expr) || expr!(:interpolation)] + end + + def function(allow_var) + name = tok(FUNCTION) + return unless name + if name == "expression(" || name == "calc(" + str, _ = Sass::Shared.balance(@scanner, ?(, ?), 1) + [name, str] + else + [name, str {ss}, expr(allow_var), tok!(/\)/)] + end + end + + def var_expr + return unless tok(/\$/) + line = @line + var = Sass::Script::Tree::Variable.new(ident!) + var.line = line + var + end + + def interpolation(warn_for_color = false) + return unless tok(INTERP_START) + sass_script(:parse_interpolated, warn_for_color) + end + + def string + return unless tok(STRING) + Sass::Script::Value::String.value(@scanner[1] || @scanner[2]) + end + + def interp_string + _interp_string(:double) || _interp_string(:single) + end + + def interp_uri + _interp_string(:uri) + end + + def _interp_string(type) + start = tok(Sass::Script::Lexer::STRING_REGULAR_EXPRESSIONS[type][false]) + return unless start + res = [start] + + mid_re = Sass::Script::Lexer::STRING_REGULAR_EXPRESSIONS[type][true] + # @scanner[2].empty? means we've started an interpolated section + while @scanner[2] == '#{' + @scanner.pos -= 2 # Don't consume the #{ + res.last.slice!(-2..-1) + res << expr!(:interpolation) << tok(mid_re) + end + res + end + + def ident + (ident = tok(IDENT)) && Sass::Util.normalize_ident_escapes(ident) + end + + def ident! + Sass::Util.normalize_ident_escapes(tok!(IDENT)) + end + + def name + (name = tok(NAME)) && Sass::Util.normalize_ident_escapes(name) + end + + def name! + Sass::Util.normalize_ident_escapes(tok!(NAME)) + end + + def interp_ident + val = ident || interpolation(:warn_for_color) || tok(IDENT_HYPHEN_INTERP) + return unless val + res = [val] + while (val = name || interpolation(:warn_for_color)) + res << val + end + res + end + + def interp_ident_or_var + id = interp_ident + return id if id + var = var_expr + return [var] if var + end + + def str + @strs.push String.new("") + yield + @strs.last + ensure + @strs.pop + end + + def str? + pos = @scanner.pos + line = @line + offset = @offset + @strs.push "" + throw_error {yield} && @strs.last + rescue Sass::SyntaxError + @scanner.pos = pos + @line = line + @offset = offset + nil + ensure + @strs.pop + end + + def node(node, start_pos, end_pos = source_position) + node.line = start_pos.line + node.source_range = range(start_pos, end_pos) + node + end + + @sass_script_parser = Sass::Script::Parser + + class << self + # @private + attr_accessor :sass_script_parser + end + + def sass_script(*args) + parser = self.class.sass_script_parser.new(@scanner, @line, @offset, + :filename => @filename, :importer => @importer, :allow_extra_text => true) + result = parser.send(*args) + unless @strs.empty? + # Convert to CSS manually so that comments are ignored. + src = result.to_sass + @strs.each {|s| s << src} + end + @line = parser.line + @offset = parser.offset + result + rescue Sass::SyntaxError => e + throw(:_sass_parser_error, true) if @throw_error + raise e + end + + def merge(arr) + arr && Sass::Util.merge_adjacent_strings([arr].flatten) + end + + EXPR_NAMES = { + :media_query => "media query (e.g. print, screen, print and screen)", + :media_query_list => "media query (e.g. print, screen, print and screen)", + :media_expr => "media expression (e.g. (min-device-width: 800px))", + :at_root_query => "@at-root query (e.g. (without: media))", + :at_root_directive_list => '* or identifier', + :declaration_value => "expression (e.g. fr, 2n+1)", + :interp_ident => "identifier", + :qualified_name => "identifier", + :expr => "expression (e.g. 1px, bold)", + :selector_comma_sequence => "selector", + :string => "string", + :import_arg => "file to import (string or url())", + :moz_document_function => "matching function (e.g. url-prefix(), domain())", + :supports_condition => "@supports condition (e.g. (display: flexbox))", + :supports_condition_in_parens => "@supports condition (e.g. (display: flexbox))", + :a_n_plus_b => "An+B expression", + :keyframes_selector_component => "from, to, or a percentage", + :keyframes_selector => "keyframes selector (e.g. 10%)" + } + + TOK_NAMES = Hash[Sass::SCSS::RX.constants.map do |c| + [Sass::SCSS::RX.const_get(c), c.downcase] + end].merge( + IDENT => "identifier", + /[;{}]/ => '";"', + /\b(without|with)\b/ => '"with" or "without"' + ) + + def tok?(rx) + @scanner.match?(rx) + end + + def expr!(name) + e = send(name) + return e if e + expected(EXPR_NAMES[name] || name.to_s) + end + + def tok!(rx) + t = tok(rx) + return t if t + name = TOK_NAMES[rx] + + unless name + # Display basic regexps as plain old strings + source = rx.source.gsub(%r{\\/}, '/') + string = rx.source.gsub(/\\(.)/, '\1') + name = source == Regexp.escape(string) ? string.inspect : rx.inspect + end + + expected(name) + end + + def expected(name) + throw(:_sass_parser_error, true) if @throw_error + self.class.expected(@scanner, @expected || name, @line) + end + + def err(msg) + throw(:_sass_parser_error, true) if @throw_error + raise Sass::SyntaxError.new(msg, :line => @line) + end + + def throw_error + old_throw_error, @throw_error = @throw_error, false + yield + ensure + @throw_error = old_throw_error + end + + def catch_error(&block) + old_throw_error, @throw_error = @throw_error, true + pos = @scanner.pos + line = @line + offset = @offset + expected = @expected + + logger = Sass::Logger::Delayed.install! + if catch(:_sass_parser_error) {yield; false} + @scanner.pos = pos + @line = line + @offset = offset + @expected = expected + {:pos => pos, :line => line, :expected => @expected, :block => block} + else + logger.flush + nil + end + ensure + logger.uninstall! if logger + @throw_error = old_throw_error + end + + def rethrow(err) + if @throw_error + throw :_sass_parser_error, err + else + @scanner = Sass::Util::MultibyteStringScanner.new(@scanner.string) + @scanner.pos = err[:pos] + @line = err[:line] + @expected = err[:expected] + err[:block].call + end + end + + # @private + def self.expected(scanner, expected, line) + pos = scanner.pos + + after = scanner.string[0...pos] + # Get rid of whitespace between pos and the last token, + # but only if there's a newline in there + after.gsub!(/\s*\n\s*$/, '') + # Also get rid of stuff before the last newline + after.gsub!(/.*\n/, '') + after = "..." + after[-15..-1] if after.size > 18 + + was = scanner.rest.dup + # Get rid of whitespace between pos and the next token, + # but only if there's a newline in there + was.gsub!(/^\s*\n\s*/, '') + # Also get rid of stuff after the next newline + was.gsub!(/\n.*/, '') + was = was[0...15] + "..." if was.size > 18 + + raise Sass::SyntaxError.new( + "Invalid CSS after \"#{after}\": expected #{expected}, was \"#{was}\"", + :line => line) + end + + # Avoid allocating lots of new strings for `#tok`. + # This is important because `#tok` is called all the time. + NEWLINE = "\n" + + def tok(rx) + res = @scanner.scan(rx) + + return unless res + + newline_count = res.count(NEWLINE) + if newline_count > 0 + @line += newline_count + @offset = res[res.rindex(NEWLINE)..-1].size + else + @offset += res.size + end + + @expected = nil + if !@strs.empty? && rx != COMMENT && rx != SINGLE_LINE_COMMENT + @strs.each {|s| s << res} + end + res + end + + # Remove a vendor prefix from `str`. + def deprefix(str) + str.gsub(/^-[a-zA-Z0-9]+-/, '') + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/rx.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/rx.rb new file mode 100644 index 000000000000..bfb3e4a898f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/rx.rb @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +module Sass + module SCSS + # A module containing regular expressions used + # for lexing tokens in an SCSS document. + # Most of these are taken from [the CSS3 spec](http://www.w3.org/TR/css3-syntax/#lexical), + # although some have been modified for various reasons. + module RX + # Takes a string and returns a CSS identifier + # that will have the value of the given string. + # + # @param str [String] The string to escape + # @return [String] The escaped string + def self.escape_ident(str) + return "" if str.empty? + return "\\#{str}" if str == '-' || str == '_' + out = "" + value = str.dup + out << value.slice!(0...1) if value =~ /^[-_]/ + if value[0...1] =~ NMSTART + out << value.slice!(0...1) + else + out << escape_char(value.slice!(0...1)) + end + out << value.gsub(/[^a-zA-Z0-9_-]/) {|c| escape_char c} + out + end + + # Escapes a single character for a CSS identifier. + # + # @param c [String] The character to escape. Should have length 1 + # @return [String] The escaped character + # @private + def self.escape_char(c) + return "\\%06x" % c.ord unless c =~ %r{[ -/:-~]} + "\\#{c}" + end + + # Creates a Regexp from a plain text string, + # escaping all significant characters. + # + # @param str [String] The text of the regexp + # @param flags [Integer] Flags for the created regular expression + # @return [Regexp] + # @private + def self.quote(str, flags = 0) + Regexp.new(Regexp.quote(str), flags) + end + + H = /[0-9a-fA-F]/ + NL = /\n|\r\n|\r|\f/ + UNICODE = /\\#{H}{1,6}[ \t\r\n\f]?/ + s = '\u{80}-\u{D7FF}\u{E000}-\u{FFFD}\u{10000}-\u{10FFFF}' + NONASCII = /[#{s}]/ + ESCAPE = /#{UNICODE}|\\[^0-9a-fA-F\r\n\f]/ + NMSTART = /[_a-zA-Z]|#{NONASCII}|#{ESCAPE}/ + NMCHAR = /[a-zA-Z0-9_-]|#{NONASCII}|#{ESCAPE}/ + STRING1 = /\"((?:[^\n\r\f\\"]|\\#{NL}|#{ESCAPE})*)\"/ + STRING2 = /\'((?:[^\n\r\f\\']|\\#{NL}|#{ESCAPE})*)\'/ + + IDENT = /-*#{NMSTART}#{NMCHAR}*/ + NAME = /#{NMCHAR}+/ + STRING = /#{STRING1}|#{STRING2}/ + URLCHAR = /[#%&*-~]|#{NONASCII}|#{ESCAPE}/ + URL = /(#{URLCHAR}*)/ + W = /[ \t\r\n\f]*/ + VARIABLE = /(\$)(#{Sass::SCSS::RX::IDENT})/ + + # This is more liberal than the spec's definition, + # but that definition didn't work well with the greediness rules + RANGE = /(?:#{H}|\?){1,6}/ + + ## + + S = /[ \t\r\n\f]+/ + + COMMENT = %r{/\*([^*]|\*+[^/*])*\**\*/} + SINGLE_LINE_COMMENT = %r{//.*(\n[ \t]*//.*)*} + + CDO = quote("<!--") + CDC = quote("-->") + INCLUDES = quote("~=") + DASHMATCH = quote("|=") + PREFIXMATCH = quote("^=") + SUFFIXMATCH = quote("$=") + SUBSTRINGMATCH = quote("*=") + + HASH = /##{NAME}/ + + IMPORTANT = /!#{W}important/i + + # A unit is like an IDENT, but disallows a hyphen followed by a digit. + # This allows "1px-2px" to be interpreted as subtraction rather than "1" + # with the unit "px-2px". It also allows "%". + UNIT = /-?#{NMSTART}(?:[a-zA-Z0-9_]|#{NONASCII}|#{ESCAPE}|-(?!\.?\d))*|%/ + + UNITLESS_NUMBER = /(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?\d+)?/ + NUMBER = /#{UNITLESS_NUMBER}(?:#{UNIT})?/ + PERCENTAGE = /#{UNITLESS_NUMBER}%/ + + URI = /url\(#{W}(?:#{STRING}|#{URL})#{W}\)/i + FUNCTION = /#{IDENT}\(/ + + UNICODERANGE = /u\+(?:#{H}{1,6}-#{H}{1,6}|#{RANGE})/i + + # Defined in http://www.w3.org/TR/css3-selectors/#lex + PLUS = /#{W}\+/ + GREATER = /#{W}>/ + TILDE = /#{W}~/ + NOT = quote(":not(", Regexp::IGNORECASE) + + # Defined in https://developer.mozilla.org/en/CSS/@-moz-document as a + # non-standard version of http://www.w3.org/TR/css3-conditional/ + URL_PREFIX = /url-prefix\(#{W}(?:#{STRING}|#{URL})#{W}\)/i + DOMAIN = /domain\(#{W}(?:#{STRING}|#{URL})#{W}\)/i + + # Custom + HEXCOLOR = /\#[0-9a-fA-F]+/ + INTERP_START = /#\{/ + ANY = /:(-[-\w]+-)?any\(/i + OPTIONAL = /!#{W}optional/i + IDENT_START = /-|#{NMSTART}/ + + IDENT_HYPHEN_INTERP = /-+(?=#\{)/ + STRING1_NOINTERP = /\"((?:[^\n\r\f\\"#]|#(?!\{)|#{ESCAPE})*)\"/ + STRING2_NOINTERP = /\'((?:[^\n\r\f\\'#]|#(?!\{)|#{ESCAPE})*)\'/ + STRING_NOINTERP = /#{STRING1_NOINTERP}|#{STRING2_NOINTERP}/ + + STATIC_COMPONENT = /#{IDENT}|#{STRING_NOINTERP}|#{HEXCOLOR}|[+-]?#{NUMBER}|\!important/i + STATIC_VALUE = %r(#{STATIC_COMPONENT}(\s*[\s,\/]\s*#{STATIC_COMPONENT})*(?=[;}]))i + STATIC_SELECTOR = /(#{NMCHAR}|[ \t]|[,>+*]|[:#.]#{NMSTART}){1,50}([{])/i + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/static_parser.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/static_parser.rb new file mode 100644 index 000000000000..fff9d0e92a7f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/scss/static_parser.rb @@ -0,0 +1,351 @@ +require 'sass/script/css_parser' + +module Sass + module SCSS + # A parser for a static SCSS tree. + # Parses with SCSS extensions, like nested rules and parent selectors, + # but without dynamic SassScript. + # This is useful for e.g. \{#parse\_selector parsing selectors} + # after resolving the interpolation. + class StaticParser < Parser + # Parses the text as a selector. + # + # @param filename [String, nil] The file in which the selector appears, + # or nil if there is no such file. + # Used for error reporting. + # @return [Selector::CommaSequence] The parsed selector + # @raise [Sass::SyntaxError] if there's a syntax error in the selector + def parse_selector + init_scanner! + seq = expr!(:selector_comma_sequence) + expected("selector") unless @scanner.eos? + seq.line = @line + seq.filename = @filename + seq + end + + # Parses a static at-root query. + # + # @return [(Symbol, Array<String>)] The type of the query + # (`:with` or `:without`) and the values that are being filtered. + # @raise [Sass::SyntaxError] if there's a syntax error in the query, + # or if it doesn't take up the entire input string. + def parse_static_at_root_query + init_scanner! + tok!(/\(/); ss + type = tok!(/\b(without|with)\b/).to_sym; ss + tok!(/:/); ss + directives = expr!(:at_root_directive_list); ss + tok!(/\)/) + expected("@at-root query list") unless @scanner.eos? + return type, directives + end + + def parse_keyframes_selector + init_scanner! + sel = expr!(:keyframes_selector) + expected("keyframes selector") unless @scanner.eos? + sel + end + + # @see Parser#initialize + # @param allow_parent_ref [Boolean] Whether to allow the + # parent-reference selector, `&`, when parsing the document. + def initialize(str, filename, importer, line = 1, offset = 1, allow_parent_ref = true) + super(str, filename, importer, line, offset) + @allow_parent_ref = allow_parent_ref + end + + private + + def moz_document_function + val = tok(URI) || tok(URL_PREFIX) || tok(DOMAIN) || function(false) + return unless val + ss + [val] + end + + def variable; nil; end + def script_value; nil; end + def interpolation(warn_for_color = false); nil; end + def var_expr; nil; end + def interp_string; (s = tok(STRING)) && [s]; end + def interp_uri; (s = tok(URI)) && [s]; end + def interp_ident; (s = ident) && [s]; end + def use_css_import?; true; end + + def special_directive(name, start_pos) + return unless %w(media import charset -moz-document).include?(name) + super + end + + def selector_comma_sequence + sel = selector + return unless sel + selectors = [sel] + ws = '' + while tok(/,/) + ws << str {ss} + next unless (sel = selector) + selectors << sel + if ws.include?("\n") + selectors[-1] = Selector::Sequence.new(["\n"] + selectors.last.members) + end + ws = '' + end + Selector::CommaSequence.new(selectors) + end + + def selector_string + sel = selector + return unless sel + sel.to_s + end + + def selector + start_pos = source_position + # The combinator here allows the "> E" hack + val = combinator || simple_selector_sequence + return unless val + nl = str {ss}.include?("\n") + res = [] + res << val + res << "\n" if nl + + while (val = combinator || simple_selector_sequence) + res << val + res << "\n" if str {ss}.include?("\n") + end + seq = Selector::Sequence.new(res.compact) + + if seq.members.any? {|sseq| sseq.is_a?(Selector::SimpleSequence) && sseq.subject?} + location = " of #{@filename}" if @filename + Sass::Util.sass_warn <<MESSAGE +DEPRECATION WARNING on line #{start_pos.line}, column #{start_pos.offset}#{location}: +The subject selector operator "!" is deprecated and will be removed in a future release. +This operator has been replaced by ":has()" in the CSS spec. +For example: #{seq.subjectless} +MESSAGE + end + + seq + end + + def combinator + tok(PLUS) || tok(GREATER) || tok(TILDE) || reference_combinator + end + + def reference_combinator + return unless tok(%r{/}) + res = '/' + ns, name = expr!(:qualified_name) + res << ns << '|' if ns + res << name << tok!(%r{/}) + + location = " of #{@filename}" if @filename + Sass::Util.sass_warn <<MESSAGE +DEPRECATION WARNING on line #{@line}, column #{@offset}#{location}: +The reference combinator #{res} is deprecated and will be removed in a future release. +MESSAGE + + res + end + + def simple_selector_sequence + start_pos = source_position + e = element_name || id_selector || class_selector || placeholder_selector || attrib || + pseudo || parent_selector + return unless e + res = [e] + + # The tok(/\*/) allows the "E*" hack + while (v = id_selector || class_selector || placeholder_selector || + attrib || pseudo || (tok(/\*/) && Selector::Universal.new(nil))) + res << v + end + + pos = @scanner.pos + line = @line + if (sel = str? {simple_selector_sequence}) + @scanner.pos = pos + @line = line + begin + # If we see "*E", don't force a throw because this could be the + # "*prop: val" hack. + expected('"{"') if res.length == 1 && res[0].is_a?(Selector::Universal) + throw_error {expected('"{"')} + rescue Sass::SyntaxError => e + e.message << "\n\n\"#{sel}\" may only be used at the beginning of a compound selector." + raise e + end + end + + Selector::SimpleSequence.new(res, tok(/!/), range(start_pos)) + end + + def parent_selector + return unless @allow_parent_ref && tok(/&/) + Selector::Parent.new(name) + end + + def class_selector + return unless tok(/\./) + @expected = "class name" + Selector::Class.new(ident!) + end + + def id_selector + return unless tok(/#(?!\{)/) + @expected = "id name" + Selector::Id.new(name!) + end + + def placeholder_selector + return unless tok(/%/) + @expected = "placeholder name" + Selector::Placeholder.new(ident!) + end + + def element_name + ns, name = Sass::Util.destructure(qualified_name(:allow_star_name)) + return unless ns || name + + if name == '*' + Selector::Universal.new(ns) + else + Selector::Element.new(name, ns) + end + end + + def qualified_name(allow_star_name = false) + name = ident || tok(/\*/) || (tok?(/\|/) && "") + return unless name + return nil, name unless tok(/\|/) + + return name, ident! unless allow_star_name + @expected = "identifier or *" + return name, ident || tok!(/\*/) + end + + def attrib + return unless tok(/\[/) + ss + ns, name = attrib_name! + ss + + op = tok(/=/) || + tok(INCLUDES) || + tok(DASHMATCH) || + tok(PREFIXMATCH) || + tok(SUFFIXMATCH) || + tok(SUBSTRINGMATCH) + if op + @expected = "identifier or string" + ss + val = ident || tok!(STRING) + ss + end + flags = ident || tok(STRING) + tok!(/\]/) + + Selector::Attribute.new(name, ns, op, val, flags) + end + + def attrib_name! + if (name_or_ns = ident) + # E, E|E + if tok(/\|(?!=)/) + ns = name_or_ns + name = ident + else + name = name_or_ns + end + else + # *|E or |E + ns = tok(/\*/) || "" + tok!(/\|/) + name = ident! + end + return ns, name + end + + SELECTOR_PSEUDO_CLASSES = %w(not matches current any has host host-context).to_set + + PREFIXED_SELECTOR_PSEUDO_CLASSES = %w(nth-child nth-last-child).to_set + + SELECTOR_PSEUDO_ELEMENTS = %w(slotted).to_set + + def pseudo + s = tok(/::?/) + return unless s + @expected = "pseudoclass or pseudoelement" + name = ident! + if tok(/\(/) + ss + deprefixed = deprefix(name) + if s == ':' && SELECTOR_PSEUDO_CLASSES.include?(deprefixed) + sel = selector_comma_sequence + elsif s == ':' && PREFIXED_SELECTOR_PSEUDO_CLASSES.include?(deprefixed) + arg, sel = prefixed_selector_pseudo + elsif s == '::' && SELECTOR_PSEUDO_ELEMENTS.include?(deprefixed) + sel = selector_comma_sequence + else + arg = expr!(:declaration_value).join + end + + tok!(/\)/) + end + Selector::Pseudo.new(s == ':' ? :class : :element, name, arg, sel) + end + + def prefixed_selector_pseudo + prefix = str do + expr = str {expr!(:a_n_plus_b)} + ss + return expr, nil unless tok(/of/) + ss + end + return prefix, expr!(:selector_comma_sequence) + end + + def a_n_plus_b + if (parity = tok(/even|odd/i)) + return parity + end + + if tok(/[+-]?[0-9]+/) + ss + return true unless tok(/n/) + else + return unless tok(/[+-]?n/i) + end + ss + + return true unless tok(/[+-]/) + ss + @expected = "number" + tok!(/[0-9]+/) + true + end + + def keyframes_selector + ss + str do + return unless keyframes_selector_component + ss + while tok(/,/) + ss + expr!(:keyframes_selector_component) + ss + end + end + end + + def keyframes_selector_component + ident || tok(PERCENTAGE) + end + + @sass_script_parser = Class.new(Sass::Script::CssParser) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector.rb new file mode 100644 index 000000000000..cac8de4e72cb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector.rb @@ -0,0 +1,327 @@ +require 'sass/selector/simple' +require 'sass/selector/abstract_sequence' +require 'sass/selector/comma_sequence' +require 'sass/selector/pseudo' +require 'sass/selector/sequence' +require 'sass/selector/simple_sequence' + +module Sass + # A namespace for nodes in the parse tree for selectors. + # + # {CommaSequence} is the toplevel selector, + # representing a comma-separated sequence of {Sequence}s, + # such as `foo bar, baz bang`. + # {Sequence} is the next level, + # representing {SimpleSequence}s separated by combinators (e.g. descendant or child), + # such as `foo bar` or `foo > bar baz`. + # {SimpleSequence} is a sequence of selectors that all apply to a single element, + # such as `foo.bar[attr=val]`. + # Finally, {Simple} is the superclass of the simplest selectors, + # such as `.foo` or `#bar`. + module Selector + # The base used for calculating selector specificity. The spec says this + # should be "sufficiently high"; it's extremely unlikely that any single + # selector sequence will contain 1,000 simple selectors. + SPECIFICITY_BASE = 1_000 + + # A parent-referencing selector (`&` in Sass). + # The function of this is to be replaced by the parent selector + # in the nested hierarchy. + class Parent < Simple + # The identifier following the `&`. `nil` indicates no suffix. + # + # @return [String, nil] + attr_reader :suffix + + # @param name [String, nil] See \{#suffix} + def initialize(suffix = nil) + @suffix = suffix + end + + # @see Selector#to_s + def to_s(opts = {}) + "&" + (@suffix || '') + end + + # Always raises an exception. + # + # @raise [Sass::SyntaxError] Parent selectors should be resolved before unification + # @see Selector#unify + def unify(sels) + raise Sass::SyntaxError.new("[BUG] Cannot unify parent selectors.") + end + end + + # A class selector (e.g. `.foo`). + class Class < Simple + # The class name. + # + # @return [String] + attr_reader :name + + # @param name [String] The class name + def initialize(name) + @name = name + end + + # @see Selector#to_s + def to_s(opts = {}) + "." + @name + end + + # @see AbstractSequence#specificity + def specificity + SPECIFICITY_BASE + end + end + + # An id selector (e.g. `#foo`). + class Id < Simple + # The id name. + # + # @return [String] + attr_reader :name + + # @param name [String] The id name + def initialize(name) + @name = name + end + + def unique? + true + end + + # @see Selector#to_s + def to_s(opts = {}) + "#" + @name + end + + # Returns `nil` if `sels` contains an {Id} selector + # with a different name than this one. + # + # @see Selector#unify + def unify(sels) + return if sels.any? {|sel2| sel2.is_a?(Id) && name != sel2.name} + super + end + + # @see AbstractSequence#specificity + def specificity + SPECIFICITY_BASE**2 + end + end + + # A placeholder selector (e.g. `%foo`). + # This exists to be replaced via `@extend`. + # Rulesets using this selector will not be printed, but can be extended. + # Otherwise, this acts just like a class selector. + class Placeholder < Simple + # The placeholder name. + # + # @return [String] + attr_reader :name + + # @param name [String] The placeholder name + def initialize(name) + @name = name + end + + # @see Selector#to_s + def to_s(opts = {}) + "%" + @name + end + + # @see AbstractSequence#specificity + def specificity + SPECIFICITY_BASE + end + end + + # A universal selector (`*` in CSS). + class Universal < Simple + # The selector namespace. `nil` means the default namespace, `""` means no + # namespace, `"*"` means any namespace. + # + # @return [String, nil] + attr_reader :namespace + + # @param namespace [String, nil] See \{#namespace} + def initialize(namespace) + @namespace = namespace + end + + # @see Selector#to_s + def to_s(opts = {}) + @namespace ? "#{@namespace}|*" : "*" + end + + # Unification of a universal selector is somewhat complicated, + # especially when a namespace is specified. + # If there is no namespace specified + # or any namespace is specified (namespace `"*"`), + # then `sel` is returned without change + # (unless it's empty, in which case `"*"` is required). + # + # If a namespace is specified + # but `sel` does not specify a namespace, + # then the given namespace is applied to `sel`, + # either by adding this {Universal} selector + # or applying this namespace to an existing {Element} selector. + # + # If both this selector *and* `sel` specify namespaces, + # those namespaces are unified via {Simple#unify_namespaces} + # and the unified namespace is used, if possible. + # + # @todo There are lots of cases that this documentation specifies; + # make sure we thoroughly test **all of them**. + # @todo Keep track of whether a default namespace has been declared + # and handle namespace-unspecified selectors accordingly. + # @todo If any branch of a CommaSequence ends up being just `"*"`, + # then all other branches should be eliminated + # + # @see Selector#unify + def unify(sels) + name = + case sels.first + when Universal; :universal + when Element; sels.first.name + else + return [self] + sels unless namespace.nil? || namespace == '*' + return sels unless sels.empty? + return [self] + end + + ns, accept = unify_namespaces(namespace, sels.first.namespace) + return unless accept + [name == :universal ? Universal.new(ns) : Element.new(name, ns)] + sels[1..-1] + end + + # @see AbstractSequence#specificity + def specificity + 0 + end + end + + # An element selector (e.g. `h1`). + class Element < Simple + # The element name. + # + # @return [String] + attr_reader :name + + # The selector namespace. `nil` means the default namespace, `""` means no + # namespace, `"*"` means any namespace. + # + # @return [String, nil] + attr_reader :namespace + + # @param name [String] The element name + # @param namespace [String, nil] See \{#namespace} + def initialize(name, namespace) + @name = name + @namespace = namespace + end + + # @see Selector#to_s + def to_s(opts = {}) + @namespace ? "#{@namespace}|#{@name}" : @name + end + + # Unification of an element selector is somewhat complicated, + # especially when a namespace is specified. + # First, if `sel` contains another {Element} with a different \{#name}, + # then the selectors can't be unified and `nil` is returned. + # + # Otherwise, if `sel` doesn't specify a namespace, + # or it specifies any namespace (via `"*"`), + # then it's returned with this element selector + # (e.g. `.foo` becomes `a.foo` or `svg|a.foo`). + # Similarly, if this selector doesn't specify a namespace, + # the namespace from `sel` is used. + # + # If both this selector *and* `sel` specify namespaces, + # those namespaces are unified via {Simple#unify_namespaces} + # and the unified namespace is used, if possible. + # + # @todo There are lots of cases that this documentation specifies; + # make sure we thoroughly test **all of them**. + # @todo Keep track of whether a default namespace has been declared + # and handle namespace-unspecified selectors accordingly. + # + # @see Selector#unify + def unify(sels) + case sels.first + when Universal; + when Element; return unless name == sels.first.name + else return [self] + sels + end + + ns, accept = unify_namespaces(namespace, sels.first.namespace) + return unless accept + [Element.new(name, ns)] + sels[1..-1] + end + + # @see AbstractSequence#specificity + def specificity + 1 + end + end + + # An attribute selector (e.g. `[href^="http://"]`). + class Attribute < Simple + # The attribute name. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_reader :name + + # The attribute namespace. `nil` means the default namespace, `""` means + # no namespace, `"*"` means any namespace. + # + # @return [String, nil] + attr_reader :namespace + + # The matching operator, e.g. `"="` or `"^="`. + # + # @return [String] + attr_reader :operator + + # The right-hand side of the operator. + # + # @return [String] + attr_reader :value + + # Flags for the attribute selector (e.g. `i`). + # + # @return [String] + attr_reader :flags + + # @param name [String] The attribute name + # @param namespace [String, nil] See \{#namespace} + # @param operator [String] The matching operator, e.g. `"="` or `"^="` + # @param value [String] See \{#value} + # @param flags [String] See \{#flags} + def initialize(name, namespace, operator, value, flags) + @name = name + @namespace = namespace + @operator = operator + @value = value + @flags = flags + end + + # @see Selector#to_s + def to_s(opts = {}) + res = "[" + res << @namespace << "|" if @namespace + res << @name + res << @operator << @value if @value + res << " " << @flags if @flags + res << "]" + end + + # @see AbstractSequence#specificity + def specificity + SPECIFICITY_BASE + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/abstract_sequence.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/abstract_sequence.rb new file mode 100644 index 000000000000..ad167a01bce9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/abstract_sequence.rb @@ -0,0 +1,112 @@ +module Sass + module Selector + # The abstract parent class of the various selector sequence classes. + # + # All subclasses should implement a `members` method that returns an array + # of object that respond to `#line=` and `#filename=`, as well as a `to_s` + # method that returns the string representation of the selector. + class AbstractSequence + # The line of the Sass template on which this selector was declared. + # + # @return [Integer] + attr_reader :line + + # The name of the file in which this selector was declared. + # + # @return [String, nil] + attr_reader :filename + + # Sets the line of the Sass template on which this selector was declared. + # This also sets the line for all child selectors. + # + # @param line [Integer] + # @return [Integer] + def line=(line) + members.each {|m| m.line = line} + @line = line + end + + # Sets the name of the file in which this selector was declared, + # or `nil` if it was not declared in a file (e.g. on stdin). + # This also sets the filename for all child selectors. + # + # @param filename [String, nil] + # @return [String, nil] + def filename=(filename) + members.each {|m| m.filename = filename} + @filename = filename + end + + # Returns a hash code for this sequence. + # + # Subclasses should define `#_hash` rather than overriding this method, + # which automatically handles memoizing the result. + # + # @return [Integer] + def hash + @_hash ||= _hash + end + + # Checks equality between this and another object. + # + # Subclasses should define `#_eql?` rather than overriding this method, + # which handles checking class equality and hash equality. + # + # @param other [Object] The object to test equality against + # @return [Boolean] Whether or not this is equal to `other` + def eql?(other) + other.class == self.class && other.hash == hash && _eql?(other) + end + alias_method :==, :eql? + + # Whether or not this selector should be hidden due to containing a + # placeholder. + def invisible? + @invisible ||= members.any? do |m| + next m.invisible? if m.is_a?(AbstractSequence) || m.is_a?(Pseudo) + m.is_a?(Placeholder) + end + end + + # Returns the selector string. + # + # @param opts [Hash] rendering options. + # @option opts [Symbol] :style The css rendering style. + # @option placeholders [Boolean] :placeholders + # Whether to include placeholder selectors. Defaults to `true`. + # @return [String] + def to_s(opts = {}) + Sass::Util.abstract(self) + end + + # Returns the specificity of the selector. + # + # The base is given by {Sass::Selector::SPECIFICITY_BASE}. This can be a + # number or a range representing possible specificities. + # + # @return [Integer, Range] + def specificity + _specificity(members) + end + + protected + + def _specificity(arr) + min = 0 + max = 0 + arr.each do |m| + next if m.is_a?(String) + spec = m.specificity + if spec.is_a?(Range) + min += spec.begin + max += spec.end + else + min += spec + max += spec + end + end + min == max ? min : (min..max) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/comma_sequence.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/comma_sequence.rb new file mode 100644 index 000000000000..c62ea04b999c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/comma_sequence.rb @@ -0,0 +1,195 @@ +module Sass + module Selector + # A comma-separated sequence of selectors. + class CommaSequence < AbstractSequence + @@compound_extend_deprecation = Sass::Deprecation.new + + # The comma-separated selector sequences + # represented by this class. + # + # @return [Array<Sequence>] + attr_reader :members + + # @param seqs [Array<Sequence>] See \{#members} + def initialize(seqs) + @members = seqs + end + + # Resolves the {Parent} selectors within this selector + # by replacing them with the given parent selector, + # handling commas appropriately. + # + # @param super_cseq [CommaSequence] The parent selector + # @param implicit_parent [Boolean] Whether the the parent + # selector should automatically be prepended to the resolved + # selector if it contains no parent refs. + # @return [CommaSequence] This selector, with parent references resolved + # @raise [Sass::SyntaxError] If a parent selector is invalid + def resolve_parent_refs(super_cseq, implicit_parent = true) + if super_cseq.nil? + if contains_parent_ref? + raise Sass::SyntaxError.new( + "Base-level rules cannot contain the parent-selector-referencing character '&'.") + end + return self + end + + CommaSequence.new(Sass::Util.flatten_vertically(@members.map do |seq| + seq.resolve_parent_refs(super_cseq, implicit_parent).members + end)) + end + + # Returns whether there's a {Parent} selector anywhere in this sequence. + # + # @return [Boolean] + def contains_parent_ref? + @members.any? {|sel| sel.contains_parent_ref?} + end + + # Non-destrucively extends this selector with the extensions specified in a hash + # (which should come from {Sass::Tree::Visitors::Cssize}). + # + # @todo Link this to the reference documentation on `@extend` + # when such a thing exists. + # + # @param extends [Sass::Util::SubsetMap{Selector::Simple => + # Sass::Tree::Visitors::Cssize::Extend}] + # The extensions to perform on this selector + # @param parent_directives [Array<Sass::Tree::DirectiveNode>] + # The directives containing this selector. + # @param replace [Boolean] + # Whether to replace the original selector entirely or include + # it in the result. + # @param seen [Set<Array<Selector::Simple>>] + # The set of simple sequences that are currently being replaced. + # @param original [Boolean] + # Whether this is the original selector being extended, as opposed to + # the result of a previous extension that's being re-extended. + # @return [CommaSequence] A copy of this selector, + # with extensions made according to `extends` + def do_extend(extends, parent_directives = [], replace = false, seen = Set.new, + original = true) + CommaSequence.new(members.map do |seq| + seq.do_extend(extends, parent_directives, replace, seen, original) + end.flatten) + end + + # Returns whether or not this selector matches all elements + # that the given selector matches (as well as possibly more). + # + # @example + # (.foo).superselector?(.foo.bar) #=> true + # (.foo).superselector?(.bar) #=> false + # @param cseq [CommaSequence] + # @return [Boolean] + def superselector?(cseq) + cseq.members.all? {|seq1| members.any? {|seq2| seq2.superselector?(seq1)}} + end + + # Populates a subset map that can then be used to extend + # selectors. This registers an extension with this selector as + # the extender and `extendee` as the extendee. + # + # @param extends [Sass::Util::SubsetMap{Selector::Simple => + # Sass::Tree::Visitors::Cssize::Extend}] + # The subset map representing the extensions to perform. + # @param extendee [CommaSequence] The selector being extended. + # @param extend_node [Sass::Tree::ExtendNode] + # The node that caused this extension. + # @param parent_directives [Array<Sass::Tree::DirectiveNode>] + # The parent directives containing `extend_node`. + # @param allow_compound_target [Boolean] + # Whether `extendee` is allowed to contain compound selectors. + # @raise [Sass::SyntaxError] if this extension is invalid. + def populate_extends(extends, extendee, extend_node = nil, parent_directives = [], + allow_compound_target = false) + extendee.members.each do |seq| + if seq.members.size > 1 + raise Sass::SyntaxError.new("Can't extend #{seq}: can't extend nested selectors") + end + + sseq = seq.members.first + if !sseq.is_a?(Sass::Selector::SimpleSequence) + raise Sass::SyntaxError.new("Can't extend #{seq}: invalid selector") + elsif sseq.members.any? {|ss| ss.is_a?(Sass::Selector::Parent)} + raise Sass::SyntaxError.new("Can't extend #{seq}: can't extend parent selectors") + end + + sel = sseq.members + if !allow_compound_target && sel.length > 1 + @@compound_extend_deprecation.warn(sseq.filename, sseq.line, <<WARNING) +Extending a compound selector, #{sseq}, is deprecated and will not be supported in a future release. +Consider "@extend #{sseq.members.join(', ')}" instead. +See http://bit.ly/ExtendCompound for details. +WARNING + end + + members.each do |member| + unless member.members.last.is_a?(Sass::Selector::SimpleSequence) + raise Sass::SyntaxError.new("#{member} can't extend: invalid selector") + end + + extends[sel] = Sass::Tree::Visitors::Cssize::Extend.new( + member, sel, extend_node, parent_directives, false) + end + end + end + + # Unifies this with another comma selector to produce a selector + # that matches (a subset of) the intersection of the two inputs. + # + # @param other [CommaSequence] + # @return [CommaSequence, nil] The unified selector, or nil if unification failed. + # @raise [Sass::SyntaxError] If this selector cannot be unified. + # This will only ever occur when a dynamic selector, + # such as {Parent} or {Interpolation}, is used in unification. + # Since these selectors should be resolved + # by the time extension and unification happen, + # this exception will only ever be raised as a result of programmer error + def unify(other) + results = members.map {|seq1| other.members.map {|seq2| seq1.unify(seq2)}}.flatten.compact + results.empty? ? nil : CommaSequence.new(results.map {|cseq| cseq.members}.flatten) + end + + # Returns a SassScript representation of this selector. + # + # @return [Sass::Script::Value::List] + def to_sass_script + Sass::Script::Value::List.new(members.map do |seq| + Sass::Script::Value::List.new(seq.members.map do |component| + next if component == "\n" + Sass::Script::Value::String.new(component.to_s) + end.compact, separator: :space) + end, separator: :comma) + end + + # Returns a string representation of the sequence. + # This is basically the selector string. + # + # @return [String] + def inspect + members.map {|m| m.inspect}.join(", ") + end + + # @see AbstractSequence#to_s + def to_s(opts = {}) + @members.map do |m| + next if opts[:placeholder] == false && m.invisible? + m.to_s(opts) + end.compact. + join(opts[:style] == :compressed ? "," : ", "). + gsub(", \n", ",\n") + end + + private + + def _hash + members.hash + end + + def _eql?(other) + other.class == self.class && other.members.eql?(members) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/pseudo.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/pseudo.rb new file mode 100644 index 000000000000..2893d7d3dac1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/pseudo.rb @@ -0,0 +1,283 @@ +# coding: utf-8 +module Sass + module Selector + # A pseudoclass (e.g. `:visited`) or pseudoelement (e.g. `::first-line`) + # selector. It can have arguments (e.g. `:nth-child(2n+1)`) which can + # contain selectors (e.g. `:nth-child(2n+1 of .foo)`). + class Pseudo < Simple + # Some pseudo-class-syntax selectors are actually considered + # pseudo-elements and must be treated differently. This is a list of such + # selectors. + # + # @return [Set<String>] + ACTUALLY_ELEMENTS = %w(after before first-line first-letter).to_set + + # Like \{#type}, but returns the type of selector this looks like, rather + # than the type it is semantically. This only differs from type for + # selectors in \{ACTUALLY\_ELEMENTS}. + # + # @return [Symbol] + attr_reader :syntactic_type + + # The name of the selector. + # + # @return [String] + attr_reader :name + + # The argument to the selector, + # or `nil` if no argument was given. + # + # @return [String, nil] + attr_reader :arg + + # The selector argument, or `nil` if no selector exists. + # + # If this and \{#arg\} are both set, \{#arg\} is considered a non-selector + # prefix. + # + # @return [CommaSequence] + attr_reader :selector + + # @param syntactic_type [Symbol] See \{#syntactic_type} + # @param name [String] See \{#name} + # @param arg [nil, String] See \{#arg} + # @param selector [nil, CommaSequence] See \{#selector} + def initialize(syntactic_type, name, arg, selector) + @syntactic_type = syntactic_type + @name = name + @arg = arg + @selector = selector + end + + def unique? + type == :class && normalized_name == 'root' + end + + # Whether or not this selector should be hidden due to containing a + # placeholder. + def invisible? + # :not() is a special case—if you eliminate all the placeholders from + # it, it should match anything. + name != 'not' && @selector && @selector.members.all? {|s| s.invisible?} + end + + # Returns a copy of this with \{#selector} set to \{#new\_selector}. + # + # @param new_selector [CommaSequence] + # @return [Array<Simple>] + def with_selector(new_selector) + result = Pseudo.new(syntactic_type, name, arg, + CommaSequence.new(new_selector.members.map do |seq| + next seq unless seq.members.length == 1 + sseq = seq.members.first + next seq unless sseq.is_a?(SimpleSequence) && sseq.members.length == 1 + sel = sseq.members.first + next seq unless sel.is_a?(Pseudo) && sel.selector + + case normalized_name + when 'not' + # In theory, if there's a nested :not its contents should be + # unified with the return value. For example, if :not(.foo) + # extends .bar, :not(.bar) should become .foo:not(.bar). However, + # this is a narrow edge case and supporting it properly would make + # this code and the code calling it a lot more complicated, so + # it's not supported for now. + next [] unless sel.normalized_name == 'matches' + sel.selector.members + when 'matches', 'any', 'current', 'nth-child', 'nth-last-child' + # As above, we could theoretically support :not within :matches, but + # doing so would require this method and its callers to handle much + # more complex cases that likely aren't worth the pain. + next [] unless sel.name == name && sel.arg == arg + sel.selector.members + when 'has', 'host', 'host-context', 'slotted' + # We can't expand nested selectors here, because each layer adds an + # additional layer of semantics. For example, `:has(:has(img))` + # doesn't match `<div><img></div>` but `:has(img)` does. + sel + else + [] + end + end.flatten)) + + # Older browsers support :not but only with a single complex selector. + # In order to support those browsers, we break up the contents of a :not + # unless it originally contained a selector list. + return [result] unless normalized_name == 'not' + return [result] if selector.members.length > 1 + result.selector.members.map do |seq| + Pseudo.new(syntactic_type, name, arg, CommaSequence.new([seq])) + end + end + + # The type of the selector. `:class` if this is a pseudoclass selector, + # `:element` if it's a pseudoelement. + # + # @return [Symbol] + def type + ACTUALLY_ELEMENTS.include?(normalized_name) ? :element : syntactic_type + end + + # Like \{#name\}, but without any vendor prefix. + # + # @return [String] + def normalized_name + @normalized_name ||= name.gsub(/^-[a-zA-Z0-9]+-/, '') + end + + # @see Selector#to_s + def to_s(opts = {}) + # :not() is a special case, because :not(<nothing>) should match + # everything. + return '' if name == 'not' && @selector && @selector.members.all? {|m| m.invisible?} + + res = (syntactic_type == :class ? ":" : "::") + @name + if @arg || @selector + res << "(" + res << Sass::Util.strip_except_escapes(@arg) if @arg + res << " " if @arg && @selector + res << @selector.to_s(opts) if @selector + res << ")" + end + res + end + + # Returns `nil` if this is a pseudoelement selector + # and `sels` contains a pseudoelement selector different than this one. + # + # @see SimpleSequence#unify + def unify(sels) + return if type == :element && sels.any? do |sel| + sel.is_a?(Pseudo) && sel.type == :element && + (sel.name != name || sel.arg != arg || sel.selector != selector) + end + super + end + + # Returns whether or not this selector matches all elements + # that the given selector matches (as well as possibly more). + # + # @example + # (.foo).superselector?(.foo.bar) #=> true + # (.foo).superselector?(.bar) #=> false + # @param their_sseq [SimpleSequence] + # @param parents [Array<SimpleSequence, String>] The parent selectors of `their_sseq`, if any. + # @return [Boolean] + def superselector?(their_sseq, parents = []) + case normalized_name + when 'matches', 'any' + # :matches can be a superselector of another selector in one of two + # ways. Either its constituent selectors can be a superset of those of + # another :matches in the other selector, or any of its constituent + # selectors can individually be a superselector of the other selector. + (their_sseq.selector_pseudo_classes[normalized_name] || []).any? do |their_sel| + next false unless their_sel.is_a?(Pseudo) + next false unless their_sel.name == name + selector.superselector?(their_sel.selector) + end || selector.members.any? do |our_seq| + their_seq = Sequence.new(parents + [their_sseq]) + our_seq.superselector?(their_seq) + end + when 'has', 'host', 'host-context', 'slotted' + # Like :matches, :has (et al) can be a superselector of another + # selector if its constituent selectors are a superset of those of + # another :has in the other selector. However, the :matches other case + # doesn't work, because :has refers to nested elements. + (their_sseq.selector_pseudo_classes[normalized_name] || []).any? do |their_sel| + next false unless their_sel.is_a?(Pseudo) + next false unless their_sel.name == name + selector.superselector?(their_sel.selector) + end + when 'not' + selector.members.all? do |our_seq| + their_sseq.members.any? do |their_sel| + if their_sel.is_a?(Element) || their_sel.is_a?(Id) + # `:not(a)` is a superselector of `h1` and `:not(#foo)` is a + # superselector of `#bar`. + our_sseq = our_seq.members.last + next false unless our_sseq.is_a?(SimpleSequence) + our_sseq.members.any? do |our_sel| + our_sel.class == their_sel.class && our_sel != their_sel + end + else + next false unless their_sel.is_a?(Pseudo) + next false unless their_sel.name == name + # :not(X) is a superselector of :not(Y) exactly when Y is a + # superselector of X. + their_sel.selector.superselector?(CommaSequence.new([our_seq])) + end + end + end + when 'current' + (their_sseq.selector_pseudo_classes['current'] || []).any? do |their_current| + next false if their_current.name != name + # Explicitly don't check for nested superselector relationships + # here. :current(.foo) isn't always a superselector of + # :current(.foo.bar), since it matches the *innermost* ancestor of + # the current element that matches the selector. For example: + # + # <div class="foo bar"> + # <p class="foo"> + # <span>current element</span> + # </p> + # </div> + # + # Here :current(.foo) would match the p element and *not* the div + # element, whereas :current(.foo.bar) would match the div and not + # the p. + selector == their_current.selector + end + when 'nth-child', 'nth-last-child' + their_sseq.members.any? do |their_sel| + # This misses a few edge cases. For example, `:nth-child(n of X)` + # is a superselector of `X`, and `:nth-child(2n of X)` is a + # superselector of `:nth-child(4n of X)`. These seem rare enough + # not to be worth worrying about, though. + next false unless their_sel.is_a?(Pseudo) + next false unless their_sel.name == name + next false unless their_sel.arg == arg + selector.superselector?(their_sel.selector) + end + else + throw "[BUG] Unknown selector pseudo class #{name}" + end + end + + # @see AbstractSequence#specificity + def specificity + return 1 if type == :element + return SPECIFICITY_BASE unless selector + @specificity ||= + if normalized_name == 'not' + min = 0 + max = 0 + selector.members.each do |seq| + spec = seq.specificity + if spec.is_a?(Range) + min = Sass::Util.max(spec.begin, min) + max = Sass::Util.max(spec.end, max) + else + min = Sass::Util.max(spec, min) + max = Sass::Util.max(spec, max) + end + end + min == max ? max : (min..max) + else + min = 0 + max = 0 + selector.members.each do |seq| + spec = seq.specificity + if spec.is_a?(Range) + min = Sass::Util.min(spec.begin, min) + max = Sass::Util.max(spec.end, max) + else + min = Sass::Util.min(spec, min) + max = Sass::Util.max(spec, max) + end + end + min == max ? max : (min..max) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/sequence.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/sequence.rb new file mode 100644 index 000000000000..173412a18ff5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/sequence.rb @@ -0,0 +1,661 @@ +module Sass + module Selector + # An operator-separated sequence of + # {SimpleSequence simple selector sequences}. + class Sequence < AbstractSequence + # Sets the line of the Sass template on which this selector was declared. + # This also sets the line for all child selectors. + # + # @param line [Integer] + # @return [Integer] + def line=(line) + members.each {|m| m.line = line if m.is_a?(SimpleSequence)} + @line = line + end + + # Sets the name of the file in which this selector was declared, + # or `nil` if it was not declared in a file (e.g. on stdin). + # This also sets the filename for all child selectors. + # + # @param filename [String, nil] + # @return [String, nil] + def filename=(filename) + members.each {|m| m.filename = filename if m.is_a?(SimpleSequence)} + filename + end + + # The array of {SimpleSequence simple selector sequences}, operators, and + # newlines. The operators are strings such as `"+"` and `">"` representing + # the corresponding CSS operators, or interpolated SassScript. Newlines + # are also newline strings; these aren't semantically relevant, but they + # do affect formatting. + # + # @return [Array<SimpleSequence, String|Array<Sass::Tree::Node, String>>] + attr_reader :members + + # @param seqs_and_ops [Array<SimpleSequence, String|Array<Sass::Tree::Node, String>>] + # See \{#members} + def initialize(seqs_and_ops) + @members = seqs_and_ops + end + + # Resolves the {Parent} selectors within this selector + # by replacing them with the given parent selector, + # handling commas appropriately. + # + # @param super_cseq [CommaSequence] The parent selector + # @param implicit_parent [Boolean] Whether the the parent + # selector should automatically be prepended to the resolved + # selector if it contains no parent refs. + # @return [CommaSequence] This selector, with parent references resolved + # @raise [Sass::SyntaxError] If a parent selector is invalid + def resolve_parent_refs(super_cseq, implicit_parent) + members = @members.dup + nl = (members.first == "\n" && members.shift) + contains_parent_ref = contains_parent_ref? + return CommaSequence.new([self]) if !implicit_parent && !contains_parent_ref + + unless contains_parent_ref + old_members, members = members, [] + members << nl if nl + members << SimpleSequence.new([Parent.new], false) + members += old_members + end + + CommaSequence.new(Sass::Util.paths(members.map do |sseq_or_op| + next [sseq_or_op] unless sseq_or_op.is_a?(SimpleSequence) + sseq_or_op.resolve_parent_refs(super_cseq).members + end).map do |path| + path_members = path.map do |seq_or_op| + next seq_or_op unless seq_or_op.is_a?(Sequence) + seq_or_op.members + end + if path_members.length == 2 && path_members[1][0] == "\n" + path_members[0].unshift path_members[1].shift + end + Sequence.new(path_members.flatten) + end) + end + + # Returns whether there's a {Parent} selector anywhere in this sequence. + # + # @return [Boolean] + def contains_parent_ref? + members.any? do |sseq_or_op| + next false unless sseq_or_op.is_a?(SimpleSequence) + next true if sseq_or_op.members.first.is_a?(Parent) + sseq_or_op.members.any? do |sel| + sel.is_a?(Pseudo) && sel.selector && sel.selector.contains_parent_ref? + end + end + end + + # Non-destructively extends this selector with the extensions specified in a hash + # (which should come from {Sass::Tree::Visitors::Cssize}). + # + # @param extends [Sass::Util::SubsetMap{Selector::Simple => + # Sass::Tree::Visitors::Cssize::Extend}] + # The extensions to perform on this selector + # @param parent_directives [Array<Sass::Tree::DirectiveNode>] + # The directives containing this selector. + # @param replace [Boolean] + # Whether to replace the original selector entirely or include + # it in the result. + # @param seen [Set<Array<Selector::Simple>>] + # The set of simple sequences that are currently being replaced. + # @param original [Boolean] + # Whether this is the original selector being extended, as opposed to + # the result of a previous extension that's being re-extended. + # @return [Array<Sequence>] A list of selectors generated + # by extending this selector with `extends`. + # These correspond to a {CommaSequence}'s {CommaSequence#members members array}. + # @see CommaSequence#do_extend + def do_extend(extends, parent_directives, replace, seen, original) + extended_not_expanded = members.map do |sseq_or_op| + next [[sseq_or_op]] unless sseq_or_op.is_a?(SimpleSequence) + extended = sseq_or_op.do_extend(extends, parent_directives, replace, seen) + + # The First Law of Extend says that the generated selector should have + # specificity greater than or equal to that of the original selector. + # In order to ensure that, we record the original selector's + # (`extended.first`) original specificity. + extended.first.add_sources!([self]) if original && !invisible? + + extended.map {|seq| seq.members} + end + weaves = Sass::Util.paths(extended_not_expanded).map {|path| weave(path)} + trim(weaves).map {|p| Sequence.new(p)} + end + + # Unifies this with another selector sequence to produce a selector + # that matches (a subset of) the intersection of the two inputs. + # + # @param other [Sequence] + # @return [CommaSequence, nil] The unified selector, or nil if unification failed. + # @raise [Sass::SyntaxError] If this selector cannot be unified. + # This will only ever occur when a dynamic selector, + # such as {Parent} or {Interpolation}, is used in unification. + # Since these selectors should be resolved + # by the time extension and unification happen, + # this exception will only ever be raised as a result of programmer error + def unify(other) + base = members.last + other_base = other.members.last + return unless base.is_a?(SimpleSequence) && other_base.is_a?(SimpleSequence) + return unless (unified = other_base.unify(base)) + + woven = weave([members[0...-1], other.members[0...-1] + [unified]]) + CommaSequence.new(woven.map {|w| Sequence.new(w)}) + end + + # Returns whether or not this selector matches all elements + # that the given selector matches (as well as possibly more). + # + # @example + # (.foo).superselector?(.foo.bar) #=> true + # (.foo).superselector?(.bar) #=> false + # @param cseq [Sequence] + # @return [Boolean] + def superselector?(seq) + _superselector?(members, seq.members) + end + + # @see AbstractSequence#to_s + def to_s(opts = {}) + @members.map {|m| m.is_a?(String) ? m : m.to_s(opts)}.join(" ").gsub(/ ?\n ?/, "\n") + end + + # Returns a string representation of the sequence. + # This is basically the selector string. + # + # @return [String] + def inspect + members.map {|m| m.inspect}.join(" ") + end + + # Add to the {SimpleSequence#sources} sets of the child simple sequences. + # This destructively modifies this sequence's members array, but not the + # child simple sequences. + # + # @param sources [Set<Sequence>] + def add_sources!(sources) + members.map! {|m| m.is_a?(SimpleSequence) ? m.with_more_sources(sources) : m} + end + + # Converts the subject operator "!", if it exists, into a ":has()" + # selector. + # + # @retur [Sequence] + def subjectless + pre_subject = [] + has = [] + subject = nil + members.each do |sseq_or_op| + if subject + has << sseq_or_op + elsif sseq_or_op.is_a?(String) || !sseq_or_op.subject? + pre_subject << sseq_or_op + else + subject = sseq_or_op.dup + subject.members = sseq_or_op.members.dup + subject.subject = false + has = [] + end + end + + return self unless subject + + unless has.empty? + subject.members << Pseudo.new(:class, 'has', nil, CommaSequence.new([Sequence.new(has)])) + end + Sequence.new(pre_subject + [subject]) + end + + private + + # Conceptually, this expands "parenthesized selectors". That is, if we + # have `.A .B {@extend .C}` and `.D .C {...}`, this conceptually expands + # into `.D .C, .D (.A .B)`, and this function translates `.D (.A .B)` into + # `.D .A .B, .A .D .B`. For thoroughness, `.A.D .B` would also be + # required, but including merged selectors results in exponential output + # for very little gain. + # + # @param path [Array<Array<SimpleSequence or String>>] + # A list of parenthesized selector groups. + # @return [Array<Array<SimpleSequence or String>>] A list of fully-expanded selectors. + def weave(path) + # This function works by moving through the selector path left-to-right, + # building all possible prefixes simultaneously. + prefixes = [[]] + + path.each do |current| + next if current.empty? + current = current.dup + last_current = [current.pop] + prefixes = prefixes.map do |prefix| + sub = subweave(prefix, current) + next [] unless sub + sub.map {|seqs| seqs + last_current} + end.flatten(1) + end + prefixes + end + + # This interweaves two lists of selectors, + # returning all possible orderings of them (including using unification) + # that maintain the relative ordering of the input arrays. + # + # For example, given `.foo .bar` and `.baz .bang`, + # this would return `.foo .bar .baz .bang`, `.foo .bar.baz .bang`, + # `.foo .baz .bar .bang`, `.foo .baz .bar.bang`, `.foo .baz .bang .bar`, + # and so on until `.baz .bang .foo .bar`. + # + # Semantically, for selectors A and B, this returns all selectors `AB_i` + # such that the union over all i of elements matched by `AB_i X` is + # identical to the intersection of all elements matched by `A X` and all + # elements matched by `B X`. Some `AB_i` are elided to reduce the size of + # the output. + # + # @param seq1 [Array<SimpleSequence or String>] + # @param seq2 [Array<SimpleSequence or String>] + # @return [Array<Array<SimpleSequence or String>>] + def subweave(seq1, seq2) + return [seq2] if seq1.empty? + return [seq1] if seq2.empty? + + seq1, seq2 = seq1.dup, seq2.dup + return unless (init = merge_initial_ops(seq1, seq2)) + return unless (fin = merge_final_ops(seq1, seq2)) + + # Make sure there's only one root selector in the output. + root1 = has_root?(seq1.first) && seq1.shift + root2 = has_root?(seq2.first) && seq2.shift + if root1 && root2 + return unless (root = root1.unify(root2)) + seq1.unshift root + seq2.unshift root + elsif root1 + seq2.unshift root1 + elsif root2 + seq1.unshift root2 + end + + seq1 = group_selectors(seq1) + seq2 = group_selectors(seq2) + lcs = Sass::Util.lcs(seq2, seq1) do |s1, s2| + next s1 if s1 == s2 + next unless s1.first.is_a?(SimpleSequence) && s2.first.is_a?(SimpleSequence) + next s2 if parent_superselector?(s1, s2) + next s1 if parent_superselector?(s2, s1) + next unless must_unify?(s1, s2) + next unless (unified = Sequence.new(s1).unify(Sequence.new(s2))) + unified.members.first.members if unified.members.length == 1 + end + + diff = [[init]] + + until lcs.empty? + diff << chunks(seq1, seq2) {|s| parent_superselector?(s.first, lcs.first)} << [lcs.shift] + seq1.shift + seq2.shift + end + diff << chunks(seq1, seq2) {|s| s.empty?} + diff += fin.map {|sel| sel.is_a?(Array) ? sel : [sel]} + diff.reject! {|c| c.empty?} + + Sass::Util.paths(diff).map {|p| p.flatten}.reject {|p| path_has_two_subjects?(p)} + end + + # Extracts initial selector combinators (`"+"`, `">"`, `"~"`, and `"\n"`) + # from two sequences and merges them together into a single array of + # selector combinators. + # + # @param seq1 [Array<SimpleSequence or String>] + # @param seq2 [Array<SimpleSequence or String>] + # @return [Array<String>, nil] If there are no operators in the merged + # sequence, this will be the empty array. If the operators cannot be + # merged, this will be nil. + def merge_initial_ops(seq1, seq2) + ops1, ops2 = [], [] + ops1 << seq1.shift while seq1.first.is_a?(String) + ops2 << seq2.shift while seq2.first.is_a?(String) + + newline = false + newline ||= !!ops1.shift if ops1.first == "\n" + newline ||= !!ops2.shift if ops2.first == "\n" + + # If neither sequence is a subsequence of the other, they cannot be + # merged successfully + lcs = Sass::Util.lcs(ops1, ops2) + return unless lcs == ops1 || lcs == ops2 + (newline ? ["\n"] : []) + (ops1.size > ops2.size ? ops1 : ops2) + end + + # Extracts final selector combinators (`"+"`, `">"`, `"~"`) and the + # selectors to which they apply from two sequences and merges them + # together into a single array. + # + # @param seq1 [Array<SimpleSequence or String>] + # @param seq2 [Array<SimpleSequence or String>] + # @return [Array<SimpleSequence or String or + # Array<Array<SimpleSequence or String>>] + # If there are no trailing combinators to be merged, this will be the + # empty array. If the trailing combinators cannot be merged, this will + # be nil. Otherwise, this will contained the merged selector. Array + # elements are [Sass::Util#paths]-style options; conceptually, an "or" + # of multiple selectors. + def merge_final_ops(seq1, seq2, res = []) + ops1, ops2 = [], [] + ops1 << seq1.pop while seq1.last.is_a?(String) + ops2 << seq2.pop while seq2.last.is_a?(String) + + # Not worth the headache of trying to preserve newlines here. The most + # important use of newlines is at the beginning of the selector to wrap + # across lines anyway. + ops1.reject! {|o| o == "\n"} + ops2.reject! {|o| o == "\n"} + + return res if ops1.empty? && ops2.empty? + if ops1.size > 1 || ops2.size > 1 + # If there are multiple operators, something hacky's going on. If one + # is a supersequence of the other, use that, otherwise give up. + lcs = Sass::Util.lcs(ops1, ops2) + return unless lcs == ops1 || lcs == ops2 + res.unshift(*(ops1.size > ops2.size ? ops1 : ops2).reverse) + return res + end + + # This code looks complicated, but it's actually just a bunch of special + # cases for interactions between different combinators. + op1, op2 = ops1.first, ops2.first + if op1 && op2 + sel1 = seq1.pop + sel2 = seq2.pop + if op1 == '~' && op2 == '~' + if sel1.superselector?(sel2) + res.unshift sel2, '~' + elsif sel2.superselector?(sel1) + res.unshift sel1, '~' + else + merged = sel1.unify(sel2) + res.unshift [ + [sel1, '~', sel2, '~'], + [sel2, '~', sel1, '~'], + ([merged, '~'] if merged) + ].compact + end + elsif (op1 == '~' && op2 == '+') || (op1 == '+' && op2 == '~') + if op1 == '~' + tilde_sel, plus_sel = sel1, sel2 + else + tilde_sel, plus_sel = sel2, sel1 + end + + if tilde_sel.superselector?(plus_sel) + res.unshift plus_sel, '+' + else + merged = plus_sel.unify(tilde_sel) + res.unshift [ + [tilde_sel, '~', plus_sel, '+'], + ([merged, '+'] if merged) + ].compact + end + elsif op1 == '>' && %w(~ +).include?(op2) + res.unshift sel2, op2 + seq1.push sel1, op1 + elsif op2 == '>' && %w(~ +).include?(op1) + res.unshift sel1, op1 + seq2.push sel2, op2 + elsif op1 == op2 + merged = sel1.unify(sel2) + return unless merged + res.unshift merged, op1 + else + # Unknown selector combinators can't be unified + return + end + return merge_final_ops(seq1, seq2, res) + elsif op1 + seq2.pop if op1 == '>' && seq2.last && seq2.last.superselector?(seq1.last) + res.unshift seq1.pop, op1 + return merge_final_ops(seq1, seq2, res) + else # op2 + seq1.pop if op2 == '>' && seq1.last && seq1.last.superselector?(seq2.last) + res.unshift seq2.pop, op2 + return merge_final_ops(seq1, seq2, res) + end + end + + # Takes initial subsequences of `seq1` and `seq2` and returns all + # orderings of those subsequences. The initial subsequences are determined + # by a block. + # + # Destructively removes the initial subsequences of `seq1` and `seq2`. + # + # For example, given `(A B C | D E)` and `(1 2 | 3 4 5)` (with `|` + # denoting the boundary of the initial subsequence), this would return + # `[(A B C 1 2), (1 2 A B C)]`. The sequences would then be `(D E)` and + # `(3 4 5)`. + # + # @param seq1 [Array] + # @param seq2 [Array] + # @yield [a] Used to determine when to cut off the initial subsequences. + # Called repeatedly for each sequence until it returns true. + # @yieldparam a [Array] A final subsequence of one input sequence after + # cutting off some initial subsequence. + # @yieldreturn [Boolean] Whether or not to cut off the initial subsequence + # here. + # @return [Array<Array>] All possible orderings of the initial subsequences. + def chunks(seq1, seq2) + chunk1 = [] + chunk1 << seq1.shift until yield seq1 + chunk2 = [] + chunk2 << seq2.shift until yield seq2 + return [] if chunk1.empty? && chunk2.empty? + return [chunk2] if chunk1.empty? + return [chunk1] if chunk2.empty? + [chunk1 + chunk2, chunk2 + chunk1] + end + + # Groups a sequence into subsequences. The subsequences are determined by + # strings; adjacent non-string elements will be put into separate groups, + # but any element adjacent to a string will be grouped with that string. + # + # For example, `(A B "C" D E "F" G "H" "I" J)` will become `[(A) (B "C" D) + # (E "F" G "H" "I" J)]`. + # + # @param seq [Array] + # @return [Array<Array>] + def group_selectors(seq) + newseq = [] + tail = seq.dup + until tail.empty? + head = [] + begin + head << tail.shift + end while !tail.empty? && head.last.is_a?(String) || tail.first.is_a?(String) + newseq << head + end + newseq + end + + # Given two selector sequences, returns whether `seq1` is a + # superselector of `seq2`; that is, whether `seq1` matches every + # element `seq2` matches. + # + # @param seq1 [Array<SimpleSequence or String>] + # @param seq2 [Array<SimpleSequence or String>] + # @return [Boolean] + def _superselector?(seq1, seq2) + seq1 = seq1.reject {|e| e == "\n"} + seq2 = seq2.reject {|e| e == "\n"} + # Selectors with leading or trailing operators are neither + # superselectors nor subselectors. + return if seq1.last.is_a?(String) || seq2.last.is_a?(String) || + seq1.first.is_a?(String) || seq2.first.is_a?(String) + # More complex selectors are never superselectors of less complex ones + return if seq1.size > seq2.size + return seq1.first.superselector?(seq2.last, seq2[0...-1]) if seq1.size == 1 + + _, si = seq2.each_with_index.find do |e, i| + return if i == seq2.size - 1 + next if e.is_a?(String) + seq1.first.superselector?(e, seq2[0...i]) + end + return unless si + + if seq1[1].is_a?(String) + return unless seq2[si + 1].is_a?(String) + + # .foo ~ .bar is a superselector of .foo + .bar + return unless seq1[1] == "~" ? seq2[si + 1] != ">" : seq1[1] == seq2[si + 1] + + # .foo > .baz is not a superselector of .foo > .bar > .baz or .foo > + # .bar .baz, despite the fact that .baz is a superselector of .bar > + # .baz and .bar .baz. Same goes for + and ~. + return if seq1.length == 3 && seq2.length > 3 + + return _superselector?(seq1[2..-1], seq2[si + 2..-1]) + elsif seq2[si + 1].is_a?(String) + return unless seq2[si + 1] == ">" + return _superselector?(seq1[1..-1], seq2[si + 2..-1]) + else + return _superselector?(seq1[1..-1], seq2[si + 1..-1]) + end + end + + # Like \{#_superselector?}, but compares the selectors in the + # context of parent selectors, as though they shared an implicit + # base simple selector. For example, `B` is not normally a + # superselector of `B A`, since it doesn't match `A` elements. + # However, it is a parent superselector, since `B X` is a + # superselector of `B A X`. + # + # @param seq1 [Array<SimpleSequence or String>] + # @param seq2 [Array<SimpleSequence or String>] + # @return [Boolean] + def parent_superselector?(seq1, seq2) + base = Sass::Selector::SimpleSequence.new([Sass::Selector::Placeholder.new('<temp>')], + false) + _superselector?(seq1 + [base], seq2 + [base]) + end + + # Returns whether two selectors must be unified to produce a valid + # combined selector. This is true when both selectors contain the same + # unique simple selector such as an id. + # + # @param seq1 [Array<SimpleSequence or String>] + # @param seq2 [Array<SimpleSequence or String>] + # @return [Boolean] + def must_unify?(seq1, seq2) + unique_selectors = seq1.map do |sseq| + next [] if sseq.is_a?(String) + sseq.members.select {|sel| sel.unique?} + end.flatten.to_set + + return false if unique_selectors.empty? + + seq2.any? do |sseq| + next false if sseq.is_a?(String) + sseq.members.any? do |sel| + next unless sel.unique? + unique_selectors.include?(sel) + end + end + end + + # Removes redundant selectors from between multiple lists of + # selectors. This takes a list of lists of selector sequences; + # each individual list is assumed to have no redundancy within + # itself. A selector is only removed if it's redundant with a + # selector in another list. + # + # "Redundant" here means that one selector is a superselector of + # the other. The more specific selector is removed. + # + # @param seqses [Array<Array<Array<SimpleSequence or String>>>] + # @return [Array<Array<SimpleSequence or String>>] + def trim(seqses) + # Avoid truly horrific quadratic behavior. TODO: I think there + # may be a way to get perfect trimming without going quadratic. + return seqses.flatten(1) if seqses.size > 100 + + # Keep the results in a separate array so we can be sure we aren't + # comparing against an already-trimmed selector. This ensures that two + # identical selectors don't mutually trim one another. + result = seqses.dup + + # This is n^2 on the sequences, but only comparing between + # separate sequences should limit the quadratic behavior. + seqses.each_with_index do |seqs1, i| + result[i] = seqs1.reject do |seq1| + # The maximum specificity of the sources that caused [seq1] to be + # generated. In order for [seq1] to be removed, there must be + # another selector that's a superselector of it *and* that has + # specificity greater or equal to this. + max_spec = _sources(seq1).map do |seq| + spec = seq.specificity + spec.is_a?(Range) ? spec.max : spec + end.max || 0 + + result.any? do |seqs2| + next if seqs1.equal?(seqs2) + # Second Law of Extend: the specificity of a generated selector + # should never be less than the specificity of the extending + # selector. + # + # See https://github.com/nex3/sass/issues/324. + seqs2.any? do |seq2| + spec2 = _specificity(seq2) + spec2 = spec2.begin if spec2.is_a?(Range) + spec2 >= max_spec && _superselector?(seq2, seq1) + end + end + end + end + result.flatten(1) + end + + def _hash + members.reject {|m| m == "\n"}.hash + end + + def _eql?(other) + other.members.reject {|m| m == "\n"}.eql?(members.reject {|m| m == "\n"}) + end + + def path_has_two_subjects?(path) + subject = false + path.each do |sseq_or_op| + next unless sseq_or_op.is_a?(SimpleSequence) + next unless sseq_or_op.subject? + return true if subject + subject = true + end + false + end + + def _sources(seq) + s = Set.new + seq.map {|sseq_or_op| s.merge sseq_or_op.sources if sseq_or_op.is_a?(SimpleSequence)} + s + end + + def extended_not_expanded_to_s(extended_not_expanded) + extended_not_expanded.map do |choices| + choices = choices.map do |sel| + next sel.first.to_s if sel.size == 1 + "#{sel.join ' '}" + end + next choices.first if choices.size == 1 && !choices.include?(' ') + "(#{choices.join ', '})" + end.join ' ' + end + + def has_root?(sseq) + sseq.is_a?(SimpleSequence) && + sseq.members.any? {|sel| sel.is_a?(Pseudo) && sel.normalized_name == "root"} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/simple.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/simple.rb new file mode 100644 index 000000000000..dff4b8a36a57 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/simple.rb @@ -0,0 +1,124 @@ +module Sass + module Selector + # The abstract superclass for simple selectors + # (that is, those that don't compose multiple selectors). + class Simple + # The line of the Sass template on which this selector was declared. + # + # @return [Integer] + attr_accessor :line + + # The name of the file in which this selector was declared, + # or `nil` if it was not declared in a file (e.g. on stdin). + # + # @return [String, nil] + attr_accessor :filename + + # Whether only one instance of this simple selector is allowed in a given + # complex selector. + # + # @return [Boolean] + def unique? + false + end + + # @see #to_s + # + # @return [String] + def inspect + to_s + end + + # Returns the selector string. + # + # @param opts [Hash] rendering options. + # @option opts [Symbol] :style The css rendering style. + # @return [String] + def to_s(opts = {}) + Sass::Util.abstract(self) + end + + # Returns a hash code for this selector object. + # + # By default, this is based on the value of \{#to\_a}, + # so if that contains information irrelevant to the identity of the selector, + # this should be overridden. + # + # @return [Integer] + def hash + @_hash ||= equality_key.hash + end + + # Checks equality between this and another object. + # + # By default, this is based on the value of \{#to\_a}, + # so if that contains information irrelevant to the identity of the selector, + # this should be overridden. + # + # @param other [Object] The object to test equality against + # @return [Boolean] Whether or not this is equal to `other` + def eql?(other) + other.class == self.class && other.hash == hash && other.equality_key == equality_key + end + alias_method :==, :eql? + + # Unifies this selector with a {SimpleSequence}'s {SimpleSequence#members members array}, + # returning another `SimpleSequence` members array + # that matches both this selector and the input selector. + # + # By default, this just appends this selector to the end of the array + # (or returns the original array if this selector already exists in it). + # + # @param sels [Array<Simple>] A {SimpleSequence}'s {SimpleSequence#members members array} + # @return [Array<Simple>, nil] A {SimpleSequence} {SimpleSequence#members members array} + # matching both `sels` and this selector, + # or `nil` if this is impossible (e.g. unifying `#foo` and `#bar`) + # @raise [Sass::SyntaxError] If this selector cannot be unified. + # This will only ever occur when a dynamic selector, + # such as {Parent} or {Interpolation}, is used in unification. + # Since these selectors should be resolved + # by the time extension and unification happen, + # this exception will only ever be raised as a result of programmer error + def unify(sels) + return sels.first.unify([self]) if sels.length == 1 && sels.first.is_a?(Universal) + return sels if sels.any? {|sel2| eql?(sel2)} + if !is_a?(Pseudo) || (sels.last.is_a?(Pseudo) && sels.last.type == :element) + _, i = sels.each_with_index.find {|sel, _| sel.is_a?(Pseudo)} + end + return sels + [self] unless i + sels[0...i] + [self] + sels[i..-1] + end + + protected + + # Returns the key used for testing whether selectors are equal. + # + # This is a cached version of \{#to\_s}. + # + # @return [String] + def equality_key + @equality_key ||= to_s + end + + # Unifies two namespaces, + # returning a namespace that works for both of them if possible. + # + # @param ns1 [String, nil] The first namespace. + # `nil` means none specified, e.g. `foo`. + # The empty string means no namespace specified, e.g. `|foo`. + # `"*"` means any namespace is allowed, e.g. `*|foo`. + # @param ns2 [String, nil] The second namespace. See `ns1`. + # @return [Array(String or nil, Boolean)] + # The first value is the unified namespace, or `nil` for no namespace. + # The second value is whether or not a namespace that works for both inputs + # could be found at all. + # If the second value is `false`, the first should be ignored. + def unify_namespaces(ns1, ns2) + return ns2, true if ns1 == '*' + return ns1, true if ns2 == '*' + return nil, false unless ns1 == ns2 + [ns1, true] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/simple_sequence.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/simple_sequence.rb new file mode 100644 index 000000000000..13a65d885342 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/selector/simple_sequence.rb @@ -0,0 +1,348 @@ +module Sass + module Selector + # A unseparated sequence of selectors + # that all apply to a single element. + # For example, `.foo#bar[attr=baz]` is a simple sequence + # of the selectors `.foo`, `#bar`, and `[attr=baz]`. + class SimpleSequence < AbstractSequence + # The array of individual selectors. + # + # @return [Array<Simple>] + attr_accessor :members + + # The extending selectors that caused this selector sequence to be + # generated. For example: + # + # a.foo { ... } + # b.bar {@extend a} + # c.baz {@extend b} + # + # The generated selector `b.foo.bar` has `{b.bar}` as its `sources` set, + # and the generated selector `c.foo.bar.baz` has `{b.bar, c.baz}` as its + # `sources` set. + # + # This is populated during the {Sequence#do_extend} process. + # + # @return {Set<Sequence>} + attr_accessor :sources + + # This sequence source range. + # + # @return [Sass::Source::Range] + attr_accessor :source_range + + # @see \{#subject?} + attr_writer :subject + + # Returns the element or universal selector in this sequence, + # if it exists. + # + # @return [Element, Universal, nil] + def base + @base ||= (members.first if members.first.is_a?(Element) || members.first.is_a?(Universal)) + end + + def pseudo_elements + @pseudo_elements ||= members.select {|sel| sel.is_a?(Pseudo) && sel.type == :element} + end + + def selector_pseudo_classes + @selector_pseudo_classes ||= members. + select {|sel| sel.is_a?(Pseudo) && sel.type == :class && sel.selector}. + group_by {|sel| sel.normalized_name} + end + + # Returns the non-base, non-pseudo-element selectors in this sequence. + # + # @return [Set<Simple>] + def rest + @rest ||= Set.new(members - [base] - pseudo_elements) + end + + # Whether or not this compound selector is the subject of the parent + # selector; that is, whether it is prepended with `$` and represents the + # actual element that will be selected. + # + # @return [Boolean] + def subject? + @subject + end + + # @param selectors [Array<Simple>] See \{#members} + # @param subject [Boolean] See \{#subject?} + # @param source_range [Sass::Source::Range] + def initialize(selectors, subject, source_range = nil) + @members = selectors + @subject = subject + @sources = Set.new + @source_range = source_range + end + + # Resolves the {Parent} selectors within this selector + # by replacing them with the given parent selector, + # handling commas appropriately. + # + # @param super_cseq [CommaSequence] The parent selector + # @return [CommaSequence] This selector, with parent references resolved + # @raise [Sass::SyntaxError] If a parent selector is invalid + def resolve_parent_refs(super_cseq) + resolved_members = @members.map do |sel| + next sel unless sel.is_a?(Pseudo) && sel.selector + sel.with_selector(sel.selector.resolve_parent_refs(super_cseq, false)) + end.flatten + + # Parent selector only appears as the first selector in the sequence + unless (parent = resolved_members.first).is_a?(Parent) + return CommaSequence.new([Sequence.new([SimpleSequence.new(resolved_members, subject?)])]) + end + + return super_cseq if @members.size == 1 && parent.suffix.nil? + + CommaSequence.new(super_cseq.members.map do |super_seq| + members = super_seq.members.dup + newline = members.pop if members.last == "\n" + unless members.last.is_a?(SimpleSequence) + raise Sass::SyntaxError.new("Invalid parent selector for \"#{self}\": \"" + + super_seq.to_s + '"') + end + + parent_sub = members.last.members + unless parent.suffix.nil? + parent_sub = parent_sub.dup + parent_sub[-1] = parent_sub.last.dup + case parent_sub.last + when Sass::Selector::Class, Sass::Selector::Id, Sass::Selector::Placeholder + parent_sub[-1] = parent_sub.last.class.new(parent_sub.last.name + parent.suffix) + when Sass::Selector::Element + parent_sub[-1] = parent_sub.last.class.new( + parent_sub.last.name + parent.suffix, + parent_sub.last.namespace) + when Sass::Selector::Pseudo + if parent_sub.last.arg || parent_sub.last.selector + raise Sass::SyntaxError.new("Invalid parent selector for \"#{self}\": \"" + + super_seq.to_s + '"') + end + parent_sub[-1] = Sass::Selector::Pseudo.new( + parent_sub.last.type, + parent_sub.last.name + parent.suffix, + nil, nil) + else + raise Sass::SyntaxError.new("Invalid parent selector for \"#{self}\": \"" + + super_seq.to_s + '"') + end + end + + Sequence.new(members[0...-1] + + [SimpleSequence.new(parent_sub + resolved_members[1..-1], subject?)] + + [newline].compact) + end) + end + + # Non-destructively extends this selector with the extensions specified in a hash + # (which should come from {Sass::Tree::Visitors::Cssize}). + # + # @param extends [{Selector::Simple => + # Sass::Tree::Visitors::Cssize::Extend}] + # The extensions to perform on this selector + # @param parent_directives [Array<Sass::Tree::DirectiveNode>] + # The directives containing this selector. + # @param seen [Set<Array<Selector::Simple>>] + # The set of simple sequences that are currently being replaced. + # @param original [Boolean] + # Whether this is the original selector being extended, as opposed to + # the result of a previous extension that's being re-extended. + # @return [Array<Sequence>] A list of selectors generated + # by extending this selector with `extends`. + # @see CommaSequence#do_extend + def do_extend(extends, parent_directives, replace, seen) + seen_with_pseudo_selectors = seen.dup + + modified_original = false + members = self.members.map do |sel| + next sel unless sel.is_a?(Pseudo) && sel.selector + next sel if seen.include?([sel]) + extended = sel.selector.do_extend(extends, parent_directives, replace, seen, false) + next sel if extended == sel.selector + extended.members.reject! {|seq| seq.invisible?} + + # For `:not()`, we usually want to get rid of any complex + # selectors because that will cause the selector to fail to + # parse on all browsers at time of writing. We can keep them + # if either the original selector had a complex selector, or + # the result of extending has only complex selectors, + # because either way we aren't breaking anything that isn't + # already broken. + if sel.normalized_name == 'not' && + (sel.selector.members.none? {|seq| seq.members.length > 1} && + extended.members.any? {|seq| seq.members.length == 1}) + extended.members.reject! {|seq| seq.members.length > 1} + end + + modified_original = true + result = sel.with_selector(extended) + result.each {|new_sel| seen_with_pseudo_selectors << [new_sel]} + result + end.flatten + + groups = extends[members.to_set].group_by {|ex| ex.extender}.to_a + groups.map! do |seq, group| + sels = group.map {|e| e.target}.flatten + # If A {@extend B} and C {...}, + # seq is A, sels is B, and self is C + + self_without_sel = Sass::Util.array_minus(members, sels) + group.each {|e| e.success = true} + unified = seq.members.last.unify(SimpleSequence.new(self_without_sel, subject?)) + next unless unified + group.each {|e| check_directives_match!(e, parent_directives)} + new_seq = Sequence.new(seq.members[0...-1] + [unified]) + new_seq.add_sources!(sources + [seq]) + [sels, new_seq] + end + groups.compact! + groups.map! do |sels, seq| + next [] if seen.include?(sels) + seq.do_extend( + extends, parent_directives, false, seen_with_pseudo_selectors + [sels], false) + end + groups.flatten! + + if modified_original || !replace || groups.empty? + # First Law of Extend: the result of extending a selector should + # (almost) always contain the base selector. + # + # See https://github.com/nex3/sass/issues/324. + original = Sequence.new([SimpleSequence.new(members, @subject, source_range)]) + original.add_sources! sources + groups.unshift original + end + groups.uniq! + groups + end + + # Unifies this selector with another {SimpleSequence}, returning + # another `SimpleSequence` that is a subselector of both input + # selectors. + # + # @param other [SimpleSequence] + # @return [SimpleSequence, nil] A {SimpleSequence} matching both `sels` and this selector, + # or `nil` if this is impossible (e.g. unifying `#foo` and `#bar`) + # @raise [Sass::SyntaxError] If this selector cannot be unified. + # This will only ever occur when a dynamic selector, + # such as {Parent} or {Interpolation}, is used in unification. + # Since these selectors should be resolved + # by the time extension and unification happen, + # this exception will only ever be raised as a result of programmer error + def unify(other) + sseq = members.inject(other.members) do |member, sel| + return unless member + sel.unify(member) + end + return unless sseq + SimpleSequence.new(sseq, other.subject? || subject?) + end + + # Returns whether or not this selector matches all elements + # that the given selector matches (as well as possibly more). + # + # @example + # (.foo).superselector?(.foo.bar) #=> true + # (.foo).superselector?(.bar) #=> false + # @param their_sseq [SimpleSequence] + # @param parents [Array<SimpleSequence, String>] The parent selectors of `their_sseq`, if any. + # @return [Boolean] + def superselector?(their_sseq, parents = []) + return false unless base.nil? || base.eql?(their_sseq.base) + return false unless pseudo_elements.eql?(their_sseq.pseudo_elements) + our_spcs = selector_pseudo_classes + their_spcs = their_sseq.selector_pseudo_classes + + # Some psuedo-selectors can be subselectors of non-pseudo selectors. + # Pull those out here so we can efficiently check against them below. + their_subselector_pseudos = %w(matches any nth-child nth-last-child). + map {|name| their_spcs[name] || []}.flatten + + # If `self`'s non-pseudo simple selectors aren't a subset of `their_sseq`'s, + # it's definitely not a superselector. This also considers being matched + # by `:matches` or `:any`. + return false unless rest.all? do |our_sel| + next true if our_sel.is_a?(Pseudo) && our_sel.selector + next true if their_sseq.rest.include?(our_sel) + their_subselector_pseudos.any? do |their_pseudo| + their_pseudo.selector.members.all? do |their_seq| + next false unless their_seq.members.length == 1 + their_sseq = their_seq.members.first + next false unless their_sseq.is_a?(SimpleSequence) + their_sseq.rest.include?(our_sel) + end + end + end + + our_spcs.all? do |_name, pseudos| + pseudos.all? {|pseudo| pseudo.superselector?(their_sseq, parents)} + end + end + + # @see Simple#to_s + def to_s(opts = {}) + res = @members.map {|m| m.to_s(opts)}.join + + # :not(%foo) may resolve to the empty string, but it should match every + # selector so we replace it with "*". + res = '*' if res.empty? + + res << '!' if subject? + res + end + + # Returns a string representation of the sequence. + # This is basically the selector string. + # + # @return [String] + def inspect + res = members.map {|m| m.inspect}.join + res << '!' if subject? + res + end + + # Return a copy of this simple sequence with `sources` merged into the + # {SimpleSequence#sources} set. + # + # @param sources [Set<Sequence>] + # @return [SimpleSequence] + def with_more_sources(sources) + sseq = dup + sseq.members = members.dup + sseq.sources = self.sources | sources + sseq + end + + private + + def check_directives_match!(extend, parent_directives) + dirs1 = extend.directives.map {|d| d.resolved_value} + dirs2 = parent_directives.map {|d| d.resolved_value} + return if Sass::Util.subsequence?(dirs1, dirs2) + line = extend.node.line + filename = extend.node.filename + + # TODO(nweiz): this should use the Sass stack trace of the extend node, + # not the selector. + raise Sass::SyntaxError.new(<<MESSAGE) +You may not @extend an outer selector from within #{extend.directives.last.name}. +You may only @extend selectors within the same directive. +From "@extend #{extend.target.join(', ')}" on line #{line}#{" of #{filename}" if filename}. +MESSAGE + end + + def _hash + [base, rest.hash].hash + end + + def _eql?(other) + other.base.eql?(base) && other.pseudo_elements == pseudo_elements && + other.rest.eql?(rest) && other.subject? == subject? + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/shared.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/shared.rb new file mode 100644 index 000000000000..1f50995a15d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/shared.rb @@ -0,0 +1,76 @@ +module Sass + # This module contains functionality that's shared between Haml and Sass. + module Shared + extend self + + # Scans through a string looking for the interoplation-opening `#{` + # and, when it's found, yields the scanner to the calling code + # so it can handle it properly. + # + # The scanner will have any backslashes immediately in front of the `#{` + # as the second capture group (`scan[2]`), + # and the text prior to that as the first (`scan[1]`). + # + # @yieldparam scan [StringScanner] The scanner scanning through the string + # @return [String] The text remaining in the scanner after all `#{`s have been processed + def handle_interpolation(str) + scan = Sass::Util::MultibyteStringScanner.new(str) + yield scan while scan.scan(/(.*?)(\\*)\#\{/m) + scan.rest + end + + # Moves a scanner through a balanced pair of characters. + # For example: + # + # Foo (Bar (Baz bang) bop) (Bang (bop bip)) + # ^ ^ + # from to + # + # @param scanner [StringScanner] The string scanner to move + # @param start [Character] The character opening the balanced pair. + # A `Fixnum` in 1.8, a `String` in 1.9 + # @param finish [Character] The character closing the balanced pair. + # A `Fixnum` in 1.8, a `String` in 1.9 + # @param count [Integer] The number of opening characters matched + # before calling this method + # @return [(String, String)] The string matched within the balanced pair + # and the rest of the string. + # `["Foo (Bar (Baz bang) bop)", " (Bang (bop bip))"]` in the example above. + def balance(scanner, start, finish, count = 0) + str = '' + scanner = Sass::Util::MultibyteStringScanner.new(scanner) unless scanner.is_a? StringScanner + regexp = Regexp.new("(.*?)[\\#{start.chr}\\#{finish.chr}]", Regexp::MULTILINE) + while scanner.scan(regexp) + str << scanner.matched + count += 1 if scanner.matched[-1] == start + count -= 1 if scanner.matched[-1] == finish + return [str, scanner.rest] if count == 0 + end + end + + # Formats a string for use in error messages about indentation. + # + # @param indentation [String] The string used for indentation + # @param was [Boolean] Whether or not to add `"was"` or `"were"` + # (depending on how many characters were in `indentation`) + # @return [String] The name of the indentation (e.g. `"12 spaces"`, `"1 tab"`) + def human_indentation(indentation, was = false) + if !indentation.include?(?\t) + noun = 'space' + elsif !indentation.include?(?\s) + noun = 'tab' + else + return indentation.inspect + (was ? ' was' : '') + end + + singular = indentation.length == 1 + if was + was = singular ? ' was' : ' were' + else + was = '' + end + + "#{indentation.length} #{noun}#{'s' unless singular}#{was}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/source/map.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/source/map.rb new file mode 100644 index 000000000000..80393cc552aa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/source/map.rb @@ -0,0 +1,209 @@ +module Sass::Source + class Map + # A mapping from one source range to another. Indicates that `input` was + # compiled to `output`. + # + # @!attribute input + # @return [Sass::Source::Range] The source range in the input document. + # + # @!attribute output + # @return [Sass::Source::Range] The source range in the output document. + class Mapping < Struct.new(:input, :output) + # @return [String] A string representation of the mapping. + def inspect + "#{input.inspect} => #{output.inspect}" + end + end + + # The mapping data ordered by the location in the target. + # + # @return [Array<Mapping>] + attr_reader :data + + def initialize + @data = [] + end + + # Adds a new mapping from one source range to another. Multiple invocations + # of this method should have each `output` range come after all previous ranges. + # + # @param input [Sass::Source::Range] + # The source range in the input document. + # @param output [Sass::Source::Range] + # The source range in the output document. + def add(input, output) + @data.push(Mapping.new(input, output)) + end + + # Shifts all output source ranges forward one or more lines. + # + # @param delta [Integer] The number of lines to shift the ranges forward. + def shift_output_lines(delta) + return if delta == 0 + @data.each do |m| + m.output.start_pos.line += delta + m.output.end_pos.line += delta + end + end + + # Shifts any output source ranges that lie on the first line forward one or + # more characters on that line. + # + # @param delta [Integer] The number of characters to shift the ranges + # forward. + def shift_output_offsets(delta) + return if delta == 0 + @data.each do |m| + break if m.output.start_pos.line > 1 + m.output.start_pos.offset += delta + m.output.end_pos.offset += delta if m.output.end_pos.line > 1 + end + end + + # Returns the standard JSON representation of the source map. + # + # If the `:css_uri` option isn't specified, the `:css_path` and + # `:sourcemap_path` options must both be specified. Any options may also be + # specified alongside the `:css_uri` option. If `:css_uri` isn't specified, + # it will be inferred from `:css_path` and `:sourcemap_path` using the + # assumption that the local file system has the same layout as the server. + # + # Regardless of which options are passed to this method, source stylesheets + # that are imported using a non-default importer will only be linked to in + # the source map if their importers implement + # \{Sass::Importers::Base#public\_url\}. + # + # @option options :css_uri [String] + # The publicly-visible URI of the CSS output file. + # @option options :css_path [String] + # The local path of the CSS output file. + # @option options :sourcemap_path [String] + # The (eventual) local path of the sourcemap file. + # @option options :type [Symbol] + # `:auto` (default), `:file`, or `:inline`. + # @return [String] The JSON string. + # @raise [ArgumentError] If neither `:css_uri` nor `:css_path` and + # `:sourcemap_path` are specified. + def to_json(options) + css_uri, css_path, sourcemap_path = + options[:css_uri], options[:css_path], options[:sourcemap_path] + unless css_uri || (css_path && sourcemap_path) + raise ArgumentError.new("Sass::Source::Map#to_json requires either " \ + "the :css_uri option or both the :css_path and :soucemap_path options.") + end + css_path &&= Sass::Util.pathname(File.absolute_path(css_path)) + sourcemap_path &&= Sass::Util.pathname(File.absolute_path(sourcemap_path)) + css_uri ||= Sass::Util.file_uri_from_path( + Sass::Util.relative_path_from(css_path, sourcemap_path.dirname)) + + result = "{\n" + write_json_field(result, "version", 3, true) + + source_uri_to_id = {} + id_to_source_uri = {} + id_to_contents = {} if options[:type] == :inline + next_source_id = 0 + line_data = [] + segment_data_for_line = [] + + # These track data necessary for the delta coding. + previous_target_line = nil + previous_target_offset = 1 + previous_source_line = 1 + previous_source_offset = 1 + previous_source_id = 0 + + @data.each do |m| + file, importer = m.input.file, m.input.importer + + next unless importer + + if options[:type] == :inline + source_uri = file + else + sourcemap_dir = sourcemap_path && sourcemap_path.dirname.to_s + sourcemap_dir = nil if options[:type] == :file + source_uri = importer.public_url(file, sourcemap_dir) + next unless source_uri + end + + current_source_id = source_uri_to_id[source_uri] + unless current_source_id + current_source_id = next_source_id + next_source_id += 1 + + source_uri_to_id[source_uri] = current_source_id + id_to_source_uri[current_source_id] = source_uri + + if options[:type] == :inline + id_to_contents[current_source_id] = + importer.find(file, {}).instance_variable_get('@template') + end + end + + [ + [m.input.start_pos, m.output.start_pos], + [m.input.end_pos, m.output.end_pos] + ].each do |source_pos, target_pos| + if previous_target_line != target_pos.line + line_data.push(segment_data_for_line.join(",")) unless segment_data_for_line.empty? + (target_pos.line - 1 - (previous_target_line || 0)).times {line_data.push("")} + previous_target_line = target_pos.line + previous_target_offset = 1 + segment_data_for_line = [] + end + + # `segment` is a data chunk for a single position mapping. + segment = "" + + # Field 1: zero-based starting offset. + segment << Sass::Util.encode_vlq(target_pos.offset - previous_target_offset) + previous_target_offset = target_pos.offset + + # Field 2: zero-based index into the "sources" list. + segment << Sass::Util.encode_vlq(current_source_id - previous_source_id) + previous_source_id = current_source_id + + # Field 3: zero-based starting line in the original source. + segment << Sass::Util.encode_vlq(source_pos.line - previous_source_line) + previous_source_line = source_pos.line + + # Field 4: zero-based starting offset in the original source. + segment << Sass::Util.encode_vlq(source_pos.offset - previous_source_offset) + previous_source_offset = source_pos.offset + + segment_data_for_line.push(segment) + + previous_target_line = target_pos.line + end + end + line_data.push(segment_data_for_line.join(",")) + write_json_field(result, "mappings", line_data.join(";")) + + source_names = [] + (0...next_source_id).each {|id| source_names.push(id_to_source_uri[id].to_s)} + write_json_field(result, "sources", source_names) + + if options[:type] == :inline + write_json_field(result, "sourcesContent", + (0...next_source_id).map {|id| id_to_contents[id]}) + end + + write_json_field(result, "names", []) + write_json_field(result, "file", css_uri) + + result << "\n}" + result + end + + private + + def write_json_field(out, name, value, is_first = false) + out << (is_first ? "" : ",\n") << + "\"" << + Sass::Util.json_escape_string(name) << + "\": " << + Sass::Util.json_value_of(value) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/source/position.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/source/position.rb new file mode 100644 index 000000000000..a62af452d8a2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/source/position.rb @@ -0,0 +1,39 @@ +module Sass::Source + class Position + # The one-based line of the document associated with the position. + # + # @return [Integer] + attr_accessor :line + + # The one-based offset in the line of the document associated with the + # position. + # + # @return [Integer] + attr_accessor :offset + + # @param line [Integer] The source line + # @param offset [Integer] The source offset + def initialize(line, offset) + @line = line + @offset = offset + end + + # @return [String] A string representation of the source position. + def inspect + "#{line.inspect}:#{offset.inspect}" + end + + # @param str [String] The string to move through. + # @return [Position] The source position after proceeding forward through + # `str`. + def after(str) + newlines = str.count("\n") + Position.new(line + newlines, + if newlines == 0 + offset + str.length + else + str.length - str.rindex("\n") - 1 + end) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/source/range.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/source/range.rb new file mode 100644 index 000000000000..de687f97274e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/source/range.rb @@ -0,0 +1,41 @@ +module Sass::Source + class Range + # The starting position of the range in the document (inclusive). + # + # @return [Sass::Source::Position] + attr_accessor :start_pos + + # The ending position of the range in the document (exclusive). + # + # @return [Sass::Source::Position] + attr_accessor :end_pos + + # The file in which this source range appears. This can be nil if the file + # is unknown or not yet generated. + # + # @return [String] + attr_accessor :file + + # The importer that imported the file in which this source range appears. + # This is nil for target ranges. + # + # @return [Sass::Importers::Base] + attr_accessor :importer + + # @param start_pos [Sass::Source::Position] See \{#start_pos} + # @param end_pos [Sass::Source::Position] See \{#end_pos} + # @param file [String] See \{#file} + # @param importer [Sass::Importers::Base] See \{#importer} + def initialize(start_pos, end_pos, file, importer = nil) + @start_pos = start_pos + @end_pos = end_pos + @file = file + @importer = importer + end + + # @return [String] A string representation of the source range. + def inspect + "(#{start_pos.inspect} to #{end_pos.inspect}#{" in #{@file}" if @file})" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/stack.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/stack.rb new file mode 100644 index 000000000000..fb57a978c1e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/stack.rb @@ -0,0 +1,140 @@ +module Sass + # A class representing the stack when compiling a Sass file. + class Stack + # TODO: use this to generate stack information for Sass::SyntaxErrors. + + # A single stack frame. + class Frame + # The filename of the file in which this stack frame was created. + # + # @return [String] + attr_reader :filename + + # The line number on which this stack frame was created. + # + # @return [String] + attr_reader :line + + # The type of this stack frame. This can be `:import`, `:mixin`, or + # `:base`. + # + # `:base` indicates that this is the bottom-most frame, meaning that it + # represents a single line of code rather than a nested context. The stack + # will only ever have one base frame, and it will always be the most + # deeply-nested frame. + # + # @return [Symbol?] + attr_reader :type + + # The name of the stack frame. For mixin frames, this is the mixin name; + # otherwise, it's `nil`. + # + # @return [String?] + attr_reader :name + + def initialize(filename, line, type, name = nil) + @filename = filename + @line = line + @type = type + @name = name + end + + # Whether this frame represents an import. + # + # @return [Boolean] + def is_import? + type == :import + end + + # Whether this frame represents a mixin. + # + # @return [Boolean] + def is_mixin? + type == :mixin + end + + # Whether this is the base frame. + # + # @return [Boolean] + def is_base? + type == :base + end + end + + # The stack frames. The last frame is the most deeply-nested. + # + # @return [Array<Frame>] + attr_reader :frames + + def initialize + @frames = [] + end + + # Pushes a base frame onto the stack. + # + # @param filename [String] See \{Frame#filename}. + # @param line [String] See \{Frame#line}. + # @yield [] A block in which the new frame is on the stack. + def with_base(filename, line) + with_frame(filename, line, :base) {yield} + end + + # Pushes an import frame onto the stack. + # + # @param filename [String] See \{Frame#filename}. + # @param line [String] See \{Frame#line}. + # @yield [] A block in which the new frame is on the stack. + def with_import(filename, line) + with_frame(filename, line, :import) {yield} + end + + # Pushes a mixin frame onto the stack. + # + # @param filename [String] See \{Frame#filename}. + # @param line [String] See \{Frame#line}. + # @param name [String] See \{Frame#name}. + # @yield [] A block in which the new frame is on the stack. + def with_mixin(filename, line, name) + with_frame(filename, line, :mixin, name) {yield} + end + + # Pushes a function frame onto the stack. + # + # @param filename [String] See \{Frame#filename}. + # @param line [String] See \{Frame#line}. + # @param name [String] See \{Frame#name}. + # @yield [] A block in which the new frame is on the stack. + def with_function(filename, line, name) + with_frame(filename, line, :function, name) {yield} + end + + # Pushes a function frame onto the stack. + # + # @param filename [String] See \{Frame#filename}. + # @param line [String] See \{Frame#line}. + # @param name [String] See \{Frame#name}. + # @yield [] A block in which the new frame is on the stack. + def with_directive(filename, line, name) + with_frame(filename, line, :directive, name) {yield} + end + + def to_s + (frames.reverse + [nil]).each_cons(2).each_with_index. + map do |(frame, caller), i| + "#{i == 0 ? 'on' : 'from'} line #{frame.line}" + + " of #{frame.filename || 'an unknown file'}" + + (caller && caller.name ? ", in `#{caller.name}'" : "") + end.join("\n") + end + + private + + def with_frame(filename, line, type, name = nil) + @frames.pop if @frames.last && @frames.last.type == :base + @frames.push(Frame.new(filename, line, type, name)) + yield + ensure + @frames.pop unless type == :base && @frames.last && @frames.last.type != :base + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/supports.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/supports.rb new file mode 100644 index 000000000000..6869c4d62d63 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/supports.rb @@ -0,0 +1,225 @@ +# A namespace for the `@supports` condition parse tree. +module Sass::Supports + # The abstract superclass of all Supports conditions. + class Condition + # Runs the SassScript in the supports condition. + # + # @param environment [Sass::Environment] The environment in which to run the script. + def perform(environment); Sass::Util.abstract(self); end + + # Returns the CSS for this condition. + # + # @return [String] + def to_css; Sass::Util.abstract(self); end + + # Returns the Sass/CSS code for this condition. + # + # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}). + # @return [String] + def to_src(options); Sass::Util.abstract(self); end + + # Returns a deep copy of this condition and all its children. + # + # @return [Condition] + def deep_copy; Sass::Util.abstract(self); end + + # Sets the options hash for the script nodes in the supports condition. + # + # @param options [{Symbol => Object}] The options has to set. + def options=(options); Sass::Util.abstract(self); end + end + + # An operator condition (e.g. `CONDITION1 and CONDITION2`). + class Operator < Condition + # The left-hand condition. + # + # @return [Sass::Supports::Condition] + attr_accessor :left + + # The right-hand condition. + # + # @return [Sass::Supports::Condition] + attr_accessor :right + + # The operator ("and" or "or"). + # + # @return [String] + attr_accessor :op + + def initialize(left, right, op) + @left = left + @right = right + @op = op + end + + def perform(env) + @left.perform(env) + @right.perform(env) + end + + def to_css + "#{parens @left, @left.to_css} #{op} #{parens @right, @right.to_css}" + end + + def to_src(options) + "#{parens @left, @left.to_src(options)} #{op} #{parens @right, @right.to_src(options)}" + end + + def deep_copy + copy = dup + copy.left = @left.deep_copy + copy.right = @right.deep_copy + copy + end + + def options=(options) + @left.options = options + @right.options = options + end + + private + + def parens(condition, str) + if condition.is_a?(Negation) || (condition.is_a?(Operator) && condition.op != op) + return "(#{str})" + else + return str + end + end + end + + # A negation condition (`not CONDITION`). + class Negation < Condition + # The condition being negated. + # + # @return [Sass::Supports::Condition] + attr_accessor :condition + + def initialize(condition) + @condition = condition + end + + def perform(env) + @condition.perform(env) + end + + def to_css + "not #{parens @condition.to_css}" + end + + def to_src(options) + "not #{parens @condition.to_src(options)}" + end + + def deep_copy + copy = dup + copy.condition = condition.deep_copy + copy + end + + def options=(options) + condition.options = options + end + + private + + def parens(str) + return "(#{str})" if @condition.is_a?(Negation) || @condition.is_a?(Operator) + str + end + end + + # A declaration condition (e.g. `(feature: value)`). + class Declaration < Condition + # @return [Sass::Script::Tree::Node] The feature name. + attr_accessor :name + + # @!attribute resolved_name + # The name of the feature after any SassScript has been resolved. + # Only set once \{Tree::Visitors::Perform} has been run. + # + # @return [String] + attr_accessor :resolved_name + + # The feature value. + # + # @return [Sass::Script::Tree::Node] + attr_accessor :value + + # The value of the feature after any SassScript has been resolved. + # Only set once \{Tree::Visitors::Perform} has been run. + # + # @return [String] + attr_accessor :resolved_value + + def initialize(name, value) + @name = name + @value = value + end + + def perform(env) + @resolved_name = name.perform(env) + @resolved_value = value.perform(env) + end + + def to_css + "(#{@resolved_name}: #{@resolved_value})" + end + + def to_src(options) + "(#{@name.to_sass(options)}: #{@value.to_sass(options)})" + end + + def deep_copy + copy = dup + copy.name = @name.deep_copy + copy.value = @value.deep_copy + copy + end + + def options=(options) + @name.options = options + @value.options = options + end + end + + # An interpolation condition (e.g. `#{$var}`). + class Interpolation < Condition + # The SassScript expression in the interpolation. + # + # @return [Sass::Script::Tree::Node] + attr_accessor :value + + # The value of the expression after it's been resolved. + # Only set once \{Tree::Visitors::Perform} has been run. + # + # @return [String] + attr_accessor :resolved_value + + def initialize(value) + @value = value + end + + def perform(env) + @resolved_value = value.perform(env).to_s(:quote => :none) + end + + def to_css + @resolved_value + end + + def to_src(options) + @value.to_sass(options) + end + + def deep_copy + copy = dup + copy.value = @value.deep_copy + copy + end + + def options=(options) + @value.options = options + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/at_root_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/at_root_node.rb new file mode 100644 index 000000000000..e44d7aaa81a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/at_root_node.rb @@ -0,0 +1,83 @@ +module Sass + module Tree + # A dynamic node representing an `@at-root` directive. + # + # An `@at-root` directive with a selector is converted to an \{AtRootNode} + # containing a \{RuleNode} at parse time. + # + # @see Sass::Tree + class AtRootNode < Node + # The query for this node (e.g. `(without: media)`), + # interspersed with {Sass::Script::Tree::Node}s representing + # `#{}`-interpolation. Any adjacent strings will be merged + # together. + # + # This will be nil if the directive didn't have a query. In this + # case, {#resolved\_type} will automatically be set to + # `:without` and {#resolved\_rule} will automatically be set to `["rule"]`. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :query + + # The resolved type of this directive. `:with` or `:without`. + # + # @return [Symbol] + attr_accessor :resolved_type + + # The resolved value of this directive -- a list of directives + # to either include or exclude. + # + # @return [Array<String>] + attr_accessor :resolved_value + + # The number of additional tabs that the contents of this node + # should be indented. + # + # @return [Number] + attr_accessor :tabs + + # Whether the last child of this node should be considered the + # end of a group. + # + # @return [Boolean] + attr_accessor :group_end + + def initialize(query = nil) + super() + @query = Sass::Util.strip_string_array(Sass::Util.merge_adjacent_strings(query)) if query + @tabs = 0 + end + + # Returns whether or not the given directive is excluded by this + # node. `directive` may be "rule", which indicates whether + # normal CSS rules should be excluded. + # + # @param directive [String] + # @return [Boolean] + def exclude?(directive) + if resolved_type == :with + return false if resolved_value.include?('all') + !resolved_value.include?(directive) + else # resolved_type == :without + return true if resolved_value.include?('all') + resolved_value.include?(directive) + end + end + + # Returns whether the given node is excluded by this node. + # + # @param node [Sass::Tree::Node] + # @return [Boolean] + def exclude_node?(node) + return exclude?(node.name.gsub(/^@/, '')) if node.is_a?(Sass::Tree::DirectiveNode) + return exclude?('keyframes') if node.is_a?(Sass::Tree::KeyframeRuleNode) + exclude?('rule') && node.is_a?(Sass::Tree::RuleNode) + end + + # @see Node#bubbles? + def bubbles? + true + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/charset_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/charset_node.rb new file mode 100644 index 000000000000..8204d88508eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/charset_node.rb @@ -0,0 +1,22 @@ +module Sass::Tree + # A static node representing an unprocessed Sass `@charset` directive. + # + # @see Sass::Tree + class CharsetNode < Node + # The name of the charset. + # + # @return [String] + attr_accessor :name + + # @param name [String] see \{#name} + def initialize(name) + @name = name + super() + end + + # @see Node#invisible? + def invisible? + true + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/comment_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/comment_node.rb new file mode 100644 index 000000000000..1b73a1590f67 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/comment_node.rb @@ -0,0 +1,82 @@ +require 'sass/tree/node' + +module Sass::Tree + # A static node representing a Sass comment (silent or loud). + # + # @see Sass::Tree + class CommentNode < Node + # The text of the comment, not including `/*` and `*/`. + # Interspersed with {Sass::Script::Tree::Node}s representing `#{}`-interpolation + # if this is a loud comment. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :value + + # The text of the comment + # after any interpolated SassScript has been resolved. + # Only set once \{Tree::Visitors::Perform} has been run. + # + # @return [String] + attr_accessor :resolved_value + + # The type of the comment. `:silent` means it's never output to CSS, + # `:normal` means it's output in every compile mode except `:compressed`, + # and `:loud` means it's output even in `:compressed`. + # + # @return [Symbol] + attr_accessor :type + + # @param value [Array<String, Sass::Script::Tree::Node>] See \{#value} + # @param type [Symbol] See \{#type} + def initialize(value, type) + @value = Sass::Util.with_extracted_values(value) {|str| normalize_indentation str} + @type = type + super() + end + + # Compares the contents of two comments. + # + # @param other [Object] The object to compare with + # @return [Boolean] Whether or not this node and the other object + # are the same + def ==(other) + self.class == other.class && value == other.value && type == other.type + end + + # Returns `true` if this is a silent comment + # or the current style doesn't render comments. + # + # Comments starting with ! are never invisible (and the ! is removed from the output.) + # + # @return [Boolean] + def invisible? + case @type + when :loud; false + when :silent; true + else; style == :compressed + end + end + + # Returns the number of lines in the comment. + # + # @return [Integer] + def lines + @value.inject(0) do |s, e| + next s + e.count("\n") if e.is_a?(String) + next s + end + end + + private + + def normalize_indentation(str) + ind = str.split("\n").inject(str[/^[ \t]*/].split("")) do |pre, line| + line[/^[ \t]*/].split("").zip(pre).inject([]) do |arr, (a, b)| + break arr if a != b + arr << a + end + end.join + str.gsub(/^#{ind}/, '') + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/content_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/content_node.rb new file mode 100644 index 000000000000..3f6528f80f8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/content_node.rb @@ -0,0 +1,9 @@ +module Sass + module Tree + # A node representing the placement within a mixin of the include statement's content. + # + # @see Sass::Tree + class ContentNode < Node + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/css_import_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/css_import_node.rb new file mode 100644 index 000000000000..d9a592693ea2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/css_import_node.rb @@ -0,0 +1,68 @@ +module Sass::Tree + # A node representing an `@import` rule that's importing plain CSS. + # + # @see Sass::Tree + class CssImportNode < DirectiveNode + # The URI being imported, either as a plain string or an interpolated + # script string. + # + # @return [String, Sass::Script::Tree::Node] + attr_accessor :uri + + # The text of the URI being imported after any interpolated SassScript has + # been resolved. Only set once {Tree::Visitors::Perform} has been run. + # + # @return [String] + attr_accessor :resolved_uri + + # The supports condition for this import. + # + # @return [Sass::Supports::Condition] + attr_accessor :supports_condition + + # The media query for this rule, interspersed with + # {Sass::Script::Tree::Node}s representing `#{}`-interpolation. Any adjacent + # strings will be merged together. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :query + + # The media query for this rule, without any unresolved interpolation. + # It's only set once {Tree::Visitors::Perform} has been run. + # + # @return [Sass::Media::QueryList] + attr_accessor :resolved_query + + # @param uri [String, Sass::Script::Tree::Node] See \{#uri} + # @param query [Array<String, Sass::Script::Tree::Node>] See \{#query} + # @param supports_condition [Sass::Supports::Condition] See \{#supports_condition} + def initialize(uri, query = [], supports_condition = nil) + @uri = uri + @query = query + @supports_condition = supports_condition + super('') + end + + # @param uri [String] See \{#resolved_uri} + # @return [CssImportNode] + def self.resolved(uri) + node = new(uri) + node.resolved_uri = uri + node + end + + # @see DirectiveNode#value + def value; raise NotImplementedError; end + + # @see DirectiveNode#resolved_value + def resolved_value + @resolved_value ||= + begin + str = "@import #{resolved_uri}" + str << " supports(#{supports_condition.to_css})" if supports_condition + str << " #{resolved_query.to_css}" if resolved_query + str + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/debug_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/debug_node.rb new file mode 100644 index 000000000000..5cc2842253e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/debug_node.rb @@ -0,0 +1,18 @@ +module Sass + module Tree + # A dynamic node representing a Sass `@debug` statement. + # + # @see Sass::Tree + class DebugNode < Node + # The expression to print. + # @return [Script::Tree::Node] + attr_accessor :expr + + # @param expr [Script::Tree::Node] The expression to print + def initialize(expr) + @expr = expr + super() + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/directive_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/directive_node.rb new file mode 100644 index 000000000000..315bb7014d11 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/directive_node.rb @@ -0,0 +1,59 @@ +module Sass::Tree + # A static node representing an unprocessed Sass `@`-directive. + # Directives known to Sass, like `@for` and `@debug`, + # are handled by their own nodes; + # only CSS directives like `@media` and `@font-face` become {DirectiveNode}s. + # + # `@import` and `@charset` are special cases; + # they become {ImportNode}s and {CharsetNode}s, respectively. + # + # @see Sass::Tree + class DirectiveNode < Node + # The text of the directive, `@` and all, with interpolation included. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :value + + # The text of the directive after any interpolated SassScript has been resolved. + # Only set once \{Tree::Visitors::Perform} has been run. + # + # @return [String] + attr_accessor :resolved_value + + # @see RuleNode#tabs + attr_accessor :tabs + + # @see RuleNode#group_end + attr_accessor :group_end + + # @param value [Array<String, Sass::Script::Tree::Node>] See \{#value} + def initialize(value) + @value = value + @tabs = 0 + super() + end + + # @param value [String] See \{#resolved_value} + # @return [DirectiveNode] + def self.resolved(value) + node = new([value]) + node.resolved_value = value + node + end + + # @return [String] The name of the directive, including `@`. + def name + @name ||= value.first.gsub(/ .*$/, '') + end + + # Strips out any vendor prefixes and downcases the directive name. + # @return [String] The normalized name of the directive. + def normalized_name + @normalized_name ||= name.gsub(/^(@)(?:-[a-zA-Z0-9]+-)?/, '\1').downcase + end + + def bubbles? + has_children + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/each_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/each_node.rb new file mode 100644 index 000000000000..586cfa7f1b32 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/each_node.rb @@ -0,0 +1,24 @@ +require 'sass/tree/node' + +module Sass::Tree + # A dynamic node representing a Sass `@each` loop. + # + # @see Sass::Tree + class EachNode < Node + # The names of the loop variables. + # @return [Array<String>] + attr_reader :vars + + # The parse tree for the list. + # @return [Script::Tree::Node] + attr_accessor :list + + # @param vars [Array<String>] The names of the loop variables + # @param list [Script::Tree::Node] The parse tree for the list + def initialize(vars, list) + @vars = vars + @list = list + super() + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/error_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/error_node.rb new file mode 100644 index 000000000000..203fd6216ef8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/error_node.rb @@ -0,0 +1,18 @@ +module Sass + module Tree + # A dynamic node representing a Sass `@error` statement. + # + # @see Sass::Tree + class ErrorNode < Node + # The expression to print. + # @return [Script::Tree::Node] + attr_accessor :expr + + # @param expr [Script::Tree::Node] The expression to print + def initialize(expr) + @expr = expr + super() + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/extend_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/extend_node.rb new file mode 100644 index 000000000000..817c20ce460a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/extend_node.rb @@ -0,0 +1,43 @@ +require 'sass/tree/node' + +module Sass::Tree + # A static node representing an `@extend` directive. + # + # @see Sass::Tree + class ExtendNode < Node + # The parsed selector after interpolation has been resolved. + # Only set once {Tree::Visitors::Perform} has been run. + # + # @return [Selector::CommaSequence] + attr_accessor :resolved_selector + + # The CSS selector to extend, interspersed with {Sass::Script::Tree::Node}s + # representing `#{}`-interpolation. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :selector + + # The extended selector source range. + # + # @return [Sass::Source::Range] + attr_accessor :selector_source_range + + # Whether the `@extend` is allowed to match no selectors or not. + # + # @return [Boolean] + def optional?; @optional; end + + # @param selector [Array<String, Sass::Script::Tree::Node>] + # The CSS selector to extend, + # interspersed with {Sass::Script::Tree::Node}s + # representing `#{}`-interpolation. + # @param optional [Boolean] See \{ExtendNode#optional?} + # @param selector_source_range [Sass::Source::Range] The extended selector source range. + def initialize(selector, optional, selector_source_range) + @selector = selector + @optional = optional + @selector_source_range = selector_source_range + super() + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/for_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/for_node.rb new file mode 100644 index 000000000000..da3f655a4cbe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/for_node.rb @@ -0,0 +1,36 @@ +require 'sass/tree/node' + +module Sass::Tree + # A dynamic node representing a Sass `@for` loop. + # + # @see Sass::Tree + class ForNode < Node + # The name of the loop variable. + # @return [String] + attr_reader :var + + # The parse tree for the initial expression. + # @return [Script::Tree::Node] + attr_accessor :from + + # The parse tree for the final expression. + # @return [Script::Tree::Node] + attr_accessor :to + + # Whether to include `to` in the loop or stop just before. + # @return [Boolean] + attr_reader :exclusive + + # @param var [String] See \{#var} + # @param from [Script::Tree::Node] See \{#from} + # @param to [Script::Tree::Node] See \{#to} + # @param exclusive [Boolean] See \{#exclusive} + def initialize(var, from, to, exclusive) + @var = var + @from = from + @to = to + @exclusive = exclusive + super() + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/function_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/function_node.rb new file mode 100644 index 000000000000..c2ca18ab3778 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/function_node.rb @@ -0,0 +1,44 @@ +module Sass + module Tree + # A dynamic node representing a function definition. + # + # @see Sass::Tree + class FunctionNode < Node + # The name of the function. + # @return [String] + attr_reader :name + + # The arguments to the function. Each element is a tuple + # containing the variable for argument and the parse tree for + # the default value of the argument + # + # @return [Array<Script::Tree::Node>] + attr_accessor :args + + # The splat argument for this function, if one exists. + # + # @return [Script::Tree::Node?] + attr_accessor :splat + + # Strips out any vendor prefixes. + # @return [String] The normalized name of the directive. + def normalized_name + @normalized_name ||= name.gsub(/^(?:-[a-zA-Z0-9]+-)?/, '\1') + end + + # @param name [String] The function name + # @param args [Array<(Script::Tree::Node, Script::Tree::Node)>] + # The arguments for the function. + # @param splat [Script::Tree::Node] See \{#splat} + def initialize(name, args, splat) + @name = name + @args = args + @splat = splat + super() + + return unless %w(and or not).include?(name) + raise Sass::SyntaxError.new("Invalid function name \"#{name}\".") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/if_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/if_node.rb new file mode 100644 index 000000000000..ebfec7c39230 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/if_node.rb @@ -0,0 +1,52 @@ +require 'sass/tree/node' + +module Sass::Tree + # A dynamic node representing a Sass `@if` statement. + # + # {IfNode}s are a little odd, in that they also represent `@else` and `@else if`s. + # This is done as a linked list: + # each {IfNode} has a link (\{#else}) to the next {IfNode}. + # + # @see Sass::Tree + class IfNode < Node + # The conditional expression. + # If this is nil, this is an `@else` node, not an `@else if`. + # + # @return [Script::Expr] + attr_accessor :expr + + # The next {IfNode} in the if-else list, or `nil`. + # + # @return [IfNode] + attr_accessor :else + + # @param expr [Script::Expr] See \{#expr} + def initialize(expr) + @expr = expr + @last_else = self + super() + end + + # Append an `@else` node to the end of the list. + # + # @param node [IfNode] The `@else` node to append + def add_else(node) + @last_else.else = node + @last_else = node + end + + def _dump(f) + Marshal.dump([expr, self.else, children]) + end + + def self._load(data) + expr, else_, children = Marshal.load(data) + node = IfNode.new(expr) + node.else = else_ + node.children = children + node.instance_variable_set('@last_else', + node.else ? node.else.instance_variable_get('@last_else') : node) + node + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/import_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/import_node.rb new file mode 100644 index 000000000000..955bd3929b87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/import_node.rb @@ -0,0 +1,75 @@ +module Sass + module Tree + # A static node that wraps the {Sass::Tree} for an `@import`ed file. + # It doesn't have a functional purpose other than to add the `@import`ed file + # to the backtrace if an error occurs. + class ImportNode < RootNode + # The name of the imported file as it appears in the Sass document. + # + # @return [String] + attr_reader :imported_filename + + # Sets the imported file. + attr_writer :imported_file + + # @param imported_filename [String] The name of the imported file + def initialize(imported_filename) + @imported_filename = imported_filename + super(nil) + end + + def invisible?; to_s.empty?; end + + # Returns the imported file. + # + # @return [Sass::Engine] + # @raise [Sass::SyntaxError] If no file could be found to import. + def imported_file + @imported_file ||= import + end + + # Returns whether or not this import should emit a CSS @import declaration + # + # @return [Boolean] Whether or not this is a simple CSS @import declaration. + def css_import? + if @imported_filename =~ /\.css$/ + @imported_filename + elsif imported_file.is_a?(String) && imported_file =~ /\.css$/ + imported_file + end + end + + private + + def import + paths = @options[:load_paths] + + if @options[:importer] + f = @options[:importer].find_relative( + @imported_filename, @options[:filename], options_for_importer) + return f if f + end + + paths.each do |p| + f = p.find(@imported_filename, options_for_importer) + return f if f + end + + lines = ["File to import not found or unreadable: #{@imported_filename}."] + + if paths.size == 1 + lines << "Load path: #{paths.first}" + elsif !paths.empty? + lines << "Load paths:\n #{paths.join("\n ")}" + end + raise SyntaxError.new(lines.join("\n")) + rescue SyntaxError => e + raise SyntaxError.new(e.message, :line => line, :filename => @filename) + end + + def options_for_importer + @options.merge(:_from_import_node => true) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/keyframe_rule_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/keyframe_rule_node.rb new file mode 100644 index 000000000000..9f75f947245a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/keyframe_rule_node.rb @@ -0,0 +1,15 @@ +module Sass::Tree + class KeyframeRuleNode < Node + # The text of the directive after any interpolated SassScript has been resolved. + # Since this is only a static node, this is the only value property. + # + # @return [String] + attr_accessor :resolved_value + + # @param resolved_value [String] See \{#resolved_value} + def initialize(resolved_value) + @resolved_value = resolved_value + super() + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/media_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/media_node.rb new file mode 100644 index 000000000000..3178de03efff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/media_node.rb @@ -0,0 +1,48 @@ +module Sass::Tree + # A static node representing a `@media` rule. + # `@media` rules behave differently from other directives + # in that when they're nested within rules, + # they bubble up to top-level. + # + # @see Sass::Tree + class MediaNode < DirectiveNode + # TODO: parse and cache the query immediately if it has no dynamic elements + + # The media query for this rule, interspersed with {Sass::Script::Tree::Node}s + # representing `#{}`-interpolation. Any adjacent strings will be merged + # together. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :query + + # The media query for this rule, without any unresolved interpolation. It's + # only set once {Tree::Visitors::Perform} has been run. + # + # @return [Sass::Media::QueryList] + attr_accessor :resolved_query + + # @param query [Array<String, Sass::Script::Tree::Node>] See \{#query} + def initialize(query) + @query = query + super('') + end + + # @see DirectiveNode#value + def value; raise NotImplementedError; end + + # @see DirectiveNode#name + def name; '@media'; end + + # @see DirectiveNode#resolved_value + def resolved_value + @resolved_value ||= "@media #{resolved_query.to_css}" + end + + # True when the directive has no visible children. + # + # @return [Boolean] + def invisible? + children.all? {|c| c.invisible?} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/mixin_def_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/mixin_def_node.rb new file mode 100644 index 000000000000..9ed8bfb613ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/mixin_def_node.rb @@ -0,0 +1,38 @@ +module Sass + module Tree + # A dynamic node representing a mixin definition. + # + # @see Sass::Tree + class MixinDefNode < Node + # The mixin name. + # @return [String] + attr_reader :name + + # The arguments for the mixin. + # Each element is a tuple containing the variable for argument + # and the parse tree for the default value of the argument. + # + # @return [Array<(Script::Tree::Node, Script::Tree::Node)>] + attr_accessor :args + + # The splat argument for this mixin, if one exists. + # + # @return [Script::Tree::Node?] + attr_accessor :splat + + # Whether the mixin uses `@content`. Set during the nesting check phase. + # @return [Boolean] + attr_accessor :has_content + + # @param name [String] The mixin name + # @param args [Array<(Script::Tree::Node, Script::Tree::Node)>] See \{#args} + # @param splat [Script::Tree::Node] See \{#splat} + def initialize(name, args, splat) + @name = name + @args = args + @splat = splat + super() + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/mixin_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/mixin_node.rb new file mode 100644 index 000000000000..48592c1c88d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/mixin_node.rb @@ -0,0 +1,52 @@ +require 'sass/tree/node' + +module Sass::Tree + # A static node representing a mixin include. + # When in a static tree, the sole purpose is to wrap exceptions + # to add the mixin to the backtrace. + # + # @see Sass::Tree + class MixinNode < Node + # The name of the mixin. + # @return [String] + attr_reader :name + + # The arguments to the mixin. + # @return [Array<Script::Tree::Node>] + attr_accessor :args + + # A hash from keyword argument names to values. + # @return [Sass::Util::NormalizedMap<Script::Tree::Node>] + attr_accessor :keywords + + # The first splat argument for this mixin, if one exists. + # + # This could be a list of positional arguments, a map of keyword + # arguments, or an arglist containing both. + # + # @return [Node?] + attr_accessor :splat + + # The second splat argument for this mixin, if one exists. + # + # If this exists, it's always a map of keyword arguments, and + # \{#splat} is always either a list or an arglist. + # + # @return [Node?] + attr_accessor :kwarg_splat + + # @param name [String] The name of the mixin + # @param args [Array<Script::Tree::Node>] See \{#args} + # @param splat [Script::Tree::Node] See \{#splat} + # @param kwarg_splat [Script::Tree::Node] See \{#kwarg_splat} + # @param keywords [Sass::Util::NormalizedMap<Script::Tree::Node>] See \{#keywords} + def initialize(name, args, keywords, splat, kwarg_splat) + @name = name + @args = args + @keywords = keywords + @splat = splat + @kwarg_splat = kwarg_splat + super() + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/node.rb new file mode 100644 index 000000000000..06932f559c2c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/node.rb @@ -0,0 +1,240 @@ +module Sass + # A namespace for nodes in the Sass parse tree. + # + # The Sass parse tree has three states: dynamic, static Sass, and static CSS. + # + # When it's first parsed, a Sass document is in the dynamic state. + # It has nodes for mixin definitions and `@for` loops and so forth, + # in addition to nodes for CSS rules and properties. + # Nodes that only appear in this state are called **dynamic nodes**. + # + # {Tree::Visitors::Perform} creates a static Sass tree, which is + # different. It still has nodes for CSS rules and properties but it + # doesn't have any dynamic-generation-related nodes. The nodes in + # this state are in a similar structure to the Sass document: rules + # and properties are nested beneath one another, although the + # {Tree::RuleNode} selectors are already in their final state. Nodes + # that can be in this state or in the dynamic state are called + # **static nodes**; nodes that can only be in this state are called + # **solely static nodes**. + # + # {Tree::Visitors::Cssize} is then used to create a static CSS tree. + # This is like a static Sass tree, + # but the structure exactly mirrors that of the generated CSS. + # Rules and properties can't be nested beneath one another in this state. + # + # Finally, {Tree::Visitors::ToCss} can be called on a static CSS tree + # to get the actual CSS code as a string. + module Tree + # The abstract superclass of all parse-tree nodes. + class Node + include Enumerable + + def self.inherited(base) + node_name = base.name.gsub(/.*::(.*?)Node$/, '\\1').downcase + base.instance_eval <<-METHODS + # @return [Symbol] The name that is used for this node when visiting. + def node_name + :#{node_name} + end + + # @return [Symbol] The method that is used on the visitor to visit nodes of this type. + def visit_method + :visit_#{node_name} + end + + # @return [Symbol] The method name that determines if the parent is invalid. + def invalid_child_method_name + :"invalid_#{node_name}_child?" + end + + # @return [Symbol] The method name that determines if the node is an invalid parent. + def invalid_parent_method_name + :"invalid_#{node_name}_parent?" + end + METHODS + end + + # The child nodes of this node. + # + # @return [Array<Tree::Node>] + attr_reader :children + + # Whether or not this node has child nodes. + # This may be true even when \{#children} is empty, + # in which case this node has an empty block (e.g. `{}`). + # + # @return [Boolean] + attr_accessor :has_children + + # The line of the document on which this node appeared. + # + # @return [Integer] + attr_accessor :line + + # The source range in the document on which this node appeared. + # + # @return [Sass::Source::Range] + attr_accessor :source_range + + # The name of the document on which this node appeared. + # + # @return [String] + attr_writer :filename + + # The options hash for the node. + # See {file:SASS_REFERENCE.md#Options the Sass options documentation}. + # + # @return [{Symbol => Object}] + attr_reader :options + + def initialize + @children = [] + @filename = nil + @options = nil + end + + # Sets the options hash for the node and all its children. + # + # @param options [{Symbol => Object}] The options + # @see #options + def options=(options) + Sass::Tree::Visitors::SetOptions.visit(self, options) + end + + # @private + def children=(children) + self.has_children ||= !children.empty? + @children = children + end + + # The name of the document on which this node appeared. + # + # @return [String] + def filename + @filename || (@options && @options[:filename]) + end + + # Appends a child to the node. + # + # @param child [Tree::Node, Array<Tree::Node>] The child node or nodes + # @raise [Sass::SyntaxError] if `child` is invalid + def <<(child) + return if child.nil? + if child.is_a?(Array) + child.each {|c| self << c} + else + self.has_children = true + @children << child + end + end + + # Compares this node and another object (only other {Tree::Node}s will be equal). + # This does a structural comparison; + # if the contents of the nodes and all the child nodes are equivalent, + # then the nodes are as well. + # + # Only static nodes need to override this. + # + # @param other [Object] The object to compare with + # @return [Boolean] Whether or not this node and the other object + # are the same + # @see Sass::Tree + def ==(other) + self.class == other.class && other.children == children + end + + # True if \{#to\_s} will return `nil`; + # that is, if the node shouldn't be rendered. + # Should only be called in a static tree. + # + # @return [Boolean] + def invisible?; false; end + + # The output style. See {file:SASS_REFERENCE.md#Options the Sass options documentation}. + # + # @return [Symbol] + def style + @options[:style] + end + + # Computes the CSS corresponding to this static CSS tree. + # + # @return [String] The resulting CSS + # @see Sass::Tree + def css + Sass::Tree::Visitors::ToCss.new.visit(self) + end + + # Computes the CSS corresponding to this static CSS tree, along with + # the respective source map. + # + # @return [(String, Sass::Source::Map)] The resulting CSS and the source map + # @see Sass::Tree + def css_with_sourcemap + visitor = Sass::Tree::Visitors::ToCss.new(:build_source_mapping) + result = visitor.visit(self) + return result, visitor.source_mapping + end + + # Returns a representation of the node for debugging purposes. + # + # @return [String] + def inspect + return self.class.to_s unless has_children + "(#{self.class} #{children.map {|c| c.inspect}.join(' ')})" + end + + # Iterates through each node in the tree rooted at this node + # in a pre-order walk. + # + # @yield node + # @yieldparam node [Node] a node in the tree + def each + yield self + children.each {|c| c.each {|n| yield n}} + end + + # Converts a node to Sass code that will generate it. + # + # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}) + # @return [String] The Sass code corresponding to the node + def to_sass(options = {}) + Sass::Tree::Visitors::Convert.visit(self, options, :sass) + end + + # Converts a node to SCSS code that will generate it. + # + # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}) + # @return [String] The Sass code corresponding to the node + def to_scss(options = {}) + Sass::Tree::Visitors::Convert.visit(self, options, :scss) + end + + # Return a deep clone of this node. + # The child nodes are cloned, but options are not. + # + # @return [Node] + def deep_copy + Sass::Tree::Visitors::DeepCopy.visit(self) + end + + # Whether or not this node bubbles up through RuleNodes. + # + # @return [Boolean] + def bubbles? + false + end + + protected + + # @see Sass::Shared.balance + # @raise [Sass::SyntaxError] if the brackets aren't balanced + def balance(*args) + res = Sass::Shared.balance(*args) + return res if res + raise Sass::SyntaxError.new("Unbalanced brackets.", :line => line) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/prop_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/prop_node.rb new file mode 100644 index 000000000000..7ce8bdde4c6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/prop_node.rb @@ -0,0 +1,162 @@ +module Sass::Tree + # A static node representing a CSS property. + # + # @see Sass::Tree + class PropNode < Node + # The name of the property, + # interspersed with {Sass::Script::Tree::Node}s + # representing `#{}`-interpolation. + # Any adjacent strings will be merged together. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :name + + # The name of the property + # after any interpolated SassScript has been resolved. + # Only set once \{Tree::Visitors::Perform} has been run. + # + # @return [String] + attr_accessor :resolved_name + + # The value of the property. + # + # For most properties, this will just contain a single Node. However, for + # CSS variables, it will contain multiple strings and nodes representing + # interpolation. Any adjacent strings will be merged together. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :value + + # The value of the property + # after any interpolated SassScript has been resolved. + # Only set once \{Tree::Visitors::Perform} has been run. + # + # @return [String] + attr_accessor :resolved_value + + # How deep this property is indented + # relative to a normal property. + # This is only greater than 0 in the case that: + # + # * This node is in a CSS tree + # * The style is :nested + # * This is a child property of another property + # * The parent property has a value, and thus will be rendered + # + # @return [Integer] + attr_accessor :tabs + + # The source range in which the property name appears. + # + # @return [Sass::Source::Range] + attr_accessor :name_source_range + + # The source range in which the property value appears. + # + # @return [Sass::Source::Range] + attr_accessor :value_source_range + + # Whether this represents a CSS custom property. + # + # @return [Boolean] + def custom_property? + name.first.is_a?(String) && name.first.start_with?("--") + end + + # @param name [Array<String, Sass::Script::Tree::Node>] See \{#name} + # @param value [Array<String, Sass::Script::Tree::Node>] See \{#value} + # @param prop_syntax [Symbol] `:new` if this property uses `a: b`-style syntax, + # `:old` if it uses `:a b`-style syntax + def initialize(name, value, prop_syntax) + @name = Sass::Util.strip_string_array( + Sass::Util.merge_adjacent_strings(name)) + @value = Sass::Util.merge_adjacent_strings(value) + @value = Sass::Util.strip_string_array(@value) unless custom_property? + @tabs = 0 + @prop_syntax = prop_syntax + super() + end + + # Compares the names and values of two properties. + # + # @param other [Object] The object to compare with + # @return [Boolean] Whether or not this node and the other object + # are the same + def ==(other) + self.class == other.class && name == other.name && value == other.value && super + end + + # Returns a appropriate message indicating how to escape pseudo-class selectors. + # This only applies for old-style properties with no value, + # so returns the empty string if this is new-style. + # + # @return [String] The message + def pseudo_class_selector_message + if @prop_syntax == :new || + custom_property? || + !value.first.is_a?(Sass::Script::Tree::Literal) || + !value.first.value.is_a?(Sass::Script::Value::String) || + !value.first.value.value.empty? + return "" + end + + "\nIf #{declaration.dump} should be a selector, use \"\\#{declaration}\" instead." + end + + # Computes the Sass or SCSS code for the variable declaration. + # This is like \{#to\_scss} or \{#to\_sass}, + # except it doesn't print any child properties or a trailing semicolon. + # + # @param opts [{Symbol => Object}] The options hash for the tree. + # @param fmt [Symbol] `:scss` or `:sass`. + def declaration(opts = {:old => @prop_syntax == :old}, fmt = :sass) + name = self.name.map {|n| n.is_a?(String) ? n : n.to_sass(opts)}.join + value = self.value.map {|n| n.is_a?(String) ? n : n.to_sass(opts)}.join + value = "(#{value})" if value_needs_parens? + + if name[0] == ?: + raise Sass::SyntaxError.new("The \"#{name}: #{value}\"" + + " hack is not allowed in the Sass indented syntax") + end + + # The indented syntax doesn't support newlines in custom property values, + # but we can losslessly convert them to spaces instead. + value = value.tr("\n", " ") if fmt == :sass + + old = opts[:old] && fmt == :sass + "#{old ? ':' : ''}#{name}#{old ? '' : ':'}#{custom_property? ? '' : ' '}#{value}".rstrip + end + + # A property node is invisible if its value is empty. + # + # @return [Boolean] + def invisible? + !custom_property? && resolved_value.empty? + end + + private + + # Returns whether \{#value} neesd parentheses in order to be parsed + # properly as division. + def value_needs_parens? + return false if custom_property? + + root = value.first + root.is_a?(Sass::Script::Tree::Operation) && + root.operator == :div && + root.operand1.is_a?(Sass::Script::Tree::Literal) && + root.operand1.value.is_a?(Sass::Script::Value::Number) && + root.operand1.value.original.nil? && + root.operand2.is_a?(Sass::Script::Tree::Literal) && + root.operand2.value.is_a?(Sass::Script::Value::Number) && + root.operand2.value.original.nil? + end + + def check! + return unless @options[:property_syntax] && @options[:property_syntax] != @prop_syntax + raise Sass::SyntaxError.new( + "Illegal property syntax: can't use #{@prop_syntax} syntax when " + + ":property_syntax => #{@options[:property_syntax].inspect} is set.") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/return_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/return_node.rb new file mode 100644 index 000000000000..3056406bdcdc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/return_node.rb @@ -0,0 +1,19 @@ +module Sass + module Tree + # A dynamic node representing returning from a function. + # + # @see Sass::Tree + class ReturnNode < Node + # The expression to return. + # + # @return [Script::Tree::Node] + attr_accessor :expr + + # @param expr [Script::Tree::Node] The expression to return + def initialize(expr) + @expr = expr + super() + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/root_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/root_node.rb new file mode 100644 index 000000000000..1f02cbd0959e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/root_node.rb @@ -0,0 +1,44 @@ +module Sass + module Tree + # A static node that is the root node of the Sass document. + class RootNode < Node + # The Sass template from which this node was created + # + # @param template [String] + attr_reader :template + + # @param template [String] The Sass template from which this node was created + def initialize(template) + super() + @template = template + end + + # Runs the dynamic Sass code and computes the CSS for the tree. + # + # @return [String] The compiled CSS. + def render + css_tree.css + end + + # Runs the dynamic Sass code and computes the CSS for the tree, along with + # the sourcemap. + # + # @return [(String, Sass::Source::Map)] The compiled CSS, as well as + # the source map. @see #render + def render_with_sourcemap + css_tree.css_with_sourcemap + end + + private + + def css_tree + Visitors::CheckNesting.visit(self) + result = Visitors::Perform.visit(self) + Visitors::CheckNesting.visit(result) # Check again to validate mixins + result, extends = Visitors::Cssize.visit(result) + Visitors::Extend.visit(result, extends) + result + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/rule_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/rule_node.rb new file mode 100644 index 000000000000..e621939a8e38 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/rule_node.rb @@ -0,0 +1,153 @@ +require 'pathname' + +module Sass::Tree + # A static node representing a CSS rule. + # + # @see Sass::Tree + class RuleNode < Node + # The character used to include the parent selector + PARENT = '&' + + # The CSS selector for this rule, + # interspersed with {Sass::Script::Tree::Node}s + # representing `#{}`-interpolation. + # Any adjacent strings will be merged together. + # + # @return [Array<String, Sass::Script::Tree::Node>] + attr_accessor :rule + + # The CSS selector for this rule, without any unresolved + # interpolation but with parent references still intact. It's only + # guaranteed to be set once {Tree::Visitors::Perform} has been + # run, but it may be set before then for optimization reasons. + # + # @return [Selector::CommaSequence] + attr_accessor :parsed_rules + + # The CSS selector for this rule, without any unresolved + # interpolation or parent references. It's only set once + # {Tree::Visitors::Perform} has been run. + # + # @return [Selector::CommaSequence] + attr_accessor :resolved_rules + + # How deep this rule is indented + # relative to a base-level rule. + # This is only greater than 0 in the case that: + # + # * This node is in a CSS tree + # * The style is :nested + # * This is a child rule of another rule + # * The parent rule has properties, and thus will be rendered + # + # @return [Integer] + attr_accessor :tabs + + # The entire selector source range for this rule. + # @return [Sass::Source::Range] + attr_accessor :selector_source_range + + # Whether or not this rule is the last rule in a nested group. + # This is only set in a CSS tree. + # + # @return [Boolean] + attr_accessor :group_end + + # The stack trace. + # This is only readable in a CSS tree as it is written during the perform step + # and only when the :trace_selectors option is set. + # + # @return [String] + attr_accessor :stack_trace + + # @param rule [Array<String, Sass::Script::Tree::Node>, Sass::Selector::CommaSequence] + # The CSS rule, either unparsed or parsed. + # @param selector_source_range [Sass::Source::Range] + def initialize(rule, selector_source_range = nil) + if rule.is_a?(Sass::Selector::CommaSequence) + @rule = [rule.to_s] + @parsed_rules = rule + else + merged = Sass::Util.merge_adjacent_strings(rule) + @rule = Sass::Util.strip_string_array(merged) + try_to_parse_non_interpolated_rules + end + @selector_source_range = selector_source_range + @tabs = 0 + super() + end + + # If we've precached the parsed selector, set the line on it, too. + def line=(line) + @parsed_rules.line = line if @parsed_rules + super + end + + # If we've precached the parsed selector, set the filename on it, too. + def filename=(filename) + @parsed_rules.filename = filename if @parsed_rules + super + end + + # Compares the contents of two rules. + # + # @param other [Object] The object to compare with + # @return [Boolean] Whether or not this node and the other object + # are the same + def ==(other) + self.class == other.class && rule == other.rule && super + end + + # Adds another {RuleNode}'s rules to this one's. + # + # @param node [RuleNode] The other node + def add_rules(node) + @rule = Sass::Util.strip_string_array( + Sass::Util.merge_adjacent_strings(@rule + ["\n"] + node.rule)) + try_to_parse_non_interpolated_rules + end + + # @return [Boolean] Whether or not this rule is continued on the next line + def continued? + last = @rule.last + last.is_a?(String) && last[-1] == ?, + end + + # A hash that will be associated with this rule in the CSS document + # if the {file:SASS_REFERENCE.md#debug_info-option `:debug_info` option} is enabled. + # This data is used by e.g. [the FireSass Firebug + # extension](https://addons.mozilla.org/en-US/firefox/addon/103988). + # + # @return [{#to_s => #to_s}] + def debug_info + {:filename => filename && + ("file://" + URI::DEFAULT_PARSER.escape(File.expand_path(filename))), + :line => line} + end + + # A rule node is invisible if it has only placeholder selectors. + def invisible? + resolved_rules.members.all? {|seq| seq.invisible?} + end + + private + + def try_to_parse_non_interpolated_rules + @parsed_rules = nil + return unless @rule.all? {|t| t.is_a?(String)} + + # We don't use real filename/line info because we don't have it yet. + # When we get it, we'll set it on the parsed rules if possible. + parser = nil + warnings = Sass.logger.capture do + parser = Sass::SCSS::StaticParser.new( + Sass::Util.strip_except_escapes(@rule.join), nil, nil, 1) + @parsed_rules = parser.parse_selector rescue nil + end + + # If parsing produces a warning, throw away the result so we can parse + # later with the real filename info. + @parsed_rules = nil unless warnings.empty? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/supports_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/supports_node.rb new file mode 100644 index 000000000000..1a2f04b68caa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/supports_node.rb @@ -0,0 +1,38 @@ +module Sass::Tree + # A static node representing a `@supports` rule. + # + # @see Sass::Tree + class SupportsNode < DirectiveNode + # The name, which may include a browser prefix. + # + # @return [String] + attr_accessor :name + + # The supports condition. + # + # @return [Sass::Supports::Condition] + attr_accessor :condition + + # @param condition [Sass::Supports::Condition] See \{#condition} + def initialize(name, condition) + @name = name + @condition = condition + super('') + end + + # @see DirectiveNode#value + def value; raise NotImplementedError; end + + # @see DirectiveNode#resolved_value + def resolved_value + @resolved_value ||= "@#{name} #{condition.to_css}" + end + + # True when the directive has no visible children. + # + # @return [Boolean] + def invisible? + children.all? {|c| c.invisible?} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/trace_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/trace_node.rb new file mode 100644 index 000000000000..2c71e8892b1f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/trace_node.rb @@ -0,0 +1,33 @@ +require 'sass/tree/node' + +module Sass::Tree + # A solely static node left over after a mixin include or @content has been performed. + # Its sole purpose is to wrap exceptions to add to the backtrace. + # + # @see Sass::Tree + class TraceNode < Node + # The name of the trace entry to add. + # + # @return [String] + attr_reader :name + + # @param name [String] The name of the trace entry to add. + def initialize(name) + @name = name + self.has_children = true + super() + end + + # Initializes this node from an existing node. + # @param name [String] The name of the trace entry to add. + # @param node [Node] The node to copy information from. + # @return [TraceNode] + def self.from_node(name, node) + trace = new(name) + trace.line = node.line + trace.filename = node.filename + trace.options = node.options + trace + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/variable_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/variable_node.rb new file mode 100644 index 000000000000..2c0ed55295d1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/variable_node.rb @@ -0,0 +1,36 @@ +module Sass + module Tree + # A dynamic node representing a variable definition. + # + # @see Sass::Tree + class VariableNode < Node + # The name of the variable. + # @return [String] + attr_reader :name + + # The parse tree for the variable value. + # @return [Script::Tree::Node] + attr_accessor :expr + + # Whether this is a guarded variable assignment (`!default`). + # @return [Boolean] + attr_reader :guarded + + # Whether this is a global variable assignment (`!global`). + # @return [Boolean] + attr_reader :global + + # @param name [String] The name of the variable + # @param expr [Script::Tree::Node] See \{#expr} + # @param guarded [Boolean] See \{#guarded} + # @param global [Boolean] See \{#global} + def initialize(name, expr, guarded, global) + @name = name + @expr = expr + @guarded = guarded + @global = global + super() + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/base.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/base.rb new file mode 100644 index 000000000000..2c8e1343bb8a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/base.rb @@ -0,0 +1,72 @@ +# Visitors are used to traverse the Sass parse tree. +# Visitors should extend {Visitors::Base}, +# which provides a small amount of scaffolding for traversal. +module Sass::Tree::Visitors + # The abstract base class for Sass visitors. + # Visitors should extend this class, + # then implement `visit_*` methods for each node they care about + # (e.g. `visit_rule` for {RuleNode} or `visit_for` for {ForNode}). + # These methods take the node in question as argument. + # They may `yield` to visit the child nodes of the current node. + # + # *Note*: due to the unusual nature of {Sass::Tree::IfNode}, + # special care must be taken to ensure that it is properly handled. + # In particular, there is no built-in scaffolding + # for dealing with the return value of `@else` nodes. + # + # @abstract + class Base + # Runs the visitor on a tree. + # + # @param root [Tree::Node] The root node of the Sass tree. + # @return [Object] The return value of \{#visit} for the root node. + def self.visit(root) + new.send(:visit, root) + end + + protected + + # Runs the visitor on the given node. + # This can be overridden by subclasses that need to do something for each node. + # + # @param node [Tree::Node] The node to visit. + # @return [Object] The return value of the `visit_*` method for this node. + def visit(node) + if respond_to?(node.class.visit_method, true) + send(node.class.visit_method, node) {visit_children(node)} + else + visit_children(node) + end + end + + # Visit the child nodes for a given node. + # This can be overridden by subclasses that need to do something + # with the child nodes' return values. + # + # This method is run when `visit_*` methods `yield`, + # and its return value is returned from the `yield`. + # + # @param parent [Tree::Node] The parent node of the children to visit. + # @return [Array<Object>] The return values of the `visit_*` methods for the children. + def visit_children(parent) + parent.children.map {|c| visit(c)} + end + + # Returns the name of a node as used in the `visit_*` method. + # + # @param [Tree::Node] node The node. + # @return [String] The name. + def self.node_name(node) + Sass::Util.deprecated(self, "Call node.class.node_name instead.") + node.class.node_name + end + + # `yield`s, then runs the visitor on the `@else` clause if the node has one. + # This exists to ensure that the contents of the `@else` clause get visited. + def visit_if(node) + yield + visit(node.else) if node.else + node + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/check_nesting.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/check_nesting.rb new file mode 100644 index 000000000000..05541ef5a92d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/check_nesting.rb @@ -0,0 +1,173 @@ +# A visitor for checking that all nodes are properly nested. +class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base + protected + + def initialize + @parents = [] + @parent = nil + @current_mixin_def = nil + end + + def visit(node) + if (error = @parent && ( + try_send(@parent.class.invalid_child_method_name, @parent, node) || + try_send(node.class.invalid_parent_method_name, @parent, node))) + raise Sass::SyntaxError.new(error) + end + super + rescue Sass::SyntaxError => e + e.modify_backtrace(:filename => node.filename, :line => node.line) + raise e + end + + CONTROL_NODES = [Sass::Tree::EachNode, Sass::Tree::ForNode, Sass::Tree::IfNode, + Sass::Tree::WhileNode, Sass::Tree::TraceNode] + SCRIPT_NODES = [Sass::Tree::ImportNode] + CONTROL_NODES + def visit_children(parent) + old_parent = @parent + + # When checking a static tree, resolve at-roots to be sure they won't send + # nodes where they don't belong. + if parent.is_a?(Sass::Tree::AtRootNode) && parent.resolved_value + old_parents = @parents + @parents = @parents.reject {|p| parent.exclude_node?(p)} + @parent = @parents.reverse.each_with_index. + find {|p, i| !transparent_parent?(p, @parents[-i - 2])}.first + + begin + return super + ensure + @parents = old_parents + @parent = old_parent + end + end + + unless transparent_parent?(parent, old_parent) + @parent = parent + end + + @parents.push parent + begin + super + ensure + @parent = old_parent + @parents.pop + end + end + + def visit_root(node) + yield + rescue Sass::SyntaxError => e + e.sass_template ||= node.template + raise e + end + + def visit_import(node) + yield + rescue Sass::SyntaxError => e + e.modify_backtrace(:filename => node.children.first.filename) + e.add_backtrace(:filename => node.filename, :line => node.line) + raise e + end + + def visit_mixindef(node) + @current_mixin_def, old_mixin_def = node, @current_mixin_def + yield + ensure + @current_mixin_def = old_mixin_def + end + + def invalid_content_parent?(parent, child) + if @current_mixin_def + @current_mixin_def.has_content = true + nil + else + "@content may only be used within a mixin." + end + end + + def invalid_charset_parent?(parent, child) + "@charset may only be used at the root of a document." unless parent.is_a?(Sass::Tree::RootNode) + end + + VALID_EXTEND_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::MixinDefNode, Sass::Tree::MixinNode] + def invalid_extend_parent?(parent, child) + return if is_any_of?(parent, VALID_EXTEND_PARENTS) + "Extend directives may only be used within rules." + end + + INVALID_IMPORT_PARENTS = CONTROL_NODES + + [Sass::Tree::MixinDefNode, Sass::Tree::MixinNode] + def invalid_import_parent?(parent, child) + unless (@parents.map {|p| p.class} & INVALID_IMPORT_PARENTS).empty? + return "Import directives may not be used within control directives or mixins." + end + return if parent.is_a?(Sass::Tree::RootNode) + return "CSS import directives may only be used at the root of a document." if child.css_import? + rescue Sass::SyntaxError => e + e.modify_backtrace(:filename => child.imported_file.options[:filename]) + e.add_backtrace(:filename => child.filename, :line => child.line) + raise e + end + + def invalid_mixindef_parent?(parent, child) + return if (@parents.map {|p| p.class} & INVALID_IMPORT_PARENTS).empty? + "Mixins may not be defined within control directives or other mixins." + end + + def invalid_function_parent?(parent, child) + return if (@parents.map {|p| p.class} & INVALID_IMPORT_PARENTS).empty? + "Functions may not be defined within control directives or other mixins." + end + + VALID_FUNCTION_CHILDREN = [ + Sass::Tree::CommentNode, Sass::Tree::DebugNode, Sass::Tree::ReturnNode, + Sass::Tree::VariableNode, Sass::Tree::WarnNode, Sass::Tree::ErrorNode + ] + CONTROL_NODES + def invalid_function_child?(parent, child) + return if is_any_of?(child, VALID_FUNCTION_CHILDREN) + "Functions can only contain variable declarations and control directives." + end + + VALID_PROP_CHILDREN = CONTROL_NODES + [Sass::Tree::CommentNode, + Sass::Tree::PropNode, + Sass::Tree::MixinNode] + def invalid_prop_child?(parent, child) + return if is_any_of?(child, VALID_PROP_CHILDREN) + "Illegal nesting: Only properties may be nested beneath properties." + end + + VALID_PROP_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::KeyframeRuleNode, Sass::Tree::PropNode, + Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode, Sass::Tree::MixinNode] + def invalid_prop_parent?(parent, child) + return if is_any_of?(parent, VALID_PROP_PARENTS) + "Properties are only allowed within rules, directives, mixin includes, or other properties." + + child.pseudo_class_selector_message + end + + def invalid_return_parent?(parent, child) + "@return may only be used within a function." unless parent.is_a?(Sass::Tree::FunctionNode) + end + + private + + # Whether `parent` should be assigned to `@parent`. + def transparent_parent?(parent, grandparent) + is_any_of?(parent, SCRIPT_NODES) || + (parent.bubbles? && + !grandparent.is_a?(Sass::Tree::RootNode) && + !grandparent.is_a?(Sass::Tree::AtRootNode)) + end + + def is_any_of?(val, classes) + classes.each do |c| + return true if val.is_a?(c) + end + false + end + + def try_send(method, *args) + return unless respond_to?(method, true) + send(method, *args) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/convert.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/convert.rb new file mode 100644 index 000000000000..ded21a23bb63 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/convert.rb @@ -0,0 +1,350 @@ +# A visitor for converting a Sass tree into a source string. +class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base + # Runs the visitor on a tree. + # + # @param root [Tree::Node] The root node of the Sass tree. + # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}). + # @param format [Symbol] `:sass` or `:scss`. + # @return [String] The Sass or SCSS source for the tree. + def self.visit(root, options, format) + new(options, format).send(:visit, root) + end + + protected + + def initialize(options, format) + @options = options + @format = format + @tabs = 0 + # 2 spaces by default + @tab_chars = @options[:indent] || " " + @is_else = false + end + + def visit_children(parent) + @tabs += 1 + return @format == :sass ? "\n" : " {}\n" if parent.children.empty? + + res = visit_rule_level(parent.children) + + if @format == :sass + "\n" + res.rstrip + "\n" + else + " {\n" + res.rstrip + "\n#{@tab_chars * (@tabs - 1)}}\n" + end + ensure + @tabs -= 1 + end + + # Ensures proper spacing between top-level nodes. + def visit_root(node) + visit_rule_level(node.children) + end + + def visit_charset(node) + "#{tab_str}@charset \"#{node.name}\"#{semi}\n" + end + + def visit_comment(node) + value = interp_to_src(node.value) + if @format == :sass + content = value.gsub(%r{\*/$}, '').rstrip + if content =~ /\A[ \t]/ + # Re-indent SCSS comments like this: + # /* foo + # bar + # baz */ + content.gsub!(/^/, ' ') + content.sub!(%r{\A([ \t]*)/\*}, '/*\1') + end + + if content.include?("\n") + content.gsub!(/\n \*/, "\n ") + spaces = content.scan(/\n( *)/).map {|s| s.first.size}.min + sep = node.type == :silent ? "\n//" : "\n *" + if spaces >= 2 + content.gsub!(/\n /, sep) + else + content.gsub!(/\n#{' ' * spaces}/, sep) + end + end + + content.gsub!(%r{\A/\*}, '//') if node.type == :silent + content.gsub!(/^/, tab_str) + content = content.rstrip + "\n" + else + spaces = (@tab_chars * [@tabs - value[/^ */].size, 0].max) + content = if node.type == :silent + value.gsub(%r{^[/ ]\*}, '//').gsub(%r{ *\*/$}, '') + else + value + end.gsub(/^/, spaces) + "\n" + end + content + end + + def visit_debug(node) + "#{tab_str}@debug #{node.expr.to_sass(@options)}#{semi}\n" + end + + def visit_error(node) + "#{tab_str}@error #{node.expr.to_sass(@options)}#{semi}\n" + end + + def visit_directive(node) + res = "#{tab_str}#{interp_to_src(node.value)}" + res.gsub!(/^@import \#\{(.*)\}([^}]*)$/, '@import \1\2') + return res + "#{semi}\n" unless node.has_children + res + yield + end + + def visit_each(node) + vars = node.vars.map {|var| "$#{dasherize(var)}"}.join(", ") + "#{tab_str}@each #{vars} in #{node.list.to_sass(@options)}#{yield}" + end + + def visit_extend(node) + "#{tab_str}@extend #{selector_to_src(node.selector).lstrip}" + + "#{' !optional' if node.optional?}#{semi}\n" + end + + def visit_for(node) + "#{tab_str}@for $#{dasherize(node.var)} from #{node.from.to_sass(@options)} " + + "#{node.exclusive ? 'to' : 'through'} #{node.to.to_sass(@options)}#{yield}" + end + + def visit_function(node) + args = node.args.map do |v, d| + d ? "#{v.to_sass(@options)}: #{d.to_sass(@options)}" : v.to_sass(@options) + end.join(", ") + if node.splat + args << ", " unless node.args.empty? + args << node.splat.to_sass(@options) << "..." + end + + "#{tab_str}@function #{dasherize(node.name)}(#{args})#{yield}" + end + + def visit_if(node) + name = + if !@is_else + "if" + elsif node.expr + "else if" + else + "else" + end + @is_else = false + str = "#{tab_str}@#{name}" + str << " #{node.expr.to_sass(@options)}" if node.expr + str << yield + @is_else = true + str << visit(node.else) if node.else + str + ensure + @is_else = false + end + + def visit_import(node) + quote = @format == :scss ? '"' : '' + "#{tab_str}@import #{quote}#{node.imported_filename}#{quote}#{semi}\n" + end + + def visit_media(node) + "#{tab_str}@media #{query_interp_to_src(node.query)}#{yield}" + end + + def visit_supports(node) + "#{tab_str}@#{node.name} #{node.condition.to_src(@options)}#{yield}" + end + + def visit_cssimport(node) + if node.uri.is_a?(Sass::Script::Tree::Node) + str = "#{tab_str}@import #{node.uri.to_sass(@options)}" + else + str = "#{tab_str}@import #{node.uri}" + end + str << " supports(#{node.supports_condition.to_src(@options)})" if node.supports_condition + str << " #{interp_to_src(node.query)}" unless node.query.empty? + "#{str}#{semi}\n" + end + + def visit_mixindef(node) + args = + if node.args.empty? && node.splat.nil? + "" + else + str = '(' + str << node.args.map do |v, d| + if d + "#{v.to_sass(@options)}: #{d.to_sass(@options)}" + else + v.to_sass(@options) + end + end.join(", ") + + if node.splat + str << ", " unless node.args.empty? + str << node.splat.to_sass(@options) << '...' + end + + str << ')' + end + + "#{tab_str}#{@format == :sass ? '=' : '@mixin '}#{dasherize(node.name)}#{args}#{yield}" + end + + def visit_mixin(node) + arg_to_sass = lambda do |arg| + sass = arg.to_sass(@options) + sass = "(#{sass})" if arg.is_a?(Sass::Script::Tree::ListLiteral) && arg.separator == :comma + sass + end + + unless node.args.empty? && node.keywords.empty? && node.splat.nil? + args = node.args.map(&arg_to_sass) + keywords = node.keywords.as_stored.to_a.map {|k, v| "$#{dasherize(k)}: #{arg_to_sass[v]}"} + + if node.splat + splat = "#{arg_to_sass[node.splat]}..." + kwarg_splat = "#{arg_to_sass[node.kwarg_splat]}..." if node.kwarg_splat + end + + arglist = "(#{[args, splat, keywords, kwarg_splat].flatten.compact.join(', ')})" + end + "#{tab_str}#{@format == :sass ? '+' : '@include '}" + + "#{dasherize(node.name)}#{arglist}#{node.has_children ? yield : semi}\n" + end + + def visit_content(node) + "#{tab_str}@content#{semi}\n" + end + + def visit_prop(node) + res = tab_str + node.declaration(@options, @format) + return res + semi + "\n" if node.children.empty? + res + yield.rstrip + semi + "\n" + end + + def visit_return(node) + "#{tab_str}@return #{node.expr.to_sass(@options)}#{semi}\n" + end + + def visit_rule(node) + rule = node.parsed_rules ? [node.parsed_rules.to_s] : node.rule + if @format == :sass + name = selector_to_sass(rule) + name = "\\" + name if name[0] == ?: + name.gsub(/^/, tab_str) + yield + elsif @format == :scss + name = selector_to_scss(rule) + res = name + yield + if node.children.last.is_a?(Sass::Tree::CommentNode) && node.children.last.type == :silent + res.slice!(-3..-1) + res << "\n" << tab_str << "}\n" + end + res + end + end + + def visit_variable(node) + "#{tab_str}$#{dasherize(node.name)}: #{node.expr.to_sass(@options)}" + + "#{' !global' if node.global}#{' !default' if node.guarded}#{semi}\n" + end + + def visit_warn(node) + "#{tab_str}@warn #{node.expr.to_sass(@options)}#{semi}\n" + end + + def visit_while(node) + "#{tab_str}@while #{node.expr.to_sass(@options)}#{yield}" + end + + def visit_atroot(node) + if node.query + "#{tab_str}@at-root #{query_interp_to_src(node.query)}#{yield}" + elsif node.children.length == 1 && node.children.first.is_a?(Sass::Tree::RuleNode) + rule = node.children.first + "#{tab_str}@at-root #{selector_to_src(rule.rule).lstrip}#{visit_children(rule)}" + else + "#{tab_str}@at-root#{yield}" + end + end + + def visit_keyframerule(node) + "#{tab_str}#{node.resolved_value}#{yield}" + end + + private + + # Visit rule-level nodes and return their conversion with appropriate + # whitespace added. + def visit_rule_level(nodes) + (nodes + [nil]).each_cons(2).map do |child, nxt| + visit(child) + + if nxt && + (child.is_a?(Sass::Tree::CommentNode) && child.line + child.lines + 1 == nxt.line) || + (child.is_a?(Sass::Tree::ImportNode) && nxt.is_a?(Sass::Tree::ImportNode) && + child.line + 1 == nxt.line) || + (child.is_a?(Sass::Tree::VariableNode) && nxt.is_a?(Sass::Tree::VariableNode) && + child.line + 1 == nxt.line) || + (child.is_a?(Sass::Tree::PropNode) && nxt.is_a?(Sass::Tree::PropNode)) || + (child.is_a?(Sass::Tree::MixinNode) && nxt.is_a?(Sass::Tree::MixinNode) && + child.line + 1 == nxt.line) + "" + else + "\n" + end + end.join.rstrip + "\n" + end + + def interp_to_src(interp) + interp.map {|r| r.is_a?(String) ? r : r.to_sass(@options)}.join + end + + # Like interp_to_src, but removes the unnecessary `#{}` around the keys and + # values in query expressions. + def query_interp_to_src(interp) + interp = interp.map do |e| + next e unless e.is_a?(Sass::Script::Tree::Literal) + next e unless e.value.is_a?(Sass::Script::Value::String) + e.value.value + end + + interp_to_src(interp) + end + + def selector_to_src(sel) + @format == :sass ? selector_to_sass(sel) : selector_to_scss(sel) + end + + def selector_to_sass(sel) + sel.map do |r| + if r.is_a?(String) + r.gsub(/(,)?([ \t]*)\n\s*/) {$1 ? "#{$1}#{$2}\n" : " "} + else + r.to_sass(@options) + end + end.join + end + + def selector_to_scss(sel) + interp_to_src(sel).gsub(/^[ \t]*/, tab_str).gsub(/[ \t]*$/, '') + end + + def semi + @format == :sass ? "" : ";" + end + + def tab_str + @tab_chars * @tabs + end + + def dasherize(s) + if @options[:dasherize] + s.tr('_', '-') + else + s + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/cssize.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/cssize.rb new file mode 100644 index 000000000000..6851286ea036 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/cssize.rb @@ -0,0 +1,362 @@ +# A visitor for converting a static Sass tree into a static CSS tree. +class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base + # @param root [Tree::Node] The root node of the tree to visit. + # @return [(Tree::Node, Sass::Util::SubsetMap)] The resulting tree of static nodes + # *and* the extensions defined for this tree + def self.visit(root); super; end + + protected + + # Returns the immediate parent of the current node. + # @return [Tree::Node] + def parent + @parents.last + end + + def initialize + @parents = [] + @extends = Sass::Util::SubsetMap.new + end + + # If an exception is raised, this adds proper metadata to the backtrace. + def visit(node) + super(node) + rescue Sass::SyntaxError => e + e.modify_backtrace(:filename => node.filename, :line => node.line) + raise e + end + + # Keeps track of the current parent node. + def visit_children(parent) + with_parent parent do + parent.children = visit_children_without_parent(parent) + parent + end + end + + # Like {#visit\_children}, but doesn't set {#parent}. + # + # @param node [Sass::Tree::Node] + # @return [Array<Sass::Tree::Node>] the flattened results of + # visiting all the children of `node` + def visit_children_without_parent(node) + node.children.map {|c| visit(c)}.flatten + end + + # Runs a block of code with the current parent node + # replaced with the given node. + # + # @param parent [Tree::Node] The new parent for the duration of the block. + # @yield A block in which the parent is set to `parent`. + # @return [Object] The return value of the block. + def with_parent(parent) + @parents.push parent + yield + ensure + @parents.pop + end + + # Converts the entire document to CSS. + # + # @return [(Tree::Node, Sass::Util::SubsetMap)] The resulting tree of static nodes + # *and* the extensions defined for this tree + def visit_root(node) + yield + + if parent.nil? + imports_to_move = [] + import_limit = nil + i = -1 + node.children.reject! do |n| + i += 1 + if import_limit + next false unless n.is_a?(Sass::Tree::CssImportNode) + imports_to_move << n + next true + end + + if !n.is_a?(Sass::Tree::CommentNode) && + !n.is_a?(Sass::Tree::CharsetNode) && + !n.is_a?(Sass::Tree::CssImportNode) + import_limit = i + end + + false + end + + if import_limit + node.children = node.children[0...import_limit] + imports_to_move + + node.children[import_limit..-1] + end + end + + return node, @extends + rescue Sass::SyntaxError => e + e.sass_template ||= node.template + raise e + end + + # A simple struct wrapping up information about a single `@extend` instance. A + # single {ExtendNode} can have multiple Extends if either the parent node or + # the extended selector is a comma sequence. + # + # @attr extender [Sass::Selector::Sequence] + # The selector of the CSS rule containing the `@extend`. + # @attr target [Array<Sass::Selector::Simple>] The selector being `@extend`ed. + # @attr node [Sass::Tree::ExtendNode] The node that produced this extend. + # @attr directives [Array<Sass::Tree::DirectiveNode>] + # The directives containing the `@extend`. + # @attr success [Boolean] + # Whether this extend successfully matched a selector. + Extend = Struct.new(:extender, :target, :node, :directives, :success) + + # Registers an extension in the `@extends` subset map. + def visit_extend(node) + parent.resolved_rules.populate_extends(@extends, node.resolved_selector, node, + @parents.select {|p| p.is_a?(Sass::Tree::DirectiveNode)}) + [] + end + + # Modifies exception backtraces to include the imported file. + def visit_import(node) + visit_children_without_parent(node) + rescue Sass::SyntaxError => e + e.modify_backtrace(:filename => node.children.first.filename) + e.add_backtrace(:filename => node.filename, :line => node.line) + raise e + end + + # Asserts that all the traced children are valid in their new location. + def visit_trace(node) + visit_children_without_parent(node) + rescue Sass::SyntaxError => e + e.modify_backtrace(:mixin => node.name, :filename => node.filename, :line => node.line) + e.add_backtrace(:filename => node.filename, :line => node.line) + raise e + end + + # Converts nested properties into flat properties + # and updates the indentation of the prop node based on the nesting level. + def visit_prop(node) + if parent.is_a?(Sass::Tree::PropNode) + node.resolved_name = "#{parent.resolved_name}-#{node.resolved_name}" + node.tabs = parent.tabs + (parent.resolved_value.empty? ? 0 : 1) if node.style == :nested + end + + yield + + result = node.children.dup + if !node.resolved_value.empty? || node.children.empty? + node.send(:check!) + result.unshift(node) + end + + result + end + + def visit_atroot(node) + # If there aren't any more directives or rules that this @at-root needs to + # exclude, we can get rid of it and just evaluate the children. + if @parents.none? {|n| node.exclude_node?(n)} + results = visit_children_without_parent(node) + results.each {|c| c.tabs += node.tabs if bubblable?(c)} + if !results.empty? && bubblable?(results.last) + results.last.group_end = node.group_end + end + return results + end + + # If this @at-root excludes the immediate parent, return it as-is so that it + # can be bubbled up by the parent node. + return Bubble.new(node) if node.exclude_node?(parent) + + # Otherwise, duplicate the current parent and move it into the @at-root + # node. As above, returning an @at-root node signals to the parent directive + # that it should be bubbled upwards. + bubble(node) + end + + # The following directives are visible and have children. This means they need + # to be able to handle bubbling up nodes such as @at-root and @media. + + # Updates the indentation of the rule node based on the nesting + # level. The selectors were resolved in {Perform}. + def visit_rule(node) + yield + + rules = node.children.select {|c| bubblable?(c)} + props = node.children.reject {|c| bubblable?(c) || c.invisible?} + + unless props.empty? + node.children = props + rules.each {|r| r.tabs += 1} if node.style == :nested + rules.unshift(node) + end + + rules = debubble(rules) + unless parent.is_a?(Sass::Tree::RuleNode) || rules.empty? || !bubblable?(rules.last) + rules.last.group_end = true + end + rules + end + + def visit_keyframerule(node) + return node unless node.has_children + + yield + + debubble(node.children, node) + end + + # Bubbles a directive up through RuleNodes. + def visit_directive(node) + return node unless node.has_children + if parent.is_a?(Sass::Tree::RuleNode) + # @keyframes shouldn't include the rule nodes, so we manually create a + # bubble that doesn't have the parent's contents for them. + return node.normalized_name == '@keyframes' ? Bubble.new(node) : bubble(node) + end + + yield + + # Since we don't know if the mere presence of an unknown directive may be + # important, we should keep an empty version around even if all the contents + # are removed via @at-root. However, if the contents are just bubbled out, + # we don't need to do so. + directive_exists = node.children.any? do |child| + next true unless child.is_a?(Bubble) + next false unless child.node.is_a?(Sass::Tree::DirectiveNode) + child.node.resolved_value == node.resolved_value + end + + # We know empty @keyframes directives do nothing. + if directive_exists || node.name == '@keyframes' + [] + else + empty_node = node.dup + empty_node.children = [] + [empty_node] + end + debubble(node.children, node) + end + + # Bubbles the `@media` directive up through RuleNodes + # and merges it with other `@media` directives. + def visit_media(node) + return bubble(node) if parent.is_a?(Sass::Tree::RuleNode) + return Bubble.new(node) if parent.is_a?(Sass::Tree::MediaNode) + + yield + + debubble(node.children, node) do |child| + next child unless child.is_a?(Sass::Tree::MediaNode) + # Copies of `node` can be bubbled, and we don't want to merge it with its + # own query. + next child if child.resolved_query == node.resolved_query + next child if child.resolved_query = child.resolved_query.merge(node.resolved_query) + end + end + + # Bubbles the `@supports` directive up through RuleNodes. + def visit_supports(node) + return node unless node.has_children + return bubble(node) if parent.is_a?(Sass::Tree::RuleNode) + + yield + + debubble(node.children, node) + end + + private + + # "Bubbles" `node` one level by copying the parent and wrapping `node`'s + # children with it. + # + # @param node [Sass::Tree::Node]. + # @return [Bubble] + def bubble(node) + new_rule = parent.dup + new_rule.children = node.children + node.children = [new_rule] + Bubble.new(node) + end + + # Pops all bubbles in `children` and intersperses the results with the other + # values. + # + # If `parent` is passed, it's copied and used as the parent node for the + # nested portions of `children`. + # + # @param children [List<Sass::Tree::Node, Bubble>] + # @param parent [Sass::Tree::Node] + # @yield [node] An optional block for processing bubbled nodes. Each bubbled + # node will be passed to this block. + # @yieldparam node [Sass::Tree::Node] A bubbled node. + # @yieldreturn [Sass::Tree::Node?] A node to use in place of the bubbled node. + # This can be the node itself, or `nil` to indicate that the node should be + # omitted. + # @return [List<Sass::Tree::Node, Bubble>] + def debubble(children, parent = nil) + # Keep track of the previous parent so that we don't divide `parent` + # unnecessarily if the `@at-root` doesn't produce any new nodes (e.g. + # `@at-root {@extend %foo}`). + previous_parent = nil + + Sass::Util.slice_by(children) {|c| c.is_a?(Bubble)}.map do |(is_bubble, slice)| + unless is_bubble + next slice unless parent + if previous_parent + previous_parent.children.push(*slice) + next [] + else + previous_parent = new_parent = parent.dup + new_parent.children = slice + next new_parent + end + end + + slice.map do |bubble| + next unless (node = block_given? ? yield(bubble.node) : bubble.node) + node.tabs += bubble.tabs + node.group_end = bubble.group_end + results = [visit(node)].flatten + previous_parent = nil unless results.empty? + results + end.compact + end.flatten + end + + # Returns whether or not a node can be bubbled up through the syntax tree. + # + # @param node [Sass::Tree::Node] + # @return [Boolean] + def bubblable?(node) + node.is_a?(Sass::Tree::RuleNode) || node.bubbles? + end + + # A wrapper class for a node that indicates to the parent that it should + # treat the wrapped node as a sibling rather than a child. + # + # Nodes should be wrapped before they're passed to \{Cssize.visit}. They will + # be automatically visited upon calling \{#pop}. + # + # This duck types as a [Sass::Tree::Node] for the purposes of + # tree-manipulation operations. + class Bubble + attr_accessor :node + attr_accessor :tabs + attr_accessor :group_end + + def initialize(node) + @node = node + @tabs = 0 + end + + def bubbles? + true + end + + def inspect + "(Bubble #{node.inspect})" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/deep_copy.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/deep_copy.rb new file mode 100644 index 000000000000..85d7ba53db28 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/deep_copy.rb @@ -0,0 +1,107 @@ +# A visitor for copying the full structure of a Sass tree. +class Sass::Tree::Visitors::DeepCopy < Sass::Tree::Visitors::Base + protected + + def visit(node) + super(node.dup) + end + + def visit_children(parent) + parent.children = parent.children.map {|c| visit(c)} + parent + end + + def visit_debug(node) + node.expr = node.expr.deep_copy + yield + end + + def visit_error(node) + node.expr = node.expr.deep_copy + yield + end + + def visit_each(node) + node.list = node.list.deep_copy + yield + end + + def visit_extend(node) + node.selector = node.selector.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c} + yield + end + + def visit_for(node) + node.from = node.from.deep_copy + node.to = node.to.deep_copy + yield + end + + def visit_function(node) + node.args = node.args.map {|k, v| [k.deep_copy, v && v.deep_copy]} + yield + end + + def visit_if(node) + node.expr = node.expr.deep_copy if node.expr + node.else = visit(node.else) if node.else + yield + end + + def visit_mixindef(node) + node.args = node.args.map {|k, v| [k.deep_copy, v && v.deep_copy]} + yield + end + + def visit_mixin(node) + node.args = node.args.map {|a| a.deep_copy} + node.keywords = Sass::Util::NormalizedMap.new(Hash[node.keywords.map {|k, v| [k, v.deep_copy]}]) + yield + end + + def visit_prop(node) + node.name = node.name.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c} + node.value = node.value.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c} + yield + end + + def visit_return(node) + node.expr = node.expr.deep_copy + yield + end + + def visit_rule(node) + node.rule = node.rule.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c} + yield + end + + def visit_variable(node) + node.expr = node.expr.deep_copy + yield + end + + def visit_warn(node) + node.expr = node.expr.deep_copy + yield + end + + def visit_while(node) + node.expr = node.expr.deep_copy + yield + end + + def visit_directive(node) + node.value = node.value.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c} + yield + end + + def visit_media(node) + node.query = node.query.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c} + yield + end + + def visit_supports(node) + node.condition = node.condition.deep_copy + yield + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/extend.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/extend.rb new file mode 100644 index 000000000000..ffc3e216d8d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/extend.rb @@ -0,0 +1,64 @@ +# A visitor for performing selector inheritance on a static CSS tree. +# +# Destructively modifies the tree. +class Sass::Tree::Visitors::Extend < Sass::Tree::Visitors::Base + # Performs the given extensions on the static CSS tree based in `root`, then + # validates that all extends matched some selector. + # + # @param root [Tree::Node] The root node of the tree to visit. + # @param extends [Sass::Util::SubsetMap{Selector::Simple => + # Sass::Tree::Visitors::Cssize::Extend}] + # The extensions to perform on this tree. + # @return [Object] The return value of \{#visit} for the root node. + def self.visit(root, extends) + return if extends.empty? + new(extends).send(:visit, root) + check_extends_fired! extends + end + + protected + + def initialize(extends) + @parent_directives = [] + @extends = extends + end + + # If an exception is raised, this adds proper metadata to the backtrace. + def visit(node) + super(node) + rescue Sass::SyntaxError => e + e.modify_backtrace(:filename => node.filename, :line => node.line) + raise e + end + + # Keeps track of the current parent directives. + def visit_children(parent) + @parent_directives.push parent if parent.is_a?(Sass::Tree::DirectiveNode) + super + ensure + @parent_directives.pop if parent.is_a?(Sass::Tree::DirectiveNode) + end + + # Applies the extend to a single rule's selector. + def visit_rule(node) + node.resolved_rules = node.resolved_rules.do_extend(@extends, @parent_directives) + end + + class << self + private + + def check_extends_fired!(extends) + extends.each_value do |ex| + next if ex.success || ex.node.optional? + message = "\"#{ex.extender}\" failed to @extend \"#{ex.target.join}\"." + + # TODO(nweiz): this should use the Sass stack trace of the extend node. + raise Sass::SyntaxError.new(<<MESSAGE, :filename => ex.node.filename, :line => ex.node.line) +#{message} +The selector "#{ex.target.join}" was not found. +Use "@extend #{ex.target.join} !optional" if the extend should be able to fail. +MESSAGE + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/perform.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/perform.rb new file mode 100644 index 000000000000..c99701426846 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/perform.rb @@ -0,0 +1,572 @@ +# A visitor for converting a dynamic Sass tree into a static Sass tree. +class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base + @@function_name_deprecation = Sass::Deprecation.new + + class << self + # @param root [Tree::Node] The root node of the tree to visit. + # @param environment [Sass::Environment] The lexical environment. + # @return [Tree::Node] The resulting tree of static nodes. + def visit(root, environment = nil) + new(environment).send(:visit, root) + end + + # @api private + def perform_arguments(callable, args, splat, environment) + desc = "#{callable.type.capitalize} #{callable.name}" + downcase_desc = "#{callable.type} #{callable.name}" + + # All keywords are contained in splat.keywords for consistency, + # even if there were no splats passed in. + old_keywords_accessed = splat.keywords_accessed + keywords = splat.keywords + splat.keywords_accessed = old_keywords_accessed + + begin + unless keywords.empty? + unknown_args = Sass::Util.array_minus(keywords.keys, + callable.args.map {|var| var.first.underscored_name}) + if callable.splat && unknown_args.include?(callable.splat.underscored_name) + raise Sass::SyntaxError.new("Argument $#{callable.splat.name} of #{downcase_desc} " + + "cannot be used as a named argument.") + elsif unknown_args.any? + description = unknown_args.length > 1 ? 'the following arguments:' : 'an argument named' + raise Sass::SyntaxError.new("#{desc} doesn't have #{description} " + + "#{unknown_args.map {|name| "$#{name}"}.join ', '}.") + end + end + rescue Sass::SyntaxError => keyword_exception + end + + # If there's no splat, raise the keyword exception immediately. The actual + # raising happens in the ensure clause at the end of this function. + return if keyword_exception && !callable.splat + + splat_sep = :comma + if splat + args += splat.to_a + splat_sep = splat.separator + end + + if args.size > callable.args.size && !callable.splat + extra_args_because_of_splat = splat && args.size - splat.to_a.size <= callable.args.size + + takes = callable.args.size + passed = args.size + message = "#{desc} takes #{takes} argument#{'s' unless takes == 1} " + + "but #{passed} #{passed == 1 ? 'was' : 'were'} passed." + raise Sass::SyntaxError.new(message) unless extra_args_because_of_splat + # TODO: when the deprecation period is over, make this an error. + Sass::Util.sass_warn("WARNING: #{message}\n" + + environment.stack.to_s.gsub(/^/m, " " * 8) + "\n" + + "This will be an error in future versions of Sass.") + end + + env = Sass::Environment.new(callable.environment) + callable.args.zip(args[0...callable.args.length]) do |(var, default), value| + if value && keywords.has_key?(var.name) + raise Sass::SyntaxError.new("#{desc} was passed argument $#{var.name} " + + "both by position and by name.") + end + + value ||= keywords.delete(var.name) + value ||= default && default.perform(env) + raise Sass::SyntaxError.new("#{desc} is missing argument #{var.inspect}.") unless value + env.set_local_var(var.name, value) + end + + if callable.splat + rest = args[callable.args.length..-1] || [] + arg_list = Sass::Script::Value::ArgList.new(rest, keywords, splat_sep) + arg_list.options = env.options + env.set_local_var(callable.splat.name, arg_list) + end + + yield env + rescue StandardError => e + ensure + # If there's a keyword exception, we don't want to throw it immediately, + # because the invalid keywords may be part of a glob argument that should be + # passed on to another function. So we only raise it if we reach the end of + # this function *and* the keywords attached to the argument list glob object + # haven't been accessed. + # + # The keyword exception takes precedence over any Sass errors, but not over + # non-Sass exceptions. + if keyword_exception && + !(arg_list && arg_list.keywords_accessed) && + (e.nil? || e.is_a?(Sass::SyntaxError)) + raise keyword_exception + elsif e + raise e + end + end + + # @api private + # @return [Sass::Script::Value::ArgList] + def perform_splat(splat, performed_keywords, kwarg_splat, environment) + args, kwargs, separator = [], nil, :comma + + if splat + splat = splat.perform(environment) + separator = splat.separator || separator + if splat.is_a?(Sass::Script::Value::ArgList) + args = splat.to_a + kwargs = splat.keywords + elsif splat.is_a?(Sass::Script::Value::Map) + kwargs = arg_hash(splat) + else + args = splat.to_a + end + end + kwargs ||= Sass::Util::NormalizedMap.new + kwargs.update(performed_keywords) + + if kwarg_splat + kwarg_splat = kwarg_splat.perform(environment) + unless kwarg_splat.is_a?(Sass::Script::Value::Map) + raise Sass::SyntaxError.new("Variable keyword arguments must be a map " + + "(was #{kwarg_splat.inspect}).") + end + kwargs.update(arg_hash(kwarg_splat)) + end + + Sass::Script::Value::ArgList.new(args, kwargs, separator) + end + + private + + def arg_hash(map) + Sass::Util.map_keys(map.to_h) do |key| + next key.value if key.is_a?(Sass::Script::Value::String) + raise Sass::SyntaxError.new("Variable keyword argument map must have string keys.\n" + + "#{key.inspect} is not a string in #{map.inspect}.") + end + end + end + + protected + + def initialize(env) + @environment = env + @in_keyframes = false + @at_root_without_rule = false + end + + # If an exception is raised, this adds proper metadata to the backtrace. + def visit(node) + return super(node.dup) unless @environment + @environment.stack.with_base(node.filename, node.line) {super(node.dup)} + rescue Sass::SyntaxError => e + e.modify_backtrace(:filename => node.filename, :line => node.line) + raise e + end + + # Keeps track of the current environment. + def visit_children(parent) + with_environment Sass::Environment.new(@environment, parent.options) do + parent.children = super.flatten + parent + end + end + + # Runs a block of code with the current environment replaced with the given one. + # + # @param env [Sass::Environment] The new environment for the duration of the block. + # @yield A block in which the environment is set to `env`. + # @return [Object] The return value of the block. + def with_environment(env) + old_env, @environment = @environment, env + yield + ensure + @environment = old_env + end + + # Sets the options on the environment if this is the top-level root. + def visit_root(node) + yield + rescue Sass::SyntaxError => e + e.sass_template ||= node.template + raise e + end + + # Removes this node from the tree if it's a silent comment. + def visit_comment(node) + return [] if node.invisible? + node.resolved_value = run_interp_no_strip(node.value) + node.resolved_value.gsub!(/\\([\\#])/, '\1') + node + end + + # Prints the expression to STDERR. + def visit_debug(node) + res = node.expr.perform(@environment) + if res.is_a?(Sass::Script::Value::String) + res = res.value + else + res = res.to_sass + end + if node.filename + Sass::Util.sass_warn "#{node.filename}:#{node.line} DEBUG: #{res}" + else + Sass::Util.sass_warn "Line #{node.line} DEBUG: #{res}" + end + [] + end + + # Throws the expression as an error. + def visit_error(node) + res = node.expr.perform(@environment) + if res.is_a?(Sass::Script::Value::String) + res = res.value + else + res = res.to_sass + end + raise Sass::SyntaxError.new(res) + end + + # Runs the child nodes once for each value in the list. + def visit_each(node) + list = node.list.perform(@environment) + + with_environment Sass::SemiGlobalEnvironment.new(@environment) do + list.to_a.map do |value| + if node.vars.length == 1 + @environment.set_local_var(node.vars.first, value) + else + node.vars.zip(value.to_a) do |(var, sub_value)| + @environment.set_local_var(var, sub_value || Sass::Script::Value::Null.new) + end + end + node.children.map {|c| visit(c)} + end.flatten + end + end + + # Runs SassScript interpolation in the selector, + # and then parses the result into a {Sass::Selector::CommaSequence}. + def visit_extend(node) + parser = Sass::SCSS::StaticParser.new(run_interp(node.selector), + node.filename, node.options[:importer], node.line) + node.resolved_selector = parser.parse_selector + node + end + + # Runs the child nodes once for each time through the loop, varying the variable each time. + def visit_for(node) + from = node.from.perform(@environment) + to = node.to.perform(@environment) + from.assert_int! + to.assert_int! + + to = to.coerce(from.numerator_units, from.denominator_units) + direction = from.to_i > to.to_i ? -1 : 1 + range = Range.new(direction * from.to_i, direction * to.to_i, node.exclusive) + + with_environment Sass::SemiGlobalEnvironment.new(@environment) do + range.map do |i| + @environment.set_local_var(node.var, + Sass::Script::Value::Number.new(direction * i, + from.numerator_units, from.denominator_units)) + node.children.map {|c| visit(c)} + end.flatten + end + end + + # Loads the function into the environment. + def visit_function(node) + env = Sass::Environment.new(@environment, node.options) + + if node.normalized_name == 'calc' || node.normalized_name == 'element' || + node.name == 'expression' || node.name == 'url' + @@function_name_deprecation.warn(node.filename, node.line, <<WARNING) +Naming a function "#{node.name}" is disallowed and will be an error in future versions of Sass. +This name conflicts with an existing CSS function with special parse rules. +WARNING + end + + @environment.set_local_function(node.name, + Sass::Callable.new(node.name, node.args, node.splat, env, + node.children, false, "function", :stylesheet)) + [] + end + + # Runs the child nodes if the conditional expression is true; + # otherwise, tries the else nodes. + def visit_if(node) + if node.expr.nil? || node.expr.perform(@environment).to_bool + with_environment Sass::SemiGlobalEnvironment.new(@environment) do + node.children.map {|c| visit(c)} + end.flatten + elsif node.else + visit(node.else) + else + [] + end + end + + # Returns a static DirectiveNode if this is importing a CSS file, + # or parses and includes the imported Sass file. + def visit_import(node) + if (path = node.css_import?) + resolved_node = Sass::Tree::CssImportNode.resolved("url(#{path})") + resolved_node.options = node.options + resolved_node.source_range = node.source_range + return resolved_node + end + file = node.imported_file + if @environment.stack.frames.any? {|f| f.is_import? && f.filename == file.options[:filename]} + handle_import_loop!(node) + end + + begin + @environment.stack.with_import(node.filename, node.line) do + root = file.to_tree + Sass::Tree::Visitors::CheckNesting.visit(root) + node.children = root.children.map {|c| visit(c)}.flatten + node + end + rescue Sass::SyntaxError => e + e.modify_backtrace(:filename => node.imported_file.options[:filename]) + e.add_backtrace(:filename => node.filename, :line => node.line) + raise e + end + end + + # Loads a mixin into the environment. + def visit_mixindef(node) + env = Sass::Environment.new(@environment, node.options) + @environment.set_local_mixin(node.name, + Sass::Callable.new(node.name, node.args, node.splat, env, + node.children, node.has_content, "mixin", :stylesheet)) + [] + end + + # Runs a mixin. + def visit_mixin(node) + @environment.stack.with_mixin(node.filename, node.line, node.name) do + mixin = @environment.mixin(node.name) + raise Sass::SyntaxError.new("Undefined mixin '#{node.name}'.") unless mixin + + if node.has_children && !mixin.has_content + raise Sass::SyntaxError.new(%(Mixin "#{node.name}" does not accept a content block.)) + end + + args = node.args.map {|a| a.perform(@environment)} + keywords = Sass::Util.map_vals(node.keywords) {|v| v.perform(@environment)} + splat = self.class.perform_splat(node.splat, keywords, node.kwarg_splat, @environment) + + self.class.perform_arguments(mixin, args, splat, @environment) do |env| + env.caller = Sass::Environment.new(@environment) + env.content = [node.children, @environment] if node.has_children + + trace_node = Sass::Tree::TraceNode.from_node(node.name, node) + with_environment(env) {trace_node.children = mixin.tree.map {|c| visit(c)}.flatten} + trace_node + end + end + rescue Sass::SyntaxError => e + e.modify_backtrace(:mixin => node.name, :line => node.line) + e.add_backtrace(:line => node.line) + raise e + end + + def visit_content(node) + content, content_env = @environment.content + return [] unless content + @environment.stack.with_mixin(node.filename, node.line, '@content') do + trace_node = Sass::Tree::TraceNode.from_node('@content', node) + content_env = Sass::Environment.new(content_env) + content_env.caller = Sass::Environment.new(@environment) + with_environment(content_env) do + trace_node.children = content.map {|c| visit(c.dup)}.flatten + end + trace_node + end + rescue Sass::SyntaxError => e + e.modify_backtrace(:mixin => '@content', :line => node.line) + e.add_backtrace(:line => node.line) + raise e + end + + # Runs any SassScript that may be embedded in a property. + def visit_prop(node) + node.resolved_name = run_interp(node.name) + + # If the node's value is just a variable or similar, we may get a useful + # source range from evaluating it. + if node.value.length == 1 && node.value.first.is_a?(Sass::Script::Tree::Node) + result = node.value.first.perform(@environment) + node.resolved_value = result.to_s + node.value_source_range = result.source_range if result.source_range + elsif node.custom_property? + node.resolved_value = run_interp_no_strip(node.value) + else + node.resolved_value = run_interp(node.value) + end + + yield + end + + # Returns the value of the expression. + def visit_return(node) + throw :_sass_return, node.expr.perform(@environment) + end + + # Runs SassScript interpolation in the selector, + # and then parses the result into a {Sass::Selector::CommaSequence}. + def visit_rule(node) + old_at_root_without_rule = @at_root_without_rule + parser = Sass::SCSS::StaticParser.new(run_interp(node.rule), + node.filename, node.options[:importer], node.line) + if @in_keyframes + keyframe_rule_node = Sass::Tree::KeyframeRuleNode.new(parser.parse_keyframes_selector) + keyframe_rule_node.options = node.options + keyframe_rule_node.line = node.line + keyframe_rule_node.filename = node.filename + keyframe_rule_node.source_range = node.source_range + keyframe_rule_node.has_children = node.has_children + with_environment Sass::Environment.new(@environment, node.options) do + keyframe_rule_node.children = node.children.map {|c| visit(c)}.flatten + end + keyframe_rule_node + else + @at_root_without_rule = false + node.parsed_rules ||= parser.parse_selector + node.resolved_rules = node.parsed_rules.resolve_parent_refs( + @environment.selector, !old_at_root_without_rule) + node.stack_trace = @environment.stack.to_s if node.options[:trace_selectors] + with_environment Sass::Environment.new(@environment, node.options) do + @environment.selector = node.resolved_rules + node.children = node.children.map {|c| visit(c)}.flatten + end + node + end + ensure + @at_root_without_rule = old_at_root_without_rule + end + + # Sets a variable that indicates that the first level of rule nodes + # shouldn't include the parent selector by default. + def visit_atroot(node) + if node.query + parser = Sass::SCSS::StaticParser.new(run_interp(node.query), + node.filename, node.options[:importer], node.line) + node.resolved_type, node.resolved_value = parser.parse_static_at_root_query + else + node.resolved_type, node.resolved_value = :without, ['rule'] + end + + old_at_root_without_rule = @at_root_without_rule + old_in_keyframes = @in_keyframes + @at_root_without_rule = true if node.exclude?('rule') + @in_keyframes = false if node.exclude?('keyframes') + yield + ensure + @in_keyframes = old_in_keyframes + @at_root_without_rule = old_at_root_without_rule + end + + # Loads the new variable value into the environment. + def visit_variable(node) + env = @environment + env = env.global_env if node.global + if node.guarded + var = env.var(node.name) + return [] if var && !var.null? + end + + val = node.expr.perform(@environment) + if node.expr.source_range + val.source_range = node.expr.source_range + else + val.source_range = node.source_range + end + env.set_var(node.name, val) + [] + end + + # Prints the expression to STDERR with a stylesheet trace. + def visit_warn(node) + res = node.expr.perform(@environment) + res = res.value if res.is_a?(Sass::Script::Value::String) + @environment.stack.with_directive(node.filename, node.line, "@warn") do + msg = "WARNING: #{res}\n " + msg << @environment.stack.to_s.gsub("\n", "\n ") << "\n" + Sass::Util.sass_warn msg + end + [] + end + + # Runs the child nodes until the continuation expression becomes false. + def visit_while(node) + children = [] + with_environment Sass::SemiGlobalEnvironment.new(@environment) do + children += node.children.map {|c| visit(c)} while node.expr.perform(@environment).to_bool + end + children.flatten + end + + def visit_directive(node) + node.resolved_value = run_interp(node.value) + old_in_keyframes, @in_keyframes = @in_keyframes, node.normalized_name == "@keyframes" + with_environment Sass::Environment.new(@environment) do + node.children = node.children.map {|c| visit(c)}.flatten + node + end + ensure + @in_keyframes = old_in_keyframes + end + + def visit_media(node) + parser = Sass::SCSS::StaticParser.new(run_interp(node.query), + node.filename, node.options[:importer], node.line) + node.resolved_query ||= parser.parse_media_query_list + yield + end + + def visit_supports(node) + node.condition = node.condition.deep_copy + node.condition.perform(@environment) + yield + end + + def visit_cssimport(node) + node.resolved_uri = run_interp([node.uri]) + if node.query && !node.query.empty? + parser = Sass::SCSS::StaticParser.new(run_interp(node.query), + node.filename, node.options[:importer], node.line) + node.resolved_query ||= parser.parse_media_query_list + end + if node.supports_condition + node.supports_condition.perform(@environment) + end + yield + end + + private + + def run_interp_no_strip(text) + text.map do |r| + next r if r.is_a?(String) + r.perform(@environment).to_s(:quote => :none) + end.join + end + + def run_interp(text) + Sass::Util.strip_except_escapes(run_interp_no_strip(text)) + end + + def handle_import_loop!(node) + msg = "An @import loop has been found:" + files = @environment.stack.frames.select {|f| f.is_import?}.map {|f| f.filename}.compact + if node.filename == node.imported_file.options[:filename] + raise Sass::SyntaxError.new("#{msg} #{node.filename} imports itself") + end + + files << node.filename << node.imported_file.options[:filename] + msg << "\n" << files.each_cons(2).map do |m1, m2| + " #{m1} imports #{m2}" + end.join("\n") + raise Sass::SyntaxError.new(msg) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/set_options.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/set_options.rb new file mode 100644 index 000000000000..75f4a2bd6c41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/set_options.rb @@ -0,0 +1,139 @@ +# A visitor for setting options on the Sass tree +class Sass::Tree::Visitors::SetOptions < Sass::Tree::Visitors::Base + # @param root [Tree::Node] The root node of the tree to visit. + # @param options [{Symbol => Object}] The options has to set. + def self.visit(root, options); new(options).send(:visit, root); end + + protected + + def initialize(options) + @options = options + end + + def visit(node) + node.instance_variable_set('@options', @options) + super + end + + def visit_comment(node) + node.value.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)} + yield + end + + def visit_debug(node) + node.expr.options = @options + yield + end + + def visit_error(node) + node.expr.options = @options + yield + end + + def visit_each(node) + node.list.options = @options + yield + end + + def visit_extend(node) + node.selector.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)} + yield + end + + def visit_for(node) + node.from.options = @options + node.to.options = @options + yield + end + + def visit_function(node) + node.args.each do |k, v| + k.options = @options + v.options = @options if v + end + node.splat.options = @options if node.splat + yield + end + + def visit_if(node) + node.expr.options = @options if node.expr + visit(node.else) if node.else + yield + end + + def visit_import(node) + # We have no good way of propagating the new options through an Engine + # instance, so we just null it out. This also lets us avoid caching an + # imported Engine along with the importing source tree. + node.imported_file = nil + yield + end + + def visit_mixindef(node) + node.args.each do |k, v| + k.options = @options + v.options = @options if v + end + node.splat.options = @options if node.splat + yield + end + + def visit_mixin(node) + node.args.each {|a| a.options = @options} + node.keywords.each {|_k, v| v.options = @options} + node.splat.options = @options if node.splat + node.kwarg_splat.options = @options if node.kwarg_splat + yield + end + + def visit_prop(node) + node.name.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)} + node.value.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)} + yield + end + + def visit_return(node) + node.expr.options = @options + yield + end + + def visit_rule(node) + node.rule.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)} + yield + end + + def visit_variable(node) + node.expr.options = @options + yield + end + + def visit_warn(node) + node.expr.options = @options + yield + end + + def visit_while(node) + node.expr.options = @options + yield + end + + def visit_directive(node) + node.value.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)} + yield + end + + def visit_media(node) + node.query.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)} + yield + end + + def visit_cssimport(node) + node.query.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)} if node.query + yield + end + + def visit_supports(node) + node.condition.options = @options + yield + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/to_css.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/to_css.rb new file mode 100644 index 000000000000..29ec285e1abf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/visitors/to_css.rb @@ -0,0 +1,436 @@ +# A visitor for converting a Sass tree into CSS. +class Sass::Tree::Visitors::ToCss < Sass::Tree::Visitors::Base + # The source mapping for the generated CSS file. This is only set if + # `build_source_mapping` is passed to the constructor and \{Sass::Engine#render} has been + # run. + attr_reader :source_mapping + + # @param build_source_mapping [Boolean] Whether to build a + # \{Sass::Source::Map} while creating the CSS output. The mapping will + # be available from \{#source\_mapping} after the visitor has completed. + def initialize(build_source_mapping = false) + @tabs = 0 + @line = 1 + @offset = 1 + @result = String.new("") + @source_mapping = build_source_mapping ? Sass::Source::Map.new : nil + @lstrip = nil + @in_directive = false + end + + # Runs the visitor on `node`. + # + # @param node [Sass::Tree::Node] The root node of the tree to convert to CSS> + # @return [String] The CSS output. + def visit(node) + super + rescue Sass::SyntaxError => e + e.modify_backtrace(:filename => node.filename, :line => node.line) + raise e + end + + protected + + def with_tabs(tabs) + old_tabs, @tabs = @tabs, tabs + yield + ensure + @tabs = old_tabs + end + + # Associate all output produced in a block with a given node. Used for source + # mapping. + def for_node(node, attr_prefix = nil) + return yield unless @source_mapping + start_pos = Sass::Source::Position.new(@line, @offset) + yield + + range_attr = attr_prefix ? :"#{attr_prefix}_source_range" : :source_range + return if node.invisible? || !node.send(range_attr) + source_range = node.send(range_attr) + target_end_pos = Sass::Source::Position.new(@line, @offset) + target_range = Sass::Source::Range.new(start_pos, target_end_pos, nil) + @source_mapping.add(source_range, target_range) + end + + def trailing_semicolon? + @result.end_with?(";") && !@result.end_with?('\;') + end + + # Move the output cursor back `chars` characters. + def erase!(chars) + return if chars == 0 + str = @result.slice!(-chars..-1) + newlines = str.count("\n") + if newlines > 0 + @line -= newlines + @offset = @result[@result.rindex("\n") || 0..-1].size + else + @offset -= chars + end + end + + # Avoid allocating lots of new strings for `#output`. This is important + # because `#output` is called all the time. + NEWLINE = "\n" + + # Add `s` to the output string and update the line and offset information + # accordingly. + def output(s) + if @lstrip + s = s.gsub(/\A\s+/, "") + @lstrip = false + end + + newlines = s.count(NEWLINE) + if newlines > 0 + @line += newlines + @offset = s[s.rindex(NEWLINE)..-1].size + else + @offset += s.size + end + + @result << s + end + + # Strip all trailing whitespace from the output string. + def rstrip! + erase! @result.length - 1 - (@result.rindex(/[^\s]/) || -1) + end + + # lstrip the first output in the given block. + def lstrip + old_lstrip = @lstrip + @lstrip = true + yield + ensure + @lstrip &&= old_lstrip + end + + # Prepend `prefix` to the output string. + def prepend!(prefix) + @result.insert 0, prefix + return unless @source_mapping + + line_delta = prefix.count("\n") + offset_delta = prefix.gsub(/.*\n/, '').size + @source_mapping.shift_output_offsets(offset_delta) + @source_mapping.shift_output_lines(line_delta) + end + + def visit_root(node) + node.children.each do |child| + next if child.invisible? + visit(child) + next if node.style == :compressed + output "\n" + next unless child.is_a?(Sass::Tree::DirectiveNode) && child.has_children && !child.bubbles? + output "\n" + end + rstrip! + if node.style == :compressed && trailing_semicolon? + erase! 1 + end + return "" if @result.empty? + + output "\n" + + unless @result.ascii_only? + if node.style == :compressed + # A byte order mark is sufficient to tell browsers that this + # file is UTF-8 encoded, and will override any other detection + # methods as per http://encoding.spec.whatwg.org/#decode-and-encode. + prepend! "\uFEFF" + else + prepend! "@charset \"UTF-8\";\n" + end + end + + @result + rescue Sass::SyntaxError => e + e.sass_template ||= node.template + raise e + end + + def visit_charset(node) + for_node(node) {output("@charset \"#{node.name}\";")} + end + + def visit_comment(node) + return if node.invisible? + spaces = (' ' * [@tabs - node.resolved_value[/^ */].size, 0].max) + output(spaces) + + content = node.resolved_value.split("\n").join("\n" + spaces) + if node.type == :silent + content.gsub!(%r{^(\s*)//(.*)$}) {"#{$1}/*#{$2} */"} + end + if (node.style == :compact || node.style == :compressed) && node.type != :loud + content.gsub!(%r{\n +(\* *(?!/))?}, ' ') + end + for_node(node) {output(content)} + end + + def visit_directive(node) + was_in_directive = @in_directive + tab_str = ' ' * @tabs + if !node.has_children || node.children.empty? + output(tab_str) + for_node(node) {output(node.resolved_value)} + if node.has_children + output("#{' ' unless node.style == :compressed}{}") + elsif node.children.empty? + output(";") + end + return + end + + @in_directive ||= !node.is_a?(Sass::Tree::MediaNode) + output(tab_str) if node.style != :compressed + for_node(node) {output(node.resolved_value)} + output(node.style == :compressed ? "{" : " {") + output(node.style == :compact ? ' ' : "\n") if node.style != :compressed + + had_children = true + first = true + node.children.each do |child| + next if child.invisible? + if node.style == :compact + if child.is_a?(Sass::Tree::PropNode) + with_tabs(first || !had_children ? 0 : @tabs + 1) do + visit(child) + output(' ') + end + else + unless had_children + erase! 1 + output "\n" + end + + if first + lstrip {with_tabs(@tabs + 1) {visit(child)}} + else + with_tabs(@tabs + 1) {visit(child)} + end + + rstrip! + output "\n" + end + had_children = child.has_children + first = false + elsif node.style == :compressed + unless had_children + output(";") unless trailing_semicolon? + end + with_tabs(0) {visit(child)} + had_children = child.has_children + else + with_tabs(@tabs + 1) {visit(child)} + output "\n" + end + end + rstrip! + if node.style == :compressed && trailing_semicolon? + erase! 1 + end + if node.style == :expanded + output("\n#{tab_str}") + elsif node.style != :compressed + output(" ") + end + output("}") + ensure + @in_directive = was_in_directive + end + + def visit_media(node) + with_tabs(@tabs + node.tabs) {visit_directive(node)} + output("\n") if node.style != :compressed && node.group_end + end + + def visit_supports(node) + visit_media(node) + end + + def visit_cssimport(node) + visit_directive(node) + end + + def visit_prop(node) + return if node.resolved_value.empty? && !node.custom_property? + tab_str = ' ' * (@tabs + node.tabs) + output(tab_str) + for_node(node, :name) {output(node.resolved_name)} + output(":") + output(" ") unless node.style == :compressed || node.custom_property? + for_node(node, :value) do + output(if node.custom_property? + format_custom_property_value(node) + else + node.resolved_value + end) + end + output(";") unless node.style == :compressed + end + + def visit_rule(node) + with_tabs(@tabs + node.tabs) do + rule_separator = node.style == :compressed ? ',' : ', ' + line_separator = + case node.style + when :nested, :expanded; "\n" + when :compressed; "" + else; " " + end + rule_indent = ' ' * @tabs + per_rule_indent, total_indent = if [:nested, :expanded].include?(node.style) + [rule_indent, ''] + else + ['', rule_indent] + end + + joined_rules = node.resolved_rules.members.map do |seq| + next if seq.invisible? + rule_part = seq.to_s(style: node.style, placeholder: false) + if node.style == :compressed + rule_part.gsub!(/([^,])\s*\n\s*/m, '\1 ') + rule_part.gsub!(/\s*([+>])\s*/m, '\1') + rule_part.gsub!(/nth([^( ]*)\(([^)]*)\)/m) do |match| + match.tr(" \t\n", "") + end + rule_part = Sass::Util.strip_except_escapes(rule_part) + end + rule_part + end.compact.join(rule_separator) + + joined_rules.lstrip! + joined_rules.gsub!(/\s*\n\s*/, "#{line_separator}#{per_rule_indent}") + + old_spaces = ' ' * @tabs + if node.style != :compressed + if node.options[:debug_info] && !@in_directive + visit(debug_info_rule(node.debug_info, node.options)) + output "\n" + elsif node.options[:trace_selectors] + output("#{old_spaces}/* ") + output(node.stack_trace.gsub("\n", "\n #{old_spaces}")) + output(" */\n") + elsif node.options[:line_comments] + output("#{old_spaces}/* line #{node.line}") + + if node.filename + relative_filename = + if node.options[:css_filename] + begin + Sass::Util.relative_path_from( + node.filename, File.dirname(node.options[:css_filename])).to_s + rescue ArgumentError + nil + end + end + relative_filename ||= node.filename + output(", #{relative_filename}") + end + + output(" */\n") + end + end + + end_props, trailer, tabs = '', '', 0 + if node.style == :compact + separator, end_props, bracket = ' ', ' ', ' { ' + trailer = "\n" if node.group_end + elsif node.style == :compressed + separator, bracket = ';', '{' + else + tabs = @tabs + 1 + separator, bracket = "\n", " {\n" + trailer = "\n" if node.group_end + end_props = (node.style == :expanded ? "\n" + old_spaces : ' ') + end + output(total_indent + per_rule_indent) + for_node(node, :selector) {output(joined_rules)} + output(bracket) + + with_tabs(tabs) do + node.children.each_with_index do |child, i| + if i > 0 + if separator.start_with?(";") && trailing_semicolon? + erase! 1 + end + output(separator) + end + visit(child) + end + end + if node.style == :compressed && trailing_semicolon? + erase! 1 + end + + output(end_props) + output("}" + trailer) + end + end + + def visit_keyframerule(node) + visit_directive(node) + end + + private + + # Reformats the value of `node` so that it's nicely indented, preserving its + # existing relative indentation. + # + # @param node [Sass::Script::Tree::PropNode] A custom property node. + # @return [String] + def format_custom_property_value(node) + value = node.resolved_value.sub(/\n[ \t\r\f\n]*\Z/, ' ') + if node.style == :compact || node.style == :compressed || !value.include?("\n") + # Folding not involving newlines was done in the parser. We can safely + # fold newlines here because tokens like strings can't contain literal + # newlines, so we know any adjacent whitespace is tokenized as whitespace. + return node.resolved_value.gsub(/[ \t\r\f]*\n[ \t\r\f\n]*/, ' ') + end + + # Find the smallest amount of indentation in the custom property and use + # that as the base indentation level. + lines = value.split("\n") + indented_lines = lines[1..-1] + min_indentation = indented_lines. + map {|line| line[/^[ \t]*/]}. + reject {|line| line.empty?}. + min_by {|line| line.length} + + # Limit the base indentation to the same indentation level as the node name + # so that if *every* line is indented relative to the property name that's + # preserved. + if node.name_source_range + base_indentation = min_indentation[0...node.name_source_range.start_pos.offset - 1] + end + + lines.first + "\n" + indented_lines.join("\n").gsub(/^#{base_indentation}/, ' ' * @tabs) + end + + def debug_info_rule(debug_info, options) + node = Sass::Tree::DirectiveNode.resolved("@media -sass-debug-info") + debug_info.map {|k, v| [k.to_s, v.to_s]}.to_a.each do |k, v| + rule = Sass::Tree::RuleNode.new([""]) + rule.resolved_rules = Sass::Selector::CommaSequence.new( + [Sass::Selector::Sequence.new( + [Sass::Selector::SimpleSequence.new( + [Sass::Selector::Element.new(k.to_s.gsub(/[^\w-]/, "\\\\\\0"), nil)], + false) + ]) + ]) + prop = Sass::Tree::PropNode.new([""], [""], :new) + prop.resolved_name = "font-family" + prop.resolved_value = Sass::SCSS::RX.escape_ident(v.to_s) + rule << prop + node << rule + end + node.options = options.merge(:debug_info => false, + :line_comments => false, + :style => :compressed) + node + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/warn_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/warn_node.rb new file mode 100644 index 000000000000..4af4789af60c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/warn_node.rb @@ -0,0 +1,18 @@ +module Sass + module Tree + # A dynamic node representing a Sass `@warn` statement. + # + # @see Sass::Tree + class WarnNode < Node + # The expression to print. + # @return [Script::Tree::Node] + attr_accessor :expr + + # @param expr [Script::Tree::Node] The expression to print + def initialize(expr) + @expr = expr + super() + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/while_node.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/while_node.rb new file mode 100644 index 000000000000..93529f0f0961 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/tree/while_node.rb @@ -0,0 +1,18 @@ +require 'sass/tree/node' + +module Sass::Tree + # A dynamic node representing a Sass `@while` loop. + # + # @see Sass::Tree + class WhileNode < Node + # The parse tree for the continuation expression. + # @return [Script::Tree::Node] + attr_accessor :expr + + # @param expr [Script::Tree::Node] See \{#expr} + def initialize(expr) + @expr = expr + super() + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util.rb new file mode 100644 index 000000000000..54606fdd0830 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util.rb @@ -0,0 +1,1137 @@ +# -*- coding: utf-8 -*- +require 'erb' +require 'set' +require 'enumerator' +require 'stringio' +require 'rbconfig' +require 'uri' +require 'thread' +require 'pathname' + +require 'sass/root' +require 'sass/util/subset_map' + +module Sass + # A module containing various useful functions. + module Util + extend self + + # An array of ints representing the Ruby version number. + # @api public + RUBY_VERSION_COMPONENTS = RUBY_VERSION.split(".").map {|s| s.to_i} + + # The Ruby engine we're running under. Defaults to `"ruby"` + # if the top-level constant is undefined. + # @api public + RUBY_ENGINE = defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : "ruby" + + # Returns the path of a file relative to the Sass root directory. + # + # @param file [String] The filename relative to the Sass root + # @return [String] The filename relative to the the working directory + def scope(file) + File.join(Sass::ROOT_DIR, file) + end + + # Maps the keys in a hash according to a block. + # + # @example + # map_keys({:foo => "bar", :baz => "bang"}) {|k| k.to_s} + # #=> {"foo" => "bar", "baz" => "bang"} + # @param hash [Hash] The hash to map + # @yield [key] A block in which the keys are transformed + # @yieldparam key [Object] The key that should be mapped + # @yieldreturn [Object] The new value for the key + # @return [Hash] The mapped hash + # @see #map_vals + # @see #map_hash + def map_keys(hash) + map_hash(hash) {|k, v| [yield(k), v]} + end + + # Maps the values in a hash according to a block. + # + # @example + # map_values({:foo => "bar", :baz => "bang"}) {|v| v.to_sym} + # #=> {:foo => :bar, :baz => :bang} + # @param hash [Hash] The hash to map + # @yield [value] A block in which the values are transformed + # @yieldparam value [Object] The value that should be mapped + # @yieldreturn [Object] The new value for the value + # @return [Hash] The mapped hash + # @see #map_keys + # @see #map_hash + def map_vals(hash) + # We don't delegate to map_hash for performance here + # because map_hash does more than is necessary. + rv = hash.class.new + hash = hash.as_stored if hash.is_a?(NormalizedMap) + hash.each do |k, v| + rv[k] = yield(v) + end + rv + end + + # Maps the key-value pairs of a hash according to a block. + # + # @example + # map_hash({:foo => "bar", :baz => "bang"}) {|k, v| [k.to_s, v.to_sym]} + # #=> {"foo" => :bar, "baz" => :bang} + # @param hash [Hash] The hash to map + # @yield [key, value] A block in which the key-value pairs are transformed + # @yieldparam [key] The hash key + # @yieldparam [value] The hash value + # @yieldreturn [(Object, Object)] The new value for the `[key, value]` pair + # @return [Hash] The mapped hash + # @see #map_keys + # @see #map_vals + def map_hash(hash) + # Copy and modify is more performant than mapping to an array and using + # to_hash on the result. + rv = hash.class.new + hash.each do |k, v| + new_key, new_value = yield(k, v) + new_key = hash.denormalize(new_key) if hash.is_a?(NormalizedMap) && new_key == k + rv[new_key] = new_value + end + rv + end + + # Computes the powerset of the given array. + # This is the set of all subsets of the array. + # + # @example + # powerset([1, 2, 3]) #=> + # Set[Set[], Set[1], Set[2], Set[3], Set[1, 2], Set[2, 3], Set[1, 3], Set[1, 2, 3]] + # @param arr [Enumerable] + # @return [Set<Set>] The subsets of `arr` + def powerset(arr) + arr.inject([Set.new].to_set) do |powerset, el| + new_powerset = Set.new + powerset.each do |subset| + new_powerset << subset + new_powerset << subset + [el] + end + new_powerset + end + end + + # Restricts a number to falling within a given range. + # Returns the number if it falls within the range, + # or the closest value in the range if it doesn't. + # + # @param value [Numeric] + # @param range [Range<Numeric>] + # @return [Numeric] + def restrict(value, range) + [[value, range.first].max, range.last].min + end + + # Like [Fixnum.round], but leaves rooms for slight floating-point + # differences. + # + # @param value [Numeric] + # @return [Numeric] + def round(value) + # If the number is within epsilon of X.5, round up (or down for negative + # numbers). + mod = value % 1 + mod_is_half = (mod - 0.5).abs < Script::Value::Number.epsilon + if value > 0 + !mod_is_half && mod < 0.5 ? value.floor : value.ceil + else + mod_is_half || mod < 0.5 ? value.floor : value.ceil + end + end + + # Concatenates all strings that are adjacent in an array, + # while leaving other elements as they are. + # + # @example + # merge_adjacent_strings([1, "foo", "bar", 2, "baz"]) + # #=> [1, "foobar", 2, "baz"] + # @param arr [Array] + # @return [Array] The enumerable with strings merged + def merge_adjacent_strings(arr) + # Optimize for the common case of one element + return arr if arr.size < 2 + arr.inject([]) do |a, e| + if e.is_a?(String) + if a.last.is_a?(String) + a.last << e + else + a << e.dup + end + else + a << e + end + a + end + end + + # Non-destructively replaces all occurrences of a subsequence in an array + # with another subsequence. + # + # @example + # replace_subseq([1, 2, 3, 4, 5], [2, 3], [:a, :b]) + # #=> [1, :a, :b, 4, 5] + # + # @param arr [Array] The array whose subsequences will be replaced. + # @param subseq [Array] The subsequence to find and replace. + # @param replacement [Array] The sequence that `subseq` will be replaced with. + # @return [Array] `arr` with `subseq` replaced with `replacement`. + def replace_subseq(arr, subseq, replacement) + new = [] + matched = [] + i = 0 + arr.each do |elem| + if elem != subseq[i] + new.push(*matched) + matched = [] + i = 0 + new << elem + next + end + + if i == subseq.length - 1 + matched = [] + i = 0 + new.push(*replacement) + else + matched << elem + i += 1 + end + end + new.push(*matched) + new + end + + # Intersperses a value in an enumerable, as would be done with `Array#join` + # but without concatenating the array together afterwards. + # + # @param enum [Enumerable] + # @param val + # @return [Array] + def intersperse(enum, val) + enum.inject([]) {|a, e| a << e << val}[0...-1] + end + + def slice_by(enum) + results = [] + enum.each do |value| + key = yield(value) + if !results.empty? && results.last.first == key + results.last.last << value + else + results << [key, [value]] + end + end + results + end + + # Substitutes a sub-array of one array with another sub-array. + # + # @param ary [Array] The array in which to make the substitution + # @param from [Array] The sequence of elements to replace with `to` + # @param to [Array] The sequence of elements to replace `from` with + def substitute(ary, from, to) + res = ary.dup + i = 0 + while i < res.size + if res[i...i + from.size] == from + res[i...i + from.size] = to + end + i += 1 + end + res + end + + # Destructively strips whitespace from the beginning and end of the first + # and last elements, respectively, in the array (if those elements are + # strings). Preserves CSS escapes at the end of the array. + # + # @param arr [Array] + # @return [Array] `arr` + def strip_string_array(arr) + arr.first.lstrip! if arr.first.is_a?(String) + arr[-1] = Sass::Util.rstrip_except_escapes(arr[-1]) if arr.last.is_a?(String) + arr + end + + # Normalizes identifier escapes. + # + # See https://github.com/sass/language/blob/master/accepted/identifier-escapes.md. + # + # @param ident [String] + # @return [String] + def normalize_ident_escapes(ident, start: true) + ident.gsub(/(^)?(#{Sass::SCSS::RX::ESCAPE})/) do |s| + at_start = start && $1 + char = escaped_char(s) + next char if char =~ (at_start ? Sass::SCSS::RX::NMSTART : Sass::SCSS::RX::NMCHAR) + if char =~ (at_start ? /[\x0-\x1F\x7F0-9]/ : /[\x0-\x1F\x7F]/) + "\\#{char.ord.to_s(16)} " + else + "\\#{char}" + end + end + end + + # Returns the character encoded by the given escape sequence. + # + # @param escape [String] + # @return [String] + def escaped_char(escape) + if escape =~ /^\\([0-9a-fA-F]{1,6})[ \t\r\n\f]?/ + $1.to_i(16).chr(Encoding::UTF_8) + else + escape[1] + end + end + + # Like [String#strip], but preserves escaped whitespace at the end of the + # string. + # + # @param string [String] + # @return [String] + def strip_except_escapes(string) + rstrip_except_escapes(string.lstrip) + end + + # Like [String#rstrip], but preserves escaped whitespace at the end of the + # string. + # + # @param string [String] + # @return [String] + def rstrip_except_escapes(string) + string.sub(/(?<!\\)\s+$/, '') + end + + # Return an array of all possible paths through the given arrays. + # + # @param arrs [Array<Array>] + # @return [Array<Arrays>] + # + # @example + # paths([[1, 2], [3, 4], [5]]) #=> + # # [[1, 3, 5], + # # [2, 3, 5], + # # [1, 4, 5], + # # [2, 4, 5]] + def paths(arrs) + arrs.inject([[]]) do |paths, arr| + arr.map {|e| paths.map {|path| path + [e]}}.flatten(1) + end + end + + # Computes a single longest common subsequence for `x` and `y`. + # If there are more than one longest common subsequences, + # the one returned is that which starts first in `x`. + # + # @param x [Array] + # @param y [Array] + # @yield [a, b] An optional block to use in place of a check for equality + # between elements of `x` and `y`. + # @yieldreturn [Object, nil] If the two values register as equal, + # this will return the value to use in the LCS array. + # @return [Array] The LCS + def lcs(x, y, &block) + x = [nil, *x] + y = [nil, *y] + block ||= proc {|a, b| a == b && a} + lcs_backtrace(lcs_table(x, y, &block), x, y, x.size - 1, y.size - 1, &block) + end + + # Like `String.upcase`, but only ever upcases ASCII letters. + def upcase(string) + return string.upcase unless ruby2_4? + string.upcase(:ascii) + end + + # Like `String.downcase`, but only ever downcases ASCII letters. + def downcase(string) + return string.downcase unless ruby2_4? + string.downcase(:ascii) + end + + # Returns a sub-array of `minuend` containing only elements that are also in + # `subtrahend`. Ensures that the return value has the same order as + # `minuend`, even on Rubinius where that's not guaranteed by `Array#-`. + # + # @param minuend [Array] + # @param subtrahend [Array] + # @return [Array] + def array_minus(minuend, subtrahend) + return minuend - subtrahend unless rbx? + set = Set.new(minuend) - subtrahend + minuend.select {|e| set.include?(e)} + end + + # Returns the maximum of `val1` and `val2`. We use this over \{Array.max} to + # avoid unnecessary garbage collection. + def max(val1, val2) + val1 > val2 ? val1 : val2 + end + + # Returns the minimum of `val1` and `val2`. We use this over \{Array.min} to + # avoid unnecessary garbage collection. + def min(val1, val2) + val1 <= val2 ? val1 : val2 + end + + # Returns a string description of the character that caused an + # `Encoding::UndefinedConversionError`. + # + # @param e [Encoding::UndefinedConversionError] + # @return [String] + def undefined_conversion_error_char(e) + # Rubinius (as of 2.0.0.rc1) pre-quotes the error character. + return e.error_char if rbx? + # JRuby (as of 1.7.2) doesn't have an error_char field on + # Encoding::UndefinedConversionError. + return e.error_char.dump unless jruby? + e.message[/^"[^"]+"/] # " + end + + # Asserts that `value` falls within `range` (inclusive), leaving + # room for slight floating-point errors. + # + # @param name [String] The name of the value. Used in the error message. + # @param range [Range] The allowed range of values. + # @param value [Numeric, Sass::Script::Value::Number] The value to check. + # @param unit [String] The unit of the value. Used in error reporting. + # @return [Numeric] `value` adjusted to fall within range, if it + # was outside by a floating-point margin. + def check_range(name, range, value, unit = '') + grace = (-0.00001..0.00001) + str = value.to_s + value = value.value if value.is_a?(Sass::Script::Value::Number) + return value if range.include?(value) + return range.first if grace.include?(value - range.first) + return range.last if grace.include?(value - range.last) + raise ArgumentError.new( + "#{name} #{str} must be between #{range.first}#{unit} and #{range.last}#{unit}") + end + + # Returns whether or not `seq1` is a subsequence of `seq2`. That is, whether + # or not `seq2` contains every element in `seq1` in the same order (and + # possibly more elements besides). + # + # @param seq1 [Array] + # @param seq2 [Array] + # @return [Boolean] + def subsequence?(seq1, seq2) + i = j = 0 + loop do + return true if i == seq1.size + return false if j == seq2.size + i += 1 if seq1[i] == seq2[j] + j += 1 + end + end + + # Returns information about the caller of the previous method. + # + # @param entry [String] An entry in the `#caller` list, or a similarly formatted string + # @return [[String, Integer, (String, nil)]] + # An array containing the filename, line, and method name of the caller. + # The method name may be nil + def caller_info(entry = nil) + # JRuby evaluates `caller` incorrectly when it's in an actual default argument. + entry ||= caller[1] + info = entry.scan(/^((?:[A-Za-z]:)?.*?):(-?.*?)(?::.*`(.+)')?$/).first + info[1] = info[1].to_i + # This is added by Rubinius to designate a block, but we don't care about it. + info[2].sub!(/ \{\}\Z/, '') if info[2] + info + end + + # Returns whether one version string represents a more recent version than another. + # + # @param v1 [String] A version string. + # @param v2 [String] Another version string. + # @return [Boolean] + def version_gt(v1, v2) + # Construct an array to make sure the shorter version is padded with nil + Array.new([v1.length, v2.length].max).zip(v1.split("."), v2.split(".")) do |_, p1, p2| + p1 ||= "0" + p2 ||= "0" + release1 = p1 =~ /^[0-9]+$/ + release2 = p2 =~ /^[0-9]+$/ + if release1 && release2 + # Integer comparison if both are full releases + p1, p2 = p1.to_i, p2.to_i + next if p1 == p2 + return p1 > p2 + elsif !release1 && !release2 + # String comparison if both are prereleases + next if p1 == p2 + return p1 > p2 + else + # If only one is a release, that one is newer + return release1 + end + end + end + + # Returns whether one version string represents the same or a more + # recent version than another. + # + # @param v1 [String] A version string. + # @param v2 [String] Another version string. + # @return [Boolean] + def version_geq(v1, v2) + version_gt(v1, v2) || !version_gt(v2, v1) + end + + # Throws a NotImplementedError for an abstract method. + # + # @param obj [Object] `self` + # @raise [NotImplementedError] + def abstract(obj) + raise NotImplementedError.new("#{obj.class} must implement ##{caller_info[2]}") + end + + # Prints a deprecation warning for the caller method. + # + # @param obj [Object] `self` + # @param message [String] A message describing what to do instead. + def deprecated(obj, message = nil) + obj_class = obj.is_a?(Class) ? "#{obj}." : "#{obj.class}#" + full_message = "DEPRECATION WARNING: #{obj_class}#{caller_info[2]} " + + "will be removed in a future version of Sass.#{("\n" + message) if message}" + Sass::Util.sass_warn full_message + end + + # Silences all Sass warnings within a block. + # + # @yield A block in which no Sass warnings will be printed + def silence_sass_warnings + old_level, Sass.logger.log_level = Sass.logger.log_level, :error + yield + ensure + Sass.logger.log_level = old_level + end + + # The same as `Kernel#warn`, but is silenced by \{#silence\_sass\_warnings}. + # + # @param msg [String] + def sass_warn(msg) + Sass.logger.warn("#{msg}\n") + end + + ## Cross Rails Version Compatibility + + # Returns the root of the Rails application, + # if this is running in a Rails context. + # Returns `nil` if no such root is defined. + # + # @return [String, nil] + def rails_root + if defined?(::Rails.root) + return ::Rails.root.to_s if ::Rails.root + raise "ERROR: Rails.root is nil!" + end + return RAILS_ROOT.to_s if defined?(RAILS_ROOT) + nil + end + + # Returns the environment of the Rails application, + # if this is running in a Rails context. + # Returns `nil` if no such environment is defined. + # + # @return [String, nil] + def rails_env + return ::Rails.env.to_s if defined?(::Rails.env) + return RAILS_ENV.to_s if defined?(RAILS_ENV) + nil + end + + # Returns whether this environment is using ActionPack + # version 3.0.0 or greater. + # + # @return [Boolean] + def ap_geq_3? + ap_geq?("3.0.0.beta1") + end + + # Returns whether this environment is using ActionPack + # of a version greater than or equal to that specified. + # + # @param version [String] The string version number to check against. + # Should be greater than or equal to Rails 3, + # because otherwise ActionPack::VERSION isn't autoloaded + # @return [Boolean] + def ap_geq?(version) + # The ActionPack module is always loaded automatically in Rails >= 3 + return false unless defined?(ActionPack) && defined?(ActionPack::VERSION) && + defined?(ActionPack::VERSION::STRING) + + version_geq(ActionPack::VERSION::STRING, version) + end + + # Returns an ActionView::Template* class. + # In pre-3.0 versions of Rails, most of these classes + # were of the form `ActionView::TemplateFoo`, + # while afterwards they were of the form `ActionView;:Template::Foo`. + # + # @param name [#to_s] The name of the class to get. + # For example, `:Error` will return `ActionView::TemplateError` + # or `ActionView::Template::Error`. + def av_template_class(name) + return ActionView.const_get("Template#{name}") if ActionView.const_defined?("Template#{name}") + ActionView::Template.const_get(name.to_s) + end + + ## Cross-OS Compatibility + # + # These methods are cached because some of them are called quite frequently + # and even basic checks like String#== are too costly to be called repeatedly. + + # Whether or not this is running on Windows. + # + # @return [Boolean] + def windows? + return @windows if defined?(@windows) + @windows = (RbConfig::CONFIG['host_os'] =~ /mswin|windows|mingw/i) + end + + # Whether or not this is running on IronRuby. + # + # @return [Boolean] + def ironruby? + return @ironruby if defined?(@ironruby) + @ironruby = RUBY_ENGINE == "ironruby" + end + + # Whether or not this is running on Rubinius. + # + # @return [Boolean] + def rbx? + return @rbx if defined?(@rbx) + @rbx = RUBY_ENGINE == "rbx" + end + + # Whether or not this is running on JRuby. + # + # @return [Boolean] + def jruby? + return @jruby if defined?(@jruby) + @jruby = RUBY_PLATFORM =~ /java/ + end + + # Returns an array of ints representing the JRuby version number. + # + # @return [Array<Integer>] + def jruby_version + @jruby_version ||= ::JRUBY_VERSION.split(".").map {|s| s.to_i} + end + + # Like `Dir.glob`, but works with backslash-separated paths on Windows. + # + # @param path [String] + def glob(path) + path = path.tr('\\', '/') if windows? + if block_given? + Dir.glob(path) {|f| yield(f)} + else + Dir.glob(path) + end + end + + # Like `Pathname.new`, but normalizes Windows paths to always use backslash + # separators. + # + # `Pathname#relative_path_from` can break if the two pathnames aren't + # consistent in their slash style. + # + # @param path [String] + # @return [Pathname] + def pathname(path) + path = path.tr("/", "\\") if windows? + Pathname.new(path) + end + + # Like `Pathname#cleanpath`, but normalizes Windows paths to always use + # backslash separators. Normally, `Pathname#cleanpath` actually does the + # reverse -- it will convert backslashes to forward slashes, which can break + # `Pathname#relative_path_from`. + # + # @param path [String, Pathname] + # @return [Pathname] + def cleanpath(path) + path = Pathname.new(path) unless path.is_a?(Pathname) + pathname(path.cleanpath.to_s) + end + + # Returns `path` with all symlinks resolved. + # + # @param path [String, Pathname] + # @return [Pathname] + def realpath(path) + path = Pathname.new(path) unless path.is_a?(Pathname) + + # Explicitly DON'T run #pathname here. We don't want to convert + # to Windows directory separators because we're comparing these + # against the paths returned by Listen, which use forward + # slashes everywhere. + begin + path.realpath + rescue SystemCallError + # If [path] doesn't actually exist, don't bail, just + # return the original. + path + end + end + + # Returns `path` relative to `from`. + # + # This is like `Pathname#relative_path_from` except it accepts both strings + # and pathnames, it handles Windows path separators correctly, and it throws + # an error rather than crashing if the paths use different encodings + # (https://github.com/ruby/ruby/pull/713). + # + # @param path [String, Pathname] + # @param from [String, Pathname] + # @return [Pathname?] + def relative_path_from(path, from) + pathname(path.to_s).relative_path_from(pathname(from.to_s)) + rescue NoMethodError => e + raise e unless e.name == :zero? + + # Work around https://github.com/ruby/ruby/pull/713. + path = path.to_s + from = from.to_s + raise ArgumentError("Incompatible path encodings: #{path.inspect} is #{path.encoding}, " + + "#{from.inspect} is #{from.encoding}") + end + + # Converts `path` to a "file:" URI. This handles Windows paths correctly. + # + # @param path [String, Pathname] + # @return [String] + def file_uri_from_path(path) + path = path.to_s if path.is_a?(Pathname) + path = path.tr('\\', '/') if windows? + path = URI::DEFAULT_PARSER.escape(path) + return path.start_with?('/') ? "file://" + path : path unless windows? + return "file:///" + path.tr("\\", "/") if path =~ %r{^[a-zA-Z]:[/\\]} + return "file:" + path.tr("\\", "/") if path =~ %r{\\\\[^\\]+\\[^\\/]+} + path.tr("\\", "/") + end + + # Retries a filesystem operation if it fails on Windows. Windows + # has weird and flaky locking rules that can cause operations to fail. + # + # @yield [] The filesystem operation. + def retry_on_windows + return yield unless windows? + + begin + yield + rescue SystemCallError + sleep 0.1 + yield + end + end + + # Prepare a value for a destructuring assignment (e.g. `a, b = + # val`). This works around a performance bug when using + # ActiveSupport, and only needs to be called when `val` is likely + # to be `nil` reasonably often. + # + # See [this bug report](http://redmine.ruby-lang.org/issues/4917). + # + # @param val [Object] + # @return [Object] + def destructure(val) + val || [] + end + + CHARSET_REGEXP = /\A@charset "([^"]+)"/ + bom = "\uFEFF" + UTF_8_BOM = bom.encode("UTF-8").force_encoding('BINARY') + UTF_16BE_BOM = bom.encode("UTF-16BE").force_encoding('BINARY') + UTF_16LE_BOM = bom.encode("UTF-16LE").force_encoding('BINARY') + + ## Cross-Ruby-Version Compatibility + + # Whether or not this is running under Ruby 2.4 or higher. + # + # @return [Boolean] + def ruby2_4? + return @ruby2_4 if defined?(@ruby2_4) + @ruby2_4 = + if RUBY_VERSION_COMPONENTS[0] == 2 + RUBY_VERSION_COMPONENTS[1] >= 4 + else + RUBY_VERSION_COMPONENTS[0] > 2 + end + end + + # Like {\#check\_encoding}, but also checks for a `@charset` declaration + # at the beginning of the file and uses that encoding if it exists. + # + # Sass follows CSS's decoding rules. + # + # @param str [String] The string of which to check the encoding + # @return [(String, Encoding)] The original string encoded as UTF-8, + # and the source encoding of the string + # @raise [Encoding::UndefinedConversionError] if the source encoding + # cannot be converted to UTF-8 + # @raise [ArgumentError] if the document uses an unknown encoding with `@charset` + # @raise [Sass::SyntaxError] If the document declares an encoding that + # doesn't match its contents, or it doesn't declare an encoding and its + # contents are invalid in the native encoding. + def check_sass_encoding(str) + # Determine the fallback encoding following section 3.2 of CSS Syntax Level 3 and Encodings: + # http://www.w3.org/TR/2013/WD-css-syntax-3-20130919/#determine-the-fallback-encoding + # http://encoding.spec.whatwg.org/#decode + binary = str.dup.force_encoding("BINARY") + if binary.start_with?(UTF_8_BOM) + binary.slice! 0, UTF_8_BOM.length + str = binary.force_encoding('UTF-8') + elsif binary.start_with?(UTF_16BE_BOM) + binary.slice! 0, UTF_16BE_BOM.length + str = binary.force_encoding('UTF-16BE') + elsif binary.start_with?(UTF_16LE_BOM) + binary.slice! 0, UTF_16LE_BOM.length + str = binary.force_encoding('UTF-16LE') + elsif binary =~ CHARSET_REGEXP + charset = $1.force_encoding('US-ASCII') + encoding = Encoding.find(charset) + if encoding.name == 'UTF-16' || encoding.name == 'UTF-16BE' + encoding = Encoding.find('UTF-8') + end + str = binary.force_encoding(encoding) + elsif str.encoding.name == "ASCII-8BIT" + # Normally we want to fall back on believing the Ruby string + # encoding, but if that's just binary we want to make sure + # it's valid UTF-8. + str = str.force_encoding('utf-8') + end + + find_encoding_error(str) unless str.valid_encoding? + + begin + # If the string is valid, preprocess it according to section 3.3 of CSS Syntax Level 3. + return str.encode("UTF-8").gsub(/\r\n?|\f/, "\n").tr("\u0000", "�"), str.encoding + rescue EncodingError + find_encoding_error(str) + end + end + + # Destructively removes all elements from an array that match a block, and + # returns the removed elements. + # + # @param array [Array] The array from which to remove elements. + # @yield [el] Called for each element. + # @yieldparam el [*] The element to test. + # @yieldreturn [Boolean] Whether or not to extract the element. + # @return [Array] The extracted elements. + def extract!(array) + out = [] + array.reject! do |e| + next false unless yield e + out << e + true + end + out + end + + # Flattens the first level of nested arrays in `arrs`. Unlike + # `Array#flatten`, this orders the result by taking the first + # values from each array in order, then the second, and so on. + # + # @param arrs [Array] The array to flatten. + # @return [Array] The flattened array. + def flatten_vertically(arrs) + result = [] + arrs = arrs.map {|sub| sub.is_a?(Array) ? sub.dup : Array(sub)} + until arrs.empty? + arrs.reject! do |arr| + result << arr.shift + arr.empty? + end + end + result + end + + # Like `Object#inspect`, but preserves non-ASCII characters rather than + # escaping them under Ruby 1.9.2. This is necessary so that the + # precompiled Haml template can be `#encode`d into `@options[:encoding]` + # before being evaluated. + # + # @param obj {Object} + # @return {String} + def inspect_obj(obj) + return obj.inspect unless version_geq(RUBY_VERSION, "1.9.2") + return ':' + inspect_obj(obj.to_s) if obj.is_a?(Symbol) + return obj.inspect unless obj.is_a?(String) + '"' + obj.gsub(/[\x00-\x7F]+/) {|s| s.inspect[1...-1]} + '"' + end + + # Extracts the non-string vlaues from an array containing both strings and non-strings. + # These values are replaced with escape sequences. + # This can be undone using \{#inject\_values}. + # + # This is useful e.g. when we want to do string manipulation + # on an interpolated string. + # + # The precise format of the resulting string is not guaranteed. + # However, it is guaranteed that newlines and whitespace won't be affected. + # + # @param arr [Array] The array from which values are extracted. + # @return [(String, Array)] The resulting string, and an array of extracted values. + def extract_values(arr) + values = [] + mapped = arr.map do |e| + next e.gsub('{', '{{') if e.is_a?(String) + values << e + next "{#{values.count - 1}}" + end + return mapped.join, values + end + + # Undoes \{#extract\_values} by transforming a string with escape sequences + # into an array of strings and non-string values. + # + # @param str [String] The string with escape sequences. + # @param values [Array] The array of values to inject. + # @return [Array] The array of strings and values. + def inject_values(str, values) + return [str.gsub('{{', '{')] if values.empty? + # Add an extra { so that we process the tail end of the string + result = (str + '{{').scan(/(.*?)(?:(\{\{)|\{(\d+)\})/m).map do |(pre, esc, n)| + [pre, esc ? '{' : '', n ? values[n.to_i] : ''] + end.flatten(1) + result[-2] = '' # Get rid of the extra { + merge_adjacent_strings(result).reject {|s| s == ''} + end + + # Allows modifications to be performed on the string form + # of an array containing both strings and non-strings. + # + # @param arr [Array] The array from which values are extracted. + # @yield [str] A block in which string manipulation can be done to the array. + # @yieldparam str [String] The string form of `arr`. + # @yieldreturn [String] The modified string. + # @return [Array] The modified, interpolated array. + def with_extracted_values(arr) + str, vals = extract_values(arr) + str = yield str + inject_values(str, vals) + end + + # Builds a sourcemap file name given the generated CSS file name. + # + # @param css [String] The generated CSS file name. + # @return [String] The source map file name. + def sourcemap_name(css) + css + ".map" + end + + # Escapes certain characters so that the result can be used + # as the JSON string value. Returns the original string if + # no escaping is necessary. + # + # @param s [String] The string to be escaped + # @return [String] The escaped string + def json_escape_string(s) + return s if s !~ /["\\\b\f\n\r\t]/ + + result = "" + s.split("").each do |c| + case c + when '"', "\\" + result << "\\" << c + when "\n" then result << "\\n" + when "\t" then result << "\\t" + when "\r" then result << "\\r" + when "\f" then result << "\\f" + when "\b" then result << "\\b" + else + result << c + end + end + result + end + + # Converts the argument into a valid JSON value. + # + # @param v [Integer, String, Array, Boolean, nil] + # @return [String] + def json_value_of(v) + case v + when Integer + v.to_s + when String + "\"" + json_escape_string(v) + "\"" + when Array + "[" + v.map {|x| json_value_of(x)}.join(",") + "]" + when NilClass + "null" + when TrueClass + "true" + when FalseClass + "false" + else + raise ArgumentError.new("Unknown type: #{v.class.name}") + end + end + + VLQ_BASE_SHIFT = 5 + VLQ_BASE = 1 << VLQ_BASE_SHIFT + VLQ_BASE_MASK = VLQ_BASE - 1 + VLQ_CONTINUATION_BIT = VLQ_BASE + + BASE64_DIGITS = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + ['+', '/'] + BASE64_DIGIT_MAP = begin + map = {} + BASE64_DIGITS.each_with_index.map do |digit, i| + map[digit] = i + end + map + end + + # Encodes `value` as VLQ (http://en.wikipedia.org/wiki/VLQ). + # + # @param value [Integer] + # @return [String] The encoded value + def encode_vlq(value) + if value < 0 + value = ((-value) << 1) | 1 + else + value <<= 1 + end + + result = '' + begin + digit = value & VLQ_BASE_MASK + value >>= VLQ_BASE_SHIFT + if value > 0 + digit |= VLQ_CONTINUATION_BIT + end + result << BASE64_DIGITS[digit] + end while value > 0 + result + end + + ## Static Method Stuff + + # The context in which the ERB for \{#def\_static\_method} will be run. + class StaticConditionalContext + # @param set [#include?] The set of variables that are defined for this context. + def initialize(set) + @set = set + end + + # Checks whether or not a variable is defined for this context. + # + # @param name [Symbol] The name of the variable + # @return [Boolean] + def method_missing(name, *args) + super unless args.empty? && !block_given? + @set.include?(name) + end + end + + # @private + ATOMIC_WRITE_MUTEX = Mutex.new + + # This creates a temp file and yields it for writing. When the + # write is complete, the file is moved into the desired location. + # The atomicity of this operation is provided by the filesystem's + # rename operation. + # + # @param filename [String] The file to write to. + # @param perms [Integer] The permissions used for creating this file. + # Will be masked by the process umask. Defaults to readable/writeable + # by all users however the umask usually changes this to only be writable + # by the process's user. + # @yieldparam tmpfile [Tempfile] The temp file that can be written to. + # @return The value returned by the block. + def atomic_create_and_write_file(filename, perms = 0666) + require 'tempfile' + tmpfile = Tempfile.new(File.basename(filename), File.dirname(filename)) + tmpfile.binmode if tmpfile.respond_to?(:binmode) + result = yield tmpfile + tmpfile.close + ATOMIC_WRITE_MUTEX.synchronize do + begin + File.chmod(perms & ~File.umask, tmpfile.path) + rescue Errno::EPERM + # If we don't have permissions to chmod the file, don't let that crash + # the compilation. See issue 1215. + end + File.rename tmpfile.path, filename + end + result + ensure + # close and remove the tempfile if it still exists, + # presumably due to an error during write + tmpfile.close if tmpfile + tmpfile.unlink if tmpfile + end + + private + + def find_encoding_error(str) + encoding = str.encoding + cr = Regexp.quote("\r".encode(encoding).force_encoding('BINARY')) + lf = Regexp.quote("\n".encode(encoding).force_encoding('BINARY')) + ff = Regexp.quote("\f".encode(encoding).force_encoding('BINARY')) + line_break = /#{cr}#{lf}?|#{ff}|#{lf}/ + + str.force_encoding("binary").split(line_break).each_with_index do |line, i| + begin + line.encode(encoding) + rescue Encoding::UndefinedConversionError => e + raise Sass::SyntaxError.new( + "Invalid #{encoding.name} character #{undefined_conversion_error_char(e)}", + :line => i + 1) + end + end + + # We shouldn't get here, but it's possible some weird encoding stuff causes it. + return str, str.encoding + end + + # Calculates the memoization table for the Least Common Subsequence algorithm. + # Algorithm from [Wikipedia](http://en.wikipedia.org/wiki/Longest_common_subsequence_problem#Computing_the_length_of_the_LCS) + def lcs_table(x, y) + # This method does not take a block as an explicit parameter for performance reasons. + c = Array.new(x.size) {[]} + x.size.times {|i| c[i][0] = 0} + y.size.times {|j| c[0][j] = 0} + (1...x.size).each do |i| + (1...y.size).each do |j| + c[i][j] = + if yield x[i], y[j] + c[i - 1][j - 1] + 1 + else + [c[i][j - 1], c[i - 1][j]].max + end + end + end + c + end + + # Computes a single longest common subsequence for arrays x and y. + # Algorithm from [Wikipedia](http://en.wikipedia.org/wiki/Longest_common_subsequence_problem#Reading_out_an_LCS) + def lcs_backtrace(c, x, y, i, j, &block) + return [] if i == 0 || j == 0 + if (v = yield(x[i], y[j])) + return lcs_backtrace(c, x, y, i - 1, j - 1, &block) << v + end + + return lcs_backtrace(c, x, y, i, j - 1, &block) if c[i][j - 1] > c[i - 1][j] + lcs_backtrace(c, x, y, i - 1, j, &block) + end + + singleton_methods.each {|method| module_function method} + end +end + +require 'sass/util/multibyte_string_scanner' +require 'sass/util/normalized_map' diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/multibyte_string_scanner.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/multibyte_string_scanner.rb new file mode 100644 index 000000000000..27e07f093b25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/multibyte_string_scanner.rb @@ -0,0 +1,151 @@ +require 'strscan' + +if Sass::Util.rbx? + # Rubinius's StringScanner class implements some of its methods in terms of + # others, which causes us to double-count bytes in some cases if we do + # straightforward inheritance. To work around this, we use a delegate class. + require 'delegate' + class Sass::Util::MultibyteStringScanner < DelegateClass(StringScanner) + def initialize(str) + super(StringScanner.new(str)) + @mb_pos = 0 + @mb_matched_size = nil + @mb_last_pos = nil + end + + def is_a?(klass) + __getobj__.is_a?(klass) || super + end + end +else + class Sass::Util::MultibyteStringScanner < StringScanner + def initialize(str) + super + @mb_pos = 0 + @mb_matched_size = nil + @mb_last_pos = nil + end + end +end + +# A wrapper of the native StringScanner class that works correctly with +# multibyte character encodings. The native class deals only in bytes, not +# characters, for methods like [#pos] and [#matched_size]. This class deals +# only in characters, instead. +class Sass::Util::MultibyteStringScanner + def self.new(str) + return StringScanner.new(str) if str.ascii_only? + super + end + + alias_method :byte_pos, :pos + alias_method :byte_matched_size, :matched_size + + def check(pattern); _match super; end + def check_until(pattern); _matched super; end + def getch; _forward _match super; end + def match?(pattern); _size check(pattern); end + def matched_size; @mb_matched_size; end + def peek(len); string[@mb_pos, len]; end + alias_method :peep, :peek + def pos; @mb_pos; end + alias_method :pointer, :pos + def rest_size; rest.size; end + def scan(pattern); _forward _match super; end + def scan_until(pattern); _forward _matched super; end + def skip(pattern); _size scan(pattern); end + def skip_until(pattern); _matched _size scan_until(pattern); end + + def get_byte + raise "MultibyteStringScanner doesn't support #get_byte." + end + + def getbyte + raise "MultibyteStringScanner doesn't support #getbyte." + end + + def pos=(n) + @mb_last_pos = nil + + # We set position kind of a lot during parsing, so we want it to be as + # efficient as possible. This is complicated by the fact that UTF-8 is a + # variable-length encoding, so it's difficult to find the byte length that + # corresponds to a given character length. + # + # Our heuristic here is to try to count the fewest possible characters. So + # if the new position is close to the current one, just count the + # characters between the two; if the new position is closer to the + # beginning of the string, just count the characters from there. + if @mb_pos - n < @mb_pos / 2 + # New position is close to old position + byte_delta = @mb_pos > n ? -string[n...@mb_pos].bytesize : string[@mb_pos...n].bytesize + super(byte_pos + byte_delta) + else + # New position is close to BOS + super(string[0...n].bytesize) + end + @mb_pos = n + end + + def reset + @mb_pos = 0 + @mb_matched_size = nil + @mb_last_pos = nil + super + end + + def scan_full(pattern, advance_pointer_p, return_string_p) + res = _match super(pattern, advance_pointer_p, true) + _forward res if advance_pointer_p + return res if return_string_p + end + + def search_full(pattern, advance_pointer_p, return_string_p) + res = super(pattern, advance_pointer_p, true) + _forward res if advance_pointer_p + _matched((res if return_string_p)) + end + + def string=(str) + @mb_pos = 0 + @mb_matched_size = nil + @mb_last_pos = nil + super + end + + def terminate + @mb_pos = string.size + @mb_matched_size = nil + @mb_last_pos = nil + super + end + alias_method :clear, :terminate + + def unscan + super + @mb_pos = @mb_last_pos + @mb_last_pos = @mb_matched_size = nil + end + + private + + def _size(str) + str && str.size + end + + def _match(str) + @mb_matched_size = str && str.size + str + end + + def _matched(res) + _match matched + res + end + + def _forward(str) + @mb_last_pos = @mb_pos + @mb_pos += str.size if str + str + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/normalized_map.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/normalized_map.rb new file mode 100644 index 000000000000..d2e3b8760338 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/normalized_map.rb @@ -0,0 +1,122 @@ +require 'delegate' + +module Sass + module Util + # A hash that normalizes its string keys while still allowing you to get back + # to the original keys that were stored. If several different values normalize + # to the same value, whichever is stored last wins. + class NormalizedMap + # Create a normalized map + def initialize(map = nil) + @key_strings = {} + @map = {} + + map.each {|key, value| self[key] = value} if map + end + + # Specifies how to transform the key. + # + # This can be overridden to create other normalization behaviors. + def normalize(key) + key.tr("-", "_") + end + + # Returns the version of `key` as it was stored before + # normalization. If `key` isn't in the map, returns it as it was + # passed in. + # + # @return [String] + def denormalize(key) + @key_strings[normalize(key)] || key + end + + # @private + def []=(k, v) + normalized = normalize(k) + @map[normalized] = v + @key_strings[normalized] = k + v + end + + # @private + def [](k) + @map[normalize(k)] + end + + # @private + def has_key?(k) + @map.has_key?(normalize(k)) + end + + # @private + def delete(k) + normalized = normalize(k) + @key_strings.delete(normalized) + @map.delete(normalized) + end + + # @return [Hash] Hash with the keys as they were stored (before normalization). + def as_stored + Sass::Util.map_keys(@map) {|k| @key_strings[k]} + end + + def empty? + @map.empty? + end + + def values + @map.values + end + + def keys + @map.keys + end + + def each + @map.each {|k, v| yield(k, v)} + end + + def size + @map.size + end + + def to_hash + @map.dup + end + + def to_a + @map.to_a + end + + def map + @map.map {|k, v| yield(k, v)} + end + + def dup + d = super + d.send(:instance_variable_set, "@map", @map.dup) + d + end + + def sort_by + @map.sort_by {|k, v| yield k, v} + end + + def update(map) + map = map.as_stored if map.is_a?(NormalizedMap) + map.each {|k, v| self[k] = v} + end + + def method_missing(method, *args, &block) + if Sass.tests_running + raise ArgumentError.new("The method #{method} must be implemented explicitly") + end + @map.send(method, *args, &block) + end + + def respond_to_missing?(method, include_private = false) + @map.respond_to?(method, include_private) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/subset_map.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/subset_map.rb new file mode 100644 index 000000000000..cd401f23fd5c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/subset_map.rb @@ -0,0 +1,109 @@ +require 'set' + +module Sass + module Util + # A map from sets to values. + # A value is \{#\[]= set} by providing a set (the "set-set") and a value, + # which is then recorded as corresponding to that set. + # Values are \{#\[] accessed} by providing a set (the "get-set") + # and returning all values that correspond to set-sets + # that are subsets of the get-set. + # + # SubsetMap preserves the order of values as they're inserted. + # + # @example + # ssm = SubsetMap.new + # ssm[Set[1, 2]] = "Foo" + # ssm[Set[2, 3]] = "Bar" + # ssm[Set[1, 2, 3]] = "Baz" + # + # ssm[Set[1, 2, 3]] #=> ["Foo", "Bar", "Baz"] + class SubsetMap + # Creates a new, empty SubsetMap. + def initialize + @hash = {} + @vals = [] + end + + # Whether or not this SubsetMap has any key-value pairs. + # + # @return [Boolean] + def empty? + @hash.empty? + end + + # Associates a value with a set. + # When `set` or any of its supersets is accessed, + # `value` will be among the values returned. + # + # Note that if the same `set` is passed to this method multiple times, + # all given `value`s will be associated with that `set`. + # + # This runs in `O(n)` time, where `n` is the size of `set`. + # + # @param set [#to_set] The set to use as the map key. May not be empty. + # @param value [Object] The value to associate with `set`. + # @raise [ArgumentError] If `set` is empty. + def []=(set, value) + raise ArgumentError.new("SubsetMap keys may not be empty.") if set.empty? + + index = @vals.size + @vals << value + set.each do |k| + @hash[k] ||= [] + @hash[k] << [set, set.to_set, index] + end + end + + # Returns all values associated with subsets of `set`. + # + # In the worst case, this runs in `O(m*max(n, log m))` time, + # where `n` is the size of `set` + # and `m` is the number of associations in the map. + # However, unless many keys in the map overlap with `set`, + # `m` will typically be much smaller. + # + # @param set [Set] The set to use as the map key. + # @return [Array<(Object, #to_set)>] An array of pairs, + # where the first value is the value associated with a subset of `set`, + # and the second value is that subset of `set` + # (or whatever `#to_set` object was used to set the value) + # This array is in insertion order. + # @see #[] + def get(set) + res = set.map do |k| + subsets = @hash[k] + next unless subsets + subsets.map do |subenum, subset, index| + next unless subset.subset?(set) + [index, subenum] + end + end.flatten(1) + res.compact! + res.uniq! + res.sort! + res.map! {|i, s| [@vals[i], s]} + res + end + + # Same as \{#get}, but doesn't return the subsets of the argument + # for which values were found. + # + # @param set [Set] The set to use as the map key. + # @return [Array] The array of all values + # associated with subsets of `set`, in insertion order. + # @see #get + def [](set) + get(set).map {|v, _| v} + end + + # Iterates over each value in the subset map. Ignores keys completely. If + # multiple keys have the same value, this will return them multiple times. + # + # @yield [Object] Each value in the map. + def each_value + @vals.each {|v| yield v} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/test.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/test.rb new file mode 100644 index 000000000000..905e81f2638e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/util/test.rb @@ -0,0 +1,9 @@ +module Sass + module Util + module Test + def skip(msg = nil, bt = caller) + super if defined?(super) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/version.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/version.rb new file mode 100644 index 000000000000..1a50696a0d56 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/lib/sass/version.rb @@ -0,0 +1,120 @@ +require 'date' +require 'sass/util' + +module Sass + # Handles Sass version-reporting. + # Sass not only reports the standard three version numbers, + # but its Git revision hash as well, + # if it was installed from Git. + module Version + # Returns a hash representing the version of Sass. + # The `:major`, `:minor`, and `:teeny` keys have their respective numbers as Integers. + # The `:name` key has the name of the version. + # The `:string` key contains a human-readable string representation of the version. + # The `:number` key is the major, minor, and teeny keys separated by periods. + # The `:date` key, which is not guaranteed to be defined, is the `DateTime` + # at which this release was cut. + # If Sass is checked out from Git, the `:rev` key will have the revision hash. + # For example: + # + # { + # :string => "2.1.0.9616393", + # :rev => "9616393b8924ef36639c7e82aa88a51a24d16949", + # :number => "2.1.0", + # :date => DateTime.parse("Apr 30 13:52:01 2009 -0700"), + # :major => 2, :minor => 1, :teeny => 0 + # } + # + # If a prerelease version of Sass is being used, + # the `:string` and `:number` fields will reflect the full version + # (e.g. `"2.2.beta.1"`), and the `:teeny` field will be `-1`. + # A `:prerelease` key will contain the name of the prerelease (e.g. `"beta"`), + # and a `:prerelease_number` key will contain the rerelease number. + # For example: + # + # { + # :string => "3.0.beta.1", + # :number => "3.0.beta.1", + # :date => DateTime.parse("Mar 31 00:38:04 2010 -0700"), + # :major => 3, :minor => 0, :teeny => -1, + # :prerelease => "beta", + # :prerelease_number => 1 + # } + # + # @return [{Symbol => String/Integer}] The version hash + def version + return @@version if defined?(@@version) + + numbers = File.read(Sass::Util.scope('VERSION')).strip.split('.'). + map {|n| n =~ /^[0-9]+$/ ? n.to_i : n} + name = File.read(Sass::Util.scope('VERSION_NAME')).strip + @@version = { + :major => numbers[0], + :minor => numbers[1], + :teeny => numbers[2], + :name => name + } + + if (date = version_date) + @@version[:date] = date + end + + if numbers[3].is_a?(String) + @@version[:teeny] = -1 + @@version[:prerelease] = numbers[3] + @@version[:prerelease_number] = numbers[4] + end + + @@version[:number] = numbers.join('.') + @@version[:string] = @@version[:number].dup + + if (rev = revision_number) + @@version[:rev] = rev + unless rev[0] == ?( + @@version[:string] << "." << rev[0...7] + end + end + + @@version + end + + private + + def revision_number + if File.exist?(Sass::Util.scope('REVISION')) + rev = File.read(Sass::Util.scope('REVISION')).strip + return rev unless rev =~ /^([a-f0-9]+|\(.*\))$/ || rev == '(unknown)' + end + + return unless File.exist?(Sass::Util.scope('.git/HEAD')) + rev = File.read(Sass::Util.scope('.git/HEAD')).strip + return rev unless rev =~ /^ref: (.*)$/ + + ref_name = $1 + ref_file = Sass::Util.scope(".git/#{ref_name}") + info_file = Sass::Util.scope(".git/info/refs") + return File.read(ref_file).strip if File.exist?(ref_file) + return unless File.exist?(info_file) + File.open(info_file) do |f| + f.each do |l| + sha, ref = l.strip.split("\t", 2) + next unless ref == ref_name + return sha + end + end + nil + end + + def version_date + return unless File.exist?(Sass::Util.scope('VERSION_DATE')) + DateTime.parse(File.read(Sass::Util.scope('VERSION_DATE')).strip) + end + end + + extend Sass::Version + + # A string representing the version of Sass. + # A more fine-grained representation is available from Sass.version. + # @api public + VERSION = version[:string] unless defined?(Sass::VERSION) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/rails/init.rb b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/rails/init.rb new file mode 100644 index 000000000000..13d5baa3067d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-3.7.4/rails/init.rb @@ -0,0 +1 @@ +Kernel.load File.join(File.dirname(__FILE__), '..', 'init.rb') diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/CHANGELOG.md new file mode 100644 index 000000000000..232adbd8908a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/CHANGELOG.md @@ -0,0 +1 @@ +# Moved to [GitHub releases](https://github.com/guard/listen/releases) page. diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/CONTRIBUTING.md b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/CONTRIBUTING.md new file mode 100644 index 000000000000..5a5d6de658bb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/CONTRIBUTING.md @@ -0,0 +1,38 @@ +Contribute to Listen +=================== + +File an issue +------------- + +If you haven't already, first see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for known issues, solutions and workarounds. + +You can report bugs and feature requests to [GitHub Issues](https://github.com/guard/listen/issues). + +**Please don't ask question in the issue tracker**, instead ask them in our +[Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net). + +Try to figure out where the issue belongs to: Is it an issue with Listen itself or with Guard? + + +**It's most likely that your bug gets resolved faster if you provide as much information as possible!** + +The MOST useful information is debugging output from Listen (`LISTEN_GEM_DEBUGGING=1`) - see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for details. + + +Development +----------- + +* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames). +* Source hosted at [GitHub](https://github.com/guard/listen). + +Pull requests are very welcome! Please try to follow these simple rules if applicable: + +* Please create a topic branch for every separate change you make. +* Make sure your patches are well tested. All specs run with `rake spec` must pass. +* Update the [Yard](http://yardoc.org/) documentation. +* Update the [README](https://github.com/guard/listen/blob/master/README.md). +* Update the [CHANGELOG](https://github.com/guard/listen/blob/master/CHANGELOG.md) for noteworthy changes. +* Please **do not change** the version number. + +For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on +`#guard` (irc.freenode.net). diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/LICENSE.txt new file mode 100644 index 000000000000..b5f71c8b7b64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2013 Thibaud Guillaume-Gentil + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/README.md b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/README.md new file mode 100644 index 000000000000..05f0b89862ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/README.md @@ -0,0 +1,297 @@ +# This is a Fork + +This is a fork of the official version `3.0.x` branch. Sass need to support older +versions of ruby than Guard wants to support on an ongoing basis, so we are releasing +updates as needed for critical fixes and will support ruby 2.0 and +greater for as long as Sass users need it. Our blog has more information about +ths [Ruby version policy for Sass](http://blog.sass-lang.com/posts/560719). + +# Listen + +The Listen gem listens to file modifications and notifies you about the changes. + +## Features + +* OS-optimized adapters on MRI for Mac OS X 10.6+, Linux, \*BSD and Windows, [more info](#listen-adapters) below. +* Detects file modification, addition and removal. +* You can watch multiple directories. +* Regexp-patterns for ignoring paths for more accuracy and speed +* Increased change detection accuracy on OS X HFS and VFAT volumes. +* Tested on MRI Ruby environments (2.0+ only) via [Travis CI](https://travis-ci.org/guard/listen), + +## Issues / limitations + +* Limited support for symlinked directories ([#279](https://github.com/guard/listen/issues/279)): + * Symlinks are always followed ([#25](https://github.com/guard/listen/issues/25)). + * Symlinked directories pointing within a watched directory are not supported ([#273](https://github.com/guard/listen/pull/273)- see [Duplicate directory errors](https://github.com/guard/listen/wiki/Duplicate-directory-errors)). +* No directory/adapter-specific configuration options. +* Support for plugins planned for future. +* TCP functionality was removed in Listen [3.0.0](https://github.com/guard/listen/releases/tag/v3.0.0) ([#319](https://github.com/guard/listen/issues/319), [#218](https://github.com/guard/listen/issues/218)). There are plans to extract this feature to separate gems ([#258](https://github.com/guard/listen/issues/258)), until this is finished, you can use by locking the `listen` gem to version `'~> 2.10'`. +* Some filesystems won't work without polling (VM/Vagrant Shared folders, NFS, Samba, sshfs, etc.). +* Specs suite on JRuby and Rubinius aren't reliable on Travis CI, but should work. +* Windows and \*BSD adapter aren't continuously and automatically tested. +* OSX adapter has some performance limitations ([#342](https://github.com/guard/listen/issues/342)). +* Ruby 1.9.3 is no longer maintained (and may not work with Listen) - it's best to upgrade to Ruby 2.2.2. + +Pull requests or help is very welcome for these. + +## Install + +The simplest way to install Listen is to use [Bundler](http://bundler.io). + +```ruby +gem 'listen', '~> 3.0' # NOTE: for TCP functionality, use '~> 2.10' for now +``` + +## Usage + +Call `Listen.to` with either a single directory or multiple directories, then define the "changes" callback in a block. + +``` ruby +listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed| + puts "modified absolute path: #{modified}" + puts "added absolute path: #{added}" + puts "removed absolute path: #{removed}" +end +listener.start # not blocking +sleep +``` + +### Pause / unpause / stop + +Listeners can also be easily paused/unpaused: + +``` ruby +listener = Listen.to('dir/path/to/listen') { |modified, added, removed| puts 'handle changes here...' } + +listener.start +listener.paused? # => false +listener.processing? # => true + +listener.pause # stops processing changes (but keeps on collecting them) +listener.paused? # => true +listener.processing? # => false + +listener.unpause # resumes processing changes ("start" would do the same) +listener.stop # stop both listening to changes and processing them +``` + + Note: While paused, Listen keeps on collecting changes in the background - to clear them, call "stop" + + Note: You should keep track of all started listeners and stop them properly on finish. + +### Ignore / ignore! + +Listen ignores some directories and extensions by default (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer), you can add ignoring patterns with the `ignore` option/method or overwrite default with `ignore!` option/method. + +``` ruby +listener = Listen.to('dir/path/to/listen', ignore: /\.txt/) { |modified, added, removed| # ... } +listener.start +listener.ignore! /\.pkg/ # overwrite all patterns and only ignore pkg extension. +listener.ignore /\.rb/ # ignore rb extension in addition of pkg. +sleep +``` + +Note: `:ignore` regexp patterns are evaluated against relative paths. + +Note: Ignoring paths does not improve performance, except when Polling ([#274](https://github.com/guard/listen/issues/274)) + +### Only + +Listen catches all files (less the ignored ones) by default. If you want to only listen to a specific type of file (i.e., just `.rb` extension), you should use the `only` option/method. + +``` ruby +listener = Listen.to('dir/path/to/listen', only: /\.rb$/) { |modified, added, removed| # ... } +listener.start +listener.only /_spec\.rb$/ # overwrite all existing only patterns. +sleep +``` + +Note: `:only` regexp patterns are evaluated only against relative **file** paths. + + +## Changes callback + +Changes to the listened-to directories gets reported back to the user in a callback. +The registered callback gets invoked, when there are changes, with **three** parameters: +`modified`, `added` and `removed` paths, in that particular order. +Paths are always returned in their absolute form. + +Example: + +```ruby +listener = Listen.to('path/to/app') do |modified, added, removed| + # This block will be called when there are changes. +end +listener.start +sleep +``` + +or ... + +```ruby +# Create a callback +callback = Proc.new do |modified, added, removed| + # This proc will be called when there are changes. +end +listener = Listen.to('dir', &callback) +listener.start +sleep +``` + +## Options + +All the following options can be set through the `Listen.to` after the directory path(s) params. + +```ruby +ignore: [%r{/foo/bar}, /\.pid$/, /\.coffee$/] # Ignore a list of paths + # default: See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer + +ignore!: %r{/foo/bar} # Same as ignore options, but overwrite default ignored paths. + +only: %r{.rb$} # Only listen to specific files + # default: none + +latency: 0.5 # Set the delay (**in seconds**) between checking for changes + # default: 0.25 sec (1.0 sec for polling) + +wait_for_delay: 4 # Set the delay (**in seconds**) between calls to the callback when changes exist + # default: 0.10 sec + +force_polling: true # Force the use of the polling adapter + # default: none + +relative: false # Whether changes should be relative to current dir or not + # default: false + +polling_fallback_message: 'custom message' # Set a custom polling fallback message (or disable it with false) + # default: "Listen will be polling for changes. Learn more at https://github.com/guard/listen#listen-adapters." +``` + +## Debugging + +Setting the environment variable `LISTEN_GEM_DEBUGGING=1` sets up the INFO level logger, while `LISTEN_GEM_DEBUGGING=2` sets up the DEBUG level logger. + +You can also set `Listen.logger` to a custom logger. + + +## Listen adapters + +The Listen gem has a set of adapters to notify it when there are changes. + +There are 4 OS-specific adapters to support Darwin, Linux, \*BSD and Windows. +These adapters are fast as they use some system-calls to implement the notifying function. + +There is also a polling adapter - although it's much slower than other adapters, +it works on every platform/system and scenario (including network filesystems such as VM shared folders). + +The Darwin and Linux adapters are dependencies of the Listen gem so they work out of the box. For other adapters a specific gem will have to be added to your Gemfile, please read below. + +The Listen gem will choose the best adapter automatically, if present. If you +want to force the use of the polling adapter, use the `:force_polling` option +while initializing the listener. + +### On Windows + +If you are on Windows, it's recommended to use the [`wdm`](https://github.com/Maher4Ever/wdm) adapter instead of polling. + +Please add the following to your Gemfile: + +```ruby +gem 'wdm', '>= 0.1.0' if Gem.win_platform? +``` + +### On \*BSD + +If you are on \*BSD you can try to use the [`rb-kqueue`](https://github.com/mat813/rb-kqueue) adapter instead of polling. + +Please add the following to your Gemfile: + +```ruby +require 'rbconfig' +if RbConfig::CONFIG['target_os'] =~ /bsd|dragonfly/i + gem 'rb-kqueue', '>= 0.2' +end + +``` + +### Getting the [polling fallback message](#options)? + +Please visit the [installation section of the Listen WIKI](https://github.com/guard/listen/wiki#installation) for more information and options for potential fixes. + +### Issues and troubleshooting + +*NOTE: without providing the output after setting the `LISTEN_GEM_DEBUGGING=1` environment variable, it can be almost impossible to guess why listen is not working as expected.* + +See [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) + +## Performance + +If Listen seems slow or unresponsive, make sure you're not using the Polling adapter (you should see a warning upon startup if you are). + +Also, if the directories you're watching contain many files, make sure you're: + +* not using Polling (ideally) +* using `:ignore` and `:only` options to avoid tracking directories you don't care about (important with Polling and on MacOS) +* running Listen with the `:latency` and `:wait_for_delay` options not too small or too big (depends on needs) +* not watching directories with log files, database files or other frequently changing files +* not using a version of Listen prior to 2.7.7 +* not getting silent crashes within Listen (see LISTEN_GEM_DEBUGGING=2) +* not running multiple instances of Listen in the background +* using a file system with atime modification disabled (ideally) +* not using a filesystem with inaccurate file modification times (ideally), e.g. HFS, VFAT +* not buffering to a slow terminal (e.g. transparency + fancy font + slow gfx card + lots of output) +* ideally not running a slow encryption stack, e.g. btrfs + ecryptfs + +When in doubt, LISTEN_GEM_DEBUGGING=2 can help discover the actual events and time they happened. + +See also [Tips and Techniques](https://github.com/guard/listen/wiki/Tips-and-Techniques). + +## Development + +* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames). +* Source hosted at [GitHub](https://github.com/guard/listen). + +Pull requests are very welcome! Please try to follow these simple rules if applicable: + +* Please create a topic branch for every separate change you make. +* Make sure your patches are well tested. All specs must pass on [Travis CI](https://travis-ci.org/guard/listen). +* Update the [Yard](http://yardoc.org/) documentation. +* Update the [README](https://github.com/guard/listen/blob/master/README.md). +* Please **do not change** the version number. + +For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on +`#guard` (irc.freenode.net). + +## Acknowledgments + +* [Michael Kessler (netzpirat)][] for having written the [initial specs](https://github.com/guard/listen/commit/1e457b13b1bb8a25d2240428ce5ed488bafbed1f). +* [Travis Tilley (ttilley)][] for this awesome work on [fssm][] & [rb-fsevent][]. +* [Nathan Weizenbaum (nex3)][] for [rb-inotify][], a thorough inotify wrapper. +* [Mathieu Arnold (mat813)][] for [rb-kqueue][], a simple kqueue wrapper. +* [Maher Sallam][] for [wdm][], windows support wouldn't exist without him. +* [Yehuda Katz (wycats)][] for [vigilo][], that has been a great source of inspiration. + +## Author + +[Thibaud Guillaume-Gentil](https://github.com/thibaudgg) ([@thibaudgg](https://twitter.com/thibaudgg)) + +## Contributors + +[https://github.com/guard/listen/graphs/contributors](https://github.com/guard/listen/graphs/contributors) + +[Thibaud Guillaume-Gentil (thibaudgg)]: https://github.com/thibaudgg +[Maher Sallam]: https://github.com/Maher4Ever +[Michael Kessler (netzpirat)]: https://github.com/netzpirat +[Travis Tilley (ttilley)]: https://github.com/ttilley +[fssm]: https://github.com/ttilley/fssm +[rb-fsevent]: https://github.com/thibaudgg/rb-fsevent +[Mathieu Arnold (mat813)]: https://github.com/mat813 +[Nathan Weizenbaum (nex3)]: https://github.com/nex3 +[rb-inotify]: https://github.com/nex3/rb-inotify +[stereobooster]: https://github.com/stereobooster +[rb-fchange]: https://github.com/stereobooster/rb-fchange +[rb-kqueue]: https://github.com/mat813/rb-kqueue +[Yehuda Katz (wycats)]: https://github.com/wycats +[vigilo]: https://github.com/wycats/vigilo +[wdm]: https://github.com/Maher4Ever/wdm diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen.rb new file mode 100644 index 000000000000..dac914fbaf8b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen.rb @@ -0,0 +1,55 @@ +require 'logger' +require 'sass-listen/logger' +require 'sass-listen/listener' + +require 'sass-listen/internals/thread_pool' + +# Always set up logging by default first time file is required +# +# NOTE: If you need to clear the logger completely, do so *after* +# requiring this file. If you need to set a custom logger, +# require the listen/logger file and set the logger before requiring +# this file. +SassListen.setup_default_logger_if_unset + +# Won't print anything by default because of level - unless you've set +# LISTEN_GEM_DEBUGGING or provided your own logger with a high enough level +SassListen::Logger.info "SassListen loglevel set to: #{SassListen.logger.level}" +SassListen::Logger.info "SassListen version: #{SassListen::VERSION}" + +module SassListen + class << self + # Listens to file system modifications on a either single directory or + # multiple directories. + # + # @param (see SassListen::Listener#new) + # + # @yield [modified, added, removed] the changed files + # @yieldparam [Array<String>] modified the list of modified files + # @yieldparam [Array<String>] added the list of added files + # @yieldparam [Array<String>] removed the list of removed files + # + # @return [SassListen::Listener] the listener + # + def to(*args, &block) + @listeners ||= [] + Listener.new(*args, &block).tap do |listener| + @listeners << listener + end + end + + # This is used by the `listen` binary to handle Ctrl-C + # + def stop + Internals::ThreadPool.stop + @listeners ||= [] + + # TODO: should use a mutex for this + @listeners.each do |listener| + # call stop to halt the main loop + listener.stop + end + @listeners = nil + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter.rb new file mode 100644 index 000000000000..1f94971228a0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter.rb @@ -0,0 +1,43 @@ +require 'sass-listen/adapter/base' +require 'sass-listen/adapter/bsd' +require 'sass-listen/adapter/darwin' +require 'sass-listen/adapter/linux' +require 'sass-listen/adapter/polling' +require 'sass-listen/adapter/windows' + +module SassListen + module Adapter + OPTIMIZED_ADAPTERS = [Darwin, Linux, BSD, Windows] + POLLING_FALLBACK_MESSAGE = 'SassListen will be polling for changes.'\ + 'Learn more at https://github.com/guard/listen#listen-adapters.' + + def self.select(options = {}) + _log :debug, 'Adapter: considering polling ...' + return Polling if options[:force_polling] + _log :debug, 'Adapter: considering optimized backend...' + return _usable_adapter_class if _usable_adapter_class + _log :debug, 'Adapter: falling back to polling...' + _warn_polling_fallback(options) + Polling + rescue + _log :warn, format('Adapter: failed: %s:%s', $ERROR_POSITION.inspect, + $ERROR_POSITION * "\n") + raise + end + + private + + def self._usable_adapter_class + OPTIMIZED_ADAPTERS.detect(&:usable?) + end + + def self._warn_polling_fallback(options) + msg = options.fetch(:polling_fallback_message, POLLING_FALLBACK_MESSAGE) + Kernel.warn "[SassListen warning]:\n #{msg}" if msg + end + + def self._log(type, message) + SassListen::Logger.send(type, message) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/base.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/base.rb new file mode 100644 index 000000000000..94a9071961d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/base.rb @@ -0,0 +1,137 @@ +require 'sass-listen/options' +require 'sass-listen/record' +require 'sass-listen/change' + +module SassListen + module Adapter + class Base + attr_reader :options + + # TODO: only used by tests + DEFAULTS = {} + + attr_reader :config + + def initialize(config) + @started = false + @config = config + + @configured = nil + + fail 'No directories to watch!' if config.directories.empty? + + defaults = self.class.const_get('DEFAULTS') + @options = SassListen::Options.new(config.adapter_options, defaults) + rescue + _log_exception 'adapter config failed: %s:%s called from: %s', caller + raise + end + + # TODO: it's a separate method as a temporary workaround for tests + def configure + if @configured + _log(:warn, 'Adapter already configured!') + return + end + + @configured = true + + @callbacks ||= {} + config.directories.each do |dir| + callback = @callbacks[dir] || lambda do |event| + _process_event(dir, event) + end + @callbacks[dir] = callback + _configure(dir, &callback) + end + + @snapshots ||= {} + # TODO: separate config per directory (some day maybe) + change_config = Change::Config.new(config.queue, config.silencer) + config.directories.each do |dir| + record = Record.new(dir) + snapshot = Change.new(change_config, record) + @snapshots[dir] = snapshot + end + end + + def started? + @started + end + + def start + configure + + if started? + _log(:warn, 'Adapter already started!') + return + end + + @started = true + + calling_stack = caller.dup + SassListen::Internals::ThreadPool.add do + begin + @snapshots.values.each do |snapshot| + _timed('Record.build()') { snapshot.record.build } + end + _run + rescue + msg = 'run() in thread failed: %s:\n'\ + ' %s\n\ncalled from:\n %s' + _log_exception(msg, calling_stack) + raise # for unit tests mostly + end + end + end + + def stop + _stop + end + + def self.usable? + const_get('OS_REGEXP') =~ RbConfig::CONFIG['target_os'] + end + + private + + def _stop + end + + def _timed(title) + start = Time.now.to_f + yield + diff = Time.now.to_f - start + SassListen::Logger.info format('%s: %.05f seconds', title, diff) + rescue + SassListen::Logger.warn "#{title} crashed: #{$ERROR_INFO.inspect}" + raise + end + + # TODO: allow backend adapters to pass specific invalidation objects + # e.g. Darwin -> DirRescan, INotify -> MoveScan, etc. + def _queue_change(type, dir, rel_path, options) + @snapshots[dir].invalidate(type, rel_path, options) + end + + def _log(*args, &block) + self.class.send(:_log, *args, &block) + end + + def _log_exception(msg, caller_stack) + formatted = format( + msg, + $ERROR_INFO, + $ERROR_POSITION * "\n", + caller_stack * "\n" + ) + + _log(:error, formatted) + end + + def self._log(*args, &block) + SassListen::Logger.send(*args, &block) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/bsd.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/bsd.rb new file mode 100644 index 000000000000..90e5f58d8d12 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/bsd.rb @@ -0,0 +1,106 @@ +# Listener implementation for BSD's `kqueue`. +# @see http://www.freebsd.org/cgi/man.cgi?query=kqueue +# @see https://github.com/mat813/rb-kqueue/blob/master/lib/rb-kqueue/queue.rb +# +module SassListen + module Adapter + class BSD < Base + OS_REGEXP = /bsd|dragonfly/i + + DEFAULTS = { + events: [ + :delete, + :write, + :extend, + :attrib, + :rename + # :link, :revoke + ] + } + + BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '') + Please add the following to your Gemfile to avoid polling for changes: + require 'rbconfig' + if RbConfig::CONFIG['target_os'] =~ /#{OS_REGEXP}/ + gem 'rb-kqueue', '>= 0.2' + end + EOS + + def self.usable? + return false unless super + require 'rb-kqueue' + require 'find' + true + rescue LoadError + Kernel.warn BUNDLER_DECLARE_GEM + false + end + + private + + def _configure(directory, &_callback) + @worker ||= KQueue::Queue.new + @callback = _callback + # use Record to make a snapshot of dir, so we + # can detect new files + _find(directory.to_s) { |path| _watch_file(path, @worker) } + end + + def _run + @worker.run + end + + def _process_event(dir, event) + full_path = _event_path(event) + if full_path.directory? + # Force dir content tracking to kick in, or we won't have + # names of added files + _queue_change(:dir, dir, '.', recursive: true) + elsif full_path.exist? + path = full_path.relative_path_from(dir) + _queue_change(:file, dir, path.to_s, change: _change(event.flags)) + end + + # If it is a directory, and it has a write flag, it means a + # file has been added so find out which and deal with it. + # No need to check for removed files, kqueue will forget them + # when the vfs does. + _watch_for_new_file(event) if full_path.directory? + end + + def _change(event_flags) + { modified: [:attrib, :extend], + added: [:write], + removed: [:rename, :delete] + }.each do |change, flags| + return change unless (flags & event_flags).empty? + end + nil + end + + def _event_path(event) + Pathname.new(event.watcher.path) + end + + def _watch_for_new_file(event) + queue = event.watcher.queue + _find(_event_path(event).to_s) do |file_path| + unless queue.watchers.detect { |_, v| v.path == file_path.to_s } + _watch_file(file_path, queue) + end + end + end + + def _watch_file(path, queue) + queue.watch_file(path, *options.events, &@callback) + rescue Errno::ENOENT => e + _log :warn, "kqueue: watch file failed: #{e.message}" + end + + # Quick rubocop workaround + def _find(*paths, &block) + Find.send(:find, *paths, &block) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/config.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/config.rb new file mode 100644 index 000000000000..e1c807a73f75 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/config.rb @@ -0,0 +1,26 @@ +require 'pathname' + +module SassListen + module Adapter + class Config + attr_reader :directories + attr_reader :silencer + attr_reader :queue + attr_reader :adapter_options + + def initialize(directories, queue, silencer, adapter_options) + # Default to current directory if no directories are supplied + directories = [Dir.pwd] if directories.to_a.empty? + + # TODO: fix (flatten, array, compact?) + @directories = directories.map do |directory| + Pathname.new(directory.to_s).realpath + end + + @silencer = silencer + @queue = queue + @adapter_options = adapter_options + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/darwin.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/darwin.rb new file mode 100644 index 000000000000..d5437263f13b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/darwin.rb @@ -0,0 +1,88 @@ +require 'thread' +require 'sass-listen/internals/thread_pool' + +module SassListen + module Adapter + # Adapter implementation for Mac OS X `FSEvents`. + # + class Darwin < Base + OS_REGEXP = /darwin(?<major_version>1\d+)/i + + # The default delay between checking for changes. + DEFAULTS = { latency: 0.1 } + + INCOMPATIBLE_GEM_VERSION = <<-EOS.gsub(/^ {8}/, '') + rb-fsevent > 0.9.4 no longer supports OS X 10.6 through 10.8. + + Please add the following to your Gemfile to avoid polling for changes: + require 'rbconfig' + if RbConfig::CONFIG['target_os'] =~ /darwin(1[0-3])/i + gem 'rb-fsevent', '<= 0.9.4' + end + EOS + + def self.usable? + require 'rb-fsevent' + darwin_version = RbConfig::CONFIG['target_os'][OS_REGEXP, :major_version] or return false + return true if darwin_version.to_i >= 13 # darwin13 is OS X 10.9 + return true if Gem::Version.new(FSEvent::VERSION) <= Gem::Version.new('0.9.4') + Kernel.warn INCOMPATIBLE_GEM_VERSION + false + end + + private + + # NOTE: each directory gets a DIFFERENT callback! + def _configure(dir, &callback) + opts = { latency: options.latency } + + @workers ||= ::Queue.new + @workers << FSEvent.new.tap do |worker| + _log :debug, "fsevent: watching: #{dir.to_s.inspect}" + worker.watch(dir.to_s, opts, &callback) + end + end + + def _run + first = @workers.pop + + # NOTE: _run is called within a thread, so run every other + # worker in it's own thread + _run_workers_in_background(_to_array(@workers)) + _run_worker(first) + end + + def _process_event(dir, event) + _log :debug, "fsevent: processing event: #{event.inspect}" + event.each do |path| + new_path = Pathname.new(path.sub(/\/$/, '')) + _log :debug, "fsevent: #{new_path}" + # TODO: does this preserve symlinks? + rel_path = new_path.relative_path_from(dir).to_s + _queue_change(:dir, dir, rel_path, recursive: true) + end + end + + def _run_worker(worker) + _log :debug, "fsevent: running worker: #{worker.inspect}" + worker.run + rescue + _log_exception 'fsevent: running worker failed: %s:%s called from: %s', caller + end + + def _run_workers_in_background(workers) + workers.each do |worker| + # NOTE: while passing local variables to the block below is not + # thread safe, using 'worker' from the enumerator above is ok + SassListen::Internals::ThreadPool.add { _run_worker(worker) } + end + end + + def _to_array(queue) + workers = [] + workers << queue.pop until queue.empty? + workers + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/linux.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/linux.rb new file mode 100644 index 000000000000..08d0d80ea46c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/linux.rb @@ -0,0 +1,108 @@ +module SassListen + module Adapter + # @see https://github.com/nex3/rb-inotify + class Linux < Base + OS_REGEXP = /linux/i + + DEFAULTS = { + events: [ + :recursive, + :attrib, + :create, + :delete, + :move, + :close_write + ], + wait_for_delay: 0.1 + } + + private + + WIKI_URL = 'https://github.com/guard/listen'\ + '/wiki/Increasing-the-amount-of-inotify-watchers' + + INOTIFY_LIMIT_MESSAGE = <<-EOS.gsub(/^\s*/, '') + FATAL: SassListen error: unable to monitor directories for changes. + Visit #{WIKI_URL} for info on how to fix this. + EOS + + def _configure(directory, &callback) + require 'rb-inotify' + @worker ||= ::INotify::Notifier.new + @worker.watch(directory.to_s, *options.events, &callback) + rescue Errno::ENOSPC + abort(INOTIFY_LIMIT_MESSAGE) + end + + def _run + Thread.current[:listen_blocking_read_thread] = true + @worker.run + Thread.current[:listen_blocking_read_thread] = false + end + + def _process_event(dir, event) + # NOTE: avoid using event.absolute_name since new API + # will need to have a custom recursion implemented + # to properly match events to configured directories + path = Pathname.new(event.watcher.path) + event.name + rel_path = path.relative_path_from(dir).to_s + + _log(:debug) { "inotify: #{rel_path} (#{event.flags.inspect})" } + + if /1|true/ =~ ENV['LISTEN_GEM_SIMULATE_FSEVENT'] + if (event.flags & [:moved_to, :moved_from]) || _dir_event?(event) + rel_path = path.dirname.relative_path_from(dir).to_s + _queue_change(:dir, dir, rel_path, {}) + else + _queue_change(:dir, dir, rel_path, {}) + end + return + end + + return if _skip_event?(event) + + cookie_params = event.cookie.zero? ? {} : { cookie: event.cookie } + + # Note: don't pass options to force rescanning the directory, so we can + # detect moving/deleting a whole tree + if _dir_event?(event) + _queue_change(:dir, dir, rel_path, cookie_params) + return + end + + params = cookie_params.merge(change: _change(event.flags)) + + _queue_change(:file, dir, rel_path, params) + end + + def _skip_event?(event) + # Event on root directory + return true if event.name == '' + # INotify reports changes to files inside directories as events + # on the directories themselves too. + # + # @see http://linux.die.net/man/7/inotify + _dir_event?(event) && (event.flags & [:close, :modify]).any? + end + + def _change(event_flags) + { modified: [:attrib, :close_write], + moved_to: [:moved_to], + moved_from: [:moved_from], + added: [:create], + removed: [:delete] }.each do |change, flags| + return change unless (flags & event_flags).empty? + end + nil + end + + def _dir_event?(event) + event.flags.include?(:isdir) + end + + def _stop + @worker && @worker.close + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/polling.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/polling.rb new file mode 100644 index 000000000000..cd6d3c97a9ea --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/polling.rb @@ -0,0 +1,37 @@ +module SassListen + module Adapter + # Polling Adapter that works cross-platform and + # has no dependencies. This is the adapter that + # uses the most CPU processing power and has higher + # file IO than the other implementations. + # + class Polling < Base + OS_REGEXP = // # match every OS + + DEFAULTS = { latency: 1.0, wait_for_delay: 0.05 } + + private + + def _configure(_, &callback) + @polling_callbacks ||= [] + @polling_callbacks << callback + end + + def _run + loop do + start = Time.now.to_f + @polling_callbacks.each do |callback| + callback.call(nil) + nap_time = options.latency - (Time.now.to_f - start) + # TODO: warn if nap_time is negative (polling too slow) + sleep(nap_time) if nap_time > 0 + end + end + end + + def _process_event(dir, _) + _queue_change(:dir, dir, '.', recursive: true) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/windows.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/windows.rb new file mode 100644 index 000000000000..7214e19e76b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/windows.rb @@ -0,0 +1,99 @@ +module SassListen + module Adapter + # Adapter implementation for Windows `wdm`. + # + class Windows < Base + OS_REGEXP = /mswin|mingw|cygwin/i + + BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '') + Please add the following to your Gemfile to avoid polling for changes: + gem 'wdm', '>= 0.1.0' if Gem.win_platform? + EOS + + def self.usable? + return false unless super + require 'wdm' + true + rescue LoadError + _log :debug, format('wdm - load failed: %s:%s', $ERROR_INFO, + $ERROR_POSITION * "\n") + + Kernel.warn BUNDLER_DECLARE_GEM + false + end + + private + + def _configure(dir, &callback) + require 'wdm' + _log :debug, 'wdm - starting...' + @worker ||= WDM::Monitor.new + @worker.watch_recursively(dir.to_s, :files) do |change| + callback.call([:file, change]) + end + + @worker.watch_recursively(dir.to_s, :directories) do |change| + callback.call([:dir, change]) + end + + events = [:attributes, :last_write] + @worker.watch_recursively(dir.to_s, *events) do |change| + callback.call([:attr, change]) + end + end + + def _run + @worker.run! + end + + def _process_event(dir, event) + _log :debug, "wdm - callback: #{event.inspect}" + + type, change = event + + full_path = Pathname(change.path) + + rel_path = full_path.relative_path_from(dir).to_s + + options = { change: _change(change.type) } + + case type + when :file + _queue_change(:file, dir, rel_path, options) + when :attr + unless full_path.directory? + _queue_change(:file, dir, rel_path, options) + end + when :dir + if change.type == :removed + # TODO: check if watched dir? + _queue_change(:dir, dir, Pathname(rel_path).dirname.to_s, {}) + elsif change.type == :added + _queue_change(:dir, dir, rel_path, {}) + else + # do nothing - changed directory means either: + # - removed subdirs (handled above) + # - added subdirs (handled above) + # - removed files (handled by _file_callback) + # - added files (handled by _file_callback) + # so what's left? + end + end + rescue + details = event.inspect + _log :error, format('wdm - callback (%): %s:%s', details, $ERROR_INFO, + $ERROR_POSITION * "\n") + raise + end + + def _change(type) + { modified: [:modified, :attrib], # TODO: is attrib really passed? + added: [:added, :renamed_new_file], + removed: [:removed, :renamed_old_file] }.each do |change, types| + return change if types.include?(type) + end + nil + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/backend.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/backend.rb new file mode 100644 index 000000000000..08dd764fe8e6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/backend.rb @@ -0,0 +1,43 @@ +require 'sass-listen/adapter' +require 'sass-listen/adapter/base' +require 'sass-listen/adapter/config' + +require 'forwardable' + +# This class just aggregates configuration object to avoid Listener specs +# from exploding with huge test setup blocks +module SassListen + class Backend + def initialize(directories, queue, silencer, config) + adapter_select_opts = config.adapter_select_options + + adapter_class = Adapter.select(adapter_select_opts) + + # Use default from adapter if possible + @min_delay_between_events = config.min_delay_between_events + @min_delay_between_events ||= adapter_class::DEFAULTS[:wait_for_delay] + @min_delay_between_events ||= 0.1 + + adapter_opts = config.adapter_instance_options(adapter_class) + + aconfig = Adapter::Config.new(directories, queue, silencer, adapter_opts) + @adapter = adapter_class.new(aconfig) + end + + def start + adapter.start + end + + def stop + adapter.stop + end + + def min_delay_between_events + @min_delay_between_events + end + + private + + attr_reader :adapter + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/change.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/change.rb new file mode 100644 index 000000000000..6b1f07c31487 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/change.rb @@ -0,0 +1,78 @@ +require 'sass-listen/file' +require 'sass-listen/directory' + +module SassListen + # TODO: rename to Snapshot + class Change + # TODO: test this class for coverage + class Config + def initialize(queue, silencer) + @queue = queue + @silencer = silencer + end + + def silenced?(path, type) + @silencer.silenced?(Pathname(path), type) + end + + def queue(*args) + @queue << args + end + end + + attr_reader :record + + def initialize(config, record) + @config = config + @record = record + end + + # Invalidate some part of the snapshot/record (dir, file, subtree, etc.) + def invalidate(type, rel_path, options) + watched_dir = Pathname.new(record.root) + + change = options[:change] + cookie = options[:cookie] + + if !cookie && config.silenced?(rel_path, type) + SassListen::Logger.debug { "(silenced): #{rel_path.inspect}" } + return + end + + path = watched_dir + rel_path + + SassListen::Logger.debug do + log_details = options[:silence] && 'recording' || change || 'unknown' + "#{log_details}: #{type}:#{path} (#{options.inspect})" + end + + if change + options = cookie ? { cookie: cookie } : {} + config.queue(type, change, watched_dir, rel_path, options) + else + if type == :dir + # NOTE: POSSIBLE RECURSION + # TODO: fix - use a queue instead + Directory.scan(self, rel_path, options) + else + change = File.change(record, rel_path) + return if !change || options[:silence] + config.queue(:file, change, watched_dir, rel_path) + end + end + rescue RuntimeError => ex + msg = format( + '%s#%s crashed %s:%s', + self.class, + __method__, + exinspect, + ex.backtrace * "\n") + SassListen::Logger.error(msg) + raise + end + + private + + attr_reader :config + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/cli.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/cli.rb new file mode 100644 index 000000000000..c56193d5d096 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/cli.rb @@ -0,0 +1,65 @@ +require 'thor' +require 'sass-listen' +require 'logger' + +module SassListen + class CLI < Thor + default_task :start + + desc 'start', 'Starts SassListen' + + class_option :verbose, + type: :boolean, + default: false, + aliases: '-v', + banner: 'Verbose' + + class_option :directory, + type: :array, + default: '.', + aliases: '-d', + banner: 'The directory to listen to' + + class_option :relative, + type: :boolean, + default: false, + aliases: '-r', + banner: 'Convert paths relative to current directory' + + def start + SassListen::Forwarder.new(options).start + end + end + + class Forwarder + attr_reader :logger + def initialize(options) + @options = options + @logger = ::Logger.new(STDOUT) + @logger.level = ::Logger::INFO + @logger.formatter = proc { |_, _, _, msg| "#{msg}\n" } + end + + def start + logger.info 'Starting listen...' + directory = @options[:directory] + relative = @options[:relative] + callback = proc do |modified, added, removed| + if @options[:verbose] + logger.info "+ #{added}" unless added.empty? + logger.info "- #{removed}" unless removed.empty? + logger.info "> #{modified}" unless modified.empty? + end + end + + listener = SassListen.to( + directory, + relative: relative, + &callback) + + listener.start + + sleep 0.5 while listener.processing? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/directory.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/directory.rb new file mode 100644 index 000000000000..b3ab70452da4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/directory.rb @@ -0,0 +1,87 @@ +require 'set' + +module SassListen + # TODO: refactor (turn it into a normal object, cache the stat, etc) + class Directory + def self.scan(snapshot, rel_path, options) + record = snapshot.record + dir = Pathname.new(record.root) + previous = record.dir_entries(rel_path) + + record.add_dir(rel_path) + + # TODO: use children(with_directory: false) + path = dir + rel_path + current = Set.new(_children(path)) + + SassListen::Logger.debug do + format('%s: %s(%s): %s -> %s', + (options[:silence] ? 'Recording' : 'Scanning'), + rel_path, options.inspect, previous.inspect, current.inspect) + end + + begin + current.each do |full_path| + type = ::File.lstat(full_path.to_s).directory? ? :dir : :file + item_rel_path = full_path.relative_path_from(dir).to_s + _change(snapshot, type, item_rel_path, options) + end + rescue Errno::ENOENT + # The directory changed meanwhile, so rescan it + current = Set.new(_children(path)) + retry + end + + # TODO: this is not tested properly + previous = previous.reject { |entry, _| current.include? path + entry } + + _async_changes(snapshot, Pathname.new(rel_path), previous, options) + + rescue Errno::ENOENT, Errno::EHOSTDOWN + record.unset_path(rel_path) + _async_changes(snapshot, Pathname.new(rel_path), previous, options) + + rescue Errno::ENOTDIR + # TODO: path not tested + record.unset_path(rel_path) + _async_changes(snapshot, path, previous, options) + _change(snapshot, :file, rel_path, options) + rescue + SassListen::Logger.warn do + format('scan DIED: %s:%s', $ERROR_INFO, $ERROR_POSITION * "\n") + end + raise + end + + def self._async_changes(snapshot, path, previous, options) + fail "Not a Pathname: #{path.inspect}" unless path.respond_to?(:children) + previous.each do |entry, data| + # TODO: this is a hack with insufficient testing + type = data.key?(:mtime) ? :file : :dir + rel_path_s = (path + entry).to_s + _change(snapshot, type, rel_path_s, options) + end + end + + def self._change(snapshot, type, path, options) + return snapshot.invalidate(type, path, options) if type == :dir + + # Minor param cleanup for tests + # TODO: use a dedicated Event class + opts = options.dup + opts.delete(:recursive) + snapshot.invalidate(type, path, opts) + end + + def self._children(path) + return path.children unless RUBY_ENGINE == 'jruby' + + # JRuby inconsistency workaround, see: + # https://github.com/jruby/jruby/issues/3840 + exists = path.exist? + directory = path.directory? + return path.children unless (exists && !directory) + raise Errno::ENOTDIR, path.to_s + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/config.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/config.rb new file mode 100644 index 000000000000..9709ebef7122 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/config.rb @@ -0,0 +1,59 @@ +module SassListen + module Event + class Config + def initialize( + listener, + event_queue, + queue_optimizer, + wait_for_delay, + &block) + + @listener = listener + @event_queue = event_queue + @queue_optimizer = queue_optimizer + @min_delay_between_events = wait_for_delay + @block = block + end + + def sleep(*args) + Kernel.sleep(*args) + end + + def call(*args) + @block.call(*args) if @block + end + + def timestamp + Time.now.to_f + end + + def event_queue + @event_queue + end + + def callable? + @block + end + + def optimize_changes(changes) + @queue_optimizer.smoosh_changes(changes) + end + + def min_delay_between_events + @min_delay_between_events + end + + def stopped? + listener.state == :stopped + end + + def paused? + listener.state == :paused + end + + private + + attr_reader :listener + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/loop.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/loop.rb new file mode 100644 index 000000000000..c2caec234653 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/loop.rb @@ -0,0 +1,117 @@ +require 'thread' + +require 'timeout' +require 'sass-listen/event/processor' + +module SassListen + module Event + class Loop + class Error < RuntimeError + class NotStarted < Error + end + end + + def initialize(config) + @config = config + @wait_thread = nil + @state = :paused + @reasons = ::Queue.new + end + + def wakeup_on_event + return if stopped? + return unless processing? + return unless wait_thread.alive? + _wakeup(:event) + end + + def paused? + wait_thread && state == :paused + end + + def processing? + return false if stopped? + return false if paused? + state == :processing + end + + def setup + # TODO: use a Fiber instead? + q = ::Queue.new + @wait_thread = Internals::ThreadPool.add do + _wait_for_changes(q, config) + end + + SassListen::Logger.debug('Waiting for processing to start...') + Timeout.timeout(5) { q.pop } + end + + def resume + fail Error::NotStarted if stopped? + return unless wait_thread + _wakeup(:resume) + end + + def pause + # TODO: works? + # fail NotImplementedError + end + + def teardown + return unless wait_thread + if wait_thread.alive? + _wakeup(:teardown) + wait_thread.join + end + @wait_thread = nil + end + + def stopped? + !wait_thread + end + + private + + attr_reader :config + attr_reader :wait_thread + + attr_accessor :state + + def _wait_for_changes(ready_queue, config) + processor = Event::Processor.new(config, @reasons) + + _wait_until_resumed(ready_queue) + processor.loop_for(config.min_delay_between_events) + rescue StandardError => ex + _nice_error(ex) + end + + def _sleep(*args) + Kernel.sleep(*args) + end + + def _wait_until_resumed(ready_queue) + self.state = :paused + ready_queue << :ready + sleep + self.state = :processing + end + + def _nice_error(ex) + indent = "\n -- " + msg = format( + 'exception while processing events: %s Backtrace:%s%s', + ex, + indent, + ex.backtrace * indent + ) + SassListen::Logger.error(msg) + end + + def _wakeup(reason) + @reasons << reason + wait_thread.wakeup + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/processor.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/processor.rb new file mode 100644 index 000000000000..4002880957e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/processor.rb @@ -0,0 +1,122 @@ +module SassListen + module Event + class Processor + def initialize(config, reasons) + @config = config + @reasons = reasons + _reset_no_unprocessed_events + end + + # TODO: implement this properly instead of checking the state at arbitrary + # points in time + def loop_for(latency) + @latency = latency + + loop do + _wait_until_events + _wait_until_events_calm_down + _wait_until_no_longer_paused + _process_changes + end + rescue Stopped + SassListen::Logger.debug('Processing stopped') + end + + private + + class Stopped < RuntimeError + end + + def _wait_until_events_calm_down + loop do + now = _timestamp + + # Assure there's at least latency between callbacks to allow + # for accumulating changes + diff = _deadline - now + break if diff <= 0 + + # give events a bit of time to accumulate so they can be + # compressed/optimized + _sleep(:waiting_until_latency, diff) + end + end + + def _wait_until_no_longer_paused + # TODO: may not be a good idea? + _sleep(:waiting_for_unpause) while config.paused? + end + + def _check_stopped + return unless config.stopped? + + _flush_wakeup_reasons + raise Stopped + end + + def _sleep(_local_reason, *args) + _check_stopped + sleep_duration = config.sleep(*args) + _check_stopped + + _flush_wakeup_reasons do |reason| + next unless reason == :event + _remember_time_of_first_unprocessed_event unless config.paused? + end + + sleep_duration + end + + def _remember_time_of_first_unprocessed_event + @first_unprocessed_event_time ||= _timestamp + end + + def _reset_no_unprocessed_events + @first_unprocessed_event_time = nil + end + + def _deadline + @first_unprocessed_event_time + @latency + end + + def _wait_until_events + # TODO: long sleep may not be a good idea? + _sleep(:waiting_for_events) while config.event_queue.empty? + @first_unprocessed_event_time ||= _timestamp + end + + def _flush_wakeup_reasons + reasons = @reasons + until reasons.empty? + reason = reasons.pop + yield reason if block_given? + end + end + + def _timestamp + config.timestamp + end + + # for easier testing without sleep loop + def _process_changes + _reset_no_unprocessed_events + + changes = [] + changes << config.event_queue.pop until config.event_queue.empty? + + callable = config.callable? + return unless callable + + hash = config.optimize_changes(changes) + result = [hash[:modified], hash[:added], hash[:removed]] + return if result.all?(&:empty?) + + block_start = _timestamp + config.call(*result) + SassListen::Logger.debug "Callback took #{_timestamp - block_start} sec" + end + + attr_reader :config + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/queue.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/queue.rb new file mode 100644 index 000000000000..3d7636716409 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/event/queue.rb @@ -0,0 +1,58 @@ +require 'thread' + +require 'forwardable' + +module SassListen + module Event + class Queue + class Config + def initialize(relative) + @relative = relative + end + + def relative? + @relative + end + end + + def initialize(config, &block) + @event_queue = ::Queue.new + @block = block + @config = config + end + + def <<(args) + type, change, dir, path, options = *args + fail "Invalid type: #{type.inspect}" unless [:dir, :file].include? type + fail "Invalid change: #{change.inspect}" unless change.is_a?(Symbol) + fail "Invalid path: #{path.inspect}" unless path.is_a?(String) + + dir = _safe_relative_from_cwd(dir) + event_queue.public_send(:<<, [type, change, dir, path, options]) + + block.call(args) if block + end + + def empty? + event_queue.empty? + end + + def pop + event_queue.pop + end + + private + + attr_reader :event_queue + attr_reader :block + attr_reader :config + + def _safe_relative_from_cwd(dir) + return dir unless config.relative? + dir.relative_path_from(Pathname.pwd) + rescue ArgumentError + dir + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/file.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/file.rb new file mode 100644 index 000000000000..9a60bd713c5b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/file.rb @@ -0,0 +1,80 @@ +require 'digest/md5' + +module SassListen + class File + def self.change(record, rel_path) + path = Pathname.new(record.root) + rel_path + lstat = path.lstat + + data = { mtime: lstat.mtime.to_f, mode: lstat.mode } + + record_data = record.file_data(rel_path) + + if record_data.empty? + record.update_file(rel_path, data) + return :added + end + + if data[:mode] != record_data[:mode] + record.update_file(rel_path, data) + return :modified + end + + if data[:mtime] != record_data[:mtime] + record.update_file(rel_path, data) + return :modified + end + + return if /1|true/ =~ ENV['LISTEN_GEM_DISABLE_HASHING'] + return unless self.inaccurate_mac_time?(lstat) + + # Check if change happened within 1 second (maybe it's even + # too much, e.g. 0.3-0.5 could be sufficient). + # + # With rb-fsevent, there's a (configurable) latency between + # when file was changed and when the event was triggered. + # + # If a file is saved at ???14.998, by the time the event is + # actually received by SassListen, the time could already be e.g. + # ???15.7. + # + # And since Darwin adapter uses directory scanning, the file + # mtime may be the same (e.g. file was changed at ???14.001, + # then at ???14.998, but the fstat time would be ???14.0 in + # both cases). + # + # If change happend at ???14.999997, the mtime is 14.0, so for + # an mtime=???14.0 we assume it could even be almost ???15.0 + # + # So if Time.now.to_f is ???15.999998 and stat reports mtime + # at ???14.0, then event was due to that file'd change when: + # + # ???15.999997 - ???14.999998 < 1.0s + # + # So the "2" is "1 + 1" (1s to cover rb-fsevent latency + + # 1s maximum difference between real mtime and that recorded + # in the file system) + # + return if data[:mtime].to_i + 2 <= Time.now.to_f + + md5 = Digest::MD5.file(path).digest + record.update_file(rel_path, data.merge(md5: md5)) + :modified if record_data[:md5] && md5 != record_data[:md5] + rescue SystemCallError + record.unset_path(rel_path) + :removed + rescue + SassListen::Logger.debug "lstat failed for: #{rel_path} (#{$ERROR_INFO})" + raise + end + + def self.inaccurate_mac_time?(stat) + # 'mac' means Modified/Accessed/Created + + # Since precision depends on mounted FS (e.g. you can have a FAT partiion + # mounted on Linux), check for fields with a remainder to detect this + + [stat.mtime, stat.ctime, stat.atime].map(&:usec).all?(&:zero?) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/fsm.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/fsm.rb new file mode 100644 index 000000000000..e253b76f36eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/fsm.rb @@ -0,0 +1,131 @@ +# Code copied from https://github.com/celluloid/celluloid-fsm +module SassListen + module FSM + DEFAULT_STATE = :default # Default state name unless one is explicitly set + + # Included hook to extend class methods + def self.included(klass) + klass.send :extend, ClassMethods + end + + module ClassMethods + # Obtain or set the default state + # Passing a state name sets the default state + def default_state(new_default = nil) + if new_default + @default_state = new_default.to_sym + else + defined?(@default_state) ? @default_state : DEFAULT_STATE + end + end + + # Obtain the valid states for this FSM + def states + @states ||= {} + end + + # Declare an FSM state and optionally provide a callback block to fire + # Options: + # * to: a state or array of states this state can transition to + def state(*args, &block) + if args.last.is_a? Hash + # Stringify keys :/ + options = args.pop.each_with_object({}) { |(k, v), h| h[k.to_s] = v } + else + options = {} + end + + args.each do |name| + name = name.to_sym + default_state name if options['default'] + states[name] = State.new(name, options['to'], &block) + end + end + end + + # Be kind and call super if you must redefine initialize + def initialize + @state = self.class.default_state + end + + # Obtain the current state of the FSM + attr_reader :state + + def transition(state_name) + new_state = validate_and_sanitize_new_state(state_name) + return unless new_state + transition_with_callbacks!(new_state) + end + + # Immediate state transition with no checks, or callbacks. "Dangerous!" + def transition!(state_name) + @state = state_name + end + + protected + + def validate_and_sanitize_new_state(state_name) + state_name = state_name.to_sym + + return if current_state_name == state_name + + if current_state && !current_state.valid_transition?(state_name) + valid = current_state.transitions.map(&:to_s).join(', ') + msg = "#{self.class} can't change state from '#{@state}'"\ + " to '#{state_name}', only to: #{valid}" + fail ArgumentError, msg + end + + new_state = states[state_name] + + unless new_state + return if state_name == default_state + fail ArgumentError, "invalid state for #{self.class}: #{state_name}" + end + + new_state + end + + def transition_with_callbacks!(state_name) + transition! state_name.name + state_name.call(self) + end + + def states + self.class.states + end + + def default_state + self.class.default_state + end + + def current_state + states[@state] + end + + def current_state_name + current_state && current_state.name || '' + end + + class State + attr_reader :name, :transitions + + def initialize(name, transitions = nil, &block) + @name, @block = name, block + @transitions = nil + @transitions = Array(transitions).map(&:to_sym) if transitions + end + + def call(obj) + obj.instance_eval(&@block) if @block + end + + def valid_transition?(new_state) + # All transitions are allowed unless expressly + return true unless @transitions + + @transitions.include? new_state.to_sym + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/internals/thread_pool.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/internals/thread_pool.rb new file mode 100644 index 000000000000..102b2140eff4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/internals/thread_pool.rb @@ -0,0 +1,29 @@ +module SassListen + # @private api + module Internals + module ThreadPool + def self.add(&block) + Thread.new { block.call }.tap do |th| + (@threads ||= Queue.new) << th + end + end + + def self.stop + return unless @threads ||= nil + return if @threads.empty? # return to avoid using possibly stubbed Queue + + killed = Queue.new + # You can't kill a read on a descriptor in JRuby, so let's just + # ignore running threads (listen rb-inotify waiting for disk activity + # before closing) pray threads die faster than they are created... + limit = RUBY_ENGINE == 'jruby' ? [1] : [] + + killed << @threads.pop.kill until @threads.empty? + until killed.empty? + th = killed.pop + th.join(*limit) unless th[:listen_blocking_read_thread] + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/listener.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/listener.rb new file mode 100644 index 000000000000..6c5e2a703ee7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/listener.rb @@ -0,0 +1,132 @@ +require 'English' + +require 'sass-listen/version' + +require 'sass-listen/backend' + +require 'sass-listen/silencer' +require 'sass-listen/silencer/controller' + +require 'sass-listen/queue_optimizer' + +require 'sass-listen/fsm' + +require 'sass-listen/event/loop' +require 'sass-listen/event/queue' +require 'sass-listen/event/config' + +require 'sass-listen/listener/config' + +module SassListen + class Listener + include SassListen::FSM + + # Initializes the directories listener. + # + # @param [String] directory the directories to listen to + # @param [Hash] options the listen options (see SassListen::Listener::Options) + # + # @yield [modified, added, removed] the changed files + # @yieldparam [Array<String>] modified the list of modified files + # @yieldparam [Array<String>] added the list of added files + # @yieldparam [Array<String>] removed the list of removed files + # + def initialize(*dirs, &block) + options = dirs.last.is_a?(Hash) ? dirs.pop : {} + + @config = Config.new(options) + + eq_config = Event::Queue::Config.new(@config.relative?) + queue = Event::Queue.new(eq_config) { @processor.wakeup_on_event } + + silencer = Silencer.new + rules = @config.silencer_rules + @silencer_controller = Silencer::Controller.new(silencer, rules) + + @backend = Backend.new(dirs, queue, silencer, @config) + + optimizer_config = QueueOptimizer::Config.new(@backend, silencer) + + pconfig = Event::Config.new( + self, + queue, + QueueOptimizer.new(optimizer_config), + @backend.min_delay_between_events, + &block) + + @processor = Event::Loop.new(pconfig) + + super() # FSM + end + + default_state :initializing + + state :initializing, to: [:backend_started, :stopped] + + state :backend_started, to: [:frontend_ready, :stopped] do + backend.start + end + + state :frontend_ready, to: [:processing_events, :stopped] do + processor.setup + end + + state :processing_events, to: [:paused, :stopped] do + processor.resume + end + + state :paused, to: [:processing_events, :stopped] do + processor.pause + end + + state :stopped, to: [:backend_started] do + backend.stop # should be before processor.teardown to halt events ASAP + processor.teardown + end + + # Starts processing events and starts adapters + # or resumes invoking callbacks if paused + def start + transition :backend_started if state == :initializing + transition :frontend_ready if state == :backend_started + transition :processing_events if state == :frontend_ready + transition :processing_events if state == :paused + end + + # Stops both listening for events and processing them + def stop + transition :stopped + end + + # Stops invoking callbacks (messages pile up) + def pause + transition :paused + end + + # processing means callbacks are called + def processing? + state == :processing_events + end + + def paused? + state == :paused + end + + def ignore(regexps) + @silencer_controller.append_ignores(regexps) + end + + def ignore!(regexps) + @silencer_controller.replace_with_bang_ignores(regexps) + end + + def only(regexps) + @silencer_controller.replace_with_only(regexps) + end + + private + + attr_reader :processor + attr_reader :backend + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/listener/config.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/listener/config.rb new file mode 100644 index 000000000000..a3ace4e079d2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/listener/config.rb @@ -0,0 +1,45 @@ +module SassListen + class Listener + class Config + DEFAULTS = { + # Listener options + debug: false, # TODO: is this broken? + wait_for_delay: nil, # NOTE: should be provided by adapter if possible + relative: false, + + # Backend selecting options + force_polling: false, + polling_fallback_message: nil + } + + def initialize(opts) + @options = DEFAULTS.merge(opts) + @relative = @options[:relative] + @min_delay_between_events = @options[:wait_for_delay] + @silencer_rules = @options # silencer will extract what it needs + end + + def relative? + @relative + end + + def min_delay_between_events + @min_delay_between_events + end + + def silencer_rules + @silencer_rules + end + + def adapter_instance_options(klass) + valid_keys = klass.const_get('DEFAULTS').keys + Hash[@options.select { |key, _| valid_keys.include?(key) }] + end + + def adapter_select_options + valid_keys = %w(force_polling polling_fallback_message).map(&:to_sym) + Hash[@options.select { |key, _| valid_keys.include?(key) }] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/logger.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/logger.rb new file mode 100644 index 000000000000..5abe8bdfd49e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/logger.rb @@ -0,0 +1,32 @@ +module SassListen + def self.logger + @logger ||= nil + end + + def self.logger=(logger) + @logger = logger + end + + def self.setup_default_logger_if_unset + self.logger ||= ::Logger.new(STDERR).tap do |logger| + debugging = ENV['LISTEN_GEM_DEBUGGING'] + logger.level = + case debugging.to_s + when /2/ + ::Logger::DEBUG + when /true|yes|1/i + ::Logger::INFO + else + ::Logger::ERROR + end + end + end + + class Logger + [:fatal, :error, :warn, :info, :debug].each do |meth| + define_singleton_method(meth) do |*args, &block| + SassListen.logger.public_send(meth, *args, &block) if SassListen.logger + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/options.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/options.rb new file mode 100644 index 000000000000..82a332688eb3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/options.rb @@ -0,0 +1,23 @@ +module SassListen + class Options + def initialize(opts, defaults) + @options = {} + given_options = opts.dup + defaults.keys.each do |key| + @options[key] = given_options.delete(key) || defaults[key] + end + + return if given_options.empty? + + msg = "Unknown options: #{given_options.inspect}" + SassListen::Logger.warn msg + fail msg + end + + def method_missing(name, *_) + return @options[name] if @options.key?(name) + msg = "Bad option: #{name.inspect} (valid:#{@options.keys.inspect})" + fail NameError, msg + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/queue_optimizer.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/queue_optimizer.rb new file mode 100644 index 000000000000..650c4430afdd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/queue_optimizer.rb @@ -0,0 +1,132 @@ +module SassListen + class QueueOptimizer + class Config + def initialize(adapter_class, silencer) + @adapter_class = adapter_class + @silencer = silencer + end + + def exist?(path) + Pathname(path).exist? + end + + def silenced?(path, type) + @silencer.silenced?(path, type) + end + + def debug(*args, &block) + SassListen.logger.debug(*args, &block) + end + end + + def smoosh_changes(changes) + # TODO: adapter could be nil at this point (shutdown) + cookies = changes.group_by do |_, _, _, _, options| + (options || {})[:cookie] + end + _squash_changes(_reinterpret_related_changes(cookies)) + end + + def initialize(config) + @config = config + end + + private + + attr_reader :config + + # groups changes into the expected structure expected by + # clients + def _squash_changes(changes) + # We combine here for backward compatibility + # Newer clients should receive dir and path separately + changes = changes.map { |change, dir, path| [change, dir + path] } + + actions = changes.group_by(&:last).map do |path, action_list| + [_logical_action_for(path, action_list.map(&:first)), path.to_s] + end + + config.debug("listen: raw changes: #{actions.inspect}") + + { modified: [], added: [], removed: [] }.tap do |squashed| + actions.each do |type, path| + squashed[type] << path unless type.nil? + end + config.debug("listen: final changes: #{squashed.inspect}") + end + end + + def _logical_action_for(path, actions) + actions << :added if actions.delete(:moved_to) + actions << :removed if actions.delete(:moved_from) + + modified = actions.detect { |x| x == :modified } + _calculate_add_remove_difference(actions, path, modified) + end + + def _calculate_add_remove_difference(actions, path, default_if_exists) + added = actions.count { |x| x == :added } + removed = actions.count { |x| x == :removed } + diff = added - removed + + # TODO: avoid checking if path exists and instead assume the events are + # in order (if last is :removed, it doesn't exist, etc.) + if config.exist?(path) + if diff > 0 + :added + elsif diff.zero? && added > 0 + :modified + else + default_if_exists + end + else + diff < 0 ? :removed : nil + end + end + + # remove extraneous rb-inotify events, keeping them only if it's a possible + # editor rename() call (e.g. Kate and Sublime) + def _reinterpret_related_changes(cookies) + table = { moved_to: :added, moved_from: :removed } + cookies.map do |_, changes| + data = _detect_possible_editor_save(changes) + if data + to_dir, to_file = data + [[:modified, to_dir, to_file]] + else + not_silenced = changes.reject do |type, _, _, path, _| + config.silenced?(Pathname(path), type) + end + not_silenced.map do |_, change, dir, path, _| + [table.fetch(change, change), dir, path] + end + end + end.flatten(1) + end + + def _detect_possible_editor_save(changes) + return unless changes.size == 2 + + from_type = from_change = from = nil + to_type = to_change = to_dir = to = nil + + changes.each do |data| + case data[1] + when :moved_from + from_type, from_change, _, from, _ = data + when :moved_to + to_type, to_change, to_dir, to, _ = data + else + return nil + end + end + + return unless from && to + + # Expect an ignored moved_from and non-ignored moved_to + # to qualify as an "editor modify" + return unless config.silenced?(Pathname(from), from_type) + config.silenced?(Pathname(to), to_type) ? nil : [to_dir, to] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/record.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/record.rb new file mode 100644 index 000000000000..e88751142565 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/record.rb @@ -0,0 +1,120 @@ +require 'thread' +require 'sass-listen/record/entry' +require 'sass-listen/record/symlink_detector' + +module SassListen + class Record + # TODO: one Record object per watched directory? + # TODO: deprecate + + attr_reader :root + def initialize(directory) + @tree = _auto_hash + @root = directory.to_s + end + + def add_dir(rel_path) + return if [nil, '', '.'].include? rel_path + @tree[rel_path] ||= {} + end + + def update_file(rel_path, data) + dirname, basename = Pathname(rel_path).split.map(&:to_s) + _fast_update_file(dirname, basename, data) + end + + def unset_path(rel_path) + dirname, basename = Pathname(rel_path).split.map(&:to_s) + _fast_unset_path(dirname, basename) + end + + def file_data(rel_path) + dirname, basename = Pathname(rel_path).split.map(&:to_s) + if [nil, '', '.'].include? dirname + tree[basename] ||= {} + tree[basename].dup + else + tree[dirname] ||= {} + tree[dirname][basename] ||= {} + tree[dirname][basename].dup + end + end + + def dir_entries(rel_path) + subtree = + if [nil, '', '.'].include? rel_path.to_s + tree + else + tree[rel_path.to_s] ||= _auto_hash + tree[rel_path.to_s] + end + + result = {} + subtree.each do |key, values| + # only get data for file entries + result[key] = values.key?(:mtime) ? values : {} + end + result + end + + def build + @tree = _auto_hash + # TODO: test with a file name given + # TODO: test other permissions + # TODO: test with mixed encoding + symlink_detector = SymlinkDetector.new + remaining = ::Queue.new + remaining << Entry.new(root, nil, nil) + _fast_build_dir(remaining, symlink_detector) until remaining.empty? + end + + private + + def _auto_hash + Hash.new { |h, k| h[k] = Hash.new } + end + + def tree + @tree + end + + def _fast_update_file(dirname, basename, data) + if [nil, '', '.'].include? dirname + tree[basename] = (tree[basename] || {}).merge(data) + else + tree[dirname] ||= {} + tree[dirname][basename] = (tree[dirname][basename] || {}).merge(data) + end + end + + def _fast_unset_path(dirname, basename) + # this may need to be reworked to properly remove + # entries from a tree, without adding non-existing dirs to the record + if [nil, '', '.'].include? dirname + return unless tree.key?(basename) + tree.delete(basename) + else + return unless tree.key?(dirname) + tree[dirname].delete(basename) + end + end + + def _fast_build_dir(remaining, symlink_detector) + entry = remaining.pop + children = entry.children # NOTE: children() implicitly tests if dir + symlink_detector.verify_unwatched!(entry) + children.each { |child| remaining << child } + add_dir(entry.record_dir_key) + rescue Errno::ENOTDIR + _fast_try_file(entry) + rescue SystemCallError, SymlinkDetector::Error + _fast_unset_path(entry.relative, entry.name) + end + + def _fast_try_file(entry) + _fast_update_file(entry.relative, entry.name, entry.meta) + rescue SystemCallError + _fast_unset_path(entry.relative, entry.name) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/record/entry.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/record/entry.rb new file mode 100644 index 000000000000..18a1c4168fd3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/record/entry.rb @@ -0,0 +1,62 @@ +module SassListen + # @private api + class Record + # Represents a directory entry (dir or file) + class Entry + # file: "/home/me/watched_dir", "app/models", "foo.rb" + # dir, "/home/me/watched_dir", "." + def initialize(root, relative, name = nil) + @root, @relative, @name = root, relative, name + end + + attr_reader :root, :relative, :name + + def children + child_relative = _join + (_entries(sys_path) - %w(. ..)).map do |name| + Entry.new(@root, child_relative, name) + end + end + + def meta + lstat = ::File.lstat(sys_path) + { mtime: lstat.mtime.to_f, mode: lstat.mode } + end + + # record hash is e.g. + # if @record["/home/me/watched_dir"]["project/app/models"]["foo.rb"] + # if @record["/home/me/watched_dir"]["project/app"]["models"] + # record_dir_key is "project/app/models" + def record_dir_key + ::File.join(*[@relative, @name].compact) + end + + def sys_path + # Use full path in case someone uses chdir + ::File.join(*[@root, @relative, @name].compact) + end + + def real_path + @real_path ||= ::File.realpath(sys_path) + end + + private + + def _join + args = [@relative, @name].compact + args.empty? ? nil : ::File.join(*args) + end + + def _entries(dir) + return Dir.entries(dir) unless RUBY_ENGINE == 'jruby' + + # JRuby inconsistency workaround, see: + # https://github.com/jruby/jruby/issues/3840 + exists = ::File.exist?(dir) + directory = ::File.directory?(dir) + return Dir.entries(dir) unless (exists && !directory) + raise Errno::ENOTDIR, dir + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/record/symlink_detector.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/record/symlink_detector.rb new file mode 100644 index 000000000000..0aced230ff85 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/record/symlink_detector.rb @@ -0,0 +1,39 @@ +require 'set' + +module SassListen + # @private api + class Record + class SymlinkDetector + WIKI = 'https://github.com/guard/listen/wiki/Duplicate-directory-errors' + + SYMLINK_LOOP_ERROR = <<-EOS + ** ERROR: directory is already being watched! ** + + Directory: %s + + is already being watched through: %s + + MORE INFO: #{WIKI} + EOS + + class Error < RuntimeError + end + + def initialize + @real_dirs = Set.new + end + + def verify_unwatched!(entry) + real_path = entry.real_path + @real_dirs.add?(real_path) || _fail(entry.sys_path, real_path) + end + + private + + def _fail(symlinked, real_path) + STDERR.puts format(SYMLINK_LOOP_ERROR, symlinked, real_path) + fail Error, 'Failed due to looped symlinks' + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer.rb new file mode 100644 index 000000000000..7e735faa9fc3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer.rb @@ -0,0 +1,97 @@ +module SassListen + class Silencer + # The default list of directories that get ignored. + DEFAULT_IGNORED_DIRECTORIES = %r{^(?: + \.git + | \.svn + | \.hg + | \.rbx + | \.bundle + | bundle + | vendor/bundle + | log + | tmp + |vendor/ruby + )(/|$)}x + + # The default list of files that get ignored. + DEFAULT_IGNORED_EXTENSIONS = /(?: + # Kate's tmp\/swp files + \..*\d+\.new + | \.kate-swp + + # Gedit tmp files + | \.goutputstream-.{6} + + # Intellij files + | ___jb_bak___ + | ___jb_old___ + + # Vim swap files and write test + | \.sw[px] + | \.swpx + | ^4913 + + # Sed temporary files - but without actual words, like 'sedatives' + | (?:^ + sed + + (?: + [a-zA-Z0-9]{0}[A-Z]{1}[a-zA-Z0-9]{5} | + [a-zA-Z0-9]{1}[A-Z]{1}[a-zA-Z0-9]{4} | + [a-zA-Z0-9]{2}[A-Z]{1}[a-zA-Z0-9]{3} | + [a-zA-Z0-9]{3}[A-Z]{1}[a-zA-Z0-9]{2} | + [a-zA-Z0-9]{4}[A-Z]{1}[a-zA-Z0-9]{1} | + [a-zA-Z0-9]{5}[A-Z]{1}[a-zA-Z0-9]{0} + ) + ) + + # other files + | \.DS_Store + | \.tmp + | ~ + )$/x + + attr_accessor :only_patterns, :ignore_patterns + + def initialize + configure({}) + end + + def configure(options) + @only_patterns = options[:only] ? Array(options[:only]) : nil + @ignore_patterns = _init_ignores(options[:ignore], options[:ignore!]) + end + + # Note: relative_path is temporarily expected to be a relative Pathname to + # make refactoring easier (ideally, it would take a string) + + # TODO: switch type and path places - and verify + def silenced?(relative_path, type) + path = relative_path.to_s + + if only_patterns && type == :file + return true unless only_patterns.any? { |pattern| path =~ pattern } + end + + ignore_patterns.any? { |pattern| path =~ pattern } + end + + private + + attr_reader :options + + def _init_ignores(ignores, overrides) + patterns = [] + unless overrides + patterns << DEFAULT_IGNORED_DIRECTORIES + patterns << DEFAULT_IGNORED_EXTENSIONS + end + + patterns << ignores + patterns << overrides + + patterns.compact.flatten + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer/controller.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer/controller.rb new file mode 100644 index 000000000000..d262ec8358d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer/controller.rb @@ -0,0 +1,48 @@ +module SassListen + class Silencer + class Controller + def initialize(silencer, default_options) + @silencer = silencer + + opts = default_options + + @prev_silencer_options = {} + rules = [:only, :ignore, :ignore!].map do |option| + [option, opts[option]] if opts.key? option + end + + _reconfigure_silencer(Hash[rules.compact]) + end + + def append_ignores(*regexps) + prev_ignores = Array(@prev_silencer_options[:ignore]) + _reconfigure_silencer(ignore: [prev_ignores + regexps]) + end + + def replace_with_bang_ignores(regexps) + _reconfigure_silencer(ignore!: regexps) + end + + def replace_with_only(regexps) + _reconfigure_silencer(only: regexps) + end + + private + + def _reconfigure_silencer(extra_options) + opts = extra_options.dup + opts = opts.map do |key, value| + [key, Array(value).flatten.compact] + end + opts = Hash[opts] + + if opts.key?(:ignore) && opts[:ignore].empty? + opts.delete(:ignore) + end + + @prev_silencer_options = opts + @silencer.configure(@prev_silencer_options.dup.freeze) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/version.rb b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/version.rb new file mode 100644 index 000000000000..05fa5d03a23b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sass-listen-4.0.0/lib/sass-listen/version.rb @@ -0,0 +1,3 @@ +module SassListen + VERSION = '4.0.0' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/Gemfile b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/Gemfile new file mode 100644 index 000000000000..b8427352271b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/Gemfile @@ -0,0 +1,8 @@ +source "http://rubygems.org" + +gemspec +gem 'rake' + +group :test do + gem "minitest" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/LICENSE.md b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/LICENSE.md new file mode 100644 index 000000000000..f07bf4ed792f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/LICENSE.md @@ -0,0 +1,20 @@ +Copyright (c) 2011 rick olson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/README.md b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/README.md new file mode 100644 index 000000000000..139fcaf7878b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/README.md @@ -0,0 +1,62 @@ +# Sawyer + +Sawyer is an experimental hypermedia agent for Ruby built on top of [Faraday][faraday]. + +[faraday]: https://github.com/lostisland/faraday + +## Installation + +Add this line to your application's Gemfile: + +```ruby +gem 'sawyer' +``` + +And then execute: + +```sh +bundle +``` + +Or install it yourself as: + +```sh +gem install sawyer +``` + +## Usage + +```ruby +require "sawyer" + +# Create a Sawyer agent +agent = Sawyer::Agent.new("https://api.github.com", + links_parser: Sawyer::LinkParsers::Simple.new) + +# Fetch the root of the API +root = agent.root.data + +# Access a resource directly +contributors = agent.call(:get, "repos/lostisland/sawyer/contributors").data + +# Load a hypermedia relation +top_contributor = contributors.first +followers = top_contributor.rels[:followers].get.data +``` + +For more information, check out the [documentation](http://www.rubydoc.info/gems/sawyer/). + +## Development + +After checking out the repo, run `script/test` to bootstrap the project and run the tests. +You can also run `script/console` for an interactive prompt that will allow you to experiment. + +To package the gem, run `script/package`. To release a new version, update the version number in [`lib/sawyer.rb`](lib/sawyer.rb), and then run `script/release`, which will create a git tag for the version, push git commits and tags, and push the .gem file to [rubygems.org](https://rubygems.org). + +## Contributing + +Check out the [contributing guide](CONTRIBUTING.md) for more information on contributing. + +## License + +The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/Rakefile b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/Rakefile new file mode 100644 index 000000000000..2285e1610394 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/Rakefile @@ -0,0 +1,12 @@ +require 'rubygems' +require 'rake' + +task :default => :test + +require 'rake/testtask' +Rake::TestTask.new(:test) do |test| + test.libs << 'lib' << 'test' + test.pattern = 'test/**/*_test.rb' + test.verbose = true +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer.rb b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer.rb new file mode 100644 index 000000000000..ab3bbb83291e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer.rb @@ -0,0 +1,17 @@ +module Sawyer + VERSION = "0.8.2" + + class Error < StandardError; end +end + +require 'set' + +%w( + resource + relation + response + serializer + agent + link_parsers/hal + link_parsers/simple +).each { |f| require File.expand_path("../sawyer/#{f}", __FILE__) } diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/agent.rb b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/agent.rb new file mode 100644 index 000000000000..7555fac33152 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/agent.rb @@ -0,0 +1,158 @@ +require 'faraday' +require 'addressable/template' + +module Sawyer + class Agent + NO_BODY = Set.new([:get, :head]) + + attr_accessor :links_parser + attr_accessor :allow_undefined_methods + + class << self + attr_writer :serializer + end + + def self.serializer + @serializer ||= Serializer.any_json + end + + def self.encode(data) + serializer.encode(data) + end + + def self.decode(data) + serializer.decode(data) + end + + # Agents handle making the requests, and passing responses to + # Sawyer::Response. + # + # endpoint - String URI of the API entry point. + # options - Hash of options. + # :allow_undefined_methods - Allow relations to call all the HTTP verbs, + # not just the ones defined. + # :faraday - Optional Faraday::Connection to use. + # :links_parser - Optional parser to parse link relations + # Defaults: Sawyer::LinkParsers::Hal.new + # :serializer - Optional serializer Class. Defaults to + # self.serializer_class. + # + # Yields the Faraday::Connection if a block is given. + def initialize(endpoint, options = nil) + @endpoint = endpoint + @conn = (options && options[:faraday]) || Faraday.new + @serializer = (options && options[:serializer]) || self.class.serializer + @links_parser = (options && options[:links_parser]) || Sawyer::LinkParsers::Hal.new + @allow_undefined_methods = (options && options[:allow_undefined_methods]) + @conn.url_prefix = @endpoint + yield @conn if block_given? + end + + # Public: Retains a reference to the root relations of the API. + # + # Returns a Sawyer::Relation::Map. + def rels + @rels ||= root.data._rels + end + + # Public: Retains a reference to the root response of the API. + # + # Returns a Sawyer::Response. + def root + @root ||= start + end + + # Public: Hits the root of the API to get the initial actions. + # + # Returns a Sawyer::Response. + def start + call :get, @endpoint + end + + # Makes a request through Faraday. + # + # method - The Symbol name of an HTTP method. + # url - The String URL to access. This can be relative to the Agent's + # endpoint. + # data - The Optional Hash or Resource body to be sent. :get or :head + # requests can have no body, so this can be the options Hash + # instead. + # options - Hash of option to configure the API request. + # :headers - Hash of API headers to set. + # :query - Hash of URL query params to set. + # + # Returns a Sawyer::Response. + def call(method, url, data = nil, options = nil) + if NO_BODY.include?(method) + options ||= data + data = nil + end + + options ||= {} + url = expand_url(url, options[:uri]) + started = nil + res = @conn.send method, url do |req| + if data + req.body = data.is_a?(String) ? data : encode_body(data) + end + if params = options[:query] + req.params.update params + end + if headers = options[:headers] + req.headers.update headers + end + started = Time.now + end + + Response.new self, res, :sawyer_started => started, :sawyer_ended => Time.now + end + + # Encodes an object to a string for the API request. + # + # data - The Hash or Resource that is being sent. + # + # Returns a String. + def encode_body(data) + @serializer.encode(data) + end + + # Decodes a String response body to a resource. + # + # str - The String body from the response. + # + # Returns an Object resource (Hash by default). + def decode_body(str) + @serializer.decode(str) + end + + def parse_links(data) + @links_parser.parse(data) + end + + def expand_url(url, options = nil) + tpl = url.respond_to?(:expand) ? url : Addressable::Template.new(url.to_s) + tpl.expand(options || {}).to_s + end + + def allow_undefined_methods? + !!@allow_undefined_methods + end + + def inspect + %(<#{self.class} #{@endpoint}>) + end + + # private + def to_yaml_properties + [:@endpoint] + end + + def marshal_dump + [@endpoint] + end + + def marshal_load(dumped) + @endpoint = *dumped.shift(1) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/link_parsers/hal.rb b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/link_parsers/hal.rb new file mode 100644 index 000000000000..219e6730e08b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/link_parsers/hal.rb @@ -0,0 +1,15 @@ +module Sawyer + module LinkParsers + + class Hal + + def parse(data) + links = data.delete(:_links) + + return data, links + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/link_parsers/simple.rb b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/link_parsers/simple.rb new file mode 100644 index 000000000000..4648128db0df --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/link_parsers/simple.rb @@ -0,0 +1,29 @@ +module Sawyer + module LinkParsers + + class Simple + + LINK_REGEX = /_?url$/ + + + # Public: Parses simple *_url style links on resources + # + # data - Hash of resource data + # + # Returns a Hash of data with separate links Hash + def parse(data) + + links = {} + inline_links = data.keys.select {|k| k.to_s[LINK_REGEX] } + inline_links.each do |key| + rel_name = key.to_s == 'url' ? 'self' : key.to_s.gsub(LINK_REGEX, '') + links[rel_name.to_sym] = data[key] + end + + return data, links + end + + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/relation.rb b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/relation.rb new file mode 100644 index 000000000000..e33e87954294 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/relation.rb @@ -0,0 +1,272 @@ +module Sawyer + class Relation + class Map + # Tracks the available next actions for a resource, and + # issues requests for them. + def initialize + @map = {} + end + + # Adds a Relation to the map. + # + # rel - A Relation. + # + # Returns nothing. + def <<(rel) + @map[rel.name] = rel if rel + end + + # Gets the raw Relation by its name. + # + # key - The Symbol name of the Relation. + # + # Returns a Relation. + def [](key) + @map[key.to_sym] + end + + # Gets the number of mapped Relations. + # + # Returns an Integer. + def size + @map.size + end + + # Gets a list of the Relation names. + # + # Returns an Array of Symbols in no specific order. + def keys + @map.keys + end + + def to_hash + pairs = @map.map do |k, v| + [(k.to_s + "_url").to_sym, v.href] + end + Hash[pairs] + end + alias :to_h :to_hash + + def inspect + hash = to_hash + hash.respond_to?(:pretty_inspect) ? hash.pretty_inspect : hash.inspect + end + end + + attr_reader :agent, + :name, + :href_template, + :method, + :available_methods + + # Public: Builds an index of Relations from the value of a `_links` + # property in a resource. :get is the default method. Any links with + # multiple specified methods will get multiple relations created. + # + # index - The Hash mapping Relation names to the Hash Relation + # options. + # rels - A Relation::Map to store the Relations. + # + # Returns a Relation::Map + def self.from_links(agent, index, rels = Map.new) + if index.is_a?(Array) + raise ArgumentError, "Links must be a hash of rel => {_href => '...'}: #{index.inspect}" + end + + index.each do |name, options| + rels << from_link(agent, name, options) + end if index + + rels + end + + # Public: Builds a single Relation from the given options. These are + # usually taken from a `_links` property in a resource. + # + # agent - The Sawyer::Agent that made the request. + # name - The Symbol name of the Relation. + # options - A Hash containing the other Relation properties. + # :href - The String URL of the next action's location. + # :method - The optional String HTTP method. + # + # Returns a Relation. + def self.from_link(agent, name, options) + case options + when Hash + new agent, name, options[:href], options[:method] + when String + new agent, name, options + end + end + + # A Relation represents an available next action for a resource. + # + # agent - The Sawyer::Agent that made the request. + # name - The Symbol name of the relation. + # href - The String URL of the location of the next action. + # method - The Symbol HTTP method. Default: :get + def initialize(agent, name, href, method = nil) + @agent = agent + @name = name.to_sym + @href = href + @href_template = Addressable::Template.new(href.to_s) + + methods = nil + + if method.is_a? String + if method.size.zero? + method = nil + else + method.downcase! + methods = method.split(',').map! do |m| + m.strip! + m.to_sym + end + method = methods.first + end + end + + @method = (method || :get).to_sym + @available_methods = Set.new methods || [@method] + end + + # Public: Makes an API request with the curent Relation using HEAD. + # + # data - The Optional Hash or Resource body to be sent. :get or :head + # requests can have no body, so this can be the options Hash + # instead. + # options - Hash of option to configure the API request. + # :headers - Hash of API headers to set. + # :query - Hash of URL query params to set. + # :method - Symbol HTTP method. + # + # Returns a Sawyer::Response. + def head(options = nil) + options ||= {} + options[:method] = :head + call options + end + + # Public: Makes an API request with the curent Relation using GET. + # + # data - The Optional Hash or Resource body to be sent. :get or :head + # requests can have no body, so this can be the options Hash + # instead. + # options - Hash of option to configure the API request. + # :headers - Hash of API headers to set. + # :query - Hash of URL query params to set. + # :method - Symbol HTTP method. + # + # Returns a Sawyer::Response. + def get(options = nil) + options ||= {} + options[:method] = :get + call options + end + + # Public: Makes an API request with the curent Relation using POST. + # + # data - The Optional Hash or Resource body to be sent. + # options - Hash of option to configure the API request. + # :headers - Hash of API headers to set. + # :query - Hash of URL query params to set. + # :method - Symbol HTTP method. + # + # Returns a Sawyer::Response. + def post(data = nil, options = nil) + options ||= {} + options[:method] = :post + call data, options + end + + # Public: Makes an API request with the curent Relation using PUT. + # + # data - The Optional Hash or Resource body to be sent. + # options - Hash of option to configure the API request. + # :headers - Hash of API headers to set. + # :query - Hash of URL query params to set. + # :method - Symbol HTTP method. + # + # Returns a Sawyer::Response. + def put(data = nil, options = nil) + options ||= {} + options[:method] = :put + call data, options + end + + # Public: Makes an API request with the curent Relation using PATCH. + # + # data - The Optional Hash or Resource body to be sent. + # options - Hash of option to configure the API request. + # :headers - Hash of API headers to set. + # :query - Hash of URL query params to set. + # :method - Symbol HTTP method. + # + # Returns a Sawyer::Response. + def patch(data = nil, options = nil) + options ||= {} + options[:method] = :patch + call data, options + end + + # Public: Makes an API request with the curent Relation using DELETE. + # + # data - The Optional Hash or Resource body to be sent. + # options - Hash of option to configure the API request. + # :headers - Hash of API headers to set. + # :query - Hash of URL query params to set. + # :method - Symbol HTTP method. + # + # Returns a Sawyer::Response. + def delete(data = nil, options = nil) + options ||= {} + options[:method] = :delete + call data, options + end + + # Public: Makes an API request with the curent Relation using OPTIONS. + # + # data - The Optional Hash or Resource body to be sent. + # options - Hash of option to configure the API request. + # :headers - Hash of API headers to set. + # :query - Hash of URL query params to set. + # :method - Symbol HTTP method. + # + # Returns a Sawyer::Response. + def options(data = nil, opt = nil) + opt ||= {} + opt[:method] = :options + call data, opt + end + + def href(options = nil) + return @href if @href_template.nil? + @href_template.expand(options || {}).to_s + end + + # Public: Makes an API request with the curent Relation. + # + # data - The Optional Hash or Resource body to be sent. :get or :head + # requests can have no body, so this can be the options Hash + # instead. + # options - Hash of option to configure the API request. + # :headers - Hash of API headers to set. + # :query - Hash of URL query params to set. + # :method - Symbol HTTP method. + # + # Raises ArgumentError if the :method value is not in @available_methods. + # Returns a Sawyer::Response. + def call(data = nil, options = nil) + m = options && options[:method] + if m && !@agent.allow_undefined_methods? && !@available_methods.include?(m == :head ? :get : m) + raise ArgumentError, "method #{m.inspect} is not available: #{@available_methods.to_a.inspect}" + end + + @agent.call m || @method, @href_template, data, options + end + + def inspect + %(#<#{self.class}: #{@name}: #{@method} #{@href_template}>) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/resource.rb b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/resource.rb new file mode 100644 index 000000000000..c25d52d0124c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/resource.rb @@ -0,0 +1,155 @@ +module Sawyer + class Resource + SPECIAL_METHODS = Set.new(%w(agent rels fields)) + attr_reader :_agent, :_rels, :_fields + attr_reader :attrs + include Enumerable + + # Initializes a Resource with the given data. + # + # agent - The Sawyer::Agent that made the API request. + # data - Hash of key/value properties. + def initialize(agent, data = {}) + @_agent = agent + data, links = agent.parse_links(data) + @_rels = Relation.from_links(agent, links) + @_fields = Set.new + @_metaclass = (class << self; self; end) + @attrs = {} + data.each do |key, value| + @_fields << key + @attrs[key.to_sym] = process_value(value) + end + @_metaclass.send(:attr_accessor, *data.keys) + end + + # Processes an individual value of this resource. Hashes get exploded + # into another Resource, and Arrays get their values processed too. + # + # value - An Object value of a Resource's data. + # + # Returns an Object to set as the value of a Resource key. + def process_value(value) + case value + when Hash then self.class.new(@_agent, value) + when Array then value.map { |v| process_value(v) } + else value + end + end + + # Checks to see if the given key is in this resource. + # + # key - A Symbol key. + # + # Returns true if the key exists, or false. + def key?(key) + @_fields.include? key + end + + # Allow fields to be retrieved via Hash notation + # + # method - key name + # + # Returns the value from attrs if exists + def [](method) + send(method.to_sym) + rescue NoMethodError + nil + end + + # Allow fields to be set via Hash notation + # + # method - key name + # value - value to set for the attr key + # + # Returns - value + def []=(method, value) + send("#{method}=", value) + rescue NoMethodError + nil + end + + ATTR_SETTER = '='.freeze + ATTR_PREDICATE = '?'.freeze + + # Provides access to a resource's attributes. + def method_missing(method, *args) + attr_name, suffix = method.to_s.scan(/([a-z0-9\_]+)(\?|\=)?$/i).first + if suffix == ATTR_SETTER + @_metaclass.send(:attr_accessor, attr_name) + @_fields << attr_name.to_sym + send(method, args.first) + elsif attr_name && @_fields.include?(attr_name.to_sym) + value = @attrs[attr_name.to_sym] + case suffix + when nil + @_metaclass.send(:attr_accessor, attr_name) + value + when ATTR_PREDICATE then !!value + end + elsif suffix.nil? && SPECIAL_METHODS.include?(attr_name) + instance_variable_get "@_#{attr_name}" + elsif attr_name && !@_fields.include?(attr_name.to_sym) + nil + else + super + end + end + + # Wire up accessor methods to pull from attrs + def self.attr_accessor(*attrs) + attrs.each do |attribute| + class_eval do + define_method attribute do + @attrs[attribute.to_sym] + end + + define_method "#{attribute}=" do |value| + @attrs[attribute.to_sym] = value + end + + define_method "#{attribute}?" do + !!@attrs[attribute.to_sym] + end + end + end + end + + def inspect + to_attrs.respond_to?(:pretty_inspect) ? to_attrs.pretty_inspect : to_attrs.inspect + end + + def each(&block) + @attrs.each(&block) + end + + # private + def to_yaml_properties + [:@attrs, :@_fields, :@_rels] + end + + def to_attrs + hash = self.attrs.clone + hash.keys.each do |k| + if hash[k].is_a?(Sawyer::Resource) + hash[k] = hash[k].to_attrs + elsif hash[k].is_a?(Array) && hash[k].all?{|el| el.is_a?(Sawyer::Resource)} + hash[k] = hash[k].collect{|el| el.to_attrs} + end + end + hash + end + + alias to_hash to_attrs + alias to_h to_attrs + + def marshal_dump + [@attrs, @_fields, @_rels] + end + + def marshal_load(dumped) + @attrs, @_fields, @_rels = *dumped.shift(3) + @_metaclass = (class << self; self; end) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/response.rb b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/response.rb new file mode 100644 index 000000000000..684aca1d454b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/response.rb @@ -0,0 +1,72 @@ +module Sawyer + class Response + attr_reader :agent, + :status, + :headers, + :env, + :body, + :rels + + # Builds a Response after a completed request. + # + # agent - The Sawyer::Agent that is managing the API connection. + # res - A Faraday::Response. + def initialize(agent, res, options = {}) + @agent = agent + @status = res.status + @headers = res.headers + @env = res.env + @body = res.body + @rels = process_rels + @started = options[:sawyer_started] + @ended = options[:sawyer_ended] + end + + def data + @data ||= begin + return(body) unless (headers[:content_type] =~ /json|msgpack/) + process_data(agent.decode_body(body)) + end + end + + # Turns parsed contents from an API response into a Resource or + # collection of Resources. + # + # data - Either an Array or Hash parsed from JSON. + # + # Returns either a Resource or Array of Resources. + def process_data(data) + case data + when Hash then Resource.new(agent, data) + when Array then data.map { |hash| process_data(hash) } + when nil then nil + else data + end + end + + # Finds link relations from 'Link' response header + # + # Returns an array of Relations + def process_rels + links = ( @headers["Link"] || "" ).split(', ').map do |link| + href, name = link.match(/<(.*?)>; rel="(\w+)"/).captures + + [name.to_sym, Relation.from_link(@agent, name, :href => href)] + end + + Hash[*links.flatten] + end + + def timing + @timing ||= @ended - @started + end + + def time + @ended + end + + def inspect + %(#<#{self.class}: #{@status} @rels=#{@rels.inspect} @data=#{data.inspect}>) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/serializer.rb b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/serializer.rb new file mode 100644 index 000000000000..b711de4529b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/lib/sawyer/serializer.rb @@ -0,0 +1,129 @@ +require 'date' +require 'time' + +module Sawyer + class Serializer + def self.any_json + yajl || multi_json || json || begin + raise RuntimeError, "Sawyer requires a JSON gem: yajl, multi_json, or json" + end + end + + def self.yajl + require 'yajl' + new(Yajl) + rescue LoadError + end + + def self.json + require 'json' + new(JSON) + rescue LoadError + end + + def self.multi_json + require 'multi_json' + new(MultiJson) + rescue LoadError + end + + def self.message_pack + require 'msgpack' + new(MessagePack, :pack, :unpack) + rescue LoadError + end + + # Public: Wraps a serialization format for Sawyer. Nested objects are + # prepared for serialization (such as changing Times to ISO 8601 Strings). + # Any serialization format that responds to #dump and #load will work. + def initialize(format, dump_method_name = nil, load_method_name = nil) + @format = format + @dump = @format.method(dump_method_name || :dump) + @load = @format.method(load_method_name || :load) + end + + # Public: Encodes an Object (usually a Hash or Array of Hashes). + # + # data - Object to be encoded. + # + # Returns an encoded String. + def encode(data) + @dump.call(encode_object(data)) + end + + alias dump encode + + # Public: Decodes a String into an Object (usually a Hash or Array of + # Hashes). + # + # data - An encoded String. + # + # Returns a decoded Object. + def decode(data) + return nil if data.nil? || data.strip.empty? + decode_object(@load.call(data)) + end + + alias load decode + + def encode_object(data) + case data + when Hash then encode_hash(data) + when Array then data.map { |o| encode_object(o) } + else data + end + end + + def encode_hash(hash) + hash.keys.each do |key| + case value = hash[key] + when Date then hash[key] = value.to_time.utc.xmlschema + when Time then hash[key] = value.utc.xmlschema + when Hash then hash[key] = encode_hash(value) + end + end + hash + end + + def decode_object(data) + case data + when Hash then decode_hash(data) + when Array then data.map { |o| decode_object(o) } + else data + end + end + + def decode_hash(hash) + hash.keys.each do |key| + hash[key.to_sym] = decode_hash_value(key, hash.delete(key)) + end + hash + end + + def decode_hash_value(key, value) + if time_field?(key, value) + if value.is_a?(String) + begin + Time.parse(value) + rescue ArgumentError + value + end + elsif value.is_a?(Integer) || value.is_a?(Float) + Time.at(value) + else + value + end + elsif value.is_a?(Hash) + decode_hash(value) + elsif value.is_a?(Array) + value.map { |o| decode_hash_value(key, o) } + else + value + end + end + + def time_field?(key, value) + value && (key =~ /_(at|on)\z/ || key =~ /(\A|_)date\z/) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/sawyer.gemspec b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/sawyer.gemspec new file mode 100644 index 000000000000..1423dd0a925b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/sawyer.gemspec @@ -0,0 +1,31 @@ +lib = "sawyer" +lib_file = File.expand_path("../lib/#{lib}.rb", __FILE__) +File.read(lib_file) =~ /\bVERSION\s*=\s*["'](.+?)["']/ +version = $1 + +Gem::Specification.new do |spec| + spec.specification_version = 2 if spec.respond_to? :specification_version= + spec.required_rubygems_version = Gem::Requirement.new(">= 1.3.5") if spec.respond_to? :required_rubygems_version= + + spec.name = lib + spec.version = version + + spec.summary = "Secret User Agent of HTTP" + + spec.authors = ["Rick Olson", "Wynn Netherland"] + spec.email = 'technoweenie@gmail.com' + spec.homepage = 'https://github.com/lostisland/sawyer' + spec.licenses = ['MIT'] + + spec.add_dependency 'faraday', ['> 0.8', '< 2.0'] + spec.add_dependency 'addressable', ['>= 2.3.5'] + + spec.files = %w(Gemfile LICENSE.md README.md Rakefile) + spec.files << "#{lib}.gemspec" + spec.files += Dir.glob("lib/**/*.rb") + spec.files += Dir.glob("script/*") + + dev_null = File.exist?('/dev/null') ? '/dev/null' : 'NUL' + git_files = `git ls-files -z 2>#{dev_null}` + spec.files &= git_files.split("\0") if $?.success? +end diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/bootstrap b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/bootstrap new file mode 100644 index 000000000000..6479ada376a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/bootstrap @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e + +bundle install --quiet "$@" diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/console b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/console new file mode 100644 index 000000000000..8c284706834c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/console @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Usage: script/console +# Starts an IRB console with this library loaded. + +gemspec="$(ls *.gemspec | head -1)" + +exec bundle exec irb -r "${gemspec%.*}" + diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/package b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/package new file mode 100644 index 000000000000..3f59b50373cf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/package @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Usage: script/gem +# Updates the gemspec and builds a new gem in the pkg directory. + +mkdir -p pkg +gem build *.gemspec +mv *.gem pkg + diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/release b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/release new file mode 100644 index 000000000000..a80bc5aacac0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/release @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# Usage: script/release +# Build the package, tag a commit, push it to origin, and then release the +# package publicly. + +set -e + +version="$(script/package | grep Version: | awk '{print $2}')" +[ -n "$version" ] || exit 1 + +git commit --allow-empty -a -m "Release $version" +git tag "v$version" +git push origin +git push origin "v$version" +gem push pkg/*-${version}.gem + diff --git a/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/test b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/test new file mode 100644 index 000000000000..fa00f05db2e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/sawyer-0.8.2/script/test @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# Usage: script/test +# Runs the library's test suite. + +script/bootstrap +bundle exec rake test diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/.gitignore b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/.gitignore new file mode 100644 index 000000000000..ccc26b038888 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/.gitignore @@ -0,0 +1,11 @@ +# Bundler +.bundle +pkg/* +Gemfile.lock + +.rvmrc +.rbenv-version +doc +spec/*.yml + +coverage diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/.travis.yml new file mode 100644 index 000000000000..f98cc66a5c7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/.travis.yml @@ -0,0 +1,13 @@ +language: ruby +cache: bundler +sudo: false +before_install: + - gem install bundler +rvm: + - 1.9.3 + - 2.0 + - 2.1 + - 2.2 + - 2.3 + - jruby +script: 'bundle exec rspec spec/idn_spec.rb' diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/Gemfile b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/Gemfile new file mode 100644 index 000000000000..25d531fbcd7a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/Gemfile @@ -0,0 +1,7 @@ +source 'https://rubygems.org' + +gem 'simplecov', :require => false, :group => :test +gem 'codecov', :require => false, :group => :test +gem 'rspec', :require => false, :group => :test + +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/LICENCE b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/LICENCE new file mode 100644 index 000000000000..b9c29208d3fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/LICENCE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2011-2017 Morten Møller Riis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/README.rdoc b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/README.rdoc new file mode 100644 index 000000000000..d6f87383ee03 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/README.rdoc @@ -0,0 +1,41 @@ +== SimpleIDN + +{<img src="https://travis-ci.org/mmriis/simpleidn.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/mmriis/simpleidn] + +This gem allows easy conversion from punycode ACE strings to unicode UTF-8 strings and visa versa. + +The implementation is heavily based on the RFC3492 C example implementation but simplified since it does not preserve case. + +This gem works with Ruby 1.9.3, 2.0, 2.1, 2.2. + +* http://www.whatastruggle.com + +== Installation + + [sudo] gem install simpleidn + ++sudo+ is optional depending on your setup. + +In your Ruby script you can now. + + require 'rubygems' + require 'simpleidn' + + SimpleIDN.to_unicode("xn--mllerriis-l8a.com") + => "møllerriis.com" + + SimpleIDN.to_ascii("møllerriis.com") + => "xn--mllerriis-l8a.com" + +== Testing / RSpec + +In order to run the test suite you must have <tt>rspec</tt> installed. + +The test suite has been copied from the IDN gem and uses examples from JOSEFSSON test vectors, taken from DRAFT-JOSEFSSON-IDN-TEST-VECTORS-00: +http://www.gnu.org/software/libidn/draft-josefsson-idn-test-vectors.html + +== Known issues + +Does not preserve uppercase. So if, for some reason, you use uppercase characters (eg. Ø instead of ø), please take note of that. + +Please report any issues! diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/Rakefile b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/Rakefile new file mode 100644 index 000000000000..b7e9ed549be3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/Rakefile @@ -0,0 +1,6 @@ +require "bundler/gem_tasks" +require "rspec/core/rake_task" + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/lib/simpleidn.rb b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/lib/simpleidn.rb new file mode 100644 index 000000000000..86cda902b5b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/lib/simpleidn.rb @@ -0,0 +1,284 @@ +require 'simpleidn/version' +require 'simpleidn/uts46mapping' +require 'unf' + +module SimpleIDN + # The ConversionError is raised when an error occurs during a + # Punycode <-> Unicode conversion. + class ConversionError < RangeError + end + + module Punycode + INITIAL_N = 0x80 + INITIAL_BIAS = 72 + DELIMITER = 0x2D + BASE = 36 + DAMP = 700 + TMIN = 1 + TMAX = 26 + SKEW = 38 + MAXINT = 0x7FFFFFFF + ASCII_MAX = 0x7F + + EMPTY = ''.encode(Encoding::UTF_8).freeze + + module_function + + # decode_digit(cp) returns the numeric value of a basic code + # point (for use in representing integers) in the range 0 to + # base-1, or base if cp is does not represent a value. + def decode_digit(cp) + cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : BASE + end + + # encode_digit(d) returns the basic code point whose value + # (when used for representing integers) is d, which needs to be in + # the range 0 to base-1. + def encode_digit(d) + d + 22 + 75 * (d < 26 ? 1 : 0) + # 0..25 map to ASCII a..z + # 26..35 map to ASCII 0..9 + end + + # Bias adaptation function + def adapt(delta, numpoints, firsttime) + delta = firsttime ? (delta / DAMP) : (delta >> 1) + delta += (delta / numpoints) + + k = 0 + while delta > (((BASE - TMIN) * TMAX) / 2) + delta /= BASE - TMIN + k += BASE + end + k + (BASE - TMIN + 1) * delta / (delta + SKEW) + end + + # Main decode + def decode(input) + input_encoding = input.encoding + input = input.encode(Encoding::UTF_8).codepoints.to_a + output = [] + + # Initialize the state: + n = INITIAL_N + i = 0 + bias = INITIAL_BIAS + + # Handle the basic code points: Let basic be the number of input code + # points before the last delimiter, or 0 if there is none, then + # copy the first basic code points to the output. + basic = input.rindex(DELIMITER) || 0 + + input[0, basic].each do |char| + raise(ConversionError, "Illegal input >= 0x80") if char > ASCII_MAX + output << char + end + + # Main decoding loop: Start just after the last delimiter if any + # basic code points were copied; start at the beginning otherwise. + + ic = basic > 0 ? basic + 1 : 0 + while ic < input.length + # ic is the index of the next character to be consumed, + + # Decode a generalized variable-length integer into delta, + # which gets added to i. The overflow checking is easier + # if we increase i as we go, then subtract off its starting + # value at the end to obtain delta. + oldi = i + w = 1 + k = BASE + loop do + raise(ConversionError, "punycode_bad_input(1)") if ic >= input.length + + digit = decode_digit(input[ic]) + ic += 1 + + raise(ConversionError, "punycode_bad_input(2)") if digit >= BASE + + raise(ConversionError, "punycode_overflow(1)") if digit > (MAXINT - i) / w + + i += digit * w + t = k <= bias ? TMIN : k >= bias + TMAX ? TMAX : k - bias + break if digit < t + raise(ConversionError, "punycode_overflow(2)") if w > MAXINT / (BASE - t) + + w *= BASE - t + k += BASE + end + + out = output.length + 1 + bias = adapt(i - oldi, out, oldi == 0) + + # i was supposed to wrap around from out to 0, + # incrementing n each time, so we'll fix that now: + raise(ConversionError, "punycode_overflow(3)") if (i / out) > MAXINT - n + + n += (i / out) + i %= out + + # Insert n at position i of the output: + output.insert(i, n) + i += 1 + end + + output.collect {|c| c.chr(Encoding::UTF_8)}.join(EMPTY).encode(input_encoding) + end + + # Main encode function + def encode(input) + input_encoding = input.encoding + input = input.encode(Encoding::UTF_8).codepoints.to_a + output = [] + + # Initialize the state: + n = INITIAL_N + delta = 0 + bias = INITIAL_BIAS + + # Handle the basic code points: + output = input.select { |char| char <= ASCII_MAX } + + h = b = output.length + + # h is the number of code points that have been handled, b is the + # number of basic code points + + output << DELIMITER if b > 0 + + # Main encoding loop: + while h < input.length + # All non-basic code points < n have been + # handled already. Find the next larger one: + + m = MAXINT + + input.each do |char| + m = char if char >= n && char < m + end + + # Increase delta enough to advance the decoder's + # <n,i> state to <m,0>, but guard against overflow: + + raise(ConversionError, "punycode_overflow (1)") if m - n > ((MAXINT - delta) / (h + 1)).floor + + delta += (m - n) * (h + 1) + n = m + + input.each_with_index do |char, _| + if char < n + delta += 1 + raise(ConversionError, "punycode_overflow(2)") if delta > MAXINT + end + + next unless char == n + + # Represent delta as a generalized variable-length integer: + q = delta + k = BASE + loop do + t = k <= bias ? TMIN : k >= bias + TMAX ? TMAX : k - bias + break if q < t + output << encode_digit(t + (q - t) % (BASE - t)) + q = ((q - t) / (BASE - t)).floor + k += BASE + end + output << encode_digit(q) + bias = adapt(delta, h + 1, h == b) + delta = 0 + h += 1 + end + + delta += 1 + n += 1 + end + output.collect {|c| c.chr(Encoding::UTF_8)}.join(EMPTY).encode(input_encoding) + end + end + + ACE_PREFIX = 'xn--'.encode(Encoding::UTF_8).freeze + ASCII_MAX = 0x7F + DOT = 0x2E.chr(Encoding::UTF_8).freeze + EMPTY = ''.encode(Encoding::UTF_8).freeze + LABEL_SEPERATOR_RE = /[\u002e\uff0e\u3002\uff61]/ + + unless defined?(UTS64MAPPING) + # Define a basic uppercase to lowercase mapping for ASCII a..z + UTS64MAPPING = Hash[(65..90).map { |n| [n, n + 32] }].freeze + end + + # See UTS46 Table 1 + TRANSITIONAL = { + 0x00DF => [0x0073, 0x0073], + 0x03C2 => 0x03C3, + 0x200C => [], + 0x200D => [] + }.freeze + + module_function + + # Applies UTS46 mapping to a Unicode string + # Returns a UTF-8 string in Normalization Form C (NFC) + def uts46map(str, transitional = false) + mapped = str.codepoints.map { |cp| UTS64MAPPING.fetch(cp, cp) } + mapped = mapped.map { |cp| TRANSITIONAL.fetch(cp, cp) } if transitional + mapped = mapped.flatten.map { |cp| cp.chr(Encoding::UTF_8) }.join(EMPTY) + mapped.to_nfc + end + + # Converts a UTF-8 unicode string to a punycode ACE string. + # == Example + # SimpleIDN.to_ascii("møllerriis.com") + # => "xn--mllerriis-l8a.com" + def to_ascii(domain, transitional = false) + return nil if domain.nil? + mapped_domain = uts46map(domain.encode(Encoding::UTF_8), transitional) + domain_array = mapped_domain.split(LABEL_SEPERATOR_RE, -1) rescue [] + out = [] + content = false + domain_array.each do |s| + # Skip leading empty labels + next if s.empty? && !content + content = true + + out << (s.codepoints.any? { |cp| cp > ASCII_MAX } ? ACE_PREFIX + Punycode.encode(s) : s) + end + + # If all we had were dots; return "." + out = [DOT] if out.empty? && !mapped_domain.empty? + + out.join(DOT).encode(domain.encoding) + end + + # Converts a punycode ACE string to a UTF-8 unicode string. + # == Example + # SimpleIDN.to_unicode("xn--mllerriis-l8a.com") + # => "møllerriis.com" + def to_unicode(domain, transitional = false) + return nil if domain.nil? + mapped_domain = uts46map(domain.encode(Encoding::UTF_8), transitional) + domain_array = mapped_domain.split(LABEL_SEPERATOR_RE, -1) rescue [] + out = [] + content = false + domain_array.each do |s| + # Skip leading empty labels + next if s.empty? && !content + content = true + + out << (s.start_with?(ACE_PREFIX) ? Punycode.decode(s[ACE_PREFIX.length..-1]) : s) + end + + # If all we had were dots; return "." + out = [DOT] if out.empty? && !mapped_domain.empty? + + out = out.join(DOT) + # Try to convert to the input encoding, but don't error on failure + # Given that the input is plain 7-bit ASCII only, converting back + # frequently fails. We will try to allow UTF-16 and Unicode encodings + begin + out.encode!(domain.encoding) + rescue Encoding::UndefinedConversionError + end + out + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/lib/simpleidn/uts46mapping.rb b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/lib/simpleidn/uts46mapping.rb new file mode 100644 index 000000000000..70ea253e2cec --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/lib/simpleidn/uts46mapping.rb @@ -0,0 +1,6261 @@ +# encoding: UTF-8 + +# IdnaMappingTable-9.0.0.txt +# Date: 2016-06-16, 13:35:01 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode IDNA Compatible Preprocessing (UTS #46) +# For documentation, see http://www.unicode.org/reports/tr46/ +# Total code points: 1114112 + +module SimpleIDN + UTS64MAPPING = { + 65 => 97, + 66 => 98, + 67 => 99, + 68 => 100, + 69 => 101, + 70 => 102, + 71 => 103, + 72 => 104, + 73 => 105, + 74 => 106, + 75 => 107, + 76 => 108, + 77 => 109, + 78 => 110, + 79 => 111, + 80 => 112, + 81 => 113, + 82 => 114, + 83 => 115, + 84 => 116, + 85 => 117, + 86 => 118, + 87 => 119, + 88 => 120, + 89 => 121, + 90 => 122, + 160 => 32, + 168 => [32, 776], + 170 => 97, + 173 => [], + 175 => [32, 772], + 178 => 50, + 179 => 51, + 180 => [32, 769], + 181 => 956, + 184 => [32, 807], + 185 => 49, + 186 => 111, + 188 => [49, 8260, 52], + 189 => [49, 8260, 50], + 190 => [51, 8260, 52], + 192 => 224, + 193 => 225, + 194 => 226, + 195 => 227, + 196 => 228, + 197 => 229, + 198 => 230, + 199 => 231, + 200 => 232, + 201 => 233, + 202 => 234, + 203 => 235, + 204 => 236, + 205 => 237, + 206 => 238, + 207 => 239, + 208 => 240, + 209 => 241, + 210 => 242, + 211 => 243, + 212 => 244, + 213 => 245, + 214 => 246, + 216 => 248, + 217 => 249, + 218 => 250, + 219 => 251, + 220 => 252, + 221 => 253, + 222 => 254, + 256 => 257, + 258 => 259, + 260 => 261, + 262 => 263, + 264 => 265, + 266 => 267, + 268 => 269, + 270 => 271, + 272 => 273, + 274 => 275, + 276 => 277, + 278 => 279, + 280 => 281, + 282 => 283, + 284 => 285, + 286 => 287, + 288 => 289, + 290 => 291, + 292 => 293, + 294 => 295, + 296 => 297, + 298 => 299, + 300 => 301, + 302 => 303, + 304 => [105, 775], + 306 => [105, 106], + 307 => [105, 106], + 308 => 309, + 310 => 311, + 313 => 314, + 315 => 316, + 317 => 318, + 319 => [108, 183], + 320 => [108, 183], + 321 => 322, + 323 => 324, + 325 => 326, + 327 => 328, + 329 => [700, 110], + 330 => 331, + 332 => 333, + 334 => 335, + 336 => 337, + 338 => 339, + 340 => 341, + 342 => 343, + 344 => 345, + 346 => 347, + 348 => 349, + 350 => 351, + 352 => 353, + 354 => 355, + 356 => 357, + 358 => 359, + 360 => 361, + 362 => 363, + 364 => 365, + 366 => 367, + 368 => 369, + 370 => 371, + 372 => 373, + 374 => 375, + 376 => 255, + 377 => 378, + 379 => 380, + 381 => 382, + 383 => 115, + 385 => 595, + 386 => 387, + 388 => 389, + 390 => 596, + 391 => 392, + 393 => 598, + 394 => 599, + 395 => 396, + 398 => 477, + 399 => 601, + 400 => 603, + 401 => 402, + 403 => 608, + 404 => 611, + 406 => 617, + 407 => 616, + 408 => 409, + 412 => 623, + 413 => 626, + 415 => 629, + 416 => 417, + 418 => 419, + 420 => 421, + 422 => 640, + 423 => 424, + 425 => 643, + 428 => 429, + 430 => 648, + 431 => 432, + 433 => 650, + 434 => 651, + 435 => 436, + 437 => 438, + 439 => 658, + 440 => 441, + 444 => 445, + 452 => [100, 382], + 453 => [100, 382], + 454 => [100, 382], + 455 => [108, 106], + 456 => [108, 106], + 457 => [108, 106], + 458 => [110, 106], + 459 => [110, 106], + 460 => [110, 106], + 461 => 462, + 463 => 464, + 465 => 466, + 467 => 468, + 469 => 470, + 471 => 472, + 473 => 474, + 475 => 476, + 478 => 479, + 480 => 481, + 482 => 483, + 484 => 485, + 486 => 487, + 488 => 489, + 490 => 491, + 492 => 493, + 494 => 495, + 497 => [100, 122], + 498 => [100, 122], + 499 => [100, 122], + 500 => 501, + 502 => 405, + 503 => 447, + 504 => 505, + 506 => 507, + 508 => 509, + 510 => 511, + 512 => 513, + 514 => 515, + 516 => 517, + 518 => 519, + 520 => 521, + 522 => 523, + 524 => 525, + 526 => 527, + 528 => 529, + 530 => 531, + 532 => 533, + 534 => 535, + 536 => 537, + 538 => 539, + 540 => 541, + 542 => 543, + 544 => 414, + 546 => 547, + 548 => 549, + 550 => 551, + 552 => 553, + 554 => 555, + 556 => 557, + 558 => 559, + 560 => 561, + 562 => 563, + 570 => 11365, + 571 => 572, + 573 => 410, + 574 => 11366, + 577 => 578, + 579 => 384, + 580 => 649, + 581 => 652, + 582 => 583, + 584 => 585, + 586 => 587, + 588 => 589, + 590 => 591, + 688 => 104, + 689 => 614, + 690 => 106, + 691 => 114, + 692 => 633, + 693 => 635, + 694 => 641, + 695 => 119, + 696 => 121, + 728 => [32, 774], + 729 => [32, 775], + 730 => [32, 778], + 731 => [32, 808], + 732 => [32, 771], + 733 => [32, 779], + 736 => 611, + 737 => 108, + 738 => 115, + 739 => 120, + 740 => 661, + 832 => 768, + 833 => 769, + 835 => 787, + 836 => [776, 769], + 837 => 953, + 847 => [], + 880 => 881, + 882 => 883, + 884 => 697, + 886 => 887, + 890 => [32, 953], + 894 => 59, + 895 => 1011, + 900 => [32, 769], + 901 => [32, 776, 769], + 902 => 940, + 903 => 183, + 904 => 941, + 905 => 942, + 906 => 943, + 908 => 972, + 910 => 973, + 911 => 974, + 913 => 945, + 914 => 946, + 915 => 947, + 916 => 948, + 917 => 949, + 918 => 950, + 919 => 951, + 920 => 952, + 921 => 953, + 922 => 954, + 923 => 955, + 924 => 956, + 925 => 957, + 926 => 958, + 927 => 959, + 928 => 960, + 929 => 961, + 931 => 963, + 932 => 964, + 933 => 965, + 934 => 966, + 935 => 967, + 936 => 968, + 937 => 969, + 938 => 970, + 939 => 971, + 975 => 983, + 976 => 946, + 977 => 952, + 978 => 965, + 979 => 973, + 980 => 971, + 981 => 966, + 982 => 960, + 984 => 985, + 986 => 987, + 988 => 989, + 990 => 991, + 992 => 993, + 994 => 995, + 996 => 997, + 998 => 999, + 1000 => 1001, + 1002 => 1003, + 1004 => 1005, + 1006 => 1007, + 1008 => 954, + 1009 => 961, + 1010 => 963, + 1012 => 952, + 1013 => 949, + 1015 => 1016, + 1017 => 963, + 1018 => 1019, + 1021 => 891, + 1022 => 892, + 1023 => 893, + 1024 => 1104, + 1025 => 1105, + 1026 => 1106, + 1027 => 1107, + 1028 => 1108, + 1029 => 1109, + 1030 => 1110, + 1031 => 1111, + 1032 => 1112, + 1033 => 1113, + 1034 => 1114, + 1035 => 1115, + 1036 => 1116, + 1037 => 1117, + 1038 => 1118, + 1039 => 1119, + 1040 => 1072, + 1041 => 1073, + 1042 => 1074, + 1043 => 1075, + 1044 => 1076, + 1045 => 1077, + 1046 => 1078, + 1047 => 1079, + 1048 => 1080, + 1049 => 1081, + 1050 => 1082, + 1051 => 1083, + 1052 => 1084, + 1053 => 1085, + 1054 => 1086, + 1055 => 1087, + 1056 => 1088, + 1057 => 1089, + 1058 => 1090, + 1059 => 1091, + 1060 => 1092, + 1061 => 1093, + 1062 => 1094, + 1063 => 1095, + 1064 => 1096, + 1065 => 1097, + 1066 => 1098, + 1067 => 1099, + 1068 => 1100, + 1069 => 1101, + 1070 => 1102, + 1071 => 1103, + 1120 => 1121, + 1122 => 1123, + 1124 => 1125, + 1126 => 1127, + 1128 => 1129, + 1130 => 1131, + 1132 => 1133, + 1134 => 1135, + 1136 => 1137, + 1138 => 1139, + 1140 => 1141, + 1142 => 1143, + 1144 => 1145, + 1146 => 1147, + 1148 => 1149, + 1150 => 1151, + 1152 => 1153, + 1162 => 1163, + 1164 => 1165, + 1166 => 1167, + 1168 => 1169, + 1170 => 1171, + 1172 => 1173, + 1174 => 1175, + 1176 => 1177, + 1178 => 1179, + 1180 => 1181, + 1182 => 1183, + 1184 => 1185, + 1186 => 1187, + 1188 => 1189, + 1190 => 1191, + 1192 => 1193, + 1194 => 1195, + 1196 => 1197, + 1198 => 1199, + 1200 => 1201, + 1202 => 1203, + 1204 => 1205, + 1206 => 1207, + 1208 => 1209, + 1210 => 1211, + 1212 => 1213, + 1214 => 1215, + 1217 => 1218, + 1219 => 1220, + 1221 => 1222, + 1223 => 1224, + 1225 => 1226, + 1227 => 1228, + 1229 => 1230, + 1232 => 1233, + 1234 => 1235, + 1236 => 1237, + 1238 => 1239, + 1240 => 1241, + 1242 => 1243, + 1244 => 1245, + 1246 => 1247, + 1248 => 1249, + 1250 => 1251, + 1252 => 1253, + 1254 => 1255, + 1256 => 1257, + 1258 => 1259, + 1260 => 1261, + 1262 => 1263, + 1264 => 1265, + 1266 => 1267, + 1268 => 1269, + 1270 => 1271, + 1272 => 1273, + 1274 => 1275, + 1276 => 1277, + 1278 => 1279, + 1280 => 1281, + 1282 => 1283, + 1284 => 1285, + 1286 => 1287, + 1288 => 1289, + 1290 => 1291, + 1292 => 1293, + 1294 => 1295, + 1296 => 1297, + 1298 => 1299, + 1300 => 1301, + 1302 => 1303, + 1304 => 1305, + 1306 => 1307, + 1308 => 1309, + 1310 => 1311, + 1312 => 1313, + 1314 => 1315, + 1316 => 1317, + 1318 => 1319, + 1320 => 1321, + 1322 => 1323, + 1324 => 1325, + 1326 => 1327, + 1329 => 1377, + 1330 => 1378, + 1331 => 1379, + 1332 => 1380, + 1333 => 1381, + 1334 => 1382, + 1335 => 1383, + 1336 => 1384, + 1337 => 1385, + 1338 => 1386, + 1339 => 1387, + 1340 => 1388, + 1341 => 1389, + 1342 => 1390, + 1343 => 1391, + 1344 => 1392, + 1345 => 1393, + 1346 => 1394, + 1347 => 1395, + 1348 => 1396, + 1349 => 1397, + 1350 => 1398, + 1351 => 1399, + 1352 => 1400, + 1353 => 1401, + 1354 => 1402, + 1355 => 1403, + 1356 => 1404, + 1357 => 1405, + 1358 => 1406, + 1359 => 1407, + 1360 => 1408, + 1361 => 1409, + 1362 => 1410, + 1363 => 1411, + 1364 => 1412, + 1365 => 1413, + 1366 => 1414, + 1415 => [1381, 1410], + 1653 => [1575, 1652], + 1654 => [1608, 1652], + 1655 => [1735, 1652], + 1656 => [1610, 1652], + 2392 => [2325, 2364], + 2393 => [2326, 2364], + 2394 => [2327, 2364], + 2395 => [2332, 2364], + 2396 => [2337, 2364], + 2397 => [2338, 2364], + 2398 => [2347, 2364], + 2399 => [2351, 2364], + 2524 => [2465, 2492], + 2525 => [2466, 2492], + 2527 => [2479, 2492], + 2611 => [2610, 2620], + 2614 => [2616, 2620], + 2649 => [2582, 2620], + 2650 => [2583, 2620], + 2651 => [2588, 2620], + 2654 => [2603, 2620], + 2908 => [2849, 2876], + 2909 => [2850, 2876], + 3635 => [3661, 3634], + 3763 => [3789, 3762], + 3804 => [3755, 3737], + 3805 => [3755, 3745], + 3852 => 3851, + 3907 => [3906, 4023], + 3917 => [3916, 4023], + 3922 => [3921, 4023], + 3927 => [3926, 4023], + 3932 => [3931, 4023], + 3945 => [3904, 4021], + 3955 => [3953, 3954], + 3957 => [3953, 3956], + 3958 => [4018, 3968], + 3959 => [4018, 3953, 3968], + 3960 => [4019, 3968], + 3961 => [4019, 3953, 3968], + 3969 => [3953, 3968], + 3987 => [3986, 4023], + 3997 => [3996, 4023], + 4002 => [4001, 4023], + 4007 => [4006, 4023], + 4012 => [4011, 4023], + 4025 => [3984, 4021], + 4295 => 11559, + 4301 => 11565, + 4348 => 4316, + 5112 => 5104, + 5113 => 5105, + 5114 => 5106, + 5115 => 5107, + 5116 => 5108, + 5117 => 5109, + 6155 => [], + 6156 => [], + 6157 => [], + 7296 => 1074, + 7297 => 1076, + 7298 => 1086, + 7299 => 1089, + 7300 => 1090, + 7301 => 1090, + 7302 => 1098, + 7303 => 1123, + 7304 => 42571, + 7468 => 97, + 7469 => 230, + 7470 => 98, + 7472 => 100, + 7473 => 101, + 7474 => 477, + 7475 => 103, + 7476 => 104, + 7477 => 105, + 7478 => 106, + 7479 => 107, + 7480 => 108, + 7481 => 109, + 7482 => 110, + 7484 => 111, + 7485 => 547, + 7486 => 112, + 7487 => 114, + 7488 => 116, + 7489 => 117, + 7490 => 119, + 7491 => 97, + 7492 => 592, + 7493 => 593, + 7494 => 7426, + 7495 => 98, + 7496 => 100, + 7497 => 101, + 7498 => 601, + 7499 => 603, + 7500 => 604, + 7501 => 103, + 7503 => 107, + 7504 => 109, + 7505 => 331, + 7506 => 111, + 7507 => 596, + 7508 => 7446, + 7509 => 7447, + 7510 => 112, + 7511 => 116, + 7512 => 117, + 7513 => 7453, + 7514 => 623, + 7515 => 118, + 7516 => 7461, + 7517 => 946, + 7518 => 947, + 7519 => 948, + 7520 => 966, + 7521 => 967, + 7522 => 105, + 7523 => 114, + 7524 => 117, + 7525 => 118, + 7526 => 946, + 7527 => 947, + 7528 => 961, + 7529 => 966, + 7530 => 967, + 7544 => 1085, + 7579 => 594, + 7580 => 99, + 7581 => 597, + 7582 => 240, + 7583 => 604, + 7584 => 102, + 7585 => 607, + 7586 => 609, + 7587 => 613, + 7588 => 616, + 7589 => 617, + 7590 => 618, + 7591 => 7547, + 7592 => 669, + 7593 => 621, + 7594 => 7557, + 7595 => 671, + 7596 => 625, + 7597 => 624, + 7598 => 626, + 7599 => 627, + 7600 => 628, + 7601 => 629, + 7602 => 632, + 7603 => 642, + 7604 => 643, + 7605 => 427, + 7606 => 649, + 7607 => 650, + 7608 => 7452, + 7609 => 651, + 7610 => 652, + 7611 => 122, + 7612 => 656, + 7613 => 657, + 7614 => 658, + 7615 => 952, + 7680 => 7681, + 7682 => 7683, + 7684 => 7685, + 7686 => 7687, + 7688 => 7689, + 7690 => 7691, + 7692 => 7693, + 7694 => 7695, + 7696 => 7697, + 7698 => 7699, + 7700 => 7701, + 7702 => 7703, + 7704 => 7705, + 7706 => 7707, + 7708 => 7709, + 7710 => 7711, + 7712 => 7713, + 7714 => 7715, + 7716 => 7717, + 7718 => 7719, + 7720 => 7721, + 7722 => 7723, + 7724 => 7725, + 7726 => 7727, + 7728 => 7729, + 7730 => 7731, + 7732 => 7733, + 7734 => 7735, + 7736 => 7737, + 7738 => 7739, + 7740 => 7741, + 7742 => 7743, + 7744 => 7745, + 7746 => 7747, + 7748 => 7749, + 7750 => 7751, + 7752 => 7753, + 7754 => 7755, + 7756 => 7757, + 7758 => 7759, + 7760 => 7761, + 7762 => 7763, + 7764 => 7765, + 7766 => 7767, + 7768 => 7769, + 7770 => 7771, + 7772 => 7773, + 7774 => 7775, + 7776 => 7777, + 7778 => 7779, + 7780 => 7781, + 7782 => 7783, + 7784 => 7785, + 7786 => 7787, + 7788 => 7789, + 7790 => 7791, + 7792 => 7793, + 7794 => 7795, + 7796 => 7797, + 7798 => 7799, + 7800 => 7801, + 7802 => 7803, + 7804 => 7805, + 7806 => 7807, + 7808 => 7809, + 7810 => 7811, + 7812 => 7813, + 7814 => 7815, + 7816 => 7817, + 7818 => 7819, + 7820 => 7821, + 7822 => 7823, + 7824 => 7825, + 7826 => 7827, + 7828 => 7829, + 7834 => [97, 702], + 7835 => 7777, + 7838 => [115, 115], + 7840 => 7841, + 7842 => 7843, + 7844 => 7845, + 7846 => 7847, + 7848 => 7849, + 7850 => 7851, + 7852 => 7853, + 7854 => 7855, + 7856 => 7857, + 7858 => 7859, + 7860 => 7861, + 7862 => 7863, + 7864 => 7865, + 7866 => 7867, + 7868 => 7869, + 7870 => 7871, + 7872 => 7873, + 7874 => 7875, + 7876 => 7877, + 7878 => 7879, + 7880 => 7881, + 7882 => 7883, + 7884 => 7885, + 7886 => 7887, + 7888 => 7889, + 7890 => 7891, + 7892 => 7893, + 7894 => 7895, + 7896 => 7897, + 7898 => 7899, + 7900 => 7901, + 7902 => 7903, + 7904 => 7905, + 7906 => 7907, + 7908 => 7909, + 7910 => 7911, + 7912 => 7913, + 7914 => 7915, + 7916 => 7917, + 7918 => 7919, + 7920 => 7921, + 7922 => 7923, + 7924 => 7925, + 7926 => 7927, + 7928 => 7929, + 7930 => 7931, + 7932 => 7933, + 7934 => 7935, + 7944 => 7936, + 7945 => 7937, + 7946 => 7938, + 7947 => 7939, + 7948 => 7940, + 7949 => 7941, + 7950 => 7942, + 7951 => 7943, + 7960 => 7952, + 7961 => 7953, + 7962 => 7954, + 7963 => 7955, + 7964 => 7956, + 7965 => 7957, + 7976 => 7968, + 7977 => 7969, + 7978 => 7970, + 7979 => 7971, + 7980 => 7972, + 7981 => 7973, + 7982 => 7974, + 7983 => 7975, + 7992 => 7984, + 7993 => 7985, + 7994 => 7986, + 7995 => 7987, + 7996 => 7988, + 7997 => 7989, + 7998 => 7990, + 7999 => 7991, + 8008 => 8000, + 8009 => 8001, + 8010 => 8002, + 8011 => 8003, + 8012 => 8004, + 8013 => 8005, + 8025 => 8017, + 8027 => 8019, + 8029 => 8021, + 8031 => 8023, + 8040 => 8032, + 8041 => 8033, + 8042 => 8034, + 8043 => 8035, + 8044 => 8036, + 8045 => 8037, + 8046 => 8038, + 8047 => 8039, + 8049 => 940, + 8051 => 941, + 8053 => 942, + 8055 => 943, + 8057 => 972, + 8059 => 973, + 8061 => 974, + 8064 => [7936, 953], + 8065 => [7937, 953], + 8066 => [7938, 953], + 8067 => [7939, 953], + 8068 => [7940, 953], + 8069 => [7941, 953], + 8070 => [7942, 953], + 8071 => [7943, 953], + 8072 => [7936, 953], + 8073 => [7937, 953], + 8074 => [7938, 953], + 8075 => [7939, 953], + 8076 => [7940, 953], + 8077 => [7941, 953], + 8078 => [7942, 953], + 8079 => [7943, 953], + 8080 => [7968, 953], + 8081 => [7969, 953], + 8082 => [7970, 953], + 8083 => [7971, 953], + 8084 => [7972, 953], + 8085 => [7973, 953], + 8086 => [7974, 953], + 8087 => [7975, 953], + 8088 => [7968, 953], + 8089 => [7969, 953], + 8090 => [7970, 953], + 8091 => [7971, 953], + 8092 => [7972, 953], + 8093 => [7973, 953], + 8094 => [7974, 953], + 8095 => [7975, 953], + 8096 => [8032, 953], + 8097 => [8033, 953], + 8098 => [8034, 953], + 8099 => [8035, 953], + 8100 => [8036, 953], + 8101 => [8037, 953], + 8102 => [8038, 953], + 8103 => [8039, 953], + 8104 => [8032, 953], + 8105 => [8033, 953], + 8106 => [8034, 953], + 8107 => [8035, 953], + 8108 => [8036, 953], + 8109 => [8037, 953], + 8110 => [8038, 953], + 8111 => [8039, 953], + 8114 => [8048, 953], + 8115 => [945, 953], + 8116 => [940, 953], + 8119 => [8118, 953], + 8120 => 8112, + 8121 => 8113, + 8122 => 8048, + 8123 => 940, + 8124 => [945, 953], + 8125 => [32, 787], + 8126 => 953, + 8127 => [32, 787], + 8128 => [32, 834], + 8129 => [32, 776, 834], + 8130 => [8052, 953], + 8131 => [951, 953], + 8132 => [942, 953], + 8135 => [8134, 953], + 8136 => 8050, + 8137 => 941, + 8138 => 8052, + 8139 => 942, + 8140 => [951, 953], + 8141 => [32, 787, 768], + 8142 => [32, 787, 769], + 8143 => [32, 787, 834], + 8147 => 912, + 8152 => 8144, + 8153 => 8145, + 8154 => 8054, + 8155 => 943, + 8157 => [32, 788, 768], + 8158 => [32, 788, 769], + 8159 => [32, 788, 834], + 8163 => 944, + 8168 => 8160, + 8169 => 8161, + 8170 => 8058, + 8171 => 973, + 8172 => 8165, + 8173 => [32, 776, 768], + 8174 => [32, 776, 769], + 8175 => 96, + 8178 => [8060, 953], + 8179 => [969, 953], + 8180 => [974, 953], + 8183 => [8182, 953], + 8184 => 8056, + 8185 => 972, + 8186 => 8060, + 8187 => 974, + 8188 => [969, 953], + 8189 => [32, 769], + 8190 => [32, 788], + 8192 => 32, + 8193 => 32, + 8194 => 32, + 8195 => 32, + 8196 => 32, + 8197 => 32, + 8198 => 32, + 8199 => 32, + 8200 => 32, + 8201 => 32, + 8202 => 32, + 8203 => [], + 8209 => 8208, + 8215 => [32, 819], + 8239 => 32, + 8243 => [8242, 8242], + 8244 => [8242, 8242, 8242], + 8246 => [8245, 8245], + 8247 => [8245, 8245, 8245], + 8252 => [33, 33], + 8254 => [32, 773], + 8263 => [63, 63], + 8264 => [63, 33], + 8265 => [33, 63], + 8279 => [8242, 8242, 8242, 8242], + 8287 => 32, + 8288 => [], + 8292 => [], + 8304 => 48, + 8305 => 105, + 8308 => 52, + 8309 => 53, + 8310 => 54, + 8311 => 55, + 8312 => 56, + 8313 => 57, + 8314 => 43, + 8315 => 8722, + 8316 => 61, + 8317 => 40, + 8318 => 41, + 8319 => 110, + 8320 => 48, + 8321 => 49, + 8322 => 50, + 8323 => 51, + 8324 => 52, + 8325 => 53, + 8326 => 54, + 8327 => 55, + 8328 => 56, + 8329 => 57, + 8330 => 43, + 8331 => 8722, + 8332 => 61, + 8333 => 40, + 8334 => 41, + 8336 => 97, + 8337 => 101, + 8338 => 111, + 8339 => 120, + 8340 => 601, + 8341 => 104, + 8342 => 107, + 8343 => 108, + 8344 => 109, + 8345 => 110, + 8346 => 112, + 8347 => 115, + 8348 => 116, + 8360 => [114, 115], + 8448 => [97, 47, 99], + 8449 => [97, 47, 115], + 8450 => 99, + 8451 => [176, 99], + 8453 => [99, 47, 111], + 8454 => [99, 47, 117], + 8455 => 603, + 8457 => [176, 102], + 8458 => 103, + 8459 => 104, + 8460 => 104, + 8461 => 104, + 8462 => 104, + 8463 => 295, + 8464 => 105, + 8465 => 105, + 8466 => 108, + 8467 => 108, + 8469 => 110, + 8470 => [110, 111], + 8473 => 112, + 8474 => 113, + 8475 => 114, + 8476 => 114, + 8477 => 114, + 8480 => [115, 109], + 8481 => [116, 101, 108], + 8482 => [116, 109], + 8484 => 122, + 8486 => 969, + 8488 => 122, + 8490 => 107, + 8491 => 229, + 8492 => 98, + 8493 => 99, + 8495 => 101, + 8496 => 101, + 8497 => 102, + 8499 => 109, + 8500 => 111, + 8501 => 1488, + 8502 => 1489, + 8503 => 1490, + 8504 => 1491, + 8505 => 105, + 8507 => [102, 97, 120], + 8508 => 960, + 8509 => 947, + 8510 => 947, + 8511 => 960, + 8512 => 8721, + 8517 => 100, + 8518 => 100, + 8519 => 101, + 8520 => 105, + 8521 => 106, + 8528 => [49, 8260, 55], + 8529 => [49, 8260, 57], + 8530 => [49, 8260, 49, 48], + 8531 => [49, 8260, 51], + 8532 => [50, 8260, 51], + 8533 => [49, 8260, 53], + 8534 => [50, 8260, 53], + 8535 => [51, 8260, 53], + 8536 => [52, 8260, 53], + 8537 => [49, 8260, 54], + 8538 => [53, 8260, 54], + 8539 => [49, 8260, 56], + 8540 => [51, 8260, 56], + 8541 => [53, 8260, 56], + 8542 => [55, 8260, 56], + 8543 => [49, 8260], + 8544 => 105, + 8545 => [105, 105], + 8546 => [105, 105, 105], + 8547 => [105, 118], + 8548 => 118, + 8549 => [118, 105], + 8550 => [118, 105, 105], + 8551 => [118, 105, 105, 105], + 8552 => [105, 120], + 8553 => 120, + 8554 => [120, 105], + 8555 => [120, 105, 105], + 8556 => 108, + 8557 => 99, + 8558 => 100, + 8559 => 109, + 8560 => 105, + 8561 => [105, 105], + 8562 => [105, 105, 105], + 8563 => [105, 118], + 8564 => 118, + 8565 => [118, 105], + 8566 => [118, 105, 105], + 8567 => [118, 105, 105, 105], + 8568 => [105, 120], + 8569 => 120, + 8570 => [120, 105], + 8571 => [120, 105, 105], + 8572 => 108, + 8573 => 99, + 8574 => 100, + 8575 => 109, + 8585 => [48, 8260, 51], + 8748 => [8747, 8747], + 8749 => [8747, 8747, 8747], + 8751 => [8750, 8750], + 8752 => [8750, 8750, 8750], + 9001 => 12296, + 9002 => 12297, + 9312 => 49, + 9313 => 50, + 9314 => 51, + 9315 => 52, + 9316 => 53, + 9317 => 54, + 9318 => 55, + 9319 => 56, + 9320 => 57, + 9321 => [49, 48], + 9322 => [49, 49], + 9323 => [49, 50], + 9324 => [49, 51], + 9325 => [49, 52], + 9326 => [49, 53], + 9327 => [49, 54], + 9328 => [49, 55], + 9329 => [49, 56], + 9330 => [49, 57], + 9331 => [50, 48], + 9332 => [40, 49, 41], + 9333 => [40, 50, 41], + 9334 => [40, 51, 41], + 9335 => [40, 52, 41], + 9336 => [40, 53, 41], + 9337 => [40, 54, 41], + 9338 => [40, 55, 41], + 9339 => [40, 56, 41], + 9340 => [40, 57, 41], + 9341 => [40, 49, 48, 41], + 9342 => [40, 49, 49, 41], + 9343 => [40, 49, 50, 41], + 9344 => [40, 49, 51, 41], + 9345 => [40, 49, 52, 41], + 9346 => [40, 49, 53, 41], + 9347 => [40, 49, 54, 41], + 9348 => [40, 49, 55, 41], + 9349 => [40, 49, 56, 41], + 9350 => [40, 49, 57, 41], + 9351 => [40, 50, 48, 41], + 9372 => [40, 97, 41], + 9373 => [40, 98, 41], + 9374 => [40, 99, 41], + 9375 => [40, 100, 41], + 9376 => [40, 101, 41], + 9377 => [40, 102, 41], + 9378 => [40, 103, 41], + 9379 => [40, 104, 41], + 9380 => [40, 105, 41], + 9381 => [40, 106, 41], + 9382 => [40, 107, 41], + 9383 => [40, 108, 41], + 9384 => [40, 109, 41], + 9385 => [40, 110, 41], + 9386 => [40, 111, 41], + 9387 => [40, 112, 41], + 9388 => [40, 113, 41], + 9389 => [40, 114, 41], + 9390 => [40, 115, 41], + 9391 => [40, 116, 41], + 9392 => [40, 117, 41], + 9393 => [40, 118, 41], + 9394 => [40, 119, 41], + 9395 => [40, 120, 41], + 9396 => [40, 121, 41], + 9397 => [40, 122, 41], + 9398 => 97, + 9399 => 98, + 9400 => 99, + 9401 => 100, + 9402 => 101, + 9403 => 102, + 9404 => 103, + 9405 => 104, + 9406 => 105, + 9407 => 106, + 9408 => 107, + 9409 => 108, + 9410 => 109, + 9411 => 110, + 9412 => 111, + 9413 => 112, + 9414 => 113, + 9415 => 114, + 9416 => 115, + 9417 => 116, + 9418 => 117, + 9419 => 118, + 9420 => 119, + 9421 => 120, + 9422 => 121, + 9423 => 122, + 9424 => 97, + 9425 => 98, + 9426 => 99, + 9427 => 100, + 9428 => 101, + 9429 => 102, + 9430 => 103, + 9431 => 104, + 9432 => 105, + 9433 => 106, + 9434 => 107, + 9435 => 108, + 9436 => 109, + 9437 => 110, + 9438 => 111, + 9439 => 112, + 9440 => 113, + 9441 => 114, + 9442 => 115, + 9443 => 116, + 9444 => 117, + 9445 => 118, + 9446 => 119, + 9447 => 120, + 9448 => 121, + 9449 => 122, + 9450 => 48, + 10764 => [8747, 8747, 8747, 8747], + 10868 => [58, 58, 61], + 10869 => [61, 61], + 10870 => [61, 61, 61], + 10972 => [10973, 824], + 11264 => 11312, + 11265 => 11313, + 11266 => 11314, + 11267 => 11315, + 11268 => 11316, + 11269 => 11317, + 11270 => 11318, + 11271 => 11319, + 11272 => 11320, + 11273 => 11321, + 11274 => 11322, + 11275 => 11323, + 11276 => 11324, + 11277 => 11325, + 11278 => 11326, + 11279 => 11327, + 11280 => 11328, + 11281 => 11329, + 11282 => 11330, + 11283 => 11331, + 11284 => 11332, + 11285 => 11333, + 11286 => 11334, + 11287 => 11335, + 11288 => 11336, + 11289 => 11337, + 11290 => 11338, + 11291 => 11339, + 11292 => 11340, + 11293 => 11341, + 11294 => 11342, + 11295 => 11343, + 11296 => 11344, + 11297 => 11345, + 11298 => 11346, + 11299 => 11347, + 11300 => 11348, + 11301 => 11349, + 11302 => 11350, + 11303 => 11351, + 11304 => 11352, + 11305 => 11353, + 11306 => 11354, + 11307 => 11355, + 11308 => 11356, + 11309 => 11357, + 11310 => 11358, + 11360 => 11361, + 11362 => 619, + 11363 => 7549, + 11364 => 637, + 11367 => 11368, + 11369 => 11370, + 11371 => 11372, + 11373 => 593, + 11374 => 625, + 11375 => 592, + 11376 => 594, + 11378 => 11379, + 11381 => 11382, + 11388 => 106, + 11389 => 118, + 11390 => 575, + 11391 => 576, + 11392 => 11393, + 11394 => 11395, + 11396 => 11397, + 11398 => 11399, + 11400 => 11401, + 11402 => 11403, + 11404 => 11405, + 11406 => 11407, + 11408 => 11409, + 11410 => 11411, + 11412 => 11413, + 11414 => 11415, + 11416 => 11417, + 11418 => 11419, + 11420 => 11421, + 11422 => 11423, + 11424 => 11425, + 11426 => 11427, + 11428 => 11429, + 11430 => 11431, + 11432 => 11433, + 11434 => 11435, + 11436 => 11437, + 11438 => 11439, + 11440 => 11441, + 11442 => 11443, + 11444 => 11445, + 11446 => 11447, + 11448 => 11449, + 11450 => 11451, + 11452 => 11453, + 11454 => 11455, + 11456 => 11457, + 11458 => 11459, + 11460 => 11461, + 11462 => 11463, + 11464 => 11465, + 11466 => 11467, + 11468 => 11469, + 11470 => 11471, + 11472 => 11473, + 11474 => 11475, + 11476 => 11477, + 11478 => 11479, + 11480 => 11481, + 11482 => 11483, + 11484 => 11485, + 11486 => 11487, + 11488 => 11489, + 11490 => 11491, + 11499 => 11500, + 11501 => 11502, + 11506 => 11507, + 11631 => 11617, + 11935 => 27597, + 12019 => 40863, + 12032 => 19968, + 12033 => 20008, + 12034 => 20022, + 12035 => 20031, + 12036 => 20057, + 12037 => 20101, + 12038 => 20108, + 12039 => 20128, + 12040 => 20154, + 12041 => 20799, + 12042 => 20837, + 12043 => 20843, + 12044 => 20866, + 12045 => 20886, + 12046 => 20907, + 12047 => 20960, + 12048 => 20981, + 12049 => 20992, + 12050 => 21147, + 12051 => 21241, + 12052 => 21269, + 12053 => 21274, + 12054 => 21304, + 12055 => 21313, + 12056 => 21340, + 12057 => 21353, + 12058 => 21378, + 12059 => 21430, + 12060 => 21448, + 12061 => 21475, + 12062 => 22231, + 12063 => 22303, + 12064 => 22763, + 12065 => 22786, + 12066 => 22794, + 12067 => 22805, + 12068 => 22823, + 12069 => 22899, + 12070 => 23376, + 12071 => 23424, + 12072 => 23544, + 12073 => 23567, + 12074 => 23586, + 12075 => 23608, + 12076 => 23662, + 12077 => 23665, + 12078 => 24027, + 12079 => 24037, + 12080 => 24049, + 12081 => 24062, + 12082 => 24178, + 12083 => 24186, + 12084 => 24191, + 12085 => 24308, + 12086 => 24318, + 12087 => 24331, + 12088 => 24339, + 12089 => 24400, + 12090 => 24417, + 12091 => 24435, + 12092 => 24515, + 12093 => 25096, + 12094 => 25142, + 12095 => 25163, + 12096 => 25903, + 12097 => 25908, + 12098 => 25991, + 12099 => 26007, + 12100 => 26020, + 12101 => 26041, + 12102 => 26080, + 12103 => 26085, + 12104 => 26352, + 12105 => 26376, + 12106 => 26408, + 12107 => 27424, + 12108 => 27490, + 12109 => 27513, + 12110 => 27571, + 12111 => 27595, + 12112 => 27604, + 12113 => 27611, + 12114 => 27663, + 12115 => 27668, + 12116 => 27700, + 12117 => 28779, + 12118 => 29226, + 12119 => 29238, + 12120 => 29243, + 12121 => 29247, + 12122 => 29255, + 12123 => 29273, + 12124 => 29275, + 12125 => 29356, + 12126 => 29572, + 12127 => 29577, + 12128 => 29916, + 12129 => 29926, + 12130 => 29976, + 12131 => 29983, + 12132 => 29992, + 12133 => 30000, + 12134 => 30091, + 12135 => 30098, + 12136 => 30326, + 12137 => 30333, + 12138 => 30382, + 12139 => 30399, + 12140 => 30446, + 12141 => 30683, + 12142 => 30690, + 12143 => 30707, + 12144 => 31034, + 12145 => 31160, + 12146 => 31166, + 12147 => 31348, + 12148 => 31435, + 12149 => 31481, + 12150 => 31859, + 12151 => 31992, + 12152 => 32566, + 12153 => 32593, + 12154 => 32650, + 12155 => 32701, + 12156 => 32769, + 12157 => 32780, + 12158 => 32786, + 12159 => 32819, + 12160 => 32895, + 12161 => 32905, + 12162 => 33251, + 12163 => 33258, + 12164 => 33267, + 12165 => 33276, + 12166 => 33292, + 12167 => 33307, + 12168 => 33311, + 12169 => 33390, + 12170 => 33394, + 12171 => 33400, + 12172 => 34381, + 12173 => 34411, + 12174 => 34880, + 12175 => 34892, + 12176 => 34915, + 12177 => 35198, + 12178 => 35211, + 12179 => 35282, + 12180 => 35328, + 12181 => 35895, + 12182 => 35910, + 12183 => 35925, + 12184 => 35960, + 12185 => 35997, + 12186 => 36196, + 12187 => 36208, + 12188 => 36275, + 12189 => 36523, + 12190 => 36554, + 12191 => 36763, + 12192 => 36784, + 12193 => 36789, + 12194 => 37009, + 12195 => 37193, + 12196 => 37318, + 12197 => 37324, + 12198 => 37329, + 12199 => 38263, + 12200 => 38272, + 12201 => 38428, + 12202 => 38582, + 12203 => 38585, + 12204 => 38632, + 12205 => 38737, + 12206 => 38750, + 12207 => 38754, + 12208 => 38761, + 12209 => 38859, + 12210 => 38893, + 12211 => 38899, + 12212 => 38913, + 12213 => 39080, + 12214 => 39131, + 12215 => 39135, + 12216 => 39318, + 12217 => 39321, + 12218 => 39340, + 12219 => 39592, + 12220 => 39640, + 12221 => 39647, + 12222 => 39717, + 12223 => 39727, + 12224 => 39730, + 12225 => 39740, + 12226 => 39770, + 12227 => 40165, + 12228 => 40565, + 12229 => 40575, + 12230 => 40613, + 12231 => 40635, + 12232 => 40643, + 12233 => 40653, + 12234 => 40657, + 12235 => 40697, + 12236 => 40701, + 12237 => 40718, + 12238 => 40723, + 12239 => 40736, + 12240 => 40763, + 12241 => 40778, + 12242 => 40786, + 12243 => 40845, + 12244 => 40860, + 12245 => 40864, + 12288 => 32, + 12290 => 46, + 12342 => 12306, + 12344 => 21313, + 12345 => 21316, + 12346 => 21317, + 12443 => [32, 12441], + 12444 => [32, 12442], + 12447 => [12424, 12426], + 12543 => [12467, 12488], + 12593 => 4352, + 12594 => 4353, + 12595 => 4522, + 12596 => 4354, + 12597 => 4524, + 12598 => 4525, + 12599 => 4355, + 12600 => 4356, + 12601 => 4357, + 12602 => 4528, + 12603 => 4529, + 12604 => 4530, + 12605 => 4531, + 12606 => 4532, + 12607 => 4533, + 12608 => 4378, + 12609 => 4358, + 12610 => 4359, + 12611 => 4360, + 12612 => 4385, + 12613 => 4361, + 12614 => 4362, + 12615 => 4363, + 12616 => 4364, + 12617 => 4365, + 12618 => 4366, + 12619 => 4367, + 12620 => 4368, + 12621 => 4369, + 12622 => 4370, + 12623 => 4449, + 12624 => 4450, + 12625 => 4451, + 12626 => 4452, + 12627 => 4453, + 12628 => 4454, + 12629 => 4455, + 12630 => 4456, + 12631 => 4457, + 12632 => 4458, + 12633 => 4459, + 12634 => 4460, + 12635 => 4461, + 12636 => 4462, + 12637 => 4463, + 12638 => 4464, + 12639 => 4465, + 12640 => 4466, + 12641 => 4467, + 12642 => 4468, + 12643 => 4469, + 12645 => 4372, + 12646 => 4373, + 12647 => 4551, + 12648 => 4552, + 12649 => 4556, + 12650 => 4558, + 12651 => 4563, + 12652 => 4567, + 12653 => 4569, + 12654 => 4380, + 12655 => 4573, + 12656 => 4575, + 12657 => 4381, + 12658 => 4382, + 12659 => 4384, + 12660 => 4386, + 12661 => 4387, + 12662 => 4391, + 12663 => 4393, + 12664 => 4395, + 12665 => 4396, + 12666 => 4397, + 12667 => 4398, + 12668 => 4399, + 12669 => 4402, + 12670 => 4406, + 12671 => 4416, + 12672 => 4423, + 12673 => 4428, + 12674 => 4593, + 12675 => 4594, + 12676 => 4439, + 12677 => 4440, + 12678 => 4441, + 12679 => 4484, + 12680 => 4485, + 12681 => 4488, + 12682 => 4497, + 12683 => 4498, + 12684 => 4500, + 12685 => 4510, + 12686 => 4513, + 12690 => 19968, + 12691 => 20108, + 12692 => 19977, + 12693 => 22235, + 12694 => 19978, + 12695 => 20013, + 12696 => 19979, + 12697 => 30002, + 12698 => 20057, + 12699 => 19993, + 12700 => 19969, + 12701 => 22825, + 12702 => 22320, + 12703 => 20154, + 12800 => [40, 4352, 41], + 12801 => [40, 4354, 41], + 12802 => [40, 4355, 41], + 12803 => [40, 4357, 41], + 12804 => [40, 4358, 41], + 12805 => [40, 4359, 41], + 12806 => [40, 4361, 41], + 12807 => [40, 4363, 41], + 12808 => [40, 4364, 41], + 12809 => [40, 4366, 41], + 12810 => [40, 4367, 41], + 12811 => [40, 4368, 41], + 12812 => [40, 4369, 41], + 12813 => [40, 4370, 41], + 12814 => [40, 44032, 41], + 12815 => [40, 45208, 41], + 12816 => [40, 45796, 41], + 12817 => [40, 46972, 41], + 12818 => [40, 47560, 41], + 12819 => [40, 48148, 41], + 12820 => [40, 49324, 41], + 12821 => [40, 50500, 41], + 12822 => [40, 51088, 41], + 12823 => [40, 52264, 41], + 12824 => [40, 52852, 41], + 12825 => [40, 53440, 41], + 12826 => [40, 54028, 41], + 12827 => [40, 54616, 41], + 12828 => [40, 51452, 41], + 12829 => [40, 50724, 51204, 41], + 12830 => [40, 50724, 54980, 41], + 12832 => [40, 19968, 41], + 12833 => [40, 20108, 41], + 12834 => [40, 19977, 41], + 12835 => [40, 22235, 41], + 12836 => [40, 20116, 41], + 12837 => [40, 20845, 41], + 12838 => [40, 19971, 41], + 12839 => [40, 20843, 41], + 12840 => [40, 20061, 41], + 12841 => [40, 21313, 41], + 12842 => [40, 26376, 41], + 12843 => [40, 28779, 41], + 12844 => [40, 27700, 41], + 12845 => [40, 26408, 41], + 12846 => [40, 37329, 41], + 12847 => [40, 22303, 41], + 12848 => [40, 26085, 41], + 12849 => [40, 26666, 41], + 12850 => [40, 26377, 41], + 12851 => [40, 31038, 41], + 12852 => [40, 21517, 41], + 12853 => [40, 29305, 41], + 12854 => [40, 36001, 41], + 12855 => [40, 31069, 41], + 12856 => [40, 21172, 41], + 12857 => [40, 20195, 41], + 12858 => [40, 21628, 41], + 12859 => [40, 23398, 41], + 12860 => [40, 30435, 41], + 12861 => [40, 20225, 41], + 12862 => [40, 36039, 41], + 12863 => [40, 21332, 41], + 12864 => [40, 31085, 41], + 12865 => [40, 20241, 41], + 12866 => [40, 33258, 41], + 12867 => [40, 33267, 41], + 12868 => 21839, + 12869 => 24188, + 12870 => 25991, + 12871 => 31631, + 12880 => [112, 116, 101], + 12881 => [50, 49], + 12882 => [50, 50], + 12883 => [50, 51], + 12884 => [50, 52], + 12885 => [50, 53], + 12886 => [50, 54], + 12887 => [50, 55], + 12888 => [50, 56], + 12889 => [50, 57], + 12890 => [51, 48], + 12891 => [51, 49], + 12892 => [51, 50], + 12893 => [51, 51], + 12894 => [51, 52], + 12895 => [51, 53], + 12896 => 4352, + 12897 => 4354, + 12898 => 4355, + 12899 => 4357, + 12900 => 4358, + 12901 => 4359, + 12902 => 4361, + 12903 => 4363, + 12904 => 4364, + 12905 => 4366, + 12906 => 4367, + 12907 => 4368, + 12908 => 4369, + 12909 => 4370, + 12910 => 44032, + 12911 => 45208, + 12912 => 45796, + 12913 => 46972, + 12914 => 47560, + 12915 => 48148, + 12916 => 49324, + 12917 => 50500, + 12918 => 51088, + 12919 => 52264, + 12920 => 52852, + 12921 => 53440, + 12922 => 54028, + 12923 => 54616, + 12924 => [52280, 44256], + 12925 => [51452, 51032], + 12926 => 50864, + 12928 => 19968, + 12929 => 20108, + 12930 => 19977, + 12931 => 22235, + 12932 => 20116, + 12933 => 20845, + 12934 => 19971, + 12935 => 20843, + 12936 => 20061, + 12937 => 21313, + 12938 => 26376, + 12939 => 28779, + 12940 => 27700, + 12941 => 26408, + 12942 => 37329, + 12943 => 22303, + 12944 => 26085, + 12945 => 26666, + 12946 => 26377, + 12947 => 31038, + 12948 => 21517, + 12949 => 29305, + 12950 => 36001, + 12951 => 31069, + 12952 => 21172, + 12953 => 31192, + 12954 => 30007, + 12955 => 22899, + 12956 => 36969, + 12957 => 20778, + 12958 => 21360, + 12959 => 27880, + 12960 => 38917, + 12961 => 20241, + 12962 => 20889, + 12963 => 27491, + 12964 => 19978, + 12965 => 20013, + 12966 => 19979, + 12967 => 24038, + 12968 => 21491, + 12969 => 21307, + 12970 => 23447, + 12971 => 23398, + 12972 => 30435, + 12973 => 20225, + 12974 => 36039, + 12975 => 21332, + 12976 => 22812, + 12977 => [51, 54], + 12978 => [51, 55], + 12979 => [51, 56], + 12980 => [51, 57], + 12981 => [52, 48], + 12982 => [52, 49], + 12983 => [52, 50], + 12984 => [52, 51], + 12985 => [52, 52], + 12986 => [52, 53], + 12987 => [52, 54], + 12988 => [52, 55], + 12989 => [52, 56], + 12990 => [52, 57], + 12991 => [53, 48], + 12992 => [49, 26376], + 12993 => [50, 26376], + 12994 => [51, 26376], + 12995 => [52, 26376], + 12996 => [53, 26376], + 12997 => [54, 26376], + 12998 => [55, 26376], + 12999 => [56, 26376], + 13000 => [57, 26376], + 13001 => [49, 48, 26376], + 13002 => [49, 49, 26376], + 13003 => [49, 50, 26376], + 13004 => [104, 103], + 13005 => [101, 114, 103], + 13006 => [101, 118], + 13007 => [108, 116, 100], + 13008 => 12450, + 13009 => 12452, + 13010 => 12454, + 13011 => 12456, + 13012 => 12458, + 13013 => 12459, + 13014 => 12461, + 13015 => 12463, + 13016 => 12465, + 13017 => 12467, + 13018 => 12469, + 13019 => 12471, + 13020 => 12473, + 13021 => 12475, + 13022 => 12477, + 13023 => 12479, + 13024 => 12481, + 13025 => 12484, + 13026 => 12486, + 13027 => 12488, + 13028 => 12490, + 13029 => 12491, + 13030 => 12492, + 13031 => 12493, + 13032 => 12494, + 13033 => 12495, + 13034 => 12498, + 13035 => 12501, + 13036 => 12504, + 13037 => 12507, + 13038 => 12510, + 13039 => 12511, + 13040 => 12512, + 13041 => 12513, + 13042 => 12514, + 13043 => 12516, + 13044 => 12518, + 13045 => 12520, + 13046 => 12521, + 13047 => 12522, + 13048 => 12523, + 13049 => 12524, + 13050 => 12525, + 13051 => 12527, + 13052 => 12528, + 13053 => 12529, + 13054 => 12530, + 13056 => [12450, 12497, 12540, 12488], + 13057 => [12450, 12523, 12501, 12449], + 13058 => [12450, 12531, 12506, 12450], + 13059 => [12450, 12540, 12523], + 13060 => [12452, 12491, 12531, 12464], + 13061 => [12452, 12531, 12481], + 13062 => [12454, 12457, 12531], + 13063 => [12456, 12473, 12463, 12540, 12489], + 13064 => [12456, 12540, 12459, 12540], + 13065 => [12458, 12531, 12473], + 13066 => [12458, 12540, 12512], + 13067 => [12459, 12452, 12522], + 13068 => [12459, 12521, 12483, 12488], + 13069 => [12459, 12525, 12522, 12540], + 13070 => [12460, 12525, 12531], + 13071 => [12460, 12531, 12510], + 13072 => [12462, 12460], + 13073 => [12462, 12491, 12540], + 13074 => [12461, 12517, 12522, 12540], + 13075 => [12462, 12523, 12480, 12540], + 13076 => [12461, 12525], + 13077 => [12461, 12525, 12464, 12521, 12512], + 13078 => [12461, 12525, 12513, 12540, 12488, 12523], + 13079 => [12461, 12525, 12527, 12483, 12488], + 13080 => [12464, 12521, 12512], + 13081 => [12464, 12521, 12512, 12488, 12531], + 13082 => [12463, 12523, 12476, 12452, 12525], + 13083 => [12463, 12525, 12540, 12493], + 13084 => [12465, 12540, 12473], + 13085 => [12467, 12523, 12490], + 13086 => [12467, 12540, 12509], + 13087 => [12469, 12452, 12463, 12523], + 13088 => [12469, 12531, 12481, 12540, 12512], + 13089 => [12471, 12522, 12531, 12464], + 13090 => [12475, 12531, 12481], + 13091 => [12475, 12531, 12488], + 13092 => [12480, 12540, 12473], + 13093 => [12487, 12471], + 13094 => [12489, 12523], + 13095 => [12488, 12531], + 13096 => [12490, 12494], + 13097 => [12494, 12483, 12488], + 13098 => [12495, 12452, 12484], + 13099 => [12497, 12540, 12475, 12531, 12488], + 13100 => [12497, 12540, 12484], + 13101 => [12496, 12540, 12524, 12523], + 13102 => [12500, 12450, 12473, 12488, 12523], + 13103 => [12500, 12463, 12523], + 13104 => [12500, 12467], + 13105 => [12499, 12523], + 13106 => [12501, 12449, 12521, 12483, 12489], + 13107 => [12501, 12451, 12540, 12488], + 13108 => [12502, 12483, 12471, 12455, 12523], + 13109 => [12501, 12521, 12531], + 13110 => [12504, 12463, 12479, 12540, 12523], + 13111 => [12506, 12477], + 13112 => [12506, 12491, 12498], + 13113 => [12504, 12523, 12484], + 13114 => [12506, 12531, 12473], + 13115 => [12506, 12540, 12472], + 13116 => [12505, 12540, 12479], + 13117 => [12509, 12452, 12531, 12488], + 13118 => [12508, 12523, 12488], + 13119 => [12507, 12531], + 13120 => [12509, 12531, 12489], + 13121 => [12507, 12540, 12523], + 13122 => [12507, 12540, 12531], + 13123 => [12510, 12452, 12463, 12525], + 13124 => [12510, 12452, 12523], + 13125 => [12510, 12483, 12495], + 13126 => [12510, 12523, 12463], + 13127 => [12510, 12531, 12471, 12519, 12531], + 13128 => [12511, 12463, 12525, 12531], + 13129 => [12511, 12522], + 13130 => [12511, 12522, 12496, 12540, 12523], + 13131 => [12513, 12460], + 13132 => [12513, 12460, 12488, 12531], + 13133 => [12513, 12540, 12488, 12523], + 13134 => [12516, 12540, 12489], + 13135 => [12516, 12540, 12523], + 13136 => [12518, 12450, 12531], + 13137 => [12522, 12483, 12488, 12523], + 13138 => [12522, 12521], + 13139 => [12523, 12500, 12540], + 13140 => [12523, 12540, 12502, 12523], + 13141 => [12524, 12512], + 13142 => [12524, 12531, 12488, 12466, 12531], + 13143 => [12527, 12483, 12488], + 13144 => [48, 28857], + 13145 => [49, 28857], + 13146 => [50, 28857], + 13147 => [51, 28857], + 13148 => [52, 28857], + 13149 => [53, 28857], + 13150 => [54, 28857], + 13151 => [55, 28857], + 13152 => [56, 28857], + 13153 => [57, 28857], + 13154 => [49, 48, 28857], + 13155 => [49, 49, 28857], + 13156 => [49, 50, 28857], + 13157 => [49, 51, 28857], + 13158 => [49, 52, 28857], + 13159 => [49, 53, 28857], + 13160 => [49, 54, 28857], + 13161 => [49, 55, 28857], + 13162 => [49, 56, 28857], + 13163 => [49, 57, 28857], + 13164 => [50, 48, 28857], + 13165 => [50, 49, 28857], + 13166 => [50, 50, 28857], + 13167 => [50, 51, 28857], + 13168 => [50, 52, 28857], + 13169 => [104, 112, 97], + 13170 => [100, 97], + 13171 => [97, 117], + 13172 => [98, 97, 114], + 13173 => [111, 118], + 13174 => [112, 99], + 13175 => [100, 109], + 13176 => [100, 109, 50], + 13177 => [100, 109, 51], + 13178 => [105, 117], + 13179 => [24179, 25104], + 13180 => [26157, 21644], + 13181 => [22823, 27491], + 13182 => [26126, 27835], + 13183 => [26666, 24335, 20250, 31038], + 13184 => [112, 97], + 13185 => [110, 97], + 13186 => [956, 97], + 13187 => [109, 97], + 13188 => [107, 97], + 13189 => [107, 98], + 13190 => [109, 98], + 13191 => [103, 98], + 13192 => [99, 97, 108], + 13193 => [107, 99, 97, 108], + 13194 => [112, 102], + 13195 => [110, 102], + 13196 => [956, 102], + 13197 => [956, 103], + 13198 => [109, 103], + 13199 => [107, 103], + 13200 => [104, 122], + 13201 => [107, 104, 122], + 13202 => [109, 104, 122], + 13203 => [103, 104, 122], + 13204 => [116, 104, 122], + 13205 => [956, 108], + 13206 => [109, 108], + 13207 => [100, 108], + 13208 => [107, 108], + 13209 => [102, 109], + 13210 => [110, 109], + 13211 => [956, 109], + 13212 => [109, 109], + 13213 => [99, 109], + 13214 => [107, 109], + 13215 => [109, 109, 50], + 13216 => [99, 109, 50], + 13217 => [109, 50], + 13218 => [107, 109, 50], + 13219 => [109, 109, 51], + 13220 => [99, 109, 51], + 13221 => [109, 51], + 13222 => [107, 109, 51], + 13223 => [109, 8725, 115], + 13224 => [109, 8725, 115, 50], + 13225 => [112, 97], + 13226 => [107, 112, 97], + 13227 => [109, 112, 97], + 13228 => [103, 112, 97], + 13229 => [114, 97, 100], + 13230 => [114, 97, 100, 8725, 115], + 13231 => [114, 97, 100, 8725, 115, 50], + 13232 => [112, 115], + 13233 => [110, 115], + 13234 => [956, 115], + 13235 => [109, 115], + 13236 => [112, 118], + 13237 => [110, 118], + 13238 => [956, 118], + 13239 => [109, 118], + 13240 => [107, 118], + 13241 => [109, 118], + 13242 => [112, 119], + 13243 => [110, 119], + 13244 => [956, 119], + 13245 => [109, 119], + 13246 => [107, 119], + 13247 => [109, 119], + 13248 => [107, 969], + 13249 => [109, 969], + 13251 => [98, 113], + 13252 => [99, 99], + 13253 => [99, 100], + 13254 => [99, 8725, 107, 103], + 13256 => [100, 98], + 13257 => [103, 121], + 13258 => [104, 97], + 13259 => [104, 112], + 13260 => [105, 110], + 13261 => [107, 107], + 13262 => [107, 109], + 13263 => [107, 116], + 13264 => [108, 109], + 13265 => [108, 110], + 13266 => [108, 111, 103], + 13267 => [108, 120], + 13268 => [109, 98], + 13269 => [109, 105, 108], + 13270 => [109, 111, 108], + 13271 => [112, 104], + 13273 => [112, 112, 109], + 13274 => [112, 114], + 13275 => [115, 114], + 13276 => [115, 118], + 13277 => [119, 98], + 13278 => [118, 8725, 109], + 13279 => [97, 8725, 109], + 13280 => [49, 26085], + 13281 => [50, 26085], + 13282 => [51, 26085], + 13283 => [52, 26085], + 13284 => [53, 26085], + 13285 => [54, 26085], + 13286 => [55, 26085], + 13287 => [56, 26085], + 13288 => [57, 26085], + 13289 => [49, 48, 26085], + 13290 => [49, 49, 26085], + 13291 => [49, 50, 26085], + 13292 => [49, 51, 26085], + 13293 => [49, 52, 26085], + 13294 => [49, 53, 26085], + 13295 => [49, 54, 26085], + 13296 => [49, 55, 26085], + 13297 => [49, 56, 26085], + 13298 => [49, 57, 26085], + 13299 => [50, 48, 26085], + 13300 => [50, 49, 26085], + 13301 => [50, 50, 26085], + 13302 => [50, 51, 26085], + 13303 => [50, 52, 26085], + 13304 => [50, 53, 26085], + 13305 => [50, 54, 26085], + 13306 => [50, 55, 26085], + 13307 => [50, 56, 26085], + 13308 => [50, 57, 26085], + 13309 => [51, 48, 26085], + 13310 => [51, 49, 26085], + 13311 => [103, 97, 108], + 42560 => 42561, + 42562 => 42563, + 42564 => 42565, + 42566 => 42567, + 42568 => 42569, + 42570 => 42571, + 42572 => 42573, + 42574 => 42575, + 42576 => 42577, + 42578 => 42579, + 42580 => 42581, + 42582 => 42583, + 42584 => 42585, + 42586 => 42587, + 42588 => 42589, + 42590 => 42591, + 42592 => 42593, + 42594 => 42595, + 42596 => 42597, + 42598 => 42599, + 42600 => 42601, + 42602 => 42603, + 42604 => 42605, + 42624 => 42625, + 42626 => 42627, + 42628 => 42629, + 42630 => 42631, + 42632 => 42633, + 42634 => 42635, + 42636 => 42637, + 42638 => 42639, + 42640 => 42641, + 42642 => 42643, + 42644 => 42645, + 42646 => 42647, + 42648 => 42649, + 42650 => 42651, + 42652 => 1098, + 42653 => 1100, + 42786 => 42787, + 42788 => 42789, + 42790 => 42791, + 42792 => 42793, + 42794 => 42795, + 42796 => 42797, + 42798 => 42799, + 42802 => 42803, + 42804 => 42805, + 42806 => 42807, + 42808 => 42809, + 42810 => 42811, + 42812 => 42813, + 42814 => 42815, + 42816 => 42817, + 42818 => 42819, + 42820 => 42821, + 42822 => 42823, + 42824 => 42825, + 42826 => 42827, + 42828 => 42829, + 42830 => 42831, + 42832 => 42833, + 42834 => 42835, + 42836 => 42837, + 42838 => 42839, + 42840 => 42841, + 42842 => 42843, + 42844 => 42845, + 42846 => 42847, + 42848 => 42849, + 42850 => 42851, + 42852 => 42853, + 42854 => 42855, + 42856 => 42857, + 42858 => 42859, + 42860 => 42861, + 42862 => 42863, + 42864 => 42863, + 42873 => 42874, + 42875 => 42876, + 42877 => 7545, + 42878 => 42879, + 42880 => 42881, + 42882 => 42883, + 42884 => 42885, + 42886 => 42887, + 42891 => 42892, + 42893 => 613, + 42896 => 42897, + 42898 => 42899, + 42902 => 42903, + 42904 => 42905, + 42906 => 42907, + 42908 => 42909, + 42910 => 42911, + 42912 => 42913, + 42914 => 42915, + 42916 => 42917, + 42918 => 42919, + 42920 => 42921, + 42922 => 614, + 42923 => 604, + 42924 => 609, + 42925 => 620, + 42926 => 618, + 42928 => 670, + 42929 => 647, + 42930 => 669, + 42931 => 43859, + 42932 => 42933, + 42934 => 42935, + 43000 => 295, + 43001 => 339, + 43868 => 42791, + 43869 => 43831, + 43870 => 619, + 43871 => 43858, + 43888 => 5024, + 43889 => 5025, + 43890 => 5026, + 43891 => 5027, + 43892 => 5028, + 43893 => 5029, + 43894 => 5030, + 43895 => 5031, + 43896 => 5032, + 43897 => 5033, + 43898 => 5034, + 43899 => 5035, + 43900 => 5036, + 43901 => 5037, + 43902 => 5038, + 43903 => 5039, + 43904 => 5040, + 43905 => 5041, + 43906 => 5042, + 43907 => 5043, + 43908 => 5044, + 43909 => 5045, + 43910 => 5046, + 43911 => 5047, + 43912 => 5048, + 43913 => 5049, + 43914 => 5050, + 43915 => 5051, + 43916 => 5052, + 43917 => 5053, + 43918 => 5054, + 43919 => 5055, + 43920 => 5056, + 43921 => 5057, + 43922 => 5058, + 43923 => 5059, + 43924 => 5060, + 43925 => 5061, + 43926 => 5062, + 43927 => 5063, + 43928 => 5064, + 43929 => 5065, + 43930 => 5066, + 43931 => 5067, + 43932 => 5068, + 43933 => 5069, + 43934 => 5070, + 43935 => 5071, + 43936 => 5072, + 43937 => 5073, + 43938 => 5074, + 43939 => 5075, + 43940 => 5076, + 43941 => 5077, + 43942 => 5078, + 43943 => 5079, + 43944 => 5080, + 43945 => 5081, + 43946 => 5082, + 43947 => 5083, + 43948 => 5084, + 43949 => 5085, + 43950 => 5086, + 43951 => 5087, + 43952 => 5088, + 43953 => 5089, + 43954 => 5090, + 43955 => 5091, + 43956 => 5092, + 43957 => 5093, + 43958 => 5094, + 43959 => 5095, + 43960 => 5096, + 43961 => 5097, + 43962 => 5098, + 43963 => 5099, + 43964 => 5100, + 43965 => 5101, + 43966 => 5102, + 43967 => 5103, + 63744 => 35912, + 63745 => 26356, + 63746 => 36554, + 63747 => 36040, + 63748 => 28369, + 63749 => 20018, + 63750 => 21477, + 63751 => 40860, + 63752 => 40860, + 63753 => 22865, + 63754 => 37329, + 63755 => 21895, + 63756 => 22856, + 63757 => 25078, + 63758 => 30313, + 63759 => 32645, + 63760 => 34367, + 63761 => 34746, + 63762 => 35064, + 63763 => 37007, + 63764 => 27138, + 63765 => 27931, + 63766 => 28889, + 63767 => 29662, + 63768 => 33853, + 63769 => 37226, + 63770 => 39409, + 63771 => 20098, + 63772 => 21365, + 63773 => 27396, + 63774 => 29211, + 63775 => 34349, + 63776 => 40478, + 63777 => 23888, + 63778 => 28651, + 63779 => 34253, + 63780 => 35172, + 63781 => 25289, + 63782 => 33240, + 63783 => 34847, + 63784 => 24266, + 63785 => 26391, + 63786 => 28010, + 63787 => 29436, + 63788 => 37070, + 63789 => 20358, + 63790 => 20919, + 63791 => 21214, + 63792 => 25796, + 63793 => 27347, + 63794 => 29200, + 63795 => 30439, + 63796 => 32769, + 63797 => 34310, + 63798 => 34396, + 63799 => 36335, + 63800 => 38706, + 63801 => 39791, + 63802 => 40442, + 63803 => 30860, + 63804 => 31103, + 63805 => 32160, + 63806 => 33737, + 63807 => 37636, + 63808 => 40575, + 63809 => 35542, + 63810 => 22751, + 63811 => 24324, + 63812 => 31840, + 63813 => 32894, + 63814 => 29282, + 63815 => 30922, + 63816 => 36034, + 63817 => 38647, + 63818 => 22744, + 63819 => 23650, + 63820 => 27155, + 63821 => 28122, + 63822 => 28431, + 63823 => 32047, + 63824 => 32311, + 63825 => 38475, + 63826 => 21202, + 63827 => 32907, + 63828 => 20956, + 63829 => 20940, + 63830 => 31260, + 63831 => 32190, + 63832 => 33777, + 63833 => 38517, + 63834 => 35712, + 63835 => 25295, + 63836 => 27138, + 63837 => 35582, + 63838 => 20025, + 63839 => 23527, + 63840 => 24594, + 63841 => 29575, + 63842 => 30064, + 63843 => 21271, + 63844 => 30971, + 63845 => 20415, + 63846 => 24489, + 63847 => 19981, + 63848 => 27852, + 63849 => 25976, + 63850 => 32034, + 63851 => 21443, + 63852 => 22622, + 63853 => 30465, + 63854 => 33865, + 63855 => 35498, + 63856 => 27578, + 63857 => 36784, + 63858 => 27784, + 63859 => 25342, + 63860 => 33509, + 63861 => 25504, + 63862 => 30053, + 63863 => 20142, + 63864 => 20841, + 63865 => 20937, + 63866 => 26753, + 63867 => 31975, + 63868 => 33391, + 63869 => 35538, + 63870 => 37327, + 63871 => 21237, + 63872 => 21570, + 63873 => 22899, + 63874 => 24300, + 63875 => 26053, + 63876 => 28670, + 63877 => 31018, + 63878 => 38317, + 63879 => 39530, + 63880 => 40599, + 63881 => 40654, + 63882 => 21147, + 63883 => 26310, + 63884 => 27511, + 63885 => 36706, + 63886 => 24180, + 63887 => 24976, + 63888 => 25088, + 63889 => 25754, + 63890 => 28451, + 63891 => 29001, + 63892 => 29833, + 63893 => 31178, + 63894 => 32244, + 63895 => 32879, + 63896 => 36646, + 63897 => 34030, + 63898 => 36899, + 63899 => 37706, + 63900 => 21015, + 63901 => 21155, + 63902 => 21693, + 63903 => 28872, + 63904 => 35010, + 63905 => 35498, + 63906 => 24265, + 63907 => 24565, + 63908 => 25467, + 63909 => 27566, + 63910 => 31806, + 63911 => 29557, + 63912 => 20196, + 63913 => 22265, + 63914 => 23527, + 63915 => 23994, + 63916 => 24604, + 63917 => 29618, + 63918 => 29801, + 63919 => 32666, + 63920 => 32838, + 63921 => 37428, + 63922 => 38646, + 63923 => 38728, + 63924 => 38936, + 63925 => 20363, + 63926 => 31150, + 63927 => 37300, + 63928 => 38584, + 63929 => 24801, + 63930 => 20102, + 63931 => 20698, + 63932 => 23534, + 63933 => 23615, + 63934 => 26009, + 63935 => 27138, + 63936 => 29134, + 63937 => 30274, + 63938 => 34044, + 63939 => 36988, + 63940 => 40845, + 63941 => 26248, + 63942 => 38446, + 63943 => 21129, + 63944 => 26491, + 63945 => 26611, + 63946 => 27969, + 63947 => 28316, + 63948 => 29705, + 63949 => 30041, + 63950 => 30827, + 63951 => 32016, + 63952 => 39006, + 63953 => 20845, + 63954 => 25134, + 63955 => 38520, + 63956 => 20523, + 63957 => 23833, + 63958 => 28138, + 63959 => 36650, + 63960 => 24459, + 63961 => 24900, + 63962 => 26647, + 63963 => 29575, + 63964 => 38534, + 63965 => 21033, + 63966 => 21519, + 63967 => 23653, + 63968 => 26131, + 63969 => 26446, + 63970 => 26792, + 63971 => 27877, + 63972 => 29702, + 63973 => 30178, + 63974 => 32633, + 63975 => 35023, + 63976 => 35041, + 63977 => 37324, + 63978 => 38626, + 63979 => 21311, + 63980 => 28346, + 63981 => 21533, + 63982 => 29136, + 63983 => 29848, + 63984 => 34298, + 63985 => 38563, + 63986 => 40023, + 63987 => 40607, + 63988 => 26519, + 63989 => 28107, + 63990 => 33256, + 63991 => 31435, + 63992 => 31520, + 63993 => 31890, + 63994 => 29376, + 63995 => 28825, + 63996 => 35672, + 63997 => 20160, + 63998 => 33590, + 63999 => 21050, + 64000 => 20999, + 64001 => 24230, + 64002 => 25299, + 64003 => 31958, + 64004 => 23429, + 64005 => 27934, + 64006 => 26292, + 64007 => 36667, + 64008 => 34892, + 64009 => 38477, + 64010 => 35211, + 64011 => 24275, + 64012 => 20800, + 64013 => 21952, + 64016 => 22618, + 64018 => 26228, + 64021 => 20958, + 64022 => 29482, + 64023 => 30410, + 64024 => 31036, + 64025 => 31070, + 64026 => 31077, + 64027 => 31119, + 64028 => 38742, + 64029 => 31934, + 64030 => 32701, + 64032 => 34322, + 64034 => 35576, + 64037 => 36920, + 64038 => 37117, + 64042 => 39151, + 64043 => 39164, + 64044 => 39208, + 64045 => 40372, + 64046 => 37086, + 64047 => 38583, + 64048 => 20398, + 64049 => 20711, + 64050 => 20813, + 64051 => 21193, + 64052 => 21220, + 64053 => 21329, + 64054 => 21917, + 64055 => 22022, + 64056 => 22120, + 64057 => 22592, + 64058 => 22696, + 64059 => 23652, + 64060 => 23662, + 64061 => 24724, + 64062 => 24936, + 64063 => 24974, + 64064 => 25074, + 64065 => 25935, + 64066 => 26082, + 64067 => 26257, + 64068 => 26757, + 64069 => 28023, + 64070 => 28186, + 64071 => 28450, + 64072 => 29038, + 64073 => 29227, + 64074 => 29730, + 64075 => 30865, + 64076 => 31038, + 64077 => 31049, + 64078 => 31048, + 64079 => 31056, + 64080 => 31062, + 64081 => 31069, + 64082 => 31117, + 64083 => 31118, + 64084 => 31296, + 64085 => 31361, + 64086 => 31680, + 64087 => 32244, + 64088 => 32265, + 64089 => 32321, + 64090 => 32626, + 64091 => 32773, + 64092 => 33261, + 64093 => 33401, + 64094 => 33401, + 64095 => 33879, + 64096 => 35088, + 64097 => 35222, + 64098 => 35585, + 64099 => 35641, + 64100 => 36051, + 64101 => 36104, + 64102 => 36790, + 64103 => 36920, + 64104 => 38627, + 64105 => 38911, + 64106 => 38971, + 64107 => 24693, + 64108 => 148206, + 64109 => 33304, + 64112 => 20006, + 64113 => 20917, + 64114 => 20840, + 64115 => 20352, + 64116 => 20805, + 64117 => 20864, + 64118 => 21191, + 64119 => 21242, + 64120 => 21917, + 64121 => 21845, + 64122 => 21913, + 64123 => 21986, + 64124 => 22618, + 64125 => 22707, + 64126 => 22852, + 64127 => 22868, + 64128 => 23138, + 64129 => 23336, + 64130 => 24274, + 64131 => 24281, + 64132 => 24425, + 64133 => 24493, + 64134 => 24792, + 64135 => 24910, + 64136 => 24840, + 64137 => 24974, + 64138 => 24928, + 64139 => 25074, + 64140 => 25140, + 64141 => 25540, + 64142 => 25628, + 64143 => 25682, + 64144 => 25942, + 64145 => 26228, + 64146 => 26391, + 64147 => 26395, + 64148 => 26454, + 64149 => 27513, + 64150 => 27578, + 64151 => 27969, + 64152 => 28379, + 64153 => 28363, + 64154 => 28450, + 64155 => 28702, + 64156 => 29038, + 64157 => 30631, + 64158 => 29237, + 64159 => 29359, + 64160 => 29482, + 64161 => 29809, + 64162 => 29958, + 64163 => 30011, + 64164 => 30237, + 64165 => 30239, + 64166 => 30410, + 64167 => 30427, + 64168 => 30452, + 64169 => 30538, + 64170 => 30528, + 64171 => 30924, + 64172 => 31409, + 64173 => 31680, + 64174 => 31867, + 64175 => 32091, + 64176 => 32244, + 64177 => 32574, + 64178 => 32773, + 64179 => 33618, + 64180 => 33775, + 64181 => 34681, + 64182 => 35137, + 64183 => 35206, + 64184 => 35222, + 64185 => 35519, + 64186 => 35576, + 64187 => 35531, + 64188 => 35585, + 64189 => 35582, + 64190 => 35565, + 64191 => 35641, + 64192 => 35722, + 64193 => 36104, + 64194 => 36664, + 64195 => 36978, + 64196 => 37273, + 64197 => 37494, + 64198 => 38524, + 64199 => 38627, + 64200 => 38742, + 64201 => 38875, + 64202 => 38911, + 64203 => 38923, + 64204 => 38971, + 64205 => 39698, + 64206 => 40860, + 64207 => 141386, + 64208 => 141380, + 64209 => 144341, + 64210 => 15261, + 64211 => 16408, + 64212 => 16441, + 64213 => 152137, + 64214 => 154832, + 64215 => 163539, + 64216 => 40771, + 64217 => 40846, + 64256 => [102, 102], + 64257 => [102, 105], + 64258 => [102, 108], + 64259 => [102, 102, 105], + 64260 => [102, 102, 108], + 64261 => [115, 116], + 64262 => [115, 116], + 64275 => [1396, 1398], + 64276 => [1396, 1381], + 64277 => [1396, 1387], + 64278 => [1406, 1398], + 64279 => [1396, 1389], + 64285 => [1497, 1460], + 64287 => [1522, 1463], + 64288 => 1506, + 64289 => 1488, + 64290 => 1491, + 64291 => 1492, + 64292 => 1499, + 64293 => 1500, + 64294 => 1501, + 64295 => 1512, + 64296 => 1514, + 64297 => 43, + 64298 => [1513, 1473], + 64299 => [1513, 1474], + 64300 => [1513, 1468, 1473], + 64301 => [1513, 1468, 1474], + 64302 => [1488, 1463], + 64303 => [1488, 1464], + 64304 => [1488, 1468], + 64305 => [1489, 1468], + 64306 => [1490, 1468], + 64307 => [1491, 1468], + 64308 => [1492, 1468], + 64309 => [1493, 1468], + 64310 => [1494, 1468], + 64312 => [1496, 1468], + 64313 => [1497, 1468], + 64314 => [1498, 1468], + 64315 => [1499, 1468], + 64316 => [1500, 1468], + 64318 => [1502, 1468], + 64320 => [1504, 1468], + 64321 => [1505, 1468], + 64323 => [1507, 1468], + 64324 => [1508, 1468], + 64326 => [1510, 1468], + 64327 => [1511, 1468], + 64328 => [1512, 1468], + 64329 => [1513, 1468], + 64330 => [1514, 1468], + 64331 => [1493, 1465], + 64332 => [1489, 1471], + 64333 => [1499, 1471], + 64334 => [1508, 1471], + 64335 => [1488, 1500], + 64336 => 1649, + 64337 => 1649, + 64338 => 1659, + 64339 => 1659, + 64340 => 1659, + 64341 => 1659, + 64342 => 1662, + 64343 => 1662, + 64344 => 1662, + 64345 => 1662, + 64346 => 1664, + 64347 => 1664, + 64348 => 1664, + 64349 => 1664, + 64350 => 1658, + 64351 => 1658, + 64352 => 1658, + 64353 => 1658, + 64354 => 1663, + 64355 => 1663, + 64356 => 1663, + 64357 => 1663, + 64358 => 1657, + 64359 => 1657, + 64360 => 1657, + 64361 => 1657, + 64362 => 1700, + 64363 => 1700, + 64364 => 1700, + 64365 => 1700, + 64366 => 1702, + 64367 => 1702, + 64368 => 1702, + 64369 => 1702, + 64370 => 1668, + 64371 => 1668, + 64372 => 1668, + 64373 => 1668, + 64374 => 1667, + 64375 => 1667, + 64376 => 1667, + 64377 => 1667, + 64378 => 1670, + 64379 => 1670, + 64380 => 1670, + 64381 => 1670, + 64382 => 1671, + 64383 => 1671, + 64384 => 1671, + 64385 => 1671, + 64386 => 1677, + 64387 => 1677, + 64388 => 1676, + 64389 => 1676, + 64390 => 1678, + 64391 => 1678, + 64392 => 1672, + 64393 => 1672, + 64394 => 1688, + 64395 => 1688, + 64396 => 1681, + 64397 => 1681, + 64398 => 1705, + 64399 => 1705, + 64400 => 1705, + 64401 => 1705, + 64402 => 1711, + 64403 => 1711, + 64404 => 1711, + 64405 => 1711, + 64406 => 1715, + 64407 => 1715, + 64408 => 1715, + 64409 => 1715, + 64410 => 1713, + 64411 => 1713, + 64412 => 1713, + 64413 => 1713, + 64414 => 1722, + 64415 => 1722, + 64416 => 1723, + 64417 => 1723, + 64418 => 1723, + 64419 => 1723, + 64420 => 1728, + 64421 => 1728, + 64422 => 1729, + 64423 => 1729, + 64424 => 1729, + 64425 => 1729, + 64426 => 1726, + 64427 => 1726, + 64428 => 1726, + 64429 => 1726, + 64430 => 1746, + 64431 => 1746, + 64432 => 1747, + 64433 => 1747, + 64467 => 1709, + 64468 => 1709, + 64469 => 1709, + 64470 => 1709, + 64471 => 1735, + 64472 => 1735, + 64473 => 1734, + 64474 => 1734, + 64475 => 1736, + 64476 => 1736, + 64477 => [1735, 1652], + 64478 => 1739, + 64479 => 1739, + 64480 => 1733, + 64481 => 1733, + 64482 => 1737, + 64483 => 1737, + 64484 => 1744, + 64485 => 1744, + 64486 => 1744, + 64487 => 1744, + 64488 => 1609, + 64489 => 1609, + 64490 => [1574, 1575], + 64491 => [1574, 1575], + 64492 => [1574, 1749], + 64493 => [1574, 1749], + 64494 => [1574, 1608], + 64495 => [1574, 1608], + 64496 => [1574, 1735], + 64497 => [1574, 1735], + 64498 => [1574, 1734], + 64499 => [1574, 1734], + 64500 => [1574, 1736], + 64501 => [1574, 1736], + 64502 => [1574, 1744], + 64503 => [1574, 1744], + 64504 => [1574, 1744], + 64505 => [1574, 1609], + 64506 => [1574, 1609], + 64507 => [1574, 1609], + 64508 => 1740, + 64509 => 1740, + 64510 => 1740, + 64511 => 1740, + 64512 => [1574, 1580], + 64513 => [1574, 1581], + 64514 => [1574, 1605], + 64515 => [1574, 1609], + 64516 => [1574, 1610], + 64517 => [1576, 1580], + 64518 => [1576, 1581], + 64519 => [1576, 1582], + 64520 => [1576, 1605], + 64521 => [1576, 1609], + 64522 => [1576, 1610], + 64523 => [1578, 1580], + 64524 => [1578, 1581], + 64525 => [1578, 1582], + 64526 => [1578, 1605], + 64527 => [1578, 1609], + 64528 => [1578, 1610], + 64529 => [1579, 1580], + 64530 => [1579, 1605], + 64531 => [1579, 1609], + 64532 => [1579, 1610], + 64533 => [1580, 1581], + 64534 => [1580, 1605], + 64535 => [1581, 1580], + 64536 => [1581, 1605], + 64537 => [1582, 1580], + 64538 => [1582, 1581], + 64539 => [1582, 1605], + 64540 => [1587, 1580], + 64541 => [1587, 1581], + 64542 => [1587, 1582], + 64543 => [1587, 1605], + 64544 => [1589, 1581], + 64545 => [1589, 1605], + 64546 => [1590, 1580], + 64547 => [1590, 1581], + 64548 => [1590, 1582], + 64549 => [1590, 1605], + 64550 => [1591, 1581], + 64551 => [1591, 1605], + 64552 => [1592, 1605], + 64553 => [1593, 1580], + 64554 => [1593, 1605], + 64555 => [1594, 1580], + 64556 => [1594, 1605], + 64557 => [1601, 1580], + 64558 => [1601, 1581], + 64559 => [1601, 1582], + 64560 => [1601, 1605], + 64561 => [1601, 1609], + 64562 => [1601, 1610], + 64563 => [1602, 1581], + 64564 => [1602, 1605], + 64565 => [1602, 1609], + 64566 => [1602, 1610], + 64567 => [1603, 1575], + 64568 => [1603, 1580], + 64569 => [1603, 1581], + 64570 => [1603, 1582], + 64571 => [1603, 1604], + 64572 => [1603, 1605], + 64573 => [1603, 1609], + 64574 => [1603, 1610], + 64575 => [1604, 1580], + 64576 => [1604, 1581], + 64577 => [1604, 1582], + 64578 => [1604, 1605], + 64579 => [1604, 1609], + 64580 => [1604, 1610], + 64581 => [1605, 1580], + 64582 => [1605, 1581], + 64583 => [1605, 1582], + 64584 => [1605, 1605], + 64585 => [1605, 1609], + 64586 => [1605, 1610], + 64587 => [1606, 1580], + 64588 => [1606, 1581], + 64589 => [1606, 1582], + 64590 => [1606, 1605], + 64591 => [1606, 1609], + 64592 => [1606, 1610], + 64593 => [1607, 1580], + 64594 => [1607, 1605], + 64595 => [1607, 1609], + 64596 => [1607, 1610], + 64597 => [1610, 1580], + 64598 => [1610, 1581], + 64599 => [1610, 1582], + 64600 => [1610, 1605], + 64601 => [1610, 1609], + 64602 => [1610, 1610], + 64603 => [1584, 1648], + 64604 => [1585, 1648], + 64605 => [1609, 1648], + 64606 => [32, 1612, 1617], + 64607 => [32, 1613, 1617], + 64608 => [32, 1614, 1617], + 64609 => [32, 1615, 1617], + 64610 => [32, 1616, 1617], + 64611 => [32, 1617, 1648], + 64612 => [1574, 1585], + 64613 => [1574, 1586], + 64614 => [1574, 1605], + 64615 => [1574, 1606], + 64616 => [1574, 1609], + 64617 => [1574, 1610], + 64618 => [1576, 1585], + 64619 => [1576, 1586], + 64620 => [1576, 1605], + 64621 => [1576, 1606], + 64622 => [1576, 1609], + 64623 => [1576, 1610], + 64624 => [1578, 1585], + 64625 => [1578, 1586], + 64626 => [1578, 1605], + 64627 => [1578, 1606], + 64628 => [1578, 1609], + 64629 => [1578, 1610], + 64630 => [1579, 1585], + 64631 => [1579, 1586], + 64632 => [1579, 1605], + 64633 => [1579, 1606], + 64634 => [1579, 1609], + 64635 => [1579, 1610], + 64636 => [1601, 1609], + 64637 => [1601, 1610], + 64638 => [1602, 1609], + 64639 => [1602, 1610], + 64640 => [1603, 1575], + 64641 => [1603, 1604], + 64642 => [1603, 1605], + 64643 => [1603, 1609], + 64644 => [1603, 1610], + 64645 => [1604, 1605], + 64646 => [1604, 1609], + 64647 => [1604, 1610], + 64648 => [1605, 1575], + 64649 => [1605, 1605], + 64650 => [1606, 1585], + 64651 => [1606, 1586], + 64652 => [1606, 1605], + 64653 => [1606, 1606], + 64654 => [1606, 1609], + 64655 => [1606, 1610], + 64656 => [1609, 1648], + 64657 => [1610, 1585], + 64658 => [1610, 1586], + 64659 => [1610, 1605], + 64660 => [1610, 1606], + 64661 => [1610, 1609], + 64662 => [1610, 1610], + 64663 => [1574, 1580], + 64664 => [1574, 1581], + 64665 => [1574, 1582], + 64666 => [1574, 1605], + 64667 => [1574, 1607], + 64668 => [1576, 1580], + 64669 => [1576, 1581], + 64670 => [1576, 1582], + 64671 => [1576, 1605], + 64672 => [1576, 1607], + 64673 => [1578, 1580], + 64674 => [1578, 1581], + 64675 => [1578, 1582], + 64676 => [1578, 1605], + 64677 => [1578, 1607], + 64678 => [1579, 1605], + 64679 => [1580, 1581], + 64680 => [1580, 1605], + 64681 => [1581, 1580], + 64682 => [1581, 1605], + 64683 => [1582, 1580], + 64684 => [1582, 1605], + 64685 => [1587, 1580], + 64686 => [1587, 1581], + 64687 => [1587, 1582], + 64688 => [1587, 1605], + 64689 => [1589, 1581], + 64690 => [1589, 1582], + 64691 => [1589, 1605], + 64692 => [1590, 1580], + 64693 => [1590, 1581], + 64694 => [1590, 1582], + 64695 => [1590, 1605], + 64696 => [1591, 1581], + 64697 => [1592, 1605], + 64698 => [1593, 1580], + 64699 => [1593, 1605], + 64700 => [1594, 1580], + 64701 => [1594, 1605], + 64702 => [1601, 1580], + 64703 => [1601, 1581], + 64704 => [1601, 1582], + 64705 => [1601, 1605], + 64706 => [1602, 1581], + 64707 => [1602, 1605], + 64708 => [1603, 1580], + 64709 => [1603, 1581], + 64710 => [1603, 1582], + 64711 => [1603, 1604], + 64712 => [1603, 1605], + 64713 => [1604, 1580], + 64714 => [1604, 1581], + 64715 => [1604, 1582], + 64716 => [1604, 1605], + 64717 => [1604, 1607], + 64718 => [1605, 1580], + 64719 => [1605, 1581], + 64720 => [1605, 1582], + 64721 => [1605, 1605], + 64722 => [1606, 1580], + 64723 => [1606, 1581], + 64724 => [1606, 1582], + 64725 => [1606, 1605], + 64726 => [1606, 1607], + 64727 => [1607, 1580], + 64728 => [1607, 1605], + 64729 => [1607, 1648], + 64730 => [1610, 1580], + 64731 => [1610, 1581], + 64732 => [1610, 1582], + 64733 => [1610, 1605], + 64734 => [1610, 1607], + 64735 => [1574, 1605], + 64736 => [1574, 1607], + 64737 => [1576, 1605], + 64738 => [1576, 1607], + 64739 => [1578, 1605], + 64740 => [1578, 1607], + 64741 => [1579, 1605], + 64742 => [1579, 1607], + 64743 => [1587, 1605], + 64744 => [1587, 1607], + 64745 => [1588, 1605], + 64746 => [1588, 1607], + 64747 => [1603, 1604], + 64748 => [1603, 1605], + 64749 => [1604, 1605], + 64750 => [1606, 1605], + 64751 => [1606, 1607], + 64752 => [1610, 1605], + 64753 => [1610, 1607], + 64754 => [1600, 1614, 1617], + 64755 => [1600, 1615, 1617], + 64756 => [1600, 1616, 1617], + 64757 => [1591, 1609], + 64758 => [1591, 1610], + 64759 => [1593, 1609], + 64760 => [1593, 1610], + 64761 => [1594, 1609], + 64762 => [1594, 1610], + 64763 => [1587, 1609], + 64764 => [1587, 1610], + 64765 => [1588, 1609], + 64766 => [1588, 1610], + 64767 => [1581, 1609], + 64768 => [1581, 1610], + 64769 => [1580, 1609], + 64770 => [1580, 1610], + 64771 => [1582, 1609], + 64772 => [1582, 1610], + 64773 => [1589, 1609], + 64774 => [1589, 1610], + 64775 => [1590, 1609], + 64776 => [1590, 1610], + 64777 => [1588, 1580], + 64778 => [1588, 1581], + 64779 => [1588, 1582], + 64780 => [1588, 1605], + 64781 => [1588, 1585], + 64782 => [1587, 1585], + 64783 => [1589, 1585], + 64784 => [1590, 1585], + 64785 => [1591, 1609], + 64786 => [1591, 1610], + 64787 => [1593, 1609], + 64788 => [1593, 1610], + 64789 => [1594, 1609], + 64790 => [1594, 1610], + 64791 => [1587, 1609], + 64792 => [1587, 1610], + 64793 => [1588, 1609], + 64794 => [1588, 1610], + 64795 => [1581, 1609], + 64796 => [1581, 1610], + 64797 => [1580, 1609], + 64798 => [1580, 1610], + 64799 => [1582, 1609], + 64800 => [1582, 1610], + 64801 => [1589, 1609], + 64802 => [1589, 1610], + 64803 => [1590, 1609], + 64804 => [1590, 1610], + 64805 => [1588, 1580], + 64806 => [1588, 1581], + 64807 => [1588, 1582], + 64808 => [1588, 1605], + 64809 => [1588, 1585], + 64810 => [1587, 1585], + 64811 => [1589, 1585], + 64812 => [1590, 1585], + 64813 => [1588, 1580], + 64814 => [1588, 1581], + 64815 => [1588, 1582], + 64816 => [1588, 1605], + 64817 => [1587, 1607], + 64818 => [1588, 1607], + 64819 => [1591, 1605], + 64820 => [1587, 1580], + 64821 => [1587, 1581], + 64822 => [1587, 1582], + 64823 => [1588, 1580], + 64824 => [1588, 1581], + 64825 => [1588, 1582], + 64826 => [1591, 1605], + 64827 => [1592, 1605], + 64828 => [1575, 1611], + 64829 => [1575, 1611], + 64848 => [1578, 1580, 1605], + 64849 => [1578, 1581, 1580], + 64850 => [1578, 1581, 1580], + 64851 => [1578, 1581, 1605], + 64852 => [1578, 1582, 1605], + 64853 => [1578, 1605, 1580], + 64854 => [1578, 1605, 1581], + 64855 => [1578, 1605, 1582], + 64856 => [1580, 1605, 1581], + 64857 => [1580, 1605, 1581], + 64858 => [1581, 1605, 1610], + 64859 => [1581, 1605, 1609], + 64860 => [1587, 1581, 1580], + 64861 => [1587, 1580, 1581], + 64862 => [1587, 1580, 1609], + 64863 => [1587, 1605, 1581], + 64864 => [1587, 1605, 1581], + 64865 => [1587, 1605, 1580], + 64866 => [1587, 1605, 1605], + 64867 => [1587, 1605, 1605], + 64868 => [1589, 1581, 1581], + 64869 => [1589, 1581, 1581], + 64870 => [1589, 1605, 1605], + 64871 => [1588, 1581, 1605], + 64872 => [1588, 1581, 1605], + 64873 => [1588, 1580, 1610], + 64874 => [1588, 1605, 1582], + 64875 => [1588, 1605, 1582], + 64876 => [1588, 1605, 1605], + 64877 => [1588, 1605, 1605], + 64878 => [1590, 1581, 1609], + 64879 => [1590, 1582, 1605], + 64880 => [1590, 1582, 1605], + 64881 => [1591, 1605, 1581], + 64882 => [1591, 1605, 1581], + 64883 => [1591, 1605, 1605], + 64884 => [1591, 1605, 1610], + 64885 => [1593, 1580, 1605], + 64886 => [1593, 1605, 1605], + 64887 => [1593, 1605, 1605], + 64888 => [1593, 1605, 1609], + 64889 => [1594, 1605, 1605], + 64890 => [1594, 1605, 1610], + 64891 => [1594, 1605, 1609], + 64892 => [1601, 1582, 1605], + 64893 => [1601, 1582, 1605], + 64894 => [1602, 1605, 1581], + 64895 => [1602, 1605, 1605], + 64896 => [1604, 1581, 1605], + 64897 => [1604, 1581, 1610], + 64898 => [1604, 1581, 1609], + 64899 => [1604, 1580, 1580], + 64900 => [1604, 1580, 1580], + 64901 => [1604, 1582, 1605], + 64902 => [1604, 1582, 1605], + 64903 => [1604, 1605, 1581], + 64904 => [1604, 1605, 1581], + 64905 => [1605, 1581, 1580], + 64906 => [1605, 1581, 1605], + 64907 => [1605, 1581, 1610], + 64908 => [1605, 1580, 1581], + 64909 => [1605, 1580, 1605], + 64910 => [1605, 1582, 1580], + 64911 => [1605, 1582, 1605], + 64914 => [1605, 1580, 1582], + 64915 => [1607, 1605, 1580], + 64916 => [1607, 1605, 1605], + 64917 => [1606, 1581, 1605], + 64918 => [1606, 1581, 1609], + 64919 => [1606, 1580, 1605], + 64920 => [1606, 1580, 1605], + 64921 => [1606, 1580, 1609], + 64922 => [1606, 1605, 1610], + 64923 => [1606, 1605, 1609], + 64924 => [1610, 1605, 1605], + 64925 => [1610, 1605, 1605], + 64926 => [1576, 1582, 1610], + 64927 => [1578, 1580, 1610], + 64928 => [1578, 1580, 1609], + 64929 => [1578, 1582, 1610], + 64930 => [1578, 1582, 1609], + 64931 => [1578, 1605, 1610], + 64932 => [1578, 1605, 1609], + 64933 => [1580, 1605, 1610], + 64934 => [1580, 1581, 1609], + 64935 => [1580, 1605, 1609], + 64936 => [1587, 1582, 1609], + 64937 => [1589, 1581, 1610], + 64938 => [1588, 1581, 1610], + 64939 => [1590, 1581, 1610], + 64940 => [1604, 1580, 1610], + 64941 => [1604, 1605, 1610], + 64942 => [1610, 1581, 1610], + 64943 => [1610, 1580, 1610], + 64944 => [1610, 1605, 1610], + 64945 => [1605, 1605, 1610], + 64946 => [1602, 1605, 1610], + 64947 => [1606, 1581, 1610], + 64948 => [1602, 1605, 1581], + 64949 => [1604, 1581, 1605], + 64950 => [1593, 1605, 1610], + 64951 => [1603, 1605, 1610], + 64952 => [1606, 1580, 1581], + 64953 => [1605, 1582, 1610], + 64954 => [1604, 1580, 1605], + 64955 => [1603, 1605, 1605], + 64956 => [1604, 1580, 1605], + 64957 => [1606, 1580, 1581], + 64958 => [1580, 1581, 1610], + 64959 => [1581, 1580, 1610], + 64960 => [1605, 1580, 1610], + 64961 => [1601, 1605, 1610], + 64962 => [1576, 1581, 1610], + 64963 => [1603, 1605, 1605], + 64964 => [1593, 1580, 1605], + 64965 => [1589, 1605, 1605], + 64966 => [1587, 1582, 1610], + 64967 => [1606, 1580, 1610], + 65008 => [1589, 1604, 1746], + 65009 => [1602, 1604, 1746], + 65010 => [1575, 1604, 1604, 1607], + 65011 => [1575, 1603, 1576, 1585], + 65012 => [1605, 1581, 1605, 1583], + 65013 => [1589, 1604, 1593, 1605], + 65014 => [1585, 1587, 1608, 1604], + 65015 => [1593, 1604, 1610, 1607], + 65016 => [1608, 1587, 1604, 1605], + 65017 => [1589, 1604, 1609], + 65018 => [1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605], + 65019 => [1580, 1604, 32, 1580, 1604, 1575, 1604, 1607], + 65020 => [1585, 1740, 1575, 1604], + 65024 => [], + 65025 => [], + 65026 => [], + 65027 => [], + 65028 => [], + 65029 => [], + 65030 => [], + 65031 => [], + 65032 => [], + 65033 => [], + 65034 => [], + 65035 => [], + 65036 => [], + 65037 => [], + 65038 => [], + 65039 => [], + 65040 => 44, + 65041 => 12289, + 65043 => 58, + 65044 => 59, + 65045 => 33, + 65046 => 63, + 65047 => 12310, + 65048 => 12311, + 65073 => 8212, + 65074 => 8211, + 65075 => 95, + 65076 => 95, + 65077 => 40, + 65078 => 41, + 65079 => 123, + 65080 => 125, + 65081 => 12308, + 65082 => 12309, + 65083 => 12304, + 65084 => 12305, + 65085 => 12298, + 65086 => 12299, + 65087 => 12296, + 65088 => 12297, + 65089 => 12300, + 65090 => 12301, + 65091 => 12302, + 65092 => 12303, + 65095 => 91, + 65096 => 93, + 65097 => [32, 773], + 65098 => [32, 773], + 65099 => [32, 773], + 65100 => [32, 773], + 65101 => 95, + 65102 => 95, + 65103 => 95, + 65104 => 44, + 65105 => 12289, + 65108 => 59, + 65109 => 58, + 65110 => 63, + 65111 => 33, + 65112 => 8212, + 65113 => 40, + 65114 => 41, + 65115 => 123, + 65116 => 125, + 65117 => 12308, + 65118 => 12309, + 65119 => 35, + 65120 => 38, + 65121 => 42, + 65122 => 43, + 65123 => 45, + 65124 => 60, + 65125 => 62, + 65126 => 61, + 65128 => 92, + 65129 => 36, + 65130 => 37, + 65131 => 64, + 65136 => [32, 1611], + 65137 => [1600, 1611], + 65138 => [32, 1612], + 65140 => [32, 1613], + 65142 => [32, 1614], + 65143 => [1600, 1614], + 65144 => [32, 1615], + 65145 => [1600, 1615], + 65146 => [32, 1616], + 65147 => [1600, 1616], + 65148 => [32, 1617], + 65149 => [1600, 1617], + 65150 => [32, 1618], + 65151 => [1600, 1618], + 65152 => 1569, + 65153 => 1570, + 65154 => 1570, + 65155 => 1571, + 65156 => 1571, + 65157 => 1572, + 65158 => 1572, + 65159 => 1573, + 65160 => 1573, + 65161 => 1574, + 65162 => 1574, + 65163 => 1574, + 65164 => 1574, + 65165 => 1575, + 65166 => 1575, + 65167 => 1576, + 65168 => 1576, + 65169 => 1576, + 65170 => 1576, + 65171 => 1577, + 65172 => 1577, + 65173 => 1578, + 65174 => 1578, + 65175 => 1578, + 65176 => 1578, + 65177 => 1579, + 65178 => 1579, + 65179 => 1579, + 65180 => 1579, + 65181 => 1580, + 65182 => 1580, + 65183 => 1580, + 65184 => 1580, + 65185 => 1581, + 65186 => 1581, + 65187 => 1581, + 65188 => 1581, + 65189 => 1582, + 65190 => 1582, + 65191 => 1582, + 65192 => 1582, + 65193 => 1583, + 65194 => 1583, + 65195 => 1584, + 65196 => 1584, + 65197 => 1585, + 65198 => 1585, + 65199 => 1586, + 65200 => 1586, + 65201 => 1587, + 65202 => 1587, + 65203 => 1587, + 65204 => 1587, + 65205 => 1588, + 65206 => 1588, + 65207 => 1588, + 65208 => 1588, + 65209 => 1589, + 65210 => 1589, + 65211 => 1589, + 65212 => 1589, + 65213 => 1590, + 65214 => 1590, + 65215 => 1590, + 65216 => 1590, + 65217 => 1591, + 65218 => 1591, + 65219 => 1591, + 65220 => 1591, + 65221 => 1592, + 65222 => 1592, + 65223 => 1592, + 65224 => 1592, + 65225 => 1593, + 65226 => 1593, + 65227 => 1593, + 65228 => 1593, + 65229 => 1594, + 65230 => 1594, + 65231 => 1594, + 65232 => 1594, + 65233 => 1601, + 65234 => 1601, + 65235 => 1601, + 65236 => 1601, + 65237 => 1602, + 65238 => 1602, + 65239 => 1602, + 65240 => 1602, + 65241 => 1603, + 65242 => 1603, + 65243 => 1603, + 65244 => 1603, + 65245 => 1604, + 65246 => 1604, + 65247 => 1604, + 65248 => 1604, + 65249 => 1605, + 65250 => 1605, + 65251 => 1605, + 65252 => 1605, + 65253 => 1606, + 65254 => 1606, + 65255 => 1606, + 65256 => 1606, + 65257 => 1607, + 65258 => 1607, + 65259 => 1607, + 65260 => 1607, + 65261 => 1608, + 65262 => 1608, + 65263 => 1609, + 65264 => 1609, + 65265 => 1610, + 65266 => 1610, + 65267 => 1610, + 65268 => 1610, + 65269 => [1604, 1570], + 65270 => [1604, 1570], + 65271 => [1604, 1571], + 65272 => [1604, 1571], + 65273 => [1604, 1573], + 65274 => [1604, 1573], + 65275 => [1604, 1575], + 65276 => [1604, 1575], + 65279 => [], + 65281 => 33, + 65282 => 34, + 65283 => 35, + 65284 => 36, + 65285 => 37, + 65286 => 38, + 65287 => 39, + 65288 => 40, + 65289 => 41, + 65290 => 42, + 65291 => 43, + 65292 => 44, + 65293 => 45, + 65294 => 46, + 65295 => 47, + 65296 => 48, + 65297 => 49, + 65298 => 50, + 65299 => 51, + 65300 => 52, + 65301 => 53, + 65302 => 54, + 65303 => 55, + 65304 => 56, + 65305 => 57, + 65306 => 58, + 65307 => 59, + 65308 => 60, + 65309 => 61, + 65310 => 62, + 65311 => 63, + 65312 => 64, + 65313 => 97, + 65314 => 98, + 65315 => 99, + 65316 => 100, + 65317 => 101, + 65318 => 102, + 65319 => 103, + 65320 => 104, + 65321 => 105, + 65322 => 106, + 65323 => 107, + 65324 => 108, + 65325 => 109, + 65326 => 110, + 65327 => 111, + 65328 => 112, + 65329 => 113, + 65330 => 114, + 65331 => 115, + 65332 => 116, + 65333 => 117, + 65334 => 118, + 65335 => 119, + 65336 => 120, + 65337 => 121, + 65338 => 122, + 65339 => 91, + 65340 => 92, + 65341 => 93, + 65342 => 94, + 65343 => 95, + 65344 => 96, + 65345 => 97, + 65346 => 98, + 65347 => 99, + 65348 => 100, + 65349 => 101, + 65350 => 102, + 65351 => 103, + 65352 => 104, + 65353 => 105, + 65354 => 106, + 65355 => 107, + 65356 => 108, + 65357 => 109, + 65358 => 110, + 65359 => 111, + 65360 => 112, + 65361 => 113, + 65362 => 114, + 65363 => 115, + 65364 => 116, + 65365 => 117, + 65366 => 118, + 65367 => 119, + 65368 => 120, + 65369 => 121, + 65370 => 122, + 65371 => 123, + 65372 => 124, + 65373 => 125, + 65374 => 126, + 65375 => 10629, + 65376 => 10630, + 65377 => 46, + 65378 => 12300, + 65379 => 12301, + 65380 => 12289, + 65381 => 12539, + 65382 => 12530, + 65383 => 12449, + 65384 => 12451, + 65385 => 12453, + 65386 => 12455, + 65387 => 12457, + 65388 => 12515, + 65389 => 12517, + 65390 => 12519, + 65391 => 12483, + 65392 => 12540, + 65393 => 12450, + 65394 => 12452, + 65395 => 12454, + 65396 => 12456, + 65397 => 12458, + 65398 => 12459, + 65399 => 12461, + 65400 => 12463, + 65401 => 12465, + 65402 => 12467, + 65403 => 12469, + 65404 => 12471, + 65405 => 12473, + 65406 => 12475, + 65407 => 12477, + 65408 => 12479, + 65409 => 12481, + 65410 => 12484, + 65411 => 12486, + 65412 => 12488, + 65413 => 12490, + 65414 => 12491, + 65415 => 12492, + 65416 => 12493, + 65417 => 12494, + 65418 => 12495, + 65419 => 12498, + 65420 => 12501, + 65421 => 12504, + 65422 => 12507, + 65423 => 12510, + 65424 => 12511, + 65425 => 12512, + 65426 => 12513, + 65427 => 12514, + 65428 => 12516, + 65429 => 12518, + 65430 => 12520, + 65431 => 12521, + 65432 => 12522, + 65433 => 12523, + 65434 => 12524, + 65435 => 12525, + 65436 => 12527, + 65437 => 12531, + 65438 => 12441, + 65439 => 12442, + 65441 => 4352, + 65442 => 4353, + 65443 => 4522, + 65444 => 4354, + 65445 => 4524, + 65446 => 4525, + 65447 => 4355, + 65448 => 4356, + 65449 => 4357, + 65450 => 4528, + 65451 => 4529, + 65452 => 4530, + 65453 => 4531, + 65454 => 4532, + 65455 => 4533, + 65456 => 4378, + 65457 => 4358, + 65458 => 4359, + 65459 => 4360, + 65460 => 4385, + 65461 => 4361, + 65462 => 4362, + 65463 => 4363, + 65464 => 4364, + 65465 => 4365, + 65466 => 4366, + 65467 => 4367, + 65468 => 4368, + 65469 => 4369, + 65470 => 4370, + 65474 => 4449, + 65475 => 4450, + 65476 => 4451, + 65477 => 4452, + 65478 => 4453, + 65479 => 4454, + 65482 => 4455, + 65483 => 4456, + 65484 => 4457, + 65485 => 4458, + 65486 => 4459, + 65487 => 4460, + 65490 => 4461, + 65491 => 4462, + 65492 => 4463, + 65493 => 4464, + 65494 => 4465, + 65495 => 4466, + 65498 => 4467, + 65499 => 4468, + 65500 => 4469, + 65504 => 162, + 65505 => 163, + 65506 => 172, + 65507 => [32, 772], + 65508 => 166, + 65509 => 165, + 65510 => 8361, + 65512 => 9474, + 65513 => 8592, + 65514 => 8593, + 65515 => 8594, + 65516 => 8595, + 65517 => 9632, + 65518 => 9675, + 66560 => 66600, + 66561 => 66601, + 66562 => 66602, + 66563 => 66603, + 66564 => 66604, + 66565 => 66605, + 66566 => 66606, + 66567 => 66607, + 66568 => 66608, + 66569 => 66609, + 66570 => 66610, + 66571 => 66611, + 66572 => 66612, + 66573 => 66613, + 66574 => 66614, + 66575 => 66615, + 66576 => 66616, + 66577 => 66617, + 66578 => 66618, + 66579 => 66619, + 66580 => 66620, + 66581 => 66621, + 66582 => 66622, + 66583 => 66623, + 66584 => 66624, + 66585 => 66625, + 66586 => 66626, + 66587 => 66627, + 66588 => 66628, + 66589 => 66629, + 66590 => 66630, + 66591 => 66631, + 66592 => 66632, + 66593 => 66633, + 66594 => 66634, + 66595 => 66635, + 66596 => 66636, + 66597 => 66637, + 66598 => 66638, + 66599 => 66639, + 66736 => 66776, + 66737 => 66777, + 66738 => 66778, + 66739 => 66779, + 66740 => 66780, + 66741 => 66781, + 66742 => 66782, + 66743 => 66783, + 66744 => 66784, + 66745 => 66785, + 66746 => 66786, + 66747 => 66787, + 66748 => 66788, + 66749 => 66789, + 66750 => 66790, + 66751 => 66791, + 66752 => 66792, + 66753 => 66793, + 66754 => 66794, + 66755 => 66795, + 66756 => 66796, + 66757 => 66797, + 66758 => 66798, + 66759 => 66799, + 66760 => 66800, + 66761 => 66801, + 66762 => 66802, + 66763 => 66803, + 66764 => 66804, + 66765 => 66805, + 66766 => 66806, + 66767 => 66807, + 66768 => 66808, + 66769 => 66809, + 66770 => 66810, + 66771 => 66811, + 68736 => 68800, + 68737 => 68801, + 68738 => 68802, + 68739 => 68803, + 68740 => 68804, + 68741 => 68805, + 68742 => 68806, + 68743 => 68807, + 68744 => 68808, + 68745 => 68809, + 68746 => 68810, + 68747 => 68811, + 68748 => 68812, + 68749 => 68813, + 68750 => 68814, + 68751 => 68815, + 68752 => 68816, + 68753 => 68817, + 68754 => 68818, + 68755 => 68819, + 68756 => 68820, + 68757 => 68821, + 68758 => 68822, + 68759 => 68823, + 68760 => 68824, + 68761 => 68825, + 68762 => 68826, + 68763 => 68827, + 68764 => 68828, + 68765 => 68829, + 68766 => 68830, + 68767 => 68831, + 68768 => 68832, + 68769 => 68833, + 68770 => 68834, + 68771 => 68835, + 68772 => 68836, + 68773 => 68837, + 68774 => 68838, + 68775 => 68839, + 68776 => 68840, + 68777 => 68841, + 68778 => 68842, + 68779 => 68843, + 68780 => 68844, + 68781 => 68845, + 68782 => 68846, + 68783 => 68847, + 68784 => 68848, + 68785 => 68849, + 68786 => 68850, + 71840 => 71872, + 71841 => 71873, + 71842 => 71874, + 71843 => 71875, + 71844 => 71876, + 71845 => 71877, + 71846 => 71878, + 71847 => 71879, + 71848 => 71880, + 71849 => 71881, + 71850 => 71882, + 71851 => 71883, + 71852 => 71884, + 71853 => 71885, + 71854 => 71886, + 71855 => 71887, + 71856 => 71888, + 71857 => 71889, + 71858 => 71890, + 71859 => 71891, + 71860 => 71892, + 71861 => 71893, + 71862 => 71894, + 71863 => 71895, + 71864 => 71896, + 71865 => 71897, + 71866 => 71898, + 71867 => 71899, + 71868 => 71900, + 71869 => 71901, + 71870 => 71902, + 71871 => 71903, + 113824 => [], + 113825 => [], + 113826 => [], + 113827 => [], + 119134 => [119127, 119141], + 119135 => [119128, 119141], + 119136 => [119128, 119141, 119150], + 119137 => [119128, 119141, 119151], + 119138 => [119128, 119141, 119152], + 119139 => [119128, 119141, 119153], + 119140 => [119128, 119141, 119154], + 119227 => [119225, 119141], + 119228 => [119226, 119141], + 119229 => [119225, 119141, 119150], + 119230 => [119226, 119141, 119150], + 119231 => [119225, 119141, 119151], + 119232 => [119226, 119141, 119151], + 119808 => 97, + 119809 => 98, + 119810 => 99, + 119811 => 100, + 119812 => 101, + 119813 => 102, + 119814 => 103, + 119815 => 104, + 119816 => 105, + 119817 => 106, + 119818 => 107, + 119819 => 108, + 119820 => 109, + 119821 => 110, + 119822 => 111, + 119823 => 112, + 119824 => 113, + 119825 => 114, + 119826 => 115, + 119827 => 116, + 119828 => 117, + 119829 => 118, + 119830 => 119, + 119831 => 120, + 119832 => 121, + 119833 => 122, + 119834 => 97, + 119835 => 98, + 119836 => 99, + 119837 => 100, + 119838 => 101, + 119839 => 102, + 119840 => 103, + 119841 => 104, + 119842 => 105, + 119843 => 106, + 119844 => 107, + 119845 => 108, + 119846 => 109, + 119847 => 110, + 119848 => 111, + 119849 => 112, + 119850 => 113, + 119851 => 114, + 119852 => 115, + 119853 => 116, + 119854 => 117, + 119855 => 118, + 119856 => 119, + 119857 => 120, + 119858 => 121, + 119859 => 122, + 119860 => 97, + 119861 => 98, + 119862 => 99, + 119863 => 100, + 119864 => 101, + 119865 => 102, + 119866 => 103, + 119867 => 104, + 119868 => 105, + 119869 => 106, + 119870 => 107, + 119871 => 108, + 119872 => 109, + 119873 => 110, + 119874 => 111, + 119875 => 112, + 119876 => 113, + 119877 => 114, + 119878 => 115, + 119879 => 116, + 119880 => 117, + 119881 => 118, + 119882 => 119, + 119883 => 120, + 119884 => 121, + 119885 => 122, + 119886 => 97, + 119887 => 98, + 119888 => 99, + 119889 => 100, + 119890 => 101, + 119891 => 102, + 119892 => 103, + 119894 => 105, + 119895 => 106, + 119896 => 107, + 119897 => 108, + 119898 => 109, + 119899 => 110, + 119900 => 111, + 119901 => 112, + 119902 => 113, + 119903 => 114, + 119904 => 115, + 119905 => 116, + 119906 => 117, + 119907 => 118, + 119908 => 119, + 119909 => 120, + 119910 => 121, + 119911 => 122, + 119912 => 97, + 119913 => 98, + 119914 => 99, + 119915 => 100, + 119916 => 101, + 119917 => 102, + 119918 => 103, + 119919 => 104, + 119920 => 105, + 119921 => 106, + 119922 => 107, + 119923 => 108, + 119924 => 109, + 119925 => 110, + 119926 => 111, + 119927 => 112, + 119928 => 113, + 119929 => 114, + 119930 => 115, + 119931 => 116, + 119932 => 117, + 119933 => 118, + 119934 => 119, + 119935 => 120, + 119936 => 121, + 119937 => 122, + 119938 => 97, + 119939 => 98, + 119940 => 99, + 119941 => 100, + 119942 => 101, + 119943 => 102, + 119944 => 103, + 119945 => 104, + 119946 => 105, + 119947 => 106, + 119948 => 107, + 119949 => 108, + 119950 => 109, + 119951 => 110, + 119952 => 111, + 119953 => 112, + 119954 => 113, + 119955 => 114, + 119956 => 115, + 119957 => 116, + 119958 => 117, + 119959 => 118, + 119960 => 119, + 119961 => 120, + 119962 => 121, + 119963 => 122, + 119964 => 97, + 119966 => 99, + 119967 => 100, + 119970 => 103, + 119973 => 106, + 119974 => 107, + 119977 => 110, + 119978 => 111, + 119979 => 112, + 119980 => 113, + 119982 => 115, + 119983 => 116, + 119984 => 117, + 119985 => 118, + 119986 => 119, + 119987 => 120, + 119988 => 121, + 119989 => 122, + 119990 => 97, + 119991 => 98, + 119992 => 99, + 119993 => 100, + 119995 => 102, + 119997 => 104, + 119998 => 105, + 119999 => 106, + 120000 => 107, + 120001 => 108, + 120002 => 109, + 120003 => 110, + 120005 => 112, + 120006 => 113, + 120007 => 114, + 120008 => 115, + 120009 => 116, + 120010 => 117, + 120011 => 118, + 120012 => 119, + 120013 => 120, + 120014 => 121, + 120015 => 122, + 120016 => 97, + 120017 => 98, + 120018 => 99, + 120019 => 100, + 120020 => 101, + 120021 => 102, + 120022 => 103, + 120023 => 104, + 120024 => 105, + 120025 => 106, + 120026 => 107, + 120027 => 108, + 120028 => 109, + 120029 => 110, + 120030 => 111, + 120031 => 112, + 120032 => 113, + 120033 => 114, + 120034 => 115, + 120035 => 116, + 120036 => 117, + 120037 => 118, + 120038 => 119, + 120039 => 120, + 120040 => 121, + 120041 => 122, + 120042 => 97, + 120043 => 98, + 120044 => 99, + 120045 => 100, + 120046 => 101, + 120047 => 102, + 120048 => 103, + 120049 => 104, + 120050 => 105, + 120051 => 106, + 120052 => 107, + 120053 => 108, + 120054 => 109, + 120055 => 110, + 120056 => 111, + 120057 => 112, + 120058 => 113, + 120059 => 114, + 120060 => 115, + 120061 => 116, + 120062 => 117, + 120063 => 118, + 120064 => 119, + 120065 => 120, + 120066 => 121, + 120067 => 122, + 120068 => 97, + 120069 => 98, + 120071 => 100, + 120072 => 101, + 120073 => 102, + 120074 => 103, + 120077 => 106, + 120078 => 107, + 120079 => 108, + 120080 => 109, + 120081 => 110, + 120082 => 111, + 120083 => 112, + 120084 => 113, + 120086 => 115, + 120087 => 116, + 120088 => 117, + 120089 => 118, + 120090 => 119, + 120091 => 120, + 120092 => 121, + 120094 => 97, + 120095 => 98, + 120096 => 99, + 120097 => 100, + 120098 => 101, + 120099 => 102, + 120100 => 103, + 120101 => 104, + 120102 => 105, + 120103 => 106, + 120104 => 107, + 120105 => 108, + 120106 => 109, + 120107 => 110, + 120108 => 111, + 120109 => 112, + 120110 => 113, + 120111 => 114, + 120112 => 115, + 120113 => 116, + 120114 => 117, + 120115 => 118, + 120116 => 119, + 120117 => 120, + 120118 => 121, + 120119 => 122, + 120120 => 97, + 120121 => 98, + 120123 => 100, + 120124 => 101, + 120125 => 102, + 120126 => 103, + 120128 => 105, + 120129 => 106, + 120130 => 107, + 120131 => 108, + 120132 => 109, + 120134 => 111, + 120138 => 115, + 120139 => 116, + 120140 => 117, + 120141 => 118, + 120142 => 119, + 120143 => 120, + 120144 => 121, + 120146 => 97, + 120147 => 98, + 120148 => 99, + 120149 => 100, + 120150 => 101, + 120151 => 102, + 120152 => 103, + 120153 => 104, + 120154 => 105, + 120155 => 106, + 120156 => 107, + 120157 => 108, + 120158 => 109, + 120159 => 110, + 120160 => 111, + 120161 => 112, + 120162 => 113, + 120163 => 114, + 120164 => 115, + 120165 => 116, + 120166 => 117, + 120167 => 118, + 120168 => 119, + 120169 => 120, + 120170 => 121, + 120171 => 122, + 120172 => 97, + 120173 => 98, + 120174 => 99, + 120175 => 100, + 120176 => 101, + 120177 => 102, + 120178 => 103, + 120179 => 104, + 120180 => 105, + 120181 => 106, + 120182 => 107, + 120183 => 108, + 120184 => 109, + 120185 => 110, + 120186 => 111, + 120187 => 112, + 120188 => 113, + 120189 => 114, + 120190 => 115, + 120191 => 116, + 120192 => 117, + 120193 => 118, + 120194 => 119, + 120195 => 120, + 120196 => 121, + 120197 => 122, + 120198 => 97, + 120199 => 98, + 120200 => 99, + 120201 => 100, + 120202 => 101, + 120203 => 102, + 120204 => 103, + 120205 => 104, + 120206 => 105, + 120207 => 106, + 120208 => 107, + 120209 => 108, + 120210 => 109, + 120211 => 110, + 120212 => 111, + 120213 => 112, + 120214 => 113, + 120215 => 114, + 120216 => 115, + 120217 => 116, + 120218 => 117, + 120219 => 118, + 120220 => 119, + 120221 => 120, + 120222 => 121, + 120223 => 122, + 120224 => 97, + 120225 => 98, + 120226 => 99, + 120227 => 100, + 120228 => 101, + 120229 => 102, + 120230 => 103, + 120231 => 104, + 120232 => 105, + 120233 => 106, + 120234 => 107, + 120235 => 108, + 120236 => 109, + 120237 => 110, + 120238 => 111, + 120239 => 112, + 120240 => 113, + 120241 => 114, + 120242 => 115, + 120243 => 116, + 120244 => 117, + 120245 => 118, + 120246 => 119, + 120247 => 120, + 120248 => 121, + 120249 => 122, + 120250 => 97, + 120251 => 98, + 120252 => 99, + 120253 => 100, + 120254 => 101, + 120255 => 102, + 120256 => 103, + 120257 => 104, + 120258 => 105, + 120259 => 106, + 120260 => 107, + 120261 => 108, + 120262 => 109, + 120263 => 110, + 120264 => 111, + 120265 => 112, + 120266 => 113, + 120267 => 114, + 120268 => 115, + 120269 => 116, + 120270 => 117, + 120271 => 118, + 120272 => 119, + 120273 => 120, + 120274 => 121, + 120275 => 122, + 120276 => 97, + 120277 => 98, + 120278 => 99, + 120279 => 100, + 120280 => 101, + 120281 => 102, + 120282 => 103, + 120283 => 104, + 120284 => 105, + 120285 => 106, + 120286 => 107, + 120287 => 108, + 120288 => 109, + 120289 => 110, + 120290 => 111, + 120291 => 112, + 120292 => 113, + 120293 => 114, + 120294 => 115, + 120295 => 116, + 120296 => 117, + 120297 => 118, + 120298 => 119, + 120299 => 120, + 120300 => 121, + 120301 => 122, + 120302 => 97, + 120303 => 98, + 120304 => 99, + 120305 => 100, + 120306 => 101, + 120307 => 102, + 120308 => 103, + 120309 => 104, + 120310 => 105, + 120311 => 106, + 120312 => 107, + 120313 => 108, + 120314 => 109, + 120315 => 110, + 120316 => 111, + 120317 => 112, + 120318 => 113, + 120319 => 114, + 120320 => 115, + 120321 => 116, + 120322 => 117, + 120323 => 118, + 120324 => 119, + 120325 => 120, + 120326 => 121, + 120327 => 122, + 120328 => 97, + 120329 => 98, + 120330 => 99, + 120331 => 100, + 120332 => 101, + 120333 => 102, + 120334 => 103, + 120335 => 104, + 120336 => 105, + 120337 => 106, + 120338 => 107, + 120339 => 108, + 120340 => 109, + 120341 => 110, + 120342 => 111, + 120343 => 112, + 120344 => 113, + 120345 => 114, + 120346 => 115, + 120347 => 116, + 120348 => 117, + 120349 => 118, + 120350 => 119, + 120351 => 120, + 120352 => 121, + 120353 => 122, + 120354 => 97, + 120355 => 98, + 120356 => 99, + 120357 => 100, + 120358 => 101, + 120359 => 102, + 120360 => 103, + 120361 => 104, + 120362 => 105, + 120363 => 106, + 120364 => 107, + 120365 => 108, + 120366 => 109, + 120367 => 110, + 120368 => 111, + 120369 => 112, + 120370 => 113, + 120371 => 114, + 120372 => 115, + 120373 => 116, + 120374 => 117, + 120375 => 118, + 120376 => 119, + 120377 => 120, + 120378 => 121, + 120379 => 122, + 120380 => 97, + 120381 => 98, + 120382 => 99, + 120383 => 100, + 120384 => 101, + 120385 => 102, + 120386 => 103, + 120387 => 104, + 120388 => 105, + 120389 => 106, + 120390 => 107, + 120391 => 108, + 120392 => 109, + 120393 => 110, + 120394 => 111, + 120395 => 112, + 120396 => 113, + 120397 => 114, + 120398 => 115, + 120399 => 116, + 120400 => 117, + 120401 => 118, + 120402 => 119, + 120403 => 120, + 120404 => 121, + 120405 => 122, + 120406 => 97, + 120407 => 98, + 120408 => 99, + 120409 => 100, + 120410 => 101, + 120411 => 102, + 120412 => 103, + 120413 => 104, + 120414 => 105, + 120415 => 106, + 120416 => 107, + 120417 => 108, + 120418 => 109, + 120419 => 110, + 120420 => 111, + 120421 => 112, + 120422 => 113, + 120423 => 114, + 120424 => 115, + 120425 => 116, + 120426 => 117, + 120427 => 118, + 120428 => 119, + 120429 => 120, + 120430 => 121, + 120431 => 122, + 120432 => 97, + 120433 => 98, + 120434 => 99, + 120435 => 100, + 120436 => 101, + 120437 => 102, + 120438 => 103, + 120439 => 104, + 120440 => 105, + 120441 => 106, + 120442 => 107, + 120443 => 108, + 120444 => 109, + 120445 => 110, + 120446 => 111, + 120447 => 112, + 120448 => 113, + 120449 => 114, + 120450 => 115, + 120451 => 116, + 120452 => 117, + 120453 => 118, + 120454 => 119, + 120455 => 120, + 120456 => 121, + 120457 => 122, + 120458 => 97, + 120459 => 98, + 120460 => 99, + 120461 => 100, + 120462 => 101, + 120463 => 102, + 120464 => 103, + 120465 => 104, + 120466 => 105, + 120467 => 106, + 120468 => 107, + 120469 => 108, + 120470 => 109, + 120471 => 110, + 120472 => 111, + 120473 => 112, + 120474 => 113, + 120475 => 114, + 120476 => 115, + 120477 => 116, + 120478 => 117, + 120479 => 118, + 120480 => 119, + 120481 => 120, + 120482 => 121, + 120483 => 122, + 120484 => 305, + 120485 => 567, + 120488 => 945, + 120489 => 946, + 120490 => 947, + 120491 => 948, + 120492 => 949, + 120493 => 950, + 120494 => 951, + 120495 => 952, + 120496 => 953, + 120497 => 954, + 120498 => 955, + 120499 => 956, + 120500 => 957, + 120501 => 958, + 120502 => 959, + 120503 => 960, + 120504 => 961, + 120505 => 952, + 120506 => 963, + 120507 => 964, + 120508 => 965, + 120509 => 966, + 120510 => 967, + 120511 => 968, + 120512 => 969, + 120513 => 8711, + 120514 => 945, + 120515 => 946, + 120516 => 947, + 120517 => 948, + 120518 => 949, + 120519 => 950, + 120520 => 951, + 120521 => 952, + 120522 => 953, + 120523 => 954, + 120524 => 955, + 120525 => 956, + 120526 => 957, + 120527 => 958, + 120528 => 959, + 120529 => 960, + 120530 => 961, + 120531 => 963, + 120532 => 963, + 120533 => 964, + 120534 => 965, + 120535 => 966, + 120536 => 967, + 120537 => 968, + 120538 => 969, + 120539 => 8706, + 120540 => 949, + 120541 => 952, + 120542 => 954, + 120543 => 966, + 120544 => 961, + 120545 => 960, + 120546 => 945, + 120547 => 946, + 120548 => 947, + 120549 => 948, + 120550 => 949, + 120551 => 950, + 120552 => 951, + 120553 => 952, + 120554 => 953, + 120555 => 954, + 120556 => 955, + 120557 => 956, + 120558 => 957, + 120559 => 958, + 120560 => 959, + 120561 => 960, + 120562 => 961, + 120563 => 952, + 120564 => 963, + 120565 => 964, + 120566 => 965, + 120567 => 966, + 120568 => 967, + 120569 => 968, + 120570 => 969, + 120571 => 8711, + 120572 => 945, + 120573 => 946, + 120574 => 947, + 120575 => 948, + 120576 => 949, + 120577 => 950, + 120578 => 951, + 120579 => 952, + 120580 => 953, + 120581 => 954, + 120582 => 955, + 120583 => 956, + 120584 => 957, + 120585 => 958, + 120586 => 959, + 120587 => 960, + 120588 => 961, + 120589 => 963, + 120590 => 963, + 120591 => 964, + 120592 => 965, + 120593 => 966, + 120594 => 967, + 120595 => 968, + 120596 => 969, + 120597 => 8706, + 120598 => 949, + 120599 => 952, + 120600 => 954, + 120601 => 966, + 120602 => 961, + 120603 => 960, + 120604 => 945, + 120605 => 946, + 120606 => 947, + 120607 => 948, + 120608 => 949, + 120609 => 950, + 120610 => 951, + 120611 => 952, + 120612 => 953, + 120613 => 954, + 120614 => 955, + 120615 => 956, + 120616 => 957, + 120617 => 958, + 120618 => 959, + 120619 => 960, + 120620 => 961, + 120621 => 952, + 120622 => 963, + 120623 => 964, + 120624 => 965, + 120625 => 966, + 120626 => 967, + 120627 => 968, + 120628 => 969, + 120629 => 8711, + 120630 => 945, + 120631 => 946, + 120632 => 947, + 120633 => 948, + 120634 => 949, + 120635 => 950, + 120636 => 951, + 120637 => 952, + 120638 => 953, + 120639 => 954, + 120640 => 955, + 120641 => 956, + 120642 => 957, + 120643 => 958, + 120644 => 959, + 120645 => 960, + 120646 => 961, + 120647 => 963, + 120648 => 963, + 120649 => 964, + 120650 => 965, + 120651 => 966, + 120652 => 967, + 120653 => 968, + 120654 => 969, + 120655 => 8706, + 120656 => 949, + 120657 => 952, + 120658 => 954, + 120659 => 966, + 120660 => 961, + 120661 => 960, + 120662 => 945, + 120663 => 946, + 120664 => 947, + 120665 => 948, + 120666 => 949, + 120667 => 950, + 120668 => 951, + 120669 => 952, + 120670 => 953, + 120671 => 954, + 120672 => 955, + 120673 => 956, + 120674 => 957, + 120675 => 958, + 120676 => 959, + 120677 => 960, + 120678 => 961, + 120679 => 952, + 120680 => 963, + 120681 => 964, + 120682 => 965, + 120683 => 966, + 120684 => 967, + 120685 => 968, + 120686 => 969, + 120687 => 8711, + 120688 => 945, + 120689 => 946, + 120690 => 947, + 120691 => 948, + 120692 => 949, + 120693 => 950, + 120694 => 951, + 120695 => 952, + 120696 => 953, + 120697 => 954, + 120698 => 955, + 120699 => 956, + 120700 => 957, + 120701 => 958, + 120702 => 959, + 120703 => 960, + 120704 => 961, + 120705 => 963, + 120706 => 963, + 120707 => 964, + 120708 => 965, + 120709 => 966, + 120710 => 967, + 120711 => 968, + 120712 => 969, + 120713 => 8706, + 120714 => 949, + 120715 => 952, + 120716 => 954, + 120717 => 966, + 120718 => 961, + 120719 => 960, + 120720 => 945, + 120721 => 946, + 120722 => 947, + 120723 => 948, + 120724 => 949, + 120725 => 950, + 120726 => 951, + 120727 => 952, + 120728 => 953, + 120729 => 954, + 120730 => 955, + 120731 => 956, + 120732 => 957, + 120733 => 958, + 120734 => 959, + 120735 => 960, + 120736 => 961, + 120737 => 952, + 120738 => 963, + 120739 => 964, + 120740 => 965, + 120741 => 966, + 120742 => 967, + 120743 => 968, + 120744 => 969, + 120745 => 8711, + 120746 => 945, + 120747 => 946, + 120748 => 947, + 120749 => 948, + 120750 => 949, + 120751 => 950, + 120752 => 951, + 120753 => 952, + 120754 => 953, + 120755 => 954, + 120756 => 955, + 120757 => 956, + 120758 => 957, + 120759 => 958, + 120760 => 959, + 120761 => 960, + 120762 => 961, + 120763 => 963, + 120764 => 963, + 120765 => 964, + 120766 => 965, + 120767 => 966, + 120768 => 967, + 120769 => 968, + 120770 => 969, + 120771 => 8706, + 120772 => 949, + 120773 => 952, + 120774 => 954, + 120775 => 966, + 120776 => 961, + 120777 => 960, + 120778 => 989, + 120779 => 989, + 120782 => 48, + 120783 => 49, + 120784 => 50, + 120785 => 51, + 120786 => 52, + 120787 => 53, + 120788 => 54, + 120789 => 55, + 120790 => 56, + 120791 => 57, + 120792 => 48, + 120793 => 49, + 120794 => 50, + 120795 => 51, + 120796 => 52, + 120797 => 53, + 120798 => 54, + 120799 => 55, + 120800 => 56, + 120801 => 57, + 120802 => 48, + 120803 => 49, + 120804 => 50, + 120805 => 51, + 120806 => 52, + 120807 => 53, + 120808 => 54, + 120809 => 55, + 120810 => 56, + 120811 => 57, + 120812 => 48, + 120813 => 49, + 120814 => 50, + 120815 => 51, + 120816 => 52, + 120817 => 53, + 120818 => 54, + 120819 => 55, + 120820 => 56, + 120821 => 57, + 120822 => 48, + 120823 => 49, + 120824 => 50, + 120825 => 51, + 120826 => 52, + 120827 => 53, + 120828 => 54, + 120829 => 55, + 120830 => 56, + 120831 => 57, + 125184 => 125218, + 125185 => 125219, + 125186 => 125220, + 125187 => 125221, + 125188 => 125222, + 125189 => 125223, + 125190 => 125224, + 125191 => 125225, + 125192 => 125226, + 125193 => 125227, + 125194 => 125228, + 125195 => 125229, + 125196 => 125230, + 125197 => 125231, + 125198 => 125232, + 125199 => 125233, + 125200 => 125234, + 125201 => 125235, + 125202 => 125236, + 125203 => 125237, + 125204 => 125238, + 125205 => 125239, + 125206 => 125240, + 125207 => 125241, + 125208 => 125242, + 125209 => 125243, + 125210 => 125244, + 125211 => 125245, + 125212 => 125246, + 125213 => 125247, + 125214 => 125248, + 125215 => 125249, + 125216 => 125250, + 125217 => 125251, + 126464 => 1575, + 126465 => 1576, + 126466 => 1580, + 126467 => 1583, + 126469 => 1608, + 126470 => 1586, + 126471 => 1581, + 126472 => 1591, + 126473 => 1610, + 126474 => 1603, + 126475 => 1604, + 126476 => 1605, + 126477 => 1606, + 126478 => 1587, + 126479 => 1593, + 126480 => 1601, + 126481 => 1589, + 126482 => 1602, + 126483 => 1585, + 126484 => 1588, + 126485 => 1578, + 126486 => 1579, + 126487 => 1582, + 126488 => 1584, + 126489 => 1590, + 126490 => 1592, + 126491 => 1594, + 126492 => 1646, + 126493 => 1722, + 126494 => 1697, + 126495 => 1647, + 126497 => 1576, + 126498 => 1580, + 126500 => 1607, + 126503 => 1581, + 126505 => 1610, + 126506 => 1603, + 126507 => 1604, + 126508 => 1605, + 126509 => 1606, + 126510 => 1587, + 126511 => 1593, + 126512 => 1601, + 126513 => 1589, + 126514 => 1602, + 126516 => 1588, + 126517 => 1578, + 126518 => 1579, + 126519 => 1582, + 126521 => 1590, + 126523 => 1594, + 126530 => 1580, + 126535 => 1581, + 126537 => 1610, + 126539 => 1604, + 126541 => 1606, + 126542 => 1587, + 126543 => 1593, + 126545 => 1589, + 126546 => 1602, + 126548 => 1588, + 126551 => 1582, + 126553 => 1590, + 126555 => 1594, + 126557 => 1722, + 126559 => 1647, + 126561 => 1576, + 126562 => 1580, + 126564 => 1607, + 126567 => 1581, + 126568 => 1591, + 126569 => 1610, + 126570 => 1603, + 126572 => 1605, + 126573 => 1606, + 126574 => 1587, + 126575 => 1593, + 126576 => 1601, + 126577 => 1589, + 126578 => 1602, + 126580 => 1588, + 126581 => 1578, + 126582 => 1579, + 126583 => 1582, + 126585 => 1590, + 126586 => 1592, + 126587 => 1594, + 126588 => 1646, + 126590 => 1697, + 126592 => 1575, + 126593 => 1576, + 126594 => 1580, + 126595 => 1583, + 126596 => 1607, + 126597 => 1608, + 126598 => 1586, + 126599 => 1581, + 126600 => 1591, + 126601 => 1610, + 126603 => 1604, + 126604 => 1605, + 126605 => 1606, + 126606 => 1587, + 126607 => 1593, + 126608 => 1601, + 126609 => 1589, + 126610 => 1602, + 126611 => 1585, + 126612 => 1588, + 126613 => 1578, + 126614 => 1579, + 126615 => 1582, + 126616 => 1584, + 126617 => 1590, + 126618 => 1592, + 126619 => 1594, + 126625 => 1576, + 126626 => 1580, + 126627 => 1583, + 126629 => 1608, + 126630 => 1586, + 126631 => 1581, + 126632 => 1591, + 126633 => 1610, + 126635 => 1604, + 126636 => 1605, + 126637 => 1606, + 126638 => 1587, + 126639 => 1593, + 126640 => 1601, + 126641 => 1589, + 126642 => 1602, + 126643 => 1585, + 126644 => 1588, + 126645 => 1578, + 126646 => 1579, + 126647 => 1582, + 126648 => 1584, + 126649 => 1590, + 126650 => 1592, + 126651 => 1594, + 127233 => [48, 44], + 127234 => [49, 44], + 127235 => [50, 44], + 127236 => [51, 44], + 127237 => [52, 44], + 127238 => [53, 44], + 127239 => [54, 44], + 127240 => [55, 44], + 127241 => [56, 44], + 127242 => [57, 44], + 127248 => [40, 97, 41], + 127249 => [40, 98, 41], + 127250 => [40, 99, 41], + 127251 => [40, 100, 41], + 127252 => [40, 101, 41], + 127253 => [40, 102, 41], + 127254 => [40, 103, 41], + 127255 => [40, 104, 41], + 127256 => [40, 105, 41], + 127257 => [40, 106, 41], + 127258 => [40, 107, 41], + 127259 => [40, 108, 41], + 127260 => [40, 109, 41], + 127261 => [40, 110, 41], + 127262 => [40, 111, 41], + 127263 => [40, 112, 41], + 127264 => [40, 113, 41], + 127265 => [40, 114, 41], + 127266 => [40, 115, 41], + 127267 => [40, 116, 41], + 127268 => [40, 117, 41], + 127269 => [40, 118, 41], + 127270 => [40, 119, 41], + 127271 => [40, 120, 41], + 127272 => [40, 121, 41], + 127273 => [40, 122, 41], + 127274 => [12308, 115, 12309], + 127275 => 99, + 127276 => 114, + 127277 => [99, 100], + 127278 => [119, 122], + 127280 => 97, + 127281 => 98, + 127282 => 99, + 127283 => 100, + 127284 => 101, + 127285 => 102, + 127286 => 103, + 127287 => 104, + 127288 => 105, + 127289 => 106, + 127290 => 107, + 127291 => 108, + 127292 => 109, + 127293 => 110, + 127294 => 111, + 127295 => 112, + 127296 => 113, + 127297 => 114, + 127298 => 115, + 127299 => 116, + 127300 => 117, + 127301 => 118, + 127302 => 119, + 127303 => 120, + 127304 => 121, + 127305 => 122, + 127306 => [104, 118], + 127307 => [109, 118], + 127308 => [115, 100], + 127309 => [115, 115], + 127310 => [112, 112, 118], + 127311 => [119, 99], + 127338 => [109, 99], + 127339 => [109, 100], + 127376 => [100, 106], + 127488 => [12411, 12363], + 127489 => [12467, 12467], + 127490 => 12469, + 127504 => 25163, + 127505 => 23383, + 127506 => 21452, + 127507 => 12487, + 127508 => 20108, + 127509 => 22810, + 127510 => 35299, + 127511 => 22825, + 127512 => 20132, + 127513 => 26144, + 127514 => 28961, + 127515 => 26009, + 127516 => 21069, + 127517 => 24460, + 127518 => 20877, + 127519 => 26032, + 127520 => 21021, + 127521 => 32066, + 127522 => 29983, + 127523 => 36009, + 127524 => 22768, + 127525 => 21561, + 127526 => 28436, + 127527 => 25237, + 127528 => 25429, + 127529 => 19968, + 127530 => 19977, + 127531 => 36938, + 127532 => 24038, + 127533 => 20013, + 127534 => 21491, + 127535 => 25351, + 127536 => 36208, + 127537 => 25171, + 127538 => 31105, + 127539 => 31354, + 127540 => 21512, + 127541 => 28288, + 127542 => 26377, + 127543 => 26376, + 127544 => 30003, + 127545 => 21106, + 127546 => 21942, + 127547 => 37197, + 127552 => [12308, 26412, 12309], + 127553 => [12308, 19977, 12309], + 127554 => [12308, 20108, 12309], + 127555 => [12308, 23433, 12309], + 127556 => [12308, 28857, 12309], + 127557 => [12308, 25171, 12309], + 127558 => [12308, 30423, 12309], + 127559 => [12308, 21213, 12309], + 127560 => [12308, 25943, 12309], + 127568 => 24471, + 127569 => 21487, + 194560 => 20029, + 194561 => 20024, + 194562 => 20033, + 194563 => 131362, + 194564 => 20320, + 194565 => 20398, + 194566 => 20411, + 194567 => 20482, + 194568 => 20602, + 194569 => 20633, + 194570 => 20711, + 194571 => 20687, + 194572 => 13470, + 194573 => 132666, + 194574 => 20813, + 194575 => 20820, + 194576 => 20836, + 194577 => 20855, + 194578 => 132380, + 194579 => 13497, + 194580 => 20839, + 194581 => 20877, + 194582 => 132427, + 194583 => 20887, + 194584 => 20900, + 194585 => 20172, + 194586 => 20908, + 194587 => 20917, + 194588 => 168415, + 194589 => 20981, + 194590 => 20995, + 194591 => 13535, + 194592 => 21051, + 194593 => 21062, + 194594 => 21106, + 194595 => 21111, + 194596 => 13589, + 194597 => 21191, + 194598 => 21193, + 194599 => 21220, + 194600 => 21242, + 194601 => 21253, + 194602 => 21254, + 194603 => 21271, + 194604 => 21321, + 194605 => 21329, + 194606 => 21338, + 194607 => 21363, + 194608 => 21373, + 194609 => 21375, + 194610 => 21375, + 194611 => 21375, + 194612 => 133676, + 194613 => 28784, + 194614 => 21450, + 194615 => 21471, + 194616 => 133987, + 194617 => 21483, + 194618 => 21489, + 194619 => 21510, + 194620 => 21662, + 194621 => 21560, + 194622 => 21576, + 194623 => 21608, + 194624 => 21666, + 194625 => 21750, + 194626 => 21776, + 194627 => 21843, + 194628 => 21859, + 194629 => 21892, + 194630 => 21892, + 194631 => 21913, + 194632 => 21931, + 194633 => 21939, + 194634 => 21954, + 194635 => 22294, + 194636 => 22022, + 194637 => 22295, + 194638 => 22097, + 194639 => 22132, + 194640 => 20999, + 194641 => 22766, + 194642 => 22478, + 194643 => 22516, + 194644 => 22541, + 194645 => 22411, + 194646 => 22578, + 194647 => 22577, + 194648 => 22700, + 194649 => 136420, + 194650 => 22770, + 194651 => 22775, + 194652 => 22790, + 194653 => 22810, + 194654 => 22818, + 194655 => 22882, + 194656 => 136872, + 194657 => 136938, + 194658 => 23020, + 194659 => 23067, + 194660 => 23079, + 194661 => 23000, + 194662 => 23142, + 194663 => 14062, + 194665 => 23304, + 194666 => 23358, + 194667 => 23358, + 194668 => 137672, + 194669 => 23491, + 194670 => 23512, + 194671 => 23527, + 194672 => 23539, + 194673 => 138008, + 194674 => 23551, + 194675 => 23558, + 194677 => 23586, + 194678 => 14209, + 194679 => 23648, + 194680 => 23662, + 194681 => 23744, + 194682 => 23693, + 194683 => 138724, + 194684 => 23875, + 194685 => 138726, + 194686 => 23918, + 194687 => 23915, + 194688 => 23932, + 194689 => 24033, + 194690 => 24034, + 194691 => 14383, + 194692 => 24061, + 194693 => 24104, + 194694 => 24125, + 194695 => 24169, + 194696 => 14434, + 194697 => 139651, + 194698 => 14460, + 194699 => 24240, + 194700 => 24243, + 194701 => 24246, + 194702 => 24266, + 194703 => 172946, + 194704 => 24318, + 194705 => 140081, + 194706 => 140081, + 194707 => 33281, + 194708 => 24354, + 194709 => 24354, + 194710 => 14535, + 194711 => 144056, + 194712 => 156122, + 194713 => 24418, + 194714 => 24427, + 194715 => 14563, + 194716 => 24474, + 194717 => 24525, + 194718 => 24535, + 194719 => 24569, + 194720 => 24705, + 194721 => 14650, + 194722 => 14620, + 194723 => 24724, + 194724 => 141012, + 194725 => 24775, + 194726 => 24904, + 194727 => 24908, + 194728 => 24910, + 194729 => 24908, + 194730 => 24954, + 194731 => 24974, + 194732 => 25010, + 194733 => 24996, + 194734 => 25007, + 194735 => 25054, + 194736 => 25074, + 194737 => 25078, + 194738 => 25104, + 194739 => 25115, + 194740 => 25181, + 194741 => 25265, + 194742 => 25300, + 194743 => 25424, + 194744 => 142092, + 194745 => 25405, + 194746 => 25340, + 194747 => 25448, + 194748 => 25475, + 194749 => 25572, + 194750 => 142321, + 194751 => 25634, + 194752 => 25541, + 194753 => 25513, + 194754 => 14894, + 194755 => 25705, + 194756 => 25726, + 194757 => 25757, + 194758 => 25719, + 194759 => 14956, + 194760 => 25935, + 194761 => 25964, + 194762 => 143370, + 194763 => 26083, + 194764 => 26360, + 194765 => 26185, + 194766 => 15129, + 194767 => 26257, + 194768 => 15112, + 194769 => 15076, + 194770 => 20882, + 194771 => 20885, + 194772 => 26368, + 194773 => 26268, + 194774 => 32941, + 194775 => 17369, + 194776 => 26391, + 194777 => 26395, + 194778 => 26401, + 194779 => 26462, + 194780 => 26451, + 194781 => 144323, + 194782 => 15177, + 194783 => 26618, + 194784 => 26501, + 194785 => 26706, + 194786 => 26757, + 194787 => 144493, + 194788 => 26766, + 194789 => 26655, + 194790 => 26900, + 194791 => 15261, + 194792 => 26946, + 194793 => 27043, + 194794 => 27114, + 194795 => 27304, + 194796 => 145059, + 194797 => 27355, + 194798 => 15384, + 194799 => 27425, + 194800 => 145575, + 194801 => 27476, + 194802 => 15438, + 194803 => 27506, + 194804 => 27551, + 194805 => 27578, + 194806 => 27579, + 194807 => 146061, + 194808 => 138507, + 194809 => 146170, + 194810 => 27726, + 194811 => 146620, + 194812 => 27839, + 194813 => 27853, + 194814 => 27751, + 194815 => 27926, + 194816 => 27966, + 194817 => 28023, + 194818 => 27969, + 194819 => 28009, + 194820 => 28024, + 194821 => 28037, + 194822 => 146718, + 194823 => 27956, + 194824 => 28207, + 194825 => 28270, + 194826 => 15667, + 194827 => 28363, + 194828 => 28359, + 194829 => 147153, + 194830 => 28153, + 194831 => 28526, + 194832 => 147294, + 194833 => 147342, + 194834 => 28614, + 194835 => 28729, + 194836 => 28702, + 194837 => 28699, + 194838 => 15766, + 194839 => 28746, + 194840 => 28797, + 194841 => 28791, + 194842 => 28845, + 194843 => 132389, + 194844 => 28997, + 194845 => 148067, + 194846 => 29084, + 194848 => 29224, + 194849 => 29237, + 194850 => 29264, + 194851 => 149000, + 194852 => 29312, + 194853 => 29333, + 194854 => 149301, + 194855 => 149524, + 194856 => 29562, + 194857 => 29579, + 194858 => 16044, + 194859 => 29605, + 194860 => 16056, + 194861 => 16056, + 194862 => 29767, + 194863 => 29788, + 194864 => 29809, + 194865 => 29829, + 194866 => 29898, + 194867 => 16155, + 194868 => 29988, + 194869 => 150582, + 194870 => 30014, + 194871 => 150674, + 194872 => 30064, + 194873 => 139679, + 194874 => 30224, + 194875 => 151457, + 194876 => 151480, + 194877 => 151620, + 194878 => 16380, + 194879 => 16392, + 194880 => 30452, + 194881 => 151795, + 194882 => 151794, + 194883 => 151833, + 194884 => 151859, + 194885 => 30494, + 194886 => 30495, + 194887 => 30495, + 194888 => 30538, + 194889 => 16441, + 194890 => 30603, + 194891 => 16454, + 194892 => 16534, + 194893 => 152605, + 194894 => 30798, + 194895 => 30860, + 194896 => 30924, + 194897 => 16611, + 194898 => 153126, + 194899 => 31062, + 194900 => 153242, + 194901 => 153285, + 194902 => 31119, + 194903 => 31211, + 194904 => 16687, + 194905 => 31296, + 194906 => 31306, + 194907 => 31311, + 194908 => 153980, + 194909 => 154279, + 194910 => 154279, + 194912 => 16898, + 194913 => 154539, + 194914 => 31686, + 194915 => 31689, + 194916 => 16935, + 194917 => 154752, + 194918 => 31954, + 194919 => 17056, + 194920 => 31976, + 194921 => 31971, + 194922 => 32000, + 194923 => 155526, + 194924 => 32099, + 194925 => 17153, + 194926 => 32199, + 194927 => 32258, + 194928 => 32325, + 194929 => 17204, + 194930 => 156200, + 194931 => 156231, + 194932 => 17241, + 194933 => 156377, + 194934 => 32634, + 194935 => 156478, + 194936 => 32661, + 194937 => 32762, + 194938 => 32773, + 194939 => 156890, + 194940 => 156963, + 194941 => 32864, + 194942 => 157096, + 194943 => 32880, + 194944 => 144223, + 194945 => 17365, + 194946 => 32946, + 194947 => 33027, + 194948 => 17419, + 194949 => 33086, + 194950 => 23221, + 194951 => 157607, + 194952 => 157621, + 194953 => 144275, + 194954 => 144284, + 194955 => 33281, + 194956 => 33284, + 194957 => 36766, + 194958 => 17515, + 194959 => 33425, + 194960 => 33419, + 194961 => 33437, + 194962 => 21171, + 194963 => 33457, + 194964 => 33459, + 194965 => 33469, + 194966 => 33510, + 194967 => 158524, + 194968 => 33509, + 194969 => 33565, + 194970 => 33635, + 194971 => 33709, + 194972 => 33571, + 194973 => 33725, + 194974 => 33767, + 194975 => 33879, + 194976 => 33619, + 194977 => 33738, + 194978 => 33740, + 194979 => 33756, + 194980 => 158774, + 194981 => 159083, + 194982 => 158933, + 194983 => 17707, + 194984 => 34033, + 194985 => 34035, + 194986 => 34070, + 194987 => 160714, + 194988 => 34148, + 194989 => 159532, + 194990 => 17757, + 194991 => 17761, + 194992 => 159665, + 194993 => 159954, + 194994 => 17771, + 194995 => 34384, + 194996 => 34396, + 194997 => 34407, + 194998 => 34409, + 194999 => 34473, + 195000 => 34440, + 195001 => 34574, + 195002 => 34530, + 195003 => 34681, + 195004 => 34600, + 195005 => 34667, + 195006 => 34694, + 195008 => 34785, + 195009 => 34817, + 195010 => 17913, + 195011 => 34912, + 195012 => 34915, + 195013 => 161383, + 195014 => 35031, + 195015 => 35038, + 195016 => 17973, + 195017 => 35066, + 195018 => 13499, + 195019 => 161966, + 195020 => 162150, + 195021 => 18110, + 195022 => 18119, + 195023 => 35488, + 195024 => 35565, + 195025 => 35722, + 195026 => 35925, + 195027 => 162984, + 195028 => 36011, + 195029 => 36033, + 195030 => 36123, + 195031 => 36215, + 195032 => 163631, + 195033 => 133124, + 195034 => 36299, + 195035 => 36284, + 195036 => 36336, + 195037 => 133342, + 195038 => 36564, + 195039 => 36664, + 195040 => 165330, + 195041 => 165357, + 195042 => 37012, + 195043 => 37105, + 195044 => 37137, + 195045 => 165678, + 195046 => 37147, + 195047 => 37432, + 195048 => 37591, + 195049 => 37592, + 195050 => 37500, + 195051 => 37881, + 195052 => 37909, + 195053 => 166906, + 195054 => 38283, + 195055 => 18837, + 195056 => 38327, + 195057 => 167287, + 195058 => 18918, + 195059 => 38595, + 195060 => 23986, + 195061 => 38691, + 195062 => 168261, + 195063 => 168474, + 195064 => 19054, + 195065 => 19062, + 195066 => 38880, + 195067 => 168970, + 195068 => 19122, + 195069 => 169110, + 195070 => 38923, + 195071 => 38923, + 195072 => 38953, + 195073 => 169398, + 195074 => 39138, + 195075 => 19251, + 195076 => 39209, + 195077 => 39335, + 195078 => 39362, + 195079 => 39422, + 195080 => 19406, + 195081 => 170800, + 195082 => 39698, + 195083 => 40000, + 195084 => 40189, + 195085 => 19662, + 195086 => 19693, + 195087 => 40295, + 195088 => 172238, + 195089 => 19704, + 195090 => 172293, + 195091 => 172558, + 195092 => 172689, + 195093 => 40635, + 195094 => 19798, + 195095 => 40697, + 195096 => 40702, + 195097 => 40709, + 195098 => 40719, + 195099 => 40726, + 195100 => 40763, + 195101 => 173568, + 917760 => [], + 917761 => [], + 917762 => [], + 917763 => [], + 917764 => [], + 917765 => [], + 917766 => [], + 917767 => [], + 917768 => [], + 917769 => [], + 917770 => [], + 917771 => [], + 917772 => [], + 917773 => [], + 917774 => [], + 917775 => [], + 917776 => [], + 917777 => [], + 917778 => [], + 917779 => [], + 917780 => [], + 917781 => [], + 917782 => [], + 917783 => [], + 917784 => [], + 917785 => [], + 917786 => [], + 917787 => [], + 917788 => [], + 917789 => [], + 917790 => [], + 917791 => [], + 917792 => [], + 917793 => [], + 917794 => [], + 917795 => [], + 917796 => [], + 917797 => [], + 917798 => [], + 917799 => [], + 917800 => [], + 917801 => [], + 917802 => [], + 917803 => [], + 917804 => [], + 917805 => [], + 917806 => [], + 917807 => [], + 917808 => [], + 917809 => [], + 917810 => [], + 917811 => [], + 917812 => [], + 917813 => [], + 917814 => [], + 917815 => [], + 917816 => [], + 917817 => [], + 917818 => [], + 917819 => [], + 917820 => [], + 917821 => [], + 917822 => [], + 917823 => [], + 917824 => [], + 917825 => [], + 917826 => [], + 917827 => [], + 917828 => [], + 917829 => [], + 917830 => [], + 917831 => [], + 917832 => [], + 917833 => [], + 917834 => [], + 917835 => [], + 917836 => [], + 917837 => [], + 917838 => [], + 917839 => [], + 917840 => [], + 917841 => [], + 917842 => [], + 917843 => [], + 917844 => [], + 917845 => [], + 917846 => [], + 917847 => [], + 917848 => [], + 917849 => [], + 917850 => [], + 917851 => [], + 917852 => [], + 917853 => [], + 917854 => [], + 917855 => [], + 917856 => [], + 917857 => [], + 917858 => [], + 917859 => [], + 917860 => [], + 917861 => [], + 917862 => [], + 917863 => [], + 917864 => [], + 917865 => [], + 917866 => [], + 917867 => [], + 917868 => [], + 917869 => [], + 917870 => [], + 917871 => [], + 917872 => [], + 917873 => [], + 917874 => [], + 917875 => [], + 917876 => [], + 917877 => [], + 917878 => [], + 917879 => [], + 917880 => [], + 917881 => [], + 917882 => [], + 917883 => [], + 917884 => [], + 917885 => [], + 917886 => [], + 917887 => [], + 917888 => [], + 917889 => [], + 917890 => [], + 917891 => [], + 917892 => [], + 917893 => [], + 917894 => [], + 917895 => [], + 917896 => [], + 917897 => [], + 917898 => [], + 917899 => [], + 917900 => [], + 917901 => [], + 917902 => [], + 917903 => [], + 917904 => [], + 917905 => [], + 917906 => [], + 917907 => [], + 917908 => [], + 917909 => [], + 917910 => [], + 917911 => [], + 917912 => [], + 917913 => [], + 917914 => [], + 917915 => [], + 917916 => [], + 917917 => [], + 917918 => [], + 917919 => [], + 917920 => [], + 917921 => [], + 917922 => [], + 917923 => [], + 917924 => [], + 917925 => [], + 917926 => [], + 917927 => [], + 917928 => [], + 917929 => [], + 917930 => [], + 917931 => [], + 917932 => [], + 917933 => [], + 917934 => [], + 917935 => [], + 917936 => [], + 917937 => [], + 917938 => [], + 917939 => [], + 917940 => [], + 917941 => [], + 917942 => [], + 917943 => [], + 917944 => [], + 917945 => [], + 917946 => [], + 917947 => [], + 917948 => [], + 917949 => [], + 917950 => [], + 917951 => [], + 917952 => [], + 917953 => [], + 917954 => [], + 917955 => [], + 917956 => [], + 917957 => [], + 917958 => [], + 917959 => [], + 917960 => [], + 917961 => [], + 917962 => [], + 917963 => [], + 917964 => [], + 917965 => [], + 917966 => [], + 917967 => [], + 917968 => [], + 917969 => [], + 917970 => [], + 917971 => [], + 917972 => [], + 917973 => [], + 917974 => [], + 917975 => [], + 917976 => [], + 917977 => [], + 917978 => [], + 917979 => [], + 917980 => [], + 917981 => [], + 917982 => [], + 917983 => [], + 917984 => [], + 917985 => [], + 917986 => [], + 917987 => [], + 917988 => [], + 917989 => [], + 917990 => [], + 917991 => [], + 917992 => [], + 917993 => [], + 917994 => [], + 917995 => [], + 917996 => [], + 917997 => [], + 917998 => [], + 917999 => [], + } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/lib/simpleidn/version.rb b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/lib/simpleidn/version.rb new file mode 100644 index 000000000000..c0baf864cb47 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/lib/simpleidn/version.rb @@ -0,0 +1,3 @@ +module SimpleIDN + VERSION = "0.2.1" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/simpleidn.gemspec b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/simpleidn.gemspec new file mode 100644 index 000000000000..10df2546ea4e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/simpleidn.gemspec @@ -0,0 +1,26 @@ +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'simpleidn/version' + +Gem::Specification.new do |spec| + spec.name = "simpleidn" + spec.version = SimpleIDN::VERSION + spec.authors = ["Morten Møller Riis"] + spec.email = ["mortenmoellerriis _AT_ gmail.com"] + + spec.summary = %q{Punycode ACE to unicode UTF-8 (and vice-versa) string conversion.} + spec.description = %q{This gem allows easy conversion from punycode ACE strings to unicode UTF-8 strings and vice-versa.} + spec.homepage = "https://github.com/mmriis/simpleidn" + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + spec.require_paths = ["lib"] + + spec.add_runtime_dependency "unf", '~> 0.1.4' + + spec.add_development_dependency "bundler", "~> 1.11" + spec.add_development_dependency "rake", "~> 10.0" + spec.add_development_dependency "rspec", "~> 3.0" + + spec.required_ruby_version = '>=2.2' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/tables/IdnaMappingTable.txt b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/tables/IdnaMappingTable.txt new file mode 100644 index 000000000000..0a9c90e1622c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/tables/IdnaMappingTable.txt @@ -0,0 +1,8350 @@ +# IdnaMappingTable-9.0.0.txt +# Date: 2016-06-16, 13:35:01 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode IDNA Compatible Preprocessing (UTS #46) +# For documentation, see http://www.unicode.org/reports/tr46/ + +0000..002C ; disallowed_STD3_valid # 1.1 <control-0000>..COMMA +002D..002E ; valid # 1.1 HYPHEN-MINUS..FULL STOP +002F ; disallowed_STD3_valid # 1.1 SOLIDUS +0030..0039 ; valid # 1.1 DIGIT ZERO..DIGIT NINE +003A..0040 ; disallowed_STD3_valid # 1.1 COLON..COMMERCIAL AT +0041 ; mapped ; 0061 # 1.1 LATIN CAPITAL LETTER A +0042 ; mapped ; 0062 # 1.1 LATIN CAPITAL LETTER B +0043 ; mapped ; 0063 # 1.1 LATIN CAPITAL LETTER C +0044 ; mapped ; 0064 # 1.1 LATIN CAPITAL LETTER D +0045 ; mapped ; 0065 # 1.1 LATIN CAPITAL LETTER E +0046 ; mapped ; 0066 # 1.1 LATIN CAPITAL LETTER F +0047 ; mapped ; 0067 # 1.1 LATIN CAPITAL LETTER G +0048 ; mapped ; 0068 # 1.1 LATIN CAPITAL LETTER H +0049 ; mapped ; 0069 # 1.1 LATIN CAPITAL LETTER I +004A ; mapped ; 006A # 1.1 LATIN CAPITAL LETTER J +004B ; mapped ; 006B # 1.1 LATIN CAPITAL LETTER K +004C ; mapped ; 006C # 1.1 LATIN CAPITAL LETTER L +004D ; mapped ; 006D # 1.1 LATIN CAPITAL LETTER M +004E ; mapped ; 006E # 1.1 LATIN CAPITAL LETTER N +004F ; mapped ; 006F # 1.1 LATIN CAPITAL LETTER O +0050 ; mapped ; 0070 # 1.1 LATIN CAPITAL LETTER P +0051 ; mapped ; 0071 # 1.1 LATIN CAPITAL LETTER Q +0052 ; mapped ; 0072 # 1.1 LATIN CAPITAL LETTER R +0053 ; mapped ; 0073 # 1.1 LATIN CAPITAL LETTER S +0054 ; mapped ; 0074 # 1.1 LATIN CAPITAL LETTER T +0055 ; mapped ; 0075 # 1.1 LATIN CAPITAL LETTER U +0056 ; mapped ; 0076 # 1.1 LATIN CAPITAL LETTER V +0057 ; mapped ; 0077 # 1.1 LATIN CAPITAL LETTER W +0058 ; mapped ; 0078 # 1.1 LATIN CAPITAL LETTER X +0059 ; mapped ; 0079 # 1.1 LATIN CAPITAL LETTER Y +005A ; mapped ; 007A # 1.1 LATIN CAPITAL LETTER Z +005B..0060 ; disallowed_STD3_valid # 1.1 LEFT SQUARE BRACKET..GRAVE ACCENT +0061..007A ; valid # 1.1 LATIN SMALL LETTER A..LATIN SMALL LETTER Z +007B..007F ; disallowed_STD3_valid # 1.1 LEFT CURLY BRACKET..<control-007F> +0080..009F ; disallowed # 1.1 <control-0080>..<control-009F> +00A0 ; disallowed_STD3_mapped ; 0020 # 1.1 NO-BREAK SPACE +00A1..00A7 ; valid ; ; NV8 # 1.1 INVERTED EXCLAMATION MARK..SECTION SIGN +00A8 ; disallowed_STD3_mapped ; 0020 0308 # 1.1 DIAERESIS +00A9 ; valid ; ; NV8 # 1.1 COPYRIGHT SIGN +00AA ; mapped ; 0061 # 1.1 FEMININE ORDINAL INDICATOR +00AB..00AC ; valid ; ; NV8 # 1.1 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK..NOT SIGN +00AD ; ignored # 1.1 SOFT HYPHEN +00AE ; valid ; ; NV8 # 1.1 REGISTERED SIGN +00AF ; disallowed_STD3_mapped ; 0020 0304 # 1.1 MACRON +00B0..00B1 ; valid ; ; NV8 # 1.1 DEGREE SIGN..PLUS-MINUS SIGN +00B2 ; mapped ; 0032 # 1.1 SUPERSCRIPT TWO +00B3 ; mapped ; 0033 # 1.1 SUPERSCRIPT THREE +00B4 ; disallowed_STD3_mapped ; 0020 0301 # 1.1 ACUTE ACCENT +00B5 ; mapped ; 03BC # 1.1 MICRO SIGN +00B6 ; valid ; ; NV8 # 1.1 PILCROW SIGN +00B7 ; valid # 1.1 MIDDLE DOT +00B8 ; disallowed_STD3_mapped ; 0020 0327 # 1.1 CEDILLA +00B9 ; mapped ; 0031 # 1.1 SUPERSCRIPT ONE +00BA ; mapped ; 006F # 1.1 MASCULINE ORDINAL INDICATOR +00BB ; valid ; ; NV8 # 1.1 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC ; mapped ; 0031 2044 0034 #1.1 VULGAR FRACTION ONE QUARTER +00BD ; mapped ; 0031 2044 0032 #1.1 VULGAR FRACTION ONE HALF +00BE ; mapped ; 0033 2044 0034 #1.1 VULGAR FRACTION THREE QUARTERS +00BF ; valid ; ; NV8 # 1.1 INVERTED QUESTION MARK +00C0 ; mapped ; 00E0 # 1.1 LATIN CAPITAL LETTER A WITH GRAVE +00C1 ; mapped ; 00E1 # 1.1 LATIN CAPITAL LETTER A WITH ACUTE +00C2 ; mapped ; 00E2 # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3 ; mapped ; 00E3 # 1.1 LATIN CAPITAL LETTER A WITH TILDE +00C4 ; mapped ; 00E4 # 1.1 LATIN CAPITAL LETTER A WITH DIAERESIS +00C5 ; mapped ; 00E5 # 1.1 LATIN CAPITAL LETTER A WITH RING ABOVE +00C6 ; mapped ; 00E6 # 1.1 LATIN CAPITAL LETTER AE +00C7 ; mapped ; 00E7 # 1.1 LATIN CAPITAL LETTER C WITH CEDILLA +00C8 ; mapped ; 00E8 # 1.1 LATIN CAPITAL LETTER E WITH GRAVE +00C9 ; mapped ; 00E9 # 1.1 LATIN CAPITAL LETTER E WITH ACUTE +00CA ; mapped ; 00EA # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB ; mapped ; 00EB # 1.1 LATIN CAPITAL LETTER E WITH DIAERESIS +00CC ; mapped ; 00EC # 1.1 LATIN CAPITAL LETTER I WITH GRAVE +00CD ; mapped ; 00ED # 1.1 LATIN CAPITAL LETTER I WITH ACUTE +00CE ; mapped ; 00EE # 1.1 LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF ; mapped ; 00EF # 1.1 LATIN CAPITAL LETTER I WITH DIAERESIS +00D0 ; mapped ; 00F0 # 1.1 LATIN CAPITAL LETTER ETH +00D1 ; mapped ; 00F1 # 1.1 LATIN CAPITAL LETTER N WITH TILDE +00D2 ; mapped ; 00F2 # 1.1 LATIN CAPITAL LETTER O WITH GRAVE +00D3 ; mapped ; 00F3 # 1.1 LATIN CAPITAL LETTER O WITH ACUTE +00D4 ; mapped ; 00F4 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5 ; mapped ; 00F5 # 1.1 LATIN CAPITAL LETTER O WITH TILDE +00D6 ; mapped ; 00F6 # 1.1 LATIN CAPITAL LETTER O WITH DIAERESIS +00D7 ; valid ; ; NV8 # 1.1 MULTIPLICATION SIGN +00D8 ; mapped ; 00F8 # 1.1 LATIN CAPITAL LETTER O WITH STROKE +00D9 ; mapped ; 00F9 # 1.1 LATIN CAPITAL LETTER U WITH GRAVE +00DA ; mapped ; 00FA # 1.1 LATIN CAPITAL LETTER U WITH ACUTE +00DB ; mapped ; 00FB # 1.1 LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC ; mapped ; 00FC # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS +00DD ; mapped ; 00FD # 1.1 LATIN CAPITAL LETTER Y WITH ACUTE +00DE ; mapped ; 00FE # 1.1 LATIN CAPITAL LETTER THORN +00DF ; deviation ; 0073 0073 # 1.1 LATIN SMALL LETTER SHARP S +00E0..00F6 ; valid # 1.1 LATIN SMALL LETTER A WITH GRAVE..LATIN SMALL LETTER O WITH DIAERESIS +00F7 ; valid ; ; NV8 # 1.1 DIVISION SIGN +00F8..00FF ; valid # 1.1 LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS +0100 ; mapped ; 0101 # 1.1 LATIN CAPITAL LETTER A WITH MACRON +0101 ; valid # 1.1 LATIN SMALL LETTER A WITH MACRON +0102 ; mapped ; 0103 # 1.1 LATIN CAPITAL LETTER A WITH BREVE +0103 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE +0104 ; mapped ; 0105 # 1.1 LATIN CAPITAL LETTER A WITH OGONEK +0105 ; valid # 1.1 LATIN SMALL LETTER A WITH OGONEK +0106 ; mapped ; 0107 # 1.1 LATIN CAPITAL LETTER C WITH ACUTE +0107 ; valid # 1.1 LATIN SMALL LETTER C WITH ACUTE +0108 ; mapped ; 0109 # 1.1 LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0109 ; valid # 1.1 LATIN SMALL LETTER C WITH CIRCUMFLEX +010A ; mapped ; 010B # 1.1 LATIN CAPITAL LETTER C WITH DOT ABOVE +010B ; valid # 1.1 LATIN SMALL LETTER C WITH DOT ABOVE +010C ; mapped ; 010D # 1.1 LATIN CAPITAL LETTER C WITH CARON +010D ; valid # 1.1 LATIN SMALL LETTER C WITH CARON +010E ; mapped ; 010F # 1.1 LATIN CAPITAL LETTER D WITH CARON +010F ; valid # 1.1 LATIN SMALL LETTER D WITH CARON +0110 ; mapped ; 0111 # 1.1 LATIN CAPITAL LETTER D WITH STROKE +0111 ; valid # 1.1 LATIN SMALL LETTER D WITH STROKE +0112 ; mapped ; 0113 # 1.1 LATIN CAPITAL LETTER E WITH MACRON +0113 ; valid # 1.1 LATIN SMALL LETTER E WITH MACRON +0114 ; mapped ; 0115 # 1.1 LATIN CAPITAL LETTER E WITH BREVE +0115 ; valid # 1.1 LATIN SMALL LETTER E WITH BREVE +0116 ; mapped ; 0117 # 1.1 LATIN CAPITAL LETTER E WITH DOT ABOVE +0117 ; valid # 1.1 LATIN SMALL LETTER E WITH DOT ABOVE +0118 ; mapped ; 0119 # 1.1 LATIN CAPITAL LETTER E WITH OGONEK +0119 ; valid # 1.1 LATIN SMALL LETTER E WITH OGONEK +011A ; mapped ; 011B # 1.1 LATIN CAPITAL LETTER E WITH CARON +011B ; valid # 1.1 LATIN SMALL LETTER E WITH CARON +011C ; mapped ; 011D # 1.1 LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011D ; valid # 1.1 LATIN SMALL LETTER G WITH CIRCUMFLEX +011E ; mapped ; 011F # 1.1 LATIN CAPITAL LETTER G WITH BREVE +011F ; valid # 1.1 LATIN SMALL LETTER G WITH BREVE +0120 ; mapped ; 0121 # 1.1 LATIN CAPITAL LETTER G WITH DOT ABOVE +0121 ; valid # 1.1 LATIN SMALL LETTER G WITH DOT ABOVE +0122 ; mapped ; 0123 # 1.1 LATIN CAPITAL LETTER G WITH CEDILLA +0123 ; valid # 1.1 LATIN SMALL LETTER G WITH CEDILLA +0124 ; mapped ; 0125 # 1.1 LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0125 ; valid # 1.1 LATIN SMALL LETTER H WITH CIRCUMFLEX +0126 ; mapped ; 0127 # 1.1 LATIN CAPITAL LETTER H WITH STROKE +0127 ; valid # 1.1 LATIN SMALL LETTER H WITH STROKE +0128 ; mapped ; 0129 # 1.1 LATIN CAPITAL LETTER I WITH TILDE +0129 ; valid # 1.1 LATIN SMALL LETTER I WITH TILDE +012A ; mapped ; 012B # 1.1 LATIN CAPITAL LETTER I WITH MACRON +012B ; valid # 1.1 LATIN SMALL LETTER I WITH MACRON +012C ; mapped ; 012D # 1.1 LATIN CAPITAL LETTER I WITH BREVE +012D ; valid # 1.1 LATIN SMALL LETTER I WITH BREVE +012E ; mapped ; 012F # 1.1 LATIN CAPITAL LETTER I WITH OGONEK +012F ; valid # 1.1 LATIN SMALL LETTER I WITH OGONEK +0130 ; mapped ; 0069 0307 # 1.1 LATIN CAPITAL LETTER I WITH DOT ABOVE +0131 ; valid # 1.1 LATIN SMALL LETTER DOTLESS I +0132..0133 ; mapped ; 0069 006A # 1.1 LATIN CAPITAL LIGATURE IJ..LATIN SMALL LIGATURE IJ +0134 ; mapped ; 0135 # 1.1 LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0135 ; valid # 1.1 LATIN SMALL LETTER J WITH CIRCUMFLEX +0136 ; mapped ; 0137 # 1.1 LATIN CAPITAL LETTER K WITH CEDILLA +0137..0138 ; valid # 1.1 LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA +0139 ; mapped ; 013A # 1.1 LATIN CAPITAL LETTER L WITH ACUTE +013A ; valid # 1.1 LATIN SMALL LETTER L WITH ACUTE +013B ; mapped ; 013C # 1.1 LATIN CAPITAL LETTER L WITH CEDILLA +013C ; valid # 1.1 LATIN SMALL LETTER L WITH CEDILLA +013D ; mapped ; 013E # 1.1 LATIN CAPITAL LETTER L WITH CARON +013E ; valid # 1.1 LATIN SMALL LETTER L WITH CARON +013F..0140 ; mapped ; 006C 00B7 # 1.1 LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH MIDDLE DOT +0141 ; mapped ; 0142 # 1.1 LATIN CAPITAL LETTER L WITH STROKE +0142 ; valid # 1.1 LATIN SMALL LETTER L WITH STROKE +0143 ; mapped ; 0144 # 1.1 LATIN CAPITAL LETTER N WITH ACUTE +0144 ; valid # 1.1 LATIN SMALL LETTER N WITH ACUTE +0145 ; mapped ; 0146 # 1.1 LATIN CAPITAL LETTER N WITH CEDILLA +0146 ; valid # 1.1 LATIN SMALL LETTER N WITH CEDILLA +0147 ; mapped ; 0148 # 1.1 LATIN CAPITAL LETTER N WITH CARON +0148 ; valid # 1.1 LATIN SMALL LETTER N WITH CARON +0149 ; mapped ; 02BC 006E # 1.1 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A ; mapped ; 014B # 1.1 LATIN CAPITAL LETTER ENG +014B ; valid # 1.1 LATIN SMALL LETTER ENG +014C ; mapped ; 014D # 1.1 LATIN CAPITAL LETTER O WITH MACRON +014D ; valid # 1.1 LATIN SMALL LETTER O WITH MACRON +014E ; mapped ; 014F # 1.1 LATIN CAPITAL LETTER O WITH BREVE +014F ; valid # 1.1 LATIN SMALL LETTER O WITH BREVE +0150 ; mapped ; 0151 # 1.1 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0151 ; valid # 1.1 LATIN SMALL LETTER O WITH DOUBLE ACUTE +0152 ; mapped ; 0153 # 1.1 LATIN CAPITAL LIGATURE OE +0153 ; valid # 1.1 LATIN SMALL LIGATURE OE +0154 ; mapped ; 0155 # 1.1 LATIN CAPITAL LETTER R WITH ACUTE +0155 ; valid # 1.1 LATIN SMALL LETTER R WITH ACUTE +0156 ; mapped ; 0157 # 1.1 LATIN CAPITAL LETTER R WITH CEDILLA +0157 ; valid # 1.1 LATIN SMALL LETTER R WITH CEDILLA +0158 ; mapped ; 0159 # 1.1 LATIN CAPITAL LETTER R WITH CARON +0159 ; valid # 1.1 LATIN SMALL LETTER R WITH CARON +015A ; mapped ; 015B # 1.1 LATIN CAPITAL LETTER S WITH ACUTE +015B ; valid # 1.1 LATIN SMALL LETTER S WITH ACUTE +015C ; mapped ; 015D # 1.1 LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015D ; valid # 1.1 LATIN SMALL LETTER S WITH CIRCUMFLEX +015E ; mapped ; 015F # 1.1 LATIN CAPITAL LETTER S WITH CEDILLA +015F ; valid # 1.1 LATIN SMALL LETTER S WITH CEDILLA +0160 ; mapped ; 0161 # 1.1 LATIN CAPITAL LETTER S WITH CARON +0161 ; valid # 1.1 LATIN SMALL LETTER S WITH CARON +0162 ; mapped ; 0163 # 1.1 LATIN CAPITAL LETTER T WITH CEDILLA +0163 ; valid # 1.1 LATIN SMALL LETTER T WITH CEDILLA +0164 ; mapped ; 0165 # 1.1 LATIN CAPITAL LETTER T WITH CARON +0165 ; valid # 1.1 LATIN SMALL LETTER T WITH CARON +0166 ; mapped ; 0167 # 1.1 LATIN CAPITAL LETTER T WITH STROKE +0167 ; valid # 1.1 LATIN SMALL LETTER T WITH STROKE +0168 ; mapped ; 0169 # 1.1 LATIN CAPITAL LETTER U WITH TILDE +0169 ; valid # 1.1 LATIN SMALL LETTER U WITH TILDE +016A ; mapped ; 016B # 1.1 LATIN CAPITAL LETTER U WITH MACRON +016B ; valid # 1.1 LATIN SMALL LETTER U WITH MACRON +016C ; mapped ; 016D # 1.1 LATIN CAPITAL LETTER U WITH BREVE +016D ; valid # 1.1 LATIN SMALL LETTER U WITH BREVE +016E ; mapped ; 016F # 1.1 LATIN CAPITAL LETTER U WITH RING ABOVE +016F ; valid # 1.1 LATIN SMALL LETTER U WITH RING ABOVE +0170 ; mapped ; 0171 # 1.1 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0171 ; valid # 1.1 LATIN SMALL LETTER U WITH DOUBLE ACUTE +0172 ; mapped ; 0173 # 1.1 LATIN CAPITAL LETTER U WITH OGONEK +0173 ; valid # 1.1 LATIN SMALL LETTER U WITH OGONEK +0174 ; mapped ; 0175 # 1.1 LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0175 ; valid # 1.1 LATIN SMALL LETTER W WITH CIRCUMFLEX +0176 ; mapped ; 0177 # 1.1 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0177 ; valid # 1.1 LATIN SMALL LETTER Y WITH CIRCUMFLEX +0178 ; mapped ; 00FF # 1.1 LATIN CAPITAL LETTER Y WITH DIAERESIS +0179 ; mapped ; 017A # 1.1 LATIN CAPITAL LETTER Z WITH ACUTE +017A ; valid # 1.1 LATIN SMALL LETTER Z WITH ACUTE +017B ; mapped ; 017C # 1.1 LATIN CAPITAL LETTER Z WITH DOT ABOVE +017C ; valid # 1.1 LATIN SMALL LETTER Z WITH DOT ABOVE +017D ; mapped ; 017E # 1.1 LATIN CAPITAL LETTER Z WITH CARON +017E ; valid # 1.1 LATIN SMALL LETTER Z WITH CARON +017F ; mapped ; 0073 # 1.1 LATIN SMALL LETTER LONG S +0180 ; valid # 1.1 LATIN SMALL LETTER B WITH STROKE +0181 ; mapped ; 0253 # 1.1 LATIN CAPITAL LETTER B WITH HOOK +0182 ; mapped ; 0183 # 1.1 LATIN CAPITAL LETTER B WITH TOPBAR +0183 ; valid # 1.1 LATIN SMALL LETTER B WITH TOPBAR +0184 ; mapped ; 0185 # 1.1 LATIN CAPITAL LETTER TONE SIX +0185 ; valid # 1.1 LATIN SMALL LETTER TONE SIX +0186 ; mapped ; 0254 # 1.1 LATIN CAPITAL LETTER OPEN O +0187 ; mapped ; 0188 # 1.1 LATIN CAPITAL LETTER C WITH HOOK +0188 ; valid # 1.1 LATIN SMALL LETTER C WITH HOOK +0189 ; mapped ; 0256 # 1.1 LATIN CAPITAL LETTER AFRICAN D +018A ; mapped ; 0257 # 1.1 LATIN CAPITAL LETTER D WITH HOOK +018B ; mapped ; 018C # 1.1 LATIN CAPITAL LETTER D WITH TOPBAR +018C..018D ; valid # 1.1 LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA +018E ; mapped ; 01DD # 1.1 LATIN CAPITAL LETTER REVERSED E +018F ; mapped ; 0259 # 1.1 LATIN CAPITAL LETTER SCHWA +0190 ; mapped ; 025B # 1.1 LATIN CAPITAL LETTER OPEN E +0191 ; mapped ; 0192 # 1.1 LATIN CAPITAL LETTER F WITH HOOK +0192 ; valid # 1.1 LATIN SMALL LETTER F WITH HOOK +0193 ; mapped ; 0260 # 1.1 LATIN CAPITAL LETTER G WITH HOOK +0194 ; mapped ; 0263 # 1.1 LATIN CAPITAL LETTER GAMMA +0195 ; valid # 1.1 LATIN SMALL LETTER HV +0196 ; mapped ; 0269 # 1.1 LATIN CAPITAL LETTER IOTA +0197 ; mapped ; 0268 # 1.1 LATIN CAPITAL LETTER I WITH STROKE +0198 ; mapped ; 0199 # 1.1 LATIN CAPITAL LETTER K WITH HOOK +0199..019B ; valid # 1.1 LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE +019C ; mapped ; 026F # 1.1 LATIN CAPITAL LETTER TURNED M +019D ; mapped ; 0272 # 1.1 LATIN CAPITAL LETTER N WITH LEFT HOOK +019E ; valid # 1.1 LATIN SMALL LETTER N WITH LONG RIGHT LEG +019F ; mapped ; 0275 # 1.1 LATIN CAPITAL LETTER O WITH MIDDLE TILDE +01A0 ; mapped ; 01A1 # 1.1 LATIN CAPITAL LETTER O WITH HORN +01A1 ; valid # 1.1 LATIN SMALL LETTER O WITH HORN +01A2 ; mapped ; 01A3 # 1.1 LATIN CAPITAL LETTER OI +01A3 ; valid # 1.1 LATIN SMALL LETTER OI +01A4 ; mapped ; 01A5 # 1.1 LATIN CAPITAL LETTER P WITH HOOK +01A5 ; valid # 1.1 LATIN SMALL LETTER P WITH HOOK +01A6 ; mapped ; 0280 # 1.1 LATIN LETTER YR +01A7 ; mapped ; 01A8 # 1.1 LATIN CAPITAL LETTER TONE TWO +01A8 ; valid # 1.1 LATIN SMALL LETTER TONE TWO +01A9 ; mapped ; 0283 # 1.1 LATIN CAPITAL LETTER ESH +01AA..01AB ; valid # 1.1 LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK +01AC ; mapped ; 01AD # 1.1 LATIN CAPITAL LETTER T WITH HOOK +01AD ; valid # 1.1 LATIN SMALL LETTER T WITH HOOK +01AE ; mapped ; 0288 # 1.1 LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +01AF ; mapped ; 01B0 # 1.1 LATIN CAPITAL LETTER U WITH HORN +01B0 ; valid # 1.1 LATIN SMALL LETTER U WITH HORN +01B1 ; mapped ; 028A # 1.1 LATIN CAPITAL LETTER UPSILON +01B2 ; mapped ; 028B # 1.1 LATIN CAPITAL LETTER V WITH HOOK +01B3 ; mapped ; 01B4 # 1.1 LATIN CAPITAL LETTER Y WITH HOOK +01B4 ; valid # 1.1 LATIN SMALL LETTER Y WITH HOOK +01B5 ; mapped ; 01B6 # 1.1 LATIN CAPITAL LETTER Z WITH STROKE +01B6 ; valid # 1.1 LATIN SMALL LETTER Z WITH STROKE +01B7 ; mapped ; 0292 # 1.1 LATIN CAPITAL LETTER EZH +01B8 ; mapped ; 01B9 # 1.1 LATIN CAPITAL LETTER EZH REVERSED +01B9..01BB ; valid # 1.1 LATIN SMALL LETTER EZH REVERSED..LATIN LETTER TWO WITH STROKE +01BC ; mapped ; 01BD # 1.1 LATIN CAPITAL LETTER TONE FIVE +01BD..01C3 ; valid # 1.1 LATIN SMALL LETTER TONE FIVE..LATIN LETTER RETROFLEX CLICK +01C4..01C6 ; mapped ; 0064 017E # 1.1 LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER DZ WITH CARON +01C7..01C9 ; mapped ; 006C 006A # 1.1 LATIN CAPITAL LETTER LJ..LATIN SMALL LETTER LJ +01CA..01CC ; mapped ; 006E 006A # 1.1 LATIN CAPITAL LETTER NJ..LATIN SMALL LETTER NJ +01CD ; mapped ; 01CE # 1.1 LATIN CAPITAL LETTER A WITH CARON +01CE ; valid # 1.1 LATIN SMALL LETTER A WITH CARON +01CF ; mapped ; 01D0 # 1.1 LATIN CAPITAL LETTER I WITH CARON +01D0 ; valid # 1.1 LATIN SMALL LETTER I WITH CARON +01D1 ; mapped ; 01D2 # 1.1 LATIN CAPITAL LETTER O WITH CARON +01D2 ; valid # 1.1 LATIN SMALL LETTER O WITH CARON +01D3 ; mapped ; 01D4 # 1.1 LATIN CAPITAL LETTER U WITH CARON +01D4 ; valid # 1.1 LATIN SMALL LETTER U WITH CARON +01D5 ; mapped ; 01D6 # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6 ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7 ; mapped ; 01D8 # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8 ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9 ; mapped ; 01DA # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB ; mapped ; 01DC # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC..01DD ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E +01DE ; mapped ; 01DF # 1.1 LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01DF ; valid # 1.1 LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01E0 ; mapped ; 01E1 # 1.1 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E1 ; valid # 1.1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E2 ; mapped ; 01E3 # 1.1 LATIN CAPITAL LETTER AE WITH MACRON +01E3 ; valid # 1.1 LATIN SMALL LETTER AE WITH MACRON +01E4 ; mapped ; 01E5 # 1.1 LATIN CAPITAL LETTER G WITH STROKE +01E5 ; valid # 1.1 LATIN SMALL LETTER G WITH STROKE +01E6 ; mapped ; 01E7 # 1.1 LATIN CAPITAL LETTER G WITH CARON +01E7 ; valid # 1.1 LATIN SMALL LETTER G WITH CARON +01E8 ; mapped ; 01E9 # 1.1 LATIN CAPITAL LETTER K WITH CARON +01E9 ; valid # 1.1 LATIN SMALL LETTER K WITH CARON +01EA ; mapped ; 01EB # 1.1 LATIN CAPITAL LETTER O WITH OGONEK +01EB ; valid # 1.1 LATIN SMALL LETTER O WITH OGONEK +01EC ; mapped ; 01ED # 1.1 LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01ED ; valid # 1.1 LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EE ; mapped ; 01EF # 1.1 LATIN CAPITAL LETTER EZH WITH CARON +01EF..01F0 ; valid # 1.1 LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON +01F1..01F3 ; mapped ; 0064 007A # 1.1 LATIN CAPITAL LETTER DZ..LATIN SMALL LETTER DZ +01F4 ; mapped ; 01F5 # 1.1 LATIN CAPITAL LETTER G WITH ACUTE +01F5 ; valid # 1.1 LATIN SMALL LETTER G WITH ACUTE +01F6 ; mapped ; 0195 # 3.0 LATIN CAPITAL LETTER HWAIR +01F7 ; mapped ; 01BF # 3.0 LATIN CAPITAL LETTER WYNN +01F8 ; mapped ; 01F9 # 3.0 LATIN CAPITAL LETTER N WITH GRAVE +01F9 ; valid # 3.0 LATIN SMALL LETTER N WITH GRAVE +01FA ; mapped ; 01FB # 1.1 LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FB ; valid # 1.1 LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FC ; mapped ; 01FD # 1.1 LATIN CAPITAL LETTER AE WITH ACUTE +01FD ; valid # 1.1 LATIN SMALL LETTER AE WITH ACUTE +01FE ; mapped ; 01FF # 1.1 LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +01FF ; valid # 1.1 LATIN SMALL LETTER O WITH STROKE AND ACUTE +0200 ; mapped ; 0201 # 1.1 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0201 ; valid # 1.1 LATIN SMALL LETTER A WITH DOUBLE GRAVE +0202 ; mapped ; 0203 # 1.1 LATIN CAPITAL LETTER A WITH INVERTED BREVE +0203 ; valid # 1.1 LATIN SMALL LETTER A WITH INVERTED BREVE +0204 ; mapped ; 0205 # 1.1 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0205 ; valid # 1.1 LATIN SMALL LETTER E WITH DOUBLE GRAVE +0206 ; mapped ; 0207 # 1.1 LATIN CAPITAL LETTER E WITH INVERTED BREVE +0207 ; valid # 1.1 LATIN SMALL LETTER E WITH INVERTED BREVE +0208 ; mapped ; 0209 # 1.1 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +0209 ; valid # 1.1 LATIN SMALL LETTER I WITH DOUBLE GRAVE +020A ; mapped ; 020B # 1.1 LATIN CAPITAL LETTER I WITH INVERTED BREVE +020B ; valid # 1.1 LATIN SMALL LETTER I WITH INVERTED BREVE +020C ; mapped ; 020D # 1.1 LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020D ; valid # 1.1 LATIN SMALL LETTER O WITH DOUBLE GRAVE +020E ; mapped ; 020F # 1.1 LATIN CAPITAL LETTER O WITH INVERTED BREVE +020F ; valid # 1.1 LATIN SMALL LETTER O WITH INVERTED BREVE +0210 ; mapped ; 0211 # 1.1 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0211 ; valid # 1.1 LATIN SMALL LETTER R WITH DOUBLE GRAVE +0212 ; mapped ; 0213 # 1.1 LATIN CAPITAL LETTER R WITH INVERTED BREVE +0213 ; valid # 1.1 LATIN SMALL LETTER R WITH INVERTED BREVE +0214 ; mapped ; 0215 # 1.1 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0215 ; valid # 1.1 LATIN SMALL LETTER U WITH DOUBLE GRAVE +0216 ; mapped ; 0217 # 1.1 LATIN CAPITAL LETTER U WITH INVERTED BREVE +0217 ; valid # 1.1 LATIN SMALL LETTER U WITH INVERTED BREVE +0218 ; mapped ; 0219 # 3.0 LATIN CAPITAL LETTER S WITH COMMA BELOW +0219 ; valid # 3.0 LATIN SMALL LETTER S WITH COMMA BELOW +021A ; mapped ; 021B # 3.0 LATIN CAPITAL LETTER T WITH COMMA BELOW +021B ; valid # 3.0 LATIN SMALL LETTER T WITH COMMA BELOW +021C ; mapped ; 021D # 3.0 LATIN CAPITAL LETTER YOGH +021D ; valid # 3.0 LATIN SMALL LETTER YOGH +021E ; mapped ; 021F # 3.0 LATIN CAPITAL LETTER H WITH CARON +021F ; valid # 3.0 LATIN SMALL LETTER H WITH CARON +0220 ; mapped ; 019E # 3.2 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0221 ; valid # 4.0 LATIN SMALL LETTER D WITH CURL +0222 ; mapped ; 0223 # 3.0 LATIN CAPITAL LETTER OU +0223 ; valid # 3.0 LATIN SMALL LETTER OU +0224 ; mapped ; 0225 # 3.0 LATIN CAPITAL LETTER Z WITH HOOK +0225 ; valid # 3.0 LATIN SMALL LETTER Z WITH HOOK +0226 ; mapped ; 0227 # 3.0 LATIN CAPITAL LETTER A WITH DOT ABOVE +0227 ; valid # 3.0 LATIN SMALL LETTER A WITH DOT ABOVE +0228 ; mapped ; 0229 # 3.0 LATIN CAPITAL LETTER E WITH CEDILLA +0229 ; valid # 3.0 LATIN SMALL LETTER E WITH CEDILLA +022A ; mapped ; 022B # 3.0 LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022B ; valid # 3.0 LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022C ; mapped ; 022D # 3.0 LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022D ; valid # 3.0 LATIN SMALL LETTER O WITH TILDE AND MACRON +022E ; mapped ; 022F # 3.0 LATIN CAPITAL LETTER O WITH DOT ABOVE +022F ; valid # 3.0 LATIN SMALL LETTER O WITH DOT ABOVE +0230 ; mapped ; 0231 # 3.0 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0231 ; valid # 3.0 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0232 ; mapped ; 0233 # 3.0 LATIN CAPITAL LETTER Y WITH MACRON +0233 ; valid # 3.0 LATIN SMALL LETTER Y WITH MACRON +0234..0236 ; valid # 4.0 LATIN SMALL LETTER L WITH CURL..LATIN SMALL LETTER T WITH CURL +0237..0239 ; valid # 4.1 LATIN SMALL LETTER DOTLESS J..LATIN SMALL LETTER QP DIGRAPH +023A ; mapped ; 2C65 # 4.1 LATIN CAPITAL LETTER A WITH STROKE +023B ; mapped ; 023C # 4.1 LATIN CAPITAL LETTER C WITH STROKE +023C ; valid # 4.1 LATIN SMALL LETTER C WITH STROKE +023D ; mapped ; 019A # 4.1 LATIN CAPITAL LETTER L WITH BAR +023E ; mapped ; 2C66 # 4.1 LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +023F..0240 ; valid # 4.1 LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL +0241 ; mapped ; 0242 # 4.1 LATIN CAPITAL LETTER GLOTTAL STOP +0242 ; valid # 5.0 LATIN SMALL LETTER GLOTTAL STOP +0243 ; mapped ; 0180 # 5.0 LATIN CAPITAL LETTER B WITH STROKE +0244 ; mapped ; 0289 # 5.0 LATIN CAPITAL LETTER U BAR +0245 ; mapped ; 028C # 5.0 LATIN CAPITAL LETTER TURNED V +0246 ; mapped ; 0247 # 5.0 LATIN CAPITAL LETTER E WITH STROKE +0247 ; valid # 5.0 LATIN SMALL LETTER E WITH STROKE +0248 ; mapped ; 0249 # 5.0 LATIN CAPITAL LETTER J WITH STROKE +0249 ; valid # 5.0 LATIN SMALL LETTER J WITH STROKE +024A ; mapped ; 024B # 5.0 LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +024B ; valid # 5.0 LATIN SMALL LETTER Q WITH HOOK TAIL +024C ; mapped ; 024D # 5.0 LATIN CAPITAL LETTER R WITH STROKE +024D ; valid # 5.0 LATIN SMALL LETTER R WITH STROKE +024E ; mapped ; 024F # 5.0 LATIN CAPITAL LETTER Y WITH STROKE +024F ; valid # 5.0 LATIN SMALL LETTER Y WITH STROKE +0250..02A8 ; valid # 1.1 LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TC DIGRAPH WITH CURL +02A9..02AD ; valid # 3.0 LATIN SMALL LETTER FENG DIGRAPH..LATIN LETTER BIDENTAL PERCUSSIVE +02AE..02AF ; valid # 4.0 LATIN SMALL LETTER TURNED H WITH FISHHOOK..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0 ; mapped ; 0068 # 1.1 MODIFIER LETTER SMALL H +02B1 ; mapped ; 0266 # 1.1 MODIFIER LETTER SMALL H WITH HOOK +02B2 ; mapped ; 006A # 1.1 MODIFIER LETTER SMALL J +02B3 ; mapped ; 0072 # 1.1 MODIFIER LETTER SMALL R +02B4 ; mapped ; 0279 # 1.1 MODIFIER LETTER SMALL TURNED R +02B5 ; mapped ; 027B # 1.1 MODIFIER LETTER SMALL TURNED R WITH HOOK +02B6 ; mapped ; 0281 # 1.1 MODIFIER LETTER SMALL CAPITAL INVERTED R +02B7 ; mapped ; 0077 # 1.1 MODIFIER LETTER SMALL W +02B8 ; mapped ; 0079 # 1.1 MODIFIER LETTER SMALL Y +02B9..02C1 ; valid # 1.1 MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; valid ; ; NV8 # 1.1 MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; valid # 1.1 MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02D7 ; valid ; ; NV8 # 1.1 MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN +02D8 ; disallowed_STD3_mapped ; 0020 0306 # 1.1 BREVE +02D9 ; disallowed_STD3_mapped ; 0020 0307 # 1.1 DOT ABOVE +02DA ; disallowed_STD3_mapped ; 0020 030A # 1.1 RING ABOVE +02DB ; disallowed_STD3_mapped ; 0020 0328 # 1.1 OGONEK +02DC ; disallowed_STD3_mapped ; 0020 0303 # 1.1 SMALL TILDE +02DD ; disallowed_STD3_mapped ; 0020 030B # 1.1 DOUBLE ACUTE ACCENT +02DE ; valid ; ; NV8 # 1.1 MODIFIER LETTER RHOTIC HOOK +02DF ; valid ; ; NV8 # 3.0 MODIFIER LETTER CROSS ACCENT +02E0 ; mapped ; 0263 # 1.1 MODIFIER LETTER SMALL GAMMA +02E1 ; mapped ; 006C # 1.1 MODIFIER LETTER SMALL L +02E2 ; mapped ; 0073 # 1.1 MODIFIER LETTER SMALL S +02E3 ; mapped ; 0078 # 1.1 MODIFIER LETTER SMALL X +02E4 ; mapped ; 0295 # 1.1 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02E9 ; valid ; ; NV8 # 1.1 MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER EXTRA-LOW TONE BAR +02EA..02EB ; valid ; ; NV8 # 3.0 MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; valid # 3.0 MODIFIER LETTER VOICING +02ED ; valid ; ; NV8 # 3.0 MODIFIER LETTER UNASPIRATED +02EE ; valid # 3.0 MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; valid ; ; NV8 # 4.0 MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..033F ; valid # 1.1 COMBINING GRAVE ACCENT..COMBINING DOUBLE OVERLINE +0340 ; mapped ; 0300 # 1.1 COMBINING GRAVE TONE MARK +0341 ; mapped ; 0301 # 1.1 COMBINING ACUTE TONE MARK +0342 ; valid # 1.1 COMBINING GREEK PERISPOMENI +0343 ; mapped ; 0313 # 1.1 COMBINING GREEK KORONIS +0344 ; mapped ; 0308 0301 # 1.1 COMBINING GREEK DIALYTIKA TONOS +0345 ; mapped ; 03B9 # 1.1 COMBINING GREEK YPOGEGRAMMENI +0346..034E ; valid # 3.0 COMBINING BRIDGE ABOVE..COMBINING UPWARDS ARROW BELOW +034F ; ignored # 3.2 COMBINING GRAPHEME JOINER +0350..0357 ; valid # 4.0 COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE +0358..035C ; valid # 4.1 COMBINING DOT ABOVE RIGHT..COMBINING DOUBLE BREVE BELOW +035D..035F ; valid # 4.0 COMBINING DOUBLE BREVE..COMBINING DOUBLE MACRON BELOW +0360..0361 ; valid # 1.1 COMBINING DOUBLE TILDE..COMBINING DOUBLE INVERTED BREVE +0362 ; valid # 3.0 COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0363..036F ; valid # 3.2 COMBINING LATIN SMALL LETTER A..COMBINING LATIN SMALL LETTER X +0370 ; mapped ; 0371 # 5.1 GREEK CAPITAL LETTER HETA +0371 ; valid # 5.1 GREEK SMALL LETTER HETA +0372 ; mapped ; 0373 # 5.1 GREEK CAPITAL LETTER ARCHAIC SAMPI +0373 ; valid # 5.1 GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; mapped ; 02B9 # 1.1 GREEK NUMERAL SIGN +0375 ; valid # 1.1 GREEK LOWER NUMERAL SIGN +0376 ; mapped ; 0377 # 5.1 GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +0377 ; valid # 5.1 GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +0378..0379 ; disallowed # NA <reserved-0378>..<reserved-0379> +037A ; disallowed_STD3_mapped ; 0020 03B9 # 1.1 GREEK YPOGEGRAMMENI +037B..037D ; valid # 5.0 GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037E ; disallowed_STD3_mapped ; 003B # 1.1 GREEK QUESTION MARK +037F ; mapped ; 03F3 # 7.0 GREEK CAPITAL LETTER YOT +0380..0383 ; disallowed # NA <reserved-0380>..<reserved-0383> +0384 ; disallowed_STD3_mapped ; 0020 0301 # 1.1 GREEK TONOS +0385 ; disallowed_STD3_mapped ; 0020 0308 0301 #1.1 GREEK DIALYTIKA TONOS +0386 ; mapped ; 03AC # 1.1 GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 ; mapped ; 00B7 # 1.1 GREEK ANO TELEIA +0388 ; mapped ; 03AD # 1.1 GREEK CAPITAL LETTER EPSILON WITH TONOS +0389 ; mapped ; 03AE # 1.1 GREEK CAPITAL LETTER ETA WITH TONOS +038A ; mapped ; 03AF # 1.1 GREEK CAPITAL LETTER IOTA WITH TONOS +038B ; disallowed # NA <reserved-038B> +038C ; mapped ; 03CC # 1.1 GREEK CAPITAL LETTER OMICRON WITH TONOS +038D ; disallowed # NA <reserved-038D> +038E ; mapped ; 03CD # 1.1 GREEK CAPITAL LETTER UPSILON WITH TONOS +038F ; mapped ; 03CE # 1.1 GREEK CAPITAL LETTER OMEGA WITH TONOS +0390 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391 ; mapped ; 03B1 # 1.1 GREEK CAPITAL LETTER ALPHA +0392 ; mapped ; 03B2 # 1.1 GREEK CAPITAL LETTER BETA +0393 ; mapped ; 03B3 # 1.1 GREEK CAPITAL LETTER GAMMA +0394 ; mapped ; 03B4 # 1.1 GREEK CAPITAL LETTER DELTA +0395 ; mapped ; 03B5 # 1.1 GREEK CAPITAL LETTER EPSILON +0396 ; mapped ; 03B6 # 1.1 GREEK CAPITAL LETTER ZETA +0397 ; mapped ; 03B7 # 1.1 GREEK CAPITAL LETTER ETA +0398 ; mapped ; 03B8 # 1.1 GREEK CAPITAL LETTER THETA +0399 ; mapped ; 03B9 # 1.1 GREEK CAPITAL LETTER IOTA +039A ; mapped ; 03BA # 1.1 GREEK CAPITAL LETTER KAPPA +039B ; mapped ; 03BB # 1.1 GREEK CAPITAL LETTER LAMDA +039C ; mapped ; 03BC # 1.1 GREEK CAPITAL LETTER MU +039D ; mapped ; 03BD # 1.1 GREEK CAPITAL LETTER NU +039E ; mapped ; 03BE # 1.1 GREEK CAPITAL LETTER XI +039F ; mapped ; 03BF # 1.1 GREEK CAPITAL LETTER OMICRON +03A0 ; mapped ; 03C0 # 1.1 GREEK CAPITAL LETTER PI +03A1 ; mapped ; 03C1 # 1.1 GREEK CAPITAL LETTER RHO +03A2 ; disallowed # NA <reserved-03A2> +03A3 ; mapped ; 03C3 # 1.1 GREEK CAPITAL LETTER SIGMA +03A4 ; mapped ; 03C4 # 1.1 GREEK CAPITAL LETTER TAU +03A5 ; mapped ; 03C5 # 1.1 GREEK CAPITAL LETTER UPSILON +03A6 ; mapped ; 03C6 # 1.1 GREEK CAPITAL LETTER PHI +03A7 ; mapped ; 03C7 # 1.1 GREEK CAPITAL LETTER CHI +03A8 ; mapped ; 03C8 # 1.1 GREEK CAPITAL LETTER PSI +03A9 ; mapped ; 03C9 # 1.1 GREEK CAPITAL LETTER OMEGA +03AA ; mapped ; 03CA # 1.1 GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB ; mapped ; 03CB # 1.1 GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03AC..03C1 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER RHO +03C2 ; deviation ; 03C3 # 1.1 GREEK SMALL LETTER FINAL SIGMA +03C3..03CE ; valid # 1.1 GREEK SMALL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS +03CF ; mapped ; 03D7 # 5.1 GREEK CAPITAL KAI SYMBOL +03D0 ; mapped ; 03B2 # 1.1 GREEK BETA SYMBOL +03D1 ; mapped ; 03B8 # 1.1 GREEK THETA SYMBOL +03D2 ; mapped ; 03C5 # 1.1 GREEK UPSILON WITH HOOK SYMBOL +03D3 ; mapped ; 03CD # 1.1 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +03D4 ; mapped ; 03CB # 1.1 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03D5 ; mapped ; 03C6 # 1.1 GREEK PHI SYMBOL +03D6 ; mapped ; 03C0 # 1.1 GREEK PI SYMBOL +03D7 ; valid # 3.0 GREEK KAI SYMBOL +03D8 ; mapped ; 03D9 # 3.2 GREEK LETTER ARCHAIC KOPPA +03D9 ; valid # 3.2 GREEK SMALL LETTER ARCHAIC KOPPA +03DA ; mapped ; 03DB # 1.1 GREEK LETTER STIGMA +03DB ; valid # 3.0 GREEK SMALL LETTER STIGMA +03DC ; mapped ; 03DD # 1.1 GREEK LETTER DIGAMMA +03DD ; valid # 3.0 GREEK SMALL LETTER DIGAMMA +03DE ; mapped ; 03DF # 1.1 GREEK LETTER KOPPA +03DF ; valid # 3.0 GREEK SMALL LETTER KOPPA +03E0 ; mapped ; 03E1 # 1.1 GREEK LETTER SAMPI +03E1 ; valid # 3.0 GREEK SMALL LETTER SAMPI +03E2 ; mapped ; 03E3 # 1.1 COPTIC CAPITAL LETTER SHEI +03E3 ; valid # 1.1 COPTIC SMALL LETTER SHEI +03E4 ; mapped ; 03E5 # 1.1 COPTIC CAPITAL LETTER FEI +03E5 ; valid # 1.1 COPTIC SMALL LETTER FEI +03E6 ; mapped ; 03E7 # 1.1 COPTIC CAPITAL LETTER KHEI +03E7 ; valid # 1.1 COPTIC SMALL LETTER KHEI +03E8 ; mapped ; 03E9 # 1.1 COPTIC CAPITAL LETTER HORI +03E9 ; valid # 1.1 COPTIC SMALL LETTER HORI +03EA ; mapped ; 03EB # 1.1 COPTIC CAPITAL LETTER GANGIA +03EB ; valid # 1.1 COPTIC SMALL LETTER GANGIA +03EC ; mapped ; 03ED # 1.1 COPTIC CAPITAL LETTER SHIMA +03ED ; valid # 1.1 COPTIC SMALL LETTER SHIMA +03EE ; mapped ; 03EF # 1.1 COPTIC CAPITAL LETTER DEI +03EF ; valid # 1.1 COPTIC SMALL LETTER DEI +03F0 ; mapped ; 03BA # 1.1 GREEK KAPPA SYMBOL +03F1 ; mapped ; 03C1 # 1.1 GREEK RHO SYMBOL +03F2 ; mapped ; 03C3 # 1.1 GREEK LUNATE SIGMA SYMBOL +03F3 ; valid # 1.1 GREEK LETTER YOT +03F4 ; mapped ; 03B8 # 3.1 GREEK CAPITAL THETA SYMBOL +03F5 ; mapped ; 03B5 # 3.1 GREEK LUNATE EPSILON SYMBOL +03F6 ; valid ; ; NV8 # 3.2 GREEK REVERSED LUNATE EPSILON SYMBOL +03F7 ; mapped ; 03F8 # 4.0 GREEK CAPITAL LETTER SHO +03F8 ; valid # 4.0 GREEK SMALL LETTER SHO +03F9 ; mapped ; 03C3 # 4.0 GREEK CAPITAL LUNATE SIGMA SYMBOL +03FA ; mapped ; 03FB # 4.0 GREEK CAPITAL LETTER SAN +03FB ; valid # 4.0 GREEK SMALL LETTER SAN +03FC ; valid # 4.1 GREEK RHO WITH STROKE SYMBOL +03FD ; mapped ; 037B # 4.1 GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +03FE ; mapped ; 037C # 4.1 GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +03FF ; mapped ; 037D # 4.1 GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400 ; mapped ; 0450 # 3.0 CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401 ; mapped ; 0451 # 1.1 CYRILLIC CAPITAL LETTER IO +0402 ; mapped ; 0452 # 1.1 CYRILLIC CAPITAL LETTER DJE +0403 ; mapped ; 0453 # 1.1 CYRILLIC CAPITAL LETTER GJE +0404 ; mapped ; 0454 # 1.1 CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405 ; mapped ; 0455 # 1.1 CYRILLIC CAPITAL LETTER DZE +0406 ; mapped ; 0456 # 1.1 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407 ; mapped ; 0457 # 1.1 CYRILLIC CAPITAL LETTER YI +0408 ; mapped ; 0458 # 1.1 CYRILLIC CAPITAL LETTER JE +0409 ; mapped ; 0459 # 1.1 CYRILLIC CAPITAL LETTER LJE +040A ; mapped ; 045A # 1.1 CYRILLIC CAPITAL LETTER NJE +040B ; mapped ; 045B # 1.1 CYRILLIC CAPITAL LETTER TSHE +040C ; mapped ; 045C # 1.1 CYRILLIC CAPITAL LETTER KJE +040D ; mapped ; 045D # 3.0 CYRILLIC CAPITAL LETTER I WITH GRAVE +040E ; mapped ; 045E # 1.1 CYRILLIC CAPITAL LETTER SHORT U +040F ; mapped ; 045F # 1.1 CYRILLIC CAPITAL LETTER DZHE +0410 ; mapped ; 0430 # 1.1 CYRILLIC CAPITAL LETTER A +0411 ; mapped ; 0431 # 1.1 CYRILLIC CAPITAL LETTER BE +0412 ; mapped ; 0432 # 1.1 CYRILLIC CAPITAL LETTER VE +0413 ; mapped ; 0433 # 1.1 CYRILLIC CAPITAL LETTER GHE +0414 ; mapped ; 0434 # 1.1 CYRILLIC CAPITAL LETTER DE +0415 ; mapped ; 0435 # 1.1 CYRILLIC CAPITAL LETTER IE +0416 ; mapped ; 0436 # 1.1 CYRILLIC CAPITAL LETTER ZHE +0417 ; mapped ; 0437 # 1.1 CYRILLIC CAPITAL LETTER ZE +0418 ; mapped ; 0438 # 1.1 CYRILLIC CAPITAL LETTER I +0419 ; mapped ; 0439 # 1.1 CYRILLIC CAPITAL LETTER SHORT I +041A ; mapped ; 043A # 1.1 CYRILLIC CAPITAL LETTER KA +041B ; mapped ; 043B # 1.1 CYRILLIC CAPITAL LETTER EL +041C ; mapped ; 043C # 1.1 CYRILLIC CAPITAL LETTER EM +041D ; mapped ; 043D # 1.1 CYRILLIC CAPITAL LETTER EN +041E ; mapped ; 043E # 1.1 CYRILLIC CAPITAL LETTER O +041F ; mapped ; 043F # 1.1 CYRILLIC CAPITAL LETTER PE +0420 ; mapped ; 0440 # 1.1 CYRILLIC CAPITAL LETTER ER +0421 ; mapped ; 0441 # 1.1 CYRILLIC CAPITAL LETTER ES +0422 ; mapped ; 0442 # 1.1 CYRILLIC CAPITAL LETTER TE +0423 ; mapped ; 0443 # 1.1 CYRILLIC CAPITAL LETTER U +0424 ; mapped ; 0444 # 1.1 CYRILLIC CAPITAL LETTER EF +0425 ; mapped ; 0445 # 1.1 CYRILLIC CAPITAL LETTER HA +0426 ; mapped ; 0446 # 1.1 CYRILLIC CAPITAL LETTER TSE +0427 ; mapped ; 0447 # 1.1 CYRILLIC CAPITAL LETTER CHE +0428 ; mapped ; 0448 # 1.1 CYRILLIC CAPITAL LETTER SHA +0429 ; mapped ; 0449 # 1.1 CYRILLIC CAPITAL LETTER SHCHA +042A ; mapped ; 044A # 1.1 CYRILLIC CAPITAL LETTER HARD SIGN +042B ; mapped ; 044B # 1.1 CYRILLIC CAPITAL LETTER YERU +042C ; mapped ; 044C # 1.1 CYRILLIC CAPITAL LETTER SOFT SIGN +042D ; mapped ; 044D # 1.1 CYRILLIC CAPITAL LETTER E +042E ; mapped ; 044E # 1.1 CYRILLIC CAPITAL LETTER YU +042F ; mapped ; 044F # 1.1 CYRILLIC CAPITAL LETTER YA +0430..044F ; valid # 1.1 CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER YA +0450 ; valid # 3.0 CYRILLIC SMALL LETTER IE WITH GRAVE +0451..045C ; valid # 1.1 CYRILLIC SMALL LETTER IO..CYRILLIC SMALL LETTER KJE +045D ; valid # 3.0 CYRILLIC SMALL LETTER I WITH GRAVE +045E..045F ; valid # 1.1 CYRILLIC SMALL LETTER SHORT U..CYRILLIC SMALL LETTER DZHE +0460 ; mapped ; 0461 # 1.1 CYRILLIC CAPITAL LETTER OMEGA +0461 ; valid # 1.1 CYRILLIC SMALL LETTER OMEGA +0462 ; mapped ; 0463 # 1.1 CYRILLIC CAPITAL LETTER YAT +0463 ; valid # 1.1 CYRILLIC SMALL LETTER YAT +0464 ; mapped ; 0465 # 1.1 CYRILLIC CAPITAL LETTER IOTIFIED E +0465 ; valid # 1.1 CYRILLIC SMALL LETTER IOTIFIED E +0466 ; mapped ; 0467 # 1.1 CYRILLIC CAPITAL LETTER LITTLE YUS +0467 ; valid # 1.1 CYRILLIC SMALL LETTER LITTLE YUS +0468 ; mapped ; 0469 # 1.1 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +0469 ; valid # 1.1 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +046A ; mapped ; 046B # 1.1 CYRILLIC CAPITAL LETTER BIG YUS +046B ; valid # 1.1 CYRILLIC SMALL LETTER BIG YUS +046C ; mapped ; 046D # 1.1 CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046D ; valid # 1.1 CYRILLIC SMALL LETTER IOTIFIED BIG YUS +046E ; mapped ; 046F # 1.1 CYRILLIC CAPITAL LETTER KSI +046F ; valid # 1.1 CYRILLIC SMALL LETTER KSI +0470 ; mapped ; 0471 # 1.1 CYRILLIC CAPITAL LETTER PSI +0471 ; valid # 1.1 CYRILLIC SMALL LETTER PSI +0472 ; mapped ; 0473 # 1.1 CYRILLIC CAPITAL LETTER FITA +0473 ; valid # 1.1 CYRILLIC SMALL LETTER FITA +0474 ; mapped ; 0475 # 1.1 CYRILLIC CAPITAL LETTER IZHITSA +0475 ; valid # 1.1 CYRILLIC SMALL LETTER IZHITSA +0476 ; mapped ; 0477 # 1.1 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0477 ; valid # 1.1 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478 ; mapped ; 0479 # 1.1 CYRILLIC CAPITAL LETTER UK +0479 ; valid # 1.1 CYRILLIC SMALL LETTER UK +047A ; mapped ; 047B # 1.1 CYRILLIC CAPITAL LETTER ROUND OMEGA +047B ; valid # 1.1 CYRILLIC SMALL LETTER ROUND OMEGA +047C ; mapped ; 047D # 1.1 CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047D ; valid # 1.1 CYRILLIC SMALL LETTER OMEGA WITH TITLO +047E ; mapped ; 047F # 1.1 CYRILLIC CAPITAL LETTER OT +047F ; valid # 1.1 CYRILLIC SMALL LETTER OT +0480 ; mapped ; 0481 # 1.1 CYRILLIC CAPITAL LETTER KOPPA +0481 ; valid # 1.1 CYRILLIC SMALL LETTER KOPPA +0482 ; valid ; ; NV8 # 1.1 CYRILLIC THOUSANDS SIGN +0483..0486 ; valid # 1.1 COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA +0487 ; valid # 5.1 COMBINING CYRILLIC POKRYTIE +0488..0489 ; valid ; ; NV8 # 3.0 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A ; mapped ; 048B # 3.2 CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048B ; valid # 3.2 CYRILLIC SMALL LETTER SHORT I WITH TAIL +048C ; mapped ; 048D # 3.0 CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048D ; valid # 3.0 CYRILLIC SMALL LETTER SEMISOFT SIGN +048E ; mapped ; 048F # 3.0 CYRILLIC CAPITAL LETTER ER WITH TICK +048F ; valid # 3.0 CYRILLIC SMALL LETTER ER WITH TICK +0490 ; mapped ; 0491 # 1.1 CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0491 ; valid # 1.1 CYRILLIC SMALL LETTER GHE WITH UPTURN +0492 ; mapped ; 0493 # 1.1 CYRILLIC CAPITAL LETTER GHE WITH STROKE +0493 ; valid # 1.1 CYRILLIC SMALL LETTER GHE WITH STROKE +0494 ; mapped ; 0495 # 1.1 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0495 ; valid # 1.1 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0496 ; mapped ; 0497 # 1.1 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0497 ; valid # 1.1 CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0498 ; mapped ; 0499 # 1.1 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +0499 ; valid # 1.1 CYRILLIC SMALL LETTER ZE WITH DESCENDER +049A ; mapped ; 049B # 1.1 CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049B ; valid # 1.1 CYRILLIC SMALL LETTER KA WITH DESCENDER +049C ; mapped ; 049D # 1.1 CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049D ; valid # 1.1 CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049E ; mapped ; 049F # 1.1 CYRILLIC CAPITAL LETTER KA WITH STROKE +049F ; valid # 1.1 CYRILLIC SMALL LETTER KA WITH STROKE +04A0 ; mapped ; 04A1 # 1.1 CYRILLIC CAPITAL LETTER BASHKIR KA +04A1 ; valid # 1.1 CYRILLIC SMALL LETTER BASHKIR KA +04A2 ; mapped ; 04A3 # 1.1 CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A3 ; valid # 1.1 CYRILLIC SMALL LETTER EN WITH DESCENDER +04A4 ; mapped ; 04A5 # 1.1 CYRILLIC CAPITAL LIGATURE EN GHE +04A5 ; valid # 1.1 CYRILLIC SMALL LIGATURE EN GHE +04A6 ; mapped ; 04A7 # 1.1 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A7 ; valid # 1.1 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A8 ; mapped ; 04A9 # 1.1 CYRILLIC CAPITAL LETTER ABKHASIAN HA +04A9 ; valid # 1.1 CYRILLIC SMALL LETTER ABKHASIAN HA +04AA ; mapped ; 04AB # 1.1 CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AB ; valid # 1.1 CYRILLIC SMALL LETTER ES WITH DESCENDER +04AC ; mapped ; 04AD # 1.1 CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AD ; valid # 1.1 CYRILLIC SMALL LETTER TE WITH DESCENDER +04AE ; mapped ; 04AF # 1.1 CYRILLIC CAPITAL LETTER STRAIGHT U +04AF ; valid # 1.1 CYRILLIC SMALL LETTER STRAIGHT U +04B0 ; mapped ; 04B1 # 1.1 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B1 ; valid # 1.1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B2 ; mapped ; 04B3 # 1.1 CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B3 ; valid # 1.1 CYRILLIC SMALL LETTER HA WITH DESCENDER +04B4 ; mapped ; 04B5 # 1.1 CYRILLIC CAPITAL LIGATURE TE TSE +04B5 ; valid # 1.1 CYRILLIC SMALL LIGATURE TE TSE +04B6 ; mapped ; 04B7 # 1.1 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B7 ; valid # 1.1 CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B8 ; mapped ; 04B9 # 1.1 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04B9 ; valid # 1.1 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04BA ; mapped ; 04BB # 1.1 CYRILLIC CAPITAL LETTER SHHA +04BB ; valid # 1.1 CYRILLIC SMALL LETTER SHHA +04BC ; mapped ; 04BD # 1.1 CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BD ; valid # 1.1 CYRILLIC SMALL LETTER ABKHASIAN CHE +04BE ; mapped ; 04BF # 1.1 CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04BF ; valid # 1.1 CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04C0 ; disallowed # 1.1 CYRILLIC LETTER PALOCHKA +04C1 ; mapped ; 04C2 # 1.1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C2 ; valid # 1.1 CYRILLIC SMALL LETTER ZHE WITH BREVE +04C3 ; mapped ; 04C4 # 1.1 CYRILLIC CAPITAL LETTER KA WITH HOOK +04C4 ; valid # 1.1 CYRILLIC SMALL LETTER KA WITH HOOK +04C5 ; mapped ; 04C6 # 3.2 CYRILLIC CAPITAL LETTER EL WITH TAIL +04C6 ; valid # 3.2 CYRILLIC SMALL LETTER EL WITH TAIL +04C7 ; mapped ; 04C8 # 1.1 CYRILLIC CAPITAL LETTER EN WITH HOOK +04C8 ; valid # 1.1 CYRILLIC SMALL LETTER EN WITH HOOK +04C9 ; mapped ; 04CA # 3.2 CYRILLIC CAPITAL LETTER EN WITH TAIL +04CA ; valid # 3.2 CYRILLIC SMALL LETTER EN WITH TAIL +04CB ; mapped ; 04CC # 1.1 CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CC ; valid # 1.1 CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CD ; mapped ; 04CE # 3.2 CYRILLIC CAPITAL LETTER EM WITH TAIL +04CE ; valid # 3.2 CYRILLIC SMALL LETTER EM WITH TAIL +04CF ; valid # 5.0 CYRILLIC SMALL LETTER PALOCHKA +04D0 ; mapped ; 04D1 # 1.1 CYRILLIC CAPITAL LETTER A WITH BREVE +04D1 ; valid # 1.1 CYRILLIC SMALL LETTER A WITH BREVE +04D2 ; mapped ; 04D3 # 1.1 CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D3 ; valid # 1.1 CYRILLIC SMALL LETTER A WITH DIAERESIS +04D4 ; mapped ; 04D5 # 1.1 CYRILLIC CAPITAL LIGATURE A IE +04D5 ; valid # 1.1 CYRILLIC SMALL LIGATURE A IE +04D6 ; mapped ; 04D7 # 1.1 CYRILLIC CAPITAL LETTER IE WITH BREVE +04D7 ; valid # 1.1 CYRILLIC SMALL LETTER IE WITH BREVE +04D8 ; mapped ; 04D9 # 1.1 CYRILLIC CAPITAL LETTER SCHWA +04D9 ; valid # 1.1 CYRILLIC SMALL LETTER SCHWA +04DA ; mapped ; 04DB # 1.1 CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DB ; valid # 1.1 CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DC ; mapped ; 04DD # 1.1 CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DD ; valid # 1.1 CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DE ; mapped ; 04DF # 1.1 CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04DF ; valid # 1.1 CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E0 ; mapped ; 04E1 # 1.1 CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E1 ; valid # 1.1 CYRILLIC SMALL LETTER ABKHASIAN DZE +04E2 ; mapped ; 04E3 # 1.1 CYRILLIC CAPITAL LETTER I WITH MACRON +04E3 ; valid # 1.1 CYRILLIC SMALL LETTER I WITH MACRON +04E4 ; mapped ; 04E5 # 1.1 CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E5 ; valid # 1.1 CYRILLIC SMALL LETTER I WITH DIAERESIS +04E6 ; mapped ; 04E7 # 1.1 CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E7 ; valid # 1.1 CYRILLIC SMALL LETTER O WITH DIAERESIS +04E8 ; mapped ; 04E9 # 1.1 CYRILLIC CAPITAL LETTER BARRED O +04E9 ; valid # 1.1 CYRILLIC SMALL LETTER BARRED O +04EA ; mapped ; 04EB # 1.1 CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EB ; valid # 1.1 CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04EC ; mapped ; 04ED # 3.0 CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04ED ; valid # 3.0 CYRILLIC SMALL LETTER E WITH DIAERESIS +04EE ; mapped ; 04EF # 1.1 CYRILLIC CAPITAL LETTER U WITH MACRON +04EF ; valid # 1.1 CYRILLIC SMALL LETTER U WITH MACRON +04F0 ; mapped ; 04F1 # 1.1 CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F1 ; valid # 1.1 CYRILLIC SMALL LETTER U WITH DIAERESIS +04F2 ; mapped ; 04F3 # 1.1 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F3 ; valid # 1.1 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F4 ; mapped ; 04F5 # 1.1 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F5 ; valid # 1.1 CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F6 ; mapped ; 04F7 # 4.1 CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F7 ; valid # 4.1 CYRILLIC SMALL LETTER GHE WITH DESCENDER +04F8 ; mapped ; 04F9 # 1.1 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04F9 ; valid # 1.1 CYRILLIC SMALL LETTER YERU WITH DIAERESIS +04FA ; mapped ; 04FB # 5.0 CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +04FB ; valid # 5.0 CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +04FC ; mapped ; 04FD # 5.0 CYRILLIC CAPITAL LETTER HA WITH HOOK +04FD ; valid # 5.0 CYRILLIC SMALL LETTER HA WITH HOOK +04FE ; mapped ; 04FF # 5.0 CYRILLIC CAPITAL LETTER HA WITH STROKE +04FF ; valid # 5.0 CYRILLIC SMALL LETTER HA WITH STROKE +0500 ; mapped ; 0501 # 3.2 CYRILLIC CAPITAL LETTER KOMI DE +0501 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI DE +0502 ; mapped ; 0503 # 3.2 CYRILLIC CAPITAL LETTER KOMI DJE +0503 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI DJE +0504 ; mapped ; 0505 # 3.2 CYRILLIC CAPITAL LETTER KOMI ZJE +0505 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI ZJE +0506 ; mapped ; 0507 # 3.2 CYRILLIC CAPITAL LETTER KOMI DZJE +0507 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI DZJE +0508 ; mapped ; 0509 # 3.2 CYRILLIC CAPITAL LETTER KOMI LJE +0509 ; valid # 3.2 CYRILLIC SMALL LETTER KOMI LJE +050A ; mapped ; 050B # 3.2 CYRILLIC CAPITAL LETTER KOMI NJE +050B ; valid # 3.2 CYRILLIC SMALL LETTER KOMI NJE +050C ; mapped ; 050D # 3.2 CYRILLIC CAPITAL LETTER KOMI SJE +050D ; valid # 3.2 CYRILLIC SMALL LETTER KOMI SJE +050E ; mapped ; 050F # 3.2 CYRILLIC CAPITAL LETTER KOMI TJE +050F ; valid # 3.2 CYRILLIC SMALL LETTER KOMI TJE +0510 ; mapped ; 0511 # 5.0 CYRILLIC CAPITAL LETTER REVERSED ZE +0511 ; valid # 5.0 CYRILLIC SMALL LETTER REVERSED ZE +0512 ; mapped ; 0513 # 5.0 CYRILLIC CAPITAL LETTER EL WITH HOOK +0513 ; valid # 5.0 CYRILLIC SMALL LETTER EL WITH HOOK +0514 ; mapped ; 0515 # 5.1 CYRILLIC CAPITAL LETTER LHA +0515 ; valid # 5.1 CYRILLIC SMALL LETTER LHA +0516 ; mapped ; 0517 # 5.1 CYRILLIC CAPITAL LETTER RHA +0517 ; valid # 5.1 CYRILLIC SMALL LETTER RHA +0518 ; mapped ; 0519 # 5.1 CYRILLIC CAPITAL LETTER YAE +0519 ; valid # 5.1 CYRILLIC SMALL LETTER YAE +051A ; mapped ; 051B # 5.1 CYRILLIC CAPITAL LETTER QA +051B ; valid # 5.1 CYRILLIC SMALL LETTER QA +051C ; mapped ; 051D # 5.1 CYRILLIC CAPITAL LETTER WE +051D ; valid # 5.1 CYRILLIC SMALL LETTER WE +051E ; mapped ; 051F # 5.1 CYRILLIC CAPITAL LETTER ALEUT KA +051F ; valid # 5.1 CYRILLIC SMALL LETTER ALEUT KA +0520 ; mapped ; 0521 # 5.1 CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0521 ; valid # 5.1 CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +0522 ; mapped ; 0523 # 5.1 CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +0523 ; valid # 5.1 CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +0524 ; mapped ; 0525 # 5.2 CYRILLIC CAPITAL LETTER PE WITH DESCENDER +0525 ; valid # 5.2 CYRILLIC SMALL LETTER PE WITH DESCENDER +0526 ; mapped ; 0527 # 6.0 CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +0527 ; valid # 6.0 CYRILLIC SMALL LETTER SHHA WITH DESCENDER +0528 ; mapped ; 0529 # 7.0 CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +0529 ; valid # 7.0 CYRILLIC SMALL LETTER EN WITH LEFT HOOK +052A ; mapped ; 052B # 7.0 CYRILLIC CAPITAL LETTER DZZHE +052B ; valid # 7.0 CYRILLIC SMALL LETTER DZZHE +052C ; mapped ; 052D # 7.0 CYRILLIC CAPITAL LETTER DCHE +052D ; valid # 7.0 CYRILLIC SMALL LETTER DCHE +052E ; mapped ; 052F # 7.0 CYRILLIC CAPITAL LETTER EL WITH DESCENDER +052F ; valid # 7.0 CYRILLIC SMALL LETTER EL WITH DESCENDER +0530 ; disallowed # NA <reserved-0530> +0531 ; mapped ; 0561 # 1.1 ARMENIAN CAPITAL LETTER AYB +0532 ; mapped ; 0562 # 1.1 ARMENIAN CAPITAL LETTER BEN +0533 ; mapped ; 0563 # 1.1 ARMENIAN CAPITAL LETTER GIM +0534 ; mapped ; 0564 # 1.1 ARMENIAN CAPITAL LETTER DA +0535 ; mapped ; 0565 # 1.1 ARMENIAN CAPITAL LETTER ECH +0536 ; mapped ; 0566 # 1.1 ARMENIAN CAPITAL LETTER ZA +0537 ; mapped ; 0567 # 1.1 ARMENIAN CAPITAL LETTER EH +0538 ; mapped ; 0568 # 1.1 ARMENIAN CAPITAL LETTER ET +0539 ; mapped ; 0569 # 1.1 ARMENIAN CAPITAL LETTER TO +053A ; mapped ; 056A # 1.1 ARMENIAN CAPITAL LETTER ZHE +053B ; mapped ; 056B # 1.1 ARMENIAN CAPITAL LETTER INI +053C ; mapped ; 056C # 1.1 ARMENIAN CAPITAL LETTER LIWN +053D ; mapped ; 056D # 1.1 ARMENIAN CAPITAL LETTER XEH +053E ; mapped ; 056E # 1.1 ARMENIAN CAPITAL LETTER CA +053F ; mapped ; 056F # 1.1 ARMENIAN CAPITAL LETTER KEN +0540 ; mapped ; 0570 # 1.1 ARMENIAN CAPITAL LETTER HO +0541 ; mapped ; 0571 # 1.1 ARMENIAN CAPITAL LETTER JA +0542 ; mapped ; 0572 # 1.1 ARMENIAN CAPITAL LETTER GHAD +0543 ; mapped ; 0573 # 1.1 ARMENIAN CAPITAL LETTER CHEH +0544 ; mapped ; 0574 # 1.1 ARMENIAN CAPITAL LETTER MEN +0545 ; mapped ; 0575 # 1.1 ARMENIAN CAPITAL LETTER YI +0546 ; mapped ; 0576 # 1.1 ARMENIAN CAPITAL LETTER NOW +0547 ; mapped ; 0577 # 1.1 ARMENIAN CAPITAL LETTER SHA +0548 ; mapped ; 0578 # 1.1 ARMENIAN CAPITAL LETTER VO +0549 ; mapped ; 0579 # 1.1 ARMENIAN CAPITAL LETTER CHA +054A ; mapped ; 057A # 1.1 ARMENIAN CAPITAL LETTER PEH +054B ; mapped ; 057B # 1.1 ARMENIAN CAPITAL LETTER JHEH +054C ; mapped ; 057C # 1.1 ARMENIAN CAPITAL LETTER RA +054D ; mapped ; 057D # 1.1 ARMENIAN CAPITAL LETTER SEH +054E ; mapped ; 057E # 1.1 ARMENIAN CAPITAL LETTER VEW +054F ; mapped ; 057F # 1.1 ARMENIAN CAPITAL LETTER TIWN +0550 ; mapped ; 0580 # 1.1 ARMENIAN CAPITAL LETTER REH +0551 ; mapped ; 0581 # 1.1 ARMENIAN CAPITAL LETTER CO +0552 ; mapped ; 0582 # 1.1 ARMENIAN CAPITAL LETTER YIWN +0553 ; mapped ; 0583 # 1.1 ARMENIAN CAPITAL LETTER PIWR +0554 ; mapped ; 0584 # 1.1 ARMENIAN CAPITAL LETTER KEH +0555 ; mapped ; 0585 # 1.1 ARMENIAN CAPITAL LETTER OH +0556 ; mapped ; 0586 # 1.1 ARMENIAN CAPITAL LETTER FEH +0557..0558 ; disallowed # NA <reserved-0557>..<reserved-0558> +0559 ; valid # 1.1 ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; valid ; ; NV8 # 1.1 ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560 ; disallowed # NA <reserved-0560> +0561..0586 ; valid # 1.1 ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LETTER FEH +0587 ; mapped ; 0565 0582 # 1.1 ARMENIAN SMALL LIGATURE ECH YIWN +0588 ; disallowed # NA <reserved-0588> +0589 ; valid ; ; NV8 # 1.1 ARMENIAN FULL STOP +058A ; valid ; ; NV8 # 3.0 ARMENIAN HYPHEN +058B..058C ; disallowed # NA <reserved-058B>..<reserved-058C> +058D..058E ; valid ; ; NV8 # 7.0 RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F ; valid ; ; NV8 # 6.1 ARMENIAN DRAM SIGN +0590 ; disallowed # NA <reserved-0590> +0591..05A1 ; valid # 2.0 HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER +05A2 ; valid # 4.1 HEBREW ACCENT ATNAH HAFUKH +05A3..05AF ; valid # 2.0 HEBREW ACCENT MUNAH..HEBREW MARK MASORA CIRCLE +05B0..05B9 ; valid # 1.1 HEBREW POINT SHEVA..HEBREW POINT HOLAM +05BA ; valid # 5.0 HEBREW POINT HOLAM HASER FOR VAV +05BB..05BD ; valid # 1.1 HEBREW POINT QUBUTS..HEBREW POINT METEG +05BE ; valid ; ; NV8 # 1.1 HEBREW PUNCTUATION MAQAF +05BF ; valid # 1.1 HEBREW POINT RAFE +05C0 ; valid ; ; NV8 # 1.1 HEBREW PUNCTUATION PASEQ +05C1..05C2 ; valid # 1.1 HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3 ; valid ; ; NV8 # 1.1 HEBREW PUNCTUATION SOF PASUQ +05C4 ; valid # 2.0 HEBREW MARK UPPER DOT +05C5 ; valid # 4.1 HEBREW MARK LOWER DOT +05C6 ; valid ; ; NV8 # 4.1 HEBREW PUNCTUATION NUN HAFUKHA +05C7 ; valid # 4.1 HEBREW POINT QAMATS QATAN +05C8..05CF ; disallowed # NA <reserved-05C8>..<reserved-05CF> +05D0..05EA ; valid # 1.1 HEBREW LETTER ALEF..HEBREW LETTER TAV +05EB..05EF ; disallowed # NA <reserved-05EB>..<reserved-05EF> +05F0..05F4 ; valid # 1.1 HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW PUNCTUATION GERSHAYIM +05F5..05FF ; disallowed # NA <reserved-05F5>..<reserved-05FF> +0600..0603 ; disallowed # 4.0 ARABIC NUMBER SIGN..ARABIC SIGN SAFHA +0604 ; disallowed # 6.1 ARABIC SIGN SAMVAT +0605 ; disallowed # 7.0 ARABIC NUMBER MARK ABOVE +0606..060A ; valid ; ; NV8 # 5.1 ARABIC-INDIC CUBE ROOT..ARABIC-INDIC PER TEN THOUSAND SIGN +060B ; valid ; ; NV8 # 4.1 AFGHANI SIGN +060C ; valid ; ; NV8 # 1.1 ARABIC COMMA +060D..060F ; valid ; ; NV8 # 4.0 ARABIC DATE SEPARATOR..ARABIC SIGN MISRA +0610..0615 ; valid # 4.0 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH +0616..061A ; valid # 5.1 ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH..ARABIC SMALL KASRA +061B ; valid ; ; NV8 # 1.1 ARABIC SEMICOLON +061C ; disallowed # 6.3 ARABIC LETTER MARK +061D ; disallowed # NA <reserved-061D> +061E ; valid ; ; NV8 # 4.1 ARABIC TRIPLE DOT PUNCTUATION MARK +061F ; valid ; ; NV8 # 1.1 ARABIC QUESTION MARK +0620 ; valid # 6.0 ARABIC LETTER KASHMIRI YEH +0621..063A ; valid # 1.1 ARABIC LETTER HAMZA..ARABIC LETTER GHAIN +063B..063F ; valid # 5.1 ARABIC LETTER KEHEH WITH TWO DOTS ABOVE..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; valid ; ; NV8 # 1.1 ARABIC TATWEEL +0641..0652 ; valid # 1.1 ARABIC LETTER FEH..ARABIC SUKUN +0653..0655 ; valid # 3.0 ARABIC MADDAH ABOVE..ARABIC HAMZA BELOW +0656..0658 ; valid # 4.0 ARABIC SUBSCRIPT ALEF..ARABIC MARK NOON GHUNNA +0659..065E ; valid # 4.1 ARABIC ZWARAKAY..ARABIC FATHA WITH TWO DOTS +065F ; valid # 6.0 ARABIC WAVY HAMZA BELOW +0660..0669 ; valid # 1.1 ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A..066D ; valid ; ; NV8 # 1.1 ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F ; valid # 3.2 ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670..0674 ; valid # 1.1 ARABIC LETTER SUPERSCRIPT ALEF..ARABIC LETTER HIGH HAMZA +0675 ; mapped ; 0627 0674 # 1.1 ARABIC LETTER HIGH HAMZA ALEF +0676 ; mapped ; 0648 0674 # 1.1 ARABIC LETTER HIGH HAMZA WAW +0677 ; mapped ; 06C7 0674 # 1.1 ARABIC LETTER U WITH HAMZA ABOVE +0678 ; mapped ; 064A 0674 # 1.1 ARABIC LETTER HIGH HAMZA YEH +0679..06B7 ; valid # 1.1 ARABIC LETTER TTEH..ARABIC LETTER LAM WITH THREE DOTS ABOVE +06B8..06B9 ; valid # 3.0 ARABIC LETTER LAM WITH THREE DOTS BELOW..ARABIC LETTER NOON WITH DOT BELOW +06BA..06BE ; valid # 1.1 ARABIC LETTER NOON GHUNNA..ARABIC LETTER HEH DOACHASHMEE +06BF ; valid # 3.0 ARABIC LETTER TCHEH WITH DOT ABOVE +06C0..06CE ; valid # 1.1 ARABIC LETTER HEH WITH YEH ABOVE..ARABIC LETTER YEH WITH SMALL V +06CF ; valid # 3.0 ARABIC LETTER WAW WITH DOT ABOVE +06D0..06D3 ; valid # 1.1 ARABIC LETTER E..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; valid ; ; NV8 # 1.1 ARABIC FULL STOP +06D5..06DC ; valid # 1.1 ARABIC LETTER AE..ARABIC SMALL HIGH SEEN +06DD ; disallowed # 1.1 ARABIC END OF AYAH +06DE ; valid ; ; NV8 # 1.1 ARABIC START OF RUB EL HIZB +06DF..06E8 ; valid # 1.1 ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH NOON +06E9 ; valid ; ; NV8 # 1.1 ARABIC PLACE OF SAJDAH +06EA..06ED ; valid # 1.1 ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; valid # 4.0 ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; valid # 1.1 EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FE ; valid # 3.0 ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; valid # 4.0 ARABIC LETTER HEH WITH INVERTED V +0700..070D ; valid ; ; NV8 # 3.0 SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070E ; disallowed # NA <reserved-070E> +070F ; disallowed # 3.0 SYRIAC ABBREVIATION MARK +0710..072C ; valid # 3.0 SYRIAC LETTER ALAPH..SYRIAC LETTER TAW +072D..072F ; valid # 4.0 SYRIAC LETTER PERSIAN BHETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; valid # 3.0 SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074B..074C ; disallowed # NA <reserved-074B>..<reserved-074C> +074D..074F ; valid # 4.0 SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0750..076D ; valid # 4.1 ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE +076E..077F ; valid # 5.1 ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE +0780..07B0 ; valid # 3.0 THAANA LETTER HAA..THAANA SUKUN +07B1 ; valid # 3.2 THAANA LETTER NAA +07B2..07BF ; disallowed # NA <reserved-07B2>..<reserved-07BF> +07C0..07F5 ; valid # 5.0 NKO DIGIT ZERO..NKO LOW TONE APOSTROPHE +07F6..07FA ; valid ; ; NV8 # 5.0 NKO SYMBOL OO DENNEN..NKO LAJANYALAN +07FB..07FF ; disallowed # NA <reserved-07FB>..<reserved-07FF> +0800..082D ; valid # 5.2 SAMARITAN LETTER ALAF..SAMARITAN MARK NEQUDAA +082E..082F ; disallowed # NA <reserved-082E>..<reserved-082F> +0830..083E ; valid ; ; NV8 # 5.2 SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU +083F ; disallowed # NA <reserved-083F> +0840..085B ; valid # 6.0 MANDAIC LETTER HALQA..MANDAIC GEMINATION MARK +085C..085D ; disallowed # NA <reserved-085C>..<reserved-085D> +085E ; valid ; ; NV8 # 6.0 MANDAIC PUNCTUATION +085F..089F ; disallowed # NA <reserved-085F>..<reserved-089F> +08A0 ; valid # 6.1 ARABIC LETTER BEH WITH SMALL V BELOW +08A1 ; valid # 7.0 ARABIC LETTER BEH WITH HAMZA ABOVE +08A2..08AC ; valid # 6.1 ARABIC LETTER JEEM WITH TWO DOTS ABOVE..ARABIC LETTER ROHINGYA YEH +08AD..08B2 ; valid # 7.0 ARABIC LETTER LOW ALEF..ARABIC LETTER ZAIN WITH INVERTED V ABOVE +08B3..08B4 ; valid # 8.0 ARABIC LETTER AIN WITH THREE DOTS BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B5 ; disallowed # NA <reserved-08B5> +08B6..08BD ; valid # 9.0 ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08BE..08D3 ; disallowed # NA <reserved-08BE>..<reserved-08D3> +08D4..08E1 ; valid # 9.0 ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA +08E2 ; disallowed # 9.0 ARABIC DISPUTED END OF AYAH +08E3 ; valid # 8.0 ARABIC TURNED DAMMA BELOW +08E4..08FE ; valid # 6.1 ARABIC CURLY FATHA..ARABIC DAMMA WITH DOT +08FF ; valid # 7.0 ARABIC MARK SIDEWAYS NOON GHUNNA +0900 ; valid # 5.2 DEVANAGARI SIGN INVERTED CANDRABINDU +0901..0903 ; valid # 1.1 DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN VISARGA +0904 ; valid # 4.0 DEVANAGARI LETTER SHORT A +0905..0939 ; valid # 1.1 DEVANAGARI LETTER A..DEVANAGARI LETTER HA +093A..093B ; valid # 6.0 DEVANAGARI VOWEL SIGN OE..DEVANAGARI VOWEL SIGN OOE +093C..094D ; valid # 1.1 DEVANAGARI SIGN NUKTA..DEVANAGARI SIGN VIRAMA +094E ; valid # 5.2 DEVANAGARI VOWEL SIGN PRISHTHAMATRA E +094F ; valid # 6.0 DEVANAGARI VOWEL SIGN AW +0950..0954 ; valid # 1.1 DEVANAGARI OM..DEVANAGARI ACUTE ACCENT +0955 ; valid # 5.2 DEVANAGARI VOWEL SIGN CANDRA LONG E +0956..0957 ; valid # 6.0 DEVANAGARI VOWEL SIGN UE..DEVANAGARI VOWEL SIGN UUE +0958 ; mapped ; 0915 093C # 1.1 DEVANAGARI LETTER QA +0959 ; mapped ; 0916 093C # 1.1 DEVANAGARI LETTER KHHA +095A ; mapped ; 0917 093C # 1.1 DEVANAGARI LETTER GHHA +095B ; mapped ; 091C 093C # 1.1 DEVANAGARI LETTER ZA +095C ; mapped ; 0921 093C # 1.1 DEVANAGARI LETTER DDDHA +095D ; mapped ; 0922 093C # 1.1 DEVANAGARI LETTER RHA +095E ; mapped ; 092B 093C # 1.1 DEVANAGARI LETTER FA +095F ; mapped ; 092F 093C # 1.1 DEVANAGARI LETTER YYA +0960..0963 ; valid # 1.1 DEVANAGARI LETTER VOCALIC RR..DEVANAGARI VOWEL SIGN VOCALIC LL +0964..0965 ; valid ; ; NV8 # 1.1 DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0966..096F ; valid # 1.1 DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970 ; valid ; ; NV8 # 1.1 DEVANAGARI ABBREVIATION SIGN +0971..0972 ; valid # 5.1 DEVANAGARI SIGN HIGH SPACING DOT..DEVANAGARI LETTER CANDRA A +0973..0977 ; valid # 6.0 DEVANAGARI LETTER OE..DEVANAGARI LETTER UUE +0978 ; valid # 7.0 DEVANAGARI LETTER MARWARI DDA +0979..097A ; valid # 5.2 DEVANAGARI LETTER ZHA..DEVANAGARI LETTER HEAVY YA +097B..097C ; valid # 5.0 DEVANAGARI LETTER GGA..DEVANAGARI LETTER JJA +097D ; valid # 4.1 DEVANAGARI LETTER GLOTTAL STOP +097E..097F ; valid # 5.0 DEVANAGARI LETTER DDDA..DEVANAGARI LETTER BBA +0980 ; valid # 7.0 BENGALI ANJI +0981..0983 ; valid # 1.1 BENGALI SIGN CANDRABINDU..BENGALI SIGN VISARGA +0984 ; disallowed # NA <reserved-0984> +0985..098C ; valid # 1.1 BENGALI LETTER A..BENGALI LETTER VOCALIC L +098D..098E ; disallowed # NA <reserved-098D>..<reserved-098E> +098F..0990 ; valid # 1.1 BENGALI LETTER E..BENGALI LETTER AI +0991..0992 ; disallowed # NA <reserved-0991>..<reserved-0992> +0993..09A8 ; valid # 1.1 BENGALI LETTER O..BENGALI LETTER NA +09A9 ; disallowed # NA <reserved-09A9> +09AA..09B0 ; valid # 1.1 BENGALI LETTER PA..BENGALI LETTER RA +09B1 ; disallowed # NA <reserved-09B1> +09B2 ; valid # 1.1 BENGALI LETTER LA +09B3..09B5 ; disallowed # NA <reserved-09B3>..<reserved-09B5> +09B6..09B9 ; valid # 1.1 BENGALI LETTER SHA..BENGALI LETTER HA +09BA..09BB ; disallowed # NA <reserved-09BA>..<reserved-09BB> +09BC ; valid # 1.1 BENGALI SIGN NUKTA +09BD ; valid # 4.0 BENGALI SIGN AVAGRAHA +09BE..09C4 ; valid # 1.1 BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN VOCALIC RR +09C5..09C6 ; disallowed # NA <reserved-09C5>..<reserved-09C6> +09C7..09C8 ; valid # 1.1 BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09C9..09CA ; disallowed # NA <reserved-09C9>..<reserved-09CA> +09CB..09CD ; valid # 1.1 BENGALI VOWEL SIGN O..BENGALI SIGN VIRAMA +09CE ; valid # 4.1 BENGALI LETTER KHANDA TA +09CF..09D6 ; disallowed # NA <reserved-09CF>..<reserved-09D6> +09D7 ; valid # 1.1 BENGALI AU LENGTH MARK +09D8..09DB ; disallowed # NA <reserved-09D8>..<reserved-09DB> +09DC ; mapped ; 09A1 09BC # 1.1 BENGALI LETTER RRA +09DD ; mapped ; 09A2 09BC # 1.1 BENGALI LETTER RHA +09DE ; disallowed # NA <reserved-09DE> +09DF ; mapped ; 09AF 09BC # 1.1 BENGALI LETTER YYA +09E0..09E3 ; valid # 1.1 BENGALI LETTER VOCALIC RR..BENGALI VOWEL SIGN VOCALIC LL +09E4..09E5 ; disallowed # NA <reserved-09E4>..<reserved-09E5> +09E6..09F1 ; valid # 1.1 BENGALI DIGIT ZERO..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09FA ; valid ; ; NV8 # 1.1 BENGALI RUPEE MARK..BENGALI ISSHAR +09FB ; valid ; ; NV8 # 5.2 BENGALI GANDA MARK +09FC..0A00 ; disallowed # NA <reserved-09FC>..<reserved-0A00> +0A01 ; valid # 4.0 GURMUKHI SIGN ADAK BINDI +0A02 ; valid # 1.1 GURMUKHI SIGN BINDI +0A03 ; valid # 4.0 GURMUKHI SIGN VISARGA +0A04 ; disallowed # NA <reserved-0A04> +0A05..0A0A ; valid # 1.1 GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0B..0A0E ; disallowed # NA <reserved-0A0B>..<reserved-0A0E> +0A0F..0A10 ; valid # 1.1 GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A11..0A12 ; disallowed # NA <reserved-0A11>..<reserved-0A12> +0A13..0A28 ; valid # 1.1 GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A29 ; disallowed # NA <reserved-0A29> +0A2A..0A30 ; valid # 1.1 GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A31 ; disallowed # NA <reserved-0A31> +0A32 ; valid # 1.1 GURMUKHI LETTER LA +0A33 ; mapped ; 0A32 0A3C # 1.1 GURMUKHI LETTER LLA +0A34 ; disallowed # NA <reserved-0A34> +0A35 ; valid # 1.1 GURMUKHI LETTER VA +0A36 ; mapped ; 0A38 0A3C # 1.1 GURMUKHI LETTER SHA +0A37 ; disallowed # NA <reserved-0A37> +0A38..0A39 ; valid # 1.1 GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3A..0A3B ; disallowed # NA <reserved-0A3A>..<reserved-0A3B> +0A3C ; valid # 1.1 GURMUKHI SIGN NUKTA +0A3D ; disallowed # NA <reserved-0A3D> +0A3E..0A42 ; valid # 1.1 GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN UU +0A43..0A46 ; disallowed # NA <reserved-0A43>..<reserved-0A46> +0A47..0A48 ; valid # 1.1 GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A49..0A4A ; disallowed # NA <reserved-0A49>..<reserved-0A4A> +0A4B..0A4D ; valid # 1.1 GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A4E..0A50 ; disallowed # NA <reserved-0A4E>..<reserved-0A50> +0A51 ; valid # 5.1 GURMUKHI SIGN UDAAT +0A52..0A58 ; disallowed # NA <reserved-0A52>..<reserved-0A58> +0A59 ; mapped ; 0A16 0A3C # 1.1 GURMUKHI LETTER KHHA +0A5A ; mapped ; 0A17 0A3C # 1.1 GURMUKHI LETTER GHHA +0A5B ; mapped ; 0A1C 0A3C # 1.1 GURMUKHI LETTER ZA +0A5C ; valid # 1.1 GURMUKHI LETTER RRA +0A5D ; disallowed # NA <reserved-0A5D> +0A5E ; mapped ; 0A2B 0A3C # 1.1 GURMUKHI LETTER FA +0A5F..0A65 ; disallowed # NA <reserved-0A5F>..<reserved-0A65> +0A66..0A74 ; valid # 1.1 GURMUKHI DIGIT ZERO..GURMUKHI EK ONKAR +0A75 ; valid # 5.1 GURMUKHI SIGN YAKASH +0A76..0A80 ; disallowed # NA <reserved-0A76>..<reserved-0A80> +0A81..0A83 ; valid # 1.1 GUJARATI SIGN CANDRABINDU..GUJARATI SIGN VISARGA +0A84 ; disallowed # NA <reserved-0A84> +0A85..0A8B ; valid # 1.1 GUJARATI LETTER A..GUJARATI LETTER VOCALIC R +0A8C ; valid # 4.0 GUJARATI LETTER VOCALIC L +0A8D ; valid # 1.1 GUJARATI VOWEL CANDRA E +0A8E ; disallowed # NA <reserved-0A8E> +0A8F..0A91 ; valid # 1.1 GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A92 ; disallowed # NA <reserved-0A92> +0A93..0AA8 ; valid # 1.1 GUJARATI LETTER O..GUJARATI LETTER NA +0AA9 ; disallowed # NA <reserved-0AA9> +0AAA..0AB0 ; valid # 1.1 GUJARATI LETTER PA..GUJARATI LETTER RA +0AB1 ; disallowed # NA <reserved-0AB1> +0AB2..0AB3 ; valid # 1.1 GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB4 ; disallowed # NA <reserved-0AB4> +0AB5..0AB9 ; valid # 1.1 GUJARATI LETTER VA..GUJARATI LETTER HA +0ABA..0ABB ; disallowed # NA <reserved-0ABA>..<reserved-0ABB> +0ABC..0AC5 ; valid # 1.1 GUJARATI SIGN NUKTA..GUJARATI VOWEL SIGN CANDRA E +0AC6 ; disallowed # NA <reserved-0AC6> +0AC7..0AC9 ; valid # 1.1 GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN CANDRA O +0ACA ; disallowed # NA <reserved-0ACA> +0ACB..0ACD ; valid # 1.1 GUJARATI VOWEL SIGN O..GUJARATI SIGN VIRAMA +0ACE..0ACF ; disallowed # NA <reserved-0ACE>..<reserved-0ACF> +0AD0 ; valid # 1.1 GUJARATI OM +0AD1..0ADF ; disallowed # NA <reserved-0AD1>..<reserved-0ADF> +0AE0 ; valid # 1.1 GUJARATI LETTER VOCALIC RR +0AE1..0AE3 ; valid # 4.0 GUJARATI LETTER VOCALIC LL..GUJARATI VOWEL SIGN VOCALIC LL +0AE4..0AE5 ; disallowed # NA <reserved-0AE4>..<reserved-0AE5> +0AE6..0AEF ; valid # 1.1 GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF0 ; valid ; ; NV8 # 6.1 GUJARATI ABBREVIATION SIGN +0AF1 ; valid ; ; NV8 # 4.0 GUJARATI RUPEE SIGN +0AF2..0AF8 ; disallowed # NA <reserved-0AF2>..<reserved-0AF8> +0AF9 ; valid # 8.0 GUJARATI LETTER ZHA +0AFA..0B00 ; disallowed # NA <reserved-0AFA>..<reserved-0B00> +0B01..0B03 ; valid # 1.1 ORIYA SIGN CANDRABINDU..ORIYA SIGN VISARGA +0B04 ; disallowed # NA <reserved-0B04> +0B05..0B0C ; valid # 1.1 ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0D..0B0E ; disallowed # NA <reserved-0B0D>..<reserved-0B0E> +0B0F..0B10 ; valid # 1.1 ORIYA LETTER E..ORIYA LETTER AI +0B11..0B12 ; disallowed # NA <reserved-0B11>..<reserved-0B12> +0B13..0B28 ; valid # 1.1 ORIYA LETTER O..ORIYA LETTER NA +0B29 ; disallowed # NA <reserved-0B29> +0B2A..0B30 ; valid # 1.1 ORIYA LETTER PA..ORIYA LETTER RA +0B31 ; disallowed # NA <reserved-0B31> +0B32..0B33 ; valid # 1.1 ORIYA LETTER LA..ORIYA LETTER LLA +0B34 ; disallowed # NA <reserved-0B34> +0B35 ; valid # 4.0 ORIYA LETTER VA +0B36..0B39 ; valid # 1.1 ORIYA LETTER SHA..ORIYA LETTER HA +0B3A..0B3B ; disallowed # NA <reserved-0B3A>..<reserved-0B3B> +0B3C..0B43 ; valid # 1.1 ORIYA SIGN NUKTA..ORIYA VOWEL SIGN VOCALIC R +0B44 ; valid # 5.1 ORIYA VOWEL SIGN VOCALIC RR +0B45..0B46 ; disallowed # NA <reserved-0B45>..<reserved-0B46> +0B47..0B48 ; valid # 1.1 ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B49..0B4A ; disallowed # NA <reserved-0B49>..<reserved-0B4A> +0B4B..0B4D ; valid # 1.1 ORIYA VOWEL SIGN O..ORIYA SIGN VIRAMA +0B4E..0B55 ; disallowed # NA <reserved-0B4E>..<reserved-0B55> +0B56..0B57 ; valid # 1.1 ORIYA AI LENGTH MARK..ORIYA AU LENGTH MARK +0B58..0B5B ; disallowed # NA <reserved-0B58>..<reserved-0B5B> +0B5C ; mapped ; 0B21 0B3C # 1.1 ORIYA LETTER RRA +0B5D ; mapped ; 0B22 0B3C # 1.1 ORIYA LETTER RHA +0B5E ; disallowed # NA <reserved-0B5E> +0B5F..0B61 ; valid # 1.1 ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; valid # 5.1 ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B64..0B65 ; disallowed # NA <reserved-0B64>..<reserved-0B65> +0B66..0B6F ; valid # 1.1 ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; valid ; ; NV8 # 1.1 ORIYA ISSHAR +0B71 ; valid # 4.0 ORIYA LETTER WA +0B72..0B77 ; valid ; ; NV8 # 6.0 ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS +0B78..0B81 ; disallowed # NA <reserved-0B78>..<reserved-0B81> +0B82..0B83 ; valid # 1.1 TAMIL SIGN ANUSVARA..TAMIL SIGN VISARGA +0B84 ; disallowed # NA <reserved-0B84> +0B85..0B8A ; valid # 1.1 TAMIL LETTER A..TAMIL LETTER UU +0B8B..0B8D ; disallowed # NA <reserved-0B8B>..<reserved-0B8D> +0B8E..0B90 ; valid # 1.1 TAMIL LETTER E..TAMIL LETTER AI +0B91 ; disallowed # NA <reserved-0B91> +0B92..0B95 ; valid # 1.1 TAMIL LETTER O..TAMIL LETTER KA +0B96..0B98 ; disallowed # NA <reserved-0B96>..<reserved-0B98> +0B99..0B9A ; valid # 1.1 TAMIL LETTER NGA..TAMIL LETTER CA +0B9B ; disallowed # NA <reserved-0B9B> +0B9C ; valid # 1.1 TAMIL LETTER JA +0B9D ; disallowed # NA <reserved-0B9D> +0B9E..0B9F ; valid # 1.1 TAMIL LETTER NYA..TAMIL LETTER TTA +0BA0..0BA2 ; disallowed # NA <reserved-0BA0>..<reserved-0BA2> +0BA3..0BA4 ; valid # 1.1 TAMIL LETTER NNA..TAMIL LETTER TA +0BA5..0BA7 ; disallowed # NA <reserved-0BA5>..<reserved-0BA7> +0BA8..0BAA ; valid # 1.1 TAMIL LETTER NA..TAMIL LETTER PA +0BAB..0BAD ; disallowed # NA <reserved-0BAB>..<reserved-0BAD> +0BAE..0BB5 ; valid # 1.1 TAMIL LETTER MA..TAMIL LETTER VA +0BB6 ; valid # 4.1 TAMIL LETTER SHA +0BB7..0BB9 ; valid # 1.1 TAMIL LETTER SSA..TAMIL LETTER HA +0BBA..0BBD ; disallowed # NA <reserved-0BBA>..<reserved-0BBD> +0BBE..0BC2 ; valid # 1.1 TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN UU +0BC3..0BC5 ; disallowed # NA <reserved-0BC3>..<reserved-0BC5> +0BC6..0BC8 ; valid # 1.1 TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BC9 ; disallowed # NA <reserved-0BC9> +0BCA..0BCD ; valid # 1.1 TAMIL VOWEL SIGN O..TAMIL SIGN VIRAMA +0BCE..0BCF ; disallowed # NA <reserved-0BCE>..<reserved-0BCF> +0BD0 ; valid # 5.1 TAMIL OM +0BD1..0BD6 ; disallowed # NA <reserved-0BD1>..<reserved-0BD6> +0BD7 ; valid # 1.1 TAMIL AU LENGTH MARK +0BD8..0BE5 ; disallowed # NA <reserved-0BD8>..<reserved-0BE5> +0BE6 ; valid # 4.1 TAMIL DIGIT ZERO +0BE7..0BEF ; valid # 1.1 TAMIL DIGIT ONE..TAMIL DIGIT NINE +0BF0..0BF2 ; valid ; ; NV8 # 1.1 TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BFA ; valid ; ; NV8 # 4.0 TAMIL DAY SIGN..TAMIL NUMBER SIGN +0BFB..0BFF ; disallowed # NA <reserved-0BFB>..<reserved-0BFF> +0C00 ; valid # 7.0 TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; valid # 1.1 TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; disallowed # NA <reserved-0C04> +0C05..0C0C ; valid # 1.1 TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0D ; disallowed # NA <reserved-0C0D> +0C0E..0C10 ; valid # 1.1 TELUGU LETTER E..TELUGU LETTER AI +0C11 ; disallowed # NA <reserved-0C11> +0C12..0C28 ; valid # 1.1 TELUGU LETTER O..TELUGU LETTER NA +0C29 ; disallowed # NA <reserved-0C29> +0C2A..0C33 ; valid # 1.1 TELUGU LETTER PA..TELUGU LETTER LLA +0C34 ; valid # 7.0 TELUGU LETTER LLLA +0C35..0C39 ; valid # 1.1 TELUGU LETTER VA..TELUGU LETTER HA +0C3A..0C3C ; disallowed # NA <reserved-0C3A>..<reserved-0C3C> +0C3D ; valid # 5.1 TELUGU SIGN AVAGRAHA +0C3E..0C44 ; valid # 1.1 TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN VOCALIC RR +0C45 ; disallowed # NA <reserved-0C45> +0C46..0C48 ; valid # 1.1 TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C49 ; disallowed # NA <reserved-0C49> +0C4A..0C4D ; valid # 1.1 TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C4E..0C54 ; disallowed # NA <reserved-0C4E>..<reserved-0C54> +0C55..0C56 ; valid # 1.1 TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C57 ; disallowed # NA <reserved-0C57> +0C58..0C59 ; valid # 5.1 TELUGU LETTER TSA..TELUGU LETTER DZA +0C5A ; valid # 8.0 TELUGU LETTER RRRA +0C5B..0C5F ; disallowed # NA <reserved-0C5B>..<reserved-0C5F> +0C60..0C61 ; valid # 1.1 TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; valid # 5.1 TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C64..0C65 ; disallowed # NA <reserved-0C64>..<reserved-0C65> +0C66..0C6F ; valid # 1.1 TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C70..0C77 ; disallowed # NA <reserved-0C70>..<reserved-0C77> +0C78..0C7F ; valid ; ; NV8 # 5.1 TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU SIGN TUUMU +0C80 ; valid # 9.0 KANNADA SIGN SPACING CANDRABINDU +0C81 ; valid # 7.0 KANNADA SIGN CANDRABINDU +0C82..0C83 ; valid # 1.1 KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C84 ; disallowed # NA <reserved-0C84> +0C85..0C8C ; valid # 1.1 KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8D ; disallowed # NA <reserved-0C8D> +0C8E..0C90 ; valid # 1.1 KANNADA LETTER E..KANNADA LETTER AI +0C91 ; disallowed # NA <reserved-0C91> +0C92..0CA8 ; valid # 1.1 KANNADA LETTER O..KANNADA LETTER NA +0CA9 ; disallowed # NA <reserved-0CA9> +0CAA..0CB3 ; valid # 1.1 KANNADA LETTER PA..KANNADA LETTER LLA +0CB4 ; disallowed # NA <reserved-0CB4> +0CB5..0CB9 ; valid # 1.1 KANNADA LETTER VA..KANNADA LETTER HA +0CBA..0CBB ; disallowed # NA <reserved-0CBA>..<reserved-0CBB> +0CBC..0CBD ; valid # 4.0 KANNADA SIGN NUKTA..KANNADA SIGN AVAGRAHA +0CBE..0CC4 ; valid # 1.1 KANNADA VOWEL SIGN AA..KANNADA VOWEL SIGN VOCALIC RR +0CC5 ; disallowed # NA <reserved-0CC5> +0CC6..0CC8 ; valid # 1.1 KANNADA VOWEL SIGN E..KANNADA VOWEL SIGN AI +0CC9 ; disallowed # NA <reserved-0CC9> +0CCA..0CCD ; valid # 1.1 KANNADA VOWEL SIGN O..KANNADA SIGN VIRAMA +0CCE..0CD4 ; disallowed # NA <reserved-0CCE>..<reserved-0CD4> +0CD5..0CD6 ; valid # 1.1 KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CD7..0CDD ; disallowed # NA <reserved-0CD7>..<reserved-0CDD> +0CDE ; valid # 1.1 KANNADA LETTER FA +0CDF ; disallowed # NA <reserved-0CDF> +0CE0..0CE1 ; valid # 1.1 KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; valid # 5.0 KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CE4..0CE5 ; disallowed # NA <reserved-0CE4>..<reserved-0CE5> +0CE6..0CEF ; valid # 1.1 KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF0 ; disallowed # NA <reserved-0CF0> +0CF1..0CF2 ; valid # 5.0 KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3..0D00 ; disallowed # NA <reserved-0CF3>..<reserved-0D00> +0D01 ; valid # 7.0 MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; valid # 1.1 MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D04 ; disallowed # NA <reserved-0D04> +0D05..0D0C ; valid # 1.1 MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0D ; disallowed # NA <reserved-0D0D> +0D0E..0D10 ; valid # 1.1 MALAYALAM LETTER E..MALAYALAM LETTER AI +0D11 ; disallowed # NA <reserved-0D11> +0D12..0D28 ; valid # 1.1 MALAYALAM LETTER O..MALAYALAM LETTER NA +0D29 ; valid # 6.0 MALAYALAM LETTER NNNA +0D2A..0D39 ; valid # 1.1 MALAYALAM LETTER PA..MALAYALAM LETTER HA +0D3A ; valid # 6.0 MALAYALAM LETTER TTTA +0D3B..0D3C ; disallowed # NA <reserved-0D3B>..<reserved-0D3C> +0D3D ; valid # 5.1 MALAYALAM SIGN AVAGRAHA +0D3E..0D43 ; valid # 1.1 MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN VOCALIC R +0D44 ; valid # 5.1 MALAYALAM VOWEL SIGN VOCALIC RR +0D45 ; disallowed # NA <reserved-0D45> +0D46..0D48 ; valid # 1.1 MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D49 ; disallowed # NA <reserved-0D49> +0D4A..0D4D ; valid # 1.1 MALAYALAM VOWEL SIGN O..MALAYALAM SIGN VIRAMA +0D4E ; valid # 6.0 MALAYALAM LETTER DOT REPH +0D4F ; valid ; ; NV8 # 9.0 MALAYALAM SIGN PARA +0D50..0D53 ; disallowed # NA <reserved-0D50>..<reserved-0D53> +0D54..0D56 ; valid # 9.0 MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; valid # 1.1 MALAYALAM AU LENGTH MARK +0D58..0D5E ; valid ; ; NV8 # 9.0 MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +0D5F ; valid # 8.0 MALAYALAM LETTER ARCHAIC II +0D60..0D61 ; valid # 1.1 MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; valid # 5.1 MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D64..0D65 ; disallowed # NA <reserved-0D64>..<reserved-0D65> +0D66..0D6F ; valid # 1.1 MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D70..0D75 ; valid ; ; NV8 # 5.1 MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS +0D76..0D78 ; valid ; ; NV8 # 9.0 MALAYALAM FRACTION ONE SIXTEENTH..MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; valid ; ; NV8 # 5.1 MALAYALAM DATE MARK +0D7A..0D7F ; valid # 5.1 MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D80..0D81 ; disallowed # NA <reserved-0D80>..<reserved-0D81> +0D82..0D83 ; valid # 3.0 SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D84 ; disallowed # NA <reserved-0D84> +0D85..0D96 ; valid # 3.0 SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D97..0D99 ; disallowed # NA <reserved-0D97>..<reserved-0D99> +0D9A..0DB1 ; valid # 3.0 SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB2 ; disallowed # NA <reserved-0DB2> +0DB3..0DBB ; valid # 3.0 SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBC ; disallowed # NA <reserved-0DBC> +0DBD ; valid # 3.0 SINHALA LETTER DANTAJA LAYANNA +0DBE..0DBF ; disallowed # NA <reserved-0DBE>..<reserved-0DBF> +0DC0..0DC6 ; valid # 3.0 SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DC7..0DC9 ; disallowed # NA <reserved-0DC7>..<reserved-0DC9> +0DCA ; valid # 3.0 SINHALA SIGN AL-LAKUNA +0DCB..0DCE ; disallowed # NA <reserved-0DCB>..<reserved-0DCE> +0DCF..0DD4 ; valid # 3.0 SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD5 ; disallowed # NA <reserved-0DD5> +0DD6 ; valid # 3.0 SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD7 ; disallowed # NA <reserved-0DD7> +0DD8..0DDF ; valid # 3.0 SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE0..0DE5 ; disallowed # NA <reserved-0DE0>..<reserved-0DE5> +0DE6..0DEF ; valid # 7.0 SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF0..0DF1 ; disallowed # NA <reserved-0DF0>..<reserved-0DF1> +0DF2..0DF3 ; valid # 3.0 SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; valid ; ; NV8 # 3.0 SINHALA PUNCTUATION KUNDDALIYA +0DF5..0E00 ; disallowed # NA <reserved-0DF5>..<reserved-0E00> +0E01..0E32 ; valid # 1.1 THAI CHARACTER KO KAI..THAI CHARACTER SARA AA +0E33 ; mapped ; 0E4D 0E32 # 1.1 THAI CHARACTER SARA AM +0E34..0E3A ; valid # 1.1 THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E3B..0E3E ; disallowed # NA <reserved-0E3B>..<reserved-0E3E> +0E3F ; valid ; ; NV8 # 1.1 THAI CURRENCY SYMBOL BAHT +0E40..0E4E ; valid # 1.1 THAI CHARACTER SARA E..THAI CHARACTER YAMAKKAN +0E4F ; valid ; ; NV8 # 1.1 THAI CHARACTER FONGMAN +0E50..0E59 ; valid # 1.1 THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; valid ; ; NV8 # 1.1 THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0E5C..0E80 ; disallowed # NA <reserved-0E5C>..<reserved-0E80> +0E81..0E82 ; valid # 1.1 LAO LETTER KO..LAO LETTER KHO SUNG +0E83 ; disallowed # NA <reserved-0E83> +0E84 ; valid # 1.1 LAO LETTER KHO TAM +0E85..0E86 ; disallowed # NA <reserved-0E85>..<reserved-0E86> +0E87..0E88 ; valid # 1.1 LAO LETTER NGO..LAO LETTER CO +0E89 ; disallowed # NA <reserved-0E89> +0E8A ; valid # 1.1 LAO LETTER SO TAM +0E8B..0E8C ; disallowed # NA <reserved-0E8B>..<reserved-0E8C> +0E8D ; valid # 1.1 LAO LETTER NYO +0E8E..0E93 ; disallowed # NA <reserved-0E8E>..<reserved-0E93> +0E94..0E97 ; valid # 1.1 LAO LETTER DO..LAO LETTER THO TAM +0E98 ; disallowed # NA <reserved-0E98> +0E99..0E9F ; valid # 1.1 LAO LETTER NO..LAO LETTER FO SUNG +0EA0 ; disallowed # NA <reserved-0EA0> +0EA1..0EA3 ; valid # 1.1 LAO LETTER MO..LAO LETTER LO LING +0EA4 ; disallowed # NA <reserved-0EA4> +0EA5 ; valid # 1.1 LAO LETTER LO LOOT +0EA6 ; disallowed # NA <reserved-0EA6> +0EA7 ; valid # 1.1 LAO LETTER WO +0EA8..0EA9 ; disallowed # NA <reserved-0EA8>..<reserved-0EA9> +0EAA..0EAB ; valid # 1.1 LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAC ; disallowed # NA <reserved-0EAC> +0EAD..0EB2 ; valid # 1.1 LAO LETTER O..LAO VOWEL SIGN AA +0EB3 ; mapped ; 0ECD 0EB2 # 1.1 LAO VOWEL SIGN AM +0EB4..0EB9 ; valid # 1.1 LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBA ; disallowed # NA <reserved-0EBA> +0EBB..0EBD ; valid # 1.1 LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN NYO +0EBE..0EBF ; disallowed # NA <reserved-0EBE>..<reserved-0EBF> +0EC0..0EC4 ; valid # 1.1 LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC5 ; disallowed # NA <reserved-0EC5> +0EC6 ; valid # 1.1 LAO KO LA +0EC7 ; disallowed # NA <reserved-0EC7> +0EC8..0ECD ; valid # 1.1 LAO TONE MAI EK..LAO NIGGAHITA +0ECE..0ECF ; disallowed # NA <reserved-0ECE>..<reserved-0ECF> +0ED0..0ED9 ; valid # 1.1 LAO DIGIT ZERO..LAO DIGIT NINE +0EDA..0EDB ; disallowed # NA <reserved-0EDA>..<reserved-0EDB> +0EDC ; mapped ; 0EAB 0E99 # 1.1 LAO HO NO +0EDD ; mapped ; 0EAB 0EA1 # 1.1 LAO HO MO +0EDE..0EDF ; valid # 6.1 LAO LETTER KHMU GO..LAO LETTER KHMU NYO +0EE0..0EFF ; disallowed # NA <reserved-0EE0>..<reserved-0EFF> +0F00 ; valid # 2.0 TIBETAN SYLLABLE OM +0F01..0F0A ; valid ; ; NV8 # 2.0 TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK BKA- SHOG YIG MGO +0F0B ; valid # 2.0 TIBETAN MARK INTERSYLLABIC TSHEG +0F0C ; mapped ; 0F0B # 2.0 TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D..0F17 ; valid ; ; NV8 # 2.0 TIBETAN MARK SHAD..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19 ; valid # 2.0 TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F ; valid ; ; NV8 # 2.0 TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; valid # 2.0 TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F34 ; valid ; ; NV8 # 2.0 TIBETAN DIGIT HALF ONE..TIBETAN MARK BSDUS RTAGS +0F35 ; valid # 2.0 TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; valid ; ; NV8 # 2.0 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; valid # 2.0 TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; valid ; ; NV8 # 2.0 TIBETAN MARK CHE MGO +0F39 ; valid # 2.0 TIBETAN MARK TSA -PHRU +0F3A..0F3D ; valid ; ; NV8 # 2.0 TIBETAN MARK GUG RTAGS GYON..TIBETAN MARK ANG KHANG GYAS +0F3E..0F42 ; valid # 2.0 TIBETAN SIGN YAR TSHES..TIBETAN LETTER GA +0F43 ; mapped ; 0F42 0FB7 # 2.0 TIBETAN LETTER GHA +0F44..0F47 ; valid # 2.0 TIBETAN LETTER NGA..TIBETAN LETTER JA +0F48 ; disallowed # NA <reserved-0F48> +0F49..0F4C ; valid # 2.0 TIBETAN LETTER NYA..TIBETAN LETTER DDA +0F4D ; mapped ; 0F4C 0FB7 # 2.0 TIBETAN LETTER DDHA +0F4E..0F51 ; valid # 2.0 TIBETAN LETTER NNA..TIBETAN LETTER DA +0F52 ; mapped ; 0F51 0FB7 # 2.0 TIBETAN LETTER DHA +0F53..0F56 ; valid # 2.0 TIBETAN LETTER NA..TIBETAN LETTER BA +0F57 ; mapped ; 0F56 0FB7 # 2.0 TIBETAN LETTER BHA +0F58..0F5B ; valid # 2.0 TIBETAN LETTER MA..TIBETAN LETTER DZA +0F5C ; mapped ; 0F5B 0FB7 # 2.0 TIBETAN LETTER DZHA +0F5D..0F68 ; valid # 2.0 TIBETAN LETTER WA..TIBETAN LETTER A +0F69 ; mapped ; 0F40 0FB5 # 2.0 TIBETAN LETTER KSSA +0F6A ; valid # 3.0 TIBETAN LETTER FIXED-FORM RA +0F6B..0F6C ; valid # 5.1 TIBETAN LETTER KKA..TIBETAN LETTER RRA +0F6D..0F70 ; disallowed # NA <reserved-0F6D>..<reserved-0F70> +0F71..0F72 ; valid # 2.0 TIBETAN VOWEL SIGN AA..TIBETAN VOWEL SIGN I +0F73 ; mapped ; 0F71 0F72 # 2.0 TIBETAN VOWEL SIGN II +0F74 ; valid # 2.0 TIBETAN VOWEL SIGN U +0F75 ; mapped ; 0F71 0F74 # 2.0 TIBETAN VOWEL SIGN UU +0F76 ; mapped ; 0FB2 0F80 # 2.0 TIBETAN VOWEL SIGN VOCALIC R +0F77 ; mapped ; 0FB2 0F71 0F80 #2.0 TIBETAN VOWEL SIGN VOCALIC RR +0F78 ; mapped ; 0FB3 0F80 # 2.0 TIBETAN VOWEL SIGN VOCALIC L +0F79 ; mapped ; 0FB3 0F71 0F80 #2.0 TIBETAN VOWEL SIGN VOCALIC LL +0F7A..0F80 ; valid # 2.0 TIBETAN VOWEL SIGN E..TIBETAN VOWEL SIGN REVERSED I +0F81 ; mapped ; 0F71 0F80 # 2.0 TIBETAN VOWEL SIGN REVERSED II +0F82..0F84 ; valid # 2.0 TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA +0F85 ; valid ; ; NV8 # 2.0 TIBETAN MARK PALUTA +0F86..0F8B ; valid # 2.0 TIBETAN SIGN LCI RTAGS..TIBETAN SIGN GRU MED RGYINGS +0F8C..0F8F ; valid # 6.0 TIBETAN SIGN INVERTED MCHU CAN..TIBETAN SUBJOINED SIGN INVERTED MCHU CAN +0F90..0F92 ; valid # 2.0 TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER GA +0F93 ; mapped ; 0F92 0FB7 # 2.0 TIBETAN SUBJOINED LETTER GHA +0F94..0F95 ; valid # 2.0 TIBETAN SUBJOINED LETTER NGA..TIBETAN SUBJOINED LETTER CA +0F96 ; valid # 3.0 TIBETAN SUBJOINED LETTER CHA +0F97 ; valid # 2.0 TIBETAN SUBJOINED LETTER JA +0F98 ; disallowed # NA <reserved-0F98> +0F99..0F9C ; valid # 2.0 TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER DDA +0F9D ; mapped ; 0F9C 0FB7 # 2.0 TIBETAN SUBJOINED LETTER DDHA +0F9E..0FA1 ; valid # 2.0 TIBETAN SUBJOINED LETTER NNA..TIBETAN SUBJOINED LETTER DA +0FA2 ; mapped ; 0FA1 0FB7 # 2.0 TIBETAN SUBJOINED LETTER DHA +0FA3..0FA6 ; valid # 2.0 TIBETAN SUBJOINED LETTER NA..TIBETAN SUBJOINED LETTER BA +0FA7 ; mapped ; 0FA6 0FB7 # 2.0 TIBETAN SUBJOINED LETTER BHA +0FA8..0FAB ; valid # 2.0 TIBETAN SUBJOINED LETTER MA..TIBETAN SUBJOINED LETTER DZA +0FAC ; mapped ; 0FAB 0FB7 # 2.0 TIBETAN SUBJOINED LETTER DZHA +0FAD ; valid # 2.0 TIBETAN SUBJOINED LETTER WA +0FAE..0FB0 ; valid # 3.0 TIBETAN SUBJOINED LETTER ZHA..TIBETAN SUBJOINED LETTER -A +0FB1..0FB7 ; valid # 2.0 TIBETAN SUBJOINED LETTER YA..TIBETAN SUBJOINED LETTER HA +0FB8 ; valid # 3.0 TIBETAN SUBJOINED LETTER A +0FB9 ; mapped ; 0F90 0FB5 # 2.0 TIBETAN SUBJOINED LETTER KSSA +0FBA..0FBC ; valid # 3.0 TIBETAN SUBJOINED LETTER FIXED-FORM WA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBD ; disallowed # NA <reserved-0FBD> +0FBE..0FC5 ; valid ; ; NV8 # 3.0 TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC6 ; valid # 3.0 TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC ; valid ; ; NV8 # 3.0 TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCD ; disallowed # NA <reserved-0FCD> +0FCE ; valid ; ; NV8 # 5.1 TIBETAN SIGN RDEL NAG RDEL DKAR +0FCF ; valid ; ; NV8 # 3.0 TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD1 ; valid ; ; NV8 # 4.1 TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN +0FD2..0FD4 ; valid ; ; NV8 # 5.1 TIBETAN MARK NYIS TSHEG..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5..0FD8 ; valid ; ; NV8 # 5.2 RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +0FD9..0FDA ; valid ; ; NV8 # 6.0 TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS +0FDB..0FFF ; disallowed # NA <reserved-0FDB>..<reserved-0FFF> +1000..1021 ; valid # 3.0 MYANMAR LETTER KA..MYANMAR LETTER A +1022 ; valid # 5.1 MYANMAR LETTER SHAN A +1023..1027 ; valid # 3.0 MYANMAR LETTER I..MYANMAR LETTER E +1028 ; valid # 5.1 MYANMAR LETTER MON E +1029..102A ; valid # 3.0 MYANMAR LETTER O..MYANMAR LETTER AU +102B ; valid # 5.1 MYANMAR VOWEL SIGN TALL AA +102C..1032 ; valid # 3.0 MYANMAR VOWEL SIGN AA..MYANMAR VOWEL SIGN AI +1033..1035 ; valid # 5.1 MYANMAR VOWEL SIGN MON II..MYANMAR VOWEL SIGN E ABOVE +1036..1039 ; valid # 3.0 MYANMAR SIGN ANUSVARA..MYANMAR SIGN VIRAMA +103A..103F ; valid # 5.1 MYANMAR SIGN ASAT..MYANMAR LETTER GREAT SA +1040..1049 ; valid # 3.0 MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; valid ; ; NV8 # 3.0 MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1059 ; valid # 3.0 MYANMAR LETTER SHA..MYANMAR VOWEL SIGN VOCALIC LL +105A..1099 ; valid # 5.1 MYANMAR LETTER MON NGA..MYANMAR SHAN DIGIT NINE +109A..109D ; valid # 5.2 MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON AI +109E..109F ; valid ; ; NV8 # 5.1 MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +10A0..10C5 ; disallowed # 1.1 GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C6 ; disallowed # NA <reserved-10C6> +10C7 ; mapped ; 2D27 # 6.1 GEORGIAN CAPITAL LETTER YN +10C8..10CC ; disallowed # NA <reserved-10C8>..<reserved-10CC> +10CD ; mapped ; 2D2D # 6.1 GEORGIAN CAPITAL LETTER AEN +10CE..10CF ; disallowed # NA <reserved-10CE>..<reserved-10CF> +10D0..10F6 ; valid # 1.1 GEORGIAN LETTER AN..GEORGIAN LETTER FI +10F7..10F8 ; valid # 3.2 GEORGIAN LETTER YN..GEORGIAN LETTER ELIFI +10F9..10FA ; valid # 4.1 GEORGIAN LETTER TURNED GAN..GEORGIAN LETTER AIN +10FB ; valid ; ; NV8 # 1.1 GEORGIAN PARAGRAPH SEPARATOR +10FC ; mapped ; 10DC # 4.1 MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; valid # 6.1 GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..1159 ; valid ; ; NV8 # 1.1 HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH +115A..115E ; valid ; ; NV8 # 5.2 HANGUL CHOSEONG KIYEOK-TIKEUT..HANGUL CHOSEONG TIKEUT-RIEUL +115F..1160 ; disallowed # 1.1 HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER +1161..11A2 ; valid ; ; NV8 # 1.1 HANGUL JUNGSEONG A..HANGUL JUNGSEONG SSANGARAEA +11A3..11A7 ; valid ; ; NV8 # 5.2 HANGUL JUNGSEONG A-EU..HANGUL JUNGSEONG O-YAE +11A8..11F9 ; valid ; ; NV8 # 1.1 HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH +11FA..11FF ; valid ; ; NV8 # 5.2 HANGUL JONGSEONG KIYEOK-NIEUN..HANGUL JONGSEONG SSANGNIEUN +1200..1206 ; valid # 3.0 ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO +1207 ; valid # 4.1 ETHIOPIC SYLLABLE HOA +1208..1246 ; valid # 3.0 ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO +1247 ; valid # 4.1 ETHIOPIC SYLLABLE QOA +1248 ; valid # 3.0 ETHIOPIC SYLLABLE QWA +1249 ; disallowed # NA <reserved-1249> +124A..124D ; valid # 3.0 ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +124E..124F ; disallowed # NA <reserved-124E>..<reserved-124F> +1250..1256 ; valid # 3.0 ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1257 ; disallowed # NA <reserved-1257> +1258 ; valid # 3.0 ETHIOPIC SYLLABLE QHWA +1259 ; disallowed # NA <reserved-1259> +125A..125D ; valid # 3.0 ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +125E..125F ; disallowed # NA <reserved-125E>..<reserved-125F> +1260..1286 ; valid # 3.0 ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO +1287 ; valid # 4.1 ETHIOPIC SYLLABLE XOA +1288 ; valid # 3.0 ETHIOPIC SYLLABLE XWA +1289 ; disallowed # NA <reserved-1289> +128A..128D ; valid # 3.0 ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +128E..128F ; disallowed # NA <reserved-128E>..<reserved-128F> +1290..12AE ; valid # 3.0 ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO +12AF ; valid # 4.1 ETHIOPIC SYLLABLE KOA +12B0 ; valid # 3.0 ETHIOPIC SYLLABLE KWA +12B1 ; disallowed # NA <reserved-12B1> +12B2..12B5 ; valid # 3.0 ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B6..12B7 ; disallowed # NA <reserved-12B6>..<reserved-12B7> +12B8..12BE ; valid # 3.0 ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12BF ; disallowed # NA <reserved-12BF> +12C0 ; valid # 3.0 ETHIOPIC SYLLABLE KXWA +12C1 ; disallowed # NA <reserved-12C1> +12C2..12C5 ; valid # 3.0 ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C6..12C7 ; disallowed # NA <reserved-12C6>..<reserved-12C7> +12C8..12CE ; valid # 3.0 ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO +12CF ; valid # 4.1 ETHIOPIC SYLLABLE WOA +12D0..12D6 ; valid # 3.0 ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O +12D7 ; disallowed # NA <reserved-12D7> +12D8..12EE ; valid # 3.0 ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO +12EF ; valid # 4.1 ETHIOPIC SYLLABLE YOA +12F0..130E ; valid # 3.0 ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO +130F ; valid # 4.1 ETHIOPIC SYLLABLE GOA +1310 ; valid # 3.0 ETHIOPIC SYLLABLE GWA +1311 ; disallowed # NA <reserved-1311> +1312..1315 ; valid # 3.0 ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1316..1317 ; disallowed # NA <reserved-1316>..<reserved-1317> +1318..131E ; valid # 3.0 ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO +131F ; valid # 4.1 ETHIOPIC SYLLABLE GGWAA +1320..1346 ; valid # 3.0 ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO +1347 ; valid # 4.1 ETHIOPIC SYLLABLE TZOA +1348..135A ; valid # 3.0 ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA +135B..135C ; disallowed # NA <reserved-135B>..<reserved-135C> +135D..135E ; valid # 6.0 ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING VOWEL LENGTH MARK +135F ; valid # 4.1 ETHIOPIC COMBINING GEMINATION MARK +1360 ; valid ; ; NV8 # 4.1 ETHIOPIC SECTION MARK +1361..137C ; valid ; ; NV8 # 3.0 ETHIOPIC WORDSPACE..ETHIOPIC NUMBER TEN THOUSAND +137D..137F ; disallowed # NA <reserved-137D>..<reserved-137F> +1380..138F ; valid # 4.1 ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399 ; valid ; ; NV8 # 4.1 ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +139A..139F ; disallowed # NA <reserved-139A>..<reserved-139F> +13A0..13F4 ; valid # 3.0 CHEROKEE LETTER A..CHEROKEE LETTER YV +13F5 ; valid # 8.0 CHEROKEE LETTER MV +13F6..13F7 ; disallowed # NA <reserved-13F6>..<reserved-13F7> +13F8 ; mapped ; 13F0 # 8.0 CHEROKEE SMALL LETTER YE +13F9 ; mapped ; 13F1 # 8.0 CHEROKEE SMALL LETTER YI +13FA ; mapped ; 13F2 # 8.0 CHEROKEE SMALL LETTER YO +13FB ; mapped ; 13F3 # 8.0 CHEROKEE SMALL LETTER YU +13FC ; mapped ; 13F4 # 8.0 CHEROKEE SMALL LETTER YV +13FD ; mapped ; 13F5 # 8.0 CHEROKEE SMALL LETTER MV +13FE..13FF ; disallowed # NA <reserved-13FE>..<reserved-13FF> +1400 ; valid ; ; NV8 # 5.2 CANADIAN SYLLABICS HYPHEN +1401..166C ; valid # 3.0 CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D..166E ; valid ; ; NV8 # 3.0 CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP +166F..1676 ; valid # 3.0 CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA +1677..167F ; valid # 5.2 CANADIAN SYLLABICS WOODS-CREE THWEE..CANADIAN SYLLABICS BLACKFOOT W +1680 ; disallowed # 3.0 OGHAM SPACE MARK +1681..169A ; valid # 3.0 OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B..169C ; valid ; ; NV8 # 3.0 OGHAM FEATHER MARK..OGHAM REVERSED FEATHER MARK +169D..169F ; disallowed # NA <reserved-169D>..<reserved-169F> +16A0..16EA ; valid # 3.0 RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EB..16F0 ; valid ; ; NV8 # 3.0 RUNIC SINGLE PUNCTUATION..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; valid # 7.0 RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +16F9..16FF ; disallowed # NA <reserved-16F9>..<reserved-16FF> +1700..170C ; valid # 3.2 TAGALOG LETTER A..TAGALOG LETTER YA +170D ; disallowed # NA <reserved-170D> +170E..1714 ; valid # 3.2 TAGALOG LETTER LA..TAGALOG SIGN VIRAMA +1715..171F ; disallowed # NA <reserved-1715>..<reserved-171F> +1720..1734 ; valid # 3.2 HANUNOO LETTER A..HANUNOO SIGN PAMUDPOD +1735..1736 ; valid ; ; NV8 # 3.2 PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1737..173F ; disallowed # NA <reserved-1737>..<reserved-173F> +1740..1753 ; valid # 3.2 BUHID LETTER A..BUHID VOWEL SIGN U +1754..175F ; disallowed # NA <reserved-1754>..<reserved-175F> +1760..176C ; valid # 3.2 TAGBANWA LETTER A..TAGBANWA LETTER YA +176D ; disallowed # NA <reserved-176D> +176E..1770 ; valid # 3.2 TAGBANWA LETTER LA..TAGBANWA LETTER SA +1771 ; disallowed # NA <reserved-1771> +1772..1773 ; valid # 3.2 TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1774..177F ; disallowed # NA <reserved-1774>..<reserved-177F> +1780..17B3 ; valid # 3.0 KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; disallowed # 3.0 KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6..17D3 ; valid # 3.0 KHMER VOWEL SIGN AA..KHMER SIGN BATHAMASAT +17D4..17D6 ; valid ; ; NV8 # 3.0 KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; valid # 3.0 KHMER SIGN LEK TOO +17D8..17DB ; valid ; ; NV8 # 3.0 KHMER SIGN BEYYAL..KHMER CURRENCY SYMBOL RIEL +17DC ; valid # 3.0 KHMER SIGN AVAKRAHASANYA +17DD ; valid # 4.0 KHMER SIGN ATTHACAN +17DE..17DF ; disallowed # NA <reserved-17DE>..<reserved-17DF> +17E0..17E9 ; valid # 3.0 KHMER DIGIT ZERO..KHMER DIGIT NINE +17EA..17EF ; disallowed # NA <reserved-17EA>..<reserved-17EF> +17F0..17F9 ; valid ; ; NV8 # 4.0 KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +17FA..17FF ; disallowed # NA <reserved-17FA>..<reserved-17FF> +1800..1805 ; valid ; ; NV8 # 3.0 MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +1806 ; disallowed # 3.0 MONGOLIAN TODO SOFT HYPHEN +1807..180A ; valid ; ; NV8 # 3.0 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +180B..180D ; ignored # 3.0 MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; disallowed # 3.0 MONGOLIAN VOWEL SEPARATOR +180F ; disallowed # NA <reserved-180F> +1810..1819 ; valid # 3.0 MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +181A..181F ; disallowed # NA <reserved-181A>..<reserved-181F> +1820..1877 ; valid # 3.0 MONGOLIAN LETTER A..MONGOLIAN LETTER MANCHU ZHA +1878..187F ; disallowed # NA <reserved-1878>..<reserved-187F> +1880..18A9 ; valid # 3.0 MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; valid # 5.1 MONGOLIAN LETTER MANCHU ALI GALI LHA +18AB..18AF ; disallowed # NA <reserved-18AB>..<reserved-18AF> +18B0..18F5 ; valid # 5.2 CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +18F6..18FF ; disallowed # NA <reserved-18F6>..<reserved-18FF> +1900..191C ; valid # 4.0 LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA +191D..191E ; valid # 7.0 LIMBU LETTER GYAN..LIMBU LETTER TRA +191F ; disallowed # NA <reserved-191F> +1920..192B ; valid # 4.0 LIMBU VOWEL SIGN A..LIMBU SUBJOINED LETTER WA +192C..192F ; disallowed # NA <reserved-192C>..<reserved-192F> +1930..193B ; valid # 4.0 LIMBU SMALL LETTER KA..LIMBU SIGN SA-I +193C..193F ; disallowed # NA <reserved-193C>..<reserved-193F> +1940 ; valid ; ; NV8 # 4.0 LIMBU SIGN LOO +1941..1943 ; disallowed # NA <reserved-1941>..<reserved-1943> +1944..1945 ; valid ; ; NV8 # 4.0 LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..196D ; valid # 4.0 LIMBU DIGIT ZERO..TAI LE LETTER AI +196E..196F ; disallowed # NA <reserved-196E>..<reserved-196F> +1970..1974 ; valid # 4.0 TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1975..197F ; disallowed # NA <reserved-1975>..<reserved-197F> +1980..19A9 ; valid # 4.1 NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA +19AA..19AB ; valid # 5.2 NEW TAI LUE LETTER HIGH SUA..NEW TAI LUE LETTER LOW SUA +19AC..19AF ; disallowed # NA <reserved-19AC>..<reserved-19AF> +19B0..19C9 ; valid # 4.1 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19CA..19CF ; disallowed # NA <reserved-19CA>..<reserved-19CF> +19D0..19D9 ; valid # 4.1 NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; valid ; ; XV8 # 5.2 NEW TAI LUE THAM DIGIT ONE +19DB..19DD ; disallowed # NA <reserved-19DB>..<reserved-19DD> +19DE..19DF ; valid ; ; NV8 # 4.1 NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV +19E0..19FF ; valid ; ; NV8 # 4.0 KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC +1A00..1A1B ; valid # 4.1 BUGINESE LETTER KA..BUGINESE VOWEL SIGN AE +1A1C..1A1D ; disallowed # NA <reserved-1A1C>..<reserved-1A1D> +1A1E..1A1F ; valid ; ; NV8 # 4.1 BUGINESE PALLAWA..BUGINESE END OF SECTION +1A20..1A5E ; valid # 5.2 TAI THAM LETTER HIGH KA..TAI THAM CONSONANT SIGN SA +1A5F ; disallowed # NA <reserved-1A5F> +1A60..1A7C ; valid # 5.2 TAI THAM SIGN SAKOT..TAI THAM SIGN KHUEN-LUE KARAN +1A7D..1A7E ; disallowed # NA <reserved-1A7D>..<reserved-1A7E> +1A7F..1A89 ; valid # 5.2 TAI THAM COMBINING CRYPTOGRAMMIC DOT..TAI THAM HORA DIGIT NINE +1A8A..1A8F ; disallowed # NA <reserved-1A8A>..<reserved-1A8F> +1A90..1A99 ; valid # 5.2 TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1A9A..1A9F ; disallowed # NA <reserved-1A9A>..<reserved-1A9F> +1AA0..1AA6 ; valid ; ; NV8 # 5.2 TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7 ; valid # 5.2 TAI THAM SIGN MAI YAMOK +1AA8..1AAD ; valid ; ; NV8 # 5.2 TAI THAM SIGN KAAN..TAI THAM SIGN CAANG +1AAE..1AAF ; disallowed # NA <reserved-1AAE>..<reserved-1AAF> +1AB0..1ABD ; valid # 7.0 COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; valid ; ; NV8 # 7.0 COMBINING PARENTHESES OVERLAY +1ABF..1AFF ; disallowed # NA <reserved-1ABF>..<reserved-1AFF> +1B00..1B4B ; valid # 5.0 BALINESE SIGN ULU RICEM..BALINESE LETTER ASYURA SASAK +1B4C..1B4F ; disallowed # NA <reserved-1B4C>..<reserved-1B4F> +1B50..1B59 ; valid # 5.0 BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B6A ; valid ; ; NV8 # 5.0 BALINESE PANTI..BALINESE MUSICAL SYMBOL DANG GEDE +1B6B..1B73 ; valid # 5.0 BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B74..1B7C ; valid ; ; NV8 # 5.0 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B7D..1B7F ; disallowed # NA <reserved-1B7D>..<reserved-1B7F> +1B80..1BAA ; valid # 5.1 SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PAMAAEH +1BAB..1BAD ; valid # 6.1 SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BB9 ; valid # 5.1 SUNDANESE LETTER KHA..SUNDANESE DIGIT NINE +1BBA..1BBF ; valid # 6.1 SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M +1BC0..1BF3 ; valid # 6.0 BATAK LETTER A..BATAK PANONGONAN +1BF4..1BFB ; disallowed # NA <reserved-1BF4>..<reserved-1BFB> +1BFC..1BFF ; valid ; ; NV8 # 6.0 BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT +1C00..1C37 ; valid # 5.1 LEPCHA LETTER KA..LEPCHA SIGN NUKTA +1C38..1C3A ; disallowed # NA <reserved-1C38>..<reserved-1C3A> +1C3B..1C3F ; valid ; ; NV8 # 5.1 LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49 ; valid # 5.1 LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4A..1C4C ; disallowed # NA <reserved-1C4A>..<reserved-1C4C> +1C4D..1C7D ; valid # 5.1 LEPCHA LETTER TTA..OL CHIKI AHAD +1C7E..1C7F ; valid ; ; NV8 # 5.1 OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +1C80 ; mapped ; 0432 # 9.0 CYRILLIC SMALL LETTER ROUNDED VE +1C81 ; mapped ; 0434 # 9.0 CYRILLIC SMALL LETTER LONG-LEGGED DE +1C82 ; mapped ; 043E # 9.0 CYRILLIC SMALL LETTER NARROW O +1C83 ; mapped ; 0441 # 9.0 CYRILLIC SMALL LETTER WIDE ES +1C84..1C85 ; mapped ; 0442 # 9.0 CYRILLIC SMALL LETTER TALL TE..CYRILLIC SMALL LETTER THREE-LEGGED TE +1C86 ; mapped ; 044A # 9.0 CYRILLIC SMALL LETTER TALL HARD SIGN +1C87 ; mapped ; 0463 # 9.0 CYRILLIC SMALL LETTER TALL YAT +1C88 ; mapped ; A64B # 9.0 CYRILLIC SMALL LETTER UNBLENDED UK +1C89..1CBF ; disallowed # NA <reserved-1C89>..<reserved-1CBF> +1CC0..1CC7 ; valid ; ; NV8 # 6.1 SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA +1CC8..1CCF ; disallowed # NA <reserved-1CC8>..<reserved-1CCF> +1CD0..1CD2 ; valid # 5.2 VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD3 ; valid ; ; NV8 # 5.2 VEDIC SIGN NIHSHVASA +1CD4..1CF2 ; valid # 5.2 VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC SIGN ARDHAVISARGA +1CF3..1CF6 ; valid # 6.1 VEDIC SIGN ROTATED ARDHAVISARGA..VEDIC SIGN UPADHMANIYA +1CF7 ; disallowed # NA <reserved-1CF7> +1CF8..1CF9 ; valid # 7.0 VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1CFA..1CFF ; disallowed # NA <reserved-1CFA>..<reserved-1CFF> +1D00..1D2B ; valid # 4.0 LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C ; mapped ; 0061 # 4.0 MODIFIER LETTER CAPITAL A +1D2D ; mapped ; 00E6 # 4.0 MODIFIER LETTER CAPITAL AE +1D2E ; mapped ; 0062 # 4.0 MODIFIER LETTER CAPITAL B +1D2F ; valid # 4.0 MODIFIER LETTER CAPITAL BARRED B +1D30 ; mapped ; 0064 # 4.0 MODIFIER LETTER CAPITAL D +1D31 ; mapped ; 0065 # 4.0 MODIFIER LETTER CAPITAL E +1D32 ; mapped ; 01DD # 4.0 MODIFIER LETTER CAPITAL REVERSED E +1D33 ; mapped ; 0067 # 4.0 MODIFIER LETTER CAPITAL G +1D34 ; mapped ; 0068 # 4.0 MODIFIER LETTER CAPITAL H +1D35 ; mapped ; 0069 # 4.0 MODIFIER LETTER CAPITAL I +1D36 ; mapped ; 006A # 4.0 MODIFIER LETTER CAPITAL J +1D37 ; mapped ; 006B # 4.0 MODIFIER LETTER CAPITAL K +1D38 ; mapped ; 006C # 4.0 MODIFIER LETTER CAPITAL L +1D39 ; mapped ; 006D # 4.0 MODIFIER LETTER CAPITAL M +1D3A ; mapped ; 006E # 4.0 MODIFIER LETTER CAPITAL N +1D3B ; valid # 4.0 MODIFIER LETTER CAPITAL REVERSED N +1D3C ; mapped ; 006F # 4.0 MODIFIER LETTER CAPITAL O +1D3D ; mapped ; 0223 # 4.0 MODIFIER LETTER CAPITAL OU +1D3E ; mapped ; 0070 # 4.0 MODIFIER LETTER CAPITAL P +1D3F ; mapped ; 0072 # 4.0 MODIFIER LETTER CAPITAL R +1D40 ; mapped ; 0074 # 4.0 MODIFIER LETTER CAPITAL T +1D41 ; mapped ; 0075 # 4.0 MODIFIER LETTER CAPITAL U +1D42 ; mapped ; 0077 # 4.0 MODIFIER LETTER CAPITAL W +1D43 ; mapped ; 0061 # 4.0 MODIFIER LETTER SMALL A +1D44 ; mapped ; 0250 # 4.0 MODIFIER LETTER SMALL TURNED A +1D45 ; mapped ; 0251 # 4.0 MODIFIER LETTER SMALL ALPHA +1D46 ; mapped ; 1D02 # 4.0 MODIFIER LETTER SMALL TURNED AE +1D47 ; mapped ; 0062 # 4.0 MODIFIER LETTER SMALL B +1D48 ; mapped ; 0064 # 4.0 MODIFIER LETTER SMALL D +1D49 ; mapped ; 0065 # 4.0 MODIFIER LETTER SMALL E +1D4A ; mapped ; 0259 # 4.0 MODIFIER LETTER SMALL SCHWA +1D4B ; mapped ; 025B # 4.0 MODIFIER LETTER SMALL OPEN E +1D4C ; mapped ; 025C # 4.0 MODIFIER LETTER SMALL TURNED OPEN E +1D4D ; mapped ; 0067 # 4.0 MODIFIER LETTER SMALL G +1D4E ; valid # 4.0 MODIFIER LETTER SMALL TURNED I +1D4F ; mapped ; 006B # 4.0 MODIFIER LETTER SMALL K +1D50 ; mapped ; 006D # 4.0 MODIFIER LETTER SMALL M +1D51 ; mapped ; 014B # 4.0 MODIFIER LETTER SMALL ENG +1D52 ; mapped ; 006F # 4.0 MODIFIER LETTER SMALL O +1D53 ; mapped ; 0254 # 4.0 MODIFIER LETTER SMALL OPEN O +1D54 ; mapped ; 1D16 # 4.0 MODIFIER LETTER SMALL TOP HALF O +1D55 ; mapped ; 1D17 # 4.0 MODIFIER LETTER SMALL BOTTOM HALF O +1D56 ; mapped ; 0070 # 4.0 MODIFIER LETTER SMALL P +1D57 ; mapped ; 0074 # 4.0 MODIFIER LETTER SMALL T +1D58 ; mapped ; 0075 # 4.0 MODIFIER LETTER SMALL U +1D59 ; mapped ; 1D1D # 4.0 MODIFIER LETTER SMALL SIDEWAYS U +1D5A ; mapped ; 026F # 4.0 MODIFIER LETTER SMALL TURNED M +1D5B ; mapped ; 0076 # 4.0 MODIFIER LETTER SMALL V +1D5C ; mapped ; 1D25 # 4.0 MODIFIER LETTER SMALL AIN +1D5D ; mapped ; 03B2 # 4.0 MODIFIER LETTER SMALL BETA +1D5E ; mapped ; 03B3 # 4.0 MODIFIER LETTER SMALL GREEK GAMMA +1D5F ; mapped ; 03B4 # 4.0 MODIFIER LETTER SMALL DELTA +1D60 ; mapped ; 03C6 # 4.0 MODIFIER LETTER SMALL GREEK PHI +1D61 ; mapped ; 03C7 # 4.0 MODIFIER LETTER SMALL CHI +1D62 ; mapped ; 0069 # 4.0 LATIN SUBSCRIPT SMALL LETTER I +1D63 ; mapped ; 0072 # 4.0 LATIN SUBSCRIPT SMALL LETTER R +1D64 ; mapped ; 0075 # 4.0 LATIN SUBSCRIPT SMALL LETTER U +1D65 ; mapped ; 0076 # 4.0 LATIN SUBSCRIPT SMALL LETTER V +1D66 ; mapped ; 03B2 # 4.0 GREEK SUBSCRIPT SMALL LETTER BETA +1D67 ; mapped ; 03B3 # 4.0 GREEK SUBSCRIPT SMALL LETTER GAMMA +1D68 ; mapped ; 03C1 # 4.0 GREEK SUBSCRIPT SMALL LETTER RHO +1D69 ; mapped ; 03C6 # 4.0 GREEK SUBSCRIPT SMALL LETTER PHI +1D6A ; mapped ; 03C7 # 4.0 GREEK SUBSCRIPT SMALL LETTER CHI +1D6B ; valid # 4.0 LATIN SMALL LETTER UE +1D6C..1D77 ; valid # 4.1 LATIN SMALL LETTER B WITH MIDDLE TILDE..LATIN SMALL LETTER TURNED G +1D78 ; mapped ; 043D # 4.1 MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; valid # 4.1 LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B ; mapped ; 0252 # 4.1 MODIFIER LETTER SMALL TURNED ALPHA +1D9C ; mapped ; 0063 # 4.1 MODIFIER LETTER SMALL C +1D9D ; mapped ; 0255 # 4.1 MODIFIER LETTER SMALL C WITH CURL +1D9E ; mapped ; 00F0 # 4.1 MODIFIER LETTER SMALL ETH +1D9F ; mapped ; 025C # 4.1 MODIFIER LETTER SMALL REVERSED OPEN E +1DA0 ; mapped ; 0066 # 4.1 MODIFIER LETTER SMALL F +1DA1 ; mapped ; 025F # 4.1 MODIFIER LETTER SMALL DOTLESS J WITH STROKE +1DA2 ; mapped ; 0261 # 4.1 MODIFIER LETTER SMALL SCRIPT G +1DA3 ; mapped ; 0265 # 4.1 MODIFIER LETTER SMALL TURNED H +1DA4 ; mapped ; 0268 # 4.1 MODIFIER LETTER SMALL I WITH STROKE +1DA5 ; mapped ; 0269 # 4.1 MODIFIER LETTER SMALL IOTA +1DA6 ; mapped ; 026A # 4.1 MODIFIER LETTER SMALL CAPITAL I +1DA7 ; mapped ; 1D7B # 4.1 MODIFIER LETTER SMALL CAPITAL I WITH STROKE +1DA8 ; mapped ; 029D # 4.1 MODIFIER LETTER SMALL J WITH CROSSED-TAIL +1DA9 ; mapped ; 026D # 4.1 MODIFIER LETTER SMALL L WITH RETROFLEX HOOK +1DAA ; mapped ; 1D85 # 4.1 MODIFIER LETTER SMALL L WITH PALATAL HOOK +1DAB ; mapped ; 029F # 4.1 MODIFIER LETTER SMALL CAPITAL L +1DAC ; mapped ; 0271 # 4.1 MODIFIER LETTER SMALL M WITH HOOK +1DAD ; mapped ; 0270 # 4.1 MODIFIER LETTER SMALL TURNED M WITH LONG LEG +1DAE ; mapped ; 0272 # 4.1 MODIFIER LETTER SMALL N WITH LEFT HOOK +1DAF ; mapped ; 0273 # 4.1 MODIFIER LETTER SMALL N WITH RETROFLEX HOOK +1DB0 ; mapped ; 0274 # 4.1 MODIFIER LETTER SMALL CAPITAL N +1DB1 ; mapped ; 0275 # 4.1 MODIFIER LETTER SMALL BARRED O +1DB2 ; mapped ; 0278 # 4.1 MODIFIER LETTER SMALL PHI +1DB3 ; mapped ; 0282 # 4.1 MODIFIER LETTER SMALL S WITH HOOK +1DB4 ; mapped ; 0283 # 4.1 MODIFIER LETTER SMALL ESH +1DB5 ; mapped ; 01AB # 4.1 MODIFIER LETTER SMALL T WITH PALATAL HOOK +1DB6 ; mapped ; 0289 # 4.1 MODIFIER LETTER SMALL U BAR +1DB7 ; mapped ; 028A # 4.1 MODIFIER LETTER SMALL UPSILON +1DB8 ; mapped ; 1D1C # 4.1 MODIFIER LETTER SMALL CAPITAL U +1DB9 ; mapped ; 028B # 4.1 MODIFIER LETTER SMALL V WITH HOOK +1DBA ; mapped ; 028C # 4.1 MODIFIER LETTER SMALL TURNED V +1DBB ; mapped ; 007A # 4.1 MODIFIER LETTER SMALL Z +1DBC ; mapped ; 0290 # 4.1 MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK +1DBD ; mapped ; 0291 # 4.1 MODIFIER LETTER SMALL Z WITH CURL +1DBE ; mapped ; 0292 # 4.1 MODIFIER LETTER SMALL EZH +1DBF ; mapped ; 03B8 # 4.1 MODIFIER LETTER SMALL THETA +1DC0..1DC3 ; valid # 4.1 COMBINING DOTTED GRAVE ACCENT..COMBINING SUSPENSION MARK +1DC4..1DCA ; valid # 5.0 COMBINING MACRON-ACUTE..COMBINING LATIN SMALL LETTER R BELOW +1DCB..1DE6 ; valid # 5.1 COMBINING BREVE-MACRON..COMBINING LATIN SMALL LETTER Z +1DE7..1DF5 ; valid # 7.0 COMBINING LATIN SMALL LETTER ALPHA..COMBINING UP TACK ABOVE +1DF6..1DFA ; disallowed # NA <reserved-1DF6>..<reserved-1DFA> +1DFB ; valid # 9.0 COMBINING DELETION MARK +1DFC ; valid # 6.0 COMBINING DOUBLE INVERTED BREVE BELOW +1DFD ; valid # 5.2 COMBINING ALMOST EQUAL TO BELOW +1DFE..1DFF ; valid # 5.0 COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1E00 ; mapped ; 1E01 # 1.1 LATIN CAPITAL LETTER A WITH RING BELOW +1E01 ; valid # 1.1 LATIN SMALL LETTER A WITH RING BELOW +1E02 ; mapped ; 1E03 # 1.1 LATIN CAPITAL LETTER B WITH DOT ABOVE +1E03 ; valid # 1.1 LATIN SMALL LETTER B WITH DOT ABOVE +1E04 ; mapped ; 1E05 # 1.1 LATIN CAPITAL LETTER B WITH DOT BELOW +1E05 ; valid # 1.1 LATIN SMALL LETTER B WITH DOT BELOW +1E06 ; mapped ; 1E07 # 1.1 LATIN CAPITAL LETTER B WITH LINE BELOW +1E07 ; valid # 1.1 LATIN SMALL LETTER B WITH LINE BELOW +1E08 ; mapped ; 1E09 # 1.1 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E09 ; valid # 1.1 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E0A ; mapped ; 1E0B # 1.1 LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0B ; valid # 1.1 LATIN SMALL LETTER D WITH DOT ABOVE +1E0C ; mapped ; 1E0D # 1.1 LATIN CAPITAL LETTER D WITH DOT BELOW +1E0D ; valid # 1.1 LATIN SMALL LETTER D WITH DOT BELOW +1E0E ; mapped ; 1E0F # 1.1 LATIN CAPITAL LETTER D WITH LINE BELOW +1E0F ; valid # 1.1 LATIN SMALL LETTER D WITH LINE BELOW +1E10 ; mapped ; 1E11 # 1.1 LATIN CAPITAL LETTER D WITH CEDILLA +1E11 ; valid # 1.1 LATIN SMALL LETTER D WITH CEDILLA +1E12 ; mapped ; 1E13 # 1.1 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E13 ; valid # 1.1 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E14 ; mapped ; 1E15 # 1.1 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E15 ; valid # 1.1 LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E16 ; mapped ; 1E17 # 1.1 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E17 ; valid # 1.1 LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E18 ; mapped ; 1E19 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E19 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E1A ; mapped ; 1E1B # 1.1 LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1B ; valid # 1.1 LATIN SMALL LETTER E WITH TILDE BELOW +1E1C ; mapped ; 1E1D # 1.1 LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1D ; valid # 1.1 LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1E ; mapped ; 1E1F # 1.1 LATIN CAPITAL LETTER F WITH DOT ABOVE +1E1F ; valid # 1.1 LATIN SMALL LETTER F WITH DOT ABOVE +1E20 ; mapped ; 1E21 # 1.1 LATIN CAPITAL LETTER G WITH MACRON +1E21 ; valid # 1.1 LATIN SMALL LETTER G WITH MACRON +1E22 ; mapped ; 1E23 # 1.1 LATIN CAPITAL LETTER H WITH DOT ABOVE +1E23 ; valid # 1.1 LATIN SMALL LETTER H WITH DOT ABOVE +1E24 ; mapped ; 1E25 # 1.1 LATIN CAPITAL LETTER H WITH DOT BELOW +1E25 ; valid # 1.1 LATIN SMALL LETTER H WITH DOT BELOW +1E26 ; mapped ; 1E27 # 1.1 LATIN CAPITAL LETTER H WITH DIAERESIS +1E27 ; valid # 1.1 LATIN SMALL LETTER H WITH DIAERESIS +1E28 ; mapped ; 1E29 # 1.1 LATIN CAPITAL LETTER H WITH CEDILLA +1E29 ; valid # 1.1 LATIN SMALL LETTER H WITH CEDILLA +1E2A ; mapped ; 1E2B # 1.1 LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2B ; valid # 1.1 LATIN SMALL LETTER H WITH BREVE BELOW +1E2C ; mapped ; 1E2D # 1.1 LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2D ; valid # 1.1 LATIN SMALL LETTER I WITH TILDE BELOW +1E2E ; mapped ; 1E2F # 1.1 LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E2F ; valid # 1.1 LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E30 ; mapped ; 1E31 # 1.1 LATIN CAPITAL LETTER K WITH ACUTE +1E31 ; valid # 1.1 LATIN SMALL LETTER K WITH ACUTE +1E32 ; mapped ; 1E33 # 1.1 LATIN CAPITAL LETTER K WITH DOT BELOW +1E33 ; valid # 1.1 LATIN SMALL LETTER K WITH DOT BELOW +1E34 ; mapped ; 1E35 # 1.1 LATIN CAPITAL LETTER K WITH LINE BELOW +1E35 ; valid # 1.1 LATIN SMALL LETTER K WITH LINE BELOW +1E36 ; mapped ; 1E37 # 1.1 LATIN CAPITAL LETTER L WITH DOT BELOW +1E37 ; valid # 1.1 LATIN SMALL LETTER L WITH DOT BELOW +1E38 ; mapped ; 1E39 # 1.1 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E39 ; valid # 1.1 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E3A ; mapped ; 1E3B # 1.1 LATIN CAPITAL LETTER L WITH LINE BELOW +1E3B ; valid # 1.1 LATIN SMALL LETTER L WITH LINE BELOW +1E3C ; mapped ; 1E3D # 1.1 LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3D ; valid # 1.1 LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3E ; mapped ; 1E3F # 1.1 LATIN CAPITAL LETTER M WITH ACUTE +1E3F ; valid # 1.1 LATIN SMALL LETTER M WITH ACUTE +1E40 ; mapped ; 1E41 # 1.1 LATIN CAPITAL LETTER M WITH DOT ABOVE +1E41 ; valid # 1.1 LATIN SMALL LETTER M WITH DOT ABOVE +1E42 ; mapped ; 1E43 # 1.1 LATIN CAPITAL LETTER M WITH DOT BELOW +1E43 ; valid # 1.1 LATIN SMALL LETTER M WITH DOT BELOW +1E44 ; mapped ; 1E45 # 1.1 LATIN CAPITAL LETTER N WITH DOT ABOVE +1E45 ; valid # 1.1 LATIN SMALL LETTER N WITH DOT ABOVE +1E46 ; mapped ; 1E47 # 1.1 LATIN CAPITAL LETTER N WITH DOT BELOW +1E47 ; valid # 1.1 LATIN SMALL LETTER N WITH DOT BELOW +1E48 ; mapped ; 1E49 # 1.1 LATIN CAPITAL LETTER N WITH LINE BELOW +1E49 ; valid # 1.1 LATIN SMALL LETTER N WITH LINE BELOW +1E4A ; mapped ; 1E4B # 1.1 LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4B ; valid # 1.1 LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4C ; mapped ; 1E4D # 1.1 LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4D ; valid # 1.1 LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4E ; mapped ; 1E4F # 1.1 LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E4F ; valid # 1.1 LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E50 ; mapped ; 1E51 # 1.1 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E51 ; valid # 1.1 LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E52 ; mapped ; 1E53 # 1.1 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E53 ; valid # 1.1 LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E54 ; mapped ; 1E55 # 1.1 LATIN CAPITAL LETTER P WITH ACUTE +1E55 ; valid # 1.1 LATIN SMALL LETTER P WITH ACUTE +1E56 ; mapped ; 1E57 # 1.1 LATIN CAPITAL LETTER P WITH DOT ABOVE +1E57 ; valid # 1.1 LATIN SMALL LETTER P WITH DOT ABOVE +1E58 ; mapped ; 1E59 # 1.1 LATIN CAPITAL LETTER R WITH DOT ABOVE +1E59 ; valid # 1.1 LATIN SMALL LETTER R WITH DOT ABOVE +1E5A ; mapped ; 1E5B # 1.1 LATIN CAPITAL LETTER R WITH DOT BELOW +1E5B ; valid # 1.1 LATIN SMALL LETTER R WITH DOT BELOW +1E5C ; mapped ; 1E5D # 1.1 LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5D ; valid # 1.1 LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5E ; mapped ; 1E5F # 1.1 LATIN CAPITAL LETTER R WITH LINE BELOW +1E5F ; valid # 1.1 LATIN SMALL LETTER R WITH LINE BELOW +1E60 ; mapped ; 1E61 # 1.1 LATIN CAPITAL LETTER S WITH DOT ABOVE +1E61 ; valid # 1.1 LATIN SMALL LETTER S WITH DOT ABOVE +1E62 ; mapped ; 1E63 # 1.1 LATIN CAPITAL LETTER S WITH DOT BELOW +1E63 ; valid # 1.1 LATIN SMALL LETTER S WITH DOT BELOW +1E64 ; mapped ; 1E65 # 1.1 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E65 ; valid # 1.1 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E66 ; mapped ; 1E67 # 1.1 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E67 ; valid # 1.1 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E68 ; mapped ; 1E69 # 1.1 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E69 ; valid # 1.1 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A ; mapped ; 1E6B # 1.1 LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6B ; valid # 1.1 LATIN SMALL LETTER T WITH DOT ABOVE +1E6C ; mapped ; 1E6D # 1.1 LATIN CAPITAL LETTER T WITH DOT BELOW +1E6D ; valid # 1.1 LATIN SMALL LETTER T WITH DOT BELOW +1E6E ; mapped ; 1E6F # 1.1 LATIN CAPITAL LETTER T WITH LINE BELOW +1E6F ; valid # 1.1 LATIN SMALL LETTER T WITH LINE BELOW +1E70 ; mapped ; 1E71 # 1.1 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E71 ; valid # 1.1 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E72 ; mapped ; 1E73 # 1.1 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E73 ; valid # 1.1 LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E74 ; mapped ; 1E75 # 1.1 LATIN CAPITAL LETTER U WITH TILDE BELOW +1E75 ; valid # 1.1 LATIN SMALL LETTER U WITH TILDE BELOW +1E76 ; mapped ; 1E77 # 1.1 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E77 ; valid # 1.1 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E78 ; mapped ; 1E79 # 1.1 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E79 ; valid # 1.1 LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E7A ; mapped ; 1E7B # 1.1 LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7B ; valid # 1.1 LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7C ; mapped ; 1E7D # 1.1 LATIN CAPITAL LETTER V WITH TILDE +1E7D ; valid # 1.1 LATIN SMALL LETTER V WITH TILDE +1E7E ; mapped ; 1E7F # 1.1 LATIN CAPITAL LETTER V WITH DOT BELOW +1E7F ; valid # 1.1 LATIN SMALL LETTER V WITH DOT BELOW +1E80 ; mapped ; 1E81 # 1.1 LATIN CAPITAL LETTER W WITH GRAVE +1E81 ; valid # 1.1 LATIN SMALL LETTER W WITH GRAVE +1E82 ; mapped ; 1E83 # 1.1 LATIN CAPITAL LETTER W WITH ACUTE +1E83 ; valid # 1.1 LATIN SMALL LETTER W WITH ACUTE +1E84 ; mapped ; 1E85 # 1.1 LATIN CAPITAL LETTER W WITH DIAERESIS +1E85 ; valid # 1.1 LATIN SMALL LETTER W WITH DIAERESIS +1E86 ; mapped ; 1E87 # 1.1 LATIN CAPITAL LETTER W WITH DOT ABOVE +1E87 ; valid # 1.1 LATIN SMALL LETTER W WITH DOT ABOVE +1E88 ; mapped ; 1E89 # 1.1 LATIN CAPITAL LETTER W WITH DOT BELOW +1E89 ; valid # 1.1 LATIN SMALL LETTER W WITH DOT BELOW +1E8A ; mapped ; 1E8B # 1.1 LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8B ; valid # 1.1 LATIN SMALL LETTER X WITH DOT ABOVE +1E8C ; mapped ; 1E8D # 1.1 LATIN CAPITAL LETTER X WITH DIAERESIS +1E8D ; valid # 1.1 LATIN SMALL LETTER X WITH DIAERESIS +1E8E ; mapped ; 1E8F # 1.1 LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E8F ; valid # 1.1 LATIN SMALL LETTER Y WITH DOT ABOVE +1E90 ; mapped ; 1E91 # 1.1 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E91 ; valid # 1.1 LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E92 ; mapped ; 1E93 # 1.1 LATIN CAPITAL LETTER Z WITH DOT BELOW +1E93 ; valid # 1.1 LATIN SMALL LETTER Z WITH DOT BELOW +1E94 ; mapped ; 1E95 # 1.1 LATIN CAPITAL LETTER Z WITH LINE BELOW +1E95..1E99 ; valid # 1.1 LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER Y WITH RING ABOVE +1E9A ; mapped ; 0061 02BE # 1.1 LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B ; mapped ; 1E61 # 2.0 LATIN SMALL LETTER LONG S WITH DOT ABOVE +1E9C..1E9D ; valid # 5.1 LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE..LATIN SMALL LETTER LONG S WITH HIGH STROKE +1E9E ; mapped ; 0073 0073 # 5.1 LATIN CAPITAL LETTER SHARP S +1E9F ; valid # 5.1 LATIN SMALL LETTER DELTA +1EA0 ; mapped ; 1EA1 # 1.1 LATIN CAPITAL LETTER A WITH DOT BELOW +1EA1 ; valid # 1.1 LATIN SMALL LETTER A WITH DOT BELOW +1EA2 ; mapped ; 1EA3 # 1.1 LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA3 ; valid # 1.1 LATIN SMALL LETTER A WITH HOOK ABOVE +1EA4 ; mapped ; 1EA5 # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA5 ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6 ; mapped ; 1EA7 # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA7 ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8 ; mapped ; 1EA9 # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EA9 ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA ; mapped ; 1EAB # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAB ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC ; mapped ; 1EAD # 1.1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAD ; valid # 1.1 LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE ; mapped ; 1EAF # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EAF ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EB0 ; mapped ; 1EB1 # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB1 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB2 ; mapped ; 1EB3 # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB3 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB4 ; mapped ; 1EB5 # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB5 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB6 ; mapped ; 1EB7 # 1.1 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB7 ; valid # 1.1 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB8 ; mapped ; 1EB9 # 1.1 LATIN CAPITAL LETTER E WITH DOT BELOW +1EB9 ; valid # 1.1 LATIN SMALL LETTER E WITH DOT BELOW +1EBA ; mapped ; 1EBB # 1.1 LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBB ; valid # 1.1 LATIN SMALL LETTER E WITH HOOK ABOVE +1EBC ; mapped ; 1EBD # 1.1 LATIN CAPITAL LETTER E WITH TILDE +1EBD ; valid # 1.1 LATIN SMALL LETTER E WITH TILDE +1EBE ; mapped ; 1EBF # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EBF ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0 ; mapped ; 1EC1 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC1 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2 ; mapped ; 1EC3 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC3 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4 ; mapped ; 1EC5 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC5 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6 ; mapped ; 1EC7 # 1.1 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC7 ; valid # 1.1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8 ; mapped ; 1EC9 # 1.1 LATIN CAPITAL LETTER I WITH HOOK ABOVE +1EC9 ; valid # 1.1 LATIN SMALL LETTER I WITH HOOK ABOVE +1ECA ; mapped ; 1ECB # 1.1 LATIN CAPITAL LETTER I WITH DOT BELOW +1ECB ; valid # 1.1 LATIN SMALL LETTER I WITH DOT BELOW +1ECC ; mapped ; 1ECD # 1.1 LATIN CAPITAL LETTER O WITH DOT BELOW +1ECD ; valid # 1.1 LATIN SMALL LETTER O WITH DOT BELOW +1ECE ; mapped ; 1ECF # 1.1 LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ECF ; valid # 1.1 LATIN SMALL LETTER O WITH HOOK ABOVE +1ED0 ; mapped ; 1ED1 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED1 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2 ; mapped ; 1ED3 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED3 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4 ; mapped ; 1ED5 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED5 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6 ; mapped ; 1ED7 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED7 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8 ; mapped ; 1ED9 # 1.1 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1ED9 ; valid # 1.1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA ; mapped ; 1EDB # 1.1 LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDB ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDC ; mapped ; 1EDD # 1.1 LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDD ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDE ; mapped ; 1EDF # 1.1 LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EDF ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EE0 ; mapped ; 1EE1 # 1.1 LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE1 ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND TILDE +1EE2 ; mapped ; 1EE3 # 1.1 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE3 ; valid # 1.1 LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE4 ; mapped ; 1EE5 # 1.1 LATIN CAPITAL LETTER U WITH DOT BELOW +1EE5 ; valid # 1.1 LATIN SMALL LETTER U WITH DOT BELOW +1EE6 ; mapped ; 1EE7 # 1.1 LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE7 ; valid # 1.1 LATIN SMALL LETTER U WITH HOOK ABOVE +1EE8 ; mapped ; 1EE9 # 1.1 LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EE9 ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND ACUTE +1EEA ; mapped ; 1EEB # 1.1 LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEB ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND GRAVE +1EEC ; mapped ; 1EED # 1.1 LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EED ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEE ; mapped ; 1EEF # 1.1 LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EEF ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND TILDE +1EF0 ; mapped ; 1EF1 # 1.1 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF1 ; valid # 1.1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF2 ; mapped ; 1EF3 # 1.1 LATIN CAPITAL LETTER Y WITH GRAVE +1EF3 ; valid # 1.1 LATIN SMALL LETTER Y WITH GRAVE +1EF4 ; mapped ; 1EF5 # 1.1 LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF5 ; valid # 1.1 LATIN SMALL LETTER Y WITH DOT BELOW +1EF6 ; mapped ; 1EF7 # 1.1 LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF7 ; valid # 1.1 LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF8 ; mapped ; 1EF9 # 1.1 LATIN CAPITAL LETTER Y WITH TILDE +1EF9 ; valid # 1.1 LATIN SMALL LETTER Y WITH TILDE +1EFA ; mapped ; 1EFB # 5.1 LATIN CAPITAL LETTER MIDDLE-WELSH LL +1EFB ; valid # 5.1 LATIN SMALL LETTER MIDDLE-WELSH LL +1EFC ; mapped ; 1EFD # 5.1 LATIN CAPITAL LETTER MIDDLE-WELSH V +1EFD ; valid # 5.1 LATIN SMALL LETTER MIDDLE-WELSH V +1EFE ; mapped ; 1EFF # 5.1 LATIN CAPITAL LETTER Y WITH LOOP +1EFF ; valid # 5.1 LATIN SMALL LETTER Y WITH LOOP +1F00..1F07 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F08 ; mapped ; 1F00 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09 ; mapped ; 1F01 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A ; mapped ; 1F02 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B ; mapped ; 1F03 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C ; mapped ; 1F04 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D ; mapped ; 1F05 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E ; mapped ; 1F06 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F ; mapped ; 1F07 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F10..1F15 ; valid # 1.1 GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F16..1F17 ; disallowed # NA <reserved-1F16>..<reserved-1F17> +1F18 ; mapped ; 1F10 # 1.1 GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19 ; mapped ; 1F11 # 1.1 GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A ; mapped ; 1F12 # 1.1 GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B ; mapped ; 1F13 # 1.1 GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C ; mapped ; 1F14 # 1.1 GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D ; mapped ; 1F15 # 1.1 GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F1E..1F1F ; disallowed # NA <reserved-1F1E>..<reserved-1F1F> +1F20..1F27 ; valid # 1.1 GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F28 ; mapped ; 1F20 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI +1F29 ; mapped ; 1F21 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA +1F2A ; mapped ; 1F22 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B ; mapped ; 1F23 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C ; mapped ; 1F24 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D ; mapped ; 1F25 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E ; mapped ; 1F26 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F ; mapped ; 1F27 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F30..1F37 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F38 ; mapped ; 1F30 # 1.1 GREEK CAPITAL LETTER IOTA WITH PSILI +1F39 ; mapped ; 1F31 # 1.1 GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A ; mapped ; 1F32 # 1.1 GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B ; mapped ; 1F33 # 1.1 GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C ; mapped ; 1F34 # 1.1 GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D ; mapped ; 1F35 # 1.1 GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E ; mapped ; 1F36 # 1.1 GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F ; mapped ; 1F37 # 1.1 GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F40..1F45 ; valid # 1.1 GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F46..1F47 ; disallowed # NA <reserved-1F46>..<reserved-1F47> +1F48 ; mapped ; 1F40 # 1.1 GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49 ; mapped ; 1F41 # 1.1 GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A ; mapped ; 1F42 # 1.1 GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B ; mapped ; 1F43 # 1.1 GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C ; mapped ; 1F44 # 1.1 GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D ; mapped ; 1F45 # 1.1 GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F4E..1F4F ; disallowed # NA <reserved-1F4E>..<reserved-1F4F> +1F50..1F57 ; valid # 1.1 GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F58 ; disallowed # NA <reserved-1F58> +1F59 ; mapped ; 1F51 # 1.1 GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5A ; disallowed # NA <reserved-1F5A> +1F5B ; mapped ; 1F53 # 1.1 GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5C ; disallowed # NA <reserved-1F5C> +1F5D ; mapped ; 1F55 # 1.1 GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5E ; disallowed # NA <reserved-1F5E> +1F5F ; mapped ; 1F57 # 1.1 GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F60..1F67 ; valid # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F68 ; mapped ; 1F60 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69 ; mapped ; 1F61 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A ; mapped ; 1F62 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B ; mapped ; 1F63 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C ; mapped ; 1F64 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D ; mapped ; 1F65 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E ; mapped ; 1F66 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F ; mapped ; 1F67 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F70 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH VARIA +1F71 ; mapped ; 03AC # 1.1 GREEK SMALL LETTER ALPHA WITH OXIA +1F72 ; valid # 1.1 GREEK SMALL LETTER EPSILON WITH VARIA +1F73 ; mapped ; 03AD # 1.1 GREEK SMALL LETTER EPSILON WITH OXIA +1F74 ; valid # 1.1 GREEK SMALL LETTER ETA WITH VARIA +1F75 ; mapped ; 03AE # 1.1 GREEK SMALL LETTER ETA WITH OXIA +1F76 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH VARIA +1F77 ; mapped ; 03AF # 1.1 GREEK SMALL LETTER IOTA WITH OXIA +1F78 ; valid # 1.1 GREEK SMALL LETTER OMICRON WITH VARIA +1F79 ; mapped ; 03CC # 1.1 GREEK SMALL LETTER OMICRON WITH OXIA +1F7A ; valid # 1.1 GREEK SMALL LETTER UPSILON WITH VARIA +1F7B ; mapped ; 03CD # 1.1 GREEK SMALL LETTER UPSILON WITH OXIA +1F7C ; valid # 1.1 GREEK SMALL LETTER OMEGA WITH VARIA +1F7D ; mapped ; 03CE # 1.1 GREEK SMALL LETTER OMEGA WITH OXIA +1F7E..1F7F ; disallowed # NA <reserved-1F7E>..<reserved-1F7F> +1F80 ; mapped ; 1F00 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81 ; mapped ; 1F01 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82 ; mapped ; 1F02 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83 ; mapped ; 1F03 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84 ; mapped ; 1F04 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85 ; mapped ; 1F05 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86 ; mapped ; 1F06 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87 ; mapped ; 1F07 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88 ; mapped ; 1F00 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89 ; mapped ; 1F01 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A ; mapped ; 1F02 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B ; mapped ; 1F03 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C ; mapped ; 1F04 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D ; mapped ; 1F05 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E ; mapped ; 1F06 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F ; mapped ; 1F07 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90 ; mapped ; 1F20 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91 ; mapped ; 1F21 03B9 # 1.1 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92 ; mapped ; 1F22 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93 ; mapped ; 1F23 03B9 # 1.1 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94 ; mapped ; 1F24 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95 ; mapped ; 1F25 03B9 # 1.1 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96 ; mapped ; 1F26 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97 ; mapped ; 1F27 03B9 # 1.1 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98 ; mapped ; 1F20 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99 ; mapped ; 1F21 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A ; mapped ; 1F22 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B ; mapped ; 1F23 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C ; mapped ; 1F24 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D ; mapped ; 1F25 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E ; mapped ; 1F26 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F ; mapped ; 1F27 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0 ; mapped ; 1F60 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1 ; mapped ; 1F61 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2 ; mapped ; 1F62 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3 ; mapped ; 1F63 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4 ; mapped ; 1F64 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5 ; mapped ; 1F65 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6 ; mapped ; 1F66 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7 ; mapped ; 1F67 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8 ; mapped ; 1F60 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9 ; mapped ; 1F61 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA ; mapped ; 1F62 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB ; mapped ; 1F63 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC ; mapped ; 1F64 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD ; mapped ; 1F65 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE ; mapped ; 1F66 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF ; mapped ; 1F67 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB0..1FB1 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH MACRON +1FB2 ; mapped ; 1F70 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3 ; mapped ; 03B1 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4 ; mapped ; 03AC 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB5 ; disallowed # NA <reserved-1FB5> +1FB6 ; valid # 1.1 GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7 ; mapped ; 1FB6 03B9 # 1.1 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8 ; mapped ; 1FB0 # 1.1 GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9 ; mapped ; 1FB1 # 1.1 GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA ; mapped ; 1F70 # 1.1 GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB ; mapped ; 03AC # 1.1 GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC ; mapped ; 03B1 03B9 # 1.1 GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; disallowed_STD3_mapped ; 0020 0313 # 1.1 GREEK KORONIS +1FBE ; mapped ; 03B9 # 1.1 GREEK PROSGEGRAMMENI +1FBF ; disallowed_STD3_mapped ; 0020 0313 # 1.1 GREEK PSILI +1FC0 ; disallowed_STD3_mapped ; 0020 0342 # 1.1 GREEK PERISPOMENI +1FC1 ; disallowed_STD3_mapped ; 0020 0308 0342 #1.1 GREEK DIALYTIKA AND PERISPOMENI +1FC2 ; mapped ; 1F74 03B9 # 1.1 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3 ; mapped ; 03B7 03B9 # 1.1 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4 ; mapped ; 03AE 03B9 # 1.1 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC5 ; disallowed # NA <reserved-1FC5> +1FC6 ; valid # 1.1 GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7 ; mapped ; 1FC6 03B9 # 1.1 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8 ; mapped ; 1F72 # 1.1 GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9 ; mapped ; 03AD # 1.1 GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA ; mapped ; 1F74 # 1.1 GREEK CAPITAL LETTER ETA WITH VARIA +1FCB ; mapped ; 03AE # 1.1 GREEK CAPITAL LETTER ETA WITH OXIA +1FCC ; mapped ; 03B7 03B9 # 1.1 GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD ; disallowed_STD3_mapped ; 0020 0313 0300 #1.1 GREEK PSILI AND VARIA +1FCE ; disallowed_STD3_mapped ; 0020 0313 0301 #1.1 GREEK PSILI AND OXIA +1FCF ; disallowed_STD3_mapped ; 0020 0313 0342 #1.1 GREEK PSILI AND PERISPOMENI +1FD0..1FD2 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3 ; mapped ; 0390 # 1.1 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD4..1FD5 ; disallowed # NA <reserved-1FD4>..<reserved-1FD5> +1FD6..1FD7 ; valid # 1.1 GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8 ; mapped ; 1FD0 # 1.1 GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9 ; mapped ; 1FD1 # 1.1 GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA ; mapped ; 1F76 # 1.1 GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB ; mapped ; 03AF # 1.1 GREEK CAPITAL LETTER IOTA WITH OXIA +1FDC ; disallowed # NA <reserved-1FDC> +1FDD ; disallowed_STD3_mapped ; 0020 0314 0300 #1.1 GREEK DASIA AND VARIA +1FDE ; disallowed_STD3_mapped ; 0020 0314 0301 #1.1 GREEK DASIA AND OXIA +1FDF ; disallowed_STD3_mapped ; 0020 0314 0342 #1.1 GREEK DASIA AND PERISPOMENI +1FE0..1FE2 ; valid # 1.1 GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3 ; mapped ; 03B0 # 1.1 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4..1FE7 ; valid # 1.1 GREEK SMALL LETTER RHO WITH PSILI..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8 ; mapped ; 1FE0 # 1.1 GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9 ; mapped ; 1FE1 # 1.1 GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA ; mapped ; 1F7A # 1.1 GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB ; mapped ; 03CD # 1.1 GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC ; mapped ; 1FE5 # 1.1 GREEK CAPITAL LETTER RHO WITH DASIA +1FED ; disallowed_STD3_mapped ; 0020 0308 0300 #1.1 GREEK DIALYTIKA AND VARIA +1FEE ; disallowed_STD3_mapped ; 0020 0308 0301 #1.1 GREEK DIALYTIKA AND OXIA +1FEF ; disallowed_STD3_mapped ; 0060 # 1.1 GREEK VARIA +1FF0..1FF1 ; disallowed # NA <reserved-1FF0>..<reserved-1FF1> +1FF2 ; mapped ; 1F7C 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3 ; mapped ; 03C9 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4 ; mapped ; 03CE 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF5 ; disallowed # NA <reserved-1FF5> +1FF6 ; valid # 1.1 GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7 ; mapped ; 1FF6 03B9 # 1.1 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8 ; mapped ; 1F78 # 1.1 GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9 ; mapped ; 03CC # 1.1 GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA ; mapped ; 1F7C # 1.1 GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB ; mapped ; 03CE # 1.1 GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC ; mapped ; 03C9 03B9 # 1.1 GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD ; disallowed_STD3_mapped ; 0020 0301 # 1.1 GREEK OXIA +1FFE ; disallowed_STD3_mapped ; 0020 0314 # 1.1 GREEK DASIA +1FFF ; disallowed # NA <reserved-1FFF> +2000..200A ; disallowed_STD3_mapped ; 0020 # 1.1 EN QUAD..HAIR SPACE +200B ; ignored # 1.1 ZERO WIDTH SPACE +200C..200D ; deviation ; # 1.1 ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +200E..200F ; disallowed # 1.1 LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +2010 ; valid ; ; NV8 # 1.1 HYPHEN +2011 ; mapped ; 2010 # 1.1 NON-BREAKING HYPHEN +2012..2016 ; valid ; ; NV8 # 1.1 FIGURE DASH..DOUBLE VERTICAL LINE +2017 ; disallowed_STD3_mapped ; 0020 0333 # 1.1 DOUBLE LOW LINE +2018..2023 ; valid ; ; NV8 # 1.1 LEFT SINGLE QUOTATION MARK..TRIANGULAR BULLET +2024..2026 ; disallowed # 1.1 ONE DOT LEADER..HORIZONTAL ELLIPSIS +2027 ; valid ; ; NV8 # 1.1 HYPHENATION POINT +2028..202E ; disallowed # 1.1 LINE SEPARATOR..RIGHT-TO-LEFT OVERRIDE +202F ; disallowed_STD3_mapped ; 0020 # 3.0 NARROW NO-BREAK SPACE +2030..2032 ; valid ; ; NV8 # 1.1 PER MILLE SIGN..PRIME +2033 ; mapped ; 2032 2032 # 1.1 DOUBLE PRIME +2034 ; mapped ; 2032 2032 2032 #1.1 TRIPLE PRIME +2035 ; valid ; ; NV8 # 1.1 REVERSED PRIME +2036 ; mapped ; 2035 2035 # 1.1 REVERSED DOUBLE PRIME +2037 ; mapped ; 2035 2035 2035 #1.1 REVERSED TRIPLE PRIME +2038..203B ; valid ; ; NV8 # 1.1 CARET..REFERENCE MARK +203C ; disallowed_STD3_mapped ; 0021 0021 # 1.1 DOUBLE EXCLAMATION MARK +203D ; valid ; ; NV8 # 1.1 INTERROBANG +203E ; disallowed_STD3_mapped ; 0020 0305 # 1.1 OVERLINE +203F..2046 ; valid ; ; NV8 # 1.1 UNDERTIE..RIGHT SQUARE BRACKET WITH QUILL +2047 ; disallowed_STD3_mapped ; 003F 003F # 3.2 DOUBLE QUESTION MARK +2048 ; disallowed_STD3_mapped ; 003F 0021 # 3.0 QUESTION EXCLAMATION MARK +2049 ; disallowed_STD3_mapped ; 0021 003F # 3.0 EXCLAMATION QUESTION MARK +204A..204D ; valid ; ; NV8 # 3.0 TIRONIAN SIGN ET..BLACK RIGHTWARDS BULLET +204E..2052 ; valid ; ; NV8 # 3.2 LOW ASTERISK..COMMERCIAL MINUS SIGN +2053..2054 ; valid ; ; NV8 # 4.0 SWUNG DASH..INVERTED UNDERTIE +2055..2056 ; valid ; ; NV8 # 4.1 FLOWER PUNCTUATION MARK..THREE DOT PUNCTUATION +2057 ; mapped ; 2032 2032 2032 2032 #3.2 QUADRUPLE PRIME +2058..205E ; valid ; ; NV8 # 4.1 FOUR DOT PUNCTUATION..VERTICAL FOUR DOTS +205F ; disallowed_STD3_mapped ; 0020 # 3.2 MEDIUM MATHEMATICAL SPACE +2060 ; ignored # 3.2 WORD JOINER +2061..2063 ; disallowed # 3.2 FUNCTION APPLICATION..INVISIBLE SEPARATOR +2064 ; ignored # 5.1 INVISIBLE PLUS +2065 ; disallowed # NA <reserved-2065> +2066..2069 ; disallowed # 6.3 LEFT-TO-RIGHT ISOLATE..POP DIRECTIONAL ISOLATE +206A..206F ; disallowed # 1.1 INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES +2070 ; mapped ; 0030 # 1.1 SUPERSCRIPT ZERO +2071 ; mapped ; 0069 # 3.2 SUPERSCRIPT LATIN SMALL LETTER I +2072..2073 ; disallowed # NA <reserved-2072>..<reserved-2073> +2074 ; mapped ; 0034 # 1.1 SUPERSCRIPT FOUR +2075 ; mapped ; 0035 # 1.1 SUPERSCRIPT FIVE +2076 ; mapped ; 0036 # 1.1 SUPERSCRIPT SIX +2077 ; mapped ; 0037 # 1.1 SUPERSCRIPT SEVEN +2078 ; mapped ; 0038 # 1.1 SUPERSCRIPT EIGHT +2079 ; mapped ; 0039 # 1.1 SUPERSCRIPT NINE +207A ; disallowed_STD3_mapped ; 002B # 1.1 SUPERSCRIPT PLUS SIGN +207B ; mapped ; 2212 # 1.1 SUPERSCRIPT MINUS +207C ; disallowed_STD3_mapped ; 003D # 1.1 SUPERSCRIPT EQUALS SIGN +207D ; disallowed_STD3_mapped ; 0028 # 1.1 SUPERSCRIPT LEFT PARENTHESIS +207E ; disallowed_STD3_mapped ; 0029 # 1.1 SUPERSCRIPT RIGHT PARENTHESIS +207F ; mapped ; 006E # 1.1 SUPERSCRIPT LATIN SMALL LETTER N +2080 ; mapped ; 0030 # 1.1 SUBSCRIPT ZERO +2081 ; mapped ; 0031 # 1.1 SUBSCRIPT ONE +2082 ; mapped ; 0032 # 1.1 SUBSCRIPT TWO +2083 ; mapped ; 0033 # 1.1 SUBSCRIPT THREE +2084 ; mapped ; 0034 # 1.1 SUBSCRIPT FOUR +2085 ; mapped ; 0035 # 1.1 SUBSCRIPT FIVE +2086 ; mapped ; 0036 # 1.1 SUBSCRIPT SIX +2087 ; mapped ; 0037 # 1.1 SUBSCRIPT SEVEN +2088 ; mapped ; 0038 # 1.1 SUBSCRIPT EIGHT +2089 ; mapped ; 0039 # 1.1 SUBSCRIPT NINE +208A ; disallowed_STD3_mapped ; 002B # 1.1 SUBSCRIPT PLUS SIGN +208B ; mapped ; 2212 # 1.1 SUBSCRIPT MINUS +208C ; disallowed_STD3_mapped ; 003D # 1.1 SUBSCRIPT EQUALS SIGN +208D ; disallowed_STD3_mapped ; 0028 # 1.1 SUBSCRIPT LEFT PARENTHESIS +208E ; disallowed_STD3_mapped ; 0029 # 1.1 SUBSCRIPT RIGHT PARENTHESIS +208F ; disallowed # NA <reserved-208F> +2090 ; mapped ; 0061 # 4.1 LATIN SUBSCRIPT SMALL LETTER A +2091 ; mapped ; 0065 # 4.1 LATIN SUBSCRIPT SMALL LETTER E +2092 ; mapped ; 006F # 4.1 LATIN SUBSCRIPT SMALL LETTER O +2093 ; mapped ; 0078 # 4.1 LATIN SUBSCRIPT SMALL LETTER X +2094 ; mapped ; 0259 # 4.1 LATIN SUBSCRIPT SMALL LETTER SCHWA +2095 ; mapped ; 0068 # 6.0 LATIN SUBSCRIPT SMALL LETTER H +2096 ; mapped ; 006B # 6.0 LATIN SUBSCRIPT SMALL LETTER K +2097 ; mapped ; 006C # 6.0 LATIN SUBSCRIPT SMALL LETTER L +2098 ; mapped ; 006D # 6.0 LATIN SUBSCRIPT SMALL LETTER M +2099 ; mapped ; 006E # 6.0 LATIN SUBSCRIPT SMALL LETTER N +209A ; mapped ; 0070 # 6.0 LATIN SUBSCRIPT SMALL LETTER P +209B ; mapped ; 0073 # 6.0 LATIN SUBSCRIPT SMALL LETTER S +209C ; mapped ; 0074 # 6.0 LATIN SUBSCRIPT SMALL LETTER T +209D..209F ; disallowed # NA <reserved-209D>..<reserved-209F> +20A0..20A7 ; valid ; ; NV8 # 1.1 EURO-CURRENCY SIGN..PESETA SIGN +20A8 ; mapped ; 0072 0073 # 1.1 RUPEE SIGN +20A9..20AA ; valid ; ; NV8 # 1.1 WON SIGN..NEW SHEQEL SIGN +20AB ; valid ; ; NV8 # 2.0 DONG SIGN +20AC ; valid ; ; NV8 # 2.1 EURO SIGN +20AD..20AF ; valid ; ; NV8 # 3.0 KIP SIGN..DRACHMA SIGN +20B0..20B1 ; valid ; ; NV8 # 3.2 GERMAN PENNY SIGN..PESO SIGN +20B2..20B5 ; valid ; ; NV8 # 4.1 GUARANI SIGN..CEDI SIGN +20B6..20B8 ; valid ; ; NV8 # 5.2 LIVRE TOURNOIS SIGN..TENGE SIGN +20B9 ; valid ; ; NV8 # 6.0 INDIAN RUPEE SIGN +20BA ; valid ; ; NV8 # 6.2 TURKISH LIRA SIGN +20BB..20BD ; valid ; ; NV8 # 7.0 NORDIC MARK SIGN..RUBLE SIGN +20BE ; valid ; ; NV8 # 8.0 LARI SIGN +20BF..20CF ; disallowed # NA <reserved-20BF>..<reserved-20CF> +20D0..20E1 ; valid ; ; NV8 # 1.1 COMBINING LEFT HARPOON ABOVE..COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E3 ; valid ; ; NV8 # 3.0 COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING KEYCAP +20E4..20EA ; valid ; ; NV8 # 3.2 COMBINING ENCLOSING UPWARD POINTING TRIANGLE..COMBINING LEFTWARDS ARROW OVERLAY +20EB ; valid ; ; NV8 # 4.1 COMBINING LONG DOUBLE SOLIDUS OVERLAY +20EC..20EF ; valid ; ; NV8 # 5.0 COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS..COMBINING RIGHT ARROW BELOW +20F0 ; valid ; ; NV8 # 5.1 COMBINING ASTERISK ABOVE +20F1..20FF ; disallowed # NA <reserved-20F1>..<reserved-20FF> +2100 ; disallowed_STD3_mapped ; 0061 002F 0063 #1.1 ACCOUNT OF +2101 ; disallowed_STD3_mapped ; 0061 002F 0073 #1.1 ADDRESSED TO THE SUBJECT +2102 ; mapped ; 0063 # 1.1 DOUBLE-STRUCK CAPITAL C +2103 ; mapped ; 00B0 0063 # 1.1 DEGREE CELSIUS +2104 ; valid ; ; NV8 # 1.1 CENTRE LINE SYMBOL +2105 ; disallowed_STD3_mapped ; 0063 002F 006F #1.1 CARE OF +2106 ; disallowed_STD3_mapped ; 0063 002F 0075 #1.1 CADA UNA +2107 ; mapped ; 025B # 1.1 EULER CONSTANT +2108 ; valid ; ; NV8 # 1.1 SCRUPLE +2109 ; mapped ; 00B0 0066 # 1.1 DEGREE FAHRENHEIT +210A ; mapped ; 0067 # 1.1 SCRIPT SMALL G +210B..210E ; mapped ; 0068 # 1.1 SCRIPT CAPITAL H..PLANCK CONSTANT +210F ; mapped ; 0127 # 1.1 PLANCK CONSTANT OVER TWO PI +2110..2111 ; mapped ; 0069 # 1.1 SCRIPT CAPITAL I..BLACK-LETTER CAPITAL I +2112..2113 ; mapped ; 006C # 1.1 SCRIPT CAPITAL L..SCRIPT SMALL L +2114 ; valid ; ; NV8 # 1.1 L B BAR SYMBOL +2115 ; mapped ; 006E # 1.1 DOUBLE-STRUCK CAPITAL N +2116 ; mapped ; 006E 006F # 1.1 NUMERO SIGN +2117..2118 ; valid ; ; NV8 # 1.1 SOUND RECORDING COPYRIGHT..SCRIPT CAPITAL P +2119 ; mapped ; 0070 # 1.1 DOUBLE-STRUCK CAPITAL P +211A ; mapped ; 0071 # 1.1 DOUBLE-STRUCK CAPITAL Q +211B..211D ; mapped ; 0072 # 1.1 SCRIPT CAPITAL R..DOUBLE-STRUCK CAPITAL R +211E..211F ; valid ; ; NV8 # 1.1 PRESCRIPTION TAKE..RESPONSE +2120 ; mapped ; 0073 006D # 1.1 SERVICE MARK +2121 ; mapped ; 0074 0065 006C #1.1 TELEPHONE SIGN +2122 ; mapped ; 0074 006D # 1.1 TRADE MARK SIGN +2123 ; valid ; ; NV8 # 1.1 VERSICLE +2124 ; mapped ; 007A # 1.1 DOUBLE-STRUCK CAPITAL Z +2125 ; valid ; ; NV8 # 1.1 OUNCE SIGN +2126 ; mapped ; 03C9 # 1.1 OHM SIGN +2127 ; valid ; ; NV8 # 1.1 INVERTED OHM SIGN +2128 ; mapped ; 007A # 1.1 BLACK-LETTER CAPITAL Z +2129 ; valid ; ; NV8 # 1.1 TURNED GREEK SMALL LETTER IOTA +212A ; mapped ; 006B # 1.1 KELVIN SIGN +212B ; mapped ; 00E5 # 1.1 ANGSTROM SIGN +212C ; mapped ; 0062 # 1.1 SCRIPT CAPITAL B +212D ; mapped ; 0063 # 1.1 BLACK-LETTER CAPITAL C +212E ; valid ; ; NV8 # 1.1 ESTIMATED SYMBOL +212F..2130 ; mapped ; 0065 # 1.1 SCRIPT SMALL E..SCRIPT CAPITAL E +2131 ; mapped ; 0066 # 1.1 SCRIPT CAPITAL F +2132 ; disallowed # 1.1 TURNED CAPITAL F +2133 ; mapped ; 006D # 1.1 SCRIPT CAPITAL M +2134 ; mapped ; 006F # 1.1 SCRIPT SMALL O +2135 ; mapped ; 05D0 # 1.1 ALEF SYMBOL +2136 ; mapped ; 05D1 # 1.1 BET SYMBOL +2137 ; mapped ; 05D2 # 1.1 GIMEL SYMBOL +2138 ; mapped ; 05D3 # 1.1 DALET SYMBOL +2139 ; mapped ; 0069 # 3.0 INFORMATION SOURCE +213A ; valid ; ; NV8 # 3.0 ROTATED CAPITAL Q +213B ; mapped ; 0066 0061 0078 #4.0 FACSIMILE SIGN +213C ; mapped ; 03C0 # 4.1 DOUBLE-STRUCK SMALL PI +213D..213E ; mapped ; 03B3 # 3.2 DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL GAMMA +213F ; mapped ; 03C0 # 3.2 DOUBLE-STRUCK CAPITAL PI +2140 ; mapped ; 2211 # 3.2 DOUBLE-STRUCK N-ARY SUMMATION +2141..2144 ; valid ; ; NV8 # 3.2 TURNED SANS-SERIF CAPITAL G..TURNED SANS-SERIF CAPITAL Y +2145..2146 ; mapped ; 0064 # 3.2 DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL D +2147 ; mapped ; 0065 # 3.2 DOUBLE-STRUCK ITALIC SMALL E +2148 ; mapped ; 0069 # 3.2 DOUBLE-STRUCK ITALIC SMALL I +2149 ; mapped ; 006A # 3.2 DOUBLE-STRUCK ITALIC SMALL J +214A..214B ; valid ; ; NV8 # 3.2 PROPERTY LINE..TURNED AMPERSAND +214C ; valid ; ; NV8 # 4.1 PER SIGN +214D ; valid ; ; NV8 # 5.0 AKTIESELSKAB +214E ; valid # 5.0 TURNED SMALL F +214F ; valid ; ; NV8 # 5.1 SYMBOL FOR SAMARITAN SOURCE +2150 ; mapped ; 0031 2044 0037 #5.2 VULGAR FRACTION ONE SEVENTH +2151 ; mapped ; 0031 2044 0039 #5.2 VULGAR FRACTION ONE NINTH +2152 ; mapped ; 0031 2044 0031 0030 #5.2 VULGAR FRACTION ONE TENTH +2153 ; mapped ; 0031 2044 0033 #1.1 VULGAR FRACTION ONE THIRD +2154 ; mapped ; 0032 2044 0033 #1.1 VULGAR FRACTION TWO THIRDS +2155 ; mapped ; 0031 2044 0035 #1.1 VULGAR FRACTION ONE FIFTH +2156 ; mapped ; 0032 2044 0035 #1.1 VULGAR FRACTION TWO FIFTHS +2157 ; mapped ; 0033 2044 0035 #1.1 VULGAR FRACTION THREE FIFTHS +2158 ; mapped ; 0034 2044 0035 #1.1 VULGAR FRACTION FOUR FIFTHS +2159 ; mapped ; 0031 2044 0036 #1.1 VULGAR FRACTION ONE SIXTH +215A ; mapped ; 0035 2044 0036 #1.1 VULGAR FRACTION FIVE SIXTHS +215B ; mapped ; 0031 2044 0038 #1.1 VULGAR FRACTION ONE EIGHTH +215C ; mapped ; 0033 2044 0038 #1.1 VULGAR FRACTION THREE EIGHTHS +215D ; mapped ; 0035 2044 0038 #1.1 VULGAR FRACTION FIVE EIGHTHS +215E ; mapped ; 0037 2044 0038 #1.1 VULGAR FRACTION SEVEN EIGHTHS +215F ; mapped ; 0031 2044 # 1.1 FRACTION NUMERATOR ONE +2160 ; mapped ; 0069 # 1.1 ROMAN NUMERAL ONE +2161 ; mapped ; 0069 0069 # 1.1 ROMAN NUMERAL TWO +2162 ; mapped ; 0069 0069 0069 #1.1 ROMAN NUMERAL THREE +2163 ; mapped ; 0069 0076 # 1.1 ROMAN NUMERAL FOUR +2164 ; mapped ; 0076 # 1.1 ROMAN NUMERAL FIVE +2165 ; mapped ; 0076 0069 # 1.1 ROMAN NUMERAL SIX +2166 ; mapped ; 0076 0069 0069 #1.1 ROMAN NUMERAL SEVEN +2167 ; mapped ; 0076 0069 0069 0069 #1.1 ROMAN NUMERAL EIGHT +2168 ; mapped ; 0069 0078 # 1.1 ROMAN NUMERAL NINE +2169 ; mapped ; 0078 # 1.1 ROMAN NUMERAL TEN +216A ; mapped ; 0078 0069 # 1.1 ROMAN NUMERAL ELEVEN +216B ; mapped ; 0078 0069 0069 #1.1 ROMAN NUMERAL TWELVE +216C ; mapped ; 006C # 1.1 ROMAN NUMERAL FIFTY +216D ; mapped ; 0063 # 1.1 ROMAN NUMERAL ONE HUNDRED +216E ; mapped ; 0064 # 1.1 ROMAN NUMERAL FIVE HUNDRED +216F ; mapped ; 006D # 1.1 ROMAN NUMERAL ONE THOUSAND +2170 ; mapped ; 0069 # 1.1 SMALL ROMAN NUMERAL ONE +2171 ; mapped ; 0069 0069 # 1.1 SMALL ROMAN NUMERAL TWO +2172 ; mapped ; 0069 0069 0069 #1.1 SMALL ROMAN NUMERAL THREE +2173 ; mapped ; 0069 0076 # 1.1 SMALL ROMAN NUMERAL FOUR +2174 ; mapped ; 0076 # 1.1 SMALL ROMAN NUMERAL FIVE +2175 ; mapped ; 0076 0069 # 1.1 SMALL ROMAN NUMERAL SIX +2176 ; mapped ; 0076 0069 0069 #1.1 SMALL ROMAN NUMERAL SEVEN +2177 ; mapped ; 0076 0069 0069 0069 #1.1 SMALL ROMAN NUMERAL EIGHT +2178 ; mapped ; 0069 0078 # 1.1 SMALL ROMAN NUMERAL NINE +2179 ; mapped ; 0078 # 1.1 SMALL ROMAN NUMERAL TEN +217A ; mapped ; 0078 0069 # 1.1 SMALL ROMAN NUMERAL ELEVEN +217B ; mapped ; 0078 0069 0069 #1.1 SMALL ROMAN NUMERAL TWELVE +217C ; mapped ; 006C # 1.1 SMALL ROMAN NUMERAL FIFTY +217D ; mapped ; 0063 # 1.1 SMALL ROMAN NUMERAL ONE HUNDRED +217E ; mapped ; 0064 # 1.1 SMALL ROMAN NUMERAL FIVE HUNDRED +217F ; mapped ; 006D # 1.1 SMALL ROMAN NUMERAL ONE THOUSAND +2180..2182 ; valid ; ; NV8 # 1.1 ROMAN NUMERAL ONE THOUSAND C D..ROMAN NUMERAL TEN THOUSAND +2183 ; disallowed # 3.0 ROMAN NUMERAL REVERSED ONE HUNDRED +2184 ; valid # 5.0 LATIN SMALL LETTER REVERSED C +2185..2188 ; valid ; ; NV8 # 5.1 ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2189 ; mapped ; 0030 2044 0033 #5.2 VULGAR FRACTION ZERO THIRDS +218A..218B ; valid ; ; NV8 # 8.0 TURNED DIGIT TWO..TURNED DIGIT THREE +218C..218F ; disallowed # NA <reserved-218C>..<reserved-218F> +2190..21EA ; valid ; ; NV8 # 1.1 LEFTWARDS ARROW..UPWARDS WHITE ARROW FROM BAR +21EB..21F3 ; valid ; ; NV8 # 3.0 UPWARDS WHITE ARROW ON PEDESTAL..UP DOWN WHITE ARROW +21F4..21FF ; valid ; ; NV8 # 3.2 RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW +2200..222B ; valid ; ; NV8 # 1.1 FOR ALL..INTEGRAL +222C ; mapped ; 222B 222B # 1.1 DOUBLE INTEGRAL +222D ; mapped ; 222B 222B 222B #1.1 TRIPLE INTEGRAL +222E ; valid ; ; NV8 # 1.1 CONTOUR INTEGRAL +222F ; mapped ; 222E 222E # 1.1 SURFACE INTEGRAL +2230 ; mapped ; 222E 222E 222E #1.1 VOLUME INTEGRAL +2231..225F ; valid ; ; NV8 # 1.1 CLOCKWISE INTEGRAL..QUESTIONED EQUAL TO +2260 ; disallowed_STD3_valid # 1.1 NOT EQUAL TO +2261..226D ; valid ; ; NV8 # 1.1 IDENTICAL TO..NOT EQUIVALENT TO +226E..226F ; disallowed_STD3_valid # 1.1 NOT LESS-THAN..NOT GREATER-THAN +2270..22F1 ; valid ; ; NV8 # 1.1 NEITHER LESS-THAN NOR EQUAL TO..DOWN RIGHT DIAGONAL ELLIPSIS +22F2..22FF ; valid ; ; NV8 # 3.2 ELEMENT OF WITH LONG HORIZONTAL STROKE..Z NOTATION BAG MEMBERSHIP +2300 ; valid ; ; NV8 # 1.1 DIAMETER SIGN +2301 ; valid ; ; NV8 # 3.0 ELECTRIC ARROW +2302..2328 ; valid ; ; NV8 # 1.1 HOUSE..KEYBOARD +2329 ; mapped ; 3008 # 1.1 LEFT-POINTING ANGLE BRACKET +232A ; mapped ; 3009 # 1.1 RIGHT-POINTING ANGLE BRACKET +232B..237A ; valid ; ; NV8 # 1.1 ERASE TO THE LEFT..APL FUNCTIONAL SYMBOL ALPHA +237B ; valid ; ; NV8 # 3.0 NOT CHECK MARK +237C ; valid ; ; NV8 # 3.2 RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; valid ; ; NV8 # 3.0 SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23CE ; valid ; ; NV8 # 3.2 LEFT PARENTHESIS UPPER HOOK..RETURN SYMBOL +23CF..23D0 ; valid ; ; NV8 # 4.0 EJECT SYMBOL..VERTICAL LINE EXTENSION +23D1..23DB ; valid ; ; NV8 # 4.1 METRICAL BREVE..FUSE +23DC..23E7 ; valid ; ; NV8 # 5.0 TOP PARENTHESIS..ELECTRICAL INTERSECTION +23E8 ; valid ; ; NV8 # 5.2 DECIMAL EXPONENT SYMBOL +23E9..23F3 ; valid ; ; NV8 # 6.0 BLACK RIGHT-POINTING DOUBLE TRIANGLE..HOURGLASS WITH FLOWING SAND +23F4..23FA ; valid ; ; NV8 # 7.0 BLACK MEDIUM LEFT-POINTING TRIANGLE..BLACK CIRCLE FOR RECORD +23FB..23FE ; valid ; ; NV8 # 9.0 POWER SYMBOL..POWER SLEEP SYMBOL +23FF ; disallowed # NA <reserved-23FF> +2400..2424 ; valid ; ; NV8 # 1.1 SYMBOL FOR NULL..SYMBOL FOR NEWLINE +2425..2426 ; valid ; ; NV8 # 3.0 SYMBOL FOR DELETE FORM TWO..SYMBOL FOR SUBSTITUTE FORM TWO +2427..243F ; disallowed # NA <reserved-2427>..<reserved-243F> +2440..244A ; valid ; ; NV8 # 1.1 OCR HOOK..OCR DOUBLE BACKSLASH +244B..245F ; disallowed # NA <reserved-244B>..<reserved-245F> +2460 ; mapped ; 0031 # 1.1 CIRCLED DIGIT ONE +2461 ; mapped ; 0032 # 1.1 CIRCLED DIGIT TWO +2462 ; mapped ; 0033 # 1.1 CIRCLED DIGIT THREE +2463 ; mapped ; 0034 # 1.1 CIRCLED DIGIT FOUR +2464 ; mapped ; 0035 # 1.1 CIRCLED DIGIT FIVE +2465 ; mapped ; 0036 # 1.1 CIRCLED DIGIT SIX +2466 ; mapped ; 0037 # 1.1 CIRCLED DIGIT SEVEN +2467 ; mapped ; 0038 # 1.1 CIRCLED DIGIT EIGHT +2468 ; mapped ; 0039 # 1.1 CIRCLED DIGIT NINE +2469 ; mapped ; 0031 0030 # 1.1 CIRCLED NUMBER TEN +246A ; mapped ; 0031 0031 # 1.1 CIRCLED NUMBER ELEVEN +246B ; mapped ; 0031 0032 # 1.1 CIRCLED NUMBER TWELVE +246C ; mapped ; 0031 0033 # 1.1 CIRCLED NUMBER THIRTEEN +246D ; mapped ; 0031 0034 # 1.1 CIRCLED NUMBER FOURTEEN +246E ; mapped ; 0031 0035 # 1.1 CIRCLED NUMBER FIFTEEN +246F ; mapped ; 0031 0036 # 1.1 CIRCLED NUMBER SIXTEEN +2470 ; mapped ; 0031 0037 # 1.1 CIRCLED NUMBER SEVENTEEN +2471 ; mapped ; 0031 0038 # 1.1 CIRCLED NUMBER EIGHTEEN +2472 ; mapped ; 0031 0039 # 1.1 CIRCLED NUMBER NINETEEN +2473 ; mapped ; 0032 0030 # 1.1 CIRCLED NUMBER TWENTY +2474 ; disallowed_STD3_mapped ; 0028 0031 0029 #1.1 PARENTHESIZED DIGIT ONE +2475 ; disallowed_STD3_mapped ; 0028 0032 0029 #1.1 PARENTHESIZED DIGIT TWO +2476 ; disallowed_STD3_mapped ; 0028 0033 0029 #1.1 PARENTHESIZED DIGIT THREE +2477 ; disallowed_STD3_mapped ; 0028 0034 0029 #1.1 PARENTHESIZED DIGIT FOUR +2478 ; disallowed_STD3_mapped ; 0028 0035 0029 #1.1 PARENTHESIZED DIGIT FIVE +2479 ; disallowed_STD3_mapped ; 0028 0036 0029 #1.1 PARENTHESIZED DIGIT SIX +247A ; disallowed_STD3_mapped ; 0028 0037 0029 #1.1 PARENTHESIZED DIGIT SEVEN +247B ; disallowed_STD3_mapped ; 0028 0038 0029 #1.1 PARENTHESIZED DIGIT EIGHT +247C ; disallowed_STD3_mapped ; 0028 0039 0029 #1.1 PARENTHESIZED DIGIT NINE +247D ; disallowed_STD3_mapped ; 0028 0031 0030 0029 #1.1 PARENTHESIZED NUMBER TEN +247E ; disallowed_STD3_mapped ; 0028 0031 0031 0029 #1.1 PARENTHESIZED NUMBER ELEVEN +247F ; disallowed_STD3_mapped ; 0028 0031 0032 0029 #1.1 PARENTHESIZED NUMBER TWELVE +2480 ; disallowed_STD3_mapped ; 0028 0031 0033 0029 #1.1 PARENTHESIZED NUMBER THIRTEEN +2481 ; disallowed_STD3_mapped ; 0028 0031 0034 0029 #1.1 PARENTHESIZED NUMBER FOURTEEN +2482 ; disallowed_STD3_mapped ; 0028 0031 0035 0029 #1.1 PARENTHESIZED NUMBER FIFTEEN +2483 ; disallowed_STD3_mapped ; 0028 0031 0036 0029 #1.1 PARENTHESIZED NUMBER SIXTEEN +2484 ; disallowed_STD3_mapped ; 0028 0031 0037 0029 #1.1 PARENTHESIZED NUMBER SEVENTEEN +2485 ; disallowed_STD3_mapped ; 0028 0031 0038 0029 #1.1 PARENTHESIZED NUMBER EIGHTEEN +2486 ; disallowed_STD3_mapped ; 0028 0031 0039 0029 #1.1 PARENTHESIZED NUMBER NINETEEN +2487 ; disallowed_STD3_mapped ; 0028 0032 0030 0029 #1.1 PARENTHESIZED NUMBER TWENTY +2488..249B ; disallowed # 1.1 DIGIT ONE FULL STOP..NUMBER TWENTY FULL STOP +249C ; disallowed_STD3_mapped ; 0028 0061 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER A +249D ; disallowed_STD3_mapped ; 0028 0062 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER B +249E ; disallowed_STD3_mapped ; 0028 0063 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER C +249F ; disallowed_STD3_mapped ; 0028 0064 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER D +24A0 ; disallowed_STD3_mapped ; 0028 0065 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER E +24A1 ; disallowed_STD3_mapped ; 0028 0066 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER F +24A2 ; disallowed_STD3_mapped ; 0028 0067 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER G +24A3 ; disallowed_STD3_mapped ; 0028 0068 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER H +24A4 ; disallowed_STD3_mapped ; 0028 0069 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER I +24A5 ; disallowed_STD3_mapped ; 0028 006A 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER J +24A6 ; disallowed_STD3_mapped ; 0028 006B 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER K +24A7 ; disallowed_STD3_mapped ; 0028 006C 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER L +24A8 ; disallowed_STD3_mapped ; 0028 006D 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER M +24A9 ; disallowed_STD3_mapped ; 0028 006E 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER N +24AA ; disallowed_STD3_mapped ; 0028 006F 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER O +24AB ; disallowed_STD3_mapped ; 0028 0070 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER P +24AC ; disallowed_STD3_mapped ; 0028 0071 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER Q +24AD ; disallowed_STD3_mapped ; 0028 0072 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER R +24AE ; disallowed_STD3_mapped ; 0028 0073 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER S +24AF ; disallowed_STD3_mapped ; 0028 0074 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER T +24B0 ; disallowed_STD3_mapped ; 0028 0075 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER U +24B1 ; disallowed_STD3_mapped ; 0028 0076 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER V +24B2 ; disallowed_STD3_mapped ; 0028 0077 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER W +24B3 ; disallowed_STD3_mapped ; 0028 0078 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER X +24B4 ; disallowed_STD3_mapped ; 0028 0079 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER Y +24B5 ; disallowed_STD3_mapped ; 0028 007A 0029 #1.1 PARENTHESIZED LATIN SMALL LETTER Z +24B6 ; mapped ; 0061 # 1.1 CIRCLED LATIN CAPITAL LETTER A +24B7 ; mapped ; 0062 # 1.1 CIRCLED LATIN CAPITAL LETTER B +24B8 ; mapped ; 0063 # 1.1 CIRCLED LATIN CAPITAL LETTER C +24B9 ; mapped ; 0064 # 1.1 CIRCLED LATIN CAPITAL LETTER D +24BA ; mapped ; 0065 # 1.1 CIRCLED LATIN CAPITAL LETTER E +24BB ; mapped ; 0066 # 1.1 CIRCLED LATIN CAPITAL LETTER F +24BC ; mapped ; 0067 # 1.1 CIRCLED LATIN CAPITAL LETTER G +24BD ; mapped ; 0068 # 1.1 CIRCLED LATIN CAPITAL LETTER H +24BE ; mapped ; 0069 # 1.1 CIRCLED LATIN CAPITAL LETTER I +24BF ; mapped ; 006A # 1.1 CIRCLED LATIN CAPITAL LETTER J +24C0 ; mapped ; 006B # 1.1 CIRCLED LATIN CAPITAL LETTER K +24C1 ; mapped ; 006C # 1.1 CIRCLED LATIN CAPITAL LETTER L +24C2 ; mapped ; 006D # 1.1 CIRCLED LATIN CAPITAL LETTER M +24C3 ; mapped ; 006E # 1.1 CIRCLED LATIN CAPITAL LETTER N +24C4 ; mapped ; 006F # 1.1 CIRCLED LATIN CAPITAL LETTER O +24C5 ; mapped ; 0070 # 1.1 CIRCLED LATIN CAPITAL LETTER P +24C6 ; mapped ; 0071 # 1.1 CIRCLED LATIN CAPITAL LETTER Q +24C7 ; mapped ; 0072 # 1.1 CIRCLED LATIN CAPITAL LETTER R +24C8 ; mapped ; 0073 # 1.1 CIRCLED LATIN CAPITAL LETTER S +24C9 ; mapped ; 0074 # 1.1 CIRCLED LATIN CAPITAL LETTER T +24CA ; mapped ; 0075 # 1.1 CIRCLED LATIN CAPITAL LETTER U +24CB ; mapped ; 0076 # 1.1 CIRCLED LATIN CAPITAL LETTER V +24CC ; mapped ; 0077 # 1.1 CIRCLED LATIN CAPITAL LETTER W +24CD ; mapped ; 0078 # 1.1 CIRCLED LATIN CAPITAL LETTER X +24CE ; mapped ; 0079 # 1.1 CIRCLED LATIN CAPITAL LETTER Y +24CF ; mapped ; 007A # 1.1 CIRCLED LATIN CAPITAL LETTER Z +24D0 ; mapped ; 0061 # 1.1 CIRCLED LATIN SMALL LETTER A +24D1 ; mapped ; 0062 # 1.1 CIRCLED LATIN SMALL LETTER B +24D2 ; mapped ; 0063 # 1.1 CIRCLED LATIN SMALL LETTER C +24D3 ; mapped ; 0064 # 1.1 CIRCLED LATIN SMALL LETTER D +24D4 ; mapped ; 0065 # 1.1 CIRCLED LATIN SMALL LETTER E +24D5 ; mapped ; 0066 # 1.1 CIRCLED LATIN SMALL LETTER F +24D6 ; mapped ; 0067 # 1.1 CIRCLED LATIN SMALL LETTER G +24D7 ; mapped ; 0068 # 1.1 CIRCLED LATIN SMALL LETTER H +24D8 ; mapped ; 0069 # 1.1 CIRCLED LATIN SMALL LETTER I +24D9 ; mapped ; 006A # 1.1 CIRCLED LATIN SMALL LETTER J +24DA ; mapped ; 006B # 1.1 CIRCLED LATIN SMALL LETTER K +24DB ; mapped ; 006C # 1.1 CIRCLED LATIN SMALL LETTER L +24DC ; mapped ; 006D # 1.1 CIRCLED LATIN SMALL LETTER M +24DD ; mapped ; 006E # 1.1 CIRCLED LATIN SMALL LETTER N +24DE ; mapped ; 006F # 1.1 CIRCLED LATIN SMALL LETTER O +24DF ; mapped ; 0070 # 1.1 CIRCLED LATIN SMALL LETTER P +24E0 ; mapped ; 0071 # 1.1 CIRCLED LATIN SMALL LETTER Q +24E1 ; mapped ; 0072 # 1.1 CIRCLED LATIN SMALL LETTER R +24E2 ; mapped ; 0073 # 1.1 CIRCLED LATIN SMALL LETTER S +24E3 ; mapped ; 0074 # 1.1 CIRCLED LATIN SMALL LETTER T +24E4 ; mapped ; 0075 # 1.1 CIRCLED LATIN SMALL LETTER U +24E5 ; mapped ; 0076 # 1.1 CIRCLED LATIN SMALL LETTER V +24E6 ; mapped ; 0077 # 1.1 CIRCLED LATIN SMALL LETTER W +24E7 ; mapped ; 0078 # 1.1 CIRCLED LATIN SMALL LETTER X +24E8 ; mapped ; 0079 # 1.1 CIRCLED LATIN SMALL LETTER Y +24E9 ; mapped ; 007A # 1.1 CIRCLED LATIN SMALL LETTER Z +24EA ; mapped ; 0030 # 1.1 CIRCLED DIGIT ZERO +24EB..24FE ; valid ; ; NV8 # 3.2 NEGATIVE CIRCLED NUMBER ELEVEN..DOUBLE CIRCLED NUMBER TEN +24FF ; valid ; ; NV8 # 4.0 NEGATIVE CIRCLED DIGIT ZERO +2500..2595 ; valid ; ; NV8 # 1.1 BOX DRAWINGS LIGHT HORIZONTAL..RIGHT ONE EIGHTH BLOCK +2596..259F ; valid ; ; NV8 # 3.2 QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0..25EF ; valid ; ; NV8 # 1.1 BLACK SQUARE..LARGE CIRCLE +25F0..25F7 ; valid ; ; NV8 # 3.0 WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; valid ; ; NV8 # 3.2 UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..2613 ; valid ; ; NV8 # 1.1 BLACK SUN WITH RAYS..SALTIRE +2614..2615 ; valid ; ; NV8 # 4.0 UMBRELLA WITH RAIN DROPS..HOT BEVERAGE +2616..2617 ; valid ; ; NV8 # 3.2 WHITE SHOGI PIECE..BLACK SHOGI PIECE +2618 ; valid ; ; NV8 # 4.1 SHAMROCK +2619 ; valid ; ; NV8 # 3.0 REVERSED ROTATED FLORAL HEART BULLET +261A..266F ; valid ; ; NV8 # 1.1 BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN +2670..2671 ; valid ; ; NV8 # 3.0 WEST SYRIAC CROSS..EAST SYRIAC CROSS +2672..267D ; valid ; ; NV8 # 3.2 UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL +267E..267F ; valid ; ; NV8 # 4.1 PERMANENT PAPER SIGN..WHEELCHAIR SYMBOL +2680..2689 ; valid ; ; NV8 # 3.2 DIE FACE-1..BLACK CIRCLE WITH TWO WHITE DOTS +268A..2691 ; valid ; ; NV8 # 4.0 MONOGRAM FOR YANG..BLACK FLAG +2692..269C ; valid ; ; NV8 # 4.1 HAMMER AND PICK..FLEUR-DE-LIS +269D ; valid ; ; NV8 # 5.1 OUTLINED WHITE STAR +269E..269F ; valid ; ; NV8 # 5.2 THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT +26A0..26A1 ; valid ; ; NV8 # 4.0 WARNING SIGN..HIGH VOLTAGE SIGN +26A2..26B1 ; valid ; ; NV8 # 4.1 DOUBLED FEMALE SIGN..FUNERAL URN +26B2 ; valid ; ; NV8 # 5.0 NEUTER +26B3..26BC ; valid ; ; NV8 # 5.1 CERES..SESQUIQUADRATE +26BD..26BF ; valid ; ; NV8 # 5.2 SOCCER BALL..SQUARED KEY +26C0..26C3 ; valid ; ; NV8 # 5.1 WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING +26C4..26CD ; valid ; ; NV8 # 5.2 SNOWMAN WITHOUT SNOW..DISABLED CAR +26CE ; valid ; ; NV8 # 6.0 OPHIUCHUS +26CF..26E1 ; valid ; ; NV8 # 5.2 PICK..RESTRICTED LEFT ENTRY-2 +26E2 ; valid ; ; NV8 # 6.0 ASTRONOMICAL SYMBOL FOR URANUS +26E3 ; valid ; ; NV8 # 5.2 HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +26E4..26E7 ; valid ; ; NV8 # 6.0 PENTAGRAM..INVERTED PENTAGRAM +26E8..26FF ; valid ; ; NV8 # 5.2 BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +2700 ; valid ; ; NV8 # 7.0 BLACK SAFETY SCISSORS +2701..2704 ; valid ; ; NV8 # 1.1 UPPER BLADE SCISSORS..WHITE SCISSORS +2705 ; valid ; ; NV8 # 6.0 WHITE HEAVY CHECK MARK +2706..2709 ; valid ; ; NV8 # 1.1 TELEPHONE LOCATION SIGN..ENVELOPE +270A..270B ; valid ; ; NV8 # 6.0 RAISED FIST..RAISED HAND +270C..2727 ; valid ; ; NV8 # 1.1 VICTORY HAND..WHITE FOUR POINTED STAR +2728 ; valid ; ; NV8 # 6.0 SPARKLES +2729..274B ; valid ; ; NV8 # 1.1 STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274C ; valid ; ; NV8 # 6.0 CROSS MARK +274D ; valid ; ; NV8 # 1.1 SHADOWED WHITE CIRCLE +274E ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED CROSS MARK +274F..2752 ; valid ; ; NV8 # 1.1 LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE +2753..2755 ; valid ; ; NV8 # 6.0 BLACK QUESTION MARK ORNAMENT..WHITE EXCLAMATION MARK ORNAMENT +2756 ; valid ; ; NV8 # 1.1 BLACK DIAMOND MINUS WHITE X +2757 ; valid ; ; NV8 # 5.2 HEAVY EXCLAMATION MARK SYMBOL +2758..275E ; valid ; ; NV8 # 1.1 LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +275F..2760 ; valid ; ; NV8 # 6.0 HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT..HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +2761..2767 ; valid ; ; NV8 # 1.1 CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET +2768..2775 ; valid ; ; NV8 # 3.2 MEDIUM LEFT PARENTHESIS ORNAMENT..MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..2794 ; valid ; ; NV8 # 1.1 DINGBAT NEGATIVE CIRCLED DIGIT ONE..HEAVY WIDE-HEADED RIGHTWARDS ARROW +2795..2797 ; valid ; ; NV8 # 6.0 HEAVY PLUS SIGN..HEAVY DIVISION SIGN +2798..27AF ; valid ; ; NV8 # 1.1 HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B0 ; valid ; ; NV8 # 6.0 CURLY LOOP +27B1..27BE ; valid ; ; NV8 # 1.1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW +27BF ; valid ; ; NV8 # 6.0 DOUBLE CURLY LOOP +27C0..27C6 ; valid ; ; NV8 # 4.1 THREE DIMENSIONAL ANGLE..RIGHT S-SHAPED BAG DELIMITER +27C7..27CA ; valid ; ; NV8 # 5.0 OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE +27CB ; valid ; ; NV8 # 6.1 MATHEMATICAL RISING DIAGONAL +27CC ; valid ; ; NV8 # 5.1 LONG DIVISION +27CD ; valid ; ; NV8 # 6.1 MATHEMATICAL FALLING DIAGONAL +27CE..27CF ; valid ; ; NV8 # 6.0 SQUARED LOGICAL AND..SQUARED LOGICAL OR +27D0..27EB ; valid ; ; NV8 # 3.2 WHITE DIAMOND WITH CENTRED DOT..MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC..27EF ; valid ; ; NV8 # 5.1 MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET..MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; valid ; ; NV8 # 3.2 UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF ; valid ; ; NV8 # 3.0 BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..2A0B ; valid ; ; NV8 # 3.2 RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..SUMMATION WITH INTEGRAL +2A0C ; mapped ; 222B 222B 222B 222B #3.2 QUADRUPLE INTEGRAL OPERATOR +2A0D..2A73 ; valid ; ; NV8 # 3.2 FINITE PART INTEGRAL..EQUALS SIGN ABOVE TILDE OPERATOR +2A74 ; disallowed_STD3_mapped ; 003A 003A 003D #3.2 DOUBLE COLON EQUAL +2A75 ; disallowed_STD3_mapped ; 003D 003D # 3.2 TWO CONSECUTIVE EQUALS SIGNS +2A76 ; disallowed_STD3_mapped ; 003D 003D 003D #3.2 THREE CONSECUTIVE EQUALS SIGNS +2A77..2ADB ; valid ; ; NV8 # 3.2 EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW..TRANSVERSAL INTERSECTION +2ADC ; mapped ; 2ADD 0338 # 3.2 FORKING +2ADD..2AFF ; valid ; ; NV8 # 3.2 NONFORKING..N-ARY WHITE VERTICAL BAR +2B00..2B0D ; valid ; ; NV8 # 4.0 NORTH EAST WHITE ARROW..UP DOWN BLACK ARROW +2B0E..2B13 ; valid ; ; NV8 # 4.1 RIGHTWARDS ARROW WITH TIP DOWNWARDS..SQUARE WITH BOTTOM HALF BLACK +2B14..2B1A ; valid ; ; NV8 # 5.0 SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK..DOTTED SQUARE +2B1B..2B1F ; valid ; ; NV8 # 5.1 BLACK LARGE SQUARE..BLACK PENTAGON +2B20..2B23 ; valid ; ; NV8 # 5.0 WHITE PENTAGON..HORIZONTAL BLACK HEXAGON +2B24..2B4C ; valid ; ; NV8 # 5.1 BLACK LARGE CIRCLE..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B4F ; valid ; ; NV8 # 7.0 DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW +2B50..2B54 ; valid ; ; NV8 # 5.1 WHITE MEDIUM STAR..WHITE RIGHT-POINTING PENTAGON +2B55..2B59 ; valid ; ; NV8 # 5.2 HEAVY LARGE CIRCLE..HEAVY CIRCLED SALTIRE +2B5A..2B73 ; valid ; ; NV8 # 7.0 SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B74..2B75 ; disallowed # NA <reserved-2B74>..<reserved-2B75> +2B76..2B95 ; valid ; ; NV8 # 7.0 NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +2B96..2B97 ; disallowed # NA <reserved-2B96>..<reserved-2B97> +2B98..2BB9 ; valid ; ; NV8 # 7.0 THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX +2BBA..2BBC ; disallowed # NA <reserved-2BBA>..<reserved-2BBC> +2BBD..2BC8 ; valid ; ; NV8 # 7.0 BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED +2BC9 ; disallowed # NA <reserved-2BC9> +2BCA..2BD1 ; valid ; ; NV8 # 7.0 TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN +2BD2..2BEB ; disallowed # NA <reserved-2BD2>..<reserved-2BEB> +2BEC..2BEF ; valid ; ; NV8 # 8.0 LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BF0..2BFF ; disallowed # NA <reserved-2BF0>..<reserved-2BFF> +2C00 ; mapped ; 2C30 # 4.1 GLAGOLITIC CAPITAL LETTER AZU +2C01 ; mapped ; 2C31 # 4.1 GLAGOLITIC CAPITAL LETTER BUKY +2C02 ; mapped ; 2C32 # 4.1 GLAGOLITIC CAPITAL LETTER VEDE +2C03 ; mapped ; 2C33 # 4.1 GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04 ; mapped ; 2C34 # 4.1 GLAGOLITIC CAPITAL LETTER DOBRO +2C05 ; mapped ; 2C35 # 4.1 GLAGOLITIC CAPITAL LETTER YESTU +2C06 ; mapped ; 2C36 # 4.1 GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07 ; mapped ; 2C37 # 4.1 GLAGOLITIC CAPITAL LETTER DZELO +2C08 ; mapped ; 2C38 # 4.1 GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09 ; mapped ; 2C39 # 4.1 GLAGOLITIC CAPITAL LETTER IZHE +2C0A ; mapped ; 2C3A # 4.1 GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B ; mapped ; 2C3B # 4.1 GLAGOLITIC CAPITAL LETTER I +2C0C ; mapped ; 2C3C # 4.1 GLAGOLITIC CAPITAL LETTER DJERVI +2C0D ; mapped ; 2C3D # 4.1 GLAGOLITIC CAPITAL LETTER KAKO +2C0E ; mapped ; 2C3E # 4.1 GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F ; mapped ; 2C3F # 4.1 GLAGOLITIC CAPITAL LETTER MYSLITE +2C10 ; mapped ; 2C40 # 4.1 GLAGOLITIC CAPITAL LETTER NASHI +2C11 ; mapped ; 2C41 # 4.1 GLAGOLITIC CAPITAL LETTER ONU +2C12 ; mapped ; 2C42 # 4.1 GLAGOLITIC CAPITAL LETTER POKOJI +2C13 ; mapped ; 2C43 # 4.1 GLAGOLITIC CAPITAL LETTER RITSI +2C14 ; mapped ; 2C44 # 4.1 GLAGOLITIC CAPITAL LETTER SLOVO +2C15 ; mapped ; 2C45 # 4.1 GLAGOLITIC CAPITAL LETTER TVRIDO +2C16 ; mapped ; 2C46 # 4.1 GLAGOLITIC CAPITAL LETTER UKU +2C17 ; mapped ; 2C47 # 4.1 GLAGOLITIC CAPITAL LETTER FRITU +2C18 ; mapped ; 2C48 # 4.1 GLAGOLITIC CAPITAL LETTER HERU +2C19 ; mapped ; 2C49 # 4.1 GLAGOLITIC CAPITAL LETTER OTU +2C1A ; mapped ; 2C4A # 4.1 GLAGOLITIC CAPITAL LETTER PE +2C1B ; mapped ; 2C4B # 4.1 GLAGOLITIC CAPITAL LETTER SHTA +2C1C ; mapped ; 2C4C # 4.1 GLAGOLITIC CAPITAL LETTER TSI +2C1D ; mapped ; 2C4D # 4.1 GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E ; mapped ; 2C4E # 4.1 GLAGOLITIC CAPITAL LETTER SHA +2C1F ; mapped ; 2C4F # 4.1 GLAGOLITIC CAPITAL LETTER YERU +2C20 ; mapped ; 2C50 # 4.1 GLAGOLITIC CAPITAL LETTER YERI +2C21 ; mapped ; 2C51 # 4.1 GLAGOLITIC CAPITAL LETTER YATI +2C22 ; mapped ; 2C52 # 4.1 GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23 ; mapped ; 2C53 # 4.1 GLAGOLITIC CAPITAL LETTER YU +2C24 ; mapped ; 2C54 # 4.1 GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25 ; mapped ; 2C55 # 4.1 GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26 ; mapped ; 2C56 # 4.1 GLAGOLITIC CAPITAL LETTER YO +2C27 ; mapped ; 2C57 # 4.1 GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28 ; mapped ; 2C58 # 4.1 GLAGOLITIC CAPITAL LETTER BIG YUS +2C29 ; mapped ; 2C59 # 4.1 GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A ; mapped ; 2C5A # 4.1 GLAGOLITIC CAPITAL LETTER FITA +2C2B ; mapped ; 2C5B # 4.1 GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C ; mapped ; 2C5C # 4.1 GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D ; mapped ; 2C5D # 4.1 GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E ; mapped ; 2C5E # 4.1 GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C2F ; disallowed # NA <reserved-2C2F> +2C30..2C5E ; valid # 4.1 GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C5F ; disallowed # NA <reserved-2C5F> +2C60 ; mapped ; 2C61 # 5.0 LATIN CAPITAL LETTER L WITH DOUBLE BAR +2C61 ; valid # 5.0 LATIN SMALL LETTER L WITH DOUBLE BAR +2C62 ; mapped ; 026B # 5.0 LATIN CAPITAL LETTER L WITH MIDDLE TILDE +2C63 ; mapped ; 1D7D # 5.0 LATIN CAPITAL LETTER P WITH STROKE +2C64 ; mapped ; 027D # 5.0 LATIN CAPITAL LETTER R WITH TAIL +2C65..2C66 ; valid # 5.0 LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE +2C67 ; mapped ; 2C68 # 5.0 LATIN CAPITAL LETTER H WITH DESCENDER +2C68 ; valid # 5.0 LATIN SMALL LETTER H WITH DESCENDER +2C69 ; mapped ; 2C6A # 5.0 LATIN CAPITAL LETTER K WITH DESCENDER +2C6A ; valid # 5.0 LATIN SMALL LETTER K WITH DESCENDER +2C6B ; mapped ; 2C6C # 5.0 LATIN CAPITAL LETTER Z WITH DESCENDER +2C6C ; valid # 5.0 LATIN SMALL LETTER Z WITH DESCENDER +2C6D ; mapped ; 0251 # 5.1 LATIN CAPITAL LETTER ALPHA +2C6E ; mapped ; 0271 # 5.1 LATIN CAPITAL LETTER M WITH HOOK +2C6F ; mapped ; 0250 # 5.1 LATIN CAPITAL LETTER TURNED A +2C70 ; mapped ; 0252 # 5.2 LATIN CAPITAL LETTER TURNED ALPHA +2C71 ; valid # 5.1 LATIN SMALL LETTER V WITH RIGHT HOOK +2C72 ; mapped ; 2C73 # 5.1 LATIN CAPITAL LETTER W WITH HOOK +2C73 ; valid # 5.1 LATIN SMALL LETTER W WITH HOOK +2C74 ; valid # 5.0 LATIN SMALL LETTER V WITH CURL +2C75 ; mapped ; 2C76 # 5.0 LATIN CAPITAL LETTER HALF H +2C76..2C77 ; valid # 5.0 LATIN SMALL LETTER HALF H..LATIN SMALL LETTER TAILLESS PHI +2C78..2C7B ; valid # 5.1 LATIN SMALL LETTER E WITH NOTCH..LATIN LETTER SMALL CAPITAL TURNED E +2C7C ; mapped ; 006A # 5.1 LATIN SUBSCRIPT SMALL LETTER J +2C7D ; mapped ; 0076 # 5.1 MODIFIER LETTER CAPITAL V +2C7E ; mapped ; 023F # 5.2 LATIN CAPITAL LETTER S WITH SWASH TAIL +2C7F ; mapped ; 0240 # 5.2 LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80 ; mapped ; 2C81 # 4.1 COPTIC CAPITAL LETTER ALFA +2C81 ; valid # 4.1 COPTIC SMALL LETTER ALFA +2C82 ; mapped ; 2C83 # 4.1 COPTIC CAPITAL LETTER VIDA +2C83 ; valid # 4.1 COPTIC SMALL LETTER VIDA +2C84 ; mapped ; 2C85 # 4.1 COPTIC CAPITAL LETTER GAMMA +2C85 ; valid # 4.1 COPTIC SMALL LETTER GAMMA +2C86 ; mapped ; 2C87 # 4.1 COPTIC CAPITAL LETTER DALDA +2C87 ; valid # 4.1 COPTIC SMALL LETTER DALDA +2C88 ; mapped ; 2C89 # 4.1 COPTIC CAPITAL LETTER EIE +2C89 ; valid # 4.1 COPTIC SMALL LETTER EIE +2C8A ; mapped ; 2C8B # 4.1 COPTIC CAPITAL LETTER SOU +2C8B ; valid # 4.1 COPTIC SMALL LETTER SOU +2C8C ; mapped ; 2C8D # 4.1 COPTIC CAPITAL LETTER ZATA +2C8D ; valid # 4.1 COPTIC SMALL LETTER ZATA +2C8E ; mapped ; 2C8F # 4.1 COPTIC CAPITAL LETTER HATE +2C8F ; valid # 4.1 COPTIC SMALL LETTER HATE +2C90 ; mapped ; 2C91 # 4.1 COPTIC CAPITAL LETTER THETHE +2C91 ; valid # 4.1 COPTIC SMALL LETTER THETHE +2C92 ; mapped ; 2C93 # 4.1 COPTIC CAPITAL LETTER IAUDA +2C93 ; valid # 4.1 COPTIC SMALL LETTER IAUDA +2C94 ; mapped ; 2C95 # 4.1 COPTIC CAPITAL LETTER KAPA +2C95 ; valid # 4.1 COPTIC SMALL LETTER KAPA +2C96 ; mapped ; 2C97 # 4.1 COPTIC CAPITAL LETTER LAULA +2C97 ; valid # 4.1 COPTIC SMALL LETTER LAULA +2C98 ; mapped ; 2C99 # 4.1 COPTIC CAPITAL LETTER MI +2C99 ; valid # 4.1 COPTIC SMALL LETTER MI +2C9A ; mapped ; 2C9B # 4.1 COPTIC CAPITAL LETTER NI +2C9B ; valid # 4.1 COPTIC SMALL LETTER NI +2C9C ; mapped ; 2C9D # 4.1 COPTIC CAPITAL LETTER KSI +2C9D ; valid # 4.1 COPTIC SMALL LETTER KSI +2C9E ; mapped ; 2C9F # 4.1 COPTIC CAPITAL LETTER O +2C9F ; valid # 4.1 COPTIC SMALL LETTER O +2CA0 ; mapped ; 2CA1 # 4.1 COPTIC CAPITAL LETTER PI +2CA1 ; valid # 4.1 COPTIC SMALL LETTER PI +2CA2 ; mapped ; 2CA3 # 4.1 COPTIC CAPITAL LETTER RO +2CA3 ; valid # 4.1 COPTIC SMALL LETTER RO +2CA4 ; mapped ; 2CA5 # 4.1 COPTIC CAPITAL LETTER SIMA +2CA5 ; valid # 4.1 COPTIC SMALL LETTER SIMA +2CA6 ; mapped ; 2CA7 # 4.1 COPTIC CAPITAL LETTER TAU +2CA7 ; valid # 4.1 COPTIC SMALL LETTER TAU +2CA8 ; mapped ; 2CA9 # 4.1 COPTIC CAPITAL LETTER UA +2CA9 ; valid # 4.1 COPTIC SMALL LETTER UA +2CAA ; mapped ; 2CAB # 4.1 COPTIC CAPITAL LETTER FI +2CAB ; valid # 4.1 COPTIC SMALL LETTER FI +2CAC ; mapped ; 2CAD # 4.1 COPTIC CAPITAL LETTER KHI +2CAD ; valid # 4.1 COPTIC SMALL LETTER KHI +2CAE ; mapped ; 2CAF # 4.1 COPTIC CAPITAL LETTER PSI +2CAF ; valid # 4.1 COPTIC SMALL LETTER PSI +2CB0 ; mapped ; 2CB1 # 4.1 COPTIC CAPITAL LETTER OOU +2CB1 ; valid # 4.1 COPTIC SMALL LETTER OOU +2CB2 ; mapped ; 2CB3 # 4.1 COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB3 ; valid # 4.1 COPTIC SMALL LETTER DIALECT-P ALEF +2CB4 ; mapped ; 2CB5 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB5 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC AIN +2CB6 ; mapped ; 2CB7 # 4.1 COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB7 ; valid # 4.1 COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB8 ; mapped ; 2CB9 # 4.1 COPTIC CAPITAL LETTER DIALECT-P KAPA +2CB9 ; valid # 4.1 COPTIC SMALL LETTER DIALECT-P KAPA +2CBA ; mapped ; 2CBB # 4.1 COPTIC CAPITAL LETTER DIALECT-P NI +2CBB ; valid # 4.1 COPTIC SMALL LETTER DIALECT-P NI +2CBC ; mapped ; 2CBD # 4.1 COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBD ; valid # 4.1 COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBE ; mapped ; 2CBF # 4.1 COPTIC CAPITAL LETTER OLD COPTIC OOU +2CBF ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC OOU +2CC0 ; mapped ; 2CC1 # 4.1 COPTIC CAPITAL LETTER SAMPI +2CC1 ; valid # 4.1 COPTIC SMALL LETTER SAMPI +2CC2 ; mapped ; 2CC3 # 4.1 COPTIC CAPITAL LETTER CROSSED SHEI +2CC3 ; valid # 4.1 COPTIC SMALL LETTER CROSSED SHEI +2CC4 ; mapped ; 2CC5 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC5 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC SHEI +2CC6 ; mapped ; 2CC7 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC7 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC ESH +2CC8 ; mapped ; 2CC9 # 4.1 COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CC9 ; valid # 4.1 COPTIC SMALL LETTER AKHMIMIC KHEI +2CCA ; mapped ; 2CCB # 4.1 COPTIC CAPITAL LETTER DIALECT-P HORI +2CCB ; valid # 4.1 COPTIC SMALL LETTER DIALECT-P HORI +2CCC ; mapped ; 2CCD # 4.1 COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCD ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC HORI +2CCE ; mapped ; 2CCF # 4.1 COPTIC CAPITAL LETTER OLD COPTIC HA +2CCF ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC HA +2CD0 ; mapped ; 2CD1 # 4.1 COPTIC CAPITAL LETTER L-SHAPED HA +2CD1 ; valid # 4.1 COPTIC SMALL LETTER L-SHAPED HA +2CD2 ; mapped ; 2CD3 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD3 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC HEI +2CD4 ; mapped ; 2CD5 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD5 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC HAT +2CD6 ; mapped ; 2CD7 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD7 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD8 ; mapped ; 2CD9 # 4.1 COPTIC CAPITAL LETTER OLD COPTIC DJA +2CD9 ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC DJA +2CDA ; mapped ; 2CDB # 4.1 COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDB ; valid # 4.1 COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDC ; mapped ; 2CDD # 4.1 COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDD ; valid # 4.1 COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDE ; mapped ; 2CDF # 4.1 COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CDF ; valid # 4.1 COPTIC SMALL LETTER OLD NUBIAN NGI +2CE0 ; mapped ; 2CE1 # 4.1 COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE1 ; valid # 4.1 COPTIC SMALL LETTER OLD NUBIAN NYI +2CE2 ; mapped ; 2CE3 # 4.1 COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CE3..2CE4 ; valid # 4.1 COPTIC SMALL LETTER OLD NUBIAN WAU..COPTIC SYMBOL KAI +2CE5..2CEA ; valid ; ; NV8 # 4.1 COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB ; mapped ; 2CEC # 5.2 COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CEC ; valid # 5.2 COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +2CED ; mapped ; 2CEE # 5.2 COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CEE..2CF1 ; valid # 5.2 COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA..COPTIC COMBINING SPIRITUS LENIS +2CF2 ; mapped ; 2CF3 # 6.1 COPTIC CAPITAL LETTER BOHAIRIC KHEI +2CF3 ; valid # 6.1 COPTIC SMALL LETTER BOHAIRIC KHEI +2CF4..2CF8 ; disallowed # NA <reserved-2CF4>..<reserved-2CF8> +2CF9..2CFF ; valid ; ; NV8 # 4.1 COPTIC OLD NUBIAN FULL STOP..COPTIC MORPHOLOGICAL DIVIDER +2D00..2D25 ; valid # 4.1 GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D26 ; disallowed # NA <reserved-2D26> +2D27 ; valid # 6.1 GEORGIAN SMALL LETTER YN +2D28..2D2C ; disallowed # NA <reserved-2D28>..<reserved-2D2C> +2D2D ; valid # 6.1 GEORGIAN SMALL LETTER AEN +2D2E..2D2F ; disallowed # NA <reserved-2D2E>..<reserved-2D2F> +2D30..2D65 ; valid # 4.1 TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ +2D66..2D67 ; valid # 6.1 TIFINAGH LETTER YE..TIFINAGH LETTER YO +2D68..2D6E ; disallowed # NA <reserved-2D68>..<reserved-2D6E> +2D6F ; mapped ; 2D61 # 4.1 TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70 ; valid ; ; NV8 # 6.0 TIFINAGH SEPARATOR MARK +2D71..2D7E ; disallowed # NA <reserved-2D71>..<reserved-2D7E> +2D7F ; valid # 6.0 TIFINAGH CONSONANT JOINER +2D80..2D96 ; valid # 4.1 ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2D97..2D9F ; disallowed # NA <reserved-2D97>..<reserved-2D9F> +2DA0..2DA6 ; valid # 4.1 ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA7 ; disallowed # NA <reserved-2DA7> +2DA8..2DAE ; valid # 4.1 ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DAF ; disallowed # NA <reserved-2DAF> +2DB0..2DB6 ; valid # 4.1 ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB7 ; disallowed # NA <reserved-2DB7> +2DB8..2DBE ; valid # 4.1 ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DBF ; disallowed # NA <reserved-2DBF> +2DC0..2DC6 ; valid # 4.1 ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC7 ; disallowed # NA <reserved-2DC7> +2DC8..2DCE ; valid # 4.1 ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DCF ; disallowed # NA <reserved-2DCF> +2DD0..2DD6 ; valid # 4.1 ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD7 ; disallowed # NA <reserved-2DD7> +2DD8..2DDE ; valid # 4.1 ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DDF ; disallowed # NA <reserved-2DDF> +2DE0..2DFF ; valid # 5.1 COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +2E00..2E17 ; valid ; ; NV8 # 4.1 RIGHT ANGLE SUBSTITUTION MARKER..DOUBLE OBLIQUE HYPHEN +2E18..2E1B ; valid ; ; NV8 # 5.1 INVERTED INTERROBANG..TILDE WITH RING ABOVE +2E1C..2E1D ; valid ; ; NV8 # 4.1 LEFT LOW PARAPHRASE BRACKET..RIGHT LOW PARAPHRASE BRACKET +2E1E..2E2E ; valid ; ; NV8 # 5.1 TILDE WITH DOT ABOVE..REVERSED QUESTION MARK +2E2F ; valid # 5.1 VERTICAL TILDE +2E30 ; valid ; ; NV8 # 5.1 RING POINT +2E31 ; valid ; ; NV8 # 5.2 WORD SEPARATOR MIDDLE DOT +2E32..2E3B ; valid ; ; NV8 # 6.1 TURNED COMMA..THREE-EM DASH +2E3C..2E42 ; valid ; ; NV8 # 7.0 STENOGRAPHIC FULL STOP..DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E44 ; valid ; ; NV8 # 9.0 DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK +2E45..2E7F ; disallowed # NA <reserved-2E45>..<reserved-2E7F> +2E80..2E99 ; valid ; ; NV8 # 3.0 CJK RADICAL REPEAT..CJK RADICAL RAP +2E9A ; disallowed # NA <reserved-2E9A> +2E9B..2E9E ; valid ; ; NV8 # 3.0 CJK RADICAL CHOKE..CJK RADICAL DEATH +2E9F ; mapped ; 6BCD # 3.0 CJK RADICAL MOTHER +2EA0..2EF2 ; valid ; ; NV8 # 3.0 CJK RADICAL CIVILIAN..CJK RADICAL J-SIMPLIFIED TURTLE +2EF3 ; mapped ; 9F9F # 3.0 CJK RADICAL C-SIMPLIFIED TURTLE +2EF4..2EFF ; disallowed # NA <reserved-2EF4>..<reserved-2EFF> +2F00 ; mapped ; 4E00 # 3.0 KANGXI RADICAL ONE +2F01 ; mapped ; 4E28 # 3.0 KANGXI RADICAL LINE +2F02 ; mapped ; 4E36 # 3.0 KANGXI RADICAL DOT +2F03 ; mapped ; 4E3F # 3.0 KANGXI RADICAL SLASH +2F04 ; mapped ; 4E59 # 3.0 KANGXI RADICAL SECOND +2F05 ; mapped ; 4E85 # 3.0 KANGXI RADICAL HOOK +2F06 ; mapped ; 4E8C # 3.0 KANGXI RADICAL TWO +2F07 ; mapped ; 4EA0 # 3.0 KANGXI RADICAL LID +2F08 ; mapped ; 4EBA # 3.0 KANGXI RADICAL MAN +2F09 ; mapped ; 513F # 3.0 KANGXI RADICAL LEGS +2F0A ; mapped ; 5165 # 3.0 KANGXI RADICAL ENTER +2F0B ; mapped ; 516B # 3.0 KANGXI RADICAL EIGHT +2F0C ; mapped ; 5182 # 3.0 KANGXI RADICAL DOWN BOX +2F0D ; mapped ; 5196 # 3.0 KANGXI RADICAL COVER +2F0E ; mapped ; 51AB # 3.0 KANGXI RADICAL ICE +2F0F ; mapped ; 51E0 # 3.0 KANGXI RADICAL TABLE +2F10 ; mapped ; 51F5 # 3.0 KANGXI RADICAL OPEN BOX +2F11 ; mapped ; 5200 # 3.0 KANGXI RADICAL KNIFE +2F12 ; mapped ; 529B # 3.0 KANGXI RADICAL POWER +2F13 ; mapped ; 52F9 # 3.0 KANGXI RADICAL WRAP +2F14 ; mapped ; 5315 # 3.0 KANGXI RADICAL SPOON +2F15 ; mapped ; 531A # 3.0 KANGXI RADICAL RIGHT OPEN BOX +2F16 ; mapped ; 5338 # 3.0 KANGXI RADICAL HIDING ENCLOSURE +2F17 ; mapped ; 5341 # 3.0 KANGXI RADICAL TEN +2F18 ; mapped ; 535C # 3.0 KANGXI RADICAL DIVINATION +2F19 ; mapped ; 5369 # 3.0 KANGXI RADICAL SEAL +2F1A ; mapped ; 5382 # 3.0 KANGXI RADICAL CLIFF +2F1B ; mapped ; 53B6 # 3.0 KANGXI RADICAL PRIVATE +2F1C ; mapped ; 53C8 # 3.0 KANGXI RADICAL AGAIN +2F1D ; mapped ; 53E3 # 3.0 KANGXI RADICAL MOUTH +2F1E ; mapped ; 56D7 # 3.0 KANGXI RADICAL ENCLOSURE +2F1F ; mapped ; 571F # 3.0 KANGXI RADICAL EARTH +2F20 ; mapped ; 58EB # 3.0 KANGXI RADICAL SCHOLAR +2F21 ; mapped ; 5902 # 3.0 KANGXI RADICAL GO +2F22 ; mapped ; 590A # 3.0 KANGXI RADICAL GO SLOWLY +2F23 ; mapped ; 5915 # 3.0 KANGXI RADICAL EVENING +2F24 ; mapped ; 5927 # 3.0 KANGXI RADICAL BIG +2F25 ; mapped ; 5973 # 3.0 KANGXI RADICAL WOMAN +2F26 ; mapped ; 5B50 # 3.0 KANGXI RADICAL CHILD +2F27 ; mapped ; 5B80 # 3.0 KANGXI RADICAL ROOF +2F28 ; mapped ; 5BF8 # 3.0 KANGXI RADICAL INCH +2F29 ; mapped ; 5C0F # 3.0 KANGXI RADICAL SMALL +2F2A ; mapped ; 5C22 # 3.0 KANGXI RADICAL LAME +2F2B ; mapped ; 5C38 # 3.0 KANGXI RADICAL CORPSE +2F2C ; mapped ; 5C6E # 3.0 KANGXI RADICAL SPROUT +2F2D ; mapped ; 5C71 # 3.0 KANGXI RADICAL MOUNTAIN +2F2E ; mapped ; 5DDB # 3.0 KANGXI RADICAL RIVER +2F2F ; mapped ; 5DE5 # 3.0 KANGXI RADICAL WORK +2F30 ; mapped ; 5DF1 # 3.0 KANGXI RADICAL ONESELF +2F31 ; mapped ; 5DFE # 3.0 KANGXI RADICAL TURBAN +2F32 ; mapped ; 5E72 # 3.0 KANGXI RADICAL DRY +2F33 ; mapped ; 5E7A # 3.0 KANGXI RADICAL SHORT THREAD +2F34 ; mapped ; 5E7F # 3.0 KANGXI RADICAL DOTTED CLIFF +2F35 ; mapped ; 5EF4 # 3.0 KANGXI RADICAL LONG STRIDE +2F36 ; mapped ; 5EFE # 3.0 KANGXI RADICAL TWO HANDS +2F37 ; mapped ; 5F0B # 3.0 KANGXI RADICAL SHOOT +2F38 ; mapped ; 5F13 # 3.0 KANGXI RADICAL BOW +2F39 ; mapped ; 5F50 # 3.0 KANGXI RADICAL SNOUT +2F3A ; mapped ; 5F61 # 3.0 KANGXI RADICAL BRISTLE +2F3B ; mapped ; 5F73 # 3.0 KANGXI RADICAL STEP +2F3C ; mapped ; 5FC3 # 3.0 KANGXI RADICAL HEART +2F3D ; mapped ; 6208 # 3.0 KANGXI RADICAL HALBERD +2F3E ; mapped ; 6236 # 3.0 KANGXI RADICAL DOOR +2F3F ; mapped ; 624B # 3.0 KANGXI RADICAL HAND +2F40 ; mapped ; 652F # 3.0 KANGXI RADICAL BRANCH +2F41 ; mapped ; 6534 # 3.0 KANGXI RADICAL RAP +2F42 ; mapped ; 6587 # 3.0 KANGXI RADICAL SCRIPT +2F43 ; mapped ; 6597 # 3.0 KANGXI RADICAL DIPPER +2F44 ; mapped ; 65A4 # 3.0 KANGXI RADICAL AXE +2F45 ; mapped ; 65B9 # 3.0 KANGXI RADICAL SQUARE +2F46 ; mapped ; 65E0 # 3.0 KANGXI RADICAL NOT +2F47 ; mapped ; 65E5 # 3.0 KANGXI RADICAL SUN +2F48 ; mapped ; 66F0 # 3.0 KANGXI RADICAL SAY +2F49 ; mapped ; 6708 # 3.0 KANGXI RADICAL MOON +2F4A ; mapped ; 6728 # 3.0 KANGXI RADICAL TREE +2F4B ; mapped ; 6B20 # 3.0 KANGXI RADICAL LACK +2F4C ; mapped ; 6B62 # 3.0 KANGXI RADICAL STOP +2F4D ; mapped ; 6B79 # 3.0 KANGXI RADICAL DEATH +2F4E ; mapped ; 6BB3 # 3.0 KANGXI RADICAL WEAPON +2F4F ; mapped ; 6BCB # 3.0 KANGXI RADICAL DO NOT +2F50 ; mapped ; 6BD4 # 3.0 KANGXI RADICAL COMPARE +2F51 ; mapped ; 6BDB # 3.0 KANGXI RADICAL FUR +2F52 ; mapped ; 6C0F # 3.0 KANGXI RADICAL CLAN +2F53 ; mapped ; 6C14 # 3.0 KANGXI RADICAL STEAM +2F54 ; mapped ; 6C34 # 3.0 KANGXI RADICAL WATER +2F55 ; mapped ; 706B # 3.0 KANGXI RADICAL FIRE +2F56 ; mapped ; 722A # 3.0 KANGXI RADICAL CLAW +2F57 ; mapped ; 7236 # 3.0 KANGXI RADICAL FATHER +2F58 ; mapped ; 723B # 3.0 KANGXI RADICAL DOUBLE X +2F59 ; mapped ; 723F # 3.0 KANGXI RADICAL HALF TREE TRUNK +2F5A ; mapped ; 7247 # 3.0 KANGXI RADICAL SLICE +2F5B ; mapped ; 7259 # 3.0 KANGXI RADICAL FANG +2F5C ; mapped ; 725B # 3.0 KANGXI RADICAL COW +2F5D ; mapped ; 72AC # 3.0 KANGXI RADICAL DOG +2F5E ; mapped ; 7384 # 3.0 KANGXI RADICAL PROFOUND +2F5F ; mapped ; 7389 # 3.0 KANGXI RADICAL JADE +2F60 ; mapped ; 74DC # 3.0 KANGXI RADICAL MELON +2F61 ; mapped ; 74E6 # 3.0 KANGXI RADICAL TILE +2F62 ; mapped ; 7518 # 3.0 KANGXI RADICAL SWEET +2F63 ; mapped ; 751F # 3.0 KANGXI RADICAL LIFE +2F64 ; mapped ; 7528 # 3.0 KANGXI RADICAL USE +2F65 ; mapped ; 7530 # 3.0 KANGXI RADICAL FIELD +2F66 ; mapped ; 758B # 3.0 KANGXI RADICAL BOLT OF CLOTH +2F67 ; mapped ; 7592 # 3.0 KANGXI RADICAL SICKNESS +2F68 ; mapped ; 7676 # 3.0 KANGXI RADICAL DOTTED TENT +2F69 ; mapped ; 767D # 3.0 KANGXI RADICAL WHITE +2F6A ; mapped ; 76AE # 3.0 KANGXI RADICAL SKIN +2F6B ; mapped ; 76BF # 3.0 KANGXI RADICAL DISH +2F6C ; mapped ; 76EE # 3.0 KANGXI RADICAL EYE +2F6D ; mapped ; 77DB # 3.0 KANGXI RADICAL SPEAR +2F6E ; mapped ; 77E2 # 3.0 KANGXI RADICAL ARROW +2F6F ; mapped ; 77F3 # 3.0 KANGXI RADICAL STONE +2F70 ; mapped ; 793A # 3.0 KANGXI RADICAL SPIRIT +2F71 ; mapped ; 79B8 # 3.0 KANGXI RADICAL TRACK +2F72 ; mapped ; 79BE # 3.0 KANGXI RADICAL GRAIN +2F73 ; mapped ; 7A74 # 3.0 KANGXI RADICAL CAVE +2F74 ; mapped ; 7ACB # 3.0 KANGXI RADICAL STAND +2F75 ; mapped ; 7AF9 # 3.0 KANGXI RADICAL BAMBOO +2F76 ; mapped ; 7C73 # 3.0 KANGXI RADICAL RICE +2F77 ; mapped ; 7CF8 # 3.0 KANGXI RADICAL SILK +2F78 ; mapped ; 7F36 # 3.0 KANGXI RADICAL JAR +2F79 ; mapped ; 7F51 # 3.0 KANGXI RADICAL NET +2F7A ; mapped ; 7F8A # 3.0 KANGXI RADICAL SHEEP +2F7B ; mapped ; 7FBD # 3.0 KANGXI RADICAL FEATHER +2F7C ; mapped ; 8001 # 3.0 KANGXI RADICAL OLD +2F7D ; mapped ; 800C # 3.0 KANGXI RADICAL AND +2F7E ; mapped ; 8012 # 3.0 KANGXI RADICAL PLOW +2F7F ; mapped ; 8033 # 3.0 KANGXI RADICAL EAR +2F80 ; mapped ; 807F # 3.0 KANGXI RADICAL BRUSH +2F81 ; mapped ; 8089 # 3.0 KANGXI RADICAL MEAT +2F82 ; mapped ; 81E3 # 3.0 KANGXI RADICAL MINISTER +2F83 ; mapped ; 81EA # 3.0 KANGXI RADICAL SELF +2F84 ; mapped ; 81F3 # 3.0 KANGXI RADICAL ARRIVE +2F85 ; mapped ; 81FC # 3.0 KANGXI RADICAL MORTAR +2F86 ; mapped ; 820C # 3.0 KANGXI RADICAL TONGUE +2F87 ; mapped ; 821B # 3.0 KANGXI RADICAL OPPOSE +2F88 ; mapped ; 821F # 3.0 KANGXI RADICAL BOAT +2F89 ; mapped ; 826E # 3.0 KANGXI RADICAL STOPPING +2F8A ; mapped ; 8272 # 3.0 KANGXI RADICAL COLOR +2F8B ; mapped ; 8278 # 3.0 KANGXI RADICAL GRASS +2F8C ; mapped ; 864D # 3.0 KANGXI RADICAL TIGER +2F8D ; mapped ; 866B # 3.0 KANGXI RADICAL INSECT +2F8E ; mapped ; 8840 # 3.0 KANGXI RADICAL BLOOD +2F8F ; mapped ; 884C # 3.0 KANGXI RADICAL WALK ENCLOSURE +2F90 ; mapped ; 8863 # 3.0 KANGXI RADICAL CLOTHES +2F91 ; mapped ; 897E # 3.0 KANGXI RADICAL WEST +2F92 ; mapped ; 898B # 3.0 KANGXI RADICAL SEE +2F93 ; mapped ; 89D2 # 3.0 KANGXI RADICAL HORN +2F94 ; mapped ; 8A00 # 3.0 KANGXI RADICAL SPEECH +2F95 ; mapped ; 8C37 # 3.0 KANGXI RADICAL VALLEY +2F96 ; mapped ; 8C46 # 3.0 KANGXI RADICAL BEAN +2F97 ; mapped ; 8C55 # 3.0 KANGXI RADICAL PIG +2F98 ; mapped ; 8C78 # 3.0 KANGXI RADICAL BADGER +2F99 ; mapped ; 8C9D # 3.0 KANGXI RADICAL SHELL +2F9A ; mapped ; 8D64 # 3.0 KANGXI RADICAL RED +2F9B ; mapped ; 8D70 # 3.0 KANGXI RADICAL RUN +2F9C ; mapped ; 8DB3 # 3.0 KANGXI RADICAL FOOT +2F9D ; mapped ; 8EAB # 3.0 KANGXI RADICAL BODY +2F9E ; mapped ; 8ECA # 3.0 KANGXI RADICAL CART +2F9F ; mapped ; 8F9B # 3.0 KANGXI RADICAL BITTER +2FA0 ; mapped ; 8FB0 # 3.0 KANGXI RADICAL MORNING +2FA1 ; mapped ; 8FB5 # 3.0 KANGXI RADICAL WALK +2FA2 ; mapped ; 9091 # 3.0 KANGXI RADICAL CITY +2FA3 ; mapped ; 9149 # 3.0 KANGXI RADICAL WINE +2FA4 ; mapped ; 91C6 # 3.0 KANGXI RADICAL DISTINGUISH +2FA5 ; mapped ; 91CC # 3.0 KANGXI RADICAL VILLAGE +2FA6 ; mapped ; 91D1 # 3.0 KANGXI RADICAL GOLD +2FA7 ; mapped ; 9577 # 3.0 KANGXI RADICAL LONG +2FA8 ; mapped ; 9580 # 3.0 KANGXI RADICAL GATE +2FA9 ; mapped ; 961C # 3.0 KANGXI RADICAL MOUND +2FAA ; mapped ; 96B6 # 3.0 KANGXI RADICAL SLAVE +2FAB ; mapped ; 96B9 # 3.0 KANGXI RADICAL SHORT TAILED BIRD +2FAC ; mapped ; 96E8 # 3.0 KANGXI RADICAL RAIN +2FAD ; mapped ; 9751 # 3.0 KANGXI RADICAL BLUE +2FAE ; mapped ; 975E # 3.0 KANGXI RADICAL WRONG +2FAF ; mapped ; 9762 # 3.0 KANGXI RADICAL FACE +2FB0 ; mapped ; 9769 # 3.0 KANGXI RADICAL LEATHER +2FB1 ; mapped ; 97CB # 3.0 KANGXI RADICAL TANNED LEATHER +2FB2 ; mapped ; 97ED # 3.0 KANGXI RADICAL LEEK +2FB3 ; mapped ; 97F3 # 3.0 KANGXI RADICAL SOUND +2FB4 ; mapped ; 9801 # 3.0 KANGXI RADICAL LEAF +2FB5 ; mapped ; 98A8 # 3.0 KANGXI RADICAL WIND +2FB6 ; mapped ; 98DB # 3.0 KANGXI RADICAL FLY +2FB7 ; mapped ; 98DF # 3.0 KANGXI RADICAL EAT +2FB8 ; mapped ; 9996 # 3.0 KANGXI RADICAL HEAD +2FB9 ; mapped ; 9999 # 3.0 KANGXI RADICAL FRAGRANT +2FBA ; mapped ; 99AC # 3.0 KANGXI RADICAL HORSE +2FBB ; mapped ; 9AA8 # 3.0 KANGXI RADICAL BONE +2FBC ; mapped ; 9AD8 # 3.0 KANGXI RADICAL TALL +2FBD ; mapped ; 9ADF # 3.0 KANGXI RADICAL HAIR +2FBE ; mapped ; 9B25 # 3.0 KANGXI RADICAL FIGHT +2FBF ; mapped ; 9B2F # 3.0 KANGXI RADICAL SACRIFICIAL WINE +2FC0 ; mapped ; 9B32 # 3.0 KANGXI RADICAL CAULDRON +2FC1 ; mapped ; 9B3C # 3.0 KANGXI RADICAL GHOST +2FC2 ; mapped ; 9B5A # 3.0 KANGXI RADICAL FISH +2FC3 ; mapped ; 9CE5 # 3.0 KANGXI RADICAL BIRD +2FC4 ; mapped ; 9E75 # 3.0 KANGXI RADICAL SALT +2FC5 ; mapped ; 9E7F # 3.0 KANGXI RADICAL DEER +2FC6 ; mapped ; 9EA5 # 3.0 KANGXI RADICAL WHEAT +2FC7 ; mapped ; 9EBB # 3.0 KANGXI RADICAL HEMP +2FC8 ; mapped ; 9EC3 # 3.0 KANGXI RADICAL YELLOW +2FC9 ; mapped ; 9ECD # 3.0 KANGXI RADICAL MILLET +2FCA ; mapped ; 9ED1 # 3.0 KANGXI RADICAL BLACK +2FCB ; mapped ; 9EF9 # 3.0 KANGXI RADICAL EMBROIDERY +2FCC ; mapped ; 9EFD # 3.0 KANGXI RADICAL FROG +2FCD ; mapped ; 9F0E # 3.0 KANGXI RADICAL TRIPOD +2FCE ; mapped ; 9F13 # 3.0 KANGXI RADICAL DRUM +2FCF ; mapped ; 9F20 # 3.0 KANGXI RADICAL RAT +2FD0 ; mapped ; 9F3B # 3.0 KANGXI RADICAL NOSE +2FD1 ; mapped ; 9F4A # 3.0 KANGXI RADICAL EVEN +2FD2 ; mapped ; 9F52 # 3.0 KANGXI RADICAL TOOTH +2FD3 ; mapped ; 9F8D # 3.0 KANGXI RADICAL DRAGON +2FD4 ; mapped ; 9F9C # 3.0 KANGXI RADICAL TURTLE +2FD5 ; mapped ; 9FA0 # 3.0 KANGXI RADICAL FLUTE +2FD6..2FEF ; disallowed # NA <reserved-2FD6>..<reserved-2FEF> +2FF0..2FFB ; disallowed # 3.0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +2FFC..2FFF ; disallowed # NA <reserved-2FFC>..<reserved-2FFF> +3000 ; disallowed_STD3_mapped ; 0020 # 1.1 IDEOGRAPHIC SPACE +3001 ; valid ; ; NV8 # 1.1 IDEOGRAPHIC COMMA +3002 ; mapped ; 002E # 1.1 IDEOGRAPHIC FULL STOP +3003..3004 ; valid ; ; NV8 # 1.1 DITTO MARK..JAPANESE INDUSTRIAL STANDARD SYMBOL +3005..3007 ; valid # 1.1 IDEOGRAPHIC ITERATION MARK..IDEOGRAPHIC NUMBER ZERO +3008..3029 ; valid ; ; NV8 # 1.1 LEFT ANGLE BRACKET..HANGZHOU NUMERAL NINE +302A..302D ; valid # 1.1 IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..3035 ; valid ; ; NV8 # 1.1 HANGUL SINGLE DOT TONE MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3036 ; mapped ; 3012 # 1.1 CIRCLED POSTAL MARK +3037 ; valid ; ; NV8 # 1.1 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038 ; mapped ; 5341 # 3.0 HANGZHOU NUMERAL TEN +3039 ; mapped ; 5344 # 3.0 HANGZHOU NUMERAL TWENTY +303A ; mapped ; 5345 # 3.0 HANGZHOU NUMERAL THIRTY +303B ; valid ; ; NV8 # 3.2 VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; valid # 3.2 MASU MARK +303D ; valid ; ; NV8 # 3.2 PART ALTERNATION MARK +303E ; valid ; ; NV8 # 3.0 IDEOGRAPHIC VARIATION INDICATOR +303F ; valid ; ; NV8 # 1.1 IDEOGRAPHIC HALF FILL SPACE +3040 ; disallowed # NA <reserved-3040> +3041..3094 ; valid # 1.1 HIRAGANA LETTER SMALL A..HIRAGANA LETTER VU +3095..3096 ; valid # 3.2 HIRAGANA LETTER SMALL KA..HIRAGANA LETTER SMALL KE +3097..3098 ; disallowed # NA <reserved-3097>..<reserved-3098> +3099..309A ; valid # 1.1 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B ; disallowed_STD3_mapped ; 0020 3099 # 1.1 KATAKANA-HIRAGANA VOICED SOUND MARK +309C ; disallowed_STD3_mapped ; 0020 309A # 1.1 KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; valid # 1.1 HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; mapped ; 3088 308A # 3.2 HIRAGANA DIGRAPH YORI +30A0 ; valid ; ; NV8 # 3.2 KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1..30FE ; valid # 1.1 KATAKANA LETTER SMALL A..KATAKANA VOICED ITERATION MARK +30FF ; mapped ; 30B3 30C8 # 3.2 KATAKANA DIGRAPH KOTO +3100..3104 ; disallowed # NA <reserved-3100>..<reserved-3104> +3105..312C ; valid # 1.1 BOPOMOFO LETTER B..BOPOMOFO LETTER GN +312D ; valid # 5.1 BOPOMOFO LETTER IH +312E..3130 ; disallowed # NA <reserved-312E>..<reserved-3130> +3131 ; mapped ; 1100 # 1.1 HANGUL LETTER KIYEOK +3132 ; mapped ; 1101 # 1.1 HANGUL LETTER SSANGKIYEOK +3133 ; mapped ; 11AA # 1.1 HANGUL LETTER KIYEOK-SIOS +3134 ; mapped ; 1102 # 1.1 HANGUL LETTER NIEUN +3135 ; mapped ; 11AC # 1.1 HANGUL LETTER NIEUN-CIEUC +3136 ; mapped ; 11AD # 1.1 HANGUL LETTER NIEUN-HIEUH +3137 ; mapped ; 1103 # 1.1 HANGUL LETTER TIKEUT +3138 ; mapped ; 1104 # 1.1 HANGUL LETTER SSANGTIKEUT +3139 ; mapped ; 1105 # 1.1 HANGUL LETTER RIEUL +313A ; mapped ; 11B0 # 1.1 HANGUL LETTER RIEUL-KIYEOK +313B ; mapped ; 11B1 # 1.1 HANGUL LETTER RIEUL-MIEUM +313C ; mapped ; 11B2 # 1.1 HANGUL LETTER RIEUL-PIEUP +313D ; mapped ; 11B3 # 1.1 HANGUL LETTER RIEUL-SIOS +313E ; mapped ; 11B4 # 1.1 HANGUL LETTER RIEUL-THIEUTH +313F ; mapped ; 11B5 # 1.1 HANGUL LETTER RIEUL-PHIEUPH +3140 ; mapped ; 111A # 1.1 HANGUL LETTER RIEUL-HIEUH +3141 ; mapped ; 1106 # 1.1 HANGUL LETTER MIEUM +3142 ; mapped ; 1107 # 1.1 HANGUL LETTER PIEUP +3143 ; mapped ; 1108 # 1.1 HANGUL LETTER SSANGPIEUP +3144 ; mapped ; 1121 # 1.1 HANGUL LETTER PIEUP-SIOS +3145 ; mapped ; 1109 # 1.1 HANGUL LETTER SIOS +3146 ; mapped ; 110A # 1.1 HANGUL LETTER SSANGSIOS +3147 ; mapped ; 110B # 1.1 HANGUL LETTER IEUNG +3148 ; mapped ; 110C # 1.1 HANGUL LETTER CIEUC +3149 ; mapped ; 110D # 1.1 HANGUL LETTER SSANGCIEUC +314A ; mapped ; 110E # 1.1 HANGUL LETTER CHIEUCH +314B ; mapped ; 110F # 1.1 HANGUL LETTER KHIEUKH +314C ; mapped ; 1110 # 1.1 HANGUL LETTER THIEUTH +314D ; mapped ; 1111 # 1.1 HANGUL LETTER PHIEUPH +314E ; mapped ; 1112 # 1.1 HANGUL LETTER HIEUH +314F ; mapped ; 1161 # 1.1 HANGUL LETTER A +3150 ; mapped ; 1162 # 1.1 HANGUL LETTER AE +3151 ; mapped ; 1163 # 1.1 HANGUL LETTER YA +3152 ; mapped ; 1164 # 1.1 HANGUL LETTER YAE +3153 ; mapped ; 1165 # 1.1 HANGUL LETTER EO +3154 ; mapped ; 1166 # 1.1 HANGUL LETTER E +3155 ; mapped ; 1167 # 1.1 HANGUL LETTER YEO +3156 ; mapped ; 1168 # 1.1 HANGUL LETTER YE +3157 ; mapped ; 1169 # 1.1 HANGUL LETTER O +3158 ; mapped ; 116A # 1.1 HANGUL LETTER WA +3159 ; mapped ; 116B # 1.1 HANGUL LETTER WAE +315A ; mapped ; 116C # 1.1 HANGUL LETTER OE +315B ; mapped ; 116D # 1.1 HANGUL LETTER YO +315C ; mapped ; 116E # 1.1 HANGUL LETTER U +315D ; mapped ; 116F # 1.1 HANGUL LETTER WEO +315E ; mapped ; 1170 # 1.1 HANGUL LETTER WE +315F ; mapped ; 1171 # 1.1 HANGUL LETTER WI +3160 ; mapped ; 1172 # 1.1 HANGUL LETTER YU +3161 ; mapped ; 1173 # 1.1 HANGUL LETTER EU +3162 ; mapped ; 1174 # 1.1 HANGUL LETTER YI +3163 ; mapped ; 1175 # 1.1 HANGUL LETTER I +3164 ; disallowed # 1.1 HANGUL FILLER +3165 ; mapped ; 1114 # 1.1 HANGUL LETTER SSANGNIEUN +3166 ; mapped ; 1115 # 1.1 HANGUL LETTER NIEUN-TIKEUT +3167 ; mapped ; 11C7 # 1.1 HANGUL LETTER NIEUN-SIOS +3168 ; mapped ; 11C8 # 1.1 HANGUL LETTER NIEUN-PANSIOS +3169 ; mapped ; 11CC # 1.1 HANGUL LETTER RIEUL-KIYEOK-SIOS +316A ; mapped ; 11CE # 1.1 HANGUL LETTER RIEUL-TIKEUT +316B ; mapped ; 11D3 # 1.1 HANGUL LETTER RIEUL-PIEUP-SIOS +316C ; mapped ; 11D7 # 1.1 HANGUL LETTER RIEUL-PANSIOS +316D ; mapped ; 11D9 # 1.1 HANGUL LETTER RIEUL-YEORINHIEUH +316E ; mapped ; 111C # 1.1 HANGUL LETTER MIEUM-PIEUP +316F ; mapped ; 11DD # 1.1 HANGUL LETTER MIEUM-SIOS +3170 ; mapped ; 11DF # 1.1 HANGUL LETTER MIEUM-PANSIOS +3171 ; mapped ; 111D # 1.1 HANGUL LETTER KAPYEOUNMIEUM +3172 ; mapped ; 111E # 1.1 HANGUL LETTER PIEUP-KIYEOK +3173 ; mapped ; 1120 # 1.1 HANGUL LETTER PIEUP-TIKEUT +3174 ; mapped ; 1122 # 1.1 HANGUL LETTER PIEUP-SIOS-KIYEOK +3175 ; mapped ; 1123 # 1.1 HANGUL LETTER PIEUP-SIOS-TIKEUT +3176 ; mapped ; 1127 # 1.1 HANGUL LETTER PIEUP-CIEUC +3177 ; mapped ; 1129 # 1.1 HANGUL LETTER PIEUP-THIEUTH +3178 ; mapped ; 112B # 1.1 HANGUL LETTER KAPYEOUNPIEUP +3179 ; mapped ; 112C # 1.1 HANGUL LETTER KAPYEOUNSSANGPIEUP +317A ; mapped ; 112D # 1.1 HANGUL LETTER SIOS-KIYEOK +317B ; mapped ; 112E # 1.1 HANGUL LETTER SIOS-NIEUN +317C ; mapped ; 112F # 1.1 HANGUL LETTER SIOS-TIKEUT +317D ; mapped ; 1132 # 1.1 HANGUL LETTER SIOS-PIEUP +317E ; mapped ; 1136 # 1.1 HANGUL LETTER SIOS-CIEUC +317F ; mapped ; 1140 # 1.1 HANGUL LETTER PANSIOS +3180 ; mapped ; 1147 # 1.1 HANGUL LETTER SSANGIEUNG +3181 ; mapped ; 114C # 1.1 HANGUL LETTER YESIEUNG +3182 ; mapped ; 11F1 # 1.1 HANGUL LETTER YESIEUNG-SIOS +3183 ; mapped ; 11F2 # 1.1 HANGUL LETTER YESIEUNG-PANSIOS +3184 ; mapped ; 1157 # 1.1 HANGUL LETTER KAPYEOUNPHIEUPH +3185 ; mapped ; 1158 # 1.1 HANGUL LETTER SSANGHIEUH +3186 ; mapped ; 1159 # 1.1 HANGUL LETTER YEORINHIEUH +3187 ; mapped ; 1184 # 1.1 HANGUL LETTER YO-YA +3188 ; mapped ; 1185 # 1.1 HANGUL LETTER YO-YAE +3189 ; mapped ; 1188 # 1.1 HANGUL LETTER YO-I +318A ; mapped ; 1191 # 1.1 HANGUL LETTER YU-YEO +318B ; mapped ; 1192 # 1.1 HANGUL LETTER YU-YE +318C ; mapped ; 1194 # 1.1 HANGUL LETTER YU-I +318D ; mapped ; 119E # 1.1 HANGUL LETTER ARAEA +318E ; mapped ; 11A1 # 1.1 HANGUL LETTER ARAEAE +318F ; disallowed # NA <reserved-318F> +3190..3191 ; valid ; ; NV8 # 1.1 IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192 ; mapped ; 4E00 # 1.1 IDEOGRAPHIC ANNOTATION ONE MARK +3193 ; mapped ; 4E8C # 1.1 IDEOGRAPHIC ANNOTATION TWO MARK +3194 ; mapped ; 4E09 # 1.1 IDEOGRAPHIC ANNOTATION THREE MARK +3195 ; mapped ; 56DB # 1.1 IDEOGRAPHIC ANNOTATION FOUR MARK +3196 ; mapped ; 4E0A # 1.1 IDEOGRAPHIC ANNOTATION TOP MARK +3197 ; mapped ; 4E2D # 1.1 IDEOGRAPHIC ANNOTATION MIDDLE MARK +3198 ; mapped ; 4E0B # 1.1 IDEOGRAPHIC ANNOTATION BOTTOM MARK +3199 ; mapped ; 7532 # 1.1 IDEOGRAPHIC ANNOTATION FIRST MARK +319A ; mapped ; 4E59 # 1.1 IDEOGRAPHIC ANNOTATION SECOND MARK +319B ; mapped ; 4E19 # 1.1 IDEOGRAPHIC ANNOTATION THIRD MARK +319C ; mapped ; 4E01 # 1.1 IDEOGRAPHIC ANNOTATION FOURTH MARK +319D ; mapped ; 5929 # 1.1 IDEOGRAPHIC ANNOTATION HEAVEN MARK +319E ; mapped ; 5730 # 1.1 IDEOGRAPHIC ANNOTATION EARTH MARK +319F ; mapped ; 4EBA # 1.1 IDEOGRAPHIC ANNOTATION MAN MARK +31A0..31B7 ; valid # 3.0 BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H +31B8..31BA ; valid # 6.0 BOPOMOFO LETTER GH..BOPOMOFO LETTER ZY +31BB..31BF ; disallowed # NA <reserved-31BB>..<reserved-31BF> +31C0..31CF ; valid ; ; NV8 # 4.1 CJK STROKE T..CJK STROKE N +31D0..31E3 ; valid ; ; NV8 # 5.1 CJK STROKE H..CJK STROKE Q +31E4..31EF ; disallowed # NA <reserved-31E4>..<reserved-31EF> +31F0..31FF ; valid # 3.2 KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3200 ; disallowed_STD3_mapped ; 0028 1100 0029 #1.1 PARENTHESIZED HANGUL KIYEOK +3201 ; disallowed_STD3_mapped ; 0028 1102 0029 #1.1 PARENTHESIZED HANGUL NIEUN +3202 ; disallowed_STD3_mapped ; 0028 1103 0029 #1.1 PARENTHESIZED HANGUL TIKEUT +3203 ; disallowed_STD3_mapped ; 0028 1105 0029 #1.1 PARENTHESIZED HANGUL RIEUL +3204 ; disallowed_STD3_mapped ; 0028 1106 0029 #1.1 PARENTHESIZED HANGUL MIEUM +3205 ; disallowed_STD3_mapped ; 0028 1107 0029 #1.1 PARENTHESIZED HANGUL PIEUP +3206 ; disallowed_STD3_mapped ; 0028 1109 0029 #1.1 PARENTHESIZED HANGUL SIOS +3207 ; disallowed_STD3_mapped ; 0028 110B 0029 #1.1 PARENTHESIZED HANGUL IEUNG +3208 ; disallowed_STD3_mapped ; 0028 110C 0029 #1.1 PARENTHESIZED HANGUL CIEUC +3209 ; disallowed_STD3_mapped ; 0028 110E 0029 #1.1 PARENTHESIZED HANGUL CHIEUCH +320A ; disallowed_STD3_mapped ; 0028 110F 0029 #1.1 PARENTHESIZED HANGUL KHIEUKH +320B ; disallowed_STD3_mapped ; 0028 1110 0029 #1.1 PARENTHESIZED HANGUL THIEUTH +320C ; disallowed_STD3_mapped ; 0028 1111 0029 #1.1 PARENTHESIZED HANGUL PHIEUPH +320D ; disallowed_STD3_mapped ; 0028 1112 0029 #1.1 PARENTHESIZED HANGUL HIEUH +320E ; disallowed_STD3_mapped ; 0028 AC00 0029 #1.1 PARENTHESIZED HANGUL KIYEOK A +320F ; disallowed_STD3_mapped ; 0028 B098 0029 #1.1 PARENTHESIZED HANGUL NIEUN A +3210 ; disallowed_STD3_mapped ; 0028 B2E4 0029 #1.1 PARENTHESIZED HANGUL TIKEUT A +3211 ; disallowed_STD3_mapped ; 0028 B77C 0029 #1.1 PARENTHESIZED HANGUL RIEUL A +3212 ; disallowed_STD3_mapped ; 0028 B9C8 0029 #1.1 PARENTHESIZED HANGUL MIEUM A +3213 ; disallowed_STD3_mapped ; 0028 BC14 0029 #1.1 PARENTHESIZED HANGUL PIEUP A +3214 ; disallowed_STD3_mapped ; 0028 C0AC 0029 #1.1 PARENTHESIZED HANGUL SIOS A +3215 ; disallowed_STD3_mapped ; 0028 C544 0029 #1.1 PARENTHESIZED HANGUL IEUNG A +3216 ; disallowed_STD3_mapped ; 0028 C790 0029 #1.1 PARENTHESIZED HANGUL CIEUC A +3217 ; disallowed_STD3_mapped ; 0028 CC28 0029 #1.1 PARENTHESIZED HANGUL CHIEUCH A +3218 ; disallowed_STD3_mapped ; 0028 CE74 0029 #1.1 PARENTHESIZED HANGUL KHIEUKH A +3219 ; disallowed_STD3_mapped ; 0028 D0C0 0029 #1.1 PARENTHESIZED HANGUL THIEUTH A +321A ; disallowed_STD3_mapped ; 0028 D30C 0029 #1.1 PARENTHESIZED HANGUL PHIEUPH A +321B ; disallowed_STD3_mapped ; 0028 D558 0029 #1.1 PARENTHESIZED HANGUL HIEUH A +321C ; disallowed_STD3_mapped ; 0028 C8FC 0029 #1.1 PARENTHESIZED HANGUL CIEUC U +321D ; disallowed_STD3_mapped ; 0028 C624 C804 0029 #4.0 PARENTHESIZED KOREAN CHARACTER OJEON +321E ; disallowed_STD3_mapped ; 0028 C624 D6C4 0029 #4.0 PARENTHESIZED KOREAN CHARACTER O HU +321F ; disallowed # NA <reserved-321F> +3220 ; disallowed_STD3_mapped ; 0028 4E00 0029 #1.1 PARENTHESIZED IDEOGRAPH ONE +3221 ; disallowed_STD3_mapped ; 0028 4E8C 0029 #1.1 PARENTHESIZED IDEOGRAPH TWO +3222 ; disallowed_STD3_mapped ; 0028 4E09 0029 #1.1 PARENTHESIZED IDEOGRAPH THREE +3223 ; disallowed_STD3_mapped ; 0028 56DB 0029 #1.1 PARENTHESIZED IDEOGRAPH FOUR +3224 ; disallowed_STD3_mapped ; 0028 4E94 0029 #1.1 PARENTHESIZED IDEOGRAPH FIVE +3225 ; disallowed_STD3_mapped ; 0028 516D 0029 #1.1 PARENTHESIZED IDEOGRAPH SIX +3226 ; disallowed_STD3_mapped ; 0028 4E03 0029 #1.1 PARENTHESIZED IDEOGRAPH SEVEN +3227 ; disallowed_STD3_mapped ; 0028 516B 0029 #1.1 PARENTHESIZED IDEOGRAPH EIGHT +3228 ; disallowed_STD3_mapped ; 0028 4E5D 0029 #1.1 PARENTHESIZED IDEOGRAPH NINE +3229 ; disallowed_STD3_mapped ; 0028 5341 0029 #1.1 PARENTHESIZED IDEOGRAPH TEN +322A ; disallowed_STD3_mapped ; 0028 6708 0029 #1.1 PARENTHESIZED IDEOGRAPH MOON +322B ; disallowed_STD3_mapped ; 0028 706B 0029 #1.1 PARENTHESIZED IDEOGRAPH FIRE +322C ; disallowed_STD3_mapped ; 0028 6C34 0029 #1.1 PARENTHESIZED IDEOGRAPH WATER +322D ; disallowed_STD3_mapped ; 0028 6728 0029 #1.1 PARENTHESIZED IDEOGRAPH WOOD +322E ; disallowed_STD3_mapped ; 0028 91D1 0029 #1.1 PARENTHESIZED IDEOGRAPH METAL +322F ; disallowed_STD3_mapped ; 0028 571F 0029 #1.1 PARENTHESIZED IDEOGRAPH EARTH +3230 ; disallowed_STD3_mapped ; 0028 65E5 0029 #1.1 PARENTHESIZED IDEOGRAPH SUN +3231 ; disallowed_STD3_mapped ; 0028 682A 0029 #1.1 PARENTHESIZED IDEOGRAPH STOCK +3232 ; disallowed_STD3_mapped ; 0028 6709 0029 #1.1 PARENTHESIZED IDEOGRAPH HAVE +3233 ; disallowed_STD3_mapped ; 0028 793E 0029 #1.1 PARENTHESIZED IDEOGRAPH SOCIETY +3234 ; disallowed_STD3_mapped ; 0028 540D 0029 #1.1 PARENTHESIZED IDEOGRAPH NAME +3235 ; disallowed_STD3_mapped ; 0028 7279 0029 #1.1 PARENTHESIZED IDEOGRAPH SPECIAL +3236 ; disallowed_STD3_mapped ; 0028 8CA1 0029 #1.1 PARENTHESIZED IDEOGRAPH FINANCIAL +3237 ; disallowed_STD3_mapped ; 0028 795D 0029 #1.1 PARENTHESIZED IDEOGRAPH CONGRATULATION +3238 ; disallowed_STD3_mapped ; 0028 52B4 0029 #1.1 PARENTHESIZED IDEOGRAPH LABOR +3239 ; disallowed_STD3_mapped ; 0028 4EE3 0029 #1.1 PARENTHESIZED IDEOGRAPH REPRESENT +323A ; disallowed_STD3_mapped ; 0028 547C 0029 #1.1 PARENTHESIZED IDEOGRAPH CALL +323B ; disallowed_STD3_mapped ; 0028 5B66 0029 #1.1 PARENTHESIZED IDEOGRAPH STUDY +323C ; disallowed_STD3_mapped ; 0028 76E3 0029 #1.1 PARENTHESIZED IDEOGRAPH SUPERVISE +323D ; disallowed_STD3_mapped ; 0028 4F01 0029 #1.1 PARENTHESIZED IDEOGRAPH ENTERPRISE +323E ; disallowed_STD3_mapped ; 0028 8CC7 0029 #1.1 PARENTHESIZED IDEOGRAPH RESOURCE +323F ; disallowed_STD3_mapped ; 0028 5354 0029 #1.1 PARENTHESIZED IDEOGRAPH ALLIANCE +3240 ; disallowed_STD3_mapped ; 0028 796D 0029 #1.1 PARENTHESIZED IDEOGRAPH FESTIVAL +3241 ; disallowed_STD3_mapped ; 0028 4F11 0029 #1.1 PARENTHESIZED IDEOGRAPH REST +3242 ; disallowed_STD3_mapped ; 0028 81EA 0029 #1.1 PARENTHESIZED IDEOGRAPH SELF +3243 ; disallowed_STD3_mapped ; 0028 81F3 0029 #1.1 PARENTHESIZED IDEOGRAPH REACH +3244 ; mapped ; 554F # 5.2 CIRCLED IDEOGRAPH QUESTION +3245 ; mapped ; 5E7C # 5.2 CIRCLED IDEOGRAPH KINDERGARTEN +3246 ; mapped ; 6587 # 5.2 CIRCLED IDEOGRAPH SCHOOL +3247 ; mapped ; 7B8F # 5.2 CIRCLED IDEOGRAPH KOTO +3248..324F ; valid ; ; NV8 # 5.2 CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +3250 ; mapped ; 0070 0074 0065 #4.0 PARTNERSHIP SIGN +3251 ; mapped ; 0032 0031 # 3.2 CIRCLED NUMBER TWENTY ONE +3252 ; mapped ; 0032 0032 # 3.2 CIRCLED NUMBER TWENTY TWO +3253 ; mapped ; 0032 0033 # 3.2 CIRCLED NUMBER TWENTY THREE +3254 ; mapped ; 0032 0034 # 3.2 CIRCLED NUMBER TWENTY FOUR +3255 ; mapped ; 0032 0035 # 3.2 CIRCLED NUMBER TWENTY FIVE +3256 ; mapped ; 0032 0036 # 3.2 CIRCLED NUMBER TWENTY SIX +3257 ; mapped ; 0032 0037 # 3.2 CIRCLED NUMBER TWENTY SEVEN +3258 ; mapped ; 0032 0038 # 3.2 CIRCLED NUMBER TWENTY EIGHT +3259 ; mapped ; 0032 0039 # 3.2 CIRCLED NUMBER TWENTY NINE +325A ; mapped ; 0033 0030 # 3.2 CIRCLED NUMBER THIRTY +325B ; mapped ; 0033 0031 # 3.2 CIRCLED NUMBER THIRTY ONE +325C ; mapped ; 0033 0032 # 3.2 CIRCLED NUMBER THIRTY TWO +325D ; mapped ; 0033 0033 # 3.2 CIRCLED NUMBER THIRTY THREE +325E ; mapped ; 0033 0034 # 3.2 CIRCLED NUMBER THIRTY FOUR +325F ; mapped ; 0033 0035 # 3.2 CIRCLED NUMBER THIRTY FIVE +3260 ; mapped ; 1100 # 1.1 CIRCLED HANGUL KIYEOK +3261 ; mapped ; 1102 # 1.1 CIRCLED HANGUL NIEUN +3262 ; mapped ; 1103 # 1.1 CIRCLED HANGUL TIKEUT +3263 ; mapped ; 1105 # 1.1 CIRCLED HANGUL RIEUL +3264 ; mapped ; 1106 # 1.1 CIRCLED HANGUL MIEUM +3265 ; mapped ; 1107 # 1.1 CIRCLED HANGUL PIEUP +3266 ; mapped ; 1109 # 1.1 CIRCLED HANGUL SIOS +3267 ; mapped ; 110B # 1.1 CIRCLED HANGUL IEUNG +3268 ; mapped ; 110C # 1.1 CIRCLED HANGUL CIEUC +3269 ; mapped ; 110E # 1.1 CIRCLED HANGUL CHIEUCH +326A ; mapped ; 110F # 1.1 CIRCLED HANGUL KHIEUKH +326B ; mapped ; 1110 # 1.1 CIRCLED HANGUL THIEUTH +326C ; mapped ; 1111 # 1.1 CIRCLED HANGUL PHIEUPH +326D ; mapped ; 1112 # 1.1 CIRCLED HANGUL HIEUH +326E ; mapped ; AC00 # 1.1 CIRCLED HANGUL KIYEOK A +326F ; mapped ; B098 # 1.1 CIRCLED HANGUL NIEUN A +3270 ; mapped ; B2E4 # 1.1 CIRCLED HANGUL TIKEUT A +3271 ; mapped ; B77C # 1.1 CIRCLED HANGUL RIEUL A +3272 ; mapped ; B9C8 # 1.1 CIRCLED HANGUL MIEUM A +3273 ; mapped ; BC14 # 1.1 CIRCLED HANGUL PIEUP A +3274 ; mapped ; C0AC # 1.1 CIRCLED HANGUL SIOS A +3275 ; mapped ; C544 # 1.1 CIRCLED HANGUL IEUNG A +3276 ; mapped ; C790 # 1.1 CIRCLED HANGUL CIEUC A +3277 ; mapped ; CC28 # 1.1 CIRCLED HANGUL CHIEUCH A +3278 ; mapped ; CE74 # 1.1 CIRCLED HANGUL KHIEUKH A +3279 ; mapped ; D0C0 # 1.1 CIRCLED HANGUL THIEUTH A +327A ; mapped ; D30C # 1.1 CIRCLED HANGUL PHIEUPH A +327B ; mapped ; D558 # 1.1 CIRCLED HANGUL HIEUH A +327C ; mapped ; CC38 ACE0 # 4.0 CIRCLED KOREAN CHARACTER CHAMKO +327D ; mapped ; C8FC C758 # 4.0 CIRCLED KOREAN CHARACTER JUEUI +327E ; mapped ; C6B0 # 4.1 CIRCLED HANGUL IEUNG U +327F ; valid ; ; NV8 # 1.1 KOREAN STANDARD SYMBOL +3280 ; mapped ; 4E00 # 1.1 CIRCLED IDEOGRAPH ONE +3281 ; mapped ; 4E8C # 1.1 CIRCLED IDEOGRAPH TWO +3282 ; mapped ; 4E09 # 1.1 CIRCLED IDEOGRAPH THREE +3283 ; mapped ; 56DB # 1.1 CIRCLED IDEOGRAPH FOUR +3284 ; mapped ; 4E94 # 1.1 CIRCLED IDEOGRAPH FIVE +3285 ; mapped ; 516D # 1.1 CIRCLED IDEOGRAPH SIX +3286 ; mapped ; 4E03 # 1.1 CIRCLED IDEOGRAPH SEVEN +3287 ; mapped ; 516B # 1.1 CIRCLED IDEOGRAPH EIGHT +3288 ; mapped ; 4E5D # 1.1 CIRCLED IDEOGRAPH NINE +3289 ; mapped ; 5341 # 1.1 CIRCLED IDEOGRAPH TEN +328A ; mapped ; 6708 # 1.1 CIRCLED IDEOGRAPH MOON +328B ; mapped ; 706B # 1.1 CIRCLED IDEOGRAPH FIRE +328C ; mapped ; 6C34 # 1.1 CIRCLED IDEOGRAPH WATER +328D ; mapped ; 6728 # 1.1 CIRCLED IDEOGRAPH WOOD +328E ; mapped ; 91D1 # 1.1 CIRCLED IDEOGRAPH METAL +328F ; mapped ; 571F # 1.1 CIRCLED IDEOGRAPH EARTH +3290 ; mapped ; 65E5 # 1.1 CIRCLED IDEOGRAPH SUN +3291 ; mapped ; 682A # 1.1 CIRCLED IDEOGRAPH STOCK +3292 ; mapped ; 6709 # 1.1 CIRCLED IDEOGRAPH HAVE +3293 ; mapped ; 793E # 1.1 CIRCLED IDEOGRAPH SOCIETY +3294 ; mapped ; 540D # 1.1 CIRCLED IDEOGRAPH NAME +3295 ; mapped ; 7279 # 1.1 CIRCLED IDEOGRAPH SPECIAL +3296 ; mapped ; 8CA1 # 1.1 CIRCLED IDEOGRAPH FINANCIAL +3297 ; mapped ; 795D # 1.1 CIRCLED IDEOGRAPH CONGRATULATION +3298 ; mapped ; 52B4 # 1.1 CIRCLED IDEOGRAPH LABOR +3299 ; mapped ; 79D8 # 1.1 CIRCLED IDEOGRAPH SECRET +329A ; mapped ; 7537 # 1.1 CIRCLED IDEOGRAPH MALE +329B ; mapped ; 5973 # 1.1 CIRCLED IDEOGRAPH FEMALE +329C ; mapped ; 9069 # 1.1 CIRCLED IDEOGRAPH SUITABLE +329D ; mapped ; 512A # 1.1 CIRCLED IDEOGRAPH EXCELLENT +329E ; mapped ; 5370 # 1.1 CIRCLED IDEOGRAPH PRINT +329F ; mapped ; 6CE8 # 1.1 CIRCLED IDEOGRAPH ATTENTION +32A0 ; mapped ; 9805 # 1.1 CIRCLED IDEOGRAPH ITEM +32A1 ; mapped ; 4F11 # 1.1 CIRCLED IDEOGRAPH REST +32A2 ; mapped ; 5199 # 1.1 CIRCLED IDEOGRAPH COPY +32A3 ; mapped ; 6B63 # 1.1 CIRCLED IDEOGRAPH CORRECT +32A4 ; mapped ; 4E0A # 1.1 CIRCLED IDEOGRAPH HIGH +32A5 ; mapped ; 4E2D # 1.1 CIRCLED IDEOGRAPH CENTRE +32A6 ; mapped ; 4E0B # 1.1 CIRCLED IDEOGRAPH LOW +32A7 ; mapped ; 5DE6 # 1.1 CIRCLED IDEOGRAPH LEFT +32A8 ; mapped ; 53F3 # 1.1 CIRCLED IDEOGRAPH RIGHT +32A9 ; mapped ; 533B # 1.1 CIRCLED IDEOGRAPH MEDICINE +32AA ; mapped ; 5B97 # 1.1 CIRCLED IDEOGRAPH RELIGION +32AB ; mapped ; 5B66 # 1.1 CIRCLED IDEOGRAPH STUDY +32AC ; mapped ; 76E3 # 1.1 CIRCLED IDEOGRAPH SUPERVISE +32AD ; mapped ; 4F01 # 1.1 CIRCLED IDEOGRAPH ENTERPRISE +32AE ; mapped ; 8CC7 # 1.1 CIRCLED IDEOGRAPH RESOURCE +32AF ; mapped ; 5354 # 1.1 CIRCLED IDEOGRAPH ALLIANCE +32B0 ; mapped ; 591C # 1.1 CIRCLED IDEOGRAPH NIGHT +32B1 ; mapped ; 0033 0036 # 3.2 CIRCLED NUMBER THIRTY SIX +32B2 ; mapped ; 0033 0037 # 3.2 CIRCLED NUMBER THIRTY SEVEN +32B3 ; mapped ; 0033 0038 # 3.2 CIRCLED NUMBER THIRTY EIGHT +32B4 ; mapped ; 0033 0039 # 3.2 CIRCLED NUMBER THIRTY NINE +32B5 ; mapped ; 0034 0030 # 3.2 CIRCLED NUMBER FORTY +32B6 ; mapped ; 0034 0031 # 3.2 CIRCLED NUMBER FORTY ONE +32B7 ; mapped ; 0034 0032 # 3.2 CIRCLED NUMBER FORTY TWO +32B8 ; mapped ; 0034 0033 # 3.2 CIRCLED NUMBER FORTY THREE +32B9 ; mapped ; 0034 0034 # 3.2 CIRCLED NUMBER FORTY FOUR +32BA ; mapped ; 0034 0035 # 3.2 CIRCLED NUMBER FORTY FIVE +32BB ; mapped ; 0034 0036 # 3.2 CIRCLED NUMBER FORTY SIX +32BC ; mapped ; 0034 0037 # 3.2 CIRCLED NUMBER FORTY SEVEN +32BD ; mapped ; 0034 0038 # 3.2 CIRCLED NUMBER FORTY EIGHT +32BE ; mapped ; 0034 0039 # 3.2 CIRCLED NUMBER FORTY NINE +32BF ; mapped ; 0035 0030 # 3.2 CIRCLED NUMBER FIFTY +32C0 ; mapped ; 0031 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +32C1 ; mapped ; 0032 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +32C2 ; mapped ; 0033 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +32C3 ; mapped ; 0034 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +32C4 ; mapped ; 0035 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +32C5 ; mapped ; 0036 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +32C6 ; mapped ; 0037 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +32C7 ; mapped ; 0038 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +32C8 ; mapped ; 0039 6708 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +32C9 ; mapped ; 0031 0030 6708 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +32CA ; mapped ; 0031 0031 6708 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +32CB ; mapped ; 0031 0032 6708 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +32CC ; mapped ; 0068 0067 # 4.0 SQUARE HG +32CD ; mapped ; 0065 0072 0067 #4.0 SQUARE ERG +32CE ; mapped ; 0065 0076 # 4.0 SQUARE EV +32CF ; mapped ; 006C 0074 0064 #4.0 LIMITED LIABILITY SIGN +32D0 ; mapped ; 30A2 # 1.1 CIRCLED KATAKANA A +32D1 ; mapped ; 30A4 # 1.1 CIRCLED KATAKANA I +32D2 ; mapped ; 30A6 # 1.1 CIRCLED KATAKANA U +32D3 ; mapped ; 30A8 # 1.1 CIRCLED KATAKANA E +32D4 ; mapped ; 30AA # 1.1 CIRCLED KATAKANA O +32D5 ; mapped ; 30AB # 1.1 CIRCLED KATAKANA KA +32D6 ; mapped ; 30AD # 1.1 CIRCLED KATAKANA KI +32D7 ; mapped ; 30AF # 1.1 CIRCLED KATAKANA KU +32D8 ; mapped ; 30B1 # 1.1 CIRCLED KATAKANA KE +32D9 ; mapped ; 30B3 # 1.1 CIRCLED KATAKANA KO +32DA ; mapped ; 30B5 # 1.1 CIRCLED KATAKANA SA +32DB ; mapped ; 30B7 # 1.1 CIRCLED KATAKANA SI +32DC ; mapped ; 30B9 # 1.1 CIRCLED KATAKANA SU +32DD ; mapped ; 30BB # 1.1 CIRCLED KATAKANA SE +32DE ; mapped ; 30BD # 1.1 CIRCLED KATAKANA SO +32DF ; mapped ; 30BF # 1.1 CIRCLED KATAKANA TA +32E0 ; mapped ; 30C1 # 1.1 CIRCLED KATAKANA TI +32E1 ; mapped ; 30C4 # 1.1 CIRCLED KATAKANA TU +32E2 ; mapped ; 30C6 # 1.1 CIRCLED KATAKANA TE +32E3 ; mapped ; 30C8 # 1.1 CIRCLED KATAKANA TO +32E4 ; mapped ; 30CA # 1.1 CIRCLED KATAKANA NA +32E5 ; mapped ; 30CB # 1.1 CIRCLED KATAKANA NI +32E6 ; mapped ; 30CC # 1.1 CIRCLED KATAKANA NU +32E7 ; mapped ; 30CD # 1.1 CIRCLED KATAKANA NE +32E8 ; mapped ; 30CE # 1.1 CIRCLED KATAKANA NO +32E9 ; mapped ; 30CF # 1.1 CIRCLED KATAKANA HA +32EA ; mapped ; 30D2 # 1.1 CIRCLED KATAKANA HI +32EB ; mapped ; 30D5 # 1.1 CIRCLED KATAKANA HU +32EC ; mapped ; 30D8 # 1.1 CIRCLED KATAKANA HE +32ED ; mapped ; 30DB # 1.1 CIRCLED KATAKANA HO +32EE ; mapped ; 30DE # 1.1 CIRCLED KATAKANA MA +32EF ; mapped ; 30DF # 1.1 CIRCLED KATAKANA MI +32F0 ; mapped ; 30E0 # 1.1 CIRCLED KATAKANA MU +32F1 ; mapped ; 30E1 # 1.1 CIRCLED KATAKANA ME +32F2 ; mapped ; 30E2 # 1.1 CIRCLED KATAKANA MO +32F3 ; mapped ; 30E4 # 1.1 CIRCLED KATAKANA YA +32F4 ; mapped ; 30E6 # 1.1 CIRCLED KATAKANA YU +32F5 ; mapped ; 30E8 # 1.1 CIRCLED KATAKANA YO +32F6 ; mapped ; 30E9 # 1.1 CIRCLED KATAKANA RA +32F7 ; mapped ; 30EA # 1.1 CIRCLED KATAKANA RI +32F8 ; mapped ; 30EB # 1.1 CIRCLED KATAKANA RU +32F9 ; mapped ; 30EC # 1.1 CIRCLED KATAKANA RE +32FA ; mapped ; 30ED # 1.1 CIRCLED KATAKANA RO +32FB ; mapped ; 30EF # 1.1 CIRCLED KATAKANA WA +32FC ; mapped ; 30F0 # 1.1 CIRCLED KATAKANA WI +32FD ; mapped ; 30F1 # 1.1 CIRCLED KATAKANA WE +32FE ; mapped ; 30F2 # 1.1 CIRCLED KATAKANA WO +32FF ; disallowed # NA <reserved-32FF> +3300 ; mapped ; 30A2 30D1 30FC 30C8 #1.1 SQUARE APAATO +3301 ; mapped ; 30A2 30EB 30D5 30A1 #1.1 SQUARE ARUHUA +3302 ; mapped ; 30A2 30F3 30DA 30A2 #1.1 SQUARE ANPEA +3303 ; mapped ; 30A2 30FC 30EB #1.1 SQUARE AARU +3304 ; mapped ; 30A4 30CB 30F3 30B0 #1.1 SQUARE ININGU +3305 ; mapped ; 30A4 30F3 30C1 #1.1 SQUARE INTI +3306 ; mapped ; 30A6 30A9 30F3 #1.1 SQUARE UON +3307 ; mapped ; 30A8 30B9 30AF 30FC 30C9 #1.1 SQUARE ESUKUUDO +3308 ; mapped ; 30A8 30FC 30AB 30FC #1.1 SQUARE EEKAA +3309 ; mapped ; 30AA 30F3 30B9 #1.1 SQUARE ONSU +330A ; mapped ; 30AA 30FC 30E0 #1.1 SQUARE OOMU +330B ; mapped ; 30AB 30A4 30EA #1.1 SQUARE KAIRI +330C ; mapped ; 30AB 30E9 30C3 30C8 #1.1 SQUARE KARATTO +330D ; mapped ; 30AB 30ED 30EA 30FC #1.1 SQUARE KARORII +330E ; mapped ; 30AC 30ED 30F3 #1.1 SQUARE GARON +330F ; mapped ; 30AC 30F3 30DE #1.1 SQUARE GANMA +3310 ; mapped ; 30AE 30AC # 1.1 SQUARE GIGA +3311 ; mapped ; 30AE 30CB 30FC #1.1 SQUARE GINII +3312 ; mapped ; 30AD 30E5 30EA 30FC #1.1 SQUARE KYURII +3313 ; mapped ; 30AE 30EB 30C0 30FC #1.1 SQUARE GIRUDAA +3314 ; mapped ; 30AD 30ED # 1.1 SQUARE KIRO +3315 ; mapped ; 30AD 30ED 30B0 30E9 30E0 #1.1 SQUARE KIROGURAMU +3316 ; mapped ; 30AD 30ED 30E1 30FC 30C8 30EB #1.1 SQUARE KIROMEETORU +3317 ; mapped ; 30AD 30ED 30EF 30C3 30C8 #1.1 SQUARE KIROWATTO +3318 ; mapped ; 30B0 30E9 30E0 #1.1 SQUARE GURAMU +3319 ; mapped ; 30B0 30E9 30E0 30C8 30F3 #1.1 SQUARE GURAMUTON +331A ; mapped ; 30AF 30EB 30BC 30A4 30ED #1.1 SQUARE KURUZEIRO +331B ; mapped ; 30AF 30ED 30FC 30CD #1.1 SQUARE KUROONE +331C ; mapped ; 30B1 30FC 30B9 #1.1 SQUARE KEESU +331D ; mapped ; 30B3 30EB 30CA #1.1 SQUARE KORUNA +331E ; mapped ; 30B3 30FC 30DD #1.1 SQUARE KOOPO +331F ; mapped ; 30B5 30A4 30AF 30EB #1.1 SQUARE SAIKURU +3320 ; mapped ; 30B5 30F3 30C1 30FC 30E0 #1.1 SQUARE SANTIIMU +3321 ; mapped ; 30B7 30EA 30F3 30B0 #1.1 SQUARE SIRINGU +3322 ; mapped ; 30BB 30F3 30C1 #1.1 SQUARE SENTI +3323 ; mapped ; 30BB 30F3 30C8 #1.1 SQUARE SENTO +3324 ; mapped ; 30C0 30FC 30B9 #1.1 SQUARE DAASU +3325 ; mapped ; 30C7 30B7 # 1.1 SQUARE DESI +3326 ; mapped ; 30C9 30EB # 1.1 SQUARE DORU +3327 ; mapped ; 30C8 30F3 # 1.1 SQUARE TON +3328 ; mapped ; 30CA 30CE # 1.1 SQUARE NANO +3329 ; mapped ; 30CE 30C3 30C8 #1.1 SQUARE NOTTO +332A ; mapped ; 30CF 30A4 30C4 #1.1 SQUARE HAITU +332B ; mapped ; 30D1 30FC 30BB 30F3 30C8 #1.1 SQUARE PAASENTO +332C ; mapped ; 30D1 30FC 30C4 #1.1 SQUARE PAATU +332D ; mapped ; 30D0 30FC 30EC 30EB #1.1 SQUARE BAARERU +332E ; mapped ; 30D4 30A2 30B9 30C8 30EB #1.1 SQUARE PIASUTORU +332F ; mapped ; 30D4 30AF 30EB #1.1 SQUARE PIKURU +3330 ; mapped ; 30D4 30B3 # 1.1 SQUARE PIKO +3331 ; mapped ; 30D3 30EB # 1.1 SQUARE BIRU +3332 ; mapped ; 30D5 30A1 30E9 30C3 30C9 #1.1 SQUARE HUARADDO +3333 ; mapped ; 30D5 30A3 30FC 30C8 #1.1 SQUARE HUIITO +3334 ; mapped ; 30D6 30C3 30B7 30A7 30EB #1.1 SQUARE BUSSYERU +3335 ; mapped ; 30D5 30E9 30F3 #1.1 SQUARE HURAN +3336 ; mapped ; 30D8 30AF 30BF 30FC 30EB #1.1 SQUARE HEKUTAARU +3337 ; mapped ; 30DA 30BD # 1.1 SQUARE PESO +3338 ; mapped ; 30DA 30CB 30D2 #1.1 SQUARE PENIHI +3339 ; mapped ; 30D8 30EB 30C4 #1.1 SQUARE HERUTU +333A ; mapped ; 30DA 30F3 30B9 #1.1 SQUARE PENSU +333B ; mapped ; 30DA 30FC 30B8 #1.1 SQUARE PEEZI +333C ; mapped ; 30D9 30FC 30BF #1.1 SQUARE BEETA +333D ; mapped ; 30DD 30A4 30F3 30C8 #1.1 SQUARE POINTO +333E ; mapped ; 30DC 30EB 30C8 #1.1 SQUARE BORUTO +333F ; mapped ; 30DB 30F3 # 1.1 SQUARE HON +3340 ; mapped ; 30DD 30F3 30C9 #1.1 SQUARE PONDO +3341 ; mapped ; 30DB 30FC 30EB #1.1 SQUARE HOORU +3342 ; mapped ; 30DB 30FC 30F3 #1.1 SQUARE HOON +3343 ; mapped ; 30DE 30A4 30AF 30ED #1.1 SQUARE MAIKURO +3344 ; mapped ; 30DE 30A4 30EB #1.1 SQUARE MAIRU +3345 ; mapped ; 30DE 30C3 30CF #1.1 SQUARE MAHHA +3346 ; mapped ; 30DE 30EB 30AF #1.1 SQUARE MARUKU +3347 ; mapped ; 30DE 30F3 30B7 30E7 30F3 #1.1 SQUARE MANSYON +3348 ; mapped ; 30DF 30AF 30ED 30F3 #1.1 SQUARE MIKURON +3349 ; mapped ; 30DF 30EA # 1.1 SQUARE MIRI +334A ; mapped ; 30DF 30EA 30D0 30FC 30EB #1.1 SQUARE MIRIBAARU +334B ; mapped ; 30E1 30AC # 1.1 SQUARE MEGA +334C ; mapped ; 30E1 30AC 30C8 30F3 #1.1 SQUARE MEGATON +334D ; mapped ; 30E1 30FC 30C8 30EB #1.1 SQUARE MEETORU +334E ; mapped ; 30E4 30FC 30C9 #1.1 SQUARE YAADO +334F ; mapped ; 30E4 30FC 30EB #1.1 SQUARE YAARU +3350 ; mapped ; 30E6 30A2 30F3 #1.1 SQUARE YUAN +3351 ; mapped ; 30EA 30C3 30C8 30EB #1.1 SQUARE RITTORU +3352 ; mapped ; 30EA 30E9 # 1.1 SQUARE RIRA +3353 ; mapped ; 30EB 30D4 30FC #1.1 SQUARE RUPII +3354 ; mapped ; 30EB 30FC 30D6 30EB #1.1 SQUARE RUUBURU +3355 ; mapped ; 30EC 30E0 # 1.1 SQUARE REMU +3356 ; mapped ; 30EC 30F3 30C8 30B2 30F3 #1.1 SQUARE RENTOGEN +3357 ; mapped ; 30EF 30C3 30C8 #1.1 SQUARE WATTO +3358 ; mapped ; 0030 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +3359 ; mapped ; 0031 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +335A ; mapped ; 0032 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +335B ; mapped ; 0033 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +335C ; mapped ; 0034 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +335D ; mapped ; 0035 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +335E ; mapped ; 0036 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +335F ; mapped ; 0037 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +3360 ; mapped ; 0038 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +3361 ; mapped ; 0039 70B9 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +3362 ; mapped ; 0031 0030 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +3363 ; mapped ; 0031 0031 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +3364 ; mapped ; 0031 0032 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +3365 ; mapped ; 0031 0033 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +3366 ; mapped ; 0031 0034 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +3367 ; mapped ; 0031 0035 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +3368 ; mapped ; 0031 0036 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +3369 ; mapped ; 0031 0037 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +336A ; mapped ; 0031 0038 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +336B ; mapped ; 0031 0039 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +336C ; mapped ; 0032 0030 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +336D ; mapped ; 0032 0031 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +336E ; mapped ; 0032 0032 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +336F ; mapped ; 0032 0033 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +3370 ; mapped ; 0032 0034 70B9 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +3371 ; mapped ; 0068 0070 0061 #1.1 SQUARE HPA +3372 ; mapped ; 0064 0061 # 1.1 SQUARE DA +3373 ; mapped ; 0061 0075 # 1.1 SQUARE AU +3374 ; mapped ; 0062 0061 0072 #1.1 SQUARE BAR +3375 ; mapped ; 006F 0076 # 1.1 SQUARE OV +3376 ; mapped ; 0070 0063 # 1.1 SQUARE PC +3377 ; mapped ; 0064 006D # 4.0 SQUARE DM +3378 ; mapped ; 0064 006D 0032 #4.0 SQUARE DM SQUARED +3379 ; mapped ; 0064 006D 0033 #4.0 SQUARE DM CUBED +337A ; mapped ; 0069 0075 # 4.0 SQUARE IU +337B ; mapped ; 5E73 6210 # 1.1 SQUARE ERA NAME HEISEI +337C ; mapped ; 662D 548C # 1.1 SQUARE ERA NAME SYOUWA +337D ; mapped ; 5927 6B63 # 1.1 SQUARE ERA NAME TAISYOU +337E ; mapped ; 660E 6CBB # 1.1 SQUARE ERA NAME MEIZI +337F ; mapped ; 682A 5F0F 4F1A 793E #1.1 SQUARE CORPORATION +3380 ; mapped ; 0070 0061 # 1.1 SQUARE PA AMPS +3381 ; mapped ; 006E 0061 # 1.1 SQUARE NA +3382 ; mapped ; 03BC 0061 # 1.1 SQUARE MU A +3383 ; mapped ; 006D 0061 # 1.1 SQUARE MA +3384 ; mapped ; 006B 0061 # 1.1 SQUARE KA +3385 ; mapped ; 006B 0062 # 1.1 SQUARE KB +3386 ; mapped ; 006D 0062 # 1.1 SQUARE MB +3387 ; mapped ; 0067 0062 # 1.1 SQUARE GB +3388 ; mapped ; 0063 0061 006C #1.1 SQUARE CAL +3389 ; mapped ; 006B 0063 0061 006C #1.1 SQUARE KCAL +338A ; mapped ; 0070 0066 # 1.1 SQUARE PF +338B ; mapped ; 006E 0066 # 1.1 SQUARE NF +338C ; mapped ; 03BC 0066 # 1.1 SQUARE MU F +338D ; mapped ; 03BC 0067 # 1.1 SQUARE MU G +338E ; mapped ; 006D 0067 # 1.1 SQUARE MG +338F ; mapped ; 006B 0067 # 1.1 SQUARE KG +3390 ; mapped ; 0068 007A # 1.1 SQUARE HZ +3391 ; mapped ; 006B 0068 007A #1.1 SQUARE KHZ +3392 ; mapped ; 006D 0068 007A #1.1 SQUARE MHZ +3393 ; mapped ; 0067 0068 007A #1.1 SQUARE GHZ +3394 ; mapped ; 0074 0068 007A #1.1 SQUARE THZ +3395 ; mapped ; 03BC 006C # 1.1 SQUARE MU L +3396 ; mapped ; 006D 006C # 1.1 SQUARE ML +3397 ; mapped ; 0064 006C # 1.1 SQUARE DL +3398 ; mapped ; 006B 006C # 1.1 SQUARE KL +3399 ; mapped ; 0066 006D # 1.1 SQUARE FM +339A ; mapped ; 006E 006D # 1.1 SQUARE NM +339B ; mapped ; 03BC 006D # 1.1 SQUARE MU M +339C ; mapped ; 006D 006D # 1.1 SQUARE MM +339D ; mapped ; 0063 006D # 1.1 SQUARE CM +339E ; mapped ; 006B 006D # 1.1 SQUARE KM +339F ; mapped ; 006D 006D 0032 #1.1 SQUARE MM SQUARED +33A0 ; mapped ; 0063 006D 0032 #1.1 SQUARE CM SQUARED +33A1 ; mapped ; 006D 0032 # 1.1 SQUARE M SQUARED +33A2 ; mapped ; 006B 006D 0032 #1.1 SQUARE KM SQUARED +33A3 ; mapped ; 006D 006D 0033 #1.1 SQUARE MM CUBED +33A4 ; mapped ; 0063 006D 0033 #1.1 SQUARE CM CUBED +33A5 ; mapped ; 006D 0033 # 1.1 SQUARE M CUBED +33A6 ; mapped ; 006B 006D 0033 #1.1 SQUARE KM CUBED +33A7 ; mapped ; 006D 2215 0073 #1.1 SQUARE M OVER S +33A8 ; mapped ; 006D 2215 0073 0032 #1.1 SQUARE M OVER S SQUARED +33A9 ; mapped ; 0070 0061 # 1.1 SQUARE PA +33AA ; mapped ; 006B 0070 0061 #1.1 SQUARE KPA +33AB ; mapped ; 006D 0070 0061 #1.1 SQUARE MPA +33AC ; mapped ; 0067 0070 0061 #1.1 SQUARE GPA +33AD ; mapped ; 0072 0061 0064 #1.1 SQUARE RAD +33AE ; mapped ; 0072 0061 0064 2215 0073 #1.1 SQUARE RAD OVER S +33AF ; mapped ; 0072 0061 0064 2215 0073 0032 #1.1 SQUARE RAD OVER S SQUARED +33B0 ; mapped ; 0070 0073 # 1.1 SQUARE PS +33B1 ; mapped ; 006E 0073 # 1.1 SQUARE NS +33B2 ; mapped ; 03BC 0073 # 1.1 SQUARE MU S +33B3 ; mapped ; 006D 0073 # 1.1 SQUARE MS +33B4 ; mapped ; 0070 0076 # 1.1 SQUARE PV +33B5 ; mapped ; 006E 0076 # 1.1 SQUARE NV +33B6 ; mapped ; 03BC 0076 # 1.1 SQUARE MU V +33B7 ; mapped ; 006D 0076 # 1.1 SQUARE MV +33B8 ; mapped ; 006B 0076 # 1.1 SQUARE KV +33B9 ; mapped ; 006D 0076 # 1.1 SQUARE MV MEGA +33BA ; mapped ; 0070 0077 # 1.1 SQUARE PW +33BB ; mapped ; 006E 0077 # 1.1 SQUARE NW +33BC ; mapped ; 03BC 0077 # 1.1 SQUARE MU W +33BD ; mapped ; 006D 0077 # 1.1 SQUARE MW +33BE ; mapped ; 006B 0077 # 1.1 SQUARE KW +33BF ; mapped ; 006D 0077 # 1.1 SQUARE MW MEGA +33C0 ; mapped ; 006B 03C9 # 1.1 SQUARE K OHM +33C1 ; mapped ; 006D 03C9 # 1.1 SQUARE M OHM +33C2 ; disallowed # 1.1 SQUARE AM +33C3 ; mapped ; 0062 0071 # 1.1 SQUARE BQ +33C4 ; mapped ; 0063 0063 # 1.1 SQUARE CC +33C5 ; mapped ; 0063 0064 # 1.1 SQUARE CD +33C6 ; mapped ; 0063 2215 006B 0067 #1.1 SQUARE C OVER KG +33C7 ; disallowed # 1.1 SQUARE CO +33C8 ; mapped ; 0064 0062 # 1.1 SQUARE DB +33C9 ; mapped ; 0067 0079 # 1.1 SQUARE GY +33CA ; mapped ; 0068 0061 # 1.1 SQUARE HA +33CB ; mapped ; 0068 0070 # 1.1 SQUARE HP +33CC ; mapped ; 0069 006E # 1.1 SQUARE IN +33CD ; mapped ; 006B 006B # 1.1 SQUARE KK +33CE ; mapped ; 006B 006D # 1.1 SQUARE KM CAPITAL +33CF ; mapped ; 006B 0074 # 1.1 SQUARE KT +33D0 ; mapped ; 006C 006D # 1.1 SQUARE LM +33D1 ; mapped ; 006C 006E # 1.1 SQUARE LN +33D2 ; mapped ; 006C 006F 0067 #1.1 SQUARE LOG +33D3 ; mapped ; 006C 0078 # 1.1 SQUARE LX +33D4 ; mapped ; 006D 0062 # 1.1 SQUARE MB SMALL +33D5 ; mapped ; 006D 0069 006C #1.1 SQUARE MIL +33D6 ; mapped ; 006D 006F 006C #1.1 SQUARE MOL +33D7 ; mapped ; 0070 0068 # 1.1 SQUARE PH +33D8 ; disallowed # 1.1 SQUARE PM +33D9 ; mapped ; 0070 0070 006D #1.1 SQUARE PPM +33DA ; mapped ; 0070 0072 # 1.1 SQUARE PR +33DB ; mapped ; 0073 0072 # 1.1 SQUARE SR +33DC ; mapped ; 0073 0076 # 1.1 SQUARE SV +33DD ; mapped ; 0077 0062 # 1.1 SQUARE WB +33DE ; mapped ; 0076 2215 006D #4.0 SQUARE V OVER M +33DF ; mapped ; 0061 2215 006D #4.0 SQUARE A OVER M +33E0 ; mapped ; 0031 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +33E1 ; mapped ; 0032 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +33E2 ; mapped ; 0033 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +33E3 ; mapped ; 0034 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +33E4 ; mapped ; 0035 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +33E5 ; mapped ; 0036 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +33E6 ; mapped ; 0037 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +33E7 ; mapped ; 0038 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +33E8 ; mapped ; 0039 65E5 # 1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +33E9 ; mapped ; 0031 0030 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +33EA ; mapped ; 0031 0031 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +33EB ; mapped ; 0031 0032 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +33EC ; mapped ; 0031 0033 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +33ED ; mapped ; 0031 0034 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +33EE ; mapped ; 0031 0035 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +33EF ; mapped ; 0031 0036 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +33F0 ; mapped ; 0031 0037 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +33F1 ; mapped ; 0031 0038 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +33F2 ; mapped ; 0031 0039 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +33F3 ; mapped ; 0032 0030 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +33F4 ; mapped ; 0032 0031 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +33F5 ; mapped ; 0032 0032 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +33F6 ; mapped ; 0032 0033 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +33F7 ; mapped ; 0032 0034 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +33F8 ; mapped ; 0032 0035 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +33F9 ; mapped ; 0032 0036 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +33FA ; mapped ; 0032 0037 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +33FB ; mapped ; 0032 0038 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +33FC ; mapped ; 0032 0039 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +33FD ; mapped ; 0033 0030 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +33FE ; mapped ; 0033 0031 65E5 #1.1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +33FF ; mapped ; 0067 0061 006C #4.0 SQUARE GAL +3400..4DB5 ; valid # 3.0 CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4DB6..4DBF ; disallowed # NA <reserved-4DB6>..<reserved-4DBF> +4DC0..4DFF ; valid ; ; NV8 # 4.0 HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +4E00..9FA5 ; valid # 1.1 CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 +9FA6..9FBB ; valid # 4.1 CJK UNIFIED IDEOGRAPH-9FA6..CJK UNIFIED IDEOGRAPH-9FBB +9FBC..9FC3 ; valid # 5.1 CJK UNIFIED IDEOGRAPH-9FBC..CJK UNIFIED IDEOGRAPH-9FC3 +9FC4..9FCB ; valid # 5.2 CJK UNIFIED IDEOGRAPH-9FC4..CJK UNIFIED IDEOGRAPH-9FCB +9FCC ; valid # 6.1 CJK UNIFIED IDEOGRAPH-9FCC +9FCD..9FD5 ; valid # 8.0 CJK UNIFIED IDEOGRAPH-9FCD..CJK UNIFIED IDEOGRAPH-9FD5 +9FD6..9FFF ; disallowed # NA <reserved-9FD6>..<reserved-9FFF> +A000..A48C ; valid # 3.0 YI SYLLABLE IT..YI SYLLABLE YYR +A48D..A48F ; disallowed # NA <reserved-A48D>..<reserved-A48F> +A490..A4A1 ; valid ; ; NV8 # 3.0 YI RADICAL QOT..YI RADICAL GA +A4A2..A4A3 ; valid ; ; NV8 # 3.2 YI RADICAL ZUP..YI RADICAL CYT +A4A4..A4B3 ; valid ; ; NV8 # 3.0 YI RADICAL DDUR..YI RADICAL JO +A4B4 ; valid ; ; NV8 # 3.2 YI RADICAL NZUP +A4B5..A4C0 ; valid ; ; NV8 # 3.0 YI RADICAL JJY..YI RADICAL SHAT +A4C1 ; valid ; ; NV8 # 3.2 YI RADICAL ZUR +A4C2..A4C4 ; valid ; ; NV8 # 3.0 YI RADICAL SHOP..YI RADICAL ZZIET +A4C5 ; valid ; ; NV8 # 3.2 YI RADICAL NBIE +A4C6 ; valid ; ; NV8 # 3.0 YI RADICAL KE +A4C7..A4CF ; disallowed # NA <reserved-A4C7>..<reserved-A4CF> +A4D0..A4FD ; valid # 5.2 LISU LETTER BA..LISU LETTER TONE MYA JEU +A4FE..A4FF ; valid ; ; NV8 # 5.2 LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A500..A60C ; valid # 5.1 VAI SYLLABLE EE..VAI SYLLABLE LENGTHENER +A60D..A60F ; valid ; ; NV8 # 5.1 VAI COMMA..VAI QUESTION MARK +A610..A62B ; valid # 5.1 VAI SYLLABLE NDOLE FA..VAI SYLLABLE NDOLE DO +A62C..A63F ; disallowed # NA <reserved-A62C>..<reserved-A63F> +A640 ; mapped ; A641 # 5.1 CYRILLIC CAPITAL LETTER ZEMLYA +A641 ; valid # 5.1 CYRILLIC SMALL LETTER ZEMLYA +A642 ; mapped ; A643 # 5.1 CYRILLIC CAPITAL LETTER DZELO +A643 ; valid # 5.1 CYRILLIC SMALL LETTER DZELO +A644 ; mapped ; A645 # 5.1 CYRILLIC CAPITAL LETTER REVERSED DZE +A645 ; valid # 5.1 CYRILLIC SMALL LETTER REVERSED DZE +A646 ; mapped ; A647 # 5.1 CYRILLIC CAPITAL LETTER IOTA +A647 ; valid # 5.1 CYRILLIC SMALL LETTER IOTA +A648 ; mapped ; A649 # 5.1 CYRILLIC CAPITAL LETTER DJERV +A649 ; valid # 5.1 CYRILLIC SMALL LETTER DJERV +A64A ; mapped ; A64B # 5.1 CYRILLIC CAPITAL LETTER MONOGRAPH UK +A64B ; valid # 5.1 CYRILLIC SMALL LETTER MONOGRAPH UK +A64C ; mapped ; A64D # 5.1 CYRILLIC CAPITAL LETTER BROAD OMEGA +A64D ; valid # 5.1 CYRILLIC SMALL LETTER BROAD OMEGA +A64E ; mapped ; A64F # 5.1 CYRILLIC CAPITAL LETTER NEUTRAL YER +A64F ; valid # 5.1 CYRILLIC SMALL LETTER NEUTRAL YER +A650 ; mapped ; A651 # 5.1 CYRILLIC CAPITAL LETTER YERU WITH BACK YER +A651 ; valid # 5.1 CYRILLIC SMALL LETTER YERU WITH BACK YER +A652 ; mapped ; A653 # 5.1 CYRILLIC CAPITAL LETTER IOTIFIED YAT +A653 ; valid # 5.1 CYRILLIC SMALL LETTER IOTIFIED YAT +A654 ; mapped ; A655 # 5.1 CYRILLIC CAPITAL LETTER REVERSED YU +A655 ; valid # 5.1 CYRILLIC SMALL LETTER REVERSED YU +A656 ; mapped ; A657 # 5.1 CYRILLIC CAPITAL LETTER IOTIFIED A +A657 ; valid # 5.1 CYRILLIC SMALL LETTER IOTIFIED A +A658 ; mapped ; A659 # 5.1 CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +A659 ; valid # 5.1 CYRILLIC SMALL LETTER CLOSED LITTLE YUS +A65A ; mapped ; A65B # 5.1 CYRILLIC CAPITAL LETTER BLENDED YUS +A65B ; valid # 5.1 CYRILLIC SMALL LETTER BLENDED YUS +A65C ; mapped ; A65D # 5.1 CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +A65D ; valid # 5.1 CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +A65E ; mapped ; A65F # 5.1 CYRILLIC CAPITAL LETTER YN +A65F ; valid # 5.1 CYRILLIC SMALL LETTER YN +A660 ; mapped ; A661 # 6.0 CYRILLIC CAPITAL LETTER REVERSED TSE +A661 ; valid # 6.0 CYRILLIC SMALL LETTER REVERSED TSE +A662 ; mapped ; A663 # 5.1 CYRILLIC CAPITAL LETTER SOFT DE +A663 ; valid # 5.1 CYRILLIC SMALL LETTER SOFT DE +A664 ; mapped ; A665 # 5.1 CYRILLIC CAPITAL LETTER SOFT EL +A665 ; valid # 5.1 CYRILLIC SMALL LETTER SOFT EL +A666 ; mapped ; A667 # 5.1 CYRILLIC CAPITAL LETTER SOFT EM +A667 ; valid # 5.1 CYRILLIC SMALL LETTER SOFT EM +A668 ; mapped ; A669 # 5.1 CYRILLIC CAPITAL LETTER MONOCULAR O +A669 ; valid # 5.1 CYRILLIC SMALL LETTER MONOCULAR O +A66A ; mapped ; A66B # 5.1 CYRILLIC CAPITAL LETTER BINOCULAR O +A66B ; valid # 5.1 CYRILLIC SMALL LETTER BINOCULAR O +A66C ; mapped ; A66D # 5.1 CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A66D..A66F ; valid # 5.1 CYRILLIC SMALL LETTER DOUBLE MONOCULAR O..COMBINING CYRILLIC VZMET +A670..A673 ; valid ; ; NV8 # 5.1 COMBINING CYRILLIC TEN MILLIONS SIGN..SLAVONIC ASTERISK +A674..A67B ; valid # 6.1 COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC LETTER OMEGA +A67C..A67D ; valid # 5.1 COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK +A67E ; valid ; ; NV8 # 5.1 CYRILLIC KAVYKA +A67F ; valid # 5.1 CYRILLIC PAYEROK +A680 ; mapped ; A681 # 5.1 CYRILLIC CAPITAL LETTER DWE +A681 ; valid # 5.1 CYRILLIC SMALL LETTER DWE +A682 ; mapped ; A683 # 5.1 CYRILLIC CAPITAL LETTER DZWE +A683 ; valid # 5.1 CYRILLIC SMALL LETTER DZWE +A684 ; mapped ; A685 # 5.1 CYRILLIC CAPITAL LETTER ZHWE +A685 ; valid # 5.1 CYRILLIC SMALL LETTER ZHWE +A686 ; mapped ; A687 # 5.1 CYRILLIC CAPITAL LETTER CCHE +A687 ; valid # 5.1 CYRILLIC SMALL LETTER CCHE +A688 ; mapped ; A689 # 5.1 CYRILLIC CAPITAL LETTER DZZE +A689 ; valid # 5.1 CYRILLIC SMALL LETTER DZZE +A68A ; mapped ; A68B # 5.1 CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +A68B ; valid # 5.1 CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +A68C ; mapped ; A68D # 5.1 CYRILLIC CAPITAL LETTER TWE +A68D ; valid # 5.1 CYRILLIC SMALL LETTER TWE +A68E ; mapped ; A68F # 5.1 CYRILLIC CAPITAL LETTER TSWE +A68F ; valid # 5.1 CYRILLIC SMALL LETTER TSWE +A690 ; mapped ; A691 # 5.1 CYRILLIC CAPITAL LETTER TSSE +A691 ; valid # 5.1 CYRILLIC SMALL LETTER TSSE +A692 ; mapped ; A693 # 5.1 CYRILLIC CAPITAL LETTER TCHE +A693 ; valid # 5.1 CYRILLIC SMALL LETTER TCHE +A694 ; mapped ; A695 # 5.1 CYRILLIC CAPITAL LETTER HWE +A695 ; valid # 5.1 CYRILLIC SMALL LETTER HWE +A696 ; mapped ; A697 # 5.1 CYRILLIC CAPITAL LETTER SHWE +A697 ; valid # 5.1 CYRILLIC SMALL LETTER SHWE +A698 ; mapped ; A699 # 7.0 CYRILLIC CAPITAL LETTER DOUBLE O +A699 ; valid # 7.0 CYRILLIC SMALL LETTER DOUBLE O +A69A ; mapped ; A69B # 7.0 CYRILLIC CAPITAL LETTER CROSSED O +A69B ; valid # 7.0 CYRILLIC SMALL LETTER CROSSED O +A69C ; mapped ; 044A # 7.0 MODIFIER LETTER CYRILLIC HARD SIGN +A69D ; mapped ; 044C # 7.0 MODIFIER LETTER CYRILLIC SOFT SIGN +A69E ; valid # 8.0 COMBINING CYRILLIC LETTER EF +A69F ; valid # 6.1 COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5 ; valid # 5.2 BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; valid ; ; NV8 # 5.2 BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1 ; valid # 5.2 BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A6F2..A6F7 ; valid ; ; NV8 # 5.2 BAMUM NJAEMLI..BAMUM QUESTION MARK +A6F8..A6FF ; disallowed # NA <reserved-A6F8>..<reserved-A6FF> +A700..A716 ; valid ; ; NV8 # 4.1 MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71A ; valid # 5.0 MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOWER RIGHT CORNER ANGLE +A71B..A71F ; valid # 5.1 MODIFIER LETTER RAISED UP ARROW..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; valid ; ; NV8 # 5.0 MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A722 ; mapped ; A723 # 5.1 LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A723 ; valid # 5.1 LATIN SMALL LETTER EGYPTOLOGICAL ALEF +A724 ; mapped ; A725 # 5.1 LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +A725 ; valid # 5.1 LATIN SMALL LETTER EGYPTOLOGICAL AIN +A726 ; mapped ; A727 # 5.1 LATIN CAPITAL LETTER HENG +A727 ; valid # 5.1 LATIN SMALL LETTER HENG +A728 ; mapped ; A729 # 5.1 LATIN CAPITAL LETTER TZ +A729 ; valid # 5.1 LATIN SMALL LETTER TZ +A72A ; mapped ; A72B # 5.1 LATIN CAPITAL LETTER TRESILLO +A72B ; valid # 5.1 LATIN SMALL LETTER TRESILLO +A72C ; mapped ; A72D # 5.1 LATIN CAPITAL LETTER CUATRILLO +A72D ; valid # 5.1 LATIN SMALL LETTER CUATRILLO +A72E ; mapped ; A72F # 5.1 LATIN CAPITAL LETTER CUATRILLO WITH COMMA +A72F..A731 ; valid # 5.1 LATIN SMALL LETTER CUATRILLO WITH COMMA..LATIN LETTER SMALL CAPITAL S +A732 ; mapped ; A733 # 5.1 LATIN CAPITAL LETTER AA +A733 ; valid # 5.1 LATIN SMALL LETTER AA +A734 ; mapped ; A735 # 5.1 LATIN CAPITAL LETTER AO +A735 ; valid # 5.1 LATIN SMALL LETTER AO +A736 ; mapped ; A737 # 5.1 LATIN CAPITAL LETTER AU +A737 ; valid # 5.1 LATIN SMALL LETTER AU +A738 ; mapped ; A739 # 5.1 LATIN CAPITAL LETTER AV +A739 ; valid # 5.1 LATIN SMALL LETTER AV +A73A ; mapped ; A73B # 5.1 LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73B ; valid # 5.1 LATIN SMALL LETTER AV WITH HORIZONTAL BAR +A73C ; mapped ; A73D # 5.1 LATIN CAPITAL LETTER AY +A73D ; valid # 5.1 LATIN SMALL LETTER AY +A73E ; mapped ; A73F # 5.1 LATIN CAPITAL LETTER REVERSED C WITH DOT +A73F ; valid # 5.1 LATIN SMALL LETTER REVERSED C WITH DOT +A740 ; mapped ; A741 # 5.1 LATIN CAPITAL LETTER K WITH STROKE +A741 ; valid # 5.1 LATIN SMALL LETTER K WITH STROKE +A742 ; mapped ; A743 # 5.1 LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A743 ; valid # 5.1 LATIN SMALL LETTER K WITH DIAGONAL STROKE +A744 ; mapped ; A745 # 5.1 LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +A745 ; valid # 5.1 LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +A746 ; mapped ; A747 # 5.1 LATIN CAPITAL LETTER BROKEN L +A747 ; valid # 5.1 LATIN SMALL LETTER BROKEN L +A748 ; mapped ; A749 # 5.1 LATIN CAPITAL LETTER L WITH HIGH STROKE +A749 ; valid # 5.1 LATIN SMALL LETTER L WITH HIGH STROKE +A74A ; mapped ; A74B # 5.1 LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +A74B ; valid # 5.1 LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +A74C ; mapped ; A74D # 5.1 LATIN CAPITAL LETTER O WITH LOOP +A74D ; valid # 5.1 LATIN SMALL LETTER O WITH LOOP +A74E ; mapped ; A74F # 5.1 LATIN CAPITAL LETTER OO +A74F ; valid # 5.1 LATIN SMALL LETTER OO +A750 ; mapped ; A751 # 5.1 LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +A751 ; valid # 5.1 LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +A752 ; mapped ; A753 # 5.1 LATIN CAPITAL LETTER P WITH FLOURISH +A753 ; valid # 5.1 LATIN SMALL LETTER P WITH FLOURISH +A754 ; mapped ; A755 # 5.1 LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A755 ; valid # 5.1 LATIN SMALL LETTER P WITH SQUIRREL TAIL +A756 ; mapped ; A757 # 5.1 LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A757 ; valid # 5.1 LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +A758 ; mapped ; A759 # 5.1 LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +A759 ; valid # 5.1 LATIN SMALL LETTER Q WITH DIAGONAL STROKE +A75A ; mapped ; A75B # 5.1 LATIN CAPITAL LETTER R ROTUNDA +A75B ; valid # 5.1 LATIN SMALL LETTER R ROTUNDA +A75C ; mapped ; A75D # 5.1 LATIN CAPITAL LETTER RUM ROTUNDA +A75D ; valid # 5.1 LATIN SMALL LETTER RUM ROTUNDA +A75E ; mapped ; A75F # 5.1 LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +A75F ; valid # 5.1 LATIN SMALL LETTER V WITH DIAGONAL STROKE +A760 ; mapped ; A761 # 5.1 LATIN CAPITAL LETTER VY +A761 ; valid # 5.1 LATIN SMALL LETTER VY +A762 ; mapped ; A763 # 5.1 LATIN CAPITAL LETTER VISIGOTHIC Z +A763 ; valid # 5.1 LATIN SMALL LETTER VISIGOTHIC Z +A764 ; mapped ; A765 # 5.1 LATIN CAPITAL LETTER THORN WITH STROKE +A765 ; valid # 5.1 LATIN SMALL LETTER THORN WITH STROKE +A766 ; mapped ; A767 # 5.1 LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +A767 ; valid # 5.1 LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +A768 ; mapped ; A769 # 5.1 LATIN CAPITAL LETTER VEND +A769 ; valid # 5.1 LATIN SMALL LETTER VEND +A76A ; mapped ; A76B # 5.1 LATIN CAPITAL LETTER ET +A76B ; valid # 5.1 LATIN SMALL LETTER ET +A76C ; mapped ; A76D # 5.1 LATIN CAPITAL LETTER IS +A76D ; valid # 5.1 LATIN SMALL LETTER IS +A76E ; mapped ; A76F # 5.1 LATIN CAPITAL LETTER CON +A76F ; valid # 5.1 LATIN SMALL LETTER CON +A770 ; mapped ; A76F # 5.1 MODIFIER LETTER US +A771..A778 ; valid # 5.1 LATIN SMALL LETTER DUM..LATIN SMALL LETTER UM +A779 ; mapped ; A77A # 5.1 LATIN CAPITAL LETTER INSULAR D +A77A ; valid # 5.1 LATIN SMALL LETTER INSULAR D +A77B ; mapped ; A77C # 5.1 LATIN CAPITAL LETTER INSULAR F +A77C ; valid # 5.1 LATIN SMALL LETTER INSULAR F +A77D ; mapped ; 1D79 # 5.1 LATIN CAPITAL LETTER INSULAR G +A77E ; mapped ; A77F # 5.1 LATIN CAPITAL LETTER TURNED INSULAR G +A77F ; valid # 5.1 LATIN SMALL LETTER TURNED INSULAR G +A780 ; mapped ; A781 # 5.1 LATIN CAPITAL LETTER TURNED L +A781 ; valid # 5.1 LATIN SMALL LETTER TURNED L +A782 ; mapped ; A783 # 5.1 LATIN CAPITAL LETTER INSULAR R +A783 ; valid # 5.1 LATIN SMALL LETTER INSULAR R +A784 ; mapped ; A785 # 5.1 LATIN CAPITAL LETTER INSULAR S +A785 ; valid # 5.1 LATIN SMALL LETTER INSULAR S +A786 ; mapped ; A787 # 5.1 LATIN CAPITAL LETTER INSULAR T +A787..A788 ; valid # 5.1 LATIN SMALL LETTER INSULAR T..MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; valid ; ; NV8 # 5.1 MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A78B ; mapped ; A78C # 5.1 LATIN CAPITAL LETTER SALTILLO +A78C ; valid # 5.1 LATIN SMALL LETTER SALTILLO +A78D ; mapped ; 0265 # 6.0 LATIN CAPITAL LETTER TURNED H +A78E ; valid # 6.0 LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; valid # 8.0 LATIN LETTER SINOLOGICAL DOT +A790 ; mapped ; A791 # 6.0 LATIN CAPITAL LETTER N WITH DESCENDER +A791 ; valid # 6.0 LATIN SMALL LETTER N WITH DESCENDER +A792 ; mapped ; A793 # 6.1 LATIN CAPITAL LETTER C WITH BAR +A793 ; valid # 6.1 LATIN SMALL LETTER C WITH BAR +A794..A795 ; valid # 7.0 LATIN SMALL LETTER C WITH PALATAL HOOK..LATIN SMALL LETTER H WITH PALATAL HOOK +A796 ; mapped ; A797 # 7.0 LATIN CAPITAL LETTER B WITH FLOURISH +A797 ; valid # 7.0 LATIN SMALL LETTER B WITH FLOURISH +A798 ; mapped ; A799 # 7.0 LATIN CAPITAL LETTER F WITH STROKE +A799 ; valid # 7.0 LATIN SMALL LETTER F WITH STROKE +A79A ; mapped ; A79B # 7.0 LATIN CAPITAL LETTER VOLAPUK AE +A79B ; valid # 7.0 LATIN SMALL LETTER VOLAPUK AE +A79C ; mapped ; A79D # 7.0 LATIN CAPITAL LETTER VOLAPUK OE +A79D ; valid # 7.0 LATIN SMALL LETTER VOLAPUK OE +A79E ; mapped ; A79F # 7.0 LATIN CAPITAL LETTER VOLAPUK UE +A79F ; valid # 7.0 LATIN SMALL LETTER VOLAPUK UE +A7A0 ; mapped ; A7A1 # 6.0 LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +A7A1 ; valid # 6.0 LATIN SMALL LETTER G WITH OBLIQUE STROKE +A7A2 ; mapped ; A7A3 # 6.0 LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +A7A3 ; valid # 6.0 LATIN SMALL LETTER K WITH OBLIQUE STROKE +A7A4 ; mapped ; A7A5 # 6.0 LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +A7A5 ; valid # 6.0 LATIN SMALL LETTER N WITH OBLIQUE STROKE +A7A6 ; mapped ; A7A7 # 6.0 LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +A7A7 ; valid # 6.0 LATIN SMALL LETTER R WITH OBLIQUE STROKE +A7A8 ; mapped ; A7A9 # 6.0 LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +A7A9 ; valid # 6.0 LATIN SMALL LETTER S WITH OBLIQUE STROKE +A7AA ; mapped ; 0266 # 6.1 LATIN CAPITAL LETTER H WITH HOOK +A7AB ; mapped ; 025C # 7.0 LATIN CAPITAL LETTER REVERSED OPEN E +A7AC ; mapped ; 0261 # 7.0 LATIN CAPITAL LETTER SCRIPT G +A7AD ; mapped ; 026C # 7.0 LATIN CAPITAL LETTER L WITH BELT +A7AE ; mapped ; 026A # 9.0 LATIN CAPITAL LETTER SMALL CAPITAL I +A7AF ; disallowed # NA <reserved-A7AF> +A7B0 ; mapped ; 029E # 7.0 LATIN CAPITAL LETTER TURNED K +A7B1 ; mapped ; 0287 # 7.0 LATIN CAPITAL LETTER TURNED T +A7B2 ; mapped ; 029D # 8.0 LATIN CAPITAL LETTER J WITH CROSSED-TAIL +A7B3 ; mapped ; AB53 # 8.0 LATIN CAPITAL LETTER CHI +A7B4 ; mapped ; A7B5 # 8.0 LATIN CAPITAL LETTER BETA +A7B5 ; valid # 8.0 LATIN SMALL LETTER BETA +A7B6 ; mapped ; A7B7 # 8.0 LATIN CAPITAL LETTER OMEGA +A7B7 ; valid # 8.0 LATIN SMALL LETTER OMEGA +A7B8..A7F6 ; disallowed # NA <reserved-A7B8>..<reserved-A7F6> +A7F7 ; valid # 7.0 LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8 ; mapped ; 0127 # 6.1 MODIFIER LETTER CAPITAL H WITH STROKE +A7F9 ; mapped ; 0153 # 6.1 MODIFIER LETTER SMALL LIGATURE OE +A7FA ; valid # 6.0 LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A7FF ; valid # 5.1 LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M +A800..A827 ; valid # 4.1 SYLOTI NAGRI LETTER A..SYLOTI NAGRI VOWEL SIGN OO +A828..A82B ; valid ; ; NV8 # 4.1 SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A82C..A82F ; disallowed # NA <reserved-A82C>..<reserved-A82F> +A830..A839 ; valid ; ; NV8 # 5.2 NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC QUANTITY MARK +A83A..A83F ; disallowed # NA <reserved-A83A>..<reserved-A83F> +A840..A873 ; valid # 5.0 PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A877 ; valid ; ; NV8 # 5.0 PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD +A878..A87F ; disallowed # NA <reserved-A878>..<reserved-A87F> +A880..A8C4 ; valid # 5.1 SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VIRAMA +A8C5 ; valid # 9.0 SAURASHTRA SIGN CANDRABINDU +A8C6..A8CD ; disallowed # NA <reserved-A8C6>..<reserved-A8CD> +A8CE..A8CF ; valid ; ; NV8 # 5.1 SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A8D0..A8D9 ; valid # 5.1 SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE +A8DA..A8DF ; disallowed # NA <reserved-A8DA>..<reserved-A8DF> +A8E0..A8F7 ; valid # 5.2 COMBINING DEVANAGARI DIGIT ZERO..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA ; valid ; ; NV8 # 5.2 DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB ; valid # 5.2 DEVANAGARI HEADSTROKE +A8FC ; valid ; ; NV8 # 8.0 DEVANAGARI SIGN SIDDHAM +A8FD ; valid # 8.0 DEVANAGARI JAIN OM +A8FE..A8FF ; disallowed # NA <reserved-A8FE>..<reserved-A8FF> +A900..A92D ; valid # 5.1 KAYAH LI DIGIT ZERO..KAYAH LI TONE CALYA PLOPHU +A92E..A92F ; valid ; ; NV8 # 5.1 KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA +A930..A953 ; valid # 5.1 REJANG LETTER KA..REJANG VIRAMA +A954..A95E ; disallowed # NA <reserved-A954>..<reserved-A95E> +A95F ; valid ; ; NV8 # 5.1 REJANG SECTION MARK +A960..A97C ; valid ; ; NV8 # 5.2 HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A97D..A97F ; disallowed # NA <reserved-A97D>..<reserved-A97F> +A980..A9C0 ; valid # 5.2 JAVANESE SIGN PANYANGGA..JAVANESE PANGKON +A9C1..A9CD ; valid ; ; NV8 # 5.2 JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH +A9CE ; disallowed # NA <reserved-A9CE> +A9CF..A9D9 ; valid # 5.2 JAVANESE PANGRANGKEP..JAVANESE DIGIT NINE +A9DA..A9DD ; disallowed # NA <reserved-A9DA>..<reserved-A9DD> +A9DE..A9DF ; valid ; ; NV8 # 5.2 JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN +A9E0..A9FE ; valid # 7.0 MYANMAR LETTER SHAN GHA..MYANMAR LETTER TAI LAING BHA +A9FF ; disallowed # NA <reserved-A9FF> +AA00..AA36 ; valid # 5.1 CHAM LETTER A..CHAM CONSONANT SIGN WA +AA37..AA3F ; disallowed # NA <reserved-AA37>..<reserved-AA3F> +AA40..AA4D ; valid # 5.1 CHAM LETTER FINAL K..CHAM CONSONANT SIGN FINAL H +AA4E..AA4F ; disallowed # NA <reserved-AA4E>..<reserved-AA4F> +AA50..AA59 ; valid # 5.1 CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5A..AA5B ; disallowed # NA <reserved-AA5A>..<reserved-AA5B> +AA5C..AA5F ; valid ; ; NV8 # 5.1 CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA +AA60..AA76 ; valid # 5.2 MYANMAR LETTER KHAMTI GA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79 ; valid ; ; NV8 # 5.2 MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A..AA7B ; valid # 5.2 MYANMAR LETTER AITON RA..MYANMAR SIGN PAO KAREN TONE +AA7C..AA7F ; valid # 7.0 MYANMAR SIGN TAI LAING TONE-2..MYANMAR LETTER SHWE PALAUNG SHA +AA80..AAC2 ; valid # 5.2 TAI VIET LETTER LOW KO..TAI VIET TONE MAI SONG +AAC3..AADA ; disallowed # NA <reserved-AAC3>..<reserved-AADA> +AADB..AADD ; valid # 5.2 TAI VIET SYMBOL KON..TAI VIET SYMBOL SAM +AADE..AADF ; valid ; ; NV8 # 5.2 TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI +AAE0..AAEF ; valid # 6.1 MEETEI MAYEK LETTER E..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1 ; valid ; ; NV8 # 6.1 MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2..AAF6 ; valid # 6.1 MEETEI MAYEK ANJI..MEETEI MAYEK VIRAMA +AAF7..AB00 ; disallowed # NA <reserved-AAF7>..<reserved-AB00> +AB01..AB06 ; valid # 6.0 ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB07..AB08 ; disallowed # NA <reserved-AB07>..<reserved-AB08> +AB09..AB0E ; valid # 6.0 ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB0F..AB10 ; disallowed # NA <reserved-AB0F>..<reserved-AB10> +AB11..AB16 ; valid # 6.0 ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB17..AB1F ; disallowed # NA <reserved-AB17>..<reserved-AB1F> +AB20..AB26 ; valid # 6.0 ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB27 ; disallowed # NA <reserved-AB27> +AB28..AB2E ; valid # 6.0 ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB2F ; disallowed # NA <reserved-AB2F> +AB30..AB5A ; valid # 7.0 LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5B ; valid ; ; NV8 # 7.0 MODIFIER BREVE WITH INVERTED BREVE +AB5C ; mapped ; A727 # 7.0 MODIFIER LETTER SMALL HENG +AB5D ; mapped ; AB37 # 7.0 MODIFIER LETTER SMALL L WITH INVERTED LAZY S +AB5E ; mapped ; 026B # 7.0 MODIFIER LETTER SMALL L WITH MIDDLE TILDE +AB5F ; mapped ; AB52 # 7.0 MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB63 ; valid # 8.0 LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER UO +AB64..AB65 ; valid # 7.0 LATIN SMALL LETTER INVERTED ALPHA..GREEK LETTER SMALL CAPITAL OMEGA +AB66..AB6F ; disallowed # NA <reserved-AB66>..<reserved-AB6F> +AB70 ; mapped ; 13A0 # 8.0 CHEROKEE SMALL LETTER A +AB71 ; mapped ; 13A1 # 8.0 CHEROKEE SMALL LETTER E +AB72 ; mapped ; 13A2 # 8.0 CHEROKEE SMALL LETTER I +AB73 ; mapped ; 13A3 # 8.0 CHEROKEE SMALL LETTER O +AB74 ; mapped ; 13A4 # 8.0 CHEROKEE SMALL LETTER U +AB75 ; mapped ; 13A5 # 8.0 CHEROKEE SMALL LETTER V +AB76 ; mapped ; 13A6 # 8.0 CHEROKEE SMALL LETTER GA +AB77 ; mapped ; 13A7 # 8.0 CHEROKEE SMALL LETTER KA +AB78 ; mapped ; 13A8 # 8.0 CHEROKEE SMALL LETTER GE +AB79 ; mapped ; 13A9 # 8.0 CHEROKEE SMALL LETTER GI +AB7A ; mapped ; 13AA # 8.0 CHEROKEE SMALL LETTER GO +AB7B ; mapped ; 13AB # 8.0 CHEROKEE SMALL LETTER GU +AB7C ; mapped ; 13AC # 8.0 CHEROKEE SMALL LETTER GV +AB7D ; mapped ; 13AD # 8.0 CHEROKEE SMALL LETTER HA +AB7E ; mapped ; 13AE # 8.0 CHEROKEE SMALL LETTER HE +AB7F ; mapped ; 13AF # 8.0 CHEROKEE SMALL LETTER HI +AB80 ; mapped ; 13B0 # 8.0 CHEROKEE SMALL LETTER HO +AB81 ; mapped ; 13B1 # 8.0 CHEROKEE SMALL LETTER HU +AB82 ; mapped ; 13B2 # 8.0 CHEROKEE SMALL LETTER HV +AB83 ; mapped ; 13B3 # 8.0 CHEROKEE SMALL LETTER LA +AB84 ; mapped ; 13B4 # 8.0 CHEROKEE SMALL LETTER LE +AB85 ; mapped ; 13B5 # 8.0 CHEROKEE SMALL LETTER LI +AB86 ; mapped ; 13B6 # 8.0 CHEROKEE SMALL LETTER LO +AB87 ; mapped ; 13B7 # 8.0 CHEROKEE SMALL LETTER LU +AB88 ; mapped ; 13B8 # 8.0 CHEROKEE SMALL LETTER LV +AB89 ; mapped ; 13B9 # 8.0 CHEROKEE SMALL LETTER MA +AB8A ; mapped ; 13BA # 8.0 CHEROKEE SMALL LETTER ME +AB8B ; mapped ; 13BB # 8.0 CHEROKEE SMALL LETTER MI +AB8C ; mapped ; 13BC # 8.0 CHEROKEE SMALL LETTER MO +AB8D ; mapped ; 13BD # 8.0 CHEROKEE SMALL LETTER MU +AB8E ; mapped ; 13BE # 8.0 CHEROKEE SMALL LETTER NA +AB8F ; mapped ; 13BF # 8.0 CHEROKEE SMALL LETTER HNA +AB90 ; mapped ; 13C0 # 8.0 CHEROKEE SMALL LETTER NAH +AB91 ; mapped ; 13C1 # 8.0 CHEROKEE SMALL LETTER NE +AB92 ; mapped ; 13C2 # 8.0 CHEROKEE SMALL LETTER NI +AB93 ; mapped ; 13C3 # 8.0 CHEROKEE SMALL LETTER NO +AB94 ; mapped ; 13C4 # 8.0 CHEROKEE SMALL LETTER NU +AB95 ; mapped ; 13C5 # 8.0 CHEROKEE SMALL LETTER NV +AB96 ; mapped ; 13C6 # 8.0 CHEROKEE SMALL LETTER QUA +AB97 ; mapped ; 13C7 # 8.0 CHEROKEE SMALL LETTER QUE +AB98 ; mapped ; 13C8 # 8.0 CHEROKEE SMALL LETTER QUI +AB99 ; mapped ; 13C9 # 8.0 CHEROKEE SMALL LETTER QUO +AB9A ; mapped ; 13CA # 8.0 CHEROKEE SMALL LETTER QUU +AB9B ; mapped ; 13CB # 8.0 CHEROKEE SMALL LETTER QUV +AB9C ; mapped ; 13CC # 8.0 CHEROKEE SMALL LETTER SA +AB9D ; mapped ; 13CD # 8.0 CHEROKEE SMALL LETTER S +AB9E ; mapped ; 13CE # 8.0 CHEROKEE SMALL LETTER SE +AB9F ; mapped ; 13CF # 8.0 CHEROKEE SMALL LETTER SI +ABA0 ; mapped ; 13D0 # 8.0 CHEROKEE SMALL LETTER SO +ABA1 ; mapped ; 13D1 # 8.0 CHEROKEE SMALL LETTER SU +ABA2 ; mapped ; 13D2 # 8.0 CHEROKEE SMALL LETTER SV +ABA3 ; mapped ; 13D3 # 8.0 CHEROKEE SMALL LETTER DA +ABA4 ; mapped ; 13D4 # 8.0 CHEROKEE SMALL LETTER TA +ABA5 ; mapped ; 13D5 # 8.0 CHEROKEE SMALL LETTER DE +ABA6 ; mapped ; 13D6 # 8.0 CHEROKEE SMALL LETTER TE +ABA7 ; mapped ; 13D7 # 8.0 CHEROKEE SMALL LETTER DI +ABA8 ; mapped ; 13D8 # 8.0 CHEROKEE SMALL LETTER TI +ABA9 ; mapped ; 13D9 # 8.0 CHEROKEE SMALL LETTER DO +ABAA ; mapped ; 13DA # 8.0 CHEROKEE SMALL LETTER DU +ABAB ; mapped ; 13DB # 8.0 CHEROKEE SMALL LETTER DV +ABAC ; mapped ; 13DC # 8.0 CHEROKEE SMALL LETTER DLA +ABAD ; mapped ; 13DD # 8.0 CHEROKEE SMALL LETTER TLA +ABAE ; mapped ; 13DE # 8.0 CHEROKEE SMALL LETTER TLE +ABAF ; mapped ; 13DF # 8.0 CHEROKEE SMALL LETTER TLI +ABB0 ; mapped ; 13E0 # 8.0 CHEROKEE SMALL LETTER TLO +ABB1 ; mapped ; 13E1 # 8.0 CHEROKEE SMALL LETTER TLU +ABB2 ; mapped ; 13E2 # 8.0 CHEROKEE SMALL LETTER TLV +ABB3 ; mapped ; 13E3 # 8.0 CHEROKEE SMALL LETTER TSA +ABB4 ; mapped ; 13E4 # 8.0 CHEROKEE SMALL LETTER TSE +ABB5 ; mapped ; 13E5 # 8.0 CHEROKEE SMALL LETTER TSI +ABB6 ; mapped ; 13E6 # 8.0 CHEROKEE SMALL LETTER TSO +ABB7 ; mapped ; 13E7 # 8.0 CHEROKEE SMALL LETTER TSU +ABB8 ; mapped ; 13E8 # 8.0 CHEROKEE SMALL LETTER TSV +ABB9 ; mapped ; 13E9 # 8.0 CHEROKEE SMALL LETTER WA +ABBA ; mapped ; 13EA # 8.0 CHEROKEE SMALL LETTER WE +ABBB ; mapped ; 13EB # 8.0 CHEROKEE SMALL LETTER WI +ABBC ; mapped ; 13EC # 8.0 CHEROKEE SMALL LETTER WO +ABBD ; mapped ; 13ED # 8.0 CHEROKEE SMALL LETTER WU +ABBE ; mapped ; 13EE # 8.0 CHEROKEE SMALL LETTER WV +ABBF ; mapped ; 13EF # 8.0 CHEROKEE SMALL LETTER YA +ABC0..ABEA ; valid # 5.2 MEETEI MAYEK LETTER KOK..MEETEI MAYEK VOWEL SIGN NUNG +ABEB ; valid ; ; NV8 # 5.2 MEETEI MAYEK CHEIKHEI +ABEC..ABED ; valid # 5.2 MEETEI MAYEK LUM IYEK..MEETEI MAYEK APUN IYEK +ABEE..ABEF ; disallowed # NA <reserved-ABEE>..<reserved-ABEF> +ABF0..ABF9 ; valid # 5.2 MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +ABFA..ABFF ; disallowed # NA <reserved-ABFA>..<reserved-ABFF> +AC00..D7A3 ; valid # 2.0 HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7A4..D7AF ; disallowed # NA <reserved-D7A4>..<reserved-D7AF> +D7B0..D7C6 ; valid ; ; NV8 # 5.2 HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7C7..D7CA ; disallowed # NA <reserved-D7C7>..<reserved-D7CA> +D7CB..D7FB ; valid ; ; NV8 # 5.2 HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +D7FC..D7FF ; disallowed # NA <reserved-D7FC>..<reserved-D7FF> +D800..DFFF ; disallowed # 2.0 <surrogate-D800>..<surrogate-DFFF> +E000..F8FF ; disallowed # 1.1 <private-use-E000>..<private-use-F8FF> +F900 ; mapped ; 8C48 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F900 +F901 ; mapped ; 66F4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F901 +F902 ; mapped ; 8ECA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F902 +F903 ; mapped ; 8CC8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F903 +F904 ; mapped ; 6ED1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F904 +F905 ; mapped ; 4E32 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F905 +F906 ; mapped ; 53E5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F906 +F907..F908 ; mapped ; 9F9C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F907..CJK COMPATIBILITY IDEOGRAPH-F908 +F909 ; mapped ; 5951 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F909 +F90A ; mapped ; 91D1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90A +F90B ; mapped ; 5587 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90B +F90C ; mapped ; 5948 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90C +F90D ; mapped ; 61F6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90D +F90E ; mapped ; 7669 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90E +F90F ; mapped ; 7F85 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F90F +F910 ; mapped ; 863F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F910 +F911 ; mapped ; 87BA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F911 +F912 ; mapped ; 88F8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F912 +F913 ; mapped ; 908F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F913 +F914 ; mapped ; 6A02 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F914 +F915 ; mapped ; 6D1B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F915 +F916 ; mapped ; 70D9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F916 +F917 ; mapped ; 73DE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F917 +F918 ; mapped ; 843D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F918 +F919 ; mapped ; 916A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F919 +F91A ; mapped ; 99F1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91A +F91B ; mapped ; 4E82 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91B +F91C ; mapped ; 5375 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91C +F91D ; mapped ; 6B04 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91D +F91E ; mapped ; 721B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91E +F91F ; mapped ; 862D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F91F +F920 ; mapped ; 9E1E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F920 +F921 ; mapped ; 5D50 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F921 +F922 ; mapped ; 6FEB # 1.1 CJK COMPATIBILITY IDEOGRAPH-F922 +F923 ; mapped ; 85CD # 1.1 CJK COMPATIBILITY IDEOGRAPH-F923 +F924 ; mapped ; 8964 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F924 +F925 ; mapped ; 62C9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F925 +F926 ; mapped ; 81D8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F926 +F927 ; mapped ; 881F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F927 +F928 ; mapped ; 5ECA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F928 +F929 ; mapped ; 6717 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F929 +F92A ; mapped ; 6D6A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92A +F92B ; mapped ; 72FC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92B +F92C ; mapped ; 90CE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92C +F92D ; mapped ; 4F86 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92D +F92E ; mapped ; 51B7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92E +F92F ; mapped ; 52DE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F92F +F930 ; mapped ; 64C4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F930 +F931 ; mapped ; 6AD3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F931 +F932 ; mapped ; 7210 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F932 +F933 ; mapped ; 76E7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F933 +F934 ; mapped ; 8001 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F934 +F935 ; mapped ; 8606 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F935 +F936 ; mapped ; 865C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F936 +F937 ; mapped ; 8DEF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F937 +F938 ; mapped ; 9732 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F938 +F939 ; mapped ; 9B6F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F939 +F93A ; mapped ; 9DFA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93A +F93B ; mapped ; 788C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93B +F93C ; mapped ; 797F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93C +F93D ; mapped ; 7DA0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93D +F93E ; mapped ; 83C9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93E +F93F ; mapped ; 9304 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F93F +F940 ; mapped ; 9E7F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F940 +F941 ; mapped ; 8AD6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F941 +F942 ; mapped ; 58DF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F942 +F943 ; mapped ; 5F04 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F943 +F944 ; mapped ; 7C60 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F944 +F945 ; mapped ; 807E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F945 +F946 ; mapped ; 7262 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F946 +F947 ; mapped ; 78CA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F947 +F948 ; mapped ; 8CC2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F948 +F949 ; mapped ; 96F7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F949 +F94A ; mapped ; 58D8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94A +F94B ; mapped ; 5C62 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94B +F94C ; mapped ; 6A13 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94C +F94D ; mapped ; 6DDA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94D +F94E ; mapped ; 6F0F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94E +F94F ; mapped ; 7D2F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F94F +F950 ; mapped ; 7E37 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F950 +F951 ; mapped ; 964B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F951 +F952 ; mapped ; 52D2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F952 +F953 ; mapped ; 808B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F953 +F954 ; mapped ; 51DC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F954 +F955 ; mapped ; 51CC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F955 +F956 ; mapped ; 7A1C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F956 +F957 ; mapped ; 7DBE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F957 +F958 ; mapped ; 83F1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F958 +F959 ; mapped ; 9675 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F959 +F95A ; mapped ; 8B80 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95A +F95B ; mapped ; 62CF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95B +F95C ; mapped ; 6A02 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95C +F95D ; mapped ; 8AFE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95D +F95E ; mapped ; 4E39 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95E +F95F ; mapped ; 5BE7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F95F +F960 ; mapped ; 6012 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F960 +F961 ; mapped ; 7387 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F961 +F962 ; mapped ; 7570 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F962 +F963 ; mapped ; 5317 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F963 +F964 ; mapped ; 78FB # 1.1 CJK COMPATIBILITY IDEOGRAPH-F964 +F965 ; mapped ; 4FBF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F965 +F966 ; mapped ; 5FA9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F966 +F967 ; mapped ; 4E0D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F967 +F968 ; mapped ; 6CCC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F968 +F969 ; mapped ; 6578 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F969 +F96A ; mapped ; 7D22 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96A +F96B ; mapped ; 53C3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96B +F96C ; mapped ; 585E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96C +F96D ; mapped ; 7701 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96D +F96E ; mapped ; 8449 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96E +F96F ; mapped ; 8AAA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F96F +F970 ; mapped ; 6BBA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F970 +F971 ; mapped ; 8FB0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F971 +F972 ; mapped ; 6C88 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F972 +F973 ; mapped ; 62FE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F973 +F974 ; mapped ; 82E5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F974 +F975 ; mapped ; 63A0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F975 +F976 ; mapped ; 7565 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F976 +F977 ; mapped ; 4EAE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F977 +F978 ; mapped ; 5169 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F978 +F979 ; mapped ; 51C9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F979 +F97A ; mapped ; 6881 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97A +F97B ; mapped ; 7CE7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97B +F97C ; mapped ; 826F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97C +F97D ; mapped ; 8AD2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97D +F97E ; mapped ; 91CF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97E +F97F ; mapped ; 52F5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F97F +F980 ; mapped ; 5442 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F980 +F981 ; mapped ; 5973 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F981 +F982 ; mapped ; 5EEC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F982 +F983 ; mapped ; 65C5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F983 +F984 ; mapped ; 6FFE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F984 +F985 ; mapped ; 792A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F985 +F986 ; mapped ; 95AD # 1.1 CJK COMPATIBILITY IDEOGRAPH-F986 +F987 ; mapped ; 9A6A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F987 +F988 ; mapped ; 9E97 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F988 +F989 ; mapped ; 9ECE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F989 +F98A ; mapped ; 529B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98A +F98B ; mapped ; 66C6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98B +F98C ; mapped ; 6B77 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98C +F98D ; mapped ; 8F62 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98D +F98E ; mapped ; 5E74 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98E +F98F ; mapped ; 6190 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F98F +F990 ; mapped ; 6200 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F990 +F991 ; mapped ; 649A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F991 +F992 ; mapped ; 6F23 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F992 +F993 ; mapped ; 7149 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F993 +F994 ; mapped ; 7489 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F994 +F995 ; mapped ; 79CA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F995 +F996 ; mapped ; 7DF4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F996 +F997 ; mapped ; 806F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F997 +F998 ; mapped ; 8F26 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F998 +F999 ; mapped ; 84EE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F999 +F99A ; mapped ; 9023 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99A +F99B ; mapped ; 934A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99B +F99C ; mapped ; 5217 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99C +F99D ; mapped ; 52A3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99D +F99E ; mapped ; 54BD # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99E +F99F ; mapped ; 70C8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F99F +F9A0 ; mapped ; 88C2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A0 +F9A1 ; mapped ; 8AAA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A1 +F9A2 ; mapped ; 5EC9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A2 +F9A3 ; mapped ; 5FF5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A3 +F9A4 ; mapped ; 637B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A4 +F9A5 ; mapped ; 6BAE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A5 +F9A6 ; mapped ; 7C3E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A6 +F9A7 ; mapped ; 7375 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A7 +F9A8 ; mapped ; 4EE4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A8 +F9A9 ; mapped ; 56F9 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9A9 +F9AA ; mapped ; 5BE7 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AA +F9AB ; mapped ; 5DBA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AB +F9AC ; mapped ; 601C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AC +F9AD ; mapped ; 73B2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AD +F9AE ; mapped ; 7469 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AE +F9AF ; mapped ; 7F9A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9AF +F9B0 ; mapped ; 8046 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B0 +F9B1 ; mapped ; 9234 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B1 +F9B2 ; mapped ; 96F6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B2 +F9B3 ; mapped ; 9748 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B3 +F9B4 ; mapped ; 9818 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B4 +F9B5 ; mapped ; 4F8B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B5 +F9B6 ; mapped ; 79AE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B6 +F9B7 ; mapped ; 91B4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B7 +F9B8 ; mapped ; 96B8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B8 +F9B9 ; mapped ; 60E1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9B9 +F9BA ; mapped ; 4E86 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BA +F9BB ; mapped ; 50DA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BB +F9BC ; mapped ; 5BEE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BC +F9BD ; mapped ; 5C3F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BD +F9BE ; mapped ; 6599 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BE +F9BF ; mapped ; 6A02 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9BF +F9C0 ; mapped ; 71CE # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C0 +F9C1 ; mapped ; 7642 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C1 +F9C2 ; mapped ; 84FC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C2 +F9C3 ; mapped ; 907C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C3 +F9C4 ; mapped ; 9F8D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C4 +F9C5 ; mapped ; 6688 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C5 +F9C6 ; mapped ; 962E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C6 +F9C7 ; mapped ; 5289 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C7 +F9C8 ; mapped ; 677B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C8 +F9C9 ; mapped ; 67F3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9C9 +F9CA ; mapped ; 6D41 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CA +F9CB ; mapped ; 6E9C # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CB +F9CC ; mapped ; 7409 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CC +F9CD ; mapped ; 7559 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CD +F9CE ; mapped ; 786B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CE +F9CF ; mapped ; 7D10 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9CF +F9D0 ; mapped ; 985E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D0 +F9D1 ; mapped ; 516D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D1 +F9D2 ; mapped ; 622E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D2 +F9D3 ; mapped ; 9678 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D3 +F9D4 ; mapped ; 502B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D4 +F9D5 ; mapped ; 5D19 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D5 +F9D6 ; mapped ; 6DEA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D6 +F9D7 ; mapped ; 8F2A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D7 +F9D8 ; mapped ; 5F8B # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D8 +F9D9 ; mapped ; 6144 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9D9 +F9DA ; mapped ; 6817 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DA +F9DB ; mapped ; 7387 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DB +F9DC ; mapped ; 9686 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DC +F9DD ; mapped ; 5229 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DD +F9DE ; mapped ; 540F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DE +F9DF ; mapped ; 5C65 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9DF +F9E0 ; mapped ; 6613 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E0 +F9E1 ; mapped ; 674E # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E1 +F9E2 ; mapped ; 68A8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E2 +F9E3 ; mapped ; 6CE5 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E3 +F9E4 ; mapped ; 7406 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E4 +F9E5 ; mapped ; 75E2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E5 +F9E6 ; mapped ; 7F79 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E6 +F9E7 ; mapped ; 88CF # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E7 +F9E8 ; mapped ; 88E1 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E8 +F9E9 ; mapped ; 91CC # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9E9 +F9EA ; mapped ; 96E2 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EA +F9EB ; mapped ; 533F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EB +F9EC ; mapped ; 6EBA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EC +F9ED ; mapped ; 541D # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9ED +F9EE ; mapped ; 71D0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EE +F9EF ; mapped ; 7498 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9EF +F9F0 ; mapped ; 85FA # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F0 +F9F1 ; mapped ; 96A3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F1 +F9F2 ; mapped ; 9C57 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F2 +F9F3 ; mapped ; 9E9F # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F3 +F9F4 ; mapped ; 6797 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F4 +F9F5 ; mapped ; 6DCB # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F5 +F9F6 ; mapped ; 81E8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F6 +F9F7 ; mapped ; 7ACB # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F7 +F9F8 ; mapped ; 7B20 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F8 +F9F9 ; mapped ; 7C92 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9F9 +F9FA ; mapped ; 72C0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FA +F9FB ; mapped ; 7099 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FB +F9FC ; mapped ; 8B58 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FC +F9FD ; mapped ; 4EC0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FD +F9FE ; mapped ; 8336 # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FE +F9FF ; mapped ; 523A # 1.1 CJK COMPATIBILITY IDEOGRAPH-F9FF +FA00 ; mapped ; 5207 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA00 +FA01 ; mapped ; 5EA6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA01 +FA02 ; mapped ; 62D3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA02 +FA03 ; mapped ; 7CD6 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA03 +FA04 ; mapped ; 5B85 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA04 +FA05 ; mapped ; 6D1E # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA05 +FA06 ; mapped ; 66B4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA06 +FA07 ; mapped ; 8F3B # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA07 +FA08 ; mapped ; 884C # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA08 +FA09 ; mapped ; 964D # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA09 +FA0A ; mapped ; 898B # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0A +FA0B ; mapped ; 5ED3 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0B +FA0C ; mapped ; 5140 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0C +FA0D ; mapped ; 55C0 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0D +FA0E..FA0F ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F +FA10 ; mapped ; 585A # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA10 +FA11 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA11 +FA12 ; mapped ; 6674 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA12 +FA13..FA14 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14 +FA15 ; mapped ; 51DE # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA15 +FA16 ; mapped ; 732A # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA16 +FA17 ; mapped ; 76CA # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA17 +FA18 ; mapped ; 793C # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA18 +FA19 ; mapped ; 795E # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA19 +FA1A ; mapped ; 7965 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1A +FA1B ; mapped ; 798F # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1B +FA1C ; mapped ; 9756 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1C +FA1D ; mapped ; 7CBE # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1D +FA1E ; mapped ; 7FBD # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1E +FA1F ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA1F +FA20 ; mapped ; 8612 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA20 +FA21 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA21 +FA22 ; mapped ; 8AF8 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA22 +FA23..FA24 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24 +FA25 ; mapped ; 9038 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA25 +FA26 ; mapped ; 90FD # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA26 +FA27..FA29 ; valid # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29 +FA2A ; mapped ; 98EF # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA2A +FA2B ; mapped ; 98FC # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA2B +FA2C ; mapped ; 9928 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA2C +FA2D ; mapped ; 9DB4 # 1.1 CJK COMPATIBILITY IDEOGRAPH-FA2D +FA2E ; mapped ; 90DE # 6.1 CJK COMPATIBILITY IDEOGRAPH-FA2E +FA2F ; mapped ; 96B7 # 6.1 CJK COMPATIBILITY IDEOGRAPH-FA2F +FA30 ; mapped ; 4FAE # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA30 +FA31 ; mapped ; 50E7 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA31 +FA32 ; mapped ; 514D # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA32 +FA33 ; mapped ; 52C9 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA33 +FA34 ; mapped ; 52E4 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA34 +FA35 ; mapped ; 5351 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA35 +FA36 ; mapped ; 559D # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA36 +FA37 ; mapped ; 5606 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA37 +FA38 ; mapped ; 5668 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA38 +FA39 ; mapped ; 5840 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA39 +FA3A ; mapped ; 58A8 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3A +FA3B ; mapped ; 5C64 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3B +FA3C ; mapped ; 5C6E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3C +FA3D ; mapped ; 6094 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3D +FA3E ; mapped ; 6168 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3E +FA3F ; mapped ; 618E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA3F +FA40 ; mapped ; 61F2 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA40 +FA41 ; mapped ; 654F # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA41 +FA42 ; mapped ; 65E2 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA42 +FA43 ; mapped ; 6691 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA43 +FA44 ; mapped ; 6885 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA44 +FA45 ; mapped ; 6D77 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA45 +FA46 ; mapped ; 6E1A # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA46 +FA47 ; mapped ; 6F22 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA47 +FA48 ; mapped ; 716E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA48 +FA49 ; mapped ; 722B # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA49 +FA4A ; mapped ; 7422 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4A +FA4B ; mapped ; 7891 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4B +FA4C ; mapped ; 793E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4C +FA4D ; mapped ; 7949 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4D +FA4E ; mapped ; 7948 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4E +FA4F ; mapped ; 7950 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA4F +FA50 ; mapped ; 7956 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA50 +FA51 ; mapped ; 795D # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA51 +FA52 ; mapped ; 798D # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA52 +FA53 ; mapped ; 798E # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA53 +FA54 ; mapped ; 7A40 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA54 +FA55 ; mapped ; 7A81 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA55 +FA56 ; mapped ; 7BC0 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA56 +FA57 ; mapped ; 7DF4 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA57 +FA58 ; mapped ; 7E09 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA58 +FA59 ; mapped ; 7E41 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA59 +FA5A ; mapped ; 7F72 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5A +FA5B ; mapped ; 8005 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5B +FA5C ; mapped ; 81ED # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5C +FA5D..FA5E ; mapped ; 8279 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5D..CJK COMPATIBILITY IDEOGRAPH-FA5E +FA5F ; mapped ; 8457 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA5F +FA60 ; mapped ; 8910 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA60 +FA61 ; mapped ; 8996 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA61 +FA62 ; mapped ; 8B01 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA62 +FA63 ; mapped ; 8B39 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA63 +FA64 ; mapped ; 8CD3 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA64 +FA65 ; mapped ; 8D08 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA65 +FA66 ; mapped ; 8FB6 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA66 +FA67 ; mapped ; 9038 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA67 +FA68 ; mapped ; 96E3 # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA68 +FA69 ; mapped ; 97FF # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA69 +FA6A ; mapped ; 983B # 3.2 CJK COMPATIBILITY IDEOGRAPH-FA6A +FA6B ; mapped ; 6075 # 5.2 CJK COMPATIBILITY IDEOGRAPH-FA6B +FA6C ; mapped ; 242EE # 5.2 CJK COMPATIBILITY IDEOGRAPH-FA6C +FA6D ; mapped ; 8218 # 5.2 CJK COMPATIBILITY IDEOGRAPH-FA6D +FA6E..FA6F ; disallowed # NA <reserved-FA6E>..<reserved-FA6F> +FA70 ; mapped ; 4E26 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA70 +FA71 ; mapped ; 51B5 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA71 +FA72 ; mapped ; 5168 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA72 +FA73 ; mapped ; 4F80 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA73 +FA74 ; mapped ; 5145 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA74 +FA75 ; mapped ; 5180 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA75 +FA76 ; mapped ; 52C7 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA76 +FA77 ; mapped ; 52FA # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA77 +FA78 ; mapped ; 559D # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA78 +FA79 ; mapped ; 5555 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA79 +FA7A ; mapped ; 5599 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7A +FA7B ; mapped ; 55E2 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7B +FA7C ; mapped ; 585A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7C +FA7D ; mapped ; 58B3 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7D +FA7E ; mapped ; 5944 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7E +FA7F ; mapped ; 5954 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA7F +FA80 ; mapped ; 5A62 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA80 +FA81 ; mapped ; 5B28 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA81 +FA82 ; mapped ; 5ED2 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA82 +FA83 ; mapped ; 5ED9 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA83 +FA84 ; mapped ; 5F69 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA84 +FA85 ; mapped ; 5FAD # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA85 +FA86 ; mapped ; 60D8 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA86 +FA87 ; mapped ; 614E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA87 +FA88 ; mapped ; 6108 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA88 +FA89 ; mapped ; 618E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA89 +FA8A ; mapped ; 6160 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8A +FA8B ; mapped ; 61F2 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8B +FA8C ; mapped ; 6234 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8C +FA8D ; mapped ; 63C4 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8D +FA8E ; mapped ; 641C # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8E +FA8F ; mapped ; 6452 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA8F +FA90 ; mapped ; 6556 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA90 +FA91 ; mapped ; 6674 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA91 +FA92 ; mapped ; 6717 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA92 +FA93 ; mapped ; 671B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA93 +FA94 ; mapped ; 6756 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA94 +FA95 ; mapped ; 6B79 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA95 +FA96 ; mapped ; 6BBA # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA96 +FA97 ; mapped ; 6D41 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA97 +FA98 ; mapped ; 6EDB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA98 +FA99 ; mapped ; 6ECB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA99 +FA9A ; mapped ; 6F22 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9A +FA9B ; mapped ; 701E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9B +FA9C ; mapped ; 716E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9C +FA9D ; mapped ; 77A7 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9D +FA9E ; mapped ; 7235 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9E +FA9F ; mapped ; 72AF # 4.1 CJK COMPATIBILITY IDEOGRAPH-FA9F +FAA0 ; mapped ; 732A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA0 +FAA1 ; mapped ; 7471 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA1 +FAA2 ; mapped ; 7506 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA2 +FAA3 ; mapped ; 753B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA3 +FAA4 ; mapped ; 761D # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA4 +FAA5 ; mapped ; 761F # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA5 +FAA6 ; mapped ; 76CA # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA6 +FAA7 ; mapped ; 76DB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA7 +FAA8 ; mapped ; 76F4 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA8 +FAA9 ; mapped ; 774A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAA9 +FAAA ; mapped ; 7740 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAA +FAAB ; mapped ; 78CC # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAB +FAAC ; mapped ; 7AB1 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAC +FAAD ; mapped ; 7BC0 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAD +FAAE ; mapped ; 7C7B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAE +FAAF ; mapped ; 7D5B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAAF +FAB0 ; mapped ; 7DF4 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB0 +FAB1 ; mapped ; 7F3E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB1 +FAB2 ; mapped ; 8005 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB2 +FAB3 ; mapped ; 8352 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB3 +FAB4 ; mapped ; 83EF # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB4 +FAB5 ; mapped ; 8779 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB5 +FAB6 ; mapped ; 8941 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB6 +FAB7 ; mapped ; 8986 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB7 +FAB8 ; mapped ; 8996 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB8 +FAB9 ; mapped ; 8ABF # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAB9 +FABA ; mapped ; 8AF8 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABA +FABB ; mapped ; 8ACB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABB +FABC ; mapped ; 8B01 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABC +FABD ; mapped ; 8AFE # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABD +FABE ; mapped ; 8AED # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABE +FABF ; mapped ; 8B39 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FABF +FAC0 ; mapped ; 8B8A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC0 +FAC1 ; mapped ; 8D08 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC1 +FAC2 ; mapped ; 8F38 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC2 +FAC3 ; mapped ; 9072 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC3 +FAC4 ; mapped ; 9199 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC4 +FAC5 ; mapped ; 9276 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC5 +FAC6 ; mapped ; 967C # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC6 +FAC7 ; mapped ; 96E3 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC7 +FAC8 ; mapped ; 9756 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC8 +FAC9 ; mapped ; 97DB # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAC9 +FACA ; mapped ; 97FF # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACA +FACB ; mapped ; 980B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACB +FACC ; mapped ; 983B # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACC +FACD ; mapped ; 9B12 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACD +FACE ; mapped ; 9F9C # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACE +FACF ; mapped ; 2284A # 4.1 CJK COMPATIBILITY IDEOGRAPH-FACF +FAD0 ; mapped ; 22844 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD0 +FAD1 ; mapped ; 233D5 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD1 +FAD2 ; mapped ; 3B9D # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD2 +FAD3 ; mapped ; 4018 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD3 +FAD4 ; mapped ; 4039 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD4 +FAD5 ; mapped ; 25249 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD5 +FAD6 ; mapped ; 25CD0 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD6 +FAD7 ; mapped ; 27ED3 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD7 +FAD8 ; mapped ; 9F43 # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD8 +FAD9 ; mapped ; 9F8E # 4.1 CJK COMPATIBILITY IDEOGRAPH-FAD9 +FADA..FAFF ; disallowed # NA <reserved-FADA>..<reserved-FAFF> +FB00 ; mapped ; 0066 0066 # 1.1 LATIN SMALL LIGATURE FF +FB01 ; mapped ; 0066 0069 # 1.1 LATIN SMALL LIGATURE FI +FB02 ; mapped ; 0066 006C # 1.1 LATIN SMALL LIGATURE FL +FB03 ; mapped ; 0066 0066 0069 #1.1 LATIN SMALL LIGATURE FFI +FB04 ; mapped ; 0066 0066 006C #1.1 LATIN SMALL LIGATURE FFL +FB05..FB06 ; mapped ; 0073 0074 # 1.1 LATIN SMALL LIGATURE LONG S T..LATIN SMALL LIGATURE ST +FB07..FB12 ; disallowed # NA <reserved-FB07>..<reserved-FB12> +FB13 ; mapped ; 0574 0576 # 1.1 ARMENIAN SMALL LIGATURE MEN NOW +FB14 ; mapped ; 0574 0565 # 1.1 ARMENIAN SMALL LIGATURE MEN ECH +FB15 ; mapped ; 0574 056B # 1.1 ARMENIAN SMALL LIGATURE MEN INI +FB16 ; mapped ; 057E 0576 # 1.1 ARMENIAN SMALL LIGATURE VEW NOW +FB17 ; mapped ; 0574 056D # 1.1 ARMENIAN SMALL LIGATURE MEN XEH +FB18..FB1C ; disallowed # NA <reserved-FB18>..<reserved-FB1C> +FB1D ; mapped ; 05D9 05B4 # 3.0 HEBREW LETTER YOD WITH HIRIQ +FB1E ; valid # 1.1 HEBREW POINT JUDEO-SPANISH VARIKA +FB1F ; mapped ; 05F2 05B7 # 1.1 HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB20 ; mapped ; 05E2 # 1.1 HEBREW LETTER ALTERNATIVE AYIN +FB21 ; mapped ; 05D0 # 1.1 HEBREW LETTER WIDE ALEF +FB22 ; mapped ; 05D3 # 1.1 HEBREW LETTER WIDE DALET +FB23 ; mapped ; 05D4 # 1.1 HEBREW LETTER WIDE HE +FB24 ; mapped ; 05DB # 1.1 HEBREW LETTER WIDE KAF +FB25 ; mapped ; 05DC # 1.1 HEBREW LETTER WIDE LAMED +FB26 ; mapped ; 05DD # 1.1 HEBREW LETTER WIDE FINAL MEM +FB27 ; mapped ; 05E8 # 1.1 HEBREW LETTER WIDE RESH +FB28 ; mapped ; 05EA # 1.1 HEBREW LETTER WIDE TAV +FB29 ; disallowed_STD3_mapped ; 002B # 1.1 HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A ; mapped ; 05E9 05C1 # 1.1 HEBREW LETTER SHIN WITH SHIN DOT +FB2B ; mapped ; 05E9 05C2 # 1.1 HEBREW LETTER SHIN WITH SIN DOT +FB2C ; mapped ; 05E9 05BC 05C1 #1.1 HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +FB2D ; mapped ; 05E9 05BC 05C2 #1.1 HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2E ; mapped ; 05D0 05B7 # 1.1 HEBREW LETTER ALEF WITH PATAH +FB2F ; mapped ; 05D0 05B8 # 1.1 HEBREW LETTER ALEF WITH QAMATS +FB30 ; mapped ; 05D0 05BC # 1.1 HEBREW LETTER ALEF WITH MAPIQ +FB31 ; mapped ; 05D1 05BC # 1.1 HEBREW LETTER BET WITH DAGESH +FB32 ; mapped ; 05D2 05BC # 1.1 HEBREW LETTER GIMEL WITH DAGESH +FB33 ; mapped ; 05D3 05BC # 1.1 HEBREW LETTER DALET WITH DAGESH +FB34 ; mapped ; 05D4 05BC # 1.1 HEBREW LETTER HE WITH MAPIQ +FB35 ; mapped ; 05D5 05BC # 1.1 HEBREW LETTER VAV WITH DAGESH +FB36 ; mapped ; 05D6 05BC # 1.1 HEBREW LETTER ZAYIN WITH DAGESH +FB37 ; disallowed # NA <reserved-FB37> +FB38 ; mapped ; 05D8 05BC # 1.1 HEBREW LETTER TET WITH DAGESH +FB39 ; mapped ; 05D9 05BC # 1.1 HEBREW LETTER YOD WITH DAGESH +FB3A ; mapped ; 05DA 05BC # 1.1 HEBREW LETTER FINAL KAF WITH DAGESH +FB3B ; mapped ; 05DB 05BC # 1.1 HEBREW LETTER KAF WITH DAGESH +FB3C ; mapped ; 05DC 05BC # 1.1 HEBREW LETTER LAMED WITH DAGESH +FB3D ; disallowed # NA <reserved-FB3D> +FB3E ; mapped ; 05DE 05BC # 1.1 HEBREW LETTER MEM WITH DAGESH +FB3F ; disallowed # NA <reserved-FB3F> +FB40 ; mapped ; 05E0 05BC # 1.1 HEBREW LETTER NUN WITH DAGESH +FB41 ; mapped ; 05E1 05BC # 1.1 HEBREW LETTER SAMEKH WITH DAGESH +FB42 ; disallowed # NA <reserved-FB42> +FB43 ; mapped ; 05E3 05BC # 1.1 HEBREW LETTER FINAL PE WITH DAGESH +FB44 ; mapped ; 05E4 05BC # 1.1 HEBREW LETTER PE WITH DAGESH +FB45 ; disallowed # NA <reserved-FB45> +FB46 ; mapped ; 05E6 05BC # 1.1 HEBREW LETTER TSADI WITH DAGESH +FB47 ; mapped ; 05E7 05BC # 1.1 HEBREW LETTER QOF WITH DAGESH +FB48 ; mapped ; 05E8 05BC # 1.1 HEBREW LETTER RESH WITH DAGESH +FB49 ; mapped ; 05E9 05BC # 1.1 HEBREW LETTER SHIN WITH DAGESH +FB4A ; mapped ; 05EA 05BC # 1.1 HEBREW LETTER TAV WITH DAGESH +FB4B ; mapped ; 05D5 05B9 # 1.1 HEBREW LETTER VAV WITH HOLAM +FB4C ; mapped ; 05D1 05BF # 1.1 HEBREW LETTER BET WITH RAFE +FB4D ; mapped ; 05DB 05BF # 1.1 HEBREW LETTER KAF WITH RAFE +FB4E ; mapped ; 05E4 05BF # 1.1 HEBREW LETTER PE WITH RAFE +FB4F ; mapped ; 05D0 05DC # 1.1 HEBREW LIGATURE ALEF LAMED +FB50..FB51 ; mapped ; 0671 # 1.1 ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER ALEF WASLA FINAL FORM +FB52..FB55 ; mapped ; 067B # 1.1 ARABIC LETTER BEEH ISOLATED FORM..ARABIC LETTER BEEH MEDIAL FORM +FB56..FB59 ; mapped ; 067E # 1.1 ARABIC LETTER PEH ISOLATED FORM..ARABIC LETTER PEH MEDIAL FORM +FB5A..FB5D ; mapped ; 0680 # 1.1 ARABIC LETTER BEHEH ISOLATED FORM..ARABIC LETTER BEHEH MEDIAL FORM +FB5E..FB61 ; mapped ; 067A # 1.1 ARABIC LETTER TTEHEH ISOLATED FORM..ARABIC LETTER TTEHEH MEDIAL FORM +FB62..FB65 ; mapped ; 067F # 1.1 ARABIC LETTER TEHEH ISOLATED FORM..ARABIC LETTER TEHEH MEDIAL FORM +FB66..FB69 ; mapped ; 0679 # 1.1 ARABIC LETTER TTEH ISOLATED FORM..ARABIC LETTER TTEH MEDIAL FORM +FB6A..FB6D ; mapped ; 06A4 # 1.1 ARABIC LETTER VEH ISOLATED FORM..ARABIC LETTER VEH MEDIAL FORM +FB6E..FB71 ; mapped ; 06A6 # 1.1 ARABIC LETTER PEHEH ISOLATED FORM..ARABIC LETTER PEHEH MEDIAL FORM +FB72..FB75 ; mapped ; 0684 # 1.1 ARABIC LETTER DYEH ISOLATED FORM..ARABIC LETTER DYEH MEDIAL FORM +FB76..FB79 ; mapped ; 0683 # 1.1 ARABIC LETTER NYEH ISOLATED FORM..ARABIC LETTER NYEH MEDIAL FORM +FB7A..FB7D ; mapped ; 0686 # 1.1 ARABIC LETTER TCHEH ISOLATED FORM..ARABIC LETTER TCHEH MEDIAL FORM +FB7E..FB81 ; mapped ; 0687 # 1.1 ARABIC LETTER TCHEHEH ISOLATED FORM..ARABIC LETTER TCHEHEH MEDIAL FORM +FB82..FB83 ; mapped ; 068D # 1.1 ARABIC LETTER DDAHAL ISOLATED FORM..ARABIC LETTER DDAHAL FINAL FORM +FB84..FB85 ; mapped ; 068C # 1.1 ARABIC LETTER DAHAL ISOLATED FORM..ARABIC LETTER DAHAL FINAL FORM +FB86..FB87 ; mapped ; 068E # 1.1 ARABIC LETTER DUL ISOLATED FORM..ARABIC LETTER DUL FINAL FORM +FB88..FB89 ; mapped ; 0688 # 1.1 ARABIC LETTER DDAL ISOLATED FORM..ARABIC LETTER DDAL FINAL FORM +FB8A..FB8B ; mapped ; 0698 # 1.1 ARABIC LETTER JEH ISOLATED FORM..ARABIC LETTER JEH FINAL FORM +FB8C..FB8D ; mapped ; 0691 # 1.1 ARABIC LETTER RREH ISOLATED FORM..ARABIC LETTER RREH FINAL FORM +FB8E..FB91 ; mapped ; 06A9 # 1.1 ARABIC LETTER KEHEH ISOLATED FORM..ARABIC LETTER KEHEH MEDIAL FORM +FB92..FB95 ; mapped ; 06AF # 1.1 ARABIC LETTER GAF ISOLATED FORM..ARABIC LETTER GAF MEDIAL FORM +FB96..FB99 ; mapped ; 06B3 # 1.1 ARABIC LETTER GUEH ISOLATED FORM..ARABIC LETTER GUEH MEDIAL FORM +FB9A..FB9D ; mapped ; 06B1 # 1.1 ARABIC LETTER NGOEH ISOLATED FORM..ARABIC LETTER NGOEH MEDIAL FORM +FB9E..FB9F ; mapped ; 06BA # 1.1 ARABIC LETTER NOON GHUNNA ISOLATED FORM..ARABIC LETTER NOON GHUNNA FINAL FORM +FBA0..FBA3 ; mapped ; 06BB # 1.1 ARABIC LETTER RNOON ISOLATED FORM..ARABIC LETTER RNOON MEDIAL FORM +FBA4..FBA5 ; mapped ; 06C0 # 1.1 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM..ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA6..FBA9 ; mapped ; 06C1 # 1.1 ARABIC LETTER HEH GOAL ISOLATED FORM..ARABIC LETTER HEH GOAL MEDIAL FORM +FBAA..FBAD ; mapped ; 06BE # 1.1 ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM..ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBAE..FBAF ; mapped ; 06D2 # 1.1 ARABIC LETTER YEH BARREE ISOLATED FORM..ARABIC LETTER YEH BARREE FINAL FORM +FBB0..FBB1 ; mapped ; 06D3 # 1.1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBC1 ; valid ; ; NV8 # 6.0 ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW +FBC2..FBD2 ; disallowed # NA <reserved-FBC2>..<reserved-FBD2> +FBD3..FBD6 ; mapped ; 06AD # 1.1 ARABIC LETTER NG ISOLATED FORM..ARABIC LETTER NG MEDIAL FORM +FBD7..FBD8 ; mapped ; 06C7 # 1.1 ARABIC LETTER U ISOLATED FORM..ARABIC LETTER U FINAL FORM +FBD9..FBDA ; mapped ; 06C6 # 1.1 ARABIC LETTER OE ISOLATED FORM..ARABIC LETTER OE FINAL FORM +FBDB..FBDC ; mapped ; 06C8 # 1.1 ARABIC LETTER YU ISOLATED FORM..ARABIC LETTER YU FINAL FORM +FBDD ; mapped ; 06C7 0674 # 1.1 ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +FBDE..FBDF ; mapped ; 06CB # 1.1 ARABIC LETTER VE ISOLATED FORM..ARABIC LETTER VE FINAL FORM +FBE0..FBE1 ; mapped ; 06C5 # 1.1 ARABIC LETTER KIRGHIZ OE ISOLATED FORM..ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE2..FBE3 ; mapped ; 06C9 # 1.1 ARABIC LETTER KIRGHIZ YU ISOLATED FORM..ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE4..FBE7 ; mapped ; 06D0 # 1.1 ARABIC LETTER E ISOLATED FORM..ARABIC LETTER E MEDIAL FORM +FBE8..FBE9 ; mapped ; 0649 # 1.1 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM..ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FBEA..FBEB ; mapped ; 0626 0627 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBEC..FBED ; mapped ; 0626 06D5 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEE..FBEF ; mapped ; 0626 0648 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBF0..FBF1 ; mapped ; 0626 06C7 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF2..FBF3 ; mapped ; 0626 06C6 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF4..FBF5 ; mapped ; 0626 06C8 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF6..FBF8 ; mapped ; 0626 06D0 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM..ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBF9..FBFB ; mapped ; 0626 0649 # 1.1 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM..ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFC..FBFF ; mapped ; 06CC # 1.1 ARABIC LETTER FARSI YEH ISOLATED FORM..ARABIC LETTER FARSI YEH MEDIAL FORM +FC00 ; mapped ; 0626 062C # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +FC01 ; mapped ; 0626 062D # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +FC02 ; mapped ; 0626 0645 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +FC03 ; mapped ; 0626 0649 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC04 ; mapped ; 0626 064A # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +FC05 ; mapped ; 0628 062C # 1.1 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +FC06 ; mapped ; 0628 062D # 1.1 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +FC07 ; mapped ; 0628 062E # 1.1 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +FC08 ; mapped ; 0628 0645 # 1.1 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +FC09 ; mapped ; 0628 0649 # 1.1 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +FC0A ; mapped ; 0628 064A # 1.1 ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +FC0B ; mapped ; 062A 062C # 1.1 ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +FC0C ; mapped ; 062A 062D # 1.1 ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +FC0D ; mapped ; 062A 062E # 1.1 ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +FC0E ; mapped ; 062A 0645 # 1.1 ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +FC0F ; mapped ; 062A 0649 # 1.1 ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +FC10 ; mapped ; 062A 064A # 1.1 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +FC11 ; mapped ; 062B 062C # 1.1 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +FC12 ; mapped ; 062B 0645 # 1.1 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +FC13 ; mapped ; 062B 0649 # 1.1 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +FC14 ; mapped ; 062B 064A # 1.1 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +FC15 ; mapped ; 062C 062D # 1.1 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +FC16 ; mapped ; 062C 0645 # 1.1 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +FC17 ; mapped ; 062D 062C # 1.1 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +FC18 ; mapped ; 062D 0645 # 1.1 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +FC19 ; mapped ; 062E 062C # 1.1 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +FC1A ; mapped ; 062E 062D # 1.1 ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +FC1B ; mapped ; 062E 0645 # 1.1 ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +FC1C ; mapped ; 0633 062C # 1.1 ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +FC1D ; mapped ; 0633 062D # 1.1 ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +FC1E ; mapped ; 0633 062E # 1.1 ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +FC1F ; mapped ; 0633 0645 # 1.1 ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +FC20 ; mapped ; 0635 062D # 1.1 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +FC21 ; mapped ; 0635 0645 # 1.1 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +FC22 ; mapped ; 0636 062C # 1.1 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +FC23 ; mapped ; 0636 062D # 1.1 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +FC24 ; mapped ; 0636 062E # 1.1 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +FC25 ; mapped ; 0636 0645 # 1.1 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +FC26 ; mapped ; 0637 062D # 1.1 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +FC27 ; mapped ; 0637 0645 # 1.1 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +FC28 ; mapped ; 0638 0645 # 1.1 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +FC29 ; mapped ; 0639 062C # 1.1 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +FC2A ; mapped ; 0639 0645 # 1.1 ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +FC2B ; mapped ; 063A 062C # 1.1 ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +FC2C ; mapped ; 063A 0645 # 1.1 ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +FC2D ; mapped ; 0641 062C # 1.1 ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +FC2E ; mapped ; 0641 062D # 1.1 ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +FC2F ; mapped ; 0641 062E # 1.1 ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +FC30 ; mapped ; 0641 0645 # 1.1 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +FC31 ; mapped ; 0641 0649 # 1.1 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +FC32 ; mapped ; 0641 064A # 1.1 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +FC33 ; mapped ; 0642 062D # 1.1 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +FC34 ; mapped ; 0642 0645 # 1.1 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +FC35 ; mapped ; 0642 0649 # 1.1 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +FC36 ; mapped ; 0642 064A # 1.1 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +FC37 ; mapped ; 0643 0627 # 1.1 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +FC38 ; mapped ; 0643 062C # 1.1 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +FC39 ; mapped ; 0643 062D # 1.1 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +FC3A ; mapped ; 0643 062E # 1.1 ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +FC3B ; mapped ; 0643 0644 # 1.1 ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +FC3C ; mapped ; 0643 0645 # 1.1 ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +FC3D ; mapped ; 0643 0649 # 1.1 ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +FC3E ; mapped ; 0643 064A # 1.1 ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +FC3F ; mapped ; 0644 062C # 1.1 ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +FC40 ; mapped ; 0644 062D # 1.1 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +FC41 ; mapped ; 0644 062E # 1.1 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +FC42 ; mapped ; 0644 0645 # 1.1 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +FC43 ; mapped ; 0644 0649 # 1.1 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +FC44 ; mapped ; 0644 064A # 1.1 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +FC45 ; mapped ; 0645 062C # 1.1 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +FC46 ; mapped ; 0645 062D # 1.1 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +FC47 ; mapped ; 0645 062E # 1.1 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +FC48 ; mapped ; 0645 0645 # 1.1 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +FC49 ; mapped ; 0645 0649 # 1.1 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +FC4A ; mapped ; 0645 064A # 1.1 ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +FC4B ; mapped ; 0646 062C # 1.1 ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +FC4C ; mapped ; 0646 062D # 1.1 ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +FC4D ; mapped ; 0646 062E # 1.1 ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +FC4E ; mapped ; 0646 0645 # 1.1 ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +FC4F ; mapped ; 0646 0649 # 1.1 ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +FC50 ; mapped ; 0646 064A # 1.1 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +FC51 ; mapped ; 0647 062C # 1.1 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +FC52 ; mapped ; 0647 0645 # 1.1 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +FC53 ; mapped ; 0647 0649 # 1.1 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +FC54 ; mapped ; 0647 064A # 1.1 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +FC55 ; mapped ; 064A 062C # 1.1 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +FC56 ; mapped ; 064A 062D # 1.1 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +FC57 ; mapped ; 064A 062E # 1.1 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +FC58 ; mapped ; 064A 0645 # 1.1 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +FC59 ; mapped ; 064A 0649 # 1.1 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +FC5A ; mapped ; 064A 064A # 1.1 ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +FC5B ; mapped ; 0630 0670 # 1.1 ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5C ; mapped ; 0631 0670 # 1.1 ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5D ; mapped ; 0649 0670 # 1.1 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5E ; disallowed_STD3_mapped ; 0020 064C 0651 #1.1 ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM +FC5F ; disallowed_STD3_mapped ; 0020 064D 0651 #1.1 ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM +FC60 ; disallowed_STD3_mapped ; 0020 064E 0651 #1.1 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM +FC61 ; disallowed_STD3_mapped ; 0020 064F 0651 #1.1 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM +FC62 ; disallowed_STD3_mapped ; 0020 0650 0651 #1.1 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM +FC63 ; disallowed_STD3_mapped ; 0020 0651 0670 #1.1 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC64 ; mapped ; 0626 0631 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +FC65 ; mapped ; 0626 0632 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +FC66 ; mapped ; 0626 0645 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +FC67 ; mapped ; 0626 0646 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +FC68 ; mapped ; 0626 0649 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FC69 ; mapped ; 0626 064A # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +FC6A ; mapped ; 0628 0631 # 1.1 ARABIC LIGATURE BEH WITH REH FINAL FORM +FC6B ; mapped ; 0628 0632 # 1.1 ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +FC6C ; mapped ; 0628 0645 # 1.1 ARABIC LIGATURE BEH WITH MEEM FINAL FORM +FC6D ; mapped ; 0628 0646 # 1.1 ARABIC LIGATURE BEH WITH NOON FINAL FORM +FC6E ; mapped ; 0628 0649 # 1.1 ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +FC6F ; mapped ; 0628 064A # 1.1 ARABIC LIGATURE BEH WITH YEH FINAL FORM +FC70 ; mapped ; 062A 0631 # 1.1 ARABIC LIGATURE TEH WITH REH FINAL FORM +FC71 ; mapped ; 062A 0632 # 1.1 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +FC72 ; mapped ; 062A 0645 # 1.1 ARABIC LIGATURE TEH WITH MEEM FINAL FORM +FC73 ; mapped ; 062A 0646 # 1.1 ARABIC LIGATURE TEH WITH NOON FINAL FORM +FC74 ; mapped ; 062A 0649 # 1.1 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +FC75 ; mapped ; 062A 064A # 1.1 ARABIC LIGATURE TEH WITH YEH FINAL FORM +FC76 ; mapped ; 062B 0631 # 1.1 ARABIC LIGATURE THEH WITH REH FINAL FORM +FC77 ; mapped ; 062B 0632 # 1.1 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +FC78 ; mapped ; 062B 0645 # 1.1 ARABIC LIGATURE THEH WITH MEEM FINAL FORM +FC79 ; mapped ; 062B 0646 # 1.1 ARABIC LIGATURE THEH WITH NOON FINAL FORM +FC7A ; mapped ; 062B 0649 # 1.1 ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +FC7B ; mapped ; 062B 064A # 1.1 ARABIC LIGATURE THEH WITH YEH FINAL FORM +FC7C ; mapped ; 0641 0649 # 1.1 ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +FC7D ; mapped ; 0641 064A # 1.1 ARABIC LIGATURE FEH WITH YEH FINAL FORM +FC7E ; mapped ; 0642 0649 # 1.1 ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +FC7F ; mapped ; 0642 064A # 1.1 ARABIC LIGATURE QAF WITH YEH FINAL FORM +FC80 ; mapped ; 0643 0627 # 1.1 ARABIC LIGATURE KAF WITH ALEF FINAL FORM +FC81 ; mapped ; 0643 0644 # 1.1 ARABIC LIGATURE KAF WITH LAM FINAL FORM +FC82 ; mapped ; 0643 0645 # 1.1 ARABIC LIGATURE KAF WITH MEEM FINAL FORM +FC83 ; mapped ; 0643 0649 # 1.1 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +FC84 ; mapped ; 0643 064A # 1.1 ARABIC LIGATURE KAF WITH YEH FINAL FORM +FC85 ; mapped ; 0644 0645 # 1.1 ARABIC LIGATURE LAM WITH MEEM FINAL FORM +FC86 ; mapped ; 0644 0649 # 1.1 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +FC87 ; mapped ; 0644 064A # 1.1 ARABIC LIGATURE LAM WITH YEH FINAL FORM +FC88 ; mapped ; 0645 0627 # 1.1 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +FC89 ; mapped ; 0645 0645 # 1.1 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +FC8A ; mapped ; 0646 0631 # 1.1 ARABIC LIGATURE NOON WITH REH FINAL FORM +FC8B ; mapped ; 0646 0632 # 1.1 ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +FC8C ; mapped ; 0646 0645 # 1.1 ARABIC LIGATURE NOON WITH MEEM FINAL FORM +FC8D ; mapped ; 0646 0646 # 1.1 ARABIC LIGATURE NOON WITH NOON FINAL FORM +FC8E ; mapped ; 0646 0649 # 1.1 ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +FC8F ; mapped ; 0646 064A # 1.1 ARABIC LIGATURE NOON WITH YEH FINAL FORM +FC90 ; mapped ; 0649 0670 # 1.1 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +FC91 ; mapped ; 064A 0631 # 1.1 ARABIC LIGATURE YEH WITH REH FINAL FORM +FC92 ; mapped ; 064A 0632 # 1.1 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +FC93 ; mapped ; 064A 0645 # 1.1 ARABIC LIGATURE YEH WITH MEEM FINAL FORM +FC94 ; mapped ; 064A 0646 # 1.1 ARABIC LIGATURE YEH WITH NOON FINAL FORM +FC95 ; mapped ; 064A 0649 # 1.1 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +FC96 ; mapped ; 064A 064A # 1.1 ARABIC LIGATURE YEH WITH YEH FINAL FORM +FC97 ; mapped ; 0626 062C # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +FC98 ; mapped ; 0626 062D # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +FC99 ; mapped ; 0626 062E # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +FC9A ; mapped ; 0626 0645 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +FC9B ; mapped ; 0626 0647 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +FC9C ; mapped ; 0628 062C # 1.1 ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +FC9D ; mapped ; 0628 062D # 1.1 ARABIC LIGATURE BEH WITH HAH INITIAL FORM +FC9E ; mapped ; 0628 062E # 1.1 ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +FC9F ; mapped ; 0628 0645 # 1.1 ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +FCA0 ; mapped ; 0628 0647 # 1.1 ARABIC LIGATURE BEH WITH HEH INITIAL FORM +FCA1 ; mapped ; 062A 062C # 1.1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +FCA2 ; mapped ; 062A 062D # 1.1 ARABIC LIGATURE TEH WITH HAH INITIAL FORM +FCA3 ; mapped ; 062A 062E # 1.1 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +FCA4 ; mapped ; 062A 0645 # 1.1 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +FCA5 ; mapped ; 062A 0647 # 1.1 ARABIC LIGATURE TEH WITH HEH INITIAL FORM +FCA6 ; mapped ; 062B 0645 # 1.1 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +FCA7 ; mapped ; 062C 062D # 1.1 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +FCA8 ; mapped ; 062C 0645 # 1.1 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +FCA9 ; mapped ; 062D 062C # 1.1 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +FCAA ; mapped ; 062D 0645 # 1.1 ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +FCAB ; mapped ; 062E 062C # 1.1 ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +FCAC ; mapped ; 062E 0645 # 1.1 ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +FCAD ; mapped ; 0633 062C # 1.1 ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +FCAE ; mapped ; 0633 062D # 1.1 ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +FCAF ; mapped ; 0633 062E # 1.1 ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +FCB0 ; mapped ; 0633 0645 # 1.1 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +FCB1 ; mapped ; 0635 062D # 1.1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM +FCB2 ; mapped ; 0635 062E # 1.1 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +FCB3 ; mapped ; 0635 0645 # 1.1 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +FCB4 ; mapped ; 0636 062C # 1.1 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +FCB5 ; mapped ; 0636 062D # 1.1 ARABIC LIGATURE DAD WITH HAH INITIAL FORM +FCB6 ; mapped ; 0636 062E # 1.1 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +FCB7 ; mapped ; 0636 0645 # 1.1 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +FCB8 ; mapped ; 0637 062D # 1.1 ARABIC LIGATURE TAH WITH HAH INITIAL FORM +FCB9 ; mapped ; 0638 0645 # 1.1 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +FCBA ; mapped ; 0639 062C # 1.1 ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +FCBB ; mapped ; 0639 0645 # 1.1 ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +FCBC ; mapped ; 063A 062C # 1.1 ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +FCBD ; mapped ; 063A 0645 # 1.1 ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +FCBE ; mapped ; 0641 062C # 1.1 ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +FCBF ; mapped ; 0641 062D # 1.1 ARABIC LIGATURE FEH WITH HAH INITIAL FORM +FCC0 ; mapped ; 0641 062E # 1.1 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +FCC1 ; mapped ; 0641 0645 # 1.1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +FCC2 ; mapped ; 0642 062D # 1.1 ARABIC LIGATURE QAF WITH HAH INITIAL FORM +FCC3 ; mapped ; 0642 0645 # 1.1 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +FCC4 ; mapped ; 0643 062C # 1.1 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +FCC5 ; mapped ; 0643 062D # 1.1 ARABIC LIGATURE KAF WITH HAH INITIAL FORM +FCC6 ; mapped ; 0643 062E # 1.1 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +FCC7 ; mapped ; 0643 0644 # 1.1 ARABIC LIGATURE KAF WITH LAM INITIAL FORM +FCC8 ; mapped ; 0643 0645 # 1.1 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +FCC9 ; mapped ; 0644 062C # 1.1 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +FCCA ; mapped ; 0644 062D # 1.1 ARABIC LIGATURE LAM WITH HAH INITIAL FORM +FCCB ; mapped ; 0644 062E # 1.1 ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +FCCC ; mapped ; 0644 0645 # 1.1 ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +FCCD ; mapped ; 0644 0647 # 1.1 ARABIC LIGATURE LAM WITH HEH INITIAL FORM +FCCE ; mapped ; 0645 062C # 1.1 ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +FCCF ; mapped ; 0645 062D # 1.1 ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +FCD0 ; mapped ; 0645 062E # 1.1 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +FCD1 ; mapped ; 0645 0645 # 1.1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +FCD2 ; mapped ; 0646 062C # 1.1 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +FCD3 ; mapped ; 0646 062D # 1.1 ARABIC LIGATURE NOON WITH HAH INITIAL FORM +FCD4 ; mapped ; 0646 062E # 1.1 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +FCD5 ; mapped ; 0646 0645 # 1.1 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +FCD6 ; mapped ; 0646 0647 # 1.1 ARABIC LIGATURE NOON WITH HEH INITIAL FORM +FCD7 ; mapped ; 0647 062C # 1.1 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +FCD8 ; mapped ; 0647 0645 # 1.1 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +FCD9 ; mapped ; 0647 0670 # 1.1 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +FCDA ; mapped ; 064A 062C # 1.1 ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +FCDB ; mapped ; 064A 062D # 1.1 ARABIC LIGATURE YEH WITH HAH INITIAL FORM +FCDC ; mapped ; 064A 062E # 1.1 ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +FCDD ; mapped ; 064A 0645 # 1.1 ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +FCDE ; mapped ; 064A 0647 # 1.1 ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FCDF ; mapped ; 0626 0645 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +FCE0 ; mapped ; 0626 0647 # 1.1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +FCE1 ; mapped ; 0628 0645 # 1.1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +FCE2 ; mapped ; 0628 0647 # 1.1 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +FCE3 ; mapped ; 062A 0645 # 1.1 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +FCE4 ; mapped ; 062A 0647 # 1.1 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +FCE5 ; mapped ; 062B 0645 # 1.1 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +FCE6 ; mapped ; 062B 0647 # 1.1 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +FCE7 ; mapped ; 0633 0645 # 1.1 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +FCE8 ; mapped ; 0633 0647 # 1.1 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +FCE9 ; mapped ; 0634 0645 # 1.1 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +FCEA ; mapped ; 0634 0647 # 1.1 ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +FCEB ; mapped ; 0643 0644 # 1.1 ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +FCEC ; mapped ; 0643 0645 # 1.1 ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +FCED ; mapped ; 0644 0645 # 1.1 ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +FCEE ; mapped ; 0646 0645 # 1.1 ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +FCEF ; mapped ; 0646 0647 # 1.1 ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +FCF0 ; mapped ; 064A 0645 # 1.1 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +FCF1 ; mapped ; 064A 0647 # 1.1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +FCF2 ; mapped ; 0640 064E 0651 #1.1 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM +FCF3 ; mapped ; 0640 064F 0651 #1.1 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM +FCF4 ; mapped ; 0640 0650 0651 #1.1 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM +FCF5 ; mapped ; 0637 0649 # 1.1 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +FCF6 ; mapped ; 0637 064A # 1.1 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +FCF7 ; mapped ; 0639 0649 # 1.1 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +FCF8 ; mapped ; 0639 064A # 1.1 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +FCF9 ; mapped ; 063A 0649 # 1.1 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +FCFA ; mapped ; 063A 064A # 1.1 ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +FCFB ; mapped ; 0633 0649 # 1.1 ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +FCFC ; mapped ; 0633 064A # 1.1 ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +FCFD ; mapped ; 0634 0649 # 1.1 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +FCFE ; mapped ; 0634 064A # 1.1 ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +FCFF ; mapped ; 062D 0649 # 1.1 ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +FD00 ; mapped ; 062D 064A # 1.1 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +FD01 ; mapped ; 062C 0649 # 1.1 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +FD02 ; mapped ; 062C 064A # 1.1 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +FD03 ; mapped ; 062E 0649 # 1.1 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +FD04 ; mapped ; 062E 064A # 1.1 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +FD05 ; mapped ; 0635 0649 # 1.1 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +FD06 ; mapped ; 0635 064A # 1.1 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +FD07 ; mapped ; 0636 0649 # 1.1 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +FD08 ; mapped ; 0636 064A # 1.1 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +FD09 ; mapped ; 0634 062C # 1.1 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +FD0A ; mapped ; 0634 062D # 1.1 ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +FD0B ; mapped ; 0634 062E # 1.1 ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +FD0C ; mapped ; 0634 0645 # 1.1 ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +FD0D ; mapped ; 0634 0631 # 1.1 ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +FD0E ; mapped ; 0633 0631 # 1.1 ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +FD0F ; mapped ; 0635 0631 # 1.1 ARABIC LIGATURE SAD WITH REH ISOLATED FORM +FD10 ; mapped ; 0636 0631 # 1.1 ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FD11 ; mapped ; 0637 0649 # 1.1 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +FD12 ; mapped ; 0637 064A # 1.1 ARABIC LIGATURE TAH WITH YEH FINAL FORM +FD13 ; mapped ; 0639 0649 # 1.1 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +FD14 ; mapped ; 0639 064A # 1.1 ARABIC LIGATURE AIN WITH YEH FINAL FORM +FD15 ; mapped ; 063A 0649 # 1.1 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +FD16 ; mapped ; 063A 064A # 1.1 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +FD17 ; mapped ; 0633 0649 # 1.1 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +FD18 ; mapped ; 0633 064A # 1.1 ARABIC LIGATURE SEEN WITH YEH FINAL FORM +FD19 ; mapped ; 0634 0649 # 1.1 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +FD1A ; mapped ; 0634 064A # 1.1 ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +FD1B ; mapped ; 062D 0649 # 1.1 ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +FD1C ; mapped ; 062D 064A # 1.1 ARABIC LIGATURE HAH WITH YEH FINAL FORM +FD1D ; mapped ; 062C 0649 # 1.1 ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +FD1E ; mapped ; 062C 064A # 1.1 ARABIC LIGATURE JEEM WITH YEH FINAL FORM +FD1F ; mapped ; 062E 0649 # 1.1 ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +FD20 ; mapped ; 062E 064A # 1.1 ARABIC LIGATURE KHAH WITH YEH FINAL FORM +FD21 ; mapped ; 0635 0649 # 1.1 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +FD22 ; mapped ; 0635 064A # 1.1 ARABIC LIGATURE SAD WITH YEH FINAL FORM +FD23 ; mapped ; 0636 0649 # 1.1 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +FD24 ; mapped ; 0636 064A # 1.1 ARABIC LIGATURE DAD WITH YEH FINAL FORM +FD25 ; mapped ; 0634 062C # 1.1 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +FD26 ; mapped ; 0634 062D # 1.1 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +FD27 ; mapped ; 0634 062E # 1.1 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +FD28 ; mapped ; 0634 0645 # 1.1 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +FD29 ; mapped ; 0634 0631 # 1.1 ARABIC LIGATURE SHEEN WITH REH FINAL FORM +FD2A ; mapped ; 0633 0631 # 1.1 ARABIC LIGATURE SEEN WITH REH FINAL FORM +FD2B ; mapped ; 0635 0631 # 1.1 ARABIC LIGATURE SAD WITH REH FINAL FORM +FD2C ; mapped ; 0636 0631 # 1.1 ARABIC LIGATURE DAD WITH REH FINAL FORM +FD2D ; mapped ; 0634 062C # 1.1 ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +FD2E ; mapped ; 0634 062D # 1.1 ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +FD2F ; mapped ; 0634 062E # 1.1 ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +FD30 ; mapped ; 0634 0645 # 1.1 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +FD31 ; mapped ; 0633 0647 # 1.1 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +FD32 ; mapped ; 0634 0647 # 1.1 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +FD33 ; mapped ; 0637 0645 # 1.1 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD34 ; mapped ; 0633 062C # 1.1 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +FD35 ; mapped ; 0633 062D # 1.1 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +FD36 ; mapped ; 0633 062E # 1.1 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +FD37 ; mapped ; 0634 062C # 1.1 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +FD38 ; mapped ; 0634 062D # 1.1 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +FD39 ; mapped ; 0634 062E # 1.1 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +FD3A ; mapped ; 0637 0645 # 1.1 ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +FD3B ; mapped ; 0638 0645 # 1.1 ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FD3C..FD3D ; mapped ; 0627 064B # 1.1 ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E..FD3F ; valid ; ; NV8 # 1.1 ORNATE LEFT PARENTHESIS..ORNATE RIGHT PARENTHESIS +FD40..FD4F ; disallowed # NA <reserved-FD40>..<reserved-FD4F> +FD50 ; mapped ; 062A 062C 0645 #1.1 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FD51..FD52 ; mapped ; 062A 062D 062C #1.1 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM..ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +FD53 ; mapped ; 062A 062D 0645 #1.1 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +FD54 ; mapped ; 062A 062E 0645 #1.1 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +FD55 ; mapped ; 062A 0645 062C #1.1 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +FD56 ; mapped ; 062A 0645 062D #1.1 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +FD57 ; mapped ; 062A 0645 062E #1.1 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FD58..FD59 ; mapped ; 062C 0645 062D #1.1 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD5A ; mapped ; 062D 0645 064A #1.1 ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +FD5B ; mapped ; 062D 0645 0649 #1.1 ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5C ; mapped ; 0633 062D 062C #1.1 ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +FD5D ; mapped ; 0633 062C 062D #1.1 ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD5E ; mapped ; 0633 062C 0649 #1.1 ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD5F..FD60 ; mapped ; 0633 0645 062D #1.1 ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +FD61 ; mapped ; 0633 0645 062C #1.1 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD62..FD63 ; mapped ; 0633 0645 0645 #1.1 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD64..FD65 ; mapped ; 0635 062D 062D #1.1 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM..ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD66 ; mapped ; 0635 0645 0645 #1.1 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +FD67..FD68 ; mapped ; 0634 062D 0645 #1.1 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM..ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD69 ; mapped ; 0634 062C 064A #1.1 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +FD6A..FD6B ; mapped ; 0634 0645 062E #1.1 ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM..ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6C..FD6D ; mapped ; 0634 0645 0645 #1.1 ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD6E ; mapped ; 0636 062D 0649 #1.1 ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +FD6F..FD70 ; mapped ; 0636 062E 0645 #1.1 ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM..ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD71..FD72 ; mapped ; 0637 0645 062D #1.1 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +FD73 ; mapped ; 0637 0645 0645 #1.1 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD74 ; mapped ; 0637 0645 064A #1.1 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +FD75 ; mapped ; 0639 062C 0645 #1.1 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +FD76..FD77 ; mapped ; 0639 0645 0645 #1.1 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD78 ; mapped ; 0639 0645 0649 #1.1 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD79 ; mapped ; 063A 0645 0645 #1.1 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +FD7A ; mapped ; 063A 0645 064A #1.1 ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +FD7B ; mapped ; 063A 0645 0649 #1.1 ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD7C..FD7D ; mapped ; 0641 062E 0645 #1.1 ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM..ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD7E ; mapped ; 0642 0645 062D #1.1 ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +FD7F ; mapped ; 0642 0645 0645 #1.1 ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +FD80 ; mapped ; 0644 062D 0645 #1.1 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +FD81 ; mapped ; 0644 062D 064A #1.1 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +FD82 ; mapped ; 0644 062D 0649 #1.1 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD83..FD84 ; mapped ; 0644 062C 062C #1.1 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM..ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +FD85..FD86 ; mapped ; 0644 062E 0645 #1.1 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM..ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD87..FD88 ; mapped ; 0644 0645 062D #1.1 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +FD89 ; mapped ; 0645 062D 062C #1.1 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +FD8A ; mapped ; 0645 062D 0645 #1.1 ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FD8B ; mapped ; 0645 062D 064A #1.1 ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FD8C ; mapped ; 0645 062C 062D #1.1 ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +FD8D ; mapped ; 0645 062C 0645 #1.1 ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +FD8E ; mapped ; 0645 062E 062C #1.1 ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +FD8F ; mapped ; 0645 062E 0645 #1.1 ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD90..FD91 ; disallowed # NA <reserved-FD90>..<reserved-FD91> +FD92 ; mapped ; 0645 062C 062E #1.1 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +FD93 ; mapped ; 0647 0645 062C #1.1 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +FD94 ; mapped ; 0647 0645 0645 #1.1 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +FD95 ; mapped ; 0646 062D 0645 #1.1 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD96 ; mapped ; 0646 062D 0649 #1.1 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +FD97..FD98 ; mapped ; 0646 062C 0645 #1.1 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD99 ; mapped ; 0646 062C 0649 #1.1 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD9A ; mapped ; 0646 0645 064A #1.1 ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +FD9B ; mapped ; 0646 0645 0649 #1.1 ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD9C..FD9D ; mapped ; 064A 0645 0645 #1.1 ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FD9E ; mapped ; 0628 062E 064A #1.1 ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +FD9F ; mapped ; 062A 062C 064A #1.1 ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +FDA0 ; mapped ; 062A 062C 0649 #1.1 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +FDA1 ; mapped ; 062A 062E 064A #1.1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +FDA2 ; mapped ; 062A 062E 0649 #1.1 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA3 ; mapped ; 062A 0645 064A #1.1 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +FDA4 ; mapped ; 062A 0645 0649 #1.1 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA5 ; mapped ; 062C 0645 064A #1.1 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +FDA6 ; mapped ; 062C 062D 0649 #1.1 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +FDA7 ; mapped ; 062C 0645 0649 #1.1 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA8 ; mapped ; 0633 062E 0649 #1.1 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA9 ; mapped ; 0635 062D 064A #1.1 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +FDAA ; mapped ; 0634 062D 064A #1.1 ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +FDAB ; mapped ; 0636 062D 064A #1.1 ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +FDAC ; mapped ; 0644 062C 064A #1.1 ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +FDAD ; mapped ; 0644 0645 064A #1.1 ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +FDAE ; mapped ; 064A 062D 064A #1.1 ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +FDAF ; mapped ; 064A 062C 064A #1.1 ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +FDB0 ; mapped ; 064A 0645 064A #1.1 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +FDB1 ; mapped ; 0645 0645 064A #1.1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +FDB2 ; mapped ; 0642 0645 064A #1.1 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +FDB3 ; mapped ; 0646 062D 064A #1.1 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FDB4 ; mapped ; 0642 0645 062D #1.1 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +FDB5 ; mapped ; 0644 062D 0645 #1.1 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FDB6 ; mapped ; 0639 0645 064A #1.1 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +FDB7 ; mapped ; 0643 0645 064A #1.1 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FDB8 ; mapped ; 0646 062C 062D #1.1 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDB9 ; mapped ; 0645 062E 064A #1.1 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FDBA ; mapped ; 0644 062C 0645 #1.1 ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDBB ; mapped ; 0643 0645 0645 #1.1 ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +FDBC ; mapped ; 0644 062C 0645 #1.1 ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +FDBD ; mapped ; 0646 062C 062D #1.1 ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +FDBE ; mapped ; 062C 062D 064A #1.1 ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +FDBF ; mapped ; 062D 062C 064A #1.1 ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +FDC0 ; mapped ; 0645 062C 064A #1.1 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +FDC1 ; mapped ; 0641 0645 064A #1.1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +FDC2 ; mapped ; 0628 062D 064A #1.1 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FDC3 ; mapped ; 0643 0645 0645 #1.1 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +FDC4 ; mapped ; 0639 062C 0645 #1.1 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +FDC5 ; mapped ; 0635 0645 0645 #1.1 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FDC6 ; mapped ; 0633 062E 064A #1.1 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +FDC7 ; mapped ; 0646 062C 064A #1.1 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDC8..FDCF ; disallowed # NA <reserved-FDC8>..<reserved-FDCF> +FDD0..FDEF ; disallowed # 3.1 <noncharacter-FDD0>..<noncharacter-FDEF> +FDF0 ; mapped ; 0635 0644 06D2 #1.1 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF1 ; mapped ; 0642 0644 06D2 #1.1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF2 ; mapped ; 0627 0644 0644 0647 #1.1 ARABIC LIGATURE ALLAH ISOLATED FORM +FDF3 ; mapped ; 0627 0643 0628 0631 #1.1 ARABIC LIGATURE AKBAR ISOLATED FORM +FDF4 ; mapped ; 0645 062D 0645 062F #1.1 ARABIC LIGATURE MOHAMMAD ISOLATED FORM +FDF5 ; mapped ; 0635 0644 0639 0645 #1.1 ARABIC LIGATURE SALAM ISOLATED FORM +FDF6 ; mapped ; 0631 0633 0648 0644 #1.1 ARABIC LIGATURE RASOUL ISOLATED FORM +FDF7 ; mapped ; 0639 0644 064A 0647 #1.1 ARABIC LIGATURE ALAYHE ISOLATED FORM +FDF8 ; mapped ; 0648 0633 0644 0645 #1.1 ARABIC LIGATURE WASALLAM ISOLATED FORM +FDF9 ; mapped ; 0635 0644 0649 #1.1 ARABIC LIGATURE SALLA ISOLATED FORM +FDFA ; disallowed_STD3_mapped ; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645 #1.1 ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +FDFB ; disallowed_STD3_mapped ; 062C 0644 0020 062C 0644 0627 0644 0647 #1.1 ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; mapped ; 0631 06CC 0627 0644 #3.2 RIAL SIGN +FDFD ; valid ; ; NV8 # 4.0 ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FDFE..FDFF ; disallowed # NA <reserved-FDFE>..<reserved-FDFF> +FE00..FE0F ; ignored # 3.2 VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE10 ; disallowed_STD3_mapped ; 002C # 4.1 PRESENTATION FORM FOR VERTICAL COMMA +FE11 ; mapped ; 3001 # 4.1 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA +FE12 ; disallowed # 4.1 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13 ; disallowed_STD3_mapped ; 003A # 4.1 PRESENTATION FORM FOR VERTICAL COLON +FE14 ; disallowed_STD3_mapped ; 003B # 4.1 PRESENTATION FORM FOR VERTICAL SEMICOLON +FE15 ; disallowed_STD3_mapped ; 0021 # 4.1 PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK +FE16 ; disallowed_STD3_mapped ; 003F # 4.1 PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; mapped ; 3016 # 4.1 PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; mapped ; 3017 # 4.1 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; disallowed # 4.1 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE1A..FE1F ; disallowed # NA <reserved-FE1A>..<reserved-FE1F> +FE20..FE23 ; valid # 1.1 COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF +FE24..FE26 ; valid # 5.1 COMBINING MACRON LEFT HALF..COMBINING CONJOINING MACRON +FE27..FE2D ; valid # 7.0 COMBINING LIGATURE LEFT HALF BELOW..COMBINING CONJOINING MACRON BELOW +FE2E..FE2F ; valid # 8.0 COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE30 ; disallowed # 1.1 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31 ; mapped ; 2014 # 1.1 PRESENTATION FORM FOR VERTICAL EM DASH +FE32 ; mapped ; 2013 # 1.1 PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; disallowed_STD3_mapped ; 005F # 1.1 PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; disallowed_STD3_mapped ; 0028 # 1.1 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; disallowed_STD3_mapped ; 0029 # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; disallowed_STD3_mapped ; 007B # 1.1 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; disallowed_STD3_mapped ; 007D # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; mapped ; 3014 # 1.1 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; mapped ; 3015 # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; mapped ; 3010 # 1.1 PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; mapped ; 3011 # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; mapped ; 300A # 1.1 PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; mapped ; 300B # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; mapped ; 3008 # 1.1 PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; mapped ; 3009 # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; mapped ; 300C # 1.1 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; mapped ; 300D # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; mapped ; 300E # 1.1 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; mapped ; 300F # 1.1 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; valid ; ; NV8 # 3.2 SESAME DOT..WHITE SESAME DOT +FE47 ; disallowed_STD3_mapped ; 005B # 4.0 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; disallowed_STD3_mapped ; 005D # 4.0 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; disallowed_STD3_mapped ; 0020 0305 # 1.1 DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; disallowed_STD3_mapped ; 005F # 1.1 DASHED LOW LINE..WAVY LOW LINE +FE50 ; disallowed_STD3_mapped ; 002C # 1.1 SMALL COMMA +FE51 ; mapped ; 3001 # 1.1 SMALL IDEOGRAPHIC COMMA +FE52 ; disallowed # 1.1 SMALL FULL STOP +FE53 ; disallowed # NA <reserved-FE53> +FE54 ; disallowed_STD3_mapped ; 003B # 1.1 SMALL SEMICOLON +FE55 ; disallowed_STD3_mapped ; 003A # 1.1 SMALL COLON +FE56 ; disallowed_STD3_mapped ; 003F # 1.1 SMALL QUESTION MARK +FE57 ; disallowed_STD3_mapped ; 0021 # 1.1 SMALL EXCLAMATION MARK +FE58 ; mapped ; 2014 # 1.1 SMALL EM DASH +FE59 ; disallowed_STD3_mapped ; 0028 # 1.1 SMALL LEFT PARENTHESIS +FE5A ; disallowed_STD3_mapped ; 0029 # 1.1 SMALL RIGHT PARENTHESIS +FE5B ; disallowed_STD3_mapped ; 007B # 1.1 SMALL LEFT CURLY BRACKET +FE5C ; disallowed_STD3_mapped ; 007D # 1.1 SMALL RIGHT CURLY BRACKET +FE5D ; mapped ; 3014 # 1.1 SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; mapped ; 3015 # 1.1 SMALL RIGHT TORTOISE SHELL BRACKET +FE5F ; disallowed_STD3_mapped ; 0023 # 1.1 SMALL NUMBER SIGN +FE60 ; disallowed_STD3_mapped ; 0026 # 1.1 SMALL AMPERSAND +FE61 ; disallowed_STD3_mapped ; 002A # 1.1 SMALL ASTERISK +FE62 ; disallowed_STD3_mapped ; 002B # 1.1 SMALL PLUS SIGN +FE63 ; mapped ; 002D # 1.1 SMALL HYPHEN-MINUS +FE64 ; disallowed_STD3_mapped ; 003C # 1.1 SMALL LESS-THAN SIGN +FE65 ; disallowed_STD3_mapped ; 003E # 1.1 SMALL GREATER-THAN SIGN +FE66 ; disallowed_STD3_mapped ; 003D # 1.1 SMALL EQUALS SIGN +FE67 ; disallowed # NA <reserved-FE67> +FE68 ; disallowed_STD3_mapped ; 005C # 1.1 SMALL REVERSE SOLIDUS +FE69 ; disallowed_STD3_mapped ; 0024 # 1.1 SMALL DOLLAR SIGN +FE6A ; disallowed_STD3_mapped ; 0025 # 1.1 SMALL PERCENT SIGN +FE6B ; disallowed_STD3_mapped ; 0040 # 1.1 SMALL COMMERCIAL AT +FE6C..FE6F ; disallowed # NA <reserved-FE6C>..<reserved-FE6F> +FE70 ; disallowed_STD3_mapped ; 0020 064B # 1.1 ARABIC FATHATAN ISOLATED FORM +FE71 ; mapped ; 0640 064B # 1.1 ARABIC TATWEEL WITH FATHATAN ABOVE +FE72 ; disallowed_STD3_mapped ; 0020 064C # 1.1 ARABIC DAMMATAN ISOLATED FORM +FE73 ; valid # 3.2 ARABIC TAIL FRAGMENT +FE74 ; disallowed_STD3_mapped ; 0020 064D # 1.1 ARABIC KASRATAN ISOLATED FORM +FE75 ; disallowed # NA <reserved-FE75> +FE76 ; disallowed_STD3_mapped ; 0020 064E # 1.1 ARABIC FATHA ISOLATED FORM +FE77 ; mapped ; 0640 064E # 1.1 ARABIC FATHA MEDIAL FORM +FE78 ; disallowed_STD3_mapped ; 0020 064F # 1.1 ARABIC DAMMA ISOLATED FORM +FE79 ; mapped ; 0640 064F # 1.1 ARABIC DAMMA MEDIAL FORM +FE7A ; disallowed_STD3_mapped ; 0020 0650 # 1.1 ARABIC KASRA ISOLATED FORM +FE7B ; mapped ; 0640 0650 # 1.1 ARABIC KASRA MEDIAL FORM +FE7C ; disallowed_STD3_mapped ; 0020 0651 # 1.1 ARABIC SHADDA ISOLATED FORM +FE7D ; mapped ; 0640 0651 # 1.1 ARABIC SHADDA MEDIAL FORM +FE7E ; disallowed_STD3_mapped ; 0020 0652 # 1.1 ARABIC SUKUN ISOLATED FORM +FE7F ; mapped ; 0640 0652 # 1.1 ARABIC SUKUN MEDIAL FORM +FE80 ; mapped ; 0621 # 1.1 ARABIC LETTER HAMZA ISOLATED FORM +FE81..FE82 ; mapped ; 0622 # 1.1 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM..ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE83..FE84 ; mapped ; 0623 # 1.1 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE85..FE86 ; mapped ; 0624 # 1.1 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE87..FE88 ; mapped ; 0625 # 1.1 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM..ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE89..FE8C ; mapped ; 0626 # 1.1 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE8D..FE8E ; mapped ; 0627 # 1.1 ARABIC LETTER ALEF ISOLATED FORM..ARABIC LETTER ALEF FINAL FORM +FE8F..FE92 ; mapped ; 0628 # 1.1 ARABIC LETTER BEH ISOLATED FORM..ARABIC LETTER BEH MEDIAL FORM +FE93..FE94 ; mapped ; 0629 # 1.1 ARABIC LETTER TEH MARBUTA ISOLATED FORM..ARABIC LETTER TEH MARBUTA FINAL FORM +FE95..FE98 ; mapped ; 062A # 1.1 ARABIC LETTER TEH ISOLATED FORM..ARABIC LETTER TEH MEDIAL FORM +FE99..FE9C ; mapped ; 062B # 1.1 ARABIC LETTER THEH ISOLATED FORM..ARABIC LETTER THEH MEDIAL FORM +FE9D..FEA0 ; mapped ; 062C # 1.1 ARABIC LETTER JEEM ISOLATED FORM..ARABIC LETTER JEEM MEDIAL FORM +FEA1..FEA4 ; mapped ; 062D # 1.1 ARABIC LETTER HAH ISOLATED FORM..ARABIC LETTER HAH MEDIAL FORM +FEA5..FEA8 ; mapped ; 062E # 1.1 ARABIC LETTER KHAH ISOLATED FORM..ARABIC LETTER KHAH MEDIAL FORM +FEA9..FEAA ; mapped ; 062F # 1.1 ARABIC LETTER DAL ISOLATED FORM..ARABIC LETTER DAL FINAL FORM +FEAB..FEAC ; mapped ; 0630 # 1.1 ARABIC LETTER THAL ISOLATED FORM..ARABIC LETTER THAL FINAL FORM +FEAD..FEAE ; mapped ; 0631 # 1.1 ARABIC LETTER REH ISOLATED FORM..ARABIC LETTER REH FINAL FORM +FEAF..FEB0 ; mapped ; 0632 # 1.1 ARABIC LETTER ZAIN ISOLATED FORM..ARABIC LETTER ZAIN FINAL FORM +FEB1..FEB4 ; mapped ; 0633 # 1.1 ARABIC LETTER SEEN ISOLATED FORM..ARABIC LETTER SEEN MEDIAL FORM +FEB5..FEB8 ; mapped ; 0634 # 1.1 ARABIC LETTER SHEEN ISOLATED FORM..ARABIC LETTER SHEEN MEDIAL FORM +FEB9..FEBC ; mapped ; 0635 # 1.1 ARABIC LETTER SAD ISOLATED FORM..ARABIC LETTER SAD MEDIAL FORM +FEBD..FEC0 ; mapped ; 0636 # 1.1 ARABIC LETTER DAD ISOLATED FORM..ARABIC LETTER DAD MEDIAL FORM +FEC1..FEC4 ; mapped ; 0637 # 1.1 ARABIC LETTER TAH ISOLATED FORM..ARABIC LETTER TAH MEDIAL FORM +FEC5..FEC8 ; mapped ; 0638 # 1.1 ARABIC LETTER ZAH ISOLATED FORM..ARABIC LETTER ZAH MEDIAL FORM +FEC9..FECC ; mapped ; 0639 # 1.1 ARABIC LETTER AIN ISOLATED FORM..ARABIC LETTER AIN MEDIAL FORM +FECD..FED0 ; mapped ; 063A # 1.1 ARABIC LETTER GHAIN ISOLATED FORM..ARABIC LETTER GHAIN MEDIAL FORM +FED1..FED4 ; mapped ; 0641 # 1.1 ARABIC LETTER FEH ISOLATED FORM..ARABIC LETTER FEH MEDIAL FORM +FED5..FED8 ; mapped ; 0642 # 1.1 ARABIC LETTER QAF ISOLATED FORM..ARABIC LETTER QAF MEDIAL FORM +FED9..FEDC ; mapped ; 0643 # 1.1 ARABIC LETTER KAF ISOLATED FORM..ARABIC LETTER KAF MEDIAL FORM +FEDD..FEE0 ; mapped ; 0644 # 1.1 ARABIC LETTER LAM ISOLATED FORM..ARABIC LETTER LAM MEDIAL FORM +FEE1..FEE4 ; mapped ; 0645 # 1.1 ARABIC LETTER MEEM ISOLATED FORM..ARABIC LETTER MEEM MEDIAL FORM +FEE5..FEE8 ; mapped ; 0646 # 1.1 ARABIC LETTER NOON ISOLATED FORM..ARABIC LETTER NOON MEDIAL FORM +FEE9..FEEC ; mapped ; 0647 # 1.1 ARABIC LETTER HEH ISOLATED FORM..ARABIC LETTER HEH MEDIAL FORM +FEED..FEEE ; mapped ; 0648 # 1.1 ARABIC LETTER WAW ISOLATED FORM..ARABIC LETTER WAW FINAL FORM +FEEF..FEF0 ; mapped ; 0649 # 1.1 ARABIC LETTER ALEF MAKSURA ISOLATED FORM..ARABIC LETTER ALEF MAKSURA FINAL FORM +FEF1..FEF4 ; mapped ; 064A # 1.1 ARABIC LETTER YEH ISOLATED FORM..ARABIC LETTER YEH MEDIAL FORM +FEF5..FEF6 ; mapped ; 0644 0622 # 1.1 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF7..FEF8 ; mapped ; 0644 0623 # 1.1 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEF9..FEFA ; mapped ; 0644 0625 # 1.1 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEFB..FEFC ; mapped ; 0644 0627 # 1.1 ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFD..FEFE ; disallowed # NA <reserved-FEFD>..<reserved-FEFE> +FEFF ; ignored # 1.1 ZERO WIDTH NO-BREAK SPACE +FF00 ; disallowed # NA <reserved-FF00> +FF01 ; disallowed_STD3_mapped ; 0021 # 1.1 FULLWIDTH EXCLAMATION MARK +FF02 ; disallowed_STD3_mapped ; 0022 # 1.1 FULLWIDTH QUOTATION MARK +FF03 ; disallowed_STD3_mapped ; 0023 # 1.1 FULLWIDTH NUMBER SIGN +FF04 ; disallowed_STD3_mapped ; 0024 # 1.1 FULLWIDTH DOLLAR SIGN +FF05 ; disallowed_STD3_mapped ; 0025 # 1.1 FULLWIDTH PERCENT SIGN +FF06 ; disallowed_STD3_mapped ; 0026 # 1.1 FULLWIDTH AMPERSAND +FF07 ; disallowed_STD3_mapped ; 0027 # 1.1 FULLWIDTH APOSTROPHE +FF08 ; disallowed_STD3_mapped ; 0028 # 1.1 FULLWIDTH LEFT PARENTHESIS +FF09 ; disallowed_STD3_mapped ; 0029 # 1.1 FULLWIDTH RIGHT PARENTHESIS +FF0A ; disallowed_STD3_mapped ; 002A # 1.1 FULLWIDTH ASTERISK +FF0B ; disallowed_STD3_mapped ; 002B # 1.1 FULLWIDTH PLUS SIGN +FF0C ; disallowed_STD3_mapped ; 002C # 1.1 FULLWIDTH COMMA +FF0D ; mapped ; 002D # 1.1 FULLWIDTH HYPHEN-MINUS +FF0E ; mapped ; 002E # 1.1 FULLWIDTH FULL STOP +FF0F ; disallowed_STD3_mapped ; 002F # 1.1 FULLWIDTH SOLIDUS +FF10 ; mapped ; 0030 # 1.1 FULLWIDTH DIGIT ZERO +FF11 ; mapped ; 0031 # 1.1 FULLWIDTH DIGIT ONE +FF12 ; mapped ; 0032 # 1.1 FULLWIDTH DIGIT TWO +FF13 ; mapped ; 0033 # 1.1 FULLWIDTH DIGIT THREE +FF14 ; mapped ; 0034 # 1.1 FULLWIDTH DIGIT FOUR +FF15 ; mapped ; 0035 # 1.1 FULLWIDTH DIGIT FIVE +FF16 ; mapped ; 0036 # 1.1 FULLWIDTH DIGIT SIX +FF17 ; mapped ; 0037 # 1.1 FULLWIDTH DIGIT SEVEN +FF18 ; mapped ; 0038 # 1.1 FULLWIDTH DIGIT EIGHT +FF19 ; mapped ; 0039 # 1.1 FULLWIDTH DIGIT NINE +FF1A ; disallowed_STD3_mapped ; 003A # 1.1 FULLWIDTH COLON +FF1B ; disallowed_STD3_mapped ; 003B # 1.1 FULLWIDTH SEMICOLON +FF1C ; disallowed_STD3_mapped ; 003C # 1.1 FULLWIDTH LESS-THAN SIGN +FF1D ; disallowed_STD3_mapped ; 003D # 1.1 FULLWIDTH EQUALS SIGN +FF1E ; disallowed_STD3_mapped ; 003E # 1.1 FULLWIDTH GREATER-THAN SIGN +FF1F ; disallowed_STD3_mapped ; 003F # 1.1 FULLWIDTH QUESTION MARK +FF20 ; disallowed_STD3_mapped ; 0040 # 1.1 FULLWIDTH COMMERCIAL AT +FF21 ; mapped ; 0061 # 1.1 FULLWIDTH LATIN CAPITAL LETTER A +FF22 ; mapped ; 0062 # 1.1 FULLWIDTH LATIN CAPITAL LETTER B +FF23 ; mapped ; 0063 # 1.1 FULLWIDTH LATIN CAPITAL LETTER C +FF24 ; mapped ; 0064 # 1.1 FULLWIDTH LATIN CAPITAL LETTER D +FF25 ; mapped ; 0065 # 1.1 FULLWIDTH LATIN CAPITAL LETTER E +FF26 ; mapped ; 0066 # 1.1 FULLWIDTH LATIN CAPITAL LETTER F +FF27 ; mapped ; 0067 # 1.1 FULLWIDTH LATIN CAPITAL LETTER G +FF28 ; mapped ; 0068 # 1.1 FULLWIDTH LATIN CAPITAL LETTER H +FF29 ; mapped ; 0069 # 1.1 FULLWIDTH LATIN CAPITAL LETTER I +FF2A ; mapped ; 006A # 1.1 FULLWIDTH LATIN CAPITAL LETTER J +FF2B ; mapped ; 006B # 1.1 FULLWIDTH LATIN CAPITAL LETTER K +FF2C ; mapped ; 006C # 1.1 FULLWIDTH LATIN CAPITAL LETTER L +FF2D ; mapped ; 006D # 1.1 FULLWIDTH LATIN CAPITAL LETTER M +FF2E ; mapped ; 006E # 1.1 FULLWIDTH LATIN CAPITAL LETTER N +FF2F ; mapped ; 006F # 1.1 FULLWIDTH LATIN CAPITAL LETTER O +FF30 ; mapped ; 0070 # 1.1 FULLWIDTH LATIN CAPITAL LETTER P +FF31 ; mapped ; 0071 # 1.1 FULLWIDTH LATIN CAPITAL LETTER Q +FF32 ; mapped ; 0072 # 1.1 FULLWIDTH LATIN CAPITAL LETTER R +FF33 ; mapped ; 0073 # 1.1 FULLWIDTH LATIN CAPITAL LETTER S +FF34 ; mapped ; 0074 # 1.1 FULLWIDTH LATIN CAPITAL LETTER T +FF35 ; mapped ; 0075 # 1.1 FULLWIDTH LATIN CAPITAL LETTER U +FF36 ; mapped ; 0076 # 1.1 FULLWIDTH LATIN CAPITAL LETTER V +FF37 ; mapped ; 0077 # 1.1 FULLWIDTH LATIN CAPITAL LETTER W +FF38 ; mapped ; 0078 # 1.1 FULLWIDTH LATIN CAPITAL LETTER X +FF39 ; mapped ; 0079 # 1.1 FULLWIDTH LATIN CAPITAL LETTER Y +FF3A ; mapped ; 007A # 1.1 FULLWIDTH LATIN CAPITAL LETTER Z +FF3B ; disallowed_STD3_mapped ; 005B # 1.1 FULLWIDTH LEFT SQUARE BRACKET +FF3C ; disallowed_STD3_mapped ; 005C # 1.1 FULLWIDTH REVERSE SOLIDUS +FF3D ; disallowed_STD3_mapped ; 005D # 1.1 FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; disallowed_STD3_mapped ; 005E # 1.1 FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; disallowed_STD3_mapped ; 005F # 1.1 FULLWIDTH LOW LINE +FF40 ; disallowed_STD3_mapped ; 0060 # 1.1 FULLWIDTH GRAVE ACCENT +FF41 ; mapped ; 0061 # 1.1 FULLWIDTH LATIN SMALL LETTER A +FF42 ; mapped ; 0062 # 1.1 FULLWIDTH LATIN SMALL LETTER B +FF43 ; mapped ; 0063 # 1.1 FULLWIDTH LATIN SMALL LETTER C +FF44 ; mapped ; 0064 # 1.1 FULLWIDTH LATIN SMALL LETTER D +FF45 ; mapped ; 0065 # 1.1 FULLWIDTH LATIN SMALL LETTER E +FF46 ; mapped ; 0066 # 1.1 FULLWIDTH LATIN SMALL LETTER F +FF47 ; mapped ; 0067 # 1.1 FULLWIDTH LATIN SMALL LETTER G +FF48 ; mapped ; 0068 # 1.1 FULLWIDTH LATIN SMALL LETTER H +FF49 ; mapped ; 0069 # 1.1 FULLWIDTH LATIN SMALL LETTER I +FF4A ; mapped ; 006A # 1.1 FULLWIDTH LATIN SMALL LETTER J +FF4B ; mapped ; 006B # 1.1 FULLWIDTH LATIN SMALL LETTER K +FF4C ; mapped ; 006C # 1.1 FULLWIDTH LATIN SMALL LETTER L +FF4D ; mapped ; 006D # 1.1 FULLWIDTH LATIN SMALL LETTER M +FF4E ; mapped ; 006E # 1.1 FULLWIDTH LATIN SMALL LETTER N +FF4F ; mapped ; 006F # 1.1 FULLWIDTH LATIN SMALL LETTER O +FF50 ; mapped ; 0070 # 1.1 FULLWIDTH LATIN SMALL LETTER P +FF51 ; mapped ; 0071 # 1.1 FULLWIDTH LATIN SMALL LETTER Q +FF52 ; mapped ; 0072 # 1.1 FULLWIDTH LATIN SMALL LETTER R +FF53 ; mapped ; 0073 # 1.1 FULLWIDTH LATIN SMALL LETTER S +FF54 ; mapped ; 0074 # 1.1 FULLWIDTH LATIN SMALL LETTER T +FF55 ; mapped ; 0075 # 1.1 FULLWIDTH LATIN SMALL LETTER U +FF56 ; mapped ; 0076 # 1.1 FULLWIDTH LATIN SMALL LETTER V +FF57 ; mapped ; 0077 # 1.1 FULLWIDTH LATIN SMALL LETTER W +FF58 ; mapped ; 0078 # 1.1 FULLWIDTH LATIN SMALL LETTER X +FF59 ; mapped ; 0079 # 1.1 FULLWIDTH LATIN SMALL LETTER Y +FF5A ; mapped ; 007A # 1.1 FULLWIDTH LATIN SMALL LETTER Z +FF5B ; disallowed_STD3_mapped ; 007B # 1.1 FULLWIDTH LEFT CURLY BRACKET +FF5C ; disallowed_STD3_mapped ; 007C # 1.1 FULLWIDTH VERTICAL LINE +FF5D ; disallowed_STD3_mapped ; 007D # 1.1 FULLWIDTH RIGHT CURLY BRACKET +FF5E ; disallowed_STD3_mapped ; 007E # 1.1 FULLWIDTH TILDE +FF5F ; mapped ; 2985 # 3.2 FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; mapped ; 2986 # 3.2 FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; mapped ; 002E # 1.1 HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; mapped ; 300C # 1.1 HALFWIDTH LEFT CORNER BRACKET +FF63 ; mapped ; 300D # 1.1 HALFWIDTH RIGHT CORNER BRACKET +FF64 ; mapped ; 3001 # 1.1 HALFWIDTH IDEOGRAPHIC COMMA +FF65 ; mapped ; 30FB # 1.1 HALFWIDTH KATAKANA MIDDLE DOT +FF66 ; mapped ; 30F2 # 1.1 HALFWIDTH KATAKANA LETTER WO +FF67 ; mapped ; 30A1 # 1.1 HALFWIDTH KATAKANA LETTER SMALL A +FF68 ; mapped ; 30A3 # 1.1 HALFWIDTH KATAKANA LETTER SMALL I +FF69 ; mapped ; 30A5 # 1.1 HALFWIDTH KATAKANA LETTER SMALL U +FF6A ; mapped ; 30A7 # 1.1 HALFWIDTH KATAKANA LETTER SMALL E +FF6B ; mapped ; 30A9 # 1.1 HALFWIDTH KATAKANA LETTER SMALL O +FF6C ; mapped ; 30E3 # 1.1 HALFWIDTH KATAKANA LETTER SMALL YA +FF6D ; mapped ; 30E5 # 1.1 HALFWIDTH KATAKANA LETTER SMALL YU +FF6E ; mapped ; 30E7 # 1.1 HALFWIDTH KATAKANA LETTER SMALL YO +FF6F ; mapped ; 30C3 # 1.1 HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; mapped ; 30FC # 1.1 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71 ; mapped ; 30A2 # 1.1 HALFWIDTH KATAKANA LETTER A +FF72 ; mapped ; 30A4 # 1.1 HALFWIDTH KATAKANA LETTER I +FF73 ; mapped ; 30A6 # 1.1 HALFWIDTH KATAKANA LETTER U +FF74 ; mapped ; 30A8 # 1.1 HALFWIDTH KATAKANA LETTER E +FF75 ; mapped ; 30AA # 1.1 HALFWIDTH KATAKANA LETTER O +FF76 ; mapped ; 30AB # 1.1 HALFWIDTH KATAKANA LETTER KA +FF77 ; mapped ; 30AD # 1.1 HALFWIDTH KATAKANA LETTER KI +FF78 ; mapped ; 30AF # 1.1 HALFWIDTH KATAKANA LETTER KU +FF79 ; mapped ; 30B1 # 1.1 HALFWIDTH KATAKANA LETTER KE +FF7A ; mapped ; 30B3 # 1.1 HALFWIDTH KATAKANA LETTER KO +FF7B ; mapped ; 30B5 # 1.1 HALFWIDTH KATAKANA LETTER SA +FF7C ; mapped ; 30B7 # 1.1 HALFWIDTH KATAKANA LETTER SI +FF7D ; mapped ; 30B9 # 1.1 HALFWIDTH KATAKANA LETTER SU +FF7E ; mapped ; 30BB # 1.1 HALFWIDTH KATAKANA LETTER SE +FF7F ; mapped ; 30BD # 1.1 HALFWIDTH KATAKANA LETTER SO +FF80 ; mapped ; 30BF # 1.1 HALFWIDTH KATAKANA LETTER TA +FF81 ; mapped ; 30C1 # 1.1 HALFWIDTH KATAKANA LETTER TI +FF82 ; mapped ; 30C4 # 1.1 HALFWIDTH KATAKANA LETTER TU +FF83 ; mapped ; 30C6 # 1.1 HALFWIDTH KATAKANA LETTER TE +FF84 ; mapped ; 30C8 # 1.1 HALFWIDTH KATAKANA LETTER TO +FF85 ; mapped ; 30CA # 1.1 HALFWIDTH KATAKANA LETTER NA +FF86 ; mapped ; 30CB # 1.1 HALFWIDTH KATAKANA LETTER NI +FF87 ; mapped ; 30CC # 1.1 HALFWIDTH KATAKANA LETTER NU +FF88 ; mapped ; 30CD # 1.1 HALFWIDTH KATAKANA LETTER NE +FF89 ; mapped ; 30CE # 1.1 HALFWIDTH KATAKANA LETTER NO +FF8A ; mapped ; 30CF # 1.1 HALFWIDTH KATAKANA LETTER HA +FF8B ; mapped ; 30D2 # 1.1 HALFWIDTH KATAKANA LETTER HI +FF8C ; mapped ; 30D5 # 1.1 HALFWIDTH KATAKANA LETTER HU +FF8D ; mapped ; 30D8 # 1.1 HALFWIDTH KATAKANA LETTER HE +FF8E ; mapped ; 30DB # 1.1 HALFWIDTH KATAKANA LETTER HO +FF8F ; mapped ; 30DE # 1.1 HALFWIDTH KATAKANA LETTER MA +FF90 ; mapped ; 30DF # 1.1 HALFWIDTH KATAKANA LETTER MI +FF91 ; mapped ; 30E0 # 1.1 HALFWIDTH KATAKANA LETTER MU +FF92 ; mapped ; 30E1 # 1.1 HALFWIDTH KATAKANA LETTER ME +FF93 ; mapped ; 30E2 # 1.1 HALFWIDTH KATAKANA LETTER MO +FF94 ; mapped ; 30E4 # 1.1 HALFWIDTH KATAKANA LETTER YA +FF95 ; mapped ; 30E6 # 1.1 HALFWIDTH KATAKANA LETTER YU +FF96 ; mapped ; 30E8 # 1.1 HALFWIDTH KATAKANA LETTER YO +FF97 ; mapped ; 30E9 # 1.1 HALFWIDTH KATAKANA LETTER RA +FF98 ; mapped ; 30EA # 1.1 HALFWIDTH KATAKANA LETTER RI +FF99 ; mapped ; 30EB # 1.1 HALFWIDTH KATAKANA LETTER RU +FF9A ; mapped ; 30EC # 1.1 HALFWIDTH KATAKANA LETTER RE +FF9B ; mapped ; 30ED # 1.1 HALFWIDTH KATAKANA LETTER RO +FF9C ; mapped ; 30EF # 1.1 HALFWIDTH KATAKANA LETTER WA +FF9D ; mapped ; 30F3 # 1.1 HALFWIDTH KATAKANA LETTER N +FF9E ; mapped ; 3099 # 1.1 HALFWIDTH KATAKANA VOICED SOUND MARK +FF9F ; mapped ; 309A # 1.1 HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0 ; disallowed # 1.1 HALFWIDTH HANGUL FILLER +FFA1 ; mapped ; 1100 # 1.1 HALFWIDTH HANGUL LETTER KIYEOK +FFA2 ; mapped ; 1101 # 1.1 HALFWIDTH HANGUL LETTER SSANGKIYEOK +FFA3 ; mapped ; 11AA # 1.1 HALFWIDTH HANGUL LETTER KIYEOK-SIOS +FFA4 ; mapped ; 1102 # 1.1 HALFWIDTH HANGUL LETTER NIEUN +FFA5 ; mapped ; 11AC # 1.1 HALFWIDTH HANGUL LETTER NIEUN-CIEUC +FFA6 ; mapped ; 11AD # 1.1 HALFWIDTH HANGUL LETTER NIEUN-HIEUH +FFA7 ; mapped ; 1103 # 1.1 HALFWIDTH HANGUL LETTER TIKEUT +FFA8 ; mapped ; 1104 # 1.1 HALFWIDTH HANGUL LETTER SSANGTIKEUT +FFA9 ; mapped ; 1105 # 1.1 HALFWIDTH HANGUL LETTER RIEUL +FFAA ; mapped ; 11B0 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +FFAB ; mapped ; 11B1 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-MIEUM +FFAC ; mapped ; 11B2 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-PIEUP +FFAD ; mapped ; 11B3 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-SIOS +FFAE ; mapped ; 11B4 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +FFAF ; mapped ; 11B5 # 1.1 HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +FFB0 ; mapped ; 111A # 1.1 HALFWIDTH HANGUL LETTER RIEUL-HIEUH +FFB1 ; mapped ; 1106 # 1.1 HALFWIDTH HANGUL LETTER MIEUM +FFB2 ; mapped ; 1107 # 1.1 HALFWIDTH HANGUL LETTER PIEUP +FFB3 ; mapped ; 1108 # 1.1 HALFWIDTH HANGUL LETTER SSANGPIEUP +FFB4 ; mapped ; 1121 # 1.1 HALFWIDTH HANGUL LETTER PIEUP-SIOS +FFB5 ; mapped ; 1109 # 1.1 HALFWIDTH HANGUL LETTER SIOS +FFB6 ; mapped ; 110A # 1.1 HALFWIDTH HANGUL LETTER SSANGSIOS +FFB7 ; mapped ; 110B # 1.1 HALFWIDTH HANGUL LETTER IEUNG +FFB8 ; mapped ; 110C # 1.1 HALFWIDTH HANGUL LETTER CIEUC +FFB9 ; mapped ; 110D # 1.1 HALFWIDTH HANGUL LETTER SSANGCIEUC +FFBA ; mapped ; 110E # 1.1 HALFWIDTH HANGUL LETTER CHIEUCH +FFBB ; mapped ; 110F # 1.1 HALFWIDTH HANGUL LETTER KHIEUKH +FFBC ; mapped ; 1110 # 1.1 HALFWIDTH HANGUL LETTER THIEUTH +FFBD ; mapped ; 1111 # 1.1 HALFWIDTH HANGUL LETTER PHIEUPH +FFBE ; mapped ; 1112 # 1.1 HALFWIDTH HANGUL LETTER HIEUH +FFBF..FFC1 ; disallowed # NA <reserved-FFBF>..<reserved-FFC1> +FFC2 ; mapped ; 1161 # 1.1 HALFWIDTH HANGUL LETTER A +FFC3 ; mapped ; 1162 # 1.1 HALFWIDTH HANGUL LETTER AE +FFC4 ; mapped ; 1163 # 1.1 HALFWIDTH HANGUL LETTER YA +FFC5 ; mapped ; 1164 # 1.1 HALFWIDTH HANGUL LETTER YAE +FFC6 ; mapped ; 1165 # 1.1 HALFWIDTH HANGUL LETTER EO +FFC7 ; mapped ; 1166 # 1.1 HALFWIDTH HANGUL LETTER E +FFC8..FFC9 ; disallowed # NA <reserved-FFC8>..<reserved-FFC9> +FFCA ; mapped ; 1167 # 1.1 HALFWIDTH HANGUL LETTER YEO +FFCB ; mapped ; 1168 # 1.1 HALFWIDTH HANGUL LETTER YE +FFCC ; mapped ; 1169 # 1.1 HALFWIDTH HANGUL LETTER O +FFCD ; mapped ; 116A # 1.1 HALFWIDTH HANGUL LETTER WA +FFCE ; mapped ; 116B # 1.1 HALFWIDTH HANGUL LETTER WAE +FFCF ; mapped ; 116C # 1.1 HALFWIDTH HANGUL LETTER OE +FFD0..FFD1 ; disallowed # NA <reserved-FFD0>..<reserved-FFD1> +FFD2 ; mapped ; 116D # 1.1 HALFWIDTH HANGUL LETTER YO +FFD3 ; mapped ; 116E # 1.1 HALFWIDTH HANGUL LETTER U +FFD4 ; mapped ; 116F # 1.1 HALFWIDTH HANGUL LETTER WEO +FFD5 ; mapped ; 1170 # 1.1 HALFWIDTH HANGUL LETTER WE +FFD6 ; mapped ; 1171 # 1.1 HALFWIDTH HANGUL LETTER WI +FFD7 ; mapped ; 1172 # 1.1 HALFWIDTH HANGUL LETTER YU +FFD8..FFD9 ; disallowed # NA <reserved-FFD8>..<reserved-FFD9> +FFDA ; mapped ; 1173 # 1.1 HALFWIDTH HANGUL LETTER EU +FFDB ; mapped ; 1174 # 1.1 HALFWIDTH HANGUL LETTER YI +FFDC ; mapped ; 1175 # 1.1 HALFWIDTH HANGUL LETTER I +FFDD..FFDF ; disallowed # NA <reserved-FFDD>..<reserved-FFDF> +FFE0 ; mapped ; 00A2 # 1.1 FULLWIDTH CENT SIGN +FFE1 ; mapped ; 00A3 # 1.1 FULLWIDTH POUND SIGN +FFE2 ; mapped ; 00AC # 1.1 FULLWIDTH NOT SIGN +FFE3 ; disallowed_STD3_mapped ; 0020 0304 # 1.1 FULLWIDTH MACRON +FFE4 ; mapped ; 00A6 # 1.1 FULLWIDTH BROKEN BAR +FFE5 ; mapped ; 00A5 # 1.1 FULLWIDTH YEN SIGN +FFE6 ; mapped ; 20A9 # 1.1 FULLWIDTH WON SIGN +FFE7 ; disallowed # NA <reserved-FFE7> +FFE8 ; mapped ; 2502 # 1.1 HALFWIDTH FORMS LIGHT VERTICAL +FFE9 ; mapped ; 2190 # 1.1 HALFWIDTH LEFTWARDS ARROW +FFEA ; mapped ; 2191 # 1.1 HALFWIDTH UPWARDS ARROW +FFEB ; mapped ; 2192 # 1.1 HALFWIDTH RIGHTWARDS ARROW +FFEC ; mapped ; 2193 # 1.1 HALFWIDTH DOWNWARDS ARROW +FFED ; mapped ; 25A0 # 1.1 HALFWIDTH BLACK SQUARE +FFEE ; mapped ; 25CB # 1.1 HALFWIDTH WHITE CIRCLE +FFEF..FFF8 ; disallowed # NA <reserved-FFEF>..<reserved-FFF8> +FFF9..FFFB ; disallowed # 3.0 INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC ; disallowed # 2.1 OBJECT REPLACEMENT CHARACTER +FFFD ; disallowed # 1.1 REPLACEMENT CHARACTER +FFFE..FFFF ; disallowed # 1.1 <noncharacter-FFFE>..<noncharacter-FFFF> +10000..1000B ; valid # 4.0 LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000C ; disallowed # NA <reserved-1000C> +1000D..10026 ; valid # 4.0 LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10027 ; disallowed # NA <reserved-10027> +10028..1003A ; valid # 4.0 LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003B ; disallowed # NA <reserved-1003B> +1003C..1003D ; valid # 4.0 LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003E ; disallowed # NA <reserved-1003E> +1003F..1004D ; valid # 4.0 LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +1004E..1004F ; disallowed # NA <reserved-1004E>..<reserved-1004F> +10050..1005D ; valid # 4.0 LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +1005E..1007F ; disallowed # NA <reserved-1005E>..<reserved-1007F> +10080..100FA ; valid # 4.0 LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +100FB..100FF ; disallowed # NA <reserved-100FB>..<reserved-100FF> +10100..10102 ; valid ; ; NV8 # 4.0 AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10103..10106 ; disallowed # NA <reserved-10103>..<reserved-10106> +10107..10133 ; valid ; ; NV8 # 4.0 AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10134..10136 ; disallowed # NA <reserved-10134>..<reserved-10136> +10137..1013F ; valid ; ; NV8 # 4.0 AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10140..1018A ; valid ; ; NV8 # 4.1 GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ZERO SIGN +1018B..1018C ; valid ; ; NV8 # 7.0 GREEK ONE QUARTER SIGN..GREEK SINUSOID SIGN +1018D..1018E ; valid ; ; NV8 # 9.0 GREEK INDICTION SIGN..NOMISMA SIGN +1018F ; disallowed # NA <reserved-1018F> +10190..1019B ; valid ; ; NV8 # 5.1 ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN +1019C..1019F ; disallowed # NA <reserved-1019C>..<reserved-1019F> +101A0 ; valid ; ; NV8 # 7.0 GREEK SYMBOL TAU RHO +101A1..101CF ; disallowed # NA <reserved-101A1>..<reserved-101CF> +101D0..101FC ; valid ; ; NV8 # 5.1 PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND +101FD ; valid # 5.1 PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +101FE..1027F ; disallowed # NA <reserved-101FE>..<reserved-1027F> +10280..1029C ; valid # 5.1 LYCIAN LETTER A..LYCIAN LETTER X +1029D..1029F ; disallowed # NA <reserved-1029D>..<reserved-1029F> +102A0..102D0 ; valid # 5.1 CARIAN LETTER A..CARIAN LETTER UUU3 +102D1..102DF ; disallowed # NA <reserved-102D1>..<reserved-102DF> +102E0 ; valid # 7.0 COPTIC EPACT THOUSANDS MARK +102E1..102FB ; valid ; ; NV8 # 7.0 COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED +102FC..102FF ; disallowed # NA <reserved-102FC>..<reserved-102FF> +10300..1031E ; valid # 3.1 OLD ITALIC LETTER A..OLD ITALIC LETTER UU +1031F ; valid # 7.0 OLD ITALIC LETTER ESS +10320..10323 ; valid ; ; NV8 # 3.1 OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +10324..1032F ; disallowed # NA <reserved-10324>..<reserved-1032F> +10330..10340 ; valid # 3.1 GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA +10341 ; valid ; ; NV8 # 3.1 GOTHIC LETTER NINETY +10342..10349 ; valid # 3.1 GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; valid ; ; NV8 # 3.1 GOTHIC LETTER NINE HUNDRED +1034B..1034F ; disallowed # NA <reserved-1034B>..<reserved-1034F> +10350..1037A ; valid # 7.0 OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +1037B..1037F ; disallowed # NA <reserved-1037B>..<reserved-1037F> +10380..1039D ; valid # 4.0 UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039E ; disallowed # NA <reserved-1039E> +1039F ; valid ; ; NV8 # 4.0 UGARITIC WORD DIVIDER +103A0..103C3 ; valid # 4.1 OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C4..103C7 ; disallowed # NA <reserved-103C4>..<reserved-103C7> +103C8..103CF ; valid # 4.1 OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0..103D5 ; valid ; ; NV8 # 4.1 OLD PERSIAN WORD DIVIDER..OLD PERSIAN NUMBER HUNDRED +103D6..103FF ; disallowed # NA <reserved-103D6>..<reserved-103FF> +10400 ; mapped ; 10428 # 3.1 DESERET CAPITAL LETTER LONG I +10401 ; mapped ; 10429 # 3.1 DESERET CAPITAL LETTER LONG E +10402 ; mapped ; 1042A # 3.1 DESERET CAPITAL LETTER LONG A +10403 ; mapped ; 1042B # 3.1 DESERET CAPITAL LETTER LONG AH +10404 ; mapped ; 1042C # 3.1 DESERET CAPITAL LETTER LONG O +10405 ; mapped ; 1042D # 3.1 DESERET CAPITAL LETTER LONG OO +10406 ; mapped ; 1042E # 3.1 DESERET CAPITAL LETTER SHORT I +10407 ; mapped ; 1042F # 3.1 DESERET CAPITAL LETTER SHORT E +10408 ; mapped ; 10430 # 3.1 DESERET CAPITAL LETTER SHORT A +10409 ; mapped ; 10431 # 3.1 DESERET CAPITAL LETTER SHORT AH +1040A ; mapped ; 10432 # 3.1 DESERET CAPITAL LETTER SHORT O +1040B ; mapped ; 10433 # 3.1 DESERET CAPITAL LETTER SHORT OO +1040C ; mapped ; 10434 # 3.1 DESERET CAPITAL LETTER AY +1040D ; mapped ; 10435 # 3.1 DESERET CAPITAL LETTER OW +1040E ; mapped ; 10436 # 3.1 DESERET CAPITAL LETTER WU +1040F ; mapped ; 10437 # 3.1 DESERET CAPITAL LETTER YEE +10410 ; mapped ; 10438 # 3.1 DESERET CAPITAL LETTER H +10411 ; mapped ; 10439 # 3.1 DESERET CAPITAL LETTER PEE +10412 ; mapped ; 1043A # 3.1 DESERET CAPITAL LETTER BEE +10413 ; mapped ; 1043B # 3.1 DESERET CAPITAL LETTER TEE +10414 ; mapped ; 1043C # 3.1 DESERET CAPITAL LETTER DEE +10415 ; mapped ; 1043D # 3.1 DESERET CAPITAL LETTER CHEE +10416 ; mapped ; 1043E # 3.1 DESERET CAPITAL LETTER JEE +10417 ; mapped ; 1043F # 3.1 DESERET CAPITAL LETTER KAY +10418 ; mapped ; 10440 # 3.1 DESERET CAPITAL LETTER GAY +10419 ; mapped ; 10441 # 3.1 DESERET CAPITAL LETTER EF +1041A ; mapped ; 10442 # 3.1 DESERET CAPITAL LETTER VEE +1041B ; mapped ; 10443 # 3.1 DESERET CAPITAL LETTER ETH +1041C ; mapped ; 10444 # 3.1 DESERET CAPITAL LETTER THEE +1041D ; mapped ; 10445 # 3.1 DESERET CAPITAL LETTER ES +1041E ; mapped ; 10446 # 3.1 DESERET CAPITAL LETTER ZEE +1041F ; mapped ; 10447 # 3.1 DESERET CAPITAL LETTER ESH +10420 ; mapped ; 10448 # 3.1 DESERET CAPITAL LETTER ZHEE +10421 ; mapped ; 10449 # 3.1 DESERET CAPITAL LETTER ER +10422 ; mapped ; 1044A # 3.1 DESERET CAPITAL LETTER EL +10423 ; mapped ; 1044B # 3.1 DESERET CAPITAL LETTER EM +10424 ; mapped ; 1044C # 3.1 DESERET CAPITAL LETTER EN +10425 ; mapped ; 1044D # 3.1 DESERET CAPITAL LETTER ENG +10426 ; mapped ; 1044E # 4.0 DESERET CAPITAL LETTER OI +10427 ; mapped ; 1044F # 4.0 DESERET CAPITAL LETTER EW +10428..1044D ; valid # 3.1 DESERET SMALL LETTER LONG I..DESERET SMALL LETTER ENG +1044E..1049D ; valid # 4.0 DESERET SMALL LETTER OI..OSMANYA LETTER OO +1049E..1049F ; disallowed # NA <reserved-1049E>..<reserved-1049F> +104A0..104A9 ; valid # 4.0 OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104AA..104AF ; disallowed # NA <reserved-104AA>..<reserved-104AF> +104B0 ; mapped ; 104D8 # 9.0 OSAGE CAPITAL LETTER A +104B1 ; mapped ; 104D9 # 9.0 OSAGE CAPITAL LETTER AI +104B2 ; mapped ; 104DA # 9.0 OSAGE CAPITAL LETTER AIN +104B3 ; mapped ; 104DB # 9.0 OSAGE CAPITAL LETTER AH +104B4 ; mapped ; 104DC # 9.0 OSAGE CAPITAL LETTER BRA +104B5 ; mapped ; 104DD # 9.0 OSAGE CAPITAL LETTER CHA +104B6 ; mapped ; 104DE # 9.0 OSAGE CAPITAL LETTER EHCHA +104B7 ; mapped ; 104DF # 9.0 OSAGE CAPITAL LETTER E +104B8 ; mapped ; 104E0 # 9.0 OSAGE CAPITAL LETTER EIN +104B9 ; mapped ; 104E1 # 9.0 OSAGE CAPITAL LETTER HA +104BA ; mapped ; 104E2 # 9.0 OSAGE CAPITAL LETTER HYA +104BB ; mapped ; 104E3 # 9.0 OSAGE CAPITAL LETTER I +104BC ; mapped ; 104E4 # 9.0 OSAGE CAPITAL LETTER KA +104BD ; mapped ; 104E5 # 9.0 OSAGE CAPITAL LETTER EHKA +104BE ; mapped ; 104E6 # 9.0 OSAGE CAPITAL LETTER KYA +104BF ; mapped ; 104E7 # 9.0 OSAGE CAPITAL LETTER LA +104C0 ; mapped ; 104E8 # 9.0 OSAGE CAPITAL LETTER MA +104C1 ; mapped ; 104E9 # 9.0 OSAGE CAPITAL LETTER NA +104C2 ; mapped ; 104EA # 9.0 OSAGE CAPITAL LETTER O +104C3 ; mapped ; 104EB # 9.0 OSAGE CAPITAL LETTER OIN +104C4 ; mapped ; 104EC # 9.0 OSAGE CAPITAL LETTER PA +104C5 ; mapped ; 104ED # 9.0 OSAGE CAPITAL LETTER EHPA +104C6 ; mapped ; 104EE # 9.0 OSAGE CAPITAL LETTER SA +104C7 ; mapped ; 104EF # 9.0 OSAGE CAPITAL LETTER SHA +104C8 ; mapped ; 104F0 # 9.0 OSAGE CAPITAL LETTER TA +104C9 ; mapped ; 104F1 # 9.0 OSAGE CAPITAL LETTER EHTA +104CA ; mapped ; 104F2 # 9.0 OSAGE CAPITAL LETTER TSA +104CB ; mapped ; 104F3 # 9.0 OSAGE CAPITAL LETTER EHTSA +104CC ; mapped ; 104F4 # 9.0 OSAGE CAPITAL LETTER TSHA +104CD ; mapped ; 104F5 # 9.0 OSAGE CAPITAL LETTER DHA +104CE ; mapped ; 104F6 # 9.0 OSAGE CAPITAL LETTER U +104CF ; mapped ; 104F7 # 9.0 OSAGE CAPITAL LETTER WA +104D0 ; mapped ; 104F8 # 9.0 OSAGE CAPITAL LETTER KHA +104D1 ; mapped ; 104F9 # 9.0 OSAGE CAPITAL LETTER GHA +104D2 ; mapped ; 104FA # 9.0 OSAGE CAPITAL LETTER ZA +104D3 ; mapped ; 104FB # 9.0 OSAGE CAPITAL LETTER ZHA +104D4..104D7 ; disallowed # NA <reserved-104D4>..<reserved-104D7> +104D8..104FB ; valid # 9.0 OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +104FC..104FF ; disallowed # NA <reserved-104FC>..<reserved-104FF> +10500..10527 ; valid # 7.0 ELBASAN LETTER A..ELBASAN LETTER KHE +10528..1052F ; disallowed # NA <reserved-10528>..<reserved-1052F> +10530..10563 ; valid # 7.0 CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +10564..1056E ; disallowed # NA <reserved-10564>..<reserved-1056E> +1056F ; valid ; ; NV8 # 7.0 CAUCASIAN ALBANIAN CITATION MARK +10570..105FF ; disallowed # NA <reserved-10570>..<reserved-105FF> +10600..10736 ; valid # 7.0 LINEAR A SIGN AB001..LINEAR A SIGN A664 +10737..1073F ; disallowed # NA <reserved-10737>..<reserved-1073F> +10740..10755 ; valid # 7.0 LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10756..1075F ; disallowed # NA <reserved-10756>..<reserved-1075F> +10760..10767 ; valid # 7.0 LINEAR A SIGN A800..LINEAR A SIGN A807 +10768..107FF ; disallowed # NA <reserved-10768>..<reserved-107FF> +10800..10805 ; valid # 4.0 CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10806..10807 ; disallowed # NA <reserved-10806>..<reserved-10807> +10808 ; valid # 4.0 CYPRIOT SYLLABLE JO +10809 ; disallowed # NA <reserved-10809> +1080A..10835 ; valid # 4.0 CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10836 ; disallowed # NA <reserved-10836> +10837..10838 ; valid # 4.0 CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +10839..1083B ; disallowed # NA <reserved-10839>..<reserved-1083B> +1083C ; valid # 4.0 CYPRIOT SYLLABLE ZA +1083D..1083E ; disallowed # NA <reserved-1083D>..<reserved-1083E> +1083F ; valid # 4.0 CYPRIOT SYLLABLE ZO +10840..10855 ; valid # 5.2 IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW +10856 ; disallowed # NA <reserved-10856> +10857..1085F ; valid ; ; NV8 # 5.2 IMPERIAL ARAMAIC SECTION SIGN..IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10860..10876 ; valid # 7.0 PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..1087F ; valid ; ; NV8 # 7.0 PALMYRENE LEFT-POINTING FLEURON..PALMYRENE NUMBER TWENTY +10880..1089E ; valid # 7.0 NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +1089F..108A6 ; disallowed # NA <reserved-1089F>..<reserved-108A6> +108A7..108AF ; valid ; ; NV8 # 7.0 NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED +108B0..108DF ; disallowed # NA <reserved-108B0>..<reserved-108DF> +108E0..108F2 ; valid # 8.0 HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F3 ; disallowed # NA <reserved-108F3> +108F4..108F5 ; valid # 8.0 HATRAN LETTER SHIN..HATRAN LETTER TAW +108F6..108FA ; disallowed # NA <reserved-108F6>..<reserved-108FA> +108FB..108FF ; valid ; ; NV8 # 8.0 HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED +10900..10915 ; valid # 5.0 PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..10919 ; valid ; ; NV8 # 5.0 PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED +1091A..1091B ; valid ; ; NV8 # 5.2 PHOENICIAN NUMBER TWO..PHOENICIAN NUMBER THREE +1091C..1091E ; disallowed # NA <reserved-1091C>..<reserved-1091E> +1091F ; valid ; ; NV8 # 5.0 PHOENICIAN WORD SEPARATOR +10920..10939 ; valid # 5.1 LYDIAN LETTER A..LYDIAN LETTER C +1093A..1093E ; disallowed # NA <reserved-1093A>..<reserved-1093E> +1093F ; valid ; ; NV8 # 5.1 LYDIAN TRIANGULAR MARK +10940..1097F ; disallowed # NA <reserved-10940>..<reserved-1097F> +10980..109B7 ; valid # 6.1 MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA +109B8..109BB ; disallowed # NA <reserved-109B8>..<reserved-109BB> +109BC..109BD ; valid ; ; NV8 # 8.0 MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF ; valid # 6.1 MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF ; valid ; ; NV8 # 8.0 MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D0..109D1 ; disallowed # NA <reserved-109D0>..<reserved-109D1> +109D2..109FF ; valid ; ; NV8 # 8.0 MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A00..10A03 ; valid # 4.1 KHAROSHTHI LETTER A..KHAROSHTHI VOWEL SIGN VOCALIC R +10A04 ; disallowed # NA <reserved-10A04> +10A05..10A06 ; valid # 4.1 KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A07..10A0B ; disallowed # NA <reserved-10A07>..<reserved-10A0B> +10A0C..10A13 ; valid # 4.1 KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI LETTER GHA +10A14 ; disallowed # NA <reserved-10A14> +10A15..10A17 ; valid # 4.1 KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A18 ; disallowed # NA <reserved-10A18> +10A19..10A33 ; valid # 4.1 KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA +10A34..10A37 ; disallowed # NA <reserved-10A34>..<reserved-10A37> +10A38..10A3A ; valid # 4.1 KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3B..10A3E ; disallowed # NA <reserved-10A3B>..<reserved-10A3E> +10A3F ; valid # 4.1 KHAROSHTHI VIRAMA +10A40..10A47 ; valid ; ; NV8 # 4.1 KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND +10A48..10A4F ; disallowed # NA <reserved-10A48>..<reserved-10A4F> +10A50..10A58 ; valid ; ; NV8 # 4.1 KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES +10A59..10A5F ; disallowed # NA <reserved-10A59>..<reserved-10A5F> +10A60..10A7C ; valid # 5.2 OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7F ; valid ; ; NV8 # 5.2 OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMERIC INDICATOR +10A80..10A9C ; valid # 7.0 OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F ; valid ; ; NV8 # 7.0 OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY +10AA0..10ABF ; disallowed # NA <reserved-10AA0>..<reserved-10ABF> +10AC0..10AC7 ; valid # 7.0 MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8 ; valid ; ; NV8 # 7.0 MANICHAEAN SIGN UD +10AC9..10AE6 ; valid # 7.0 MANICHAEAN LETTER ZAYIN..MANICHAEAN ABBREVIATION MARK BELOW +10AE7..10AEA ; disallowed # NA <reserved-10AE7>..<reserved-10AEA> +10AEB..10AF6 ; valid ; ; NV8 # 7.0 MANICHAEAN NUMBER ONE..MANICHAEAN PUNCTUATION LINE FILLER +10AF7..10AFF ; disallowed # NA <reserved-10AF7>..<reserved-10AFF> +10B00..10B35 ; valid # 5.2 AVESTAN LETTER A..AVESTAN LETTER HE +10B36..10B38 ; disallowed # NA <reserved-10B36>..<reserved-10B38> +10B39..10B3F ; valid ; ; NV8 # 5.2 AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B40..10B55 ; valid # 5.2 INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B56..10B57 ; disallowed # NA <reserved-10B56>..<reserved-10B57> +10B58..10B5F ; valid ; ; NV8 # 5.2 INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B60..10B72 ; valid # 5.2 INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B73..10B77 ; disallowed # NA <reserved-10B73>..<reserved-10B77> +10B78..10B7F ; valid ; ; NV8 # 5.2 INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B80..10B91 ; valid # 7.0 PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B92..10B98 ; disallowed # NA <reserved-10B92>..<reserved-10B98> +10B99..10B9C ; valid ; ; NV8 # 7.0 PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10B9D..10BA8 ; disallowed # NA <reserved-10B9D>..<reserved-10BA8> +10BA9..10BAF ; valid ; ; NV8 # 7.0 PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED +10BB0..10BFF ; disallowed # NA <reserved-10BB0>..<reserved-10BFF> +10C00..10C48 ; valid # 5.2 OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C49..10C7F ; disallowed # NA <reserved-10C49>..<reserved-10C7F> +10C80 ; mapped ; 10CC0 # 8.0 OLD HUNGARIAN CAPITAL LETTER A +10C81 ; mapped ; 10CC1 # 8.0 OLD HUNGARIAN CAPITAL LETTER AA +10C82 ; mapped ; 10CC2 # 8.0 OLD HUNGARIAN CAPITAL LETTER EB +10C83 ; mapped ; 10CC3 # 8.0 OLD HUNGARIAN CAPITAL LETTER AMB +10C84 ; mapped ; 10CC4 # 8.0 OLD HUNGARIAN CAPITAL LETTER EC +10C85 ; mapped ; 10CC5 # 8.0 OLD HUNGARIAN CAPITAL LETTER ENC +10C86 ; mapped ; 10CC6 # 8.0 OLD HUNGARIAN CAPITAL LETTER ECS +10C87 ; mapped ; 10CC7 # 8.0 OLD HUNGARIAN CAPITAL LETTER ED +10C88 ; mapped ; 10CC8 # 8.0 OLD HUNGARIAN CAPITAL LETTER AND +10C89 ; mapped ; 10CC9 # 8.0 OLD HUNGARIAN CAPITAL LETTER E +10C8A ; mapped ; 10CCA # 8.0 OLD HUNGARIAN CAPITAL LETTER CLOSE E +10C8B ; mapped ; 10CCB # 8.0 OLD HUNGARIAN CAPITAL LETTER EE +10C8C ; mapped ; 10CCC # 8.0 OLD HUNGARIAN CAPITAL LETTER EF +10C8D ; mapped ; 10CCD # 8.0 OLD HUNGARIAN CAPITAL LETTER EG +10C8E ; mapped ; 10CCE # 8.0 OLD HUNGARIAN CAPITAL LETTER EGY +10C8F ; mapped ; 10CCF # 8.0 OLD HUNGARIAN CAPITAL LETTER EH +10C90 ; mapped ; 10CD0 # 8.0 OLD HUNGARIAN CAPITAL LETTER I +10C91 ; mapped ; 10CD1 # 8.0 OLD HUNGARIAN CAPITAL LETTER II +10C92 ; mapped ; 10CD2 # 8.0 OLD HUNGARIAN CAPITAL LETTER EJ +10C93 ; mapped ; 10CD3 # 8.0 OLD HUNGARIAN CAPITAL LETTER EK +10C94 ; mapped ; 10CD4 # 8.0 OLD HUNGARIAN CAPITAL LETTER AK +10C95 ; mapped ; 10CD5 # 8.0 OLD HUNGARIAN CAPITAL LETTER UNK +10C96 ; mapped ; 10CD6 # 8.0 OLD HUNGARIAN CAPITAL LETTER EL +10C97 ; mapped ; 10CD7 # 8.0 OLD HUNGARIAN CAPITAL LETTER ELY +10C98 ; mapped ; 10CD8 # 8.0 OLD HUNGARIAN CAPITAL LETTER EM +10C99 ; mapped ; 10CD9 # 8.0 OLD HUNGARIAN CAPITAL LETTER EN +10C9A ; mapped ; 10CDA # 8.0 OLD HUNGARIAN CAPITAL LETTER ENY +10C9B ; mapped ; 10CDB # 8.0 OLD HUNGARIAN CAPITAL LETTER O +10C9C ; mapped ; 10CDC # 8.0 OLD HUNGARIAN CAPITAL LETTER OO +10C9D ; mapped ; 10CDD # 8.0 OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +10C9E ; mapped ; 10CDE # 8.0 OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +10C9F ; mapped ; 10CDF # 8.0 OLD HUNGARIAN CAPITAL LETTER OEE +10CA0 ; mapped ; 10CE0 # 8.0 OLD HUNGARIAN CAPITAL LETTER EP +10CA1 ; mapped ; 10CE1 # 8.0 OLD HUNGARIAN CAPITAL LETTER EMP +10CA2 ; mapped ; 10CE2 # 8.0 OLD HUNGARIAN CAPITAL LETTER ER +10CA3 ; mapped ; 10CE3 # 8.0 OLD HUNGARIAN CAPITAL LETTER SHORT ER +10CA4 ; mapped ; 10CE4 # 8.0 OLD HUNGARIAN CAPITAL LETTER ES +10CA5 ; mapped ; 10CE5 # 8.0 OLD HUNGARIAN CAPITAL LETTER ESZ +10CA6 ; mapped ; 10CE6 # 8.0 OLD HUNGARIAN CAPITAL LETTER ET +10CA7 ; mapped ; 10CE7 # 8.0 OLD HUNGARIAN CAPITAL LETTER ENT +10CA8 ; mapped ; 10CE8 # 8.0 OLD HUNGARIAN CAPITAL LETTER ETY +10CA9 ; mapped ; 10CE9 # 8.0 OLD HUNGARIAN CAPITAL LETTER ECH +10CAA ; mapped ; 10CEA # 8.0 OLD HUNGARIAN CAPITAL LETTER U +10CAB ; mapped ; 10CEB # 8.0 OLD HUNGARIAN CAPITAL LETTER UU +10CAC ; mapped ; 10CEC # 8.0 OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +10CAD ; mapped ; 10CED # 8.0 OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +10CAE ; mapped ; 10CEE # 8.0 OLD HUNGARIAN CAPITAL LETTER EV +10CAF ; mapped ; 10CEF # 8.0 OLD HUNGARIAN CAPITAL LETTER EZ +10CB0 ; mapped ; 10CF0 # 8.0 OLD HUNGARIAN CAPITAL LETTER EZS +10CB1 ; mapped ; 10CF1 # 8.0 OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +10CB2 ; mapped ; 10CF2 # 8.0 OLD HUNGARIAN CAPITAL LETTER US +10CB3..10CBF ; disallowed # NA <reserved-10CB3>..<reserved-10CBF> +10CC0..10CF2 ; valid # 8.0 OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CF3..10CF9 ; disallowed # NA <reserved-10CF3>..<reserved-10CF9> +10CFA..10CFF ; valid ; ; NV8 # 8.0 OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND +10D00..10E5F ; disallowed # NA <reserved-10D00>..<reserved-10E5F> +10E60..10E7E ; valid ; ; NV8 # 5.2 RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10E7F..10FFF ; disallowed # NA <reserved-10E7F>..<reserved-10FFF> +11000..11046 ; valid # 6.0 BRAHMI SIGN CANDRABINDU..BRAHMI VIRAMA +11047..1104D ; valid ; ; NV8 # 6.0 BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +1104E..11051 ; disallowed # NA <reserved-1104E>..<reserved-11051> +11052..11065 ; valid ; ; NV8 # 6.0 BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F ; valid # 6.0 BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +11070..1107E ; disallowed # NA <reserved-11070>..<reserved-1107E> +1107F ; valid # 7.0 BRAHMI NUMBER JOINER +11080..110BA ; valid # 5.2 KAITHI SIGN CANDRABINDU..KAITHI SIGN NUKTA +110BB..110BC ; valid ; ; NV8 # 5.2 KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BD ; disallowed # 5.2 KAITHI NUMBER SIGN +110BE..110C1 ; valid ; ; NV8 # 5.2 KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110C2..110CF ; disallowed # NA <reserved-110C2>..<reserved-110CF> +110D0..110E8 ; valid # 6.1 SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110E9..110EF ; disallowed # NA <reserved-110E9>..<reserved-110EF> +110F0..110F9 ; valid # 6.1 SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +110FA..110FF ; disallowed # NA <reserved-110FA>..<reserved-110FF> +11100..11134 ; valid # 6.1 CHAKMA SIGN CANDRABINDU..CHAKMA MAAYYAA +11135 ; disallowed # NA <reserved-11135> +11136..1113F ; valid # 6.1 CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143 ; valid ; ; NV8 # 6.1 CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144..1114F ; disallowed # NA <reserved-11144>..<reserved-1114F> +11150..11173 ; valid # 7.0 MAHAJANI LETTER A..MAHAJANI SIGN NUKTA +11174..11175 ; valid ; ; NV8 # 7.0 MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK +11176 ; valid # 7.0 MAHAJANI LIGATURE SHRI +11177..1117F ; disallowed # NA <reserved-11177>..<reserved-1117F> +11180..111C4 ; valid # 6.1 SHARADA SIGN CANDRABINDU..SHARADA OM +111C5..111C8 ; valid ; ; NV8 # 6.1 SHARADA DANDA..SHARADA SEPARATOR +111C9 ; valid ; ; NV8 # 8.0 SHARADA SANDHI MARK +111CA..111CC ; valid # 8.0 SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK +111CD ; valid ; ; NV8 # 7.0 SHARADA SUTRA MARK +111CE..111CF ; disallowed # NA <reserved-111CE>..<reserved-111CF> +111D0..111D9 ; valid # 6.1 SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; valid # 7.0 SHARADA EKAM +111DB ; valid ; ; NV8 # 8.0 SHARADA SIGN SIDDHAM +111DC ; valid # 8.0 SHARADA HEADSTROKE +111DD..111DF ; valid ; ; NV8 # 8.0 SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 +111E0 ; disallowed # NA <reserved-111E0> +111E1..111F4 ; valid ; ; NV8 # 7.0 SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +111F5..111FF ; disallowed # NA <reserved-111F5>..<reserved-111FF> +11200..11211 ; valid # 7.0 KHOJKI LETTER A..KHOJKI LETTER JJA +11212 ; disallowed # NA <reserved-11212> +11213..11237 ; valid # 7.0 KHOJKI LETTER NYA..KHOJKI SIGN SHADDA +11238..1123D ; valid ; ; NV8 # 7.0 KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +1123E ; valid # 9.0 KHOJKI SIGN SUKUN +1123F..1127F ; disallowed # NA <reserved-1123F>..<reserved-1127F> +11280..11286 ; valid # 8.0 MULTANI LETTER A..MULTANI LETTER GA +11287 ; disallowed # NA <reserved-11287> +11288 ; valid # 8.0 MULTANI LETTER GHA +11289 ; disallowed # NA <reserved-11289> +1128A..1128D ; valid # 8.0 MULTANI LETTER CA..MULTANI LETTER JJA +1128E ; disallowed # NA <reserved-1128E> +1128F..1129D ; valid # 8.0 MULTANI LETTER NYA..MULTANI LETTER BA +1129E ; disallowed # NA <reserved-1129E> +1129F..112A8 ; valid # 8.0 MULTANI LETTER BHA..MULTANI LETTER RHA +112A9 ; valid ; ; NV8 # 8.0 MULTANI SECTION MARK +112AA..112AF ; disallowed # NA <reserved-112AA>..<reserved-112AF> +112B0..112EA ; valid # 7.0 KHUDAWADI LETTER A..KHUDAWADI SIGN VIRAMA +112EB..112EF ; disallowed # NA <reserved-112EB>..<reserved-112EF> +112F0..112F9 ; valid # 7.0 KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +112FA..112FF ; disallowed # NA <reserved-112FA>..<reserved-112FF> +11300 ; valid # 8.0 GRANTHA SIGN COMBINING ANUSVARA ABOVE +11301..11303 ; valid # 7.0 GRANTHA SIGN CANDRABINDU..GRANTHA SIGN VISARGA +11304 ; disallowed # NA <reserved-11304> +11305..1130C ; valid # 7.0 GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130D..1130E ; disallowed # NA <reserved-1130D>..<reserved-1130E> +1130F..11310 ; valid # 7.0 GRANTHA LETTER EE..GRANTHA LETTER AI +11311..11312 ; disallowed # NA <reserved-11311>..<reserved-11312> +11313..11328 ; valid # 7.0 GRANTHA LETTER OO..GRANTHA LETTER NA +11329 ; disallowed # NA <reserved-11329> +1132A..11330 ; valid # 7.0 GRANTHA LETTER PA..GRANTHA LETTER RA +11331 ; disallowed # NA <reserved-11331> +11332..11333 ; valid # 7.0 GRANTHA LETTER LA..GRANTHA LETTER LLA +11334 ; disallowed # NA <reserved-11334> +11335..11339 ; valid # 7.0 GRANTHA LETTER VA..GRANTHA LETTER HA +1133A..1133B ; disallowed # NA <reserved-1133A>..<reserved-1133B> +1133C..11344 ; valid # 7.0 GRANTHA SIGN NUKTA..GRANTHA VOWEL SIGN VOCALIC RR +11345..11346 ; disallowed # NA <reserved-11345>..<reserved-11346> +11347..11348 ; valid # 7.0 GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +11349..1134A ; disallowed # NA <reserved-11349>..<reserved-1134A> +1134B..1134D ; valid # 7.0 GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +1134E..1134F ; disallowed # NA <reserved-1134E>..<reserved-1134F> +11350 ; valid # 8.0 GRANTHA OM +11351..11356 ; disallowed # NA <reserved-11351>..<reserved-11356> +11357 ; valid # 7.0 GRANTHA AU LENGTH MARK +11358..1135C ; disallowed # NA <reserved-11358>..<reserved-1135C> +1135D..11363 ; valid # 7.0 GRANTHA SIGN PLUTA..GRANTHA VOWEL SIGN VOCALIC LL +11364..11365 ; disallowed # NA <reserved-11364>..<reserved-11365> +11366..1136C ; valid # 7.0 COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +1136D..1136F ; disallowed # NA <reserved-1136D>..<reserved-1136F> +11370..11374 ; valid # 7.0 COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11375..113FF ; disallowed # NA <reserved-11375>..<reserved-113FF> +11400..1144A ; valid # 9.0 NEWA LETTER A..NEWA SIDDHI +1144B..1144F ; valid ; ; NV8 # 9.0 NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459 ; valid # 9.0 NEWA DIGIT ZERO..NEWA DIGIT NINE +1145A ; disallowed # NA <reserved-1145A> +1145B ; valid ; ; NV8 # 9.0 NEWA PLACEHOLDER MARK +1145C ; disallowed # NA <reserved-1145C> +1145D ; valid ; ; NV8 # 9.0 NEWA INSERTION SIGN +1145E..1147F ; disallowed # NA <reserved-1145E>..<reserved-1147F> +11480..114C5 ; valid # 7.0 TIRHUTA ANJI..TIRHUTA GVANG +114C6 ; valid ; ; NV8 # 7.0 TIRHUTA ABBREVIATION SIGN +114C7 ; valid # 7.0 TIRHUTA OM +114C8..114CF ; disallowed # NA <reserved-114C8>..<reserved-114CF> +114D0..114D9 ; valid # 7.0 TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +114DA..1157F ; disallowed # NA <reserved-114DA>..<reserved-1157F> +11580..115B5 ; valid # 7.0 SIDDHAM LETTER A..SIDDHAM VOWEL SIGN VOCALIC RR +115B6..115B7 ; disallowed # NA <reserved-115B6>..<reserved-115B7> +115B8..115C0 ; valid # 7.0 SIDDHAM VOWEL SIGN E..SIDDHAM SIGN NUKTA +115C1..115C9 ; valid ; ; NV8 # 7.0 SIDDHAM SIGN SIDDHAM..SIDDHAM END OF TEXT MARK +115CA..115D7 ; valid ; ; NV8 # 8.0 SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DD ; valid # 8.0 SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM VOWEL SIGN ALTERNATE UU +115DE..115FF ; disallowed # NA <reserved-115DE>..<reserved-115FF> +11600..11640 ; valid # 7.0 MODI LETTER A..MODI SIGN ARDHACANDRA +11641..11643 ; valid ; ; NV8 # 7.0 MODI DANDA..MODI ABBREVIATION SIGN +11644 ; valid # 7.0 MODI SIGN HUVA +11645..1164F ; disallowed # NA <reserved-11645>..<reserved-1164F> +11650..11659 ; valid # 7.0 MODI DIGIT ZERO..MODI DIGIT NINE +1165A..1165F ; disallowed # NA <reserved-1165A>..<reserved-1165F> +11660..1166C ; valid ; ; NV8 # 9.0 MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +1166D..1167F ; disallowed # NA <reserved-1166D>..<reserved-1167F> +11680..116B7 ; valid # 6.1 TAKRI LETTER A..TAKRI SIGN NUKTA +116B8..116BF ; disallowed # NA <reserved-116B8>..<reserved-116BF> +116C0..116C9 ; valid # 6.1 TAKRI DIGIT ZERO..TAKRI DIGIT NINE +116CA..116FF ; disallowed # NA <reserved-116CA>..<reserved-116FF> +11700..11719 ; valid # 8.0 AHOM LETTER KA..AHOM LETTER JHA +1171A..1171C ; disallowed # NA <reserved-1171A>..<reserved-1171C> +1171D..1172B ; valid # 8.0 AHOM CONSONANT SIGN MEDIAL LA..AHOM SIGN KILLER +1172C..1172F ; disallowed # NA <reserved-1172C>..<reserved-1172F> +11730..11739 ; valid # 8.0 AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173F ; valid ; ; NV8 # 8.0 AHOM NUMBER TEN..AHOM SYMBOL VI +11740..1189F ; disallowed # NA <reserved-11740>..<reserved-1189F> +118A0 ; mapped ; 118C0 # 7.0 WARANG CITI CAPITAL LETTER NGAA +118A1 ; mapped ; 118C1 # 7.0 WARANG CITI CAPITAL LETTER A +118A2 ; mapped ; 118C2 # 7.0 WARANG CITI CAPITAL LETTER WI +118A3 ; mapped ; 118C3 # 7.0 WARANG CITI CAPITAL LETTER YU +118A4 ; mapped ; 118C4 # 7.0 WARANG CITI CAPITAL LETTER YA +118A5 ; mapped ; 118C5 # 7.0 WARANG CITI CAPITAL LETTER YO +118A6 ; mapped ; 118C6 # 7.0 WARANG CITI CAPITAL LETTER II +118A7 ; mapped ; 118C7 # 7.0 WARANG CITI CAPITAL LETTER UU +118A8 ; mapped ; 118C8 # 7.0 WARANG CITI CAPITAL LETTER E +118A9 ; mapped ; 118C9 # 7.0 WARANG CITI CAPITAL LETTER O +118AA ; mapped ; 118CA # 7.0 WARANG CITI CAPITAL LETTER ANG +118AB ; mapped ; 118CB # 7.0 WARANG CITI CAPITAL LETTER GA +118AC ; mapped ; 118CC # 7.0 WARANG CITI CAPITAL LETTER KO +118AD ; mapped ; 118CD # 7.0 WARANG CITI CAPITAL LETTER ENY +118AE ; mapped ; 118CE # 7.0 WARANG CITI CAPITAL LETTER YUJ +118AF ; mapped ; 118CF # 7.0 WARANG CITI CAPITAL LETTER UC +118B0 ; mapped ; 118D0 # 7.0 WARANG CITI CAPITAL LETTER ENN +118B1 ; mapped ; 118D1 # 7.0 WARANG CITI CAPITAL LETTER ODD +118B2 ; mapped ; 118D2 # 7.0 WARANG CITI CAPITAL LETTER TTE +118B3 ; mapped ; 118D3 # 7.0 WARANG CITI CAPITAL LETTER NUNG +118B4 ; mapped ; 118D4 # 7.0 WARANG CITI CAPITAL LETTER DA +118B5 ; mapped ; 118D5 # 7.0 WARANG CITI CAPITAL LETTER AT +118B6 ; mapped ; 118D6 # 7.0 WARANG CITI CAPITAL LETTER AM +118B7 ; mapped ; 118D7 # 7.0 WARANG CITI CAPITAL LETTER BU +118B8 ; mapped ; 118D8 # 7.0 WARANG CITI CAPITAL LETTER PU +118B9 ; mapped ; 118D9 # 7.0 WARANG CITI CAPITAL LETTER HIYO +118BA ; mapped ; 118DA # 7.0 WARANG CITI CAPITAL LETTER HOLO +118BB ; mapped ; 118DB # 7.0 WARANG CITI CAPITAL LETTER HORR +118BC ; mapped ; 118DC # 7.0 WARANG CITI CAPITAL LETTER HAR +118BD ; mapped ; 118DD # 7.0 WARANG CITI CAPITAL LETTER SSUU +118BE ; mapped ; 118DE # 7.0 WARANG CITI CAPITAL LETTER SII +118BF ; mapped ; 118DF # 7.0 WARANG CITI CAPITAL LETTER VIYO +118C0..118E9 ; valid # 7.0 WARANG CITI SMALL LETTER NGAA..WARANG CITI DIGIT NINE +118EA..118F2 ; valid ; ; NV8 # 7.0 WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY +118F3..118FE ; disallowed # NA <reserved-118F3>..<reserved-118FE> +118FF ; valid # 7.0 WARANG CITI OM +11900..11ABF ; disallowed # NA <reserved-11900>..<reserved-11ABF> +11AC0..11AF8 ; valid # 7.0 PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11AF9..11BFF ; disallowed # NA <reserved-11AF9>..<reserved-11BFF> +11C00..11C08 ; valid # 9.0 BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C09 ; disallowed # NA <reserved-11C09> +11C0A..11C36 ; valid # 9.0 BHAIKSUKI LETTER E..BHAIKSUKI VOWEL SIGN VOCALIC L +11C37 ; disallowed # NA <reserved-11C37> +11C38..11C40 ; valid # 9.0 BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; valid ; ; NV8 # 9.0 BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C46..11C4F ; disallowed # NA <reserved-11C46>..<reserved-11C4F> +11C50..11C59 ; valid # 9.0 BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; valid ; ; NV8 # 9.0 BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +11C6D..11C6F ; disallowed # NA <reserved-11C6D>..<reserved-11C6F> +11C70..11C71 ; valid ; ; NV8 # 9.0 MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F ; valid # 9.0 MARCHEN LETTER KA..MARCHEN LETTER A +11C90..11C91 ; disallowed # NA <reserved-11C90>..<reserved-11C91> +11C92..11CA7 ; valid # 9.0 MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA8 ; disallowed # NA <reserved-11CA8> +11CA9..11CB6 ; valid # 9.0 MARCHEN SUBJOINED LETTER YA..MARCHEN SIGN CANDRABINDU +11CB7..11FFF ; disallowed # NA <reserved-11CB7>..<reserved-11FFF> +12000..1236E ; valid # 5.0 CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM +1236F..12398 ; valid # 7.0 CUNEIFORM SIGN KAP ELAMITE..CUNEIFORM SIGN UM TIMES ME +12399 ; valid # 8.0 CUNEIFORM SIGN U U +1239A..123FF ; disallowed # NA <reserved-1239A>..<reserved-123FF> +12400..12462 ; valid ; ; NV8 # 5.0 CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER +12463..1246E ; valid ; ; NV8 # 7.0 CUNEIFORM NUMERIC SIGN ONE QUARTER GUR..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +1246F ; disallowed # NA <reserved-1246F> +12470..12473 ; valid ; ; NV8 # 5.0 CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON +12474 ; valid ; ; NV8 # 7.0 CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12475..1247F ; disallowed # NA <reserved-12475>..<reserved-1247F> +12480..12543 ; valid # 8.0 CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12544..12FFF ; disallowed # NA <reserved-12544>..<reserved-12FFF> +13000..1342E ; valid # 5.2 EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +1342F..143FF ; disallowed # NA <reserved-1342F>..<reserved-143FF> +14400..14646 ; valid # 8.0 ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +14647..167FF ; disallowed # NA <reserved-14647>..<reserved-167FF> +16800..16A38 ; valid # 6.0 BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A39..16A3F ; disallowed # NA <reserved-16A39>..<reserved-16A3F> +16A40..16A5E ; valid # 7.0 MRO LETTER TA..MRO LETTER TEK +16A5F ; disallowed # NA <reserved-16A5F> +16A60..16A69 ; valid # 7.0 MRO DIGIT ZERO..MRO DIGIT NINE +16A6A..16A6D ; disallowed # NA <reserved-16A6A>..<reserved-16A6D> +16A6E..16A6F ; valid ; ; NV8 # 7.0 MRO DANDA..MRO DOUBLE DANDA +16A70..16ACF ; disallowed # NA <reserved-16A70>..<reserved-16ACF> +16AD0..16AED ; valid # 7.0 BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AEE..16AEF ; disallowed # NA <reserved-16AEE>..<reserved-16AEF> +16AF0..16AF4 ; valid # 7.0 BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16AF5 ; valid ; ; NV8 # 7.0 BASSA VAH FULL STOP +16AF6..16AFF ; disallowed # NA <reserved-16AF6>..<reserved-16AFF> +16B00..16B36 ; valid # 7.0 PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG MARK CIM TAUM +16B37..16B3F ; valid ; ; NV8 # 7.0 PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43 ; valid # 7.0 PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44..16B45 ; valid ; ; NV8 # 7.0 PAHAWH HMONG SIGN XAUS..PAHAWH HMONG SIGN CIM TSOV ROG +16B46..16B4F ; disallowed # NA <reserved-16B46>..<reserved-16B4F> +16B50..16B59 ; valid # 7.0 PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5A ; disallowed # NA <reserved-16B5A> +16B5B..16B61 ; valid ; ; NV8 # 7.0 PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B62 ; disallowed # NA <reserved-16B62> +16B63..16B77 ; valid # 7.0 PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B78..16B7C ; disallowed # NA <reserved-16B78>..<reserved-16B7C> +16B7D..16B8F ; valid # 7.0 PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16B90..16EFF ; disallowed # NA <reserved-16B90>..<reserved-16EFF> +16F00..16F44 ; valid # 6.1 MIAO LETTER PA..MIAO LETTER HHA +16F45..16F4F ; disallowed # NA <reserved-16F45>..<reserved-16F4F> +16F50..16F7E ; valid # 6.1 MIAO LETTER NASALIZATION..MIAO VOWEL SIGN NG +16F7F..16F8E ; disallowed # NA <reserved-16F7F>..<reserved-16F8E> +16F8F..16F9F ; valid # 6.1 MIAO TONE RIGHT..MIAO LETTER REFORMED TONE-8 +16FA0..16FDF ; disallowed # NA <reserved-16FA0>..<reserved-16FDF> +16FE0 ; valid # 9.0 TANGUT ITERATION MARK +16FE1..16FFF ; disallowed # NA <reserved-16FE1>..<reserved-16FFF> +17000..187EC ; valid # 9.0 TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC +187ED..187FF ; disallowed # NA <reserved-187ED>..<reserved-187FF> +18800..18AF2 ; valid # 9.0 TANGUT COMPONENT-001..TANGUT COMPONENT-755 +18AF3..1AFFF ; disallowed # NA <reserved-18AF3>..<reserved-1AFFF> +1B000..1B001 ; valid # 6.0 KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE +1B002..1BBFF ; disallowed # NA <reserved-1B002>..<reserved-1BBFF> +1BC00..1BC6A ; valid # 7.0 DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC6B..1BC6F ; disallowed # NA <reserved-1BC6B>..<reserved-1BC6F> +1BC70..1BC7C ; valid # 7.0 DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC7D..1BC7F ; disallowed # NA <reserved-1BC7D>..<reserved-1BC7F> +1BC80..1BC88 ; valid # 7.0 DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC89..1BC8F ; disallowed # NA <reserved-1BC89>..<reserved-1BC8F> +1BC90..1BC99 ; valid # 7.0 DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9A..1BC9B ; disallowed # NA <reserved-1BC9A>..<reserved-1BC9B> +1BC9C ; valid ; ; NV8 # 7.0 DUPLOYAN SIGN O WITH CROSS +1BC9D..1BC9E ; valid # 7.0 DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BC9F ; valid ; ; NV8 # 7.0 DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1BCA0..1BCA3 ; ignored # 7.0 SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1BCA4..1CFFF ; disallowed # NA <reserved-1BCA4>..<reserved-1CFFF> +1D000..1D0F5 ; valid ; ; NV8 # 3.1 BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D0F6..1D0FF ; disallowed # NA <reserved-1D0F6>..<reserved-1D0FF> +1D100..1D126 ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D127..1D128 ; disallowed # NA <reserved-1D127>..<reserved-1D128> +1D129 ; valid ; ; NV8 # 5.1 MUSICAL SYMBOL MULTIPLE MEASURE REST +1D12A..1D15D ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL WHOLE NOTE +1D15E ; mapped ; 1D157 1D165 # 3.1 MUSICAL SYMBOL HALF NOTE +1D15F ; mapped ; 1D158 1D165 # 3.1 MUSICAL SYMBOL QUARTER NOTE +1D160 ; mapped ; 1D158 1D165 1D16E #3.1 MUSICAL SYMBOL EIGHTH NOTE +1D161 ; mapped ; 1D158 1D165 1D16F #3.1 MUSICAL SYMBOL SIXTEENTH NOTE +1D162 ; mapped ; 1D158 1D165 1D170 #3.1 MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163 ; mapped ; 1D158 1D165 1D171 #3.1 MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164 ; mapped ; 1D158 1D165 1D172 #3.1 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D172 ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A ; disallowed # 3.1 MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D17B..1D1BA ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL SEMIBREVIS BLACK +1D1BB ; mapped ; 1D1B9 1D165 # 3.1 MUSICAL SYMBOL MINIMA +1D1BC ; mapped ; 1D1BA 1D165 # 3.1 MUSICAL SYMBOL MINIMA BLACK +1D1BD ; mapped ; 1D1B9 1D165 1D16E #3.1 MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE ; mapped ; 1D1BA 1D165 1D16E #3.1 MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF ; mapped ; 1D1B9 1D165 1D16F #3.1 MUSICAL SYMBOL FUSA WHITE +1D1C0 ; mapped ; 1D1BA 1D165 1D16F #3.1 MUSICAL SYMBOL FUSA BLACK +1D1C1..1D1DD ; valid ; ; NV8 # 3.1 MUSICAL SYMBOL LONGA PERFECTA REST..MUSICAL SYMBOL PES SUBPUNCTIS +1D1DE..1D1E8 ; valid ; ; NV8 # 8.0 MUSICAL SYMBOL KIEVAN C CLEF..MUSICAL SYMBOL KIEVAN FLAT SIGN +1D1E9..1D1FF ; disallowed # NA <reserved-1D1E9>..<reserved-1D1FF> +1D200..1D245 ; valid ; ; NV8 # 4.1 GREEK VOCAL NOTATION SYMBOL-1..GREEK MUSICAL LEIMMA +1D246..1D2FF ; disallowed # NA <reserved-1D246>..<reserved-1D2FF> +1D300..1D356 ; valid ; ; NV8 # 4.0 MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D357..1D35F ; disallowed # NA <reserved-1D357>..<reserved-1D35F> +1D360..1D371 ; valid ; ; NV8 # 5.0 COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE +1D372..1D3FF ; disallowed # NA <reserved-1D372>..<reserved-1D3FF> +1D400 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD CAPITAL A +1D401 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD CAPITAL B +1D402 ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD CAPITAL C +1D403 ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD CAPITAL D +1D404 ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD CAPITAL E +1D405 ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD CAPITAL F +1D406 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD CAPITAL G +1D407 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD CAPITAL H +1D408 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD CAPITAL I +1D409 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD CAPITAL J +1D40A ; mapped ; 006B # 3.1 MATHEMATICAL BOLD CAPITAL K +1D40B ; mapped ; 006C # 3.1 MATHEMATICAL BOLD CAPITAL L +1D40C ; mapped ; 006D # 3.1 MATHEMATICAL BOLD CAPITAL M +1D40D ; mapped ; 006E # 3.1 MATHEMATICAL BOLD CAPITAL N +1D40E ; mapped ; 006F # 3.1 MATHEMATICAL BOLD CAPITAL O +1D40F ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD CAPITAL P +1D410 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD CAPITAL Q +1D411 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD CAPITAL R +1D412 ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD CAPITAL S +1D413 ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD CAPITAL T +1D414 ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD CAPITAL U +1D415 ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD CAPITAL V +1D416 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD CAPITAL W +1D417 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD CAPITAL X +1D418 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD CAPITAL Y +1D419 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD CAPITAL Z +1D41A ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD SMALL A +1D41B ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD SMALL B +1D41C ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD SMALL C +1D41D ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD SMALL D +1D41E ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD SMALL E +1D41F ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD SMALL F +1D420 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD SMALL G +1D421 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD SMALL H +1D422 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD SMALL I +1D423 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD SMALL J +1D424 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD SMALL K +1D425 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD SMALL L +1D426 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD SMALL M +1D427 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD SMALL N +1D428 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD SMALL O +1D429 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD SMALL P +1D42A ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD SMALL Q +1D42B ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD SMALL R +1D42C ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD SMALL S +1D42D ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD SMALL T +1D42E ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD SMALL U +1D42F ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD SMALL V +1D430 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD SMALL W +1D431 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD SMALL X +1D432 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD SMALL Y +1D433 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD SMALL Z +1D434 ; mapped ; 0061 # 3.1 MATHEMATICAL ITALIC CAPITAL A +1D435 ; mapped ; 0062 # 3.1 MATHEMATICAL ITALIC CAPITAL B +1D436 ; mapped ; 0063 # 3.1 MATHEMATICAL ITALIC CAPITAL C +1D437 ; mapped ; 0064 # 3.1 MATHEMATICAL ITALIC CAPITAL D +1D438 ; mapped ; 0065 # 3.1 MATHEMATICAL ITALIC CAPITAL E +1D439 ; mapped ; 0066 # 3.1 MATHEMATICAL ITALIC CAPITAL F +1D43A ; mapped ; 0067 # 3.1 MATHEMATICAL ITALIC CAPITAL G +1D43B ; mapped ; 0068 # 3.1 MATHEMATICAL ITALIC CAPITAL H +1D43C ; mapped ; 0069 # 3.1 MATHEMATICAL ITALIC CAPITAL I +1D43D ; mapped ; 006A # 3.1 MATHEMATICAL ITALIC CAPITAL J +1D43E ; mapped ; 006B # 3.1 MATHEMATICAL ITALIC CAPITAL K +1D43F ; mapped ; 006C # 3.1 MATHEMATICAL ITALIC CAPITAL L +1D440 ; mapped ; 006D # 3.1 MATHEMATICAL ITALIC CAPITAL M +1D441 ; mapped ; 006E # 3.1 MATHEMATICAL ITALIC CAPITAL N +1D442 ; mapped ; 006F # 3.1 MATHEMATICAL ITALIC CAPITAL O +1D443 ; mapped ; 0070 # 3.1 MATHEMATICAL ITALIC CAPITAL P +1D444 ; mapped ; 0071 # 3.1 MATHEMATICAL ITALIC CAPITAL Q +1D445 ; mapped ; 0072 # 3.1 MATHEMATICAL ITALIC CAPITAL R +1D446 ; mapped ; 0073 # 3.1 MATHEMATICAL ITALIC CAPITAL S +1D447 ; mapped ; 0074 # 3.1 MATHEMATICAL ITALIC CAPITAL T +1D448 ; mapped ; 0075 # 3.1 MATHEMATICAL ITALIC CAPITAL U +1D449 ; mapped ; 0076 # 3.1 MATHEMATICAL ITALIC CAPITAL V +1D44A ; mapped ; 0077 # 3.1 MATHEMATICAL ITALIC CAPITAL W +1D44B ; mapped ; 0078 # 3.1 MATHEMATICAL ITALIC CAPITAL X +1D44C ; mapped ; 0079 # 3.1 MATHEMATICAL ITALIC CAPITAL Y +1D44D ; mapped ; 007A # 3.1 MATHEMATICAL ITALIC CAPITAL Z +1D44E ; mapped ; 0061 # 3.1 MATHEMATICAL ITALIC SMALL A +1D44F ; mapped ; 0062 # 3.1 MATHEMATICAL ITALIC SMALL B +1D450 ; mapped ; 0063 # 3.1 MATHEMATICAL ITALIC SMALL C +1D451 ; mapped ; 0064 # 3.1 MATHEMATICAL ITALIC SMALL D +1D452 ; mapped ; 0065 # 3.1 MATHEMATICAL ITALIC SMALL E +1D453 ; mapped ; 0066 # 3.1 MATHEMATICAL ITALIC SMALL F +1D454 ; mapped ; 0067 # 3.1 MATHEMATICAL ITALIC SMALL G +1D455 ; disallowed # NA <reserved-1D455> +1D456 ; mapped ; 0069 # 3.1 MATHEMATICAL ITALIC SMALL I +1D457 ; mapped ; 006A # 3.1 MATHEMATICAL ITALIC SMALL J +1D458 ; mapped ; 006B # 3.1 MATHEMATICAL ITALIC SMALL K +1D459 ; mapped ; 006C # 3.1 MATHEMATICAL ITALIC SMALL L +1D45A ; mapped ; 006D # 3.1 MATHEMATICAL ITALIC SMALL M +1D45B ; mapped ; 006E # 3.1 MATHEMATICAL ITALIC SMALL N +1D45C ; mapped ; 006F # 3.1 MATHEMATICAL ITALIC SMALL O +1D45D ; mapped ; 0070 # 3.1 MATHEMATICAL ITALIC SMALL P +1D45E ; mapped ; 0071 # 3.1 MATHEMATICAL ITALIC SMALL Q +1D45F ; mapped ; 0072 # 3.1 MATHEMATICAL ITALIC SMALL R +1D460 ; mapped ; 0073 # 3.1 MATHEMATICAL ITALIC SMALL S +1D461 ; mapped ; 0074 # 3.1 MATHEMATICAL ITALIC SMALL T +1D462 ; mapped ; 0075 # 3.1 MATHEMATICAL ITALIC SMALL U +1D463 ; mapped ; 0076 # 3.1 MATHEMATICAL ITALIC SMALL V +1D464 ; mapped ; 0077 # 3.1 MATHEMATICAL ITALIC SMALL W +1D465 ; mapped ; 0078 # 3.1 MATHEMATICAL ITALIC SMALL X +1D466 ; mapped ; 0079 # 3.1 MATHEMATICAL ITALIC SMALL Y +1D467 ; mapped ; 007A # 3.1 MATHEMATICAL ITALIC SMALL Z +1D468 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL A +1D469 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL B +1D46A ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL C +1D46B ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL D +1D46C ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL E +1D46D ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL F +1D46E ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL G +1D46F ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL H +1D470 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL I +1D471 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL J +1D472 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL K +1D473 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL L +1D474 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL M +1D475 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL N +1D476 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL O +1D477 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL P +1D478 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL Q +1D479 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL R +1D47A ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL S +1D47B ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL T +1D47C ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL U +1D47D ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL V +1D47E ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL W +1D47F ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL X +1D480 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL Y +1D481 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL Z +1D482 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD ITALIC SMALL A +1D483 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD ITALIC SMALL B +1D484 ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD ITALIC SMALL C +1D485 ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD ITALIC SMALL D +1D486 ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD ITALIC SMALL E +1D487 ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD ITALIC SMALL F +1D488 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD ITALIC SMALL G +1D489 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD ITALIC SMALL H +1D48A ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD ITALIC SMALL I +1D48B ; mapped ; 006A # 3.1 MATHEMATICAL BOLD ITALIC SMALL J +1D48C ; mapped ; 006B # 3.1 MATHEMATICAL BOLD ITALIC SMALL K +1D48D ; mapped ; 006C # 3.1 MATHEMATICAL BOLD ITALIC SMALL L +1D48E ; mapped ; 006D # 3.1 MATHEMATICAL BOLD ITALIC SMALL M +1D48F ; mapped ; 006E # 3.1 MATHEMATICAL BOLD ITALIC SMALL N +1D490 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD ITALIC SMALL O +1D491 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD ITALIC SMALL P +1D492 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD ITALIC SMALL Q +1D493 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD ITALIC SMALL R +1D494 ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD ITALIC SMALL S +1D495 ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD ITALIC SMALL T +1D496 ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD ITALIC SMALL U +1D497 ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD ITALIC SMALL V +1D498 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD ITALIC SMALL W +1D499 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD ITALIC SMALL X +1D49A ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD ITALIC SMALL Y +1D49B ; mapped ; 007A # 3.1 MATHEMATICAL BOLD ITALIC SMALL Z +1D49C ; mapped ; 0061 # 3.1 MATHEMATICAL SCRIPT CAPITAL A +1D49D ; disallowed # NA <reserved-1D49D> +1D49E ; mapped ; 0063 # 3.1 MATHEMATICAL SCRIPT CAPITAL C +1D49F ; mapped ; 0064 # 3.1 MATHEMATICAL SCRIPT CAPITAL D +1D4A0..1D4A1 ; disallowed # NA <reserved-1D4A0>..<reserved-1D4A1> +1D4A2 ; mapped ; 0067 # 3.1 MATHEMATICAL SCRIPT CAPITAL G +1D4A3..1D4A4 ; disallowed # NA <reserved-1D4A3>..<reserved-1D4A4> +1D4A5 ; mapped ; 006A # 3.1 MATHEMATICAL SCRIPT CAPITAL J +1D4A6 ; mapped ; 006B # 3.1 MATHEMATICAL SCRIPT CAPITAL K +1D4A7..1D4A8 ; disallowed # NA <reserved-1D4A7>..<reserved-1D4A8> +1D4A9 ; mapped ; 006E # 3.1 MATHEMATICAL SCRIPT CAPITAL N +1D4AA ; mapped ; 006F # 3.1 MATHEMATICAL SCRIPT CAPITAL O +1D4AB ; mapped ; 0070 # 3.1 MATHEMATICAL SCRIPT CAPITAL P +1D4AC ; mapped ; 0071 # 3.1 MATHEMATICAL SCRIPT CAPITAL Q +1D4AD ; disallowed # NA <reserved-1D4AD> +1D4AE ; mapped ; 0073 # 3.1 MATHEMATICAL SCRIPT CAPITAL S +1D4AF ; mapped ; 0074 # 3.1 MATHEMATICAL SCRIPT CAPITAL T +1D4B0 ; mapped ; 0075 # 3.1 MATHEMATICAL SCRIPT CAPITAL U +1D4B1 ; mapped ; 0076 # 3.1 MATHEMATICAL SCRIPT CAPITAL V +1D4B2 ; mapped ; 0077 # 3.1 MATHEMATICAL SCRIPT CAPITAL W +1D4B3 ; mapped ; 0078 # 3.1 MATHEMATICAL SCRIPT CAPITAL X +1D4B4 ; mapped ; 0079 # 3.1 MATHEMATICAL SCRIPT CAPITAL Y +1D4B5 ; mapped ; 007A # 3.1 MATHEMATICAL SCRIPT CAPITAL Z +1D4B6 ; mapped ; 0061 # 3.1 MATHEMATICAL SCRIPT SMALL A +1D4B7 ; mapped ; 0062 # 3.1 MATHEMATICAL SCRIPT SMALL B +1D4B8 ; mapped ; 0063 # 3.1 MATHEMATICAL SCRIPT SMALL C +1D4B9 ; mapped ; 0064 # 3.1 MATHEMATICAL SCRIPT SMALL D +1D4BA ; disallowed # NA <reserved-1D4BA> +1D4BB ; mapped ; 0066 # 3.1 MATHEMATICAL SCRIPT SMALL F +1D4BC ; disallowed # NA <reserved-1D4BC> +1D4BD ; mapped ; 0068 # 3.1 MATHEMATICAL SCRIPT SMALL H +1D4BE ; mapped ; 0069 # 3.1 MATHEMATICAL SCRIPT SMALL I +1D4BF ; mapped ; 006A # 3.1 MATHEMATICAL SCRIPT SMALL J +1D4C0 ; mapped ; 006B # 3.1 MATHEMATICAL SCRIPT SMALL K +1D4C1 ; mapped ; 006C # 4.0 MATHEMATICAL SCRIPT SMALL L +1D4C2 ; mapped ; 006D # 3.1 MATHEMATICAL SCRIPT SMALL M +1D4C3 ; mapped ; 006E # 3.1 MATHEMATICAL SCRIPT SMALL N +1D4C4 ; disallowed # NA <reserved-1D4C4> +1D4C5 ; mapped ; 0070 # 3.1 MATHEMATICAL SCRIPT SMALL P +1D4C6 ; mapped ; 0071 # 3.1 MATHEMATICAL SCRIPT SMALL Q +1D4C7 ; mapped ; 0072 # 3.1 MATHEMATICAL SCRIPT SMALL R +1D4C8 ; mapped ; 0073 # 3.1 MATHEMATICAL SCRIPT SMALL S +1D4C9 ; mapped ; 0074 # 3.1 MATHEMATICAL SCRIPT SMALL T +1D4CA ; mapped ; 0075 # 3.1 MATHEMATICAL SCRIPT SMALL U +1D4CB ; mapped ; 0076 # 3.1 MATHEMATICAL SCRIPT SMALL V +1D4CC ; mapped ; 0077 # 3.1 MATHEMATICAL SCRIPT SMALL W +1D4CD ; mapped ; 0078 # 3.1 MATHEMATICAL SCRIPT SMALL X +1D4CE ; mapped ; 0079 # 3.1 MATHEMATICAL SCRIPT SMALL Y +1D4CF ; mapped ; 007A # 3.1 MATHEMATICAL SCRIPT SMALL Z +1D4D0 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL A +1D4D1 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL B +1D4D2 ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL C +1D4D3 ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL D +1D4D4 ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL E +1D4D5 ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL F +1D4D6 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL G +1D4D7 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL H +1D4D8 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL I +1D4D9 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL J +1D4DA ; mapped ; 006B # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL K +1D4DB ; mapped ; 006C # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL L +1D4DC ; mapped ; 006D # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL M +1D4DD ; mapped ; 006E # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL N +1D4DE ; mapped ; 006F # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL O +1D4DF ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL P +1D4E0 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D4E1 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL R +1D4E2 ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL S +1D4E3 ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL T +1D4E4 ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL U +1D4E5 ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL V +1D4E6 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL W +1D4E7 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL X +1D4E8 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D4E9 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D4EA ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL A +1D4EB ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL B +1D4EC ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL C +1D4ED ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL D +1D4EE ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL E +1D4EF ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL F +1D4F0 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL G +1D4F1 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL H +1D4F2 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL I +1D4F3 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD SCRIPT SMALL J +1D4F4 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD SCRIPT SMALL K +1D4F5 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD SCRIPT SMALL L +1D4F6 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD SCRIPT SMALL M +1D4F7 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD SCRIPT SMALL N +1D4F8 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD SCRIPT SMALL O +1D4F9 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL P +1D4FA ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL Q +1D4FB ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL R +1D4FC ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL S +1D4FD ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL T +1D4FE ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL U +1D4FF ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL V +1D500 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL W +1D501 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL X +1D502 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD SCRIPT SMALL Y +1D503 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD SCRIPT SMALL Z +1D504 ; mapped ; 0061 # 3.1 MATHEMATICAL FRAKTUR CAPITAL A +1D505 ; mapped ; 0062 # 3.1 MATHEMATICAL FRAKTUR CAPITAL B +1D506 ; disallowed # NA <reserved-1D506> +1D507 ; mapped ; 0064 # 3.1 MATHEMATICAL FRAKTUR CAPITAL D +1D508 ; mapped ; 0065 # 3.1 MATHEMATICAL FRAKTUR CAPITAL E +1D509 ; mapped ; 0066 # 3.1 MATHEMATICAL FRAKTUR CAPITAL F +1D50A ; mapped ; 0067 # 3.1 MATHEMATICAL FRAKTUR CAPITAL G +1D50B..1D50C ; disallowed # NA <reserved-1D50B>..<reserved-1D50C> +1D50D ; mapped ; 006A # 3.1 MATHEMATICAL FRAKTUR CAPITAL J +1D50E ; mapped ; 006B # 3.1 MATHEMATICAL FRAKTUR CAPITAL K +1D50F ; mapped ; 006C # 3.1 MATHEMATICAL FRAKTUR CAPITAL L +1D510 ; mapped ; 006D # 3.1 MATHEMATICAL FRAKTUR CAPITAL M +1D511 ; mapped ; 006E # 3.1 MATHEMATICAL FRAKTUR CAPITAL N +1D512 ; mapped ; 006F # 3.1 MATHEMATICAL FRAKTUR CAPITAL O +1D513 ; mapped ; 0070 # 3.1 MATHEMATICAL FRAKTUR CAPITAL P +1D514 ; mapped ; 0071 # 3.1 MATHEMATICAL FRAKTUR CAPITAL Q +1D515 ; disallowed # NA <reserved-1D515> +1D516 ; mapped ; 0073 # 3.1 MATHEMATICAL FRAKTUR CAPITAL S +1D517 ; mapped ; 0074 # 3.1 MATHEMATICAL FRAKTUR CAPITAL T +1D518 ; mapped ; 0075 # 3.1 MATHEMATICAL FRAKTUR CAPITAL U +1D519 ; mapped ; 0076 # 3.1 MATHEMATICAL FRAKTUR CAPITAL V +1D51A ; mapped ; 0077 # 3.1 MATHEMATICAL FRAKTUR CAPITAL W +1D51B ; mapped ; 0078 # 3.1 MATHEMATICAL FRAKTUR CAPITAL X +1D51C ; mapped ; 0079 # 3.1 MATHEMATICAL FRAKTUR CAPITAL Y +1D51D ; disallowed # NA <reserved-1D51D> +1D51E ; mapped ; 0061 # 3.1 MATHEMATICAL FRAKTUR SMALL A +1D51F ; mapped ; 0062 # 3.1 MATHEMATICAL FRAKTUR SMALL B +1D520 ; mapped ; 0063 # 3.1 MATHEMATICAL FRAKTUR SMALL C +1D521 ; mapped ; 0064 # 3.1 MATHEMATICAL FRAKTUR SMALL D +1D522 ; mapped ; 0065 # 3.1 MATHEMATICAL FRAKTUR SMALL E +1D523 ; mapped ; 0066 # 3.1 MATHEMATICAL FRAKTUR SMALL F +1D524 ; mapped ; 0067 # 3.1 MATHEMATICAL FRAKTUR SMALL G +1D525 ; mapped ; 0068 # 3.1 MATHEMATICAL FRAKTUR SMALL H +1D526 ; mapped ; 0069 # 3.1 MATHEMATICAL FRAKTUR SMALL I +1D527 ; mapped ; 006A # 3.1 MATHEMATICAL FRAKTUR SMALL J +1D528 ; mapped ; 006B # 3.1 MATHEMATICAL FRAKTUR SMALL K +1D529 ; mapped ; 006C # 3.1 MATHEMATICAL FRAKTUR SMALL L +1D52A ; mapped ; 006D # 3.1 MATHEMATICAL FRAKTUR SMALL M +1D52B ; mapped ; 006E # 3.1 MATHEMATICAL FRAKTUR SMALL N +1D52C ; mapped ; 006F # 3.1 MATHEMATICAL FRAKTUR SMALL O +1D52D ; mapped ; 0070 # 3.1 MATHEMATICAL FRAKTUR SMALL P +1D52E ; mapped ; 0071 # 3.1 MATHEMATICAL FRAKTUR SMALL Q +1D52F ; mapped ; 0072 # 3.1 MATHEMATICAL FRAKTUR SMALL R +1D530 ; mapped ; 0073 # 3.1 MATHEMATICAL FRAKTUR SMALL S +1D531 ; mapped ; 0074 # 3.1 MATHEMATICAL FRAKTUR SMALL T +1D532 ; mapped ; 0075 # 3.1 MATHEMATICAL FRAKTUR SMALL U +1D533 ; mapped ; 0076 # 3.1 MATHEMATICAL FRAKTUR SMALL V +1D534 ; mapped ; 0077 # 3.1 MATHEMATICAL FRAKTUR SMALL W +1D535 ; mapped ; 0078 # 3.1 MATHEMATICAL FRAKTUR SMALL X +1D536 ; mapped ; 0079 # 3.1 MATHEMATICAL FRAKTUR SMALL Y +1D537 ; mapped ; 007A # 3.1 MATHEMATICAL FRAKTUR SMALL Z +1D538 ; mapped ; 0061 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D539 ; mapped ; 0062 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53A ; disallowed # NA <reserved-1D53A> +1D53B ; mapped ; 0064 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D53C ; mapped ; 0065 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D53D ; mapped ; 0066 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D53E ; mapped ; 0067 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D53F ; disallowed # NA <reserved-1D53F> +1D540 ; mapped ; 0069 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D541 ; mapped ; 006A # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D542 ; mapped ; 006B # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D543 ; mapped ; 006C # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D544 ; mapped ; 006D # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D545 ; disallowed # NA <reserved-1D545> +1D546 ; mapped ; 006F # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D547..1D549 ; disallowed # NA <reserved-1D547>..<reserved-1D549> +1D54A ; mapped ; 0073 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D54B ; mapped ; 0074 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D54C ; mapped ; 0075 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D54D ; mapped ; 0076 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D54E ; mapped ; 0077 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D54F ; mapped ; 0078 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D550 ; mapped ; 0079 # 3.1 MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D551 ; disallowed # NA <reserved-1D551> +1D552 ; mapped ; 0061 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL A +1D553 ; mapped ; 0062 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL B +1D554 ; mapped ; 0063 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL C +1D555 ; mapped ; 0064 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL D +1D556 ; mapped ; 0065 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL E +1D557 ; mapped ; 0066 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL F +1D558 ; mapped ; 0067 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL G +1D559 ; mapped ; 0068 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL H +1D55A ; mapped ; 0069 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL I +1D55B ; mapped ; 006A # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL J +1D55C ; mapped ; 006B # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL K +1D55D ; mapped ; 006C # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL L +1D55E ; mapped ; 006D # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL M +1D55F ; mapped ; 006E # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL N +1D560 ; mapped ; 006F # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL O +1D561 ; mapped ; 0070 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL P +1D562 ; mapped ; 0071 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D563 ; mapped ; 0072 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL R +1D564 ; mapped ; 0073 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL S +1D565 ; mapped ; 0074 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL T +1D566 ; mapped ; 0075 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL U +1D567 ; mapped ; 0076 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL V +1D568 ; mapped ; 0077 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL W +1D569 ; mapped ; 0078 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL X +1D56A ; mapped ; 0079 # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D56B ; mapped ; 007A # 3.1 MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D56C ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D56D ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D56E ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D56F ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D570 ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D571 ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D572 ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D573 ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D574 ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D575 ; mapped ; 006A # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D576 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D577 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D578 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D579 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D57A ; mapped ; 006F # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D57B ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D57C ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D57D ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D57E ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D57F ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D580 ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D581 ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D582 ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D583 ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D584 ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D585 ; mapped ; 007A # 3.1 MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D586 ; mapped ; 0061 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL A +1D587 ; mapped ; 0062 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL B +1D588 ; mapped ; 0063 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL C +1D589 ; mapped ; 0064 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL D +1D58A ; mapped ; 0065 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL E +1D58B ; mapped ; 0066 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL F +1D58C ; mapped ; 0067 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL G +1D58D ; mapped ; 0068 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL H +1D58E ; mapped ; 0069 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL I +1D58F ; mapped ; 006A # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL J +1D590 ; mapped ; 006B # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL K +1D591 ; mapped ; 006C # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL L +1D592 ; mapped ; 006D # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL M +1D593 ; mapped ; 006E # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL N +1D594 ; mapped ; 006F # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL O +1D595 ; mapped ; 0070 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL P +1D596 ; mapped ; 0071 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL Q +1D597 ; mapped ; 0072 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL R +1D598 ; mapped ; 0073 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL S +1D599 ; mapped ; 0074 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL T +1D59A ; mapped ; 0075 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL U +1D59B ; mapped ; 0076 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL V +1D59C ; mapped ; 0077 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL W +1D59D ; mapped ; 0078 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL X +1D59E ; mapped ; 0079 # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL Y +1D59F ; mapped ; 007A # 3.1 MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5A0 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL A +1D5A1 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL B +1D5A2 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL C +1D5A3 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL D +1D5A4 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL E +1D5A5 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL F +1D5A6 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL G +1D5A7 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL H +1D5A8 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL I +1D5A9 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF CAPITAL J +1D5AA ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF CAPITAL K +1D5AB ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF CAPITAL L +1D5AC ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF CAPITAL M +1D5AD ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF CAPITAL N +1D5AE ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF CAPITAL O +1D5AF ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL P +1D5B0 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL Q +1D5B1 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL R +1D5B2 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL S +1D5B3 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL T +1D5B4 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL U +1D5B5 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL V +1D5B6 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL W +1D5B7 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL X +1D5B8 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF CAPITAL Y +1D5B9 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF CAPITAL Z +1D5BA ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF SMALL A +1D5BB ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF SMALL B +1D5BC ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF SMALL C +1D5BD ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF SMALL D +1D5BE ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF SMALL E +1D5BF ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF SMALL F +1D5C0 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF SMALL G +1D5C1 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF SMALL H +1D5C2 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF SMALL I +1D5C3 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF SMALL J +1D5C4 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF SMALL K +1D5C5 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF SMALL L +1D5C6 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF SMALL M +1D5C7 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF SMALL N +1D5C8 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF SMALL O +1D5C9 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF SMALL P +1D5CA ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF SMALL Q +1D5CB ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF SMALL R +1D5CC ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF SMALL S +1D5CD ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF SMALL T +1D5CE ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF SMALL U +1D5CF ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF SMALL V +1D5D0 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF SMALL W +1D5D1 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF SMALL X +1D5D2 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF SMALL Y +1D5D3 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF SMALL Z +1D5D4 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D5D5 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D5D6 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D5D7 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D5D8 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D5D9 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D5DA ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D5DB ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D5DC ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D5DD ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D5DE ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D5DF ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D5E0 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D5E1 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D5E2 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D5E3 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D5E4 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D5E5 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D5E6 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D5E7 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D5E8 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D5E9 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D5EA ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D5EB ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D5EC ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D5ED ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D5EE ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL A +1D5EF ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL B +1D5F0 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL C +1D5F1 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL D +1D5F2 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL E +1D5F3 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL F +1D5F4 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL G +1D5F5 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL H +1D5F6 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL I +1D5F7 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL J +1D5F8 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL K +1D5F9 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL L +1D5FA ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL M +1D5FB ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL N +1D5FC ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL O +1D5FD ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL P +1D5FE ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D5FF ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL R +1D600 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL S +1D601 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL T +1D602 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL U +1D603 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL V +1D604 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL W +1D605 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL X +1D606 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D607 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D608 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D609 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D60A ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D60B ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D60C ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D60D ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D60E ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D60F ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D610 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D611 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D612 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D613 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D614 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D615 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D616 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D617 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D618 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D619 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D61A ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D61B ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D61C ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D61D ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D61E ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D61F ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D620 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D621 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D622 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D623 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D624 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D625 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D626 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D627 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D628 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D629 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D62A ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D62B ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D62C ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D62D ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D62E ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D62F ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D630 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D631 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D632 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D633 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D634 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D635 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D636 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D637 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D638 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D639 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D63A ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D63B ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D63C ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D63D ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D63E ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D63F ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D640 ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D641 ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D642 ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D643 ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D644 ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D645 ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D646 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D647 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D648 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D649 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D64A ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D64B ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D64C ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D64D ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D64E ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D64F ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D650 ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D651 ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D652 ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D653 ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D654 ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D655 ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D656 ; mapped ; 0061 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D657 ; mapped ; 0062 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D658 ; mapped ; 0063 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D659 ; mapped ; 0064 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D65A ; mapped ; 0065 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D65B ; mapped ; 0066 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D65C ; mapped ; 0067 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D65D ; mapped ; 0068 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D65E ; mapped ; 0069 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D65F ; mapped ; 006A # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D660 ; mapped ; 006B # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D661 ; mapped ; 006C # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D662 ; mapped ; 006D # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D663 ; mapped ; 006E # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D664 ; mapped ; 006F # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D665 ; mapped ; 0070 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D666 ; mapped ; 0071 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D667 ; mapped ; 0072 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D668 ; mapped ; 0073 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D669 ; mapped ; 0074 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D66A ; mapped ; 0075 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D66B ; mapped ; 0076 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D66C ; mapped ; 0077 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D66D ; mapped ; 0078 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D66E ; mapped ; 0079 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D66F ; mapped ; 007A # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D670 ; mapped ; 0061 # 3.1 MATHEMATICAL MONOSPACE CAPITAL A +1D671 ; mapped ; 0062 # 3.1 MATHEMATICAL MONOSPACE CAPITAL B +1D672 ; mapped ; 0063 # 3.1 MATHEMATICAL MONOSPACE CAPITAL C +1D673 ; mapped ; 0064 # 3.1 MATHEMATICAL MONOSPACE CAPITAL D +1D674 ; mapped ; 0065 # 3.1 MATHEMATICAL MONOSPACE CAPITAL E +1D675 ; mapped ; 0066 # 3.1 MATHEMATICAL MONOSPACE CAPITAL F +1D676 ; mapped ; 0067 # 3.1 MATHEMATICAL MONOSPACE CAPITAL G +1D677 ; mapped ; 0068 # 3.1 MATHEMATICAL MONOSPACE CAPITAL H +1D678 ; mapped ; 0069 # 3.1 MATHEMATICAL MONOSPACE CAPITAL I +1D679 ; mapped ; 006A # 3.1 MATHEMATICAL MONOSPACE CAPITAL J +1D67A ; mapped ; 006B # 3.1 MATHEMATICAL MONOSPACE CAPITAL K +1D67B ; mapped ; 006C # 3.1 MATHEMATICAL MONOSPACE CAPITAL L +1D67C ; mapped ; 006D # 3.1 MATHEMATICAL MONOSPACE CAPITAL M +1D67D ; mapped ; 006E # 3.1 MATHEMATICAL MONOSPACE CAPITAL N +1D67E ; mapped ; 006F # 3.1 MATHEMATICAL MONOSPACE CAPITAL O +1D67F ; mapped ; 0070 # 3.1 MATHEMATICAL MONOSPACE CAPITAL P +1D680 ; mapped ; 0071 # 3.1 MATHEMATICAL MONOSPACE CAPITAL Q +1D681 ; mapped ; 0072 # 3.1 MATHEMATICAL MONOSPACE CAPITAL R +1D682 ; mapped ; 0073 # 3.1 MATHEMATICAL MONOSPACE CAPITAL S +1D683 ; mapped ; 0074 # 3.1 MATHEMATICAL MONOSPACE CAPITAL T +1D684 ; mapped ; 0075 # 3.1 MATHEMATICAL MONOSPACE CAPITAL U +1D685 ; mapped ; 0076 # 3.1 MATHEMATICAL MONOSPACE CAPITAL V +1D686 ; mapped ; 0077 # 3.1 MATHEMATICAL MONOSPACE CAPITAL W +1D687 ; mapped ; 0078 # 3.1 MATHEMATICAL MONOSPACE CAPITAL X +1D688 ; mapped ; 0079 # 3.1 MATHEMATICAL MONOSPACE CAPITAL Y +1D689 ; mapped ; 007A # 3.1 MATHEMATICAL MONOSPACE CAPITAL Z +1D68A ; mapped ; 0061 # 3.1 MATHEMATICAL MONOSPACE SMALL A +1D68B ; mapped ; 0062 # 3.1 MATHEMATICAL MONOSPACE SMALL B +1D68C ; mapped ; 0063 # 3.1 MATHEMATICAL MONOSPACE SMALL C +1D68D ; mapped ; 0064 # 3.1 MATHEMATICAL MONOSPACE SMALL D +1D68E ; mapped ; 0065 # 3.1 MATHEMATICAL MONOSPACE SMALL E +1D68F ; mapped ; 0066 # 3.1 MATHEMATICAL MONOSPACE SMALL F +1D690 ; mapped ; 0067 # 3.1 MATHEMATICAL MONOSPACE SMALL G +1D691 ; mapped ; 0068 # 3.1 MATHEMATICAL MONOSPACE SMALL H +1D692 ; mapped ; 0069 # 3.1 MATHEMATICAL MONOSPACE SMALL I +1D693 ; mapped ; 006A # 3.1 MATHEMATICAL MONOSPACE SMALL J +1D694 ; mapped ; 006B # 3.1 MATHEMATICAL MONOSPACE SMALL K +1D695 ; mapped ; 006C # 3.1 MATHEMATICAL MONOSPACE SMALL L +1D696 ; mapped ; 006D # 3.1 MATHEMATICAL MONOSPACE SMALL M +1D697 ; mapped ; 006E # 3.1 MATHEMATICAL MONOSPACE SMALL N +1D698 ; mapped ; 006F # 3.1 MATHEMATICAL MONOSPACE SMALL O +1D699 ; mapped ; 0070 # 3.1 MATHEMATICAL MONOSPACE SMALL P +1D69A ; mapped ; 0071 # 3.1 MATHEMATICAL MONOSPACE SMALL Q +1D69B ; mapped ; 0072 # 3.1 MATHEMATICAL MONOSPACE SMALL R +1D69C ; mapped ; 0073 # 3.1 MATHEMATICAL MONOSPACE SMALL S +1D69D ; mapped ; 0074 # 3.1 MATHEMATICAL MONOSPACE SMALL T +1D69E ; mapped ; 0075 # 3.1 MATHEMATICAL MONOSPACE SMALL U +1D69F ; mapped ; 0076 # 3.1 MATHEMATICAL MONOSPACE SMALL V +1D6A0 ; mapped ; 0077 # 3.1 MATHEMATICAL MONOSPACE SMALL W +1D6A1 ; mapped ; 0078 # 3.1 MATHEMATICAL MONOSPACE SMALL X +1D6A2 ; mapped ; 0079 # 3.1 MATHEMATICAL MONOSPACE SMALL Y +1D6A3 ; mapped ; 007A # 3.1 MATHEMATICAL MONOSPACE SMALL Z +1D6A4 ; mapped ; 0131 # 4.1 MATHEMATICAL ITALIC SMALL DOTLESS I +1D6A5 ; mapped ; 0237 # 4.1 MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A6..1D6A7 ; disallowed # NA <reserved-1D6A6>..<reserved-1D6A7> +1D6A8 ; mapped ; 03B1 # 3.1 MATHEMATICAL BOLD CAPITAL ALPHA +1D6A9 ; mapped ; 03B2 # 3.1 MATHEMATICAL BOLD CAPITAL BETA +1D6AA ; mapped ; 03B3 # 3.1 MATHEMATICAL BOLD CAPITAL GAMMA +1D6AB ; mapped ; 03B4 # 3.1 MATHEMATICAL BOLD CAPITAL DELTA +1D6AC ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD CAPITAL EPSILON +1D6AD ; mapped ; 03B6 # 3.1 MATHEMATICAL BOLD CAPITAL ZETA +1D6AE ; mapped ; 03B7 # 3.1 MATHEMATICAL BOLD CAPITAL ETA +1D6AF ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD CAPITAL THETA +1D6B0 ; mapped ; 03B9 # 3.1 MATHEMATICAL BOLD CAPITAL IOTA +1D6B1 ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD CAPITAL KAPPA +1D6B2 ; mapped ; 03BB # 3.1 MATHEMATICAL BOLD CAPITAL LAMDA +1D6B3 ; mapped ; 03BC # 3.1 MATHEMATICAL BOLD CAPITAL MU +1D6B4 ; mapped ; 03BD # 3.1 MATHEMATICAL BOLD CAPITAL NU +1D6B5 ; mapped ; 03BE # 3.1 MATHEMATICAL BOLD CAPITAL XI +1D6B6 ; mapped ; 03BF # 3.1 MATHEMATICAL BOLD CAPITAL OMICRON +1D6B7 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD CAPITAL PI +1D6B8 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD CAPITAL RHO +1D6B9 ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6BA ; mapped ; 03C3 # 3.1 MATHEMATICAL BOLD CAPITAL SIGMA +1D6BB ; mapped ; 03C4 # 3.1 MATHEMATICAL BOLD CAPITAL TAU +1D6BC ; mapped ; 03C5 # 3.1 MATHEMATICAL BOLD CAPITAL UPSILON +1D6BD ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD CAPITAL PHI +1D6BE ; mapped ; 03C7 # 3.1 MATHEMATICAL BOLD CAPITAL CHI +1D6BF ; mapped ; 03C8 # 3.1 MATHEMATICAL BOLD CAPITAL PSI +1D6C0 ; mapped ; 03C9 # 3.1 MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; mapped ; 2207 # 3.1 MATHEMATICAL BOLD NABLA +1D6C2 ; mapped ; 03B1 # 3.1 MATHEMATICAL BOLD SMALL ALPHA +1D6C3 ; mapped ; 03B2 # 3.1 MATHEMATICAL BOLD SMALL BETA +1D6C4 ; mapped ; 03B3 # 3.1 MATHEMATICAL BOLD SMALL GAMMA +1D6C5 ; mapped ; 03B4 # 3.1 MATHEMATICAL BOLD SMALL DELTA +1D6C6 ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD SMALL EPSILON +1D6C7 ; mapped ; 03B6 # 3.1 MATHEMATICAL BOLD SMALL ZETA +1D6C8 ; mapped ; 03B7 # 3.1 MATHEMATICAL BOLD SMALL ETA +1D6C9 ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD SMALL THETA +1D6CA ; mapped ; 03B9 # 3.1 MATHEMATICAL BOLD SMALL IOTA +1D6CB ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD SMALL KAPPA +1D6CC ; mapped ; 03BB # 3.1 MATHEMATICAL BOLD SMALL LAMDA +1D6CD ; mapped ; 03BC # 3.1 MATHEMATICAL BOLD SMALL MU +1D6CE ; mapped ; 03BD # 3.1 MATHEMATICAL BOLD SMALL NU +1D6CF ; mapped ; 03BE # 3.1 MATHEMATICAL BOLD SMALL XI +1D6D0 ; mapped ; 03BF # 3.1 MATHEMATICAL BOLD SMALL OMICRON +1D6D1 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD SMALL PI +1D6D2 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD SMALL RHO +1D6D3..1D6D4 ; mapped ; 03C3 # 3.1 MATHEMATICAL BOLD SMALL FINAL SIGMA..MATHEMATICAL BOLD SMALL SIGMA +1D6D5 ; mapped ; 03C4 # 3.1 MATHEMATICAL BOLD SMALL TAU +1D6D6 ; mapped ; 03C5 # 3.1 MATHEMATICAL BOLD SMALL UPSILON +1D6D7 ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD SMALL PHI +1D6D8 ; mapped ; 03C7 # 3.1 MATHEMATICAL BOLD SMALL CHI +1D6D9 ; mapped ; 03C8 # 3.1 MATHEMATICAL BOLD SMALL PSI +1D6DA ; mapped ; 03C9 # 3.1 MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; mapped ; 2202 # 3.1 MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD EPSILON SYMBOL +1D6DD ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD THETA SYMBOL +1D6DE ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD KAPPA SYMBOL +1D6DF ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD PHI SYMBOL +1D6E0 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD RHO SYMBOL +1D6E1 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD PI SYMBOL +1D6E2 ; mapped ; 03B1 # 3.1 MATHEMATICAL ITALIC CAPITAL ALPHA +1D6E3 ; mapped ; 03B2 # 3.1 MATHEMATICAL ITALIC CAPITAL BETA +1D6E4 ; mapped ; 03B3 # 3.1 MATHEMATICAL ITALIC CAPITAL GAMMA +1D6E5 ; mapped ; 03B4 # 3.1 MATHEMATICAL ITALIC CAPITAL DELTA +1D6E6 ; mapped ; 03B5 # 3.1 MATHEMATICAL ITALIC CAPITAL EPSILON +1D6E7 ; mapped ; 03B6 # 3.1 MATHEMATICAL ITALIC CAPITAL ZETA +1D6E8 ; mapped ; 03B7 # 3.1 MATHEMATICAL ITALIC CAPITAL ETA +1D6E9 ; mapped ; 03B8 # 3.1 MATHEMATICAL ITALIC CAPITAL THETA +1D6EA ; mapped ; 03B9 # 3.1 MATHEMATICAL ITALIC CAPITAL IOTA +1D6EB ; mapped ; 03BA # 3.1 MATHEMATICAL ITALIC CAPITAL KAPPA +1D6EC ; mapped ; 03BB # 3.1 MATHEMATICAL ITALIC CAPITAL LAMDA +1D6ED ; mapped ; 03BC # 3.1 MATHEMATICAL ITALIC CAPITAL MU +1D6EE ; mapped ; 03BD # 3.1 MATHEMATICAL ITALIC CAPITAL NU +1D6EF ; mapped ; 03BE # 3.1 MATHEMATICAL ITALIC CAPITAL XI +1D6F0 ; mapped ; 03BF # 3.1 MATHEMATICAL ITALIC CAPITAL OMICRON +1D6F1 ; mapped ; 03C0 # 3.1 MATHEMATICAL ITALIC CAPITAL PI +1D6F2 ; mapped ; 03C1 # 3.1 MATHEMATICAL ITALIC CAPITAL RHO +1D6F3 ; mapped ; 03B8 # 3.1 MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D6F4 ; mapped ; 03C3 # 3.1 MATHEMATICAL ITALIC CAPITAL SIGMA +1D6F5 ; mapped ; 03C4 # 3.1 MATHEMATICAL ITALIC CAPITAL TAU +1D6F6 ; mapped ; 03C5 # 3.1 MATHEMATICAL ITALIC CAPITAL UPSILON +1D6F7 ; mapped ; 03C6 # 3.1 MATHEMATICAL ITALIC CAPITAL PHI +1D6F8 ; mapped ; 03C7 # 3.1 MATHEMATICAL ITALIC CAPITAL CHI +1D6F9 ; mapped ; 03C8 # 3.1 MATHEMATICAL ITALIC CAPITAL PSI +1D6FA ; mapped ; 03C9 # 3.1 MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; mapped ; 2207 # 3.1 MATHEMATICAL ITALIC NABLA +1D6FC ; mapped ; 03B1 # 3.1 MATHEMATICAL ITALIC SMALL ALPHA +1D6FD ; mapped ; 03B2 # 3.1 MATHEMATICAL ITALIC SMALL BETA +1D6FE ; mapped ; 03B3 # 3.1 MATHEMATICAL ITALIC SMALL GAMMA +1D6FF ; mapped ; 03B4 # 3.1 MATHEMATICAL ITALIC SMALL DELTA +1D700 ; mapped ; 03B5 # 3.1 MATHEMATICAL ITALIC SMALL EPSILON +1D701 ; mapped ; 03B6 # 3.1 MATHEMATICAL ITALIC SMALL ZETA +1D702 ; mapped ; 03B7 # 3.1 MATHEMATICAL ITALIC SMALL ETA +1D703 ; mapped ; 03B8 # 3.1 MATHEMATICAL ITALIC SMALL THETA +1D704 ; mapped ; 03B9 # 3.1 MATHEMATICAL ITALIC SMALL IOTA +1D705 ; mapped ; 03BA # 3.1 MATHEMATICAL ITALIC SMALL KAPPA +1D706 ; mapped ; 03BB # 3.1 MATHEMATICAL ITALIC SMALL LAMDA +1D707 ; mapped ; 03BC # 3.1 MATHEMATICAL ITALIC SMALL MU +1D708 ; mapped ; 03BD # 3.1 MATHEMATICAL ITALIC SMALL NU +1D709 ; mapped ; 03BE # 3.1 MATHEMATICAL ITALIC SMALL XI +1D70A ; mapped ; 03BF # 3.1 MATHEMATICAL ITALIC SMALL OMICRON +1D70B ; mapped ; 03C0 # 3.1 MATHEMATICAL ITALIC SMALL PI +1D70C ; mapped ; 03C1 # 3.1 MATHEMATICAL ITALIC SMALL RHO +1D70D..1D70E ; mapped ; 03C3 # 3.1 MATHEMATICAL ITALIC SMALL FINAL SIGMA..MATHEMATICAL ITALIC SMALL SIGMA +1D70F ; mapped ; 03C4 # 3.1 MATHEMATICAL ITALIC SMALL TAU +1D710 ; mapped ; 03C5 # 3.1 MATHEMATICAL ITALIC SMALL UPSILON +1D711 ; mapped ; 03C6 # 3.1 MATHEMATICAL ITALIC SMALL PHI +1D712 ; mapped ; 03C7 # 3.1 MATHEMATICAL ITALIC SMALL CHI +1D713 ; mapped ; 03C8 # 3.1 MATHEMATICAL ITALIC SMALL PSI +1D714 ; mapped ; 03C9 # 3.1 MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; mapped ; 2202 # 3.1 MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716 ; mapped ; 03B5 # 3.1 MATHEMATICAL ITALIC EPSILON SYMBOL +1D717 ; mapped ; 03B8 # 3.1 MATHEMATICAL ITALIC THETA SYMBOL +1D718 ; mapped ; 03BA # 3.1 MATHEMATICAL ITALIC KAPPA SYMBOL +1D719 ; mapped ; 03C6 # 3.1 MATHEMATICAL ITALIC PHI SYMBOL +1D71A ; mapped ; 03C1 # 3.1 MATHEMATICAL ITALIC RHO SYMBOL +1D71B ; mapped ; 03C0 # 3.1 MATHEMATICAL ITALIC PI SYMBOL +1D71C ; mapped ; 03B1 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D71D ; mapped ; 03B2 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D71E ; mapped ; 03B3 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D71F ; mapped ; 03B4 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D720 ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D721 ; mapped ; 03B6 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D722 ; mapped ; 03B7 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D723 ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D724 ; mapped ; 03B9 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D725 ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D726 ; mapped ; 03BB # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D727 ; mapped ; 03BC # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL MU +1D728 ; mapped ; 03BD # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL NU +1D729 ; mapped ; 03BE # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL XI +1D72A ; mapped ; 03BF # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D72B ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL PI +1D72C ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D72D ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D72E ; mapped ; 03C3 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D72F ; mapped ; 03C4 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D730 ; mapped ; 03C5 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D731 ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D732 ; mapped ; 03C7 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D733 ; mapped ; 03C8 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D734 ; mapped ; 03C9 # 3.1 MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; mapped ; 2207 # 3.1 MATHEMATICAL BOLD ITALIC NABLA +1D736 ; mapped ; 03B1 # 3.1 MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D737 ; mapped ; 03B2 # 3.1 MATHEMATICAL BOLD ITALIC SMALL BETA +1D738 ; mapped ; 03B3 # 3.1 MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D739 ; mapped ; 03B4 # 3.1 MATHEMATICAL BOLD ITALIC SMALL DELTA +1D73A ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D73B ; mapped ; 03B6 # 3.1 MATHEMATICAL BOLD ITALIC SMALL ZETA +1D73C ; mapped ; 03B7 # 3.1 MATHEMATICAL BOLD ITALIC SMALL ETA +1D73D ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD ITALIC SMALL THETA +1D73E ; mapped ; 03B9 # 3.1 MATHEMATICAL BOLD ITALIC SMALL IOTA +1D73F ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D740 ; mapped ; 03BB # 3.1 MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D741 ; mapped ; 03BC # 3.1 MATHEMATICAL BOLD ITALIC SMALL MU +1D742 ; mapped ; 03BD # 3.1 MATHEMATICAL BOLD ITALIC SMALL NU +1D743 ; mapped ; 03BE # 3.1 MATHEMATICAL BOLD ITALIC SMALL XI +1D744 ; mapped ; 03BF # 3.1 MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D745 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD ITALIC SMALL PI +1D746 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD ITALIC SMALL RHO +1D747..1D748 ; mapped ; 03C3 # 3.1 MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA..MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D749 ; mapped ; 03C4 # 3.1 MATHEMATICAL BOLD ITALIC SMALL TAU +1D74A ; mapped ; 03C5 # 3.1 MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D74B ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD ITALIC SMALL PHI +1D74C ; mapped ; 03C7 # 3.1 MATHEMATICAL BOLD ITALIC SMALL CHI +1D74D ; mapped ; 03C8 # 3.1 MATHEMATICAL BOLD ITALIC SMALL PSI +1D74E ; mapped ; 03C9 # 3.1 MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; mapped ; 2202 # 3.1 MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750 ; mapped ; 03B5 # 3.1 MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D751 ; mapped ; 03B8 # 3.1 MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D752 ; mapped ; 03BA # 3.1 MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D753 ; mapped ; 03C6 # 3.1 MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D754 ; mapped ; 03C1 # 3.1 MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D755 ; mapped ; 03C0 # 3.1 MATHEMATICAL BOLD ITALIC PI SYMBOL +1D756 ; mapped ; 03B1 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D757 ; mapped ; 03B2 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D758 ; mapped ; 03B3 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D759 ; mapped ; 03B4 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D75A ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D75B ; mapped ; 03B6 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D75C ; mapped ; 03B7 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D75D ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D75E ; mapped ; 03B9 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D75F ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D760 ; mapped ; 03BB # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D761 ; mapped ; 03BC # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D762 ; mapped ; 03BD # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D763 ; mapped ; 03BE # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D764 ; mapped ; 03BF # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D765 ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D766 ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D767 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D768 ; mapped ; 03C3 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D769 ; mapped ; 03C4 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D76A ; mapped ; 03C5 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D76B ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D76C ; mapped ; 03C7 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D76D ; mapped ; 03C8 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D76E ; mapped ; 03C9 # 3.1 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; mapped ; 2207 # 3.1 MATHEMATICAL SANS-SERIF BOLD NABLA +1D770 ; mapped ; 03B1 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D771 ; mapped ; 03B2 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D772 ; mapped ; 03B3 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D773 ; mapped ; 03B4 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D774 ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D775 ; mapped ; 03B6 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D776 ; mapped ; 03B7 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D777 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D778 ; mapped ; 03B9 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D779 ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D77A ; mapped ; 03BB # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D77B ; mapped ; 03BC # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D77C ; mapped ; 03BD # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D77D ; mapped ; 03BE # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D77E ; mapped ; 03BF # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D77F ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D780 ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D781..1D782 ; mapped ; 03C3 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA..MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D783 ; mapped ; 03C4 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D784 ; mapped ; 03C5 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D785 ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D786 ; mapped ; 03C7 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D787 ; mapped ; 03C8 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D788 ; mapped ; 03C9 # 3.1 MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; mapped ; 2202 # 3.1 MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D78B ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D78C ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D78D ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D78E ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D78F ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D790 ; mapped ; 03B1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1D791 ; mapped ; 03B2 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D792 ; mapped ; 03B3 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D793 ; mapped ; 03B4 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D794 ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1D795 ; mapped ; 03B6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +1D796 ; mapped ; 03B7 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1D797 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D798 ; mapped ; 03B9 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1D799 ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +1D79A ; mapped ; 03BB # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D79B ; mapped ; 03BC # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +1D79C ; mapped ; 03BD # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +1D79D ; mapped ; 03BE # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +1D79E ; mapped ; 03BF # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1D79F ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D7A0 ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D7A1 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1D7A2 ; mapped ; 03C3 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +1D7A3 ; mapped ; 03C4 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +1D7A4 ; mapped ; 03C5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1D7A5 ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D7A6 ; mapped ; 03C7 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D7A7 ; mapped ; 03C8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D7A8 ; mapped ; 03C9 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; mapped ; 2207 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA ; mapped ; 03B1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +1D7AB ; mapped ; 03B2 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +1D7AC ; mapped ; 03B3 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +1D7AD ; mapped ; 03B4 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +1D7AE ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7AF ; mapped ; 03B6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +1D7B0 ; mapped ; 03B7 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +1D7B1 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7B2 ; mapped ; 03B9 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +1D7B3 ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7B4 ; mapped ; 03BB # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +1D7B5 ; mapped ; 03BC # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +1D7B6 ; mapped ; 03BD # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +1D7B7 ; mapped ; 03BE # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +1D7B8 ; mapped ; 03BF # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +1D7B9 ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7BA ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7BB..1D7BC ; mapped ; 03C3 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +1D7BD ; mapped ; 03C4 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +1D7BE ; mapped ; 03C5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +1D7BF ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C0 ; mapped ; 03C7 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +1D7C1 ; mapped ; 03C8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +1D7C2 ; mapped ; 03C9 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; mapped ; 2202 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4 ; mapped ; 03B5 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +1D7C5 ; mapped ; 03B8 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +1D7C6 ; mapped ; 03BA # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +1D7C7 ; mapped ; 03C6 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +1D7C8 ; mapped ; 03C1 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +1D7C9 ; mapped ; 03C0 # 3.1 MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CA..1D7CB ; mapped ; 03DD # 5.0 MATHEMATICAL BOLD CAPITAL DIGAMMA..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CC..1D7CD ; disallowed # NA <reserved-1D7CC>..<reserved-1D7CD> +1D7CE ; mapped ; 0030 # 3.1 MATHEMATICAL BOLD DIGIT ZERO +1D7CF ; mapped ; 0031 # 3.1 MATHEMATICAL BOLD DIGIT ONE +1D7D0 ; mapped ; 0032 # 3.1 MATHEMATICAL BOLD DIGIT TWO +1D7D1 ; mapped ; 0033 # 3.1 MATHEMATICAL BOLD DIGIT THREE +1D7D2 ; mapped ; 0034 # 3.1 MATHEMATICAL BOLD DIGIT FOUR +1D7D3 ; mapped ; 0035 # 3.1 MATHEMATICAL BOLD DIGIT FIVE +1D7D4 ; mapped ; 0036 # 3.1 MATHEMATICAL BOLD DIGIT SIX +1D7D5 ; mapped ; 0037 # 3.1 MATHEMATICAL BOLD DIGIT SEVEN +1D7D6 ; mapped ; 0038 # 3.1 MATHEMATICAL BOLD DIGIT EIGHT +1D7D7 ; mapped ; 0039 # 3.1 MATHEMATICAL BOLD DIGIT NINE +1D7D8 ; mapped ; 0030 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7D9 ; mapped ; 0031 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7DA ; mapped ; 0032 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7DB ; mapped ; 0033 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7DC ; mapped ; 0034 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7DD ; mapped ; 0035 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7DE ; mapped ; 0036 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7DF ; mapped ; 0037 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E0 ; mapped ; 0038 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7E1 ; mapped ; 0039 # 3.1 MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7E2 ; mapped ; 0030 # 3.1 MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7E3 ; mapped ; 0031 # 3.1 MATHEMATICAL SANS-SERIF DIGIT ONE +1D7E4 ; mapped ; 0032 # 3.1 MATHEMATICAL SANS-SERIF DIGIT TWO +1D7E5 ; mapped ; 0033 # 3.1 MATHEMATICAL SANS-SERIF DIGIT THREE +1D7E6 ; mapped ; 0034 # 3.1 MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7E7 ; mapped ; 0035 # 3.1 MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7E8 ; mapped ; 0036 # 3.1 MATHEMATICAL SANS-SERIF DIGIT SIX +1D7E9 ; mapped ; 0037 # 3.1 MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7EA ; mapped ; 0038 # 3.1 MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7EB ; mapped ; 0039 # 3.1 MATHEMATICAL SANS-SERIF DIGIT NINE +1D7EC ; mapped ; 0030 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7ED ; mapped ; 0031 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7EE ; mapped ; 0032 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7EF ; mapped ; 0033 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F0 ; mapped ; 0034 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7F1 ; mapped ; 0035 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7F2 ; mapped ; 0036 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7F3 ; mapped ; 0037 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7F4 ; mapped ; 0038 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7F5 ; mapped ; 0039 # 3.1 MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7F6 ; mapped ; 0030 # 3.1 MATHEMATICAL MONOSPACE DIGIT ZERO +1D7F7 ; mapped ; 0031 # 3.1 MATHEMATICAL MONOSPACE DIGIT ONE +1D7F8 ; mapped ; 0032 # 3.1 MATHEMATICAL MONOSPACE DIGIT TWO +1D7F9 ; mapped ; 0033 # 3.1 MATHEMATICAL MONOSPACE DIGIT THREE +1D7FA ; mapped ; 0034 # 3.1 MATHEMATICAL MONOSPACE DIGIT FOUR +1D7FB ; mapped ; 0035 # 3.1 MATHEMATICAL MONOSPACE DIGIT FIVE +1D7FC ; mapped ; 0036 # 3.1 MATHEMATICAL MONOSPACE DIGIT SIX +1D7FD ; mapped ; 0037 # 3.1 MATHEMATICAL MONOSPACE DIGIT SEVEN +1D7FE ; mapped ; 0038 # 3.1 MATHEMATICAL MONOSPACE DIGIT EIGHT +1D7FF ; mapped ; 0039 # 3.1 MATHEMATICAL MONOSPACE DIGIT NINE +1D800..1D9FF ; valid ; ; NV8 # 8.0 SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA00..1DA36 ; valid # 8.0 SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA37..1DA3A ; valid ; ; NV8 # 8.0 SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA3B..1DA6C ; valid # 8.0 SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA6D..1DA74 ; valid ; ; NV8 # 8.0 SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75 ; valid # 8.0 SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76..1DA83 ; valid ; ; NV8 # 8.0 SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA84 ; valid # 8.0 SIGNWRITING LOCATION HEAD NECK +1DA85..1DA8B ; valid ; ; NV8 # 8.0 SIGNWRITING LOCATION TORSO..SIGNWRITING PARENTHESIS +1DA8C..1DA9A ; disallowed # NA <reserved-1DA8C>..<reserved-1DA9A> +1DA9B..1DA9F ; valid # 8.0 SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA0 ; disallowed # NA <reserved-1DAA0> +1DAA1..1DAAF ; valid # 8.0 SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1DAB0..1DFFF ; disallowed # NA <reserved-1DAB0>..<reserved-1DFFF> +1E000..1E006 ; valid # 9.0 COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E007 ; disallowed # NA <reserved-1E007> +1E008..1E018 ; valid # 9.0 COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E019..1E01A ; disallowed # NA <reserved-1E019>..<reserved-1E01A> +1E01B..1E021 ; valid # 9.0 COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E022 ; disallowed # NA <reserved-1E022> +1E023..1E024 ; valid # 9.0 COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E025 ; disallowed # NA <reserved-1E025> +1E026..1E02A ; valid # 9.0 COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E02B..1E7FF ; disallowed # NA <reserved-1E02B>..<reserved-1E7FF> +1E800..1E8C4 ; valid # 7.0 MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8C5..1E8C6 ; disallowed # NA <reserved-1E8C5>..<reserved-1E8C6> +1E8C7..1E8CF ; valid ; ; NV8 # 7.0 MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE +1E8D0..1E8D6 ; valid # 7.0 MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E8D7..1E8FF ; disallowed # NA <reserved-1E8D7>..<reserved-1E8FF> +1E900 ; mapped ; 1E922 # 9.0 ADLAM CAPITAL LETTER ALIF +1E901 ; mapped ; 1E923 # 9.0 ADLAM CAPITAL LETTER DAALI +1E902 ; mapped ; 1E924 # 9.0 ADLAM CAPITAL LETTER LAAM +1E903 ; mapped ; 1E925 # 9.0 ADLAM CAPITAL LETTER MIIM +1E904 ; mapped ; 1E926 # 9.0 ADLAM CAPITAL LETTER BA +1E905 ; mapped ; 1E927 # 9.0 ADLAM CAPITAL LETTER SINNYIIYHE +1E906 ; mapped ; 1E928 # 9.0 ADLAM CAPITAL LETTER PE +1E907 ; mapped ; 1E929 # 9.0 ADLAM CAPITAL LETTER BHE +1E908 ; mapped ; 1E92A # 9.0 ADLAM CAPITAL LETTER RA +1E909 ; mapped ; 1E92B # 9.0 ADLAM CAPITAL LETTER E +1E90A ; mapped ; 1E92C # 9.0 ADLAM CAPITAL LETTER FA +1E90B ; mapped ; 1E92D # 9.0 ADLAM CAPITAL LETTER I +1E90C ; mapped ; 1E92E # 9.0 ADLAM CAPITAL LETTER O +1E90D ; mapped ; 1E92F # 9.0 ADLAM CAPITAL LETTER DHA +1E90E ; mapped ; 1E930 # 9.0 ADLAM CAPITAL LETTER YHE +1E90F ; mapped ; 1E931 # 9.0 ADLAM CAPITAL LETTER WAW +1E910 ; mapped ; 1E932 # 9.0 ADLAM CAPITAL LETTER NUN +1E911 ; mapped ; 1E933 # 9.0 ADLAM CAPITAL LETTER KAF +1E912 ; mapped ; 1E934 # 9.0 ADLAM CAPITAL LETTER YA +1E913 ; mapped ; 1E935 # 9.0 ADLAM CAPITAL LETTER U +1E914 ; mapped ; 1E936 # 9.0 ADLAM CAPITAL LETTER JIIM +1E915 ; mapped ; 1E937 # 9.0 ADLAM CAPITAL LETTER CHI +1E916 ; mapped ; 1E938 # 9.0 ADLAM CAPITAL LETTER HA +1E917 ; mapped ; 1E939 # 9.0 ADLAM CAPITAL LETTER QAAF +1E918 ; mapped ; 1E93A # 9.0 ADLAM CAPITAL LETTER GA +1E919 ; mapped ; 1E93B # 9.0 ADLAM CAPITAL LETTER NYA +1E91A ; mapped ; 1E93C # 9.0 ADLAM CAPITAL LETTER TU +1E91B ; mapped ; 1E93D # 9.0 ADLAM CAPITAL LETTER NHA +1E91C ; mapped ; 1E93E # 9.0 ADLAM CAPITAL LETTER VA +1E91D ; mapped ; 1E93F # 9.0 ADLAM CAPITAL LETTER KHA +1E91E ; mapped ; 1E940 # 9.0 ADLAM CAPITAL LETTER GBE +1E91F ; mapped ; 1E941 # 9.0 ADLAM CAPITAL LETTER ZAL +1E920 ; mapped ; 1E942 # 9.0 ADLAM CAPITAL LETTER KPO +1E921 ; mapped ; 1E943 # 9.0 ADLAM CAPITAL LETTER SHA +1E922..1E94A ; valid # 9.0 ADLAM SMALL LETTER ALIF..ADLAM NUKTA +1E94B..1E94F ; disallowed # NA <reserved-1E94B>..<reserved-1E94F> +1E950..1E959 ; valid # 9.0 ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95A..1E95D ; disallowed # NA <reserved-1E95A>..<reserved-1E95D> +1E95E..1E95F ; valid ; ; NV8 # 9.0 ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK +1E960..1EDFF ; disallowed # NA <reserved-1E960>..<reserved-1EDFF> +1EE00 ; mapped ; 0627 # 6.1 ARABIC MATHEMATICAL ALEF +1EE01 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL BEH +1EE02 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL JEEM +1EE03 ; mapped ; 062F # 6.1 ARABIC MATHEMATICAL DAL +1EE04 ; disallowed # NA <reserved-1EE04> +1EE05 ; mapped ; 0648 # 6.1 ARABIC MATHEMATICAL WAW +1EE06 ; mapped ; 0632 # 6.1 ARABIC MATHEMATICAL ZAIN +1EE07 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL HAH +1EE08 ; mapped ; 0637 # 6.1 ARABIC MATHEMATICAL TAH +1EE09 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL YEH +1EE0A ; mapped ; 0643 # 6.1 ARABIC MATHEMATICAL KAF +1EE0B ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL LAM +1EE0C ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL MEEM +1EE0D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL NOON +1EE0E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL SEEN +1EE0F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL AIN +1EE10 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL FEH +1EE11 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL SAD +1EE12 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL QAF +1EE13 ; mapped ; 0631 # 6.1 ARABIC MATHEMATICAL REH +1EE14 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL SHEEN +1EE15 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL TEH +1EE16 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL THEH +1EE17 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL KHAH +1EE18 ; mapped ; 0630 # 6.1 ARABIC MATHEMATICAL THAL +1EE19 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL DAD +1EE1A ; mapped ; 0638 # 6.1 ARABIC MATHEMATICAL ZAH +1EE1B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL GHAIN +1EE1C ; mapped ; 066E # 6.1 ARABIC MATHEMATICAL DOTLESS BEH +1EE1D ; mapped ; 06BA # 6.1 ARABIC MATHEMATICAL DOTLESS NOON +1EE1E ; mapped ; 06A1 # 6.1 ARABIC MATHEMATICAL DOTLESS FEH +1EE1F ; mapped ; 066F # 6.1 ARABIC MATHEMATICAL DOTLESS QAF +1EE20 ; disallowed # NA <reserved-1EE20> +1EE21 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL INITIAL BEH +1EE22 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL INITIAL JEEM +1EE23 ; disallowed # NA <reserved-1EE23> +1EE24 ; mapped ; 0647 # 6.1 ARABIC MATHEMATICAL INITIAL HEH +1EE25..1EE26 ; disallowed # NA <reserved-1EE25>..<reserved-1EE26> +1EE27 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL INITIAL HAH +1EE28 ; disallowed # NA <reserved-1EE28> +1EE29 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL INITIAL YEH +1EE2A ; mapped ; 0643 # 6.1 ARABIC MATHEMATICAL INITIAL KAF +1EE2B ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL INITIAL LAM +1EE2C ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL INITIAL MEEM +1EE2D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL INITIAL NOON +1EE2E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL INITIAL SEEN +1EE2F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL INITIAL AIN +1EE30 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL INITIAL FEH +1EE31 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL INITIAL SAD +1EE32 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL INITIAL QAF +1EE33 ; disallowed # NA <reserved-1EE33> +1EE34 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL INITIAL SHEEN +1EE35 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL INITIAL TEH +1EE36 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL INITIAL THEH +1EE37 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL INITIAL KHAH +1EE38 ; disallowed # NA <reserved-1EE38> +1EE39 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL INITIAL DAD +1EE3A ; disallowed # NA <reserved-1EE3A> +1EE3B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL INITIAL GHAIN +1EE3C..1EE41 ; disallowed # NA <reserved-1EE3C>..<reserved-1EE41> +1EE42 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL TAILED JEEM +1EE43..1EE46 ; disallowed # NA <reserved-1EE43>..<reserved-1EE46> +1EE47 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL TAILED HAH +1EE48 ; disallowed # NA <reserved-1EE48> +1EE49 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL TAILED YEH +1EE4A ; disallowed # NA <reserved-1EE4A> +1EE4B ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL TAILED LAM +1EE4C ; disallowed # NA <reserved-1EE4C> +1EE4D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL TAILED NOON +1EE4E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL TAILED SEEN +1EE4F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL TAILED AIN +1EE50 ; disallowed # NA <reserved-1EE50> +1EE51 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL TAILED SAD +1EE52 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL TAILED QAF +1EE53 ; disallowed # NA <reserved-1EE53> +1EE54 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL TAILED SHEEN +1EE55..1EE56 ; disallowed # NA <reserved-1EE55>..<reserved-1EE56> +1EE57 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL TAILED KHAH +1EE58 ; disallowed # NA <reserved-1EE58> +1EE59 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL TAILED DAD +1EE5A ; disallowed # NA <reserved-1EE5A> +1EE5B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL TAILED GHAIN +1EE5C ; disallowed # NA <reserved-1EE5C> +1EE5D ; mapped ; 06BA # 6.1 ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5E ; disallowed # NA <reserved-1EE5E> +1EE5F ; mapped ; 066F # 6.1 ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE60 ; disallowed # NA <reserved-1EE60> +1EE61 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL STRETCHED BEH +1EE62 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL STRETCHED JEEM +1EE63 ; disallowed # NA <reserved-1EE63> +1EE64 ; mapped ; 0647 # 6.1 ARABIC MATHEMATICAL STRETCHED HEH +1EE65..1EE66 ; disallowed # NA <reserved-1EE65>..<reserved-1EE66> +1EE67 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL STRETCHED HAH +1EE68 ; mapped ; 0637 # 6.1 ARABIC MATHEMATICAL STRETCHED TAH +1EE69 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL STRETCHED YEH +1EE6A ; mapped ; 0643 # 6.1 ARABIC MATHEMATICAL STRETCHED KAF +1EE6B ; disallowed # NA <reserved-1EE6B> +1EE6C ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL STRETCHED MEEM +1EE6D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL STRETCHED NOON +1EE6E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL STRETCHED SEEN +1EE6F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL STRETCHED AIN +1EE70 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL STRETCHED FEH +1EE71 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL STRETCHED SAD +1EE72 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL STRETCHED QAF +1EE73 ; disallowed # NA <reserved-1EE73> +1EE74 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL STRETCHED SHEEN +1EE75 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL STRETCHED TEH +1EE76 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL STRETCHED THEH +1EE77 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL STRETCHED KHAH +1EE78 ; disallowed # NA <reserved-1EE78> +1EE79 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL STRETCHED DAD +1EE7A ; mapped ; 0638 # 6.1 ARABIC MATHEMATICAL STRETCHED ZAH +1EE7B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL STRETCHED GHAIN +1EE7C ; mapped ; 066E # 6.1 ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7D ; disallowed # NA <reserved-1EE7D> +1EE7E ; mapped ; 06A1 # 6.1 ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE7F ; disallowed # NA <reserved-1EE7F> +1EE80 ; mapped ; 0627 # 6.1 ARABIC MATHEMATICAL LOOPED ALEF +1EE81 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL LOOPED BEH +1EE82 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL LOOPED JEEM +1EE83 ; mapped ; 062F # 6.1 ARABIC MATHEMATICAL LOOPED DAL +1EE84 ; mapped ; 0647 # 6.1 ARABIC MATHEMATICAL LOOPED HEH +1EE85 ; mapped ; 0648 # 6.1 ARABIC MATHEMATICAL LOOPED WAW +1EE86 ; mapped ; 0632 # 6.1 ARABIC MATHEMATICAL LOOPED ZAIN +1EE87 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL LOOPED HAH +1EE88 ; mapped ; 0637 # 6.1 ARABIC MATHEMATICAL LOOPED TAH +1EE89 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL LOOPED YEH +1EE8A ; disallowed # NA <reserved-1EE8A> +1EE8B ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL LOOPED LAM +1EE8C ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL LOOPED MEEM +1EE8D ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL LOOPED NOON +1EE8E ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL LOOPED SEEN +1EE8F ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL LOOPED AIN +1EE90 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL LOOPED FEH +1EE91 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL LOOPED SAD +1EE92 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL LOOPED QAF +1EE93 ; mapped ; 0631 # 6.1 ARABIC MATHEMATICAL LOOPED REH +1EE94 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL LOOPED SHEEN +1EE95 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL LOOPED TEH +1EE96 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL LOOPED THEH +1EE97 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL LOOPED KHAH +1EE98 ; mapped ; 0630 # 6.1 ARABIC MATHEMATICAL LOOPED THAL +1EE99 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL LOOPED DAD +1EE9A ; mapped ; 0638 # 6.1 ARABIC MATHEMATICAL LOOPED ZAH +1EE9B ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL LOOPED GHAIN +1EE9C..1EEA0 ; disallowed # NA <reserved-1EE9C>..<reserved-1EEA0> +1EEA1 ; mapped ; 0628 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK BEH +1EEA2 ; mapped ; 062C # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM +1EEA3 ; mapped ; 062F # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA4 ; disallowed # NA <reserved-1EEA4> +1EEA5 ; mapped ; 0648 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK WAW +1EEA6 ; mapped ; 0632 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN +1EEA7 ; mapped ; 062D # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK HAH +1EEA8 ; mapped ; 0637 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK TAH +1EEA9 ; mapped ; 064A # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAA ; disallowed # NA <reserved-1EEAA> +1EEAB ; mapped ; 0644 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK LAM +1EEAC ; mapped ; 0645 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM +1EEAD ; mapped ; 0646 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK NOON +1EEAE ; mapped ; 0633 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN +1EEAF ; mapped ; 0639 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK AIN +1EEB0 ; mapped ; 0641 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK FEH +1EEB1 ; mapped ; 0635 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK SAD +1EEB2 ; mapped ; 0642 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK QAF +1EEB3 ; mapped ; 0631 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK REH +1EEB4 ; mapped ; 0634 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN +1EEB5 ; mapped ; 062A # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK TEH +1EEB6 ; mapped ; 062B # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK THEH +1EEB7 ; mapped ; 062E # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH +1EEB8 ; mapped ; 0630 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK THAL +1EEB9 ; mapped ; 0636 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK DAD +1EEBA ; mapped ; 0638 # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH +1EEBB ; mapped ; 063A # 6.1 ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEBC..1EEEF ; disallowed # NA <reserved-1EEBC>..<reserved-1EEEF> +1EEF0..1EEF1 ; valid ; ; NV8 # 6.1 ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1EEF2..1EFFF ; disallowed # NA <reserved-1EEF2>..<reserved-1EFFF> +1F000..1F02B ; valid ; ; NV8 # 5.1 MAHJONG TILE EAST WIND..MAHJONG TILE BACK +1F02C..1F02F ; disallowed # NA <reserved-1F02C>..<reserved-1F02F> +1F030..1F093 ; valid ; ; NV8 # 5.1 DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F094..1F09F ; disallowed # NA <reserved-1F094>..<reserved-1F09F> +1F0A0..1F0AE ; valid ; ; NV8 # 6.0 PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0AF..1F0B0 ; disallowed # NA <reserved-1F0AF>..<reserved-1F0B0> +1F0B1..1F0BE ; valid ; ; NV8 # 6.0 PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS +1F0BF ; valid ; ; NV8 # 7.0 PLAYING CARD RED JOKER +1F0C0 ; disallowed # NA <reserved-1F0C0> +1F0C1..1F0CF ; valid ; ; NV8 # 6.0 PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER +1F0D0 ; disallowed # NA <reserved-1F0D0> +1F0D1..1F0DF ; valid ; ; NV8 # 6.0 PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER +1F0E0..1F0F5 ; valid ; ; NV8 # 7.0 PLAYING CARD FOOL..PLAYING CARD TRUMP-21 +1F0F6..1F0FF ; disallowed # NA <reserved-1F0F6>..<reserved-1F0FF> +1F100 ; disallowed # 5.2 DIGIT ZERO FULL STOP +1F101 ; disallowed_STD3_mapped ; 0030 002C # 5.2 DIGIT ZERO COMMA +1F102 ; disallowed_STD3_mapped ; 0031 002C # 5.2 DIGIT ONE COMMA +1F103 ; disallowed_STD3_mapped ; 0032 002C # 5.2 DIGIT TWO COMMA +1F104 ; disallowed_STD3_mapped ; 0033 002C # 5.2 DIGIT THREE COMMA +1F105 ; disallowed_STD3_mapped ; 0034 002C # 5.2 DIGIT FOUR COMMA +1F106 ; disallowed_STD3_mapped ; 0035 002C # 5.2 DIGIT FIVE COMMA +1F107 ; disallowed_STD3_mapped ; 0036 002C # 5.2 DIGIT SIX COMMA +1F108 ; disallowed_STD3_mapped ; 0037 002C # 5.2 DIGIT SEVEN COMMA +1F109 ; disallowed_STD3_mapped ; 0038 002C # 5.2 DIGIT EIGHT COMMA +1F10A ; disallowed_STD3_mapped ; 0039 002C # 5.2 DIGIT NINE COMMA +1F10B..1F10C ; valid ; ; NV8 # 7.0 DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F10D..1F10F ; disallowed # NA <reserved-1F10D>..<reserved-1F10F> +1F110 ; disallowed_STD3_mapped ; 0028 0061 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER A +1F111 ; disallowed_STD3_mapped ; 0028 0062 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER B +1F112 ; disallowed_STD3_mapped ; 0028 0063 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER C +1F113 ; disallowed_STD3_mapped ; 0028 0064 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER D +1F114 ; disallowed_STD3_mapped ; 0028 0065 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER E +1F115 ; disallowed_STD3_mapped ; 0028 0066 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER F +1F116 ; disallowed_STD3_mapped ; 0028 0067 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER G +1F117 ; disallowed_STD3_mapped ; 0028 0068 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER H +1F118 ; disallowed_STD3_mapped ; 0028 0069 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER I +1F119 ; disallowed_STD3_mapped ; 0028 006A 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER J +1F11A ; disallowed_STD3_mapped ; 0028 006B 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER K +1F11B ; disallowed_STD3_mapped ; 0028 006C 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER L +1F11C ; disallowed_STD3_mapped ; 0028 006D 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER M +1F11D ; disallowed_STD3_mapped ; 0028 006E 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER N +1F11E ; disallowed_STD3_mapped ; 0028 006F 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER O +1F11F ; disallowed_STD3_mapped ; 0028 0070 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER P +1F120 ; disallowed_STD3_mapped ; 0028 0071 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER Q +1F121 ; disallowed_STD3_mapped ; 0028 0072 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER R +1F122 ; disallowed_STD3_mapped ; 0028 0073 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER S +1F123 ; disallowed_STD3_mapped ; 0028 0074 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER T +1F124 ; disallowed_STD3_mapped ; 0028 0075 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER U +1F125 ; disallowed_STD3_mapped ; 0028 0076 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER V +1F126 ; disallowed_STD3_mapped ; 0028 0077 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER W +1F127 ; disallowed_STD3_mapped ; 0028 0078 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER X +1F128 ; disallowed_STD3_mapped ; 0028 0079 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER Y +1F129 ; disallowed_STD3_mapped ; 0028 007A 0029 #5.2 PARENTHESIZED LATIN CAPITAL LETTER Z +1F12A ; mapped ; 3014 0073 3015 #5.2 TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S +1F12B ; mapped ; 0063 # 5.2 CIRCLED ITALIC LATIN CAPITAL LETTER C +1F12C ; mapped ; 0072 # 5.2 CIRCLED ITALIC LATIN CAPITAL LETTER R +1F12D ; mapped ; 0063 0064 # 5.2 CIRCLED CD +1F12E ; mapped ; 0077 007A # 5.2 CIRCLED WZ +1F12F ; disallowed # NA <reserved-1F12F> +1F130 ; mapped ; 0061 # 6.0 SQUARED LATIN CAPITAL LETTER A +1F131 ; mapped ; 0062 # 5.2 SQUARED LATIN CAPITAL LETTER B +1F132 ; mapped ; 0063 # 6.0 SQUARED LATIN CAPITAL LETTER C +1F133 ; mapped ; 0064 # 6.0 SQUARED LATIN CAPITAL LETTER D +1F134 ; mapped ; 0065 # 6.0 SQUARED LATIN CAPITAL LETTER E +1F135 ; mapped ; 0066 # 6.0 SQUARED LATIN CAPITAL LETTER F +1F136 ; mapped ; 0067 # 6.0 SQUARED LATIN CAPITAL LETTER G +1F137 ; mapped ; 0068 # 6.0 SQUARED LATIN CAPITAL LETTER H +1F138 ; mapped ; 0069 # 6.0 SQUARED LATIN CAPITAL LETTER I +1F139 ; mapped ; 006A # 6.0 SQUARED LATIN CAPITAL LETTER J +1F13A ; mapped ; 006B # 6.0 SQUARED LATIN CAPITAL LETTER K +1F13B ; mapped ; 006C # 6.0 SQUARED LATIN CAPITAL LETTER L +1F13C ; mapped ; 006D # 6.0 SQUARED LATIN CAPITAL LETTER M +1F13D ; mapped ; 006E # 5.2 SQUARED LATIN CAPITAL LETTER N +1F13E ; mapped ; 006F # 6.0 SQUARED LATIN CAPITAL LETTER O +1F13F ; mapped ; 0070 # 5.2 SQUARED LATIN CAPITAL LETTER P +1F140 ; mapped ; 0071 # 6.0 SQUARED LATIN CAPITAL LETTER Q +1F141 ; mapped ; 0072 # 6.0 SQUARED LATIN CAPITAL LETTER R +1F142 ; mapped ; 0073 # 5.2 SQUARED LATIN CAPITAL LETTER S +1F143 ; mapped ; 0074 # 6.0 SQUARED LATIN CAPITAL LETTER T +1F144 ; mapped ; 0075 # 6.0 SQUARED LATIN CAPITAL LETTER U +1F145 ; mapped ; 0076 # 6.0 SQUARED LATIN CAPITAL LETTER V +1F146 ; mapped ; 0077 # 5.2 SQUARED LATIN CAPITAL LETTER W +1F147 ; mapped ; 0078 # 6.0 SQUARED LATIN CAPITAL LETTER X +1F148 ; mapped ; 0079 # 6.0 SQUARED LATIN CAPITAL LETTER Y +1F149 ; mapped ; 007A # 6.0 SQUARED LATIN CAPITAL LETTER Z +1F14A ; mapped ; 0068 0076 # 5.2 SQUARED HV +1F14B ; mapped ; 006D 0076 # 5.2 SQUARED MV +1F14C ; mapped ; 0073 0064 # 5.2 SQUARED SD +1F14D ; mapped ; 0073 0073 # 5.2 SQUARED SS +1F14E ; mapped ; 0070 0070 0076 #5.2 SQUARED PPV +1F14F ; mapped ; 0077 0063 # 6.0 SQUARED WC +1F150..1F156 ; valid ; ; NV8 # 6.0 NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER G +1F157 ; valid ; ; NV8 # 5.2 NEGATIVE CIRCLED LATIN CAPITAL LETTER H +1F158..1F15E ; valid ; ; NV8 # 6.0 NEGATIVE CIRCLED LATIN CAPITAL LETTER I..NEGATIVE CIRCLED LATIN CAPITAL LETTER O +1F15F ; valid ; ; NV8 # 5.2 NEGATIVE CIRCLED LATIN CAPITAL LETTER P +1F160..1F169 ; valid ; ; NV8 # 6.0 NEGATIVE CIRCLED LATIN CAPITAL LETTER Q..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F16A ; mapped ; 006D 0063 # 6.1 RAISED MC SIGN +1F16B ; mapped ; 006D 0064 # 6.1 RAISED MD SIGN +1F16C..1F16F ; disallowed # NA <reserved-1F16C>..<reserved-1F16F> +1F170..1F178 ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER I +1F179 ; valid ; ; NV8 # 5.2 NEGATIVE SQUARED LATIN CAPITAL LETTER J +1F17A ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER K +1F17B..1F17C ; valid ; ; NV8 # 5.2 NEGATIVE SQUARED LATIN CAPITAL LETTER L..NEGATIVE SQUARED LATIN CAPITAL LETTER M +1F17D..1F17E ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER N..NEGATIVE SQUARED LATIN CAPITAL LETTER O +1F17F ; valid ; ; NV8 # 5.2 NEGATIVE SQUARED LATIN CAPITAL LETTER P +1F180..1F189 ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED LATIN CAPITAL LETTER Q..NEGATIVE SQUARED LATIN CAPITAL LETTER Z +1F18A..1F18D ; valid ; ; NV8 # 5.2 CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P..NEGATIVE SQUARED SA +1F18E..1F18F ; valid ; ; NV8 # 6.0 NEGATIVE SQUARED AB..NEGATIVE SQUARED WC +1F190 ; mapped ; 0064 006A # 5.2 SQUARE DJ +1F191..1F19A ; valid ; ; NV8 # 6.0 SQUARED CL..SQUARED VS +1F19B..1F1AC ; valid ; ; NV8 # 9.0 SQUARED THREE D..SQUARED VOD +1F1AD..1F1E5 ; disallowed # NA <reserved-1F1AD>..<reserved-1F1E5> +1F1E6..1F1FF ; valid ; ; NV8 # 6.0 REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z +1F200 ; mapped ; 307B 304B # 5.2 SQUARE HIRAGANA HOKA +1F201 ; mapped ; 30B3 30B3 # 6.0 SQUARED KATAKANA KOKO +1F202 ; mapped ; 30B5 # 6.0 SQUARED KATAKANA SA +1F203..1F20F ; disallowed # NA <reserved-1F203>..<reserved-1F20F> +1F210 ; mapped ; 624B # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-624B +1F211 ; mapped ; 5B57 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5B57 +1F212 ; mapped ; 53CC # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-53CC +1F213 ; mapped ; 30C7 # 5.2 SQUARED KATAKANA DE +1F214 ; mapped ; 4E8C # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4E8C +1F215 ; mapped ; 591A # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-591A +1F216 ; mapped ; 89E3 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-89E3 +1F217 ; mapped ; 5929 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5929 +1F218 ; mapped ; 4EA4 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4EA4 +1F219 ; mapped ; 6620 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6620 +1F21A ; mapped ; 7121 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-7121 +1F21B ; mapped ; 6599 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6599 +1F21C ; mapped ; 524D # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-524D +1F21D ; mapped ; 5F8C # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5F8C +1F21E ; mapped ; 518D # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-518D +1F21F ; mapped ; 65B0 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-65B0 +1F220 ; mapped ; 521D # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-521D +1F221 ; mapped ; 7D42 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-7D42 +1F222 ; mapped ; 751F # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-751F +1F223 ; mapped ; 8CA9 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-8CA9 +1F224 ; mapped ; 58F0 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-58F0 +1F225 ; mapped ; 5439 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5439 +1F226 ; mapped ; 6F14 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6F14 +1F227 ; mapped ; 6295 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6295 +1F228 ; mapped ; 6355 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6355 +1F229 ; mapped ; 4E00 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4E00 +1F22A ; mapped ; 4E09 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4E09 +1F22B ; mapped ; 904A # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-904A +1F22C ; mapped ; 5DE6 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-5DE6 +1F22D ; mapped ; 4E2D # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-4E2D +1F22E ; mapped ; 53F3 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-53F3 +1F22F ; mapped ; 6307 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6307 +1F230 ; mapped ; 8D70 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-8D70 +1F231 ; mapped ; 6253 # 5.2 SQUARED CJK UNIFIED IDEOGRAPH-6253 +1F232 ; mapped ; 7981 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-7981 +1F233 ; mapped ; 7A7A # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-7A7A +1F234 ; mapped ; 5408 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-5408 +1F235 ; mapped ; 6E80 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-6E80 +1F236 ; mapped ; 6709 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-6709 +1F237 ; mapped ; 6708 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-6708 +1F238 ; mapped ; 7533 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-7533 +1F239 ; mapped ; 5272 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-5272 +1F23A ; mapped ; 55B6 # 6.0 SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F23B ; mapped ; 914D # 9.0 SQUARED CJK UNIFIED IDEOGRAPH-914D +1F23C..1F23F ; disallowed # NA <reserved-1F23C>..<reserved-1F23F> +1F240 ; mapped ; 3014 672C 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C +1F241 ; mapped ; 3014 4E09 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 +1F242 ; mapped ; 3014 4E8C 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C +1F243 ; mapped ; 3014 5B89 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 +1F244 ; mapped ; 3014 70B9 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 +1F245 ; mapped ; 3014 6253 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 +1F246 ; mapped ; 3014 76D7 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 +1F247 ; mapped ; 3014 52DD 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD +1F248 ; mapped ; 3014 6557 3015 #5.2 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F249..1F24F ; disallowed # NA <reserved-1F249>..<reserved-1F24F> +1F250 ; mapped ; 5F97 # 6.0 CIRCLED IDEOGRAPH ADVANTAGE +1F251 ; mapped ; 53EF # 6.0 CIRCLED IDEOGRAPH ACCEPT +1F252..1F2FF ; disallowed # NA <reserved-1F252>..<reserved-1F2FF> +1F300..1F320 ; valid ; ; NV8 # 6.0 CYCLONE..SHOOTING STAR +1F321..1F32C ; valid ; ; NV8 # 7.0 THERMOMETER..WIND BLOWING FACE +1F32D..1F32F ; valid ; ; NV8 # 8.0 HOT DOG..BURRITO +1F330..1F335 ; valid ; ; NV8 # 6.0 CHESTNUT..CACTUS +1F336 ; valid ; ; NV8 # 7.0 HOT PEPPER +1F337..1F37C ; valid ; ; NV8 # 6.0 TULIP..BABY BOTTLE +1F37D ; valid ; ; NV8 # 7.0 FORK AND KNIFE WITH PLATE +1F37E..1F37F ; valid ; ; NV8 # 8.0 BOTTLE WITH POPPING CORK..POPCORN +1F380..1F393 ; valid ; ; NV8 # 6.0 RIBBON..GRADUATION CAP +1F394..1F39F ; valid ; ; NV8 # 7.0 HEART WITH TIP ON THE LEFT..ADMISSION TICKETS +1F3A0..1F3C4 ; valid ; ; NV8 # 6.0 CAROUSEL HORSE..SURFER +1F3C5 ; valid ; ; NV8 # 7.0 SPORTS MEDAL +1F3C6..1F3CA ; valid ; ; NV8 # 6.0 TROPHY..SWIMMER +1F3CB..1F3CE ; valid ; ; NV8 # 7.0 WEIGHT LIFTER..RACING CAR +1F3CF..1F3D3 ; valid ; ; NV8 # 8.0 CRICKET BAT AND BALL..TABLE TENNIS PADDLE AND BALL +1F3D4..1F3DF ; valid ; ; NV8 # 7.0 SNOW CAPPED MOUNTAIN..STADIUM +1F3E0..1F3F0 ; valid ; ; NV8 # 6.0 HOUSE BUILDING..EUROPEAN CASTLE +1F3F1..1F3F7 ; valid ; ; NV8 # 7.0 WHITE PENNANT..LABEL +1F3F8..1F3FF ; valid ; ; NV8 # 8.0 BADMINTON RACQUET AND SHUTTLECOCK..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F43E ; valid ; ; NV8 # 6.0 RAT..PAW PRINTS +1F43F ; valid ; ; NV8 # 7.0 CHIPMUNK +1F440 ; valid ; ; NV8 # 6.0 EYES +1F441 ; valid ; ; NV8 # 7.0 EYE +1F442..1F4F7 ; valid ; ; NV8 # 6.0 EAR..CAMERA +1F4F8 ; valid ; ; NV8 # 7.0 CAMERA WITH FLASH +1F4F9..1F4FC ; valid ; ; NV8 # 6.0 VIDEO CAMERA..VIDEOCASSETTE +1F4FD..1F4FE ; valid ; ; NV8 # 7.0 FILM PROJECTOR..PORTABLE STEREO +1F4FF ; valid ; ; NV8 # 8.0 PRAYER BEADS +1F500..1F53D ; valid ; ; NV8 # 6.0 TWISTED RIGHTWARDS ARROWS..DOWN-POINTING SMALL RED TRIANGLE +1F53E..1F53F ; valid ; ; NV8 # 7.0 LOWER RIGHT SHADOWED WHITE CIRCLE..UPPER RIGHT SHADOWED WHITE CIRCLE +1F540..1F543 ; valid ; ; NV8 # 6.1 CIRCLED CROSS POMMEE..NOTCHED LEFT SEMICIRCLE WITH THREE DOTS +1F544..1F54A ; valid ; ; NV8 # 7.0 NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS..DOVE OF PEACE +1F54B..1F54F ; valid ; ; NV8 # 8.0 KAABA..BOWL OF HYGIEIA +1F550..1F567 ; valid ; ; NV8 # 6.0 CLOCK FACE ONE OCLOCK..CLOCK FACE TWELVE-THIRTY +1F568..1F579 ; valid ; ; NV8 # 7.0 RIGHT SPEAKER..JOYSTICK +1F57A ; valid ; ; NV8 # 9.0 MAN DANCING +1F57B..1F5A3 ; valid ; ; NV8 # 7.0 LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX +1F5A4 ; valid ; ; NV8 # 9.0 BLACK HEART +1F5A5..1F5FA ; valid ; ; NV8 # 7.0 DESKTOP COMPUTER..WORLD MAP +1F5FB..1F5FF ; valid ; ; NV8 # 6.0 MOUNT FUJI..MOYAI +1F600 ; valid ; ; NV8 # 6.1 GRINNING FACE +1F601..1F610 ; valid ; ; NV8 # 6.0 GRINNING FACE WITH SMILING EYES..NEUTRAL FACE +1F611 ; valid ; ; NV8 # 6.1 EXPRESSIONLESS FACE +1F612..1F614 ; valid ; ; NV8 # 6.0 UNAMUSED FACE..PENSIVE FACE +1F615 ; valid ; ; NV8 # 6.1 CONFUSED FACE +1F616 ; valid ; ; NV8 # 6.0 CONFOUNDED FACE +1F617 ; valid ; ; NV8 # 6.1 KISSING FACE +1F618 ; valid ; ; NV8 # 6.0 FACE THROWING A KISS +1F619 ; valid ; ; NV8 # 6.1 KISSING FACE WITH SMILING EYES +1F61A ; valid ; ; NV8 # 6.0 KISSING FACE WITH CLOSED EYES +1F61B ; valid ; ; NV8 # 6.1 FACE WITH STUCK-OUT TONGUE +1F61C..1F61E ; valid ; ; NV8 # 6.0 FACE WITH STUCK-OUT TONGUE AND WINKING EYE..DISAPPOINTED FACE +1F61F ; valid ; ; NV8 # 6.1 WORRIED FACE +1F620..1F625 ; valid ; ; NV8 # 6.0 ANGRY FACE..DISAPPOINTED BUT RELIEVED FACE +1F626..1F627 ; valid ; ; NV8 # 6.1 FROWNING FACE WITH OPEN MOUTH..ANGUISHED FACE +1F628..1F62B ; valid ; ; NV8 # 6.0 FEARFUL FACE..TIRED FACE +1F62C ; valid ; ; NV8 # 6.1 GRIMACING FACE +1F62D ; valid ; ; NV8 # 6.0 LOUDLY CRYING FACE +1F62E..1F62F ; valid ; ; NV8 # 6.1 FACE WITH OPEN MOUTH..HUSHED FACE +1F630..1F633 ; valid ; ; NV8 # 6.0 FACE WITH OPEN MOUTH AND COLD SWEAT..FLUSHED FACE +1F634 ; valid ; ; NV8 # 6.1 SLEEPING FACE +1F635..1F640 ; valid ; ; NV8 # 6.0 DIZZY FACE..WEARY CAT FACE +1F641..1F642 ; valid ; ; NV8 # 7.0 SLIGHTLY FROWNING FACE..SLIGHTLY SMILING FACE +1F643..1F644 ; valid ; ; NV8 # 8.0 UPSIDE-DOWN FACE..FACE WITH ROLLING EYES +1F645..1F64F ; valid ; ; NV8 # 6.0 FACE WITH NO GOOD GESTURE..PERSON WITH FOLDED HANDS +1F650..1F67F ; valid ; ; NV8 # 7.0 NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD +1F680..1F6C5 ; valid ; ; NV8 # 6.0 ROCKET..LEFT LUGGAGE +1F6C6..1F6CF ; valid ; ; NV8 # 7.0 TRIANGLE WITH ROUNDED CORNERS..BED +1F6D0 ; valid ; ; NV8 # 8.0 PLACE OF WORSHIP +1F6D1..1F6D2 ; valid ; ; NV8 # 9.0 OCTAGONAL SIGN..SHOPPING TROLLEY +1F6D3..1F6DF ; disallowed # NA <reserved-1F6D3>..<reserved-1F6DF> +1F6E0..1F6EC ; valid ; ; NV8 # 7.0 HAMMER AND WRENCH..AIRPLANE ARRIVING +1F6ED..1F6EF ; disallowed # NA <reserved-1F6ED>..<reserved-1F6EF> +1F6F0..1F6F3 ; valid ; ; NV8 # 7.0 SATELLITE..PASSENGER SHIP +1F6F4..1F6F6 ; valid ; ; NV8 # 9.0 SCOOTER..CANOE +1F6F7..1F6FF ; disallowed # NA <reserved-1F6F7>..<reserved-1F6FF> +1F700..1F773 ; valid ; ; NV8 # 6.0 ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE +1F774..1F77F ; disallowed # NA <reserved-1F774>..<reserved-1F77F> +1F780..1F7D4 ; valid ; ; NV8 # 7.0 BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR +1F7D5..1F7FF ; disallowed # NA <reserved-1F7D5>..<reserved-1F7FF> +1F800..1F80B ; valid ; ; NV8 # 7.0 LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80C..1F80F ; disallowed # NA <reserved-1F80C>..<reserved-1F80F> +1F810..1F847 ; valid ; ; NV8 # 7.0 LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F848..1F84F ; disallowed # NA <reserved-1F848>..<reserved-1F84F> +1F850..1F859 ; valid ; ; NV8 # 7.0 LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F85A..1F85F ; disallowed # NA <reserved-1F85A>..<reserved-1F85F> +1F860..1F887 ; valid ; ; NV8 # 7.0 WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F888..1F88F ; disallowed # NA <reserved-1F888>..<reserved-1F88F> +1F890..1F8AD ; valid ; ; NV8 # 7.0 LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +1F8AE..1F90F ; disallowed # NA <reserved-1F8AE>..<reserved-1F90F> +1F910..1F918 ; valid ; ; NV8 # 8.0 ZIPPER-MOUTH FACE..SIGN OF THE HORNS +1F919..1F91E ; valid ; ; NV8 # 9.0 CALL ME HAND..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F91F ; disallowed # NA <reserved-1F91F> +1F920..1F927 ; valid ; ; NV8 # 9.0 FACE WITH COWBOY HAT..SNEEZING FACE +1F928..1F92F ; disallowed # NA <reserved-1F928>..<reserved-1F92F> +1F930 ; valid ; ; NV8 # 9.0 PREGNANT WOMAN +1F931..1F932 ; disallowed # NA <reserved-1F931>..<reserved-1F932> +1F933..1F93E ; valid ; ; NV8 # 9.0 SELFIE..HANDBALL +1F93F ; disallowed # NA <reserved-1F93F> +1F940..1F94B ; valid ; ; NV8 # 9.0 WILTED FLOWER..MARTIAL ARTS UNIFORM +1F94C..1F94F ; disallowed # NA <reserved-1F94C>..<reserved-1F94F> +1F950..1F95E ; valid ; ; NV8 # 9.0 CROISSANT..PANCAKES +1F95F..1F97F ; disallowed # NA <reserved-1F95F>..<reserved-1F97F> +1F980..1F984 ; valid ; ; NV8 # 8.0 CRAB..UNICORN FACE +1F985..1F991 ; valid ; ; NV8 # 9.0 EAGLE..SQUID +1F992..1F9BF ; disallowed # NA <reserved-1F992>..<reserved-1F9BF> +1F9C0 ; valid ; ; NV8 # 8.0 CHEESE WEDGE +1F9C1..1FFFD ; disallowed # NA <reserved-1F9C1>..<reserved-1FFFD> +1FFFE..1FFFF ; disallowed # 2.0 <noncharacter-1FFFE>..<noncharacter-1FFFF> +20000..2A6D6 ; valid # 3.1 CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A6D7..2A6FF ; disallowed # NA <reserved-2A6D7>..<reserved-2A6FF> +2A700..2B734 ; valid # 5.2 CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 +2B735..2B73F ; disallowed # NA <reserved-2B735>..<reserved-2B73F> +2B740..2B81D ; valid # 6.0 CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B81E..2B81F ; disallowed # NA <reserved-2B81E>..<reserved-2B81F> +2B820..2CEA1 ; valid # 8.0 CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEA2..2F7FF ; disallowed # NA <reserved-2CEA2>..<reserved-2F7FF> +2F800 ; mapped ; 4E3D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F800 +2F801 ; mapped ; 4E38 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F801 +2F802 ; mapped ; 4E41 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F802 +2F803 ; mapped ; 20122 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F803 +2F804 ; mapped ; 4F60 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F804 +2F805 ; mapped ; 4FAE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F805 +2F806 ; mapped ; 4FBB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F806 +2F807 ; mapped ; 5002 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F807 +2F808 ; mapped ; 507A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F808 +2F809 ; mapped ; 5099 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F809 +2F80A ; mapped ; 50E7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80A +2F80B ; mapped ; 50CF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80B +2F80C ; mapped ; 349E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80C +2F80D ; mapped ; 2063A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80D +2F80E ; mapped ; 514D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80E +2F80F ; mapped ; 5154 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F80F +2F810 ; mapped ; 5164 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F810 +2F811 ; mapped ; 5177 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F811 +2F812 ; mapped ; 2051C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F812 +2F813 ; mapped ; 34B9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F813 +2F814 ; mapped ; 5167 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F814 +2F815 ; mapped ; 518D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F815 +2F816 ; mapped ; 2054B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F816 +2F817 ; mapped ; 5197 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F817 +2F818 ; mapped ; 51A4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F818 +2F819 ; mapped ; 4ECC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F819 +2F81A ; mapped ; 51AC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81A +2F81B ; mapped ; 51B5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81B +2F81C ; mapped ; 291DF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81C +2F81D ; mapped ; 51F5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81D +2F81E ; mapped ; 5203 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81E +2F81F ; mapped ; 34DF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F81F +2F820 ; mapped ; 523B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F820 +2F821 ; mapped ; 5246 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F821 +2F822 ; mapped ; 5272 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F822 +2F823 ; mapped ; 5277 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F823 +2F824 ; mapped ; 3515 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F824 +2F825 ; mapped ; 52C7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F825 +2F826 ; mapped ; 52C9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F826 +2F827 ; mapped ; 52E4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F827 +2F828 ; mapped ; 52FA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F828 +2F829 ; mapped ; 5305 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F829 +2F82A ; mapped ; 5306 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82A +2F82B ; mapped ; 5317 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82B +2F82C ; mapped ; 5349 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82C +2F82D ; mapped ; 5351 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82D +2F82E ; mapped ; 535A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82E +2F82F ; mapped ; 5373 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F82F +2F830 ; mapped ; 537D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F830 +2F831..2F833 ; mapped ; 537F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F831..CJK COMPATIBILITY IDEOGRAPH-2F833 +2F834 ; mapped ; 20A2C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F834 +2F835 ; mapped ; 7070 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F835 +2F836 ; mapped ; 53CA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F836 +2F837 ; mapped ; 53DF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F837 +2F838 ; mapped ; 20B63 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F838 +2F839 ; mapped ; 53EB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F839 +2F83A ; mapped ; 53F1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83A +2F83B ; mapped ; 5406 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83B +2F83C ; mapped ; 549E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83C +2F83D ; mapped ; 5438 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83D +2F83E ; mapped ; 5448 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83E +2F83F ; mapped ; 5468 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F83F +2F840 ; mapped ; 54A2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F840 +2F841 ; mapped ; 54F6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F841 +2F842 ; mapped ; 5510 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F842 +2F843 ; mapped ; 5553 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F843 +2F844 ; mapped ; 5563 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F844 +2F845..2F846 ; mapped ; 5584 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F845..CJK COMPATIBILITY IDEOGRAPH-2F846 +2F847 ; mapped ; 5599 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F847 +2F848 ; mapped ; 55AB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F848 +2F849 ; mapped ; 55B3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F849 +2F84A ; mapped ; 55C2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84A +2F84B ; mapped ; 5716 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84B +2F84C ; mapped ; 5606 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84C +2F84D ; mapped ; 5717 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84D +2F84E ; mapped ; 5651 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84E +2F84F ; mapped ; 5674 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F84F +2F850 ; mapped ; 5207 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F850 +2F851 ; mapped ; 58EE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F851 +2F852 ; mapped ; 57CE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F852 +2F853 ; mapped ; 57F4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F853 +2F854 ; mapped ; 580D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F854 +2F855 ; mapped ; 578B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F855 +2F856 ; mapped ; 5832 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F856 +2F857 ; mapped ; 5831 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F857 +2F858 ; mapped ; 58AC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F858 +2F859 ; mapped ; 214E4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F859 +2F85A ; mapped ; 58F2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85A +2F85B ; mapped ; 58F7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85B +2F85C ; mapped ; 5906 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85C +2F85D ; mapped ; 591A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85D +2F85E ; mapped ; 5922 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85E +2F85F ; mapped ; 5962 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F85F +2F860 ; mapped ; 216A8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F860 +2F861 ; mapped ; 216EA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F861 +2F862 ; mapped ; 59EC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F862 +2F863 ; mapped ; 5A1B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F863 +2F864 ; mapped ; 5A27 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F864 +2F865 ; mapped ; 59D8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F865 +2F866 ; mapped ; 5A66 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F866 +2F867 ; mapped ; 36EE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F867 +2F868 ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F868 +2F869 ; mapped ; 5B08 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F869 +2F86A..2F86B ; mapped ; 5B3E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86A..CJK COMPATIBILITY IDEOGRAPH-2F86B +2F86C ; mapped ; 219C8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86C +2F86D ; mapped ; 5BC3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86D +2F86E ; mapped ; 5BD8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86E +2F86F ; mapped ; 5BE7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F86F +2F870 ; mapped ; 5BF3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F870 +2F871 ; mapped ; 21B18 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F871 +2F872 ; mapped ; 5BFF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F872 +2F873 ; mapped ; 5C06 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F873 +2F874 ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F874 +2F875 ; mapped ; 5C22 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F875 +2F876 ; mapped ; 3781 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F876 +2F877 ; mapped ; 5C60 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F877 +2F878 ; mapped ; 5C6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F878 +2F879 ; mapped ; 5CC0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F879 +2F87A ; mapped ; 5C8D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87A +2F87B ; mapped ; 21DE4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87B +2F87C ; mapped ; 5D43 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87C +2F87D ; mapped ; 21DE6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87D +2F87E ; mapped ; 5D6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87E +2F87F ; mapped ; 5D6B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F87F +2F880 ; mapped ; 5D7C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F880 +2F881 ; mapped ; 5DE1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F881 +2F882 ; mapped ; 5DE2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F882 +2F883 ; mapped ; 382F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F883 +2F884 ; mapped ; 5DFD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F884 +2F885 ; mapped ; 5E28 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F885 +2F886 ; mapped ; 5E3D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F886 +2F887 ; mapped ; 5E69 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F887 +2F888 ; mapped ; 3862 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F888 +2F889 ; mapped ; 22183 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F889 +2F88A ; mapped ; 387C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88A +2F88B ; mapped ; 5EB0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88B +2F88C ; mapped ; 5EB3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88C +2F88D ; mapped ; 5EB6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88D +2F88E ; mapped ; 5ECA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88E +2F88F ; mapped ; 2A392 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F88F +2F890 ; mapped ; 5EFE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F890 +2F891..2F892 ; mapped ; 22331 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F891..CJK COMPATIBILITY IDEOGRAPH-2F892 +2F893 ; mapped ; 8201 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F893 +2F894..2F895 ; mapped ; 5F22 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F894..CJK COMPATIBILITY IDEOGRAPH-2F895 +2F896 ; mapped ; 38C7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F896 +2F897 ; mapped ; 232B8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F897 +2F898 ; mapped ; 261DA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F898 +2F899 ; mapped ; 5F62 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F899 +2F89A ; mapped ; 5F6B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89A +2F89B ; mapped ; 38E3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89B +2F89C ; mapped ; 5F9A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89C +2F89D ; mapped ; 5FCD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89D +2F89E ; mapped ; 5FD7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89E +2F89F ; mapped ; 5FF9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F89F +2F8A0 ; mapped ; 6081 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A0 +2F8A1 ; mapped ; 393A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A1 +2F8A2 ; mapped ; 391C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A2 +2F8A3 ; mapped ; 6094 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A3 +2F8A4 ; mapped ; 226D4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A4 +2F8A5 ; mapped ; 60C7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A5 +2F8A6 ; mapped ; 6148 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A6 +2F8A7 ; mapped ; 614C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A7 +2F8A8 ; mapped ; 614E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A8 +2F8A9 ; mapped ; 614C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8A9 +2F8AA ; mapped ; 617A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AA +2F8AB ; mapped ; 618E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AB +2F8AC ; mapped ; 61B2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AC +2F8AD ; mapped ; 61A4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AD +2F8AE ; mapped ; 61AF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AE +2F8AF ; mapped ; 61DE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8AF +2F8B0 ; mapped ; 61F2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B0 +2F8B1 ; mapped ; 61F6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B1 +2F8B2 ; mapped ; 6210 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B2 +2F8B3 ; mapped ; 621B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B3 +2F8B4 ; mapped ; 625D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B4 +2F8B5 ; mapped ; 62B1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B5 +2F8B6 ; mapped ; 62D4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B6 +2F8B7 ; mapped ; 6350 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B7 +2F8B8 ; mapped ; 22B0C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B8 +2F8B9 ; mapped ; 633D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8B9 +2F8BA ; mapped ; 62FC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BA +2F8BB ; mapped ; 6368 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BB +2F8BC ; mapped ; 6383 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BC +2F8BD ; mapped ; 63E4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BD +2F8BE ; mapped ; 22BF1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BE +2F8BF ; mapped ; 6422 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8BF +2F8C0 ; mapped ; 63C5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C0 +2F8C1 ; mapped ; 63A9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C1 +2F8C2 ; mapped ; 3A2E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C2 +2F8C3 ; mapped ; 6469 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C3 +2F8C4 ; mapped ; 647E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C4 +2F8C5 ; mapped ; 649D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C5 +2F8C6 ; mapped ; 6477 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C6 +2F8C7 ; mapped ; 3A6C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C7 +2F8C8 ; mapped ; 654F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C8 +2F8C9 ; mapped ; 656C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8C9 +2F8CA ; mapped ; 2300A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CA +2F8CB ; mapped ; 65E3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CB +2F8CC ; mapped ; 66F8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CC +2F8CD ; mapped ; 6649 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CD +2F8CE ; mapped ; 3B19 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CE +2F8CF ; mapped ; 6691 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8CF +2F8D0 ; mapped ; 3B08 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D0 +2F8D1 ; mapped ; 3AE4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D1 +2F8D2 ; mapped ; 5192 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D2 +2F8D3 ; mapped ; 5195 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D3 +2F8D4 ; mapped ; 6700 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D4 +2F8D5 ; mapped ; 669C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D5 +2F8D6 ; mapped ; 80AD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D6 +2F8D7 ; mapped ; 43D9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D7 +2F8D8 ; mapped ; 6717 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D8 +2F8D9 ; mapped ; 671B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8D9 +2F8DA ; mapped ; 6721 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DA +2F8DB ; mapped ; 675E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DB +2F8DC ; mapped ; 6753 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DC +2F8DD ; mapped ; 233C3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DD +2F8DE ; mapped ; 3B49 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DE +2F8DF ; mapped ; 67FA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8DF +2F8E0 ; mapped ; 6785 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E0 +2F8E1 ; mapped ; 6852 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E1 +2F8E2 ; mapped ; 6885 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E2 +2F8E3 ; mapped ; 2346D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E3 +2F8E4 ; mapped ; 688E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E4 +2F8E5 ; mapped ; 681F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E5 +2F8E6 ; mapped ; 6914 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E6 +2F8E7 ; mapped ; 3B9D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E7 +2F8E8 ; mapped ; 6942 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E8 +2F8E9 ; mapped ; 69A3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8E9 +2F8EA ; mapped ; 69EA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EA +2F8EB ; mapped ; 6AA8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EB +2F8EC ; mapped ; 236A3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EC +2F8ED ; mapped ; 6ADB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8ED +2F8EE ; mapped ; 3C18 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EE +2F8EF ; mapped ; 6B21 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8EF +2F8F0 ; mapped ; 238A7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F0 +2F8F1 ; mapped ; 6B54 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F1 +2F8F2 ; mapped ; 3C4E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F2 +2F8F3 ; mapped ; 6B72 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F3 +2F8F4 ; mapped ; 6B9F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F4 +2F8F5 ; mapped ; 6BBA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F5 +2F8F6 ; mapped ; 6BBB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F6 +2F8F7 ; mapped ; 23A8D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F7 +2F8F8 ; mapped ; 21D0B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F8 +2F8F9 ; mapped ; 23AFA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8F9 +2F8FA ; mapped ; 6C4E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FA +2F8FB ; mapped ; 23CBC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FB +2F8FC ; mapped ; 6CBF # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FC +2F8FD ; mapped ; 6CCD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FD +2F8FE ; mapped ; 6C67 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FE +2F8FF ; mapped ; 6D16 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F8FF +2F900 ; mapped ; 6D3E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F900 +2F901 ; mapped ; 6D77 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F901 +2F902 ; mapped ; 6D41 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F902 +2F903 ; mapped ; 6D69 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F903 +2F904 ; mapped ; 6D78 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F904 +2F905 ; mapped ; 6D85 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F905 +2F906 ; mapped ; 23D1E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F906 +2F907 ; mapped ; 6D34 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F907 +2F908 ; mapped ; 6E2F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F908 +2F909 ; mapped ; 6E6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F909 +2F90A ; mapped ; 3D33 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90A +2F90B ; mapped ; 6ECB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90B +2F90C ; mapped ; 6EC7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90C +2F90D ; mapped ; 23ED1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90D +2F90E ; mapped ; 6DF9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90E +2F90F ; mapped ; 6F6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F90F +2F910 ; mapped ; 23F5E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F910 +2F911 ; mapped ; 23F8E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F911 +2F912 ; mapped ; 6FC6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F912 +2F913 ; mapped ; 7039 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F913 +2F914 ; mapped ; 701E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F914 +2F915 ; mapped ; 701B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F915 +2F916 ; mapped ; 3D96 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F916 +2F917 ; mapped ; 704A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F917 +2F918 ; mapped ; 707D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F918 +2F919 ; mapped ; 7077 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F919 +2F91A ; mapped ; 70AD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91A +2F91B ; mapped ; 20525 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91B +2F91C ; mapped ; 7145 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91C +2F91D ; mapped ; 24263 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91D +2F91E ; mapped ; 719C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91E +2F91F ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F91F +2F920 ; mapped ; 7228 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F920 +2F921 ; mapped ; 7235 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F921 +2F922 ; mapped ; 7250 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F922 +2F923 ; mapped ; 24608 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F923 +2F924 ; mapped ; 7280 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F924 +2F925 ; mapped ; 7295 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F925 +2F926 ; mapped ; 24735 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F926 +2F927 ; mapped ; 24814 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F927 +2F928 ; mapped ; 737A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F928 +2F929 ; mapped ; 738B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F929 +2F92A ; mapped ; 3EAC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92A +2F92B ; mapped ; 73A5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92B +2F92C..2F92D ; mapped ; 3EB8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92C..CJK COMPATIBILITY IDEOGRAPH-2F92D +2F92E ; mapped ; 7447 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92E +2F92F ; mapped ; 745C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F92F +2F930 ; mapped ; 7471 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F930 +2F931 ; mapped ; 7485 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F931 +2F932 ; mapped ; 74CA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F932 +2F933 ; mapped ; 3F1B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F933 +2F934 ; mapped ; 7524 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F934 +2F935 ; mapped ; 24C36 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F935 +2F936 ; mapped ; 753E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F936 +2F937 ; mapped ; 24C92 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F937 +2F938 ; mapped ; 7570 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F938 +2F939 ; mapped ; 2219F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F939 +2F93A ; mapped ; 7610 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93A +2F93B ; mapped ; 24FA1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93B +2F93C ; mapped ; 24FB8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93C +2F93D ; mapped ; 25044 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93D +2F93E ; mapped ; 3FFC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93E +2F93F ; mapped ; 4008 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F93F +2F940 ; mapped ; 76F4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F940 +2F941 ; mapped ; 250F3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F941 +2F942 ; mapped ; 250F2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F942 +2F943 ; mapped ; 25119 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F943 +2F944 ; mapped ; 25133 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F944 +2F945 ; mapped ; 771E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F945 +2F946..2F947 ; mapped ; 771F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F946..CJK COMPATIBILITY IDEOGRAPH-2F947 +2F948 ; mapped ; 774A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F948 +2F949 ; mapped ; 4039 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F949 +2F94A ; mapped ; 778B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94A +2F94B ; mapped ; 4046 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94B +2F94C ; mapped ; 4096 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94C +2F94D ; mapped ; 2541D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94D +2F94E ; mapped ; 784E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94E +2F94F ; mapped ; 788C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F94F +2F950 ; mapped ; 78CC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F950 +2F951 ; mapped ; 40E3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F951 +2F952 ; mapped ; 25626 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F952 +2F953 ; mapped ; 7956 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F953 +2F954 ; mapped ; 2569A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F954 +2F955 ; mapped ; 256C5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F955 +2F956 ; mapped ; 798F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F956 +2F957 ; mapped ; 79EB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F957 +2F958 ; mapped ; 412F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F958 +2F959 ; mapped ; 7A40 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F959 +2F95A ; mapped ; 7A4A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95A +2F95B ; mapped ; 7A4F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95B +2F95C ; mapped ; 2597C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95C +2F95D..2F95E ; mapped ; 25AA7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95D..CJK COMPATIBILITY IDEOGRAPH-2F95E +2F95F ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F95F +2F960 ; mapped ; 4202 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F960 +2F961 ; mapped ; 25BAB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F961 +2F962 ; mapped ; 7BC6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F962 +2F963 ; mapped ; 7BC9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F963 +2F964 ; mapped ; 4227 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F964 +2F965 ; mapped ; 25C80 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F965 +2F966 ; mapped ; 7CD2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F966 +2F967 ; mapped ; 42A0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F967 +2F968 ; mapped ; 7CE8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F968 +2F969 ; mapped ; 7CE3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F969 +2F96A ; mapped ; 7D00 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96A +2F96B ; mapped ; 25F86 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96B +2F96C ; mapped ; 7D63 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96C +2F96D ; mapped ; 4301 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96D +2F96E ; mapped ; 7DC7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96E +2F96F ; mapped ; 7E02 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F96F +2F970 ; mapped ; 7E45 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F970 +2F971 ; mapped ; 4334 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F971 +2F972 ; mapped ; 26228 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F972 +2F973 ; mapped ; 26247 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F973 +2F974 ; mapped ; 4359 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F974 +2F975 ; mapped ; 262D9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F975 +2F976 ; mapped ; 7F7A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F976 +2F977 ; mapped ; 2633E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F977 +2F978 ; mapped ; 7F95 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F978 +2F979 ; mapped ; 7FFA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F979 +2F97A ; mapped ; 8005 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97A +2F97B ; mapped ; 264DA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97B +2F97C ; mapped ; 26523 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97C +2F97D ; mapped ; 8060 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97D +2F97E ; mapped ; 265A8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97E +2F97F ; mapped ; 8070 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F97F +2F980 ; mapped ; 2335F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F980 +2F981 ; mapped ; 43D5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F981 +2F982 ; mapped ; 80B2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F982 +2F983 ; mapped ; 8103 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F983 +2F984 ; mapped ; 440B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F984 +2F985 ; mapped ; 813E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F985 +2F986 ; mapped ; 5AB5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F986 +2F987 ; mapped ; 267A7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F987 +2F988 ; mapped ; 267B5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F988 +2F989 ; mapped ; 23393 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F989 +2F98A ; mapped ; 2339C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98A +2F98B ; mapped ; 8201 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98B +2F98C ; mapped ; 8204 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98C +2F98D ; mapped ; 8F9E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98D +2F98E ; mapped ; 446B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98E +2F98F ; mapped ; 8291 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F98F +2F990 ; mapped ; 828B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F990 +2F991 ; mapped ; 829D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F991 +2F992 ; mapped ; 52B3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F992 +2F993 ; mapped ; 82B1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F993 +2F994 ; mapped ; 82B3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F994 +2F995 ; mapped ; 82BD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F995 +2F996 ; mapped ; 82E6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F996 +2F997 ; mapped ; 26B3C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F997 +2F998 ; mapped ; 82E5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F998 +2F999 ; mapped ; 831D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F999 +2F99A ; mapped ; 8363 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99A +2F99B ; mapped ; 83AD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99B +2F99C ; mapped ; 8323 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99C +2F99D ; mapped ; 83BD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99D +2F99E ; mapped ; 83E7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99E +2F99F ; mapped ; 8457 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F99F +2F9A0 ; mapped ; 8353 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A0 +2F9A1 ; mapped ; 83CA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A1 +2F9A2 ; mapped ; 83CC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A2 +2F9A3 ; mapped ; 83DC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A3 +2F9A4 ; mapped ; 26C36 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A4 +2F9A5 ; mapped ; 26D6B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A5 +2F9A6 ; mapped ; 26CD5 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A6 +2F9A7 ; mapped ; 452B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A7 +2F9A8 ; mapped ; 84F1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A8 +2F9A9 ; mapped ; 84F3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9A9 +2F9AA ; mapped ; 8516 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AA +2F9AB ; mapped ; 273CA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AB +2F9AC ; mapped ; 8564 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AC +2F9AD ; mapped ; 26F2C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AD +2F9AE ; mapped ; 455D # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AE +2F9AF ; mapped ; 4561 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9AF +2F9B0 ; mapped ; 26FB1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B0 +2F9B1 ; mapped ; 270D2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B1 +2F9B2 ; mapped ; 456B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B2 +2F9B3 ; mapped ; 8650 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B3 +2F9B4 ; mapped ; 865C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B4 +2F9B5 ; mapped ; 8667 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B5 +2F9B6 ; mapped ; 8669 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B6 +2F9B7 ; mapped ; 86A9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B7 +2F9B8 ; mapped ; 8688 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B8 +2F9B9 ; mapped ; 870E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9B9 +2F9BA ; mapped ; 86E2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BA +2F9BB ; mapped ; 8779 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BB +2F9BC ; mapped ; 8728 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BC +2F9BD ; mapped ; 876B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BD +2F9BE ; mapped ; 8786 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BE +2F9BF ; disallowed # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9BF +2F9C0 ; mapped ; 87E1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C0 +2F9C1 ; mapped ; 8801 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C1 +2F9C2 ; mapped ; 45F9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C2 +2F9C3 ; mapped ; 8860 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C3 +2F9C4 ; mapped ; 8863 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C4 +2F9C5 ; mapped ; 27667 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C5 +2F9C6 ; mapped ; 88D7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C6 +2F9C7 ; mapped ; 88DE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C7 +2F9C8 ; mapped ; 4635 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C8 +2F9C9 ; mapped ; 88FA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9C9 +2F9CA ; mapped ; 34BB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CA +2F9CB ; mapped ; 278AE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CB +2F9CC ; mapped ; 27966 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CC +2F9CD ; mapped ; 46BE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CD +2F9CE ; mapped ; 46C7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CE +2F9CF ; mapped ; 8AA0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9CF +2F9D0 ; mapped ; 8AED # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D0 +2F9D1 ; mapped ; 8B8A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D1 +2F9D2 ; mapped ; 8C55 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D2 +2F9D3 ; mapped ; 27CA8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D3 +2F9D4 ; mapped ; 8CAB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D4 +2F9D5 ; mapped ; 8CC1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D5 +2F9D6 ; mapped ; 8D1B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D6 +2F9D7 ; mapped ; 8D77 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D7 +2F9D8 ; mapped ; 27F2F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D8 +2F9D9 ; mapped ; 20804 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9D9 +2F9DA ; mapped ; 8DCB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DA +2F9DB ; mapped ; 8DBC # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DB +2F9DC ; mapped ; 8DF0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DC +2F9DD ; mapped ; 208DE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DD +2F9DE ; mapped ; 8ED4 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DE +2F9DF ; mapped ; 8F38 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9DF +2F9E0 ; mapped ; 285D2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E0 +2F9E1 ; mapped ; 285ED # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E1 +2F9E2 ; mapped ; 9094 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E2 +2F9E3 ; mapped ; 90F1 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E3 +2F9E4 ; mapped ; 9111 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E4 +2F9E5 ; mapped ; 2872E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E5 +2F9E6 ; mapped ; 911B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E6 +2F9E7 ; mapped ; 9238 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E7 +2F9E8 ; mapped ; 92D7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E8 +2F9E9 ; mapped ; 92D8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9E9 +2F9EA ; mapped ; 927C # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EA +2F9EB ; mapped ; 93F9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EB +2F9EC ; mapped ; 9415 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EC +2F9ED ; mapped ; 28BFA # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9ED +2F9EE ; mapped ; 958B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EE +2F9EF ; mapped ; 4995 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9EF +2F9F0 ; mapped ; 95B7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F0 +2F9F1 ; mapped ; 28D77 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F1 +2F9F2 ; mapped ; 49E6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F2 +2F9F3 ; mapped ; 96C3 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F3 +2F9F4 ; mapped ; 5DB2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F4 +2F9F5 ; mapped ; 9723 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F5 +2F9F6 ; mapped ; 29145 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F6 +2F9F7 ; mapped ; 2921A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F7 +2F9F8 ; mapped ; 4A6E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F8 +2F9F9 ; mapped ; 4A76 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9F9 +2F9FA ; mapped ; 97E0 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FA +2F9FB ; mapped ; 2940A # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FB +2F9FC ; mapped ; 4AB2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FC +2F9FD ; mapped ; 29496 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FD +2F9FE..2F9FF ; mapped ; 980B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2F9FE..CJK COMPATIBILITY IDEOGRAPH-2F9FF +2FA00 ; mapped ; 9829 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA00 +2FA01 ; mapped ; 295B6 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA01 +2FA02 ; mapped ; 98E2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA02 +2FA03 ; mapped ; 4B33 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA03 +2FA04 ; mapped ; 9929 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA04 +2FA05 ; mapped ; 99A7 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA05 +2FA06 ; mapped ; 99C2 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA06 +2FA07 ; mapped ; 99FE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA07 +2FA08 ; mapped ; 4BCE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA08 +2FA09 ; mapped ; 29B30 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA09 +2FA0A ; mapped ; 9B12 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0A +2FA0B ; mapped ; 9C40 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0B +2FA0C ; mapped ; 9CFD # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0C +2FA0D ; mapped ; 4CCE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0D +2FA0E ; mapped ; 4CED # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0E +2FA0F ; mapped ; 9D67 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA0F +2FA10 ; mapped ; 2A0CE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA10 +2FA11 ; mapped ; 4CF8 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA11 +2FA12 ; mapped ; 2A105 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA12 +2FA13 ; mapped ; 2A20E # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA13 +2FA14 ; mapped ; 2A291 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA14 +2FA15 ; mapped ; 9EBB # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA15 +2FA16 ; mapped ; 4D56 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA16 +2FA17 ; mapped ; 9EF9 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA17 +2FA18 ; mapped ; 9EFE # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA18 +2FA19 ; mapped ; 9F05 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA19 +2FA1A ; mapped ; 9F0F # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA1A +2FA1B ; mapped ; 9F16 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA1B +2FA1C ; mapped ; 9F3B # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA1C +2FA1D ; mapped ; 2A600 # 3.1 CJK COMPATIBILITY IDEOGRAPH-2FA1D +2FA1E..2FFFD ; disallowed # NA <reserved-2FA1E>..<reserved-2FFFD> +2FFFE..2FFFF ; disallowed # 2.0 <noncharacter-2FFFE>..<noncharacter-2FFFF> +30000..3FFFD ; disallowed # NA <reserved-30000>..<reserved-3FFFD> +3FFFE..3FFFF ; disallowed # 2.0 <noncharacter-3FFFE>..<noncharacter-3FFFF> +40000..4FFFD ; disallowed # NA <reserved-40000>..<reserved-4FFFD> +4FFFE..4FFFF ; disallowed # 2.0 <noncharacter-4FFFE>..<noncharacter-4FFFF> +50000..5FFFD ; disallowed # NA <reserved-50000>..<reserved-5FFFD> +5FFFE..5FFFF ; disallowed # 2.0 <noncharacter-5FFFE>..<noncharacter-5FFFF> +60000..6FFFD ; disallowed # NA <reserved-60000>..<reserved-6FFFD> +6FFFE..6FFFF ; disallowed # 2.0 <noncharacter-6FFFE>..<noncharacter-6FFFF> +70000..7FFFD ; disallowed # NA <reserved-70000>..<reserved-7FFFD> +7FFFE..7FFFF ; disallowed # 2.0 <noncharacter-7FFFE>..<noncharacter-7FFFF> +80000..8FFFD ; disallowed # NA <reserved-80000>..<reserved-8FFFD> +8FFFE..8FFFF ; disallowed # 2.0 <noncharacter-8FFFE>..<noncharacter-8FFFF> +90000..9FFFD ; disallowed # NA <reserved-90000>..<reserved-9FFFD> +9FFFE..9FFFF ; disallowed # 2.0 <noncharacter-9FFFE>..<noncharacter-9FFFF> +A0000..AFFFD ; disallowed # NA <reserved-A0000>..<reserved-AFFFD> +AFFFE..AFFFF ; disallowed # 2.0 <noncharacter-AFFFE>..<noncharacter-AFFFF> +B0000..BFFFD ; disallowed # NA <reserved-B0000>..<reserved-BFFFD> +BFFFE..BFFFF ; disallowed # 2.0 <noncharacter-BFFFE>..<noncharacter-BFFFF> +C0000..CFFFD ; disallowed # NA <reserved-C0000>..<reserved-CFFFD> +CFFFE..CFFFF ; disallowed # 2.0 <noncharacter-CFFFE>..<noncharacter-CFFFF> +D0000..DFFFD ; disallowed # NA <reserved-D0000>..<reserved-DFFFD> +DFFFE..DFFFF ; disallowed # 2.0 <noncharacter-DFFFE>..<noncharacter-DFFFF> +E0000 ; disallowed # NA <reserved-E0000> +E0001 ; disallowed # 3.1 LANGUAGE TAG +E0002..E001F ; disallowed # NA <reserved-E0002>..<reserved-E001F> +E0020..E007F ; disallowed # 3.1 TAG SPACE..CANCEL TAG +E0080..E00FF ; disallowed # NA <reserved-E0080>..<reserved-E00FF> +E0100..E01EF ; ignored # 4.0 VARIATION SELECTOR-17..VARIATION SELECTOR-256 +E01F0..EFFFD ; disallowed # NA <reserved-E01F0>..<reserved-EFFFD> +EFFFE..EFFFF ; disallowed # 2.0 <noncharacter-EFFFE>..<noncharacter-EFFFF> +F0000..FFFFD ; disallowed # 2.0 <private-use-F0000>..<private-use-FFFFD> +FFFFE..FFFFF ; disallowed # 2.0 <noncharacter-FFFFE>..<noncharacter-FFFFF> +100000..10FFFD; disallowed # 2.0 <private-use-100000>..<private-use-10FFFD> +10FFFE..10FFFF; disallowed # 2.0 <noncharacter-10FFFE>..<noncharacter-10FFFF> + +# Total code points: 1114112 + diff --git a/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/tables/generate_mapping_table.rb b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/tables/generate_mapping_table.rb new file mode 100644 index 000000000000..a1d4b98b41e7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/simpleidn-0.2.1/tables/generate_mapping_table.rb @@ -0,0 +1,51 @@ +#!/usr/bin/env ruby + +# Input is expected to follow the form found in IdnaMappingTable.txt +# from The Unicode Consortium + +puts "# encoding: UTF-8\n\n" + +map = {} +ARGF.each do |line| + # Copy full comment lines to output + puts line if line[0] == '#' + + s = line.strip.split('#').first + next if s.nil? + + p = s.split(';').map{|s| s.strip} + + if p[1] == "ignored" + p[1] = "mapped" + p[2] = "" + end + + next unless p[1] == "mapped" || p[1] == "disallowed_STD3_mapped" + + dst = p[2].split(/\s+/).map do |hex| + hex.to_i(16) + end + if dst.length == 1 + dst = dst.first + end + + if p[0].include?('..') + a, b = p[0].split('..',2).map{|n|n.to_i(16)} + (a..b).each do |n| + map[n] = dst + end + else + src = p[0].to_i(16) + map[src] = dst + end +end + +# Output final mapping data +puts +puts 'module SimpleIDN' +puts ' UTS64MAPPING = {' +map.each do |k, v| + puts " #{k} => #{v}," +end +puts ' }' +puts 'end' diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/.gitignore new file mode 100644 index 000000000000..863ddb828276 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +pkg +tmp +*.cache +doc +Gemfile.lock diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Gemfile new file mode 100644 index 000000000000..735dba7c2399 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in test-gem.gemspec +gemspec + +gem 'tins', '~> 1.0.0' # Ruby 1.9 compat diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/History.rdoc b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/History.rdoc new file mode 100644 index 000000000000..3b039aa37fe8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/History.rdoc @@ -0,0 +1,85 @@ +1.8.0 / 2017-05-16 +================== + +* Top and bottom borders can be disabled (@kubakrzempek, #83) +* `unicode-display-width` dependency relaxes (@mvz, #88) + +* Readme and docs fixes (@loualrid, #82 and @leoarnold, #86) +* Fixed some test-related warnings (@juanitofatas, #81 and @mvz, #89) + +1.7.3 / 2016-09-21 +================== + +* Fixed compatibility issues for Ruby 1.9, 2.0, 2.1. (@vivekbisen, #80) + +1.7.2 / 2016-09-09 +================== + +* Fix packing table to a minimal width (@vizv, #76) + +1.7.1 / 2016-08-29 +================== + +* Update `unicode-display_width` to fix behavior with signal traps [#78, @jrmhaig] + +1.7.0 / 2016-08-29 +================== + +All props to @vizv for this release! + + * Fixed some spec failures + * Added support for full-width characters (East Asian alphabets, etc) + +1.6.0 / 2016-06-06 +================== + + * Added table styles - margin_left, all_separators. + +1.4.3 / 2011-10-13 +================== + + * Optimize for faster table output. + +1.4.2 / 2010-01-14 +================== + + * Fixed some bugs with colspan + +=== 1.4.1 / 2009-12-18 + +* Fix column alignment with separators. + +=== 1.4.0 / 2009-12-18 + +* Can now add :seperator arbitrarily in a table [thanks splattael] +* Fix common typo: seperator -> separator [thanks splattael] + +=== 1.3.0 / 2009-10-16 + +* Major refactoring (functionality remains the same) + +=== 1.2.0 / 2009-08-06 + +* Added colspan support to table + +=== 1.1.0 / 2009-08-06 + +* Added colspan support to table + +=== 1.1.0 / 2009-07-13 + +* Added Table#== + +=== 1.0.5 / 2009-03-14 + +* Allowing nil to be passed to table for headings +* Revised doc to show that rows can be splatted now +* Misc refactoring + +=== 1.0.3 / 2009-01-15 + +* Moved yield or eval to Terminal::Table initialize where it belongs + +=== 1.0.0 / 2009-01-13 + +* Initial release diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/LICENSE.txt new file mode 100644 index 000000000000..e888cec5d85d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2008-2017 TJ Holowaychuk <tj@vision-media.ca> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Manifest b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Manifest new file mode 100644 index 000000000000..3cc314071935 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Manifest @@ -0,0 +1,27 @@ +Gemfile +History.rdoc +README.rdoc +Rakefile +Todo.rdoc +examples/examples.rb +lib/terminal-table.rb +lib/terminal-table/cell.rb +lib/terminal-table/import.rb +lib/terminal-table/row.rb +lib/terminal-table/separator.rb +lib/terminal-table/style.rb +lib/terminal-table/table.rb +lib/terminal-table/table_helper.rb +lib/terminal-table/version.rb +spec/cell_spec.rb +spec/row_spec.rb +spec/spec_helper.rb +spec/table_helper_spec.rb +spec/table_spec.rb +tasks/docs.rake +tasks/gemspec.rake +tasks/spec.rake +terminal-table.gemspec +terminal-table.sublime-project +terminal-table.sublime-workspace +Manifest diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/README.rdoc b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/README.rdoc new file mode 100644 index 000000000000..6926ea06ff6f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/README.rdoc @@ -0,0 +1,247 @@ += Terminal Table + +== Description + +Terminal Table is a fast and simple, yet feature rich ASCII table generator written in Ruby. + +== Installation + + $ gem install terminal-table + +== Usage + +=== Basics + +To use Terminal Table: + + require 'terminal-table' + +To generate a table, provide an array of arrays (which are interpreted as rows): + + rows = [] + rows << ['One', 1] + rows << ['Two', 2] + rows << ['Three', 3] + table = Terminal::Table.new :rows => rows + + # > puts table + # + # +-------+---+ + # | One | 1 | + # | Two | 2 | + # | Three | 3 | + # +-------+---+ + + +The constructor can also be given a block which is either yielded the Table object or instance evaluated: + + table = Terminal::Table.new do |t| + t.rows = rows + end + + table = Terminal::Table.new do + self.rows = rows + end + +Adding rows one by one: + + table = Terminal::Table.new do |t| + t << ['One', 1] + t.add_row ['Two', 2] + end + +To add separators between rows: + + table = Terminal::Table.new do |t| + t << ['One', 1] + t << :separator + t.add_row ['Two', 2] + t.add_separator + t.add_row ['Three', 3] + end + + # > puts table + # + # +-------+---+ + # | One | 1 | + # +-------+---+ + # | Two | 2 | + # +-------+---+ + # | Three | 3 | + # +-------+---+ + +Cells can handle multiline content: + + table = Terminal::Table.new do |t| + t << ['One', 1] + t << :separator + t.add_row ["Two\nDouble", 2] + t.add_separator + t.add_row ['Three', 3] + end + + # > puts table + # + # +--------+---+ + # | One | 1 | + # +--------+---+ + # | Two | 2 | + # | Double | | + # +--------+---+ + # | Three | 3 | + # +--------+---+ + +=== Head + +To add a head to the table: + + table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows + + # > puts table + # + # +-------+--------+ + # | Word | Number | + # +-------+--------+ + # | One | 1 | + # | Two | 2 | + # | Three | 3 | + # +-------+--------+ + +=== Title + +To add a title to the table: + + table = Terminal::Table.new :title => "Cheatsheet", :headings => ['Word', 'Number'], :rows => rows + + # > puts table + # + # +------------+--------+ + # | Cheatsheet | + # +------------+--------+ + # | Word | Number | + # +------------+--------+ + # | One | 1 | + # | Two | 2 | + # | Three | 3 | + # +------------+--------+ + +=== Alignment + +To align the second column to the right: + + table.align_column(1, :right) + + # > puts table + # + # +-------+--------+ + # | Word | Number | + # +-------+--------+ + # | One | 1 | + # | Two | 2 | + # | Three | 3 | + # +-------+--------+ + +To align an individual cell, you specify the cell value in a hash along the alignment: + + table << ["Four", {:value => 4.0, :alignment => :center}] + + # > puts table + # + # +-------+--------+ + # | Word | Number | + # +-------+--------+ + # | One | 1 | + # | Two | 2 | + # | Three | 3 | + # | Four | 4.0 | + # +-------+--------+ + +=== Style + +To specify style options: + + table = Terminal::Table.new :headings => ['Word', 'Number'], :rows => rows, :style => {:width => 80} + + # > puts table + # + # +--------------------------------------+---------------------------------------+ + # | Word | Number | + # +--------------------------------------+---------------------------------------+ + # | One | 1 | + # | Two | 2 | + # | Three | 3 | + # +--------------------------------------+---------------------------------------+ + +And change styles on the fly: + + table.style = {:width => 40, :padding_left => 3, :border_x => "=", :border_i => "x"} + + # > puts table + # + # x====================x=================x + # | Cheatsheet | + # x====================x=================x + # | Word | Number | + # x====================x=================x + # | One | 1 | + # | Two | 2 | + # | Three | 3 | + # x====================x=================x + +You can also use styles to add a separator after every row: + + table = Terminal::Table.new do |t| + t.add_row [1, 'One'] + t.add_row [2, 'Two'] + t.add_row [3, 'Three'] + t.style = {:all_separators => true} + end + + # > puts table + # + # +---+-------+ + # | 1 | One | + # +---+-------+ + # | 2 | Two | + # +---+-------+ + # | 3 | Three | + # +---+-------+ + +You can also use styles to disable top and bottom borders of the table + + table = Terminal::Table.new do |t| + t.headings = ['id', 'name'] + t.rows = [[1, 'One'], [2, 'Two'], [3, 'Three']] + t.style = { :border_top => false, :border_bottom => false } + end + + # > puts table + # | id | name | + # +----+-------+ + # | 1 | One | + # | 2 | Two | + # | 3 | Three | + +To change the default style options: + + Terminal::Table::Style.defaults = {:width => 80} + +All Table objects created afterwards will inherit these defaults. + +=== Constructor options and setter methods + +Valid options for the constructor are :rows, :headings, :style and :title - and all options can also be set on the created table object by their setter method: + + table = Terminal::Table.new + table.title = "Cheatsheet" + table.headings = ['Word', 'Number'] + table.rows = rows + table.style = {:width => 40} + +== More examples + +For more examples, please see the examples/examples.rb file included in the source distribution. + +== Author + +TJ Holowaychuk <tj@vision-media.ca> diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Rakefile new file mode 100644 index 000000000000..609f86960008 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Rakefile @@ -0,0 +1,15 @@ +require 'bundler' +Bundler.setup +Bundler::GemHelper.install_tasks + +require 'rake' +require 'rspec/core/rake_task' + +desc "Run all examples" +RSpec::Core::RakeTask.new(:spec) do |t| + t.ruby_opts = %w[-w] + t.rspec_opts = %w[--color] +end + +desc "Default: Run specs" +task :default => [:spec] diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Todo.rdoc b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Todo.rdoc new file mode 100644 index 000000000000..071b20227aae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/Todo.rdoc @@ -0,0 +1,14 @@ + +== Major: + +* Nothing + +== Minor: + +* Programmatically add separator rows +* Add multi-column sorting +* Change; pre-create Cell and Heading objects to clean up Table a bit + +== Brainstorming: + +* Nothing \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/examples/examples.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/examples/examples.rb new file mode 100644 index 000000000000..ebf689362511 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/examples/examples.rb @@ -0,0 +1,83 @@ +$:.unshift File.dirname(__FILE__) + '/../lib' +require 'terminal-table/import' + +puts +puts table(['a', 'b'], [1, 2], [3, 4]) + +puts +puts table(['name', 'content'], ['ftp.example.com', '1.1.1.1'], ['www.example.com', '|lalalala|lalala|']) + +puts +t = table ['a', 'b'] +t.style = {:padding_left => 2, :width => 80} +t << [1, 2] +t << [3, 4] +t << :separator +t << [4, 6] +puts t + +puts +user_table = table do |v| + v.title = "Contact Information" + v.headings = 'First Name', 'Last Name', 'Email' + v << %w( TJ Holowaychuk tj@vision-media.ca ) + v << %w( Bob Someone bob@vision-media.ca ) + v << %w( Joe Whatever bob@vision-media.ca ) +end +puts user_table + +puts +user_table = table do |v| + v.style.width = 80 + v.headings = 'First Name', 'Last Name', 'Email' + v << %w( TJ Holowaychuk tj@vision-media.ca ) + v << %w( Bob Someone bob@vision-media.ca ) + v << %w( Joe Whatever bob@vision-media.ca ) +end +puts user_table + +puts +user_table = table do + self.headings = 'First Name', 'Last Name', 'Email' + add_row ['TJ', 'Holowaychuk', 'tj@vision-media.ca'] + add_row ['Bob', 'Someone', 'bob@vision-media.ca'] + add_row ['Joe', 'Whatever', 'joe@vision-media.ca'] + add_separator + add_row ['Total', { :value => '3', :colspan => 2, :alignment => :right }] + align_column 1, :center +end +puts user_table + +puts +user_table = table do + self.headings = ['First Name', 'Last Name', {:value => 'Phones', :colspan => 2, :alignment => :center}] + add_row ['Bob', 'Someone', '123', '456'] + add_row :separator + add_row ['TJ', 'Holowaychuk', {:value => "No phones\navaiable", :colspan => 2, :alignment => :center}] + add_row :separator + add_row ['Joe', 'Whatever', '4324', '343242'] +end +puts user_table + +rows = [] +rows << ['Lines', 100] +rows << ['Comments', 20] +rows << ['Ruby', 70] +rows << ['JavaScript', 30] +puts table([nil, 'Lines'], *rows) + +rows = [] +rows << ['Lines', 100] +rows << ['Comments', 20] +rows << ['Ruby', 70] +rows << ['JavaScript', 30] +puts table(nil, *rows) + +rows = [] +rows << ['Lines', 100] +rows << ['Comments', 20] +rows << ['Ruby', 70] +rows << ['JavaScript', 30] +table = table([{ :value => 'Stats', :colspan => 2, :alignment => :center }], *rows) +table.align_column 1, :right +puts table diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table.rb new file mode 100644 index 000000000000..c8238e19e2e8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table.rb @@ -0,0 +1,26 @@ +#-- +# Copyright (c) 2008-2009 TJ Holowaychuk <tj@vision-media.ca> +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +#++ + +%w(cell row separator style table table_helper version).each do |file| + require "terminal-table/#{file}" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/cell.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/cell.rb new file mode 100644 index 000000000000..0ac9b06917b8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/cell.rb @@ -0,0 +1,94 @@ +require 'unicode/display_width' + +module Terminal + class Table + class Cell + ## + # Cell value. + + attr_reader :value + + ## + # Column span. + + attr_reader :colspan + + ## + # Initialize with _options_. + + def initialize options = nil + @value, options = options, {} unless Hash === options + @value = options.fetch :value, value + @alignment = options.fetch :alignment, nil + @colspan = options.fetch :colspan, 1 + @width = options.fetch :width, @value.to_s.size + @index = options.fetch :index + @table = options.fetch :table + end + + def alignment? + !@alignment.nil? + end + + def alignment + @alignment || @table.style.alignment || :left + end + + def alignment=(val) + supported = %w(left center right) + if supported.include?(val.to_s) + @alignment = val + else + raise "Aligment must be one of: #{supported.join(' ')}" + end + end + + def align(val, position, length) + positions = { :left => :ljust, :right => :rjust, :center => :center } + val.public_send(positions[position], length) + end + def lines + @value.to_s.split(/\n/) + end + + ## + # Render the cell. + + def render(line = 0) + left = " " * @table.style.padding_left + right = " " * @table.style.padding_right + display_width = Unicode::DisplayWidth.of(escape(lines[line])) + render_width = lines[line].to_s.size - display_width + width + align("#{left}#{lines[line]}#{right}", alignment, render_width + @table.cell_padding) + end + alias :to_s :render + + ## + # Returns the longest line in the cell and + # removes all ANSI escape sequences (e.g. color) + + def value_for_column_width_recalc + lines.map{ |s| escape(s) }.max_by{ |s| Unicode::DisplayWidth.of(s) } + end + + ## + # Returns the width of this cell + + def width + padding = (colspan - 1) * @table.cell_spacing + inner_width = (1..@colspan).to_a.inject(0) do |w, counter| + w + @table.column_width(@index + counter - 1) + end + inner_width + padding + end + + ## + # removes all ANSI escape sequences (e.g. color) + def escape(line) + line.to_s.gsub(/\x1b(\[|\(|\))[;?0-9]*[0-9A-Za-z]/, ''). + gsub(/\x1b(\[|\(|\))[;?0-9]*[0-9A-Za-z]/, ''). + gsub(/(\x03|\x1a)/, '') + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/import.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/import.rb new file mode 100644 index 000000000000..33b2791f558e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/import.rb @@ -0,0 +1,3 @@ +require 'terminal-table' #required as some people require this file directly from their Gemfiles + +include Terminal::Table::TableHelper diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/row.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/row.rb new file mode 100644 index 000000000000..73dc5897e227 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/row.rb @@ -0,0 +1,52 @@ +module Terminal + class Table + class Row + + ## + # Row cells + + attr_reader :cells + + attr_reader :table + + ## + # Initialize with _width_ and _options_. + + def initialize table, array = [] + @cell_index = 0 + @table = table + @cells = [] + array.each { |item| self << item } + end + + def add_cell item + options = item.is_a?(Hash) ? item : {:value => item} + cell = Cell.new(options.merge(:index => @cell_index, :table => @table)) + @cell_index += cell.colspan + @cells << cell + end + alias << add_cell + + def [] index + cells[index] + end + + def height + cells.map { |c| c.lines.count }.max || 0 + end + + def render + y = @table.style.border_y + (0...height).to_a.map do |line| + y + cells.map do |cell| + cell.render(line) + end.join(y) + y + end.join("\n") + end + + def number_of_columns + @cells.collect(&:colspan).inject(0, &:+) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/separator.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/separator.rb new file mode 100644 index 000000000000..f09c2f72ed88 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/separator.rb @@ -0,0 +1,14 @@ +module Terminal + class Table + class Separator < Row + + def render + arr_x = (0...@table.number_of_columns).to_a.map do |i| + @table.style.border_x * (@table.column_width(i) + @table.cell_padding) + end + border_i = @table.style.border_i + border_i + arr_x.join(border_i) + border_i + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/style.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/style.rb new file mode 100644 index 000000000000..315b0763c2d9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/style.rb @@ -0,0 +1,79 @@ +module Terminal + class Table + # A Style object holds all the formatting information for a Table object + # + # To create a table with a certain style, use either the constructor + # option <tt>:style</tt>, the Table#style object or the Table#style= method + # + # All these examples have the same effect: + # + # # by constructor + # @table = Table.new(:style => {:padding_left => 2, :width => 40}) + # + # # by object + # @table.style.padding_left = 2 + # @table.style.width = 40 + # + # # by method + # @table.style = {:padding_left => 2, :width => 40} + # + # To set a default style for all tables created afterwards use Style.defaults= + # + # Terminal::Table::Style.defaults = {:width => 80} + # + class Style + @@defaults = { + :border_x => "-", :border_y => "|", :border_i => "+", + :border_top => true, :border_bottom => true, + :padding_left => 1, :padding_right => 1, + :margin_left => '', + :width => nil, :alignment => nil, + :all_separators => false + } + + attr_accessor :border_x + attr_accessor :border_y + attr_accessor :border_i + attr_accessor :border_top + attr_accessor :border_bottom + + attr_accessor :padding_left + attr_accessor :padding_right + + attr_accessor :margin_left + + attr_accessor :width + attr_accessor :alignment + + attr_accessor :all_separators + + + def initialize options = {} + apply self.class.defaults.merge(options) + end + + def apply options + options.each { |m, v| __send__ "#{m}=", v } + end + + class << self + def defaults + @@defaults + end + + def defaults= options + @@defaults = defaults.merge(options) + end + end + + def on_change attr + method_name = :"#{attr}=" + old_method = method method_name + define_singleton_method(method_name) do |value| + old_method.call value + yield attr.to_sym, value + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/table.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/table.rb new file mode 100644 index 000000000000..d2d8e1b5944d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/table.rb @@ -0,0 +1,343 @@ +require 'unicode/display_width' + +module Terminal + class Table + + attr_reader :title + attr_reader :headings + + ## + # Generates a ASCII table with the given _options_. + + def initialize options = {}, &block + @headings = [] + @rows = [] + @column_widths = [] + self.style = options.fetch :style, {} + self.headings = options.fetch :headings, [] + self.rows = options.fetch :rows, [] + self.title = options.fetch :title, nil + yield_or_eval(&block) if block + + style.on_change(:width) { require_column_widths_recalc } + end + + ## + # Align column _n_ to the given _alignment_ of :center, :left, or :right. + + def align_column n, alignment + r = rows + column(n).each_with_index do |col, i| + cell = r[i][n] + cell.alignment = alignment unless cell.alignment? + end + end + + ## + # Add a row. + + def add_row array + row = array == :separator ? Separator.new(self) : Row.new(self, array) + @rows << row + require_column_widths_recalc unless row.is_a?(Separator) + end + alias :<< :add_row + + ## + # Add a separator. + + def add_separator + self << :separator + end + + def cell_spacing + cell_padding + style.border_y.length + end + + def cell_padding + style.padding_left + style.padding_right + end + + ## + # Return column _n_. + + def column n, method = :value, array = rows + array.map { |row| + # for each cells in a row, find the column with index + # just greater than the required one, and go back one. + index = col = 0 + row.cells.each do |cell| + break if index > n + index += cell.colspan + col += 1 + end + cell = row[col - 1] + cell && method ? cell.__send__(method) : cell + }.compact + end + + ## + # Return _n_ column including headings. + + def column_with_headings n, method = :value + column n, method, headings_with_rows + end + + ## + # Return columns. + + def columns + (0...number_of_columns).map { |n| column n } + end + + ## + # Return length of column _n_. + + def column_width n + column_widths[n] || 0 + end + alias length_of_column column_width # for legacy support + + ## + # Return total number of columns available. + + def number_of_columns + headings_with_rows.map { |r| r.number_of_columns }.max || 0 + end + + ## + # Set the headings + + def headings= arrays + arrays = [arrays] unless arrays.first.is_a?(Array) + @headings = arrays.map do |array| + row = Row.new(self, array) + require_column_widths_recalc + row + end + end + + ## + # Render the table. + + def render + separator = Separator.new(self) + buffer = style.border_top ? [separator] : [] + unless @title.nil? + buffer << Row.new(self, [title_cell_options]) + buffer << separator + end + @headings.each do |row| + unless row.cells.empty? + buffer << row + buffer << separator + end + end + if style.all_separators + buffer += @rows.product([separator]).flatten + else + buffer += @rows + buffer << separator if style.border_bottom + end + buffer.map { |r| style.margin_left + r.render.rstrip }.join("\n") + end + alias :to_s :render + + ## + # Return rows without separator rows. + + def rows + @rows.reject { |row| row.is_a? Separator } + end + + def rows= array + @rows = [] + array.each { |arr| self << arr } + end + + def style=(options) + style.apply options + end + + def style + @style ||= Style.new + end + + def title=(title) + @title = title + require_column_widths_recalc + end + + ## + # Check if _other_ is equal to self. _other_ is considered equal + # if it contains the same headings and rows. + + def == other + if other.respond_to? :render and other.respond_to? :rows + self.headings == other.headings and self.rows == other.rows + end + end + + private + + def columns_width + column_widths.inject(0) { |s, i| s + i + cell_spacing } + style.border_y.length + end + + def recalc_column_widths + @require_column_widths_recalc = false + n_cols = number_of_columns + space_width = cell_spacing + return if n_cols == 0 + + # prepare rows + all_rows = headings_with_rows + all_rows << Row.new(self, [title_cell_options]) unless @title.nil? + + # DP states, dp[colspan][index][split_offset] => column_width. + dp = [] + + # prepare initial value for DP. + all_rows.each do |row| + index = 0 + row.cells.each do |cell| + cell_value = cell.value_for_column_width_recalc + cell_width = Unicode::DisplayWidth.of(cell_value.to_s) + colspan = cell.colspan + + # find column width from each single cell. + dp[colspan] ||= [] + dp[colspan][index] ||= [0] # add a fake cell with length 0. + dp[colspan][index][colspan] ||= 0 # initialize column length to 0. + + # the last index `colspan` means width of the single column (split + # at end of each column), not a width made up of multiple columns. + single_column_length = [cell_width, dp[colspan][index][colspan]].max + dp[colspan][index][colspan] = single_column_length + + index += colspan + end + end + + # run DP. + (1..n_cols).each do |colspan| + dp[colspan] ||= [] + (0..n_cols-colspan).each do |index| + dp[colspan][index] ||= [1] + (1...colspan).each do |offset| + # processed level became reverse map from width => [offset, ...]. + left_colspan = offset + left_index = index + left_width = dp[left_colspan][left_index].keys.first + + right_colspan = colspan - left_colspan + right_index = index + offset + right_width = dp[right_colspan][right_index].keys.first + + dp[colspan][index][offset] = left_width + right_width + space_width + end + + # reverse map it for resolution (max width and short offset first). + rmap = {} + dp[colspan][index].each_with_index do |width, offset| + rmap[width] ||= [] + rmap[width] << offset + end + + # sort reversely and store it back. + dp[colspan][index] = Hash[rmap.sort.reverse] + end + end + + resolve = lambda do |colspan, full_width, index = 0| + # stop if reaches the bottom level. + return @column_widths[index] = full_width if colspan == 1 + + # choose best split offset for partition, or second best result + # if first one is not dividable. + candidate_offsets = dp[colspan][index].collect(&:last).flatten + offset = candidate_offsets[0] + offset = candidate_offsets[1] if offset == colspan + + # prepare for next round. + left_colspan = offset + left_index = index + left_width = dp[left_colspan][left_index].keys.first + + right_colspan = colspan - left_colspan + right_index = index + offset + right_width = dp[right_colspan][right_index].keys.first + + # calculate reference column width, give remaining spaces to left. + total_non_space_width = full_width - (colspan - 1) * space_width + ref_column_width = total_non_space_width / colspan + remainder = total_non_space_width % colspan + rem_left_width = [remainder, left_colspan].min + rem_right_width = remainder - rem_left_width + ref_left_width = ref_column_width * left_colspan + + (left_colspan - 1) * space_width + rem_left_width + ref_right_width = ref_column_width * right_colspan + + (right_colspan - 1) * space_width + rem_right_width + + # at most one width can be greater than the reference width. + if left_width <= ref_left_width and right_width <= ref_right_width + # use refernce width (evenly partition). + left_width = ref_left_width + right_width = ref_right_width + else + # the wider one takes its value, shorter one takes the rest. + if left_width > ref_left_width + right_width = full_width - left_width - space_width + else + left_width = full_width - right_width - space_width + end + end + + # run next round. + resolve.call(left_colspan, left_width, left_index) + resolve.call(right_colspan, right_width, right_index) + end + + full_width = dp[n_cols][0].keys.first + unless style.width.nil? + new_width = style.width - space_width - style.border_y.length + if new_width < full_width + raise "Table width exceeds wanted width " + + "of #{style.width} characters." + end + full_width = new_width + end + + resolve.call(n_cols, full_width) + end + + ## + # Return headings combined with rows. + + def headings_with_rows + @headings + rows + end + + def yield_or_eval &block + return unless block + if block.arity > 0 + yield self + else + self.instance_eval(&block) + end + end + + def title_cell_options + {:value => @title, :alignment => :center, :colspan => number_of_columns} + end + + def require_column_widths_recalc + @require_column_widths_recalc = true + end + + def column_widths + recalc_column_widths if @require_column_widths_recalc + @column_widths + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/table_helper.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/table_helper.rb new file mode 100644 index 000000000000..5a853259c024 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/table_helper.rb @@ -0,0 +1,9 @@ +module Terminal + class Table + module TableHelper + def table headings = [], *rows, &block + Terminal::Table.new :headings => headings.to_a, :rows => rows, &block + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/version.rb b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/version.rb new file mode 100644 index 000000000000..ea559139d686 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/lib/terminal-table/version.rb @@ -0,0 +1,5 @@ +module Terminal + class Table + VERSION = '1.8.0' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/terminal-table.gemspec b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/terminal-table.gemspec new file mode 100644 index 000000000000..077555528f77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/terminal-table-1.8.0/terminal-table.gemspec @@ -0,0 +1,26 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'terminal-table/version' + +Gem::Specification.new do |spec| + spec.name = "terminal-table" + spec.version = Terminal::Table::VERSION + spec.authors = ["TJ Holowaychuk", "Scott J. Goldman"] + spec.email = ["tj@vision-media.ca"] + + spec.summary = "Simple, feature rich ascii table generation library" + spec.homepage = "https://github.com/tj/terminal-table" + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + spec.require_paths = ["lib"] + + spec.add_development_dependency "bundler", "~> 1.10" + spec.add_development_dependency "rake", "~> 10.0" + spec.add_development_dependency "rspec", ">= 3.0" + spec.add_development_dependency "term-ansicolor" + spec.add_development_dependency "pry" + + spec.add_runtime_dependency "unicode-display_width", ["~> 1.1", ">= 1.1.1"] +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/.rspec b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/.rspec new file mode 100644 index 000000000000..20f9c857485c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/.rspec @@ -0,0 +1,2 @@ +--require spec_helper +--format progress diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/.travis.yml new file mode 100644 index 000000000000..5137aefcec29 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/.travis.yml @@ -0,0 +1,46 @@ +dist: trusty +sudo: required +language: ruby +rvm: + - 2.4.0 + - 2.3.3 + - 2.2.6 + - 2.1.9 + - 2.0.0 + - 1.9.3 + - ruby-head + - jruby-9.1.5.0 + - jruby-1.7.26 + - jruby-head + - rubinius-3 + - rubinius-2 +jdk: + - openjdk7 + - oraclejdk8 +matrix: + exclude: + - rvm: 2.4.0 + jdk: oraclejdk8 + - rvm: 2.3.3 + jdk: oraclejdk8 + - rvm: 2.2.6 + jdk: oraclejdk8 + - rvm: 2.1.9 + jdk: oraclejdk8 + - rvm: 2.0.0 + jdk: oraclejdk8 + - rvm: 1.9.3 + jdk: oraclejdk8 + - rvm: ruby-head + jdk: oraclejdk8 + - rvm: rubinius-3 + jdk: oraclejdk8 + - rvm: rubinius-2 + jdk: oraclejdk8 + allow_failures: + - rvm: 1.9.3 + - rvm: ruby-head + - rvm: jruby-1.7.26 + - rvm: jruby-head + - rvm: rubinius-2 +script: "bundle exec rake test" diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/.yardopts b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/.yardopts new file mode 100644 index 000000000000..ee7982a243b5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/.yardopts @@ -0,0 +1,13 @@ +--protected +--no-private +--embed-mixins +--output-dir ./yardoc +--markup markdown +--title=Concurrent Ruby +--template default +--template-path ./yard-template + +./lib/**/*.rb +- +README.md +LICENSE diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/Gemfile b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/Gemfile new file mode 100644 index 000000000000..d73c1f6aac84 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/Gemfile @@ -0,0 +1,20 @@ +source 'https://rubygems.org' + +gemspec + +group :development, :test do + gem 'rspec', '~> 3.2.0' + gem 'simplecov', '~> 0.9.2', :require => false + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.0.0') + gem 'term-ansicolor', '~> 1.3.2', :require => false + gem 'tins', '~> 1.6.0', :require => false + end + gem 'coveralls', '~> 0.7.11', :require => false +end + +group :documentation do + gem 'countloc', '~> 0.4.0', :platforms => :mri, :require => false + gem 'yard', '~> 0.8.7.6', :require => false + gem 'inch', '~> 0.5.10', :platforms => :mri, :require => false + gem 'redcarpet', '~> 3.2.2', platforms: :mri # understands github markdown +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/LICENSE b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/LICENSE new file mode 100644 index 000000000000..533671897f3f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/LICENSE @@ -0,0 +1,144 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as +defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that +is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that +control, are controlled by, or are under common control with that entity. For the purposes +of this definition, "control" means (i) the power, direct or indirect, to cause the +direction or management of such entity, whether by contract or otherwise, or (ii) ownership +of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by +this License. + +"Source" form shall mean the preferred form for making modifications, including but not +limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of +a Source form, including but not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available +under the License, as indicated by a copyright notice that is included in or attached to the +work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on +(or derived from) the Work and for which the editorial revisions, annotations, elaborations, +or other modifications represent, as a whole, an original work of authorship. For the +purposes of this License, Derivative Works shall not include works that remain separable +from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works +thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work +and any modifications or additions to that Work or Derivative Works thereof, that is +intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by +an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the +purposes of this definition, "submitted" means any form of electronic, verbal, or written +communication sent to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and issue tracking +systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and +improving the Work, but excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a +Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each +Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, +royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such Derivative +Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each +Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, +royalty-free, irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license +applies only to those patent claims licensable by such Contributor that are necessarily +infringed by their Contribution(s) alone or by combination of their Contribution(s) with the +Work to which such Contribution(s) was submitted. If You institute patent litigation against +any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or +a Contribution incorporated within the Work constitutes direct or contributory patent +infringement, then any patent licenses granted to You under this License for that Work shall +terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works +thereof in any medium, with or without modifications, and in Source or Object form, provided +that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; +and + +You must cause any modified files to carry prominent notices stating that You changed the +files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all +copyright, patent, trademark, and attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative +Works that You distribute must include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not pertain to any part of the +Derivative Works, in at least one of the following places: within a NOTICE text file +distributed as part of the Derivative Works; within the Source form or documentation, if +provided along with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of the NOTICE +file are for informational purposes only and do not modify the License. You may add Your own +attribution notices within Derivative Works that You distribute, alongside or as an addendum +to the NOTICE text from the Work, provided that such additional attribution notices cannot +be construed as modifying the License. You may add Your own copyright statement to Your +modifications and may provide additional or different license terms and conditions for use, +reproduction, or distribution of Your modifications, or for any such Derivative Works as a +whole, provided Your use, reproduction, and distribution of the Work otherwise complies with +the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution +intentionally submitted for inclusion in the Work by You to the Licensor shall be under the +terms and conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of any +separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for reasonable and +customary use in describing the origin of the Work and reproducing the content of the NOTICE +file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, +Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, +without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, +MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for +determining the appropriateness of using or redistributing the Work and assume any risks +associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort +(including negligence), contract, or otherwise, unless required by applicable law (such as +deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, or +consequential damages of any character arising as a result of this License or out of the use +or inability to use the Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all other commercial damages or +losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative +Works thereof, You may choose to offer, and charge a fee for, acceptance of support, +warranty, indemnity, or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only on Your own behalf and on +Your sole responsibility, not on behalf of any other Contributor, and only if You agree to +indemnify, defend, and hold each Contributor harmless for any liability incurred by, or +claims asserted against, such Contributor by reason of your accepting any such warranty or +additional liability. + +END OF TERMS AND CONDITIONS diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/README.md b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/README.md new file mode 100644 index 000000000000..535a7915ab1b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/README.md @@ -0,0 +1,60 @@ +# Threadsafe (Inactive, code moved to concurrent-ruby gem and repo.) + +[![Gem Version](https://badge.fury.io/rb/thread_safe.svg)](http://badge.fury.io/rb/thread_safe) [![Build Status](https://travis-ci.org/ruby-concurrency/thread_safe.svg?branch=master)](https://travis-ci.org/ruby-concurrency/thread_safe) [![Coverage Status](https://img.shields.io/coveralls/ruby-concurrency/thread_safe/master.svg)](https://coveralls.io/r/ruby-concurrency/thread_safe) [![Code Climate](https://codeclimate.com/github/ruby-concurrency/thread_safe.svg)](https://codeclimate.com/github/ruby-concurrency/thread_safe) [![Dependency Status](https://gemnasium.com/ruby-concurrency/thread_safe.svg)](https://gemnasium.com/ruby-concurrency/thread_safe) [![License](https://img.shields.io/badge/license-apache-green.svg)](http://opensource.org/licenses/MIT) [![Gitter chat](http://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/ruby-concurrency/concurrent-ruby) + +A collection of thread-safe versions of common core Ruby classes. + +__This code base is now part of the concurrent-ruby gem +at https://github.com/ruby-concurrency/concurrent-ruby. +The code in this repository is no longer maintained.__ + +## Installation + +Add this line to your application's Gemfile: + + gem 'thread_safe' + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install thread_safe + +## Usage + +```ruby +require 'thread_safe' + +sa = ThreadSafe::Array.new # supports standard Array.new forms +sh = ThreadSafe::Hash.new # supports standard Hash.new forms +``` + +`ThreadSafe::Cache` also exists, as a hash-like object, and should have +much better performance characteristics esp. under high concurrency than +`ThreadSafe::Hash`. However, `ThreadSafe::Cache` is not strictly semantically +equivalent to a ruby `Hash` -- for instance, it does not necessarily retain +ordering by insertion time as `Hash` does. For most uses it should do fine +though, and we recommend you consider `ThreadSafe::Cache` instead of +`ThreadSafe::Hash` for your concurrency-safe hash needs. It understands some +options when created (depending on your ruby platform) that control some of the +internals - when unsure just leave them out: + + +```ruby +require 'thread_safe' + +cache = ThreadSafe::Cache.new +``` + +## Contributing + +1. Fork it +2. Clone it (`git clone git@github.com:you/thread_safe.git`) +3. Create your feature branch (`git checkout -b my-new-feature`) +4. Build the jar (`rake jar`) NOTE: Requires JRuby +5. Install dependencies (`bundle install`) +6. Commit your changes (`git commit -am 'Added some feature'`) +7. Push to the branch (`git push origin my-new-feature`) +8. Create new Pull Request diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/Rakefile b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/Rakefile new file mode 100644 index 000000000000..3559a9807e00 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/Rakefile @@ -0,0 +1,62 @@ +require 'bundler/gem_tasks' +require 'rspec' +require 'rspec/core/rake_task' + +## safely load all the rake tasks in the `tasks` directory +def safe_load(file) + begin + load file + rescue LoadError => ex + puts "Error loading rake tasks from '#{file}' but will continue..." + puts ex.message + end +end + +Dir.glob('tasks/**/*.rake').each do |rakefile| + safe_load rakefile +end + +task :default => :test + +if defined?(JRUBY_VERSION) + require 'ant' + + directory 'pkg/classes' + directory 'pkg/tests' + + desc "Clean up build artifacts" + task :clean do + rm_rf "pkg/classes" + rm_rf "pkg/tests" + rm_rf "lib/thread_safe/jruby_cache_backend.jar" + end + + desc "Compile the extension" + task :compile => "pkg/classes" do |t| + ant.javac :srcdir => "ext", :destdir => t.prerequisites.first, + :source => "1.5", :target => "1.5", :debug => true, + :classpath => "${java.class.path}:${sun.boot.class.path}" + end + + desc "Build the jar" + task :jar => :compile do + ant.jar :basedir => "pkg/classes", :destfile => "lib/thread_safe/jruby_cache_backend.jar", :includes => "**/*.class" + end + + desc "Build test jar" + task 'test-jar' => 'pkg/tests' do |t| + ant.javac :srcdir => 'spec/src', :destdir => t.prerequisites.first, + :source => "1.5", :target => "1.5", :debug => true + + ant.jar :basedir => 'pkg/tests', :destfile => 'spec/package.jar', :includes => '**/*.class' + end + + task :package => [ :clean, :compile, :jar, 'test-jar' ] +else + # No need to package anything for non-jruby rubies + task :package +end + +RSpec::Core::RakeTask.new :test => :package do |t| + t.rspec_opts = '--color --backtrace --tag ~unfinished --seed 1 --format documentation ./spec' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/examples/bench_cache.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/examples/bench_cache.rb new file mode 100644 index 000000000000..14171c9b92c0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/examples/bench_cache.rb @@ -0,0 +1,35 @@ +#!/usr/bin/env ruby -wKU + +require "benchmark" +require "thread_safe" + +hash = {} +cache = ThreadSafe::Cache.new + +ENTRIES = 10_000 + +ENTRIES.times do |i| + hash[i] = i + cache[i] = i +end + +TESTS = 40_000_000 +Benchmark.bmbm do |results| + key = rand(10_000) + + results.report('Hash#[]') do + TESTS.times { hash[key] } + end + + results.report('Cache#[]') do + TESTS.times { cache[key] } + end + + results.report('Hash#each_pair') do + (TESTS / ENTRIES).times { hash.each_pair {|k,v| v} } + end + + results.report('Cache#each_pair') do + (TESTS / ENTRIES).times { cache.each_pair {|k,v| v} } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/JRubyCacheBackendLibrary.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/JRubyCacheBackendLibrary.java new file mode 100644 index 000000000000..97f9d3f0f2c8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/JRubyCacheBackendLibrary.java @@ -0,0 +1,245 @@ +package org.jruby.ext.thread_safe; + +import org.jruby.*; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.ext.thread_safe.jsr166e.ConcurrentHashMap; +import org.jruby.ext.thread_safe.jsr166e.ConcurrentHashMapV8; +import org.jruby.ext.thread_safe.jsr166e.nounsafe.*; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.Library; + +import java.io.IOException; +import java.util.Map; + +import static org.jruby.runtime.Visibility.PRIVATE; + +/** + * Native Java implementation to avoid the JI overhead. + * + * @author thedarkone + */ +public class JRubyCacheBackendLibrary implements Library { + public void load(Ruby runtime, boolean wrap) throws IOException { + RubyClass jrubyRefClass = runtime.defineClassUnder("JRubyCacheBackend", runtime.getObject(), BACKEND_ALLOCATOR, runtime.getModule("ThreadSafe")); + jrubyRefClass.setAllocator(BACKEND_ALLOCATOR); + jrubyRefClass.defineAnnotatedMethods(JRubyCacheBackend.class); + } + + private static final ObjectAllocator BACKEND_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klazz) { + return new JRubyCacheBackend(runtime, klazz); + } + }; + + @JRubyClass(name="JRubyCacheBackend", parent="Object") + public static class JRubyCacheBackend extends RubyObject { + // Defaults used by the CHM + static final int DEFAULT_INITIAL_CAPACITY = 16; + static final float DEFAULT_LOAD_FACTOR = 0.75f; + + public static final boolean CAN_USE_UNSAFE_CHM = canUseUnsafeCHM(); + + private ConcurrentHashMap<IRubyObject, IRubyObject> map; + + private static ConcurrentHashMap<IRubyObject, IRubyObject> newCHM(int initialCapacity, float loadFactor) { + if (CAN_USE_UNSAFE_CHM) { + return new ConcurrentHashMapV8<IRubyObject, IRubyObject>(initialCapacity, loadFactor); + } else { + return new org.jruby.ext.thread_safe.jsr166e.nounsafe.ConcurrentHashMapV8<IRubyObject, IRubyObject>(initialCapacity, loadFactor); + } + } + + private static ConcurrentHashMap<IRubyObject, IRubyObject> newCHM() { + return newCHM(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); + } + + private static boolean canUseUnsafeCHM() { + try { + new org.jruby.ext.thread_safe.jsr166e.ConcurrentHashMapV8(); // force class load and initialization + return true; + } catch (Throwable t) { // ensuring we really do catch everything + // Doug's Unsafe setup errors always have this "Could not ini.." message + if (isCausedBySecurityException(t)) { + return false; + } + throw (t instanceof RuntimeException ? (RuntimeException) t : new RuntimeException(t)); + } + } + + private static boolean isCausedBySecurityException(Throwable t) { + while (t != null) { + if ((t.getMessage() != null && t.getMessage().contains("Could not initialize intrinsics")) || t instanceof SecurityException) { + return true; + } + t = t.getCause(); + } + return false; + } + + public JRubyCacheBackend(Ruby runtime, RubyClass klass) { + super(runtime, klass); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context) { + map = newCHM(); + return context.getRuntime().getNil(); + } + + @JRubyMethod + public IRubyObject initialize(ThreadContext context, IRubyObject options) { + map = toCHM(context, options); + return context.getRuntime().getNil(); + } + + private ConcurrentHashMap<IRubyObject, IRubyObject> toCHM(ThreadContext context, IRubyObject options) { + Ruby runtime = context.getRuntime(); + if (!options.isNil() && options.respondsTo("[]")) { + IRubyObject rInitialCapacity = options.callMethod(context, "[]", runtime.newSymbol("initial_capacity")); + IRubyObject rLoadFactor = options.callMethod(context, "[]", runtime.newSymbol("load_factor")); + int initialCapacity = !rInitialCapacity.isNil() ? RubyNumeric.num2int(rInitialCapacity.convertToInteger()) : DEFAULT_INITIAL_CAPACITY; + float loadFactor = !rLoadFactor.isNil() ? (float)RubyNumeric.num2dbl(rLoadFactor.convertToFloat()) : DEFAULT_LOAD_FACTOR; + return newCHM(initialCapacity, loadFactor); + } else { + return newCHM(); + } + } + + @JRubyMethod(name = "[]", required = 1) + public IRubyObject op_aref(ThreadContext context, IRubyObject key) { + IRubyObject value; + return ((value = map.get(key)) == null) ? context.getRuntime().getNil() : value; + } + + @JRubyMethod(name = {"[]="}, required = 2) + public IRubyObject op_aset(IRubyObject key, IRubyObject value) { + map.put(key, value); + return value; + } + + @JRubyMethod + public IRubyObject put_if_absent(IRubyObject key, IRubyObject value) { + IRubyObject result = map.putIfAbsent(key, value); + return result == null ? getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject compute_if_absent(final ThreadContext context, final IRubyObject key, final Block block) { + return map.computeIfAbsent(key, new ConcurrentHashMap.Fun<IRubyObject, IRubyObject>() { + @Override + public IRubyObject apply(IRubyObject key) { + return block.yieldSpecific(context); + } + }); + } + + @JRubyMethod + public IRubyObject compute_if_present(final ThreadContext context, final IRubyObject key, final Block block) { + IRubyObject result = map.computeIfPresent(key, new ConcurrentHashMap.BiFun<IRubyObject, IRubyObject, IRubyObject>() { + @Override + public IRubyObject apply(IRubyObject key, IRubyObject oldValue) { + IRubyObject result = block.yieldSpecific(context, oldValue == null ? context.getRuntime().getNil() : oldValue); + return result.isNil() ? null : result; + } + }); + return result == null ? context.getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject compute(final ThreadContext context, final IRubyObject key, final Block block) { + IRubyObject result = map.compute(key, new ConcurrentHashMap.BiFun<IRubyObject, IRubyObject, IRubyObject>() { + @Override + public IRubyObject apply(IRubyObject key, IRubyObject oldValue) { + IRubyObject result = block.yieldSpecific(context, oldValue == null ? context.getRuntime().getNil() : oldValue); + return result.isNil() ? null : result; + } + }); + return result == null ? context.getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject merge_pair(final ThreadContext context, final IRubyObject key, final IRubyObject value, final Block block) { + IRubyObject result = map.merge(key, value, new ConcurrentHashMap.BiFun<IRubyObject, IRubyObject, IRubyObject>() { + @Override + public IRubyObject apply(IRubyObject oldValue, IRubyObject newValue) { + IRubyObject result = block.yieldSpecific(context, oldValue == null ? context.getRuntime().getNil() : oldValue); + return result.isNil() ? null : result; + } + }); + return result == null ? context.getRuntime().getNil() : result; + } + + @JRubyMethod + public RubyBoolean replace_pair(IRubyObject key, IRubyObject oldValue, IRubyObject newValue) { + return getRuntime().newBoolean(map.replace(key, oldValue, newValue)); + } + + @JRubyMethod(name = "key?", required = 1) + public RubyBoolean has_key_p(IRubyObject key) { + return map.containsKey(key) ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod + public IRubyObject key(IRubyObject value) { + final IRubyObject key = map.findKey(value); + return key == null ? getRuntime().getNil() : key; + } + + @JRubyMethod + public IRubyObject replace_if_exists(IRubyObject key, IRubyObject value) { + IRubyObject result = map.replace(key, value); + return result == null ? getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject get_and_set(IRubyObject key, IRubyObject value) { + IRubyObject result = map.put(key, value); + return result == null ? getRuntime().getNil() : result; + } + + @JRubyMethod + public IRubyObject delete(IRubyObject key) { + IRubyObject result = map.remove(key); + return result == null ? getRuntime().getNil() : result; + } + + @JRubyMethod + public RubyBoolean delete_pair(IRubyObject key, IRubyObject value) { + return getRuntime().newBoolean(map.remove(key, value)); + } + + @JRubyMethod + public IRubyObject clear() { + map.clear(); + return this; + } + + @JRubyMethod + public IRubyObject each_pair(ThreadContext context, Block block) { + for (Map.Entry<IRubyObject,IRubyObject> entry : map.entrySet()) { + block.yieldSpecific(context, entry.getKey(), entry.getValue()); + } + return this; + } + + @JRubyMethod + public RubyFixnum size(ThreadContext context) { + return context.getRuntime().newFixnum(map.size()); + } + + @JRubyMethod + public IRubyObject get_or_default(IRubyObject key, IRubyObject defaultValue) { + return map.getValueOrDefault(key, defaultValue); + } + + @JRubyMethod(visibility = PRIVATE) + public JRubyCacheBackend initialize_copy(ThreadContext context, IRubyObject other) { + map = newCHM(); + return this; + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/ConcurrentHashMap.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/ConcurrentHashMap.java new file mode 100644 index 000000000000..90ae1a2497fd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/ConcurrentHashMap.java @@ -0,0 +1,31 @@ +package org.jruby.ext.thread_safe.jsr166e; + +import java.util.Map; +import java.util.Set; + +public interface ConcurrentHashMap<K, V> { + /** Interface describing a function of one argument */ + public interface Fun<A,T> { T apply(A a); } + /** Interface describing a function of two arguments */ + public interface BiFun<A,B,T> { T apply(A a, B b); } + + public V get(K key); + public V put(K key, V value); + public V putIfAbsent(K key, V value); + public V computeIfAbsent(K key, Fun<? super K, ? extends V> mf); + public V computeIfPresent(K key, BiFun<? super K, ? super V, ? extends V> mf); + public V compute(K key, BiFun<? super K, ? super V, ? extends V> mf); + public V merge(K key, V value, BiFun<? super V, ? super V, ? extends V> mf); + public boolean replace(K key, V oldVal, V newVal); + public V replace(K key, V value); + public boolean containsKey(K key); + public boolean remove(Object key, Object value); + public V remove(K key); + public void clear(); + public Set<Map.Entry<K,V>> entrySet(); + public int size(); + public V getValueOrDefault(Object key, V defaultValue); + + public boolean containsValue(V value); + public K findKey(V value); +} diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/ConcurrentHashMapV8.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/ConcurrentHashMapV8.java new file mode 100644 index 000000000000..c85b98929707 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/ConcurrentHashMapV8.java @@ -0,0 +1,3863 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on the 1.79 version. + +package org.jruby.ext.thread_safe.jsr166e; + +import org.jruby.RubyClass; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.exceptions.RaiseException; +import org.jruby.ext.thread_safe.jsr166y.ThreadLocalRandom; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import java.util.Arrays; +import java.util.Map; +import java.util.Set; +import java.util.Collection; +import java.util.Hashtable; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Enumeration; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.locks.AbstractQueuedSynchronizer; + +import java.io.Serializable; + +/** + * A hash table supporting full concurrency of retrievals and + * high expected concurrency for updates. This class obeys the + * same functional specification as {@link java.util.Hashtable}, and + * includes versions of methods corresponding to each method of + * {@code Hashtable}. However, even though all operations are + * thread-safe, retrieval operations do <em>not</em> entail locking, + * and there is <em>not</em> any support for locking the entire table + * in a way that prevents all access. This class is fully + * interoperable with {@code Hashtable} in programs that rely on its + * thread safety but not on its synchronization details. + * + * <p>Retrieval operations (including {@code get}) generally do not + * block, so may overlap with update operations (including {@code put} + * and {@code remove}). Retrievals reflect the results of the most + * recently <em>completed</em> update operations holding upon their + * onset. (More formally, an update operation for a given key bears a + * <em>happens-before</em> relation with any (non-null) retrieval for + * that key reporting the updated value.) For aggregate operations + * such as {@code putAll} and {@code clear}, concurrent retrievals may + * reflect insertion or removal of only some entries. Similarly, + * Iterators and Enumerations return elements reflecting the state of + * the hash table at some point at or since the creation of the + * iterator/enumeration. They do <em>not</em> throw {@link + * ConcurrentModificationException}. However, iterators are designed + * to be used by only one thread at a time. Bear in mind that the + * results of aggregate status methods including {@code size}, {@code + * isEmpty}, and {@code containsValue} are typically useful only when + * a map is not undergoing concurrent updates in other threads. + * Otherwise the results of these methods reflect transient states + * that may be adequate for monitoring or estimation purposes, but not + * for program control. + * + * <p>The table is dynamically expanded when there are too many + * collisions (i.e., keys that have distinct hash codes but fall into + * the same slot modulo the table size), with the expected average + * effect of maintaining roughly two bins per mapping (corresponding + * to a 0.75 load factor threshold for resizing). There may be much + * variance around this average as mappings are added and removed, but + * overall, this maintains a commonly accepted time/space tradeoff for + * hash tables. However, resizing this or any other kind of hash + * table may be a relatively slow operation. When possible, it is a + * good idea to provide a size estimate as an optional {@code + * initialCapacity} constructor argument. An additional optional + * {@code loadFactor} constructor argument provides a further means of + * customizing initial table capacity by specifying the table density + * to be used in calculating the amount of space to allocate for the + * given number of elements. Also, for compatibility with previous + * versions of this class, constructors may optionally specify an + * expected {@code concurrencyLevel} as an additional hint for + * internal sizing. Note that using many keys with exactly the same + * {@code hashCode()} is a sure way to slow down performance of any + * hash table. + * + * <p>A {@link Set} projection of a ConcurrentHashMapV8 may be created + * (using {@link #newKeySet()} or {@link #newKeySet(int)}), or viewed + * (using {@link #keySet(Object)} when only keys are of interest, and the + * mapped values are (perhaps transiently) not used or all take the + * same mapping value. + * + * <p>A ConcurrentHashMapV8 can be used as scalable frequency map (a + * form of histogram or multiset) by using {@link LongAdder} values + * and initializing via {@link #computeIfAbsent}. For example, to add + * a count to a {@code ConcurrentHashMapV8<String,LongAdder> freqs}, you + * can use {@code freqs.computeIfAbsent(k -> new + * LongAdder()).increment();} + * + * <p>This class and its views and iterators implement all of the + * <em>optional</em> methods of the {@link Map} and {@link Iterator} + * interfaces. + * + * <p>Like {@link Hashtable} but unlike {@link HashMap}, this class + * does <em>not</em> allow {@code null} to be used as a key or value. + * + * <p>ConcurrentHashMapV8s support parallel operations using the {@link + * ForkJoinPool#commonPool}. (Tasks that may be used in other contexts + * are available in class {@link ForkJoinTasks}). These operations are + * designed to be safely, and often sensibly, applied even with maps + * that are being concurrently updated by other threads; for example, + * when computing a snapshot summary of the values in a shared + * registry. There are three kinds of operation, each with four + * forms, accepting functions with Keys, Values, Entries, and (Key, + * Value) arguments and/or return values. (The first three forms are + * also available via the {@link #keySet()}, {@link #values()} and + * {@link #entrySet()} views). Because the elements of a + * ConcurrentHashMapV8 are not ordered in any particular way, and may be + * processed in different orders in different parallel executions, the + * correctness of supplied functions should not depend on any + * ordering, or on any other objects or values that may transiently + * change while computation is in progress; and except for forEach + * actions, should ideally be side-effect-free. + * + * <ul> + * <li> forEach: Perform a given action on each element. + * A variant form applies a given transformation on each element + * before performing the action.</li> + * + * <li> search: Return the first available non-null result of + * applying a given function on each element; skipping further + * search when a result is found.</li> + * + * <li> reduce: Accumulate each element. The supplied reduction + * function cannot rely on ordering (more formally, it should be + * both associative and commutative). There are five variants: + * + * <ul> + * + * <li> Plain reductions. (There is not a form of this method for + * (key, value) function arguments since there is no corresponding + * return type.)</li> + * + * <li> Mapped reductions that accumulate the results of a given + * function applied to each element.</li> + * + * <li> Reductions to scalar doubles, longs, and ints, using a + * given basis value.</li> + * + * </li> + * </ul> + * </ul> + * + * <p>The concurrency properties of bulk operations follow + * from those of ConcurrentHashMapV8: Any non-null result returned + * from {@code get(key)} and related access methods bears a + * happens-before relation with the associated insertion or + * update. The result of any bulk operation reflects the + * composition of these per-element relations (but is not + * necessarily atomic with respect to the map as a whole unless it + * is somehow known to be quiescent). Conversely, because keys + * and values in the map are never null, null serves as a reliable + * atomic indicator of the current lack of any result. To + * maintain this property, null serves as an implicit basis for + * all non-scalar reduction operations. For the double, long, and + * int versions, the basis should be one that, when combined with + * any other value, returns that other value (more formally, it + * should be the identity element for the reduction). Most common + * reductions have these properties; for example, computing a sum + * with basis 0 or a minimum with basis MAX_VALUE. + * + * <p>Search and transformation functions provided as arguments + * should similarly return null to indicate the lack of any result + * (in which case it is not used). In the case of mapped + * reductions, this also enables transformations to serve as + * filters, returning null (or, in the case of primitive + * specializations, the identity basis) if the element should not + * be combined. You can create compound transformations and + * filterings by composing them yourself under this "null means + * there is nothing there now" rule before using them in search or + * reduce operations. + * + * <p>Methods accepting and/or returning Entry arguments maintain + * key-value associations. They may be useful for example when + * finding the key for the greatest value. Note that "plain" Entry + * arguments can be supplied using {@code new + * AbstractMap.SimpleEntry(k,v)}. + * + * <p>Bulk operations may complete abruptly, throwing an + * exception encountered in the application of a supplied + * function. Bear in mind when handling such exceptions that other + * concurrently executing functions could also have thrown + * exceptions, or would have done so if the first exception had + * not occurred. + * + * <p>Parallel speedups for bulk operations compared to sequential + * processing are common but not guaranteed. Operations involving + * brief functions on small maps may execute more slowly than + * sequential loops if the underlying work to parallelize the + * computation is more expensive than the computation itself. + * Similarly, parallelization may not lead to much actual parallelism + * if all processors are busy performing unrelated tasks. + * + * <p>All arguments to all task methods must be non-null. + * + * <p><em>jsr166e note: During transition, this class + * uses nested functional interfaces with different names but the + * same forms as those expected for JDK8.</em> + * + * <p>This class is a member of the + * <a href="{@docRoot}/../technotes/guides/collections/index.html"> + * Java Collections Framework</a>. + * + * @since 1.5 + * @author Doug Lea + * @param <K> the type of keys maintained by this map + * @param <V> the type of mapped values + */ +public class ConcurrentHashMapV8<K, V> + implements ConcurrentMap<K, V>, Serializable, ConcurrentHashMap<K, V> { + private static final long serialVersionUID = 7249069246763182397L; + + /** + * A partitionable iterator. A Spliterator can be traversed + * directly, but can also be partitioned (before traversal) by + * creating another Spliterator that covers a non-overlapping + * portion of the elements, and so may be amenable to parallel + * execution. + * + * <p>This interface exports a subset of expected JDK8 + * functionality. + * + * <p>Sample usage: Here is one (of the several) ways to compute + * the sum of the values held in a map using the ForkJoin + * framework. As illustrated here, Spliterators are well suited to + * designs in which a task repeatedly splits off half its work + * into forked subtasks until small enough to process directly, + * and then joins these subtasks. Variants of this style can also + * be used in completion-based designs. + * + * <pre> + * {@code ConcurrentHashMapV8<String, Long> m = ... + * // split as if have 8 * parallelism, for load balance + * int n = m.size(); + * int p = aForkJoinPool.getParallelism() * 8; + * int split = (n < p)? n : p; + * long sum = aForkJoinPool.invoke(new SumValues(m.valueSpliterator(), split, null)); + * // ... + * static class SumValues extends RecursiveTask<Long> { + * final Spliterator<Long> s; + * final int split; // split while > 1 + * final SumValues nextJoin; // records forked subtasks to join + * SumValues(Spliterator<Long> s, int depth, SumValues nextJoin) { + * this.s = s; this.depth = depth; this.nextJoin = nextJoin; + * } + * public Long compute() { + * long sum = 0; + * SumValues subtasks = null; // fork subtasks + * for (int s = split >>> 1; s > 0; s >>>= 1) + * (subtasks = new SumValues(s.split(), s, subtasks)).fork(); + * while (s.hasNext()) // directly process remaining elements + * sum += s.next(); + * for (SumValues t = subtasks; t != null; t = t.nextJoin) + * sum += t.join(); // collect subtask results + * return sum; + * } + * } + * }</pre> + */ + public static interface Spliterator<T> extends Iterator<T> { + /** + * Returns a Spliterator covering approximately half of the + * elements, guaranteed not to overlap with those subsequently + * returned by this Spliterator. After invoking this method, + * the current Spliterator will <em>not</em> produce any of + * the elements of the returned Spliterator, but the two + * Spliterators together will produce all of the elements that + * would have been produced by this Spliterator had this + * method not been called. The exact number of elements + * produced by the returned Spliterator is not guaranteed, and + * may be zero (i.e., with {@code hasNext()} reporting {@code + * false}) if this Spliterator cannot be further split. + * + * @return a Spliterator covering approximately half of the + * elements + * @throws IllegalStateException if this Spliterator has + * already commenced traversing elements + */ + Spliterator<T> split(); + } + + + /* + * Overview: + * + * The primary design goal of this hash table is to maintain + * concurrent readability (typically method get(), but also + * iterators and related methods) while minimizing update + * contention. Secondary goals are to keep space consumption about + * the same or better than java.util.HashMap, and to support high + * initial insertion rates on an empty table by many threads. + * + * Each key-value mapping is held in a Node. Because Node fields + * can contain special values, they are defined using plain Object + * types. Similarly in turn, all internal methods that use them + * work off Object types. And similarly, so do the internal + * methods of auxiliary iterator and view classes. All public + * generic typed methods relay in/out of these internal methods, + * supplying null-checks and casts as needed. This also allows + * many of the public methods to be factored into a smaller number + * of internal methods (although sadly not so for the five + * variants of put-related operations). The validation-based + * approach explained below leads to a lot of code sprawl because + * retry-control precludes factoring into smaller methods. + * + * The table is lazily initialized to a power-of-two size upon the + * first insertion. Each bin in the table normally contains a + * list of Nodes (most often, the list has only zero or one Node). + * Table accesses require volatile/atomic reads, writes, and + * CASes. Because there is no other way to arrange this without + * adding further indirections, we use intrinsics + * (sun.misc.Unsafe) operations. The lists of nodes within bins + * are always accurately traversable under volatile reads, so long + * as lookups check hash code and non-nullness of value before + * checking key equality. + * + * We use the top two bits of Node hash fields for control + * purposes -- they are available anyway because of addressing + * constraints. As explained further below, these top bits are + * used as follows: + * 00 - Normal + * 01 - Locked + * 11 - Locked and may have a thread waiting for lock + * 10 - Node is a forwarding node + * + * The lower 30 bits of each Node's hash field contain a + * transformation of the key's hash code, except for forwarding + * nodes, for which the lower bits are zero (and so always have + * hash field == MOVED). + * + * Insertion (via put or its variants) of the first node in an + * empty bin is performed by just CASing it to the bin. This is + * by far the most common case for put operations under most + * key/hash distributions. Other update operations (insert, + * delete, and replace) require locks. We do not want to waste + * the space required to associate a distinct lock object with + * each bin, so instead use the first node of a bin list itself as + * a lock. Blocking support for these locks relies on the builtin + * "synchronized" monitors. However, we also need a tryLock + * construction, so we overlay these by using bits of the Node + * hash field for lock control (see above), and so normally use + * builtin monitors only for blocking and signalling using + * wait/notifyAll constructions. See Node.tryAwaitLock. + * + * Using the first node of a list as a lock does not by itself + * suffice though: When a node is locked, any update must first + * validate that it is still the first node after locking it, and + * retry if not. Because new nodes are always appended to lists, + * once a node is first in a bin, it remains first until deleted + * or the bin becomes invalidated (upon resizing). However, + * operations that only conditionally update may inspect nodes + * until the point of update. This is a converse of sorts to the + * lazy locking technique described by Herlihy & Shavit. + * + * The main disadvantage of per-bin locks is that other update + * operations on other nodes in a bin list protected by the same + * lock can stall, for example when user equals() or mapping + * functions take a long time. However, statistically, under + * random hash codes, this is not a common problem. Ideally, the + * frequency of nodes in bins follows a Poisson distribution + * (http://en.wikipedia.org/wiki/Poisson_distribution) with a + * parameter of about 0.5 on average, given the resizing threshold + * of 0.75, although with a large variance because of resizing + * granularity. Ignoring variance, the expected occurrences of + * list size k are (exp(-0.5) * pow(0.5, k) / factorial(k)). The + * first values are: + * + * 0: 0.60653066 + * 1: 0.30326533 + * 2: 0.07581633 + * 3: 0.01263606 + * 4: 0.00157952 + * 5: 0.00015795 + * 6: 0.00001316 + * 7: 0.00000094 + * 8: 0.00000006 + * more: less than 1 in ten million + * + * Lock contention probability for two threads accessing distinct + * elements is roughly 1 / (8 * #elements) under random hashes. + * + * Actual hash code distributions encountered in practice + * sometimes deviate significantly from uniform randomness. This + * includes the case when N > (1<<30), so some keys MUST collide. + * Similarly for dumb or hostile usages in which multiple keys are + * designed to have identical hash codes. Also, although we guard + * against the worst effects of this (see method spread), sets of + * hashes may differ only in bits that do not impact their bin + * index for a given power-of-two mask. So we use a secondary + * strategy that applies when the number of nodes in a bin exceeds + * a threshold, and at least one of the keys implements + * Comparable. These TreeBins use a balanced tree to hold nodes + * (a specialized form of red-black trees), bounding search time + * to O(log N). Each search step in a TreeBin is around twice as + * slow as in a regular list, but given that N cannot exceed + * (1<<64) (before running out of addresses) this bounds search + * steps, lock hold times, etc, to reasonable constants (roughly + * 100 nodes inspected per operation worst case) so long as keys + * are Comparable (which is very common -- String, Long, etc). + * TreeBin nodes (TreeNodes) also maintain the same "next" + * traversal pointers as regular nodes, so can be traversed in + * iterators in the same way. + * + * The table is resized when occupancy exceeds a percentage + * threshold (nominally, 0.75, but see below). Only a single + * thread performs the resize (using field "sizeCtl", to arrange + * exclusion), but the table otherwise remains usable for reads + * and updates. Resizing proceeds by transferring bins, one by + * one, from the table to the next table. Because we are using + * power-of-two expansion, the elements from each bin must either + * stay at same index, or move with a power of two offset. We + * eliminate unnecessary node creation by catching cases where old + * nodes can be reused because their next fields won't change. On + * average, only about one-sixth of them need cloning when a table + * doubles. The nodes they replace will be garbage collectable as + * soon as they are no longer referenced by any reader thread that + * may be in the midst of concurrently traversing table. Upon + * transfer, the old table bin contains only a special forwarding + * node (with hash field "MOVED") that contains the next table as + * its key. On encountering a forwarding node, access and update + * operations restart, using the new table. + * + * Each bin transfer requires its bin lock. However, unlike other + * cases, a transfer can skip a bin if it fails to acquire its + * lock, and revisit it later (unless it is a TreeBin). Method + * rebuild maintains a buffer of TRANSFER_BUFFER_SIZE bins that + * have been skipped because of failure to acquire a lock, and + * blocks only if none are available (i.e., only very rarely). + * The transfer operation must also ensure that all accessible + * bins in both the old and new table are usable by any traversal. + * When there are no lock acquisition failures, this is arranged + * simply by proceeding from the last bin (table.length - 1) up + * towards the first. Upon seeing a forwarding node, traversals + * (see class Iter) arrange to move to the new table + * without revisiting nodes. However, when any node is skipped + * during a transfer, all earlier table bins may have become + * visible, so are initialized with a reverse-forwarding node back + * to the old table until the new ones are established. (This + * sometimes requires transiently locking a forwarding node, which + * is possible under the above encoding.) These more expensive + * mechanics trigger only when necessary. + * + * The traversal scheme also applies to partial traversals of + * ranges of bins (via an alternate Traverser constructor) + * to support partitioned aggregate operations. Also, read-only + * operations give up if ever forwarded to a null table, which + * provides support for shutdown-style clearing, which is also not + * currently implemented. + * + * Lazy table initialization minimizes footprint until first use, + * and also avoids resizings when the first operation is from a + * putAll, constructor with map argument, or deserialization. + * These cases attempt to override the initial capacity settings, + * but harmlessly fail to take effect in cases of races. + * + * The element count is maintained using a LongAdder, which avoids + * contention on updates but can encounter cache thrashing if read + * too frequently during concurrent access. To avoid reading so + * often, resizing is attempted either when a bin lock is + * contended, or upon adding to a bin already holding two or more + * nodes (checked before adding in the xIfAbsent methods, after + * adding in others). Under uniform hash distributions, the + * probability of this occurring at threshold is around 13%, + * meaning that only about 1 in 8 puts check threshold (and after + * resizing, many fewer do so). But this approximation has high + * variance for small table sizes, so we check on any collision + * for sizes <= 64. The bulk putAll operation further reduces + * contention by only committing count updates upon these size + * checks. + * + * Maintaining API and serialization compatibility with previous + * versions of this class introduces several oddities. Mainly: We + * leave untouched but unused constructor arguments refering to + * concurrencyLevel. We accept a loadFactor constructor argument, + * but apply it only to initial table capacity (which is the only + * time that we can guarantee to honor it.) We also declare an + * unused "Segment" class that is instantiated in minimal form + * only when serializing. + */ + + /* ---------------- Constants -------------- */ + + /** + * The largest possible table capacity. This value must be + * exactly 1<<30 to stay within Java array allocation and indexing + * bounds for power of two table sizes, and is further required + * because the top two bits of 32bit hash fields are used for + * control purposes. + */ + private static final int MAXIMUM_CAPACITY = 1 << 30; + + /** + * The default initial table capacity. Must be a power of 2 + * (i.e., at least 1) and at most MAXIMUM_CAPACITY. + */ + private static final int DEFAULT_CAPACITY = 16; + + /** + * The largest possible (non-power of two) array size. + * Needed by toArray and related methods. + */ + static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + /** + * The default concurrency level for this table. Unused but + * defined for compatibility with previous versions of this class. + */ + private static final int DEFAULT_CONCURRENCY_LEVEL = 16; + + /** + * The load factor for this table. Overrides of this value in + * constructors affect only the initial table capacity. The + * actual floating point value isn't normally used -- it is + * simpler to use expressions such as {@code n - (n >>> 2)} for + * the associated resizing threshold. + */ + private static final float LOAD_FACTOR = 0.75f; + + /** + * The buffer size for skipped bins during transfers. The + * value is arbitrary but should be large enough to avoid + * most locking stalls during resizes. + */ + private static final int TRANSFER_BUFFER_SIZE = 32; + + /** + * The bin count threshold for using a tree rather than list for a + * bin. The value reflects the approximate break-even point for + * using tree-based operations. + * Note that Doug's version defaults to 8, but when dealing with + * Ruby objects it is actually beneficial to avoid TreeNodes + * as long as possible as it usually means going into Ruby land. + */ + private static final int TREE_THRESHOLD = 16; + + /* + * Encodings for special uses of Node hash fields. See above for + * explanation. + */ + static final int MOVED = 0x80000000; // hash field for forwarding nodes + static final int LOCKED = 0x40000000; // set/tested only as a bit + static final int WAITING = 0xc0000000; // both bits set/tested together + static final int HASH_BITS = 0x3fffffff; // usable bits of normal node hash + + /* ---------------- Fields -------------- */ + + /** + * The array of bins. Lazily initialized upon first insertion. + * Size is always a power of two. Accessed directly by iterators. + */ + transient volatile Node[] table; + + /** + * The counter maintaining number of elements. + */ + private transient final LongAdder counter; + + /** + * Table initialization and resizing control. When negative, the + * table is being initialized or resized. Otherwise, when table is + * null, holds the initial table size to use upon creation, or 0 + * for default. After initialization, holds the next element count + * value upon which to resize the table. + */ + private transient volatile int sizeCtl; + + // views + private transient KeySetView<K,V> keySet; + private transient ValuesView<K,V> values; + private transient EntrySetView<K,V> entrySet; + + /** For serialization compatibility. Null unless serialized; see below */ + private Segment<K,V>[] segments; + + /* ---------------- Table element access -------------- */ + + /* + * Volatile access methods are used for table elements as well as + * elements of in-progress next table while resizing. Uses are + * null checked by callers, and implicitly bounds-checked, relying + * on the invariants that tab arrays have non-zero size, and all + * indices are masked with (tab.length - 1) which is never + * negative and always less than length. Note that, to be correct + * wrt arbitrary concurrency errors by users, bounds checks must + * operate on local variables, which accounts for some odd-looking + * inline assignments below. + */ + + static final Node tabAt(Node[] tab, int i) { // used by Iter + return (Node)UNSAFE.getObjectVolatile(tab, ((long)i<<ASHIFT)+ABASE); + } + + private static final boolean casTabAt(Node[] tab, int i, Node c, Node v) { + return UNSAFE.compareAndSwapObject(tab, ((long)i<<ASHIFT)+ABASE, c, v); + } + + private static final void setTabAt(Node[] tab, int i, Node v) { + UNSAFE.putObjectVolatile(tab, ((long)i<<ASHIFT)+ABASE, v); + } + + /* ---------------- Nodes -------------- */ + + /** + * Key-value entry. Note that this is never exported out as a + * user-visible Map.Entry (see MapEntry below). Nodes with a hash + * field of MOVED are special, and do not contain user keys or + * values. Otherwise, keys are never null, and null val fields + * indicate that a node is in the process of being deleted or + * created. For purposes of read-only access, a key may be read + * before a val, but can only be used after checking val to be + * non-null. + */ + static class Node { + volatile int hash; + final Object key; + volatile Object val; + volatile Node next; + + Node(int hash, Object key, Object val, Node next) { + this.hash = hash; + this.key = key; + this.val = val; + this.next = next; + } + + /** CompareAndSet the hash field */ + final boolean casHash(int cmp, int val) { + return UNSAFE.compareAndSwapInt(this, hashOffset, cmp, val); + } + + /** The number of spins before blocking for a lock */ + static final int MAX_SPINS = + Runtime.getRuntime().availableProcessors() > 1 ? 64 : 1; + + /** + * Spins a while if LOCKED bit set and this node is the first + * of its bin, and then sets WAITING bits on hash field and + * blocks (once) if they are still set. It is OK for this + * method to return even if lock is not available upon exit, + * which enables these simple single-wait mechanics. + * + * The corresponding signalling operation is performed within + * callers: Upon detecting that WAITING has been set when + * unlocking lock (via a failed CAS from non-waiting LOCKED + * state), unlockers acquire the sync lock and perform a + * notifyAll. + * + * The initial sanity check on tab and bounds is not currently + * necessary in the only usages of this method, but enables + * use in other future contexts. + */ + final void tryAwaitLock(Node[] tab, int i) { + if (tab != null && i >= 0 && i < tab.length) { // sanity check + int r = ThreadLocalRandom.current().nextInt(); // randomize spins + int spins = MAX_SPINS, h; + while (tabAt(tab, i) == this && ((h = hash) & LOCKED) != 0) { + if (spins >= 0) { + r ^= r << 1; r ^= r >>> 3; r ^= r << 10; // xorshift + if (r >= 0 && --spins == 0) + Thread.yield(); // yield before block + } + else if (casHash(h, h | WAITING)) { + synchronized (this) { + if (tabAt(tab, i) == this && + (hash & WAITING) == WAITING) { + try { + wait(); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + else + notifyAll(); // possibly won race vs signaller + } + break; + } + } + } + } + + // Unsafe mechanics for casHash + private static final sun.misc.Unsafe UNSAFE; + private static final long hashOffset; + + static { + try { + UNSAFE = getUnsafe(); + Class<?> k = Node.class; + hashOffset = UNSAFE.objectFieldOffset + (k.getDeclaredField("hash")); + } catch (Exception e) { + throw new Error(e); + } + } + } + + /* ---------------- TreeBins -------------- */ + + /** + * Nodes for use in TreeBins + */ + static final class TreeNode extends Node { + TreeNode parent; // red-black tree links + TreeNode left; + TreeNode right; + TreeNode prev; // needed to unlink next upon deletion + boolean red; + + TreeNode(int hash, Object key, Object val, Node next, TreeNode parent) { + super(hash, key, val, next); + this.parent = parent; + } + } + + /** + * A specialized form of red-black tree for use in bins + * whose size exceeds a threshold. + * + * TreeBins use a special form of comparison for search and + * related operations (which is the main reason we cannot use + * existing collections such as TreeMaps). TreeBins contain + * Comparable elements, but may contain others, as well as + * elements that are Comparable but not necessarily Comparable<T> + * for the same T, so we cannot invoke compareTo among them. To + * handle this, the tree is ordered primarily by hash value, then + * by getClass().getName() order, and then by Comparator order + * among elements of the same class. On lookup at a node, if + * elements are not comparable or compare as 0, both left and + * right children may need to be searched in the case of tied hash + * values. (This corresponds to the full list search that would be + * necessary if all elements were non-Comparable and had tied + * hashes.) The red-black balancing code is updated from + * pre-jdk-collections + * (http://gee.cs.oswego.edu/dl/classes/collections/RBCell.java) + * based in turn on Cormen, Leiserson, and Rivest "Introduction to + * Algorithms" (CLR). + * + * TreeBins also maintain a separate locking discipline than + * regular bins. Because they are forwarded via special MOVED + * nodes at bin heads (which can never change once established), + * we cannot use those nodes as locks. Instead, TreeBin + * extends AbstractQueuedSynchronizer to support a simple form of + * read-write lock. For update operations and table validation, + * the exclusive form of lock behaves in the same way as bin-head + * locks. However, lookups use shared read-lock mechanics to allow + * multiple readers in the absence of writers. Additionally, + * these lookups do not ever block: While the lock is not + * available, they proceed along the slow traversal path (via + * next-pointers) until the lock becomes available or the list is + * exhausted, whichever comes first. (These cases are not fast, + * but maximize aggregate expected throughput.) The AQS mechanics + * for doing this are straightforward. The lock state is held as + * AQS getState(). Read counts are negative; the write count (1) + * is positive. There are no signalling preferences among readers + * and writers. Since we don't need to export full Lock API, we + * just override the minimal AQS methods and use them directly. + */ + static final class TreeBin extends AbstractQueuedSynchronizer { + private static final long serialVersionUID = 2249069246763182397L; + transient TreeNode root; // root of tree + transient TreeNode first; // head of next-pointer list + + /* AQS overrides */ + public final boolean isHeldExclusively() { return getState() > 0; } + public final boolean tryAcquire(int ignore) { + if (compareAndSetState(0, 1)) { + setExclusiveOwnerThread(Thread.currentThread()); + return true; + } + return false; + } + public final boolean tryRelease(int ignore) { + setExclusiveOwnerThread(null); + setState(0); + return true; + } + public final int tryAcquireShared(int ignore) { + for (int c;;) { + if ((c = getState()) > 0) + return -1; + if (compareAndSetState(c, c -1)) + return 1; + } + } + public final boolean tryReleaseShared(int ignore) { + int c; + do {} while (!compareAndSetState(c = getState(), c + 1)); + return c == -1; + } + + /** From CLR */ + private void rotateLeft(TreeNode p) { + if (p != null) { + TreeNode r = p.right, pp, rl; + if ((rl = p.right = r.left) != null) + rl.parent = p; + if ((pp = r.parent = p.parent) == null) + root = r; + else if (pp.left == p) + pp.left = r; + else + pp.right = r; + r.left = p; + p.parent = r; + } + } + + /** From CLR */ + private void rotateRight(TreeNode p) { + if (p != null) { + TreeNode l = p.left, pp, lr; + if ((lr = p.left = l.right) != null) + lr.parent = p; + if ((pp = l.parent = p.parent) == null) + root = l; + else if (pp.right == p) + pp.right = l; + else + pp.left = l; + l.right = p; + p.parent = l; + } + } + + @SuppressWarnings("unchecked") final TreeNode getTreeNode + (int h, Object k, TreeNode p) { + return getTreeNode(h, (RubyObject)k, p); + } + + /** + * Returns the TreeNode (or null if not found) for the given key + * starting at given root. + */ + @SuppressWarnings("unchecked") final TreeNode getTreeNode + (int h, RubyObject k, TreeNode p) { + RubyClass c = k.getMetaClass(); boolean kNotComparable = !k.respondsTo("<=>"); + while (p != null) { + int dir, ph; RubyObject pk; RubyClass pc; + if ((ph = p.hash) == h) { + if ((pk = (RubyObject)p.key) == k || k.equals(pk)) + return p; + if (c != (pc = (RubyClass)pk.getMetaClass()) || + kNotComparable || + (dir = rubyCompare(k, pk)) == 0) { + dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); + if (dir == 0) { // if still stuck, need to check both sides + TreeNode r = null, pl, pr; + // try to recurse on the right + if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) + return r; + // try to continue iterating on the left side + else if ((pl = p.left) != null && h <= pl.hash) + dir = -1; + else // no matching node found + return null; + } + } + } + else + dir = (h < ph) ? -1 : 1; + p = (dir > 0) ? p.right : p.left; + } + return null; + } + + int rubyCompare(RubyObject l, RubyObject r) { + ThreadContext context = l.getMetaClass().getRuntime().getCurrentContext(); + IRubyObject result; + try { + result = l.callMethod(context, "<=>", r); + } catch (RaiseException e) { + // handle objects "lying" about responding to <=>, ie: an Array containing non-comparable keys + if (context.runtime.getNoMethodError().isInstance(e.getException())) { + return 0; + } + throw e; + } + + return result.isNil() ? 0 : RubyNumeric.num2int(result.convertToInteger()); + } + + /** + * Wrapper for getTreeNode used by CHM.get. Tries to obtain + * read-lock to call getTreeNode, but during failure to get + * lock, searches along next links. + */ + final Object getValue(int h, Object k) { + Node r = null; + int c = getState(); // Must read lock state first + for (Node e = first; e != null; e = e.next) { + if (c <= 0 && compareAndSetState(c, c - 1)) { + try { + r = getTreeNode(h, k, root); + } finally { + releaseShared(0); + } + break; + } + else if ((e.hash & HASH_BITS) == h && k.equals(e.key)) { + r = e; + break; + } + else + c = getState(); + } + return r == null ? null : r.val; + } + + @SuppressWarnings("unchecked") final TreeNode putTreeNode + (int h, Object k, Object v) { + return putTreeNode(h, (RubyObject)k, v); + } + + /** + * Finds or adds a node. + * @return null if added + */ + @SuppressWarnings("unchecked") final TreeNode putTreeNode + (int h, RubyObject k, Object v) { + RubyClass c = k.getMetaClass(); + boolean kNotComparable = !k.respondsTo("<=>"); + TreeNode pp = root, p = null; + int dir = 0; + while (pp != null) { // find existing node or leaf to insert at + int ph; RubyObject pk; RubyClass pc; + p = pp; + if ((ph = p.hash) == h) { + if ((pk = (RubyObject)p.key) == k || k.equals(pk)) + return p; + if (c != (pc = pk.getMetaClass()) || + kNotComparable || + (dir = rubyCompare(k, pk)) == 0) { + dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); + if (dir == 0) { // if still stuck, need to check both sides + TreeNode r = null, pr; + // try to recurse on the right + if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) + return r; + else // continue descending down the left subtree + dir = -1; + } + } + } + else + dir = (h < ph) ? -1 : 1; + pp = (dir > 0) ? p.right : p.left; + } + + TreeNode f = first; + TreeNode x = first = new TreeNode(h, (Object)k, v, f, p); + if (p == null) + root = x; + else { // attach and rebalance; adapted from CLR + TreeNode xp, xpp; + if (f != null) + f.prev = x; + if (dir <= 0) + p.left = x; + else + p.right = x; + x.red = true; + while (x != null && (xp = x.parent) != null && xp.red && + (xpp = xp.parent) != null) { + TreeNode xppl = xpp.left; + if (xp == xppl) { + TreeNode y = xpp.right; + if (y != null && y.red) { + y.red = false; + xp.red = false; + xpp.red = true; + x = xpp; + } + else { + if (x == xp.right) { + rotateLeft(x = xp); + xpp = (xp = x.parent) == null ? null : xp.parent; + } + if (xp != null) { + xp.red = false; + if (xpp != null) { + xpp.red = true; + rotateRight(xpp); + } + } + } + } + else { + TreeNode y = xppl; + if (y != null && y.red) { + y.red = false; + xp.red = false; + xpp.red = true; + x = xpp; + } + else { + if (x == xp.left) { + rotateRight(x = xp); + xpp = (xp = x.parent) == null ? null : xp.parent; + } + if (xp != null) { + xp.red = false; + if (xpp != null) { + xpp.red = true; + rotateLeft(xpp); + } + } + } + } + } + TreeNode r = root; + if (r != null && r.red) + r.red = false; + } + return null; + } + + /** + * Removes the given node, that must be present before this + * call. This is messier than typical red-black deletion code + * because we cannot swap the contents of an interior node + * with a leaf successor that is pinned by "next" pointers + * that are accessible independently of lock. So instead we + * swap the tree linkages. + */ + final void deleteTreeNode(TreeNode p) { + TreeNode next = (TreeNode)p.next; // unlink traversal pointers + TreeNode pred = p.prev; + if (pred == null) + first = next; + else + pred.next = next; + if (next != null) + next.prev = pred; + TreeNode replacement; + TreeNode pl = p.left; + TreeNode pr = p.right; + if (pl != null && pr != null) { + TreeNode s = pr, sl; + while ((sl = s.left) != null) // find successor + s = sl; + boolean c = s.red; s.red = p.red; p.red = c; // swap colors + TreeNode sr = s.right; + TreeNode pp = p.parent; + if (s == pr) { // p was s's direct parent + p.parent = s; + s.right = p; + } + else { + TreeNode sp = s.parent; + if ((p.parent = sp) != null) { + if (s == sp.left) + sp.left = p; + else + sp.right = p; + } + if ((s.right = pr) != null) + pr.parent = s; + } + p.left = null; + if ((p.right = sr) != null) + sr.parent = p; + if ((s.left = pl) != null) + pl.parent = s; + if ((s.parent = pp) == null) + root = s; + else if (p == pp.left) + pp.left = s; + else + pp.right = s; + replacement = sr; + } + else + replacement = (pl != null) ? pl : pr; + TreeNode pp = p.parent; + if (replacement == null) { + if (pp == null) { + root = null; + return; + } + replacement = p; + } + else { + replacement.parent = pp; + if (pp == null) + root = replacement; + else if (p == pp.left) + pp.left = replacement; + else + pp.right = replacement; + p.left = p.right = p.parent = null; + } + if (!p.red) { // rebalance, from CLR + TreeNode x = replacement; + while (x != null) { + TreeNode xp, xpl; + if (x.red || (xp = x.parent) == null) { + x.red = false; + break; + } + if (x == (xpl = xp.left)) { + TreeNode sib = xp.right; + if (sib != null && sib.red) { + sib.red = false; + xp.red = true; + rotateLeft(xp); + sib = (xp = x.parent) == null ? null : xp.right; + } + if (sib == null) + x = xp; + else { + TreeNode sl = sib.left, sr = sib.right; + if ((sr == null || !sr.red) && + (sl == null || !sl.red)) { + sib.red = true; + x = xp; + } + else { + if (sr == null || !sr.red) { + if (sl != null) + sl.red = false; + sib.red = true; + rotateRight(sib); + sib = (xp = x.parent) == null ? null : xp.right; + } + if (sib != null) { + sib.red = (xp == null) ? false : xp.red; + if ((sr = sib.right) != null) + sr.red = false; + } + if (xp != null) { + xp.red = false; + rotateLeft(xp); + } + x = root; + } + } + } + else { // symmetric + TreeNode sib = xpl; + if (sib != null && sib.red) { + sib.red = false; + xp.red = true; + rotateRight(xp); + sib = (xp = x.parent) == null ? null : xp.left; + } + if (sib == null) + x = xp; + else { + TreeNode sl = sib.left, sr = sib.right; + if ((sl == null || !sl.red) && + (sr == null || !sr.red)) { + sib.red = true; + x = xp; + } + else { + if (sl == null || !sl.red) { + if (sr != null) + sr.red = false; + sib.red = true; + rotateLeft(sib); + sib = (xp = x.parent) == null ? null : xp.left; + } + if (sib != null) { + sib.red = (xp == null) ? false : xp.red; + if ((sl = sib.left) != null) + sl.red = false; + } + if (xp != null) { + xp.red = false; + rotateRight(xp); + } + x = root; + } + } + } + } + } + if (p == replacement && (pp = p.parent) != null) { + if (p == pp.left) // detach pointers + pp.left = null; + else if (p == pp.right) + pp.right = null; + p.parent = null; + } + } + } + + /* ---------------- Collision reduction methods -------------- */ + + /** + * Spreads higher bits to lower, and also forces top 2 bits to 0. + * Because the table uses power-of-two masking, sets of hashes + * that vary only in bits above the current mask will always + * collide. (Among known examples are sets of Float keys holding + * consecutive whole numbers in small tables.) To counter this, + * we apply a transform that spreads the impact of higher bits + * downward. There is a tradeoff between speed, utility, and + * quality of bit-spreading. Because many common sets of hashes + * are already reasonably distributed across bits (so don't benefit + * from spreading), and because we use trees to handle large sets + * of collisions in bins, we don't need excessively high quality. + */ + private static final int spread(int h) { + h ^= (h >>> 18) ^ (h >>> 12); + return (h ^ (h >>> 10)) & HASH_BITS; + } + + /** + * Replaces a list bin with a tree bin. Call only when locked. + * Fails to replace if the given key is non-comparable or table + * is, or needs, resizing. + */ + private final void replaceWithTreeBin(Node[] tab, int index, Object key) { + if ((key instanceof Comparable) && + (tab.length >= MAXIMUM_CAPACITY || counter.sum() < (long)sizeCtl)) { + TreeBin t = new TreeBin(); + for (Node e = tabAt(tab, index); e != null; e = e.next) + t.putTreeNode(e.hash & HASH_BITS, e.key, e.val); + setTabAt(tab, index, new Node(MOVED, t, null, null)); + } + } + + /* ---------------- Internal access and update methods -------------- */ + + /** Implementation for get and containsKey */ + private final Object internalGet(Object k) { + int h = spread(k.hashCode()); + retry: for (Node[] tab = table; tab != null;) { + Node e, p; Object ek, ev; int eh; // locals to read fields once + for (e = tabAt(tab, (tab.length - 1) & h); e != null; e = e.next) { + if ((eh = e.hash) == MOVED) { + if ((ek = e.key) instanceof TreeBin) // search TreeBin + return ((TreeBin)ek).getValue(h, k); + else { // restart with new table + tab = (Node[])ek; + continue retry; + } + } + else if ((eh & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + } + break; + } + return null; + } + + /** + * Implementation for the four public remove/replace methods: + * Replaces node value with v, conditional upon match of cv if + * non-null. If resulting value is null, delete. + */ + private final Object internalReplace(Object k, Object v, Object cv) { + int h = spread(k.hashCode()); + Object oldVal = null; + for (Node[] tab = table;;) { + Node f; int i, fh; Object fk; + if (tab == null || + (f = tabAt(tab, i = (tab.length - 1) & h)) == null) + break; + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + boolean deleted = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) { + Object pv = p.val; + if (cv == null || cv == pv || cv.equals(pv)) { + oldVal = pv; + if ((p.val = v) == null) { + deleted = true; + t.deleteTreeNode(p); + } + } + } + } + } finally { + t.release(0); + } + if (validated) { + if (deleted) + counter.add(-1L); + break; + } + } + else + tab = (Node[])fk; + } + else if ((fh & HASH_BITS) != h && f.next == null) // precheck + break; // rules out possible existence + else if ((fh & LOCKED) != 0) { + checkForResize(); // try resizing if can't get lock + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + boolean validated = false; + boolean deleted = false; + try { + if (tabAt(tab, i) == f) { + validated = true; + for (Node e = f, pred = null;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + ((ev = e.val) != null) && + ((ek = e.key) == k || k.equals(ek))) { + if (cv == null || cv == ev || cv.equals(ev)) { + oldVal = ev; + if ((e.val = v) == null) { + deleted = true; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + } + break; + } + pred = e; + if ((e = e.next) == null) + break; + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (validated) { + if (deleted) + counter.add(-1L); + break; + } + } + } + return oldVal; + } + + /* + * Internal versions of the six insertion methods, each a + * little more complicated than the last. All have + * the same basic structure as the first (internalPut): + * 1. If table uninitialized, create + * 2. If bin empty, try to CAS new node + * 3. If bin stale, use new table + * 4. if bin converted to TreeBin, validate and relay to TreeBin methods + * 5. Lock and validate; if valid, scan and add or update + * + * The others interweave other checks and/or alternative actions: + * * Plain put checks for and performs resize after insertion. + * * putIfAbsent prescans for mapping without lock (and fails to add + * if present), which also makes pre-emptive resize checks worthwhile. + * * computeIfAbsent extends form used in putIfAbsent with additional + * mechanics to deal with, calls, potential exceptions and null + * returns from function call. + * * compute uses the same function-call mechanics, but without + * the prescans + * * merge acts as putIfAbsent in the absent case, but invokes the + * update function if present + * * putAll attempts to pre-allocate enough table space + * and more lazily performs count updates and checks. + * + * Someday when details settle down a bit more, it might be worth + * some factoring to reduce sprawl. + */ + + /** Implementation for put */ + private final Object internalPut(Object k, Object v) { + int h = spread(k.hashCode()); + int count = 0; + for (Node[] tab = table;;) { + int i; Node f; int fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) + break; // no lock when adding to empty bin + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + Object oldVal = null; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 2; + TreeNode p = t.putTreeNode(h, k, v); + if (p != null) { + oldVal = p.val; + p.val = v; + } + } + } finally { + t.release(0); + } + if (count != 0) { + if (oldVal != null) + return oldVal; + break; + } + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + Object oldVal = null; + try { // needed in case equals() throws + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + oldVal = ev; + e.val = v; + break; + } + Node last = e; + if ((e = e.next) == null) { + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { // unlock and signal if needed + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (oldVal != null) + return oldVal; + if (tab.length <= 64) + count = 2; + break; + } + } + } + counter.add(1L); + if (count > 1) + checkForResize(); + return null; + } + + /** Implementation for putIfAbsent */ + private final Object internalPutIfAbsent(Object k, Object v) { + int h = spread(k.hashCode()); + int count = 0; + for (Node[] tab = table;;) { + int i; Node f; int fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + Object oldVal = null; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 2; + TreeNode p = t.putTreeNode(h, k, v); + if (p != null) + oldVal = p.val; + } + } finally { + t.release(0); + } + if (count != 0) { + if (oldVal != null) + return oldVal; + break; + } + } + else + tab = (Node[])fk; + } + else if ((fh & HASH_BITS) == h && (fv = f.val) != null && + ((fk = f.key) == k || k.equals(fk))) + return fv; + else { + Node g = f.next; + if (g != null) { // at least 2 nodes -- search and maybe resize + for (Node e = g;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + if ((e = e.next) == null) { + checkForResize(); + break; + } + } + } + if (((fh = f.hash) & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { + Object oldVal = null; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + oldVal = ev; + break; + } + Node last = e; + if ((e = e.next) == null) { + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (oldVal != null) + return oldVal; + if (tab.length <= 64) + count = 2; + break; + } + } + } + } + counter.add(1L); + if (count > 1) + checkForResize(); + return null; + } + + /** Implementation for computeIfAbsent */ + private final Object internalComputeIfAbsent(K k, + Fun<? super K, ?> mf) { + int h = spread(k.hashCode()); + Object val = null; + int count = 0; + for (Node[] tab = table;;) { + Node f; int i, fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + Node node = new Node(fh = h | LOCKED, k, null, null); + if (casTabAt(tab, i, null, node)) { + count = 1; + try { + if ((val = mf.apply(k)) != null) + node.val = val; + } finally { + if (val == null) + setTabAt(tab, i, null); + if (!node.casHash(fh, h)) { + node.hash = h; + synchronized (node) { node.notifyAll(); }; + } + } + } + if (count != 0) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean added = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) + val = p.val; + else if ((val = mf.apply(k)) != null) { + added = true; + count = 2; + t.putTreeNode(h, k, val); + } + } + } finally { + t.release(0); + } + if (count != 0) { + if (!added) + return val; + break; + } + } + else + tab = (Node[])fk; + } + else if ((fh & HASH_BITS) == h && (fv = f.val) != null && + ((fk = f.key) == k || k.equals(fk))) + return fv; + else { + Node g = f.next; + if (g != null) { + for (Node e = g;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + if ((e = e.next) == null) { + checkForResize(); + break; + } + } + } + if (((fh = f.hash) & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { + boolean added = false; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = ev; + break; + } + Node last = e; + if ((e = e.next) == null) { + if ((val = mf.apply(k)) != null) { + added = true; + last.next = new Node(h, k, val, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + } + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (!added) + return val; + if (tab.length <= 64) + count = 2; + break; + } + } + } + } + if (val != null) { + counter.add(1L); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for compute */ + @SuppressWarnings("unchecked") private final Object internalCompute + (K k, boolean onlyIfPresent, BiFun<? super K, ? super V, ? extends V> mf) { + int h = spread(k.hashCode()); + Object val = null; + int delta = 0; + int count = 0; + for (Node[] tab = table;;) { + Node f; int i, fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + if (onlyIfPresent) + break; + Node node = new Node(fh = h | LOCKED, k, null, null); + if (casTabAt(tab, i, null, node)) { + try { + count = 1; + if ((val = mf.apply(k, null)) != null) { + node.val = val; + delta = 1; + } + } finally { + if (delta == 0) + setTabAt(tab, i, null); + if (!node.casHash(fh, h)) { + node.hash = h; + synchronized (node) { node.notifyAll(); }; + } + } + } + if (count != 0) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + Object pv; + if (p == null) { + if (onlyIfPresent) + break; + pv = null; + } else + pv = p.val; + if ((val = mf.apply(k, (V)pv)) != null) { + if (p != null) + p.val = val; + else { + count = 2; + delta = 1; + t.putTreeNode(h, k, val); + } + } + else if (p != null) { + delta = -1; + t.deleteTreeNode(p); + } + } + } finally { + t.release(0); + } + if (count != 0) + break; + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f, pred = null;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = mf.apply(k, (V)ev); + if (val != null) + e.val = val; + else { + delta = -1; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + break; + } + pred = e; + if ((e = e.next) == null) { + if (!onlyIfPresent && (val = mf.apply(k, null)) != null) { + pred.next = new Node(h, k, val, null); + delta = 1; + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + } + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (tab.length <= 64) + count = 2; + break; + } + } + } + if (delta != 0) { + counter.add((long)delta); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for merge */ + @SuppressWarnings("unchecked") private final Object internalMerge + (K k, V v, BiFun<? super V, ? super V, ? extends V> mf) { + int h = spread(k.hashCode()); + Object val = null; + int delta = 0; + int count = 0; + for (Node[] tab = table;;) { + int i; Node f; int fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) { + delta = 1; + val = v; + break; + } + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + val = (p == null) ? v : mf.apply((V)p.val, v); + if (val != null) { + if (p != null) + p.val = val; + else { + count = 2; + delta = 1; + t.putTreeNode(h, k, val); + } + } + else if (p != null) { + delta = -1; + t.deleteTreeNode(p); + } + } + } finally { + t.release(0); + } + if (count != 0) + break; + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f, pred = null;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = mf.apply((V)ev, v); + if (val != null) + e.val = val; + else { + delta = -1; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + break; + } + pred = e; + if ((e = e.next) == null) { + val = v; + pred.next = new Node(h, k, val, null); + delta = 1; + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (tab.length <= 64) + count = 2; + break; + } + } + } + if (delta != 0) { + counter.add((long)delta); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for putAll */ + private final void internalPutAll(Map<?, ?> m) { + tryPresize(m.size()); + long delta = 0L; // number of uncommitted additions + boolean npe = false; // to throw exception on exit for nulls + try { // to clean up counts on other exceptions + for (Map.Entry<?, ?> entry : m.entrySet()) { + Object k, v; + if (entry == null || (k = entry.getKey()) == null || + (v = entry.getValue()) == null) { + npe = true; + break; + } + int h = spread(k.hashCode()); + for (Node[] tab = table;;) { + int i; Node f; int fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length - 1) & h)) == null){ + if (casTabAt(tab, i, null, new Node(h, k, v, null))) { + ++delta; + break; + } + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) + p.val = v; + else { + t.putTreeNode(h, k, v); + ++delta; + } + } + } finally { + t.release(0); + } + if (validated) + break; + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + counter.add(delta); + delta = 0L; + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + int count = 0; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + e.val = v; + break; + } + Node last = e; + if ((e = e.next) == null) { + ++delta; + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (count > 1) { + counter.add(delta); + delta = 0L; + checkForResize(); + } + break; + } + } + } + } + } finally { + if (delta != 0) + counter.add(delta); + } + if (npe) + throw new NullPointerException(); + } + + /* ---------------- Table Initialization and Resizing -------------- */ + + /** + * Returns a power of two table size for the given desired capacity. + * See Hackers Delight, sec 3.2 + */ + private static final int tableSizeFor(int c) { + int n = c - 1; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; + } + + /** + * Initializes table, using the size recorded in sizeCtl. + */ + private final Node[] initTable() { + Node[] tab; int sc; + while ((tab = table) == null) { + if ((sc = sizeCtl) < 0) + Thread.yield(); // lost initialization race; just spin + else if (UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if ((tab = table) == null) { + int n = (sc > 0) ? sc : DEFAULT_CAPACITY; + tab = table = new Node[n]; + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + break; + } + } + return tab; + } + + /** + * If table is too small and not already resizing, creates next + * table and transfers bins. Rechecks occupancy after a transfer + * to see if another resize is already needed because resizings + * are lagging additions. + */ + private final void checkForResize() { + Node[] tab; int n, sc; + while ((tab = table) != null && + (n = tab.length) < MAXIMUM_CAPACITY && + (sc = sizeCtl) >= 0 && counter.sum() >= (long)sc && + UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if (tab == table) { + table = rebuild(tab); + sc = (n << 1) - (n >>> 1); + } + } finally { + sizeCtl = sc; + } + } + } + + /** + * Tries to presize table to accommodate the given number of elements. + * + * @param size number of elements (doesn't need to be perfectly accurate) + */ + private final void tryPresize(int size) { + int c = (size >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : + tableSizeFor(size + (size >>> 1) + 1); + int sc; + while ((sc = sizeCtl) >= 0) { + Node[] tab = table; int n; + if (tab == null || (n = tab.length) == 0) { + n = (sc > c) ? sc : c; + if (UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if (table == tab) { + table = new Node[n]; + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + } + } + else if (c <= sc || n >= MAXIMUM_CAPACITY) + break; + else if (UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if (table == tab) { + table = rebuild(tab); + sc = (n << 1) - (n >>> 1); + } + } finally { + sizeCtl = sc; + } + } + } + } + + /* + * Moves and/or copies the nodes in each bin to new table. See + * above for explanation. + * + * @return the new table + */ + private static final Node[] rebuild(Node[] tab) { + int n = tab.length; + Node[] nextTab = new Node[n << 1]; + Node fwd = new Node(MOVED, nextTab, null, null); + int[] buffer = null; // holds bins to revisit; null until needed + Node rev = null; // reverse forwarder; null until needed + int nbuffered = 0; // the number of bins in buffer list + int bufferIndex = 0; // buffer index of current buffered bin + int bin = n - 1; // current non-buffered bin or -1 if none + + for (int i = bin;;) { // start upwards sweep + int fh; Node f; + if ((f = tabAt(tab, i)) == null) { + if (bin >= 0) { // Unbuffered; no lock needed (or available) + if (!casTabAt(tab, i, f, fwd)) + continue; + } + else { // transiently use a locked forwarding node + Node g = new Node(MOVED|LOCKED, nextTab, null, null); + if (!casTabAt(tab, i, f, g)) + continue; + setTabAt(nextTab, i, null); + setTabAt(nextTab, i + n, null); + setTabAt(tab, i, fwd); + if (!g.casHash(MOVED|LOCKED, MOVED)) { + g.hash = MOVED; + synchronized (g) { g.notifyAll(); } + } + } + } + else if ((fh = f.hash) == MOVED) { + Object fk = f.key; + if (fk instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + splitTreeBin(nextTab, i, t); + setTabAt(tab, i, fwd); + } + } finally { + t.release(0); + } + if (!validated) + continue; + } + } + else if ((fh & LOCKED) == 0 && f.casHash(fh, fh|LOCKED)) { + boolean validated = false; + try { // split to lo and hi lists; copying as needed + if (tabAt(tab, i) == f) { + validated = true; + splitBin(nextTab, i, f); + setTabAt(tab, i, fwd); + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (!validated) + continue; + } + else { + if (buffer == null) // initialize buffer for revisits + buffer = new int[TRANSFER_BUFFER_SIZE]; + if (bin < 0 && bufferIndex > 0) { + int j = buffer[--bufferIndex]; + buffer[bufferIndex] = i; + i = j; // swap with another bin + continue; + } + if (bin < 0 || nbuffered >= TRANSFER_BUFFER_SIZE) { + f.tryAwaitLock(tab, i); + continue; // no other options -- block + } + if (rev == null) // initialize reverse-forwarder + rev = new Node(MOVED, tab, null, null); + if (tabAt(tab, i) != f || (f.hash & LOCKED) == 0) + continue; // recheck before adding to list + buffer[nbuffered++] = i; + setTabAt(nextTab, i, rev); // install place-holders + setTabAt(nextTab, i + n, rev); + } + + if (bin > 0) + i = --bin; + else if (buffer != null && nbuffered > 0) { + bin = -1; + i = buffer[bufferIndex = --nbuffered]; + } + else + return nextTab; + } + } + + /** + * Splits a normal bin with list headed by e into lo and hi parts; + * installs in given table. + */ + private static void splitBin(Node[] nextTab, int i, Node e) { + int bit = nextTab.length >>> 1; // bit to split on + int runBit = e.hash & bit; + Node lastRun = e, lo = null, hi = null; + for (Node p = e.next; p != null; p = p.next) { + int b = p.hash & bit; + if (b != runBit) { + runBit = b; + lastRun = p; + } + } + if (runBit == 0) + lo = lastRun; + else + hi = lastRun; + for (Node p = e; p != lastRun; p = p.next) { + int ph = p.hash & HASH_BITS; + Object pk = p.key, pv = p.val; + if ((ph & bit) == 0) + lo = new Node(ph, pk, pv, lo); + else + hi = new Node(ph, pk, pv, hi); + } + setTabAt(nextTab, i, lo); + setTabAt(nextTab, i + bit, hi); + } + + /** + * Splits a tree bin into lo and hi parts; installs in given table. + */ + private static void splitTreeBin(Node[] nextTab, int i, TreeBin t) { + int bit = nextTab.length >>> 1; + TreeBin lt = new TreeBin(); + TreeBin ht = new TreeBin(); + int lc = 0, hc = 0; + for (Node e = t.first; e != null; e = e.next) { + int h = e.hash & HASH_BITS; + Object k = e.key, v = e.val; + if ((h & bit) == 0) { + ++lc; + lt.putTreeNode(h, k, v); + } + else { + ++hc; + ht.putTreeNode(h, k, v); + } + } + Node ln, hn; // throw away trees if too small + if (lc <= (TREE_THRESHOLD >>> 1)) { + ln = null; + for (Node p = lt.first; p != null; p = p.next) + ln = new Node(p.hash, p.key, p.val, ln); + } + else + ln = new Node(MOVED, lt, null, null); + setTabAt(nextTab, i, ln); + if (hc <= (TREE_THRESHOLD >>> 1)) { + hn = null; + for (Node p = ht.first; p != null; p = p.next) + hn = new Node(p.hash, p.key, p.val, hn); + } + else + hn = new Node(MOVED, ht, null, null); + setTabAt(nextTab, i + bit, hn); + } + + /** + * Implementation for clear. Steps through each bin, removing all + * nodes. + */ + private final void internalClear() { + long delta = 0L; // negative number of deletions + int i = 0; + Node[] tab = table; + while (tab != null && i < tab.length) { + int fh; Object fk; + Node f = tabAt(tab, i); + if (f == null) + ++i; + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + for (Node p = t.first; p != null; p = p.next) { + if (p.val != null) { // (currently always true) + p.val = null; + --delta; + } + } + t.first = null; + t.root = null; + ++i; + } + } finally { + t.release(0); + } + } + else + tab = (Node[])fk; + } + else if ((fh & LOCKED) != 0) { + counter.add(delta); // opportunistically update count + delta = 0L; + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + for (Node e = f; e != null; e = e.next) { + if (e.val != null) { // (currently always true) + e.val = null; + --delta; + } + } + setTabAt(tab, i, null); + ++i; + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + } + } + if (delta != 0) + counter.add(delta); + } + + /* ----------------Table Traversal -------------- */ + + /** + * Encapsulates traversal for methods such as containsValue; also + * serves as a base class for other iterators and bulk tasks. + * + * At each step, the iterator snapshots the key ("nextKey") and + * value ("nextVal") of a valid node (i.e., one that, at point of + * snapshot, has a non-null user value). Because val fields can + * change (including to null, indicating deletion), field nextVal + * might not be accurate at point of use, but still maintains the + * weak consistency property of holding a value that was once + * valid. To support iterator.remove, the nextKey field is not + * updated (nulled out) when the iterator cannot advance. + * + * Internal traversals directly access these fields, as in: + * {@code while (it.advance() != null) { process(it.nextKey); }} + * + * Exported iterators must track whether the iterator has advanced + * (in hasNext vs next) (by setting/checking/nulling field + * nextVal), and then extract key, value, or key-value pairs as + * return values of next(). + * + * The iterator visits once each still-valid node that was + * reachable upon iterator construction. It might miss some that + * were added to a bin after the bin was visited, which is OK wrt + * consistency guarantees. Maintaining this property in the face + * of possible ongoing resizes requires a fair amount of + * bookkeeping state that is difficult to optimize away amidst + * volatile accesses. Even so, traversal maintains reasonable + * throughput. + * + * Normally, iteration proceeds bin-by-bin traversing lists. + * However, if the table has been resized, then all future steps + * must traverse both the bin at the current index as well as at + * (index + baseSize); and so on for further resizings. To + * paranoically cope with potential sharing by users of iterators + * across threads, iteration terminates if a bounds checks fails + * for a table read. + * + * This class extends ForkJoinTask to streamline parallel + * iteration in bulk operations (see BulkTask). This adds only an + * int of space overhead, which is close enough to negligible in + * cases where it is not needed to not worry about it. Because + * ForkJoinTask is Serializable, but iterators need not be, we + * need to add warning suppressions. + */ + @SuppressWarnings("serial") static class Traverser<K,V,R> { + final ConcurrentHashMapV8<K, V> map; + Node next; // the next entry to use + K nextKey; // cached key field of next + V nextVal; // cached val field of next + Node[] tab; // current table; updated if resized + int index; // index of bin to use next + int baseIndex; // current index of initial table + int baseLimit; // index bound for initial table + int baseSize; // initial table size + + /** Creates iterator for all entries in the table. */ + Traverser(ConcurrentHashMapV8<K, V> map) { + this.map = map; + } + + /** Creates iterator for split() methods */ + Traverser(Traverser<K,V,?> it) { + ConcurrentHashMapV8<K, V> m; Node[] t; + if ((m = this.map = it.map) == null) + t = null; + else if ((t = it.tab) == null && // force parent tab initialization + (t = it.tab = m.table) != null) + it.baseLimit = it.baseSize = t.length; + this.tab = t; + this.baseSize = it.baseSize; + it.baseLimit = this.index = this.baseIndex = + ((this.baseLimit = it.baseLimit) + it.baseIndex + 1) >>> 1; + } + + /** + * Advances next; returns nextVal or null if terminated. + * See above for explanation. + */ + final V advance() { + Node e = next; + V ev = null; + outer: do { + if (e != null) // advance past used/skipped node + e = e.next; + while (e == null) { // get to next non-null bin + ConcurrentHashMapV8<K, V> m; + Node[] t; int b, i, n; Object ek; // checks must use locals + if ((t = tab) != null) + n = t.length; + else if ((m = map) != null && (t = tab = m.table) != null) + n = baseLimit = baseSize = t.length; + else + break outer; + if ((b = baseIndex) >= baseLimit || + (i = index) < 0 || i >= n) + break outer; + if ((e = tabAt(t, i)) != null && e.hash == MOVED) { + if ((ek = e.key) instanceof TreeBin) + e = ((TreeBin)ek).first; + else { + tab = (Node[])ek; + continue; // restarts due to null val + } + } // visit upper slots if present + index = (i += baseSize) < n ? i : (baseIndex = b + 1); + } + nextKey = (K) e.key; + } while ((ev = (V) e.val) == null); // skip deleted or special nodes + next = e; + return nextVal = ev; + } + + public final void remove() { + Object k = nextKey; + if (k == null && (advance() == null || (k = nextKey) == null)) + throw new IllegalStateException(); + map.internalReplace(k, null, null); + } + + public final boolean hasNext() { + return nextVal != null || advance() != null; + } + + public final boolean hasMoreElements() { return hasNext(); } + public final void setRawResult(Object x) { } + public R getRawResult() { return null; } + public boolean exec() { return true; } + } + + /* ---------------- Public operations -------------- */ + + /** + * Creates a new, empty map with the default initial table size (16). + */ + public ConcurrentHashMapV8() { + this.counter = new LongAdder(); + } + + /** + * Creates a new, empty map with an initial table size + * accommodating the specified number of elements without the need + * to dynamically resize. + * + * @param initialCapacity The implementation performs internal + * sizing to accommodate this many elements. + * @throws IllegalArgumentException if the initial capacity of + * elements is negative + */ + public ConcurrentHashMapV8(int initialCapacity) { + if (initialCapacity < 0) + throw new IllegalArgumentException(); + int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? + MAXIMUM_CAPACITY : + tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1)); + this.counter = new LongAdder(); + this.sizeCtl = cap; + } + + /** + * Creates a new map with the same mappings as the given map. + * + * @param m the map + */ + public ConcurrentHashMapV8(Map<? extends K, ? extends V> m) { + this.counter = new LongAdder(); + this.sizeCtl = DEFAULT_CAPACITY; + internalPutAll(m); + } + + /** + * Creates a new, empty map with an initial table size based on + * the given number of elements ({@code initialCapacity}) and + * initial table density ({@code loadFactor}). + * + * @param initialCapacity the initial capacity. The implementation + * performs internal sizing to accommodate this many elements, + * given the specified load factor. + * @param loadFactor the load factor (table density) for + * establishing the initial table size + * @throws IllegalArgumentException if the initial capacity of + * elements is negative or the load factor is nonpositive + * + * @since 1.6 + */ + public ConcurrentHashMapV8(int initialCapacity, float loadFactor) { + this(initialCapacity, loadFactor, 1); + } + + /** + * Creates a new, empty map with an initial table size based on + * the given number of elements ({@code initialCapacity}), table + * density ({@code loadFactor}), and number of concurrently + * updating threads ({@code concurrencyLevel}). + * + * @param initialCapacity the initial capacity. The implementation + * performs internal sizing to accommodate this many elements, + * given the specified load factor. + * @param loadFactor the load factor (table density) for + * establishing the initial table size + * @param concurrencyLevel the estimated number of concurrently + * updating threads. The implementation may use this value as + * a sizing hint. + * @throws IllegalArgumentException if the initial capacity is + * negative or the load factor or concurrencyLevel are + * nonpositive + */ + public ConcurrentHashMapV8(int initialCapacity, + float loadFactor, int concurrencyLevel) { + if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0) + throw new IllegalArgumentException(); + if (initialCapacity < concurrencyLevel) // Use at least as many bins + initialCapacity = concurrencyLevel; // as estimated threads + long size = (long)(1.0 + (long)initialCapacity / loadFactor); + int cap = (size >= (long)MAXIMUM_CAPACITY) ? + MAXIMUM_CAPACITY : tableSizeFor((int)size); + this.counter = new LongAdder(); + this.sizeCtl = cap; + } + + /** + * Creates a new {@link Set} backed by a ConcurrentHashMapV8 + * from the given type to {@code Boolean.TRUE}. + * + * @return the new set + */ + public static <K> KeySetView<K,Boolean> newKeySet() { + return new KeySetView<K,Boolean>(new ConcurrentHashMapV8<K,Boolean>(), + Boolean.TRUE); + } + + /** + * Creates a new {@link Set} backed by a ConcurrentHashMapV8 + * from the given type to {@code Boolean.TRUE}. + * + * @param initialCapacity The implementation performs internal + * sizing to accommodate this many elements. + * @throws IllegalArgumentException if the initial capacity of + * elements is negative + * @return the new set + */ + public static <K> KeySetView<K,Boolean> newKeySet(int initialCapacity) { + return new KeySetView<K,Boolean>(new ConcurrentHashMapV8<K,Boolean>(initialCapacity), + Boolean.TRUE); + } + + /** + * {@inheritDoc} + */ + public boolean isEmpty() { + return counter.sum() <= 0L; // ignore transient negative values + } + + /** + * {@inheritDoc} + */ + public int size() { + long n = counter.sum(); + return ((n < 0L) ? 0 : + (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : + (int)n); + } + + /** + * Returns the number of mappings. This method should be used + * instead of {@link #size} because a ConcurrentHashMapV8 may + * contain more mappings than can be represented as an int. The + * value returned is a snapshot; the actual count may differ if + * there are ongoing concurrent insertions or removals. + * + * @return the number of mappings + */ + public long mappingCount() { + long n = counter.sum(); + return (n < 0L) ? 0L : n; // ignore transient negative values + } + + /** + * Returns the value to which the specified key is mapped, + * or {@code null} if this map contains no mapping for the key. + * + * <p>More formally, if this map contains a mapping from a key + * {@code k} to a value {@code v} such that {@code key.equals(k)}, + * then this method returns {@code v}; otherwise it returns + * {@code null}. (There can be at most one such mapping.) + * + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V get(Object key) { + if (key == null) + throw new NullPointerException(); + return (V)internalGet(key); + } + + /** + * Returns the value to which the specified key is mapped, + * or the given defaultValue if this map contains no mapping for the key. + * + * @param key the key + * @param defaultValue the value to return if this map contains + * no mapping for the given key + * @return the mapping for the key, if present; else the defaultValue + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V getValueOrDefault(Object key, V defaultValue) { + if (key == null) + throw new NullPointerException(); + V v = (V) internalGet(key); + return v == null ? defaultValue : v; + } + + /** + * Tests if the specified object is a key in this table. + * + * @param key possible key + * @return {@code true} if and only if the specified object + * is a key in this table, as determined by the + * {@code equals} method; {@code false} otherwise + * @throws NullPointerException if the specified key is null + */ + public boolean containsKey(Object key) { + if (key == null) + throw new NullPointerException(); + return internalGet(key) != null; + } + + /** + * Returns {@code true} if this map maps one or more keys to the + * specified value. Note: This method may require a full traversal + * of the map, and is much slower than method {@code containsKey}. + * + * @param value value whose presence in this map is to be tested + * @return {@code true} if this map maps one or more keys to the + * specified value + * @throws NullPointerException if the specified value is null + */ + public boolean containsValue(Object value) { + if (value == null) + throw new NullPointerException(); + Object v; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + while ((v = it.advance()) != null) { + if (v == value || value.equals(v)) + return true; + } + return false; + } + + public K findKey(Object value) { + if (value == null) + throw new NullPointerException(); + Object v; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + while ((v = it.advance()) != null) { + if (v == value || value.equals(v)) + return it.nextKey; + } + return null; + } + + /** + * Legacy method testing if some key maps into the specified value + * in this table. This method is identical in functionality to + * {@link #containsValue}, and exists solely to ensure + * full compatibility with class {@link java.util.Hashtable}, + * which supported this method prior to introduction of the + * Java Collections framework. + * + * @param value a value to search for + * @return {@code true} if and only if some key maps to the + * {@code value} argument in this table as + * determined by the {@code equals} method; + * {@code false} otherwise + * @throws NullPointerException if the specified value is null + */ + public boolean contains(Object value) { + return containsValue(value); + } + + /** + * Maps the specified key to the specified value in this table. + * Neither the key nor the value can be null. + * + * <p>The value can be retrieved by calling the {@code get} method + * with a key that is equal to the original key. + * + * @param key key with which the specified value is to be associated + * @param value value to be associated with the specified key + * @return the previous value associated with {@code key}, or + * {@code null} if there was no mapping for {@code key} + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V put(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalPut(key, value); + } + + /** + * {@inheritDoc} + * + * @return the previous value associated with the specified key, + * or {@code null} if there was no mapping for the key + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V putIfAbsent(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalPutIfAbsent(key, value); + } + + /** + * Copies all of the mappings from the specified map to this one. + * These mappings replace any mappings that this map had for any of the + * keys currently in the specified map. + * + * @param m mappings to be stored in this map + */ + public void putAll(Map<? extends K, ? extends V> m) { + internalPutAll(m); + } + + /** + * If the specified key is not already associated with a value, + * computes its value using the given mappingFunction and enters + * it into the map unless null. This is equivalent to + * <pre> {@code + * if (map.containsKey(key)) + * return map.get(key); + * value = mappingFunction.apply(key); + * if (value != null) + * map.put(key, value); + * return value;}</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null} no mapping is recorded. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and no mapping is recorded. Some + * attempted update operations on this map by other threads may be + * blocked while computation is in progress, so the computation + * should be short and simple, and must not attempt to update any + * other mappings of this Map. The most appropriate usage is to + * construct a new object serving as an initial mapped value, or + * memoized result, as in: + * + * <pre> {@code + * map.computeIfAbsent(key, new Fun<K, V>() { + * public V map(K k) { return new Value(f(k)); }});}</pre> + * + * @param key key with which the specified value is to be associated + * @param mappingFunction the function to compute a value + * @return the current (existing or computed) value associated with + * the specified key, or null if the computed value is null + * @throws NullPointerException if the specified key or mappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the mappingFunction does so, + * in which case the mapping is left unestablished + */ + @SuppressWarnings("unchecked") public V computeIfAbsent + (K key, Fun<? super K, ? extends V> mappingFunction) { + if (key == null || mappingFunction == null) + throw new NullPointerException(); + return (V)internalComputeIfAbsent(key, mappingFunction); + } + + /** + * If the given key is present, computes a new mapping value given a key and + * its current mapped value. This is equivalent to + * <pre> {@code + * if (map.containsKey(key)) { + * value = remappingFunction.apply(key, map.get(key)); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * } + * }</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. For example, + * to either create or append new messages to a value mapping: + * + * @param key key with which the specified value is to be associated + * @param remappingFunction the function to compute a value + * @return the new value associated with the specified key, or null if none + * @throws NullPointerException if the specified key or remappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the remappingFunction does so, + * in which case the mapping is unchanged + */ + @SuppressWarnings("unchecked") public V computeIfPresent + (K key, BiFun<? super K, ? super V, ? extends V> remappingFunction) { + if (key == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalCompute(key, true, remappingFunction); + } + + /** + * Computes a new mapping value given a key and + * its current mapped value (or {@code null} if there is no current + * mapping). This is equivalent to + * <pre> {@code + * value = remappingFunction.apply(key, map.get(key)); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * }</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. For example, + * to either create or append new messages to a value mapping: + * + * <pre> {@code + * Map<Key, String> map = ...; + * final String msg = ...; + * map.compute(key, new BiFun<Key, String, String>() { + * public String apply(Key k, String v) { + * return (v == null) ? msg : v + msg;});}}</pre> + * + * @param key key with which the specified value is to be associated + * @param remappingFunction the function to compute a value + * @return the new value associated with the specified key, or null if none + * @throws NullPointerException if the specified key or remappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the remappingFunction does so, + * in which case the mapping is unchanged + */ + @SuppressWarnings("unchecked") public V compute + (K key, BiFun<? super K, ? super V, ? extends V> remappingFunction) { + if (key == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalCompute(key, false, remappingFunction); + } + + /** + * If the specified key is not already associated + * with a value, associate it with the given value. + * Otherwise, replace the value with the results of + * the given remapping function. This is equivalent to: + * <pre> {@code + * if (!map.containsKey(key)) + * map.put(value); + * else { + * newValue = remappingFunction.apply(map.get(key), value); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * } + * }</pre> + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. + */ + @SuppressWarnings("unchecked") public V merge + (K key, V value, BiFun<? super V, ? super V, ? extends V> remappingFunction) { + if (key == null || value == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalMerge(key, value, remappingFunction); + } + + /** + * Removes the key (and its corresponding value) from this map. + * This method does nothing if the key is not in the map. + * + * @param key the key that needs to be removed + * @return the previous value associated with {@code key}, or + * {@code null} if there was no mapping for {@code key} + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V remove(Object key) { + if (key == null) + throw new NullPointerException(); + return (V)internalReplace(key, null, null); + } + + /** + * {@inheritDoc} + * + * @throws NullPointerException if the specified key is null + */ + public boolean remove(Object key, Object value) { + if (key == null) + throw new NullPointerException(); + if (value == null) + return false; + return internalReplace(key, null, value) != null; + } + + /** + * {@inheritDoc} + * + * @throws NullPointerException if any of the arguments are null + */ + public boolean replace(K key, V oldValue, V newValue) { + if (key == null || oldValue == null || newValue == null) + throw new NullPointerException(); + return internalReplace(key, newValue, oldValue) != null; + } + + /** + * {@inheritDoc} + * + * @return the previous value associated with the specified key, + * or {@code null} if there was no mapping for the key + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V replace(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalReplace(key, value, null); + } + + /** + * Removes all of the mappings from this map. + */ + public void clear() { + internalClear(); + } + + /** + * Returns a {@link Set} view of the keys contained in this map. + * The set is backed by the map, so changes to the map are + * reflected in the set, and vice-versa. + * + * @return the set view + */ + public KeySetView<K,V> keySet() { + KeySetView<K,V> ks = keySet; + return (ks != null) ? ks : (keySet = new KeySetView<K,V>(this, null)); + } + + /** + * Returns a {@link Set} view of the keys in this map, using the + * given common mapped value for any additions (i.e., {@link + * Collection#add} and {@link Collection#addAll}). This is of + * course only appropriate if it is acceptable to use the same + * value for all additions from this view. + * + * @param mappedValue the mapped value to use for any + * additions. + * @return the set view + * @throws NullPointerException if the mappedValue is null + */ + public KeySetView<K,V> keySet(V mappedValue) { + if (mappedValue == null) + throw new NullPointerException(); + return new KeySetView<K,V>(this, mappedValue); + } + + /** + * Returns a {@link Collection} view of the values contained in this map. + * The collection is backed by the map, so changes to the map are + * reflected in the collection, and vice-versa. + */ + public ValuesView<K,V> values() { + ValuesView<K,V> vs = values; + return (vs != null) ? vs : (values = new ValuesView<K,V>(this)); + } + + /** + * Returns a {@link Set} view of the mappings contained in this map. + * The set is backed by the map, so changes to the map are + * reflected in the set, and vice-versa. The set supports element + * removal, which removes the corresponding mapping from the map, + * via the {@code Iterator.remove}, {@code Set.remove}, + * {@code removeAll}, {@code retainAll}, and {@code clear} + * operations. It does not support the {@code add} or + * {@code addAll} operations. + * + * <p>The view's {@code iterator} is a "weakly consistent" iterator + * that will never throw {@link ConcurrentModificationException}, + * and guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not guaranteed to) + * reflect any modifications subsequent to construction. + */ + public Set<Map.Entry<K,V>> entrySet() { + EntrySetView<K,V> es = entrySet; + return (es != null) ? es : (entrySet = new EntrySetView<K,V>(this)); + } + + /** + * Returns an enumeration of the keys in this table. + * + * @return an enumeration of the keys in this table + * @see #keySet() + */ + public Enumeration<K> keys() { + return new KeyIterator<K,V>(this); + } + + /** + * Returns an enumeration of the values in this table. + * + * @return an enumeration of the values in this table + * @see #values() + */ + public Enumeration<V> elements() { + return new ValueIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the keys in this map. + * + * @return a partitionable iterator of the keys in this map + */ + public Spliterator<K> keySpliterator() { + return new KeyIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the values in this map. + * + * @return a partitionable iterator of the values in this map + */ + public Spliterator<V> valueSpliterator() { + return new ValueIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the entries in this map. + * + * @return a partitionable iterator of the entries in this map + */ + public Spliterator<Map.Entry<K,V>> entrySpliterator() { + return new EntryIterator<K,V>(this); + } + + /** + * Returns the hash code value for this {@link Map}, i.e., + * the sum of, for each key-value pair in the map, + * {@code key.hashCode() ^ value.hashCode()}. + * + * @return the hash code value for this map + */ + public int hashCode() { + int h = 0; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object v; + while ((v = it.advance()) != null) { + h += it.nextKey.hashCode() ^ v.hashCode(); + } + return h; + } + + /** + * Returns a string representation of this map. The string + * representation consists of a list of key-value mappings (in no + * particular order) enclosed in braces ("{@code {}}"). Adjacent + * mappings are separated by the characters {@code ", "} (comma + * and space). Each key-value mapping is rendered as the key + * followed by an equals sign ("{@code =}") followed by the + * associated value. + * + * @return a string representation of this map + */ + public String toString() { + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + StringBuilder sb = new StringBuilder(); + sb.append('{'); + Object v; + if ((v = it.advance()) != null) { + for (;;) { + Object k = it.nextKey; + sb.append(k == this ? "(this Map)" : k); + sb.append('='); + sb.append(v == this ? "(this Map)" : v); + if ((v = it.advance()) == null) + break; + sb.append(',').append(' '); + } + } + return sb.append('}').toString(); + } + + /** + * Compares the specified object with this map for equality. + * Returns {@code true} if the given object is a map with the same + * mappings as this map. This operation may return misleading + * results if either map is concurrently modified during execution + * of this method. + * + * @param o object to be compared for equality with this map + * @return {@code true} if the specified object is equal to this map + */ + public boolean equals(Object o) { + if (o != this) { + if (!(o instanceof Map)) + return false; + Map<?,?> m = (Map<?,?>) o; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object val; + while ((val = it.advance()) != null) { + Object v = m.get(it.nextKey); + if (v == null || (v != val && !v.equals(val))) + return false; + } + for (Map.Entry<?,?> e : m.entrySet()) { + Object mk, mv, v; + if ((mk = e.getKey()) == null || + (mv = e.getValue()) == null || + (v = internalGet(mk)) == null || + (mv != v && !mv.equals(v))) + return false; + } + } + return true; + } + + /* ----------------Iterators -------------- */ + + @SuppressWarnings("serial") static final class KeyIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<K>, Enumeration<K> { + KeyIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + KeyIterator(Traverser<K,V,Object> it) { + super(it); + } + public KeyIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new KeyIterator<K,V>(this); + } + @SuppressWarnings("unchecked") public final K next() { + if (nextVal == null && advance() == null) + throw new NoSuchElementException(); + Object k = nextKey; + nextVal = null; + return (K) k; + } + + public final K nextElement() { return next(); } + } + + @SuppressWarnings("serial") static final class ValueIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<V>, Enumeration<V> { + ValueIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + ValueIterator(Traverser<K,V,Object> it) { + super(it); + } + public ValueIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new ValueIterator<K,V>(this); + } + + @SuppressWarnings("unchecked") public final V next() { + Object v; + if ((v = nextVal) == null && (v = advance()) == null) + throw new NoSuchElementException(); + nextVal = null; + return (V) v; + } + + public final V nextElement() { return next(); } + } + + @SuppressWarnings("serial") static final class EntryIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<Map.Entry<K,V>> { + EntryIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + EntryIterator(Traverser<K,V,Object> it) { + super(it); + } + public EntryIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new EntryIterator<K,V>(this); + } + + @SuppressWarnings("unchecked") public final Map.Entry<K,V> next() { + Object v; + if ((v = nextVal) == null && (v = advance()) == null) + throw new NoSuchElementException(); + Object k = nextKey; + nextVal = null; + return new MapEntry<K,V>((K)k, (V)v, map); + } + } + + /** + * Exported Entry for iterators + */ + static final class MapEntry<K,V> implements Map.Entry<K, V> { + final K key; // non-null + V val; // non-null + final ConcurrentHashMapV8<K, V> map; + MapEntry(K key, V val, ConcurrentHashMapV8<K, V> map) { + this.key = key; + this.val = val; + this.map = map; + } + public final K getKey() { return key; } + public final V getValue() { return val; } + public final int hashCode() { return key.hashCode() ^ val.hashCode(); } + public final String toString(){ return key + "=" + val; } + + public final boolean equals(Object o) { + Object k, v; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (v = e.getValue()) != null && + (k == key || k.equals(key)) && + (v == val || v.equals(val))); + } + + /** + * Sets our entry's value and writes through to the map. The + * value to return is somewhat arbitrary here. Since we do not + * necessarily track asynchronous changes, the most recent + * "previous" value could be different from what we return (or + * could even have been removed in which case the put will + * re-establish). We do not and cannot guarantee more. + */ + public final V setValue(V value) { + if (value == null) throw new NullPointerException(); + V v = val; + val = value; + map.put(key, value); + return v; + } + } + + /* ---------------- Serialization Support -------------- */ + + /** + * Stripped-down version of helper class used in previous version, + * declared for the sake of serialization compatibility + */ + static class Segment<K,V> implements Serializable { + private static final long serialVersionUID = 2249069246763182397L; + final float loadFactor; + Segment(float lf) { this.loadFactor = lf; } + } + + /** + * Saves the state of the {@code ConcurrentHashMapV8} instance to a + * stream (i.e., serializes it). + * @param s the stream + * @serialData + * the key (Object) and value (Object) + * for each key-value mapping, followed by a null pair. + * The key-value mappings are emitted in no particular order. + */ + @SuppressWarnings("unchecked") private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException { + if (segments == null) { // for serialization compatibility + segments = (Segment<K,V>[]) + new Segment<?,?>[DEFAULT_CONCURRENCY_LEVEL]; + for (int i = 0; i < segments.length; ++i) + segments[i] = new Segment<K,V>(LOAD_FACTOR); + } + s.defaultWriteObject(); + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object v; + while ((v = it.advance()) != null) { + s.writeObject(it.nextKey); + s.writeObject(v); + } + s.writeObject(null); + s.writeObject(null); + segments = null; // throw away + } + + /** + * Reconstitutes the instance from a stream (that is, deserializes it). + * @param s the stream + */ + @SuppressWarnings("unchecked") private void readObject(java.io.ObjectInputStream s) + throws java.io.IOException, ClassNotFoundException { + s.defaultReadObject(); + this.segments = null; // unneeded + // initialize transient final field + UNSAFE.putObjectVolatile(this, counterOffset, new LongAdder()); + + // Create all nodes, then place in table once size is known + long size = 0L; + Node p = null; + for (;;) { + K k = (K) s.readObject(); + V v = (V) s.readObject(); + if (k != null && v != null) { + int h = spread(k.hashCode()); + p = new Node(h, k, v, p); + ++size; + } + else + break; + } + if (p != null) { + boolean init = false; + int n; + if (size >= (long)(MAXIMUM_CAPACITY >>> 1)) + n = MAXIMUM_CAPACITY; + else { + int sz = (int)size; + n = tableSizeFor(sz + (sz >>> 1) + 1); + } + int sc = sizeCtl; + boolean collide = false; + if (n > sc && + UNSAFE.compareAndSwapInt(this, sizeCtlOffset, sc, -1)) { + try { + if (table == null) { + init = true; + Node[] tab = new Node[n]; + int mask = n - 1; + while (p != null) { + int j = p.hash & mask; + Node next = p.next; + Node q = p.next = tabAt(tab, j); + setTabAt(tab, j, p); + if (!collide && q != null && q.hash == p.hash) + collide = true; + p = next; + } + table = tab; + counter.add(size); + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + if (collide) { // rescan and convert to TreeBins + Node[] tab = table; + for (int i = 0; i < tab.length; ++i) { + int c = 0; + for (Node e = tabAt(tab, i); e != null; e = e.next) { + if (++c > TREE_THRESHOLD && + (e.key instanceof Comparable)) { + replaceWithTreeBin(tab, i, e.key); + break; + } + } + } + } + } + if (!init) { // Can only happen if unsafely published. + while (p != null) { + internalPut(p.key, p.val); + p = p.next; + } + } + } + } + + + // ------------------------------------------------------- + + // Sams + /** Interface describing a void action of one argument */ + public interface Action<A> { void apply(A a); } + /** Interface describing a void action of two arguments */ + public interface BiAction<A,B> { void apply(A a, B b); } + /** Interface describing a function of one argument */ + public interface Generator<T> { T apply(); } + /** Interface describing a function mapping its argument to a double */ + public interface ObjectToDouble<A> { double apply(A a); } + /** Interface describing a function mapping its argument to a long */ + public interface ObjectToLong<A> { long apply(A a); } + /** Interface describing a function mapping its argument to an int */ + public interface ObjectToInt<A> {int apply(A a); } + /** Interface describing a function mapping two arguments to a double */ + public interface ObjectByObjectToDouble<A,B> { double apply(A a, B b); } + /** Interface describing a function mapping two arguments to a long */ + public interface ObjectByObjectToLong<A,B> { long apply(A a, B b); } + /** Interface describing a function mapping two arguments to an int */ + public interface ObjectByObjectToInt<A,B> {int apply(A a, B b); } + /** Interface describing a function mapping a double to a double */ + public interface DoubleToDouble { double apply(double a); } + /** Interface describing a function mapping a long to a long */ + public interface LongToLong { long apply(long a); } + /** Interface describing a function mapping an int to an int */ + public interface IntToInt { int apply(int a); } + /** Interface describing a function mapping two doubles to a double */ + public interface DoubleByDoubleToDouble { double apply(double a, double b); } + /** Interface describing a function mapping two longs to a long */ + public interface LongByLongToLong { long apply(long a, long b); } + /** Interface describing a function mapping two ints to an int */ + public interface IntByIntToInt { int apply(int a, int b); } + + + /* ----------------Views -------------- */ + + /** + * Base class for views. + */ + static abstract class CHMView<K, V> { + final ConcurrentHashMapV8<K, V> map; + CHMView(ConcurrentHashMapV8<K, V> map) { this.map = map; } + + /** + * Returns the map backing this view. + * + * @return the map backing this view + */ + public ConcurrentHashMapV8<K,V> getMap() { return map; } + + public final int size() { return map.size(); } + public final boolean isEmpty() { return map.isEmpty(); } + public final void clear() { map.clear(); } + + // implementations below rely on concrete classes supplying these + abstract public Iterator<?> iterator(); + abstract public boolean contains(Object o); + abstract public boolean remove(Object o); + + private static final String oomeMsg = "Required array size too large"; + + public final Object[] toArray() { + long sz = map.mappingCount(); + if (sz > (long)(MAX_ARRAY_SIZE)) + throw new OutOfMemoryError(oomeMsg); + int n = (int)sz; + Object[] r = new Object[n]; + int i = 0; + Iterator<?> it = iterator(); + while (it.hasNext()) { + if (i == n) { + if (n >= MAX_ARRAY_SIZE) + throw new OutOfMemoryError(oomeMsg); + if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) + n = MAX_ARRAY_SIZE; + else + n += (n >>> 1) + 1; + r = Arrays.copyOf(r, n); + } + r[i++] = it.next(); + } + return (i == n) ? r : Arrays.copyOf(r, i); + } + + @SuppressWarnings("unchecked") public final <T> T[] toArray(T[] a) { + long sz = map.mappingCount(); + if (sz > (long)(MAX_ARRAY_SIZE)) + throw new OutOfMemoryError(oomeMsg); + int m = (int)sz; + T[] r = (a.length >= m) ? a : + (T[])java.lang.reflect.Array + .newInstance(a.getClass().getComponentType(), m); + int n = r.length; + int i = 0; + Iterator<?> it = iterator(); + while (it.hasNext()) { + if (i == n) { + if (n >= MAX_ARRAY_SIZE) + throw new OutOfMemoryError(oomeMsg); + if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) + n = MAX_ARRAY_SIZE; + else + n += (n >>> 1) + 1; + r = Arrays.copyOf(r, n); + } + r[i++] = (T)it.next(); + } + if (a == r && i < n) { + r[i] = null; // null-terminate + return r; + } + return (i == n) ? r : Arrays.copyOf(r, i); + } + + public final int hashCode() { + int h = 0; + for (Iterator<?> it = iterator(); it.hasNext();) + h += it.next().hashCode(); + return h; + } + + public final String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + Iterator<?> it = iterator(); + if (it.hasNext()) { + for (;;) { + Object e = it.next(); + sb.append(e == this ? "(this Collection)" : e); + if (!it.hasNext()) + break; + sb.append(',').append(' '); + } + } + return sb.append(']').toString(); + } + + public final boolean containsAll(Collection<?> c) { + if (c != this) { + for (Iterator<?> it = c.iterator(); it.hasNext();) { + Object e = it.next(); + if (e == null || !contains(e)) + return false; + } + } + return true; + } + + public final boolean removeAll(Collection<?> c) { + boolean modified = false; + for (Iterator<?> it = iterator(); it.hasNext();) { + if (c.contains(it.next())) { + it.remove(); + modified = true; + } + } + return modified; + } + + public final boolean retainAll(Collection<?> c) { + boolean modified = false; + for (Iterator<?> it = iterator(); it.hasNext();) { + if (!c.contains(it.next())) { + it.remove(); + modified = true; + } + } + return modified; + } + + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Set} of keys, in + * which additions may optionally be enabled by mapping to a + * common value. This class cannot be directly instantiated. See + * {@link #keySet}, {@link #keySet(Object)}, {@link #newKeySet()}, + * {@link #newKeySet(int)}. + */ + public static class KeySetView<K,V> extends CHMView<K,V> implements Set<K>, java.io.Serializable { + private static final long serialVersionUID = 7249069246763182397L; + private final V value; + KeySetView(ConcurrentHashMapV8<K, V> map, V value) { // non-public + super(map); + this.value = value; + } + + /** + * Returns the default mapped value for additions, + * or {@code null} if additions are not supported. + * + * @return the default mapped value for additions, or {@code null} + * if not supported. + */ + public V getMappedValue() { return value; } + + // implement Set API + + public boolean contains(Object o) { return map.containsKey(o); } + public boolean remove(Object o) { return map.remove(o) != null; } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the keys of this map + */ + public Iterator<K> iterator() { return new KeyIterator<K,V>(map); } + public boolean add(K e) { + V v; + if ((v = value) == null) + throw new UnsupportedOperationException(); + if (e == null) + throw new NullPointerException(); + return map.internalPutIfAbsent(e, v) == null; + } + public boolean addAll(Collection<? extends K> c) { + boolean added = false; + V v; + if ((v = value) == null) + throw new UnsupportedOperationException(); + for (K e : c) { + if (e == null) + throw new NullPointerException(); + if (map.internalPutIfAbsent(e, v) == null) + added = true; + } + return added; + } + public boolean equals(Object o) { + Set<?> c; + return ((o instanceof Set) && + ((c = (Set<?>)o) == this || + (containsAll(c) && c.containsAll(this)))); + } + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Collection} of + * values, in which additions are disabled. This class cannot be + * directly instantiated. See {@link #values}, + * + * <p>The view's {@code iterator} is a "weakly consistent" iterator + * that will never throw {@link ConcurrentModificationException}, + * and guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not guaranteed to) + * reflect any modifications subsequent to construction. + */ + public static final class ValuesView<K,V> extends CHMView<K,V> + implements Collection<V> { + ValuesView(ConcurrentHashMapV8<K, V> map) { super(map); } + public final boolean contains(Object o) { return map.containsValue(o); } + public final boolean remove(Object o) { + if (o != null) { + Iterator<V> it = new ValueIterator<K,V>(map); + while (it.hasNext()) { + if (o.equals(it.next())) { + it.remove(); + return true; + } + } + } + return false; + } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the values of this map + */ + public final Iterator<V> iterator() { + return new ValueIterator<K,V>(map); + } + public final boolean add(V e) { + throw new UnsupportedOperationException(); + } + public final boolean addAll(Collection<? extends V> c) { + throw new UnsupportedOperationException(); + } + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Set} of (key, value) + * entries. This class cannot be directly instantiated. See + * {@link #entrySet}. + */ + public static final class EntrySetView<K,V> extends CHMView<K,V> + implements Set<Map.Entry<K,V>> { + EntrySetView(ConcurrentHashMapV8<K, V> map) { super(map); } + public final boolean contains(Object o) { + Object k, v, r; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (r = map.get(k)) != null && + (v = e.getValue()) != null && + (v == r || v.equals(r))); + } + public final boolean remove(Object o) { + Object k, v; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (v = e.getValue()) != null && + map.remove(k, v)); + } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the entries of this map + */ + public final Iterator<Map.Entry<K,V>> iterator() { + return new EntryIterator<K,V>(map); + } + + public final boolean add(Entry<K,V> e) { + K key = e.getKey(); + V value = e.getValue(); + if (key == null || value == null) + throw new NullPointerException(); + return map.internalPut(key, value) == null; + } + public final boolean addAll(Collection<? extends Entry<K,V>> c) { + boolean added = false; + for (Entry<K,V> e : c) { + if (add(e)) + added = true; + } + return added; + } + public boolean equals(Object o) { + Set<?> c; + return ((o instanceof Set) && + ((c = (Set<?>)o) == this || + (containsAll(c) && c.containsAll(this)))); + } + } + + // Unsafe mechanics + private static final sun.misc.Unsafe UNSAFE; + private static final long counterOffset; + private static final long sizeCtlOffset; + private static final long ABASE; + private static final int ASHIFT; + + static { + int ss; + try { + UNSAFE = getUnsafe(); + Class<?> k = ConcurrentHashMapV8.class; + counterOffset = UNSAFE.objectFieldOffset + (k.getDeclaredField("counter")); + sizeCtlOffset = UNSAFE.objectFieldOffset + (k.getDeclaredField("sizeCtl")); + Class<?> sc = Node[].class; + ABASE = UNSAFE.arrayBaseOffset(sc); + ss = UNSAFE.arrayIndexScale(sc); + } catch (Exception e) { + throw new Error(e); + } + if ((ss & (ss-1)) != 0) + throw new Error("data type scale not a power of two"); + ASHIFT = 31 - Integer.numberOfLeadingZeros(ss); + } + + /** + * Returns a sun.misc.Unsafe. Suitable for use in a 3rd party package. + * Replace with a simple call to Unsafe.getUnsafe when integrating + * into a jdk. + * + * @return a sun.misc.Unsafe + */ + private static sun.misc.Unsafe getUnsafe() { + try { + return sun.misc.Unsafe.getUnsafe(); + } catch (SecurityException se) { + try { + return java.security.AccessController.doPrivileged + (new java.security + .PrivilegedExceptionAction<sun.misc.Unsafe>() { + public sun.misc.Unsafe run() throws Exception { + java.lang.reflect.Field f = sun.misc + .Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + return (sun.misc.Unsafe) f.get(null); + }}); + } catch (java.security.PrivilegedActionException e) { + throw new RuntimeException("Could not initialize intrinsics", + e.getCause()); + } + } + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/LongAdder.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/LongAdder.java new file mode 100644 index 000000000000..22d0cbc956b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/LongAdder.java @@ -0,0 +1,203 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.9 version. + +package org.jruby.ext.thread_safe.jsr166e; +import java.util.concurrent.atomic.AtomicLong; +import java.io.IOException; +import java.io.Serializable; +import java.io.ObjectInputStream; + +/** + * One or more variables that together maintain an initially zero + * {@code long} sum. When updates (method {@link #add}) are contended + * across threads, the set of variables may grow dynamically to reduce + * contention. Method {@link #sum} (or, equivalently, {@link + * #longValue}) returns the current total combined across the + * variables maintaining the sum. + * + * <p>This class is usually preferable to {@link AtomicLong} when + * multiple threads update a common sum that is used for purposes such + * as collecting statistics, not for fine-grained synchronization + * control. Under low update contention, the two classes have similar + * characteristics. But under high contention, expected throughput of + * this class is significantly higher, at the expense of higher space + * consumption. + * + * <p>This class extends {@link Number}, but does <em>not</em> define + * methods such as {@code hashCode} and {@code compareTo} because + * instances are expected to be mutated, and so are not useful as + * collection keys. + * + * <p><em>jsr166e note: This class is targeted to be placed in + * java.util.concurrent.atomic.</em> + * + * @since 1.8 + * @author Doug Lea + */ +public class LongAdder extends Striped64 implements Serializable { + private static final long serialVersionUID = 7249069246863182397L; + + /** + * Version of plus for use in retryUpdate + */ + final long fn(long v, long x) { return v + x; } + + /** + * Creates a new adder with initial sum of zero. + */ + public LongAdder() { + } + + /** + * Adds the given value. + * + * @param x the value to add + */ + public void add(long x) { + Cell[] as; long b, v; HashCode hc; Cell a; int n; + if ((as = cells) != null || !casBase(b = base, b + x)) { + boolean uncontended = true; + int h = (hc = threadHashCode.get()).code; + if (as == null || (n = as.length) < 1 || + (a = as[(n - 1) & h]) == null || + !(uncontended = a.cas(v = a.value, v + x))) + retryUpdate(x, hc, uncontended); + } + } + + /** + * Equivalent to {@code add(1)}. + */ + public void increment() { + add(1L); + } + + /** + * Equivalent to {@code add(-1)}. + */ + public void decrement() { + add(-1L); + } + + /** + * Returns the current sum. The returned value is <em>NOT</em> an + * atomic snapshot: Invocation in the absence of concurrent + * updates returns an accurate result, but concurrent updates that + * occur while the sum is being calculated might not be + * incorporated. + * + * @return the sum + */ + public long sum() { + long sum = base; + Cell[] as = cells; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) + sum += a.value; + } + } + return sum; + } + + /** + * Resets variables maintaining the sum to zero. This method may + * be a useful alternative to creating a new adder, but is only + * effective if there are no concurrent updates. Because this + * method is intrinsically racy, it should only be used when it is + * known that no threads are concurrently updating. + */ + public void reset() { + internalReset(0L); + } + + /** + * Equivalent in effect to {@link #sum} followed by {@link + * #reset}. This method may apply for example during quiescent + * points between multithreaded computations. If there are + * updates concurrent with this method, the returned value is + * <em>not</em> guaranteed to be the final value occurring before + * the reset. + * + * @return the sum + */ + public long sumThenReset() { + long sum = base; + Cell[] as = cells; + base = 0L; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) { + sum += a.value; + a.value = 0L; + } + } + } + return sum; + } + + /** + * Returns the String representation of the {@link #sum}. + * @return the String representation of the {@link #sum} + */ + public String toString() { + return Long.toString(sum()); + } + + /** + * Equivalent to {@link #sum}. + * + * @return the sum + */ + public long longValue() { + return sum(); + } + + /** + * Returns the {@link #sum} as an {@code int} after a narrowing + * primitive conversion. + */ + public int intValue() { + return (int)sum(); + } + + /** + * Returns the {@link #sum} as a {@code float} + * after a widening primitive conversion. + */ + public float floatValue() { + return (float)sum(); + } + + /** + * Returns the {@link #sum} as a {@code double} after a widening + * primitive conversion. + */ + public double doubleValue() { + return (double)sum(); + } + + private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException { + s.defaultWriteObject(); + s.writeLong(sum()); + } + + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + busy = 0; + cells = null; + base = s.readLong(); + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/Striped64.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/Striped64.java new file mode 100644 index 000000000000..8651cdcb552b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/Striped64.java @@ -0,0 +1,342 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.5 version. + +package org.jruby.ext.thread_safe.jsr166e; +import java.util.Random; + +/** + * A package-local class holding common representation and mechanics + * for classes supporting dynamic striping on 64bit values. The class + * extends Number so that concrete subclasses must publicly do so. + */ +abstract class Striped64 extends Number { + /* + * This class maintains a lazily-initialized table of atomically + * updated variables, plus an extra "base" field. The table size + * is a power of two. Indexing uses masked per-thread hash codes. + * Nearly all declarations in this class are package-private, + * accessed directly by subclasses. + * + * Table entries are of class Cell; a variant of AtomicLong padded + * to reduce cache contention on most processors. Padding is + * overkill for most Atomics because they are usually irregularly + * scattered in memory and thus don't interfere much with each + * other. But Atomic objects residing in arrays will tend to be + * placed adjacent to each other, and so will most often share + * cache lines (with a huge negative performance impact) without + * this precaution. + * + * In part because Cells are relatively large, we avoid creating + * them until they are needed. When there is no contention, all + * updates are made to the base field. Upon first contention (a + * failed CAS on base update), the table is initialized to size 2. + * The table size is doubled upon further contention until + * reaching the nearest power of two greater than or equal to the + * number of CPUS. Table slots remain empty (null) until they are + * needed. + * + * A single spinlock ("busy") is used for initializing and + * resizing the table, as well as populating slots with new Cells. + * There is no need for a blocking lock: When the lock is not + * available, threads try other slots (or the base). During these + * retries, there is increased contention and reduced locality, + * which is still better than alternatives. + * + * Per-thread hash codes are initialized to random values. + * Contention and/or table collisions are indicated by failed + * CASes when performing an update operation (see method + * retryUpdate). Upon a collision, if the table size is less than + * the capacity, it is doubled in size unless some other thread + * holds the lock. If a hashed slot is empty, and lock is + * available, a new Cell is created. Otherwise, if the slot + * exists, a CAS is tried. Retries proceed by "double hashing", + * using a secondary hash (Marsaglia XorShift) to try to find a + * free slot. + * + * The table size is capped because, when there are more threads + * than CPUs, supposing that each thread were bound to a CPU, + * there would exist a perfect hash function mapping threads to + * slots that eliminates collisions. When we reach capacity, we + * search for this mapping by randomly varying the hash codes of + * colliding threads. Because search is random, and collisions + * only become known via CAS failures, convergence can be slow, + * and because threads are typically not bound to CPUS forever, + * may not occur at all. However, despite these limitations, + * observed contention rates are typically low in these cases. + * + * It is possible for a Cell to become unused when threads that + * once hashed to it terminate, as well as in the case where + * doubling the table causes no thread to hash to it under + * expanded mask. We do not try to detect or remove such cells, + * under the assumption that for long-running instances, observed + * contention levels will recur, so the cells will eventually be + * needed again; and for short-lived ones, it does not matter. + */ + + /** + * Padded variant of AtomicLong supporting only raw accesses plus CAS. + * The value field is placed between pads, hoping that the JVM doesn't + * reorder them. + * + * JVM intrinsics note: It would be possible to use a release-only + * form of CAS here, if it were provided. + */ + static final class Cell { + volatile long p0, p1, p2, p3, p4, p5, p6; + volatile long value; + volatile long q0, q1, q2, q3, q4, q5, q6; + Cell(long x) { value = x; } + + final boolean cas(long cmp, long val) { + return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); + } + + // Unsafe mechanics + private static final sun.misc.Unsafe UNSAFE; + private static final long valueOffset; + static { + try { + UNSAFE = getUnsafe(); + Class<?> ak = Cell.class; + valueOffset = UNSAFE.objectFieldOffset + (ak.getDeclaredField("value")); + } catch (Exception e) { + throw new Error(e); + } + } + + } + + /** + * Holder for the thread-local hash code. The code is initially + * random, but may be set to a different value upon collisions. + */ + static final class HashCode { + static final Random rng = new Random(); + int code; + HashCode() { + int h = rng.nextInt(); // Avoid zero to allow xorShift rehash + code = (h == 0) ? 1 : h; + } + } + + /** + * The corresponding ThreadLocal class + */ + static final class ThreadHashCode extends ThreadLocal<HashCode> { + public HashCode initialValue() { return new HashCode(); } + } + + /** + * Static per-thread hash codes. Shared across all instances to + * reduce ThreadLocal pollution and because adjustments due to + * collisions in one table are likely to be appropriate for + * others. + */ + static final ThreadHashCode threadHashCode = new ThreadHashCode(); + + /** Number of CPUS, to place bound on table size */ + static final int NCPU = Runtime.getRuntime().availableProcessors(); + + /** + * Table of cells. When non-null, size is a power of 2. + */ + transient volatile Cell[] cells; + + /** + * Base value, used mainly when there is no contention, but also as + * a fallback during table initialization races. Updated via CAS. + */ + transient volatile long base; + + /** + * Spinlock (locked via CAS) used when resizing and/or creating Cells. + */ + transient volatile int busy; + + /** + * Package-private default constructor + */ + Striped64() { + } + + /** + * CASes the base field. + */ + final boolean casBase(long cmp, long val) { + return UNSAFE.compareAndSwapLong(this, baseOffset, cmp, val); + } + + /** + * CASes the busy field from 0 to 1 to acquire lock. + */ + final boolean casBusy() { + return UNSAFE.compareAndSwapInt(this, busyOffset, 0, 1); + } + + /** + * Computes the function of current and new value. Subclasses + * should open-code this update function for most uses, but the + * virtualized form is needed within retryUpdate. + * + * @param currentValue the current value (of either base or a cell) + * @param newValue the argument from a user update call + * @return result of the update function + */ + abstract long fn(long currentValue, long newValue); + + /** + * Handles cases of updates involving initialization, resizing, + * creating new Cells, and/or contention. See above for + * explanation. This method suffers the usual non-modularity + * problems of optimistic retry code, relying on rechecked sets of + * reads. + * + * @param x the value + * @param hc the hash code holder + * @param wasUncontended false if CAS failed before call + */ + final void retryUpdate(long x, HashCode hc, boolean wasUncontended) { + int h = hc.code; + boolean collide = false; // True if last slot nonempty + for (;;) { + Cell[] as; Cell a; int n; long v; + if ((as = cells) != null && (n = as.length) > 0) { + if ((a = as[(n - 1) & h]) == null) { + if (busy == 0) { // Try to attach new Cell + Cell r = new Cell(x); // Optimistically create + if (busy == 0 && casBusy()) { + boolean created = false; + try { // Recheck under lock + Cell[] rs; int m, j; + if ((rs = cells) != null && + (m = rs.length) > 0 && + rs[j = (m - 1) & h] == null) { + rs[j] = r; + created = true; + } + } finally { + busy = 0; + } + if (created) + break; + continue; // Slot is now non-empty + } + } + collide = false; + } + else if (!wasUncontended) // CAS already known to fail + wasUncontended = true; // Continue after rehash + else if (a.cas(v = a.value, fn(v, x))) + break; + else if (n >= NCPU || cells != as) + collide = false; // At max size or stale + else if (!collide) + collide = true; + else if (busy == 0 && casBusy()) { + try { + if (cells == as) { // Expand table unless stale + Cell[] rs = new Cell[n << 1]; + for (int i = 0; i < n; ++i) + rs[i] = as[i]; + cells = rs; + } + } finally { + busy = 0; + } + collide = false; + continue; // Retry with expanded table + } + h ^= h << 13; // Rehash + h ^= h >>> 17; + h ^= h << 5; + } + else if (busy == 0 && cells == as && casBusy()) { + boolean init = false; + try { // Initialize table + if (cells == as) { + Cell[] rs = new Cell[2]; + rs[h & 1] = new Cell(x); + cells = rs; + init = true; + } + } finally { + busy = 0; + } + if (init) + break; + } + else if (casBase(v = base, fn(v, x))) + break; // Fall back on using base + } + hc.code = h; // Record index for next time + } + + + /** + * Sets base and all cells to the given value. + */ + final void internalReset(long initialValue) { + Cell[] as = cells; + base = initialValue; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) + a.value = initialValue; + } + } + } + + // Unsafe mechanics + private static final sun.misc.Unsafe UNSAFE; + private static final long baseOffset; + private static final long busyOffset; + static { + try { + UNSAFE = getUnsafe(); + Class<?> sk = Striped64.class; + baseOffset = UNSAFE.objectFieldOffset + (sk.getDeclaredField("base")); + busyOffset = UNSAFE.objectFieldOffset + (sk.getDeclaredField("busy")); + } catch (Exception e) { + throw new Error(e); + } + } + + /** + * Returns a sun.misc.Unsafe. Suitable for use in a 3rd party package. + * Replace with a simple call to Unsafe.getUnsafe when integrating + * into a jdk. + * + * @return a sun.misc.Unsafe + */ + private static sun.misc.Unsafe getUnsafe() { + try { + return sun.misc.Unsafe.getUnsafe(); + } catch (SecurityException se) { + try { + return java.security.AccessController.doPrivileged + (new java.security + .PrivilegedExceptionAction<sun.misc.Unsafe>() { + public sun.misc.Unsafe run() throws Exception { + java.lang.reflect.Field f = sun.misc + .Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + return (sun.misc.Unsafe) f.get(null); + }}); + } catch (java.security.PrivilegedActionException e) { + throw new RuntimeException("Could not initialize intrinsics", + e.getCause()); + } + } + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/nounsafe/ConcurrentHashMapV8.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/nounsafe/ConcurrentHashMapV8.java new file mode 100644 index 000000000000..4e1e33a6974b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/nounsafe/ConcurrentHashMapV8.java @@ -0,0 +1,3800 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on the 1.79 version. + +package org.jruby.ext.thread_safe.jsr166e.nounsafe; + +import org.jruby.RubyClass; +import org.jruby.RubyNumeric; +import org.jruby.RubyObject; +import org.jruby.exceptions.RaiseException; +import org.jruby.ext.thread_safe.jsr166e.ConcurrentHashMap; +import org.jruby.ext.thread_safe.jsr166y.ThreadLocalRandom; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import java.util.Arrays; +import java.util.Map; +import java.util.Set; +import java.util.Collection; +import java.util.Hashtable; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Enumeration; +import java.util.ConcurrentModificationException; +import java.util.NoSuchElementException; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.concurrent.atomic.AtomicReferenceArray; +import java.util.concurrent.locks.AbstractQueuedSynchronizer; + +import java.io.Serializable; + +/** + * A hash table supporting full concurrency of retrievals and + * high expected concurrency for updates. This class obeys the + * same functional specification as {@link java.util.Hashtable}, and + * includes versions of methods corresponding to each method of + * {@code Hashtable}. However, even though all operations are + * thread-safe, retrieval operations do <em>not</em> entail locking, + * and there is <em>not</em> any support for locking the entire table + * in a way that prevents all access. This class is fully + * interoperable with {@code Hashtable} in programs that rely on its + * thread safety but not on its synchronization details. + * + * <p>Retrieval operations (including {@code get}) generally do not + * block, so may overlap with update operations (including {@code put} + * and {@code remove}). Retrievals reflect the results of the most + * recently <em>completed</em> update operations holding upon their + * onset. (More formally, an update operation for a given key bears a + * <em>happens-before</em> relation with any (non-null) retrieval for + * that key reporting the updated value.) For aggregate operations + * such as {@code putAll} and {@code clear}, concurrent retrievals may + * reflect insertion or removal of only some entries. Similarly, + * Iterators and Enumerations return elements reflecting the state of + * the hash table at some point at or since the creation of the + * iterator/enumeration. They do <em>not</em> throw {@link + * ConcurrentModificationException}. However, iterators are designed + * to be used by only one thread at a time. Bear in mind that the + * results of aggregate status methods including {@code size}, {@code + * isEmpty}, and {@code containsValue} are typically useful only when + * a map is not undergoing concurrent updates in other threads. + * Otherwise the results of these methods reflect transient states + * that may be adequate for monitoring or estimation purposes, but not + * for program control. + * + * <p>The table is dynamically expanded when there are too many + * collisions (i.e., keys that have distinct hash codes but fall into + * the same slot modulo the table size), with the expected average + * effect of maintaining roughly two bins per mapping (corresponding + * to a 0.75 load factor threshold for resizing). There may be much + * variance around this average as mappings are added and removed, but + * overall, this maintains a commonly accepted time/space tradeoff for + * hash tables. However, resizing this or any other kind of hash + * table may be a relatively slow operation. When possible, it is a + * good idea to provide a size estimate as an optional {@code + * initialCapacity} constructor argument. An additional optional + * {@code loadFactor} constructor argument provides a further means of + * customizing initial table capacity by specifying the table density + * to be used in calculating the amount of space to allocate for the + * given number of elements. Also, for compatibility with previous + * versions of this class, constructors may optionally specify an + * expected {@code concurrencyLevel} as an additional hint for + * internal sizing. Note that using many keys with exactly the same + * {@code hashCode()} is a sure way to slow down performance of any + * hash table. + * + * <p>A {@link Set} projection of a ConcurrentHashMapV8 may be created + * (using {@link #newKeySet()} or {@link #newKeySet(int)}), or viewed + * (using {@link #keySet(Object)} when only keys are of interest, and the + * mapped values are (perhaps transiently) not used or all take the + * same mapping value. + * + * <p>A ConcurrentHashMapV8 can be used as scalable frequency map (a + * form of histogram or multiset) by using {@link LongAdder} values + * and initializing via {@link #computeIfAbsent}. For example, to add + * a count to a {@code ConcurrentHashMapV8<String,LongAdder> freqs}, you + * can use {@code freqs.computeIfAbsent(k -> new + * LongAdder()).increment();} + * + * <p>This class and its views and iterators implement all of the + * <em>optional</em> methods of the {@link Map} and {@link Iterator} + * interfaces. + * + * <p>Like {@link Hashtable} but unlike {@link HashMap}, this class + * does <em>not</em> allow {@code null} to be used as a key or value. + * + * <p>ConcurrentHashMapV8s support parallel operations using the {@link + * ForkJoinPool#commonPool}. (Tasks that may be used in other contexts + * are available in class {@link ForkJoinTasks}). These operations are + * designed to be safely, and often sensibly, applied even with maps + * that are being concurrently updated by other threads; for example, + * when computing a snapshot summary of the values in a shared + * registry. There are three kinds of operation, each with four + * forms, accepting functions with Keys, Values, Entries, and (Key, + * Value) arguments and/or return values. (The first three forms are + * also available via the {@link #keySet()}, {@link #values()} and + * {@link #entrySet()} views). Because the elements of a + * ConcurrentHashMapV8 are not ordered in any particular way, and may be + * processed in different orders in different parallel executions, the + * correctness of supplied functions should not depend on any + * ordering, or on any other objects or values that may transiently + * change while computation is in progress; and except for forEach + * actions, should ideally be side-effect-free. + * + * <ul> + * <li> forEach: Perform a given action on each element. + * A variant form applies a given transformation on each element + * before performing the action.</li> + * + * <li> search: Return the first available non-null result of + * applying a given function on each element; skipping further + * search when a result is found.</li> + * + * <li> reduce: Accumulate each element. The supplied reduction + * function cannot rely on ordering (more formally, it should be + * both associative and commutative). There are five variants: + * + * <ul> + * + * <li> Plain reductions. (There is not a form of this method for + * (key, value) function arguments since there is no corresponding + * return type.)</li> + * + * <li> Mapped reductions that accumulate the results of a given + * function applied to each element.</li> + * + * <li> Reductions to scalar doubles, longs, and ints, using a + * given basis value.</li> + * + * </li> + * </ul> + * </ul> + * + * <p>The concurrency properties of bulk operations follow + * from those of ConcurrentHashMapV8: Any non-null result returned + * from {@code get(key)} and related access methods bears a + * happens-before relation with the associated insertion or + * update. The result of any bulk operation reflects the + * composition of these per-element relations (but is not + * necessarily atomic with respect to the map as a whole unless it + * is somehow known to be quiescent). Conversely, because keys + * and values in the map are never null, null serves as a reliable + * atomic indicator of the current lack of any result. To + * maintain this property, null serves as an implicit basis for + * all non-scalar reduction operations. For the double, long, and + * int versions, the basis should be one that, when combined with + * any other value, returns that other value (more formally, it + * should be the identity element for the reduction). Most common + * reductions have these properties; for example, computing a sum + * with basis 0 or a minimum with basis MAX_VALUE. + * + * <p>Search and transformation functions provided as arguments + * should similarly return null to indicate the lack of any result + * (in which case it is not used). In the case of mapped + * reductions, this also enables transformations to serve as + * filters, returning null (or, in the case of primitive + * specializations, the identity basis) if the element should not + * be combined. You can create compound transformations and + * filterings by composing them yourself under this "null means + * there is nothing there now" rule before using them in search or + * reduce operations. + * + * <p>Methods accepting and/or returning Entry arguments maintain + * key-value associations. They may be useful for example when + * finding the key for the greatest value. Note that "plain" Entry + * arguments can be supplied using {@code new + * AbstractMap.SimpleEntry(k,v)}. + * + * <p>Bulk operations may complete abruptly, throwing an + * exception encountered in the application of a supplied + * function. Bear in mind when handling such exceptions that other + * concurrently executing functions could also have thrown + * exceptions, or would have done so if the first exception had + * not occurred. + * + * <p>Parallel speedups for bulk operations compared to sequential + * processing are common but not guaranteed. Operations involving + * brief functions on small maps may execute more slowly than + * sequential loops if the underlying work to parallelize the + * computation is more expensive than the computation itself. + * Similarly, parallelization may not lead to much actual parallelism + * if all processors are busy performing unrelated tasks. + * + * <p>All arguments to all task methods must be non-null. + * + * <p><em>jsr166e note: During transition, this class + * uses nested functional interfaces with different names but the + * same forms as those expected for JDK8.</em> + * + * <p>This class is a member of the + * <a href="{@docRoot}/../technotes/guides/collections/index.html"> + * Java Collections Framework</a>. + * + * @since 1.5 + * @author Doug Lea + * @param <K> the type of keys maintained by this map + * @param <V> the type of mapped values + */ +public class ConcurrentHashMapV8<K, V> + implements ConcurrentMap<K, V>, Serializable, ConcurrentHashMap<K, V> { + private static final long serialVersionUID = 7249069246763182397L; + + /** + * A partitionable iterator. A Spliterator can be traversed + * directly, but can also be partitioned (before traversal) by + * creating another Spliterator that covers a non-overlapping + * portion of the elements, and so may be amenable to parallel + * execution. + * + * <p>This interface exports a subset of expected JDK8 + * functionality. + * + * <p>Sample usage: Here is one (of the several) ways to compute + * the sum of the values held in a map using the ForkJoin + * framework. As illustrated here, Spliterators are well suited to + * designs in which a task repeatedly splits off half its work + * into forked subtasks until small enough to process directly, + * and then joins these subtasks. Variants of this style can also + * be used in completion-based designs. + * + * <pre> + * {@code ConcurrentHashMapV8<String, Long> m = ... + * // split as if have 8 * parallelism, for load balance + * int n = m.size(); + * int p = aForkJoinPool.getParallelism() * 8; + * int split = (n < p)? n : p; + * long sum = aForkJoinPool.invoke(new SumValues(m.valueSpliterator(), split, null)); + * // ... + * static class SumValues extends RecursiveTask<Long> { + * final Spliterator<Long> s; + * final int split; // split while > 1 + * final SumValues nextJoin; // records forked subtasks to join + * SumValues(Spliterator<Long> s, int depth, SumValues nextJoin) { + * this.s = s; this.depth = depth; this.nextJoin = nextJoin; + * } + * public Long compute() { + * long sum = 0; + * SumValues subtasks = null; // fork subtasks + * for (int s = split >>> 1; s > 0; s >>>= 1) + * (subtasks = new SumValues(s.split(), s, subtasks)).fork(); + * while (s.hasNext()) // directly process remaining elements + * sum += s.next(); + * for (SumValues t = subtasks; t != null; t = t.nextJoin) + * sum += t.join(); // collect subtask results + * return sum; + * } + * } + * }</pre> + */ + public static interface Spliterator<T> extends Iterator<T> { + /** + * Returns a Spliterator covering approximately half of the + * elements, guaranteed not to overlap with those subsequently + * returned by this Spliterator. After invoking this method, + * the current Spliterator will <em>not</em> produce any of + * the elements of the returned Spliterator, but the two + * Spliterators together will produce all of the elements that + * would have been produced by this Spliterator had this + * method not been called. The exact number of elements + * produced by the returned Spliterator is not guaranteed, and + * may be zero (i.e., with {@code hasNext()} reporting {@code + * false}) if this Spliterator cannot be further split. + * + * @return a Spliterator covering approximately half of the + * elements + * @throws IllegalStateException if this Spliterator has + * already commenced traversing elements + */ + Spliterator<T> split(); + } + + + /* + * Overview: + * + * The primary design goal of this hash table is to maintain + * concurrent readability (typically method get(), but also + * iterators and related methods) while minimizing update + * contention. Secondary goals are to keep space consumption about + * the same or better than java.util.HashMap, and to support high + * initial insertion rates on an empty table by many threads. + * + * Each key-value mapping is held in a Node. Because Node fields + * can contain special values, they are defined using plain Object + * types. Similarly in turn, all internal methods that use them + * work off Object types. And similarly, so do the internal + * methods of auxiliary iterator and view classes. All public + * generic typed methods relay in/out of these internal methods, + * supplying null-checks and casts as needed. This also allows + * many of the public methods to be factored into a smaller number + * of internal methods (although sadly not so for the five + * variants of put-related operations). The validation-based + * approach explained below leads to a lot of code sprawl because + * retry-control precludes factoring into smaller methods. + * + * The table is lazily initialized to a power-of-two size upon the + * first insertion. Each bin in the table normally contains a + * list of Nodes (most often, the list has only zero or one Node). + * Table accesses require volatile/atomic reads, writes, and + * CASes. Because there is no other way to arrange this without + * adding further indirections, we use intrinsics + * (sun.misc.Unsafe) operations. The lists of nodes within bins + * are always accurately traversable under volatile reads, so long + * as lookups check hash code and non-nullness of value before + * checking key equality. + * + * We use the top two bits of Node hash fields for control + * purposes -- they are available anyway because of addressing + * constraints. As explained further below, these top bits are + * used as follows: + * 00 - Normal + * 01 - Locked + * 11 - Locked and may have a thread waiting for lock + * 10 - Node is a forwarding node + * + * The lower 30 bits of each Node's hash field contain a + * transformation of the key's hash code, except for forwarding + * nodes, for which the lower bits are zero (and so always have + * hash field == MOVED). + * + * Insertion (via put or its variants) of the first node in an + * empty bin is performed by just CASing it to the bin. This is + * by far the most common case for put operations under most + * key/hash distributions. Other update operations (insert, + * delete, and replace) require locks. We do not want to waste + * the space required to associate a distinct lock object with + * each bin, so instead use the first node of a bin list itself as + * a lock. Blocking support for these locks relies on the builtin + * "synchronized" monitors. However, we also need a tryLock + * construction, so we overlay these by using bits of the Node + * hash field for lock control (see above), and so normally use + * builtin monitors only for blocking and signalling using + * wait/notifyAll constructions. See Node.tryAwaitLock. + * + * Using the first node of a list as a lock does not by itself + * suffice though: When a node is locked, any update must first + * validate that it is still the first node after locking it, and + * retry if not. Because new nodes are always appended to lists, + * once a node is first in a bin, it remains first until deleted + * or the bin becomes invalidated (upon resizing). However, + * operations that only conditionally update may inspect nodes + * until the point of update. This is a converse of sorts to the + * lazy locking technique described by Herlihy & Shavit. + * + * The main disadvantage of per-bin locks is that other update + * operations on other nodes in a bin list protected by the same + * lock can stall, for example when user equals() or mapping + * functions take a long time. However, statistically, under + * random hash codes, this is not a common problem. Ideally, the + * frequency of nodes in bins follows a Poisson distribution + * (http://en.wikipedia.org/wiki/Poisson_distribution) with a + * parameter of about 0.5 on average, given the resizing threshold + * of 0.75, although with a large variance because of resizing + * granularity. Ignoring variance, the expected occurrences of + * list size k are (exp(-0.5) * pow(0.5, k) / factorial(k)). The + * first values are: + * + * 0: 0.60653066 + * 1: 0.30326533 + * 2: 0.07581633 + * 3: 0.01263606 + * 4: 0.00157952 + * 5: 0.00015795 + * 6: 0.00001316 + * 7: 0.00000094 + * 8: 0.00000006 + * more: less than 1 in ten million + * + * Lock contention probability for two threads accessing distinct + * elements is roughly 1 / (8 * #elements) under random hashes. + * + * Actual hash code distributions encountered in practice + * sometimes deviate significantly from uniform randomness. This + * includes the case when N > (1<<30), so some keys MUST collide. + * Similarly for dumb or hostile usages in which multiple keys are + * designed to have identical hash codes. Also, although we guard + * against the worst effects of this (see method spread), sets of + * hashes may differ only in bits that do not impact their bin + * index for a given power-of-two mask. So we use a secondary + * strategy that applies when the number of nodes in a bin exceeds + * a threshold, and at least one of the keys implements + * Comparable. These TreeBins use a balanced tree to hold nodes + * (a specialized form of red-black trees), bounding search time + * to O(log N). Each search step in a TreeBin is around twice as + * slow as in a regular list, but given that N cannot exceed + * (1<<64) (before running out of addresses) this bounds search + * steps, lock hold times, etc, to reasonable constants (roughly + * 100 nodes inspected per operation worst case) so long as keys + * are Comparable (which is very common -- String, Long, etc). + * TreeBin nodes (TreeNodes) also maintain the same "next" + * traversal pointers as regular nodes, so can be traversed in + * iterators in the same way. + * + * The table is resized when occupancy exceeds a percentage + * threshold (nominally, 0.75, but see below). Only a single + * thread performs the resize (using field "sizeCtl", to arrange + * exclusion), but the table otherwise remains usable for reads + * and updates. Resizing proceeds by transferring bins, one by + * one, from the table to the next table. Because we are using + * power-of-two expansion, the elements from each bin must either + * stay at same index, or move with a power of two offset. We + * eliminate unnecessary node creation by catching cases where old + * nodes can be reused because their next fields won't change. On + * average, only about one-sixth of them need cloning when a table + * doubles. The nodes they replace will be garbage collectable as + * soon as they are no longer referenced by any reader thread that + * may be in the midst of concurrently traversing table. Upon + * transfer, the old table bin contains only a special forwarding + * node (with hash field "MOVED") that contains the next table as + * its key. On encountering a forwarding node, access and update + * operations restart, using the new table. + * + * Each bin transfer requires its bin lock. However, unlike other + * cases, a transfer can skip a bin if it fails to acquire its + * lock, and revisit it later (unless it is a TreeBin). Method + * rebuild maintains a buffer of TRANSFER_BUFFER_SIZE bins that + * have been skipped because of failure to acquire a lock, and + * blocks only if none are available (i.e., only very rarely). + * The transfer operation must also ensure that all accessible + * bins in both the old and new table are usable by any traversal. + * When there are no lock acquisition failures, this is arranged + * simply by proceeding from the last bin (table.length - 1) up + * towards the first. Upon seeing a forwarding node, traversals + * (see class Iter) arrange to move to the new table + * without revisiting nodes. However, when any node is skipped + * during a transfer, all earlier table bins may have become + * visible, so are initialized with a reverse-forwarding node back + * to the old table until the new ones are established. (This + * sometimes requires transiently locking a forwarding node, which + * is possible under the above encoding.) These more expensive + * mechanics trigger only when necessary. + * + * The traversal scheme also applies to partial traversals of + * ranges of bins (via an alternate Traverser constructor) + * to support partitioned aggregate operations. Also, read-only + * operations give up if ever forwarded to a null table, which + * provides support for shutdown-style clearing, which is also not + * currently implemented. + * + * Lazy table initialization minimizes footprint until first use, + * and also avoids resizings when the first operation is from a + * putAll, constructor with map argument, or deserialization. + * These cases attempt to override the initial capacity settings, + * but harmlessly fail to take effect in cases of races. + * + * The element count is maintained using a LongAdder, which avoids + * contention on updates but can encounter cache thrashing if read + * too frequently during concurrent access. To avoid reading so + * often, resizing is attempted either when a bin lock is + * contended, or upon adding to a bin already holding two or more + * nodes (checked before adding in the xIfAbsent methods, after + * adding in others). Under uniform hash distributions, the + * probability of this occurring at threshold is around 13%, + * meaning that only about 1 in 8 puts check threshold (and after + * resizing, many fewer do so). But this approximation has high + * variance for small table sizes, so we check on any collision + * for sizes <= 64. The bulk putAll operation further reduces + * contention by only committing count updates upon these size + * checks. + * + * Maintaining API and serialization compatibility with previous + * versions of this class introduces several oddities. Mainly: We + * leave untouched but unused constructor arguments refering to + * concurrencyLevel. We accept a loadFactor constructor argument, + * but apply it only to initial table capacity (which is the only + * time that we can guarantee to honor it.) We also declare an + * unused "Segment" class that is instantiated in minimal form + * only when serializing. + */ + + /* ---------------- Constants -------------- */ + + /** + * The largest possible table capacity. This value must be + * exactly 1<<30 to stay within Java array allocation and indexing + * bounds for power of two table sizes, and is further required + * because the top two bits of 32bit hash fields are used for + * control purposes. + */ + private static final int MAXIMUM_CAPACITY = 1 << 30; + + /** + * The default initial table capacity. Must be a power of 2 + * (i.e., at least 1) and at most MAXIMUM_CAPACITY. + */ + private static final int DEFAULT_CAPACITY = 16; + + /** + * The largest possible (non-power of two) array size. + * Needed by toArray and related methods. + */ + static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + /** + * The default concurrency level for this table. Unused but + * defined for compatibility with previous versions of this class. + */ + private static final int DEFAULT_CONCURRENCY_LEVEL = 16; + + /** + * The load factor for this table. Overrides of this value in + * constructors affect only the initial table capacity. The + * actual floating point value isn't normally used -- it is + * simpler to use expressions such as {@code n - (n >>> 2)} for + * the associated resizing threshold. + */ + private static final float LOAD_FACTOR = 0.75f; + + /** + * The buffer size for skipped bins during transfers. The + * value is arbitrary but should be large enough to avoid + * most locking stalls during resizes. + */ + private static final int TRANSFER_BUFFER_SIZE = 32; + + /** + * The bin count threshold for using a tree rather than list for a + * bin. The value reflects the approximate break-even point for + * using tree-based operations. + * Note that Doug's version defaults to 8, but when dealing with + * Ruby objects it is actually beneficial to avoid TreeNodes + * as long as possible as it usually means going into Ruby land. + */ + private static final int TREE_THRESHOLD = 16; + + /* + * Encodings for special uses of Node hash fields. See above for + * explanation. + */ + static final int MOVED = 0x80000000; // hash field for forwarding nodes + static final int LOCKED = 0x40000000; // set/tested only as a bit + static final int WAITING = 0xc0000000; // both bits set/tested together + static final int HASH_BITS = 0x3fffffff; // usable bits of normal node hash + + /* ---------------- Fields -------------- */ + + /** + * The array of bins. Lazily initialized upon first insertion. + * Size is always a power of two. Accessed directly by iterators. + */ + transient volatile AtomicReferenceArray<Node> table; + + /** + * The counter maintaining number of elements. + */ + private transient LongAdder counter; + + /** + * Table initialization and resizing control. When negative, the + * table is being initialized or resized. Otherwise, when table is + * null, holds the initial table size to use upon creation, or 0 + * for default. After initialization, holds the next element count + * value upon which to resize the table. + */ + private transient volatile int sizeCtl; + + // views + private transient KeySetView<K,V> keySet; + private transient ValuesView<K,V> values; + private transient EntrySetView<K,V> entrySet; + + /** For serialization compatibility. Null unless serialized; see below */ + private Segment<K,V>[] segments; + + static AtomicIntegerFieldUpdater SIZE_CTRL_UPDATER = AtomicIntegerFieldUpdater.newUpdater(ConcurrentHashMapV8.class, "sizeCtl"); + + /* ---------------- Table element access -------------- */ + + /* + * Volatile access methods are used for table elements as well as + * elements of in-progress next table while resizing. Uses are + * null checked by callers, and implicitly bounds-checked, relying + * on the invariants that tab arrays have non-zero size, and all + * indices are masked with (tab.length - 1) which is never + * negative and always less than length. Note that, to be correct + * wrt arbitrary concurrency errors by users, bounds checks must + * operate on local variables, which accounts for some odd-looking + * inline assignments below. + */ + + static final Node tabAt(AtomicReferenceArray<Node> tab, int i) { // used by Iter + return tab.get(i); + } + + private static final boolean casTabAt(AtomicReferenceArray<Node> tab, int i, Node c, Node v) { + return tab.compareAndSet(i, c, v); + } + + private static final void setTabAt(AtomicReferenceArray<Node> tab, int i, Node v) { + tab.set(i, v); + } + + /* ---------------- Nodes -------------- */ + + /** + * Key-value entry. Note that this is never exported out as a + * user-visible Map.Entry (see MapEntry below). Nodes with a hash + * field of MOVED are special, and do not contain user keys or + * values. Otherwise, keys are never null, and null val fields + * indicate that a node is in the process of being deleted or + * created. For purposes of read-only access, a key may be read + * before a val, but can only be used after checking val to be + * non-null. + */ + static class Node { + volatile int hash; + final Object key; + volatile Object val; + volatile Node next; + + static AtomicIntegerFieldUpdater HASH_UPDATER = AtomicIntegerFieldUpdater.newUpdater(Node.class, "hash"); + + Node(int hash, Object key, Object val, Node next) { + this.hash = hash; + this.key = key; + this.val = val; + this.next = next; + } + + /** CompareAndSet the hash field */ + final boolean casHash(int cmp, int val) { + return HASH_UPDATER.compareAndSet(this, cmp, val); + } + + /** The number of spins before blocking for a lock */ + static final int MAX_SPINS = + Runtime.getRuntime().availableProcessors() > 1 ? 64 : 1; + + /** + * Spins a while if LOCKED bit set and this node is the first + * of its bin, and then sets WAITING bits on hash field and + * blocks (once) if they are still set. It is OK for this + * method to return even if lock is not available upon exit, + * which enables these simple single-wait mechanics. + * + * The corresponding signalling operation is performed within + * callers: Upon detecting that WAITING has been set when + * unlocking lock (via a failed CAS from non-waiting LOCKED + * state), unlockers acquire the sync lock and perform a + * notifyAll. + * + * The initial sanity check on tab and bounds is not currently + * necessary in the only usages of this method, but enables + * use in other future contexts. + */ + final void tryAwaitLock(AtomicReferenceArray<Node> tab, int i) { + if (tab != null && i >= 0 && i < tab.length()) { // sanity check + int r = ThreadLocalRandom.current().nextInt(); // randomize spins + int spins = MAX_SPINS, h; + while (tabAt(tab, i) == this && ((h = hash) & LOCKED) != 0) { + if (spins >= 0) { + r ^= r << 1; r ^= r >>> 3; r ^= r << 10; // xorshift + if (r >= 0 && --spins == 0) + Thread.yield(); // yield before block + } + else if (casHash(h, h | WAITING)) { + synchronized (this) { + if (tabAt(tab, i) == this && + (hash & WAITING) == WAITING) { + try { + wait(); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + else + notifyAll(); // possibly won race vs signaller + } + break; + } + } + } + } + } + + /* ---------------- TreeBins -------------- */ + + /** + * Nodes for use in TreeBins + */ + static final class TreeNode extends Node { + TreeNode parent; // red-black tree links + TreeNode left; + TreeNode right; + TreeNode prev; // needed to unlink next upon deletion + boolean red; + + TreeNode(int hash, Object key, Object val, Node next, TreeNode parent) { + super(hash, key, val, next); + this.parent = parent; + } + } + + /** + * A specialized form of red-black tree for use in bins + * whose size exceeds a threshold. + * + * TreeBins use a special form of comparison for search and + * related operations (which is the main reason we cannot use + * existing collections such as TreeMaps). TreeBins contain + * Comparable elements, but may contain others, as well as + * elements that are Comparable but not necessarily Comparable<T> + * for the same T, so we cannot invoke compareTo among them. To + * handle this, the tree is ordered primarily by hash value, then + * by getClass().getName() order, and then by Comparator order + * among elements of the same class. On lookup at a node, if + * elements are not comparable or compare as 0, both left and + * right children may need to be searched in the case of tied hash + * values. (This corresponds to the full list search that would be + * necessary if all elements were non-Comparable and had tied + * hashes.) The red-black balancing code is updated from + * pre-jdk-collections + * (http://gee.cs.oswego.edu/dl/classes/collections/RBCell.java) + * based in turn on Cormen, Leiserson, and Rivest "Introduction to + * Algorithms" (CLR). + * + * TreeBins also maintain a separate locking discipline than + * regular bins. Because they are forwarded via special MOVED + * nodes at bin heads (which can never change once established), + * we cannot use those nodes as locks. Instead, TreeBin + * extends AbstractQueuedSynchronizer to support a simple form of + * read-write lock. For update operations and table validation, + * the exclusive form of lock behaves in the same way as bin-head + * locks. However, lookups use shared read-lock mechanics to allow + * multiple readers in the absence of writers. Additionally, + * these lookups do not ever block: While the lock is not + * available, they proceed along the slow traversal path (via + * next-pointers) until the lock becomes available or the list is + * exhausted, whichever comes first. (These cases are not fast, + * but maximize aggregate expected throughput.) The AQS mechanics + * for doing this are straightforward. The lock state is held as + * AQS getState(). Read counts are negative; the write count (1) + * is positive. There are no signalling preferences among readers + * and writers. Since we don't need to export full Lock API, we + * just override the minimal AQS methods and use them directly. + */ + static final class TreeBin extends AbstractQueuedSynchronizer { + private static final long serialVersionUID = 2249069246763182397L; + transient TreeNode root; // root of tree + transient TreeNode first; // head of next-pointer list + + /* AQS overrides */ + public final boolean isHeldExclusively() { return getState() > 0; } + public final boolean tryAcquire(int ignore) { + if (compareAndSetState(0, 1)) { + setExclusiveOwnerThread(Thread.currentThread()); + return true; + } + return false; + } + public final boolean tryRelease(int ignore) { + setExclusiveOwnerThread(null); + setState(0); + return true; + } + public final int tryAcquireShared(int ignore) { + for (int c;;) { + if ((c = getState()) > 0) + return -1; + if (compareAndSetState(c, c -1)) + return 1; + } + } + public final boolean tryReleaseShared(int ignore) { + int c; + do {} while (!compareAndSetState(c = getState(), c + 1)); + return c == -1; + } + + /** From CLR */ + private void rotateLeft(TreeNode p) { + if (p != null) { + TreeNode r = p.right, pp, rl; + if ((rl = p.right = r.left) != null) + rl.parent = p; + if ((pp = r.parent = p.parent) == null) + root = r; + else if (pp.left == p) + pp.left = r; + else + pp.right = r; + r.left = p; + p.parent = r; + } + } + + /** From CLR */ + private void rotateRight(TreeNode p) { + if (p != null) { + TreeNode l = p.left, pp, lr; + if ((lr = p.left = l.right) != null) + lr.parent = p; + if ((pp = l.parent = p.parent) == null) + root = l; + else if (pp.right == p) + pp.right = l; + else + pp.left = l; + l.right = p; + p.parent = l; + } + } + + @SuppressWarnings("unchecked") final TreeNode getTreeNode + (int h, Object k, TreeNode p) { + return getTreeNode(h, (RubyObject)k, p); + } + + /** + * Returns the TreeNode (or null if not found) for the given key + * starting at given root. + */ + @SuppressWarnings("unchecked") final TreeNode getTreeNode + (int h, RubyObject k, TreeNode p) { + RubyClass c = k.getMetaClass(); boolean kNotComparable = !k.respondsTo("<=>"); + while (p != null) { + int dir, ph; RubyObject pk; RubyClass pc; + if ((ph = p.hash) == h) { + if ((pk = (RubyObject)p.key) == k || k.equals(pk)) + return p; + if (c != (pc = (RubyClass)pk.getMetaClass()) || + kNotComparable || + (dir = rubyCompare(k, pk)) == 0) { + dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); + if (dir == 0) { // if still stuck, need to check both sides + TreeNode r = null, pl, pr; + // try to recurse on the right + if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) + return r; + // try to continue iterating on the left side + else if ((pl = p.left) != null && h <= pl.hash) + dir = -1; + else // no matching node found + return null; + } + } + } + else + dir = (h < ph) ? -1 : 1; + p = (dir > 0) ? p.right : p.left; + } + return null; + } + + int rubyCompare(RubyObject l, RubyObject r) { + ThreadContext context = l.getMetaClass().getRuntime().getCurrentContext(); + IRubyObject result; + try { + result = l.callMethod(context, "<=>", r); + } catch (RaiseException e) { + // handle objects "lying" about responding to <=>, ie: an Array containing non-comparable keys + if (context.runtime.getNoMethodError().isInstance(e.getException())) { + return 0; + } + throw e; + } + + return result.isNil() ? 0 : RubyNumeric.num2int(result.convertToInteger()); + } + + /** + * Wrapper for getTreeNode used by CHM.get. Tries to obtain + * read-lock to call getTreeNode, but during failure to get + * lock, searches along next links. + */ + final Object getValue(int h, Object k) { + Node r = null; + int c = getState(); // Must read lock state first + for (Node e = first; e != null; e = e.next) { + if (c <= 0 && compareAndSetState(c, c - 1)) { + try { + r = getTreeNode(h, k, root); + } finally { + releaseShared(0); + } + break; + } + else if ((e.hash & HASH_BITS) == h && k.equals(e.key)) { + r = e; + break; + } + else + c = getState(); + } + return r == null ? null : r.val; + } + + @SuppressWarnings("unchecked") final TreeNode putTreeNode + (int h, Object k, Object v) { + return putTreeNode(h, (RubyObject)k, v); + } + + /** + * Finds or adds a node. + * @return null if added + */ + @SuppressWarnings("unchecked") final TreeNode putTreeNode + (int h, RubyObject k, Object v) { + RubyClass c = k.getMetaClass(); + boolean kNotComparable = !k.respondsTo("<=>"); + TreeNode pp = root, p = null; + int dir = 0; + while (pp != null) { // find existing node or leaf to insert at + int ph; RubyObject pk; RubyClass pc; + p = pp; + if ((ph = p.hash) == h) { + if ((pk = (RubyObject)p.key) == k || k.equals(pk)) + return p; + if (c != (pc = pk.getMetaClass()) || + kNotComparable || + (dir = rubyCompare(k, pk)) == 0) { + dir = (c == pc) ? 0 : c.getName().compareTo(pc.getName()); + if (dir == 0) { // if still stuck, need to check both sides + TreeNode r = null, pr; + // try to recurse on the right + if ((pr = p.right) != null && h >= pr.hash && (r = getTreeNode(h, k, pr)) != null) + return r; + else // continue descending down the left subtree + dir = -1; + } + } + } + else + dir = (h < ph) ? -1 : 1; + pp = (dir > 0) ? p.right : p.left; + } + + TreeNode f = first; + TreeNode x = first = new TreeNode(h, (Object)k, v, f, p); + if (p == null) + root = x; + else { // attach and rebalance; adapted from CLR + TreeNode xp, xpp; + if (f != null) + f.prev = x; + if (dir <= 0) + p.left = x; + else + p.right = x; + x.red = true; + while (x != null && (xp = x.parent) != null && xp.red && + (xpp = xp.parent) != null) { + TreeNode xppl = xpp.left; + if (xp == xppl) { + TreeNode y = xpp.right; + if (y != null && y.red) { + y.red = false; + xp.red = false; + xpp.red = true; + x = xpp; + } + else { + if (x == xp.right) { + rotateLeft(x = xp); + xpp = (xp = x.parent) == null ? null : xp.parent; + } + if (xp != null) { + xp.red = false; + if (xpp != null) { + xpp.red = true; + rotateRight(xpp); + } + } + } + } + else { + TreeNode y = xppl; + if (y != null && y.red) { + y.red = false; + xp.red = false; + xpp.red = true; + x = xpp; + } + else { + if (x == xp.left) { + rotateRight(x = xp); + xpp = (xp = x.parent) == null ? null : xp.parent; + } + if (xp != null) { + xp.red = false; + if (xpp != null) { + xpp.red = true; + rotateLeft(xpp); + } + } + } + } + } + TreeNode r = root; + if (r != null && r.red) + r.red = false; + } + return null; + } + + /** + * Removes the given node, that must be present before this + * call. This is messier than typical red-black deletion code + * because we cannot swap the contents of an interior node + * with a leaf successor that is pinned by "next" pointers + * that are accessible independently of lock. So instead we + * swap the tree linkages. + */ + final void deleteTreeNode(TreeNode p) { + TreeNode next = (TreeNode)p.next; // unlink traversal pointers + TreeNode pred = p.prev; + if (pred == null) + first = next; + else + pred.next = next; + if (next != null) + next.prev = pred; + TreeNode replacement; + TreeNode pl = p.left; + TreeNode pr = p.right; + if (pl != null && pr != null) { + TreeNode s = pr, sl; + while ((sl = s.left) != null) // find successor + s = sl; + boolean c = s.red; s.red = p.red; p.red = c; // swap colors + TreeNode sr = s.right; + TreeNode pp = p.parent; + if (s == pr) { // p was s's direct parent + p.parent = s; + s.right = p; + } + else { + TreeNode sp = s.parent; + if ((p.parent = sp) != null) { + if (s == sp.left) + sp.left = p; + else + sp.right = p; + } + if ((s.right = pr) != null) + pr.parent = s; + } + p.left = null; + if ((p.right = sr) != null) + sr.parent = p; + if ((s.left = pl) != null) + pl.parent = s; + if ((s.parent = pp) == null) + root = s; + else if (p == pp.left) + pp.left = s; + else + pp.right = s; + replacement = sr; + } + else + replacement = (pl != null) ? pl : pr; + TreeNode pp = p.parent; + if (replacement == null) { + if (pp == null) { + root = null; + return; + } + replacement = p; + } + else { + replacement.parent = pp; + if (pp == null) + root = replacement; + else if (p == pp.left) + pp.left = replacement; + else + pp.right = replacement; + p.left = p.right = p.parent = null; + } + if (!p.red) { // rebalance, from CLR + TreeNode x = replacement; + while (x != null) { + TreeNode xp, xpl; + if (x.red || (xp = x.parent) == null) { + x.red = false; + break; + } + if (x == (xpl = xp.left)) { + TreeNode sib = xp.right; + if (sib != null && sib.red) { + sib.red = false; + xp.red = true; + rotateLeft(xp); + sib = (xp = x.parent) == null ? null : xp.right; + } + if (sib == null) + x = xp; + else { + TreeNode sl = sib.left, sr = sib.right; + if ((sr == null || !sr.red) && + (sl == null || !sl.red)) { + sib.red = true; + x = xp; + } + else { + if (sr == null || !sr.red) { + if (sl != null) + sl.red = false; + sib.red = true; + rotateRight(sib); + sib = (xp = x.parent) == null ? null : xp.right; + } + if (sib != null) { + sib.red = (xp == null) ? false : xp.red; + if ((sr = sib.right) != null) + sr.red = false; + } + if (xp != null) { + xp.red = false; + rotateLeft(xp); + } + x = root; + } + } + } + else { // symmetric + TreeNode sib = xpl; + if (sib != null && sib.red) { + sib.red = false; + xp.red = true; + rotateRight(xp); + sib = (xp = x.parent) == null ? null : xp.left; + } + if (sib == null) + x = xp; + else { + TreeNode sl = sib.left, sr = sib.right; + if ((sl == null || !sl.red) && + (sr == null || !sr.red)) { + sib.red = true; + x = xp; + } + else { + if (sl == null || !sl.red) { + if (sr != null) + sr.red = false; + sib.red = true; + rotateLeft(sib); + sib = (xp = x.parent) == null ? null : xp.left; + } + if (sib != null) { + sib.red = (xp == null) ? false : xp.red; + if ((sl = sib.left) != null) + sl.red = false; + } + if (xp != null) { + xp.red = false; + rotateRight(xp); + } + x = root; + } + } + } + } + } + if (p == replacement && (pp = p.parent) != null) { + if (p == pp.left) // detach pointers + pp.left = null; + else if (p == pp.right) + pp.right = null; + p.parent = null; + } + } + } + + /* ---------------- Collision reduction methods -------------- */ + + /** + * Spreads higher bits to lower, and also forces top 2 bits to 0. + * Because the table uses power-of-two masking, sets of hashes + * that vary only in bits above the current mask will always + * collide. (Among known examples are sets of Float keys holding + * consecutive whole numbers in small tables.) To counter this, + * we apply a transform that spreads the impact of higher bits + * downward. There is a tradeoff between speed, utility, and + * quality of bit-spreading. Because many common sets of hashes + * are already reasonably distributed across bits (so don't benefit + * from spreading), and because we use trees to handle large sets + * of collisions in bins, we don't need excessively high quality. + */ + private static final int spread(int h) { + h ^= (h >>> 18) ^ (h >>> 12); + return (h ^ (h >>> 10)) & HASH_BITS; + } + + /** + * Replaces a list bin with a tree bin. Call only when locked. + * Fails to replace if the given key is non-comparable or table + * is, or needs, resizing. + */ + private final void replaceWithTreeBin(AtomicReferenceArray<Node> tab, int index, Object key) { + if ((key instanceof Comparable) && + (tab.length() >= MAXIMUM_CAPACITY || counter.sum() < (long)sizeCtl)) { + TreeBin t = new TreeBin(); + for (Node e = tabAt(tab, index); e != null; e = e.next) + t.putTreeNode(e.hash & HASH_BITS, e.key, e.val); + setTabAt(tab, index, new Node(MOVED, t, null, null)); + } + } + + /* ---------------- Internal access and update methods -------------- */ + + /** Implementation for get and containsKey */ + private final Object internalGet(Object k) { + int h = spread(k.hashCode()); + retry: for (AtomicReferenceArray<Node> tab = table; tab != null;) { + Node e, p; Object ek, ev; int eh; // locals to read fields once + for (e = tabAt(tab, (tab.length() - 1) & h); e != null; e = e.next) { + if ((eh = e.hash) == MOVED) { + if ((ek = e.key) instanceof TreeBin) // search TreeBin + return ((TreeBin)ek).getValue(h, k); + else { // restart with new table + tab = (AtomicReferenceArray<Node>)ek; + continue retry; + } + } + else if ((eh & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + } + break; + } + return null; + } + + /** + * Implementation for the four public remove/replace methods: + * Replaces node value with v, conditional upon match of cv if + * non-null. If resulting value is null, delete. + */ + private final Object internalReplace(Object k, Object v, Object cv) { + int h = spread(k.hashCode()); + Object oldVal = null; + for (AtomicReferenceArray<Node> tab = table;;) { + Node f; int i, fh; Object fk; + if (tab == null || + (f = tabAt(tab, i = (tab.length() - 1) & h)) == null) + break; + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + boolean deleted = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) { + Object pv = p.val; + if (cv == null || cv == pv || cv.equals(pv)) { + oldVal = pv; + if ((p.val = v) == null) { + deleted = true; + t.deleteTreeNode(p); + } + } + } + } + } finally { + t.release(0); + } + if (validated) { + if (deleted) + counter.add(-1L); + break; + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & HASH_BITS) != h && f.next == null) // precheck + break; // rules out possible existence + else if ((fh & LOCKED) != 0) { + checkForResize(); // try resizing if can't get lock + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + boolean validated = false; + boolean deleted = false; + try { + if (tabAt(tab, i) == f) { + validated = true; + for (Node e = f, pred = null;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + ((ev = e.val) != null) && + ((ek = e.key) == k || k.equals(ek))) { + if (cv == null || cv == ev || cv.equals(ev)) { + oldVal = ev; + if ((e.val = v) == null) { + deleted = true; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + } + break; + } + pred = e; + if ((e = e.next) == null) + break; + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (validated) { + if (deleted) + counter.add(-1L); + break; + } + } + } + return oldVal; + } + + /* + * Internal versions of the six insertion methods, each a + * little more complicated than the last. All have + * the same basic structure as the first (internalPut): + * 1. If table uninitialized, create + * 2. If bin empty, try to CAS new node + * 3. If bin stale, use new table + * 4. if bin converted to TreeBin, validate and relay to TreeBin methods + * 5. Lock and validate; if valid, scan and add or update + * + * The others interweave other checks and/or alternative actions: + * * Plain put checks for and performs resize after insertion. + * * putIfAbsent prescans for mapping without lock (and fails to add + * if present), which also makes pre-emptive resize checks worthwhile. + * * computeIfAbsent extends form used in putIfAbsent with additional + * mechanics to deal with, calls, potential exceptions and null + * returns from function call. + * * compute uses the same function-call mechanics, but without + * the prescans + * * merge acts as putIfAbsent in the absent case, but invokes the + * update function if present + * * putAll attempts to pre-allocate enough table space + * and more lazily performs count updates and checks. + * + * Someday when details settle down a bit more, it might be worth + * some factoring to reduce sprawl. + */ + + /** Implementation for put */ + private final Object internalPut(Object k, Object v) { + int h = spread(k.hashCode()); + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + int i; Node f; int fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) + break; // no lock when adding to empty bin + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + Object oldVal = null; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 2; + TreeNode p = t.putTreeNode(h, k, v); + if (p != null) { + oldVal = p.val; + p.val = v; + } + } + } finally { + t.release(0); + } + if (count != 0) { + if (oldVal != null) + return oldVal; + break; + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + Object oldVal = null; + try { // needed in case equals() throws + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + oldVal = ev; + e.val = v; + break; + } + Node last = e; + if ((e = e.next) == null) { + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { // unlock and signal if needed + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (oldVal != null) + return oldVal; + if (tab.length() <= 64) + count = 2; + break; + } + } + } + counter.add(1L); + if (count > 1) + checkForResize(); + return null; + } + + /** Implementation for putIfAbsent */ + private final Object internalPutIfAbsent(Object k, Object v) { + int h = spread(k.hashCode()); + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + int i; Node f; int fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + Object oldVal = null; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 2; + TreeNode p = t.putTreeNode(h, k, v); + if (p != null) + oldVal = p.val; + } + } finally { + t.release(0); + } + if (count != 0) { + if (oldVal != null) + return oldVal; + break; + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & HASH_BITS) == h && (fv = f.val) != null && + ((fk = f.key) == k || k.equals(fk))) + return fv; + else { + Node g = f.next; + if (g != null) { // at least 2 nodes -- search and maybe resize + for (Node e = g;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + if ((e = e.next) == null) { + checkForResize(); + break; + } + } + } + if (((fh = f.hash) & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { + Object oldVal = null; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + oldVal = ev; + break; + } + Node last = e; + if ((e = e.next) == null) { + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (oldVal != null) + return oldVal; + if (tab.length() <= 64) + count = 2; + break; + } + } + } + } + counter.add(1L); + if (count > 1) + checkForResize(); + return null; + } + + /** Implementation for computeIfAbsent */ + private final Object internalComputeIfAbsent(K k, + Fun<? super K, ?> mf) { + int h = spread(k.hashCode()); + Object val = null; + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + Node f; int i, fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + Node node = new Node(fh = h | LOCKED, k, null, null); + if (casTabAt(tab, i, null, node)) { + count = 1; + try { + if ((val = mf.apply(k)) != null) + node.val = val; + } finally { + if (val == null) + setTabAt(tab, i, null); + if (!node.casHash(fh, h)) { + node.hash = h; + synchronized (node) { node.notifyAll(); }; + } + } + } + if (count != 0) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean added = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) + val = p.val; + else if ((val = mf.apply(k)) != null) { + added = true; + count = 2; + t.putTreeNode(h, k, val); + } + } + } finally { + t.release(0); + } + if (count != 0) { + if (!added) + return val; + break; + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & HASH_BITS) == h && (fv = f.val) != null && + ((fk = f.key) == k || k.equals(fk))) + return fv; + else { + Node g = f.next; + if (g != null) { + for (Node e = g;;) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) + return ev; + if ((e = e.next) == null) { + checkForResize(); + break; + } + } + } + if (((fh = f.hash) & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (tabAt(tab, i) == f && f.casHash(fh, fh | LOCKED)) { + boolean added = false; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = ev; + break; + } + Node last = e; + if ((e = e.next) == null) { + if ((val = mf.apply(k)) != null) { + added = true; + last.next = new Node(h, k, val, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + } + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (!added) + return val; + if (tab.length() <= 64) + count = 2; + break; + } + } + } + } + if (val != null) { + counter.add(1L); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for compute */ + @SuppressWarnings("unchecked") private final Object internalCompute + (K k, boolean onlyIfPresent, BiFun<? super K, ? super V, ? extends V> mf) { + int h = spread(k.hashCode()); + Object val = null; + int delta = 0; + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + Node f; int i, fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + if (onlyIfPresent) + break; + Node node = new Node(fh = h | LOCKED, k, null, null); + if (casTabAt(tab, i, null, node)) { + try { + count = 1; + if ((val = mf.apply(k, null)) != null) { + node.val = val; + delta = 1; + } + } finally { + if (delta == 0) + setTabAt(tab, i, null); + if (!node.casHash(fh, h)) { + node.hash = h; + synchronized (node) { node.notifyAll(); }; + } + } + } + if (count != 0) + break; + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + Object pv; + if (p == null) { + if (onlyIfPresent) + break; + pv = null; + } else + pv = p.val; + if ((val = mf.apply(k, (V)pv)) != null) { + if (p != null) + p.val = val; + else { + count = 2; + delta = 1; + t.putTreeNode(h, k, val); + } + } + else if (p != null) { + delta = -1; + t.deleteTreeNode(p); + } + } + } finally { + t.release(0); + } + if (count != 0) + break; + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f, pred = null;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = mf.apply(k, (V)ev); + if (val != null) + e.val = val; + else { + delta = -1; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + break; + } + pred = e; + if ((e = e.next) == null) { + if (!onlyIfPresent && (val = mf.apply(k, null)) != null) { + pred.next = new Node(h, k, val, null); + delta = 1; + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + } + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (tab.length() <= 64) + count = 2; + break; + } + } + } + if (delta != 0) { + counter.add((long)delta); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for merge */ + @SuppressWarnings("unchecked") private final Object internalMerge + (K k, V v, BiFun<? super V, ? super V, ? extends V> mf) { + int h = spread(k.hashCode()); + Object val = null; + int delta = 0; + int count = 0; + for (AtomicReferenceArray<Node> tab = table;;) { + int i; Node f; int fh; Object fk, fv; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null) { + if (casTabAt(tab, i, null, new Node(h, k, v, null))) { + delta = 1; + val = v; + break; + } + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + count = 1; + TreeNode p = t.getTreeNode(h, k, t.root); + val = (p == null) ? v : mf.apply((V)p.val, v); + if (val != null) { + if (p != null) + p.val = val; + else { + count = 2; + delta = 1; + t.putTreeNode(h, k, val); + } + } + else if (p != null) { + delta = -1; + t.deleteTreeNode(p); + } + } + } finally { + t.release(0); + } + if (count != 0) + break; + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f, pred = null;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + val = mf.apply((V)ev, v); + if (val != null) + e.val = val; + else { + delta = -1; + Node en = e.next; + if (pred != null) + pred.next = en; + else + setTabAt(tab, i, en); + } + break; + } + pred = e; + if ((e = e.next) == null) { + val = v; + pred.next = new Node(h, k, val, null); + delta = 1; + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (tab.length() <= 64) + count = 2; + break; + } + } + } + if (delta != 0) { + counter.add((long)delta); + if (count > 1) + checkForResize(); + } + return val; + } + + /** Implementation for putAll */ + private final void internalPutAll(Map<?, ?> m) { + tryPresize(m.size()); + long delta = 0L; // number of uncommitted additions + boolean npe = false; // to throw exception on exit for nulls + try { // to clean up counts on other exceptions + for (Map.Entry<?, ?> entry : m.entrySet()) { + Object k, v; + if (entry == null || (k = entry.getKey()) == null || + (v = entry.getValue()) == null) { + npe = true; + break; + } + int h = spread(k.hashCode()); + for (AtomicReferenceArray<Node> tab = table;;) { + int i; Node f; int fh; Object fk; + if (tab == null) + tab = initTable(); + else if ((f = tabAt(tab, i = (tab.length() - 1) & h)) == null){ + if (casTabAt(tab, i, null, new Node(h, k, v, null))) { + ++delta; + break; + } + } + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + TreeNode p = t.getTreeNode(h, k, t.root); + if (p != null) + p.val = v; + else { + t.putTreeNode(h, k, v); + ++delta; + } + } + } finally { + t.release(0); + } + if (validated) + break; + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + counter.add(delta); + delta = 0L; + checkForResize(); + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + int count = 0; + try { + if (tabAt(tab, i) == f) { + count = 1; + for (Node e = f;; ++count) { + Object ek, ev; + if ((e.hash & HASH_BITS) == h && + (ev = e.val) != null && + ((ek = e.key) == k || k.equals(ek))) { + e.val = v; + break; + } + Node last = e; + if ((e = e.next) == null) { + ++delta; + last.next = new Node(h, k, v, null); + if (count >= TREE_THRESHOLD) + replaceWithTreeBin(tab, i, k); + break; + } + } + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (count != 0) { + if (count > 1) { + counter.add(delta); + delta = 0L; + checkForResize(); + } + break; + } + } + } + } + } finally { + if (delta != 0) + counter.add(delta); + } + if (npe) + throw new NullPointerException(); + } + + /* ---------------- Table Initialization and Resizing -------------- */ + + /** + * Returns a power of two table size for the given desired capacity. + * See Hackers Delight, sec 3.2 + */ + private static final int tableSizeFor(int c) { + int n = c - 1; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; + } + + /** + * Initializes table, using the size recorded in sizeCtl. + */ + private final AtomicReferenceArray<Node> initTable() { + AtomicReferenceArray<Node> tab; int sc; + while ((tab = table) == null) { + if ((sc = sizeCtl) < 0) + Thread.yield(); // lost initialization race; just spin + else if (SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if ((tab = table) == null) { + int n = (sc > 0) ? sc : DEFAULT_CAPACITY; + tab = table = new AtomicReferenceArray<Node>(n); + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + break; + } + } + return tab; + } + + /** + * If table is too small and not already resizing, creates next + * table and transfers bins. Rechecks occupancy after a transfer + * to see if another resize is already needed because resizings + * are lagging additions. + */ + private final void checkForResize() { + AtomicReferenceArray<Node> tab; int n, sc; + while ((tab = table) != null && + (n = tab.length()) < MAXIMUM_CAPACITY && + (sc = sizeCtl) >= 0 && counter.sum() >= (long)sc && + SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if (tab == table) { + table = rebuild(tab); + sc = (n << 1) - (n >>> 1); + } + } finally { + sizeCtl = sc; + } + } + } + + /** + * Tries to presize table to accommodate the given number of elements. + * + * @param size number of elements (doesn't need to be perfectly accurate) + */ + private final void tryPresize(int size) { + int c = (size >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : + tableSizeFor(size + (size >>> 1) + 1); + int sc; + while ((sc = sizeCtl) >= 0) { + AtomicReferenceArray<Node> tab = table; int n; + if (tab == null || (n = tab.length()) == 0) { + n = (sc > c) ? sc : c; + if (SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if (table == tab) { + table = new AtomicReferenceArray<Node>(n); + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + } + } + else if (c <= sc || n >= MAXIMUM_CAPACITY) + break; + else if (SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if (table == tab) { + table = rebuild(tab); + sc = (n << 1) - (n >>> 1); + } + } finally { + sizeCtl = sc; + } + } + } + } + + /* + * Moves and/or copies the nodes in each bin to new table. See + * above for explanation. + * + * @return the new table + */ + private static final AtomicReferenceArray<Node> rebuild(AtomicReferenceArray<Node> tab) { + int n = tab.length(); + AtomicReferenceArray<Node> nextTab = new AtomicReferenceArray<Node>(n << 1); + Node fwd = new Node(MOVED, nextTab, null, null); + int[] buffer = null; // holds bins to revisit; null until needed + Node rev = null; // reverse forwarder; null until needed + int nbuffered = 0; // the number of bins in buffer list + int bufferIndex = 0; // buffer index of current buffered bin + int bin = n - 1; // current non-buffered bin or -1 if none + + for (int i = bin;;) { // start upwards sweep + int fh; Node f; + if ((f = tabAt(tab, i)) == null) { + if (bin >= 0) { // Unbuffered; no lock needed (or available) + if (!casTabAt(tab, i, f, fwd)) + continue; + } + else { // transiently use a locked forwarding node + Node g = new Node(MOVED|LOCKED, nextTab, null, null); + if (!casTabAt(tab, i, f, g)) + continue; + setTabAt(nextTab, i, null); + setTabAt(nextTab, i + n, null); + setTabAt(tab, i, fwd); + if (!g.casHash(MOVED|LOCKED, MOVED)) { + g.hash = MOVED; + synchronized (g) { g.notifyAll(); } + } + } + } + else if ((fh = f.hash) == MOVED) { + Object fk = f.key; + if (fk instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + boolean validated = false; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + validated = true; + splitTreeBin(nextTab, i, t); + setTabAt(tab, i, fwd); + } + } finally { + t.release(0); + } + if (!validated) + continue; + } + } + else if ((fh & LOCKED) == 0 && f.casHash(fh, fh|LOCKED)) { + boolean validated = false; + try { // split to lo and hi lists; copying as needed + if (tabAt(tab, i) == f) { + validated = true; + splitBin(nextTab, i, f); + setTabAt(tab, i, fwd); + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + if (!validated) + continue; + } + else { + if (buffer == null) // initialize buffer for revisits + buffer = new int[TRANSFER_BUFFER_SIZE]; + if (bin < 0 && bufferIndex > 0) { + int j = buffer[--bufferIndex]; + buffer[bufferIndex] = i; + i = j; // swap with another bin + continue; + } + if (bin < 0 || nbuffered >= TRANSFER_BUFFER_SIZE) { + f.tryAwaitLock(tab, i); + continue; // no other options -- block + } + if (rev == null) // initialize reverse-forwarder + rev = new Node(MOVED, tab, null, null); + if (tabAt(tab, i) != f || (f.hash & LOCKED) == 0) + continue; // recheck before adding to list + buffer[nbuffered++] = i; + setTabAt(nextTab, i, rev); // install place-holders + setTabAt(nextTab, i + n, rev); + } + + if (bin > 0) + i = --bin; + else if (buffer != null && nbuffered > 0) { + bin = -1; + i = buffer[bufferIndex = --nbuffered]; + } + else + return nextTab; + } + } + + /** + * Splits a normal bin with list headed by e into lo and hi parts; + * installs in given table. + */ + private static void splitBin(AtomicReferenceArray<Node> nextTab, int i, Node e) { + int bit = nextTab.length() >>> 1; // bit to split on + int runBit = e.hash & bit; + Node lastRun = e, lo = null, hi = null; + for (Node p = e.next; p != null; p = p.next) { + int b = p.hash & bit; + if (b != runBit) { + runBit = b; + lastRun = p; + } + } + if (runBit == 0) + lo = lastRun; + else + hi = lastRun; + for (Node p = e; p != lastRun; p = p.next) { + int ph = p.hash & HASH_BITS; + Object pk = p.key, pv = p.val; + if ((ph & bit) == 0) + lo = new Node(ph, pk, pv, lo); + else + hi = new Node(ph, pk, pv, hi); + } + setTabAt(nextTab, i, lo); + setTabAt(nextTab, i + bit, hi); + } + + /** + * Splits a tree bin into lo and hi parts; installs in given table. + */ + private static void splitTreeBin(AtomicReferenceArray<Node> nextTab, int i, TreeBin t) { + int bit = nextTab.length() >>> 1; + TreeBin lt = new TreeBin(); + TreeBin ht = new TreeBin(); + int lc = 0, hc = 0; + for (Node e = t.first; e != null; e = e.next) { + int h = e.hash & HASH_BITS; + Object k = e.key, v = e.val; + if ((h & bit) == 0) { + ++lc; + lt.putTreeNode(h, k, v); + } + else { + ++hc; + ht.putTreeNode(h, k, v); + } + } + Node ln, hn; // throw away trees if too small + if (lc <= (TREE_THRESHOLD >>> 1)) { + ln = null; + for (Node p = lt.first; p != null; p = p.next) + ln = new Node(p.hash, p.key, p.val, ln); + } + else + ln = new Node(MOVED, lt, null, null); + setTabAt(nextTab, i, ln); + if (hc <= (TREE_THRESHOLD >>> 1)) { + hn = null; + for (Node p = ht.first; p != null; p = p.next) + hn = new Node(p.hash, p.key, p.val, hn); + } + else + hn = new Node(MOVED, ht, null, null); + setTabAt(nextTab, i + bit, hn); + } + + /** + * Implementation for clear. Steps through each bin, removing all + * nodes. + */ + private final void internalClear() { + long delta = 0L; // negative number of deletions + int i = 0; + AtomicReferenceArray<Node> tab = table; + while (tab != null && i < tab.length()) { + int fh; Object fk; + Node f = tabAt(tab, i); + if (f == null) + ++i; + else if ((fh = f.hash) == MOVED) { + if ((fk = f.key) instanceof TreeBin) { + TreeBin t = (TreeBin)fk; + t.acquire(0); + try { + if (tabAt(tab, i) == f) { + for (Node p = t.first; p != null; p = p.next) { + if (p.val != null) { // (currently always true) + p.val = null; + --delta; + } + } + t.first = null; + t.root = null; + ++i; + } + } finally { + t.release(0); + } + } + else + tab = (AtomicReferenceArray<Node>)fk; + } + else if ((fh & LOCKED) != 0) { + counter.add(delta); // opportunistically update count + delta = 0L; + f.tryAwaitLock(tab, i); + } + else if (f.casHash(fh, fh | LOCKED)) { + try { + if (tabAt(tab, i) == f) { + for (Node e = f; e != null; e = e.next) { + if (e.val != null) { // (currently always true) + e.val = null; + --delta; + } + } + setTabAt(tab, i, null); + ++i; + } + } finally { + if (!f.casHash(fh | LOCKED, fh)) { + f.hash = fh; + synchronized (f) { f.notifyAll(); }; + } + } + } + } + if (delta != 0) + counter.add(delta); + } + + /* ----------------Table Traversal -------------- */ + + /** + * Encapsulates traversal for methods such as containsValue; also + * serves as a base class for other iterators and bulk tasks. + * + * At each step, the iterator snapshots the key ("nextKey") and + * value ("nextVal") of a valid node (i.e., one that, at point of + * snapshot, has a non-null user value). Because val fields can + * change (including to null, indicating deletion), field nextVal + * might not be accurate at point of use, but still maintains the + * weak consistency property of holding a value that was once + * valid. To support iterator.remove, the nextKey field is not + * updated (nulled out) when the iterator cannot advance. + * + * Internal traversals directly access these fields, as in: + * {@code while (it.advance() != null) { process(it.nextKey); }} + * + * Exported iterators must track whether the iterator has advanced + * (in hasNext vs next) (by setting/checking/nulling field + * nextVal), and then extract key, value, or key-value pairs as + * return values of next(). + * + * The iterator visits once each still-valid node that was + * reachable upon iterator construction. It might miss some that + * were added to a bin after the bin was visited, which is OK wrt + * consistency guarantees. Maintaining this property in the face + * of possible ongoing resizes requires a fair amount of + * bookkeeping state that is difficult to optimize away amidst + * volatile accesses. Even so, traversal maintains reasonable + * throughput. + * + * Normally, iteration proceeds bin-by-bin traversing lists. + * However, if the table has been resized, then all future steps + * must traverse both the bin at the current index as well as at + * (index + baseSize); and so on for further resizings. To + * paranoically cope with potential sharing by users of iterators + * across threads, iteration terminates if a bounds checks fails + * for a table read. + * + * This class extends ForkJoinTask to streamline parallel + * iteration in bulk operations (see BulkTask). This adds only an + * int of space overhead, which is close enough to negligible in + * cases where it is not needed to not worry about it. Because + * ForkJoinTask is Serializable, but iterators need not be, we + * need to add warning suppressions. + */ + @SuppressWarnings("serial") static class Traverser<K,V,R> { + final ConcurrentHashMapV8<K, V> map; + Node next; // the next entry to use + K nextKey; // cached key field of next + V nextVal; // cached val field of next + AtomicReferenceArray<Node> tab; // current table; updated if resized + int index; // index of bin to use next + int baseIndex; // current index of initial table + int baseLimit; // index bound for initial table + int baseSize; // initial table size + + /** Creates iterator for all entries in the table. */ + Traverser(ConcurrentHashMapV8<K, V> map) { + this.map = map; + } + + /** Creates iterator for split() methods */ + Traverser(Traverser<K,V,?> it) { + ConcurrentHashMapV8<K, V> m; AtomicReferenceArray<Node> t; + if ((m = this.map = it.map) == null) + t = null; + else if ((t = it.tab) == null && // force parent tab initialization + (t = it.tab = m.table) != null) + it.baseLimit = it.baseSize = t.length(); + this.tab = t; + this.baseSize = it.baseSize; + it.baseLimit = this.index = this.baseIndex = + ((this.baseLimit = it.baseLimit) + it.baseIndex + 1) >>> 1; + } + + /** + * Advances next; returns nextVal or null if terminated. + * See above for explanation. + */ + final V advance() { + Node e = next; + V ev = null; + outer: do { + if (e != null) // advance past used/skipped node + e = e.next; + while (e == null) { // get to next non-null bin + ConcurrentHashMapV8<K, V> m; + AtomicReferenceArray<Node> t; int b, i, n; Object ek; // checks must use locals + if ((t = tab) != null) + n = t.length(); + else if ((m = map) != null && (t = tab = m.table) != null) + n = baseLimit = baseSize = t.length(); + else + break outer; + if ((b = baseIndex) >= baseLimit || + (i = index) < 0 || i >= n) + break outer; + if ((e = tabAt(t, i)) != null && e.hash == MOVED) { + if ((ek = e.key) instanceof TreeBin) + e = ((TreeBin)ek).first; + else { + tab = (AtomicReferenceArray<Node>)ek; + continue; // restarts due to null val + } + } // visit upper slots if present + index = (i += baseSize) < n ? i : (baseIndex = b + 1); + } + nextKey = (K) e.key; + } while ((ev = (V) e.val) == null); // skip deleted or special nodes + next = e; + return nextVal = ev; + } + + public final void remove() { + Object k = nextKey; + if (k == null && (advance() == null || (k = nextKey) == null)) + throw new IllegalStateException(); + map.internalReplace(k, null, null); + } + + public final boolean hasNext() { + return nextVal != null || advance() != null; + } + + public final boolean hasMoreElements() { return hasNext(); } + public final void setRawResult(Object x) { } + public R getRawResult() { return null; } + public boolean exec() { return true; } + } + + /* ---------------- Public operations -------------- */ + + /** + * Creates a new, empty map with the default initial table size (16). + */ + public ConcurrentHashMapV8() { + this.counter = new LongAdder(); + } + + /** + * Creates a new, empty map with an initial table size + * accommodating the specified number of elements without the need + * to dynamically resize. + * + * @param initialCapacity The implementation performs internal + * sizing to accommodate this many elements. + * @throws IllegalArgumentException if the initial capacity of + * elements is negative + */ + public ConcurrentHashMapV8(int initialCapacity) { + if (initialCapacity < 0) + throw new IllegalArgumentException(); + int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? + MAXIMUM_CAPACITY : + tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1)); + this.counter = new LongAdder(); + this.sizeCtl = cap; + } + + /** + * Creates a new map with the same mappings as the given map. + * + * @param m the map + */ + public ConcurrentHashMapV8(Map<? extends K, ? extends V> m) { + this.counter = new LongAdder(); + this.sizeCtl = DEFAULT_CAPACITY; + internalPutAll(m); + } + + /** + * Creates a new, empty map with an initial table size based on + * the given number of elements ({@code initialCapacity}) and + * initial table density ({@code loadFactor}). + * + * @param initialCapacity the initial capacity. The implementation + * performs internal sizing to accommodate this many elements, + * given the specified load factor. + * @param loadFactor the load factor (table density) for + * establishing the initial table size + * @throws IllegalArgumentException if the initial capacity of + * elements is negative or the load factor is nonpositive + * + * @since 1.6 + */ + public ConcurrentHashMapV8(int initialCapacity, float loadFactor) { + this(initialCapacity, loadFactor, 1); + } + + /** + * Creates a new, empty map with an initial table size based on + * the given number of elements ({@code initialCapacity}), table + * density ({@code loadFactor}), and number of concurrently + * updating threads ({@code concurrencyLevel}). + * + * @param initialCapacity the initial capacity. The implementation + * performs internal sizing to accommodate this many elements, + * given the specified load factor. + * @param loadFactor the load factor (table density) for + * establishing the initial table size + * @param concurrencyLevel the estimated number of concurrently + * updating threads. The implementation may use this value as + * a sizing hint. + * @throws IllegalArgumentException if the initial capacity is + * negative or the load factor or concurrencyLevel are + * nonpositive + */ + public ConcurrentHashMapV8(int initialCapacity, + float loadFactor, int concurrencyLevel) { + if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0) + throw new IllegalArgumentException(); + if (initialCapacity < concurrencyLevel) // Use at least as many bins + initialCapacity = concurrencyLevel; // as estimated threads + long size = (long)(1.0 + (long)initialCapacity / loadFactor); + int cap = (size >= (long)MAXIMUM_CAPACITY) ? + MAXIMUM_CAPACITY : tableSizeFor((int)size); + this.counter = new LongAdder(); + this.sizeCtl = cap; + } + + /** + * Creates a new {@link Set} backed by a ConcurrentHashMapV8 + * from the given type to {@code Boolean.TRUE}. + * + * @return the new set + */ + public static <K> KeySetView<K,Boolean> newKeySet() { + return new KeySetView<K,Boolean>(new ConcurrentHashMapV8<K,Boolean>(), + Boolean.TRUE); + } + + /** + * Creates a new {@link Set} backed by a ConcurrentHashMapV8 + * from the given type to {@code Boolean.TRUE}. + * + * @param initialCapacity The implementation performs internal + * sizing to accommodate this many elements. + * @throws IllegalArgumentException if the initial capacity of + * elements is negative + * @return the new set + */ + public static <K> KeySetView<K,Boolean> newKeySet(int initialCapacity) { + return new KeySetView<K,Boolean>(new ConcurrentHashMapV8<K,Boolean>(initialCapacity), + Boolean.TRUE); + } + + /** + * {@inheritDoc} + */ + public boolean isEmpty() { + return counter.sum() <= 0L; // ignore transient negative values + } + + /** + * {@inheritDoc} + */ + public int size() { + long n = counter.sum(); + return ((n < 0L) ? 0 : + (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : + (int)n); + } + + /** + * Returns the number of mappings. This method should be used + * instead of {@link #size} because a ConcurrentHashMapV8 may + * contain more mappings than can be represented as an int. The + * value returned is a snapshot; the actual count may differ if + * there are ongoing concurrent insertions or removals. + * + * @return the number of mappings + */ + public long mappingCount() { + long n = counter.sum(); + return (n < 0L) ? 0L : n; // ignore transient negative values + } + + /** + * Returns the value to which the specified key is mapped, + * or {@code null} if this map contains no mapping for the key. + * + * <p>More formally, if this map contains a mapping from a key + * {@code k} to a value {@code v} such that {@code key.equals(k)}, + * then this method returns {@code v}; otherwise it returns + * {@code null}. (There can be at most one such mapping.) + * + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V get(Object key) { + if (key == null) + throw new NullPointerException(); + return (V)internalGet(key); + } + + /** + * Returns the value to which the specified key is mapped, + * or the given defaultValue if this map contains no mapping for the key. + * + * @param key the key + * @param defaultValue the value to return if this map contains + * no mapping for the given key + * @return the mapping for the key, if present; else the defaultValue + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V getValueOrDefault(Object key, V defaultValue) { + if (key == null) + throw new NullPointerException(); + V v = (V) internalGet(key); + return v == null ? defaultValue : v; + } + + /** + * Tests if the specified object is a key in this table. + * + * @param key possible key + * @return {@code true} if and only if the specified object + * is a key in this table, as determined by the + * {@code equals} method; {@code false} otherwise + * @throws NullPointerException if the specified key is null + */ + public boolean containsKey(Object key) { + if (key == null) + throw new NullPointerException(); + return internalGet(key) != null; + } + + /** + * Returns {@code true} if this map maps one or more keys to the + * specified value. Note: This method may require a full traversal + * of the map, and is much slower than method {@code containsKey}. + * + * @param value value whose presence in this map is to be tested + * @return {@code true} if this map maps one or more keys to the + * specified value + * @throws NullPointerException if the specified value is null + */ + public boolean containsValue(Object value) { + if (value == null) + throw new NullPointerException(); + Object v; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + while ((v = it.advance()) != null) { + if (v == value || value.equals(v)) + return true; + } + return false; + } + + public K findKey(Object value) { + if (value == null) + throw new NullPointerException(); + Object v; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + while ((v = it.advance()) != null) { + if (v == value || value.equals(v)) + return it.nextKey; + } + return null; + } + + /** + * Legacy method testing if some key maps into the specified value + * in this table. This method is identical in functionality to + * {@link #containsValue}, and exists solely to ensure + * full compatibility with class {@link java.util.Hashtable}, + * which supported this method prior to introduction of the + * Java Collections framework. + * + * @param value a value to search for + * @return {@code true} if and only if some key maps to the + * {@code value} argument in this table as + * determined by the {@code equals} method; + * {@code false} otherwise + * @throws NullPointerException if the specified value is null + */ + public boolean contains(Object value) { + return containsValue(value); + } + + /** + * Maps the specified key to the specified value in this table. + * Neither the key nor the value can be null. + * + * <p>The value can be retrieved by calling the {@code get} method + * with a key that is equal to the original key. + * + * @param key key with which the specified value is to be associated + * @param value value to be associated with the specified key + * @return the previous value associated with {@code key}, or + * {@code null} if there was no mapping for {@code key} + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V put(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalPut(key, value); + } + + /** + * {@inheritDoc} + * + * @return the previous value associated with the specified key, + * or {@code null} if there was no mapping for the key + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V putIfAbsent(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalPutIfAbsent(key, value); + } + + /** + * Copies all of the mappings from the specified map to this one. + * These mappings replace any mappings that this map had for any of the + * keys currently in the specified map. + * + * @param m mappings to be stored in this map + */ + public void putAll(Map<? extends K, ? extends V> m) { + internalPutAll(m); + } + + /** + * If the specified key is not already associated with a value, + * computes its value using the given mappingFunction and enters + * it into the map unless null. This is equivalent to + * <pre> {@code + * if (map.containsKey(key)) + * return map.get(key); + * value = mappingFunction.apply(key); + * if (value != null) + * map.put(key, value); + * return value;}</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null} no mapping is recorded. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and no mapping is recorded. Some + * attempted update operations on this map by other threads may be + * blocked while computation is in progress, so the computation + * should be short and simple, and must not attempt to update any + * other mappings of this Map. The most appropriate usage is to + * construct a new object serving as an initial mapped value, or + * memoized result, as in: + * + * <pre> {@code + * map.computeIfAbsent(key, new Fun<K, V>() { + * public V map(K k) { return new Value(f(k)); }});}</pre> + * + * @param key key with which the specified value is to be associated + * @param mappingFunction the function to compute a value + * @return the current (existing or computed) value associated with + * the specified key, or null if the computed value is null + * @throws NullPointerException if the specified key or mappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the mappingFunction does so, + * in which case the mapping is left unestablished + */ + @SuppressWarnings("unchecked") public V computeIfAbsent + (K key, Fun<? super K, ? extends V> mappingFunction) { + if (key == null || mappingFunction == null) + throw new NullPointerException(); + return (V)internalComputeIfAbsent(key, mappingFunction); + } + + /** + * If the given key is present, computes a new mapping value given a key and + * its current mapped value. This is equivalent to + * <pre> {@code + * if (map.containsKey(key)) { + * value = remappingFunction.apply(key, map.get(key)); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * } + * }</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. For example, + * to either create or append new messages to a value mapping: + * + * @param key key with which the specified value is to be associated + * @param remappingFunction the function to compute a value + * @return the new value associated with the specified key, or null if none + * @throws NullPointerException if the specified key or remappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the remappingFunction does so, + * in which case the mapping is unchanged + */ + @SuppressWarnings("unchecked") public V computeIfPresent + (K key, BiFun<? super K, ? super V, ? extends V> remappingFunction) { + if (key == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalCompute(key, true, remappingFunction); + } + + /** + * Computes a new mapping value given a key and + * its current mapped value (or {@code null} if there is no current + * mapping). This is equivalent to + * <pre> {@code + * value = remappingFunction.apply(key, map.get(key)); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * }</pre> + * + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. For example, + * to either create or append new messages to a value mapping: + * + * <pre> {@code + * Map<Key, String> map = ...; + * final String msg = ...; + * map.compute(key, new BiFun<Key, String, String>() { + * public String apply(Key k, String v) { + * return (v == null) ? msg : v + msg;});}}</pre> + * + * @param key key with which the specified value is to be associated + * @param remappingFunction the function to compute a value + * @return the new value associated with the specified key, or null if none + * @throws NullPointerException if the specified key or remappingFunction + * is null + * @throws IllegalStateException if the computation detectably + * attempts a recursive update to this map that would + * otherwise never complete + * @throws RuntimeException or Error if the remappingFunction does so, + * in which case the mapping is unchanged + */ + @SuppressWarnings("unchecked") public V compute + (K key, BiFun<? super K, ? super V, ? extends V> remappingFunction) { + if (key == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalCompute(key, false, remappingFunction); + } + + /** + * If the specified key is not already associated + * with a value, associate it with the given value. + * Otherwise, replace the value with the results of + * the given remapping function. This is equivalent to: + * <pre> {@code + * if (!map.containsKey(key)) + * map.put(value); + * else { + * newValue = remappingFunction.apply(map.get(key), value); + * if (value != null) + * map.put(key, value); + * else + * map.remove(key); + * } + * }</pre> + * except that the action is performed atomically. If the + * function returns {@code null}, the mapping is removed. If the + * function itself throws an (unchecked) exception, the exception + * is rethrown to its caller, and the current mapping is left + * unchanged. Some attempted update operations on this map by + * other threads may be blocked while computation is in progress, + * so the computation should be short and simple, and must not + * attempt to update any other mappings of this Map. + */ + @SuppressWarnings("unchecked") public V merge + (K key, V value, BiFun<? super V, ? super V, ? extends V> remappingFunction) { + if (key == null || value == null || remappingFunction == null) + throw new NullPointerException(); + return (V)internalMerge(key, value, remappingFunction); + } + + /** + * Removes the key (and its corresponding value) from this map. + * This method does nothing if the key is not in the map. + * + * @param key the key that needs to be removed + * @return the previous value associated with {@code key}, or + * {@code null} if there was no mapping for {@code key} + * @throws NullPointerException if the specified key is null + */ + @SuppressWarnings("unchecked") public V remove(Object key) { + if (key == null) + throw new NullPointerException(); + return (V)internalReplace(key, null, null); + } + + /** + * {@inheritDoc} + * + * @throws NullPointerException if the specified key is null + */ + public boolean remove(Object key, Object value) { + if (key == null) + throw new NullPointerException(); + if (value == null) + return false; + return internalReplace(key, null, value) != null; + } + + /** + * {@inheritDoc} + * + * @throws NullPointerException if any of the arguments are null + */ + public boolean replace(K key, V oldValue, V newValue) { + if (key == null || oldValue == null || newValue == null) + throw new NullPointerException(); + return internalReplace(key, newValue, oldValue) != null; + } + + /** + * {@inheritDoc} + * + * @return the previous value associated with the specified key, + * or {@code null} if there was no mapping for the key + * @throws NullPointerException if the specified key or value is null + */ + @SuppressWarnings("unchecked") public V replace(K key, V value) { + if (key == null || value == null) + throw new NullPointerException(); + return (V)internalReplace(key, value, null); + } + + /** + * Removes all of the mappings from this map. + */ + public void clear() { + internalClear(); + } + + /** + * Returns a {@link Set} view of the keys contained in this map. + * The set is backed by the map, so changes to the map are + * reflected in the set, and vice-versa. + * + * @return the set view + */ + public KeySetView<K,V> keySet() { + KeySetView<K,V> ks = keySet; + return (ks != null) ? ks : (keySet = new KeySetView<K,V>(this, null)); + } + + /** + * Returns a {@link Set} view of the keys in this map, using the + * given common mapped value for any additions (i.e., {@link + * Collection#add} and {@link Collection#addAll}). This is of + * course only appropriate if it is acceptable to use the same + * value for all additions from this view. + * + * @param mappedValue the mapped value to use for any + * additions. + * @return the set view + * @throws NullPointerException if the mappedValue is null + */ + public KeySetView<K,V> keySet(V mappedValue) { + if (mappedValue == null) + throw new NullPointerException(); + return new KeySetView<K,V>(this, mappedValue); + } + + /** + * Returns a {@link Collection} view of the values contained in this map. + * The collection is backed by the map, so changes to the map are + * reflected in the collection, and vice-versa. + */ + public ValuesView<K,V> values() { + ValuesView<K,V> vs = values; + return (vs != null) ? vs : (values = new ValuesView<K,V>(this)); + } + + /** + * Returns a {@link Set} view of the mappings contained in this map. + * The set is backed by the map, so changes to the map are + * reflected in the set, and vice-versa. The set supports element + * removal, which removes the corresponding mapping from the map, + * via the {@code Iterator.remove}, {@code Set.remove}, + * {@code removeAll}, {@code retainAll}, and {@code clear} + * operations. It does not support the {@code add} or + * {@code addAll} operations. + * + * <p>The view's {@code iterator} is a "weakly consistent" iterator + * that will never throw {@link ConcurrentModificationException}, + * and guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not guaranteed to) + * reflect any modifications subsequent to construction. + */ + public Set<Map.Entry<K,V>> entrySet() { + EntrySetView<K,V> es = entrySet; + return (es != null) ? es : (entrySet = new EntrySetView<K,V>(this)); + } + + /** + * Returns an enumeration of the keys in this table. + * + * @return an enumeration of the keys in this table + * @see #keySet() + */ + public Enumeration<K> keys() { + return new KeyIterator<K,V>(this); + } + + /** + * Returns an enumeration of the values in this table. + * + * @return an enumeration of the values in this table + * @see #values() + */ + public Enumeration<V> elements() { + return new ValueIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the keys in this map. + * + * @return a partitionable iterator of the keys in this map + */ + public Spliterator<K> keySpliterator() { + return new KeyIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the values in this map. + * + * @return a partitionable iterator of the values in this map + */ + public Spliterator<V> valueSpliterator() { + return new ValueIterator<K,V>(this); + } + + /** + * Returns a partitionable iterator of the entries in this map. + * + * @return a partitionable iterator of the entries in this map + */ + public Spliterator<Map.Entry<K,V>> entrySpliterator() { + return new EntryIterator<K,V>(this); + } + + /** + * Returns the hash code value for this {@link Map}, i.e., + * the sum of, for each key-value pair in the map, + * {@code key.hashCode() ^ value.hashCode()}. + * + * @return the hash code value for this map + */ + public int hashCode() { + int h = 0; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object v; + while ((v = it.advance()) != null) { + h += it.nextKey.hashCode() ^ v.hashCode(); + } + return h; + } + + /** + * Returns a string representation of this map. The string + * representation consists of a list of key-value mappings (in no + * particular order) enclosed in braces ("{@code {}}"). Adjacent + * mappings are separated by the characters {@code ", "} (comma + * and space). Each key-value mapping is rendered as the key + * followed by an equals sign ("{@code =}") followed by the + * associated value. + * + * @return a string representation of this map + */ + public String toString() { + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + StringBuilder sb = new StringBuilder(); + sb.append('{'); + Object v; + if ((v = it.advance()) != null) { + for (;;) { + Object k = it.nextKey; + sb.append(k == this ? "(this Map)" : k); + sb.append('='); + sb.append(v == this ? "(this Map)" : v); + if ((v = it.advance()) == null) + break; + sb.append(',').append(' '); + } + } + return sb.append('}').toString(); + } + + /** + * Compares the specified object with this map for equality. + * Returns {@code true} if the given object is a map with the same + * mappings as this map. This operation may return misleading + * results if either map is concurrently modified during execution + * of this method. + * + * @param o object to be compared for equality with this map + * @return {@code true} if the specified object is equal to this map + */ + public boolean equals(Object o) { + if (o != this) { + if (!(o instanceof Map)) + return false; + Map<?,?> m = (Map<?,?>) o; + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object val; + while ((val = it.advance()) != null) { + Object v = m.get(it.nextKey); + if (v == null || (v != val && !v.equals(val))) + return false; + } + for (Map.Entry<?,?> e : m.entrySet()) { + Object mk, mv, v; + if ((mk = e.getKey()) == null || + (mv = e.getValue()) == null || + (v = internalGet(mk)) == null || + (mv != v && !mv.equals(v))) + return false; + } + } + return true; + } + + /* ----------------Iterators -------------- */ + + @SuppressWarnings("serial") static final class KeyIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<K>, Enumeration<K> { + KeyIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + KeyIterator(Traverser<K,V,Object> it) { + super(it); + } + public KeyIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new KeyIterator<K,V>(this); + } + @SuppressWarnings("unchecked") public final K next() { + if (nextVal == null && advance() == null) + throw new NoSuchElementException(); + Object k = nextKey; + nextVal = null; + return (K) k; + } + + public final K nextElement() { return next(); } + } + + @SuppressWarnings("serial") static final class ValueIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<V>, Enumeration<V> { + ValueIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + ValueIterator(Traverser<K,V,Object> it) { + super(it); + } + public ValueIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new ValueIterator<K,V>(this); + } + + @SuppressWarnings("unchecked") public final V next() { + Object v; + if ((v = nextVal) == null && (v = advance()) == null) + throw new NoSuchElementException(); + nextVal = null; + return (V) v; + } + + public final V nextElement() { return next(); } + } + + @SuppressWarnings("serial") static final class EntryIterator<K,V> extends Traverser<K,V,Object> + implements Spliterator<Map.Entry<K,V>> { + EntryIterator(ConcurrentHashMapV8<K, V> map) { super(map); } + EntryIterator(Traverser<K,V,Object> it) { + super(it); + } + public EntryIterator<K,V> split() { + if (nextKey != null) + throw new IllegalStateException(); + return new EntryIterator<K,V>(this); + } + + @SuppressWarnings("unchecked") public final Map.Entry<K,V> next() { + Object v; + if ((v = nextVal) == null && (v = advance()) == null) + throw new NoSuchElementException(); + Object k = nextKey; + nextVal = null; + return new MapEntry<K,V>((K)k, (V)v, map); + } + } + + /** + * Exported Entry for iterators + */ + static final class MapEntry<K,V> implements Map.Entry<K, V> { + final K key; // non-null + V val; // non-null + final ConcurrentHashMapV8<K, V> map; + MapEntry(K key, V val, ConcurrentHashMapV8<K, V> map) { + this.key = key; + this.val = val; + this.map = map; + } + public final K getKey() { return key; } + public final V getValue() { return val; } + public final int hashCode() { return key.hashCode() ^ val.hashCode(); } + public final String toString(){ return key + "=" + val; } + + public final boolean equals(Object o) { + Object k, v; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (v = e.getValue()) != null && + (k == key || k.equals(key)) && + (v == val || v.equals(val))); + } + + /** + * Sets our entry's value and writes through to the map. The + * value to return is somewhat arbitrary here. Since we do not + * necessarily track asynchronous changes, the most recent + * "previous" value could be different from what we return (or + * could even have been removed in which case the put will + * re-establish). We do not and cannot guarantee more. + */ + public final V setValue(V value) { + if (value == null) throw new NullPointerException(); + V v = val; + val = value; + map.put(key, value); + return v; + } + } + + /* ---------------- Serialization Support -------------- */ + + /** + * Stripped-down version of helper class used in previous version, + * declared for the sake of serialization compatibility + */ + static class Segment<K,V> implements Serializable { + private static final long serialVersionUID = 2249069246763182397L; + final float loadFactor; + Segment(float lf) { this.loadFactor = lf; } + } + + /** + * Saves the state of the {@code ConcurrentHashMapV8} instance to a + * stream (i.e., serializes it). + * @param s the stream + * @serialData + * the key (Object) and value (Object) + * for each key-value mapping, followed by a null pair. + * The key-value mappings are emitted in no particular order. + */ + @SuppressWarnings("unchecked") private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException { + if (segments == null) { // for serialization compatibility + segments = (Segment<K,V>[]) + new Segment<?,?>[DEFAULT_CONCURRENCY_LEVEL]; + for (int i = 0; i < segments.length; ++i) + segments[i] = new Segment<K,V>(LOAD_FACTOR); + } + s.defaultWriteObject(); + Traverser<K,V,Object> it = new Traverser<K,V,Object>(this); + Object v; + while ((v = it.advance()) != null) { + s.writeObject(it.nextKey); + s.writeObject(v); + } + s.writeObject(null); + s.writeObject(null); + segments = null; // throw away + } + + /** + * Reconstitutes the instance from a stream (that is, deserializes it). + * @param s the stream + */ + @SuppressWarnings("unchecked") private void readObject(java.io.ObjectInputStream s) + throws java.io.IOException, ClassNotFoundException { + s.defaultReadObject(); + this.segments = null; // unneeded + // initialize transient final field + this.counter = new LongAdder(); + + // Create all nodes, then place in table once size is known + long size = 0L; + Node p = null; + for (;;) { + K k = (K) s.readObject(); + V v = (V) s.readObject(); + if (k != null && v != null) { + int h = spread(k.hashCode()); + p = new Node(h, k, v, p); + ++size; + } + else + break; + } + if (p != null) { + boolean init = false; + int n; + if (size >= (long)(MAXIMUM_CAPACITY >>> 1)) + n = MAXIMUM_CAPACITY; + else { + int sz = (int)size; + n = tableSizeFor(sz + (sz >>> 1) + 1); + } + int sc = sizeCtl; + boolean collide = false; + if (n > sc && + SIZE_CTRL_UPDATER.compareAndSet(this, sc, -1)) { + try { + if (table == null) { + init = true; + AtomicReferenceArray<Node> tab = new AtomicReferenceArray<Node>(n); + int mask = n - 1; + while (p != null) { + int j = p.hash & mask; + Node next = p.next; + Node q = p.next = tabAt(tab, j); + setTabAt(tab, j, p); + if (!collide && q != null && q.hash == p.hash) + collide = true; + p = next; + } + table = tab; + counter.add(size); + sc = n - (n >>> 2); + } + } finally { + sizeCtl = sc; + } + if (collide) { // rescan and convert to TreeBins + AtomicReferenceArray<Node> tab = table; + for (int i = 0; i < tab.length(); ++i) { + int c = 0; + for (Node e = tabAt(tab, i); e != null; e = e.next) { + if (++c > TREE_THRESHOLD && + (e.key instanceof Comparable)) { + replaceWithTreeBin(tab, i, e.key); + break; + } + } + } + } + } + if (!init) { // Can only happen if unsafely published. + while (p != null) { + internalPut(p.key, p.val); + p = p.next; + } + } + } + } + + + // ------------------------------------------------------- + + // Sams + /** Interface describing a void action of one argument */ + public interface Action<A> { void apply(A a); } + /** Interface describing a void action of two arguments */ + public interface BiAction<A,B> { void apply(A a, B b); } + /** Interface describing a function of one argument */ + public interface Generator<T> { T apply(); } + /** Interface describing a function mapping its argument to a double */ + public interface ObjectToDouble<A> { double apply(A a); } + /** Interface describing a function mapping its argument to a long */ + public interface ObjectToLong<A> { long apply(A a); } + /** Interface describing a function mapping its argument to an int */ + public interface ObjectToInt<A> {int apply(A a); } + /** Interface describing a function mapping two arguments to a double */ + public interface ObjectByObjectToDouble<A,B> { double apply(A a, B b); } + /** Interface describing a function mapping two arguments to a long */ + public interface ObjectByObjectToLong<A,B> { long apply(A a, B b); } + /** Interface describing a function mapping two arguments to an int */ + public interface ObjectByObjectToInt<A,B> {int apply(A a, B b); } + /** Interface describing a function mapping a double to a double */ + public interface DoubleToDouble { double apply(double a); } + /** Interface describing a function mapping a long to a long */ + public interface LongToLong { long apply(long a); } + /** Interface describing a function mapping an int to an int */ + public interface IntToInt { int apply(int a); } + /** Interface describing a function mapping two doubles to a double */ + public interface DoubleByDoubleToDouble { double apply(double a, double b); } + /** Interface describing a function mapping two longs to a long */ + public interface LongByLongToLong { long apply(long a, long b); } + /** Interface describing a function mapping two ints to an int */ + public interface IntByIntToInt { int apply(int a, int b); } + + + /* ----------------Views -------------- */ + + /** + * Base class for views. + */ + static abstract class CHMView<K, V> { + final ConcurrentHashMapV8<K, V> map; + CHMView(ConcurrentHashMapV8<K, V> map) { this.map = map; } + + /** + * Returns the map backing this view. + * + * @return the map backing this view + */ + public ConcurrentHashMapV8<K,V> getMap() { return map; } + + public final int size() { return map.size(); } + public final boolean isEmpty() { return map.isEmpty(); } + public final void clear() { map.clear(); } + + // implementations below rely on concrete classes supplying these + abstract public Iterator<?> iterator(); + abstract public boolean contains(Object o); + abstract public boolean remove(Object o); + + private static final String oomeMsg = "Required array size too large"; + + public final Object[] toArray() { + long sz = map.mappingCount(); + if (sz > (long)(MAX_ARRAY_SIZE)) + throw new OutOfMemoryError(oomeMsg); + int n = (int)sz; + Object[] r = new Object[n]; + int i = 0; + Iterator<?> it = iterator(); + while (it.hasNext()) { + if (i == n) { + if (n >= MAX_ARRAY_SIZE) + throw new OutOfMemoryError(oomeMsg); + if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) + n = MAX_ARRAY_SIZE; + else + n += (n >>> 1) + 1; + r = Arrays.copyOf(r, n); + } + r[i++] = it.next(); + } + return (i == n) ? r : Arrays.copyOf(r, i); + } + + @SuppressWarnings("unchecked") public final <T> T[] toArray(T[] a) { + long sz = map.mappingCount(); + if (sz > (long)(MAX_ARRAY_SIZE)) + throw new OutOfMemoryError(oomeMsg); + int m = (int)sz; + T[] r = (a.length >= m) ? a : + (T[])java.lang.reflect.Array + .newInstance(a.getClass().getComponentType(), m); + int n = r.length; + int i = 0; + Iterator<?> it = iterator(); + while (it.hasNext()) { + if (i == n) { + if (n >= MAX_ARRAY_SIZE) + throw new OutOfMemoryError(oomeMsg); + if (n >= MAX_ARRAY_SIZE - (MAX_ARRAY_SIZE >>> 1) - 1) + n = MAX_ARRAY_SIZE; + else + n += (n >>> 1) + 1; + r = Arrays.copyOf(r, n); + } + r[i++] = (T)it.next(); + } + if (a == r && i < n) { + r[i] = null; // null-terminate + return r; + } + return (i == n) ? r : Arrays.copyOf(r, i); + } + + public final int hashCode() { + int h = 0; + for (Iterator<?> it = iterator(); it.hasNext();) + h += it.next().hashCode(); + return h; + } + + public final String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + Iterator<?> it = iterator(); + if (it.hasNext()) { + for (;;) { + Object e = it.next(); + sb.append(e == this ? "(this Collection)" : e); + if (!it.hasNext()) + break; + sb.append(',').append(' '); + } + } + return sb.append(']').toString(); + } + + public final boolean containsAll(Collection<?> c) { + if (c != this) { + for (Iterator<?> it = c.iterator(); it.hasNext();) { + Object e = it.next(); + if (e == null || !contains(e)) + return false; + } + } + return true; + } + + public final boolean removeAll(Collection<?> c) { + boolean modified = false; + for (Iterator<?> it = iterator(); it.hasNext();) { + if (c.contains(it.next())) { + it.remove(); + modified = true; + } + } + return modified; + } + + public final boolean retainAll(Collection<?> c) { + boolean modified = false; + for (Iterator<?> it = iterator(); it.hasNext();) { + if (!c.contains(it.next())) { + it.remove(); + modified = true; + } + } + return modified; + } + + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Set} of keys, in + * which additions may optionally be enabled by mapping to a + * common value. This class cannot be directly instantiated. See + * {@link #keySet}, {@link #keySet(Object)}, {@link #newKeySet()}, + * {@link #newKeySet(int)}. + */ + public static class KeySetView<K,V> extends CHMView<K,V> implements Set<K>, java.io.Serializable { + private static final long serialVersionUID = 7249069246763182397L; + private final V value; + KeySetView(ConcurrentHashMapV8<K, V> map, V value) { // non-public + super(map); + this.value = value; + } + + /** + * Returns the default mapped value for additions, + * or {@code null} if additions are not supported. + * + * @return the default mapped value for additions, or {@code null} + * if not supported. + */ + public V getMappedValue() { return value; } + + // implement Set API + + public boolean contains(Object o) { return map.containsKey(o); } + public boolean remove(Object o) { return map.remove(o) != null; } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the keys of this map + */ + public Iterator<K> iterator() { return new KeyIterator<K,V>(map); } + public boolean add(K e) { + V v; + if ((v = value) == null) + throw new UnsupportedOperationException(); + if (e == null) + throw new NullPointerException(); + return map.internalPutIfAbsent(e, v) == null; + } + public boolean addAll(Collection<? extends K> c) { + boolean added = false; + V v; + if ((v = value) == null) + throw new UnsupportedOperationException(); + for (K e : c) { + if (e == null) + throw new NullPointerException(); + if (map.internalPutIfAbsent(e, v) == null) + added = true; + } + return added; + } + public boolean equals(Object o) { + Set<?> c; + return ((o instanceof Set) && + ((c = (Set<?>)o) == this || + (containsAll(c) && c.containsAll(this)))); + } + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Collection} of + * values, in which additions are disabled. This class cannot be + * directly instantiated. See {@link #values}, + * + * <p>The view's {@code iterator} is a "weakly consistent" iterator + * that will never throw {@link ConcurrentModificationException}, + * and guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not guaranteed to) + * reflect any modifications subsequent to construction. + */ + public static final class ValuesView<K,V> extends CHMView<K,V> + implements Collection<V> { + ValuesView(ConcurrentHashMapV8<K, V> map) { super(map); } + public final boolean contains(Object o) { return map.containsValue(o); } + public final boolean remove(Object o) { + if (o != null) { + Iterator<V> it = new ValueIterator<K,V>(map); + while (it.hasNext()) { + if (o.equals(it.next())) { + it.remove(); + return true; + } + } + } + return false; + } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the values of this map + */ + public final Iterator<V> iterator() { + return new ValueIterator<K,V>(map); + } + public final boolean add(V e) { + throw new UnsupportedOperationException(); + } + public final boolean addAll(Collection<? extends V> c) { + throw new UnsupportedOperationException(); + } + } + + /** + * A view of a ConcurrentHashMapV8 as a {@link Set} of (key, value) + * entries. This class cannot be directly instantiated. See + * {@link #entrySet}. + */ + public static final class EntrySetView<K,V> extends CHMView<K,V> + implements Set<Map.Entry<K,V>> { + EntrySetView(ConcurrentHashMapV8<K, V> map) { super(map); } + public final boolean contains(Object o) { + Object k, v, r; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (r = map.get(k)) != null && + (v = e.getValue()) != null && + (v == r || v.equals(r))); + } + public final boolean remove(Object o) { + Object k, v; Map.Entry<?,?> e; + return ((o instanceof Map.Entry) && + (k = (e = (Map.Entry<?,?>)o).getKey()) != null && + (v = e.getValue()) != null && + map.remove(k, v)); + } + + /** + * Returns a "weakly consistent" iterator that will never + * throw {@link ConcurrentModificationException}, and + * guarantees to traverse elements as they existed upon + * construction of the iterator, and may (but is not + * guaranteed to) reflect any modifications subsequent to + * construction. + * + * @return an iterator over the entries of this map + */ + public final Iterator<Map.Entry<K,V>> iterator() { + return new EntryIterator<K,V>(map); + } + + public final boolean add(Entry<K,V> e) { + K key = e.getKey(); + V value = e.getValue(); + if (key == null || value == null) + throw new NullPointerException(); + return map.internalPut(key, value) == null; + } + public final boolean addAll(Collection<? extends Entry<K,V>> c) { + boolean added = false; + for (Entry<K,V> e : c) { + if (add(e)) + added = true; + } + return added; + } + public boolean equals(Object o) { + Set<?> c; + return ((o instanceof Set) && + ((c = (Set<?>)o) == this || + (containsAll(c) && c.containsAll(this)))); + } + } +} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/nounsafe/LongAdder.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/nounsafe/LongAdder.java new file mode 100644 index 000000000000..e7a1c5f8f3fd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/nounsafe/LongAdder.java @@ -0,0 +1,204 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.9 version. + +package org.jruby.ext.thread_safe.jsr166e.nounsafe; + +import java.util.concurrent.atomic.AtomicLong; +import java.io.IOException; +import java.io.Serializable; +import java.io.ObjectInputStream; + +/** + * One or more variables that together maintain an initially zero + * {@code long} sum. When updates (method {@link #add}) are contended + * across threads, the set of variables may grow dynamically to reduce + * contention. Method {@link #sum} (or, equivalently, {@link + * #longValue}) returns the current total combined across the + * variables maintaining the sum. + * + * <p>This class is usually preferable to {@link AtomicLong} when + * multiple threads update a common sum that is used for purposes such + * as collecting statistics, not for fine-grained synchronization + * control. Under low update contention, the two classes have similar + * characteristics. But under high contention, expected throughput of + * this class is significantly higher, at the expense of higher space + * consumption. + * + * <p>This class extends {@link Number}, but does <em>not</em> define + * methods such as {@code hashCode} and {@code compareTo} because + * instances are expected to be mutated, and so are not useful as + * collection keys. + * + * <p><em>jsr166e note: This class is targeted to be placed in + * java.util.concurrent.atomic.</em> + * + * @since 1.8 + * @author Doug Lea + */ +public class LongAdder extends Striped64 implements Serializable { + private static final long serialVersionUID = 7249069246863182397L; + + /** + * Version of plus for use in retryUpdate + */ + final long fn(long v, long x) { return v + x; } + + /** + * Creates a new adder with initial sum of zero. + */ + public LongAdder() { + } + + /** + * Adds the given value. + * + * @param x the value to add + */ + public void add(long x) { + Cell[] as; long b, v; HashCode hc; Cell a; int n; + if ((as = cells) != null || !casBase(b = base, b + x)) { + boolean uncontended = true; + int h = (hc = threadHashCode.get()).code; + if (as == null || (n = as.length) < 1 || + (a = as[(n - 1) & h]) == null || + !(uncontended = a.cas(v = a.value, v + x))) + retryUpdate(x, hc, uncontended); + } + } + + /** + * Equivalent to {@code add(1)}. + */ + public void increment() { + add(1L); + } + + /** + * Equivalent to {@code add(-1)}. + */ + public void decrement() { + add(-1L); + } + + /** + * Returns the current sum. The returned value is <em>NOT</em> an + * atomic snapshot: Invocation in the absence of concurrent + * updates returns an accurate result, but concurrent updates that + * occur while the sum is being calculated might not be + * incorporated. + * + * @return the sum + */ + public long sum() { + long sum = base; + Cell[] as = cells; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) + sum += a.value; + } + } + return sum; + } + + /** + * Resets variables maintaining the sum to zero. This method may + * be a useful alternative to creating a new adder, but is only + * effective if there are no concurrent updates. Because this + * method is intrinsically racy, it should only be used when it is + * known that no threads are concurrently updating. + */ + public void reset() { + internalReset(0L); + } + + /** + * Equivalent in effect to {@link #sum} followed by {@link + * #reset}. This method may apply for example during quiescent + * points between multithreaded computations. If there are + * updates concurrent with this method, the returned value is + * <em>not</em> guaranteed to be the final value occurring before + * the reset. + * + * @return the sum + */ + public long sumThenReset() { + long sum = base; + Cell[] as = cells; + base = 0L; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) { + sum += a.value; + a.value = 0L; + } + } + } + return sum; + } + + /** + * Returns the String representation of the {@link #sum}. + * @return the String representation of the {@link #sum} + */ + public String toString() { + return Long.toString(sum()); + } + + /** + * Equivalent to {@link #sum}. + * + * @return the sum + */ + public long longValue() { + return sum(); + } + + /** + * Returns the {@link #sum} as an {@code int} after a narrowing + * primitive conversion. + */ + public int intValue() { + return (int)sum(); + } + + /** + * Returns the {@link #sum} as a {@code float} + * after a widening primitive conversion. + */ + public float floatValue() { + return (float)sum(); + } + + /** + * Returns the {@link #sum} as a {@code double} after a widening + * primitive conversion. + */ + public double doubleValue() { + return (double)sum(); + } + + private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException { + s.defaultWriteObject(); + s.writeLong(sum()); + } + + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + busy = 0; + cells = null; + base = s.readLong(); + } + +} diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/nounsafe/Striped64.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/nounsafe/Striped64.java new file mode 100644 index 000000000000..ee69567e29fc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166e/nounsafe/Striped64.java @@ -0,0 +1,291 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.5 version. + +package org.jruby.ext.thread_safe.jsr166e.nounsafe; + +import java.util.Random; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.concurrent.atomic.AtomicLongFieldUpdater; + +/** + * A package-local class holding common representation and mechanics + * for classes supporting dynamic striping on 64bit values. The class + * extends Number so that concrete subclasses must publicly do so. + */ +abstract class Striped64 extends Number { + /* + * This class maintains a lazily-initialized table of atomically + * updated variables, plus an extra "base" field. The table size + * is a power of two. Indexing uses masked per-thread hash codes. + * Nearly all declarations in this class are package-private, + * accessed directly by subclasses. + * + * Table entries are of class Cell; a variant of AtomicLong padded + * to reduce cache contention on most processors. Padding is + * overkill for most Atomics because they are usually irregularly + * scattered in memory and thus don't interfere much with each + * other. But Atomic objects residing in arrays will tend to be + * placed adjacent to each other, and so will most often share + * cache lines (with a huge negative performance impact) without + * this precaution. + * + * In part because Cells are relatively large, we avoid creating + * them until they are needed. When there is no contention, all + * updates are made to the base field. Upon first contention (a + * failed CAS on base update), the table is initialized to size 2. + * The table size is doubled upon further contention until + * reaching the nearest power of two greater than or equal to the + * number of CPUS. Table slots remain empty (null) until they are + * needed. + * + * A single spinlock ("busy") is used for initializing and + * resizing the table, as well as populating slots with new Cells. + * There is no need for a blocking lock: When the lock is not + * available, threads try other slots (or the base). During these + * retries, there is increased contention and reduced locality, + * which is still better than alternatives. + * + * Per-thread hash codes are initialized to random values. + * Contention and/or table collisions are indicated by failed + * CASes when performing an update operation (see method + * retryUpdate). Upon a collision, if the table size is less than + * the capacity, it is doubled in size unless some other thread + * holds the lock. If a hashed slot is empty, and lock is + * available, a new Cell is created. Otherwise, if the slot + * exists, a CAS is tried. Retries proceed by "double hashing", + * using a secondary hash (Marsaglia XorShift) to try to find a + * free slot. + * + * The table size is capped because, when there are more threads + * than CPUs, supposing that each thread were bound to a CPU, + * there would exist a perfect hash function mapping threads to + * slots that eliminates collisions. When we reach capacity, we + * search for this mapping by randomly varying the hash codes of + * colliding threads. Because search is random, and collisions + * only become known via CAS failures, convergence can be slow, + * and because threads are typically not bound to CPUS forever, + * may not occur at all. However, despite these limitations, + * observed contention rates are typically low in these cases. + * + * It is possible for a Cell to become unused when threads that + * once hashed to it terminate, as well as in the case where + * doubling the table causes no thread to hash to it under + * expanded mask. We do not try to detect or remove such cells, + * under the assumption that for long-running instances, observed + * contention levels will recur, so the cells will eventually be + * needed again; and for short-lived ones, it does not matter. + */ + + /** + * Padded variant of AtomicLong supporting only raw accesses plus CAS. + * The value field is placed between pads, hoping that the JVM doesn't + * reorder them. + * + * JVM intrinsics note: It would be possible to use a release-only + * form of CAS here, if it were provided. + */ + static final class Cell { + volatile long p0, p1, p2, p3, p4, p5, p6; + volatile long value; + volatile long q0, q1, q2, q3, q4, q5, q6; + + static AtomicLongFieldUpdater<Cell> VALUE_UPDATER = AtomicLongFieldUpdater.newUpdater(Cell.class, "value"); + + Cell(long x) { value = x; } + + final boolean cas(long cmp, long val) { + return VALUE_UPDATER.compareAndSet(this, cmp, val); + } + + } + + /** + * Holder for the thread-local hash code. The code is initially + * random, but may be set to a different value upon collisions. + */ + static final class HashCode { + static final Random rng = new Random(); + int code; + HashCode() { + int h = rng.nextInt(); // Avoid zero to allow xorShift rehash + code = (h == 0) ? 1 : h; + } + } + + /** + * The corresponding ThreadLocal class + */ + static final class ThreadHashCode extends ThreadLocal<HashCode> { + public HashCode initialValue() { return new HashCode(); } + } + + /** + * Static per-thread hash codes. Shared across all instances to + * reduce ThreadLocal pollution and because adjustments due to + * collisions in one table are likely to be appropriate for + * others. + */ + static final ThreadHashCode threadHashCode = new ThreadHashCode(); + + /** Number of CPUS, to place bound on table size */ + static final int NCPU = Runtime.getRuntime().availableProcessors(); + + /** + * Table of cells. When non-null, size is a power of 2. + */ + transient volatile Cell[] cells; + + /** + * Base value, used mainly when there is no contention, but also as + * a fallback during table initialization races. Updated via CAS. + */ + transient volatile long base; + + /** + * Spinlock (locked via CAS) used when resizing and/or creating Cells. + */ + transient volatile int busy; + + AtomicLongFieldUpdater<Striped64> BASE_UPDATER = AtomicLongFieldUpdater.newUpdater(Striped64.class, "base"); + AtomicIntegerFieldUpdater<Striped64> BUSY_UPDATER = AtomicIntegerFieldUpdater.newUpdater(Striped64.class, "busy"); + + /** + * Package-private default constructor + */ + Striped64() { + } + + /** + * CASes the base field. + */ + final boolean casBase(long cmp, long val) { + return BASE_UPDATER.compareAndSet(this, cmp, val); + } + + /** + * CASes the busy field from 0 to 1 to acquire lock. + */ + final boolean casBusy() { + return BUSY_UPDATER.compareAndSet(this, 0, 1); + } + + /** + * Computes the function of current and new value. Subclasses + * should open-code this update function for most uses, but the + * virtualized form is needed within retryUpdate. + * + * @param currentValue the current value (of either base or a cell) + * @param newValue the argument from a user update call + * @return result of the update function + */ + abstract long fn(long currentValue, long newValue); + + /** + * Handles cases of updates involving initialization, resizing, + * creating new Cells, and/or contention. See above for + * explanation. This method suffers the usual non-modularity + * problems of optimistic retry code, relying on rechecked sets of + * reads. + * + * @param x the value + * @param hc the hash code holder + * @param wasUncontended false if CAS failed before call + */ + final void retryUpdate(long x, HashCode hc, boolean wasUncontended) { + int h = hc.code; + boolean collide = false; // True if last slot nonempty + for (;;) { + Cell[] as; Cell a; int n; long v; + if ((as = cells) != null && (n = as.length) > 0) { + if ((a = as[(n - 1) & h]) == null) { + if (busy == 0) { // Try to attach new Cell + Cell r = new Cell(x); // Optimistically create + if (busy == 0 && casBusy()) { + boolean created = false; + try { // Recheck under lock + Cell[] rs; int m, j; + if ((rs = cells) != null && + (m = rs.length) > 0 && + rs[j = (m - 1) & h] == null) { + rs[j] = r; + created = true; + } + } finally { + busy = 0; + } + if (created) + break; + continue; // Slot is now non-empty + } + } + collide = false; + } + else if (!wasUncontended) // CAS already known to fail + wasUncontended = true; // Continue after rehash + else if (a.cas(v = a.value, fn(v, x))) + break; + else if (n >= NCPU || cells != as) + collide = false; // At max size or stale + else if (!collide) + collide = true; + else if (busy == 0 && casBusy()) { + try { + if (cells == as) { // Expand table unless stale + Cell[] rs = new Cell[n << 1]; + for (int i = 0; i < n; ++i) + rs[i] = as[i]; + cells = rs; + } + } finally { + busy = 0; + } + collide = false; + continue; // Retry with expanded table + } + h ^= h << 13; // Rehash + h ^= h >>> 17; + h ^= h << 5; + } + else if (busy == 0 && cells == as && casBusy()) { + boolean init = false; + try { // Initialize table + if (cells == as) { + Cell[] rs = new Cell[2]; + rs[h & 1] = new Cell(x); + cells = rs; + init = true; + } + } finally { + busy = 0; + } + if (init) + break; + } + else if (casBase(v = base, fn(v, x))) + break; // Fall back on using base + } + hc.code = h; // Record index for next time + } + + + /** + * Sets base and all cells to the given value. + */ + final void internalReset(long initialValue) { + Cell[] as = cells; + base = initialValue; + if (as != null) { + int n = as.length; + for (int i = 0; i < n; ++i) { + Cell a = as[i]; + if (a != null) + a.value = initialValue; + } + } + } +} \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166y/ThreadLocalRandom.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166y/ThreadLocalRandom.java new file mode 100644 index 000000000000..81ba441b4f63 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/org/jruby/ext/thread_safe/jsr166y/ThreadLocalRandom.java @@ -0,0 +1,199 @@ +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This is based on 1.16 version + +package org.jruby.ext.thread_safe.jsr166y; + +import java.util.Random; + +/** + * A random number generator isolated to the current thread. Like the + * global {@link java.util.Random} generator used by the {@link + * java.lang.Math} class, a {@code ThreadLocalRandom} is initialized + * with an internally generated seed that may not otherwise be + * modified. When applicable, use of {@code ThreadLocalRandom} rather + * than shared {@code Random} objects in concurrent programs will + * typically encounter much less overhead and contention. Use of + * {@code ThreadLocalRandom} is particularly appropriate when multiple + * tasks (for example, each a {@link ForkJoinTask}) use random numbers + * in parallel in thread pools. + * + * <p>Usages of this class should typically be of the form: + * {@code ThreadLocalRandom.current().nextX(...)} (where + * {@code X} is {@code Int}, {@code Long}, etc). + * When all usages are of this form, it is never possible to + * accidently share a {@code ThreadLocalRandom} across multiple threads. + * + * <p>This class also provides additional commonly used bounded random + * generation methods. + * + * @since 1.7 + * @author Doug Lea + */ +public class ThreadLocalRandom extends Random { + // same constants as Random, but must be redeclared because private + private static final long multiplier = 0x5DEECE66DL; + private static final long addend = 0xBL; + private static final long mask = (1L << 48) - 1; + + /** + * The random seed. We can't use super.seed. + */ + private long rnd; + + /** + * Initialization flag to permit calls to setSeed to succeed only + * while executing the Random constructor. We can't allow others + * since it would cause setting seed in one part of a program to + * unintentionally impact other usages by the thread. + */ + boolean initialized; + + // Padding to help avoid memory contention among seed updates in + // different TLRs in the common case that they are located near + // each other. + private long pad0, pad1, pad2, pad3, pad4, pad5, pad6, pad7; + + /** + * The actual ThreadLocal + */ + private static final ThreadLocal<ThreadLocalRandom> localRandom = + new ThreadLocal<ThreadLocalRandom>() { + protected ThreadLocalRandom initialValue() { + return new ThreadLocalRandom(); + } + }; + + + /** + * Constructor called only by localRandom.initialValue. + */ + ThreadLocalRandom() { + super(); + initialized = true; + } + + /** + * Returns the current thread's {@code ThreadLocalRandom}. + * + * @return the current thread's {@code ThreadLocalRandom} + */ + public static ThreadLocalRandom current() { + return localRandom.get(); + } + + /** + * Throws {@code UnsupportedOperationException}. Setting seeds in + * this generator is not supported. + * + * @throws UnsupportedOperationException always + */ + public void setSeed(long seed) { + if (initialized) + throw new UnsupportedOperationException(); + rnd = (seed ^ multiplier) & mask; + } + + protected int next(int bits) { + rnd = (rnd * multiplier + addend) & mask; + return (int) (rnd >>> (48-bits)); + } + + /** + * Returns a pseudorandom, uniformly distributed value between the + * given least value (inclusive) and bound (exclusive). + * + * @param least the least value returned + * @param bound the upper bound (exclusive) + * @throws IllegalArgumentException if least greater than or equal + * to bound + * @return the next value + */ + public int nextInt(int least, int bound) { + if (least >= bound) + throw new IllegalArgumentException(); + return nextInt(bound - least) + least; + } + + /** + * Returns a pseudorandom, uniformly distributed value + * between 0 (inclusive) and the specified value (exclusive). + * + * @param n the bound on the random number to be returned. Must be + * positive. + * @return the next value + * @throws IllegalArgumentException if n is not positive + */ + public long nextLong(long n) { + if (n <= 0) + throw new IllegalArgumentException("n must be positive"); + // Divide n by two until small enough for nextInt. On each + // iteration (at most 31 of them but usually much less), + // randomly choose both whether to include high bit in result + // (offset) and whether to continue with the lower vs upper + // half (which makes a difference only if odd). + long offset = 0; + while (n >= Integer.MAX_VALUE) { + int bits = next(2); + long half = n >>> 1; + long nextn = ((bits & 2) == 0) ? half : n - half; + if ((bits & 1) == 0) + offset += n - nextn; + n = nextn; + } + return offset + nextInt((int) n); + } + + /** + * Returns a pseudorandom, uniformly distributed value between the + * given least value (inclusive) and bound (exclusive). + * + * @param least the least value returned + * @param bound the upper bound (exclusive) + * @return the next value + * @throws IllegalArgumentException if least greater than or equal + * to bound + */ + public long nextLong(long least, long bound) { + if (least >= bound) + throw new IllegalArgumentException(); + return nextLong(bound - least) + least; + } + + /** + * Returns a pseudorandom, uniformly distributed {@code double} value + * between 0 (inclusive) and the specified value (exclusive). + * + * @param n the bound on the random number to be returned. Must be + * positive. + * @return the next value + * @throws IllegalArgumentException if n is not positive + */ + public double nextDouble(double n) { + if (n <= 0) + throw new IllegalArgumentException("n must be positive"); + return nextDouble() * n; + } + + /** + * Returns a pseudorandom, uniformly distributed value between the + * given least value (inclusive) and bound (exclusive). + * + * @param least the least value returned + * @param bound the upper bound (exclusive) + * @return the next value + * @throws IllegalArgumentException if least greater than or equal + * to bound + */ + public double nextDouble(double least, double bound) { + if (least >= bound) + throw new IllegalArgumentException(); + return nextDouble() * (bound - least) + least; + } + + private static final long serialVersionUID = -5851777807851030925L; +} diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/thread_safe/JrubyCacheBackendService.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/thread_safe/JrubyCacheBackendService.java new file mode 100644 index 000000000000..2c5bcea6ec2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/ext/thread_safe/JrubyCacheBackendService.java @@ -0,0 +1,15 @@ +package thread_safe; + +import java.io.IOException; + +import org.jruby.Ruby; +import org.jruby.ext.thread_safe.JRubyCacheBackendLibrary; +import org.jruby.runtime.load.BasicLibraryService; + +// can't name this JRubyCacheBackendService or else JRuby doesn't pick this up +public class JrubyCacheBackendService implements BasicLibraryService { + public boolean basicLoad(final Ruby runtime) throws IOException { + new JRubyCacheBackendLibrary().load(runtime, false); + return true; + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe.rb new file mode 100644 index 000000000000..5b8fb273cd41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe.rb @@ -0,0 +1,65 @@ +require 'thread_safe/version' +require 'thread_safe/synchronized_delegator' + +module ThreadSafe + autoload :Cache, 'thread_safe/cache' + autoload :Util, 'thread_safe/util' + + # Various classes within allows for +nil+ values to be stored, so a special +NULL+ token is required to indicate the "nil-ness". + NULL = Object.new + + if defined?(JRUBY_VERSION) + require 'jruby/synchronized' + + # A thread-safe subclass of Array. This version locks + # against the object itself for every method call, + # ensuring only one thread can be reading or writing + # at a time. This includes iteration methods like + # #each. + class Array < ::Array + include JRuby::Synchronized + end + + # A thread-safe subclass of Hash. This version locks + # against the object itself for every method call, + # ensuring only one thread can be reading or writing + # at a time. This includes iteration methods like + # #each. + class Hash < ::Hash + include JRuby::Synchronized + end + elsif !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' + # Because MRI never runs code in parallel, the existing + # non-thread-safe structures should usually work fine. + Array = ::Array + Hash = ::Hash + elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx' + require 'monitor' + + class Hash < ::Hash; end + class Array < ::Array; end + + [Hash, Array].each do |klass| + klass.class_eval do + private + def _mon_initialize + @_monitor = Monitor.new unless @_monitor # avoid double initialisation + end + + def self.allocate + obj = super + obj.send(:_mon_initialize) + obj + end + end + + klass.superclass.instance_methods(false).each do |method| + klass.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def #{method}(*args) + @_monitor.synchronize { super } + end + RUBY_EVAL + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/atomic_reference_cache_backend.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/atomic_reference_cache_backend.rb new file mode 100644 index 000000000000..7e710b5c3ec3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/atomic_reference_cache_backend.rb @@ -0,0 +1,908 @@ +module ThreadSafe + # A Ruby port of the Doug Lea's jsr166e.ConcurrentHashMapV8 class version 1.59 + # available in public domain. + # + # Original source code available here: + # http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/ConcurrentHashMapV8.java?revision=1.59 + # + # The Ruby port skips out the +TreeBin+ (red-black trees for use in bins whose + # size exceeds a threshold). + # + # A hash table supporting full concurrency of retrievals and high expected + # concurrency for updates. However, even though all operations are + # thread-safe, retrieval operations do _not_ entail locking, and there is + # _not_ any support for locking the entire table in a way that prevents all + # access. + # + # Retrieval operations generally do not block, so may overlap with update + # operations. Retrievals reflect the results of the most recently _completed_ + # update operations holding upon their onset. (More formally, an update + # operation for a given key bears a _happens-before_ relation with any (non + # +nil+) retrieval for that key reporting the updated value.) For aggregate + # operations such as +clear()+, concurrent retrievals may reflect insertion or + # removal of only some entries. Similarly, the +each_pair+ iterator yields + # elements reflecting the state of the hash table at some point at or since + # the start of the +each_pair+. Bear in mind that the results of aggregate + # status methods including +size()+ and +empty?+} are typically useful only + # when a map is not undergoing concurrent updates in other threads. Otherwise + # the results of these methods reflect transient states that may be adequate + # for monitoring or estimation purposes, but not for program control. + # + # The table is dynamically expanded when there are too many collisions (i.e., + # keys that have distinct hash codes but fall into the same slot modulo the + # table size), with the expected average effect of maintaining roughly two + # bins per mapping (corresponding to a 0.75 load factor threshold for + # resizing). There may be much variance around this average as mappings are + # added and removed, but overall, this maintains a commonly accepted + # time/space tradeoff for hash tables. However, resizing this or any other + # kind of hash table may be a relatively slow operation. When possible, it is + # a good idea to provide a size estimate as an optional :initial_capacity + # initializer argument. An additional optional :load_factor constructor + # argument provides a further means of customizing initial table capacity by + # specifying the table density to be used in calculating the amount of space + # to allocate for the given number of elements. Note that using many keys with + # exactly the same +hash+ is a sure way to slow down performance of any hash + # table. + # + # ## Design overview + # + # The primary design goal of this hash table is to maintain concurrent + # readability (typically method +[]+, but also iteration and related methods) + # while minimizing update contention. Secondary goals are to keep space + # consumption about the same or better than plain +Hash+, and to support high + # initial insertion rates on an empty table by many threads. + # + # Each key-value mapping is held in a +Node+. The validation-based approach + # explained below leads to a lot of code sprawl because retry-control + # precludes factoring into smaller methods. + # + # The table is lazily initialized to a power-of-two size upon the first + # insertion. Each bin in the table normally contains a list of +Node+s (most + # often, the list has only zero or one +Node+). Table accesses require + # volatile/atomic reads, writes, and CASes. The lists of nodes within bins are + # always accurately traversable under volatile reads, so long as lookups check + # hash code and non-nullness of value before checking key equality. + # + # We use the top two bits of +Node+ hash fields for control purposes -- they + # are available anyway because of addressing constraints. As explained further + # below, these top bits are used as follows: + # + # - 00 - Normal + # - 01 - Locked + # - 11 - Locked and may have a thread waiting for lock + # - 10 - +Node+ is a forwarding node + # + # The lower 28 bits of each +Node+'s hash field contain a the key's hash code, + # except for forwarding nodes, for which the lower bits are zero (and so + # always have hash field == +MOVED+). + # + # Insertion (via +[]=+ or its variants) of the first node in an empty bin is + # performed by just CASing it to the bin. This is by far the most common case + # for put operations under most key/hash distributions. Other update + # operations (insert, delete, and replace) require locks. We do not want to + # waste the space required to associate a distinct lock object with each bin, + # so instead use the first node of a bin list itself as a lock. Blocking + # support for these locks relies +Util::CheapLockable. However, we also need a + # +try_lock+ construction, so we overlay these by using bits of the +Node+ + # hash field for lock control (see above), and so normally use builtin + # monitors only for blocking and signalling using + # +cheap_wait+/+cheap_broadcast+ constructions. See +Node#try_await_lock+. + # + # Using the first node of a list as a lock does not by itself suffice though: + # When a node is locked, any update must first validate that it is still the + # first node after locking it, and retry if not. Because new nodes are always + # appended to lists, once a node is first in a bin, it remains first until + # deleted or the bin becomes invalidated (upon resizing). However, operations + # that only conditionally update may inspect nodes until the point of update. + # This is a converse of sorts to the lazy locking technique described by + # Herlihy & Shavit. + # + # The main disadvantage of per-bin locks is that other update operations on + # other nodes in a bin list protected by the same lock can stall, for example + # when user +eql?+ or mapping functions take a long time. However, + # statistically, under random hash codes, this is not a common problem. + # Ideally, the frequency of nodes in bins follows a Poisson distribution + # (http://en.wikipedia.org/wiki/Poisson_distribution) with a parameter of + # about 0.5 on average, given the resizing threshold of 0.75, although with a + # large variance because of resizing granularity. Ignoring variance, the + # expected occurrences of list size k are (exp(-0.5) * pow(0.5, k) / + # factorial(k)). The first values are: + # + # - 0: 0.60653066 + # - 1: 0.30326533 + # - 2: 0.07581633 + # - 3: 0.01263606 + # - 4: 0.00157952 + # - 5: 0.00015795 + # - 6: 0.00001316 + # - 7: 0.00000094 + # - 8: 0.00000006 + # - more: less than 1 in ten million + # + # Lock contention probability for two threads accessing distinct elements is + # roughly 1 / (8 * #elements) under random hashes. + # + # The table is resized when occupancy exceeds a percentage threshold + # (nominally, 0.75, but see below). Only a single thread performs the resize + # (using field +size_control+, to arrange exclusion), but the table otherwise + # remains usable for reads and updates. Resizing proceeds by transferring + # bins, one by one, from the table to the next table. Because we are using + # power-of-two expansion, the elements from each bin must either stay at same + # index, or move with a power of two offset. We eliminate unnecessary node + # creation by catching cases where old nodes can be reused because their next + # fields won't change. On average, only about one-sixth of them need cloning + # when a table doubles. The nodes they replace will be garbage collectable as + # soon as they are no longer referenced by any reader thread that may be in + # the midst of concurrently traversing table. Upon transfer, the old table bin + # contains only a special forwarding node (with hash field +MOVED+) that + # contains the next table as its key. On encountering a forwarding node, + # access and update operations restart, using the new table. + # + # Each bin transfer requires its bin lock. However, unlike other cases, a + # transfer can skip a bin if it fails to acquire its lock, and revisit it + # later. Method +rebuild+ maintains a buffer of TRANSFER_BUFFER_SIZE bins that + # have been skipped because of failure to acquire a lock, and blocks only if + # none are available (i.e., only very rarely). The transfer operation must + # also ensure that all accessible bins in both the old and new table are + # usable by any traversal. When there are no lock acquisition failures, this + # is arranged simply by proceeding from the last bin (+table.size - 1+) up + # towards the first. Upon seeing a forwarding node, traversals arrange to move + # to the new table without revisiting nodes. However, when any node is skipped + # during a transfer, all earlier table bins may have become visible, so are + # initialized with a reverse-forwarding node back to the old table until the + # new ones are established. (This sometimes requires transiently locking a + # forwarding node, which is possible under the above encoding.) These more + # expensive mechanics trigger only when necessary. + # + # The traversal scheme also applies to partial traversals of + # ranges of bins (via an alternate Traverser constructor) + # to support partitioned aggregate operations. Also, read-only + # operations give up if ever forwarded to a null table, which + # provides support for shutdown-style clearing, which is also not + # currently implemented. + # + # Lazy table initialization minimizes footprint until first use. + # + # The element count is maintained using a +ThreadSafe::Util::Adder+, + # which avoids contention on updates but can encounter cache thrashing + # if read too frequently during concurrent access. To avoid reading so + # often, resizing is attempted either when a bin lock is + # contended, or upon adding to a bin already holding two or more + # nodes (checked before adding in the +x_if_absent+ methods, after + # adding in others). Under uniform hash distributions, the + # probability of this occurring at threshold is around 13%, + # meaning that only about 1 in 8 puts check threshold (and after + # resizing, many fewer do so). But this approximation has high + # variance for small table sizes, so we check on any collision + # for sizes <= 64. The bulk putAll operation further reduces + # contention by only committing count updates upon these size + # checks. + class AtomicReferenceCacheBackend + class Table < Util::PowerOfTwoTuple + def cas_new_node(i, hash, key, value) + cas(i, nil, Node.new(hash, key, value)) + end + + def try_to_cas_in_computed(i, hash, key) + succeeded = false + new_value = nil + new_node = Node.new(locked_hash = hash | LOCKED, key, NULL) + if cas(i, nil, new_node) + begin + if NULL == (new_value = yield(NULL)) + was_null = true + else + new_node.value = new_value + end + succeeded = true + ensure + volatile_set(i, nil) if !succeeded || was_null + new_node.unlock_via_hash(locked_hash, hash) + end + end + return succeeded, new_value + end + + def try_lock_via_hash(i, node, node_hash) + node.try_lock_via_hash(node_hash) do + yield if volatile_get(i) == node + end + end + + def delete_node_at(i, node, predecessor_node) + if predecessor_node + predecessor_node.next = node.next + else + volatile_set(i, node.next) + end + end + end + + # Key-value entry. Nodes with a hash field of +MOVED+ are special, and do + # not contain user keys or values. Otherwise, keys are never +nil+, and + # +NULL+ +value+ fields indicate that a node is in the process of being + # deleted or created. For purposes of read-only access, a key may be read + # before a value, but can only be used after checking value to be +!= NULL+. + class Node + extend Util::Volatile + attr_volatile :hash, :value, :next + + include Util::CheapLockable + + bit_shift = Util::FIXNUM_BIT_SIZE - 2 # need 2 bits for ourselves + # Encodings for special uses of Node hash fields. See above for explanation. + MOVED = ('10' << ('0' * bit_shift)).to_i(2) # hash field for forwarding nodes + LOCKED = ('01' << ('0' * bit_shift)).to_i(2) # set/tested only as a bit + WAITING = ('11' << ('0' * bit_shift)).to_i(2) # both bits set/tested together + HASH_BITS = ('00' << ('1' * bit_shift)).to_i(2) # usable bits of normal node hash + + SPIN_LOCK_ATTEMPTS = Util::CPU_COUNT > 1 ? Util::CPU_COUNT * 2 : 0 + + attr_reader :key + + def initialize(hash, key, value, next_node = nil) + super() + @key = key + self.lazy_set_hash(hash) + self.lazy_set_value(value) + self.next = next_node + end + + # Spins a while if +LOCKED+ bit set and this node is the first of its bin, + # and then sets +WAITING+ bits on hash field and blocks (once) if they are + # still set. It is OK for this method to return even if lock is not + # available upon exit, which enables these simple single-wait mechanics. + # + # The corresponding signalling operation is performed within callers: Upon + # detecting that +WAITING+ has been set when unlocking lock (via a failed + # CAS from non-waiting +LOCKED+ state), unlockers acquire the + # +cheap_synchronize+ lock and perform a +cheap_broadcast+. + def try_await_lock(table, i) + if table && i >= 0 && i < table.size # bounds check, TODO: why are we bounds checking? + spins = SPIN_LOCK_ATTEMPTS + randomizer = base_randomizer = Util::XorShiftRandom.get + while equal?(table.volatile_get(i)) && self.class.locked_hash?(my_hash = hash) + if spins >= 0 + if (randomizer = (randomizer >> 1)).even? # spin at random + if (spins -= 1) == 0 + Thread.pass # yield before blocking + else + randomizer = base_randomizer = Util::XorShiftRandom.xorshift(base_randomizer) if randomizer.zero? + end + end + elsif cas_hash(my_hash, my_hash | WAITING) + force_aquire_lock(table, i) + break + end + end + end + end + + def key?(key) + @key.eql?(key) + end + + def matches?(key, hash) + pure_hash == hash && key?(key) + end + + def pure_hash + hash & HASH_BITS + end + + def try_lock_via_hash(node_hash = hash) + if cas_hash(node_hash, locked_hash = node_hash | LOCKED) + begin + yield + ensure + unlock_via_hash(locked_hash, node_hash) + end + end + end + + def locked? + self.class.locked_hash?(hash) + end + + def unlock_via_hash(locked_hash, node_hash) + unless cas_hash(locked_hash, node_hash) + self.hash = node_hash + cheap_synchronize { cheap_broadcast } + end + end + + private + def force_aquire_lock(table, i) + cheap_synchronize do + if equal?(table.volatile_get(i)) && (hash & WAITING) == WAITING + cheap_wait + else + cheap_broadcast # possibly won race vs signaller + end + end + end + + class << self + def locked_hash?(hash) + (hash & LOCKED) != 0 + end + end + end + + # shorthands + MOVED = Node::MOVED + LOCKED = Node::LOCKED + WAITING = Node::WAITING + HASH_BITS = Node::HASH_BITS + + NOW_RESIZING = -1 + DEFAULT_CAPACITY = 16 + MAX_CAPACITY = Util::MAX_INT + + # The buffer size for skipped bins during transfers. The + # value is arbitrary but should be large enough to avoid + # most locking stalls during resizes. + TRANSFER_BUFFER_SIZE = 32 + + extend Util::Volatile + attr_volatile :table, # The array of bins. Lazily initialized upon first insertion. Size is always a power of two. + + # Table initialization and resizing control. When negative, the + # table is being initialized or resized. Otherwise, when table is + # null, holds the initial table size to use upon creation, or 0 + # for default. After initialization, holds the next element count + # value upon which to resize the table. + :size_control + + def initialize(options = nil) + super() + @counter = Util::Adder.new + initial_capacity = options && options[:initial_capacity] || DEFAULT_CAPACITY + self.size_control = (capacity = table_size_for(initial_capacity)) > MAX_CAPACITY ? MAX_CAPACITY : capacity + end + + def get_or_default(key, else_value = nil) + hash = key_hash(key) + current_table = table + while current_table + node = current_table.volatile_get_by_hash(hash) + current_table = + while node + if (node_hash = node.hash) == MOVED + break node.key + elsif (node_hash & HASH_BITS) == hash && node.key?(key) && NULL != (value = node.value) + return value + end + node = node.next + end + end + else_value + end + + def [](key) + get_or_default(key) + end + + def key?(key) + get_or_default(key, NULL) != NULL + end + + def []=(key, value) + get_and_set(key, value) + value + end + + def compute_if_absent(key) + hash = key_hash(key) + current_table = table || initialize_table + while true + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + succeeded, new_value = current_table.try_to_cas_in_computed(i, hash, key) { yield } + if succeeded + increment_size + return new_value + end + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif NULL != (current_value = find_value_in_node_list(node, key, hash, node_hash & HASH_BITS)) + return current_value + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, value = attempt_internal_compute_if_absent(key, hash, current_table, i, node, node_hash) { yield } + return value if succeeded + end + end + end + + def compute_if_present(key) + new_value = nil + internal_replace(key) do |old_value| + if (new_value = yield(NULL == old_value ? nil : old_value)).nil? + NULL + else + new_value + end + end + new_value + end + + def compute(key) + internal_compute(key) do |old_value| + if (new_value = yield(NULL == old_value ? nil : old_value)).nil? + NULL + else + new_value + end + end + end + + def merge_pair(key, value) + internal_compute(key) do |old_value| + if NULL == old_value || !(value = yield(old_value)).nil? + value + else + NULL + end + end + end + + def replace_pair(key, old_value, new_value) + NULL != internal_replace(key, old_value) { new_value } + end + + def replace_if_exists(key, new_value) + if (result = internal_replace(key) { new_value }) && NULL != result + result + end + end + + def get_and_set(key, value) # internalPut in the original CHMV8 + hash = key_hash(key) + current_table = table || initialize_table + while true + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + if current_table.cas_new_node(i, hash, key, value) + increment_size + break + end + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, old_value = attempt_get_and_set(key, value, hash, current_table, i, node, node_hash) + break old_value if succeeded + end + end + end + + def delete(key) + replace_if_exists(key, NULL) + end + + def delete_pair(key, value) + result = internal_replace(key, value) { NULL } + if result && NULL != result + !!result + else + false + end + end + + def each_pair + return self unless current_table = table + current_table_size = base_size = current_table.size + i = base_index = 0 + while base_index < base_size + if node = current_table.volatile_get(i) + if node.hash == MOVED + current_table = node.key + current_table_size = current_table.size + else + begin + if NULL != (value = node.value) # skip deleted or special nodes + yield node.key, value + end + end while node = node.next + end + end + + if (i_with_base = i + base_size) < current_table_size + i = i_with_base # visit upper slots if present + else + i = base_index += 1 + end + end + self + end + + def size + (sum = @counter.sum) < 0 ? 0 : sum # ignore transient negative values + end + + def empty? + size == 0 + end + + # Implementation for clear. Steps through each bin, removing all nodes. + def clear + return self unless current_table = table + current_table_size = current_table.size + deleted_count = i = 0 + while i < current_table_size + if !(node = current_table.volatile_get(i)) + i += 1 + elsif (node_hash = node.hash) == MOVED + current_table = node.key + current_table_size = current_table.size + elsif Node.locked_hash?(node_hash) + decrement_size(deleted_count) # opportunistically update count + deleted_count = 0 + node.try_await_lock(current_table, i) + else + current_table.try_lock_via_hash(i, node, node_hash) do + begin + deleted_count += 1 if NULL != node.value # recheck under lock + node.value = nil + end while node = node.next + current_table.volatile_set(i, nil) + i += 1 + end + end + end + decrement_size(deleted_count) + self + end + + private + # Internal versions of the insertion methods, each a + # little more complicated than the last. All have + # the same basic structure: + # 1. If table uninitialized, create + # 2. If bin empty, try to CAS new node + # 3. If bin stale, use new table + # 4. Lock and validate; if valid, scan and add or update + # + # The others interweave other checks and/or alternative actions: + # * Plain +get_and_set+ checks for and performs resize after insertion. + # * compute_if_absent prescans for mapping without lock (and fails to add + # if present), which also makes pre-emptive resize checks worthwhile. + # + # Someday when details settle down a bit more, it might be worth + # some factoring to reduce sprawl. + def internal_replace(key, expected_old_value = NULL, &block) + hash = key_hash(key) + current_table = table + while current_table + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + break + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif (node_hash & HASH_BITS) != hash && !node.next # precheck + break # rules out possible existence + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, old_value = attempt_internal_replace(key, expected_old_value, hash, current_table, i, node, node_hash, &block) + return old_value if succeeded + end + end + NULL + end + + def attempt_internal_replace(key, expected_old_value, hash, current_table, i, node, node_hash) + current_table.try_lock_via_hash(i, node, node_hash) do + predecessor_node = nil + old_value = NULL + begin + if node.matches?(key, hash) && NULL != (current_value = node.value) + if NULL == expected_old_value || expected_old_value == current_value # NULL == expected_old_value means whatever value + old_value = current_value + if NULL == (node.value = yield(old_value)) + current_table.delete_node_at(i, node, predecessor_node) + decrement_size + end + end + break + end + + predecessor_node = node + end while node = node.next + + return true, old_value + end + end + + def find_value_in_node_list(node, key, hash, pure_hash) + do_check_for_resize = false + while true + if pure_hash == hash && node.key?(key) && NULL != (value = node.value) + return value + elsif node = node.next + do_check_for_resize = true # at least 2 nodes -> check for resize + pure_hash = node.pure_hash + else + return NULL + end + end + ensure + check_for_resize if do_check_for_resize + end + + def internal_compute(key, &block) + hash = key_hash(key) + current_table = table || initialize_table + while true + if !(node = current_table.volatile_get(i = current_table.hash_to_index(hash))) + succeeded, new_value = current_table.try_to_cas_in_computed(i, hash, key, &block) + if succeeded + if NULL == new_value + break nil + else + increment_size + break new_value + end + end + elsif (node_hash = node.hash) == MOVED + current_table = node.key + elsif Node.locked_hash?(node_hash) + try_await_lock(current_table, i, node) + else + succeeded, new_value = attempt_compute(key, hash, current_table, i, node, node_hash, &block) + break new_value if succeeded + end + end + end + + def attempt_internal_compute_if_absent(key, hash, current_table, i, node, node_hash) + added = false + current_table.try_lock_via_hash(i, node, node_hash) do + while true + if node.matches?(key, hash) && NULL != (value = node.value) + return true, value + end + last = node + unless node = node.next + last.next = Node.new(hash, key, value = yield) + added = true + increment_size + return true, value + end + end + end + ensure + check_for_resize if added + end + + def attempt_compute(key, hash, current_table, i, node, node_hash) + added = false + current_table.try_lock_via_hash(i, node, node_hash) do + predecessor_node = nil + while true + if node.matches?(key, hash) && NULL != (value = node.value) + if NULL == (node.value = value = yield(value)) + current_table.delete_node_at(i, node, predecessor_node) + decrement_size + value = nil + end + return true, value + end + predecessor_node = node + unless node = node.next + if NULL == (value = yield(NULL)) + value = nil + else + predecessor_node.next = Node.new(hash, key, value) + added = true + increment_size + end + return true, value + end + end + end + ensure + check_for_resize if added + end + + def attempt_get_and_set(key, value, hash, current_table, i, node, node_hash) + node_nesting = nil + current_table.try_lock_via_hash(i, node, node_hash) do + node_nesting = 1 + old_value = nil + found_old_value = false + while node + if node.matches?(key, hash) && NULL != (old_value = node.value) + found_old_value = true + node.value = value + break + end + last = node + unless node = node.next + last.next = Node.new(hash, key, value) + break + end + node_nesting += 1 + end + + return true, old_value if found_old_value + increment_size + true + end + ensure + check_for_resize if node_nesting && (node_nesting > 1 || current_table.size <= 64) + end + + def initialize_copy(other) + super + @counter = Util::Adder.new + self.table = nil + self.size_control = (other_table = other.table) ? other_table.size : DEFAULT_CAPACITY + self + end + + def try_await_lock(current_table, i, node) + check_for_resize # try resizing if can't get lock + node.try_await_lock(current_table, i) + end + + def key_hash(key) + key.hash & HASH_BITS + end + + # Returns a power of two table size for the given desired capacity. + def table_size_for(entry_count) + size = 2 + size <<= 1 while size < entry_count + size + end + + # Initializes table, using the size recorded in +size_control+. + def initialize_table + until current_table ||= table + if (size_ctrl = size_control) == NOW_RESIZING + Thread.pass # lost initialization race; just spin + else + try_in_resize_lock(current_table, size_ctrl) do + initial_size = size_ctrl > 0 ? size_ctrl : DEFAULT_CAPACITY + current_table = self.table = Table.new(initial_size) + initial_size - (initial_size >> 2) # 75% load factor + end + end + end + current_table + end + + # If table is too small and not already resizing, creates next table and + # transfers bins. Rechecks occupancy after a transfer to see if another + # resize is already needed because resizings are lagging additions. + def check_for_resize + while (current_table = table) && MAX_CAPACITY > (table_size = current_table.size) && NOW_RESIZING != (size_ctrl = size_control) && size_ctrl < @counter.sum + try_in_resize_lock(current_table, size_ctrl) do + self.table = rebuild(current_table) + (table_size << 1) - (table_size >> 1) # 75% load factor + end + end + end + + def try_in_resize_lock(current_table, size_ctrl) + if cas_size_control(size_ctrl, NOW_RESIZING) + begin + if current_table == table # recheck under lock + size_ctrl = yield # get new size_control + end + ensure + self.size_control = size_ctrl + end + end + end + + # Moves and/or copies the nodes in each bin to new table. See above for explanation. + def rebuild(table) + old_table_size = table.size + new_table = table.next_in_size_table + # puts "#{old_table_size} -> #{new_table.size}" + forwarder = Node.new(MOVED, new_table, NULL) + rev_forwarder = nil + locked_indexes = nil # holds bins to revisit; nil until needed + locked_arr_idx = 0 + bin = old_table_size - 1 + i = bin + while true + if !(node = table.volatile_get(i)) + # no lock needed (or available) if bin >= 0, because we're not popping values from locked_indexes until we've run through the whole table + redo unless (bin >= 0 ? table.cas(i, nil, forwarder) : lock_and_clean_up_reverse_forwarders(table, old_table_size, new_table, i, forwarder)) + elsif Node.locked_hash?(node_hash = node.hash) + locked_indexes ||= Array.new + if bin < 0 && locked_arr_idx > 0 + locked_arr_idx -= 1 + i, locked_indexes[locked_arr_idx] = locked_indexes[locked_arr_idx], i # swap with another bin + redo + end + if bin < 0 || locked_indexes.size >= TRANSFER_BUFFER_SIZE + node.try_await_lock(table, i) # no other options -- block + redo + end + rev_forwarder ||= Node.new(MOVED, table, NULL) + redo unless table.volatile_get(i) == node && node.locked? # recheck before adding to list + locked_indexes << i + new_table.volatile_set(i, rev_forwarder) + new_table.volatile_set(i + old_table_size, rev_forwarder) + else + redo unless split_old_bin(table, new_table, i, node, node_hash, forwarder) + end + + if bin > 0 + i = (bin -= 1) + elsif locked_indexes && !locked_indexes.empty? + bin = -1 + i = locked_indexes.pop + locked_arr_idx = locked_indexes.size - 1 + else + return new_table + end + end + end + + def lock_and_clean_up_reverse_forwarders(old_table, old_table_size, new_table, i, forwarder) + # transiently use a locked forwarding node + locked_forwarder = Node.new(moved_locked_hash = MOVED | LOCKED, new_table, NULL) + if old_table.cas(i, nil, locked_forwarder) + new_table.volatile_set(i, nil) # kill the potential reverse forwarders + new_table.volatile_set(i + old_table_size, nil) # kill the potential reverse forwarders + old_table.volatile_set(i, forwarder) + locked_forwarder.unlock_via_hash(moved_locked_hash, MOVED) + true + end + end + + # Splits a normal bin with list headed by e into lo and hi parts; installs in given table. + def split_old_bin(table, new_table, i, node, node_hash, forwarder) + table.try_lock_via_hash(i, node, node_hash) do + split_bin(new_table, i, node, node_hash) + table.volatile_set(i, forwarder) + end + end + + def split_bin(new_table, i, node, node_hash) + bit = new_table.size >> 1 # bit to split on + run_bit = node_hash & bit + last_run = nil + low = nil + high = nil + current_node = node + # this optimises for the lowest amount of volatile writes and objects created + while current_node = current_node.next + unless (b = current_node.hash & bit) == run_bit + run_bit = b + last_run = current_node + end + end + if run_bit == 0 + low = last_run + else + high = last_run + end + current_node = node + until current_node == last_run + pure_hash = current_node.pure_hash + if (pure_hash & bit) == 0 + low = Node.new(pure_hash, current_node.key, current_node.value, low) + else + high = Node.new(pure_hash, current_node.key, current_node.value, high) + end + current_node = current_node.next + end + new_table.volatile_set(i, low) + new_table.volatile_set(i + bit, high) + end + + def increment_size + @counter.increment + end + + def decrement_size(by = 1) + @counter.add(-by) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/cache.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/cache.rb new file mode 100644 index 000000000000..265c0e5e3378 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/cache.rb @@ -0,0 +1,161 @@ +require 'thread' + +module ThreadSafe + autoload :JRubyCacheBackend, 'thread_safe/jruby_cache_backend' + autoload :MriCacheBackend, 'thread_safe/mri_cache_backend' + autoload :NonConcurrentCacheBackend, 'thread_safe/non_concurrent_cache_backend' + autoload :AtomicReferenceCacheBackend, 'thread_safe/atomic_reference_cache_backend' + autoload :SynchronizedCacheBackend, 'thread_safe/synchronized_cache_backend' + + ConcurrentCacheBackend = if defined?(RUBY_ENGINE) + case RUBY_ENGINE + when 'jruby'; JRubyCacheBackend + when 'ruby'; MriCacheBackend + when 'rbx'; AtomicReferenceCacheBackend + else + warn 'ThreadSafe: unsupported Ruby engine, using a fully synchronized ThreadSafe::Cache implementation' if $VERBOSE + SynchronizedCacheBackend + end + else + MriCacheBackend + end + + class Cache < ConcurrentCacheBackend + def initialize(options = nil, &block) + if options.kind_of?(::Hash) + validate_options_hash!(options) + else + options = nil + end + + super(options) + @default_proc = block + end + + def [](key) + if value = super # non-falsy value is an existing mapping, return it right away + value + # re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call + # a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value + # would be returned) + # note: nil == value check is not technically necessary + elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL)) + @default_proc.call(self, key) + else + value + end + end + + alias_method :get, :[] + alias_method :put, :[]= + + def fetch(key, default_value = NULL) + if NULL != (value = get_or_default(key, NULL)) + value + elsif block_given? + yield key + elsif NULL != default_value + default_value + else + raise_fetch_no_key + end + end + + def fetch_or_store(key, default_value = NULL) + fetch(key) do + put(key, block_given? ? yield(key) : (NULL == default_value ? raise_fetch_no_key : default_value)) + end + end + + def put_if_absent(key, value) + computed = false + result = compute_if_absent(key) do + computed = true + value + end + computed ? nil : result + end unless method_defined?(:put_if_absent) + + def value?(value) + each_value do |v| + return true if value.equal?(v) + end + false + end unless method_defined?(:value?) + + def keys + arr = [] + each_pair {|k, v| arr << k} + arr + end unless method_defined?(:keys) + + def values + arr = [] + each_pair {|k, v| arr << v} + arr + end unless method_defined?(:values) + + def each_key + each_pair {|k, v| yield k} + end unless method_defined?(:each_key) + + def each_value + each_pair {|k, v| yield v} + end unless method_defined?(:each_value) + + def key(value) + each_pair {|k, v| return k if v == value} + nil + end unless method_defined?(:key) + alias_method :index, :key if RUBY_VERSION < '1.9' + + def empty? + each_pair {|k, v| return false} + true + end unless method_defined?(:empty?) + + def size + count = 0 + each_pair {|k, v| count += 1} + count + end unless method_defined?(:size) + + def marshal_dump + raise TypeError, "can't dump hash with default proc" if @default_proc + h = {} + each_pair {|k, v| h[k] = v} + h + end + + def marshal_load(hash) + initialize + populate_from(hash) + end + + undef :freeze + + private + def raise_fetch_no_key + raise KeyError, 'key not found' + end + + def initialize_copy(other) + super + populate_from(other) + end + + def populate_from(hash) + hash.each_pair {|k, v| self[k] = v} + self + end + + def validate_options_hash!(options) + if (initial_capacity = options[:initial_capacity]) && (!initial_capacity.kind_of?(0.class) || initial_capacity < 0) + raise ArgumentError, ":initial_capacity must be a positive #{0.class}" + end + if (load_factor = options[:load_factor]) && (!load_factor.kind_of?(Numeric) || load_factor <= 0 || load_factor > 1) + raise ArgumentError, ":load_factor must be a number between 0 and 1" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/mri_cache_backend.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/mri_cache_backend.rb new file mode 100644 index 000000000000..13e57b335a2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/mri_cache_backend.rb @@ -0,0 +1,60 @@ +module ThreadSafe + class MriCacheBackend < NonConcurrentCacheBackend + # We can get away with a single global write lock (instead of a per-instance + # one) because of the GVL/green threads. + # + # NOTE: a neat idea of writing a c-ext to manually perform atomic + # put_if_absent, while relying on Ruby not releasing a GVL while calling a + # c-ext will not work because of the potentially Ruby implemented `#hash` + # and `#eql?` key methods. + WRITE_LOCK = Mutex.new + + def []=(key, value) + WRITE_LOCK.synchronize { super } + end + + def compute_if_absent(key) + if stored_value = _get(key) # fast non-blocking path for the most likely case + stored_value + else + WRITE_LOCK.synchronize { super } + end + end + + def compute_if_present(key) + WRITE_LOCK.synchronize { super } + end + + def compute(key) + WRITE_LOCK.synchronize { super } + end + + def merge_pair(key, value) + WRITE_LOCK.synchronize { super } + end + + def replace_pair(key, old_value, new_value) + WRITE_LOCK.synchronize { super } + end + + def replace_if_exists(key, new_value) + WRITE_LOCK.synchronize { super } + end + + def get_and_set(key, value) + WRITE_LOCK.synchronize { super } + end + + def delete(key) + WRITE_LOCK.synchronize { super } + end + + def delete_pair(key, value) + WRITE_LOCK.synchronize { super } + end + + def clear + WRITE_LOCK.synchronize { super } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/non_concurrent_cache_backend.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/non_concurrent_cache_backend.rb new file mode 100644 index 000000000000..111ae63e584b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/non_concurrent_cache_backend.rb @@ -0,0 +1,135 @@ +module ThreadSafe + class NonConcurrentCacheBackend + # WARNING: all public methods of the class must operate on the @backend + # directly without calling each other. This is important because of the + # SynchronizedCacheBackend which uses a non-reentrant mutex for perfomance + # reasons. + def initialize(options = nil) + @backend = {} + end + + def [](key) + @backend[key] + end + + def []=(key, value) + @backend[key] = value + end + + def compute_if_absent(key) + if NULL != (stored_value = @backend.fetch(key, NULL)) + stored_value + else + @backend[key] = yield + end + end + + def replace_pair(key, old_value, new_value) + if pair?(key, old_value) + @backend[key] = new_value + true + else + false + end + end + + def replace_if_exists(key, new_value) + if NULL != (stored_value = @backend.fetch(key, NULL)) + @backend[key] = new_value + stored_value + end + end + + def compute_if_present(key) + if NULL != (stored_value = @backend.fetch(key, NULL)) + store_computed_value(key, yield(stored_value)) + end + end + + def compute(key) + store_computed_value(key, yield(@backend[key])) + end + + def merge_pair(key, value) + if NULL == (stored_value = @backend.fetch(key, NULL)) + @backend[key] = value + else + store_computed_value(key, yield(stored_value)) + end + end + + def get_and_set(key, value) + stored_value = @backend[key] + @backend[key] = value + stored_value + end + + def key?(key) + @backend.key?(key) + end + + def value?(value) + @backend.value?(value) + end + + def delete(key) + @backend.delete(key) + end + + def delete_pair(key, value) + if pair?(key, value) + @backend.delete(key) + true + else + false + end + end + + def clear + @backend.clear + self + end + + def each_pair + dupped_backend.each_pair do |k, v| + yield k, v + end + self + end + + def size + @backend.size + end + + def get_or_default(key, default_value) + @backend.fetch(key, default_value) + end + + alias_method :_get, :[] + alias_method :_set, :[]= + private :_get, :_set + private + def initialize_copy(other) + super + @backend = {} + self + end + + def dupped_backend + @backend.dup + end + + def pair?(key, expected_value) + NULL != (stored_value = @backend.fetch(key, NULL)) && expected_value.equal?(stored_value) + end + + def store_computed_value(key, new_value) + if new_value.nil? + @backend.delete(key) + nil + else + @backend[key] = new_value + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/synchronized_cache_backend.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/synchronized_cache_backend.rb new file mode 100644 index 000000000000..2af3b8cf78ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/synchronized_cache_backend.rb @@ -0,0 +1,77 @@ +module ThreadSafe + class SynchronizedCacheBackend < NonConcurrentCacheBackend + require 'mutex_m' + include Mutex_m + # WARNING: Mutex_m is a non-reentrant lock, so the synchronized methods are + # not allowed to call each other. + + def [](key) + synchronize { super } + end + + def []=(key, value) + synchronize { super } + end + + def compute_if_absent(key) + synchronize { super } + end + + def compute_if_present(key) + synchronize { super } + end + + def compute(key) + synchronize { super } + end + + def merge_pair(key, value) + synchronize { super } + end + + def replace_pair(key, old_value, new_value) + synchronize { super } + end + + def replace_if_exists(key, new_value) + synchronize { super } + end + + def get_and_set(key, value) + synchronize { super } + end + + def key?(key) + synchronize { super } + end + + def value?(value) + synchronize { super } + end + + def delete(key) + synchronize { super } + end + + def delete_pair(key, value) + synchronize { super } + end + + def clear + synchronize { super } + end + + def size + synchronize { super } + end + + def get_or_default(key, default_value) + synchronize { super } + end + + private + def dupped_backend + synchronize { super } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/synchronized_delegator.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/synchronized_delegator.rb new file mode 100644 index 000000000000..2fc351d91e61 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/synchronized_delegator.rb @@ -0,0 +1,43 @@ +require 'delegate' +require 'monitor' + +# This class provides a trivial way to synchronize all calls to a given object +# by wrapping it with a `Delegator` that performs `Monitor#enter/exit` calls +# around the delegated `#send`. Example: +# +# array = [] # not thread-safe on many impls +# array = SynchronizedDelegator.new([]) # thread-safe +# +# A simple `Monitor` provides a very coarse-grained way to synchronize a given +# object, in that it will cause synchronization for methods that have no need +# for it, but this is a trivial way to get thread-safety where none may exist +# currently on some implementations. +# +# This class is currently being considered for inclusion into stdlib, via +# https://bugs.ruby-lang.org/issues/8556 +class SynchronizedDelegator < SimpleDelegator + def setup + @old_abort = Thread.abort_on_exception + Thread.abort_on_exception = true + end + + def teardown + Thread.abort_on_exception = @old_abort + end + + def initialize(obj) + __setobj__(obj) + @monitor = Monitor.new + end + + def method_missing(method, *args, &block) + monitor = @monitor + begin + monitor.enter + super + ensure + monitor.exit + end + end + +end unless defined?(SynchronizedDelegator) diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util.rb new file mode 100644 index 000000000000..bad423889f04 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util.rb @@ -0,0 +1,16 @@ +module ThreadSafe + module Util + FIXNUM_BIT_SIZE = (0.size * 8) - 2 + MAX_INT = (2 ** FIXNUM_BIT_SIZE) - 1 + CPU_COUNT = 16 # is there a way to determine this? + + autoload :AtomicReference, 'thread_safe/util/atomic_reference' + autoload :Adder, 'thread_safe/util/adder' + autoload :CheapLockable, 'thread_safe/util/cheap_lockable' + autoload :PowerOfTwoTuple, 'thread_safe/util/power_of_two_tuple' + autoload :Striped64, 'thread_safe/util/striped64' + autoload :Volatile, 'thread_safe/util/volatile' + autoload :VolatileTuple, 'thread_safe/util/volatile_tuple' + autoload :XorShiftRandom, 'thread_safe/util/xor_shift_random' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/adder.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/adder.rb new file mode 100644 index 000000000000..aefda5f2bf4b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/adder.rb @@ -0,0 +1,62 @@ +module ThreadSafe + module Util + # A Ruby port of the Doug Lea's jsr166e.LondAdder class version 1.8 + # available in public domain. + # + # Original source code available here: + # http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/LongAdder.java?revision=1.8 + # + # One or more variables that together maintain an initially zero + # sum. When updates (method +add+) are contended across threads, + # the set of variables may grow dynamically to reduce contention. + # Method +sum+ returns the current total combined across the + # variables maintaining the sum. + # + # This class is usually preferable to single +Atomic+ reference when + # multiple threads update a common sum that is used for purposes such + # as collecting statistics, not for fine-grained synchronization + # control. Under low update contention, the two classes have similar + # characteristics. But under high contention, expected throughput of + # this class is significantly higher, at the expense of higher space + # consumption. + class Adder < Striped64 + # Adds the given value. + def add(x) + if (current_cells = cells) || !cas_base_computed {|current_base| current_base + x} + was_uncontended = true + hash = hash_code + unless current_cells && (cell = current_cells.volatile_get_by_hash(hash)) && (was_uncontended = cell.cas_computed {|current_value| current_value + x}) + retry_update(x, hash, was_uncontended) {|current_value| current_value + x} + end + end + end + + def increment + add(1) + end + + def decrement + add(-1) + end + + # Returns the current sum. The returned value is _NOT_ an + # atomic snapshot: Invocation in the absence of concurrent + # updates returns an accurate result, but concurrent updates that + # occur while the sum is being calculated might not be + # incorporated. + def sum + x = base + if current_cells = cells + current_cells.each do |cell| + x += cell.value if cell + end + end + x + end + + def reset + internal_reset(0) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/atomic_reference.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/atomic_reference.rb new file mode 100644 index 000000000000..04800f1575c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/atomic_reference.rb @@ -0,0 +1,44 @@ +module ThreadSafe + module Util + AtomicReference = + if defined?(Rubinius::AtomicReference) + # An overhead-less atomic reference. + Rubinius::AtomicReference + else + begin + require 'atomic' + defined?(Atomic::InternalReference) ? Atomic::InternalReference : Atomic + rescue LoadError, NameError + class FullLockingAtomicReference + def initialize(value = nil) + @___mutex = Mutex.new + @___value = value + end + + def get + @___mutex.synchronize { @___value } + end + alias_method :value, :get + + def set(new_value) + @___mutex.synchronize { @___value = new_value } + end + alias_method :value=, :set + + def compare_and_set(old_value, new_value) + return false unless @___mutex.try_lock + begin + return false unless @___value.equal? old_value + @___value = new_value + ensure + @___mutex.unlock + end + true + end + end + + FullLockingAtomicReference + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/cheap_lockable.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/cheap_lockable.rb new file mode 100644 index 000000000000..143276a2027a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/cheap_lockable.rb @@ -0,0 +1,106 @@ +module ThreadSafe + module Util + # Provides a cheapest possible (mainly in terms of memory usage) +Mutex+ + # with the +ConditionVariable+ bundled in. + # + # Usage: + # class A + # include CheapLockable + # + # def do_exlusively + # cheap_synchronize { yield } + # end + # + # def wait_for_something + # cheap_synchronize do + # cheap_wait until resource_available? + # do_something + # cheap_broadcast # wake up others + # end + # end + # end + module CheapLockable + private + engine = defined?(RUBY_ENGINE) && RUBY_ENGINE + if engine == 'rbx' + # Making use of the Rubinius' ability to lock via object headers to avoid the overhead of the extra Mutex objects. + def cheap_synchronize + Rubinius.lock(self) + begin + yield + ensure + Rubinius.unlock(self) + end + end + + def cheap_wait + wchan = Rubinius::Channel.new + + begin + waiters = @waiters ||= [] + waiters.push wchan + Rubinius.unlock(self) + signaled = wchan.receive_timeout nil + ensure + Rubinius.lock(self) + + unless signaled or waiters.delete(wchan) + # we timed out, but got signaled afterwards (e.g. while waiting to + # acquire @lock), so pass that signal on to the next waiter + waiters.shift << true unless waiters.empty? + end + end + + self + end + + def cheap_broadcast + waiters = @waiters ||= [] + waiters.shift << true until waiters.empty? + self + end + elsif engine == 'jruby' + # Use Java's native synchronized (this) { wait(); notifyAll(); } to avoid the overhead of the extra Mutex objects + require 'jruby' + + def cheap_synchronize + JRuby.reference0(self).synchronized { yield } + end + + def cheap_wait + JRuby.reference0(self).wait + end + + def cheap_broadcast + JRuby.reference0(self).notify_all + end + else + require 'thread' + + extend Volatile + attr_volatile :mutex + + # Non-reentrant Mutex#syncrhonize + def cheap_synchronize + true until (my_mutex = mutex) || cas_mutex(nil, my_mutex = Mutex.new) + my_mutex.synchronize { yield } + end + + # Releases this object's +cheap_synchronize+ lock and goes to sleep waiting for other threads to +cheap_broadcast+, reacquires the lock on wakeup. + # Must only be called in +cheap_broadcast+'s block. + def cheap_wait + conditional_variable = @conditional_variable ||= ConditionVariable.new + conditional_variable.wait(mutex) + end + + # Wakes up all threads waiting for this object's +cheap_synchronize+ lock. + # Must only be called in +cheap_broadcast+'s block. + def cheap_broadcast + if conditional_variable = @conditional_variable + conditional_variable.broadcast + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/power_of_two_tuple.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/power_of_two_tuple.rb new file mode 100644 index 000000000000..3e2d07615afa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/power_of_two_tuple.rb @@ -0,0 +1,26 @@ +module ThreadSafe + module Util + class PowerOfTwoTuple < VolatileTuple + def initialize(size) + raise ArgumentError, "size must be a power of 2 (#{size.inspect} provided)" unless size > 0 && size & (size - 1) == 0 + super(size) + end + + def hash_to_index(hash) + (size - 1) & hash + end + + def volatile_get_by_hash(hash) + volatile_get(hash_to_index(hash)) + end + + def volatile_set_by_hash(hash, value) + volatile_set(hash_to_index(hash), value) + end + + def next_in_size_table + self.class.new(size << 1) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/striped64.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/striped64.rb new file mode 100644 index 000000000000..702fa1400047 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/striped64.rb @@ -0,0 +1,222 @@ +module ThreadSafe + module Util + # A Ruby port of the Doug Lea's jsr166e.Striped64 class version 1.6 + # available in public domain. + # + # Original source code available here: + # http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/jsr166e/Striped64.java?revision=1.6 + # + # Class holding common representation and mechanics for classes supporting + # dynamic striping on 64bit values. + # + # This class maintains a lazily-initialized table of atomically updated + # variables, plus an extra +base+ field. The table size is a power of two. + # Indexing uses masked per-thread hash codes. Nearly all methods on this + # class are private, accessed directly by subclasses. + # + # Table entries are of class +Cell+; a variant of AtomicLong padded to + # reduce cache contention on most processors. Padding is overkill for most + # Atomics because they are usually irregularly scattered in memory and thus + # don't interfere much with each other. But Atomic objects residing in + # arrays will tend to be placed adjacent to each other, and so will most + # often share cache lines (with a huge negative performance impact) without + # this precaution. + # + # In part because +Cell+s are relatively large, we avoid creating them until + # they are needed. When there is no contention, all updates are made to the + # +base+ field. Upon first contention (a failed CAS on +base+ update), the + # table is initialized to size 2. The table size is doubled upon further + # contention until reaching the nearest power of two greater than or equal + # to the number of CPUS. Table slots remain empty (+nil+) until they are + # needed. + # + # A single spinlock (+busy+) is used for initializing and resizing the + # table, as well as populating slots with new +Cell+s. There is no need for + # a blocking lock: When the lock is not available, threads try other slots + # (or the base). During these retries, there is increased contention and + # reduced locality, which is still better than alternatives. + # + # Per-thread hash codes are initialized to random values. Contention and/or + # table collisions are indicated by failed CASes when performing an update + # operation (see method +retry_update+). Upon a collision, if the table size + # is less than the capacity, it is doubled in size unless some other thread + # holds the lock. If a hashed slot is empty, and lock is available, a new + # +Cell+ is created. Otherwise, if the slot exists, a CAS is tried. Retries + # proceed by "double hashing", using a secondary hash (XorShift) to try to + # find a free slot. + # + # The table size is capped because, when there are more threads than CPUs, + # supposing that each thread were bound to a CPU, there would exist a + # perfect hash function mapping threads to slots that eliminates collisions. + # When we reach capacity, we search for this mapping by randomly varying the + # hash codes of colliding threads. Because search is random, and collisions + # only become known via CAS failures, convergence can be slow, and because + # threads are typically not bound to CPUS forever, may not occur at all. + # However, despite these limitations, observed contention rates are + # typically low in these cases. + # + # It is possible for a +Cell+ to become unused when threads that once hashed + # to it terminate, as well as in the case where doubling the table causes no + # thread to hash to it under expanded mask. We do not try to detect or + # remove such cells, under the assumption that for long-running instances, + # observed contention levels will recur, so the cells will eventually be + # needed again; and for short-lived ones, it does not matter. + class Striped64 + # Padded variant of AtomicLong supporting only raw accesses plus CAS. + # The +value+ field is placed between pads, hoping that the JVM doesn't + # reorder them. + # + # Optimisation note: It would be possible to use a release-only + # form of CAS here, if it were provided. + class Cell < AtomicReference + # TODO: this only adds padding after the :value slot, need to find a way to add padding before the slot + attr_reader *(Array.new(12).map {|i| :"padding_#{i}"}) + + alias_method :cas, :compare_and_set + + def cas_computed + cas(current_value = value, yield(current_value)) + end + end + + extend Volatile + attr_volatile :cells, # Table of cells. When non-null, size is a power of 2. + :base, # Base value, used mainly when there is no contention, but also as a fallback during table initialization races. Updated via CAS. + :busy # Spinlock (locked via CAS) used when resizing and/or creating Cells. + + alias_method :busy?, :busy + + def initialize + super() + self.busy = false + self.base = 0 + end + + # Handles cases of updates involving initialization, resizing, + # creating new Cells, and/or contention. See above for + # explanation. This method suffers the usual non-modularity + # problems of optimistic retry code, relying on rechecked sets of + # reads. + # + # Arguments: + # [+x+] + # the value + # [+hash_code+] + # hash code used + # [+x+] + # false if CAS failed before call + def retry_update(x, hash_code, was_uncontended) # :yields: current_value + hash = hash_code + collided = false # True if last slot nonempty + while true + if current_cells = cells + if !(cell = current_cells.volatile_get_by_hash(hash)) + if busy? + collided = false + else # Try to attach new Cell + if try_to_install_new_cell(Cell.new(x), hash) # Optimistically create and try to insert new cell + break + else + redo # Slot is now non-empty + end + end + elsif !was_uncontended # CAS already known to fail + was_uncontended = true # Continue after rehash + elsif cell.cas_computed {|current_value| yield current_value} + break + elsif current_cells.size >= CPU_COUNT || cells != current_cells # At max size or stale + collided = false + elsif collided && expand_table_unless_stale(current_cells) + collided = false + redo # Retry with expanded table + else + collided = true + end + hash = XorShiftRandom.xorshift(hash) + + elsif try_initialize_cells(x, hash) || cas_base_computed {|current_base| yield current_base} + break + end + end + self.hash_code = hash + end + + private + # Static per-thread hash code key. Shared across all instances to + # reduce Thread locals pollution and because adjustments due to + # collisions in one table are likely to be appropriate for + # others. + THREAD_LOCAL_KEY = "#{name}.hash_code".to_sym + + # A thread-local hash code accessor. The code is initially + # random, but may be set to a different value upon collisions. + def hash_code + Thread.current[THREAD_LOCAL_KEY] ||= XorShiftRandom.get + end + + def hash_code=(hash) + Thread.current[THREAD_LOCAL_KEY] = hash + end + + # Sets base and all +cells+ to the given value. + def internal_reset(initial_value) + current_cells = cells + self.base = initial_value + if current_cells + current_cells.each do |cell| + cell.value = initial_value if cell + end + end + end + + def cas_base_computed + cas_base(current_base = base, yield(current_base)) + end + + def free? + !busy? + end + + def try_initialize_cells(x, hash) + if free? && !cells + try_in_busy do + unless cells # Recheck under lock + new_cells = PowerOfTwoTuple.new(2) + new_cells.volatile_set_by_hash(hash, Cell.new(x)) + self.cells = new_cells + end + end + end + end + + def expand_table_unless_stale(current_cells) + try_in_busy do + if current_cells == cells # Recheck under lock + new_cells = current_cells.next_in_size_table + current_cells.each_with_index {|x, i| new_cells.volatile_set(i, x)} + self.cells = new_cells + end + end + end + + def try_to_install_new_cell(new_cell, hash) + try_in_busy do + # Recheck under lock + if (current_cells = cells) && !current_cells.volatile_get(i = current_cells.hash_to_index(hash)) + current_cells.volatile_set(i, new_cell) + end + end + end + + def try_in_busy + if cas_busy(false, true) + begin + yield + ensure + self.busy = false + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/volatile.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/volatile.rb new file mode 100644 index 000000000000..e050e219bb34 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/volatile.rb @@ -0,0 +1,64 @@ +module ThreadSafe + module Util + module Volatile + # Provides +volatile+ (in the JVM's sense) attribute accessors implemented + # atop of the +AtomicReference+s. + # + # Usage: + # class Foo + # extend ThreadSafe::Util::Volatile + # attr_volatile :foo, :bar + # + # def initialize(bar) + # super() # must super() into parent initializers before using the volatile attribute accessors + # self.bar = bar + # end + # + # def hello + # my_foo = foo # volatile read + # self.foo = 1 # volatile write + # cas_foo(1, 2) # => true | a strong CAS + # end + # end + def attr_volatile(*attr_names) + return if attr_names.empty? + include(Module.new do + atomic_ref_setup = attr_names.map {|attr_name| "@__#{attr_name} = ThreadSafe::Util::AtomicReference.new"} + initialize_copy_setup = attr_names.zip(atomic_ref_setup).map do |attr_name, ref_setup| + "#{ref_setup}(other.instance_variable_get(:@__#{attr_name}).get)" + end + class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def initialize(*) + super + #{atomic_ref_setup.join('; ')} + end + + def initialize_copy(other) + super + #{initialize_copy_setup.join('; ')} + end + RUBY_EVAL + + attr_names.each do |attr_name| + class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def #{attr_name} + @__#{attr_name}.get + end + + def #{attr_name}=(value) + @__#{attr_name}.set(value) + end + + def compare_and_set_#{attr_name}(old_value, new_value) + @__#{attr_name}.compare_and_set(old_value, new_value) + end + RUBY_EVAL + + alias_method :"cas_#{attr_name}", :"compare_and_set_#{attr_name}" + alias_method :"lazy_set_#{attr_name}", :"#{attr_name}=" + end + end) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/volatile_tuple.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/volatile_tuple.rb new file mode 100644 index 000000000000..500beb75f9de --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/volatile_tuple.rb @@ -0,0 +1,46 @@ +module ThreadSafe + module Util + # A fixed size array with volatile volatile getters/setters. + # Usage: + # arr = VolatileTuple.new(16) + # arr.volatile_set(0, :foo) + # arr.volatile_get(0) # => :foo + # arr.cas(0, :foo, :bar) # => true + # arr.volatile_get(0) # => :bar + class VolatileTuple + include Enumerable + + Tuple = defined?(Rubinius::Tuple) ? Rubinius::Tuple : Array + + def initialize(size) + @tuple = tuple = Tuple.new(size) + i = 0 + while i < size + tuple[i] = AtomicReference.new + i += 1 + end + end + + def volatile_get(i) + @tuple[i].get + end + + def volatile_set(i, value) + @tuple[i].set(value) + end + + def compare_and_set(i, old_value, new_value) + @tuple[i].compare_and_set(old_value, new_value) + end + alias_method :cas, :compare_and_set + + def size + @tuple.size + end + + def each + @tuple.each {|ref| yield ref.get} + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/xor_shift_random.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/xor_shift_random.rb new file mode 100644 index 000000000000..89442ff7ba0a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/util/xor_shift_random.rb @@ -0,0 +1,41 @@ +module ThreadSafe + module Util + # A xorshift random number (positive +Fixnum+s) generator, provides + # reasonably cheap way to generate thread local random numbers without + # contending for the global +Kernel.rand+. + # + # Usage: + # x = XorShiftRandom.get # uses Kernel.rand to generate an initial seed + # while true + # if (x = XorShiftRandom.xorshift).odd? # thread-localy generate a next random number + # do_something_at_random + # end + # end + module XorShiftRandom + extend self + MAX_XOR_SHIFTABLE_INT = MAX_INT - 1 + + # Generates an initial non-zero positive +Fixnum+ via +Kernel.rand+. + def get + Kernel.rand(MAX_XOR_SHIFTABLE_INT) + 1 # 0 can't be xorshifted + end + + # xorshift based on: http://www.jstatsoft.org/v08/i14/paper + if 0.size == 4 + # using the "yˆ=y>>a; yˆ=y<<b; yˆ=y>>c;" transform with the (a,b,c) tuple with values (3,1,14) to minimise Bignum overflows + def xorshift(x) + x ^= x >> 3 + x ^= (x << 1) & MAX_INT # cut-off Bignum overflow + x ^= x >> 14 + end + else + # using the "yˆ=y>>a; yˆ=y<<b; yˆ=y>>c;" transform with the (a,b,c) tuple with values (1,1,54) to minimise Bignum overflows + def xorshift(x) + x ^= x >> 1 + x ^= (x << 1) & MAX_INT # cut-off Bignum overflow + x ^= x >> 54 + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/version.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/version.rb new file mode 100644 index 000000000000..88821f6dc775 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/lib/thread_safe/version.rb @@ -0,0 +1,21 @@ +module ThreadSafe + VERSION = "0.3.6" +end + +# NOTE: <= 0.2.0 used Threadsafe::VERSION +# @private +module Threadsafe + + # @private + def self.const_missing(name) + name = name.to_sym + if ThreadSafe.const_defined?(name) + warn "[DEPRECATION] `Threadsafe::#{name}' is deprecated, use `ThreadSafe::#{name}' instead." + ThreadSafe.const_get(name) + else + warn "[DEPRECATION] the `Threadsafe' module is deprecated, please use `ThreadSafe` instead." + super + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/.gitignore b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/.gitignore new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/spec_helper.rb new file mode 100644 index 000000000000..e22fe2001065 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/spec_helper.rb @@ -0,0 +1,31 @@ +require 'simplecov' +require 'coveralls' +require 'logger' + +SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ + SimpleCov::Formatter::HTMLFormatter, + Coveralls::SimpleCov::Formatter +] + +SimpleCov.start do + project_name 'thread_safe' + add_filter '/coverage/' + add_filter '/pkg/' + add_filter '/spec/' + add_filter '/tasks/' + add_filter '/yard-template/' +end + +$VERBOSE = nil # suppress our deprecation warnings +require 'thread_safe' + +logger = Logger.new($stderr) +logger.level = Logger::WARN + +# import all the support files +Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require File.expand_path(f) } + +RSpec.configure do |config| + #config.raise_errors_for_deprecations! + config.order = 'random' +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/src/thread_safe/SecurityManager.java b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/src/thread_safe/SecurityManager.java new file mode 100644 index 000000000000..beb6c0220467 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/src/thread_safe/SecurityManager.java @@ -0,0 +1,21 @@ +package thread_safe; + +import java.security.Permission; +import java.util.ArrayList; +import java.util.List; + +public class SecurityManager extends java.lang.SecurityManager { + private final List<Permission> deniedPermissions = + new ArrayList<Permission>(); + + @Override + public void checkPermission(Permission p) { + if (deniedPermissions.contains(p)) { + throw new SecurityException("Denied!"); + } + } + + public void deny(Permission p) { + deniedPermissions.add(p); + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/support/.gitignore b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/support/.gitignore new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/support/threads.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/support/threads.rb new file mode 100644 index 000000000000..1251fa4fb94b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/support/threads.rb @@ -0,0 +1 @@ +THREADS = (RUBY_ENGINE == 'ruby' ? 100 : 10) diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/support/threadsafe_test.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/support/threadsafe_test.rb new file mode 100644 index 000000000000..ac3c66a99d5e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/support/threadsafe_test.rb @@ -0,0 +1,75 @@ +module ThreadSafe + module Test + class Latch + def initialize(count = 1) + @count = count + @mutex = Mutex.new + @cond = ConditionVariable.new + end + + def release + @mutex.synchronize do + @count -= 1 if @count > 0 + @cond.broadcast if @count.zero? + end + end + + def await + @mutex.synchronize do + @cond.wait @mutex if @count > 0 + end + end + end + + class Barrier < Latch + def await + @mutex.synchronize do + if @count.zero? # fall through + elsif @count > 0 + @count -= 1 + @count.zero? ? @cond.broadcast : @cond.wait(@mutex) + end + end + end + end + + class HashCollisionKey + attr_reader :hash, :key + def initialize(key, hash = key.hash % 3) + @key = key + @hash = hash + end + + def eql?(other) + other.kind_of?(self.class) && @key.eql?(other.key) + end + + def even? + @key.even? + end + + def <=>(other) + @key <=> other.key + end + end + + # having 4 separate HCK classes helps for a more thorough CHMV8 testing + class HashCollisionKey2 < HashCollisionKey; end + class HashCollisionKeyNoCompare < HashCollisionKey + def <=>(other) + 0 + end + end + class HashCollisionKey4 < HashCollisionKeyNoCompare; end + + HASH_COLLISION_CLASSES = [HashCollisionKey, HashCollisionKey2, HashCollisionKeyNoCompare, HashCollisionKey4] + + def self.HashCollisionKey(key, hash = key.hash % 3) + HASH_COLLISION_CLASSES[rand(4)].new(key, hash) + end + + class HashCollisionKeyNonComparable < HashCollisionKey + undef <=> + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/.gitignore b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/.gitignore new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/array_spec.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/array_spec.rb new file mode 100644 index 000000000000..f3752ea4b0ca --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/array_spec.rb @@ -0,0 +1,18 @@ +module ThreadSafe + describe Array do + let!(:ary) { described_class.new } + + it 'concurrency' do + (1..THREADS).map do |i| + Thread.new do + 1000.times do + ary << i + ary.each { |x| x * 2 } + ary.shift + ary.last + end + end + end.map(&:join) + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/cache_loops_spec.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/cache_loops_spec.rb new file mode 100644 index 000000000000..f29dc54fb52c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/cache_loops_spec.rb @@ -0,0 +1,507 @@ +Thread.abort_on_exception = true + +module ThreadSafe + describe 'CacheTorture' do + THREAD_COUNT = 40 + KEY_COUNT = (((2**13) - 2) * 0.75).to_i # get close to the doubling cliff + LOW_KEY_COUNT = (((2**8 ) - 2) * 0.75).to_i # get close to the doubling cliff + + INITIAL_VALUE_CACHE_SETUP = lambda do |options, keys| + cache = ThreadSafe::Cache.new + initial_value = options[:initial_value] || 0 + keys.each { |key| cache[key] = initial_value } + cache + end + ZERO_VALUE_CACHE_SETUP = lambda do |options, keys| + INITIAL_VALUE_CACHE_SETUP.call(options.merge(:initial_value => 0), keys) + end + + DEFAULTS = { + key_count: KEY_COUNT, + thread_count: THREAD_COUNT, + loop_count: 1, + prelude: '', + cache_setup: lambda { |options, keys| ThreadSafe::Cache.new } + } + + LOW_KEY_COUNT_OPTIONS = {loop_count: 150, key_count: LOW_KEY_COUNT} + SINGLE_KEY_COUNT_OPTIONS = {loop_count: 100_000, key_count: 1} + + it 'concurrency' do + code = <<-RUBY_EVAL + cache[key] + cache[key] = key + cache[key] + cache.delete(key) + RUBY_EVAL + do_thread_loop(:concurrency, code) + end + + it '#put_if_absent' do + do_thread_loop( + :put_if_absent, + 'acc += 1 unless cache.put_if_absent(key, key)', + key_count: 100_000 + ) do |result, cache, options, keys| + expect_standard_accumulator_test_result(result, cache, options, keys) + end + end + + it '#compute_put_if_absent' do + code = <<-RUBY_EVAL + if key.even? + cache.compute_if_absent(key) { acc += 1; key } + else + acc += 1 unless cache.put_if_absent(key, key) + end + RUBY_EVAL + do_thread_loop(:compute_if_absent, code) do |result, cache, options, keys| + expect_standard_accumulator_test_result(result, cache, options, keys) + end + end + + it '#compute_if_absent_and_present' do + compute_if_absent_and_present + compute_if_absent_and_present(LOW_KEY_COUNT_OPTIONS) + compute_if_absent_and_present(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'add_remove_to_zero' do + add_remove_to_zero + add_remove_to_zero(LOW_KEY_COUNT_OPTIONS) + add_remove_to_zero(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'add_remove_to_zero_via_merge_pair' do + add_remove_to_zero_via_merge_pair + add_remove_to_zero_via_merge_pair(LOW_KEY_COUNT_OPTIONS) + add_remove_to_zero_via_merge_pair(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'add_remove' do + add_remove + add_remove(LOW_KEY_COUNT_OPTIONS) + add_remove(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'add_remove_via_compute' do + add_remove_via_compute + add_remove_via_compute(LOW_KEY_COUNT_OPTIONS) + add_remove_via_compute(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'emove_via_compute_if_absent_present' do + add_remove_via_compute_if_absent_present + add_remove_via_compute_if_absent_present(LOW_KEY_COUNT_OPTIONS) + add_remove_via_compute_if_absent_present(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'add_remove_indiscriminate' do + add_remove_indiscriminate + add_remove_indiscriminate(LOW_KEY_COUNT_OPTIONS) + add_remove_indiscriminate(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'count_up' do + count_up + count_up(LOW_KEY_COUNT_OPTIONS) + count_up(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'count_up_via_compute' do + count_up_via_compute + count_up_via_compute(LOW_KEY_COUNT_OPTIONS) + count_up_via_compute(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'count_up_via_merge_pair' do + count_up_via_merge_pair + count_up_via_merge_pair(LOW_KEY_COUNT_OPTIONS) + count_up_via_merge_pair(SINGLE_KEY_COUNT_OPTIONS) + end + + it 'count_race' do + prelude = 'change = (rand(2) == 1) ? 1 : -1' + code = <<-RUBY_EVAL + v = cache[key] + acc += change if cache.replace_pair(key, v, v + change) + RUBY_EVAL + do_thread_loop( + :count_race, + code, + loop_count: 5, + prelude: prelude, + cache_setup: ZERO_VALUE_CACHE_SETUP + ) do |result, cache, options, keys| + result_sum = sum(result) + expect(sum(keys.map { |key| cache[key] })).to eq result_sum + expect(sum(cache.values)).to eq result_sum + expect(options[:key_count]).to eq cache.size + end + end + + it 'get_and_set_new' do + code = 'acc += 1 unless cache.get_and_set(key, key)' + do_thread_loop(:get_and_set_new, code) do |result, cache, options, keys| + expect_standard_accumulator_test_result(result, cache, options, keys) + end + end + + it 'get_and_set_existing' do + code = 'acc += 1 if cache.get_and_set(key, key) == -1' + do_thread_loop( + :get_and_set_existing, + code, + cache_setup: INITIAL_VALUE_CACHE_SETUP, + initial_value: -1 + ) do |result, cache, options, keys| + expect_standard_accumulator_test_result(result, cache, options, keys) + end + end + + private + + def compute_if_absent_and_present(opts = {}) + prelude = 'on_present = rand(2) == 1' + code = <<-RUBY_EVAL + if on_present + cache.compute_if_present(key) { |old_value| acc += 1; old_value + 1 } + else + cache.compute_if_absent(key) { acc += 1; 1 } + end + RUBY_EVAL + do_thread_loop( + __method__, + code, + {loop_count: 5, prelude: prelude}.merge(opts) + ) do |result, cache, options, keys| + stored_sum = 0 + stored_key_count = 0 + keys.each do |k| + if value = cache[k] + stored_sum += value + stored_key_count += 1 + end + end + expect(stored_sum).to eq sum(result) + expect(stored_key_count).to eq cache.size + end + end + + def add_remove(opts = {}) + prelude = 'do_add = rand(2) == 1' + code = <<-RUBY_EVAL + if do_add + acc += 1 unless cache.put_if_absent(key, key) + else + acc -= 1 if cache.delete_pair(key, key) + end + RUBY_EVAL + do_thread_loop( + __method__, + code, + {loop_count: 5, prelude: prelude}.merge(opts) + ) do |result, cache, options, keys| + expect_all_key_mappings_exist(cache, keys, false) + expect(cache.size).to eq sum(result) + end + end + + def add_remove_via_compute(opts = {}) + prelude = 'do_add = rand(2) == 1' + code = <<-RUBY_EVAL + cache.compute(key) do |old_value| + if do_add + acc += 1 unless old_value + key + else + acc -= 1 if old_value + nil + end + end + RUBY_EVAL + do_thread_loop( + __method__, + code, + {loop_count: 5, prelude: prelude}.merge(opts) + ) do |result, cache, options, keys| + expect_all_key_mappings_exist(cache, keys, false) + expect(cache.size).to eq sum(result) + end + end + + def add_remove_via_compute_if_absent_present(opts = {}) + prelude = 'do_add = rand(2) == 1' + code = <<-RUBY_EVAL + if do_add + cache.compute_if_absent(key) { acc += 1; key } + else + cache.compute_if_present(key) { acc -= 1; nil } + end + RUBY_EVAL + do_thread_loop( + __method__, + code, + {loop_count: 5, prelude: prelude}.merge(opts) + ) do |result, cache, options, keys| + expect_all_key_mappings_exist(cache, keys, false) + expect(cache.size).to eq sum(result) + end + end + + def add_remove_indiscriminate(opts = {}) + prelude = 'do_add = rand(2) == 1' + code = <<-RUBY_EVAL + if do_add + acc += 1 unless cache.put_if_absent(key, key) + else + acc -= 1 if cache.delete(key) + end + RUBY_EVAL + do_thread_loop( + __method__, + code, + {loop_count: 5, prelude: prelude}.merge(opts) + ) do |result, cache, options, keys| + expect_all_key_mappings_exist(cache, keys, false) + expect(cache.size).to eq sum(result) + end + end + + def count_up(opts = {}) + code = <<-RUBY_EVAL + v = cache[key] + acc += 1 if cache.replace_pair(key, v, v + 1) + RUBY_EVAL + do_thread_loop( + __method__, + code, + {loop_count: 5, cache_setup: ZERO_VALUE_CACHE_SETUP}.merge(opts) + ) do |result, cache, options, keys| + expect_count_up(result, cache, options, keys) + end + end + + def count_up_via_compute(opts = {}) + code = <<-RUBY_EVAL + cache.compute(key) do |old_value| + acc += 1 + old_value ? old_value + 1 : 1 + end + RUBY_EVAL + do_thread_loop( + __method__, + code, {loop_count: 5}.merge(opts) + ) do |result, cache, options, keys| + expect_count_up(result, cache, options, keys) + result.inject(nil) do |previous_value, next_value| # since compute guarantees atomicity all count ups should be equal + expect(previous_value).to eq next_value if previous_value + next_value + end + end + end + + def count_up_via_merge_pair(opts = {}) + code = <<-RUBY_EVAL + cache.merge_pair(key, 1) { |old_value| old_value + 1 } + RUBY_EVAL + do_thread_loop( + __method__, + code, + {loop_count: 5}.merge(opts) + ) do |result, cache, options, keys| + all_match = true + expected_value = options[:loop_count] * options[:thread_count] + keys.each do |key| + value = cache[key] + if expected_value != value + all_match = false + break + end + end + expect(all_match).to be_truthy + end + end + + def add_remove_to_zero(opts = {}) + code = <<-RUBY_EVAL + acc += 1 unless cache.put_if_absent(key, key) + acc -= 1 if cache.delete_pair(key, key) + RUBY_EVAL + do_thread_loop( + __method__, + code, + {loop_count: 5}.merge(opts) + ) do |result, cache, options, keys| + expect_all_key_mappings_exist(cache, keys, false) + expect(cache.size).to eq sum(result) + end + end + + def add_remove_to_zero_via_merge_pair(opts = {}) + code = <<-RUBY_EVAL + acc += (cache.merge_pair(key, key) {}) ? 1 : -1 + RUBY_EVAL + do_thread_loop( + __method__, + code, + {loop_count: 5}.merge(opts) + ) do |result, cache, options, keys| + expect_all_key_mappings_exist(cache, keys, false) + expect(cache.size).to eq sum(result) + end + end + + def do_thread_loop(name, code, options = {}, &block) + options = DEFAULTS.merge(options) + meth = define_loop(name, code, options[:prelude]) + keys = to_keys_array(options[:key_count]) + run_thread_loop(meth, keys, options, &block) + + if options[:key_count] > 1 + options[:key_count] = (options[:key_count] / 40).to_i + keys = to_hash_collision_keys_array(options[:key_count]) + run_thread_loop( + meth, + keys, + options.merge(loop_count: options[:loop_count] * 5), + &block + ) + end + end + + def run_thread_loop(meth, keys, options, &block) + cache = options[:cache_setup].call(options, keys) + barrier = ThreadSafe::Test::Barrier.new(options[:thread_count]) + result = (1..options[:thread_count]).map do + Thread.new do + setup_sync_and_start_loop( + meth, + cache, + keys, + barrier, + options[:loop_count] + ) + end + end.map(&:value) + block.call(result, cache, options, keys) if block_given? + end + + def setup_sync_and_start_loop(meth, cache, keys, barrier, loop_count) + my_keys = keys.shuffle + barrier.await + if my_keys.size == 1 + key = my_keys.first + send("#{meth}_single_key", cache, key, loop_count) + else + send("#{meth}_multiple_keys", cache, my_keys, loop_count) + end + end + + def define_loop(name, body, prelude) + inner_meth_name = :"_#{name}_loop_inner" + outer_meth_name = :"_#{name}_loop_outer" + # looping is splitted into the "loop methods" to trigger the JIT + self.class.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def #{inner_meth_name}_multiple_keys(cache, keys, i, length, acc) + #{prelude} + target = i + length + while i < target + key = keys[i] + #{body} + i += 1 + end + acc + end unless method_defined?(:#{inner_meth_name}_multiple_keys) + RUBY_EVAL + + self.class.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def #{inner_meth_name}_single_key(cache, key, i, length, acc) + #{prelude} + target = i + length + while i < target + #{body} + i += 1 + end + acc + end unless method_defined?(:#{inner_meth_name}_single_key) + RUBY_EVAL + + self.class.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def #{outer_meth_name}_multiple_keys(cache, keys, loop_count) + total_length = keys.size + acc = 0 + inc = 100 + loop_count.times do + i = 0 + pre_loop_inc = total_length % inc + acc = #{inner_meth_name}_multiple_keys(cache, keys, i, pre_loop_inc, acc) + i += pre_loop_inc + while i < total_length + acc = #{inner_meth_name}_multiple_keys(cache, keys, i, inc, acc) + i += inc + end + end + acc + end unless method_defined?(:#{outer_meth_name}_multiple_keys) + RUBY_EVAL + + self.class.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 + def #{outer_meth_name}_single_key(cache, key, loop_count) + acc = 0 + i = 0 + inc = 100 + + pre_loop_inc = loop_count % inc + acc = #{inner_meth_name}_single_key(cache, key, i, pre_loop_inc, acc) + i += pre_loop_inc + + while i < loop_count + acc = #{inner_meth_name}_single_key(cache, key, i, inc, acc) + i += inc + end + acc + end unless method_defined?(:#{outer_meth_name}_single_key) + RUBY_EVAL + outer_meth_name + end + + def to_keys_array(key_count) + arr = [] + key_count.times {|i| arr << i} + arr + end + + def to_hash_collision_keys_array(key_count) + to_keys_array(key_count).map { |key| ThreadSafe::Test::HashCollisionKey(key) } + end + + def sum(result) + result.inject(0) { |acc, i| acc + i } + end + + def expect_standard_accumulator_test_result(result, cache, options, keys) + expect_all_key_mappings_exist(cache, keys) + expect(options[:key_count]).to eq sum(result) + expect(options[:key_count]).to eq cache.size + end + + def expect_all_key_mappings_exist(cache, keys, all_must_exist = true) + keys.each do |key| + value = cache[key] + if value || all_must_exist + expect(key).to eq value unless key == value # don't do a bazzilion assertions unless necessary + end + end + end + + def expect_count_up(result, cache, options, keys) + keys.each do |key| + value = cache[key] + expect(value).to be_truthy unless value + end + expect(sum(cache.values)).to eq sum(result) + expect(options[:key_count]).to eq cache.size + end + end unless RUBY_ENGINE == 'rbx' || ENV['TRAVIS'] +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/cache_spec.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/cache_spec.rb new file mode 100644 index 000000000000..ff0285718f08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/cache_spec.rb @@ -0,0 +1,943 @@ +Thread.abort_on_exception = true + +module ThreadSafe + describe Cache do + before(:each) do + @cache = described_class.new + end + + it 'concurrency' do + (1..THREADS).map do |i| + Thread.new do + 1000.times do |j| + key = i * 1000 + j + @cache[key] = i + @cache[key] + @cache.delete(key) + end + end + end.map(&:join) + end + + it 'retrieval' do + expect_size_change(1) do + expect(nil).to eq @cache[:a] + expect(nil).to eq @cache.get(:a) + @cache[:a] = 1 + expect(1).to eq @cache[:a] + expect(1).to eq @cache.get(:a) + end + end + + it '#put_if_absent' do + with_or_without_default_proc do + expect_size_change(1) do + expect(nil).to eq @cache.put_if_absent(:a, 1) + expect(1).to eq @cache.put_if_absent(:a, 1) + expect(1).to eq @cache.put_if_absent(:a, 2) + expect(1).to eq @cache[:a] + end + end + end + + describe '#compute_if_absent' do + it 'common' do + with_or_without_default_proc do + expect_size_change(3) do + expect(1).to eq @cache.compute_if_absent(:a) { 1 } + expect(1).to eq @cache.compute_if_absent(:a) { 2 } + expect(1).to eq @cache[:a] + + @cache[:b] = nil + expect(nil).to eq @cache.compute_if_absent(:b) { 1 } + expect(nil).to eq @cache.compute_if_absent(:c) {} + expect(nil).to eq @cache[:c] + expect(true).to eq @cache.key?(:c) + end + end + end + + it 'with return' do + with_or_without_default_proc do + expect_handles_return_lambda(:compute_if_absent, :a) + end + end + + it 'exception' do + with_or_without_default_proc do + expect_handles_exception(:compute_if_absent, :a) + end + end + + it 'atomicity' do + late_compute_threads_count = 10 + late_put_if_absent_threads_count = 10 + getter_threads_count = 5 + compute_started = ThreadSafe::Test::Latch.new(1) + compute_proceed = ThreadSafe::Test::Latch.new( + late_compute_threads_count + + late_put_if_absent_threads_count + + getter_threads_count + ) + block_until_compute_started = lambda do |name| + # what does it mean? + if (v = @cache[:a]) != nil + expect(nil).to v + end + compute_proceed.release + compute_started.await + end + + expect_size_change 1 do + late_compute_threads = Array.new(late_compute_threads_count) do + Thread.new do + block_until_compute_started.call('compute_if_absent') + expect(1).to eq @cache.compute_if_absent(:a) { fail } + end + end + + late_put_if_absent_threads = Array.new(late_put_if_absent_threads_count) do + Thread.new do + block_until_compute_started.call('put_if_absent') + expect(1).to eq @cache.put_if_absent(:a, 2) + end + end + + getter_threads = Array.new(getter_threads_count) do + Thread.new do + block_until_compute_started.call('getter') + Thread.pass while @cache[:a].nil? + expect(1).to eq @cache[:a] + end + end + + Thread.new do + @cache.compute_if_absent(:a) do + compute_started.release + compute_proceed.await + sleep(0.2) + 1 + end + end.join + (late_compute_threads + + late_put_if_absent_threads + + getter_threads).each(&:join) + end + end + end + + describe '#compute_if_present' do + it 'common' do + with_or_without_default_proc do + expect_no_size_change do + expect(nil).to eq @cache.compute_if_present(:a) {} + expect(nil).to eq @cache.compute_if_present(:a) { 1 } + expect(nil).to eq @cache.compute_if_present(:a) { fail } + expect(false).to eq @cache.key?(:a) + end + + @cache[:a] = 1 + expect_no_size_change do + expect(1).to eq @cache.compute_if_present(:a) { 1 } + expect(1).to eq @cache[:a] + expect(2).to eq @cache.compute_if_present(:a) { 2 } + expect(2).to eq @cache[:a] + expect(false).to eq @cache.compute_if_present(:a) { false } + expect(false).to eq @cache[:a] + + @cache[:a] = 1 + yielded = false + @cache.compute_if_present(:a) do |old_value| + yielded = true + expect(1).to eq old_value + 2 + end + expect(true).to eq yielded + end + + expect_size_change(-1) do + expect(nil).to eq @cache.compute_if_present(:a) {} + expect(false).to eq @cache.key?(:a) + expect(nil).to eq @cache.compute_if_present(:a) { 1 } + expect(false).to eq @cache.key?(:a) + end + end + end + + it 'with return' do + with_or_without_default_proc do + @cache[:a] = 1 + expect_handles_return_lambda(:compute_if_present, :a) + end + end + + it 'exception' do + with_or_without_default_proc do + @cache[:a] = 1 + expect_handles_exception(:compute_if_present, :a) + end + end + end + + describe '#compute' do + it 'common' do + with_or_without_default_proc do + expect_no_size_change do + expect_compute(:a, nil, nil) {} + end + + expect_size_change(1) do + expect_compute(:a, nil, 1) { 1 } + expect_compute(:a, 1, 2) { 2 } + expect_compute(:a, 2, false) { false } + expect(false).to eq @cache[:a] + end + + expect_size_change(-1) do + expect_compute(:a, false, nil) {} + end + end + end + + it 'with return' do + with_or_without_default_proc do + expect_handles_return_lambda(:compute, :a) + @cache[:a] = 1 + expect_handles_return_lambda(:compute, :a) + end + end + + it 'exception' do + with_or_without_default_proc do + expect_handles_exception(:compute, :a) + @cache[:a] = 2 + expect_handles_exception(:compute, :a) + end + end + end + + describe '#merge_pair' do + it 'common' do + with_or_without_default_proc do + expect_size_change(1) do + expect(nil).to eq @cache.merge_pair(:a, nil) { fail } + expect(true).to eq @cache.key?(:a) + expect(nil).to eq @cache[:a] + end + + expect_no_size_change do + expect_merge_pair(:a, nil, nil, false) { false } + expect_merge_pair(:a, nil, false, 1) { 1 } + expect_merge_pair(:a, nil, 1, 2) { 2 } + end + + expect_size_change(-1) do + expect_merge_pair(:a, nil, 2, nil) {} + expect(false).to eq @cache.key?(:a) + end + end + end + + it 'with return' do + with_or_without_default_proc do + @cache[:a] = 1 + expect_handles_return_lambda(:merge_pair, :a, 2) + end + end + + it 'exception' do + with_or_without_default_proc do + @cache[:a] = 1 + expect_handles_exception(:merge_pair, :a, 2) + end + end + end + + it 'updates dont block reads' do + getters_count = 20 + key_klass = ThreadSafe::Test::HashCollisionKey + keys = [key_klass.new(1, 100), + key_klass.new(2, 100), + key_klass.new(3, 100)] # hash colliding keys + inserted_keys = [] + + keys.each do |key, i| + compute_started = ThreadSafe::Test::Latch.new(1) + compute_finished = ThreadSafe::Test::Latch.new(1) + getters_started = ThreadSafe::Test::Latch.new(getters_count) + getters_finished = ThreadSafe::Test::Latch.new(getters_count) + + computer_thread = Thread.new do + getters_started.await + @cache.compute_if_absent(key) do + compute_started.release + getters_finished.await + 1 + end + compute_finished.release + end + + getter_threads = (1..getters_count).map do + Thread.new do + getters_started.release + inserted_keys.each do |inserted_key| + expect(true).to eq @cache.key?(inserted_key) + expect(1).to eq @cache[inserted_key] + end + expect(false).to eq @cache.key?(key) + compute_started.await + inserted_keys.each do |inserted_key| + expect(true).to eq @cache.key?(inserted_key) + expect(1).to eq @cache[inserted_key] + end + expect(false).to eq @cache.key?(key) + expect(nil).to eq @cache[key] + getters_finished.release + compute_finished.await + expect(true).to eq @cache.key?(key) + expect(1).to eq @cache[key] + end + end + + (getter_threads << computer_thread).map do |t| + expect(t.join(2)).to be_truthy + end # asserting no deadlocks + inserted_keys << key + end + end + + specify 'collision resistance' do + expect_collision_resistance( + (0..1000).map { |i| ThreadSafe::Test::HashCollisionKey(i, 1) } + ) + end + + specify 'collision resistance with arrays' do + special_array_class = Class.new(Array) do + def key # assert_collision_resistance expects to be able to call .key to get the "real" key + first.key + end + end + # Test collision resistance with a keys that say they responds_to <=>, but then raise exceptions + # when actually called (ie: an Array filled with non-comparable keys). + # See https://github.com/headius/thread_safe/issues/19 for more info. + expect_collision_resistance( + (0..100).map do |i| + special_array_class.new( + [ThreadSafe::Test::HashCollisionKeyNonComparable.new(i, 1)] + ) + end + ) + end + + it '#replace_pair' do + with_or_without_default_proc do + expect_no_size_change do + expect(false).to eq @cache.replace_pair(:a, 1, 2) + expect(false).to eq @cache.replace_pair(:a, nil, nil) + expect(false).to eq @cache.key?(:a) + end + end + + @cache[:a] = 1 + expect_no_size_change do + expect(true).to eq @cache.replace_pair(:a, 1, 2) + expect(false).to eq @cache.replace_pair(:a, 1, 2) + expect(2).to eq @cache[:a] + expect(true).to eq @cache.replace_pair(:a, 2, 2) + expect(2).to eq @cache[:a] + expect(true).to eq @cache.replace_pair(:a, 2, nil) + expect(false).to eq @cache.replace_pair(:a, 2, nil) + expect(nil).to eq @cache[:a] + expect(true).to eq @cache.key?(:a) + expect(true).to eq @cache.replace_pair(:a, nil, nil) + expect(true).to eq @cache.key?(:a) + expect(true).to eq @cache.replace_pair(:a, nil, 1) + expect(1).to eq @cache[:a] + end + end + + it '#replace_if_exists' do + with_or_without_default_proc do + expect_no_size_change do + expect(nil).to eq @cache.replace_if_exists(:a, 1) + expect(false).to eq @cache.key?(:a) + end + + @cache[:a] = 1 + expect_no_size_change do + expect(1).to eq @cache.replace_if_exists(:a, 2) + expect(2).to eq @cache[:a] + expect(2).to eq @cache.replace_if_exists(:a, nil) + expect(nil).to eq @cache[:a] + expect(true).to eq @cache.key?(:a) + expect(nil).to eq @cache.replace_if_exists(:a, 1) + expect(1).to eq @cache[:a] + end + end + end + + it '#get_and_set' do + with_or_without_default_proc do + expect(nil).to eq @cache.get_and_set(:a, 1) + expect(true).to eq @cache.key?(:a) + expect(1).to eq @cache[:a] + expect(1).to eq @cache.get_and_set(:a, 2) + expect(2).to eq @cache.get_and_set(:a, nil) + expect(nil).to eq @cache[:a] + expect(true).to eq @cache.key?(:a) + expect(nil).to eq @cache.get_and_set(:a, 1) + expect(1).to eq @cache[:a] + end + end + + it '#key' do + with_or_without_default_proc do + expect(nil).to eq @cache.key(1) + @cache[:a] = 1 + expect(:a).to eq @cache.key(1) + expect(nil).to eq @cache.key(0) + end + end + + it '#key?' do + with_or_without_default_proc do + expect(false).to eq @cache.key?(:a) + @cache[:a] = 1 + expect(true).to eq @cache.key?(:a) + end + end + + it '#value?' do + with_or_without_default_proc do + expect(false).to eq @cache.value?(1) + @cache[:a] = 1 + expect(true).to eq @cache.value?(1) + end + end + + it '#delete' do + with_or_without_default_proc do |default_proc_set| + expect_no_size_change do + expect(nil).to eq @cache.delete(:a) + end + @cache[:a] = 1 + expect_size_change -1 do + expect(1).to eq @cache.delete(:a) + end + expect_no_size_change do + expect(nil).to eq @cache[:a] unless default_proc_set + + expect(false).to eq @cache.key?(:a) + expect(nil).to eq @cache.delete(:a) + end + end + end + + it '#delete_pair' do + with_or_without_default_proc do + expect_no_size_change do + expect(false).to eq @cache.delete_pair(:a, 2) + expect(false).to eq @cache.delete_pair(:a, nil) + end + @cache[:a] = 1 + expect_no_size_change do + expect(false).to eq @cache.delete_pair(:a, 2) + end + expect_size_change(-1) do + expect(1).to eq @cache[:a] + expect(true).to eq @cache.delete_pair(:a, 1) + expect(false).to eq @cache.delete_pair(:a, 1) + expect(false).to eq @cache.key?(:a) + end + end + end + + specify 'default proc' do + @cache = cache_with_default_proc(1) + expect_no_size_change do + expect(false).to eq @cache.key?(:a) + end + expect_size_change(1) do + expect(1).to eq @cache[:a] + expect(true).to eq @cache.key?(:a) + end + end + + specify 'falsy default proc' do + @cache = cache_with_default_proc(nil) + expect_no_size_change do + expect(false).to eq @cache.key?(:a) + end + expect_size_change(1) do + expect(nil).to eq @cache[:a] + expect(true).to eq @cache.key?(:a) + end + end + + describe '#fetch' do + it 'common' do + with_or_without_default_proc do |default_proc_set| + expect_no_size_change do + expect(1).to eq @cache.fetch(:a, 1) + expect(1).to eq @cache.fetch(:a) { 1 } + expect(false).to eq @cache.key?(:a) + + expect(nil).to eq @cache[:a] unless default_proc_set + end + + @cache[:a] = 1 + expect_no_size_change do + expect(1).to eq @cache.fetch(:a) { fail } + end + + expect { @cache.fetch(:b) }.to raise_error(KeyError) + + expect_no_size_change do + expect(1).to eq @cache.fetch(:b, :c) {1} # assert block supersedes default value argument + expect(false).to eq @cache.key?(:b) + end + end + end + + it 'falsy' do + with_or_without_default_proc do + expect(false).to eq @cache.key?(:a) + + expect_no_size_change do + expect(nil).to eq @cache.fetch(:a, nil) + expect(false).to eq @cache.fetch(:a, false) + expect(nil).to eq @cache.fetch(:a) {} + expect(false).to eq @cache.fetch(:a) { false } + end + + @cache[:a] = nil + expect_no_size_change do + expect(true).to eq @cache.key?(:a) + expect(nil).to eq @cache.fetch(:a) { fail } + end + end + end + + it 'with return' do + with_or_without_default_proc do + r = fetch_with_return + # r = lambda do + # @cache.fetch(:a) { return 10 } + # end.call + + expect_no_size_change do + expect(10).to eq r + expect(false).to eq @cache.key?(:a) + end + end + end + end + + describe '#fetch_or_store' do + it 'common' do + with_or_without_default_proc do |default_proc_set| + expect_size_change(1) do + expect(1).to eq @cache.fetch_or_store(:a, 1) + expect(1).to eq @cache[:a] + end + + @cache.delete(:a) + + expect_size_change 1 do + expect(1).to eq @cache.fetch_or_store(:a) { 1 } + expect(1).to eq @cache[:a] + end + + expect_no_size_change do + expect(1).to eq @cache.fetch_or_store(:a) { fail } + end + + expect { @cache.fetch_or_store(:b) }. + to raise_error(KeyError) + + expect_size_change(1) do + expect(1).to eq @cache.fetch_or_store(:b, :c) { 1 } # assert block supersedes default value argument + expect(1).to eq @cache[:b] + end + end + end + + it 'falsy' do + with_or_without_default_proc do + expect(false).to eq @cache.key?(:a) + + expect_size_change(1) do + expect(nil).to eq @cache.fetch_or_store(:a, nil) + expect(nil).to eq @cache[:a] + expect(true).to eq @cache.key?(:a) + end + @cache.delete(:a) + + expect_size_change(1) do + expect(false).to eq @cache.fetch_or_store(:a, false) + expect(false).to eq @cache[:a] + expect(true).to eq @cache.key?(:a) + end + @cache.delete(:a) + + expect_size_change(1) do + expect(nil).to eq @cache.fetch_or_store(:a) {} + expect(nil).to eq @cache[:a] + expect(true).to eq @cache.key?(:a) + end + @cache.delete(:a) + + expect_size_change(1) do + expect(false).to eq @cache.fetch_or_store(:a) { false } + expect(false).to eq @cache[:a] + expect(true).to eq @cache.key?(:a) + end + + @cache[:a] = nil + expect_no_size_change do + expect(nil).to eq @cache.fetch_or_store(:a) { fail } + end + end + end + + it 'with return' do + with_or_without_default_proc do + r = fetch_or_store_with_return + + expect_no_size_change do + expect(10).to eq r + expect(false).to eq @cache.key?(:a) + end + end + end + end + + it '#clear' do + @cache[:a] = 1 + expect_size_change(-1) do + expect(@cache).to eq @cache.clear + expect(false).to eq @cache.key?(:a) + expect(nil).to eq @cache[:a] + end + end + + describe '#each_pair' do + it 'common' do + @cache.each_pair { |k, v| fail } + expect(@cache).to eq @cache.each_pair {} + @cache[:a] = 1 + + h = {} + @cache.each_pair { |k, v| h[k] = v } + expect({:a => 1}).to eq h + + @cache[:b] = 2 + h = {} + @cache.each_pair { |k, v| h[k] = v } + expect({:a => 1, :b => 2}).to eq h + end + + it 'pair iterator' do + @cache[:a] = 1 + @cache[:b] = 2 + i = 0 + r = @cache.each_pair do |k, v| + if i == 0 + i += 1 + next + fail + elsif i == 1 + break :breaked + end + end + + expect(:breaked).to eq r + end + + it 'allows modification' do + @cache[:a] = 1 + @cache[:b] = 1 + @cache[:c] = 1 + + expect_size_change(1) do + @cache.each_pair do |k, v| + @cache[:z] = 1 + end + end + end + end + + it '#keys' do + expect([]).to eq @cache.keys + + @cache[1] = 1 + expect([1]).to eq @cache.keys + + @cache[2] = 2 + expect([1, 2]).to eq @cache.keys.sort + end + + it '#values' do + expect([]).to eq @cache.values + + @cache[1] = 1 + expect([1]).to eq @cache.values + + @cache[2] = 2 + expect([1, 2]).to eq @cache.values.sort + end + + it '#each_key' do + expect(@cache).to eq @cache.each_key { fail } + + @cache[1] = 1 + arr = [] + @cache.each_key { |k| arr << k } + expect([1]).to eq arr + + @cache[2] = 2 + arr = [] + @cache.each_key { |k| arr << k } + expect([1, 2]).to eq arr.sort + end + + it '#each_value' do + expect(@cache).to eq @cache.each_value { fail } + + @cache[1] = 1 + arr = [] + @cache.each_value { |k| arr << k } + expect([1]).to eq arr + + @cache[2] = 2 + arr = [] + @cache.each_value { |k| arr << k } + expect([1, 2]).to eq arr.sort + end + + it '#empty' do + expect(true).to eq @cache.empty? + @cache[:a] = 1 + expect(false).to eq @cache.empty? + end + + it 'options validation' do + expect_valid_options(nil) + expect_valid_options({}) + expect_valid_options(foo: :bar) + end + + it 'initial capacity options validation' do + expect_valid_option(:initial_capacity, nil) + expect_valid_option(:initial_capacity, 1) + expect_invalid_option(:initial_capacity, '') + expect_invalid_option(:initial_capacity, 1.0) + expect_invalid_option(:initial_capacity, -1) + end + + it 'load factor options validation' do + expect_valid_option(:load_factor, nil) + expect_valid_option(:load_factor, 0.01) + expect_valid_option(:load_factor, 0.75) + expect_valid_option(:load_factor, 1) + expect_invalid_option(:load_factor, '') + expect_invalid_option(:load_factor, 0) + expect_invalid_option(:load_factor, 1.1) + expect_invalid_option(:load_factor, 2) + expect_invalid_option(:load_factor, -1) + end + + it '#size' do + expect(0).to eq @cache.size + @cache[:a] = 1 + expect(1).to eq @cache.size + @cache[:b] = 1 + expect(2).to eq @cache.size + @cache.delete(:a) + expect(1).to eq @cache.size + @cache.delete(:b) + expect(0).to eq @cache.size + end + + it '#get_or_default' do + with_or_without_default_proc do + expect(1).to eq @cache.get_or_default(:a, 1) + expect(nil).to eq @cache.get_or_default(:a, nil) + expect(false).to eq @cache.get_or_default(:a, false) + expect(false).to eq @cache.key?(:a) + + @cache[:a] = 1 + expect(1).to eq @cache.get_or_default(:a, 2) + end + end + + it '#dup,#clone' do + [:dup, :clone].each do |meth| + cache = cache_with_default_proc(:default_value) + cache[:a] = 1 + dupped = cache.send(meth) + expect(1).to eq dupped[:a] + expect(1).to eq dupped.size + expect_size_change(1, cache) do + expect_no_size_change(dupped) do + cache[:b] = 1 + end + end + expect(false).to eq dupped.key?(:b) + expect_no_size_change(cache) do + expect_size_change(-1, dupped) do + dupped.delete(:a) + end + end + expect(false).to eq dupped.key?(:a) + expect(true).to eq cache.key?(:a) + # test default proc + expect_size_change(1, cache) do + expect_no_size_change dupped do + expect(:default_value).to eq cache[:c] + expect(false).to eq dupped.key?(:c) + end + end + expect_no_size_change cache do + expect_size_change 1, dupped do + expect(:default_value).to eq dupped[:d] + expect(false).to eq cache.key?(:d) + end + end + end + end + + it 'is unfreezable' do + expect { @cache.freeze }.to raise_error(NoMethodError) + end + + it 'marshal dump load' do + new_cache = Marshal.load(Marshal.dump(@cache)) + expect(new_cache).to be_an_instance_of ThreadSafe::Cache + expect(0).to eq new_cache.size + @cache[:a] = 1 + new_cache = Marshal.load(Marshal.dump(@cache)) + expect(1).to eq @cache[:a] + expect(1).to eq new_cache.size + end + + it 'marshal dump doesnt work with default proc' do + expect { Marshal.dump(ThreadSafe::Cache.new {}) }.to raise_error(TypeError) + end + + private + + def with_or_without_default_proc(&block) + block.call(false) + @cache = ThreadSafe::Cache.new { |h, k| h[k] = :default_value } + block.call(true) + end + + def cache_with_default_proc(default_value = 1) + ThreadSafe::Cache.new { |cache, k| cache[k] = default_value } + end + + def expect_size_change(change, cache = @cache, &block) + start = cache.size + block.call + expect(change).to eq cache.size - start + end + + def expect_valid_option(option_name, value) + expect_valid_options(option_name => value) + end + + def expect_valid_options(options) + c = ThreadSafe::Cache.new(options) + expect(c).to be_an_instance_of ThreadSafe::Cache + end + + def expect_invalid_option(option_name, value) + expect_invalid_options(option_name => value) + end + + def expect_invalid_options(options) + expect { ThreadSafe::Cache.new(options) }.to raise_error(ArgumentError) + end + + def expect_no_size_change(cache = @cache, &block) + expect_size_change(0, cache, &block) + end + + def expect_handles_return_lambda(method, key, *args) + before_had_key = @cache.key?(key) + before_had_value = before_had_key ? @cache[key] : nil + + returning_lambda = lambda do + @cache.send(method, key, *args) { return :direct_return } + end + + expect_no_size_change do + expect(:direct_return).to eq returning_lambda.call + expect(before_had_key).to eq @cache.key?(key) + expect(before_had_value).to eq @cache[key] if before_had_value + end + end + + class TestException < Exception; end + def expect_handles_exception(method, key, *args) + before_had_key = @cache.key?(key) + before_had_value = before_had_key ? @cache[key] : nil + + expect_no_size_change do + expect { @cache.send(method, key, *args) { raise TestException, '' } }. + to raise_error(TestException) + + expect(before_had_key).to eq @cache.key?(key) + expect(before_had_value).to eq @cache[key] if before_had_value + end + end + + def expect_compute(key, expected_old_value, expected_result, &block) + result = @cache.compute(:a) do |old_value| + expect(expected_old_value).to eq old_value + block.call + end + expect(expected_result).to eq result + end + + def expect_merge_pair(key, value, expected_old_value, expected_result, &block) + result = @cache.merge_pair(key, value) do |old_value| + expect(expected_old_value).to eq old_value + block.call + end + expect(expected_result).to eq result + end + + def expect_collision_resistance(keys) + keys.each { |k| @cache[k] = k.key } + 10.times do |i| + size = keys.size + while i < size + k = keys[i] + expect(k.key == @cache.delete(k) && + !@cache.key?(k) && + (@cache[k] = k.key; @cache[k] == k.key)).to be_truthy + i += 10 + end + end + expect(keys.all? { |k| @cache[k] == k.key }).to be_truthy + end + + # Took out for compatibility with Rubinius, see https://github.com/rubinius/rubinius/issues/1312 + def fetch_with_return + lambda do + @cache.fetch(:a) { return 10 } + end.call + end + + # Took out for compatibility with Rubinius, see https://github.com/rubinius/rubinius/issues/1312 + def fetch_or_store_with_return + lambda do + @cache.fetch_or_store(:a) { return 10 } + end.call + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/hash_spec.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/hash_spec.rb new file mode 100644 index 000000000000..1403b6338c10 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/hash_spec.rb @@ -0,0 +1,17 @@ +module ThreadSafe + describe Hash do + let!(:hsh) { described_class.new } + + it 'concurrency' do + (1..THREADS).map do |i| + Thread.new do + 1000.times do |j| + hsh[i * 1000 + j] = i + hsh[i * 1000 + j] + hsh.delete(i * 1000 + j) + end + end + end.map(&:join) + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/no_unsafe_spec.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/no_unsafe_spec.rb new file mode 100644 index 000000000000..3bd03e0bb909 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/no_unsafe_spec.rb @@ -0,0 +1,27 @@ +if defined?(JRUBY_VERSION) && ENV['TEST_NO_UNSAFE'] + # to be used like this: rake test TEST_NO_UNSAFE=true + load 'test/package.jar' + java_import 'thread_safe.SecurityManager' + manager = SecurityManager.new + + # Prevent accessing internal classes + manager.deny(java.lang.RuntimePermission.new('accessClassInPackage.sun.misc')) + java.lang.System.setSecurityManager(manager) + + module ThreadSafe + describe 'no_unsafe' do + it 'security_manager_is_used' do + begin + java_import 'sun.misc.Unsafe' + fail + rescue SecurityError + end + end + + it 'no_unsafe_version_of_chmv8_is_used' do + require 'thread_safe/jruby_cache_backend' # make sure the jar has been loaded + expect(!Java::OrgJrubyExtThread_safe::JRubyCacheBackendLibrary::JRubyCacheBackend::CAN_USE_UNSAFE_CHM).to be_truthy + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/synchronized_delegator_spec.rb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/synchronized_delegator_spec.rb new file mode 100644 index 000000000000..5302e2ba0438 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/spec/thread_safe/synchronized_delegator_spec.rb @@ -0,0 +1,85 @@ +require 'thread_safe/synchronized_delegator.rb' + +module ThreadSafe + describe SynchronizedDelegator do + it 'wraps array' do + array = ::Array.new + sync_array = described_class.new(array) + + array << 1 + expect(1).to eq sync_array[0] + + sync_array << 2 + expect(2).to eq array[1] + end + + it 'synchronizes access' do + t1_continue, t2_continue = false, false + + hash = ::Hash.new do |hash, key| + t2_continue = true + unless hash.find { |e| e[1] == key.to_s } # just to do something + hash[key] = key.to_s + Thread.pass until t1_continue + end + end + sync_hash = described_class.new(hash) + sync_hash[1] = 'egy' + + t1 = Thread.new do + sync_hash[2] = 'dva' + sync_hash[3] # triggers t2_continue + end + + t2 = Thread.new do + Thread.pass until t2_continue + sync_hash[4] = '42' + end + + sleep(0.05) # sleep some to allow threads to boot + + until t2.status == 'sleep' do + Thread.pass + end + + expect(3).to eq hash.keys.size + + t1_continue = true + t1.join; t2.join + + expect(4).to eq sync_hash.size + end + + it 'synchronizes access with block' do + t1_continue, t2_continue = false, false + + array = ::Array.new + sync_array = described_class.new(array) + + t1 = Thread.new do + sync_array << 1 + sync_array.each do + t2_continue = true + Thread.pass until t1_continue + end + end + + t2 = Thread.new do + # sleep(0.01) + Thread.pass until t2_continue + sync_array << 2 + end + + until t2.status == 'sleep' || t2.status == false + Thread.pass + end + + expect(1).to eq array.size + + t1_continue = true + t1.join; t2.join + + expect([1, 2]).to eq array + end + end +end \ No newline at end of file diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/tasks/update_doc.rake b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/tasks/update_doc.rake new file mode 100644 index 000000000000..f2cab2f3884b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/tasks/update_doc.rake @@ -0,0 +1,45 @@ +require 'yard' +YARD::Rake::YardocTask.new + +root = File.expand_path File.join(File.dirname(__FILE__), '..') + +namespace :yard do + + cmd = lambda do |command| + puts ">> executing: #{command}" + system command or raise "#{command} failed" + end + + desc 'Pushes generated documentation to github pages: http://ruby-concurrency.github.io/thread_safe/' + task :push => [:setup, :yard] do + + message = Dir.chdir(root) do + `git log -n 1 --oneline`.strip + end + puts "Generating commit: #{message}" + + Dir.chdir "#{root}/yardoc" do + cmd.call "git add -A" + cmd.call "git commit -m '#{message}'" + cmd.call 'git push origin gh-pages' + end + + end + + desc 'Setups second clone in ./yardoc dir for pushing doc to github' + task :setup do + + unless File.exist? "#{root}/yardoc/.git" + cmd.call "rm -rf #{root}/yardoc" if File.exist?("#{root}/yardoc") + Dir.chdir "#{root}" do + cmd.call 'git clone --single-branch --branch gh-pages git@github.com:ruby-concurrency/thread_safe.git ./yardoc' + end + end + Dir.chdir "#{root}/yardoc" do + cmd.call 'git fetch origin' + cmd.call 'git reset --hard origin/gh-pages' + end + + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/thread_safe.gemspec b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/thread_safe.gemspec new file mode 100644 index 000000000000..cf3faebf2285 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/thread_safe.gemspec @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +$:.push File.expand_path('../lib', __FILE__) unless $:.include?('lib') +require 'thread_safe/version' + +Gem::Specification.new do |gem| + gem.authors = ["Charles Oliver Nutter", "thedarkone"] + gem.email = ["headius@headius.com", "thedarkone2@gmail.com"] + gem.summary = %q{Thread-safe collections and utilities for Ruby} + gem.description = %q{A collection of data structures and utilities to make thread-safe programming in Ruby easier} + gem.homepage = "https://github.com/ruby-concurrency/thread_safe" + + gem.files = `git ls-files`.split($\) + gem.files += ['lib/thread_safe/jruby_cache_backend.jar'] if defined?(JRUBY_VERSION) + gem.files -= ['.gitignore'] # see https://github.com/headius/thread_safe/issues/40#issuecomment-42315441 + gem.platform = 'java' if defined?(JRUBY_VERSION) + gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } + gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) + gem.name = "thread_safe" + gem.require_paths = ["lib"] + gem.version = ThreadSafe::VERSION + gem.license = "Apache-2.0" + + gem.add_development_dependency 'atomic', '= 1.1.16' + gem.add_development_dependency 'rake', '< 12.0' + gem.add_development_dependency 'rspec', '~> 3.2' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/yard-template/default/fulldoc/html/css/common.css b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/yard-template/default/fulldoc/html/css/common.css new file mode 100644 index 000000000000..dfd9d858a631 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/yard-template/default/fulldoc/html/css/common.css @@ -0,0 +1,125 @@ +/* Override this file with custom rules */ + +body { + line-height: 18px; +} + +.docstring code, .docstring .object_link a, #filecontents code { + padding: 0px 3px 1px 3px; + border: 1px solid #eef; + background: #f5f5ff; +} + +#filecontents pre code, .docstring pre code { + border: none; + background: none; + padding: 0; +} + +#filecontents pre.code, .docstring pre.code, .tags pre.example, .docstring code, .docstring .object_link a, +#filecontents code { + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} + +/* syntax highlighting */ +.source_code { + display: none; + padding: 3px 8px; + border-left: 8px solid #ddd; + margin-top: 5px; +} + +#filecontents pre.code, .docstring pre.code, .source_code pre { + font-family: monospace; +} + +#filecontents pre.code, .docstring pre.code { + display: block; +} + +.source_code .lines { + padding-right: 12px; + color: #555; + text-align: right; +} + +#filecontents pre.code, .docstring pre.code, +.tags pre.example { + padding: 5px 12px; + margin-top: 4px; + border: 1px solid #eef; + background: #f5f5ff; +} + +pre.code { + color: #000; +} + +pre.code .info.file { + color: #555; +} + +pre.code .val { + color: #036A07; +} + +pre.code .tstring_content, +pre.code .heredoc_beg, pre.code .heredoc_end, +pre.code .qwords_beg, pre.code .qwords_end, +pre.code .tstring, pre.code .dstring { + color: #036A07; +} + +pre.code .fid, +pre.code .rubyid_new, +pre.code .rubyid_to_s, +pre.code .rubyid_to_sym, +pre.code .rubyid_to_f, +pre.code .rubyid_to_i, +pre.code .rubyid_each { + color: inherit; +} + +pre.code .comment { + color: #777; + font-style: italic; +} + +pre.code .const, pre.code .constant { + color: inherit; + font-weight: bold; + font-style: italic; +} + +pre.code .label, +pre.code .symbol { + color: #C5060B; +} + +pre.code .kw, +pre.code .rubyid_require, +pre.code .rubyid_extend, +pre.code .rubyid_include, +pre.code .int { + color: #0000FF; +} + +pre.code .ivar { + color: #660E7A; +} + +pre.code .gvar, +pre.code .rubyid_backref, +pre.code .rubyid_nth_ref { + color: #6D79DE; +} + +pre.code .regexp, .dregexp { + color: #036A07; +} + +pre.code a { + border-bottom: 1px dotted #bbf; +} + diff --git a/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/yard-template/default/layout/html/footer.erb b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/yard-template/default/layout/html/footer.erb new file mode 100644 index 000000000000..94c0273d9438 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/thread_safe-0.3.6/yard-template/default/layout/html/footer.erb @@ -0,0 +1,16 @@ +<div id="footer"> + Generated on <%= Time.now.strftime("%c") %> by + <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a> + <%= YARD::VERSION %> (ruby-<%= RUBY_VERSION %>). +</div> + +<script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-57940973-1', 'auto'); + ga('send', 'pageview'); + +</script> diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/.gitignore b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/.gitignore new file mode 100644 index 000000000000..a4143785b39b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/.gitignore @@ -0,0 +1,8 @@ +*.gem +Gemfile.lock +doc/ +.yardoc +.rvmrc +coverage +check.sh +tags diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/.rspec b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/.rspec new file mode 100644 index 000000000000..838fd574307e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/.rspec @@ -0,0 +1,4 @@ +--tty +--color +--format documentation +--backtrace diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/.travis.yml new file mode 100644 index 000000000000..dc0c9df0053c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/.travis.yml @@ -0,0 +1,26 @@ +language: ruby +script: "bundle exec rake" +rvm: + - 1.9.3 + - 2.0.0 + - 2.1.10 + - 2.2.10 + - 2.3.8 + - 2.4.7 + - 2.5.6 + - 2.6.4 + - ruby-head + - jruby-head + - jruby-18mode + - jruby-19mode +matrix: + fast_finish: true + allow_failures: + - rvm: ruby-head + - rvm: jruby-head + - rvm: ree + include: + - rvm: 1.8.7 + dist: precise + - rvm: 1.9.2 + dist: trusty diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/CHANGELOG.md new file mode 100644 index 000000000000..223e4bc79396 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/CHANGELOG.md @@ -0,0 +1,406 @@ +# Changelog + +## Master + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.4.0...master) + +## 1.4.0 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.1.2...v1.4.0) + +#### 1 feature +- Faraday adapter exceptions namespace compatibility with Faraday v1 ([@iMacTia](https://github.com/iMacTia) in [#616](https://github.com/typhoeus/typhoeus/pull/616)) + +#### 3 Others +- Yard warning fixes ([@olleolleolle](https://github.com/olleolleolle) in [#622](https://github.com/typhoeus/typhoeus/pull/622)) +- Add more Ruby versions in CI matrix ([@olleolleolle](https://github.com/olleolleolle) in [#623](https://github.com/typhoeus/typhoeus/pull/623)) +- Use of argument passed in function instead of `attr_reader` ([@v-kolesnikov](https://github.com/v-kolesnikov) in [#625](https://github.com/typhoeus/typhoeus/pull/625)) + +## 1.1.2 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.1.1...v1.1.2) + +## 1.1.1 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.1.0...v1.1.1) + +## 1.1.0 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.0.2...v1.1.0) + +* Unless specified `Expect` header is set to be empty to avoid `100 continue` + to be set when using `PUT` +* Add global config option `Typhoeus::Config.proxy` + +## 1.0.2 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.0.1...v1.0.2) + +## 1.0.1 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v1.0.0...v1.0.1) + +## 1.0.0 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.8.0...v1.0.0) + +## 0.8.0 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.3...v0.8.0) + +* `EasyFactory`: Reduced object allocations and method calls during deprecated + option handling and option sanitization. + ([Tasos Laskos](https://github.com/zapotek)) +* `Response` ([Tasos Laskos](https://github.com/zapotek)) + * `Header` + * `#process_pair`: Halved `#set_value` calls. + * `#set_value`: Minimized `Hash` accesses. + * `#parse`: Use `String#start_with?` instead of `Regexp` match. + * `#process_line`: Optimized key/value sanitization. + * `Status` + * `#timed_out?`: Only return `true` when `#return_code` is `operation_timedout`. + +## 0.7.3 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.2...v0.7.3) + +* Add on_body callbacks individually to allow Ethon to recognize the return code + +## 0.7.2 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.1...v0.7.2) + +* Allow arrays to be passed to Expectation#and_return + ([JP Moral](https://github.com/jpmoral)) + +* Added getter for `redirect_time` value. + ([Adrien Jarthon](https://github.com/jarthod)) + +## 0.7.1 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.0...v0.7.1) + +Bugfixes: + +* Forking may cause libcurl sockets to be shared with child processes, causing HTTP requests to be interleaved + ([Rolf Timmermans](https://github.com/rolftimmermans), [\#436](https://github.com/typhoeus/typhoeus/pull/426)) + +## 0.7.0 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.7.0.pre1...v0.7.0) + +Bugfixes: + +* Call on_headers and on_body when using stubbed responses. + +## 0.7.0.pre1 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.9...v0.7.0.pre1) + +Enhancements: + +* Improving timeout behavior and documentation. `no_signal` is now set per default! + ([Jonas Wagner](https://github.com/jwagner), [\#398](https://github.com/typhoeus/typhoeus/pull/398)) + +## 0.6.8 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.7...v0.6.8) + +Bugfixes: + +* Fix Faraday 0.9 compatibility. + ([Gleb Mazovetskiy](https://github.com/glebm), [\#357](https://github.com/typhoeus/typhoeus/pull/357)) +* Fix Request#hash for different key orders. + ([Matthew Schulkind](https://github.com/mschulkind), [\#344](https://github.com/typhoeus/typhoeus/pull/344)) + +Enhancements: + +* Use an updated Ethon version. Note that from now on the `mime-types` is no longer a Ethon dependency. The gem will be still used if available to determine the mime type of a file which is uploaded. That means you have to have take care of the gem installation yourself. +* Use SVG for status badges in README. + ([Sean Linsley](https://github.com/seanlinsley), [\#353](https://github.com/typhoeus/typhoeus/pull/353)) +* Missing quotes in README example code. + ([Jason R. Clark](https://github.com/jasonrclark), [\#351](https://github.com/typhoeus/typhoeus/pull/351)) +* Specs for Faraday adapter. + ([michaelavila](https://github.com/michaelavila), [\#348](https://github.com/typhoeus/typhoeus/pull/348)) +* Clarify wording in README. + ([Sean Linsley](https://github.com/seanlinsley), [\#347](https://github.com/typhoeus/typhoeus/pull/347)) +* Make caching easier for non-memory caches. + ([Matthew Schulkind](https://github.com/mschulkind), [\#345](https://github.com/typhoeus/typhoeus/pull/345)) +* Spec refactoring. + ([Matthew Schulkind](https://github.com/mschulkind), [\#343](https://github.com/typhoeus/typhoeus/pull/343)) + +## 0.6.7 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.6...v0.6.7) + +Enhancements: + +* Add response streaming. + ([\#339](https://github.com/typhoeus/typhoeus/pull/339)) + +## 0.6.6 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.5...v0.6.6) + +## 0.6.5 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.4...v0.6.5) + +## 0.6.4 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.3...v0.6.4) + +The changelog entries are coming soon! + +## 0.6.3 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.2...v0.6.3) + +Enhancements: + +* Cache hydra per thread. +* Various documentation improvements. + ([craiglittle](https://github.com/craiglittle)) +* Add support for lazy construction of responses from stubbed requests. + ([ryankindermann](https://github.com/ryankinderman), [\#275](https://github.com/typhoeus/typhoeus/pull/275)) + +## 0.6.2 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.1...v0.6.2) + +Enhancements: + +* Reintroduce a global cache. +* `Request#handled_response` falls back to the original response. + ([turnerking](https://github.com/turnerking), [\#272](https://github.com/typhoeus/typhoeus/pull/272)) +* When `Errors::NoStub` is raised the `url` is displayed. + ([dschneider](https://github.com/dschneider), [\#276](https://github.com/typhoeus/typhoeus/pull/276)) +* Make `Request#hash` consistent. +* Add `.rvmrc` and `ctags` to `.gitignore`. + ([ryankindermann](https://github.com/ryankinderman), [\#274](https://github.com/typhoeus/typhoeus/pull/274)) + +## 0.6.1 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.6.0...v0.6.1) + +Enhancements: + +* Updated ethon version which allows to set multiple protocols. + +## 0.6.0 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.4...v0.6.0) + +Enhancements: + +* `Request#url` now also contains the url parameters. +* Use updated ethon version which provides access to protocols and redir_protocols in response to [libcurl SASL buffer overflow vulnerability](http://curl.haxx.se/docs/adv_20130206.html) + +Bugfixes: + +* Corrected ssl options for the faraday adapter. +* The before hook now correctly returns the response. + ([Mattias Putman](https://github.com/challengee), [\#268](https://github.com/typhoeus/typhoeus/pull/268)) +* Benchmark is working again. + +## 0.5.4 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.3...v0.5.4) + +Enhancements: + +* Make sure response_code is an integer. +* When setting an header through vcr or webmock it becomes a `Typhoeus::Response::Header`. +* Provide a Rack middleware to decode nested Typhoeus arrays properly. + ([Dwayne Macgowan](https://github.com/dwaynemac), [\#224](https://github.com/typhoeus/typhoeus/issues/224)) +* Handled response is available again. +* Rename parameter `url` to `base_url`. See discussion here: [\#250](https://github.com/typhoeus/typhoeus/issues/250). + ([bkimble](https://github.com/bkimble), [\#256](https://github.com/typhoeus/typhoeus/pull/256)) +* Provide O(1) header access. + * Work around ruby 1.8.7 limitations. + ([Chris Johnson](https://github.com/findchris), [\#227](https://github.com/typhoeus/typhoeus/pull/227) ) + * Provide symbol access. + +## 0.5.3 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.2...v0.5.3) + +Enhancements: + +* When checking options in Expecation#matches? also consider Request#options. + +Bugfixes: + +* Do not break backwards compatibility with case insensitive headers access. +* Make sure hydra behaves correct in case of before hooks. + +## 0.5.2 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.1...v0.5.2) + +Enhancements: + +* Do not check the return_code in Response#success? when response is mocked. +* Check for memoization, stubbing, before hooks are delayed to Hydra#run. It + was on Hydra#queue before and led to strange behavior because if the request + was stubbed, it was wrapped up in queue already. There was no way to add + callbacks after queue thatswhy. This is now different, since everything happens + in run, just as you expect. + +## 0.5.1 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.5.0...v0.5.1) + +Enhancements: + +* Downcase header keys for easier access + ( [\#227](https://github.com/typhoeus/typhoeus/issues/227) ) +* Using an updated Ethon version. + +## 0.5.0 + +[Full Changelog](http://github.com/typhoeus/typhoeus/compare/v0.4.2...v0.5.0) + +Major Changes: + +* Ethon integration + * Params are url params and a body is always a body for every request type + * The options you can set might have a slightly other names, as Ethon sticks to + libcurl names. See + [Easy.new](http://rubydoc.info/github/typhoeus/ethon/Ethon/Easy#initialize-instance_method) + for a description. + * Request parameter and body are properly encoded (only POST multiform body is not) + * No more header sanitizing. Before: `:headers => { 'user_agent' => 'Custom' }` was modified to + `:headers => { 'User-Agent' => 'Custom' }` + * `Typhoeus::Easy` and `Typhoeus::Multi` are now `Ethon::Easy` and `Ethon::Multi` + +* Request shortcuts: `Typhoeus.get("www.google.de")` +* Global configuration: +```ruby +Typhoeus.configure do |config| + config.verbose = true + config.memoize = true +end +``` +* No more `Response#headers_hash`, instead `Response#headers` returning the last + header and response#redirections returning the responses with headers + generated through redirections +* Instead of defining the same callbacks on every request, you can define global callbacks: +```ruby +Typhoeus.on_complete { p "yay" } +``` +* The stubbing interface changed slightly. You now have the same syntax as for requests: +```ruby +Typhoeus.stub(url, options).and_return(response) +``` +* The following things were removed because they do not seemed to be used at all. Ping me if you disagree! + * `Typhoeus::Filter` + * `Typhoeus::Remote` + * `Typhoeus::RemoteMethod` + * `Typhoeus::RemoteProxyObject` + * build in cache interface + +Enhancements: + +* Documentation + ( [Alex P](https://github.com/ifesdjeen), [\#188](https://github.com/typhoeus/typhoeus/issues/188) ) +* Request#on\_complete can hold multiple blocks. +* Request#eql? recognizes when header/params/body has a different order, but still same keys and values + ( [Alex P](https://github.com/ifesdjeen), [\#194](https://github.com/typhoeus/typhoeus/issues/194) ) + +Bug Fixes: + +* Zero bytes in strings are escaped for libcurl +* Add support for socks5 hostname proxy type + ( [eweathers](https://github.com/eweathers), [\#183](https://github.com/typhoeus/typhoeus/issues/183) ) +* Post body is encoded + ( [Rohan Deshpande](https://github.com/rdeshpande), [\#143](https://github.com/typhoeus/typhoeus/issues/143) ) +* Set default user agent + ( [Steven Shingler](https://github.com/sshingler), [\#176](https://github.com/typhoeus/typhoeus/issues/176) ) + +## 0.4.2 +* A header hotfix + +## 0.4.1 +* Fix verifypeer and verifyhost options +* Fix header sending + +## 0.4.0 +* Make a GET even when a body is given +* Deprecated User Agent setter removed +* Allow cache key basis overwrite (John Crepezzi, #147) +* FFI integration (Daniel Cavanagh, #151) +* Refactor upload code (Marnen Laibow-Koser, #152) +* Fix travis-ci build (Ezekiel Templin, #160) + +## 0.3.3 +* Make sure to call the Easy::failure callback on all non-success http response codes, even invalid ones. [balexis] +* Use bytesize instead of length to determine Content-Length [dlamacchia] +* Added SSL version option to Easy/Request [michelbarbosa/dbalatero] + +## 0.3.2 +* Fix array params to be consistent with HTTP spec [gridaphobe] +* traversal\_to\_params\_hash should use the escape option [itsmeduncan] +* Fix > 1024 open file descriptors [mschulkind] +* Fixed a bug with internally queued requests being dropped [mschulkind] +* Use gemspec in bundler to avoid duplication [mschulkind] +* Run internally queued requests in FIFO order [mschulkind] +* Moved Typhoeus::VERSION to a separate file, to fix rake build\_native [mschulkind] +* Fixed problems related to put requests with empty bodies [skaes, GH-84] +* Added CURLOPT\_INTERFACE option via Request#interface=. [spiegela] +* Added Tempfile support to Form#process! [richievos] +* Hydra won't forget to accept gzip/deflate encoding [codesnik] +* Accept and convert strings to integers in Typhoeus::Request#initialize for timeout/cache\_timeout/connect\_timeout values when using ruby 1.9.x. [djnawara] +* Added interface for registering stub finders [myronmarston] +* Fixed header stubbing [myronmarston] +* Added PKCS12 support [jodell] +* Make a request with handlers marshallable [bernerdschaefer] +* Upgraded to RSpec 2 [bernerdschaefer] +* Fix HTTP status edge-case [balexis] +* Expose primary\_ip to easy object [balexis] + +## 0.2.4 +* Fix form POSTs to only use multipart for file uploads, otherwise use application/x-www-form-urlencoded [dbalatero] + +## 0.2.3 +* Code duplication in Typhoeus::Form led to nested URL param errors on POST only. Fixed [dbalatero] + +## 0.2.2 +* Fixed a problem with nested URL params encoding incorrectly [dbalatero] + +## 0.2.1 +* Added extended proxy support [Zapotek, GH-46] +* eliminated compile time warnings by using proper type declarations [skaes, GH-54] +* fixed broken calls to rb\_raise [skaes, GH-54] +* prevent leaking of curl easy handles when exceptions are raised (either from typhoeus itself or user callbacks) [skaes, GH-54] +* fixed Easy#timed\_out? using curl return codes [skaes, GH-54] +* provide curl return codes and corresponding curl error messages on classes Easy and Request [skaes, GH-54] +* allow VCR to whitelist hosts in Typhoeus stubbing/mocking [myronmarston, GH-57] +* added timed\_out? documentation, method to Response [dbalatero, GH-34] +* added abort to Hydra to prematurely stop a hydra.run [Zapotek] +* added file upload support for POST requests [jtarchie, GH-59] + +## 0.2.0 +* Fix warning in Request#headers from attr\_accessor +* Params with array values were not parsing into the format that rack expects [GH-39, smartocci] +* Removed Rack as a dependency [GH-45] +* Added integration hooks for VCR! + +## 0.1.31 +* Fixed bug in setting compression encoding [morhekil] +* Exposed authentication control methods through Request interface [morhekil] + +## 0.1.30 +* Exposed CURLOPT\_CONNECTTIMEOUT\_MS to Requests [balexis] + +## 0.1.29 +* Fixed a memory corruption with using CURLOPT\_POSTFIELDS [gravis, +32531d0821aecc4] + +## 0.1.28 +* Added SSL cert options for Typhoeus::Easy [GH-25, gravis] +* Ported SSL cert options to Typhoeus::Request interface [gravis] +* Added support for any HTTP method (purge for Varnish) [ryana] + +## 0.1.27 +* Added rack as dependency, added dev dependencies to Rakefile [GH-21] diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/CONTRIBUTING.md b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/CONTRIBUTING.md new file mode 100644 index 000000000000..667e8a32efd7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/CONTRIBUTING.md @@ -0,0 +1,20 @@ +We love pull requests. Here's a quick guide: + +1. Fork the repo. + +2. Run the tests. We only take pull requests with passing tests, and it's great +to know that you have a clean slate: `bundle && bundle exec rake` + +3. Add a test for your change. Only refactoring and documentation changes +require no new tests. If you are adding functionality or fixing a bug, we need +a test! + +4. Make the test pass. + +5. Push to your fork and submit a pull request. + +And in case we didn't emphasize it enough: we love tests! + +## Issue triage [![Open Source Helpers](https://www.codetriage.com/typhoeus/typhoeus/badges/users.svg)](https://www.codetriage.com/typhoeus/typhoeus) + +You can contribute by triaging issues which may include reproducing bug reports or asking for vital information, such as version numbers or reproduction instructions. If you would like to start triaging issues, one easy way to get started is to [subscribe to typhoeus on CodeTriage](https://www.codetriage.com/typhoeus/typhoeus). diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/Gemfile b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/Gemfile new file mode 100644 index 000000000000..dd662d708fd3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/Gemfile @@ -0,0 +1,32 @@ +source "https://rubygems.org" +gemspec + +if Gem.ruby_version < Gem::Version.new("2.0.0") + gem "rake", "< 11" + gem "json", "< 2" +else + gem "json" + gem "rake" +end + +group :development, :test do + gem "rspec", "~> 3.0" + + gem "sinatra", "~> 1.3" + + if Gem.ruby_version >= Gem::Version.new("1.9.0") + gem "faraday", ">= 0.9" + gem "dalli", "~> 2.0" + end + + gem "redis", "~> 3.0" + + if RUBY_PLATFORM == "java" + gem "spoon" + end + + unless ENV["CI"] + gem "guard-rspec", "~> 0.7" + gem 'rb-fsevent', '~> 0.9.1' + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/Guardfile b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/Guardfile new file mode 100644 index 000000000000..f0db2992bdd0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/Guardfile @@ -0,0 +1,9 @@ +# vim:set filetype=ruby: +guard( + "rspec", + all_after_pass: false, + cli: "--fail-fast --tty --format documentation --colour") do + + watch(%r{^spec/.+_spec\.rb$}) + watch(%r{^lib/(.+)\.rb$}) { |match| "spec/#{match[1]}_spec.rb" } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/LICENSE b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/LICENSE new file mode 100644 index 000000000000..387fac5726da --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2009-2010 Paul Dix +Copyright (c) 2011 David Balatero +Copyright (c) 2012-2016 Hans Hasselberg + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/README.md b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/README.md new file mode 100644 index 000000000000..1bbab54a0079 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/README.md @@ -0,0 +1,584 @@ +# Typhoeus [![Build Status](https://img.shields.io/travis/typhoeus/typhoeus/master.svg)](https://travis-ci.org/typhoeus/typhoeus) [![Code Climate](https://img.shields.io/codeclimate/maintainability/typhoeus/typhoeus.svg)](https://codeclimate.com/github/typhoeus/typhoeus) [![Gem Version](https://img.shields.io/gem/v/typhoeus.svg)](https://rubygems.org/gems/typhoeus) + +Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic. + +## Example + +A single request: + +```ruby +Typhoeus.get("www.example.com", followlocation: true) +``` + +Parallel requests: + +```ruby +hydra = Typhoeus::Hydra.new +10.times.map{ hydra.queue(Typhoeus::Request.new("www.example.com", followlocation: true)) } +hydra.run +``` + +## Installation +Add the following line to your Gemfile: +``` +gem "typhoeus" +``` +Then run `bundle install` + +Or install it yourself as: + +``` +gem install typhoeus +``` + +## Project Tracking + +* [Documentation](http://rubydoc.info/github/typhoeus/typhoeus/frames/Typhoeus) (GitHub master) +* [Mailing list](http://groups.google.com/group/typhoeus) + +## Usage + +### Introduction + +The primary interface for Typhoeus is comprised of three classes: Request, Response, and Hydra. Request represents an HTTP request object, response represents an HTTP response, and Hydra manages making parallel HTTP connections. + +```ruby +request = Typhoeus::Request.new( + "www.example.com", + method: :post, + body: "this is a request body", + params: { field1: "a field" }, + headers: { Accept: "text/html" } +) +``` + +We can see from this that the first argument is the url. The second is a set of options. +The options are all optional. The default for `:method` is `:get`. + +When you want to send URL parameters, you can use `:params` hash to do so. Please note that in case of you should send a request via `x-www-form-urlencoded` parameters, you need to use `:body` hash instead. `params` are for URL parameters and `:body` is for the request body. + +#### Sending requests through the proxy + +Add a proxy url to the list of options: + +```ruby +options = {proxy: 'http://myproxy.org'} +req = Typhoeus::Request.new(url, options) +``` + +If your proxy requires authentication, add it with `proxyuserpwd` option key: + +```ruby +options = {proxy: 'http://proxyurl.com', proxyuserpwd: 'user:password'} +req = Typhoeus::Request.new(url, options) +``` + +Note that `proxyuserpwd` is a colon-separated username and password, in the vein of basic auth `userpwd` option. + + +You can run the query either on its own or through the hydra: + +``` ruby +request.run +#=> <Typhoeus::Response ... > +``` + +```ruby +hydra = Typhoeus::Hydra.hydra +hydra.queue(request) +hydra.run +``` + +The response object will be set after the request is run. + +```ruby +response = request.response +response.code +response.total_time +response.headers +response.body +``` + +### Making Quick Requests + +Typhoeus has some convenience methods for performing single HTTP requests. The arguments are the same as those you pass into the request constructor. + +```ruby +Typhoeus.get("www.example.com") +Typhoeus.head("www.example.com") +Typhoeus.put("www.example.com/posts/1", body: "whoo, a body") +Typhoeus.patch("www.example.com/posts/1", body: "a new body") +Typhoeus.post("www.example.com/posts", body: { title: "test post", content: "this is my test"}) +Typhoeus.delete("www.example.com/posts/1") +Typhoeus.options("www.example.com") +``` +#### Sending params in the body with PUT +When using POST the content-type is set automatically to 'application/x-www-form-urlencoded'. That's not the case for any other method like PUT, PATCH, HEAD and so on, irrespective of whether you are using body or not. To get the same result as POST, i.e. a hash in the body coming through as params in the receiver, you need to set the content-type as shown below: +```ruby +Typhoeus.put("www.example.com/posts/1", + headers: {'Content-Type'=> "application/x-www-form-urlencoded"}, + body: {title:"test post updated title", content: "this is my updated content"} + ) +``` + +### Handling HTTP errors + +You can query the response object to figure out if you had a successful +request or not. Here’s some example code that you might use to handle errors. +The callbacks are executed right after the request is finished, make sure to define +them before running the request. + +```ruby +request = Typhoeus::Request.new("www.example.com", followlocation: true) + +request.on_complete do |response| + if response.success? + # hell yeah + elsif response.timed_out? + # aw hell no + log("got a time out") + elsif response.code == 0 + # Could not get an http response, something's wrong. + log(response.return_message) + else + # Received a non-successful http response. + log("HTTP request failed: " + response.code.to_s) + end +end + +request.run +``` + +This also works with serial (blocking) requests in the same fashion. Both +serial and parallel requests return a Response object. + +### Handling file uploads + +A File object can be passed as a param for a POST request to handle uploading +files to the server. Typhoeus will upload the file as the original file name +and use Mime::Types to set the content type. + +```ruby +Typhoeus.post( + "http://localhost:3000/posts", + body: { + title: "test post", + content: "this is my test", + file: File.open("thesis.txt","r") + } +) +``` + +### Streaming the response body + +Typhoeus can stream responses. When you're expecting a large response, +set the `on_body` callback on a request. Typhoeus will yield to the callback +with chunks of the response, as they're read. When you set an `on_body` callback, +Typhoeus will not store the complete response. + +```ruby +downloaded_file = File.open 'huge.iso', 'wb' +request = Typhoeus::Request.new("www.example.com/huge.iso") +request.on_headers do |response| + if response.code != 200 + raise "Request failed" + end +end +request.on_body do |chunk| + downloaded_file.write(chunk) +end +request.on_complete do |response| + downloaded_file.close + # Note that response.body is "" +end +request.run +``` + +If you need to interrupt the stream halfway, +you can return the `:abort` symbol from the `on_body` block, example: + +```ruby +request.on_body do |chunk| + buffer << chunk + :abort if buffer.size > 1024 * 1024 +end +``` + +This will properly stop the stream internally and avoid any memory leak which +may happen if you interrupt with something like a `return`, `throw` or `raise`. + +### Making Parallel Requests + +Generally, you should be running requests through hydra. Here is how that looks: + +```ruby +hydra = Typhoeus::Hydra.hydra + +first_request = Typhoeus::Request.new("http://example.com/posts/1") +first_request.on_complete do |response| + third_url = response.body + third_request = Typhoeus::Request.new(third_url) + hydra.queue third_request +end +second_request = Typhoeus::Request.new("http://example.com/posts/2") + +hydra.queue first_request +hydra.queue second_request +hydra.run # this is a blocking call that returns once all requests are complete +``` + +The execution of that code goes something like this. The first and second requests are built and queued. When hydra is run the first and second requests run in parallel. When the first request completes, the third request is then built and queued, in this example based on the result of the first request. The moment it is queued Hydra starts executing it. Meanwhile the second request would continue to run (or it could have completed before the first). Once the third request is done, `hydra.run` returns. + +How to get an array of response bodies back after executing a queue: + +```ruby +hydra = Typhoeus::Hydra.new +requests = 10.times.map { + request = Typhoeus::Request.new("www.example.com", followlocation: true) + hydra.queue(request) + request +} +hydra.run + +responses = requests.map { |request| + request.response.body +} +``` +`hydra.run` is a blocking request. You can also use the `on_complete` callback to handle each request as it completes: + +```ruby +hydra = Typhoeus::Hydra.new +10.times do + request = Typhoeus::Request.new("www.example.com", followlocation: true) + request.on_complete do |response| + #do_something_with response + end + hydra.queue(request) +end +hydra.run +``` + +### Making Parallel Requests with Faraday + Typhoeus + +```ruby +require 'faraday' + +conn = Faraday.new(:url => 'http://httppage.com') do |builder| + builder.request :url_encoded + builder.response :logger + builder.adapter :typhoeus +end + +conn.in_parallel do + response1 = conn.get('/first') + response2 = conn.get('/second') + + # these will return nil here since the + # requests have not been completed + response1.body + response2.body +end + +# after it has been completed the response information is fully available +# response1.status, etc +response1.body +response2.body +``` + +### Specifying Max Concurrency + +Hydra will also handle how many requests you can make in parallel. Things will get flakey if you try to make too many requests at the same time. The built in limit is 200. When more requests than that are queued up, hydra will save them for later and start the requests as others are finished. You can raise or lower the concurrency limit through the Hydra constructor. + +```ruby +Typhoeus::Hydra.new(max_concurrency: 20) +``` + +### Memoization + +Hydra memoizes requests within a single run call. You have to enable memoization. +This will result in a single request being issued. However, the on_complete handlers of both will be called. + +```ruby +Typhoeus::Config.memoize = true + +hydra = Typhoeus::Hydra.new(max_concurrency: 1) +2.times do + hydra.queue Typhoeus::Request.new("www.example.com") +end +hydra.run +``` + +This will result in two requests. + +```ruby +Typhoeus::Config.memoize = false + +hydra = Typhoeus::Hydra.new(max_concurrency: 1) +2.times do + hydra.queue Typhoeus::Request.new("www.example.com") +end +hydra.run +``` + +### Caching + +Typhoeus includes built in support for caching. In the following example, if there is a cache hit, the cached object is passed to the on_complete handler of the request object. + +```ruby +class Cache + def initialize + @memory = {} + end + + def get(request) + @memory[request] + end + + def set(request, response) + @memory[request] = response + end +end + +Typhoeus::Config.cache = Cache.new + +Typhoeus.get("www.example.com").cached? +#=> false +Typhoeus.get("www.example.com").cached? +#=> true +``` + +For use with [Dalli](https://github.com/mperham/dalli): + +```ruby +dalli = Dalli::Client.new(...) +Typhoeus::Config.cache = Typhoeus::Cache::Dalli.new(dalli) +``` + +For use with Rails: + +```ruby +Typhoeus::Config.cache = Typhoeus::Cache::Rails.new +``` + +For use with [Redis](https://github.com/redis/redis-rb): + +```ruby +redis = Redis.new(...) +Typhoeus::Config.cache = Typhoeus::Cache::Redis.new(redis) +``` + +All three of these adapters take an optional keyword argument `default_ttl`, which sets a default +TTL on cached responses (in seconds), for requests which do not have a cache TTL set. + +You may also selectively choose not to cache by setting `cache` to `false` on a request or to use +a different adapter. + +```ruby +cache = Cache.new +Typhoeus.get("www.example.com", cache: cache) +``` + +### Direct Stubbing + +Hydra allows you to stub out specific urls and patterns to avoid hitting +remote servers while testing. + +```ruby +response = Typhoeus::Response.new(code: 200, body: "{'name' : 'paul'}") +Typhoeus.stub('www.example.com').and_return(response) + +Typhoeus.get("www.example.com") == response +#=> true +``` + +The queued request will hit the stub. You can also specify a regex to match urls. + +```ruby +response = Typhoeus::Response.new(code: 200, body: "{'name' : 'paul'}") +Typhoeus.stub(/example/).and_return(response) + +Typhoeus.get("www.example.com") == response +#=> true +``` + +You may also specify an array for the stub to return sequentially. + +```ruby +Typhoeus.stub('www.example.com').and_return([response1, response2]) + +Typhoeus.get('www.example.com') == response1 #=> true +Typhoeus.get('www.example.com') == response2 #=> true +``` + +When testing make sure to clear your expectations or the stubs will persist between tests. The following can be included in your spec_helper.rb file to do this automatically. + +```ruby +RSpec.configure do |config| + config.before :each do + Typhoeus::Expectation.clear + end +end +``` + +### Timeouts + +No exceptions are raised on HTTP timeouts. You can check whether a request timed out with the following method: + +```ruby +Typhoeus.get("www.example.com", timeout: 1).timed_out? +``` + +Timed out responses also have their success? method return false. + +There are two different timeouts available: [`timeout`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTTIMEOUT) +and [`connecttimeout`](http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTCONNECTTIMEOUT). +`timeout` is the time limit for the entire request in seconds. +`connecttimeout` is the time limit for just the connection phase, again in seconds. + +There are two additional more fine grained options `timeout_ms` and +`connecttimeout_ms`. These options offer millisecond precision but are not always available (for instance on linux if `nosignal` is not set to true). + +When you pass a floating point `timeout` (or `connecttimeout`) Typhoeus will set `timeout_ms` for you if it has not been defined. The actual timeout values passed to curl will always be rounded up. + +DNS timeouts of less than one second are not supported unless curl is compiled with an asynchronous resolver. + +The default `timeout` is 0 (zero) which means curl never times out during transfer. The default `connecttimeout` is 300 seconds. A `connecttimeout` of 0 will also result in the default `connecttimeout` of 300 seconds. + +### Following Redirections + +Use `followlocation: true`, eg: + +```ruby +Typhoeus.get("www.example.com", followlocation: true) +``` + +### Basic Authentication + +```ruby +Typhoeus::Request.get("www.example.com", userpwd: "user:password") +``` + +### Compression + +```ruby +Typhoeus.get("www.example.com", accept_encoding: "gzip") +``` + +The above has a different behavior than setting the header directly in the header hash, eg: +```ruby +Typhoeus.get("www.example.com", headers: {"Accept-Encoding" => "gzip"}) +``` + +Setting the header hash directly will not include the `--compressed` flag in the libcurl command and therefore libcurl will not decompress the response. If you want the `--compressed` flag to be added automatically, set `:accept_encoding` Typhoeus option. + + +### Cookies + +```ruby +Typhoeus::Request.get("www.example.com", cookiefile: "/path/to/file", cookiejar: "/path/to/file") +``` + +Here, `cookiefile` is a file to read cookies from, and `cookiejar` is a file to write received cookies to. +If you just want cookies enabled, you need to pass the same filename for both options. + +### Other CURL options + +Are available and documented [here](http://rubydoc.info/github/typhoeus/ethon/Ethon/Easy/Options) + +### SSL + +SSL comes built in to libcurl so it’s in Typhoeus as well. If you pass in a +url with "https" it should just work assuming that you have your [cert +bundle](http://curl.haxx.se/docs/caextract.html) in order and the server is +verifiable. You must also have libcurl built with SSL support enabled. You can +check that by doing this: + +``` +curl --version +``` + +Now, even if you have libcurl built with OpenSSL you may still have a messed +up cert bundle or if you’re hitting a non-verifiable SSL server then you’ll +have to disable peer verification to make SSL work. Like this: + +```ruby +Typhoeus.get("https://www.example.com", ssl_verifypeer: false) +``` + +If you are getting "SSL: certificate subject name does not match target host +name" from curl (ex:- you are trying to access to b.c.host.com when the +certificate subject is \*.host.com). You can disable host verification. Like +this: + +```ruby +# host checking enabled +Typhoeus.get("https://www.example.com", ssl_verifyhost: 2) +# host checking disabled +Typhoeus.get("https://www.example.com", ssl_verifyhost: 0) +``` + +### Verbose debug output + +It’s sometimes useful to see verbose output from curl. You can enable it on a per-request basis: + +```ruby +Typhoeus.get("http://example.com", verbose: true) +``` + +or globally: + +```ruby +Typhoeus::Config.verbose = true +``` + +Just remember that libcurl prints it’s debug output to the console (to +STDERR), so you’ll need to run your scripts from the console to see it. + +### Default User Agent Header + +In many cases, all HTTP requests made by an application require the same User-Agent header set. Instead of supplying it on a per-request basis by supplying a custom header, it is possible to override it for all requests using: + + +```ruby +Typhoeus::Config.user_agent = "custom user agent" +``` + +### Running the specs + +Running the specs should be as easy as: + +``` +bundle install +bundle exec rake +``` +## Semantic Versioning + +This project conforms to [semver](http://semver.org/). + +## LICENSE + +(The MIT License) + +Copyright © 2009-2010 [Paul Dix](http://www.pauldix.net/) + +Copyright © 2011-2012 [David Balatero](https://github.com/dbalatero/) + +Copyright © 2012-2016 [Hans Hasselberg](http://github.com/i0rek/) + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without +limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/Rakefile b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/Rakefile new file mode 100644 index 000000000000..d5693a5df9f0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/Rakefile @@ -0,0 +1,38 @@ +require "bundler" +Bundler.setup + +require "rake" +require "rspec/core/rake_task" +$LOAD_PATH.unshift File.expand_path("../lib", __FILE__) +require "typhoeus/version" + +task :gem => :build +task :build do + system "gem build typhoeus.gemspec" +end + +task :install => :build do + system "gem install typhoeus-#{Typhoeus::VERSION}.gem" +end + +task :release => :build do + system "git tag -a v#{Typhoeus::VERSION} -m 'Tagging #{Typhoeus::VERSION}'" + system "git push --tags" + system "gem push typhoeus-#{Typhoeus::VERSION}.gem" +end + +RSpec::Core::RakeTask.new(:spec) do |t| + t.verbose = false + t.ruby_opts = "-W -I./spec -rspec_helper" +end + +desc "Start up the test servers" +task :start do + require_relative 'spec/support/boot' + begin + Boot.start_servers(:rake) + rescue Exception + end +end + +task :default => :spec diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/UPGRADE.md b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/UPGRADE.md new file mode 100644 index 000000000000..28c7f1d2e9e0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/UPGRADE.md @@ -0,0 +1,55 @@ +# Upgrade guide + +## 0.5 + +### Options + +Fix the option names, because some were renamed. The errors should point you in the right direction: + +```ruby +Typhoeus.get("www.example.com", follow_location: true) +# Ethon::Errors::InvalidOption: The option: follow_location is invalid. +# Please try followlocation instead of follow_location. +# ... [Backtrace] + +Typhoeus.get("www.example.com", followlocation: true).code +#=> 200 +``` + +### Headers + +`Response#headers` returns a hash now and replaces `Response#headers_hash`, use `Response#response_headers` for the raw string: + +```ruby +Typhoeus.get("www.example.com", followlocation: true).headers +#=> { +# "date"=>"Tue, 06 Nov 2012 09:07:27 GMT", +# "server"=>"Apache/2.2.3 (CentOS)", +# "last-modified"=>"Wed, 09 Feb 2011 17:13:15 GMT", +# "vary"=>"Accept-Encoding", +# "connection"=>"close", +# "content-type"=>"text/html; charset=UTF-8" +# } + +Typhoeus.get("www.example.com", followlocation: true).response_headers +#=> "HTTP/1.0 302 Found\r\nLocation: http://www.iana.org/domains/example/ [...]" +``` + +### Params vs body + +Make sure every request sends proper params and body (especially POST/PUT). `:params` becomes url parameter and `:body` request body. Before params for POST was smashed into the body. + +### Configuration + +Create a global configuration in case you want to turn on verbose, memoize or block_connection: + +```ruby +Typhoeus.configure do |config| + config.verbose = true + config.memoize = true +end +``` + +### Docs + +When in doubt, read the [docs](http://rubydoc.info/github/typhoeus/typhoeus/frames/Typhoeus) or the [code](https://www.github.com/typhoeus). diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/rack/typhoeus.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/rack/typhoeus.rb new file mode 100644 index 000000000000..dd9361170d77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/rack/typhoeus.rb @@ -0,0 +1 @@ +require "rack/typhoeus/middleware/params_decoder" diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/rack/typhoeus/middleware/params_decoder.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/rack/typhoeus/middleware/params_decoder.rb new file mode 100644 index 000000000000..cbd10f38e33c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/rack/typhoeus/middleware/params_decoder.rb @@ -0,0 +1,57 @@ +require 'rack/typhoeus/middleware/params_decoder/helper' + +module Rack + module Typhoeus + module Middleware + + # This Rack middleware takes care of the proper deserialization of + # the nested params encoded by Typhoeus. + # + # @example Require the railtie when using Rails. + # require 'typhoeus/railtie' + # + # @example Include the middleware for Rack based applications. + # use Rack::Typhoeus::Middleware::ParamsDecoder + # + # @example Use the helper directly. Not recommended as b/c the interface might change. + # require 'rack/typhoeus/middleware/params_decoder/helper' + # include Rack::Typhoeus::Middleware::ParamsDecoder::Helper + # decode!(params) + # + # @author Dwayne Macgowan + # @since 0.5.4 + class ParamsDecoder + include ParamsDecoder::Helper + + def initialize(app) + @app = app + end + + def call(env) + req = Rack::Request.new(env) + decode(req.params).each_pair { |k, v| update_params req, k, v } + @app.call(env) + end + + private + + # Persist params change in environment. Extracted from: + # https://github.com/rack/rack/blob/master/lib/rack/request.rb#L243 + def update_params(req, k, v) + found = false + if req.GET.has_key?(k) + found = true + req.GET[k] = v + end + if req.POST.has_key?(k) + found = true + req.POST[k] = v + end + unless found + req.GET[k] = v + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/rack/typhoeus/middleware/params_decoder/helper.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/rack/typhoeus/middleware/params_decoder/helper.rb new file mode 100644 index 000000000000..0542328aac51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/rack/typhoeus/middleware/params_decoder/helper.rb @@ -0,0 +1,76 @@ +module Rack + module Typhoeus + module Middleware + class ParamsDecoder + module Helper + + # Recursively decodes Typhoeus encoded arrays in given Hash. + # + # @example Use directly in a Rails controller. + # class ApplicationController + # before_filter :decode_typhoeus_arrays + # end + # + # @author Dwayne Macgowan + # + def decode_typhoeus_arrays + decode!(params) + end + + # Recursively decodes Typhoeus encoded arrays in given Hash. + # + # @param hash [Hash]. This Hash will be modified! + # + # @return [Hash] Hash with properly decoded nested arrays. + def decode!(hash) + return hash unless hash.is_a?(Hash) + hash.each_pair do |key,value| + if value.is_a?(Hash) + decode!(value) + hash[key] = convert(value) + end + end + hash + end + + def decode(hash) + decode!(hash.dup) + end + + private + + # Checks if Hash is an Array encoded as a Hash. + # Specifically will check for the Hash to have this + # form: {'0' => v0, '1' => v1, .., 'n' => vN } + # + # @param hash [Hash] + # + # @return [Boolean] True if its a encoded Array, else false. + def encoded?(hash) + return false if hash.empty? + if hash.keys.size > 1 + keys = hash.keys.map{|i| i.to_i if i.respond_to?(:to_i)}.sort + keys == hash.keys.size.times.to_a + else + hash.keys.first =~ /0/ + end + end + + # If the Hash is an array encoded by typhoeus an array is returned + # else the self is returned + # + # @param hash [Hash] The Hash to convert into an Array. + # + # @return [Arraya/Hash] + def convert(hash) + if encoded?(hash) + hash.sort{ |a, b| a[0].to_i <=> b[0].to_i }.map{ |key, value| value } + else + hash + end + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus.rb new file mode 100644 index 000000000000..1e2226a2e98e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus.rb @@ -0,0 +1,143 @@ +require 'digest/sha2' +require 'ethon' + +require 'typhoeus/config' +require 'typhoeus/easy_factory' +require 'typhoeus/errors' +require 'typhoeus/expectation' +require 'typhoeus/hydra' +require 'typhoeus/pool' +require 'typhoeus/request' +require 'typhoeus/response' +require 'typhoeus/version' + +# If we are using any Rack-based application, then we need the Typhoeus rack +# middleware to ensure our app is running properly. +if defined?(Rack) + require "rack/typhoeus" +end + +# If the Redis gem is available, load the redis cache adapter +if defined?(Redis) + require "typhoeus/cache/redis" +end + +# If the Dalli gem is available, load the Dalli cache adapter +if defined?(Dalli) + require "typhoeus/cache/dalli" +end + +# If we are using Rails, load the Rails cache adapter +if defined?(Rails) + require "typhoeus/cache/rails" +end + +# If we are using Rails, then we will include the Typhoeus railtie. +# if defined?(Rails) +# require "typhoeus/railtie" +# end + +# Typhoeus is a HTTP client library based on Ethon which +# wraps libcurl. Sitting on top of libcurl makes Typhoeus +# very reliable and fast. +# +# There are some gems using Typhoeus like +# {https://github.com/myronmarston/vcr VCR}, +# {https://github.com/bblimke/webmock WebMock} or +# {https://github.com/technoweenie/faraday Faraday}. VCR +# and WebMock provide their own adapter whereas +# Faraday relies on {Faraday::Adapter::Typhoeus} +# since Typhoeus version 0.5. +# +# @example (see Typhoeus::Request) +# @example (see Typhoeus::Hydra) +# +# @see Typhoeus::Request +# @see Typhoeus::Hydra +# @see Faraday::Adapter::Typhoeus +# +# @since 0.5.0 +module Typhoeus + extend Request::Actions + extend Request::Callbacks::Types + + # The default Typhoeus user agent. + USER_AGENT = "Typhoeus - https://github.com/typhoeus/typhoeus" + + # Set the Typhoeus configuration options by passing a block. + # + # @example (see Typhoeus::Config) + # + # @yield [ Typhoeus::Config ] + # + # @return [ Typhoeus::Config ] The configuration. + # + # @see Typhoeus::Config + def self.configure + yield Config + end + + # Stub out a specific request. + # + # @example (see Typhoeus::Expectation) + # + # @param [ String ] base_url The url to stub out. + # @param [ Hash ] options The options to stub out. + # + # @return [ Typhoeus::Expectation ] The expecatation. + # + # @see Typhoeus::Expectation + def self.stub(base_url, options = {}, &block) + expectation = Expectation.all.find{ |e| e.base_url == base_url && e.options == options } + if expectation.nil? + expectation = Expectation.new(base_url, options) + Expectation.all << expectation + end + + expectation.and_return(&block) unless block.nil? + expectation + end + + # Add before callbacks. + # + # @example Add before callback. + # Typhoeus.before { |request| p request.base_url } + # + # @param [ Block ] block The callback. + # + # @yield [ Typhoeus::Request ] + # + # @return [ Array<Block> ] All before blocks. + def self.before(&block) + @before ||= [] + @before << block if block_given? + @before + end + + # Execute given block as if block connection is turned off. + # The old block connection state is restored afterwards. + # + # @example Make a real request, no matter if it's blocked. + # Typhoeus::Config.block_connection = true + # Typhoeus.get("www.example.com").code + # #=> raise Typhoeus::Errors::NoStub + # + # Typhoeus.with_connection do + # Typhoeus.get("www.example.com").code + # #=> :ok + # end + # + # @yield Yields control to the block after disabling block_connection. + # Afterwards, the block_connection is set to its original + # value. + # @return [ Object ] Returns the return value of the block. + # + # @see Typhoeus::Config.block_connection + def self.with_connection + old = Config.block_connection + Config.block_connection = false + result = yield if block_given? + Config.block_connection = old + result + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/adapters/faraday.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/adapters/faraday.rb new file mode 100644 index 000000000000..84520109fa6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/adapters/faraday.rb @@ -0,0 +1,180 @@ +require 'faraday' + +module Faraday # :nodoc: + class Adapter # :nodoc: + + # Adapter to use Faraday with Typhoeus. + # + # @example Use Typhoeus. + # require 'faraday' + # require 'typhoeus' + # require 'typhoeus/adapters/faraday' + # + # conn = Faraday.new(url: "www.example.com") do |faraday| + # faraday.adapter :typhoeus + # + # # You can include Typhoeus options to be used for every request + # # faraday.adapter :typhoeus, forbid_reuse: true, maxredirs: 1 + # end + # + # response = conn.get("/") + class Typhoeus < Faraday::Adapter + self.supports_parallel = true + + (class << self; self; end).instance_eval do + remove_method :setup_parallel_manager if method_defined? :setup_parallel_manager + end + + remove_method :call if method_defined? :call + remove_method :perform_request if method_defined? :perform_request + remove_method :request if method_defined? :request + remove_method :read_body if method_defined? :read_body + remove_method :configure_ssl if method_defined? :configure_ssl + remove_method :configure_proxy if method_defined? :configure_proxy + remove_method :configure_timeout if method_defined? :configure_timeout + remove_method :configure_socket if method_defined? :configure_socket + remove_method :parallel? if method_defined? :parallel? + + # Initialize the Typhoeus adapter + # + # @param [ App ] app Farday app + # @option [ Hash ] adapter_options Typhoeus options + # + # @return [ void ] + def initialize(app, adapter_options = {}) + super(app) + @adapter_options = adapter_options + end + + # Setup Hydra with provided options. + # + # @example Setup Hydra. + # Faraday::Adapter::Typhoeus.setup_parallel_manager + # #=> #<Typhoeus::Hydra ... > + # + # @param (see Typhoeus::Hydra#initialize) + # @option (see Typhoeus::Hydra#initialize) + # + # @return [ Typhoeus::Hydra ] The hydra. + def self.setup_parallel_manager(options = {}) + ::Typhoeus::Hydra.new(options) + end + + dependency 'typhoeus' + + # Hook into Faraday and perform the request with Typhoeus. + # + # @param [ Hash ] env The environment. + # + # @return [ void ] + def call(env) + super + perform_request env + @app.call env + end + + private + + def perform_request(env) + if parallel?(env) + env[:parallel_manager].queue request(env) + else + request(env).run + end + end + + def request(env) + read_body env + + req = typhoeus_request(env) + + configure_ssl req, env + configure_proxy req, env + configure_timeout req, env + configure_socket req, env + + req.on_complete do |resp| + if resp.timed_out? + env[:typhoeus_timed_out] = true + unless parallel?(env) + raise Faraday::TimeoutError, "request timed out" + end + elsif (resp.response_code == 0) || ((resp.return_code != :ok) && !resp.mock?) + env[:typhoeus_connection_failed] = true + env[:typhoeus_return_message] = resp.return_message + unless parallel?(env) + raise Faraday::ConnectionFailed, resp.return_message + end + end + + save_response(env, resp.code, resp.body) do |response_headers| + response_headers.parse resp.response_headers + end + # in async mode, :response is initialized at this point + env[:response].finish(env) if parallel?(env) + end + + req + end + + def typhoeus_request(env) + opts = { + :method => env[:method], + :body => env[:body], + :headers => env[:request_headers] + }.merge(@adapter_options) + + ::Typhoeus::Request.new(env[:url].to_s, opts) + end + + def read_body(env) + env[:body] = env[:body].read if env[:body].respond_to? :read + end + + def configure_ssl(req, env) + ssl = env[:ssl] + + verify_p = (ssl && ssl.fetch(:verify, true)) + + ssl_verifyhost = verify_p ? 2 : 0 + req.options[:ssl_verifyhost] = ssl_verifyhost + req.options[:ssl_verifypeer] = verify_p + req.options[:sslversion] = ssl[:version] if ssl[:version] + req.options[:sslcert] = ssl[:client_cert] if ssl[:client_cert] + req.options[:sslkey] = ssl[:client_key] if ssl[:client_key] + req.options[:cainfo] = ssl[:ca_file] if ssl[:ca_file] + req.options[:capath] = ssl[:ca_path] if ssl[:ca_path] + client_cert_passwd_key = [:client_cert_passwd, :client_certificate_password].detect { |name| ssl.key?(name) } + req.options[:keypasswd] = ssl[client_cert_passwd_key] if client_cert_passwd_key + end + + def configure_proxy(req, env) + proxy = env[:request][:proxy] + return unless proxy + + req.options[:proxy] = "#{proxy[:uri].scheme}://#{proxy[:uri].host}:#{proxy[:uri].port}" + + if proxy[:user] && proxy[:password] + req.options[:proxyauth] = :any + req.options[:proxyuserpwd] = "#{proxy[:user]}:#{proxy[:password]}" + end + end + + def configure_timeout(req, env) + env_req = env[:request] + req.options[:timeout_ms] = (env_req[:timeout] * 1000).to_i if env_req[:timeout] + req.options[:connecttimeout_ms] = (env_req[:open_timeout] * 1000).to_i if env_req[:open_timeout] + end + + def configure_socket(req, env) + if bind = env[:request][:bind] + req.options[:interface] = bind[:host] + end + end + + def parallel?(env) + !!env[:parallel_manager] + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/cache/dalli.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/cache/dalli.rb new file mode 100644 index 000000000000..5a09b10abd2b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/cache/dalli.rb @@ -0,0 +1,28 @@ +module Typhoeus + module Cache + # This module provides a simple way to cache HTTP responses using Dalli. + class Dalli + # @example Set Dalli as the Typhoeus cache backend + # Typhoeus::Config.cache = Typhoeus::Cache::Dalli.new + # + # @param [ Dalli::Client ] client + # A connection to the cache server. Defaults to `Dalli::Client.new` + # @param [ Hash ] options + # Options + # @option options [ Integer ] :default_ttl + # The default TTL of cached responses in seconds, for requests which do not set a cache_ttl. + def initialize(client = ::Dalli::Client.new, options = {}) + @client = client + @default_ttl = options[:default_ttl] + end + + def get(request) + @client.get(request.cache_key) + end + + def set(request, response) + @client.set(request.cache_key, response, request.cache_ttl || @default_ttl) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/cache/rails.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/cache/rails.rb new file mode 100644 index 000000000000..10835e77de92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/cache/rails.rb @@ -0,0 +1,28 @@ +module Typhoeus + module Cache + # This module provides a simple way to cache HTTP responses in using the Rails cache. + class Rails + # @example Use the Rails cache setup to cache Typhoeus responses. + # Typhoeus::Config.cache = Typhoeus::Cache::Rails.new + # + # @param [ ActiveSupport::Cache::Store ] cache + # A Rails cache backend. Defaults to Rails.cache. + # @param [ Hash ] options + # Options + # @option options [ Integer ] :default_ttl + # The default TTL of cached responses in seconds, for requests which do not set a cache_ttl. + def initialize(cache = ::Rails.cache, options = {}) + @cache = cache + @default_ttl = options[:default_ttl] + end + + def get(request) + @cache.read(request) + end + + def set(request, response) + @cache.write(request.cache_key, response, :expires_in => request.cache_ttl || @default_ttl) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/cache/redis.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/cache/redis.rb new file mode 100644 index 000000000000..e54ca4ef48ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/cache/redis.rb @@ -0,0 +1,35 @@ +module Typhoeus + module Cache + # This module provides a simple way to cache HTTP responses in Redis. + class Redis + # @example Set Redis as the Typhoeus cache backend + # Typhoeus::Config.cache = Typhoeus::Cache::Redis.new + # + # @param [ Redis ] redis + # A connection to Redis. Defaults to `Redis.new`, which uses the + # `REDIS_URL` environment variable to connect + # @param [ Hash ] options + # Options + # @option options [ Integer ] :default_ttl + # The default TTL of cached responses in seconds, for requests which do not set a cache_ttl. + def initialize(redis = ::Redis.new, options = {}) + @redis = redis + @default_ttl = options[:default_ttl] + end + + def get(request) + serialized_response = @redis.get(request.cache_key) + return unless serialized_response + Marshal.load(serialized_response) + end + + def set(request, response) + ttl = request.cache_ttl || @default_ttl + key = request.cache_key + serialized_response = Marshal.dump(response) + @redis.set(key, serialized_response) + @redis.expire(key, ttl) if ttl + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/config.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/config.rb new file mode 100644 index 000000000000..f05491c59db2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/config.rb @@ -0,0 +1,69 @@ +module Typhoeus + + # The Typhoeus configuration used to set global + # options. + # @example Set the configuration options within a block. + # Typhoeus.configure do |config| + # config.verbose = true + # end + # + # @example Set the configuration directly. + # Typhoeus::Config.verbose = true + module Config + extend self + + # Defines whether the connection is blocked. + # Defaults to false. When set to true, only + # stubbed requests are allowed. A + # {Typhoeus::Errors::NoStub} error is raised, + # when trying to do a real request. It's possible + # to work around inside + # {Typhoeus.with_connection}. + # + # @return [ Boolean ] + # + # @see Typhoeus::Request::BlockConnection + # @see Typhoeus::Hydra::BlockConnection + # @see Typhoeus#with_connection + # @see Typhoeus::Errors::NoStub + attr_accessor :block_connection + + # Defines whether GET requests are memoized when using the {Typhoeus::Hydra}. + # + # @return [ Boolean ] + # + # @see Typhoeus::Hydra + # @see Typhoeus::Hydra::Memoizable + attr_accessor :memoize + + # Defines whether curls debug output is shown. + # Unfortunately it prints to stderr. + # + # @return [ Boolean ] + # + # @see http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTVERBOSE + attr_accessor :verbose + + # Defines whether requests are cached. + # + # @return [ Object ] + # + # @see Typhoeus::Hydra::Cacheable + # @see Typhoeus::Request::Cacheable + attr_accessor :cache + + # Defines whether to use a default user agent. + # + # @return [ String ] + # + # @see Typhoeus::Request#set_defaults + attr_accessor :user_agent + + # Defines wether to use a proxy server for every request. + # + # @return [ String ] + # + # @see Typhoeus::Request#set_defaults + attr_accessor :proxy + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/easy_factory.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/easy_factory.rb new file mode 100644 index 000000000000..84c713141157 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/easy_factory.rb @@ -0,0 +1,180 @@ +require 'set' + +module Typhoeus + + # This is a Factory for easies to be used in the hydra. + # Before an easy is ready to be added to a multi the + # on_complete callback to be set. + # This is done by this class. + # + # @api private + class EasyFactory + + RENAMED_OPTIONS = { + :auth_method => :httpauth, + :connect_timeout => :connecttimeout, + :encoding => :accept_encoding, + :follow_location => :followlocation, + :max_redirects => :maxredirs, + :proxy_type => :proxytype, + :ssl_cacert => :cainfo, + :ssl_capath => :capath, + :ssl_cert => :sslcert, + :ssl_cert_type => :sslcerttype, + :ssl_key => :sslkey, + :ssl_key_password => :keypasswd, + :ssl_key_type => :sslkeytype, + :ssl_version => :sslversion, + } + + CHANGED_OPTIONS = { + :disable_ssl_host_verification => :ssl_verifyhost, + :disable_ssl_peer_verification => :ssl_verifypeer, + :proxy_auth_method => :proxyauth, + } + + REMOVED_OPTIONS = Set.new([:cache_key_basis, :cache_timeout, :user_agent]) + + SANITIZE_IGNORE = Set.new([:method, :cache_ttl, :cache]) + SANITIZE_TIMEOUT = Set.new([:timeout_ms, :connecttimeout_ms]) + + # Returns the request provided. + # + # @return [ Typhoeus::Request ] + attr_reader :request + + # Returns the hydra provided. + # + # @return [ Typhoeus::Hydra ] + attr_reader :hydra + + # Create an easy factory. + # + # @example Create easy factory. + # Typhoeus::Hydra::EasyFactory.new(request, hydra) + # + # @param [ Request ] request The request to build an easy for. + # @param [ Hydra ] hydra The hydra to build an easy for. + def initialize(request, hydra = nil) + @request = request + @hydra = hydra + end + + # Return the easy in question. + # + # @example Return easy. + # easy_factory.easy + # + # @return [ Ethon::Easy ] The easy. + def easy + @easy ||= Typhoeus::Pool.get + end + + # Fabricated easy. + # + # @example Prepared easy. + # easy_factory.get + # + # @return [ Ethon::Easy ] The easy. + def get + begin + easy.http_request( + request.base_url.to_s, + request.options.fetch(:method, :get), + sanitize(request.options) + ) + rescue Ethon::Errors::InvalidOption => e + help = provide_help(e.message.match(/:\s(\w+)/)[1]) + raise $!, "#{$!}#{help}", $!.backtrace + end + set_callback + easy + end + + private + + def sanitize(options) + # set nosignal to true by default + # this improves thread safety and timeout behavior + sanitized = {:nosignal => true} + options.each do |k,v| + s = k.to_sym + next if SANITIZE_IGNORE.include?(s) + if new_option = RENAMED_OPTIONS[k.to_sym] + warn("Deprecated option #{k}. Please use #{new_option} instead.") + sanitized[new_option] = v + # sanitize timeouts + elsif SANITIZE_TIMEOUT.include?(s) + if !v.integer? + warn("Value '#{v}' for option '#{k}' must be integer.") + end + sanitized[k] = v.ceil + else + sanitized[k] = v + end + end + + sanitize_timeout!(sanitized, :timeout) + sanitize_timeout!(sanitized, :connecttimeout) + + sanitized + end + + def sanitize_timeout!(options, timeout) + timeout_ms = :"#{timeout}_ms" + if options[timeout] && options[timeout].round != options[timeout] + if !options[timeout_ms] + options[timeout_ms] = (options[timeout]*1000).ceil + end + options[timeout] = options[timeout].ceil + end + options + end + + # Sets on_complete callback on easy in order to be able to + # track progress. + # + # @example Set callback. + # easy_factory.set_callback + # + # @return [ Ethon::Easy ] The easy. + def set_callback + if request.streaming? + response = nil + easy.on_headers do |easy| + response = Response.new(Ethon::Easy::Mirror.from_easy(easy).options) + request.execute_headers_callbacks(response) + end + request.on_body.each do |callback| + easy.on_body do |chunk, easy| + callback.call(chunk, response) + end + end + else + easy.on_headers do |easy| + request.execute_headers_callbacks(Response.new(Ethon::Easy::Mirror.from_easy(easy).options)) + end + end + request.on_progress.each do |callback| + easy.on_progress do |dltotal, dlnow, ultotal, ulnow, easy| + callback.call(dltotal, dlnow, ultotal, ulnow, response) + end + end + easy.on_complete do |easy| + request.finish(Response.new(easy.mirror.options)) + Typhoeus::Pool.release(easy) + if hydra && !hydra.queued_requests.empty? + hydra.dequeue_many + end + end + end + + def provide_help(option) + if new_option = CHANGED_OPTIONS[option.to_sym] + "\nPlease try #{new_option} instead of #{option}." if new_option + elsif REMOVED_OPTIONS.include?(option.to_sym) + "\nThe option #{option} was removed." + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/errors.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/errors.rb new file mode 100644 index 000000000000..5ad2c5d3d84a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/errors.rb @@ -0,0 +1,9 @@ +require 'typhoeus/errors/typhoeus_error' +require 'typhoeus/errors/no_stub' + +module Typhoeus + + # This namespace contains all errors raised by Typhoeus. + module Errors + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/errors/no_stub.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/errors/no_stub.rb new file mode 100644 index 000000000000..d04534ceeace --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/errors/no_stub.rb @@ -0,0 +1,12 @@ +module Typhoeus + module Errors + + # Raises when block connection is turned on + # and making a real request. + class NoStub < TyphoeusError + def initialize(request) + super("The connection is blocked and no stub defined: #{request.url}") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/errors/typhoeus_error.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/errors/typhoeus_error.rb new file mode 100644 index 000000000000..1550b4088613 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/errors/typhoeus_error.rb @@ -0,0 +1,8 @@ +module Typhoeus + module Errors + + # Default typhoeus error class for all custom errors. + class TyphoeusError < StandardError + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/expectation.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/expectation.rb new file mode 100644 index 000000000000..a8ae368595d0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/expectation.rb @@ -0,0 +1,217 @@ +module Typhoeus + + # This class represents an expectation. It is part + # of the stubbing mechanism. An expectation contains + # a url and options, like a request. They are compared + # to the request url and options in order to evaluate + # whether they match. If that's the case, the attached + # responses are returned one by one. + # + # @example Stub a request and get specified response. + # expected = Typhoeus::Response.new + # Typhoeus.stub("www.example.com").and_return(expected) + # + # actual = Typhoeus.get("www.example.com") + # expected == actual + # #=> true + # + # @example Stub a request and get a lazily-constructed response containing data from actual widgets that exist in the system when the stubbed request is made. + # Typhoeus.stub("www.example.com/widgets") do + # actual_widgets = Widget.all + # Typhoeus::Response.new( + # :body => actual_widgets.inject([]) do |ids, widget| + # ids << widget.id + # end.join(",") + # ) + # end + # + # @example Stub a request and get a lazily-constructed response in the format requested. + # Typhoeus.stub("www.example.com") do |request| + # accept = (request.options[:headers]||{})['Accept'] || "application/json" + # format = accept.split(",").first + # body_obj = { 'things' => [ { 'id' => 'foo' } ] } + # + # Typhoeus::Response.new( + # :headers => { + # 'Content-Type' => format + # }, + # :body => SERIALIZERS[format].serialize(body_obj) + # ) + # end + class Expectation + + # @api private + attr_reader :base_url + + # @api private + attr_reader :options + + # @api private + attr_reader :from + + class << self + + # Returns all expectations. + # + # @example Return expectations. + # Typhoeus::Expectation.all + # + # @return [ Array<Typhoeus::Expectation> ] The expectations. + def all + @expectations ||= [] + end + + # Clears expectations. This is handy while + # testing, and you want to make sure that + # you don't get canned responses. + # + # @example Clear expectations. + # Typhoeus::Expectation.clear + def clear + all.clear + end + + # Returns stubbed response matching the + # provided request. + # + # @example Find response + # Typhoeus::Expectation.response_for(request) + # + # @return [ Typhoeus::Response ] The stubbed response from a + # matching expectation, or nil if no matching expectation + # is found. + # + # @api private + def response_for(request) + expectation = find_by(request) + return nil if expectation.nil? + + expectation.response(request) + end + + # @api private + def find_by(request) + all.find do |expectation| + expectation.matches?(request) + end + end + end + + # Creates an expectation. + # + # @example Create expectation. + # Typhoeus::Expectation.new(base_url) + # + # @return [ Expectation ] The created expectation. + # + # @api private + def initialize(base_url, options = {}) + @base_url = base_url + @options = options + @response_counter = 0 + @from = nil + end + + # Set from value to mark an expectaion. Useful for + # other libraries, e.g. WebMock. + # + # @example Mark expectation. + # expectation.from(:webmock) + # + # @param [ String ] value Value to set. + # + # @return [ Expectation ] Returns self. + # + # @api private + def stubbed_from(value) + @from = value + self + end + + # Specify what should be returned, + # when this expectation is hit. + # + # @example Add response. + # expectation.and_return(response) + # + # @return [ void ] + def and_return(response=nil, &block) + new_response = (response.nil? ? block : response) + responses.push(*new_response) + end + + # Checks whether this expectation matches + # the provided request. + # + # @example Check if request matches. + # expectation.matches? request + # + # @param [ Request ] request The request to check. + # + # @return [ Boolean ] True when matches, else false. + # + # @api private + def matches?(request) + url_match?(request.base_url) && options_match?(request) + end + + # Return canned responses. + # + # @example Return responses. + # expectation.responses + # + # @return [ Array<Typhoeus::Response> ] The responses. + # + # @api private + def responses + @responses ||= [] + end + + # Return the response. When there are + # multiple responses, they are returned one + # by one. + # + # @example Return response. + # expectation.response + # + # @return [ Response ] The response. + # + # @api private + def response(request) + response = responses.fetch(@response_counter, responses.last) + if response.respond_to?(:call) + response = response.call(request) + end + @response_counter += 1 + response.mock = @from || true + response + end + + private + + # Check whether the options matches the request options. + # I checks options and original options. + def options_match?(request) + (options ? options.all?{ |k,v| request.original_options[k] == v || request.options[k] == v } : true) + end + + # Check whether the base_url matches the request url. + # The base_url can be a string, regex or nil. String and + # regexp are checked, nil is always true, else false. + # + # Nil serves as a placeholder in case you want to match + # all urls. + def url_match?(request_url) + case base_url + when String + base_url == request_url + when Regexp + base_url === request_url + when nil + true + else + false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra.rb new file mode 100644 index 000000000000..07969812573d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra.rb @@ -0,0 +1,95 @@ +require 'typhoeus/hydra/addable' +require 'typhoeus/hydra/before' +require 'typhoeus/hydra/cacheable' +require 'typhoeus/hydra/block_connection' +require 'typhoeus/hydra/memoizable' +require 'typhoeus/hydra/queueable' +require 'typhoeus/hydra/runnable' +require 'typhoeus/hydra/stubbable' + +module Typhoeus + + # Hydra manages making parallel HTTP requests. This + # is achieved by using libcurls multi interface: + # http://curl.haxx.se/libcurl/c/libcurl-multi.html + # The benefits are that you don't have to worry running + # the requests by yourself. + # + # Hydra will also handle how many requests you can + # make in parallel. Things will get flakey if you + # try to make too many requests at the same time. + # The built in limit is 200. When more requests than + # that are queued up, hydra will save them for later + # and start the requests as others are finished. You + # can raise or lower the concurrency limit through + # the Hydra constructor. + # + # Regarding the asynchronous behavior of the hydra, + # it is important to know that this is completely hidden + # from the developer and you are free to apply + # whatever technique you want to your code. That should not + # conflict with libcurls internal concurrency mechanism. + # + # @example Use the hydra to do multiple requests. + # hydra = Typhoeus::Hydra.new + # requests = (0..9).map{ Typhoeus::Request.new("www.example.com") } + # requests.each{ |request| hydra.queue(request) } + # hydra.run + # + # @note Callbacks are going to delay the request + # execution. + class Hydra + include Hydra::Addable + include Hydra::Runnable + include Hydra::Memoizable + include Hydra::Cacheable + include Hydra::BlockConnection + include Hydra::Stubbable + include Hydra::Before + include Hydra::Queueable + + # @example Set max_concurrency. + # Typhoeus::Hydra.new(max_concurrency: 20) + attr_accessor :max_concurrency + + # @api private + attr_reader :multi + + class << self + + # Returns a memoized hydra instance. + # + # @example Get a hydra. + # Typhoeus::Hydra.hydra + # + # @return [Typhoeus::Hydra] A new hydra. + def hydra + Thread.current[:typhoeus_hydra] ||= new + end + end + + # Create a new hydra. All + # {http://rubydoc.info/github/typhoeus/ethon/Ethon/Multi#initialize-instance_method Ethon::Multi#initialize} + # options are also available. + # + # @example Create a hydra. + # Typhoeus::Hydra.new + # + # @example Create a hydra with max_concurrency. + # Typhoeus::Hydra.new(max_concurrency: 20) + # + # @param [ Hash ] options The options hash. + # + # @option options :max_concurrency [ Integer ] Number + # of max concurrent connections to create. Default is + # 200. + # + # @see http://rubydoc.info/github/typhoeus/ethon/Ethon/Multi#initialize-instance_method + # Ethon::Multi#initialize + def initialize(options = {}) + @options = options + @max_concurrency = Integer(@options.fetch(:max_concurrency, 200)) + @multi = Ethon::Multi.new(options.reject{|k,_| k==:max_concurrency}) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/addable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/addable.rb new file mode 100644 index 000000000000..1a86960d57cf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/addable.rb @@ -0,0 +1,23 @@ +module Typhoeus + class Hydra + + # This module handles the request adding on + # hydra. + # + # @api private + module Addable + + # Adds request to multi. + # + # @example Add request. + # hydra.add(request) + # + # @param [ Typhoeus::Request ] request to add. + # + # @return [ void ] + def add(request) + multi.add(EasyFactory.new(request, self).get) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/before.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/before.rb new file mode 100644 index 000000000000..75e92138a71f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/before.rb @@ -0,0 +1,31 @@ +module Typhoeus + class Hydra + + # This module provides a way to hook into before + # a request gets queued in hydra. This is very powerful + # and you should be careful because when you accidently + # return a falsy value the request won't be executed. + # + # @api private + module Before + + # Overrride add in order to execute callbacks in + # Typhoeus.before. Will break and return when a + # callback returns nil, false or a response. Calls super + # otherwise. + # + # @example Add the request. + # hydra.add(request) + def add(request) + Typhoeus.before.each do |callback| + value = callback.call(request) + if value.nil? || value == false || value.is_a?(Response) + dequeue + return value + end + end + super + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/block_connection.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/block_connection.rb new file mode 100644 index 000000000000..9f3bd2f217f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/block_connection.rb @@ -0,0 +1,35 @@ +module Typhoeus + class Hydra + + # This module handles the blocked connection request mode on + # the hydra side, where only stubbed requests + # are allowed. + # Connection blocking needs to be turned on: + # Typhoeus.configure do |config| + # config.block_connection = true + # end + # + # When trying to do real requests a NoStub error + # is raised. + # + # @api private + module BlockConnection + + # Overrides add in order to check before if block connection + # is turned on. If thats the case a NoStub error is + # raised. + # + # @example Add the request. + # hydra.add(request) + # + # @param [ Request ] request The request to enqueue. + def add(request) + if request.blocked? + raise Typhoeus::Errors::NoStub.new(request) + else + super + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/cacheable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/cacheable.rb new file mode 100644 index 000000000000..74c7f3045bd7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/cacheable.rb @@ -0,0 +1,15 @@ +module Typhoeus + class Hydra + module Cacheable + def add(request) + if request.cacheable? && response = request.cached_response + response.cached = true + request.finish(response) + dequeue + else + super + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/memoizable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/memoizable.rb new file mode 100644 index 000000000000..0402a868c935 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/memoizable.rb @@ -0,0 +1,56 @@ +module Typhoeus + class Hydra + + # This module handles the GET request memoization + # on the hydra side. Memoization needs to be turned + # on: + # Typhoeus.configure do |config| + # config.memoize = true + # end + # + # @api private + module Memoizable + + # Return the memory. + # + # @example Return the memory. + # hydra.memory + # + # @return [ Hash ] The memory. + def memory + @memory ||= {} + end + + # Overrides add in order to check before if request + # is memoizable and already in memory. If thats the case, + # super is not called, instead the response is set and + # the on_complete callback called. + # + # @example Add the request. + # hydra.add(request) + # + # @param [ Request ] request The request to add. + # + # @return [ Request ] The added request. + def add(request) + if request.memoizable? && memory.has_key?(request) + response = memory[request] + request.finish(response, true) + dequeue + else + super + end + end + + # Overrides run to make sure the memory is cleared after + # each run. + # + # @example Run hydra. + # hydra.run + def run + super + memory.clear + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/queueable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/queueable.rb new file mode 100644 index 000000000000..b53dc6778af4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/queueable.rb @@ -0,0 +1,83 @@ +module Typhoeus + class Hydra + + # This module handles the request queueing on + # hydra. + # + # @api private + module Queueable + + # Return the queued requests. + # + # @example Return queued requests. + # hydra.queued_requests + # + # @return [ Array<Typhoeus::Request> ] The queued requests. + def queued_requests + @queued_requests ||= [] + end + + # Abort the current hydra run as good as + # possible. This means that it only + # clears the queued requests and can't do + # anything about already running requests. + # + # @example Abort hydra. + # hydra.abort + def abort + queued_requests.clear + end + + # Enqueues a request in order to be performed + # by the hydra. This can even be done while + # the hydra is running. Also sets hydra on + # request. + # + # @example Queue request. + # hydra.queue(request) + def queue(request) + request.hydra = self + queued_requests << request + end + + # Pushes a request to the front of the queue, + # to be performed by the hydra. Also sets hydra + # on request + # + # @example Queue reques. + # hydra.queue_front(request) + def queue_front(request) + request.hydra = self + queued_requests.unshift request + end + + # Removes a request from queued_requests and + # adds it to the hydra in order to be + # performed next. + # + # @example Dequeue request. + # hydra.dequeue + # + # @since 0.6.4 + def dequeue + add(queued_requests.shift) unless queued_requests.empty? + end + + # Removes requests from queued_requests and + # adds them to the hydra until max_concurrency + # is reached. + # + # @example Dequeue requests. + # hydra.dequeue_many + # + # @since 0.6.8 + def dequeue_many + number = multi.easy_handles.count + until number == max_concurrency || queued_requests.empty? + add(queued_requests.shift) + number += 1 + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/runnable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/runnable.rb new file mode 100644 index 000000000000..9c2ad5193558 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/runnable.rb @@ -0,0 +1,19 @@ +module Typhoeus + class Hydra + + # This module contains logic to run a hydra. + module Runnable + + # Start the hydra run. + # + # @example Start hydra run. + # hydra.run + # + # @return [ Symbol ] Return value from multi.perform. + def run + dequeue_many + multi.perform + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/stubbable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/stubbable.rb new file mode 100644 index 000000000000..930997c94d6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/hydra/stubbable.rb @@ -0,0 +1,28 @@ +module Typhoeus + class Hydra + + # This module handles stubbing on the hydra side. + # It plays well with the block_connection configuration, + # which raises when you make a request which is not stubbed. + # + # @api private + module Stubbable + + # Override add in order to check for matching expecations. + # When an expecation is found, super is not called. Instead a + # canned response is assigned to the request. + # + # @example Add the request. + # hydra.add(request) + def add(request) + if response = Expectation.response_for(request) + request.execute_headers_callbacks(response) + request.on_body.each{ |callback| callback.call(response.body, response) } + request.finish(response) + else + super + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/pool.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/pool.rb new file mode 100644 index 000000000000..552a73f2b430 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/pool.rb @@ -0,0 +1,70 @@ +require 'thread' + +module Typhoeus + + # The easy pool stores already initialized + # easy handles for future use. This is useful + # because creating them is expensive. + # + # @api private + module Pool + @mutex = Mutex.new + @pid = Process.pid + + # Releases easy into the pool. The easy handle is + # reset before it gets back in. + # + # @example Release easy. + # Typhoeus::Pool.release(easy) + def self.release(easy) + easy.cookielist = "flush" # dump all known cookies to 'cookiejar' + easy.cookielist = "all" # remove all cookies from memory for this handle + easy.reset + @mutex.synchronize { easies << easy } + end + + # Return an easy from the pool. + # + # @example Return easy. + # Typhoeus::Pool.get + # + # @return [ Ethon::Easy ] The easy. + def self.get + @mutex.synchronize do + if @pid == Process.pid + easies.pop + else + # Process has forked. Clear all easies to avoid sockets being + # shared between processes. + @pid = Process.pid + easies.clear + nil + end + end || Ethon::Easy.new + end + + # Clear the pool + def self.clear + @mutex.synchronize { easies.clear } + end + + # Use yielded easy, will be released automatically afterwards. + # + # @example Use easy. + # Typhoeus::Pool.with_easy do |easy| + # # use easy + # end + def self.with_easy(&block) + easy = get + yield easy + ensure + release(easy) if easy + end + + private + + def self.easies + @easies ||= [] + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/railtie.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/railtie.rb new file mode 100644 index 000000000000..ee95f2a23250 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/railtie.rb @@ -0,0 +1,12 @@ +require "typhoeus" + +module Rails + module Typhoeus + class Railtie < Rails::Railtie + # Need to include the Typhoeus middleware. + initializer "include the identity map" do |app| + app.config.middleware.use "Rack::Typhoeus::Middleware::ParamsDecoder" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request.rb new file mode 100644 index 000000000000..c41ee7b8d94d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request.rb @@ -0,0 +1,221 @@ +require 'zlib' +require 'digest/sha1' +require 'typhoeus/request/actions' +require 'typhoeus/request/before' +require 'typhoeus/request/block_connection' +require 'typhoeus/request/cacheable' +require 'typhoeus/request/callbacks' +require 'typhoeus/request/marshal' +require 'typhoeus/request/memoizable' +require 'typhoeus/request/operations' +require 'typhoeus/request/responseable' +require 'typhoeus/request/streamable' +require 'typhoeus/request/stubbable' + +module Typhoeus + + # This class represents a request. + # + # @example (see #initialize) + # + # @example Make a request with the shortcut. + # response = Typhoeus.get("www.example.com") + # + # @see (see #initialize) + class Request + extend Request::Actions + include Request::Callbacks::Types + include Request::Callbacks + include Request::Streamable + include Request::Marshal + include Request::Operations + include Request::Responseable + include Request::Memoizable + include Request::Cacheable + include Request::BlockConnection + include Request::Stubbable + include Request::Before + + # Returns the provided base url. + # + # @return [ String ] + attr_accessor :base_url + + # Returns options, which includes default parameters. + # + # @return [ Hash ] + attr_accessor :options + + # Returns the hydra in which the request ran, if any. + # + # @return [ Typhoeus::Hydra ] + # + # @api private + attr_accessor :hydra + + # Returns the original options provided. + # + # @return [ Hash ] + # + # @api private + attr_accessor :original_options + + # @return [ Boolean ] + # + # @api private + attr_accessor :block_connection + + # Creates a new request. + # + # @example Simplest request. + # response = Typhoeus::Request.new("www.example.com").run + # + # @example Request with url parameters. + # response = Typhoeus::Request.new( + # "www.example.com", + # params: {a: 1} + # ).run + # + # @example Request with a body. + # response = Typhoeus::Request.new( + # "www.example.com", + # body: {b: 2} + # ).run + # + # @example Request with parameters and body. + # response = Typhoeus::Request.new( + # "www.example.com", + # params: {a: 1}, + # body: {b: 2} + # ).run + # + # @example Create a request and allow follow redirections. + # response = Typhoeus::Request.new( + # "www.example.com", + # followlocation: true + # ).run + # + # @param [ String ] base_url The url to request. + # @param [ options ] options The options. + # + # @option options [ Hash ] :params Translated + # into url parameters. + # @option options [ Hash ] :body Translated + # into HTTP POST request body. + # + # @return [ Typhoeus::Request ] The request. + # + # @note See {http://rubydoc.info/github/typhoeus/ethon/Ethon/Easy/Options Ethon::Easy::Options} for more options. + # + # @see Typhoeus::Hydra + # @see Typhoeus::Response + # @see Typhoeus::Request::Actions + def initialize(base_url, options = {}) + @base_url = base_url + @original_options = options + @options = options.dup + + set_defaults + end + + # Return the url. + # In contrast to base_url which returns the value you specified, url returns + # the full url including the parameters. + # + # @example Get the url. + # request.url + # + # @since 0.5.5 + def url + easy = EasyFactory.new(self).get + url = easy.url + Typhoeus::Pool.release(easy) + url + end + + # Returns whether other is equal to self. + # + # @example Are request equal? + # request.eql?(other_request) + # + # @param [ Object ] other The object to check. + # + # @return [ Boolean ] Returns true if equal, else false. + # + # @api private + def eql?(other) + self.class == other.class && + self.base_url == other.base_url && + fuzzy_hash_eql?(self.options, other.options) + end + + # Overrides Object#hash. + # + # @return [ Integer ] The integer representing the request. + # + # @api private + def hash + Zlib.crc32 cache_key + end + + # Returns a cache key for use with caching methods that required a string + # for a key. Will get used by ActiveSupport::Cache stores automatically. + # + # @return [ String ] The cache key. + def cache_key + Digest::SHA1.hexdigest "#{self.class.name}#{base_url}#{hashable_string_for(options)}" + end + + # Mimics libcurls POST body generation. This is not accurate, but good + # enough for VCR. + # + # @return [ String ] The encoded body. + # otherwise. + # + # @api private + def encoded_body + Ethon::Easy::Form.new(nil, options[:body]).to_s + end + + private + + # Checks if two hashes are equal or not, discarding + # first-level hash order. + # + # @param [ Hash ] left + # @param [ Hash ] right hash to check for equality + # + # @return [ Boolean ] Returns true if hashes have + # same values for same keys and same length, + # even if the keys are given in a different order. + def fuzzy_hash_eql?(left, right) + return true if (left == right) + + (left.count == right.count) && left.inject(true) do |res, kvp| + res && (kvp[1] == right[kvp[0]]) + end + end + + def hashable_string_for(obj) + case obj + when Hash + hashable_string_for(obj.sort_by {|sub_obj| sub_obj.first.to_s}) + when Array + obj.map {|sub_obj| hashable_string_for(sub_obj)}.to_s + else + obj.to_s + end + end + + # Sets default header and verbose when turned on. + def set_defaults + default_user_agent = Config.user_agent || Typhoeus::USER_AGENT + + options[:headers] = {'User-Agent' => default_user_agent}.merge(options[:headers] || {}) + options[:headers]['Expect'] ||= '' + options[:verbose] = Typhoeus::Config.verbose if options[:verbose].nil? && !Typhoeus::Config.verbose.nil? + options[:maxredirs] ||= 50 + options[:proxy] = Typhoeus::Config.proxy unless options.has_key?(:proxy) || Typhoeus::Config.proxy.nil? + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/actions.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/actions.rb new file mode 100644 index 000000000000..b7974d8aeb80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/actions.rb @@ -0,0 +1,125 @@ +module Typhoeus + class Request + + # Module containing logic about shortcuts to + # http methods. Like + # Typhoeus.get("www.example.com") + module Actions + + # Make a get request. + # + # @example Make get request. + # Typhoeus.get("www.example.com") + # + # @param (see Typhoeus::Request#initialize) + # + # @option (see Typhoeus::Request#initialize) + # + # @return (see Typhoeus::Response#initialize) + # + # @note (see Typhoeus::Request#initialize) + def get(base_url, options = {}) + Request.new(base_url, options.merge(:method => :get)).run + end + + # Make a post request. + # + # @example Make post request. + # Typhoeus.post("www.example.com") + # + # @param (see Typhoeus::Request#initialize) + # + # @option (see Typhoeus::Request#initialize) + # + # @return (see Typhoeus::Response#initialize) + # + # @note (see Typhoeus::Request#initialize) + def post(base_url, options = {}) + Request.new(base_url, options.merge(:method => :post)).run + end + + # Make a put request. + # + # @example Make put request. + # Typhoeus.put("www.example.com") + # + # @param (see Typhoeus::Request#initialize) + # + # @option options :params [ Hash ] Params hash which + # is attached to the base_url. + # @option options :body [ Hash ] Body hash which + # becomes a PUT request body. + # + # @return (see Typhoeus::Response#initialize) + # + # @note (see Typhoeus::Request#initialize) + def put(base_url, options = {}) + Request.new(base_url, options.merge(:method => :put)).run + end + + # Make a delete request. + # + # @example Make delete request. + # Typhoeus.delete("www.example.com") + # + # @param (see Typhoeus::Request#initialize) + # + # @option (see Typhoeus::Request#initialize) + # + # @return (see Typhoeus::Response#initialize) + # + # @note (see Typhoeus::Request#initialize) + def delete(base_url, options = {}) + Request.new(base_url, options.merge(:method => :delete)).run + end + + # Make a head request. + # + # @example Make head request. + # Typhoeus.head("www.example.com") + # + # @param (see Typhoeus::Request#initialize) + # + # @option (see Typhoeus::Request#initialize) + # + # @return (see Typhoeus::Response#initialize) + # + # @note (see Typhoeus::Request#initialize) + def head(base_url, options = {}) + Request.new(base_url, options.merge(:method => :head)).run + end + + # Make a patch request. + # + # @example Make patch request. + # Typhoeus.patch("www.example.com") + # + # @param (see Typhoeus::Request#initialize) + # + # @option (see Typhoeus::Request#initialize) + # + # @return (see Typhoeus::Response#initialize) + # + # @note (see Typhoeus::Request#initialize) + def patch(base_url, options = {}) + Request.new(base_url, options.merge(:method => :patch)).run + end + + # Make a options request. + # + # @example Make options request. + # Typhoeus.options("www.example.com") + # + # @param (see Typhoeus::Request#initialize) + # + # @option (see Typhoeus::Request#initialize) + # + # @return (see Typhoeus::Response#initialize) + # + # @note (see Typhoeus::Request#initialize) + def options(base_url, options = {}) + Request.new(base_url, options.merge(:method => :options)).run + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/before.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/before.rb new file mode 100644 index 000000000000..d6ad7653e7d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/before.rb @@ -0,0 +1,30 @@ +module Typhoeus + class Request + + # This module provides a way to hook into before + # a request runs. This is very powerful + # and you should be careful because when you accidently + # return a falsy value the request won't be executed. + # + # @api private + module Before + + # Overrride run in order to execute callbacks in + # Typhoeus.before. Will break and return when a + # callback returns nil or false. Calls super + # otherwise. + # + # @example Run the request. + # request.run + def run + Typhoeus.before.each do |callback| + value = callback.call(self) + if value.nil? || value == false || value.is_a?(Response) + return response + end + end + super + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/block_connection.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/block_connection.rb new file mode 100644 index 000000000000..7fc966ba67ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/block_connection.rb @@ -0,0 +1,52 @@ +module Typhoeus + class Request + + # This module handles the blocked connection request mode on + # the request side, where only stubbed requests + # are allowed. + # Connection blocking needs to be turned on: + # Typhoeus.configure do |config| + # config.block_connection = true + # end + # + # When trying to do real requests a NoStub error + # is raised. + # + # @api private + module BlockConnection + + # Overrides run in order to check before if block connection + # is turned on. If thats the case a NoStub error is + # raised. + # + # @example Run request. + # request.run + # + # @raise [Typhoeus::Errors::NoStub] If connection is blocked + # and no stub defined. + def run + if blocked? + raise Typhoeus::Errors::NoStub.new(self) + else + super + end + end + + # Returns wether a request is blocked or not. Takes + # request.block_connection and Typhoeus::Config.block_connection + # into consideration. + # + # @example Blocked? + # request.blocked? + # + # @return [ Boolean ] True if blocked, false else. + def blocked? + if block_connection.nil? + Typhoeus::Config.block_connection + else + block_connection + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/cacheable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/cacheable.rb new file mode 100644 index 000000000000..74a41a9e8dcd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/cacheable.rb @@ -0,0 +1,38 @@ +module Typhoeus + class Request + module Cacheable + def response=(response) + cache.set(self, response) if cacheable? && !response.cached? + super + end + + def cacheable? + cache + end + + def run + if response = cached_response + response.cached = true + finish(response) + else + super + end + end + + def cached_response + cacheable? && cache.get(self) + end + + def cache_ttl + options[:cache_ttl] + end + + private + + def cache + return nil if options[:cache] === false + options[:cache] || Typhoeus::Config.cache + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/callbacks.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/callbacks.rb new file mode 100644 index 000000000000..cc2cc1ead42e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/callbacks.rb @@ -0,0 +1,151 @@ +module Typhoeus + class Request + + # This module contains the logic for the response callbacks. + # + # You can set multiple callbacks, which are then executed + # in the same order. + # + # request.on_complete { |response| p 1 } + # request.on_complete { |response| p 2 } + # request.execute_callbacks + # #=> 1 + # #=> 2 + # + # You can clear the callbacks: + # + # request.on_complete { |response| p 1 } + # request.on_complete { |response| p 2 } + # request.on_complete.clear + # request.execute_callbacks + # #=> nil + # + # @note If you're using the Hydra to execute multiple + # requests, then callbacks are delaying the + # request execution. + module Callbacks + + module Types # :nodoc: + # Set on_complete callback. + # + # @example Set on_complete. + # request.on_complete { |response| p "yay" } + # + # @param [ Block ] block The block to execute. + # + # @yield [ Typhoeus::Response ] + # + # @return [ Array<Block> ] All on_complete blocks. + def on_complete(&block) + @on_complete ||= [] + @on_complete << block if block_given? + @on_complete + end + + # Set on_success callback. + # + # @example Set on_success. + # request.on_success { |response| p "yay" } + # + # @param [ Block ] block The block to execute. + # + # @yield [ Typhoeus::Response ] + # + # @return [ Array<Block> ] All on_success blocks. + def on_success(&block) + @on_success ||= [] + @on_success << block if block_given? + @on_success + end + + # Set on_failure callback. + # + # @example Set on_failure. + # request.on_failure { |response| p "yay" } + # + # @param [ Block ] block The block to execute. + # + # @yield [ Typhoeus::Response ] + # + # @return [ Array<Block> ] All on_failure blocks. + def on_failure(&block) + @on_failure ||= [] + @on_failure << block if block_given? + @on_failure + end + + # Set on_headers callback. + # + # @example Set on_headers. + # request.on_headers { |response| p "yay" } + # + # @param [ Block ] block The block to execute. + # + # @yield [ Typhoeus::Response ] + # + # @return [ Array<Block> ] All on_headers blocks. + def on_headers(&block) + @on_headers ||= [] + @on_headers << block if block_given? + @on_headers + end + + # Set on_progress callback. + # + # @example Set on_progress. + # request.on_progress do |dltotal, dlnow, ultotal, ulnow| + # puts "dltotal (#{dltotal}), dlnow (#{dlnow}), ultotal (#{ultotal}), ulnow (#{ulnow})" + # end + # + # @param [ Block ] block The block to execute. + # + # @yield [ Typhoeus::Response ] + # + # @return [ Array<Block> ] All on_progress blocks. + def on_progress(&block) + @on_progress ||= [] + @on_progress << block if block_given? + @on_progress + end + end + + # Execute the headers callbacks and yields response. + # + # @example Execute callbacks. + # request.execute_headers_callbacks + # + # @return [ Array<Object> ] The results of the on_headers callbacks. + # + # @api private + def execute_headers_callbacks(response) + (Typhoeus.on_headers + on_headers).map do |callback| + callback.call(response) + end + end + + # Execute necessary callback and yields response. This + # include in every case on_complete and on_progress, on_success + # if successful and on_failure if not. + # + # @example Execute callbacks. + # request.execute_callbacks + # + # @return [ void ] + # + # @api private + def execute_callbacks + callbacks = Typhoeus.on_complete + Typhoeus.on_progress + on_complete + on_progress + + if response && response.success? + callbacks += Typhoeus.on_success + on_success + elsif response + callbacks += Typhoeus.on_failure + on_failure + end + + callbacks.each do |callback| + self.response.handled_response = callback.call(self.response) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/marshal.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/marshal.rb new file mode 100644 index 000000000000..3c8387cec2ed --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/marshal.rb @@ -0,0 +1,22 @@ +module Typhoeus + class Request + + # This module contains custom serializer. + module Marshal + + # Return the important data needed to serialize this Request, except the + # request callbacks and `hydra`, since they cannot be marshalled. + def marshal_dump + unmarshallable = %w(@on_complete @on_success @on_failure @on_progress @on_headers @on_body @hydra) + (instance_variables - unmarshallable - unmarshallable.map(&:to_sym)).map do |name| + [name, instance_variable_get(name)] + end + end + + # Load. + def marshal_load(attributes) + attributes.each { |name, value| instance_variable_set(name, value) } + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/memoizable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/memoizable.rb new file mode 100644 index 000000000000..c09ab1061afd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/memoizable.rb @@ -0,0 +1,38 @@ +module Typhoeus + class Request + + # This module handles the GET request memoization + # on the request side. Memoization needs to be turned + # on: + # Typhoeus.configure do |config| + # config.memoize = true + # end + # + # @api private + module Memoizable + + # Override response setter and memoizes response + # if the request is memoizable. + # + # @param [ Response ] response The response to set. + # + # @example Set response. + # request.response = response + def response=(response) + hydra.memory[self] = response if memoizable? + super + end + + # Return whether a request is memoizable. + # + # @example Is request memoizable? + # request.memoizable? + # + # @return [ Boolean ] Return true if memoizable, false else. + def memoizable? + Typhoeus::Config.memoize && + (options[:method].nil? || options[:method] == :get) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/operations.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/operations.rb new file mode 100644 index 000000000000..a461aa4a68af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/operations.rb @@ -0,0 +1,40 @@ +module Typhoeus + class Request + + # This module contains everything what is necessary + # to make a single request. + module Operations + + # Run a request. + # + # @example Run a request. + # Typhoeus::Request.new("www.example.com").run + # + # @return [ Response ] The response. + def run + easy = EasyFactory.new(self).get + easy.perform + response + end + + # Sets a response, the request on the response + # and executes the callbacks. + # + # @param [Typhoeus::Response] response The response. + # @param [Boolean] bypass_memoization Wether to bypass + # memoization or not. Decides how the response is set. + # + # @return [Typhoeus::Response] The response. + def finish(response, bypass_memoization = nil) + if bypass_memoization + @response = response + else + self.response = response + end + self.response.request = self + execute_callbacks + response + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/responseable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/responseable.rb new file mode 100644 index 000000000000..2b91a6dd7a0c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/responseable.rb @@ -0,0 +1,29 @@ +module Typhoeus + class Request + + # This module contains logic for having a reponse + # getter and setter. + module Responseable + + # Set the response. + # + # @example Set response. + # request.response = response + # + # @param [ Response ] value The response to set. + def response=(value) + @response = value + end + + # Return the response. + # + # @example Return response. + # request.response + # + # @return [ Response ] The response. + def response + @response ||= nil + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/streamable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/streamable.rb new file mode 100644 index 000000000000..0cfaa48f2f3c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/streamable.rb @@ -0,0 +1,34 @@ +module Typhoeus + class Request + + # This module contians the logic for response streaming. + module Streamable + + # Set on_body callback. + # + # This callback will be called each time a portion of the body is read from the socket. + # Setting an on_body callback will cause the response body to be empty. + # + # @example Set on_body. + # request.on_body { |body_chunk, response| puts "Got #{body_chunk.bytesize} bytes" } + # + # @param [ Block ] block The block to execute. + # + # @yield [ Typhoeus::Response, String ] + # + # @return [ Array<Block> ] All on_body blocks. + def on_body(&block) + @on_body ||= [] + @on_body << block if block_given? + @on_body + end + + # Is this request using streaming? + # + # @return [ Boolean ] True if any on_body blocks have been set. + def streaming? + defined?(@on_body) && @on_body.any? + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/stubbable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/stubbable.rb new file mode 100644 index 000000000000..ee4255788c31 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/request/stubbable.rb @@ -0,0 +1,30 @@ +module Typhoeus + class Request + + # This module handles stubbing on the request side. + # It plays well with the block_connection configuration, + # which raises when you make a request which is not stubbed. + # + # @api private + module Stubbable + + # Override run in order to check for matching expectations. + # When an expectation is found, super is not called. Instead a + # canned response is assigned to the request. + # + # @example Run the request. + # request.run + # + # @return [ Response ] The response. + def run + if response = Expectation.response_for(self) + execute_headers_callbacks(response) + self.on_body.each{ |callback| callback.call(response.body, response) } + finish(response) + else + super + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response.rb new file mode 100644 index 000000000000..efa7dbd3d7a5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response.rb @@ -0,0 +1,68 @@ +require 'typhoeus/response/header' +require 'typhoeus/response/informations' +require 'typhoeus/response/status' +require 'typhoeus/response/cacheable' + +module Typhoeus + + # This class represents the response. + class Response + include Response::Informations + include Response::Status + include Response::Cacheable + + # Remembers the corresponding request. + # + # @example Get request. + # request = Typhoeus::Request.new("www.example.com") + # response = request.run + # request == response.request + # #=> true + # + # @return [ Typhoeus::Request ] + attr_accessor :request + + # The provided options, which contain all the + # informations about the request. + # + # @return [ Hash ] + attr_accessor :options + + # Set the handled response. + attr_writer :handled_response + + # @api private + attr_writer :mock + + # Create a new response. + # + # @example Create a response. + # Response.new + # + # @param [ Hash ] options The options hash. + # + # @return [ Response ] The new response. + def initialize(options = {}) + @options = options + @headers = Header.new(options[:headers]) if options[:headers] + end + + # Returns whether this request is mocked + # or not. + # + # @api private + def mock + defined?(@mock) ? @mock : options[:mock] + end + alias :mock? :mock + + # Returns the handled_response if it has + # been defined; otherwise, returns the response + # + # @return [ Object ] The result of callbacks + # done on the response or the original response. + def handled_response + @handled_response || self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/cacheable.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/cacheable.rb new file mode 100644 index 000000000000..0170171cd950 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/cacheable.rb @@ -0,0 +1,14 @@ +module Typhoeus + class Response + module Cacheable + + # Set the cache status, if we got response from cache + # it will have cached? == true + attr_writer :cached + + def cached? + defined?(@cached) ? !!@cached : false + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/header.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/header.rb new file mode 100644 index 000000000000..11580abc778b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/header.rb @@ -0,0 +1,105 @@ +require 'delegate' + +module Typhoeus + class Response + + # This class represents the response header. + # It can be accessed like a hash. + # Values can be strings (normal case) or arrays of strings (for duplicates headers) + # + # @api private + class Header < DelegateClass(Hash) + + # Create a new header. + # + # @example Create new header. + # Header.new(raw) + # + # @param [ String ] raw The raw header. + def initialize(raw) + super({}) + @raw = raw + @sanitized = {} + parse + end + + def [](key) + fetch(key) { @sanitized[key.to_s.downcase] } + end + + # Parses the raw header. + # + # @example Parse header. + # header.parse + def parse + case @raw + when Hash + raw.each do |k, v| + process_pair(k, v) + end + when String + raw.split(/\r?\n(?!\s)/).each do |header| + header.strip! + next if header.empty? || header.start_with?( 'HTTP/' ) + process_line(header) + end + end + end + + private + + # Processes line and saves the result. + # + # @return [ void ] + def process_line(header) + key, value = header.split(':', 2) + process_pair(key.strip, (value ? value.strip.gsub(/\r?\n\s*/, ' ') : '')) + end + + # Sets key value pair for self and @sanitized. + # + # @return [ void ] + def process_pair(key, value) + set_value(key, value, self) + @sanitized[key.downcase] = self[key] + end + + # Sets value for key in specified hash + # + # @return [ void ] + def set_value(key, value, hash) + current_value = hash[key] + if current_value + if current_value.is_a? Array + current_value << value + else + hash[key] = [current_value, value] + end + else + hash[key] = value + end + end + + # Returns the raw header or empty string. + # + # @example Return raw header. + # header.raw + # + # @return [ String ] The raw header. + def raw + @raw || '' + end + + # Sets the default proc for the specified hash independent of the Ruby version. + # + # @return [ void ] + def set_default_proc_on(hash, default_proc) + if hash.respond_to?(:default_proc=) + hash.default_proc = default_proc + else + hash.replace(Hash.new(&default_proc).merge(hash)) + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/informations.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/informations.rb new file mode 100644 index 000000000000..73544dd896a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/informations.rb @@ -0,0 +1,248 @@ +module Typhoeus + class Response + + # This module contains logic about informations + # on a response. + module Informations + + # Return libcurls return value. + # + # @example Get return_code. + # response.return_code + # + # @return [ Symbol ] The return_code. + def return_code + options[:return_code] + end + + # Returns a string describing the return. + # + # @example Get return_message. + # response.return_message + # + # @return [ String ] The return_message. + # + # @since 0.6.2 + def return_message + Ethon::Curl.easy_strerror(return_code) if return_code + end + + # Return the http response body. + # + # @example Get response_body. + # response.response_body + # + # @return [ String ] The response_body. + def response_body + options[:response_body] || options[:body] + end + alias :body :response_body + + # Return the http response headers. + # + # @example Get response_headers. + # response.response_headers + # + # @return [ String ] The response_headers. + def response_headers + return options[:response_headers] if options[:response_headers] + if mock? && h = options[:headers] + status_code = return_code || "200" + reason_phrase = status_code == "200" ? "OK" : "Mock Reason Phrase" + status_line = "HTTP/1.1 #{status_code} #{reason_phrase}" + actual_headers = h.map{ |k,v| [k, v.respond_to?(:join) ? v.join(',') : v] }. + map{ |e| "#{e.first}: #{e.last}" } + + [status_line, *actual_headers].join("\r\n") + end + end + + # Return the last received HTTP, FTP or SMTP response code. + # The value will be zero if no server response code has + # been received. Note that a proxy's CONNECT response should + # be read with http_connect_code and not this. + # + # @example Get response_code. + # response.response_code + # + # @return [ Integer ] The response_code. + def response_code + (options[:response_code] || options[:code]).to_i + end + alias :code :response_code + + # Return the available http auth methods. + # Bitmask indicating the authentication method(s) + # available. + # + # @example Get httpauth_avail. + # response.httpauth_avail + # + # @return [ Integer ] The bitmask. + def httpauth_avail + options[:httpauth_avail] + end + + + # Return the total time in seconds for the previous + # transfer, including name resolving, TCP connect etc. + # + # @example Get total_time. + # response.total_time + # + # @return [ Float ] The total_time. + def total_time + options[:total_time] || options[:time] + end + alias :time :total_time + + # Return the time, in seconds, it took from the start + # until the first byte is received by libcurl. This + # includes pretransfer time and also the time the + # server needs to calculate the result. + # + # @example Get starttransfer_time. + # response.starttransfer_time + # + # @return [ Float ] The starttransfer_time. + def starttransfer_time + options[:starttransfer_time] || options[:start_transfer_time] + end + alias :start_transfer_time :starttransfer_time + + # Return the time, in seconds, it took from the start + # until the SSL/SSH connect/handshake to the remote + # host was completed. This time is most often very near + # to the pre transfer time, except for cases such as HTTP + # pipelining where the pretransfer time can be delayed + # due to waits in line for the pipeline and more. + # + # @example Get appconnect_time. + # response.appconnect_time + # + # @return [ Float ] The appconnect_time. + def appconnect_time + options[:appconnect_time] || options[:app_connect_time] + end + alias :app_connect_time :appconnect_time + + # Return the time, in seconds, it took from the start + # until the file transfer is just about to begin. This + # includes all pre-transfer commands and negotiations + # that are specific to the particular protocol(s) involved. + # It does not involve the sending of the protocol- + # specific request that triggers a transfer. + # + # @example Get pretransfer_time. + # response.pretransfer_time + # + # @return [ Float ] The pretransfer_time. + def pretransfer_time + options[:pretransfer_time] + end + + # Return the time, in seconds, it took from the start + # until the connect to the remote host (or proxy) was completed. + # + # @example Get connect_time. + # response.connect_time + # + # @return [ Float ] The connect_time. + def connect_time + options[:connect_time] + end + + # Return the time, in seconds, it took from the + # start until the name resolving was completed. + # + # @example Get namelookup_time. + # response.namelookup_time + # + # @return [ Float ] The namelookup_time. + def namelookup_time + options[:namelookup_time] || options[:name_lookup_time] + end + alias :name_lookup_time :namelookup_time + + # Return the time, in seconds, it took for all redirection steps + # include name lookup, connect, pretransfer and transfer before the + # final transaction was started. time_redirect shows the complete + # execution time for multiple redirections. + # + # @example Get redirect_time. + # response.redirect_time + # + # @return [ Float ] The redirect_time. + def redirect_time + options[:redirect_time] + end + + # Return the last used effective url. + # + # @example Get effective_url. + # response.effective_url + # + # @return [ String ] The effective_url. + def effective_url + options[:effective_url] + end + + # Return the string holding the IP address of the most recent + # connection done with this curl handle. This string + # may be IPv6 if that's enabled. + # + # @example Get primary_ip. + # response.primary_ip + # + # @return [ String ] The primary_ip. + def primary_ip + options[:primary_ip] + end + + # Return the total number of redirections that were + # actually followed + # + # @example Get redirect_count. + # response.redirect_count + # + # @return [ Integer ] The redirect_count. + def redirect_count + options[:redirect_count] + end + + def request_size + options[:request_size] + end + + def debug_info + options[:debug_info] + end + + # Returns the response header. + # + # @example Return headers. + # response.headers + # + # @return [ Typhoeus::Header ] The response header. + def headers + return Header.new(options[:headers]) if mock? && options[:headers] + return nil if response_headers.nil? && !defined?(@headers) + @headers ||= Header.new(response_headers.split("\r\n\r\n").last) + end + alias :headers_hash :headers + + # Return all redirections in between as multiple + # responses with header. + # + # @example Return redirections. + # response.redirections + # + # @return [ Array<Typhoeus::Response> ] The redirections + def redirections + return [] unless response_headers + response_headers.split("\r\n\r\n")[0..-2].map{ |h| Response.new(:response_headers => h) } + end + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/status.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/status.rb new file mode 100644 index 000000000000..e1840f4a9cc0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/response/status.rb @@ -0,0 +1,106 @@ +module Typhoeus + class Response + + # This module contains logic about the http + # status. + module Status + + # Return the status message if present. + # + # @example Return status message. + # reesponse.status_message + # + # @return [ String ] The message. + def status_message + return @status_message if defined?(@status_message) && @status_message + return options[:status_message] unless options[:status_message].nil? + + # HTTP servers can choose not to include the explanation to HTTP codes. The RFC + # states this (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4): + # Except when responding to a HEAD request, the server SHOULD include an entity containing + # an explanation of the error situation [...] + # This means 'HTTP/1.1 404' is as valid as 'HTTP/1.1 404 Not Found' and we have to handle it. + # + # Regexp doc: http://rubular.com/r/eAr1oVYsVa + if first_header_line != nil and first_header_line[/\d{3} (.*)$/, 1] != nil + @status_message = first_header_line[/\d{3} (.*)$/, 1].chomp + else + @status_message = nil + end + end + + # Return the http version. + # + # @example Return http version. + # response.http_version + # + # @return [ String ] The http version. + def http_version + @http_version ||= first_header_line ? first_header_line[/HTTP\/(\S+)/, 1] : nil + end + + # Return whether the response is a success. + # + # @example Return if the response was successful. + # response.success? + # + # @return [ Boolean ] Return true if successful, false else. + def success? + (mock || return_code == :ok) && response_code && has_good_response_code? + end + + # Return whether the response is a failure. + # + # @example Return if the response was failed. + # response.failure? + # + # @return [ Boolean ] Return true if failure, false else. + def failure? + (mock || return_code == :internal_server_error) && response_code && has_bad_response_code? + end + + # Return wether the response is modified. + # + # @example Return if the response was modified. + # response.modified? + # + # @return [ Boolean ] Return true if modified, false else. + def modified? + (mock || return_code == :ok) && response_code && response_code != 304 + end + + # Return whether the response is timed out. + # + # @example Return if the response timed out. + # response.timed_out? + # + # @return [ Boolean ] Return true if timed out, false else. + def timed_out? + return_code == :operation_timedout + end + + private + + # :nodoc: + def first_header_line + @first_header_line ||= begin + if response_headers.to_s.include?("\r\n\r\n") + response_headers.to_s.split("\r\n\r\n").last.split("\r\n").first + else + response_headers.to_s.split("\r\n").first + end + end + end + + # :nodoc: + def has_good_response_code? + response_code >= 200 && response_code < 300 + end + + # :nodoc: + def has_bad_response_code? + !has_good_response_code? + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/version.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/version.rb new file mode 100644 index 000000000000..048f091e1839 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/lib/typhoeus/version.rb @@ -0,0 +1,5 @@ +module Typhoeus + + # The current Typhoeus version. + VERSION = '1.4.0' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/perf/profile.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/perf/profile.rb new file mode 100644 index 000000000000..29ec9c2eecb4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/perf/profile.rb @@ -0,0 +1,14 @@ +require 'typhoeus' +require 'ruby-prof' + +calls = 50 +base_url = "http://127.0.0.1:3000/" + +RubyProf.start +calls.times do |i| + Typhoeus::Request.get(base_url+i.to_s) +end +result = RubyProf.stop + +printer = RubyProf::FlatPrinter.new(result) +printer.print(STDOUT) diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/perf/vs_nethttp.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/perf/vs_nethttp.rb new file mode 100644 index 000000000000..305f9feb79af --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/perf/vs_nethttp.rb @@ -0,0 +1,64 @@ +require 'typhoeus' +require 'net/http' +require 'open-uri' +require 'benchmark' + +URL = "http://localhost:300" +hydra = Typhoeus::Hydra.new(max_concurrency: 3) + +if defined? require_relative + require_relative '../spec/support/localhost_server.rb' + require_relative '../spec/support/server.rb' +else + require '../spec/support/localhost_server.rb' + require '../spec/support/server.rb' +end +LocalhostServer.new(TESTSERVER.new, 3000) +LocalhostServer.new(TESTSERVER.new, 3001) +LocalhostServer.new(TESTSERVER.new, 3002) + +def url_for(i) + "#{URL}#{i%3}/" +end + +Benchmark.bm do |bm| + + [1000].each do |calls| + puts "[ #{calls} requests ]" + + bm.report("net/http ") do + calls.times do |i| + uri = URI.parse(url_for(i)) + Net::HTTP.get_response(uri) + end + end + + bm.report("open ") do + calls.times do |i| + open(url_for(i)) + end + end + + bm.report("request ") do + calls.times do |i| + Typhoeus::Request.get(url_for(i)) + end + end + + bm.report("hydra ") do + calls.times do |i| + hydra.queue(Typhoeus::Request.new(url_for(i))) + end + hydra.run + end + + bm.report("hydra memoize ") do + Typhoeus::Config.memoize = true + calls.times do |i| + hydra.queue(Typhoeus::Request.new(url_for(i))) + end + hydra.run + Typhoeus::Config.memoize = false + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb new file mode 100644 index 000000000000..3aee759a98d6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb @@ -0,0 +1,156 @@ +require 'spec_helper' +require "rack/typhoeus" + +describe "Rack::Typhoeus::Middleware::ParamsDecoder::Helper" do + + let(:klass) do + Class.new do + include Rack::Typhoeus::Middleware::ParamsDecoder::Helper + end.new + end + + describe "#decode" do + let(:decoded) { klass.decode(params) } + let(:params) { { :array => {'0' => :a, '1' => :b } } } + + it "decodes" do + expect(decoded[:array]).to match_array([:a, :b]) + end + + it "doesn't modify" do + expect(decoded).to_not be(params) + end + end + + describe "#decode!" do + let(:decoded) { klass.decode!(params) } + + context "when hash" do + context "when encoded" do + context "when simple" do + let(:params) { { :array => {'0' => :a, '1' => :b } } } + + it "decodes" do + expect(decoded[:array]).to match_array([:a, :b]) + end + + it "modifies" do + expect(decoded).to eq(params) + end + end + + context "when longer and more complex" do + let(:params) do + { + :ids => { + "0" => "407304", + "1" => "407305", + "2" => "407306", + "3" => "407307", + "4" => "407308", + "5" => "407309", + "6" => "407310", + "7" => "407311", + "8" => "407312", + "9" => "407313", + "10" => "327012" + } + } + end + + it "decodes ensuring arrays maintain their original order" do + expect(decoded[:ids]).to eq(["407304", "407305", "407306", "407307", "407308", "407309", "407310", "407311", "407312", "407313", "327012"]) + end + end + + context "when nested" do + let(:params) do + { :array => { '0' => 0, '1' => { '0' => 'sub0', '1' => 'sub1' } } } + end + + it "decodes" do + expect(decoded[:array]).to include(0) + expect(decoded[:array].find{|e| e.is_a?(Array)}).to( + match_array(['sub0', 'sub1']) + ) + end + + it "modifies" do + expect(decoded).to eq(params) + end + end + end + + context "when not encoded" do + let(:params) { {:a => :a} } + + it "doesn't modify" do + expect(decoded).to be(params) + end + end + end + + context "when no hash" do + let(:params) { "a" } + + it "returns self" do + expect(decoded).to be(params) + end + end + end + + describe "#encoded?" do + let(:encoded) { klass.send(:encoded?, params) } + + context "when there is only one key" do + context "and its 0" do + let(:params){ {'0' => 1} } + it 'returns true' do + expect(encoded).to be_truthy + end + end + context "and its not 0" do + let(:params){ {'some-key' => 1}} + it 'returns false' do + expect(encoded).to be_falsey + end + end + end + + context "when keys are ascending numbers starting with zero" do + let(:params) { Hash[12.times.map {|i| [i, (i+65).chr]}] } + + it "returns true" do + expect(encoded).to be_truthy + end + end + + context "when keys are not ascending numbers starting with zero" do + let(:params) { {:a => 1} } + + it "returns false" do + expect(encoded).to be_falsey + end + end + end + + describe "#convert" do + let(:converted) { klass.send(:convert, params) } + + context "when encoded" do + let(:params) { {'0' => :a, '1' => :b} } + + it "returns values" do + expect(converted).to match_array([:a, :b]) + end + end + + context "when not encoded" do + let(:params) { {:a => :a} } + + it "returns unmodified" do + expect(converted).to be(params) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder_spec.rb new file mode 100644 index 000000000000..187da9f254c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/rack/typhoeus/middleware/params_decoder_spec.rb @@ -0,0 +1,31 @@ +require 'spec_helper' + +describe "Rack::Typhoeus::Middleware::ParamsDecoder" do + + before(:all) do + require "rack/typhoeus" + end + + let(:app) do + double + end + + let(:env) do + double + end + + let(:klass) do + Rack::Typhoeus::Middleware::ParamsDecoder + end + + describe "#call" do + end + + context "when requesting" do + let(:response) { Typhoeus.get("localhost:3001", :params => {:x => [:a]}) } + + it "transforms parameters" do + expect(response.body).to include("query_hash\":{\"x\":[\"a\"]}") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/spec_helper.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/spec_helper.rb new file mode 100644 index 000000000000..73302cce55fa --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/spec_helper.rb @@ -0,0 +1,29 @@ +$LOAD_PATH.unshift(File.dirname(__FILE__)) +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) + +require "bundler" +Bundler.setup +require "typhoeus" +require "rspec" + +Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each { |f| require f } + +RSpec.configure do |config| + config.order = :rand + + config.before(:suite) do + LocalhostServer.new(TESTSERVER.new, 3001) + end + + config.after do + Typhoeus::Pool.clear + Typhoeus::Expectation.clear + Typhoeus.before.clear + Typhoeus.on_complete.clear + Typhoeus.on_success.clear + Typhoeus.on_failure.clear + Typhoeus::Config.verbose = false + Typhoeus::Config.block_connection = false + Typhoeus::Config.memoize = false + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/support/localhost_server.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/support/localhost_server.rb new file mode 100644 index 000000000000..c5a7508bccb5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/support/localhost_server.rb @@ -0,0 +1,94 @@ +require 'rack' +require 'rack/handler/webrick' +require 'net/http' + +# The code for this is inspired by Capybara's server: +# http://github.com/jnicklas/capybara/blob/0.3.9/lib/capybara/server.rb +class LocalhostServer + READY_MESSAGE = "Server ready" + + class Identify + def initialize(app) + @app = app + end + + def call(env) + if env["PATH_INFO"] == "/__identify__" + [200, {}, [LocalhostServer::READY_MESSAGE]] + else + @app.call(env) + end + end + end + + attr_reader :port + + def initialize(rack_app, port = nil) + @port = port || find_available_port + @rack_app = rack_app + concurrently { boot } + wait_until(10, "Boot failed.") { booted? } + end + + private + + def find_available_port + server = TCPServer.new('127.0.0.1', 0) + server.addr[1] + ensure + server.close if server + end + + def boot + # Use WEBrick since it's part of the ruby standard library and is available on all ruby interpreters. + options = { :Port => port } + options.merge!(:AccessLog => [], :Logger => WEBrick::BasicLog.new(StringIO.new)) unless ENV['VERBOSE_SERVER'] + Rack::Handler::WEBrick.run(Identify.new(@rack_app), options) + end + + def booted? + res = ::Net::HTTP.get_response("localhost", '/__identify__', port) + if res.is_a?(::Net::HTTPSuccess) or res.is_a?(::Net::HTTPRedirection) + return res.body == READY_MESSAGE + end + rescue Errno::ECONNREFUSED, Errno::EBADF + return false + end + + def concurrently + if should_use_subprocess? + pid = Process.fork do + trap(:INT) { ::Rack::Handler::WEBrick.shutdown } + yield + exit # manually exit; otherwise this sub-process will re-run the specs that haven't run yet. + end + + at_exit do + Process.kill('INT', pid) + begin + Process.wait(pid) + rescue Errno::ECHILD + # ignore this error...I think it means the child process has already exited. + end + end + else + Thread.new { yield } + end + end + + def should_use_subprocess? + # !ENV['THREADED'] + false + end + + def wait_until(timeout, error_message, &block) + start_time = Time.now + + while true + return if yield + raise TimeoutError.new(error_message) if (Time.now - start_time) > timeout + sleep(0.05) + end + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/support/memory_cache.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/support/memory_cache.rb new file mode 100644 index 000000000000..15cc56bf1f04 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/support/memory_cache.rb @@ -0,0 +1,15 @@ +class MemoryCache + attr_reader :memory + + def initialize + @memory = {} + end + + def get(request) + memory[request] + end + + def set(request, response) + memory[request] = response + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/support/server.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/support/server.rb new file mode 100644 index 000000000000..b7f6f063991d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/support/server.rb @@ -0,0 +1,116 @@ +#!/usr/bin/env ruby +require 'json' +require 'zlib' +require 'sinatra/base' +require 'rack/typhoeus' + +TESTSERVER = Sinatra.new do + set :logging, false + use Rack::Typhoeus::Middleware::ParamsDecoder + + fail_count = 0 + + post '/file' do + { + 'content-type' => params[:file][:type], + 'filename' => params[:file][:filename], + 'content' => params[:file][:tempfile].read, + 'request-content-type' => request.env['CONTENT_TYPE'] + }.to_json + end + + get '/multiple-headers' do + [200, { 'Set-Cookie' => %w[ foo bar ], 'Content-Type' => 'text/plain' }, ['']] + end + + get '/cookies-test' do + [200, { 'Set-Cookie' => %w(foo=bar bar=foo), 'Content-Type' => 'text/plain' }, ['']] + end + + get '/cookies-test2' do + [200, { 'Set-Cookie' => %w(foo2=bar bar2=foo), 'Content-Type' => 'text/plain' }, ['']] + end + + get '/fail/:number' do + if fail_count >= params[:number].to_i + "ok" + else + fail_count += 1 + error 500, "oh noes!" + end + end + + get '/fail_forever' do + error 500, "oh noes!" + end + + get '/redirect' do + redirect '/' + end + + get '/bad_redirect' do + redirect '/bad_redirect' + end + + get '/auth_basic/:username/:password' do + @auth ||= Rack::Auth::Basic::Request.new(request.env) + # Check that we've got a basic auth, and that it's credentials match the ones + # provided in the request + if @auth.provided? && @auth.basic? && @auth.credentials == [ params[:username], params[:password] ] + # auth is valid - confirm it + true + else + # invalid auth - request the authentication + response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth") + throw(:halt, [401, "Not authorized\n"]) + end + end + + get '/auth_ntlm' do + # we're just checking for the existence if NTLM auth header here. It's validation + # is too troublesome and really doesn't bother is much, it's up to libcurl to make + # it valid + response['WWW-Authenticate'] = 'NTLM' + is_ntlm_auth = /^NTLM/ =~ request.env['HTTP_AUTHORIZATION'] + true if is_ntlm_auth + throw(:halt, [401, "Not authorized\n"]) if !is_ntlm_auth + end + + get '/gzipped' do + req_env = request.env.to_json + z = Zlib::Deflate.new + gzipped_env = z.deflate(req_env, Zlib::FINISH) + z.close + response['Content-Encoding'] = 'gzip' + gzipped_env + end + + get '/**' do + sleep params["delay"].to_i if params.has_key?("delay") + request.env.merge!(:body => request.body.read).to_json + end + + head '/**' do + sleep params["delay"].to_i if params.has_key?("delay") + end + + put '/**' do + request.env.merge!(:body => request.body.read).to_json + end + + post '/**' do + request.env.merge!(:body => request.body.read).to_json + end + + delete '/**' do + request.env.merge!(:body => request.body.read).to_json + end + + patch '/**' do + request.env.merge!(:body => request.body.read).to_json + end + + options '/**' do + request.env.merge!(:body => request.body.read).to_json + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/adapters/faraday_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/adapters/faraday_spec.rb new file mode 100644 index 000000000000..716fb76d00c6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/adapters/faraday_spec.rb @@ -0,0 +1,339 @@ +if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0") + require 'spec_helper' + require 'typhoeus/adapters/faraday' + + describe Faraday::Adapter::Typhoeus do + let(:base_url) { "http://localhost:3001" } + let(:adapter) { described_class.new(nil) } + let(:request) { Typhoeus::Request.new(base_url) } + let(:conn) do + Faraday.new(:url => base_url) do |faraday| + faraday.adapter :typhoeus + end + end + let(:response) { conn.get("/") } + + context "when parallel" do + it "returns a faraday response" do + response = nil + conn.in_parallel { response = conn.get("/") } + expect(response).to be_a(Faraday::Response) + end + + it "succeeds" do + response = nil + conn.in_parallel { response = conn.get("/") } + expect(response.status).to be(200) + end + end + + context "when not parallel" do + it "returns a faraday response" do + expect(response).to be_a(Faraday::Response) + end + + it "succeeds" do + expect(response.status).to be(200) + end + end + + context "when a response is stubbed" do + before do + stub = Typhoeus::Response.new \ + :code => 200, + :headers => { "Foo" => "2", "Bar" => "3" }, + :body => "Hello", + :mock => true + + Typhoeus.stub(base_url + '/').and_return(stub) + end + + it 'stubs the status code' do + expect(response.status).to eq(200) + end + + it 'stubs the response body' do + expect(response.body).to eq("Hello") + end + + it 'stubs the headers' do + expect(response.headers).to eq("Foo" => "2", "Bar" => "3") + end + end + + describe "#initialize" do + let(:request) { adapter.method(:typhoeus_request).call({}) } + + context "when typhoeus request options specified" do + let(:adapter) { described_class.new(nil, { :forbid_reuse => true, :maxredirs => 1 }) } + + it "should set option for request" do + expect(request.options[:forbid_reuse]).to be_truthy + expect(request.options[:maxredirs]).to eq(1) + end + end + end + + describe "#perform_request" do + let(:env) { {} } + + context "when body" do + let(:env) { { :body => double(:read => "body") } } + + it "reads body" do + expect(adapter.method(:read_body).call(env)).to eq("body") + end + end + + context "parallel_manager" do + context "when given" do + let(:env) { { :parallel_manager => double(:queue => true), :ssl => {}, :request => {} } } + + it "uses" do + adapter.method(:perform_request).call(env) + end + end + + context "when not given" do + let(:env) { { :method => :get, :ssl => {}, :request => {} } } + + it "falls back to single" do + expect(Typhoeus::Request).to receive(:new).and_return(double(:options => {}, :on_complete => [], :run => true)) + adapter.method(:perform_request).call(env) + end + end + end + end + + describe "#request" do + let(:env) do + { :url => "url", :method => :get, :body => "body", :request_headers => {}, :ssl => {}, :request => {} } + end + + let(:request) { adapter.method(:request).call(env) } + + it "returns request" do + expect(request).to be_a(Typhoeus::Request) + end + + it "sets url" do + expect(request.base_url).to eq("url") + end + + it "sets http method" do + expect(request.original_options[:method]).to eq(:get) + end + + it "sets body" do + expect(request.original_options[:body]).to eq("body") + end + + it "sets headers" do + expect(request.original_options[:headers]).to eq({}) + end + + it "sets on_complete callback" do + expect(request.on_complete.size).to eq(1) + end + end + + context "when the connection failed" do + before do + stub = Typhoeus::Response.new \ + :response_code => 0, + :return_code => 0, + :mock => true + + Typhoeus.stub(base_url + '/').and_return(stub) + end + + context "when parallel" do + it "isn't successful" do + response = nil + conn.in_parallel { response = conn.get("/") } + expect(response.success?).to be_falsey + end + + it "translates the response code into an error message" do + response = nil + conn.in_parallel { response = conn.get("/") } + expect(response.env[:typhoeus_return_message]).to eq("No error") + end + end + + context "when not parallel" do + it "raises an error" do + expect { conn.get("/") }.to raise_error(Faraday::ConnectionFailed, "No error") + end + end + end + + describe "#configure_socket" do + let(:env) { { :request => { :bind => { :host => "interface" } } } } + + before { adapter.method(:configure_socket).call(request, env) } + + context "when host" do + it "sets interface" do + expect(request.options[:interface]).to eq("interface") + end + end + end + + describe "#configure_timeout" do + before { adapter.method(:configure_timeout).call(request, env) } + + context "when timeout" do + let(:env) { { :request => { :timeout => 1 } } } + + it "sets timeout_ms" do + expect(request.options[:timeout_ms]).to eq(1000) + end + end + + context "when open_timeout" do + let(:env) { { :request => { :open_timeout => 1 } } } + + it "sets connecttimeout_ms" do + expect(request.options[:connecttimeout_ms]).to eq(1000) + end + end + end + + describe "#configure_proxy" do + before { adapter.method(:configure_proxy).call(request, env) } + + context "when proxy" do + let(:env) { { :request => { :proxy => { :uri => double(:scheme => 'http', :host => "localhost", :port => "3001") } } } } + + it "sets proxy" do + expect(request.options[:proxy]).to eq("http://localhost:3001") + end + + context "when username and password" do + let(:env) do + { :request => { :proxy => { + :uri => double(:scheme => 'http', :host => :a, :port => :b), + :user => "a", + :password => "b" + } } } + end + + it "sets proxyuserpwd" do + expect(request.options[:proxyuserpwd]).to eq("a:b") + end + end + end + end + + describe "#configure_ssl" do + before { adapter.method(:configure_ssl).call(request, env) } + + context "when version" do + let(:env) { { :ssl => { :version => "a" } } } + + it "sets sslversion" do + expect(request.options[:sslversion]).to eq("a") + end + end + + context "when client_cert" do + let(:env) { { :ssl => { :client_cert => "a" } } } + + it "sets sslcert" do + expect(request.options[:sslcert]).to eq("a") + end + end + + context "when client_key" do + let(:env) { { :ssl => { :client_key => "a" } } } + + it "sets sslkey" do + expect(request.options[:sslkey]).to eq("a") + end + end + + context "when ca_file" do + let(:env) { { :ssl => { :ca_file => "a" } } } + + it "sets cainfo" do + expect(request.options[:cainfo]).to eq("a") + end + end + + context "when ca_path" do + let(:env) { { :ssl => { :ca_path => "a" } } } + + it "sets capath" do + expect(request.options[:capath]).to eq("a") + end + end + + context "when client_cert_passwd" do + let(:env) { { :ssl => { :client_cert_passwd => "a" } } } + + it "sets keypasswd to the value of client_cert_passwd" do + expect(request.options[:keypasswd]).to eq("a") + end + end + + context "when client_certificate_password" do + let(:env) { { :ssl => { :client_certificate_password => "a" } } } + + it "sets keypasswd to the value of client_cert_passwd" do + expect(request.options[:keypasswd]).to eq("a") + end + end + + context "when no client_cert_passwd" do + let(:env) { { :ssl => { } } } + + it "does not set keypasswd on options" do + expect(request.options).not_to have_key :keypasswd + end + end + + context "when verify is false" do + let(:env) { { :ssl => { :verify => false } } } + + it "sets ssl_verifyhost to 0" do + expect(request.options[:ssl_verifyhost]).to eq(0) + end + + it "sets ssl_verifypeer to false" do + expect(request.options[:ssl_verifypeer]).to be_falsey + end + end + + context "when verify is true" do + let(:env) { { :ssl => { :verify => true } } } + + it "sets ssl_verifyhost to 2" do + expect(request.options[:ssl_verifyhost]).to eq(2) + end + + it "sets ssl_verifypeer to true" do + expect(request.options[:ssl_verifypeer]).to be_truthy + end + end + end + + describe "#parallel?" do + context "when parallel_manager" do + let(:env) { { :parallel_manager => true } } + + it "returns true" do + expect(adapter.method(:parallel?).call(env)).to be_truthy + end + end + + context "when no parallel_manager" do + let(:env) { { :parallel_manager => nil } } + + it "returns false" do + expect(adapter.method(:parallel?).call(env)).to be_falsey + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/dalli_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/dalli_spec.rb new file mode 100644 index 000000000000..1ea2ce0afa6a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/dalli_spec.rb @@ -0,0 +1,41 @@ +if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0") + require 'dalli' + require 'typhoeus/cache/dalli' + require 'spec_helper' + + describe Typhoeus::Cache::Dalli do + let(:dalli) { instance_double(Dalli::Client) } + let(:cache) { Typhoeus::Cache::Dalli.new(dalli) } + + let(:base_url) { "localhost:3001" } + let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } + let(:response) { Typhoeus::Response.new(:response_code => 0, :return_code => 0, :mock => true) } + + describe "#set" do + it "sends the request to Dalli" do + expect(dalli).to receive(:set).with(request.cache_key, response, nil) + + cache.set(request, response) + end + end + + describe "#get" do + it "returns nil when the key is not in the cache" do + expect(dalli).to receive(:get).with(request.cache_key).and_return(nil) + + expect(cache.get(request)).to be_nil + end + + it "returns the cached response when the key is in cache" do + expect(dalli).to receive(:get).with(request.cache_key).and_return(response) + + result = cache.get(request) + expect(result).to_not be_nil + expect(result.response_code).to eq(response.response_code) + expect(result.return_code).to eq(response.return_code) + expect(result.headers).to eq(response.headers) + expect(result.body).to eq(response.body) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/redis_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/redis_spec.rb new file mode 100644 index 000000000000..9ee5941c7d54 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/cache/redis_spec.rb @@ -0,0 +1,41 @@ +require 'redis' +require 'typhoeus/cache/redis' +require 'spec_helper' + +describe Typhoeus::Cache::Redis do + let(:redis) { instance_double(Redis) } + let(:cache) { Typhoeus::Cache::Redis.new(redis) } + + let(:base_url) { "localhost:3001" } + let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } + let(:response) { Typhoeus::Response.new(:response_code => 0, :return_code => 0, :mock => true) } + let(:serialized_response) { Marshal.dump(response) } + + describe "#set" do + it "sends the serialized request to Redis" do + expect(redis).to receive(:set).with(request.cache_key, serialized_response) + expect(redis).to_not receive(:expire).with(request.cache_key, request.cache_ttl) + + cache.set(request, response) + end + end + + describe "#get" do + it "returns nil when the key is not in Redis" do + expect(redis).to receive(:get).with(request.cache_key).and_return(nil) + + expect(cache.get(request)).to be_nil + end + + it "returns the cached response when the key is in Redis" do + expect(redis).to receive(:get).with(request.cache_key).and_return(serialized_response) + + result = cache.get(request) + expect(result).to_not be_nil + expect(result.response_code).to eq(response.response_code) + expect(result.return_code).to eq(response.return_code) + expect(result.headers).to eq(response.headers) + expect(result.body).to eq(response.body) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/config_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/config_spec.rb new file mode 100644 index 000000000000..ac721c58217f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/config_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Typhoeus::Config do + let(:config) { Typhoeus::Config } + + [:block_connection, :memoize, :verbose, :cache, :user_agent, :proxy].each do |name| + it "responds to #{name}" do + expect(config).to respond_to(name) + end + + it "responds to #{name}=" do + expect(config).to respond_to("#{name}=") + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/easy_factory_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/easy_factory_spec.rb new file mode 100644 index 000000000000..cc1e9bc0b57c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/easy_factory_spec.rb @@ -0,0 +1,143 @@ +require 'spec_helper' + +describe Typhoeus::EasyFactory do + let(:base_url) { "http://localhost:3001" } + let(:hydra) { Typhoeus::Hydra.new(:max_concurrency => 1) } + let(:options) { {} } + let(:request) { Typhoeus::Request.new(base_url, options) } + let(:easy_factory) { described_class.new(request, hydra) } + + describe "#get" do + context "when option[:cache_ttl]" do + let(:options) { {:cache_ttl => 1} } + + it "creates Ethon::Easy" do + expect(easy_factory.get).to be_a(Ethon::Easy) + end + end + + context "timeouts" do + it "sets nosignal to true by default" do + expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:nosignal => true)) + easy_factory.get + end + + context "when timeout is not a whole number and timeout_ms is not set" do + let(:options) { {:timeout => 0.1} } + it "ceils timeout and sets timeout_ms" do + expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:timeout_ms => 100, :timeout => 1)) + easy_factory.get + end + end + + context "when timeout is not a whole number and timeout_ms is set" do + let(:options) { {:timeout => 0.1, :timeout_ms => 123} } + it "ceils timeout and does not change timeout_ms" do + expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:timeout_ms => 123, :timeout => 1)) + easy_factory.get + end + end + + context "when connecttimeout is not a whole number and connecttimeout_ms is not set" do + let(:options) { {:connecttimeout => 0.1} } + it "ceils connecttimeout and sets connecttimeout_ms" do + expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:connecttimeout_ms => 100, :connecttimeout => 1)) + easy_factory.get + end + end + + context "when connecttimeout is not a whole number and connecttimeout_ms is set" do + let(:options) { {:connecttimeout => 0.1, :connecttimeout_ms => 123} } + it "ceils connecttimeout and does not change connecttimeout_ms" do + expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:connecttimeout_ms => 123, :connecttimeout => 1)) + easy_factory.get + end + end + + + end + + context "when invalid option" do + let(:options) { {:invalid => 1} } + + it "reraises" do + expect{ easy_factory.get }.to raise_error(Ethon::Errors::InvalidOption) + end + end + + context "when removed option" do + let(:options) { {:cache_timeout => 1} } + + it "reraises with help" do + expect{ easy_factory.get }.to raise_error( + Ethon::Errors::InvalidOption, /The option cache_timeout was removed/ + ) + end + end + + context "when changed option" do + let(:options) { {:proxy_auth_method => 1} } + + it "reraises with help" do + expect{ easy_factory.get }.to raise_error( + Ethon::Errors::InvalidOption, /Please try proxyauth instead of proxy_auth_method/ + ) + end + end + + context "when renamed option" do + let(:options) { {:connect_timeout => 1} } + + it "warns" do + expect(easy_factory).to receive(:warn).with( + "Deprecated option connect_timeout. Please use connecttimeout instead." + ) + easy_factory.get + end + + it "passes correct option" do + expect(easy_factory).to receive(:warn) + expect(easy_factory.easy).to receive(:connecttimeout=).with(1) + easy_factory.get + end + end + end + + describe "#set_callback" do + it "sets easy.on_progress callback when an on_progress callback is provided" do + request.on_progress { 1 } + expect(easy_factory.easy).to receive(:on_progress) + easy_factory.send(:set_callback) + end + + it "sets easy.on_complete callback" do + expect(easy_factory.easy).to receive(:on_complete) + easy_factory.send(:set_callback) + end + + it "finishes request" do + easy_factory.send(:set_callback) + expect(request).to receive(:finish) + easy_factory.easy.complete + end + + it "resets easy" do + easy_factory.send(:set_callback) + expect(easy_factory.easy).to receive(:reset) + easy_factory.easy.complete + end + + it "pushes easy back into the pool" do + easy_factory.send(:set_callback) + easy_factory.easy.complete + expect(Typhoeus::Pool.send(:easies)).to include(easy_factory.easy) + end + + it "adds next request" do + easy_factory.hydra.instance_variable_set(:@queued_requests, [request]) + expect(easy_factory.hydra).to receive(:add).with(request) + easy_factory.send(:set_callback) + easy_factory.easy.complete + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/errors/no_stub_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/errors/no_stub_spec.rb new file mode 100644 index 000000000000..5815cead4ec8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/errors/no_stub_spec.rb @@ -0,0 +1,13 @@ +require 'spec_helper' + +describe Typhoeus::Errors::NoStub do + let(:base_url) { "localhost:3001" } + let(:request) { Typhoeus::Request.new(base_url) } + let(:message) { "The connection is blocked and no stub defined: " } + + subject { Typhoeus::Errors::NoStub } + + it "displays the request url" do + expect { raise subject.new(request) }.to raise_error(subject, message + base_url) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/expectation_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/expectation_spec.rb new file mode 100644 index 000000000000..9dfb2b03d8bc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/expectation_spec.rb @@ -0,0 +1,280 @@ +require 'spec_helper' + +describe Typhoeus::Expectation do + let(:options) { {} } + let(:base_url) { "www.example.com" } + let(:expectation) { described_class.new(base_url, options) } + + describe ".new" do + it "sets base_url" do + expect(expectation.instance_variable_get(:@base_url)).to eq(base_url) + end + + it "sets options" do + expect(expectation.instance_variable_get(:@options)).to eq(options) + end + + it "initializes response_counter" do + expect(expectation.instance_variable_get(:@response_counter)).to eq(0) + end + end + + describe ".all" do + context "when @expectations nil" do + it "returns empty array" do + expect(Typhoeus::Expectation.all).to eq([]) + end + end + + context "when @expectations not nil" do + let(:expectations) { [1] } + + it "returns @expectations" do + Typhoeus::Expectation.instance_variable_set(:@expectations, expectations) + expect(Typhoeus::Expectation.all).to be(expectations) + end + end + end + + describe ".clear" do + let(:expectations) { double(:clear) } + + it "clears all" do + expect(expectations).to receive(:clear) + Typhoeus::Expectation.instance_variable_set(:@expectations, expectations) + Typhoeus::Expectation.clear + Typhoeus::Expectation.instance_variable_set(:@expectations, nil) + end + end + + describe ".response_for" do + let(:request) { Typhoeus::Request.new("") } + let(:stubbed_response) { Typhoeus::Response.new } + + it "finds a matching expectation and returns its next response" do + Typhoeus::Expectation.all << expectation + expect(expectation).to receive(:matches?).with(request).and_return(true) + expect(expectation).to receive(:response).with(request).and_return(stubbed_response) + + response = Typhoeus::Expectation.response_for(request) + + expect(response).to be(stubbed_response) + end + + it "returns nil if no matching expectation is found" do + response = Typhoeus::Expectation.response_for(request) + expect(response).to be(nil) + end + end + + describe "#stubbed_from" do + it "sets value" do + expectation.stubbed_from(:webmock) + expect(expectation.from).to eq(:webmock) + end + + it "returns self" do + expect(expectation.stubbed_from(:webmock)).to be(expectation) + end + end + + describe "#and_return" do + context "when value" do + it "adds to responses" do + expectation.and_return(1) + expect(expectation.responses).to eq([1]) + end + end + + context "when array" do + it "adds to responses" do + expectation.and_return([1, 2]) + expect(expectation.responses).to eq([1, 2]) + end + end + + context "when block" do + it "adds to responses" do + block = Proc.new {} + expectation.and_return(&block) + expect(expectation.responses).to eq([block]) + end + end + end + + describe "#responses" do + it "returns responses" do + expect(expectation.responses).to be_a(Array) + end + end + + describe "#response" do + let(:request) { Typhoeus::Request.new("") } + + before { expectation.instance_variable_set(:@responses, responses) } + + context "when one response" do + context "is pre-constructed" do + let(:responses) { [Typhoeus::Response.new] } + + it "returns response" do + expect(expectation.response(request)).to be(responses[0]) + end + end + + context "is lazily-constructed" do + def construct_response(request) + @request_from_response_construction = request + lazily_constructed_response + end + + let(:lazily_constructed_response) { Typhoeus::Response.new } + let(:responses) { [ Proc.new { |request| construct_response(request) } ] } + + it "returns response" do + expect(expectation.response(request)).to be(lazily_constructed_response) + expect(@request_from_response_construction).to be(request) + end + end + end + + context "when multiple responses" do + let(:responses) { [Typhoeus::Response.new, Typhoeus::Response.new, Typhoeus::Response.new] } + + it "returns one by one" do + 3.times do |i| + expect(expectation.response(request)).to be(responses[i]) + end + end + end + end + + describe "#matches?" do + let(:request) { double(:base_url => nil) } + + it "calls url_match?" do + expect(expectation).to receive(:url_match?) + expectation.matches?(request) + end + + it "calls options_match?" do + expect(expectation).to receive(:url_match?).and_return(true) + expect(expectation).to receive(:options_match?) + expectation.matches?(request) + end + end + + describe "#url_match?" do + let(:request_url) { "www.example.com" } + let(:request) { Typhoeus::Request.new(request_url) } + let(:url_match) { expectation.method(:url_match?).call(request.base_url) } + + context "when string" do + context "when match" do + it "returns true" do + expect(url_match).to be_truthy + end + end + + context "when no match" do + let(:base_url) { "no_match" } + + it "returns false" do + expect(url_match).to be_falsey + end + end + end + + context "when regexp" do + context "when match" do + let(:base_url) { /example/ } + + it "returns true" do + expect(url_match).to be_truthy + end + end + + context "when no match" do + let(:base_url) { /nomatch/ } + + it "returns false" do + expect(url_match).to be_falsey + end + + context "with nil request_url" do + let(:request_url) { nil } + + it "returns false" do + expect(url_match).to be_falsey + end + end + end + end + + context "when nil" do + let(:base_url) { nil } + + it "returns true" do + expect(url_match).to be_truthy + end + end + + context "when not string, regexp, nil" do + let(:base_url) { 1 } + + it "returns false" do + expect(url_match).to be_falsey + end + end + end + + describe "options_match?" do + let(:request_options) { {} } + let(:request) { Typhoeus::Request.new(nil, request_options) } + let(:options_match) { expectation.method(:options_match?).call(request) } + + context "when match" do + let(:options) { { :a => 1 } } + let(:request_options) { options } + + it "returns true" do + expect(options_match).to be_truthy + end + end + + context "when options are a subset from request_options" do + let(:options) { { :a => 1 } } + let(:request_options) { { :a => 1, :b => 2 } } + + it "returns true" do + expect(options_match).to be_truthy + end + end + + context "when options are nested" do + let(:options) { { :a => { :b => 1 } } } + let(:request_options) { options } + + it "returns true" do + expect(options_match).to be_truthy + end + end + + context "when options contains an array" do + let(:options) { { :a => [1, 2] } } + let(:request_options) { options } + + it "returns true" do + expect(options_match).to be_truthy + end + end + + context "when no match" do + let(:options) { { :a => 1 } } + + it "returns false" do + expect(options_match).to be_falsey + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/addable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/addable_spec.rb new file mode 100644 index 000000000000..4cb8e1a1e890 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/addable_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +describe Typhoeus::Hydra::Addable do + let(:hydra) { Typhoeus::Hydra.new() } + let(:request) { Typhoeus::Request.new("localhost:3001", {:method => :get}) } + + it "asks easy factory for an easy" do + multi = double + expect(Typhoeus::EasyFactory).to receive(:new).with(request, hydra).and_return(double(:get => 1)) + expect(hydra).to receive(:multi).and_return(multi) + expect(multi).to receive(:add).with(1) + hydra.add(request) + end + + it "adds easy to multi" do + multi = double + expect(Typhoeus::EasyFactory).to receive(:new).with(request, hydra).and_return(double(:get => 1)) + expect(hydra).to receive(:multi).and_return(multi) + expect(multi).to receive(:add).with(1) + hydra.add(request) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/before_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/before_spec.rb new file mode 100644 index 000000000000..e17e0438df11 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/before_spec.rb @@ -0,0 +1,98 @@ +require 'spec_helper' + +describe Typhoeus::Hydra::Before do + let(:request) { Typhoeus::Request.new("") } + let(:hydra) { Typhoeus::Hydra.new } + let(:receive_counter) { double :mark => :twain } + + describe "#add" do + context "when before" do + context "when one" do + it "executes" do + Typhoeus.before { |r| receive_counter.mark } + expect(receive_counter).to receive(:mark) + hydra.add(request) + end + + context "when true" do + it "calls super" do + Typhoeus.before { true } + expect(Typhoeus::Expectation).to receive(:response_for) + hydra.add(request) + end + end + + context "when falsy" do + context "when queue requests" do + let(:queued_request) { Typhoeus::Request.new("") } + + before { hydra.queue(queued_request) } + + it "dequeues" do + Typhoeus.before { false } + hydra.add(request) + expect(hydra.queued_requests).to be_empty + end + end + + context "when false" do + it "doesn't call super" do + Typhoeus.before { false } + expect(Typhoeus::Expectation).to receive(:response_for).never + hydra.add(request) + end + end + + context "when response" do + it "doesn't call super" do + Typhoeus.before { Typhoeus::Response.new } + expect(Typhoeus::Expectation).to receive(:response_for).never + hydra.add(request) + end + end + end + end + + context "when multi" do + context "when all true" do + before { 3.times { Typhoeus.before { |r| receive_counter.mark } } } + + it "calls super" do + expect(Typhoeus::Expectation).to receive(:response_for) + hydra.add(request) + end + + it "executes all" do + expect(receive_counter).to receive(:mark).exactly(3).times + hydra.add(request) + end + end + + context "when middle false" do + before do + Typhoeus.before { |r| receive_counter.mark } + Typhoeus.before { |r| receive_counter.mark; nil } + Typhoeus.before { |r| receive_counter.mark } + end + + it "doesn't call super" do + expect(Typhoeus::Expectation).to receive(:response_for).never + hydra.add(request) + end + + it "executes only two" do + expect(receive_counter).to receive(:mark).exactly(2).times + hydra.add(request) + end + end + end + end + + context "when no before" do + it "calls super" do + expect(Typhoeus::Expectation).to receive(:response_for) + hydra.add(request) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/block_connection_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/block_connection_spec.rb new file mode 100644 index 000000000000..df3e945469bf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/block_connection_spec.rb @@ -0,0 +1,18 @@ +require 'spec_helper' + +describe Typhoeus::Hydra::BlockConnection do + let(:base_url) { "localhost:3001" } + let(:hydra) { Typhoeus::Hydra.new() } + let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } + + describe "add" do + context "when block_connection activated" do + before { Typhoeus::Config.block_connection = true } + after { Typhoeus::Config.block_connection = false } + + it "raises" do + expect{ hydra.add(request) }.to raise_error(Typhoeus::Errors::NoStub) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/cacheable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/cacheable_spec.rb new file mode 100644 index 000000000000..6e2f0ab69e45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/cacheable_spec.rb @@ -0,0 +1,88 @@ +require 'spec_helper' + +describe Typhoeus::Hydra::Cacheable do + let(:base_url) { "localhost:3001" } + let(:hydra) { Typhoeus::Hydra.new() } + let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } + let(:response) { Typhoeus::Response.new } + let(:cache) { MemoryCache.new } + + describe "add" do + context "when cache activated" do + before { Typhoeus::Config.cache = cache } + after { Typhoeus::Config.cache = false } + + context "when request new" do + it "sets no response" do + hydra.add(request) + expect(request.response).to be_nil + end + + it "doesn't call complete" do + expect(request).to receive(:complete).never + hydra.add(request) + end + end + + context "when request in memory" do + before { cache.memory[request] = response } + + it "returns response with cached status" do + hydra.add(request) + expect(response.cached?).to be_truthy + end + + context "when no queued requests" do + it "finishes request" do + expect(request).to receive(:finish).with(response) + hydra.add(request) + expect(response.cached?).to be_truthy + end + end + + context "when queued requests" do + let(:queued_request) { Typhoeus::Request.new(base_url, {:method => :get}) } + + before { cache.memory[queued_request] = response } + + it "finishes both requests" do + hydra.queue(queued_request) + expect(request).to receive(:finish).with(response) + expect(queued_request).to receive(:finish).with(response) + hydra.add(request) + end + end + end + + context "when cache is specified on a request" do + before { Typhoeus::Config.cache = false } + + context "when cache is false" do + let(:non_cached_request) { Typhoeus::Request.new(base_url, {:method => :get, :cache => false}) } + + it "initiates an HTTP call" do + expect(Typhoeus::EasyFactory).to receive(:new).with(non_cached_request, hydra).and_call_original + + hydra.add(non_cached_request) + end + end + + context "when cache is defined" do + let(:cached_request) { Typhoeus::Request.new(base_url, {:method => :get, :cache => cache}) } + + before { cache.memory[cached_request] = response } + + it "uses the cache instead of making a new request" do + expect(Typhoeus::EasyFactory).not_to receive(:new) + + hydra.add(cached_request) + + expect(cached_request.response).to be_cached + expect(cached_request.response).to eq(response) + end + end + end + + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/memoizable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/memoizable_spec.rb new file mode 100644 index 000000000000..c04f2998ae23 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/memoizable_spec.rb @@ -0,0 +1,53 @@ +require 'spec_helper' + +describe Typhoeus::Hydra::Memoizable do + let(:base_url) { "localhost:3001" } + let(:hydra) { Typhoeus::Hydra.new() } + let(:request) { Typhoeus::Request.new(base_url) } + + describe "add" do + context "when memoization activated" do + before { Typhoeus::Config.memoize = true } + + context "when request new" do + it "sets no response" do + hydra.add(request) + expect(request.response).to be_nil + end + + it "doesn't call complete" do + expect(request).to receive(:complete).never + hydra.add(request) + end + end + + context "when request in memory" do + let(:response) { Typhoeus::Response.new } + before { hydra.memory[request] = response } + + it "finishes request" do + expect(request).to receive(:finish).with(response, true) + hydra.add(request) + end + + context "when queued request" do + let(:queued_request) { Typhoeus::Request.new(base_url) } + + it "dequeues" do + hydra.queue(queued_request) + expect(request).to receive(:finish).with(response, true) + expect(queued_request).to receive(:finish).with(response, true) + hydra.add(request) + end + end + end + end + end + + describe "#run" do + it "clears memory before starting" do + expect(hydra.memory).to receive(:clear) + hydra.run + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/queueable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/queueable_spec.rb new file mode 100644 index 000000000000..d9fc87ade894 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/queueable_spec.rb @@ -0,0 +1,98 @@ +require 'spec_helper' + +describe Typhoeus::Hydra::Queueable do + let(:base_url) { "localhost:3001" } + let(:options) { {} } + let(:hydra) { Typhoeus::Hydra.new(options) } + + describe "#queue" do + let(:request) { Typhoeus::Request.new("") } + + it "accepts requests" do + hydra.queue(request) + end + + it "sets hydra on request" do + hydra.queue(request) + expect(request.hydra).to eq(hydra) + end + + it "adds to queued requests" do + hydra.queue(request) + expect(hydra.queued_requests).to include(request) + end + + it "adds to front of queued requests" do + hydra.queue_front(request) + expect(hydra.queued_requests.first).to be(request) + end + end + + describe "#abort" do + before { hydra.queued_requests << 1 } + + it "clears queue" do + hydra.abort + expect(hydra.queued_requests).to be_empty + end + end + + describe "#dequeue_many" do + before do + requests.each { |r| hydra.queue r } + end + + context "when no request queued" do + let(:requests) { [] } + + it "does nothing" do + expect(hydra).to_not receive(:add) + hydra.dequeue_many + end + end + + context "when request queued" do + let(:first) { Typhoeus::Request.new("localhost:3001/first") } + let(:requests) { [first] } + + it "adds request from queue to multi" do + expect(hydra).to receive(:add).with(first) + hydra.dequeue_many + end + end + + context "when three request queued" do + let(:first) { Typhoeus::Request.new("localhost:3001/first") } + let(:second) { Typhoeus::Request.new("localhost:3001/second") } + let(:third) { Typhoeus::Request.new("localhost:3001/third") } + let(:requests) { [first, second, third] } + + it "adds requests from queue to multi" do + expect(hydra).to receive(:add).with(first) + expect(hydra).to receive(:add).with(second) + expect(hydra).to receive(:add).with(third) + hydra.dequeue_many + end + + context "when max_concurrency is two" do + let(:options) { {:max_concurrency => 2} } + it "adds requests from queue to multi" do + expect(hydra).to receive(:add).with(first) + expect(hydra).to receive(:add).with(second) + expect(hydra).to_not receive(:add).with(third) + hydra.dequeue_many + end + end + + context "when max_concurrency is a string" do + let(:options) { {:max_concurrency => "2"} } + it "adds requests from queue to multi" do + expect(hydra).to receive(:add).with(first) + expect(hydra).to receive(:add).with(second) + expect(hydra).to_not receive(:add).with(third) + hydra.dequeue_many + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/runnable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/runnable_spec.rb new file mode 100644 index 000000000000..1e0237e23496 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/runnable_spec.rb @@ -0,0 +1,137 @@ +require 'spec_helper' + +describe Typhoeus::Hydra::Runnable do + let(:base_url) { "localhost:3001" } + let(:options) { {} } + let(:hydra) { Typhoeus::Hydra.new(options) } + let(:receive_counter) { double :mark => :twain } + + describe "#run" do + let(:requests) { [] } + + before do + requests.each { |r| hydra.queue r } + end + + it "runs multi#dequeue_many" do + expect(hydra).to receive(:dequeue_many) + hydra.run + end + + it "runs multi#perform" do + expect(hydra.multi).to receive(:perform) + hydra.run + end + + context "when request queued" do + let(:first) { Typhoeus::Request.new("localhost:3001/first") } + let(:requests) { [first] } + + it "sends" do + hydra.run + expect(first.response).to be + end + end + + context "when three request queued" do + let(:first) { Typhoeus::Request.new("localhost:3001/first") } + let(:second) { Typhoeus::Request.new("localhost:3001/second") } + let(:third) { Typhoeus::Request.new("localhost:3001/third") } + let(:requests) { [first, second, third] } + + it "sends first" do + hydra.run + expect(first.response).to be + end + + it "sends second" do + hydra.run + expect(second.response).to be + end + + it "sends third" do + hydra.run + expect(third.response).to be + end + + it "sends first first" do + first.on_complete do + expect(second.response).to be_nil + expect(third.response).to be_nil + end + end + + it "sends second second" do + first.on_complete do + expect(first.response).to be + expect(third.response).to be_nil + end + end + + it "sends thirds last" do + first.on_complete do + expect(second.response).to be + expect(third.response).to be + end + end + end + + context "when really queued request" do + let(:options) { {:max_concurrency => 1} } + let(:first) { Typhoeus::Request.new("localhost:3001/first") } + let(:second) { Typhoeus::Request.new("localhost:3001/second") } + let(:third) { Typhoeus::Request.new("localhost:3001/third") } + let(:requests) { [first, second, third] } + + it "sends first" do + hydra.run + expect(first.response).to be + end + + it "sends second" do + hydra.run + expect(second.response).to be + end + + it "sends third" do + hydra.run + expect(third.response).to be + end + end + + context "when request queued in callback" do + let(:first) do + Typhoeus::Request.new("localhost:3001/first").tap do |r| + r.on_complete{ hydra.queue(second) } + end + end + let(:second) { Typhoeus::Request.new("localhost:3001/second") } + let(:requests) { [first] } + + before { Typhoeus.on_complete { |r| receive_counter.mark } } + after { Typhoeus.on_complete.clear; Typhoeus.before.clear } + + context "when real request" do + context "when max_concurrency default" do + let(:options) { {} } + + it "calls on_complete callback once for every response" do + expect(receive_counter).to receive(:mark).exactly(2).times + hydra.run + end + end + end + + context "when no real request" do + context "when before hook returns and finishes response" do + before { Typhoeus.before{ |request| request.finish(Typhoeus::Response.new) } } + + it "simulates real multi run and adds and finishes both requests" do + expect(receive_counter).to receive(:mark).exactly(2).times + hydra.run + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/stubbable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/stubbable_spec.rb new file mode 100644 index 000000000000..6b64cc018d2c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra/stubbable_spec.rb @@ -0,0 +1,48 @@ +require 'spec_helper' + +describe Typhoeus::Hydra::Stubbable do + let(:base_url) { "localhost:3001" } + let(:request) { Typhoeus::Request.new(base_url) } + let(:response) { Typhoeus::Response.new } + let(:hydra) { Typhoeus::Hydra.new } + + before { Typhoeus.stub(base_url).and_return(response) } + + describe "#add" do + it "checks expectations" do + hydra.add(request) + end + + context "when expectation found" do + it "calls on_headers callbacks" do + canary = :not_called + request.on_headers do + canary = :called + end + hydra.add(request) + hydra.run + expect(canary).to eq(:called) + end + + it "calls on_body callbacks" do + canary = :not_called + request.on_body do + canary = :called + end + hydra.add(request) + hydra.run + expect(canary).to eq(:called) + end + + it "finishes response" do + expect(request).to receive(:finish) + hydra.add(request) + end + + it "is a mock" do + hydra.add(request) + expect(request.response.mock).to be(true) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra_spec.rb new file mode 100644 index 000000000000..a8a35aa153c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/hydra_spec.rb @@ -0,0 +1,22 @@ +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +describe Typhoeus::Hydra do + let(:base_url) { "localhost:3001" } + let(:options) { {} } + let(:hydra) { Typhoeus::Hydra.new(options) } + + describe "#new" do + let(:options) { {:pipeling => true} } + + it "passes options to multi" do + expect(Ethon::Multi).to receive(:new).with(options) + hydra + end + end + + describe "#hydra" do + it "returns a hydra" do + expect(Typhoeus::Hydra.hydra).to be_a(Typhoeus::Hydra) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/pool_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/pool_spec.rb new file mode 100644 index 000000000000..b04f433e19a8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/pool_spec.rb @@ -0,0 +1,137 @@ +require 'spec_helper' + +describe Typhoeus::Pool do + let(:easy) { Ethon::Easy.new } + after { Typhoeus::Pool.clear } + + describe "#easies" do + it "returns array" do + expect(Typhoeus::Pool.send(:easies)).to be_a(Array) + end + end + + describe "#release" do + it "resets easy" do + expect(easy).to receive(:reset) + Typhoeus::Pool.release(easy) + end + + it "flush cookies to disk" do + expect(easy).to receive(:cookielist=).with('flush') + expect(easy).to receive(:reset) + expect(easy).to receive(:cookielist=).with('all') + Typhoeus::Pool.release(easy) + end + + it "writes cookies to disk" do + tempfile1 = Tempfile.new('cookies') + tempfile2 = Tempfile.new('cookies') + + easy.cookiejar = tempfile1.path + easy.url = "localhost:3001/cookies-test" + easy.perform + + Typhoeus::Pool.release(easy) + + expect(File.zero?(tempfile1.path)).to be(false) + expect(File.read(tempfile1.path)).to match(/\s+foo\s+bar$/) + expect(File.read(tempfile1.path)).to match(/\s+bar\s+foo$/) + + # do it again - and check if tempfile1 wasn't change + easy.cookiejar = tempfile2.path + easy.url = "localhost:3001/cookies-test2" + easy.perform + + Typhoeus::Pool.release(easy) + + # tempfile 1 + expect(File.zero?(tempfile1.path)).to be(false) + expect(File.read(tempfile1.path)).to match(/\s+foo\s+bar$/) + expect(File.read(tempfile1.path)).to match(/\s+bar\s+foo$/) + + # tempfile2 + expect(File.zero?(tempfile2.path)).to be(false) + expect(File.read(tempfile2.path)).to match(/\s+foo2\s+bar$/) + expect(File.read(tempfile2.path)).to match(/\s+bar2\s+foo$/) + end + + it "puts easy back into pool" do + Typhoeus::Pool.release(easy) + expect(Typhoeus::Pool.send(:easies)).to include(easy) + end + + context "when threaded access" do + it "releases correct number of easies" do + (0..9).map do |n| + Thread.new do + Typhoeus::Pool.release(Ethon::Easy.new) + end + end.map(&:join) + expect(Typhoeus::Pool.send(:easies).size).to eq(10) + end + end + end + + describe "#get" do + context "when easy in pool" do + before { Typhoeus::Pool.send(:easies) << easy } + + it "takes" do + expect(Typhoeus::Pool.get).to eq(easy) + end + end + + context "when no easy in pool" do + it "creates" do + expect(Typhoeus::Pool.get).to be_a(Ethon::Easy) + end + + context "when threaded access" do + it "creates correct number of easies" do + queue = Queue.new + (0..9).map do |n| + Thread.new do + queue.enq(Typhoeus::Pool.get) + end + end.map(&:join) + + array = Array.new(queue.size) { queue.pop } + expect(array.uniq.size).to eq(10) + end + end + end + + context "when forked" do + before do + allow(Process).to receive(:pid).and_return(1) + Typhoeus::Pool.send(:easies) << easy + allow(Process).to receive(:pid).and_return(2) + end + + after do + allow(Process).to receive(:pid).and_call_original + Typhoeus::Pool.instance_variable_set(:@pid, Process.pid) + end + + it "creates" do + expect(Typhoeus::Pool.get).to_not eq(easy) + end + end + end + + describe "#with" do + it "is re-entrant" do + array = [] + Typhoeus::Pool.with_easy do |e1| + array << e1 + Typhoeus::Pool.with_easy do |e2| + array << e2 + Typhoeus::Pool.with_easy do |e3| + array << e3 + end + end + end + expect(array.uniq.size).to eq(3) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/actions_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/actions_spec.rb new file mode 100644 index 000000000000..03493e10f407 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/actions_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe Typhoeus::Request::Actions do + [:get, :post, :put, :delete, :head, :patch, :options].each do |name| + describe ".#{name}" do + let(:response) { Typhoeus::Request.method(name).call("http://localhost:3001") } + + it "returns ok" do + expect(response.return_code).to eq(:ok) + end + + unless name == :head + it "makes #{name.to_s.upcase} Request" do + expect(response.response_body).to include("\"REQUEST_METHOD\":\"#{name.to_s.upcase}\"") + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/before_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/before_spec.rb new file mode 100644 index 000000000000..ed39b0c9ec87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/before_spec.rb @@ -0,0 +1,93 @@ +require 'spec_helper' + +describe Typhoeus::Request::Before do + let(:request) { Typhoeus::Request.new("") } + let(:receive_counter) { double :mark => :twain } + + describe "#queue" do + context "when before" do + context "when one" do + it "executes" do + Typhoeus.before { |r| receive_counter.mark } + expect(receive_counter).to receive(:mark) + request.run + end + + context "when true" do + it "calls super" do + Typhoeus.before { true } + expect(Typhoeus::Expectation).to receive(:response_for) + request.run + end + end + + context "when false" do + it "doesn't call super" do + Typhoeus.before { false } + expect(Typhoeus::Expectation).to receive(:response_for).never + request.run + end + + it "returns response" do + Typhoeus.before { |r| r.response = 1; false } + expect(request.run).to be(1) + end + end + + context "when a response" do + it "doesn't call super" do + Typhoeus.before { Typhoeus::Response.new } + expect(Typhoeus::Expectation).to receive(:response_for).never + request.run + end + + it "returns response" do + Typhoeus.before { |r| r.response = Typhoeus::Response.new } + expect(request.run).to be_a(Typhoeus::Response) + end + end + end + + context "when multi" do + context "when all true" do + before { 3.times { Typhoeus.before { |r| receive_counter.mark } } } + + it "calls super" do + expect(Typhoeus::Expectation).to receive(:response_for) + request.run + end + + it "executes all" do + expect(receive_counter).to receive(:mark).exactly(3) + request.run + end + end + + context "when middle false" do + before do + Typhoeus.before { |r| receive_counter.mark } + Typhoeus.before { |r| receive_counter.mark; nil } + Typhoeus.before { |r| receive_counter.mark } + end + + it "doesn't call super" do + expect(Typhoeus::Expectation).to receive(:response_for).never + request.run + end + + it "executes only two" do + expect(receive_counter).to receive(:mark).exactly(2).times + request.run + end + end + end + end + + context "when no before" do + it "calls super" do + expect(Typhoeus::Expectation).to receive(:response_for) + request.run + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/block_connection_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/block_connection_spec.rb new file mode 100644 index 000000000000..2ddacdcae116 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/block_connection_spec.rb @@ -0,0 +1,75 @@ +require 'spec_helper' + +describe Typhoeus::Request::BlockConnection do + let(:base_url) { "localhost:3001" } + let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) } + + describe "run" do + context "when blocked" do + before { request.block_connection = true } + + it "raises" do + expect{ request.run }.to raise_error(Typhoeus::Errors::NoStub) + end + end + + context "when not blocked" do + before { request.block_connection = false } + + it "doesn't raise" do + expect{ request.run }.to_not raise_error + end + end + end + + describe "#blocked?" do + context "when local block_connection" do + context "when true" do + before { request.block_connection = true } + + it "returns true" do + expect(request.blocked?).to be_truthy + end + end + + context "when false" do + before { request.block_connection = false } + + it "returns false" do + expect(request.blocked?).to be_falsey + end + end + end + + context "when global block_connection" do + context "when true" do + before { Typhoeus::Config.block_connection = true } + after { Typhoeus::Config.block_connection = false } + + it "returns true" do + expect(request.blocked?).to be_truthy + end + end + + context "when false" do + before { Typhoeus::Config.block_connection = false } + + it "returns false" do + expect(request.blocked?).to be_falsey + end + end + end + + context "when global and local block_connection" do + before do + Typhoeus::Config.block_connection = true + request.block_connection = false + end + after { Typhoeus::Config.block_connection = false } + + it "takes local" do + expect(request.blocked?).to be_falsey + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/cacheable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/cacheable_spec.rb new file mode 100644 index 000000000000..bffa3e4d4217 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/cacheable_spec.rb @@ -0,0 +1,94 @@ +require 'spec_helper' + +describe Typhoeus::Request::Cacheable do + let(:cache) { MemoryCache.new } + let(:options) { {} } + let(:request) { Typhoeus::Request.new("http://localhost:3001", options) } + let(:response) { Typhoeus::Response.new } + + before { Typhoeus::Config.cache = cache } + after { Typhoeus::Config.cache = false } + + describe "#response=" do + context "when cache activated" do + context "when request new" do + it "caches response" do + request.response = response + expect(cache.memory[request]).to be + end + + it "doesn't set cached on response" do + request.response = response + expect(request.response.cached?).to be_falsey + end + end + + context "when request in memory" do + before { cache.memory[request] = response } + + it "finishes request" do + expect(request).to receive(:finish).with(response) + request.run + end + + it "sets cached to true for response" do + request.run + expect(request.response.cached?).to be_truthy + end + end + end + end + + describe "#run" do + context "when cache activated" do + context "when request new" do + it "fetches response" do + expect(request.response).to_not be(response) + end + end + + context "when request in memory" do + before { cache.memory[request] = response } + + it "finishes request" do + expect(request).to receive(:finish).with(response) + request.run + end + end + + context "when cache is specified on a request" do + before { Typhoeus::Config.cache = false } + + context "when cache is false" do + let(:options) { { :cache => false } } + + it "finishes request" do + expect(request.response).to_not be(response) + request.run + end + end + + context "when cache is defined" do + let(:options) { { :cache => cache } } + + before { cache.memory[request] = response } + + it "finishes request" do + expect(request).to receive(:finish).with(response) + request.run + end + end + end + end + end + + describe "#cache_ttl" do + context "when option[:cache_ttl]" do + let(:options) { {:cache_ttl => 1} } + + it "returns" do + expect(request.cache_ttl).to be(1) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/callbacks_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/callbacks_spec.rb new file mode 100644 index 000000000000..9b30e74b0e32 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/callbacks_spec.rb @@ -0,0 +1,91 @@ +require 'spec_helper' + +describe Typhoeus::Request::Callbacks do + let(:request) { Typhoeus::Request.new("fubar") } + + [:on_complete, :on_success, :on_failure, :on_progress].each do |callback| + describe "##{callback}" do + it "responds" do + expect(request).to respond_to(callback) + end + + context "when no block given" do + it "returns @#{callback}" do + expect(request.method(callback).call).to eq([]) + end + end + + context "when block given" do + it "stores" do + request.method(callback).call { p 1 } + expect(request.instance_variable_get("@#{callback}").size).to eq(1) + end + end + + context "when multiple blocks given" do + it "stores" do + request.method(callback).call { p 1 } + request.method(callback).call { p 2 } + expect(request.instance_variable_get("@#{callback}").size).to eq(2) + end + end + end + end + + describe "#execute_callbacks" do + [:on_complete, :on_success, :on_failure, :on_progress].each do |callback| + context "when #{callback}" do + context "when local callback" do + before do + code = if callback == :on_failure + 500 + else + 200 + end + request.response = Typhoeus::Response.new(:mock => true, :response_code => code) + request.method(callback).call {|r| expect(r).to be_a(Typhoeus::Response) } + end + + it "executes blocks and passes response" do + request.execute_callbacks + end + + it "sets handled_response" do + request.method(callback).call { 1 } + request.execute_callbacks + expect(request.response.handled_response).to be(1) + end + end + + context "when global callback" do + before do + request.response = Typhoeus::Response.new + Typhoeus.method(callback).call {|r| expect(r).to be_a(Typhoeus::Response) } + end + + it "executes blocks and passes response" do + request.execute_callbacks + end + end + + context "when global and local callbacks" do + before do + request.response = Typhoeus::Response.new + Typhoeus.method(callback).call {|r| r.instance_variable_set(:@fu, 1) } + request.method(callback).call {|r| expect(r.instance_variable_get(:@fu)).to eq(1) } + end + + it "runs global first" do + request.execute_callbacks + end + end + end + end + + context "when local on_complete and gobal on_success" do + it "runs all global callbacks first" do + skip + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/marshal_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/marshal_spec.rb new file mode 100644 index 000000000000..6ab922a57452 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/marshal_spec.rb @@ -0,0 +1,60 @@ +require 'spec_helper' + +describe Typhoeus::Request::Marshal do + let(:base_url) { "localhost:3001" } + let(:request) { Typhoeus::Request.new(base_url) } + + describe "#marshal_dump" do + %w(on_complete on_success on_failure on_progress).each do |name| + context "when #{name} handler" do + before { request.instance_variable_set("@#{name}", Proc.new{}) } + + it "doesn't include @#{name}" do + expect(request.send(:marshal_dump).map(&:first)).to_not include("@#{name}") + end + + it "doesn't raise when dumped" do + expect { Marshal.dump(request) }.to_not raise_error + end + + context "when loading" do + let(:loaded) { Marshal.load(Marshal.dump(request)) } + + it "includes base_url" do + expect(loaded.base_url).to eq(request.base_url) + end + + it "doesn't include #{name}" do + expect(loaded.instance_variables).to_not include("@#{name}") + end + end + end + end + + context 'when run through hydra' do + let(:options) { {} } + let(:hydra) { Typhoeus::Hydra.new(options) } + + before(:each) do + hydra.queue(request) + hydra.run + end + + it "doesn't include @hydra" do + expect(request.send(:marshal_dump).map(&:first)).to_not include("@hydra") + end + + context 'when loading' do + let(:loaded) { Marshal.load(Marshal.dump(request)) } + + it "includes base_url" do + expect(loaded.base_url).to eq(request.base_url) + end + + it "doesn't include #{name}" do + expect(loaded.instance_variables).to_not include("@hydra") + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/memoizable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/memoizable_spec.rb new file mode 100644 index 000000000000..1bb7ebcab56e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/memoizable_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe Typhoeus::Request::Memoizable do + let(:options) { {} } + let(:request) { Typhoeus::Request.new("fu", options) } + let(:response) { Typhoeus::Response.new } + let(:hydra) { Typhoeus::Hydra.new } + + describe "#response=" do + context "when memoization activated" do + before { Typhoeus::Config.memoize = true } + after { Typhoeus::Config.memoize = false } + + context "when GET request" do + let(:options) { {:method => :get} } + before { request.hydra = hydra } + + it "stores response in memory" do + request.response = response + expect(hydra.memory[request]).to be + end + end + + context "when no GET request" do + let(:options) { {:method => :post} } + + it "doesn't store response in memory" do + request.response = response + expect(hydra.memory[request]).to be_nil + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/operations_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/operations_spec.rb new file mode 100644 index 000000000000..79f6be0eae91 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/operations_spec.rb @@ -0,0 +1,101 @@ +require 'spec_helper' + +describe Typhoeus::Request::Operations do + let(:base_url) { "localhost:3001" } + let(:options) { {} } + let(:request) { Typhoeus::Request.new(base_url, options) } + + describe "#run" do + let(:easy) { Ethon::Easy.new } + before { expect(Typhoeus::Pool).to receive(:get).and_return(easy) } + + it "grabs an easy" do + request.run + end + + it "generates settings" do + expect(easy).to receive(:http_request) + request.run + end + + it "performs" do + expect(easy).to receive(:perform) + request.run + end + + it "sets response" do + request.run + expect(request.response).to be + end + + it "releases easy" do + expect(Typhoeus::Pool).to receive(:release) + request.run + end + + it "calls on_body" do + on_body_called = false + request.on_body { |body, response| on_body_called = true } + request.run + expect(on_body_called).to be_truthy + expect(request.response.body).to satisfy { |v| v.nil? || v == '' } + end + + it "makes response headers available to on_body" do + headers = nil + request.on_body { |body, response| headers = response.headers } + request.run + expect(headers).to be + expect(headers).to eq(request.response.headers) + end + + it "calls on_headers and on_body" do + headers = nil + request.on_headers { |response| headers = response.headers } + request.on_body { |body, response| expect(headers).not_to be_nil ; expect(response.headers).to eq(headers) } + request.on_complete { |response| expect(response).not_to be_nil ; expect(response.headers).to eq(headers) ; expect(response.body).to be_empty } + request.run + end + + it "calls on_headers and on_complete" do + headers = nil + request.on_headers { |response| headers = response.headers } + request.on_complete { |response| expect(response).not_to be_nil ; expect(response.headers).to eq(headers) ; expect(response.body).not_to be_empty } + request.run + end + + it "calls on_complete" do + callback = double(:call) + expect(callback).to receive(:call) + request.instance_variable_set(:@on_complete, [callback]) + request.run + end + + it "returns a response" do + expect(request.run).to be_a(Typhoeus::Response) + end + end + + describe "#finish" do + let(:response) { Typhoeus::Response.new } + + it "assigns response" do + request.finish(response) + expect(request.response).to be(response) + end + + it "assigns request to response" do + request.finish(response) + expect(request.response.request).to be(request) + end + + it "executes callbacks" do + expect(request).to receive(:execute_callbacks) + request.finish(response) + end + + it "returns response" do + expect(request.finish(response)).to be(response) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/responseable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/responseable_spec.rb new file mode 100644 index 000000000000..01087bc8381e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/responseable_spec.rb @@ -0,0 +1,13 @@ +require 'spec_helper' + +describe Typhoeus::Request::Responseable do + let(:request) { Typhoeus::Request.new("base_url", {}) } + let(:response) { Typhoeus::Response.new } + + describe "#response=" do + it "stores response" do + request.response = response + expect(request.response).to eq(response) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/stubbable_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/stubbable_spec.rb new file mode 100644 index 000000000000..4651d5fb988d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request/stubbable_spec.rb @@ -0,0 +1,45 @@ +require 'spec_helper' + +describe Typhoeus::Request::Stubbable do + let(:base_url) { "localhost:3001" } + let(:request) { Typhoeus::Request.new(base_url) } + let(:response) { Typhoeus::Response.new } + + before { Typhoeus.stub(base_url).and_return(response) } + + describe "#run" do + it "checks expectations" do + request.run + end + + context "when expectation found" do + it "calls on_headers callbacks" do + canary = :not_called + request.on_headers do + canary = :called + end + request.run + expect(canary).to eq(:called) + end + + it "calls on_body callbacks" do + canary = :not_called + request.on_body do + canary = :called + end + request.run + expect(canary).to eq(:called) + end + + it "finishes request" do + expect(request).to receive(:finish) + request.run + end + + it "sets mock on response" do + request.run + expect(request.response.mock).to be(true) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request_spec.rb new file mode 100644 index 000000000000..cabcb4c80d86 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/request_spec.rb @@ -0,0 +1,232 @@ +require 'spec_helper' + +describe Typhoeus::Request do + let(:base_url) { "localhost:3001" } + let(:options) { {:verbose => true, :headers => { 'User-Agent' => "Fubar", 'Expect' => "" }, :maxredirs => 50} } + let(:request) { Typhoeus::Request.new(base_url, options) } + + describe ".url" do + context "when no parameters" do + it "returns base_url" do + expect(request.url).to eq(request.base_url) + end + end + + context "when parameters" do + let(:options) { {:params => {:a => 1}} } + + it "returns full url" do + expect(request.url).to eq("#{request.base_url}?a=1") + end + end + + it "pushes an easy back into the pool" do + easy = double.as_null_object + allow(Typhoeus::Pool).to receive(:get).and_return(easy) + expect(Typhoeus::Pool).to receive(:release).with(easy) + request.url + end + end + + describe ".new" do + it "stores base_url" do + expect(request.base_url).to eq(base_url) + end + + it "stores options" do + expect(request.options).to eq(options) + end + + it "stores original options" do + expect(request.original_options).to eq(options) + expect(request.original_options).to_not be(request.options) + end + + it "sets defaults" do + expect(request.options[:headers]['User-Agent']).to be + end + end + + describe "set_defaults" do + context "when header with user agent" do + let(:options) { {:headers => {'User-Agent' => "Custom"} } } + + it "doesn't modify user agent" do + expect(request.options[:headers]['User-Agent']).to eq("Custom") + end + end + + context "when header without user agent" do + let(:options) { {:headers => {} } } + + it "add user agent" do + agent = request.options[:headers]['User-Agent'] + expect(agent).to eq(Typhoeus::USER_AGENT) + end + end + + context "when Config.user_agent set" do + before { Typhoeus.configure { |config| config.user_agent = "Default" } } + after { Typhoeus.configure { |config| config.user_agent = nil } } + + context "with headers" do + let(:options) { {:headers => { "User-Agent" => "Fubar" } } } + + it "uses the request options' user agent" do + expect(request.options[:headers]["User-Agent"]).to eq("Fubar") + end + end + + context "without headers" do + let(:options) { {:headers => {} } } + + it "uses the global options' user agent" do + expect(request.options[:headers]["User-Agent"]).to eq("Default") + end + end + end + + context "when Config.verbose set" do + before { Typhoeus.configure { |config| config.verbose = true} } + after { Typhoeus.configure { |config| config.verbose = false} } + + it "respects" do + expect(request.options[:verbose]).to be_truthy + end + end + + context "when maxredirs" do + context "when not set" do + it "defaults to 50" do + expect(request.options[:maxredirs]).to be(50) + end + end + + context "when set" do + let(:options) { {:maxredirs => 1} } + + it "respects" do + expect(request.options[:maxredirs]).to be(1) + end + end + end + + context "when Config.proxy set" do + before { Typhoeus.configure { |config| config.proxy = "http://proxy.internal" } } + after { Typhoeus.configure { |config| config.proxy = nil } } + + it "respects" do + expect(request.options[:proxy]).to eq("http://proxy.internal") + end + + context "when option proxy set" do + let(:options) { {:proxy => nil} } + + it "does not override" do + expect(request.options[:proxy]).to be_nil + end + end + end + end + + describe "#eql?" do + context "when another class" do + let(:other) { "" } + + it "returns false" do + expect(request).to_not eql other + end + end + + context "when same class" do + let(:other) { Typhoeus::Request.new("base_url", options) } + + context "when other base_url" do + it "returns false" do + expect(request).to_not eql other + end + end + + context "when same base_url and other options" do + let(:other) { Typhoeus::Request.new(base_url, {}) } + + it "returns false" do + expect(request).to_not eql other + end + end + + + context "when same base_url and options" do + context "when same order" do + let(:other) { Typhoeus::Request.new(base_url, options) } + + it "returns true" do + expect(request).to eql other + end + end + + context "when different order" do + let(:other_options) { + {:headers => { 'User-Agent' => "Fubar", 'Expect' => ""}, :verbose => true } + } + let(:other) { Typhoeus::Request.new(base_url, other_options)} + + it "returns true" do + expect(request).to eql other + end + end + end + end + end + + describe "#hash" do + context "when request.eql?(other)" do + context "when different order" do + let(:other_options) { + {:headers => { 'User-Agent' => "Fubar", 'Expect' => "" }, :verbose => true } + } + let(:other) { Typhoeus::Request.new(base_url, other_options)} + + it "has same hashes" do + expect(request.hash).to eq(other.hash) + end + end + + context "when same order" do + let(:other) { Typhoeus::Request.new(base_url, options) } + + it "has same hashes" do + expect(request.hash).to eq(other.hash) + end + end + + context "when hashes with different orders are contained in arrays" do + let(:request) { Typhoeus::Request.new(base_url, :params => [{:b => 2, :a => 1}]) } + let(:other) { Typhoeus::Request.new(base_url, :params => [{:a => 1, :b => 2}]) } + it "has different hashes" do + expect(request.hash).to eq(other.hash) + end + end + end + + context "when not request.eql?(other)" do + let(:request) { Typhoeus::Request.new(base_url, :params => {:foo => 'bar'}) } + let(:other) { Typhoeus::Request.new(base_url, :params => {:foo => 'baz'}) } + + it "has different hashes" do + expect(request.hash).to_not eq(other.hash) + end + end + end + + describe "#encoded_body" do + let(:request) { + Typhoeus::Request.new("www.example.com",:body => {:a => 1}) + } + + it "returns encoded body" do + expect(request.encoded_body).to eq("a=1") + end + end + +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response/header_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response/header_spec.rb new file mode 100644 index 000000000000..922d99ebf232 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response/header_spec.rb @@ -0,0 +1,147 @@ +require 'spec_helper' + +describe Typhoeus::Response::Header do + let(:raw) { nil } + let(:header) { Typhoeus::Response::Header.new(raw) } + + describe ".new" do + context "when string" do + let(:raw) { 'Date: Fri, 29 Jun 2012 10:09:23 GMT' } + + it "sets Date" do + expect(header['Date']).to eq('Fri, 29 Jun 2012 10:09:23 GMT') + end + + it "provides case insensitive access" do + expect(header['DaTe']).to eq('Fri, 29 Jun 2012 10:09:23 GMT') + end + + it "provides symbol access" do + expect(header[:date]).to eq('Fri, 29 Jun 2012 10:09:23 GMT') + end + end + + context "when hash" do + let(:raw) { { 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT' } } + + it "sets Date" do + expect(header['Date']).to eq(raw['Date']) + end + + it "provides case insensitive access" do + expect(header['DaTe']).to eq(raw['Date']) + end + end + end + + describe "#parse" do + context "when no header" do + it "returns nil" do + expect(header).to be_empty + end + end + + context "when header" do + let(:raw) do + 'HTTP/1.1 200 OK + Set-Cookie: NID=61=LblqYgUOu; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly + Date: Fri, 29 Jun 2012 10:09:23 GMT + Expires: -1 + Cache-Control: private, max-age=0 + Content-Type: text/html; charset=ISO-8859-1 + Set-Cookie: PREF=ID=77e93yv0hPtejLou; expires=Sun, 29-Jun-2014 10:09:23 GMT; path=/; domain=.google.de + Set-Cookie: NID=61=LblqYgh5Ou; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly + P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info." + Server: gws + X-XSS-Protection: 1; mode=block + X-Frame-Options: SAMEORIGIN + Transfer-Encoding: chunked'.gsub(/^\s{8}/, '') + end + + it "sets raw" do + expect(header.send(:raw)).to eq(raw) + end + + it "sets Set-Cookie" do + expect(header['set-cookie'].size).to eq(3) + end + + it "provides case insensitive access" do + expect(header['Set-CooKie'].size).to eq(3) + end + + [ + 'NID=61=LblqYgUOu; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly', + 'PREF=ID=77e93yv0hPtejLou; expires=Sun, 29-Jun-2014 10:09:23 GMT; path=/; domain=.google.de', + 'NID=61=LblqYgh5Ou; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly' + ].each_with_index do |cookie, i| + it "sets Cookie##{i}" do + expect(header['set-cookie']).to include(cookie) + end + end + + { + 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT', 'Expires' => '-1', + 'Cache-Control' => 'private, max-age=0', + 'Content-Type' => 'text/html; charset=ISO-8859-1', + 'P3P' => 'CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."', + 'Server' => 'gws', 'X-XSS-Protection' => '1; mode=block', + 'X-Frame-Options' => 'SAMEORIGIN', 'Transfer-Encoding' => 'chunked' + }.each do |name, value| + it "sets #{name}" do + expect(header[name.downcase]).to eq(value) + end + end + + context 'includes a multi-line header' do + let(:raw) do + 'HTTP/1.1 200 OK + Date: Fri, 29 Jun 2012 10:09:23 GMT + Content-Security-Policy: default-src "self"; + img-src * data: "self"; + upgrade-insecure-requests;'.gsub(/^\s{10}/, '') + end + + it "joins header parts" do + expect(header).to eq({ + 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT', + 'Content-Security-Policy' => 'default-src "self"; img-src * data: "self"; upgrade-insecure-requests;' + }) + end + end + + context 'includes line with only whitespace' do + let(:raw) do + 'HTTP/1.1 200 OK + Date: Fri, 29 Jun 2012 10:09:23 GMT + + '.gsub(/^\s{10}/, '') + end + + it 'ignores it' do + expect(header).to eq({ 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT' }) + end + end + + context 'with broken headers' do + let(:raw) do + 'HTTP/1.1 200 OK + Date: + Content-Type + '.gsub(/^\s{10}/, '') + end + + it 'returns empty string for invalid headers' do + expect(header.to_hash).to include({ 'Date' => '', 'Content-Type' => '' }) + end + end + end + end + + it "can be Marshal'd" do + header = Typhoeus::Response::Header.new("Foo: Bar") + expect { + Marshal.dump(header) + }.not_to raise_error + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response/informations_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response/informations_spec.rb new file mode 100644 index 000000000000..896931af0266 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response/informations_spec.rb @@ -0,0 +1,283 @@ +require 'spec_helper' + +describe Typhoeus::Response::Informations do + let(:options) { {} } + let(:response) { Typhoeus::Response.new(options) } + + describe "#return_code" do + let(:options) { { :return_code => :ok } } + + it "returns return_code from options" do + expect(response.return_code).to be(:ok) + end + end + + describe "#debug_info" do + let(:options) { { :debug_info => Ethon::Easy::DebugInfo.new } } + + it "returns debug_info from options" do + expect(response.debug_info).to be_a(Ethon::Easy::DebugInfo) + end + end + + describe "#return_message" do + let(:options) { { :return_code => :couldnt_connect } } + + it "returns a message" do + expect(response.return_message).to eq("Couldn't connect to server") + end + + describe "with nil return_code" do + let(:options) { { :return_code => nil } } + + it "returns nil" do + expect(response.return_message).to be_nil + end + end + end + + describe "#response_body" do + context "when response_body" do + let(:options) { { :response_body => "body" } } + + it "returns response_body from options" do + expect(response.response_body).to eq("body") + end + end + + context "when body" do + let(:options) { { :body => "body" } } + + it "returns body from options" do + expect(response.body).to eq("body") + end + end + end + + describe "#response_headers" do + let(:options) { { :response_headers => "Length: 1" } } + + context "when no mock" do + it "returns response_headers from options" do + expect(response.response_headers).to eq("Length: 1") + end + end + + context "when mock" do + context "when no response_headers" do + context "when headers" do + let(:options) { { :mock => true, :headers => {"Length" => 1, "Content-Type" => "text/plain" } } } + + it "constructs response_headers" do + expect(response.response_headers).to include("Length: 1") + expect(response.response_headers).to include("Content-Type: text/plain") + expect(response.response_headers).to include("\r\n") + end + end + + context "when multiple values for a header" do + let(:options) { { :mock => true, :headers => {"Length" => 1, "Content-Type" => "text/plain", "set-cookie" => ["cookieone=one","cookietwo=two"] } } } + + it "constructs response_headers" do + expect(response.response_headers).to include("Length: 1") + expect(response.response_headers).to include("Content-Type: text/plain") + expect(response.response_headers).to include("set-cookie: cookieone=one,cookietwo=two") + expect(response.response_headers).to include("\r\n") + end + end + end + end + end + + describe "#response_code" do + context "when response_code" do + let(:options) { { :response_code => "200" } } + + it "returns response_code from options" do + expect(response.response_code).to eq(200) + end + end + + context "when code" do + let(:options) { { :code => "200" } } + + it "returns code from options" do + expect(response.code).to eq(200) + end + end + end + + describe "#httpauth_avail" do + let(:options) { { :httpauth_avail => "code" } } + + it "returns httpauth_avail from options" do + expect(response.httpauth_avail).to eq("code") + end + end + + describe "#total_time" do + let(:options) { { :total_time => 1 } } + + it "returns total_time from options" do + expect(response.total_time).to eq(1) + end + end + + describe "#starttransfer_time" do + let(:options) { { :starttransfer_time => 1 } } + + it "returns starttransfer_time from options" do + expect(response.starttransfer_time).to eq(1) + end + end + + describe "#appconnect_time" do + let(:options) { { :appconnect_time => 1 } } + + it "returns appconnect_time from options" do + expect(response.appconnect_time).to eq(1) + end + end + + describe "#pretransfer_time" do + let(:options) { { :pretransfer_time => 1 } } + + it "returns pretransfer_time from options" do + expect(response.pretransfer_time).to eq(1) + end + end + + describe "#connect_time" do + let(:options) { { :connect_time => 1 } } + + it "returns connect_time from options" do + expect(response.connect_time).to eq(1) + end + end + + describe "#namelookup_time" do + let(:options) { { :namelookup_time => 1 } } + + it "returns namelookup_time from options" do + expect(response.namelookup_time).to eq(1) + end + end + + describe "#redirect_time" do + let(:options) { { :redirect_time => 1 } } + + it "returns redirect_time from options" do + expect(response.redirect_time).to eq(1) + end + end + + describe "#effective_url" do + let(:options) { { :effective_url => "http://www.example.com" } } + + it "returns effective_url from options" do + expect(response.effective_url).to eq("http://www.example.com") + end + end + + describe "#primary_ip" do + let(:options) { { :primary_ip => "127.0.0.1" } } + + it "returns primary_ip from options" do + expect(response.primary_ip).to eq("127.0.0.1") + end + end + + describe "#redirect_count" do + let(:options) { { :redirect_count => 2 } } + + it "returns redirect_count from options" do + expect(response.redirect_count).to eq(2) + end + end + + describe "#request_size" do + let(:options) { { :request_size => 2 } } + + it "returns request_size from options" do + expect(response.request_size).to eq(2) + end + end + + describe "#headers" do + context "when no response_headers" do + it "returns nil" do + expect(response.headers).to be_nil + end + end + + context "when response_headers" do + let(:options) { {:response_headers => "Expire: -1\nServer: gws"} } + + it "returns nonempty headers" do + expect(response.headers).to_not be_empty + end + + it "has Expire" do + expect(response.headers['expire']).to eq('-1') + end + + it "has Server" do + expect(response.headers['server']).to eq('gws') + end + end + + context "when multiple headers" do + let(:options) { {:response_headers => "Server: A\r\n\r\nServer: B"} } + + it "returns the last" do + expect(response.headers['server']).to eq("B") + end + end + + context "when mock" do + context "when headers" do + let(:options) { {:mock => true, :headers => {"Length" => "1"}} } + + it "returns Typhoeus::Response::Header" do + expect(response.headers).to be_a(Typhoeus::Response::Header) + end + + it "returns headers" do + expect(response.headers.to_hash).to include("Length" => "1") + end + end + end + + context "when requesting" do + let(:response) { Typhoeus.get("localhost:3001") } + + it "returns headers" do + expect(response.headers).to_not be_empty + end + end + end + + describe "#redirections" do + context "when no response_headers" do + it "returns empty array" do + expect(response.redirections).to be_empty + end + end + + context "when headers" do + let(:options) { {:response_headers => "Expire: -1\nServer: gws"} } + + it "returns empty array" do + expect(response.redirections).to be_empty + end + end + + context "when multiple headers" do + let(:options) { {:response_headers => "Server: A\r\n\r\nServer: B"} } + + it "returns response from all but last headers" do + expect(response.redirections.size).to eq(1) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response/status_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response/status_spec.rb new file mode 100644 index 000000000000..64ba1e0d972f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response/status_spec.rb @@ -0,0 +1,256 @@ +require 'spec_helper' + +describe Typhoeus::Response::Status do + let(:response) { Typhoeus::Response.new(options) } + let(:options) { {} } + + describe "timed_out?" do + context "when return code is operation_timedout" do + let(:options) { {:return_code => :operation_timedout} } + + it "return true" do + expect(response).to be_timed_out + end + end + end + + describe "#status_message" do + context "when no header" do + it "returns nil" do + expect(response.status_message).to be_nil + end + end + + context "when header" do + context "when no message" do + let(:options) { {:response_headers => "HTTP/1.1 200\r\n"} } + + it "returns nil" do + expect(response.status_message).to be_nil + end + end + + context "when messsage" do + let(:options) { {:response_headers => "HTTP/1.1 200 message\r\n"} } + + it "returns message" do + expect(response.status_message).to eq("message") + end + end + end + end + + describe "#http_version" do + context "when no header" do + it "returns nil" do + expect(response.http_version).to be_nil + end + end + + context "when header" do + context "when no http version" do + let(:options) { {:response_headers => "HTTP OK"} } + + it "returns nil" do + expect(response.http_version).to be_nil + end + end + + context "when invalid http_version" do + let(:options) { {:response_headers => "HTTP foo/bar OK"} } + + it "returns nil" do + expect(response.http_version).to be_nil + end + end + + context "when valid http_version" do + let(:options) { {:response_headers => "HTTP/1.1 OK"} } + + it "returns http_version" do + expect(response.http_version).to eq("1.1") + end + end + end + end + + describe "#success?" do + context "when response code 200-299" do + let(:options) { {:return_code => return_code, :response_code => 201} } + + context "when mock" do + before { response.mock = true } + + context "when return_code :ok" do + let(:return_code) { :ok } + + it "returns true" do + expect(response.success?).to be_truthy + end + end + + context "when return_code nil" do + let(:return_code) { nil } + + it "returns true" do + expect(response.success?).to be_truthy + end + end + end + + context "when no mock" do + before { response.mock = nil } + + context "when return_code :ok" do + let(:return_code) { :ok } + + it "returns true" do + expect(response.success?).to be_truthy + end + end + + context "when return_code nil" do + let(:return_code) { nil } + + it "returns false" do + expect(response.success?).to be_falsey + end + end + end + end + + context "when response code is not 200-299" do + let(:options) { {:return_code => :ok, :response_code => 500} } + + it "returns false" do + expect(response.success?).to be_falsey + end + end + end + + describe "#failure?" do + context "when response code between 300-526 and 100-300" do + let(:options) { {:return_code => return_code, :response_code => 300} } + + context "when mock" do + before { response.mock = true } + + context "when return_code :internal_server_error" do + let(:return_code) { :internal_server_error } + + it "returns true" do + expect(response.failure?).to be_truthy + end + end + + context "when return_code nil" do + let(:return_code) { nil } + + it "returns true" do + expect(response.failure?).to be_truthy + end + end + end + + context "when no mock" do + before { response.mock = nil } + + context "when return_code :internal_server_error" do + let(:return_code) { :internal_server_error } + + it "returns true" do + expect(response.failure?).to be_truthy + end + end + + context "when return_code nil" do + let(:return_code) { nil } + + it "returns false" do + expect(response.failure?).to be_falsey + end + end + end + end + + context "when response code is not 300-526" do + let(:options) { {:return_code => :ok, :response_code => 200} } + + it "returns false" do + expect(response.failure?).to be_falsey + end + end + end + + describe "#modified?" do + context "when response code 304" do + let(:options) { {:return_code => :ok, :response_code => 304} } + + context "when mock" do + before { response.mock = true } + + context "when return_code :ok" do + let(:return_code) { :ok } + + it "returns false" do + expect(response.modified?).to be_falsey + end + end + + context "when return_code nil" do + let(:return_code) { nil } + + it "returns false" do + expect(response.modified?).to be_falsey + end + end + end + + context "when no mock" do + before { response.mock = nil } + + context "when return_code :ok" do + let(:return_code) { :ok } + + it "returns false" do + expect(response.modified?).to be_falsey + end + end + + context "when return_code nil" do + let(:return_code) { nil } + + it "returns true" do + expect(response.modified?).to be_falsey + end + end + end + end + + context "when response code is not 304" do + let(:options) { {:return_code => :ok, :response_code => 500} } + + it "returns true" do + expect(response.modified?).to be_truthy + end + end + end + + describe "#first_header_line" do + context "when multiple header" do + let(:options) { {:response_headers => "1\r\n\r\n2\r\nbla"} } + + it "returns first line of last block" do + expect(response.method(:first_header_line).call).to eq("2") + end + end + + context "when single header" do + let(:options) { {:response_headers => "1"} } + + it "returns first line" do + expect(response.method(:first_header_line).call).to eq("1") + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response_spec.rb new file mode 100644 index 000000000000..02512f4ea907 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus/response_spec.rb @@ -0,0 +1,100 @@ +require 'spec_helper' + +describe Typhoeus::Response do + let(:response) { Typhoeus::Response.new(options) } + let(:options) { {} } + + describe ".new" do + context "when options" do + context "when return_code" do + let(:options) { {:return_code => 2} } + + it "stores" do + expect(response.options[:return_code]).to be(2) + end + end + + context "when headers" do + let(:options) { {:headers => {'A' => 'B'}} } + + it "stores unmodified" do + expect(response.options[:headers]).to be(options[:headers]) + end + + it "sets @headers to a Typhoeus::Response::Header" do + expect(response.instance_variable_get(:@headers)).to be_a(Typhoeus::Response::Header) + end + + it "has key" do + expect(response.headers['A']).to eq('B') + end + end + end + end + + describe "#mock" do + context "when @mock" do + before { response.mock = true } + + it "returns @mock" do + expect(response.mock).to be_truthy + end + end + + context "when options[:mock]" do + let(:options) { {:mock => true} } + + it "returns options[:mock]" do + expect(response.mock).to be_truthy + end + end + + context "when @mock and options[:mock]" do + let(:options) { {:mock => 1} } + before { response.mock = 2 } + + it "returns @mock" do + expect(response.mock).to be(2) + end + end + end + + describe "#handled_response" do + let(:handled_response) { Typhoeus::Response.new } + + context "when @handled_response" do + before { response.handled_response = handled_response } + + it "returns @handled_response" do + expect(response.handled_response).to be(handled_response) + end + end + + context "when @handled_response is nil" do + before { response.handled_response = nil } + + it "returns response" do + expect(response.handled_response).to be(response) + end + end + end + + describe "#cached" do + context "when @cached" do + before { response.cached = true } + + it "returns cached status" do + expect(response.cached?).to be_truthy + end + end + + context "when @cached is nil" do + before { response.cached = nil } + + it "returns false" do + expect(response.cached?).to be_falsey + end + end + + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus_spec.rb b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus_spec.rb new file mode 100644 index 000000000000..6432c8d83138 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/spec/typhoeus_spec.rb @@ -0,0 +1,105 @@ +require 'spec_helper' + +describe Typhoeus do + before(:each) do + Typhoeus.configure { |config| config.verbose = false; config.block_connection = false } + end + + describe ".configure" do + it "yields config" do + Typhoeus.configure do |config| + expect(config).to be_a(Typhoeus::Config) + end + end + + it "sets values config" do + Typhoeus::Config.verbose = true + expect(Typhoeus::Config.verbose).to be_truthy + end + end + + describe ".stub" do + let(:base_url) { "www.example.com" } + + shared_examples "lazy response construction" do + it "calls the block to construct a response when a request matches the stub" do + expected_response = Typhoeus::Response.new + Typhoeus.stub(base_url) do |request| + expected_response + end + + response = Typhoeus.get(base_url) + + expect(response).to be(expected_response) + end + end + + context "when no similar expectation exists" do + include_examples "lazy response construction" + + it "returns expectation" do + expect(Typhoeus.stub(base_url)).to be_a(Typhoeus::Expectation) + end + + it "adds expectation" do + Typhoeus.stub(:get, "") + expect(Typhoeus::Expectation.all.size).to eq(1) + end + end + + context "when similar expectation exists" do + include_examples "lazy response construction" + + let(:expectation) { Typhoeus::Expectation.new(base_url) } + before { Typhoeus::Expectation.all << expectation } + + it "returns expectation" do + expect(Typhoeus.stub(base_url)).to be_a(Typhoeus::Expectation) + end + + it "doesn't add expectation" do + Typhoeus.stub(base_url) + expect(Typhoeus::Expectation.all.size).to eq(1) + end + end + end + + describe ".before" do + it "adds callback" do + Typhoeus.before { true } + expect(Typhoeus.before.size).to eq(1) + end + end + + describe ".with_connection" do + it "executes block with block connection is false" do + Typhoeus.with_connection { expect(Typhoeus::Config.block_connection).to be(false) } + end + + it "sets block connection back to previous value" do + Typhoeus::Config.block_connection = true + Typhoeus.with_connection {} + expect(Typhoeus::Config.block_connection).to be(true) + end + + it "returns result of block" do + expect(Typhoeus.with_connection { "123" }).to eq("123") + end + end + + [:get, :post, :put, :delete, :head, :patch, :options].each do |name| + describe ".#{name}" do + let(:response) { Typhoeus::Request.method(name).call("http://localhost:3001") } + + it "returns ok" do + expect(response.return_code).to eq(:ok) + end + + unless name == :head + it "makes #{name.to_s.upcase} requests" do + expect(response.response_body).to include("\"REQUEST_METHOD\":\"#{name.to_s.upcase}\"") + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/typhoeus.gemspec b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/typhoeus.gemspec new file mode 100644 index 000000000000..39bcc7a6a54d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/typhoeus-1.4.0/typhoeus.gemspec @@ -0,0 +1,25 @@ +# encoding: utf-8 +lib = File.expand_path('../lib/', __FILE__) +$:.unshift lib unless $:.include?(lib) + +require 'typhoeus/version' + +Gem::Specification.new do |s| + s.name = "typhoeus" + s.version = Typhoeus::VERSION + s.platform = Gem::Platform::RUBY + s.authors = ["David Balatero", "Paul Dix", "Hans Hasselberg"] + s.email = ["hans.hasselberg@gmail.com"] + s.homepage = "https://github.com/typhoeus/typhoeus" + s.summary = "Parallel HTTP library on top of libcurl multi." + s.description = %q{Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic.} + + s.required_rubygems_version = ">= 1.3.6" + s.license = 'MIT' + + s.add_dependency('ethon', [">= 0.9.0"]) + + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- spec/*`.split("\n") + s.require_path = 'lib' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/.yardopts b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/.yardopts new file mode 100644 index 000000000000..aa3b2300fae7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/.yardopts @@ -0,0 +1,6 @@ +--no-private +lib/**/*.rb +- +CHANGES.md +LICENSE +README.md diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/CHANGES.md b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/CHANGES.md new file mode 100644 index 000000000000..4705ec2cf797 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/CHANGES.md @@ -0,0 +1,824 @@ +Version 1.2.9 - 16-Dec-2020 +--------------------------- + +* Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a + zoneinfo file that includes rules specifying an additional transition to the + final defined offset (for example, Africa/Casablanca in version 2018e of the + Time Zone Database). #123. + + +Version 1.2.8 - 8-Nov-2020 +-------------------------- + +* Added support for handling "slim" format zoneinfo files that are produced by + default by zic version 2020b and later. The POSIX-style TZ string is now used + calculate DST transition times after the final defined transition in the file. + The 64-bit section is now always used regardless of whether Time has support + for 64-bit times. #120. +* Rubinius is no longer supported. + + +Version 1.2.7 - 2-Apr-2020 +-------------------------- + +* Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114. +* Fixed warnings when running on Ruby 2.8. #112. + + +Version 1.2.6 - 24-Dec-2019 +--------------------------- + +* Timezone#strftime('%s', time) will now return the correct number of seconds + since the epoch. #91. +* Removed the unused TZInfo::RubyDataSource::REQUIRE_PATH constant. +* Fixed "SecurityError: Insecure operation - require" exceptions when loading + data with recent Ruby releases in safe mode. +* Fixed warnings when running on Ruby 2.7. #106 and #111. + + +Version 1.2.5 - 4-Feb-2018 +-------------------------- + +* Support recursively (deep) freezing Country and Timezone instances. #80. +* Allow negative daylight savings time offsets to be derived when reading from + zoneinfo files. The utc_offset and std_offset are now derived correctly for + Europe/Dublin in the 2018a and 2018b releases of the Time Zone Database. + + +Version 1.2.4 - 26-Oct-2017 +--------------------------- + +* Ignore the leapseconds file that is included in zoneinfo directories installed + with version 2017c and later of the Time Zone Database. + + +Version 1.2.3 - 25-Mar-2017 +--------------------------- + +* Reduce the number of String objects allocated when loading zoneinfo files. + #54. +* Make Timezone#friendly_identifier compatible with frozen string literals. +* Improve the algorithm for deriving the utc_offset from zoneinfo files. This + now correctly handles Pacific/Apia switching from one side of the + International Date Line to the other whilst observing daylight savings time. + #66. +* Fix an UnknownTimezone exception when calling transitions_up_to or + offsets_up_to on a TimezoneProxy instance obtained from Timezone.get_proxy. +* Allow the Factory zone to be obtained from the Zoneinfo data source. +* Ignore the /usr/share/zoneinfo/timeconfig symlink included in Slackware + distributions. #64. +* Fix Timezone#strftime handling of %Z expansion when %Z is prefixed with more + than one percent. #31. +* Support expansion of %z, %:z, %::z and %:::z to the UTC offset of the time + zone in Timezone#strftime. #31 and #67. + + +Version 1.2.2 - 8-Aug-2014 +-------------------------- + +* Fix an error with duplicates being returned by Timezone#all_country_zones + and Timezone#all_country_zone_identifiers when used with tzinfo-data + v1.2014.6 or later. +* Use the zone1970.tab file for country timezone data if it is found in the + zoneinfo directory (and fallback to zone.tab if not). zone1970.tab was added + in tzdata 2014f. zone.tab is now deprecated. + + +Version 1.2.1 - 1-Jun-2014 +-------------------------- + +* Support zoneinfo files generated with zic version 2014c and later. +* On platforms that only support positive 32-bit timestamps, ensure that + conversions are accurate from the epoch instead of just from the first + transition after the epoch. +* Minor documentation improvements. + + +Version 1.2.0 - 26-May-2014 +--------------------------- + +* Raise the minimum supported Ruby version to 1.8.7. +* Support loading system zoneinfo data on FreeBSD, OpenBSD and Solaris. + Resolves #15. +* Add canonical_identifier and canonical_zone methods to Timezone. Resolves #16. +* Add a link to a DataSourceNotFound help page in the TZInfo::DataSourceNotFound + exception message. +* Load iso3166.tab and zone.tab files as UTF-8. +* Fix Timezone#local_to_utc returning local Time instances on systems using UTC + as the local time zone. Resolves #13. +* Fix == methods raising an exception when passed an instance of a different + class by making <=> return nil if passed a non-comparable argument. +* Eliminate "require 'rational'" warnings. Resolves #10. +* Eliminate "assigned but unused variable - info" warnings. Resolves #11. +* Switch to minitest v5 for unit tests. Resolves #18. + + +Version 1.1.0 - 25-Sep-2013 +--------------------------- + +* TZInfo is now thread safe. ThreadSafe::Cache is now used instead of Hash + to cache Timezone and Country instances returned by Timezone.get and + Country.get. The tzinfo gem now depends on thread_safe ~> 0.1. +* Added a transitions_up_to method to Timezone that returns a list of the times + where the UTC offset of the timezone changes. +* Added an offsets_up_to method to Timezone that returns the set of offsets + that have been observed in a defined timezone. +* Fixed a "can't modify frozen String" error when loading a Timezone from a + zoneinfo file using an identifier String that is both tainted and frozen. + Resolves #3. +* Support TZif3 format zoneinfo files (now produced by zic from tzcode version + 2013e onwards). +* Support using YARD to generate documentation (added a .yardopts file). +* Ignore the +VERSION file included in the zoneinfo directory on Mac OS X. +* Added a note to the documentation concerning 32-bit zoneinfo files (as + included with Mac OS X). + + +Version 1.0.1 - 22-Jun-2013 +--------------------------- + +* Fix a test case failure when tests are run from a directory that contains a + dot in the path (issue #29751). + + +Version 1.0.0 - 2-Jun-2013 +-------------------------- + +* Allow TZInfo to be used with different data sources instead of just the + built-in Ruby module data files. +* Include a data source that allows TZInfo to load data from the binary + zoneinfo files produced by zic and included with many Linux and Unix-like + distributions. +* Remove the definition and index Ruby modules from TZInfo and move them into + a separate TZInfo::Data library (available as the tzinfo-data gem). +* Default to using the TZInfo::Data library as the data source if it is + installed, otherwise use zoneinfo files instead. +* Preserve the nanoseconds of local timezone Time objects when performing + conversions (issue #29705). +* Don't add the tzinfo lib directory to the search path when requiring 'tzinfo'. + The tzinfo lib directory must now be in the search path before 'tzinfo' is + required. +* Add utc_start_time, utc_end_time, local_start_time and local_end_time instance + methods to TimezonePeriod. These return an identical value as the existing + utc_start, utc_end, local_start and local_end methods, but return Time + instances instead of DateTime. +* Make the start_transition, end_transition and offset properties of + TimezonePeriod protected. To access properties of the period, callers should + use other TimezonePeriod instance methods instead (issue #7655). + + +Version 0.3.53 (tzdata v2017b) - 23-Mar-2017 +-------------------------------------------- + +* Updated to tzdata version 2017b + (https://mm.icann.org/pipermail/tz-announce/2017-March/000046.html). + + +Version 0.3.52 (tzdata v2016h) - 28-Oct-2016 +-------------------------------------------- + +* Updated to tzdata version 2016h + (https://mm.icann.org/pipermail/tz-announce/2016-October/000042.html). + + +Version 0.3.51 (tzdata v2016f) - 5-Jul-2016 +------------------------------------------- + +* Updated to tzdata version 2016f + (https://mm.icann.org/pipermail/tz-announce/2016-July/000040.html). + + +Version 0.3.50 (tzdata v2016e) - 14-Jun-2016 +-------------------------------------------- + +* Updated to tzdata version 2016e + (https://mm.icann.org/pipermail/tz-announce/2016-June/000039.html). + + +Version 0.3.49 (tzdata v2016d) - 18-Apr-2016 +-------------------------------------------- + +* Updated to tzdata version 2016d + (https://mm.icann.org/pipermail/tz-announce/2016-April/000038.html). + + +Version 0.3.48 (tzdata v2016c) - 23-Mar-2016 +-------------------------------------------- + +* Updated to tzdata version 2016c + (https://mm.icann.org/pipermail/tz-announce/2016-March/000037.html). + + +Version 0.3.47 (tzdata v2016b) - 15-Mar-2016 +-------------------------------------------- + +* Updated to tzdata version 2016b + (https://mm.icann.org/pipermail/tz-announce/2016-March/000036.html). + + +Version 0.3.46 (tzdata v2015g) - 2-Dec-2015 +------------------------------------------- + +* From version 2015e, the IANA time zone database uses non-ASCII characters in + country names. Backport the encoding handling from TZInfo::Data to allow + TZInfo 0.3.x to support Ruby 1.9 (which would otherwise fail with an invalid + byte sequence error when loading the countries index). Resolves #41. + + +Version 0.3.45 (tzdata v2015g) - 3-Oct-2015 +------------------------------------------- + +* Updated to tzdata version 2015g + (https://mm.icann.org/pipermail/tz-announce/2015-October/000034.html). + + +Version 0.3.44 (tzdata v2015d) - 24-Apr-2015 +-------------------------------------------- + +* Updated to tzdata version 2015d + (https://mm.icann.org/pipermail/tz-announce/2015-April/000031.html). + + +Version 0.3.43 (tzdata v2015a) - 31-Jan-2015 +-------------------------------------------- + +* Updated to tzdata version 2015a + (https://mm.icann.org/pipermail/tz-announce/2015-January/000028.html). + + +Version 0.3.42 (tzdata v2014i) - 23-Oct-2014 +-------------------------------------------- + +* Updated to tzdata version 2014i + (https://mm.icann.org/pipermail/tz-announce/2014-October/000026.html). + + +Version 0.3.41 (tzdata v2014f) - 8-Aug-2014 +------------------------------------------- + +* Updated to tzdata version 2014f + (https://mm.icann.org/pipermail/tz-announce/2014-August/000023.html). + + +Version 0.3.40 (tzdata v2014e) - 10-Jul-2014 +-------------------------------------------- + +* Updated to tzdata version 2014e + (https://mm.icann.org/pipermail/tz-announce/2014-June/000022.html). + + +Version 0.3.39 (tzdata v2014a) - 9-Mar-2014 +------------------------------------------- + +* Updated to tzdata version 2014a + (https://mm.icann.org/pipermail/tz-announce/2014-March/000018.html). + + +Version 0.3.38 (tzdata v2013g) - 8-Oct-2013 +------------------------------------------- + +* Updated to tzdata version 2013g + (https://mm.icann.org/pipermail/tz-announce/2013-October/000015.html). + + +Version 0.3.37 (tzdata v2013b) - 11-Mar-2013 +-------------------------------------------- + +* Updated to tzdata version 2013b + (https://mm.icann.org/pipermail/tz-announce/2013-March/000010.html). + + +Version 0.3.36 (tzdata v2013a) - 3-Mar-2013 +------------------------------------------- + +* Updated to tzdata version 2013a + (https://mm.icann.org/pipermail/tz-announce/2013-March/000009.html). +* Fix TimezoneTransitionInfo#eql? incorrectly returning false when running on + Ruby 2.0. +* Change eql? and == implementations to test the class of the passed in object + instead of checking individual properties with 'respond_to?'. + + +Version 0.3.35 (tzdata v2012i) - 4-Nov-2012 +------------------------------------------- + +* Updated to tzdata version 2012i + (https://mm.icann.org/pipermail/tz-announce/2012-November/000007.html). + + +Version 0.3.34 (tzdata v2012h) - 27-Oct-2012 +-------------------------------------------- + +* Updated to tzdata version 2012h + (https://mm.icann.org/pipermail/tz-announce/2012-October/000006.html). + + +Version 0.3.33 (tzdata v2012c) - 8-Apr-2012 +------------------------------------------- + +* Updated to tzdata version 2012c + (https://mm.icann.org/pipermail/tz/2012-April/017627.html). + + +Version 0.3.32 (tzdata v2012b) - 4-Mar-2012 +------------------------------------------- + +* Updated to tzdata version 2012b + (https://mm.icann.org/pipermail/tz/2012-March/017524.html). + + +Version 0.3.31 (tzdata v2011n) - 6-Nov-2011 +------------------------------------------- + +* Updated to tzdata version 2011n + (https://mm.icann.org/pipermail/tz/2011-October/017201.html). + + +Version 0.3.30 (tzdata v2011k) - 29-Sep-2011 +-------------------------------------------- + +* Updated to tzdata version 2011k + (https://mm.icann.org/pipermail/tz/2011-September/008889.html). + + +Version 0.3.29 (tzdata v2011h) - 27-Jun-2011 +-------------------------------------------- + +* Updated to tzdata version 2011h + (https://mm.icann.org/pipermail/tz/2011-June/008576.html). +* Allow the default value of the local_to_utc and period_for_local dst + parameter to be specified globally with a Timezone.default_dst attribute. + Thanks to Kurt Werle for the suggestion and patch. + + + Version 0.3.28 (tzdata v2011g) - 13-Jun-2011 +--------------------------------------------- + +* Add support for Ruby 1.9.3 (trunk revision 31668 and later). Thanks to + Aaron Patterson for reporting the problems running on the new version. + Closes #29233. + + +Version 0.3.27 (tzdata v2011g) - 26-Apr-2011 +-------------------------------------------- + +* Updated to tzdata version 2011g + (https://mm.icann.org/pipermail/tz/2011-April/016875.html). + + +Version 0.3.26 (tzdata v2011e) - 2-Apr-2011 +------------------------------------------- + +* Updated to tzdata version 2011e + (https://mm.icann.org/pipermail/tz/2011-April/016809.html). + + +Version 0.3.25 (tzdata v2011d) - 14-Mar-2011 +-------------------------------------------- + +* Updated to tzdata version 2011d + (https://mm.icann.org/pipermail/tz/2011-March/016746.html). + + +Version 0.3.24 (tzdata v2010o) - 15-Jan-2011 +-------------------------------------------- + +* Updated to tzdata version 2010o + (https://mm.icann.org/pipermail/tz/2010-November/016517.html). + + +Version 0.3.23 (tzdata v2010l) - 19-Aug-2010 +-------------------------------------------- + +* Updated to tzdata version 2010l + (https://mm.icann.org/pipermail/tz/2010-August/016360.html). + + +Version 0.3.22 (tzdata v2010j) - 29-May-2010 +-------------------------------------------- + +* Corrected file permissions issue with 0.3.21 release. + + +Version 0.3.21 (tzdata v2010j) - 28-May-2010 +-------------------------------------------- + +* Updated to tzdata version 2010j + (https://mm.icann.org/pipermail/tz/2010-May/016211.html). +* Change invalid timezone check to exclude characters not used in timezone + identifiers and avoid 'character class has duplicated range' warnings with + Ruby 1.9.2. +* Ruby 1.9.2 has deprecated "require 'rational'", but older versions of + Ruby need rational to be required. Require rational only when the Rational + module has not already been loaded. +* Remove circular requires (now a warning in Ruby 1.9.2). Instead of using + requires in each file for dependencies, tzinfo.rb now requires all tzinfo + files. If you were previously requiring files within the tzinfo directory + (e.g. require 'tzinfo/timezone'), then you will now have to + require 'tzinfo' instead. + + +Version 0.3.20 (tzdata v2010i) - 19-Apr-2010 +-------------------------------------------- + +* Updated to tzdata version 2010i + (https://mm.icann.org/pipermail/tz/2010-April/016184.html). + + +Version 0.3.19 (tzdata v2010h) - 5-Apr-2010 +------------------------------------------- + +* Updated to tzdata version 2010h + (https://mm.icann.org/pipermail/tz/2010-April/016161.html). + + +Version 0.3.18 (tzdata v2010g) - 29-Mar-2010 +-------------------------------------------- + +* Updated to tzdata version 2010g + (https://mm.icann.org/pipermail/tz/2010-March/016140.html). + + +Version 0.3.17 (tzdata v2010e) - 8-Mar-2010 +------------------------------------------- + +* Updated to tzdata version 2010e + (https://mm.icann.org/pipermail/tz/2010-March/016088.html). + + +Version 0.3.16 (tzdata v2009u) - 5-Jan-2010 +------------------------------------------- + +* Support the use of '-' to denote '0' as an offset in the tz data files. + Used for the first time in the SAVE field in tzdata v2009u. +* Updated to tzdata version 2009u + (https://mm.icann.org/pipermail/tz/2009-December/016001.html). + + +Version 0.3.15 (tzdata v2009p) - 26-Oct-2009 +-------------------------------------------- + +* Updated to tzdata version 2009p + (https://mm.icann.org/pipermail/tz/2009-October/015889.html). +* Added a description to the gem spec. +* List test files in test_files instead of files in the gem spec. + + +Version 0.3.14 (tzdata v2009l) - 19-Aug-2009 +-------------------------------------------- + +* Updated to tzdata version 2009l + (https://mm.icann.org/pipermail/tz/2009-August/015729.html). +* Include current directory in load path to allow running tests on + Ruby 1.9.2, which doesn't include it by default any more. + + +Version 0.3.13 (tzdata v2009f) - 15-Apr-2009 +-------------------------------------------- + +* Updated to tzdata version 2009f + (https://mm.icann.org/pipermail/tz/2009-April/015544.html). +* Untaint the timezone module filename after validation to allow use + with $SAFE == 1 (e.g. under mod_ruby). Thanks to Dmitry Borodaenko for + the suggestion. Closes #25349. + + +Version 0.3.12 (tzdata v2008i) - 12-Nov-2008 +-------------------------------------------- + +* Updated to tzdata version 2008i + (https://mm.icann.org/pipermail/tz/2008-October/015260.html). + + +Version 0.3.11 (tzdata v2008g) - 7-Oct-2008 +------------------------------------------- + +* Updated to tzdata version 2008g + (https://mm.icann.org/pipermail/tz/2008-October/015139.html). +* Support Ruby 1.9.0-5. Rational.new! has now been removed in Ruby 1.9. + Only use Rational.new! if it is available (it is preferable in Ruby 1.8 + for performance reasons). Thanks to Jeremy Kemper and Pratik Naik for + reporting this. Closes #22312. +* Apply a patch from Pratik Naik to replace assert calls that have been + deprecated in the Ruby svn trunk. Closes #22308. + + +Version 0.3.10 (tzdata v2008f) - 16-Sep-2008 +-------------------------------------------- + +* Updated to tzdata version 2008f + (https://mm.icann.org/pipermail/tz/2008-September/015090.html). + + +Version 0.3.9 (tzdata v2008c) - 27-May-2008 +------------------------------------------- + +* Updated to tzdata version 2008c + (https://mm.icann.org/pipermail/tz/2008-May/014956.html). +* Support loading timezone data in the latest trunk versions of Ruby 1.9. + Rational.new! is now private, so call it using Rational.send :new! instead. + Thanks to Jeremy Kemper and Pratik Naik for spotting this. Closes #19184. +* Prevent warnings from being output when running Ruby with the -v or -w + command line options. Thanks to Paul McMahon for the patch. Closes #19719. + + +Version 0.3.8 (tzdata v2008b) - 24-Mar-2008 +------------------------------------------- + +* Updated to tzdata version 2008b + (https://mm.icann.org/pipermail/tz/2008-March/014910.html). +* Support loading timezone data in Ruby 1.9.0. Use DateTime.new! if it is + available instead of DateTime.new0 when constructing transition times. + DateTime.new! was added in Ruby 1.8.6. DateTime.new0 was removed in + Ruby 1.9.0. Thanks to Joshua Peek for reporting this. Closes #17606. +* Modify some of the equality test cases to cope with the differences + between Ruby 1.8.6 and Ruby 1.9.0. + + +Version 0.3.7 (tzdata v2008a) - 10-Mar-2008 +------------------------------------------- + +* Updated to tzdata version 2008a + (https://mm.icann.org/pipermail/tz/2008-March/014851.html). + + +Version 0.3.6 (tzdata v2007k) - 1-Jan-2008 +------------------------------------------ + +* Updated to tzdata version 2007k + (https://mm.icann.org/pipermail/tz/2007-December/014765.html). +* Removed deprecated RubyGems autorequire option. + + +Version 0.3.5 (tzdata v2007h) - 1-Oct-2007 +------------------------------------------ + +* Updated to tzdata version 2007h + (https://mm.icann.org/pipermail/tz/2007-October/014585.html). + + +Version 0.3.4 (tzdata v2007g) - 21-Aug-2007 +------------------------------------------- + +* Updated to tzdata version 2007g + (https://mm.icann.org/pipermail/tz/2007-August/014499.html). + + +Version 0.3.3 (tzdata v2006p) - 27-Nov-2006 +------------------------------------------- + +* Updated to tzdata version 2006p + (https://mm.icann.org/pipermail/tz/2006-November/013999.html). + + +Version 0.3.2 (tzdata v2006n) - 11-Oct-2006 +------------------------------------------- + +* Updated to tzdata version 2006n + (https://mm.icann.org/pipermail/tz/2006-October/013911.html). Note that this release of + tzdata removes the country Serbia and Montenegro (CS) and replaces it with + separate Serbia (RS) and Montenegro (ME) entries. + + +Version 0.3.1 (tzdata v2006j) - 21-Aug-2006 +------------------------------------------- + +* Remove colon from case statements to avoid warning in Ruby 1.8.5. #5198. +* Use temporary variable to avoid dynamic string warning from rdoc. +* Updated to tzdata version 2006j + (https://mm.icann.org/pipermail/tz/2006-August/013767.html). + + +Version 0.3.0 (tzdata v2006g) - 17-Jul-2006 +------------------------------------------- + +* New timezone data format. Timezone data now occupies less space on disk and + takes less memory once loaded. #4142, #4144. +* Timezone data is defined in modules rather than classes. Timezone instances + returned by Timezone.get are no longer instances of data classes, but are + instead instances of new DataTimezone and LinkedTimezone classes. +* Timezone instances can now be used with Marshal.dump and Marshal.load. #4240. +* Added a Timezone.get_proxy method that returns a TimezoneProxy object for a + given identifier. +* Country index data is now defined in a single module that is independent + of the Country class implementation. +* Country instances can now be used with Marshal.dump and Marshal.load. #4240. +* Country has a new zone_info method that returns CountryTimezone objects + containing additional information (latitude, longitude and a description) + relating to each Timezone. #4140. +* Timezones within a Country are now returned in an order that makes + geographic sense. +* The zdumptest utility now checks local to utc conversions in addition to + utc to local conversions. +* eql? method defined on Country and Timezone that is equivalent to ==. +* The == method of Timezone no longer raises an exception when passed an object + with no identifier method. +* The == method of Country no longer raises an exception when passed an object + with no code method. +* hash method defined on Country that returns the hash of the code. +* hash method defined on Timezone that returns the hash of the identifier. +* Miscellaneous API documentation corrections and improvements. +* Timezone definition and indexes are now excluded from rdoc (the contents were + previously ignored with #:nodoc: anyway). +* Removed no longer needed #:nodoc: directives from timezone data files (which + are now excluded from the rdoc build). +* Installation of the gem now causes rdoc API documentation to be generated. + #4905. +* When optimizing transitions to generate zone definitions, check the + UTC and standard offsets separately rather than just the total offset to UTC. + Fixes an incorrect abbreviation issue with Europe/London, Europe/Dublin and + Pacific/Auckland. +* Eliminated unnecessary .nil? calls to give a minor performance gain. +* Timezone.all and Timezone.all_identifiers now return all the + Timezones/identifiers rather than just those associated with countries. #4146. +* Added all_data_zones, all_data_zone_identifiers, all_linked_zones and + all_linked_zone_identifiers class methods to Timezone. +* Added a strftime method to Timezone that converts a time in UTC to local + time and then returns it formatted. %Z is replaced with the Timezone + abbreviation for the given time (for example, EST or EDT). #4143. +* Fix escaping of quotes in TZDataParser. This affected country names and + descriptions of timezones within countries. + + +Version 0.2.2 (tzdata v2006g) - 17-May-2006 +------------------------------------------- + +* Use class-scoped instance variables to store the Timezone identifier and + singleton instance. Loading a linked zone no longer causes the parent + zone's identifier to be changed. The instance method of a linked zone class + also now returns an instance of the linked zone class rather than the parent + class. #4502. +* The zdumptest utility now compares the TZInfo zone identifier with the zdump + zone identifier. +* The zdumptestall utility now exits if not supplied with enough parameters. +* Updated to tzdata version 2006g + (https://mm.icann.org/pipermail/tz/2006-May/013590.html). + + +Version 0.2.1 (tzdata v2006d) - 17-Apr-2006 +------------------------------------------- + +* Fix a performance issue caused in 0.2.0 with Timezone.local_to_utc. + Conversions performed on TimeOrDateTime instances passed to <=> are now + cached as originally intended. Thanks to Michael Smedberg for spotting this. +* Fix a performance issue with the local_to_utc period search algorithm + originally implemented in 0.1.0. The condition that was supposed to cause + the search to terminate when enough periods had been found was only being + evaluated in a small subset of cases. Thanks to Michael Smedberg and + Jamis Buck for reporting this. +* Added abbreviation as an alias for TimezonePeriod.zone_identifier. +* Updated to tzdata version 2006d + (https://mm.icann.org/pipermail/tz/2006-April/013517.html). +* Ignore any offset in DateTimes passed in (as is already done for Times). + All of the following now refer to the same UTC time (15:40 on 17 April 2006). + Previously, the DateTime in the second line would have been interpreted + as 20:40. + + tz.utc_to_local(DateTime.new(2006, 4, 17, 15, 40, 0)) + tz.utc_to_local(DateTime.new(2006, 4, 17, 15, 40, 0).new_offset(Rational(5, 24))) + tz.utc_to_local(Time.utc(2006, 4, 17, 15, 40, 0)) + tz.utc_to_local(Time.local(2006, 4, 17, 15, 40, 0)) + + +Version 0.2.0 (tzdata v2006c) - 3-Apr-2006 +------------------------------------------ + +* Use timestamps rather than DateTime objects in zone files for times between + 1970 and 2037 (the range of Time). +* Don't convert passed in Time objects to DateTime in most cases (provides + a substantial performance improvement). +* Allow integer timestamps (time in seconds since 1970-1-1) to be used as well + as Time and DateTime objects in all public methods that take times as + parameters. +* Tool to compare TZInfo conversions with output from zdump. +* TZDataParser zone generation algorithm rewritten. Now based on the zic code. + TZInfo is now 100% compatible with zic/zdump output. +* Riyadh Solar Time zones now included again (generation time has been reduced + with TZDataParser changes). +* Use binary mode when writing zone and country files to get Unix (\n) new + lines. +* Omit unnecessary quotes in zone identifier symbols. +* Omit the final transition to DST if there is a prior transition in the last + year processed to standard time. +* Updated to tzdata version 2006c + (https://mm.icann.org/pipermail/tz/2006-April/013500.html). + + +Version 0.1.2 (tzdata v2006a) - 5-Feb-2006 +------------------------------------------ + +* Add lib directory to the load path when tzinfo is required. Makes it easier + to use tzinfo gem when unpacked to vendor directory in rails. +* Updated to tzdata version 2006a + (https://mm.icann.org/pipermail/tz/2006-January/013311.html). +* build_tz_classes rake task now handles running svn add and svn delete as new + timezones and countries are added and old ones are removed. +* Return a better error when attempting to use a Timezone instance that was + constructed with Timezone.new(nil). This will occur when using Rails' + composed_of. When the timezone identifier in the database is null, attempting + to use the Timezone will now result in an UnknownTimezone exception rather + than a NameError. + + +Version 0.1.1 (tzdata v2005q) - 18-Dec-2005 +------------------------------------------- + +* Timezones that are defined by a single unbounded period (e.g. UTC) now + work again. +* Updated to tzdata version 2005q. + + +Version 0.1.0 (tzdata v2005n) - 27-Nov-2005 +------------------------------------------- + +* period_for_local and local_to_utc now allow resolution of ambiguous + times (e.g. when switching from daylight savings to standard time). + The behaviour of these methods when faced with an ambiguous local time + has now changed. If you are using these methods you should check + the documentation. Thanks to Cliff Matthews for suggesting this change. +* Added require 'date' to timezone.rb (date isn't loaded by default in all + environments). +* Use rake to build packages and documentation. +* License file is now included in gem distribution. +* Dates in definitions stored as Astronomical Julian Day numbers rather than + as civil dates (improves performance creating DateTime instances). +* Added options to TZDataParser to allow generation of specific zones and + countries. +* Moved TimezonePeriod class to timezone_period.rb. +* New TimezonePeriodList class to store TimezonePeriods for a timezone and + perform searches for periods. +* Timezones now defined using blocks. TimezonePeriods are only instantiated + when they are needed. Thanks to Jamis Buck for the suggestion. +* Add options to TZDataParser to allow exclusion of specific zones and + countries. +* Exclude the Riyadh Solar Time zones. The rules are only for 1987 to 1989 and + take a long time to generate and process. Riyadh Solar Time is no longer + observed. +* The last TimezonePeriod for each Timezone is now written out with an + unbounded rather than arbitrary end time. +* Construct the Rational offset in TimezonePeriod once when the TimezonePeriod + is constructed rather than each time it is needed. +* Timezone and Country now keep a cache of loaded instances to avoid running + require which can be slow on some platforms. +* Updated to tzdata version 2005n. + + +Version 0.0.4 (tzdata v2005m) - 18-Sep-2005 +------------------------------------------- + +* Removed debug output accidentally included in the previous release. +* Fixed a bug in the generation of friendly zone identifiers (was inserting + apostrophes into UTC, GMT, etc). +* Fixed Country <=> operator (was comparing non-existent attribute) +* Fixed Timezone.period_for_local error when period not found. +* Added testcases for Timezone, TimezoneProxy, TimezonePeriod, Country and + some selected timezones. + + +Version 0.0.3 (tzdata v2005m) - 17-Sep-2005 +------------------------------------------- + +* Reduced visibility of some methods added in Timezone#setup and Country#setup. +* Added name method to Timezone (returns the identifier). +* Added friendly_identifier method to Timezone. Returns a more friendly version + of the identifier. +* Added to_s method to Timezone. Returns the friendly identifier. +* Added == and <=> operators to Timezone (compares identifiers). +* Timezone now includes Comparable. +* Added to_s method to Country. +* Added == and <=> operators to Country (compares ISO 3166 country codes). +* Country now includes Comparable. +* New TimezoneProxy class that behaves the same as a Timezone but doesn't + actually load in its definition until it is actually required. +* Modified Timezone and Country methods that return Timezones to return + TimezoneProxy instances instead. This makes these methods much quicker. + + In Ruby on Rails, you can now show a drop-down list of all timezones using the + Rails time_zone_select helper method: + + <%= time_zone_select 'user', 'time_zone', TZInfo::Timezone.all.sort, :model => TZInfo::Timezone %> + + +Version 0.0.2 (tzdata v2005m) - 13-Sep-2005 +------------------------------------------- + +* Country and Timezone data is now loaded into class rather than instance + variables. This makes Timezone links more efficient and saves memory if + creating specific Timezone and Country classes directly. +* TimezonePeriod zone_identifier is now defined as a symbol to save memory + (was previously a string). +* TimezonePeriod zone_identifiers that were previously '' are now :Unknown. +* Timezones and Countries can now be returned using Timezone.new(identifier) + and Country.new(identifier). When passed an identifier, the new method + calls get to return an instance of the specified timezone or country. +* Added new class methods to Timezone to return sets of zones and identifiers. + +Thanks to Scott Barron of Lunchbox Software for the suggestions in his +article about using TZInfo with Rails +(https://web.archive.org/web/20060425190845/http://lunchroom.lunchboxsoftware.com/pages/tzinfo_rails) + + +Version 0.0.1 (tzdata v2005m) - 29-Aug-2005 +------------------------------------------- + +* First release. diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/LICENSE b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/LICENSE new file mode 100644 index 000000000000..6e74e290d94a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2005-2020 Philip Ross + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/README.md b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/README.md new file mode 100644 index 000000000000..50766f845b58 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/README.md @@ -0,0 +1,152 @@ +TZInfo - Ruby Timezone Library +============================== + +[![RubyGems](https://img.shields.io/gem/v/tzinfo)](https://rubygems.org/gems/tzinfo) [![Travis CI Build](https://img.shields.io/travis/com/tzinfo/tzinfo/1.2?logo=travis)](https://travis-ci.com/tzinfo/tzinfo) [![AppVeyor Build](https://img.shields.io/appveyor/build/philr/tzinfo/1.2?logo=appveyor)](https://ci.appveyor.com/project/philr/tzinfo/branch/1.2) + +[TZInfo](https://tzinfo.github.io) provides daylight savings aware +transformations between times in different timezones. + + +Data Sources +------------ + +TZInfo requires a source of timezone data. There are two built-in options: + +1. The TZInfo::Data library (the tzinfo-data gem). TZInfo::Data contains a set + of Ruby modules that are generated from the [IANA Time Zone Database](https://www.iana.org/time-zones). +2. A zoneinfo directory. Most Unix-like systems include a zoneinfo directory + containing timezone definitions. These are also generated from the + [IANA Time Zone Database](https://www.iana.org/time-zones). + +By default, TZInfo::Data will be used. If TZInfo::Data is not available (i.e. +if `require 'tzinfo/data'` fails), then TZInfo will search for a zoneinfo +directory instead (using the search path specified by +`TZInfo::ZoneinfoDataSource::DEFAULT_SEARCH_PATH`). + +If no data source can be found, a `TZInfo::DataSourceNotFound` exception will be +raised when TZInfo is used. Further information is available +[in the wiki](https://tzinfo.github.io/datasourcenotfound) to help with +resolving `TZInfo::DataSourceNotFound` errors. + +The default data source selection can be overridden using +`TZInfo::DataSource.set`. + +Custom data sources can also be used. See `TZInfo::DataSource.set` for +further details. + + +Installation +------------ + +The TZInfo gem can be installed by running: + + gem install tzinfo + +To use the Ruby modules as the data source, TZInfo::Data will also need to be +installed: + + gem install tzinfo-data + + +Example Usage +------------- + +The following code will obtain the America/New_York timezone (as an instance +of `TZInfo::Timezone`) and convert a time in UTC to local New York time: + + require 'tzinfo' + + tz = TZInfo::Timezone.get('America/New_York') + local = tz.utc_to_local(Time.utc(2005,8,29,15,35,0)) + +Note that the local Time returned will have a UTC timezone (`local.zone` will +return `"UTC"`). This is because the Time class in older (but still supported by +TZInfo) versions of Ruby can only handle two timezones: UTC and the system local +timezone. + +To convert from a local time to UTC, the `local_to_utc` method can be used as +follows: + + utc = tz.local_to_utc(local) + +Note that the timezone information of the local Time object is ignored (TZInfo +will just read the date and time and treat them as if there were in the `tz` +timezone). The following two lines will return the same result regardless of +the system's local timezone: + + tz.local_to_utc(Time.local(2006,6,26,1,0,0)) + tz.local_to_utc(Time.utc(2006,6,26,1,0,0)) + +To obtain information about the rules in force at a particular UTC or local +time, the `TZInfo::Timezone.period_for_utc` and +`TZInfo::Timezone.period_for_local` methods can be used. Both of these methods +return `TZInfo::TimezonePeriod` objects. The following gets the identifier for +the period (in this case EDT). + + period = tz.period_for_utc(Time.utc(2005,8,29,15,35,0)) + id = period.zone_identifier + +The current local time in a `Timezone` can be obtained with the +`TZInfo::Timezone#now` method: + + now = tz.now + +All methods in TZInfo that operate on a time can be used with either `Time` or +`DateTime` instances or with Integer timestamps (i.e. as returned by +`Time#to_i`). The type of the values returned will match the type passed in. + +A list of all the available timezone identifiers can be obtained using the +`TZInfo::Timezone.all_identifiers` method. `TZInfo::Timezone.all` can be called +to get an `Array` of all the `TZInfo::Timezone` instances. + +Timezones can also be accessed by country (using an ISO 3166-1 alpha-2 country +code). The following code retrieves the `TZInfo::Country` instance representing +the USA (country code 'US') and then gets all the timezone identifiers used in +the USA. + + us = TZInfo::Country.get('US') + timezones = us.zone_identifiers + +The `TZInfo::Country#zone_info` method provides an additional description and +geographic location for each timezone in a country. + +A list of all the available country codes can be obtained using the +`TZInfo::Country.all_codes` method. `TZInfo::Country.all` can be called to get +an `Array` of all the `Country` instances. + +For further detail, please refer to the API documentation for the +`TZInfo::Timezone` and `TZInfo::Country` classes. + + +Thread-Safety +------------- + +The `TZInfo::Country` and `TZInfo::Timezone` classes are thread-safe. It is safe +to use class and instance methods of `TZInfo::Country` and `TZInfo::Timezone` in +concurrently executing threads. Instances of both classes can be shared across +thread boundaries. + + +Documentation +------------- + +API documentation for TZInfo is available on [RubyDoc.info](https://rubydoc.info/gems/tzinfo/frames). + + +License +------- + +TZInfo is released under the MIT license, see LICENSE for details. + + +Source Code +----------- + +Source code for TZInfo is available on [GitHub](https://github.com/tzinfo/tzinfo). + + +Issue Tracker +------------- + +Please post any bugs, issues, feature requests or questions to the +[GitHub issue tracker](https://github.com/tzinfo/tzinfo/issues). diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/Rakefile b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/Rakefile new file mode 100644 index 000000000000..3cabb07c0b37 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/Rakefile @@ -0,0 +1,107 @@ +require 'rubygems' +require 'rubygems/package_task' +require 'fileutils' +require 'rake/testtask' + +# Ignore errors loading rdoc/task (the rdoc tasks will be excluded if +# rdoc is unavailable). +begin + require 'rdoc/task' +rescue LoadError, RuntimeError +end + +BASE_DIR = File.expand_path(File.dirname(__FILE__)) + +task :default => [:test] + +spec = eval(File.read('tzinfo.gemspec')) + +class TZInfoPackageTask < Gem::PackageTask + alias_method :orig_sh, :sh + private :orig_sh + + def sh(*cmd, &block) + if cmd[0] == '__tar_with_owner__' && cmd[1] =~ /\A-?[zjcvf]+\z/ + opts = cmd[1] + cmd = ['tar', 'c', '--owner', '0', '--group', '0', "#{opts.start_with?('-') ? '' : '-'}#{opts.gsub('c', '')}"] + cmd.drop(2) + elsif cmd.first =~ /\A__tar_with_owner__ -?([zjcvf]+)(.*)\z/ + opts = $1 + args = $2 + cmd[0] = "tar c --owner 0 --group 0 -#{opts.gsub('c', '')}#{args}" + end + + orig_sh(*cmd, &block) + end +end + +def add_signing_key(spec) + # Attempt to find the private key and add options to sign the gem if found. + private_key_path = File.expand_path(File.join(BASE_DIR, '..', 'key', 'gem-private_key.pem')) + + if File.exist?(private_key_path) + spec = spec.clone + spec.signing_key = private_key_path + spec.cert_chain = [File.join(BASE_DIR, 'gem-public_cert.pem')] + else + puts 'WARNING: Private key not found. Not signing gem file.' + end + + spec +end + +package_task = TZInfoPackageTask.new(add_signing_key(spec)) do |pkg| + pkg.need_zip = true + pkg.need_tar_gz = true + pkg.tar_command = '__tar_with_owner__' +end + +# Skip the rdoc task if RDoc::Task is unavailable +if defined?(RDoc) && defined?(RDoc::Task) + RDoc::Task.new do |rdoc| + rdoc.rdoc_dir = 'doc' + rdoc.options.concat spec.rdoc_options + rdoc.rdoc_files.include(spec.extra_rdoc_files) + rdoc.rdoc_files.include('lib') + end +end + +Rake::Task[package_task.package_dir_path].enhance do + recurse_chmod(package_task.package_dir_path) +end + +Rake::Task[:package].enhance do + FileUtils.rm_rf(package_task.package_dir_path) +end + +def recurse_chmod(dir) + File.chmod(0755, dir) + + Dir.entries(dir).each do |entry| + if entry != '.' && entry != '..' + path = File.join(dir, entry) + if File.directory?(path) + recurse_chmod(path) + else + File.chmod(0644, path) + end + end + end +end + +desc 'Run tests using RubyDataSource, then ZoneinfoDataSource' +task :test => [:test_ruby, :test_zoneinfo] do +end + +def setup_tests(test_task, type) + test_task.libs = [File.join(BASE_DIR, 'lib')] + test_task.pattern = File.join(BASE_DIR, 'test', "ts_all_#{type}.rb") + test_task.warning = true +end + +Rake::TestTask.new(:test_ruby) do |t| + setup_tests(t, :ruby) +end + +Rake::TestTask.new(:test_zoneinfo) do |t| + setup_tests(t, :zoneinfo) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo.rb new file mode 100644 index 000000000000..7a11ef77e605 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo.rb @@ -0,0 +1,43 @@ +# Top level module for TZInfo. +module TZInfo +end + +require 'tzinfo/ruby_core_support' +require 'tzinfo/offset_rationals' +require 'tzinfo/time_or_datetime' + +require 'tzinfo/timezone_definition' + +require 'tzinfo/timezone_offset' +require 'tzinfo/timezone_transition' +require 'tzinfo/transition_rule' +require 'tzinfo/annual_rules' +require 'tzinfo/timezone_transition_definition' + +require 'tzinfo/timezone_index_definition' + +require 'tzinfo/timezone_info' +require 'tzinfo/data_timezone_info' +require 'tzinfo/linked_timezone_info' +require 'tzinfo/transition_data_timezone_info' +require 'tzinfo/zoneinfo_timezone_info' + +require 'tzinfo/data_source' +require 'tzinfo/ruby_data_source' +require 'tzinfo/posix_time_zone_parser' +require 'tzinfo/zoneinfo_data_source' + +require 'tzinfo/timezone_period' +require 'tzinfo/timezone' +require 'tzinfo/info_timezone' +require 'tzinfo/data_timezone' +require 'tzinfo/linked_timezone' +require 'tzinfo/timezone_proxy' + +require 'tzinfo/country_index_definition' +require 'tzinfo/country_info' +require 'tzinfo/ruby_country_info' +require 'tzinfo/zoneinfo_country_info' + +require 'tzinfo/country' +require 'tzinfo/country_timezone' diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/annual_rules.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/annual_rules.rb new file mode 100644 index 000000000000..fec436b7a2be --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/annual_rules.rb @@ -0,0 +1,51 @@ +module TZInfo + # A set of rules that define when transitions occur in time zones with + # annually occurring daylight savings time. + # + # @private + class AnnualRules #:nodoc: + # Returned by #transitions. #offset is the TimezoneOffset that applies + # from the UTC TimeOrDateTime #at. #previous_offset is the prior + # TimezoneOffset. + Transition = Struct.new(:offset, :previous_offset, :at) + + # The standard offset that applies when daylight savings time is not in + # force. + attr_reader :std_offset + + # The offset that applies when daylight savings time is in force. + attr_reader :dst_offset + + # The rule that determines when daylight savings time starts. + attr_reader :dst_start_rule + + # The rule that determines when daylight savings time ends. + attr_reader :dst_end_rule + + # Initializes a new {AnnualRules} instance. + def initialize(std_offset, dst_offset, dst_start_rule, dst_end_rule) + @std_offset = std_offset + @dst_offset = dst_offset + @dst_start_rule = dst_start_rule + @dst_end_rule = dst_end_rule + end + + # Returns the transitions between standard and daylight savings time for a + # given year. The results are ordered by time of occurrence (earliest to + # latest). + def transitions(year) + start_dst = apply_rule(@dst_start_rule, @std_offset, @dst_offset, year) + end_dst = apply_rule(@dst_end_rule, @dst_offset, @std_offset, year) + + end_dst.at < start_dst.at ? [end_dst, start_dst] : [start_dst, end_dst] + end + + private + + # Applies a given rule between offsets on a year. + def apply_rule(rule, from_offset, to_offset, year) + at = rule.at(from_offset, year) + Transition.new(to_offset, from_offset, at) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country.rb new file mode 100644 index 000000000000..0dccebd5c971 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country.rb @@ -0,0 +1,196 @@ +require 'thread_safe' + +module TZInfo + # Raised by Country#get if the code given is not valid. + class InvalidCountryCode < StandardError + end + + # The Country class represents an ISO 3166-1 country. It can be used to + # obtain a list of Timezones for a country. For example: + # + # us = Country.get('US') + # us.zone_identifiers + # us.zones + # us.zone_info + # + # The Country class is thread-safe. It is safe to use class and instance + # methods of Country in concurrently executing threads. Instances of Country + # can be shared across thread boundaries. + # + # Country information available through TZInfo is intended as an aid for + # users, to help them select time zone data appropriate for their practical + # needs. It is not intended to take or endorse any position on legal or + # territorial claims. + class Country + include Comparable + + # Defined countries. + # + # @!visibility private + @@countries = nil + + # Whether the countries index has been loaded yet. + # + # @!visibility private + @@index_loaded = false + + # Gets a Country by its ISO 3166-1 alpha-2 code. Raises an + # InvalidCountryCode exception if it couldn't be found. + def self.get(identifier) + instance = @@countries[identifier] + + unless instance + # Thread-safety: It is possible that multiple equivalent Country + # instances could be created here in concurrently executing threads. + # The consequences of this are that the data may be loaded more than + # once (depending on the data source) and memoized calculations could + # be discarded. The performance benefit of ensuring that only a single + # instance is created is unlikely to be worth the overhead of only + # allowing one Country to be loaded at a time. + info = data_source.load_country_info(identifier) + instance = Country.new(info) + @@countries[identifier] = instance + end + + instance + end + + # If identifier is a CountryInfo object, initializes the Country instance, + # otherwise calls get(identifier). + def self.new(identifier) + if identifier.kind_of?(CountryInfo) + instance = super() + instance.send :setup, identifier + instance + else + get(identifier) + end + end + + # Returns an Array of all the valid country codes. + def self.all_codes + data_source.country_codes + end + + # Returns an Array of all the defined Countries. + def self.all + data_source.country_codes.collect {|code| get(code)} + end + + # The ISO 3166-1 alpha-2 country code. + def code + @info.code + end + + # The name of the country. + def name + @info.name + end + + # Alias for name. + def to_s + name + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #{@info.code}>" + end + + # Returns a frozen array of all the zone identifiers for the country. These + # are in an order that + # + # 1. makes some geographical sense, and + # 2. puts the most populous zones first, where that does not contradict 1. + # + # Returned zone identifiers may refer to cities and regions outside of the + # country. This will occur if the zone covers multiple countries. Any zones + # referring to a city or region in a different country will be listed after + # those relating to this country. + def zone_identifiers + @info.zone_identifiers + end + alias zone_names zone_identifiers + + # An array of all the Timezones for this country. Returns TimezoneProxy + # objects to avoid the overhead of loading Timezone definitions until + # a conversion is actually required. The Timezones are returned in an order + # that + # + # 1. makes some geographical sense, and + # 2. puts the most populous zones first, where that does not contradict 1. + # + # Identifiers of the zones returned may refer to cities and regions outside + # of the country. This will occur if the zone covers multiple countries. Any + # zones referring to a city or region in a different country will be listed + # after those relating to this country. + def zones + zone_identifiers.collect {|id| + Timezone.get_proxy(id) + } + end + + # Returns a frozen array of all the timezones for the for the country as + # CountryTimezone instances (containing extra information about each zone). + # These are in an order that + # + # 1. makes some geographical sense, and + # 2. puts the most populous zones first, where that does not contradict 1. + # + # Identifiers and descriptions of the zones returned may refer to cities and + # regions outside of the country. This will occur if the zone covers + # multiple countries. Any zones referring to a city or region in a different + # country will be listed after those relating to this country. + def zone_info + @info.zones + end + + # Compare two Countries based on their code. Returns -1 if c is less + # than self, 0 if c is equal to self and +1 if c is greater than self. + # + # Returns nil if c is not comparable with Country instances. + def <=>(c) + return nil unless c.is_a?(Country) + code <=> c.code + end + + # Returns true if and only if the code of c is equal to the code of this + # Country. + def eql?(c) + self == c + end + + # Returns a hash value for this Country. + def hash + code.hash + end + + # Dumps this Country for marshalling. + def _dump(limit) + code + end + + # Loads a marshalled Country. + def self._load(data) + Country.get(data) + end + + private + # Called by Country.new to initialize a new Country instance. The info + # parameter is a CountryInfo that defines the country. + def setup(info) + @info = info + end + + # Initializes @@countries. + def self.init_countries + @@countries = ThreadSafe::Cache.new + end + init_countries + + # Returns the current DataSource + def self.data_source + DataSource.get + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country_index_definition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country_index_definition.rb new file mode 100644 index 000000000000..431790b3d171 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country_index_definition.rb @@ -0,0 +1,31 @@ +module TZInfo + # The country index file includes CountryIndexDefinition which provides + # a country method used to define each country in the index. + # + # @private + module CountryIndexDefinition #:nodoc: + def self.append_features(base) + super + base.extend(ClassMethods) + base.instance_eval { @countries = {} } + end + + # Class methods for inclusion. + # + # @private + module ClassMethods #:nodoc: + # Defines a country with an ISO 3166 country code, name and block. The + # block will be evaluated to obtain all the timezones for the country. + # Calls Country.country_defined with the definition of each country. + def country(code, name, &block) + @countries[code] = RubyCountryInfo.new(code, name, &block) + end + + # Returns a frozen hash of all the countries that have been defined in + # the index. + def countries + @countries.freeze + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country_info.rb new file mode 100644 index 000000000000..e9d71c77199d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country_info.rb @@ -0,0 +1,42 @@ +module TZInfo + # Represents a country and references to its timezones as returned by a + # DataSource. + class CountryInfo + # The ISO 3166 country code. + attr_reader :code + + # The name of the country. + attr_reader :name + + # Constructs a new CountryInfo with an ISO 3166 country code and name + def initialize(code, name) + @code = code + @name = name + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #@code>" + end + + # Returns a frozen array of all the zone identifiers for the country. + # The identifiers are ordered by importance according to the DataSource. + def zone_identifiers + raise_not_implemented('zone_identifiers') + end + + # Returns a frozen array of all the timezones for the for the country as + # CountryTimezone instances. + # + # The timezones are ordered by importance according to the DataSource. + def zones + raise_not_implemented('zones') + end + + private + + def raise_not_implemented(method_name) + raise NotImplementedError, "Subclasses must override #{method_name}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country_timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country_timezone.rb new file mode 100644 index 000000000000..d46bec0d051d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/country_timezone.rb @@ -0,0 +1,135 @@ +module TZInfo + # A Timezone within a Country. This contains extra information about the + # Timezone that is specific to the Country (a Timezone could be used by + # multiple countries). + class CountryTimezone + # The zone identifier. + attr_reader :identifier + + # A description of this timezone in relation to the country, e.g. + # "Eastern Time". This is usually nil for countries having only a single + # Timezone. + attr_reader :description + + class << self + # Creates a new CountryTimezone with a timezone identifier, latitude, + # longitude and description. The latitude and longitude are specified as + # rationals - a numerator and denominator. For performance reasons, the + # numerators and denominators must be specified in their lowest form. + # + # For use internally within TZInfo. + # + # @!visibility private + alias :new! :new + + # Creates a new CountryTimezone with a timezone identifier, latitude, + # longitude and description. The latitude and longitude must be specified + # as instances of Rational. + # + # CountryTimezone instances should normally only be constructed when + # creating new DataSource implementations. + def new(identifier, latitude, longitude, description = nil) + super(identifier, latitude, nil, longitude, nil, description) + end + end + + # Creates a new CountryTimezone with a timezone identifier, latitude, + # longitude and description. The latitude and longitude are specified as + # rationals - a numerator and denominator. For performance reasons, the + # numerators and denominators must be specified in their lowest form. + # + # @!visibility private + def initialize(identifier, latitude_numerator, latitude_denominator, + longitude_numerator, longitude_denominator, description = nil) #:nodoc: + @identifier = identifier + + if latitude_numerator.kind_of?(Rational) + @latitude = latitude_numerator + else + @latitude = nil + @latitude_numerator = latitude_numerator + @latitude_denominator = latitude_denominator + end + + if longitude_numerator.kind_of?(Rational) + @longitude = longitude_numerator + else + @longitude = nil + @longitude_numerator = longitude_numerator + @longitude_denominator = longitude_denominator + end + + @description = description + end + + # The Timezone (actually a TimezoneProxy for performance reasons). + def timezone + Timezone.get_proxy(@identifier) + end + + # if description is not nil, this method returns description; otherwise it + # returns timezone.friendly_identifier(true). + def description_or_friendly_identifier + description || timezone.friendly_identifier(true) + end + + # The latitude of this timezone in degrees as a Rational. + def latitude + # Thread-safety: It is possible that the value of @latitude may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @latitude is only + # calculated once. + unless @latitude + result = RubyCoreSupport.rational_new!(@latitude_numerator, @latitude_denominator) + return result if frozen? + @latitude = result + end + + @latitude + end + + # The longitude of this timezone in degrees as a Rational. + def longitude + # Thread-safety: It is possible that the value of @longitude may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @longitude is only + # calculated once. + unless @longitude + result = RubyCoreSupport.rational_new!(@longitude_numerator, @longitude_denominator) + return result if frozen? + @longitude = result + end + + @longitude + end + + # Returns true if and only if the given CountryTimezone is equal to the + # current CountryTimezone (has the same identifer, latitude, longitude + # and description). + def ==(ct) + ct.kind_of?(CountryTimezone) && + identifier == ct.identifier && latitude == ct.latitude && + longitude == ct.longitude && description == ct.description + end + + # Returns true if and only if the given CountryTimezone is equal to the + # current CountryTimezone (has the same identifer, latitude, longitude + # and description). + def eql?(ct) + self == ct + end + + # Returns a hash of this CountryTimezone. + def hash + @identifier.hash ^ + (@latitude ? @latitude.numerator.hash ^ @latitude.denominator.hash : @latitude_numerator.hash ^ @latitude_denominator.hash) ^ + (@longitude ? @longitude.numerator.hash ^ @longitude.denominator.hash : @longitude_numerator.hash ^ @longitude_denominator.hash) ^ + @description.hash + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #@identifier>" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/data_source.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/data_source.rb new file mode 100644 index 000000000000..c5deeac929b7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/data_source.rb @@ -0,0 +1,190 @@ +require 'thread' + +module TZInfo + # InvalidDataSource is raised if the DataSource is used doesn't implement one + # of the required methods. + class InvalidDataSource < StandardError + end + + # DataSourceNotFound is raised if no data source could be found (i.e. + # if 'tzinfo/data' cannot be found on the load path and no valid zoneinfo + # directory can be found on the system). + class DataSourceNotFound < StandardError + end + + # The base class for data sources of timezone and country data. + # + # Use DataSource.set to change the data source being used. + class DataSource + # The currently selected data source. + @@instance = nil + + # Mutex used to ensure the default data source is only created once. + @@default_mutex = Mutex.new + + # Returns the currently selected DataSource instance. + def self.get + # If a DataSource hasn't been manually set when the first request is + # made to obtain a DataSource, then a Default data source is created. + + # This is done at the first request rather than when TZInfo is loaded to + # avoid unnecessary (or in some cases potentially harmful) attempts to + # find a suitable DataSource. + + # A Mutex is used to ensure that only a single default instance is + # created (having two different DataSources in use simultaneously could + # cause unexpected results). + + unless @@instance + @@default_mutex.synchronize do + set(create_default_data_source) unless @@instance + end + end + + @@instance + end + + # Sets the currently selected data source for Timezone and Country data. + # + # This should usually be set to one of the two standard data source types: + # + # * +:ruby+ - read data from the Ruby modules included in the TZInfo::Data + # library (tzinfo-data gem). + # * +:zoneinfo+ - read data from the zoneinfo files included with most + # Unix-like operating sytems (e.g. in /usr/share/zoneinfo). + # + # To set TZInfo to use one of the standard data source types, call + # \TZInfo::DataSource.set in one of the following ways: + # + # TZInfo::DataSource.set(:ruby) + # TZInfo::DataSource.set(:zoneinfo) + # TZInfo::DataSource.set(:zoneinfo, zoneinfo_dir) + # TZInfo::DataSource.set(:zoneinfo, zoneinfo_dir, iso3166_tab_file) + # + # \DataSource.set(:zoneinfo) will automatically search for the zoneinfo + # directory by checking the paths specified in + # ZoneinfoDataSource.search_paths. ZoneinfoDirectoryNotFound will be raised + # if no valid zoneinfo directory could be found. + # + # \DataSource.set(:zoneinfo, zoneinfo_dir) uses the specified zoneinfo + # directory as the data source. If the directory is not a valid zoneinfo + # directory, an InvalidZoneinfoDirectory exception will be raised. + # + # \DataSource.set(:zoneinfo, zoneinfo_dir, iso3166_tab_file) uses the + # specified zoneinfo directory as the data source, but loads the iso3166.tab + # file from an alternate path. If the directory is not a valid zoneinfo + # directory, an InvalidZoneinfoDirectory exception will be raised. + # + # Custom data sources can be created by subclassing TZInfo::DataSource and + # implementing the following methods: + # + # * \load_timezone_info + # * \timezone_identifiers + # * \data_timezone_identifiers + # * \linked_timezone_identifiers + # * \load_country_info + # * \country_codes + # + # To have TZInfo use the custom data source, call \DataSource.set + # as follows: + # + # TZInfo::DataSource.set(CustomDataSource.new) + # + # To avoid inconsistent data, \DataSource.set should be called before + # accessing any Timezone or Country data. + # + # If \DataSource.set is not called, TZInfo will by default use TZInfo::Data + # as the data source. If TZInfo::Data is not available (i.e. if require + # 'tzinfo/data' fails), then TZInfo will search for a zoneinfo directory + # instead (using the search path specified by + # TZInfo::ZoneinfoDataSource::DEFAULT_SEARCH_PATH). + def self.set(data_source_or_type, *args) + if data_source_or_type.kind_of?(DataSource) + @@instance = data_source_or_type + elsif data_source_or_type == :ruby + @@instance = RubyDataSource.new + elsif data_source_or_type == :zoneinfo + @@instance = ZoneinfoDataSource.new(*args) + else + raise ArgumentError, 'data_source_or_type must be a DataSource instance or a data source type (:ruby)' + end + end + + # Returns a TimezoneInfo instance for a given identifier. The TimezoneInfo + # instance should derive from either DataTimzoneInfo for timezones that + # define their own data or LinkedTimezoneInfo for links or aliases to + # other timezones. + # + # Raises InvalidTimezoneIdentifier if the timezone is not found or the + # identifier is invalid. + def load_timezone_info(identifier) + raise_invalid_data_source('load_timezone_info') + end + + # Returns an array of all the available timezone identifiers. + def timezone_identifiers + raise_invalid_data_source('timezone_identifiers') + end + + # Returns an array of all the available timezone identifiers for + # data timezones (i.e. those that actually contain definitions). + def data_timezone_identifiers + raise_invalid_data_source('data_timezone_identifiers') + end + + # Returns an array of all the available timezone identifiers that + # are links to other timezones. + def linked_timezone_identifiers + raise_invalid_data_source('linked_timezone_identifiers') + end + + # Returns a CountryInfo instance for the given ISO 3166-1 alpha-2 + # country code. Raises InvalidCountryCode if the country could not be found + # or the code is invalid. + def load_country_info(code) + raise_invalid_data_source('load_country_info') + end + + # Returns an array of all the available ISO 3166-1 alpha-2 + # country codes. + def country_codes + raise_invalid_data_source('country_codes') + end + + # Returns the name of this DataSource. + def to_s + "Default DataSource" + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}>" + end + + private + + # Creates a DataSource instance for use as the default. Used if + # no preference has been specified manually. + def self.create_default_data_source + has_tzinfo_data = false + + begin + require 'tzinfo/data' + has_tzinfo_data = true + rescue LoadError + end + + return RubyDataSource.new if has_tzinfo_data + + begin + return ZoneinfoDataSource.new + rescue ZoneinfoDirectoryNotFound + raise DataSourceNotFound, "No source of timezone data could be found.\nPlease refer to https://tzinfo.github.io/datasourcenotfound for help resolving this error." + end + end + + def raise_invalid_data_source(method_name) + raise InvalidDataSource, "#{method_name} not defined" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/data_timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/data_timezone.rb new file mode 100644 index 000000000000..94958c931cf6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/data_timezone.rb @@ -0,0 +1,58 @@ +module TZInfo + + # A Timezone based on a DataTimezoneInfo. + # + # @private + class DataTimezone < InfoTimezone #:nodoc: + + # Returns the TimezonePeriod for the given UTC time. utc can either be + # a DateTime, Time or integer timestamp (Time.to_i). Any timezone + # information in utc is ignored (it is treated as a UTC time). + # + # If no TimezonePeriod could be found, PeriodNotFound is raised. + def period_for_utc(utc) + info.period_for_utc(utc) + end + + # Returns the set of TimezonePeriod instances that are valid for the given + # local time as an array. If you just want a single period, use + # period_for_local instead and specify how abiguities should be resolved. + # Raises PeriodNotFound if no periods are found for the given time. + def periods_for_local(local) + info.periods_for_local(local) + end + + # Returns an Array of TimezoneTransition instances representing the times + # where the UTC offset of the timezone changes. + # + # Transitions are returned up to a given date and time up to a given date + # and time, specified in UTC (utc_to). + # + # A from date and time may also be supplied using the utc_from parameter + # (also specified in UTC). If utc_from is not nil, only transitions from + # that date and time onwards will be returned. + # + # Comparisons with utc_to are exclusive. Comparisons with utc_from are + # inclusive. If a transition falls precisely on utc_to, it will be excluded. + # If a transition falls on utc_from, it will be included. + # + # Transitions returned are ordered by when they occur, from earliest to + # latest. + # + # utc_to and utc_from can be specified using either DateTime, Time or + # integer timestamps (Time.to_i). + # + # If utc_from is specified and utc_to is not greater than utc_from, then + # transitions_up_to raises an ArgumentError exception. + def transitions_up_to(utc_to, utc_from = nil) + info.transitions_up_to(utc_to, utc_from) + end + + # Returns the canonical zone for this Timezone. + # + # For a DataTimezone, this is always self. + def canonical_zone + self + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/data_timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/data_timezone_info.rb new file mode 100644 index 000000000000..7d0fa5f37140 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/data_timezone_info.rb @@ -0,0 +1,55 @@ +module TZInfo + # Represents a defined timezone containing transition data. + class DataTimezoneInfo < TimezoneInfo + + # Returns the TimezonePeriod for the given UTC time. + def period_for_utc(utc) + raise_not_implemented('period_for_utc') + end + + # Returns the set of TimezonePeriods for the given local time as an array. + # Results returned are ordered by increasing UTC start date. + # Returns an empty array if no periods are found for the given time. + def periods_for_local(local) + raise_not_implemented('periods_for_local') + end + + # Returns an Array of TimezoneTransition instances representing the times + # where the UTC offset of the timezone changes. + # + # Transitions are returned up to a given date and time up to a given date + # and time, specified in UTC (utc_to). + # + # A from date and time may also be supplied using the utc_from parameter + # (also specified in UTC). If utc_from is not nil, only transitions from + # that date and time onwards will be returned. + # + # Comparisons with utc_to are exclusive. Comparisons with utc_from are + # inclusive. If a transition falls precisely on utc_to, it will be excluded. + # If a transition falls on utc_from, it will be included. + # + # Transitions returned are ordered by when they occur, from earliest to + # latest. + # + # utc_to and utc_from can be specified using either DateTime, Time or + # integer timestamps (Time.to_i). + # + # If utc_from is specified and utc_to is not greater than utc_from, then + # transitions_up_to raises an ArgumentError exception. + def transitions_up_to(utc_to, utc_from = nil) + raise_not_implemented('transitions_up_to') + end + + # Constructs a Timezone instance for the timezone represented by this + # DataTimezoneInfo. + def create_timezone + DataTimezone.new(self) + end + + private + + def raise_not_implemented(method_name) + raise NotImplementedError, "Subclasses must override #{method_name}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/info_timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/info_timezone.rb new file mode 100644 index 000000000000..4eb014be6a66 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/info_timezone.rb @@ -0,0 +1,30 @@ +module TZInfo + + # A Timezone based on a TimezoneInfo. + # + # @private + class InfoTimezone < Timezone #:nodoc: + + # Constructs a new InfoTimezone with a TimezoneInfo instance. + def self.new(info) + tz = super() + tz.send(:setup, info) + tz + end + + # The identifier of the timezone, e.g. "Europe/Paris". + def identifier + @info.identifier + end + + protected + # The TimezoneInfo for this Timezone. + def info + @info + end + + def setup(info) + @info = info + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/linked_timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/linked_timezone.rb new file mode 100644 index 000000000000..c4f4a0d4bb8d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/linked_timezone.rb @@ -0,0 +1,63 @@ +module TZInfo + + # A Timezone based on a LinkedTimezoneInfo. + # + # @private + class LinkedTimezone < InfoTimezone #:nodoc: + # Returns the TimezonePeriod for the given UTC time. utc can either be + # a DateTime, Time or integer timestamp (Time.to_i). Any timezone + # information in utc is ignored (it is treated as a UTC time). + # + # If no TimezonePeriod could be found, PeriodNotFound is raised. + def period_for_utc(utc) + @linked_timezone.period_for_utc(utc) + end + + # Returns the set of TimezonePeriod instances that are valid for the given + # local time as an array. If you just want a single period, use + # period_for_local instead and specify how abiguities should be resolved. + # Raises PeriodNotFound if no periods are found for the given time. + def periods_for_local(local) + @linked_timezone.periods_for_local(local) + end + + # Returns an Array of TimezoneTransition instances representing the times + # where the UTC offset of the timezone changes. + # + # Transitions are returned up to a given date and time up to a given date + # and time, specified in UTC (utc_to). + # + # A from date and time may also be supplied using the utc_from parameter + # (also specified in UTC). If utc_from is not nil, only transitions from + # that date and time onwards will be returned. + # + # Comparisons with utc_to are exclusive. Comparisons with utc_from are + # inclusive. If a transition falls precisely on utc_to, it will be excluded. + # If a transition falls on utc_from, it will be included. + # + # Transitions returned are ordered by when they occur, from earliest to + # latest. + # + # utc_to and utc_from can be specified using either DateTime, Time or + # integer timestamps (Time.to_i). + # + # If utc_from is specified and utc_to is not greater than utc_from, then + # transitions_up_to raises an ArgumentError exception. + def transitions_up_to(utc_to, utc_from = nil) + @linked_timezone.transitions_up_to(utc_to, utc_from) + end + + # Returns the canonical zone for this Timezone. + # + # For a LinkedTimezone, this is the canonical zone of the link target. + def canonical_zone + @linked_timezone.canonical_zone + end + + protected + def setup(info) + super(info) + @linked_timezone = Timezone.get(info.link_to_identifier) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/linked_timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/linked_timezone_info.rb new file mode 100644 index 000000000000..f7961d5596a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/linked_timezone_info.rb @@ -0,0 +1,26 @@ +module TZInfo + # Represents a timezone that is defined as a link or alias to another zone. + class LinkedTimezoneInfo < TimezoneInfo + + # The zone that provides the data (that this zone is an alias for). + attr_reader :link_to_identifier + + # Constructs a new LinkedTimezoneInfo with an identifier and the identifier + # of the zone linked to. + def initialize(identifier, link_to_identifier) + super(identifier) + @link_to_identifier = link_to_identifier + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #@identifier,#@link_to_identifier>" + end + + # Constructs a Timezone instance for the timezone represented by this + # DataTimezoneInfo. + def create_timezone + LinkedTimezone.new(self) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/offset_rationals.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/offset_rationals.rb new file mode 100644 index 000000000000..2a50a0876723 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/offset_rationals.rb @@ -0,0 +1,77 @@ +require 'rational' unless defined?(Rational) + +module TZInfo + + # Provides a method for getting Rationals for a timezone offset in seconds. + # Pre-reduced rationals are returned for all the half-hour intervals between + # -14 and +14 hours to avoid having to call gcd at runtime. + # + # @private + module OffsetRationals #:nodoc: + @@rational_cache = { + -50400 => RubyCoreSupport.rational_new!(-7,12), + -48600 => RubyCoreSupport.rational_new!(-9,16), + -46800 => RubyCoreSupport.rational_new!(-13,24), + -45000 => RubyCoreSupport.rational_new!(-25,48), + -43200 => RubyCoreSupport.rational_new!(-1,2), + -41400 => RubyCoreSupport.rational_new!(-23,48), + -39600 => RubyCoreSupport.rational_new!(-11,24), + -37800 => RubyCoreSupport.rational_new!(-7,16), + -36000 => RubyCoreSupport.rational_new!(-5,12), + -34200 => RubyCoreSupport.rational_new!(-19,48), + -32400 => RubyCoreSupport.rational_new!(-3,8), + -30600 => RubyCoreSupport.rational_new!(-17,48), + -28800 => RubyCoreSupport.rational_new!(-1,3), + -27000 => RubyCoreSupport.rational_new!(-5,16), + -25200 => RubyCoreSupport.rational_new!(-7,24), + -23400 => RubyCoreSupport.rational_new!(-13,48), + -21600 => RubyCoreSupport.rational_new!(-1,4), + -19800 => RubyCoreSupport.rational_new!(-11,48), + -18000 => RubyCoreSupport.rational_new!(-5,24), + -16200 => RubyCoreSupport.rational_new!(-3,16), + -14400 => RubyCoreSupport.rational_new!(-1,6), + -12600 => RubyCoreSupport.rational_new!(-7,48), + -10800 => RubyCoreSupport.rational_new!(-1,8), + -9000 => RubyCoreSupport.rational_new!(-5,48), + -7200 => RubyCoreSupport.rational_new!(-1,12), + -5400 => RubyCoreSupport.rational_new!(-1,16), + -3600 => RubyCoreSupport.rational_new!(-1,24), + -1800 => RubyCoreSupport.rational_new!(-1,48), + 0 => RubyCoreSupport.rational_new!(0,1), + 1800 => RubyCoreSupport.rational_new!(1,48), + 3600 => RubyCoreSupport.rational_new!(1,24), + 5400 => RubyCoreSupport.rational_new!(1,16), + 7200 => RubyCoreSupport.rational_new!(1,12), + 9000 => RubyCoreSupport.rational_new!(5,48), + 10800 => RubyCoreSupport.rational_new!(1,8), + 12600 => RubyCoreSupport.rational_new!(7,48), + 14400 => RubyCoreSupport.rational_new!(1,6), + 16200 => RubyCoreSupport.rational_new!(3,16), + 18000 => RubyCoreSupport.rational_new!(5,24), + 19800 => RubyCoreSupport.rational_new!(11,48), + 21600 => RubyCoreSupport.rational_new!(1,4), + 23400 => RubyCoreSupport.rational_new!(13,48), + 25200 => RubyCoreSupport.rational_new!(7,24), + 27000 => RubyCoreSupport.rational_new!(5,16), + 28800 => RubyCoreSupport.rational_new!(1,3), + 30600 => RubyCoreSupport.rational_new!(17,48), + 32400 => RubyCoreSupport.rational_new!(3,8), + 34200 => RubyCoreSupport.rational_new!(19,48), + 36000 => RubyCoreSupport.rational_new!(5,12), + 37800 => RubyCoreSupport.rational_new!(7,16), + 39600 => RubyCoreSupport.rational_new!(11,24), + 41400 => RubyCoreSupport.rational_new!(23,48), + 43200 => RubyCoreSupport.rational_new!(1,2), + 45000 => RubyCoreSupport.rational_new!(25,48), + 46800 => RubyCoreSupport.rational_new!(13,24), + 48600 => RubyCoreSupport.rational_new!(9,16), + 50400 => RubyCoreSupport.rational_new!(7,12)}.freeze + + # Returns a Rational expressing the fraction of a day that offset in + # seconds represents (i.e. equivalent to Rational(offset, 86400)). + def rational_for_offset(offset) + @@rational_cache[offset] || Rational(offset, 86400) + end + module_function :rational_for_offset + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/posix_time_zone_parser.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/posix_time_zone_parser.rb new file mode 100644 index 000000000000..af2d7e018528 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/posix_time_zone_parser.rb @@ -0,0 +1,136 @@ +# encoding: UTF-8 +# frozen_string_literal: true + +require 'strscan' + +module TZInfo + # An {InvalidPosixTimeZone} exception is raised if an invalid POSIX-style + # time zone string is encountered. + # + # @private + class InvalidPosixTimeZone < StandardError #:nodoc: + end + + # A parser for POSIX-style TZ strings used in zoneinfo files and specified + # by tzfile.5 and tzset.3. + # + # @private + class PosixTimeZoneParser #:nodoc: + # Parses a POSIX-style TZ string, returning either a TimezoneOffset or + # an AnnualRules instance. + def parse(tz_string) + raise InvalidPosixTimeZone unless tz_string.kind_of?(String) + return nil if tz_string.empty? + + s = StringScanner.new(tz_string) + check_scan(s, /([^-+,\d<][^-+,\d]*) | <([^>]+)>/x) + std_abbrev = s[1] || s[2] + check_scan(s, /([-+]?\d+)(?::(\d+)(?::(\d+))?)?/) + std_offset = get_offset_from_hms(s[1], s[2], s[3]) + + if s.scan(/([^-+,\d<][^-+,\d]*) | <([^>]+)>/x) + dst_abbrev = s[1] || s[2] + + if s.scan(/([-+]?\d+)(?::(\d+)(?::(\d+))?)?/) + dst_offset = get_offset_from_hms(s[1], s[2], s[3]) + else + # POSIX is negative for ahead of UTC. + dst_offset = std_offset - 3600 + end + + dst_difference = std_offset - dst_offset + + start_rule = parse_rule(s, 'start') + end_rule = parse_rule(s, 'end') + + raise InvalidPosixTimeZone, "Expected the end of a POSIX-style time zone string but found '#{s.rest}'." if s.rest? + + if start_rule.is_always_first_day_of_year? && start_rule.transition_at == 0 && + end_rule.is_always_last_day_of_year? && end_rule.transition_at == 86400 + dst_difference + # Constant daylight savings time. + # POSIX is negative for ahead of UTC. + TimezoneOffset.new(-std_offset, dst_difference, dst_abbrev.to_sym) + else + AnnualRules.new( + TimezoneOffset.new(-std_offset, 0, std_abbrev.to_sym), + TimezoneOffset.new(-std_offset, dst_difference, dst_abbrev.to_sym), + start_rule, + end_rule) + end + elsif !s.rest? + # Constant standard time. + # POSIX is negative for ahead of UTC. + TimezoneOffset.new(-std_offset, 0, std_abbrev.to_sym) + else + raise InvalidPosixTimeZone, "Expected the end of a POSIX-style time zone string but found '#{s.rest}'." + end + end + + private + + # Parses the rule from the TZ string, returning a TransitionRule. + def parse_rule(s, type) + check_scan(s, /,(?: (?: J(\d+) ) | (\d+) | (?: M(\d+)\.(\d)\.(\d) ) )/x) + julian_day_of_year = s[1] + absolute_day_of_year = s[2] + month = s[3] + week = s[4] + day_of_week = s[5] + + if s.scan(/\//) + check_scan(s, /([-+]?\d+)(?::(\d+)(?::(\d+))?)?/) + transition_at = get_seconds_after_midnight_from_hms(s[1], s[2], s[3]) + else + transition_at = 7200 + end + + begin + if julian_day_of_year + JulianDayOfYearTransitionRule.new(julian_day_of_year.to_i, transition_at) + elsif absolute_day_of_year + AbsoluteDayOfYearTransitionRule.new(absolute_day_of_year.to_i, transition_at) + elsif week == '5' + LastDayOfMonthTransitionRule.new(month.to_i, day_of_week.to_i, transition_at) + else + DayOfMonthTransitionRule.new(month.to_i, week.to_i, day_of_week.to_i, transition_at) + end + rescue ArgumentError => e + raise InvalidPosixTimeZone, "Invalid #{type} rule in POSIX-style time zone string: #{e}" + end + end + + # Returns an offset in seconds from hh:mm:ss values. The value can be + # negative. -02:33:12 would represent 2 hours, 33 minutes and 12 seconds + # ahead of UTC. + def get_offset_from_hms(h, m, s) + h = h.to_i + m = m.to_i + s = s.to_i + raise InvalidPosixTimeZone, "Invalid minute #{m} in offset for POSIX-style time zone string." if m > 59 + raise InvalidPosixTimeZone, "Invalid second #{s} in offset for POSIX-style time zone string." if s > 59 + magnitude = (h.abs * 60 + m) * 60 + s + h < 0 ? -magnitude : magnitude + end + + # Returns the seconds from midnight from hh:mm:ss values. Hours can exceed + # 24 for a time on the following day. Hours can be negative to subtract + # hours from midnight on the given day. -02:33:12 represents 22:33:12 on + # the prior day. + def get_seconds_after_midnight_from_hms(h, m, s) + h = h.to_i + m = m.to_i + s = s.to_i + raise InvalidPosixTimeZone, "Invalid minute #{m} in time for POSIX-style time zone string." if m > 59 + raise InvalidPosixTimeZone, "Invalid second #{s} in time for POSIX-style time zone string." if s > 59 + (h * 3600) + m * 60 + s + end + + # Scans for a pattern and raises an exception if the pattern does not + # match the input. + def check_scan(s, pattern) + result = s.scan(pattern) + raise InvalidPosixTimeZone, "Expected '#{s.rest}' to match #{pattern} in POSIX-style time zone string." unless result + result + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/ruby_core_support.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/ruby_core_support.rb new file mode 100644 index 000000000000..7ba776b39c8e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/ruby_core_support.rb @@ -0,0 +1,169 @@ +require 'date' +require 'rational' unless defined?(Rational) + +module TZInfo + + # Methods to support different versions of Ruby. + # + # @private + module RubyCoreSupport #:nodoc: + + # Use Rational.new! for performance reasons in Ruby 1.8. + # This has been removed from 1.9, but Rational performs better. + if Rational.respond_to? :new! + def self.rational_new!(numerator, denominator = 1) + Rational.new!(numerator, denominator) + end + else + def self.rational_new!(numerator, denominator = 1) + Rational(numerator, denominator) + end + end + + # Ruby 1.8.6 introduced new! and deprecated new0. + # Ruby 1.9.0 removed new0. + # Ruby trunk revision 31668 removed the new! method. + # Still support new0 for better performance on older versions of Ruby (new0 indicates + # that the rational has already been reduced to its lowest terms). + # Fallback to jd with conversion from ajd if new! and new0 are unavailable. + if DateTime.respond_to? :new! + def self.datetime_new!(ajd = 0, of = 0, sg = Date::ITALY) + DateTime.new!(ajd, of, sg) + end + elsif DateTime.respond_to? :new0 + def self.datetime_new!(ajd = 0, of = 0, sg = Date::ITALY) + DateTime.new0(ajd, of, sg) + end + else + HALF_DAYS_IN_DAY = rational_new!(1, 2) + + def self.datetime_new!(ajd = 0, of = 0, sg = Date::ITALY) + # Convert from an Astronomical Julian Day number to a civil Julian Day number. + jd = ajd + of + HALF_DAYS_IN_DAY + + # Ruby trunk revision 31862 changed the behaviour of DateTime.jd so that it will no + # longer accept a fractional civil Julian Day number if further arguments are specified. + # Calculate the hours, minutes and seconds to pass to jd. + + jd_i = jd.to_i + jd_i -= 1 if jd < 0 + hours = (jd - jd_i) * 24 + hours_i = hours.to_i + minutes = (hours - hours_i) * 60 + minutes_i = minutes.to_i + seconds = (minutes - minutes_i) * 60 + + DateTime.jd(jd_i, hours_i, minutes_i, seconds, of, sg) + end + end + + # DateTime in Ruby 1.8.6 doesn't consider times within the 60th second to be + # valid. When attempting to specify such a DateTime, subtract the fractional + # part and then add it back later + if Date.respond_to?(:valid_time?) && !Date.valid_time?(0, 0, rational_new!(59001, 1000)) # 0:0:59.001 + def self.datetime_new(y=-4712, m=1, d=1, h=0, min=0, s=0, of=0, sg=Date::ITALY) + if !s.kind_of?(Integer) && s > 59 + dt = DateTime.new(y, m, d, h, min, 59, of, sg) + dt + (s - 59) / 86400 + else + DateTime.new(y, m, d, h, min, s, of, sg) + end + end + else + def self.datetime_new(y=-4712, m=1, d=1, h=0, min=0, s=0, of=0, sg=Date::ITALY) + DateTime.new(y, m, d, h, min, s, of, sg) + end + end + + # Returns true if Time on the runtime platform supports Times defined + # by negative 32-bit timestamps, otherwise false. + begin + Time.at(-1) + Time.at(-2147483648) + + def self.time_supports_negative + true + end + rescue ArgumentError + def self.time_supports_negative + false + end + end + + # Returns true if Time on the runtime platform supports Times defined by + # 64-bit timestamps, otherwise false. + begin + Time.at(-2147483649) + Time.at(2147483648) + + def self.time_supports_64bit + true + end + rescue RangeError + def self.time_supports_64bit + false + end + end + + # Return the result of Time#nsec if it exists, otherwise return the + # result of Time#usec * 1000. + if Time.method_defined?(:nsec) + def self.time_nsec(time) + time.nsec + end + else + def self.time_nsec(time) + time.usec * 1000 + end + end + + # Call String#force_encoding if this version of Ruby has encoding support + # otherwise treat as a no-op. + if String.method_defined?(:force_encoding) + def self.force_encoding(str, encoding) + str.force_encoding(encoding) + end + else + def self.force_encoding(str, encoding) + str + end + end + + + # Wrapper for File.open that supports passing hash options for specifying + # encodings on Ruby 1.9+. The options are ignored on earlier versions of + # Ruby. + if RUBY_VERSION =~ /\A1\.[0-8]\./ + def self.open_file(file_name, mode, opts, &block) + File.open(file_name, mode, &block) + end + elsif RUBY_VERSION =~ /\A1\.9\./ + def self.open_file(file_name, mode, opts, &block) + File.open(file_name, mode, opts, &block) + end + else + # Evaluate method as a string because **opts isn't valid syntax prior to + # Ruby 2.0. + eval(<<-EOF + def self.open_file(file_name, mode, opts, &block) + File.open(file_name, mode, **opts, &block) + end + EOF + ) + end + + + # Object#untaint is a deprecated no-op in Ruby >= 2.7 and will be removed in + # 3.2. Add a refinement to either silence the warning, or supply the method + # if needed. + if !Object.new.respond_to?(:untaint) || RUBY_VERSION =~ /\A(\d+)\.(\d+)(?:\.|\z)/ && ($1 == '2' && $2.to_i >= 7 || $1.to_i >= 3) + module UntaintExt + refine Object do + def untaint + self + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/ruby_country_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/ruby_country_info.rb new file mode 100644 index 000000000000..e51915d6284f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/ruby_country_info.rb @@ -0,0 +1,74 @@ +module TZInfo + # Represents information about a country returned by RubyDataSource. + # + # @private + class RubyCountryInfo < CountryInfo #:nodoc: + # Constructs a new CountryInfo with an ISO 3166 country code, name and + # block. The block will be evaluated to obtain the timezones for the + # country when the zones are first needed. + def initialize(code, name, &block) + super(code, name) + @block = block + @zones = nil + @zone_identifiers = nil + end + + # Returns a frozen array of all the zone identifiers for the country. These + # are in the order they were added using the timezone method. + def zone_identifiers + # Thread-safety: It is possible that the value of @zone_identifiers may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @zone_identifiers is only + # calculated once. + + unless @zone_identifiers + result = zones.collect {|zone| zone.identifier}.freeze + return result if frozen? + @zone_identifiers = result + end + + @zone_identifiers + end + + # Returns a frozen array of all the timezones for the for the country as + # CountryTimezone instances. These are in the order they were added using + # the timezone method. + def zones + # Thread-safety: It is possible that the value of @zones may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @zones is only + # calculated once. + + unless @zones + zones = Zones.new + @block.call(zones) if @block + result = zones.list.freeze + return result if frozen? + @block = nil + @zones = result + end + + @zones + end + + # An instance of the Zones class is passed to the block used to define + # timezones. + # + # @private + class Zones #:nodoc: + attr_reader :list + + def initialize + @list = [] + end + + # Called by the index data to define a timezone for the country. + def timezone(identifier, latitude_numerator, latitude_denominator, + longitude_numerator, longitude_denominator, description = nil) + @list << CountryTimezone.new!(identifier, latitude_numerator, + latitude_denominator, longitude_numerator, longitude_denominator, + description) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/ruby_data_source.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/ruby_data_source.rb new file mode 100644 index 000000000000..b5a67524f4c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/ruby_data_source.rb @@ -0,0 +1,140 @@ +module TZInfo + # Use send as a workaround for erroneous 'wrong number of arguments' errors + # with JRuby 9.0.5.0 when calling methods with Java implementations. See #114. + send(:using, RubyCoreSupport::UntaintExt) if RubyCoreSupport.const_defined?(:UntaintExt) + + # A DataSource that loads data from the set of Ruby modules included in the + # TZInfo::Data library (tzinfo-data gem). + # + # To have TZInfo use this DataSource, call TZInfo::DataSource.set as follows: + # + # TZInfo::DataSource.set(:ruby) + class RubyDataSource < DataSource + # Whether the timezone index has been loaded yet. + @@timezone_index_loaded = false + + # Whether the country index has been loaded yet. + @@country_index_loaded = false + + # Initializes a new RubyDataSource instance. + def initialize + tzinfo_data = File.join('tzinfo', 'data') + begin + require(tzinfo_data) + + data_file = File.join('', 'tzinfo', 'data.rb') + path = $".reverse_each.detect {|p| p.end_with?(data_file) } + if path + @base_path = File.join(File.dirname(path), 'data').untaint + else + @base_path = tzinfo_data + end + rescue LoadError + @base_path = tzinfo_data + end + end + + # Returns a TimezoneInfo instance for a given identifier. + # Raises InvalidTimezoneIdentifier if the timezone is not found or the + # identifier is invalid. + def load_timezone_info(identifier) + raise InvalidTimezoneIdentifier, 'Invalid identifier' if identifier !~ /^[A-Za-z0-9\+\-_]+(\/[A-Za-z0-9\+\-_]+)*$/ + + identifier = identifier.gsub(/-/, '__m__').gsub(/\+/, '__p__') + + # Untaint identifier after it has been reassigned to a new string. We + # don't want to modify the original identifier. identifier may also be + # frozen and therefore cannot be untainted. + identifier.untaint + + identifier = identifier.split('/') + begin + require_definition(identifier) + + m = Data::Definitions + identifier.each {|part| + m = m.const_get(part) + } + + m.get + rescue LoadError, NameError => e + raise InvalidTimezoneIdentifier, e.message + end + end + + # Returns an array of all the available timezone identifiers. + def timezone_identifiers + load_timezone_index + Data::Indexes::Timezones.timezones + end + + # Returns an array of all the available timezone identifiers for + # data timezones (i.e. those that actually contain definitions). + def data_timezone_identifiers + load_timezone_index + Data::Indexes::Timezones.data_timezones + end + + # Returns an array of all the available timezone identifiers that + # are links to other timezones. + def linked_timezone_identifiers + load_timezone_index + Data::Indexes::Timezones.linked_timezones + end + + # Returns a CountryInfo instance for the given ISO 3166-1 alpha-2 + # country code. Raises InvalidCountryCode if the country could not be found + # or the code is invalid. + def load_country_info(code) + load_country_index + info = Data::Indexes::Countries.countries[code] + raise InvalidCountryCode, 'Invalid country code' unless info + info + end + + # Returns an array of all the available ISO 3166-1 alpha-2 + # country codes. + def country_codes + load_country_index + Data::Indexes::Countries.countries.keys.freeze + end + + # Returns the name of this DataSource. + def to_s + "Ruby DataSource" + end + + private + + # Requires a zone definition by its identifier (split on /). + def require_definition(identifier) + require_data(*(['definitions'] + identifier)) + end + + # Requires an index by its name. + def require_index(name) + require_data(*['indexes', name]) + end + + # Requires a file from tzinfo/data. + def require_data(*file) + require(File.join(@base_path, *file)) + end + + # Loads in the index of timezones if it hasn't already been loaded. + def load_timezone_index + unless @@timezone_index_loaded + require_index('timezones') + @@timezone_index_loaded = true + end + end + + # Loads in the index of countries if it hasn't already been loaded. + def load_country_index + unless @@country_index_loaded + require_index('countries') + @@country_index_loaded = true + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/time_or_datetime.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/time_or_datetime.rb new file mode 100644 index 000000000000..56c33147bb8b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/time_or_datetime.rb @@ -0,0 +1,351 @@ +require 'date' +require 'rational' unless defined?(Rational) +require 'time' + +module TZInfo + # Used by TZInfo internally to represent either a Time, DateTime or + # an Integer timestamp (seconds since 1970-01-01 00:00:00). + class TimeOrDateTime + include Comparable + + # Constructs a new TimeOrDateTime. timeOrDateTime can be a Time, DateTime + # or Integer. If using a Time or DateTime, any time zone information + # is ignored. + # + # Integer timestamps must be within the range supported by Time on the + # platform being used. + def initialize(timeOrDateTime) + @time = nil + @datetime = nil + @timestamp = nil + + if timeOrDateTime.is_a?(Time) + @time = timeOrDateTime + + # Avoid using the slower Rational class unless necessary. + nsec = RubyCoreSupport.time_nsec(@time) + usec = nsec % 1000 == 0 ? nsec / 1000 : Rational(nsec, 1000) + + @time = Time.utc(@time.year, @time.mon, @time.mday, @time.hour, @time.min, @time.sec, usec) unless @time.utc? + @orig = @time + elsif timeOrDateTime.is_a?(DateTime) + @datetime = timeOrDateTime + @datetime = @datetime.new_offset(0) unless @datetime.offset == 0 + @orig = @datetime + else + @timestamp = timeOrDateTime.to_i + + if !RubyCoreSupport.time_supports_64bit && (@timestamp > 2147483647 || @timestamp < -2147483648 || (@timestamp < 0 && !RubyCoreSupport.time_supports_negative)) + raise RangeError, 'Timestamp is outside the supported range of Time on this platform' + end + + @orig = @timestamp + end + end + + # Returns the time as a Time. + # + # When converting from a DateTime, the result is truncated to microsecond + # precision. + def to_time + # Thread-safety: It is possible that the value of @time may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @time is only + # calculated once. + + unless @time + result = if @timestamp + Time.at(@timestamp).utc + else + Time.utc(year, mon, mday, hour, min, sec, usec) + end + + return result if frozen? + @time = result + end + + @time + end + + # Returns the time as a DateTime. + # + # When converting from a Time, the result is truncated to microsecond + # precision. + def to_datetime + # Thread-safety: It is possible that the value of @datetime may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @datetime is only + # calculated once. + + unless @datetime + # Avoid using Rational unless necessary. + u = usec + s = u == 0 ? sec : Rational(sec * 1000000 + u, 1000000) + result = RubyCoreSupport.datetime_new(year, mon, mday, hour, min, s) + return result if frozen? + @datetime = result + end + + @datetime + end + + # Returns the time as an integer timestamp. + def to_i + # Thread-safety: It is possible that the value of @timestamp may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @timestamp is only + # calculated once. + + unless @timestamp + result = to_time.to_i + return result if frozen? + @timestamp = result + end + + @timestamp + end + + # Returns the time as the original time passed to new. + def to_orig + @orig + end + + # Returns a string representation of the TimeOrDateTime. + def to_s + if @orig.is_a?(Time) + "Time: #{@orig.to_s}" + elsif @orig.is_a?(DateTime) + "DateTime: #{@orig.to_s}" + else + "Timestamp: #{@orig.to_s}" + end + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #{@orig.inspect}>" + end + + # Returns the year. + def year + if @time + @time.year + elsif @datetime + @datetime.year + else + to_time.year + end + end + + # Returns the month of the year (1..12). + def mon + if @time + @time.mon + elsif @datetime + @datetime.mon + else + to_time.mon + end + end + alias :month :mon + + # Returns the day of the month (1..n). + def mday + if @time + @time.mday + elsif @datetime + @datetime.mday + else + to_time.mday + end + end + alias :day :mday + + # Returns the day of the week (0..6 for Sunday to Saturday). + def wday + if @time + @time.wday + elsif @datetime + @datetime.wday + else + to_time.wday + end + end + + # Returns the hour of the day (0..23). + def hour + if @time + @time.hour + elsif @datetime + @datetime.hour + else + to_time.hour + end + end + + # Returns the minute of the hour (0..59). + def min + if @time + @time.min + elsif @datetime + @datetime.min + else + to_time.min + end + end + + # Returns the second of the minute (0..60). (60 for a leap second). + def sec + if @time + @time.sec + elsif @datetime + @datetime.sec + else + to_time.sec + end + end + + # Returns the number of microseconds for the time. + def usec + if @time + @time.usec + elsif @datetime + # Ruby 1.8 has sec_fraction (of which the documentation says + # 'I do NOT recommend you to use this method'). sec_fraction no longer + # exists in Ruby 1.9. + + # Calculate the sec_fraction from the day_fraction. + ((@datetime.day_fraction - OffsetRationals.rational_for_offset(@datetime.hour * 3600 + @datetime.min * 60 + @datetime.sec)) * 86400000000).to_i + else + 0 + end + end + + # Compares this TimeOrDateTime with another Time, DateTime, timestamp + # (Integer) or TimeOrDateTime. Returns -1, 0 or +1 depending + # whether the receiver is less than, equal to, or greater than + # timeOrDateTime. + # + # Returns nil if the passed in timeOrDateTime is not comparable with + # TimeOrDateTime instances. + # + # Comparisons involving a DateTime will be performed using DateTime#<=>. + # Comparisons that don't involve a DateTime, but include a Time will be + # performed with Time#<=>. Otherwise comparisons will be performed with + # Integer#<=>. + def <=>(timeOrDateTime) + return nil unless timeOrDateTime.is_a?(TimeOrDateTime) || + timeOrDateTime.is_a?(Time) || + timeOrDateTime.is_a?(DateTime) || + timeOrDateTime.respond_to?(:to_i) + + unless timeOrDateTime.is_a?(TimeOrDateTime) + timeOrDateTime = TimeOrDateTime.wrap(timeOrDateTime) + end + + orig = timeOrDateTime.to_orig + + if @orig.is_a?(DateTime) || orig.is_a?(DateTime) + # If either is a DateTime, assume it is there for a reason + # (i.e. for its larger range of acceptable values on 32-bit systems). + to_datetime <=> timeOrDateTime.to_datetime + elsif @orig.is_a?(Time) || orig.is_a?(Time) + to_time <=> timeOrDateTime.to_time + else + to_i <=> timeOrDateTime.to_i + end + end + + # Adds a number of seconds to the TimeOrDateTime. Returns a new + # TimeOrDateTime, preserving what the original constructed type was. + # If the original type is a Time and the resulting calculation goes out of + # range for Times, then an exception will be raised by the Time class. + def +(seconds) + if seconds == 0 + self + else + if @orig.is_a?(DateTime) + TimeOrDateTime.new(@orig + OffsetRationals.rational_for_offset(seconds)) + else + # + defined for Time and Integer + TimeOrDateTime.new(@orig + seconds) + end + end + end + + # Subtracts a number of seconds from the TimeOrDateTime. Returns a new + # TimeOrDateTime, preserving what the original constructed type was. + # If the original type is a Time and the resulting calculation goes out of + # range for Times, then an exception will be raised by the Time class. + def -(seconds) + self + (-seconds) + end + + # Similar to the + operator, but converts to a DateTime based TimeOrDateTime + # where the Time or Integer timestamp to go out of the allowed range for a + # Time, converts to a DateTime based TimeOrDateTime. + # + # Note that the range of Time varies based on the platform. + def add_with_convert(seconds) + if seconds == 0 + self + else + if @orig.is_a?(DateTime) + TimeOrDateTime.new(@orig + OffsetRationals.rational_for_offset(seconds)) + else + # A Time or timestamp. + result = to_i + seconds + + if ((result > 2147483647 || result < -2147483648) && !RubyCoreSupport.time_supports_64bit) || (result < 0 && !RubyCoreSupport.time_supports_negative) + result = TimeOrDateTime.new(to_datetime + OffsetRationals.rational_for_offset(seconds)) + else + result = TimeOrDateTime.new(@orig + seconds) + end + end + end + end + + # Returns true if todt represents the same time and was originally + # constructed with the same type (DateTime, Time or timestamp) as this + # TimeOrDateTime. + def eql?(todt) + todt.kind_of?(TimeOrDateTime) && to_orig.eql?(todt.to_orig) + end + + # Returns a hash of this TimeOrDateTime. + def hash + @orig.hash + end + + # If no block is given, returns a TimeOrDateTime wrapping the given + # timeOrDateTime. If a block is specified, a TimeOrDateTime is constructed + # and passed to the block. The result of the block must be a TimeOrDateTime. + # + # The result of the block will be converted to the type of the originally + # passed in timeOrDateTime and then returned as the result of wrap. + # + # timeOrDateTime can be a Time, DateTime, timestamp (Integer) or + # TimeOrDateTime. If a TimeOrDateTime is passed in, no new TimeOrDateTime + # will be constructed and the value passed to wrap will be used when + # calling the block. + def self.wrap(timeOrDateTime) + t = timeOrDateTime.is_a?(TimeOrDateTime) ? timeOrDateTime : TimeOrDateTime.new(timeOrDateTime) + + if block_given? + t = yield t + + if timeOrDateTime.is_a?(TimeOrDateTime) + t + elsif timeOrDateTime.is_a?(Time) + t.to_time + elsif timeOrDateTime.is_a?(DateTime) + t.to_datetime + else + t.to_i + end + else + t + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone.rb new file mode 100644 index 000000000000..ee838b975a4f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone.rb @@ -0,0 +1,673 @@ +require 'date' +require 'set' +require 'thread_safe' + +module TZInfo + # AmbiguousTime is raised to indicates that a specified time in a local + # timezone has more than one possible equivalent UTC time. This happens when + # transitioning from daylight savings time to standard time where the clocks + # are rolled back. + # + # AmbiguousTime is raised by period_for_local and local_to_utc when using an + # ambiguous time and not specifying any means to resolve the ambiguity. + class AmbiguousTime < StandardError + end + + # PeriodNotFound is raised to indicate that no TimezonePeriod matching a given + # time could be found. + class PeriodNotFound < StandardError + end + + # Raised by Timezone#get if the identifier given is not valid. + class InvalidTimezoneIdentifier < StandardError + end + + # Raised if an attempt is made to use a timezone created with + # Timezone.new(nil). + class UnknownTimezone < StandardError + end + + # Timezone is the base class of all timezones. It provides a factory method, + # 'get', to access timezones by identifier. Once a specific Timezone has been + # retrieved, DateTimes, Times and timestamps can be converted between the UTC + # and the local time for the zone. For example: + # + # tz = TZInfo::Timezone.get('America/New_York') + # puts tz.utc_to_local(DateTime.new(2005,8,29,15,35,0)).to_s + # puts tz.local_to_utc(Time.utc(2005,8,29,11,35,0)).to_s + # puts tz.utc_to_local(1125315300).to_s + # + # Each time conversion method returns an object of the same type it was + # passed. + # + # The Timezone class is thread-safe. It is safe to use class and instance + # methods of Timezone in concurrently executing threads. Instances of Timezone + # can be shared across thread boundaries. + class Timezone + include Comparable + + # Cache of loaded zones by identifier to avoid using require if a zone + # has already been loaded. + # + # @!visibility private + @@loaded_zones = nil + + # Default value of the dst parameter of the local_to_utc and + # period_for_local methods. + # + # @!visibility private + @@default_dst = nil + + # Sets the default value of the optional dst parameter of the + # local_to_utc and period_for_local methods. Can be set to nil, true or + # false. + # + # The value of default_dst defaults to nil if unset. + def self.default_dst=(value) + @@default_dst = value.nil? ? nil : !!value + end + + # Gets the default value of the optional dst parameter of the + # local_to_utc and period_for_local methods. Can be set to nil, true or + # false. + def self.default_dst + @@default_dst + end + + # Returns a timezone by its identifier (e.g. "Europe/London", + # "America/Chicago" or "UTC"). + # + # Raises InvalidTimezoneIdentifier if the timezone couldn't be found. + def self.get(identifier) + instance = @@loaded_zones[identifier] + + unless instance + # Thread-safety: It is possible that multiple equivalent Timezone + # instances could be created here in concurrently executing threads. + # The consequences of this are that the data may be loaded more than + # once (depending on the data source) and memoized calculations could + # be discarded. The performance benefit of ensuring that only a single + # instance is created is unlikely to be worth the overhead of only + # allowing one Timezone to be loaded at a time. + info = data_source.load_timezone_info(identifier) + instance = info.create_timezone + @@loaded_zones[instance.identifier] = instance + end + + instance + end + + # Returns a proxy for the Timezone with the given identifier. The proxy + # will cause the real timezone to be loaded when an attempt is made to + # find a period or convert a time. get_proxy will not validate the + # identifier. If an invalid identifier is specified, no exception will be + # raised until the proxy is used. + def self.get_proxy(identifier) + TimezoneProxy.new(identifier) + end + + # If identifier is nil calls super(), otherwise calls get. An identfier + # should always be passed in when called externally. + def self.new(identifier = nil) + if identifier + get(identifier) + else + super() + end + end + + # Returns an array containing all the available Timezones. + # + # Returns TimezoneProxy objects to avoid the overhead of loading Timezone + # definitions until a conversion is actually required. + def self.all + get_proxies(all_identifiers) + end + + # Returns an array containing the identifiers of all the available + # Timezones. + def self.all_identifiers + data_source.timezone_identifiers + end + + # Returns an array containing all the available Timezones that are based + # on data (are not links to other Timezones). + # + # Returns TimezoneProxy objects to avoid the overhead of loading Timezone + # definitions until a conversion is actually required. + def self.all_data_zones + get_proxies(all_data_zone_identifiers) + end + + # Returns an array containing the identifiers of all the available + # Timezones that are based on data (are not links to other Timezones).. + def self.all_data_zone_identifiers + data_source.data_timezone_identifiers + end + + # Returns an array containing all the available Timezones that are links + # to other Timezones. + # + # Returns TimezoneProxy objects to avoid the overhead of loading Timezone + # definitions until a conversion is actually required. + def self.all_linked_zones + get_proxies(all_linked_zone_identifiers) + end + + # Returns an array containing the identifiers of all the available + # Timezones that are links to other Timezones. + def self.all_linked_zone_identifiers + data_source.linked_timezone_identifiers + end + + # Returns all the Timezones defined for all Countries. This is not the + # complete set of Timezones as some are not country specific (e.g. + # 'Etc/GMT'). + # + # Returns TimezoneProxy objects to avoid the overhead of loading Timezone + # definitions until a conversion is actually required. + def self.all_country_zones + Country.all_codes.inject([]) do |zones,country| + zones += Country.get(country).zones + end.uniq + end + + # Returns all the zone identifiers defined for all Countries. This is not the + # complete set of zone identifiers as some are not country specific (e.g. + # 'Etc/GMT'). You can obtain a Timezone instance for a given identifier + # with the get method. + def self.all_country_zone_identifiers + Country.all_codes.inject([]) do |zones,country| + zones += Country.get(country).zone_identifiers + end.uniq + end + + # Returns all US Timezone instances. A shortcut for + # TZInfo::Country.get('US').zones. + # + # Returns TimezoneProxy objects to avoid the overhead of loading Timezone + # definitions until a conversion is actually required. + def self.us_zones + Country.get('US').zones + end + + # Returns all US zone identifiers. A shortcut for + # TZInfo::Country.get('US').zone_identifiers. + def self.us_zone_identifiers + Country.get('US').zone_identifiers + end + + # The identifier of the timezone, e.g. "Europe/Paris". + def identifier + raise_unknown_timezone + end + + # An alias for identifier. + def name + # Don't use alias, as identifier gets overridden. + identifier + end + + # Returns a friendlier version of the identifier. + def to_s + friendly_identifier + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #{identifier}>" + end + + # Returns a friendlier version of the identifier. Set skip_first_part to + # omit the first part of the identifier (typically a region name) where + # there is more than one part. + # + # For example: + # + # Timezone.get('Europe/Paris').friendly_identifier(false) #=> "Europe - Paris" + # Timezone.get('Europe/Paris').friendly_identifier(true) #=> "Paris" + # Timezone.get('America/Indiana/Knox').friendly_identifier(false) #=> "America - Knox, Indiana" + # Timezone.get('America/Indiana/Knox').friendly_identifier(true) #=> "Knox, Indiana" + def friendly_identifier(skip_first_part = false) + parts = identifier.split('/') + if parts.empty? + # shouldn't happen + identifier + elsif parts.length == 1 + parts[0] + else + prefix = skip_first_part ? nil : "#{parts[0]} - " + + parts = parts.drop(1).map do |part| + part.gsub!(/_/, ' ') + + if part.index(/[a-z]/) + # Missing a space if a lower case followed by an upper case and the + # name isn't McXxxx. + part.gsub!(/([^M][a-z])([A-Z])/, '\1 \2') + part.gsub!(/([M][a-bd-z])([A-Z])/, '\1 \2') + + # Missing an apostrophe if two consecutive upper case characters. + part.gsub!(/([A-Z])([A-Z])/, '\1\'\2') + end + + part + end + + "#{prefix}#{parts.reverse.join(', ')}" + end + end + + # Returns the TimezonePeriod for the given UTC time. utc can either be + # a DateTime, Time or integer timestamp (Time.to_i). Any timezone + # information in utc is ignored (it is treated as a UTC time). + def period_for_utc(utc) + raise_unknown_timezone + end + + # Returns the set of TimezonePeriod instances that are valid for the given + # local time as an array. If you just want a single period, use + # period_for_local instead and specify how ambiguities should be resolved. + # Returns an empty array if no periods are found for the given time. + def periods_for_local(local) + raise_unknown_timezone + end + + # Returns an Array of TimezoneTransition instances representing the times + # where the UTC offset of the timezone changes. + # + # Transitions are returned up to a given date and time up to a given date + # and time, specified in UTC (utc_to). + # + # A from date and time may also be supplied using the utc_from parameter + # (also specified in UTC). If utc_from is not nil, only transitions from + # that date and time onwards will be returned. + # + # Comparisons with utc_to are exclusive. Comparisons with utc_from are + # inclusive. If a transition falls precisely on utc_to, it will be excluded. + # If a transition falls on utc_from, it will be included. + # + # Transitions returned are ordered by when they occur, from earliest to + # latest. + # + # utc_to and utc_from can be specified using either DateTime, Time or + # integer timestamps (Time.to_i). + # + # If utc_from is specified and utc_to is not greater than utc_from, then + # transitions_up_to raises an ArgumentError exception. + def transitions_up_to(utc_to, utc_from = nil) + raise_unknown_timezone + end + + # Returns the canonical Timezone instance for this Timezone. + # + # The IANA Time Zone database contains two types of definition: Zones and + # Links. Zones are defined by rules that set out when transitions occur. + # Links are just references to fully defined Zone, creating an alias for + # that Zone. + # + # Links are commonly used where a time zone has been renamed in a + # release of the Time Zone database. For example, the Zone US/Eastern was + # renamed as America/New_York. A US/Eastern Link was added in its place, + # linking to (and creating an alias for) for America/New_York. + # + # Links are also used for time zones that are currently identical to a full + # Zone, but that are administered seperately. For example, Europe/Vatican is + # a Link to (and alias for) Europe/Rome. + # + # For a full Zone, canonical_zone returns self. + # + # For a Link, canonical_zone returns a Timezone instance representing the + # full Zone that the link targets. + # + # TZInfo can be used with different data sources (see the documentation for + # TZInfo::DataSource). Please note that some DataSource implementations may + # not support distinguishing between full Zones and Links and will treat all + # time zones as full Zones. In this case, the canonical_zone will always + # return self. + # + # There are two built-in DataSource implementations. RubyDataSource (which + # will be used if the tzinfo-data gem is available) supports Link zones. + # ZoneinfoDataSource returns Link zones as if they were full Zones. If the + # canonical_zone or canonical_identifier methods are required, the + # tzinfo-data gem should be installed. + # + # The TZInfo::DataSource.get method can be used to check which DataSource + # implementation is being used. + def canonical_zone + raise_unknown_timezone + end + + # Returns the TimezonePeriod for the given local time. local can either be + # a DateTime, Time or integer timestamp (Time.to_i). Any timezone + # information in local is ignored (it is treated as a time in the current + # timezone). + # + # Warning: There are local times that have no equivalent UTC times (e.g. + # in the transition from standard time to daylight savings time). There are + # also local times that have more than one UTC equivalent (e.g. in the + # transition from daylight savings time to standard time). + # + # In the first case (no equivalent UTC time), a PeriodNotFound exception + # will be raised. + # + # In the second case (more than one equivalent UTC time), an AmbiguousTime + # exception will be raised unless the optional dst parameter or block + # handles the ambiguity. + # + # If the ambiguity is due to a transition from daylight savings time to + # standard time, the dst parameter can be used to select whether the + # daylight savings time or local time is used. For example, + # + # Timezone.get('America/New_York').period_for_local(DateTime.new(2004,10,31,1,30,0)) + # + # would raise an AmbiguousTime exception. + # + # Specifying dst=true would the daylight savings period from April to + # October 2004. Specifying dst=false would return the standard period + # from October 2004 to April 2005. + # + # If the dst parameter does not resolve the ambiguity, and a block is + # specified, it is called. The block must take a single parameter - an + # array of the periods that need to be resolved. The block can select and + # return a single period or return nil or an empty array + # to cause an AmbiguousTime exception to be raised. + # + # The default value of the dst parameter can be specified by setting + # Timezone.default_dst. If default_dst is not set, or is set to nil, then + # an AmbiguousTime exception will be raised in ambiguous situations unless + # a block is given to resolve the ambiguity. + def period_for_local(local, dst = Timezone.default_dst) + results = periods_for_local(local) + + if results.empty? + raise PeriodNotFound + elsif results.size < 2 + results.first + else + # ambiguous result try to resolve + + if !dst.nil? + matches = results.find_all {|period| period.dst? == dst} + results = matches if !matches.empty? + end + + if results.size < 2 + results.first + else + # still ambiguous, try the block + + if block_given? + results = yield results + end + + if results.is_a?(TimezonePeriod) + results + elsif results && results.size == 1 + results.first + else + raise AmbiguousTime, "#{local} is an ambiguous local time." + end + end + end + end + + # Converts a time in UTC to the local timezone. utc can either be + # a DateTime, Time or timestamp (Time.to_i). The returned time has the same + # type as utc. Any timezone information in utc is ignored (it is treated as + # a UTC time). + def utc_to_local(utc) + TimeOrDateTime.wrap(utc) {|wrapped| + period_for_utc(wrapped).to_local(wrapped) + } + end + + # Converts a time in the local timezone to UTC. local can either be + # a DateTime, Time or timestamp (Time.to_i). The returned time has the same + # type as local. Any timezone information in local is ignored (it is treated + # as a local time). + # + # Warning: There are local times that have no equivalent UTC times (e.g. + # in the transition from standard time to daylight savings time). There are + # also local times that have more than one UTC equivalent (e.g. in the + # transition from daylight savings time to standard time). + # + # In the first case (no equivalent UTC time), a PeriodNotFound exception + # will be raised. + # + # In the second case (more than one equivalent UTC time), an AmbiguousTime + # exception will be raised unless the optional dst parameter or block + # handles the ambiguity. + # + # If the ambiguity is due to a transition from daylight savings time to + # standard time, the dst parameter can be used to select whether the + # daylight savings time or local time is used. For example, + # + # Timezone.get('America/New_York').local_to_utc(DateTime.new(2004,10,31,1,30,0)) + # + # would raise an AmbiguousTime exception. + # + # Specifying dst=true would return 2004-10-31 5:30:00. Specifying dst=false + # would return 2004-10-31 6:30:00. + # + # If the dst parameter does not resolve the ambiguity, and a block is + # specified, it is called. The block must take a single parameter - an + # array of the periods that need to be resolved. The block can return a + # single period to use to convert the time or return nil or an empty array + # to cause an AmbiguousTime exception to be raised. + # + # The default value of the dst parameter can be specified by setting + # Timezone.default_dst. If default_dst is not set, or is set to nil, then + # an AmbiguousTime exception will be raised in ambiguous situations unless + # a block is given to resolve the ambiguity. + def local_to_utc(local, dst = Timezone.default_dst) + TimeOrDateTime.wrap(local) {|wrapped| + if block_given? + period = period_for_local(wrapped, dst) {|periods| yield periods } + else + period = period_for_local(wrapped, dst) + end + + period.to_utc(wrapped) + } + end + + # Returns information about offsets used by the Timezone up to a given + # date and time, specified using UTC (utc_to). The information is returned + # as an Array of TimezoneOffset instances. + # + # A from date and time may also be supplied using the utc_from parameter + # (also specified in UTC). If utc_from is not nil, only offsets used from + # that date and time forward will be returned. + # + # Comparisons with utc_to are exclusive. Comparisons with utc_from are + # inclusive. + # + # Offsets may be returned in any order. + # + # utc_to and utc_from can be specified using either DateTime, Time or + # integer timestamps (Time.to_i). + # + # If utc_from is specified and utc_to is not greater than utc_from, then + # offsets_up_to raises an ArgumentError exception. + def offsets_up_to(utc_to, utc_from = nil) + utc_to = TimeOrDateTime.wrap(utc_to) + transitions = transitions_up_to(utc_to, utc_from) + + if transitions.empty? + # No transitions in the range, find the period that covers it. + + if utc_from + # Use the from date as it is inclusive. + period = period_for_utc(utc_from) + else + # utc_to is exclusive, so this can't be used with period_for_utc. + # However, any time earlier than utc_to can be used. + + # Subtract 1 hour (since this is one of the cached OffsetRationals). + # Use add_with_convert so that conversion to DateTime is performed if + # required. + period = period_for_utc(utc_to.add_with_convert(-3600)) + end + + [period.offset] + else + result = Set.new + + first = transitions.first + result << first.previous_offset unless utc_from && first.at == utc_from + + transitions.each do |t| + result << t.offset + end + + result.to_a + end + end + + # Returns the canonical identifier for this Timezone. + # + # This is a shortcut for calling canonical_zone.identifier. Please refer + # to the canonical_zone documentation for further information. + def canonical_identifier + canonical_zone.identifier + end + + # Returns the current time in the timezone as a Time. + def now + utc_to_local(Time.now.utc) + end + + # Returns the TimezonePeriod for the current time. + def current_period + period_for_utc(Time.now.utc) + end + + # Returns the current Time and TimezonePeriod as an array. The first element + # is the time, the second element is the period. + def current_period_and_time + utc = Time.now.utc + period = period_for_utc(utc) + [period.to_local(utc), period] + end + + alias :current_time_and_period :current_period_and_time + + # Converts a time in UTC to local time and returns it as a string according + # to the given format. + # + # The formatting is identical to Time.strftime and DateTime.strftime, except + # %Z and %z are replaced with the timezone abbreviation (for example, EST or + # EDT) and offset for the specified Timezone and time. + # + # The offset can be formatted as follows: + # + # - %z - hour and minute (e.g. +0500) + # - %:z - hour and minute separated with a colon (e.g. +05:00) + # - %::z - hour minute and second separated with colons (e.g. +05:00:00) + # - %:::z - hour only (e.g. +05) + # + # Timezone#strftime currently handles the replacement of %z. From TZInfo + # version 2.0.0, %z will be passed to Time#strftime and DateTime#strftime + # instead. Some of the formatting options may cease to be available + # depending on the version of Ruby in use (for example, %:::z is only + # supported by Time#strftime from MRI version 2.0.0 onwards). + def strftime(format, utc = Time.now.utc) + utc = TimeOrDateTime.wrap(utc) + period = period_for_utc(utc) + local_wrapped = period.to_local(utc) + local = local_wrapped.to_orig + local = local_wrapped.to_time unless local.kind_of?(Time) || local.kind_of?(DateTime) + abbreviation = period.abbreviation.to_s.gsub(/%/, '%%') + + format = format.gsub(/%(%*)([sZ]|:*z)/) do + if $1.length.odd? + # Escaped literal percent or series of percents. Pass on to strftime. + "#$1%#$2" + elsif $2 == "s" + "#$1#{utc.to_i}" + elsif $2 == "Z" + "#$1#{abbreviation}" + else + m, s = period.utc_total_offset.divmod(60) + h, m = m.divmod(60) + case $2.length + when 1 + "#$1#{'%+03d%02d' % [h,m]}" + when 2 + "#$1#{'%+03d:%02d' % [h,m]}" + when 3 + "#$1#{'%+03d:%02d:%02d' % [h,m,s]}" + when 4 + "#$1#{'%+03d' % [h]}" + else # more than 3 colons - not a valid option + # Passing the invalid format string through to Time#strftime or + # DateTime#strtime would normally result in it being returned in the + # result. However, with Ruby 1.8.7 on Windows (as tested with Ruby + # 1.8.7-p374 from https://rubyinstaller.org/downloads/archives), + # this causes Time#strftime to always return an empty string (e.g. + # Time.now.strftime('a %::::z b') returns ''). + # + # Escape the percent to force it to be evaluated as a literal. + "#$1%%#$2" + end + end + end + + local.strftime(format) + end + + # Compares two Timezones based on their identifier. Returns -1 if tz is less + # than self, 0 if tz is equal to self and +1 if tz is greater than self. + # + # Returns nil if tz is not comparable with Timezone instances. + def <=>(tz) + return nil unless tz.is_a?(Timezone) + identifier <=> tz.identifier + end + + # Returns true if and only if the identifier of tz is equal to the + # identifier of this Timezone. + def eql?(tz) + self == tz + end + + # Returns a hash of this Timezone. + def hash + identifier.hash + end + + # Dumps this Timezone for marshalling. + def _dump(limit) + identifier + end + + # Loads a marshalled Timezone. + def self._load(data) + Timezone.get(data) + end + + private + # Initializes @@loaded_zones. + def self.init_loaded_zones + @@loaded_zones = ThreadSafe::Cache.new + end + init_loaded_zones + + # Returns an array of proxies corresponding to the given array of + # identifiers. + def self.get_proxies(identifiers) + identifiers.collect {|identifier| get_proxy(identifier)} + end + + # Returns the current DataSource. + def self.data_source + DataSource.get + end + + # Raises an UnknownTimezone exception. + def raise_unknown_timezone + raise UnknownTimezone, 'TZInfo::Timezone constructed directly' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_definition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_definition.rb new file mode 100644 index 000000000000..5ceb686e44f7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_definition.rb @@ -0,0 +1,36 @@ +module TZInfo + + # TimezoneDefinition is included into Timezone definition modules. + # TimezoneDefinition provides the methods for defining timezones. + # + # @private + module TimezoneDefinition #:nodoc: + # Add class methods to the includee. + def self.append_features(base) + super + base.extend(ClassMethods) + end + + # Class methods for inclusion. + # + # @private + module ClassMethods #:nodoc: + # Returns and yields a TransitionDataTimezoneInfo object to define a + # timezone. + def timezone(identifier) + yield @timezone = TransitionDataTimezoneInfo.new(identifier) + end + + # Defines a linked timezone. + def linked_timezone(identifier, link_to_identifier) + @timezone = LinkedTimezoneInfo.new(identifier, link_to_identifier) + end + + # Returns the last TimezoneInfo to be defined with timezone or + # linked_timezone. + def get + @timezone + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_index_definition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_index_definition.rb new file mode 100644 index 000000000000..59dc9530c5cf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_index_definition.rb @@ -0,0 +1,54 @@ +module TZInfo + # The timezone index file includes TimezoneIndexDefinition which provides + # methods used to define timezones in the index. + # + # @private + module TimezoneIndexDefinition #:nodoc: + # Add class methods to the includee and initialize class instance variables. + def self.append_features(base) + super + base.extend(ClassMethods) + base.instance_eval do + @timezones = [] + @data_timezones = [] + @linked_timezones = [] + end + end + + # Class methods for inclusion. + # + # @private + module ClassMethods #:nodoc: + # Defines a timezone based on data. + def timezone(identifier) + @timezones << identifier + @data_timezones << identifier + end + + # Defines a timezone which is a link to another timezone. + def linked_timezone(identifier) + @timezones << identifier + @linked_timezones << identifier + end + + # Returns a frozen array containing the identifiers of all the timezones. + # Identifiers appear in the order they were defined in the index. + def timezones + @timezones.freeze + end + + # Returns a frozen array containing the identifiers of all data timezones. + # Identifiers appear in the order they were defined in the index. + def data_timezones + @data_timezones.freeze + end + + # Returns a frozen array containing the identifiers of all linked + # timezones. Identifiers appear in the order they were defined in + # the index. + def linked_timezones + @linked_timezones.freeze + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_info.rb new file mode 100644 index 000000000000..13f66bad5c0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_info.rb @@ -0,0 +1,30 @@ +module TZInfo + # Represents a timezone defined by a data source. + class TimezoneInfo + + # The timezone identifier. + attr_reader :identifier + + # Constructs a new TimezoneInfo with an identifier. + def initialize(identifier) + @identifier = identifier + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #@identifier>" + end + + # Constructs a Timezone instance for the timezone represented by this + # TimezoneInfo. + def create_timezone + raise_not_implemented('create_timezone') + end + + private + + def raise_not_implemented(method_name) + raise NotImplementedError, "Subclasses must override #{method_name}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_offset.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_offset.rb new file mode 100644 index 000000000000..dbce0e92f41d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_offset.rb @@ -0,0 +1,101 @@ +module TZInfo + # Represents an offset defined in a Timezone data file. + class TimezoneOffset + # The base offset of the timezone from UTC in seconds. This does not include + # any adjustment made for daylight savings time and will typically remain + # constant throughout the year. + # + # To obtain the currently observed offset from UTC, including the effect of + # daylight savings time, use utc_total_offset instead. + # + # Note that zoneinfo files only include the value of utc_total_offset and a + # DST flag. When using ZoneinfoDataSource, the utc_offset will be derived + # from changes to the UTC total offset and the DST flag. As a consequence, + # utc_total_offset will always be correct, but utc_offset may be inaccurate. + # + # If you require utc_offset to be accurate, install the tzinfo-data gem and + # set RubyDataSource as the DataSource. + attr_reader :utc_offset + + # The offset from the time zone's standard time in seconds. Zero + # when daylight savings time is not in effect. Non-zero (usually 3600 = 1 + # hour) if daylight savings is being observed. + # + # Note that zoneinfo files only include the value of utc_total_offset and + # a DST flag. When using DataSources::ZoneinfoDataSource, the std_offset + # will be derived from changes to the UTC total offset and the DST flag. As + # a consequence, utc_total_offset will always be correct, but std_offset + # may be inaccurate. + # + # If you require std_offset to be accurate, install the tzinfo-data gem + # and set RubyDataSource as the DataSource. + attr_reader :std_offset + + # The total offset of this observance from UTC in seconds + # (utc_offset + std_offset). + attr_reader :utc_total_offset + + # The abbreviation that identifies this observance, e.g. "GMT" + # (Greenwich Mean Time) or "BST" (British Summer Time) for "Europe/London". The returned identifier is a + # symbol. + attr_reader :abbreviation + + # Constructs a new TimezoneOffset. utc_offset and std_offset are specified + # in seconds. + def initialize(utc_offset, std_offset, abbreviation) + @utc_offset = utc_offset + @std_offset = std_offset + @abbreviation = abbreviation + + @utc_total_offset = @utc_offset + @std_offset + end + + # True if std_offset is non-zero. + def dst? + @std_offset != 0 + end + + # Converts a UTC Time, DateTime or integer timestamp to local time, based on + # the offset of this period. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def to_local(utc) + TimeOrDateTime.wrap(utc) {|wrapped| + wrapped + @utc_total_offset + } + end + + # Converts a local Time, DateTime or integer timestamp to UTC, based on the + # offset of this period. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def to_utc(local) + TimeOrDateTime.wrap(local) {|wrapped| + wrapped - @utc_total_offset + } + end + + # Returns true if and only if toi has the same utc_offset, std_offset + # and abbreviation as this TimezoneOffset. + def ==(toi) + toi.kind_of?(TimezoneOffset) && + utc_offset == toi.utc_offset && std_offset == toi.std_offset && abbreviation == toi.abbreviation + end + + # Returns true if and only if toi has the same utc_offset, std_offset + # and abbreviation as this TimezoneOffset. + def eql?(toi) + self == toi + end + + # Returns a hash of this TimezoneOffset. + def hash + utc_offset.hash ^ std_offset.hash ^ abbreviation.hash + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #@utc_offset,#@std_offset,#@abbreviation>" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_period.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_period.rb new file mode 100644 index 000000000000..28058412ec82 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_period.rb @@ -0,0 +1,245 @@ +module TZInfo + # A period of time in a timezone where the same offset from UTC applies. + # + # All the methods that take times accept instances of Time or DateTime as well + # as Integer timestamps. + class TimezonePeriod + # The TimezoneTransition that defines the start of this TimezonePeriod + # (may be nil if unbounded). + attr_reader :start_transition + + # The TimezoneTransition that defines the end of this TimezonePeriod + # (may be nil if unbounded). + attr_reader :end_transition + + # The TimezoneOffset for this period. + attr_reader :offset + + # Initializes a new TimezonePeriod. + # + # TimezonePeriod instances should not normally be constructed manually. + def initialize(start_transition, end_transition, offset = nil) + @start_transition = start_transition + @end_transition = end_transition + + if offset + raise ArgumentError, 'Offset specified with transitions' if @start_transition || @end_transition + @offset = offset + else + if @start_transition + @offset = @start_transition.offset + elsif @end_transition + @offset = @end_transition.previous_offset + else + raise ArgumentError, 'No offset specified and no transitions to determine it from' + end + end + + @utc_total_offset_rational = nil + end + + # The base offset of the timezone from UTC in seconds. This does not include + # any adjustment made for daylight savings time and will typically remain + # constant throughout the year. + # + # To obtain the currently observed offset from UTC, including the effect of + # daylight savings time, use utc_total_offset instead. + # + # Note that zoneinfo files only include the value of utc_total_offset and a + # DST flag. When using ZoneinfoDataSource, the utc_offset will be derived + # from changes to the UTC total offset and the DST flag. As a consequence, + # utc_total_offset will always be correct, but utc_offset may be inaccurate. + # + # If you require utc_offset to be accurate, install the tzinfo-data gem and + # set RubyDataSource as the DataSource. + def utc_offset + @offset.utc_offset + end + + # The offset from the time zone's standard time in seconds. Zero + # when daylight savings time is not in effect. Non-zero (usually 3600 = 1 + # hour) if daylight savings is being observed. + # + # Note that zoneinfo files only include the value of utc_total_offset and + # a DST flag. When using DataSources::ZoneinfoDataSource, the std_offset + # will be derived from changes to the UTC total offset and the DST flag. As + # a consequence, utc_total_offset will always be correct, but std_offset + # may be inaccurate. + # + # If you require std_offset to be accurate, install the tzinfo-data gem + # and set RubyDataSource as the DataSource. + def std_offset + @offset.std_offset + end + + # The identifier of this period, e.g. "GMT" (Greenwich Mean Time) or "BST" + # (British Summer Time) for "Europe/London". The returned identifier is a + # symbol. + def abbreviation + @offset.abbreviation + end + alias :zone_identifier :abbreviation + + # Total offset from UTC (seconds). Equal to utc_offset + std_offset. + def utc_total_offset + @offset.utc_total_offset + end + + # Total offset from UTC (days). Result is a Rational. + def utc_total_offset_rational + # Thread-safety: It is possible that the value of + # @utc_total_offset_rational may be calculated multiple times in + # concurrently executing threads. It is not worth the overhead of locking + # to ensure that @zone_identifiers is only calculated once. + + unless @utc_total_offset_rational + result = OffsetRationals.rational_for_offset(utc_total_offset) + return result if frozen? + @utc_total_offset_rational = result + end + @utc_total_offset_rational + end + + # The start time of the period in UTC as a DateTime. May be nil if unbounded. + def utc_start + @start_transition ? @start_transition.at.to_datetime : nil + end + + # The start time of the period in UTC as a Time. May be nil if unbounded. + def utc_start_time + @start_transition ? @start_transition.at.to_time : nil + end + + # The end time of the period in UTC as a DateTime. May be nil if unbounded. + def utc_end + @end_transition ? @end_transition.at.to_datetime : nil + end + + # The end time of the period in UTC as a Time. May be nil if unbounded. + def utc_end_time + @end_transition ? @end_transition.at.to_time : nil + end + + # The start time of the period in local time as a DateTime. May be nil if + # unbounded. + def local_start + @start_transition ? @start_transition.local_start_at.to_datetime : nil + end + + # The start time of the period in local time as a Time. May be nil if + # unbounded. + def local_start_time + @start_transition ? @start_transition.local_start_at.to_time : nil + end + + # The end time of the period in local time as a DateTime. May be nil if + # unbounded. + def local_end + @end_transition ? @end_transition.local_end_at.to_datetime : nil + end + + # The end time of the period in local time as a Time. May be nil if + # unbounded. + def local_end_time + @end_transition ? @end_transition.local_end_at.to_time : nil + end + + # true if daylight savings is in effect for this period; otherwise false. + def dst? + @offset.dst? + end + + # true if this period is valid for the given UTC DateTime; otherwise false. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def valid_for_utc?(utc) + utc_after_start?(utc) && utc_before_end?(utc) + end + + # true if the given UTC DateTime is after the start of the period + # (inclusive); otherwise false. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def utc_after_start?(utc) + !@start_transition || @start_transition.at <= utc + end + + # true if the given UTC DateTime is before the end of the period + # (exclusive); otherwise false. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def utc_before_end?(utc) + !@end_transition || @end_transition.at > utc + end + + # true if this period is valid for the given local DateTime; otherwise + # false. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def valid_for_local?(local) + local_after_start?(local) && local_before_end?(local) + end + + # true if the given local DateTime is after the start of the period + # (inclusive); otherwise false. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def local_after_start?(local) + !@start_transition || @start_transition.local_start_at <= local + end + + # true if the given local DateTime is before the end of the period + # (exclusive); otherwise false. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def local_before_end?(local) + !@end_transition || @end_transition.local_end_at > local + end + + # Converts a UTC DateTime to local time based on the offset of this period. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def to_local(utc) + @offset.to_local(utc) + end + + # Converts a local DateTime to UTC based on the offset of this period. + # + # Deprecation warning: this method will be removed in TZInfo version 2.0.0. + def to_utc(local) + @offset.to_utc(local) + end + + # Returns true if this TimezonePeriod is equal to p. This compares the + # start_transition, end_transition and offset using ==. + def ==(p) + p.kind_of?(TimezonePeriod) && + start_transition == p.start_transition && + end_transition == p.end_transition && + offset == p.offset + end + + # Returns true if this TimezonePeriods is equal to p. This compares the + # start_transition, end_transition and offset using eql? + def eql?(p) + p.kind_of?(TimezonePeriod) && + start_transition.eql?(p.start_transition) && + end_transition.eql?(p.end_transition) && + offset.eql?(p.offset) + end + + # Returns a hash of this TimezonePeriod. + def hash + result = @start_transition.hash ^ @end_transition.hash + result ^= @offset.hash unless @start_transition || @end_transition + result + end + + # Returns internal object state as a programmer-readable string. + def inspect + result = "#<#{self.class}: #{@start_transition.inspect},#{@end_transition.inspect}" + result << ",#{@offset.inspect}>" unless @start_transition || @end_transition + result + '>' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_proxy.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_proxy.rb new file mode 100644 index 000000000000..c913011ceacf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_proxy.rb @@ -0,0 +1,105 @@ +module TZInfo + + # A proxy class representing a timezone with a given identifier. TimezoneProxy + # inherits from Timezone and can be treated like any Timezone loaded with + # Timezone.get. + # + # The first time an attempt is made to access the data for the timezone, the + # real Timezone is loaded. If the proxy's identifier was not valid, then an + # exception will be raised at this point. + class TimezoneProxy < Timezone + # Construct a new TimezoneProxy for the given identifier. The identifier + # is not checked when constructing the proxy. It will be validated on the + # when the real Timezone is loaded. + def self.new(identifier) + # Need to override new to undo the behaviour introduced in Timezone#new. + tzp = super() + tzp.send(:setup, identifier) + tzp + end + + # The identifier of the timezone, e.g. "Europe/Paris". + def identifier + @real_timezone ? @real_timezone.identifier : @identifier + end + + # Returns the TimezonePeriod for the given UTC time. utc can either be + # a DateTime, Time or integer timestamp (Time.to_i). Any timezone + # information in utc is ignored (it is treated as a UTC time). + def period_for_utc(utc) + real_timezone.period_for_utc(utc) + end + + # Returns the set of TimezonePeriod instances that are valid for the given + # local time as an array. If you just want a single period, use + # period_for_local instead and specify how abiguities should be resolved. + # Returns an empty array if no periods are found for the given time. + def periods_for_local(local) + real_timezone.periods_for_local(local) + end + + # Returns an Array of TimezoneTransition instances representing the times + # where the UTC offset of the timezone changes. + # + # Transitions are returned up to a given date and time up to a given date + # and time (to). + # + # A from date and time may also be supplied using the from parameter. If + # from is not nil, only transitions from that date and time onwards will be + # returned. + # + # Comparisons with to are exclusive. Comparisons with from are inclusive. + # If a transition falls precisely on to, it will be excluded. If a + # transition falls on from, it will be included. + # + # Transitions returned are ordered by when they occur, from earliest to + # latest. + # + # to and from can be specified using either a Time, DateTime, Time or + # Timestamp. + # + # If from is specified and to is not greater than from, then an + # ArgumentError exception is raised. + # + # ArgumentError is raised if to is nil or of either to or from are + # Timestamps with unspecified offsets. + def transitions_up_to(to, from = nil) + real_timezone.transitions_up_to(to, from) + end + + # Returns the canonical zone for this Timezone. + def canonical_zone + real_timezone.canonical_zone + end + + # Dumps this TimezoneProxy for marshalling. + def _dump(limit) + identifier + end + + # Loads a marshalled TimezoneProxy. + def self._load(data) + TimezoneProxy.new(data) + end + + private + def setup(identifier) + @identifier = identifier + @real_timezone = nil + end + + def real_timezone + # Thread-safety: It is possible that the value of @real_timezone may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @real_timezone is only + # calculated once. + unless @real_timezone + result = Timezone.get(@identifier) + return result if frozen? + @real_timezone = result + end + + @real_timezone + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_transition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_transition.rb new file mode 100644 index 000000000000..b905c627ae5d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_transition.rb @@ -0,0 +1,130 @@ +module TZInfo + # Represents a transition from one timezone offset to another at a particular + # date and time. + class TimezoneTransition + # The offset this transition changes to (a TimezoneOffset instance). + attr_reader :offset + + # The offset this transition changes from (a TimezoneOffset instance). + attr_reader :previous_offset + + # Initializes a new TimezoneTransition. + # + # TimezoneTransition instances should not normally be constructed manually. + def initialize(offset, previous_offset) + @offset = offset + @previous_offset = previous_offset + @local_end_at = nil + @local_start_at = nil + end + + # A TimeOrDateTime instance representing the UTC time when this transition + # occurs. + def at + raise_not_implemented('at') + end + + # The UTC time when this transition occurs, returned as a DateTime instance. + def datetime + at.to_datetime + end + + # The UTC time when this transition occurs, returned as a Time instance. + def time + at.to_time + end + + # A TimeOrDateTime instance representing the local time when this transition + # causes the previous observance to end (calculated from at using + # previous_offset). + def local_end_at + # Thread-safety: It is possible that the value of @local_end_at may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @local_end_at is only + # calculated once. + + unless @local_end_at + result = at.add_with_convert(@previous_offset.utc_total_offset) + return result if frozen? + @local_end_at = result + end + + @local_end_at + end + + # The local time when this transition causes the previous observance to end, + # returned as a DateTime instance. + def local_end + local_end_at.to_datetime + end + + # The local time when this transition causes the previous observance to end, + # returned as a Time instance. + def local_end_time + local_end_at.to_time + end + + # A TimeOrDateTime instance representing the local time when this transition + # causes the next observance to start (calculated from at using offset). + def local_start_at + # Thread-safety: It is possible that the value of @local_start_at may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @local_start_at is only + # calculated once. + + unless @local_start_at + result = at.add_with_convert(@offset.utc_total_offset) + return result if frozen? + @local_start_at = result + end + + @local_start_at + end + + # The local time when this transition causes the next observance to start, + # returned as a DateTime instance. + def local_start + local_start_at.to_datetime + end + + # The local time when this transition causes the next observance to start, + # returned as a Time instance. + def local_start_time + local_start_at.to_time + end + + # Returns true if this TimezoneTransition is equal to the given + # TimezoneTransition. Two TimezoneTransition instances are + # considered to be equal by == if offset, previous_offset and at are all + # equal. + def ==(tti) + tti.kind_of?(TimezoneTransition) && + offset == tti.offset && previous_offset == tti.previous_offset && at == tti.at + end + + # Returns true if this TimezoneTransition is equal to the given + # TimezoneTransition. Two TimezoneTransition instances are + # considered to be equal by eql? if offset, previous_offset and at are all + # equal and the type used to define at in both instances is the same. + def eql?(tti) + tti.kind_of?(TimezoneTransition) && + offset == tti.offset && previous_offset == tti.previous_offset && at.eql?(tti.at) + end + + # Returns a hash of this TimezoneTransition instance. + def hash + @offset.hash ^ @previous_offset.hash ^ at.hash + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #{at.inspect},#{@offset.inspect}>" + end + + private + + def raise_not_implemented(method_name) + raise NotImplementedError, "Subclasses must override #{method_name}" + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_transition_definition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_transition_definition.rb new file mode 100644 index 000000000000..016816b8506d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/timezone_transition_definition.rb @@ -0,0 +1,104 @@ +module TZInfo + # A TimezoneTransition defined by as integer timestamp, as a rational to + # create a DateTime or as both. + # + # @private + class TimezoneTransitionDefinition < TimezoneTransition #:nodoc: + # The numerator of the DateTime if the transition time is defined as a + # DateTime, otherwise the transition time as a timestamp. + attr_reader :numerator_or_time + protected :numerator_or_time + + # Either the denominator of the DateTime if the transition time is defined + # as a DateTime, otherwise nil. + attr_reader :denominator + protected :denominator + + # Creates a new TimezoneTransitionDefinition with the given offset, + # previous_offset (both TimezoneOffset instances) and UTC time. + # + # The time can be specified as a timestamp, as a rational to create a + # DateTime, or as both. + # + # If both a timestamp and rational are given, then the rational will only + # be used if the timestamp falls outside of the range of Time on the + # platform being used at runtime. + # + # DateTimes are created from the rational as follows: + # + # RubyCoreSupport.datetime_new!(RubyCoreSupport.rational_new!(numerator, denominator), 0, Date::ITALY) + # + # For performance reasons, the numerator and denominator must be specified + # in their lowest form. + def initialize(offset, previous_offset, numerator_or_timestamp, denominator_or_numerator = nil, denominator = nil) + super(offset, previous_offset) + + if denominator + numerator = denominator_or_numerator + timestamp = numerator_or_timestamp + elsif denominator_or_numerator + numerator = numerator_or_timestamp + denominator = denominator_or_numerator + timestamp = nil + else + numerator = nil + denominator = nil + timestamp = numerator_or_timestamp + end + + # Determine whether to use the timestamp or the numerator and denominator. + if numerator && ( + !timestamp || + (timestamp < 0 && !RubyCoreSupport.time_supports_negative) || + ((timestamp < -2147483648 || timestamp > 2147483647) && !RubyCoreSupport.time_supports_64bit) + ) + + @numerator_or_time = numerator + @denominator = denominator + else + @numerator_or_time = timestamp + @denominator = nil + end + + @at = nil + end + + # A TimeOrDateTime instance representing the UTC time when this transition + # occurs. + def at + # Thread-safety: It is possible that the value of @at may be calculated + # multiple times in concurrently executing threads. It is not worth the + # overhead of locking to ensure that @at is only calculated once. + + unless @at + result = unless @denominator + TimeOrDateTime.new(@numerator_or_time) + else + r = RubyCoreSupport.rational_new!(@numerator_or_time, @denominator) + dt = RubyCoreSupport.datetime_new!(r, 0, Date::ITALY) + TimeOrDateTime.new(dt) + end + + return result if frozen? + @at = result + end + + @at + end + + # Returns true if this TimezoneTransitionDefinition is equal to the given + # TimezoneTransitionDefinition. Two TimezoneTransitionDefinition instances + # are considered to be equal by eql? if offset, previous_offset, + # numerator_or_time and denominator are all equal. + def eql?(tti) + tti.kind_of?(TimezoneTransitionDefinition) && + offset == tti.offset && previous_offset == tti.previous_offset && + numerator_or_time == tti.numerator_or_time && denominator == tti.denominator + end + + # Returns a hash of this TimezoneTransitionDefinition instance. + def hash + @offset.hash ^ @previous_offset.hash ^ @numerator_or_time.hash ^ @denominator.hash + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/transition_data_timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/transition_data_timezone_info.rb new file mode 100644 index 000000000000..026bf227a735 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/transition_data_timezone_info.rb @@ -0,0 +1,274 @@ +module TZInfo + # Raised if no offsets have been defined when calling period_for_utc or + # periods_for_local. Indicates an error in the timezone data. + class NoOffsetsDefined < StandardError + end + + # Represents a data timezone defined by a set of offsets and a set + # of transitions. + # + # @private + class TransitionDataTimezoneInfo < DataTimezoneInfo #:nodoc: + + # Constructs a new TransitionDataTimezoneInfo with its identifier. + def initialize(identifier) + super(identifier) + @offsets = {} + @transitions = [] + @previous_offset = nil + @transitions_index = nil + end + + # Defines a offset. The id uniquely identifies this offset within the + # timezone. utc_offset and std_offset define the offset in seconds of + # standard time from UTC and daylight savings from standard time + # respectively. abbreviation describes the timezone offset (e.g. GMT, BST, + # EST or EDT). + # + # The first offset to be defined is treated as the offset that applies + # until the first transition. This will usually be in Local Mean Time (LMT). + # + # ArgumentError will be raised if the id is already defined. + def offset(id, utc_offset, std_offset, abbreviation) + raise ArgumentError, 'Offset already defined' if @offsets.has_key?(id) + + offset = TimezoneOffset.new(utc_offset, std_offset, abbreviation) + @offsets[id] = offset + @previous_offset = offset unless @previous_offset + end + + # Defines a transition. Transitions must be defined in chronological order. + # ArgumentError will be raised if a transition is added out of order. + # offset_id refers to an id defined with offset. ArgumentError will be + # raised if the offset_id cannot be found. numerator_or_time and + # denomiator specify the time the transition occurs as. See + # TimezoneTransition for more detail about specifying times. + def transition(year, month, offset_id, numerator_or_timestamp, denominator_or_numerator = nil, denominator = nil) + offset = @offsets[offset_id] + raise ArgumentError, 'Offset not found' unless offset + + if @transitions_index + if year < @last_year || (year == @last_year && month < @last_month) + raise ArgumentError, 'Transitions must be increasing date order' + end + + # Record the position of the first transition with this index. + index = transition_index(year, month) + @transitions_index[index] ||= @transitions.length + + # Fill in any gaps + (index - 1).downto(0) do |i| + break if @transitions_index[i] + @transitions_index[i] = @transitions.length + end + else + @transitions_index = [@transitions.length] + @start_year = year + @start_month = month + end + + @transitions << TimezoneTransitionDefinition.new(offset, @previous_offset, + numerator_or_timestamp, denominator_or_numerator, denominator) + @last_year = year + @last_month = month + @previous_offset = offset + end + + # Returns the TimezonePeriod for the given UTC time. + # Raises NoOffsetsDefined if no offsets have been defined. + def period_for_utc(utc) + unless @transitions.empty? + utc = TimeOrDateTime.wrap(utc) + index = transition_index(utc.year, utc.mon) + + start_transition = nil + start = transition_before_end(index) + if start + start.downto(0) do |i| + if @transitions[i].at <= utc + start_transition = @transitions[i] + break + end + end + end + + end_transition = nil + start = transition_after_start(index) + if start + start.upto(@transitions.length - 1) do |i| + if @transitions[i].at > utc + end_transition = @transitions[i] + break + end + end + end + + if start_transition || end_transition + TimezonePeriod.new(start_transition, end_transition) + else + # Won't happen since there are transitions. Must always find one + # transition that is either >= or < the specified time. + raise 'No transitions found in search' + end + else + raise NoOffsetsDefined, 'No offsets have been defined' unless @previous_offset + TimezonePeriod.new(nil, nil, @previous_offset) + end + end + + # Returns the set of TimezonePeriods for the given local time as an array. + # Results returned are ordered by increasing UTC start date. + # Returns an empty array if no periods are found for the given time. + # Raises NoOffsetsDefined if no offsets have been defined. + def periods_for_local(local) + unless @transitions.empty? + local = TimeOrDateTime.wrap(local) + index = transition_index(local.year, local.mon) + + result = [] + + start_index = transition_after_start(index - 1) + if start_index && @transitions[start_index].local_end_at > local + if start_index > 0 + if @transitions[start_index - 1].local_start_at <= local + result << TimezonePeriod.new(@transitions[start_index - 1], @transitions[start_index]) + end + else + result << TimezonePeriod.new(nil, @transitions[start_index]) + end + end + + end_index = transition_before_end(index + 1) + + if end_index + start_index = end_index unless start_index + + start_index.upto(transition_before_end(index + 1)) do |i| + if @transitions[i].local_start_at <= local + if i + 1 < @transitions.length + if @transitions[i + 1].local_end_at > local + result << TimezonePeriod.new(@transitions[i], @transitions[i + 1]) + end + else + result << TimezonePeriod.new(@transitions[i], nil) + end + end + end + end + + result + else + raise NoOffsetsDefined, 'No offsets have been defined' unless @previous_offset + [TimezonePeriod.new(nil, nil, @previous_offset)] + end + end + + # Returns an Array of TimezoneTransition instances representing the times + # where the UTC offset of the timezone changes. + # + # Transitions are returned up to a given date and time up to a given date + # and time, specified in UTC (utc_to). + # + # A from date and time may also be supplied using the utc_from parameter + # (also specified in UTC). If utc_from is not nil, only transitions from + # that date and time onwards will be returned. + # + # Comparisons with utc_to are exclusive. Comparisons with utc_from are + # inclusive. If a transition falls precisely on utc_to, it will be excluded. + # If a transition falls on utc_from, it will be included. + # + # Transitions returned are ordered by when they occur, from earliest to + # latest. + # + # utc_to and utc_from can be specified using either DateTime, Time or + # integer timestamps (Time.to_i). + # + # If utc_from is specified and utc_to is not greater than utc_from, then + # transitions_up_to raises an ArgumentError exception. + def transitions_up_to(utc_to, utc_from = nil) + utc_to = TimeOrDateTime.wrap(utc_to) + utc_from = utc_from ? TimeOrDateTime.wrap(utc_from) : nil + + if utc_from && utc_to <= utc_from + raise ArgumentError, 'utc_to must be greater than utc_from' + end + + unless @transitions.empty? + if utc_from + from = transition_after_start(transition_index(utc_from.year, utc_from.mon)) + + if from + while from < @transitions.length && @transitions[from].at < utc_from + from += 1 + end + + if from >= @transitions.length + return [] + end + else + # utc_from is later than last transition. + return [] + end + else + from = 0 + end + + to = transition_before_end(transition_index(utc_to.year, utc_to.mon)) + + if to + while to >= 0 && @transitions[to].at >= utc_to + to -= 1 + end + + if to < 0 + return [] + end + else + # utc_to is earlier than first transition. + return [] + end + + @transitions[from..to] + else + [] + end + end + + private + # Returns the index into the @transitions_index array for a given year + # and month. + def transition_index(year, month) + index = (year - @start_year) * 2 + index += 1 if month > 6 + index -= 1 if @start_month > 6 + index + end + + # Returns the index into @transitions of the first transition that occurs + # on or after the start of the given index into @transitions_index. + # Returns nil if there are no such transitions. + def transition_after_start(index) + if index >= @transitions_index.length + nil + else + index = 0 if index < 0 + @transitions_index[index] + end + end + + # Returns the index into @transitions of the first transition that occurs + # before the end of the given index into @transitions_index. + # Returns nil if there are no such transitions. + def transition_before_end(index) + index = index + 1 + + if index <= 0 + nil + elsif index >= @transitions_index.length + @transitions.length - 1 + else + @transitions_index[index] - 1 + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/transition_rule.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/transition_rule.rb new file mode 100644 index 000000000000..b8d160528bc3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/transition_rule.rb @@ -0,0 +1,325 @@ +require 'date' + +module TZInfo + # Base class for rules definining the transition between standard and daylight + # savings time. + class TransitionRule #:nodoc: + # Returns the number of seconds after midnight local time on the day + # identified by the rule at which the transition occurs. Can be negative to + # denote a time on the prior day. Can be greater than or equal to 86,400 to + # denote a time of the following day. + attr_reader :transition_at + + # Initializes a new TransitionRule. + def initialize(transition_at) + raise ArgumentError, 'Invalid transition_at' unless transition_at.kind_of?(Integer) + @transition_at = transition_at + end + + # Calculates the UTC time of the transition from a given offset on a given + # year. + def at(offset, year) + day = get_day(year) + day.add_with_convert(@transition_at - offset.utc_total_offset) + end + + # Determines if this TransitionRule is equal to another instance. + def ==(r) + r.kind_of?(TransitionRule) && @transition_at == r.transition_at + end + alias eql? == + + # Returns a hash based on hash_args (defaulting to transition_at). + def hash + hash_args.hash + end + + protected + + # Returns an Array of parameters that will influence the output of hash. + def hash_args + [@transition_at] + end + + def new_time_or_datetime(year, month = 1, day = 1) + result = if ((year >= 2039 || (year == 2038 && (month >= 2 || (month == 1 && day >= 20)))) && !RubyCoreSupport.time_supports_64bit) || + (year < 1970 && !RubyCoreSupport.time_supports_negative) + + # Time handles 29 February on a non-leap year as 1 March. + # DateTime rejects. Advance manually. + if month == 2 && day == 29 && !Date.gregorian_leap?(year) + month = 3 + day = 1 + end + + RubyCoreSupport.datetime_new(year, month, day) + else + Time.utc(year, month, day) + end + + TimeOrDateTime.wrap(result) + end + end + + # A base class for transition rules that activate based on an integer day of + # the year. + # + # @private + class DayOfYearTransitionRule < TransitionRule #:nodoc: + # Initializes a new DayOfYearTransitionRule. + def initialize(day, transition_at) + super(transition_at) + raise ArgumentError, 'Invalid day' unless day.kind_of?(Integer) + @seconds = day * 86400 + end + + # Determines if this DayOfYearTransitionRule is equal to another instance. + def ==(r) + super(r) && r.kind_of?(DayOfYearTransitionRule) && @seconds == r.seconds + end + alias eql? == + + protected + + # @return [Integer] the day multipled by the number of seconds in a day. + attr_reader :seconds + + # Returns an Array of parameters that will influence the output of hash. + def hash_args + [@seconds] + super + end + end + + # Defines transitions that occur on the zero-based nth day of the year. + # + # Day 0 is 1 January. + # + # Leap days are counted. Day 59 will be 29 February on a leap year and 1 March + # on a non-leap year. Day 365 will be 31 December on a leap year and 1 January + # the following year on a non-leap year. + # + # @private + class AbsoluteDayOfYearTransitionRule < DayOfYearTransitionRule #:nodoc: + # Initializes a new AbsoluteDayOfYearTransitionRule. + def initialize(day, transition_at = 0) + super(day, transition_at) + raise ArgumentError, 'Invalid day' unless day >= 0 && day <= 365 + end + + # Returns true if the day specified by this transition is the first in the + # year (a day number of 0), otherwise false. + def is_always_first_day_of_year? + seconds == 0 + end + + # @returns false. + def is_always_last_day_of_year? + false + end + + # Determines if this AbsoluteDayOfYearTransitionRule is equal to another + # instance. + def ==(r) + super(r) && r.kind_of?(AbsoluteDayOfYearTransitionRule) + end + alias eql? == + + protected + + # Returns a TimeOrDateTime representing midnight local time on the day + # specified by the rule for the given offset and year. + def get_day(year) + new_time_or_datetime(year).add_with_convert(seconds) + end + + # Returns an Array of parameters that will influence the output of hash. + def hash_args + [AbsoluteDayOfYearTransitionRule] + super + end + end + + # Defines transitions that occur on the one-based nth Julian day of the year. + # + # Leap days are not counted. Day 1 is 1 January. Day 60 is always 1 March. + # Day 365 is always 31 December. + # + # @private + class JulianDayOfYearTransitionRule < DayOfYearTransitionRule #:nodoc: + # The 60 days in seconds. + LEAP = 60 * 86400 + + # The length of a non-leap year in seconds. + YEAR = 365 * 86400 + + # Initializes a new JulianDayOfYearTransitionRule. + def initialize(day, transition_at = 0) + super(day, transition_at) + raise ArgumentError, 'Invalid day' unless day >= 1 && day <= 365 + end + + # Returns true if the day specified by this transition is the first in the + # year (a day number of 1), otherwise false. + def is_always_first_day_of_year? + seconds == 86400 + end + + # Returns true if the day specified by this transition is the last in the + # year (a day number of 365), otherwise false. + def is_always_last_day_of_year? + seconds == YEAR + end + + # Determines if this JulianDayOfYearTransitionRule is equal to another + # instance. + def ==(r) + super(r) && r.kind_of?(JulianDayOfYearTransitionRule) + end + alias eql? == + + protected + + # Returns a TimeOrDateTime representing midnight local time on the day + # specified by the rule for the given offset and year. + def get_day(year) + # Returns 1 March on non-leap years. + leap = new_time_or_datetime(year, 2, 29) + diff = seconds - LEAP + diff += 86400 if diff >= 0 && leap.mday == 29 + leap.add_with_convert(diff) + end + + # Returns an Array of parameters that will influence the output of hash. + def hash_args + [JulianDayOfYearTransitionRule] + super + end + end + + # A base class for rules that transition on a particular day of week of a + # given week (subclasses specify which week of the month). + # + # @private + class DayOfWeekTransitionRule < TransitionRule #:nodoc: + # Initializes a new DayOfWeekTransitionRule. + def initialize(month, day_of_week, transition_at) + super(transition_at) + raise ArgumentError, 'Invalid month' unless month.kind_of?(Integer) && month >= 1 && month <= 12 + raise ArgumentError, 'Invalid day_of_week' unless day_of_week.kind_of?(Integer) && day_of_week >= 0 && day_of_week <= 6 + @month = month + @day_of_week = day_of_week + end + + # Returns false. + def is_always_first_day_of_year? + false + end + + # Returns false. + def is_always_last_day_of_year? + false + end + + # Determines if this DayOfWeekTransitionRule is equal to another instance. + def ==(r) + super(r) && r.kind_of?(DayOfWeekTransitionRule) && @month == r.month && @day_of_week == r.day_of_week + end + alias eql? == + + protected + + # Returns the month of the year (1 to 12). + attr_reader :month + + # Returns the day of the week (0 to 6 for Sunday to Monday). + attr_reader :day_of_week + + # Returns an Array of parameters that will influence the output of hash. + def hash_args + [@month, @day_of_week] + super + end + end + + # A rule that transitions on the nth occurrence of a particular day of week + # of a calendar month. + # + # @private + class DayOfMonthTransitionRule < DayOfWeekTransitionRule #:nodoc: + # Initializes a new DayOfMonthTransitionRule. + def initialize(month, week, day_of_week, transition_at = 0) + super(month, day_of_week, transition_at) + raise ArgumentError, 'Invalid week' unless week.kind_of?(Integer) && week >= 1 && week <= 4 + @offset_start = (week - 1) * 7 + 1 + end + + # Determines if this DayOfMonthTransitionRule is equal to another instance. + def ==(r) + super(r) && r.kind_of?(DayOfMonthTransitionRule) && @offset_start == r.offset_start + end + alias eql? == + + protected + + # Returns the day the week starts on for a month starting on a Sunday. + attr_reader :offset_start + + # Returns a TimeOrDateTime representing midnight local time on the day + # specified by the rule for the given offset and year. + def get_day(year) + candidate = new_time_or_datetime(year, month, @offset_start) + diff = day_of_week - candidate.wday + + if diff < 0 + candidate.add_with_convert((7 + diff) * 86400) + elsif diff > 0 + candidate.add_with_convert(diff * 86400) + else + candidate + end + end + + # Returns an Array of parameters that will influence the output of hash. + def hash_args + [@offset_start] + super + end + end + + # A rule that transitions on the last occurrence of a particular day of week + # of a calendar month. + # + # @private + class LastDayOfMonthTransitionRule < DayOfWeekTransitionRule #:nodoc: + # Initializes a new LastDayOfMonthTransitionRule. + def initialize(month, day_of_week, transition_at = 0) + super(month, day_of_week, transition_at) + end + + # Determines if this LastDayOfMonthTransitionRule is equal to another + # instance. + def ==(r) + super(r) && r.kind_of?(LastDayOfMonthTransitionRule) + end + alias eql? == + + protected + + # Returns a TimeOrDateTime representing midnight local time on the day + # specified by the rule for the given offset and year. + def get_day(year) + next_month = month + 1 + if next_month == 13 + year += 1 + next_month = 1 + end + + candidate = new_time_or_datetime(year, next_month).add_with_convert(-86400) + diff = candidate.wday - day_of_week + + if diff < 0 + candidate - (diff + 7) * 86400 + elsif diff > 0 + candidate - diff * 86400 + else + candidate + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/zoneinfo_country_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/zoneinfo_country_info.rb new file mode 100644 index 000000000000..c99acaa8ed73 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/zoneinfo_country_info.rb @@ -0,0 +1,37 @@ +module TZInfo + # Represents information about a country returned by ZoneinfoDataSource. + # + # @private + class ZoneinfoCountryInfo < CountryInfo #:nodoc: + # Constructs a new CountryInfo with an ISO 3166 country code, name and + # an array of CountryTimezones. + def initialize(code, name, zones) + super(code, name) + @zones = zones.dup.freeze + @zone_identifiers = nil + end + + # Returns a frozen array of all the zone identifiers for the country ordered + # geographically, most populous first. + def zone_identifiers + # Thread-safety: It is possible that the value of @zone_identifiers may be + # calculated multiple times in concurrently executing threads. It is not + # worth the overhead of locking to ensure that @zone_identifiers is only + # calculated once. + + unless @zone_identifiers + result = zones.collect {|zone| zone.identifier}.freeze + return result if frozen? + @zone_identifiers = result + end + + @zone_identifiers + end + + # Returns a frozen array of all the timezones for the for the country + # ordered geographically, most populous first. + def zones + @zones + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/zoneinfo_data_source.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/zoneinfo_data_source.rb new file mode 100644 index 000000000000..3959090f8154 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/zoneinfo_data_source.rb @@ -0,0 +1,497 @@ +module TZInfo + # Use send as a workaround for an issue on JRuby 9.2.9.0 where using the + # refinement causes calls to RubyCoreSupport.file_open to fail to pass the + # block parameter. + # + # https://travis-ci.org/tzinfo/tzinfo/jobs/628812051#L1931 + # https://github.com/jruby/jruby/issues/6009 + send(:using, TZInfo::RubyCoreSupport::UntaintExt) if TZInfo::RubyCoreSupport.const_defined?(:UntaintExt) + + # An InvalidZoneinfoDirectory exception is raised if the DataSource is + # set to a specific zoneinfo path, which is not a valid zoneinfo directory + # (i.e. a directory containing index files named iso3166.tab and zone.tab + # as well as other timezone files). + class InvalidZoneinfoDirectory < StandardError + end + + # A ZoneinfoDirectoryNotFound exception is raised if no valid zoneinfo + # directory could be found when checking the paths listed in + # ZoneinfoDataSource.search_path. A valid zoneinfo directory is one that + # contains timezone files, a country code index file named iso3166.tab and a + # timezone index file named zone1970.tab or zone.tab. + class ZoneinfoDirectoryNotFound < StandardError + end + + # A DataSource that loads data from a 'zoneinfo' directory containing + # compiled "TZif" version 3 (or earlier) files in addition to iso3166.tab and + # zone1970.tab or zone.tab index files. + # + # To have TZInfo load the system zoneinfo files, call TZInfo::DataSource.set + # as follows: + # + # TZInfo::DataSource.set(:zoneinfo) + # + # To load zoneinfo files from a particular directory, pass the directory to + # TZInfo::DataSource.set: + # + # TZInfo::DataSource.set(:zoneinfo, directory) + # + # Note that the platform used at runtime may limit the range of available + # transition data that can be loaded from zoneinfo files. There are two + # factors to consider: + # + # First of all, the zoneinfo support in TZInfo makes use of Ruby's Time class. + # On 32-bit builds of Ruby 1.8, the Time class only supports 32-bit + # timestamps. This means that only Times between 1901-12-13 20:45:52 and + # 2038-01-19 03:14:07 can be represented. Furthermore, certain platforms only + # allow for positive 32-bit timestamps (notably Windows), making the earliest + # representable time 1970-01-01 00:00:00. + # + # 64-bit builds of Ruby 1.8 and all builds of Ruby 1.9 support 64-bit + # timestamps. This means that there is no practical restriction on the range + # of the Time class on these platforms. + # + # TZInfo will only load transitions that fall within the supported range of + # the Time class. Any queries performed on times outside of this range may + # give inaccurate results. + # + # The second factor concerns the zoneinfo files. Versions of the 'zic' tool + # (used to build zoneinfo files) that were released prior to February 2006 + # created zoneinfo files that used 32-bit integers for transition timestamps. + # Later versions of zic produce zoneinfo files that use 64-bit integers. If + # you have 32-bit zoneinfo files on your system, then any queries falling + # outside of the range 1901-12-13 20:45:52 to 2038-01-19 03:14:07 may be + # inaccurate. + # + # Most modern platforms include 64-bit zoneinfo files. However, Mac OS X (up + # to at least 10.8.4) still uses 32-bit zoneinfo files. + # + # To check whether your zoneinfo files contain 32-bit or 64-bit transition + # data, you can run the following code (substituting the identifier of the + # zone you want to test for zone_identifier): + # + # TZInfo::DataSource.set(:zoneinfo) + # dir = TZInfo::DataSource.get.zoneinfo_dir + # File.open(File.join(dir, zone_identifier), 'r') {|f| f.read(5) } + # + # If the last line returns "TZif\\x00", then you have a 32-bit zoneinfo file. + # If it returns "TZif2" or "TZif3" then you have a 64-bit zoneinfo file. + # + # If you require support for 64-bit transitions, but are restricted to 32-bit + # zoneinfo support, then you may want to consider using TZInfo::RubyDataSource + # instead. + class ZoneinfoDataSource < DataSource + # The default value of ZoneinfoDataSource.search_path. + DEFAULT_SEARCH_PATH = ['/usr/share/zoneinfo', '/usr/share/lib/zoneinfo', '/etc/zoneinfo'].freeze + + # The default value of ZoneinfoDataSource.alternate_iso3166_tab_search_path. + DEFAULT_ALTERNATE_ISO3166_TAB_SEARCH_PATH = ['/usr/share/misc/iso3166.tab', '/usr/share/misc/iso3166'].freeze + + # Paths to be checked to find the system zoneinfo directory. + @@search_path = DEFAULT_SEARCH_PATH.dup + + # Paths to possible alternate iso3166.tab files (used to locate the + # system-wide iso3166.tab files on FreeBSD and OpenBSD). + @@alternate_iso3166_tab_search_path = DEFAULT_ALTERNATE_ISO3166_TAB_SEARCH_PATH.dup + + # An Array of directories that will be checked to find the system zoneinfo + # directory. + # + # Directories are checked in the order they appear in the Array. + # + # The default value is ['/usr/share/zoneinfo', '/usr/share/lib/zoneinfo', '/etc/zoneinfo']. + def self.search_path + @@search_path + end + + # Sets the directories to be checked when locating the system zoneinfo + # directory. + # + # Can be set to an Array of directories or a String containing directories + # separated with File::PATH_SEPARATOR. + # + # Directories are checked in the order they appear in the Array or String. + # + # Set to nil to revert to the default paths. + def self.search_path=(search_path) + @@search_path = process_search_path(search_path, DEFAULT_SEARCH_PATH) + end + + # An Array of paths that will be checked to find an alternate iso3166.tab + # file if one was not included in the zoneinfo directory (for example, on + # FreeBSD and OpenBSD systems). + # + # Paths are checked in the order they appear in the array. + # + # The default value is ['/usr/share/misc/iso3166.tab', '/usr/share/misc/iso3166']. + def self.alternate_iso3166_tab_search_path + @@alternate_iso3166_tab_search_path + end + + # Sets the paths to check to locate an alternate iso3166.tab file if one was + # not included in the zoneinfo directory. + # + # Can be set to an Array of directories or a String containing directories + # separated with File::PATH_SEPARATOR. + # + # Paths are checked in the order they appear in the array. + # + # Set to nil to revert to the default paths. + def self.alternate_iso3166_tab_search_path=(alternate_iso3166_tab_search_path) + @@alternate_iso3166_tab_search_path = process_search_path(alternate_iso3166_tab_search_path, DEFAULT_ALTERNATE_ISO3166_TAB_SEARCH_PATH) + end + + # The zoneinfo directory being used. + attr_reader :zoneinfo_dir + + # Creates a new ZoneinfoDataSource. + # + # If zoneinfo_dir is specified, it will be checked and used as the source + # of zoneinfo files. + # + # The directory must contain a file named iso3166.tab and a file named + # either zone1970.tab or zone.tab. These may either be included in the root + # of the directory or in a 'tab' sub-directory and named 'country.tab' and + # 'zone_sun.tab' respectively (as is the case on Solaris. + # + # Additionally, the path to iso3166.tab can be overridden using the + # alternate_iso3166_tab_path parameter. + # + # InvalidZoneinfoDirectory will be raised if the iso3166.tab and + # zone1970.tab or zone.tab files cannot be found using the zoneinfo_dir and + # alternate_iso3166_tab_path parameters. + # + # If zoneinfo_dir is not specified or nil, the paths referenced in + # search_path are searched in order to find a valid zoneinfo directory + # (one that contains zone1970.tab or zone.tab and iso3166.tab files as + # above). + # + # The paths referenced in alternate_iso3166_tab_search_path are also + # searched to find an iso3166.tab file if one of the searched zoneinfo + # directories doesn't contain an iso3166.tab file. + # + # If no valid directory can be found by searching, ZoneinfoDirectoryNotFound + # will be raised. + def initialize(zoneinfo_dir = nil, alternate_iso3166_tab_path = nil) + if zoneinfo_dir + iso3166_tab_path, zone_tab_path = validate_zoneinfo_dir(zoneinfo_dir, alternate_iso3166_tab_path) + + unless iso3166_tab_path && zone_tab_path + raise InvalidZoneinfoDirectory, "#{zoneinfo_dir} is not a directory or doesn't contain a iso3166.tab file and a zone1970.tab or zone.tab file." + end + + @zoneinfo_dir = zoneinfo_dir + else + @zoneinfo_dir, iso3166_tab_path, zone_tab_path = find_zoneinfo_dir + + unless @zoneinfo_dir && iso3166_tab_path && zone_tab_path + raise ZoneinfoDirectoryNotFound, "None of the paths included in TZInfo::ZoneinfoDataSource.search_path are valid zoneinfo directories." + end + end + + @zoneinfo_dir = File.expand_path(@zoneinfo_dir).freeze + @timezone_index = load_timezone_index.freeze + @country_index = load_country_index(iso3166_tab_path, zone_tab_path).freeze + @posix_tz_parser = PosixTimeZoneParser.new + end + + # Returns a TimezoneInfo instance for a given identifier. + # Raises InvalidTimezoneIdentifier if the timezone is not found or the + # identifier is invalid. + def load_timezone_info(identifier) + begin + if @timezone_index.include?(identifier) + path = File.join(@zoneinfo_dir, identifier) + + # Untaint path rather than identifier. We don't want to modify + # identifier. identifier may also be frozen and therefore cannot be + # untainted. + path.untaint + + begin + ZoneinfoTimezoneInfo.new(identifier, path, @posix_tz_parser) + rescue InvalidZoneinfoFile => e + raise InvalidTimezoneIdentifier, e.message + end + else + raise InvalidTimezoneIdentifier, 'Invalid identifier' + end + rescue Errno::ENOENT, Errno::ENAMETOOLONG, Errno::ENOTDIR + raise InvalidTimezoneIdentifier, 'Invalid identifier' + rescue Errno::EACCES => e + raise InvalidTimezoneIdentifier, e.message + end + end + + # Returns an array of all the available timezone identifiers. + def timezone_identifiers + @timezone_index + end + + # Returns an array of all the available timezone identifiers for + # data timezones (i.e. those that actually contain definitions). + # + # For ZoneinfoDataSource, this will always be identical to + # timezone_identifers. + def data_timezone_identifiers + @timezone_index + end + + # Returns an array of all the available timezone identifiers that + # are links to other timezones. + # + # For ZoneinfoDataSource, this will always be an empty array. + def linked_timezone_identifiers + [].freeze + end + + # Returns a CountryInfo instance for the given ISO 3166-1 alpha-2 + # country code. Raises InvalidCountryCode if the country could not be found + # or the code is invalid. + def load_country_info(code) + info = @country_index[code] + raise InvalidCountryCode, 'Invalid country code' unless info + info + end + + # Returns an array of all the available ISO 3166-1 alpha-2 + # country codes. + def country_codes + @country_index.keys.freeze + end + + # Returns the name and information about this DataSource. + def to_s + "Zoneinfo DataSource: #{@zoneinfo_dir}" + end + + # Returns internal object state as a programmer-readable string. + def inspect + "#<#{self.class}: #{@zoneinfo_dir}>" + end + + private + + # Processes a path for use as the search_path or + # alternate_iso3166_tab_search_path. + def self.process_search_path(path, default) + if path + if path.kind_of?(String) + path.split(File::PATH_SEPARATOR) + else + path.collect {|p| p.to_s} + end + else + default.dup + end + end + + # Validates a zoneinfo directory and returns the paths to the iso3166.tab + # and zone1970.tab or zone.tab files if valid. If the directory is not + # valid, returns nil. + # + # The path to the iso3166.tab file may be overriden by passing in a path. + # This is treated as either absolute or relative to the current working + # directory. + def validate_zoneinfo_dir(path, iso3166_tab_path = nil) + if File.directory?(path) + if iso3166_tab_path + return nil unless File.file?(iso3166_tab_path) + else + iso3166_tab_path = resolve_tab_path(path, ['iso3166.tab'], 'country.tab') + return nil unless iso3166_tab_path + end + + zone_tab_path = resolve_tab_path(path, ['zone1970.tab', 'zone.tab'], 'zone_sun.tab') + return nil unless zone_tab_path + + [iso3166_tab_path, zone_tab_path] + else + nil + end + end + + # Attempts to resolve the path to a tab file given its standard names and + # tab sub-directory name (as used on Solaris). + def resolve_tab_path(zoneinfo_path, standard_names, tab_name) + standard_names.each do |standard_name| + path = File.join(zoneinfo_path, standard_name) + return path if File.file?(path) + end + + path = File.join(zoneinfo_path, 'tab', tab_name) + return path if File.file?(path) + + nil + end + + # Finds a zoneinfo directory using search_path and + # alternate_iso3166_tab_search_path. Returns the paths to the directory, + # the iso3166.tab file and the zone.tab file or nil if not found. + def find_zoneinfo_dir + alternate_iso3166_tab_path = self.class.alternate_iso3166_tab_search_path.detect do |path| + File.file?(path) + end + + self.class.search_path.each do |path| + # Try without the alternate_iso3166_tab_path first. + iso3166_tab_path, zone_tab_path = validate_zoneinfo_dir(path) + return path, iso3166_tab_path, zone_tab_path if iso3166_tab_path && zone_tab_path + + if alternate_iso3166_tab_path + iso3166_tab_path, zone_tab_path = validate_zoneinfo_dir(path, alternate_iso3166_tab_path) + return path, iso3166_tab_path, zone_tab_path if iso3166_tab_path && zone_tab_path + end + end + + # Not found. + nil + end + + # Scans @zoneinfo_dir and returns an Array of available timezone + # identifiers. + def load_timezone_index + index = [] + + # Ignoring particular files: + # +VERSION is included on Mac OS X. + # leapseconds is a list of leap seconds. + # localtime is the current local timezone (may be a link). + # posix, posixrules and right are directories containing other versions of the zoneinfo files. + # src is a directory containing the tzdata source included on Solaris. + # timeconfig is a symlink included on Slackware. + + enum_timezones(nil, ['+VERSION', 'leapseconds', 'localtime', 'posix', 'posixrules', 'right', 'src', 'timeconfig']) do |identifier| + index << identifier + end + + index.sort + end + + # Recursively scans a directory of timezones, calling the passed in block + # for each identifier found. + def enum_timezones(dir, exclude = [], &block) + Dir.foreach(dir ? File.join(@zoneinfo_dir, dir) : @zoneinfo_dir) do |entry| + unless entry =~ /\./ || exclude.include?(entry) + entry.untaint + path = dir ? File.join(dir, entry) : entry + full_path = File.join(@zoneinfo_dir, path) + + if File.directory?(full_path) + enum_timezones(path, [], &block) + elsif File.file?(full_path) + yield path + end + end + end + end + + # Uses the iso3166.tab and zone1970.tab or zone.tab files to build an index + # of the available countries and their timezones. + def load_country_index(iso3166_tab_path, zone_tab_path) + + # Handle standard 3 to 4 column zone.tab files as well as the 4 to 5 + # column format used by Solaris. + # + # On Solaris, an extra column before the comment gives an optional + # linked/alternate timezone identifier (or '-' if not set). + # + # Additionally, there is a section at the end of the file for timezones + # covering regions. These are given lower-case "country" codes. The timezone + # identifier column refers to a continent instead of an identifier. These + # lines will be ignored by TZInfo. + # + # Since the last column is optional in both formats, testing for the + # Solaris format is done in two passes. The first pass identifies if there + # are any lines using 5 columns. + + + # The first column is allowed to be a comma separated list of country + # codes, as used in zone1970.tab (introduced in tzdata 2014f). + # + # The first country code in the comma-separated list is the country that + # contains the city the zone identifer is based on. The first country + # code on each line is considered to be primary with the others + # secondary. + # + # The zones for each country are ordered primary first, then secondary. + # Within the primary and secondary groups, the zones are ordered by their + # order in the file. + + file_is_5_column = false + zone_tab = [] + + RubyCoreSupport.open_file(zone_tab_path, 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') do |file| + file.each_line do |line| + line.chomp! + + if line =~ /\A([A-Z]{2}(?:,[A-Z]{2})*)\t(?:([+\-])(\d{2})(\d{2})([+\-])(\d{3})(\d{2})|([+\-])(\d{2})(\d{2})(\d{2})([+\-])(\d{3})(\d{2})(\d{2}))\t([^\t]+)(?:\t([^\t]+))?(?:\t([^\t]+))?\z/ + codes = $1 + + if $2 + latitude = dms_to_rational($2, $3, $4) + longitude = dms_to_rational($5, $6, $7) + else + latitude = dms_to_rational($8, $9, $10, $11) + longitude = dms_to_rational($12, $13, $14, $15) + end + + zone_identifier = $16 + column4 = $17 + column5 = $18 + + file_is_5_column = true if column5 + + zone_tab << [codes.split(','.freeze), zone_identifier, latitude, longitude, column4, column5] + end + end + end + + primary_zones = {} + secondary_zones = {} + + zone_tab.each do |codes, zone_identifier, latitude, longitude, column4, column5| + description = file_is_5_column ? column5 : column4 + country_timezone = CountryTimezone.new(zone_identifier, latitude, longitude, description) + + # codes will always have at least one element + + (primary_zones[codes.first] ||= []) << country_timezone + + codes[1..-1].each do |code| + (secondary_zones[code] ||= []) << country_timezone + end + end + + countries = {} + + RubyCoreSupport.open_file(iso3166_tab_path, 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') do |file| + file.each_line do |line| + line.chomp! + + # Handle both the two column alpha-2 and name format used in the tz + # database as well as the 4 column alpha-2, alpha-3, numeric-3 and + # name format used by FreeBSD and OpenBSD. + + if line =~ /\A([A-Z]{2})(?:\t[A-Z]{3}\t[0-9]{3})?\t(.+)\z/ + code = $1 + name = $2 + zones = (primary_zones[code] || []) + (secondary_zones[code] || []) + + countries[code] = ZoneinfoCountryInfo.new(code, name, zones) + end + end + end + + countries + end + + # Converts degrees, minutes and seconds to a Rational. + def dms_to_rational(sign, degrees, minutes, seconds = nil) + result = degrees.to_i + Rational(minutes.to_i, 60) + result += Rational(seconds.to_i, 3600) if seconds + result = -result if sign == '-'.freeze + result + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/zoneinfo_timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/zoneinfo_timezone_info.rb new file mode 100644 index 000000000000..a2fa9954f225 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/lib/tzinfo/zoneinfo_timezone_info.rb @@ -0,0 +1,520 @@ +module TZInfo + # Use send as a workaround for erroneous 'wrong number of arguments' errors + # with JRuby 9.0.5.0 when calling methods with Java implementations. See #114. + send(:using, RubyCoreSupport::UntaintExt) if RubyCoreSupport.const_defined?(:UntaintExt) + + # An InvalidZoneinfoFile exception is raised if an attempt is made to load an + # invalid zoneinfo file. + class InvalidZoneinfoFile < StandardError + end + + # Represents a timezone defined by a compiled zoneinfo TZif (\0, 2 or 3) file. + # + # @private + class ZoneinfoTimezoneInfo < TransitionDataTimezoneInfo #:nodoc: + # The year to generate transitions up to. + # + # @private + GENERATE_UP_TO = RubyCoreSupport.time_supports_64bit ? Time.now.utc.year + 100 : 2037 + + # Minimum supported timestamp (inclusive). + # + # Time.utc(1700, 1, 1).to_i + MIN_TIMESTAMP = -8520336000 + + # Maximum supported timestamp (exclusive). + # + # Time.utc(2500, 1, 1).to_i + MAX_TIMESTAMP = 16725225600 + + # Constructs the new ZoneinfoTimezoneInfo with an identifier, path + # to the file and parser to use to parse the POSIX-like TZ string. + def initialize(identifier, file_path, posix_tz_parser) + super(identifier) + + File.open(file_path, 'rb') do |file| + parse(file, posix_tz_parser) + end + end + + private + # Unpack will return unsigned 32-bit integers. Translate to + # signed 32-bit. + def make_signed_int32(long) + long >= 0x80000000 ? long - 0x100000000 : long + end + + # Unpack will return a 64-bit integer as two unsigned 32-bit integers + # (most significant first). Translate to signed 64-bit + def make_signed_int64(high, low) + unsigned = (high << 32) | low + unsigned >= 0x8000000000000000 ? unsigned - 0x10000000000000000 : unsigned + end + + # Read bytes from file and check that the correct number of bytes could + # be read. Raises InvalidZoneinfoFile if the number of bytes didn't match + # the number requested. + def check_read(file, bytes) + result = file.read(bytes) + + unless result && result.length == bytes + raise InvalidZoneinfoFile, "Expected #{bytes} bytes reading '#{file.path}', but got #{result ? result.length : 0} bytes" + end + + result + end + + # Zoneinfo files don't include the offset from standard time (std_offset) + # for DST periods. Derive the base offset (utc_offset) where DST is + # observed from either the previous or next non-DST period. + # + # Returns the index of the offset to be used prior to the first + # transition. + def derive_offsets(transitions, offsets) + # The first non-DST offset (if there is one) is the offset observed + # before the first transition. Fallback to the first DST offset if there + # are no non-DST offsets. + first_non_dst_offset_index = offsets.index {|o| !o[:is_dst] } + first_offset_index = first_non_dst_offset_index || 0 + return first_offset_index if transitions.empty? + + # Determine the utc_offset of the next non-dst offset at each transition. + utc_offset_from_next = nil + + transitions.reverse_each do |transition| + offset = offsets[transition[:offset]] + if offset[:is_dst] + transition[:utc_offset_from_next] = utc_offset_from_next if utc_offset_from_next + else + utc_offset_from_next = offset[:utc_total_offset] + end + end + + utc_offset_from_previous = first_non_dst_offset_index ? offsets[first_non_dst_offset_index][:utc_total_offset] : nil + defined_offsets = {} + + transitions.each do |transition| + offset_index = transition[:offset] + offset = offsets[offset_index] + utc_total_offset = offset[:utc_total_offset] + + if offset[:is_dst] + utc_offset_from_next = transition[:utc_offset_from_next] + + difference_to_previous = (utc_total_offset - (utc_offset_from_previous || utc_total_offset)).abs + difference_to_next = (utc_total_offset - (utc_offset_from_next || utc_total_offset)).abs + + utc_offset = if difference_to_previous == 3600 + utc_offset_from_previous + elsif difference_to_next == 3600 + utc_offset_from_next + elsif difference_to_previous > 0 && difference_to_next > 0 + difference_to_previous < difference_to_next ? utc_offset_from_previous : utc_offset_from_next + elsif difference_to_previous > 0 + utc_offset_from_previous + elsif difference_to_next > 0 + utc_offset_from_next + else + # No difference, assume a 1 hour offset from standard time. + utc_total_offset - 3600 + end + + if !offset[:utc_offset] + offset[:utc_offset] = utc_offset + defined_offsets[offset] = offset_index + elsif offset[:utc_offset] != utc_offset + # An earlier transition has already derived a different + # utc_offset. Define a new offset or reuse an existing identically + # defined offset. + new_offset = offset.dup + new_offset[:utc_offset] = utc_offset + + offset_index = defined_offsets[new_offset] + + unless offset_index + offsets << new_offset + offset_index = offsets.length - 1 + defined_offsets[new_offset] = offset_index + end + + transition[:offset] = offset_index + end + else + utc_offset_from_previous = utc_total_offset + end + end + + first_offset_index + end + + # Remove transitions before a minimum supported value. If there is not a + # transition exactly on the minimum supported value move the latest from + # before up to the minimum supported value. + def remove_unsupported_negative_transitions(transitions, min_supported) + result = transitions.drop_while {|t| t[:at] < min_supported } + if result.empty? || (result[0][:at] > min_supported && result.length < transitions.length) + last_before = transitions[-1 - result.length] + last_before[:at] = min_supported + [last_before] + result + else + result + end + end + + # Determines if the offset from a transition matches the offset from a + # rule. This is a looser match than TimezoneOffset#==, not requiring that + # the utc_offset and std_offset both match (which have to be derived for + # transitions, but are known for rules. + def offset_matches_rule?(offset, rule_offset) + offset[:utc_total_offset] == rule_offset.utc_total_offset && + offset[:is_dst] == rule_offset.dst? && + offset[:abbr] == rule_offset.abbreviation.to_s + end + + # Determins if the offset from a transition exactly matches the offset + # from a rule. + def offset_equals_rule?(offset, rule_offset) + offset_matches_rule?(offset, rule_offset) && + (offset[:utc_offset] || (offset[:is_dst] ? offset[:utc_total_offset] - 3600 : offset[:utc_total_offset])) == rule_offset.utc_offset + end + + # Finds an offset hash that is an exact match to the rule offset specified. + def find_existing_offset_index(offsets, rule_offset) + offsets.find_index {|o| offset_equals_rule?(o, rule_offset) } + end + + # Gets an existing matching offset index or adds a new offset hash for a + # rule offset. + def get_rule_offset_index(offsets, offset) + index = find_existing_offset_index(offsets, offset) + unless index + index = offsets.length + offsets << {:utc_total_offset => offset.utc_total_offset, :utc_offset => offset.utc_offset, :is_dst => offset.dst?, :abbr => offset.abbreviation} + end + index + end + + # Gets a hash mapping rule offsets to indexes in offsets, creating new + # offset hashes if required. + def get_rule_offset_indexes(offsets, annual_rules) + { + annual_rules.std_offset => get_rule_offset_index(offsets, annual_rules.std_offset), + annual_rules.dst_offset => get_rule_offset_index(offsets, annual_rules.dst_offset) + } + end + + # Converts an array of rule transitions to hashes. + def convert_transitions_to_hashes(offset_indexes, transitions) + transitions.map {|t| {:at => t.at.to_i, :offset => offset_indexes[t.offset]} } + end + + # Apply the rules from the TZ string when there were no defined + # transitions. Checks for a matching offset. Returns the rules-based + # constant offset or generates transitions from 1970 until 100 years into + # the future (at the time of loading zoneinfo_timezone_info.rb) or 2037 if + # limited to 32-bit Times. + def apply_rules_without_transitions(file, offsets, first_offset_index, rules) + first_offset = offsets[first_offset_index] + + if rules.kind_of?(TimezoneOffset) + unless offset_matches_rule?(first_offset, rules) + raise InvalidZoneinfoFile, "Constant offset POSIX-style TZ string does not match constant offset in file '#{file.path}'." + end + + first_offset[:utc_offset] = rules.utc_offset + [] + else + transitions = 1970.upto(GENERATE_UP_TO).map {|y| rules.transitions(y) }.flatten + first_transition = transitions[0] + + if offset_matches_rule?(first_offset, first_transition.previous_offset) + # Correct the first offset if it isn't an exact match. + first_offset[:utc_offset] = first_transition.previous_offset.utc_offset + else + # Not transitioning from the designated first offset. + if offset_matches_rule?(first_offset, first_transition.offset) + # Correct the first offset if it isn't an exact match. + first_offset[:utc_offset] = first_transition.offset.utc_offset + + # Skip an unnecessary transition to the first offset. + transitions.shift + end + + # If the first offset doesn't match either the offset or previous + # offset, then it will be retained. + end + + offset_indexes = get_rule_offset_indexes(offsets, rules) + convert_transitions_to_hashes(offset_indexes, transitions) + end + end + + # Validates the rules offset against the offset of the last defined + # transition. Replaces the transition with an equivalent using the rules + # offset if the rules give a different definition for the base offset. + def replace_last_transition_offset_if_valid_and_needed(file, transitions, offsets) + last_transition = transitions.last + last_offset = offsets[last_transition[:offset]] + rule_offset = yield last_offset + + unless offset_matches_rule?(last_offset, rule_offset) + raise InvalidZoneinfoFile, "Offset from POSIX-style TZ string does not match final transition in file '#{file.path}'." + end + + # The total_utc_offset and abbreviation must always be the same. The + # base utc_offset and std_offset might differ. In which case the rule + # should be used as it will be more precise. + last_offset[:utc_offset] = rule_offset.utc_offset + last_transition + end + + # todo: port over validate_and_fix_last_defined_transition_offset + # when fixing the previous offset will need to define a new one + + # Validates the offset indicated to be observed by the rules before the + # first generated transition against the offset of the last defined + # transition. + # + # Fix the last defined transition if it differ on just base/std offsets + # (which are derived). Raise an error if the observed UTC offset or + # abbreviations differ. + def validate_and_fix_last_defined_transition_offset(file, offsets, last_defined, first_rule_offset) + offset_of_last_defined = offsets[last_defined[:offset]] + + if offset_equals_rule?(offset_of_last_defined, first_rule_offset) + last_defined + else + if offset_matches_rule?(offset_of_last_defined, first_rule_offset) + # The same overall offset, but differing in the base or std + # offset (which are derived). Correct by using the rule. + + offset_index = get_rule_offset_index(offsets, first_rule_offset) + {:at => last_defined[:at], :offset => offset_index} + else + raise InvalidZoneinfoFile, "The first offset indicated by the POSIX-style TZ string did not match the final defined offset in file '#{file.path}'." + end + end + end + + # Apply the rules from the TZ string when there were defined transitions. + # Checks for a matching offset with the last transition. Redefines the + # last transition if required and if the rules don't specific a constant + # offset, generates transitions until 100 years into the future (at the + # time of loading zoneinfo_timezone_info.rb) or 2037 if limited to 32-bit + # Times. + def apply_rules_with_transitions(file, transitions, offsets, first_offset_index, rules) + last_defined = transitions[-1] + + if rules.kind_of?(TimezoneOffset) + transitions[-1] = validate_and_fix_last_defined_transition_offset(file, offsets, last_defined, rules) + else + previous_offset_index = transitions.length > 1 ? transitions[-2][:offset] : first_offset_index + previous_offset = offsets[previous_offset_index] + last_year = (Time.at(last_defined[:at]).utc + previous_offset[:utc_total_offset]).year + + if last_year <= GENERATE_UP_TO + last_defined_offset = offsets[last_defined[:offset]] + + generated = rules.transitions(last_year).find_all do |t| + t.at > last_defined[:at] && !offset_matches_rule?(last_defined_offset, t.offset) + end + + generated += (last_year + 1).upto(GENERATE_UP_TO).map {|y| rules.transitions(y) }.flatten + + unless generated.empty? + transitions[-1] = validate_and_fix_last_defined_transition_offset(file, offsets, last_defined, generated[0].previous_offset) + rule_offset_indexes = get_rule_offset_indexes(offsets, rules) + transitions.concat(convert_transitions_to_hashes(rule_offset_indexes, generated)) + end + end + end + end + + # Defines an offset for the timezone based on the given index and offset + # Hash. + def define_offset(index, offset) + utc_total_offset = offset[:utc_total_offset] + utc_offset = offset[:utc_offset] + + if utc_offset + # DST offset with base utc_offset derived by derive_offsets. + std_offset = utc_total_offset - utc_offset + elsif offset[:is_dst] + # DST offset unreferenced by a transition (offset in use before the + # first transition). No derived base UTC offset, so assume 1 hour + # DST. + utc_offset = utc_total_offset - 3600 + std_offset = 3600 + else + # Non-DST offset. + utc_offset = utc_total_offset + std_offset = 0 + end + + offset index, utc_offset, std_offset, offset[:abbr].untaint.to_sym + end + + # Parses a zoneinfo file and intializes the DataTimezoneInfo structures. + def parse(file, posix_tz_parser) + magic, version, ttisutccnt, ttisstdcnt, leapcnt, timecnt, typecnt, charcnt = + check_read(file, 44).unpack('a4 a x15 NNNNNN') + + if magic != 'TZif' + raise InvalidZoneinfoFile, "The file '#{file.path}' does not start with the expected header." + end + + if version == '2' || version == '3' + # Skip the first 32-bit section and read the header of the second + # 64-bit section. The 64-bit section is always used even if the + # runtime platform doesn't support 64-bit timestamps. In "slim" format + # zoneinfo files the 32-bit section will be empty. + file.seek(timecnt * 5 + typecnt * 6 + charcnt + leapcnt * 8 + ttisstdcnt + ttisutccnt, IO::SEEK_CUR) + + prev_version = version + + magic, version, ttisutccnt, ttisstdcnt, leapcnt, timecnt, typecnt, charcnt = + check_read(file, 44).unpack('a4 a x15 NNNNNN') + + unless magic == 'TZif' && (version == prev_version) + raise InvalidZoneinfoFile, "The file '#{file.path}' contains an invalid 64-bit section header." + end + + using_64bit = true + elsif version != '3' && version != '2' && version != "\0" + raise InvalidZoneinfoFile, "The file '#{file.path}' contains a version of the zoneinfo format that is not currently supported." + else + using_64bit = false + end + + unless leapcnt == 0 + raise InvalidZoneinfoFile, "The zoneinfo file '#{file.path}' contains leap second data. TZInfo requires zoneinfo files that omit leap seconds." + end + + transitions = [] + + if using_64bit + timecnt.times do |i| + high, low = check_read(file, 8).unpack('NN'.freeze) + transition_time = make_signed_int64(high, low) + transitions << {:at => transition_time} + end + else + timecnt.times do |i| + transition_time = make_signed_int32(check_read(file, 4).unpack('N'.freeze)[0]) + transitions << {:at => transition_time} + end + end + + timecnt.times do |i| + localtime_type = check_read(file, 1).unpack('C'.freeze)[0] + transitions[i][:offset] = localtime_type + end + + offsets = [] + + typecnt.times do |i| + gmtoff, isdst, abbrind = check_read(file, 6).unpack('NCC'.freeze) + gmtoff = make_signed_int32(gmtoff) + isdst = isdst == 1 + offset = {:utc_total_offset => gmtoff, :is_dst => isdst, :abbr_index => abbrind} + + unless isdst + offset[:utc_offset] = gmtoff + end + + offsets << offset + end + + abbrev = check_read(file, charcnt) + + if using_64bit + # Skip to the POSIX-style TZ string. + file.seek(ttisstdcnt + ttisutccnt, IO::SEEK_CUR) # + leapcnt * 8, but leapcnt is checked above and guaranteed to be 0. + tz_string_start = check_read(file, 1) + raise InvalidZoneinfoFile, "Expected newline starting POSIX-style TZ string in file '#{file.path}'." unless tz_string_start == "\n" + tz_string = RubyCoreSupport.force_encoding(file.readline("\n"), 'UTF-8') + raise InvalidZoneinfoFile, "Expected newline ending POSIX-style TZ string in file '#{file.path}'." unless tz_string.chomp!("\n") + + begin + rules = posix_tz_parser.parse(tz_string) + rescue InvalidPosixTimeZone => e + raise InvalidZoneinfoFile, "Failed to parse POSIX-style TZ string in file '#{file.path}': #{e}" + end + else + rules = nil + end + + offsets.each do |o| + abbrev_start = o[:abbr_index] + raise InvalidZoneinfoFile, "Abbreviation index is out of range in file '#{file.path}'" unless abbrev_start < abbrev.length + + abbrev_end = abbrev.index("\0", abbrev_start) + raise InvalidZoneinfoFile, "Missing abbreviation null terminator in file '#{file.path}'" unless abbrev_end + + o[:abbr] = RubyCoreSupport.force_encoding(abbrev[abbrev_start...abbrev_end], 'UTF-8') + end + + transitions.each do |t| + if t[:offset] < 0 || t[:offset] >= offsets.length + raise InvalidZoneinfoFile, "Invalid offset referenced by transition in file '#{file.path}'." + end + end + + # Derive the offsets from standard time (std_offset). + first_offset_index = derive_offsets(transitions, offsets) + + # Filter out transitions that are not supported by Time on this + # platform. + unless transitions.empty? + if !RubyCoreSupport.time_supports_negative + transitions = remove_unsupported_negative_transitions(transitions, 0) + elsif !RubyCoreSupport.time_supports_64bit + transitions = remove_unsupported_negative_transitions(transitions, -2**31) + else + # Ignore transitions that occur outside of a defined window. The + # transition index cannot handle a large range of transition times. + # + # This is primarily intended to ignore the far in the past + # transition added in zic 2014c (at timestamp -2**63 in zic 2014c + # and at the approximate time of the big bang from zic 2014d). + # + # Assumes MIN_TIMESTAMP is less than -2**31. + transitions = remove_unsupported_negative_transitions(transitions, MIN_TIMESTAMP) + end + + if !RubyCoreSupport.time_supports_64bit + i = transitions.find_index {|t| t[:at] >= 2**31 } + had_later_transition = !!i + transitions = transitions.first(i) if i + else + had_later_transition = false + end + end + + if rules && !had_later_transition + if transitions.empty? + transitions = apply_rules_without_transitions(file, offsets, first_offset_index, rules) + else + apply_rules_with_transitions(file, transitions, offsets, first_offset_index, rules) + end + end + + define_offset(first_offset_index, offsets[first_offset_index]) + + used_offset_indexes = transitions.map {|t| t[:offset] }.to_set + + offsets.each_with_index do |o, i| + define_offset(i, o) if i != first_offset_index && used_offset_indexes.include?(i) + end + + # Ignore transitions that occur outside of a defined window. The + # transition index cannot handle a large range of transition times. + transitions.each do |t| + at = t[:at] + break if at >= MAX_TIMESTAMP + time = Time.at(at).utc + transition time.year, time.mon, t[:offset], at + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_annual_rules.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_annual_rules.rb new file mode 100644 index 000000000000..610d878f357a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_annual_rules.rb @@ -0,0 +1,95 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCAnnualRules < Minitest::Test + + def test_initialize + std_offset = TimezoneOffset.new(0, 0, 'GMT') + dst_offset = TimezoneOffset.new(0, 3600, 'BST') + dst_start_rule = FakeAlwaysDateAdjustmentRule.new(3, 1) + dst_end_rule = FakeAlwaysDateAdjustmentRule.new(10, 1) + + rules = AnnualRules.new(std_offset, dst_offset, dst_start_rule, dst_end_rule) + assert_same(std_offset, rules.std_offset) + assert_same(dst_offset, rules.dst_offset) + assert_same(dst_start_rule, rules.dst_start_rule) + assert_same(dst_end_rule, rules.dst_end_rule) + end + + [2020, 2021].each do |year| + define_method "test_transitions_for_dst_mid_year_#{year}" do + std_offset = TimezoneOffset.new(3600, 0, 'TEST') + dst_offset = TimezoneOffset.new(3600, 3600, 'TESTS') + + rules = AnnualRules.new( + std_offset, + dst_offset, + FakeAlwaysDateAdjustmentRule.new(3, 21), + FakeAlwaysDateAdjustmentRule.new(10, 22) + ) + + result = rules.transitions(year) + + expected = [ + AnnualRules::Transition.new(dst_offset, std_offset, TimeOrDateTime.wrap(Time.utc(year, 3, 21, 0, 0, 0) - 3600)), + AnnualRules::Transition.new(std_offset, dst_offset, TimeOrDateTime.wrap(Time.utc(year, 10, 22, 0, 0, 0) - 7200)) + ] + + assert_equal(expected, result) + end + + define_method "test_transitions_for_dst_start_and_end_of_year_#{year}" do + std_offset = TimezoneOffset.new(3600, 0, 'TEST') + dst_offset = TimezoneOffset.new(3600, 3600, 'TESTS') + + rules = AnnualRules.new( + std_offset, + dst_offset, + FakeAlwaysDateAdjustmentRule.new(10, 22), + FakeAlwaysDateAdjustmentRule.new(3, 21) + ) + + result = rules.transitions(year) + + expected = [ + AnnualRules::Transition.new(std_offset, dst_offset, TimeOrDateTime.wrap(Time.utc(year, 3, 21, 0, 0, 0) - 7200)), + AnnualRules::Transition.new(dst_offset, std_offset, TimeOrDateTime.wrap(Time.utc(year, 10, 22, 0, 0, 0) - 3600)) + ] + + assert_equal(expected, result) + end + + define_method "test_transitions_for_negative_dst_start_and_end_of_year_#{year}" do + std_offset = TimezoneOffset.new(7200, 0, 'TEST') + dst_offset = TimezoneOffset.new(7200, -3600, 'TESTW') + + rules = AnnualRules.new( + std_offset, + dst_offset, + FakeAlwaysDateAdjustmentRule.new(10, 22), + FakeAlwaysDateAdjustmentRule.new(3, 21) + ) + + result = rules.transitions(year) + + expected = [ + AnnualRules::Transition.new(std_offset, dst_offset, TimeOrDateTime.wrap(Time.utc(year, 3, 21, 0, 0, 0) - 3600)), + AnnualRules::Transition.new(dst_offset, std_offset, TimeOrDateTime.wrap(Time.utc(year, 10, 22, 0, 0, 0) - 7200)) + ] + + assert_equal(expected, result) + end + end + + class FakeAlwaysDateAdjustmentRule + def initialize(month, day) + @month = month + @day = day + end + + def at(offset, year) + TimeOrDateTime.wrap(Time.utc(year, @month, @day, 0, 0, 0) - offset.utc_total_offset) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country.rb new file mode 100644 index 000000000000..faa3bb52eee7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country.rb @@ -0,0 +1,238 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +# Use send as a workaround for erroneous 'wrong number of arguments' errors with +# JRuby 9.0.5.0 when calling methods with Java implementations. See #114. +send(:using, TaintExt) if Module.const_defined?(:TaintExt) + +class TCCountry < Minitest::Test + def setup + @orig_data_source = DataSource.get + Country.send :init_countries + end + + def teardown + DataSource.set(@orig_data_source) + end + + def test_get_valid + c = Country.get('GB') + + assert c + assert_equal('GB', c.code) + end + + def test_get_not_exist + assert_raises(InvalidCountryCode) { + Country.get('ZZ') + } + end + + def test_get_invalid + assert_raises(InvalidCountryCode) { + Country.get('../Countries/GB') + } + end + + def test_get_nil + assert_raises(InvalidCountryCode) { + Country.get(nil) + } + end + + def test_get_case + assert_raises(InvalidCountryCode) { + Country.get('gb') + } + end + + def test_get_tainted_loaded + Country.get('GB') + + safe_test(:unavailable => :skip) do + code = 'GB'.dup.taint + assert(code.tainted?) + country = Country.get(code) + assert_equal('GB', country.code) + assert(code.tainted?) + end + end + + def test_get_tainted_and_frozen_loaded + Country.get('GB') + + safe_test do + country = Country.get('GB'.dup.taint.freeze) + assert_equal('GB', country.code) + end + end + + def test_get_tainted_not_previously_loaded + safe_test(:unavailable => :skip) do + code = 'GB'.dup.taint + assert(code.tainted?) + country = Country.get(code) + assert_equal('GB', country.code) + assert(code.tainted?) + end + end + + def test_get_tainted_and_frozen_not_previously_loaded + safe_test do + country = Country.get('GB'.dup.taint.freeze) + assert_equal('GB', country.code) + end + end + + def test_new_nil + assert_raises(InvalidCountryCode) { + Country.new(nil) + } + end + + def test_new_arg + c = Country.new('GB') + assert_same(Country.get('GB'), c) + end + + def test_new_arg_not_exist + assert_raises(InvalidCountryCode) { + Country.new('ZZ') + } + end + + def test_all_codes + all_codes = Country.all_codes + assert_kind_of(Array, all_codes) + end + + def test_all + all = Country.all + assert_equal(Country.all_codes, all.collect {|c| c.code}) + end + + def test_code + assert_equal('US', Country.get('US').code) + end + + def test_name + assert_kind_of(String, Country.get('US').name) + end + + def test_to_s + assert_equal(Country.get('US').name, Country.get('US').to_s) + assert_equal(Country.get('GB').name, Country.get('GB').to_s) + end + + def test_zone_identifiers + zone_names = Country.get('US').zone_names + assert_kind_of(Array, zone_names) + assert_equal(true, zone_names.frozen?) + end + + def test_zone_names + assert_equal(Country.get('US').zone_identifiers, Country.get('US').zone_names) + end + + def test_zones + zones = Country.get('US').zones + assert_kind_of(Array, zones) + assert_equal(Country.get('US').zone_identifiers, zones.collect {|z| z.identifier}) + + zones.each {|z| assert_kind_of(TimezoneProxy, z)} + end + + def test_zone_info + zones = Country.get('US').zone_info + assert_kind_of(Array, zones) + assert_equal(true, zones.frozen?) + + assert_equal(Country.get('US').zone_identifiers, zones.collect {|z| z.identifier}) + assert_equal(Country.get('US').zone_identifiers, zones.collect {|z| z.timezone.identifier}) + + zones.each {|z| assert_kind_of(CountryTimezone, z)} + end + + def test_compare + assert_equal(0, Country.get('GB') <=> Country.get('GB')) + assert_equal(-1, Country.get('GB') <=> Country.get('US')) + assert_equal(1, Country.get('US') <=> Country.get('GB')) + assert_equal(-1, Country.get('FR') <=> Country.get('US')) + assert_equal(1, Country.get('US') <=> Country.get('FR')) + end + + def test_compare_non_comparable + assert_nil(Country.get('GB') <=> Object.new) + end + + def test_equality + assert_equal(true, Country.get('GB') == Country.get('GB')) + assert_equal(false, Country.get('GB') == Country.get('US')) + assert(!(Country.get('GB') == Object.new)) + end + + def test_eql + assert_equal(true, Country.get('GB').eql?(Country.get('GB'))) + assert_equal(false, Country.get('GB').eql?(Country.get('US'))) + assert(!Country.get('GB').eql?(Object.new)) + end + + def test_hash + assert_equal('GB'.hash, Country.get('GB').hash) + assert_equal('US'.hash, Country.get('US').hash) + end + + def test_marshal + c = Country.get('US') + + # Should get back the same instance because load calls Country.get. + assert_same(c, Marshal.load(Marshal.dump(c))) + end + + def test_reload + # If country gets reloaded for some reason, it needs to force a reload of + # the country index. + + assert_equal('US', Country.get('US').code) + + # Suppress redefined method warnings. + without_warnings do + load 'tzinfo/country.rb' + end + + assert_equal('US', Country.get('US').code) + end + + def test_get_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Country.get('GB') + end + end + + def test_new_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Country.new('GB') + end + end + + def test_all_codes_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Country.all_codes + end + end + + def test_all_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Country.all + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country_index_definition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country_index_definition.rb new file mode 100644 index 000000000000..16f76e0d682d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country_index_definition.rb @@ -0,0 +1,69 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCCountryIndexDefinition < Minitest::Test + + module CountriesTest1 + include CountryIndexDefinition + + country 'ZZ', 'Country One' do |c| + c.timezone 'Test/Zone/1', 3, 2, 41,20 + end + + country 'AA', 'Aland' do |c| + c.timezone 'Test/Zone/3', 71,30, 358, 15 + c.timezone 'Test/Zone/2', 41, 20, 211, 30 + end + + country 'TE', 'Three' + end + + module CountriesTest2 + include CountryIndexDefinition + + country 'CO', 'First Country' do |c| + end + end + + def test_module_1 + hash = CountriesTest1.countries + assert_equal(3, hash.length) + assert_equal(true, hash.frozen?) + + zz = hash['ZZ'] + aa = hash['AA'] + te = hash['TE'] + + assert_kind_of(RubyCountryInfo, zz) + assert_equal('ZZ', zz.code) + assert_equal('Country One', zz.name) + assert_equal(1, zz.zones.length) + assert_equal('Test/Zone/1', zz.zones[0].identifier) + + assert_kind_of(RubyCountryInfo, aa) + assert_equal('AA', aa.code) + assert_equal('Aland', aa.name) + assert_equal(2, aa.zones.length) + assert_equal('Test/Zone/3', aa.zones[0].identifier) + assert_equal('Test/Zone/2', aa.zones[1].identifier) + + assert_kind_of(RubyCountryInfo, te) + assert_equal('TE', te.code) + assert_equal('Three', te.name) + assert_equal(0, te.zones.length) + end + + def test_module_2 + hash = CountriesTest2.countries + assert_equal(1, hash.length) + assert_equal(true, hash.frozen?) + + co = hash['CO'] + + assert_kind_of(RubyCountryInfo, co) + assert_equal('CO', co.code) + assert_equal('First Country', co.name) + assert_equal(0, co.zones.length) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country_info.rb new file mode 100644 index 000000000000..12002d9773a9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country_info.rb @@ -0,0 +1,16 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCCountryInfo < Minitest::Test + + def test_code + ci = CountryInfo.new('ZZ', 'Zzz') {|c| } + assert_equal('ZZ', ci.code) + end + + def test_name + ci = CountryInfo.new('ZZ', 'Zzz') {|c| } + assert_equal('Zzz', ci.name) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country_timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country_timezone.rb new file mode 100644 index 000000000000..77fd7d141465 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_country_timezone.rb @@ -0,0 +1,173 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCCountryTimezone < Minitest::Test + def test_identifier_new! + ct = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + assert_equal('Europe/London', ct.identifier) + end + + def test_identifier_new + ct = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + assert_equal('Europe/London', ct.identifier) + end + + def test_latitude_new! + ct = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + assert_equal(Rational(2059, 40), ct.latitude) + end + + def test_latitude_after_freeze_new! + ct = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + ct.freeze + assert_equal(Rational(2059, 40), ct.latitude) + end + + def test_latitude_new + ct = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + assert_equal(Rational(2059, 40), ct.latitude) + end + + def test_longitude_new! + ct = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + assert_equal(Rational(-5, 16), ct.longitude) + end + + def test_longitude_after_freeze_new! + ct = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + ct.freeze + assert_equal(Rational(-5, 16), ct.longitude) + end + + def test_longitude_new + ct = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + assert_equal(Rational(-5, 16), ct.longitude) + end + + def test_description_omit_new! + ct = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + assert_nil(ct.description) + end + + def test_description_omit_new + ct = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + assert_nil(ct.description) + end + + def test_description_nil_new! + ct = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16, nil) + assert_nil(ct.description) + end + + def test_description_nil_new + ct = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16), nil) + assert_nil(ct.description) + end + + def test_description_new! + ct = CountryTimezone.new!('America/New_York', 48857, 1200, -266423, 3600, 'Eastern Time') + assert_equal('Eastern Time', ct.description) + end + + def test_description_new + ct = CountryTimezone.new('America/New_York', Rational(48857, 1200), Rational(-266423, 3600), 'Eastern Time') + assert_equal('Eastern Time', ct.description) + end + + def test_timezone + ct = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + assert_kind_of(TimezoneProxy, ct.timezone) + assert_equal('Europe/London', ct.timezone.identifier) + end + + def test_description_or_friendly_idenfier_no_description + ct = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + assert_equal('London', ct.description_or_friendly_identifier) + end + + def test_description_or_friendly_idenfier_description + ct = CountryTimezone.new('America/New_York', Rational(48857, 1200), Rational(-266423, 3600), 'Eastern Time') + assert_equal('Eastern Time', ct.description_or_friendly_identifier) + end + + def test_equality_1 + ct1 = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + ct2 = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + ct3 = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + ct4 = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16, 'Description') + ct5 = CountryTimezone.new!('Europe/LondonB', 2059, 40, -5, 16) + ct6 = CountryTimezone.new!('Europe/London', 2060, 40, -5, 16) + ct7 = CountryTimezone.new!('Europe/London', 2059, 40, -6, 16) + + assert_equal(true, ct1 == ct1) + assert_equal(true, ct1 == ct2) + assert_equal(true, ct1 == ct3) + assert_equal(false, ct1 == ct4) + assert_equal(false, ct1 == ct5) + assert_equal(false, ct1 == ct6) + assert_equal(false, ct1 == ct7) + end + + def test_equality_2 + ct1 = CountryTimezone.new!('America/New_York', 48857, 1200, -266423, 3600, 'Eastern Time') + ct2 = CountryTimezone.new!('America/New_York', 48857, 1200, -266423, 3600, 'Eastern Time2') + + assert_equal(true, ct1 == ct1) + assert_equal(false, ct1 == ct2) + end + + def test_equality_non_country_timezone + ct = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + + assert_equal(false, ct == Object.new) + end + + def test_eql_1 + ct1 = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + ct2 = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + ct3 = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + ct4 = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16, 'Description') + ct5 = CountryTimezone.new!('Europe/LondonB', 2059, 40, -5, 16) + ct6 = CountryTimezone.new!('Europe/London', 2060, 40, -5, 16) + ct7 = CountryTimezone.new!('Europe/London', 2059, 40, -6, 16) + + assert_equal(true, ct1.eql?(ct1)) + assert_equal(true, ct1.eql?(ct2)) + assert_equal(true, ct1.eql?(ct3)) + assert_equal(false, ct1.eql?(ct4)) + assert_equal(false, ct1.eql?(ct5)) + assert_equal(false, ct1.eql?(ct6)) + assert_equal(false, ct1.eql?(ct7)) + end + + def test_eql_2 + ct1 = CountryTimezone.new!('America/New_York', 48857, 1200, -266423, 3600, 'Eastern Time') + ct2 = CountryTimezone.new!('America/New_York', 48857, 1200, -266423, 3600, 'Eastern Time2') + + assert_equal(true, ct1.eql?(ct1)) + assert_equal(false, ct1.eql?(ct2)) + end + + def test_eql_non_country_timezone + ct = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + + assert_equal(false, ct.eql?(Object.new)) + end + + def test_hash_new! + ct1 = CountryTimezone.new!('Europe/London', 2059, 40, -5, 16) + ct2 = CountryTimezone.new!('America/New_York', 48857, 1200, -266423, 3600, 'Eastern Time') + + assert_equal('Europe/London'.hash ^ 2059.hash ^ 40.hash ^ -5.hash ^ 16.hash ^ nil.hash, ct1.hash) + assert_equal('America/New_York'.hash ^ 48857.hash ^ 1200.hash ^ -266423.hash ^ 3600.hash ^ 'Eastern Time'.hash, ct2.hash) + end + + def test_hash_new + ct1 = CountryTimezone.new('Europe/London', Rational(2059, 40), Rational(-5, 16)) + ct2 = CountryTimezone.new('America/New_York', Rational(48857, 1200), Rational(-266423, 3600), 'Eastern Time') + + assert_equal('Europe/London'.hash ^ 2059.hash ^ 40.hash ^ -5.hash ^ 16.hash ^ nil.hash, ct1.hash) + assert_equal('America/New_York'.hash ^ 48857.hash ^ 1200.hash ^ -266423.hash ^ 3600.hash ^ 'Eastern Time'.hash, ct2.hash) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_data_source.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_data_source.rb new file mode 100644 index 000000000000..3d11ffc8608c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_data_source.rb @@ -0,0 +1,218 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') +require 'tmpdir' + +include TZInfo + +class TCDataSource < Minitest::Test + class InitDataSource < DataSource + end + + class DummyDataSource < DataSource + end + + def setup + @orig_data_source = DataSource.get + DataSource.set(InitDataSource.new) + @orig_search_path = ZoneinfoDataSource.search_path.clone + end + + def teardown + DataSource.set(@orig_data_source) + ZoneinfoDataSource.search_path = @orig_search_path + end + + def test_get + data_source = DataSource.get + assert_kind_of(InitDataSource, data_source) + end + + def test_get_default_ruby_only + code = <<-EOF + require 'tmpdir' + + begin + Dir.mktmpdir('tzinfo_test_dir') do |dir| + TZInfo::ZoneinfoDataSource.search_path = [dir] + + puts TZInfo::DataSource.get.class + end + rescue Exception => e + puts "Unexpected exception: \#{e}" + end + EOF + + assert_sub_process_returns(['TZInfo::RubyDataSource'], code, [TZINFO_TEST_DATA_DIR]) + end + + def test_get_default_zoneinfo_only + code = <<-EOF + require 'tmpdir' + + begin + Dir.mktmpdir('tzinfo_test_dir') do |dir| + TZInfo::ZoneinfoDataSource.search_path = [dir, '#{TZINFO_TEST_ZONEINFO_DIR}'] + + puts TZInfo::DataSource.get.class + puts TZInfo::DataSource.get.zoneinfo_dir + end + rescue Exception => e + puts "Unexpected exception: \#{e}" + end + EOF + + assert_sub_process_returns( + ['TZInfo::ZoneinfoDataSource', TZINFO_TEST_ZONEINFO_DIR], + code) + end + + def test_get_default_ruby_and_zoneinfo + code = <<-EOF + begin + TZInfo::ZoneinfoDataSource.search_path = ['#{TZINFO_TEST_ZONEINFO_DIR}'] + + puts TZInfo::DataSource.get.class + rescue Exception => e + puts "Unexpected exception: \#{e}" + end + EOF + + assert_sub_process_returns(['TZInfo::RubyDataSource'], code, [TZINFO_TEST_DATA_DIR]) + end + + def test_get_default_no_data + code = <<-EOF + require 'tmpdir' + + begin + Dir.mktmpdir('tzinfo_test_dir') do |dir| + TZInfo::ZoneinfoDataSource.search_path = [dir] + + begin + data_source = TZInfo::DataSource.get + puts "No exception raised, returned \#{data_source} instead" + rescue Exception => e + puts e.class + end + end + rescue Exception => e + puts "Unexpected exception: \#{e}" + end + EOF + + assert_sub_process_returns(['TZInfo::DataSourceNotFound'], code) + end + + def test_set_instance + DataSource.set(DummyDataSource.new) + data_source = DataSource.get + assert_kind_of(DummyDataSource, data_source) + end + + def test_set_standard_ruby + DataSource.set(:ruby) + data_source = DataSource.get + assert_kind_of(RubyDataSource, data_source) + end + + def test_set_standard_zoneinfo_search + Dir.mktmpdir('tzinfo_test_dir') do |dir| + FileUtils.touch(File.join(dir, 'iso3166.tab')) + FileUtils.touch(File.join(dir, 'zone.tab')) + + ZoneinfoDataSource.search_path = [dir] + + DataSource.set(:zoneinfo) + data_source = DataSource.get + assert_kind_of(ZoneinfoDataSource, data_source) + assert_equal(dir, data_source.zoneinfo_dir) + end + end + + def test_set_standard_zoneinfo_search_zone1970 + Dir.mktmpdir('tzinfo_test_dir') do |dir| + FileUtils.touch(File.join(dir, 'iso3166.tab')) + FileUtils.touch(File.join(dir, 'zone1970.tab')) + + ZoneinfoDataSource.search_path = [dir] + + DataSource.set(:zoneinfo) + data_source = DataSource.get + assert_kind_of(ZoneinfoDataSource, data_source) + assert_equal(dir, data_source.zoneinfo_dir) + end + end + + def test_set_standard_zoneinfo_explicit + Dir.mktmpdir('tzinfo_test_dir') do |dir| + FileUtils.touch(File.join(dir, 'iso3166.tab')) + FileUtils.touch(File.join(dir, 'zone.tab')) + + DataSource.set(:zoneinfo, dir) + data_source = DataSource.get + assert_kind_of(ZoneinfoDataSource, data_source) + assert_equal(dir, data_source.zoneinfo_dir) + end + end + + def test_set_standard_zoneinfo_explicit_zone1970 + Dir.mktmpdir('tzinfo_test_dir') do |dir| + FileUtils.touch(File.join(dir, 'iso3166.tab')) + FileUtils.touch(File.join(dir, 'zone.tab')) + + DataSource.set(:zoneinfo, dir) + data_source = DataSource.get + assert_kind_of(ZoneinfoDataSource, data_source) + assert_equal(dir, data_source.zoneinfo_dir) + end + end + + def test_set_standard_zoneinfo_explicit_alternate_iso3166 + Dir.mktmpdir('tzinfo_test_dir') do |dir| + zoneinfo_dir = File.join(dir, 'zoneinfo') + tab_dir = File.join(dir, 'tab') + + FileUtils.mkdir(zoneinfo_dir) + FileUtils.mkdir(tab_dir) + + FileUtils.touch(File.join(zoneinfo_dir, 'zone.tab')) + + iso3166_file = File.join(tab_dir, 'iso3166.tab') + FileUtils.touch(iso3166_file) + + DataSource.set(:zoneinfo, zoneinfo_dir, iso3166_file) + data_source = DataSource.get + assert_kind_of(ZoneinfoDataSource, data_source) + assert_equal(zoneinfo_dir, data_source.zoneinfo_dir) + end + end + + def test_set_standard_zoneinfo_search_not_found + Dir.mktmpdir('tzinfo_test_dir') do |dir| + ZoneinfoDataSource.search_path = [dir] + + assert_raises(ZoneinfoDirectoryNotFound) do + DataSource.set(:zoneinfo) + end + + assert_kind_of(InitDataSource, DataSource.get) + end + end + + def test_set_standard_zoneinfo_explicit_invalid + Dir.mktmpdir('tzinfo_test_dir') do |dir| + assert_raises(InvalidZoneinfoDirectory) do + DataSource.set(:zoneinfo, dir) + end + + assert_kind_of(InitDataSource, DataSource.get) + end + end + + def test_set_standard_zoneinfo_wrong_arg_count + assert_raises(ArgumentError) do + DataSource.set(:zoneinfo, 1, 2, 3) + end + + assert_kind_of(InitDataSource, DataSource.get) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_data_timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_data_timezone.rb new file mode 100644 index 000000000000..15ee27bfee49 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_data_timezone.rb @@ -0,0 +1,99 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCDataTimezone < Minitest::Test + + class TestTimezoneInfo < TimezoneInfo + attr_reader :utc + attr_reader :local + attr_reader :utc_to + attr_reader :utc_from + + def initialize(identifier, utc_period, local_periods, transitions_up_to) + super(identifier) + @utc_period = utc_period + @local_periods = local_periods || [] + @transitions_up_to = transitions_up_to + end + + def period_for_utc(utc) + @utc = utc + @utc_period + end + + def periods_for_local(local) + @local = local + @local_periods + end + + def transitions_up_to(utc_to, utc_from = nil) + @utc_to = utc_to + @utc_from = utc_from + @transitions_up_to + end + end + + def test_identifier + tz = DataTimezone.new(TestTimezoneInfo.new('Test/Zone', nil, [], [])) + assert_equal('Test/Zone', tz.identifier) + end + + def test_period_for_utc + # Don't need actual TimezonePeriods. DataTimezone isn't supposed to do + # anything with them apart from return them. + period = Object.new + tti = TestTimezoneInfo.new('Test/Zone', period, [], []) + tz = DataTimezone.new(tti) + + t = Time.utc(2006, 6, 27, 22, 50, 12) + assert_same(period, tz.period_for_utc(t)) + assert_same(t, tti.utc) + end + + def test_periods_for_local + # Don't need actual TimezonePeriods. DataTimezone isn't supposed to do + # anything with them apart from return them. + periods = [Object.new, Object.new] + tti = TestTimezoneInfo.new('Test/Zone', nil, periods, []) + tz = DataTimezone.new(tti) + + t = Time.utc(2006, 6, 27, 22, 50, 12) + assert_same(periods, tz.periods_for_local(t)) + assert_same(t, tti.local) + end + + def test_periods_for_local_not_found + periods = [] + tti = TestTimezoneInfo.new('Test/Zone', nil, periods, []) + tz = DataTimezone.new(tti) + + t = Time.utc(2006, 6, 27, 22, 50, 12) + assert_same(periods, tz.periods_for_local(t)) + assert_same(t, tti.local) + end + + def test_transitions_up_to + # Don't need actual TimezoneTransition instances. DataTimezone isn't + # supposed to do anything with them apart from return them. + transitions = [Object.new, Object.new] + tti = TestTimezoneInfo.new('Test/Zone', nil, nil, transitions) + tz = DataTimezone.new(tti) + + utc_to = Time.utc(2013, 1, 1, 0, 0, 0) + utc_from = Time.utc(2012, 1, 1, 0, 0, 0) + assert_same(transitions, tz.transitions_up_to(utc_to, utc_from)) + assert_same(utc_to, tti.utc_to) + assert_same(utc_from, tti.utc_from) + end + + def test_canonical_identifier + tz = DataTimezone.new(TestTimezoneInfo.new('Test/Zone', nil, [], [])) + assert_equal('Test/Zone', tz.canonical_identifier) + end + + def test_canonical_zone + tz = DataTimezone.new(TestTimezoneInfo.new('Test/Zone', nil, [], [])) + assert_same(tz, tz.canonical_zone) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_data_timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_data_timezone_info.rb new file mode 100644 index 000000000000..1b9d144564ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_data_timezone_info.rb @@ -0,0 +1,18 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCDataTimezoneInfo < Minitest::Test + + def test_identifier + ti = DataTimezoneInfo.new('Test/Zone') + assert_equal('Test/Zone', ti.identifier) + end + + def test_construct_timezone + ti = DataTimezoneInfo.new('Test/Zone') + tz = ti.create_timezone + assert_kind_of(DataTimezone, tz) + assert_equal('Test/Zone', tz.identifier) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_info_timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_info_timezone.rb new file mode 100644 index 000000000000..c70a09879e51 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_info_timezone.rb @@ -0,0 +1,34 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCInfoTimezone < Minitest::Test + + class TestInfoTimezone < InfoTimezone + attr_reader :setup_info + + protected + def setup(info) + super(info) + @setup_info = info + end + end + + def test_identifier + tz = InfoTimezone.new(TimezoneInfo.new('Test/Identifier')) + assert_equal('Test/Identifier', tz.identifier) + end + + def test_info + i = TimezoneInfo.new('Test/Identifier') + tz = InfoTimezone.new(i) + assert_same(i, tz.send(:info)) + end + + def test_setup + i = TimezoneInfo.new('Test/Identifier') + tz = TestInfoTimezone.new(i) + assert_same(i, tz.setup_info) + end +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_linked_timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_linked_timezone.rb new file mode 100644 index 000000000000..5da9303e80ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_linked_timezone.rb @@ -0,0 +1,155 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCLinkedTimezone < Minitest::Test + + class TestTimezone < Timezone + attr_reader :utc_period + attr_reader :local_periods + attr_reader :up_to_transitions + attr_reader :utc + attr_reader :local + attr_reader :utc_to + attr_reader :utc_from + + def self.new(identifier, no_local_periods = false) + tz = super() + tz.send(:setup, identifier, no_local_periods) + tz + end + + def identifier + @identifier + end + + def period_for_utc(utc) + @utc = utc + @utc_period + end + + def periods_for_local(local) + @local = local + raise PeriodNotFound if @no_local_periods + @local_periods + end + + def transitions_up_to(utc_to, utc_from = nil) + @utc_to = utc_to + @utc_from = utc_from + @up_to_transitions + end + + def canonical_zone + self + end + + private + def setup(identifier, no_local_periods) + @identifier = identifier + @no_local_periods = no_local_periods + + # Don't have to be real TimezonePeriod or TimezoneTransition objects + # (nothing will use them). + @utc_period = Object.new + @local_periods = [Object.new, Object.new] + @up_to_transitions = [Object.new, Object.new] + end + end + + + def setup + # Redefine Timezone.get to return a fake timezone. + # Use without_warnings to suppress redefined get method warning. + without_warnings do + def Timezone.get(identifier) + raise InvalidTimezoneIdentifier, 'Invalid identifier' if identifier == 'Invalid/Identifier' + + @timezones ||= {} + @timezones[identifier] ||= + identifier == 'Test/Recursive/Linked' ? + LinkedTimezone.new(LinkedTimezoneInfo.new(identifier, 'Test/Recursive/Data')) : + TestTimezone.new(identifier, identifier == 'Test/No/Local') + end + end + end + + def teardown + # Re-require timezone to reset. + # Suppress redefined method warnings. + without_warnings do + load 'tzinfo/timezone.rb' + end + end + + def test_identifier + tz = LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Test/Linked')) + assert_equal('Test/Zone', tz.identifier) + end + + def test_invalid_linked_identifier + assert_raises(InvalidTimezoneIdentifier) { LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Invalid/Identifier')) } + end + + def test_period_for_utc + tz = LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Test/Linked')) + linked_tz = Timezone.get('Test/Linked') + t = Time.utc(2006, 6, 27, 23, 12, 28) + assert_same(linked_tz.utc_period, tz.period_for_utc(t)) + assert_same(t, linked_tz.utc) + end + + def test_periods_for_local + tz = LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Test/Linked')) + linked_tz = Timezone.get('Test/Linked') + t = Time.utc(2006, 6, 27, 23, 12, 28) + assert_same(linked_tz.local_periods, tz.periods_for_local(t)) + assert_same(t, linked_tz.local) + end + + def test_periods_for_local_not_found + tz = LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Test/No/Local')) + linked_tz = Timezone.get('Test/No/Local') + t = Time.utc(2006, 6, 27, 23, 12, 28) + assert_raises(PeriodNotFound) { tz.periods_for_local(t) } + assert_same(t, linked_tz.local) + end + + def test_transitions_up_to + tz = LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Test/Linked')) + linked_tz = Timezone.get('Test/Linked') + utc_to = Time.utc(2013, 1, 1, 0, 0, 0) + utc_from = Time.utc(2012, 1, 1, 0, 0, 0) + assert_same(linked_tz.up_to_transitions, tz.transitions_up_to(utc_to, utc_from)) + assert_same(utc_to, linked_tz.utc_to) + assert_same(utc_from, linked_tz.utc_from) + end + + def test_canonical_identifier + tz = LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Test/Linked')) + assert_equal('Test/Linked', tz.canonical_identifier) + end + + def test_canonical_identifier_recursive + # Recursive links are not currently used in the Time Zone database, but + # will be supported by TZInfo. + + tz = LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Test/Recursive/Linked')) + assert_equal('Test/Recursive/Data', tz.canonical_identifier) + end + + def test_canonical_zone + tz = LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Test/Linked')) + linked_tz = Timezone.get('Test/Linked') + assert_same(linked_tz, tz.canonical_zone) + end + + def test_canonical_zone_recursive + # Recursive links are not currently used in the Time Zone database, but + # will be supported by TZInfo. + + tz = LinkedTimezone.new(LinkedTimezoneInfo.new('Test/Zone', 'Test/Recursive/Linked')) + linked_tz = Timezone.get('Test/Recursive/Data') + assert_same(linked_tz, tz.canonical_zone) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_linked_timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_linked_timezone_info.rb new file mode 100644 index 000000000000..4e55f4de630a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_linked_timezone_info.rb @@ -0,0 +1,23 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCLinkedTimezoneInfo < Minitest::Test + + def test_identifier + lti = LinkedTimezoneInfo.new('Test/Zone', 'Test/Linked') + assert_equal('Test/Zone', lti.identifier) + end + + def test_link_to_identifier + lti = LinkedTimezoneInfo.new('Test/Zone', 'Test/Linked') + assert_equal('Test/Linked', lti.link_to_identifier) + end + + def test_construct_timezone + lti = LinkedTimezoneInfo.new('Test/Zone', 'Europe/London') + tz = lti.create_timezone + assert_kind_of(LinkedTimezone, tz) + assert_equal('Test/Zone', tz.identifier) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_offset_rationals.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_offset_rationals.rb new file mode 100644 index 000000000000..2881fc79df6c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_offset_rationals.rb @@ -0,0 +1,23 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCOffsetRationals < Minitest::Test + def test_rational_for_offset + [0,1,2,3,4,-1,-2,-3,-4,30*60,-30*60,61*60,-61*60,14*60*60,-14*60*60,20*60*60,-20*60*60].each {|seconds| + assert_equal(Rational(seconds, 86400), OffsetRationals.rational_for_offset(seconds)) + } + end + + def test_rational_for_offset_constant + -28.upto(28) {|i| + seconds = i * 30 * 60 + + r1 = OffsetRationals.rational_for_offset(seconds) + r2 = OffsetRationals.rational_for_offset(seconds) + + assert_equal(Rational(seconds, 86400), r1) + assert_same(r1, r2) + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_posix_time_zone_parser.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_posix_time_zone_parser.rb new file mode 100644 index 000000000000..1e8f15377e8c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_posix_time_zone_parser.rb @@ -0,0 +1,261 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCPosixTimeZoneParser < Minitest::Test + HOUR = 3600 + MINUTE = 60 + + class << self + private + + def append_time_to_rule(day_rule, time) + time ? "#{day_rule}/#{time}" : day_rule + end + + def define_invalid_dst_rule_tests(type, rule) + define_method "test_#{type}_dst_start_rule_for_invalid_#{rule}" do + tz_string = "STD-1DST,#{rule},300" + assert_raises(InvalidPosixTimeZone) { @parser.parse(tz_string) } + end + + define_method "test_#{type}_dst_end_rule_for_invalid_#{rule}" do + tz_string = "STD-1DST,60,#{rule}" + assert_raises(InvalidPosixTimeZone) { @parser.parse(tz_string) } + end + end + end + + def setup + @parser = PosixTimeZoneParser.new + end + + def test_empty_rule_returns_nil + result = @parser.parse('') + assert_nil(result) + end + + ABBREVIATIONS_WITH_OFFSETS = [ + ['UTC0', :UTC, 0], + ['U0', :U, 0], + ['West1', :West, -HOUR], + ['East-1', :East, HOUR], + ['<-05>5', :'-05', -5 * HOUR], + ['<+12>-12', :'+12', 12 * HOUR], + ['HMM2:30', :HMM, -(2 * HOUR + 30 * MINUTE)], + ['HHMM02:30', :HHMM, -(2 * HOUR + 30 * MINUTE)], + ['HHMM+02:30', :HHMM, -(2 * HOUR + 30 * MINUTE)], + ['HHMSS-12:5:50', :HHMSS, 12 * HOUR + 5 * MINUTE + 50], + ['HHMMSS-12:05:50', :HHMMSS, 12 * HOUR + 5 * MINUTE + 50], + ['HHMMS-12:05:7', :HHMMS, 12 * HOUR + 5 * MINUTE + 7] + ] + + ABBREVIATIONS_WITH_OFFSETS.each do |(tz_string, expected_abbrev, expected_base_offset)| + define_method "test_std_only_returns_std_offset_#{tz_string}" do + result = @parser.parse(tz_string) + expected = TimezoneOffset.new(expected_base_offset, 0, expected_abbrev) + assert_equal(expected, result) + end + end + + ABBREVIATIONS_WITH_OFFSETS.each do |(abbrev_and_offset, expected_abbrev, expected_base_offset)| + define_method "test_std_offset_#{abbrev_and_offset}" do + result = @parser.parse(abbrev_and_offset + 'DST,60,300') + expected_std_offset = TimezoneOffset.new(expected_base_offset, 0, expected_abbrev) + assert_equal(expected_std_offset, result.std_offset) + end + end + + [ + ['Zero0One-1', :One, 0, HOUR], + ['Zero0One', :One, 0, HOUR], + ['Z0O', :O, 0, HOUR], + ['West1WestS0', :WestS, -HOUR, HOUR], + ['West1WestS', :WestS, -HOUR, HOUR], + ['East-1EastS-2', :EastS, HOUR, HOUR], + ['East-1EastS', :EastS, HOUR, HOUR], + ['Neg2NegS3', :NegS, -2 * HOUR, -HOUR], + ['<-05>5<-04>4', :'-04', -5 * HOUR, HOUR], + ['STD5<-04>4', :'-04', -5 * HOUR, HOUR], + ['<+12>-12<+13>-13', :'+13', 12 * HOUR, HOUR], + ['STD-12<+13>-13', :'+13', 12 * HOUR, HOUR], + ['HMM2:30SHMM1:15', :SHMM, -(2 * HOUR + 30 * MINUTE), HOUR + 15 * MINUTE], + ['HHMM02:30SHHMM01:15', :SHHMM, -(2 * HOUR + 30 * MINUTE), HOUR + 15 * MINUTE], + ['HHMM+02:30SHHMM+01:15', :SHHMM, -(2 * HOUR + 30 * MINUTE), HOUR + 15 * MINUTE], + ['HHMSS-12:5:50SHHMSS-13:4:30', :SHHMSS, 12 * HOUR + 5 * MINUTE + 50, 58 * MINUTE + 40], + ['HHMMSS-12:05:50SHHMMSS-13:04:30', :SHHMMSS, 12 * HOUR + 5 * MINUTE + 50, 58 * MINUTE + 40], + ['HHMMS-12:05:7SHHMMSS-13:06:8', :SHHMMSS, 12 * HOUR + 5 * MINUTE + 7, HOUR + MINUTE + 1], + ].each do |(abbrevs_and_offsets, expected_abbrev, expected_base_offset, expected_std_offset)| + define_method "test_dst_offset_#{abbrevs_and_offsets}" do + result = @parser.parse(abbrevs_and_offsets + ',60,300') + expected_dst_offset = TimezoneOffset.new(expected_base_offset, expected_std_offset, expected_abbrev) + assert_equal(expected_dst_offset, result.dst_offset) + end + end + + ['<M-1>01:-1', '<M60>01:60', '<S-1>01:00:-1', '<S60>01:00:60'].each do |abbrev_and_offset| + ['', 'DST,60,300'].each do |dst_suffix| + tz_string = abbrev_and_offset + dst_suffix + define_method "test_std_offset_invalid_#{tz_string}" do + assert_raises(InvalidPosixTimeZone) { @parser.parse(tz_string) } + end + end + + tz_string = "STD1#{abbrev_and_offset},60,300" + define_method "test_dst_offset_invalid_#{tz_string}" do + assert_raises(InvalidPosixTimeZone) { @parser.parse(tz_string) } + end + end + + [ + [nil, 2 * HOUR], + ['2', 2 * HOUR], + ['+2', 2 * HOUR], + ['-2', -2 * HOUR], + ['2:3:4', 2 * HOUR + 3 * MINUTE + 4], + ['02:03:04', 2 * HOUR + 3 * MINUTE + 4], + ['-2:3:4', -2 * HOUR + 3 * MINUTE + 4], # 22:03:04 on the day prior to the one specified + ['-02:03:04', -2 * HOUR + 3 * MINUTE + 4], + ['167', 167 * HOUR], + ['-167', -167 * HOUR] + ].each do |(time, expected_offset_from_midnight)| + [ + ['J1', 1], + ['J365', 365] + ].each do |(julian_day_rule, expected_julian_day)| + rule = append_time_to_rule(julian_day_rule, time) + + define_method "test_julian_day_dst_start_rule_for_#{rule}" do + result = @parser.parse("STD-1DST,#{rule},300") + expected_dst_start_rule = JulianDayOfYearTransitionRule.new(expected_julian_day, expected_offset_from_midnight) + assert_equal(expected_dst_start_rule, result.dst_start_rule) + end + + define_method "test_julian_day_dst_end_rule_for_#{rule}" do + result = @parser.parse("STD-1DST,60,#{rule}") + expected_dst_end_rule = JulianDayOfYearTransitionRule.new(expected_julian_day, expected_offset_from_midnight) + assert_equal(expected_dst_end_rule, result.dst_end_rule) + end + end + + [ + ['0', 0], + ['365', 365] + ].each do |(absolute_day_rule, expected_day)| + rule = append_time_to_rule(absolute_day_rule, time) + + define_method "test_absolute_day_dst_start_rule_for_#{rule}" do + result = @parser.parse("STD-1DST,#{rule},J300") + expected_dst_start_rule = AbsoluteDayOfYearTransitionRule.new(expected_day, expected_offset_from_midnight) + assert_equal(expected_dst_start_rule, result.dst_start_rule) + end + + define_method "test_absolute_day_dst_end_rule_for_#{rule}" do + result = @parser.parse("STD-1DST,J60,#{rule}") + expected_dst_end_rule = AbsoluteDayOfYearTransitionRule.new(expected_day, expected_offset_from_midnight) + assert_equal(expected_dst_end_rule, result.dst_end_rule) + end + end + + [ + ['M1.1.0', 1, 1, 0], + ['M12.4.6', 12, 4, 6] + ].each do |(day_of_month_rule, expected_month, expected_week, expected_day_of_week)| + rule = append_time_to_rule(day_of_month_rule, time) + + define_method "test_day_of_month_dst_start_rule_for_#{rule}" do + result = @parser.parse("STD-1DST,#{rule},300") + expected_dst_start_rule = DayOfMonthTransitionRule.new(expected_month, expected_week, expected_day_of_week, expected_offset_from_midnight) + assert_equal(expected_dst_start_rule, result.dst_start_rule) + end + + define_method "test_day_of_month_dst_end_rule_for_#{rule}" do + result = @parser.parse("STD-1DST,60,#{rule}") + expected_dst_end_rule = DayOfMonthTransitionRule.new(expected_month, expected_week, expected_day_of_week, expected_offset_from_midnight) + assert_equal(expected_dst_end_rule, result.dst_end_rule) + end + end + + [ + ['M1.5.0', 1, 0], + ['M12.5.6', 12, 6] + ].each do |(last_day_of_month_rule, expected_month, expected_day_of_week)| + rule = append_time_to_rule(last_day_of_month_rule, time) + + define_method "test_last_day_of_month_dst_start_rule_for_#{rule}" do + result = @parser.parse("STD-1DST,#{rule},300") + expected_dst_start_rule = LastDayOfMonthTransitionRule.new(expected_month, expected_day_of_week, expected_offset_from_midnight) + assert_equal(expected_dst_start_rule, result.dst_start_rule) + end + + define_method "test_last_day_of_month_dst_end_rule_for_#{rule}" do + result = @parser.parse("STD-1DST,60,#{rule}") + expected_dst_end_rule = LastDayOfMonthTransitionRule.new(expected_month, expected_day_of_week, expected_offset_from_midnight) + assert_equal(expected_dst_end_rule, result.dst_end_rule) + end + end + end + + ['J0', 'J366'].each do |julian_day_rule| + define_invalid_dst_rule_tests('julian_day', julian_day_rule) + end + + ['-1', '366'].each do |absolute_day_rule| + define_invalid_dst_rule_tests('absolute_day', absolute_day_rule) + end + + ['M0,1,0', 'M13,1,0', 'M6,0,0', 'M6,6,0', 'M6,1,-1', 'M6,1,7'].each do |day_of_month_rule| + define_invalid_dst_rule_tests('day_of_month', day_of_month_rule) + end + + ['M0,5,0', 'M13,5,0', 'M6,5,-1', 'M6,5,7'].each do |last_day_of_month_rule| + define_invalid_dst_rule_tests('last_day_of_month', last_day_of_month_rule) + end + + def test_invalid_dst_start_rule + assert_raises(InvalidPosixTimeZone) { @parser.parse('STD1DST,X60,300') } + end + + def test_invalid_dst_end_rule + assert_raises(InvalidPosixTimeZone) { @parser.parse('STD1DST,60,X300') } + end + + [ + ['STD5DST,0/0,J365/25', :DST, -5 * HOUR, HOUR], + ['STD-5DST,0/0,J365/25', :DST, 5 * HOUR, HOUR], + ['STD5DST3,0/0,J365/26', :DST, -5 * HOUR, 2 * HOUR], + ['STD5DST6,0/0,J365/23', :DST, -5 * HOUR, -HOUR], + ['STD5DST,J1/0,J365/25', :DST, -5 * HOUR, HOUR], + ['Winter5Summer,0/0,J365/25', :Summer, -5 * HOUR, HOUR], + ['<-05>5<-06>,0/0,J365/25', :'-06', -5 * HOUR, HOUR] + ].each do |(tz_string, expected_abbrev, expected_base_offset, expected_std_offset)| + define_method "test_dst_only_returns_continuous_offset_for_#{tz_string}" do + result = @parser.parse(tz_string) + expected = TimezoneOffset.new(expected_base_offset, expected_std_offset, expected_abbrev) + assert_equal(expected, result) + end + end + + def test_parses_tainted_string_in_safe_mode_and_returns_untainted_abbreviations + safe_test(:unavailable => :skip) do + result = @parser.parse('STD1DST,60,300'.dup.taint) + + assert_equal(:STD, result.std_offset.abbreviation) + assert_equal(:DST, result.dst_offset.abbreviation) + end + end + + ['STD1', 'STD1DST,60,300'].each do |tz_string| + tz_string += "-" + define_method "test_content_after_end_for_#{tz_string}" do + error = assert_raises(InvalidPosixTimeZone) { @parser.parse(tz_string) } + assert_equal("Expected the end of a POSIX-style time zone string but found '-'.", error.message) + end + end + + ['X', 0].each do |invalid_tz_string| + define_method "test_invalid_tz_string_#{invalid_tz_string}" do + assert_raises(InvalidPosixTimeZone) { @parser.parse(invalid_tz_string) } + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_ruby_core_support.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_ruby_core_support.rb new file mode 100644 index 000000000000..56c5a8a5fd21 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_ruby_core_support.rb @@ -0,0 +1,168 @@ +# encoding: UTF-8 + +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCRubyCoreSupport < Minitest::Test + def test_rational_new! + assert_equal(Rational(3,4), RubyCoreSupport.rational_new!(3,4)) + end + + def test_datetime_new! + assert_equal(DateTime.new(2008,10,5,12,0,0, 0, Date::ITALY), RubyCoreSupport.datetime_new!(2454745,0,2299161)) + assert_equal(DateTime.new(2008,10,5,13,0,0, Rational(1, 24), Date::ITALY), RubyCoreSupport.datetime_new!(2454745,Rational(1, 24),2299161)) + + assert_equal(DateTime.new(2008,10,5,20,30,0, 0, Date::ITALY), RubyCoreSupport.datetime_new!(Rational(117827777, 48), 0, 2299161)) + assert_equal(DateTime.new(2008,10,5,21,30,0, Rational(1, 24), Date::ITALY), RubyCoreSupport.datetime_new!(Rational(117827777, 48), Rational(1, 24), 2299161)) + + assert_equal(DateTime.new(2008,10,6,6,26,21, 0, Date::ITALY), RubyCoreSupport.datetime_new!(Rational(70696678127,28800), 0, 2299161)) + assert_equal(DateTime.new(2008,10,6,7,26,21, Rational(1, 24), Date::ITALY), RubyCoreSupport.datetime_new!(Rational(70696678127, 28800), Rational(1, 24), 2299161)) + + assert_equal(DateTime.new(-4712,1,1,12,0,0, 0, Date::ITALY), RubyCoreSupport.datetime_new!(0, 0, 2299161)) + assert_equal(DateTime.new(-4712,1,1,13,0,0, Rational(1, 24), Date::ITALY), RubyCoreSupport.datetime_new!(0, Rational(1, 24), 2299161)) + + assert_equal(DateTime.new(-4713,12,31,23,58,59, 0, Date::ITALY), RubyCoreSupport.datetime_new!(Rational(-43261, 86400), 0, 2299161)) + assert_equal(DateTime.new(-4712,1,1,0,58,59, Rational(1, 24), Date::ITALY), RubyCoreSupport.datetime_new!(Rational(-43261, 86400), Rational(1, 24), 2299161)) + + assert_equal(DateTime.new(-4713,12,30,23,58,59, 0, Date::ITALY), RubyCoreSupport.datetime_new!(Rational(-129661, 86400), 0, 2299161)) + assert_equal(DateTime.new(-4713,12,31,0,58,59, Rational(1, 24), Date::ITALY), RubyCoreSupport.datetime_new!(Rational(-129661, 86400), Rational(1, 24), 2299161)) + end + + def test_datetime_new + assert_equal(DateTime.new(2012, 12, 31, 23, 59, 59, 0, Date::ITALY), RubyCoreSupport.datetime_new(2012, 12, 31, 23, 59, 59, 0, Date::ITALY)) + assert_equal(DateTime.new(2013, 2, 6, 23, 2, 36, Rational(1, 24), Date::ITALY), RubyCoreSupport.datetime_new(2013, 2, 6, 23, 2, 36, Rational(1,24), Date::ITALY)) + + assert_equal(DateTime.new(2012, 12, 31, 23, 59, 59, 0, Date::ITALY) + Rational(1, 86400000), RubyCoreSupport.datetime_new(2012, 12, 31, 23, 59, 59 + Rational(1, 1000), 0, Date::ITALY)) + assert_equal(DateTime.new(2001, 10, 12, 12, 22, 59, Rational(1, 24), Date::ITALY) + Rational(501, 86400000), RubyCoreSupport.datetime_new(2001, 10, 12, 12, 22, 59 + Rational(501, 1000), Rational(1, 24), Date::ITALY)) + end + + def test_time_supports_negative + if RubyCoreSupport.time_supports_negative + assert_equal(Time.utc(1969, 12, 31, 23, 59, 59), Time.at(-1).utc) + else + assert_raises(ArgumentError) do + Time.at(-1) + end + end + end + + def test_time_supports_64_bit + if RubyCoreSupport.time_supports_64bit + assert_equal(Time.utc(1901, 12, 13, 20, 45, 51), Time.at(-2147483649).utc) + assert_equal(Time.utc(2038, 1, 19, 3, 14, 8), Time.at(2147483648).utc) + else + assert_raises(RangeError) do + Time.at(-2147483649) + end + + assert_raises(RangeError) do + Time.at(2147483648) + end + end + end + + def test_time_nsec + t = Time.utc(2013, 2, 6, 21, 56, 23, 567890 + Rational(123,1000)) + + if t.respond_to?(:nsec) + assert_equal(567890123, RubyCoreSupport.time_nsec(t)) + else + assert_equal(567890000, RubyCoreSupport.time_nsec(t)) + end + end + + def test_force_encoding + s = [0xC2, 0xA9].pack('c2') + + if s.respond_to?(:force_encoding) + # Ruby 1.9+ - should call String#force_encoding + assert_equal('ASCII-8BIT', s.encoding.name) + assert_equal(2, s.bytesize) + result = RubyCoreSupport.force_encoding(s, 'UTF-8') + assert_same(s, result) + assert_equal('UTF-8', s.encoding.name) + assert_equal(2, s.bytesize) + assert_equal(1, s.length) + assert_equal('©', s) + else + # Ruby 1.8 - no-op + result = RubyCoreSupport.force_encoding(s, 'UTF-8') + assert_same(s, result) + assert_equal('©', s) + end + end + + begin + SUPPORTS_ENCODING = !!Encoding + rescue NameError + SUPPORTS_ENCODING = false + end + + def check_open_file_test_file_bytes(test_file) + if SUPPORTS_ENCODING + File.open(test_file, 'r') do |file| + file.binmode + data = file.read(2) + refute_nil(data) + assert_equal(2, data.length) + bytes = data.unpack('C2') + assert_equal(0xC2, bytes[0]) + assert_equal(0xA9, bytes[1]) + end + end + end + + def check_open_file_test_file_content(file) + content = file.gets + refute_nil(content) + content.chomp! + + if SUPPORTS_ENCODING + assert_equal('UTF-8', content.encoding.name) + assert_equal(1, content.length) + assert_equal(2, content.bytesize) + assert_equal('©', content) + else + assert_equal('x', content) + end + end + + def test_open_file + Dir.mktmpdir('tzinfo_test') do |dir| + test_file = File.join(dir, 'test.txt') + + file = RubyCoreSupport.open_file(test_file, 'w', :external_encoding => 'UTF-8') + begin + file.puts(SUPPORTS_ENCODING ? '©' : 'x') + ensure + file.close + end + + check_open_file_test_file_bytes(test_file) + + file = RubyCoreSupport.open_file(test_file, 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') + begin + check_open_file_test_file_content(file) + ensure + file.close + end + end + end + + def test_open_file_block + Dir.mktmpdir('tzinfo_test') do |dir| + test_file = File.join(dir, 'test.txt') + + RubyCoreSupport.open_file(test_file, 'w', :external_encoding => 'UTF-8') do |file| + file.puts(SUPPORTS_ENCODING ? '©' : 'x') + end + + check_open_file_test_file_bytes(test_file) + + RubyCoreSupport.open_file(test_file, 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') do |file| + check_open_file_test_file_content(file) + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_ruby_country_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_ruby_country_info.rb new file mode 100644 index 000000000000..c99f09f671fd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_ruby_country_info.rb @@ -0,0 +1,110 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCRubyCountryInfo < Minitest::Test + + def test_code + ci = RubyCountryInfo.new('ZZ', 'Zzz') {|c| } + assert_equal('ZZ', ci.code) + end + + def test_name + ci = RubyCountryInfo.new('ZZ', 'Zzz') {|c| } + assert_equal('Zzz', ci.name) + end + + def test_zone_identifiers_empty + ci = RubyCountryInfo.new('ZZ', 'Zzz') {|c| } + assert(ci.zone_identifiers.empty?) + assert(ci.zone_identifiers.frozen?) + end + + def test_zone_identifiers_no_block + ci = RubyCountryInfo.new('ZZ', 'Zzz') + assert(ci.zone_identifiers.empty?) + assert(ci.zone_identifiers.frozen?) + end + + def test_zone_identifiers + ci = RubyCountryInfo.new('ZZ', 'Zzz') do |c| + c.timezone('ZZ/TimezoneB', 1, 2, 1, 2, 'Timezone B') + c.timezone('ZZ/TimezoneA', 1, 4, 1, 4, 'Timezone A') + c.timezone('ZZ/TimezoneC', -10, 3, -20, 7, 'C') + c.timezone('ZZ/TimezoneD', -10, 3, -20, 7) + end + + assert_equal(['ZZ/TimezoneB', 'ZZ/TimezoneA', 'ZZ/TimezoneC', 'ZZ/TimezoneD'], ci.zone_identifiers) + assert(ci.zone_identifiers.frozen?) + end + + def test_zone_identifiers_after_freeze + ci = RubyCountryInfo.new('ZZ', 'Zzz') do |c| + c.timezone('ZZ/TimezoneB', 1, 2, 1, 2, 'Timezone B') + c.timezone('ZZ/TimezoneA', 1, 4, 1, 4, 'Timezone A') + c.timezone('ZZ/TimezoneC', -10, 3, -20, 7, 'C') + c.timezone('ZZ/TimezoneD', -10, 3, -20, 7) + end + + ci.freeze + + assert_equal(['ZZ/TimezoneB', 'ZZ/TimezoneA', 'ZZ/TimezoneC', 'ZZ/TimezoneD'], ci.zone_identifiers) + end + + def test_zones_empty + ci = RubyCountryInfo.new('ZZ', 'Zzz') {|c| } + assert(ci.zones.empty?) + assert(ci.zones.frozen?) + end + + def test_zones_no_block + ci = RubyCountryInfo.new('ZZ', 'Zzz') + assert(ci.zones.empty?) + assert(ci.zones.frozen?) + end + + def test_zones + ci = RubyCountryInfo.new('ZZ', 'Zzz') do |c| + c.timezone('ZZ/TimezoneB', 1, 2, 1, 2, 'Timezone B') + c.timezone('ZZ/TimezoneA', 1, 4, 1, 4, 'Timezone A') + c.timezone('ZZ/TimezoneC', -10, 3, -20, 7, 'C') + c.timezone('ZZ/TimezoneD', -10, 3, -20, 7) + end + + assert_equal([CountryTimezone.new!('ZZ/TimezoneB', 1, 2, 1, 2, 'Timezone B'), + CountryTimezone.new!('ZZ/TimezoneA', 1, 4, 1, 4, 'Timezone A'), + CountryTimezone.new!('ZZ/TimezoneC', -10, 3, -20, 7, 'C'), + CountryTimezone.new!('ZZ/TimezoneD', -10, 3, -20, 7)], + ci.zones) + assert(ci.zones.frozen?) + end + + def test_zones_after_freeze + ci = RubyCountryInfo.new('ZZ', 'Zzz') do |c| + c.timezone('ZZ/TimezoneB', 1, 2, 1, 2, 'Timezone B') + c.timezone('ZZ/TimezoneA', 1, 4, 1, 4, 'Timezone A') + c.timezone('ZZ/TimezoneC', -10, 3, -20, 7, 'C') + c.timezone('ZZ/TimezoneD', -10, 3, -20, 7) + end + + ci.freeze + + assert_equal([CountryTimezone.new!('ZZ/TimezoneB', 1, 2, 1, 2, 'Timezone B'), + CountryTimezone.new!('ZZ/TimezoneA', 1, 4, 1, 4, 'Timezone A'), + CountryTimezone.new!('ZZ/TimezoneC', -10, 3, -20, 7, 'C'), + CountryTimezone.new!('ZZ/TimezoneD', -10, 3, -20, 7)], + ci.zones) + end + + def test_deferred_evaluate + block_called = false + + ci = RubyCountryInfo.new('ZZ', 'Zzz') do |c| + block_called = true + end + + assert_equal(false, block_called) + ci.zones + assert_equal(true, block_called) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_ruby_data_source.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_ruby_data_source.rb new file mode 100644 index 000000000000..790dd8eb0b4f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_ruby_data_source.rb @@ -0,0 +1,167 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +# Use send as a workaround for erroneous 'wrong number of arguments' errors with +# JRuby 9.0.5.0 when calling methods with Java implementations. See #114. +send(:using, TaintExt) if Module.const_defined?(:TaintExt) + +class TCRubyDataSource < Minitest::Test + def setup + @data_source = RubyDataSource.new + end + + def test_initialize_not_found + # A failure to load tzinfo/data in initialize will not cause an exception. + # Attempts to load data files will subsequently fail. + code = <<-EOF + begin + ds = TZInfo::RubyDataSource.new + puts 'Initialized' + ds.load_timezone_info('Europe/London') + rescue Exception => e + puts e.class + end + EOF + + assert_sub_process_returns(['Initialized', 'TZInfo::InvalidTimezoneIdentifier'], code) + end + + def test_load_timezone_info_data + info = @data_source.load_timezone_info('Europe/London') + assert_kind_of(DataTimezoneInfo, info) + assert_equal('Europe/London', info.identifier) + end + + def test_load_timezone_info_linked + info = @data_source.load_timezone_info('UTC') + assert_kind_of(LinkedTimezoneInfo, info) + assert_equal('UTC', info.identifier) + assert_equal('Etc/UTC', info.link_to_identifier) + end + + def test_load_timezone_info_does_not_exist + assert_raises(InvalidTimezoneIdentifier) do + @data_source.load_timezone_info('Nowhere/Special') + end + end + + def test_load_timezone_info_invalid + assert_raises(InvalidTimezoneIdentifier) do + @data_source.load_timezone_info('../Definitions/UTC') + end + end + + def test_load_timezone_info_nil + assert_raises(InvalidTimezoneIdentifier) do + @data_source.load_timezone_info(nil) + end + end + + def test_load_timezone_info_case + assert_raises(InvalidTimezoneIdentifier) do + @data_source.load_timezone_info('europe/london') + end + end + + def test_load_timezone_info_plus + info = @data_source.load_timezone_info('Etc/GMT+1') + assert_equal('Etc/GMT+1', info.identifier) + end + + def test_load_timezone_info_minus + info = @data_source.load_timezone_info('Etc/GMT-1') + assert_equal('Etc/GMT-1', info.identifier) + end + + def test_load_timezone_info_tainted + skip_if_has_bug_14060 + + safe_test(:unavailable => :skip) do + identifier = 'Europe/Amsterdam'.dup.taint + assert(identifier.tainted?) + info = @data_source.load_timezone_info(identifier) + assert_equal('Europe/Amsterdam', info.identifier) + assert(identifier.tainted?) + end + end + + def test_load_timezone_info_tainted_and_frozen + skip_if_has_bug_14060 + + safe_test do + info = @data_source.load_timezone_info('Europe/Amsterdam'.dup.taint.freeze) + assert_equal('Europe/Amsterdam', info.identifier) + end + end + + def test_timezone_identifiers + all = @data_source.timezone_identifiers + assert_equal(TZInfo::Data::Indexes::Timezones.timezones, all) + assert_equal(true, all.frozen?) + end + + def test_data_timezone_identifiers + all_data = @data_source.data_timezone_identifiers + assert_equal(TZInfo::Data::Indexes::Timezones.data_timezones, all_data) + assert_equal(true, all_data.frozen?) + end + + def test_linked_timezone_identifiers + all_linked = @data_source.linked_timezone_identifiers + assert_equal(TZInfo::Data::Indexes::Timezones.linked_timezones, all_linked) + assert_equal(true, all_linked.frozen?) + end + + def test_load_country_info + info = @data_source.load_country_info('GB') + assert_equal('GB', info.code) + end + + def test_load_country_info_not_exist + assert_raises(InvalidCountryCode) do + @data_source.load_country_info('ZZ') + end + end + + def test_load_country_info_invalid + assert_raises(InvalidCountryCode) do + @data_source.load_country_info('../Countries/GB') + end + end + + def test_load_country_info_nil + assert_raises(InvalidCountryCode) do + @data_source.load_country_info(nil) + end + end + + def test_load_country_info_case + assert_raises(InvalidCountryCode) do + @data_source.load_country_info('gb') + end + end + + def test_load_country_info_tainted + safe_test(:unavailable => :skip) do + code = 'NL'.dup.taint + assert(code.tainted?) + info = @data_source.load_country_info(code) + assert_equal('NL', info.code) + assert(code.tainted?) + end + end + + def test_load_country_info_tainted_and_frozen + safe_test do + info = @data_source.load_country_info('NL'.dup.taint.freeze) + assert_equal('NL', info.code) + end + end + + def test_country_codes + codes = @data_source.country_codes + assert_equal(TZInfo::Data::Indexes::Countries.countries.keys, codes) + assert_equal(true, codes.frozen?) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_time_or_datetime.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_time_or_datetime.rb new file mode 100644 index 000000000000..d5ca73effbdd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_time_or_datetime.rb @@ -0,0 +1,674 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') +require 'rational' unless defined?(Rational) + +include TZInfo + +class TCTimeOrDateTime < Minitest::Test + # Ruby 1.8.7 (built with GCC 8.3.0 on Ubuntu 19.04) fails to perform DateTime + # arithmetic operations correctly when sub-seconds are used. Detect this and + # disable the affected tests. + DATETIME_SUBSECOND_ARITHMETIC_IS_BROKEN = (DateTime.new(2019, 12, 22, 15, 0, Rational(1, 1000)) + Rational(1, 86400)).strftime('%Q') != '1577026801001' + puts "DateTime sub-second arithmetic is broken on this platform" if DATETIME_SUBSECOND_ARITHMETIC_IS_BROKEN + + def test_initialize_time + assert_nothing_raised do + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)) + end + end + + def test_initialize_time_local + tdt = TimeOrDateTime.new(Time.local(2006, 3, 24, 15, 32, 3)) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), tdt.to_time) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), tdt.to_orig) + assert(tdt.to_time.utc?) + assert(tdt.to_orig.utc?) + end + + def test_intialize_time_local_usec + tdt = TimeOrDateTime.new(Time.local(2006, 3, 24, 15, 32, 3, 721123)) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721123), tdt.to_time) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721123), tdt.to_orig) + assert(tdt.to_time.utc?) + assert(tdt.to_orig.utc?) + end + + if Time.utc(2013, 1, 1).respond_to?(:nsec) + def test_initialize_time_local_nsec + tdt = TimeOrDateTime.new(Time.local(2006, 3, 24, 15, 32, 3, 721123 + Rational(456,1000))) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721123 + Rational(456,1000)), tdt.to_time) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721123 + Rational(456,1000)), tdt.to_orig) + assert(tdt.to_time.utc?) + assert(tdt.to_orig.utc?) + end + end + + def test_initialize_time_utc_local + # Check that local Time instances on systems using UTC as the system + # time zone are still converted to UTC Time instances. + + # Note that this will only test will only work correctly on platforms where + # setting the TZ environment variable has an effect. If setting TZ has no + # effect, then this test will still pass. + + old_tz = ENV['TZ'] + begin + ENV['TZ'] = 'UTC' + tdt = TimeOrDateTime.new(Time.local(2014, 1, 11, 17, 18, 41)) + assert_equal(Time.utc(2014, 1, 11, 17, 18, 41), tdt.to_time) + assert_equal(Time.utc(2014, 1, 11, 17, 18, 41), tdt.to_orig) + assert(tdt.to_time.utc?) + assert(tdt.to_orig.utc?) + ensure + ENV['TZ'] = old_tz + end + end + + def test_initialize_datetime_offset + tdt = TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3).new_offset(Rational(5, 24))) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), tdt.to_datetime) + assert_equal(0, tdt.to_datetime.offset) + end + + def test_initialize_datetime + assert_nothing_raised do + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) + end + end + + def test_initialize_timestamp + assert_nothing_raised do + TimeOrDateTime.new(1143214323) + end + end + + def test_initialize_timestamp_string + assert_nothing_raised do + TimeOrDateTime.new('1143214323') + end + end + + unless RubyCoreSupport.time_supports_64bit + # Only define this test for non-64bit platforms. Some 64-bit Rubies support + # greater than 64-bit, others support less than the full range. In either + # case, times at the far ends of the range are so far in the future or past + # that they are not going to turn up in timezone data. + def test_initialize_timestamp_supported_range + assert_equal((2 ** 31) - 1, TimeOrDateTime.new((2 ** 31) - 1).to_orig) + + assert_raises(RangeError) do + TimeOrDateTime.new(2 ** 31) + end + + if RubyCoreSupport.time_supports_negative + assert_equal(-(2 ** 31), TimeOrDateTime.new(-(2 ** 31)).to_orig) + + assert_raises(RangeError) do + TimeOrDateTime.new(-(2 ** 31) - 1) + end + else + assert_equal(0, TimeOrDateTime.new(0).to_orig) + + assert_raises(RangeError) do + TimeOrDateTime.new(-1) + end + end + end + end + + def test_to_time + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).to_time) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721123), + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721123)).to_time) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).to_time) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721123), + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721123, 1000000))).to_time) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new(1143214323).to_time) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new('1143214323').to_time) + end + + def test_to_time_trunc_to_usec + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721123), + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(7211239, 10000000))).to_time) + end + + def test_to_time_after_freeze + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).freeze.to_time) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), TimeOrDateTime.new(1143214323).freeze.to_time) + end + + def test_to_datetime + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).to_datetime) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721123, 1000000)), + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721123)).to_datetime) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721123, 1000000)), + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721123, 1000000))).to_datetime) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).to_datetime) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new(1143214323).to_datetime) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new('1143214323').to_datetime) + end + + def test_to_datetime_ruby186_bug + # DateTime.new in Ruby 1.8.6 won't allow a time to be specified using + # fractions of a second that is within the 60th second of a minute. + + # TimeOrDateTime has a workaround for this issue. + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 59) + Rational(721123, 86400000000), + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 59, 721123)).to_datetime) + end + + def test_to_datetime_trunc_to_usec + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721123, 1000000)), + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721123 + Rational(9, 10))).to_datetime) + end + + def test_to_datetime_after_freeze + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).freeze.to_datetime) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), TimeOrDateTime.new(1143214323).freeze.to_datetime) + end + + def test_to_i + assert_equal(1143214323, + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).to_i) + assert_equal(1143214323, + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)).to_i) + assert_equal(1143214323, + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).to_i) + assert_equal(1143214323, + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))).to_i) + assert_equal(1143214323, + TimeOrDateTime.new(1143214323).to_i) + assert_equal(1143214323, + TimeOrDateTime.new('1143214323').to_i) + end + + def test_to_i_after_freeze + assert_equal(1143214323, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).freeze.to_i) + assert_equal(1143214323, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).freeze.to_i) + end + + def test_to_orig + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721000), + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000)), + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))).to_orig) + assert_equal(1143214323, + TimeOrDateTime.new(1143214323).to_orig) + assert_equal(1143214323, + TimeOrDateTime.new('1143214323').to_orig) + end + + def test_to_s + assert_equal("Time: #{Time.utc(2006, 3, 24, 15, 32, 3).to_s}", + TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).to_s) + assert_equal("DateTime: #{DateTime.new(2006, 3, 24, 15, 32, 3)}", + TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).to_s) + assert_equal('Timestamp: 1143214323', + TimeOrDateTime.new(1143214323).to_s) + assert_equal('Timestamp: 1143214323', + TimeOrDateTime.new('1143214323').to_s) + end + + def test_year + assert_equal(2006, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).year) + assert_equal(2006, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).year) + assert_equal(2006, TimeOrDateTime.new(1143214323).year) + end + + def test_mon + assert_equal(3, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).mon) + assert_equal(3, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).mon) + assert_equal(3, TimeOrDateTime.new(1143214323).mon) + end + + def test_month + assert_equal(3, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).month) + assert_equal(3, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).month) + assert_equal(3, TimeOrDateTime.new(1143214323).month) + end + + def test_mday + assert_equal(24, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).mday) + assert_equal(24, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).mday) + assert_equal(24, TimeOrDateTime.new(1143214323).mday) + end + + def test_day + assert_equal(24, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).day) + assert_equal(24, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).day) + assert_equal(24, TimeOrDateTime.new(1143214323).day) + end + + 19.upto(25).each_with_index do |mday,i| + define_method "test_wday_time_#{i}" do + assert_equal(i, TimeOrDateTime.new(Time.utc(2006, 3, mday)).wday) + end + + define_method "test_wday_datetime_#{i}" do + assert_equal(i, TimeOrDateTime.new(DateTime.new(2006, 3, mday)).wday) + end + + define_method "test_wday_timestamp_#{i}" do + assert_equal(i, TimeOrDateTime.new(Time.utc(2006, 3, mday).to_i).wday) + end + end + + def test_hour + assert_equal(15, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).hour) + assert_equal(15, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).hour) + assert_equal(15, TimeOrDateTime.new(1143214323).hour) + end + + def test_min + assert_equal(32, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).min) + assert_equal(32, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).min) + assert_equal(32, TimeOrDateTime.new(1143214323).min) + end + + def test_sec + assert_equal(3, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).sec) + assert_equal(3, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).sec) + assert_equal(3, TimeOrDateTime.new(1143214323).sec) + end + + def test_usec + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).usec) + assert_equal(721123, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721123)).usec) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).usec) + assert_equal(721123, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721123,1000000))).usec) + assert_equal(0, TimeOrDateTime.new(1143214323).usec) + end + + def test_usec_after_to_i + val = TimeOrDateTime.new(Time.utc(2013, 2, 4, 22, 10, 33, 598000)) + assert_equal(Time.utc(2013, 2, 4, 22, 10, 33).to_i, val.to_i) + assert_equal(598000, val.usec) + end + + def test_compare_timeordatetime_time + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 4))) + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2007, 3, 24, 15, 32, 3))) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3))) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 2))) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2005, 3, 24, 15, 32, 3))) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 4))) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2007, 3, 24, 15, 32, 3))) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3))) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 2))) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2005, 3, 24, 15, 32, 3))) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3))) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3))) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 4))) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(Time.utc(2007, 3, 24, 15, 32, 3))) + assert_equal(0, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3))) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 2))) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(Time.utc(2005, 3, 24, 15, 32, 3))) + + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500001))) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000))) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 499999))) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000 + DATETIME_RESOLUTION))) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000))) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000 - DATETIME_RESOLUTION))) + end + + def test_compare_timeordatetime_datetime + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 4))) + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3))) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3))) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 2))) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3))) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 4))) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3))) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3))) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 2))) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3))) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3))) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3))) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 4))) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3))) + assert_equal(0, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3))) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 2))) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3))) + + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000 + DATETIME_RESOLUTION, 1000000)))) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000)))) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000 - DATETIME_RESOLUTION, 1000000)))) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000 + DATETIME_RESOLUTION, 1000000)))) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000)))) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000 - DATETIME_RESOLUTION, 1000000)))) + end + + def test_compare_timeordatetime_timestamp + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1143214324)) + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1174750323)) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1143214323)) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1143214322)) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1111678323)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1143214324)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1174750323)) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1143214323)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1143214322)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1111678323)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1143214323)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3)) <=> TimeOrDateTime.new(1143214323)) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(1143214324)) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(1174750323)) + assert_equal(0, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(1143214323)) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(1143214322)) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> TimeOrDateTime.new(1111678323)) + end + + def test_compare_time + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2006, 3, 24, 15, 32, 4)) + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2007, 3, 24, 15, 32, 3)) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2006, 3, 24, 15, 32, 3)) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2006, 3, 24, 15, 32, 2)) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2005, 3, 24, 15, 32, 3)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2006, 3, 24, 15, 32, 4)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2007, 3, 24, 15, 32, 3)) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2006, 3, 24, 15, 32, 3)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2006, 3, 24, 15, 32, 2)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> Time.utc(2005, 3, 24, 15, 32, 3)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3)) <=> Time.utc(2006, 3, 24, 15, 32, 3)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3)) <=> Time.utc(2006, 3, 24, 15, 32, 3)) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> Time.utc(2006, 3, 24, 15, 32, 4)) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> Time.utc(2007, 3, 24, 15, 32, 3)) + assert_equal(0, TimeOrDateTime.new(1143214323) <=> Time.utc(2006, 3, 24, 15, 32, 3)) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> Time.utc(2006, 3, 24, 15, 32, 2)) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> Time.utc(2005, 3, 24, 15, 32, 3)) + + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> Time.utc(2006, 3, 24, 15, 32, 3, 500001)) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> Time.utc(2006, 3, 24, 15, 32, 3, 500000)) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> Time.utc(2006, 3, 24, 15, 32, 3, 499999)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> Time.utc(2006, 3, 24, 15, 32, 3, 500000 + DATETIME_RESOLUTION)) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> Time.utc(2006, 3, 24, 15, 32, 3, 500000)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> Time.utc(2006, 3, 24, 15, 32, 3, 500000 - DATETIME_RESOLUTION)) + end + + def test_compare_datetime + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(2006, 3, 24, 15, 32, 4)) + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(2040, 3, 24, 15, 32, 3)) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(2006, 3, 24, 15, 32, 3)) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(2006, 3, 24, 15, 32, 2)) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(1960, 3, 24, 15, 32, 3)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(2006, 3, 24, 15, 32, 4)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(2040, 3, 24, 15, 32, 3)) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(2006, 3, 24, 15, 32, 3)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(2006, 3, 24, 15, 32, 2)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> DateTime.new(1960, 3, 24, 15, 32, 3)) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3)) <=> DateTime.new(2006, 3, 24, 15, 32, 3)) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3)) <=> DateTime.new(2006, 3, 24, 15, 32, 3)) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> DateTime.new(2006, 3, 24, 15, 32, 4)) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> DateTime.new(2040, 3, 24, 15, 32, 3)) + assert_equal(0, TimeOrDateTime.new(1143214323) <=> DateTime.new(2006, 3, 24, 15, 32, 3)) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> DateTime.new(2006, 3, 24, 15, 32, 2)) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> DateTime.new(1960, 3, 24, 15, 32, 3)) + + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000 + DATETIME_RESOLUTION, 1000000))) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 500000)) <=> DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000 - DATETIME_RESOLUTION, 1000000))) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000 + DATETIME_RESOLUTION, 1000000))) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000, 1000000))) <=> DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(500000 - DATETIME_RESOLUTION, 1000000))) + end + + def test_compare_timestamp + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> 1143214324) + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> 1174750323) + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> 1143214323) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> 1143214322) + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> 1111678323) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> 1143214324) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> 1174750323) + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> 1143214323) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> 1143214322) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> 1111678323) + assert_equal(-1, TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3)) <=> 1143214323) + assert_equal(1, TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3)) <=> 1143214323) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> 1143214324) + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> 1174750323) + assert_equal(0, TimeOrDateTime.new(1143214323) <=> 1143214323) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> 1143214322) + assert_equal(1, TimeOrDateTime.new(1143214323) <=> 1111678323) + end + + def test_compare_timestamp_str + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> '1143214324') + assert_equal(-1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> '1174750323') + assert_equal(0, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> '1143214323') + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> '1143214322') + assert_equal(1, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> '1111678323') + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> '1143214324') + assert_equal(-1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> '1174750323') + assert_equal(0, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> '1143214323') + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> '1143214322') + assert_equal(1, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> '1111678323') + assert_equal(-1, TimeOrDateTime.new(DateTime.new(1960, 3, 24, 15, 32, 3)) <=> '1143214323') + assert_equal(1, TimeOrDateTime.new(DateTime.new(2040, 3, 24, 15, 32, 3)) <=> '1143214323') + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> '1143214324') + assert_equal(-1, TimeOrDateTime.new(1143214323) <=> '1174750323') + assert_equal(0, TimeOrDateTime.new(1143214323) <=> '1143214323') + assert_equal(1, TimeOrDateTime.new(1143214323) <=> '1143214322') + assert_equal(1, TimeOrDateTime.new(1143214323) <=> '1111678323') + end + + def test_compare_non_comparable + assert_nil(TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) <=> Object.new) + assert_nil(TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) <=> Object.new) + assert_nil(TimeOrDateTime.new(1143214323) <=> Object.new) + end + + def test_eql + assert_equal(true, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)))) + assert_equal(false, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)))) + assert_equal(false, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new(1143214323))) + assert_equal(false, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new('1143214323'))) + assert_equal(false, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 4)))) + assert_equal(false, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).eql?(Object.new)) + + assert_equal(true, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)).eql?(TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)))) + assert_equal(false, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)).eql?(TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))))) + assert_equal(false, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)).eql?(TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 722000)))) + assert_equal(false, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)).eql?(Object.new)) + + assert_equal(false, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)))) + assert_equal(true, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)))) + assert_equal(false, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new(1143214323))) + assert_equal(false, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new('1143214323'))) + assert_equal(false, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).eql?(TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 4)))) + assert_equal(false, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).eql?(Object.new)) + + assert_equal(false, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))).eql?(TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)))) + assert_equal(true, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))).eql?(TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))))) + assert_equal(false, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))).eql?(TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(722, 1000))))) + assert_equal(false, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))).eql?(Object.new)) + + + assert_equal(false, TimeOrDateTime.new(1143214323).eql?(TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)))) + assert_equal(false, TimeOrDateTime.new(1143214323).eql?(TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)))) + assert_equal(true, TimeOrDateTime.new(1143214323).eql?(TimeOrDateTime.new(1143214323))) + assert_equal(true, TimeOrDateTime.new(1143214323).eql?(TimeOrDateTime.new('1143214323'))) + assert_equal(false, TimeOrDateTime.new(1143214323).eql?(TimeOrDateTime.new(1143214324))) + assert_equal(false, TimeOrDateTime.new(1143214323).eql?(Object.new)) + end + + def test_hash + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3).hash, TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).hash) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3).hash, TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).hash) + assert_equal(1143214323.hash, TimeOrDateTime.new(1143214323).hash) + assert_equal(1143214323.hash, TimeOrDateTime.new('1143214323').hash) + end + + def test_add + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) + 0).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721000), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)) + 0).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) + 0).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000)), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))) + 0).to_orig) + assert_equal(1143214323, (TimeOrDateTime.new(1143214323) + 0).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 4), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) + 1).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 4, 721000), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)) + 1).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 4), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) + 1).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 4 + Rational(721, 1000)), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))) + 1).to_orig) unless DATETIME_SUBSECOND_ARITHMETIC_IS_BROKEN + assert_equal(1143214324, (TimeOrDateTime.new(1143214323) + 1).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 2), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) + (-1)).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 2, 721000), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)) + (-1)).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 2), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) + (-1)).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 2 + Rational(721, 1000)), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))) + (-1)).to_orig) unless DATETIME_SUBSECOND_ARITHMETIC_IS_BROKEN + assert_equal(1143214322, (TimeOrDateTime.new(1143214323) + (-1)).to_orig) + end + + def test_subtract + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) - 0).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721000), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)) - 0).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) - 0).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000)), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))) - 0).to_orig) + assert_equal(1143214323, (TimeOrDateTime.new(1143214323) - 0).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 2), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) - 1).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 2, 721000), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)) - 1).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 2), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) - 1).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 2 + Rational(721, 1000)), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))) - 1).to_orig) unless DATETIME_SUBSECOND_ARITHMETIC_IS_BROKEN + assert_equal(1143214322, (TimeOrDateTime.new(1143214323) - 1).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 4), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)) - (-1)).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 4, 721000), (TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)) - (-1)).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 4), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)) - (-1)).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 4 + Rational(721, 1000)), (TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))) - (-1)).to_orig) unless DATETIME_SUBSECOND_ARITHMETIC_IS_BROKEN + assert_equal(1143214324, (TimeOrDateTime.new(1143214323) - (-1)).to_orig) + end + + def test_add_with_convert + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).add_with_convert(0).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3, 721000), TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)).add_with_convert(0).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).add_with_convert(0).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000)), TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))).add_with_convert(0).to_orig) + assert_equal(1143214323, TimeOrDateTime.new(1143214323).add_with_convert(0).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 4), TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).add_with_convert(1).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 4, 721000), TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)).add_with_convert(1).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 4), TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).add_with_convert(1).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 4 + Rational(721, 1000)), TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))).add_with_convert(1).to_orig) unless DATETIME_SUBSECOND_ARITHMETIC_IS_BROKEN + assert_equal(1143214324, TimeOrDateTime.new(1143214323).add_with_convert(1).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 2), TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3)).add_with_convert(-1).to_orig) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 2, 721000), TimeOrDateTime.new(Time.utc(2006, 3, 24, 15, 32, 3, 721000)).add_with_convert(-1).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 2), TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3)).add_with_convert(-1).to_orig) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 2 + Rational(721, 1000)), TimeOrDateTime.new(DateTime.new(2006, 3, 24, 15, 32, 3 + Rational(721, 1000))).add_with_convert(-1).to_orig) unless DATETIME_SUBSECOND_ARITHMETIC_IS_BROKEN + assert_equal(1143214322, TimeOrDateTime.new(1143214323).add_with_convert(-1).to_orig) + + if RubyCoreSupport.time_supports_negative + assert_equal(Time.utc(1969, 12, 31, 23, 59, 59), TimeOrDateTime.new(Time.utc(1970, 1, 1, 0, 0, 0)).add_with_convert(-1).to_orig) + assert_equal(-1, TimeOrDateTime.new(0).add_with_convert(-1).to_orig) + assert_equal(Time.utc(1969, 12, 31, 23, 59, 59, 892000), TimeOrDateTime.new(Time.utc(1970, 1, 1, 0, 0, 0, 892000)).add_with_convert(-1).to_orig) + + if RubyCoreSupport.time_supports_64bit + assert_equal(Time.utc(1901, 12, 13, 20, 45, 51), TimeOrDateTime.new(Time.utc(1901, 12, 13, 20, 45, 52)).add_with_convert(-1).to_orig) + assert_equal(-2147483649, TimeOrDateTime.new(-2147483648).add_with_convert(-1).to_orig) + assert_equal(Time.utc(1901, 12, 13, 20, 45, 51, 892000), TimeOrDateTime.new(Time.utc(1901, 12, 13, 20, 45, 52, 892000)).add_with_convert(-1).to_orig) + else + assert_equal(DateTime.new(1901, 12, 13, 20, 45, 51), TimeOrDateTime.new(Time.utc(1901, 12, 13, 20, 45, 52)).add_with_convert(-1).to_orig) + assert_equal(DateTime.new(1901, 12, 13, 20, 45, 51), TimeOrDateTime.new(-2147483648).add_with_convert(-1).to_orig) + assert_equal(DateTime.new(1901, 12, 13, 20, 45, 51 + Rational(892,1000)), TimeOrDateTime.new(Time.utc(1901, 12, 13, 20, 45, 52, 892000)).add_with_convert(-1).to_orig) + end + else + assert_equal(DateTime.new(1969, 12, 31, 23, 59, 59), TimeOrDateTime.new(Time.utc(1970, 1, 1, 0, 0, 0)).add_with_convert(-1).to_orig) + assert_equal(DateTime.new(1969, 12, 31, 23, 59, 59), TimeOrDateTime.new(0).add_with_convert(-1).to_orig) + assert_equal(RubyCoreSupport.datetime_new(1969, 12, 31, 23, 59, 59 + Rational(892,1000)), TimeOrDateTime.new(Time.utc(1970, 1, 1, 0, 0, 0, 892000)).add_with_convert(-1).to_orig) + end + + if RubyCoreSupport.time_supports_64bit + assert_equal(Time.utc(2038, 1, 19, 3, 14, 8), TimeOrDateTime.new(Time.utc(2038, 1, 19, 3, 14, 7)).add_with_convert(1).to_orig) + assert_equal(2147483648, TimeOrDateTime.new(2147483647).add_with_convert(1).to_orig) + assert_equal(Time.utc(2038, 1, 19, 3, 14, 8, 892000), TimeOrDateTime.new(Time.utc(2038, 1, 19, 3, 14, 7, 892000)).add_with_convert(1).to_orig) + else + assert_equal(DateTime.new(2038, 1, 19, 3, 14, 8), TimeOrDateTime.new(Time.utc(2038, 1, 19, 3, 14, 7)).add_with_convert(1).to_orig) + assert_equal(DateTime.new(2038, 1, 19, 3, 14, 8), TimeOrDateTime.new(2147483647).add_with_convert(1).to_orig) + assert_equal(DateTime.new(2038, 1, 19, 3, 14, 8 + Rational(892,1000)), TimeOrDateTime.new(Time.utc(2038, 1, 19, 3, 14, 7, 892000)).add_with_convert(1).to_orig) + + assert_equal(Time.utc(2038, 1, 19, 3, 14, 7, 892000), TimeOrDateTime.new(Time.utc(2038, 1, 19, 3, 14, 6, 892000)).add_with_convert(1).to_orig) + end + end + + def test_wrap_time + t = TimeOrDateTime.wrap(Time.utc(2006, 3, 24, 15, 32, 3)) + assert_instance_of(TimeOrDateTime, t) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), t.to_orig) + end + + def test_wrap_datetime + t = TimeOrDateTime.wrap(DateTime.new(2006, 3, 24, 15, 32, 3)) + assert_instance_of(TimeOrDateTime, t) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), t.to_orig) + end + + def test_wrap_timestamp + t = TimeOrDateTime.wrap(1143214323) + assert_instance_of(TimeOrDateTime, t) + assert_equal(1143214323, t.to_orig) + end + + def test_wrap_timestamp_str + t = TimeOrDateTime.wrap('1143214323') + assert_instance_of(TimeOrDateTime, t) + assert_equal(1143214323, t.to_orig) + end + + def test_wrap_timeordatetime + t = TimeOrDateTime.new(1143214323) + t2 = TimeOrDateTime.wrap(t) + assert_same(t, t2) + end + + def test_wrap_block_time + assert_equal(Time.utc(2006, 3, 24, 15, 32, 4), TimeOrDateTime.wrap(Time.utc(2006, 3, 24, 15, 32, 3)) {|t| + assert_instance_of(TimeOrDateTime, t) + assert_equal(Time.utc(2006, 3, 24, 15, 32, 3), t.to_orig) + t + 1 + }) + end + + def test_wrap_block_datetime + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 4), TimeOrDateTime.wrap(DateTime.new(2006, 3, 24, 15, 32, 3)) {|t| + assert_instance_of(TimeOrDateTime, t) + assert_equal(DateTime.new(2006, 3, 24, 15, 32, 3), t.to_orig) + t + 1 + }) + end + + def test_wrap_block_timestamp + assert_equal(1143214324, TimeOrDateTime.wrap(1143214323) {|t| + assert_instance_of(TimeOrDateTime, t) + assert_equal(1143214323, t.to_orig) + t + 1 + }) + end + + def test_wrap_block_timestamp_str + assert_equal(1143214324, TimeOrDateTime.wrap('1143214323') {|t| + assert_instance_of(TimeOrDateTime, t) + assert_equal(1143214323, t.to_orig) + t + 1 + }) + end + + def test_wrap_block_timeordatetime + t1 = TimeOrDateTime.new(1143214323) + + t2 = TimeOrDateTime.wrap(t1) {|t| + assert_same(t1, t) + t + 1 + } + + assert t2 + assert_instance_of(TimeOrDateTime, t2) + assert_equal(1143214324, t2.to_orig) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone.rb new file mode 100644 index 000000000000..0dc06111243f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone.rb @@ -0,0 +1,1361 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +# Use send as a workaround for erroneous 'wrong number of arguments' errors with +# JRuby 9.0.5.0 when calling methods with Java implementations. See #114. +send(:using, TaintExt) if Module.const_defined?(:TaintExt) + +class TCTimezone < Minitest::Test + + class BlockCalled < StandardError + end + + class TestTimezone < Timezone + def self.new(identifier, period_for_utc = nil, periods_for_local = nil, expected = nil) + t = super() + t.send(:setup, identifier, period_for_utc, periods_for_local, expected) + t + end + + def identifier + @identifier + end + + def period_for_utc(utc) + utc = TimeOrDateTime.wrap(utc) + raise "Unexpected utc #{utc} in period_for_utc" unless @expected.eql?(utc) + @period_for_utc + end + + def periods_for_local(local) + local = TimeOrDateTime.wrap(local) + raise "Unexpected local #{local} in periods_for_local" unless @expected.eql?(local) + @periods_for_local.clone + end + + def transitions_up_to(utc_to, utc_from = nil) + raise 'transitions_up_to called' + end + + private + def setup(identifier, period_for_utc, periods_for_local, expected) + @identifier = identifier + @period_for_utc = period_for_utc + @periods_for_local = periods_for_local || [] + @expected = TimeOrDateTime.wrap(expected) + end + end + + class OffsetsUpToTestTimezone < Timezone + def self.new(identifier, expected_utc_to, expected_utc_from, transitions_up_to) + t = super() + t.send(:setup, identifier, expected_utc_to, expected_utc_from, transitions_up_to) + t + end + + def identifier + @identifier + end + + def period_for_utc(utc) + raise 'period_for_utc called' + end + + def periods_for_local(local) + raise 'periods_for_local called' + end + + def transitions_up_to(utc_to, utc_from = nil) + utc_to = TimeOrDateTime.wrap(utc_to) + raise "Unexpected utc_to #{utc_to || 'nil'} in transitions_up_to" unless @expected_utc_to.eql?(utc_to) + + utc_from = utc_from ? TimeOrDateTime.wrap(utc_from) : nil + raise "Unexpected utc_from #{utc_from || 'nil'} in transitions_up_to" unless @expected_utc_from.eql?(utc_from) + + if utc_from && utc_to <= utc_from + raise ArgumentError, 'utc_to must be greater than utc_from' + end + + @transitions_up_to + end + + private + + def setup(identifier, expected_utc_to, expected_utc_from, transitions_up_to) + @identifier = identifier + @expected_utc_to = TimeOrDateTime.wrap(expected_utc_to) + @expected_utc_from = expected_utc_from ? TimeOrDateTime.wrap(expected_utc_from) : nil + @transitions_up_to = transitions_up_to + end + end + + class OffsetsUpToNoTransitionsTestTimezone < Timezone + def self.new(identifier, expected_utc_to, expected_utc_from, period_for_utc) + t = super() + t.send(:setup, identifier, expected_utc_to, expected_utc_from, period_for_utc) + t + end + + def identifier + @identifier + end + + def period_for_utc(utc) + utc = TimeOrDateTime.wrap(utc) + + raise "Unexpected utc #{utc} in period_for_utc (should be utc_from)" if @expected_utc_from && !@expected_utc_from.eql?(utc) + raise "Unexpected utc #{utc} in period_for_utc (should be < utc_to)" if !@expected_utc_from && @expected_utc_to <= utc + + @period_for_utc + end + + def periods_for_local(local) + raise 'periods_for_local called' + end + + def transitions_up_to(utc_to, utc_from = nil) + utc_to = TimeOrDateTime.wrap(utc_to) + raise "Unexpected utc_to #{utc_to || 'nil'} in transitions_up_to" unless @expected_utc_to.eql?(utc_to) + + utc_from = utc_from ? TimeOrDateTime.wrap(utc_from) : nil + raise "Unexpected utc_from #{utc_from || 'nil'} in transitions_up_to" unless @expected_utc_from.eql?(utc_from) + + if utc_from && utc_to <= utc_from + raise ArgumentError, 'utc_to must be greater than utc_from' + end + + [] + end + + private + + def setup(identifier, expected_utc_to, expected_utc_from, period_for_utc) + @identifier = identifier + @expected_utc_to = TimeOrDateTime.wrap(expected_utc_to) + @expected_utc_from = expected_utc_from ? TimeOrDateTime.wrap(expected_utc_from) : nil + @period_for_utc = period_for_utc + end + end + + class TestTimezoneTransition < TimezoneTransition + def initialize(offset, previous_offset, at) + super(offset, previous_offset) + @at = TimeOrDateTime.wrap(at) + end + + def at + @at + end + end + + def setup + @orig_default_dst = Timezone.default_dst + @orig_data_source = DataSource.get + Timezone.send :init_loaded_zones + end + + def teardown + Timezone.default_dst = @orig_default_dst + DataSource.set(@orig_data_source) + end + + def test_default_dst_initial_value + assert_nil(Timezone.default_dst) + end + + def test_set_default_dst + Timezone.default_dst = true + assert_equal(true, Timezone.default_dst) + Timezone.default_dst = false + assert_equal(false, Timezone.default_dst) + Timezone.default_dst = nil + assert_nil(Timezone.default_dst) + Timezone.default_dst = 0 + assert_equal(true, Timezone.default_dst) + end + + def test_get_valid_1 + tz = Timezone.get('Europe/London') + + assert_kind_of(DataTimezone, tz) + assert_equal('Europe/London', tz.identifier) + end + + def test_get_valid_2 + tz = Timezone.get('UTC') + + # ZoneinfoDataSource doesn't return LinkedTimezoneInfo for any timezone. + if DataSource.get.load_timezone_info('UTC').kind_of?(LinkedTimezoneInfo) + assert_kind_of(LinkedTimezone, tz) + else + assert_kind_of(DataTimezone, tz) + end + + assert_equal('UTC', tz.identifier) + end + + def test_get_valid_3 + tz = Timezone.get('America/Argentina/Buenos_Aires') + + assert_kind_of(DataTimezone, tz) + assert_equal('America/Argentina/Buenos_Aires', tz.identifier) + end + + def test_get_same_instance + tz1 = Timezone.get('Europe/London') + tz2 = Timezone.get('Europe/London') + assert_same(tz1, tz2) + end + + def test_get_not_exist + assert_raises(InvalidTimezoneIdentifier) { Timezone.get('Nowhere/Special') } + end + + def test_get_invalid + assert_raises(InvalidTimezoneIdentifier) { Timezone.get('../Definitions/UTC') } + end + + def test_get_nil + assert_raises(InvalidTimezoneIdentifier) { Timezone.get(nil) } + end + + def test_get_case + Timezone.get('Europe/Prague') + assert_raises(InvalidTimezoneIdentifier) { Timezone.get('Europe/prague') } + end + + def test_get_proxy_valid + proxy = Timezone.get_proxy('Europe/London') + assert_kind_of(TimezoneProxy, proxy) + assert_equal('Europe/London', proxy.identifier) + end + + def test_get_proxy_not_exist + proxy = Timezone.get_proxy('Not/There') + assert_kind_of(TimezoneProxy, proxy) + assert_equal('Not/There', proxy.identifier) + end + + def test_get_proxy_invalid + proxy = Timezone.get_proxy('../Invalid/Identifier') + assert_kind_of(TimezoneProxy, proxy) + assert_equal('../Invalid/Identifier', proxy.identifier) + end + + def test_get_tainted_loaded + Timezone.get('Europe/Andorra') + + safe_test(:unavailable => :skip) do + identifier = 'Europe/Andorra'.dup.taint + assert(identifier.tainted?) + tz = Timezone.get(identifier) + assert_equal('Europe/Andorra', tz.identifier) + assert(identifier.tainted?) + end + end + + def test_get_tainted_and_frozen_loaded + Timezone.get('Europe/Andorra') + + safe_test do + tz = Timezone.get('Europe/Andorra'.dup.taint.freeze) + assert_equal('Europe/Andorra', tz.identifier) + end + end + + def test_get_tainted_not_previously_loaded + skip_if_has_bug_14060 + + safe_test(:unavailable => :skip) do + identifier = 'Europe/Andorra'.dup.taint + assert(identifier.tainted?) + tz = Timezone.get(identifier) + assert_equal('Europe/Andorra', tz.identifier) + assert(identifier.tainted?) + end + end + + def test_get_tainted_and_frozen_not_previously_loaded + skip_if_has_bug_14060 + + safe_test do + tz = Timezone.get('Europe/Amsterdam'.dup.taint.freeze) + assert_equal('Europe/Amsterdam', tz.identifier) + end + end + + def test_new_no_args + tz = Timezone.new + + assert_raises(UnknownTimezone) { tz.identifier } + assert_raises(UnknownTimezone) { tz.friendly_identifier } + assert_raises(UnknownTimezone) { tz.utc_to_local(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.local_to_utc(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.period_for_utc(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.periods_for_local(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.period_for_local(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.now } + assert_raises(UnknownTimezone) { tz.current_period_and_time } + assert_raises(UnknownTimezone) { tz.transitions_up_to(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.canonical_identifier } + assert_raises(UnknownTimezone) { tz.canonical_zone } + end + + def test_new_nil + tz = Timezone.new(nil) + + assert_raises(UnknownTimezone) { tz.identifier } + assert_raises(UnknownTimezone) { tz.friendly_identifier } + assert_raises(UnknownTimezone) { tz.utc_to_local(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.local_to_utc(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.period_for_utc(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.periods_for_local(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.period_for_local(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.now } + assert_raises(UnknownTimezone) { tz.current_period_and_time } + assert_raises(UnknownTimezone) { tz.transitions_up_to(DateTime.new(2006,1,1,1,0,0)) } + assert_raises(UnknownTimezone) { tz.canonical_identifier } + assert_raises(UnknownTimezone) { tz.canonical_zone } + end + + def test_new_arg + tz = Timezone.new('Europe/London') + assert_same(Timezone.get('Europe/London'), tz) + end + + def test_new_arg_not_exist + assert_raises(InvalidTimezoneIdentifier) { Timezone.new('Nowhere/Special') } + end + + def test_all + all = Timezone.all + expected = DataSource.get.timezone_identifiers.collect {|identifier| Timezone.get_proxy(identifier)} + assert_equal(expected, all) + end + + def test_all_identifiers + all = Timezone.all_identifiers + assert_equal(DataSource.get.timezone_identifiers, all) + end + + def test_all_data_zones + all_data = Timezone.all_data_zones + expected = DataSource.get.data_timezone_identifiers.collect {|identifier| Timezone.get_proxy(identifier)} + assert_equal(expected, all_data) + end + + def test_all_data_zone_identifiers + all_data = Timezone.all_data_zone_identifiers + assert_equal(DataSource.get.data_timezone_identifiers, all_data) + end + + def test_all_linked_zones + all_linked = Timezone.all_linked_zones + expected = DataSource.get.linked_timezone_identifiers.collect {|identifier| Timezone.get_proxy(identifier)} + assert_equal(expected, all_linked) + end + + def test_all_linked_zone_identifiers + all_linked = Timezone.all_linked_zone_identifiers + assert_equal(DataSource.get.linked_timezone_identifiers, all_linked) + end + + def test_all_country_zones + # Probably should relax this test - just need all the zones, don't care + # about order. + expected = Country.all.inject([]) {|result,country| + result += country.zones + } + expected.uniq! + + all_country_zones = Timezone.all_country_zones + assert_equal(expected, all_country_zones) + + all_country_zone_identifiers = Timezone.all_country_zone_identifiers + assert_equal(all_country_zone_identifiers.length, all_country_zones.length) + + all_country_zones.each {|zone| + assert_kind_of(TimezoneProxy, zone) + assert(all_country_zone_identifiers.include?(zone.identifier)) + } + end + + def test_all_country_zone_identifiers + # Probably should relax this test - just need all the zones, don't care + # about order. + expected = Country.all.inject([]) {|result,country| + result += country.zone_identifiers + } + expected.uniq! + + assert_equal(expected, Timezone.all_country_zone_identifiers) + end + + def test_us_zones + # Probably should relax this test - just need all the zones, don't care + # about order. + us_zones = Timezone.us_zones + assert_equal(Country.get('US').zones.uniq, us_zones) + + us_zone_identifiers = Timezone.us_zone_identifiers + assert_equal(us_zone_identifiers.length, us_zones.length) + + us_zones.each {|zone| + assert_kind_of(TimezoneProxy, zone) + assert(us_zone_identifiers.include?(zone.identifier)) + } + end + + def test_us_zone_identifiers + # Probably should relax this test - just need all the zones, don't care + # about order. + assert_equal(Country.get('US').zone_identifiers.uniq, Timezone.us_zone_identifiers) + end + + def test_identifier + assert_raises(UnknownTimezone) { Timezone.new.identifier } + assert_equal('Europe/Paris', TestTimezone.new('Europe/Paris').identifier) + end + + def test_name + assert_raises(UnknownTimezone) { Timezone.new.name } + assert_equal('Europe/Paris', TestTimezone.new('Europe/Paris').name) + end + + def test_friendly_identifier + assert_equal('Paris', TestTimezone.new('Europe/Paris').friendly_identifier(true)) + assert_equal('Europe - Paris', TestTimezone.new('Europe/Paris').friendly_identifier(false)) + assert_equal('Europe - Paris', TestTimezone.new('Europe/Paris').friendly_identifier) + assert_equal('Knox, Indiana', TestTimezone.new('America/Indiana/Knox').friendly_identifier(true)) + assert_equal('America - Knox, Indiana', TestTimezone.new('America/Indiana/Knox').friendly_identifier(false)) + assert_equal('America - Knox, Indiana', TestTimezone.new('America/Indiana/Knox').friendly_identifier) + assert_equal('Dumont D\'Urville', TestTimezone.new('Antarctica/DumontDUrville').friendly_identifier(true)) + assert_equal('Antarctica - Dumont D\'Urville', TestTimezone.new('Antarctica/DumontDUrville').friendly_identifier(false)) + assert_equal('Antarctica - Dumont D\'Urville', TestTimezone.new('Antarctica/DumontDUrville').friendly_identifier) + assert_equal('McMurdo', TestTimezone.new('Antarctica/McMurdo').friendly_identifier(true)) + assert_equal('Antarctica - McMurdo', TestTimezone.new('Antarctica/McMurdo').friendly_identifier(false)) + assert_equal('Antarctica - McMurdo', TestTimezone.new('Antarctica/McMurdo').friendly_identifier) + assert_equal('GMT+1', TestTimezone.new('Etc/GMT+1').friendly_identifier(true)) + assert_equal('Etc - GMT+1', TestTimezone.new('Etc/GMT+1').friendly_identifier(false)) + assert_equal('Etc - GMT+1', TestTimezone.new('Etc/GMT+1').friendly_identifier) + assert_equal('UTC', TestTimezone.new('UTC').friendly_identifier(true)) + assert_equal('UTC', TestTimezone.new('UTC').friendly_identifier(false)) + assert_equal('UTC', TestTimezone.new('UTC').friendly_identifier) + end + + if defined?(Encoding) + def test_friendly_identifier_non_binary_encoding + refute_equal(Encoding::ASCII_8BIT, TestTimezone.new('Europe/Paris').friendly_identifier(true).encoding) + refute_equal(Encoding::ASCII_8BIT, TestTimezone.new('Europe/Paris').friendly_identifier(false).encoding) + end + end + + def test_to_s + assert_equal('Europe - Paris', TestTimezone.new('Europe/Paris').to_s) + assert_equal('America - Knox, Indiana', TestTimezone.new('America/Indiana/Knox').to_s) + assert_equal('Antarctica - Dumont D\'Urville', TestTimezone.new('Antarctica/DumontDUrville').to_s) + assert_equal('Antarctica - McMurdo', TestTimezone.new('Antarctica/McMurdo').to_s) + assert_equal('Etc - GMT+1', TestTimezone.new('Etc/GMT+1').to_s) + assert_equal('UTC', TestTimezone.new('UTC').to_s) + end + + def test_period_for_local + dt = DateTime.new(2005,2,18,16,24,23) + dt2 = DateTime.new(2005,2,18,16,24,23).new_offset(Rational(5,24)) + dt3 = DateTime.new(2005,2,18,16,24,23 + Rational(789, 1000)) + t = Time.utc(2005,2,18,16,24,23) + t2 = Time.local(2005,2,18,16,24,23) + t3 = Time.utc(2005,2,18,16,24,23,789000) + ts = t.to_i + + o1 = TimezoneOffset.new(0, 0, :GMT) + o2 = TimezoneOffset.new(0, 3600, :BST) + + period = TimezonePeriod.new( + TestTimezoneTransition.new(o1, o2, 1099184400), + TestTimezoneTransition.new(o2, o1, 1111885200)) + + dt_period = TestTimezone.new('Europe/London', nil, [period], dt).period_for_local(dt) + dt2_period = TestTimezone.new('Europe/London', nil, [period], dt2).period_for_local(dt2) + dt3_period = TestTimezone.new('Europe/London', nil, [period], dt3).period_for_local(dt3) + t_period = TestTimezone.new('Europe/London', nil, [period], t).period_for_local(t) + t2_period = TestTimezone.new('Europe/London', nil, [period], t2).period_for_local(t2) + t3_period = TestTimezone.new('Europe/London', nil, [period], t3).period_for_local(t3) + ts_period = TestTimezone.new('Europe/London', nil, [period], ts).period_for_local(ts) + + assert_equal(period, dt_period) + assert_equal(period, dt2_period) + assert_equal(period, dt3_period) + assert_equal(period, t_period) + assert_equal(period, t2_period) + assert_equal(period, t3_period) + assert_equal(period, ts_period) + end + + def test_period_for_local_invalid + dt = DateTime.new(2004,4,4,2,30,0) + tz = TestTimezone.new('America/New_York', nil, [], dt) + + assert_raises(PeriodNotFound) do + tz.period_for_local(dt) + end + end + + def test_period_for_local_ambiguous + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,0,0) + dt2 = DateTime.new(2004,10,31,1,0,Rational(555,1000)) + t = Time.utc(2004,10,31,1,30,0) + t2 = Time.utc(2004,10,31,1,30,0,555000) + i = Time.utc(2004,10,31,1,59,59).to_i + + dt_tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + dt2_tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt2) + t_tz = TestTimezone.new('America/New_York', nil, [p1, p2], t) + t2_tz = TestTimezone.new('America/New_York', nil, [p1, p2], t2) + i_tz = TestTimezone.new('America/New_York', nil, [p1, p2], i) + + assert_raises(AmbiguousTime) { dt_tz.period_for_local(dt) } + assert_raises(AmbiguousTime) { dt2_tz.period_for_local(dt2) } + assert_raises(AmbiguousTime) { t_tz.period_for_local(t) } + assert_raises(AmbiguousTime) { t2_tz.period_for_local(t2) } + assert_raises(AmbiguousTime) { i_tz.period_for_local(i) } + end + + def test_period_for_local_not_found + dt = DateTime.new(2004,4,4,2,0,0) + dt2 = DateTime.new(2004,4,4,2,0,Rational(987,1000)) + t = Time.utc(2004,4,4,2,30,0) + t2 = Time.utc(2004,4,4,2,30,0,987000) + i = Time.utc(2004,4,4,2,59,59).to_i + + dt_tz = TestTimezone.new('America/New_York', nil, [], dt) + dt2_tz = TestTimezone.new('America/New_York', nil, [], dt2) + t_tz = TestTimezone.new('America/New_York', nil, [], t) + t2_tz = TestTimezone.new('America/New_York', nil, [], t2) + i_tz = TestTimezone.new('America/New_York', nil, [], i) + + assert_raises(PeriodNotFound) { dt_tz.period_for_local(dt) } + assert_raises(PeriodNotFound) { dt2_tz.period_for_local(dt2) } + assert_raises(PeriodNotFound) { t_tz.period_for_local(t) } + assert_raises(PeriodNotFound) { t2_tz.period_for_local(t2) } + assert_raises(PeriodNotFound) { i_tz.period_for_local(i) } + end + + def test_period_for_local_default_dst_set_true + Timezone.default_dst = true + + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_equal(p1, tz.period_for_local(dt)) + assert_equal(p1, tz.period_for_local(dt, true)) + assert_equal(p2, tz.period_for_local(dt, false)) + assert_raises(AmbiguousTime) { tz.period_for_local(dt, nil) } + end + + def test_period_for_local_default_dst_set_false + Timezone.default_dst = false + + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_equal(p2, tz.period_for_local(dt)) + assert_equal(p1, tz.period_for_local(dt, true)) + assert_equal(p2, tz.period_for_local(dt, false)) + assert_raises(AmbiguousTime) { tz.period_for_local(dt, nil) } + end + + def test_period_for_local_dst_flag_resolved + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_equal(p1, tz.period_for_local(dt, true)) + assert_equal(p2, tz.period_for_local(dt, false)) + assert_equal(p1, tz.period_for_local(dt, true) {|periods| raise BlockCalled, 'should not be called' }) + assert_equal(p2, tz.period_for_local(dt, false) {|periods| raise BlockCalled, 'should not be called' }) + end + + def test_period_for_local_dst_block_called + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_raises(BlockCalled) { + tz.period_for_local(dt) {|periods| + assert_equal([p1, p2], periods) + + # raise exception to test that the block was called + raise BlockCalled, 'should be raised' + } + } + + assert_equal(p1, tz.period_for_local(dt) {|periods| periods.first}) + assert_equal(p2, tz.period_for_local(dt) {|periods| periods.last}) + assert_equal(p1, tz.period_for_local(dt) {|periods| [periods.first]}) + assert_equal(p2, tz.period_for_local(dt) {|periods| [periods.last]}) + end + + def test_period_for_local_dst_cannot_resolve + # At midnight local time on Aug 5 1915 in Warsaw, the clocks were put back + # 24 minutes and both periods were non-DST. Hence the block should be + # called regardless of the value of the Boolean dst parameter. + + o0 = TimezoneOffset.new(5040, 0, :LMT) + o1 = TimezoneOffset.new(5040, 0, :WMT) + o2 = TimezoneOffset.new(3600, 0, :CET) + o3 = TimezoneOffset.new(3600, 3600, :CEST) + + t1 = TestTimezoneTransition.new(o1, o0, DateTime.new(1879, 12, 31, 22, 36, 0)) + t2 = TestTimezoneTransition.new(o2, o1, DateTime.new(1915, 8, 4, 22, 36, 0)) + t3 = TestTimezoneTransition.new(o3, o2, DateTime.new(1916, 4, 30, 22, 0, 0)) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(1915,8,4,23,40,0) + + tz = TestTimezone.new('Europe/Warsaw', nil, [p1, p2], dt) + + assert_raises(BlockCalled) { + tz.period_for_local(dt, true) {|periods| + assert_equal([p1, p2], periods) + raise BlockCalled, 'should be raised' + } + } + + assert_raises(BlockCalled) { + tz.period_for_local(dt, false) {|periods| + assert_equal([p1, p2], periods) + raise BlockCalled, 'should be raised' + } + } + end + + def test_period_for_local_block_ambiguous + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_raises(AmbiguousTime) do + tz.period_for_local(dt) {|periods| nil} + end + + assert_raises(AmbiguousTime) do + tz.period_for_local(dt) {|periods| periods} + end + + assert_raises(AmbiguousTime) do + tz.period_for_local(dt) {|periods| []} + end + + assert_raises(AmbiguousTime) do + tz.period_for_local(dt) {|periods| raise AmbiguousTime, 'Ambiguous time'} + end + end + + def test_utc_to_local + dt = DateTime.new(2005,6,18,16,24,23) + dt2 = DateTime.new(2005,6,18,16,24,23).new_offset(Rational(5,24)) + dtu = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)) + dtu2 = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)).new_offset(Rational(5,24)) + t = Time.utc(2005,6,18,16,24,23) + t2 = Time.local(2005,6,18,16,24,23) + tu = Time.utc(2005,6,18,16,24,23,567000) + tu2 = Time.local(2005,6,18,16,24,23,567000) + ts = t.to_i + + o1 = TimezoneOffset.new(0, 0, :GMT) + o2 = TimezoneOffset.new(0, 3600, :BST) + + period = TimezonePeriod.new( + TestTimezoneTransition.new(o2, o1, 1111885200), + TestTimezoneTransition.new(o1, o2, 1130634000)) + + assert_equal(DateTime.new(2005,6,18,17,24,23), TestTimezone.new('Europe/London', period, [], dt).utc_to_local(dt)) + assert_equal(DateTime.new(2005,6,18,17,24,23), TestTimezone.new('Europe/London', period, [], dt2).utc_to_local(dt2)) + assert_equal(DateTime.new(2005,6,18,17,24,23 + Rational(567,1000)), TestTimezone.new('Europe/London', period, [], dtu).utc_to_local(dtu)) + assert_equal(DateTime.new(2005,6,18,17,24,23 + Rational(567,1000)), TestTimezone.new('Europe/London', period, [], dtu2).utc_to_local(dtu2)) + assert_equal(Time.utc(2005,6,18,17,24,23), TestTimezone.new('Europe/London', period, [], t).utc_to_local(t)) + assert_equal(Time.utc(2005,6,18,17,24,23), TestTimezone.new('Europe/London', period, [], t2).utc_to_local(t2)) + assert_equal(Time.utc(2005,6,18,17,24,23,567000), TestTimezone.new('Europe/London', period, [], tu).utc_to_local(tu)) + assert_equal(Time.utc(2005,6,18,17,24,23,567000), TestTimezone.new('Europe/London', period, [], tu2).utc_to_local(tu2)) + assert_equal(Time.utc(2005,6,18,17,24,23).to_i, TestTimezone.new('Europe/London', period, [], ts).utc_to_local(ts)) + end + + def test_utc_to_local_offset + dt = DateTime.new(2005,6,18,16,24,23) + dt2 = DateTime.new(2005,6,18,16,24,23).new_offset(Rational(5,24)) + dtu = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)) + dtu2 = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)).new_offset(Rational(5,24)) + t = Time.utc(2005,6,18,16,24,23) + t2 = Time.local(2005,6,18,16,24,23) + tu = Time.utc(2005,6,18,16,24,23,567000) + tu2 = Time.local(2005,6,18,16,24,23,567000) + + o1 = TimezoneOffset.new(0, 0, :GMT) + o2 = TimezoneOffset.new(0, 3600, :BST) + + period = TimezonePeriod.new( + TestTimezoneTransition.new(o2, o1, 1111885200), + TestTimezoneTransition.new(o1, o2, 1130634000)) + + assert_equal(0, TestTimezone.new('Europe/London', period, [], dt).utc_to_local(dt).offset) + assert_equal(0, TestTimezone.new('Europe/London', period, [], dt2).utc_to_local(dt2).offset) + assert_equal(0, TestTimezone.new('Europe/London', period, [], dtu).utc_to_local(dtu).offset) + assert_equal(0, TestTimezone.new('Europe/London', period, [], dtu2).utc_to_local(dtu2).offset) + assert_equal(0, TestTimezone.new('Europe/London', period, [], t).utc_to_local(t).utc_offset) + assert(TestTimezone.new('Europe/London', period, [], t).utc_to_local(t).utc?) + assert_equal(0, TestTimezone.new('Europe/London', period, [], t2).utc_to_local(t2).utc_offset) + assert(TestTimezone.new('Europe/London', period, [], t2).utc_to_local(t2).utc?) + assert_equal(0, TestTimezone.new('Europe/London', period, [], tu).utc_to_local(tu).utc_offset) + assert(TestTimezone.new('Europe/London', period, [], tu).utc_to_local(tu).utc?) + assert_equal(0, TestTimezone.new('Europe/London', period, [], tu2).utc_to_local(tu2).utc_offset) + assert(TestTimezone.new('Europe/London', period, [], tu2).utc_to_local(tu2).utc?) + end + + def test_local_to_utc + dt = DateTime.new(2005,6,18,16,24,23) + dt2 = DateTime.new(2005,6,18,16,24,23).new_offset(Rational(5, 24)) + dtu = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)) + dtu2 = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)).new_offset(Rational(5, 24)) + t = Time.utc(2005,6,18,16,24,23) + t2 = Time.local(2005,6,18,16,24,23) + tu = Time.utc(2005,6,18,16,24,23,567000) + tu2 = Time.local(2005,6,18,16,24,23,567000) + ts = t.to_i + + o1 = TimezoneOffset.new(0, 0, :GMT) + o2 = TimezoneOffset.new(0, 3600, :BST) + + period = TimezonePeriod.new( + TestTimezoneTransition.new(o2, o1, 1111885200), + TestTimezoneTransition.new(o1, o2, 1130634000)) + + assert_equal(DateTime.new(2005,6,18,15,24,23), TestTimezone.new('Europe/London', nil, [period], dt).local_to_utc(dt)) + assert_equal(DateTime.new(2005,6,18,15,24,23), TestTimezone.new('Europe/London', nil, [period], dt2).local_to_utc(dt2)) + assert_equal(DateTime.new(2005,6,18,15,24,23 + Rational(567,1000)), TestTimezone.new('Europe/London', nil, [period], dtu).local_to_utc(dtu)) + assert_equal(DateTime.new(2005,6,18,15,24,23 + Rational(567,1000)), TestTimezone.new('Europe/London', nil, [period], dtu2).local_to_utc(dtu2)) + assert_equal(Time.utc(2005,6,18,15,24,23), TestTimezone.new('Europe/London', nil, [period], t).local_to_utc(t)) + assert_equal(Time.utc(2005,6,18,15,24,23), TestTimezone.new('Europe/London', nil, [period], t2).local_to_utc(t2)) + assert_equal(Time.utc(2005,6,18,15,24,23,567000), TestTimezone.new('Europe/London', nil, [period], tu).local_to_utc(tu)) + assert_equal(Time.utc(2005,6,18,15,24,23,567000), TestTimezone.new('Europe/London', nil, [period], tu2).local_to_utc(tu2)) + assert_equal(Time.utc(2005,6,18,15,24,23).to_i, TestTimezone.new('Europe/London', nil, [period], ts).local_to_utc(ts)) + end + + def test_local_to_utc_offset + dt = DateTime.new(2005,6,18,16,24,23) + dt2 = DateTime.new(2005,6,18,16,24,23).new_offset(Rational(5, 24)) + dtu = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)) + dtu2 = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)).new_offset(Rational(5, 24)) + t = Time.utc(2005,6,18,16,24,23) + t2 = Time.local(2005,6,18,16,24,23) + tu = Time.utc(2005,6,18,16,24,23,567000) + tu2 = Time.local(2005,6,18,16,24,23,567000) + + o1 = TimezoneOffset.new(0, 0, :GMT) + o2 = TimezoneOffset.new(0, 3600, :BST) + + period = TimezonePeriod.new( + TestTimezoneTransition.new(o2, o1, 1111885200), + TestTimezoneTransition.new(o1, o2, 1130634000)) + + assert_equal(0, TestTimezone.new('Europe/London', nil, [period], dt).local_to_utc(dt).offset) + assert_equal(0, TestTimezone.new('Europe/London', nil, [period], dt2).local_to_utc(dt2).offset) + assert_equal(0, TestTimezone.new('Europe/London', nil, [period], dtu).local_to_utc(dtu).offset) + assert_equal(0, TestTimezone.new('Europe/London', nil, [period], dtu2).local_to_utc(dtu2).offset) + assert_equal(0, TestTimezone.new('Europe/London', nil, [period], t).local_to_utc(t).utc_offset) + assert(TestTimezone.new('Europe/London', nil, [period], t).local_to_utc(t).utc?) + assert_equal(0, TestTimezone.new('Europe/London', nil, [period], t2).local_to_utc(t2).utc_offset) + assert(TestTimezone.new('Europe/London', nil, [period], t2).local_to_utc(t2).utc?) + assert_equal(0, TestTimezone.new('Europe/London', nil, [period], tu).local_to_utc(tu).utc_offset) + assert(TestTimezone.new('Europe/London', nil, [period], tu).local_to_utc(tu).utc?) + assert_equal(0, TestTimezone.new('Europe/London', nil, [period], tu2).local_to_utc(tu2).utc_offset) + assert(TestTimezone.new('Europe/London', nil, [period], tu2).local_to_utc(tu2).utc?) + end + + def test_local_to_utc_utc_local_returns_utc + # Check that UTC time instances are always returned even if the system + # is using UTC as the time zone. + + # Note that this will only test will only work correctly on platforms where + # setting the TZ environment variable has an effect. If setting TZ has no + # effect, then this test will still pass. + + old_tz = ENV['TZ'] + begin + ENV['TZ'] = 'UTC' + + tz = Timezone.get('America/New_York') + + t = tz.local_to_utc(Time.local(2014, 1, 11, 17, 18, 41)) + assert_equal(Time.utc(2014, 1, 11, 22, 18, 41), t) + assert(t.utc?) + ensure + ENV['TZ'] = old_tz + end + end + + def test_local_to_utc_invalid + dt = DateTime.new(2004,4,4,2,30,0) + tz = TestTimezone.new('America/New_York', nil, [], dt) + assert_raises(PeriodNotFound) { tz.local_to_utc(dt) } + + t = Time.utc(2004,4,4,2,30,0) + tz = TestTimezone.new('America/New_York', nil, [], t) + assert_raises(PeriodNotFound) { tz.local_to_utc(t) } + + i = Time.utc(2004,4,4,2,30,0).to_i + tz = TestTimezone.new('America/New_York', nil, [], i) + assert_raises(PeriodNotFound) { tz.local_to_utc(i) } + end + + def test_local_to_utc_ambiguous + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + assert_raises(AmbiguousTime) { tz.local_to_utc(dt) } + + t = Time.utc(2004,10,31,1,30,0) + tz = TestTimezone.new('America/New_York', nil, [p1, p2], t) + assert_raises(AmbiguousTime) { tz.local_to_utc(t) } + + i = Time.utc(2004,10,31,1,30,0).to_i + tz = TestTimezone.new('America/New_York', nil, [p1, p2], i) + assert_raises(AmbiguousTime) { tz.local_to_utc(i) } + + f = Time.utc(2004,10,31,1,30,0,501).to_i + tz = TestTimezone.new('America/New_York', nil, [p1, p2], f) + assert_raises(AmbiguousTime) { tz.local_to_utc(f) } + end + + def test_local_to_utc_not_found + dt = DateTime.new(2004,4,4,2,0,0) + t = Time.utc(2004,4,4,2,30,0) + i = Time.utc(2004,4,4,2,59,59).to_i + + dt_tz = TestTimezone.new('America/New_York', nil, [], dt) + t_tz = TestTimezone.new('America/New_York', nil, [], t) + i_tz = TestTimezone.new('America/New_York', nil, [], i) + + assert_raises(PeriodNotFound) { dt_tz.local_to_utc(dt) } + assert_raises(PeriodNotFound) { t_tz.local_to_utc(t) } + assert_raises(PeriodNotFound) { i_tz.local_to_utc(i) } + end + + def test_local_to_utc_default_dst_set_true + Timezone.default_dst = true + + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt)) + assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt, true)) + assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt, false)) + assert_raises(AmbiguousTime) { tz.local_to_utc(dt, nil) } + assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt) {|periods| raise BlockCalled, 'should not be called' }) + end + + def test_local_to_utc_default_dst_set_false + Timezone.default_dst = false + + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt)) + assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt, false)) + assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt, true)) + assert_raises(AmbiguousTime) { tz.local_to_utc(dt, nil) } + assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt) {|periods| raise BlockCalled, 'should not be called' }) + end + + def test_local_to_utc_dst_flag_resolved + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt, true)) + assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt, false)) + assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt, true) {|periods| raise BlockCalled, 'should not be called' }) + assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt, false) {|periods| raise BlockCalled, 'should not be called' }) + end + + def test_local_to_utc_dst_block_called + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_raises(BlockCalled) { + tz.local_to_utc(dt) {|periods| + assert_equal([p1, p2], periods) + + # raise exception to test that the block was called + raise BlockCalled, 'should be raised' + } + } + + assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt) {|periods| periods.first}) + assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt) {|periods| periods.last}) + assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt) {|periods| [periods.first]}) + assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt) {|periods| [periods.last]}) + end + + def test_local_to_utc_dst_cannot_resolve + # At midnight local time on Aug 5 1915 in Warsaw, the clocks were put back + # 24 minutes and both periods were non-DST. Hence the block should be + # called regardless of the value of the Boolean dst parameter. + + o0 = TimezoneOffset.new(5040, 0, :LMT) + o1 = TimezoneOffset.new(5040, 0, :WMT) + o2 = TimezoneOffset.new(3600, 0, :CET) + o3 = TimezoneOffset.new(3600, 3600, :CEST) + + t1 = TestTimezoneTransition.new(o1, o0, DateTime.new(1879, 12, 31, 22, 36, 0)) + t2 = TestTimezoneTransition.new(o2, o1, DateTime.new(1915, 8, 4, 22, 36, 0)) + t3 = TestTimezoneTransition.new(o3, o2, DateTime.new(1916, 4, 30, 22, 0, 0)) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(1915,8,4,23,40,0) + + tz = TestTimezone.new('Europe/Warsaw', nil, [p1, p2], dt) + + assert_raises(BlockCalled) do + tz.local_to_utc(dt, true) do |periods| + assert_equal([p1, p2], periods) + raise BlockCalled, 'should be raised' + end + end + + assert_raises(BlockCalled) do + tz.local_to_utc(dt, false) do |periods| + assert_equal([p1, p2], periods) + raise BlockCalled, 'should be raised' + end + end + + assert_equal(DateTime.new(1915,8,4,22,16,0), tz.local_to_utc(dt) {|periods| periods.first}) + assert_equal(DateTime.new(1915,8,4,22,40,0), tz.local_to_utc(dt) {|periods| periods.last}) + assert_equal(DateTime.new(1915,8,4,22,16,0), tz.local_to_utc(dt) {|periods| [periods.first]}) + assert_equal(DateTime.new(1915,8,4,22,40,0), tz.local_to_utc(dt) {|periods| [periods.last]}) + end + + def test_local_to_utc_block_ambiguous + o1 = TimezoneOffset.new(-18000, 0, :EST) + o2 = TimezoneOffset.new(-18000, 3600, :EDT) + + t1 = TestTimezoneTransition.new(o2, o1, 1081062000) + t2 = TestTimezoneTransition.new(o1, o2, 1099202400) + t3 = TestTimezoneTransition.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_raises(AmbiguousTime) { tz.local_to_utc(dt) {|periods| nil} } + assert_raises(AmbiguousTime) { tz.local_to_utc(dt) {|periods| periods} } + assert_raises(AmbiguousTime) { tz.local_to_utc(dt) {|periods| []} } + assert_raises(AmbiguousTime) { tz.local_to_utc(dt) {|periods| raise AmbiguousTime, 'Ambiguous time'} } + end + + def test_offsets_up_to + o1 = TimezoneOffset.new(-17900, 0, :TESTLMT) + o2 = TimezoneOffset.new(-18000, 3600, :TESTD) + o3 = TimezoneOffset.new(-18000, 0, :TESTS) + o4 = TimezoneOffset.new(-21600, 3600, :TESTD) + o5 = TimezoneOffset.new(-21600, 0, :TESTS) + + t1 = TestTimezoneTransition.new(o2, o1, Time.utc(2010, 4,1,1,0,0).to_i) + t2 = TestTimezoneTransition.new(o3, o2, Time.utc(2010,10,1,1,0,0).to_i) + t3 = TestTimezoneTransition.new(o2, o3, Time.utc(2011, 3,1,1,0,0).to_i) + t4 = TestTimezoneTransition.new(o4, o2, Time.utc(2011, 4,1,1,0,0).to_i) + t5 = TestTimezoneTransition.new(o3, o4, Time.utc(2011,10,1,1,0,0).to_i) + t6 = TestTimezoneTransition.new(o5, o3, Time.utc(2012, 3,1,1,0,0).to_i) + + assert_array_same_items([o1, o2, o3, o4, o5], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1), nil, [t1, t2, t3, t4, t5, t6]). + offsets_up_to(Time.utc(2012,3,1,1,0,1))) + assert_array_same_items([o2, o3, o4, o5], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1), Time.utc(2010,4,1,1,0,0), [t1, t2, t3, t4, t5, t6]). + offsets_up_to(Time.utc(2012,3,1,1,0,1), Time.utc(2010,4,1,1,0,0))) + assert_array_same_items([o1, o2, o3, o4], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,0), nil, [t1, t2, t3, t4, t5]). + offsets_up_to(Time.utc(2012,3,1,1,0,0))) + assert_array_same_items([o2, o3, o4, o5], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1), Time.utc(2010,4,1,1,0,1), [t2, t3, t4, t5, t6]). + offsets_up_to(Time.utc(2012,3,1,1,0,1), Time.utc(2010,4,1,1,0,1))) + assert_array_same_items([o2, o3], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2011,3,1,2,0,0), Time.utc(2011,3,1,0,0,0), [t3]). + offsets_up_to(Time.utc(2011,3,1,2,0,0), Time.utc(2011,3,1,0,0,0))) + assert_array_same_items([o3, o4], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,0), Time.utc(2011,4,1,1,0,0), [t4, t5]). + offsets_up_to(Time.utc(2012,3,1,1,0,0), Time.utc(2011,4,1,1,0,0))) + + assert_array_same_items([o1, o2, o3, o4, o5], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1).to_i, nil, [t1, t2, t3, t4, t5, t6]). + offsets_up_to(Time.utc(2012,3,1,1,0,1).to_i)) + assert_array_same_items([o2, o3, o4, o5], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,0).to_i, [t1, t2, t3, t4, t5, t6]). + offsets_up_to(Time.utc(2012,3,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,0).to_i)) + assert_array_same_items([o1, o2, o3, o4], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,0).to_i, nil, [t1, t2, t3, t4, t5]). + offsets_up_to(Time.utc(2012,3,1,1,0,0).to_i)) + assert_array_same_items([o2, o3, o4, o5], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,1).to_i, [t2, t3, t4, t5, t6]). + offsets_up_to(Time.utc(2012,3,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,1).to_i)) + assert_array_same_items([o2, o3], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2011,3,1,2,0,0).to_i, Time.utc(2011,3,1,0,0,0).to_i, [t3]). + offsets_up_to(Time.utc(2011,3,1,2,0,0).to_i, Time.utc(2011,3,1,0,0,0).to_i)) + assert_array_same_items([o3, o4], + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,0).to_i, Time.utc(2011,4,1,1,0,0).to_i, [t4, t5]). + offsets_up_to(Time.utc(2012,3,1,1,0,0).to_i, Time.utc(2011,4,1,1,0,0).to_i)) + + assert_array_same_items([o1, o2, o3, o4, o5], + OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,1), nil, [t1, t2, t3, t4, t5, t6]). + offsets_up_to(DateTime.new(2012,3,1,1,0,1))) + assert_array_same_items([o2, o3, o4, o5], + OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,1), DateTime.new(2010,4,1,1,0,0), [t1, t2, t3, t4, t5, t6]). + offsets_up_to(DateTime.new(2012,3,1,1,0,1), DateTime.new(2010,4,1,1,0,0))) + assert_array_same_items([o1, o2, o3, o4], + OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,0), nil, [t1, t2, t3, t4, t5]). + offsets_up_to(DateTime.new(2012,3,1,1,0,0))) + assert_array_same_items([o2, o3, o4, o5], + OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,1), DateTime.new(2010,4,1,1,0,1), [t2, t3, t4, t5, t6]). + offsets_up_to(DateTime.new(2012,3,1,1,0,1), DateTime.new(2010,4,1,1,0,1))) + assert_array_same_items([o2, o3], + OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2011,3,1,2,0,0), DateTime.new(2011,3,1,0,0,0), [t3]). + offsets_up_to(DateTime.new(2011,3,1,2,0,0), DateTime.new(2011,3,1,0,0,0))) + assert_array_same_items([o3, o4], + OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,0), DateTime.new(2011,4,1,1,0,0), [t4, t5]). + offsets_up_to(DateTime.new(2012,3,1,1,0,0), DateTime.new(2011,4,1,1,0,0))) + end + + def test_offsets_up_to_no_transitions + o = TimezoneOffset.new(600, 0, :LMT) + p = TimezonePeriod.new(nil, nil, o) + + assert_array_same_items([o], + OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', Time.utc(2000,1,1,1,0,0), nil, p). + offsets_up_to(Time.utc(2000,1,1,1,0,0))) + assert_array_same_items([o], + OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', Time.utc(2000,1,1,1,0,0), Time.utc(1990,1,1,1,0,0), p). + offsets_up_to(Time.utc(2000,1,1,1,0,0), Time.utc(1990,1,1,1,0,0))) + + assert_array_same_items([o], + OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', Time.utc(2000,1,1,1,0,0).to_i, nil, p). + offsets_up_to(Time.utc(2000,1,1,1,0,0).to_i)) + assert_array_same_items([o], + OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', Time.utc(2000,1,1,1,0,0).to_i, Time.utc(1990,1,1,1,0,0).to_i, p). + offsets_up_to(Time.utc(2000,1,1,1,0,0).to_i, Time.utc(1990,1,1,1,0,0).to_i)) + + assert_array_same_items([o], + OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', DateTime.new(2000,1,1,1,0,0), nil, p). + offsets_up_to(DateTime.new(2000,1,1,1,0,0))) + assert_array_same_items([o], + OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', DateTime.new(2000,1,1,1,0,0), DateTime.new(1990,1,1,1,0,0), p). + offsets_up_to(DateTime.new(2000,1,1,1,0,0), DateTime.new(1990,1,1,1,0,0))) + end + + def test_offsets_up_to_utc_to_not_greater_than_utc_from + assert_raises(ArgumentError) do + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,8,1,0,0,0), Time.utc(2012,8,1,0,0,0), []). + offsets_up_to(Time.utc(2012,8,1,0,0,0), Time.utc(2012,8,1,0,0,0)) + end + + assert_raises(ArgumentError) do + OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,8,1,0,0,0).to_i, Time.utc(2012,8,1,0,0,0).to_i, []). + offsets_up_to(Time.utc(2012,8,1,0,0,0).to_i, Time.utc(2012,8,1,0,0,0).to_i) + end + + assert_raises(ArgumentError) do + OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,8,1,0,0,0), DateTime.new(2012,8,1,0,0,0), []). + offsets_up_to(DateTime.new(2012,8,1,0,0,0), DateTime.new(2012,8,1,0,0,0)) + end + end + + def test_now + assert_kind_of(Time, Timezone.get('Europe/London').now) + end + + def test_current_period + assert_kind_of(TimezonePeriod, Timezone.get('Europe/London').current_period) + end + + def test_current_period_and_time + current = Timezone.get('Europe/London').current_period_and_time + assert_equal(2, current.length) + assert_kind_of(Time, current[0]) + assert_kind_of(TimezonePeriod, current[1]) + end + + def test_current_time_and_period + current = Timezone.get('Europe/London').current_time_and_period + assert_equal(2, current.length) + assert_kind_of(Time, current[0]) + assert_kind_of(TimezonePeriod, current[1]) + end + + def test_compare + assert_equal(0, TestTimezone.new('Europe/London') <=> TestTimezone.new('Europe/London')) + assert_equal(-1, TestTimezone.new('Europe/London') <=> TestTimezone.new('Europe/london')) + assert_equal(-1, TestTimezone.new('Europe/London') <=> TestTimezone.new('Europe/Paris')) + assert_equal(1, TestTimezone.new('Europe/Paris') <=> TestTimezone.new('Europe/London')) + assert_equal(-1, TestTimezone.new('America/New_York') <=> TestTimezone.new('Europe/Paris')) + assert_equal(1, TestTimezone.new('Europe/Paris') <=> TestTimezone.new('America/New_York')) + end + + def test_compare_non_comparable + assert_nil(TestTimezone.new('Europe/London') <=> Object.new) + end + + def test_equality + assert_equal(true, TestTimezone.new('Europe/London') == TestTimezone.new('Europe/London')) + assert_equal(false, TestTimezone.new('Europe/London') == TestTimezone.new('Europe/london')) + assert_equal(false, TestTimezone.new('Europe/London') == TestTimezone.new('Europe/Paris')) + assert(!(TestTimezone.new('Europe/London') == Object.new)) + end + + def test_eql + assert_equal(true, TestTimezone.new('Europe/London').eql?(TestTimezone.new('Europe/London'))) + assert_equal(false, TestTimezone.new('Europe/London').eql?(TestTimezone.new('Europe/london'))) + assert_equal(false, TestTimezone.new('Europe/London').eql?(TestTimezone.new('Europe/Paris'))) + assert(!TestTimezone.new('Europe/London').eql?(Object.new)) + end + + def test_hash + assert_equal('Europe/London'.hash, TestTimezone.new('Europe/London').hash) + assert_equal('America/New_York'.hash, TestTimezone.new('America/New_York').hash) + end + + def test_marshal_data + tz = Timezone.get('Europe/London') + assert_kind_of(DataTimezone, tz) + assert_same(tz, Marshal.load(Marshal.dump(tz))) + end + + def test_marshal_linked + tz = Timezone.get('UTC') + + # ZoneinfoDataSource doesn't return LinkedTimezoneInfo for any timezone. + if DataSource.get.load_timezone_info('UTC').kind_of?(LinkedTimezoneInfo) + assert_kind_of(LinkedTimezone, tz) + else + assert_kind_of(DataTimezone, tz) + end + + assert_same(tz, Marshal.load(Marshal.dump(tz))) + end + + def test_strftime_datetime + tz = Timezone.get('Europe/London') + dt = DateTime.new(2006, 7, 15, 22, 12, 2) + assert_equal('23:12:02 BST', tz.strftime('%H:%M:%S %Z', dt)) + assert_equal('BST', tz.strftime('%Z', dt)) + assert_equal('%ZBST', tz.strftime('%%Z%Z', dt)) + assert_equal('BST BST', tz.strftime('%Z %Z', dt)) + assert_equal('BST %Z %BST %%Z %%BST', tz.strftime('%Z %%Z %%%Z %%%%Z %%%%%Z', dt)) + assert_equal('+0100 +01:00 +01:00:00 +01 %::::z', tz.strftime('%z %:z %::z %:::z %::::z', dt)) + assert_equal('1153001522 %s %1153001522', tz.strftime('%s %%s %%%s', dt)) + end + + def test_strftime_time + tz = Timezone.get('Europe/London') + t = Time.utc(2006, 7, 15, 22, 12, 2) + assert_equal('23:12:02 BST', tz.strftime('%H:%M:%S %Z', t)) + assert_equal('BST', tz.strftime('%Z', t)) + assert_equal('%ZBST', tz.strftime('%%Z%Z', t)) + assert_equal('BST BST', tz.strftime('%Z %Z', t)) + assert_equal('BST %Z %BST %%Z %%BST', tz.strftime('%Z %%Z %%%Z %%%%Z %%%%%Z', t)) + assert_equal('+0100 +01:00 +01:00:00 +01 %::::z', tz.strftime('%z %:z %::z %:::z %::::z', t)) + assert_equal('1153001522 %s %1153001522', tz.strftime('%s %%s %%%s', t)) + end + + def test_strftime_int + tz = Timezone.get('Europe/London') + i = Time.utc(2006, 7, 15, 22, 12, 2).to_i + assert_equal('23:12:02 BST', tz.strftime('%H:%M:%S %Z', i)) + assert_equal('BST', tz.strftime('%Z', i)) + assert_equal('%ZBST', tz.strftime('%%Z%Z', i)) + assert_equal('BST BST', tz.strftime('%Z %Z', i)) + assert_equal('BST %Z %BST %%Z %%BST', tz.strftime('%Z %%Z %%%Z %%%%Z %%%%%Z', i)) + assert_equal('+0100 +01:00 +01:00:00 +01 %::::z', tz.strftime('%z %:z %::z %:::z %::::z', i)) + assert_equal('1153001522 %s %1153001522', tz.strftime('%s %%s %%%s', i)) + end + + def test_get_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Timezone.get('Europe/London') + end + end + + def test_new_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Timezone.new('Europe/London') + end + end + + def test_all_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Timezone.all + end + end + + def test_all_identifiers_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Timezone.all_identifiers + end + end + + def test_all_data_zones_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Timezone.all_data_zones + end + end + + def test_all_data_zone_identifiers_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Timezone.all_data_zone_identifiers + end + end + + def test_all_linked_zones_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Timezone.all_linked_zones + end + end + + def test_all_linked_zone_identifiers_missing_data_source + DataSource.set(DataSource.new) + + assert_raises(InvalidDataSource) do + Timezone.all_linked_zone_identifiers + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_definition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_definition.rb new file mode 100644 index 000000000000..f7f238860309 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_definition.rb @@ -0,0 +1,113 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezoneDefinition < Minitest::Test + + module DataTest + include TimezoneDefinition + + timezone 'Test/Data/Zone' do |tz| + tz.offset :o0, -75, 0, :LMT + tz.offset :o1, 0, 0, :GMT + + tz.transition 1847, 12, :o1, 2760187969, 1152 + end + end + + module LinkedTest + include TimezoneDefinition + + linked_timezone 'Test/Linked/Zone', 'Test/Linked_To/Zone' + end + + module DoubleDataTest + include TimezoneDefinition + + timezone 'Test/Data/Zone1' do |tz| + tz.offset :o0, -75, 0, :LMT + tz.offset :o1, 0, 0, :GMT + + tz.transition 1847, 12, :o1, 2760187969, 1152 + end + + timezone 'Test/Data/Zone2' do |tz| + tz.offset :o0, 75, 0, :LMT + tz.offset :o1, 0, 0, :GMT + + tz.transition 1847, 12, :o1, 2760187969, 1152 + end + end + + module DoubleLinkedTest + include TimezoneDefinition + + linked_timezone 'Test/Linked/Zone1', 'Test/Linked_To/Zone1' + linked_timezone 'Test/Linked/Zone2', 'Test/Linked_To/Zone2' + end + + module DataLinkedTest + include TimezoneDefinition + + timezone 'Test/Data/Zone1' do |tz| + tz.offset :o0, -75, 0, :LMT + tz.offset :o1, 0, 0, :GMT + + tz.transition 1847, 12, :o1, 2760187969, 1152 + end + + linked_timezone 'Test/Linked/Zone2', 'Test/Linked_To/Zone2' + end + + module LinkedDataTest + include TimezoneDefinition + + linked_timezone 'Test/Linked/Zone1', 'Test/Linked_To/Zone1' + + timezone 'Test/Data/Zone2' do |tz| + tz.offset :o0, -75, 0, :LMT + tz.offset :o1, 0, 0, :GMT + + tz.transition 1847, 12, :o1, 2760187969, 1152 + end + end + + def test_data + assert_kind_of(TransitionDataTimezoneInfo, DataTest.get) + assert_equal('Test/Data/Zone', DataTest.get.identifier) + assert_equal(:LMT, DataTest.get.period_for_utc(DateTime.new(1847,12,1,0,1,14)).abbreviation) + assert_equal(:GMT, DataTest.get.period_for_utc(DateTime.new(1847,12,1,0,1,15)).abbreviation) + end + + def test_linked + assert_kind_of(LinkedTimezoneInfo, LinkedTest.get) + assert_equal('Test/Linked/Zone', LinkedTest.get.identifier) + assert_equal('Test/Linked_To/Zone', LinkedTest.get.link_to_identifier) + end + + def test_double_data + assert_kind_of(TransitionDataTimezoneInfo, DoubleDataTest.get) + assert_equal('Test/Data/Zone2', DoubleDataTest.get.identifier) + assert_equal(:LMT, DoubleDataTest.get.period_for_utc(DateTime.new(1847,12,1,0,1,14)).abbreviation) + assert_equal(:GMT, DoubleDataTest.get.period_for_utc(DateTime.new(1847,12,1,0,1,15)).abbreviation) + end + + def test_double_linked + assert_kind_of(LinkedTimezoneInfo, DoubleLinkedTest.get) + assert_equal('Test/Linked/Zone2', DoubleLinkedTest.get.identifier) + assert_equal('Test/Linked_To/Zone2', DoubleLinkedTest.get.link_to_identifier) + end + + def test_data_linked + assert_kind_of(LinkedTimezoneInfo, DataLinkedTest.get) + assert_equal('Test/Linked/Zone2', DataLinkedTest.get.identifier) + assert_equal('Test/Linked_To/Zone2', DataLinkedTest.get.link_to_identifier) + end + + def test_linked_data + assert_kind_of(TransitionDataTimezoneInfo, LinkedDataTest.get) + assert_equal('Test/Data/Zone2', LinkedDataTest.get.identifier) + assert_equal(:LMT, LinkedDataTest.get.period_for_utc(DateTime.new(1847,12,1,0,1,14)).abbreviation) + assert_equal(:GMT, LinkedDataTest.get.period_for_utc(DateTime.new(1847,12,1,0,1,15)).abbreviation) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_index_definition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_index_definition.rb new file mode 100644 index 000000000000..cd55dd99eaf3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_index_definition.rb @@ -0,0 +1,73 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezoneIndexDefinition < Minitest::Test + + module TimezonesTest1 + include TimezoneIndexDefinition + + timezone 'Test/One' + timezone 'Test/Two' + linked_timezone 'Test/Three' + timezone 'Another/Zone' + linked_timezone 'And/Yet/Another' + end + + module TimezonesTest2 + include TimezoneIndexDefinition + + timezone 'Test/A/One' + timezone 'Test/A/Two' + timezone 'Test/A/Three' + end + + module TimezonesTest3 + include TimezoneIndexDefinition + + linked_timezone 'Test/B/One' + linked_timezone 'Test/B/Two' + linked_timezone 'Test/B/Three' + end + + module TimezonesTest4 + include TimezoneIndexDefinition + + end + + def test_timezones + assert_equal(['Test/One', 'Test/Two', 'Test/Three', 'Another/Zone', 'And/Yet/Another'], TimezonesTest1.timezones) + assert_equal(['Test/A/One', 'Test/A/Two', 'Test/A/Three'], TimezonesTest2.timezones) + assert_equal(['Test/B/One', 'Test/B/Two', 'Test/B/Three'], TimezonesTest3.timezones) + assert_equal([], TimezonesTest4.timezones) + + assert_equal(true, TimezonesTest1.timezones.frozen?) + assert_equal(true, TimezonesTest2.timezones.frozen?) + assert_equal(true, TimezonesTest3.timezones.frozen?) + assert_equal(true, TimezonesTest4.timezones.frozen?) + end + + def test_data_timezones + assert_equal(['Test/One', 'Test/Two', 'Another/Zone'], TimezonesTest1.data_timezones) + assert_equal(['Test/A/One', 'Test/A/Two', 'Test/A/Three'], TimezonesTest2.data_timezones) + assert_equal([], TimezonesTest3.data_timezones) + assert_equal([], TimezonesTest4.data_timezones) + + assert_equal(true, TimezonesTest1.data_timezones.frozen?) + assert_equal(true, TimezonesTest2.data_timezones.frozen?) + assert_equal(true, TimezonesTest3.data_timezones.frozen?) + assert_equal(true, TimezonesTest4.data_timezones.frozen?) + end + + def test_linked_timezones + assert_equal(['Test/Three', 'And/Yet/Another'], TimezonesTest1.linked_timezones) + assert_equal([], TimezonesTest2.linked_timezones) + assert_equal(['Test/B/One', 'Test/B/Two', 'Test/B/Three'], TimezonesTest3.linked_timezones) + assert_equal([], TimezonesTest4.linked_timezones) + + assert_equal(true, TimezonesTest1.linked_timezones.frozen?) + assert_equal(true, TimezonesTest2.linked_timezones.frozen?) + assert_equal(true, TimezonesTest3.linked_timezones.frozen?) + assert_equal(true, TimezonesTest4.linked_timezones.frozen?) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_info.rb new file mode 100644 index 000000000000..fd7092975d39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_info.rb @@ -0,0 +1,11 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezoneInfo < Minitest::Test + + def test_identifier + ti = TimezoneInfo.new('Test/Zone') + assert_equal('Test/Zone', ti.identifier) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_london.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_london.rb new file mode 100644 index 000000000000..a0599b7b605d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_london.rb @@ -0,0 +1,143 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezoneLondon < Minitest::Test + def test_2004 + #Europe/London Sun Mar 28 00:59:59 2004 UTC = Sun Mar 28 00:59:59 2004 GMT isdst=0 gmtoff=0 + #Europe/London Sun Mar 28 01:00:00 2004 UTC = Sun Mar 28 02:00:00 2004 BST isdst=1 gmtoff=3600 + #Europe/London Sun Oct 31 00:59:59 2004 UTC = Sun Oct 31 01:59:59 2004 BST isdst=1 gmtoff=3600 + #Europe/London Sun Oct 31 01:00:00 2004 UTC = Sun Oct 31 01:00:00 2004 GMT isdst=0 gmtoff=0 + + tz = Timezone.get('Europe/London') + assert_equal(DateTime.new(2004,3,28,0,59,59), tz.utc_to_local(DateTime.new(2004,3,28,0,59,59))) + assert_equal(DateTime.new(2004,3,28,2,0,0), tz.utc_to_local(DateTime.new(2004,3,28,1,0,0))) + assert_equal(DateTime.new(2004,10,31,1,59,59), tz.utc_to_local(DateTime.new(2004,10,31,0,59,59))) + assert_equal(DateTime.new(2004,10,31,1,0,0), tz.utc_to_local(DateTime.new(2004,10,31,1,0,0))) + + assert_equal(DateTime.new(2004,3,28,0,59,59), tz.local_to_utc(DateTime.new(2004,3,28,0,59,59))) + assert_equal(DateTime.new(2004,3,28,1,0,0), tz.local_to_utc(DateTime.new(2004,3,28,2,0,0))) + assert_equal(DateTime.new(2004,10,31,0,59,59), tz.local_to_utc(DateTime.new(2004,10,31,1,59,59), true)) + assert_equal(DateTime.new(2004,10,31,1,59,59), tz.local_to_utc(DateTime.new(2004,10,31,1,59,59), false)) + assert_equal(DateTime.new(2004,10,31,0,0,0), tz.local_to_utc(DateTime.new(2004,10,31,1,0,0), true)) + assert_equal(DateTime.new(2004,10,31,1,0,0), tz.local_to_utc(DateTime.new(2004,10,31,1,0,0), false)) + + assert_raises(PeriodNotFound) { tz.local_to_utc(DateTime.new(2004,3,28,1,0,0)) } + assert_raises(AmbiguousTime) { tz.local_to_utc(DateTime.new(2004,10,31,1,0,0)) } + + assert_equal(:GMT, tz.period_for_utc(DateTime.new(2004,3,28,0,59,59)).zone_identifier) + assert_equal(:BST, tz.period_for_utc(DateTime.new(2004,3,28,1,0,0)).zone_identifier) + assert_equal(:BST, tz.period_for_utc(DateTime.new(2004,10,31,0,59,59)).zone_identifier) + assert_equal(:GMT, tz.period_for_utc(DateTime.new(2004,10,31,1,0,0)).zone_identifier) + + assert_equal(:GMT, tz.period_for_local(DateTime.new(2004,3,28,0,59,59)).zone_identifier) + assert_equal(:BST, tz.period_for_local(DateTime.new(2004,3,28,2,0,0)).zone_identifier) + assert_equal(:BST, tz.period_for_local(DateTime.new(2004,10,31,1,59,59), true).zone_identifier) + assert_equal(:GMT, tz.period_for_local(DateTime.new(2004,10,31,1,59,59), false).zone_identifier) + assert_equal(:BST, tz.period_for_local(DateTime.new(2004,10,31,1,0,0), true).zone_identifier) + assert_equal(:GMT, tz.period_for_local(DateTime.new(2004,10,31,1,0,0), false).zone_identifier) + + assert_equal(0, tz.period_for_utc(DateTime.new(2004,3,28,0,59,59)).utc_total_offset) + assert_equal(3600, tz.period_for_utc(DateTime.new(2004,3,28,1,0,0)).utc_total_offset) + assert_equal(3600, tz.period_for_utc(DateTime.new(2004,10,31,0,59,59)).utc_total_offset) + assert_equal(0, tz.period_for_utc(DateTime.new(2004,10,31,1,0,0)).utc_total_offset) + + assert_equal(0, tz.period_for_local(DateTime.new(2004,3,28,0,59,59)).utc_total_offset) + assert_equal(3600, tz.period_for_local(DateTime.new(2004,3,28,2,0,0)).utc_total_offset) + assert_equal(3600, tz.period_for_local(DateTime.new(2004,10,31,1,59,59), true).utc_total_offset) + assert_equal(0, tz.period_for_local(DateTime.new(2004,10,31,1,59,59), false).utc_total_offset) + assert_equal(3600, tz.period_for_local(DateTime.new(2004,10,31,1,0,0), true).utc_total_offset) + assert_equal(0, tz.period_for_local(DateTime.new(2004,10,31,1,0,0), false).utc_total_offset) + + transitions = tz.transitions_up_to(DateTime.new(2005,1,1,0,0,0), DateTime.new(2004,1,1,0,0,0)) + assert_equal(2, transitions.length) + assert_equal(TimeOrDateTime.new(DateTime.new(2004,3,28,1,0,0)), transitions[0].at) + assert_equal(TimezoneOffset.new(0, 0, :GMT), transitions[0].previous_offset) + assert_equal(TimezoneOffset.new(0, 3600, :BST), transitions[0].offset) + assert_equal(TimeOrDateTime.new(DateTime.new(2004,10,31,1,0,0)), transitions[1].at) + assert_equal(TimezoneOffset.new(0, 3600, :BST), transitions[1].previous_offset) + assert_equal(TimezoneOffset.new(0, 0, :GMT), transitions[1].offset) + + offsets = tz.offsets_up_to(DateTime.new(2005,1,1,0,0,0), DateTime.new(2004,1,1,0,0,0)) + assert_array_same_items([TimezoneOffset.new(0, 0, :GMT), TimezoneOffset.new(0, 3600, :BST)], offsets) + end + + def test_1961 + # This test cannot be run when using ZoneinfoDataSource on platforms + # that don't support Times before the epoch (i.e. Ruby < 1.9 on Windows) + # because it relates to the year 1961. + + if !DataSource.get.kind_of?(ZoneinfoDataSource) || RubyCoreSupport.time_supports_negative + #Europe/London Sun Mar 26 01:59:59 1961 UTC = Sun Mar 26 01:59:59 1961 GMT isdst=0 gmtoff=0 + #Europe/London Sun Mar 26 02:00:00 1961 UTC = Sun Mar 26 03:00:00 1961 BST isdst=1 gmtoff=3600 + #Europe/London Sun Oct 29 01:59:59 1961 UTC = Sun Oct 29 02:59:59 1961 BST isdst=1 gmtoff=3600 + #Europe/London Sun Oct 29 02:00:00 1961 UTC = Sun Oct 29 02:00:00 1961 GMT isdst=0 gmtoff=0 + + tz = Timezone.get('Europe/London') + assert_equal(DateTime.new(1961,3,26,1,59,59), tz.utc_to_local(DateTime.new(1961,3,26,1,59,59))) + assert_equal(DateTime.new(1961,3,26,3,0,0), tz.utc_to_local(DateTime.new(1961,3,26,2,0,0))) + assert_equal(DateTime.new(1961,10,29,2,59,59), tz.utc_to_local(DateTime.new(1961,10,29,1,59,59))) + assert_equal(DateTime.new(1961,10,29,2,0,0), tz.utc_to_local(DateTime.new(1961,10,29,2,0,0))) + + assert_equal(DateTime.new(1961,3,26,1,59,59), tz.local_to_utc(DateTime.new(1961,3,26,1,59,59))) + assert_equal(DateTime.new(1961,3,26,2,0,0), tz.local_to_utc(DateTime.new(1961,3,26,3,0,0))) + assert_equal(DateTime.new(1961,10,29,1,59,59), tz.local_to_utc(DateTime.new(1961,10,29,2,59,59), true)) + assert_equal(DateTime.new(1961,10,29,2,59,59), tz.local_to_utc(DateTime.new(1961,10,29,2,59,59), false)) + assert_equal(DateTime.new(1961,10,29,1,0,0), tz.local_to_utc(DateTime.new(1961,10,29,2,0,0), true)) + assert_equal(DateTime.new(1961,10,29,2,0,0), tz.local_to_utc(DateTime.new(1961,10,29,2,0,0), false)) + + assert_raises(PeriodNotFound) { tz.local_to_utc(DateTime.new(1961,3,26,2,0,0)) } + assert_raises(AmbiguousTime) { tz.local_to_utc(DateTime.new(1961,10,29,2,0,0)) } + + assert_equal(:GMT, tz.period_for_utc(DateTime.new(1961,3,26,1,59,59)).zone_identifier) + assert_equal(:BST, tz.period_for_utc(DateTime.new(1961,3,26,2,0,0)).zone_identifier) + assert_equal(:BST, tz.period_for_utc(DateTime.new(1961,10,29,1,59,59)).zone_identifier) + assert_equal(:GMT, tz.period_for_utc(DateTime.new(1961,10,29,2,0,0)).zone_identifier) + + assert_equal(:GMT, tz.period_for_local(DateTime.new(1961,3,26,1,59,59)).zone_identifier) + assert_equal(:BST, tz.period_for_local(DateTime.new(1961,3,26,3,0,0)).zone_identifier) + assert_equal(:BST, tz.period_for_local(DateTime.new(1961,10,29,2,59,59), true).zone_identifier) + assert_equal(:GMT, tz.period_for_local(DateTime.new(1961,10,29,2,59,59), false).zone_identifier) + assert_equal(:BST, tz.period_for_local(DateTime.new(1961,10,29,2,0,0), true).zone_identifier) + assert_equal(:GMT, tz.period_for_local(DateTime.new(1961,10,29,2,0,0), false).zone_identifier) + + assert_equal(0, tz.period_for_utc(DateTime.new(1961,3,26,1,59,59)).utc_total_offset) + assert_equal(3600, tz.period_for_utc(DateTime.new(1961,3,26,2,0,0)).utc_total_offset) + assert_equal(3600, tz.period_for_utc(DateTime.new(1961,10,29,1,59,59)).utc_total_offset) + assert_equal(0, tz.period_for_utc(DateTime.new(1961,10,29,2,0,0)).utc_total_offset) + + assert_equal(0, tz.period_for_local(DateTime.new(1961,3,26,1,59,59)).utc_total_offset) + assert_equal(3600, tz.period_for_local(DateTime.new(1961,3,26,3,0,0)).utc_total_offset) + assert_equal(3600, tz.period_for_local(DateTime.new(1961,10,29,2,59,59), true).utc_total_offset) + assert_equal(0, tz.period_for_local(DateTime.new(1961,10,29,2,59,59), false).utc_total_offset) + assert_equal(3600, tz.period_for_local(DateTime.new(1961,10,29,2,0,0), true).utc_total_offset) + assert_equal(0, tz.period_for_local(DateTime.new(1961,10,29,2,0,0), false).utc_total_offset) + + + transitions = tz.transitions_up_to(DateTime.new(1962,1,1,0,0,0), DateTime.new(1961,1,1,0,0,0)) + assert_equal(2, transitions.length) + assert_equal(TimeOrDateTime.new(DateTime.new(1961,3,26,2,0,0)), transitions[0].at) + assert_equal(TimezoneOffset.new(0, 0, :GMT), transitions[0].previous_offset) + assert_equal(TimezoneOffset.new(0, 3600, :BST), transitions[0].offset) + assert_equal(TimeOrDateTime.new(DateTime.new(1961,10,29,2,0,0)), transitions[1].at) + assert_equal(TimezoneOffset.new(0, 3600, :BST), transitions[1].previous_offset) + assert_equal(TimezoneOffset.new(0, 0, :GMT), transitions[1].offset) + + offsets = tz.offsets_up_to(DateTime.new(1962,1,1,0,0,0), DateTime.new(1961,1,1,0,0,0)) + assert_array_same_items([TimezoneOffset.new(0, 0, :GMT), TimezoneOffset.new(0, 3600, :BST)], offsets) + end + end + + def test_time_boundary + #Europe/London Sat Oct 26 23:00:00 1968 UTC = Sun Oct 27 00:00:00 1968 GMT isdst=0 gmtoff=3600 + #Europe/London Sun Oct 31 01:59:59 1971 UTC = Sun Oct 31 02:59:59 1971 GMT isdst=0 gmtoff=3600 + + tz = Timezone.get('Europe/London') + assert_equal(DateTime.new(1970,1,1,1,0,0), tz.utc_to_local(DateTime.new(1970,1,1,0,0,0))) + assert_equal(DateTime.new(1970,1,1,0,0,0), tz.local_to_utc(DateTime.new(1970,1,1,1,0,0))) + assert_equal(Time.utc(1970,1,1,1,0,0), tz.utc_to_local(Time.utc(1970,1,1,0,0,0))) + assert_equal(Time.utc(1970,1,1,0,0,0), tz.local_to_utc(Time.utc(1970,1,1,1,0,0))) + assert_equal(3600, tz.utc_to_local(0)) + assert_equal(0, tz.local_to_utc(3600)) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_melbourne.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_melbourne.rb new file mode 100644 index 000000000000..bbfa8832dd07 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_melbourne.rb @@ -0,0 +1,142 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezoneMelbourne < Minitest::Test + def test_2004 + #Australia/Melbourne Sat Mar 27 15:59:59 2004 UTC = Sun Mar 28 02:59:59 2004 AEDT isdst=1 gmtoff=39600 + #Australia/Melbourne Sat Mar 27 16:00:00 2004 UTC = Sun Mar 28 02:00:00 2004 AEST isdst=0 gmtoff=36000 + #Australia/Melbourne Sat Oct 30 15:59:59 2004 UTC = Sun Oct 31 01:59:59 2004 AEST isdst=0 gmtoff=36000 + #Australia/Melbourne Sat Oct 30 16:00:00 2004 UTC = Sun Oct 31 03:00:00 2004 AEDT isdst=1 gmtoff=39600 + + tz = Timezone.get('Australia/Melbourne') + assert_equal(DateTime.new(2004,3,28,2,59,59), tz.utc_to_local(DateTime.new(2004,3,27,15,59,59))) + assert_equal(DateTime.new(2004,3,28,2,0,0), tz.utc_to_local(DateTime.new(2004,3,27,16,0,0))) + assert_equal(DateTime.new(2004,10,31,1,59,59), tz.utc_to_local(DateTime.new(2004,10,30,15,59,59))) + assert_equal(DateTime.new(2004,10,31,3,0,0), tz.utc_to_local(DateTime.new(2004,10,30,16,0,0))) + + assert_equal(DateTime.new(2004,3,27,15,59,59), tz.local_to_utc(DateTime.new(2004,3,28,2,59,59), true)) + assert_equal(DateTime.new(2004,3,27,16,59,59), tz.local_to_utc(DateTime.new(2004,3,28,2,59,59), false)) + assert_equal(DateTime.new(2004,3,27,15,0,0), tz.local_to_utc(DateTime.new(2004,3,28,2,0,0), true)) + assert_equal(DateTime.new(2004,3,27,16,0,0), tz.local_to_utc(DateTime.new(2004,3,28,2,0,0), false)) + assert_equal(DateTime.new(2004,10,30,15,59,59), tz.local_to_utc(DateTime.new(2004,10,31,1,59,59))) + assert_equal(DateTime.new(2004,10,30,16,0,0), tz.local_to_utc(DateTime.new(2004,10,31,3,0,0))) + + assert_raises(PeriodNotFound) { tz.local_to_utc(DateTime.new(2004,10,31,2,0,0)) } + assert_raises(AmbiguousTime) { tz.local_to_utc(DateTime.new(2004,3,28,2,0,0)) } + + assert_equal(:AEDT, tz.period_for_utc(DateTime.new(2004,3,27,15,59,59)).zone_identifier) + assert_equal(:AEST, tz.period_for_utc(DateTime.new(2004,3,27,16,0,0)).zone_identifier) + assert_equal(:AEST, tz.period_for_utc(DateTime.new(2004,10,30,15,59,59)).zone_identifier) + assert_equal(:AEDT, tz.period_for_utc(DateTime.new(2004,10,30,16,0,0)).zone_identifier) + + assert_equal(:AEDT, tz.period_for_local(DateTime.new(2004,3,28,2,59,59), true).zone_identifier) + assert_equal(:AEST, tz.period_for_local(DateTime.new(2004,3,28,2,59,59), false).zone_identifier) + assert_equal(:AEDT, tz.period_for_local(DateTime.new(2004,3,28,2,0,0), true).zone_identifier) + assert_equal(:AEST, tz.period_for_local(DateTime.new(2004,3,28,2,0,0), false).zone_identifier) + assert_equal(:AEST, tz.period_for_local(DateTime.new(2004,10,31,1,59,59)).zone_identifier) + assert_equal(:AEDT, tz.period_for_local(DateTime.new(2004,10,31,3,0,0)).zone_identifier) + + assert_equal(39600, tz.period_for_utc(DateTime.new(2004,3,27,15,59,59)).utc_total_offset) + assert_equal(36000, tz.period_for_utc(DateTime.new(2004,3,27,16,0,0)).utc_total_offset) + assert_equal(36000, tz.period_for_utc(DateTime.new(2004,10,30,15,59,59)).utc_total_offset) + assert_equal(39600, tz.period_for_utc(DateTime.new(2004,10,30,16,0,0)).utc_total_offset) + + assert_equal(39600, tz.period_for_local(DateTime.new(2004,3,28,2,59,59), true).utc_total_offset) + assert_equal(36000, tz.period_for_local(DateTime.new(2004,3,28,2,59,59), false).utc_total_offset) + assert_equal(39600, tz.period_for_local(DateTime.new(2004,3,28,2,0,0), true).utc_total_offset) + assert_equal(36000, tz.period_for_local(DateTime.new(2004,3,28,2,0,0), false).utc_total_offset) + assert_equal(36000, tz.period_for_local(DateTime.new(2004,10,31,1,59,59)).utc_total_offset) + assert_equal(39600, tz.period_for_local(DateTime.new(2004,10,31,3,0,0)).utc_total_offset) + + transitions = tz.transitions_up_to(DateTime.new(2005,1,1,0,0,0), DateTime.new(2004,1,1,0,0,0)) + assert_equal(2, transitions.length) + assert_equal(TimeOrDateTime.new(DateTime.new(2004,3,27,16,0,0)), transitions[0].at) + assert_equal(TimezoneOffset.new(36000, 3600, :AEDT), transitions[0].previous_offset) + assert_equal(TimezoneOffset.new(36000, 0, :AEST), transitions[0].offset) + assert_equal(TimeOrDateTime.new(DateTime.new(2004,10,30,16,0,0)), transitions[1].at) + assert_equal(TimezoneOffset.new(36000, 0, :AEST), transitions[1].previous_offset) + assert_equal(TimezoneOffset.new(36000, 3600, :AEDT), transitions[1].offset) + + offsets = tz.offsets_up_to(DateTime.new(2005,1,1,0,0,0), DateTime.new(2004,1,1,0,0,0)) + assert_array_same_items([TimezoneOffset.new(36000, 0, :AEST), TimezoneOffset.new(36000, 3600, :AEDT)], offsets) + end + + def test_1942 + # This test cannot be run when using ZoneinfoDataSource on platforms + # that don't support Times before the epoch (i.e. Ruby < 1.9 on Windows) + # because it relates to the year 1942. + + if !DataSource.get.kind_of?(ZoneinfoDataSource) || RubyCoreSupport.time_supports_negative + #Australia/Melbourne Sat Mar 28 14:59:59 1942 UTC = Sun Mar 29 01:59:59 1942 AEDT isdst=1 gmtoff=39600 + #Australia/Melbourne Sat Mar 28 15:00:00 1942 UTC = Sun Mar 29 01:00:00 1942 AEST isdst=0 gmtoff=36000 + #Australia/Melbourne Sat Sep 26 15:59:59 1942 UTC = Sun Sep 27 01:59:59 1942 AEST isdst=0 gmtoff=36000 + #Australia/Melbourne Sat Sep 26 16:00:00 1942 UTC = Sun Sep 27 03:00:00 1942 AEDT isdst=1 gmtoff=39600 + + tz = Timezone.get('Australia/Melbourne') + assert_equal(DateTime.new(1942,3,29,1,59,59), tz.utc_to_local(DateTime.new(1942,3,28,14,59,59))) + assert_equal(DateTime.new(1942,3,29,1,0,0), tz.utc_to_local(DateTime.new(1942,3,28,15,0,0))) + assert_equal(DateTime.new(1942,9,27,1,59,59), tz.utc_to_local(DateTime.new(1942,9,26,15,59,59))) + assert_equal(DateTime.new(1942,9,27,3,0,0), tz.utc_to_local(DateTime.new(1942,9,26,16,0,0))) + + assert_equal(DateTime.new(1942,3,28,14,59,59), tz.local_to_utc(DateTime.new(1942,3,29,1,59,59), true)) + assert_equal(DateTime.new(1942,3,28,15,59,59), tz.local_to_utc(DateTime.new(1942,3,29,1,59,59), false)) + assert_equal(DateTime.new(1942,3,28,14,0,0), tz.local_to_utc(DateTime.new(1942,3,29,1,0,0), true)) + assert_equal(DateTime.new(1942,3,28,15,0,0), tz.local_to_utc(DateTime.new(1942,3,29,1,0,0), false)) + assert_equal(DateTime.new(1942,9,26,15,59,59), tz.local_to_utc(DateTime.new(1942,9,27,1,59,59))) + assert_equal(DateTime.new(1942,9,26,16,0,0), tz.local_to_utc(DateTime.new(1942,9,27,3,0,0))) + + assert_raises(PeriodNotFound) { tz.local_to_utc(DateTime.new(1942,9,27,2,0,0)) } + assert_raises(AmbiguousTime) { tz.local_to_utc(DateTime.new(1942,3,29,1,0,0)) } + + assert_equal(:AEDT, tz.period_for_utc(DateTime.new(1942,3,28,14,59,59)).zone_identifier) + assert_equal(:AEST, tz.period_for_utc(DateTime.new(1942,3,28,15,0,0)).zone_identifier) + assert_equal(:AEST, tz.period_for_utc(DateTime.new(1942,9,26,15,59,59)).zone_identifier) + assert_equal(:AEDT, tz.period_for_utc(DateTime.new(1942,9,26,16,0,0)).zone_identifier) + + assert_equal(:AEDT, tz.period_for_local(DateTime.new(1942,3,29,1,59,59), true).zone_identifier) + assert_equal(:AEST, tz.period_for_local(DateTime.new(1942,3,29,1,59,59), false).zone_identifier) + assert_equal(:AEDT, tz.period_for_local(DateTime.new(1942,3,29,1,0,0), true).zone_identifier) + assert_equal(:AEST, tz.period_for_local(DateTime.new(1942,3,29,1,0,0), false).zone_identifier) + assert_equal(:AEST, tz.period_for_local(DateTime.new(1942,9,27,1,59,59)).zone_identifier) + assert_equal(:AEDT, tz.period_for_local(DateTime.new(1942,9,27,3,0,0)).zone_identifier) + + assert_equal(39600, tz.period_for_utc(DateTime.new(1942,3,28,14,59,59)).utc_total_offset) + assert_equal(36000, tz.period_for_utc(DateTime.new(1942,3,28,15,0,0)).utc_total_offset) + assert_equal(36000, tz.period_for_utc(DateTime.new(1942,9,26,15,59,59)).utc_total_offset) + assert_equal(39600, tz.period_for_utc(DateTime.new(1942,9,26,16,0,0)).utc_total_offset) + + assert_equal(39600, tz.period_for_local(DateTime.new(1942,3,29,1,59,59), true).utc_total_offset) + assert_equal(36000, tz.period_for_local(DateTime.new(1942,3,29,1,59,59), false).utc_total_offset) + assert_equal(39600, tz.period_for_local(DateTime.new(1942,3,29,1,0,0), true).utc_total_offset) + assert_equal(36000, tz.period_for_local(DateTime.new(1942,3,29,1,0,0), false).utc_total_offset) + assert_equal(36000, tz.period_for_local(DateTime.new(1942,9,27,1,59,59)).utc_total_offset) + assert_equal(39600, tz.period_for_local(DateTime.new(1942,9,27,3,0,0)).utc_total_offset) + + transitions = tz.transitions_up_to(DateTime.new(1943,1,1,0,0,0), DateTime.new(1942,1,1,0,0,0)) + assert_equal(2, transitions.length) + assert_equal(TimeOrDateTime.new(DateTime.new(1942,3,28,15,0,0)), transitions[0].at) + assert_equal(TimezoneOffset.new(36000, 3600, :AEDT), transitions[0].previous_offset) + assert_equal(TimezoneOffset.new(36000, 0, :AEST), transitions[0].offset) + assert_equal(TimeOrDateTime.new(DateTime.new(1942,9,26,16,0,0)), transitions[1].at) + assert_equal(TimezoneOffset.new(36000, 0, :AEST), transitions[1].previous_offset) + assert_equal(TimezoneOffset.new(36000, 3600, :AEDT), transitions[1].offset) + + offsets = tz.offsets_up_to(DateTime.new(1943,1,1,0,0,0), DateTime.new(1942,1,1,0,0,0)) + assert_array_same_items([TimezoneOffset.new(36000, 0, :AEST), TimezoneOffset.new(36000, 3600, :AEDT)], offsets) + end + end + + def test_time_boundary + #Australia/Melbourne Sat Mar 25 15:00:00 1944 UTC = Sun Mar 26 01:00:00 1944 AEST isdst=0 gmtoff=36000 + #Australia/Melbourne Sat Oct 30 15:59:59 1971 UTC = Sun Oct 31 01:59:59 1971 AEST isdst=0 gmtoff=36000 + + tz = Timezone.get('Australia/Melbourne') + assert_equal(DateTime.new(1970,1,1,10,0,0), tz.utc_to_local(DateTime.new(1970,1,1,0,0,0))) + assert_equal(DateTime.new(1970,1,1,0,0,0), tz.local_to_utc(DateTime.new(1970,1,1,10,0,0))) + assert_equal(Time.utc(1970,1,1,10,0,0), tz.utc_to_local(Time.utc(1970,1,1,0,0,0))) + assert_equal(Time.utc(1970,1,1,0,0,0), tz.local_to_utc(Time.utc(1970,1,1,10,0,0))) + assert_equal(36000, tz.utc_to_local(0)) + assert_equal(0, tz.local_to_utc(36000)) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_new_york.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_new_york.rb new file mode 100644 index 000000000000..3e270a9e4578 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_new_york.rb @@ -0,0 +1,142 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezoneNewYork < Minitest::Test + def test_2004 + #America/New_York Sun Apr 4 06:59:59 2004 UTC = Sun Apr 4 01:59:59 2004 EST isdst=0 gmtoff=-18000 + #America/New_York Sun Apr 4 07:00:00 2004 UTC = Sun Apr 4 03:00:00 2004 EDT isdst=1 gmtoff=-14400 + #America/New_York Sun Oct 31 05:59:59 2004 UTC = Sun Oct 31 01:59:59 2004 EDT isdst=1 gmtoff=-14400 + #America/New_York Sun Oct 31 06:00:00 2004 UTC = Sun Oct 31 01:00:00 2004 EST isdst=0 gmtoff=-18000 + + tz = Timezone.get('America/New_York') + assert_equal(DateTime.new(2004,4,4,1,59,59), tz.utc_to_local(DateTime.new(2004,4,4,6,59,59))) + assert_equal(DateTime.new(2004,4,4,3,0,0), tz.utc_to_local(DateTime.new(2004,4,4,7,0,0))) + assert_equal(DateTime.new(2004,10,31,1,59,59), tz.utc_to_local(DateTime.new(2004,10,31,5,59,59))) + assert_equal(DateTime.new(2004,10,31,1,0,0), tz.utc_to_local(DateTime.new(2004,10,31,6,0,0))) + + assert_equal(DateTime.new(2004,4,4,6,59,59), tz.local_to_utc(DateTime.new(2004,4,4,1,59,59))) + assert_equal(DateTime.new(2004,4,4,7,0,0), tz.local_to_utc(DateTime.new(2004,4,4,3,0,0))) + assert_equal(DateTime.new(2004,10,31,5,59,59), tz.local_to_utc(DateTime.new(2004,10,31,1,59,59), true)) + assert_equal(DateTime.new(2004,10,31,6,59,59), tz.local_to_utc(DateTime.new(2004,10,31,1,59,59), false)) + assert_equal(DateTime.new(2004,10,31,5,0,0), tz.local_to_utc(DateTime.new(2004,10,31,1,0,0), true)) + assert_equal(DateTime.new(2004,10,31,6,0,0), tz.local_to_utc(DateTime.new(2004,10,31,1,0,0), false)) + + assert_raises(PeriodNotFound) { tz.local_to_utc(DateTime.new(2004,4,4,2,0,0)) } + assert_raises(AmbiguousTime) { tz.local_to_utc(DateTime.new(2004,10,31,1,0,0)) } + + assert_equal(:EST, tz.period_for_utc(DateTime.new(2004,4,4,6,59,59)).zone_identifier) + assert_equal(:EDT, tz.period_for_utc(DateTime.new(2004,4,4,7,0,0)).zone_identifier) + assert_equal(:EDT, tz.period_for_utc(DateTime.new(2004,10,31,5,59,59)).zone_identifier) + assert_equal(:EST, tz.period_for_utc(DateTime.new(2004,10,31,6,0,0)).zone_identifier) + + assert_equal(:EST, tz.period_for_local(DateTime.new(2004,4,4,1,59,59)).zone_identifier) + assert_equal(:EDT, tz.period_for_local(DateTime.new(2004,4,4,3,0,0)).zone_identifier) + assert_equal(:EDT, tz.period_for_local(DateTime.new(2004,10,31,1,59,59), true).zone_identifier) + assert_equal(:EST, tz.period_for_local(DateTime.new(2004,10,31,1,59,59), false).zone_identifier) + assert_equal(:EDT, tz.period_for_local(DateTime.new(2004,10,31,1,0,0), true).zone_identifier) + assert_equal(:EST, tz.period_for_local(DateTime.new(2004,10,31,1,0,0), false).zone_identifier) + + assert_equal(-18000, tz.period_for_utc(DateTime.new(2004,4,4,6,59,59)).utc_total_offset) + assert_equal(-14400, tz.period_for_utc(DateTime.new(2004,4,4,7,0,0)).utc_total_offset) + assert_equal(-14400, tz.period_for_utc(DateTime.new(2004,10,31,5,59,59)).utc_total_offset) + assert_equal(-18000, tz.period_for_utc(DateTime.new(2004,10,31,6,0,0)).utc_total_offset) + + assert_equal(-18000, tz.period_for_local(DateTime.new(2004,4,4,1,59,59)).utc_total_offset) + assert_equal(-14400, tz.period_for_local(DateTime.new(2004,4,4,3,0,0)).utc_total_offset) + assert_equal(-14400, tz.period_for_local(DateTime.new(2004,10,31,1,59,59), true).utc_total_offset) + assert_equal(-18000, tz.period_for_local(DateTime.new(2004,10,31,1,59,59), false).utc_total_offset) + assert_equal(-14400, tz.period_for_local(DateTime.new(2004,10,31,1,0,0), true).utc_total_offset) + assert_equal(-18000, tz.period_for_local(DateTime.new(2004,10,31,1,0,0), false).utc_total_offset) + + transitions = tz.transitions_up_to(DateTime.new(2005,1,1,0,0,0), DateTime.new(2004,1,1,0,0,0)) + assert_equal(2, transitions.length) + assert_equal(TimeOrDateTime.new(DateTime.new(2004,4,4,7,0,0)), transitions[0].at) + assert_equal(TimezoneOffset.new(-18000, 0, :EST), transitions[0].previous_offset) + assert_equal(TimezoneOffset.new(-18000, 3600, :EDT), transitions[0].offset) + assert_equal(TimeOrDateTime.new(DateTime.new(2004,10,31,6,0,0)), transitions[1].at) + assert_equal(TimezoneOffset.new(-18000, 3600, :EDT), transitions[1].previous_offset) + assert_equal(TimezoneOffset.new(-18000, 0, :EST), transitions[1].offset) + + offsets = tz.offsets_up_to(DateTime.new(2005,1,1,0,0,0), DateTime.new(2004,1,1,0,0,0)) + assert_array_same_items([TimezoneOffset.new(-18000, 0, :EST), TimezoneOffset.new(-18000, 3600, :EDT)], offsets) + end + + def test_1957 + # This test cannot be run when using ZoneinfoDataSource on platforms + # that don't support Times before the epoch (i.e. Ruby < 1.9 on Windows) + # because it relates to the year 1957. + + if !DataSource.get.kind_of?(ZoneinfoDataSource) || RubyCoreSupport.time_supports_negative + #America/New_York Sun Apr 28 06:59:59 1957 UTC = Sun Apr 28 01:59:59 1957 EST isdst=0 gmtoff=-18000 + #America/New_York Sun Apr 28 07:00:00 1957 UTC = Sun Apr 28 03:00:00 1957 EDT isdst=1 gmtoff=-14400 + #America/New_York Sun Oct 27 05:59:59 1957 UTC = Sun Oct 27 01:59:59 1957 EDT isdst=1 gmtoff=-14400 + #America/New_York Sun Oct 27 06:00:00 1957 UTC = Sun Oct 27 01:00:00 1957 EST isdst=0 gmtoff=-18000 + + tz = Timezone.get('America/New_York') + assert_equal(DateTime.new(1957,4,28,1,59,59), tz.utc_to_local(DateTime.new(1957,4,28,6,59,59))) + assert_equal(DateTime.new(1957,4,28,3,0,0), tz.utc_to_local(DateTime.new(1957,4,28,7,0,0))) + assert_equal(DateTime.new(1957,10,27,1,59,59), tz.utc_to_local(DateTime.new(1957,10,27,5,59,59))) + assert_equal(DateTime.new(1957,10,27,1,0,0), tz.utc_to_local(DateTime.new(1957,10,27,6,0,0))) + + assert_equal(DateTime.new(1957,4,28,6,59,59), tz.local_to_utc(DateTime.new(1957,4,28,1,59,59))) + assert_equal(DateTime.new(1957,4,28,7,0,0), tz.local_to_utc(DateTime.new(1957,4,28,3,0,0))) + assert_equal(DateTime.new(1957,10,27,5,59,59), tz.local_to_utc(DateTime.new(1957,10,27,1,59,59), true)) + assert_equal(DateTime.new(1957,10,27,6,59,59), tz.local_to_utc(DateTime.new(1957,10,27,1,59,59), false)) + assert_equal(DateTime.new(1957,10,27,5,0,0), tz.local_to_utc(DateTime.new(1957,10,27,1,0,0), true)) + assert_equal(DateTime.new(1957,10,27,6,0,0), tz.local_to_utc(DateTime.new(1957,10,27,1,0,0), false)) + + assert_raises(PeriodNotFound) { tz.local_to_utc(DateTime.new(1957,4,28,2,0,0)) } + assert_raises(AmbiguousTime) { tz.local_to_utc(DateTime.new(1957,10,27,1,0,0)) } + + assert_equal(:EST, tz.period_for_utc(DateTime.new(1957,4,28,6,59,59)).zone_identifier) + assert_equal(:EDT, tz.period_for_utc(DateTime.new(1957,4,28,7,0,0)).zone_identifier) + assert_equal(:EDT, tz.period_for_utc(DateTime.new(1957,10,27,5,59,59)).zone_identifier) + assert_equal(:EST, tz.period_for_utc(DateTime.new(1957,10,27,6,0,0)).zone_identifier) + + assert_equal(:EST, tz.period_for_local(DateTime.new(1957,4,28,1,59,59)).zone_identifier) + assert_equal(:EDT, tz.period_for_local(DateTime.new(1957,4,28,3,0,0)).zone_identifier) + assert_equal(:EDT, tz.period_for_local(DateTime.new(1957,10,27,1,59,59), true).zone_identifier) + assert_equal(:EST, tz.period_for_local(DateTime.new(1957,10,27,1,59,59), false).zone_identifier) + assert_equal(:EDT, tz.period_for_local(DateTime.new(1957,10,27,1,0,0), true).zone_identifier) + assert_equal(:EST, tz.period_for_local(DateTime.new(1957,10,27,1,0,0), false).zone_identifier) + + assert_equal(-18000, tz.period_for_utc(DateTime.new(1957,4,28,6,59,59)).utc_total_offset) + assert_equal(-14400, tz.period_for_utc(DateTime.new(1957,4,28,7,0,0)).utc_total_offset) + assert_equal(-14400, tz.period_for_utc(DateTime.new(1957,10,27,5,59,59)).utc_total_offset) + assert_equal(-18000, tz.period_for_utc(DateTime.new(1957,10,27,6,0,0)).utc_total_offset) + + assert_equal(-18000, tz.period_for_local(DateTime.new(1957,4,28,1,59,59)).utc_total_offset) + assert_equal(-14400, tz.period_for_local(DateTime.new(1957,4,28,3,0,0)).utc_total_offset) + assert_equal(-14400, tz.period_for_local(DateTime.new(1957,10,27,1,59,59), true).utc_total_offset) + assert_equal(-18000, tz.period_for_local(DateTime.new(1957,10,27,1,59,59), false).utc_total_offset) + assert_equal(-14400, tz.period_for_local(DateTime.new(1957,10,27,1,0,0), true).utc_total_offset) + assert_equal(-18000, tz.period_for_local(DateTime.new(1957,10,27,1,0,0), false).utc_total_offset) + + transitions = tz.transitions_up_to(DateTime.new(1958,1,1,0,0,0), DateTime.new(1957,1,1,0,0,0)) + assert_equal(2, transitions.length) + assert_equal(TimeOrDateTime.new(DateTime.new(1957,4,28,7,0,0)), transitions[0].at) + assert_equal(TimezoneOffset.new(-18000, 0, :EST), transitions[0].previous_offset) + assert_equal(TimezoneOffset.new(-18000, 3600, :EDT), transitions[0].offset) + assert_equal(TimeOrDateTime.new(DateTime.new(1957,10,27,6,0,0)), transitions[1].at) + assert_equal(TimezoneOffset.new(-18000, 3600, :EDT), transitions[1].previous_offset) + assert_equal(TimezoneOffset.new(-18000, 0, :EST), transitions[1].offset) + + offsets = tz.offsets_up_to(DateTime.new(1958,1,1,0,0,0), DateTime.new(1957,1,1,0,0,0)) + assert_array_same_items([TimezoneOffset.new(-18000, 0, :EST), TimezoneOffset.new(-18000, 3600, :EDT)], offsets) + end + end + + def test_time_boundary + #America/New_York Sun Oct 26 06:00:00 1969 UTC = Sun Oct 26 01:00:00 1969 EST isdst=0 gmtoff=-18000 + #America/New_York Sun Apr 26 06:59:59 1970 UTC = Sun Apr 26 01:59:59 1970 EST isdst=0 gmtoff=-18000 + + tz = Timezone.get('America/New_York') + assert_equal(DateTime.new(1970,1,1,0,0,0), tz.utc_to_local(DateTime.new(1970,1,1,5,0,0))) + assert_equal(DateTime.new(1970,1,1,5,0,0), tz.local_to_utc(DateTime.new(1970,1,1,0,0,0))) + assert_equal(Time.utc(1970,1,1,0,0,0), tz.utc_to_local(Time.utc(1970,1,1,5,0,0))) + assert_equal(Time.utc(1970,1,1,5,0,0), tz.local_to_utc(Time.utc(1970,1,1,0,0,0))) + assert_equal(0, tz.utc_to_local(18000)) + assert_equal(18000, tz.local_to_utc(0)) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_offset.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_offset.rb new file mode 100644 index 000000000000..6e29e4de8713 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_offset.rb @@ -0,0 +1,126 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezoneOffset < Minitest::Test + + def test_utc_offset + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(-3600, 3600, :TEST2) + + assert_equal(18000, o1.utc_offset) + assert_equal(-3600, o2.utc_offset) + end + + def test_std_offset + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(-3600, 3600, :TEST2) + + assert_equal(0, o1.std_offset) + assert_equal(3600, o2.std_offset) + end + + def test_utc_total_offset + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(-3600, 3600, :TEST2) + + assert_equal(18000, o1.utc_total_offset) + assert_equal(0, o2.utc_total_offset) + end + + def test_abbreviation + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(-3600, 3600, :TEST2) + + assert_equal(:TEST, o1.abbreviation) + assert_equal(:TEST2, o2.abbreviation) + end + + def test_dst + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(-3600, 3600, :TEST2) + + assert_equal(false, o1.dst?) + assert_equal(true, o2.dst?) + end + + def test_to_local + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(-3600, 3600, :TEST2) + + assert_equal(1148949080, o1.to_local(1148931080)) + assert_equal(Time.utc(2006, 5, 30, 0, 31, 20), o1.to_local(Time.utc(2006, 5, 29, 19, 31, 20))) + assert_equal(Time.utc(2006, 5, 30, 0, 31, 20, 782000), o1.to_local(Time.utc(2006, 5, 29, 19, 31, 20, 782000))) + assert_equal(DateTime.new(2006, 5, 30, 0, 31, 20), o1.to_local(DateTime.new(2006, 5, 29, 19, 31, 20))) + assert_equal(DateTime.new(2006, 5, 30, 0, 31, 20 + Rational(782, 1000)), o1.to_local(DateTime.new(2006, 5, 29, 19, 31, 20 + Rational(782, 1000)))) + assert_equal(1148949080, o1.to_local(1148931080)) + assert(TimeOrDateTime.new(1148949080).eql?(o1.to_local(TimeOrDateTime.new(1148931080)))) + + assert_equal(1148931080, o2.to_local(1148931080)) + assert_equal(Time.utc(2006, 5, 29, 19, 31, 20), o2.to_local(Time.utc(2006, 5, 29, 19, 31, 20))) + assert_equal(Time.utc(2006, 5, 29, 19, 31, 20, 123000), o2.to_local(Time.utc(2006, 5, 29, 19, 31, 20, 123000))) + assert_equal(DateTime.new(2006, 5, 29, 19, 31, 20), o2.to_local(DateTime.new(2006, 5, 29, 19, 31, 20))) + assert_equal(DateTime.new(2006, 5, 29, 19, 31, 20 + Rational(123, 1000)), o2.to_local(DateTime.new(2006, 5, 29, 19, 31, 20 + Rational(123, 1000)))) + assert_equal(1148931080, o2.to_local(1148931080)) + assert(TimeOrDateTime.new(1148931080).eql?(o2.to_local(TimeOrDateTime.new(1148931080)))) + end + + def test_to_utc + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(-3600, 3600, :TEST2) + + assert_equal(1148913080, o1.to_utc(1148931080)) + assert_equal(Time.utc(2006, 5, 29, 14, 31, 20), o1.to_utc(Time.utc(2006, 5, 29, 19, 31, 20))) + assert_equal(Time.utc(2006, 5, 29, 14, 31, 20, 913000), o1.to_utc(Time.utc(2006, 5, 29, 19, 31, 20, 913000))) + assert_equal(DateTime.new(2006, 5, 29, 14, 31, 20), o1.to_utc(DateTime.new(2006, 5, 29, 19, 31, 20))) + assert_equal(DateTime.new(2006, 5, 29, 14, 31, 20 + Rational(913,1000)), o1.to_utc(DateTime.new(2006, 5, 29, 19, 31, 20 + Rational(913,1000)))) + assert_equal(1148913080, o1.to_utc(1148931080)) + assert(TimeOrDateTime.new(1148913080).eql?(o1.to_utc(TimeOrDateTime.new(1148931080)))) + + assert_equal(1148931080, o2.to_local(1148931080)) + assert_equal(Time.utc(2006, 5, 29, 19, 31, 20), o2.to_local(Time.utc(2006, 5, 29, 19, 31, 20))) + assert_equal(Time.utc(2006, 5, 29, 19, 31, 20, 323000), o2.to_local(Time.utc(2006, 5, 29, 19, 31, 20, 323000))) + assert_equal(DateTime.new(2006, 5, 29, 19, 31, 20), o2.to_local(DateTime.new(2006, 5, 29, 19, 31, 20))) + assert_equal(DateTime.new(2006, 5, 29, 19, 31, 20 + Rational(323, 1000)), o2.to_local(DateTime.new(2006, 5, 29, 19, 31, 20 + Rational(323, 1000)))) + assert_equal(1148931080, o2.to_utc(1148931080)) + assert(TimeOrDateTime.new(1148931080).eql?(o2.to_local(TimeOrDateTime.new(1148931080)))) + end + + def test_equality + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(18000, 0, :TEST) + o3 = TimezoneOffset.new(18001, 0, :TEST) + o4 = TimezoneOffset.new(18000, 1, :TEST) + o5 = TimezoneOffset.new(18000, 0, :TEST2) + + assert_equal(true, o1 == o1) + assert_equal(true, o1 == o2) + assert_equal(false, o1 == o3) + assert_equal(false, o1 == o4) + assert_equal(false, o1 == o5) + assert_equal(false, o1 == Object.new) + end + + def test_eql + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(18000, 0, :TEST) + o3 = TimezoneOffset.new(18001, 0, :TEST) + o4 = TimezoneOffset.new(18000, 1, :TEST) + o5 = TimezoneOffset.new(18000, 0, :TEST2) + + assert_equal(true, o1.eql?(o1)) + assert_equal(true, o1.eql?(o2)) + assert_equal(false, o1.eql?(o3)) + assert_equal(false, o1.eql?(o4)) + assert_equal(false, o1.eql?(o5)) + assert_equal(false, o1.eql?(Object.new)) + end + + def test_hash + o1 = TimezoneOffset.new(18000, 0, :TEST) + o2 = TimezoneOffset.new(-3600, 3600, :TEST2) + + assert_equal(18000.hash ^ 0.hash ^ :TEST.hash, o1.hash) + assert_equal(-3600.hash ^ 3600.hash ^ :TEST2.hash, o2.hash) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_period.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_period.rb new file mode 100644 index 000000000000..bcfb8d57a8cb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_period.rb @@ -0,0 +1,555 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezonePeriod < Minitest::Test + + class TestTimezoneTransition < TimezoneTransition + def initialize(offset, previous_offset, at) + super(offset, previous_offset) + @at = TimeOrDateTime.wrap(at) + end + + def at + @at + end + end + + def test_initialize_start_end + std = TimezoneOffset.new(-7200, 0, :TEST) + dst = TimezoneOffset.new(-7200, 3600, :TEST) + start_t = TestTimezoneTransition.new(dst, std, 1136073600) + end_t = TestTimezoneTransition.new(std, dst, 1136160000) + + p = TimezonePeriod.new(start_t, end_t) + + assert_same(start_t, p.start_transition) + assert_same(end_t, p.end_transition) + assert_same(dst, p.offset) + assert_equal(DateTime.new(2006,1,1,0,0,0), p.utc_start) + assert_equal(Time.utc(2006,1,1,0,0,0), p.utc_start_time) + assert_equal(DateTime.new(2006,1,2,0,0,0), p.utc_end) + assert_equal(Time.utc(2006,1,2,0,0,0), p.utc_end_time) + assert_equal(-7200, p.utc_offset) + assert_equal(3600, p.std_offset) + assert_equal(-3600, p.utc_total_offset) + assert_equal(Rational(-3600, 86400), p.utc_total_offset_rational) + assert_equal(:TEST, p.zone_identifier) + assert_equal(:TEST, p.abbreviation) + assert_equal(DateTime.new(2005,12,31,23,0,0), p.local_start) + assert_equal(Time.utc(2005,12,31,23,0,0), p.local_start_time) + assert_equal(DateTime.new(2006,1,1,23,0,0), p.local_end) + assert_equal(Time.utc(2006,1,1,23,0,0), p.local_end_time) + end + + def test_initialize_start_end_offset + std = TimezoneOffset.new(-7200, 0, :TEST) + dst = TimezoneOffset.new(-7200, 3600, :TEST) + special = TimezoneOffset.new(0, 0, :SPECIAL) + start_t = TestTimezoneTransition.new(dst, std, 1136073600) + end_t = TestTimezoneTransition.new(std, dst, 1136160000) + + assert_raises(ArgumentError) { TimezonePeriod.new(start_t, end_t, special) } + end + + def test_initialize_start + std = TimezoneOffset.new(-7200, 0, :TEST) + dst = TimezoneOffset.new(-7200, 3600, :TEST) + start_t = TestTimezoneTransition.new(dst, std, 1136073600) + + p = TimezonePeriod.new(start_t, nil) + + assert_same(start_t, p.start_transition) + assert_nil(p.end_transition) + assert_same(dst, p.offset) + assert_equal(DateTime.new(2006,1,1,0,0,0), p.utc_start) + assert_equal(Time.utc(2006,1,1,0,0,0), p.utc_start_time) + assert_nil(p.utc_end) + assert_nil(p.utc_end_time) + assert_equal(-7200, p.utc_offset) + assert_equal(3600, p.std_offset) + assert_equal(-3600, p.utc_total_offset) + assert_equal(Rational(-3600, 86400), p.utc_total_offset_rational) + assert_equal(:TEST, p.zone_identifier) + assert_equal(:TEST, p.abbreviation) + assert_equal(DateTime.new(2005,12,31,23,0,0), p.local_start) + assert_equal(Time.utc(2005,12,31,23,0,0), p.local_start_time) + assert_nil(p.local_end) + assert_nil(p.local_end_time) + end + + def test_initialize_start_offset + std = TimezoneOffset.new(-7200, 0, :TEST) + dst = TimezoneOffset.new(-7200, 3600, :TEST) + special = TimezoneOffset.new(0, 0, :SPECIAL) + start_t = TestTimezoneTransition.new(dst, std, 1136073600) + + assert_raises(ArgumentError) { TimezonePeriod.new(start_t, nil, special) } + end + + def test_initialize_end + std = TimezoneOffset.new(-7200, 0, :TEST) + dst = TimezoneOffset.new(-7200, 3600, :TEST) + end_t = TestTimezoneTransition.new(std, dst, 1136160000) + + p = TimezonePeriod.new(nil, end_t) + + assert_nil(p.start_transition) + assert_same(end_t, p.end_transition) + assert_same(dst, p.offset) + assert_nil(p.utc_start) + assert_nil(p.utc_start_time) + assert_equal(DateTime.new(2006,1,2,0,0,0), p.utc_end) + assert_equal(Time.utc(2006,1,2,0,0,0), p.utc_end_time) + assert_equal(-7200, p.utc_offset) + assert_equal(3600, p.std_offset) + assert_equal(-3600, p.utc_total_offset) + assert_equal(Rational(-3600, 86400), p.utc_total_offset_rational) + assert_equal(:TEST, p.zone_identifier) + assert_equal(:TEST, p.abbreviation) + assert_nil(p.local_start) + assert_nil(p.local_start_time) + assert_equal(DateTime.new(2006,1,1,23,0,0), p.local_end) + assert_equal(Time.utc(2006,1,1,23,0,0), p.local_end_time) + end + + def test_initialize_end_offset + std = TimezoneOffset.new(-7200, 0, :TEST) + dst = TimezoneOffset.new(-7200, 3600, :TEST) + special = TimezoneOffset.new(0, 0, :SPECIAL) + end_t = TestTimezoneTransition.new(std, dst, 1136160000) + + assert_raises(ArgumentError) { TimezonePeriod.new(nil, end_t, special) } + end + + def test_initialize + assert_raises(ArgumentError) { TimezonePeriod.new(nil, nil) } + end + + def test_initialize_offset + special = TimezoneOffset.new(0, 0, :SPECIAL) + + p = TimezonePeriod.new(nil, nil, special) + + assert_nil(p.start_transition) + assert_nil(p.end_transition) + assert_same(special, p.offset) + assert_nil(p.utc_start) + assert_nil(p.utc_start_time) + assert_nil(p.utc_end) + assert_nil(p.utc_end_time) + assert_equal(0, p.utc_offset) + assert_equal(0, p.std_offset) + assert_equal(0, p.utc_total_offset) + assert_equal(Rational(0, 86400), p.utc_total_offset_rational) + assert_equal(:SPECIAL, p.zone_identifier) + assert_equal(:SPECIAL, p.abbreviation) + assert_nil(p.local_start) + assert_nil(p.local_start_time) + assert_nil(p.local_end) + assert_nil(p.local_end_time) + end + + def test_utc_total_offset_rational_after_freeze + o = TimezoneOffset.new(3600, 0, :TEST) + p = TimezonePeriod.new(nil, nil, o) + p.freeze + assert_equal(Rational(1, 24), p.utc_total_offset_rational) + end + + def test_dst + p1 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(-14400, 3600, :TEST)) + p2 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(-14400, 0, :TEST)) + p3 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(-14400, -3600, :TEST)) + p4 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(-14400, 7200, :TEST)) + p5 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(-14400, -7200, :TEST)) + + assert_equal(true, p1.dst?) + assert_equal(false, p2.dst?) + assert_equal(true, p3.dst?) + assert_equal(true, p4.dst?) + assert_equal(true, p5.dst?) + end + + def test_valid_for_utc + offset = TimezoneOffset.new(-7200, 3600, :TEST) + t1 = TestTimezoneTransition.new(offset, offset, 1104541261) + t2 = TestTimezoneTransition.new(offset, offset, 1107309722) + t3 = TestTimezoneTransition.new(offset, offset, DateTime.new(1960, 1, 1, 1, 1, 1)) + t4 = TestTimezoneTransition.new(offset, offset, DateTime.new(1960, 2, 2, 2, 2, 2)) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(nil, t2) + p3 = TimezonePeriod.new(t1, nil) + p4 = TimezonePeriod.new(nil, nil, offset) + p5 = TimezonePeriod.new(t3, t4) + + assert_equal(true, p1.valid_for_utc?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p1.valid_for_utc?(Time.utc(2005,2,2,2,2,1))) + assert_equal(true, p1.valid_for_utc?(1104541262)) + assert_equal(true, p1.valid_for_utc?(DateTime.new(2005,2,2,2,2,0))) + assert_equal(false, p1.valid_for_utc?(DateTime.new(2005,1,1,1,1,0))) + assert_equal(false, p1.valid_for_utc?(DateTime.new(2005,2,2,2,2,3))) + assert_equal(false, p1.valid_for_utc?(DateTime.new(1960,1,1,1,1,0))) + assert_equal(false, p1.valid_for_utc?(DateTime.new(2040,1,1,1,1,0))) + + assert_equal(true, p2.valid_for_utc?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p2.valid_for_utc?(Time.utc(2005,2,2,2,2,1))) + assert_equal(true, p2.valid_for_utc?(1104541262)) + assert_equal(true, p2.valid_for_utc?(DateTime.new(2005,2,2,2,2,0))) + assert_equal(true, p2.valid_for_utc?(DateTime.new(2005,1,1,1,1,0))) + assert_equal(false, p2.valid_for_utc?(DateTime.new(2005,2,2,2,2,3))) + assert_equal(true, p2.valid_for_utc?(DateTime.new(1960,1,1,1,1,0))) + assert_equal(false, p2.valid_for_utc?(DateTime.new(2040,1,1,1,1,0))) + + assert_equal(true, p3.valid_for_utc?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p3.valid_for_utc?(Time.utc(2005,2,2,2,2,1))) + assert_equal(true, p3.valid_for_utc?(1104541262)) + assert_equal(true, p3.valid_for_utc?(DateTime.new(2005,2,2,2,2,0))) + assert_equal(false, p3.valid_for_utc?(DateTime.new(2005,1,1,1,1,0))) + assert_equal(true, p3.valid_for_utc?(DateTime.new(2005,2,2,2,2,3))) + assert_equal(false, p3.valid_for_utc?(DateTime.new(1960,1,1,1,1,0))) + assert_equal(true, p3.valid_for_utc?(DateTime.new(2040,1,1,1,1,0))) + + assert_equal(true, p4.valid_for_utc?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p4.valid_for_utc?(Time.utc(2005,2,2,2,2,1))) + assert_equal(true, p4.valid_for_utc?(1104541262)) + assert_equal(true, p4.valid_for_utc?(DateTime.new(2005,2,2,2,2,0))) + assert_equal(true, p4.valid_for_utc?(DateTime.new(2005,1,1,1,1,0))) + assert_equal(true, p4.valid_for_utc?(DateTime.new(2005,2,2,2,2,3))) + assert_equal(true, p4.valid_for_utc?(DateTime.new(1960,1,1,1,1,0))) + assert_equal(true, p4.valid_for_utc?(DateTime.new(2040,1,1,1,1,0))) + + assert_equal(false, p5.valid_for_utc?(Time.utc(2005,1,1,1,1,1))) + assert_equal(false, p5.valid_for_utc?(1104541262)) + end + + def test_utc_after_start + offset = TimezoneOffset.new(-7200, 3600, :TEST) + t1 = TestTimezoneTransition.new(offset, offset, 1104541261) + t2 = TestTimezoneTransition.new(offset, offset, 1107309722) + t3 = TestTimezoneTransition.new(offset, offset, DateTime.new(1945, 1, 1, 1, 1, 1)) + t4 = TestTimezoneTransition.new(offset, offset, DateTime.new(1945, 2, 2, 2, 2, 2)) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(nil, t2) + p3 = TimezonePeriod.new(t3, t4) + + assert_equal(true, p1.utc_after_start?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p1.utc_after_start?(Time.utc(2005,1,1,1,1,2))) + assert_equal(false, p1.utc_after_start?(1104541260)) + assert_equal(true, p1.utc_after_start?(DateTime.new(2045,1,1,1,1,0))) + assert_equal(false, p1.utc_after_start?(DateTime.new(1955,1,1,1,1,0))) + + assert_equal(true, p2.utc_after_start?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p2.utc_after_start?(Time.utc(2005,1,1,1,1,2))) + assert_equal(true, p2.utc_after_start?(1104541260)) + + assert_equal(true, p3.utc_after_start?(Time.utc(2005,1,2,1,1,1))) + assert_equal(true, p3.utc_after_start?(1104627661)) + end + + def test_utc_before_end + offset = TimezoneOffset.new(-7200, 3600, :TEST) + t1 = TestTimezoneTransition.new(offset, offset, 1104541261) + t2 = TestTimezoneTransition.new(offset, offset, 1107309722) + t3 = TestTimezoneTransition.new(offset, offset, DateTime.new(1945, 1, 1, 1, 1, 1)) + t4 = TestTimezoneTransition.new(offset, offset, DateTime.new(1945, 2, 2, 2, 2, 2)) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t1, nil) + p3 = TimezonePeriod.new(t3, t4) + + assert_equal(true, p1.utc_before_end?(DateTime.new(2005,2,2,2,2,1))) + assert_equal(true, p1.utc_before_end?(Time.utc(2005,2,2,2,2,0))) + assert_equal(false, p1.utc_before_end?(1107309723)) + assert_equal(false, p1.utc_before_end?(DateTime.new(2045,1,1,1,1,0))) + assert_equal(true, p1.utc_before_end?(DateTime.new(1955,1,1,1,1,0))) + + assert_equal(true, p2.utc_before_end?(DateTime.new(2005,2,2,2,2,1))) + assert_equal(true, p2.utc_before_end?(Time.utc(2005,2,2,2,2,0))) + assert_equal(true, p2.utc_before_end?(1107309723)) + + assert_equal(false, p3.utc_before_end?(Time.utc(2005,1,2,1,1,1))) + assert_equal(false, p3.utc_before_end?(1104627661)) + end + + def test_valid_for_local + offset = TimezoneOffset.new(-7200, 3600, :TEST) + t1 = TestTimezoneTransition.new(offset, offset, 1104544861) + t2 = TestTimezoneTransition.new(offset, offset, 1107313322) + t3 = TestTimezoneTransition.new(offset, offset, 1104544861) + t4 = TestTimezoneTransition.new(offset, offset, DateTime.new(1960, 1, 1, 1, 1, 1)) + t5 = TestTimezoneTransition.new(offset, offset, DateTime.new(1960, 2, 2, 2, 2, 2)) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(nil, t2) + p3 = TimezonePeriod.new(t3, nil) + p4 = TimezonePeriod.new(nil, nil, offset) + p5 = TimezonePeriod.new(t4, t5) + + assert_equal(true, p1.valid_for_local?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p1.valid_for_local?(Time.utc(2005,2,2,2,2,1))) + assert_equal(true, p1.valid_for_local?(1104541262)) + assert_equal(true, p1.valid_for_local?(DateTime.new(2005,2,2,2,2,0))) + assert_equal(false, p1.valid_for_local?(DateTime.new(2005,1,1,1,1,0))) + assert_equal(false, p1.valid_for_local?(DateTime.new(2005,2,2,2,2,3))) + assert_equal(false, p1.valid_for_local?(DateTime.new(1960,1,1,1,1,0))) + assert_equal(false, p1.valid_for_local?(DateTime.new(2040,1,1,1,1,0))) + + assert_equal(true, p2.valid_for_local?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p2.valid_for_local?(DateTime.new(2005,2,2,2,2,1))) + assert_equal(true, p2.valid_for_local?(1104541262)) + assert_equal(true, p2.valid_for_local?(DateTime.new(2005,2,2,2,2,0))) + assert_equal(true, p2.valid_for_local?(DateTime.new(2005,1,1,1,1,0))) + assert_equal(false, p2.valid_for_local?(DateTime.new(2005,2,2,2,2,3))) + assert_equal(true, p2.valid_for_local?(DateTime.new(1960,1,1,1,1,0))) + assert_equal(false, p2.valid_for_local?(DateTime.new(2040,1,1,1,1,0))) + + assert_equal(true, p3.valid_for_local?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p3.valid_for_local?(DateTime.new(2005,2,2,2,2,1))) + assert_equal(true, p3.valid_for_local?(1104541262)) + assert_equal(true, p3.valid_for_local?(DateTime.new(2005,2,2,2,2,0))) + assert_equal(false, p3.valid_for_local?(DateTime.new(2005,1,1,1,1,0))) + assert_equal(true, p3.valid_for_local?(DateTime.new(2005,2,2,2,2,3))) + assert_equal(false, p3.valid_for_local?(DateTime.new(1960,1,1,1,1,0))) + assert_equal(true, p3.valid_for_local?(DateTime.new(2040,1,1,1,1,0))) + + assert_equal(true, p4.valid_for_local?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p4.valid_for_local?(DateTime.new(2005,2,2,2,2,1))) + assert_equal(true, p4.valid_for_local?(1104541262)) + assert_equal(true, p4.valid_for_local?(DateTime.new(2005,2,2,2,2,0))) + assert_equal(true, p4.valid_for_local?(DateTime.new(2005,1,1,1,1,0))) + assert_equal(true, p4.valid_for_local?(DateTime.new(2005,2,2,2,2,3))) + assert_equal(true, p4.valid_for_local?(DateTime.new(1960,1,1,1,1,0))) + assert_equal(true, p4.valid_for_local?(DateTime.new(2040,1,1,1,1,0))) + + assert_equal(false, p5.valid_for_utc?(Time.utc(2005,1,1,1,1,1))) + assert_equal(false, p5.valid_for_utc?(1104541262)) + end + + def test_local_after_start + offset = TimezoneOffset.new(-7200, 3600, :TEST) + t1 = TestTimezoneTransition.new(offset, offset, 1104544861) + t2 = TestTimezoneTransition.new(offset, offset, 1107313322) + t3 = TestTimezoneTransition.new(offset, offset, DateTime.new(1945, 1, 1, 1, 1, 1)) + t4 = TestTimezoneTransition.new(offset, offset, DateTime.new(1945, 2, 2, 2, 2, 2)) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(nil, t2) + p3 = TimezonePeriod.new(t3, t4) + + assert_equal(true, p1.local_after_start?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p1.local_after_start?(Time.utc(2005,1,1,1,1,2))) + assert_equal(false, p1.local_after_start?(1104541260)) + assert_equal(true, p1.local_after_start?(DateTime.new(2045,1,1,1,1,0))) + assert_equal(false, p1.local_after_start?(DateTime.new(1955,1,1,1,1,0))) + + assert_equal(true, p2.local_after_start?(DateTime.new(2005,1,1,1,1,1))) + assert_equal(true, p2.local_after_start?(Time.utc(2005,1,1,1,1,2))) + assert_equal(true, p2.local_after_start?(1104541260)) + + assert_equal(true, p3.local_after_start?(Time.utc(2005,1,2,1,1,1))) + assert_equal(true, p3.local_after_start?(1104627661)) + end + + def test_local_before_end + offset = TimezoneOffset.new(-7200, 3600, :TEST) + t1 = TestTimezoneTransition.new(offset, offset, 1104544861) + t2 = TestTimezoneTransition.new(offset, offset, 1107313322) + t3 = TestTimezoneTransition.new(offset, offset, DateTime.new(1945, 1, 1, 1, 1, 1)) + t4 = TestTimezoneTransition.new(offset, offset, DateTime.new(1945, 2, 2, 2, 2, 2)) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t1, nil) + p3 = TimezonePeriod.new(t3, t4) + + assert_equal(true, p1.local_before_end?(DateTime.new(2005,2,2,2,2,1))) + assert_equal(true, p1.local_before_end?(Time.utc(2005,2,2,2,2,0))) + assert_equal(false, p1.local_before_end?(1107309723)) + assert_equal(false, p1.local_before_end?(DateTime.new(2045,1,1,1,1,0))) + assert_equal(true, p1.local_before_end?(DateTime.new(1955,1,1,1,1,0))) + + assert_equal(true, p2.local_before_end?(DateTime.new(2005,2,2,2,2,1))) + assert_equal(true, p2.local_before_end?(Time.utc(2005,2,2,2,2,0))) + assert_equal(true, p2.local_before_end?(1107309723)) + + assert_equal(false, p3.local_before_end?(Time.utc(2005,1,2,1,1,1))) + assert_equal(false, p3.local_before_end?(1104627661)) + end + + def test_to_local + p1 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(-14400, 3600, :TEST)) + p2 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(-14400, 0, :TEST)) + p3 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(7200, 3600, :TEST)) + + assert_equal(DateTime.new(2005,1,19,22,0,0), p1.to_local(DateTime.new(2005,1,20,1,0,0))) + assert_equal(DateTime.new(2005,1,19,22,0,0 + Rational(512,1000)), p1.to_local(DateTime.new(2005,1,20,1,0,0 + Rational(512,1000)))) + assert_equal(Time.utc(2005,1,19,21,0,0), p2.to_local(Time.utc(2005,1,20,1,0,0))) + assert_equal(Time.utc(2005,1,19,21,0,0,512000), p2.to_local(Time.utc(2005,1,20,1,0,0,512000))) + assert_equal(1106193600, p3.to_local(1106182800)) + end + + def test_to_utc + p1 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(-14400, 3600, :TEST)) + p2 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(-14400, 0, :TEST)) + p3 = TimezonePeriod.new(nil, nil, TimezoneOffset.new(7200, 3600, :TEST)) + + assert_equal(DateTime.new(2005,1,20,4,0,0), p1.to_utc(DateTime.new(2005,1,20,1,0,0))) + assert_equal(DateTime.new(2005,1,20,4,0,0 + Rational(571,1000)), p1.to_utc(DateTime.new(2005,1,20,1,0,0 + Rational(571,1000)))) + assert_equal(Time.utc(2005,1,20,5,0,0), p2.to_utc(Time.utc(2005,1,20,1,0,0))) + assert_equal(Time.utc(2005,1,20,5,0,0,571000), p2.to_utc(Time.utc(2005,1,20,1,0,0,571000))) + assert_equal(1106172000, p3.to_utc(1106182800)) + end + + def test_time_boundary_start + o1 = TimezoneOffset.new(-3600, 0, :TEST) + o2 = TimezoneOffset.new(-3600, 3600, :TEST) + t1 = TestTimezoneTransition.new(o1, o2, 0) + + p1 = TimezonePeriod.new(t1, nil) + + assert_equal(DateTime.new(1969,12,31,23,0,0), p1.local_start) + + # Conversion to Time will fail on systems that don't support negative times. + if RubyCoreSupport.time_supports_negative + assert_equal(Time.utc(1969,12,31,23,0,0), p1.local_start_time) + end + end + + def test_time_boundary_end + o1 = TimezoneOffset.new(0, 3600, :TEST) + o2 = TimezoneOffset.new(0, 0, :TEST) + t1 = TestTimezoneTransition.new(o2, o1, 2147482800) + + p1 = TimezonePeriod.new(nil, t1) + + assert_equal(DateTime.new(2038,1,19,4,0,0), p1.local_end) + + # Conversion to Time will fail on systems that don't support 64-bit times + if RubyCoreSupport.time_supports_64bit + assert_equal(Time.utc(2038,1,19,4,0,0), p1.local_end_time) + end + end + + def test_equality + o1 = TimezoneOffset.new(0, 3600, :TEST) + o2 = TimezoneOffset.new(0, 0, :TEST) + t1 = TestTimezoneTransition.new(o1, o2, 1149368400) + t2 = TestTimezoneTransition.new(o1, o2, DateTime.new(2006, 6, 3, 21, 0, 0)) + t3 = TestTimezoneTransition.new(o1, o2, 1149454800) + t4 = TestTimezoneTransition.new(o1, o2, 1149541200) + + p1 = TimezonePeriod.new(t1, t3) + p2 = TimezonePeriod.new(t1, t3) + p3 = TimezonePeriod.new(t2, t3) + p4 = TimezonePeriod.new(t3, nil) + p5 = TimezonePeriod.new(t3, nil) + p6 = TimezonePeriod.new(t4, nil) + p7 = TimezonePeriod.new(nil, t3) + p8 = TimezonePeriod.new(nil, t3) + p9 = TimezonePeriod.new(nil, t4) + p10 = TimezonePeriod.new(nil, nil, o1) + p11 = TimezonePeriod.new(nil, nil, o1) + p12 = TimezonePeriod.new(nil, nil, o2) + + assert_equal(true, p1 == p1) + assert_equal(true, p1 == p2) + assert_equal(true, p1 == p3) + assert_equal(false, p1 == p4) + assert_equal(false, p1 == p5) + assert_equal(false, p1 == p6) + assert_equal(false, p1 == p7) + assert_equal(false, p1 == p8) + assert_equal(false, p1 == p9) + assert_equal(false, p1 == p10) + assert_equal(false, p1 == p11) + assert_equal(false, p1 == p12) + assert_equal(false, p1 == Object.new) + + assert_equal(true, p4 == p4) + assert_equal(true, p4 == p5) + assert_equal(false, p4 == p6) + assert_equal(false, p4 == Object.new) + + assert_equal(true, p7 == p7) + assert_equal(true, p7 == p8) + assert_equal(false, p7 == p9) + assert_equal(false, p7 == Object.new) + + assert_equal(true, p10 == p10) + assert_equal(true, p10 == p11) + assert_equal(false, p10 == p12) + assert_equal(false, p10 == Object.new) + end + + def test_eql + o1 = TimezoneOffset.new(0, 3600, :TEST) + o2 = TimezoneOffset.new(0, 0, :TEST) + t1 = TestTimezoneTransition.new(o1, o2, 1149368400) + t2 = TestTimezoneTransition.new(o1, o2, DateTime.new(2006, 6, 3, 21, 0, 0)) + t3 = TestTimezoneTransition.new(o1, o2, 1149454800) + t4 = TestTimezoneTransition.new(o1, o2, 1149541200) + + p1 = TimezonePeriod.new(t1, t3) + p2 = TimezonePeriod.new(t1, t3) + p3 = TimezonePeriod.new(t2, t3) + p4 = TimezonePeriod.new(t3, nil) + p5 = TimezonePeriod.new(t3, nil) + p6 = TimezonePeriod.new(t4, nil) + p7 = TimezonePeriod.new(nil, t3) + p8 = TimezonePeriod.new(nil, t3) + p9 = TimezonePeriod.new(nil, t4) + p10 = TimezonePeriod.new(nil, nil, o1) + p11 = TimezonePeriod.new(nil, nil, o1) + p12 = TimezonePeriod.new(nil, nil, o2) + + assert_equal(true, p1.eql?(p1)) + assert_equal(true, p1.eql?(p2)) + assert_equal(false, p1.eql?(p3)) + assert_equal(false, p1.eql?(p4)) + assert_equal(false, p1.eql?(p5)) + assert_equal(false, p1.eql?(p6)) + assert_equal(false, p1.eql?(p7)) + assert_equal(false, p1.eql?(p8)) + assert_equal(false, p1.eql?(p9)) + assert_equal(false, p1.eql?(p10)) + assert_equal(false, p1.eql?(p11)) + assert_equal(false, p1.eql?(p12)) + assert_equal(false, p1.eql?(Object.new)) + + assert_equal(true, p4.eql?(p4)) + assert_equal(true, p4.eql?(p5)) + assert_equal(false, p4.eql?(p6)) + assert_equal(false, p4.eql?(Object.new)) + + assert_equal(true, p7.eql?(p7)) + assert_equal(true, p7.eql?(p8)) + assert_equal(false, p7.eql?(p9)) + assert_equal(false, p7.eql?(Object.new)) + + assert_equal(true, p10.eql?(p10)) + assert_equal(true, p10.eql?(p11)) + assert_equal(false, p10.eql?(p12)) + assert_equal(false, p10.eql?(Object.new)) + end + + def test_hash + o1 = TimezoneOffset.new(0, 3600, :TEST) + o2 = TimezoneOffset.new(0, 0, :TEST) + t1 = TestTimezoneTransition.new(o1, o2, 1149368400) + t2 = TestTimezoneTransition.new(o1, o2, DateTime.new(2006, 6, 3, 21, 0, 0)) + t3 = TestTimezoneTransition.new(o1, o2, 1149454800) + t4 = TestTimezoneTransition.new(o1, o2, 1149541200) + + p1 = TimezonePeriod.new(t1, t3) + p2 = TimezonePeriod.new(t2, nil) + p3 = TimezonePeriod.new(nil, t4) + p4 = TimezonePeriod.new(nil, nil, o1) + + assert_equal(t1.hash ^ t3.hash, p1.hash) + assert_equal(t2.hash ^ nil.hash, p2.hash) + assert_equal(nil.hash ^ t4.hash, p3.hash) + assert_equal(nil.hash ^ nil.hash ^ o1.hash, p4.hash) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_proxy.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_proxy.rb new file mode 100644 index 000000000000..22ba3d4c2b41 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_proxy.rb @@ -0,0 +1,136 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezoneProxy < Minitest::Test + def test_not_exist + proxy = TimezoneProxy.new('Nothing/Special') + t = Time.utc(2006,1,1,0,0,0) + assert_equal('Nothing/Special', proxy.identifier) + assert_equal('Nothing/Special', proxy.name) + assert_equal('Nothing - Special', proxy.friendly_identifier) + assert_equal('Nothing - Special', proxy.to_s) + + assert_raises(InvalidTimezoneIdentifier) { proxy.canonical_identifier } + assert_raises(InvalidTimezoneIdentifier) { proxy.canonical_zone } + assert_raises(InvalidTimezoneIdentifier) { proxy.current_period } + assert_raises(InvalidTimezoneIdentifier) { proxy.current_period_and_time } + assert_raises(InvalidTimezoneIdentifier) { proxy.current_time_and_period } + assert_raises(InvalidTimezoneIdentifier) { proxy.local_to_utc(t) } + assert_raises(InvalidTimezoneIdentifier) { proxy.now } + assert_raises(InvalidTimezoneIdentifier) { proxy.offsets_up_to(t) } + assert_raises(InvalidTimezoneIdentifier) { proxy.period_for_local(t) } + assert_raises(InvalidTimezoneIdentifier) { proxy.period_for_utc(t) } + assert_raises(InvalidTimezoneIdentifier) { proxy.periods_for_local(t) } + assert_raises(InvalidTimezoneIdentifier) { proxy.strftime('%Z', t) } + assert_raises(InvalidTimezoneIdentifier) { proxy.transitions_up_to(t) } + assert_raises(InvalidTimezoneIdentifier) { proxy.utc_to_local(t) } + end + + def test_valid + proxy = TimezoneProxy.new('Europe/London') + real = Timezone.get('Europe/London') + + t1 = Time.utc(2005,8,1,0,0,0) + t2 = Time.utc(2004,8,1,0,0,0) + + assert_equal(real.canonical_identifier, proxy.canonical_identifier) + assert_same(real.canonical_zone, proxy.canonical_zone) + assert_nothing_raised { proxy.current_period } + assert_nothing_raised { proxy.current_period_and_time } + assert_nothing_raised { proxy.current_time_and_period } + assert_equal(real.friendly_identifier(true), proxy.friendly_identifier(true)) + assert_equal(real.friendly_identifier(false), proxy.friendly_identifier(false)) + assert_equal(real.friendly_identifier, proxy.friendly_identifier) + assert_equal(real.identifier, proxy.identifier) + assert_equal(real.local_to_utc(t1), proxy.local_to_utc(t1)) + assert_equal(real.name, proxy.name) + assert_nothing_raised { proxy.now } + assert_equal(real.offsets_up_to(t1), proxy.offsets_up_to(t1)) + assert_equal(real.offsets_up_to(t1, t2), proxy.offsets_up_to(t1, t2)) + assert_equal(real.period_for_local(t1), proxy.period_for_local(t1)) + assert_equal(real.period_for_utc(t1), proxy.period_for_utc(t1)) + assert_equal(real.periods_for_local(t1), proxy.periods_for_local(t1)) + assert_equal(real.strftime('%Z', t1), proxy.strftime('%Z', t1)) + assert_equal(real.to_s, proxy.to_s) + assert_equal(real.transitions_up_to(t1), proxy.transitions_up_to(t1)) + assert_equal(real.transitions_up_to(t1, t2), proxy.transitions_up_to(t1, t2)) + assert_equal(real.utc_to_local(t1), proxy.utc_to_local(t1)) + + + assert(real == proxy) + assert(proxy == real) + assert_equal(0, real <=> proxy) + assert_equal(0, proxy <=> real) + end + + def test_canonical_linked + # Test that the implementation of canonical_zone and canonical_identifier + # are actually calling the real timezone and not just returning it and + # its identifier. + + real = Timezone.get('UTC') + proxy = TimezoneProxy.new('UTC') + + # ZoneinfoDataSource doesn't return LinkedTimezoneInfo instances for any + # timezone. + if real.kind_of?(LinkedTimezone) + assert_equal('Etc/UTC', proxy.canonical_identifier) + assert_same(Timezone.get('Etc/UTC'), proxy.canonical_zone) + else + if DataSource.get.kind_of?(RubyDataSource) + # Not got a LinkedTimezone despite using a DataSource that supports it. + # Raise an exception as this shouldn't happen. + raise 'Non-LinkedTimezone instance returned for UTC using RubyDataSource' + end + + assert_equal('UTC', proxy.canonical_identifier) + assert_same(Timezone.get('UTC'), proxy.canonical_zone) + end + end + + def test_after_freeze + proxy = TimezoneProxy.new('Europe/London') + real = Timezone.get('Europe/London') + t = Time.utc(2017, 6, 1) + proxy.freeze + assert_equal('Europe/London', proxy.identifier) + assert_equal(real.utc_to_local(t), proxy.utc_to_local(t)) + end + + def test_equals + assert_equal(true, TimezoneProxy.new('Europe/London') == TimezoneProxy.new('Europe/London')) + assert_equal(false, TimezoneProxy.new('Europe/London') == TimezoneProxy.new('Europe/Paris')) + assert(!(TimezoneProxy.new('Europe/London') == Object.new)) + end + + def test_compare + assert_equal(0, TimezoneProxy.new('Europe/London') <=> TimezoneProxy.new('Europe/London')) + assert_equal(0, Timezone.get('Europe/London') <=> TimezoneProxy.new('Europe/London')) + assert_equal(0, TimezoneProxy.new('Europe/London') <=> Timezone.get('Europe/London')) + assert_equal(-1, TimezoneProxy.new('Europe/London') <=> TimezoneProxy.new('Europe/Paris')) + assert_equal(-1, Timezone.get('Europe/London') <=> TimezoneProxy.new('Europe/Paris')) + assert_equal(-1, TimezoneProxy.new('Europe/London') <=> Timezone.get('Europe/Paris')) + assert_equal(1, TimezoneProxy.new('Europe/Paris') <=> TimezoneProxy.new('Europe/London')) + assert_equal(1, Timezone.get('Europe/Paris') <=> TimezoneProxy.new('Europe/London')) + assert_equal(1, TimezoneProxy.new('Europe/Paris') <=> Timezone.get('Europe/London')) + assert_equal(-1, TimezoneProxy.new('America/New_York') <=> TimezoneProxy.new('Europe/Paris')) + assert_equal(-1, Timezone.get('America/New_York') <=> TimezoneProxy.new('Europe/Paris')) + assert_equal(-1, TimezoneProxy.new('America/New_York') <=> Timezone.get('Europe/Paris')) + assert_equal(1, TimezoneProxy.new('Europe/Paris') <=> TimezoneProxy.new('America/New_York')) + assert_equal(1, Timezone.get('Europe/Paris') <=> TimezoneProxy.new('America/New_York')) + assert_equal(1, TimezoneProxy.new('Europe/Paris') <=> Timezone.get('America/New_York')) + end + + def test_kind + assert_kind_of(Timezone, TimezoneProxy.new('America/New_York')) + end + + def test_marshal + tp = TimezoneProxy.new('Europe/London') + tp2 = Marshal.load(Marshal.dump(tp)) + + assert_kind_of(TimezoneProxy, tp2) + assert_equal('Europe/London', tp2.identifier) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_transition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_transition.rb new file mode 100644 index 000000000000..3dba51820442 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_transition.rb @@ -0,0 +1,366 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') +require 'date' + +include TZInfo + +class TCTimezoneTransition < Minitest::Test + + class TestTimezoneTransition < TimezoneTransition + def initialize(offset, previous_offset, at) + super(offset, previous_offset) + @at = TimeOrDateTime.wrap(at) + end + + def at + @at + end + end + + def test_offset + t = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + + assert_equal(TimezoneOffset.new(3600, 3600, :TDT), t.offset) + end + + def test_previous_offset + t = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + + assert_equal(TimezoneOffset.new(3600, 0, :TST), t.previous_offset) + end + + def test_datetime + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + + assert_equal(DateTime.new(2006, 5, 30, 0, 31, 20), t1.datetime) + assert_equal(DateTime.new(2006, 5, 30, 0, 31, 20), t2.datetime) + assert_equal(DateTime.new(2006, 5, 30, 0, 31, 20), t3.datetime) + end + + def test_time + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + + assert_equal(Time.utc(2006, 5, 30, 0, 31, 20), t1.time) + assert_equal(Time.utc(2006, 5, 30, 0, 31, 20), t2.time) + assert_equal(Time.utc(2006, 5, 30, 0, 31, 20), t3.time) + end + + def test_local_end_at + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + + assert(TimeOrDateTime.new(1148952680).eql?(t1.local_end_at)) + assert(TimeOrDateTime.new(DateTime.new(2006, 5, 30, 1, 31, 20)).eql?(t2.local_end_at)) + assert(TimeOrDateTime.new(Time.utc(2006, 5, 30, 1, 31, 20)).eql?(t3.local_end_at)) + end + + def test_local_end_at_after_freeze + t = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t.freeze + assert(TimeOrDateTime.new(1148952680).eql?(t.local_end_at)) + end + + def test_local_end + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + + assert_equal(DateTime.new(2006, 5, 30, 1, 31, 20), t1.local_end) + assert_equal(DateTime.new(2006, 5, 30, 1, 31, 20), t2.local_end) + assert_equal(DateTime.new(2006, 5, 30, 1, 31, 20), t3.local_end) + end + + def test_local_end_time + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + + assert_equal(Time.utc(2006, 5, 30, 1, 31, 20), t1.local_end_time) + assert_equal(Time.utc(2006, 5, 30, 1, 31, 20), t2.local_end_time) + assert_equal(Time.utc(2006, 5, 30, 1, 31, 20), t3.local_end_time) + end + + def test_local_start_at + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + + assert(TimeOrDateTime.new(1148956280).eql?(t1.local_start_at)) + assert(TimeOrDateTime.new(DateTime.new(2006, 5, 30, 2, 31, 20)).eql?(t2.local_start_at)) + assert(TimeOrDateTime.new(Time.utc(2006, 5, 30, 2, 31, 20)).eql?(t3.local_start_at)) + end + + def test_local_start_at_after_freeze + t = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t.freeze + assert(TimeOrDateTime.new(1148956280).eql?(t.local_start_at)) + end + + def test_local_start + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + + assert_equal(DateTime.new(2006, 5, 30, 2, 31, 20), t1.local_start) + assert_equal(DateTime.new(2006, 5, 30, 2, 31, 20), t2.local_start) + assert_equal(DateTime.new(2006, 5, 30, 2, 31, 20), t3.local_start) + end + + def test_local_start_time + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + + assert_equal(Time.utc(2006, 5, 30, 2, 31, 20), t1.local_start_time) + assert_equal(Time.utc(2006, 5, 30, 2, 31, 20), t2.local_start_time) + assert_equal(Time.utc(2006, 5, 30, 2, 31, 20), t3.local_start_time) + end + + if RubyCoreSupport.time_supports_negative + def test_local_end_at_before_negative_32bit + t = TestTimezoneTransition.new(TimezoneOffset.new(-7200, 3600, :TDT), + TimezoneOffset.new(-7200, 0, :TST), -2147482800) + + if RubyCoreSupport.time_supports_64bit + assert(TimeOrDateTime.new(-2147490000).eql?(t.local_end_at)) + else + assert(TimeOrDateTime.new(DateTime.new(1901, 12, 13, 19, 0, 0)).eql?(t.local_end_at)) + end + end + + def test_local_start_at_before_negative_32bit + t = TestTimezoneTransition.new(TimezoneOffset.new(-7200, 3600, :TDT), + TimezoneOffset.new(-7200, 0, :TST), -2147482800) + + if RubyCoreSupport.time_supports_64bit + assert(TimeOrDateTime.new(-2147486400).eql?(t.local_start_at)) + else + assert(TimeOrDateTime.new(DateTime.new(1901, 12, 13, 20, 0, 0)).eql?(t.local_start_at)) + end + end + end + + def test_local_end_at_before_epoch + t = TestTimezoneTransition.new(TimezoneOffset.new(-7200, 3600, :TDT), + TimezoneOffset.new(-7200, 0, :TST), 1800) + + if RubyCoreSupport.time_supports_negative + assert(TimeOrDateTime.new(-5400).eql?(t.local_end_at)) + else + assert(TimeOrDateTime.new(DateTime.new(1969, 12, 31, 22, 30, 0)).eql?(t.local_end_at)) + end + end + + def test_local_start_at_before_epoch + t = TestTimezoneTransition.new(TimezoneOffset.new(-7200, 3600, :TDT), + TimezoneOffset.new(-7200, 0, :TST), 1800) + + if RubyCoreSupport.time_supports_negative + assert(TimeOrDateTime.new(-1800).eql?(t.local_start_at)) + else + assert(TimeOrDateTime.new(DateTime.new(1969, 12, 31, 23, 30, 0)).eql?(t.local_start_at)) + end + end + + def test_local_end_at_after_32bit + t = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 2147482800) + + if RubyCoreSupport.time_supports_64bit + assert(TimeOrDateTime.new(2147486400).eql?(t.local_end_at)) + else + assert(TimeOrDateTime.new(DateTime.new(2038, 1, 19, 4, 0, 0)).eql?(t.local_end_at)) + end + end + + def test_local_start_at_after_32bit + t = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 2147482800) + + if RubyCoreSupport.time_supports_64bit + assert(TimeOrDateTime.new(2147490000).eql?(t.local_start_at)) + else + assert(TimeOrDateTime.new(DateTime.new(2038, 1, 19, 5, 0, 0)).eql?(t.local_start_at)) + end + end + + def test_equality_timestamp + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t4 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + t5 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949081) + t6 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 1, 31, 21)) + t7 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 1, 31, 21)) + t8 = TestTimezoneTransition.new(TimezoneOffset.new(3601, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t9 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3601, 0, :TST), 1148949080) + + assert_equal(true, t1 == t1) + assert_equal(true, t1 == t2) + assert_equal(true, t1 == t3) + assert_equal(true, t1 == t4) + assert_equal(false, t1 == t5) + assert_equal(false, t1 == t6) + assert_equal(false, t1 == t7) + assert_equal(false, t1 == t8) + assert_equal(false, t1 == t9) + assert_equal(false, t1 == Object.new) + + assert_equal(true, t1.eql?(t1)) + assert_equal(true, t1.eql?(t2)) + assert_equal(false, t1.eql?(t3)) + assert_equal(false, t1.eql?(t4)) + assert_equal(false, t1.eql?(t5)) + assert_equal(false, t1.eql?(t6)) + assert_equal(false, t1.eql?(t7)) + assert_equal(false, t1.eql?(t8)) + assert_equal(false, t1.eql?(t9)) + assert_equal(false, t1.eql?(Object.new)) + end + + def test_equality_datetime + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t4 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + t5 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 1, 31, 21)) + t6 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949081) + t7 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 1, 31, 21)) + t8 = TestTimezoneTransition.new(TimezoneOffset.new(3601, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t9 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3601, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + + assert_equal(true, t1 == t1) + assert_equal(true, t1 == t2) + assert_equal(true, t1 == t3) + assert_equal(true, t1 == t4) + assert_equal(false, t1 == t5) + assert_equal(false, t1 == t6) + assert_equal(false, t1 == t7) + assert_equal(false, t1 == t8) + assert_equal(false, t1 == t9) + assert_equal(false, t1 == Object.new) + + assert_equal(true, t1.eql?(t1)) + assert_equal(true, t1.eql?(t2)) + assert_equal(false, t1.eql?(t3)) + assert_equal(false, t1.eql?(t4)) + assert_equal(false, t1.eql?(t5)) + assert_equal(false, t1.eql?(t6)) + assert_equal(false, t1.eql?(t7)) + assert_equal(false, t1.eql?(t8)) + assert_equal(false, t1.eql?(t9)) + assert_equal(false, t1.eql?(Object.new)) + end + + def test_equality_time + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 0, 31, 20)) + t4 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t5 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), Time.utc(2006, 5, 30, 0, 31, 21)) + t6 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), DateTime.new(2006, 5, 30, 1, 31, 21)) + t7 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949081) + t8 = TestTimezoneTransition.new(TimezoneOffset.new(3601, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t9 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3601, 0, :TST), 1148949080) + + assert_equal(true, t1 == t1) + assert_equal(true, t1 == t2) + assert_equal(true, t1 == t3) + assert_equal(true, t1 == t4) + assert_equal(false, t1 == t5) + assert_equal(false, t1 == t6) + assert_equal(false, t1 == t7) + assert_equal(false, t1 == t8) + assert_equal(false, t1 == t9) + assert_equal(false, t1 == Object.new) + + assert_equal(true, t1.eql?(t1)) + assert_equal(true, t1.eql?(t2)) + assert_equal(false, t1.eql?(t3)) + assert_equal(false, t1.eql?(t4)) + assert_equal(false, t1.eql?(t5)) + assert_equal(false, t1.eql?(t6)) + assert_equal(false, t1.eql?(t7)) + assert_equal(false, t1.eql?(t8)) + assert_equal(false, t1.eql?(t9)) + assert_equal(false, t1.eql?(Object.new)) + end + + def test_hash + t1 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDTA), + TimezoneOffset.new(3600, 0, :TSTA), 1148949080) + t2 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDTB), + TimezoneOffset.new(3600, 0, :TSTB), DateTime.new(2006, 5, 30, 1, 31, 20)) + t3 = TestTimezoneTransition.new(TimezoneOffset.new(3600, 3600, :TDTC), + TimezoneOffset.new(3600, 0, :TSTC), Time.utc(2006, 5, 30, 1, 31, 20)) + + assert_equal(TimezoneOffset.new(3600, 3600, :TDTA).hash ^ + TimezoneOffset.new(3600, 0, :TSTA).hash ^ TimeOrDateTime.new(1148949080).hash, + t1.hash) + assert_equal(TimezoneOffset.new(3600, 3600, :TDTB).hash ^ + TimezoneOffset.new(3600, 0, :TSTB).hash ^ TimeOrDateTime.new(DateTime.new(2006, 5, 30, 1, 31, 20)).hash, + t2.hash) + assert_equal(TimezoneOffset.new(3600, 3600, :TDTC).hash ^ + TimezoneOffset.new(3600, 0, :TSTC).hash ^ TimeOrDateTime.new(Time.utc(2006, 5, 30, 1, 31, 20)).hash, + t3.hash) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_transition_definition.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_transition_definition.rb new file mode 100644 index 000000000000..b66233b2a135 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_transition_definition.rb @@ -0,0 +1,295 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') +require 'date' + +include TZInfo + +class TCTimezoneTransitionDefinition < Minitest::Test + def test_initialize_timestamp_only + assert_nothing_raised do + TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + end + end + + def test_initialize_timestamp_and_datetime + assert_nothing_raised do + TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080, 5300392727, 2160) + end + end + + def test_initialize_datetime_only + assert_nothing_raised do + TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 5300392727, 2160) + end + end + + def test_at + t1 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 5300392727, 2160) + t3 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080, 5300392727, 2160) + + assert(TimeOrDateTime.new(1148949080).eql?(t1.at)) + assert(TimeOrDateTime.new(DateTime.new(2006, 5, 30, 0, 31, 20)).eql?(t2.at)) + assert(TimeOrDateTime.new(1148949080).eql?(t3.at)) + end + + def test_at_before_negative_32_bit + t = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -2147483649, 69573092117, 28800) + + if RubyCoreSupport.time_supports_negative && RubyCoreSupport.time_supports_64bit + assert(TimeOrDateTime.new(-2147483649).eql?(t.at)) + else + assert(TimeOrDateTime.new(DateTime.new(1901, 12, 13, 20, 45, 51)).eql?(t.at)) + end + end + + def test_at_before_epoch + t = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -1, 210866759999, 86400) + + if RubyCoreSupport.time_supports_negative + assert(TimeOrDateTime.new(-1).eql?(t.at)) + else + assert(TimeOrDateTime.new(DateTime.new(1969, 12, 31, 23, 59, 59)).eql?(t.at)) + end + end + + def test_at_after_32bit + t = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 2147483648, 3328347557, 1350) + + if RubyCoreSupport.time_supports_64bit + assert(TimeOrDateTime.new(2147483648).eql?(t.at)) + else + assert(TimeOrDateTime.new(DateTime.new(2038, 1, 19, 3, 14, 8)).eql?(t.at)) + end + end + + def test_at_after_freeze + t1 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 5300392727, 2160) + t1.freeze + t2.freeze + assert(TimeOrDateTime.new(1148949080).eql?(t1.at)) + assert(TimeOrDateTime.new(DateTime.new(2006, 5, 30, 0, 31, 20)).eql?(t2.at)) + end + + def test_eql_timestamp + t1 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t3 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 5300392727, 2160) + t4 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080, 5300392727, 2160) + t5 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949081) + t6 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3601, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t7 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3601, 0, :TST), 1148949080) + + assert_equal(true, t1.eql?(t1)) + assert_equal(true, t1.eql?(t2)) + assert_equal(false, t1.eql?(t3)) + assert_equal(true, t1.eql?(t4)) + assert_equal(false, t1.eql?(t5)) + assert_equal(false, t1.eql?(t6)) + assert_equal(false, t1.eql?(t7)) + assert_equal(false, t1.eql?(Object.new)) + end + + def test_eql_datetime + t1 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 5300392727, 2160) + t2 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 5300392727, 2160) + t3 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t4 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080, 5300392727, 2160) + t5 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 7852433803, 3200) + t6 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3601, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 5300392727, 2160) + t7 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3601, 0, :TST), 5300392727, 2160) + + assert_equal(true, t1.eql?(t1)) + assert_equal(true, t1.eql?(t2)) + assert_equal(false, t1.eql?(t3)) + assert_equal(false, t1.eql?(t4)) + assert_equal(false, t1.eql?(t5)) + assert_equal(false, t1.eql?(t6)) + assert_equal(false, t1.eql?(t7)) + assert_equal(false, t1.eql?(Object.new)) + end + + def test_eql_timestamp_and_datetime + t1 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080, 5300392727, 2160) + t2 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080, 5300392727, 2160) + t3 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t4 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 5300392727, 2160) + t5 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148952681, 7852433803, 3200) + t6 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3601, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080, 5300392727, 2160) + t7 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3601, 0, :TST), 1148949080, 5300392727, 2160) + + assert_equal(true, t1.eql?(t1)) + assert_equal(true, t1.eql?(t2)) + assert_equal(true, t1.eql?(t3)) + assert_equal(false, t1.eql?(t4)) + assert_equal(false, t1.eql?(t5)) + assert_equal(false, t1.eql?(t6)) + assert_equal(false, t1.eql?(t7)) + assert_equal(false, t1.eql?(Object.new)) + end + + def test_eql_timestamp_and_datetime_before_negative_32bit + t1 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -2147483649, 69573092117, 28800) + t2 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -2147483649, 69573092117, 28800) + t3 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -2147483649) + t4 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 69573092117, 28800) + + assert_equal(true, t1.eql?(t1)) + assert_equal(true, t1.eql?(t2)) + + if RubyCoreSupport.time_supports_negative && RubyCoreSupport.time_supports_64bit + assert_equal(true, t1.eql?(t3)) + assert_equal(false, t1.eql?(t4)) + assert_equal(true, t3.eql?(t1)) + assert_equal(false, t4.eql?(t1)) + else + assert_equal(false, t1.eql?(t3)) + assert_equal(true, t1.eql?(t4)) + assert_equal(false, t3.eql?(t1)) + assert_equal(true, t4.eql?(t1)) + end + end + + def test_eql_timestamp_and_datetime_before_epoch + t1 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -1, 210866759999, 86400) + t2 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -1, 210866759999, 86400) + t3 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -1) + t4 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 210866759999, 86400) + + assert_equal(true, t1.eql?(t1)) + assert_equal(true, t1.eql?(t2)) + + if RubyCoreSupport.time_supports_negative + assert_equal(true, t1.eql?(t3)) + assert_equal(false, t1.eql?(t4)) + assert_equal(true, t3.eql?(t1)) + assert_equal(false, t4.eql?(t1)) + else + assert_equal(false, t1.eql?(t3)) + assert_equal(true, t1.eql?(t4)) + assert_equal(false, t3.eql?(t1)) + assert_equal(true, t4.eql?(t1)) + end + end + + def test_eql_timestamp_and_datetime_after_32bit + t1 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 2147483648, 3328347557, 1350) + t2 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 2147483648, 3328347557, 1350) + t3 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 2147483648) + t4 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 3328347557, 1350) + + assert_equal(true, t1.eql?(t1)) + assert_equal(true, t1.eql?(t2)) + + if RubyCoreSupport.time_supports_64bit + assert_equal(true, t1.eql?(t3)) + assert_equal(false, t1.eql?(t4)) + assert_equal(true, t3.eql?(t1)) + assert_equal(false, t4.eql?(t1)) + else + assert_equal(false, t1.eql?(t3)) + assert_equal(true, t1.eql?(t4)) + assert_equal(false, t3.eql?(t1)) + assert_equal(true, t4.eql?(t1)) + end + end + + def test_hash + t1 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080) + t2 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 5300392727, 2160) + t3 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 1148949080, 5300392727, 2160) + t4 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -2147483649, 69573092117, 28800) + t5 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), -1, 210866759999, 86400) + t6 = TimezoneTransitionDefinition.new(TimezoneOffset.new(3600, 3600, :TDT), + TimezoneOffset.new(3600, 0, :TST), 2147483648, 3328347557, 1350) + + assert_equal(TimezoneOffset.new(3600, 3600, :TDT).hash ^ + TimezoneOffset.new(3600, 0, :TST).hash ^ 1148949080.hash ^ nil.hash, + t1.hash) + assert_equal(TimezoneOffset.new(3600, 3600, :TDT).hash ^ + TimezoneOffset.new(3600, 0, :TST).hash ^ 5300392727.hash ^ 2160.hash, + t2.hash) + assert_equal(TimezoneOffset.new(3600, 3600, :TDT).hash ^ + TimezoneOffset.new(3600, 0, :TST).hash ^ 1148949080.hash ^ nil.hash, + t3.hash) + + if RubyCoreSupport.time_supports_negative && RubyCoreSupport.time_supports_64bit + assert_equal(TimezoneOffset.new(3600, 3600, :TDT).hash ^ + TimezoneOffset.new(3600, 0, :TST).hash ^ -2147483649.hash ^ nil.hash, + t4.hash) + else + assert_equal(TimezoneOffset.new(3600, 3600, :TDT).hash ^ + TimezoneOffset.new(3600, 0, :TST).hash ^ 69573092117.hash ^ 28800.hash, + t4.hash) + end + + if RubyCoreSupport.time_supports_negative + assert_equal(TimezoneOffset.new(3600, 3600, :TDT).hash ^ + TimezoneOffset.new(3600, 0, :TST).hash ^ -1.hash ^ nil.hash, + t5.hash) + else + assert_equal(TimezoneOffset.new(3600, 3600, :TDT).hash ^ + TimezoneOffset.new(3600, 0, :TST).hash ^ 210866759999.hash ^ 86400.hash, + t5.hash) + end + + if RubyCoreSupport.time_supports_64bit + assert_equal(TimezoneOffset.new(3600, 3600, :TDT).hash ^ + TimezoneOffset.new(3600, 0, :TST).hash ^ 2147483648.hash ^ nil.hash, + t6.hash) + else + assert_equal(TimezoneOffset.new(3600, 3600, :TDT).hash ^ + TimezoneOffset.new(3600, 0, :TST).hash ^ 3328347557.hash ^ 1350.hash, + t6.hash) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_utc.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_utc.rb new file mode 100644 index 000000000000..212bca070b50 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_timezone_utc.rb @@ -0,0 +1,27 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTimezoneUTC < Minitest::Test + def test_2004 + tz = Timezone.get('UTC') + + assert_equal(DateTime.new(2004,1,1,0,0,0), tz.utc_to_local(DateTime.new(2004,1,1,0,0,0))) + assert_equal(DateTime.new(2004,12,31,23,59,59), tz.utc_to_local(DateTime.new(2004,12,31,23,59,59))) + + assert_equal(DateTime.new(2004,1,1,0,0,0), tz.local_to_utc(DateTime.new(2004,1,1,0,0,0))) + assert_equal(DateTime.new(2004,12,31,23,59,59), tz.local_to_utc(DateTime.new(2004,12,31,23,59,59))) + + assert_equal(:UTC, tz.period_for_utc(DateTime.new(2004,1,1,0,0,0)).zone_identifier) + assert_equal(:UTC, tz.period_for_utc(DateTime.new(2004,12,31,23,59,59)).zone_identifier) + + assert_equal(:UTC, tz.period_for_local(DateTime.new(2004,1,1,0,0,0)).zone_identifier) + assert_equal(:UTC, tz.period_for_local(DateTime.new(2004,12,31,23,59,59)).zone_identifier) + + assert_equal(0, tz.period_for_utc(DateTime.new(2004,1,1,0,0,0)).utc_total_offset) + assert_equal(0, tz.period_for_utc(DateTime.new(2004,12,31,23,59,59)).utc_total_offset) + + assert_equal(0, tz.period_for_local(DateTime.new(2004,1,1,0,0,0)).utc_total_offset) + assert_equal(0, tz.period_for_local(DateTime.new(2004,12,31,23,59,59)).utc_total_offset) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_transition_data_timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_transition_data_timezone_info.rb new file mode 100644 index 000000000000..cc4af72bddd7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_transition_data_timezone_info.rb @@ -0,0 +1,433 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTransitionDataTimezoneInfo < Minitest::Test + + def test_identifier + dti = TransitionDataTimezoneInfo.new('Test/Zone') + assert_equal('Test/Zone', dti.identifier) + end + + def test_offset + dti = TransitionDataTimezoneInfo.new('Test/Zone') + + assert_nothing_raised do + dti.offset :o1, -18000, 3600, :TEST + end + end + + def test_offset_already_defined + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, 3600, 0, :TEST + dti.offset :o2, 1800, 0, :TEST2 + + assert_raises(ArgumentError) { dti.offset :o1, 3600, 3600, :TESTD } + end + + def test_transition_timestamp + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -18000, 3600, :TEST + + assert_nothing_raised do + dti.transition 2006, 6, :o1, 1149368400 + end + end + + def test_transition_datetime + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -18000, 3600, :TEST + + assert_nothing_raised do + dti.transition 2006, 6, :o1, 19631123, 8 + end + end + + def test_transition_timestamp_and_datetime + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -18000, 3600, :TEST + + assert_nothing_raised do + dti.transition 2006, 6, :o1, 1149368400, 19631123, 8 + end + end + + def test_transition_invalid_offset + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -18000, 3600, :TEST + + dti.transition 2006, 6, :o1, 1149368400 + + assert_raises(ArgumentError) { dti.transition 2006, 6, :o2, 1149454800 } + end + + def test_transition_no_offsets + dti = TransitionDataTimezoneInfo.new('Test/Zone') + + assert_raises(ArgumentError) { dti.transition 2006, 6, :o1, 1149368400 } + end + + def test_transition_invalid_order_month + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -18000, 3600, :TEST + + dti.transition 2006, 6, :o1, 1149368400 + + assert_raises(ArgumentError) { dti.transition 2006, 5, :o2, 1146690000 } + end + + def test_transition_invalid_order_year + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -18000, 3600, :TEST + + dti.transition 2006, 6, :o1, 1149368400 + + assert_raises(ArgumentError) { dti.transition 2005, 7, :o2, 1120424400 } + end + + def test_period_for_utc + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -17900, 0, :TESTLMT + dti.offset :o2, -18000, 3600, :TESTD + dti.offset :o3, -18000, 0, :TESTS + dti.offset :o4, -21600, 3600, :TESTD + + dti.transition 2000, 4, :o2, Time.utc(2000, 4,1,1,0,0).to_i + dti.transition 2000, 10, :o3, Time.utc(2000,10,1,1,0,0).to_i + dti.transition 2001, 3, :o2, 58847269, 24 # (2001, 3,1,1,0,0) + dti.transition 2001, 4, :o4, Time.utc(2001, 4,1,1,0,0).to_i, 58848013, 24 + dti.transition 2001, 10, :o3, Time.utc(2001,10,1,1,0,0).to_i + dti.transition 2002, 10, :o3, Time.utc(2002,10,1,1,0,0).to_i + dti.transition 2003, 2, :o2, Time.utc(2003, 2,1,1,0,0).to_i + dti.transition 2003, 3, :o3, Time.utc(2003, 3,1,1,0,0).to_i + + o1 = TimezoneOffset.new(-17900, 0, :TESTLMT) + o2 = TimezoneOffset.new(-18000, 3600, :TESTD) + o3 = TimezoneOffset.new(-18000, 0, :TESTS) + o4 = TimezoneOffset.new(-21600, 3600, :TESTD) + + t1 = TimezoneTransitionDefinition.new(o2, o1, Time.utc(2000, 4,1,1,0,0).to_i) + t2 = TimezoneTransitionDefinition.new(o3, o2, Time.utc(2000,10,1,1,0,0).to_i) + t3 = TimezoneTransitionDefinition.new(o2, o3, Time.utc(2001, 3,1,1,0,0).to_i) + t4 = TimezoneTransitionDefinition.new(o4, o2, Time.utc(2001, 4,1,1,0,0).to_i) + t5 = TimezoneTransitionDefinition.new(o3, o4, Time.utc(2001,10,1,1,0,0).to_i) + t6 = TimezoneTransitionDefinition.new(o3, o3, Time.utc(2002,10,1,1,0,0).to_i) + t7 = TimezoneTransitionDefinition.new(o2, o3, Time.utc(2003, 2,1,1,0,0).to_i) + t8 = TimezoneTransitionDefinition.new(o3, o2, Time.utc(2003, 3,1,1,0,0).to_i) + + assert_equal(TimezonePeriod.new(nil, t1), dti.period_for_utc(DateTime.new(1960, 1,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(nil, t1), dti.period_for_utc(DateTime.new(1999,12,1,0, 0, 0))) + assert_equal(TimezonePeriod.new(nil, t1), dti.period_for_utc(Time.utc( 2000, 4,1,0,59,59))) + assert_equal(TimezonePeriod.new(t1, t2), dti.period_for_utc(DateTime.new(2000, 4,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t1, t2), dti.period_for_utc(Time.utc( 2000,10,1,0,59,59).to_i)) + assert_equal(TimezonePeriod.new(t2, t3), dti.period_for_utc(Time.utc( 2000,10,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t2, t3), dti.period_for_utc(Time.utc( 2001, 3,1,0,59,59))) + assert_equal(TimezonePeriod.new(t3, t4), dti.period_for_utc(Time.utc( 2001, 3,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t3, t4), dti.period_for_utc(Time.utc( 2001, 4,1,0,59,59))) + assert_equal(TimezonePeriod.new(t4, t5), dti.period_for_utc(Time.utc( 2001, 4,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t4, t5), dti.period_for_utc(Time.utc( 2001,10,1,0,59,59))) + assert_equal(TimezonePeriod.new(t5, t6), dti.period_for_utc(Time.utc( 2001,10,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t5, t6), dti.period_for_utc(Time.utc( 2002, 2,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t5, t6), dti.period_for_utc(Time.utc( 2002,10,1,0,59,59))) + assert_equal(TimezonePeriod.new(t6, t7), dti.period_for_utc(Time.utc( 2002,10,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t6, t7), dti.period_for_utc(Time.utc( 2003, 2,1,0,59,59))) + assert_equal(TimezonePeriod.new(t7, t8), dti.period_for_utc(Time.utc( 2003, 2,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t7, t8), dti.period_for_utc(Time.utc( 2003, 3,1,0,59,59))) + assert_equal(TimezonePeriod.new(t8, nil), dti.period_for_utc(Time.utc( 2003, 3,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t8, nil), dti.period_for_utc(Time.utc( 2004, 1,1,1, 0, 0))) + assert_equal(TimezonePeriod.new(t8, nil), dti.period_for_utc(DateTime.new(2050, 1,1,1, 0, 0))) + end + + def test_period_for_utc_no_transitions + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -17900, 0, :TESTLMT + dti.offset :o2, -18000, 0, :TEST + + o1 = TimezoneOffset.new(-17900, 0, :TESTLMT) + + assert_equal(TimezonePeriod.new(nil, nil, o1), dti.period_for_utc(DateTime.new(2005,1,1,0,0,0))) + assert_equal(TimezonePeriod.new(nil, nil, o1), dti.period_for_utc(Time.utc(2005,1,1,0,0,0))) + assert_equal(TimezonePeriod.new(nil, nil, o1), dti.period_for_utc(Time.utc(2005,1,1,0,0,0).to_i)) + end + + def test_period_for_utc_no_offsets + dti = TransitionDataTimezoneInfo.new('Test/Zone') + + assert_raises(NoOffsetsDefined) { dti.period_for_utc(DateTime.new(2005,1,1,0,0,0)) } + assert_raises(NoOffsetsDefined) { dti.period_for_utc(Time.utc(2005,1,1,0,0,0)) } + assert_raises(NoOffsetsDefined) { dti.period_for_utc(Time.utc(2005,1,1,0,0,0).to_i) } + end + + def test_periods_for_local + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -17900, 0, :TESTLMT + dti.offset :o2, -18000, 3600, :TESTD + dti.offset :o3, -18000, 0, :TESTS + dti.offset :o4, -21600, 3600, :TESTD + + dti.transition 2000, 4, :o2, 58839277, 24 # 2000,4,2,1,0,0 + dti.transition 2000, 10, :o3, Time.utc(2000,10,2,1,0,0).to_i, 58843669, 24 + dti.transition 2001, 3, :o2, Time.utc(2001, 3,2,1,0,0).to_i + dti.transition 2001, 4, :o4, Time.utc(2001, 4,2,1,0,0).to_i + dti.transition 2001, 10, :o3, Time.utc(2001,10,2,1,0,0).to_i + dti.transition 2002, 10, :o3, 58861189, 24 # 2002,10,2,1,0,0 + dti.transition 2003, 2, :o2, Time.utc(2003, 2,2,1,0,0).to_i + + o1 = TimezoneOffset.new(-17900, 0, :TESTLMT) + o2 = TimezoneOffset.new(-18000, 3600, :TESTD) + o3 = TimezoneOffset.new(-18000, 0, :TESTS) + o4 = TimezoneOffset.new(-21600, 3600, :TESTD) + + t1 = TimezoneTransitionDefinition.new(o2, o1, Time.utc(2000, 4,2,1,0,0).to_i) + t2 = TimezoneTransitionDefinition.new(o3, o2, Time.utc(2000,10,2,1,0,0).to_i) + t3 = TimezoneTransitionDefinition.new(o2, o3, Time.utc(2001, 3,2,1,0,0).to_i) + t4 = TimezoneTransitionDefinition.new(o4, o2, Time.utc(2001, 4,2,1,0,0).to_i) + t5 = TimezoneTransitionDefinition.new(o3, o4, Time.utc(2001,10,2,1,0,0).to_i) + t6 = TimezoneTransitionDefinition.new(o3, o3, Time.utc(2002,10,2,1,0,0).to_i) + t7 = TimezoneTransitionDefinition.new(o2, o3, Time.utc(2003, 2,2,1,0,0).to_i) + + + assert_equal([TimezonePeriod.new(nil, t1)], dti.periods_for_local(DateTime.new(1960, 1, 1, 1, 0, 0))) + assert_equal([TimezonePeriod.new(nil, t1)], dti.periods_for_local(DateTime.new(1999,12, 1, 0, 0, 0))) + assert_equal([TimezonePeriod.new(nil, t1)], dti.periods_for_local(Time.utc( 2000, 1, 1,10, 0, 0))) + assert_equal([TimezonePeriod.new(nil, t1)], dti.periods_for_local(Time.utc( 2000, 4, 1,20, 1,39))) + assert_equal([], dti.periods_for_local(Time.utc( 2000, 4, 1,20, 1,40))) + assert_equal([], dti.periods_for_local(Time.utc( 2000, 4, 1,20,59,59))) + assert_equal([TimezonePeriod.new(t1, t2)], dti.periods_for_local(Time.utc( 2000, 4, 1,21, 0, 0))) + assert_equal([TimezonePeriod.new(t1, t2)], dti.periods_for_local(DateTime.new(2000,10, 1,19,59,59))) + assert_equal([TimezonePeriod.new(t1, t2), + TimezonePeriod.new(t2, t3)], dti.periods_for_local(Time.utc( 2000,10, 1,20, 0, 0).to_i)) + assert_equal([TimezonePeriod.new(t1, t2), + TimezonePeriod.new(t2, t3)], dti.periods_for_local(DateTime.new(2000,10, 1,20,59,59))) + assert_equal([TimezonePeriod.new(t2, t3)], dti.periods_for_local(Time.utc( 2000,10, 1,21, 0, 0))) + assert_equal([TimezonePeriod.new(t2, t3)], dti.periods_for_local(Time.utc( 2001, 3, 1,19,59,59))) + assert_equal([], dti.periods_for_local(Time.utc( 2001, 3, 1,20, 0, 0))) + assert_equal([], dti.periods_for_local(DateTime.new(2001, 3, 1,20, 30, 0))) + assert_equal([], dti.periods_for_local(Time.utc( 2001, 3, 1,20,59,59).to_i)) + assert_equal([TimezonePeriod.new(t3, t4)], dti.periods_for_local(Time.utc( 2001, 3, 1,21, 0, 0))) + assert_equal([TimezonePeriod.new(t3, t4)], dti.periods_for_local(Time.utc( 2001, 4, 1,19,59,59))) + assert_equal([TimezonePeriod.new(t3, t4), + TimezonePeriod.new(t4, t5)], dti.periods_for_local(DateTime.new(2001, 4, 1,20, 0, 0))) + assert_equal([TimezonePeriod.new(t3, t4), + TimezonePeriod.new(t4, t5)], dti.periods_for_local(Time.utc( 2001, 4, 1,20,59,59))) + assert_equal([TimezonePeriod.new(t4, t5)], dti.periods_for_local(Time.utc( 2001, 4, 1,21, 0, 0))) + assert_equal([TimezonePeriod.new(t4, t5)], dti.periods_for_local(Time.utc( 2001,10, 1,19,59,59))) + assert_equal([TimezonePeriod.new(t5, t6)], dti.periods_for_local(Time.utc( 2001,10, 1,20, 0, 0))) + assert_equal([TimezonePeriod.new(t5, t6)], dti.periods_for_local(Time.utc( 2002, 2, 1,20, 0, 0))) + assert_equal([TimezonePeriod.new(t5, t6)], dti.periods_for_local(Time.utc( 2002,10, 1,19,59,59))) + assert_equal([TimezonePeriod.new(t6, t7)], dti.periods_for_local(Time.utc( 2002,10, 1,20, 0, 0))) + assert_equal([TimezonePeriod.new(t6, t7)], dti.periods_for_local(Time.utc( 2003, 2, 1,19,59,59))) + assert_equal([], dti.periods_for_local(Time.utc( 2003, 2, 1,20, 0, 0))) + assert_equal([], dti.periods_for_local(Time.utc( 2003, 2, 1,20,59,59))) + assert_equal([TimezonePeriod.new(t7, nil)], dti.periods_for_local(Time.utc( 2003, 2, 1,21, 0, 0))) + assert_equal([TimezonePeriod.new(t7, nil)], dti.periods_for_local(Time.utc( 2004, 2, 1,20, 0, 0))) + assert_equal([TimezonePeriod.new(t7, nil)], dti.periods_for_local(DateTime.new(2040, 2, 1,20, 0, 0))) + end + + def test_periods_for_local_warsaw + dti = TransitionDataTimezoneInfo.new('Test/Europe/Warsaw') + dti.offset :o1, 5040, 0, :LMT + dti.offset :o2, 5040, 0, :WMT + dti.offset :o3, 3600, 0, :CET + dti.offset :o4, 3600, 3600, :CEST + + dti.transition 1879, 12, :o2, 288925853, 120 # 1879,12,31,22,36,0 + dti.transition 1915, 8, :o3, 290485733, 120 # 1915, 8, 4,22,36,0 + dti.transition 1916, 4, :o4, 29051813, 12 # 1916, 4,30,22, 0,0 + + o1 = TimezoneOffset.new(5040, 0, :LMT) + o2 = TimezoneOffset.new(5040, 0, :WMT) + o3 = TimezoneOffset.new(3600, 0, :CET) + o4 = TimezoneOffset.new(3600, 3600, :CEST) + + t1 = TimezoneTransitionDefinition.new(o2, o1, 288925853, 120) + t2 = TimezoneTransitionDefinition.new(o3, o2, 290485733, 120) + t3 = TimezoneTransitionDefinition.new(o4, o3, 29051813, 12) + + assert_equal([TimezonePeriod.new(t1, t2), + TimezonePeriod.new(t2, t3)], dti.periods_for_local(DateTime.new(1915,8,4,23,40,0))) + end + + def test_periods_for_local_boundary + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -3600, 0, :TESTD + dti.offset :o2, -3600, 0, :TESTS + + dti.transition 2000, 7, :o2, Time.utc(2000,7,1,0,0,0).to_i + + o1 = TimezoneOffset.new(-3600, 0, :TESTD) + o2 = TimezoneOffset.new(-3600, 0, :TESTS) + + t1 = TimezoneTransitionDefinition.new(o2, o1, Time.utc(2000,7,1,0,0,0).to_i) + + # 2000-07-01 00:00:00 UTC is 2000-06-30 23:00:00 UTC-1 + # hence to find periods for local times between 2000-06-30 23:00:00 + # and 2000-07-01 00:00:00 a search has to be carried out in the next half + # year to the one containing the date we are looking for + + assert_equal([TimezonePeriod.new(nil, t1)], dti.periods_for_local(Time.utc(2000,6,30,22,59,59))) + assert_equal([TimezonePeriod.new(t1, nil)], dti.periods_for_local(Time.utc(2000,6,30,23, 0, 0))) + assert_equal([TimezonePeriod.new(t1, nil)], dti.periods_for_local(Time.utc(2000,7, 1, 0, 0, 0))) + end + + def test_periods_for_local_no_transitions + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -17900, 0, :TESTLMT + dti.offset :o2, -18000, 0, :TEST + + o1 = TimezoneOffset.new(-17900, 0, :TESTLMT) + + assert_equal([TimezonePeriod.new(nil, nil, o1)], dti.periods_for_local(DateTime.new(2005,1,1,0,0,0))) + assert_equal([TimezonePeriod.new(nil, nil, o1)], dti.periods_for_local(Time.utc(2005,1,1,0,0,0))) + assert_equal([TimezonePeriod.new(nil, nil, o1)], dti.periods_for_local(Time.utc(2005,1,1,0,0,0).to_i)) + end + + def test_periods_for_local_no_offsets + dti = TransitionDataTimezoneInfo.new('Test/Zone') + + assert_raises(NoOffsetsDefined) { dti.periods_for_local(DateTime.new(2005,1,1,0,0,0)) } + assert_raises(NoOffsetsDefined) { dti.periods_for_local(Time.utc(2005,1,1,0,0,0)) } + assert_raises(NoOffsetsDefined) { dti.periods_for_local(Time.utc(2005,1,1,0,0,0).to_i) } + end + + def test_transitions_up_to + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -17900, 0, :TESTLMT + dti.offset :o2, -18000, 3600, :TESTD + dti.offset :o3, -18000, 0, :TESTS + dti.offset :o4, -21600, 3600, :TESTD + + dti.transition 2010, 4, :o2, Time.utc(2010, 4,1,1,0,0).to_i + dti.transition 2010, 10, :o3, Time.utc(2010,10,1,1,0,0).to_i + dti.transition 2011, 3, :o2, 58934917, 24 # (2011, 3,1,1,0,0) + dti.transition 2011, 4, :o4, Time.utc(2011, 4,1,1,0,0).to_i, 58935661, 24 + dti.transition 2011, 10, :o3, Time.utc(2011,10,1,1,0,0).to_i + + o1 = TimezoneOffset.new(-17900, 0, :TESTLMT) + o2 = TimezoneOffset.new(-18000, 3600, :TESTD) + o3 = TimezoneOffset.new(-18000, 0, :TESTS) + o4 = TimezoneOffset.new(-21600, 3600, :TESTD) + + t1 = TimezoneTransitionDefinition.new(o2, o1, Time.utc(2010, 4,1,1,0,0).to_i) + t2 = TimezoneTransitionDefinition.new(o3, o2, Time.utc(2010,10,1,1,0,0).to_i) + t3 = TimezoneTransitionDefinition.new(o2, o3, Time.utc(2011, 3,1,1,0,0).to_i) + t4 = TimezoneTransitionDefinition.new(o4, o2, Time.utc(2011, 4,1,1,0,0).to_i) + t5 = TimezoneTransitionDefinition.new(o3, o4, Time.utc(2011,10,1,1,0,0).to_i) + + assert_equal([], dti.transitions_up_to(Time.utc(2010,4,1,1,0,0))) + assert_equal([], dti.transitions_up_to(Time.utc(2010,4,1,1,0,0), Time.utc(2000,1,1,0,0,0))) + assert_equal([t1], dti.transitions_up_to(Time.utc(2010,4,1,1,0,1))) + assert_equal([t1], dti.transitions_up_to(Time.utc(2010,4,1,1,0,1), Time.utc(2000,1,1,0,0,0))) + assert_equal([t2,t3,t4], dti.transitions_up_to(Time.utc(2011,4,1,1,0,1), Time.utc(2010,10,1,1,0,0))) + assert_equal([t2,t3,t4], dti.transitions_up_to(Time.utc(2011,10,1,1,0,0), Time.utc(2010,4,1,1,0,1))) + assert_equal([t3], dti.transitions_up_to(Time.utc(2011,4,1,1,0,0), Time.utc(2010,10,1,1,0,1))) + assert_equal([], dti.transitions_up_to(Time.utc(2011,3,1,1,0,0), Time.utc(2010,10,1,1,0,1))) + assert_equal([t1,t2,t3,t4], dti.transitions_up_to(Time.utc(2011,10,1,1,0,0))) + assert_equal([t1,t2,t3,t4,t5], dti.transitions_up_to(Time.utc(2011,10,1,1,0,1))) + assert_equal([t1,t2,t3,t4,t5], dti.transitions_up_to(Time.utc(2011,10,1,1,0,0,1))) + assert_equal([t1,t2,t3,t4,t5], dti.transitions_up_to(Time.utc(2011,10,1,1,0,1), Time.utc(2010,4,1,1,0,0))) + assert_equal([t2,t3,t4,t5], dti.transitions_up_to(Time.utc(2011,10,1,1,0,1), Time.utc(2010,4,1,1,0,1))) + assert_equal([t2,t3,t4,t5], dti.transitions_up_to(Time.utc(2011,10,1,1,0,1), Time.utc(2010,4,1,1,0,0,1))) + assert_equal([t5], dti.transitions_up_to(Time.utc(2015,1,1,0,0,0), Time.utc(2011,10,1,1,0,0))) + assert_equal([], dti.transitions_up_to(Time.utc(2015,1,1,0,0,0), Time.utc(2011,10,1,1,0,1))) + + assert_equal([], dti.transitions_up_to(Time.utc(2010,4,1,1,0,0).to_i)) + assert_equal([], dti.transitions_up_to(Time.utc(2010,4,1,1,0,0).to_i, Time.utc(2000,1,1,0,0,0).to_i)) + assert_equal([t1], dti.transitions_up_to(Time.utc(2010,4,1,1,0,1).to_i)) + assert_equal([t1], dti.transitions_up_to(Time.utc(2010,4,1,1,0,1).to_i, Time.utc(2000,1,1,0,0,0).to_i)) + assert_equal([t2,t3,t4], dti.transitions_up_to(Time.utc(2011,4,1,1,0,1).to_i, Time.utc(2010,10,1,1,0,0).to_i)) + assert_equal([t2,t3,t4], dti.transitions_up_to(Time.utc(2011,10,1,1,0,0).to_i, Time.utc(2010,4,1,1,0,1).to_i)) + assert_equal([t3], dti.transitions_up_to(Time.utc(2011,4,1,1,0,0).to_i, Time.utc(2010,10,1,1,0,1).to_i)) + assert_equal([], dti.transitions_up_to(Time.utc(2011,3,1,1,0,0).to_i, Time.utc(2010,10,1,1,0,1).to_i)) + assert_equal([t1,t2,t3,t4], dti.transitions_up_to(Time.utc(2011,10,1,1,0,0).to_i)) + assert_equal([t1,t2,t3,t4,t5], dti.transitions_up_to(Time.utc(2011,10,1,1,0,1).to_i)) + assert_equal([t1,t2,t3,t4,t5], dti.transitions_up_to(Time.utc(2011,10,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,0).to_i)) + assert_equal([t2,t3,t4,t5], dti.transitions_up_to(Time.utc(2011,10,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,1).to_i)) + assert_equal([t5], dti.transitions_up_to(Time.utc(2015,1,1,0,0,0).to_i, Time.utc(2011,10,1,1,0,0).to_i)) + assert_equal([], dti.transitions_up_to(Time.utc(2015,1,1,0,0,0).to_i, Time.utc(2011,10,1,1,0,1).to_i)) + + assert_equal([], dti.transitions_up_to(DateTime.new(2010,4,1,1,0,0))) + assert_equal([], dti.transitions_up_to(DateTime.new(2010,4,1,1,0,0), DateTime.new(2000,1,1,0,0,0))) + assert_equal([t1], dti.transitions_up_to(DateTime.new(2010,4,1,1,0,1))) + assert_equal([t1], dti.transitions_up_to(DateTime.new(2010,4,1,1,0,1), DateTime.new(2000,1,1,0,0,0))) + assert_equal([t2,t3,t4], dti.transitions_up_to(DateTime.new(2011,4,1,1,0,1), DateTime.new(2010,10,1,1,0,0))) + assert_equal([t2,t3,t4], dti.transitions_up_to(DateTime.new(2011,10,1,1,0,0), DateTime.new(2010,4,1,1,0,1))) + assert_equal([t3], dti.transitions_up_to(DateTime.new(2011,4,1,1,0,0), DateTime.new(2010,10,1,1,0,1))) + assert_equal([], dti.transitions_up_to(DateTime.new(2011,3,1,1,0,0), DateTime.new(2010,10,1,1,0,1))) + assert_equal([t1,t2,t3,t4], dti.transitions_up_to(DateTime.new(2011,10,1,1,0,0))) + assert_equal([t1,t2,t3,t4,t5], dti.transitions_up_to(DateTime.new(2011,10,1,1,0,1))) + assert_equal([t1,t2,t3,t4,t5], dti.transitions_up_to(DateTime.new(2011,10,1,1,0,Rational(DATETIME_RESOLUTION,1000000)))) + assert_equal([t1,t2,t3,t4,t5], dti.transitions_up_to(DateTime.new(2011,10,1,1,0,1), DateTime.new(2010,4,1,1,0,0))) + assert_equal([t2,t3,t4,t5], dti.transitions_up_to(DateTime.new(2011,10,1,1,0,1), DateTime.new(2010,4,1,1,0,1))) + + # Ruby 1.8.7 (built with GCC 8.3.0 on Ubuntu 19.04) fails to perform + # DateTime comparisons correctly when sub-seconds are used. + to = DateTime.new(2011,10,1,1,0,1) + from = DateTime.new(2010,4,1,1,0,Rational(DATETIME_RESOLUTION,1000000)) + if to > from + assert_equal([t2,t3,t4,t5], dti.transitions_up_to(to, from)) + else + puts "This platform does not consider the DateTime #{to.strftime('%Y-%m-%d %H:%m:%S.%N')} to be later than the DateTime #{from.strftime('%Y-%m-%d %H:%m:%S.%N')}" + end + + assert_equal([t5], dti.transitions_up_to(DateTime.new(2015,1,1,0,0,0), DateTime.new(2011,10,1,1,0,0))) + assert_equal([], dti.transitions_up_to(DateTime.new(2015,1,1,0,0,0), DateTime.new(2011,10,1,1,0,1))) + end + + def test_transitions_up_to_no_transitions + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -17900, 0, :TESTLMT + + assert_equal([], dti.transitions_up_to(Time.utc(2015,1,1,0,0,0))) + assert_equal([], dti.transitions_up_to(Time.utc(2015,1,1,0,0,0).to_i)) + assert_equal([], dti.transitions_up_to(DateTime.new(2015,1,1,0,0,0))) + end + + def test_transitions_up_to_utc_to_not_greater_than_utc_from + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, -17900, 0, :TESTLMT + + assert_raises(ArgumentError) do + dti.transitions_up_to(Time.utc(2012,8,1,0,0,0), Time.utc(2013,8,1,0,0,0)) + end + + assert_raises(ArgumentError) do + dti.transitions_up_to(Time.utc(2012,8,1,0,0,0).to_i, Time.utc(2012,8,1,0,0,0).to_i) + end + + assert_raises(ArgumentError) do + dti.transitions_up_to(DateTime.new(2012,8,1,0,0,0), DateTime.new(2012,8,1,0,0,0)) + end + end + + def test_datetime_and_timestamp_use + dti = TransitionDataTimezoneInfo.new('Test/Zone') + dti.offset :o1, 0, 0, :TESTS + dti.offset :o2, 0, 3600, :TESTD + + dti.transition 1901, 12, :o2, -2147483649, 69573092117, 28800 + dti.transition 1969, 12, :o1, -1, 210866759999, 86400 + dti.transition 2001, 9, :o2, 1000000000, 529666909, 216 + dti.transition 2038, 1, :o1, 2147483648, 3328347557, 1350 + + if RubyCoreSupport.time_supports_negative && RubyCoreSupport.time_supports_64bit + assert(dti.period_for_utc(DateTime.new(1901,12,13,20,45,51)).start_transition.at.eql?(TimeOrDateTime.new(-2147483649))) + else + assert(dti.period_for_utc(DateTime.new(1901,12,13,20,45,51)).start_transition.at.eql?(TimeOrDateTime.new(DateTime.new(1901,12,13,20,45,51)))) + end + + if RubyCoreSupport.time_supports_negative + assert(dti.period_for_utc(DateTime.new(1969,12,31,23,59,59)).start_transition.at.eql?(TimeOrDateTime.new(-1))) + else + assert(dti.period_for_utc(DateTime.new(1969,12,31,23,59,59)).start_transition.at.eql?(TimeOrDateTime.new(DateTime.new(1969,12,31,23,59,59)))) + end + + assert(dti.period_for_utc(DateTime.new(2001,9,9,2,46,40)).start_transition.at.eql?(TimeOrDateTime.new(1000000000))) + + if RubyCoreSupport.time_supports_64bit + assert(dti.period_for_utc(DateTime.new(2038,1,19,3,14,8)).start_transition.at.eql?(TimeOrDateTime.new(2147483648))) + else + assert(dti.period_for_utc(DateTime.new(2038,1,19,3,14,8)).start_transition.at.eql?(TimeOrDateTime.new(DateTime.new(2038,1,19,3,14,8)))) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_transition_rule.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_transition_rule.rb new file mode 100644 index 000000000000..c180f0c58379 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_transition_rule.rb @@ -0,0 +1,663 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCTransitionRule < Minitest::Test + [-1, 0, 1].each do |transition_at| + define_method "test_transition_at_#{transition_at}" do + rule = TestTransitionRule.new(transition_at) + assert_equal(transition_at, rule.transition_at) + end + end + + [ + [-1, 19, 23, 59, 59], + [0, 20, 0, 0, 0], + [1, 20, 0, 0, 1], + [60, 20, 0, 1, 0], + [86399, 20, 23, 59, 59], + [86400, 21, 0, 0, 0] + ].each do |(transition_at, expected_day, expected_hour, expected_minute, expected_second)| + define_method "test_at_with_transition_at_#{transition_at}" do + offset = TimezoneOffset.new(0, 0, 'TEST') + rule = TestTransitionRule.new(transition_at) do |y| + assert_equal(2020, y) + TimeOrDateTime.wrap(Time.utc(2020, 3, 20)) + end + + result = rule.at(offset, 2020) + + assert_kind_of(TimeOrDateTime, result) + assert_equal(Time.utc(2020, 3, expected_day, expected_hour, expected_minute, expected_second), result.to_time) + end + end + + [-7200, 0, 7200].each do |offset_seconds| + define_method "test_at_with_offset_#{offset_seconds}" do + offset = TimezoneOffset.new(offset_seconds, 0, 'TEST') + rule = TestTransitionRule.new(3600) do |y| + assert_equal(2020, y) + TimeOrDateTime.wrap(Time.utc(2020, 3, 20)) + end + + result = rule.at(offset, 2020) + + assert_kind_of(TimeOrDateTime, result) + assert_equal(Time.utc(2020, 3, 20, 1, 0, 0) - offset_seconds, result.to_time) + end + end + + [2020, 2021].each do |year| + define_method "test_at_with_year_#{year}" do + offset = TimezoneOffset.new(0, 0, 'TEST') + rule = TestTransitionRule.new(3600) do |y| + assert_equal(year, y) + TimeOrDateTime.wrap(Time.utc(year, 3, 20)) + end + + result = rule.at(offset, year) + + assert_kind_of(TimeOrDateTime, result) + assert_equal(Time.utc(year, 3, 20, 1, 0, 0), result.to_time) + end + end + + def test_at_crosses_64_bit_boundary + offset = TimezoneOffset.new(0, 0, 'TEST') + rule = TestTransitionRule.new(11648) do |y| + assert_equal(2038, y) + TimeOrDateTime.wrap(Time.utc(2038, 1, 19)) + end + + result = rule.at(offset, 2038) + + assert_kind_of(TimeOrDateTime, result) + if RubyCoreSupport.time_supports_64bit + assert_kind_of(Time, result.to_orig) + else + assert_kind_of(DateTime, result.to_orig) + end + assert_equal(DateTime.new(2038, 1, 19, 3, 14, 8), result.to_datetime) + end + + def test_at_crosses_negative_boundary + offset = TimezoneOffset.new(0, 0, 'TEST') + rule = TestTransitionRule.new(-1) do |y| + assert_equal(1970, y) + TimeOrDateTime.wrap(Time.utc(1970, 1, 1)) + end + + result = rule.at(offset, 1970) + + assert_kind_of(TimeOrDateTime, result) + if RubyCoreSupport.time_supports_negative + assert_kind_of(Time, result.to_orig) + else + assert_kind_of(DateTime, result.to_orig) + end + assert_equal(DateTime.new(1969, 12, 31, 23, 59, 59), result.to_datetime) + end + + NEGATIVE_DATES = [[1969, 12, 31]] + B32_DATES = [[1970, 1, 1], [2038, 1, 19]] + B64_DATES = [[2038, 1, 20], [2038, 2, 1], [2039, 1, 1]] + + B32_DATES.concat(RubyCoreSupport.time_supports_negative ? NEGATIVE_DATES : []).concat(RubyCoreSupport.time_supports_64bit ? B64_DATES : []).each do |(year, month, day)| + define_method "test_new_time_or_datetime_returns_time_based_instance_for_#{year}_#{month}_#{day}" do + result = TestTransitionRule.new(0).new_time_or_datetime!(year, month, day) + assert_kind_of(TimeOrDateTime, result) + assert_kind_of(Time, result.to_orig) + assert_equal(Time.utc(year, month, day), result.to_orig) + end + end + + (RubyCoreSupport.time_supports_negative ? [] : NEGATIVE_DATES).concat(RubyCoreSupport.time_supports_64bit ? [] : B64_DATES).each do |(year, month, day)| + define_method "test_new_time_or_datetime_returns_datetime_based_instance_for_#{year}_#{month}_#{day}" do + result = TestTransitionRule.new(0).new_time_or_datetime!(year, month, day) + assert_kind_of(TimeOrDateTime, result) + assert_kind_of(DateTime, result.to_orig) + assert_equal(DateTime.new(year, month, day), result.to_orig) + end + end + + [1900, 2021, 2039].each do |year| + define_method "test_new_time_or_datetime_returns_march_1_for_feb_29_on_non_leap_year_#{year}" do + result = TestTransitionRule.new(0).new_time_or_datetime!(year, 2, 29) + assert_kind_of(TimeOrDateTime, result) + assert_equal(DateTime.new(year, 3, 1), result.to_datetime) + end + end + + [1968, 2000, 2040].each do |year| + define_method "test_new_time_or_datetime_returns_feb_29_on_leap_year_#{year}" do + result = TestTransitionRule.new(0).new_time_or_datetime!(year, 2, 29) + assert_kind_of(TimeOrDateTime, result) + assert_equal(DateTime.new(year, 2, 29), result.to_datetime) + end + end + + class TestTransitionRule < TransitionRule + def initialize(transition_at, &block) + super(transition_at) + @get_day = block + end + + alias new_time_or_datetime! new_time_or_datetime + public :new_time_or_datetime! + + protected + + def get_day(year) + @get_day.call(year) + end + end +end + +module BaseTransitionRuleTestHelper + def test_invalid_transition_at + error = assert_raises(ArgumentError) { create_with_transition_at('0') } + assert_match(/\btransition_at(\b.*)?/, error.message) + end + + [:==, :eql?].each do |method| + define_method "test_not_equal_by_transition_at_with_#{method}" do + rule1 = create_with_transition_at(0) + rule2 = create_with_transition_at(1) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + + define_method "test_not_equal_to_other_with_#{method}" do + rule = create_with_transition_at(0) + assert_equal(false, rule.send(method, Object.new)) + end + end +end + +class TCAbsoluteDayOfYearTransitionRule < Minitest::Test + include BaseTransitionRuleTestHelper + + [-1, 366, '0'].each do |value| + define_method "test_invalid_day_#{value}" do + error = assert_raises(ArgumentError) { AbsoluteDayOfYearTransitionRule.new(value) } + assert_match(/\bday\b/, error.message) + end + end + + [ + [2020, 0, 1, 1], + [2020, 58, 2, 28], + [2020, 59, 2, 29], + [2020, 365, 12, 31], + [2021, 59, 3, 1], + [2021, 365, 13, 1], + [2100, 59, 3, 1], + [2100, 365, 13, 1], + [2000, 59, 2, 29], + [2000, 365, 12, 31] + ].each do |(year, day, expected_month, expected_day)| + define_method "test_day_#{day}_of_year_#{year}" do + rule = AbsoluteDayOfYearTransitionRule.new(day, 3600) + offset = TimezoneOffset.new(0, 0, 'TEST') + + result = rule.at(offset, year) + + expected_year = year + if expected_month == 13 + expected_year += 1 + expected_month = 1 + end + + assert_kind_of(TimeOrDateTime, result) + assert_equal(DateTime.new(expected_year, expected_month, expected_day, 1, 0, 0), result.to_datetime) + end + end + + def test_crosses_64_bit_boundary + # Internally the calculation starts with Jan 1 and adds days. Jan 20 2038 + # will require a DateTime on 32-bit only systems. + + rule = AbsoluteDayOfYearTransitionRule.new(19, 3600) + offset = TimezoneOffset.new(0, 0, 'TEST') + + result = rule.at(offset, 2038) + + assert_kind_of(TimeOrDateTime, result) + if RubyCoreSupport.time_supports_64bit + assert_kind_of(Time, result.to_orig) + else + assert_kind_of(DateTime, result.to_orig) + end + assert_equal(DateTime.new(2038, 1, 20, 1, 0, 0), result.to_datetime) + end + + def test_day_0_is_always_first_day_of_year + rule = AbsoluteDayOfYearTransitionRule.new(0) + assert_equal(true, rule.is_always_first_day_of_year?) + end + + [1, 365].each do |day| + define_method "test_day_#{day}_is_not_always_first_day_of_year" do + rule = AbsoluteDayOfYearTransitionRule.new(day) + assert_equal(false, rule.is_always_first_day_of_year?) + end + + define_method "test_day_#{day}_is_not_always_last_day_of_year" do + rule = AbsoluteDayOfYearTransitionRule.new(day) + assert_equal(false, rule.is_always_last_day_of_year?) + end + end + + [:==, :eql?].each do |method| + [ + [0, 0], + [0, 3600], + [365, 0] + ].each do |(day, transition_at)| + define_method "test_equal_for_day_#{day}_and_transition_at_#{transition_at}_with_#{method}" do + rule1 = AbsoluteDayOfYearTransitionRule.new(day, transition_at) + rule2 = AbsoluteDayOfYearTransitionRule.new(day, transition_at) + assert_equal(true, rule1.send(method, rule2)) + assert_equal(true, rule2.send(method, rule1)) + end + end + + define_method "test_not_equal_by_day_with_#{method}" do + rule1 = AbsoluteDayOfYearTransitionRule.new(0, 3600) + rule2 = AbsoluteDayOfYearTransitionRule.new(1, 3600) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + + define_method "test_not_equal_to_julian_with_#{method}" do + rule1 = AbsoluteDayOfYearTransitionRule.new(1, 0) + rule2 = JulianDayOfYearTransitionRule.new(1, 0) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + end + + [ + [0, 0], + [0, 3600], + [365, 0] + ].each do |(day, transition_at)| + define_method "test_hash_for_day_#{day}_and_transition_at_#{transition_at}" do + rule = AbsoluteDayOfYearTransitionRule.new(day, transition_at) + expected = [AbsoluteDayOfYearTransitionRule, day * 86400, transition_at].hash + assert_equal(expected, rule.hash) + end + end + + protected + + def create_with_transition_at(transition_at) + AbsoluteDayOfYearTransitionRule.new(1, transition_at) + end +end + +class TCJulianDayOfYearTransitionRule < Minitest::Test + include BaseTransitionRuleTestHelper + + [0, 366, '1'].each do |value| + define_method "test_invalid_day_#{value}" do + error = assert_raises(ArgumentError) { JulianDayOfYearTransitionRule.new(value) } + assert_match(/\bday\b/, error.message) + end + end + + [2020, 2021, 2100, 2000].each do |year| + [ + [1, 1, 1], + [59, 2, 28], + [60, 3, 1], + [365, 12, 31] + ].each do |(day, expected_month, expected_day)| + define_method "test_day_#{day}_of_year_#{year}" do + rule = JulianDayOfYearTransitionRule.new(day, 3600) + offset = TimezoneOffset.new(0, 0, 'TEST') + + result = rule.at(offset, year) + + assert_kind_of(TimeOrDateTime, result) + assert_equal(DateTime.new(year, expected_month, expected_day, 1, 0, 0), result.to_datetime) + end + end + end + + def test_day_1_is_always_first_day_of_year + rule = JulianDayOfYearTransitionRule.new(1) + assert_equal(true, rule.is_always_first_day_of_year?) + end + + [2, 365].each do |day| + define_method "test_day_#{day}_is_not_always_first_day_of_year" do + rule = JulianDayOfYearTransitionRule.new(day) + assert_equal(false, rule.is_always_first_day_of_year?) + end + end + + def test_day_365_is_always_last_day_of_year + rule = JulianDayOfYearTransitionRule.new(365) + assert_equal(true, rule.is_always_last_day_of_year?) + end + + [1, 364].each do |day| + define_method "test_day_#{day}_is_not_always_last_day_of_year" do + rule = JulianDayOfYearTransitionRule.new(day) + assert_equal(false, rule.is_always_last_day_of_year?) + end + end + + [:==, :eql?].each do |method| + [ + [1, 0], + [1, 3600], + [365, 0] + ].each do |(day, transition_at)| + define_method "test_equal_for_day_#{day}_and_transition_at_#{transition_at}_with_#{method}" do + rule1 = JulianDayOfYearTransitionRule.new(day, transition_at) + rule2 = JulianDayOfYearTransitionRule.new(day, transition_at) + assert_equal(true, rule1.send(method, rule2)) + assert_equal(true, rule2.send(method, rule1)) + end + end + + define_method "test_not_equal_by_day_with_#{method}" do + rule1 = JulianDayOfYearTransitionRule.new(1, 0) + rule2 = JulianDayOfYearTransitionRule.new(2, 0) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + + define_method "test_not_equal_to_absolute_with_#{method}" do + rule1 = JulianDayOfYearTransitionRule.new(1, 0) + rule2 = AbsoluteDayOfYearTransitionRule.new(1, 0) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + end + + [ + [1, 0], + [1, 3600], + [365, 0] + ].each do |(day, transition_at)| + define_method "test_hash_for_day_#{day}_and_transition_at_#{transition_at}" do + rule = JulianDayOfYearTransitionRule.new(day, transition_at) + expected = [JulianDayOfYearTransitionRule, day * 86400, transition_at].hash + assert_equal(expected, rule.hash) + end + end + + protected + + def create_with_transition_at(transition_at) + JulianDayOfYearTransitionRule.new(1, transition_at) + end +end + +module DayOfWeekTransitionRuleTestHelper + [-1, 0, 13, '1'].each do |month| + define_method "test_invalid_month_#{month}" do + error = assert_raises(ArgumentError) { create_with_month_and_day_of_week(month, 0) } + assert_match(/\bmonth\b/, error.message) + end + end + + [-1, 7, '0'].each do |day_of_week| + define_method "test_invalid_day_of_week_#{day_of_week}" do + error = assert_raises(ArgumentError) { create_with_month_and_day_of_week(1, day_of_week) } + assert_match(/\bday_of_week\b/, error.message) + end + end + + def test_is_not_always_first_day_of_year + rule = create_with_month_and_day_of_week(1, 0) + assert_equal(false, rule.is_always_first_day_of_year?) + end + + def test_is_not_always_last_day_of_year + rule = create_with_month_and_day_of_week(12, 6) + assert_equal(false, rule.is_always_last_day_of_year?) + end + + [:==, :eql?].each do |method| + define_method "test_not_equal_by_month_with_#{method}" do + rule1 = create_with_month_and_day_of_week(1, 0) + rule2 = create_with_month_and_day_of_week(2, 0) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + + define_method "test_not_equal_by_day_of_week_with_#{method}" do + rule1 = create_with_month_and_day_of_week(1, 0) + rule2 = create_with_month_and_day_of_week(1, 1) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + end +end + +class TCDayOfMonthTransitionRule < Minitest::Test + include BaseTransitionRuleTestHelper + include DayOfWeekTransitionRuleTestHelper + + [-1, 0, 5, '1'].each do |week| + define_method "test_invalid_week_#{week}" do + error = assert_raises(ArgumentError) { DayOfMonthTransitionRule.new(1, week, 0) } + assert_match(/\bweek\b/, error.message) + end + end + + [ + # All possible first week start days. + [2020, 3, [1, 2, 3, 4, 5, 6, 7]], + [2021, 3, [7, 1, 2, 3, 4, 5, 6]], + [2022, 3, [6, 7, 1, 2, 3, 4, 5]], + [2023, 3, [5, 6, 7, 1, 2, 3, 4]], + [2018, 3, [4, 5, 6, 7, 1, 2, 3]], + [2024, 3, [3, 4, 5, 6, 7, 1, 2]], + [2025, 3, [2, 3, 4, 5, 6, 7, 1]], + + # All possible months. + [2019, 1, [6]], + [2019, 2, [3]], + [2019, 3, [3]], + [2019, 4, [7]], + [2019, 5, [5]], + [2019, 6, [2]], + [2019, 7, [7]], + [2019, 8, [4]], + [2019, 9, [1]], + [2019, 10, [6]], + [2019, 11, [3]], + [2019, 12, [1]] + ].each do |(year, month, days)| + days.each_with_index do |expected_day, day_of_week| + (1..4).each do |week| + define_method "test_month_#{month}_week_#{week}_and_day_of_week_#{day_of_week}_year_#{year}" do + rule = DayOfMonthTransitionRule.new(month, week, day_of_week, 3600) + offset = TimezoneOffset.new(0, 0, 'TEST') + + result = rule.at(offset, year) + + assert_kind_of(TimeOrDateTime, result) + assert_equal(Time.utc(year, month, expected_day + (week - 1) * 7, 1, 0, 0), result.to_time) + end + end + end + end + + [[3, 3, 20], [4, 6, 23]].each do |(week, day_of_week, expected_day)| + define_method "test_crosses_64_bit_boundary_for_day_of_week_#{day_of_week}" do + rule = DayOfMonthTransitionRule.new(1, week, day_of_week, 3600) + offset = TimezoneOffset.new(0, 0, 'TEST') + + result = rule.at(offset, 2038) + + assert_kind_of(TimeOrDateTime, result) + if RubyCoreSupport.time_supports_64bit + assert_kind_of(Time, result.to_orig) + else + assert_kind_of(DateTime, result.to_orig) + end + assert_equal(DateTime.new(2038, 1, expected_day, 1, 0, 0), result.to_datetime) + end + end + + [:==, :eql?].each do |method| + [ + [1, 1, 0, 0], + [1, 1, 0, 1], + [1, 1, 1, 0], + [1, 2, 0, 0], + [2, 1, 0, 0] + ].each do |(month, week, day_of_week, transition_at)| + define_method "test_equal_for_month_#{month}_week_#{week}_day_of_week_#{day_of_week}_and_transition_at_#{transition_at}_with_#{method}" do + rule1 = DayOfMonthTransitionRule.new(month, week, day_of_week, transition_at) + rule2 = DayOfMonthTransitionRule.new(month, week, day_of_week, transition_at) + assert_equal(true, rule1.send(method, rule2)) + assert_equal(true, rule2.send(method, rule1)) + end + end + + define_method "test_not_equal_by_week_with_#{method}" do + rule1 = DayOfMonthTransitionRule.new(1, 1, 0, 0) + rule2 = DayOfMonthTransitionRule.new(1, 2, 0, 0) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + + define_method "test_not_equal_to_last_day_of_month_with_#{method}" do + rule1 = DayOfMonthTransitionRule.new(1, 1, 0, 0) + rule2 = LastDayOfMonthTransitionRule.new(1, 0, 0) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + end + + [ + [1, 1, 0, 0], + [1, 1, 0, 1], + [1, 1, 1, 0], + [1, 2, 0, 0], + [2, 1, 0, 0] + ].each do |(month, week, day_of_week, transition_at)| + define_method "test_hash_for_month_#{month}_week_#{week}_day_of_week_#{day_of_week}_and_transition_at_#{transition_at}" do + rule = DayOfMonthTransitionRule.new(month, week, day_of_week, transition_at) + expected = [(week - 1) * 7 + 1, month, day_of_week, transition_at].hash + assert_equal(expected, rule.hash) + end + end + + protected + + def create_with_transition_at(transition_at) + DayOfMonthTransitionRule.new(1, 1, 0, transition_at) + end + + def create_with_month_and_day_of_week(month, day_of_week) + DayOfMonthTransitionRule.new(month, 1, day_of_week) + end +end + +class TCLastDayOfMonthTransitionRule < Minitest::Test + include BaseTransitionRuleTestHelper + include DayOfWeekTransitionRuleTestHelper + + [ + # All possible last days. + [2021, 10, [31, 25, 26, 27, 28, 29, 30]], + [2022, 10, [30, 31, 25, 26, 27, 28, 29]], + [2023, 10, [29, 30, 31, 25, 26, 27, 28]], + [2018, 10, [28, 29, 30, 31, 25, 26, 27]], + [2024, 10, [27, 28, 29, 30, 31, 25, 26]], + [2025, 10, [26, 27, 28, 29, 30, 31, 25]], + [2026, 10, [25, 26, 27, 28, 29, 30, 31]], + + # All possible months. + [2020, 1, [26]], + [2020, 2, [23]], + [2020, 3, [29]], + [2020, 4, [26]], + [2020, 5, [31]], + [2020, 6, [28]], + [2020, 7, [26]], + [2020, 8, [30]], + [2020, 9, [27]], + [2020, 10, [25]], + [2020, 11, [29]], + [2020, 12, [27]] + ].each do |(year, month, days)| + days.each_with_index do |expected_day, day_of_week| + define_method "test_month_#{month}_day_of_week_#{day_of_week}_year_#{year}" do + rule = LastDayOfMonthTransitionRule.new(month, day_of_week, 7200) + offset = TimezoneOffset.new(0, 0, 'TEST') + + result = rule.at(offset, year) + + assert_kind_of(TimeOrDateTime, result) + assert_equal(Time.utc(year, month, expected_day, 2, 0, 0), result.to_time) + end + end + end + + [[2020, 6, 29], [2021, 0, 28], [2000, 2, 29], [2100, 0, 28]].each do |(year, day_of_week, expected_day)| + define_method "test_#{expected_day == 29 ? '' : 'non_'}leap_year_#{year}" do + rule = LastDayOfMonthTransitionRule.new(2, day_of_week, 7200) + offset = TimezoneOffset.new(0, 0, 'TEST') + + result = rule.at(offset, year) + + assert_kind_of(TimeOrDateTime, result) + assert_equal(DateTime.new(year, 2, expected_day, 2, 0, 0), result.to_datetime) + end + end + + [:==, :eql?].each do |method| + [ + [1, 0, 0], + [1, 0, 1], + [1, 1, 0], + [2, 0, 0] + ].each do |(month, day_of_week, transition_at)| + define_method "test_equal_for_month_#{month}_day_of_week_#{day_of_week}_and_transition_at_#{transition_at}_with_#{method}" do + rule1 = LastDayOfMonthTransitionRule.new(month, day_of_week, transition_at) + rule2 = LastDayOfMonthTransitionRule.new(month, day_of_week, transition_at) + assert_equal(true, rule1.send(method, rule2)) + assert_equal(true, rule2.send(method, rule1)) + end + end + + define_method "test_not_equal_to_day_of_month_with_#{method}" do + rule1 = LastDayOfMonthTransitionRule.new(1, 0, 0) + rule2 = DayOfMonthTransitionRule.new(1, 1, 0, 0) + assert_equal(false, rule1.send(method, rule2)) + assert_equal(false, rule2.send(method, rule1)) + end + end + + [ + [1, 0, 0], + [1, 0, 1], + [1, 1, 0], + [2, 0, 0] + ].each do |(month, day_of_week, transition_at)| + define_method "test_hash_for_month_#{month}_day_of_week_#{day_of_week}_and_transition_at_#{transition_at}" do + rule = LastDayOfMonthTransitionRule.new(month, day_of_week, transition_at) + expected = [month, day_of_week, transition_at].hash + assert_equal(expected, rule.hash) + end + end + + protected + + def create_with_transition_at(transition_at) + LastDayOfMonthTransitionRule.new(1, 0, transition_at) + end + + def create_with_month_and_day_of_week(month, day_of_week) + LastDayOfMonthTransitionRule.new(month, day_of_week) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_zoneinfo_country_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_zoneinfo_country_info.rb new file mode 100644 index 000000000000..f54e9b166b0d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_zoneinfo_country_info.rb @@ -0,0 +1,78 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') + +include TZInfo + +class TCZoneinfoCountryInfo < Minitest::Test + + def test_code + ci = ZoneinfoCountryInfo.new('ZZ', 'Zzz', []) {|c| } + assert_equal('ZZ', ci.code) + end + + def test_name + ci = ZoneinfoCountryInfo.new('ZZ', 'Zzz', []) {|c| } + assert_equal('Zzz', ci.name) + end + + def test_zone_identifiers_empty + ci = ZoneinfoCountryInfo.new('ZZ', 'Zzz', []) {|c| } + assert(ci.zone_identifiers.empty?) + assert(ci.zone_identifiers.frozen?) + end + + def test_zone_identifiers + zones = [ + CountryTimezone.new('ZZ/TimezoneB', Rational(1, 2), Rational(1, 2), 'Timezone B'), + CountryTimezone.new('ZZ/TimezoneA', Rational(1, 4), Rational(1, 4), 'Timezone A'), + CountryTimezone.new('ZZ/TimezoneC', Rational(-10, 3), Rational(-20, 7), 'C'), + CountryTimezone.new('ZZ/TimezoneD', Rational(-10, 3), Rational(-20, 7)) + ] + + ci = ZoneinfoCountryInfo.new('ZZ', 'Zzz', zones) + + assert_equal(['ZZ/TimezoneB', 'ZZ/TimezoneA', 'ZZ/TimezoneC', 'ZZ/TimezoneD'], ci.zone_identifiers) + assert(ci.zone_identifiers.frozen?) + assert(!ci.zones.equal?(zones)) + assert(!zones.frozen?) + end + + def test_zone_identifiers_after_freeze + zones = [ + CountryTimezone.new('ZZ/TimezoneB', Rational(1, 2), Rational(1, 2), 'Timezone B'), + CountryTimezone.new('ZZ/TimezoneA', Rational(1, 4), Rational(1, 4), 'Timezone A'), + CountryTimezone.new('ZZ/TimezoneC', Rational(-10, 3), Rational(-20, 7), 'C'), + CountryTimezone.new('ZZ/TimezoneD', Rational(-10, 3), Rational(-20, 7)) + ] + + ci = ZoneinfoCountryInfo.new('ZZ', 'Zzz', zones) + ci.freeze + + assert_equal(['ZZ/TimezoneB', 'ZZ/TimezoneA', 'ZZ/TimezoneC', 'ZZ/TimezoneD'], ci.zone_identifiers) + end + + def test_zones_empty + ci = ZoneinfoCountryInfo.new('ZZ', 'Zzz', []) + assert(ci.zones.empty?) + assert(ci.zones.frozen?) + end + + def test_zones + zones = [ + CountryTimezone.new('ZZ/TimezoneB', Rational(1, 2), Rational(1, 2), 'Timezone B'), + CountryTimezone.new('ZZ/TimezoneA', Rational(1, 4), Rational(1, 4), 'Timezone A'), + CountryTimezone.new('ZZ/TimezoneC', Rational(-10, 3), Rational(-20, 7), 'C'), + CountryTimezone.new('ZZ/TimezoneD', Rational(-10, 3), Rational(-20, 7)) + ] + + ci = ZoneinfoCountryInfo.new('ZZ', 'Zzz', zones) + + assert_equal([CountryTimezone.new('ZZ/TimezoneB', Rational(1, 2), Rational(1, 2), 'Timezone B'), + CountryTimezone.new('ZZ/TimezoneA', Rational(1, 4), Rational(1, 4), 'Timezone A'), + CountryTimezone.new('ZZ/TimezoneC', Rational(-10, 3), Rational(-20, 7), 'C'), + CountryTimezone.new('ZZ/TimezoneD', Rational(-10, 3), Rational(-20, 7))], + ci.zones) + assert(ci.zones.frozen?) + assert(!ci.zones.equal?(zones)) + assert(!zones.frozen?) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_zoneinfo_data_source.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_zoneinfo_data_source.rb new file mode 100644 index 000000000000..fe517cbb6a64 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_zoneinfo_data_source.rb @@ -0,0 +1,1204 @@ +# encoding: UTF-8 + +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') +require 'fileutils' +require 'pathname' +require 'tmpdir' + +include TZInfo + +# Use send as a workaround for an issue on JRuby 9.2.9.0 where using the +# refinement causes calls to RubyCoreSupport.file_open to fail to pass the block +# parameter. +# +# https://travis-ci.org/tzinfo/tzinfo/jobs/628812051#L1931 +# https://github.com/jruby/jruby/issues/6009 +send(:using, TZInfo::RubyCoreSupport::UntaintExt) if TZInfo::RubyCoreSupport.const_defined?(:UntaintExt) +send(:using, TaintExt) if Module.const_defined?(:TaintExt) + +class TCZoneinfoDataSource < Minitest::Test + ZONEINFO_DIR = File.join(File.expand_path(File.dirname(__FILE__)), 'zoneinfo').untaint + + def setup + @orig_search_path = ZoneinfoDataSource.search_path.clone + @orig_alternate_iso3166_tab_search_path = ZoneinfoDataSource.alternate_iso3166_tab_search_path.clone + @orig_pwd = FileUtils.pwd + + # A zoneinfo directory containing files needed by the tests. + # The symlinks in this directory are set up in test_utils.rb. + @data_source = ZoneinfoDataSource.new(ZONEINFO_DIR) + end + + def teardown + ZoneinfoDataSource.search_path = @orig_search_path + ZoneinfoDataSource.alternate_iso3166_tab_search_path = @orig_alternate_iso3166_tab_search_path + FileUtils.chdir(@orig_pwd) + end + + def test_default_search_path + assert_equal(['/usr/share/zoneinfo', '/usr/share/lib/zoneinfo', '/etc/zoneinfo'], ZoneinfoDataSource.search_path) + assert_equal(false, ZoneinfoDataSource.search_path.frozen?) + end + + def test_set_search_path_default + ZoneinfoDataSource.search_path = ['/tmp/zoneinfo1', '/tmp/zoneinfo2'] + assert_equal(['/tmp/zoneinfo1', '/tmp/zoneinfo2'], ZoneinfoDataSource.search_path) + + ZoneinfoDataSource.search_path = nil + assert_equal(['/usr/share/zoneinfo', '/usr/share/lib/zoneinfo', '/etc/zoneinfo'], ZoneinfoDataSource.search_path) + assert_equal(false, ZoneinfoDataSource.search_path.frozen?) + end + + def test_set_search_path_array + path = ['/tmp/zoneinfo1', '/tmp/zoneinfo2'] + ZoneinfoDataSource.search_path = path + assert_equal(['/tmp/zoneinfo1', '/tmp/zoneinfo2'], ZoneinfoDataSource.search_path) + refute_same(path, ZoneinfoDataSource.search_path) + end + + def test_set_search_path_array_to_s + ZoneinfoDataSource.search_path = [Pathname.new('/tmp/zoneinfo3')] + assert_equal(['/tmp/zoneinfo3'], ZoneinfoDataSource.search_path) + end + + def test_set_search_path_string + ZoneinfoDataSource.search_path = ['/tmp/zoneinfo4', '/tmp/zoneinfo5'].join(File::PATH_SEPARATOR) + assert_equal(['/tmp/zoneinfo4', '/tmp/zoneinfo5'], ZoneinfoDataSource.search_path) + end + + def test_default_alternate_iso3166_tab_search_path + assert_equal(['/usr/share/misc/iso3166.tab', '/usr/share/misc/iso3166'], ZoneinfoDataSource.alternate_iso3166_tab_search_path) + assert_equal(false, ZoneinfoDataSource.alternate_iso3166_tab_search_path.frozen?) + end + + def test_set_alternate_iso3166_tab_search_path_default + ZoneinfoDataSource.alternate_iso3166_tab_search_path = ['/tmp/iso3166.tab', '/tmp/iso3166'] + assert_equal(['/tmp/iso3166.tab', '/tmp/iso3166'], ZoneinfoDataSource.alternate_iso3166_tab_search_path) + + ZoneinfoDataSource.alternate_iso3166_tab_search_path = nil + assert_equal(['/usr/share/misc/iso3166.tab', '/usr/share/misc/iso3166'], ZoneinfoDataSource.alternate_iso3166_tab_search_path) + assert_equal(false, ZoneinfoDataSource.alternate_iso3166_tab_search_path.frozen?) + end + + def test_set_alternate_iso3166_tab_search_path_array + path = ['/tmp/iso3166.tab', '/tmp/iso3166'] + ZoneinfoDataSource.alternate_iso3166_tab_search_path = path + assert_equal(['/tmp/iso3166.tab', '/tmp/iso3166'], ZoneinfoDataSource.alternate_iso3166_tab_search_path) + refute_same(path, ZoneinfoDataSource.alternate_iso3166_tab_search_path) + end + + def test_set_alternate_iso3166_tab_search_path_array_to_s + ZoneinfoDataSource.alternate_iso3166_tab_search_path = [Pathname.new('/tmp/iso3166.tab')] + assert_equal(['/tmp/iso3166.tab'], ZoneinfoDataSource.alternate_iso3166_tab_search_path) + end + + def test_set_alternate_iso3166_tab_search_path_string + ZoneinfoDataSource.alternate_iso3166_tab_search_path = ['/tmp/iso3166.tab', '/tmp/iso3166'].join(File::PATH_SEPARATOR) + assert_equal(['/tmp/iso3166.tab', '/tmp/iso3166'], ZoneinfoDataSource.alternate_iso3166_tab_search_path) + end + + def test_new_search + Dir.mktmpdir('tzinfo_test_dir1') do |dir1| + Dir.mktmpdir('tzinfo_test_dir2') do |dir2| + Dir.mktmpdir('tzinfo_test_dir3') do |dir3| + Dir.mktmpdir('tzinfo_test_dir4') do |dir4| + file = File.join(dir1, 'file') + FileUtils.touch(File.join(dir2, 'zone.tab')) + FileUtils.touch(File.join(dir3, 'iso3166.tab')) + FileUtils.touch(File.join(dir4, 'zone.tab')) + FileUtils.touch(File.join(dir4, 'iso3166.tab')) + + ZoneinfoDataSource.search_path = [file, dir2, dir3, dir4] + ZoneinfoDataSource.alternate_iso3166_tab_search_path = [] + + data_source = ZoneinfoDataSource.new + assert_equal(dir4, data_source.zoneinfo_dir) + end + end + end + end + end + + def test_new_search_zone1970 + Dir.mktmpdir('tzinfo_test_dir1') do |dir1| + Dir.mktmpdir('tzinfo_test_dir2') do |dir2| + Dir.mktmpdir('tzinfo_test_dir3') do |dir3| + Dir.mktmpdir('tzinfo_test_dir4') do |dir4| + file = File.join(dir1, 'file') + FileUtils.touch(File.join(dir2, 'zone1970.tab')) + FileUtils.touch(File.join(dir3, 'iso3166.tab')) + FileUtils.touch(File.join(dir4, 'zone1970.tab')) + FileUtils.touch(File.join(dir4, 'iso3166.tab')) + + ZoneinfoDataSource.search_path = [file, dir2, dir3, dir4] + ZoneinfoDataSource.alternate_iso3166_tab_search_path = [] + + data_source = ZoneinfoDataSource.new + assert_equal(dir4, data_source.zoneinfo_dir) + end + end + end + end + end + + def test_new_search_solaris_tab_files + # Solaris names the tab files 'tab/country.tab' (iso3166.tab) and + # 'tab/zone_sun.tab' (zone.tab). + + Dir.mktmpdir('tzinfo_test_dir') do |dir| + tab = File.join(dir, 'tab') + FileUtils.mkdir(tab) + FileUtils.touch(File.join(tab, 'country.tab')) + FileUtils.touch(File.join(tab, 'zone_sun.tab')) + + ZoneinfoDataSource.search_path = [dir] + ZoneinfoDataSource.alternate_iso3166_tab_search_path = [] + + data_source = ZoneinfoDataSource.new + assert_equal(dir, data_source.zoneinfo_dir) + end + end + + def test_new_search_alternate_iso3166_path + Dir.mktmpdir('tzinfo_test_dir_zoneinfo') do |zoneinfo_dir| + Dir.mktmpdir('tzinfo_test_dir_tab') do |tab_dir| + FileUtils.touch(File.join(zoneinfo_dir, 'zone.tab')) + + tab_file = File.join(tab_dir, 'iso3166') + + ZoneinfoDataSource.search_path = [zoneinfo_dir] + ZoneinfoDataSource.alternate_iso3166_tab_search_path = [tab_file] + + assert_raises(ZoneinfoDirectoryNotFound) do + ZoneinfoDataSource.new + end + + FileUtils.touch(tab_file) + + data_source = ZoneinfoDataSource.new + assert_equal(zoneinfo_dir, data_source.zoneinfo_dir) + end + end + end + + def test_new_search_not_found + Dir.mktmpdir('tzinfo_test_dir1') do |dir1| + Dir.mktmpdir('tzinfo_test_dir2') do |dir2| + Dir.mktmpdir('tzinfo_test_dir3') do |dir3| + Dir.mktmpdir('tzinfo_test_dir4') do |dir4| + Dir.mktmpdir('tzinfo_test_dir5') do |dir5| + file = File.join(dir1, 'file') + FileUtils.touch(file) + FileUtils.touch(File.join(dir2, 'zone.tab')) + FileUtils.touch(File.join(dir3, 'zone1970.tab')) + FileUtils.touch(File.join(dir4, 'iso3166.tab')) + + ZoneinfoDataSource.search_path = [file, dir2, dir3, dir4, dir5] + ZoneinfoDataSource.alternate_iso3166_tab_search_path = [] + + assert_raises(ZoneinfoDirectoryNotFound) do + ZoneinfoDataSource.new + end + end + end + end + end + end + end + + def test_new_search_relative + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + FileUtils.chdir(dir) + + ZoneinfoDataSource.search_path = ['.'] + ZoneinfoDataSource.alternate_iso3166_tab_search_path = [] + data_source = ZoneinfoDataSource.new + assert_equal(Pathname.new(dir).realpath.to_s, data_source.zoneinfo_dir) + + # Change out of the directory to allow it to be deleted on Windows. + FileUtils.chdir(@orig_pwd) + end + end + + def test_new_dir + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + data_source = ZoneinfoDataSource.new(dir) + assert_equal(dir, data_source.zoneinfo_dir) + end + end + + def test_new_dir_zone1970 + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone1970.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + data_source = ZoneinfoDataSource.new(dir) + assert_equal(dir, data_source.zoneinfo_dir) + end + end + + def test_new_dir_solaris_tab_files + # Solaris names the tab files 'tab/country.tab' (iso3166.tab) and + # 'tab/zone_sun.tab' (zone.tab). + + Dir.mktmpdir('tzinfo_test') do |dir| + tab = File.join(dir, 'tab') + FileUtils.mkdir(tab) + FileUtils.touch(File.join(tab, 'country.tab')) + FileUtils.touch(File.join(tab, 'zone_sun.tab')) + + data_source = ZoneinfoDataSource.new(dir) + assert_equal(dir, data_source.zoneinfo_dir) + end + end + + def test_new_dir_alternate_iso3166_path + Dir.mktmpdir('tzinfo_test_dir_zoneinfo') do |zoneinfo_dir| + Dir.mktmpdir('tzinfo_test_dir_tab') do |tab_dir| + FileUtils.touch(File.join(zoneinfo_dir, 'zone.tab')) + + tab_file = File.join(tab_dir, 'iso3166') + FileUtils.touch(tab_file) + + ZoneinfoDataSource.alternate_iso3166_tab_search_path = [tab_file] + + assert_raises(InvalidZoneinfoDirectory) do + # The alternate_iso3166_tab_search_path should not be used. This should raise + # an exception. + ZoneinfoDataSource.new(zoneinfo_dir) + end + + data_source = ZoneinfoDataSource.new(zoneinfo_dir, tab_file) + assert_equal(zoneinfo_dir, data_source.zoneinfo_dir) + end + end + end + + def test_new_dir_invalid + Dir.mktmpdir('tzinfo_test') do |dir| + assert_raises(InvalidZoneinfoDirectory) do + ZoneinfoDataSource.new(dir) + end + end + end + + def test_new_dir_invalid_alternate_iso3166_path + Dir.mktmpdir('tzinfo_test_dir_zoneinfo') do |zoneinfo_dir| + Dir.mktmpdir('tzinfo_test_dir_tab') do |tab_dir| + FileUtils.touch(File.join(zoneinfo_dir, 'zone.tab')) + + assert_raises(InvalidZoneinfoDirectory) do + ZoneinfoDataSource.new(zoneinfo_dir, File.join(tab_dir, 'iso3166')) + end + end + end + end + + def test_new_dir_invalid_alternate_iso3166_path_overrides_valid + Dir.mktmpdir('tzinfo_test_dir_zoneinfo') do |zoneinfo_dir| + Dir.mktmpdir('tzinfo_test_dir_tab') do |tab_dir| + FileUtils.touch(File.join(zoneinfo_dir, 'iso3166.tab')) + FileUtils.touch(File.join(zoneinfo_dir, 'zone.tab')) + + assert_raises(InvalidZoneinfoDirectory) do + ZoneinfoDataSource.new(zoneinfo_dir, File.join(tab_dir, 'iso3166')) + end + end + end + end + + def test_new_file + Dir.mktmpdir('tzinfo_test') do |dir| + file = File.join(dir, 'file') + FileUtils.touch(file) + + assert_raises(InvalidZoneinfoDirectory) do + ZoneinfoDataSource.new(file) + end + end + end + + def test_new_dir_relative + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + FileUtils.chdir(dir) + + data_source = ZoneinfoDataSource.new('.') + assert_equal(Pathname.new(dir).realpath.to_s, data_source.zoneinfo_dir) + + # Change out of the directory to allow it to be deleted on Windows. + FileUtils.chdir(@orig_pwd) + end + end + + def test_zoneinfo_dir + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + data_source = ZoneinfoDataSource.new(dir) + assert_equal(dir, data_source.zoneinfo_dir) + assert_equal(true, data_source.zoneinfo_dir.frozen?) + end + end + + def test_load_timezone_info_data + info = @data_source.load_timezone_info('Europe/London') + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('Europe/London', info.identifier) + end + + def test_load_timezone_info_linked + info = @data_source.load_timezone_info('UTC') + + # On platforms that don't support symlinks, 'UTC' will be created as a copy. + # Either way, a ZoneinfoTimezoneInfo should be returned. + + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('UTC', info.identifier) + end + + def test_load_timezone_info_does_not_exist + assert_raises(InvalidTimezoneIdentifier) do + @data_source.load_timezone_info('Nowhere/Special') + end + end + + def test_load_timezone_info_invalid + assert_raises(InvalidTimezoneIdentifier) do + @data_source.load_timezone_info('../Definitions/Europe/London') + end + end + + %w(leapseconds localtime).each do |file_name| + define_method("test_load_timezone_info_ignored_#{file_name}_file") do + assert_raises(InvalidTimezoneIdentifier) do + @data_source.load_timezone_info(file_name) + end + end + end + + def test_load_timezone_info_ignored_plus_version_file + # Mac OS X includes a file named +VERSION containing the tzdata version. + + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + File.open(File.join(dir, '+VERSION'), 'w') do |f| + f.binmode + f.write("2013a\n") + end + + data_source = ZoneinfoDataSource.new(dir) + + assert_raises(InvalidTimezoneIdentifier) do + data_source.load_timezone_info('+VERSION') + end + end + end + + def test_load_timezone_info_ignored_timeconfig_symlink + # Slackware includes a symlink named timeconfig that points at /usr/sbin/timeconfig. + + Dir.mktmpdir('tzinfo_test_target') do |target_dir| + target_path = File.join(target_dir, 'timeconfig') + + File.open(target_path, 'w') do |f| + f.write("#!/bin/sh\n") + f.write("#\n") + f.write('# timeconfig Slackware Linux timezone configuration utility.\n') + end + + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + FileUtils.cp(File.join(@data_source.zoneinfo_dir, 'EST'), File.join(dir, 'EST')) + + symlink_path = File.join(dir, 'timeconfig') + begin + FileUtils.ln_s(target_path, symlink_path) + rescue NotImplementedError, Errno::EACCES + # Symlinks not supported on this platform, or permission denied + # (administrative rights are required on Windows). Copy instead. + FileUtils.cp(target_path, symlink_path) + end + + data_source = ZoneinfoDataSource.new(dir) + + assert_raises(InvalidTimezoneIdentifier) do + data_source.load_timezone_info('timeconfig') + end + end + end + end + + def test_load_timezone_info_nil + assert_raises(InvalidTimezoneIdentifier) do + @data_source.load_timezone_info(nil) + end + end + + def test_load_timezone_info_case + assert_raises(InvalidTimezoneIdentifier) do + @data_source.load_timezone_info('europe/london') + end + end + + def test_load_timezone_info_permission_denied + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + file = File.join(dir, 'UTC') + FileUtils.touch(file) + FileUtils.chmod(0200, file) + + data_source = ZoneinfoDataSource.new(dir) + + assert_raises(InvalidTimezoneIdentifier) do + data_source.load_timezone_info('UTC') + end + end + end + + def test_load_timezone_info_directory + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + subdir = File.join(dir, 'Subdir') + FileUtils.mkdir(subdir) + + data_source = ZoneinfoDataSource.new(dir) + + assert_raises(InvalidTimezoneIdentifier) do + data_source.load_timezone_info('Subdir') + end + end + end + + def test_load_timezone_info_linked_absolute_outside + Dir.mktmpdir('tzinfo_test') do |dir| + Dir.mktmpdir('tzinfo_test') do |outside| + outside_file = File.join(outside, 'EST') + FileUtils.cp(File.join(@data_source.zoneinfo_dir, 'EST'), outside_file) + + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + file = File.join(dir, 'EST') + + begin + FileUtils.ln_s(outside_file, file) + rescue NotImplementedError, Errno::EACCES + # Symlinks not supported on this platform, or permission denied + # (administrative rights are required on Windows). Skip test. + return + end + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_timezone_info('EST') + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('EST', info.identifier) + end + end + end + + def test_load_timezone_info_linked_absolute_inside + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + FileUtils.cp(File.join(@data_source.zoneinfo_dir, 'EST'), File.join(dir, 'EST')) + + link = File.join(dir, 'Link') + + begin + FileUtils.ln_s(File.join(File.expand_path(dir), 'EST'), link) + rescue NotImplementedError, Errno::EACCES + # Symlinks not supported on this platform, or permission denied + # (administrative rights are required on Windows). Skip test. + return + end + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_timezone_info('Link') + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('Link', info.identifier) + end + end + + def test_load_timezone_info_linked_relative_outside + Dir.mktmpdir('tzinfo_test') do |root| + FileUtils.cp(File.join(@data_source.zoneinfo_dir, 'EST'), File.join(root, 'outside')) + + dir = File.join(root, 'zoneinfo') + FileUtils.mkdir(dir) + + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + link = File.join(dir, 'Link') + + begin + FileUtils.ln_s('../outside', link) + rescue NotImplementedError, Errno::EACCES + # Symlinks not supported on this platform, or permission denied + # (administrative rights are required on Windows). Skip test. + return + end + + subdir = File.join(dir, 'Subdir') + subdir_link = File.join(subdir, 'Link') + FileUtils.mkdir(subdir) + FileUtils.ln_s('../../outside', subdir_link) + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_timezone_info('Link') + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('Link', info.identifier) + + info = data_source.load_timezone_info('Subdir/Link') + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('Subdir/Link', info.identifier) + end + end + + def test_load_timezone_info_linked_relative_parent_inside + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + FileUtils.cp(File.join(@data_source.zoneinfo_dir, 'EST'), File.join(dir, 'EST')) + + subdir = File.join(dir, 'Subdir') + FileUtils.mkdir(subdir) + FileUtils.cp(File.join(@data_source.zoneinfo_dir, 'EST'), File.join(subdir, 'EST')) + + subdir_link = File.join(subdir, 'Link') + begin + FileUtils.ln_s('../Subdir/EST', subdir_link) + rescue NotImplementedError, Errno::EACCES + # Symlinks not supported on this platform, or permission denied + # (administrative rights are required on Windows). Skip test. + return + end + + subdir_link2 = File.join(subdir, 'Link2') + FileUtils.ln_s('../EST', subdir_link2) + + subdir2 = File.join(dir, 'Subdir2') + FileUtils.mkdir(subdir2) + subdir2_link = File.join(subdir2, 'Link') + FileUtils.ln_s('../Subdir/EST', subdir2_link) + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_timezone_info('Subdir/Link') + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('Subdir/Link', info.identifier) + + info = data_source.load_timezone_info('Subdir/Link2') + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('Subdir/Link2', info.identifier) + + info = data_source.load_timezone_info('Subdir2/Link') + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('Subdir2/Link', info.identifier) + end + end + + def test_load_timezone_info_invalid_file + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + File.open(File.join(dir, 'Zone'), 'wb') do |file| + file.write('NotAValidTZifFile') + end + + data_source = ZoneinfoDataSource.new(dir) + + assert_raises(InvalidTimezoneIdentifier) do + data_source.load_timezone_info('Zone') + end + end + end + + def test_load_timezone_info_invalid_file_2 + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + + zone = File.join(dir, 'Zone') + + File.open(File.join(@data_source.zoneinfo_dir, 'EST')) do |src| + # Change header to TZif1 (which is not a valid header). + File.open(zone, 'wb') do |dest| + dest.write('TZif1') + src.pos = 5 + FileUtils.copy_stream(src, dest) + end + end + + data_source = ZoneinfoDataSource.new(dir) + + assert_raises(InvalidTimezoneIdentifier) do + data_source.load_timezone_info('Zone') + end + end + end + + def test_load_timezone_info_tainted + safe_test(:unavailable => :skip) do + identifier = 'Europe/Amsterdam'.dup.taint + assert(identifier.tainted?) + info = @data_source.load_timezone_info(identifier) + assert_equal('Europe/Amsterdam', info.identifier) + assert(identifier.tainted?) + end + end + + def test_load_timezone_info_tainted_and_frozen + safe_test do + info = @data_source.load_timezone_info('Europe/Amsterdam'.dup.taint.freeze) + assert_equal('Europe/Amsterdam', info.identifier) + end + end + + def test_load_timezone_info_tainted_zoneinfo_dir_safe_mode + safe_test(:unavailable => :skip) do + assert_raises(SecurityError) do + ZoneinfoDataSource.new(@data_source.zoneinfo_dir.dup.taint) + end + end + end + + def test_load_timezone_info_tainted_zoneinfo_dir + data_source = ZoneinfoDataSource.new(@data_source.zoneinfo_dir.dup.taint) + info = data_source.load_timezone_info('Europe/London') + assert_kind_of(ZoneinfoTimezoneInfo, info) + assert_equal('Europe/London', info.identifier) + end + + def get_timezone_filenames(directory) + entries = Dir.glob(File.join(directory, '**', '*')) + + entries = entries.select do |file| + file.untaint + File.file?(file) + end + + entries = entries.collect {|file| file[directory.length + File::SEPARATOR.length, file.length - directory.length - File::SEPARATOR.length]} + + # Exclude right (with leapseconds) and posix (copy) directories; .tab files; leapseconds, localtime and posixrules files. + entries = entries.select do |file| + file !~ /\A(posix|right)\// && + file !~ /\.tab\z/ && + !%w(leapseconds localtime posixrules).include?(file) + end + + entries.sort + end + + def test_timezone_identifiers + expected = get_timezone_filenames(@data_source.zoneinfo_dir) + all = @data_source.timezone_identifiers + assert_kind_of(Array, all) + assert_array_same_items(expected, all) + assert_equal(true, all.frozen?) + end + + def test_data_timezone_identifiers + expected = get_timezone_filenames(@data_source.zoneinfo_dir) + all_data = @data_source.data_timezone_identifiers + assert_kind_of(Array, all_data) + assert_array_same_items(expected, all_data) + assert_equal(true, all_data.frozen?) + end + + def test_linked_timezone_identifiers + all_linked = @data_source.linked_timezone_identifiers + assert_kind_of(Array, all_linked) + assert_equal(true, all_linked.empty?) + assert_equal(true, all_linked.frozen?) + end + + def test_timezone_identifiers_safe_mode + safe_test do + expected = get_timezone_filenames(@data_source.zoneinfo_dir) + all = @data_source.timezone_identifiers + assert_kind_of(Array, all) + assert_array_same_items(expected, all) + assert_equal(true, all.frozen?) + end + end + + def test_timezone_identifiers_ignored_plus_version_file + # Mac OS X includes a file named +VERSION containing the tzdata version. + + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + FileUtils.cp(File.join(@data_source.zoneinfo_dir, 'EST'), File.join(dir, 'EST')) + + File.open(File.join(dir, '+VERSION'), 'w') do |f| + f.binmode + f.write("2013a\n") + end + + data_source = ZoneinfoDataSource.new(dir) + assert_array_same_items(['EST'], data_source.timezone_identifiers) + end + end + + def test_timezone_identifiers_ignored_timeconfig_symlink + # Slackware includes a symlink named timeconfig that points at /usr/sbin/timeconfig. + + Dir.mktmpdir('tzinfo_test_target') do |target_dir| + target_path = File.join(target_dir, 'timeconfig') + + File.open(target_path, 'w') do |f| + f.write("#!/bin/sh\n") + f.write("#\n") + f.write('# timeconfig Slackware Linux timezone configuration utility.\n') + end + + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + FileUtils.cp(File.join(@data_source.zoneinfo_dir, 'EST'), File.join(dir, 'EST')) + + symlink_path = File.join(dir, 'timeconfig') + begin + FileUtils.ln_s(target_path, symlink_path) + rescue NotImplementedError, Errno::EACCES + # Symlinks not supported on this platform, or permission denied + # (administrative rights are required on Windows). Copy instead. + FileUtils.cp(target_path, symlink_path) + end + + data_source = ZoneinfoDataSource.new(dir) + assert_array_same_items(['EST'], data_source.timezone_identifiers) + end + end + end + + def test_timezone_identifiers_ignored_src_directory + # Solaris includes a src directory containing the source timezone data files + # from the tzdata distribution. These should be ignored. + + Dir.mktmpdir('tzinfo_test') do |dir| + FileUtils.touch(File.join(dir, 'zone.tab')) + FileUtils.touch(File.join(dir, 'iso3166.tab')) + FileUtils.cp(File.join(@data_source.zoneinfo_dir, 'EST'), File.join(dir, 'EST')) + + src_dir = File.join(dir, 'src') + FileUtils.mkdir(src_dir) + + File.open(File.join(src_dir, 'europe'), 'w') do |f| + f.binmode + f.write("Zone\tEurope/London\t0:00\tEU\tGMT/BST\n") + end + + data_source = ZoneinfoDataSource.new(dir) + assert_array_same_items(['EST'], data_source.timezone_identifiers) + end + end + + def test_load_country_info + info = @data_source.load_country_info('GB') + assert_equal('GB', info.code) + assert_equal('Britain (UK)', info.name) + end + + def test_load_country_info_not_exist + assert_raises(InvalidCountryCode) do + @data_source.load_country_info('ZZ') + end + end + + def test_load_country_info_invalid + assert_raises(InvalidCountryCode) do + @data_source.load_country_info('../Countries/GB') + end + end + + def test_load_country_info_nil + assert_raises(InvalidCountryCode) do + @data_source.load_country_info(nil) + end + end + + def test_load_country_info_case + assert_raises(InvalidCountryCode) do + @data_source.load_country_info('gb') + end + end + + def test_load_country_info_tainted + safe_test(:unavailable => :skip) do + code = 'NL'.dup.taint + assert(code.tainted?) + info = @data_source.load_country_info(code) + assert_equal('NL', info.code) + assert(code.tainted?) + end + end + + def test_load_country_info_tainted_and_frozen + safe_test do + info = @data_source.load_country_info('NL'.dup.taint.freeze) + assert_equal('NL', info.code) + end + end + + def test_load_country_info_check_zones + Dir.mktmpdir('tzinfo_test') do |dir| + RubyCoreSupport.open_file(File.join(dir, 'iso3166.tab'), 'w', :external_encoding => 'UTF-8') do |iso3166| + iso3166.puts('# iso3166.tab') + iso3166.puts('') + iso3166.puts("FC\tFake Country") + iso3166.puts("OC\tOther Country") + end + + RubyCoreSupport.open_file(File.join(dir, 'zone.tab'), 'w', :external_encoding => 'UTF-8') do |zone| + zone.puts('# zone.tab') + zone.puts('') + zone.puts("FC\t+513030-0000731\tFake/One\tDescription of one") + zone.puts("FC\t+353916+1394441\tFake/Two\tAnother description") + zone.puts("FC\t-2332-04637\tFake/Three\tThis is Three") + zone.puts("OC\t+5005+01426\tOther/One") + end + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_country_info('FC') + assert_equal('FC', info.code) + assert_equal('Fake Country', info.name) + assert_equal(['Fake/One', 'Fake/Two', 'Fake/Three'], info.zone_identifiers) + assert_equal(true, info.zone_identifiers.frozen?) + assert_equal([ + CountryTimezone.new('Fake/One', Rational(6181, 120), Rational(-451, 3600), 'Description of one'), + CountryTimezone.new('Fake/Two', Rational(32089, 900), Rational(503081, 3600), 'Another description'), + CountryTimezone.new('Fake/Three', Rational(-353, 15), Rational(-2797, 60), 'This is Three')], info.zones) + assert_equal(true, info.zones.frozen?) + + info = data_source.load_country_info('OC') + assert_equal('OC', info.code) + assert_equal('Other Country', info.name) + assert_equal(['Other/One'], info.zone_identifiers) + assert_equal(true, info.zone_identifiers.frozen?) + assert_equal([CountryTimezone.new('Other/One', Rational(601, 12), Rational(433, 30))], info.zones) + assert_equal(true, info.zones.frozen?) + end + end + + def test_load_country_info_check_zones_zone1970 + Dir.mktmpdir('tzinfo_test') do |dir| + RubyCoreSupport.open_file(File.join(dir, 'iso3166.tab'), 'w', :external_encoding => 'UTF-8') do |iso3166| + iso3166.puts('# iso3166.tab') + iso3166.puts('') + iso3166.puts("AC\tAnother Country") + iso3166.puts("FC\tFake Country") + iso3166.puts("OC\tOther Country") + end + + # zone.tab will be ignored. + RubyCoreSupport.open_file(File.join(dir, 'zone.tab'), 'w', :external_encoding => 'UTF-8') do |zone| + zone.puts('# zone.tab') + zone.puts('') + zone.puts("FC\t+513030-0000731\tFake/One\tDescription of one") + zone.puts("FC\t+353916+1394441\tFake/Two\tAnother description") + zone.puts("FC\t-2332-04637\tFake/Three\tThis is Three") + zone.puts("OC\t+5005+01426\tOther/One") + end + + # zone1970.tab will be used. + RubyCoreSupport.open_file(File.join(dir, 'zone1970.tab'), 'w', :external_encoding => 'UTF-8') do |zone| + zone.puts('# zone1970.tab') + zone.puts('') + zone.puts("AC,OC\t+0000+00000\tMiddle/Another/One\tAnother's One") + zone.puts("FC\t+513030-0000731\tFake/One\tDescription of one") + zone.puts("FC,OC\t+353916+1394441\tFake/Two\tAnother description") + zone.puts("FC,OC\t-2332-04637\tFake/Three\tThis is Three") + zone.puts("OC\t+5005+01426\tOther/One") + zone.puts("OC\t+5015+11426\tOther/Two") + end + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_country_info('AC') + assert_equal('AC', info.code) + assert_equal('Another Country', info.name) + assert_equal(['Middle/Another/One'], info.zone_identifiers) + assert_equal(true, info.zone_identifiers.frozen?) + assert_equal([CountryTimezone.new('Middle/Another/One', Rational(0, 1), Rational(0, 1), "Another's One")], info.zones) + assert_equal(true, info.zones.frozen?) + + info = data_source.load_country_info('FC') + assert_equal('FC', info.code) + assert_equal('Fake Country', info.name) + assert_equal(['Fake/One', 'Fake/Two', 'Fake/Three'], info.zone_identifiers) + assert_equal(true, info.zone_identifiers.frozen?) + assert_equal([ + CountryTimezone.new('Fake/One', Rational(6181, 120), Rational(-451, 3600), 'Description of one'), + CountryTimezone.new('Fake/Two', Rational(32089, 900), Rational(503081, 3600), 'Another description'), + CountryTimezone.new('Fake/Three', Rational(-353, 15), Rational(-2797, 60), 'This is Three')], info.zones) + assert_equal(true, info.zones.frozen?) + + # Testing the ordering of zones. A zone can either be primary (country + # code is the first in the first column), or secondary (country code is + # not the first). Should return all the primaries first in the order they + # appeared in the file, followed by all the secondaries in the order they + # appeared in file. + + info = data_source.load_country_info('OC') + assert_equal('OC', info.code) + assert_equal('Other Country', info.name) + assert_equal(['Other/One', 'Other/Two', 'Middle/Another/One', 'Fake/Two', 'Fake/Three'], info.zone_identifiers) + assert_equal(true, info.zone_identifiers.frozen?) + assert_equal([ + CountryTimezone.new('Other/One', Rational(601, 12), Rational( 433, 30)), + CountryTimezone.new('Other/Two', Rational(201, 4), Rational(3433, 30)), + CountryTimezone.new('Middle/Another/One', Rational(0, 1), Rational(0, 1), "Another's One"), + CountryTimezone.new('Fake/Two', Rational(32089, 900), Rational(503081, 3600), 'Another description'), + CountryTimezone.new('Fake/Three', Rational(-353, 15), Rational(-2797, 60), 'This is Three')], info.zones) + assert_equal(true, info.zones.frozen?) + end + end + + def test_load_country_info_check_zones_solaris_tab_files + # Solaris uses 5 columns instead of the usual 4 in zone_sun.tab. + # An extra column before the comment gives an optional linked/alternate + # timezone identifier (or '-' if not set). + # + # Additionally, there is a section at the end of the file for timezones + # covering regions. These are given lower-case "country" codes. The timezone + # identifier column refers to a continent instead of an identifier. These + # lines will be ignored by TZInfo. + + Dir.mktmpdir('tzinfo_test') do |dir| + tab_dir = File.join(dir, 'tab') + FileUtils.mkdir(tab_dir) + + RubyCoreSupport.open_file(File.join(tab_dir, 'country.tab'), 'w', :external_encoding => 'UTF-8') do |country| + country.puts('# country.tab') + country.puts('# Solaris') + country.puts("FC\tFake Country") + country.puts("OC\tOther Country") + end + + RubyCoreSupport.open_file(File.join(tab_dir, 'zone_sun.tab'), 'w', :external_encoding => 'UTF-8') do |zone_sun| + zone_sun.puts('# zone_sun.tab') + zone_sun.puts('# Solaris') + zone_sun.puts('# Countries') + zone_sun.puts("FC\t+513030-0000731\tFake/One\t-\tDescription of one") + zone_sun.puts("FC\t+353916+1394441\tFake/Two\tFake/Alias/Two\tAnother description") + zone_sun.puts("FC\t-2332-04637\tFake/Three\tFake/Alias/Three\tThis is Three") + zone_sun.puts("OC\t+5005+01426\tOther/One\tOther/Linked/One") + zone_sun.puts("OC\t+5015+01436\tOther/Two\t-") + zone_sun.puts('# Regions') + zone_sun.puts("ee\t+0000+00000\tEurope/\tEET") + zone_sun.puts("me\t+0000+00000\tEurope/\tMET") + zone_sun.puts("we\t+0000+00000\tEurope/\tWET") + end + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_country_info('FC') + assert_equal('FC', info.code) + assert_equal('Fake Country', info.name) + assert_equal(['Fake/One', 'Fake/Two', 'Fake/Three'], info.zone_identifiers) + assert_equal(true, info.zone_identifiers.frozen?) + assert_equal([ + CountryTimezone.new('Fake/One', Rational(6181, 120), Rational(-451, 3600), 'Description of one'), + CountryTimezone.new('Fake/Two', Rational(32089, 900), Rational(503081, 3600), 'Another description'), + CountryTimezone.new('Fake/Three', Rational(-353, 15), Rational(-2797, 60), 'This is Three')], info.zones) + assert_equal(true, info.zones.frozen?) + + info = data_source.load_country_info('OC') + assert_equal('OC', info.code) + assert_equal('Other Country', info.name) + assert_equal(['Other/One', 'Other/Two'], info.zone_identifiers) + assert_equal(true, info.zone_identifiers.frozen?) + assert_equal([ + CountryTimezone.new('Other/One', Rational(601, 12), Rational(433, 30)), + CountryTimezone.new('Other/Two', Rational(201, 4), Rational(73, 5))], info.zones) + assert_equal(true, info.zones.frozen?) + end + end + + def test_load_country_info_check_zones_alternate_iso3166_file + Dir.mktmpdir('tzinfo_test') do |dir| + zoneinfo_dir = File.join(dir, 'zoneinfo') + tab_dir = File.join(dir, 'tab') + FileUtils.mkdir(zoneinfo_dir) + FileUtils.mkdir(tab_dir) + + tab_file = File.join(tab_dir, 'iso3166') + RubyCoreSupport.open_file(tab_file, 'w', :external_encoding => 'UTF-8') do |iso3166| + # Use the BSD 4 column format (alternate iso3166 is used on BSD). + iso3166.puts("FC\tFCC\t001\tFake Country") + iso3166.puts("OC\tOCC\t002\tOther Country") + end + + RubyCoreSupport.open_file(File.join(zoneinfo_dir, 'zone.tab'), 'w', :external_encoding => 'UTF-8') do |zone| + zone.puts("FC\t+513030-0000731\tFake/One\tDescription of one") + zone.puts("FC\t+353916+1394441\tFake/Two\tAnother description") + zone.puts("FC\t-2332-04637\tFake/Three\tThis is Three") + zone.puts("OC\t+5005+01426\tOther/One") + end + + data_source = ZoneinfoDataSource.new(zoneinfo_dir, tab_file) + + info = data_source.load_country_info('FC') + assert_equal('FC', info.code) + assert_equal('Fake Country', info.name) + assert_equal(['Fake/One', 'Fake/Two', 'Fake/Three'], info.zone_identifiers) + assert_equal(true, info.zone_identifiers.frozen?) + assert_equal([ + CountryTimezone.new('Fake/One', Rational(6181, 120), Rational(-451, 3600), 'Description of one'), + CountryTimezone.new('Fake/Two', Rational(32089, 900), Rational(503081, 3600), 'Another description'), + CountryTimezone.new('Fake/Three', Rational(-353, 15), Rational(-2797, 60), 'This is Three')], info.zones) + assert_equal(true, info.zones.frozen?) + + info = data_source.load_country_info('OC') + assert_equal('OC', info.code) + assert_equal('Other Country', info.name) + assert_equal(['Other/One'], info.zone_identifiers) + assert_equal(true, info.zone_identifiers.frozen?) + assert_equal([CountryTimezone.new('Other/One', Rational(601, 12), Rational(433, 30))], info.zones) + assert_equal(true, info.zones.frozen?) + end + end + + def test_load_country_info_four_column_iso31611 + # OpenBSD and FreeBSD use a 4 column iso3166.tab file that includes + # alpha-3 and numeric-3 codes in addition to the alpha-2 and name in the + # tz database version. + + Dir.mktmpdir('tzinfo_test') do |dir| + RubyCoreSupport.open_file(File.join(dir, 'iso3166.tab'), 'w', :external_encoding => 'UTF-8') do |iso3166| + iso3166.puts("FC\tFCC\t001\tFake Country") + iso3166.puts("OC\tOCC\t002\tOther Country") + end + + RubyCoreSupport.open_file(File.join(dir, 'zone.tab'), 'w', :external_encoding => 'UTF-8') do |zone| + zone.puts("FC\t+513030-0000731\tFake/One\tDescription of one") + zone.puts("OC\t+5005+01426\tOther/One") + end + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_country_info('FC') + assert_equal('FC', info.code) + assert_equal('Fake Country', info.name) + + info = data_source.load_country_info('OC') + assert_equal('OC', info.code) + assert_equal('Other Country', info.name) + end + end + + def test_load_country_info_utf8 + # iso3166.tab is currently in ASCII (as of tzdata 2014f), but will be + # changed to UTF-8 in the future. + + # zone.tab is in ASCII, with no plans to change. Since ASCII is a subset of + # UTF-8, test that this is loaded in UTF-8 anyway. + + Dir.mktmpdir('tzinfo_test') do |dir| + RubyCoreSupport.open_file(File.join(dir, 'iso3166.tab'), 'w', :external_encoding => 'UTF-8') do |iso3166| + iso3166.puts("UT\tUnicode Test ✓") + end + + RubyCoreSupport.open_file(File.join(dir, 'zone.tab'), 'w', :external_encoding => 'UTF-8') do |zone| + zone.puts("UT\t+513030-0000731\tUnicode✓/One\tUnicode Description ✓") + end + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_country_info('UT') + assert_equal('UT', info.code) + assert_equal('Unicode Test ✓', info.name) + assert_equal(['Unicode✓/One'], info.zone_identifiers) + assert_equal([CountryTimezone.new('Unicode✓/One', Rational(6181, 120), Rational(-451, 3600), 'Unicode Description ✓')], info.zones) + end + end + + def test_load_country_info_utf8_zone1970 + # iso3166.tab is currently in ASCII (as of tzdata 2014f), but will be + # changed to UTF-8 in the future. + + # zone1970.tab is in UTF-8. + + Dir.mktmpdir('tzinfo_test') do |dir| + RubyCoreSupport.open_file(File.join(dir, 'iso3166.tab'), 'w', :external_encoding => 'UTF-8') do |iso3166| + iso3166.puts("UT\tUnicode Test ✓") + end + + RubyCoreSupport.open_file(File.join(dir, 'zone1970.tab'), 'w', :external_encoding => 'UTF-8') do |zone| + zone.puts("UT\t+513030-0000731\tUnicode✓/One\tUnicode Description ✓") + end + + data_source = ZoneinfoDataSource.new(dir) + + info = data_source.load_country_info('UT') + assert_equal('UT', info.code) + assert_equal('Unicode Test ✓', info.name) + assert_equal(['Unicode✓/One'], info.zone_identifiers) + assert_equal([CountryTimezone.new('Unicode✓/One', Rational(6181, 120), Rational(-451, 3600), 'Unicode Description ✓')], info.zones) + end + end + + def test_country_codes + file_codes = [] + + RubyCoreSupport.open_file(File.join(@data_source.zoneinfo_dir, 'iso3166.tab'), 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') do |file| + file.each_line do |line| + line.chomp! + file_codes << $1 if line =~ /\A([A-Z]{2})\t/ + end + end + + codes = @data_source.country_codes + assert_array_same_items(file_codes, codes) + assert_equal(true, codes.frozen?) + end + + def test_country_codes_four_column_iso3166 + # OpenBSD and FreeBSD use a 4 column iso3166.tab file that includes + # alpha-3 and numeric-3 codes in addition to the alpha-2 and name in the + # tz database version. + + Dir.mktmpdir('tzinfo_test') do |dir| + RubyCoreSupport.open_file(File.join(dir, 'iso3166.tab'), 'w', :external_encoding => 'UTF-8') do |iso3166| + iso3166.puts("FC\tFCC\t001\tFake Country") + iso3166.puts("OC\tOCC\t002\tOther Country") + end + + RubyCoreSupport.open_file(File.join(dir, 'zone.tab'), 'w', :external_encoding => 'UTF-8') do |zone| + zone.puts("FC\t+513030-0000731\tFake/One\tDescription of one") + zone.puts("OC\t+5005+01426\tOther/One") + end + + data_source = ZoneinfoDataSource.new(dir) + + codes = data_source.country_codes + assert_array_same_items(%w(FC OC), codes) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_zoneinfo_timezone_info.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_zoneinfo_timezone_info.rb new file mode 100644 index 000000000000..7d66282ebab5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tc_zoneinfo_timezone_info.rb @@ -0,0 +1,2153 @@ +# encoding: UTF-8 + +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') +require 'tempfile' + +include TZInfo + +# Use send as a workaround for erroneous 'wrong number of arguments' errors with +# JRuby 9.0.5.0 when calling methods with Java implementations. See #114. +send(:using, RubyCoreSupport::UntaintExt) if RubyCoreSupport.const_defined?(:UntaintExt) + +class TCZoneinfoTimezoneInfo < Minitest::Test + class FakePosixTimeZoneParser + def initialize(&block) + @on_parse = block + end + + def parse(tz_string) + @on_parse.call(tz_string) + end + end + + begin + Time.at(-2147483649) + Time.at(2147483648) + SUPPORTS_64BIT = true + rescue RangeError + SUPPORTS_64BIT = false + end + + begin + Time.at(-1) + Time.at(-2147483648) + SUPPORTS_NEGATIVE = true + rescue ArgumentError + SUPPORTS_NEGATIVE = false + end + + def setup + @expect_tz_string = nil + @tz_parse_result = nil + @posix_tz_parser = FakePosixTimeZoneParser.new do |tz_string| + raise "Unexpected tz_string passed to PosixTimeZoneParser: #{tz_string}" unless tz_string == @expect_tz_string + raise InvalidPosixTimeZone, 'FakePosixTimeZoneParser Failure.' if @tz_parse_result == :fail + @tz_parse_result + end + end + + def assert_period(abbreviation, utc_offset, std_offset, dst, start_at, end_at, info) + if start_at + period = info.period_for_utc(start_at) + elsif end_at + period = info.period_for_utc(TimeOrDateTime.wrap(end_at).add_with_convert(-1).to_orig) + else + # no transitions, pick the epoch + period = info.period_for_utc(Time.utc(1970, 1, 1)) + end + + assert_equal(abbreviation, period.abbreviation, 'abbreviation') + assert_equal(utc_offset, period.utc_offset, 'utc_offset') + assert_equal(std_offset, period.std_offset, 'std_offset') + assert_equal(dst, period.dst?, 'dst') + + if start_at + refute_nil(period.utc_start_time, 'utc_start_time') + assert_equal(start_at, period.utc_start_time, 'utc_start_time') + else + assert_nil(period.utc_start_time, 'utc_start_time') + end + + if end_at + refute_nil(period.utc_end_time, 'utc_end_time') + assert_equal(end_at, period.utc_end_time, 'utc_end_time') + else + assert_nil(period.utc_end_time, 'utc_end_time') + end + end + + def convert_times_to_i(items, key = :at) + items.each do |item| + if item[key].kind_of?(Time) + item[key] = item[key].utc.to_i + end + end + end + + def select_with_32bit_values(items, key = :at) + items.select do |item| + i = item[key] + i >= -2147483648 && i <= 2147483647 + end + end + + def pack_int64_network_order(values) + values.collect {|value| [value >> 32, value & 0xFFFFFFFF]}.flatten.pack('NN' * values.length) + end + + def pack_int64_signed_network_order(values) + # Convert to the equivalent 64-bit unsigned integer with the same bit representation + pack_int64_network_order(values.collect {|value| value < 0 ? value + 0x10000000000000000 : value}) + end + + def write_tzif(format, offsets, transitions, tz_string, leaps, options = {}) + + # Options for testing malformed zoneinfo files. + magic = options[:magic] + section2_magic = options[:section2_magic] + abbrev_separator = options[:abbrev_separator] || "\0" + abbrev_offset_base = options[:abbrev_offset_base] || 0 + omit_tz_string_start_new_line = options[:omit_tz_string_start_new_line] + omit_tz_string_end_new_line = options[:omit_tz_string_end_new_line] + + unless magic + if format == 1 + magic = "TZif\0" + elsif format >= 2 + magic = "TZif#{format}" + else + raise ArgumentError, 'Invalid format specified' + end + end + + if section2_magic.kind_of?(Proc) + section2_magic = section2_magic.call(format) + else + section2_magic = magic unless section2_magic + end + + convert_times_to_i(transitions) + convert_times_to_i(leaps) + + abbrevs = offsets.collect {|o| o[:abbrev]}.uniq + + if abbrevs.length > 0 + abbrevs = abbrevs.collect {|a| a.encode('UTF-8')} if abbrevs.first.respond_to?(:encode) + + if abbrevs.first.respond_to?(:bytesize) + abbrevs_length = abbrevs.inject(0) {|sum, a| sum + a.bytesize + abbrev_separator.bytesize} + else + abbrevs_length = abbrevs.inject(0) {|sum, a| sum + a.length + abbrev_separator.length} + end + else + abbrevs_length = 0 + end + + b32_transitions = select_with_32bit_values(transitions) + b32_leaps = select_with_32bit_values(leaps) + + Tempfile.open('tzinfo-test-zone') do |file| + file.binmode + + file.write( + [magic, offsets.length, offsets.length, leaps.length, + b32_transitions.length, offsets.length, abbrevs_length].pack('a5 x15 NNNNNN')) + + unless b32_transitions.empty? + file.write(b32_transitions.collect {|t| t[:at]}.pack('N' * b32_transitions.length)) + file.write(b32_transitions.collect {|t| t[:offset_index]}.pack('C' * b32_transitions.length)) + end + + offsets.each do |offset| + index = abbrevs.index(offset[:abbrev]) + abbrev_offset = abbrev_offset_base + 0.upto(index - 1) {|i| abbrev_offset += abbrevs[i].length + 1} + + file.write([offset[:gmtoff], offset[:isdst] ? 1 : 0, abbrev_offset].pack('NCC')) + end + + abbrevs.each do |a| + file.write(a) + file.write(abbrev_separator) + end + + b32_leaps.each do |leap| + file.write([leap[:at], leap[:seconds]].pack('NN')) + end + + unless offsets.empty? + file.write("\0" * offsets.length * 2) + end + + if format >= 2 + file.write( + [section2_magic, offsets.length, offsets.length, leaps.length, + transitions.length, offsets.length, abbrevs_length].pack('a5 x15 NNNNNN')) + + unless transitions.empty? + file.write(pack_int64_signed_network_order(transitions.collect {|t| t[:at]})) + file.write(transitions.collect {|t| t[:offset_index]}.pack('C' * transitions.length)) + end + + offsets.each do |offset| + index = abbrevs.index(offset[:abbrev]) + abbrev_offset = abbrev_offset_base + 0.upto(index - 1) {|i| abbrev_offset += abbrevs[i].length + 1} + + file.write([offset[:gmtoff], offset[:isdst] ? 1 : 0, abbrev_offset].pack('NCC')) + end + + abbrevs.each do |a| + file.write(a) + file.write(abbrev_separator) + end + + leaps.each do |leap| + file.write(pack_int64_signed_network_order([leap[:at]])) + file.write([leap[:seconds]].pack('N')) + end + + unless offsets.empty? + file.write("\0" * offsets.length * 2) + end + + # Empty POSIX timezone string + file.write("\n") unless omit_tz_string_start_new_line + tz_string = tz_string.encode(Encoding::UTF_8) if tz_string.respond_to?(:encode) + file.write(tz_string) + file.write("\n") unless omit_tz_string_end_new_line + end + + file.flush + + yield file.path + end + end + + def tzif_test(offsets, transitions, options = {}, &block) + rules = options[:rules] + tz_string = options[:tz_string] || (rules ? "TEST_TZ_STRING_#{rand(1000000)}" : '') + leaps = options[:leaps] || [] + min_format = options[:min_format] || (tz_string.empty? ? 1 : 2) + + min_format.upto(3) do |format| + write_tzif(format, offsets, transitions, tz_string, leaps, options) do |path| + if format >= 2 + @tz_parse_result = rules + @expect_tz_string = tz_string + end + begin + yield path, format + ensure + @tz_parse_result = nil + @expect_tz_string = nil + end + end + end + end + + def test_load + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 0, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => Time.utc(1971, 1, 2), :offset_index => 1}, + {:at => Time.utc(1980, 4, 22), :offset_index => 2}, + {:at => Time.utc(1980, 10, 21), :offset_index => 1}, + {:at => Time.utc(2000, 12, 31), :offset_index => 3}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/One', path, @posix_tz_parser) + assert_equal('Zone/One', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1971, 1, 2), info) + assert_period(:XST, 3600, 0, false, Time.utc(1971, 1, 2), Time.utc(1980, 4, 22), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(1980, 4, 22), Time.utc(1980, 10, 21), info) + assert_period(:XST, 3600, 0, false, Time.utc(1980, 10, 21), Time.utc(2000, 12, 31), info) + assert_period(:XNST, 0, 0, false, Time.utc(2000, 12, 31), nil, info) + end + end + + def test_load_negative_utc_offset + offsets = [ + {:gmtoff => -12492, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => -12000, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => -8400, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => -8400, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => Time.utc(1971, 7, 9, 3, 0, 0), :offset_index => 1}, + {:at => Time.utc(1972, 10, 12, 3, 0, 0), :offset_index => 2}, + {:at => Time.utc(1973, 4, 29, 3, 0, 0), :offset_index => 1}, + {:at => Time.utc(1992, 4, 1, 4, 30, 0), :offset_index => 3}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/One', path, @posix_tz_parser) + assert_equal('Zone/One', info.identifier) + + assert_period(:LMT, -12492, 0, false, nil, Time.utc(1971, 7, 9, 3, 0, 0), info) + assert_period(:XST, -12000, 0, false, Time.utc(1971, 7, 9, 3, 0, 0), Time.utc(1972, 10, 12, 3, 0, 0), info) + assert_period(:XDT, -12000, 3600, true, Time.utc(1972, 10, 12, 3, 0, 0), Time.utc(1973, 4, 29, 3, 0, 0), info) + assert_period(:XST, -12000, 0, false, Time.utc(1973, 4, 29, 3, 0, 0), Time.utc(1992, 4, 1, 4, 30, 0), info) + assert_period(:XNST, -8400, 0, false, Time.utc(1992, 4, 1, 4, 30, 0), nil, info) + end + end + + def test_load_dst_first + offsets = [ + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 0, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => Time.utc(1979, 1, 2), :offset_index => 2}, + {:at => Time.utc(1980, 4, 22), :offset_index => 0}, + {:at => Time.utc(1980, 10, 21), :offset_index => 2}, + {:at => Time.utc(2000, 12, 31), :offset_index => 3}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/Two', path, @posix_tz_parser) + assert_equal('Zone/Two', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1979, 1, 2), info) + end + end + + def test_load_no_transitions + offsets = [{:gmtoff => -12094, :isdst => false, :abbrev => 'LT'}] + + tzif_test(offsets, []) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/three', path, @posix_tz_parser) + assert_equal('Zone/three', info.identifier) + + assert_period(:LT, -12094, 0, false, nil, nil, info) + end + end + + def test_load_no_offsets + offsets = [] + transitions = [{:at => Time.utc(2000, 12, 31), :offset_index => 0}] + + tzif_test(offsets, transitions) do |path, format| + assert_raises(InvalidZoneinfoFile) do + ZoneinfoTimezoneInfo.new('Zone', path, @posix_tz_parser) + end + end + end + + def test_load_invalid_offset_index + offsets = [{:gmtoff => -0, :isdst => false, :abbrev => 'LMT'}] + transitions = [{:at => Time.utc(2000, 12, 31), :offset_index => 2}] + + tzif_test(offsets, transitions) do |path, format| + assert_raises(InvalidZoneinfoFile) do + ZoneinfoTimezoneInfo.new('Zone', path, @posix_tz_parser) + end + end + end + + def test_load_with_leap_seconds + offsets = [{:gmtoff => -0, :isdst => false, :abbrev => 'LMT'}] + leaps = [{:at => Time.utc(1972,6,30,23,59,60), :seconds => 1}] + + tzif_test(offsets, [], :leaps => leaps) do |path, format| + assert_raises(InvalidZoneinfoFile) do + ZoneinfoTimezoneInfo.new('Zone', path, @posix_tz_parser) + end + end + end + + def test_load_invalid_magic + ['TZif4', 'tzif2', '12345'].each do |magic| + offsets = [{:gmtoff => -12094, :isdst => false, :abbrev => 'LT'}] + + tzif_test(offsets, [], :magic => magic) do |path, format| + assert_raises(InvalidZoneinfoFile) do + ZoneinfoTimezoneInfo.new('Zone2', path, @posix_tz_parser) + end + end + end + end + + def test_load_invalid_section2_magic + ['TZif4', 'tzif2', '12345'].each do |section2_magic| + offsets = [{:gmtoff => -12094, :isdst => false, :abbrev => 'LT'}] + + tzif_test(offsets, [], :min_format => 2, :section2_magic => section2_magic) do |path, format| + assert_raises(InvalidZoneinfoFile) do + ZoneinfoTimezoneInfo.new('Zone4', path, @posix_tz_parser) + end + end + end + end + + def test_load_mismatched_section2_magic + minus_one = Proc.new {|f| f == 2 ? "TZif\0" : "TZif#{f - 1}" } + plus_one = Proc.new {|f| "TZif#{f + 1}" } + + [minus_one, plus_one].each do |section2_magic| + offsets = [{:gmtoff => -12094, :isdst => false, :abbrev => 'LT'}] + + tzif_test(offsets, [], :min_format => 2, :section2_magic => section2_magic) do |path, format| + assert_raises(InvalidZoneinfoFile) do + ZoneinfoTimezoneInfo.new('Zone5', path, @posix_tz_parser) + end + end + end + end + + def test_load_invalid_format + Tempfile.open('tzinfo-test-zone') do |file| + file.write('Invalid') + file.flush + + assert_raises(InvalidZoneinfoFile) do + ZoneinfoTimezoneInfo.new('Zone3', file.path, @posix_tz_parser) + end + end + end + + def test_load_missing_abbrev_null_termination + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}] + + tzif_test(offsets, transitions, :abbrev_separator => '^') do |path, format| + assert_raises(InvalidZoneinfoFile) do + ZoneinfoTimezoneInfo.new('Zone', path, @posix_tz_parser) + end + end + end + + def test_load_out_of_range_abbrev_offsets + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}] + + tzif_test(offsets, transitions, :abbrev_offset_base => 8) do |path, format| + assert_raises(InvalidZoneinfoFile) do + ZoneinfoTimezoneInfo.new('Zone', path, @posix_tz_parser) + end + end + end + + def test_load_before_epoch + # Some platforms don't support negative timestamps for times before the + # epoch. Check that they are returned when supported and skipped when not. + + # Note the last transition before the epoch (and within the 32-bit range) is + # moved to the epoch on platforms that do not support negative timestamps. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 0, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => -694224000, :offset_index => 1}, # Time.utc(1948, 1, 2) + {:at => -21945600, :offset_index => 2}, # Time.utc(1969, 4, 22) + {:at => Time.utc(1970, 10, 21), :offset_index => 1}, + {:at => Time.utc(2000, 12, 31), :offset_index => 3}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/Negative', path, @posix_tz_parser) + assert_equal('Zone/Negative', info.identifier) + + if SUPPORTS_NEGATIVE + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1948, 1, 2), info) + assert_period(:XST, 3600, 0, false, Time.utc(1948, 1, 2), Time.utc(1969, 4, 22), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(1969, 4, 22), Time.utc(1970, 10, 21), info) + else + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1970, 1, 1), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(1970, 1, 1), Time.utc(1970, 10, 21), info) + end + + assert_period(:XST, 3600, 0, false, Time.utc(1970, 10, 21), Time.utc(2000, 12, 31), info) + assert_period(:XNST, 0, 0, false, Time.utc(2000, 12, 31), nil, info) + end + end + + def test_load_on_epoch + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 0, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => -694224000, :offset_index => 1}, # Time.utc(1948, 1, 2) + {:at => -21945600, :offset_index => 2}, # Time.utc(1969, 4, 22) + {:at => Time.utc(1970, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 12, 31), :offset_index => 3}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/Negative', path, @posix_tz_parser) + assert_equal('Zone/Negative', info.identifier) + + if SUPPORTS_NEGATIVE + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1948, 1, 2), info) + assert_period(:XST, 3600, 0, false, Time.utc(1948, 1, 2), Time.utc(1969, 4, 22), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(1969, 4, 22), Time.utc(1970, 1, 1), info) + else + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1970, 1, 1), info) + end + + assert_period(:XST, 3600, 0, false, Time.utc(1970, 1, 1), Time.utc(2000, 12, 31), info) + assert_period(:XNST, 0, 0, false, Time.utc(2000, 12, 31), nil, info) + end + end + + def test_load_64bit + # The TZif version2 and later format contains both 32-bit and 64-bit + # sections. The 64-bit section is always used. + # + # Negative transitions before the supported range are moved to the start of + # the supported range. + # + # Transitions after 2**31 - 1 are discarded if 64-bit times aren't + # supported. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 0, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => -3786739200, :offset_index => 1}, # Time.utc(1850, 1, 2) + {:at => Time.utc(2003, 4, 22), :offset_index => 2}, + {:at => Time.utc(2003, 10, 21), :offset_index => 1}, + {:at => 2240524800, :offset_index => 3}] # Time.utc(2040, 12, 31) + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/SixtyFour', path, @posix_tz_parser) + assert_equal('Zone/SixtyFour', info.identifier) + + if SUPPORTS_64BIT && SUPPORTS_NEGATIVE && format >= 2 + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1850, 1, 2), info) + assert_period(:XST, 3600, 0, false, Time.utc(1850, 1, 2), Time.utc(2003, 4, 22), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(2003, 4, 22), Time.utc(2003, 10, 21), info) + assert_period(:XST, 3600, 0, false, Time.utc(2003, 10, 21), Time.utc(2040, 12, 31), info) + assert_period(:XNST, 0, 0, false, Time.utc(2040, 12, 31), nil, info) + elsif format < 2 + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2003, 4, 22), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(2003, 4, 22), Time.utc(2003, 10, 21), info) + assert_period(:XST, 3600, 0, false, Time.utc(2003, 10, 21), nil, info) + else + min_supported = SUPPORTS_NEGATIVE ? -2**31 : 0 + assert_period(:LMT, 3542, 0, false, nil, Time.at(min_supported).utc, info) + assert_period(:XST, 3600, 0, false, Time.at(min_supported).utc, Time.utc(2003, 4, 22), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(2003, 4, 22), Time.utc(2003, 10, 21), info) + assert_period(:XST, 3600, 0, false, Time.utc(2003, 10, 21), nil, info) + end + end + end + + def test_load_64bit_range + # The full range of 64 bit timestamps is not currently supported because of + # the way transitions are indexed. The last transition before the earliest + # supported time will be moved to that time if there isn't already a + # transition at that time. Transitions after the latest supported time are + # ignored. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => -2**63, :offset_index => 1}, + {:at => Time.utc(2014, 5, 27), :offset_index => 2}, + {:at => 2**63 - 1, :offset_index => 0}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/SixtyFourRange', path, @posix_tz_parser) + assert_equal('Zone/SixtyFourRange', info.identifier) + + if SUPPORTS_64BIT && format >= 2 + # When the full range is supported, the following periods will be defined: + #assert_period(:LMT, 3542, 0, false, nil, Time.at(-2**63).utc, info) + #assert_period(:XST, 3600, 0, false, Time.at(-2**63).utc, Time.utc(2014, 5, 27), info) + #assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), Time.at(2**63 - 1).utc, info) + #assert_period(:LMT, 3542, 0, false, Time.at(2**63 - 1).utc, nil, info) + + # Without full range support, the following periods will be defined: + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1700, 1, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(1700, 1, 1), Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), nil, info) + elsif format < 2 + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), nil, info) + else + min_supported = SUPPORTS_NEGATIVE ? -2**31 : 0 + assert_period(:LMT, 3542, 0, false, nil, Time.at(min_supported).utc, info) + assert_period(:XST, 3600, 0, false, Time.at(min_supported).utc, Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), nil, info) + end + end + end + + def test_load_64bit_range_transition_at_earliest_supported + # The full range of 64 bit timestamps is not currently supported because of + # the way transitions are indexed. The last transition before the earliest + # supported time will be moved to that time if there isn't already a + # transition at that time. Transitions after the latest supported time are + # ignored. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST2'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => -2**63, :offset_index => 1}, + {:at => -8520336000, :offset_index => 2}, # Time.utc(1700, 1, 1).to_i + {:at => Time.utc(2014, 5, 27), :offset_index => 3}, + {:at => 2**63 - 1, :offset_index => 0}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/SixtyFourRange', path, @posix_tz_parser) + assert_equal('Zone/SixtyFourRange', info.identifier) + + if SUPPORTS_64BIT && format >= 2 + # When the full range is supported, the following periods will be defined: + #assert_period(:LMT, 3542, 0, false, nil, Time.at(-2**63).utc, info) + #assert_period(:XST, 3600, 0, false, Time.at(-2**63).utc, Time.utc(2014, 5, 27), info) + #assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), Time.at(2**63 - 1).utc, info) + #assert_period(:LMT, 3542, 0, false, Time.at(2**63 - 1).utc, nil, info) + + # Without full range support, the following periods will be defined: + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1700, 1, 1), info) + assert_period(:XST2, 3600, 0, false, Time.utc(1700, 1, 1), Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), nil, info) + elsif format < 2 + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), nil, info) + elsif SUPPORTS_NEGATIVE + assert_period(:LMT, 3542, 0, false, nil, Time.at(-2**31).utc, info) + assert_period(:XST, 3600, 0, false, Time.at(-2**31).utc, Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), nil, info) + else + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1970, 1, 1), info) + assert_period(:XST2, 3600, 0, false, Time.utc(1970, 1, 1), Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), nil, info) + end + end + end + + def test_load_supported_64bit_range + # The full range of 64 bit timestamps is not currently supported because of + # the way transitions are indexed. + + min_timestamp = -8520336000 # Time.utc(1700, 1, 1).to_i + max_timestamp = 16725225600 # Time.utc(2500, 1, 1).to_i + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => min_timestamp, :offset_index => 1}, + {:at => Time.utc(2014, 5, 27), :offset_index => 2}, + {:at => max_timestamp - 1, :offset_index => 0}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/SupportedSixtyFourRange', path, @posix_tz_parser) + assert_equal('Zone/SupportedSixtyFourRange', info.identifier) + + if SUPPORTS_64BIT && format >= 2 + assert_period(:LMT, 3542, 0, false, nil, Time.at(min_timestamp).utc, info) + assert_period(:XST, 3600, 0, false, Time.at(min_timestamp).utc, Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), Time.at(max_timestamp - 1).utc, info) + assert_period(:LMT, 3542, 0, false, Time.at(max_timestamp - 1).utc, nil, info) + elsif format < 2 + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), nil, info) + else + min_supported = SUPPORTS_NEGATIVE ? -2**31 : 0 + assert_period(:LMT, 3542, 0, false, nil, Time.at(min_supported).utc, info) + assert_period(:XST, 3600, 0, false, Time.at(min_supported).utc, Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), nil, info) + end + end + end + + def test_load_32bit_range + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XNST'}] + + transitions = [ + {:at => -2**31, :offset_index => 1}, + {:at => Time.utc(2014, 5, 27), :offset_index => 2}, + {:at => 2**31 - 1, :offset_index => 0}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/ThirtyTwoRange', path, @posix_tz_parser) + assert_equal('Zone/ThirtyTwoRange', info.identifier) + + min_supported = SUPPORTS_NEGATIVE ? -2**31 : 0 + assert_period(:LMT, 3542, 0, false, nil, Time.at(min_supported).utc, info) + assert_period(:XST, 3600, 0, false, Time.at(min_supported).utc, Time.utc(2014, 5, 27), info) + assert_period(:XNST, 7200, 0, false, Time.utc(2014, 5, 27), Time.at(2**31 - 1), info) + assert_period(:LMT, 3542, 0, false, Time.at(2**31 - 1).utc, nil, info) + end + end + + def test_load_std_offset_changes + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 2}, + {:at => Time.utc(2000, 3, 1), :offset_index => 3}, + {:at => Time.utc(2000, 4, 1), :offset_index => 1}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/DoubleDaylight', path, @posix_tz_parser) + assert_equal('Zone/DoubleDaylight', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XDDT, 3600, 7200, true, Time.utc(2000, 3, 1), Time.utc(2000, 4, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 4, 1), nil, info) + end + end + + def test_load_std_offset_changes_jump_to_double_dst + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDDT'}] + + transitions = [ + {:at => Time.utc(2000, 4, 1), :offset_index => 1}, + {:at => Time.utc(2000, 5, 1), :offset_index => 2}, + {:at => Time.utc(2000, 6, 1), :offset_index => 1}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/DoubleDaylight', path, @posix_tz_parser) + assert_equal('Zone/DoubleDaylight', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2000, 4, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 4, 1), Time.utc(2000, 5, 1), info) + assert_period(:XDDT, 3600, 7200, true, Time.utc(2000, 5, 1), Time.utc(2000, 6, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 6, 1), nil, info) + end + end + + def test_load_std_offset_changes_negative + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => -10821, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => -10800, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => -7200, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => -3600, :isdst => true, :abbrev => 'XDDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 2}, + {:at => Time.utc(2000, 3, 1), :offset_index => 3}, + {:at => Time.utc(2000, 4, 1), :offset_index => 1}, + {:at => Time.utc(2000, 5, 1), :offset_index => 3}, + {:at => Time.utc(2000, 6, 1), :offset_index => 1}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/DoubleDaylight', path, @posix_tz_parser) + assert_equal('Zone/DoubleDaylight', info.identifier) + + assert_period(:LMT, -10821, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST, -10800, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XDT, -10800, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XDDT, -10800, 7200, true, Time.utc(2000, 3, 1), Time.utc(2000, 4, 1), info) + assert_period(:XST, -10800, 0, false, Time.utc(2000, 4, 1), Time.utc(2000, 5, 1), info) + assert_period(:XDDT, -10800, 7200, true, Time.utc(2000, 5, 1), Time.utc(2000, 6, 1), info) + assert_period(:XST, -10800, 0, false, Time.utc(2000, 6, 1), nil, info) + end + end + + def test_load_starts_two_hour_std_offset + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 3}, + {:at => Time.utc(2000, 2, 1), :offset_index => 2}, + {:at => Time.utc(2000, 3, 1), :offset_index => 1}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/DoubleDaylight', path, @posix_tz_parser) + assert_equal('Zone/DoubleDaylight', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XDDT, 3600, 7200, true, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 3, 1), nil, info) + end + end + + def test_load_starts_only_dst_transition_with_lmt + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}] + + transitions = [{:at => Time.utc(2000, 1, 1), :offset_index => 1}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/OnlyDST', path, @posix_tz_parser) + assert_equal('Zone/OnlyDST', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XDT, 3542, 3658, true, Time.utc(2000, 1, 1), nil, info) + end + end + + def test_load_starts_only_dst_transition_without_lmt + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [{:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}] + + transitions = [{:at => Time.utc(2000, 1, 1), :offset_index => 0}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/OnlyDST', path, @posix_tz_parser) + assert_equal('Zone/OnlyDST', info.identifier) + + assert_period(:XDT, 3600, 3600, true, nil, Time.utc(2000, 1, 1), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(2000, 1, 1), nil, info) + end + end + + def test_load_switch_to_dst_and_change_utc_offset + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + # Switch from non-DST to DST at the same time as moving the UTC offset + # back an hour (i.e. wall clock time doesn't change). + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'YST'}, + {:gmtoff => 3600, :isdst => true, :abbrev => 'XDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 2}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/DoubleDaylight', path, @posix_tz_parser) + assert_equal('Zone/DoubleDaylight', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:YST, 3600, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XDT, 0, 3600, true, Time.utc(2000, 2, 1), nil, info) + end + end + + def test_load_apia_international_dateline_change + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + # Pacific/Apia moved across the International Date Line whilst observing + # daylight savings time. + + offsets = [ + {:gmtoff => 45184, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => -39600, :isdst => false, :abbrev => '-11'}, + {:gmtoff => -36000, :isdst => true, :abbrev => '-10'}, + {:gmtoff => 50400, :isdst => true, :abbrev => '+14'}, + {:gmtoff => 46800, :isdst => false, :abbrev => '+13'}] + + transitions = [ + {:at => Time.utc(2011, 4, 2, 14, 0, 0), :offset_index => 1}, + {:at => Time.utc(2011, 9, 24, 14, 0, 0), :offset_index => 2}, + {:at => Time.utc(2011, 12, 30, 10, 0, 0), :offset_index => 3}, + {:at => Time.utc(2012, 3, 31, 14, 0, 0), :offset_index => 4}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Test/Pacific/Apia', path, @posix_tz_parser) + assert_equal('Test/Pacific/Apia', info.identifier) + + assert_period( :LMT, 45184, 0, false, nil, Time.utc(2011, 4, 2, 14, 0, 0), info) + assert_period(:'-11', -39600, 0, false, Time.utc(2011, 4, 2, 14, 0, 0), Time.utc(2011, 9, 24, 14, 0, 0), info) + assert_period(:'-10', -39600, 3600, true, Time.utc(2011, 9, 24, 14, 0, 0), Time.utc(2011, 12, 30, 10, 0, 0), info) + assert_period(:'+14', 46800, 3600, true, Time.utc(2011, 12, 30, 10, 0, 0), Time.utc(2012, 3, 31, 14, 0, 0), info) + assert_period(:'+13', 46800, 0, false, Time.utc(2012, 3, 31, 14, 0, 0), nil, info) + end + end + + def test_load_offset_split_for_different_utc_offset + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST1'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST2'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 3}, + {:at => Time.utc(2000, 3, 1), :offset_index => 1}, + {:at => Time.utc(2000, 4, 1), :offset_index => 2}, + {:at => Time.utc(2000, 5, 1), :offset_index => 3}, + {:at => Time.utc(2000, 6, 1), :offset_index => 2}, + {:at => Time.utc(2000, 7, 1), :offset_index => 1}, + {:at => Time.utc(2000, 8, 1), :offset_index => 3}, + {:at => Time.utc(2000, 9, 1), :offset_index => 1}, + {:at => Time.utc(2000, 10, 1), :offset_index => 2}, + {:at => Time.utc(2000, 11, 1), :offset_index => 3}, + {:at => Time.utc(2000, 12, 1), :offset_index => 2}] + + # XDT will be split and defined according to its surrounding standard time + # offsets. + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/SplitUtcOffset', path, @posix_tz_parser) + assert_equal('Zone/SplitUtcOffset', info.identifier) + + assert_period( :LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period( :XDT, 3600, 7200, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 3, 1), Time.utc(2000, 4, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 4, 1), Time.utc(2000, 5, 1), info) + assert_period( :XDT, 7200, 3600, true, Time.utc(2000, 5, 1), Time.utc(2000, 6, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 6, 1), Time.utc(2000, 7, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 7, 1), Time.utc(2000, 8, 1), info) + assert_period( :XDT, 3600, 7200, true, Time.utc(2000, 8, 1), Time.utc(2000, 9, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 9, 1), Time.utc(2000, 10, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 10, 1), Time.utc(2000, 11, 1), info) + assert_period( :XDT, 7200, 3600, true, Time.utc(2000, 11, 1), Time.utc(2000, 12, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 12, 1), nil, info) + + 1.upto(6) do |i| + assert_same(info.period_for_utc(Time.utc(2000, i, 1)).offset, info.period_for_utc(Time.utc(2000, i + 6, 1)).offset) + end + end + end + + def test_load_offset_utc_offset_taken_from_minimum_difference_minimum_after + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST1'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST2'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 3}, + {:at => Time.utc(2000, 3, 1), :offset_index => 2}] + + # XDT should use the closest utc_offset (7200) (and not an equivalent + # utc_offset of 3600 and std_offset of 7200). + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/MinimumUtcOffset', path, @posix_tz_parser) + assert_equal('Zone/MinimumUtcOffset', info.identifier) + + assert_period( :LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period( :XDT, 7200, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 3, 1), nil, info) + end + end + + def test_load_offset_utc_offset_taken_from_minimum_difference_minimum_before + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST1'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST2'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 2}, + {:at => Time.utc(2000, 2, 1), :offset_index => 3}, + {:at => Time.utc(2000, 3, 1), :offset_index => 1}] + + # XDT should use the closest utc_offset (7200) (and not an equivalent + # utc_offset of 3600 and std_offset of 7200). + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/MinimumUtcOffset', path, @posix_tz_parser) + assert_equal('Zone/MinimumUtcOffset', info.identifier) + + assert_period( :LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period( :XDT, 7200, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 3, 1), nil, info) + end + end + + def test_load_offset_does_not_use_equal_utc_total_offset_equal_after + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST1'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST2'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 3}, + {:at => Time.utc(2000, 3, 1), :offset_index => 2}] + + # XDT will be based on the utc_offset of XST1 even though XST2 has an + # equivalent (or greater) utc_total_offset. + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/UtcOffsetEqual', path, @posix_tz_parser) + assert_equal('Zone/UtcOffsetEqual', info.identifier) + + assert_period( :LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period( :XDT, 3600, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 3, 1), nil, info) + end + end + + def test_load_offset_does_not_use_equal_utc_total_offset_equal_before + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST1'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST2'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 2}, + {:at => Time.utc(2000, 2, 1), :offset_index => 3}, + {:at => Time.utc(2000, 3, 1), :offset_index => 1}] + + # XDT will be based on the utc_offset of XST1 even though XST2 has an + # equivalent (or greater) utc_total_offset. + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/UtcOffsetEqual', path, @posix_tz_parser) + assert_equal('Zone/UtcOffsetEqual', info.identifier) + + assert_period( :LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period( :XDT, 3600, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 3, 1), nil, info) + end + end + + def test_load_offset_both_adjacent_non_dst_equal_utc_total_offset + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 2}, + {:at => Time.utc(2000, 3, 1), :offset_index => 1}] + + # XDT will just assume an std_offset of +1 hour and calculate the utc_offset + # from utc_total_offset - std_offset. + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/AdjacentEqual', path, @posix_tz_parser) + assert_equal('Zone/AdjacentEqual', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST, 7200, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XDT, 3600, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST, 7200, 0, false, Time.utc(2000, 3, 1), nil, info) + end + end + + def test_load_offset_utc_offset_preserved_from_next + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST1'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST2'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT1'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT2'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 3}, + {:at => Time.utc(2000, 3, 1), :offset_index => 4}, + {:at => Time.utc(2000, 4, 1), :offset_index => 2}] + + # Both XDT1 and XDT2 should both use the closest utc_offset (7200) (and not + # an equivalent utc_offset of 3600 and std_offset of 7200). + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/UtcOffsetPreserved', path, @posix_tz_parser) + assert_equal('Zone/UtcOffsetPreserved', info.identifier) + + assert_period( :LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XDT1, 7200, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XDT2, 7200, 3600, true, Time.utc(2000, 3, 1), Time.utc(2000, 4, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 4, 1), nil, info) + end + end + + def test_load_offset_utc_offset_preserved_from_previous + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST1'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST2'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT1'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT2'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 2}, + {:at => Time.utc(2000, 2, 1), :offset_index => 3}, + {:at => Time.utc(2000, 3, 1), :offset_index => 4}, + {:at => Time.utc(2000, 4, 1), :offset_index => 1}] + + # Both XDT1 and XDT2 should both use the closest utc_offset (7200) (and not + # an equivalent utc_offset of 3600 and std_offset of 7200). + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/UtcOffsetPreserved', path, @posix_tz_parser) + assert_equal('Zone/UtcOffsetPreserved', info.identifier) + + assert_period( :LMT, 3542, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST2, 7200, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XDT1, 7200, 3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XDT2, 7200, 3600, true, Time.utc(2000, 3, 1), Time.utc(2000, 4, 1), info) + assert_period(:XST1, 3600, 0, false, Time.utc(2000, 4, 1), nil, info) + end + end + + def test_read_offset_negative_std_offset_dst + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => -100, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 0, :isdst => true, :abbrev => 'XWT'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 2}, + {:at => Time.utc(2000, 3, 1), :offset_index => 1}, + {:at => Time.utc(2000, 4, 1), :offset_index => 2}, + {:at => Time.utc(2000, 5, 1), :offset_index => 1}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/NegativeStdOffsetDst', path, @posix_tz_parser) + assert_equal('Zone/NegativeStdOffsetDst', info.identifier) + + assert_period(:LMT, -100, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XWT, 3600, -3600, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 3, 1), Time.utc(2000, 4, 1), info) + assert_period(:XWT, 3600, -3600, true, Time.utc(2000, 4, 1), Time.utc(2000, 5, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 5, 1), nil, info) + end + end + + def test_read_offset_negative_std_offset_dst_initial_dst + # The zoneinfo files don't include the offset from standard time, so this + # has to be derived by looking at changes in the total UTC offset. + + offsets = [ + {:gmtoff => -100, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 0, :isdst => true, :abbrev => 'XWT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 2}, + {:at => Time.utc(2000, 3, 1), :offset_index => 1}, + {:at => Time.utc(2000, 4, 1), :offset_index => 2}, + {:at => Time.utc(2000, 5, 1), :offset_index => 1}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/NegativeStdOffsetDstInitialDst', path, @posix_tz_parser) + assert_equal('Zone/NegativeStdOffsetDstInitialDst', info.identifier) + + assert_period(:LMT, -100, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XWT, 3600, -3600, true, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XWT, 3600, -3600, true, Time.utc(2000, 3, 1), Time.utc(2000, 4, 1), info) + assert_period(:XST, 3600, 0, false, Time.utc(2000, 4, 1), Time.utc(2000, 5, 1), info) + assert_period(:XWT, 3600, -3600, true, Time.utc(2000, 5, 1), nil, info) + end + end + + def test_read_offset_prefer_base_offset_moves_to_dst_not_hour + offsets = [ + {:gmtoff => -100, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 0, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 1800, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 1800, :isdst => false, :abbrev => 'XST'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 2}, + {:at => Time.utc(2000, 3, 1), :offset_index => 3}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/BaseOffsetMovesToDstNotHour', path, @posix_tz_parser) + assert_equal('Zone/BaseOffsetMovesToDstNotHour', info.identifier) + + assert_period(:LMT, -100, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST, 0, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XDT, 0, 1800, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST, 1800, 0, false, Time.utc(2000, 3, 1), nil, info) + end + end + + def test_read_offset_prefer_base_offset_moves_from_dst_not_hour + offsets = [ + {:gmtoff => -100, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 1800, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 1800, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 0, :isdst => false, :abbrev => 'XST'}] + + transitions = [ + {:at => Time.utc(2000, 1, 1), :offset_index => 1}, + {:at => Time.utc(2000, 2, 1), :offset_index => 2}, + {:at => Time.utc(2000, 3, 1), :offset_index => 3}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/BaseOffsetMovesFromDstNotHour', path, @posix_tz_parser) + assert_equal('Zone/BaseOffsetMovesFromDstNotHour', info.identifier) + + assert_period(:LMT, -100, 0, false, nil, Time.utc(2000, 1, 1), info) + assert_period(:XST, 1800, 0, false, Time.utc(2000, 1, 1), Time.utc(2000, 2, 1), info) + assert_period(:XDT, 0, 1800, true, Time.utc(2000, 2, 1), Time.utc(2000, 3, 1), info) + assert_period(:XST, 0, 0, false, Time.utc(2000, 3, 1), nil, info) + end + end + + def test_load_in_safe_mode + offsets = [{:gmtoff => -12094, :isdst => false, :abbrev => 'LT'}] + + tzif_test(offsets, []) do |path, format| + # untaint only required for Ruby 1.9.2 + path.untaint + + safe_test do + info = ZoneinfoTimezoneInfo.new('Zone/three', path, @posix_tz_parser) + assert_equal('Zone/three', info.identifier) + + assert_period(:LT, -12094, 0, false, nil, nil, info) + end + end + end + + def test_load_encoding + # tzfile.5 doesn't specify an encoding, but the source data is in ASCII. + # ZoneinfoTimezoneInfo will load as UTF-8 (a superset of ASCII). + + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST©'}] + + transitions = [ + {:at => Time.utc(1971, 1, 2), :offset_index => 1}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/One', path, @posix_tz_parser) + assert_equal('Zone/One', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(1971, 1, 2), info) + assert_period(:"XST©", 3600, 0, false, Time.utc(1971, 1, 2), nil, info) + end + end + + def test_load_binmode + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}] + + # Transition time that includes CRLF (4EFF0D0A). + # Test that this doesn't get corrupted by translating CRLF to LF. + transitions = [ + {:at => Time.utc(2011, 12, 31, 13, 24, 26), :offset_index => 1}] + + tzif_test(offsets, transitions) do |path, format| + info = ZoneinfoTimezoneInfo.new('Zone/One', path, @posix_tz_parser) + assert_equal('Zone/One', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2011, 12, 31, 13, 24, 26), info) + assert_period(:XST, 3600, 0, false, Time.utc(2011, 12, 31, 13, 24, 26), nil, info) + end + end + + def test_load_invalid_tz_string + offsets = [{:gmtoff => 0, :isdst => false, :abbrev => 'UTC'}] + + tzif_test(offsets, [], :rules => :fail) do |path, format| + error = assert_raises(InvalidZoneinfoFile) { ZoneinfoTimezoneInfo.new('Invalid/String', path, @posix_tz_parser) } + assert_equal("Failed to parse POSIX-style TZ string in file '#{path}': FakePosixTimeZoneParser Failure.", error.message) + end + end + + def test_load_tz_string_missing_start_newline + offsets = [{:gmtoff => 0, :isdst => false, :abbrev => 'UTC'}] + rules = TimezoneOffset.new(0, 0, 'UTC') + + tzif_test(offsets, [], :rules => rules, :omit_tz_string_start_new_line => true) do |path, format| + error = assert_raises(InvalidZoneinfoFile) { ZoneinfoTimezoneInfo.new('Missing/Start', path, @posix_tz_parser) } + assert_equal("Expected newline starting POSIX-style TZ string in file '#{path}'.", error.message) + end + end + + def test_load_tz_string_missing_end_newline + offsets = [{:gmtoff => 0, :isdst => false, :abbrev => 'UTC'}] + rules = TimezoneOffset.new(0, 0, 'UTC') + + tzif_test(offsets, [], :rules => rules, :omit_tz_string_end_new_line => true) do |path, format| + error = assert_raises(InvalidZoneinfoFile) { ZoneinfoTimezoneInfo.new('Missing/End', path, @posix_tz_parser) } + assert_equal("Expected newline ending POSIX-style TZ string in file '#{path}'.", error.message) + end + end + + [ + [false, 1, 0, 'TEST'], + [false, 0, 1, 'TEST'], + [false, 0, 0, 'TEST2'], + [false, -1, 1, 'TEST'], + [true, 0, 0, 'TEST'] + ].each do |(isdst, base_utc_offset, std_offset, abbreviation)| + define_method "test_load_tz_string_does_not_match_#{isdst ? 'dst' : 'std'}_constant_offset_#{base_utc_offset}_#{std_offset}_#{abbreviation}" do + offsets = [{:gmtoff => 0, :isdst => isdst, :abbrev => 'TEST'}] + rules = TimezoneOffset.new(base_utc_offset, std_offset, abbreviation) + + tzif_test(offsets, [], :rules => rules) do |path, format| + error = assert_raises(InvalidZoneinfoFile) { ZoneinfoTimezoneInfo.new('Offset/Mismatch', path, @posix_tz_parser) } + assert_equal("Constant offset POSIX-style TZ string does not match constant offset in file '#{path}'.", error.message) + end + end + end + + [ + [3601, 'XST'], + [3600, 'YST'] + ].each do |(base_utc_offset, abbreviation)| + define_method "test_load_tz_string_does_not_match_final_std_transition_offset_#{base_utc_offset}_#{abbreviation}" do + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 3542, :offset_index => 1}, + {:at => Time.utc(1981, 4, 10, 2, 0, 0) - 3600, :offset_index => 2}, + {:at => Time.utc(1981, 10, 27, 2, 0, 0) - 7200, :offset_index => 1} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(base_utc_offset, 0, abbreviation), + TimezoneOffset.new(3600, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 7200), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + error = assert_raises(InvalidZoneinfoFile) { ZoneinfoTimezoneInfo.new('Offset/Mismatch', path, @posix_tz_parser) } + assert_equal("The first offset indicated by the POSIX-style TZ string did not match the final defined offset in file '#{path}'.", error.message) + end + end + end + + [ + [3601, 0, 'XST'], + [3600, 1, 'XST'], + [3600, 0, 'YST'] + ].each do |(base_utc_offset, std_offset, abbreviation)| + define_method "test_load_tz_string_does_not_match_final_dst_transition_offset_#{base_utc_offset}_#{std_offset}_#{abbreviation}" do + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 3600, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 3542, :offset_index => 1}, + {:at => Time.utc(1981, 4, 10, 2, 0, 0) - 3600, :offset_index => 2} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(3600, 0, 'XST'), + TimezoneOffset.new(base_utc_offset, std_offset, abbreviation), + JulianDayOfYearTransitionRule.new(100, 7200), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + error = assert_raises(InvalidZoneinfoFile) { ZoneinfoTimezoneInfo.new('Offset/Mismatch', path, @posix_tz_parser) } + assert_equal("The first offset indicated by the POSIX-style TZ string did not match the final defined offset in file '#{path}'.", error.message) + end + end + end + + [ + [3600, 0], + [3600, 3600], + [10800, -3600] + ].each do |(base_utc_offset, std_offset)| + rules = TimezoneOffset.new(base_utc_offset, std_offset, 'TEST') + + define_method "test_load_tz_string_uses_constant_offset_with_no_transitions_#{base_utc_offset}_#{std_offset}" do + offsets = [{:gmtoff => base_utc_offset + std_offset, :isdst => std_offset != 0, :abbrev => 'TEST'}] + + tzif_test(offsets, [], :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('Constant/Offset', path, @posix_tz_parser) + assert_equal('Constant/Offset', info.identifier) + assert_period(:TEST, base_utc_offset, std_offset, std_offset != 0, nil, nil, info) + end + end + + define_method "test_load_tz_string_uses_constant_offset_after_last_transition_#{base_utc_offset}_#{std_offset}" do + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => base_utc_offset + std_offset, :isdst => std_offset != 0, :abbrev => 'TEST'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 3542, :offset_index => 1} + ] + + t0 = Time.utc(1971, 1, 2, 2, 0, 0) - 3542 + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('Constant/After', path, @posix_tz_parser) + assert_equal('Constant/After', info.identifier) + assert_period(:LMT, 3542, 0, false, nil, t0, info) + assert_period(:TEST, base_utc_offset, std_offset, std_offset != 0, t0, nil, info) + end + end + end + + def test_load_tz_string_uses_rules_to_generate_all_transitions_when_none_defined + offsets = [{:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, [], :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('All/Rules', path, @posix_tz_parser) + assert_equal('All/Rules', info.identifier) + + assert_period(:XST, 7200, 0, false, nil, Time.utc(1970, 4, 10, 1, 0, 0) - 7200, info) + + 1970.upto(generate_up_to - 1).each do |year| + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_uses_rules_to_generate_all_transitions_when_none_defined_omitting_first_if_matches_first_offset + offsets = [{:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'}] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, [], :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('All/Rules', path, @posix_tz_parser) + assert_equal('All/Rules', info.identifier) + + assert_period(:XDT, 7200, 3600, true, nil, Time.utc(1970, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(1970, 10, 27, 2, 0, 0) - 10800, Time.utc(1971, 4, 10, 1, 0, 0) - 7200, info) + + 1971.upto(generate_up_to - 1).each do |year| + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_uses_rules_to_generate_all_transitions_when_none_defined_with_previous_offset_of_first_matching_first_offset + offsets = [{:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, [], :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('All/Rules', path, @posix_tz_parser) + assert_equal('All/Rules', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1970, 4, 10, 1, 0, 0) - 7200, info) + + 1970.upto(generate_up_to - 1).each do |year| + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_uses_rules_to_generate_all_transitions_when_none_defined_correcting_initial_offset + offsets = [{:gmtoff => 10800, :isdst => true, :abbrev => 'XDDT'}] + + rules = AnnualRules.new( + TimezoneOffset.new(3600, 0, 'XST'), + TimezoneOffset.new(3600, 7200, 'XDDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, [], :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('All/Rules', path, @posix_tz_parser) + assert_equal('All/Rules', info.identifier) + + assert_period(:XDDT, 3600, 7200, true, nil, Time.utc(1970, 10, 27, 2, 0, 0) - 10800, info) # would be :XDT, 7200, 3600 otherwise + assert_period(:XST, 3600, 0, false, Time.utc(1970, 10, 27, 2, 0, 0) - 10800, Time.utc(1971, 4, 10, 1, 0, 0) - 3600, info) + + 1971.upto(generate_up_to - 1).each do |year| + assert_period(:XDDT, 3600, 7200, true, Time.utc(year, 4, 10, 1, 0, 0) - 3600, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 3600, 0, false, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 3600, info) + end + + assert_period(:XDDT, 3600, 7200, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 3600, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 3600, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_extends_transitions_starting_from_std_to_dst_following_year + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(1981, 4, 10, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(1981, 10, 27, 2, 0, 0) - 10800, :offset_index => 1} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('From/Rules', path, @posix_tz_parser) + assert_equal('From/Rules', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, info) + assert_period(:XST, 7200, 0, false, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, Time.utc(1981, 4, 10, 1, 0, 0) - 7200, info) + + 1981.upto(generate_up_to - 1).each do |year| + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_extends_transitions_starting_from_dst_to_std_same_year + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(1981, 4, 10, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(1981, 10, 27, 2, 0, 0) - 10800, :offset_index => 1}, + {:at => Time.utc(1982, 4, 10, 1, 0, 0) - 7200, :offset_index => 2} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('From/Rules', path, @posix_tz_parser) + assert_equal('From/Rules', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, info) + assert_period(:XST, 7200, 0, false, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, Time.utc(1981, 4, 10, 1, 0, 0) - 7200, info) + + 1981.upto(generate_up_to - 1).each do |year| + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_extends_transitions_starting_from_dst_to_std_following_year + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 1, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(1981, 10, 27, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(1982, 4, 10, 2, 0, 0) - 10800, :offset_index => 1}, + {:at => Time.utc(1982, 10, 27, 1, 0, 0) - 7200, :offset_index => 2} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(300, 3600), + JulianDayOfYearTransitionRule.new(100, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('From/Rules', path, @posix_tz_parser) + assert_equal('From/Rules', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1971, 1, 2, 1, 0, 0) - 7142, info) + assert_period(:XST, 7200, 0, false, Time.utc(1971, 1, 2, 1, 0, 0) - 7142, Time.utc(1981, 10, 27, 1, 0, 0) - 7200, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(1981, 10, 27, 1, 0, 0) - 7200, Time.utc(1982, 4, 10, 2, 0, 0) - 10800, info) + + 1982.upto(generate_up_to - 1).each do |year| + assert_period(:XST, 7200, 0, false, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_extends_transitions_starting_from_std_to_dst_same_year + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 1, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(1981, 10, 27, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(1982, 4, 10, 2, 0, 0) - 10800, :offset_index => 1}, + {:at => Time.utc(1982, 10, 27, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(1983, 4, 10, 2, 0, 0) - 10800, :offset_index => 1} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(300, 3600), + JulianDayOfYearTransitionRule.new(100, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('From/Rules', path, @posix_tz_parser) + assert_equal('From/Rules', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1971, 1, 2, 1, 0, 0) - 7142, info) + assert_period(:XST, 7200, 0, false, Time.utc(1971, 1, 2, 1, 0, 0) - 7142, Time.utc(1981, 10, 27, 1, 0, 0) - 7200, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(1981, 10, 27, 1, 0, 0) - 7200, Time.utc(1982, 4, 10, 2, 0, 0) - 10800, info) + + 1982.upto(generate_up_to - 1).each do |year| + assert_period(:XST, 7200, 0, false, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_extends_transitions_negative_dst + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}, + {:gmtoff => 10800, :isdst => false, :abbrev => 'XST'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(1981, 4, 10, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(1981, 10, 27, 2, 0, 0) - 10800, :offset_index => 1} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(10800, 0, 'XST'), + TimezoneOffset.new(10800, -3600, 'XDT'), + JulianDayOfYearTransitionRule.new(300, 7200), + JulianDayOfYearTransitionRule.new(100, 3600) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('From/Rules', path, @posix_tz_parser) + assert_equal('From/Rules', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, info) + assert_period(:XDT, 10800, -3600, true, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, Time.utc(1981, 4, 10, 1, 0, 0) - 7200, info) + + 1981.upto(generate_up_to - 1).each do |year| + assert_period(:XST, 10800, 0, false, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XDT, 10800, -3600, true, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XST, 10800, 0, false, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XDT, 10800, -3600, true, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_extends_single_transition_in_final_year + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + transitions = [ + {:at => Time.utc( 1971, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(generate_up_to - 1, 4, 10, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(generate_up_to - 1, 10, 27, 2, 0, 0) - 10800, :offset_index => 1}, + {:at => Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, :offset_index => 2} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('Final/Year', path, @posix_tz_parser) + assert_equal('Final/Year', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc( 1971, 1, 2, 2, 0, 0) - 7142, info) + assert_period(:XST, 7200, 0, false, Time.utc( 1971, 1, 2, 2, 0, 0) - 7142, Time.utc(generate_up_to - 1, 4, 10, 1, 0, 0) - 7200, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to - 1, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to - 1, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to - 1, 10, 27, 2, 0, 0) - 10800, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_adds_nothing_if_transitions_up_to_final_year + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + transitions = [ + {:at => Time.utc( 1971, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, :offset_index => 1}, + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('Final/Year', path, @posix_tz_parser) + assert_equal('Final/Year', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc( 1971, 1, 2, 2, 0, 0) - 7142, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_corrects_offset_of_final_transition + offsets = [ + {:gmtoff => 3542, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => true, :abbrev => 'XDT'}] + + transitions = [{:at => Time.utc(2000, 4, 10, 1, 0, 0) - 3542, :offset_index => 1}] + + rules = AnnualRules.new( + TimezoneOffset.new(3600, 0, 'XST'), + TimezoneOffset.new(3600, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('Correct/Final', path, @posix_tz_parser) + assert_equal('Correct/Final', info.identifier) + + assert_period(:LMT, 3542, 0, false, nil, Time.utc(2000, 4, 10, 1, 0, 0) - 3542, info) + assert_period(:XDT, 3600, 3600, true, Time.utc(2000, 4, 10, 1, 0, 0) - 3542, Time.utc(2000, 10, 27, 2, 0, 0) - 7200, info) # would be :XDT, 3542, 3658 without tz_string + assert_period(:XST, 3600, 0, false, Time.utc(2000, 10, 27, 2, 0, 0) - 7200, Time.utc(2001, 4, 10, 1, 0, 0) - 3600, info) + + 2001.upto(generate_up_to - 1).each do |year| + assert_period(:XDT, 3600, 3600, true, Time.utc(year, 4, 10, 1, 0, 0) - 3600, Time.utc(year, 10, 27, 2, 0, 0) - 7200, info) + assert_period(:XST, 3600, 0, false, Time.utc(year, 10, 27, 2, 0, 0) - 7200, Time.utc(year + 1, 4, 10, 1, 0, 0) - 3600, info) + end + + assert_period(:XDT, 3600, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 3600, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 7200, info) + assert_period(:XST, 3600, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 7200, nil, info) + end + end + + def test_load_tz_string_specifies_transition_to_offset_of_final_transition_same_year_skip_dst_start + # TZInfo v1.2.8 considered this to be an error. However, this is a valid + # situation with Africa/Casablanca in 2018e. + # + # The last defined transitions are: + # At 2037-03-29 02:00Z change to WEST UTC+1 + # At 2037-10-04 02:00Z change to WET UTC+0 + # + # The rules define the end of DST to be at 03:00 local time on the last + # Sunday of October (2037-10-31). This later transition needs to be + # ignored. + + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(1981, 4, 10, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(1981, 10, 27, 2, 0, 0) - 10800, :offset_index => 1}, + {:at => Time.utc(1982, 4, 10, 1, 0, 0) - 7200, :offset_index => 2} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(101, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('Ignore/Std', path, @posix_tz_parser) + assert_equal('Ignore/Std', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, info) + assert_period(:XST, 7200, 0, false, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, Time.utc(1981, 4, 10, 1, 0, 0) - 7200, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(1981, 4, 10, 1, 0, 0) - 7200, Time.utc(1981, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(1981, 10, 27, 2, 0, 0) - 10800, Time.utc(1982, 4, 10, 1, 0, 0) - 7200, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(1982, 4, 10, 1, 0, 0) - 7200, Time.utc(1982, 10, 27, 2, 0, 0) - 10800, info) + + 1983.upto(generate_up_to).each do |year| + assert_period(:XST, 7200, 0, false, Time.utc(year - 1, 10, 27, 2, 0, 0) - 10800, Time.utc(year, 4, 11, 1, 0, 0) - 7200, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 4, 11, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + end + + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_specifies_transition_to_offset_of_final_transition_same_year_skip_dst_end + # TZInfo v1.2.8 considered this to be an error. However, this is a valid + # situation with Africa/Casablanca in 2018e. + # + # The last defined transitions are: + # At 2037-03-29 02:00Z change to WEST UTC+1 + # At 2037-10-04 02:00Z change to WET UTC+0 + # + # The rules define the end of DST to be at 03:00 local time on the last + # Sunday of October (2037-10-31). This later transition needs to be + # ignored. + + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(1981, 4, 10, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(1981, 10, 27, 2, 0, 0) - 10800, :offset_index => 1} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(301, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('Ignore/Std', path, @posix_tz_parser) + assert_equal('Ignore/Std', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, info) + assert_period(:XST, 7200, 0, false, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, Time.utc(1981, 4, 10, 1, 0, 0) - 7200, info) + assert_period(:XDT, 7200, 3600, true, Time.utc(1981, 4, 10, 1, 0, 0) - 7200, Time.utc(1981, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(1981, 10, 27, 2, 0, 0) - 10800, Time.utc(1982, 4, 10, 1, 0, 0) - 7200, info) + + 1982.upto(generate_up_to - 1).each do |year| + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 28, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(year, 10, 28, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 28, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 28, 2, 0, 0) - 10800, nil, info) + end + end + + def test_load_tz_string_specifies_transition_to_offset_of_final_transition_following_year + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(1981, 10, 27, 2, 0, 0) - 7200, :offset_index => 2} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(299, 7200) + ) + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + error = assert_raises(InvalidZoneinfoFile) { ZoneinfoTimezoneInfo.new('Invalid/Offset', path, @posix_tz_parser) } + assert_equal("The first offset indicated by the POSIX-style TZ string did not match the final defined offset in file '#{path}'.", error.message) + end + end + + unless SUPPORTS_64BIT + def test_generate_up_to_limited_to_2037_with_no_64_bit_support + assert_equal(2037, ZoneinfoTimezoneInfo::GENERATE_UP_TO) + end + + def test_load_tz_string_does_not_generate_if_transition_after_32_bit_range_with_no_64_bit_support + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1971, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => 2154474000 - 7200, :offset_index => 2}, # Time.utc(2038, 4, 10, 1, 0, 0).to_i + {:at => 2171757600 - 10800, :offset_index => 1} # Time.utc(2038, 10, 27, 2, 0, 0).to_i + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('From/Rules', path, @posix_tz_parser) + assert_equal('From/Rules', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, info) + assert_period(:XST, 7200, 0, false, Time.utc(1971, 1, 2, 2, 0, 0) - 7142, nil, info) + end + end + end + + if SUPPORTS_NEGATIVE + def test_load_tz_string_generates_from_last_transition_if_before_1970_and_supports_negative + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => Time.utc(1961, 1, 2, 2, 0, 0) - 7142, :offset_index => 1}, + {:at => Time.utc(1962, 4, 10, 1, 0, 0) - 7200, :offset_index => 2}, + {:at => Time.utc(1962, 10, 27, 2, 0, 0) - 10800, :offset_index => 1} + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('Pre/1970', path, @posix_tz_parser) + assert_equal('Pre/1970', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1961, 1, 2, 2, 0, 0) - 7142, info) + assert_period(:XST, 7200, 0, false, Time.utc(1961, 1, 2, 2, 0, 0) - 7142, Time.utc(1962, 4, 10, 1, 0, 0) - 7200, info) + + 1962.upto(generate_up_to - 1).each do |year| + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + else + def test_load_tz_string_generates_from_1970_if_last_transition_before_1970_and_does_not_support_negative + offsets = [ + {:gmtoff => 7142, :isdst => false, :abbrev => 'LMT'}, + {:gmtoff => 7200, :isdst => false, :abbrev => 'XST'}, + {:gmtoff => 10800, :isdst => true, :abbrev => 'XDT'} + ] + + transitions = [ + {:at => -283903200 - 7142, :offset_index => 1}, # Time.utc(1961, 1, 2, 2, 0, 0) + {:at => -243903600 - 7200, :offset_index => 2}, # Time.utc(1962, 4, 10, 1, 0, 0) + {:at => -226620000 - 10800, :offset_index => 1} # Time.utc(1962, 10, 27, 2, 0, 0) + ] + + rules = AnnualRules.new( + TimezoneOffset.new(7200, 0, 'XST'), + TimezoneOffset.new(7200, 3600, 'XDT'), + JulianDayOfYearTransitionRule.new(100, 3600), + JulianDayOfYearTransitionRule.new(300, 7200) + ) + + generate_up_to = ZoneinfoTimezoneInfo::GENERATE_UP_TO + + tzif_test(offsets, transitions, :rules => rules) do |path, format| + info = ZoneinfoTimezoneInfo.new('Pre/1970', path, @posix_tz_parser) + assert_equal('Pre/1970', info.identifier) + + assert_period(:LMT, 7142, 0, false, nil, Time.utc(1970, 1, 1), info) + assert_period(:XST, 7200, 0, false, Time.utc(1970, 1, 1), Time.utc(1970, 4, 10, 1, 0, 0) - 7200, info) + + 1970.upto(generate_up_to - 1).each do |year| + assert_period(:XDT, 7200, 3600, true, Time.utc(year, 4, 10, 1, 0, 0) - 7200, Time.utc(year, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(year, 10, 27, 2, 0, 0) - 10800, Time.utc(year + 1, 4, 10, 1, 0, 0) - 7200, info) + end + + assert_period(:XDT, 7200, 3600, true, Time.utc(generate_up_to, 4, 10, 1, 0, 0) - 7200, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, info) + assert_period(:XST, 7200, 0, false, Time.utc(generate_up_to, 10, 27, 2, 0, 0) - 10800, nil, info) + end + end + end + + def test_load_tz_string_as_utf8 + offsets = [{:gmtoff => 3600, :isdst => false, :abbrev => 'áccént'}] + rules = TimezoneOffset.new(3600, 0, 'áccént') + + tzif_test(offsets, [], :tz_string => '<áccént>1', :rules => rules) do |path, format| + # FakePosixTimeZoneParser will test that the tz_string matches. + info = ZoneinfoTimezoneInfo.new('Test/Utf8', path, @posix_tz_parser) + assert_period(:'áccént', 3600, 0, false, nil, nil, info) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/test_utils.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/test_utils.rb new file mode 100644 index 000000000000..c97facf4ce39 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/test_utils.rb @@ -0,0 +1,192 @@ +tests_dir = File.expand_path(File.dirname(__FILE__)) +tests_dir.untaint if RUBY_VERSION < '2.7' +TESTS_DIR = tests_dir +TZINFO_LIB_DIR = File.expand_path(File.join(TESTS_DIR, '..', 'lib')) +TZINFO_TEST_DATA_DIR = File.join(TESTS_DIR, 'tzinfo-data') +TZINFO_TEST_ZONEINFO_DIR = File.join(TESTS_DIR, 'zoneinfo') + +$:.unshift(TZINFO_LIB_DIR) unless $:.include?(TZINFO_LIB_DIR) + +# tzinfo-data contains a cut down copy of tzinfo-data for use in the tests. +# Add it to the load path. +$:.unshift(TZINFO_TEST_DATA_DIR) unless $:.include?(TZINFO_TEST_DATA_DIR) + +require 'minitest/autorun' +require 'tzinfo' +require 'fileutils' +require 'rbconfig' + +module TestUtils + ZONEINFO_SYMLINKS = [ + ['localtime', 'America/New_York'], + ['UTC', 'Etc/UTC']] + + + def self.prepare_test_zoneinfo_dir + ZONEINFO_SYMLINKS.each do |file, target| + path = File.join(TZINFO_TEST_ZONEINFO_DIR, file) + + File.delete(path) if File.exist?(path) + + begin + FileUtils.ln_s(target, path) + rescue NotImplementedError, Errno::EACCES + # Symlinks not supported on this platform, or permission denied + # (administrative rights are required on Windows). Copy instead. + target_path = File.join(TZINFO_TEST_ZONEINFO_DIR, target) + FileUtils.cp(target_path, path) + end + end + end +end + +TestUtils.prepare_test_zoneinfo_dir + + + +module Kernel + # Suppresses any warnings raised in a specified block. + def without_warnings + old_verbose = $VERBOSE + begin + $VERBOSE = nil + yield + ensure + $-v = old_verbose + end + end + + def safe_test(options = {}) + # Ruby >= 2.7, JRuby and Rubinus don't support SAFE levels. + available = RUBY_VERSION < '2.7' && !(defined?(RUBY_ENGINE) && %w(jruby rbx).include?(RUBY_ENGINE)) + + if available || options[:unavailable] != :skip + thread = Thread.new do + orig_diff = Minitest::Assertions.diff + + if available + orig_safe = $SAFE + $SAFE = options[:level] || 1 + end + begin + # Disable the use of external diff tools during safe mode tests (since + # safe mode will prevent their use). The initial value is retrieved + # before activating safe mode because the first time + # Minitest::Assertions.diff is called, it will attempt to find a diff + # tool. Finding the diff tool will also fail in safe mode. + Minitest::Assertions.diff = nil + begin + yield + ensure + Minitest::Assertions.diff = orig_diff + end + ensure + if available + # On Ruby < 2.6, setting $SAFE affects only the current thread + # and the $SAFE level cannot be downgraded. Catch and ignore the + # SecurityError. + # On Ruby >= 2.6, setting $SAFE is global, and the $SAFE level + # can be downgraded. Restore $SAFE back to the original level. + begin + $SAFE = orig_safe + rescue SecurityError + end + end + end + end + + thread.join + end + end + + def skip_if_has_bug_14060 + # On Ruby 2.4.4 in safe mode, require will fail with a SecurityError for + # any file that has not previously been loaded, regardless of whether the + # file name is tainted. + # See https://bugs.ruby-lang.org/issues/14060#note-5. + if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby' && RUBY_VERSION == '2.4.4' + skip('Skipping test due to Ruby 2.4.4 being affected by Bug 14060 (see https://bugs.ruby-lang.org/issues/14060#note-5)') + end + end + + def assert_array_same_items(expected, actual, msg = nil) + full_message = message(msg, '') { diff(expected, actual) } + condition = (expected.size == actual.size) && (expected - actual == []) + assert(condition, full_message) + end + + def assert_sub_process_returns(expected_lines, code, extra_load_path = [], required = ['tzinfo']) + if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' && JRUBY_VERSION.start_with?('9.0.') && RbConfig::CONFIG['host_os'] =~ /mswin/ + skip('JRuby 9.0 on Windows cannot handle writing to the IO instance returned by popen') + end + + ruby = File.join(RbConfig::CONFIG['bindir'], + RbConfig::CONFIG['ruby_install_name'] + RbConfig::CONFIG['EXEEXT']) + + load_path = [TZINFO_LIB_DIR] + extra_load_path + + # If RubyGems is loaded in the current process, then require it in the + # sub-process, as it may be needed in order to require dependencies. + if defined?(Gem) && Gem.instance_of?(Module) + required = ['rubygems'] + required + end + + if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx' + # Stop Rubinus from operating as irb. + args = ' -' + else + args = '' + end + + IO.popen("\"#{ruby}\"#{args}", 'r+') do |process| + load_path.each do |p| + process.puts("$:.unshift('#{p.gsub("'", "\\\\'")}')") + end + + required.each do |r| + process.puts("require '#{r.gsub("'", "\\\\'")}'") + end + + process.puts(code) + process.flush + process.close_write + + actual_lines = process.readlines + actual_lines = actual_lines.collect {|l| l.chomp} + assert_equal(expected_lines, actual_lines) + end + end + + def assert_nothing_raised(msg = nil) + begin + yield + rescue => e + full_message = message(msg) { exception_details(e, 'Exception raised: ') } + assert(false, full_message) + end + end +end + + +# Object#taint is a deprecated no-op in Ruby 2.7 and outputs a warning. It will +# be removed in 3.2. Silence the warning or supply a replacement. +if TZInfo::RubyCoreSupport.const_defined?(:UntaintExt) + module TaintExt + refine Object do + def taint + self + end + end + end +end + + +# JRuby 1.7.5 to 1.7.9 consider DateTime instances that differ by less than +# 1 millisecond to be equivalent (https://github.com/jruby/jruby/issues/1311). +# +# A few test cases compare at a resolution of 1 microsecond, so this causes +# failures on JRuby 1.7.5 to 1.7.9. +# +# Determine what the platform supports and adjust the tests accordingly. +DATETIME_RESOLUTION = (0..5).collect {|i| 10**i}.find {|i| (DateTime.new(2013,1,1,0,0,0) <=> DateTime.new(2013,1,1,0,0,Rational(i,1000000))) < 0} +raise 'Unable to compare DateTimes at a resolution less than one second on this platform' unless DATETIME_RESOLUTION diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/ts_all.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/ts_all.rb new file mode 100644 index 000000000000..f90836d1e8b1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/ts_all.rb @@ -0,0 +1,7 @@ +# Force a particular timezone to be local (helps find issues when local +# timezone isn't GMT). This won't work on Windows. +ENV['TZ'] = 'America/Los_Angeles' + +Dir[File.join(File.expand_path(File.dirname(__FILE__)), 'tc_*.rb')].each {|t| require t} + +puts "Using #{DataSource.get}" diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/ts_all_ruby.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/ts_all_ruby.rb new file mode 100644 index 000000000000..5b822bf6a674 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/ts_all_ruby.rb @@ -0,0 +1,5 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils.rb') + +TZInfo::DataSource.set(:ruby) + +require File.join(File.expand_path(File.dirname(__FILE__)), 'ts_all.rb') diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/ts_all_zoneinfo.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/ts_all_zoneinfo.rb new file mode 100644 index 000000000000..ae1ba15ed7a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/ts_all_zoneinfo.rb @@ -0,0 +1,9 @@ +require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils.rb') + +# Use a zoneinfo directory containing files needed by the tests. +# The symlinks in this directory are set up in test_utils.rb. +zoneinfo_path = File.join(File.expand_path(File.dirname(__FILE__)), 'zoneinfo') +zoneinfo_path.untaint if RUBY_VERSION < '2.7' +TZInfo::DataSource.set(:zoneinfo, zoneinfo_path) + +require File.join(File.expand_path(File.dirname(__FILE__)), 'ts_all.rb') diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data.rb new file mode 100644 index 000000000000..6c3721fea90a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data.rb @@ -0,0 +1,8 @@ +# Top level module for TZInfo. +module TZInfo + # Top level module for TZInfo::Data. + module Data + end +end + +require 'tzinfo/data/version' diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/America/Argentina/Buenos_Aires.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/America/Argentina/Buenos_Aires.rb new file mode 100644 index 000000000000..19853cecf0ee --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/America/Argentina/Buenos_Aires.rb @@ -0,0 +1,89 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module America + module Argentina + module Buenos_Aires + include TimezoneDefinition + + timezone 'America/Argentina/Buenos_Aires' do |tz| + tz.offset :o0, -14028, 0, :LMT + tz.offset :o1, -15408, 0, :CMT + tz.offset :o2, -14400, 0, :'-04' + tz.offset :o3, -14400, 3600, :'-03' + tz.offset :o4, -10800, 0, :'-03' + tz.offset :o5, -10800, 3600, :'-02' + + tz.transition 1894, 10, :o1, -2372097972, 17374555169, 7200 + tz.transition 1920, 5, :o2, -1567453392, 1453467407, 600 + tz.transition 1930, 12, :o3, -1233432000, 7278935, 3 + tz.transition 1931, 4, :o2, -1222981200, 19411461, 8 + tz.transition 1931, 10, :o3, -1205956800, 7279889, 3 + tz.transition 1932, 3, :o2, -1194037200, 19414141, 8 + tz.transition 1932, 11, :o3, -1172865600, 7281038, 3 + tz.transition 1933, 3, :o2, -1162501200, 19417061, 8 + tz.transition 1933, 11, :o3, -1141329600, 7282133, 3 + tz.transition 1934, 3, :o2, -1130965200, 19419981, 8 + tz.transition 1934, 11, :o3, -1109793600, 7283228, 3 + tz.transition 1935, 3, :o2, -1099429200, 19422901, 8 + tz.transition 1935, 11, :o3, -1078257600, 7284323, 3 + tz.transition 1936, 3, :o2, -1067806800, 19425829, 8 + tz.transition 1936, 11, :o3, -1046635200, 7285421, 3 + tz.transition 1937, 3, :o2, -1036270800, 19428749, 8 + tz.transition 1937, 11, :o3, -1015099200, 7286516, 3 + tz.transition 1938, 3, :o2, -1004734800, 19431669, 8 + tz.transition 1938, 11, :o3, -983563200, 7287611, 3 + tz.transition 1939, 3, :o2, -973198800, 19434589, 8 + tz.transition 1939, 11, :o3, -952027200, 7288706, 3 + tz.transition 1940, 3, :o2, -941576400, 19437517, 8 + tz.transition 1940, 7, :o3, -931032000, 7289435, 3 + tz.transition 1941, 6, :o2, -900882000, 19441285, 8 + tz.transition 1941, 10, :o3, -890337600, 7290848, 3 + tz.transition 1943, 8, :o2, -833749200, 19447501, 8 + tz.transition 1943, 10, :o3, -827265600, 7293038, 3 + tz.transition 1946, 3, :o2, -752274000, 19455045, 8 + tz.transition 1946, 10, :o3, -733780800, 7296284, 3 + tz.transition 1963, 10, :o2, -197326800, 19506429, 8 + tz.transition 1963, 12, :o3, -190843200, 7315136, 3 + tz.transition 1964, 3, :o2, -184194000, 19507645, 8 + tz.transition 1964, 10, :o3, -164491200, 7316051, 3 + tz.transition 1965, 3, :o2, -152658000, 19510565, 8 + tz.transition 1965, 10, :o3, -132955200, 7317146, 3 + tz.transition 1966, 3, :o2, -121122000, 19513485, 8 + tz.transition 1966, 10, :o3, -101419200, 7318241, 3 + tz.transition 1967, 4, :o2, -86821200, 19516661, 8 + tz.transition 1967, 10, :o3, -71092800, 7319294, 3 + tz.transition 1968, 4, :o2, -54766800, 19519629, 8 + tz.transition 1968, 10, :o3, -39038400, 7320407, 3 + tz.transition 1969, 4, :o2, -23317200, 19522541, 8 + tz.transition 1969, 10, :o4, -7588800, 7321499, 3 + tz.transition 1974, 1, :o5, 128142000 + tz.transition 1974, 5, :o4, 136605600 + tz.transition 1988, 12, :o5, 596948400 + tz.transition 1989, 3, :o4, 605066400 + tz.transition 1989, 10, :o5, 624423600 + tz.transition 1990, 3, :o4, 636516000 + tz.transition 1990, 10, :o5, 656478000 + tz.transition 1991, 3, :o4, 667965600 + tz.transition 1991, 10, :o5, 687927600 + tz.transition 1992, 3, :o4, 699415200 + tz.transition 1992, 10, :o5, 719377200 + tz.transition 1993, 3, :o4, 731469600 + tz.transition 1999, 10, :o3, 938919600 + tz.transition 2000, 3, :o4, 952052400 + tz.transition 2007, 12, :o5, 1198983600 + tz.transition 2008, 3, :o4, 1205632800 + tz.transition 2008, 10, :o5, 1224385200 + tz.transition 2009, 3, :o4, 1237082400 + end + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/America/New_York.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/America/New_York.rb new file mode 100644 index 000000000000..6802f535a808 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/America/New_York.rb @@ -0,0 +1,327 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module America + module New_York + include TimezoneDefinition + + timezone 'America/New_York' do |tz| + tz.offset :o0, -17762, 0, :LMT + tz.offset :o1, -18000, 0, :EST + tz.offset :o2, -18000, 3600, :EDT + tz.offset :o3, -18000, 3600, :EWT + tz.offset :o4, -18000, 3600, :EPT + + tz.transition 1883, 11, :o1, -2717650800, 57819197, 24 + tz.transition 1918, 3, :o2, -1633280400, 58120411, 24 + tz.transition 1918, 10, :o1, -1615140000, 9687575, 4 + tz.transition 1919, 3, :o2, -1601830800, 58129147, 24 + tz.transition 1919, 10, :o1, -1583690400, 9689031, 4 + tz.transition 1920, 3, :o2, -1570381200, 58137883, 24 + tz.transition 1920, 10, :o1, -1551636000, 9690515, 4 + tz.transition 1921, 4, :o2, -1536512400, 58147291, 24 + tz.transition 1921, 9, :o1, -1523210400, 9691831, 4 + tz.transition 1922, 4, :o2, -1504458000, 58156195, 24 + tz.transition 1922, 9, :o1, -1491760800, 9693287, 4 + tz.transition 1923, 4, :o2, -1473008400, 58164931, 24 + tz.transition 1923, 9, :o1, -1459706400, 9694771, 4 + tz.transition 1924, 4, :o2, -1441558800, 58173667, 24 + tz.transition 1924, 9, :o1, -1428256800, 9696227, 4 + tz.transition 1925, 4, :o2, -1410109200, 58182403, 24 + tz.transition 1925, 9, :o1, -1396807200, 9697683, 4 + tz.transition 1926, 4, :o2, -1378659600, 58191139, 24 + tz.transition 1926, 9, :o1, -1365357600, 9699139, 4 + tz.transition 1927, 4, :o2, -1347210000, 58199875, 24 + tz.transition 1927, 9, :o1, -1333908000, 9700595, 4 + tz.transition 1928, 4, :o2, -1315155600, 58208779, 24 + tz.transition 1928, 9, :o1, -1301853600, 9702079, 4 + tz.transition 1929, 4, :o2, -1283706000, 58217515, 24 + tz.transition 1929, 9, :o1, -1270404000, 9703535, 4 + tz.transition 1930, 4, :o2, -1252256400, 58226251, 24 + tz.transition 1930, 9, :o1, -1238954400, 9704991, 4 + tz.transition 1931, 4, :o2, -1220806800, 58234987, 24 + tz.transition 1931, 9, :o1, -1207504800, 9706447, 4 + tz.transition 1932, 4, :o2, -1189357200, 58243723, 24 + tz.transition 1932, 9, :o1, -1176055200, 9707903, 4 + tz.transition 1933, 4, :o2, -1157302800, 58252627, 24 + tz.transition 1933, 9, :o1, -1144605600, 9709359, 4 + tz.transition 1934, 4, :o2, -1125853200, 58261363, 24 + tz.transition 1934, 9, :o1, -1112551200, 9710843, 4 + tz.transition 1935, 4, :o2, -1094403600, 58270099, 24 + tz.transition 1935, 9, :o1, -1081101600, 9712299, 4 + tz.transition 1936, 4, :o2, -1062954000, 58278835, 24 + tz.transition 1936, 9, :o1, -1049652000, 9713755, 4 + tz.transition 1937, 4, :o2, -1031504400, 58287571, 24 + tz.transition 1937, 9, :o1, -1018202400, 9715211, 4 + tz.transition 1938, 4, :o2, -1000054800, 58296307, 24 + tz.transition 1938, 9, :o1, -986752800, 9716667, 4 + tz.transition 1939, 4, :o2, -968000400, 58305211, 24 + tz.transition 1939, 9, :o1, -955303200, 9718123, 4 + tz.transition 1940, 4, :o2, -936550800, 58313947, 24 + tz.transition 1940, 9, :o1, -923248800, 9719607, 4 + tz.transition 1941, 4, :o2, -905101200, 58322683, 24 + tz.transition 1941, 9, :o1, -891799200, 9721063, 4 + tz.transition 1942, 2, :o3, -880218000, 58329595, 24 + tz.transition 1945, 8, :o4, -769395600, 58360379, 24 + tz.transition 1945, 9, :o1, -765396000, 9726915, 4 + tz.transition 1946, 4, :o2, -747248400, 58366531, 24 + tz.transition 1946, 9, :o1, -733946400, 9728371, 4 + tz.transition 1947, 4, :o2, -715798800, 58375267, 24 + tz.transition 1947, 9, :o1, -702496800, 9729827, 4 + tz.transition 1948, 4, :o2, -684349200, 58384003, 24 + tz.transition 1948, 9, :o1, -671047200, 9731283, 4 + tz.transition 1949, 4, :o2, -652899600, 58392739, 24 + tz.transition 1949, 9, :o1, -639597600, 9732739, 4 + tz.transition 1950, 4, :o2, -620845200, 58401643, 24 + tz.transition 1950, 9, :o1, -608148000, 9734195, 4 + tz.transition 1951, 4, :o2, -589395600, 58410379, 24 + tz.transition 1951, 9, :o1, -576093600, 9735679, 4 + tz.transition 1952, 4, :o2, -557946000, 58419115, 24 + tz.transition 1952, 9, :o1, -544644000, 9737135, 4 + tz.transition 1953, 4, :o2, -526496400, 58427851, 24 + tz.transition 1953, 9, :o1, -513194400, 9738591, 4 + tz.transition 1954, 4, :o2, -495046800, 58436587, 24 + tz.transition 1954, 9, :o1, -481744800, 9740047, 4 + tz.transition 1955, 4, :o2, -463597200, 58445323, 24 + tz.transition 1955, 10, :o1, -447271200, 9741643, 4 + tz.transition 1956, 4, :o2, -431542800, 58454227, 24 + tz.transition 1956, 10, :o1, -415821600, 9743099, 4 + tz.transition 1957, 4, :o2, -400093200, 58462963, 24 + tz.transition 1957, 10, :o1, -384372000, 9744555, 4 + tz.transition 1958, 4, :o2, -368643600, 58471699, 24 + tz.transition 1958, 10, :o1, -352922400, 9746011, 4 + tz.transition 1959, 4, :o2, -337194000, 58480435, 24 + tz.transition 1959, 10, :o1, -321472800, 9747467, 4 + tz.transition 1960, 4, :o2, -305744400, 58489171, 24 + tz.transition 1960, 10, :o1, -289418400, 9748951, 4 + tz.transition 1961, 4, :o2, -273690000, 58498075, 24 + tz.transition 1961, 10, :o1, -257968800, 9750407, 4 + tz.transition 1962, 4, :o2, -242240400, 58506811, 24 + tz.transition 1962, 10, :o1, -226519200, 9751863, 4 + tz.transition 1963, 4, :o2, -210790800, 58515547, 24 + tz.transition 1963, 10, :o1, -195069600, 9753319, 4 + tz.transition 1964, 4, :o2, -179341200, 58524283, 24 + tz.transition 1964, 10, :o1, -163620000, 9754775, 4 + tz.transition 1965, 4, :o2, -147891600, 58533019, 24 + tz.transition 1965, 10, :o1, -131565600, 9756259, 4 + tz.transition 1966, 4, :o2, -116442000, 58541755, 24 + tz.transition 1966, 10, :o1, -100116000, 9757715, 4 + tz.transition 1967, 4, :o2, -84387600, 58550659, 24 + tz.transition 1967, 10, :o1, -68666400, 9759171, 4 + tz.transition 1968, 4, :o2, -52938000, 58559395, 24 + tz.transition 1968, 10, :o1, -37216800, 9760627, 4 + tz.transition 1969, 4, :o2, -21488400, 58568131, 24 + tz.transition 1969, 10, :o1, -5767200, 9762083, 4 + tz.transition 1970, 4, :o2, 9961200 + tz.transition 1970, 10, :o1, 25682400 + tz.transition 1971, 4, :o2, 41410800 + tz.transition 1971, 10, :o1, 57736800 + tz.transition 1972, 4, :o2, 73465200 + tz.transition 1972, 10, :o1, 89186400 + tz.transition 1973, 4, :o2, 104914800 + tz.transition 1973, 10, :o1, 120636000 + tz.transition 1974, 1, :o2, 126687600 + tz.transition 1974, 10, :o1, 152085600 + tz.transition 1975, 2, :o2, 162370800 + tz.transition 1975, 10, :o1, 183535200 + tz.transition 1976, 4, :o2, 199263600 + tz.transition 1976, 10, :o1, 215589600 + tz.transition 1977, 4, :o2, 230713200 + tz.transition 1977, 10, :o1, 247039200 + tz.transition 1978, 4, :o2, 262767600 + tz.transition 1978, 10, :o1, 278488800 + tz.transition 1979, 4, :o2, 294217200 + tz.transition 1979, 10, :o1, 309938400 + tz.transition 1980, 4, :o2, 325666800 + tz.transition 1980, 10, :o1, 341388000 + tz.transition 1981, 4, :o2, 357116400 + tz.transition 1981, 10, :o1, 372837600 + tz.transition 1982, 4, :o2, 388566000 + tz.transition 1982, 10, :o1, 404892000 + tz.transition 1983, 4, :o2, 420015600 + tz.transition 1983, 10, :o1, 436341600 + tz.transition 1984, 4, :o2, 452070000 + tz.transition 1984, 10, :o1, 467791200 + tz.transition 1985, 4, :o2, 483519600 + tz.transition 1985, 10, :o1, 499240800 + tz.transition 1986, 4, :o2, 514969200 + tz.transition 1986, 10, :o1, 530690400 + tz.transition 1987, 4, :o2, 544604400 + tz.transition 1987, 10, :o1, 562140000 + tz.transition 1988, 4, :o2, 576054000 + tz.transition 1988, 10, :o1, 594194400 + tz.transition 1989, 4, :o2, 607503600 + tz.transition 1989, 10, :o1, 625644000 + tz.transition 1990, 4, :o2, 638953200 + tz.transition 1990, 10, :o1, 657093600 + tz.transition 1991, 4, :o2, 671007600 + tz.transition 1991, 10, :o1, 688543200 + tz.transition 1992, 4, :o2, 702457200 + tz.transition 1992, 10, :o1, 719992800 + tz.transition 1993, 4, :o2, 733906800 + tz.transition 1993, 10, :o1, 752047200 + tz.transition 1994, 4, :o2, 765356400 + tz.transition 1994, 10, :o1, 783496800 + tz.transition 1995, 4, :o2, 796806000 + tz.transition 1995, 10, :o1, 814946400 + tz.transition 1996, 4, :o2, 828860400 + tz.transition 1996, 10, :o1, 846396000 + tz.transition 1997, 4, :o2, 860310000 + tz.transition 1997, 10, :o1, 877845600 + tz.transition 1998, 4, :o2, 891759600 + tz.transition 1998, 10, :o1, 909295200 + tz.transition 1999, 4, :o2, 923209200 + tz.transition 1999, 10, :o1, 941349600 + tz.transition 2000, 4, :o2, 954658800 + tz.transition 2000, 10, :o1, 972799200 + tz.transition 2001, 4, :o2, 986108400 + tz.transition 2001, 10, :o1, 1004248800 + tz.transition 2002, 4, :o2, 1018162800 + tz.transition 2002, 10, :o1, 1035698400 + tz.transition 2003, 4, :o2, 1049612400 + tz.transition 2003, 10, :o1, 1067148000 + tz.transition 2004, 4, :o2, 1081062000 + tz.transition 2004, 10, :o1, 1099202400 + tz.transition 2005, 4, :o2, 1112511600 + tz.transition 2005, 10, :o1, 1130652000 + tz.transition 2006, 4, :o2, 1143961200 + tz.transition 2006, 10, :o1, 1162101600 + tz.transition 2007, 3, :o2, 1173596400 + tz.transition 2007, 11, :o1, 1194156000 + tz.transition 2008, 3, :o2, 1205046000 + tz.transition 2008, 11, :o1, 1225605600 + tz.transition 2009, 3, :o2, 1236495600 + tz.transition 2009, 11, :o1, 1257055200 + tz.transition 2010, 3, :o2, 1268550000 + tz.transition 2010, 11, :o1, 1289109600 + tz.transition 2011, 3, :o2, 1299999600 + tz.transition 2011, 11, :o1, 1320559200 + tz.transition 2012, 3, :o2, 1331449200 + tz.transition 2012, 11, :o1, 1352008800 + tz.transition 2013, 3, :o2, 1362898800 + tz.transition 2013, 11, :o1, 1383458400 + tz.transition 2014, 3, :o2, 1394348400 + tz.transition 2014, 11, :o1, 1414908000 + tz.transition 2015, 3, :o2, 1425798000 + tz.transition 2015, 11, :o1, 1446357600 + tz.transition 2016, 3, :o2, 1457852400 + tz.transition 2016, 11, :o1, 1478412000 + tz.transition 2017, 3, :o2, 1489302000 + tz.transition 2017, 11, :o1, 1509861600 + tz.transition 2018, 3, :o2, 1520751600 + tz.transition 2018, 11, :o1, 1541311200 + tz.transition 2019, 3, :o2, 1552201200 + tz.transition 2019, 11, :o1, 1572760800 + tz.transition 2020, 3, :o2, 1583650800 + tz.transition 2020, 11, :o1, 1604210400 + tz.transition 2021, 3, :o2, 1615705200 + tz.transition 2021, 11, :o1, 1636264800 + tz.transition 2022, 3, :o2, 1647154800 + tz.transition 2022, 11, :o1, 1667714400 + tz.transition 2023, 3, :o2, 1678604400 + tz.transition 2023, 11, :o1, 1699164000 + tz.transition 2024, 3, :o2, 1710054000 + tz.transition 2024, 11, :o1, 1730613600 + tz.transition 2025, 3, :o2, 1741503600 + tz.transition 2025, 11, :o1, 1762063200 + tz.transition 2026, 3, :o2, 1772953200 + tz.transition 2026, 11, :o1, 1793512800 + tz.transition 2027, 3, :o2, 1805007600 + tz.transition 2027, 11, :o1, 1825567200 + tz.transition 2028, 3, :o2, 1836457200 + tz.transition 2028, 11, :o1, 1857016800 + tz.transition 2029, 3, :o2, 1867906800 + tz.transition 2029, 11, :o1, 1888466400 + tz.transition 2030, 3, :o2, 1899356400 + tz.transition 2030, 11, :o1, 1919916000 + tz.transition 2031, 3, :o2, 1930806000 + tz.transition 2031, 11, :o1, 1951365600 + tz.transition 2032, 3, :o2, 1962860400 + tz.transition 2032, 11, :o1, 1983420000 + tz.transition 2033, 3, :o2, 1994310000 + tz.transition 2033, 11, :o1, 2014869600 + tz.transition 2034, 3, :o2, 2025759600 + tz.transition 2034, 11, :o1, 2046319200 + tz.transition 2035, 3, :o2, 2057209200 + tz.transition 2035, 11, :o1, 2077768800 + tz.transition 2036, 3, :o2, 2088658800 + tz.transition 2036, 11, :o1, 2109218400 + tz.transition 2037, 3, :o2, 2120108400 + tz.transition 2037, 11, :o1, 2140668000 + tz.transition 2038, 3, :o2, 2152162800, 59171923, 24 + tz.transition 2038, 11, :o1, 2172722400, 9862939, 4 + tz.transition 2039, 3, :o2, 2183612400, 59180659, 24 + tz.transition 2039, 11, :o1, 2204172000, 9864395, 4 + tz.transition 2040, 3, :o2, 2215062000, 59189395, 24 + tz.transition 2040, 11, :o1, 2235621600, 9865851, 4 + tz.transition 2041, 3, :o2, 2246511600, 59198131, 24 + tz.transition 2041, 11, :o1, 2267071200, 9867307, 4 + tz.transition 2042, 3, :o2, 2277961200, 59206867, 24 + tz.transition 2042, 11, :o1, 2298520800, 9868763, 4 + tz.transition 2043, 3, :o2, 2309410800, 59215603, 24 + tz.transition 2043, 11, :o1, 2329970400, 9870219, 4 + tz.transition 2044, 3, :o2, 2341465200, 59224507, 24 + tz.transition 2044, 11, :o1, 2362024800, 9871703, 4 + tz.transition 2045, 3, :o2, 2372914800, 59233243, 24 + tz.transition 2045, 11, :o1, 2393474400, 9873159, 4 + tz.transition 2046, 3, :o2, 2404364400, 59241979, 24 + tz.transition 2046, 11, :o1, 2424924000, 9874615, 4 + tz.transition 2047, 3, :o2, 2435814000, 59250715, 24 + tz.transition 2047, 11, :o1, 2456373600, 9876071, 4 + tz.transition 2048, 3, :o2, 2467263600, 59259451, 24 + tz.transition 2048, 11, :o1, 2487823200, 9877527, 4 + tz.transition 2049, 3, :o2, 2499318000, 59268355, 24 + tz.transition 2049, 11, :o1, 2519877600, 9879011, 4 + tz.transition 2050, 3, :o2, 2530767600, 59277091, 24 + tz.transition 2050, 11, :o1, 2551327200, 9880467, 4 + tz.transition 2051, 3, :o2, 2562217200, 59285827, 24 + tz.transition 2051, 11, :o1, 2582776800, 9881923, 4 + tz.transition 2052, 3, :o2, 2593666800, 59294563, 24 + tz.transition 2052, 11, :o1, 2614226400, 9883379, 4 + tz.transition 2053, 3, :o2, 2625116400, 59303299, 24 + tz.transition 2053, 11, :o1, 2645676000, 9884835, 4 + tz.transition 2054, 3, :o2, 2656566000, 59312035, 24 + tz.transition 2054, 11, :o1, 2677125600, 9886291, 4 + tz.transition 2055, 3, :o2, 2688620400, 59320939, 24 + tz.transition 2055, 11, :o1, 2709180000, 9887775, 4 + tz.transition 2056, 3, :o2, 2720070000, 59329675, 24 + tz.transition 2056, 11, :o1, 2740629600, 9889231, 4 + tz.transition 2057, 3, :o2, 2751519600, 59338411, 24 + tz.transition 2057, 11, :o1, 2772079200, 9890687, 4 + tz.transition 2058, 3, :o2, 2782969200, 59347147, 24 + tz.transition 2058, 11, :o1, 2803528800, 9892143, 4 + tz.transition 2059, 3, :o2, 2814418800, 59355883, 24 + tz.transition 2059, 11, :o1, 2834978400, 9893599, 4 + tz.transition 2060, 3, :o2, 2846473200, 59364787, 24 + tz.transition 2060, 11, :o1, 2867032800, 9895083, 4 + tz.transition 2061, 3, :o2, 2877922800, 59373523, 24 + tz.transition 2061, 11, :o1, 2898482400, 9896539, 4 + tz.transition 2062, 3, :o2, 2909372400, 59382259, 24 + tz.transition 2062, 11, :o1, 2929932000, 9897995, 4 + tz.transition 2063, 3, :o2, 2940822000, 59390995, 24 + tz.transition 2063, 11, :o1, 2961381600, 9899451, 4 + tz.transition 2064, 3, :o2, 2972271600, 59399731, 24 + tz.transition 2064, 11, :o1, 2992831200, 9900907, 4 + tz.transition 2065, 3, :o2, 3003721200, 59408467, 24 + tz.transition 2065, 11, :o1, 3024280800, 9902363, 4 + tz.transition 2066, 3, :o2, 3035775600, 59417371, 24 + tz.transition 2066, 11, :o1, 3056335200, 9903847, 4 + tz.transition 2067, 3, :o2, 3067225200, 59426107, 24 + tz.transition 2067, 11, :o1, 3087784800, 9905303, 4 + tz.transition 2068, 3, :o2, 3098674800, 59434843, 24 + tz.transition 2068, 11, :o1, 3119234400, 9906759, 4 + tz.transition 2069, 3, :o2, 3130124400, 59443579, 24 + tz.transition 2069, 11, :o1, 3150684000, 9908215, 4 + tz.transition 2070, 3, :o2, 3161574000, 59452315, 24 + tz.transition 2070, 11, :o1, 3182133600, 9909671, 4 + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Australia/Melbourne.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Australia/Melbourne.rb new file mode 100644 index 000000000000..6acd078e44b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Australia/Melbourne.rb @@ -0,0 +1,230 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module Australia + module Melbourne + include TimezoneDefinition + + timezone 'Australia/Melbourne' do |tz| + tz.offset :o0, 34792, 0, :LMT + tz.offset :o1, 36000, 0, :AEST + tz.offset :o2, 36000, 3600, :AEDT + + tz.transition 1895, 1, :o1, -2364111592, 26062831051, 10800 + tz.transition 1916, 12, :o2, -1672567140, 3486569881, 1440 + tz.transition 1917, 3, :o1, -1665392400, 19370497, 8 + tz.transition 1941, 12, :o2, -883641600, 14582161, 6 + tz.transition 1942, 3, :o1, -876128400, 19443577, 8 + tz.transition 1942, 9, :o2, -860400000, 14583775, 6 + tz.transition 1943, 3, :o1, -844678800, 19446489, 8 + tz.transition 1943, 10, :o2, -828345600, 14586001, 6 + tz.transition 1944, 3, :o1, -813229200, 19449401, 8 + tz.transition 1971, 10, :o2, 57686400 + tz.transition 1972, 2, :o1, 67968000 + tz.transition 1972, 10, :o2, 89136000 + tz.transition 1973, 3, :o1, 100022400 + tz.transition 1973, 10, :o2, 120585600 + tz.transition 1974, 3, :o1, 131472000 + tz.transition 1974, 10, :o2, 152035200 + tz.transition 1975, 3, :o1, 162921600 + tz.transition 1975, 10, :o2, 183484800 + tz.transition 1976, 3, :o1, 194976000 + tz.transition 1976, 10, :o2, 215539200 + tz.transition 1977, 3, :o1, 226425600 + tz.transition 1977, 10, :o2, 246988800 + tz.transition 1978, 3, :o1, 257875200 + tz.transition 1978, 10, :o2, 278438400 + tz.transition 1979, 3, :o1, 289324800 + tz.transition 1979, 10, :o2, 309888000 + tz.transition 1980, 3, :o1, 320774400 + tz.transition 1980, 10, :o2, 341337600 + tz.transition 1981, 2, :o1, 352224000 + tz.transition 1981, 10, :o2, 372787200 + tz.transition 1982, 3, :o1, 384278400 + tz.transition 1982, 10, :o2, 404841600 + tz.transition 1983, 3, :o1, 415728000 + tz.transition 1983, 10, :o2, 436291200 + tz.transition 1984, 3, :o1, 447177600 + tz.transition 1984, 10, :o2, 467740800 + tz.transition 1985, 3, :o1, 478627200 + tz.transition 1985, 10, :o2, 499190400 + tz.transition 1986, 3, :o1, 511286400 + tz.transition 1986, 10, :o2, 530035200 + tz.transition 1987, 3, :o1, 542736000 + tz.transition 1987, 10, :o2, 561484800 + tz.transition 1988, 3, :o1, 574790400 + tz.transition 1988, 10, :o2, 594144000 + tz.transition 1989, 3, :o1, 606240000 + tz.transition 1989, 10, :o2, 625593600 + tz.transition 1990, 3, :o1, 637689600 + tz.transition 1990, 10, :o2, 657043200 + tz.transition 1991, 3, :o1, 667929600 + tz.transition 1991, 10, :o2, 688492800 + tz.transition 1992, 2, :o1, 699379200 + tz.transition 1992, 10, :o2, 719942400 + tz.transition 1993, 3, :o1, 731433600 + tz.transition 1993, 10, :o2, 751996800 + tz.transition 1994, 3, :o1, 762883200 + tz.transition 1994, 10, :o2, 783446400 + tz.transition 1995, 3, :o1, 796147200 + tz.transition 1995, 10, :o2, 814896000 + tz.transition 1996, 3, :o1, 828201600 + tz.transition 1996, 10, :o2, 846345600 + tz.transition 1997, 3, :o1, 859651200 + tz.transition 1997, 10, :o2, 877795200 + tz.transition 1998, 3, :o1, 891100800 + tz.transition 1998, 10, :o2, 909244800 + tz.transition 1999, 3, :o1, 922550400 + tz.transition 1999, 10, :o2, 941299200 + tz.transition 2000, 3, :o1, 954000000 + tz.transition 2000, 8, :o2, 967305600 + tz.transition 2001, 3, :o1, 985449600 + tz.transition 2001, 10, :o2, 1004198400 + tz.transition 2002, 3, :o1, 1017504000 + tz.transition 2002, 10, :o2, 1035648000 + tz.transition 2003, 3, :o1, 1048953600 + tz.transition 2003, 10, :o2, 1067097600 + tz.transition 2004, 3, :o1, 1080403200 + tz.transition 2004, 10, :o2, 1099152000 + tz.transition 2005, 3, :o1, 1111852800 + tz.transition 2005, 10, :o2, 1130601600 + tz.transition 2006, 4, :o1, 1143907200 + tz.transition 2006, 10, :o2, 1162051200 + tz.transition 2007, 3, :o1, 1174752000 + tz.transition 2007, 10, :o2, 1193500800 + tz.transition 2008, 4, :o1, 1207411200 + tz.transition 2008, 10, :o2, 1223136000 + tz.transition 2009, 4, :o1, 1238860800 + tz.transition 2009, 10, :o2, 1254585600 + tz.transition 2010, 4, :o1, 1270310400 + tz.transition 2010, 10, :o2, 1286035200 + tz.transition 2011, 4, :o1, 1301760000 + tz.transition 2011, 10, :o2, 1317484800 + tz.transition 2012, 3, :o1, 1333209600 + tz.transition 2012, 10, :o2, 1349539200 + tz.transition 2013, 4, :o1, 1365264000 + tz.transition 2013, 10, :o2, 1380988800 + tz.transition 2014, 4, :o1, 1396713600 + tz.transition 2014, 10, :o2, 1412438400 + tz.transition 2015, 4, :o1, 1428163200 + tz.transition 2015, 10, :o2, 1443888000 + tz.transition 2016, 4, :o1, 1459612800 + tz.transition 2016, 10, :o2, 1475337600 + tz.transition 2017, 4, :o1, 1491062400 + tz.transition 2017, 9, :o2, 1506787200 + tz.transition 2018, 3, :o1, 1522512000 + tz.transition 2018, 10, :o2, 1538841600 + tz.transition 2019, 4, :o1, 1554566400 + tz.transition 2019, 10, :o2, 1570291200 + tz.transition 2020, 4, :o1, 1586016000 + tz.transition 2020, 10, :o2, 1601740800 + tz.transition 2021, 4, :o1, 1617465600 + tz.transition 2021, 10, :o2, 1633190400 + tz.transition 2022, 4, :o1, 1648915200 + tz.transition 2022, 10, :o2, 1664640000 + tz.transition 2023, 4, :o1, 1680364800 + tz.transition 2023, 9, :o2, 1696089600 + tz.transition 2024, 4, :o1, 1712419200 + tz.transition 2024, 10, :o2, 1728144000 + tz.transition 2025, 4, :o1, 1743868800 + tz.transition 2025, 10, :o2, 1759593600 + tz.transition 2026, 4, :o1, 1775318400 + tz.transition 2026, 10, :o2, 1791043200 + tz.transition 2027, 4, :o1, 1806768000 + tz.transition 2027, 10, :o2, 1822492800 + tz.transition 2028, 4, :o1, 1838217600 + tz.transition 2028, 9, :o2, 1853942400 + tz.transition 2029, 3, :o1, 1869667200 + tz.transition 2029, 10, :o2, 1885996800 + tz.transition 2030, 4, :o1, 1901721600 + tz.transition 2030, 10, :o2, 1917446400 + tz.transition 2031, 4, :o1, 1933171200 + tz.transition 2031, 10, :o2, 1948896000 + tz.transition 2032, 4, :o1, 1964620800 + tz.transition 2032, 10, :o2, 1980345600 + tz.transition 2033, 4, :o1, 1996070400 + tz.transition 2033, 10, :o2, 2011795200 + tz.transition 2034, 4, :o1, 2027520000 + tz.transition 2034, 9, :o2, 2043244800 + tz.transition 2035, 3, :o1, 2058969600 + tz.transition 2035, 10, :o2, 2075299200 + tz.transition 2036, 4, :o1, 2091024000 + tz.transition 2036, 10, :o2, 2106748800 + tz.transition 2037, 4, :o1, 2122473600 + tz.transition 2037, 10, :o2, 2138198400 + tz.transition 2038, 4, :o1, 2153923200, 14793103, 6 + tz.transition 2038, 10, :o2, 2169648000, 14794195, 6 + tz.transition 2039, 4, :o1, 2185372800, 14795287, 6 + tz.transition 2039, 10, :o2, 2201097600, 14796379, 6 + tz.transition 2040, 3, :o1, 2216822400, 14797471, 6 + tz.transition 2040, 10, :o2, 2233152000, 14798605, 6 + tz.transition 2041, 4, :o1, 2248876800, 14799697, 6 + tz.transition 2041, 10, :o2, 2264601600, 14800789, 6 + tz.transition 2042, 4, :o1, 2280326400, 14801881, 6 + tz.transition 2042, 10, :o2, 2296051200, 14802973, 6 + tz.transition 2043, 4, :o1, 2311776000, 14804065, 6 + tz.transition 2043, 10, :o2, 2327500800, 14805157, 6 + tz.transition 2044, 4, :o1, 2343225600, 14806249, 6 + tz.transition 2044, 10, :o2, 2358950400, 14807341, 6 + tz.transition 2045, 4, :o1, 2374675200, 14808433, 6 + tz.transition 2045, 9, :o2, 2390400000, 14809525, 6 + tz.transition 2046, 3, :o1, 2406124800, 14810617, 6 + tz.transition 2046, 10, :o2, 2422454400, 14811751, 6 + tz.transition 2047, 4, :o1, 2438179200, 14812843, 6 + tz.transition 2047, 10, :o2, 2453904000, 14813935, 6 + tz.transition 2048, 4, :o1, 2469628800, 14815027, 6 + tz.transition 2048, 10, :o2, 2485353600, 14816119, 6 + tz.transition 2049, 4, :o1, 2501078400, 14817211, 6 + tz.transition 2049, 10, :o2, 2516803200, 14818303, 6 + tz.transition 2050, 4, :o1, 2532528000, 14819395, 6 + tz.transition 2050, 10, :o2, 2548252800, 14820487, 6 + tz.transition 2051, 4, :o1, 2563977600, 14821579, 6 + tz.transition 2051, 9, :o2, 2579702400, 14822671, 6 + tz.transition 2052, 4, :o1, 2596032000, 14823805, 6 + tz.transition 2052, 10, :o2, 2611756800, 14824897, 6 + tz.transition 2053, 4, :o1, 2627481600, 14825989, 6 + tz.transition 2053, 10, :o2, 2643206400, 14827081, 6 + tz.transition 2054, 4, :o1, 2658931200, 14828173, 6 + tz.transition 2054, 10, :o2, 2674656000, 14829265, 6 + tz.transition 2055, 4, :o1, 2690380800, 14830357, 6 + tz.transition 2055, 10, :o2, 2706105600, 14831449, 6 + tz.transition 2056, 4, :o1, 2721830400, 14832541, 6 + tz.transition 2056, 9, :o2, 2737555200, 14833633, 6 + tz.transition 2057, 3, :o1, 2753280000, 14834725, 6 + tz.transition 2057, 10, :o2, 2769609600, 14835859, 6 + tz.transition 2058, 4, :o1, 2785334400, 14836951, 6 + tz.transition 2058, 10, :o2, 2801059200, 14838043, 6 + tz.transition 2059, 4, :o1, 2816784000, 14839135, 6 + tz.transition 2059, 10, :o2, 2832508800, 14840227, 6 + tz.transition 2060, 4, :o1, 2848233600, 14841319, 6 + tz.transition 2060, 10, :o2, 2863958400, 14842411, 6 + tz.transition 2061, 4, :o1, 2879683200, 14843503, 6 + tz.transition 2061, 10, :o2, 2895408000, 14844595, 6 + tz.transition 2062, 4, :o1, 2911132800, 14845687, 6 + tz.transition 2062, 9, :o2, 2926857600, 14846779, 6 + tz.transition 2063, 3, :o1, 2942582400, 14847871, 6 + tz.transition 2063, 10, :o2, 2958912000, 14849005, 6 + tz.transition 2064, 4, :o1, 2974636800, 14850097, 6 + tz.transition 2064, 10, :o2, 2990361600, 14851189, 6 + tz.transition 2065, 4, :o1, 3006086400, 14852281, 6 + tz.transition 2065, 10, :o2, 3021811200, 14853373, 6 + tz.transition 2066, 4, :o1, 3037536000, 14854465, 6 + tz.transition 2066, 10, :o2, 3053260800, 14855557, 6 + tz.transition 2067, 4, :o1, 3068985600, 14856649, 6 + tz.transition 2067, 10, :o2, 3084710400, 14857741, 6 + tz.transition 2068, 3, :o1, 3100435200, 14858833, 6 + tz.transition 2068, 10, :o2, 3116764800, 14859967, 6 + tz.transition 2069, 4, :o1, 3132489600, 14861059, 6 + tz.transition 2069, 10, :o2, 3148214400, 14862151, 6 + tz.transition 2070, 4, :o1, 3163939200, 14863243, 6 + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/EST.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/EST.rb new file mode 100644 index 000000000000..82808df3fdb9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/EST.rb @@ -0,0 +1,19 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module EST + include TimezoneDefinition + + timezone 'EST' do |tz| + tz.offset :o0, -18000, 0, :EST + + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__m__1.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__m__1.rb new file mode 100644 index 000000000000..57ab6ed03fd4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__m__1.rb @@ -0,0 +1,21 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module Etc + module GMT__m__1 + include TimezoneDefinition + + timezone 'Etc/GMT-1' do |tz| + tz.offset :o0, 3600, 0, :'+01' + + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__p__1.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__p__1.rb new file mode 100644 index 000000000000..dec19e56b441 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__p__1.rb @@ -0,0 +1,21 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module Etc + module GMT__p__1 + include TimezoneDefinition + + timezone 'Etc/GMT+1' do |tz| + tz.offset :o0, -3600, 0, :'-01' + + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Etc/UTC.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Etc/UTC.rb new file mode 100644 index 000000000000..48fbcf299353 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Etc/UTC.rb @@ -0,0 +1,21 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module Etc + module UTC + include TimezoneDefinition + + timezone 'Etc/UTC' do |tz| + tz.offset :o0, 0, 0, :UTC + + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Amsterdam.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Amsterdam.rb new file mode 100644 index 000000000000..bedf7e4cee5b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Amsterdam.rb @@ -0,0 +1,273 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module Europe + module Amsterdam + include TimezoneDefinition + + timezone 'Europe/Amsterdam' do |tz| + tz.offset :o0, 1172, 0, :LMT + tz.offset :o1, 1172, 0, :AMT + tz.offset :o2, 1172, 3600, :NST + tz.offset :o3, 1200, 3600, :'+0120' + tz.offset :o4, 1200, 0, :'+0020' + tz.offset :o5, 3600, 3600, :CEST + tz.offset :o6, 3600, 0, :CET + + tz.transition 1834, 12, :o1, -4260212372, 51651636907, 21600 + tz.transition 1916, 4, :o2, -1693700372, 52293264907, 21600 + tz.transition 1916, 9, :o1, -1680484772, 52296568807, 21600 + tz.transition 1917, 4, :o2, -1663453172, 52300826707, 21600 + tz.transition 1917, 9, :o1, -1650147572, 52304153107, 21600 + tz.transition 1918, 4, :o2, -1633213172, 52308386707, 21600 + tz.transition 1918, 9, :o1, -1617488372, 52312317907, 21600 + tz.transition 1919, 4, :o2, -1601158772, 52316400307, 21600 + tz.transition 1919, 9, :o1, -1586038772, 52320180307, 21600 + tz.transition 1920, 4, :o2, -1569709172, 52324262707, 21600 + tz.transition 1920, 9, :o1, -1554589172, 52328042707, 21600 + tz.transition 1921, 4, :o2, -1538259572, 52332125107, 21600 + tz.transition 1921, 9, :o1, -1523139572, 52335905107, 21600 + tz.transition 1922, 3, :o2, -1507501172, 52339814707, 21600 + tz.transition 1922, 10, :o1, -1490566772, 52344048307, 21600 + tz.transition 1923, 6, :o2, -1470176372, 52349145907, 21600 + tz.transition 1923, 10, :o1, -1459117172, 52351910707, 21600 + tz.transition 1924, 3, :o2, -1443997172, 52355690707, 21600 + tz.transition 1924, 10, :o1, -1427667572, 52359773107, 21600 + tz.transition 1925, 6, :o2, -1406672372, 52365021907, 21600 + tz.transition 1925, 10, :o1, -1396217972, 52367635507, 21600 + tz.transition 1926, 5, :o2, -1376950772, 52372452307, 21600 + tz.transition 1926, 10, :o1, -1364768372, 52375497907, 21600 + tz.transition 1927, 5, :o2, -1345414772, 52380336307, 21600 + tz.transition 1927, 10, :o1, -1333318772, 52383360307, 21600 + tz.transition 1928, 5, :o2, -1313792372, 52388241907, 21600 + tz.transition 1928, 10, :o1, -1301264372, 52391373907, 21600 + tz.transition 1929, 5, :o2, -1282256372, 52396125907, 21600 + tz.transition 1929, 10, :o1, -1269814772, 52399236307, 21600 + tz.transition 1930, 5, :o2, -1250720372, 52404009907, 21600 + tz.transition 1930, 10, :o1, -1238365172, 52407098707, 21600 + tz.transition 1931, 5, :o2, -1219184372, 52411893907, 21600 + tz.transition 1931, 10, :o1, -1206915572, 52414961107, 21600 + tz.transition 1932, 5, :o2, -1186957172, 52419950707, 21600 + tz.transition 1932, 10, :o1, -1175465972, 52422823507, 21600 + tz.transition 1933, 5, :o2, -1156025972, 52427683507, 21600 + tz.transition 1933, 10, :o1, -1143411572, 52430837107, 21600 + tz.transition 1934, 5, :o2, -1124489972, 52435567507, 21600 + tz.transition 1934, 10, :o1, -1111961972, 52438699507, 21600 + tz.transition 1935, 5, :o2, -1092953972, 52443451507, 21600 + tz.transition 1935, 10, :o1, -1080512372, 52446561907, 21600 + tz.transition 1936, 5, :o2, -1061331572, 52451357107, 21600 + tz.transition 1936, 10, :o1, -1049062772, 52454424307, 21600 + tz.transition 1937, 5, :o2, -1029190772, 52459392307, 21600 + tz.transition 1937, 6, :o3, -1025745572, 52460253607, 21600 + tz.transition 1937, 10, :o4, -1017613200, 174874289, 72 + tz.transition 1938, 5, :o3, -998259600, 174890417, 72 + tz.transition 1938, 10, :o4, -986163600, 174900497, 72 + tz.transition 1939, 5, :o3, -966723600, 174916697, 72 + tz.transition 1939, 10, :o4, -954109200, 174927209, 72 + tz.transition 1940, 5, :o5, -935022000, 174943115, 72 + tz.transition 1942, 11, :o6, -857257200, 58335973, 24 + tz.transition 1943, 3, :o5, -844556400, 58339501, 24 + tz.transition 1943, 10, :o6, -828226800, 58344037, 24 + tz.transition 1944, 4, :o5, -812502000, 58348405, 24 + tz.transition 1944, 10, :o6, -796777200, 58352773, 24 + tz.transition 1945, 4, :o5, -781052400, 58357141, 24 + tz.transition 1945, 9, :o6, -766623600, 58361149, 24 + tz.transition 1977, 4, :o5, 228877200 + tz.transition 1977, 9, :o6, 243997200 + tz.transition 1978, 4, :o5, 260326800 + tz.transition 1978, 10, :o6, 276051600 + tz.transition 1979, 4, :o5, 291776400 + tz.transition 1979, 9, :o6, 307501200 + tz.transition 1980, 4, :o5, 323830800 + tz.transition 1980, 9, :o6, 338950800 + tz.transition 1981, 3, :o5, 354675600 + tz.transition 1981, 9, :o6, 370400400 + tz.transition 1982, 3, :o5, 386125200 + tz.transition 1982, 9, :o6, 401850000 + tz.transition 1983, 3, :o5, 417574800 + tz.transition 1983, 9, :o6, 433299600 + tz.transition 1984, 3, :o5, 449024400 + tz.transition 1984, 9, :o6, 465354000 + tz.transition 1985, 3, :o5, 481078800 + tz.transition 1985, 9, :o6, 496803600 + tz.transition 1986, 3, :o5, 512528400 + tz.transition 1986, 9, :o6, 528253200 + tz.transition 1987, 3, :o5, 543978000 + tz.transition 1987, 9, :o6, 559702800 + tz.transition 1988, 3, :o5, 575427600 + tz.transition 1988, 9, :o6, 591152400 + tz.transition 1989, 3, :o5, 606877200 + tz.transition 1989, 9, :o6, 622602000 + tz.transition 1990, 3, :o5, 638326800 + tz.transition 1990, 9, :o6, 654656400 + tz.transition 1991, 3, :o5, 670381200 + tz.transition 1991, 9, :o6, 686106000 + tz.transition 1992, 3, :o5, 701830800 + tz.transition 1992, 9, :o6, 717555600 + tz.transition 1993, 3, :o5, 733280400 + tz.transition 1993, 9, :o6, 749005200 + tz.transition 1994, 3, :o5, 764730000 + tz.transition 1994, 9, :o6, 780454800 + tz.transition 1995, 3, :o5, 796179600 + tz.transition 1995, 9, :o6, 811904400 + tz.transition 1996, 3, :o5, 828234000 + tz.transition 1996, 10, :o6, 846378000 + tz.transition 1997, 3, :o5, 859683600 + tz.transition 1997, 10, :o6, 877827600 + tz.transition 1998, 3, :o5, 891133200 + tz.transition 1998, 10, :o6, 909277200 + tz.transition 1999, 3, :o5, 922582800 + tz.transition 1999, 10, :o6, 941331600 + tz.transition 2000, 3, :o5, 954032400 + tz.transition 2000, 10, :o6, 972781200 + tz.transition 2001, 3, :o5, 985482000 + tz.transition 2001, 10, :o6, 1004230800 + tz.transition 2002, 3, :o5, 1017536400 + tz.transition 2002, 10, :o6, 1035680400 + tz.transition 2003, 3, :o5, 1048986000 + tz.transition 2003, 10, :o6, 1067130000 + tz.transition 2004, 3, :o5, 1080435600 + tz.transition 2004, 10, :o6, 1099184400 + tz.transition 2005, 3, :o5, 1111885200 + tz.transition 2005, 10, :o6, 1130634000 + tz.transition 2006, 3, :o5, 1143334800 + tz.transition 2006, 10, :o6, 1162083600 + tz.transition 2007, 3, :o5, 1174784400 + tz.transition 2007, 10, :o6, 1193533200 + tz.transition 2008, 3, :o5, 1206838800 + tz.transition 2008, 10, :o6, 1224982800 + tz.transition 2009, 3, :o5, 1238288400 + tz.transition 2009, 10, :o6, 1256432400 + tz.transition 2010, 3, :o5, 1269738000 + tz.transition 2010, 10, :o6, 1288486800 + tz.transition 2011, 3, :o5, 1301187600 + tz.transition 2011, 10, :o6, 1319936400 + tz.transition 2012, 3, :o5, 1332637200 + tz.transition 2012, 10, :o6, 1351386000 + tz.transition 2013, 3, :o5, 1364691600 + tz.transition 2013, 10, :o6, 1382835600 + tz.transition 2014, 3, :o5, 1396141200 + tz.transition 2014, 10, :o6, 1414285200 + tz.transition 2015, 3, :o5, 1427590800 + tz.transition 2015, 10, :o6, 1445734800 + tz.transition 2016, 3, :o5, 1459040400 + tz.transition 2016, 10, :o6, 1477789200 + tz.transition 2017, 3, :o5, 1490490000 + tz.transition 2017, 10, :o6, 1509238800 + tz.transition 2018, 3, :o5, 1521939600 + tz.transition 2018, 10, :o6, 1540688400 + tz.transition 2019, 3, :o5, 1553994000 + tz.transition 2019, 10, :o6, 1572138000 + tz.transition 2020, 3, :o5, 1585443600 + tz.transition 2020, 10, :o6, 1603587600 + tz.transition 2021, 3, :o5, 1616893200 + tz.transition 2021, 10, :o6, 1635642000 + tz.transition 2022, 3, :o5, 1648342800 + tz.transition 2022, 10, :o6, 1667091600 + tz.transition 2023, 3, :o5, 1679792400 + tz.transition 2023, 10, :o6, 1698541200 + tz.transition 2024, 3, :o5, 1711846800 + tz.transition 2024, 10, :o6, 1729990800 + tz.transition 2025, 3, :o5, 1743296400 + tz.transition 2025, 10, :o6, 1761440400 + tz.transition 2026, 3, :o5, 1774746000 + tz.transition 2026, 10, :o6, 1792890000 + tz.transition 2027, 3, :o5, 1806195600 + tz.transition 2027, 10, :o6, 1824944400 + tz.transition 2028, 3, :o5, 1837645200 + tz.transition 2028, 10, :o6, 1856394000 + tz.transition 2029, 3, :o5, 1869094800 + tz.transition 2029, 10, :o6, 1887843600 + tz.transition 2030, 3, :o5, 1901149200 + tz.transition 2030, 10, :o6, 1919293200 + tz.transition 2031, 3, :o5, 1932598800 + tz.transition 2031, 10, :o6, 1950742800 + tz.transition 2032, 3, :o5, 1964048400 + tz.transition 2032, 10, :o6, 1982797200 + tz.transition 2033, 3, :o5, 1995498000 + tz.transition 2033, 10, :o6, 2014246800 + tz.transition 2034, 3, :o5, 2026947600 + tz.transition 2034, 10, :o6, 2045696400 + tz.transition 2035, 3, :o5, 2058397200 + tz.transition 2035, 10, :o6, 2077146000 + tz.transition 2036, 3, :o5, 2090451600 + tz.transition 2036, 10, :o6, 2108595600 + tz.transition 2037, 3, :o5, 2121901200 + tz.transition 2037, 10, :o6, 2140045200 + tz.transition 2038, 3, :o5, 2153350800, 59172253, 24 + tz.transition 2038, 10, :o6, 2172099600, 59177461, 24 + tz.transition 2039, 3, :o5, 2184800400, 59180989, 24 + tz.transition 2039, 10, :o6, 2203549200, 59186197, 24 + tz.transition 2040, 3, :o5, 2216250000, 59189725, 24 + tz.transition 2040, 10, :o6, 2234998800, 59194933, 24 + tz.transition 2041, 3, :o5, 2248304400, 59198629, 24 + tz.transition 2041, 10, :o6, 2266448400, 59203669, 24 + tz.transition 2042, 3, :o5, 2279754000, 59207365, 24 + tz.transition 2042, 10, :o6, 2297898000, 59212405, 24 + tz.transition 2043, 3, :o5, 2311203600, 59216101, 24 + tz.transition 2043, 10, :o6, 2329347600, 59221141, 24 + tz.transition 2044, 3, :o5, 2342653200, 59224837, 24 + tz.transition 2044, 10, :o6, 2361402000, 59230045, 24 + tz.transition 2045, 3, :o5, 2374102800, 59233573, 24 + tz.transition 2045, 10, :o6, 2392851600, 59238781, 24 + tz.transition 2046, 3, :o5, 2405552400, 59242309, 24 + tz.transition 2046, 10, :o6, 2424301200, 59247517, 24 + tz.transition 2047, 3, :o5, 2437606800, 59251213, 24 + tz.transition 2047, 10, :o6, 2455750800, 59256253, 24 + tz.transition 2048, 3, :o5, 2469056400, 59259949, 24 + tz.transition 2048, 10, :o6, 2487200400, 59264989, 24 + tz.transition 2049, 3, :o5, 2500506000, 59268685, 24 + tz.transition 2049, 10, :o6, 2519254800, 59273893, 24 + tz.transition 2050, 3, :o5, 2531955600, 59277421, 24 + tz.transition 2050, 10, :o6, 2550704400, 59282629, 24 + tz.transition 2051, 3, :o5, 2563405200, 59286157, 24 + tz.transition 2051, 10, :o6, 2582154000, 59291365, 24 + tz.transition 2052, 3, :o5, 2595459600, 59295061, 24 + tz.transition 2052, 10, :o6, 2613603600, 59300101, 24 + tz.transition 2053, 3, :o5, 2626909200, 59303797, 24 + tz.transition 2053, 10, :o6, 2645053200, 59308837, 24 + tz.transition 2054, 3, :o5, 2658358800, 59312533, 24 + tz.transition 2054, 10, :o6, 2676502800, 59317573, 24 + tz.transition 2055, 3, :o5, 2689808400, 59321269, 24 + tz.transition 2055, 10, :o6, 2708557200, 59326477, 24 + tz.transition 2056, 3, :o5, 2721258000, 59330005, 24 + tz.transition 2056, 10, :o6, 2740006800, 59335213, 24 + tz.transition 2057, 3, :o5, 2752707600, 59338741, 24 + tz.transition 2057, 10, :o6, 2771456400, 59343949, 24 + tz.transition 2058, 3, :o5, 2784762000, 59347645, 24 + tz.transition 2058, 10, :o6, 2802906000, 59352685, 24 + tz.transition 2059, 3, :o5, 2816211600, 59356381, 24 + tz.transition 2059, 10, :o6, 2834355600, 59361421, 24 + tz.transition 2060, 3, :o5, 2847661200, 59365117, 24 + tz.transition 2060, 10, :o6, 2866410000, 59370325, 24 + tz.transition 2061, 3, :o5, 2879110800, 59373853, 24 + tz.transition 2061, 10, :o6, 2897859600, 59379061, 24 + tz.transition 2062, 3, :o5, 2910560400, 59382589, 24 + tz.transition 2062, 10, :o6, 2929309200, 59387797, 24 + tz.transition 2063, 3, :o5, 2942010000, 59391325, 24 + tz.transition 2063, 10, :o6, 2960758800, 59396533, 24 + tz.transition 2064, 3, :o5, 2974064400, 59400229, 24 + tz.transition 2064, 10, :o6, 2992208400, 59405269, 24 + tz.transition 2065, 3, :o5, 3005514000, 59408965, 24 + tz.transition 2065, 10, :o6, 3023658000, 59414005, 24 + tz.transition 2066, 3, :o5, 3036963600, 59417701, 24 + tz.transition 2066, 10, :o6, 3055712400, 59422909, 24 + tz.transition 2067, 3, :o5, 3068413200, 59426437, 24 + tz.transition 2067, 10, :o6, 3087162000, 59431645, 24 + tz.transition 2068, 3, :o5, 3099862800, 59435173, 24 + tz.transition 2068, 10, :o6, 3118611600, 59440381, 24 + tz.transition 2069, 3, :o5, 3131917200, 59444077, 24 + tz.transition 2069, 10, :o6, 3150061200, 59449117, 24 + tz.transition 2070, 3, :o5, 3163366800, 59452813, 24 + tz.transition 2070, 10, :o6, 3181510800, 59457853, 24 + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Andorra.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Andorra.rb new file mode 100644 index 000000000000..d51c5dc37748 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Andorra.rb @@ -0,0 +1,198 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module Europe + module Andorra + include TimezoneDefinition + + timezone 'Europe/Andorra' do |tz| + tz.offset :o0, 364, 0, :LMT + tz.offset :o1, 0, 0, :WET + tz.offset :o2, 3600, 0, :CET + tz.offset :o3, 3600, 3600, :CEST + + tz.transition 1900, 12, :o1, -2177453164, 52172326709, 21600 + tz.transition 1946, 9, :o2, -733881600, 4864187, 2 + tz.transition 1985, 3, :o3, 481078800 + tz.transition 1985, 9, :o2, 496803600 + tz.transition 1986, 3, :o3, 512528400 + tz.transition 1986, 9, :o2, 528253200 + tz.transition 1987, 3, :o3, 543978000 + tz.transition 1987, 9, :o2, 559702800 + tz.transition 1988, 3, :o3, 575427600 + tz.transition 1988, 9, :o2, 591152400 + tz.transition 1989, 3, :o3, 606877200 + tz.transition 1989, 9, :o2, 622602000 + tz.transition 1990, 3, :o3, 638326800 + tz.transition 1990, 9, :o2, 654656400 + tz.transition 1991, 3, :o3, 670381200 + tz.transition 1991, 9, :o2, 686106000 + tz.transition 1992, 3, :o3, 701830800 + tz.transition 1992, 9, :o2, 717555600 + tz.transition 1993, 3, :o3, 733280400 + tz.transition 1993, 9, :o2, 749005200 + tz.transition 1994, 3, :o3, 764730000 + tz.transition 1994, 9, :o2, 780454800 + tz.transition 1995, 3, :o3, 796179600 + tz.transition 1995, 9, :o2, 811904400 + tz.transition 1996, 3, :o3, 828234000 + tz.transition 1996, 10, :o2, 846378000 + tz.transition 1997, 3, :o3, 859683600 + tz.transition 1997, 10, :o2, 877827600 + tz.transition 1998, 3, :o3, 891133200 + tz.transition 1998, 10, :o2, 909277200 + tz.transition 1999, 3, :o3, 922582800 + tz.transition 1999, 10, :o2, 941331600 + tz.transition 2000, 3, :o3, 954032400 + tz.transition 2000, 10, :o2, 972781200 + tz.transition 2001, 3, :o3, 985482000 + tz.transition 2001, 10, :o2, 1004230800 + tz.transition 2002, 3, :o3, 1017536400 + tz.transition 2002, 10, :o2, 1035680400 + tz.transition 2003, 3, :o3, 1048986000 + tz.transition 2003, 10, :o2, 1067130000 + tz.transition 2004, 3, :o3, 1080435600 + tz.transition 2004, 10, :o2, 1099184400 + tz.transition 2005, 3, :o3, 1111885200 + tz.transition 2005, 10, :o2, 1130634000 + tz.transition 2006, 3, :o3, 1143334800 + tz.transition 2006, 10, :o2, 1162083600 + tz.transition 2007, 3, :o3, 1174784400 + tz.transition 2007, 10, :o2, 1193533200 + tz.transition 2008, 3, :o3, 1206838800 + tz.transition 2008, 10, :o2, 1224982800 + tz.transition 2009, 3, :o3, 1238288400 + tz.transition 2009, 10, :o2, 1256432400 + tz.transition 2010, 3, :o3, 1269738000 + tz.transition 2010, 10, :o2, 1288486800 + tz.transition 2011, 3, :o3, 1301187600 + tz.transition 2011, 10, :o2, 1319936400 + tz.transition 2012, 3, :o3, 1332637200 + tz.transition 2012, 10, :o2, 1351386000 + tz.transition 2013, 3, :o3, 1364691600 + tz.transition 2013, 10, :o2, 1382835600 + tz.transition 2014, 3, :o3, 1396141200 + tz.transition 2014, 10, :o2, 1414285200 + tz.transition 2015, 3, :o3, 1427590800 + tz.transition 2015, 10, :o2, 1445734800 + tz.transition 2016, 3, :o3, 1459040400 + tz.transition 2016, 10, :o2, 1477789200 + tz.transition 2017, 3, :o3, 1490490000 + tz.transition 2017, 10, :o2, 1509238800 + tz.transition 2018, 3, :o3, 1521939600 + tz.transition 2018, 10, :o2, 1540688400 + tz.transition 2019, 3, :o3, 1553994000 + tz.transition 2019, 10, :o2, 1572138000 + tz.transition 2020, 3, :o3, 1585443600 + tz.transition 2020, 10, :o2, 1603587600 + tz.transition 2021, 3, :o3, 1616893200 + tz.transition 2021, 10, :o2, 1635642000 + tz.transition 2022, 3, :o3, 1648342800 + tz.transition 2022, 10, :o2, 1667091600 + tz.transition 2023, 3, :o3, 1679792400 + tz.transition 2023, 10, :o2, 1698541200 + tz.transition 2024, 3, :o3, 1711846800 + tz.transition 2024, 10, :o2, 1729990800 + tz.transition 2025, 3, :o3, 1743296400 + tz.transition 2025, 10, :o2, 1761440400 + tz.transition 2026, 3, :o3, 1774746000 + tz.transition 2026, 10, :o2, 1792890000 + tz.transition 2027, 3, :o3, 1806195600 + tz.transition 2027, 10, :o2, 1824944400 + tz.transition 2028, 3, :o3, 1837645200 + tz.transition 2028, 10, :o2, 1856394000 + tz.transition 2029, 3, :o3, 1869094800 + tz.transition 2029, 10, :o2, 1887843600 + tz.transition 2030, 3, :o3, 1901149200 + tz.transition 2030, 10, :o2, 1919293200 + tz.transition 2031, 3, :o3, 1932598800 + tz.transition 2031, 10, :o2, 1950742800 + tz.transition 2032, 3, :o3, 1964048400 + tz.transition 2032, 10, :o2, 1982797200 + tz.transition 2033, 3, :o3, 1995498000 + tz.transition 2033, 10, :o2, 2014246800 + tz.transition 2034, 3, :o3, 2026947600 + tz.transition 2034, 10, :o2, 2045696400 + tz.transition 2035, 3, :o3, 2058397200 + tz.transition 2035, 10, :o2, 2077146000 + tz.transition 2036, 3, :o3, 2090451600 + tz.transition 2036, 10, :o2, 2108595600 + tz.transition 2037, 3, :o3, 2121901200 + tz.transition 2037, 10, :o2, 2140045200 + tz.transition 2038, 3, :o3, 2153350800, 59172253, 24 + tz.transition 2038, 10, :o2, 2172099600, 59177461, 24 + tz.transition 2039, 3, :o3, 2184800400, 59180989, 24 + tz.transition 2039, 10, :o2, 2203549200, 59186197, 24 + tz.transition 2040, 3, :o3, 2216250000, 59189725, 24 + tz.transition 2040, 10, :o2, 2234998800, 59194933, 24 + tz.transition 2041, 3, :o3, 2248304400, 59198629, 24 + tz.transition 2041, 10, :o2, 2266448400, 59203669, 24 + tz.transition 2042, 3, :o3, 2279754000, 59207365, 24 + tz.transition 2042, 10, :o2, 2297898000, 59212405, 24 + tz.transition 2043, 3, :o3, 2311203600, 59216101, 24 + tz.transition 2043, 10, :o2, 2329347600, 59221141, 24 + tz.transition 2044, 3, :o3, 2342653200, 59224837, 24 + tz.transition 2044, 10, :o2, 2361402000, 59230045, 24 + tz.transition 2045, 3, :o3, 2374102800, 59233573, 24 + tz.transition 2045, 10, :o2, 2392851600, 59238781, 24 + tz.transition 2046, 3, :o3, 2405552400, 59242309, 24 + tz.transition 2046, 10, :o2, 2424301200, 59247517, 24 + tz.transition 2047, 3, :o3, 2437606800, 59251213, 24 + tz.transition 2047, 10, :o2, 2455750800, 59256253, 24 + tz.transition 2048, 3, :o3, 2469056400, 59259949, 24 + tz.transition 2048, 10, :o2, 2487200400, 59264989, 24 + tz.transition 2049, 3, :o3, 2500506000, 59268685, 24 + tz.transition 2049, 10, :o2, 2519254800, 59273893, 24 + tz.transition 2050, 3, :o3, 2531955600, 59277421, 24 + tz.transition 2050, 10, :o2, 2550704400, 59282629, 24 + tz.transition 2051, 3, :o3, 2563405200, 59286157, 24 + tz.transition 2051, 10, :o2, 2582154000, 59291365, 24 + tz.transition 2052, 3, :o3, 2595459600, 59295061, 24 + tz.transition 2052, 10, :o2, 2613603600, 59300101, 24 + tz.transition 2053, 3, :o3, 2626909200, 59303797, 24 + tz.transition 2053, 10, :o2, 2645053200, 59308837, 24 + tz.transition 2054, 3, :o3, 2658358800, 59312533, 24 + tz.transition 2054, 10, :o2, 2676502800, 59317573, 24 + tz.transition 2055, 3, :o3, 2689808400, 59321269, 24 + tz.transition 2055, 10, :o2, 2708557200, 59326477, 24 + tz.transition 2056, 3, :o3, 2721258000, 59330005, 24 + tz.transition 2056, 10, :o2, 2740006800, 59335213, 24 + tz.transition 2057, 3, :o3, 2752707600, 59338741, 24 + tz.transition 2057, 10, :o2, 2771456400, 59343949, 24 + tz.transition 2058, 3, :o3, 2784762000, 59347645, 24 + tz.transition 2058, 10, :o2, 2802906000, 59352685, 24 + tz.transition 2059, 3, :o3, 2816211600, 59356381, 24 + tz.transition 2059, 10, :o2, 2834355600, 59361421, 24 + tz.transition 2060, 3, :o3, 2847661200, 59365117, 24 + tz.transition 2060, 10, :o2, 2866410000, 59370325, 24 + tz.transition 2061, 3, :o3, 2879110800, 59373853, 24 + tz.transition 2061, 10, :o2, 2897859600, 59379061, 24 + tz.transition 2062, 3, :o3, 2910560400, 59382589, 24 + tz.transition 2062, 10, :o2, 2929309200, 59387797, 24 + tz.transition 2063, 3, :o3, 2942010000, 59391325, 24 + tz.transition 2063, 10, :o2, 2960758800, 59396533, 24 + tz.transition 2064, 3, :o3, 2974064400, 59400229, 24 + tz.transition 2064, 10, :o2, 2992208400, 59405269, 24 + tz.transition 2065, 3, :o3, 3005514000, 59408965, 24 + tz.transition 2065, 10, :o2, 3023658000, 59414005, 24 + tz.transition 2066, 3, :o3, 3036963600, 59417701, 24 + tz.transition 2066, 10, :o2, 3055712400, 59422909, 24 + tz.transition 2067, 3, :o3, 3068413200, 59426437, 24 + tz.transition 2067, 10, :o2, 3087162000, 59431645, 24 + tz.transition 2068, 3, :o3, 3099862800, 59435173, 24 + tz.transition 2068, 10, :o2, 3118611600, 59440381, 24 + tz.transition 2069, 3, :o3, 3131917200, 59444077, 24 + tz.transition 2069, 10, :o2, 3150061200, 59449117, 24 + tz.transition 2070, 3, :o3, 3163366800, 59452813, 24 + tz.transition 2070, 10, :o2, 3181510800, 59457853, 24 + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/London.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/London.rb new file mode 100644 index 000000000000..942e0084aaf6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/London.rb @@ -0,0 +1,333 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module Europe + module London + include TimezoneDefinition + + timezone 'Europe/London' do |tz| + tz.offset :o0, -75, 0, :LMT + tz.offset :o1, 0, 0, :GMT + tz.offset :o2, 0, 3600, :BST + tz.offset :o3, 0, 7200, :BDST + tz.offset :o4, 3600, 0, :BST + + tz.transition 1847, 12, :o1, -3852662325, 2760187969, 1152 + tz.transition 1916, 5, :o2, -1691964000, 29052055, 12 + tz.transition 1916, 10, :o1, -1680472800, 29053651, 12 + tz.transition 1917, 4, :o2, -1664143200, 29055919, 12 + tz.transition 1917, 9, :o1, -1650146400, 29057863, 12 + tz.transition 1918, 3, :o2, -1633903200, 29060119, 12 + tz.transition 1918, 9, :o1, -1617487200, 29062399, 12 + tz.transition 1919, 3, :o2, -1601848800, 29064571, 12 + tz.transition 1919, 9, :o1, -1586037600, 29066767, 12 + tz.transition 1920, 3, :o2, -1570399200, 29068939, 12 + tz.transition 1920, 10, :o1, -1552168800, 29071471, 12 + tz.transition 1921, 4, :o2, -1538344800, 29073391, 12 + tz.transition 1921, 10, :o1, -1522533600, 29075587, 12 + tz.transition 1922, 3, :o2, -1507500000, 29077675, 12 + tz.transition 1922, 10, :o1, -1490565600, 29080027, 12 + tz.transition 1923, 4, :o2, -1473631200, 29082379, 12 + tz.transition 1923, 9, :o1, -1460930400, 29084143, 12 + tz.transition 1924, 4, :o2, -1442786400, 29086663, 12 + tz.transition 1924, 9, :o1, -1428876000, 29088595, 12 + tz.transition 1925, 4, :o2, -1410732000, 29091115, 12 + tz.transition 1925, 10, :o1, -1396216800, 29093131, 12 + tz.transition 1926, 4, :o2, -1379282400, 29095483, 12 + tz.transition 1926, 10, :o1, -1364767200, 29097499, 12 + tz.transition 1927, 4, :o2, -1348437600, 29099767, 12 + tz.transition 1927, 10, :o1, -1333317600, 29101867, 12 + tz.transition 1928, 4, :o2, -1315778400, 29104303, 12 + tz.transition 1928, 10, :o1, -1301263200, 29106319, 12 + tz.transition 1929, 4, :o2, -1284328800, 29108671, 12 + tz.transition 1929, 10, :o1, -1269813600, 29110687, 12 + tz.transition 1930, 4, :o2, -1253484000, 29112955, 12 + tz.transition 1930, 10, :o1, -1238364000, 29115055, 12 + tz.transition 1931, 4, :o2, -1221429600, 29117407, 12 + tz.transition 1931, 10, :o1, -1206914400, 29119423, 12 + tz.transition 1932, 4, :o2, -1189980000, 29121775, 12 + tz.transition 1932, 10, :o1, -1175464800, 29123791, 12 + tz.transition 1933, 4, :o2, -1159135200, 29126059, 12 + tz.transition 1933, 10, :o1, -1143410400, 29128243, 12 + tz.transition 1934, 4, :o2, -1126476000, 29130595, 12 + tz.transition 1934, 10, :o1, -1111960800, 29132611, 12 + tz.transition 1935, 4, :o2, -1095631200, 29134879, 12 + tz.transition 1935, 10, :o1, -1080511200, 29136979, 12 + tz.transition 1936, 4, :o2, -1063576800, 29139331, 12 + tz.transition 1936, 10, :o1, -1049061600, 29141347, 12 + tz.transition 1937, 4, :o2, -1032127200, 29143699, 12 + tz.transition 1937, 10, :o1, -1017612000, 29145715, 12 + tz.transition 1938, 4, :o2, -1001282400, 29147983, 12 + tz.transition 1938, 10, :o1, -986162400, 29150083, 12 + tz.transition 1939, 4, :o2, -969228000, 29152435, 12 + tz.transition 1939, 11, :o1, -950479200, 29155039, 12 + tz.transition 1940, 2, :o2, -942012000, 29156215, 12 + tz.transition 1941, 5, :o3, -904518000, 58322845, 24 + tz.transition 1941, 8, :o2, -896050800, 58325197, 24 + tz.transition 1942, 4, :o3, -875487600, 58330909, 24 + tz.transition 1942, 8, :o2, -864601200, 58333933, 24 + tz.transition 1943, 4, :o3, -844038000, 58339645, 24 + tz.transition 1943, 8, :o2, -832546800, 58342837, 24 + tz.transition 1944, 4, :o3, -812588400, 58348381, 24 + tz.transition 1944, 9, :o2, -798073200, 58352413, 24 + tz.transition 1945, 4, :o3, -781052400, 58357141, 24 + tz.transition 1945, 7, :o2, -772066800, 58359637, 24 + tz.transition 1945, 10, :o1, -764805600, 29180827, 12 + tz.transition 1946, 4, :o2, -748476000, 29183095, 12 + tz.transition 1946, 10, :o1, -733356000, 29185195, 12 + tz.transition 1947, 3, :o2, -719445600, 29187127, 12 + tz.transition 1947, 4, :o3, -717030000, 58374925, 24 + tz.transition 1947, 8, :o2, -706748400, 58377781, 24 + tz.transition 1947, 11, :o1, -699487200, 29189899, 12 + tz.transition 1948, 3, :o2, -687996000, 29191495, 12 + tz.transition 1948, 10, :o1, -668037600, 29194267, 12 + tz.transition 1949, 4, :o2, -654732000, 29196115, 12 + tz.transition 1949, 10, :o1, -636588000, 29198635, 12 + tz.transition 1950, 4, :o2, -622072800, 29200651, 12 + tz.transition 1950, 10, :o1, -605743200, 29202919, 12 + tz.transition 1951, 4, :o2, -590623200, 29205019, 12 + tz.transition 1951, 10, :o1, -574293600, 29207287, 12 + tz.transition 1952, 4, :o2, -558568800, 29209471, 12 + tz.transition 1952, 10, :o1, -542239200, 29211739, 12 + tz.transition 1953, 4, :o2, -527119200, 29213839, 12 + tz.transition 1953, 10, :o1, -512604000, 29215855, 12 + tz.transition 1954, 4, :o2, -496274400, 29218123, 12 + tz.transition 1954, 10, :o1, -481154400, 29220223, 12 + tz.transition 1955, 4, :o2, -464220000, 29222575, 12 + tz.transition 1955, 10, :o1, -449704800, 29224591, 12 + tz.transition 1956, 4, :o2, -432165600, 29227027, 12 + tz.transition 1956, 10, :o1, -417650400, 29229043, 12 + tz.transition 1957, 4, :o2, -401320800, 29231311, 12 + tz.transition 1957, 10, :o1, -386200800, 29233411, 12 + tz.transition 1958, 4, :o2, -369266400, 29235763, 12 + tz.transition 1958, 10, :o1, -354751200, 29237779, 12 + tz.transition 1959, 4, :o2, -337816800, 29240131, 12 + tz.transition 1959, 10, :o1, -323301600, 29242147, 12 + tz.transition 1960, 4, :o2, -306972000, 29244415, 12 + tz.transition 1960, 10, :o1, -291852000, 29246515, 12 + tz.transition 1961, 3, :o2, -276732000, 29248615, 12 + tz.transition 1961, 10, :o1, -257983200, 29251219, 12 + tz.transition 1962, 3, :o2, -245282400, 29252983, 12 + tz.transition 1962, 10, :o1, -226533600, 29255587, 12 + tz.transition 1963, 3, :o2, -213228000, 29257435, 12 + tz.transition 1963, 10, :o1, -195084000, 29259955, 12 + tz.transition 1964, 3, :o2, -182383200, 29261719, 12 + tz.transition 1964, 10, :o1, -163634400, 29264323, 12 + tz.transition 1965, 3, :o2, -150933600, 29266087, 12 + tz.transition 1965, 10, :o1, -132184800, 29268691, 12 + tz.transition 1966, 3, :o2, -119484000, 29270455, 12 + tz.transition 1966, 10, :o1, -100735200, 29273059, 12 + tz.transition 1967, 3, :o2, -88034400, 29274823, 12 + tz.transition 1967, 10, :o1, -68680800, 29277511, 12 + tz.transition 1968, 2, :o2, -59004000, 29278855, 12 + tz.transition 1968, 10, :o4, -37242000, 58563755, 24 + tz.transition 1971, 10, :o1, 57722400 + tz.transition 1972, 3, :o2, 69818400 + tz.transition 1972, 10, :o1, 89172000 + tz.transition 1973, 3, :o2, 101268000 + tz.transition 1973, 10, :o1, 120621600 + tz.transition 1974, 3, :o2, 132717600 + tz.transition 1974, 10, :o1, 152071200 + tz.transition 1975, 3, :o2, 164167200 + tz.transition 1975, 10, :o1, 183520800 + tz.transition 1976, 3, :o2, 196221600 + tz.transition 1976, 10, :o1, 214970400 + tz.transition 1977, 3, :o2, 227671200 + tz.transition 1977, 10, :o1, 246420000 + tz.transition 1978, 3, :o2, 259120800 + tz.transition 1978, 10, :o1, 278474400 + tz.transition 1979, 3, :o2, 290570400 + tz.transition 1979, 10, :o1, 309924000 + tz.transition 1980, 3, :o2, 322020000 + tz.transition 1980, 10, :o1, 341373600 + tz.transition 1981, 3, :o2, 354675600 + tz.transition 1981, 10, :o1, 372819600 + tz.transition 1982, 3, :o2, 386125200 + tz.transition 1982, 10, :o1, 404269200 + tz.transition 1983, 3, :o2, 417574800 + tz.transition 1983, 10, :o1, 435718800 + tz.transition 1984, 3, :o2, 449024400 + tz.transition 1984, 10, :o1, 467773200 + tz.transition 1985, 3, :o2, 481078800 + tz.transition 1985, 10, :o1, 499222800 + tz.transition 1986, 3, :o2, 512528400 + tz.transition 1986, 10, :o1, 530672400 + tz.transition 1987, 3, :o2, 543978000 + tz.transition 1987, 10, :o1, 562122000 + tz.transition 1988, 3, :o2, 575427600 + tz.transition 1988, 10, :o1, 593571600 + tz.transition 1989, 3, :o2, 606877200 + tz.transition 1989, 10, :o1, 625626000 + tz.transition 1990, 3, :o2, 638326800 + tz.transition 1990, 10, :o1, 657075600 + tz.transition 1991, 3, :o2, 670381200 + tz.transition 1991, 10, :o1, 688525200 + tz.transition 1992, 3, :o2, 701830800 + tz.transition 1992, 10, :o1, 719974800 + tz.transition 1993, 3, :o2, 733280400 + tz.transition 1993, 10, :o1, 751424400 + tz.transition 1994, 3, :o2, 764730000 + tz.transition 1994, 10, :o1, 782874000 + tz.transition 1995, 3, :o2, 796179600 + tz.transition 1995, 10, :o1, 814323600 + tz.transition 1996, 3, :o2, 828234000 + tz.transition 1996, 10, :o1, 846378000 + tz.transition 1997, 3, :o2, 859683600 + tz.transition 1997, 10, :o1, 877827600 + tz.transition 1998, 3, :o2, 891133200 + tz.transition 1998, 10, :o1, 909277200 + tz.transition 1999, 3, :o2, 922582800 + tz.transition 1999, 10, :o1, 941331600 + tz.transition 2000, 3, :o2, 954032400 + tz.transition 2000, 10, :o1, 972781200 + tz.transition 2001, 3, :o2, 985482000 + tz.transition 2001, 10, :o1, 1004230800 + tz.transition 2002, 3, :o2, 1017536400 + tz.transition 2002, 10, :o1, 1035680400 + tz.transition 2003, 3, :o2, 1048986000 + tz.transition 2003, 10, :o1, 1067130000 + tz.transition 2004, 3, :o2, 1080435600 + tz.transition 2004, 10, :o1, 1099184400 + tz.transition 2005, 3, :o2, 1111885200 + tz.transition 2005, 10, :o1, 1130634000 + tz.transition 2006, 3, :o2, 1143334800 + tz.transition 2006, 10, :o1, 1162083600 + tz.transition 2007, 3, :o2, 1174784400 + tz.transition 2007, 10, :o1, 1193533200 + tz.transition 2008, 3, :o2, 1206838800 + tz.transition 2008, 10, :o1, 1224982800 + tz.transition 2009, 3, :o2, 1238288400 + tz.transition 2009, 10, :o1, 1256432400 + tz.transition 2010, 3, :o2, 1269738000 + tz.transition 2010, 10, :o1, 1288486800 + tz.transition 2011, 3, :o2, 1301187600 + tz.transition 2011, 10, :o1, 1319936400 + tz.transition 2012, 3, :o2, 1332637200 + tz.transition 2012, 10, :o1, 1351386000 + tz.transition 2013, 3, :o2, 1364691600 + tz.transition 2013, 10, :o1, 1382835600 + tz.transition 2014, 3, :o2, 1396141200 + tz.transition 2014, 10, :o1, 1414285200 + tz.transition 2015, 3, :o2, 1427590800 + tz.transition 2015, 10, :o1, 1445734800 + tz.transition 2016, 3, :o2, 1459040400 + tz.transition 2016, 10, :o1, 1477789200 + tz.transition 2017, 3, :o2, 1490490000 + tz.transition 2017, 10, :o1, 1509238800 + tz.transition 2018, 3, :o2, 1521939600 + tz.transition 2018, 10, :o1, 1540688400 + tz.transition 2019, 3, :o2, 1553994000 + tz.transition 2019, 10, :o1, 1572138000 + tz.transition 2020, 3, :o2, 1585443600 + tz.transition 2020, 10, :o1, 1603587600 + tz.transition 2021, 3, :o2, 1616893200 + tz.transition 2021, 10, :o1, 1635642000 + tz.transition 2022, 3, :o2, 1648342800 + tz.transition 2022, 10, :o1, 1667091600 + tz.transition 2023, 3, :o2, 1679792400 + tz.transition 2023, 10, :o1, 1698541200 + tz.transition 2024, 3, :o2, 1711846800 + tz.transition 2024, 10, :o1, 1729990800 + tz.transition 2025, 3, :o2, 1743296400 + tz.transition 2025, 10, :o1, 1761440400 + tz.transition 2026, 3, :o2, 1774746000 + tz.transition 2026, 10, :o1, 1792890000 + tz.transition 2027, 3, :o2, 1806195600 + tz.transition 2027, 10, :o1, 1824944400 + tz.transition 2028, 3, :o2, 1837645200 + tz.transition 2028, 10, :o1, 1856394000 + tz.transition 2029, 3, :o2, 1869094800 + tz.transition 2029, 10, :o1, 1887843600 + tz.transition 2030, 3, :o2, 1901149200 + tz.transition 2030, 10, :o1, 1919293200 + tz.transition 2031, 3, :o2, 1932598800 + tz.transition 2031, 10, :o1, 1950742800 + tz.transition 2032, 3, :o2, 1964048400 + tz.transition 2032, 10, :o1, 1982797200 + tz.transition 2033, 3, :o2, 1995498000 + tz.transition 2033, 10, :o1, 2014246800 + tz.transition 2034, 3, :o2, 2026947600 + tz.transition 2034, 10, :o1, 2045696400 + tz.transition 2035, 3, :o2, 2058397200 + tz.transition 2035, 10, :o1, 2077146000 + tz.transition 2036, 3, :o2, 2090451600 + tz.transition 2036, 10, :o1, 2108595600 + tz.transition 2037, 3, :o2, 2121901200 + tz.transition 2037, 10, :o1, 2140045200 + tz.transition 2038, 3, :o2, 2153350800, 59172253, 24 + tz.transition 2038, 10, :o1, 2172099600, 59177461, 24 + tz.transition 2039, 3, :o2, 2184800400, 59180989, 24 + tz.transition 2039, 10, :o1, 2203549200, 59186197, 24 + tz.transition 2040, 3, :o2, 2216250000, 59189725, 24 + tz.transition 2040, 10, :o1, 2234998800, 59194933, 24 + tz.transition 2041, 3, :o2, 2248304400, 59198629, 24 + tz.transition 2041, 10, :o1, 2266448400, 59203669, 24 + tz.transition 2042, 3, :o2, 2279754000, 59207365, 24 + tz.transition 2042, 10, :o1, 2297898000, 59212405, 24 + tz.transition 2043, 3, :o2, 2311203600, 59216101, 24 + tz.transition 2043, 10, :o1, 2329347600, 59221141, 24 + tz.transition 2044, 3, :o2, 2342653200, 59224837, 24 + tz.transition 2044, 10, :o1, 2361402000, 59230045, 24 + tz.transition 2045, 3, :o2, 2374102800, 59233573, 24 + tz.transition 2045, 10, :o1, 2392851600, 59238781, 24 + tz.transition 2046, 3, :o2, 2405552400, 59242309, 24 + tz.transition 2046, 10, :o1, 2424301200, 59247517, 24 + tz.transition 2047, 3, :o2, 2437606800, 59251213, 24 + tz.transition 2047, 10, :o1, 2455750800, 59256253, 24 + tz.transition 2048, 3, :o2, 2469056400, 59259949, 24 + tz.transition 2048, 10, :o1, 2487200400, 59264989, 24 + tz.transition 2049, 3, :o2, 2500506000, 59268685, 24 + tz.transition 2049, 10, :o1, 2519254800, 59273893, 24 + tz.transition 2050, 3, :o2, 2531955600, 59277421, 24 + tz.transition 2050, 10, :o1, 2550704400, 59282629, 24 + tz.transition 2051, 3, :o2, 2563405200, 59286157, 24 + tz.transition 2051, 10, :o1, 2582154000, 59291365, 24 + tz.transition 2052, 3, :o2, 2595459600, 59295061, 24 + tz.transition 2052, 10, :o1, 2613603600, 59300101, 24 + tz.transition 2053, 3, :o2, 2626909200, 59303797, 24 + tz.transition 2053, 10, :o1, 2645053200, 59308837, 24 + tz.transition 2054, 3, :o2, 2658358800, 59312533, 24 + tz.transition 2054, 10, :o1, 2676502800, 59317573, 24 + tz.transition 2055, 3, :o2, 2689808400, 59321269, 24 + tz.transition 2055, 10, :o1, 2708557200, 59326477, 24 + tz.transition 2056, 3, :o2, 2721258000, 59330005, 24 + tz.transition 2056, 10, :o1, 2740006800, 59335213, 24 + tz.transition 2057, 3, :o2, 2752707600, 59338741, 24 + tz.transition 2057, 10, :o1, 2771456400, 59343949, 24 + tz.transition 2058, 3, :o2, 2784762000, 59347645, 24 + tz.transition 2058, 10, :o1, 2802906000, 59352685, 24 + tz.transition 2059, 3, :o2, 2816211600, 59356381, 24 + tz.transition 2059, 10, :o1, 2834355600, 59361421, 24 + tz.transition 2060, 3, :o2, 2847661200, 59365117, 24 + tz.transition 2060, 10, :o1, 2866410000, 59370325, 24 + tz.transition 2061, 3, :o2, 2879110800, 59373853, 24 + tz.transition 2061, 10, :o1, 2897859600, 59379061, 24 + tz.transition 2062, 3, :o2, 2910560400, 59382589, 24 + tz.transition 2062, 10, :o1, 2929309200, 59387797, 24 + tz.transition 2063, 3, :o2, 2942010000, 59391325, 24 + tz.transition 2063, 10, :o1, 2960758800, 59396533, 24 + tz.transition 2064, 3, :o2, 2974064400, 59400229, 24 + tz.transition 2064, 10, :o1, 2992208400, 59405269, 24 + tz.transition 2065, 3, :o2, 3005514000, 59408965, 24 + tz.transition 2065, 10, :o1, 3023658000, 59414005, 24 + tz.transition 2066, 3, :o2, 3036963600, 59417701, 24 + tz.transition 2066, 10, :o1, 3055712400, 59422909, 24 + tz.transition 2067, 3, :o2, 3068413200, 59426437, 24 + tz.transition 2067, 10, :o1, 3087162000, 59431645, 24 + tz.transition 2068, 3, :o2, 3099862800, 59435173, 24 + tz.transition 2068, 10, :o1, 3118611600, 59440381, 24 + tz.transition 2069, 3, :o2, 3131917200, 59444077, 24 + tz.transition 2069, 10, :o1, 3150061200, 59449117, 24 + tz.transition 2070, 3, :o2, 3163366800, 59452813, 24 + tz.transition 2070, 10, :o1, 3181510800, 59457853, 24 + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Paris.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Paris.rb new file mode 100644 index 000000000000..e16ba37e3d4c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Paris.rb @@ -0,0 +1,277 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module Europe + module Paris + include TimezoneDefinition + + timezone 'Europe/Paris' do |tz| + tz.offset :o0, 561, 0, :LMT + tz.offset :o1, 561, 0, :PMT + tz.offset :o2, 0, 0, :WET + tz.offset :o3, 0, 3600, :WEST + tz.offset :o4, 3600, 3600, :CEST + tz.offset :o5, 3600, 0, :CET + tz.offset :o6, 0, 7200, :WEMT + + tz.transition 1891, 3, :o1, -2486592561, 69460055813, 28800 + tz.transition 1911, 3, :o2, -1855958961, 69670267013, 28800 + tz.transition 1916, 6, :o3, -1689814800, 58104707, 24 + tz.transition 1916, 10, :o2, -1680397200, 58107323, 24 + tz.transition 1917, 3, :o3, -1665363600, 58111499, 24 + tz.transition 1917, 10, :o2, -1648342800, 58116227, 24 + tz.transition 1918, 3, :o3, -1635123600, 58119899, 24 + tz.transition 1918, 10, :o2, -1616893200, 58124963, 24 + tz.transition 1919, 3, :o3, -1604278800, 58128467, 24 + tz.transition 1919, 10, :o2, -1585443600, 58133699, 24 + tz.transition 1920, 2, :o3, -1574038800, 58136867, 24 + tz.transition 1920, 10, :o2, -1552266000, 58142915, 24 + tz.transition 1921, 3, :o3, -1539997200, 58146323, 24 + tz.transition 1921, 10, :o2, -1520557200, 58151723, 24 + tz.transition 1922, 3, :o3, -1507510800, 58155347, 24 + tz.transition 1922, 10, :o2, -1490576400, 58160051, 24 + tz.transition 1923, 5, :o3, -1470618000, 58165595, 24 + tz.transition 1923, 10, :o2, -1459126800, 58168787, 24 + tz.transition 1924, 3, :o3, -1444006800, 58172987, 24 + tz.transition 1924, 10, :o2, -1427677200, 58177523, 24 + tz.transition 1925, 4, :o3, -1411952400, 58181891, 24 + tz.transition 1925, 10, :o2, -1396227600, 58186259, 24 + tz.transition 1926, 4, :o3, -1379293200, 58190963, 24 + tz.transition 1926, 10, :o2, -1364778000, 58194995, 24 + tz.transition 1927, 4, :o3, -1348448400, 58199531, 24 + tz.transition 1927, 10, :o2, -1333328400, 58203731, 24 + tz.transition 1928, 4, :o3, -1316394000, 58208435, 24 + tz.transition 1928, 10, :o2, -1301274000, 58212635, 24 + tz.transition 1929, 4, :o3, -1284339600, 58217339, 24 + tz.transition 1929, 10, :o2, -1269824400, 58221371, 24 + tz.transition 1930, 4, :o3, -1253494800, 58225907, 24 + tz.transition 1930, 10, :o2, -1238374800, 58230107, 24 + tz.transition 1931, 4, :o3, -1221440400, 58234811, 24 + tz.transition 1931, 10, :o2, -1206925200, 58238843, 24 + tz.transition 1932, 4, :o3, -1191200400, 58243211, 24 + tz.transition 1932, 10, :o2, -1175475600, 58247579, 24 + tz.transition 1933, 3, :o3, -1160355600, 58251779, 24 + tz.transition 1933, 10, :o2, -1143421200, 58256483, 24 + tz.transition 1934, 4, :o3, -1127696400, 58260851, 24 + tz.transition 1934, 10, :o2, -1111971600, 58265219, 24 + tz.transition 1935, 3, :o3, -1096851600, 58269419, 24 + tz.transition 1935, 10, :o2, -1080522000, 58273955, 24 + tz.transition 1936, 4, :o3, -1063587600, 58278659, 24 + tz.transition 1936, 10, :o2, -1049072400, 58282691, 24 + tz.transition 1937, 4, :o3, -1033347600, 58287059, 24 + tz.transition 1937, 10, :o2, -1017622800, 58291427, 24 + tz.transition 1938, 3, :o3, -1002502800, 58295627, 24 + tz.transition 1938, 10, :o2, -986173200, 58300163, 24 + tz.transition 1939, 4, :o3, -969238800, 58304867, 24 + tz.transition 1939, 11, :o2, -950490000, 58310075, 24 + tz.transition 1940, 2, :o3, -942012000, 29156215, 12 + tz.transition 1940, 6, :o4, -932436000, 29157545, 12 + tz.transition 1942, 11, :o5, -857257200, 58335973, 24 + tz.transition 1943, 3, :o4, -844556400, 58339501, 24 + tz.transition 1943, 10, :o5, -828226800, 58344037, 24 + tz.transition 1944, 4, :o4, -812502000, 58348405, 24 + tz.transition 1944, 8, :o6, -800071200, 29175929, 12 + tz.transition 1944, 10, :o3, -796266000, 58352915, 24 + tz.transition 1945, 4, :o6, -781052400, 58357141, 24 + tz.transition 1945, 9, :o5, -766623600, 58361149, 24 + tz.transition 1976, 3, :o4, 196819200 + tz.transition 1976, 9, :o5, 212540400 + tz.transition 1977, 4, :o4, 228877200 + tz.transition 1977, 9, :o5, 243997200 + tz.transition 1978, 4, :o4, 260326800 + tz.transition 1978, 10, :o5, 276051600 + tz.transition 1979, 4, :o4, 291776400 + tz.transition 1979, 9, :o5, 307501200 + tz.transition 1980, 4, :o4, 323830800 + tz.transition 1980, 9, :o5, 338950800 + tz.transition 1981, 3, :o4, 354675600 + tz.transition 1981, 9, :o5, 370400400 + tz.transition 1982, 3, :o4, 386125200 + tz.transition 1982, 9, :o5, 401850000 + tz.transition 1983, 3, :o4, 417574800 + tz.transition 1983, 9, :o5, 433299600 + tz.transition 1984, 3, :o4, 449024400 + tz.transition 1984, 9, :o5, 465354000 + tz.transition 1985, 3, :o4, 481078800 + tz.transition 1985, 9, :o5, 496803600 + tz.transition 1986, 3, :o4, 512528400 + tz.transition 1986, 9, :o5, 528253200 + tz.transition 1987, 3, :o4, 543978000 + tz.transition 1987, 9, :o5, 559702800 + tz.transition 1988, 3, :o4, 575427600 + tz.transition 1988, 9, :o5, 591152400 + tz.transition 1989, 3, :o4, 606877200 + tz.transition 1989, 9, :o5, 622602000 + tz.transition 1990, 3, :o4, 638326800 + tz.transition 1990, 9, :o5, 654656400 + tz.transition 1991, 3, :o4, 670381200 + tz.transition 1991, 9, :o5, 686106000 + tz.transition 1992, 3, :o4, 701830800 + tz.transition 1992, 9, :o5, 717555600 + tz.transition 1993, 3, :o4, 733280400 + tz.transition 1993, 9, :o5, 749005200 + tz.transition 1994, 3, :o4, 764730000 + tz.transition 1994, 9, :o5, 780454800 + tz.transition 1995, 3, :o4, 796179600 + tz.transition 1995, 9, :o5, 811904400 + tz.transition 1996, 3, :o4, 828234000 + tz.transition 1996, 10, :o5, 846378000 + tz.transition 1997, 3, :o4, 859683600 + tz.transition 1997, 10, :o5, 877827600 + tz.transition 1998, 3, :o4, 891133200 + tz.transition 1998, 10, :o5, 909277200 + tz.transition 1999, 3, :o4, 922582800 + tz.transition 1999, 10, :o5, 941331600 + tz.transition 2000, 3, :o4, 954032400 + tz.transition 2000, 10, :o5, 972781200 + tz.transition 2001, 3, :o4, 985482000 + tz.transition 2001, 10, :o5, 1004230800 + tz.transition 2002, 3, :o4, 1017536400 + tz.transition 2002, 10, :o5, 1035680400 + tz.transition 2003, 3, :o4, 1048986000 + tz.transition 2003, 10, :o5, 1067130000 + tz.transition 2004, 3, :o4, 1080435600 + tz.transition 2004, 10, :o5, 1099184400 + tz.transition 2005, 3, :o4, 1111885200 + tz.transition 2005, 10, :o5, 1130634000 + tz.transition 2006, 3, :o4, 1143334800 + tz.transition 2006, 10, :o5, 1162083600 + tz.transition 2007, 3, :o4, 1174784400 + tz.transition 2007, 10, :o5, 1193533200 + tz.transition 2008, 3, :o4, 1206838800 + tz.transition 2008, 10, :o5, 1224982800 + tz.transition 2009, 3, :o4, 1238288400 + tz.transition 2009, 10, :o5, 1256432400 + tz.transition 2010, 3, :o4, 1269738000 + tz.transition 2010, 10, :o5, 1288486800 + tz.transition 2011, 3, :o4, 1301187600 + tz.transition 2011, 10, :o5, 1319936400 + tz.transition 2012, 3, :o4, 1332637200 + tz.transition 2012, 10, :o5, 1351386000 + tz.transition 2013, 3, :o4, 1364691600 + tz.transition 2013, 10, :o5, 1382835600 + tz.transition 2014, 3, :o4, 1396141200 + tz.transition 2014, 10, :o5, 1414285200 + tz.transition 2015, 3, :o4, 1427590800 + tz.transition 2015, 10, :o5, 1445734800 + tz.transition 2016, 3, :o4, 1459040400 + tz.transition 2016, 10, :o5, 1477789200 + tz.transition 2017, 3, :o4, 1490490000 + tz.transition 2017, 10, :o5, 1509238800 + tz.transition 2018, 3, :o4, 1521939600 + tz.transition 2018, 10, :o5, 1540688400 + tz.transition 2019, 3, :o4, 1553994000 + tz.transition 2019, 10, :o5, 1572138000 + tz.transition 2020, 3, :o4, 1585443600 + tz.transition 2020, 10, :o5, 1603587600 + tz.transition 2021, 3, :o4, 1616893200 + tz.transition 2021, 10, :o5, 1635642000 + tz.transition 2022, 3, :o4, 1648342800 + tz.transition 2022, 10, :o5, 1667091600 + tz.transition 2023, 3, :o4, 1679792400 + tz.transition 2023, 10, :o5, 1698541200 + tz.transition 2024, 3, :o4, 1711846800 + tz.transition 2024, 10, :o5, 1729990800 + tz.transition 2025, 3, :o4, 1743296400 + tz.transition 2025, 10, :o5, 1761440400 + tz.transition 2026, 3, :o4, 1774746000 + tz.transition 2026, 10, :o5, 1792890000 + tz.transition 2027, 3, :o4, 1806195600 + tz.transition 2027, 10, :o5, 1824944400 + tz.transition 2028, 3, :o4, 1837645200 + tz.transition 2028, 10, :o5, 1856394000 + tz.transition 2029, 3, :o4, 1869094800 + tz.transition 2029, 10, :o5, 1887843600 + tz.transition 2030, 3, :o4, 1901149200 + tz.transition 2030, 10, :o5, 1919293200 + tz.transition 2031, 3, :o4, 1932598800 + tz.transition 2031, 10, :o5, 1950742800 + tz.transition 2032, 3, :o4, 1964048400 + tz.transition 2032, 10, :o5, 1982797200 + tz.transition 2033, 3, :o4, 1995498000 + tz.transition 2033, 10, :o5, 2014246800 + tz.transition 2034, 3, :o4, 2026947600 + tz.transition 2034, 10, :o5, 2045696400 + tz.transition 2035, 3, :o4, 2058397200 + tz.transition 2035, 10, :o5, 2077146000 + tz.transition 2036, 3, :o4, 2090451600 + tz.transition 2036, 10, :o5, 2108595600 + tz.transition 2037, 3, :o4, 2121901200 + tz.transition 2037, 10, :o5, 2140045200 + tz.transition 2038, 3, :o4, 2153350800, 59172253, 24 + tz.transition 2038, 10, :o5, 2172099600, 59177461, 24 + tz.transition 2039, 3, :o4, 2184800400, 59180989, 24 + tz.transition 2039, 10, :o5, 2203549200, 59186197, 24 + tz.transition 2040, 3, :o4, 2216250000, 59189725, 24 + tz.transition 2040, 10, :o5, 2234998800, 59194933, 24 + tz.transition 2041, 3, :o4, 2248304400, 59198629, 24 + tz.transition 2041, 10, :o5, 2266448400, 59203669, 24 + tz.transition 2042, 3, :o4, 2279754000, 59207365, 24 + tz.transition 2042, 10, :o5, 2297898000, 59212405, 24 + tz.transition 2043, 3, :o4, 2311203600, 59216101, 24 + tz.transition 2043, 10, :o5, 2329347600, 59221141, 24 + tz.transition 2044, 3, :o4, 2342653200, 59224837, 24 + tz.transition 2044, 10, :o5, 2361402000, 59230045, 24 + tz.transition 2045, 3, :o4, 2374102800, 59233573, 24 + tz.transition 2045, 10, :o5, 2392851600, 59238781, 24 + tz.transition 2046, 3, :o4, 2405552400, 59242309, 24 + tz.transition 2046, 10, :o5, 2424301200, 59247517, 24 + tz.transition 2047, 3, :o4, 2437606800, 59251213, 24 + tz.transition 2047, 10, :o5, 2455750800, 59256253, 24 + tz.transition 2048, 3, :o4, 2469056400, 59259949, 24 + tz.transition 2048, 10, :o5, 2487200400, 59264989, 24 + tz.transition 2049, 3, :o4, 2500506000, 59268685, 24 + tz.transition 2049, 10, :o5, 2519254800, 59273893, 24 + tz.transition 2050, 3, :o4, 2531955600, 59277421, 24 + tz.transition 2050, 10, :o5, 2550704400, 59282629, 24 + tz.transition 2051, 3, :o4, 2563405200, 59286157, 24 + tz.transition 2051, 10, :o5, 2582154000, 59291365, 24 + tz.transition 2052, 3, :o4, 2595459600, 59295061, 24 + tz.transition 2052, 10, :o5, 2613603600, 59300101, 24 + tz.transition 2053, 3, :o4, 2626909200, 59303797, 24 + tz.transition 2053, 10, :o5, 2645053200, 59308837, 24 + tz.transition 2054, 3, :o4, 2658358800, 59312533, 24 + tz.transition 2054, 10, :o5, 2676502800, 59317573, 24 + tz.transition 2055, 3, :o4, 2689808400, 59321269, 24 + tz.transition 2055, 10, :o5, 2708557200, 59326477, 24 + tz.transition 2056, 3, :o4, 2721258000, 59330005, 24 + tz.transition 2056, 10, :o5, 2740006800, 59335213, 24 + tz.transition 2057, 3, :o4, 2752707600, 59338741, 24 + tz.transition 2057, 10, :o5, 2771456400, 59343949, 24 + tz.transition 2058, 3, :o4, 2784762000, 59347645, 24 + tz.transition 2058, 10, :o5, 2802906000, 59352685, 24 + tz.transition 2059, 3, :o4, 2816211600, 59356381, 24 + tz.transition 2059, 10, :o5, 2834355600, 59361421, 24 + tz.transition 2060, 3, :o4, 2847661200, 59365117, 24 + tz.transition 2060, 10, :o5, 2866410000, 59370325, 24 + tz.transition 2061, 3, :o4, 2879110800, 59373853, 24 + tz.transition 2061, 10, :o5, 2897859600, 59379061, 24 + tz.transition 2062, 3, :o4, 2910560400, 59382589, 24 + tz.transition 2062, 10, :o5, 2929309200, 59387797, 24 + tz.transition 2063, 3, :o4, 2942010000, 59391325, 24 + tz.transition 2063, 10, :o5, 2960758800, 59396533, 24 + tz.transition 2064, 3, :o4, 2974064400, 59400229, 24 + tz.transition 2064, 10, :o5, 2992208400, 59405269, 24 + tz.transition 2065, 3, :o4, 3005514000, 59408965, 24 + tz.transition 2065, 10, :o5, 3023658000, 59414005, 24 + tz.transition 2066, 3, :o4, 3036963600, 59417701, 24 + tz.transition 2066, 10, :o5, 3055712400, 59422909, 24 + tz.transition 2067, 3, :o4, 3068413200, 59426437, 24 + tz.transition 2067, 10, :o5, 3087162000, 59431645, 24 + tz.transition 2068, 3, :o4, 3099862800, 59435173, 24 + tz.transition 2068, 10, :o5, 3118611600, 59440381, 24 + tz.transition 2069, 3, :o4, 3131917200, 59444077, 24 + tz.transition 2069, 10, :o5, 3150061200, 59449117, 24 + tz.transition 2070, 3, :o4, 3163366800, 59452813, 24 + tz.transition 2070, 10, :o5, 3181510800, 59457853, 24 + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Prague.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Prague.rb new file mode 100644 index 000000000000..9db42087c6d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/Europe/Prague.rb @@ -0,0 +1,235 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module Europe + module Prague + include TimezoneDefinition + + timezone 'Europe/Prague' do |tz| + tz.offset :o0, 3464, 0, :LMT + tz.offset :o1, 3464, 0, :PMT + tz.offset :o2, 3600, 0, :CET + tz.offset :o3, 3600, 3600, :CEST + tz.offset :o4, 3600, -3600, :GMT + + tz.transition 1849, 12, :o1, -3786829064, 25884991367, 10800 + tz.transition 1891, 9, :o2, -2469401864, 26049669767, 10800 + tz.transition 1916, 4, :o3, -1693706400, 29051813, 12 + tz.transition 1916, 9, :o2, -1680483600, 58107299, 24 + tz.transition 1917, 4, :o3, -1663455600, 58112029, 24 + tz.transition 1917, 9, :o2, -1650150000, 58115725, 24 + tz.transition 1918, 4, :o3, -1632006000, 58120765, 24 + tz.transition 1918, 9, :o2, -1618700400, 58124461, 24 + tz.transition 1940, 4, :o3, -938905200, 58313293, 24 + tz.transition 1942, 11, :o2, -857257200, 58335973, 24 + tz.transition 1943, 3, :o3, -844556400, 58339501, 24 + tz.transition 1943, 10, :o2, -828226800, 58344037, 24 + tz.transition 1944, 4, :o3, -812502000, 58348405, 24 + tz.transition 1944, 10, :o2, -796777200, 58352773, 24 + tz.transition 1945, 4, :o3, -781052400, 58357141, 24 + tz.transition 1945, 10, :o2, -765327600, 58361509, 24 + tz.transition 1946, 5, :o3, -746578800, 58366717, 24 + tz.transition 1946, 10, :o2, -733359600, 58370389, 24 + tz.transition 1946, 12, :o4, -728517600, 29185867, 12 + tz.transition 1947, 2, :o2, -721260000, 29186875, 12 + tz.transition 1947, 4, :o3, -716425200, 58375093, 24 + tz.transition 1947, 10, :o2, -701910000, 58379125, 24 + tz.transition 1948, 4, :o3, -684975600, 58383829, 24 + tz.transition 1948, 10, :o2, -670460400, 58387861, 24 + tz.transition 1949, 4, :o3, -654217200, 58392373, 24 + tz.transition 1949, 10, :o2, -639010800, 58396597, 24 + tz.transition 1979, 4, :o3, 291776400 + tz.transition 1979, 9, :o2, 307501200 + tz.transition 1980, 4, :o3, 323830800 + tz.transition 1980, 9, :o2, 338950800 + tz.transition 1981, 3, :o3, 354675600 + tz.transition 1981, 9, :o2, 370400400 + tz.transition 1982, 3, :o3, 386125200 + tz.transition 1982, 9, :o2, 401850000 + tz.transition 1983, 3, :o3, 417574800 + tz.transition 1983, 9, :o2, 433299600 + tz.transition 1984, 3, :o3, 449024400 + tz.transition 1984, 9, :o2, 465354000 + tz.transition 1985, 3, :o3, 481078800 + tz.transition 1985, 9, :o2, 496803600 + tz.transition 1986, 3, :o3, 512528400 + tz.transition 1986, 9, :o2, 528253200 + tz.transition 1987, 3, :o3, 543978000 + tz.transition 1987, 9, :o2, 559702800 + tz.transition 1988, 3, :o3, 575427600 + tz.transition 1988, 9, :o2, 591152400 + tz.transition 1989, 3, :o3, 606877200 + tz.transition 1989, 9, :o2, 622602000 + tz.transition 1990, 3, :o3, 638326800 + tz.transition 1990, 9, :o2, 654656400 + tz.transition 1991, 3, :o3, 670381200 + tz.transition 1991, 9, :o2, 686106000 + tz.transition 1992, 3, :o3, 701830800 + tz.transition 1992, 9, :o2, 717555600 + tz.transition 1993, 3, :o3, 733280400 + tz.transition 1993, 9, :o2, 749005200 + tz.transition 1994, 3, :o3, 764730000 + tz.transition 1994, 9, :o2, 780454800 + tz.transition 1995, 3, :o3, 796179600 + tz.transition 1995, 9, :o2, 811904400 + tz.transition 1996, 3, :o3, 828234000 + tz.transition 1996, 10, :o2, 846378000 + tz.transition 1997, 3, :o3, 859683600 + tz.transition 1997, 10, :o2, 877827600 + tz.transition 1998, 3, :o3, 891133200 + tz.transition 1998, 10, :o2, 909277200 + tz.transition 1999, 3, :o3, 922582800 + tz.transition 1999, 10, :o2, 941331600 + tz.transition 2000, 3, :o3, 954032400 + tz.transition 2000, 10, :o2, 972781200 + tz.transition 2001, 3, :o3, 985482000 + tz.transition 2001, 10, :o2, 1004230800 + tz.transition 2002, 3, :o3, 1017536400 + tz.transition 2002, 10, :o2, 1035680400 + tz.transition 2003, 3, :o3, 1048986000 + tz.transition 2003, 10, :o2, 1067130000 + tz.transition 2004, 3, :o3, 1080435600 + tz.transition 2004, 10, :o2, 1099184400 + tz.transition 2005, 3, :o3, 1111885200 + tz.transition 2005, 10, :o2, 1130634000 + tz.transition 2006, 3, :o3, 1143334800 + tz.transition 2006, 10, :o2, 1162083600 + tz.transition 2007, 3, :o3, 1174784400 + tz.transition 2007, 10, :o2, 1193533200 + tz.transition 2008, 3, :o3, 1206838800 + tz.transition 2008, 10, :o2, 1224982800 + tz.transition 2009, 3, :o3, 1238288400 + tz.transition 2009, 10, :o2, 1256432400 + tz.transition 2010, 3, :o3, 1269738000 + tz.transition 2010, 10, :o2, 1288486800 + tz.transition 2011, 3, :o3, 1301187600 + tz.transition 2011, 10, :o2, 1319936400 + tz.transition 2012, 3, :o3, 1332637200 + tz.transition 2012, 10, :o2, 1351386000 + tz.transition 2013, 3, :o3, 1364691600 + tz.transition 2013, 10, :o2, 1382835600 + tz.transition 2014, 3, :o3, 1396141200 + tz.transition 2014, 10, :o2, 1414285200 + tz.transition 2015, 3, :o3, 1427590800 + tz.transition 2015, 10, :o2, 1445734800 + tz.transition 2016, 3, :o3, 1459040400 + tz.transition 2016, 10, :o2, 1477789200 + tz.transition 2017, 3, :o3, 1490490000 + tz.transition 2017, 10, :o2, 1509238800 + tz.transition 2018, 3, :o3, 1521939600 + tz.transition 2018, 10, :o2, 1540688400 + tz.transition 2019, 3, :o3, 1553994000 + tz.transition 2019, 10, :o2, 1572138000 + tz.transition 2020, 3, :o3, 1585443600 + tz.transition 2020, 10, :o2, 1603587600 + tz.transition 2021, 3, :o3, 1616893200 + tz.transition 2021, 10, :o2, 1635642000 + tz.transition 2022, 3, :o3, 1648342800 + tz.transition 2022, 10, :o2, 1667091600 + tz.transition 2023, 3, :o3, 1679792400 + tz.transition 2023, 10, :o2, 1698541200 + tz.transition 2024, 3, :o3, 1711846800 + tz.transition 2024, 10, :o2, 1729990800 + tz.transition 2025, 3, :o3, 1743296400 + tz.transition 2025, 10, :o2, 1761440400 + tz.transition 2026, 3, :o3, 1774746000 + tz.transition 2026, 10, :o2, 1792890000 + tz.transition 2027, 3, :o3, 1806195600 + tz.transition 2027, 10, :o2, 1824944400 + tz.transition 2028, 3, :o3, 1837645200 + tz.transition 2028, 10, :o2, 1856394000 + tz.transition 2029, 3, :o3, 1869094800 + tz.transition 2029, 10, :o2, 1887843600 + tz.transition 2030, 3, :o3, 1901149200 + tz.transition 2030, 10, :o2, 1919293200 + tz.transition 2031, 3, :o3, 1932598800 + tz.transition 2031, 10, :o2, 1950742800 + tz.transition 2032, 3, :o3, 1964048400 + tz.transition 2032, 10, :o2, 1982797200 + tz.transition 2033, 3, :o3, 1995498000 + tz.transition 2033, 10, :o2, 2014246800 + tz.transition 2034, 3, :o3, 2026947600 + tz.transition 2034, 10, :o2, 2045696400 + tz.transition 2035, 3, :o3, 2058397200 + tz.transition 2035, 10, :o2, 2077146000 + tz.transition 2036, 3, :o3, 2090451600 + tz.transition 2036, 10, :o2, 2108595600 + tz.transition 2037, 3, :o3, 2121901200 + tz.transition 2037, 10, :o2, 2140045200 + tz.transition 2038, 3, :o3, 2153350800, 59172253, 24 + tz.transition 2038, 10, :o2, 2172099600, 59177461, 24 + tz.transition 2039, 3, :o3, 2184800400, 59180989, 24 + tz.transition 2039, 10, :o2, 2203549200, 59186197, 24 + tz.transition 2040, 3, :o3, 2216250000, 59189725, 24 + tz.transition 2040, 10, :o2, 2234998800, 59194933, 24 + tz.transition 2041, 3, :o3, 2248304400, 59198629, 24 + tz.transition 2041, 10, :o2, 2266448400, 59203669, 24 + tz.transition 2042, 3, :o3, 2279754000, 59207365, 24 + tz.transition 2042, 10, :o2, 2297898000, 59212405, 24 + tz.transition 2043, 3, :o3, 2311203600, 59216101, 24 + tz.transition 2043, 10, :o2, 2329347600, 59221141, 24 + tz.transition 2044, 3, :o3, 2342653200, 59224837, 24 + tz.transition 2044, 10, :o2, 2361402000, 59230045, 24 + tz.transition 2045, 3, :o3, 2374102800, 59233573, 24 + tz.transition 2045, 10, :o2, 2392851600, 59238781, 24 + tz.transition 2046, 3, :o3, 2405552400, 59242309, 24 + tz.transition 2046, 10, :o2, 2424301200, 59247517, 24 + tz.transition 2047, 3, :o3, 2437606800, 59251213, 24 + tz.transition 2047, 10, :o2, 2455750800, 59256253, 24 + tz.transition 2048, 3, :o3, 2469056400, 59259949, 24 + tz.transition 2048, 10, :o2, 2487200400, 59264989, 24 + tz.transition 2049, 3, :o3, 2500506000, 59268685, 24 + tz.transition 2049, 10, :o2, 2519254800, 59273893, 24 + tz.transition 2050, 3, :o3, 2531955600, 59277421, 24 + tz.transition 2050, 10, :o2, 2550704400, 59282629, 24 + tz.transition 2051, 3, :o3, 2563405200, 59286157, 24 + tz.transition 2051, 10, :o2, 2582154000, 59291365, 24 + tz.transition 2052, 3, :o3, 2595459600, 59295061, 24 + tz.transition 2052, 10, :o2, 2613603600, 59300101, 24 + tz.transition 2053, 3, :o3, 2626909200, 59303797, 24 + tz.transition 2053, 10, :o2, 2645053200, 59308837, 24 + tz.transition 2054, 3, :o3, 2658358800, 59312533, 24 + tz.transition 2054, 10, :o2, 2676502800, 59317573, 24 + tz.transition 2055, 3, :o3, 2689808400, 59321269, 24 + tz.transition 2055, 10, :o2, 2708557200, 59326477, 24 + tz.transition 2056, 3, :o3, 2721258000, 59330005, 24 + tz.transition 2056, 10, :o2, 2740006800, 59335213, 24 + tz.transition 2057, 3, :o3, 2752707600, 59338741, 24 + tz.transition 2057, 10, :o2, 2771456400, 59343949, 24 + tz.transition 2058, 3, :o3, 2784762000, 59347645, 24 + tz.transition 2058, 10, :o2, 2802906000, 59352685, 24 + tz.transition 2059, 3, :o3, 2816211600, 59356381, 24 + tz.transition 2059, 10, :o2, 2834355600, 59361421, 24 + tz.transition 2060, 3, :o3, 2847661200, 59365117, 24 + tz.transition 2060, 10, :o2, 2866410000, 59370325, 24 + tz.transition 2061, 3, :o3, 2879110800, 59373853, 24 + tz.transition 2061, 10, :o2, 2897859600, 59379061, 24 + tz.transition 2062, 3, :o3, 2910560400, 59382589, 24 + tz.transition 2062, 10, :o2, 2929309200, 59387797, 24 + tz.transition 2063, 3, :o3, 2942010000, 59391325, 24 + tz.transition 2063, 10, :o2, 2960758800, 59396533, 24 + tz.transition 2064, 3, :o3, 2974064400, 59400229, 24 + tz.transition 2064, 10, :o2, 2992208400, 59405269, 24 + tz.transition 2065, 3, :o3, 3005514000, 59408965, 24 + tz.transition 2065, 10, :o2, 3023658000, 59414005, 24 + tz.transition 2066, 3, :o3, 3036963600, 59417701, 24 + tz.transition 2066, 10, :o2, 3055712400, 59422909, 24 + tz.transition 2067, 3, :o3, 3068413200, 59426437, 24 + tz.transition 2067, 10, :o2, 3087162000, 59431645, 24 + tz.transition 2068, 3, :o3, 3099862800, 59435173, 24 + tz.transition 2068, 10, :o2, 3118611600, 59440381, 24 + tz.transition 2069, 3, :o3, 3131917200, 59444077, 24 + tz.transition 2069, 10, :o2, 3150061200, 59449117, 24 + tz.transition 2070, 3, :o3, 3163366800, 59452813, 24 + tz.transition 2070, 10, :o2, 3181510800, 59457853, 24 + end + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/UTC.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/UTC.rb new file mode 100644 index 000000000000..2fec70c5f227 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/definitions/UTC.rb @@ -0,0 +1,16 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Definitions + module UTC + include TimezoneDefinition + + linked_timezone 'UTC', 'Etc/UTC' + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/indexes/countries.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/indexes/countries.rb new file mode 100644 index 000000000000..689e68b21507 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/indexes/countries.rb @@ -0,0 +1,940 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Indexes + module Countries + include CountryIndexDefinition + + country 'AD', 'Andorra' do |c| + c.timezone 'Europe/Andorra', 85, 2, 91, 60 + end + country 'AE', 'United Arab Emirates' do |c| + c.timezone 'Asia/Dubai', 253, 10, 553, 10 + end + country 'AF', 'Afghanistan' do |c| + c.timezone 'Asia/Kabul', 2071, 60, 346, 5 + end + country 'AG', 'Antigua & Barbuda' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'AI', 'Anguilla' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'AL', 'Albania' do |c| + c.timezone 'Europe/Tirane', 124, 3, 119, 6 + end + country 'AM', 'Armenia' do |c| + c.timezone 'Asia/Yerevan', 2411, 60, 89, 2 + end + country 'AO', 'Angola' do |c| + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'AQ', 'Antarctica' do |c| + c.timezone 'Antarctica/Casey', -3977, 60, 6631, 60, 'Casey' + c.timezone 'Antarctica/Davis', -823, 12, 2339, 30, 'Davis' + c.timezone 'Antarctica/DumontDUrville', -200, 3, 8401, 60, 'Dumont-d\'Urville' + c.timezone 'Antarctica/Mawson', -338, 5, 3773, 60, 'Mawson' + c.timezone 'Antarctica/Palmer', -324, 5, -641, 10, 'Palmer' + c.timezone 'Antarctica/Rothera', -2027, 30, -1022, 15, 'Rothera' + c.timezone 'Antarctica/Syowa', -124211, 1800, 3959, 100, 'Syowa' + c.timezone 'Antarctica/Troll', -259241, 3600, 507, 200, 'Troll' + c.timezone 'Antarctica/Vostok', -392, 5, 1069, 10, 'Vostok' + c.timezone 'Pacific/Auckland', -553, 15, 5243, 30, 'New Zealand time' + end + country 'AR', 'Argentina' do |c| + c.timezone 'America/Argentina/Buenos_Aires', -173, 5, -1169, 20, 'Buenos Aires (BA, CF)' + c.timezone 'America/Argentina/Cordoba', -157, 5, -3851, 60, 'Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF)' + c.timezone 'America/Argentina/Salta', -1487, 60, -785, 12, 'Salta (SA, LP, NQ, RN)' + c.timezone 'America/Argentina/Jujuy', -1451, 60, -653, 10, 'Jujuy (JY)' + c.timezone 'America/Argentina/Tucuman', -1609, 60, -3913, 60, 'Tucumán (TM)' + c.timezone 'America/Argentina/Catamarca', -427, 15, -3947, 60, 'Catamarca (CT); Chubut (CH)' + c.timezone 'America/Argentina/La_Rioja', -883, 30, -1337, 20, 'La Rioja (LR)' + c.timezone 'America/Argentina/San_Juan', -473, 15, -4111, 60, 'San Juan (SJ)' + c.timezone 'America/Argentina/Mendoza', -1973, 60, -4129, 60, 'Mendoza (MZ)' + c.timezone 'America/Argentina/San_Luis', -1999, 60, -1327, 20, 'San Luis (SL)' + c.timezone 'America/Argentina/Rio_Gallegos', -1549, 30, -4153, 60, 'Santa Cruz (SC)' + c.timezone 'America/Argentina/Ushuaia', -274, 5, -683, 10, 'Tierra del Fuego (TF)' + end + country 'AS', 'Samoa (American)' do |c| + c.timezone 'Pacific/Pago_Pago', -214, 15, -1707, 10, 'Samoa, Midway' + end + country 'AT', 'Austria' do |c| + c.timezone 'Europe/Vienna', 2893, 60, 49, 3 + end + country 'AU', 'Australia' do |c| + c.timezone 'Australia/Lord_Howe', -631, 20, 1909, 12, 'Lord Howe Island' + c.timezone 'Antarctica/Macquarie', -109, 2, 3179, 20, 'Macquarie Island' + c.timezone 'Australia/Hobart', -2573, 60, 8839, 60, 'Tasmania (most areas)' + c.timezone 'Australia/Currie', -599, 15, 2158, 15, 'Tasmania (King Island)' + c.timezone 'Australia/Melbourne', -2269, 60, 4349, 30, 'Victoria' + c.timezone 'Australia/Sydney', -508, 15, 9073, 60, 'New South Wales (most areas)' + c.timezone 'Australia/Broken_Hill', -639, 20, 2829, 20, 'New South Wales (Yancowinna)' + c.timezone 'Australia/Brisbane', -412, 15, 4591, 30, 'Queensland (most areas)' + c.timezone 'Australia/Lindeman', -304, 15, 149, 1, 'Queensland (Whitsunday Islands)' + c.timezone 'Australia/Adelaide', -419, 12, 1663, 12, 'South Australia' + c.timezone 'Australia/Darwin', -187, 15, 785, 6, 'Northern Territory' + c.timezone 'Australia/Perth', -639, 20, 2317, 20, 'Western Australia (most areas)' + c.timezone 'Australia/Eucla', -1903, 60, 1933, 15, 'Western Australia (Eucla)' + end + country 'AW', 'Aruba' do |c| + c.timezone 'America/Curacao', 731, 60, -69, 1 + end + country 'AX', 'Åland Islands' do |c| + c.timezone 'Europe/Helsinki', 361, 6, 749, 30 + end + country 'AZ', 'Azerbaijan' do |c| + c.timezone 'Asia/Baku', 2423, 60, 997, 20 + end + country 'BA', 'Bosnia & Herzegovina' do |c| + c.timezone 'Europe/Belgrade', 269, 6, 41, 2 + end + country 'BB', 'Barbados' do |c| + c.timezone 'America/Barbados', 131, 10, -3577, 60 + end + country 'BD', 'Bangladesh' do |c| + c.timezone 'Asia/Dhaka', 1423, 60, 1085, 12 + end + country 'BE', 'Belgium' do |c| + c.timezone 'Europe/Brussels', 305, 6, 13, 3 + end + country 'BF', 'Burkina Faso' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'BG', 'Bulgaria' do |c| + c.timezone 'Europe/Sofia', 2561, 60, 1399, 60 + end + country 'BH', 'Bahrain' do |c| + c.timezone 'Asia/Qatar', 1517, 60, 773, 15 + end + country 'BI', 'Burundi' do |c| + c.timezone 'Africa/Maputo', -779, 30, 391, 12, 'Central Africa Time' + end + country 'BJ', 'Benin' do |c| + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'BL', 'St Barthelemy' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'BM', 'Bermuda' do |c| + c.timezone 'Atlantic/Bermuda', 1937, 60, -1943, 30 + end + country 'BN', 'Brunei' do |c| + c.timezone 'Asia/Brunei', 74, 15, 1379, 12 + end + country 'BO', 'Bolivia' do |c| + c.timezone 'America/La_Paz', -33, 2, -1363, 20 + end + country 'BQ', 'Caribbean NL' do |c| + c.timezone 'America/Curacao', 731, 60, -69, 1 + end + country 'BR', 'Brazil' do |c| + c.timezone 'America/Noronha', -77, 20, -389, 12, 'Atlantic islands' + c.timezone 'America/Belem', -29, 20, -2909, 60, 'Pará (east); Amapá' + c.timezone 'America/Fortaleza', -223, 60, -77, 2, 'Brazil (northeast: MA, PI, CE, RN, PB)' + c.timezone 'America/Recife', -161, 20, -349, 10, 'Pernambuco' + c.timezone 'America/Araguaina', -36, 5, -241, 5, 'Tocantins' + c.timezone 'America/Maceio', -29, 3, -2143, 60, 'Alagoas, Sergipe' + c.timezone 'America/Bahia', -779, 60, -2311, 60, 'Bahia' + c.timezone 'America/Sao_Paulo', -353, 15, -2797, 60, 'Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)' + c.timezone 'America/Campo_Grande', -409, 20, -3277, 60, 'Mato Grosso do Sul' + c.timezone 'America/Cuiaba', -187, 12, -673, 12, 'Mato Grosso' + c.timezone 'America/Santarem', -73, 30, -823, 15, 'Pará (west)' + c.timezone 'America/Porto_Velho', -263, 30, -639, 10, 'Rondônia' + c.timezone 'America/Boa_Vista', 169, 60, -182, 3, 'Roraima' + c.timezone 'America/Manaus', -47, 15, -3601, 60, 'Amazonas (east)' + c.timezone 'America/Eirunepe', -20, 3, -1048, 15, 'Amazonas (west)' + c.timezone 'America/Rio_Branco', -299, 30, -339, 5, 'Acre' + end + country 'BS', 'Bahamas' do |c| + c.timezone 'America/Nassau', 301, 12, -1547, 20 + end + country 'BT', 'Bhutan' do |c| + c.timezone 'Asia/Thimphu', 412, 15, 1793, 20 + end + country 'BV', 'Bouvet Island' + country 'BW', 'Botswana' do |c| + c.timezone 'Africa/Maputo', -779, 30, 391, 12, 'Central Africa Time' + end + country 'BY', 'Belarus' do |c| + c.timezone 'Europe/Minsk', 539, 10, 827, 30 + end + country 'BZ', 'Belize' do |c| + c.timezone 'America/Belize', 35, 2, -441, 5 + end + country 'CA', 'Canada' do |c| + c.timezone 'America/St_Johns', 1427, 30, -3163, 60, 'Newfoundland; Labrador (southeast)' + c.timezone 'America/Halifax', 893, 20, -318, 5, 'Atlantic - NS (most areas); PE' + c.timezone 'America/Glace_Bay', 231, 5, -1199, 20, 'Atlantic - NS (Cape Breton)' + c.timezone 'America/Moncton', 461, 10, -3887, 60, 'Atlantic - New Brunswick' + c.timezone 'America/Goose_Bay', 160, 3, -725, 12, 'Atlantic - Labrador (most areas)' + c.timezone 'America/Blanc-Sablon', 617, 12, -3427, 60, 'AST - QC (Lower North Shore)' + c.timezone 'America/Toronto', 873, 20, -4763, 60, 'Eastern - ON, QC (most areas)' + c.timezone 'America/Nipigon', 2941, 60, -1324, 15, 'Eastern - ON, QC (no DST 1967-73)' + c.timezone 'America/Thunder_Bay', 2903, 60, -357, 4, 'Eastern - ON (Thunder Bay)' + c.timezone 'America/Iqaluit', 956, 15, -1027, 15, 'Eastern - NU (most east areas)' + c.timezone 'America/Pangnirtung', 992, 15, -986, 15, 'Eastern - NU (Pangnirtung)' + c.timezone 'America/Atikokan', 175531, 3600, -54973, 600, 'EST - ON (Atikokan); NU (Coral H)' + c.timezone 'America/Winnipeg', 2993, 60, -1943, 20, 'Central - ON (west); Manitoba' + c.timezone 'America/Rainy_River', 2923, 60, -2837, 30, 'Central - ON (Rainy R, Ft Frances)' + c.timezone 'America/Resolute', 33613, 450, -22759, 240, 'Central - NU (Resolute)' + c.timezone 'America/Rankin_Inlet', 3769, 60, -331499, 3600, 'Central - NU (central)' + c.timezone 'America/Regina', 252, 5, -2093, 20, 'CST - SK (most areas)' + c.timezone 'America/Swift_Current', 3017, 60, -647, 6, 'CST - SK (midwest)' + c.timezone 'America/Edmonton', 1071, 20, -1702, 15, 'Mountain - AB; BC (E); SK (W)' + c.timezone 'America/Cambridge_Bay', 24881, 360, -37819, 360, 'Mountain - NU (west)' + c.timezone 'America/Yellowknife', 1249, 20, -2287, 20, 'Mountain - NT (central)' + c.timezone 'America/Inuvik', 246059, 3600, -8023, 60, 'Mountain - NT (west)' + c.timezone 'America/Creston', 491, 10, -6991, 60, 'MST - BC (Creston)' + c.timezone 'America/Dawson_Creek', 1793, 30, -3607, 30, 'MST - BC (Dawson Cr, Ft St John)' + c.timezone 'America/Fort_Nelson', 294, 5, -1227, 10, 'MST - BC (Ft Nelson)' + c.timezone 'America/Vancouver', 739, 15, -7387, 60, 'Pacific - BC (most areas)' + c.timezone 'America/Whitehorse', 3643, 60, -2701, 20, 'Pacific - Yukon (east)' + c.timezone 'America/Dawson', 961, 15, -1673, 12, 'Pacific - Yukon (west)' + end + country 'CC', 'Cocos (Keeling) Islands' do |c| + c.timezone 'Indian/Cocos', -73, 6, 1163, 12 + end + country 'CD', 'Congo (Dem. Rep.)' do |c| + c.timezone 'Africa/Maputo', -779, 30, 391, 12, 'Central Africa Time' + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'CF', 'Central African Rep.' do |c| + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'CG', 'Congo (Rep.)' do |c| + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'CH', 'Switzerland' do |c| + c.timezone 'Europe/Zurich', 2843, 60, 128, 15, 'Swiss time' + end + country 'CI', 'Côte d\'Ivoire' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'CK', 'Cook Islands' do |c| + c.timezone 'Pacific/Rarotonga', -637, 30, -4793, 30 + end + country 'CL', 'Chile' do |c| + c.timezone 'America/Santiago', -669, 20, -212, 3, 'Chile (most areas)' + c.timezone 'America/Punta_Arenas', -1063, 20, -851, 12, 'Region of Magallanes' + c.timezone 'Pacific/Easter', -543, 20, -3283, 30, 'Easter Island' + end + country 'CM', 'Cameroon' do |c| + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'CN', 'China' do |c| + c.timezone 'Asia/Shanghai', 937, 30, 1822, 15, 'Beijing Time' + c.timezone 'Asia/Urumqi', 219, 5, 1051, 12, 'Xinjiang Time' + end + country 'CO', 'Colombia' do |c| + c.timezone 'America/Bogota', 23, 5, -889, 12 + end + country 'CR', 'Costa Rica' do |c| + c.timezone 'America/Costa_Rica', 149, 15, -1009, 12 + end + country 'CU', 'Cuba' do |c| + c.timezone 'America/Havana', 347, 15, -2471, 30 + end + country 'CV', 'Cape Verde' do |c| + c.timezone 'Atlantic/Cape_Verde', 179, 12, -1411, 60 + end + country 'CW', 'Curaçao' do |c| + c.timezone 'America/Curacao', 731, 60, -69, 1 + end + country 'CX', 'Christmas Island' do |c| + c.timezone 'Indian/Christmas', -125, 12, 6343, 60 + end + country 'CY', 'Cyprus' do |c| + c.timezone 'Asia/Nicosia', 211, 6, 1001, 30, 'Cyprus (most areas)' + c.timezone 'Asia/Famagusta', 2107, 60, 679, 20, 'Northern Cyprus' + end + country 'CZ', 'Czech Republic' do |c| + c.timezone 'Europe/Prague', 601, 12, 433, 30 + end + country 'DE', 'Germany' do |c| + c.timezone 'Europe/Berlin', 105, 2, 401, 30, 'Germany (most areas)' + c.timezone 'Europe/Zurich', 2843, 60, 128, 15, 'Swiss time' + end + country 'DJ', 'Djibouti' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'DK', 'Denmark' do |c| + c.timezone 'Europe/Copenhagen', 167, 3, 151, 12 + end + country 'DM', 'Dominica' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'DO', 'Dominican Republic' do |c| + c.timezone 'America/Santo_Domingo', 277, 15, -699, 10 + end + country 'DZ', 'Algeria' do |c| + c.timezone 'Africa/Algiers', 2207, 60, 61, 20 + end + country 'EC', 'Ecuador' do |c| + c.timezone 'America/Guayaquil', -13, 6, -479, 6, 'Ecuador (mainland)' + c.timezone 'Pacific/Galapagos', -9, 10, -448, 5, 'Galápagos Islands' + end + country 'EE', 'Estonia' do |c| + c.timezone 'Europe/Tallinn', 713, 12, 99, 4 + end + country 'EG', 'Egypt' do |c| + c.timezone 'Africa/Cairo', 601, 20, 125, 4 + end + country 'EH', 'Western Sahara' do |c| + c.timezone 'Africa/El_Aaiun', 543, 20, -66, 5 + end + country 'ER', 'Eritrea' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'ES', 'Spain' do |c| + c.timezone 'Europe/Madrid', 202, 5, -221, 60, 'Spain (mainland)' + c.timezone 'Africa/Ceuta', 2153, 60, -319, 60, 'Ceuta, Melilla' + c.timezone 'Atlantic/Canary', 281, 10, -77, 5, 'Canary Islands' + end + country 'ET', 'Ethiopia' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'FI', 'Finland' do |c| + c.timezone 'Europe/Helsinki', 361, 6, 749, 30 + end + country 'FJ', 'Fiji' do |c| + c.timezone 'Pacific/Fiji', -272, 15, 2141, 12 + end + country 'FK', 'Falkland Islands' do |c| + c.timezone 'Atlantic/Stanley', -517, 10, -1157, 20 + end + country 'FM', 'Micronesia' do |c| + c.timezone 'Pacific/Chuuk', 89, 12, 9107, 60, 'Chuuk/Truk, Yap' + c.timezone 'Pacific/Pohnpei', 209, 30, 9493, 60, 'Pohnpei/Ponape' + c.timezone 'Pacific/Kosrae', 319, 60, 9779, 60, 'Kosrae' + end + country 'FO', 'Faroe Islands' do |c| + c.timezone 'Atlantic/Faroe', 3721, 60, -203, 30 + end + country 'FR', 'France' do |c| + c.timezone 'Europe/Paris', 733, 15, 7, 3 + end + country 'GA', 'Gabon' do |c| + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'GB', 'Britain (UK)' do |c| + c.timezone 'Europe/London', 6181, 120, -451, 3600 + end + country 'GD', 'Grenada' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'GE', 'Georgia' do |c| + c.timezone 'Asia/Tbilisi', 2503, 60, 2689, 60 + end + country 'GF', 'French Guiana' do |c| + c.timezone 'America/Cayenne', 74, 15, -157, 3 + end + country 'GG', 'Guernsey' do |c| + c.timezone 'Europe/London', 6181, 120, -451, 3600 + end + country 'GH', 'Ghana' do |c| + c.timezone 'Africa/Accra', 111, 20, -13, 60 + end + country 'GI', 'Gibraltar' do |c| + c.timezone 'Europe/Gibraltar', 542, 15, -107, 20 + end + country 'GL', 'Greenland' do |c| + c.timezone 'America/Nuuk', 3851, 60, -776, 15, 'Greenland (most areas)' + c.timezone 'America/Danmarkshavn', 2303, 30, -56, 3, 'National Park (east coast)' + c.timezone 'America/Scoresbysund', 4229, 60, -659, 30, 'Scoresbysund/Ittoqqortoormiit' + c.timezone 'America/Thule', 2297, 30, -4127, 60, 'Thule/Pituffik' + end + country 'GM', 'Gambia' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'GN', 'Guinea' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'GP', 'Guadeloupe' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'GQ', 'Equatorial Guinea' do |c| + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'GR', 'Greece' do |c| + c.timezone 'Europe/Athens', 1139, 30, 1423, 60 + end + country 'GS', 'South Georgia & the South Sandwich Islands' do |c| + c.timezone 'Atlantic/South_Georgia', -814, 15, -548, 15 + end + country 'GT', 'Guatemala' do |c| + c.timezone 'America/Guatemala', 439, 30, -5431, 60 + end + country 'GU', 'Guam' do |c| + c.timezone 'Pacific/Guam', 202, 15, 579, 4 + end + country 'GW', 'Guinea-Bissau' do |c| + c.timezone 'Africa/Bissau', 237, 20, -187, 12 + end + country 'GY', 'Guyana' do |c| + c.timezone 'America/Guyana', 34, 5, -349, 6 + end + country 'HK', 'Hong Kong' do |c| + c.timezone 'Asia/Hong_Kong', 1337, 60, 2283, 20 + end + country 'HM', 'Heard Island & McDonald Islands' + country 'HN', 'Honduras' do |c| + c.timezone 'America/Tegucigalpa', 141, 10, -5233, 60 + end + country 'HR', 'Croatia' do |c| + c.timezone 'Europe/Belgrade', 269, 6, 41, 2 + end + country 'HT', 'Haiti' do |c| + c.timezone 'America/Port-au-Prince', 278, 15, -217, 3 + end + country 'HU', 'Hungary' do |c| + c.timezone 'Europe/Budapest', 95, 2, 229, 12 + end + country 'ID', 'Indonesia' do |c| + c.timezone 'Asia/Jakarta', -37, 6, 534, 5, 'Java, Sumatra' + c.timezone 'Asia/Pontianak', -1, 30, 328, 3, 'Borneo (west, central)' + c.timezone 'Asia/Makassar', -307, 60, 597, 5, 'Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west)' + c.timezone 'Asia/Jayapura', -38, 15, 1407, 10, 'New Guinea (West Papua / Irian Jaya); Malukus/Moluccas' + end + country 'IE', 'Ireland' do |c| + c.timezone 'Europe/Dublin', 160, 3, -25, 4 + end + country 'IL', 'Israel' do |c| + c.timezone 'Asia/Jerusalem', 11441, 360, 63403, 1800 + end + country 'IM', 'Isle of Man' do |c| + c.timezone 'Europe/London', 6181, 120, -451, 3600 + end + country 'IN', 'India' do |c| + c.timezone 'Asia/Kolkata', 338, 15, 2651, 30 + end + country 'IO', 'British Indian Ocean Territory' do |c| + c.timezone 'Indian/Chagos', -22, 3, 869, 12 + end + country 'IQ', 'Iraq' do |c| + c.timezone 'Asia/Baghdad', 667, 20, 533, 12 + end + country 'IR', 'Iran' do |c| + c.timezone 'Asia/Tehran', 107, 3, 1543, 30 + end + country 'IS', 'Iceland' do |c| + c.timezone 'Atlantic/Reykjavik', 1283, 20, -437, 20 + end + country 'IT', 'Italy' do |c| + c.timezone 'Europe/Rome', 419, 10, 749, 60 + end + country 'JE', 'Jersey' do |c| + c.timezone 'Europe/London', 6181, 120, -451, 3600 + end + country 'JM', 'Jamaica' do |c| + c.timezone 'America/Jamaica', 12937, 720, -11519, 150 + end + country 'JO', 'Jordan' do |c| + c.timezone 'Asia/Amman', 639, 20, 539, 15 + end + country 'JP', 'Japan' do |c| + c.timezone 'Asia/Tokyo', 32089, 900, 503081, 3600 + end + country 'KE', 'Kenya' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'KG', 'Kyrgyzstan' do |c| + c.timezone 'Asia/Bishkek', 429, 10, 373, 5 + end + country 'KH', 'Cambodia' do |c| + c.timezone 'Asia/Bangkok', 55, 4, 6031, 60, 'Indochina (most areas)' + end + country 'KI', 'Kiribati' do |c| + c.timezone 'Pacific/Tarawa', 17, 12, 173, 1, 'Gilbert Islands' + c.timezone 'Pacific/Enderbury', -47, 15, -2053, 12, 'Phoenix Islands' + c.timezone 'Pacific/Kiritimati', 28, 15, -472, 3, 'Line Islands' + end + country 'KM', 'Comoros' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'KN', 'St Kitts & Nevis' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'KP', 'Korea (North)' do |c| + c.timezone 'Asia/Pyongyang', 2341, 60, 503, 4 + end + country 'KR', 'Korea (South)' do |c| + c.timezone 'Asia/Seoul', 751, 20, 3809, 30 + end + country 'KW', 'Kuwait' do |c| + c.timezone 'Asia/Riyadh', 739, 30, 2803, 60 + end + country 'KY', 'Cayman Islands' do |c| + c.timezone 'America/Panama', 269, 30, -1193, 15 + end + country 'KZ', 'Kazakhstan' do |c| + c.timezone 'Asia/Almaty', 173, 4, 1539, 20, 'Kazakhstan (most areas)' + c.timezone 'Asia/Qyzylorda', 224, 5, 982, 15, 'Qyzylorda/Kyzylorda/Kzyl-Orda' + c.timezone 'Asia/Qostanay', 266, 5, 3817, 60, 'Qostanay/Kostanay/Kustanay' + c.timezone 'Asia/Aqtobe', 3017, 60, 343, 6, 'Aqtöbe/Aktobe' + c.timezone 'Asia/Aqtau', 2671, 60, 754, 15, 'Mangghystaū/Mankistau' + c.timezone 'Asia/Atyrau', 2827, 60, 779, 15, 'Atyraū/Atirau/Gur\'yev' + c.timezone 'Asia/Oral', 3073, 60, 1027, 20, 'West Kazakhstan' + end + country 'LA', 'Laos' do |c| + c.timezone 'Asia/Bangkok', 55, 4, 6031, 60, 'Indochina (most areas)' + end + country 'LB', 'Lebanon' do |c| + c.timezone 'Asia/Beirut', 2033, 60, 71, 2 + end + country 'LC', 'St Lucia' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'LI', 'Liechtenstein' do |c| + c.timezone 'Europe/Zurich', 2843, 60, 128, 15, 'Swiss time' + end + country 'LK', 'Sri Lanka' do |c| + c.timezone 'Asia/Colombo', 104, 15, 1597, 20 + end + country 'LR', 'Liberia' do |c| + c.timezone 'Africa/Monrovia', 63, 10, -647, 60 + end + country 'LS', 'Lesotho' do |c| + c.timezone 'Africa/Johannesburg', -105, 4, 28, 1 + end + country 'LT', 'Lithuania' do |c| + c.timezone 'Europe/Vilnius', 3281, 60, 1519, 60 + end + country 'LU', 'Luxembourg' do |c| + c.timezone 'Europe/Luxembourg', 248, 5, 123, 20 + end + country 'LV', 'Latvia' do |c| + c.timezone 'Europe/Riga', 1139, 20, 241, 10 + end + country 'LY', 'Libya' do |c| + c.timezone 'Africa/Tripoli', 329, 10, 791, 60 + end + country 'MA', 'Morocco' do |c| + c.timezone 'Africa/Casablanca', 673, 20, -91, 12 + end + country 'MC', 'Monaco' do |c| + c.timezone 'Europe/Monaco', 437, 10, 443, 60 + end + country 'MD', 'Moldova' do |c| + c.timezone 'Europe/Chisinau', 47, 1, 173, 6 + end + country 'ME', 'Montenegro' do |c| + c.timezone 'Europe/Belgrade', 269, 6, 41, 2 + end + country 'MF', 'St Martin (French)' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'MG', 'Madagascar' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'MH', 'Marshall Islands' do |c| + c.timezone 'Pacific/Majuro', 143, 20, 856, 5, 'Marshall Islands (most areas)' + c.timezone 'Pacific/Kwajalein', 109, 12, 502, 3, 'Kwajalein' + end + country 'MK', 'North Macedonia' do |c| + c.timezone 'Europe/Belgrade', 269, 6, 41, 2 + end + country 'ML', 'Mali' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'MM', 'Myanmar (Burma)' do |c| + c.timezone 'Asia/Yangon', 1007, 60, 577, 6 + end + country 'MN', 'Mongolia' do |c| + c.timezone 'Asia/Ulaanbaatar', 575, 12, 6413, 60, 'Mongolia (most areas)' + c.timezone 'Asia/Hovd', 2881, 60, 1833, 20, 'Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan' + c.timezone 'Asia/Choibalsan', 721, 15, 229, 2, 'Dornod, Sükhbaatar' + end + country 'MO', 'Macau' do |c| + c.timezone 'Asia/Macau', 7991, 360, 2725, 24 + end + country 'MP', 'Northern Mariana Islands' do |c| + c.timezone 'Pacific/Guam', 202, 15, 579, 4 + end + country 'MQ', 'Martinique' do |c| + c.timezone 'America/Martinique', 73, 5, -733, 12 + end + country 'MR', 'Mauritania' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'MS', 'Montserrat' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'MT', 'Malta' do |c| + c.timezone 'Europe/Malta', 359, 10, 871, 60 + end + country 'MU', 'Mauritius' do |c| + c.timezone 'Indian/Mauritius', -121, 6, 115, 2 + end + country 'MV', 'Maldives' do |c| + c.timezone 'Indian/Maldives', 25, 6, 147, 2 + end + country 'MW', 'Malawi' do |c| + c.timezone 'Africa/Maputo', -779, 30, 391, 12, 'Central Africa Time' + end + country 'MX', 'Mexico' do |c| + c.timezone 'America/Mexico_City', 97, 5, -1983, 20, 'Central Time' + c.timezone 'America/Cancun', 253, 12, -2603, 30, 'Eastern Standard Time - Quintana Roo' + c.timezone 'America/Merida', 629, 30, -5377, 60, 'Central Time - Campeche, Yucatán' + c.timezone 'America/Monterrey', 77, 3, -6019, 60, 'Central Time - Durango; Coahuila, Nuevo León, Tamaulipas (most areas)' + c.timezone 'America/Matamoros', 155, 6, -195, 2, 'Central Time US - Coahuila, Nuevo León, Tamaulipas (US border)' + c.timezone 'America/Mazatlan', 1393, 60, -1277, 12, 'Mountain Time - Baja California Sur, Nayarit, Sinaloa' + c.timezone 'America/Chihuahua', 859, 30, -1273, 12, 'Mountain Time - Chihuahua (most areas)' + c.timezone 'America/Ojinaga', 887, 30, -1253, 12, 'Mountain Time US - Chihuahua (US border)' + c.timezone 'America/Hermosillo', 436, 15, -3329, 30, 'Mountain Standard Time - Sonora' + c.timezone 'America/Tijuana', 488, 15, -7021, 60, 'Pacific Time US - Baja California' + c.timezone 'America/Bahia_Banderas', 104, 5, -421, 4, 'Central Time - Bahía de Banderas' + end + country 'MY', 'Malaysia' do |c| + c.timezone 'Asia/Kuala_Lumpur', 19, 6, 1017, 10, 'Malaysia (peninsula)' + c.timezone 'Asia/Kuching', 31, 20, 331, 3, 'Sabah, Sarawak' + end + country 'MZ', 'Mozambique' do |c| + c.timezone 'Africa/Maputo', -779, 30, 391, 12, 'Central Africa Time' + end + country 'NA', 'Namibia' do |c| + c.timezone 'Africa/Windhoek', -677, 30, 171, 10 + end + country 'NC', 'New Caledonia' do |c| + c.timezone 'Pacific/Noumea', -334, 15, 3329, 20 + end + country 'NE', 'Niger' do |c| + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'NF', 'Norfolk Island' do |c| + c.timezone 'Pacific/Norfolk', -581, 20, 5039, 30 + end + country 'NG', 'Nigeria' do |c| + c.timezone 'Africa/Lagos', 129, 20, 17, 5, 'West Africa Time' + end + country 'NI', 'Nicaragua' do |c| + c.timezone 'America/Managua', 243, 20, -5177, 60 + end + country 'NL', 'Netherlands' do |c| + c.timezone 'Europe/Amsterdam', 1571, 30, 49, 10 + end + country 'NO', 'Norway' do |c| + c.timezone 'Europe/Oslo', 719, 12, 43, 4 + end + country 'NP', 'Nepal' do |c| + c.timezone 'Asia/Kathmandu', 1663, 60, 5119, 60 + end + country 'NR', 'Nauru' do |c| + c.timezone 'Pacific/Nauru', -31, 60, 2003, 12 + end + country 'NU', 'Niue' do |c| + c.timezone 'Pacific/Niue', -1141, 60, -2039, 12 + end + country 'NZ', 'New Zealand' do |c| + c.timezone 'Pacific/Auckland', -553, 15, 5243, 30, 'New Zealand time' + c.timezone 'Pacific/Chatham', -879, 20, -3531, 20, 'Chatham Islands' + end + country 'OM', 'Oman' do |c| + c.timezone 'Asia/Dubai', 253, 10, 553, 10 + end + country 'PA', 'Panama' do |c| + c.timezone 'America/Panama', 269, 30, -1193, 15 + end + country 'PE', 'Peru' do |c| + c.timezone 'America/Lima', -241, 20, -1541, 20 + end + country 'PF', 'French Polynesia' do |c| + c.timezone 'Pacific/Tahiti', -263, 15, -4487, 30, 'Society Islands' + c.timezone 'Pacific/Marquesas', -9, 1, -279, 2, 'Marquesas Islands' + c.timezone 'Pacific/Gambier', -347, 15, -2699, 20, 'Gambier Islands' + end + country 'PG', 'Papua New Guinea' do |c| + c.timezone 'Pacific/Port_Moresby', -19, 2, 883, 6, 'Papua New Guinea (most areas)' + c.timezone 'Pacific/Bougainville', -373, 60, 4667, 30, 'Bougainville' + end + country 'PH', 'Philippines' do |c| + c.timezone 'Asia/Manila', 175, 12, 121, 1 + end + country 'PK', 'Pakistan' do |c| + c.timezone 'Asia/Karachi', 373, 15, 1341, 20 + end + country 'PL', 'Poland' do |c| + c.timezone 'Europe/Warsaw', 209, 4, 21, 1 + end + country 'PM', 'St Pierre & Miquelon' do |c| + c.timezone 'America/Miquelon', 941, 20, -169, 3 + end + country 'PN', 'Pitcairn' do |c| + c.timezone 'Pacific/Pitcairn', -376, 15, -1561, 12 + end + country 'PR', 'Puerto Rico' do |c| + c.timezone 'America/Puerto_Rico', 11081, 600, -118991, 1800 + end + country 'PS', 'Palestine' do |c| + c.timezone 'Asia/Gaza', 63, 2, 517, 15, 'Gaza Strip' + c.timezone 'Asia/Hebron', 473, 15, 7019, 200, 'West Bank' + end + country 'PT', 'Portugal' do |c| + c.timezone 'Europe/Lisbon', 2323, 60, -137, 15, 'Portugal (mainland)' + c.timezone 'Atlantic/Madeira', 979, 30, -169, 10, 'Madeira Islands' + c.timezone 'Atlantic/Azores', 566, 15, -77, 3, 'Azores' + end + country 'PW', 'Palau' do |c| + c.timezone 'Pacific/Palau', 22, 3, 8069, 60 + end + country 'PY', 'Paraguay' do |c| + c.timezone 'America/Asuncion', -379, 15, -173, 3 + end + country 'QA', 'Qatar' do |c| + c.timezone 'Asia/Qatar', 1517, 60, 773, 15 + end + country 'RE', 'Réunion' do |c| + c.timezone 'Indian/Reunion', -313, 15, 832, 15, 'Réunion, Crozet, Scattered Islands' + end + country 'RO', 'Romania' do |c| + c.timezone 'Europe/Bucharest', 1333, 30, 261, 10 + end + country 'RS', 'Serbia' do |c| + c.timezone 'Europe/Belgrade', 269, 6, 41, 2 + end + country 'RU', 'Russia' do |c| + c.timezone 'Europe/Kaliningrad', 3283, 60, 41, 2, 'MSK-01 - Kaliningrad' + c.timezone 'Europe/Moscow', 66907, 1200, 8464, 225, 'MSK+00 - Moscow area' + c.timezone 'Europe/Simferopol', 899, 20, 341, 10, 'Crimea' + c.timezone 'Europe/Kirov', 293, 5, 993, 20, 'MSK+00 - Kirov' + c.timezone 'Europe/Astrakhan', 927, 20, 961, 20, 'MSK+01 - Astrakhan' + c.timezone 'Europe/Volgograd', 731, 15, 533, 12, 'MSK+01 - Volgograd' + c.timezone 'Europe/Saratov', 1547, 30, 1381, 30, 'MSK+01 - Saratov' + c.timezone 'Europe/Ulyanovsk', 163, 3, 242, 5, 'MSK+01 - Ulyanovsk' + c.timezone 'Europe/Samara', 266, 5, 1003, 20, 'MSK+01 - Samara, Udmurtia' + c.timezone 'Asia/Yekaterinburg', 1137, 20, 303, 5, 'MSK+02 - Urals' + c.timezone 'Asia/Omsk', 55, 1, 367, 5, 'MSK+03 - Omsk' + c.timezone 'Asia/Novosibirsk', 1651, 30, 995, 12, 'MSK+04 - Novosibirsk' + c.timezone 'Asia/Barnaul', 1601, 30, 335, 4, 'MSK+04 - Altai' + c.timezone 'Asia/Tomsk', 113, 2, 2549, 30, 'MSK+04 - Tomsk' + c.timezone 'Asia/Novokuznetsk', 215, 4, 5227, 60, 'MSK+04 - Kemerovo' + c.timezone 'Asia/Krasnoyarsk', 3361, 60, 557, 6, 'MSK+04 - Krasnoyarsk area' + c.timezone 'Asia/Irkutsk', 784, 15, 313, 3, 'MSK+05 - Irkutsk, Buryatia' + c.timezone 'Asia/Chita', 1041, 20, 1702, 15, 'MSK+06 - Zabaykalsky' + c.timezone 'Asia/Yakutsk', 62, 1, 389, 3, 'MSK+06 - Lena River' + c.timezone 'Asia/Khandyga', 225563, 3600, 243997, 1800, 'MSK+06 - Tomponsky, Ust-Maysky' + c.timezone 'Asia/Vladivostok', 259, 6, 1979, 15, 'MSK+07 - Amur River' + c.timezone 'Asia/Ust-Nera', 232417, 3600, 10742, 75, 'MSK+07 - Oymyakonsky' + c.timezone 'Asia/Magadan', 1787, 30, 754, 5, 'MSK+08 - Magadan' + c.timezone 'Asia/Sakhalin', 1409, 30, 1427, 10, 'MSK+08 - Sakhalin Island' + c.timezone 'Asia/Srednekolymsk', 1012, 15, 9223, 60, 'MSK+08 - Sakha (E); North Kuril Is' + c.timezone 'Asia/Kamchatka', 3181, 60, 3173, 20, 'MSK+09 - Kamchatka' + c.timezone 'Asia/Anadyr', 259, 4, 10649, 60, 'MSK+09 - Bering Sea' + end + country 'RW', 'Rwanda' do |c| + c.timezone 'Africa/Maputo', -779, 30, 391, 12, 'Central Africa Time' + end + country 'SA', 'Saudi Arabia' do |c| + c.timezone 'Asia/Riyadh', 739, 30, 2803, 60 + end + country 'SB', 'Solomon Islands' do |c| + c.timezone 'Pacific/Guadalcanal', -143, 15, 801, 5 + end + country 'SC', 'Seychelles' do |c| + c.timezone 'Indian/Mahe', -14, 3, 832, 15 + end + country 'SD', 'Sudan' do |c| + c.timezone 'Africa/Khartoum', 78, 5, 488, 15 + end + country 'SE', 'Sweden' do |c| + c.timezone 'Europe/Stockholm', 178, 3, 361, 20 + end + country 'SG', 'Singapore' do |c| + c.timezone 'Asia/Singapore', 77, 60, 2077, 20 + end + country 'SH', 'St Helena' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'SI', 'Slovenia' do |c| + c.timezone 'Europe/Belgrade', 269, 6, 41, 2 + end + country 'SJ', 'Svalbard & Jan Mayen' do |c| + c.timezone 'Europe/Oslo', 719, 12, 43, 4 + end + country 'SK', 'Slovakia' do |c| + c.timezone 'Europe/Prague', 601, 12, 433, 30 + end + country 'SL', 'Sierra Leone' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'SM', 'San Marino' do |c| + c.timezone 'Europe/Rome', 419, 10, 749, 60 + end + country 'SN', 'Senegal' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'SO', 'Somalia' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'SR', 'Suriname' do |c| + c.timezone 'America/Paramaribo', 35, 6, -331, 6 + end + country 'SS', 'South Sudan' do |c| + c.timezone 'Africa/Juba', 97, 20, 1897, 60 + end + country 'ST', 'Sao Tome & Principe' do |c| + c.timezone 'Africa/Sao_Tome', 1, 3, 101, 15 + end + country 'SV', 'El Salvador' do |c| + c.timezone 'America/El_Salvador', 137, 10, -446, 5 + end + country 'SX', 'St Maarten (Dutch)' do |c| + c.timezone 'America/Curacao', 731, 60, -69, 1 + end + country 'SY', 'Syria' do |c| + c.timezone 'Asia/Damascus', 67, 2, 363, 10 + end + country 'SZ', 'Eswatini (Swaziland)' do |c| + c.timezone 'Africa/Johannesburg', -105, 4, 28, 1 + end + country 'TC', 'Turks & Caicos Is' do |c| + c.timezone 'America/Grand_Turk', 322, 15, -1067, 15 + end + country 'TD', 'Chad' do |c| + c.timezone 'Africa/Ndjamena', 727, 60, 301, 20 + end + country 'TF', 'French Southern & Antarctic Lands' do |c| + c.timezone 'Indian/Kerguelen', -17767, 360, 28087, 400, 'Kerguelen, St Paul Island, Amsterdam Island' + c.timezone 'Indian/Reunion', -313, 15, 832, 15, 'Réunion, Crozet, Scattered Islands' + end + country 'TG', 'Togo' do |c| + c.timezone 'Africa/Abidjan', 319, 60, -121, 30 + end + country 'TH', 'Thailand' do |c| + c.timezone 'Asia/Bangkok', 55, 4, 6031, 60, 'Indochina (most areas)' + end + country 'TJ', 'Tajikistan' do |c| + c.timezone 'Asia/Dushanbe', 463, 12, 344, 5 + end + country 'TK', 'Tokelau' do |c| + c.timezone 'Pacific/Fakaofo', -281, 30, -5137, 30 + end + country 'TL', 'East Timor' do |c| + c.timezone 'Asia/Dili', -171, 20, 1507, 12 + end + country 'TM', 'Turkmenistan' do |c| + c.timezone 'Asia/Ashgabat', 759, 20, 3503, 60 + end + country 'TN', 'Tunisia' do |c| + c.timezone 'Africa/Tunis', 184, 5, 611, 60 + end + country 'TO', 'Tonga' do |c| + c.timezone 'Pacific/Tongatapu', -127, 6, -1051, 6 + end + country 'TR', 'Turkey' do |c| + c.timezone 'Europe/Istanbul', 2461, 60, 869, 30 + end + country 'TT', 'Trinidad & Tobago' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'TV', 'Tuvalu' do |c| + c.timezone 'Pacific/Funafuti', -511, 60, 10753, 60 + end + country 'TW', 'Taiwan' do |c| + c.timezone 'Asia/Taipei', 501, 20, 243, 2 + end + country 'TZ', 'Tanzania' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'UA', 'Ukraine' do |c| + c.timezone 'Europe/Kiev', 1513, 30, 1831, 60, 'Ukraine (most areas)' + c.timezone 'Europe/Uzhgorod', 2917, 60, 223, 10, 'Transcarpathia' + c.timezone 'Europe/Zaporozhye', 287, 6, 211, 6, 'Zaporozhye and east Lugansk' + c.timezone 'Europe/Simferopol', 899, 20, 341, 10, 'Crimea' + end + country 'UG', 'Uganda' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'UM', 'US minor outlying islands' do |c| + c.timezone 'Pacific/Wake', 1157, 60, 9997, 60, 'Wake Island' + c.timezone 'Pacific/Pago_Pago', -214, 15, -1707, 10, 'Samoa, Midway' + c.timezone 'Pacific/Honolulu', 15341, 720, -18943, 120, 'Hawaii' + end + country 'US', 'United States' do |c| + c.timezone 'America/New_York', 48857, 1200, -266423, 3600, 'Eastern (most areas)' + c.timezone 'America/Detroit', 152393, 3600, -19931, 240, 'Eastern - MI (most areas)' + c.timezone 'America/Kentucky/Louisville', 9181, 240, -154367, 1800, 'Eastern - KY (Louisville area)' + c.timezone 'America/Kentucky/Monticello', 132587, 3600, -101819, 1200, 'Eastern - KY (Wayne)' + c.timezone 'America/Indiana/Indianapolis', 23861, 600, -310169, 3600, 'Eastern - IN (most areas)' + c.timezone 'America/Indiana/Vincennes', 69619, 1800, -315103, 3600, 'Eastern - IN (Da, Du, K, Mn)' + c.timezone 'America/Indiana/Winamac', 29557, 720, -311771, 3600, 'Eastern - IN (Pulaski)' + c.timezone 'America/Indiana/Marengo', 17269, 450, -310841, 3600, 'Eastern - IN (Crawford)' + c.timezone 'America/Indiana/Petersburg', 138571, 3600, -314203, 3600, 'Eastern - IN (Pike)' + c.timezone 'America/Indiana/Vevay', 34873, 900, -153121, 1800, 'Eastern - IN (Switzerland)' + c.timezone 'America/Chicago', 837, 20, -1753, 20, 'Central (most areas)' + c.timezone 'America/Indiana/Tell_City', 136631, 3600, -312341, 3600, 'Central - IN (Perry)' + c.timezone 'America/Indiana/Knox', 9911, 240, -693, 8, 'Central - IN (Starke)' + c.timezone 'America/Menominee', 40597, 900, -105137, 1200, 'Central - MI (Wisconsin border)' + c.timezone 'America/North_Dakota/Center', 169619, 3600, -121559, 1200, 'Central - ND (Oliver)' + c.timezone 'America/North_Dakota/New_Salem', 9369, 200, -121693, 1200, 'Central - ND (Morton rural)' + c.timezone 'America/North_Dakota/Beulah', 56717, 1200, -916, 9, 'Central - ND (Mercer)' + c.timezone 'America/Denver', 47687, 1200, -125981, 1200, 'Mountain (most areas)' + c.timezone 'America/Boise', 157009, 3600, -46481, 400, 'Mountain - ID (south); OR (east)' + c.timezone 'America/Phoenix', 20069, 600, -16811, 150, 'MST - Arizona (except Navajo)' + c.timezone 'America/Los_Angeles', 30647, 900, -212837, 1800, 'Pacific' + c.timezone 'America/Anchorage', 44077, 720, -539641, 3600, 'Alaska (most areas)' + c.timezone 'America/Juneau', 209887, 3600, -483911, 3600, 'Alaska - Juneau area' + c.timezone 'America/Sitka', 41167, 720, -487087, 3600, 'Alaska - Sitka area' + c.timezone 'America/Metlakatla', 198457, 3600, -18947, 144, 'Alaska - Annette Island' + c.timezone 'America/Yakutat', 214369, 3600, -251509, 1800, 'Alaska - Yakutat' + c.timezone 'America/Nome', 58051, 900, -595463, 3600, 'Alaska (west)' + c.timezone 'America/Adak', 1297, 25, -635969, 3600, 'Aleutian Islands' + c.timezone 'Pacific/Honolulu', 15341, 720, -18943, 120, 'Hawaii' + end + country 'UY', 'Uruguay' do |c| + c.timezone 'America/Montevideo', -41891, 1200, -4497, 80 + end + country 'UZ', 'Uzbekistan' do |c| + c.timezone 'Asia/Samarkand', 119, 3, 334, 5, 'Uzbekistan (west)' + c.timezone 'Asia/Tashkent', 124, 3, 693, 10, 'Uzbekistan (east)' + end + country 'VA', 'Vatican City' do |c| + c.timezone 'Europe/Rome', 419, 10, 749, 60 + end + country 'VC', 'St Vincent' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'VE', 'Venezuela' do |c| + c.timezone 'America/Caracas', 21, 2, -1004, 15 + end + country 'VG', 'Virgin Islands (UK)' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'VI', 'Virgin Islands (US)' do |c| + c.timezone 'America/Port_of_Spain', 213, 20, -3691, 60 + end + country 'VN', 'Vietnam' do |c| + c.timezone 'Asia/Ho_Chi_Minh', 43, 4, 320, 3, 'Vietnam (south)' + c.timezone 'Asia/Bangkok', 55, 4, 6031, 60, 'Indochina (most areas)' + end + country 'VU', 'Vanuatu' do |c| + c.timezone 'Pacific/Efate', -53, 3, 2021, 12 + end + country 'WF', 'Wallis & Futuna' do |c| + c.timezone 'Pacific/Wallis', -133, 10, -1057, 6 + end + country 'WS', 'Samoa (western)' do |c| + c.timezone 'Pacific/Apia', -83, 6, -2576, 15 + end + country 'YE', 'Yemen' do |c| + c.timezone 'Asia/Riyadh', 739, 30, 2803, 60 + end + country 'YT', 'Mayotte' do |c| + c.timezone 'Africa/Nairobi', -77, 60, 2209, 60 + end + country 'ZA', 'South Africa' do |c| + c.timezone 'Africa/Johannesburg', -105, 4, 28, 1 + end + country 'ZM', 'Zambia' do |c| + c.timezone 'Africa/Maputo', -779, 30, 391, 12, 'Central Africa Time' + end + country 'ZW', 'Zimbabwe' do |c| + c.timezone 'Africa/Maputo', -779, 30, 391, 12, 'Central Africa Time' + end + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/indexes/timezones.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/indexes/timezones.rb new file mode 100644 index 000000000000..a42a257308e3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/indexes/timezones.rb @@ -0,0 +1,609 @@ +# encoding: UTF-8 + +# This file contains data derived from the IANA Time Zone Database +# (https://www.iana.org/time-zones). + +module TZInfo + module Data + module Indexes + module Timezones + include TimezoneIndexDefinition + + timezone 'Africa/Abidjan' + timezone 'Africa/Accra' + linked_timezone 'Africa/Addis_Ababa' + timezone 'Africa/Algiers' + linked_timezone 'Africa/Asmara' + linked_timezone 'Africa/Asmera' + linked_timezone 'Africa/Bamako' + linked_timezone 'Africa/Bangui' + linked_timezone 'Africa/Banjul' + timezone 'Africa/Bissau' + linked_timezone 'Africa/Blantyre' + linked_timezone 'Africa/Brazzaville' + linked_timezone 'Africa/Bujumbura' + timezone 'Africa/Cairo' + timezone 'Africa/Casablanca' + timezone 'Africa/Ceuta' + linked_timezone 'Africa/Conakry' + linked_timezone 'Africa/Dakar' + linked_timezone 'Africa/Dar_es_Salaam' + linked_timezone 'Africa/Djibouti' + linked_timezone 'Africa/Douala' + timezone 'Africa/El_Aaiun' + linked_timezone 'Africa/Freetown' + linked_timezone 'Africa/Gaborone' + linked_timezone 'Africa/Harare' + timezone 'Africa/Johannesburg' + timezone 'Africa/Juba' + linked_timezone 'Africa/Kampala' + timezone 'Africa/Khartoum' + linked_timezone 'Africa/Kigali' + linked_timezone 'Africa/Kinshasa' + timezone 'Africa/Lagos' + linked_timezone 'Africa/Libreville' + linked_timezone 'Africa/Lome' + linked_timezone 'Africa/Luanda' + linked_timezone 'Africa/Lubumbashi' + linked_timezone 'Africa/Lusaka' + linked_timezone 'Africa/Malabo' + timezone 'Africa/Maputo' + linked_timezone 'Africa/Maseru' + linked_timezone 'Africa/Mbabane' + linked_timezone 'Africa/Mogadishu' + timezone 'Africa/Monrovia' + timezone 'Africa/Nairobi' + timezone 'Africa/Ndjamena' + linked_timezone 'Africa/Niamey' + linked_timezone 'Africa/Nouakchott' + linked_timezone 'Africa/Ouagadougou' + linked_timezone 'Africa/Porto-Novo' + timezone 'Africa/Sao_Tome' + linked_timezone 'Africa/Timbuktu' + timezone 'Africa/Tripoli' + timezone 'Africa/Tunis' + timezone 'Africa/Windhoek' + timezone 'America/Adak' + timezone 'America/Anchorage' + linked_timezone 'America/Anguilla' + linked_timezone 'America/Antigua' + timezone 'America/Araguaina' + timezone 'America/Argentina/Buenos_Aires' + timezone 'America/Argentina/Catamarca' + linked_timezone 'America/Argentina/ComodRivadavia' + timezone 'America/Argentina/Cordoba' + timezone 'America/Argentina/Jujuy' + timezone 'America/Argentina/La_Rioja' + timezone 'America/Argentina/Mendoza' + timezone 'America/Argentina/Rio_Gallegos' + timezone 'America/Argentina/Salta' + timezone 'America/Argentina/San_Juan' + timezone 'America/Argentina/San_Luis' + timezone 'America/Argentina/Tucuman' + timezone 'America/Argentina/Ushuaia' + linked_timezone 'America/Aruba' + timezone 'America/Asuncion' + timezone 'America/Atikokan' + linked_timezone 'America/Atka' + timezone 'America/Bahia' + timezone 'America/Bahia_Banderas' + timezone 'America/Barbados' + timezone 'America/Belem' + timezone 'America/Belize' + timezone 'America/Blanc-Sablon' + timezone 'America/Boa_Vista' + timezone 'America/Bogota' + timezone 'America/Boise' + linked_timezone 'America/Buenos_Aires' + timezone 'America/Cambridge_Bay' + timezone 'America/Campo_Grande' + timezone 'America/Cancun' + timezone 'America/Caracas' + linked_timezone 'America/Catamarca' + timezone 'America/Cayenne' + linked_timezone 'America/Cayman' + timezone 'America/Chicago' + timezone 'America/Chihuahua' + linked_timezone 'America/Coral_Harbour' + linked_timezone 'America/Cordoba' + timezone 'America/Costa_Rica' + timezone 'America/Creston' + timezone 'America/Cuiaba' + timezone 'America/Curacao' + timezone 'America/Danmarkshavn' + timezone 'America/Dawson' + timezone 'America/Dawson_Creek' + timezone 'America/Denver' + timezone 'America/Detroit' + linked_timezone 'America/Dominica' + timezone 'America/Edmonton' + timezone 'America/Eirunepe' + timezone 'America/El_Salvador' + linked_timezone 'America/Ensenada' + timezone 'America/Fort_Nelson' + linked_timezone 'America/Fort_Wayne' + timezone 'America/Fortaleza' + timezone 'America/Glace_Bay' + linked_timezone 'America/Godthab' + timezone 'America/Goose_Bay' + timezone 'America/Grand_Turk' + linked_timezone 'America/Grenada' + linked_timezone 'America/Guadeloupe' + timezone 'America/Guatemala' + timezone 'America/Guayaquil' + timezone 'America/Guyana' + timezone 'America/Halifax' + timezone 'America/Havana' + timezone 'America/Hermosillo' + timezone 'America/Indiana/Indianapolis' + timezone 'America/Indiana/Knox' + timezone 'America/Indiana/Marengo' + timezone 'America/Indiana/Petersburg' + timezone 'America/Indiana/Tell_City' + timezone 'America/Indiana/Vevay' + timezone 'America/Indiana/Vincennes' + timezone 'America/Indiana/Winamac' + linked_timezone 'America/Indianapolis' + timezone 'America/Inuvik' + timezone 'America/Iqaluit' + timezone 'America/Jamaica' + linked_timezone 'America/Jujuy' + timezone 'America/Juneau' + timezone 'America/Kentucky/Louisville' + timezone 'America/Kentucky/Monticello' + linked_timezone 'America/Knox_IN' + linked_timezone 'America/Kralendijk' + timezone 'America/La_Paz' + timezone 'America/Lima' + timezone 'America/Los_Angeles' + linked_timezone 'America/Louisville' + linked_timezone 'America/Lower_Princes' + timezone 'America/Maceio' + timezone 'America/Managua' + timezone 'America/Manaus' + linked_timezone 'America/Marigot' + timezone 'America/Martinique' + timezone 'America/Matamoros' + timezone 'America/Mazatlan' + linked_timezone 'America/Mendoza' + timezone 'America/Menominee' + timezone 'America/Merida' + timezone 'America/Metlakatla' + timezone 'America/Mexico_City' + timezone 'America/Miquelon' + timezone 'America/Moncton' + timezone 'America/Monterrey' + timezone 'America/Montevideo' + linked_timezone 'America/Montreal' + linked_timezone 'America/Montserrat' + timezone 'America/Nassau' + timezone 'America/New_York' + timezone 'America/Nipigon' + timezone 'America/Nome' + timezone 'America/Noronha' + timezone 'America/North_Dakota/Beulah' + timezone 'America/North_Dakota/Center' + timezone 'America/North_Dakota/New_Salem' + timezone 'America/Nuuk' + timezone 'America/Ojinaga' + timezone 'America/Panama' + timezone 'America/Pangnirtung' + timezone 'America/Paramaribo' + timezone 'America/Phoenix' + timezone 'America/Port-au-Prince' + timezone 'America/Port_of_Spain' + linked_timezone 'America/Porto_Acre' + timezone 'America/Porto_Velho' + timezone 'America/Puerto_Rico' + timezone 'America/Punta_Arenas' + timezone 'America/Rainy_River' + timezone 'America/Rankin_Inlet' + timezone 'America/Recife' + timezone 'America/Regina' + timezone 'America/Resolute' + timezone 'America/Rio_Branco' + linked_timezone 'America/Rosario' + linked_timezone 'America/Santa_Isabel' + timezone 'America/Santarem' + timezone 'America/Santiago' + timezone 'America/Santo_Domingo' + timezone 'America/Sao_Paulo' + timezone 'America/Scoresbysund' + linked_timezone 'America/Shiprock' + timezone 'America/Sitka' + linked_timezone 'America/St_Barthelemy' + timezone 'America/St_Johns' + linked_timezone 'America/St_Kitts' + linked_timezone 'America/St_Lucia' + linked_timezone 'America/St_Thomas' + linked_timezone 'America/St_Vincent' + timezone 'America/Swift_Current' + timezone 'America/Tegucigalpa' + timezone 'America/Thule' + timezone 'America/Thunder_Bay' + timezone 'America/Tijuana' + timezone 'America/Toronto' + linked_timezone 'America/Tortola' + timezone 'America/Vancouver' + linked_timezone 'America/Virgin' + timezone 'America/Whitehorse' + timezone 'America/Winnipeg' + timezone 'America/Yakutat' + timezone 'America/Yellowknife' + timezone 'Antarctica/Casey' + timezone 'Antarctica/Davis' + timezone 'Antarctica/DumontDUrville' + timezone 'Antarctica/Macquarie' + timezone 'Antarctica/Mawson' + linked_timezone 'Antarctica/McMurdo' + timezone 'Antarctica/Palmer' + timezone 'Antarctica/Rothera' + linked_timezone 'Antarctica/South_Pole' + timezone 'Antarctica/Syowa' + timezone 'Antarctica/Troll' + timezone 'Antarctica/Vostok' + linked_timezone 'Arctic/Longyearbyen' + linked_timezone 'Asia/Aden' + timezone 'Asia/Almaty' + timezone 'Asia/Amman' + timezone 'Asia/Anadyr' + timezone 'Asia/Aqtau' + timezone 'Asia/Aqtobe' + timezone 'Asia/Ashgabat' + linked_timezone 'Asia/Ashkhabad' + timezone 'Asia/Atyrau' + timezone 'Asia/Baghdad' + linked_timezone 'Asia/Bahrain' + timezone 'Asia/Baku' + timezone 'Asia/Bangkok' + timezone 'Asia/Barnaul' + timezone 'Asia/Beirut' + timezone 'Asia/Bishkek' + timezone 'Asia/Brunei' + linked_timezone 'Asia/Calcutta' + timezone 'Asia/Chita' + timezone 'Asia/Choibalsan' + linked_timezone 'Asia/Chongqing' + linked_timezone 'Asia/Chungking' + timezone 'Asia/Colombo' + linked_timezone 'Asia/Dacca' + timezone 'Asia/Damascus' + timezone 'Asia/Dhaka' + timezone 'Asia/Dili' + timezone 'Asia/Dubai' + timezone 'Asia/Dushanbe' + timezone 'Asia/Famagusta' + timezone 'Asia/Gaza' + linked_timezone 'Asia/Harbin' + timezone 'Asia/Hebron' + timezone 'Asia/Ho_Chi_Minh' + timezone 'Asia/Hong_Kong' + timezone 'Asia/Hovd' + timezone 'Asia/Irkutsk' + linked_timezone 'Asia/Istanbul' + timezone 'Asia/Jakarta' + timezone 'Asia/Jayapura' + timezone 'Asia/Jerusalem' + timezone 'Asia/Kabul' + timezone 'Asia/Kamchatka' + timezone 'Asia/Karachi' + linked_timezone 'Asia/Kashgar' + timezone 'Asia/Kathmandu' + linked_timezone 'Asia/Katmandu' + timezone 'Asia/Khandyga' + timezone 'Asia/Kolkata' + timezone 'Asia/Krasnoyarsk' + timezone 'Asia/Kuala_Lumpur' + timezone 'Asia/Kuching' + linked_timezone 'Asia/Kuwait' + linked_timezone 'Asia/Macao' + timezone 'Asia/Macau' + timezone 'Asia/Magadan' + timezone 'Asia/Makassar' + timezone 'Asia/Manila' + linked_timezone 'Asia/Muscat' + timezone 'Asia/Nicosia' + timezone 'Asia/Novokuznetsk' + timezone 'Asia/Novosibirsk' + timezone 'Asia/Omsk' + timezone 'Asia/Oral' + linked_timezone 'Asia/Phnom_Penh' + timezone 'Asia/Pontianak' + timezone 'Asia/Pyongyang' + timezone 'Asia/Qatar' + timezone 'Asia/Qostanay' + timezone 'Asia/Qyzylorda' + linked_timezone 'Asia/Rangoon' + timezone 'Asia/Riyadh' + linked_timezone 'Asia/Saigon' + timezone 'Asia/Sakhalin' + timezone 'Asia/Samarkand' + timezone 'Asia/Seoul' + timezone 'Asia/Shanghai' + timezone 'Asia/Singapore' + timezone 'Asia/Srednekolymsk' + timezone 'Asia/Taipei' + timezone 'Asia/Tashkent' + timezone 'Asia/Tbilisi' + timezone 'Asia/Tehran' + linked_timezone 'Asia/Tel_Aviv' + linked_timezone 'Asia/Thimbu' + timezone 'Asia/Thimphu' + timezone 'Asia/Tokyo' + timezone 'Asia/Tomsk' + linked_timezone 'Asia/Ujung_Pandang' + timezone 'Asia/Ulaanbaatar' + linked_timezone 'Asia/Ulan_Bator' + timezone 'Asia/Urumqi' + timezone 'Asia/Ust-Nera' + linked_timezone 'Asia/Vientiane' + timezone 'Asia/Vladivostok' + timezone 'Asia/Yakutsk' + timezone 'Asia/Yangon' + timezone 'Asia/Yekaterinburg' + timezone 'Asia/Yerevan' + timezone 'Atlantic/Azores' + timezone 'Atlantic/Bermuda' + timezone 'Atlantic/Canary' + timezone 'Atlantic/Cape_Verde' + linked_timezone 'Atlantic/Faeroe' + timezone 'Atlantic/Faroe' + linked_timezone 'Atlantic/Jan_Mayen' + timezone 'Atlantic/Madeira' + timezone 'Atlantic/Reykjavik' + timezone 'Atlantic/South_Georgia' + linked_timezone 'Atlantic/St_Helena' + timezone 'Atlantic/Stanley' + linked_timezone 'Australia/ACT' + timezone 'Australia/Adelaide' + timezone 'Australia/Brisbane' + timezone 'Australia/Broken_Hill' + linked_timezone 'Australia/Canberra' + timezone 'Australia/Currie' + timezone 'Australia/Darwin' + timezone 'Australia/Eucla' + timezone 'Australia/Hobart' + linked_timezone 'Australia/LHI' + timezone 'Australia/Lindeman' + timezone 'Australia/Lord_Howe' + timezone 'Australia/Melbourne' + linked_timezone 'Australia/NSW' + linked_timezone 'Australia/North' + timezone 'Australia/Perth' + linked_timezone 'Australia/Queensland' + linked_timezone 'Australia/South' + timezone 'Australia/Sydney' + linked_timezone 'Australia/Tasmania' + linked_timezone 'Australia/Victoria' + linked_timezone 'Australia/West' + linked_timezone 'Australia/Yancowinna' + linked_timezone 'Brazil/Acre' + linked_timezone 'Brazil/DeNoronha' + linked_timezone 'Brazil/East' + linked_timezone 'Brazil/West' + timezone 'CET' + timezone 'CST6CDT' + linked_timezone 'Canada/Atlantic' + linked_timezone 'Canada/Central' + linked_timezone 'Canada/Eastern' + linked_timezone 'Canada/Mountain' + linked_timezone 'Canada/Newfoundland' + linked_timezone 'Canada/Pacific' + linked_timezone 'Canada/Saskatchewan' + linked_timezone 'Canada/Yukon' + linked_timezone 'Chile/Continental' + linked_timezone 'Chile/EasterIsland' + linked_timezone 'Cuba' + timezone 'EET' + timezone 'EST' + timezone 'EST5EDT' + linked_timezone 'Egypt' + linked_timezone 'Eire' + timezone 'Etc/GMT' + linked_timezone 'Etc/GMT+0' + timezone 'Etc/GMT+1' + timezone 'Etc/GMT+10' + timezone 'Etc/GMT+11' + timezone 'Etc/GMT+12' + timezone 'Etc/GMT+2' + timezone 'Etc/GMT+3' + timezone 'Etc/GMT+4' + timezone 'Etc/GMT+5' + timezone 'Etc/GMT+6' + timezone 'Etc/GMT+7' + timezone 'Etc/GMT+8' + timezone 'Etc/GMT+9' + linked_timezone 'Etc/GMT-0' + timezone 'Etc/GMT-1' + timezone 'Etc/GMT-10' + timezone 'Etc/GMT-11' + timezone 'Etc/GMT-12' + timezone 'Etc/GMT-13' + timezone 'Etc/GMT-14' + timezone 'Etc/GMT-2' + timezone 'Etc/GMT-3' + timezone 'Etc/GMT-4' + timezone 'Etc/GMT-5' + timezone 'Etc/GMT-6' + timezone 'Etc/GMT-7' + timezone 'Etc/GMT-8' + timezone 'Etc/GMT-9' + linked_timezone 'Etc/GMT0' + linked_timezone 'Etc/Greenwich' + linked_timezone 'Etc/UCT' + timezone 'Etc/UTC' + linked_timezone 'Etc/Universal' + linked_timezone 'Etc/Zulu' + timezone 'Europe/Amsterdam' + timezone 'Europe/Andorra' + timezone 'Europe/Astrakhan' + timezone 'Europe/Athens' + linked_timezone 'Europe/Belfast' + timezone 'Europe/Belgrade' + timezone 'Europe/Berlin' + linked_timezone 'Europe/Bratislava' + timezone 'Europe/Brussels' + timezone 'Europe/Bucharest' + timezone 'Europe/Budapest' + linked_timezone 'Europe/Busingen' + timezone 'Europe/Chisinau' + timezone 'Europe/Copenhagen' + timezone 'Europe/Dublin' + timezone 'Europe/Gibraltar' + linked_timezone 'Europe/Guernsey' + timezone 'Europe/Helsinki' + linked_timezone 'Europe/Isle_of_Man' + timezone 'Europe/Istanbul' + linked_timezone 'Europe/Jersey' + timezone 'Europe/Kaliningrad' + timezone 'Europe/Kiev' + timezone 'Europe/Kirov' + timezone 'Europe/Lisbon' + linked_timezone 'Europe/Ljubljana' + timezone 'Europe/London' + timezone 'Europe/Luxembourg' + timezone 'Europe/Madrid' + timezone 'Europe/Malta' + linked_timezone 'Europe/Mariehamn' + timezone 'Europe/Minsk' + timezone 'Europe/Monaco' + timezone 'Europe/Moscow' + linked_timezone 'Europe/Nicosia' + timezone 'Europe/Oslo' + timezone 'Europe/Paris' + linked_timezone 'Europe/Podgorica' + timezone 'Europe/Prague' + timezone 'Europe/Riga' + timezone 'Europe/Rome' + timezone 'Europe/Samara' + linked_timezone 'Europe/San_Marino' + linked_timezone 'Europe/Sarajevo' + timezone 'Europe/Saratov' + timezone 'Europe/Simferopol' + linked_timezone 'Europe/Skopje' + timezone 'Europe/Sofia' + timezone 'Europe/Stockholm' + timezone 'Europe/Tallinn' + timezone 'Europe/Tirane' + linked_timezone 'Europe/Tiraspol' + timezone 'Europe/Ulyanovsk' + timezone 'Europe/Uzhgorod' + linked_timezone 'Europe/Vaduz' + linked_timezone 'Europe/Vatican' + timezone 'Europe/Vienna' + timezone 'Europe/Vilnius' + timezone 'Europe/Volgograd' + timezone 'Europe/Warsaw' + linked_timezone 'Europe/Zagreb' + timezone 'Europe/Zaporozhye' + timezone 'Europe/Zurich' + timezone 'Factory' + linked_timezone 'GB' + linked_timezone 'GB-Eire' + linked_timezone 'GMT' + linked_timezone 'GMT+0' + linked_timezone 'GMT-0' + linked_timezone 'GMT0' + linked_timezone 'Greenwich' + timezone 'HST' + linked_timezone 'Hongkong' + linked_timezone 'Iceland' + linked_timezone 'Indian/Antananarivo' + timezone 'Indian/Chagos' + timezone 'Indian/Christmas' + timezone 'Indian/Cocos' + linked_timezone 'Indian/Comoro' + timezone 'Indian/Kerguelen' + timezone 'Indian/Mahe' + timezone 'Indian/Maldives' + timezone 'Indian/Mauritius' + linked_timezone 'Indian/Mayotte' + timezone 'Indian/Reunion' + linked_timezone 'Iran' + linked_timezone 'Israel' + linked_timezone 'Jamaica' + linked_timezone 'Japan' + linked_timezone 'Kwajalein' + linked_timezone 'Libya' + timezone 'MET' + timezone 'MST' + timezone 'MST7MDT' + linked_timezone 'Mexico/BajaNorte' + linked_timezone 'Mexico/BajaSur' + linked_timezone 'Mexico/General' + linked_timezone 'NZ' + linked_timezone 'NZ-CHAT' + linked_timezone 'Navajo' + linked_timezone 'PRC' + timezone 'PST8PDT' + timezone 'Pacific/Apia' + timezone 'Pacific/Auckland' + timezone 'Pacific/Bougainville' + timezone 'Pacific/Chatham' + timezone 'Pacific/Chuuk' + timezone 'Pacific/Easter' + timezone 'Pacific/Efate' + timezone 'Pacific/Enderbury' + timezone 'Pacific/Fakaofo' + timezone 'Pacific/Fiji' + timezone 'Pacific/Funafuti' + timezone 'Pacific/Galapagos' + timezone 'Pacific/Gambier' + timezone 'Pacific/Guadalcanal' + timezone 'Pacific/Guam' + timezone 'Pacific/Honolulu' + linked_timezone 'Pacific/Johnston' + timezone 'Pacific/Kiritimati' + timezone 'Pacific/Kosrae' + timezone 'Pacific/Kwajalein' + timezone 'Pacific/Majuro' + timezone 'Pacific/Marquesas' + linked_timezone 'Pacific/Midway' + timezone 'Pacific/Nauru' + timezone 'Pacific/Niue' + timezone 'Pacific/Norfolk' + timezone 'Pacific/Noumea' + timezone 'Pacific/Pago_Pago' + timezone 'Pacific/Palau' + timezone 'Pacific/Pitcairn' + timezone 'Pacific/Pohnpei' + linked_timezone 'Pacific/Ponape' + timezone 'Pacific/Port_Moresby' + timezone 'Pacific/Rarotonga' + linked_timezone 'Pacific/Saipan' + linked_timezone 'Pacific/Samoa' + timezone 'Pacific/Tahiti' + timezone 'Pacific/Tarawa' + timezone 'Pacific/Tongatapu' + linked_timezone 'Pacific/Truk' + timezone 'Pacific/Wake' + timezone 'Pacific/Wallis' + linked_timezone 'Pacific/Yap' + linked_timezone 'Poland' + linked_timezone 'Portugal' + linked_timezone 'ROC' + linked_timezone 'ROK' + linked_timezone 'Singapore' + linked_timezone 'Turkey' + linked_timezone 'UCT' + linked_timezone 'US/Alaska' + linked_timezone 'US/Aleutian' + linked_timezone 'US/Arizona' + linked_timezone 'US/Central' + linked_timezone 'US/East-Indiana' + linked_timezone 'US/Eastern' + linked_timezone 'US/Hawaii' + linked_timezone 'US/Indiana-Starke' + linked_timezone 'US/Michigan' + linked_timezone 'US/Mountain' + linked_timezone 'US/Pacific' + linked_timezone 'US/Samoa' + linked_timezone 'UTC' + linked_timezone 'Universal' + linked_timezone 'W-SU' + timezone 'WET' + linked_timezone 'Zulu' + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/version.rb b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/version.rb new file mode 100644 index 000000000000..51e2d31a3c87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/tzinfo-data/tzinfo/data/version.rb @@ -0,0 +1,20 @@ +module TZInfo + module Data + # TZInfo::Data version number. + VERSION = '1.2020.4' + + # TZInfo::Data version information. + module Version + # The format of the Ruby modules. The only format currently supported by + # TZInfo is version 1. + FORMAT = 1 + + # TZInfo::Data version number. + STRING = VERSION + + # The version of the {IANA Time Zone Database}[https://www.iana.org/time-zones] + # used to generate this version of TZInfo::Data. + TZDATA = '2020d' + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/America/Argentina/Buenos_Aires b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/America/Argentina/Buenos_Aires new file mode 100644 index 000000000000..d6f999b8605c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/America/Argentina/Buenos_Aires differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/America/New_York b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/America/New_York new file mode 100644 index 000000000000..2b6c2eea14df Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/America/New_York differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Australia/Melbourne b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Australia/Melbourne new file mode 100644 index 000000000000..c7160da33f3e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Australia/Melbourne differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/EST b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/EST new file mode 100644 index 000000000000..3ae969114563 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/EST differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Etc/UTC b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Etc/UTC new file mode 100644 index 000000000000..00841a62213e Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Etc/UTC differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Amsterdam b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Amsterdam new file mode 100644 index 000000000000..4a6fa1d4945d Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Amsterdam differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Andorra b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Andorra new file mode 100644 index 000000000000..38685d4219d2 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Andorra differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/London b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/London new file mode 100644 index 000000000000..323cd3818ac6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/London differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Paris b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Paris new file mode 100644 index 000000000000..00a27264c2cb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Paris differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Prague b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Prague new file mode 100644 index 000000000000..fb7c145ac4c8 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Europe/Prague differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Factory b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Factory new file mode 100644 index 000000000000..b4dd7735ed5b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/Factory differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/iso3166.tab b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/iso3166.tab new file mode 100644 index 000000000000..a4ff61a4d321 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/iso3166.tab @@ -0,0 +1,274 @@ +# ISO 3166 alpha-2 country codes +# +# This file is in the public domain, so clarified as of +# 2009-05-17 by Arthur David Olson. +# +# From Paul Eggert (2015-05-02): +# This file contains a table of two-letter country codes. Columns are +# separated by a single tab. Lines beginning with '#' are comments. +# All text uses UTF-8 encoding. The columns of the table are as follows: +# +# 1. ISO 3166-1 alpha-2 country code, current as of +# ISO 3166-1 N976 (2018-11-06). See: Updates on ISO 3166-1 +# https://isotc.iso.org/livelink/livelink/Open/16944257 +# 2. The usual English name for the coded region, +# chosen so that alphabetic sorting of subsets produces helpful lists. +# This is not the same as the English name in the ISO 3166 tables. +# +# The table is sorted by country code. +# +# This table is intended as an aid for users, to help them select time +# zone data appropriate for their practical needs. It is not intended +# to take or endorse any position on legal or territorial claims. +# +#country- +#code name of country, territory, area, or subdivision +AD Andorra +AE United Arab Emirates +AF Afghanistan +AG Antigua & Barbuda +AI Anguilla +AL Albania +AM Armenia +AO Angola +AQ Antarctica +AR Argentina +AS Samoa (American) +AT Austria +AU Australia +AW Aruba +AX Åland Islands +AZ Azerbaijan +BA Bosnia & Herzegovina +BB Barbados +BD Bangladesh +BE Belgium +BF Burkina Faso +BG Bulgaria +BH Bahrain +BI Burundi +BJ Benin +BL St Barthelemy +BM Bermuda +BN Brunei +BO Bolivia +BQ Caribbean NL +BR Brazil +BS Bahamas +BT Bhutan +BV Bouvet Island +BW Botswana +BY Belarus +BZ Belize +CA Canada +CC Cocos (Keeling) Islands +CD Congo (Dem. Rep.) +CF Central African Rep. +CG Congo (Rep.) +CH Switzerland +CI Côte d'Ivoire +CK Cook Islands +CL Chile +CM Cameroon +CN China +CO Colombia +CR Costa Rica +CU Cuba +CV Cape Verde +CW Curaçao +CX Christmas Island +CY Cyprus +CZ Czech Republic +DE Germany +DJ Djibouti +DK Denmark +DM Dominica +DO Dominican Republic +DZ Algeria +EC Ecuador +EE Estonia +EG Egypt +EH Western Sahara +ER Eritrea +ES Spain +ET Ethiopia +FI Finland +FJ Fiji +FK Falkland Islands +FM Micronesia +FO Faroe Islands +FR France +GA Gabon +GB Britain (UK) +GD Grenada +GE Georgia +GF French Guiana +GG Guernsey +GH Ghana +GI Gibraltar +GL Greenland +GM Gambia +GN Guinea +GP Guadeloupe +GQ Equatorial Guinea +GR Greece +GS South Georgia & the South Sandwich Islands +GT Guatemala +GU Guam +GW Guinea-Bissau +GY Guyana +HK Hong Kong +HM Heard Island & McDonald Islands +HN Honduras +HR Croatia +HT Haiti +HU Hungary +ID Indonesia +IE Ireland +IL Israel +IM Isle of Man +IN India +IO British Indian Ocean Territory +IQ Iraq +IR Iran +IS Iceland +IT Italy +JE Jersey +JM Jamaica +JO Jordan +JP Japan +KE Kenya +KG Kyrgyzstan +KH Cambodia +KI Kiribati +KM Comoros +KN St Kitts & Nevis +KP Korea (North) +KR Korea (South) +KW Kuwait +KY Cayman Islands +KZ Kazakhstan +LA Laos +LB Lebanon +LC St Lucia +LI Liechtenstein +LK Sri Lanka +LR Liberia +LS Lesotho +LT Lithuania +LU Luxembourg +LV Latvia +LY Libya +MA Morocco +MC Monaco +MD Moldova +ME Montenegro +MF St Martin (French) +MG Madagascar +MH Marshall Islands +MK North Macedonia +ML Mali +MM Myanmar (Burma) +MN Mongolia +MO Macau +MP Northern Mariana Islands +MQ Martinique +MR Mauritania +MS Montserrat +MT Malta +MU Mauritius +MV Maldives +MW Malawi +MX Mexico +MY Malaysia +MZ Mozambique +NA Namibia +NC New Caledonia +NE Niger +NF Norfolk Island +NG Nigeria +NI Nicaragua +NL Netherlands +NO Norway +NP Nepal +NR Nauru +NU Niue +NZ New Zealand +OM Oman +PA Panama +PE Peru +PF French Polynesia +PG Papua New Guinea +PH Philippines +PK Pakistan +PL Poland +PM St Pierre & Miquelon +PN Pitcairn +PR Puerto Rico +PS Palestine +PT Portugal +PW Palau +PY Paraguay +QA Qatar +RE Réunion +RO Romania +RS Serbia +RU Russia +RW Rwanda +SA Saudi Arabia +SB Solomon Islands +SC Seychelles +SD Sudan +SE Sweden +SG Singapore +SH St Helena +SI Slovenia +SJ Svalbard & Jan Mayen +SK Slovakia +SL Sierra Leone +SM San Marino +SN Senegal +SO Somalia +SR Suriname +SS South Sudan +ST Sao Tome & Principe +SV El Salvador +SX St Maarten (Dutch) +SY Syria +SZ Eswatini (Swaziland) +TC Turks & Caicos Is +TD Chad +TF French Southern & Antarctic Lands +TG Togo +TH Thailand +TJ Tajikistan +TK Tokelau +TL East Timor +TM Turkmenistan +TN Tunisia +TO Tonga +TR Turkey +TT Trinidad & Tobago +TV Tuvalu +TW Taiwan +TZ Tanzania +UA Ukraine +UG Uganda +UM US minor outlying islands +US United States +UY Uruguay +UZ Uzbekistan +VA Vatican City +VC St Vincent +VE Venezuela +VG Virgin Islands (UK) +VI Virgin Islands (US) +VN Vietnam +VU Vanuatu +WF Wallis & Futuna +WS Samoa (western) +YE Yemen +YT Mayotte +ZA South Africa +ZM Zambia +ZW Zimbabwe diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/leapseconds b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/leapseconds new file mode 100644 index 000000000000..3ce3ab21f8d8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/leapseconds @@ -0,0 +1,78 @@ +# Allowance for leap seconds added to each time zone file. + +# This file is in the public domain. + +# This file is generated automatically from the data in the public-domain +# NIST format leap-seconds.list file, which can be copied from +# <ftp://ftp.nist.gov/pub/time/leap-seconds.list> +# or <ftp://ftp.boulder.nist.gov/pub/time/leap-seconds.list>. +# For more about leap-seconds.list, please see +# The NTP Timescale and Leap Seconds +# <https://www.eecis.udel.edu/~mills/leap.html>. + +# The rules for leap seconds are specified in Annex 1 (Time scales) of: +# Standard-frequency and time-signal emissions. +# International Telecommunication Union - Radiocommunication Sector +# (ITU-R) Recommendation TF.460-6 (02/2002) +# <https://www.itu.int/rec/R-REC-TF.460-6-200202-I/>. +# The International Earth Rotation and Reference Systems Service (IERS) +# periodically uses leap seconds to keep UTC to within 0.9 s of UT1 +# (a proxy for Earth's angle in space as measured by astronomers) +# and publishes leap second data in a copyrighted file +# <https://hpiers.obspm.fr/iers/bul/bulc/Leap_Second.dat>. +# See: Levine J. Coordinated Universal Time and the leap second. +# URSI Radio Sci Bull. 2016;89(4):30-6. doi:10.23919/URSIRSB.2016.7909995 +# <https://ieeexplore.ieee.org/document/7909995>. + +# There were no leap seconds before 1972, as no official mechanism +# accounted for the discrepancy between atomic time (TAI) and the earth's +# rotation. The first ("1 Jan 1972") data line in leap-seconds.list +# does not denote a leap second; it denotes the start of the current definition +# of UTC. + +# All leap-seconds are Stationary (S) at the given UTC time. +# The correction (+ or -) is made at the given time, so in the unlikely +# event of a negative leap second, a line would look like this: +# Leap YEAR MON DAY 23:59:59 - S +# Typical lines look like this: +# Leap YEAR MON DAY 23:59:60 + S +Leap 1972 Jun 30 23:59:60 + S +Leap 1972 Dec 31 23:59:60 + S +Leap 1973 Dec 31 23:59:60 + S +Leap 1974 Dec 31 23:59:60 + S +Leap 1975 Dec 31 23:59:60 + S +Leap 1976 Dec 31 23:59:60 + S +Leap 1977 Dec 31 23:59:60 + S +Leap 1978 Dec 31 23:59:60 + S +Leap 1979 Dec 31 23:59:60 + S +Leap 1981 Jun 30 23:59:60 + S +Leap 1982 Jun 30 23:59:60 + S +Leap 1983 Jun 30 23:59:60 + S +Leap 1985 Jun 30 23:59:60 + S +Leap 1987 Dec 31 23:59:60 + S +Leap 1989 Dec 31 23:59:60 + S +Leap 1990 Dec 31 23:59:60 + S +Leap 1992 Jun 30 23:59:60 + S +Leap 1993 Jun 30 23:59:60 + S +Leap 1994 Jun 30 23:59:60 + S +Leap 1995 Dec 31 23:59:60 + S +Leap 1997 Jun 30 23:59:60 + S +Leap 1998 Dec 31 23:59:60 + S +Leap 2005 Dec 31 23:59:60 + S +Leap 2008 Dec 31 23:59:60 + S +Leap 2012 Jun 30 23:59:60 + S +Leap 2015 Jun 30 23:59:60 + S +Leap 2016 Dec 31 23:59:60 + S + +# UTC timestamp when this leap second list expires. +# Any additional leap seconds will come after this. +# This Expires line is commented out for now, +# so that pre-2020a zic implementations do not reject this file. +#Expires 2021 Jun 28 00:00:00 + +# POSIX timestamps for the data in this file: +#updated 1467936000 (2016-07-08 00:00:00 UTC) +#expires 1624838400 (2021-06-28 00:00:00 UTC) + +# Updated through IERS Bulletin C60 +# File expires on: 28 June 2021 diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/posix/Europe/London b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/posix/Europe/London new file mode 100644 index 000000000000..323cd3818ac6 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/posix/Europe/London differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/posixrules b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/posixrules new file mode 100644 index 000000000000..2b6c2eea14df Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/posixrules differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/right/Europe/London b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/right/Europe/London new file mode 100644 index 000000000000..9b8560d27c5b Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/right/Europe/London differ diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/zone.tab b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/zone.tab new file mode 100644 index 000000000000..8d056e374835 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/zone.tab @@ -0,0 +1,452 @@ +# tzdb timezone descriptions (deprecated version) +# +# This file is in the public domain, so clarified as of +# 2009-05-17 by Arthur David Olson. +# +# From Paul Eggert (2018-06-27): +# This file is intended as a backward-compatibility aid for older programs. +# New programs should use zone1970.tab. This file is like zone1970.tab (see +# zone1970.tab's comments), but with the following additional restrictions: +# +# 1. This file contains only ASCII characters. +# 2. The first data column contains exactly one country code. +# +# Because of (2), each row stands for an area that is the intersection +# of a region identified by a country code and of a timezone where civil +# clocks have agreed since 1970; this is a narrower definition than +# that of zone1970.tab. +# +# This table is intended as an aid for users, to help them select timezones +# appropriate for their practical needs. It is not intended to take or +# endorse any position on legal or territorial claims. +# +#country- +#code coordinates TZ comments +AD +4230+00131 Europe/Andorra +AE +2518+05518 Asia/Dubai +AF +3431+06912 Asia/Kabul +AG +1703-06148 America/Antigua +AI +1812-06304 America/Anguilla +AL +4120+01950 Europe/Tirane +AM +4011+04430 Asia/Yerevan +AO -0848+01314 Africa/Luanda +AQ -7750+16636 Antarctica/McMurdo New Zealand time - McMurdo, South Pole +AQ -6617+11031 Antarctica/Casey Casey +AQ -6835+07758 Antarctica/Davis Davis +AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville +AQ -6736+06253 Antarctica/Mawson Mawson +AQ -6448-06406 Antarctica/Palmer Palmer +AQ -6734-06808 Antarctica/Rothera Rothera +AQ -690022+0393524 Antarctica/Syowa Syowa +AQ -720041+0023206 Antarctica/Troll Troll +AQ -7824+10654 Antarctica/Vostok Vostok +AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) +AR -3124-06411 America/Argentina/Cordoba Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF) +AR -2447-06525 America/Argentina/Salta Salta (SA, LP, NQ, RN) +AR -2411-06518 America/Argentina/Jujuy Jujuy (JY) +AR -2649-06513 America/Argentina/Tucuman Tucuman (TM) +AR -2828-06547 America/Argentina/Catamarca Catamarca (CT); Chubut (CH) +AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR) +AR -3132-06831 America/Argentina/San_Juan San Juan (SJ) +AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ) +AR -3319-06621 America/Argentina/San_Luis San Luis (SL) +AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC) +AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF) +AS -1416-17042 Pacific/Pago_Pago +AT +4813+01620 Europe/Vienna +AU -3133+15905 Australia/Lord_Howe Lord Howe Island +AU -5430+15857 Antarctica/Macquarie Macquarie Island +AU -4253+14719 Australia/Hobart Tasmania (most areas) +AU -3956+14352 Australia/Currie Tasmania (King Island) +AU -3749+14458 Australia/Melbourne Victoria +AU -3352+15113 Australia/Sydney New South Wales (most areas) +AU -3157+14127 Australia/Broken_Hill New South Wales (Yancowinna) +AU -2728+15302 Australia/Brisbane Queensland (most areas) +AU -2016+14900 Australia/Lindeman Queensland (Whitsunday Islands) +AU -3455+13835 Australia/Adelaide South Australia +AU -1228+13050 Australia/Darwin Northern Territory +AU -3157+11551 Australia/Perth Western Australia (most areas) +AU -3143+12852 Australia/Eucla Western Australia (Eucla) +AW +1230-06958 America/Aruba +AX +6006+01957 Europe/Mariehamn +AZ +4023+04951 Asia/Baku +BA +4352+01825 Europe/Sarajevo +BB +1306-05937 America/Barbados +BD +2343+09025 Asia/Dhaka +BE +5050+00420 Europe/Brussels +BF +1222-00131 Africa/Ouagadougou +BG +4241+02319 Europe/Sofia +BH +2623+05035 Asia/Bahrain +BI -0323+02922 Africa/Bujumbura +BJ +0629+00237 Africa/Porto-Novo +BL +1753-06251 America/St_Barthelemy +BM +3217-06446 Atlantic/Bermuda +BN +0456+11455 Asia/Brunei +BO -1630-06809 America/La_Paz +BQ +120903-0681636 America/Kralendijk +BR -0351-03225 America/Noronha Atlantic islands +BR -0127-04829 America/Belem Para (east); Amapa +BR -0343-03830 America/Fortaleza Brazil (northeast: MA, PI, CE, RN, PB) +BR -0803-03454 America/Recife Pernambuco +BR -0712-04812 America/Araguaina Tocantins +BR -0940-03543 America/Maceio Alagoas, Sergipe +BR -1259-03831 America/Bahia Bahia +BR -2332-04637 America/Sao_Paulo Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS) +BR -2027-05437 America/Campo_Grande Mato Grosso do Sul +BR -1535-05605 America/Cuiaba Mato Grosso +BR -0226-05452 America/Santarem Para (west) +BR -0846-06354 America/Porto_Velho Rondonia +BR +0249-06040 America/Boa_Vista Roraima +BR -0308-06001 America/Manaus Amazonas (east) +BR -0640-06952 America/Eirunepe Amazonas (west) +BR -0958-06748 America/Rio_Branco Acre +BS +2505-07721 America/Nassau +BT +2728+08939 Asia/Thimphu +BW -2439+02555 Africa/Gaborone +BY +5354+02734 Europe/Minsk +BZ +1730-08812 America/Belize +CA +4734-05243 America/St_Johns Newfoundland; Labrador (southeast) +CA +4439-06336 America/Halifax Atlantic - NS (most areas); PE +CA +4612-05957 America/Glace_Bay Atlantic - NS (Cape Breton) +CA +4606-06447 America/Moncton Atlantic - New Brunswick +CA +5320-06025 America/Goose_Bay Atlantic - Labrador (most areas) +CA +5125-05707 America/Blanc-Sablon AST - QC (Lower North Shore) +CA +4339-07923 America/Toronto Eastern - ON, QC (most areas) +CA +4901-08816 America/Nipigon Eastern - ON, QC (no DST 1967-73) +CA +4823-08915 America/Thunder_Bay Eastern - ON (Thunder Bay) +CA +6344-06828 America/Iqaluit Eastern - NU (most east areas) +CA +6608-06544 America/Pangnirtung Eastern - NU (Pangnirtung) +CA +484531-0913718 America/Atikokan EST - ON (Atikokan); NU (Coral H) +CA +4953-09709 America/Winnipeg Central - ON (west); Manitoba +CA +4843-09434 America/Rainy_River Central - ON (Rainy R, Ft Frances) +CA +744144-0944945 America/Resolute Central - NU (Resolute) +CA +624900-0920459 America/Rankin_Inlet Central - NU (central) +CA +5024-10439 America/Regina CST - SK (most areas) +CA +5017-10750 America/Swift_Current CST - SK (midwest) +CA +5333-11328 America/Edmonton Mountain - AB; BC (E); SK (W) +CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west) +CA +6227-11421 America/Yellowknife Mountain - NT (central) +CA +682059-1334300 America/Inuvik Mountain - NT (west) +CA +4906-11631 America/Creston MST - BC (Creston) +CA +5946-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John) +CA +5848-12242 America/Fort_Nelson MST - BC (Ft Nelson) +CA +4916-12307 America/Vancouver Pacific - BC (most areas) +CA +6043-13503 America/Whitehorse Pacific - Yukon (east) +CA +6404-13925 America/Dawson Pacific - Yukon (west) +CC -1210+09655 Indian/Cocos +CD -0418+01518 Africa/Kinshasa Dem. Rep. of Congo (west) +CD -1140+02728 Africa/Lubumbashi Dem. Rep. of Congo (east) +CF +0422+01835 Africa/Bangui +CG -0416+01517 Africa/Brazzaville +CH +4723+00832 Europe/Zurich +CI +0519-00402 Africa/Abidjan +CK -2114-15946 Pacific/Rarotonga +CL -3327-07040 America/Santiago Chile (most areas) +CL -5309-07055 America/Punta_Arenas Region of Magallanes +CL -2709-10926 Pacific/Easter Easter Island +CM +0403+00942 Africa/Douala +CN +3114+12128 Asia/Shanghai Beijing Time +CN +4348+08735 Asia/Urumqi Xinjiang Time +CO +0436-07405 America/Bogota +CR +0956-08405 America/Costa_Rica +CU +2308-08222 America/Havana +CV +1455-02331 Atlantic/Cape_Verde +CW +1211-06900 America/Curacao +CX -1025+10543 Indian/Christmas +CY +3510+03322 Asia/Nicosia Cyprus (most areas) +CY +3507+03357 Asia/Famagusta Northern Cyprus +CZ +5005+01426 Europe/Prague +DE +5230+01322 Europe/Berlin Germany (most areas) +DE +4742+00841 Europe/Busingen Busingen +DJ +1136+04309 Africa/Djibouti +DK +5540+01235 Europe/Copenhagen +DM +1518-06124 America/Dominica +DO +1828-06954 America/Santo_Domingo +DZ +3647+00303 Africa/Algiers +EC -0210-07950 America/Guayaquil Ecuador (mainland) +EC -0054-08936 Pacific/Galapagos Galapagos Islands +EE +5925+02445 Europe/Tallinn +EG +3003+03115 Africa/Cairo +EH +2709-01312 Africa/El_Aaiun +ER +1520+03853 Africa/Asmara +ES +4024-00341 Europe/Madrid Spain (mainland) +ES +3553-00519 Africa/Ceuta Ceuta, Melilla +ES +2806-01524 Atlantic/Canary Canary Islands +ET +0902+03842 Africa/Addis_Ababa +FI +6010+02458 Europe/Helsinki +FJ -1808+17825 Pacific/Fiji +FK -5142-05751 Atlantic/Stanley +FM +0725+15147 Pacific/Chuuk Chuuk/Truk, Yap +FM +0658+15813 Pacific/Pohnpei Pohnpei/Ponape +FM +0519+16259 Pacific/Kosrae Kosrae +FO +6201-00646 Atlantic/Faroe +FR +4852+00220 Europe/Paris +GA +0023+00927 Africa/Libreville +GB +513030-0000731 Europe/London +GD +1203-06145 America/Grenada +GE +4143+04449 Asia/Tbilisi +GF +0456-05220 America/Cayenne +GG +492717-0023210 Europe/Guernsey +GH +0533-00013 Africa/Accra +GI +3608-00521 Europe/Gibraltar +GL +6411-05144 America/Nuuk Greenland (most areas) +GL +7646-01840 America/Danmarkshavn National Park (east coast) +GL +7029-02158 America/Scoresbysund Scoresbysund/Ittoqqortoormiit +GL +7634-06847 America/Thule Thule/Pituffik +GM +1328-01639 Africa/Banjul +GN +0931-01343 Africa/Conakry +GP +1614-06132 America/Guadeloupe +GQ +0345+00847 Africa/Malabo +GR +3758+02343 Europe/Athens +GS -5416-03632 Atlantic/South_Georgia +GT +1438-09031 America/Guatemala +GU +1328+14445 Pacific/Guam +GW +1151-01535 Africa/Bissau +GY +0648-05810 America/Guyana +HK +2217+11409 Asia/Hong_Kong +HN +1406-08713 America/Tegucigalpa +HR +4548+01558 Europe/Zagreb +HT +1832-07220 America/Port-au-Prince +HU +4730+01905 Europe/Budapest +ID -0610+10648 Asia/Jakarta Java, Sumatra +ID -0002+10920 Asia/Pontianak Borneo (west, central) +ID -0507+11924 Asia/Makassar Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west) +ID -0232+14042 Asia/Jayapura New Guinea (West Papua / Irian Jaya); Malukus/Moluccas +IE +5320-00615 Europe/Dublin +IL +314650+0351326 Asia/Jerusalem +IM +5409-00428 Europe/Isle_of_Man +IN +2232+08822 Asia/Kolkata +IO -0720+07225 Indian/Chagos +IQ +3321+04425 Asia/Baghdad +IR +3540+05126 Asia/Tehran +IS +6409-02151 Atlantic/Reykjavik +IT +4154+01229 Europe/Rome +JE +491101-0020624 Europe/Jersey +JM +175805-0764736 America/Jamaica +JO +3157+03556 Asia/Amman +JP +353916+1394441 Asia/Tokyo +KE -0117+03649 Africa/Nairobi +KG +4254+07436 Asia/Bishkek +KH +1133+10455 Asia/Phnom_Penh +KI +0125+17300 Pacific/Tarawa Gilbert Islands +KI -0308-17105 Pacific/Enderbury Phoenix Islands +KI +0152-15720 Pacific/Kiritimati Line Islands +KM -1141+04316 Indian/Comoro +KN +1718-06243 America/St_Kitts +KP +3901+12545 Asia/Pyongyang +KR +3733+12658 Asia/Seoul +KW +2920+04759 Asia/Kuwait +KY +1918-08123 America/Cayman +KZ +4315+07657 Asia/Almaty Kazakhstan (most areas) +KZ +4448+06528 Asia/Qyzylorda Qyzylorda/Kyzylorda/Kzyl-Orda +KZ +5312+06337 Asia/Qostanay Qostanay/Kostanay/Kustanay +KZ +5017+05710 Asia/Aqtobe Aqtobe/Aktobe +KZ +4431+05016 Asia/Aqtau Mangghystau/Mankistau +KZ +4707+05156 Asia/Atyrau Atyrau/Atirau/Gur'yev +KZ +5113+05121 Asia/Oral West Kazakhstan +LA +1758+10236 Asia/Vientiane +LB +3353+03530 Asia/Beirut +LC +1401-06100 America/St_Lucia +LI +4709+00931 Europe/Vaduz +LK +0656+07951 Asia/Colombo +LR +0618-01047 Africa/Monrovia +LS -2928+02730 Africa/Maseru +LT +5441+02519 Europe/Vilnius +LU +4936+00609 Europe/Luxembourg +LV +5657+02406 Europe/Riga +LY +3254+01311 Africa/Tripoli +MA +3339-00735 Africa/Casablanca +MC +4342+00723 Europe/Monaco +MD +4700+02850 Europe/Chisinau +ME +4226+01916 Europe/Podgorica +MF +1804-06305 America/Marigot +MG -1855+04731 Indian/Antananarivo +MH +0709+17112 Pacific/Majuro Marshall Islands (most areas) +MH +0905+16720 Pacific/Kwajalein Kwajalein +MK +4159+02126 Europe/Skopje +ML +1239-00800 Africa/Bamako +MM +1647+09610 Asia/Yangon +MN +4755+10653 Asia/Ulaanbaatar Mongolia (most areas) +MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan +MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar +MO +221150+1133230 Asia/Macau +MP +1512+14545 Pacific/Saipan +MQ +1436-06105 America/Martinique +MR +1806-01557 Africa/Nouakchott +MS +1643-06213 America/Montserrat +MT +3554+01431 Europe/Malta +MU -2010+05730 Indian/Mauritius +MV +0410+07330 Indian/Maldives +MW -1547+03500 Africa/Blantyre +MX +1924-09909 America/Mexico_City Central Time +MX +2105-08646 America/Cancun Eastern Standard Time - Quintana Roo +MX +2058-08937 America/Merida Central Time - Campeche, Yucatan +MX +2540-10019 America/Monterrey Central Time - Durango; Coahuila, Nuevo Leon, Tamaulipas (most areas) +MX +2550-09730 America/Matamoros Central Time US - Coahuila, Nuevo Leon, Tamaulipas (US border) +MX +2313-10625 America/Mazatlan Mountain Time - Baja California Sur, Nayarit, Sinaloa +MX +2838-10605 America/Chihuahua Mountain Time - Chihuahua (most areas) +MX +2934-10425 America/Ojinaga Mountain Time US - Chihuahua (US border) +MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora +MX +3232-11701 America/Tijuana Pacific Time US - Baja California +MX +2048-10515 America/Bahia_Banderas Central Time - Bahia de Banderas +MY +0310+10142 Asia/Kuala_Lumpur Malaysia (peninsula) +MY +0133+11020 Asia/Kuching Sabah, Sarawak +MZ -2558+03235 Africa/Maputo +NA -2234+01706 Africa/Windhoek +NC -2216+16627 Pacific/Noumea +NE +1331+00207 Africa/Niamey +NF -2903+16758 Pacific/Norfolk +NG +0627+00324 Africa/Lagos +NI +1209-08617 America/Managua +NL +5222+00454 Europe/Amsterdam +NO +5955+01045 Europe/Oslo +NP +2743+08519 Asia/Kathmandu +NR -0031+16655 Pacific/Nauru +NU -1901-16955 Pacific/Niue +NZ -3652+17446 Pacific/Auckland New Zealand (most areas) +NZ -4357-17633 Pacific/Chatham Chatham Islands +OM +2336+05835 Asia/Muscat +PA +0858-07932 America/Panama +PE -1203-07703 America/Lima +PF -1732-14934 Pacific/Tahiti Society Islands +PF -0900-13930 Pacific/Marquesas Marquesas Islands +PF -2308-13457 Pacific/Gambier Gambier Islands +PG -0930+14710 Pacific/Port_Moresby Papua New Guinea (most areas) +PG -0613+15534 Pacific/Bougainville Bougainville +PH +1435+12100 Asia/Manila +PK +2452+06703 Asia/Karachi +PL +5215+02100 Europe/Warsaw +PM +4703-05620 America/Miquelon +PN -2504-13005 Pacific/Pitcairn +PR +182806-0660622 America/Puerto_Rico +PS +3130+03428 Asia/Gaza Gaza Strip +PS +313200+0350542 Asia/Hebron West Bank +PT +3843-00908 Europe/Lisbon Portugal (mainland) +PT +3238-01654 Atlantic/Madeira Madeira Islands +PT +3744-02540 Atlantic/Azores Azores +PW +0720+13429 Pacific/Palau +PY -2516-05740 America/Asuncion +QA +2517+05132 Asia/Qatar +RE -2052+05528 Indian/Reunion +RO +4426+02606 Europe/Bucharest +RS +4450+02030 Europe/Belgrade +RU +5443+02030 Europe/Kaliningrad MSK-01 - Kaliningrad +RU +554521+0373704 Europe/Moscow MSK+00 - Moscow area +# The obsolescent zone.tab format cannot represent Europe/Simferopol well. +# Put it in RU section and list as UA. See "territorial claims" above. +# Programs should use zone1970.tab instead; see above. +UA +4457+03406 Europe/Simferopol Crimea +RU +5836+04939 Europe/Kirov MSK+00 - Kirov +RU +4621+04803 Europe/Astrakhan MSK+01 - Astrakhan +RU +4844+04425 Europe/Volgograd MSK+01 - Volgograd +RU +5134+04602 Europe/Saratov MSK+01 - Saratov +RU +5420+04824 Europe/Ulyanovsk MSK+01 - Ulyanovsk +RU +5312+05009 Europe/Samara MSK+01 - Samara, Udmurtia +RU +5651+06036 Asia/Yekaterinburg MSK+02 - Urals +RU +5500+07324 Asia/Omsk MSK+03 - Omsk +RU +5502+08255 Asia/Novosibirsk MSK+04 - Novosibirsk +RU +5322+08345 Asia/Barnaul MSK+04 - Altai +RU +5630+08458 Asia/Tomsk MSK+04 - Tomsk +RU +5345+08707 Asia/Novokuznetsk MSK+04 - Kemerovo +RU +5601+09250 Asia/Krasnoyarsk MSK+04 - Krasnoyarsk area +RU +5216+10420 Asia/Irkutsk MSK+05 - Irkutsk, Buryatia +RU +5203+11328 Asia/Chita MSK+06 - Zabaykalsky +RU +6200+12940 Asia/Yakutsk MSK+06 - Lena River +RU +623923+1353314 Asia/Khandyga MSK+06 - Tomponsky, Ust-Maysky +RU +4310+13156 Asia/Vladivostok MSK+07 - Amur River +RU +643337+1431336 Asia/Ust-Nera MSK+07 - Oymyakonsky +RU +5934+15048 Asia/Magadan MSK+08 - Magadan +RU +4658+14242 Asia/Sakhalin MSK+08 - Sakhalin Island +RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E); North Kuril Is +RU +5301+15839 Asia/Kamchatka MSK+09 - Kamchatka +RU +6445+17729 Asia/Anadyr MSK+09 - Bering Sea +RW -0157+03004 Africa/Kigali +SA +2438+04643 Asia/Riyadh +SB -0932+16012 Pacific/Guadalcanal +SC -0440+05528 Indian/Mahe +SD +1536+03232 Africa/Khartoum +SE +5920+01803 Europe/Stockholm +SG +0117+10351 Asia/Singapore +SH -1555-00542 Atlantic/St_Helena +SI +4603+01431 Europe/Ljubljana +SJ +7800+01600 Arctic/Longyearbyen +SK +4809+01707 Europe/Bratislava +SL +0830-01315 Africa/Freetown +SM +4355+01228 Europe/San_Marino +SN +1440-01726 Africa/Dakar +SO +0204+04522 Africa/Mogadishu +SR +0550-05510 America/Paramaribo +SS +0451+03137 Africa/Juba +ST +0020+00644 Africa/Sao_Tome +SV +1342-08912 America/El_Salvador +SX +180305-0630250 America/Lower_Princes +SY +3330+03618 Asia/Damascus +SZ -2618+03106 Africa/Mbabane +TC +2128-07108 America/Grand_Turk +TD +1207+01503 Africa/Ndjamena +TF -492110+0701303 Indian/Kerguelen +TG +0608+00113 Africa/Lome +TH +1345+10031 Asia/Bangkok +TJ +3835+06848 Asia/Dushanbe +TK -0922-17114 Pacific/Fakaofo +TL -0833+12535 Asia/Dili +TM +3757+05823 Asia/Ashgabat +TN +3648+01011 Africa/Tunis +TO -2110-17510 Pacific/Tongatapu +TR +4101+02858 Europe/Istanbul +TT +1039-06131 America/Port_of_Spain +TV -0831+17913 Pacific/Funafuti +TW +2503+12130 Asia/Taipei +TZ -0648+03917 Africa/Dar_es_Salaam +UA +5026+03031 Europe/Kiev Ukraine (most areas) +UA +4837+02218 Europe/Uzhgorod Transcarpathia +UA +4750+03510 Europe/Zaporozhye Zaporozhye and east Lugansk +UG +0019+03225 Africa/Kampala +UM +2813-17722 Pacific/Midway Midway Islands +UM +1917+16637 Pacific/Wake Wake Island +US +404251-0740023 America/New_York Eastern (most areas) +US +421953-0830245 America/Detroit Eastern - MI (most areas) +US +381515-0854534 America/Kentucky/Louisville Eastern - KY (Louisville area) +US +364947-0845057 America/Kentucky/Monticello Eastern - KY (Wayne) +US +394606-0860929 America/Indiana/Indianapolis Eastern - IN (most areas) +US +384038-0873143 America/Indiana/Vincennes Eastern - IN (Da, Du, K, Mn) +US +410305-0863611 America/Indiana/Winamac Eastern - IN (Pulaski) +US +382232-0862041 America/Indiana/Marengo Eastern - IN (Crawford) +US +382931-0871643 America/Indiana/Petersburg Eastern - IN (Pike) +US +384452-0850402 America/Indiana/Vevay Eastern - IN (Switzerland) +US +415100-0873900 America/Chicago Central (most areas) +US +375711-0864541 America/Indiana/Tell_City Central - IN (Perry) +US +411745-0863730 America/Indiana/Knox Central - IN (Starke) +US +450628-0873651 America/Menominee Central - MI (Wisconsin border) +US +470659-1011757 America/North_Dakota/Center Central - ND (Oliver) +US +465042-1012439 America/North_Dakota/New_Salem Central - ND (Morton rural) +US +471551-1014640 America/North_Dakota/Beulah Central - ND (Mercer) +US +394421-1045903 America/Denver Mountain (most areas) +US +433649-1161209 America/Boise Mountain - ID (south); OR (east) +US +332654-1120424 America/Phoenix MST - Arizona (except Navajo) +US +340308-1181434 America/Los_Angeles Pacific +US +611305-1495401 America/Anchorage Alaska (most areas) +US +581807-1342511 America/Juneau Alaska - Juneau area +US +571035-1351807 America/Sitka Alaska - Sitka area +US +550737-1313435 America/Metlakatla Alaska - Annette Island +US +593249-1394338 America/Yakutat Alaska - Yakutat +US +643004-1652423 America/Nome Alaska (west) +US +515248-1763929 America/Adak Aleutian Islands +US +211825-1575130 Pacific/Honolulu Hawaii +UY -345433-0561245 America/Montevideo +UZ +3940+06648 Asia/Samarkand Uzbekistan (west) +UZ +4120+06918 Asia/Tashkent Uzbekistan (east) +VA +415408+0122711 Europe/Vatican +VC +1309-06114 America/St_Vincent +VE +1030-06656 America/Caracas +VG +1827-06437 America/Tortola +VI +1821-06456 America/St_Thomas +VN +1045+10640 Asia/Ho_Chi_Minh +VU -1740+16825 Pacific/Efate +WF -1318-17610 Pacific/Wallis +WS -1350-17144 Pacific/Apia +YE +1245+04512 Asia/Aden +YT -1247+04514 Indian/Mayotte +ZA -2615+02800 Africa/Johannesburg +ZM -1525+02817 Africa/Lusaka +ZW -1750+03103 Africa/Harare diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/zone1970.tab b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/zone1970.tab new file mode 100644 index 000000000000..53ee77e88e5e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/test/zoneinfo/zone1970.tab @@ -0,0 +1,384 @@ +# tzdb timezone descriptions +# +# This file is in the public domain. +# +# From Paul Eggert (2018-06-27): +# This file contains a table where each row stands for a timezone where +# civil timestamps have agreed since 1970. Columns are separated by +# a single tab. Lines beginning with '#' are comments. All text uses +# UTF-8 encoding. The columns of the table are as follows: +# +# 1. The countries that overlap the timezone, as a comma-separated list +# of ISO 3166 2-character country codes. See the file 'iso3166.tab'. +# 2. Latitude and longitude of the timezone's principal location +# in ISO 6709 sign-degrees-minutes-seconds format, +# either ±DDMM±DDDMM or ±DDMMSS±DDDMMSS, +# first latitude (+ is north), then longitude (+ is east). +# 3. Timezone name used in value of TZ environment variable. +# Please see the theory.html file for how these names are chosen. +# If multiple timezones overlap a country, each has a row in the +# table, with each column 1 containing the country code. +# 4. Comments; present if and only if a country has multiple timezones. +# +# If a timezone covers multiple countries, the most-populous city is used, +# and that country is listed first in column 1; any other countries +# are listed alphabetically by country code. The table is sorted +# first by country code, then (if possible) by an order within the +# country that (1) makes some geographical sense, and (2) puts the +# most populous timezones first, where that does not contradict (1). +# +# This table is intended as an aid for users, to help them select timezones +# appropriate for their practical needs. It is not intended to take or +# endorse any position on legal or territorial claims. +# +#country- +#codes coordinates TZ comments +AD +4230+00131 Europe/Andorra +AE,OM +2518+05518 Asia/Dubai +AF +3431+06912 Asia/Kabul +AL +4120+01950 Europe/Tirane +AM +4011+04430 Asia/Yerevan +AQ -6617+11031 Antarctica/Casey Casey +AQ -6835+07758 Antarctica/Davis Davis +AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville +AQ -6736+06253 Antarctica/Mawson Mawson +AQ -6448-06406 Antarctica/Palmer Palmer +AQ -6734-06808 Antarctica/Rothera Rothera +AQ -690022+0393524 Antarctica/Syowa Syowa +AQ -720041+0023206 Antarctica/Troll Troll +AQ -7824+10654 Antarctica/Vostok Vostok +AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) +AR -3124-06411 America/Argentina/Cordoba Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF) +AR -2447-06525 America/Argentina/Salta Salta (SA, LP, NQ, RN) +AR -2411-06518 America/Argentina/Jujuy Jujuy (JY) +AR -2649-06513 America/Argentina/Tucuman Tucumán (TM) +AR -2828-06547 America/Argentina/Catamarca Catamarca (CT); Chubut (CH) +AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR) +AR -3132-06831 America/Argentina/San_Juan San Juan (SJ) +AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ) +AR -3319-06621 America/Argentina/San_Luis San Luis (SL) +AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC) +AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF) +AS,UM -1416-17042 Pacific/Pago_Pago Samoa, Midway +AT +4813+01620 Europe/Vienna +AU -3133+15905 Australia/Lord_Howe Lord Howe Island +AU -5430+15857 Antarctica/Macquarie Macquarie Island +AU -4253+14719 Australia/Hobart Tasmania (most areas) +AU -3956+14352 Australia/Currie Tasmania (King Island) +AU -3749+14458 Australia/Melbourne Victoria +AU -3352+15113 Australia/Sydney New South Wales (most areas) +AU -3157+14127 Australia/Broken_Hill New South Wales (Yancowinna) +AU -2728+15302 Australia/Brisbane Queensland (most areas) +AU -2016+14900 Australia/Lindeman Queensland (Whitsunday Islands) +AU -3455+13835 Australia/Adelaide South Australia +AU -1228+13050 Australia/Darwin Northern Territory +AU -3157+11551 Australia/Perth Western Australia (most areas) +AU -3143+12852 Australia/Eucla Western Australia (Eucla) +AZ +4023+04951 Asia/Baku +BB +1306-05937 America/Barbados +BD +2343+09025 Asia/Dhaka +BE +5050+00420 Europe/Brussels +BG +4241+02319 Europe/Sofia +BM +3217-06446 Atlantic/Bermuda +BN +0456+11455 Asia/Brunei +BO -1630-06809 America/La_Paz +BR -0351-03225 America/Noronha Atlantic islands +BR -0127-04829 America/Belem Pará (east); Amapá +BR -0343-03830 America/Fortaleza Brazil (northeast: MA, PI, CE, RN, PB) +BR -0803-03454 America/Recife Pernambuco +BR -0712-04812 America/Araguaina Tocantins +BR -0940-03543 America/Maceio Alagoas, Sergipe +BR -1259-03831 America/Bahia Bahia +BR -2332-04637 America/Sao_Paulo Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS) +BR -2027-05437 America/Campo_Grande Mato Grosso do Sul +BR -1535-05605 America/Cuiaba Mato Grosso +BR -0226-05452 America/Santarem Pará (west) +BR -0846-06354 America/Porto_Velho Rondônia +BR +0249-06040 America/Boa_Vista Roraima +BR -0308-06001 America/Manaus Amazonas (east) +BR -0640-06952 America/Eirunepe Amazonas (west) +BR -0958-06748 America/Rio_Branco Acre +BS +2505-07721 America/Nassau +BT +2728+08939 Asia/Thimphu +BY +5354+02734 Europe/Minsk +BZ +1730-08812 America/Belize +CA +4734-05243 America/St_Johns Newfoundland; Labrador (southeast) +CA +4439-06336 America/Halifax Atlantic - NS (most areas); PE +CA +4612-05957 America/Glace_Bay Atlantic - NS (Cape Breton) +CA +4606-06447 America/Moncton Atlantic - New Brunswick +CA +5320-06025 America/Goose_Bay Atlantic - Labrador (most areas) +CA +5125-05707 America/Blanc-Sablon AST - QC (Lower North Shore) +CA +4339-07923 America/Toronto Eastern - ON, QC (most areas) +CA +4901-08816 America/Nipigon Eastern - ON, QC (no DST 1967-73) +CA +4823-08915 America/Thunder_Bay Eastern - ON (Thunder Bay) +CA +6344-06828 America/Iqaluit Eastern - NU (most east areas) +CA +6608-06544 America/Pangnirtung Eastern - NU (Pangnirtung) +CA +484531-0913718 America/Atikokan EST - ON (Atikokan); NU (Coral H) +CA +4953-09709 America/Winnipeg Central - ON (west); Manitoba +CA +4843-09434 America/Rainy_River Central - ON (Rainy R, Ft Frances) +CA +744144-0944945 America/Resolute Central - NU (Resolute) +CA +624900-0920459 America/Rankin_Inlet Central - NU (central) +CA +5024-10439 America/Regina CST - SK (most areas) +CA +5017-10750 America/Swift_Current CST - SK (midwest) +CA +5333-11328 America/Edmonton Mountain - AB; BC (E); SK (W) +CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west) +CA +6227-11421 America/Yellowknife Mountain - NT (central) +CA +682059-1334300 America/Inuvik Mountain - NT (west) +CA +4906-11631 America/Creston MST - BC (Creston) +CA +5946-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John) +CA +5848-12242 America/Fort_Nelson MST - BC (Ft Nelson) +CA +4916-12307 America/Vancouver Pacific - BC (most areas) +CA +6043-13503 America/Whitehorse Pacific - Yukon (east) +CA +6404-13925 America/Dawson Pacific - Yukon (west) +CC -1210+09655 Indian/Cocos +CH,DE,LI +4723+00832 Europe/Zurich Swiss time +CI,BF,GM,GN,ML,MR,SH,SL,SN,TG +0519-00402 Africa/Abidjan +CK -2114-15946 Pacific/Rarotonga +CL -3327-07040 America/Santiago Chile (most areas) +CL -5309-07055 America/Punta_Arenas Region of Magallanes +CL -2709-10926 Pacific/Easter Easter Island +CN +3114+12128 Asia/Shanghai Beijing Time +CN +4348+08735 Asia/Urumqi Xinjiang Time +CO +0436-07405 America/Bogota +CR +0956-08405 America/Costa_Rica +CU +2308-08222 America/Havana +CV +1455-02331 Atlantic/Cape_Verde +CW,AW,BQ,SX +1211-06900 America/Curacao +CX -1025+10543 Indian/Christmas +CY +3510+03322 Asia/Nicosia Cyprus (most areas) +CY +3507+03357 Asia/Famagusta Northern Cyprus +CZ,SK +5005+01426 Europe/Prague +DE +5230+01322 Europe/Berlin Germany (most areas) +DK +5540+01235 Europe/Copenhagen +DO +1828-06954 America/Santo_Domingo +DZ +3647+00303 Africa/Algiers +EC -0210-07950 America/Guayaquil Ecuador (mainland) +EC -0054-08936 Pacific/Galapagos Galápagos Islands +EE +5925+02445 Europe/Tallinn +EG +3003+03115 Africa/Cairo +EH +2709-01312 Africa/El_Aaiun +ES +4024-00341 Europe/Madrid Spain (mainland) +ES +3553-00519 Africa/Ceuta Ceuta, Melilla +ES +2806-01524 Atlantic/Canary Canary Islands +FI,AX +6010+02458 Europe/Helsinki +FJ -1808+17825 Pacific/Fiji +FK -5142-05751 Atlantic/Stanley +FM +0725+15147 Pacific/Chuuk Chuuk/Truk, Yap +FM +0658+15813 Pacific/Pohnpei Pohnpei/Ponape +FM +0519+16259 Pacific/Kosrae Kosrae +FO +6201-00646 Atlantic/Faroe +FR +4852+00220 Europe/Paris +GB,GG,IM,JE +513030-0000731 Europe/London +GE +4143+04449 Asia/Tbilisi +GF +0456-05220 America/Cayenne +GH +0533-00013 Africa/Accra +GI +3608-00521 Europe/Gibraltar +GL +6411-05144 America/Nuuk Greenland (most areas) +GL +7646-01840 America/Danmarkshavn National Park (east coast) +GL +7029-02158 America/Scoresbysund Scoresbysund/Ittoqqortoormiit +GL +7634-06847 America/Thule Thule/Pituffik +GR +3758+02343 Europe/Athens +GS -5416-03632 Atlantic/South_Georgia +GT +1438-09031 America/Guatemala +GU,MP +1328+14445 Pacific/Guam +GW +1151-01535 Africa/Bissau +GY +0648-05810 America/Guyana +HK +2217+11409 Asia/Hong_Kong +HN +1406-08713 America/Tegucigalpa +HT +1832-07220 America/Port-au-Prince +HU +4730+01905 Europe/Budapest +ID -0610+10648 Asia/Jakarta Java, Sumatra +ID -0002+10920 Asia/Pontianak Borneo (west, central) +ID -0507+11924 Asia/Makassar Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west) +ID -0232+14042 Asia/Jayapura New Guinea (West Papua / Irian Jaya); Malukus/Moluccas +IE +5320-00615 Europe/Dublin +IL +314650+0351326 Asia/Jerusalem +IN +2232+08822 Asia/Kolkata +IO -0720+07225 Indian/Chagos +IQ +3321+04425 Asia/Baghdad +IR +3540+05126 Asia/Tehran +IS +6409-02151 Atlantic/Reykjavik +IT,SM,VA +4154+01229 Europe/Rome +JM +175805-0764736 America/Jamaica +JO +3157+03556 Asia/Amman +JP +353916+1394441 Asia/Tokyo +KE,DJ,ER,ET,KM,MG,SO,TZ,UG,YT -0117+03649 Africa/Nairobi +KG +4254+07436 Asia/Bishkek +KI +0125+17300 Pacific/Tarawa Gilbert Islands +KI -0308-17105 Pacific/Enderbury Phoenix Islands +KI +0152-15720 Pacific/Kiritimati Line Islands +KP +3901+12545 Asia/Pyongyang +KR +3733+12658 Asia/Seoul +KZ +4315+07657 Asia/Almaty Kazakhstan (most areas) +KZ +4448+06528 Asia/Qyzylorda Qyzylorda/Kyzylorda/Kzyl-Orda +KZ +5312+06337 Asia/Qostanay Qostanay/Kostanay/Kustanay +KZ +5017+05710 Asia/Aqtobe Aqtöbe/Aktobe +KZ +4431+05016 Asia/Aqtau Mangghystaū/Mankistau +KZ +4707+05156 Asia/Atyrau Atyraū/Atirau/Gur'yev +KZ +5113+05121 Asia/Oral West Kazakhstan +LB +3353+03530 Asia/Beirut +LK +0656+07951 Asia/Colombo +LR +0618-01047 Africa/Monrovia +LT +5441+02519 Europe/Vilnius +LU +4936+00609 Europe/Luxembourg +LV +5657+02406 Europe/Riga +LY +3254+01311 Africa/Tripoli +MA +3339-00735 Africa/Casablanca +MC +4342+00723 Europe/Monaco +MD +4700+02850 Europe/Chisinau +MH +0709+17112 Pacific/Majuro Marshall Islands (most areas) +MH +0905+16720 Pacific/Kwajalein Kwajalein +MM +1647+09610 Asia/Yangon +MN +4755+10653 Asia/Ulaanbaatar Mongolia (most areas) +MN +4801+09139 Asia/Hovd Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan +MN +4804+11430 Asia/Choibalsan Dornod, Sükhbaatar +MO +221150+1133230 Asia/Macau +MQ +1436-06105 America/Martinique +MT +3554+01431 Europe/Malta +MU -2010+05730 Indian/Mauritius +MV +0410+07330 Indian/Maldives +MX +1924-09909 America/Mexico_City Central Time +MX +2105-08646 America/Cancun Eastern Standard Time - Quintana Roo +MX +2058-08937 America/Merida Central Time - Campeche, Yucatán +MX +2540-10019 America/Monterrey Central Time - Durango; Coahuila, Nuevo León, Tamaulipas (most areas) +MX +2550-09730 America/Matamoros Central Time US - Coahuila, Nuevo León, Tamaulipas (US border) +MX +2313-10625 America/Mazatlan Mountain Time - Baja California Sur, Nayarit, Sinaloa +MX +2838-10605 America/Chihuahua Mountain Time - Chihuahua (most areas) +MX +2934-10425 America/Ojinaga Mountain Time US - Chihuahua (US border) +MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora +MX +3232-11701 America/Tijuana Pacific Time US - Baja California +MX +2048-10515 America/Bahia_Banderas Central Time - Bahía de Banderas +MY +0310+10142 Asia/Kuala_Lumpur Malaysia (peninsula) +MY +0133+11020 Asia/Kuching Sabah, Sarawak +MZ,BI,BW,CD,MW,RW,ZM,ZW -2558+03235 Africa/Maputo Central Africa Time +NA -2234+01706 Africa/Windhoek +NC -2216+16627 Pacific/Noumea +NF -2903+16758 Pacific/Norfolk +NG,AO,BJ,CD,CF,CG,CM,GA,GQ,NE +0627+00324 Africa/Lagos West Africa Time +NI +1209-08617 America/Managua +NL +5222+00454 Europe/Amsterdam +NO,SJ +5955+01045 Europe/Oslo +NP +2743+08519 Asia/Kathmandu +NR -0031+16655 Pacific/Nauru +NU -1901-16955 Pacific/Niue +NZ,AQ -3652+17446 Pacific/Auckland New Zealand time +NZ -4357-17633 Pacific/Chatham Chatham Islands +PA,KY +0858-07932 America/Panama +PE -1203-07703 America/Lima +PF -1732-14934 Pacific/Tahiti Society Islands +PF -0900-13930 Pacific/Marquesas Marquesas Islands +PF -2308-13457 Pacific/Gambier Gambier Islands +PG -0930+14710 Pacific/Port_Moresby Papua New Guinea (most areas) +PG -0613+15534 Pacific/Bougainville Bougainville +PH +1435+12100 Asia/Manila +PK +2452+06703 Asia/Karachi +PL +5215+02100 Europe/Warsaw +PM +4703-05620 America/Miquelon +PN -2504-13005 Pacific/Pitcairn +PR +182806-0660622 America/Puerto_Rico +PS +3130+03428 Asia/Gaza Gaza Strip +PS +313200+0350542 Asia/Hebron West Bank +PT +3843-00908 Europe/Lisbon Portugal (mainland) +PT +3238-01654 Atlantic/Madeira Madeira Islands +PT +3744-02540 Atlantic/Azores Azores +PW +0720+13429 Pacific/Palau +PY -2516-05740 America/Asuncion +QA,BH +2517+05132 Asia/Qatar +RE,TF -2052+05528 Indian/Reunion Réunion, Crozet, Scattered Islands +RO +4426+02606 Europe/Bucharest +RS,BA,HR,ME,MK,SI +4450+02030 Europe/Belgrade +RU +5443+02030 Europe/Kaliningrad MSK-01 - Kaliningrad +RU +554521+0373704 Europe/Moscow MSK+00 - Moscow area +# Mention RU and UA alphabetically. See "territorial claims" above. +RU,UA +4457+03406 Europe/Simferopol Crimea +RU +5836+04939 Europe/Kirov MSK+00 - Kirov +RU +4621+04803 Europe/Astrakhan MSK+01 - Astrakhan +RU +4844+04425 Europe/Volgograd MSK+01 - Volgograd +RU +5134+04602 Europe/Saratov MSK+01 - Saratov +RU +5420+04824 Europe/Ulyanovsk MSK+01 - Ulyanovsk +RU +5312+05009 Europe/Samara MSK+01 - Samara, Udmurtia +RU +5651+06036 Asia/Yekaterinburg MSK+02 - Urals +RU +5500+07324 Asia/Omsk MSK+03 - Omsk +RU +5502+08255 Asia/Novosibirsk MSK+04 - Novosibirsk +RU +5322+08345 Asia/Barnaul MSK+04 - Altai +RU +5630+08458 Asia/Tomsk MSK+04 - Tomsk +RU +5345+08707 Asia/Novokuznetsk MSK+04 - Kemerovo +RU +5601+09250 Asia/Krasnoyarsk MSK+04 - Krasnoyarsk area +RU +5216+10420 Asia/Irkutsk MSK+05 - Irkutsk, Buryatia +RU +5203+11328 Asia/Chita MSK+06 - Zabaykalsky +RU +6200+12940 Asia/Yakutsk MSK+06 - Lena River +RU +623923+1353314 Asia/Khandyga MSK+06 - Tomponsky, Ust-Maysky +RU +4310+13156 Asia/Vladivostok MSK+07 - Amur River +RU +643337+1431336 Asia/Ust-Nera MSK+07 - Oymyakonsky +RU +5934+15048 Asia/Magadan MSK+08 - Magadan +RU +4658+14242 Asia/Sakhalin MSK+08 - Sakhalin Island +RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E); North Kuril Is +RU +5301+15839 Asia/Kamchatka MSK+09 - Kamchatka +RU +6445+17729 Asia/Anadyr MSK+09 - Bering Sea +SA,KW,YE +2438+04643 Asia/Riyadh +SB -0932+16012 Pacific/Guadalcanal +SC -0440+05528 Indian/Mahe +SD +1536+03232 Africa/Khartoum +SE +5920+01803 Europe/Stockholm +SG +0117+10351 Asia/Singapore +SR +0550-05510 America/Paramaribo +SS +0451+03137 Africa/Juba +ST +0020+00644 Africa/Sao_Tome +SV +1342-08912 America/El_Salvador +SY +3330+03618 Asia/Damascus +TC +2128-07108 America/Grand_Turk +TD +1207+01503 Africa/Ndjamena +TF -492110+0701303 Indian/Kerguelen Kerguelen, St Paul Island, Amsterdam Island +TH,KH,LA,VN +1345+10031 Asia/Bangkok Indochina (most areas) +TJ +3835+06848 Asia/Dushanbe +TK -0922-17114 Pacific/Fakaofo +TL -0833+12535 Asia/Dili +TM +3757+05823 Asia/Ashgabat +TN +3648+01011 Africa/Tunis +TO -2110-17510 Pacific/Tongatapu +TR +4101+02858 Europe/Istanbul +TT,AG,AI,BL,DM,GD,GP,KN,LC,MF,MS,VC,VG,VI +1039-06131 America/Port_of_Spain +TV -0831+17913 Pacific/Funafuti +TW +2503+12130 Asia/Taipei +UA +5026+03031 Europe/Kiev Ukraine (most areas) +UA +4837+02218 Europe/Uzhgorod Transcarpathia +UA +4750+03510 Europe/Zaporozhye Zaporozhye and east Lugansk +UM +1917+16637 Pacific/Wake Wake Island +US +404251-0740023 America/New_York Eastern (most areas) +US +421953-0830245 America/Detroit Eastern - MI (most areas) +US +381515-0854534 America/Kentucky/Louisville Eastern - KY (Louisville area) +US +364947-0845057 America/Kentucky/Monticello Eastern - KY (Wayne) +US +394606-0860929 America/Indiana/Indianapolis Eastern - IN (most areas) +US +384038-0873143 America/Indiana/Vincennes Eastern - IN (Da, Du, K, Mn) +US +410305-0863611 America/Indiana/Winamac Eastern - IN (Pulaski) +US +382232-0862041 America/Indiana/Marengo Eastern - IN (Crawford) +US +382931-0871643 America/Indiana/Petersburg Eastern - IN (Pike) +US +384452-0850402 America/Indiana/Vevay Eastern - IN (Switzerland) +US +415100-0873900 America/Chicago Central (most areas) +US +375711-0864541 America/Indiana/Tell_City Central - IN (Perry) +US +411745-0863730 America/Indiana/Knox Central - IN (Starke) +US +450628-0873651 America/Menominee Central - MI (Wisconsin border) +US +470659-1011757 America/North_Dakota/Center Central - ND (Oliver) +US +465042-1012439 America/North_Dakota/New_Salem Central - ND (Morton rural) +US +471551-1014640 America/North_Dakota/Beulah Central - ND (Mercer) +US +394421-1045903 America/Denver Mountain (most areas) +US +433649-1161209 America/Boise Mountain - ID (south); OR (east) +US +332654-1120424 America/Phoenix MST - Arizona (except Navajo) +US +340308-1181434 America/Los_Angeles Pacific +US +611305-1495401 America/Anchorage Alaska (most areas) +US +581807-1342511 America/Juneau Alaska - Juneau area +US +571035-1351807 America/Sitka Alaska - Sitka area +US +550737-1313435 America/Metlakatla Alaska - Annette Island +US +593249-1394338 America/Yakutat Alaska - Yakutat +US +643004-1652423 America/Nome Alaska (west) +US +515248-1763929 America/Adak Aleutian Islands +US,UM +211825-1575130 Pacific/Honolulu Hawaii +UY -345433-0561245 America/Montevideo +UZ +3940+06648 Asia/Samarkand Uzbekistan (west) +UZ +4120+06918 Asia/Tashkent Uzbekistan (east) +VE +1030-06656 America/Caracas +VN +1045+10640 Asia/Ho_Chi_Minh Vietnam (south) +VU -1740+16825 Pacific/Efate +WF -1318-17610 Pacific/Wallis +WS -1350-17144 Pacific/Apia +ZA,LS,SZ -2615+02800 Africa/Johannesburg diff --git a/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/tzinfo.gemspec b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/tzinfo.gemspec new file mode 100644 index 000000000000..ed74828563ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/tzinfo-1.2.9/tzinfo.gemspec @@ -0,0 +1,21 @@ +Gem::Specification.new do |s| + s.name = 'tzinfo' + s.version = '1.2.9' + s.summary = 'Daylight savings aware timezone library' + s.description = 'TZInfo provides daylight savings aware transformations between times in different time zones.' + s.author = 'Philip Ross' + s.email = 'phil.ross@gmail.com' + s.homepage = 'https://tzinfo.github.io' + s.license = 'MIT' + s.files = %w(CHANGES.md LICENSE Rakefile README.md tzinfo.gemspec .yardopts) + + Dir['lib/**/*.rb'].delete_if {|f| f.include?('.svn')} + + Dir['test/**/*.rb'].delete_if {|f| f.include?('.svn')} + + Dir['test/zoneinfo/**/*'].delete_if {|f| f.include?('.svn') || File.symlink?(f)} + s.platform = Gem::Platform::RUBY + s.require_path = 'lib' + s.rdoc_options << '--title' << 'TZInfo' << + '--main' << 'README.md' + s.extra_rdoc_files = ['README.md', 'CHANGES.md', 'LICENSE'] + s.required_ruby_version = '>= 1.8.7' + s.add_dependency 'thread_safe', '~> 0.1' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/.gitignore b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/.gitignore new file mode 100644 index 000000000000..d87d4be66f45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/.gitignore @@ -0,0 +1,17 @@ +*.gem +*.rbc +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/.travis.yml new file mode 100644 index 000000000000..39d504469fb6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/.travis.yml @@ -0,0 +1,17 @@ +language: ruby +rvm: + - 1.8.7 + - ree + - 1.9.3 + - 2.0.0 + - ruby-head + - jruby-18mode + - jruby-19mode + - jruby-head + - rbx-18mode + - rbx-19mode +matrix: + allow_failures: + - rvm: ruby-head + - rvm: rbx-18mode + - rvm: rbx-19mode diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/CHANGELOG.md new file mode 100644 index 000000000000..2882adaa26fe --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/CHANGELOG.md @@ -0,0 +1,46 @@ +## 0.1.3 (2013-10-25) + +Features: + + - Make UNF::Normalizer.instance thread-safe, and deprecate .new. + (GH #6) + +## 0.1.2 (2013-08-12) + +Features: + + - Add license to gemspec. + + - Adjust dependencies for Ruby 1.8 to satisfy bundler. + +## 0.1.1 (2013-03-23) + +Features: + + - Add rdoc. + +## 0.1.0 (2013-03-18) + +Features: + + - Start CI with Travis-CI. + +## 0.0.5 (2012-03-04) + +Features: + + - Migrate from Jeweler to Bundle gem. + +Bugfixes: + + - Fix gem support for JRuby. + +## 0.0.4 (2011-12-09) + +Features: + + - Introduce autoloading. + +## 0.0.3 (2011-10-25) + + - Initial release. diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/Gemfile b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/Gemfile new file mode 100644 index 000000000000..f83630632f47 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in unf.gemspec +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/LICENSE b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/LICENSE new file mode 100644 index 000000000000..cfdda07dcd01 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2011, 2012 Akinori MUSHA + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/README.md b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/README.md new file mode 100644 index 000000000000..7cab7cb1ee48 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/README.md @@ -0,0 +1,39 @@ +ruby-unf +======== + +Synopsis +-------- + +* A wrapper library to bring Unicode Normalization Form support to Ruby/JRuby + +Description +----------- + +* Uses `unf_ext` on CRuby and `java.text.Normalizer` on JRuby. + +* Normalizes UTF-8 strings into and from NFC, NFD, NFKC or NFKD + + # For bulk conversion + normalizer = UNF::Normalizer.instance + a_bunch_of_strings.map! { |string| + normalizer.normalize(string, :nfc) #=> string in NFC + } + + # Class method + UNF::Normalizer.normalize(string, :nfc) + + # Instance methods of String + string.to_nfc + +Installation +------------ + + gem install unf + +License +------- + +Copyright (c) 2011, 2012, 2013 Akinori MUSHA + +Licensed under the 2-clause BSD license. +See `LICENSE` for details. diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/Rakefile b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/Rakefile new file mode 100644 index 000000000000..2949f4f3f6b6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/Rakefile @@ -0,0 +1,21 @@ +#!/usr/bin/env rake +require "bundler/gem_tasks" + +gemspec = Bundler::GemHelper.gemspec + +require 'rake/testtask' +Rake::TestTask.new(:test) do |test| + test.libs << 'test' + test.test_files = gemspec.test_files + test.verbose = true +end + +require 'rdoc/task' +Rake::RDocTask.new do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = "#{gemspec.name} #{gemspec.version}" + rdoc.rdoc_files.include(gemspec.extra_rdoc_files) + rdoc.rdoc_files.include('lib/**/*.rb') +end + +task :default => :test diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf.rb b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf.rb new file mode 100644 index 000000000000..5a3d79b95cd4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf.rb @@ -0,0 +1,38 @@ +require 'unf/version' + +module UNF + autoload :Normalizer, 'unf/normalizer' +end + +class String + ascii_only = + if method_defined?(:ascii_only?) + 'ascii_only?' + else + '/[^\x00-\x7f]/ !~ self' + end + + # :method: to_nfc + # Converts the string to NFC. + + # :method: to_nfd + # Converts the string to NFD. + + # :method: to_nfkc + # Converts the string to NFKC. + + # :method: to_nfkd + # Converts the string to NFKD. + + [:nfc, :nfd, :nfkc, :nfkd].each { |form| + eval %{ + def to_#{form.to_s} + if #{ascii_only} + self + else + UNF::Normalizer.normalize(self, #{form.inspect}) + end + end + } + } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/normalizer.rb b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/normalizer.rb new file mode 100644 index 000000000000..dffa1ee33222 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/normalizer.rb @@ -0,0 +1,35 @@ +require 'singleton' +if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' + require 'unf/normalizer_jruby' +else + require 'unf/normalizer_cruby' +end + +# UTF-8 string normalizer class. Implementations may vary depending +# on the platform. +class UNF::Normalizer + include Singleton + + class << self + # :singleton-method: instance + # + # Returns a singleton normalizer instance. + + # :singleton-method: new + # + # Returns a new normalizer instance. Use +singleton+ instead. + public :new + + # A shortcut for instance.normalize(string, form). + def normalize(string, form) + instance.normalize(string, form) + end + end + + # :method: normalize + # :call-seq: + # normalize(string, form) + # + # Normalizes a UTF-8 string into a given form (:nfc, :nfd, :nfkc or + # :nfkd). +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/normalizer_cruby.rb b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/normalizer_cruby.rb new file mode 100644 index 000000000000..487ab24b1cc6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/normalizer_cruby.rb @@ -0,0 +1 @@ +require 'unf_ext' diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/normalizer_jruby.rb b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/normalizer_jruby.rb new file mode 100644 index 000000000000..4adca6bfcc9b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/normalizer_jruby.rb @@ -0,0 +1,30 @@ +require 'java' + +module UNF # :nodoc: all + class Normalizer + def initialize() + @normalizer = java.text.Normalizer + end + + def normalize(string, normalization_form) + @normalizer.normalize(string, form(normalization_form)) + end + + private + + def form(symbol) + case symbol + when :nfc + @normalizer::Form::NFC + when :nfd + @normalizer::Form::NFD + when :nfkc + @normalizer::Form::NFKC + when :nfkd + @normalizer::Form::NFKD + else + raise ArgumentError, "unknown normalization form: #{symbol.inspect}" + end + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/version.rb b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/version.rb new file mode 100644 index 000000000000..42c72b79e9ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/lib/unf/version.rb @@ -0,0 +1,3 @@ +module UNF + VERSION = '0.1.4' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/test/helper.rb b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/test/helper.rb new file mode 100644 index 000000000000..7321a5a1b1c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/test/helper.rb @@ -0,0 +1,18 @@ +require 'rubygems' +require 'bundler' +begin + Bundler.setup(:default, :development) +rescue Bundler::BundlerError => e + $stderr.puts e.message + $stderr.puts "Run `bundle install` to install missing gems" + exit e.status_code +end +require 'test/unit' +require 'shoulda' + +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) +$LOAD_PATH.unshift(File.dirname(__FILE__)) +require 'unf' + +class Test::Unit::TestCase +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/test/normalization-test.txt b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/test/normalization-test.txt new file mode 100644 index 000000000000..68eb070062cd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/test/normalization-test.txt @@ -0,0 +1,108816 @@ +Ḋ +Ḋ +Ḋ +Ḋ +Ḋ + +Ḍ +Ḍ +Ḍ +Ḍ +Ḍ + +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ + +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ + +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ + +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ + +Ḋ̛ +Ḋ̛ +Ḋ̛ +Ḋ̛ +Ḋ̛ + +Ḍ̛ +Ḍ̛ +Ḍ̛ +Ḍ̛ +Ḍ̛ + +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ + +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ + +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ + +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ + +È +È +È +È +È + +Ē +Ē +Ē +Ē +Ē + +È +È +È +È +È + +Ē +Ē +Ē +Ē +Ē + +Ḕ +Ḕ +Ḕ +Ḕ +Ḕ + +Ḕ +Ḕ +Ḕ +Ḕ +Ḕ + +Ḕ̄ +Ḕ̄ +Ḕ̄ +Ḕ̄ +Ḕ̄ + +Ḕ +Ḕ +Ḕ +Ḕ +Ḕ + +È̄ +È̄ +È̄ +È̄ +È̄ + +ֱָֹ֑׃ְ֬֟ +ֱָֹ֑׃ְ֬֟ +ֱָֹ֑׃ְ֬֟ +ֱָֹ֑׃ְ֬֟ +ֱָֹ֑׃ְ֬֟ + +ְַּ֥֒׀֭ׄ +ְַּ֥֒׀֭ׄ +ְַּ֥֒׀֭ׄ +ְַּ֥֒׀֭ׄ +ְַּ֥֒׀֭ׄ + +  +  +  + + + +¨ +¨ +¨ + ̈ + ̈ + +ª +ª +ª +a +a + +¯ +¯ +¯ + ̄ + ̄ + +² +² +² +2 +2 + +³ +³ +³ +3 +3 + +´ +´ +´ + ́ + ́ + +µ +µ +µ +μ +μ + +¸ +¸ +¸ + ̧ + ̧ + +¹ +¹ +¹ +1 +1 + +º +º +º +o +o + +¼ +¼ +¼ +1⁄4 +1⁄4 + +½ +½ +½ +1⁄2 +1⁄2 + +¾ +¾ +¾ +3⁄4 +3⁄4 + +À +À +À +À +À + +Á +Á +Á +Á +Á + +Â +Â +Â +Â +Â + +Ã +Ã +Ã +Ã +Ã + +Ä +Ä +Ä +Ä +Ä + +Å +Å +Å +Å +Å + +Ç +Ç +Ç +Ç +Ç + +È +È +È +È +È + +É +É +É +É +É + +Ê +Ê +Ê +Ê +Ê + +Ë +Ë +Ë +Ë +Ë + +Ì +Ì +Ì +Ì +Ì + +Í +Í +Í +Í +Í + +Î +Î +Î +Î +Î + +Ï +Ï +Ï +Ï +Ï + +Ñ +Ñ +Ñ +Ñ +Ñ + +Ò +Ò +Ò +Ò +Ò + +Ó +Ó +Ó +Ó +Ó + +Ô +Ô +Ô +Ô +Ô + +Õ +Õ +Õ +Õ +Õ + +Ö +Ö +Ö +Ö +Ö + +Ù +Ù +Ù +Ù +Ù + +Ú +Ú +Ú +Ú +Ú + +Û +Û +Û +Û +Û + +Ü +Ü +Ü +Ü +Ü + +Ý +Ý +Ý +Ý +Ý + +à +à +à +à +à + +á +á +á +á +á + +â +â +â +â +â + +ã +ã +ã +ã +ã + +ä +ä +ä +ä +ä + +å +å +å +å +å + +ç +ç +ç +ç +ç + +è +è +è +è +è + +é +é +é +é +é + +ê +ê +ê +ê +ê + +ë +ë +ë +ë +ë + +ì +ì +ì +ì +ì + +í +í +í +í +í + +î +î +î +î +î + +ï +ï +ï +ï +ï + +ñ +ñ +ñ +ñ +ñ + +ò +ò +ò +ò +ò + +ó +ó +ó +ó +ó + +ô +ô +ô +ô +ô + +õ +õ +õ +õ +õ + +ö +ö +ö +ö +ö + +ù +ù +ù +ù +ù + +ú +ú +ú +ú +ú + +û +û +û +û +û + +ü +ü +ü +ü +ü + +ý +ý +ý +ý +ý + +ÿ +ÿ +ÿ +ÿ +ÿ + +Ā +Ā +Ā +Ā +Ā + +ā +ā +ā +ā +ā + +Ă +Ă +Ă +Ă +Ă + +ă +ă +ă +ă +ă + +Ą +Ą +Ą +Ą +Ą + +ą +ą +ą +ą +ą + +Ć +Ć +Ć +Ć +Ć + +ć +ć +ć +ć +ć + +Ĉ +Ĉ +Ĉ +Ĉ +Ĉ + +ĉ +ĉ +ĉ +ĉ +ĉ + +Ċ +Ċ +Ċ +Ċ +Ċ + +ċ +ċ +ċ +ċ +ċ + +Č +Č +Č +Č +Č + +č +č +č +č +č + +Ď +Ď +Ď +Ď +Ď + +ď +ď +ď +ď +ď + +Ē +Ē +Ē +Ē +Ē + +ē +ē +ē +ē +ē + +Ĕ +Ĕ +Ĕ +Ĕ +Ĕ + +ĕ +ĕ +ĕ +ĕ +ĕ + +Ė +Ė +Ė +Ė +Ė + +ė +ė +ė +ė +ė + +Ę +Ę +Ę +Ę +Ę + +ę +ę +ę +ę +ę + +Ě +Ě +Ě +Ě +Ě + +ě +ě +ě +ě +ě + +Ĝ +Ĝ +Ĝ +Ĝ +Ĝ + +ĝ +ĝ +ĝ +ĝ +ĝ + +Ğ +Ğ +Ğ +Ğ +Ğ + +ğ +ğ +ğ +ğ +ğ + +Ġ +Ġ +Ġ +Ġ +Ġ + +ġ +ġ +ġ +ġ +ġ + +Ģ +Ģ +Ģ +Ģ +Ģ + +ģ +ģ +ģ +ģ +ģ + +Ĥ +Ĥ +Ĥ +Ĥ +Ĥ + +ĥ +ĥ +ĥ +ĥ +ĥ + +Ĩ +Ĩ +Ĩ +Ĩ +Ĩ + +ĩ +ĩ +ĩ +ĩ +ĩ + +Ī +Ī +Ī +Ī +Ī + +ī +ī +ī +ī +ī + +Ĭ +Ĭ +Ĭ +Ĭ +Ĭ + +ĭ +ĭ +ĭ +ĭ +ĭ + +Į +Į +Į +Į +Į + +į +į +į +į +į + +İ +İ +İ +İ +İ + +IJ +IJ +IJ +IJ +IJ + +ij +ij +ij +ij +ij + +Ĵ +Ĵ +Ĵ +Ĵ +Ĵ + +ĵ +ĵ +ĵ +ĵ +ĵ + +Ķ +Ķ +Ķ +Ķ +Ķ + +ķ +ķ +ķ +ķ +ķ + +Ĺ +Ĺ +Ĺ +Ĺ +Ĺ + +ĺ +ĺ +ĺ +ĺ +ĺ + +Ļ +Ļ +Ļ +Ļ +Ļ + +ļ +ļ +ļ +ļ +ļ + +Ľ +Ľ +Ľ +Ľ +Ľ + +ľ +ľ +ľ +ľ +ľ + +Ŀ +Ŀ +Ŀ +L· +L· + +ŀ +ŀ +ŀ +l· +l· + +Ń +Ń +Ń +Ń +Ń + +ń +ń +ń +ń +ń + +Ņ +Ņ +Ņ +Ņ +Ņ + +ņ +ņ +ņ +ņ +ņ + +Ň +Ň +Ň +Ň +Ň + +ň +ň +ň +ň +ň + +ʼn +ʼn +ʼn +ʼn +ʼn + +Ō +Ō +Ō +Ō +Ō + +ō +ō +ō +ō +ō + +Ŏ +Ŏ +Ŏ +Ŏ +Ŏ + +ŏ +ŏ +ŏ +ŏ +ŏ + +Ő +Ő +Ő +Ő +Ő + +ő +ő +ő +ő +ő + +Ŕ +Ŕ +Ŕ +Ŕ +Ŕ + +ŕ +ŕ +ŕ +ŕ +ŕ + +Ŗ +Ŗ +Ŗ +Ŗ +Ŗ + +ŗ +ŗ +ŗ +ŗ +ŗ + +Ř +Ř +Ř +Ř +Ř + +ř +ř +ř +ř +ř + +Ś +Ś +Ś +Ś +Ś + +ś +ś +ś +ś +ś + +Ŝ +Ŝ +Ŝ +Ŝ +Ŝ + +ŝ +ŝ +ŝ +ŝ +ŝ + +Ş +Ş +Ş +Ş +Ş + +ş +ş +ş +ş +ş + +Š +Š +Š +Š +Š + +š +š +š +š +š + +Ţ +Ţ +Ţ +Ţ +Ţ + +ţ +ţ +ţ +ţ +ţ + +Ť +Ť +Ť +Ť +Ť + +ť +ť +ť +ť +ť + +Ũ +Ũ +Ũ +Ũ +Ũ + +ũ +ũ +ũ +ũ +ũ + +Ū +Ū +Ū +Ū +Ū + +ū +ū +ū +ū +ū + +Ŭ +Ŭ +Ŭ +Ŭ +Ŭ + +ŭ +ŭ +ŭ +ŭ +ŭ + +Ů +Ů +Ů +Ů +Ů + +ů +ů +ů +ů +ů + +Ű +Ű +Ű +Ű +Ű + +ű +ű +ű +ű +ű + +Ų +Ų +Ų +Ų +Ų + +ų +ų +ų +ų +ų + +Ŵ +Ŵ +Ŵ +Ŵ +Ŵ + +ŵ +ŵ +ŵ +ŵ +ŵ + +Ŷ +Ŷ +Ŷ +Ŷ +Ŷ + +ŷ +ŷ +ŷ +ŷ +ŷ + +Ÿ +Ÿ +Ÿ +Ÿ +Ÿ + +Ź +Ź +Ź +Ź +Ź + +ź +ź +ź +ź +ź + +Ż +Ż +Ż +Ż +Ż + +ż +ż +ż +ż +ż + +Ž +Ž +Ž +Ž +Ž + +ž +ž +ž +ž +ž + +ſ +ſ +ſ +s +s + +Ơ +Ơ +Ơ +Ơ +Ơ + +ơ +ơ +ơ +ơ +ơ + +Ư +Ư +Ư +Ư +Ư + +ư +ư +ư +ư +ư + +DŽ +DŽ +DŽ +DŽ +DŽ + +Dž +Dž +Dž +Dž +Dž + +dž +dž +dž +dž +dž + +LJ +LJ +LJ +LJ +LJ + +Lj +Lj +Lj +Lj +Lj + +lj +lj +lj +lj +lj + +NJ +NJ +NJ +NJ +NJ + +Nj +Nj +Nj +Nj +Nj + +nj +nj +nj +nj +nj + +Ǎ +Ǎ +Ǎ +Ǎ +Ǎ + +ǎ +ǎ +ǎ +ǎ +ǎ + +Ǐ +Ǐ +Ǐ +Ǐ +Ǐ + +ǐ +ǐ +ǐ +ǐ +ǐ + +Ǒ +Ǒ +Ǒ +Ǒ +Ǒ + +ǒ +ǒ +ǒ +ǒ +ǒ + +Ǔ +Ǔ +Ǔ +Ǔ +Ǔ + +ǔ +ǔ +ǔ +ǔ +ǔ + +Ǖ +Ǖ +Ǖ +Ǖ +Ǖ + +ǖ +ǖ +ǖ +ǖ +ǖ + +Ǘ +Ǘ +Ǘ +Ǘ +Ǘ + +ǘ +ǘ +ǘ +ǘ +ǘ + +Ǚ +Ǚ +Ǚ +Ǚ +Ǚ + +ǚ +ǚ +ǚ +ǚ +ǚ + +Ǜ +Ǜ +Ǜ +Ǜ +Ǜ + +ǜ +ǜ +ǜ +ǜ +ǜ + +Ǟ +Ǟ +Ǟ +Ǟ +Ǟ + +ǟ +ǟ +ǟ +ǟ +ǟ + +Ǡ +Ǡ +Ǡ +Ǡ +Ǡ + +ǡ +ǡ +ǡ +ǡ +ǡ + +Ǣ +Ǣ +Ǣ +Ǣ +Ǣ + +ǣ +ǣ +ǣ +ǣ +ǣ + +Ǧ +Ǧ +Ǧ +Ǧ +Ǧ + +ǧ +ǧ +ǧ +ǧ +ǧ + +Ǩ +Ǩ +Ǩ +Ǩ +Ǩ + +ǩ +ǩ +ǩ +ǩ +ǩ + +Ǫ +Ǫ +Ǫ +Ǫ +Ǫ + +ǫ +ǫ +ǫ +ǫ +ǫ + +Ǭ +Ǭ +Ǭ +Ǭ +Ǭ + +ǭ +ǭ +ǭ +ǭ +ǭ + +Ǯ +Ǯ +Ǯ +Ǯ +Ǯ + +ǯ +ǯ +ǯ +ǯ +ǯ + +ǰ +ǰ +ǰ +ǰ +ǰ + +DZ +DZ +DZ +DZ +DZ + +Dz +Dz +Dz +Dz +Dz + +dz +dz +dz +dz +dz + +Ǵ +Ǵ +Ǵ +Ǵ +Ǵ + +ǵ +ǵ +ǵ +ǵ +ǵ + +Ǹ +Ǹ +Ǹ +Ǹ +Ǹ + +ǹ +ǹ +ǹ +ǹ +ǹ + +Ǻ +Ǻ +Ǻ +Ǻ +Ǻ + +ǻ +ǻ +ǻ +ǻ +ǻ + +Ǽ +Ǽ +Ǽ +Ǽ +Ǽ + +ǽ +ǽ +ǽ +ǽ +ǽ + +Ǿ +Ǿ +Ǿ +Ǿ +Ǿ + +ǿ +ǿ +ǿ +ǿ +ǿ + +Ȁ +Ȁ +Ȁ +Ȁ +Ȁ + +ȁ +ȁ +ȁ +ȁ +ȁ + +Ȃ +Ȃ +Ȃ +Ȃ +Ȃ + +ȃ +ȃ +ȃ +ȃ +ȃ + +Ȅ +Ȅ +Ȅ +Ȅ +Ȅ + +ȅ +ȅ +ȅ +ȅ +ȅ + +Ȇ +Ȇ +Ȇ +Ȇ +Ȇ + +ȇ +ȇ +ȇ +ȇ +ȇ + +Ȉ +Ȉ +Ȉ +Ȉ +Ȉ + +ȉ +ȉ +ȉ +ȉ +ȉ + +Ȋ +Ȋ +Ȋ +Ȋ +Ȋ + +ȋ +ȋ +ȋ +ȋ +ȋ + +Ȍ +Ȍ +Ȍ +Ȍ +Ȍ + +ȍ +ȍ +ȍ +ȍ +ȍ + +Ȏ +Ȏ +Ȏ +Ȏ +Ȏ + +ȏ +ȏ +ȏ +ȏ +ȏ + +Ȑ +Ȑ +Ȑ +Ȑ +Ȑ + +ȑ +ȑ +ȑ +ȑ +ȑ + +Ȓ +Ȓ +Ȓ +Ȓ +Ȓ + +ȓ +ȓ +ȓ +ȓ +ȓ + +Ȕ +Ȕ +Ȕ +Ȕ +Ȕ + +ȕ +ȕ +ȕ +ȕ +ȕ + +Ȗ +Ȗ +Ȗ +Ȗ +Ȗ + +ȗ +ȗ +ȗ +ȗ +ȗ + +Ș +Ș +Ș +Ș +Ș + +ș +ș +ș +ș +ș + +Ț +Ț +Ț +Ț +Ț + +ț +ț +ț +ț +ț + +Ȟ +Ȟ +Ȟ +Ȟ +Ȟ + +ȟ +ȟ +ȟ +ȟ +ȟ + +Ȧ +Ȧ +Ȧ +Ȧ +Ȧ + +ȧ +ȧ +ȧ +ȧ +ȧ + +Ȩ +Ȩ +Ȩ +Ȩ +Ȩ + +ȩ +ȩ +ȩ +ȩ +ȩ + +Ȫ +Ȫ +Ȫ +Ȫ +Ȫ + +ȫ +ȫ +ȫ +ȫ +ȫ + +Ȭ +Ȭ +Ȭ +Ȭ +Ȭ + +ȭ +ȭ +ȭ +ȭ +ȭ + +Ȯ +Ȯ +Ȯ +Ȯ +Ȯ + +ȯ +ȯ +ȯ +ȯ +ȯ + +Ȱ +Ȱ +Ȱ +Ȱ +Ȱ + +ȱ +ȱ +ȱ +ȱ +ȱ + +Ȳ +Ȳ +Ȳ +Ȳ +Ȳ + +ȳ +ȳ +ȳ +ȳ +ȳ + +ʰ +ʰ +ʰ +h +h + +ʱ +ʱ +ʱ +ɦ +ɦ + +ʲ +ʲ +ʲ +j +j + +ʳ +ʳ +ʳ +r +r + +ʴ +ʴ +ʴ +ɹ +ɹ + +ʵ +ʵ +ʵ +ɻ +ɻ + +ʶ +ʶ +ʶ +ʁ +ʁ + +ʷ +ʷ +ʷ +w +w + +ʸ +ʸ +ʸ +y +y + +˘ +˘ +˘ + ̆ + ̆ + +˙ +˙ +˙ + ̇ + ̇ + +˚ +˚ +˚ + ̊ + ̊ + +˛ +˛ +˛ + ̨ + ̨ + +˜ +˜ +˜ + ̃ + ̃ + +˝ +˝ +˝ + ̋ + ̋ + +ˠ +ˠ +ˠ +ɣ +ɣ + +ˡ +ˡ +ˡ +l +l + +ˢ +ˢ +ˢ +s +s + +ˣ +ˣ +ˣ +x +x + +ˤ +ˤ +ˤ +ʕ +ʕ + +̀ +̀ +̀ +̀ +̀ + +́ +́ +́ +́ +́ + +̓ +̓ +̓ +̓ +̓ + +̈́ +̈́ +̈́ +̈́ +̈́ + +ʹ +ʹ +ʹ +ʹ +ʹ + +ͺ +ͺ +ͺ + ͅ + ͅ + +; +; +; +; +; + +΄ +΄ +΄ + ́ + ́ + +΅ +΅ +΅ + ̈́ + ̈́ + +Ά +Ά +Ά +Ά +Ά + +· +· +· +· +· + +Έ +Έ +Έ +Έ +Έ + +Ή +Ή +Ή +Ή +Ή + +Ί +Ί +Ί +Ί +Ί + +Ό +Ό +Ό +Ό +Ό + +Ύ +Ύ +Ύ +Ύ +Ύ + +Ώ +Ώ +Ώ +Ώ +Ώ + +ΐ +ΐ +ΐ +ΐ +ΐ + +Ϊ +Ϊ +Ϊ +Ϊ +Ϊ + +Ϋ +Ϋ +Ϋ +Ϋ +Ϋ + +ά +ά +ά +ά +ά + +έ +έ +έ +έ +έ + +ή +ή +ή +ή +ή + +ί +ί +ί +ί +ί + +ΰ +ΰ +ΰ +ΰ +ΰ + +ϊ +ϊ +ϊ +ϊ +ϊ + +ϋ +ϋ +ϋ +ϋ +ϋ + +ό +ό +ό +ό +ό + +ύ +ύ +ύ +ύ +ύ + +ώ +ώ +ώ +ώ +ώ + +ϐ +ϐ +ϐ +β +β + +ϑ +ϑ +ϑ +θ +θ + +ϒ +ϒ +ϒ +Υ +Υ + +ϓ +ϓ +ϓ +Ύ +Ύ + +ϔ +ϔ +ϔ +Ϋ +Ϋ + +ϕ +ϕ +ϕ +φ +φ + +ϖ +ϖ +ϖ +π +π + +ϰ +ϰ +ϰ +κ +κ + +ϱ +ϱ +ϱ +ρ +ρ + +ϲ +ϲ +ϲ +ς +ς + +ϴ +ϴ +ϴ +Θ +Θ + +ϵ +ϵ +ϵ +ε +ε + +Ϲ +Ϲ +Ϲ +Σ +Σ + +Ѐ +Ѐ +Ѐ +Ѐ +Ѐ + +Ё +Ё +Ё +Ё +Ё + +Ѓ +Ѓ +Ѓ +Ѓ +Ѓ + +Ї +Ї +Ї +Ї +Ї + +Ќ +Ќ +Ќ +Ќ +Ќ + +Ѝ +Ѝ +Ѝ +Ѝ +Ѝ + +Ў +Ў +Ў +Ў +Ў + +Й +Й +Й +Й +Й + +й +й +й +й +й + +ѐ +ѐ +ѐ +ѐ +ѐ + +ё +ё +ё +ё +ё + +ѓ +ѓ +ѓ +ѓ +ѓ + +ї +ї +ї +ї +ї + +ќ +ќ +ќ +ќ +ќ + +ѝ +ѝ +ѝ +ѝ +ѝ + +ў +ў +ў +ў +ў + +Ѷ +Ѷ +Ѷ +Ѷ +Ѷ + +ѷ +ѷ +ѷ +ѷ +ѷ + +Ӂ +Ӂ +Ӂ +Ӂ +Ӂ + +ӂ +ӂ +ӂ +ӂ +ӂ + +Ӑ +Ӑ +Ӑ +Ӑ +Ӑ + +ӑ +ӑ +ӑ +ӑ +ӑ + +Ӓ +Ӓ +Ӓ +Ӓ +Ӓ + +ӓ +ӓ +ӓ +ӓ +ӓ + +Ӗ +Ӗ +Ӗ +Ӗ +Ӗ + +ӗ +ӗ +ӗ +ӗ +ӗ + +Ӛ +Ӛ +Ӛ +Ӛ +Ӛ + +ӛ +ӛ +ӛ +ӛ +ӛ + +Ӝ +Ӝ +Ӝ +Ӝ +Ӝ + +ӝ +ӝ +ӝ +ӝ +ӝ + +Ӟ +Ӟ +Ӟ +Ӟ +Ӟ + +ӟ +ӟ +ӟ +ӟ +ӟ + +Ӣ +Ӣ +Ӣ +Ӣ +Ӣ + +ӣ +ӣ +ӣ +ӣ +ӣ + +Ӥ +Ӥ +Ӥ +Ӥ +Ӥ + +ӥ +ӥ +ӥ +ӥ +ӥ + +Ӧ +Ӧ +Ӧ +Ӧ +Ӧ + +ӧ +ӧ +ӧ +ӧ +ӧ + +Ӫ +Ӫ +Ӫ +Ӫ +Ӫ + +ӫ +ӫ +ӫ +ӫ +ӫ + +Ӭ +Ӭ +Ӭ +Ӭ +Ӭ + +ӭ +ӭ +ӭ +ӭ +ӭ + +Ӯ +Ӯ +Ӯ +Ӯ +Ӯ + +ӯ +ӯ +ӯ +ӯ +ӯ + +Ӱ +Ӱ +Ӱ +Ӱ +Ӱ + +ӱ +ӱ +ӱ +ӱ +ӱ + +Ӳ +Ӳ +Ӳ +Ӳ +Ӳ + +ӳ +ӳ +ӳ +ӳ +ӳ + +Ӵ +Ӵ +Ӵ +Ӵ +Ӵ + +ӵ +ӵ +ӵ +ӵ +ӵ + +Ӹ +Ӹ +Ӹ +Ӹ +Ӹ + +ӹ +ӹ +ӹ +ӹ +ӹ + +և +և +և +եւ +եւ + +آ +آ +آ +آ +آ + +أ +أ +أ +أ +أ + +ؤ +ؤ +ؤ +ؤ +ؤ + +إ +إ +إ +إ +إ + +ئ +ئ +ئ +ئ +ئ + +ٵ +ٵ +ٵ +اٴ +اٴ + +ٶ +ٶ +ٶ +وٴ +وٴ + +ٷ +ٷ +ٷ +ۇٴ +ۇٴ + +ٸ +ٸ +ٸ +يٴ +يٴ + +ۀ +ۀ +ۀ +ۀ +ۀ + +ۂ +ۂ +ۂ +ۂ +ۂ + +ۓ +ۓ +ۓ +ۓ +ۓ + +ऩ +ऩ +ऩ +ऩ +ऩ + +ऱ +ऱ +ऱ +ऱ +ऱ + +ऴ +ऴ +ऴ +ऴ +ऴ + +क़ +क़ +क़ +क़ +क़ + +ख़ +ख़ +ख़ +ख़ +ख़ + +ग़ +ग़ +ग़ +ग़ +ग़ + +ज़ +ज़ +ज़ +ज़ +ज़ + +ड़ +ड़ +ड़ +ड़ +ड़ + +ढ़ +ढ़ +ढ़ +ढ़ +ढ़ + +फ़ +फ़ +फ़ +फ़ +फ़ + +य़ +य़ +य़ +य़ +य़ + +ো +ো +ো +ো +ো + +ৌ +ৌ +ৌ +ৌ +ৌ + +ড় +ড় +ড় +ড় +ড় + +ঢ় +ঢ় +ঢ় +ঢ় +ঢ় + +য় +য় +য় +য় +য় + +ਲ਼ +ਲ਼ +ਲ਼ +ਲ਼ +ਲ਼ + +ਸ਼ +ਸ਼ +ਸ਼ +ਸ਼ +ਸ਼ + +ਖ਼ +ਖ਼ +ਖ਼ +ਖ਼ +ਖ਼ + +ਗ਼ +ਗ਼ +ਗ਼ +ਗ਼ +ਗ਼ + +ਜ਼ +ਜ਼ +ਜ਼ +ਜ਼ +ਜ਼ + +ਫ਼ +ਫ਼ +ਫ਼ +ਫ਼ +ਫ਼ + +ୈ +ୈ +ୈ +ୈ +ୈ + +ୋ +ୋ +ୋ +ୋ +ୋ + +ୌ +ୌ +ୌ +ୌ +ୌ + +ଡ଼ +ଡ଼ +ଡ଼ +ଡ଼ +ଡ଼ + +ଢ଼ +ଢ଼ +ଢ଼ +ଢ଼ +ଢ଼ + +ஔ +ஔ +ஔ +ஔ +ஔ + +ொ +ொ +ொ +ொ +ொ + +ோ +ோ +ோ +ோ +ோ + +ௌ +ௌ +ௌ +ௌ +ௌ + +ై +ై +ై +ై +ై + +ೀ +ೀ +ೀ +ೀ +ೀ + +ೇ +ೇ +ೇ +ೇ +ೇ + +ೈ +ೈ +ೈ +ೈ +ೈ + +ೊ +ೊ +ೊ +ೊ +ೊ + +ೋ +ೋ +ೋ +ೋ +ೋ + +ൊ +ൊ +ൊ +ൊ +ൊ + +ോ +ോ +ോ +ോ +ോ + +ൌ +ൌ +ൌ +ൌ +ൌ + +ේ +ේ +ේ +ේ +ේ + +ො +ො +ො +ො +ො + +ෝ +ෝ +ෝ +ෝ +ෝ + +ෞ +ෞ +ෞ +ෞ +ෞ + +ำ +ำ +ำ +ํา +ํา + +ຳ +ຳ +ຳ +ໍາ +ໍາ + +ໜ +ໜ +ໜ +ຫນ +ຫນ + +ໝ +ໝ +ໝ +ຫມ +ຫມ + +༌ +༌ +༌ +་ +་ + +གྷ +གྷ +གྷ +གྷ +གྷ + +ཌྷ +ཌྷ +ཌྷ +ཌྷ +ཌྷ + +དྷ +དྷ +དྷ +དྷ +དྷ + +བྷ +བྷ +བྷ +བྷ +བྷ + +ཛྷ +ཛྷ +ཛྷ +ཛྷ +ཛྷ + +ཀྵ +ཀྵ +ཀྵ +ཀྵ +ཀྵ + +ཱི +ཱི +ཱི +ཱི +ཱི + +ཱུ +ཱུ +ཱུ +ཱུ +ཱུ + +ྲྀ +ྲྀ +ྲྀ +ྲྀ +ྲྀ + +ཷ +ཷ +ཷ +ྲཱྀ +ྲཱྀ + +ླྀ +ླྀ +ླྀ +ླྀ +ླྀ + +ཹ +ཹ +ཹ +ླཱྀ +ླཱྀ + +ཱྀ +ཱྀ +ཱྀ +ཱྀ +ཱྀ + +ྒྷ +ྒྷ +ྒྷ +ྒྷ +ྒྷ + +ྜྷ +ྜྷ +ྜྷ +ྜྷ +ྜྷ + +ྡྷ +ྡྷ +ྡྷ +ྡྷ +ྡྷ + +ྦྷ +ྦྷ +ྦྷ +ྦྷ +ྦྷ + +ྫྷ +ྫྷ +ྫྷ +ྫྷ +ྫྷ + +ྐྵ +ྐྵ +ྐྵ +ྐྵ +ྐྵ + +ဦ +ဦ +ဦ +ဦ +ဦ + +ჼ +ჼ +ჼ +ნ +ნ + +ᬆ +ᬆ +ᬆ +ᬆ +ᬆ + +ᬈ +ᬈ +ᬈ +ᬈ +ᬈ + +ᬊ +ᬊ +ᬊ +ᬊ +ᬊ + +ᬌ +ᬌ +ᬌ +ᬌ +ᬌ + +ᬎ +ᬎ +ᬎ +ᬎ +ᬎ + +ᬒ +ᬒ +ᬒ +ᬒ +ᬒ + +ᬻ +ᬻ +ᬻ +ᬻ +ᬻ + +ᬽ +ᬽ +ᬽ +ᬽ +ᬽ + +ᭀ +ᭀ +ᭀ +ᭀ +ᭀ + +ᭁ +ᭁ +ᭁ +ᭁ +ᭁ + +ᭃ +ᭃ +ᭃ +ᭃ +ᭃ + +ᴬ +ᴬ +ᴬ +A +A + +ᴭ +ᴭ +ᴭ +Æ +Æ + +ᴮ +ᴮ +ᴮ +B +B + +ᴰ +ᴰ +ᴰ +D +D + +ᴱ +ᴱ +ᴱ +E +E + +ᴲ +ᴲ +ᴲ +Ǝ +Ǝ + +ᴳ +ᴳ +ᴳ +G +G + +ᴴ +ᴴ +ᴴ +H +H + +ᴵ +ᴵ +ᴵ +I +I + +ᴶ +ᴶ +ᴶ +J +J + +ᴷ +ᴷ +ᴷ +K +K + +ᴸ +ᴸ +ᴸ +L +L + +ᴹ +ᴹ +ᴹ +M +M + +ᴺ +ᴺ +ᴺ +N +N + +ᴼ +ᴼ +ᴼ +O +O + +ᴽ +ᴽ +ᴽ +Ȣ +Ȣ + +ᴾ +ᴾ +ᴾ +P +P + +ᴿ +ᴿ +ᴿ +R +R + +ᵀ +ᵀ +ᵀ +T +T + +ᵁ +ᵁ +ᵁ +U +U + +ᵂ +ᵂ +ᵂ +W +W + +ᵃ +ᵃ +ᵃ +a +a + +ᵄ +ᵄ +ᵄ +ɐ +ɐ + +ᵅ +ᵅ +ᵅ +ɑ +ɑ + +ᵆ +ᵆ +ᵆ +ᴂ +ᴂ + +ᵇ +ᵇ +ᵇ +b +b + +ᵈ +ᵈ +ᵈ +d +d + +ᵉ +ᵉ +ᵉ +e +e + +ᵊ +ᵊ +ᵊ +ə +ə + +ᵋ +ᵋ +ᵋ +ɛ +ɛ + +ᵌ +ᵌ +ᵌ +ɜ +ɜ + +ᵍ +ᵍ +ᵍ +g +g + +ᵏ +ᵏ +ᵏ +k +k + +ᵐ +ᵐ +ᵐ +m +m + +ᵑ +ᵑ +ᵑ +ŋ +ŋ + +ᵒ +ᵒ +ᵒ +o +o + +ᵓ +ᵓ +ᵓ +ɔ +ɔ + +ᵔ +ᵔ +ᵔ +ᴖ +ᴖ + +ᵕ +ᵕ +ᵕ +ᴗ +ᴗ + +ᵖ +ᵖ +ᵖ +p +p + +ᵗ +ᵗ +ᵗ +t +t + +ᵘ +ᵘ +ᵘ +u +u + +ᵙ +ᵙ +ᵙ +ᴝ +ᴝ + +ᵚ +ᵚ +ᵚ +ɯ +ɯ + +ᵛ +ᵛ +ᵛ +v +v + +ᵜ +ᵜ +ᵜ +ᴥ +ᴥ + +ᵝ +ᵝ +ᵝ +β +β + +ᵞ +ᵞ +ᵞ +γ +γ + +ᵟ +ᵟ +ᵟ +δ +δ + +ᵠ +ᵠ +ᵠ +φ +φ + +ᵡ +ᵡ +ᵡ +χ +χ + +ᵢ +ᵢ +ᵢ +i +i + +ᵣ +ᵣ +ᵣ +r +r + +ᵤ +ᵤ +ᵤ +u +u + +ᵥ +ᵥ +ᵥ +v +v + +ᵦ +ᵦ +ᵦ +β +β + +ᵧ +ᵧ +ᵧ +γ +γ + +ᵨ +ᵨ +ᵨ +ρ +ρ + +ᵩ +ᵩ +ᵩ +φ +φ + +ᵪ +ᵪ +ᵪ +χ +χ + +ᵸ +ᵸ +ᵸ +н +н + +ᶛ +ᶛ +ᶛ +ɒ +ɒ + +ᶜ +ᶜ +ᶜ +c +c + +ᶝ +ᶝ +ᶝ +ɕ +ɕ + +ᶞ +ᶞ +ᶞ +ð +ð + +ᶟ +ᶟ +ᶟ +ɜ +ɜ + +ᶠ +ᶠ +ᶠ +f +f + +ᶡ +ᶡ +ᶡ +ɟ +ɟ + +ᶢ +ᶢ +ᶢ +ɡ +ɡ + +ᶣ +ᶣ +ᶣ +ɥ +ɥ + +ᶤ +ᶤ +ᶤ +ɨ +ɨ + +ᶥ +ᶥ +ᶥ +ɩ +ɩ + +ᶦ +ᶦ +ᶦ +ɪ +ɪ + +ᶧ +ᶧ +ᶧ +ᵻ +ᵻ + +ᶨ +ᶨ +ᶨ +ʝ +ʝ + +ᶩ +ᶩ +ᶩ +ɭ +ɭ + +ᶪ +ᶪ +ᶪ +ᶅ +ᶅ + +ᶫ +ᶫ +ᶫ +ʟ +ʟ + +ᶬ +ᶬ +ᶬ +ɱ +ɱ + +ᶭ +ᶭ +ᶭ +ɰ +ɰ + +ᶮ +ᶮ +ᶮ +ɲ +ɲ + +ᶯ +ᶯ +ᶯ +ɳ +ɳ + +ᶰ +ᶰ +ᶰ +ɴ +ɴ + +ᶱ +ᶱ +ᶱ +ɵ +ɵ + +ᶲ +ᶲ +ᶲ +ɸ +ɸ + +ᶳ +ᶳ +ᶳ +ʂ +ʂ + +ᶴ +ᶴ +ᶴ +ʃ +ʃ + +ᶵ +ᶵ +ᶵ +ƫ +ƫ + +ᶶ +ᶶ +ᶶ +ʉ +ʉ + +ᶷ +ᶷ +ᶷ +ʊ +ʊ + +ᶸ +ᶸ +ᶸ +ᴜ +ᴜ + +ᶹ +ᶹ +ᶹ +ʋ +ʋ + +ᶺ +ᶺ +ᶺ +ʌ +ʌ + +ᶻ +ᶻ +ᶻ +z +z + +ᶼ +ᶼ +ᶼ +ʐ +ʐ + +ᶽ +ᶽ +ᶽ +ʑ +ʑ + +ᶾ +ᶾ +ᶾ +ʒ +ʒ + +ᶿ +ᶿ +ᶿ +θ +θ + +Ḁ +Ḁ +Ḁ +Ḁ +Ḁ + +ḁ +ḁ +ḁ +ḁ +ḁ + +Ḃ +Ḃ +Ḃ +Ḃ +Ḃ + +ḃ +ḃ +ḃ +ḃ +ḃ + +Ḅ +Ḅ +Ḅ +Ḅ +Ḅ + +ḅ +ḅ +ḅ +ḅ +ḅ + +Ḇ +Ḇ +Ḇ +Ḇ +Ḇ + +ḇ +ḇ +ḇ +ḇ +ḇ + +Ḉ +Ḉ +Ḉ +Ḉ +Ḉ + +ḉ +ḉ +ḉ +ḉ +ḉ + +Ḋ +Ḋ +Ḋ +Ḋ +Ḋ + +ḋ +ḋ +ḋ +ḋ +ḋ + +Ḍ +Ḍ +Ḍ +Ḍ +Ḍ + +ḍ +ḍ +ḍ +ḍ +ḍ + +Ḏ +Ḏ +Ḏ +Ḏ +Ḏ + +ḏ +ḏ +ḏ +ḏ +ḏ + +Ḑ +Ḑ +Ḑ +Ḑ +Ḑ + +ḑ +ḑ +ḑ +ḑ +ḑ + +Ḓ +Ḓ +Ḓ +Ḓ +Ḓ + +ḓ +ḓ +ḓ +ḓ +ḓ + +Ḕ +Ḕ +Ḕ +Ḕ +Ḕ + +ḕ +ḕ +ḕ +ḕ +ḕ + +Ḗ +Ḗ +Ḗ +Ḗ +Ḗ + +ḗ +ḗ +ḗ +ḗ +ḗ + +Ḙ +Ḙ +Ḙ +Ḙ +Ḙ + +ḙ +ḙ +ḙ +ḙ +ḙ + +Ḛ +Ḛ +Ḛ +Ḛ +Ḛ + +ḛ +ḛ +ḛ +ḛ +ḛ + +Ḝ +Ḝ +Ḝ +Ḝ +Ḝ + +ḝ +ḝ +ḝ +ḝ +ḝ + +Ḟ +Ḟ +Ḟ +Ḟ +Ḟ + +ḟ +ḟ +ḟ +ḟ +ḟ + +Ḡ +Ḡ +Ḡ +Ḡ +Ḡ + +ḡ +ḡ +ḡ +ḡ +ḡ + +Ḣ +Ḣ +Ḣ +Ḣ +Ḣ + +ḣ +ḣ +ḣ +ḣ +ḣ + +Ḥ +Ḥ +Ḥ +Ḥ +Ḥ + +ḥ +ḥ +ḥ +ḥ +ḥ + +Ḧ +Ḧ +Ḧ +Ḧ +Ḧ + +ḧ +ḧ +ḧ +ḧ +ḧ + +Ḩ +Ḩ +Ḩ +Ḩ +Ḩ + +ḩ +ḩ +ḩ +ḩ +ḩ + +Ḫ +Ḫ +Ḫ +Ḫ +Ḫ + +ḫ +ḫ +ḫ +ḫ +ḫ + +Ḭ +Ḭ +Ḭ +Ḭ +Ḭ + +ḭ +ḭ +ḭ +ḭ +ḭ + +Ḯ +Ḯ +Ḯ +Ḯ +Ḯ + +ḯ +ḯ +ḯ +ḯ +ḯ + +Ḱ +Ḱ +Ḱ +Ḱ +Ḱ + +ḱ +ḱ +ḱ +ḱ +ḱ + +Ḳ +Ḳ +Ḳ +Ḳ +Ḳ + +ḳ +ḳ +ḳ +ḳ +ḳ + +Ḵ +Ḵ +Ḵ +Ḵ +Ḵ + +ḵ +ḵ +ḵ +ḵ +ḵ + +Ḷ +Ḷ +Ḷ +Ḷ +Ḷ + +ḷ +ḷ +ḷ +ḷ +ḷ + +Ḹ +Ḹ +Ḹ +Ḹ +Ḹ + +ḹ +ḹ +ḹ +ḹ +ḹ + +Ḻ +Ḻ +Ḻ +Ḻ +Ḻ + +ḻ +ḻ +ḻ +ḻ +ḻ + +Ḽ +Ḽ +Ḽ +Ḽ +Ḽ + +ḽ +ḽ +ḽ +ḽ +ḽ + +Ḿ +Ḿ +Ḿ +Ḿ +Ḿ + +ḿ +ḿ +ḿ +ḿ +ḿ + +Ṁ +Ṁ +Ṁ +Ṁ +Ṁ + +ṁ +ṁ +ṁ +ṁ +ṁ + +Ṃ +Ṃ +Ṃ +Ṃ +Ṃ + +ṃ +ṃ +ṃ +ṃ +ṃ + +Ṅ +Ṅ +Ṅ +Ṅ +Ṅ + +ṅ +ṅ +ṅ +ṅ +ṅ + +Ṇ +Ṇ +Ṇ +Ṇ +Ṇ + +ṇ +ṇ +ṇ +ṇ +ṇ + +Ṉ +Ṉ +Ṉ +Ṉ +Ṉ + +ṉ +ṉ +ṉ +ṉ +ṉ + +Ṋ +Ṋ +Ṋ +Ṋ +Ṋ + +ṋ +ṋ +ṋ +ṋ +ṋ + +Ṍ +Ṍ +Ṍ +Ṍ +Ṍ + +ṍ +ṍ +ṍ +ṍ +ṍ + +Ṏ +Ṏ +Ṏ +Ṏ +Ṏ + +ṏ +ṏ +ṏ +ṏ +ṏ + +Ṑ +Ṑ +Ṑ +Ṑ +Ṑ + +ṑ +ṑ +ṑ +ṑ +ṑ + +Ṓ +Ṓ +Ṓ +Ṓ +Ṓ + +ṓ +ṓ +ṓ +ṓ +ṓ + +Ṕ +Ṕ +Ṕ +Ṕ +Ṕ + +ṕ +ṕ +ṕ +ṕ +ṕ + +Ṗ +Ṗ +Ṗ +Ṗ +Ṗ + +ṗ +ṗ +ṗ +ṗ +ṗ + +Ṙ +Ṙ +Ṙ +Ṙ +Ṙ + +ṙ +ṙ +ṙ +ṙ +ṙ + +Ṛ +Ṛ +Ṛ +Ṛ +Ṛ + +ṛ +ṛ +ṛ +ṛ +ṛ + +Ṝ +Ṝ +Ṝ +Ṝ +Ṝ + +ṝ +ṝ +ṝ +ṝ +ṝ + +Ṟ +Ṟ +Ṟ +Ṟ +Ṟ + +ṟ +ṟ +ṟ +ṟ +ṟ + +Ṡ +Ṡ +Ṡ +Ṡ +Ṡ + +ṡ +ṡ +ṡ +ṡ +ṡ + +Ṣ +Ṣ +Ṣ +Ṣ +Ṣ + +ṣ +ṣ +ṣ +ṣ +ṣ + +Ṥ +Ṥ +Ṥ +Ṥ +Ṥ + +ṥ +ṥ +ṥ +ṥ +ṥ + +Ṧ +Ṧ +Ṧ +Ṧ +Ṧ + +ṧ +ṧ +ṧ +ṧ +ṧ + +Ṩ +Ṩ +Ṩ +Ṩ +Ṩ + +ṩ +ṩ +ṩ +ṩ +ṩ + +Ṫ +Ṫ +Ṫ +Ṫ +Ṫ + +ṫ +ṫ +ṫ +ṫ +ṫ + +Ṭ +Ṭ +Ṭ +Ṭ +Ṭ + +ṭ +ṭ +ṭ +ṭ +ṭ + +Ṯ +Ṯ +Ṯ +Ṯ +Ṯ + +ṯ +ṯ +ṯ +ṯ +ṯ + +Ṱ +Ṱ +Ṱ +Ṱ +Ṱ + +ṱ +ṱ +ṱ +ṱ +ṱ + +Ṳ +Ṳ +Ṳ +Ṳ +Ṳ + +ṳ +ṳ +ṳ +ṳ +ṳ + +Ṵ +Ṵ +Ṵ +Ṵ +Ṵ + +ṵ +ṵ +ṵ +ṵ +ṵ + +Ṷ +Ṷ +Ṷ +Ṷ +Ṷ + +ṷ +ṷ +ṷ +ṷ +ṷ + +Ṹ +Ṹ +Ṹ +Ṹ +Ṹ + +ṹ +ṹ +ṹ +ṹ +ṹ + +Ṻ +Ṻ +Ṻ +Ṻ +Ṻ + +ṻ +ṻ +ṻ +ṻ +ṻ + +Ṽ +Ṽ +Ṽ +Ṽ +Ṽ + +ṽ +ṽ +ṽ +ṽ +ṽ + +Ṿ +Ṿ +Ṿ +Ṿ +Ṿ + +ṿ +ṿ +ṿ +ṿ +ṿ + +Ẁ +Ẁ +Ẁ +Ẁ +Ẁ + +ẁ +ẁ +ẁ +ẁ +ẁ + +Ẃ +Ẃ +Ẃ +Ẃ +Ẃ + +ẃ +ẃ +ẃ +ẃ +ẃ + +Ẅ +Ẅ +Ẅ +Ẅ +Ẅ + +ẅ +ẅ +ẅ +ẅ +ẅ + +Ẇ +Ẇ +Ẇ +Ẇ +Ẇ + +ẇ +ẇ +ẇ +ẇ +ẇ + +Ẉ +Ẉ +Ẉ +Ẉ +Ẉ + +ẉ +ẉ +ẉ +ẉ +ẉ + +Ẋ +Ẋ +Ẋ +Ẋ +Ẋ + +ẋ +ẋ +ẋ +ẋ +ẋ + +Ẍ +Ẍ +Ẍ +Ẍ +Ẍ + +ẍ +ẍ +ẍ +ẍ +ẍ + +Ẏ +Ẏ +Ẏ +Ẏ +Ẏ + +ẏ +ẏ +ẏ +ẏ +ẏ + +Ẑ +Ẑ +Ẑ +Ẑ +Ẑ + +ẑ +ẑ +ẑ +ẑ +ẑ + +Ẓ +Ẓ +Ẓ +Ẓ +Ẓ + +ẓ +ẓ +ẓ +ẓ +ẓ + +Ẕ +Ẕ +Ẕ +Ẕ +Ẕ + +ẕ +ẕ +ẕ +ẕ +ẕ + +ẖ +ẖ +ẖ +ẖ +ẖ + +ẗ +ẗ +ẗ +ẗ +ẗ + +ẘ +ẘ +ẘ +ẘ +ẘ + +ẙ +ẙ +ẙ +ẙ +ẙ + +ẚ +ẚ +ẚ +aʾ +aʾ + +ẛ +ẛ +ẛ +ṡ +ṡ + +Ạ +Ạ +Ạ +Ạ +Ạ + +ạ +ạ +ạ +ạ +ạ + +Ả +Ả +Ả +Ả +Ả + +ả +ả +ả +ả +ả + +Ấ +Ấ +Ấ +Ấ +Ấ + +ấ +ấ +ấ +ấ +ấ + +Ầ +Ầ +Ầ +Ầ +Ầ + +ầ +ầ +ầ +ầ +ầ + +Ẩ +Ẩ +Ẩ +Ẩ +Ẩ + +ẩ +ẩ +ẩ +ẩ +ẩ + +Ẫ +Ẫ +Ẫ +Ẫ +Ẫ + +ẫ +ẫ +ẫ +ẫ +ẫ + +Ậ +Ậ +Ậ +Ậ +Ậ + +ậ +ậ +ậ +ậ +ậ + +Ắ +Ắ +Ắ +Ắ +Ắ + +ắ +ắ +ắ +ắ +ắ + +Ằ +Ằ +Ằ +Ằ +Ằ + +ằ +ằ +ằ +ằ +ằ + +Ẳ +Ẳ +Ẳ +Ẳ +Ẳ + +ẳ +ẳ +ẳ +ẳ +ẳ + +Ẵ +Ẵ +Ẵ +Ẵ +Ẵ + +ẵ +ẵ +ẵ +ẵ +ẵ + +Ặ +Ặ +Ặ +Ặ +Ặ + +ặ +ặ +ặ +ặ +ặ + +Ẹ +Ẹ +Ẹ +Ẹ +Ẹ + +ẹ +ẹ +ẹ +ẹ +ẹ + +Ẻ +Ẻ +Ẻ +Ẻ +Ẻ + +ẻ +ẻ +ẻ +ẻ +ẻ + +Ẽ +Ẽ +Ẽ +Ẽ +Ẽ + +ẽ +ẽ +ẽ +ẽ +ẽ + +Ế +Ế +Ế +Ế +Ế + +ế +ế +ế +ế +ế + +Ề +Ề +Ề +Ề +Ề + +ề +ề +ề +ề +ề + +Ể +Ể +Ể +Ể +Ể + +ể +ể +ể +ể +ể + +Ễ +Ễ +Ễ +Ễ +Ễ + +ễ +ễ +ễ +ễ +ễ + +Ệ +Ệ +Ệ +Ệ +Ệ + +ệ +ệ +ệ +ệ +ệ + +Ỉ +Ỉ +Ỉ +Ỉ +Ỉ + +ỉ +ỉ +ỉ +ỉ +ỉ + +Ị +Ị +Ị +Ị +Ị + +ị +ị +ị +ị +ị + +Ọ +Ọ +Ọ +Ọ +Ọ + +ọ +ọ +ọ +ọ +ọ + +Ỏ +Ỏ +Ỏ +Ỏ +Ỏ + +ỏ +ỏ +ỏ +ỏ +ỏ + +Ố +Ố +Ố +Ố +Ố + +ố +ố +ố +ố +ố + +Ồ +Ồ +Ồ +Ồ +Ồ + +ồ +ồ +ồ +ồ +ồ + +Ổ +Ổ +Ổ +Ổ +Ổ + +ổ +ổ +ổ +ổ +ổ + +Ỗ +Ỗ +Ỗ +Ỗ +Ỗ + +ỗ +ỗ +ỗ +ỗ +ỗ + +Ộ +Ộ +Ộ +Ộ +Ộ + +ộ +ộ +ộ +ộ +ộ + +Ớ +Ớ +Ớ +Ớ +Ớ + +ớ +ớ +ớ +ớ +ớ + +Ờ +Ờ +Ờ +Ờ +Ờ + +ờ +ờ +ờ +ờ +ờ + +Ở +Ở +Ở +Ở +Ở + +ở +ở +ở +ở +ở + +Ỡ +Ỡ +Ỡ +Ỡ +Ỡ + +ỡ +ỡ +ỡ +ỡ +ỡ + +Ợ +Ợ +Ợ +Ợ +Ợ + +ợ +ợ +ợ +ợ +ợ + +Ụ +Ụ +Ụ +Ụ +Ụ + +ụ +ụ +ụ +ụ +ụ + +Ủ +Ủ +Ủ +Ủ +Ủ + +ủ +ủ +ủ +ủ +ủ + +Ứ +Ứ +Ứ +Ứ +Ứ + +ứ +ứ +ứ +ứ +ứ + +Ừ +Ừ +Ừ +Ừ +Ừ + +ừ +ừ +ừ +ừ +ừ + +Ử +Ử +Ử +Ử +Ử + +ử +ử +ử +ử +ử + +Ữ +Ữ +Ữ +Ữ +Ữ + +ữ +ữ +ữ +ữ +ữ + +Ự +Ự +Ự +Ự +Ự + +ự +ự +ự +ự +ự + +Ỳ +Ỳ +Ỳ +Ỳ +Ỳ + +ỳ +ỳ +ỳ +ỳ +ỳ + +Ỵ +Ỵ +Ỵ +Ỵ +Ỵ + +ỵ +ỵ +ỵ +ỵ +ỵ + +Ỷ +Ỷ +Ỷ +Ỷ +Ỷ + +ỷ +ỷ +ỷ +ỷ +ỷ + +Ỹ +Ỹ +Ỹ +Ỹ +Ỹ + +ỹ +ỹ +ỹ +ỹ +ỹ + +ἀ +ἀ +ἀ +ἀ +ἀ + +ἁ +ἁ +ἁ +ἁ +ἁ + +ἂ +ἂ +ἂ +ἂ +ἂ + +ἃ +ἃ +ἃ +ἃ +ἃ + +ἄ +ἄ +ἄ +ἄ +ἄ + +ἅ +ἅ +ἅ +ἅ +ἅ + +ἆ +ἆ +ἆ +ἆ +ἆ + +ἇ +ἇ +ἇ +ἇ +ἇ + +Ἀ +Ἀ +Ἀ +Ἀ +Ἀ + +Ἁ +Ἁ +Ἁ +Ἁ +Ἁ + +Ἂ +Ἂ +Ἂ +Ἂ +Ἂ + +Ἃ +Ἃ +Ἃ +Ἃ +Ἃ + +Ἄ +Ἄ +Ἄ +Ἄ +Ἄ + +Ἅ +Ἅ +Ἅ +Ἅ +Ἅ + +Ἆ +Ἆ +Ἆ +Ἆ +Ἆ + +Ἇ +Ἇ +Ἇ +Ἇ +Ἇ + +ἐ +ἐ +ἐ +ἐ +ἐ + +ἑ +ἑ +ἑ +ἑ +ἑ + +ἒ +ἒ +ἒ +ἒ +ἒ + +ἓ +ἓ +ἓ +ἓ +ἓ + +ἔ +ἔ +ἔ +ἔ +ἔ + +ἕ +ἕ +ἕ +ἕ +ἕ + +Ἐ +Ἐ +Ἐ +Ἐ +Ἐ + +Ἑ +Ἑ +Ἑ +Ἑ +Ἑ + +Ἒ +Ἒ +Ἒ +Ἒ +Ἒ + +Ἓ +Ἓ +Ἓ +Ἓ +Ἓ + +Ἔ +Ἔ +Ἔ +Ἔ +Ἔ + +Ἕ +Ἕ +Ἕ +Ἕ +Ἕ + +ἠ +ἠ +ἠ +ἠ +ἠ + +ἡ +ἡ +ἡ +ἡ +ἡ + +ἢ +ἢ +ἢ +ἢ +ἢ + +ἣ +ἣ +ἣ +ἣ +ἣ + +ἤ +ἤ +ἤ +ἤ +ἤ + +ἥ +ἥ +ἥ +ἥ +ἥ + +ἦ +ἦ +ἦ +ἦ +ἦ + +ἧ +ἧ +ἧ +ἧ +ἧ + +Ἠ +Ἠ +Ἠ +Ἠ +Ἠ + +Ἡ +Ἡ +Ἡ +Ἡ +Ἡ + +Ἢ +Ἢ +Ἢ +Ἢ +Ἢ + +Ἣ +Ἣ +Ἣ +Ἣ +Ἣ + +Ἤ +Ἤ +Ἤ +Ἤ +Ἤ + +Ἥ +Ἥ +Ἥ +Ἥ +Ἥ + +Ἦ +Ἦ +Ἦ +Ἦ +Ἦ + +Ἧ +Ἧ +Ἧ +Ἧ +Ἧ + +ἰ +ἰ +ἰ +ἰ +ἰ + +ἱ +ἱ +ἱ +ἱ +ἱ + +ἲ +ἲ +ἲ +ἲ +ἲ + +ἳ +ἳ +ἳ +ἳ +ἳ + +ἴ +ἴ +ἴ +ἴ +ἴ + +ἵ +ἵ +ἵ +ἵ +ἵ + +ἶ +ἶ +ἶ +ἶ +ἶ + +ἷ +ἷ +ἷ +ἷ +ἷ + +Ἰ +Ἰ +Ἰ +Ἰ +Ἰ + +Ἱ +Ἱ +Ἱ +Ἱ +Ἱ + +Ἲ +Ἲ +Ἲ +Ἲ +Ἲ + +Ἳ +Ἳ +Ἳ +Ἳ +Ἳ + +Ἴ +Ἴ +Ἴ +Ἴ +Ἴ + +Ἵ +Ἵ +Ἵ +Ἵ +Ἵ + +Ἶ +Ἶ +Ἶ +Ἶ +Ἶ + +Ἷ +Ἷ +Ἷ +Ἷ +Ἷ + +ὀ +ὀ +ὀ +ὀ +ὀ + +ὁ +ὁ +ὁ +ὁ +ὁ + +ὂ +ὂ +ὂ +ὂ +ὂ + +ὃ +ὃ +ὃ +ὃ +ὃ + +ὄ +ὄ +ὄ +ὄ +ὄ + +ὅ +ὅ +ὅ +ὅ +ὅ + +Ὀ +Ὀ +Ὀ +Ὀ +Ὀ + +Ὁ +Ὁ +Ὁ +Ὁ +Ὁ + +Ὂ +Ὂ +Ὂ +Ὂ +Ὂ + +Ὃ +Ὃ +Ὃ +Ὃ +Ὃ + +Ὄ +Ὄ +Ὄ +Ὄ +Ὄ + +Ὅ +Ὅ +Ὅ +Ὅ +Ὅ + +ὐ +ὐ +ὐ +ὐ +ὐ + +ὑ +ὑ +ὑ +ὑ +ὑ + +ὒ +ὒ +ὒ +ὒ +ὒ + +ὓ +ὓ +ὓ +ὓ +ὓ + +ὔ +ὔ +ὔ +ὔ +ὔ + +ὕ +ὕ +ὕ +ὕ +ὕ + +ὖ +ὖ +ὖ +ὖ +ὖ + +ὗ +ὗ +ὗ +ὗ +ὗ + +Ὑ +Ὑ +Ὑ +Ὑ +Ὑ + +Ὓ +Ὓ +Ὓ +Ὓ +Ὓ + +Ὕ +Ὕ +Ὕ +Ὕ +Ὕ + +Ὗ +Ὗ +Ὗ +Ὗ +Ὗ + +ὠ +ὠ +ὠ +ὠ +ὠ + +ὡ +ὡ +ὡ +ὡ +ὡ + +ὢ +ὢ +ὢ +ὢ +ὢ + +ὣ +ὣ +ὣ +ὣ +ὣ + +ὤ +ὤ +ὤ +ὤ +ὤ + +ὥ +ὥ +ὥ +ὥ +ὥ + +ὦ +ὦ +ὦ +ὦ +ὦ + +ὧ +ὧ +ὧ +ὧ +ὧ + +Ὠ +Ὠ +Ὠ +Ὠ +Ὠ + +Ὡ +Ὡ +Ὡ +Ὡ +Ὡ + +Ὢ +Ὢ +Ὢ +Ὢ +Ὢ + +Ὣ +Ὣ +Ὣ +Ὣ +Ὣ + +Ὤ +Ὤ +Ὤ +Ὤ +Ὤ + +Ὥ +Ὥ +Ὥ +Ὥ +Ὥ + +Ὦ +Ὦ +Ὦ +Ὦ +Ὦ + +Ὧ +Ὧ +Ὧ +Ὧ +Ὧ + +ὰ +ὰ +ὰ +ὰ +ὰ + +ά +ά +ά +ά +ά + +ὲ +ὲ +ὲ +ὲ +ὲ + +έ +έ +έ +έ +έ + +ὴ +ὴ +ὴ +ὴ +ὴ + +ή +ή +ή +ή +ή + +ὶ +ὶ +ὶ +ὶ +ὶ + +ί +ί +ί +ί +ί + +ὸ +ὸ +ὸ +ὸ +ὸ + +ό +ό +ό +ό +ό + +ὺ +ὺ +ὺ +ὺ +ὺ + +ύ +ύ +ύ +ύ +ύ + +ὼ +ὼ +ὼ +ὼ +ὼ + +ώ +ώ +ώ +ώ +ώ + +ᾀ +ᾀ +ᾀ +ᾀ +ᾀ + +ᾁ +ᾁ +ᾁ +ᾁ +ᾁ + +ᾂ +ᾂ +ᾂ +ᾂ +ᾂ + +ᾃ +ᾃ +ᾃ +ᾃ +ᾃ + +ᾄ +ᾄ +ᾄ +ᾄ +ᾄ + +ᾅ +ᾅ +ᾅ +ᾅ +ᾅ + +ᾆ +ᾆ +ᾆ +ᾆ +ᾆ + +ᾇ +ᾇ +ᾇ +ᾇ +ᾇ + +ᾈ +ᾈ +ᾈ +ᾈ +ᾈ + +ᾉ +ᾉ +ᾉ +ᾉ +ᾉ + +ᾊ +ᾊ +ᾊ +ᾊ +ᾊ + +ᾋ +ᾋ +ᾋ +ᾋ +ᾋ + +ᾌ +ᾌ +ᾌ +ᾌ +ᾌ + +ᾍ +ᾍ +ᾍ +ᾍ +ᾍ + +ᾎ +ᾎ +ᾎ +ᾎ +ᾎ + +ᾏ +ᾏ +ᾏ +ᾏ +ᾏ + +ᾐ +ᾐ +ᾐ +ᾐ +ᾐ + +ᾑ +ᾑ +ᾑ +ᾑ +ᾑ + +ᾒ +ᾒ +ᾒ +ᾒ +ᾒ + +ᾓ +ᾓ +ᾓ +ᾓ +ᾓ + +ᾔ +ᾔ +ᾔ +ᾔ +ᾔ + +ᾕ +ᾕ +ᾕ +ᾕ +ᾕ + +ᾖ +ᾖ +ᾖ +ᾖ +ᾖ + +ᾗ +ᾗ +ᾗ +ᾗ +ᾗ + +ᾘ +ᾘ +ᾘ +ᾘ +ᾘ + +ᾙ +ᾙ +ᾙ +ᾙ +ᾙ + +ᾚ +ᾚ +ᾚ +ᾚ +ᾚ + +ᾛ +ᾛ +ᾛ +ᾛ +ᾛ + +ᾜ +ᾜ +ᾜ +ᾜ +ᾜ + +ᾝ +ᾝ +ᾝ +ᾝ +ᾝ + +ᾞ +ᾞ +ᾞ +ᾞ +ᾞ + +ᾟ +ᾟ +ᾟ +ᾟ +ᾟ + +ᾠ +ᾠ +ᾠ +ᾠ +ᾠ + +ᾡ +ᾡ +ᾡ +ᾡ +ᾡ + +ᾢ +ᾢ +ᾢ +ᾢ +ᾢ + +ᾣ +ᾣ +ᾣ +ᾣ +ᾣ + +ᾤ +ᾤ +ᾤ +ᾤ +ᾤ + +ᾥ +ᾥ +ᾥ +ᾥ +ᾥ + +ᾦ +ᾦ +ᾦ +ᾦ +ᾦ + +ᾧ +ᾧ +ᾧ +ᾧ +ᾧ + +ᾨ +ᾨ +ᾨ +ᾨ +ᾨ + +ᾩ +ᾩ +ᾩ +ᾩ +ᾩ + +ᾪ +ᾪ +ᾪ +ᾪ +ᾪ + +ᾫ +ᾫ +ᾫ +ᾫ +ᾫ + +ᾬ +ᾬ +ᾬ +ᾬ +ᾬ + +ᾭ +ᾭ +ᾭ +ᾭ +ᾭ + +ᾮ +ᾮ +ᾮ +ᾮ +ᾮ + +ᾯ +ᾯ +ᾯ +ᾯ +ᾯ + +ᾰ +ᾰ +ᾰ +ᾰ +ᾰ + +ᾱ +ᾱ +ᾱ +ᾱ +ᾱ + +ᾲ +ᾲ +ᾲ +ᾲ +ᾲ + +ᾳ +ᾳ +ᾳ +ᾳ +ᾳ + +ᾴ +ᾴ +ᾴ +ᾴ +ᾴ + +ᾶ +ᾶ +ᾶ +ᾶ +ᾶ + +ᾷ +ᾷ +ᾷ +ᾷ +ᾷ + +Ᾰ +Ᾰ +Ᾰ +Ᾰ +Ᾰ + +Ᾱ +Ᾱ +Ᾱ +Ᾱ +Ᾱ + +Ὰ +Ὰ +Ὰ +Ὰ +Ὰ + +Ά +Ά +Ά +Ά +Ά + +ᾼ +ᾼ +ᾼ +ᾼ +ᾼ + +᾽ +᾽ +᾽ + ̓ + ̓ + +ι +ι +ι +ι +ι + +᾿ +᾿ +᾿ + ̓ + ̓ + +῀ +῀ +῀ + ͂ + ͂ + +῁ +῁ +῁ + ̈͂ + ̈͂ + +ῂ +ῂ +ῂ +ῂ +ῂ + +ῃ +ῃ +ῃ +ῃ +ῃ + +ῄ +ῄ +ῄ +ῄ +ῄ + +ῆ +ῆ +ῆ +ῆ +ῆ + +ῇ +ῇ +ῇ +ῇ +ῇ + +Ὲ +Ὲ +Ὲ +Ὲ +Ὲ + +Έ +Έ +Έ +Έ +Έ + +Ὴ +Ὴ +Ὴ +Ὴ +Ὴ + +Ή +Ή +Ή +Ή +Ή + +ῌ +ῌ +ῌ +ῌ +ῌ + +῍ +῍ +῍ + ̓̀ + ̓̀ + +῎ +῎ +῎ + ̓́ + ̓́ + +῏ +῏ +῏ + ̓͂ + ̓͂ + +ῐ +ῐ +ῐ +ῐ +ῐ + +ῑ +ῑ +ῑ +ῑ +ῑ + +ῒ +ῒ +ῒ +ῒ +ῒ + +ΐ +ΐ +ΐ +ΐ +ΐ + +ῖ +ῖ +ῖ +ῖ +ῖ + +ῗ +ῗ +ῗ +ῗ +ῗ + +Ῐ +Ῐ +Ῐ +Ῐ +Ῐ + +Ῑ +Ῑ +Ῑ +Ῑ +Ῑ + +Ὶ +Ὶ +Ὶ +Ὶ +Ὶ + +Ί +Ί +Ί +Ί +Ί + +῝ +῝ +῝ + ̔̀ + ̔̀ + +῞ +῞ +῞ + ̔́ + ̔́ + +῟ +῟ +῟ + ̔͂ + ̔͂ + +ῠ +ῠ +ῠ +ῠ +ῠ + +ῡ +ῡ +ῡ +ῡ +ῡ + +ῢ +ῢ +ῢ +ῢ +ῢ + +ΰ +ΰ +ΰ +ΰ +ΰ + +ῤ +ῤ +ῤ +ῤ +ῤ + +ῥ +ῥ +ῥ +ῥ +ῥ + +ῦ +ῦ +ῦ +ῦ +ῦ + +ῧ +ῧ +ῧ +ῧ +ῧ + +Ῠ +Ῠ +Ῠ +Ῠ +Ῠ + +Ῡ +Ῡ +Ῡ +Ῡ +Ῡ + +Ὺ +Ὺ +Ὺ +Ὺ +Ὺ + +Ύ +Ύ +Ύ +Ύ +Ύ + +Ῥ +Ῥ +Ῥ +Ῥ +Ῥ + +῭ +῭ +῭ + ̈̀ + ̈̀ + +΅ +΅ +΅ + ̈́ + ̈́ + +` +` +` +` +` + +ῲ +ῲ +ῲ +ῲ +ῲ + +ῳ +ῳ +ῳ +ῳ +ῳ + +ῴ +ῴ +ῴ +ῴ +ῴ + +ῶ +ῶ +ῶ +ῶ +ῶ + +ῷ +ῷ +ῷ +ῷ +ῷ + +Ὸ +Ὸ +Ὸ +Ὸ +Ὸ + +Ό +Ό +Ό +Ό +Ό + +Ὼ +Ὼ +Ὼ +Ὼ +Ὼ + +Ώ +Ώ +Ώ +Ώ +Ώ + +ῼ +ῼ +ῼ +ῼ +ῼ + +´ +´ +´ + ́ + ́ + +῾ +῾ +῾ + ̔ + ̔ + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +‑ +‑ +‑ +‐ +‐ + +‗ +‗ +‗ + ̳ + ̳ + +․ +․ +․ +. +. + +‥ +‥ +‥ +.. +.. + +… +… +… +... +... + +  +  +  + + + +″ +″ +″ +′′ +′′ + +‴ +‴ +‴ +′′′ +′′′ + +‶ +‶ +‶ +‵‵ +‵‵ + +‷ +‷ +‷ +‵‵‵ +‵‵‵ + +‼ +‼ +‼ +!! +!! + +‾ +‾ +‾ + ̅ + ̅ + +⁇ +⁇ +⁇ +?? +?? + +⁈ +⁈ +⁈ +?! +?! + +⁉ +⁉ +⁉ +!? +!? + +⁗ +⁗ +⁗ +′′′′ +′′′′ + +  +  +  + + + +⁰ +⁰ +⁰ +0 +0 + +ⁱ +ⁱ +ⁱ +i +i + +⁴ +⁴ +⁴ +4 +4 + +⁵ +⁵ +⁵ +5 +5 + +⁶ +⁶ +⁶ +6 +6 + +⁷ +⁷ +⁷ +7 +7 + +⁸ +⁸ +⁸ +8 +8 + +⁹ +⁹ +⁹ +9 +9 + +⁺ +⁺ +⁺ ++ ++ + +⁻ +⁻ +⁻ +− +− + +⁼ +⁼ +⁼ += += + +⁽ +⁽ +⁽ +( +( + +⁾ +⁾ +⁾ +) +) + +ⁿ +ⁿ +ⁿ +n +n + +₀ +₀ +₀ +0 +0 + +₁ +₁ +₁ +1 +1 + +₂ +₂ +₂ +2 +2 + +₃ +₃ +₃ +3 +3 + +₄ +₄ +₄ +4 +4 + +₅ +₅ +₅ +5 +5 + +₆ +₆ +₆ +6 +6 + +₇ +₇ +₇ +7 +7 + +₈ +₈ +₈ +8 +8 + +₉ +₉ +₉ +9 +9 + +₊ +₊ +₊ ++ ++ + +₋ +₋ +₋ +− +− + +₌ +₌ +₌ += += + +₍ +₍ +₍ +( +( + +₎ +₎ +₎ +) +) + +ₐ +ₐ +ₐ +a +a + +ₑ +ₑ +ₑ +e +e + +ₒ +ₒ +ₒ +o +o + +ₓ +ₓ +ₓ +x +x + +ₔ +ₔ +ₔ +ə +ə + +ₕ +ₕ +ₕ +h +h + +ₖ +ₖ +ₖ +k +k + +ₗ +ₗ +ₗ +l +l + +ₘ +ₘ +ₘ +m +m + +ₙ +ₙ +ₙ +n +n + +ₚ +ₚ +ₚ +p +p + +ₛ +ₛ +ₛ +s +s + +ₜ +ₜ +ₜ +t +t + +₨ +₨ +₨ +Rs +Rs + +℀ +℀ +℀ +a/c +a/c + +℁ +℁ +℁ +a/s +a/s + +ℂ +ℂ +ℂ +C +C + +℃ +℃ +℃ +°C +°C + +℅ +℅ +℅ +c/o +c/o + +℆ +℆ +℆ +c/u +c/u + +ℇ +ℇ +ℇ +Ɛ +Ɛ + +℉ +℉ +℉ +°F +°F + +ℊ +ℊ +ℊ +g +g + +ℋ +ℋ +ℋ +H +H + +ℌ +ℌ +ℌ +H +H + +ℍ +ℍ +ℍ +H +H + +ℎ +ℎ +ℎ +h +h + +ℏ +ℏ +ℏ +ħ +ħ + +ℐ +ℐ +ℐ +I +I + +ℑ +ℑ +ℑ +I +I + +ℒ +ℒ +ℒ +L +L + +ℓ +ℓ +ℓ +l +l + +ℕ +ℕ +ℕ +N +N + +№ +№ +№ +No +No + +ℙ +ℙ +ℙ +P +P + +ℚ +ℚ +ℚ +Q +Q + +ℛ +ℛ +ℛ +R +R + +ℜ +ℜ +ℜ +R +R + +ℝ +ℝ +ℝ +R +R + +℠ +℠ +℠ +SM +SM + +℡ +℡ +℡ +TEL +TEL + +™ +™ +™ +TM +TM + +ℤ +ℤ +ℤ +Z +Z + +Ω +Ω +Ω +Ω +Ω + +ℨ +ℨ +ℨ +Z +Z + +K +K +K +K +K + +Å +Å +Å +Å +Å + +ℬ +ℬ +ℬ +B +B + +ℭ +ℭ +ℭ +C +C + +ℯ +ℯ +ℯ +e +e + +ℰ +ℰ +ℰ +E +E + +ℱ +ℱ +ℱ +F +F + +ℳ +ℳ +ℳ +M +M + +ℴ +ℴ +ℴ +o +o + +ℵ +ℵ +ℵ +א +א + +ℶ +ℶ +ℶ +ב +ב + +ℷ +ℷ +ℷ +ג +ג + +ℸ +ℸ +ℸ +ד +ד + +ℹ +ℹ +ℹ +i +i + +℻ +℻ +℻ +FAX +FAX + +ℼ +ℼ +ℼ +π +π + +ℽ +ℽ +ℽ +γ +γ + +ℾ +ℾ +ℾ +Γ +Γ + +ℿ +ℿ +ℿ +Π +Π + +⅀ +⅀ +⅀ +∑ +∑ + +ⅅ +ⅅ +ⅅ +D +D + +ⅆ +ⅆ +ⅆ +d +d + +ⅇ +ⅇ +ⅇ +e +e + +ⅈ +ⅈ +ⅈ +i +i + +ⅉ +ⅉ +ⅉ +j +j + +⅐ +⅐ +⅐ +1⁄7 +1⁄7 + +⅑ +⅑ +⅑ +1⁄9 +1⁄9 + +⅒ +⅒ +⅒ +1⁄10 +1⁄10 + +⅓ +⅓ +⅓ +1⁄3 +1⁄3 + +⅔ +⅔ +⅔ +2⁄3 +2⁄3 + +⅕ +⅕ +⅕ +1⁄5 +1⁄5 + +⅖ +⅖ +⅖ +2⁄5 +2⁄5 + +⅗ +⅗ +⅗ +3⁄5 +3⁄5 + +⅘ +⅘ +⅘ +4⁄5 +4⁄5 + +⅙ +⅙ +⅙ +1⁄6 +1⁄6 + +⅚ +⅚ +⅚ +5⁄6 +5⁄6 + +⅛ +⅛ +⅛ +1⁄8 +1⁄8 + +⅜ +⅜ +⅜ +3⁄8 +3⁄8 + +⅝ +⅝ +⅝ +5⁄8 +5⁄8 + +⅞ +⅞ +⅞ +7⁄8 +7⁄8 + +⅟ +⅟ +⅟ +1⁄ +1⁄ + +Ⅰ +Ⅰ +Ⅰ +I +I + +Ⅱ +Ⅱ +Ⅱ +II +II + +Ⅲ +Ⅲ +Ⅲ +III +III + +Ⅳ +Ⅳ +Ⅳ +IV +IV + +Ⅴ +Ⅴ +Ⅴ +V +V + +Ⅵ +Ⅵ +Ⅵ +VI +VI + +Ⅶ +Ⅶ +Ⅶ +VII +VII + +Ⅷ +Ⅷ +Ⅷ +VIII +VIII + +Ⅸ +Ⅸ +Ⅸ +IX +IX + +Ⅹ +Ⅹ +Ⅹ +X +X + +Ⅺ +Ⅺ +Ⅺ +XI +XI + +Ⅻ +Ⅻ +Ⅻ +XII +XII + +Ⅼ +Ⅼ +Ⅼ +L +L + +Ⅽ +Ⅽ +Ⅽ +C +C + +Ⅾ +Ⅾ +Ⅾ +D +D + +Ⅿ +Ⅿ +Ⅿ +M +M + +ⅰ +ⅰ +ⅰ +i +i + +ⅱ +ⅱ +ⅱ +ii +ii + +ⅲ +ⅲ +ⅲ +iii +iii + +ⅳ +ⅳ +ⅳ +iv +iv + +ⅴ +ⅴ +ⅴ +v +v + +ⅵ +ⅵ +ⅵ +vi +vi + +ⅶ +ⅶ +ⅶ +vii +vii + +ⅷ +ⅷ +ⅷ +viii +viii + +ⅸ +ⅸ +ⅸ +ix +ix + +ⅹ +ⅹ +ⅹ +x +x + +ⅺ +ⅺ +ⅺ +xi +xi + +ⅻ +ⅻ +ⅻ +xii +xii + +ⅼ +ⅼ +ⅼ +l +l + +ⅽ +ⅽ +ⅽ +c +c + +ⅾ +ⅾ +ⅾ +d +d + +ⅿ +ⅿ +ⅿ +m +m + +↉ +↉ +↉ +0⁄3 +0⁄3 + +↚ +↚ +↚ +↚ +↚ + +↛ +↛ +↛ +↛ +↛ + +↮ +↮ +↮ +↮ +↮ + +⇍ +⇍ +⇍ +⇍ +⇍ + +⇎ +⇎ +⇎ +⇎ +⇎ + +⇏ +⇏ +⇏ +⇏ +⇏ + +∄ +∄ +∄ +∄ +∄ + +∉ +∉ +∉ +∉ +∉ + +∌ +∌ +∌ +∌ +∌ + +∤ +∤ +∤ +∤ +∤ + +∦ +∦ +∦ +∦ +∦ + +∬ +∬ +∬ +∫∫ +∫∫ + +∭ +∭ +∭ +∫∫∫ +∫∫∫ + +∯ +∯ +∯ +∮∮ +∮∮ + +∰ +∰ +∰ +∮∮∮ +∮∮∮ + +≁ +≁ +≁ +≁ +≁ + +≄ +≄ +≄ +≄ +≄ + +≇ +≇ +≇ +≇ +≇ + +≉ +≉ +≉ +≉ +≉ + +≠ +≠ +≠ +≠ +≠ + +≢ +≢ +≢ +≢ +≢ + +≭ +≭ +≭ +≭ +≭ + +≮ +≮ +≮ +≮ +≮ + +≯ +≯ +≯ +≯ +≯ + +≰ +≰ +≰ +≰ +≰ + +≱ +≱ +≱ +≱ +≱ + +≴ +≴ +≴ +≴ +≴ + +≵ +≵ +≵ +≵ +≵ + +≸ +≸ +≸ +≸ +≸ + +≹ +≹ +≹ +≹ +≹ + +⊀ +⊀ +⊀ +⊀ +⊀ + +⊁ +⊁ +⊁ +⊁ +⊁ + +⊄ +⊄ +⊄ +⊄ +⊄ + +⊅ +⊅ +⊅ +⊅ +⊅ + +⊈ +⊈ +⊈ +⊈ +⊈ + +⊉ +⊉ +⊉ +⊉ +⊉ + +⊬ +⊬ +⊬ +⊬ +⊬ + +⊭ +⊭ +⊭ +⊭ +⊭ + +⊮ +⊮ +⊮ +⊮ +⊮ + +⊯ +⊯ +⊯ +⊯ +⊯ + +⋠ +⋠ +⋠ +⋠ +⋠ + +⋡ +⋡ +⋡ +⋡ +⋡ + +⋢ +⋢ +⋢ +⋢ +⋢ + +⋣ +⋣ +⋣ +⋣ +⋣ + +⋪ +⋪ +⋪ +⋪ +⋪ + +⋫ +⋫ +⋫ +⋫ +⋫ + +⋬ +⋬ +⋬ +⋬ +⋬ + +⋭ +⋭ +⋭ +⋭ +⋭ + +〈 +〈 +〈 +〈 +〈 + +〉 +〉 +〉 +〉 +〉 + +① +① +① +1 +1 + +② +② +② +2 +2 + +③ +③ +③ +3 +3 + +④ +④ +④ +4 +4 + +⑤ +⑤ +⑤ +5 +5 + +⑥ +⑥ +⑥ +6 +6 + +⑦ +⑦ +⑦ +7 +7 + +⑧ +⑧ +⑧ +8 +8 + +⑨ +⑨ +⑨ +9 +9 + +⑩ +⑩ +⑩ +10 +10 + +⑪ +⑪ +⑪ +11 +11 + +⑫ +⑫ +⑫ +12 +12 + +⑬ +⑬ +⑬ +13 +13 + +⑭ +⑭ +⑭ +14 +14 + +⑮ +⑮ +⑮ +15 +15 + +⑯ +⑯ +⑯ +16 +16 + +⑰ +⑰ +⑰ +17 +17 + +⑱ +⑱ +⑱ +18 +18 + +⑲ +⑲ +⑲ +19 +19 + +⑳ +⑳ +⑳ +20 +20 + +⑴ +⑴ +⑴ +(1) +(1) + +⑵ +⑵ +⑵ +(2) +(2) + +⑶ +⑶ +⑶ +(3) +(3) + +⑷ +⑷ +⑷ +(4) +(4) + +⑸ +⑸ +⑸ +(5) +(5) + +⑹ +⑹ +⑹ +(6) +(6) + +⑺ +⑺ +⑺ +(7) +(7) + +⑻ +⑻ +⑻ +(8) +(8) + +⑼ +⑼ +⑼ +(9) +(9) + +⑽ +⑽ +⑽ +(10) +(10) + +⑾ +⑾ +⑾ +(11) +(11) + +⑿ +⑿ +⑿ +(12) +(12) + +⒀ +⒀ +⒀ +(13) +(13) + +⒁ +⒁ +⒁ +(14) +(14) + +⒂ +⒂ +⒂ +(15) +(15) + +⒃ +⒃ +⒃ +(16) +(16) + +⒄ +⒄ +⒄ +(17) +(17) + +⒅ +⒅ +⒅ +(18) +(18) + +⒆ +⒆ +⒆ +(19) +(19) + +⒇ +⒇ +⒇ +(20) +(20) + +⒈ +⒈ +⒈ +1. +1. + +⒉ +⒉ +⒉ +2. +2. + +⒊ +⒊ +⒊ +3. +3. + +⒋ +⒋ +⒋ +4. +4. + +⒌ +⒌ +⒌ +5. +5. + +⒍ +⒍ +⒍ +6. +6. + +⒎ +⒎ +⒎ +7. +7. + +⒏ +⒏ +⒏ +8. +8. + +⒐ +⒐ +⒐ +9. +9. + +⒑ +⒑ +⒑ +10. +10. + +⒒ +⒒ +⒒ +11. +11. + +⒓ +⒓ +⒓ +12. +12. + +⒔ +⒔ +⒔ +13. +13. + +⒕ +⒕ +⒕ +14. +14. + +⒖ +⒖ +⒖ +15. +15. + +⒗ +⒗ +⒗ +16. +16. + +⒘ +⒘ +⒘ +17. +17. + +⒙ +⒙ +⒙ +18. +18. + +⒚ +⒚ +⒚ +19. +19. + +⒛ +⒛ +⒛ +20. +20. + +⒜ +⒜ +⒜ +(a) +(a) + +⒝ +⒝ +⒝ +(b) +(b) + +⒞ +⒞ +⒞ +(c) +(c) + +⒟ +⒟ +⒟ +(d) +(d) + +⒠ +⒠ +⒠ +(e) +(e) + +⒡ +⒡ +⒡ +(f) +(f) + +⒢ +⒢ +⒢ +(g) +(g) + +⒣ +⒣ +⒣ +(h) +(h) + +⒤ +⒤ +⒤ +(i) +(i) + +⒥ +⒥ +⒥ +(j) +(j) + +⒦ +⒦ +⒦ +(k) +(k) + +⒧ +⒧ +⒧ +(l) +(l) + +⒨ +⒨ +⒨ +(m) +(m) + +⒩ +⒩ +⒩ +(n) +(n) + +⒪ +⒪ +⒪ +(o) +(o) + +⒫ +⒫ +⒫ +(p) +(p) + +⒬ +⒬ +⒬ +(q) +(q) + +⒭ +⒭ +⒭ +(r) +(r) + +⒮ +⒮ +⒮ +(s) +(s) + +⒯ +⒯ +⒯ +(t) +(t) + +⒰ +⒰ +⒰ +(u) +(u) + +⒱ +⒱ +⒱ +(v) +(v) + +⒲ +⒲ +⒲ +(w) +(w) + +⒳ +⒳ +⒳ +(x) +(x) + +⒴ +⒴ +⒴ +(y) +(y) + +⒵ +⒵ +⒵ +(z) +(z) + +Ⓐ +Ⓐ +Ⓐ +A +A + +Ⓑ +Ⓑ +Ⓑ +B +B + +Ⓒ +Ⓒ +Ⓒ +C +C + +Ⓓ +Ⓓ +Ⓓ +D +D + +Ⓔ +Ⓔ +Ⓔ +E +E + +Ⓕ +Ⓕ +Ⓕ +F +F + +Ⓖ +Ⓖ +Ⓖ +G +G + +Ⓗ +Ⓗ +Ⓗ +H +H + +Ⓘ +Ⓘ +Ⓘ +I +I + +Ⓙ +Ⓙ +Ⓙ +J +J + +Ⓚ +Ⓚ +Ⓚ +K +K + +Ⓛ +Ⓛ +Ⓛ +L +L + +Ⓜ +Ⓜ +Ⓜ +M +M + +Ⓝ +Ⓝ +Ⓝ +N +N + +Ⓞ +Ⓞ +Ⓞ +O +O + +Ⓟ +Ⓟ +Ⓟ +P +P + +Ⓠ +Ⓠ +Ⓠ +Q +Q + +Ⓡ +Ⓡ +Ⓡ +R +R + +Ⓢ +Ⓢ +Ⓢ +S +S + +Ⓣ +Ⓣ +Ⓣ +T +T + +Ⓤ +Ⓤ +Ⓤ +U +U + +Ⓥ +Ⓥ +Ⓥ +V +V + +Ⓦ +Ⓦ +Ⓦ +W +W + +Ⓧ +Ⓧ +Ⓧ +X +X + +Ⓨ +Ⓨ +Ⓨ +Y +Y + +Ⓩ +Ⓩ +Ⓩ +Z +Z + +ⓐ +ⓐ +ⓐ +a +a + +ⓑ +ⓑ +ⓑ +b +b + +ⓒ +ⓒ +ⓒ +c +c + +ⓓ +ⓓ +ⓓ +d +d + +ⓔ +ⓔ +ⓔ +e +e + +ⓕ +ⓕ +ⓕ +f +f + +ⓖ +ⓖ +ⓖ +g +g + +ⓗ +ⓗ +ⓗ +h +h + +ⓘ +ⓘ +ⓘ +i +i + +ⓙ +ⓙ +ⓙ +j +j + +ⓚ +ⓚ +ⓚ +k +k + +ⓛ +ⓛ +ⓛ +l +l + +ⓜ +ⓜ +ⓜ +m +m + +ⓝ +ⓝ +ⓝ +n +n + +ⓞ +ⓞ +ⓞ +o +o + +ⓟ +ⓟ +ⓟ +p +p + +ⓠ +ⓠ +ⓠ +q +q + +ⓡ +ⓡ +ⓡ +r +r + +ⓢ +ⓢ +ⓢ +s +s + +ⓣ +ⓣ +ⓣ +t +t + +ⓤ +ⓤ +ⓤ +u +u + +ⓥ +ⓥ +ⓥ +v +v + +ⓦ +ⓦ +ⓦ +w +w + +ⓧ +ⓧ +ⓧ +x +x + +ⓨ +ⓨ +ⓨ +y +y + +ⓩ +ⓩ +ⓩ +z +z + +⓪ +⓪ +⓪ +0 +0 + +⨌ +⨌ +⨌ +∫∫∫∫ +∫∫∫∫ + +⩴ +⩴ +⩴ +::= +::= + +⩵ +⩵ +⩵ +== +== + +⩶ +⩶ +⩶ +=== +=== + +⫝̸ +⫝̸ +⫝̸ +⫝̸ +⫝̸ + +ⱼ +ⱼ +ⱼ +j +j + +ⱽ +ⱽ +ⱽ +V +V + +ⵯ +ⵯ +ⵯ +ⵡ +ⵡ + +⺟ +⺟ +⺟ +母 +母 + +⻳ +⻳ +⻳ +龟 +龟 + +⼀ +⼀ +⼀ +一 +一 + +⼁ +⼁ +⼁ +丨 +丨 + +⼂ +⼂ +⼂ +丶 +丶 + +⼃ +⼃ +⼃ +丿 +丿 + +⼄ +⼄ +⼄ +乙 +乙 + +⼅ +⼅ +⼅ +亅 +亅 + +⼆ +⼆ +⼆ +二 +二 + +⼇ +⼇ +⼇ +亠 +亠 + +⼈ +⼈ +⼈ +人 +人 + +⼉ +⼉ +⼉ +儿 +儿 + +⼊ +⼊ +⼊ +入 +入 + +⼋ +⼋ +⼋ +八 +八 + +⼌ +⼌ +⼌ +冂 +冂 + +⼍ +⼍ +⼍ +冖 +冖 + +⼎ +⼎ +⼎ +冫 +冫 + +⼏ +⼏ +⼏ +几 +几 + +⼐ +⼐ +⼐ +凵 +凵 + +⼑ +⼑ +⼑ +刀 +刀 + +⼒ +⼒ +⼒ +力 +力 + +⼓ +⼓ +⼓ +勹 +勹 + +⼔ +⼔ +⼔ +匕 +匕 + +⼕ +⼕ +⼕ +匚 +匚 + +⼖ +⼖ +⼖ +匸 +匸 + +⼗ +⼗ +⼗ +十 +十 + +⼘ +⼘ +⼘ +卜 +卜 + +⼙ +⼙ +⼙ +卩 +卩 + +⼚ +⼚ +⼚ +厂 +厂 + +⼛ +⼛ +⼛ +厶 +厶 + +⼜ +⼜ +⼜ +又 +又 + +⼝ +⼝ +⼝ +口 +口 + +⼞ +⼞ +⼞ +囗 +囗 + +⼟ +⼟ +⼟ +土 +土 + +⼠ +⼠ +⼠ +士 +士 + +⼡ +⼡ +⼡ +夂 +夂 + +⼢ +⼢ +⼢ +夊 +夊 + +⼣ +⼣ +⼣ +夕 +夕 + +⼤ +⼤ +⼤ +大 +大 + +⼥ +⼥ +⼥ +女 +女 + +⼦ +⼦ +⼦ +子 +子 + +⼧ +⼧ +⼧ +宀 +宀 + +⼨ +⼨ +⼨ +寸 +寸 + +⼩ +⼩ +⼩ +小 +小 + +⼪ +⼪ +⼪ +尢 +尢 + +⼫ +⼫ +⼫ +尸 +尸 + +⼬ +⼬ +⼬ +屮 +屮 + +⼭ +⼭ +⼭ +山 +山 + +⼮ +⼮ +⼮ +巛 +巛 + +⼯ +⼯ +⼯ +工 +工 + +⼰ +⼰ +⼰ +己 +己 + +⼱ +⼱ +⼱ +巾 +巾 + +⼲ +⼲ +⼲ +干 +干 + +⼳ +⼳ +⼳ +幺 +幺 + +⼴ +⼴ +⼴ +广 +广 + +⼵ +⼵ +⼵ +廴 +廴 + +⼶ +⼶ +⼶ +廾 +廾 + +⼷ +⼷ +⼷ +弋 +弋 + +⼸ +⼸ +⼸ +弓 +弓 + +⼹ +⼹ +⼹ +彐 +彐 + +⼺ +⼺ +⼺ +彡 +彡 + +⼻ +⼻ +⼻ +彳 +彳 + +⼼ +⼼ +⼼ +心 +心 + +⼽ +⼽ +⼽ +戈 +戈 + +⼾ +⼾ +⼾ +戶 +戶 + +⼿ +⼿ +⼿ +手 +手 + +⽀ +⽀ +⽀ +支 +支 + +⽁ +⽁ +⽁ +攴 +攴 + +⽂ +⽂ +⽂ +文 +文 + +⽃ +⽃ +⽃ +斗 +斗 + +⽄ +⽄ +⽄ +斤 +斤 + +⽅ +⽅ +⽅ +方 +方 + +⽆ +⽆ +⽆ +无 +无 + +⽇ +⽇ +⽇ +日 +日 + +⽈ +⽈ +⽈ +曰 +曰 + +⽉ +⽉ +⽉ +月 +月 + +⽊ +⽊ +⽊ +木 +木 + +⽋ +⽋ +⽋ +欠 +欠 + +⽌ +⽌ +⽌ +止 +止 + +⽍ +⽍ +⽍ +歹 +歹 + +⽎ +⽎ +⽎ +殳 +殳 + +⽏ +⽏ +⽏ +毋 +毋 + +⽐ +⽐ +⽐ +比 +比 + +⽑ +⽑ +⽑ +毛 +毛 + +⽒ +⽒ +⽒ +氏 +氏 + +⽓ +⽓ +⽓ +气 +气 + +⽔ +⽔ +⽔ +水 +水 + +⽕ +⽕ +⽕ +火 +火 + +⽖ +⽖ +⽖ +爪 +爪 + +⽗ +⽗ +⽗ +父 +父 + +⽘ +⽘ +⽘ +爻 +爻 + +⽙ +⽙ +⽙ +爿 +爿 + +⽚ +⽚ +⽚ +片 +片 + +⽛ +⽛ +⽛ +牙 +牙 + +⽜ +⽜ +⽜ +牛 +牛 + +⽝ +⽝ +⽝ +犬 +犬 + +⽞ +⽞ +⽞ +玄 +玄 + +⽟ +⽟ +⽟ +玉 +玉 + +⽠ +⽠ +⽠ +瓜 +瓜 + +⽡ +⽡ +⽡ +瓦 +瓦 + +⽢ +⽢ +⽢ +甘 +甘 + +⽣ +⽣ +⽣ +生 +生 + +⽤ +⽤ +⽤ +用 +用 + +⽥ +⽥ +⽥ +田 +田 + +⽦ +⽦ +⽦ +疋 +疋 + +⽧ +⽧ +⽧ +疒 +疒 + +⽨ +⽨ +⽨ +癶 +癶 + +⽩ +⽩ +⽩ +白 +白 + +⽪ +⽪ +⽪ +皮 +皮 + +⽫ +⽫ +⽫ +皿 +皿 + +⽬ +⽬ +⽬ +目 +目 + +⽭ +⽭ +⽭ +矛 +矛 + +⽮ +⽮ +⽮ +矢 +矢 + +⽯ +⽯ +⽯ +石 +石 + +⽰ +⽰ +⽰ +示 +示 + +⽱ +⽱ +⽱ +禸 +禸 + +⽲ +⽲ +⽲ +禾 +禾 + +⽳ +⽳ +⽳ +穴 +穴 + +⽴ +⽴ +⽴ +立 +立 + +⽵ +⽵ +⽵ +竹 +竹 + +⽶ +⽶ +⽶ +米 +米 + +⽷ +⽷ +⽷ +糸 +糸 + +⽸ +⽸ +⽸ +缶 +缶 + +⽹ +⽹ +⽹ +网 +网 + +⽺ +⽺ +⽺ +羊 +羊 + +⽻ +⽻ +⽻ +羽 +羽 + +⽼ +⽼ +⽼ +老 +老 + +⽽ +⽽ +⽽ +而 +而 + +⽾ +⽾ +⽾ +耒 +耒 + +⽿ +⽿ +⽿ +耳 +耳 + +⾀ +⾀ +⾀ +聿 +聿 + +⾁ +⾁ +⾁ +肉 +肉 + +⾂ +⾂ +⾂ +臣 +臣 + +⾃ +⾃ +⾃ +自 +自 + +⾄ +⾄ +⾄ +至 +至 + +⾅ +⾅ +⾅ +臼 +臼 + +⾆ +⾆ +⾆ +舌 +舌 + +⾇ +⾇ +⾇ +舛 +舛 + +⾈ +⾈ +⾈ +舟 +舟 + +⾉ +⾉ +⾉ +艮 +艮 + +⾊ +⾊ +⾊ +色 +色 + +⾋ +⾋ +⾋ +艸 +艸 + +⾌ +⾌ +⾌ +虍 +虍 + +⾍ +⾍ +⾍ +虫 +虫 + +⾎ +⾎ +⾎ +血 +血 + +⾏ +⾏ +⾏ +行 +行 + +⾐ +⾐ +⾐ +衣 +衣 + +⾑ +⾑ +⾑ +襾 +襾 + +⾒ +⾒ +⾒ +見 +見 + +⾓ +⾓ +⾓ +角 +角 + +⾔ +⾔ +⾔ +言 +言 + +⾕ +⾕ +⾕ +谷 +谷 + +⾖ +⾖ +⾖ +豆 +豆 + +⾗ +⾗ +⾗ +豕 +豕 + +⾘ +⾘ +⾘ +豸 +豸 + +⾙ +⾙ +⾙ +貝 +貝 + +⾚ +⾚ +⾚ +赤 +赤 + +⾛ +⾛ +⾛ +走 +走 + +⾜ +⾜ +⾜ +足 +足 + +⾝ +⾝ +⾝ +身 +身 + +⾞ +⾞ +⾞ +車 +車 + +⾟ +⾟ +⾟ +辛 +辛 + +⾠ +⾠ +⾠ +辰 +辰 + +⾡ +⾡ +⾡ +辵 +辵 + +⾢ +⾢ +⾢ +邑 +邑 + +⾣ +⾣ +⾣ +酉 +酉 + +⾤ +⾤ +⾤ +釆 +釆 + +⾥ +⾥ +⾥ +里 +里 + +⾦ +⾦ +⾦ +金 +金 + +⾧ +⾧ +⾧ +長 +長 + +⾨ +⾨ +⾨ +門 +門 + +⾩ +⾩ +⾩ +阜 +阜 + +⾪ +⾪ +⾪ +隶 +隶 + +⾫ +⾫ +⾫ +隹 +隹 + +⾬ +⾬ +⾬ +雨 +雨 + +⾭ +⾭ +⾭ +靑 +靑 + +⾮ +⾮ +⾮ +非 +非 + +⾯ +⾯ +⾯ +面 +面 + +⾰ +⾰ +⾰ +革 +革 + +⾱ +⾱ +⾱ +韋 +韋 + +⾲ +⾲ +⾲ +韭 +韭 + +⾳ +⾳ +⾳ +音 +音 + +⾴ +⾴ +⾴ +頁 +頁 + +⾵ +⾵ +⾵ +風 +風 + +⾶ +⾶ +⾶ +飛 +飛 + +⾷ +⾷ +⾷ +食 +食 + +⾸ +⾸ +⾸ +首 +首 + +⾹ +⾹ +⾹ +香 +香 + +⾺ +⾺ +⾺ +馬 +馬 + +⾻ +⾻ +⾻ +骨 +骨 + +⾼ +⾼ +⾼ +高 +高 + +⾽ +⾽ +⾽ +髟 +髟 + +⾾ +⾾ +⾾ +鬥 +鬥 + +⾿ +⾿ +⾿ +鬯 +鬯 + +⿀ +⿀ +⿀ +鬲 +鬲 + +⿁ +⿁ +⿁ +鬼 +鬼 + +⿂ +⿂ +⿂ +魚 +魚 + +⿃ +⿃ +⿃ +鳥 +鳥 + +⿄ +⿄ +⿄ +鹵 +鹵 + +⿅ +⿅ +⿅ +鹿 +鹿 + +⿆ +⿆ +⿆ +麥 +麥 + +⿇ +⿇ +⿇ +麻 +麻 + +⿈ +⿈ +⿈ +黃 +黃 + +⿉ +⿉ +⿉ +黍 +黍 + +⿊ +⿊ +⿊ +黑 +黑 + +⿋ +⿋ +⿋ +黹 +黹 + +⿌ +⿌ +⿌ +黽 +黽 + +⿍ +⿍ +⿍ +鼎 +鼎 + +⿎ +⿎ +⿎ +鼓 +鼓 + +⿏ +⿏ +⿏ +鼠 +鼠 + +⿐ +⿐ +⿐ +鼻 +鼻 + +⿑ +⿑ +⿑ +齊 +齊 + +⿒ +⿒ +⿒ +齒 +齒 + +⿓ +⿓ +⿓ +龍 +龍 + +⿔ +⿔ +⿔ +龜 +龜 + +⿕ +⿕ +⿕ +龠 +龠 + +  +  +  + + + +〶 +〶 +〶 +〒 +〒 + +〸 +〸 +〸 +十 +十 + +〹 +〹 +〹 +卄 +卄 + +〺 +〺 +〺 +卅 +卅 + +が +が +が +が +が + +ぎ +ぎ +ぎ +ぎ +ぎ + +ぐ +ぐ +ぐ +ぐ +ぐ + +げ +げ +げ +げ +げ + +ご +ご +ご +ご +ご + +ざ +ざ +ざ +ざ +ざ + +じ +じ +じ +じ +じ + +ず +ず +ず +ず +ず + +ぜ +ぜ +ぜ +ぜ +ぜ + +ぞ +ぞ +ぞ +ぞ +ぞ + +だ +だ +だ +だ +だ + +ぢ +ぢ +ぢ +ぢ +ぢ + +づ +づ +づ +づ +づ + +で +で +で +で +で + +ど +ど +ど +ど +ど + +ば +ば +ば +ば +ば + +ぱ +ぱ +ぱ +ぱ +ぱ + +び +び +び +び +び + +ぴ +ぴ +ぴ +ぴ +ぴ + +ぶ +ぶ +ぶ +ぶ +ぶ + +ぷ +ぷ +ぷ +ぷ +ぷ + +べ +べ +べ +べ +べ + +ぺ +ぺ +ぺ +ぺ +ぺ + +ぼ +ぼ +ぼ +ぼ +ぼ + +ぽ +ぽ +ぽ +ぽ +ぽ + +ゔ +ゔ +ゔ +ゔ +ゔ + +゛ +゛ +゛ + ゙ + ゙ + +゜ +゜ +゜ + ゚ + ゚ + +ゞ +ゞ +ゞ +ゞ +ゞ + +ゟ +ゟ +ゟ +より +より + +ガ +ガ +ガ +ガ +ガ + +ギ +ギ +ギ +ギ +ギ + +グ +グ +グ +グ +グ + +ゲ +ゲ +ゲ +ゲ +ゲ + +ゴ +ゴ +ゴ +ゴ +ゴ + +ザ +ザ +ザ +ザ +ザ + +ジ +ジ +ジ +ジ +ジ + +ズ +ズ +ズ +ズ +ズ + +ゼ +ゼ +ゼ +ゼ +ゼ + +ゾ +ゾ +ゾ +ゾ +ゾ + +ダ +ダ +ダ +ダ +ダ + +ヂ +ヂ +ヂ +ヂ +ヂ + +ヅ +ヅ +ヅ +ヅ +ヅ + +デ +デ +デ +デ +デ + +ド +ド +ド +ド +ド + +バ +バ +バ +バ +バ + +パ +パ +パ +パ +パ + +ビ +ビ +ビ +ビ +ビ + +ピ +ピ +ピ +ピ +ピ + +ブ +ブ +ブ +ブ +ブ + +プ +プ +プ +プ +プ + +ベ +ベ +ベ +ベ +ベ + +ペ +ペ +ペ +ペ +ペ + +ボ +ボ +ボ +ボ +ボ + +ポ +ポ +ポ +ポ +ポ + +ヴ +ヴ +ヴ +ヴ +ヴ + +ヷ +ヷ +ヷ +ヷ +ヷ + +ヸ +ヸ +ヸ +ヸ +ヸ + +ヹ +ヹ +ヹ +ヹ +ヹ + +ヺ +ヺ +ヺ +ヺ +ヺ + +ヾ +ヾ +ヾ +ヾ +ヾ + +ヿ +ヿ +ヿ +コト +コト + +ㄱ +ㄱ +ㄱ +ᄀ +ᄀ + +ㄲ +ㄲ +ㄲ +ᄁ +ᄁ + +ㄳ +ㄳ +ㄳ +ᆪ +ᆪ + +ㄴ +ㄴ +ㄴ +ᄂ +ᄂ + +ㄵ +ㄵ +ㄵ +ᆬ +ᆬ + +ㄶ +ㄶ +ㄶ +ᆭ +ᆭ + +ㄷ +ㄷ +ㄷ +ᄃ +ᄃ + +ㄸ +ㄸ +ㄸ +ᄄ +ᄄ + +ㄹ +ㄹ +ㄹ +ᄅ +ᄅ + +ㄺ +ㄺ +ㄺ +ᆰ +ᆰ + +ㄻ +ㄻ +ㄻ +ᆱ +ᆱ + +ㄼ +ㄼ +ㄼ +ᆲ +ᆲ + +ㄽ +ㄽ +ㄽ +ᆳ +ᆳ + +ㄾ +ㄾ +ㄾ +ᆴ +ᆴ + +ㄿ +ㄿ +ㄿ +ᆵ +ᆵ + +ㅀ +ㅀ +ㅀ +ᄚ +ᄚ + +ㅁ +ㅁ +ㅁ +ᄆ +ᄆ + +ㅂ +ㅂ +ㅂ +ᄇ +ᄇ + +ㅃ +ㅃ +ㅃ +ᄈ +ᄈ + +ㅄ +ㅄ +ㅄ +ᄡ +ᄡ + +ㅅ +ㅅ +ㅅ +ᄉ +ᄉ + +ㅆ +ㅆ +ㅆ +ᄊ +ᄊ + +ㅇ +ㅇ +ㅇ +ᄋ +ᄋ + +ㅈ +ㅈ +ㅈ +ᄌ +ᄌ + +ㅉ +ㅉ +ㅉ +ᄍ +ᄍ + +ㅊ +ㅊ +ㅊ +ᄎ +ᄎ + +ㅋ +ㅋ +ㅋ +ᄏ +ᄏ + +ㅌ +ㅌ +ㅌ +ᄐ +ᄐ + +ㅍ +ㅍ +ㅍ +ᄑ +ᄑ + +ㅎ +ㅎ +ㅎ +ᄒ +ᄒ + +ㅏ +ㅏ +ㅏ +ᅡ +ᅡ + +ㅐ +ㅐ +ㅐ +ᅢ +ᅢ + +ㅑ +ㅑ +ㅑ +ᅣ +ᅣ + +ㅒ +ㅒ +ㅒ +ᅤ +ᅤ + +ㅓ +ㅓ +ㅓ +ᅥ +ᅥ + +ㅔ +ㅔ +ㅔ +ᅦ +ᅦ + +ㅕ +ㅕ +ㅕ +ᅧ +ᅧ + +ㅖ +ㅖ +ㅖ +ᅨ +ᅨ + +ㅗ +ㅗ +ㅗ +ᅩ +ᅩ + +ㅘ +ㅘ +ㅘ +ᅪ +ᅪ + +ㅙ +ㅙ +ㅙ +ᅫ +ᅫ + +ㅚ +ㅚ +ㅚ +ᅬ +ᅬ + +ㅛ +ㅛ +ㅛ +ᅭ +ᅭ + +ㅜ +ㅜ +ㅜ +ᅮ +ᅮ + +ㅝ +ㅝ +ㅝ +ᅯ +ᅯ + +ㅞ +ㅞ +ㅞ +ᅰ +ᅰ + +ㅟ +ㅟ +ㅟ +ᅱ +ᅱ + +ㅠ +ㅠ +ㅠ +ᅲ +ᅲ + +ㅡ +ㅡ +ㅡ +ᅳ +ᅳ + +ㅢ +ㅢ +ㅢ +ᅴ +ᅴ + +ㅣ +ㅣ +ㅣ +ᅵ +ᅵ + +ㅤ +ㅤ +ㅤ +ᅠ +ᅠ + +ㅥ +ㅥ +ㅥ +ᄔ +ᄔ + +ㅦ +ㅦ +ㅦ +ᄕ +ᄕ + +ㅧ +ㅧ +ㅧ +ᇇ +ᇇ + +ㅨ +ㅨ +ㅨ +ᇈ +ᇈ + +ㅩ +ㅩ +ㅩ +ᇌ +ᇌ + +ㅪ +ㅪ +ㅪ +ᇎ +ᇎ + +ㅫ +ㅫ +ㅫ +ᇓ +ᇓ + +ㅬ +ㅬ +ㅬ +ᇗ +ᇗ + +ㅭ +ㅭ +ㅭ +ᇙ +ᇙ + +ㅮ +ㅮ +ㅮ +ᄜ +ᄜ + +ㅯ +ㅯ +ㅯ +ᇝ +ᇝ + +ㅰ +ㅰ +ㅰ +ᇟ +ᇟ + +ㅱ +ㅱ +ㅱ +ᄝ +ᄝ + +ㅲ +ㅲ +ㅲ +ᄞ +ᄞ + +ㅳ +ㅳ +ㅳ +ᄠ +ᄠ + +ㅴ +ㅴ +ㅴ +ᄢ +ᄢ + +ㅵ +ㅵ +ㅵ +ᄣ +ᄣ + +ㅶ +ㅶ +ㅶ +ᄧ +ᄧ + +ㅷ +ㅷ +ㅷ +ᄩ +ᄩ + +ㅸ +ㅸ +ㅸ +ᄫ +ᄫ + +ㅹ +ㅹ +ㅹ +ᄬ +ᄬ + +ㅺ +ㅺ +ㅺ +ᄭ +ᄭ + +ㅻ +ㅻ +ㅻ +ᄮ +ᄮ + +ㅼ +ㅼ +ㅼ +ᄯ +ᄯ + +ㅽ +ㅽ +ㅽ +ᄲ +ᄲ + +ㅾ +ㅾ +ㅾ +ᄶ +ᄶ + +ㅿ +ㅿ +ㅿ +ᅀ +ᅀ + +ㆀ +ㆀ +ㆀ +ᅇ +ᅇ + +ㆁ +ㆁ +ㆁ +ᅌ +ᅌ + +ㆂ +ㆂ +ㆂ +ᇱ +ᇱ + +ㆃ +ㆃ +ㆃ +ᇲ +ᇲ + +ㆄ +ㆄ +ㆄ +ᅗ +ᅗ + +ㆅ +ㆅ +ㆅ +ᅘ +ᅘ + +ㆆ +ㆆ +ㆆ +ᅙ +ᅙ + +ㆇ +ㆇ +ㆇ +ᆄ +ᆄ + +ㆈ +ㆈ +ㆈ +ᆅ +ᆅ + +ㆉ +ㆉ +ㆉ +ᆈ +ᆈ + +ㆊ +ㆊ +ㆊ +ᆑ +ᆑ + +ㆋ +ㆋ +ㆋ +ᆒ +ᆒ + +ㆌ +ㆌ +ㆌ +ᆔ +ᆔ + +ㆍ +ㆍ +ㆍ +ᆞ +ᆞ + +ㆎ +ㆎ +ㆎ +ᆡ +ᆡ + +㆒ +㆒ +㆒ +一 +一 + +㆓ +㆓ +㆓ +二 +二 + +㆔ +㆔ +㆔ +三 +三 + +㆕ +㆕ +㆕ +四 +四 + +㆖ +㆖ +㆖ +上 +上 + +㆗ +㆗ +㆗ +中 +中 + +㆘ +㆘ +㆘ +下 +下 + +㆙ +㆙ +㆙ +甲 +甲 + +㆚ +㆚ +㆚ +乙 +乙 + +㆛ +㆛ +㆛ +丙 +丙 + +㆜ +㆜ +㆜ +丁 +丁 + +㆝ +㆝ +㆝ +天 +天 + +㆞ +㆞ +㆞ +地 +地 + +㆟ +㆟ +㆟ +人 +人 + +㈀ +㈀ +㈀ +(ᄀ) +(ᄀ) + +㈁ +㈁ +㈁ +(ᄂ) +(ᄂ) + +㈂ +㈂ +㈂ +(ᄃ) +(ᄃ) + +㈃ +㈃ +㈃ +(ᄅ) +(ᄅ) + +㈄ +㈄ +㈄ +(ᄆ) +(ᄆ) + +㈅ +㈅ +㈅ +(ᄇ) +(ᄇ) + +㈆ +㈆ +㈆ +(ᄉ) +(ᄉ) + +㈇ +㈇ +㈇ +(ᄋ) +(ᄋ) + +㈈ +㈈ +㈈ +(ᄌ) +(ᄌ) + +㈉ +㈉ +㈉ +(ᄎ) +(ᄎ) + +㈊ +㈊ +㈊ +(ᄏ) +(ᄏ) + +㈋ +㈋ +㈋ +(ᄐ) +(ᄐ) + +㈌ +㈌ +㈌ +(ᄑ) +(ᄑ) + +㈍ +㈍ +㈍ +(ᄒ) +(ᄒ) + +㈎ +㈎ +㈎ +(가) +(가) + +㈏ +㈏ +㈏ +(나) +(나) + +㈐ +㈐ +㈐ +(다) +(다) + +㈑ +㈑ +㈑ +(라) +(라) + +㈒ +㈒ +㈒ +(마) +(마) + +㈓ +㈓ +㈓ +(바) +(바) + +㈔ +㈔ +㈔ +(사) +(사) + +㈕ +㈕ +㈕ +(아) +(아) + +㈖ +㈖ +㈖ +(자) +(자) + +㈗ +㈗ +㈗ +(차) +(차) + +㈘ +㈘ +㈘ +(카) +(카) + +㈙ +㈙ +㈙ +(타) +(타) + +㈚ +㈚ +㈚ +(파) +(파) + +㈛ +㈛ +㈛ +(하) +(하) + +㈜ +㈜ +㈜ +(주) +(주) + +㈝ +㈝ +㈝ +(오전) +(오전) + +㈞ +㈞ +㈞ +(오후) +(오후) + +㈠ +㈠ +㈠ +(一) +(一) + +㈡ +㈡ +㈡ +(二) +(二) + +㈢ +㈢ +㈢ +(三) +(三) + +㈣ +㈣ +㈣ +(四) +(四) + +㈤ +㈤ +㈤ +(五) +(五) + +㈥ +㈥ +㈥ +(六) +(六) + +㈦ +㈦ +㈦ +(七) +(七) + +㈧ +㈧ +㈧ +(八) +(八) + +㈨ +㈨ +㈨ +(九) +(九) + +㈩ +㈩ +㈩ +(十) +(十) + +㈪ +㈪ +㈪ +(月) +(月) + +㈫ +㈫ +㈫ +(火) +(火) + +㈬ +㈬ +㈬ +(水) +(水) + +㈭ +㈭ +㈭ +(木) +(木) + +㈮ +㈮ +㈮ +(金) +(金) + +㈯ +㈯ +㈯ +(土) +(土) + +㈰ +㈰ +㈰ +(日) +(日) + +㈱ +㈱ +㈱ +(株) +(株) + +㈲ +㈲ +㈲ +(有) +(有) + +㈳ +㈳ +㈳ +(社) +(社) + +㈴ +㈴ +㈴ +(名) +(名) + +㈵ +㈵ +㈵ +(特) +(特) + +㈶ +㈶ +㈶ +(財) +(財) + +㈷ +㈷ +㈷ +(祝) +(祝) + +㈸ +㈸ +㈸ +(労) +(労) + +㈹ +㈹ +㈹ +(代) +(代) + +㈺ +㈺ +㈺ +(呼) +(呼) + +㈻ +㈻ +㈻ +(学) +(学) + +㈼ +㈼ +㈼ +(監) +(監) + +㈽ +㈽ +㈽ +(企) +(企) + +㈾ +㈾ +㈾ +(資) +(資) + +㈿ +㈿ +㈿ +(協) +(協) + +㉀ +㉀ +㉀ +(祭) +(祭) + +㉁ +㉁ +㉁ +(休) +(休) + +㉂ +㉂ +㉂ +(自) +(自) + +㉃ +㉃ +㉃ +(至) +(至) + +㉄ +㉄ +㉄ +問 +問 + +㉅ +㉅ +㉅ +幼 +幼 + +㉆ +㉆ +㉆ +文 +文 + +㉇ +㉇ +㉇ +箏 +箏 + +㉐ +㉐ +㉐ +PTE +PTE + +㉑ +㉑ +㉑ +21 +21 + +㉒ +㉒ +㉒ +22 +22 + +㉓ +㉓ +㉓ +23 +23 + +㉔ +㉔ +㉔ +24 +24 + +㉕ +㉕ +㉕ +25 +25 + +㉖ +㉖ +㉖ +26 +26 + +㉗ +㉗ +㉗ +27 +27 + +㉘ +㉘ +㉘ +28 +28 + +㉙ +㉙ +㉙ +29 +29 + +㉚ +㉚ +㉚ +30 +30 + +㉛ +㉛ +㉛ +31 +31 + +㉜ +㉜ +㉜ +32 +32 + +㉝ +㉝ +㉝ +33 +33 + +㉞ +㉞ +㉞ +34 +34 + +㉟ +㉟ +㉟ +35 +35 + +㉠ +㉠ +㉠ +ᄀ +ᄀ + +㉡ +㉡ +㉡ +ᄂ +ᄂ + +㉢ +㉢ +㉢ +ᄃ +ᄃ + +㉣ +㉣ +㉣ +ᄅ +ᄅ + +㉤ +㉤ +㉤ +ᄆ +ᄆ + +㉥ +㉥ +㉥ +ᄇ +ᄇ + +㉦ +㉦ +㉦ +ᄉ +ᄉ + +㉧ +㉧ +㉧ +ᄋ +ᄋ + +㉨ +㉨ +㉨ +ᄌ +ᄌ + +㉩ +㉩ +㉩ +ᄎ +ᄎ + +㉪ +㉪ +㉪ +ᄏ +ᄏ + +㉫ +㉫ +㉫ +ᄐ +ᄐ + +㉬ +㉬ +㉬ +ᄑ +ᄑ + +㉭ +㉭ +㉭ +ᄒ +ᄒ + +㉮ +㉮ +㉮ +가 +가 + +㉯ +㉯ +㉯ +나 +나 + +㉰ +㉰ +㉰ +다 +다 + +㉱ +㉱ +㉱ +라 +라 + +㉲ +㉲ +㉲ +마 +마 + +㉳ +㉳ +㉳ +바 +바 + +㉴ +㉴ +㉴ +사 +사 + +㉵ +㉵ +㉵ +아 +아 + +㉶ +㉶ +㉶ +자 +자 + +㉷ +㉷ +㉷ +차 +차 + +㉸ +㉸ +㉸ +카 +카 + +㉹ +㉹ +㉹ +타 +타 + +㉺ +㉺ +㉺ +파 +파 + +㉻ +㉻ +㉻ +하 +하 + +㉼ +㉼ +㉼ +참고 +참고 + +㉽ +㉽ +㉽ +주의 +주의 + +㉾ +㉾ +㉾ +우 +우 + +㊀ +㊀ +㊀ +一 +一 + +㊁ +㊁ +㊁ +二 +二 + +㊂ +㊂ +㊂ +三 +三 + +㊃ +㊃ +㊃ +四 +四 + +㊄ +㊄ +㊄ +五 +五 + +㊅ +㊅ +㊅ +六 +六 + +㊆ +㊆ +㊆ +七 +七 + +㊇ +㊇ +㊇ +八 +八 + +㊈ +㊈ +㊈ +九 +九 + +㊉ +㊉ +㊉ +十 +十 + +㊊ +㊊ +㊊ +月 +月 + +㊋ +㊋ +㊋ +火 +火 + +㊌ +㊌ +㊌ +水 +水 + +㊍ +㊍ +㊍ +木 +木 + +㊎ +㊎ +㊎ +金 +金 + +㊏ +㊏ +㊏ +土 +土 + +㊐ +㊐ +㊐ +日 +日 + +㊑ +㊑ +㊑ +株 +株 + +㊒ +㊒ +㊒ +有 +有 + +㊓ +㊓ +㊓ +社 +社 + +㊔ +㊔ +㊔ +名 +名 + +㊕ +㊕ +㊕ +特 +特 + +㊖ +㊖ +㊖ +財 +財 + +㊗ +㊗ +㊗ +祝 +祝 + +㊘ +㊘ +㊘ +労 +労 + +㊙ +㊙ +㊙ +秘 +秘 + +㊚ +㊚ +㊚ +男 +男 + +㊛ +㊛ +㊛ +女 +女 + +㊜ +㊜ +㊜ +適 +適 + +㊝ +㊝ +㊝ +優 +優 + +㊞ +㊞ +㊞ +印 +印 + +㊟ +㊟ +㊟ +注 +注 + +㊠ +㊠ +㊠ +項 +項 + +㊡ +㊡ +㊡ +休 +休 + +㊢ +㊢ +㊢ +写 +写 + +㊣ +㊣ +㊣ +正 +正 + +㊤ +㊤ +㊤ +上 +上 + +㊥ +㊥ +㊥ +中 +中 + +㊦ +㊦ +㊦ +下 +下 + +㊧ +㊧ +㊧ +左 +左 + +㊨ +㊨ +㊨ +右 +右 + +㊩ +㊩ +㊩ +医 +医 + +㊪ +㊪ +㊪ +宗 +宗 + +㊫ +㊫ +㊫ +学 +学 + +㊬ +㊬ +㊬ +監 +監 + +㊭ +㊭ +㊭ +企 +企 + +㊮ +㊮ +㊮ +資 +資 + +㊯ +㊯ +㊯ +協 +協 + +㊰ +㊰ +㊰ +夜 +夜 + +㊱ +㊱ +㊱ +36 +36 + +㊲ +㊲ +㊲ +37 +37 + +㊳ +㊳ +㊳ +38 +38 + +㊴ +㊴ +㊴ +39 +39 + +㊵ +㊵ +㊵ +40 +40 + +㊶ +㊶ +㊶ +41 +41 + +㊷ +㊷ +㊷ +42 +42 + +㊸ +㊸ +㊸ +43 +43 + +㊹ +㊹ +㊹ +44 +44 + +㊺ +㊺ +㊺ +45 +45 + +㊻ +㊻ +㊻ +46 +46 + +㊼ +㊼ +㊼ +47 +47 + +㊽ +㊽ +㊽ +48 +48 + +㊾ +㊾ +㊾ +49 +49 + +㊿ +㊿ +㊿ +50 +50 + +㋀ +㋀ +㋀ +1月 +1月 + +㋁ +㋁ +㋁ +2月 +2月 + +㋂ +㋂ +㋂ +3月 +3月 + +㋃ +㋃ +㋃ +4月 +4月 + +㋄ +㋄ +㋄ +5月 +5月 + +㋅ +㋅ +㋅ +6月 +6月 + +㋆ +㋆ +㋆ +7月 +7月 + +㋇ +㋇ +㋇ +8月 +8月 + +㋈ +㋈ +㋈ +9月 +9月 + +㋉ +㋉ +㋉ +10月 +10月 + +㋊ +㋊ +㋊ +11月 +11月 + +㋋ +㋋ +㋋ +12月 +12月 + +㋌ +㋌ +㋌ +Hg +Hg + +㋍ +㋍ +㋍ +erg +erg + +㋎ +㋎ +㋎ +eV +eV + +㋏ +㋏ +㋏ +LTD +LTD + +㋐ +㋐ +㋐ +ア +ア + +㋑ +㋑ +㋑ +イ +イ + +㋒ +㋒ +㋒ +ウ +ウ + +㋓ +㋓ +㋓ +エ +エ + +㋔ +㋔ +㋔ +オ +オ + +㋕ +㋕ +㋕ +カ +カ + +㋖ +㋖ +㋖ +キ +キ + +㋗ +㋗ +㋗ +ク +ク + +㋘ +㋘ +㋘ +ケ +ケ + +㋙ +㋙ +㋙ +コ +コ + +㋚ +㋚ +㋚ +サ +サ + +㋛ +㋛ +㋛ +シ +シ + +㋜ +㋜ +㋜ +ス +ス + +㋝ +㋝ +㋝ +セ +セ + +㋞ +㋞ +㋞ +ソ +ソ + +㋟ +㋟ +㋟ +タ +タ + +㋠ +㋠ +㋠ +チ +チ + +㋡ +㋡ +㋡ +ツ +ツ + +㋢ +㋢ +㋢ +テ +テ + +㋣ +㋣ +㋣ +ト +ト + +㋤ +㋤ +㋤ +ナ +ナ + +㋥ +㋥ +㋥ +ニ +ニ + +㋦ +㋦ +㋦ +ヌ +ヌ + +㋧ +㋧ +㋧ +ネ +ネ + +㋨ +㋨ +㋨ +ノ +ノ + +㋩ +㋩ +㋩ +ハ +ハ + +㋪ +㋪ +㋪ +ヒ +ヒ + +㋫ +㋫ +㋫ +フ +フ + +㋬ +㋬ +㋬ +ヘ +ヘ + +㋭ +㋭ +㋭ +ホ +ホ + +㋮ +㋮ +㋮ +マ +マ + +㋯ +㋯ +㋯ +ミ +ミ + +㋰ +㋰ +㋰ +ム +ム + +㋱ +㋱ +㋱ +メ +メ + +㋲ +㋲ +㋲ +モ +モ + +㋳ +㋳ +㋳ +ヤ +ヤ + +㋴ +㋴ +㋴ +ユ +ユ + +㋵ +㋵ +㋵ +ヨ +ヨ + +㋶ +㋶ +㋶ +ラ +ラ + +㋷ +㋷ +㋷ +リ +リ + +㋸ +㋸ +㋸ +ル +ル + +㋹ +㋹ +㋹ +レ +レ + +㋺ +㋺ +㋺ +ロ +ロ + +㋻ +㋻ +㋻ +ワ +ワ + +㋼ +㋼ +㋼ +ヰ +ヰ + +㋽ +㋽ +㋽ +ヱ +ヱ + +㋾ +㋾ +㋾ +ヲ +ヲ + +㌀ +㌀ +㌀ +アパート +アパート + +㌁ +㌁ +㌁ +アルファ +アルファ + +㌂ +㌂ +㌂ +アンペア +アンペア + +㌃ +㌃ +㌃ +アール +アール + +㌄ +㌄ +㌄ +イニング +イニング + +㌅ +㌅ +㌅ +インチ +インチ + +㌆ +㌆ +㌆ +ウォン +ウォン + +㌇ +㌇ +㌇ +エスクード +エスクード + +㌈ +㌈ +㌈ +エーカー +エーカー + +㌉ +㌉ +㌉ +オンス +オンス + +㌊ +㌊ +㌊ +オーム +オーム + +㌋ +㌋ +㌋ +カイリ +カイリ + +㌌ +㌌ +㌌ +カラット +カラット + +㌍ +㌍ +㌍ +カロリー +カロリー + +㌎ +㌎ +㌎ +ガロン +ガロン + +㌏ +㌏ +㌏ +ガンマ +ガンマ + +㌐ +㌐ +㌐ +ギガ +ギガ + +㌑ +㌑ +㌑ +ギニー +ギニー + +㌒ +㌒ +㌒ +キュリー +キュリー + +㌓ +㌓ +㌓ +ギルダー +ギルダー + +㌔ +㌔ +㌔ +キロ +キロ + +㌕ +㌕ +㌕ +キログラム +キログラム + +㌖ +㌖ +㌖ +キロメートル +キロメートル + +㌗ +㌗ +㌗ +キロワット +キロワット + +㌘ +㌘ +㌘ +グラム +グラム + +㌙ +㌙ +㌙ +グラムトン +グラムトン + +㌚ +㌚ +㌚ +クルゼイロ +クルゼイロ + +㌛ +㌛ +㌛ +クローネ +クローネ + +㌜ +㌜ +㌜ +ケース +ケース + +㌝ +㌝ +㌝ +コルナ +コルナ + +㌞ +㌞ +㌞ +コーポ +コーポ + +㌟ +㌟ +㌟ +サイクル +サイクル + +㌠ +㌠ +㌠ +サンチーム +サンチーム + +㌡ +㌡ +㌡ +シリング +シリング + +㌢ +㌢ +㌢ +センチ +センチ + +㌣ +㌣ +㌣ +セント +セント + +㌤ +㌤ +㌤ +ダース +ダース + +㌥ +㌥ +㌥ +デシ +デシ + +㌦ +㌦ +㌦ +ドル +ドル + +㌧ +㌧ +㌧ +トン +トン + +㌨ +㌨ +㌨ +ナノ +ナノ + +㌩ +㌩ +㌩ +ノット +ノット + +㌪ +㌪ +㌪ +ハイツ +ハイツ + +㌫ +㌫ +㌫ +パーセント +パーセント + +㌬ +㌬ +㌬ +パーツ +パーツ + +㌭ +㌭ +㌭ +バーレル +バーレル + +㌮ +㌮ +㌮ +ピアストル +ピアストル + +㌯ +㌯ +㌯ +ピクル +ピクル + +㌰ +㌰ +㌰ +ピコ +ピコ + +㌱ +㌱ +㌱ +ビル +ビル + +㌲ +㌲ +㌲ +ファラッド +ファラッド + +㌳ +㌳ +㌳ +フィート +フィート + +㌴ +㌴ +㌴ +ブッシェル +ブッシェル + +㌵ +㌵ +㌵ +フラン +フラン + +㌶ +㌶ +㌶ +ヘクタール +ヘクタール + +㌷ +㌷ +㌷ +ペソ +ペソ + +㌸ +㌸ +㌸ +ペニヒ +ペニヒ + +㌹ +㌹ +㌹ +ヘルツ +ヘルツ + +㌺ +㌺ +㌺ +ペンス +ペンス + +㌻ +㌻ +㌻ +ページ +ページ + +㌼ +㌼ +㌼ +ベータ +ベータ + +㌽ +㌽ +㌽ +ポイント +ポイント + +㌾ +㌾ +㌾ +ボルト +ボルト + +㌿ +㌿ +㌿ +ホン +ホン + +㍀ +㍀ +㍀ +ポンド +ポンド + +㍁ +㍁ +㍁ +ホール +ホール + +㍂ +㍂ +㍂ +ホーン +ホーン + +㍃ +㍃ +㍃ +マイクロ +マイクロ + +㍄ +㍄ +㍄ +マイル +マイル + +㍅ +㍅ +㍅ +マッハ +マッハ + +㍆ +㍆ +㍆ +マルク +マルク + +㍇ +㍇ +㍇ +マンション +マンション + +㍈ +㍈ +㍈ +ミクロン +ミクロン + +㍉ +㍉ +㍉ +ミリ +ミリ + +㍊ +㍊ +㍊ +ミリバール +ミリバール + +㍋ +㍋ +㍋ +メガ +メガ + +㍌ +㍌ +㍌ +メガトン +メガトン + +㍍ +㍍ +㍍ +メートル +メートル + +㍎ +㍎ +㍎ +ヤード +ヤード + +㍏ +㍏ +㍏ +ヤール +ヤール + +㍐ +㍐ +㍐ +ユアン +ユアン + +㍑ +㍑ +㍑ +リットル +リットル + +㍒ +㍒ +㍒ +リラ +リラ + +㍓ +㍓ +㍓ +ルピー +ルピー + +㍔ +㍔ +㍔ +ルーブル +ルーブル + +㍕ +㍕ +㍕ +レム +レム + +㍖ +㍖ +㍖ +レントゲン +レントゲン + +㍗ +㍗ +㍗ +ワット +ワット + +㍘ +㍘ +㍘ +0点 +0点 + +㍙ +㍙ +㍙ +1点 +1点 + +㍚ +㍚ +㍚ +2点 +2点 + +㍛ +㍛ +㍛ +3点 +3点 + +㍜ +㍜ +㍜ +4点 +4点 + +㍝ +㍝ +㍝ +5点 +5点 + +㍞ +㍞ +㍞ +6点 +6点 + +㍟ +㍟ +㍟ +7点 +7点 + +㍠ +㍠ +㍠ +8点 +8点 + +㍡ +㍡ +㍡ +9点 +9点 + +㍢ +㍢ +㍢ +10点 +10点 + +㍣ +㍣ +㍣ +11点 +11点 + +㍤ +㍤ +㍤ +12点 +12点 + +㍥ +㍥ +㍥ +13点 +13点 + +㍦ +㍦ +㍦ +14点 +14点 + +㍧ +㍧ +㍧ +15点 +15点 + +㍨ +㍨ +㍨ +16点 +16点 + +㍩ +㍩ +㍩ +17点 +17点 + +㍪ +㍪ +㍪ +18点 +18点 + +㍫ +㍫ +㍫ +19点 +19点 + +㍬ +㍬ +㍬ +20点 +20点 + +㍭ +㍭ +㍭ +21点 +21点 + +㍮ +㍮ +㍮ +22点 +22点 + +㍯ +㍯ +㍯ +23点 +23点 + +㍰ +㍰ +㍰ +24点 +24点 + +㍱ +㍱ +㍱ +hPa +hPa + +㍲ +㍲ +㍲ +da +da + +㍳ +㍳ +㍳ +AU +AU + +㍴ +㍴ +㍴ +bar +bar + +㍵ +㍵ +㍵ +oV +oV + +㍶ +㍶ +㍶ +pc +pc + +㍷ +㍷ +㍷ +dm +dm + +㍸ +㍸ +㍸ +dm2 +dm2 + +㍹ +㍹ +㍹ +dm3 +dm3 + +㍺ +㍺ +㍺ +IU +IU + +㍻ +㍻ +㍻ +平成 +平成 + +㍼ +㍼ +㍼ +昭和 +昭和 + +㍽ +㍽ +㍽ +大正 +大正 + +㍾ +㍾ +㍾ +明治 +明治 + +㍿ +㍿ +㍿ +株式会社 +株式会社 + +㎀ +㎀ +㎀ +pA +pA + +㎁ +㎁ +㎁ +nA +nA + +㎂ +㎂ +㎂ +μA +μA + +㎃ +㎃ +㎃ +mA +mA + +㎄ +㎄ +㎄ +kA +kA + +㎅ +㎅ +㎅ +KB +KB + +㎆ +㎆ +㎆ +MB +MB + +㎇ +㎇ +㎇ +GB +GB + +㎈ +㎈ +㎈ +cal +cal + +㎉ +㎉ +㎉ +kcal +kcal + +㎊ +㎊ +㎊ +pF +pF + +㎋ +㎋ +㎋ +nF +nF + +㎌ +㎌ +㎌ +μF +μF + +㎍ +㎍ +㎍ +μg +μg + +㎎ +㎎ +㎎ +mg +mg + +㎏ +㎏ +㎏ +kg +kg + +㎐ +㎐ +㎐ +Hz +Hz + +㎑ +㎑ +㎑ +kHz +kHz + +㎒ +㎒ +㎒ +MHz +MHz + +㎓ +㎓ +㎓ +GHz +GHz + +㎔ +㎔ +㎔ +THz +THz + +㎕ +㎕ +㎕ +μl +μl + +㎖ +㎖ +㎖ +ml +ml + +㎗ +㎗ +㎗ +dl +dl + +㎘ +㎘ +㎘ +kl +kl + +㎙ +㎙ +㎙ +fm +fm + +㎚ +㎚ +㎚ +nm +nm + +㎛ +㎛ +㎛ +μm +μm + +㎜ +㎜ +㎜ +mm +mm + +㎝ +㎝ +㎝ +cm +cm + +㎞ +㎞ +㎞ +km +km + +㎟ +㎟ +㎟ +mm2 +mm2 + +㎠ +㎠ +㎠ +cm2 +cm2 + +㎡ +㎡ +㎡ +m2 +m2 + +㎢ +㎢ +㎢ +km2 +km2 + +㎣ +㎣ +㎣ +mm3 +mm3 + +㎤ +㎤ +㎤ +cm3 +cm3 + +㎥ +㎥ +㎥ +m3 +m3 + +㎦ +㎦ +㎦ +km3 +km3 + +㎧ +㎧ +㎧ +m∕s +m∕s + +㎨ +㎨ +㎨ +m∕s2 +m∕s2 + +㎩ +㎩ +㎩ +Pa +Pa + +㎪ +㎪ +㎪ +kPa +kPa + +㎫ +㎫ +㎫ +MPa +MPa + +㎬ +㎬ +㎬ +GPa +GPa + +㎭ +㎭ +㎭ +rad +rad + +㎮ +㎮ +㎮ +rad∕s +rad∕s + +㎯ +㎯ +㎯ +rad∕s2 +rad∕s2 + +㎰ +㎰ +㎰ +ps +ps + +㎱ +㎱ +㎱ +ns +ns + +㎲ +㎲ +㎲ +μs +μs + +㎳ +㎳ +㎳ +ms +ms + +㎴ +㎴ +㎴ +pV +pV + +㎵ +㎵ +㎵ +nV +nV + +㎶ +㎶ +㎶ +μV +μV + +㎷ +㎷ +㎷ +mV +mV + +㎸ +㎸ +㎸ +kV +kV + +㎹ +㎹ +㎹ +MV +MV + +㎺ +㎺ +㎺ +pW +pW + +㎻ +㎻ +㎻ +nW +nW + +㎼ +㎼ +㎼ +μW +μW + +㎽ +㎽ +㎽ +mW +mW + +㎾ +㎾ +㎾ +kW +kW + +㎿ +㎿ +㎿ +MW +MW + +㏀ +㏀ +㏀ +kΩ +kΩ + +㏁ +㏁ +㏁ +MΩ +MΩ + +㏂ +㏂ +㏂ +a.m. +a.m. + +㏃ +㏃ +㏃ +Bq +Bq + +㏄ +㏄ +㏄ +cc +cc + +㏅ +㏅ +㏅ +cd +cd + +㏆ +㏆ +㏆ +C∕kg +C∕kg + +㏇ +㏇ +㏇ +Co. +Co. + +㏈ +㏈ +㏈ +dB +dB + +㏉ +㏉ +㏉ +Gy +Gy + +㏊ +㏊ +㏊ +ha +ha + +㏋ +㏋ +㏋ +HP +HP + +㏌ +㏌ +㏌ +in +in + +㏍ +㏍ +㏍ +KK +KK + +㏎ +㏎ +㏎ +KM +KM + +㏏ +㏏ +㏏ +kt +kt + +㏐ +㏐ +㏐ +lm +lm + +㏑ +㏑ +㏑ +ln +ln + +㏒ +㏒ +㏒ +log +log + +㏓ +㏓ +㏓ +lx +lx + +㏔ +㏔ +㏔ +mb +mb + +㏕ +㏕ +㏕ +mil +mil + +㏖ +㏖ +㏖ +mol +mol + +㏗ +㏗ +㏗ +PH +PH + +㏘ +㏘ +㏘ +p.m. +p.m. + +㏙ +㏙ +㏙ +PPM +PPM + +㏚ +㏚ +㏚ +PR +PR + +㏛ +㏛ +㏛ +sr +sr + +㏜ +㏜ +㏜ +Sv +Sv + +㏝ +㏝ +㏝ +Wb +Wb + +㏞ +㏞ +㏞ +V∕m +V∕m + +㏟ +㏟ +㏟ +A∕m +A∕m + +㏠ +㏠ +㏠ +1日 +1日 + +㏡ +㏡ +㏡ +2日 +2日 + +㏢ +㏢ +㏢ +3日 +3日 + +㏣ +㏣ +㏣ +4日 +4日 + +㏤ +㏤ +㏤ +5日 +5日 + +㏥ +㏥ +㏥ +6日 +6日 + +㏦ +㏦ +㏦ +7日 +7日 + +㏧ +㏧ +㏧ +8日 +8日 + +㏨ +㏨ +㏨ +9日 +9日 + +㏩ +㏩ +㏩ +10日 +10日 + +㏪ +㏪ +㏪ +11日 +11日 + +㏫ +㏫ +㏫ +12日 +12日 + +㏬ +㏬ +㏬ +13日 +13日 + +㏭ +㏭ +㏭ +14日 +14日 + +㏮ +㏮ +㏮ +15日 +15日 + +㏯ +㏯ +㏯ +16日 +16日 + +㏰ +㏰ +㏰ +17日 +17日 + +㏱ +㏱ +㏱ +18日 +18日 + +㏲ +㏲ +㏲ +19日 +19日 + +㏳ +㏳ +㏳ +20日 +20日 + +㏴ +㏴ +㏴ +21日 +21日 + +㏵ +㏵ +㏵ +22日 +22日 + +㏶ +㏶ +㏶ +23日 +23日 + +㏷ +㏷ +㏷ +24日 +24日 + +㏸ +㏸ +㏸ +25日 +25日 + +㏹ +㏹ +㏹ +26日 +26日 + +㏺ +㏺ +㏺ +27日 +27日 + +㏻ +㏻ +㏻ +28日 +28日 + +㏼ +㏼ +㏼ +29日 +29日 + +㏽ +㏽ +㏽ +30日 +30日 + +㏾ +㏾ +㏾ +31日 +31日 + +㏿ +㏿ +㏿ +gal +gal + +ꝰ +ꝰ +ꝰ +ꝯ +ꝯ + +가 +가 +가 +가 +가 + +각 +각 +각 +각 +각 + +갂 +갂 +갂 +갂 +갂 + +갃 +갃 +갃 +갃 +갃 + +간 +간 +간 +간 +간 + +갅 +갅 +갅 +갅 +갅 + +갆 +갆 +갆 +갆 +갆 + +갇 +갇 +갇 +갇 +갇 + +갈 +갈 +갈 +갈 +갈 + +갉 +갉 +갉 +갉 +갉 + +갊 +갊 +갊 +갊 +갊 + +갋 +갋 +갋 +갋 +갋 + +갌 +갌 +갌 +갌 +갌 + +갍 +갍 +갍 +갍 +갍 + +갎 +갎 +갎 +갎 +갎 + +갏 +갏 +갏 +갏 +갏 + +감 +감 +감 +감 +감 + +갑 +갑 +갑 +갑 +갑 + +값 +값 +값 +값 +값 + +갓 +갓 +갓 +갓 +갓 + +갔 +갔 +갔 +갔 +갔 + +강 +강 +강 +강 +강 + +갖 +갖 +갖 +갖 +갖 + +갗 +갗 +갗 +갗 +갗 + +갘 +갘 +갘 +갘 +갘 + +같 +같 +같 +같 +같 + +갚 +갚 +갚 +갚 +갚 + +갛 +갛 +갛 +갛 +갛 + +개 +개 +개 +개 +개 + +객 +객 +객 +객 +객 + +갞 +갞 +갞 +갞 +갞 + +갟 +갟 +갟 +갟 +갟 + +갠 +갠 +갠 +갠 +갠 + +갡 +갡 +갡 +갡 +갡 + +갢 +갢 +갢 +갢 +갢 + +갣 +갣 +갣 +갣 +갣 + +갤 +갤 +갤 +갤 +갤 + +갥 +갥 +갥 +갥 +갥 + +갦 +갦 +갦 +갦 +갦 + +갧 +갧 +갧 +갧 +갧 + +갨 +갨 +갨 +갨 +갨 + +갩 +갩 +갩 +갩 +갩 + +갪 +갪 +갪 +갪 +갪 + +갫 +갫 +갫 +갫 +갫 + +갬 +갬 +갬 +갬 +갬 + +갭 +갭 +갭 +갭 +갭 + +갮 +갮 +갮 +갮 +갮 + +갯 +갯 +갯 +갯 +갯 + +갰 +갰 +갰 +갰 +갰 + +갱 +갱 +갱 +갱 +갱 + +갲 +갲 +갲 +갲 +갲 + +갳 +갳 +갳 +갳 +갳 + +갴 +갴 +갴 +갴 +갴 + +갵 +갵 +갵 +갵 +갵 + +갶 +갶 +갶 +갶 +갶 + +갷 +갷 +갷 +갷 +갷 + +갸 +갸 +갸 +갸 +갸 + +갹 +갹 +갹 +갹 +갹 + +갺 +갺 +갺 +갺 +갺 + +갻 +갻 +갻 +갻 +갻 + +갼 +갼 +갼 +갼 +갼 + +갽 +갽 +갽 +갽 +갽 + +갾 +갾 +갾 +갾 +갾 + +갿 +갿 +갿 +갿 +갿 + +걀 +걀 +걀 +걀 +걀 + +걁 +걁 +걁 +걁 +걁 + +걂 +걂 +걂 +걂 +걂 + +걃 +걃 +걃 +걃 +걃 + +걄 +걄 +걄 +걄 +걄 + +걅 +걅 +걅 +걅 +걅 + +걆 +걆 +걆 +걆 +걆 + +걇 +걇 +걇 +걇 +걇 + +걈 +걈 +걈 +걈 +걈 + +걉 +걉 +걉 +걉 +걉 + +걊 +걊 +걊 +걊 +걊 + +걋 +걋 +걋 +걋 +걋 + +걌 +걌 +걌 +걌 +걌 + +걍 +걍 +걍 +걍 +걍 + +걎 +걎 +걎 +걎 +걎 + +걏 +걏 +걏 +걏 +걏 + +걐 +걐 +걐 +걐 +걐 + +걑 +걑 +걑 +걑 +걑 + +걒 +걒 +걒 +걒 +걒 + +걓 +걓 +걓 +걓 +걓 + +걔 +걔 +걔 +걔 +걔 + +걕 +걕 +걕 +걕 +걕 + +걖 +걖 +걖 +걖 +걖 + +걗 +걗 +걗 +걗 +걗 + +걘 +걘 +걘 +걘 +걘 + +걙 +걙 +걙 +걙 +걙 + +걚 +걚 +걚 +걚 +걚 + +걛 +걛 +걛 +걛 +걛 + +걜 +걜 +걜 +걜 +걜 + +걝 +걝 +걝 +걝 +걝 + +걞 +걞 +걞 +걞 +걞 + +걟 +걟 +걟 +걟 +걟 + +걠 +걠 +걠 +걠 +걠 + +걡 +걡 +걡 +걡 +걡 + +걢 +걢 +걢 +걢 +걢 + +걣 +걣 +걣 +걣 +걣 + +걤 +걤 +걤 +걤 +걤 + +걥 +걥 +걥 +걥 +걥 + +걦 +걦 +걦 +걦 +걦 + +걧 +걧 +걧 +걧 +걧 + +걨 +걨 +걨 +걨 +걨 + +걩 +걩 +걩 +걩 +걩 + +걪 +걪 +걪 +걪 +걪 + +걫 +걫 +걫 +걫 +걫 + +걬 +걬 +걬 +걬 +걬 + +걭 +걭 +걭 +걭 +걭 + +걮 +걮 +걮 +걮 +걮 + +걯 +걯 +걯 +걯 +걯 + +거 +거 +거 +거 +거 + +걱 +걱 +걱 +걱 +걱 + +걲 +걲 +걲 +걲 +걲 + +걳 +걳 +걳 +걳 +걳 + +건 +건 +건 +건 +건 + +걵 +걵 +걵 +걵 +걵 + +걶 +걶 +걶 +걶 +걶 + +걷 +걷 +걷 +걷 +걷 + +걸 +걸 +걸 +걸 +걸 + +걹 +걹 +걹 +걹 +걹 + +걺 +걺 +걺 +걺 +걺 + +걻 +걻 +걻 +걻 +걻 + +걼 +걼 +걼 +걼 +걼 + +걽 +걽 +걽 +걽 +걽 + +걾 +걾 +걾 +걾 +걾 + +걿 +걿 +걿 +걿 +걿 + +검 +검 +검 +검 +검 + +겁 +겁 +겁 +겁 +겁 + +겂 +겂 +겂 +겂 +겂 + +것 +것 +것 +것 +것 + +겄 +겄 +겄 +겄 +겄 + +겅 +겅 +겅 +겅 +겅 + +겆 +겆 +겆 +겆 +겆 + +겇 +겇 +겇 +겇 +겇 + +겈 +겈 +겈 +겈 +겈 + +겉 +겉 +겉 +겉 +겉 + +겊 +겊 +겊 +겊 +겊 + +겋 +겋 +겋 +겋 +겋 + +게 +게 +게 +게 +게 + +겍 +겍 +겍 +겍 +겍 + +겎 +겎 +겎 +겎 +겎 + +겏 +겏 +겏 +겏 +겏 + +겐 +겐 +겐 +겐 +겐 + +겑 +겑 +겑 +겑 +겑 + +겒 +겒 +겒 +겒 +겒 + +겓 +겓 +겓 +겓 +겓 + +겔 +겔 +겔 +겔 +겔 + +겕 +겕 +겕 +겕 +겕 + +겖 +겖 +겖 +겖 +겖 + +겗 +겗 +겗 +겗 +겗 + +겘 +겘 +겘 +겘 +겘 + +겙 +겙 +겙 +겙 +겙 + +겚 +겚 +겚 +겚 +겚 + +겛 +겛 +겛 +겛 +겛 + +겜 +겜 +겜 +겜 +겜 + +겝 +겝 +겝 +겝 +겝 + +겞 +겞 +겞 +겞 +겞 + +겟 +겟 +겟 +겟 +겟 + +겠 +겠 +겠 +겠 +겠 + +겡 +겡 +겡 +겡 +겡 + +겢 +겢 +겢 +겢 +겢 + +겣 +겣 +겣 +겣 +겣 + +겤 +겤 +겤 +겤 +겤 + +겥 +겥 +겥 +겥 +겥 + +겦 +겦 +겦 +겦 +겦 + +겧 +겧 +겧 +겧 +겧 + +겨 +겨 +겨 +겨 +겨 + +격 +격 +격 +격 +격 + +겪 +겪 +겪 +겪 +겪 + +겫 +겫 +겫 +겫 +겫 + +견 +견 +견 +견 +견 + +겭 +겭 +겭 +겭 +겭 + +겮 +겮 +겮 +겮 +겮 + +겯 +겯 +겯 +겯 +겯 + +결 +결 +결 +결 +결 + +겱 +겱 +겱 +겱 +겱 + +겲 +겲 +겲 +겲 +겲 + +겳 +겳 +겳 +겳 +겳 + +겴 +겴 +겴 +겴 +겴 + +겵 +겵 +겵 +겵 +겵 + +겶 +겶 +겶 +겶 +겶 + +겷 +겷 +겷 +겷 +겷 + +겸 +겸 +겸 +겸 +겸 + +겹 +겹 +겹 +겹 +겹 + +겺 +겺 +겺 +겺 +겺 + +겻 +겻 +겻 +겻 +겻 + +겼 +겼 +겼 +겼 +겼 + +경 +경 +경 +경 +경 + +겾 +겾 +겾 +겾 +겾 + +겿 +겿 +겿 +겿 +겿 + +곀 +곀 +곀 +곀 +곀 + +곁 +곁 +곁 +곁 +곁 + +곂 +곂 +곂 +곂 +곂 + +곃 +곃 +곃 +곃 +곃 + +계 +계 +계 +계 +계 + +곅 +곅 +곅 +곅 +곅 + +곆 +곆 +곆 +곆 +곆 + +곇 +곇 +곇 +곇 +곇 + +곈 +곈 +곈 +곈 +곈 + +곉 +곉 +곉 +곉 +곉 + +곊 +곊 +곊 +곊 +곊 + +곋 +곋 +곋 +곋 +곋 + +곌 +곌 +곌 +곌 +곌 + +곍 +곍 +곍 +곍 +곍 + +곎 +곎 +곎 +곎 +곎 + +곏 +곏 +곏 +곏 +곏 + +곐 +곐 +곐 +곐 +곐 + +곑 +곑 +곑 +곑 +곑 + +곒 +곒 +곒 +곒 +곒 + +곓 +곓 +곓 +곓 +곓 + +곔 +곔 +곔 +곔 +곔 + +곕 +곕 +곕 +곕 +곕 + +곖 +곖 +곖 +곖 +곖 + +곗 +곗 +곗 +곗 +곗 + +곘 +곘 +곘 +곘 +곘 + +곙 +곙 +곙 +곙 +곙 + +곚 +곚 +곚 +곚 +곚 + +곛 +곛 +곛 +곛 +곛 + +곜 +곜 +곜 +곜 +곜 + +곝 +곝 +곝 +곝 +곝 + +곞 +곞 +곞 +곞 +곞 + +곟 +곟 +곟 +곟 +곟 + +고 +고 +고 +고 +고 + +곡 +곡 +곡 +곡 +곡 + +곢 +곢 +곢 +곢 +곢 + +곣 +곣 +곣 +곣 +곣 + +곤 +곤 +곤 +곤 +곤 + +곥 +곥 +곥 +곥 +곥 + +곦 +곦 +곦 +곦 +곦 + +곧 +곧 +곧 +곧 +곧 + +골 +골 +골 +골 +골 + +곩 +곩 +곩 +곩 +곩 + +곪 +곪 +곪 +곪 +곪 + +곫 +곫 +곫 +곫 +곫 + +곬 +곬 +곬 +곬 +곬 + +곭 +곭 +곭 +곭 +곭 + +곮 +곮 +곮 +곮 +곮 + +곯 +곯 +곯 +곯 +곯 + +곰 +곰 +곰 +곰 +곰 + +곱 +곱 +곱 +곱 +곱 + +곲 +곲 +곲 +곲 +곲 + +곳 +곳 +곳 +곳 +곳 + +곴 +곴 +곴 +곴 +곴 + +공 +공 +공 +공 +공 + +곶 +곶 +곶 +곶 +곶 + +곷 +곷 +곷 +곷 +곷 + +곸 +곸 +곸 +곸 +곸 + +곹 +곹 +곹 +곹 +곹 + +곺 +곺 +곺 +곺 +곺 + +곻 +곻 +곻 +곻 +곻 + +과 +과 +과 +과 +과 + +곽 +곽 +곽 +곽 +곽 + +곾 +곾 +곾 +곾 +곾 + +곿 +곿 +곿 +곿 +곿 + +관 +관 +관 +관 +관 + +괁 +괁 +괁 +괁 +괁 + +괂 +괂 +괂 +괂 +괂 + +괃 +괃 +괃 +괃 +괃 + +괄 +괄 +괄 +괄 +괄 + +괅 +괅 +괅 +괅 +괅 + +괆 +괆 +괆 +괆 +괆 + +괇 +괇 +괇 +괇 +괇 + +괈 +괈 +괈 +괈 +괈 + +괉 +괉 +괉 +괉 +괉 + +괊 +괊 +괊 +괊 +괊 + +괋 +괋 +괋 +괋 +괋 + +괌 +괌 +괌 +괌 +괌 + +괍 +괍 +괍 +괍 +괍 + +괎 +괎 +괎 +괎 +괎 + +괏 +괏 +괏 +괏 +괏 + +괐 +괐 +괐 +괐 +괐 + +광 +광 +광 +광 +광 + +괒 +괒 +괒 +괒 +괒 + +괓 +괓 +괓 +괓 +괓 + +괔 +괔 +괔 +괔 +괔 + +괕 +괕 +괕 +괕 +괕 + +괖 +괖 +괖 +괖 +괖 + +괗 +괗 +괗 +괗 +괗 + +괘 +괘 +괘 +괘 +괘 + +괙 +괙 +괙 +괙 +괙 + +괚 +괚 +괚 +괚 +괚 + +괛 +괛 +괛 +괛 +괛 + +괜 +괜 +괜 +괜 +괜 + +괝 +괝 +괝 +괝 +괝 + +괞 +괞 +괞 +괞 +괞 + +괟 +괟 +괟 +괟 +괟 + +괠 +괠 +괠 +괠 +괠 + +괡 +괡 +괡 +괡 +괡 + +괢 +괢 +괢 +괢 +괢 + +괣 +괣 +괣 +괣 +괣 + +괤 +괤 +괤 +괤 +괤 + +괥 +괥 +괥 +괥 +괥 + +괦 +괦 +괦 +괦 +괦 + +괧 +괧 +괧 +괧 +괧 + +괨 +괨 +괨 +괨 +괨 + +괩 +괩 +괩 +괩 +괩 + +괪 +괪 +괪 +괪 +괪 + +괫 +괫 +괫 +괫 +괫 + +괬 +괬 +괬 +괬 +괬 + +괭 +괭 +괭 +괭 +괭 + +괮 +괮 +괮 +괮 +괮 + +괯 +괯 +괯 +괯 +괯 + +괰 +괰 +괰 +괰 +괰 + +괱 +괱 +괱 +괱 +괱 + +괲 +괲 +괲 +괲 +괲 + +괳 +괳 +괳 +괳 +괳 + +괴 +괴 +괴 +괴 +괴 + +괵 +괵 +괵 +괵 +괵 + +괶 +괶 +괶 +괶 +괶 + +괷 +괷 +괷 +괷 +괷 + +괸 +괸 +괸 +괸 +괸 + +괹 +괹 +괹 +괹 +괹 + +괺 +괺 +괺 +괺 +괺 + +괻 +괻 +괻 +괻 +괻 + +괼 +괼 +괼 +괼 +괼 + +괽 +괽 +괽 +괽 +괽 + +괾 +괾 +괾 +괾 +괾 + +괿 +괿 +괿 +괿 +괿 + +굀 +굀 +굀 +굀 +굀 + +굁 +굁 +굁 +굁 +굁 + +굂 +굂 +굂 +굂 +굂 + +굃 +굃 +굃 +굃 +굃 + +굄 +굄 +굄 +굄 +굄 + +굅 +굅 +굅 +굅 +굅 + +굆 +굆 +굆 +굆 +굆 + +굇 +굇 +굇 +굇 +굇 + +굈 +굈 +굈 +굈 +굈 + +굉 +굉 +굉 +굉 +굉 + +굊 +굊 +굊 +굊 +굊 + +굋 +굋 +굋 +굋 +굋 + +굌 +굌 +굌 +굌 +굌 + +굍 +굍 +굍 +굍 +굍 + +굎 +굎 +굎 +굎 +굎 + +굏 +굏 +굏 +굏 +굏 + +교 +교 +교 +교 +교 + +굑 +굑 +굑 +굑 +굑 + +굒 +굒 +굒 +굒 +굒 + +굓 +굓 +굓 +굓 +굓 + +굔 +굔 +굔 +굔 +굔 + +굕 +굕 +굕 +굕 +굕 + +굖 +굖 +굖 +굖 +굖 + +굗 +굗 +굗 +굗 +굗 + +굘 +굘 +굘 +굘 +굘 + +굙 +굙 +굙 +굙 +굙 + +굚 +굚 +굚 +굚 +굚 + +굛 +굛 +굛 +굛 +굛 + +굜 +굜 +굜 +굜 +굜 + +굝 +굝 +굝 +굝 +굝 + +굞 +굞 +굞 +굞 +굞 + +굟 +굟 +굟 +굟 +굟 + +굠 +굠 +굠 +굠 +굠 + +굡 +굡 +굡 +굡 +굡 + +굢 +굢 +굢 +굢 +굢 + +굣 +굣 +굣 +굣 +굣 + +굤 +굤 +굤 +굤 +굤 + +굥 +굥 +굥 +굥 +굥 + +굦 +굦 +굦 +굦 +굦 + +굧 +굧 +굧 +굧 +굧 + +굨 +굨 +굨 +굨 +굨 + +굩 +굩 +굩 +굩 +굩 + +굪 +굪 +굪 +굪 +굪 + +굫 +굫 +굫 +굫 +굫 + +구 +구 +구 +구 +구 + +국 +국 +국 +국 +국 + +굮 +굮 +굮 +굮 +굮 + +굯 +굯 +굯 +굯 +굯 + +군 +군 +군 +군 +군 + +굱 +굱 +굱 +굱 +굱 + +굲 +굲 +굲 +굲 +굲 + +굳 +굳 +굳 +굳 +굳 + +굴 +굴 +굴 +굴 +굴 + +굵 +굵 +굵 +굵 +굵 + +굶 +굶 +굶 +굶 +굶 + +굷 +굷 +굷 +굷 +굷 + +굸 +굸 +굸 +굸 +굸 + +굹 +굹 +굹 +굹 +굹 + +굺 +굺 +굺 +굺 +굺 + +굻 +굻 +굻 +굻 +굻 + +굼 +굼 +굼 +굼 +굼 + +굽 +굽 +굽 +굽 +굽 + +굾 +굾 +굾 +굾 +굾 + +굿 +굿 +굿 +굿 +굿 + +궀 +궀 +궀 +궀 +궀 + +궁 +궁 +궁 +궁 +궁 + +궂 +궂 +궂 +궂 +궂 + +궃 +궃 +궃 +궃 +궃 + +궄 +궄 +궄 +궄 +궄 + +궅 +궅 +궅 +궅 +궅 + +궆 +궆 +궆 +궆 +궆 + +궇 +궇 +궇 +궇 +궇 + +궈 +궈 +궈 +궈 +궈 + +궉 +궉 +궉 +궉 +궉 + +궊 +궊 +궊 +궊 +궊 + +궋 +궋 +궋 +궋 +궋 + +권 +권 +권 +권 +권 + +궍 +궍 +궍 +궍 +궍 + +궎 +궎 +궎 +궎 +궎 + +궏 +궏 +궏 +궏 +궏 + +궐 +궐 +궐 +궐 +궐 + +궑 +궑 +궑 +궑 +궑 + +궒 +궒 +궒 +궒 +궒 + +궓 +궓 +궓 +궓 +궓 + +궔 +궔 +궔 +궔 +궔 + +궕 +궕 +궕 +궕 +궕 + +궖 +궖 +궖 +궖 +궖 + +궗 +궗 +궗 +궗 +궗 + +궘 +궘 +궘 +궘 +궘 + +궙 +궙 +궙 +궙 +궙 + +궚 +궚 +궚 +궚 +궚 + +궛 +궛 +궛 +궛 +궛 + +궜 +궜 +궜 +궜 +궜 + +궝 +궝 +궝 +궝 +궝 + +궞 +궞 +궞 +궞 +궞 + +궟 +궟 +궟 +궟 +궟 + +궠 +궠 +궠 +궠 +궠 + +궡 +궡 +궡 +궡 +궡 + +궢 +궢 +궢 +궢 +궢 + +궣 +궣 +궣 +궣 +궣 + +궤 +궤 +궤 +궤 +궤 + +궥 +궥 +궥 +궥 +궥 + +궦 +궦 +궦 +궦 +궦 + +궧 +궧 +궧 +궧 +궧 + +궨 +궨 +궨 +궨 +궨 + +궩 +궩 +궩 +궩 +궩 + +궪 +궪 +궪 +궪 +궪 + +궫 +궫 +궫 +궫 +궫 + +궬 +궬 +궬 +궬 +궬 + +궭 +궭 +궭 +궭 +궭 + +궮 +궮 +궮 +궮 +궮 + +궯 +궯 +궯 +궯 +궯 + +궰 +궰 +궰 +궰 +궰 + +궱 +궱 +궱 +궱 +궱 + +궲 +궲 +궲 +궲 +궲 + +궳 +궳 +궳 +궳 +궳 + +궴 +궴 +궴 +궴 +궴 + +궵 +궵 +궵 +궵 +궵 + +궶 +궶 +궶 +궶 +궶 + +궷 +궷 +궷 +궷 +궷 + +궸 +궸 +궸 +궸 +궸 + +궹 +궹 +궹 +궹 +궹 + +궺 +궺 +궺 +궺 +궺 + +궻 +궻 +궻 +궻 +궻 + +궼 +궼 +궼 +궼 +궼 + +궽 +궽 +궽 +궽 +궽 + +궾 +궾 +궾 +궾 +궾 + +궿 +궿 +궿 +궿 +궿 + +귀 +귀 +귀 +귀 +귀 + +귁 +귁 +귁 +귁 +귁 + +귂 +귂 +귂 +귂 +귂 + +귃 +귃 +귃 +귃 +귃 + +귄 +귄 +귄 +귄 +귄 + +귅 +귅 +귅 +귅 +귅 + +귆 +귆 +귆 +귆 +귆 + +귇 +귇 +귇 +귇 +귇 + +귈 +귈 +귈 +귈 +귈 + +귉 +귉 +귉 +귉 +귉 + +귊 +귊 +귊 +귊 +귊 + +귋 +귋 +귋 +귋 +귋 + +귌 +귌 +귌 +귌 +귌 + +귍 +귍 +귍 +귍 +귍 + +귎 +귎 +귎 +귎 +귎 + +귏 +귏 +귏 +귏 +귏 + +귐 +귐 +귐 +귐 +귐 + +귑 +귑 +귑 +귑 +귑 + +귒 +귒 +귒 +귒 +귒 + +귓 +귓 +귓 +귓 +귓 + +귔 +귔 +귔 +귔 +귔 + +귕 +귕 +귕 +귕 +귕 + +귖 +귖 +귖 +귖 +귖 + +귗 +귗 +귗 +귗 +귗 + +귘 +귘 +귘 +귘 +귘 + +귙 +귙 +귙 +귙 +귙 + +귚 +귚 +귚 +귚 +귚 + +귛 +귛 +귛 +귛 +귛 + +규 +규 +규 +규 +규 + +귝 +귝 +귝 +귝 +귝 + +귞 +귞 +귞 +귞 +귞 + +귟 +귟 +귟 +귟 +귟 + +균 +균 +균 +균 +균 + +귡 +귡 +귡 +귡 +귡 + +귢 +귢 +귢 +귢 +귢 + +귣 +귣 +귣 +귣 +귣 + +귤 +귤 +귤 +귤 +귤 + +귥 +귥 +귥 +귥 +귥 + +귦 +귦 +귦 +귦 +귦 + +귧 +귧 +귧 +귧 +귧 + +귨 +귨 +귨 +귨 +귨 + +귩 +귩 +귩 +귩 +귩 + +귪 +귪 +귪 +귪 +귪 + +귫 +귫 +귫 +귫 +귫 + +귬 +귬 +귬 +귬 +귬 + +귭 +귭 +귭 +귭 +귭 + +귮 +귮 +귮 +귮 +귮 + +귯 +귯 +귯 +귯 +귯 + +귰 +귰 +귰 +귰 +귰 + +귱 +귱 +귱 +귱 +귱 + +귲 +귲 +귲 +귲 +귲 + +귳 +귳 +귳 +귳 +귳 + +귴 +귴 +귴 +귴 +귴 + +귵 +귵 +귵 +귵 +귵 + +귶 +귶 +귶 +귶 +귶 + +귷 +귷 +귷 +귷 +귷 + +그 +그 +그 +그 +그 + +극 +극 +극 +극 +극 + +귺 +귺 +귺 +귺 +귺 + +귻 +귻 +귻 +귻 +귻 + +근 +근 +근 +근 +근 + +귽 +귽 +귽 +귽 +귽 + +귾 +귾 +귾 +귾 +귾 + +귿 +귿 +귿 +귿 +귿 + +글 +글 +글 +글 +글 + +긁 +긁 +긁 +긁 +긁 + +긂 +긂 +긂 +긂 +긂 + +긃 +긃 +긃 +긃 +긃 + +긄 +긄 +긄 +긄 +긄 + +긅 +긅 +긅 +긅 +긅 + +긆 +긆 +긆 +긆 +긆 + +긇 +긇 +긇 +긇 +긇 + +금 +금 +금 +금 +금 + +급 +급 +급 +급 +급 + +긊 +긊 +긊 +긊 +긊 + +긋 +긋 +긋 +긋 +긋 + +긌 +긌 +긌 +긌 +긌 + +긍 +긍 +긍 +긍 +긍 + +긎 +긎 +긎 +긎 +긎 + +긏 +긏 +긏 +긏 +긏 + +긐 +긐 +긐 +긐 +긐 + +긑 +긑 +긑 +긑 +긑 + +긒 +긒 +긒 +긒 +긒 + +긓 +긓 +긓 +긓 +긓 + +긔 +긔 +긔 +긔 +긔 + +긕 +긕 +긕 +긕 +긕 + +긖 +긖 +긖 +긖 +긖 + +긗 +긗 +긗 +긗 +긗 + +긘 +긘 +긘 +긘 +긘 + +긙 +긙 +긙 +긙 +긙 + +긚 +긚 +긚 +긚 +긚 + +긛 +긛 +긛 +긛 +긛 + +긜 +긜 +긜 +긜 +긜 + +긝 +긝 +긝 +긝 +긝 + +긞 +긞 +긞 +긞 +긞 + +긟 +긟 +긟 +긟 +긟 + +긠 +긠 +긠 +긠 +긠 + +긡 +긡 +긡 +긡 +긡 + +긢 +긢 +긢 +긢 +긢 + +긣 +긣 +긣 +긣 +긣 + +긤 +긤 +긤 +긤 +긤 + +긥 +긥 +긥 +긥 +긥 + +긦 +긦 +긦 +긦 +긦 + +긧 +긧 +긧 +긧 +긧 + +긨 +긨 +긨 +긨 +긨 + +긩 +긩 +긩 +긩 +긩 + +긪 +긪 +긪 +긪 +긪 + +긫 +긫 +긫 +긫 +긫 + +긬 +긬 +긬 +긬 +긬 + +긭 +긭 +긭 +긭 +긭 + +긮 +긮 +긮 +긮 +긮 + +긯 +긯 +긯 +긯 +긯 + +기 +기 +기 +기 +기 + +긱 +긱 +긱 +긱 +긱 + +긲 +긲 +긲 +긲 +긲 + +긳 +긳 +긳 +긳 +긳 + +긴 +긴 +긴 +긴 +긴 + +긵 +긵 +긵 +긵 +긵 + +긶 +긶 +긶 +긶 +긶 + +긷 +긷 +긷 +긷 +긷 + +길 +길 +길 +길 +길 + +긹 +긹 +긹 +긹 +긹 + +긺 +긺 +긺 +긺 +긺 + +긻 +긻 +긻 +긻 +긻 + +긼 +긼 +긼 +긼 +긼 + +긽 +긽 +긽 +긽 +긽 + +긾 +긾 +긾 +긾 +긾 + +긿 +긿 +긿 +긿 +긿 + +김 +김 +김 +김 +김 + +깁 +깁 +깁 +깁 +깁 + +깂 +깂 +깂 +깂 +깂 + +깃 +깃 +깃 +깃 +깃 + +깄 +깄 +깄 +깄 +깄 + +깅 +깅 +깅 +깅 +깅 + +깆 +깆 +깆 +깆 +깆 + +깇 +깇 +깇 +깇 +깇 + +깈 +깈 +깈 +깈 +깈 + +깉 +깉 +깉 +깉 +깉 + +깊 +깊 +깊 +깊 +깊 + +깋 +깋 +깋 +깋 +깋 + +까 +까 +까 +까 +까 + +깍 +깍 +깍 +깍 +깍 + +깎 +깎 +깎 +깎 +깎 + +깏 +깏 +깏 +깏 +깏 + +깐 +깐 +깐 +깐 +깐 + +깑 +깑 +깑 +깑 +깑 + +깒 +깒 +깒 +깒 +깒 + +깓 +깓 +깓 +깓 +깓 + +깔 +깔 +깔 +깔 +깔 + +깕 +깕 +깕 +깕 +깕 + +깖 +깖 +깖 +깖 +깖 + +깗 +깗 +깗 +깗 +깗 + +깘 +깘 +깘 +깘 +깘 + +깙 +깙 +깙 +깙 +깙 + +깚 +깚 +깚 +깚 +깚 + +깛 +깛 +깛 +깛 +깛 + +깜 +깜 +깜 +깜 +깜 + +깝 +깝 +깝 +깝 +깝 + +깞 +깞 +깞 +깞 +깞 + +깟 +깟 +깟 +깟 +깟 + +깠 +깠 +깠 +깠 +깠 + +깡 +깡 +깡 +깡 +깡 + +깢 +깢 +깢 +깢 +깢 + +깣 +깣 +깣 +깣 +깣 + +깤 +깤 +깤 +깤 +깤 + +깥 +깥 +깥 +깥 +깥 + +깦 +깦 +깦 +깦 +깦 + +깧 +깧 +깧 +깧 +깧 + +깨 +깨 +깨 +깨 +깨 + +깩 +깩 +깩 +깩 +깩 + +깪 +깪 +깪 +깪 +깪 + +깫 +깫 +깫 +깫 +깫 + +깬 +깬 +깬 +깬 +깬 + +깭 +깭 +깭 +깭 +깭 + +깮 +깮 +깮 +깮 +깮 + +깯 +깯 +깯 +깯 +깯 + +깰 +깰 +깰 +깰 +깰 + +깱 +깱 +깱 +깱 +깱 + +깲 +깲 +깲 +깲 +깲 + +깳 +깳 +깳 +깳 +깳 + +깴 +깴 +깴 +깴 +깴 + +깵 +깵 +깵 +깵 +깵 + +깶 +깶 +깶 +깶 +깶 + +깷 +깷 +깷 +깷 +깷 + +깸 +깸 +깸 +깸 +깸 + +깹 +깹 +깹 +깹 +깹 + +깺 +깺 +깺 +깺 +깺 + +깻 +깻 +깻 +깻 +깻 + +깼 +깼 +깼 +깼 +깼 + +깽 +깽 +깽 +깽 +깽 + +깾 +깾 +깾 +깾 +깾 + +깿 +깿 +깿 +깿 +깿 + +꺀 +꺀 +꺀 +꺀 +꺀 + +꺁 +꺁 +꺁 +꺁 +꺁 + +꺂 +꺂 +꺂 +꺂 +꺂 + +꺃 +꺃 +꺃 +꺃 +꺃 + +꺄 +꺄 +꺄 +꺄 +꺄 + +꺅 +꺅 +꺅 +꺅 +꺅 + +꺆 +꺆 +꺆 +꺆 +꺆 + +꺇 +꺇 +꺇 +꺇 +꺇 + +꺈 +꺈 +꺈 +꺈 +꺈 + +꺉 +꺉 +꺉 +꺉 +꺉 + +꺊 +꺊 +꺊 +꺊 +꺊 + +꺋 +꺋 +꺋 +꺋 +꺋 + +꺌 +꺌 +꺌 +꺌 +꺌 + +꺍 +꺍 +꺍 +꺍 +꺍 + +꺎 +꺎 +꺎 +꺎 +꺎 + +꺏 +꺏 +꺏 +꺏 +꺏 + +꺐 +꺐 +꺐 +꺐 +꺐 + +꺑 +꺑 +꺑 +꺑 +꺑 + +꺒 +꺒 +꺒 +꺒 +꺒 + +꺓 +꺓 +꺓 +꺓 +꺓 + +꺔 +꺔 +꺔 +꺔 +꺔 + +꺕 +꺕 +꺕 +꺕 +꺕 + +꺖 +꺖 +꺖 +꺖 +꺖 + +꺗 +꺗 +꺗 +꺗 +꺗 + +꺘 +꺘 +꺘 +꺘 +꺘 + +꺙 +꺙 +꺙 +꺙 +꺙 + +꺚 +꺚 +꺚 +꺚 +꺚 + +꺛 +꺛 +꺛 +꺛 +꺛 + +꺜 +꺜 +꺜 +꺜 +꺜 + +꺝 +꺝 +꺝 +꺝 +꺝 + +꺞 +꺞 +꺞 +꺞 +꺞 + +꺟 +꺟 +꺟 +꺟 +꺟 + +꺠 +꺠 +꺠 +꺠 +꺠 + +꺡 +꺡 +꺡 +꺡 +꺡 + +꺢 +꺢 +꺢 +꺢 +꺢 + +꺣 +꺣 +꺣 +꺣 +꺣 + +꺤 +꺤 +꺤 +꺤 +꺤 + +꺥 +꺥 +꺥 +꺥 +꺥 + +꺦 +꺦 +꺦 +꺦 +꺦 + +꺧 +꺧 +꺧 +꺧 +꺧 + +꺨 +꺨 +꺨 +꺨 +꺨 + +꺩 +꺩 +꺩 +꺩 +꺩 + +꺪 +꺪 +꺪 +꺪 +꺪 + +꺫 +꺫 +꺫 +꺫 +꺫 + +꺬 +꺬 +꺬 +꺬 +꺬 + +꺭 +꺭 +꺭 +꺭 +꺭 + +꺮 +꺮 +꺮 +꺮 +꺮 + +꺯 +꺯 +꺯 +꺯 +꺯 + +꺰 +꺰 +꺰 +꺰 +꺰 + +꺱 +꺱 +꺱 +꺱 +꺱 + +꺲 +꺲 +꺲 +꺲 +꺲 + +꺳 +꺳 +꺳 +꺳 +꺳 + +꺴 +꺴 +꺴 +꺴 +꺴 + +꺵 +꺵 +꺵 +꺵 +꺵 + +꺶 +꺶 +꺶 +꺶 +꺶 + +꺷 +꺷 +꺷 +꺷 +꺷 + +꺸 +꺸 +꺸 +꺸 +꺸 + +꺹 +꺹 +꺹 +꺹 +꺹 + +꺺 +꺺 +꺺 +꺺 +꺺 + +꺻 +꺻 +꺻 +꺻 +꺻 + +꺼 +꺼 +꺼 +꺼 +꺼 + +꺽 +꺽 +꺽 +꺽 +꺽 + +꺾 +꺾 +꺾 +꺾 +꺾 + +꺿 +꺿 +꺿 +꺿 +꺿 + +껀 +껀 +껀 +껀 +껀 + +껁 +껁 +껁 +껁 +껁 + +껂 +껂 +껂 +껂 +껂 + +껃 +껃 +껃 +껃 +껃 + +껄 +껄 +껄 +껄 +껄 + +껅 +껅 +껅 +껅 +껅 + +껆 +껆 +껆 +껆 +껆 + +껇 +껇 +껇 +껇 +껇 + +껈 +껈 +껈 +껈 +껈 + +껉 +껉 +껉 +껉 +껉 + +껊 +껊 +껊 +껊 +껊 + +껋 +껋 +껋 +껋 +껋 + +껌 +껌 +껌 +껌 +껌 + +껍 +껍 +껍 +껍 +껍 + +껎 +껎 +껎 +껎 +껎 + +껏 +껏 +껏 +껏 +껏 + +껐 +껐 +껐 +껐 +껐 + +껑 +껑 +껑 +껑 +껑 + +껒 +껒 +껒 +껒 +껒 + +껓 +껓 +껓 +껓 +껓 + +껔 +껔 +껔 +껔 +껔 + +껕 +껕 +껕 +껕 +껕 + +껖 +껖 +껖 +껖 +껖 + +껗 +껗 +껗 +껗 +껗 + +께 +께 +께 +께 +께 + +껙 +껙 +껙 +껙 +껙 + +껚 +껚 +껚 +껚 +껚 + +껛 +껛 +껛 +껛 +껛 + +껜 +껜 +껜 +껜 +껜 + +껝 +껝 +껝 +껝 +껝 + +껞 +껞 +껞 +껞 +껞 + +껟 +껟 +껟 +껟 +껟 + +껠 +껠 +껠 +껠 +껠 + +껡 +껡 +껡 +껡 +껡 + +껢 +껢 +껢 +껢 +껢 + +껣 +껣 +껣 +껣 +껣 + +껤 +껤 +껤 +껤 +껤 + +껥 +껥 +껥 +껥 +껥 + +껦 +껦 +껦 +껦 +껦 + +껧 +껧 +껧 +껧 +껧 + +껨 +껨 +껨 +껨 +껨 + +껩 +껩 +껩 +껩 +껩 + +껪 +껪 +껪 +껪 +껪 + +껫 +껫 +껫 +껫 +껫 + +껬 +껬 +껬 +껬 +껬 + +껭 +껭 +껭 +껭 +껭 + +껮 +껮 +껮 +껮 +껮 + +껯 +껯 +껯 +껯 +껯 + +껰 +껰 +껰 +껰 +껰 + +껱 +껱 +껱 +껱 +껱 + +껲 +껲 +껲 +껲 +껲 + +껳 +껳 +껳 +껳 +껳 + +껴 +껴 +껴 +껴 +껴 + +껵 +껵 +껵 +껵 +껵 + +껶 +껶 +껶 +껶 +껶 + +껷 +껷 +껷 +껷 +껷 + +껸 +껸 +껸 +껸 +껸 + +껹 +껹 +껹 +껹 +껹 + +껺 +껺 +껺 +껺 +껺 + +껻 +껻 +껻 +껻 +껻 + +껼 +껼 +껼 +껼 +껼 + +껽 +껽 +껽 +껽 +껽 + +껾 +껾 +껾 +껾 +껾 + +껿 +껿 +껿 +껿 +껿 + +꼀 +꼀 +꼀 +꼀 +꼀 + +꼁 +꼁 +꼁 +꼁 +꼁 + +꼂 +꼂 +꼂 +꼂 +꼂 + +꼃 +꼃 +꼃 +꼃 +꼃 + +꼄 +꼄 +꼄 +꼄 +꼄 + +꼅 +꼅 +꼅 +꼅 +꼅 + +꼆 +꼆 +꼆 +꼆 +꼆 + +꼇 +꼇 +꼇 +꼇 +꼇 + +꼈 +꼈 +꼈 +꼈 +꼈 + +꼉 +꼉 +꼉 +꼉 +꼉 + +꼊 +꼊 +꼊 +꼊 +꼊 + +꼋 +꼋 +꼋 +꼋 +꼋 + +꼌 +꼌 +꼌 +꼌 +꼌 + +꼍 +꼍 +꼍 +꼍 +꼍 + +꼎 +꼎 +꼎 +꼎 +꼎 + +꼏 +꼏 +꼏 +꼏 +꼏 + +꼐 +꼐 +꼐 +꼐 +꼐 + +꼑 +꼑 +꼑 +꼑 +꼑 + +꼒 +꼒 +꼒 +꼒 +꼒 + +꼓 +꼓 +꼓 +꼓 +꼓 + +꼔 +꼔 +꼔 +꼔 +꼔 + +꼕 +꼕 +꼕 +꼕 +꼕 + +꼖 +꼖 +꼖 +꼖 +꼖 + +꼗 +꼗 +꼗 +꼗 +꼗 + +꼘 +꼘 +꼘 +꼘 +꼘 + +꼙 +꼙 +꼙 +꼙 +꼙 + +꼚 +꼚 +꼚 +꼚 +꼚 + +꼛 +꼛 +꼛 +꼛 +꼛 + +꼜 +꼜 +꼜 +꼜 +꼜 + +꼝 +꼝 +꼝 +꼝 +꼝 + +꼞 +꼞 +꼞 +꼞 +꼞 + +꼟 +꼟 +꼟 +꼟 +꼟 + +꼠 +꼠 +꼠 +꼠 +꼠 + +꼡 +꼡 +꼡 +꼡 +꼡 + +꼢 +꼢 +꼢 +꼢 +꼢 + +꼣 +꼣 +꼣 +꼣 +꼣 + +꼤 +꼤 +꼤 +꼤 +꼤 + +꼥 +꼥 +꼥 +꼥 +꼥 + +꼦 +꼦 +꼦 +꼦 +꼦 + +꼧 +꼧 +꼧 +꼧 +꼧 + +꼨 +꼨 +꼨 +꼨 +꼨 + +꼩 +꼩 +꼩 +꼩 +꼩 + +꼪 +꼪 +꼪 +꼪 +꼪 + +꼫 +꼫 +꼫 +꼫 +꼫 + +꼬 +꼬 +꼬 +꼬 +꼬 + +꼭 +꼭 +꼭 +꼭 +꼭 + +꼮 +꼮 +꼮 +꼮 +꼮 + +꼯 +꼯 +꼯 +꼯 +꼯 + +꼰 +꼰 +꼰 +꼰 +꼰 + +꼱 +꼱 +꼱 +꼱 +꼱 + +꼲 +꼲 +꼲 +꼲 +꼲 + +꼳 +꼳 +꼳 +꼳 +꼳 + +꼴 +꼴 +꼴 +꼴 +꼴 + +꼵 +꼵 +꼵 +꼵 +꼵 + +꼶 +꼶 +꼶 +꼶 +꼶 + +꼷 +꼷 +꼷 +꼷 +꼷 + +꼸 +꼸 +꼸 +꼸 +꼸 + +꼹 +꼹 +꼹 +꼹 +꼹 + +꼺 +꼺 +꼺 +꼺 +꼺 + +꼻 +꼻 +꼻 +꼻 +꼻 + +꼼 +꼼 +꼼 +꼼 +꼼 + +꼽 +꼽 +꼽 +꼽 +꼽 + +꼾 +꼾 +꼾 +꼾 +꼾 + +꼿 +꼿 +꼿 +꼿 +꼿 + +꽀 +꽀 +꽀 +꽀 +꽀 + +꽁 +꽁 +꽁 +꽁 +꽁 + +꽂 +꽂 +꽂 +꽂 +꽂 + +꽃 +꽃 +꽃 +꽃 +꽃 + +꽄 +꽄 +꽄 +꽄 +꽄 + +꽅 +꽅 +꽅 +꽅 +꽅 + +꽆 +꽆 +꽆 +꽆 +꽆 + +꽇 +꽇 +꽇 +꽇 +꽇 + +꽈 +꽈 +꽈 +꽈 +꽈 + +꽉 +꽉 +꽉 +꽉 +꽉 + +꽊 +꽊 +꽊 +꽊 +꽊 + +꽋 +꽋 +꽋 +꽋 +꽋 + +꽌 +꽌 +꽌 +꽌 +꽌 + +꽍 +꽍 +꽍 +꽍 +꽍 + +꽎 +꽎 +꽎 +꽎 +꽎 + +꽏 +꽏 +꽏 +꽏 +꽏 + +꽐 +꽐 +꽐 +꽐 +꽐 + +꽑 +꽑 +꽑 +꽑 +꽑 + +꽒 +꽒 +꽒 +꽒 +꽒 + +꽓 +꽓 +꽓 +꽓 +꽓 + +꽔 +꽔 +꽔 +꽔 +꽔 + +꽕 +꽕 +꽕 +꽕 +꽕 + +꽖 +꽖 +꽖 +꽖 +꽖 + +꽗 +꽗 +꽗 +꽗 +꽗 + +꽘 +꽘 +꽘 +꽘 +꽘 + +꽙 +꽙 +꽙 +꽙 +꽙 + +꽚 +꽚 +꽚 +꽚 +꽚 + +꽛 +꽛 +꽛 +꽛 +꽛 + +꽜 +꽜 +꽜 +꽜 +꽜 + +꽝 +꽝 +꽝 +꽝 +꽝 + +꽞 +꽞 +꽞 +꽞 +꽞 + +꽟 +꽟 +꽟 +꽟 +꽟 + +꽠 +꽠 +꽠 +꽠 +꽠 + +꽡 +꽡 +꽡 +꽡 +꽡 + +꽢 +꽢 +꽢 +꽢 +꽢 + +꽣 +꽣 +꽣 +꽣 +꽣 + +꽤 +꽤 +꽤 +꽤 +꽤 + +꽥 +꽥 +꽥 +꽥 +꽥 + +꽦 +꽦 +꽦 +꽦 +꽦 + +꽧 +꽧 +꽧 +꽧 +꽧 + +꽨 +꽨 +꽨 +꽨 +꽨 + +꽩 +꽩 +꽩 +꽩 +꽩 + +꽪 +꽪 +꽪 +꽪 +꽪 + +꽫 +꽫 +꽫 +꽫 +꽫 + +꽬 +꽬 +꽬 +꽬 +꽬 + +꽭 +꽭 +꽭 +꽭 +꽭 + +꽮 +꽮 +꽮 +꽮 +꽮 + +꽯 +꽯 +꽯 +꽯 +꽯 + +꽰 +꽰 +꽰 +꽰 +꽰 + +꽱 +꽱 +꽱 +꽱 +꽱 + +꽲 +꽲 +꽲 +꽲 +꽲 + +꽳 +꽳 +꽳 +꽳 +꽳 + +꽴 +꽴 +꽴 +꽴 +꽴 + +꽵 +꽵 +꽵 +꽵 +꽵 + +꽶 +꽶 +꽶 +꽶 +꽶 + +꽷 +꽷 +꽷 +꽷 +꽷 + +꽸 +꽸 +꽸 +꽸 +꽸 + +꽹 +꽹 +꽹 +꽹 +꽹 + +꽺 +꽺 +꽺 +꽺 +꽺 + +꽻 +꽻 +꽻 +꽻 +꽻 + +꽼 +꽼 +꽼 +꽼 +꽼 + +꽽 +꽽 +꽽 +꽽 +꽽 + +꽾 +꽾 +꽾 +꽾 +꽾 + +꽿 +꽿 +꽿 +꽿 +꽿 + +꾀 +꾀 +꾀 +꾀 +꾀 + +꾁 +꾁 +꾁 +꾁 +꾁 + +꾂 +꾂 +꾂 +꾂 +꾂 + +꾃 +꾃 +꾃 +꾃 +꾃 + +꾄 +꾄 +꾄 +꾄 +꾄 + +꾅 +꾅 +꾅 +꾅 +꾅 + +꾆 +꾆 +꾆 +꾆 +꾆 + +꾇 +꾇 +꾇 +꾇 +꾇 + +꾈 +꾈 +꾈 +꾈 +꾈 + +꾉 +꾉 +꾉 +꾉 +꾉 + +꾊 +꾊 +꾊 +꾊 +꾊 + +꾋 +꾋 +꾋 +꾋 +꾋 + +꾌 +꾌 +꾌 +꾌 +꾌 + +꾍 +꾍 +꾍 +꾍 +꾍 + +꾎 +꾎 +꾎 +꾎 +꾎 + +꾏 +꾏 +꾏 +꾏 +꾏 + +꾐 +꾐 +꾐 +꾐 +꾐 + +꾑 +꾑 +꾑 +꾑 +꾑 + +꾒 +꾒 +꾒 +꾒 +꾒 + +꾓 +꾓 +꾓 +꾓 +꾓 + +꾔 +꾔 +꾔 +꾔 +꾔 + +꾕 +꾕 +꾕 +꾕 +꾕 + +꾖 +꾖 +꾖 +꾖 +꾖 + +꾗 +꾗 +꾗 +꾗 +꾗 + +꾘 +꾘 +꾘 +꾘 +꾘 + +꾙 +꾙 +꾙 +꾙 +꾙 + +꾚 +꾚 +꾚 +꾚 +꾚 + +꾛 +꾛 +꾛 +꾛 +꾛 + +꾜 +꾜 +꾜 +꾜 +꾜 + +꾝 +꾝 +꾝 +꾝 +꾝 + +꾞 +꾞 +꾞 +꾞 +꾞 + +꾟 +꾟 +꾟 +꾟 +꾟 + +꾠 +꾠 +꾠 +꾠 +꾠 + +꾡 +꾡 +꾡 +꾡 +꾡 + +꾢 +꾢 +꾢 +꾢 +꾢 + +꾣 +꾣 +꾣 +꾣 +꾣 + +꾤 +꾤 +꾤 +꾤 +꾤 + +꾥 +꾥 +꾥 +꾥 +꾥 + +꾦 +꾦 +꾦 +꾦 +꾦 + +꾧 +꾧 +꾧 +꾧 +꾧 + +꾨 +꾨 +꾨 +꾨 +꾨 + +꾩 +꾩 +꾩 +꾩 +꾩 + +꾪 +꾪 +꾪 +꾪 +꾪 + +꾫 +꾫 +꾫 +꾫 +꾫 + +꾬 +꾬 +꾬 +꾬 +꾬 + +꾭 +꾭 +꾭 +꾭 +꾭 + +꾮 +꾮 +꾮 +꾮 +꾮 + +꾯 +꾯 +꾯 +꾯 +꾯 + +꾰 +꾰 +꾰 +꾰 +꾰 + +꾱 +꾱 +꾱 +꾱 +꾱 + +꾲 +꾲 +꾲 +꾲 +꾲 + +꾳 +꾳 +꾳 +꾳 +꾳 + +꾴 +꾴 +꾴 +꾴 +꾴 + +꾵 +꾵 +꾵 +꾵 +꾵 + +꾶 +꾶 +꾶 +꾶 +꾶 + +꾷 +꾷 +꾷 +꾷 +꾷 + +꾸 +꾸 +꾸 +꾸 +꾸 + +꾹 +꾹 +꾹 +꾹 +꾹 + +꾺 +꾺 +꾺 +꾺 +꾺 + +꾻 +꾻 +꾻 +꾻 +꾻 + +꾼 +꾼 +꾼 +꾼 +꾼 + +꾽 +꾽 +꾽 +꾽 +꾽 + +꾾 +꾾 +꾾 +꾾 +꾾 + +꾿 +꾿 +꾿 +꾿 +꾿 + +꿀 +꿀 +꿀 +꿀 +꿀 + +꿁 +꿁 +꿁 +꿁 +꿁 + +꿂 +꿂 +꿂 +꿂 +꿂 + +꿃 +꿃 +꿃 +꿃 +꿃 + +꿄 +꿄 +꿄 +꿄 +꿄 + +꿅 +꿅 +꿅 +꿅 +꿅 + +꿆 +꿆 +꿆 +꿆 +꿆 + +꿇 +꿇 +꿇 +꿇 +꿇 + +꿈 +꿈 +꿈 +꿈 +꿈 + +꿉 +꿉 +꿉 +꿉 +꿉 + +꿊 +꿊 +꿊 +꿊 +꿊 + +꿋 +꿋 +꿋 +꿋 +꿋 + +꿌 +꿌 +꿌 +꿌 +꿌 + +꿍 +꿍 +꿍 +꿍 +꿍 + +꿎 +꿎 +꿎 +꿎 +꿎 + +꿏 +꿏 +꿏 +꿏 +꿏 + +꿐 +꿐 +꿐 +꿐 +꿐 + +꿑 +꿑 +꿑 +꿑 +꿑 + +꿒 +꿒 +꿒 +꿒 +꿒 + +꿓 +꿓 +꿓 +꿓 +꿓 + +꿔 +꿔 +꿔 +꿔 +꿔 + +꿕 +꿕 +꿕 +꿕 +꿕 + +꿖 +꿖 +꿖 +꿖 +꿖 + +꿗 +꿗 +꿗 +꿗 +꿗 + +꿘 +꿘 +꿘 +꿘 +꿘 + +꿙 +꿙 +꿙 +꿙 +꿙 + +꿚 +꿚 +꿚 +꿚 +꿚 + +꿛 +꿛 +꿛 +꿛 +꿛 + +꿜 +꿜 +꿜 +꿜 +꿜 + +꿝 +꿝 +꿝 +꿝 +꿝 + +꿞 +꿞 +꿞 +꿞 +꿞 + +꿟 +꿟 +꿟 +꿟 +꿟 + +꿠 +꿠 +꿠 +꿠 +꿠 + +꿡 +꿡 +꿡 +꿡 +꿡 + +꿢 +꿢 +꿢 +꿢 +꿢 + +꿣 +꿣 +꿣 +꿣 +꿣 + +꿤 +꿤 +꿤 +꿤 +꿤 + +꿥 +꿥 +꿥 +꿥 +꿥 + +꿦 +꿦 +꿦 +꿦 +꿦 + +꿧 +꿧 +꿧 +꿧 +꿧 + +꿨 +꿨 +꿨 +꿨 +꿨 + +꿩 +꿩 +꿩 +꿩 +꿩 + +꿪 +꿪 +꿪 +꿪 +꿪 + +꿫 +꿫 +꿫 +꿫 +꿫 + +꿬 +꿬 +꿬 +꿬 +꿬 + +꿭 +꿭 +꿭 +꿭 +꿭 + +꿮 +꿮 +꿮 +꿮 +꿮 + +꿯 +꿯 +꿯 +꿯 +꿯 + +꿰 +꿰 +꿰 +꿰 +꿰 + +꿱 +꿱 +꿱 +꿱 +꿱 + +꿲 +꿲 +꿲 +꿲 +꿲 + +꿳 +꿳 +꿳 +꿳 +꿳 + +꿴 +꿴 +꿴 +꿴 +꿴 + +꿵 +꿵 +꿵 +꿵 +꿵 + +꿶 +꿶 +꿶 +꿶 +꿶 + +꿷 +꿷 +꿷 +꿷 +꿷 + +꿸 +꿸 +꿸 +꿸 +꿸 + +꿹 +꿹 +꿹 +꿹 +꿹 + +꿺 +꿺 +꿺 +꿺 +꿺 + +꿻 +꿻 +꿻 +꿻 +꿻 + +꿼 +꿼 +꿼 +꿼 +꿼 + +꿽 +꿽 +꿽 +꿽 +꿽 + +꿾 +꿾 +꿾 +꿾 +꿾 + +꿿 +꿿 +꿿 +꿿 +꿿 + +뀀 +뀀 +뀀 +뀀 +뀀 + +뀁 +뀁 +뀁 +뀁 +뀁 + +뀂 +뀂 +뀂 +뀂 +뀂 + +뀃 +뀃 +뀃 +뀃 +뀃 + +뀄 +뀄 +뀄 +뀄 +뀄 + +뀅 +뀅 +뀅 +뀅 +뀅 + +뀆 +뀆 +뀆 +뀆 +뀆 + +뀇 +뀇 +뀇 +뀇 +뀇 + +뀈 +뀈 +뀈 +뀈 +뀈 + +뀉 +뀉 +뀉 +뀉 +뀉 + +뀊 +뀊 +뀊 +뀊 +뀊 + +뀋 +뀋 +뀋 +뀋 +뀋 + +뀌 +뀌 +뀌 +뀌 +뀌 + +뀍 +뀍 +뀍 +뀍 +뀍 + +뀎 +뀎 +뀎 +뀎 +뀎 + +뀏 +뀏 +뀏 +뀏 +뀏 + +뀐 +뀐 +뀐 +뀐 +뀐 + +뀑 +뀑 +뀑 +뀑 +뀑 + +뀒 +뀒 +뀒 +뀒 +뀒 + +뀓 +뀓 +뀓 +뀓 +뀓 + +뀔 +뀔 +뀔 +뀔 +뀔 + +뀕 +뀕 +뀕 +뀕 +뀕 + +뀖 +뀖 +뀖 +뀖 +뀖 + +뀗 +뀗 +뀗 +뀗 +뀗 + +뀘 +뀘 +뀘 +뀘 +뀘 + +뀙 +뀙 +뀙 +뀙 +뀙 + +뀚 +뀚 +뀚 +뀚 +뀚 + +뀛 +뀛 +뀛 +뀛 +뀛 + +뀜 +뀜 +뀜 +뀜 +뀜 + +뀝 +뀝 +뀝 +뀝 +뀝 + +뀞 +뀞 +뀞 +뀞 +뀞 + +뀟 +뀟 +뀟 +뀟 +뀟 + +뀠 +뀠 +뀠 +뀠 +뀠 + +뀡 +뀡 +뀡 +뀡 +뀡 + +뀢 +뀢 +뀢 +뀢 +뀢 + +뀣 +뀣 +뀣 +뀣 +뀣 + +뀤 +뀤 +뀤 +뀤 +뀤 + +뀥 +뀥 +뀥 +뀥 +뀥 + +뀦 +뀦 +뀦 +뀦 +뀦 + +뀧 +뀧 +뀧 +뀧 +뀧 + +뀨 +뀨 +뀨 +뀨 +뀨 + +뀩 +뀩 +뀩 +뀩 +뀩 + +뀪 +뀪 +뀪 +뀪 +뀪 + +뀫 +뀫 +뀫 +뀫 +뀫 + +뀬 +뀬 +뀬 +뀬 +뀬 + +뀭 +뀭 +뀭 +뀭 +뀭 + +뀮 +뀮 +뀮 +뀮 +뀮 + +뀯 +뀯 +뀯 +뀯 +뀯 + +뀰 +뀰 +뀰 +뀰 +뀰 + +뀱 +뀱 +뀱 +뀱 +뀱 + +뀲 +뀲 +뀲 +뀲 +뀲 + +뀳 +뀳 +뀳 +뀳 +뀳 + +뀴 +뀴 +뀴 +뀴 +뀴 + +뀵 +뀵 +뀵 +뀵 +뀵 + +뀶 +뀶 +뀶 +뀶 +뀶 + +뀷 +뀷 +뀷 +뀷 +뀷 + +뀸 +뀸 +뀸 +뀸 +뀸 + +뀹 +뀹 +뀹 +뀹 +뀹 + +뀺 +뀺 +뀺 +뀺 +뀺 + +뀻 +뀻 +뀻 +뀻 +뀻 + +뀼 +뀼 +뀼 +뀼 +뀼 + +뀽 +뀽 +뀽 +뀽 +뀽 + +뀾 +뀾 +뀾 +뀾 +뀾 + +뀿 +뀿 +뀿 +뀿 +뀿 + +끀 +끀 +끀 +끀 +끀 + +끁 +끁 +끁 +끁 +끁 + +끂 +끂 +끂 +끂 +끂 + +끃 +끃 +끃 +끃 +끃 + +끄 +끄 +끄 +끄 +끄 + +끅 +끅 +끅 +끅 +끅 + +끆 +끆 +끆 +끆 +끆 + +끇 +끇 +끇 +끇 +끇 + +끈 +끈 +끈 +끈 +끈 + +끉 +끉 +끉 +끉 +끉 + +끊 +끊 +끊 +끊 +끊 + +끋 +끋 +끋 +끋 +끋 + +끌 +끌 +끌 +끌 +끌 + +끍 +끍 +끍 +끍 +끍 + +끎 +끎 +끎 +끎 +끎 + +끏 +끏 +끏 +끏 +끏 + +끐 +끐 +끐 +끐 +끐 + +끑 +끑 +끑 +끑 +끑 + +끒 +끒 +끒 +끒 +끒 + +끓 +끓 +끓 +끓 +끓 + +끔 +끔 +끔 +끔 +끔 + +끕 +끕 +끕 +끕 +끕 + +끖 +끖 +끖 +끖 +끖 + +끗 +끗 +끗 +끗 +끗 + +끘 +끘 +끘 +끘 +끘 + +끙 +끙 +끙 +끙 +끙 + +끚 +끚 +끚 +끚 +끚 + +끛 +끛 +끛 +끛 +끛 + +끜 +끜 +끜 +끜 +끜 + +끝 +끝 +끝 +끝 +끝 + +끞 +끞 +끞 +끞 +끞 + +끟 +끟 +끟 +끟 +끟 + +끠 +끠 +끠 +끠 +끠 + +끡 +끡 +끡 +끡 +끡 + +끢 +끢 +끢 +끢 +끢 + +끣 +끣 +끣 +끣 +끣 + +끤 +끤 +끤 +끤 +끤 + +끥 +끥 +끥 +끥 +끥 + +끦 +끦 +끦 +끦 +끦 + +끧 +끧 +끧 +끧 +끧 + +끨 +끨 +끨 +끨 +끨 + +끩 +끩 +끩 +끩 +끩 + +끪 +끪 +끪 +끪 +끪 + +끫 +끫 +끫 +끫 +끫 + +끬 +끬 +끬 +끬 +끬 + +끭 +끭 +끭 +끭 +끭 + +끮 +끮 +끮 +끮 +끮 + +끯 +끯 +끯 +끯 +끯 + +끰 +끰 +끰 +끰 +끰 + +끱 +끱 +끱 +끱 +끱 + +끲 +끲 +끲 +끲 +끲 + +끳 +끳 +끳 +끳 +끳 + +끴 +끴 +끴 +끴 +끴 + +끵 +끵 +끵 +끵 +끵 + +끶 +끶 +끶 +끶 +끶 + +끷 +끷 +끷 +끷 +끷 + +끸 +끸 +끸 +끸 +끸 + +끹 +끹 +끹 +끹 +끹 + +끺 +끺 +끺 +끺 +끺 + +끻 +끻 +끻 +끻 +끻 + +끼 +끼 +끼 +끼 +끼 + +끽 +끽 +끽 +끽 +끽 + +끾 +끾 +끾 +끾 +끾 + +끿 +끿 +끿 +끿 +끿 + +낀 +낀 +낀 +낀 +낀 + +낁 +낁 +낁 +낁 +낁 + +낂 +낂 +낂 +낂 +낂 + +낃 +낃 +낃 +낃 +낃 + +낄 +낄 +낄 +낄 +낄 + +낅 +낅 +낅 +낅 +낅 + +낆 +낆 +낆 +낆 +낆 + +낇 +낇 +낇 +낇 +낇 + +낈 +낈 +낈 +낈 +낈 + +낉 +낉 +낉 +낉 +낉 + +낊 +낊 +낊 +낊 +낊 + +낋 +낋 +낋 +낋 +낋 + +낌 +낌 +낌 +낌 +낌 + +낍 +낍 +낍 +낍 +낍 + +낎 +낎 +낎 +낎 +낎 + +낏 +낏 +낏 +낏 +낏 + +낐 +낐 +낐 +낐 +낐 + +낑 +낑 +낑 +낑 +낑 + +낒 +낒 +낒 +낒 +낒 + +낓 +낓 +낓 +낓 +낓 + +낔 +낔 +낔 +낔 +낔 + +낕 +낕 +낕 +낕 +낕 + +낖 +낖 +낖 +낖 +낖 + +낗 +낗 +낗 +낗 +낗 + +나 +나 +나 +나 +나 + +낙 +낙 +낙 +낙 +낙 + +낚 +낚 +낚 +낚 +낚 + +낛 +낛 +낛 +낛 +낛 + +난 +난 +난 +난 +난 + +낝 +낝 +낝 +낝 +낝 + +낞 +낞 +낞 +낞 +낞 + +낟 +낟 +낟 +낟 +낟 + +날 +날 +날 +날 +날 + +낡 +낡 +낡 +낡 +낡 + +낢 +낢 +낢 +낢 +낢 + +낣 +낣 +낣 +낣 +낣 + +낤 +낤 +낤 +낤 +낤 + +낥 +낥 +낥 +낥 +낥 + +낦 +낦 +낦 +낦 +낦 + +낧 +낧 +낧 +낧 +낧 + +남 +남 +남 +남 +남 + +납 +납 +납 +납 +납 + +낪 +낪 +낪 +낪 +낪 + +낫 +낫 +낫 +낫 +낫 + +났 +났 +났 +났 +났 + +낭 +낭 +낭 +낭 +낭 + +낮 +낮 +낮 +낮 +낮 + +낯 +낯 +낯 +낯 +낯 + +낰 +낰 +낰 +낰 +낰 + +낱 +낱 +낱 +낱 +낱 + +낲 +낲 +낲 +낲 +낲 + +낳 +낳 +낳 +낳 +낳 + +내 +내 +내 +내 +내 + +낵 +낵 +낵 +낵 +낵 + +낶 +낶 +낶 +낶 +낶 + +낷 +낷 +낷 +낷 +낷 + +낸 +낸 +낸 +낸 +낸 + +낹 +낹 +낹 +낹 +낹 + +낺 +낺 +낺 +낺 +낺 + +낻 +낻 +낻 +낻 +낻 + +낼 +낼 +낼 +낼 +낼 + +낽 +낽 +낽 +낽 +낽 + +낾 +낾 +낾 +낾 +낾 + +낿 +낿 +낿 +낿 +낿 + +냀 +냀 +냀 +냀 +냀 + +냁 +냁 +냁 +냁 +냁 + +냂 +냂 +냂 +냂 +냂 + +냃 +냃 +냃 +냃 +냃 + +냄 +냄 +냄 +냄 +냄 + +냅 +냅 +냅 +냅 +냅 + +냆 +냆 +냆 +냆 +냆 + +냇 +냇 +냇 +냇 +냇 + +냈 +냈 +냈 +냈 +냈 + +냉 +냉 +냉 +냉 +냉 + +냊 +냊 +냊 +냊 +냊 + +냋 +냋 +냋 +냋 +냋 + +냌 +냌 +냌 +냌 +냌 + +냍 +냍 +냍 +냍 +냍 + +냎 +냎 +냎 +냎 +냎 + +냏 +냏 +냏 +냏 +냏 + +냐 +냐 +냐 +냐 +냐 + +냑 +냑 +냑 +냑 +냑 + +냒 +냒 +냒 +냒 +냒 + +냓 +냓 +냓 +냓 +냓 + +냔 +냔 +냔 +냔 +냔 + +냕 +냕 +냕 +냕 +냕 + +냖 +냖 +냖 +냖 +냖 + +냗 +냗 +냗 +냗 +냗 + +냘 +냘 +냘 +냘 +냘 + +냙 +냙 +냙 +냙 +냙 + +냚 +냚 +냚 +냚 +냚 + +냛 +냛 +냛 +냛 +냛 + +냜 +냜 +냜 +냜 +냜 + +냝 +냝 +냝 +냝 +냝 + +냞 +냞 +냞 +냞 +냞 + +냟 +냟 +냟 +냟 +냟 + +냠 +냠 +냠 +냠 +냠 + +냡 +냡 +냡 +냡 +냡 + +냢 +냢 +냢 +냢 +냢 + +냣 +냣 +냣 +냣 +냣 + +냤 +냤 +냤 +냤 +냤 + +냥 +냥 +냥 +냥 +냥 + +냦 +냦 +냦 +냦 +냦 + +냧 +냧 +냧 +냧 +냧 + +냨 +냨 +냨 +냨 +냨 + +냩 +냩 +냩 +냩 +냩 + +냪 +냪 +냪 +냪 +냪 + +냫 +냫 +냫 +냫 +냫 + +냬 +냬 +냬 +냬 +냬 + +냭 +냭 +냭 +냭 +냭 + +냮 +냮 +냮 +냮 +냮 + +냯 +냯 +냯 +냯 +냯 + +냰 +냰 +냰 +냰 +냰 + +냱 +냱 +냱 +냱 +냱 + +냲 +냲 +냲 +냲 +냲 + +냳 +냳 +냳 +냳 +냳 + +냴 +냴 +냴 +냴 +냴 + +냵 +냵 +냵 +냵 +냵 + +냶 +냶 +냶 +냶 +냶 + +냷 +냷 +냷 +냷 +냷 + +냸 +냸 +냸 +냸 +냸 + +냹 +냹 +냹 +냹 +냹 + +냺 +냺 +냺 +냺 +냺 + +냻 +냻 +냻 +냻 +냻 + +냼 +냼 +냼 +냼 +냼 + +냽 +냽 +냽 +냽 +냽 + +냾 +냾 +냾 +냾 +냾 + +냿 +냿 +냿 +냿 +냿 + +넀 +넀 +넀 +넀 +넀 + +넁 +넁 +넁 +넁 +넁 + +넂 +넂 +넂 +넂 +넂 + +넃 +넃 +넃 +넃 +넃 + +넄 +넄 +넄 +넄 +넄 + +넅 +넅 +넅 +넅 +넅 + +넆 +넆 +넆 +넆 +넆 + +넇 +넇 +넇 +넇 +넇 + +너 +너 +너 +너 +너 + +넉 +넉 +넉 +넉 +넉 + +넊 +넊 +넊 +넊 +넊 + +넋 +넋 +넋 +넋 +넋 + +넌 +넌 +넌 +넌 +넌 + +넍 +넍 +넍 +넍 +넍 + +넎 +넎 +넎 +넎 +넎 + +넏 +넏 +넏 +넏 +넏 + +널 +널 +널 +널 +널 + +넑 +넑 +넑 +넑 +넑 + +넒 +넒 +넒 +넒 +넒 + +넓 +넓 +넓 +넓 +넓 + +넔 +넔 +넔 +넔 +넔 + +넕 +넕 +넕 +넕 +넕 + +넖 +넖 +넖 +넖 +넖 + +넗 +넗 +넗 +넗 +넗 + +넘 +넘 +넘 +넘 +넘 + +넙 +넙 +넙 +넙 +넙 + +넚 +넚 +넚 +넚 +넚 + +넛 +넛 +넛 +넛 +넛 + +넜 +넜 +넜 +넜 +넜 + +넝 +넝 +넝 +넝 +넝 + +넞 +넞 +넞 +넞 +넞 + +넟 +넟 +넟 +넟 +넟 + +넠 +넠 +넠 +넠 +넠 + +넡 +넡 +넡 +넡 +넡 + +넢 +넢 +넢 +넢 +넢 + +넣 +넣 +넣 +넣 +넣 + +네 +네 +네 +네 +네 + +넥 +넥 +넥 +넥 +넥 + +넦 +넦 +넦 +넦 +넦 + +넧 +넧 +넧 +넧 +넧 + +넨 +넨 +넨 +넨 +넨 + +넩 +넩 +넩 +넩 +넩 + +넪 +넪 +넪 +넪 +넪 + +넫 +넫 +넫 +넫 +넫 + +넬 +넬 +넬 +넬 +넬 + +넭 +넭 +넭 +넭 +넭 + +넮 +넮 +넮 +넮 +넮 + +넯 +넯 +넯 +넯 +넯 + +넰 +넰 +넰 +넰 +넰 + +넱 +넱 +넱 +넱 +넱 + +넲 +넲 +넲 +넲 +넲 + +넳 +넳 +넳 +넳 +넳 + +넴 +넴 +넴 +넴 +넴 + +넵 +넵 +넵 +넵 +넵 + +넶 +넶 +넶 +넶 +넶 + +넷 +넷 +넷 +넷 +넷 + +넸 +넸 +넸 +넸 +넸 + +넹 +넹 +넹 +넹 +넹 + +넺 +넺 +넺 +넺 +넺 + +넻 +넻 +넻 +넻 +넻 + +넼 +넼 +넼 +넼 +넼 + +넽 +넽 +넽 +넽 +넽 + +넾 +넾 +넾 +넾 +넾 + +넿 +넿 +넿 +넿 +넿 + +녀 +녀 +녀 +녀 +녀 + +녁 +녁 +녁 +녁 +녁 + +녂 +녂 +녂 +녂 +녂 + +녃 +녃 +녃 +녃 +녃 + +년 +년 +년 +년 +년 + +녅 +녅 +녅 +녅 +녅 + +녆 +녆 +녆 +녆 +녆 + +녇 +녇 +녇 +녇 +녇 + +녈 +녈 +녈 +녈 +녈 + +녉 +녉 +녉 +녉 +녉 + +녊 +녊 +녊 +녊 +녊 + +녋 +녋 +녋 +녋 +녋 + +녌 +녌 +녌 +녌 +녌 + +녍 +녍 +녍 +녍 +녍 + +녎 +녎 +녎 +녎 +녎 + +녏 +녏 +녏 +녏 +녏 + +념 +념 +념 +념 +념 + +녑 +녑 +녑 +녑 +녑 + +녒 +녒 +녒 +녒 +녒 + +녓 +녓 +녓 +녓 +녓 + +녔 +녔 +녔 +녔 +녔 + +녕 +녕 +녕 +녕 +녕 + +녖 +녖 +녖 +녖 +녖 + +녗 +녗 +녗 +녗 +녗 + +녘 +녘 +녘 +녘 +녘 + +녙 +녙 +녙 +녙 +녙 + +녚 +녚 +녚 +녚 +녚 + +녛 +녛 +녛 +녛 +녛 + +녜 +녜 +녜 +녜 +녜 + +녝 +녝 +녝 +녝 +녝 + +녞 +녞 +녞 +녞 +녞 + +녟 +녟 +녟 +녟 +녟 + +녠 +녠 +녠 +녠 +녠 + +녡 +녡 +녡 +녡 +녡 + +녢 +녢 +녢 +녢 +녢 + +녣 +녣 +녣 +녣 +녣 + +녤 +녤 +녤 +녤 +녤 + +녥 +녥 +녥 +녥 +녥 + +녦 +녦 +녦 +녦 +녦 + +녧 +녧 +녧 +녧 +녧 + +녨 +녨 +녨 +녨 +녨 + +녩 +녩 +녩 +녩 +녩 + +녪 +녪 +녪 +녪 +녪 + +녫 +녫 +녫 +녫 +녫 + +녬 +녬 +녬 +녬 +녬 + +녭 +녭 +녭 +녭 +녭 + +녮 +녮 +녮 +녮 +녮 + +녯 +녯 +녯 +녯 +녯 + +녰 +녰 +녰 +녰 +녰 + +녱 +녱 +녱 +녱 +녱 + +녲 +녲 +녲 +녲 +녲 + +녳 +녳 +녳 +녳 +녳 + +녴 +녴 +녴 +녴 +녴 + +녵 +녵 +녵 +녵 +녵 + +녶 +녶 +녶 +녶 +녶 + +녷 +녷 +녷 +녷 +녷 + +노 +노 +노 +노 +노 + +녹 +녹 +녹 +녹 +녹 + +녺 +녺 +녺 +녺 +녺 + +녻 +녻 +녻 +녻 +녻 + +논 +논 +논 +논 +논 + +녽 +녽 +녽 +녽 +녽 + +녾 +녾 +녾 +녾 +녾 + +녿 +녿 +녿 +녿 +녿 + +놀 +놀 +놀 +놀 +놀 + +놁 +놁 +놁 +놁 +놁 + +놂 +놂 +놂 +놂 +놂 + +놃 +놃 +놃 +놃 +놃 + +놄 +놄 +놄 +놄 +놄 + +놅 +놅 +놅 +놅 +놅 + +놆 +놆 +놆 +놆 +놆 + +놇 +놇 +놇 +놇 +놇 + +놈 +놈 +놈 +놈 +놈 + +놉 +놉 +놉 +놉 +놉 + +놊 +놊 +놊 +놊 +놊 + +놋 +놋 +놋 +놋 +놋 + +놌 +놌 +놌 +놌 +놌 + +농 +농 +농 +농 +농 + +놎 +놎 +놎 +놎 +놎 + +놏 +놏 +놏 +놏 +놏 + +놐 +놐 +놐 +놐 +놐 + +놑 +놑 +놑 +놑 +놑 + +높 +높 +높 +높 +높 + +놓 +놓 +놓 +놓 +놓 + +놔 +놔 +놔 +놔 +놔 + +놕 +놕 +놕 +놕 +놕 + +놖 +놖 +놖 +놖 +놖 + +놗 +놗 +놗 +놗 +놗 + +놘 +놘 +놘 +놘 +놘 + +놙 +놙 +놙 +놙 +놙 + +놚 +놚 +놚 +놚 +놚 + +놛 +놛 +놛 +놛 +놛 + +놜 +놜 +놜 +놜 +놜 + +놝 +놝 +놝 +놝 +놝 + +놞 +놞 +놞 +놞 +놞 + +놟 +놟 +놟 +놟 +놟 + +놠 +놠 +놠 +놠 +놠 + +놡 +놡 +놡 +놡 +놡 + +놢 +놢 +놢 +놢 +놢 + +놣 +놣 +놣 +놣 +놣 + +놤 +놤 +놤 +놤 +놤 + +놥 +놥 +놥 +놥 +놥 + +놦 +놦 +놦 +놦 +놦 + +놧 +놧 +놧 +놧 +놧 + +놨 +놨 +놨 +놨 +놨 + +놩 +놩 +놩 +놩 +놩 + +놪 +놪 +놪 +놪 +놪 + +놫 +놫 +놫 +놫 +놫 + +놬 +놬 +놬 +놬 +놬 + +놭 +놭 +놭 +놭 +놭 + +놮 +놮 +놮 +놮 +놮 + +놯 +놯 +놯 +놯 +놯 + +놰 +놰 +놰 +놰 +놰 + +놱 +놱 +놱 +놱 +놱 + +놲 +놲 +놲 +놲 +놲 + +놳 +놳 +놳 +놳 +놳 + +놴 +놴 +놴 +놴 +놴 + +놵 +놵 +놵 +놵 +놵 + +놶 +놶 +놶 +놶 +놶 + +놷 +놷 +놷 +놷 +놷 + +놸 +놸 +놸 +놸 +놸 + +놹 +놹 +놹 +놹 +놹 + +놺 +놺 +놺 +놺 +놺 + +놻 +놻 +놻 +놻 +놻 + +놼 +놼 +놼 +놼 +놼 + +놽 +놽 +놽 +놽 +놽 + +놾 +놾 +놾 +놾 +놾 + +놿 +놿 +놿 +놿 +놿 + +뇀 +뇀 +뇀 +뇀 +뇀 + +뇁 +뇁 +뇁 +뇁 +뇁 + +뇂 +뇂 +뇂 +뇂 +뇂 + +뇃 +뇃 +뇃 +뇃 +뇃 + +뇄 +뇄 +뇄 +뇄 +뇄 + +뇅 +뇅 +뇅 +뇅 +뇅 + +뇆 +뇆 +뇆 +뇆 +뇆 + +뇇 +뇇 +뇇 +뇇 +뇇 + +뇈 +뇈 +뇈 +뇈 +뇈 + +뇉 +뇉 +뇉 +뇉 +뇉 + +뇊 +뇊 +뇊 +뇊 +뇊 + +뇋 +뇋 +뇋 +뇋 +뇋 + +뇌 +뇌 +뇌 +뇌 +뇌 + +뇍 +뇍 +뇍 +뇍 +뇍 + +뇎 +뇎 +뇎 +뇎 +뇎 + +뇏 +뇏 +뇏 +뇏 +뇏 + +뇐 +뇐 +뇐 +뇐 +뇐 + +뇑 +뇑 +뇑 +뇑 +뇑 + +뇒 +뇒 +뇒 +뇒 +뇒 + +뇓 +뇓 +뇓 +뇓 +뇓 + +뇔 +뇔 +뇔 +뇔 +뇔 + +뇕 +뇕 +뇕 +뇕 +뇕 + +뇖 +뇖 +뇖 +뇖 +뇖 + +뇗 +뇗 +뇗 +뇗 +뇗 + +뇘 +뇘 +뇘 +뇘 +뇘 + +뇙 +뇙 +뇙 +뇙 +뇙 + +뇚 +뇚 +뇚 +뇚 +뇚 + +뇛 +뇛 +뇛 +뇛 +뇛 + +뇜 +뇜 +뇜 +뇜 +뇜 + +뇝 +뇝 +뇝 +뇝 +뇝 + +뇞 +뇞 +뇞 +뇞 +뇞 + +뇟 +뇟 +뇟 +뇟 +뇟 + +뇠 +뇠 +뇠 +뇠 +뇠 + +뇡 +뇡 +뇡 +뇡 +뇡 + +뇢 +뇢 +뇢 +뇢 +뇢 + +뇣 +뇣 +뇣 +뇣 +뇣 + +뇤 +뇤 +뇤 +뇤 +뇤 + +뇥 +뇥 +뇥 +뇥 +뇥 + +뇦 +뇦 +뇦 +뇦 +뇦 + +뇧 +뇧 +뇧 +뇧 +뇧 + +뇨 +뇨 +뇨 +뇨 +뇨 + +뇩 +뇩 +뇩 +뇩 +뇩 + +뇪 +뇪 +뇪 +뇪 +뇪 + +뇫 +뇫 +뇫 +뇫 +뇫 + +뇬 +뇬 +뇬 +뇬 +뇬 + +뇭 +뇭 +뇭 +뇭 +뇭 + +뇮 +뇮 +뇮 +뇮 +뇮 + +뇯 +뇯 +뇯 +뇯 +뇯 + +뇰 +뇰 +뇰 +뇰 +뇰 + +뇱 +뇱 +뇱 +뇱 +뇱 + +뇲 +뇲 +뇲 +뇲 +뇲 + +뇳 +뇳 +뇳 +뇳 +뇳 + +뇴 +뇴 +뇴 +뇴 +뇴 + +뇵 +뇵 +뇵 +뇵 +뇵 + +뇶 +뇶 +뇶 +뇶 +뇶 + +뇷 +뇷 +뇷 +뇷 +뇷 + +뇸 +뇸 +뇸 +뇸 +뇸 + +뇹 +뇹 +뇹 +뇹 +뇹 + +뇺 +뇺 +뇺 +뇺 +뇺 + +뇻 +뇻 +뇻 +뇻 +뇻 + +뇼 +뇼 +뇼 +뇼 +뇼 + +뇽 +뇽 +뇽 +뇽 +뇽 + +뇾 +뇾 +뇾 +뇾 +뇾 + +뇿 +뇿 +뇿 +뇿 +뇿 + +눀 +눀 +눀 +눀 +눀 + +눁 +눁 +눁 +눁 +눁 + +눂 +눂 +눂 +눂 +눂 + +눃 +눃 +눃 +눃 +눃 + +누 +누 +누 +누 +누 + +눅 +눅 +눅 +눅 +눅 + +눆 +눆 +눆 +눆 +눆 + +눇 +눇 +눇 +눇 +눇 + +눈 +눈 +눈 +눈 +눈 + +눉 +눉 +눉 +눉 +눉 + +눊 +눊 +눊 +눊 +눊 + +눋 +눋 +눋 +눋 +눋 + +눌 +눌 +눌 +눌 +눌 + +눍 +눍 +눍 +눍 +눍 + +눎 +눎 +눎 +눎 +눎 + +눏 +눏 +눏 +눏 +눏 + +눐 +눐 +눐 +눐 +눐 + +눑 +눑 +눑 +눑 +눑 + +눒 +눒 +눒 +눒 +눒 + +눓 +눓 +눓 +눓 +눓 + +눔 +눔 +눔 +눔 +눔 + +눕 +눕 +눕 +눕 +눕 + +눖 +눖 +눖 +눖 +눖 + +눗 +눗 +눗 +눗 +눗 + +눘 +눘 +눘 +눘 +눘 + +눙 +눙 +눙 +눙 +눙 + +눚 +눚 +눚 +눚 +눚 + +눛 +눛 +눛 +눛 +눛 + +눜 +눜 +눜 +눜 +눜 + +눝 +눝 +눝 +눝 +눝 + +눞 +눞 +눞 +눞 +눞 + +눟 +눟 +눟 +눟 +눟 + +눠 +눠 +눠 +눠 +눠 + +눡 +눡 +눡 +눡 +눡 + +눢 +눢 +눢 +눢 +눢 + +눣 +눣 +눣 +눣 +눣 + +눤 +눤 +눤 +눤 +눤 + +눥 +눥 +눥 +눥 +눥 + +눦 +눦 +눦 +눦 +눦 + +눧 +눧 +눧 +눧 +눧 + +눨 +눨 +눨 +눨 +눨 + +눩 +눩 +눩 +눩 +눩 + +눪 +눪 +눪 +눪 +눪 + +눫 +눫 +눫 +눫 +눫 + +눬 +눬 +눬 +눬 +눬 + +눭 +눭 +눭 +눭 +눭 + +눮 +눮 +눮 +눮 +눮 + +눯 +눯 +눯 +눯 +눯 + +눰 +눰 +눰 +눰 +눰 + +눱 +눱 +눱 +눱 +눱 + +눲 +눲 +눲 +눲 +눲 + +눳 +눳 +눳 +눳 +눳 + +눴 +눴 +눴 +눴 +눴 + +눵 +눵 +눵 +눵 +눵 + +눶 +눶 +눶 +눶 +눶 + +눷 +눷 +눷 +눷 +눷 + +눸 +눸 +눸 +눸 +눸 + +눹 +눹 +눹 +눹 +눹 + +눺 +눺 +눺 +눺 +눺 + +눻 +눻 +눻 +눻 +눻 + +눼 +눼 +눼 +눼 +눼 + +눽 +눽 +눽 +눽 +눽 + +눾 +눾 +눾 +눾 +눾 + +눿 +눿 +눿 +눿 +눿 + +뉀 +뉀 +뉀 +뉀 +뉀 + +뉁 +뉁 +뉁 +뉁 +뉁 + +뉂 +뉂 +뉂 +뉂 +뉂 + +뉃 +뉃 +뉃 +뉃 +뉃 + +뉄 +뉄 +뉄 +뉄 +뉄 + +뉅 +뉅 +뉅 +뉅 +뉅 + +뉆 +뉆 +뉆 +뉆 +뉆 + +뉇 +뉇 +뉇 +뉇 +뉇 + +뉈 +뉈 +뉈 +뉈 +뉈 + +뉉 +뉉 +뉉 +뉉 +뉉 + +뉊 +뉊 +뉊 +뉊 +뉊 + +뉋 +뉋 +뉋 +뉋 +뉋 + +뉌 +뉌 +뉌 +뉌 +뉌 + +뉍 +뉍 +뉍 +뉍 +뉍 + +뉎 +뉎 +뉎 +뉎 +뉎 + +뉏 +뉏 +뉏 +뉏 +뉏 + +뉐 +뉐 +뉐 +뉐 +뉐 + +뉑 +뉑 +뉑 +뉑 +뉑 + +뉒 +뉒 +뉒 +뉒 +뉒 + +뉓 +뉓 +뉓 +뉓 +뉓 + +뉔 +뉔 +뉔 +뉔 +뉔 + +뉕 +뉕 +뉕 +뉕 +뉕 + +뉖 +뉖 +뉖 +뉖 +뉖 + +뉗 +뉗 +뉗 +뉗 +뉗 + +뉘 +뉘 +뉘 +뉘 +뉘 + +뉙 +뉙 +뉙 +뉙 +뉙 + +뉚 +뉚 +뉚 +뉚 +뉚 + +뉛 +뉛 +뉛 +뉛 +뉛 + +뉜 +뉜 +뉜 +뉜 +뉜 + +뉝 +뉝 +뉝 +뉝 +뉝 + +뉞 +뉞 +뉞 +뉞 +뉞 + +뉟 +뉟 +뉟 +뉟 +뉟 + +뉠 +뉠 +뉠 +뉠 +뉠 + +뉡 +뉡 +뉡 +뉡 +뉡 + +뉢 +뉢 +뉢 +뉢 +뉢 + +뉣 +뉣 +뉣 +뉣 +뉣 + +뉤 +뉤 +뉤 +뉤 +뉤 + +뉥 +뉥 +뉥 +뉥 +뉥 + +뉦 +뉦 +뉦 +뉦 +뉦 + +뉧 +뉧 +뉧 +뉧 +뉧 + +뉨 +뉨 +뉨 +뉨 +뉨 + +뉩 +뉩 +뉩 +뉩 +뉩 + +뉪 +뉪 +뉪 +뉪 +뉪 + +뉫 +뉫 +뉫 +뉫 +뉫 + +뉬 +뉬 +뉬 +뉬 +뉬 + +뉭 +뉭 +뉭 +뉭 +뉭 + +뉮 +뉮 +뉮 +뉮 +뉮 + +뉯 +뉯 +뉯 +뉯 +뉯 + +뉰 +뉰 +뉰 +뉰 +뉰 + +뉱 +뉱 +뉱 +뉱 +뉱 + +뉲 +뉲 +뉲 +뉲 +뉲 + +뉳 +뉳 +뉳 +뉳 +뉳 + +뉴 +뉴 +뉴 +뉴 +뉴 + +뉵 +뉵 +뉵 +뉵 +뉵 + +뉶 +뉶 +뉶 +뉶 +뉶 + +뉷 +뉷 +뉷 +뉷 +뉷 + +뉸 +뉸 +뉸 +뉸 +뉸 + +뉹 +뉹 +뉹 +뉹 +뉹 + +뉺 +뉺 +뉺 +뉺 +뉺 + +뉻 +뉻 +뉻 +뉻 +뉻 + +뉼 +뉼 +뉼 +뉼 +뉼 + +뉽 +뉽 +뉽 +뉽 +뉽 + +뉾 +뉾 +뉾 +뉾 +뉾 + +뉿 +뉿 +뉿 +뉿 +뉿 + +늀 +늀 +늀 +늀 +늀 + +늁 +늁 +늁 +늁 +늁 + +늂 +늂 +늂 +늂 +늂 + +늃 +늃 +늃 +늃 +늃 + +늄 +늄 +늄 +늄 +늄 + +늅 +늅 +늅 +늅 +늅 + +늆 +늆 +늆 +늆 +늆 + +늇 +늇 +늇 +늇 +늇 + +늈 +늈 +늈 +늈 +늈 + +늉 +늉 +늉 +늉 +늉 + +늊 +늊 +늊 +늊 +늊 + +늋 +늋 +늋 +늋 +늋 + +늌 +늌 +늌 +늌 +늌 + +늍 +늍 +늍 +늍 +늍 + +늎 +늎 +늎 +늎 +늎 + +늏 +늏 +늏 +늏 +늏 + +느 +느 +느 +느 +느 + +늑 +늑 +늑 +늑 +늑 + +늒 +늒 +늒 +늒 +늒 + +늓 +늓 +늓 +늓 +늓 + +는 +는 +는 +는 +는 + +늕 +늕 +늕 +늕 +늕 + +늖 +늖 +늖 +늖 +늖 + +늗 +늗 +늗 +늗 +늗 + +늘 +늘 +늘 +늘 +늘 + +늙 +늙 +늙 +늙 +늙 + +늚 +늚 +늚 +늚 +늚 + +늛 +늛 +늛 +늛 +늛 + +늜 +늜 +늜 +늜 +늜 + +늝 +늝 +늝 +늝 +늝 + +늞 +늞 +늞 +늞 +늞 + +늟 +늟 +늟 +늟 +늟 + +늠 +늠 +늠 +늠 +늠 + +늡 +늡 +늡 +늡 +늡 + +늢 +늢 +늢 +늢 +늢 + +늣 +늣 +늣 +늣 +늣 + +늤 +늤 +늤 +늤 +늤 + +능 +능 +능 +능 +능 + +늦 +늦 +늦 +늦 +늦 + +늧 +늧 +늧 +늧 +늧 + +늨 +늨 +늨 +늨 +늨 + +늩 +늩 +늩 +늩 +늩 + +늪 +늪 +늪 +늪 +늪 + +늫 +늫 +늫 +늫 +늫 + +늬 +늬 +늬 +늬 +늬 + +늭 +늭 +늭 +늭 +늭 + +늮 +늮 +늮 +늮 +늮 + +늯 +늯 +늯 +늯 +늯 + +늰 +늰 +늰 +늰 +늰 + +늱 +늱 +늱 +늱 +늱 + +늲 +늲 +늲 +늲 +늲 + +늳 +늳 +늳 +늳 +늳 + +늴 +늴 +늴 +늴 +늴 + +늵 +늵 +늵 +늵 +늵 + +늶 +늶 +늶 +늶 +늶 + +늷 +늷 +늷 +늷 +늷 + +늸 +늸 +늸 +늸 +늸 + +늹 +늹 +늹 +늹 +늹 + +늺 +늺 +늺 +늺 +늺 + +늻 +늻 +늻 +늻 +늻 + +늼 +늼 +늼 +늼 +늼 + +늽 +늽 +늽 +늽 +늽 + +늾 +늾 +늾 +늾 +늾 + +늿 +늿 +늿 +늿 +늿 + +닀 +닀 +닀 +닀 +닀 + +닁 +닁 +닁 +닁 +닁 + +닂 +닂 +닂 +닂 +닂 + +닃 +닃 +닃 +닃 +닃 + +닄 +닄 +닄 +닄 +닄 + +닅 +닅 +닅 +닅 +닅 + +닆 +닆 +닆 +닆 +닆 + +닇 +닇 +닇 +닇 +닇 + +니 +니 +니 +니 +니 + +닉 +닉 +닉 +닉 +닉 + +닊 +닊 +닊 +닊 +닊 + +닋 +닋 +닋 +닋 +닋 + +닌 +닌 +닌 +닌 +닌 + +닍 +닍 +닍 +닍 +닍 + +닎 +닎 +닎 +닎 +닎 + +닏 +닏 +닏 +닏 +닏 + +닐 +닐 +닐 +닐 +닐 + +닑 +닑 +닑 +닑 +닑 + +닒 +닒 +닒 +닒 +닒 + +닓 +닓 +닓 +닓 +닓 + +닔 +닔 +닔 +닔 +닔 + +닕 +닕 +닕 +닕 +닕 + +닖 +닖 +닖 +닖 +닖 + +닗 +닗 +닗 +닗 +닗 + +님 +님 +님 +님 +님 + +닙 +닙 +닙 +닙 +닙 + +닚 +닚 +닚 +닚 +닚 + +닛 +닛 +닛 +닛 +닛 + +닜 +닜 +닜 +닜 +닜 + +닝 +닝 +닝 +닝 +닝 + +닞 +닞 +닞 +닞 +닞 + +닟 +닟 +닟 +닟 +닟 + +닠 +닠 +닠 +닠 +닠 + +닡 +닡 +닡 +닡 +닡 + +닢 +닢 +닢 +닢 +닢 + +닣 +닣 +닣 +닣 +닣 + +다 +다 +다 +다 +다 + +닥 +닥 +닥 +닥 +닥 + +닦 +닦 +닦 +닦 +닦 + +닧 +닧 +닧 +닧 +닧 + +단 +단 +단 +단 +단 + +닩 +닩 +닩 +닩 +닩 + +닪 +닪 +닪 +닪 +닪 + +닫 +닫 +닫 +닫 +닫 + +달 +달 +달 +달 +달 + +닭 +닭 +닭 +닭 +닭 + +닮 +닮 +닮 +닮 +닮 + +닯 +닯 +닯 +닯 +닯 + +닰 +닰 +닰 +닰 +닰 + +닱 +닱 +닱 +닱 +닱 + +닲 +닲 +닲 +닲 +닲 + +닳 +닳 +닳 +닳 +닳 + +담 +담 +담 +담 +담 + +답 +답 +답 +답 +답 + +닶 +닶 +닶 +닶 +닶 + +닷 +닷 +닷 +닷 +닷 + +닸 +닸 +닸 +닸 +닸 + +당 +당 +당 +당 +당 + +닺 +닺 +닺 +닺 +닺 + +닻 +닻 +닻 +닻 +닻 + +닼 +닼 +닼 +닼 +닼 + +닽 +닽 +닽 +닽 +닽 + +닾 +닾 +닾 +닾 +닾 + +닿 +닿 +닿 +닿 +닿 + +대 +대 +대 +대 +대 + +댁 +댁 +댁 +댁 +댁 + +댂 +댂 +댂 +댂 +댂 + +댃 +댃 +댃 +댃 +댃 + +댄 +댄 +댄 +댄 +댄 + +댅 +댅 +댅 +댅 +댅 + +댆 +댆 +댆 +댆 +댆 + +댇 +댇 +댇 +댇 +댇 + +댈 +댈 +댈 +댈 +댈 + +댉 +댉 +댉 +댉 +댉 + +댊 +댊 +댊 +댊 +댊 + +댋 +댋 +댋 +댋 +댋 + +댌 +댌 +댌 +댌 +댌 + +댍 +댍 +댍 +댍 +댍 + +댎 +댎 +댎 +댎 +댎 + +댏 +댏 +댏 +댏 +댏 + +댐 +댐 +댐 +댐 +댐 + +댑 +댑 +댑 +댑 +댑 + +댒 +댒 +댒 +댒 +댒 + +댓 +댓 +댓 +댓 +댓 + +댔 +댔 +댔 +댔 +댔 + +댕 +댕 +댕 +댕 +댕 + +댖 +댖 +댖 +댖 +댖 + +댗 +댗 +댗 +댗 +댗 + +댘 +댘 +댘 +댘 +댘 + +댙 +댙 +댙 +댙 +댙 + +댚 +댚 +댚 +댚 +댚 + +댛 +댛 +댛 +댛 +댛 + +댜 +댜 +댜 +댜 +댜 + +댝 +댝 +댝 +댝 +댝 + +댞 +댞 +댞 +댞 +댞 + +댟 +댟 +댟 +댟 +댟 + +댠 +댠 +댠 +댠 +댠 + +댡 +댡 +댡 +댡 +댡 + +댢 +댢 +댢 +댢 +댢 + +댣 +댣 +댣 +댣 +댣 + +댤 +댤 +댤 +댤 +댤 + +댥 +댥 +댥 +댥 +댥 + +댦 +댦 +댦 +댦 +댦 + +댧 +댧 +댧 +댧 +댧 + +댨 +댨 +댨 +댨 +댨 + +댩 +댩 +댩 +댩 +댩 + +댪 +댪 +댪 +댪 +댪 + +댫 +댫 +댫 +댫 +댫 + +댬 +댬 +댬 +댬 +댬 + +댭 +댭 +댭 +댭 +댭 + +댮 +댮 +댮 +댮 +댮 + +댯 +댯 +댯 +댯 +댯 + +댰 +댰 +댰 +댰 +댰 + +댱 +댱 +댱 +댱 +댱 + +댲 +댲 +댲 +댲 +댲 + +댳 +댳 +댳 +댳 +댳 + +댴 +댴 +댴 +댴 +댴 + +댵 +댵 +댵 +댵 +댵 + +댶 +댶 +댶 +댶 +댶 + +댷 +댷 +댷 +댷 +댷 + +댸 +댸 +댸 +댸 +댸 + +댹 +댹 +댹 +댹 +댹 + +댺 +댺 +댺 +댺 +댺 + +댻 +댻 +댻 +댻 +댻 + +댼 +댼 +댼 +댼 +댼 + +댽 +댽 +댽 +댽 +댽 + +댾 +댾 +댾 +댾 +댾 + +댿 +댿 +댿 +댿 +댿 + +덀 +덀 +덀 +덀 +덀 + +덁 +덁 +덁 +덁 +덁 + +덂 +덂 +덂 +덂 +덂 + +덃 +덃 +덃 +덃 +덃 + +덄 +덄 +덄 +덄 +덄 + +덅 +덅 +덅 +덅 +덅 + +덆 +덆 +덆 +덆 +덆 + +덇 +덇 +덇 +덇 +덇 + +덈 +덈 +덈 +덈 +덈 + +덉 +덉 +덉 +덉 +덉 + +덊 +덊 +덊 +덊 +덊 + +덋 +덋 +덋 +덋 +덋 + +덌 +덌 +덌 +덌 +덌 + +덍 +덍 +덍 +덍 +덍 + +덎 +덎 +덎 +덎 +덎 + +덏 +덏 +덏 +덏 +덏 + +덐 +덐 +덐 +덐 +덐 + +덑 +덑 +덑 +덑 +덑 + +덒 +덒 +덒 +덒 +덒 + +덓 +덓 +덓 +덓 +덓 + +더 +더 +더 +더 +더 + +덕 +덕 +덕 +덕 +덕 + +덖 +덖 +덖 +덖 +덖 + +덗 +덗 +덗 +덗 +덗 + +던 +던 +던 +던 +던 + +덙 +덙 +덙 +덙 +덙 + +덚 +덚 +덚 +덚 +덚 + +덛 +덛 +덛 +덛 +덛 + +덜 +덜 +덜 +덜 +덜 + +덝 +덝 +덝 +덝 +덝 + +덞 +덞 +덞 +덞 +덞 + +덟 +덟 +덟 +덟 +덟 + +덠 +덠 +덠 +덠 +덠 + +덡 +덡 +덡 +덡 +덡 + +덢 +덢 +덢 +덢 +덢 + +덣 +덣 +덣 +덣 +덣 + +덤 +덤 +덤 +덤 +덤 + +덥 +덥 +덥 +덥 +덥 + +덦 +덦 +덦 +덦 +덦 + +덧 +덧 +덧 +덧 +덧 + +덨 +덨 +덨 +덨 +덨 + +덩 +덩 +덩 +덩 +덩 + +덪 +덪 +덪 +덪 +덪 + +덫 +덫 +덫 +덫 +덫 + +덬 +덬 +덬 +덬 +덬 + +덭 +덭 +덭 +덭 +덭 + +덮 +덮 +덮 +덮 +덮 + +덯 +덯 +덯 +덯 +덯 + +데 +데 +데 +데 +데 + +덱 +덱 +덱 +덱 +덱 + +덲 +덲 +덲 +덲 +덲 + +덳 +덳 +덳 +덳 +덳 + +덴 +덴 +덴 +덴 +덴 + +덵 +덵 +덵 +덵 +덵 + +덶 +덶 +덶 +덶 +덶 + +덷 +덷 +덷 +덷 +덷 + +델 +델 +델 +델 +델 + +덹 +덹 +덹 +덹 +덹 + +덺 +덺 +덺 +덺 +덺 + +덻 +덻 +덻 +덻 +덻 + +덼 +덼 +덼 +덼 +덼 + +덽 +덽 +덽 +덽 +덽 + +덾 +덾 +덾 +덾 +덾 + +덿 +덿 +덿 +덿 +덿 + +뎀 +뎀 +뎀 +뎀 +뎀 + +뎁 +뎁 +뎁 +뎁 +뎁 + +뎂 +뎂 +뎂 +뎂 +뎂 + +뎃 +뎃 +뎃 +뎃 +뎃 + +뎄 +뎄 +뎄 +뎄 +뎄 + +뎅 +뎅 +뎅 +뎅 +뎅 + +뎆 +뎆 +뎆 +뎆 +뎆 + +뎇 +뎇 +뎇 +뎇 +뎇 + +뎈 +뎈 +뎈 +뎈 +뎈 + +뎉 +뎉 +뎉 +뎉 +뎉 + +뎊 +뎊 +뎊 +뎊 +뎊 + +뎋 +뎋 +뎋 +뎋 +뎋 + +뎌 +뎌 +뎌 +뎌 +뎌 + +뎍 +뎍 +뎍 +뎍 +뎍 + +뎎 +뎎 +뎎 +뎎 +뎎 + +뎏 +뎏 +뎏 +뎏 +뎏 + +뎐 +뎐 +뎐 +뎐 +뎐 + +뎑 +뎑 +뎑 +뎑 +뎑 + +뎒 +뎒 +뎒 +뎒 +뎒 + +뎓 +뎓 +뎓 +뎓 +뎓 + +뎔 +뎔 +뎔 +뎔 +뎔 + +뎕 +뎕 +뎕 +뎕 +뎕 + +뎖 +뎖 +뎖 +뎖 +뎖 + +뎗 +뎗 +뎗 +뎗 +뎗 + +뎘 +뎘 +뎘 +뎘 +뎘 + +뎙 +뎙 +뎙 +뎙 +뎙 + +뎚 +뎚 +뎚 +뎚 +뎚 + +뎛 +뎛 +뎛 +뎛 +뎛 + +뎜 +뎜 +뎜 +뎜 +뎜 + +뎝 +뎝 +뎝 +뎝 +뎝 + +뎞 +뎞 +뎞 +뎞 +뎞 + +뎟 +뎟 +뎟 +뎟 +뎟 + +뎠 +뎠 +뎠 +뎠 +뎠 + +뎡 +뎡 +뎡 +뎡 +뎡 + +뎢 +뎢 +뎢 +뎢 +뎢 + +뎣 +뎣 +뎣 +뎣 +뎣 + +뎤 +뎤 +뎤 +뎤 +뎤 + +뎥 +뎥 +뎥 +뎥 +뎥 + +뎦 +뎦 +뎦 +뎦 +뎦 + +뎧 +뎧 +뎧 +뎧 +뎧 + +뎨 +뎨 +뎨 +뎨 +뎨 + +뎩 +뎩 +뎩 +뎩 +뎩 + +뎪 +뎪 +뎪 +뎪 +뎪 + +뎫 +뎫 +뎫 +뎫 +뎫 + +뎬 +뎬 +뎬 +뎬 +뎬 + +뎭 +뎭 +뎭 +뎭 +뎭 + +뎮 +뎮 +뎮 +뎮 +뎮 + +뎯 +뎯 +뎯 +뎯 +뎯 + +뎰 +뎰 +뎰 +뎰 +뎰 + +뎱 +뎱 +뎱 +뎱 +뎱 + +뎲 +뎲 +뎲 +뎲 +뎲 + +뎳 +뎳 +뎳 +뎳 +뎳 + +뎴 +뎴 +뎴 +뎴 +뎴 + +뎵 +뎵 +뎵 +뎵 +뎵 + +뎶 +뎶 +뎶 +뎶 +뎶 + +뎷 +뎷 +뎷 +뎷 +뎷 + +뎸 +뎸 +뎸 +뎸 +뎸 + +뎹 +뎹 +뎹 +뎹 +뎹 + +뎺 +뎺 +뎺 +뎺 +뎺 + +뎻 +뎻 +뎻 +뎻 +뎻 + +뎼 +뎼 +뎼 +뎼 +뎼 + +뎽 +뎽 +뎽 +뎽 +뎽 + +뎾 +뎾 +뎾 +뎾 +뎾 + +뎿 +뎿 +뎿 +뎿 +뎿 + +돀 +돀 +돀 +돀 +돀 + +돁 +돁 +돁 +돁 +돁 + +돂 +돂 +돂 +돂 +돂 + +돃 +돃 +돃 +돃 +돃 + +도 +도 +도 +도 +도 + +독 +독 +독 +독 +독 + +돆 +돆 +돆 +돆 +돆 + +돇 +돇 +돇 +돇 +돇 + +돈 +돈 +돈 +돈 +돈 + +돉 +돉 +돉 +돉 +돉 + +돊 +돊 +돊 +돊 +돊 + +돋 +돋 +돋 +돋 +돋 + +돌 +돌 +돌 +돌 +돌 + +돍 +돍 +돍 +돍 +돍 + +돎 +돎 +돎 +돎 +돎 + +돏 +돏 +돏 +돏 +돏 + +돐 +돐 +돐 +돐 +돐 + +돑 +돑 +돑 +돑 +돑 + +돒 +돒 +돒 +돒 +돒 + +돓 +돓 +돓 +돓 +돓 + +돔 +돔 +돔 +돔 +돔 + +돕 +돕 +돕 +돕 +돕 + +돖 +돖 +돖 +돖 +돖 + +돗 +돗 +돗 +돗 +돗 + +돘 +돘 +돘 +돘 +돘 + +동 +동 +동 +동 +동 + +돚 +돚 +돚 +돚 +돚 + +돛 +돛 +돛 +돛 +돛 + +돜 +돜 +돜 +돜 +돜 + +돝 +돝 +돝 +돝 +돝 + +돞 +돞 +돞 +돞 +돞 + +돟 +돟 +돟 +돟 +돟 + +돠 +돠 +돠 +돠 +돠 + +돡 +돡 +돡 +돡 +돡 + +돢 +돢 +돢 +돢 +돢 + +돣 +돣 +돣 +돣 +돣 + +돤 +돤 +돤 +돤 +돤 + +돥 +돥 +돥 +돥 +돥 + +돦 +돦 +돦 +돦 +돦 + +돧 +돧 +돧 +돧 +돧 + +돨 +돨 +돨 +돨 +돨 + +돩 +돩 +돩 +돩 +돩 + +돪 +돪 +돪 +돪 +돪 + +돫 +돫 +돫 +돫 +돫 + +돬 +돬 +돬 +돬 +돬 + +돭 +돭 +돭 +돭 +돭 + +돮 +돮 +돮 +돮 +돮 + +돯 +돯 +돯 +돯 +돯 + +돰 +돰 +돰 +돰 +돰 + +돱 +돱 +돱 +돱 +돱 + +돲 +돲 +돲 +돲 +돲 + +돳 +돳 +돳 +돳 +돳 + +돴 +돴 +돴 +돴 +돴 + +돵 +돵 +돵 +돵 +돵 + +돶 +돶 +돶 +돶 +돶 + +돷 +돷 +돷 +돷 +돷 + +돸 +돸 +돸 +돸 +돸 + +돹 +돹 +돹 +돹 +돹 + +돺 +돺 +돺 +돺 +돺 + +돻 +돻 +돻 +돻 +돻 + +돼 +돼 +돼 +돼 +돼 + +돽 +돽 +돽 +돽 +돽 + +돾 +돾 +돾 +돾 +돾 + +돿 +돿 +돿 +돿 +돿 + +됀 +됀 +됀 +됀 +됀 + +됁 +됁 +됁 +됁 +됁 + +됂 +됂 +됂 +됂 +됂 + +됃 +됃 +됃 +됃 +됃 + +됄 +됄 +됄 +됄 +됄 + +됅 +됅 +됅 +됅 +됅 + +됆 +됆 +됆 +됆 +됆 + +됇 +됇 +됇 +됇 +됇 + +됈 +됈 +됈 +됈 +됈 + +됉 +됉 +됉 +됉 +됉 + +됊 +됊 +됊 +됊 +됊 + +됋 +됋 +됋 +됋 +됋 + +됌 +됌 +됌 +됌 +됌 + +됍 +됍 +됍 +됍 +됍 + +됎 +됎 +됎 +됎 +됎 + +됏 +됏 +됏 +됏 +됏 + +됐 +됐 +됐 +됐 +됐 + +됑 +됑 +됑 +됑 +됑 + +됒 +됒 +됒 +됒 +됒 + +됓 +됓 +됓 +됓 +됓 + +됔 +됔 +됔 +됔 +됔 + +됕 +됕 +됕 +됕 +됕 + +됖 +됖 +됖 +됖 +됖 + +됗 +됗 +됗 +됗 +됗 + +되 +되 +되 +되 +되 + +됙 +됙 +됙 +됙 +됙 + +됚 +됚 +됚 +됚 +됚 + +됛 +됛 +됛 +됛 +됛 + +된 +된 +된 +된 +된 + +됝 +됝 +됝 +됝 +됝 + +됞 +됞 +됞 +됞 +됞 + +됟 +됟 +됟 +됟 +됟 + +될 +될 +될 +될 +될 + +됡 +됡 +됡 +됡 +됡 + +됢 +됢 +됢 +됢 +됢 + +됣 +됣 +됣 +됣 +됣 + +됤 +됤 +됤 +됤 +됤 + +됥 +됥 +됥 +됥 +됥 + +됦 +됦 +됦 +됦 +됦 + +됧 +됧 +됧 +됧 +됧 + +됨 +됨 +됨 +됨 +됨 + +됩 +됩 +됩 +됩 +됩 + +됪 +됪 +됪 +됪 +됪 + +됫 +됫 +됫 +됫 +됫 + +됬 +됬 +됬 +됬 +됬 + +됭 +됭 +됭 +됭 +됭 + +됮 +됮 +됮 +됮 +됮 + +됯 +됯 +됯 +됯 +됯 + +됰 +됰 +됰 +됰 +됰 + +됱 +됱 +됱 +됱 +됱 + +됲 +됲 +됲 +됲 +됲 + +됳 +됳 +됳 +됳 +됳 + +됴 +됴 +됴 +됴 +됴 + +됵 +됵 +됵 +됵 +됵 + +됶 +됶 +됶 +됶 +됶 + +됷 +됷 +됷 +됷 +됷 + +됸 +됸 +됸 +됸 +됸 + +됹 +됹 +됹 +됹 +됹 + +됺 +됺 +됺 +됺 +됺 + +됻 +됻 +됻 +됻 +됻 + +됼 +됼 +됼 +됼 +됼 + +됽 +됽 +됽 +됽 +됽 + +됾 +됾 +됾 +됾 +됾 + +됿 +됿 +됿 +됿 +됿 + +둀 +둀 +둀 +둀 +둀 + +둁 +둁 +둁 +둁 +둁 + +둂 +둂 +둂 +둂 +둂 + +둃 +둃 +둃 +둃 +둃 + +둄 +둄 +둄 +둄 +둄 + +둅 +둅 +둅 +둅 +둅 + +둆 +둆 +둆 +둆 +둆 + +둇 +둇 +둇 +둇 +둇 + +둈 +둈 +둈 +둈 +둈 + +둉 +둉 +둉 +둉 +둉 + +둊 +둊 +둊 +둊 +둊 + +둋 +둋 +둋 +둋 +둋 + +둌 +둌 +둌 +둌 +둌 + +둍 +둍 +둍 +둍 +둍 + +둎 +둎 +둎 +둎 +둎 + +둏 +둏 +둏 +둏 +둏 + +두 +두 +두 +두 +두 + +둑 +둑 +둑 +둑 +둑 + +둒 +둒 +둒 +둒 +둒 + +둓 +둓 +둓 +둓 +둓 + +둔 +둔 +둔 +둔 +둔 + +둕 +둕 +둕 +둕 +둕 + +둖 +둖 +둖 +둖 +둖 + +둗 +둗 +둗 +둗 +둗 + +둘 +둘 +둘 +둘 +둘 + +둙 +둙 +둙 +둙 +둙 + +둚 +둚 +둚 +둚 +둚 + +둛 +둛 +둛 +둛 +둛 + +둜 +둜 +둜 +둜 +둜 + +둝 +둝 +둝 +둝 +둝 + +둞 +둞 +둞 +둞 +둞 + +둟 +둟 +둟 +둟 +둟 + +둠 +둠 +둠 +둠 +둠 + +둡 +둡 +둡 +둡 +둡 + +둢 +둢 +둢 +둢 +둢 + +둣 +둣 +둣 +둣 +둣 + +둤 +둤 +둤 +둤 +둤 + +둥 +둥 +둥 +둥 +둥 + +둦 +둦 +둦 +둦 +둦 + +둧 +둧 +둧 +둧 +둧 + +둨 +둨 +둨 +둨 +둨 + +둩 +둩 +둩 +둩 +둩 + +둪 +둪 +둪 +둪 +둪 + +둫 +둫 +둫 +둫 +둫 + +둬 +둬 +둬 +둬 +둬 + +둭 +둭 +둭 +둭 +둭 + +둮 +둮 +둮 +둮 +둮 + +둯 +둯 +둯 +둯 +둯 + +둰 +둰 +둰 +둰 +둰 + +둱 +둱 +둱 +둱 +둱 + +둲 +둲 +둲 +둲 +둲 + +둳 +둳 +둳 +둳 +둳 + +둴 +둴 +둴 +둴 +둴 + +둵 +둵 +둵 +둵 +둵 + +둶 +둶 +둶 +둶 +둶 + +둷 +둷 +둷 +둷 +둷 + +둸 +둸 +둸 +둸 +둸 + +둹 +둹 +둹 +둹 +둹 + +둺 +둺 +둺 +둺 +둺 + +둻 +둻 +둻 +둻 +둻 + +둼 +둼 +둼 +둼 +둼 + +둽 +둽 +둽 +둽 +둽 + +둾 +둾 +둾 +둾 +둾 + +둿 +둿 +둿 +둿 +둿 + +뒀 +뒀 +뒀 +뒀 +뒀 + +뒁 +뒁 +뒁 +뒁 +뒁 + +뒂 +뒂 +뒂 +뒂 +뒂 + +뒃 +뒃 +뒃 +뒃 +뒃 + +뒄 +뒄 +뒄 +뒄 +뒄 + +뒅 +뒅 +뒅 +뒅 +뒅 + +뒆 +뒆 +뒆 +뒆 +뒆 + +뒇 +뒇 +뒇 +뒇 +뒇 + +뒈 +뒈 +뒈 +뒈 +뒈 + +뒉 +뒉 +뒉 +뒉 +뒉 + +뒊 +뒊 +뒊 +뒊 +뒊 + +뒋 +뒋 +뒋 +뒋 +뒋 + +뒌 +뒌 +뒌 +뒌 +뒌 + +뒍 +뒍 +뒍 +뒍 +뒍 + +뒎 +뒎 +뒎 +뒎 +뒎 + +뒏 +뒏 +뒏 +뒏 +뒏 + +뒐 +뒐 +뒐 +뒐 +뒐 + +뒑 +뒑 +뒑 +뒑 +뒑 + +뒒 +뒒 +뒒 +뒒 +뒒 + +뒓 +뒓 +뒓 +뒓 +뒓 + +뒔 +뒔 +뒔 +뒔 +뒔 + +뒕 +뒕 +뒕 +뒕 +뒕 + +뒖 +뒖 +뒖 +뒖 +뒖 + +뒗 +뒗 +뒗 +뒗 +뒗 + +뒘 +뒘 +뒘 +뒘 +뒘 + +뒙 +뒙 +뒙 +뒙 +뒙 + +뒚 +뒚 +뒚 +뒚 +뒚 + +뒛 +뒛 +뒛 +뒛 +뒛 + +뒜 +뒜 +뒜 +뒜 +뒜 + +뒝 +뒝 +뒝 +뒝 +뒝 + +뒞 +뒞 +뒞 +뒞 +뒞 + +뒟 +뒟 +뒟 +뒟 +뒟 + +뒠 +뒠 +뒠 +뒠 +뒠 + +뒡 +뒡 +뒡 +뒡 +뒡 + +뒢 +뒢 +뒢 +뒢 +뒢 + +뒣 +뒣 +뒣 +뒣 +뒣 + +뒤 +뒤 +뒤 +뒤 +뒤 + +뒥 +뒥 +뒥 +뒥 +뒥 + +뒦 +뒦 +뒦 +뒦 +뒦 + +뒧 +뒧 +뒧 +뒧 +뒧 + +뒨 +뒨 +뒨 +뒨 +뒨 + +뒩 +뒩 +뒩 +뒩 +뒩 + +뒪 +뒪 +뒪 +뒪 +뒪 + +뒫 +뒫 +뒫 +뒫 +뒫 + +뒬 +뒬 +뒬 +뒬 +뒬 + +뒭 +뒭 +뒭 +뒭 +뒭 + +뒮 +뒮 +뒮 +뒮 +뒮 + +뒯 +뒯 +뒯 +뒯 +뒯 + +뒰 +뒰 +뒰 +뒰 +뒰 + +뒱 +뒱 +뒱 +뒱 +뒱 + +뒲 +뒲 +뒲 +뒲 +뒲 + +뒳 +뒳 +뒳 +뒳 +뒳 + +뒴 +뒴 +뒴 +뒴 +뒴 + +뒵 +뒵 +뒵 +뒵 +뒵 + +뒶 +뒶 +뒶 +뒶 +뒶 + +뒷 +뒷 +뒷 +뒷 +뒷 + +뒸 +뒸 +뒸 +뒸 +뒸 + +뒹 +뒹 +뒹 +뒹 +뒹 + +뒺 +뒺 +뒺 +뒺 +뒺 + +뒻 +뒻 +뒻 +뒻 +뒻 + +뒼 +뒼 +뒼 +뒼 +뒼 + +뒽 +뒽 +뒽 +뒽 +뒽 + +뒾 +뒾 +뒾 +뒾 +뒾 + +뒿 +뒿 +뒿 +뒿 +뒿 + +듀 +듀 +듀 +듀 +듀 + +듁 +듁 +듁 +듁 +듁 + +듂 +듂 +듂 +듂 +듂 + +듃 +듃 +듃 +듃 +듃 + +듄 +듄 +듄 +듄 +듄 + +듅 +듅 +듅 +듅 +듅 + +듆 +듆 +듆 +듆 +듆 + +듇 +듇 +듇 +듇 +듇 + +듈 +듈 +듈 +듈 +듈 + +듉 +듉 +듉 +듉 +듉 + +듊 +듊 +듊 +듊 +듊 + +듋 +듋 +듋 +듋 +듋 + +듌 +듌 +듌 +듌 +듌 + +듍 +듍 +듍 +듍 +듍 + +듎 +듎 +듎 +듎 +듎 + +듏 +듏 +듏 +듏 +듏 + +듐 +듐 +듐 +듐 +듐 + +듑 +듑 +듑 +듑 +듑 + +듒 +듒 +듒 +듒 +듒 + +듓 +듓 +듓 +듓 +듓 + +듔 +듔 +듔 +듔 +듔 + +듕 +듕 +듕 +듕 +듕 + +듖 +듖 +듖 +듖 +듖 + +듗 +듗 +듗 +듗 +듗 + +듘 +듘 +듘 +듘 +듘 + +듙 +듙 +듙 +듙 +듙 + +듚 +듚 +듚 +듚 +듚 + +듛 +듛 +듛 +듛 +듛 + +드 +드 +드 +드 +드 + +득 +득 +득 +득 +득 + +듞 +듞 +듞 +듞 +듞 + +듟 +듟 +듟 +듟 +듟 + +든 +든 +든 +든 +든 + +듡 +듡 +듡 +듡 +듡 + +듢 +듢 +듢 +듢 +듢 + +듣 +듣 +듣 +듣 +듣 + +들 +들 +들 +들 +들 + +듥 +듥 +듥 +듥 +듥 + +듦 +듦 +듦 +듦 +듦 + +듧 +듧 +듧 +듧 +듧 + +듨 +듨 +듨 +듨 +듨 + +듩 +듩 +듩 +듩 +듩 + +듪 +듪 +듪 +듪 +듪 + +듫 +듫 +듫 +듫 +듫 + +듬 +듬 +듬 +듬 +듬 + +듭 +듭 +듭 +듭 +듭 + +듮 +듮 +듮 +듮 +듮 + +듯 +듯 +듯 +듯 +듯 + +듰 +듰 +듰 +듰 +듰 + +등 +등 +등 +등 +등 + +듲 +듲 +듲 +듲 +듲 + +듳 +듳 +듳 +듳 +듳 + +듴 +듴 +듴 +듴 +듴 + +듵 +듵 +듵 +듵 +듵 + +듶 +듶 +듶 +듶 +듶 + +듷 +듷 +듷 +듷 +듷 + +듸 +듸 +듸 +듸 +듸 + +듹 +듹 +듹 +듹 +듹 + +듺 +듺 +듺 +듺 +듺 + +듻 +듻 +듻 +듻 +듻 + +듼 +듼 +듼 +듼 +듼 + +듽 +듽 +듽 +듽 +듽 + +듾 +듾 +듾 +듾 +듾 + +듿 +듿 +듿 +듿 +듿 + +딀 +딀 +딀 +딀 +딀 + +딁 +딁 +딁 +딁 +딁 + +딂 +딂 +딂 +딂 +딂 + +딃 +딃 +딃 +딃 +딃 + +딄 +딄 +딄 +딄 +딄 + +딅 +딅 +딅 +딅 +딅 + +딆 +딆 +딆 +딆 +딆 + +딇 +딇 +딇 +딇 +딇 + +딈 +딈 +딈 +딈 +딈 + +딉 +딉 +딉 +딉 +딉 + +딊 +딊 +딊 +딊 +딊 + +딋 +딋 +딋 +딋 +딋 + +딌 +딌 +딌 +딌 +딌 + +딍 +딍 +딍 +딍 +딍 + +딎 +딎 +딎 +딎 +딎 + +딏 +딏 +딏 +딏 +딏 + +딐 +딐 +딐 +딐 +딐 + +딑 +딑 +딑 +딑 +딑 + +딒 +딒 +딒 +딒 +딒 + +딓 +딓 +딓 +딓 +딓 + +디 +디 +디 +디 +디 + +딕 +딕 +딕 +딕 +딕 + +딖 +딖 +딖 +딖 +딖 + +딗 +딗 +딗 +딗 +딗 + +딘 +딘 +딘 +딘 +딘 + +딙 +딙 +딙 +딙 +딙 + +딚 +딚 +딚 +딚 +딚 + +딛 +딛 +딛 +딛 +딛 + +딜 +딜 +딜 +딜 +딜 + +딝 +딝 +딝 +딝 +딝 + +딞 +딞 +딞 +딞 +딞 + +딟 +딟 +딟 +딟 +딟 + +딠 +딠 +딠 +딠 +딠 + +딡 +딡 +딡 +딡 +딡 + +딢 +딢 +딢 +딢 +딢 + +딣 +딣 +딣 +딣 +딣 + +딤 +딤 +딤 +딤 +딤 + +딥 +딥 +딥 +딥 +딥 + +딦 +딦 +딦 +딦 +딦 + +딧 +딧 +딧 +딧 +딧 + +딨 +딨 +딨 +딨 +딨 + +딩 +딩 +딩 +딩 +딩 + +딪 +딪 +딪 +딪 +딪 + +딫 +딫 +딫 +딫 +딫 + +딬 +딬 +딬 +딬 +딬 + +딭 +딭 +딭 +딭 +딭 + +딮 +딮 +딮 +딮 +딮 + +딯 +딯 +딯 +딯 +딯 + +따 +따 +따 +따 +따 + +딱 +딱 +딱 +딱 +딱 + +딲 +딲 +딲 +딲 +딲 + +딳 +딳 +딳 +딳 +딳 + +딴 +딴 +딴 +딴 +딴 + +딵 +딵 +딵 +딵 +딵 + +딶 +딶 +딶 +딶 +딶 + +딷 +딷 +딷 +딷 +딷 + +딸 +딸 +딸 +딸 +딸 + +딹 +딹 +딹 +딹 +딹 + +딺 +딺 +딺 +딺 +딺 + +딻 +딻 +딻 +딻 +딻 + +딼 +딼 +딼 +딼 +딼 + +딽 +딽 +딽 +딽 +딽 + +딾 +딾 +딾 +딾 +딾 + +딿 +딿 +딿 +딿 +딿 + +땀 +땀 +땀 +땀 +땀 + +땁 +땁 +땁 +땁 +땁 + +땂 +땂 +땂 +땂 +땂 + +땃 +땃 +땃 +땃 +땃 + +땄 +땄 +땄 +땄 +땄 + +땅 +땅 +땅 +땅 +땅 + +땆 +땆 +땆 +땆 +땆 + +땇 +땇 +땇 +땇 +땇 + +땈 +땈 +땈 +땈 +땈 + +땉 +땉 +땉 +땉 +땉 + +땊 +땊 +땊 +땊 +땊 + +땋 +땋 +땋 +땋 +땋 + +때 +때 +때 +때 +때 + +땍 +땍 +땍 +땍 +땍 + +땎 +땎 +땎 +땎 +땎 + +땏 +땏 +땏 +땏 +땏 + +땐 +땐 +땐 +땐 +땐 + +땑 +땑 +땑 +땑 +땑 + +땒 +땒 +땒 +땒 +땒 + +땓 +땓 +땓 +땓 +땓 + +땔 +땔 +땔 +땔 +땔 + +땕 +땕 +땕 +땕 +땕 + +땖 +땖 +땖 +땖 +땖 + +땗 +땗 +땗 +땗 +땗 + +땘 +땘 +땘 +땘 +땘 + +땙 +땙 +땙 +땙 +땙 + +땚 +땚 +땚 +땚 +땚 + +땛 +땛 +땛 +땛 +땛 + +땜 +땜 +땜 +땜 +땜 + +땝 +땝 +땝 +땝 +땝 + +땞 +땞 +땞 +땞 +땞 + +땟 +땟 +땟 +땟 +땟 + +땠 +땠 +땠 +땠 +땠 + +땡 +땡 +땡 +땡 +땡 + +땢 +땢 +땢 +땢 +땢 + +땣 +땣 +땣 +땣 +땣 + +땤 +땤 +땤 +땤 +땤 + +땥 +땥 +땥 +땥 +땥 + +땦 +땦 +땦 +땦 +땦 + +땧 +땧 +땧 +땧 +땧 + +땨 +땨 +땨 +땨 +땨 + +땩 +땩 +땩 +땩 +땩 + +땪 +땪 +땪 +땪 +땪 + +땫 +땫 +땫 +땫 +땫 + +땬 +땬 +땬 +땬 +땬 + +땭 +땭 +땭 +땭 +땭 + +땮 +땮 +땮 +땮 +땮 + +땯 +땯 +땯 +땯 +땯 + +땰 +땰 +땰 +땰 +땰 + +땱 +땱 +땱 +땱 +땱 + +땲 +땲 +땲 +땲 +땲 + +땳 +땳 +땳 +땳 +땳 + +땴 +땴 +땴 +땴 +땴 + +땵 +땵 +땵 +땵 +땵 + +땶 +땶 +땶 +땶 +땶 + +땷 +땷 +땷 +땷 +땷 + +땸 +땸 +땸 +땸 +땸 + +땹 +땹 +땹 +땹 +땹 + +땺 +땺 +땺 +땺 +땺 + +땻 +땻 +땻 +땻 +땻 + +땼 +땼 +땼 +땼 +땼 + +땽 +땽 +땽 +땽 +땽 + +땾 +땾 +땾 +땾 +땾 + +땿 +땿 +땿 +땿 +땿 + +떀 +떀 +떀 +떀 +떀 + +떁 +떁 +떁 +떁 +떁 + +떂 +떂 +떂 +떂 +떂 + +떃 +떃 +떃 +떃 +떃 + +떄 +떄 +떄 +떄 +떄 + +떅 +떅 +떅 +떅 +떅 + +떆 +떆 +떆 +떆 +떆 + +떇 +떇 +떇 +떇 +떇 + +떈 +떈 +떈 +떈 +떈 + +떉 +떉 +떉 +떉 +떉 + +떊 +떊 +떊 +떊 +떊 + +떋 +떋 +떋 +떋 +떋 + +떌 +떌 +떌 +떌 +떌 + +떍 +떍 +떍 +떍 +떍 + +떎 +떎 +떎 +떎 +떎 + +떏 +떏 +떏 +떏 +떏 + +떐 +떐 +떐 +떐 +떐 + +떑 +떑 +떑 +떑 +떑 + +떒 +떒 +떒 +떒 +떒 + +떓 +떓 +떓 +떓 +떓 + +떔 +떔 +떔 +떔 +떔 + +떕 +떕 +떕 +떕 +떕 + +떖 +떖 +떖 +떖 +떖 + +떗 +떗 +떗 +떗 +떗 + +떘 +떘 +떘 +떘 +떘 + +떙 +떙 +떙 +떙 +떙 + +떚 +떚 +떚 +떚 +떚 + +떛 +떛 +떛 +떛 +떛 + +떜 +떜 +떜 +떜 +떜 + +떝 +떝 +떝 +떝 +떝 + +떞 +떞 +떞 +떞 +떞 + +떟 +떟 +떟 +떟 +떟 + +떠 +떠 +떠 +떠 +떠 + +떡 +떡 +떡 +떡 +떡 + +떢 +떢 +떢 +떢 +떢 + +떣 +떣 +떣 +떣 +떣 + +떤 +떤 +떤 +떤 +떤 + +떥 +떥 +떥 +떥 +떥 + +떦 +떦 +떦 +떦 +떦 + +떧 +떧 +떧 +떧 +떧 + +떨 +떨 +떨 +떨 +떨 + +떩 +떩 +떩 +떩 +떩 + +떪 +떪 +떪 +떪 +떪 + +떫 +떫 +떫 +떫 +떫 + +떬 +떬 +떬 +떬 +떬 + +떭 +떭 +떭 +떭 +떭 + +떮 +떮 +떮 +떮 +떮 + +떯 +떯 +떯 +떯 +떯 + +떰 +떰 +떰 +떰 +떰 + +떱 +떱 +떱 +떱 +떱 + +떲 +떲 +떲 +떲 +떲 + +떳 +떳 +떳 +떳 +떳 + +떴 +떴 +떴 +떴 +떴 + +떵 +떵 +떵 +떵 +떵 + +떶 +떶 +떶 +떶 +떶 + +떷 +떷 +떷 +떷 +떷 + +떸 +떸 +떸 +떸 +떸 + +떹 +떹 +떹 +떹 +떹 + +떺 +떺 +떺 +떺 +떺 + +떻 +떻 +떻 +떻 +떻 + +떼 +떼 +떼 +떼 +떼 + +떽 +떽 +떽 +떽 +떽 + +떾 +떾 +떾 +떾 +떾 + +떿 +떿 +떿 +떿 +떿 + +뗀 +뗀 +뗀 +뗀 +뗀 + +뗁 +뗁 +뗁 +뗁 +뗁 + +뗂 +뗂 +뗂 +뗂 +뗂 + +뗃 +뗃 +뗃 +뗃 +뗃 + +뗄 +뗄 +뗄 +뗄 +뗄 + +뗅 +뗅 +뗅 +뗅 +뗅 + +뗆 +뗆 +뗆 +뗆 +뗆 + +뗇 +뗇 +뗇 +뗇 +뗇 + +뗈 +뗈 +뗈 +뗈 +뗈 + +뗉 +뗉 +뗉 +뗉 +뗉 + +뗊 +뗊 +뗊 +뗊 +뗊 + +뗋 +뗋 +뗋 +뗋 +뗋 + +뗌 +뗌 +뗌 +뗌 +뗌 + +뗍 +뗍 +뗍 +뗍 +뗍 + +뗎 +뗎 +뗎 +뗎 +뗎 + +뗏 +뗏 +뗏 +뗏 +뗏 + +뗐 +뗐 +뗐 +뗐 +뗐 + +뗑 +뗑 +뗑 +뗑 +뗑 + +뗒 +뗒 +뗒 +뗒 +뗒 + +뗓 +뗓 +뗓 +뗓 +뗓 + +뗔 +뗔 +뗔 +뗔 +뗔 + +뗕 +뗕 +뗕 +뗕 +뗕 + +뗖 +뗖 +뗖 +뗖 +뗖 + +뗗 +뗗 +뗗 +뗗 +뗗 + +뗘 +뗘 +뗘 +뗘 +뗘 + +뗙 +뗙 +뗙 +뗙 +뗙 + +뗚 +뗚 +뗚 +뗚 +뗚 + +뗛 +뗛 +뗛 +뗛 +뗛 + +뗜 +뗜 +뗜 +뗜 +뗜 + +뗝 +뗝 +뗝 +뗝 +뗝 + +뗞 +뗞 +뗞 +뗞 +뗞 + +뗟 +뗟 +뗟 +뗟 +뗟 + +뗠 +뗠 +뗠 +뗠 +뗠 + +뗡 +뗡 +뗡 +뗡 +뗡 + +뗢 +뗢 +뗢 +뗢 +뗢 + +뗣 +뗣 +뗣 +뗣 +뗣 + +뗤 +뗤 +뗤 +뗤 +뗤 + +뗥 +뗥 +뗥 +뗥 +뗥 + +뗦 +뗦 +뗦 +뗦 +뗦 + +뗧 +뗧 +뗧 +뗧 +뗧 + +뗨 +뗨 +뗨 +뗨 +뗨 + +뗩 +뗩 +뗩 +뗩 +뗩 + +뗪 +뗪 +뗪 +뗪 +뗪 + +뗫 +뗫 +뗫 +뗫 +뗫 + +뗬 +뗬 +뗬 +뗬 +뗬 + +뗭 +뗭 +뗭 +뗭 +뗭 + +뗮 +뗮 +뗮 +뗮 +뗮 + +뗯 +뗯 +뗯 +뗯 +뗯 + +뗰 +뗰 +뗰 +뗰 +뗰 + +뗱 +뗱 +뗱 +뗱 +뗱 + +뗲 +뗲 +뗲 +뗲 +뗲 + +뗳 +뗳 +뗳 +뗳 +뗳 + +뗴 +뗴 +뗴 +뗴 +뗴 + +뗵 +뗵 +뗵 +뗵 +뗵 + +뗶 +뗶 +뗶 +뗶 +뗶 + +뗷 +뗷 +뗷 +뗷 +뗷 + +뗸 +뗸 +뗸 +뗸 +뗸 + +뗹 +뗹 +뗹 +뗹 +뗹 + +뗺 +뗺 +뗺 +뗺 +뗺 + +뗻 +뗻 +뗻 +뗻 +뗻 + +뗼 +뗼 +뗼 +뗼 +뗼 + +뗽 +뗽 +뗽 +뗽 +뗽 + +뗾 +뗾 +뗾 +뗾 +뗾 + +뗿 +뗿 +뗿 +뗿 +뗿 + +똀 +똀 +똀 +똀 +똀 + +똁 +똁 +똁 +똁 +똁 + +똂 +똂 +똂 +똂 +똂 + +똃 +똃 +똃 +똃 +똃 + +똄 +똄 +똄 +똄 +똄 + +똅 +똅 +똅 +똅 +똅 + +똆 +똆 +똆 +똆 +똆 + +똇 +똇 +똇 +똇 +똇 + +똈 +똈 +똈 +똈 +똈 + +똉 +똉 +똉 +똉 +똉 + +똊 +똊 +똊 +똊 +똊 + +똋 +똋 +똋 +똋 +똋 + +똌 +똌 +똌 +똌 +똌 + +똍 +똍 +똍 +똍 +똍 + +똎 +똎 +똎 +똎 +똎 + +똏 +똏 +똏 +똏 +똏 + +또 +또 +또 +또 +또 + +똑 +똑 +똑 +똑 +똑 + +똒 +똒 +똒 +똒 +똒 + +똓 +똓 +똓 +똓 +똓 + +똔 +똔 +똔 +똔 +똔 + +똕 +똕 +똕 +똕 +똕 + +똖 +똖 +똖 +똖 +똖 + +똗 +똗 +똗 +똗 +똗 + +똘 +똘 +똘 +똘 +똘 + +똙 +똙 +똙 +똙 +똙 + +똚 +똚 +똚 +똚 +똚 + +똛 +똛 +똛 +똛 +똛 + +똜 +똜 +똜 +똜 +똜 + +똝 +똝 +똝 +똝 +똝 + +똞 +똞 +똞 +똞 +똞 + +똟 +똟 +똟 +똟 +똟 + +똠 +똠 +똠 +똠 +똠 + +똡 +똡 +똡 +똡 +똡 + +똢 +똢 +똢 +똢 +똢 + +똣 +똣 +똣 +똣 +똣 + +똤 +똤 +똤 +똤 +똤 + +똥 +똥 +똥 +똥 +똥 + +똦 +똦 +똦 +똦 +똦 + +똧 +똧 +똧 +똧 +똧 + +똨 +똨 +똨 +똨 +똨 + +똩 +똩 +똩 +똩 +똩 + +똪 +똪 +똪 +똪 +똪 + +똫 +똫 +똫 +똫 +똫 + +똬 +똬 +똬 +똬 +똬 + +똭 +똭 +똭 +똭 +똭 + +똮 +똮 +똮 +똮 +똮 + +똯 +똯 +똯 +똯 +똯 + +똰 +똰 +똰 +똰 +똰 + +똱 +똱 +똱 +똱 +똱 + +똲 +똲 +똲 +똲 +똲 + +똳 +똳 +똳 +똳 +똳 + +똴 +똴 +똴 +똴 +똴 + +똵 +똵 +똵 +똵 +똵 + +똶 +똶 +똶 +똶 +똶 + +똷 +똷 +똷 +똷 +똷 + +똸 +똸 +똸 +똸 +똸 + +똹 +똹 +똹 +똹 +똹 + +똺 +똺 +똺 +똺 +똺 + +똻 +똻 +똻 +똻 +똻 + +똼 +똼 +똼 +똼 +똼 + +똽 +똽 +똽 +똽 +똽 + +똾 +똾 +똾 +똾 +똾 + +똿 +똿 +똿 +똿 +똿 + +뙀 +뙀 +뙀 +뙀 +뙀 + +뙁 +뙁 +뙁 +뙁 +뙁 + +뙂 +뙂 +뙂 +뙂 +뙂 + +뙃 +뙃 +뙃 +뙃 +뙃 + +뙄 +뙄 +뙄 +뙄 +뙄 + +뙅 +뙅 +뙅 +뙅 +뙅 + +뙆 +뙆 +뙆 +뙆 +뙆 + +뙇 +뙇 +뙇 +뙇 +뙇 + +뙈 +뙈 +뙈 +뙈 +뙈 + +뙉 +뙉 +뙉 +뙉 +뙉 + +뙊 +뙊 +뙊 +뙊 +뙊 + +뙋 +뙋 +뙋 +뙋 +뙋 + +뙌 +뙌 +뙌 +뙌 +뙌 + +뙍 +뙍 +뙍 +뙍 +뙍 + +뙎 +뙎 +뙎 +뙎 +뙎 + +뙏 +뙏 +뙏 +뙏 +뙏 + +뙐 +뙐 +뙐 +뙐 +뙐 + +뙑 +뙑 +뙑 +뙑 +뙑 + +뙒 +뙒 +뙒 +뙒 +뙒 + +뙓 +뙓 +뙓 +뙓 +뙓 + +뙔 +뙔 +뙔 +뙔 +뙔 + +뙕 +뙕 +뙕 +뙕 +뙕 + +뙖 +뙖 +뙖 +뙖 +뙖 + +뙗 +뙗 +뙗 +뙗 +뙗 + +뙘 +뙘 +뙘 +뙘 +뙘 + +뙙 +뙙 +뙙 +뙙 +뙙 + +뙚 +뙚 +뙚 +뙚 +뙚 + +뙛 +뙛 +뙛 +뙛 +뙛 + +뙜 +뙜 +뙜 +뙜 +뙜 + +뙝 +뙝 +뙝 +뙝 +뙝 + +뙞 +뙞 +뙞 +뙞 +뙞 + +뙟 +뙟 +뙟 +뙟 +뙟 + +뙠 +뙠 +뙠 +뙠 +뙠 + +뙡 +뙡 +뙡 +뙡 +뙡 + +뙢 +뙢 +뙢 +뙢 +뙢 + +뙣 +뙣 +뙣 +뙣 +뙣 + +뙤 +뙤 +뙤 +뙤 +뙤 + +뙥 +뙥 +뙥 +뙥 +뙥 + +뙦 +뙦 +뙦 +뙦 +뙦 + +뙧 +뙧 +뙧 +뙧 +뙧 + +뙨 +뙨 +뙨 +뙨 +뙨 + +뙩 +뙩 +뙩 +뙩 +뙩 + +뙪 +뙪 +뙪 +뙪 +뙪 + +뙫 +뙫 +뙫 +뙫 +뙫 + +뙬 +뙬 +뙬 +뙬 +뙬 + +뙭 +뙭 +뙭 +뙭 +뙭 + +뙮 +뙮 +뙮 +뙮 +뙮 + +뙯 +뙯 +뙯 +뙯 +뙯 + +뙰 +뙰 +뙰 +뙰 +뙰 + +뙱 +뙱 +뙱 +뙱 +뙱 + +뙲 +뙲 +뙲 +뙲 +뙲 + +뙳 +뙳 +뙳 +뙳 +뙳 + +뙴 +뙴 +뙴 +뙴 +뙴 + +뙵 +뙵 +뙵 +뙵 +뙵 + +뙶 +뙶 +뙶 +뙶 +뙶 + +뙷 +뙷 +뙷 +뙷 +뙷 + +뙸 +뙸 +뙸 +뙸 +뙸 + +뙹 +뙹 +뙹 +뙹 +뙹 + +뙺 +뙺 +뙺 +뙺 +뙺 + +뙻 +뙻 +뙻 +뙻 +뙻 + +뙼 +뙼 +뙼 +뙼 +뙼 + +뙽 +뙽 +뙽 +뙽 +뙽 + +뙾 +뙾 +뙾 +뙾 +뙾 + +뙿 +뙿 +뙿 +뙿 +뙿 + +뚀 +뚀 +뚀 +뚀 +뚀 + +뚁 +뚁 +뚁 +뚁 +뚁 + +뚂 +뚂 +뚂 +뚂 +뚂 + +뚃 +뚃 +뚃 +뚃 +뚃 + +뚄 +뚄 +뚄 +뚄 +뚄 + +뚅 +뚅 +뚅 +뚅 +뚅 + +뚆 +뚆 +뚆 +뚆 +뚆 + +뚇 +뚇 +뚇 +뚇 +뚇 + +뚈 +뚈 +뚈 +뚈 +뚈 + +뚉 +뚉 +뚉 +뚉 +뚉 + +뚊 +뚊 +뚊 +뚊 +뚊 + +뚋 +뚋 +뚋 +뚋 +뚋 + +뚌 +뚌 +뚌 +뚌 +뚌 + +뚍 +뚍 +뚍 +뚍 +뚍 + +뚎 +뚎 +뚎 +뚎 +뚎 + +뚏 +뚏 +뚏 +뚏 +뚏 + +뚐 +뚐 +뚐 +뚐 +뚐 + +뚑 +뚑 +뚑 +뚑 +뚑 + +뚒 +뚒 +뚒 +뚒 +뚒 + +뚓 +뚓 +뚓 +뚓 +뚓 + +뚔 +뚔 +뚔 +뚔 +뚔 + +뚕 +뚕 +뚕 +뚕 +뚕 + +뚖 +뚖 +뚖 +뚖 +뚖 + +뚗 +뚗 +뚗 +뚗 +뚗 + +뚘 +뚘 +뚘 +뚘 +뚘 + +뚙 +뚙 +뚙 +뚙 +뚙 + +뚚 +뚚 +뚚 +뚚 +뚚 + +뚛 +뚛 +뚛 +뚛 +뚛 + +뚜 +뚜 +뚜 +뚜 +뚜 + +뚝 +뚝 +뚝 +뚝 +뚝 + +뚞 +뚞 +뚞 +뚞 +뚞 + +뚟 +뚟 +뚟 +뚟 +뚟 + +뚠 +뚠 +뚠 +뚠 +뚠 + +뚡 +뚡 +뚡 +뚡 +뚡 + +뚢 +뚢 +뚢 +뚢 +뚢 + +뚣 +뚣 +뚣 +뚣 +뚣 + +뚤 +뚤 +뚤 +뚤 +뚤 + +뚥 +뚥 +뚥 +뚥 +뚥 + +뚦 +뚦 +뚦 +뚦 +뚦 + +뚧 +뚧 +뚧 +뚧 +뚧 + +뚨 +뚨 +뚨 +뚨 +뚨 + +뚩 +뚩 +뚩 +뚩 +뚩 + +뚪 +뚪 +뚪 +뚪 +뚪 + +뚫 +뚫 +뚫 +뚫 +뚫 + +뚬 +뚬 +뚬 +뚬 +뚬 + +뚭 +뚭 +뚭 +뚭 +뚭 + +뚮 +뚮 +뚮 +뚮 +뚮 + +뚯 +뚯 +뚯 +뚯 +뚯 + +뚰 +뚰 +뚰 +뚰 +뚰 + +뚱 +뚱 +뚱 +뚱 +뚱 + +뚲 +뚲 +뚲 +뚲 +뚲 + +뚳 +뚳 +뚳 +뚳 +뚳 + +뚴 +뚴 +뚴 +뚴 +뚴 + +뚵 +뚵 +뚵 +뚵 +뚵 + +뚶 +뚶 +뚶 +뚶 +뚶 + +뚷 +뚷 +뚷 +뚷 +뚷 + +뚸 +뚸 +뚸 +뚸 +뚸 + +뚹 +뚹 +뚹 +뚹 +뚹 + +뚺 +뚺 +뚺 +뚺 +뚺 + +뚻 +뚻 +뚻 +뚻 +뚻 + +뚼 +뚼 +뚼 +뚼 +뚼 + +뚽 +뚽 +뚽 +뚽 +뚽 + +뚾 +뚾 +뚾 +뚾 +뚾 + +뚿 +뚿 +뚿 +뚿 +뚿 + +뛀 +뛀 +뛀 +뛀 +뛀 + +뛁 +뛁 +뛁 +뛁 +뛁 + +뛂 +뛂 +뛂 +뛂 +뛂 + +뛃 +뛃 +뛃 +뛃 +뛃 + +뛄 +뛄 +뛄 +뛄 +뛄 + +뛅 +뛅 +뛅 +뛅 +뛅 + +뛆 +뛆 +뛆 +뛆 +뛆 + +뛇 +뛇 +뛇 +뛇 +뛇 + +뛈 +뛈 +뛈 +뛈 +뛈 + +뛉 +뛉 +뛉 +뛉 +뛉 + +뛊 +뛊 +뛊 +뛊 +뛊 + +뛋 +뛋 +뛋 +뛋 +뛋 + +뛌 +뛌 +뛌 +뛌 +뛌 + +뛍 +뛍 +뛍 +뛍 +뛍 + +뛎 +뛎 +뛎 +뛎 +뛎 + +뛏 +뛏 +뛏 +뛏 +뛏 + +뛐 +뛐 +뛐 +뛐 +뛐 + +뛑 +뛑 +뛑 +뛑 +뛑 + +뛒 +뛒 +뛒 +뛒 +뛒 + +뛓 +뛓 +뛓 +뛓 +뛓 + +뛔 +뛔 +뛔 +뛔 +뛔 + +뛕 +뛕 +뛕 +뛕 +뛕 + +뛖 +뛖 +뛖 +뛖 +뛖 + +뛗 +뛗 +뛗 +뛗 +뛗 + +뛘 +뛘 +뛘 +뛘 +뛘 + +뛙 +뛙 +뛙 +뛙 +뛙 + +뛚 +뛚 +뛚 +뛚 +뛚 + +뛛 +뛛 +뛛 +뛛 +뛛 + +뛜 +뛜 +뛜 +뛜 +뛜 + +뛝 +뛝 +뛝 +뛝 +뛝 + +뛞 +뛞 +뛞 +뛞 +뛞 + +뛟 +뛟 +뛟 +뛟 +뛟 + +뛠 +뛠 +뛠 +뛠 +뛠 + +뛡 +뛡 +뛡 +뛡 +뛡 + +뛢 +뛢 +뛢 +뛢 +뛢 + +뛣 +뛣 +뛣 +뛣 +뛣 + +뛤 +뛤 +뛤 +뛤 +뛤 + +뛥 +뛥 +뛥 +뛥 +뛥 + +뛦 +뛦 +뛦 +뛦 +뛦 + +뛧 +뛧 +뛧 +뛧 +뛧 + +뛨 +뛨 +뛨 +뛨 +뛨 + +뛩 +뛩 +뛩 +뛩 +뛩 + +뛪 +뛪 +뛪 +뛪 +뛪 + +뛫 +뛫 +뛫 +뛫 +뛫 + +뛬 +뛬 +뛬 +뛬 +뛬 + +뛭 +뛭 +뛭 +뛭 +뛭 + +뛮 +뛮 +뛮 +뛮 +뛮 + +뛯 +뛯 +뛯 +뛯 +뛯 + +뛰 +뛰 +뛰 +뛰 +뛰 + +뛱 +뛱 +뛱 +뛱 +뛱 + +뛲 +뛲 +뛲 +뛲 +뛲 + +뛳 +뛳 +뛳 +뛳 +뛳 + +뛴 +뛴 +뛴 +뛴 +뛴 + +뛵 +뛵 +뛵 +뛵 +뛵 + +뛶 +뛶 +뛶 +뛶 +뛶 + +뛷 +뛷 +뛷 +뛷 +뛷 + +뛸 +뛸 +뛸 +뛸 +뛸 + +뛹 +뛹 +뛹 +뛹 +뛹 + +뛺 +뛺 +뛺 +뛺 +뛺 + +뛻 +뛻 +뛻 +뛻 +뛻 + +뛼 +뛼 +뛼 +뛼 +뛼 + +뛽 +뛽 +뛽 +뛽 +뛽 + +뛾 +뛾 +뛾 +뛾 +뛾 + +뛿 +뛿 +뛿 +뛿 +뛿 + +뜀 +뜀 +뜀 +뜀 +뜀 + +뜁 +뜁 +뜁 +뜁 +뜁 + +뜂 +뜂 +뜂 +뜂 +뜂 + +뜃 +뜃 +뜃 +뜃 +뜃 + +뜄 +뜄 +뜄 +뜄 +뜄 + +뜅 +뜅 +뜅 +뜅 +뜅 + +뜆 +뜆 +뜆 +뜆 +뜆 + +뜇 +뜇 +뜇 +뜇 +뜇 + +뜈 +뜈 +뜈 +뜈 +뜈 + +뜉 +뜉 +뜉 +뜉 +뜉 + +뜊 +뜊 +뜊 +뜊 +뜊 + +뜋 +뜋 +뜋 +뜋 +뜋 + +뜌 +뜌 +뜌 +뜌 +뜌 + +뜍 +뜍 +뜍 +뜍 +뜍 + +뜎 +뜎 +뜎 +뜎 +뜎 + +뜏 +뜏 +뜏 +뜏 +뜏 + +뜐 +뜐 +뜐 +뜐 +뜐 + +뜑 +뜑 +뜑 +뜑 +뜑 + +뜒 +뜒 +뜒 +뜒 +뜒 + +뜓 +뜓 +뜓 +뜓 +뜓 + +뜔 +뜔 +뜔 +뜔 +뜔 + +뜕 +뜕 +뜕 +뜕 +뜕 + +뜖 +뜖 +뜖 +뜖 +뜖 + +뜗 +뜗 +뜗 +뜗 +뜗 + +뜘 +뜘 +뜘 +뜘 +뜘 + +뜙 +뜙 +뜙 +뜙 +뜙 + +뜚 +뜚 +뜚 +뜚 +뜚 + +뜛 +뜛 +뜛 +뜛 +뜛 + +뜜 +뜜 +뜜 +뜜 +뜜 + +뜝 +뜝 +뜝 +뜝 +뜝 + +뜞 +뜞 +뜞 +뜞 +뜞 + +뜟 +뜟 +뜟 +뜟 +뜟 + +뜠 +뜠 +뜠 +뜠 +뜠 + +뜡 +뜡 +뜡 +뜡 +뜡 + +뜢 +뜢 +뜢 +뜢 +뜢 + +뜣 +뜣 +뜣 +뜣 +뜣 + +뜤 +뜤 +뜤 +뜤 +뜤 + +뜥 +뜥 +뜥 +뜥 +뜥 + +뜦 +뜦 +뜦 +뜦 +뜦 + +뜧 +뜧 +뜧 +뜧 +뜧 + +뜨 +뜨 +뜨 +뜨 +뜨 + +뜩 +뜩 +뜩 +뜩 +뜩 + +뜪 +뜪 +뜪 +뜪 +뜪 + +뜫 +뜫 +뜫 +뜫 +뜫 + +뜬 +뜬 +뜬 +뜬 +뜬 + +뜭 +뜭 +뜭 +뜭 +뜭 + +뜮 +뜮 +뜮 +뜮 +뜮 + +뜯 +뜯 +뜯 +뜯 +뜯 + +뜰 +뜰 +뜰 +뜰 +뜰 + +뜱 +뜱 +뜱 +뜱 +뜱 + +뜲 +뜲 +뜲 +뜲 +뜲 + +뜳 +뜳 +뜳 +뜳 +뜳 + +뜴 +뜴 +뜴 +뜴 +뜴 + +뜵 +뜵 +뜵 +뜵 +뜵 + +뜶 +뜶 +뜶 +뜶 +뜶 + +뜷 +뜷 +뜷 +뜷 +뜷 + +뜸 +뜸 +뜸 +뜸 +뜸 + +뜹 +뜹 +뜹 +뜹 +뜹 + +뜺 +뜺 +뜺 +뜺 +뜺 + +뜻 +뜻 +뜻 +뜻 +뜻 + +뜼 +뜼 +뜼 +뜼 +뜼 + +뜽 +뜽 +뜽 +뜽 +뜽 + +뜾 +뜾 +뜾 +뜾 +뜾 + +뜿 +뜿 +뜿 +뜿 +뜿 + +띀 +띀 +띀 +띀 +띀 + +띁 +띁 +띁 +띁 +띁 + +띂 +띂 +띂 +띂 +띂 + +띃 +띃 +띃 +띃 +띃 + +띄 +띄 +띄 +띄 +띄 + +띅 +띅 +띅 +띅 +띅 + +띆 +띆 +띆 +띆 +띆 + +띇 +띇 +띇 +띇 +띇 + +띈 +띈 +띈 +띈 +띈 + +띉 +띉 +띉 +띉 +띉 + +띊 +띊 +띊 +띊 +띊 + +띋 +띋 +띋 +띋 +띋 + +띌 +띌 +띌 +띌 +띌 + +띍 +띍 +띍 +띍 +띍 + +띎 +띎 +띎 +띎 +띎 + +띏 +띏 +띏 +띏 +띏 + +띐 +띐 +띐 +띐 +띐 + +띑 +띑 +띑 +띑 +띑 + +띒 +띒 +띒 +띒 +띒 + +띓 +띓 +띓 +띓 +띓 + +띔 +띔 +띔 +띔 +띔 + +띕 +띕 +띕 +띕 +띕 + +띖 +띖 +띖 +띖 +띖 + +띗 +띗 +띗 +띗 +띗 + +띘 +띘 +띘 +띘 +띘 + +띙 +띙 +띙 +띙 +띙 + +띚 +띚 +띚 +띚 +띚 + +띛 +띛 +띛 +띛 +띛 + +띜 +띜 +띜 +띜 +띜 + +띝 +띝 +띝 +띝 +띝 + +띞 +띞 +띞 +띞 +띞 + +띟 +띟 +띟 +띟 +띟 + +띠 +띠 +띠 +띠 +띠 + +띡 +띡 +띡 +띡 +띡 + +띢 +띢 +띢 +띢 +띢 + +띣 +띣 +띣 +띣 +띣 + +띤 +띤 +띤 +띤 +띤 + +띥 +띥 +띥 +띥 +띥 + +띦 +띦 +띦 +띦 +띦 + +띧 +띧 +띧 +띧 +띧 + +띨 +띨 +띨 +띨 +띨 + +띩 +띩 +띩 +띩 +띩 + +띪 +띪 +띪 +띪 +띪 + +띫 +띫 +띫 +띫 +띫 + +띬 +띬 +띬 +띬 +띬 + +띭 +띭 +띭 +띭 +띭 + +띮 +띮 +띮 +띮 +띮 + +띯 +띯 +띯 +띯 +띯 + +띰 +띰 +띰 +띰 +띰 + +띱 +띱 +띱 +띱 +띱 + +띲 +띲 +띲 +띲 +띲 + +띳 +띳 +띳 +띳 +띳 + +띴 +띴 +띴 +띴 +띴 + +띵 +띵 +띵 +띵 +띵 + +띶 +띶 +띶 +띶 +띶 + +띷 +띷 +띷 +띷 +띷 + +띸 +띸 +띸 +띸 +띸 + +띹 +띹 +띹 +띹 +띹 + +띺 +띺 +띺 +띺 +띺 + +띻 +띻 +띻 +띻 +띻 + +라 +라 +라 +라 +라 + +락 +락 +락 +락 +락 + +띾 +띾 +띾 +띾 +띾 + +띿 +띿 +띿 +띿 +띿 + +란 +란 +란 +란 +란 + +랁 +랁 +랁 +랁 +랁 + +랂 +랂 +랂 +랂 +랂 + +랃 +랃 +랃 +랃 +랃 + +랄 +랄 +랄 +랄 +랄 + +랅 +랅 +랅 +랅 +랅 + +랆 +랆 +랆 +랆 +랆 + +랇 +랇 +랇 +랇 +랇 + +랈 +랈 +랈 +랈 +랈 + +랉 +랉 +랉 +랉 +랉 + +랊 +랊 +랊 +랊 +랊 + +랋 +랋 +랋 +랋 +랋 + +람 +람 +람 +람 +람 + +랍 +랍 +랍 +랍 +랍 + +랎 +랎 +랎 +랎 +랎 + +랏 +랏 +랏 +랏 +랏 + +랐 +랐 +랐 +랐 +랐 + +랑 +랑 +랑 +랑 +랑 + +랒 +랒 +랒 +랒 +랒 + +랓 +랓 +랓 +랓 +랓 + +랔 +랔 +랔 +랔 +랔 + +랕 +랕 +랕 +랕 +랕 + +랖 +랖 +랖 +랖 +랖 + +랗 +랗 +랗 +랗 +랗 + +래 +래 +래 +래 +래 + +랙 +랙 +랙 +랙 +랙 + +랚 +랚 +랚 +랚 +랚 + +랛 +랛 +랛 +랛 +랛 + +랜 +랜 +랜 +랜 +랜 + +랝 +랝 +랝 +랝 +랝 + +랞 +랞 +랞 +랞 +랞 + +랟 +랟 +랟 +랟 +랟 + +랠 +랠 +랠 +랠 +랠 + +랡 +랡 +랡 +랡 +랡 + +랢 +랢 +랢 +랢 +랢 + +랣 +랣 +랣 +랣 +랣 + +랤 +랤 +랤 +랤 +랤 + +랥 +랥 +랥 +랥 +랥 + +랦 +랦 +랦 +랦 +랦 + +랧 +랧 +랧 +랧 +랧 + +램 +램 +램 +램 +램 + +랩 +랩 +랩 +랩 +랩 + +랪 +랪 +랪 +랪 +랪 + +랫 +랫 +랫 +랫 +랫 + +랬 +랬 +랬 +랬 +랬 + +랭 +랭 +랭 +랭 +랭 + +랮 +랮 +랮 +랮 +랮 + +랯 +랯 +랯 +랯 +랯 + +랰 +랰 +랰 +랰 +랰 + +랱 +랱 +랱 +랱 +랱 + +랲 +랲 +랲 +랲 +랲 + +랳 +랳 +랳 +랳 +랳 + +랴 +랴 +랴 +랴 +랴 + +략 +략 +략 +략 +략 + +랶 +랶 +랶 +랶 +랶 + +랷 +랷 +랷 +랷 +랷 + +랸 +랸 +랸 +랸 +랸 + +랹 +랹 +랹 +랹 +랹 + +랺 +랺 +랺 +랺 +랺 + +랻 +랻 +랻 +랻 +랻 + +랼 +랼 +랼 +랼 +랼 + +랽 +랽 +랽 +랽 +랽 + +랾 +랾 +랾 +랾 +랾 + +랿 +랿 +랿 +랿 +랿 + +럀 +럀 +럀 +럀 +럀 + +럁 +럁 +럁 +럁 +럁 + +럂 +럂 +럂 +럂 +럂 + +럃 +럃 +럃 +럃 +럃 + +럄 +럄 +럄 +럄 +럄 + +럅 +럅 +럅 +럅 +럅 + +럆 +럆 +럆 +럆 +럆 + +럇 +럇 +럇 +럇 +럇 + +럈 +럈 +럈 +럈 +럈 + +량 +량 +량 +량 +량 + +럊 +럊 +럊 +럊 +럊 + +럋 +럋 +럋 +럋 +럋 + +럌 +럌 +럌 +럌 +럌 + +럍 +럍 +럍 +럍 +럍 + +럎 +럎 +럎 +럎 +럎 + +럏 +럏 +럏 +럏 +럏 + +럐 +럐 +럐 +럐 +럐 + +럑 +럑 +럑 +럑 +럑 + +럒 +럒 +럒 +럒 +럒 + +럓 +럓 +럓 +럓 +럓 + +럔 +럔 +럔 +럔 +럔 + +럕 +럕 +럕 +럕 +럕 + +럖 +럖 +럖 +럖 +럖 + +럗 +럗 +럗 +럗 +럗 + +럘 +럘 +럘 +럘 +럘 + +럙 +럙 +럙 +럙 +럙 + +럚 +럚 +럚 +럚 +럚 + +럛 +럛 +럛 +럛 +럛 + +럜 +럜 +럜 +럜 +럜 + +럝 +럝 +럝 +럝 +럝 + +럞 +럞 +럞 +럞 +럞 + +럟 +럟 +럟 +럟 +럟 + +럠 +럠 +럠 +럠 +럠 + +럡 +럡 +럡 +럡 +럡 + +럢 +럢 +럢 +럢 +럢 + +럣 +럣 +럣 +럣 +럣 + +럤 +럤 +럤 +럤 +럤 + +럥 +럥 +럥 +럥 +럥 + +럦 +럦 +럦 +럦 +럦 + +럧 +럧 +럧 +럧 +럧 + +럨 +럨 +럨 +럨 +럨 + +럩 +럩 +럩 +럩 +럩 + +럪 +럪 +럪 +럪 +럪 + +럫 +럫 +럫 +럫 +럫 + +러 +러 +러 +러 +러 + +럭 +럭 +럭 +럭 +럭 + +럮 +럮 +럮 +럮 +럮 + +럯 +럯 +럯 +럯 +럯 + +런 +런 +런 +런 +런 + +럱 +럱 +럱 +럱 +럱 + +럲 +럲 +럲 +럲 +럲 + +럳 +럳 +럳 +럳 +럳 + +럴 +럴 +럴 +럴 +럴 + +럵 +럵 +럵 +럵 +럵 + +럶 +럶 +럶 +럶 +럶 + +럷 +럷 +럷 +럷 +럷 + +럸 +럸 +럸 +럸 +럸 + +럹 +럹 +럹 +럹 +럹 + +럺 +럺 +럺 +럺 +럺 + +럻 +럻 +럻 +럻 +럻 + +럼 +럼 +럼 +럼 +럼 + +럽 +럽 +럽 +럽 +럽 + +럾 +럾 +럾 +럾 +럾 + +럿 +럿 +럿 +럿 +럿 + +렀 +렀 +렀 +렀 +렀 + +렁 +렁 +렁 +렁 +렁 + +렂 +렂 +렂 +렂 +렂 + +렃 +렃 +렃 +렃 +렃 + +렄 +렄 +렄 +렄 +렄 + +렅 +렅 +렅 +렅 +렅 + +렆 +렆 +렆 +렆 +렆 + +렇 +렇 +렇 +렇 +렇 + +레 +레 +레 +레 +레 + +렉 +렉 +렉 +렉 +렉 + +렊 +렊 +렊 +렊 +렊 + +렋 +렋 +렋 +렋 +렋 + +렌 +렌 +렌 +렌 +렌 + +렍 +렍 +렍 +렍 +렍 + +렎 +렎 +렎 +렎 +렎 + +렏 +렏 +렏 +렏 +렏 + +렐 +렐 +렐 +렐 +렐 + +렑 +렑 +렑 +렑 +렑 + +렒 +렒 +렒 +렒 +렒 + +렓 +렓 +렓 +렓 +렓 + +렔 +렔 +렔 +렔 +렔 + +렕 +렕 +렕 +렕 +렕 + +렖 +렖 +렖 +렖 +렖 + +렗 +렗 +렗 +렗 +렗 + +렘 +렘 +렘 +렘 +렘 + +렙 +렙 +렙 +렙 +렙 + +렚 +렚 +렚 +렚 +렚 + +렛 +렛 +렛 +렛 +렛 + +렜 +렜 +렜 +렜 +렜 + +렝 +렝 +렝 +렝 +렝 + +렞 +렞 +렞 +렞 +렞 + +렟 +렟 +렟 +렟 +렟 + +렠 +렠 +렠 +렠 +렠 + +렡 +렡 +렡 +렡 +렡 + +렢 +렢 +렢 +렢 +렢 + +렣 +렣 +렣 +렣 +렣 + +려 +려 +려 +려 +려 + +력 +력 +력 +력 +력 + +렦 +렦 +렦 +렦 +렦 + +렧 +렧 +렧 +렧 +렧 + +련 +련 +련 +련 +련 + +렩 +렩 +렩 +렩 +렩 + +렪 +렪 +렪 +렪 +렪 + +렫 +렫 +렫 +렫 +렫 + +렬 +렬 +렬 +렬 +렬 + +렭 +렭 +렭 +렭 +렭 + +렮 +렮 +렮 +렮 +렮 + +렯 +렯 +렯 +렯 +렯 + +렰 +렰 +렰 +렰 +렰 + +렱 +렱 +렱 +렱 +렱 + +렲 +렲 +렲 +렲 +렲 + +렳 +렳 +렳 +렳 +렳 + +렴 +렴 +렴 +렴 +렴 + +렵 +렵 +렵 +렵 +렵 + +렶 +렶 +렶 +렶 +렶 + +렷 +렷 +렷 +렷 +렷 + +렸 +렸 +렸 +렸 +렸 + +령 +령 +령 +령 +령 + +렺 +렺 +렺 +렺 +렺 + +렻 +렻 +렻 +렻 +렻 + +렼 +렼 +렼 +렼 +렼 + +렽 +렽 +렽 +렽 +렽 + +렾 +렾 +렾 +렾 +렾 + +렿 +렿 +렿 +렿 +렿 + +례 +례 +례 +례 +례 + +롁 +롁 +롁 +롁 +롁 + +롂 +롂 +롂 +롂 +롂 + +롃 +롃 +롃 +롃 +롃 + +롄 +롄 +롄 +롄 +롄 + +롅 +롅 +롅 +롅 +롅 + +롆 +롆 +롆 +롆 +롆 + +롇 +롇 +롇 +롇 +롇 + +롈 +롈 +롈 +롈 +롈 + +롉 +롉 +롉 +롉 +롉 + +롊 +롊 +롊 +롊 +롊 + +롋 +롋 +롋 +롋 +롋 + +롌 +롌 +롌 +롌 +롌 + +롍 +롍 +롍 +롍 +롍 + +롎 +롎 +롎 +롎 +롎 + +롏 +롏 +롏 +롏 +롏 + +롐 +롐 +롐 +롐 +롐 + +롑 +롑 +롑 +롑 +롑 + +롒 +롒 +롒 +롒 +롒 + +롓 +롓 +롓 +롓 +롓 + +롔 +롔 +롔 +롔 +롔 + +롕 +롕 +롕 +롕 +롕 + +롖 +롖 +롖 +롖 +롖 + +롗 +롗 +롗 +롗 +롗 + +롘 +롘 +롘 +롘 +롘 + +롙 +롙 +롙 +롙 +롙 + +롚 +롚 +롚 +롚 +롚 + +롛 +롛 +롛 +롛 +롛 + +로 +로 +로 +로 +로 + +록 +록 +록 +록 +록 + +롞 +롞 +롞 +롞 +롞 + +롟 +롟 +롟 +롟 +롟 + +론 +론 +론 +론 +론 + +롡 +롡 +롡 +롡 +롡 + +롢 +롢 +롢 +롢 +롢 + +롣 +롣 +롣 +롣 +롣 + +롤 +롤 +롤 +롤 +롤 + +롥 +롥 +롥 +롥 +롥 + +롦 +롦 +롦 +롦 +롦 + +롧 +롧 +롧 +롧 +롧 + +롨 +롨 +롨 +롨 +롨 + +롩 +롩 +롩 +롩 +롩 + +롪 +롪 +롪 +롪 +롪 + +롫 +롫 +롫 +롫 +롫 + +롬 +롬 +롬 +롬 +롬 + +롭 +롭 +롭 +롭 +롭 + +롮 +롮 +롮 +롮 +롮 + +롯 +롯 +롯 +롯 +롯 + +롰 +롰 +롰 +롰 +롰 + +롱 +롱 +롱 +롱 +롱 + +롲 +롲 +롲 +롲 +롲 + +롳 +롳 +롳 +롳 +롳 + +롴 +롴 +롴 +롴 +롴 + +롵 +롵 +롵 +롵 +롵 + +롶 +롶 +롶 +롶 +롶 + +롷 +롷 +롷 +롷 +롷 + +롸 +롸 +롸 +롸 +롸 + +롹 +롹 +롹 +롹 +롹 + +롺 +롺 +롺 +롺 +롺 + +롻 +롻 +롻 +롻 +롻 + +롼 +롼 +롼 +롼 +롼 + +롽 +롽 +롽 +롽 +롽 + +롾 +롾 +롾 +롾 +롾 + +롿 +롿 +롿 +롿 +롿 + +뢀 +뢀 +뢀 +뢀 +뢀 + +뢁 +뢁 +뢁 +뢁 +뢁 + +뢂 +뢂 +뢂 +뢂 +뢂 + +뢃 +뢃 +뢃 +뢃 +뢃 + +뢄 +뢄 +뢄 +뢄 +뢄 + +뢅 +뢅 +뢅 +뢅 +뢅 + +뢆 +뢆 +뢆 +뢆 +뢆 + +뢇 +뢇 +뢇 +뢇 +뢇 + +뢈 +뢈 +뢈 +뢈 +뢈 + +뢉 +뢉 +뢉 +뢉 +뢉 + +뢊 +뢊 +뢊 +뢊 +뢊 + +뢋 +뢋 +뢋 +뢋 +뢋 + +뢌 +뢌 +뢌 +뢌 +뢌 + +뢍 +뢍 +뢍 +뢍 +뢍 + +뢎 +뢎 +뢎 +뢎 +뢎 + +뢏 +뢏 +뢏 +뢏 +뢏 + +뢐 +뢐 +뢐 +뢐 +뢐 + +뢑 +뢑 +뢑 +뢑 +뢑 + +뢒 +뢒 +뢒 +뢒 +뢒 + +뢓 +뢓 +뢓 +뢓 +뢓 + +뢔 +뢔 +뢔 +뢔 +뢔 + +뢕 +뢕 +뢕 +뢕 +뢕 + +뢖 +뢖 +뢖 +뢖 +뢖 + +뢗 +뢗 +뢗 +뢗 +뢗 + +뢘 +뢘 +뢘 +뢘 +뢘 + +뢙 +뢙 +뢙 +뢙 +뢙 + +뢚 +뢚 +뢚 +뢚 +뢚 + +뢛 +뢛 +뢛 +뢛 +뢛 + +뢜 +뢜 +뢜 +뢜 +뢜 + +뢝 +뢝 +뢝 +뢝 +뢝 + +뢞 +뢞 +뢞 +뢞 +뢞 + +뢟 +뢟 +뢟 +뢟 +뢟 + +뢠 +뢠 +뢠 +뢠 +뢠 + +뢡 +뢡 +뢡 +뢡 +뢡 + +뢢 +뢢 +뢢 +뢢 +뢢 + +뢣 +뢣 +뢣 +뢣 +뢣 + +뢤 +뢤 +뢤 +뢤 +뢤 + +뢥 +뢥 +뢥 +뢥 +뢥 + +뢦 +뢦 +뢦 +뢦 +뢦 + +뢧 +뢧 +뢧 +뢧 +뢧 + +뢨 +뢨 +뢨 +뢨 +뢨 + +뢩 +뢩 +뢩 +뢩 +뢩 + +뢪 +뢪 +뢪 +뢪 +뢪 + +뢫 +뢫 +뢫 +뢫 +뢫 + +뢬 +뢬 +뢬 +뢬 +뢬 + +뢭 +뢭 +뢭 +뢭 +뢭 + +뢮 +뢮 +뢮 +뢮 +뢮 + +뢯 +뢯 +뢯 +뢯 +뢯 + +뢰 +뢰 +뢰 +뢰 +뢰 + +뢱 +뢱 +뢱 +뢱 +뢱 + +뢲 +뢲 +뢲 +뢲 +뢲 + +뢳 +뢳 +뢳 +뢳 +뢳 + +뢴 +뢴 +뢴 +뢴 +뢴 + +뢵 +뢵 +뢵 +뢵 +뢵 + +뢶 +뢶 +뢶 +뢶 +뢶 + +뢷 +뢷 +뢷 +뢷 +뢷 + +뢸 +뢸 +뢸 +뢸 +뢸 + +뢹 +뢹 +뢹 +뢹 +뢹 + +뢺 +뢺 +뢺 +뢺 +뢺 + +뢻 +뢻 +뢻 +뢻 +뢻 + +뢼 +뢼 +뢼 +뢼 +뢼 + +뢽 +뢽 +뢽 +뢽 +뢽 + +뢾 +뢾 +뢾 +뢾 +뢾 + +뢿 +뢿 +뢿 +뢿 +뢿 + +룀 +룀 +룀 +룀 +룀 + +룁 +룁 +룁 +룁 +룁 + +룂 +룂 +룂 +룂 +룂 + +룃 +룃 +룃 +룃 +룃 + +룄 +룄 +룄 +룄 +룄 + +룅 +룅 +룅 +룅 +룅 + +룆 +룆 +룆 +룆 +룆 + +룇 +룇 +룇 +룇 +룇 + +룈 +룈 +룈 +룈 +룈 + +룉 +룉 +룉 +룉 +룉 + +룊 +룊 +룊 +룊 +룊 + +룋 +룋 +룋 +룋 +룋 + +료 +료 +료 +료 +료 + +룍 +룍 +룍 +룍 +룍 + +룎 +룎 +룎 +룎 +룎 + +룏 +룏 +룏 +룏 +룏 + +룐 +룐 +룐 +룐 +룐 + +룑 +룑 +룑 +룑 +룑 + +룒 +룒 +룒 +룒 +룒 + +룓 +룓 +룓 +룓 +룓 + +룔 +룔 +룔 +룔 +룔 + +룕 +룕 +룕 +룕 +룕 + +룖 +룖 +룖 +룖 +룖 + +룗 +룗 +룗 +룗 +룗 + +룘 +룘 +룘 +룘 +룘 + +룙 +룙 +룙 +룙 +룙 + +룚 +룚 +룚 +룚 +룚 + +룛 +룛 +룛 +룛 +룛 + +룜 +룜 +룜 +룜 +룜 + +룝 +룝 +룝 +룝 +룝 + +룞 +룞 +룞 +룞 +룞 + +룟 +룟 +룟 +룟 +룟 + +룠 +룠 +룠 +룠 +룠 + +룡 +룡 +룡 +룡 +룡 + +룢 +룢 +룢 +룢 +룢 + +룣 +룣 +룣 +룣 +룣 + +룤 +룤 +룤 +룤 +룤 + +룥 +룥 +룥 +룥 +룥 + +룦 +룦 +룦 +룦 +룦 + +룧 +룧 +룧 +룧 +룧 + +루 +루 +루 +루 +루 + +룩 +룩 +룩 +룩 +룩 + +룪 +룪 +룪 +룪 +룪 + +룫 +룫 +룫 +룫 +룫 + +룬 +룬 +룬 +룬 +룬 + +룭 +룭 +룭 +룭 +룭 + +룮 +룮 +룮 +룮 +룮 + +룯 +룯 +룯 +룯 +룯 + +룰 +룰 +룰 +룰 +룰 + +룱 +룱 +룱 +룱 +룱 + +룲 +룲 +룲 +룲 +룲 + +룳 +룳 +룳 +룳 +룳 + +룴 +룴 +룴 +룴 +룴 + +룵 +룵 +룵 +룵 +룵 + +룶 +룶 +룶 +룶 +룶 + +룷 +룷 +룷 +룷 +룷 + +룸 +룸 +룸 +룸 +룸 + +룹 +룹 +룹 +룹 +룹 + +룺 +룺 +룺 +룺 +룺 + +룻 +룻 +룻 +룻 +룻 + +룼 +룼 +룼 +룼 +룼 + +룽 +룽 +룽 +룽 +룽 + +룾 +룾 +룾 +룾 +룾 + +룿 +룿 +룿 +룿 +룿 + +뤀 +뤀 +뤀 +뤀 +뤀 + +뤁 +뤁 +뤁 +뤁 +뤁 + +뤂 +뤂 +뤂 +뤂 +뤂 + +뤃 +뤃 +뤃 +뤃 +뤃 + +뤄 +뤄 +뤄 +뤄 +뤄 + +뤅 +뤅 +뤅 +뤅 +뤅 + +뤆 +뤆 +뤆 +뤆 +뤆 + +뤇 +뤇 +뤇 +뤇 +뤇 + +뤈 +뤈 +뤈 +뤈 +뤈 + +뤉 +뤉 +뤉 +뤉 +뤉 + +뤊 +뤊 +뤊 +뤊 +뤊 + +뤋 +뤋 +뤋 +뤋 +뤋 + +뤌 +뤌 +뤌 +뤌 +뤌 + +뤍 +뤍 +뤍 +뤍 +뤍 + +뤎 +뤎 +뤎 +뤎 +뤎 + +뤏 +뤏 +뤏 +뤏 +뤏 + +뤐 +뤐 +뤐 +뤐 +뤐 + +뤑 +뤑 +뤑 +뤑 +뤑 + +뤒 +뤒 +뤒 +뤒 +뤒 + +뤓 +뤓 +뤓 +뤓 +뤓 + +뤔 +뤔 +뤔 +뤔 +뤔 + +뤕 +뤕 +뤕 +뤕 +뤕 + +뤖 +뤖 +뤖 +뤖 +뤖 + +뤗 +뤗 +뤗 +뤗 +뤗 + +뤘 +뤘 +뤘 +뤘 +뤘 + +뤙 +뤙 +뤙 +뤙 +뤙 + +뤚 +뤚 +뤚 +뤚 +뤚 + +뤛 +뤛 +뤛 +뤛 +뤛 + +뤜 +뤜 +뤜 +뤜 +뤜 + +뤝 +뤝 +뤝 +뤝 +뤝 + +뤞 +뤞 +뤞 +뤞 +뤞 + +뤟 +뤟 +뤟 +뤟 +뤟 + +뤠 +뤠 +뤠 +뤠 +뤠 + +뤡 +뤡 +뤡 +뤡 +뤡 + +뤢 +뤢 +뤢 +뤢 +뤢 + +뤣 +뤣 +뤣 +뤣 +뤣 + +뤤 +뤤 +뤤 +뤤 +뤤 + +뤥 +뤥 +뤥 +뤥 +뤥 + +뤦 +뤦 +뤦 +뤦 +뤦 + +뤧 +뤧 +뤧 +뤧 +뤧 + +뤨 +뤨 +뤨 +뤨 +뤨 + +뤩 +뤩 +뤩 +뤩 +뤩 + +뤪 +뤪 +뤪 +뤪 +뤪 + +뤫 +뤫 +뤫 +뤫 +뤫 + +뤬 +뤬 +뤬 +뤬 +뤬 + +뤭 +뤭 +뤭 +뤭 +뤭 + +뤮 +뤮 +뤮 +뤮 +뤮 + +뤯 +뤯 +뤯 +뤯 +뤯 + +뤰 +뤰 +뤰 +뤰 +뤰 + +뤱 +뤱 +뤱 +뤱 +뤱 + +뤲 +뤲 +뤲 +뤲 +뤲 + +뤳 +뤳 +뤳 +뤳 +뤳 + +뤴 +뤴 +뤴 +뤴 +뤴 + +뤵 +뤵 +뤵 +뤵 +뤵 + +뤶 +뤶 +뤶 +뤶 +뤶 + +뤷 +뤷 +뤷 +뤷 +뤷 + +뤸 +뤸 +뤸 +뤸 +뤸 + +뤹 +뤹 +뤹 +뤹 +뤹 + +뤺 +뤺 +뤺 +뤺 +뤺 + +뤻 +뤻 +뤻 +뤻 +뤻 + +뤼 +뤼 +뤼 +뤼 +뤼 + +뤽 +뤽 +뤽 +뤽 +뤽 + +뤾 +뤾 +뤾 +뤾 +뤾 + +뤿 +뤿 +뤿 +뤿 +뤿 + +륀 +륀 +륀 +륀 +륀 + +륁 +륁 +륁 +륁 +륁 + +륂 +륂 +륂 +륂 +륂 + +륃 +륃 +륃 +륃 +륃 + +륄 +륄 +륄 +륄 +륄 + +륅 +륅 +륅 +륅 +륅 + +륆 +륆 +륆 +륆 +륆 + +륇 +륇 +륇 +륇 +륇 + +륈 +륈 +륈 +륈 +륈 + +륉 +륉 +륉 +륉 +륉 + +륊 +륊 +륊 +륊 +륊 + +륋 +륋 +륋 +륋 +륋 + +륌 +륌 +륌 +륌 +륌 + +륍 +륍 +륍 +륍 +륍 + +륎 +륎 +륎 +륎 +륎 + +륏 +륏 +륏 +륏 +륏 + +륐 +륐 +륐 +륐 +륐 + +륑 +륑 +륑 +륑 +륑 + +륒 +륒 +륒 +륒 +륒 + +륓 +륓 +륓 +륓 +륓 + +륔 +륔 +륔 +륔 +륔 + +륕 +륕 +륕 +륕 +륕 + +륖 +륖 +륖 +륖 +륖 + +륗 +륗 +륗 +륗 +륗 + +류 +류 +류 +류 +류 + +륙 +륙 +륙 +륙 +륙 + +륚 +륚 +륚 +륚 +륚 + +륛 +륛 +륛 +륛 +륛 + +륜 +륜 +륜 +륜 +륜 + +륝 +륝 +륝 +륝 +륝 + +륞 +륞 +륞 +륞 +륞 + +륟 +륟 +륟 +륟 +륟 + +률 +률 +률 +률 +률 + +륡 +륡 +륡 +륡 +륡 + +륢 +륢 +륢 +륢 +륢 + +륣 +륣 +륣 +륣 +륣 + +륤 +륤 +륤 +륤 +륤 + +륥 +륥 +륥 +륥 +륥 + +륦 +륦 +륦 +륦 +륦 + +륧 +륧 +륧 +륧 +륧 + +륨 +륨 +륨 +륨 +륨 + +륩 +륩 +륩 +륩 +륩 + +륪 +륪 +륪 +륪 +륪 + +륫 +륫 +륫 +륫 +륫 + +륬 +륬 +륬 +륬 +륬 + +륭 +륭 +륭 +륭 +륭 + +륮 +륮 +륮 +륮 +륮 + +륯 +륯 +륯 +륯 +륯 + +륰 +륰 +륰 +륰 +륰 + +륱 +륱 +륱 +륱 +륱 + +륲 +륲 +륲 +륲 +륲 + +륳 +륳 +륳 +륳 +륳 + +르 +르 +르 +르 +르 + +륵 +륵 +륵 +륵 +륵 + +륶 +륶 +륶 +륶 +륶 + +륷 +륷 +륷 +륷 +륷 + +른 +른 +른 +른 +른 + +륹 +륹 +륹 +륹 +륹 + +륺 +륺 +륺 +륺 +륺 + +륻 +륻 +륻 +륻 +륻 + +를 +를 +를 +를 +를 + +륽 +륽 +륽 +륽 +륽 + +륾 +륾 +륾 +륾 +륾 + +륿 +륿 +륿 +륿 +륿 + +릀 +릀 +릀 +릀 +릀 + +릁 +릁 +릁 +릁 +릁 + +릂 +릂 +릂 +릂 +릂 + +릃 +릃 +릃 +릃 +릃 + +름 +름 +름 +름 +름 + +릅 +릅 +릅 +릅 +릅 + +릆 +릆 +릆 +릆 +릆 + +릇 +릇 +릇 +릇 +릇 + +릈 +릈 +릈 +릈 +릈 + +릉 +릉 +릉 +릉 +릉 + +릊 +릊 +릊 +릊 +릊 + +릋 +릋 +릋 +릋 +릋 + +릌 +릌 +릌 +릌 +릌 + +릍 +릍 +릍 +릍 +릍 + +릎 +릎 +릎 +릎 +릎 + +릏 +릏 +릏 +릏 +릏 + +릐 +릐 +릐 +릐 +릐 + +릑 +릑 +릑 +릑 +릑 + +릒 +릒 +릒 +릒 +릒 + +릓 +릓 +릓 +릓 +릓 + +릔 +릔 +릔 +릔 +릔 + +릕 +릕 +릕 +릕 +릕 + +릖 +릖 +릖 +릖 +릖 + +릗 +릗 +릗 +릗 +릗 + +릘 +릘 +릘 +릘 +릘 + +릙 +릙 +릙 +릙 +릙 + +릚 +릚 +릚 +릚 +릚 + +릛 +릛 +릛 +릛 +릛 + +릜 +릜 +릜 +릜 +릜 + +릝 +릝 +릝 +릝 +릝 + +릞 +릞 +릞 +릞 +릞 + +릟 +릟 +릟 +릟 +릟 + +릠 +릠 +릠 +릠 +릠 + +릡 +릡 +릡 +릡 +릡 + +릢 +릢 +릢 +릢 +릢 + +릣 +릣 +릣 +릣 +릣 + +릤 +릤 +릤 +릤 +릤 + +릥 +릥 +릥 +릥 +릥 + +릦 +릦 +릦 +릦 +릦 + +릧 +릧 +릧 +릧 +릧 + +릨 +릨 +릨 +릨 +릨 + +릩 +릩 +릩 +릩 +릩 + +릪 +릪 +릪 +릪 +릪 + +릫 +릫 +릫 +릫 +릫 + +리 +리 +리 +리 +리 + +릭 +릭 +릭 +릭 +릭 + +릮 +릮 +릮 +릮 +릮 + +릯 +릯 +릯 +릯 +릯 + +린 +린 +린 +린 +린 + +릱 +릱 +릱 +릱 +릱 + +릲 +릲 +릲 +릲 +릲 + +릳 +릳 +릳 +릳 +릳 + +릴 +릴 +릴 +릴 +릴 + +릵 +릵 +릵 +릵 +릵 + +릶 +릶 +릶 +릶 +릶 + +릷 +릷 +릷 +릷 +릷 + +릸 +릸 +릸 +릸 +릸 + +릹 +릹 +릹 +릹 +릹 + +릺 +릺 +릺 +릺 +릺 + +릻 +릻 +릻 +릻 +릻 + +림 +림 +림 +림 +림 + +립 +립 +립 +립 +립 + +릾 +릾 +릾 +릾 +릾 + +릿 +릿 +릿 +릿 +릿 + +맀 +맀 +맀 +맀 +맀 + +링 +링 +링 +링 +링 + +맂 +맂 +맂 +맂 +맂 + +맃 +맃 +맃 +맃 +맃 + +맄 +맄 +맄 +맄 +맄 + +맅 +맅 +맅 +맅 +맅 + +맆 +맆 +맆 +맆 +맆 + +맇 +맇 +맇 +맇 +맇 + +마 +마 +마 +마 +마 + +막 +막 +막 +막 +막 + +맊 +맊 +맊 +맊 +맊 + +맋 +맋 +맋 +맋 +맋 + +만 +만 +만 +만 +만 + +맍 +맍 +맍 +맍 +맍 + +많 +많 +많 +많 +많 + +맏 +맏 +맏 +맏 +맏 + +말 +말 +말 +말 +말 + +맑 +맑 +맑 +맑 +맑 + +맒 +맒 +맒 +맒 +맒 + +맓 +맓 +맓 +맓 +맓 + +맔 +맔 +맔 +맔 +맔 + +맕 +맕 +맕 +맕 +맕 + +맖 +맖 +맖 +맖 +맖 + +맗 +맗 +맗 +맗 +맗 + +맘 +맘 +맘 +맘 +맘 + +맙 +맙 +맙 +맙 +맙 + +맚 +맚 +맚 +맚 +맚 + +맛 +맛 +맛 +맛 +맛 + +맜 +맜 +맜 +맜 +맜 + +망 +망 +망 +망 +망 + +맞 +맞 +맞 +맞 +맞 + +맟 +맟 +맟 +맟 +맟 + +맠 +맠 +맠 +맠 +맠 + +맡 +맡 +맡 +맡 +맡 + +맢 +맢 +맢 +맢 +맢 + +맣 +맣 +맣 +맣 +맣 + +매 +매 +매 +매 +매 + +맥 +맥 +맥 +맥 +맥 + +맦 +맦 +맦 +맦 +맦 + +맧 +맧 +맧 +맧 +맧 + +맨 +맨 +맨 +맨 +맨 + +맩 +맩 +맩 +맩 +맩 + +맪 +맪 +맪 +맪 +맪 + +맫 +맫 +맫 +맫 +맫 + +맬 +맬 +맬 +맬 +맬 + +맭 +맭 +맭 +맭 +맭 + +맮 +맮 +맮 +맮 +맮 + +맯 +맯 +맯 +맯 +맯 + +맰 +맰 +맰 +맰 +맰 + +맱 +맱 +맱 +맱 +맱 + +맲 +맲 +맲 +맲 +맲 + +맳 +맳 +맳 +맳 +맳 + +맴 +맴 +맴 +맴 +맴 + +맵 +맵 +맵 +맵 +맵 + +맶 +맶 +맶 +맶 +맶 + +맷 +맷 +맷 +맷 +맷 + +맸 +맸 +맸 +맸 +맸 + +맹 +맹 +맹 +맹 +맹 + +맺 +맺 +맺 +맺 +맺 + +맻 +맻 +맻 +맻 +맻 + +맼 +맼 +맼 +맼 +맼 + +맽 +맽 +맽 +맽 +맽 + +맾 +맾 +맾 +맾 +맾 + +맿 +맿 +맿 +맿 +맿 + +먀 +먀 +먀 +먀 +먀 + +먁 +먁 +먁 +먁 +먁 + +먂 +먂 +먂 +먂 +먂 + +먃 +먃 +먃 +먃 +먃 + +먄 +먄 +먄 +먄 +먄 + +먅 +먅 +먅 +먅 +먅 + +먆 +먆 +먆 +먆 +먆 + +먇 +먇 +먇 +먇 +먇 + +먈 +먈 +먈 +먈 +먈 + +먉 +먉 +먉 +먉 +먉 + +먊 +먊 +먊 +먊 +먊 + +먋 +먋 +먋 +먋 +먋 + +먌 +먌 +먌 +먌 +먌 + +먍 +먍 +먍 +먍 +먍 + +먎 +먎 +먎 +먎 +먎 + +먏 +먏 +먏 +먏 +먏 + +먐 +먐 +먐 +먐 +먐 + +먑 +먑 +먑 +먑 +먑 + +먒 +먒 +먒 +먒 +먒 + +먓 +먓 +먓 +먓 +먓 + +먔 +먔 +먔 +먔 +먔 + +먕 +먕 +먕 +먕 +먕 + +먖 +먖 +먖 +먖 +먖 + +먗 +먗 +먗 +먗 +먗 + +먘 +먘 +먘 +먘 +먘 + +먙 +먙 +먙 +먙 +먙 + +먚 +먚 +먚 +먚 +먚 + +먛 +먛 +먛 +먛 +먛 + +먜 +먜 +먜 +먜 +먜 + +먝 +먝 +먝 +먝 +먝 + +먞 +먞 +먞 +먞 +먞 + +먟 +먟 +먟 +먟 +먟 + +먠 +먠 +먠 +먠 +먠 + +먡 +먡 +먡 +먡 +먡 + +먢 +먢 +먢 +먢 +먢 + +먣 +먣 +먣 +먣 +먣 + +먤 +먤 +먤 +먤 +먤 + +먥 +먥 +먥 +먥 +먥 + +먦 +먦 +먦 +먦 +먦 + +먧 +먧 +먧 +먧 +먧 + +먨 +먨 +먨 +먨 +먨 + +먩 +먩 +먩 +먩 +먩 + +먪 +먪 +먪 +먪 +먪 + +먫 +먫 +먫 +먫 +먫 + +먬 +먬 +먬 +먬 +먬 + +먭 +먭 +먭 +먭 +먭 + +먮 +먮 +먮 +먮 +먮 + +먯 +먯 +먯 +먯 +먯 + +먰 +먰 +먰 +먰 +먰 + +먱 +먱 +먱 +먱 +먱 + +먲 +먲 +먲 +먲 +먲 + +먳 +먳 +먳 +먳 +먳 + +먴 +먴 +먴 +먴 +먴 + +먵 +먵 +먵 +먵 +먵 + +먶 +먶 +먶 +먶 +먶 + +먷 +먷 +먷 +먷 +먷 + +머 +머 +머 +머 +머 + +먹 +먹 +먹 +먹 +먹 + +먺 +먺 +먺 +먺 +먺 + +먻 +먻 +먻 +먻 +먻 + +먼 +먼 +먼 +먼 +먼 + +먽 +먽 +먽 +먽 +먽 + +먾 +먾 +먾 +먾 +먾 + +먿 +먿 +먿 +먿 +먿 + +멀 +멀 +멀 +멀 +멀 + +멁 +멁 +멁 +멁 +멁 + +멂 +멂 +멂 +멂 +멂 + +멃 +멃 +멃 +멃 +멃 + +멄 +멄 +멄 +멄 +멄 + +멅 +멅 +멅 +멅 +멅 + +멆 +멆 +멆 +멆 +멆 + +멇 +멇 +멇 +멇 +멇 + +멈 +멈 +멈 +멈 +멈 + +멉 +멉 +멉 +멉 +멉 + +멊 +멊 +멊 +멊 +멊 + +멋 +멋 +멋 +멋 +멋 + +멌 +멌 +멌 +멌 +멌 + +멍 +멍 +멍 +멍 +멍 + +멎 +멎 +멎 +멎 +멎 + +멏 +멏 +멏 +멏 +멏 + +멐 +멐 +멐 +멐 +멐 + +멑 +멑 +멑 +멑 +멑 + +멒 +멒 +멒 +멒 +멒 + +멓 +멓 +멓 +멓 +멓 + +메 +메 +메 +메 +메 + +멕 +멕 +멕 +멕 +멕 + +멖 +멖 +멖 +멖 +멖 + +멗 +멗 +멗 +멗 +멗 + +멘 +멘 +멘 +멘 +멘 + +멙 +멙 +멙 +멙 +멙 + +멚 +멚 +멚 +멚 +멚 + +멛 +멛 +멛 +멛 +멛 + +멜 +멜 +멜 +멜 +멜 + +멝 +멝 +멝 +멝 +멝 + +멞 +멞 +멞 +멞 +멞 + +멟 +멟 +멟 +멟 +멟 + +멠 +멠 +멠 +멠 +멠 + +멡 +멡 +멡 +멡 +멡 + +멢 +멢 +멢 +멢 +멢 + +멣 +멣 +멣 +멣 +멣 + +멤 +멤 +멤 +멤 +멤 + +멥 +멥 +멥 +멥 +멥 + +멦 +멦 +멦 +멦 +멦 + +멧 +멧 +멧 +멧 +멧 + +멨 +멨 +멨 +멨 +멨 + +멩 +멩 +멩 +멩 +멩 + +멪 +멪 +멪 +멪 +멪 + +멫 +멫 +멫 +멫 +멫 + +멬 +멬 +멬 +멬 +멬 + +멭 +멭 +멭 +멭 +멭 + +멮 +멮 +멮 +멮 +멮 + +멯 +멯 +멯 +멯 +멯 + +며 +며 +며 +며 +며 + +멱 +멱 +멱 +멱 +멱 + +멲 +멲 +멲 +멲 +멲 + +멳 +멳 +멳 +멳 +멳 + +면 +면 +면 +면 +면 + +멵 +멵 +멵 +멵 +멵 + +멶 +멶 +멶 +멶 +멶 + +멷 +멷 +멷 +멷 +멷 + +멸 +멸 +멸 +멸 +멸 + +멹 +멹 +멹 +멹 +멹 + +멺 +멺 +멺 +멺 +멺 + +멻 +멻 +멻 +멻 +멻 + +멼 +멼 +멼 +멼 +멼 + +멽 +멽 +멽 +멽 +멽 + +멾 +멾 +멾 +멾 +멾 + +멿 +멿 +멿 +멿 +멿 + +몀 +몀 +몀 +몀 +몀 + +몁 +몁 +몁 +몁 +몁 + +몂 +몂 +몂 +몂 +몂 + +몃 +몃 +몃 +몃 +몃 + +몄 +몄 +몄 +몄 +몄 + +명 +명 +명 +명 +명 + +몆 +몆 +몆 +몆 +몆 + +몇 +몇 +몇 +몇 +몇 + +몈 +몈 +몈 +몈 +몈 + +몉 +몉 +몉 +몉 +몉 + +몊 +몊 +몊 +몊 +몊 + +몋 +몋 +몋 +몋 +몋 + +몌 +몌 +몌 +몌 +몌 + +몍 +몍 +몍 +몍 +몍 + +몎 +몎 +몎 +몎 +몎 + +몏 +몏 +몏 +몏 +몏 + +몐 +몐 +몐 +몐 +몐 + +몑 +몑 +몑 +몑 +몑 + +몒 +몒 +몒 +몒 +몒 + +몓 +몓 +몓 +몓 +몓 + +몔 +몔 +몔 +몔 +몔 + +몕 +몕 +몕 +몕 +몕 + +몖 +몖 +몖 +몖 +몖 + +몗 +몗 +몗 +몗 +몗 + +몘 +몘 +몘 +몘 +몘 + +몙 +몙 +몙 +몙 +몙 + +몚 +몚 +몚 +몚 +몚 + +몛 +몛 +몛 +몛 +몛 + +몜 +몜 +몜 +몜 +몜 + +몝 +몝 +몝 +몝 +몝 + +몞 +몞 +몞 +몞 +몞 + +몟 +몟 +몟 +몟 +몟 + +몠 +몠 +몠 +몠 +몠 + +몡 +몡 +몡 +몡 +몡 + +몢 +몢 +몢 +몢 +몢 + +몣 +몣 +몣 +몣 +몣 + +몤 +몤 +몤 +몤 +몤 + +몥 +몥 +몥 +몥 +몥 + +몦 +몦 +몦 +몦 +몦 + +몧 +몧 +몧 +몧 +몧 + +모 +모 +모 +모 +모 + +목 +목 +목 +목 +목 + +몪 +몪 +몪 +몪 +몪 + +몫 +몫 +몫 +몫 +몫 + +몬 +몬 +몬 +몬 +몬 + +몭 +몭 +몭 +몭 +몭 + +몮 +몮 +몮 +몮 +몮 + +몯 +몯 +몯 +몯 +몯 + +몰 +몰 +몰 +몰 +몰 + +몱 +몱 +몱 +몱 +몱 + +몲 +몲 +몲 +몲 +몲 + +몳 +몳 +몳 +몳 +몳 + +몴 +몴 +몴 +몴 +몴 + +몵 +몵 +몵 +몵 +몵 + +몶 +몶 +몶 +몶 +몶 + +몷 +몷 +몷 +몷 +몷 + +몸 +몸 +몸 +몸 +몸 + +몹 +몹 +몹 +몹 +몹 + +몺 +몺 +몺 +몺 +몺 + +못 +못 +못 +못 +못 + +몼 +몼 +몼 +몼 +몼 + +몽 +몽 +몽 +몽 +몽 + +몾 +몾 +몾 +몾 +몾 + +몿 +몿 +몿 +몿 +몿 + +뫀 +뫀 +뫀 +뫀 +뫀 + +뫁 +뫁 +뫁 +뫁 +뫁 + +뫂 +뫂 +뫂 +뫂 +뫂 + +뫃 +뫃 +뫃 +뫃 +뫃 + +뫄 +뫄 +뫄 +뫄 +뫄 + +뫅 +뫅 +뫅 +뫅 +뫅 + +뫆 +뫆 +뫆 +뫆 +뫆 + +뫇 +뫇 +뫇 +뫇 +뫇 + +뫈 +뫈 +뫈 +뫈 +뫈 + +뫉 +뫉 +뫉 +뫉 +뫉 + +뫊 +뫊 +뫊 +뫊 +뫊 + +뫋 +뫋 +뫋 +뫋 +뫋 + +뫌 +뫌 +뫌 +뫌 +뫌 + +뫍 +뫍 +뫍 +뫍 +뫍 + +뫎 +뫎 +뫎 +뫎 +뫎 + +뫏 +뫏 +뫏 +뫏 +뫏 + +뫐 +뫐 +뫐 +뫐 +뫐 + +뫑 +뫑 +뫑 +뫑 +뫑 + +뫒 +뫒 +뫒 +뫒 +뫒 + +뫓 +뫓 +뫓 +뫓 +뫓 + +뫔 +뫔 +뫔 +뫔 +뫔 + +뫕 +뫕 +뫕 +뫕 +뫕 + +뫖 +뫖 +뫖 +뫖 +뫖 + +뫗 +뫗 +뫗 +뫗 +뫗 + +뫘 +뫘 +뫘 +뫘 +뫘 + +뫙 +뫙 +뫙 +뫙 +뫙 + +뫚 +뫚 +뫚 +뫚 +뫚 + +뫛 +뫛 +뫛 +뫛 +뫛 + +뫜 +뫜 +뫜 +뫜 +뫜 + +뫝 +뫝 +뫝 +뫝 +뫝 + +뫞 +뫞 +뫞 +뫞 +뫞 + +뫟 +뫟 +뫟 +뫟 +뫟 + +뫠 +뫠 +뫠 +뫠 +뫠 + +뫡 +뫡 +뫡 +뫡 +뫡 + +뫢 +뫢 +뫢 +뫢 +뫢 + +뫣 +뫣 +뫣 +뫣 +뫣 + +뫤 +뫤 +뫤 +뫤 +뫤 + +뫥 +뫥 +뫥 +뫥 +뫥 + +뫦 +뫦 +뫦 +뫦 +뫦 + +뫧 +뫧 +뫧 +뫧 +뫧 + +뫨 +뫨 +뫨 +뫨 +뫨 + +뫩 +뫩 +뫩 +뫩 +뫩 + +뫪 +뫪 +뫪 +뫪 +뫪 + +뫫 +뫫 +뫫 +뫫 +뫫 + +뫬 +뫬 +뫬 +뫬 +뫬 + +뫭 +뫭 +뫭 +뫭 +뫭 + +뫮 +뫮 +뫮 +뫮 +뫮 + +뫯 +뫯 +뫯 +뫯 +뫯 + +뫰 +뫰 +뫰 +뫰 +뫰 + +뫱 +뫱 +뫱 +뫱 +뫱 + +뫲 +뫲 +뫲 +뫲 +뫲 + +뫳 +뫳 +뫳 +뫳 +뫳 + +뫴 +뫴 +뫴 +뫴 +뫴 + +뫵 +뫵 +뫵 +뫵 +뫵 + +뫶 +뫶 +뫶 +뫶 +뫶 + +뫷 +뫷 +뫷 +뫷 +뫷 + +뫸 +뫸 +뫸 +뫸 +뫸 + +뫹 +뫹 +뫹 +뫹 +뫹 + +뫺 +뫺 +뫺 +뫺 +뫺 + +뫻 +뫻 +뫻 +뫻 +뫻 + +뫼 +뫼 +뫼 +뫼 +뫼 + +뫽 +뫽 +뫽 +뫽 +뫽 + +뫾 +뫾 +뫾 +뫾 +뫾 + +뫿 +뫿 +뫿 +뫿 +뫿 + +묀 +묀 +묀 +묀 +묀 + +묁 +묁 +묁 +묁 +묁 + +묂 +묂 +묂 +묂 +묂 + +묃 +묃 +묃 +묃 +묃 + +묄 +묄 +묄 +묄 +묄 + +묅 +묅 +묅 +묅 +묅 + +묆 +묆 +묆 +묆 +묆 + +묇 +묇 +묇 +묇 +묇 + +묈 +묈 +묈 +묈 +묈 + +묉 +묉 +묉 +묉 +묉 + +묊 +묊 +묊 +묊 +묊 + +묋 +묋 +묋 +묋 +묋 + +묌 +묌 +묌 +묌 +묌 + +묍 +묍 +묍 +묍 +묍 + +묎 +묎 +묎 +묎 +묎 + +묏 +묏 +묏 +묏 +묏 + +묐 +묐 +묐 +묐 +묐 + +묑 +묑 +묑 +묑 +묑 + +묒 +묒 +묒 +묒 +묒 + +묓 +묓 +묓 +묓 +묓 + +묔 +묔 +묔 +묔 +묔 + +묕 +묕 +묕 +묕 +묕 + +묖 +묖 +묖 +묖 +묖 + +묗 +묗 +묗 +묗 +묗 + +묘 +묘 +묘 +묘 +묘 + +묙 +묙 +묙 +묙 +묙 + +묚 +묚 +묚 +묚 +묚 + +묛 +묛 +묛 +묛 +묛 + +묜 +묜 +묜 +묜 +묜 + +묝 +묝 +묝 +묝 +묝 + +묞 +묞 +묞 +묞 +묞 + +묟 +묟 +묟 +묟 +묟 + +묠 +묠 +묠 +묠 +묠 + +묡 +묡 +묡 +묡 +묡 + +묢 +묢 +묢 +묢 +묢 + +묣 +묣 +묣 +묣 +묣 + +묤 +묤 +묤 +묤 +묤 + +묥 +묥 +묥 +묥 +묥 + +묦 +묦 +묦 +묦 +묦 + +묧 +묧 +묧 +묧 +묧 + +묨 +묨 +묨 +묨 +묨 + +묩 +묩 +묩 +묩 +묩 + +묪 +묪 +묪 +묪 +묪 + +묫 +묫 +묫 +묫 +묫 + +묬 +묬 +묬 +묬 +묬 + +묭 +묭 +묭 +묭 +묭 + +묮 +묮 +묮 +묮 +묮 + +묯 +묯 +묯 +묯 +묯 + +묰 +묰 +묰 +묰 +묰 + +묱 +묱 +묱 +묱 +묱 + +묲 +묲 +묲 +묲 +묲 + +묳 +묳 +묳 +묳 +묳 + +무 +무 +무 +무 +무 + +묵 +묵 +묵 +묵 +묵 + +묶 +묶 +묶 +묶 +묶 + +묷 +묷 +묷 +묷 +묷 + +문 +문 +문 +문 +문 + +묹 +묹 +묹 +묹 +묹 + +묺 +묺 +묺 +묺 +묺 + +묻 +묻 +묻 +묻 +묻 + +물 +물 +물 +물 +물 + +묽 +묽 +묽 +묽 +묽 + +묾 +묾 +묾 +묾 +묾 + +묿 +묿 +묿 +묿 +묿 + +뭀 +뭀 +뭀 +뭀 +뭀 + +뭁 +뭁 +뭁 +뭁 +뭁 + +뭂 +뭂 +뭂 +뭂 +뭂 + +뭃 +뭃 +뭃 +뭃 +뭃 + +뭄 +뭄 +뭄 +뭄 +뭄 + +뭅 +뭅 +뭅 +뭅 +뭅 + +뭆 +뭆 +뭆 +뭆 +뭆 + +뭇 +뭇 +뭇 +뭇 +뭇 + +뭈 +뭈 +뭈 +뭈 +뭈 + +뭉 +뭉 +뭉 +뭉 +뭉 + +뭊 +뭊 +뭊 +뭊 +뭊 + +뭋 +뭋 +뭋 +뭋 +뭋 + +뭌 +뭌 +뭌 +뭌 +뭌 + +뭍 +뭍 +뭍 +뭍 +뭍 + +뭎 +뭎 +뭎 +뭎 +뭎 + +뭏 +뭏 +뭏 +뭏 +뭏 + +뭐 +뭐 +뭐 +뭐 +뭐 + +뭑 +뭑 +뭑 +뭑 +뭑 + +뭒 +뭒 +뭒 +뭒 +뭒 + +뭓 +뭓 +뭓 +뭓 +뭓 + +뭔 +뭔 +뭔 +뭔 +뭔 + +뭕 +뭕 +뭕 +뭕 +뭕 + +뭖 +뭖 +뭖 +뭖 +뭖 + +뭗 +뭗 +뭗 +뭗 +뭗 + +뭘 +뭘 +뭘 +뭘 +뭘 + +뭙 +뭙 +뭙 +뭙 +뭙 + +뭚 +뭚 +뭚 +뭚 +뭚 + +뭛 +뭛 +뭛 +뭛 +뭛 + +뭜 +뭜 +뭜 +뭜 +뭜 + +뭝 +뭝 +뭝 +뭝 +뭝 + +뭞 +뭞 +뭞 +뭞 +뭞 + +뭟 +뭟 +뭟 +뭟 +뭟 + +뭠 +뭠 +뭠 +뭠 +뭠 + +뭡 +뭡 +뭡 +뭡 +뭡 + +뭢 +뭢 +뭢 +뭢 +뭢 + +뭣 +뭣 +뭣 +뭣 +뭣 + +뭤 +뭤 +뭤 +뭤 +뭤 + +뭥 +뭥 +뭥 +뭥 +뭥 + +뭦 +뭦 +뭦 +뭦 +뭦 + +뭧 +뭧 +뭧 +뭧 +뭧 + +뭨 +뭨 +뭨 +뭨 +뭨 + +뭩 +뭩 +뭩 +뭩 +뭩 + +뭪 +뭪 +뭪 +뭪 +뭪 + +뭫 +뭫 +뭫 +뭫 +뭫 + +뭬 +뭬 +뭬 +뭬 +뭬 + +뭭 +뭭 +뭭 +뭭 +뭭 + +뭮 +뭮 +뭮 +뭮 +뭮 + +뭯 +뭯 +뭯 +뭯 +뭯 + +뭰 +뭰 +뭰 +뭰 +뭰 + +뭱 +뭱 +뭱 +뭱 +뭱 + +뭲 +뭲 +뭲 +뭲 +뭲 + +뭳 +뭳 +뭳 +뭳 +뭳 + +뭴 +뭴 +뭴 +뭴 +뭴 + +뭵 +뭵 +뭵 +뭵 +뭵 + +뭶 +뭶 +뭶 +뭶 +뭶 + +뭷 +뭷 +뭷 +뭷 +뭷 + +뭸 +뭸 +뭸 +뭸 +뭸 + +뭹 +뭹 +뭹 +뭹 +뭹 + +뭺 +뭺 +뭺 +뭺 +뭺 + +뭻 +뭻 +뭻 +뭻 +뭻 + +뭼 +뭼 +뭼 +뭼 +뭼 + +뭽 +뭽 +뭽 +뭽 +뭽 + +뭾 +뭾 +뭾 +뭾 +뭾 + +뭿 +뭿 +뭿 +뭿 +뭿 + +뮀 +뮀 +뮀 +뮀 +뮀 + +뮁 +뮁 +뮁 +뮁 +뮁 + +뮂 +뮂 +뮂 +뮂 +뮂 + +뮃 +뮃 +뮃 +뮃 +뮃 + +뮄 +뮄 +뮄 +뮄 +뮄 + +뮅 +뮅 +뮅 +뮅 +뮅 + +뮆 +뮆 +뮆 +뮆 +뮆 + +뮇 +뮇 +뮇 +뮇 +뮇 + +뮈 +뮈 +뮈 +뮈 +뮈 + +뮉 +뮉 +뮉 +뮉 +뮉 + +뮊 +뮊 +뮊 +뮊 +뮊 + +뮋 +뮋 +뮋 +뮋 +뮋 + +뮌 +뮌 +뮌 +뮌 +뮌 + +뮍 +뮍 +뮍 +뮍 +뮍 + +뮎 +뮎 +뮎 +뮎 +뮎 + +뮏 +뮏 +뮏 +뮏 +뮏 + +뮐 +뮐 +뮐 +뮐 +뮐 + +뮑 +뮑 +뮑 +뮑 +뮑 + +뮒 +뮒 +뮒 +뮒 +뮒 + +뮓 +뮓 +뮓 +뮓 +뮓 + +뮔 +뮔 +뮔 +뮔 +뮔 + +뮕 +뮕 +뮕 +뮕 +뮕 + +뮖 +뮖 +뮖 +뮖 +뮖 + +뮗 +뮗 +뮗 +뮗 +뮗 + +뮘 +뮘 +뮘 +뮘 +뮘 + +뮙 +뮙 +뮙 +뮙 +뮙 + +뮚 +뮚 +뮚 +뮚 +뮚 + +뮛 +뮛 +뮛 +뮛 +뮛 + +뮜 +뮜 +뮜 +뮜 +뮜 + +뮝 +뮝 +뮝 +뮝 +뮝 + +뮞 +뮞 +뮞 +뮞 +뮞 + +뮟 +뮟 +뮟 +뮟 +뮟 + +뮠 +뮠 +뮠 +뮠 +뮠 + +뮡 +뮡 +뮡 +뮡 +뮡 + +뮢 +뮢 +뮢 +뮢 +뮢 + +뮣 +뮣 +뮣 +뮣 +뮣 + +뮤 +뮤 +뮤 +뮤 +뮤 + +뮥 +뮥 +뮥 +뮥 +뮥 + +뮦 +뮦 +뮦 +뮦 +뮦 + +뮧 +뮧 +뮧 +뮧 +뮧 + +뮨 +뮨 +뮨 +뮨 +뮨 + +뮩 +뮩 +뮩 +뮩 +뮩 + +뮪 +뮪 +뮪 +뮪 +뮪 + +뮫 +뮫 +뮫 +뮫 +뮫 + +뮬 +뮬 +뮬 +뮬 +뮬 + +뮭 +뮭 +뮭 +뮭 +뮭 + +뮮 +뮮 +뮮 +뮮 +뮮 + +뮯 +뮯 +뮯 +뮯 +뮯 + +뮰 +뮰 +뮰 +뮰 +뮰 + +뮱 +뮱 +뮱 +뮱 +뮱 + +뮲 +뮲 +뮲 +뮲 +뮲 + +뮳 +뮳 +뮳 +뮳 +뮳 + +뮴 +뮴 +뮴 +뮴 +뮴 + +뮵 +뮵 +뮵 +뮵 +뮵 + +뮶 +뮶 +뮶 +뮶 +뮶 + +뮷 +뮷 +뮷 +뮷 +뮷 + +뮸 +뮸 +뮸 +뮸 +뮸 + +뮹 +뮹 +뮹 +뮹 +뮹 + +뮺 +뮺 +뮺 +뮺 +뮺 + +뮻 +뮻 +뮻 +뮻 +뮻 + +뮼 +뮼 +뮼 +뮼 +뮼 + +뮽 +뮽 +뮽 +뮽 +뮽 + +뮾 +뮾 +뮾 +뮾 +뮾 + +뮿 +뮿 +뮿 +뮿 +뮿 + +므 +므 +므 +므 +므 + +믁 +믁 +믁 +믁 +믁 + +믂 +믂 +믂 +믂 +믂 + +믃 +믃 +믃 +믃 +믃 + +믄 +믄 +믄 +믄 +믄 + +믅 +믅 +믅 +믅 +믅 + +믆 +믆 +믆 +믆 +믆 + +믇 +믇 +믇 +믇 +믇 + +믈 +믈 +믈 +믈 +믈 + +믉 +믉 +믉 +믉 +믉 + +믊 +믊 +믊 +믊 +믊 + +믋 +믋 +믋 +믋 +믋 + +믌 +믌 +믌 +믌 +믌 + +믍 +믍 +믍 +믍 +믍 + +믎 +믎 +믎 +믎 +믎 + +믏 +믏 +믏 +믏 +믏 + +믐 +믐 +믐 +믐 +믐 + +믑 +믑 +믑 +믑 +믑 + +믒 +믒 +믒 +믒 +믒 + +믓 +믓 +믓 +믓 +믓 + +믔 +믔 +믔 +믔 +믔 + +믕 +믕 +믕 +믕 +믕 + +믖 +믖 +믖 +믖 +믖 + +믗 +믗 +믗 +믗 +믗 + +믘 +믘 +믘 +믘 +믘 + +믙 +믙 +믙 +믙 +믙 + +믚 +믚 +믚 +믚 +믚 + +믛 +믛 +믛 +믛 +믛 + +믜 +믜 +믜 +믜 +믜 + +믝 +믝 +믝 +믝 +믝 + +믞 +믞 +믞 +믞 +믞 + +믟 +믟 +믟 +믟 +믟 + +믠 +믠 +믠 +믠 +믠 + +믡 +믡 +믡 +믡 +믡 + +믢 +믢 +믢 +믢 +믢 + +믣 +믣 +믣 +믣 +믣 + +믤 +믤 +믤 +믤 +믤 + +믥 +믥 +믥 +믥 +믥 + +믦 +믦 +믦 +믦 +믦 + +믧 +믧 +믧 +믧 +믧 + +믨 +믨 +믨 +믨 +믨 + +믩 +믩 +믩 +믩 +믩 + +믪 +믪 +믪 +믪 +믪 + +믫 +믫 +믫 +믫 +믫 + +믬 +믬 +믬 +믬 +믬 + +믭 +믭 +믭 +믭 +믭 + +믮 +믮 +믮 +믮 +믮 + +믯 +믯 +믯 +믯 +믯 + +믰 +믰 +믰 +믰 +믰 + +믱 +믱 +믱 +믱 +믱 + +믲 +믲 +믲 +믲 +믲 + +믳 +믳 +믳 +믳 +믳 + +믴 +믴 +믴 +믴 +믴 + +믵 +믵 +믵 +믵 +믵 + +믶 +믶 +믶 +믶 +믶 + +믷 +믷 +믷 +믷 +믷 + +미 +미 +미 +미 +미 + +믹 +믹 +믹 +믹 +믹 + +믺 +믺 +믺 +믺 +믺 + +믻 +믻 +믻 +믻 +믻 + +민 +민 +민 +민 +민 + +믽 +믽 +믽 +믽 +믽 + +믾 +믾 +믾 +믾 +믾 + +믿 +믿 +믿 +믿 +믿 + +밀 +밀 +밀 +밀 +밀 + +밁 +밁 +밁 +밁 +밁 + +밂 +밂 +밂 +밂 +밂 + +밃 +밃 +밃 +밃 +밃 + +밄 +밄 +밄 +밄 +밄 + +밅 +밅 +밅 +밅 +밅 + +밆 +밆 +밆 +밆 +밆 + +밇 +밇 +밇 +밇 +밇 + +밈 +밈 +밈 +밈 +밈 + +밉 +밉 +밉 +밉 +밉 + +밊 +밊 +밊 +밊 +밊 + +밋 +밋 +밋 +밋 +밋 + +밌 +밌 +밌 +밌 +밌 + +밍 +밍 +밍 +밍 +밍 + +밎 +밎 +밎 +밎 +밎 + +및 +및 +및 +및 +및 + +밐 +밐 +밐 +밐 +밐 + +밑 +밑 +밑 +밑 +밑 + +밒 +밒 +밒 +밒 +밒 + +밓 +밓 +밓 +밓 +밓 + +바 +바 +바 +바 +바 + +박 +박 +박 +박 +박 + +밖 +밖 +밖 +밖 +밖 + +밗 +밗 +밗 +밗 +밗 + +반 +반 +반 +반 +반 + +밙 +밙 +밙 +밙 +밙 + +밚 +밚 +밚 +밚 +밚 + +받 +받 +받 +받 +받 + +발 +발 +발 +발 +발 + +밝 +밝 +밝 +밝 +밝 + +밞 +밞 +밞 +밞 +밞 + +밟 +밟 +밟 +밟 +밟 + +밠 +밠 +밠 +밠 +밠 + +밡 +밡 +밡 +밡 +밡 + +밢 +밢 +밢 +밢 +밢 + +밣 +밣 +밣 +밣 +밣 + +밤 +밤 +밤 +밤 +밤 + +밥 +밥 +밥 +밥 +밥 + +밦 +밦 +밦 +밦 +밦 + +밧 +밧 +밧 +밧 +밧 + +밨 +밨 +밨 +밨 +밨 + +방 +방 +방 +방 +방 + +밪 +밪 +밪 +밪 +밪 + +밫 +밫 +밫 +밫 +밫 + +밬 +밬 +밬 +밬 +밬 + +밭 +밭 +밭 +밭 +밭 + +밮 +밮 +밮 +밮 +밮 + +밯 +밯 +밯 +밯 +밯 + +배 +배 +배 +배 +배 + +백 +백 +백 +백 +백 + +밲 +밲 +밲 +밲 +밲 + +밳 +밳 +밳 +밳 +밳 + +밴 +밴 +밴 +밴 +밴 + +밵 +밵 +밵 +밵 +밵 + +밶 +밶 +밶 +밶 +밶 + +밷 +밷 +밷 +밷 +밷 + +밸 +밸 +밸 +밸 +밸 + +밹 +밹 +밹 +밹 +밹 + +밺 +밺 +밺 +밺 +밺 + +밻 +밻 +밻 +밻 +밻 + +밼 +밼 +밼 +밼 +밼 + +밽 +밽 +밽 +밽 +밽 + +밾 +밾 +밾 +밾 +밾 + +밿 +밿 +밿 +밿 +밿 + +뱀 +뱀 +뱀 +뱀 +뱀 + +뱁 +뱁 +뱁 +뱁 +뱁 + +뱂 +뱂 +뱂 +뱂 +뱂 + +뱃 +뱃 +뱃 +뱃 +뱃 + +뱄 +뱄 +뱄 +뱄 +뱄 + +뱅 +뱅 +뱅 +뱅 +뱅 + +뱆 +뱆 +뱆 +뱆 +뱆 + +뱇 +뱇 +뱇 +뱇 +뱇 + +뱈 +뱈 +뱈 +뱈 +뱈 + +뱉 +뱉 +뱉 +뱉 +뱉 + +뱊 +뱊 +뱊 +뱊 +뱊 + +뱋 +뱋 +뱋 +뱋 +뱋 + +뱌 +뱌 +뱌 +뱌 +뱌 + +뱍 +뱍 +뱍 +뱍 +뱍 + +뱎 +뱎 +뱎 +뱎 +뱎 + +뱏 +뱏 +뱏 +뱏 +뱏 + +뱐 +뱐 +뱐 +뱐 +뱐 + +뱑 +뱑 +뱑 +뱑 +뱑 + +뱒 +뱒 +뱒 +뱒 +뱒 + +뱓 +뱓 +뱓 +뱓 +뱓 + +뱔 +뱔 +뱔 +뱔 +뱔 + +뱕 +뱕 +뱕 +뱕 +뱕 + +뱖 +뱖 +뱖 +뱖 +뱖 + +뱗 +뱗 +뱗 +뱗 +뱗 + +뱘 +뱘 +뱘 +뱘 +뱘 + +뱙 +뱙 +뱙 +뱙 +뱙 + +뱚 +뱚 +뱚 +뱚 +뱚 + +뱛 +뱛 +뱛 +뱛 +뱛 + +뱜 +뱜 +뱜 +뱜 +뱜 + +뱝 +뱝 +뱝 +뱝 +뱝 + +뱞 +뱞 +뱞 +뱞 +뱞 + +뱟 +뱟 +뱟 +뱟 +뱟 + +뱠 +뱠 +뱠 +뱠 +뱠 + +뱡 +뱡 +뱡 +뱡 +뱡 + +뱢 +뱢 +뱢 +뱢 +뱢 + +뱣 +뱣 +뱣 +뱣 +뱣 + +뱤 +뱤 +뱤 +뱤 +뱤 + +뱥 +뱥 +뱥 +뱥 +뱥 + +뱦 +뱦 +뱦 +뱦 +뱦 + +뱧 +뱧 +뱧 +뱧 +뱧 + +뱨 +뱨 +뱨 +뱨 +뱨 + +뱩 +뱩 +뱩 +뱩 +뱩 + +뱪 +뱪 +뱪 +뱪 +뱪 + +뱫 +뱫 +뱫 +뱫 +뱫 + +뱬 +뱬 +뱬 +뱬 +뱬 + +뱭 +뱭 +뱭 +뱭 +뱭 + +뱮 +뱮 +뱮 +뱮 +뱮 + +뱯 +뱯 +뱯 +뱯 +뱯 + +뱰 +뱰 +뱰 +뱰 +뱰 + +뱱 +뱱 +뱱 +뱱 +뱱 + +뱲 +뱲 +뱲 +뱲 +뱲 + +뱳 +뱳 +뱳 +뱳 +뱳 + +뱴 +뱴 +뱴 +뱴 +뱴 + +뱵 +뱵 +뱵 +뱵 +뱵 + +뱶 +뱶 +뱶 +뱶 +뱶 + +뱷 +뱷 +뱷 +뱷 +뱷 + +뱸 +뱸 +뱸 +뱸 +뱸 + +뱹 +뱹 +뱹 +뱹 +뱹 + +뱺 +뱺 +뱺 +뱺 +뱺 + +뱻 +뱻 +뱻 +뱻 +뱻 + +뱼 +뱼 +뱼 +뱼 +뱼 + +뱽 +뱽 +뱽 +뱽 +뱽 + +뱾 +뱾 +뱾 +뱾 +뱾 + +뱿 +뱿 +뱿 +뱿 +뱿 + +벀 +벀 +벀 +벀 +벀 + +벁 +벁 +벁 +벁 +벁 + +벂 +벂 +벂 +벂 +벂 + +벃 +벃 +벃 +벃 +벃 + +버 +버 +버 +버 +버 + +벅 +벅 +벅 +벅 +벅 + +벆 +벆 +벆 +벆 +벆 + +벇 +벇 +벇 +벇 +벇 + +번 +번 +번 +번 +번 + +벉 +벉 +벉 +벉 +벉 + +벊 +벊 +벊 +벊 +벊 + +벋 +벋 +벋 +벋 +벋 + +벌 +벌 +벌 +벌 +벌 + +벍 +벍 +벍 +벍 +벍 + +벎 +벎 +벎 +벎 +벎 + +벏 +벏 +벏 +벏 +벏 + +벐 +벐 +벐 +벐 +벐 + +벑 +벑 +벑 +벑 +벑 + +벒 +벒 +벒 +벒 +벒 + +벓 +벓 +벓 +벓 +벓 + +범 +범 +범 +범 +범 + +법 +법 +법 +법 +법 + +벖 +벖 +벖 +벖 +벖 + +벗 +벗 +벗 +벗 +벗 + +벘 +벘 +벘 +벘 +벘 + +벙 +벙 +벙 +벙 +벙 + +벚 +벚 +벚 +벚 +벚 + +벛 +벛 +벛 +벛 +벛 + +벜 +벜 +벜 +벜 +벜 + +벝 +벝 +벝 +벝 +벝 + +벞 +벞 +벞 +벞 +벞 + +벟 +벟 +벟 +벟 +벟 + +베 +베 +베 +베 +베 + +벡 +벡 +벡 +벡 +벡 + +벢 +벢 +벢 +벢 +벢 + +벣 +벣 +벣 +벣 +벣 + +벤 +벤 +벤 +벤 +벤 + +벥 +벥 +벥 +벥 +벥 + +벦 +벦 +벦 +벦 +벦 + +벧 +벧 +벧 +벧 +벧 + +벨 +벨 +벨 +벨 +벨 + +벩 +벩 +벩 +벩 +벩 + +벪 +벪 +벪 +벪 +벪 + +벫 +벫 +벫 +벫 +벫 + +벬 +벬 +벬 +벬 +벬 + +벭 +벭 +벭 +벭 +벭 + +벮 +벮 +벮 +벮 +벮 + +벯 +벯 +벯 +벯 +벯 + +벰 +벰 +벰 +벰 +벰 + +벱 +벱 +벱 +벱 +벱 + +벲 +벲 +벲 +벲 +벲 + +벳 +벳 +벳 +벳 +벳 + +벴 +벴 +벴 +벴 +벴 + +벵 +벵 +벵 +벵 +벵 + +벶 +벶 +벶 +벶 +벶 + +벷 +벷 +벷 +벷 +벷 + +벸 +벸 +벸 +벸 +벸 + +벹 +벹 +벹 +벹 +벹 + +벺 +벺 +벺 +벺 +벺 + +벻 +벻 +벻 +벻 +벻 + +벼 +벼 +벼 +벼 +벼 + +벽 +벽 +벽 +벽 +벽 + +벾 +벾 +벾 +벾 +벾 + +벿 +벿 +벿 +벿 +벿 + +변 +변 +변 +변 +변 + +볁 +볁 +볁 +볁 +볁 + +볂 +볂 +볂 +볂 +볂 + +볃 +볃 +볃 +볃 +볃 + +별 +별 +별 +별 +별 + +볅 +볅 +볅 +볅 +볅 + +볆 +볆 +볆 +볆 +볆 + +볇 +볇 +볇 +볇 +볇 + +볈 +볈 +볈 +볈 +볈 + +볉 +볉 +볉 +볉 +볉 + +볊 +볊 +볊 +볊 +볊 + +볋 +볋 +볋 +볋 +볋 + +볌 +볌 +볌 +볌 +볌 + +볍 +볍 +볍 +볍 +볍 + +볎 +볎 +볎 +볎 +볎 + +볏 +볏 +볏 +볏 +볏 + +볐 +볐 +볐 +볐 +볐 + +병 +병 +병 +병 +병 + +볒 +볒 +볒 +볒 +볒 + +볓 +볓 +볓 +볓 +볓 + +볔 +볔 +볔 +볔 +볔 + +볕 +볕 +볕 +볕 +볕 + +볖 +볖 +볖 +볖 +볖 + +볗 +볗 +볗 +볗 +볗 + +볘 +볘 +볘 +볘 +볘 + +볙 +볙 +볙 +볙 +볙 + +볚 +볚 +볚 +볚 +볚 + +볛 +볛 +볛 +볛 +볛 + +볜 +볜 +볜 +볜 +볜 + +볝 +볝 +볝 +볝 +볝 + +볞 +볞 +볞 +볞 +볞 + +볟 +볟 +볟 +볟 +볟 + +볠 +볠 +볠 +볠 +볠 + +볡 +볡 +볡 +볡 +볡 + +볢 +볢 +볢 +볢 +볢 + +볣 +볣 +볣 +볣 +볣 + +볤 +볤 +볤 +볤 +볤 + +볥 +볥 +볥 +볥 +볥 + +볦 +볦 +볦 +볦 +볦 + +볧 +볧 +볧 +볧 +볧 + +볨 +볨 +볨 +볨 +볨 + +볩 +볩 +볩 +볩 +볩 + +볪 +볪 +볪 +볪 +볪 + +볫 +볫 +볫 +볫 +볫 + +볬 +볬 +볬 +볬 +볬 + +볭 +볭 +볭 +볭 +볭 + +볮 +볮 +볮 +볮 +볮 + +볯 +볯 +볯 +볯 +볯 + +볰 +볰 +볰 +볰 +볰 + +볱 +볱 +볱 +볱 +볱 + +볲 +볲 +볲 +볲 +볲 + +볳 +볳 +볳 +볳 +볳 + +보 +보 +보 +보 +보 + +복 +복 +복 +복 +복 + +볶 +볶 +볶 +볶 +볶 + +볷 +볷 +볷 +볷 +볷 + +본 +본 +본 +본 +본 + +볹 +볹 +볹 +볹 +볹 + +볺 +볺 +볺 +볺 +볺 + +볻 +볻 +볻 +볻 +볻 + +볼 +볼 +볼 +볼 +볼 + +볽 +볽 +볽 +볽 +볽 + +볾 +볾 +볾 +볾 +볾 + +볿 +볿 +볿 +볿 +볿 + +봀 +봀 +봀 +봀 +봀 + +봁 +봁 +봁 +봁 +봁 + +봂 +봂 +봂 +봂 +봂 + +봃 +봃 +봃 +봃 +봃 + +봄 +봄 +봄 +봄 +봄 + +봅 +봅 +봅 +봅 +봅 + +봆 +봆 +봆 +봆 +봆 + +봇 +봇 +봇 +봇 +봇 + +봈 +봈 +봈 +봈 +봈 + +봉 +봉 +봉 +봉 +봉 + +봊 +봊 +봊 +봊 +봊 + +봋 +봋 +봋 +봋 +봋 + +봌 +봌 +봌 +봌 +봌 + +봍 +봍 +봍 +봍 +봍 + +봎 +봎 +봎 +봎 +봎 + +봏 +봏 +봏 +봏 +봏 + +봐 +봐 +봐 +봐 +봐 + +봑 +봑 +봑 +봑 +봑 + +봒 +봒 +봒 +봒 +봒 + +봓 +봓 +봓 +봓 +봓 + +봔 +봔 +봔 +봔 +봔 + +봕 +봕 +봕 +봕 +봕 + +봖 +봖 +봖 +봖 +봖 + +봗 +봗 +봗 +봗 +봗 + +봘 +봘 +봘 +봘 +봘 + +봙 +봙 +봙 +봙 +봙 + +봚 +봚 +봚 +봚 +봚 + +봛 +봛 +봛 +봛 +봛 + +봜 +봜 +봜 +봜 +봜 + +봝 +봝 +봝 +봝 +봝 + +봞 +봞 +봞 +봞 +봞 + +봟 +봟 +봟 +봟 +봟 + +봠 +봠 +봠 +봠 +봠 + +봡 +봡 +봡 +봡 +봡 + +봢 +봢 +봢 +봢 +봢 + +봣 +봣 +봣 +봣 +봣 + +봤 +봤 +봤 +봤 +봤 + +봥 +봥 +봥 +봥 +봥 + +봦 +봦 +봦 +봦 +봦 + +봧 +봧 +봧 +봧 +봧 + +봨 +봨 +봨 +봨 +봨 + +봩 +봩 +봩 +봩 +봩 + +봪 +봪 +봪 +봪 +봪 + +봫 +봫 +봫 +봫 +봫 + +봬 +봬 +봬 +봬 +봬 + +봭 +봭 +봭 +봭 +봭 + +봮 +봮 +봮 +봮 +봮 + +봯 +봯 +봯 +봯 +봯 + +봰 +봰 +봰 +봰 +봰 + +봱 +봱 +봱 +봱 +봱 + +봲 +봲 +봲 +봲 +봲 + +봳 +봳 +봳 +봳 +봳 + +봴 +봴 +봴 +봴 +봴 + +봵 +봵 +봵 +봵 +봵 + +봶 +봶 +봶 +봶 +봶 + +봷 +봷 +봷 +봷 +봷 + +봸 +봸 +봸 +봸 +봸 + +봹 +봹 +봹 +봹 +봹 + +봺 +봺 +봺 +봺 +봺 + +봻 +봻 +봻 +봻 +봻 + +봼 +봼 +봼 +봼 +봼 + +봽 +봽 +봽 +봽 +봽 + +봾 +봾 +봾 +봾 +봾 + +봿 +봿 +봿 +봿 +봿 + +뵀 +뵀 +뵀 +뵀 +뵀 + +뵁 +뵁 +뵁 +뵁 +뵁 + +뵂 +뵂 +뵂 +뵂 +뵂 + +뵃 +뵃 +뵃 +뵃 +뵃 + +뵄 +뵄 +뵄 +뵄 +뵄 + +뵅 +뵅 +뵅 +뵅 +뵅 + +뵆 +뵆 +뵆 +뵆 +뵆 + +뵇 +뵇 +뵇 +뵇 +뵇 + +뵈 +뵈 +뵈 +뵈 +뵈 + +뵉 +뵉 +뵉 +뵉 +뵉 + +뵊 +뵊 +뵊 +뵊 +뵊 + +뵋 +뵋 +뵋 +뵋 +뵋 + +뵌 +뵌 +뵌 +뵌 +뵌 + +뵍 +뵍 +뵍 +뵍 +뵍 + +뵎 +뵎 +뵎 +뵎 +뵎 + +뵏 +뵏 +뵏 +뵏 +뵏 + +뵐 +뵐 +뵐 +뵐 +뵐 + +뵑 +뵑 +뵑 +뵑 +뵑 + +뵒 +뵒 +뵒 +뵒 +뵒 + +뵓 +뵓 +뵓 +뵓 +뵓 + +뵔 +뵔 +뵔 +뵔 +뵔 + +뵕 +뵕 +뵕 +뵕 +뵕 + +뵖 +뵖 +뵖 +뵖 +뵖 + +뵗 +뵗 +뵗 +뵗 +뵗 + +뵘 +뵘 +뵘 +뵘 +뵘 + +뵙 +뵙 +뵙 +뵙 +뵙 + +뵚 +뵚 +뵚 +뵚 +뵚 + +뵛 +뵛 +뵛 +뵛 +뵛 + +뵜 +뵜 +뵜 +뵜 +뵜 + +뵝 +뵝 +뵝 +뵝 +뵝 + +뵞 +뵞 +뵞 +뵞 +뵞 + +뵟 +뵟 +뵟 +뵟 +뵟 + +뵠 +뵠 +뵠 +뵠 +뵠 + +뵡 +뵡 +뵡 +뵡 +뵡 + +뵢 +뵢 +뵢 +뵢 +뵢 + +뵣 +뵣 +뵣 +뵣 +뵣 + +뵤 +뵤 +뵤 +뵤 +뵤 + +뵥 +뵥 +뵥 +뵥 +뵥 + +뵦 +뵦 +뵦 +뵦 +뵦 + +뵧 +뵧 +뵧 +뵧 +뵧 + +뵨 +뵨 +뵨 +뵨 +뵨 + +뵩 +뵩 +뵩 +뵩 +뵩 + +뵪 +뵪 +뵪 +뵪 +뵪 + +뵫 +뵫 +뵫 +뵫 +뵫 + +뵬 +뵬 +뵬 +뵬 +뵬 + +뵭 +뵭 +뵭 +뵭 +뵭 + +뵮 +뵮 +뵮 +뵮 +뵮 + +뵯 +뵯 +뵯 +뵯 +뵯 + +뵰 +뵰 +뵰 +뵰 +뵰 + +뵱 +뵱 +뵱 +뵱 +뵱 + +뵲 +뵲 +뵲 +뵲 +뵲 + +뵳 +뵳 +뵳 +뵳 +뵳 + +뵴 +뵴 +뵴 +뵴 +뵴 + +뵵 +뵵 +뵵 +뵵 +뵵 + +뵶 +뵶 +뵶 +뵶 +뵶 + +뵷 +뵷 +뵷 +뵷 +뵷 + +뵸 +뵸 +뵸 +뵸 +뵸 + +뵹 +뵹 +뵹 +뵹 +뵹 + +뵺 +뵺 +뵺 +뵺 +뵺 + +뵻 +뵻 +뵻 +뵻 +뵻 + +뵼 +뵼 +뵼 +뵼 +뵼 + +뵽 +뵽 +뵽 +뵽 +뵽 + +뵾 +뵾 +뵾 +뵾 +뵾 + +뵿 +뵿 +뵿 +뵿 +뵿 + +부 +부 +부 +부 +부 + +북 +북 +북 +북 +북 + +붂 +붂 +붂 +붂 +붂 + +붃 +붃 +붃 +붃 +붃 + +분 +분 +분 +분 +분 + +붅 +붅 +붅 +붅 +붅 + +붆 +붆 +붆 +붆 +붆 + +붇 +붇 +붇 +붇 +붇 + +불 +불 +불 +불 +불 + +붉 +붉 +붉 +붉 +붉 + +붊 +붊 +붊 +붊 +붊 + +붋 +붋 +붋 +붋 +붋 + +붌 +붌 +붌 +붌 +붌 + +붍 +붍 +붍 +붍 +붍 + +붎 +붎 +붎 +붎 +붎 + +붏 +붏 +붏 +붏 +붏 + +붐 +붐 +붐 +붐 +붐 + +붑 +붑 +붑 +붑 +붑 + +붒 +붒 +붒 +붒 +붒 + +붓 +붓 +붓 +붓 +붓 + +붔 +붔 +붔 +붔 +붔 + +붕 +붕 +붕 +붕 +붕 + +붖 +붖 +붖 +붖 +붖 + +붗 +붗 +붗 +붗 +붗 + +붘 +붘 +붘 +붘 +붘 + +붙 +붙 +붙 +붙 +붙 + +붚 +붚 +붚 +붚 +붚 + +붛 +붛 +붛 +붛 +붛 + +붜 +붜 +붜 +붜 +붜 + +붝 +붝 +붝 +붝 +붝 + +붞 +붞 +붞 +붞 +붞 + +붟 +붟 +붟 +붟 +붟 + +붠 +붠 +붠 +붠 +붠 + +붡 +붡 +붡 +붡 +붡 + +붢 +붢 +붢 +붢 +붢 + +붣 +붣 +붣 +붣 +붣 + +붤 +붤 +붤 +붤 +붤 + +붥 +붥 +붥 +붥 +붥 + +붦 +붦 +붦 +붦 +붦 + +붧 +붧 +붧 +붧 +붧 + +붨 +붨 +붨 +붨 +붨 + +붩 +붩 +붩 +붩 +붩 + +붪 +붪 +붪 +붪 +붪 + +붫 +붫 +붫 +붫 +붫 + +붬 +붬 +붬 +붬 +붬 + +붭 +붭 +붭 +붭 +붭 + +붮 +붮 +붮 +붮 +붮 + +붯 +붯 +붯 +붯 +붯 + +붰 +붰 +붰 +붰 +붰 + +붱 +붱 +붱 +붱 +붱 + +붲 +붲 +붲 +붲 +붲 + +붳 +붳 +붳 +붳 +붳 + +붴 +붴 +붴 +붴 +붴 + +붵 +붵 +붵 +붵 +붵 + +붶 +붶 +붶 +붶 +붶 + +붷 +붷 +붷 +붷 +붷 + +붸 +붸 +붸 +붸 +붸 + +붹 +붹 +붹 +붹 +붹 + +붺 +붺 +붺 +붺 +붺 + +붻 +붻 +붻 +붻 +붻 + +붼 +붼 +붼 +붼 +붼 + +붽 +붽 +붽 +붽 +붽 + +붾 +붾 +붾 +붾 +붾 + +붿 +붿 +붿 +붿 +붿 + +뷀 +뷀 +뷀 +뷀 +뷀 + +뷁 +뷁 +뷁 +뷁 +뷁 + +뷂 +뷂 +뷂 +뷂 +뷂 + +뷃 +뷃 +뷃 +뷃 +뷃 + +뷄 +뷄 +뷄 +뷄 +뷄 + +뷅 +뷅 +뷅 +뷅 +뷅 + +뷆 +뷆 +뷆 +뷆 +뷆 + +뷇 +뷇 +뷇 +뷇 +뷇 + +뷈 +뷈 +뷈 +뷈 +뷈 + +뷉 +뷉 +뷉 +뷉 +뷉 + +뷊 +뷊 +뷊 +뷊 +뷊 + +뷋 +뷋 +뷋 +뷋 +뷋 + +뷌 +뷌 +뷌 +뷌 +뷌 + +뷍 +뷍 +뷍 +뷍 +뷍 + +뷎 +뷎 +뷎 +뷎 +뷎 + +뷏 +뷏 +뷏 +뷏 +뷏 + +뷐 +뷐 +뷐 +뷐 +뷐 + +뷑 +뷑 +뷑 +뷑 +뷑 + +뷒 +뷒 +뷒 +뷒 +뷒 + +뷓 +뷓 +뷓 +뷓 +뷓 + +뷔 +뷔 +뷔 +뷔 +뷔 + +뷕 +뷕 +뷕 +뷕 +뷕 + +뷖 +뷖 +뷖 +뷖 +뷖 + +뷗 +뷗 +뷗 +뷗 +뷗 + +뷘 +뷘 +뷘 +뷘 +뷘 + +뷙 +뷙 +뷙 +뷙 +뷙 + +뷚 +뷚 +뷚 +뷚 +뷚 + +뷛 +뷛 +뷛 +뷛 +뷛 + +뷜 +뷜 +뷜 +뷜 +뷜 + +뷝 +뷝 +뷝 +뷝 +뷝 + +뷞 +뷞 +뷞 +뷞 +뷞 + +뷟 +뷟 +뷟 +뷟 +뷟 + +뷠 +뷠 +뷠 +뷠 +뷠 + +뷡 +뷡 +뷡 +뷡 +뷡 + +뷢 +뷢 +뷢 +뷢 +뷢 + +뷣 +뷣 +뷣 +뷣 +뷣 + +뷤 +뷤 +뷤 +뷤 +뷤 + +뷥 +뷥 +뷥 +뷥 +뷥 + +뷦 +뷦 +뷦 +뷦 +뷦 + +뷧 +뷧 +뷧 +뷧 +뷧 + +뷨 +뷨 +뷨 +뷨 +뷨 + +뷩 +뷩 +뷩 +뷩 +뷩 + +뷪 +뷪 +뷪 +뷪 +뷪 + +뷫 +뷫 +뷫 +뷫 +뷫 + +뷬 +뷬 +뷬 +뷬 +뷬 + +뷭 +뷭 +뷭 +뷭 +뷭 + +뷮 +뷮 +뷮 +뷮 +뷮 + +뷯 +뷯 +뷯 +뷯 +뷯 + +뷰 +뷰 +뷰 +뷰 +뷰 + +뷱 +뷱 +뷱 +뷱 +뷱 + +뷲 +뷲 +뷲 +뷲 +뷲 + +뷳 +뷳 +뷳 +뷳 +뷳 + +뷴 +뷴 +뷴 +뷴 +뷴 + +뷵 +뷵 +뷵 +뷵 +뷵 + +뷶 +뷶 +뷶 +뷶 +뷶 + +뷷 +뷷 +뷷 +뷷 +뷷 + +뷸 +뷸 +뷸 +뷸 +뷸 + +뷹 +뷹 +뷹 +뷹 +뷹 + +뷺 +뷺 +뷺 +뷺 +뷺 + +뷻 +뷻 +뷻 +뷻 +뷻 + +뷼 +뷼 +뷼 +뷼 +뷼 + +뷽 +뷽 +뷽 +뷽 +뷽 + +뷾 +뷾 +뷾 +뷾 +뷾 + +뷿 +뷿 +뷿 +뷿 +뷿 + +븀 +븀 +븀 +븀 +븀 + +븁 +븁 +븁 +븁 +븁 + +븂 +븂 +븂 +븂 +븂 + +븃 +븃 +븃 +븃 +븃 + +븄 +븄 +븄 +븄 +븄 + +븅 +븅 +븅 +븅 +븅 + +븆 +븆 +븆 +븆 +븆 + +븇 +븇 +븇 +븇 +븇 + +븈 +븈 +븈 +븈 +븈 + +븉 +븉 +븉 +븉 +븉 + +븊 +븊 +븊 +븊 +븊 + +븋 +븋 +븋 +븋 +븋 + +브 +브 +브 +브 +브 + +븍 +븍 +븍 +븍 +븍 + +븎 +븎 +븎 +븎 +븎 + +븏 +븏 +븏 +븏 +븏 + +븐 +븐 +븐 +븐 +븐 + +븑 +븑 +븑 +븑 +븑 + +븒 +븒 +븒 +븒 +븒 + +븓 +븓 +븓 +븓 +븓 + +블 +블 +블 +블 +블 + +븕 +븕 +븕 +븕 +븕 + +븖 +븖 +븖 +븖 +븖 + +븗 +븗 +븗 +븗 +븗 + +븘 +븘 +븘 +븘 +븘 + +븙 +븙 +븙 +븙 +븙 + +븚 +븚 +븚 +븚 +븚 + +븛 +븛 +븛 +븛 +븛 + +븜 +븜 +븜 +븜 +븜 + +븝 +븝 +븝 +븝 +븝 + +븞 +븞 +븞 +븞 +븞 + +븟 +븟 +븟 +븟 +븟 + +븠 +븠 +븠 +븠 +븠 + +븡 +븡 +븡 +븡 +븡 + +븢 +븢 +븢 +븢 +븢 + +븣 +븣 +븣 +븣 +븣 + +븤 +븤 +븤 +븤 +븤 + +븥 +븥 +븥 +븥 +븥 + +븦 +븦 +븦 +븦 +븦 + +븧 +븧 +븧 +븧 +븧 + +븨 +븨 +븨 +븨 +븨 + +븩 +븩 +븩 +븩 +븩 + +븪 +븪 +븪 +븪 +븪 + +븫 +븫 +븫 +븫 +븫 + +븬 +븬 +븬 +븬 +븬 + +븭 +븭 +븭 +븭 +븭 + +븮 +븮 +븮 +븮 +븮 + +븯 +븯 +븯 +븯 +븯 + +븰 +븰 +븰 +븰 +븰 + +븱 +븱 +븱 +븱 +븱 + +븲 +븲 +븲 +븲 +븲 + +븳 +븳 +븳 +븳 +븳 + +븴 +븴 +븴 +븴 +븴 + +븵 +븵 +븵 +븵 +븵 + +븶 +븶 +븶 +븶 +븶 + +븷 +븷 +븷 +븷 +븷 + +븸 +븸 +븸 +븸 +븸 + +븹 +븹 +븹 +븹 +븹 + +븺 +븺 +븺 +븺 +븺 + +븻 +븻 +븻 +븻 +븻 + +븼 +븼 +븼 +븼 +븼 + +븽 +븽 +븽 +븽 +븽 + +븾 +븾 +븾 +븾 +븾 + +븿 +븿 +븿 +븿 +븿 + +빀 +빀 +빀 +빀 +빀 + +빁 +빁 +빁 +빁 +빁 + +빂 +빂 +빂 +빂 +빂 + +빃 +빃 +빃 +빃 +빃 + +비 +비 +비 +비 +비 + +빅 +빅 +빅 +빅 +빅 + +빆 +빆 +빆 +빆 +빆 + +빇 +빇 +빇 +빇 +빇 + +빈 +빈 +빈 +빈 +빈 + +빉 +빉 +빉 +빉 +빉 + +빊 +빊 +빊 +빊 +빊 + +빋 +빋 +빋 +빋 +빋 + +빌 +빌 +빌 +빌 +빌 + +빍 +빍 +빍 +빍 +빍 + +빎 +빎 +빎 +빎 +빎 + +빏 +빏 +빏 +빏 +빏 + +빐 +빐 +빐 +빐 +빐 + +빑 +빑 +빑 +빑 +빑 + +빒 +빒 +빒 +빒 +빒 + +빓 +빓 +빓 +빓 +빓 + +빔 +빔 +빔 +빔 +빔 + +빕 +빕 +빕 +빕 +빕 + +빖 +빖 +빖 +빖 +빖 + +빗 +빗 +빗 +빗 +빗 + +빘 +빘 +빘 +빘 +빘 + +빙 +빙 +빙 +빙 +빙 + +빚 +빚 +빚 +빚 +빚 + +빛 +빛 +빛 +빛 +빛 + +빜 +빜 +빜 +빜 +빜 + +빝 +빝 +빝 +빝 +빝 + +빞 +빞 +빞 +빞 +빞 + +빟 +빟 +빟 +빟 +빟 + +빠 +빠 +빠 +빠 +빠 + +빡 +빡 +빡 +빡 +빡 + +빢 +빢 +빢 +빢 +빢 + +빣 +빣 +빣 +빣 +빣 + +빤 +빤 +빤 +빤 +빤 + +빥 +빥 +빥 +빥 +빥 + +빦 +빦 +빦 +빦 +빦 + +빧 +빧 +빧 +빧 +빧 + +빨 +빨 +빨 +빨 +빨 + +빩 +빩 +빩 +빩 +빩 + +빪 +빪 +빪 +빪 +빪 + +빫 +빫 +빫 +빫 +빫 + +빬 +빬 +빬 +빬 +빬 + +빭 +빭 +빭 +빭 +빭 + +빮 +빮 +빮 +빮 +빮 + +빯 +빯 +빯 +빯 +빯 + +빰 +빰 +빰 +빰 +빰 + +빱 +빱 +빱 +빱 +빱 + +빲 +빲 +빲 +빲 +빲 + +빳 +빳 +빳 +빳 +빳 + +빴 +빴 +빴 +빴 +빴 + +빵 +빵 +빵 +빵 +빵 + +빶 +빶 +빶 +빶 +빶 + +빷 +빷 +빷 +빷 +빷 + +빸 +빸 +빸 +빸 +빸 + +빹 +빹 +빹 +빹 +빹 + +빺 +빺 +빺 +빺 +빺 + +빻 +빻 +빻 +빻 +빻 + +빼 +빼 +빼 +빼 +빼 + +빽 +빽 +빽 +빽 +빽 + +빾 +빾 +빾 +빾 +빾 + +빿 +빿 +빿 +빿 +빿 + +뺀 +뺀 +뺀 +뺀 +뺀 + +뺁 +뺁 +뺁 +뺁 +뺁 + +뺂 +뺂 +뺂 +뺂 +뺂 + +뺃 +뺃 +뺃 +뺃 +뺃 + +뺄 +뺄 +뺄 +뺄 +뺄 + +뺅 +뺅 +뺅 +뺅 +뺅 + +뺆 +뺆 +뺆 +뺆 +뺆 + +뺇 +뺇 +뺇 +뺇 +뺇 + +뺈 +뺈 +뺈 +뺈 +뺈 + +뺉 +뺉 +뺉 +뺉 +뺉 + +뺊 +뺊 +뺊 +뺊 +뺊 + +뺋 +뺋 +뺋 +뺋 +뺋 + +뺌 +뺌 +뺌 +뺌 +뺌 + +뺍 +뺍 +뺍 +뺍 +뺍 + +뺎 +뺎 +뺎 +뺎 +뺎 + +뺏 +뺏 +뺏 +뺏 +뺏 + +뺐 +뺐 +뺐 +뺐 +뺐 + +뺑 +뺑 +뺑 +뺑 +뺑 + +뺒 +뺒 +뺒 +뺒 +뺒 + +뺓 +뺓 +뺓 +뺓 +뺓 + +뺔 +뺔 +뺔 +뺔 +뺔 + +뺕 +뺕 +뺕 +뺕 +뺕 + +뺖 +뺖 +뺖 +뺖 +뺖 + +뺗 +뺗 +뺗 +뺗 +뺗 + +뺘 +뺘 +뺘 +뺘 +뺘 + +뺙 +뺙 +뺙 +뺙 +뺙 + +뺚 +뺚 +뺚 +뺚 +뺚 + +뺛 +뺛 +뺛 +뺛 +뺛 + +뺜 +뺜 +뺜 +뺜 +뺜 + +뺝 +뺝 +뺝 +뺝 +뺝 + +뺞 +뺞 +뺞 +뺞 +뺞 + +뺟 +뺟 +뺟 +뺟 +뺟 + +뺠 +뺠 +뺠 +뺠 +뺠 + +뺡 +뺡 +뺡 +뺡 +뺡 + +뺢 +뺢 +뺢 +뺢 +뺢 + +뺣 +뺣 +뺣 +뺣 +뺣 + +뺤 +뺤 +뺤 +뺤 +뺤 + +뺥 +뺥 +뺥 +뺥 +뺥 + +뺦 +뺦 +뺦 +뺦 +뺦 + +뺧 +뺧 +뺧 +뺧 +뺧 + +뺨 +뺨 +뺨 +뺨 +뺨 + +뺩 +뺩 +뺩 +뺩 +뺩 + +뺪 +뺪 +뺪 +뺪 +뺪 + +뺫 +뺫 +뺫 +뺫 +뺫 + +뺬 +뺬 +뺬 +뺬 +뺬 + +뺭 +뺭 +뺭 +뺭 +뺭 + +뺮 +뺮 +뺮 +뺮 +뺮 + +뺯 +뺯 +뺯 +뺯 +뺯 + +뺰 +뺰 +뺰 +뺰 +뺰 + +뺱 +뺱 +뺱 +뺱 +뺱 + +뺲 +뺲 +뺲 +뺲 +뺲 + +뺳 +뺳 +뺳 +뺳 +뺳 + +뺴 +뺴 +뺴 +뺴 +뺴 + +뺵 +뺵 +뺵 +뺵 +뺵 + +뺶 +뺶 +뺶 +뺶 +뺶 + +뺷 +뺷 +뺷 +뺷 +뺷 + +뺸 +뺸 +뺸 +뺸 +뺸 + +뺹 +뺹 +뺹 +뺹 +뺹 + +뺺 +뺺 +뺺 +뺺 +뺺 + +뺻 +뺻 +뺻 +뺻 +뺻 + +뺼 +뺼 +뺼 +뺼 +뺼 + +뺽 +뺽 +뺽 +뺽 +뺽 + +뺾 +뺾 +뺾 +뺾 +뺾 + +뺿 +뺿 +뺿 +뺿 +뺿 + +뻀 +뻀 +뻀 +뻀 +뻀 + +뻁 +뻁 +뻁 +뻁 +뻁 + +뻂 +뻂 +뻂 +뻂 +뻂 + +뻃 +뻃 +뻃 +뻃 +뻃 + +뻄 +뻄 +뻄 +뻄 +뻄 + +뻅 +뻅 +뻅 +뻅 +뻅 + +뻆 +뻆 +뻆 +뻆 +뻆 + +뻇 +뻇 +뻇 +뻇 +뻇 + +뻈 +뻈 +뻈 +뻈 +뻈 + +뻉 +뻉 +뻉 +뻉 +뻉 + +뻊 +뻊 +뻊 +뻊 +뻊 + +뻋 +뻋 +뻋 +뻋 +뻋 + +뻌 +뻌 +뻌 +뻌 +뻌 + +뻍 +뻍 +뻍 +뻍 +뻍 + +뻎 +뻎 +뻎 +뻎 +뻎 + +뻏 +뻏 +뻏 +뻏 +뻏 + +뻐 +뻐 +뻐 +뻐 +뻐 + +뻑 +뻑 +뻑 +뻑 +뻑 + +뻒 +뻒 +뻒 +뻒 +뻒 + +뻓 +뻓 +뻓 +뻓 +뻓 + +뻔 +뻔 +뻔 +뻔 +뻔 + +뻕 +뻕 +뻕 +뻕 +뻕 + +뻖 +뻖 +뻖 +뻖 +뻖 + +뻗 +뻗 +뻗 +뻗 +뻗 + +뻘 +뻘 +뻘 +뻘 +뻘 + +뻙 +뻙 +뻙 +뻙 +뻙 + +뻚 +뻚 +뻚 +뻚 +뻚 + +뻛 +뻛 +뻛 +뻛 +뻛 + +뻜 +뻜 +뻜 +뻜 +뻜 + +뻝 +뻝 +뻝 +뻝 +뻝 + +뻞 +뻞 +뻞 +뻞 +뻞 + +뻟 +뻟 +뻟 +뻟 +뻟 + +뻠 +뻠 +뻠 +뻠 +뻠 + +뻡 +뻡 +뻡 +뻡 +뻡 + +뻢 +뻢 +뻢 +뻢 +뻢 + +뻣 +뻣 +뻣 +뻣 +뻣 + +뻤 +뻤 +뻤 +뻤 +뻤 + +뻥 +뻥 +뻥 +뻥 +뻥 + +뻦 +뻦 +뻦 +뻦 +뻦 + +뻧 +뻧 +뻧 +뻧 +뻧 + +뻨 +뻨 +뻨 +뻨 +뻨 + +뻩 +뻩 +뻩 +뻩 +뻩 + +뻪 +뻪 +뻪 +뻪 +뻪 + +뻫 +뻫 +뻫 +뻫 +뻫 + +뻬 +뻬 +뻬 +뻬 +뻬 + +뻭 +뻭 +뻭 +뻭 +뻭 + +뻮 +뻮 +뻮 +뻮 +뻮 + +뻯 +뻯 +뻯 +뻯 +뻯 + +뻰 +뻰 +뻰 +뻰 +뻰 + +뻱 +뻱 +뻱 +뻱 +뻱 + +뻲 +뻲 +뻲 +뻲 +뻲 + +뻳 +뻳 +뻳 +뻳 +뻳 + +뻴 +뻴 +뻴 +뻴 +뻴 + +뻵 +뻵 +뻵 +뻵 +뻵 + +뻶 +뻶 +뻶 +뻶 +뻶 + +뻷 +뻷 +뻷 +뻷 +뻷 + +뻸 +뻸 +뻸 +뻸 +뻸 + +뻹 +뻹 +뻹 +뻹 +뻹 + +뻺 +뻺 +뻺 +뻺 +뻺 + +뻻 +뻻 +뻻 +뻻 +뻻 + +뻼 +뻼 +뻼 +뻼 +뻼 + +뻽 +뻽 +뻽 +뻽 +뻽 + +뻾 +뻾 +뻾 +뻾 +뻾 + +뻿 +뻿 +뻿 +뻿 +뻿 + +뼀 +뼀 +뼀 +뼀 +뼀 + +뼁 +뼁 +뼁 +뼁 +뼁 + +뼂 +뼂 +뼂 +뼂 +뼂 + +뼃 +뼃 +뼃 +뼃 +뼃 + +뼄 +뼄 +뼄 +뼄 +뼄 + +뼅 +뼅 +뼅 +뼅 +뼅 + +뼆 +뼆 +뼆 +뼆 +뼆 + +뼇 +뼇 +뼇 +뼇 +뼇 + +뼈 +뼈 +뼈 +뼈 +뼈 + +뼉 +뼉 +뼉 +뼉 +뼉 + +뼊 +뼊 +뼊 +뼊 +뼊 + +뼋 +뼋 +뼋 +뼋 +뼋 + +뼌 +뼌 +뼌 +뼌 +뼌 + +뼍 +뼍 +뼍 +뼍 +뼍 + +뼎 +뼎 +뼎 +뼎 +뼎 + +뼏 +뼏 +뼏 +뼏 +뼏 + +뼐 +뼐 +뼐 +뼐 +뼐 + +뼑 +뼑 +뼑 +뼑 +뼑 + +뼒 +뼒 +뼒 +뼒 +뼒 + +뼓 +뼓 +뼓 +뼓 +뼓 + +뼔 +뼔 +뼔 +뼔 +뼔 + +뼕 +뼕 +뼕 +뼕 +뼕 + +뼖 +뼖 +뼖 +뼖 +뼖 + +뼗 +뼗 +뼗 +뼗 +뼗 + +뼘 +뼘 +뼘 +뼘 +뼘 + +뼙 +뼙 +뼙 +뼙 +뼙 + +뼚 +뼚 +뼚 +뼚 +뼚 + +뼛 +뼛 +뼛 +뼛 +뼛 + +뼜 +뼜 +뼜 +뼜 +뼜 + +뼝 +뼝 +뼝 +뼝 +뼝 + +뼞 +뼞 +뼞 +뼞 +뼞 + +뼟 +뼟 +뼟 +뼟 +뼟 + +뼠 +뼠 +뼠 +뼠 +뼠 + +뼡 +뼡 +뼡 +뼡 +뼡 + +뼢 +뼢 +뼢 +뼢 +뼢 + +뼣 +뼣 +뼣 +뼣 +뼣 + +뼤 +뼤 +뼤 +뼤 +뼤 + +뼥 +뼥 +뼥 +뼥 +뼥 + +뼦 +뼦 +뼦 +뼦 +뼦 + +뼧 +뼧 +뼧 +뼧 +뼧 + +뼨 +뼨 +뼨 +뼨 +뼨 + +뼩 +뼩 +뼩 +뼩 +뼩 + +뼪 +뼪 +뼪 +뼪 +뼪 + +뼫 +뼫 +뼫 +뼫 +뼫 + +뼬 +뼬 +뼬 +뼬 +뼬 + +뼭 +뼭 +뼭 +뼭 +뼭 + +뼮 +뼮 +뼮 +뼮 +뼮 + +뼯 +뼯 +뼯 +뼯 +뼯 + +뼰 +뼰 +뼰 +뼰 +뼰 + +뼱 +뼱 +뼱 +뼱 +뼱 + +뼲 +뼲 +뼲 +뼲 +뼲 + +뼳 +뼳 +뼳 +뼳 +뼳 + +뼴 +뼴 +뼴 +뼴 +뼴 + +뼵 +뼵 +뼵 +뼵 +뼵 + +뼶 +뼶 +뼶 +뼶 +뼶 + +뼷 +뼷 +뼷 +뼷 +뼷 + +뼸 +뼸 +뼸 +뼸 +뼸 + +뼹 +뼹 +뼹 +뼹 +뼹 + +뼺 +뼺 +뼺 +뼺 +뼺 + +뼻 +뼻 +뼻 +뼻 +뼻 + +뼼 +뼼 +뼼 +뼼 +뼼 + +뼽 +뼽 +뼽 +뼽 +뼽 + +뼾 +뼾 +뼾 +뼾 +뼾 + +뼿 +뼿 +뼿 +뼿 +뼿 + +뽀 +뽀 +뽀 +뽀 +뽀 + +뽁 +뽁 +뽁 +뽁 +뽁 + +뽂 +뽂 +뽂 +뽂 +뽂 + +뽃 +뽃 +뽃 +뽃 +뽃 + +뽄 +뽄 +뽄 +뽄 +뽄 + +뽅 +뽅 +뽅 +뽅 +뽅 + +뽆 +뽆 +뽆 +뽆 +뽆 + +뽇 +뽇 +뽇 +뽇 +뽇 + +뽈 +뽈 +뽈 +뽈 +뽈 + +뽉 +뽉 +뽉 +뽉 +뽉 + +뽊 +뽊 +뽊 +뽊 +뽊 + +뽋 +뽋 +뽋 +뽋 +뽋 + +뽌 +뽌 +뽌 +뽌 +뽌 + +뽍 +뽍 +뽍 +뽍 +뽍 + +뽎 +뽎 +뽎 +뽎 +뽎 + +뽏 +뽏 +뽏 +뽏 +뽏 + +뽐 +뽐 +뽐 +뽐 +뽐 + +뽑 +뽑 +뽑 +뽑 +뽑 + +뽒 +뽒 +뽒 +뽒 +뽒 + +뽓 +뽓 +뽓 +뽓 +뽓 + +뽔 +뽔 +뽔 +뽔 +뽔 + +뽕 +뽕 +뽕 +뽕 +뽕 + +뽖 +뽖 +뽖 +뽖 +뽖 + +뽗 +뽗 +뽗 +뽗 +뽗 + +뽘 +뽘 +뽘 +뽘 +뽘 + +뽙 +뽙 +뽙 +뽙 +뽙 + +뽚 +뽚 +뽚 +뽚 +뽚 + +뽛 +뽛 +뽛 +뽛 +뽛 + +뽜 +뽜 +뽜 +뽜 +뽜 + +뽝 +뽝 +뽝 +뽝 +뽝 + +뽞 +뽞 +뽞 +뽞 +뽞 + +뽟 +뽟 +뽟 +뽟 +뽟 + +뽠 +뽠 +뽠 +뽠 +뽠 + +뽡 +뽡 +뽡 +뽡 +뽡 + +뽢 +뽢 +뽢 +뽢 +뽢 + +뽣 +뽣 +뽣 +뽣 +뽣 + +뽤 +뽤 +뽤 +뽤 +뽤 + +뽥 +뽥 +뽥 +뽥 +뽥 + +뽦 +뽦 +뽦 +뽦 +뽦 + +뽧 +뽧 +뽧 +뽧 +뽧 + +뽨 +뽨 +뽨 +뽨 +뽨 + +뽩 +뽩 +뽩 +뽩 +뽩 + +뽪 +뽪 +뽪 +뽪 +뽪 + +뽫 +뽫 +뽫 +뽫 +뽫 + +뽬 +뽬 +뽬 +뽬 +뽬 + +뽭 +뽭 +뽭 +뽭 +뽭 + +뽮 +뽮 +뽮 +뽮 +뽮 + +뽯 +뽯 +뽯 +뽯 +뽯 + +뽰 +뽰 +뽰 +뽰 +뽰 + +뽱 +뽱 +뽱 +뽱 +뽱 + +뽲 +뽲 +뽲 +뽲 +뽲 + +뽳 +뽳 +뽳 +뽳 +뽳 + +뽴 +뽴 +뽴 +뽴 +뽴 + +뽵 +뽵 +뽵 +뽵 +뽵 + +뽶 +뽶 +뽶 +뽶 +뽶 + +뽷 +뽷 +뽷 +뽷 +뽷 + +뽸 +뽸 +뽸 +뽸 +뽸 + +뽹 +뽹 +뽹 +뽹 +뽹 + +뽺 +뽺 +뽺 +뽺 +뽺 + +뽻 +뽻 +뽻 +뽻 +뽻 + +뽼 +뽼 +뽼 +뽼 +뽼 + +뽽 +뽽 +뽽 +뽽 +뽽 + +뽾 +뽾 +뽾 +뽾 +뽾 + +뽿 +뽿 +뽿 +뽿 +뽿 + +뾀 +뾀 +뾀 +뾀 +뾀 + +뾁 +뾁 +뾁 +뾁 +뾁 + +뾂 +뾂 +뾂 +뾂 +뾂 + +뾃 +뾃 +뾃 +뾃 +뾃 + +뾄 +뾄 +뾄 +뾄 +뾄 + +뾅 +뾅 +뾅 +뾅 +뾅 + +뾆 +뾆 +뾆 +뾆 +뾆 + +뾇 +뾇 +뾇 +뾇 +뾇 + +뾈 +뾈 +뾈 +뾈 +뾈 + +뾉 +뾉 +뾉 +뾉 +뾉 + +뾊 +뾊 +뾊 +뾊 +뾊 + +뾋 +뾋 +뾋 +뾋 +뾋 + +뾌 +뾌 +뾌 +뾌 +뾌 + +뾍 +뾍 +뾍 +뾍 +뾍 + +뾎 +뾎 +뾎 +뾎 +뾎 + +뾏 +뾏 +뾏 +뾏 +뾏 + +뾐 +뾐 +뾐 +뾐 +뾐 + +뾑 +뾑 +뾑 +뾑 +뾑 + +뾒 +뾒 +뾒 +뾒 +뾒 + +뾓 +뾓 +뾓 +뾓 +뾓 + +뾔 +뾔 +뾔 +뾔 +뾔 + +뾕 +뾕 +뾕 +뾕 +뾕 + +뾖 +뾖 +뾖 +뾖 +뾖 + +뾗 +뾗 +뾗 +뾗 +뾗 + +뾘 +뾘 +뾘 +뾘 +뾘 + +뾙 +뾙 +뾙 +뾙 +뾙 + +뾚 +뾚 +뾚 +뾚 +뾚 + +뾛 +뾛 +뾛 +뾛 +뾛 + +뾜 +뾜 +뾜 +뾜 +뾜 + +뾝 +뾝 +뾝 +뾝 +뾝 + +뾞 +뾞 +뾞 +뾞 +뾞 + +뾟 +뾟 +뾟 +뾟 +뾟 + +뾠 +뾠 +뾠 +뾠 +뾠 + +뾡 +뾡 +뾡 +뾡 +뾡 + +뾢 +뾢 +뾢 +뾢 +뾢 + +뾣 +뾣 +뾣 +뾣 +뾣 + +뾤 +뾤 +뾤 +뾤 +뾤 + +뾥 +뾥 +뾥 +뾥 +뾥 + +뾦 +뾦 +뾦 +뾦 +뾦 + +뾧 +뾧 +뾧 +뾧 +뾧 + +뾨 +뾨 +뾨 +뾨 +뾨 + +뾩 +뾩 +뾩 +뾩 +뾩 + +뾪 +뾪 +뾪 +뾪 +뾪 + +뾫 +뾫 +뾫 +뾫 +뾫 + +뾬 +뾬 +뾬 +뾬 +뾬 + +뾭 +뾭 +뾭 +뾭 +뾭 + +뾮 +뾮 +뾮 +뾮 +뾮 + +뾯 +뾯 +뾯 +뾯 +뾯 + +뾰 +뾰 +뾰 +뾰 +뾰 + +뾱 +뾱 +뾱 +뾱 +뾱 + +뾲 +뾲 +뾲 +뾲 +뾲 + +뾳 +뾳 +뾳 +뾳 +뾳 + +뾴 +뾴 +뾴 +뾴 +뾴 + +뾵 +뾵 +뾵 +뾵 +뾵 + +뾶 +뾶 +뾶 +뾶 +뾶 + +뾷 +뾷 +뾷 +뾷 +뾷 + +뾸 +뾸 +뾸 +뾸 +뾸 + +뾹 +뾹 +뾹 +뾹 +뾹 + +뾺 +뾺 +뾺 +뾺 +뾺 + +뾻 +뾻 +뾻 +뾻 +뾻 + +뾼 +뾼 +뾼 +뾼 +뾼 + +뾽 +뾽 +뾽 +뾽 +뾽 + +뾾 +뾾 +뾾 +뾾 +뾾 + +뾿 +뾿 +뾿 +뾿 +뾿 + +뿀 +뿀 +뿀 +뿀 +뿀 + +뿁 +뿁 +뿁 +뿁 +뿁 + +뿂 +뿂 +뿂 +뿂 +뿂 + +뿃 +뿃 +뿃 +뿃 +뿃 + +뿄 +뿄 +뿄 +뿄 +뿄 + +뿅 +뿅 +뿅 +뿅 +뿅 + +뿆 +뿆 +뿆 +뿆 +뿆 + +뿇 +뿇 +뿇 +뿇 +뿇 + +뿈 +뿈 +뿈 +뿈 +뿈 + +뿉 +뿉 +뿉 +뿉 +뿉 + +뿊 +뿊 +뿊 +뿊 +뿊 + +뿋 +뿋 +뿋 +뿋 +뿋 + +뿌 +뿌 +뿌 +뿌 +뿌 + +뿍 +뿍 +뿍 +뿍 +뿍 + +뿎 +뿎 +뿎 +뿎 +뿎 + +뿏 +뿏 +뿏 +뿏 +뿏 + +뿐 +뿐 +뿐 +뿐 +뿐 + +뿑 +뿑 +뿑 +뿑 +뿑 + +뿒 +뿒 +뿒 +뿒 +뿒 + +뿓 +뿓 +뿓 +뿓 +뿓 + +뿔 +뿔 +뿔 +뿔 +뿔 + +뿕 +뿕 +뿕 +뿕 +뿕 + +뿖 +뿖 +뿖 +뿖 +뿖 + +뿗 +뿗 +뿗 +뿗 +뿗 + +뿘 +뿘 +뿘 +뿘 +뿘 + +뿙 +뿙 +뿙 +뿙 +뿙 + +뿚 +뿚 +뿚 +뿚 +뿚 + +뿛 +뿛 +뿛 +뿛 +뿛 + +뿜 +뿜 +뿜 +뿜 +뿜 + +뿝 +뿝 +뿝 +뿝 +뿝 + +뿞 +뿞 +뿞 +뿞 +뿞 + +뿟 +뿟 +뿟 +뿟 +뿟 + +뿠 +뿠 +뿠 +뿠 +뿠 + +뿡 +뿡 +뿡 +뿡 +뿡 + +뿢 +뿢 +뿢 +뿢 +뿢 + +뿣 +뿣 +뿣 +뿣 +뿣 + +뿤 +뿤 +뿤 +뿤 +뿤 + +뿥 +뿥 +뿥 +뿥 +뿥 + +뿦 +뿦 +뿦 +뿦 +뿦 + +뿧 +뿧 +뿧 +뿧 +뿧 + +뿨 +뿨 +뿨 +뿨 +뿨 + +뿩 +뿩 +뿩 +뿩 +뿩 + +뿪 +뿪 +뿪 +뿪 +뿪 + +뿫 +뿫 +뿫 +뿫 +뿫 + +뿬 +뿬 +뿬 +뿬 +뿬 + +뿭 +뿭 +뿭 +뿭 +뿭 + +뿮 +뿮 +뿮 +뿮 +뿮 + +뿯 +뿯 +뿯 +뿯 +뿯 + +뿰 +뿰 +뿰 +뿰 +뿰 + +뿱 +뿱 +뿱 +뿱 +뿱 + +뿲 +뿲 +뿲 +뿲 +뿲 + +뿳 +뿳 +뿳 +뿳 +뿳 + +뿴 +뿴 +뿴 +뿴 +뿴 + +뿵 +뿵 +뿵 +뿵 +뿵 + +뿶 +뿶 +뿶 +뿶 +뿶 + +뿷 +뿷 +뿷 +뿷 +뿷 + +뿸 +뿸 +뿸 +뿸 +뿸 + +뿹 +뿹 +뿹 +뿹 +뿹 + +뿺 +뿺 +뿺 +뿺 +뿺 + +뿻 +뿻 +뿻 +뿻 +뿻 + +뿼 +뿼 +뿼 +뿼 +뿼 + +뿽 +뿽 +뿽 +뿽 +뿽 + +뿾 +뿾 +뿾 +뿾 +뿾 + +뿿 +뿿 +뿿 +뿿 +뿿 + +쀀 +쀀 +쀀 +쀀 +쀀 + +쀁 +쀁 +쀁 +쀁 +쀁 + +쀂 +쀂 +쀂 +쀂 +쀂 + +쀃 +쀃 +쀃 +쀃 +쀃 + +쀄 +쀄 +쀄 +쀄 +쀄 + +쀅 +쀅 +쀅 +쀅 +쀅 + +쀆 +쀆 +쀆 +쀆 +쀆 + +쀇 +쀇 +쀇 +쀇 +쀇 + +쀈 +쀈 +쀈 +쀈 +쀈 + +쀉 +쀉 +쀉 +쀉 +쀉 + +쀊 +쀊 +쀊 +쀊 +쀊 + +쀋 +쀋 +쀋 +쀋 +쀋 + +쀌 +쀌 +쀌 +쀌 +쀌 + +쀍 +쀍 +쀍 +쀍 +쀍 + +쀎 +쀎 +쀎 +쀎 +쀎 + +쀏 +쀏 +쀏 +쀏 +쀏 + +쀐 +쀐 +쀐 +쀐 +쀐 + +쀑 +쀑 +쀑 +쀑 +쀑 + +쀒 +쀒 +쀒 +쀒 +쀒 + +쀓 +쀓 +쀓 +쀓 +쀓 + +쀔 +쀔 +쀔 +쀔 +쀔 + +쀕 +쀕 +쀕 +쀕 +쀕 + +쀖 +쀖 +쀖 +쀖 +쀖 + +쀗 +쀗 +쀗 +쀗 +쀗 + +쀘 +쀘 +쀘 +쀘 +쀘 + +쀙 +쀙 +쀙 +쀙 +쀙 + +쀚 +쀚 +쀚 +쀚 +쀚 + +쀛 +쀛 +쀛 +쀛 +쀛 + +쀜 +쀜 +쀜 +쀜 +쀜 + +쀝 +쀝 +쀝 +쀝 +쀝 + +쀞 +쀞 +쀞 +쀞 +쀞 + +쀟 +쀟 +쀟 +쀟 +쀟 + +쀠 +쀠 +쀠 +쀠 +쀠 + +쀡 +쀡 +쀡 +쀡 +쀡 + +쀢 +쀢 +쀢 +쀢 +쀢 + +쀣 +쀣 +쀣 +쀣 +쀣 + +쀤 +쀤 +쀤 +쀤 +쀤 + +쀥 +쀥 +쀥 +쀥 +쀥 + +쀦 +쀦 +쀦 +쀦 +쀦 + +쀧 +쀧 +쀧 +쀧 +쀧 + +쀨 +쀨 +쀨 +쀨 +쀨 + +쀩 +쀩 +쀩 +쀩 +쀩 + +쀪 +쀪 +쀪 +쀪 +쀪 + +쀫 +쀫 +쀫 +쀫 +쀫 + +쀬 +쀬 +쀬 +쀬 +쀬 + +쀭 +쀭 +쀭 +쀭 +쀭 + +쀮 +쀮 +쀮 +쀮 +쀮 + +쀯 +쀯 +쀯 +쀯 +쀯 + +쀰 +쀰 +쀰 +쀰 +쀰 + +쀱 +쀱 +쀱 +쀱 +쀱 + +쀲 +쀲 +쀲 +쀲 +쀲 + +쀳 +쀳 +쀳 +쀳 +쀳 + +쀴 +쀴 +쀴 +쀴 +쀴 + +쀵 +쀵 +쀵 +쀵 +쀵 + +쀶 +쀶 +쀶 +쀶 +쀶 + +쀷 +쀷 +쀷 +쀷 +쀷 + +쀸 +쀸 +쀸 +쀸 +쀸 + +쀹 +쀹 +쀹 +쀹 +쀹 + +쀺 +쀺 +쀺 +쀺 +쀺 + +쀻 +쀻 +쀻 +쀻 +쀻 + +쀼 +쀼 +쀼 +쀼 +쀼 + +쀽 +쀽 +쀽 +쀽 +쀽 + +쀾 +쀾 +쀾 +쀾 +쀾 + +쀿 +쀿 +쀿 +쀿 +쀿 + +쁀 +쁀 +쁀 +쁀 +쁀 + +쁁 +쁁 +쁁 +쁁 +쁁 + +쁂 +쁂 +쁂 +쁂 +쁂 + +쁃 +쁃 +쁃 +쁃 +쁃 + +쁄 +쁄 +쁄 +쁄 +쁄 + +쁅 +쁅 +쁅 +쁅 +쁅 + +쁆 +쁆 +쁆 +쁆 +쁆 + +쁇 +쁇 +쁇 +쁇 +쁇 + +쁈 +쁈 +쁈 +쁈 +쁈 + +쁉 +쁉 +쁉 +쁉 +쁉 + +쁊 +쁊 +쁊 +쁊 +쁊 + +쁋 +쁋 +쁋 +쁋 +쁋 + +쁌 +쁌 +쁌 +쁌 +쁌 + +쁍 +쁍 +쁍 +쁍 +쁍 + +쁎 +쁎 +쁎 +쁎 +쁎 + +쁏 +쁏 +쁏 +쁏 +쁏 + +쁐 +쁐 +쁐 +쁐 +쁐 + +쁑 +쁑 +쁑 +쁑 +쁑 + +쁒 +쁒 +쁒 +쁒 +쁒 + +쁓 +쁓 +쁓 +쁓 +쁓 + +쁔 +쁔 +쁔 +쁔 +쁔 + +쁕 +쁕 +쁕 +쁕 +쁕 + +쁖 +쁖 +쁖 +쁖 +쁖 + +쁗 +쁗 +쁗 +쁗 +쁗 + +쁘 +쁘 +쁘 +쁘 +쁘 + +쁙 +쁙 +쁙 +쁙 +쁙 + +쁚 +쁚 +쁚 +쁚 +쁚 + +쁛 +쁛 +쁛 +쁛 +쁛 + +쁜 +쁜 +쁜 +쁜 +쁜 + +쁝 +쁝 +쁝 +쁝 +쁝 + +쁞 +쁞 +쁞 +쁞 +쁞 + +쁟 +쁟 +쁟 +쁟 +쁟 + +쁠 +쁠 +쁠 +쁠 +쁠 + +쁡 +쁡 +쁡 +쁡 +쁡 + +쁢 +쁢 +쁢 +쁢 +쁢 + +쁣 +쁣 +쁣 +쁣 +쁣 + +쁤 +쁤 +쁤 +쁤 +쁤 + +쁥 +쁥 +쁥 +쁥 +쁥 + +쁦 +쁦 +쁦 +쁦 +쁦 + +쁧 +쁧 +쁧 +쁧 +쁧 + +쁨 +쁨 +쁨 +쁨 +쁨 + +쁩 +쁩 +쁩 +쁩 +쁩 + +쁪 +쁪 +쁪 +쁪 +쁪 + +쁫 +쁫 +쁫 +쁫 +쁫 + +쁬 +쁬 +쁬 +쁬 +쁬 + +쁭 +쁭 +쁭 +쁭 +쁭 + +쁮 +쁮 +쁮 +쁮 +쁮 + +쁯 +쁯 +쁯 +쁯 +쁯 + +쁰 +쁰 +쁰 +쁰 +쁰 + +쁱 +쁱 +쁱 +쁱 +쁱 + +쁲 +쁲 +쁲 +쁲 +쁲 + +쁳 +쁳 +쁳 +쁳 +쁳 + +쁴 +쁴 +쁴 +쁴 +쁴 + +쁵 +쁵 +쁵 +쁵 +쁵 + +쁶 +쁶 +쁶 +쁶 +쁶 + +쁷 +쁷 +쁷 +쁷 +쁷 + +쁸 +쁸 +쁸 +쁸 +쁸 + +쁹 +쁹 +쁹 +쁹 +쁹 + +쁺 +쁺 +쁺 +쁺 +쁺 + +쁻 +쁻 +쁻 +쁻 +쁻 + +쁼 +쁼 +쁼 +쁼 +쁼 + +쁽 +쁽 +쁽 +쁽 +쁽 + +쁾 +쁾 +쁾 +쁾 +쁾 + +쁿 +쁿 +쁿 +쁿 +쁿 + +삀 +삀 +삀 +삀 +삀 + +삁 +삁 +삁 +삁 +삁 + +삂 +삂 +삂 +삂 +삂 + +삃 +삃 +삃 +삃 +삃 + +삄 +삄 +삄 +삄 +삄 + +삅 +삅 +삅 +삅 +삅 + +삆 +삆 +삆 +삆 +삆 + +삇 +삇 +삇 +삇 +삇 + +삈 +삈 +삈 +삈 +삈 + +삉 +삉 +삉 +삉 +삉 + +삊 +삊 +삊 +삊 +삊 + +삋 +삋 +삋 +삋 +삋 + +삌 +삌 +삌 +삌 +삌 + +삍 +삍 +삍 +삍 +삍 + +삎 +삎 +삎 +삎 +삎 + +삏 +삏 +삏 +삏 +삏 + +삐 +삐 +삐 +삐 +삐 + +삑 +삑 +삑 +삑 +삑 + +삒 +삒 +삒 +삒 +삒 + +삓 +삓 +삓 +삓 +삓 + +삔 +삔 +삔 +삔 +삔 + +삕 +삕 +삕 +삕 +삕 + +삖 +삖 +삖 +삖 +삖 + +삗 +삗 +삗 +삗 +삗 + +삘 +삘 +삘 +삘 +삘 + +삙 +삙 +삙 +삙 +삙 + +삚 +삚 +삚 +삚 +삚 + +삛 +삛 +삛 +삛 +삛 + +삜 +삜 +삜 +삜 +삜 + +삝 +삝 +삝 +삝 +삝 + +삞 +삞 +삞 +삞 +삞 + +삟 +삟 +삟 +삟 +삟 + +삠 +삠 +삠 +삠 +삠 + +삡 +삡 +삡 +삡 +삡 + +삢 +삢 +삢 +삢 +삢 + +삣 +삣 +삣 +삣 +삣 + +삤 +삤 +삤 +삤 +삤 + +삥 +삥 +삥 +삥 +삥 + +삦 +삦 +삦 +삦 +삦 + +삧 +삧 +삧 +삧 +삧 + +삨 +삨 +삨 +삨 +삨 + +삩 +삩 +삩 +삩 +삩 + +삪 +삪 +삪 +삪 +삪 + +삫 +삫 +삫 +삫 +삫 + +사 +사 +사 +사 +사 + +삭 +삭 +삭 +삭 +삭 + +삮 +삮 +삮 +삮 +삮 + +삯 +삯 +삯 +삯 +삯 + +산 +산 +산 +산 +산 + +삱 +삱 +삱 +삱 +삱 + +삲 +삲 +삲 +삲 +삲 + +삳 +삳 +삳 +삳 +삳 + +살 +살 +살 +살 +살 + +삵 +삵 +삵 +삵 +삵 + +삶 +삶 +삶 +삶 +삶 + +삷 +삷 +삷 +삷 +삷 + +삸 +삸 +삸 +삸 +삸 + +삹 +삹 +삹 +삹 +삹 + +삺 +삺 +삺 +삺 +삺 + +삻 +삻 +삻 +삻 +삻 + +삼 +삼 +삼 +삼 +삼 + +삽 +삽 +삽 +삽 +삽 + +삾 +삾 +삾 +삾 +삾 + +삿 +삿 +삿 +삿 +삿 + +샀 +샀 +샀 +샀 +샀 + +상 +상 +상 +상 +상 + +샂 +샂 +샂 +샂 +샂 + +샃 +샃 +샃 +샃 +샃 + +샄 +샄 +샄 +샄 +샄 + +샅 +샅 +샅 +샅 +샅 + +샆 +샆 +샆 +샆 +샆 + +샇 +샇 +샇 +샇 +샇 + +새 +새 +새 +새 +새 + +색 +색 +색 +색 +색 + +샊 +샊 +샊 +샊 +샊 + +샋 +샋 +샋 +샋 +샋 + +샌 +샌 +샌 +샌 +샌 + +샍 +샍 +샍 +샍 +샍 + +샎 +샎 +샎 +샎 +샎 + +샏 +샏 +샏 +샏 +샏 + +샐 +샐 +샐 +샐 +샐 + +샑 +샑 +샑 +샑 +샑 + +샒 +샒 +샒 +샒 +샒 + +샓 +샓 +샓 +샓 +샓 + +샔 +샔 +샔 +샔 +샔 + +샕 +샕 +샕 +샕 +샕 + +샖 +샖 +샖 +샖 +샖 + +샗 +샗 +샗 +샗 +샗 + +샘 +샘 +샘 +샘 +샘 + +샙 +샙 +샙 +샙 +샙 + +샚 +샚 +샚 +샚 +샚 + +샛 +샛 +샛 +샛 +샛 + +샜 +샜 +샜 +샜 +샜 + +생 +생 +생 +생 +생 + +샞 +샞 +샞 +샞 +샞 + +샟 +샟 +샟 +샟 +샟 + +샠 +샠 +샠 +샠 +샠 + +샡 +샡 +샡 +샡 +샡 + +샢 +샢 +샢 +샢 +샢 + +샣 +샣 +샣 +샣 +샣 + +샤 +샤 +샤 +샤 +샤 + +샥 +샥 +샥 +샥 +샥 + +샦 +샦 +샦 +샦 +샦 + +샧 +샧 +샧 +샧 +샧 + +샨 +샨 +샨 +샨 +샨 + +샩 +샩 +샩 +샩 +샩 + +샪 +샪 +샪 +샪 +샪 + +샫 +샫 +샫 +샫 +샫 + +샬 +샬 +샬 +샬 +샬 + +샭 +샭 +샭 +샭 +샭 + +샮 +샮 +샮 +샮 +샮 + +샯 +샯 +샯 +샯 +샯 + +샰 +샰 +샰 +샰 +샰 + +샱 +샱 +샱 +샱 +샱 + +샲 +샲 +샲 +샲 +샲 + +샳 +샳 +샳 +샳 +샳 + +샴 +샴 +샴 +샴 +샴 + +샵 +샵 +샵 +샵 +샵 + +샶 +샶 +샶 +샶 +샶 + +샷 +샷 +샷 +샷 +샷 + +샸 +샸 +샸 +샸 +샸 + +샹 +샹 +샹 +샹 +샹 + +샺 +샺 +샺 +샺 +샺 + +샻 +샻 +샻 +샻 +샻 + +샼 +샼 +샼 +샼 +샼 + +샽 +샽 +샽 +샽 +샽 + +샾 +샾 +샾 +샾 +샾 + +샿 +샿 +샿 +샿 +샿 + +섀 +섀 +섀 +섀 +섀 + +섁 +섁 +섁 +섁 +섁 + +섂 +섂 +섂 +섂 +섂 + +섃 +섃 +섃 +섃 +섃 + +섄 +섄 +섄 +섄 +섄 + +섅 +섅 +섅 +섅 +섅 + +섆 +섆 +섆 +섆 +섆 + +섇 +섇 +섇 +섇 +섇 + +섈 +섈 +섈 +섈 +섈 + +섉 +섉 +섉 +섉 +섉 + +섊 +섊 +섊 +섊 +섊 + +섋 +섋 +섋 +섋 +섋 + +섌 +섌 +섌 +섌 +섌 + +섍 +섍 +섍 +섍 +섍 + +섎 +섎 +섎 +섎 +섎 + +섏 +섏 +섏 +섏 +섏 + +섐 +섐 +섐 +섐 +섐 + +섑 +섑 +섑 +섑 +섑 + +섒 +섒 +섒 +섒 +섒 + +섓 +섓 +섓 +섓 +섓 + +섔 +섔 +섔 +섔 +섔 + +섕 +섕 +섕 +섕 +섕 + +섖 +섖 +섖 +섖 +섖 + +섗 +섗 +섗 +섗 +섗 + +섘 +섘 +섘 +섘 +섘 + +섙 +섙 +섙 +섙 +섙 + +섚 +섚 +섚 +섚 +섚 + +섛 +섛 +섛 +섛 +섛 + +서 +서 +서 +서 +서 + +석 +석 +석 +석 +석 + +섞 +섞 +섞 +섞 +섞 + +섟 +섟 +섟 +섟 +섟 + +선 +선 +선 +선 +선 + +섡 +섡 +섡 +섡 +섡 + +섢 +섢 +섢 +섢 +섢 + +섣 +섣 +섣 +섣 +섣 + +설 +설 +설 +설 +설 + +섥 +섥 +섥 +섥 +섥 + +섦 +섦 +섦 +섦 +섦 + +섧 +섧 +섧 +섧 +섧 + +섨 +섨 +섨 +섨 +섨 + +섩 +섩 +섩 +섩 +섩 + +섪 +섪 +섪 +섪 +섪 + +섫 +섫 +섫 +섫 +섫 + +섬 +섬 +섬 +섬 +섬 + +섭 +섭 +섭 +섭 +섭 + +섮 +섮 +섮 +섮 +섮 + +섯 +섯 +섯 +섯 +섯 + +섰 +섰 +섰 +섰 +섰 + +성 +성 +성 +성 +성 + +섲 +섲 +섲 +섲 +섲 + +섳 +섳 +섳 +섳 +섳 + +섴 +섴 +섴 +섴 +섴 + +섵 +섵 +섵 +섵 +섵 + +섶 +섶 +섶 +섶 +섶 + +섷 +섷 +섷 +섷 +섷 + +세 +세 +세 +세 +세 + +섹 +섹 +섹 +섹 +섹 + +섺 +섺 +섺 +섺 +섺 + +섻 +섻 +섻 +섻 +섻 + +센 +센 +센 +센 +센 + +섽 +섽 +섽 +섽 +섽 + +섾 +섾 +섾 +섾 +섾 + +섿 +섿 +섿 +섿 +섿 + +셀 +셀 +셀 +셀 +셀 + +셁 +셁 +셁 +셁 +셁 + +셂 +셂 +셂 +셂 +셂 + +셃 +셃 +셃 +셃 +셃 + +셄 +셄 +셄 +셄 +셄 + +셅 +셅 +셅 +셅 +셅 + +셆 +셆 +셆 +셆 +셆 + +셇 +셇 +셇 +셇 +셇 + +셈 +셈 +셈 +셈 +셈 + +셉 +셉 +셉 +셉 +셉 + +셊 +셊 +셊 +셊 +셊 + +셋 +셋 +셋 +셋 +셋 + +셌 +셌 +셌 +셌 +셌 + +셍 +셍 +셍 +셍 +셍 + +셎 +셎 +셎 +셎 +셎 + +셏 +셏 +셏 +셏 +셏 + +셐 +셐 +셐 +셐 +셐 + +셑 +셑 +셑 +셑 +셑 + +셒 +셒 +셒 +셒 +셒 + +셓 +셓 +셓 +셓 +셓 + +셔 +셔 +셔 +셔 +셔 + +셕 +셕 +셕 +셕 +셕 + +셖 +셖 +셖 +셖 +셖 + +셗 +셗 +셗 +셗 +셗 + +션 +션 +션 +션 +션 + +셙 +셙 +셙 +셙 +셙 + +셚 +셚 +셚 +셚 +셚 + +셛 +셛 +셛 +셛 +셛 + +셜 +셜 +셜 +셜 +셜 + +셝 +셝 +셝 +셝 +셝 + +셞 +셞 +셞 +셞 +셞 + +셟 +셟 +셟 +셟 +셟 + +셠 +셠 +셠 +셠 +셠 + +셡 +셡 +셡 +셡 +셡 + +셢 +셢 +셢 +셢 +셢 + +셣 +셣 +셣 +셣 +셣 + +셤 +셤 +셤 +셤 +셤 + +셥 +셥 +셥 +셥 +셥 + +셦 +셦 +셦 +셦 +셦 + +셧 +셧 +셧 +셧 +셧 + +셨 +셨 +셨 +셨 +셨 + +셩 +셩 +셩 +셩 +셩 + +셪 +셪 +셪 +셪 +셪 + +셫 +셫 +셫 +셫 +셫 + +셬 +셬 +셬 +셬 +셬 + +셭 +셭 +셭 +셭 +셭 + +셮 +셮 +셮 +셮 +셮 + +셯 +셯 +셯 +셯 +셯 + +셰 +셰 +셰 +셰 +셰 + +셱 +셱 +셱 +셱 +셱 + +셲 +셲 +셲 +셲 +셲 + +셳 +셳 +셳 +셳 +셳 + +셴 +셴 +셴 +셴 +셴 + +셵 +셵 +셵 +셵 +셵 + +셶 +셶 +셶 +셶 +셶 + +셷 +셷 +셷 +셷 +셷 + +셸 +셸 +셸 +셸 +셸 + +셹 +셹 +셹 +셹 +셹 + +셺 +셺 +셺 +셺 +셺 + +셻 +셻 +셻 +셻 +셻 + +셼 +셼 +셼 +셼 +셼 + +셽 +셽 +셽 +셽 +셽 + +셾 +셾 +셾 +셾 +셾 + +셿 +셿 +셿 +셿 +셿 + +솀 +솀 +솀 +솀 +솀 + +솁 +솁 +솁 +솁 +솁 + +솂 +솂 +솂 +솂 +솂 + +솃 +솃 +솃 +솃 +솃 + +솄 +솄 +솄 +솄 +솄 + +솅 +솅 +솅 +솅 +솅 + +솆 +솆 +솆 +솆 +솆 + +솇 +솇 +솇 +솇 +솇 + +솈 +솈 +솈 +솈 +솈 + +솉 +솉 +솉 +솉 +솉 + +솊 +솊 +솊 +솊 +솊 + +솋 +솋 +솋 +솋 +솋 + +소 +소 +소 +소 +소 + +속 +속 +속 +속 +속 + +솎 +솎 +솎 +솎 +솎 + +솏 +솏 +솏 +솏 +솏 + +손 +손 +손 +손 +손 + +솑 +솑 +솑 +솑 +솑 + +솒 +솒 +솒 +솒 +솒 + +솓 +솓 +솓 +솓 +솓 + +솔 +솔 +솔 +솔 +솔 + +솕 +솕 +솕 +솕 +솕 + +솖 +솖 +솖 +솖 +솖 + +솗 +솗 +솗 +솗 +솗 + +솘 +솘 +솘 +솘 +솘 + +솙 +솙 +솙 +솙 +솙 + +솚 +솚 +솚 +솚 +솚 + +솛 +솛 +솛 +솛 +솛 + +솜 +솜 +솜 +솜 +솜 + +솝 +솝 +솝 +솝 +솝 + +솞 +솞 +솞 +솞 +솞 + +솟 +솟 +솟 +솟 +솟 + +솠 +솠 +솠 +솠 +솠 + +송 +송 +송 +송 +송 + +솢 +솢 +솢 +솢 +솢 + +솣 +솣 +솣 +솣 +솣 + +솤 +솤 +솤 +솤 +솤 + +솥 +솥 +솥 +솥 +솥 + +솦 +솦 +솦 +솦 +솦 + +솧 +솧 +솧 +솧 +솧 + +솨 +솨 +솨 +솨 +솨 + +솩 +솩 +솩 +솩 +솩 + +솪 +솪 +솪 +솪 +솪 + +솫 +솫 +솫 +솫 +솫 + +솬 +솬 +솬 +솬 +솬 + +솭 +솭 +솭 +솭 +솭 + +솮 +솮 +솮 +솮 +솮 + +솯 +솯 +솯 +솯 +솯 + +솰 +솰 +솰 +솰 +솰 + +솱 +솱 +솱 +솱 +솱 + +솲 +솲 +솲 +솲 +솲 + +솳 +솳 +솳 +솳 +솳 + +솴 +솴 +솴 +솴 +솴 + +솵 +솵 +솵 +솵 +솵 + +솶 +솶 +솶 +솶 +솶 + +솷 +솷 +솷 +솷 +솷 + +솸 +솸 +솸 +솸 +솸 + +솹 +솹 +솹 +솹 +솹 + +솺 +솺 +솺 +솺 +솺 + +솻 +솻 +솻 +솻 +솻 + +솼 +솼 +솼 +솼 +솼 + +솽 +솽 +솽 +솽 +솽 + +솾 +솾 +솾 +솾 +솾 + +솿 +솿 +솿 +솿 +솿 + +쇀 +쇀 +쇀 +쇀 +쇀 + +쇁 +쇁 +쇁 +쇁 +쇁 + +쇂 +쇂 +쇂 +쇂 +쇂 + +쇃 +쇃 +쇃 +쇃 +쇃 + +쇄 +쇄 +쇄 +쇄 +쇄 + +쇅 +쇅 +쇅 +쇅 +쇅 + +쇆 +쇆 +쇆 +쇆 +쇆 + +쇇 +쇇 +쇇 +쇇 +쇇 + +쇈 +쇈 +쇈 +쇈 +쇈 + +쇉 +쇉 +쇉 +쇉 +쇉 + +쇊 +쇊 +쇊 +쇊 +쇊 + +쇋 +쇋 +쇋 +쇋 +쇋 + +쇌 +쇌 +쇌 +쇌 +쇌 + +쇍 +쇍 +쇍 +쇍 +쇍 + +쇎 +쇎 +쇎 +쇎 +쇎 + +쇏 +쇏 +쇏 +쇏 +쇏 + +쇐 +쇐 +쇐 +쇐 +쇐 + +쇑 +쇑 +쇑 +쇑 +쇑 + +쇒 +쇒 +쇒 +쇒 +쇒 + +쇓 +쇓 +쇓 +쇓 +쇓 + +쇔 +쇔 +쇔 +쇔 +쇔 + +쇕 +쇕 +쇕 +쇕 +쇕 + +쇖 +쇖 +쇖 +쇖 +쇖 + +쇗 +쇗 +쇗 +쇗 +쇗 + +쇘 +쇘 +쇘 +쇘 +쇘 + +쇙 +쇙 +쇙 +쇙 +쇙 + +쇚 +쇚 +쇚 +쇚 +쇚 + +쇛 +쇛 +쇛 +쇛 +쇛 + +쇜 +쇜 +쇜 +쇜 +쇜 + +쇝 +쇝 +쇝 +쇝 +쇝 + +쇞 +쇞 +쇞 +쇞 +쇞 + +쇟 +쇟 +쇟 +쇟 +쇟 + +쇠 +쇠 +쇠 +쇠 +쇠 + +쇡 +쇡 +쇡 +쇡 +쇡 + +쇢 +쇢 +쇢 +쇢 +쇢 + +쇣 +쇣 +쇣 +쇣 +쇣 + +쇤 +쇤 +쇤 +쇤 +쇤 + +쇥 +쇥 +쇥 +쇥 +쇥 + +쇦 +쇦 +쇦 +쇦 +쇦 + +쇧 +쇧 +쇧 +쇧 +쇧 + +쇨 +쇨 +쇨 +쇨 +쇨 + +쇩 +쇩 +쇩 +쇩 +쇩 + +쇪 +쇪 +쇪 +쇪 +쇪 + +쇫 +쇫 +쇫 +쇫 +쇫 + +쇬 +쇬 +쇬 +쇬 +쇬 + +쇭 +쇭 +쇭 +쇭 +쇭 + +쇮 +쇮 +쇮 +쇮 +쇮 + +쇯 +쇯 +쇯 +쇯 +쇯 + +쇰 +쇰 +쇰 +쇰 +쇰 + +쇱 +쇱 +쇱 +쇱 +쇱 + +쇲 +쇲 +쇲 +쇲 +쇲 + +쇳 +쇳 +쇳 +쇳 +쇳 + +쇴 +쇴 +쇴 +쇴 +쇴 + +쇵 +쇵 +쇵 +쇵 +쇵 + +쇶 +쇶 +쇶 +쇶 +쇶 + +쇷 +쇷 +쇷 +쇷 +쇷 + +쇸 +쇸 +쇸 +쇸 +쇸 + +쇹 +쇹 +쇹 +쇹 +쇹 + +쇺 +쇺 +쇺 +쇺 +쇺 + +쇻 +쇻 +쇻 +쇻 +쇻 + +쇼 +쇼 +쇼 +쇼 +쇼 + +쇽 +쇽 +쇽 +쇽 +쇽 + +쇾 +쇾 +쇾 +쇾 +쇾 + +쇿 +쇿 +쇿 +쇿 +쇿 + +숀 +숀 +숀 +숀 +숀 + +숁 +숁 +숁 +숁 +숁 + +숂 +숂 +숂 +숂 +숂 + +숃 +숃 +숃 +숃 +숃 + +숄 +숄 +숄 +숄 +숄 + +숅 +숅 +숅 +숅 +숅 + +숆 +숆 +숆 +숆 +숆 + +숇 +숇 +숇 +숇 +숇 + +숈 +숈 +숈 +숈 +숈 + +숉 +숉 +숉 +숉 +숉 + +숊 +숊 +숊 +숊 +숊 + +숋 +숋 +숋 +숋 +숋 + +숌 +숌 +숌 +숌 +숌 + +숍 +숍 +숍 +숍 +숍 + +숎 +숎 +숎 +숎 +숎 + +숏 +숏 +숏 +숏 +숏 + +숐 +숐 +숐 +숐 +숐 + +숑 +숑 +숑 +숑 +숑 + +숒 +숒 +숒 +숒 +숒 + +숓 +숓 +숓 +숓 +숓 + +숔 +숔 +숔 +숔 +숔 + +숕 +숕 +숕 +숕 +숕 + +숖 +숖 +숖 +숖 +숖 + +숗 +숗 +숗 +숗 +숗 + +수 +수 +수 +수 +수 + +숙 +숙 +숙 +숙 +숙 + +숚 +숚 +숚 +숚 +숚 + +숛 +숛 +숛 +숛 +숛 + +순 +순 +순 +순 +순 + +숝 +숝 +숝 +숝 +숝 + +숞 +숞 +숞 +숞 +숞 + +숟 +숟 +숟 +숟 +숟 + +술 +술 +술 +술 +술 + +숡 +숡 +숡 +숡 +숡 + +숢 +숢 +숢 +숢 +숢 + +숣 +숣 +숣 +숣 +숣 + +숤 +숤 +숤 +숤 +숤 + +숥 +숥 +숥 +숥 +숥 + +숦 +숦 +숦 +숦 +숦 + +숧 +숧 +숧 +숧 +숧 + +숨 +숨 +숨 +숨 +숨 + +숩 +숩 +숩 +숩 +숩 + +숪 +숪 +숪 +숪 +숪 + +숫 +숫 +숫 +숫 +숫 + +숬 +숬 +숬 +숬 +숬 + +숭 +숭 +숭 +숭 +숭 + +숮 +숮 +숮 +숮 +숮 + +숯 +숯 +숯 +숯 +숯 + +숰 +숰 +숰 +숰 +숰 + +숱 +숱 +숱 +숱 +숱 + +숲 +숲 +숲 +숲 +숲 + +숳 +숳 +숳 +숳 +숳 + +숴 +숴 +숴 +숴 +숴 + +숵 +숵 +숵 +숵 +숵 + +숶 +숶 +숶 +숶 +숶 + +숷 +숷 +숷 +숷 +숷 + +숸 +숸 +숸 +숸 +숸 + +숹 +숹 +숹 +숹 +숹 + +숺 +숺 +숺 +숺 +숺 + +숻 +숻 +숻 +숻 +숻 + +숼 +숼 +숼 +숼 +숼 + +숽 +숽 +숽 +숽 +숽 + +숾 +숾 +숾 +숾 +숾 + +숿 +숿 +숿 +숿 +숿 + +쉀 +쉀 +쉀 +쉀 +쉀 + +쉁 +쉁 +쉁 +쉁 +쉁 + +쉂 +쉂 +쉂 +쉂 +쉂 + +쉃 +쉃 +쉃 +쉃 +쉃 + +쉄 +쉄 +쉄 +쉄 +쉄 + +쉅 +쉅 +쉅 +쉅 +쉅 + +쉆 +쉆 +쉆 +쉆 +쉆 + +쉇 +쉇 +쉇 +쉇 +쉇 + +쉈 +쉈 +쉈 +쉈 +쉈 + +쉉 +쉉 +쉉 +쉉 +쉉 + +쉊 +쉊 +쉊 +쉊 +쉊 + +쉋 +쉋 +쉋 +쉋 +쉋 + +쉌 +쉌 +쉌 +쉌 +쉌 + +쉍 +쉍 +쉍 +쉍 +쉍 + +쉎 +쉎 +쉎 +쉎 +쉎 + +쉏 +쉏 +쉏 +쉏 +쉏 + +쉐 +쉐 +쉐 +쉐 +쉐 + +쉑 +쉑 +쉑 +쉑 +쉑 + +쉒 +쉒 +쉒 +쉒 +쉒 + +쉓 +쉓 +쉓 +쉓 +쉓 + +쉔 +쉔 +쉔 +쉔 +쉔 + +쉕 +쉕 +쉕 +쉕 +쉕 + +쉖 +쉖 +쉖 +쉖 +쉖 + +쉗 +쉗 +쉗 +쉗 +쉗 + +쉘 +쉘 +쉘 +쉘 +쉘 + +쉙 +쉙 +쉙 +쉙 +쉙 + +쉚 +쉚 +쉚 +쉚 +쉚 + +쉛 +쉛 +쉛 +쉛 +쉛 + +쉜 +쉜 +쉜 +쉜 +쉜 + +쉝 +쉝 +쉝 +쉝 +쉝 + +쉞 +쉞 +쉞 +쉞 +쉞 + +쉟 +쉟 +쉟 +쉟 +쉟 + +쉠 +쉠 +쉠 +쉠 +쉠 + +쉡 +쉡 +쉡 +쉡 +쉡 + +쉢 +쉢 +쉢 +쉢 +쉢 + +쉣 +쉣 +쉣 +쉣 +쉣 + +쉤 +쉤 +쉤 +쉤 +쉤 + +쉥 +쉥 +쉥 +쉥 +쉥 + +쉦 +쉦 +쉦 +쉦 +쉦 + +쉧 +쉧 +쉧 +쉧 +쉧 + +쉨 +쉨 +쉨 +쉨 +쉨 + +쉩 +쉩 +쉩 +쉩 +쉩 + +쉪 +쉪 +쉪 +쉪 +쉪 + +쉫 +쉫 +쉫 +쉫 +쉫 + +쉬 +쉬 +쉬 +쉬 +쉬 + +쉭 +쉭 +쉭 +쉭 +쉭 + +쉮 +쉮 +쉮 +쉮 +쉮 + +쉯 +쉯 +쉯 +쉯 +쉯 + +쉰 +쉰 +쉰 +쉰 +쉰 + +쉱 +쉱 +쉱 +쉱 +쉱 + +쉲 +쉲 +쉲 +쉲 +쉲 + +쉳 +쉳 +쉳 +쉳 +쉳 + +쉴 +쉴 +쉴 +쉴 +쉴 + +쉵 +쉵 +쉵 +쉵 +쉵 + +쉶 +쉶 +쉶 +쉶 +쉶 + +쉷 +쉷 +쉷 +쉷 +쉷 + +쉸 +쉸 +쉸 +쉸 +쉸 + +쉹 +쉹 +쉹 +쉹 +쉹 + +쉺 +쉺 +쉺 +쉺 +쉺 + +쉻 +쉻 +쉻 +쉻 +쉻 + +쉼 +쉼 +쉼 +쉼 +쉼 + +쉽 +쉽 +쉽 +쉽 +쉽 + +쉾 +쉾 +쉾 +쉾 +쉾 + +쉿 +쉿 +쉿 +쉿 +쉿 + +슀 +슀 +슀 +슀 +슀 + +슁 +슁 +슁 +슁 +슁 + +슂 +슂 +슂 +슂 +슂 + +슃 +슃 +슃 +슃 +슃 + +슄 +슄 +슄 +슄 +슄 + +슅 +슅 +슅 +슅 +슅 + +슆 +슆 +슆 +슆 +슆 + +슇 +슇 +슇 +슇 +슇 + +슈 +슈 +슈 +슈 +슈 + +슉 +슉 +슉 +슉 +슉 + +슊 +슊 +슊 +슊 +슊 + +슋 +슋 +슋 +슋 +슋 + +슌 +슌 +슌 +슌 +슌 + +슍 +슍 +슍 +슍 +슍 + +슎 +슎 +슎 +슎 +슎 + +슏 +슏 +슏 +슏 +슏 + +슐 +슐 +슐 +슐 +슐 + +슑 +슑 +슑 +슑 +슑 + +슒 +슒 +슒 +슒 +슒 + +슓 +슓 +슓 +슓 +슓 + +슔 +슔 +슔 +슔 +슔 + +슕 +슕 +슕 +슕 +슕 + +슖 +슖 +슖 +슖 +슖 + +슗 +슗 +슗 +슗 +슗 + +슘 +슘 +슘 +슘 +슘 + +슙 +슙 +슙 +슙 +슙 + +슚 +슚 +슚 +슚 +슚 + +슛 +슛 +슛 +슛 +슛 + +슜 +슜 +슜 +슜 +슜 + +슝 +슝 +슝 +슝 +슝 + +슞 +슞 +슞 +슞 +슞 + +슟 +슟 +슟 +슟 +슟 + +슠 +슠 +슠 +슠 +슠 + +슡 +슡 +슡 +슡 +슡 + +슢 +슢 +슢 +슢 +슢 + +슣 +슣 +슣 +슣 +슣 + +스 +스 +스 +스 +스 + +슥 +슥 +슥 +슥 +슥 + +슦 +슦 +슦 +슦 +슦 + +슧 +슧 +슧 +슧 +슧 + +슨 +슨 +슨 +슨 +슨 + +슩 +슩 +슩 +슩 +슩 + +슪 +슪 +슪 +슪 +슪 + +슫 +슫 +슫 +슫 +슫 + +슬 +슬 +슬 +슬 +슬 + +슭 +슭 +슭 +슭 +슭 + +슮 +슮 +슮 +슮 +슮 + +슯 +슯 +슯 +슯 +슯 + +슰 +슰 +슰 +슰 +슰 + +슱 +슱 +슱 +슱 +슱 + +슲 +슲 +슲 +슲 +슲 + +슳 +슳 +슳 +슳 +슳 + +슴 +슴 +슴 +슴 +슴 + +습 +습 +습 +습 +습 + +슶 +슶 +슶 +슶 +슶 + +슷 +슷 +슷 +슷 +슷 + +슸 +슸 +슸 +슸 +슸 + +승 +승 +승 +승 +승 + +슺 +슺 +슺 +슺 +슺 + +슻 +슻 +슻 +슻 +슻 + +슼 +슼 +슼 +슼 +슼 + +슽 +슽 +슽 +슽 +슽 + +슾 +슾 +슾 +슾 +슾 + +슿 +슿 +슿 +슿 +슿 + +싀 +싀 +싀 +싀 +싀 + +싁 +싁 +싁 +싁 +싁 + +싂 +싂 +싂 +싂 +싂 + +싃 +싃 +싃 +싃 +싃 + +싄 +싄 +싄 +싄 +싄 + +싅 +싅 +싅 +싅 +싅 + +싆 +싆 +싆 +싆 +싆 + +싇 +싇 +싇 +싇 +싇 + +싈 +싈 +싈 +싈 +싈 + +싉 +싉 +싉 +싉 +싉 + +싊 +싊 +싊 +싊 +싊 + +싋 +싋 +싋 +싋 +싋 + +싌 +싌 +싌 +싌 +싌 + +싍 +싍 +싍 +싍 +싍 + +싎 +싎 +싎 +싎 +싎 + +싏 +싏 +싏 +싏 +싏 + +싐 +싐 +싐 +싐 +싐 + +싑 +싑 +싑 +싑 +싑 + +싒 +싒 +싒 +싒 +싒 + +싓 +싓 +싓 +싓 +싓 + +싔 +싔 +싔 +싔 +싔 + +싕 +싕 +싕 +싕 +싕 + +싖 +싖 +싖 +싖 +싖 + +싗 +싗 +싗 +싗 +싗 + +싘 +싘 +싘 +싘 +싘 + +싙 +싙 +싙 +싙 +싙 + +싚 +싚 +싚 +싚 +싚 + +싛 +싛 +싛 +싛 +싛 + +시 +시 +시 +시 +시 + +식 +식 +식 +식 +식 + +싞 +싞 +싞 +싞 +싞 + +싟 +싟 +싟 +싟 +싟 + +신 +신 +신 +신 +신 + +싡 +싡 +싡 +싡 +싡 + +싢 +싢 +싢 +싢 +싢 + +싣 +싣 +싣 +싣 +싣 + +실 +실 +실 +실 +실 + +싥 +싥 +싥 +싥 +싥 + +싦 +싦 +싦 +싦 +싦 + +싧 +싧 +싧 +싧 +싧 + +싨 +싨 +싨 +싨 +싨 + +싩 +싩 +싩 +싩 +싩 + +싪 +싪 +싪 +싪 +싪 + +싫 +싫 +싫 +싫 +싫 + +심 +심 +심 +심 +심 + +십 +십 +십 +십 +십 + +싮 +싮 +싮 +싮 +싮 + +싯 +싯 +싯 +싯 +싯 + +싰 +싰 +싰 +싰 +싰 + +싱 +싱 +싱 +싱 +싱 + +싲 +싲 +싲 +싲 +싲 + +싳 +싳 +싳 +싳 +싳 + +싴 +싴 +싴 +싴 +싴 + +싵 +싵 +싵 +싵 +싵 + +싶 +싶 +싶 +싶 +싶 + +싷 +싷 +싷 +싷 +싷 + +싸 +싸 +싸 +싸 +싸 + +싹 +싹 +싹 +싹 +싹 + +싺 +싺 +싺 +싺 +싺 + +싻 +싻 +싻 +싻 +싻 + +싼 +싼 +싼 +싼 +싼 + +싽 +싽 +싽 +싽 +싽 + +싾 +싾 +싾 +싾 +싾 + +싿 +싿 +싿 +싿 +싿 + +쌀 +쌀 +쌀 +쌀 +쌀 + +쌁 +쌁 +쌁 +쌁 +쌁 + +쌂 +쌂 +쌂 +쌂 +쌂 + +쌃 +쌃 +쌃 +쌃 +쌃 + +쌄 +쌄 +쌄 +쌄 +쌄 + +쌅 +쌅 +쌅 +쌅 +쌅 + +쌆 +쌆 +쌆 +쌆 +쌆 + +쌇 +쌇 +쌇 +쌇 +쌇 + +쌈 +쌈 +쌈 +쌈 +쌈 + +쌉 +쌉 +쌉 +쌉 +쌉 + +쌊 +쌊 +쌊 +쌊 +쌊 + +쌋 +쌋 +쌋 +쌋 +쌋 + +쌌 +쌌 +쌌 +쌌 +쌌 + +쌍 +쌍 +쌍 +쌍 +쌍 + +쌎 +쌎 +쌎 +쌎 +쌎 + +쌏 +쌏 +쌏 +쌏 +쌏 + +쌐 +쌐 +쌐 +쌐 +쌐 + +쌑 +쌑 +쌑 +쌑 +쌑 + +쌒 +쌒 +쌒 +쌒 +쌒 + +쌓 +쌓 +쌓 +쌓 +쌓 + +쌔 +쌔 +쌔 +쌔 +쌔 + +쌕 +쌕 +쌕 +쌕 +쌕 + +쌖 +쌖 +쌖 +쌖 +쌖 + +쌗 +쌗 +쌗 +쌗 +쌗 + +쌘 +쌘 +쌘 +쌘 +쌘 + +쌙 +쌙 +쌙 +쌙 +쌙 + +쌚 +쌚 +쌚 +쌚 +쌚 + +쌛 +쌛 +쌛 +쌛 +쌛 + +쌜 +쌜 +쌜 +쌜 +쌜 + +쌝 +쌝 +쌝 +쌝 +쌝 + +쌞 +쌞 +쌞 +쌞 +쌞 + +쌟 +쌟 +쌟 +쌟 +쌟 + +쌠 +쌠 +쌠 +쌠 +쌠 + +쌡 +쌡 +쌡 +쌡 +쌡 + +쌢 +쌢 +쌢 +쌢 +쌢 + +쌣 +쌣 +쌣 +쌣 +쌣 + +쌤 +쌤 +쌤 +쌤 +쌤 + +쌥 +쌥 +쌥 +쌥 +쌥 + +쌦 +쌦 +쌦 +쌦 +쌦 + +쌧 +쌧 +쌧 +쌧 +쌧 + +쌨 +쌨 +쌨 +쌨 +쌨 + +쌩 +쌩 +쌩 +쌩 +쌩 + +쌪 +쌪 +쌪 +쌪 +쌪 + +쌫 +쌫 +쌫 +쌫 +쌫 + +쌬 +쌬 +쌬 +쌬 +쌬 + +쌭 +쌭 +쌭 +쌭 +쌭 + +쌮 +쌮 +쌮 +쌮 +쌮 + +쌯 +쌯 +쌯 +쌯 +쌯 + +쌰 +쌰 +쌰 +쌰 +쌰 + +쌱 +쌱 +쌱 +쌱 +쌱 + +쌲 +쌲 +쌲 +쌲 +쌲 + +쌳 +쌳 +쌳 +쌳 +쌳 + +쌴 +쌴 +쌴 +쌴 +쌴 + +쌵 +쌵 +쌵 +쌵 +쌵 + +쌶 +쌶 +쌶 +쌶 +쌶 + +쌷 +쌷 +쌷 +쌷 +쌷 + +쌸 +쌸 +쌸 +쌸 +쌸 + +쌹 +쌹 +쌹 +쌹 +쌹 + +쌺 +쌺 +쌺 +쌺 +쌺 + +쌻 +쌻 +쌻 +쌻 +쌻 + +쌼 +쌼 +쌼 +쌼 +쌼 + +쌽 +쌽 +쌽 +쌽 +쌽 + +쌾 +쌾 +쌾 +쌾 +쌾 + +쌿 +쌿 +쌿 +쌿 +쌿 + +썀 +썀 +썀 +썀 +썀 + +썁 +썁 +썁 +썁 +썁 + +썂 +썂 +썂 +썂 +썂 + +썃 +썃 +썃 +썃 +썃 + +썄 +썄 +썄 +썄 +썄 + +썅 +썅 +썅 +썅 +썅 + +썆 +썆 +썆 +썆 +썆 + +썇 +썇 +썇 +썇 +썇 + +썈 +썈 +썈 +썈 +썈 + +썉 +썉 +썉 +썉 +썉 + +썊 +썊 +썊 +썊 +썊 + +썋 +썋 +썋 +썋 +썋 + +썌 +썌 +썌 +썌 +썌 + +썍 +썍 +썍 +썍 +썍 + +썎 +썎 +썎 +썎 +썎 + +썏 +썏 +썏 +썏 +썏 + +썐 +썐 +썐 +썐 +썐 + +썑 +썑 +썑 +썑 +썑 + +썒 +썒 +썒 +썒 +썒 + +썓 +썓 +썓 +썓 +썓 + +썔 +썔 +썔 +썔 +썔 + +썕 +썕 +썕 +썕 +썕 + +썖 +썖 +썖 +썖 +썖 + +썗 +썗 +썗 +썗 +썗 + +썘 +썘 +썘 +썘 +썘 + +썙 +썙 +썙 +썙 +썙 + +썚 +썚 +썚 +썚 +썚 + +썛 +썛 +썛 +썛 +썛 + +썜 +썜 +썜 +썜 +썜 + +썝 +썝 +썝 +썝 +썝 + +썞 +썞 +썞 +썞 +썞 + +썟 +썟 +썟 +썟 +썟 + +썠 +썠 +썠 +썠 +썠 + +썡 +썡 +썡 +썡 +썡 + +썢 +썢 +썢 +썢 +썢 + +썣 +썣 +썣 +썣 +썣 + +썤 +썤 +썤 +썤 +썤 + +썥 +썥 +썥 +썥 +썥 + +썦 +썦 +썦 +썦 +썦 + +썧 +썧 +썧 +썧 +썧 + +써 +써 +써 +써 +써 + +썩 +썩 +썩 +썩 +썩 + +썪 +썪 +썪 +썪 +썪 + +썫 +썫 +썫 +썫 +썫 + +썬 +썬 +썬 +썬 +썬 + +썭 +썭 +썭 +썭 +썭 + +썮 +썮 +썮 +썮 +썮 + +썯 +썯 +썯 +썯 +썯 + +썰 +썰 +썰 +썰 +썰 + +썱 +썱 +썱 +썱 +썱 + +썲 +썲 +썲 +썲 +썲 + +썳 +썳 +썳 +썳 +썳 + +썴 +썴 +썴 +썴 +썴 + +썵 +썵 +썵 +썵 +썵 + +썶 +썶 +썶 +썶 +썶 + +썷 +썷 +썷 +썷 +썷 + +썸 +썸 +썸 +썸 +썸 + +썹 +썹 +썹 +썹 +썹 + +썺 +썺 +썺 +썺 +썺 + +썻 +썻 +썻 +썻 +썻 + +썼 +썼 +썼 +썼 +썼 + +썽 +썽 +썽 +썽 +썽 + +썾 +썾 +썾 +썾 +썾 + +썿 +썿 +썿 +썿 +썿 + +쎀 +쎀 +쎀 +쎀 +쎀 + +쎁 +쎁 +쎁 +쎁 +쎁 + +쎂 +쎂 +쎂 +쎂 +쎂 + +쎃 +쎃 +쎃 +쎃 +쎃 + +쎄 +쎄 +쎄 +쎄 +쎄 + +쎅 +쎅 +쎅 +쎅 +쎅 + +쎆 +쎆 +쎆 +쎆 +쎆 + +쎇 +쎇 +쎇 +쎇 +쎇 + +쎈 +쎈 +쎈 +쎈 +쎈 + +쎉 +쎉 +쎉 +쎉 +쎉 + +쎊 +쎊 +쎊 +쎊 +쎊 + +쎋 +쎋 +쎋 +쎋 +쎋 + +쎌 +쎌 +쎌 +쎌 +쎌 + +쎍 +쎍 +쎍 +쎍 +쎍 + +쎎 +쎎 +쎎 +쎎 +쎎 + +쎏 +쎏 +쎏 +쎏 +쎏 + +쎐 +쎐 +쎐 +쎐 +쎐 + +쎑 +쎑 +쎑 +쎑 +쎑 + +쎒 +쎒 +쎒 +쎒 +쎒 + +쎓 +쎓 +쎓 +쎓 +쎓 + +쎔 +쎔 +쎔 +쎔 +쎔 + +쎕 +쎕 +쎕 +쎕 +쎕 + +쎖 +쎖 +쎖 +쎖 +쎖 + +쎗 +쎗 +쎗 +쎗 +쎗 + +쎘 +쎘 +쎘 +쎘 +쎘 + +쎙 +쎙 +쎙 +쎙 +쎙 + +쎚 +쎚 +쎚 +쎚 +쎚 + +쎛 +쎛 +쎛 +쎛 +쎛 + +쎜 +쎜 +쎜 +쎜 +쎜 + +쎝 +쎝 +쎝 +쎝 +쎝 + +쎞 +쎞 +쎞 +쎞 +쎞 + +쎟 +쎟 +쎟 +쎟 +쎟 + +쎠 +쎠 +쎠 +쎠 +쎠 + +쎡 +쎡 +쎡 +쎡 +쎡 + +쎢 +쎢 +쎢 +쎢 +쎢 + +쎣 +쎣 +쎣 +쎣 +쎣 + +쎤 +쎤 +쎤 +쎤 +쎤 + +쎥 +쎥 +쎥 +쎥 +쎥 + +쎦 +쎦 +쎦 +쎦 +쎦 + +쎧 +쎧 +쎧 +쎧 +쎧 + +쎨 +쎨 +쎨 +쎨 +쎨 + +쎩 +쎩 +쎩 +쎩 +쎩 + +쎪 +쎪 +쎪 +쎪 +쎪 + +쎫 +쎫 +쎫 +쎫 +쎫 + +쎬 +쎬 +쎬 +쎬 +쎬 + +쎭 +쎭 +쎭 +쎭 +쎭 + +쎮 +쎮 +쎮 +쎮 +쎮 + +쎯 +쎯 +쎯 +쎯 +쎯 + +쎰 +쎰 +쎰 +쎰 +쎰 + +쎱 +쎱 +쎱 +쎱 +쎱 + +쎲 +쎲 +쎲 +쎲 +쎲 + +쎳 +쎳 +쎳 +쎳 +쎳 + +쎴 +쎴 +쎴 +쎴 +쎴 + +쎵 +쎵 +쎵 +쎵 +쎵 + +쎶 +쎶 +쎶 +쎶 +쎶 + +쎷 +쎷 +쎷 +쎷 +쎷 + +쎸 +쎸 +쎸 +쎸 +쎸 + +쎹 +쎹 +쎹 +쎹 +쎹 + +쎺 +쎺 +쎺 +쎺 +쎺 + +쎻 +쎻 +쎻 +쎻 +쎻 + +쎼 +쎼 +쎼 +쎼 +쎼 + +쎽 +쎽 +쎽 +쎽 +쎽 + +쎾 +쎾 +쎾 +쎾 +쎾 + +쎿 +쎿 +쎿 +쎿 +쎿 + +쏀 +쏀 +쏀 +쏀 +쏀 + +쏁 +쏁 +쏁 +쏁 +쏁 + +쏂 +쏂 +쏂 +쏂 +쏂 + +쏃 +쏃 +쏃 +쏃 +쏃 + +쏄 +쏄 +쏄 +쏄 +쏄 + +쏅 +쏅 +쏅 +쏅 +쏅 + +쏆 +쏆 +쏆 +쏆 +쏆 + +쏇 +쏇 +쏇 +쏇 +쏇 + +쏈 +쏈 +쏈 +쏈 +쏈 + +쏉 +쏉 +쏉 +쏉 +쏉 + +쏊 +쏊 +쏊 +쏊 +쏊 + +쏋 +쏋 +쏋 +쏋 +쏋 + +쏌 +쏌 +쏌 +쏌 +쏌 + +쏍 +쏍 +쏍 +쏍 +쏍 + +쏎 +쏎 +쏎 +쏎 +쏎 + +쏏 +쏏 +쏏 +쏏 +쏏 + +쏐 +쏐 +쏐 +쏐 +쏐 + +쏑 +쏑 +쏑 +쏑 +쏑 + +쏒 +쏒 +쏒 +쏒 +쏒 + +쏓 +쏓 +쏓 +쏓 +쏓 + +쏔 +쏔 +쏔 +쏔 +쏔 + +쏕 +쏕 +쏕 +쏕 +쏕 + +쏖 +쏖 +쏖 +쏖 +쏖 + +쏗 +쏗 +쏗 +쏗 +쏗 + +쏘 +쏘 +쏘 +쏘 +쏘 + +쏙 +쏙 +쏙 +쏙 +쏙 + +쏚 +쏚 +쏚 +쏚 +쏚 + +쏛 +쏛 +쏛 +쏛 +쏛 + +쏜 +쏜 +쏜 +쏜 +쏜 + +쏝 +쏝 +쏝 +쏝 +쏝 + +쏞 +쏞 +쏞 +쏞 +쏞 + +쏟 +쏟 +쏟 +쏟 +쏟 + +쏠 +쏠 +쏠 +쏠 +쏠 + +쏡 +쏡 +쏡 +쏡 +쏡 + +쏢 +쏢 +쏢 +쏢 +쏢 + +쏣 +쏣 +쏣 +쏣 +쏣 + +쏤 +쏤 +쏤 +쏤 +쏤 + +쏥 +쏥 +쏥 +쏥 +쏥 + +쏦 +쏦 +쏦 +쏦 +쏦 + +쏧 +쏧 +쏧 +쏧 +쏧 + +쏨 +쏨 +쏨 +쏨 +쏨 + +쏩 +쏩 +쏩 +쏩 +쏩 + +쏪 +쏪 +쏪 +쏪 +쏪 + +쏫 +쏫 +쏫 +쏫 +쏫 + +쏬 +쏬 +쏬 +쏬 +쏬 + +쏭 +쏭 +쏭 +쏭 +쏭 + +쏮 +쏮 +쏮 +쏮 +쏮 + +쏯 +쏯 +쏯 +쏯 +쏯 + +쏰 +쏰 +쏰 +쏰 +쏰 + +쏱 +쏱 +쏱 +쏱 +쏱 + +쏲 +쏲 +쏲 +쏲 +쏲 + +쏳 +쏳 +쏳 +쏳 +쏳 + +쏴 +쏴 +쏴 +쏴 +쏴 + +쏵 +쏵 +쏵 +쏵 +쏵 + +쏶 +쏶 +쏶 +쏶 +쏶 + +쏷 +쏷 +쏷 +쏷 +쏷 + +쏸 +쏸 +쏸 +쏸 +쏸 + +쏹 +쏹 +쏹 +쏹 +쏹 + +쏺 +쏺 +쏺 +쏺 +쏺 + +쏻 +쏻 +쏻 +쏻 +쏻 + +쏼 +쏼 +쏼 +쏼 +쏼 + +쏽 +쏽 +쏽 +쏽 +쏽 + +쏾 +쏾 +쏾 +쏾 +쏾 + +쏿 +쏿 +쏿 +쏿 +쏿 + +쐀 +쐀 +쐀 +쐀 +쐀 + +쐁 +쐁 +쐁 +쐁 +쐁 + +쐂 +쐂 +쐂 +쐂 +쐂 + +쐃 +쐃 +쐃 +쐃 +쐃 + +쐄 +쐄 +쐄 +쐄 +쐄 + +쐅 +쐅 +쐅 +쐅 +쐅 + +쐆 +쐆 +쐆 +쐆 +쐆 + +쐇 +쐇 +쐇 +쐇 +쐇 + +쐈 +쐈 +쐈 +쐈 +쐈 + +쐉 +쐉 +쐉 +쐉 +쐉 + +쐊 +쐊 +쐊 +쐊 +쐊 + +쐋 +쐋 +쐋 +쐋 +쐋 + +쐌 +쐌 +쐌 +쐌 +쐌 + +쐍 +쐍 +쐍 +쐍 +쐍 + +쐎 +쐎 +쐎 +쐎 +쐎 + +쐏 +쐏 +쐏 +쐏 +쐏 + +쐐 +쐐 +쐐 +쐐 +쐐 + +쐑 +쐑 +쐑 +쐑 +쐑 + +쐒 +쐒 +쐒 +쐒 +쐒 + +쐓 +쐓 +쐓 +쐓 +쐓 + +쐔 +쐔 +쐔 +쐔 +쐔 + +쐕 +쐕 +쐕 +쐕 +쐕 + +쐖 +쐖 +쐖 +쐖 +쐖 + +쐗 +쐗 +쐗 +쐗 +쐗 + +쐘 +쐘 +쐘 +쐘 +쐘 + +쐙 +쐙 +쐙 +쐙 +쐙 + +쐚 +쐚 +쐚 +쐚 +쐚 + +쐛 +쐛 +쐛 +쐛 +쐛 + +쐜 +쐜 +쐜 +쐜 +쐜 + +쐝 +쐝 +쐝 +쐝 +쐝 + +쐞 +쐞 +쐞 +쐞 +쐞 + +쐟 +쐟 +쐟 +쐟 +쐟 + +쐠 +쐠 +쐠 +쐠 +쐠 + +쐡 +쐡 +쐡 +쐡 +쐡 + +쐢 +쐢 +쐢 +쐢 +쐢 + +쐣 +쐣 +쐣 +쐣 +쐣 + +쐤 +쐤 +쐤 +쐤 +쐤 + +쐥 +쐥 +쐥 +쐥 +쐥 + +쐦 +쐦 +쐦 +쐦 +쐦 + +쐧 +쐧 +쐧 +쐧 +쐧 + +쐨 +쐨 +쐨 +쐨 +쐨 + +쐩 +쐩 +쐩 +쐩 +쐩 + +쐪 +쐪 +쐪 +쐪 +쐪 + +쐫 +쐫 +쐫 +쐫 +쐫 + +쐬 +쐬 +쐬 +쐬 +쐬 + +쐭 +쐭 +쐭 +쐭 +쐭 + +쐮 +쐮 +쐮 +쐮 +쐮 + +쐯 +쐯 +쐯 +쐯 +쐯 + +쐰 +쐰 +쐰 +쐰 +쐰 + +쐱 +쐱 +쐱 +쐱 +쐱 + +쐲 +쐲 +쐲 +쐲 +쐲 + +쐳 +쐳 +쐳 +쐳 +쐳 + +쐴 +쐴 +쐴 +쐴 +쐴 + +쐵 +쐵 +쐵 +쐵 +쐵 + +쐶 +쐶 +쐶 +쐶 +쐶 + +쐷 +쐷 +쐷 +쐷 +쐷 + +쐸 +쐸 +쐸 +쐸 +쐸 + +쐹 +쐹 +쐹 +쐹 +쐹 + +쐺 +쐺 +쐺 +쐺 +쐺 + +쐻 +쐻 +쐻 +쐻 +쐻 + +쐼 +쐼 +쐼 +쐼 +쐼 + +쐽 +쐽 +쐽 +쐽 +쐽 + +쐾 +쐾 +쐾 +쐾 +쐾 + +쐿 +쐿 +쐿 +쐿 +쐿 + +쑀 +쑀 +쑀 +쑀 +쑀 + +쑁 +쑁 +쑁 +쑁 +쑁 + +쑂 +쑂 +쑂 +쑂 +쑂 + +쑃 +쑃 +쑃 +쑃 +쑃 + +쑄 +쑄 +쑄 +쑄 +쑄 + +쑅 +쑅 +쑅 +쑅 +쑅 + +쑆 +쑆 +쑆 +쑆 +쑆 + +쑇 +쑇 +쑇 +쑇 +쑇 + +쑈 +쑈 +쑈 +쑈 +쑈 + +쑉 +쑉 +쑉 +쑉 +쑉 + +쑊 +쑊 +쑊 +쑊 +쑊 + +쑋 +쑋 +쑋 +쑋 +쑋 + +쑌 +쑌 +쑌 +쑌 +쑌 + +쑍 +쑍 +쑍 +쑍 +쑍 + +쑎 +쑎 +쑎 +쑎 +쑎 + +쑏 +쑏 +쑏 +쑏 +쑏 + +쑐 +쑐 +쑐 +쑐 +쑐 + +쑑 +쑑 +쑑 +쑑 +쑑 + +쑒 +쑒 +쑒 +쑒 +쑒 + +쑓 +쑓 +쑓 +쑓 +쑓 + +쑔 +쑔 +쑔 +쑔 +쑔 + +쑕 +쑕 +쑕 +쑕 +쑕 + +쑖 +쑖 +쑖 +쑖 +쑖 + +쑗 +쑗 +쑗 +쑗 +쑗 + +쑘 +쑘 +쑘 +쑘 +쑘 + +쑙 +쑙 +쑙 +쑙 +쑙 + +쑚 +쑚 +쑚 +쑚 +쑚 + +쑛 +쑛 +쑛 +쑛 +쑛 + +쑜 +쑜 +쑜 +쑜 +쑜 + +쑝 +쑝 +쑝 +쑝 +쑝 + +쑞 +쑞 +쑞 +쑞 +쑞 + +쑟 +쑟 +쑟 +쑟 +쑟 + +쑠 +쑠 +쑠 +쑠 +쑠 + +쑡 +쑡 +쑡 +쑡 +쑡 + +쑢 +쑢 +쑢 +쑢 +쑢 + +쑣 +쑣 +쑣 +쑣 +쑣 + +쑤 +쑤 +쑤 +쑤 +쑤 + +쑥 +쑥 +쑥 +쑥 +쑥 + +쑦 +쑦 +쑦 +쑦 +쑦 + +쑧 +쑧 +쑧 +쑧 +쑧 + +쑨 +쑨 +쑨 +쑨 +쑨 + +쑩 +쑩 +쑩 +쑩 +쑩 + +쑪 +쑪 +쑪 +쑪 +쑪 + +쑫 +쑫 +쑫 +쑫 +쑫 + +쑬 +쑬 +쑬 +쑬 +쑬 + +쑭 +쑭 +쑭 +쑭 +쑭 + +쑮 +쑮 +쑮 +쑮 +쑮 + +쑯 +쑯 +쑯 +쑯 +쑯 + +쑰 +쑰 +쑰 +쑰 +쑰 + +쑱 +쑱 +쑱 +쑱 +쑱 + +쑲 +쑲 +쑲 +쑲 +쑲 + +쑳 +쑳 +쑳 +쑳 +쑳 + +쑴 +쑴 +쑴 +쑴 +쑴 + +쑵 +쑵 +쑵 +쑵 +쑵 + +쑶 +쑶 +쑶 +쑶 +쑶 + +쑷 +쑷 +쑷 +쑷 +쑷 + +쑸 +쑸 +쑸 +쑸 +쑸 + +쑹 +쑹 +쑹 +쑹 +쑹 + +쑺 +쑺 +쑺 +쑺 +쑺 + +쑻 +쑻 +쑻 +쑻 +쑻 + +쑼 +쑼 +쑼 +쑼 +쑼 + +쑽 +쑽 +쑽 +쑽 +쑽 + +쑾 +쑾 +쑾 +쑾 +쑾 + +쑿 +쑿 +쑿 +쑿 +쑿 + +쒀 +쒀 +쒀 +쒀 +쒀 + +쒁 +쒁 +쒁 +쒁 +쒁 + +쒂 +쒂 +쒂 +쒂 +쒂 + +쒃 +쒃 +쒃 +쒃 +쒃 + +쒄 +쒄 +쒄 +쒄 +쒄 + +쒅 +쒅 +쒅 +쒅 +쒅 + +쒆 +쒆 +쒆 +쒆 +쒆 + +쒇 +쒇 +쒇 +쒇 +쒇 + +쒈 +쒈 +쒈 +쒈 +쒈 + +쒉 +쒉 +쒉 +쒉 +쒉 + +쒊 +쒊 +쒊 +쒊 +쒊 + +쒋 +쒋 +쒋 +쒋 +쒋 + +쒌 +쒌 +쒌 +쒌 +쒌 + +쒍 +쒍 +쒍 +쒍 +쒍 + +쒎 +쒎 +쒎 +쒎 +쒎 + +쒏 +쒏 +쒏 +쒏 +쒏 + +쒐 +쒐 +쒐 +쒐 +쒐 + +쒑 +쒑 +쒑 +쒑 +쒑 + +쒒 +쒒 +쒒 +쒒 +쒒 + +쒓 +쒓 +쒓 +쒓 +쒓 + +쒔 +쒔 +쒔 +쒔 +쒔 + +쒕 +쒕 +쒕 +쒕 +쒕 + +쒖 +쒖 +쒖 +쒖 +쒖 + +쒗 +쒗 +쒗 +쒗 +쒗 + +쒘 +쒘 +쒘 +쒘 +쒘 + +쒙 +쒙 +쒙 +쒙 +쒙 + +쒚 +쒚 +쒚 +쒚 +쒚 + +쒛 +쒛 +쒛 +쒛 +쒛 + +쒜 +쒜 +쒜 +쒜 +쒜 + +쒝 +쒝 +쒝 +쒝 +쒝 + +쒞 +쒞 +쒞 +쒞 +쒞 + +쒟 +쒟 +쒟 +쒟 +쒟 + +쒠 +쒠 +쒠 +쒠 +쒠 + +쒡 +쒡 +쒡 +쒡 +쒡 + +쒢 +쒢 +쒢 +쒢 +쒢 + +쒣 +쒣 +쒣 +쒣 +쒣 + +쒤 +쒤 +쒤 +쒤 +쒤 + +쒥 +쒥 +쒥 +쒥 +쒥 + +쒦 +쒦 +쒦 +쒦 +쒦 + +쒧 +쒧 +쒧 +쒧 +쒧 + +쒨 +쒨 +쒨 +쒨 +쒨 + +쒩 +쒩 +쒩 +쒩 +쒩 + +쒪 +쒪 +쒪 +쒪 +쒪 + +쒫 +쒫 +쒫 +쒫 +쒫 + +쒬 +쒬 +쒬 +쒬 +쒬 + +쒭 +쒭 +쒭 +쒭 +쒭 + +쒮 +쒮 +쒮 +쒮 +쒮 + +쒯 +쒯 +쒯 +쒯 +쒯 + +쒰 +쒰 +쒰 +쒰 +쒰 + +쒱 +쒱 +쒱 +쒱 +쒱 + +쒲 +쒲 +쒲 +쒲 +쒲 + +쒳 +쒳 +쒳 +쒳 +쒳 + +쒴 +쒴 +쒴 +쒴 +쒴 + +쒵 +쒵 +쒵 +쒵 +쒵 + +쒶 +쒶 +쒶 +쒶 +쒶 + +쒷 +쒷 +쒷 +쒷 +쒷 + +쒸 +쒸 +쒸 +쒸 +쒸 + +쒹 +쒹 +쒹 +쒹 +쒹 + +쒺 +쒺 +쒺 +쒺 +쒺 + +쒻 +쒻 +쒻 +쒻 +쒻 + +쒼 +쒼 +쒼 +쒼 +쒼 + +쒽 +쒽 +쒽 +쒽 +쒽 + +쒾 +쒾 +쒾 +쒾 +쒾 + +쒿 +쒿 +쒿 +쒿 +쒿 + +쓀 +쓀 +쓀 +쓀 +쓀 + +쓁 +쓁 +쓁 +쓁 +쓁 + +쓂 +쓂 +쓂 +쓂 +쓂 + +쓃 +쓃 +쓃 +쓃 +쓃 + +쓄 +쓄 +쓄 +쓄 +쓄 + +쓅 +쓅 +쓅 +쓅 +쓅 + +쓆 +쓆 +쓆 +쓆 +쓆 + +쓇 +쓇 +쓇 +쓇 +쓇 + +쓈 +쓈 +쓈 +쓈 +쓈 + +쓉 +쓉 +쓉 +쓉 +쓉 + +쓊 +쓊 +쓊 +쓊 +쓊 + +쓋 +쓋 +쓋 +쓋 +쓋 + +쓌 +쓌 +쓌 +쓌 +쓌 + +쓍 +쓍 +쓍 +쓍 +쓍 + +쓎 +쓎 +쓎 +쓎 +쓎 + +쓏 +쓏 +쓏 +쓏 +쓏 + +쓐 +쓐 +쓐 +쓐 +쓐 + +쓑 +쓑 +쓑 +쓑 +쓑 + +쓒 +쓒 +쓒 +쓒 +쓒 + +쓓 +쓓 +쓓 +쓓 +쓓 + +쓔 +쓔 +쓔 +쓔 +쓔 + +쓕 +쓕 +쓕 +쓕 +쓕 + +쓖 +쓖 +쓖 +쓖 +쓖 + +쓗 +쓗 +쓗 +쓗 +쓗 + +쓘 +쓘 +쓘 +쓘 +쓘 + +쓙 +쓙 +쓙 +쓙 +쓙 + +쓚 +쓚 +쓚 +쓚 +쓚 + +쓛 +쓛 +쓛 +쓛 +쓛 + +쓜 +쓜 +쓜 +쓜 +쓜 + +쓝 +쓝 +쓝 +쓝 +쓝 + +쓞 +쓞 +쓞 +쓞 +쓞 + +쓟 +쓟 +쓟 +쓟 +쓟 + +쓠 +쓠 +쓠 +쓠 +쓠 + +쓡 +쓡 +쓡 +쓡 +쓡 + +쓢 +쓢 +쓢 +쓢 +쓢 + +쓣 +쓣 +쓣 +쓣 +쓣 + +쓤 +쓤 +쓤 +쓤 +쓤 + +쓥 +쓥 +쓥 +쓥 +쓥 + +쓦 +쓦 +쓦 +쓦 +쓦 + +쓧 +쓧 +쓧 +쓧 +쓧 + +쓨 +쓨 +쓨 +쓨 +쓨 + +쓩 +쓩 +쓩 +쓩 +쓩 + +쓪 +쓪 +쓪 +쓪 +쓪 + +쓫 +쓫 +쓫 +쓫 +쓫 + +쓬 +쓬 +쓬 +쓬 +쓬 + +쓭 +쓭 +쓭 +쓭 +쓭 + +쓮 +쓮 +쓮 +쓮 +쓮 + +쓯 +쓯 +쓯 +쓯 +쓯 + +쓰 +쓰 +쓰 +쓰 +쓰 + +쓱 +쓱 +쓱 +쓱 +쓱 + +쓲 +쓲 +쓲 +쓲 +쓲 + +쓳 +쓳 +쓳 +쓳 +쓳 + +쓴 +쓴 +쓴 +쓴 +쓴 + +쓵 +쓵 +쓵 +쓵 +쓵 + +쓶 +쓶 +쓶 +쓶 +쓶 + +쓷 +쓷 +쓷 +쓷 +쓷 + +쓸 +쓸 +쓸 +쓸 +쓸 + +쓹 +쓹 +쓹 +쓹 +쓹 + +쓺 +쓺 +쓺 +쓺 +쓺 + +쓻 +쓻 +쓻 +쓻 +쓻 + +쓼 +쓼 +쓼 +쓼 +쓼 + +쓽 +쓽 +쓽 +쓽 +쓽 + +쓾 +쓾 +쓾 +쓾 +쓾 + +쓿 +쓿 +쓿 +쓿 +쓿 + +씀 +씀 +씀 +씀 +씀 + +씁 +씁 +씁 +씁 +씁 + +씂 +씂 +씂 +씂 +씂 + +씃 +씃 +씃 +씃 +씃 + +씄 +씄 +씄 +씄 +씄 + +씅 +씅 +씅 +씅 +씅 + +씆 +씆 +씆 +씆 +씆 + +씇 +씇 +씇 +씇 +씇 + +씈 +씈 +씈 +씈 +씈 + +씉 +씉 +씉 +씉 +씉 + +씊 +씊 +씊 +씊 +씊 + +씋 +씋 +씋 +씋 +씋 + +씌 +씌 +씌 +씌 +씌 + +씍 +씍 +씍 +씍 +씍 + +씎 +씎 +씎 +씎 +씎 + +씏 +씏 +씏 +씏 +씏 + +씐 +씐 +씐 +씐 +씐 + +씑 +씑 +씑 +씑 +씑 + +씒 +씒 +씒 +씒 +씒 + +씓 +씓 +씓 +씓 +씓 + +씔 +씔 +씔 +씔 +씔 + +씕 +씕 +씕 +씕 +씕 + +씖 +씖 +씖 +씖 +씖 + +씗 +씗 +씗 +씗 +씗 + +씘 +씘 +씘 +씘 +씘 + +씙 +씙 +씙 +씙 +씙 + +씚 +씚 +씚 +씚 +씚 + +씛 +씛 +씛 +씛 +씛 + +씜 +씜 +씜 +씜 +씜 + +씝 +씝 +씝 +씝 +씝 + +씞 +씞 +씞 +씞 +씞 + +씟 +씟 +씟 +씟 +씟 + +씠 +씠 +씠 +씠 +씠 + +씡 +씡 +씡 +씡 +씡 + +씢 +씢 +씢 +씢 +씢 + +씣 +씣 +씣 +씣 +씣 + +씤 +씤 +씤 +씤 +씤 + +씥 +씥 +씥 +씥 +씥 + +씦 +씦 +씦 +씦 +씦 + +씧 +씧 +씧 +씧 +씧 + +씨 +씨 +씨 +씨 +씨 + +씩 +씩 +씩 +씩 +씩 + +씪 +씪 +씪 +씪 +씪 + +씫 +씫 +씫 +씫 +씫 + +씬 +씬 +씬 +씬 +씬 + +씭 +씭 +씭 +씭 +씭 + +씮 +씮 +씮 +씮 +씮 + +씯 +씯 +씯 +씯 +씯 + +씰 +씰 +씰 +씰 +씰 + +씱 +씱 +씱 +씱 +씱 + +씲 +씲 +씲 +씲 +씲 + +씳 +씳 +씳 +씳 +씳 + +씴 +씴 +씴 +씴 +씴 + +씵 +씵 +씵 +씵 +씵 + +씶 +씶 +씶 +씶 +씶 + +씷 +씷 +씷 +씷 +씷 + +씸 +씸 +씸 +씸 +씸 + +씹 +씹 +씹 +씹 +씹 + +씺 +씺 +씺 +씺 +씺 + +씻 +씻 +씻 +씻 +씻 + +씼 +씼 +씼 +씼 +씼 + +씽 +씽 +씽 +씽 +씽 + +씾 +씾 +씾 +씾 +씾 + +씿 +씿 +씿 +씿 +씿 + +앀 +앀 +앀 +앀 +앀 + +앁 +앁 +앁 +앁 +앁 + +앂 +앂 +앂 +앂 +앂 + +앃 +앃 +앃 +앃 +앃 + +아 +아 +아 +아 +아 + +악 +악 +악 +악 +악 + +앆 +앆 +앆 +앆 +앆 + +앇 +앇 +앇 +앇 +앇 + +안 +안 +안 +안 +안 + +앉 +앉 +앉 +앉 +앉 + +않 +않 +않 +않 +않 + +앋 +앋 +앋 +앋 +앋 + +알 +알 +알 +알 +알 + +앍 +앍 +앍 +앍 +앍 + +앎 +앎 +앎 +앎 +앎 + +앏 +앏 +앏 +앏 +앏 + +앐 +앐 +앐 +앐 +앐 + +앑 +앑 +앑 +앑 +앑 + +앒 +앒 +앒 +앒 +앒 + +앓 +앓 +앓 +앓 +앓 + +암 +암 +암 +암 +암 + +압 +압 +압 +압 +압 + +앖 +앖 +앖 +앖 +앖 + +앗 +앗 +앗 +앗 +앗 + +았 +았 +았 +았 +았 + +앙 +앙 +앙 +앙 +앙 + +앚 +앚 +앚 +앚 +앚 + +앛 +앛 +앛 +앛 +앛 + +앜 +앜 +앜 +앜 +앜 + +앝 +앝 +앝 +앝 +앝 + +앞 +앞 +앞 +앞 +앞 + +앟 +앟 +앟 +앟 +앟 + +애 +애 +애 +애 +애 + +액 +액 +액 +액 +액 + +앢 +앢 +앢 +앢 +앢 + +앣 +앣 +앣 +앣 +앣 + +앤 +앤 +앤 +앤 +앤 + +앥 +앥 +앥 +앥 +앥 + +앦 +앦 +앦 +앦 +앦 + +앧 +앧 +앧 +앧 +앧 + +앨 +앨 +앨 +앨 +앨 + +앩 +앩 +앩 +앩 +앩 + +앪 +앪 +앪 +앪 +앪 + +앫 +앫 +앫 +앫 +앫 + +앬 +앬 +앬 +앬 +앬 + +앭 +앭 +앭 +앭 +앭 + +앮 +앮 +앮 +앮 +앮 + +앯 +앯 +앯 +앯 +앯 + +앰 +앰 +앰 +앰 +앰 + +앱 +앱 +앱 +앱 +앱 + +앲 +앲 +앲 +앲 +앲 + +앳 +앳 +앳 +앳 +앳 + +앴 +앴 +앴 +앴 +앴 + +앵 +앵 +앵 +앵 +앵 + +앶 +앶 +앶 +앶 +앶 + +앷 +앷 +앷 +앷 +앷 + +앸 +앸 +앸 +앸 +앸 + +앹 +앹 +앹 +앹 +앹 + +앺 +앺 +앺 +앺 +앺 + +앻 +앻 +앻 +앻 +앻 + +야 +야 +야 +야 +야 + +약 +약 +약 +약 +약 + +앾 +앾 +앾 +앾 +앾 + +앿 +앿 +앿 +앿 +앿 + +얀 +얀 +얀 +얀 +얀 + +얁 +얁 +얁 +얁 +얁 + +얂 +얂 +얂 +얂 +얂 + +얃 +얃 +얃 +얃 +얃 + +얄 +얄 +얄 +얄 +얄 + +얅 +얅 +얅 +얅 +얅 + +얆 +얆 +얆 +얆 +얆 + +얇 +얇 +얇 +얇 +얇 + +얈 +얈 +얈 +얈 +얈 + +얉 +얉 +얉 +얉 +얉 + +얊 +얊 +얊 +얊 +얊 + +얋 +얋 +얋 +얋 +얋 + +얌 +얌 +얌 +얌 +얌 + +얍 +얍 +얍 +얍 +얍 + +얎 +얎 +얎 +얎 +얎 + +얏 +얏 +얏 +얏 +얏 + +얐 +얐 +얐 +얐 +얐 + +양 +양 +양 +양 +양 + +얒 +얒 +얒 +얒 +얒 + +얓 +얓 +얓 +얓 +얓 + +얔 +얔 +얔 +얔 +얔 + +얕 +얕 +얕 +얕 +얕 + +얖 +얖 +얖 +얖 +얖 + +얗 +얗 +얗 +얗 +얗 + +얘 +얘 +얘 +얘 +얘 + +얙 +얙 +얙 +얙 +얙 + +얚 +얚 +얚 +얚 +얚 + +얛 +얛 +얛 +얛 +얛 + +얜 +얜 +얜 +얜 +얜 + +얝 +얝 +얝 +얝 +얝 + +얞 +얞 +얞 +얞 +얞 + +얟 +얟 +얟 +얟 +얟 + +얠 +얠 +얠 +얠 +얠 + +얡 +얡 +얡 +얡 +얡 + +얢 +얢 +얢 +얢 +얢 + +얣 +얣 +얣 +얣 +얣 + +얤 +얤 +얤 +얤 +얤 + +얥 +얥 +얥 +얥 +얥 + +얦 +얦 +얦 +얦 +얦 + +얧 +얧 +얧 +얧 +얧 + +얨 +얨 +얨 +얨 +얨 + +얩 +얩 +얩 +얩 +얩 + +얪 +얪 +얪 +얪 +얪 + +얫 +얫 +얫 +얫 +얫 + +얬 +얬 +얬 +얬 +얬 + +얭 +얭 +얭 +얭 +얭 + +얮 +얮 +얮 +얮 +얮 + +얯 +얯 +얯 +얯 +얯 + +얰 +얰 +얰 +얰 +얰 + +얱 +얱 +얱 +얱 +얱 + +얲 +얲 +얲 +얲 +얲 + +얳 +얳 +얳 +얳 +얳 + +어 +어 +어 +어 +어 + +억 +억 +억 +억 +억 + +얶 +얶 +얶 +얶 +얶 + +얷 +얷 +얷 +얷 +얷 + +언 +언 +언 +언 +언 + +얹 +얹 +얹 +얹 +얹 + +얺 +얺 +얺 +얺 +얺 + +얻 +얻 +얻 +얻 +얻 + +얼 +얼 +얼 +얼 +얼 + +얽 +얽 +얽 +얽 +얽 + +얾 +얾 +얾 +얾 +얾 + +얿 +얿 +얿 +얿 +얿 + +엀 +엀 +엀 +엀 +엀 + +엁 +엁 +엁 +엁 +엁 + +엂 +엂 +엂 +엂 +엂 + +엃 +엃 +엃 +엃 +엃 + +엄 +엄 +엄 +엄 +엄 + +업 +업 +업 +업 +업 + +없 +없 +없 +없 +없 + +엇 +엇 +엇 +엇 +엇 + +었 +었 +었 +었 +었 + +엉 +엉 +엉 +엉 +엉 + +엊 +엊 +엊 +엊 +엊 + +엋 +엋 +엋 +엋 +엋 + +엌 +엌 +엌 +엌 +엌 + +엍 +엍 +엍 +엍 +엍 + +엎 +엎 +엎 +엎 +엎 + +엏 +엏 +엏 +엏 +엏 + +에 +에 +에 +에 +에 + +엑 +엑 +엑 +엑 +엑 + +엒 +엒 +엒 +엒 +엒 + +엓 +엓 +엓 +엓 +엓 + +엔 +엔 +엔 +엔 +엔 + +엕 +엕 +엕 +엕 +엕 + +엖 +엖 +엖 +엖 +엖 + +엗 +엗 +엗 +엗 +엗 + +엘 +엘 +엘 +엘 +엘 + +엙 +엙 +엙 +엙 +엙 + +엚 +엚 +엚 +엚 +엚 + +엛 +엛 +엛 +엛 +엛 + +엜 +엜 +엜 +엜 +엜 + +엝 +엝 +엝 +엝 +엝 + +엞 +엞 +엞 +엞 +엞 + +엟 +엟 +엟 +엟 +엟 + +엠 +엠 +엠 +엠 +엠 + +엡 +엡 +엡 +엡 +엡 + +엢 +엢 +엢 +엢 +엢 + +엣 +엣 +엣 +엣 +엣 + +엤 +엤 +엤 +엤 +엤 + +엥 +엥 +엥 +엥 +엥 + +엦 +엦 +엦 +엦 +엦 + +엧 +엧 +엧 +엧 +엧 + +엨 +엨 +엨 +엨 +엨 + +엩 +엩 +엩 +엩 +엩 + +엪 +엪 +엪 +엪 +엪 + +엫 +엫 +엫 +엫 +엫 + +여 +여 +여 +여 +여 + +역 +역 +역 +역 +역 + +엮 +엮 +엮 +엮 +엮 + +엯 +엯 +엯 +엯 +엯 + +연 +연 +연 +연 +연 + +엱 +엱 +엱 +엱 +엱 + +엲 +엲 +엲 +엲 +엲 + +엳 +엳 +엳 +엳 +엳 + +열 +열 +열 +열 +열 + +엵 +엵 +엵 +엵 +엵 + +엶 +엶 +엶 +엶 +엶 + +엷 +엷 +엷 +엷 +엷 + +엸 +엸 +엸 +엸 +엸 + +엹 +엹 +엹 +엹 +엹 + +엺 +엺 +엺 +엺 +엺 + +엻 +엻 +엻 +엻 +엻 + +염 +염 +염 +염 +염 + +엽 +엽 +엽 +엽 +엽 + +엾 +엾 +엾 +엾 +엾 + +엿 +엿 +엿 +엿 +엿 + +였 +였 +였 +였 +였 + +영 +영 +영 +영 +영 + +옂 +옂 +옂 +옂 +옂 + +옃 +옃 +옃 +옃 +옃 + +옄 +옄 +옄 +옄 +옄 + +옅 +옅 +옅 +옅 +옅 + +옆 +옆 +옆 +옆 +옆 + +옇 +옇 +옇 +옇 +옇 + +예 +예 +예 +예 +예 + +옉 +옉 +옉 +옉 +옉 + +옊 +옊 +옊 +옊 +옊 + +옋 +옋 +옋 +옋 +옋 + +옌 +옌 +옌 +옌 +옌 + +옍 +옍 +옍 +옍 +옍 + +옎 +옎 +옎 +옎 +옎 + +옏 +옏 +옏 +옏 +옏 + +옐 +옐 +옐 +옐 +옐 + +옑 +옑 +옑 +옑 +옑 + +옒 +옒 +옒 +옒 +옒 + +옓 +옓 +옓 +옓 +옓 + +옔 +옔 +옔 +옔 +옔 + +옕 +옕 +옕 +옕 +옕 + +옖 +옖 +옖 +옖 +옖 + +옗 +옗 +옗 +옗 +옗 + +옘 +옘 +옘 +옘 +옘 + +옙 +옙 +옙 +옙 +옙 + +옚 +옚 +옚 +옚 +옚 + +옛 +옛 +옛 +옛 +옛 + +옜 +옜 +옜 +옜 +옜 + +옝 +옝 +옝 +옝 +옝 + +옞 +옞 +옞 +옞 +옞 + +옟 +옟 +옟 +옟 +옟 + +옠 +옠 +옠 +옠 +옠 + +옡 +옡 +옡 +옡 +옡 + +옢 +옢 +옢 +옢 +옢 + +옣 +옣 +옣 +옣 +옣 + +오 +오 +오 +오 +오 + +옥 +옥 +옥 +옥 +옥 + +옦 +옦 +옦 +옦 +옦 + +옧 +옧 +옧 +옧 +옧 + +온 +온 +온 +온 +온 + +옩 +옩 +옩 +옩 +옩 + +옪 +옪 +옪 +옪 +옪 + +옫 +옫 +옫 +옫 +옫 + +올 +올 +올 +올 +올 + +옭 +옭 +옭 +옭 +옭 + +옮 +옮 +옮 +옮 +옮 + +옯 +옯 +옯 +옯 +옯 + +옰 +옰 +옰 +옰 +옰 + +옱 +옱 +옱 +옱 +옱 + +옲 +옲 +옲 +옲 +옲 + +옳 +옳 +옳 +옳 +옳 + +옴 +옴 +옴 +옴 +옴 + +옵 +옵 +옵 +옵 +옵 + +옶 +옶 +옶 +옶 +옶 + +옷 +옷 +옷 +옷 +옷 + +옸 +옸 +옸 +옸 +옸 + +옹 +옹 +옹 +옹 +옹 + +옺 +옺 +옺 +옺 +옺 + +옻 +옻 +옻 +옻 +옻 + +옼 +옼 +옼 +옼 +옼 + +옽 +옽 +옽 +옽 +옽 + +옾 +옾 +옾 +옾 +옾 + +옿 +옿 +옿 +옿 +옿 + +와 +와 +와 +와 +와 + +왁 +왁 +왁 +왁 +왁 + +왂 +왂 +왂 +왂 +왂 + +왃 +왃 +왃 +왃 +왃 + +완 +완 +완 +완 +완 + +왅 +왅 +왅 +왅 +왅 + +왆 +왆 +왆 +왆 +왆 + +왇 +왇 +왇 +왇 +왇 + +왈 +왈 +왈 +왈 +왈 + +왉 +왉 +왉 +왉 +왉 + +왊 +왊 +왊 +왊 +왊 + +왋 +왋 +왋 +왋 +왋 + +왌 +왌 +왌 +왌 +왌 + +왍 +왍 +왍 +왍 +왍 + +왎 +왎 +왎 +왎 +왎 + +왏 +왏 +왏 +왏 +왏 + +왐 +왐 +왐 +왐 +왐 + +왑 +왑 +왑 +왑 +왑 + +왒 +왒 +왒 +왒 +왒 + +왓 +왓 +왓 +왓 +왓 + +왔 +왔 +왔 +왔 +왔 + +왕 +왕 +왕 +왕 +왕 + +왖 +왖 +왖 +왖 +왖 + +왗 +왗 +왗 +왗 +왗 + +왘 +왘 +왘 +왘 +왘 + +왙 +왙 +왙 +왙 +왙 + +왚 +왚 +왚 +왚 +왚 + +왛 +왛 +왛 +왛 +왛 + +왜 +왜 +왜 +왜 +왜 + +왝 +왝 +왝 +왝 +왝 + +왞 +왞 +왞 +왞 +왞 + +왟 +왟 +왟 +왟 +왟 + +왠 +왠 +왠 +왠 +왠 + +왡 +왡 +왡 +왡 +왡 + +왢 +왢 +왢 +왢 +왢 + +왣 +왣 +왣 +왣 +왣 + +왤 +왤 +왤 +왤 +왤 + +왥 +왥 +왥 +왥 +왥 + +왦 +왦 +왦 +왦 +왦 + +왧 +왧 +왧 +왧 +왧 + +왨 +왨 +왨 +왨 +왨 + +왩 +왩 +왩 +왩 +왩 + +왪 +왪 +왪 +왪 +왪 + +왫 +왫 +왫 +왫 +왫 + +왬 +왬 +왬 +왬 +왬 + +왭 +왭 +왭 +왭 +왭 + +왮 +왮 +왮 +왮 +왮 + +왯 +왯 +왯 +왯 +왯 + +왰 +왰 +왰 +왰 +왰 + +왱 +왱 +왱 +왱 +왱 + +왲 +왲 +왲 +왲 +왲 + +왳 +왳 +왳 +왳 +왳 + +왴 +왴 +왴 +왴 +왴 + +왵 +왵 +왵 +왵 +왵 + +왶 +왶 +왶 +왶 +왶 + +왷 +왷 +왷 +왷 +왷 + +외 +외 +외 +외 +외 + +왹 +왹 +왹 +왹 +왹 + +왺 +왺 +왺 +왺 +왺 + +왻 +왻 +왻 +왻 +왻 + +왼 +왼 +왼 +왼 +왼 + +왽 +왽 +왽 +왽 +왽 + +왾 +왾 +왾 +왾 +왾 + +왿 +왿 +왿 +왿 +왿 + +욀 +욀 +욀 +욀 +욀 + +욁 +욁 +욁 +욁 +욁 + +욂 +욂 +욂 +욂 +욂 + +욃 +욃 +욃 +욃 +욃 + +욄 +욄 +욄 +욄 +욄 + +욅 +욅 +욅 +욅 +욅 + +욆 +욆 +욆 +욆 +욆 + +욇 +욇 +욇 +욇 +욇 + +욈 +욈 +욈 +욈 +욈 + +욉 +욉 +욉 +욉 +욉 + +욊 +욊 +욊 +욊 +욊 + +욋 +욋 +욋 +욋 +욋 + +욌 +욌 +욌 +욌 +욌 + +욍 +욍 +욍 +욍 +욍 + +욎 +욎 +욎 +욎 +욎 + +욏 +욏 +욏 +욏 +욏 + +욐 +욐 +욐 +욐 +욐 + +욑 +욑 +욑 +욑 +욑 + +욒 +욒 +욒 +욒 +욒 + +욓 +욓 +욓 +욓 +욓 + +요 +요 +요 +요 +요 + +욕 +욕 +욕 +욕 +욕 + +욖 +욖 +욖 +욖 +욖 + +욗 +욗 +욗 +욗 +욗 + +욘 +욘 +욘 +욘 +욘 + +욙 +욙 +욙 +욙 +욙 + +욚 +욚 +욚 +욚 +욚 + +욛 +욛 +욛 +욛 +욛 + +욜 +욜 +욜 +욜 +욜 + +욝 +욝 +욝 +욝 +욝 + +욞 +욞 +욞 +욞 +욞 + +욟 +욟 +욟 +욟 +욟 + +욠 +욠 +욠 +욠 +욠 + +욡 +욡 +욡 +욡 +욡 + +욢 +욢 +욢 +욢 +욢 + +욣 +욣 +욣 +욣 +욣 + +욤 +욤 +욤 +욤 +욤 + +욥 +욥 +욥 +욥 +욥 + +욦 +욦 +욦 +욦 +욦 + +욧 +욧 +욧 +욧 +욧 + +욨 +욨 +욨 +욨 +욨 + +용 +용 +용 +용 +용 + +욪 +욪 +욪 +욪 +욪 + +욫 +욫 +욫 +욫 +욫 + +욬 +욬 +욬 +욬 +욬 + +욭 +욭 +욭 +욭 +욭 + +욮 +욮 +욮 +욮 +욮 + +욯 +욯 +욯 +욯 +욯 + +우 +우 +우 +우 +우 + +욱 +욱 +욱 +욱 +욱 + +욲 +욲 +욲 +욲 +욲 + +욳 +욳 +욳 +욳 +욳 + +운 +운 +운 +운 +운 + +욵 +욵 +욵 +욵 +욵 + +욶 +욶 +욶 +욶 +욶 + +욷 +욷 +욷 +욷 +욷 + +울 +울 +울 +울 +울 + +욹 +욹 +욹 +욹 +욹 + +욺 +욺 +욺 +욺 +욺 + +욻 +욻 +욻 +욻 +욻 + +욼 +욼 +욼 +욼 +욼 + +욽 +욽 +욽 +욽 +욽 + +욾 +욾 +욾 +욾 +욾 + +욿 +욿 +욿 +욿 +욿 + +움 +움 +움 +움 +움 + +웁 +웁 +웁 +웁 +웁 + +웂 +웂 +웂 +웂 +웂 + +웃 +웃 +웃 +웃 +웃 + +웄 +웄 +웄 +웄 +웄 + +웅 +웅 +웅 +웅 +웅 + +웆 +웆 +웆 +웆 +웆 + +웇 +웇 +웇 +웇 +웇 + +웈 +웈 +웈 +웈 +웈 + +웉 +웉 +웉 +웉 +웉 + +웊 +웊 +웊 +웊 +웊 + +웋 +웋 +웋 +웋 +웋 + +워 +워 +워 +워 +워 + +웍 +웍 +웍 +웍 +웍 + +웎 +웎 +웎 +웎 +웎 + +웏 +웏 +웏 +웏 +웏 + +원 +원 +원 +원 +원 + +웑 +웑 +웑 +웑 +웑 + +웒 +웒 +웒 +웒 +웒 + +웓 +웓 +웓 +웓 +웓 + +월 +월 +월 +월 +월 + +웕 +웕 +웕 +웕 +웕 + +웖 +웖 +웖 +웖 +웖 + +웗 +웗 +웗 +웗 +웗 + +웘 +웘 +웘 +웘 +웘 + +웙 +웙 +웙 +웙 +웙 + +웚 +웚 +웚 +웚 +웚 + +웛 +웛 +웛 +웛 +웛 + +웜 +웜 +웜 +웜 +웜 + +웝 +웝 +웝 +웝 +웝 + +웞 +웞 +웞 +웞 +웞 + +웟 +웟 +웟 +웟 +웟 + +웠 +웠 +웠 +웠 +웠 + +웡 +웡 +웡 +웡 +웡 + +웢 +웢 +웢 +웢 +웢 + +웣 +웣 +웣 +웣 +웣 + +웤 +웤 +웤 +웤 +웤 + +웥 +웥 +웥 +웥 +웥 + +웦 +웦 +웦 +웦 +웦 + +웧 +웧 +웧 +웧 +웧 + +웨 +웨 +웨 +웨 +웨 + +웩 +웩 +웩 +웩 +웩 + +웪 +웪 +웪 +웪 +웪 + +웫 +웫 +웫 +웫 +웫 + +웬 +웬 +웬 +웬 +웬 + +웭 +웭 +웭 +웭 +웭 + +웮 +웮 +웮 +웮 +웮 + +웯 +웯 +웯 +웯 +웯 + +웰 +웰 +웰 +웰 +웰 + +웱 +웱 +웱 +웱 +웱 + +웲 +웲 +웲 +웲 +웲 + +웳 +웳 +웳 +웳 +웳 + +웴 +웴 +웴 +웴 +웴 + +웵 +웵 +웵 +웵 +웵 + +웶 +웶 +웶 +웶 +웶 + +웷 +웷 +웷 +웷 +웷 + +웸 +웸 +웸 +웸 +웸 + +웹 +웹 +웹 +웹 +웹 + +웺 +웺 +웺 +웺 +웺 + +웻 +웻 +웻 +웻 +웻 + +웼 +웼 +웼 +웼 +웼 + +웽 +웽 +웽 +웽 +웽 + +웾 +웾 +웾 +웾 +웾 + +웿 +웿 +웿 +웿 +웿 + +윀 +윀 +윀 +윀 +윀 + +윁 +윁 +윁 +윁 +윁 + +윂 +윂 +윂 +윂 +윂 + +윃 +윃 +윃 +윃 +윃 + +위 +위 +위 +위 +위 + +윅 +윅 +윅 +윅 +윅 + +윆 +윆 +윆 +윆 +윆 + +윇 +윇 +윇 +윇 +윇 + +윈 +윈 +윈 +윈 +윈 + +윉 +윉 +윉 +윉 +윉 + +윊 +윊 +윊 +윊 +윊 + +윋 +윋 +윋 +윋 +윋 + +윌 +윌 +윌 +윌 +윌 + +윍 +윍 +윍 +윍 +윍 + +윎 +윎 +윎 +윎 +윎 + +윏 +윏 +윏 +윏 +윏 + +윐 +윐 +윐 +윐 +윐 + +윑 +윑 +윑 +윑 +윑 + +윒 +윒 +윒 +윒 +윒 + +윓 +윓 +윓 +윓 +윓 + +윔 +윔 +윔 +윔 +윔 + +윕 +윕 +윕 +윕 +윕 + +윖 +윖 +윖 +윖 +윖 + +윗 +윗 +윗 +윗 +윗 + +윘 +윘 +윘 +윘 +윘 + +윙 +윙 +윙 +윙 +윙 + +윚 +윚 +윚 +윚 +윚 + +윛 +윛 +윛 +윛 +윛 + +윜 +윜 +윜 +윜 +윜 + +윝 +윝 +윝 +윝 +윝 + +윞 +윞 +윞 +윞 +윞 + +윟 +윟 +윟 +윟 +윟 + +유 +유 +유 +유 +유 + +육 +육 +육 +육 +육 + +윢 +윢 +윢 +윢 +윢 + +윣 +윣 +윣 +윣 +윣 + +윤 +윤 +윤 +윤 +윤 + +윥 +윥 +윥 +윥 +윥 + +윦 +윦 +윦 +윦 +윦 + +윧 +윧 +윧 +윧 +윧 + +율 +율 +율 +율 +율 + +윩 +윩 +윩 +윩 +윩 + +윪 +윪 +윪 +윪 +윪 + +윫 +윫 +윫 +윫 +윫 + +윬 +윬 +윬 +윬 +윬 + +윭 +윭 +윭 +윭 +윭 + +윮 +윮 +윮 +윮 +윮 + +윯 +윯 +윯 +윯 +윯 + +윰 +윰 +윰 +윰 +윰 + +윱 +윱 +윱 +윱 +윱 + +윲 +윲 +윲 +윲 +윲 + +윳 +윳 +윳 +윳 +윳 + +윴 +윴 +윴 +윴 +윴 + +융 +융 +융 +융 +융 + +윶 +윶 +윶 +윶 +윶 + +윷 +윷 +윷 +윷 +윷 + +윸 +윸 +윸 +윸 +윸 + +윹 +윹 +윹 +윹 +윹 + +윺 +윺 +윺 +윺 +윺 + +윻 +윻 +윻 +윻 +윻 + +으 +으 +으 +으 +으 + +윽 +윽 +윽 +윽 +윽 + +윾 +윾 +윾 +윾 +윾 + +윿 +윿 +윿 +윿 +윿 + +은 +은 +은 +은 +은 + +읁 +읁 +읁 +읁 +읁 + +읂 +읂 +읂 +읂 +읂 + +읃 +읃 +읃 +읃 +읃 + +을 +을 +을 +을 +을 + +읅 +읅 +읅 +읅 +읅 + +읆 +읆 +읆 +읆 +읆 + +읇 +읇 +읇 +읇 +읇 + +읈 +읈 +읈 +읈 +읈 + +읉 +읉 +읉 +읉 +읉 + +읊 +읊 +읊 +읊 +읊 + +읋 +읋 +읋 +읋 +읋 + +음 +음 +음 +음 +음 + +읍 +읍 +읍 +읍 +읍 + +읎 +읎 +읎 +읎 +읎 + +읏 +읏 +읏 +읏 +읏 + +읐 +읐 +읐 +읐 +읐 + +응 +응 +응 +응 +응 + +읒 +읒 +읒 +읒 +읒 + +읓 +읓 +읓 +읓 +읓 + +읔 +읔 +읔 +읔 +읔 + +읕 +읕 +읕 +읕 +읕 + +읖 +읖 +읖 +읖 +읖 + +읗 +읗 +읗 +읗 +읗 + +의 +의 +의 +의 +의 + +읙 +읙 +읙 +읙 +읙 + +읚 +읚 +읚 +읚 +읚 + +읛 +읛 +읛 +읛 +읛 + +읜 +읜 +읜 +읜 +읜 + +읝 +읝 +읝 +읝 +읝 + +읞 +읞 +읞 +읞 +읞 + +읟 +읟 +읟 +읟 +읟 + +읠 +읠 +읠 +읠 +읠 + +읡 +읡 +읡 +읡 +읡 + +읢 +읢 +읢 +읢 +읢 + +읣 +읣 +읣 +읣 +읣 + +읤 +읤 +읤 +읤 +읤 + +읥 +읥 +읥 +읥 +읥 + +읦 +읦 +읦 +읦 +읦 + +읧 +읧 +읧 +읧 +읧 + +읨 +읨 +읨 +읨 +읨 + +읩 +읩 +읩 +읩 +읩 + +읪 +읪 +읪 +읪 +읪 + +읫 +읫 +읫 +읫 +읫 + +읬 +읬 +읬 +읬 +읬 + +읭 +읭 +읭 +읭 +읭 + +읮 +읮 +읮 +읮 +읮 + +읯 +읯 +읯 +읯 +읯 + +읰 +읰 +읰 +읰 +읰 + +읱 +읱 +읱 +읱 +읱 + +읲 +읲 +읲 +읲 +읲 + +읳 +읳 +읳 +읳 +읳 + +이 +이 +이 +이 +이 + +익 +익 +익 +익 +익 + +읶 +읶 +읶 +읶 +읶 + +읷 +읷 +읷 +읷 +읷 + +인 +인 +인 +인 +인 + +읹 +읹 +읹 +읹 +읹 + +읺 +읺 +읺 +읺 +읺 + +읻 +읻 +읻 +읻 +읻 + +일 +일 +일 +일 +일 + +읽 +읽 +읽 +읽 +읽 + +읾 +읾 +읾 +읾 +읾 + +읿 +읿 +읿 +읿 +읿 + +잀 +잀 +잀 +잀 +잀 + +잁 +잁 +잁 +잁 +잁 + +잂 +잂 +잂 +잂 +잂 + +잃 +잃 +잃 +잃 +잃 + +임 +임 +임 +임 +임 + +입 +입 +입 +입 +입 + +잆 +잆 +잆 +잆 +잆 + +잇 +잇 +잇 +잇 +잇 + +있 +있 +있 +있 +있 + +잉 +잉 +잉 +잉 +잉 + +잊 +잊 +잊 +잊 +잊 + +잋 +잋 +잋 +잋 +잋 + +잌 +잌 +잌 +잌 +잌 + +잍 +잍 +잍 +잍 +잍 + +잎 +잎 +잎 +잎 +잎 + +잏 +잏 +잏 +잏 +잏 + +자 +자 +자 +자 +자 + +작 +작 +작 +작 +작 + +잒 +잒 +잒 +잒 +잒 + +잓 +잓 +잓 +잓 +잓 + +잔 +잔 +잔 +잔 +잔 + +잕 +잕 +잕 +잕 +잕 + +잖 +잖 +잖 +잖 +잖 + +잗 +잗 +잗 +잗 +잗 + +잘 +잘 +잘 +잘 +잘 + +잙 +잙 +잙 +잙 +잙 + +잚 +잚 +잚 +잚 +잚 + +잛 +잛 +잛 +잛 +잛 + +잜 +잜 +잜 +잜 +잜 + +잝 +잝 +잝 +잝 +잝 + +잞 +잞 +잞 +잞 +잞 + +잟 +잟 +잟 +잟 +잟 + +잠 +잠 +잠 +잠 +잠 + +잡 +잡 +잡 +잡 +잡 + +잢 +잢 +잢 +잢 +잢 + +잣 +잣 +잣 +잣 +잣 + +잤 +잤 +잤 +잤 +잤 + +장 +장 +장 +장 +장 + +잦 +잦 +잦 +잦 +잦 + +잧 +잧 +잧 +잧 +잧 + +잨 +잨 +잨 +잨 +잨 + +잩 +잩 +잩 +잩 +잩 + +잪 +잪 +잪 +잪 +잪 + +잫 +잫 +잫 +잫 +잫 + +재 +재 +재 +재 +재 + +잭 +잭 +잭 +잭 +잭 + +잮 +잮 +잮 +잮 +잮 + +잯 +잯 +잯 +잯 +잯 + +잰 +잰 +잰 +잰 +잰 + +잱 +잱 +잱 +잱 +잱 + +잲 +잲 +잲 +잲 +잲 + +잳 +잳 +잳 +잳 +잳 + +잴 +잴 +잴 +잴 +잴 + +잵 +잵 +잵 +잵 +잵 + +잶 +잶 +잶 +잶 +잶 + +잷 +잷 +잷 +잷 +잷 + +잸 +잸 +잸 +잸 +잸 + +잹 +잹 +잹 +잹 +잹 + +잺 +잺 +잺 +잺 +잺 + +잻 +잻 +잻 +잻 +잻 + +잼 +잼 +잼 +잼 +잼 + +잽 +잽 +잽 +잽 +잽 + +잾 +잾 +잾 +잾 +잾 + +잿 +잿 +잿 +잿 +잿 + +쟀 +쟀 +쟀 +쟀 +쟀 + +쟁 +쟁 +쟁 +쟁 +쟁 + +쟂 +쟂 +쟂 +쟂 +쟂 + +쟃 +쟃 +쟃 +쟃 +쟃 + +쟄 +쟄 +쟄 +쟄 +쟄 + +쟅 +쟅 +쟅 +쟅 +쟅 + +쟆 +쟆 +쟆 +쟆 +쟆 + +쟇 +쟇 +쟇 +쟇 +쟇 + +쟈 +쟈 +쟈 +쟈 +쟈 + +쟉 +쟉 +쟉 +쟉 +쟉 + +쟊 +쟊 +쟊 +쟊 +쟊 + +쟋 +쟋 +쟋 +쟋 +쟋 + +쟌 +쟌 +쟌 +쟌 +쟌 + +쟍 +쟍 +쟍 +쟍 +쟍 + +쟎 +쟎 +쟎 +쟎 +쟎 + +쟏 +쟏 +쟏 +쟏 +쟏 + +쟐 +쟐 +쟐 +쟐 +쟐 + +쟑 +쟑 +쟑 +쟑 +쟑 + +쟒 +쟒 +쟒 +쟒 +쟒 + +쟓 +쟓 +쟓 +쟓 +쟓 + +쟔 +쟔 +쟔 +쟔 +쟔 + +쟕 +쟕 +쟕 +쟕 +쟕 + +쟖 +쟖 +쟖 +쟖 +쟖 + +쟗 +쟗 +쟗 +쟗 +쟗 + +쟘 +쟘 +쟘 +쟘 +쟘 + +쟙 +쟙 +쟙 +쟙 +쟙 + +쟚 +쟚 +쟚 +쟚 +쟚 + +쟛 +쟛 +쟛 +쟛 +쟛 + +쟜 +쟜 +쟜 +쟜 +쟜 + +쟝 +쟝 +쟝 +쟝 +쟝 + +쟞 +쟞 +쟞 +쟞 +쟞 + +쟟 +쟟 +쟟 +쟟 +쟟 + +쟠 +쟠 +쟠 +쟠 +쟠 + +쟡 +쟡 +쟡 +쟡 +쟡 + +쟢 +쟢 +쟢 +쟢 +쟢 + +쟣 +쟣 +쟣 +쟣 +쟣 + +쟤 +쟤 +쟤 +쟤 +쟤 + +쟥 +쟥 +쟥 +쟥 +쟥 + +쟦 +쟦 +쟦 +쟦 +쟦 + +쟧 +쟧 +쟧 +쟧 +쟧 + +쟨 +쟨 +쟨 +쟨 +쟨 + +쟩 +쟩 +쟩 +쟩 +쟩 + +쟪 +쟪 +쟪 +쟪 +쟪 + +쟫 +쟫 +쟫 +쟫 +쟫 + +쟬 +쟬 +쟬 +쟬 +쟬 + +쟭 +쟭 +쟭 +쟭 +쟭 + +쟮 +쟮 +쟮 +쟮 +쟮 + +쟯 +쟯 +쟯 +쟯 +쟯 + +쟰 +쟰 +쟰 +쟰 +쟰 + +쟱 +쟱 +쟱 +쟱 +쟱 + +쟲 +쟲 +쟲 +쟲 +쟲 + +쟳 +쟳 +쟳 +쟳 +쟳 + +쟴 +쟴 +쟴 +쟴 +쟴 + +쟵 +쟵 +쟵 +쟵 +쟵 + +쟶 +쟶 +쟶 +쟶 +쟶 + +쟷 +쟷 +쟷 +쟷 +쟷 + +쟸 +쟸 +쟸 +쟸 +쟸 + +쟹 +쟹 +쟹 +쟹 +쟹 + +쟺 +쟺 +쟺 +쟺 +쟺 + +쟻 +쟻 +쟻 +쟻 +쟻 + +쟼 +쟼 +쟼 +쟼 +쟼 + +쟽 +쟽 +쟽 +쟽 +쟽 + +쟾 +쟾 +쟾 +쟾 +쟾 + +쟿 +쟿 +쟿 +쟿 +쟿 + +저 +저 +저 +저 +저 + +적 +적 +적 +적 +적 + +젂 +젂 +젂 +젂 +젂 + +젃 +젃 +젃 +젃 +젃 + +전 +전 +전 +전 +전 + +젅 +젅 +젅 +젅 +젅 + +젆 +젆 +젆 +젆 +젆 + +젇 +젇 +젇 +젇 +젇 + +절 +절 +절 +절 +절 + +젉 +젉 +젉 +젉 +젉 + +젊 +젊 +젊 +젊 +젊 + +젋 +젋 +젋 +젋 +젋 + +젌 +젌 +젌 +젌 +젌 + +젍 +젍 +젍 +젍 +젍 + +젎 +젎 +젎 +젎 +젎 + +젏 +젏 +젏 +젏 +젏 + +점 +점 +점 +점 +점 + +접 +접 +접 +접 +접 + +젒 +젒 +젒 +젒 +젒 + +젓 +젓 +젓 +젓 +젓 + +젔 +젔 +젔 +젔 +젔 + +정 +정 +정 +정 +정 + +젖 +젖 +젖 +젖 +젖 + +젗 +젗 +젗 +젗 +젗 + +젘 +젘 +젘 +젘 +젘 + +젙 +젙 +젙 +젙 +젙 + +젚 +젚 +젚 +젚 +젚 + +젛 +젛 +젛 +젛 +젛 + +제 +제 +제 +제 +제 + +젝 +젝 +젝 +젝 +젝 + +젞 +젞 +젞 +젞 +젞 + +젟 +젟 +젟 +젟 +젟 + +젠 +젠 +젠 +젠 +젠 + +젡 +젡 +젡 +젡 +젡 + +젢 +젢 +젢 +젢 +젢 + +젣 +젣 +젣 +젣 +젣 + +젤 +젤 +젤 +젤 +젤 + +젥 +젥 +젥 +젥 +젥 + +젦 +젦 +젦 +젦 +젦 + +젧 +젧 +젧 +젧 +젧 + +젨 +젨 +젨 +젨 +젨 + +젩 +젩 +젩 +젩 +젩 + +젪 +젪 +젪 +젪 +젪 + +젫 +젫 +젫 +젫 +젫 + +젬 +젬 +젬 +젬 +젬 + +젭 +젭 +젭 +젭 +젭 + +젮 +젮 +젮 +젮 +젮 + +젯 +젯 +젯 +젯 +젯 + +젰 +젰 +젰 +젰 +젰 + +젱 +젱 +젱 +젱 +젱 + +젲 +젲 +젲 +젲 +젲 + +젳 +젳 +젳 +젳 +젳 + +젴 +젴 +젴 +젴 +젴 + +젵 +젵 +젵 +젵 +젵 + +젶 +젶 +젶 +젶 +젶 + +젷 +젷 +젷 +젷 +젷 + +져 +져 +져 +져 +져 + +젹 +젹 +젹 +젹 +젹 + +젺 +젺 +젺 +젺 +젺 + +젻 +젻 +젻 +젻 +젻 + +젼 +젼 +젼 +젼 +젼 + +젽 +젽 +젽 +젽 +젽 + +젾 +젾 +젾 +젾 +젾 + +젿 +젿 +젿 +젿 +젿 + +졀 +졀 +졀 +졀 +졀 + +졁 +졁 +졁 +졁 +졁 + +졂 +졂 +졂 +졂 +졂 + +졃 +졃 +졃 +졃 +졃 + +졄 +졄 +졄 +졄 +졄 + +졅 +졅 +졅 +졅 +졅 + +졆 +졆 +졆 +졆 +졆 + +졇 +졇 +졇 +졇 +졇 + +졈 +졈 +졈 +졈 +졈 + +졉 +졉 +졉 +졉 +졉 + +졊 +졊 +졊 +졊 +졊 + +졋 +졋 +졋 +졋 +졋 + +졌 +졌 +졌 +졌 +졌 + +졍 +졍 +졍 +졍 +졍 + +졎 +졎 +졎 +졎 +졎 + +졏 +졏 +졏 +졏 +졏 + +졐 +졐 +졐 +졐 +졐 + +졑 +졑 +졑 +졑 +졑 + +졒 +졒 +졒 +졒 +졒 + +졓 +졓 +졓 +졓 +졓 + +졔 +졔 +졔 +졔 +졔 + +졕 +졕 +졕 +졕 +졕 + +졖 +졖 +졖 +졖 +졖 + +졗 +졗 +졗 +졗 +졗 + +졘 +졘 +졘 +졘 +졘 + +졙 +졙 +졙 +졙 +졙 + +졚 +졚 +졚 +졚 +졚 + +졛 +졛 +졛 +졛 +졛 + +졜 +졜 +졜 +졜 +졜 + +졝 +졝 +졝 +졝 +졝 + +졞 +졞 +졞 +졞 +졞 + +졟 +졟 +졟 +졟 +졟 + +졠 +졠 +졠 +졠 +졠 + +졡 +졡 +졡 +졡 +졡 + +졢 +졢 +졢 +졢 +졢 + +졣 +졣 +졣 +졣 +졣 + +졤 +졤 +졤 +졤 +졤 + +졥 +졥 +졥 +졥 +졥 + +졦 +졦 +졦 +졦 +졦 + +졧 +졧 +졧 +졧 +졧 + +졨 +졨 +졨 +졨 +졨 + +졩 +졩 +졩 +졩 +졩 + +졪 +졪 +졪 +졪 +졪 + +졫 +졫 +졫 +졫 +졫 + +졬 +졬 +졬 +졬 +졬 + +졭 +졭 +졭 +졭 +졭 + +졮 +졮 +졮 +졮 +졮 + +졯 +졯 +졯 +졯 +졯 + +조 +조 +조 +조 +조 + +족 +족 +족 +족 +족 + +졲 +졲 +졲 +졲 +졲 + +졳 +졳 +졳 +졳 +졳 + +존 +존 +존 +존 +존 + +졵 +졵 +졵 +졵 +졵 + +졶 +졶 +졶 +졶 +졶 + +졷 +졷 +졷 +졷 +졷 + +졸 +졸 +졸 +졸 +졸 + +졹 +졹 +졹 +졹 +졹 + +졺 +졺 +졺 +졺 +졺 + +졻 +졻 +졻 +졻 +졻 + +졼 +졼 +졼 +졼 +졼 + +졽 +졽 +졽 +졽 +졽 + +졾 +졾 +졾 +졾 +졾 + +졿 +졿 +졿 +졿 +졿 + +좀 +좀 +좀 +좀 +좀 + +좁 +좁 +좁 +좁 +좁 + +좂 +좂 +좂 +좂 +좂 + +좃 +좃 +좃 +좃 +좃 + +좄 +좄 +좄 +좄 +좄 + +종 +종 +종 +종 +종 + +좆 +좆 +좆 +좆 +좆 + +좇 +좇 +좇 +좇 +좇 + +좈 +좈 +좈 +좈 +좈 + +좉 +좉 +좉 +좉 +좉 + +좊 +좊 +좊 +좊 +좊 + +좋 +좋 +좋 +좋 +좋 + +좌 +좌 +좌 +좌 +좌 + +좍 +좍 +좍 +좍 +좍 + +좎 +좎 +좎 +좎 +좎 + +좏 +좏 +좏 +좏 +좏 + +좐 +좐 +좐 +좐 +좐 + +좑 +좑 +좑 +좑 +좑 + +좒 +좒 +좒 +좒 +좒 + +좓 +좓 +좓 +좓 +좓 + +좔 +좔 +좔 +좔 +좔 + +좕 +좕 +좕 +좕 +좕 + +좖 +좖 +좖 +좖 +좖 + +좗 +좗 +좗 +좗 +좗 + +좘 +좘 +좘 +좘 +좘 + +좙 +좙 +좙 +좙 +좙 + +좚 +좚 +좚 +좚 +좚 + +좛 +좛 +좛 +좛 +좛 + +좜 +좜 +좜 +좜 +좜 + +좝 +좝 +좝 +좝 +좝 + +좞 +좞 +좞 +좞 +좞 + +좟 +좟 +좟 +좟 +좟 + +좠 +좠 +좠 +좠 +좠 + +좡 +좡 +좡 +좡 +좡 + +좢 +좢 +좢 +좢 +좢 + +좣 +좣 +좣 +좣 +좣 + +좤 +좤 +좤 +좤 +좤 + +좥 +좥 +좥 +좥 +좥 + +좦 +좦 +좦 +좦 +좦 + +좧 +좧 +좧 +좧 +좧 + +좨 +좨 +좨 +좨 +좨 + +좩 +좩 +좩 +좩 +좩 + +좪 +좪 +좪 +좪 +좪 + +좫 +좫 +좫 +좫 +좫 + +좬 +좬 +좬 +좬 +좬 + +좭 +좭 +좭 +좭 +좭 + +좮 +좮 +좮 +좮 +좮 + +좯 +좯 +좯 +좯 +좯 + +좰 +좰 +좰 +좰 +좰 + +좱 +좱 +좱 +좱 +좱 + +좲 +좲 +좲 +좲 +좲 + +좳 +좳 +좳 +좳 +좳 + +좴 +좴 +좴 +좴 +좴 + +좵 +좵 +좵 +좵 +좵 + +좶 +좶 +좶 +좶 +좶 + +좷 +좷 +좷 +좷 +좷 + +좸 +좸 +좸 +좸 +좸 + +좹 +좹 +좹 +좹 +좹 + +좺 +좺 +좺 +좺 +좺 + +좻 +좻 +좻 +좻 +좻 + +좼 +좼 +좼 +좼 +좼 + +좽 +좽 +좽 +좽 +좽 + +좾 +좾 +좾 +좾 +좾 + +좿 +좿 +좿 +좿 +좿 + +죀 +죀 +죀 +죀 +죀 + +죁 +죁 +죁 +죁 +죁 + +죂 +죂 +죂 +죂 +죂 + +죃 +죃 +죃 +죃 +죃 + +죄 +죄 +죄 +죄 +죄 + +죅 +죅 +죅 +죅 +죅 + +죆 +죆 +죆 +죆 +죆 + +죇 +죇 +죇 +죇 +죇 + +죈 +죈 +죈 +죈 +죈 + +죉 +죉 +죉 +죉 +죉 + +죊 +죊 +죊 +죊 +죊 + +죋 +죋 +죋 +죋 +죋 + +죌 +죌 +죌 +죌 +죌 + +죍 +죍 +죍 +죍 +죍 + +죎 +죎 +죎 +죎 +죎 + +죏 +죏 +죏 +죏 +죏 + +죐 +죐 +죐 +죐 +죐 + +죑 +죑 +죑 +죑 +죑 + +죒 +죒 +죒 +죒 +죒 + +죓 +죓 +죓 +죓 +죓 + +죔 +죔 +죔 +죔 +죔 + +죕 +죕 +죕 +죕 +죕 + +죖 +죖 +죖 +죖 +죖 + +죗 +죗 +죗 +죗 +죗 + +죘 +죘 +죘 +죘 +죘 + +죙 +죙 +죙 +죙 +죙 + +죚 +죚 +죚 +죚 +죚 + +죛 +죛 +죛 +죛 +죛 + +죜 +죜 +죜 +죜 +죜 + +죝 +죝 +죝 +죝 +죝 + +죞 +죞 +죞 +죞 +죞 + +죟 +죟 +죟 +죟 +죟 + +죠 +죠 +죠 +죠 +죠 + +죡 +죡 +죡 +죡 +죡 + +죢 +죢 +죢 +죢 +죢 + +죣 +죣 +죣 +죣 +죣 + +죤 +죤 +죤 +죤 +죤 + +죥 +죥 +죥 +죥 +죥 + +죦 +죦 +죦 +죦 +죦 + +죧 +죧 +죧 +죧 +죧 + +죨 +죨 +죨 +죨 +죨 + +죩 +죩 +죩 +죩 +죩 + +죪 +죪 +죪 +죪 +죪 + +죫 +죫 +죫 +죫 +죫 + +죬 +죬 +죬 +죬 +죬 + +죭 +죭 +죭 +죭 +죭 + +죮 +죮 +죮 +죮 +죮 + +죯 +죯 +죯 +죯 +죯 + +죰 +죰 +죰 +죰 +죰 + +죱 +죱 +죱 +죱 +죱 + +죲 +죲 +죲 +죲 +죲 + +죳 +죳 +죳 +죳 +죳 + +죴 +죴 +죴 +죴 +죴 + +죵 +죵 +죵 +죵 +죵 + +죶 +죶 +죶 +죶 +죶 + +죷 +죷 +죷 +죷 +죷 + +죸 +죸 +죸 +죸 +죸 + +죹 +죹 +죹 +죹 +죹 + +죺 +죺 +죺 +죺 +죺 + +죻 +죻 +죻 +죻 +죻 + +주 +주 +주 +주 +주 + +죽 +죽 +죽 +죽 +죽 + +죾 +죾 +죾 +죾 +죾 + +죿 +죿 +죿 +죿 +죿 + +준 +준 +준 +준 +준 + +줁 +줁 +줁 +줁 +줁 + +줂 +줂 +줂 +줂 +줂 + +줃 +줃 +줃 +줃 +줃 + +줄 +줄 +줄 +줄 +줄 + +줅 +줅 +줅 +줅 +줅 + +줆 +줆 +줆 +줆 +줆 + +줇 +줇 +줇 +줇 +줇 + +줈 +줈 +줈 +줈 +줈 + +줉 +줉 +줉 +줉 +줉 + +줊 +줊 +줊 +줊 +줊 + +줋 +줋 +줋 +줋 +줋 + +줌 +줌 +줌 +줌 +줌 + +줍 +줍 +줍 +줍 +줍 + +줎 +줎 +줎 +줎 +줎 + +줏 +줏 +줏 +줏 +줏 + +줐 +줐 +줐 +줐 +줐 + +중 +중 +중 +중 +중 + +줒 +줒 +줒 +줒 +줒 + +줓 +줓 +줓 +줓 +줓 + +줔 +줔 +줔 +줔 +줔 + +줕 +줕 +줕 +줕 +줕 + +줖 +줖 +줖 +줖 +줖 + +줗 +줗 +줗 +줗 +줗 + +줘 +줘 +줘 +줘 +줘 + +줙 +줙 +줙 +줙 +줙 + +줚 +줚 +줚 +줚 +줚 + +줛 +줛 +줛 +줛 +줛 + +줜 +줜 +줜 +줜 +줜 + +줝 +줝 +줝 +줝 +줝 + +줞 +줞 +줞 +줞 +줞 + +줟 +줟 +줟 +줟 +줟 + +줠 +줠 +줠 +줠 +줠 + +줡 +줡 +줡 +줡 +줡 + +줢 +줢 +줢 +줢 +줢 + +줣 +줣 +줣 +줣 +줣 + +줤 +줤 +줤 +줤 +줤 + +줥 +줥 +줥 +줥 +줥 + +줦 +줦 +줦 +줦 +줦 + +줧 +줧 +줧 +줧 +줧 + +줨 +줨 +줨 +줨 +줨 + +줩 +줩 +줩 +줩 +줩 + +줪 +줪 +줪 +줪 +줪 + +줫 +줫 +줫 +줫 +줫 + +줬 +줬 +줬 +줬 +줬 + +줭 +줭 +줭 +줭 +줭 + +줮 +줮 +줮 +줮 +줮 + +줯 +줯 +줯 +줯 +줯 + +줰 +줰 +줰 +줰 +줰 + +줱 +줱 +줱 +줱 +줱 + +줲 +줲 +줲 +줲 +줲 + +줳 +줳 +줳 +줳 +줳 + +줴 +줴 +줴 +줴 +줴 + +줵 +줵 +줵 +줵 +줵 + +줶 +줶 +줶 +줶 +줶 + +줷 +줷 +줷 +줷 +줷 + +줸 +줸 +줸 +줸 +줸 + +줹 +줹 +줹 +줹 +줹 + +줺 +줺 +줺 +줺 +줺 + +줻 +줻 +줻 +줻 +줻 + +줼 +줼 +줼 +줼 +줼 + +줽 +줽 +줽 +줽 +줽 + +줾 +줾 +줾 +줾 +줾 + +줿 +줿 +줿 +줿 +줿 + +쥀 +쥀 +쥀 +쥀 +쥀 + +쥁 +쥁 +쥁 +쥁 +쥁 + +쥂 +쥂 +쥂 +쥂 +쥂 + +쥃 +쥃 +쥃 +쥃 +쥃 + +쥄 +쥄 +쥄 +쥄 +쥄 + +쥅 +쥅 +쥅 +쥅 +쥅 + +쥆 +쥆 +쥆 +쥆 +쥆 + +쥇 +쥇 +쥇 +쥇 +쥇 + +쥈 +쥈 +쥈 +쥈 +쥈 + +쥉 +쥉 +쥉 +쥉 +쥉 + +쥊 +쥊 +쥊 +쥊 +쥊 + +쥋 +쥋 +쥋 +쥋 +쥋 + +쥌 +쥌 +쥌 +쥌 +쥌 + +쥍 +쥍 +쥍 +쥍 +쥍 + +쥎 +쥎 +쥎 +쥎 +쥎 + +쥏 +쥏 +쥏 +쥏 +쥏 + +쥐 +쥐 +쥐 +쥐 +쥐 + +쥑 +쥑 +쥑 +쥑 +쥑 + +쥒 +쥒 +쥒 +쥒 +쥒 + +쥓 +쥓 +쥓 +쥓 +쥓 + +쥔 +쥔 +쥔 +쥔 +쥔 + +쥕 +쥕 +쥕 +쥕 +쥕 + +쥖 +쥖 +쥖 +쥖 +쥖 + +쥗 +쥗 +쥗 +쥗 +쥗 + +쥘 +쥘 +쥘 +쥘 +쥘 + +쥙 +쥙 +쥙 +쥙 +쥙 + +쥚 +쥚 +쥚 +쥚 +쥚 + +쥛 +쥛 +쥛 +쥛 +쥛 + +쥜 +쥜 +쥜 +쥜 +쥜 + +쥝 +쥝 +쥝 +쥝 +쥝 + +쥞 +쥞 +쥞 +쥞 +쥞 + +쥟 +쥟 +쥟 +쥟 +쥟 + +쥠 +쥠 +쥠 +쥠 +쥠 + +쥡 +쥡 +쥡 +쥡 +쥡 + +쥢 +쥢 +쥢 +쥢 +쥢 + +쥣 +쥣 +쥣 +쥣 +쥣 + +쥤 +쥤 +쥤 +쥤 +쥤 + +쥥 +쥥 +쥥 +쥥 +쥥 + +쥦 +쥦 +쥦 +쥦 +쥦 + +쥧 +쥧 +쥧 +쥧 +쥧 + +쥨 +쥨 +쥨 +쥨 +쥨 + +쥩 +쥩 +쥩 +쥩 +쥩 + +쥪 +쥪 +쥪 +쥪 +쥪 + +쥫 +쥫 +쥫 +쥫 +쥫 + +쥬 +쥬 +쥬 +쥬 +쥬 + +쥭 +쥭 +쥭 +쥭 +쥭 + +쥮 +쥮 +쥮 +쥮 +쥮 + +쥯 +쥯 +쥯 +쥯 +쥯 + +쥰 +쥰 +쥰 +쥰 +쥰 + +쥱 +쥱 +쥱 +쥱 +쥱 + +쥲 +쥲 +쥲 +쥲 +쥲 + +쥳 +쥳 +쥳 +쥳 +쥳 + +쥴 +쥴 +쥴 +쥴 +쥴 + +쥵 +쥵 +쥵 +쥵 +쥵 + +쥶 +쥶 +쥶 +쥶 +쥶 + +쥷 +쥷 +쥷 +쥷 +쥷 + +쥸 +쥸 +쥸 +쥸 +쥸 + +쥹 +쥹 +쥹 +쥹 +쥹 + +쥺 +쥺 +쥺 +쥺 +쥺 + +쥻 +쥻 +쥻 +쥻 +쥻 + +쥼 +쥼 +쥼 +쥼 +쥼 + +쥽 +쥽 +쥽 +쥽 +쥽 + +쥾 +쥾 +쥾 +쥾 +쥾 + +쥿 +쥿 +쥿 +쥿 +쥿 + +즀 +즀 +즀 +즀 +즀 + +즁 +즁 +즁 +즁 +즁 + +즂 +즂 +즂 +즂 +즂 + +즃 +즃 +즃 +즃 +즃 + +즄 +즄 +즄 +즄 +즄 + +즅 +즅 +즅 +즅 +즅 + +즆 +즆 +즆 +즆 +즆 + +즇 +즇 +즇 +즇 +즇 + +즈 +즈 +즈 +즈 +즈 + +즉 +즉 +즉 +즉 +즉 + +즊 +즊 +즊 +즊 +즊 + +즋 +즋 +즋 +즋 +즋 + +즌 +즌 +즌 +즌 +즌 + +즍 +즍 +즍 +즍 +즍 + +즎 +즎 +즎 +즎 +즎 + +즏 +즏 +즏 +즏 +즏 + +즐 +즐 +즐 +즐 +즐 + +즑 +즑 +즑 +즑 +즑 + +즒 +즒 +즒 +즒 +즒 + +즓 +즓 +즓 +즓 +즓 + +즔 +즔 +즔 +즔 +즔 + +즕 +즕 +즕 +즕 +즕 + +즖 +즖 +즖 +즖 +즖 + +즗 +즗 +즗 +즗 +즗 + +즘 +즘 +즘 +즘 +즘 + +즙 +즙 +즙 +즙 +즙 + +즚 +즚 +즚 +즚 +즚 + +즛 +즛 +즛 +즛 +즛 + +즜 +즜 +즜 +즜 +즜 + +증 +증 +증 +증 +증 + +즞 +즞 +즞 +즞 +즞 + +즟 +즟 +즟 +즟 +즟 + +즠 +즠 +즠 +즠 +즠 + +즡 +즡 +즡 +즡 +즡 + +즢 +즢 +즢 +즢 +즢 + +즣 +즣 +즣 +즣 +즣 + +즤 +즤 +즤 +즤 +즤 + +즥 +즥 +즥 +즥 +즥 + +즦 +즦 +즦 +즦 +즦 + +즧 +즧 +즧 +즧 +즧 + +즨 +즨 +즨 +즨 +즨 + +즩 +즩 +즩 +즩 +즩 + +즪 +즪 +즪 +즪 +즪 + +즫 +즫 +즫 +즫 +즫 + +즬 +즬 +즬 +즬 +즬 + +즭 +즭 +즭 +즭 +즭 + +즮 +즮 +즮 +즮 +즮 + +즯 +즯 +즯 +즯 +즯 + +즰 +즰 +즰 +즰 +즰 + +즱 +즱 +즱 +즱 +즱 + +즲 +즲 +즲 +즲 +즲 + +즳 +즳 +즳 +즳 +즳 + +즴 +즴 +즴 +즴 +즴 + +즵 +즵 +즵 +즵 +즵 + +즶 +즶 +즶 +즶 +즶 + +즷 +즷 +즷 +즷 +즷 + +즸 +즸 +즸 +즸 +즸 + +즹 +즹 +즹 +즹 +즹 + +즺 +즺 +즺 +즺 +즺 + +즻 +즻 +즻 +즻 +즻 + +즼 +즼 +즼 +즼 +즼 + +즽 +즽 +즽 +즽 +즽 + +즾 +즾 +즾 +즾 +즾 + +즿 +즿 +즿 +즿 +즿 + +지 +지 +지 +지 +지 + +직 +직 +직 +직 +직 + +짂 +짂 +짂 +짂 +짂 + +짃 +짃 +짃 +짃 +짃 + +진 +진 +진 +진 +진 + +짅 +짅 +짅 +짅 +짅 + +짆 +짆 +짆 +짆 +짆 + +짇 +짇 +짇 +짇 +짇 + +질 +질 +질 +질 +질 + +짉 +짉 +짉 +짉 +짉 + +짊 +짊 +짊 +짊 +짊 + +짋 +짋 +짋 +짋 +짋 + +짌 +짌 +짌 +짌 +짌 + +짍 +짍 +짍 +짍 +짍 + +짎 +짎 +짎 +짎 +짎 + +짏 +짏 +짏 +짏 +짏 + +짐 +짐 +짐 +짐 +짐 + +집 +집 +집 +집 +집 + +짒 +짒 +짒 +짒 +짒 + +짓 +짓 +짓 +짓 +짓 + +짔 +짔 +짔 +짔 +짔 + +징 +징 +징 +징 +징 + +짖 +짖 +짖 +짖 +짖 + +짗 +짗 +짗 +짗 +짗 + +짘 +짘 +짘 +짘 +짘 + +짙 +짙 +짙 +짙 +짙 + +짚 +짚 +짚 +짚 +짚 + +짛 +짛 +짛 +짛 +짛 + +짜 +짜 +짜 +짜 +짜 + +짝 +짝 +짝 +짝 +짝 + +짞 +짞 +짞 +짞 +짞 + +짟 +짟 +짟 +짟 +짟 + +짠 +짠 +짠 +짠 +짠 + +짡 +짡 +짡 +짡 +짡 + +짢 +짢 +짢 +짢 +짢 + +짣 +짣 +짣 +짣 +짣 + +짤 +짤 +짤 +짤 +짤 + +짥 +짥 +짥 +짥 +짥 + +짦 +짦 +짦 +짦 +짦 + +짧 +짧 +짧 +짧 +짧 + +짨 +짨 +짨 +짨 +짨 + +짩 +짩 +짩 +짩 +짩 + +짪 +짪 +짪 +짪 +짪 + +짫 +짫 +짫 +짫 +짫 + +짬 +짬 +짬 +짬 +짬 + +짭 +짭 +짭 +짭 +짭 + +짮 +짮 +짮 +짮 +짮 + +짯 +짯 +짯 +짯 +짯 + +짰 +짰 +짰 +짰 +짰 + +짱 +짱 +짱 +짱 +짱 + +짲 +짲 +짲 +짲 +짲 + +짳 +짳 +짳 +짳 +짳 + +짴 +짴 +짴 +짴 +짴 + +짵 +짵 +짵 +짵 +짵 + +짶 +짶 +짶 +짶 +짶 + +짷 +짷 +짷 +짷 +짷 + +째 +째 +째 +째 +째 + +짹 +짹 +짹 +짹 +짹 + +짺 +짺 +짺 +짺 +짺 + +짻 +짻 +짻 +짻 +짻 + +짼 +짼 +짼 +짼 +짼 + +짽 +짽 +짽 +짽 +짽 + +짾 +짾 +짾 +짾 +짾 + +짿 +짿 +짿 +짿 +짿 + +쨀 +쨀 +쨀 +쨀 +쨀 + +쨁 +쨁 +쨁 +쨁 +쨁 + +쨂 +쨂 +쨂 +쨂 +쨂 + +쨃 +쨃 +쨃 +쨃 +쨃 + +쨄 +쨄 +쨄 +쨄 +쨄 + +쨅 +쨅 +쨅 +쨅 +쨅 + +쨆 +쨆 +쨆 +쨆 +쨆 + +쨇 +쨇 +쨇 +쨇 +쨇 + +쨈 +쨈 +쨈 +쨈 +쨈 + +쨉 +쨉 +쨉 +쨉 +쨉 + +쨊 +쨊 +쨊 +쨊 +쨊 + +쨋 +쨋 +쨋 +쨋 +쨋 + +쨌 +쨌 +쨌 +쨌 +쨌 + +쨍 +쨍 +쨍 +쨍 +쨍 + +쨎 +쨎 +쨎 +쨎 +쨎 + +쨏 +쨏 +쨏 +쨏 +쨏 + +쨐 +쨐 +쨐 +쨐 +쨐 + +쨑 +쨑 +쨑 +쨑 +쨑 + +쨒 +쨒 +쨒 +쨒 +쨒 + +쨓 +쨓 +쨓 +쨓 +쨓 + +쨔 +쨔 +쨔 +쨔 +쨔 + +쨕 +쨕 +쨕 +쨕 +쨕 + +쨖 +쨖 +쨖 +쨖 +쨖 + +쨗 +쨗 +쨗 +쨗 +쨗 + +쨘 +쨘 +쨘 +쨘 +쨘 + +쨙 +쨙 +쨙 +쨙 +쨙 + +쨚 +쨚 +쨚 +쨚 +쨚 + +쨛 +쨛 +쨛 +쨛 +쨛 + +쨜 +쨜 +쨜 +쨜 +쨜 + +쨝 +쨝 +쨝 +쨝 +쨝 + +쨞 +쨞 +쨞 +쨞 +쨞 + +쨟 +쨟 +쨟 +쨟 +쨟 + +쨠 +쨠 +쨠 +쨠 +쨠 + +쨡 +쨡 +쨡 +쨡 +쨡 + +쨢 +쨢 +쨢 +쨢 +쨢 + +쨣 +쨣 +쨣 +쨣 +쨣 + +쨤 +쨤 +쨤 +쨤 +쨤 + +쨥 +쨥 +쨥 +쨥 +쨥 + +쨦 +쨦 +쨦 +쨦 +쨦 + +쨧 +쨧 +쨧 +쨧 +쨧 + +쨨 +쨨 +쨨 +쨨 +쨨 + +쨩 +쨩 +쨩 +쨩 +쨩 + +쨪 +쨪 +쨪 +쨪 +쨪 + +쨫 +쨫 +쨫 +쨫 +쨫 + +쨬 +쨬 +쨬 +쨬 +쨬 + +쨭 +쨭 +쨭 +쨭 +쨭 + +쨮 +쨮 +쨮 +쨮 +쨮 + +쨯 +쨯 +쨯 +쨯 +쨯 + +쨰 +쨰 +쨰 +쨰 +쨰 + +쨱 +쨱 +쨱 +쨱 +쨱 + +쨲 +쨲 +쨲 +쨲 +쨲 + +쨳 +쨳 +쨳 +쨳 +쨳 + +쨴 +쨴 +쨴 +쨴 +쨴 + +쨵 +쨵 +쨵 +쨵 +쨵 + +쨶 +쨶 +쨶 +쨶 +쨶 + +쨷 +쨷 +쨷 +쨷 +쨷 + +쨸 +쨸 +쨸 +쨸 +쨸 + +쨹 +쨹 +쨹 +쨹 +쨹 + +쨺 +쨺 +쨺 +쨺 +쨺 + +쨻 +쨻 +쨻 +쨻 +쨻 + +쨼 +쨼 +쨼 +쨼 +쨼 + +쨽 +쨽 +쨽 +쨽 +쨽 + +쨾 +쨾 +쨾 +쨾 +쨾 + +쨿 +쨿 +쨿 +쨿 +쨿 + +쩀 +쩀 +쩀 +쩀 +쩀 + +쩁 +쩁 +쩁 +쩁 +쩁 + +쩂 +쩂 +쩂 +쩂 +쩂 + +쩃 +쩃 +쩃 +쩃 +쩃 + +쩄 +쩄 +쩄 +쩄 +쩄 + +쩅 +쩅 +쩅 +쩅 +쩅 + +쩆 +쩆 +쩆 +쩆 +쩆 + +쩇 +쩇 +쩇 +쩇 +쩇 + +쩈 +쩈 +쩈 +쩈 +쩈 + +쩉 +쩉 +쩉 +쩉 +쩉 + +쩊 +쩊 +쩊 +쩊 +쩊 + +쩋 +쩋 +쩋 +쩋 +쩋 + +쩌 +쩌 +쩌 +쩌 +쩌 + +쩍 +쩍 +쩍 +쩍 +쩍 + +쩎 +쩎 +쩎 +쩎 +쩎 + +쩏 +쩏 +쩏 +쩏 +쩏 + +쩐 +쩐 +쩐 +쩐 +쩐 + +쩑 +쩑 +쩑 +쩑 +쩑 + +쩒 +쩒 +쩒 +쩒 +쩒 + +쩓 +쩓 +쩓 +쩓 +쩓 + +쩔 +쩔 +쩔 +쩔 +쩔 + +쩕 +쩕 +쩕 +쩕 +쩕 + +쩖 +쩖 +쩖 +쩖 +쩖 + +쩗 +쩗 +쩗 +쩗 +쩗 + +쩘 +쩘 +쩘 +쩘 +쩘 + +쩙 +쩙 +쩙 +쩙 +쩙 + +쩚 +쩚 +쩚 +쩚 +쩚 + +쩛 +쩛 +쩛 +쩛 +쩛 + +쩜 +쩜 +쩜 +쩜 +쩜 + +쩝 +쩝 +쩝 +쩝 +쩝 + +쩞 +쩞 +쩞 +쩞 +쩞 + +쩟 +쩟 +쩟 +쩟 +쩟 + +쩠 +쩠 +쩠 +쩠 +쩠 + +쩡 +쩡 +쩡 +쩡 +쩡 + +쩢 +쩢 +쩢 +쩢 +쩢 + +쩣 +쩣 +쩣 +쩣 +쩣 + +쩤 +쩤 +쩤 +쩤 +쩤 + +쩥 +쩥 +쩥 +쩥 +쩥 + +쩦 +쩦 +쩦 +쩦 +쩦 + +쩧 +쩧 +쩧 +쩧 +쩧 + +쩨 +쩨 +쩨 +쩨 +쩨 + +쩩 +쩩 +쩩 +쩩 +쩩 + +쩪 +쩪 +쩪 +쩪 +쩪 + +쩫 +쩫 +쩫 +쩫 +쩫 + +쩬 +쩬 +쩬 +쩬 +쩬 + +쩭 +쩭 +쩭 +쩭 +쩭 + +쩮 +쩮 +쩮 +쩮 +쩮 + +쩯 +쩯 +쩯 +쩯 +쩯 + +쩰 +쩰 +쩰 +쩰 +쩰 + +쩱 +쩱 +쩱 +쩱 +쩱 + +쩲 +쩲 +쩲 +쩲 +쩲 + +쩳 +쩳 +쩳 +쩳 +쩳 + +쩴 +쩴 +쩴 +쩴 +쩴 + +쩵 +쩵 +쩵 +쩵 +쩵 + +쩶 +쩶 +쩶 +쩶 +쩶 + +쩷 +쩷 +쩷 +쩷 +쩷 + +쩸 +쩸 +쩸 +쩸 +쩸 + +쩹 +쩹 +쩹 +쩹 +쩹 + +쩺 +쩺 +쩺 +쩺 +쩺 + +쩻 +쩻 +쩻 +쩻 +쩻 + +쩼 +쩼 +쩼 +쩼 +쩼 + +쩽 +쩽 +쩽 +쩽 +쩽 + +쩾 +쩾 +쩾 +쩾 +쩾 + +쩿 +쩿 +쩿 +쩿 +쩿 + +쪀 +쪀 +쪀 +쪀 +쪀 + +쪁 +쪁 +쪁 +쪁 +쪁 + +쪂 +쪂 +쪂 +쪂 +쪂 + +쪃 +쪃 +쪃 +쪃 +쪃 + +쪄 +쪄 +쪄 +쪄 +쪄 + +쪅 +쪅 +쪅 +쪅 +쪅 + +쪆 +쪆 +쪆 +쪆 +쪆 + +쪇 +쪇 +쪇 +쪇 +쪇 + +쪈 +쪈 +쪈 +쪈 +쪈 + +쪉 +쪉 +쪉 +쪉 +쪉 + +쪊 +쪊 +쪊 +쪊 +쪊 + +쪋 +쪋 +쪋 +쪋 +쪋 + +쪌 +쪌 +쪌 +쪌 +쪌 + +쪍 +쪍 +쪍 +쪍 +쪍 + +쪎 +쪎 +쪎 +쪎 +쪎 + +쪏 +쪏 +쪏 +쪏 +쪏 + +쪐 +쪐 +쪐 +쪐 +쪐 + +쪑 +쪑 +쪑 +쪑 +쪑 + +쪒 +쪒 +쪒 +쪒 +쪒 + +쪓 +쪓 +쪓 +쪓 +쪓 + +쪔 +쪔 +쪔 +쪔 +쪔 + +쪕 +쪕 +쪕 +쪕 +쪕 + +쪖 +쪖 +쪖 +쪖 +쪖 + +쪗 +쪗 +쪗 +쪗 +쪗 + +쪘 +쪘 +쪘 +쪘 +쪘 + +쪙 +쪙 +쪙 +쪙 +쪙 + +쪚 +쪚 +쪚 +쪚 +쪚 + +쪛 +쪛 +쪛 +쪛 +쪛 + +쪜 +쪜 +쪜 +쪜 +쪜 + +쪝 +쪝 +쪝 +쪝 +쪝 + +쪞 +쪞 +쪞 +쪞 +쪞 + +쪟 +쪟 +쪟 +쪟 +쪟 + +쪠 +쪠 +쪠 +쪠 +쪠 + +쪡 +쪡 +쪡 +쪡 +쪡 + +쪢 +쪢 +쪢 +쪢 +쪢 + +쪣 +쪣 +쪣 +쪣 +쪣 + +쪤 +쪤 +쪤 +쪤 +쪤 + +쪥 +쪥 +쪥 +쪥 +쪥 + +쪦 +쪦 +쪦 +쪦 +쪦 + +쪧 +쪧 +쪧 +쪧 +쪧 + +쪨 +쪨 +쪨 +쪨 +쪨 + +쪩 +쪩 +쪩 +쪩 +쪩 + +쪪 +쪪 +쪪 +쪪 +쪪 + +쪫 +쪫 +쪫 +쪫 +쪫 + +쪬 +쪬 +쪬 +쪬 +쪬 + +쪭 +쪭 +쪭 +쪭 +쪭 + +쪮 +쪮 +쪮 +쪮 +쪮 + +쪯 +쪯 +쪯 +쪯 +쪯 + +쪰 +쪰 +쪰 +쪰 +쪰 + +쪱 +쪱 +쪱 +쪱 +쪱 + +쪲 +쪲 +쪲 +쪲 +쪲 + +쪳 +쪳 +쪳 +쪳 +쪳 + +쪴 +쪴 +쪴 +쪴 +쪴 + +쪵 +쪵 +쪵 +쪵 +쪵 + +쪶 +쪶 +쪶 +쪶 +쪶 + +쪷 +쪷 +쪷 +쪷 +쪷 + +쪸 +쪸 +쪸 +쪸 +쪸 + +쪹 +쪹 +쪹 +쪹 +쪹 + +쪺 +쪺 +쪺 +쪺 +쪺 + +쪻 +쪻 +쪻 +쪻 +쪻 + +쪼 +쪼 +쪼 +쪼 +쪼 + +쪽 +쪽 +쪽 +쪽 +쪽 + +쪾 +쪾 +쪾 +쪾 +쪾 + +쪿 +쪿 +쪿 +쪿 +쪿 + +쫀 +쫀 +쫀 +쫀 +쫀 + +쫁 +쫁 +쫁 +쫁 +쫁 + +쫂 +쫂 +쫂 +쫂 +쫂 + +쫃 +쫃 +쫃 +쫃 +쫃 + +쫄 +쫄 +쫄 +쫄 +쫄 + +쫅 +쫅 +쫅 +쫅 +쫅 + +쫆 +쫆 +쫆 +쫆 +쫆 + +쫇 +쫇 +쫇 +쫇 +쫇 + +쫈 +쫈 +쫈 +쫈 +쫈 + +쫉 +쫉 +쫉 +쫉 +쫉 + +쫊 +쫊 +쫊 +쫊 +쫊 + +쫋 +쫋 +쫋 +쫋 +쫋 + +쫌 +쫌 +쫌 +쫌 +쫌 + +쫍 +쫍 +쫍 +쫍 +쫍 + +쫎 +쫎 +쫎 +쫎 +쫎 + +쫏 +쫏 +쫏 +쫏 +쫏 + +쫐 +쫐 +쫐 +쫐 +쫐 + +쫑 +쫑 +쫑 +쫑 +쫑 + +쫒 +쫒 +쫒 +쫒 +쫒 + +쫓 +쫓 +쫓 +쫓 +쫓 + +쫔 +쫔 +쫔 +쫔 +쫔 + +쫕 +쫕 +쫕 +쫕 +쫕 + +쫖 +쫖 +쫖 +쫖 +쫖 + +쫗 +쫗 +쫗 +쫗 +쫗 + +쫘 +쫘 +쫘 +쫘 +쫘 + +쫙 +쫙 +쫙 +쫙 +쫙 + +쫚 +쫚 +쫚 +쫚 +쫚 + +쫛 +쫛 +쫛 +쫛 +쫛 + +쫜 +쫜 +쫜 +쫜 +쫜 + +쫝 +쫝 +쫝 +쫝 +쫝 + +쫞 +쫞 +쫞 +쫞 +쫞 + +쫟 +쫟 +쫟 +쫟 +쫟 + +쫠 +쫠 +쫠 +쫠 +쫠 + +쫡 +쫡 +쫡 +쫡 +쫡 + +쫢 +쫢 +쫢 +쫢 +쫢 + +쫣 +쫣 +쫣 +쫣 +쫣 + +쫤 +쫤 +쫤 +쫤 +쫤 + +쫥 +쫥 +쫥 +쫥 +쫥 + +쫦 +쫦 +쫦 +쫦 +쫦 + +쫧 +쫧 +쫧 +쫧 +쫧 + +쫨 +쫨 +쫨 +쫨 +쫨 + +쫩 +쫩 +쫩 +쫩 +쫩 + +쫪 +쫪 +쫪 +쫪 +쫪 + +쫫 +쫫 +쫫 +쫫 +쫫 + +쫬 +쫬 +쫬 +쫬 +쫬 + +쫭 +쫭 +쫭 +쫭 +쫭 + +쫮 +쫮 +쫮 +쫮 +쫮 + +쫯 +쫯 +쫯 +쫯 +쫯 + +쫰 +쫰 +쫰 +쫰 +쫰 + +쫱 +쫱 +쫱 +쫱 +쫱 + +쫲 +쫲 +쫲 +쫲 +쫲 + +쫳 +쫳 +쫳 +쫳 +쫳 + +쫴 +쫴 +쫴 +쫴 +쫴 + +쫵 +쫵 +쫵 +쫵 +쫵 + +쫶 +쫶 +쫶 +쫶 +쫶 + +쫷 +쫷 +쫷 +쫷 +쫷 + +쫸 +쫸 +쫸 +쫸 +쫸 + +쫹 +쫹 +쫹 +쫹 +쫹 + +쫺 +쫺 +쫺 +쫺 +쫺 + +쫻 +쫻 +쫻 +쫻 +쫻 + +쫼 +쫼 +쫼 +쫼 +쫼 + +쫽 +쫽 +쫽 +쫽 +쫽 + +쫾 +쫾 +쫾 +쫾 +쫾 + +쫿 +쫿 +쫿 +쫿 +쫿 + +쬀 +쬀 +쬀 +쬀 +쬀 + +쬁 +쬁 +쬁 +쬁 +쬁 + +쬂 +쬂 +쬂 +쬂 +쬂 + +쬃 +쬃 +쬃 +쬃 +쬃 + +쬄 +쬄 +쬄 +쬄 +쬄 + +쬅 +쬅 +쬅 +쬅 +쬅 + +쬆 +쬆 +쬆 +쬆 +쬆 + +쬇 +쬇 +쬇 +쬇 +쬇 + +쬈 +쬈 +쬈 +쬈 +쬈 + +쬉 +쬉 +쬉 +쬉 +쬉 + +쬊 +쬊 +쬊 +쬊 +쬊 + +쬋 +쬋 +쬋 +쬋 +쬋 + +쬌 +쬌 +쬌 +쬌 +쬌 + +쬍 +쬍 +쬍 +쬍 +쬍 + +쬎 +쬎 +쬎 +쬎 +쬎 + +쬏 +쬏 +쬏 +쬏 +쬏 + +쬐 +쬐 +쬐 +쬐 +쬐 + +쬑 +쬑 +쬑 +쬑 +쬑 + +쬒 +쬒 +쬒 +쬒 +쬒 + +쬓 +쬓 +쬓 +쬓 +쬓 + +쬔 +쬔 +쬔 +쬔 +쬔 + +쬕 +쬕 +쬕 +쬕 +쬕 + +쬖 +쬖 +쬖 +쬖 +쬖 + +쬗 +쬗 +쬗 +쬗 +쬗 + +쬘 +쬘 +쬘 +쬘 +쬘 + +쬙 +쬙 +쬙 +쬙 +쬙 + +쬚 +쬚 +쬚 +쬚 +쬚 + +쬛 +쬛 +쬛 +쬛 +쬛 + +쬜 +쬜 +쬜 +쬜 +쬜 + +쬝 +쬝 +쬝 +쬝 +쬝 + +쬞 +쬞 +쬞 +쬞 +쬞 + +쬟 +쬟 +쬟 +쬟 +쬟 + +쬠 +쬠 +쬠 +쬠 +쬠 + +쬡 +쬡 +쬡 +쬡 +쬡 + +쬢 +쬢 +쬢 +쬢 +쬢 + +쬣 +쬣 +쬣 +쬣 +쬣 + +쬤 +쬤 +쬤 +쬤 +쬤 + +쬥 +쬥 +쬥 +쬥 +쬥 + +쬦 +쬦 +쬦 +쬦 +쬦 + +쬧 +쬧 +쬧 +쬧 +쬧 + +쬨 +쬨 +쬨 +쬨 +쬨 + +쬩 +쬩 +쬩 +쬩 +쬩 + +쬪 +쬪 +쬪 +쬪 +쬪 + +쬫 +쬫 +쬫 +쬫 +쬫 + +쬬 +쬬 +쬬 +쬬 +쬬 + +쬭 +쬭 +쬭 +쬭 +쬭 + +쬮 +쬮 +쬮 +쬮 +쬮 + +쬯 +쬯 +쬯 +쬯 +쬯 + +쬰 +쬰 +쬰 +쬰 +쬰 + +쬱 +쬱 +쬱 +쬱 +쬱 + +쬲 +쬲 +쬲 +쬲 +쬲 + +쬳 +쬳 +쬳 +쬳 +쬳 + +쬴 +쬴 +쬴 +쬴 +쬴 + +쬵 +쬵 +쬵 +쬵 +쬵 + +쬶 +쬶 +쬶 +쬶 +쬶 + +쬷 +쬷 +쬷 +쬷 +쬷 + +쬸 +쬸 +쬸 +쬸 +쬸 + +쬹 +쬹 +쬹 +쬹 +쬹 + +쬺 +쬺 +쬺 +쬺 +쬺 + +쬻 +쬻 +쬻 +쬻 +쬻 + +쬼 +쬼 +쬼 +쬼 +쬼 + +쬽 +쬽 +쬽 +쬽 +쬽 + +쬾 +쬾 +쬾 +쬾 +쬾 + +쬿 +쬿 +쬿 +쬿 +쬿 + +쭀 +쭀 +쭀 +쭀 +쭀 + +쭁 +쭁 +쭁 +쭁 +쭁 + +쭂 +쭂 +쭂 +쭂 +쭂 + +쭃 +쭃 +쭃 +쭃 +쭃 + +쭄 +쭄 +쭄 +쭄 +쭄 + +쭅 +쭅 +쭅 +쭅 +쭅 + +쭆 +쭆 +쭆 +쭆 +쭆 + +쭇 +쭇 +쭇 +쭇 +쭇 + +쭈 +쭈 +쭈 +쭈 +쭈 + +쭉 +쭉 +쭉 +쭉 +쭉 + +쭊 +쭊 +쭊 +쭊 +쭊 + +쭋 +쭋 +쭋 +쭋 +쭋 + +쭌 +쭌 +쭌 +쭌 +쭌 + +쭍 +쭍 +쭍 +쭍 +쭍 + +쭎 +쭎 +쭎 +쭎 +쭎 + +쭏 +쭏 +쭏 +쭏 +쭏 + +쭐 +쭐 +쭐 +쭐 +쭐 + +쭑 +쭑 +쭑 +쭑 +쭑 + +쭒 +쭒 +쭒 +쭒 +쭒 + +쭓 +쭓 +쭓 +쭓 +쭓 + +쭔 +쭔 +쭔 +쭔 +쭔 + +쭕 +쭕 +쭕 +쭕 +쭕 + +쭖 +쭖 +쭖 +쭖 +쭖 + +쭗 +쭗 +쭗 +쭗 +쭗 + +쭘 +쭘 +쭘 +쭘 +쭘 + +쭙 +쭙 +쭙 +쭙 +쭙 + +쭚 +쭚 +쭚 +쭚 +쭚 + +쭛 +쭛 +쭛 +쭛 +쭛 + +쭜 +쭜 +쭜 +쭜 +쭜 + +쭝 +쭝 +쭝 +쭝 +쭝 + +쭞 +쭞 +쭞 +쭞 +쭞 + +쭟 +쭟 +쭟 +쭟 +쭟 + +쭠 +쭠 +쭠 +쭠 +쭠 + +쭡 +쭡 +쭡 +쭡 +쭡 + +쭢 +쭢 +쭢 +쭢 +쭢 + +쭣 +쭣 +쭣 +쭣 +쭣 + +쭤 +쭤 +쭤 +쭤 +쭤 + +쭥 +쭥 +쭥 +쭥 +쭥 + +쭦 +쭦 +쭦 +쭦 +쭦 + +쭧 +쭧 +쭧 +쭧 +쭧 + +쭨 +쭨 +쭨 +쭨 +쭨 + +쭩 +쭩 +쭩 +쭩 +쭩 + +쭪 +쭪 +쭪 +쭪 +쭪 + +쭫 +쭫 +쭫 +쭫 +쭫 + +쭬 +쭬 +쭬 +쭬 +쭬 + +쭭 +쭭 +쭭 +쭭 +쭭 + +쭮 +쭮 +쭮 +쭮 +쭮 + +쭯 +쭯 +쭯 +쭯 +쭯 + +쭰 +쭰 +쭰 +쭰 +쭰 + +쭱 +쭱 +쭱 +쭱 +쭱 + +쭲 +쭲 +쭲 +쭲 +쭲 + +쭳 +쭳 +쭳 +쭳 +쭳 + +쭴 +쭴 +쭴 +쭴 +쭴 + +쭵 +쭵 +쭵 +쭵 +쭵 + +쭶 +쭶 +쭶 +쭶 +쭶 + +쭷 +쭷 +쭷 +쭷 +쭷 + +쭸 +쭸 +쭸 +쭸 +쭸 + +쭹 +쭹 +쭹 +쭹 +쭹 + +쭺 +쭺 +쭺 +쭺 +쭺 + +쭻 +쭻 +쭻 +쭻 +쭻 + +쭼 +쭼 +쭼 +쭼 +쭼 + +쭽 +쭽 +쭽 +쭽 +쭽 + +쭾 +쭾 +쭾 +쭾 +쭾 + +쭿 +쭿 +쭿 +쭿 +쭿 + +쮀 +쮀 +쮀 +쮀 +쮀 + +쮁 +쮁 +쮁 +쮁 +쮁 + +쮂 +쮂 +쮂 +쮂 +쮂 + +쮃 +쮃 +쮃 +쮃 +쮃 + +쮄 +쮄 +쮄 +쮄 +쮄 + +쮅 +쮅 +쮅 +쮅 +쮅 + +쮆 +쮆 +쮆 +쮆 +쮆 + +쮇 +쮇 +쮇 +쮇 +쮇 + +쮈 +쮈 +쮈 +쮈 +쮈 + +쮉 +쮉 +쮉 +쮉 +쮉 + +쮊 +쮊 +쮊 +쮊 +쮊 + +쮋 +쮋 +쮋 +쮋 +쮋 + +쮌 +쮌 +쮌 +쮌 +쮌 + +쮍 +쮍 +쮍 +쮍 +쮍 + +쮎 +쮎 +쮎 +쮎 +쮎 + +쮏 +쮏 +쮏 +쮏 +쮏 + +쮐 +쮐 +쮐 +쮐 +쮐 + +쮑 +쮑 +쮑 +쮑 +쮑 + +쮒 +쮒 +쮒 +쮒 +쮒 + +쮓 +쮓 +쮓 +쮓 +쮓 + +쮔 +쮔 +쮔 +쮔 +쮔 + +쮕 +쮕 +쮕 +쮕 +쮕 + +쮖 +쮖 +쮖 +쮖 +쮖 + +쮗 +쮗 +쮗 +쮗 +쮗 + +쮘 +쮘 +쮘 +쮘 +쮘 + +쮙 +쮙 +쮙 +쮙 +쮙 + +쮚 +쮚 +쮚 +쮚 +쮚 + +쮛 +쮛 +쮛 +쮛 +쮛 + +쮜 +쮜 +쮜 +쮜 +쮜 + +쮝 +쮝 +쮝 +쮝 +쮝 + +쮞 +쮞 +쮞 +쮞 +쮞 + +쮟 +쮟 +쮟 +쮟 +쮟 + +쮠 +쮠 +쮠 +쮠 +쮠 + +쮡 +쮡 +쮡 +쮡 +쮡 + +쮢 +쮢 +쮢 +쮢 +쮢 + +쮣 +쮣 +쮣 +쮣 +쮣 + +쮤 +쮤 +쮤 +쮤 +쮤 + +쮥 +쮥 +쮥 +쮥 +쮥 + +쮦 +쮦 +쮦 +쮦 +쮦 + +쮧 +쮧 +쮧 +쮧 +쮧 + +쮨 +쮨 +쮨 +쮨 +쮨 + +쮩 +쮩 +쮩 +쮩 +쮩 + +쮪 +쮪 +쮪 +쮪 +쮪 + +쮫 +쮫 +쮫 +쮫 +쮫 + +쮬 +쮬 +쮬 +쮬 +쮬 + +쮭 +쮭 +쮭 +쮭 +쮭 + +쮮 +쮮 +쮮 +쮮 +쮮 + +쮯 +쮯 +쮯 +쮯 +쮯 + +쮰 +쮰 +쮰 +쮰 +쮰 + +쮱 +쮱 +쮱 +쮱 +쮱 + +쮲 +쮲 +쮲 +쮲 +쮲 + +쮳 +쮳 +쮳 +쮳 +쮳 + +쮴 +쮴 +쮴 +쮴 +쮴 + +쮵 +쮵 +쮵 +쮵 +쮵 + +쮶 +쮶 +쮶 +쮶 +쮶 + +쮷 +쮷 +쮷 +쮷 +쮷 + +쮸 +쮸 +쮸 +쮸 +쮸 + +쮹 +쮹 +쮹 +쮹 +쮹 + +쮺 +쮺 +쮺 +쮺 +쮺 + +쮻 +쮻 +쮻 +쮻 +쮻 + +쮼 +쮼 +쮼 +쮼 +쮼 + +쮽 +쮽 +쮽 +쮽 +쮽 + +쮾 +쮾 +쮾 +쮾 +쮾 + +쮿 +쮿 +쮿 +쮿 +쮿 + +쯀 +쯀 +쯀 +쯀 +쯀 + +쯁 +쯁 +쯁 +쯁 +쯁 + +쯂 +쯂 +쯂 +쯂 +쯂 + +쯃 +쯃 +쯃 +쯃 +쯃 + +쯄 +쯄 +쯄 +쯄 +쯄 + +쯅 +쯅 +쯅 +쯅 +쯅 + +쯆 +쯆 +쯆 +쯆 +쯆 + +쯇 +쯇 +쯇 +쯇 +쯇 + +쯈 +쯈 +쯈 +쯈 +쯈 + +쯉 +쯉 +쯉 +쯉 +쯉 + +쯊 +쯊 +쯊 +쯊 +쯊 + +쯋 +쯋 +쯋 +쯋 +쯋 + +쯌 +쯌 +쯌 +쯌 +쯌 + +쯍 +쯍 +쯍 +쯍 +쯍 + +쯎 +쯎 +쯎 +쯎 +쯎 + +쯏 +쯏 +쯏 +쯏 +쯏 + +쯐 +쯐 +쯐 +쯐 +쯐 + +쯑 +쯑 +쯑 +쯑 +쯑 + +쯒 +쯒 +쯒 +쯒 +쯒 + +쯓 +쯓 +쯓 +쯓 +쯓 + +쯔 +쯔 +쯔 +쯔 +쯔 + +쯕 +쯕 +쯕 +쯕 +쯕 + +쯖 +쯖 +쯖 +쯖 +쯖 + +쯗 +쯗 +쯗 +쯗 +쯗 + +쯘 +쯘 +쯘 +쯘 +쯘 + +쯙 +쯙 +쯙 +쯙 +쯙 + +쯚 +쯚 +쯚 +쯚 +쯚 + +쯛 +쯛 +쯛 +쯛 +쯛 + +쯜 +쯜 +쯜 +쯜 +쯜 + +쯝 +쯝 +쯝 +쯝 +쯝 + +쯞 +쯞 +쯞 +쯞 +쯞 + +쯟 +쯟 +쯟 +쯟 +쯟 + +쯠 +쯠 +쯠 +쯠 +쯠 + +쯡 +쯡 +쯡 +쯡 +쯡 + +쯢 +쯢 +쯢 +쯢 +쯢 + +쯣 +쯣 +쯣 +쯣 +쯣 + +쯤 +쯤 +쯤 +쯤 +쯤 + +쯥 +쯥 +쯥 +쯥 +쯥 + +쯦 +쯦 +쯦 +쯦 +쯦 + +쯧 +쯧 +쯧 +쯧 +쯧 + +쯨 +쯨 +쯨 +쯨 +쯨 + +쯩 +쯩 +쯩 +쯩 +쯩 + +쯪 +쯪 +쯪 +쯪 +쯪 + +쯫 +쯫 +쯫 +쯫 +쯫 + +쯬 +쯬 +쯬 +쯬 +쯬 + +쯭 +쯭 +쯭 +쯭 +쯭 + +쯮 +쯮 +쯮 +쯮 +쯮 + +쯯 +쯯 +쯯 +쯯 +쯯 + +쯰 +쯰 +쯰 +쯰 +쯰 + +쯱 +쯱 +쯱 +쯱 +쯱 + +쯲 +쯲 +쯲 +쯲 +쯲 + +쯳 +쯳 +쯳 +쯳 +쯳 + +쯴 +쯴 +쯴 +쯴 +쯴 + +쯵 +쯵 +쯵 +쯵 +쯵 + +쯶 +쯶 +쯶 +쯶 +쯶 + +쯷 +쯷 +쯷 +쯷 +쯷 + +쯸 +쯸 +쯸 +쯸 +쯸 + +쯹 +쯹 +쯹 +쯹 +쯹 + +쯺 +쯺 +쯺 +쯺 +쯺 + +쯻 +쯻 +쯻 +쯻 +쯻 + +쯼 +쯼 +쯼 +쯼 +쯼 + +쯽 +쯽 +쯽 +쯽 +쯽 + +쯾 +쯾 +쯾 +쯾 +쯾 + +쯿 +쯿 +쯿 +쯿 +쯿 + +찀 +찀 +찀 +찀 +찀 + +찁 +찁 +찁 +찁 +찁 + +찂 +찂 +찂 +찂 +찂 + +찃 +찃 +찃 +찃 +찃 + +찄 +찄 +찄 +찄 +찄 + +찅 +찅 +찅 +찅 +찅 + +찆 +찆 +찆 +찆 +찆 + +찇 +찇 +찇 +찇 +찇 + +찈 +찈 +찈 +찈 +찈 + +찉 +찉 +찉 +찉 +찉 + +찊 +찊 +찊 +찊 +찊 + +찋 +찋 +찋 +찋 +찋 + +찌 +찌 +찌 +찌 +찌 + +찍 +찍 +찍 +찍 +찍 + +찎 +찎 +찎 +찎 +찎 + +찏 +찏 +찏 +찏 +찏 + +찐 +찐 +찐 +찐 +찐 + +찑 +찑 +찑 +찑 +찑 + +찒 +찒 +찒 +찒 +찒 + +찓 +찓 +찓 +찓 +찓 + +찔 +찔 +찔 +찔 +찔 + +찕 +찕 +찕 +찕 +찕 + +찖 +찖 +찖 +찖 +찖 + +찗 +찗 +찗 +찗 +찗 + +찘 +찘 +찘 +찘 +찘 + +찙 +찙 +찙 +찙 +찙 + +찚 +찚 +찚 +찚 +찚 + +찛 +찛 +찛 +찛 +찛 + +찜 +찜 +찜 +찜 +찜 + +찝 +찝 +찝 +찝 +찝 + +찞 +찞 +찞 +찞 +찞 + +찟 +찟 +찟 +찟 +찟 + +찠 +찠 +찠 +찠 +찠 + +찡 +찡 +찡 +찡 +찡 + +찢 +찢 +찢 +찢 +찢 + +찣 +찣 +찣 +찣 +찣 + +찤 +찤 +찤 +찤 +찤 + +찥 +찥 +찥 +찥 +찥 + +찦 +찦 +찦 +찦 +찦 + +찧 +찧 +찧 +찧 +찧 + +차 +차 +차 +차 +차 + +착 +착 +착 +착 +착 + +찪 +찪 +찪 +찪 +찪 + +찫 +찫 +찫 +찫 +찫 + +찬 +찬 +찬 +찬 +찬 + +찭 +찭 +찭 +찭 +찭 + +찮 +찮 +찮 +찮 +찮 + +찯 +찯 +찯 +찯 +찯 + +찰 +찰 +찰 +찰 +찰 + +찱 +찱 +찱 +찱 +찱 + +찲 +찲 +찲 +찲 +찲 + +찳 +찳 +찳 +찳 +찳 + +찴 +찴 +찴 +찴 +찴 + +찵 +찵 +찵 +찵 +찵 + +찶 +찶 +찶 +찶 +찶 + +찷 +찷 +찷 +찷 +찷 + +참 +참 +참 +참 +참 + +찹 +찹 +찹 +찹 +찹 + +찺 +찺 +찺 +찺 +찺 + +찻 +찻 +찻 +찻 +찻 + +찼 +찼 +찼 +찼 +찼 + +창 +창 +창 +창 +창 + +찾 +찾 +찾 +찾 +찾 + +찿 +찿 +찿 +찿 +찿 + +챀 +챀 +챀 +챀 +챀 + +챁 +챁 +챁 +챁 +챁 + +챂 +챂 +챂 +챂 +챂 + +챃 +챃 +챃 +챃 +챃 + +채 +채 +채 +채 +채 + +책 +책 +책 +책 +책 + +챆 +챆 +챆 +챆 +챆 + +챇 +챇 +챇 +챇 +챇 + +챈 +챈 +챈 +챈 +챈 + +챉 +챉 +챉 +챉 +챉 + +챊 +챊 +챊 +챊 +챊 + +챋 +챋 +챋 +챋 +챋 + +챌 +챌 +챌 +챌 +챌 + +챍 +챍 +챍 +챍 +챍 + +챎 +챎 +챎 +챎 +챎 + +챏 +챏 +챏 +챏 +챏 + +챐 +챐 +챐 +챐 +챐 + +챑 +챑 +챑 +챑 +챑 + +챒 +챒 +챒 +챒 +챒 + +챓 +챓 +챓 +챓 +챓 + +챔 +챔 +챔 +챔 +챔 + +챕 +챕 +챕 +챕 +챕 + +챖 +챖 +챖 +챖 +챖 + +챗 +챗 +챗 +챗 +챗 + +챘 +챘 +챘 +챘 +챘 + +챙 +챙 +챙 +챙 +챙 + +챚 +챚 +챚 +챚 +챚 + +챛 +챛 +챛 +챛 +챛 + +챜 +챜 +챜 +챜 +챜 + +챝 +챝 +챝 +챝 +챝 + +챞 +챞 +챞 +챞 +챞 + +챟 +챟 +챟 +챟 +챟 + +챠 +챠 +챠 +챠 +챠 + +챡 +챡 +챡 +챡 +챡 + +챢 +챢 +챢 +챢 +챢 + +챣 +챣 +챣 +챣 +챣 + +챤 +챤 +챤 +챤 +챤 + +챥 +챥 +챥 +챥 +챥 + +챦 +챦 +챦 +챦 +챦 + +챧 +챧 +챧 +챧 +챧 + +챨 +챨 +챨 +챨 +챨 + +챩 +챩 +챩 +챩 +챩 + +챪 +챪 +챪 +챪 +챪 + +챫 +챫 +챫 +챫 +챫 + +챬 +챬 +챬 +챬 +챬 + +챭 +챭 +챭 +챭 +챭 + +챮 +챮 +챮 +챮 +챮 + +챯 +챯 +챯 +챯 +챯 + +챰 +챰 +챰 +챰 +챰 + +챱 +챱 +챱 +챱 +챱 + +챲 +챲 +챲 +챲 +챲 + +챳 +챳 +챳 +챳 +챳 + +챴 +챴 +챴 +챴 +챴 + +챵 +챵 +챵 +챵 +챵 + +챶 +챶 +챶 +챶 +챶 + +챷 +챷 +챷 +챷 +챷 + +챸 +챸 +챸 +챸 +챸 + +챹 +챹 +챹 +챹 +챹 + +챺 +챺 +챺 +챺 +챺 + +챻 +챻 +챻 +챻 +챻 + +챼 +챼 +챼 +챼 +챼 + +챽 +챽 +챽 +챽 +챽 + +챾 +챾 +챾 +챾 +챾 + +챿 +챿 +챿 +챿 +챿 + +첀 +첀 +첀 +첀 +첀 + +첁 +첁 +첁 +첁 +첁 + +첂 +첂 +첂 +첂 +첂 + +첃 +첃 +첃 +첃 +첃 + +첄 +첄 +첄 +첄 +첄 + +첅 +첅 +첅 +첅 +첅 + +첆 +첆 +첆 +첆 +첆 + +첇 +첇 +첇 +첇 +첇 + +첈 +첈 +첈 +첈 +첈 + +첉 +첉 +첉 +첉 +첉 + +첊 +첊 +첊 +첊 +첊 + +첋 +첋 +첋 +첋 +첋 + +첌 +첌 +첌 +첌 +첌 + +첍 +첍 +첍 +첍 +첍 + +첎 +첎 +첎 +첎 +첎 + +첏 +첏 +첏 +첏 +첏 + +첐 +첐 +첐 +첐 +첐 + +첑 +첑 +첑 +첑 +첑 + +첒 +첒 +첒 +첒 +첒 + +첓 +첓 +첓 +첓 +첓 + +첔 +첔 +첔 +첔 +첔 + +첕 +첕 +첕 +첕 +첕 + +첖 +첖 +첖 +첖 +첖 + +첗 +첗 +첗 +첗 +첗 + +처 +처 +처 +처 +처 + +척 +척 +척 +척 +척 + +첚 +첚 +첚 +첚 +첚 + +첛 +첛 +첛 +첛 +첛 + +천 +천 +천 +천 +천 + +첝 +첝 +첝 +첝 +첝 + +첞 +첞 +첞 +첞 +첞 + +첟 +첟 +첟 +첟 +첟 + +철 +철 +철 +철 +철 + +첡 +첡 +첡 +첡 +첡 + +첢 +첢 +첢 +첢 +첢 + +첣 +첣 +첣 +첣 +첣 + +첤 +첤 +첤 +첤 +첤 + +첥 +첥 +첥 +첥 +첥 + +첦 +첦 +첦 +첦 +첦 + +첧 +첧 +첧 +첧 +첧 + +첨 +첨 +첨 +첨 +첨 + +첩 +첩 +첩 +첩 +첩 + +첪 +첪 +첪 +첪 +첪 + +첫 +첫 +첫 +첫 +첫 + +첬 +첬 +첬 +첬 +첬 + +청 +청 +청 +청 +청 + +첮 +첮 +첮 +첮 +첮 + +첯 +첯 +첯 +첯 +첯 + +첰 +첰 +첰 +첰 +첰 + +첱 +첱 +첱 +첱 +첱 + +첲 +첲 +첲 +첲 +첲 + +첳 +첳 +첳 +첳 +첳 + +체 +체 +체 +체 +체 + +첵 +첵 +첵 +첵 +첵 + +첶 +첶 +첶 +첶 +첶 + +첷 +첷 +첷 +첷 +첷 + +첸 +첸 +첸 +첸 +첸 + +첹 +첹 +첹 +첹 +첹 + +첺 +첺 +첺 +첺 +첺 + +첻 +첻 +첻 +첻 +첻 + +첼 +첼 +첼 +첼 +첼 + +첽 +첽 +첽 +첽 +첽 + +첾 +첾 +첾 +첾 +첾 + +첿 +첿 +첿 +첿 +첿 + +쳀 +쳀 +쳀 +쳀 +쳀 + +쳁 +쳁 +쳁 +쳁 +쳁 + +쳂 +쳂 +쳂 +쳂 +쳂 + +쳃 +쳃 +쳃 +쳃 +쳃 + +쳄 +쳄 +쳄 +쳄 +쳄 + +쳅 +쳅 +쳅 +쳅 +쳅 + +쳆 +쳆 +쳆 +쳆 +쳆 + +쳇 +쳇 +쳇 +쳇 +쳇 + +쳈 +쳈 +쳈 +쳈 +쳈 + +쳉 +쳉 +쳉 +쳉 +쳉 + +쳊 +쳊 +쳊 +쳊 +쳊 + +쳋 +쳋 +쳋 +쳋 +쳋 + +쳌 +쳌 +쳌 +쳌 +쳌 + +쳍 +쳍 +쳍 +쳍 +쳍 + +쳎 +쳎 +쳎 +쳎 +쳎 + +쳏 +쳏 +쳏 +쳏 +쳏 + +쳐 +쳐 +쳐 +쳐 +쳐 + +쳑 +쳑 +쳑 +쳑 +쳑 + +쳒 +쳒 +쳒 +쳒 +쳒 + +쳓 +쳓 +쳓 +쳓 +쳓 + +쳔 +쳔 +쳔 +쳔 +쳔 + +쳕 +쳕 +쳕 +쳕 +쳕 + +쳖 +쳖 +쳖 +쳖 +쳖 + +쳗 +쳗 +쳗 +쳗 +쳗 + +쳘 +쳘 +쳘 +쳘 +쳘 + +쳙 +쳙 +쳙 +쳙 +쳙 + +쳚 +쳚 +쳚 +쳚 +쳚 + +쳛 +쳛 +쳛 +쳛 +쳛 + +쳜 +쳜 +쳜 +쳜 +쳜 + +쳝 +쳝 +쳝 +쳝 +쳝 + +쳞 +쳞 +쳞 +쳞 +쳞 + +쳟 +쳟 +쳟 +쳟 +쳟 + +쳠 +쳠 +쳠 +쳠 +쳠 + +쳡 +쳡 +쳡 +쳡 +쳡 + +쳢 +쳢 +쳢 +쳢 +쳢 + +쳣 +쳣 +쳣 +쳣 +쳣 + +쳤 +쳤 +쳤 +쳤 +쳤 + +쳥 +쳥 +쳥 +쳥 +쳥 + +쳦 +쳦 +쳦 +쳦 +쳦 + +쳧 +쳧 +쳧 +쳧 +쳧 + +쳨 +쳨 +쳨 +쳨 +쳨 + +쳩 +쳩 +쳩 +쳩 +쳩 + +쳪 +쳪 +쳪 +쳪 +쳪 + +쳫 +쳫 +쳫 +쳫 +쳫 + +쳬 +쳬 +쳬 +쳬 +쳬 + +쳭 +쳭 +쳭 +쳭 +쳭 + +쳮 +쳮 +쳮 +쳮 +쳮 + +쳯 +쳯 +쳯 +쳯 +쳯 + +쳰 +쳰 +쳰 +쳰 +쳰 + +쳱 +쳱 +쳱 +쳱 +쳱 + +쳲 +쳲 +쳲 +쳲 +쳲 + +쳳 +쳳 +쳳 +쳳 +쳳 + +쳴 +쳴 +쳴 +쳴 +쳴 + +쳵 +쳵 +쳵 +쳵 +쳵 + +쳶 +쳶 +쳶 +쳶 +쳶 + +쳷 +쳷 +쳷 +쳷 +쳷 + +쳸 +쳸 +쳸 +쳸 +쳸 + +쳹 +쳹 +쳹 +쳹 +쳹 + +쳺 +쳺 +쳺 +쳺 +쳺 + +쳻 +쳻 +쳻 +쳻 +쳻 + +쳼 +쳼 +쳼 +쳼 +쳼 + +쳽 +쳽 +쳽 +쳽 +쳽 + +쳾 +쳾 +쳾 +쳾 +쳾 + +쳿 +쳿 +쳿 +쳿 +쳿 + +촀 +촀 +촀 +촀 +촀 + +촁 +촁 +촁 +촁 +촁 + +촂 +촂 +촂 +촂 +촂 + +촃 +촃 +촃 +촃 +촃 + +촄 +촄 +촄 +촄 +촄 + +촅 +촅 +촅 +촅 +촅 + +촆 +촆 +촆 +촆 +촆 + +촇 +촇 +촇 +촇 +촇 + +초 +초 +초 +초 +초 + +촉 +촉 +촉 +촉 +촉 + +촊 +촊 +촊 +촊 +촊 + +촋 +촋 +촋 +촋 +촋 + +촌 +촌 +촌 +촌 +촌 + +촍 +촍 +촍 +촍 +촍 + +촎 +촎 +촎 +촎 +촎 + +촏 +촏 +촏 +촏 +촏 + +촐 +촐 +촐 +촐 +촐 + +촑 +촑 +촑 +촑 +촑 + +촒 +촒 +촒 +촒 +촒 + +촓 +촓 +촓 +촓 +촓 + +촔 +촔 +촔 +촔 +촔 + +촕 +촕 +촕 +촕 +촕 + +촖 +촖 +촖 +촖 +촖 + +촗 +촗 +촗 +촗 +촗 + +촘 +촘 +촘 +촘 +촘 + +촙 +촙 +촙 +촙 +촙 + +촚 +촚 +촚 +촚 +촚 + +촛 +촛 +촛 +촛 +촛 + +촜 +촜 +촜 +촜 +촜 + +총 +총 +총 +총 +총 + +촞 +촞 +촞 +촞 +촞 + +촟 +촟 +촟 +촟 +촟 + +촠 +촠 +촠 +촠 +촠 + +촡 +촡 +촡 +촡 +촡 + +촢 +촢 +촢 +촢 +촢 + +촣 +촣 +촣 +촣 +촣 + +촤 +촤 +촤 +촤 +촤 + +촥 +촥 +촥 +촥 +촥 + +촦 +촦 +촦 +촦 +촦 + +촧 +촧 +촧 +촧 +촧 + +촨 +촨 +촨 +촨 +촨 + +촩 +촩 +촩 +촩 +촩 + +촪 +촪 +촪 +촪 +촪 + +촫 +촫 +촫 +촫 +촫 + +촬 +촬 +촬 +촬 +촬 + +촭 +촭 +촭 +촭 +촭 + +촮 +촮 +촮 +촮 +촮 + +촯 +촯 +촯 +촯 +촯 + +촰 +촰 +촰 +촰 +촰 + +촱 +촱 +촱 +촱 +촱 + +촲 +촲 +촲 +촲 +촲 + +촳 +촳 +촳 +촳 +촳 + +촴 +촴 +촴 +촴 +촴 + +촵 +촵 +촵 +촵 +촵 + +촶 +촶 +촶 +촶 +촶 + +촷 +촷 +촷 +촷 +촷 + +촸 +촸 +촸 +촸 +촸 + +촹 +촹 +촹 +촹 +촹 + +촺 +촺 +촺 +촺 +촺 + +촻 +촻 +촻 +촻 +촻 + +촼 +촼 +촼 +촼 +촼 + +촽 +촽 +촽 +촽 +촽 + +촾 +촾 +촾 +촾 +촾 + +촿 +촿 +촿 +촿 +촿 + +쵀 +쵀 +쵀 +쵀 +쵀 + +쵁 +쵁 +쵁 +쵁 +쵁 + +쵂 +쵂 +쵂 +쵂 +쵂 + +쵃 +쵃 +쵃 +쵃 +쵃 + +쵄 +쵄 +쵄 +쵄 +쵄 + +쵅 +쵅 +쵅 +쵅 +쵅 + +쵆 +쵆 +쵆 +쵆 +쵆 + +쵇 +쵇 +쵇 +쵇 +쵇 + +쵈 +쵈 +쵈 +쵈 +쵈 + +쵉 +쵉 +쵉 +쵉 +쵉 + +쵊 +쵊 +쵊 +쵊 +쵊 + +쵋 +쵋 +쵋 +쵋 +쵋 + +쵌 +쵌 +쵌 +쵌 +쵌 + +쵍 +쵍 +쵍 +쵍 +쵍 + +쵎 +쵎 +쵎 +쵎 +쵎 + +쵏 +쵏 +쵏 +쵏 +쵏 + +쵐 +쵐 +쵐 +쵐 +쵐 + +쵑 +쵑 +쵑 +쵑 +쵑 + +쵒 +쵒 +쵒 +쵒 +쵒 + +쵓 +쵓 +쵓 +쵓 +쵓 + +쵔 +쵔 +쵔 +쵔 +쵔 + +쵕 +쵕 +쵕 +쵕 +쵕 + +쵖 +쵖 +쵖 +쵖 +쵖 + +쵗 +쵗 +쵗 +쵗 +쵗 + +쵘 +쵘 +쵘 +쵘 +쵘 + +쵙 +쵙 +쵙 +쵙 +쵙 + +쵚 +쵚 +쵚 +쵚 +쵚 + +쵛 +쵛 +쵛 +쵛 +쵛 + +최 +최 +최 +최 +최 + +쵝 +쵝 +쵝 +쵝 +쵝 + +쵞 +쵞 +쵞 +쵞 +쵞 + +쵟 +쵟 +쵟 +쵟 +쵟 + +쵠 +쵠 +쵠 +쵠 +쵠 + +쵡 +쵡 +쵡 +쵡 +쵡 + +쵢 +쵢 +쵢 +쵢 +쵢 + +쵣 +쵣 +쵣 +쵣 +쵣 + +쵤 +쵤 +쵤 +쵤 +쵤 + +쵥 +쵥 +쵥 +쵥 +쵥 + +쵦 +쵦 +쵦 +쵦 +쵦 + +쵧 +쵧 +쵧 +쵧 +쵧 + +쵨 +쵨 +쵨 +쵨 +쵨 + +쵩 +쵩 +쵩 +쵩 +쵩 + +쵪 +쵪 +쵪 +쵪 +쵪 + +쵫 +쵫 +쵫 +쵫 +쵫 + +쵬 +쵬 +쵬 +쵬 +쵬 + +쵭 +쵭 +쵭 +쵭 +쵭 + +쵮 +쵮 +쵮 +쵮 +쵮 + +쵯 +쵯 +쵯 +쵯 +쵯 + +쵰 +쵰 +쵰 +쵰 +쵰 + +쵱 +쵱 +쵱 +쵱 +쵱 + +쵲 +쵲 +쵲 +쵲 +쵲 + +쵳 +쵳 +쵳 +쵳 +쵳 + +쵴 +쵴 +쵴 +쵴 +쵴 + +쵵 +쵵 +쵵 +쵵 +쵵 + +쵶 +쵶 +쵶 +쵶 +쵶 + +쵷 +쵷 +쵷 +쵷 +쵷 + +쵸 +쵸 +쵸 +쵸 +쵸 + +쵹 +쵹 +쵹 +쵹 +쵹 + +쵺 +쵺 +쵺 +쵺 +쵺 + +쵻 +쵻 +쵻 +쵻 +쵻 + +쵼 +쵼 +쵼 +쵼 +쵼 + +쵽 +쵽 +쵽 +쵽 +쵽 + +쵾 +쵾 +쵾 +쵾 +쵾 + +쵿 +쵿 +쵿 +쵿 +쵿 + +춀 +춀 +춀 +춀 +춀 + +춁 +춁 +춁 +춁 +춁 + +춂 +춂 +춂 +춂 +춂 + +춃 +춃 +춃 +춃 +춃 + +춄 +춄 +춄 +춄 +춄 + +춅 +춅 +춅 +춅 +춅 + +춆 +춆 +춆 +춆 +춆 + +춇 +춇 +춇 +춇 +춇 + +춈 +춈 +춈 +춈 +춈 + +춉 +춉 +춉 +춉 +춉 + +춊 +춊 +춊 +춊 +춊 + +춋 +춋 +춋 +춋 +춋 + +춌 +춌 +춌 +춌 +춌 + +춍 +춍 +춍 +춍 +춍 + +춎 +춎 +춎 +춎 +춎 + +춏 +춏 +춏 +춏 +춏 + +춐 +춐 +춐 +춐 +춐 + +춑 +춑 +춑 +춑 +춑 + +춒 +춒 +춒 +춒 +춒 + +춓 +춓 +춓 +춓 +춓 + +추 +추 +추 +추 +추 + +축 +축 +축 +축 +축 + +춖 +춖 +춖 +춖 +춖 + +춗 +춗 +춗 +춗 +춗 + +춘 +춘 +춘 +춘 +춘 + +춙 +춙 +춙 +춙 +춙 + +춚 +춚 +춚 +춚 +춚 + +춛 +춛 +춛 +춛 +춛 + +출 +출 +출 +출 +출 + +춝 +춝 +춝 +춝 +춝 + +춞 +춞 +춞 +춞 +춞 + +춟 +춟 +춟 +춟 +춟 + +춠 +춠 +춠 +춠 +춠 + +춡 +춡 +춡 +춡 +춡 + +춢 +춢 +춢 +춢 +춢 + +춣 +춣 +춣 +춣 +춣 + +춤 +춤 +춤 +춤 +춤 + +춥 +춥 +춥 +춥 +춥 + +춦 +춦 +춦 +춦 +춦 + +춧 +춧 +춧 +춧 +춧 + +춨 +춨 +춨 +춨 +춨 + +충 +충 +충 +충 +충 + +춪 +춪 +춪 +춪 +춪 + +춫 +춫 +춫 +춫 +춫 + +춬 +춬 +춬 +춬 +춬 + +춭 +춭 +춭 +춭 +춭 + +춮 +춮 +춮 +춮 +춮 + +춯 +춯 +춯 +춯 +춯 + +춰 +춰 +춰 +춰 +춰 + +춱 +춱 +춱 +춱 +춱 + +춲 +춲 +춲 +춲 +춲 + +춳 +춳 +춳 +춳 +춳 + +춴 +춴 +춴 +춴 +춴 + +춵 +춵 +춵 +춵 +춵 + +춶 +춶 +춶 +춶 +춶 + +춷 +춷 +춷 +춷 +춷 + +춸 +춸 +춸 +춸 +춸 + +춹 +춹 +춹 +춹 +춹 + +춺 +춺 +춺 +춺 +춺 + +춻 +춻 +춻 +춻 +춻 + +춼 +춼 +춼 +춼 +춼 + +춽 +춽 +춽 +춽 +춽 + +춾 +춾 +춾 +춾 +춾 + +춿 +춿 +춿 +춿 +춿 + +췀 +췀 +췀 +췀 +췀 + +췁 +췁 +췁 +췁 +췁 + +췂 +췂 +췂 +췂 +췂 + +췃 +췃 +췃 +췃 +췃 + +췄 +췄 +췄 +췄 +췄 + +췅 +췅 +췅 +췅 +췅 + +췆 +췆 +췆 +췆 +췆 + +췇 +췇 +췇 +췇 +췇 + +췈 +췈 +췈 +췈 +췈 + +췉 +췉 +췉 +췉 +췉 + +췊 +췊 +췊 +췊 +췊 + +췋 +췋 +췋 +췋 +췋 + +췌 +췌 +췌 +췌 +췌 + +췍 +췍 +췍 +췍 +췍 + +췎 +췎 +췎 +췎 +췎 + +췏 +췏 +췏 +췏 +췏 + +췐 +췐 +췐 +췐 +췐 + +췑 +췑 +췑 +췑 +췑 + +췒 +췒 +췒 +췒 +췒 + +췓 +췓 +췓 +췓 +췓 + +췔 +췔 +췔 +췔 +췔 + +췕 +췕 +췕 +췕 +췕 + +췖 +췖 +췖 +췖 +췖 + +췗 +췗 +췗 +췗 +췗 + +췘 +췘 +췘 +췘 +췘 + +췙 +췙 +췙 +췙 +췙 + +췚 +췚 +췚 +췚 +췚 + +췛 +췛 +췛 +췛 +췛 + +췜 +췜 +췜 +췜 +췜 + +췝 +췝 +췝 +췝 +췝 + +췞 +췞 +췞 +췞 +췞 + +췟 +췟 +췟 +췟 +췟 + +췠 +췠 +췠 +췠 +췠 + +췡 +췡 +췡 +췡 +췡 + +췢 +췢 +췢 +췢 +췢 + +췣 +췣 +췣 +췣 +췣 + +췤 +췤 +췤 +췤 +췤 + +췥 +췥 +췥 +췥 +췥 + +췦 +췦 +췦 +췦 +췦 + +췧 +췧 +췧 +췧 +췧 + +취 +취 +취 +취 +취 + +췩 +췩 +췩 +췩 +췩 + +췪 +췪 +췪 +췪 +췪 + +췫 +췫 +췫 +췫 +췫 + +췬 +췬 +췬 +췬 +췬 + +췭 +췭 +췭 +췭 +췭 + +췮 +췮 +췮 +췮 +췮 + +췯 +췯 +췯 +췯 +췯 + +췰 +췰 +췰 +췰 +췰 + +췱 +췱 +췱 +췱 +췱 + +췲 +췲 +췲 +췲 +췲 + +췳 +췳 +췳 +췳 +췳 + +췴 +췴 +췴 +췴 +췴 + +췵 +췵 +췵 +췵 +췵 + +췶 +췶 +췶 +췶 +췶 + +췷 +췷 +췷 +췷 +췷 + +췸 +췸 +췸 +췸 +췸 + +췹 +췹 +췹 +췹 +췹 + +췺 +췺 +췺 +췺 +췺 + +췻 +췻 +췻 +췻 +췻 + +췼 +췼 +췼 +췼 +췼 + +췽 +췽 +췽 +췽 +췽 + +췾 +췾 +췾 +췾 +췾 + +췿 +췿 +췿 +췿 +췿 + +츀 +츀 +츀 +츀 +츀 + +츁 +츁 +츁 +츁 +츁 + +츂 +츂 +츂 +츂 +츂 + +츃 +츃 +츃 +츃 +츃 + +츄 +츄 +츄 +츄 +츄 + +츅 +츅 +츅 +츅 +츅 + +츆 +츆 +츆 +츆 +츆 + +츇 +츇 +츇 +츇 +츇 + +츈 +츈 +츈 +츈 +츈 + +츉 +츉 +츉 +츉 +츉 + +츊 +츊 +츊 +츊 +츊 + +츋 +츋 +츋 +츋 +츋 + +츌 +츌 +츌 +츌 +츌 + +츍 +츍 +츍 +츍 +츍 + +츎 +츎 +츎 +츎 +츎 + +츏 +츏 +츏 +츏 +츏 + +츐 +츐 +츐 +츐 +츐 + +츑 +츑 +츑 +츑 +츑 + +츒 +츒 +츒 +츒 +츒 + +츓 +츓 +츓 +츓 +츓 + +츔 +츔 +츔 +츔 +츔 + +츕 +츕 +츕 +츕 +츕 + +츖 +츖 +츖 +츖 +츖 + +츗 +츗 +츗 +츗 +츗 + +츘 +츘 +츘 +츘 +츘 + +츙 +츙 +츙 +츙 +츙 + +츚 +츚 +츚 +츚 +츚 + +츛 +츛 +츛 +츛 +츛 + +츜 +츜 +츜 +츜 +츜 + +츝 +츝 +츝 +츝 +츝 + +츞 +츞 +츞 +츞 +츞 + +츟 +츟 +츟 +츟 +츟 + +츠 +츠 +츠 +츠 +츠 + +측 +측 +측 +측 +측 + +츢 +츢 +츢 +츢 +츢 + +츣 +츣 +츣 +츣 +츣 + +츤 +츤 +츤 +츤 +츤 + +츥 +츥 +츥 +츥 +츥 + +츦 +츦 +츦 +츦 +츦 + +츧 +츧 +츧 +츧 +츧 + +츨 +츨 +츨 +츨 +츨 + +츩 +츩 +츩 +츩 +츩 + +츪 +츪 +츪 +츪 +츪 + +츫 +츫 +츫 +츫 +츫 + +츬 +츬 +츬 +츬 +츬 + +츭 +츭 +츭 +츭 +츭 + +츮 +츮 +츮 +츮 +츮 + +츯 +츯 +츯 +츯 +츯 + +츰 +츰 +츰 +츰 +츰 + +츱 +츱 +츱 +츱 +츱 + +츲 +츲 +츲 +츲 +츲 + +츳 +츳 +츳 +츳 +츳 + +츴 +츴 +츴 +츴 +츴 + +층 +층 +층 +층 +층 + +츶 +츶 +츶 +츶 +츶 + +츷 +츷 +츷 +츷 +츷 + +츸 +츸 +츸 +츸 +츸 + +츹 +츹 +츹 +츹 +츹 + +츺 +츺 +츺 +츺 +츺 + +츻 +츻 +츻 +츻 +츻 + +츼 +츼 +츼 +츼 +츼 + +츽 +츽 +츽 +츽 +츽 + +츾 +츾 +츾 +츾 +츾 + +츿 +츿 +츿 +츿 +츿 + +칀 +칀 +칀 +칀 +칀 + +칁 +칁 +칁 +칁 +칁 + +칂 +칂 +칂 +칂 +칂 + +칃 +칃 +칃 +칃 +칃 + +칄 +칄 +칄 +칄 +칄 + +칅 +칅 +칅 +칅 +칅 + +칆 +칆 +칆 +칆 +칆 + +칇 +칇 +칇 +칇 +칇 + +칈 +칈 +칈 +칈 +칈 + +칉 +칉 +칉 +칉 +칉 + +칊 +칊 +칊 +칊 +칊 + +칋 +칋 +칋 +칋 +칋 + +칌 +칌 +칌 +칌 +칌 + +칍 +칍 +칍 +칍 +칍 + +칎 +칎 +칎 +칎 +칎 + +칏 +칏 +칏 +칏 +칏 + +칐 +칐 +칐 +칐 +칐 + +칑 +칑 +칑 +칑 +칑 + +칒 +칒 +칒 +칒 +칒 + +칓 +칓 +칓 +칓 +칓 + +칔 +칔 +칔 +칔 +칔 + +칕 +칕 +칕 +칕 +칕 + +칖 +칖 +칖 +칖 +칖 + +칗 +칗 +칗 +칗 +칗 + +치 +치 +치 +치 +치 + +칙 +칙 +칙 +칙 +칙 + +칚 +칚 +칚 +칚 +칚 + +칛 +칛 +칛 +칛 +칛 + +친 +친 +친 +친 +친 + +칝 +칝 +칝 +칝 +칝 + +칞 +칞 +칞 +칞 +칞 + +칟 +칟 +칟 +칟 +칟 + +칠 +칠 +칠 +칠 +칠 + +칡 +칡 +칡 +칡 +칡 + +칢 +칢 +칢 +칢 +칢 + +칣 +칣 +칣 +칣 +칣 + +칤 +칤 +칤 +칤 +칤 + +칥 +칥 +칥 +칥 +칥 + +칦 +칦 +칦 +칦 +칦 + +칧 +칧 +칧 +칧 +칧 + +침 +침 +침 +침 +침 + +칩 +칩 +칩 +칩 +칩 + +칪 +칪 +칪 +칪 +칪 + +칫 +칫 +칫 +칫 +칫 + +칬 +칬 +칬 +칬 +칬 + +칭 +칭 +칭 +칭 +칭 + +칮 +칮 +칮 +칮 +칮 + +칯 +칯 +칯 +칯 +칯 + +칰 +칰 +칰 +칰 +칰 + +칱 +칱 +칱 +칱 +칱 + +칲 +칲 +칲 +칲 +칲 + +칳 +칳 +칳 +칳 +칳 + +카 +카 +카 +카 +카 + +칵 +칵 +칵 +칵 +칵 + +칶 +칶 +칶 +칶 +칶 + +칷 +칷 +칷 +칷 +칷 + +칸 +칸 +칸 +칸 +칸 + +칹 +칹 +칹 +칹 +칹 + +칺 +칺 +칺 +칺 +칺 + +칻 +칻 +칻 +칻 +칻 + +칼 +칼 +칼 +칼 +칼 + +칽 +칽 +칽 +칽 +칽 + +칾 +칾 +칾 +칾 +칾 + +칿 +칿 +칿 +칿 +칿 + +캀 +캀 +캀 +캀 +캀 + +캁 +캁 +캁 +캁 +캁 + +캂 +캂 +캂 +캂 +캂 + +캃 +캃 +캃 +캃 +캃 + +캄 +캄 +캄 +캄 +캄 + +캅 +캅 +캅 +캅 +캅 + +캆 +캆 +캆 +캆 +캆 + +캇 +캇 +캇 +캇 +캇 + +캈 +캈 +캈 +캈 +캈 + +캉 +캉 +캉 +캉 +캉 + +캊 +캊 +캊 +캊 +캊 + +캋 +캋 +캋 +캋 +캋 + +캌 +캌 +캌 +캌 +캌 + +캍 +캍 +캍 +캍 +캍 + +캎 +캎 +캎 +캎 +캎 + +캏 +캏 +캏 +캏 +캏 + +캐 +캐 +캐 +캐 +캐 + +캑 +캑 +캑 +캑 +캑 + +캒 +캒 +캒 +캒 +캒 + +캓 +캓 +캓 +캓 +캓 + +캔 +캔 +캔 +캔 +캔 + +캕 +캕 +캕 +캕 +캕 + +캖 +캖 +캖 +캖 +캖 + +캗 +캗 +캗 +캗 +캗 + +캘 +캘 +캘 +캘 +캘 + +캙 +캙 +캙 +캙 +캙 + +캚 +캚 +캚 +캚 +캚 + +캛 +캛 +캛 +캛 +캛 + +캜 +캜 +캜 +캜 +캜 + +캝 +캝 +캝 +캝 +캝 + +캞 +캞 +캞 +캞 +캞 + +캟 +캟 +캟 +캟 +캟 + +캠 +캠 +캠 +캠 +캠 + +캡 +캡 +캡 +캡 +캡 + +캢 +캢 +캢 +캢 +캢 + +캣 +캣 +캣 +캣 +캣 + +캤 +캤 +캤 +캤 +캤 + +캥 +캥 +캥 +캥 +캥 + +캦 +캦 +캦 +캦 +캦 + +캧 +캧 +캧 +캧 +캧 + +캨 +캨 +캨 +캨 +캨 + +캩 +캩 +캩 +캩 +캩 + +캪 +캪 +캪 +캪 +캪 + +캫 +캫 +캫 +캫 +캫 + +캬 +캬 +캬 +캬 +캬 + +캭 +캭 +캭 +캭 +캭 + +캮 +캮 +캮 +캮 +캮 + +캯 +캯 +캯 +캯 +캯 + +캰 +캰 +캰 +캰 +캰 + +캱 +캱 +캱 +캱 +캱 + +캲 +캲 +캲 +캲 +캲 + +캳 +캳 +캳 +캳 +캳 + +캴 +캴 +캴 +캴 +캴 + +캵 +캵 +캵 +캵 +캵 + +캶 +캶 +캶 +캶 +캶 + +캷 +캷 +캷 +캷 +캷 + +캸 +캸 +캸 +캸 +캸 + +캹 +캹 +캹 +캹 +캹 + +캺 +캺 +캺 +캺 +캺 + +캻 +캻 +캻 +캻 +캻 + +캼 +캼 +캼 +캼 +캼 + +캽 +캽 +캽 +캽 +캽 + +캾 +캾 +캾 +캾 +캾 + +캿 +캿 +캿 +캿 +캿 + +컀 +컀 +컀 +컀 +컀 + +컁 +컁 +컁 +컁 +컁 + +컂 +컂 +컂 +컂 +컂 + +컃 +컃 +컃 +컃 +컃 + +컄 +컄 +컄 +컄 +컄 + +컅 +컅 +컅 +컅 +컅 + +컆 +컆 +컆 +컆 +컆 + +컇 +컇 +컇 +컇 +컇 + +컈 +컈 +컈 +컈 +컈 + +컉 +컉 +컉 +컉 +컉 + +컊 +컊 +컊 +컊 +컊 + +컋 +컋 +컋 +컋 +컋 + +컌 +컌 +컌 +컌 +컌 + +컍 +컍 +컍 +컍 +컍 + +컎 +컎 +컎 +컎 +컎 + +컏 +컏 +컏 +컏 +컏 + +컐 +컐 +컐 +컐 +컐 + +컑 +컑 +컑 +컑 +컑 + +컒 +컒 +컒 +컒 +컒 + +컓 +컓 +컓 +컓 +컓 + +컔 +컔 +컔 +컔 +컔 + +컕 +컕 +컕 +컕 +컕 + +컖 +컖 +컖 +컖 +컖 + +컗 +컗 +컗 +컗 +컗 + +컘 +컘 +컘 +컘 +컘 + +컙 +컙 +컙 +컙 +컙 + +컚 +컚 +컚 +컚 +컚 + +컛 +컛 +컛 +컛 +컛 + +컜 +컜 +컜 +컜 +컜 + +컝 +컝 +컝 +컝 +컝 + +컞 +컞 +컞 +컞 +컞 + +컟 +컟 +컟 +컟 +컟 + +컠 +컠 +컠 +컠 +컠 + +컡 +컡 +컡 +컡 +컡 + +컢 +컢 +컢 +컢 +컢 + +컣 +컣 +컣 +컣 +컣 + +커 +커 +커 +커 +커 + +컥 +컥 +컥 +컥 +컥 + +컦 +컦 +컦 +컦 +컦 + +컧 +컧 +컧 +컧 +컧 + +컨 +컨 +컨 +컨 +컨 + +컩 +컩 +컩 +컩 +컩 + +컪 +컪 +컪 +컪 +컪 + +컫 +컫 +컫 +컫 +컫 + +컬 +컬 +컬 +컬 +컬 + +컭 +컭 +컭 +컭 +컭 + +컮 +컮 +컮 +컮 +컮 + +컯 +컯 +컯 +컯 +컯 + +컰 +컰 +컰 +컰 +컰 + +컱 +컱 +컱 +컱 +컱 + +컲 +컲 +컲 +컲 +컲 + +컳 +컳 +컳 +컳 +컳 + +컴 +컴 +컴 +컴 +컴 + +컵 +컵 +컵 +컵 +컵 + +컶 +컶 +컶 +컶 +컶 + +컷 +컷 +컷 +컷 +컷 + +컸 +컸 +컸 +컸 +컸 + +컹 +컹 +컹 +컹 +컹 + +컺 +컺 +컺 +컺 +컺 + +컻 +컻 +컻 +컻 +컻 + +컼 +컼 +컼 +컼 +컼 + +컽 +컽 +컽 +컽 +컽 + +컾 +컾 +컾 +컾 +컾 + +컿 +컿 +컿 +컿 +컿 + +케 +케 +케 +케 +케 + +켁 +켁 +켁 +켁 +켁 + +켂 +켂 +켂 +켂 +켂 + +켃 +켃 +켃 +켃 +켃 + +켄 +켄 +켄 +켄 +켄 + +켅 +켅 +켅 +켅 +켅 + +켆 +켆 +켆 +켆 +켆 + +켇 +켇 +켇 +켇 +켇 + +켈 +켈 +켈 +켈 +켈 + +켉 +켉 +켉 +켉 +켉 + +켊 +켊 +켊 +켊 +켊 + +켋 +켋 +켋 +켋 +켋 + +켌 +켌 +켌 +켌 +켌 + +켍 +켍 +켍 +켍 +켍 + +켎 +켎 +켎 +켎 +켎 + +켏 +켏 +켏 +켏 +켏 + +켐 +켐 +켐 +켐 +켐 + +켑 +켑 +켑 +켑 +켑 + +켒 +켒 +켒 +켒 +켒 + +켓 +켓 +켓 +켓 +켓 + +켔 +켔 +켔 +켔 +켔 + +켕 +켕 +켕 +켕 +켕 + +켖 +켖 +켖 +켖 +켖 + +켗 +켗 +켗 +켗 +켗 + +켘 +켘 +켘 +켘 +켘 + +켙 +켙 +켙 +켙 +켙 + +켚 +켚 +켚 +켚 +켚 + +켛 +켛 +켛 +켛 +켛 + +켜 +켜 +켜 +켜 +켜 + +켝 +켝 +켝 +켝 +켝 + +켞 +켞 +켞 +켞 +켞 + +켟 +켟 +켟 +켟 +켟 + +켠 +켠 +켠 +켠 +켠 + +켡 +켡 +켡 +켡 +켡 + +켢 +켢 +켢 +켢 +켢 + +켣 +켣 +켣 +켣 +켣 + +켤 +켤 +켤 +켤 +켤 + +켥 +켥 +켥 +켥 +켥 + +켦 +켦 +켦 +켦 +켦 + +켧 +켧 +켧 +켧 +켧 + +켨 +켨 +켨 +켨 +켨 + +켩 +켩 +켩 +켩 +켩 + +켪 +켪 +켪 +켪 +켪 + +켫 +켫 +켫 +켫 +켫 + +켬 +켬 +켬 +켬 +켬 + +켭 +켭 +켭 +켭 +켭 + +켮 +켮 +켮 +켮 +켮 + +켯 +켯 +켯 +켯 +켯 + +켰 +켰 +켰 +켰 +켰 + +켱 +켱 +켱 +켱 +켱 + +켲 +켲 +켲 +켲 +켲 + +켳 +켳 +켳 +켳 +켳 + +켴 +켴 +켴 +켴 +켴 + +켵 +켵 +켵 +켵 +켵 + +켶 +켶 +켶 +켶 +켶 + +켷 +켷 +켷 +켷 +켷 + +켸 +켸 +켸 +켸 +켸 + +켹 +켹 +켹 +켹 +켹 + +켺 +켺 +켺 +켺 +켺 + +켻 +켻 +켻 +켻 +켻 + +켼 +켼 +켼 +켼 +켼 + +켽 +켽 +켽 +켽 +켽 + +켾 +켾 +켾 +켾 +켾 + +켿 +켿 +켿 +켿 +켿 + +콀 +콀 +콀 +콀 +콀 + +콁 +콁 +콁 +콁 +콁 + +콂 +콂 +콂 +콂 +콂 + +콃 +콃 +콃 +콃 +콃 + +콄 +콄 +콄 +콄 +콄 + +콅 +콅 +콅 +콅 +콅 + +콆 +콆 +콆 +콆 +콆 + +콇 +콇 +콇 +콇 +콇 + +콈 +콈 +콈 +콈 +콈 + +콉 +콉 +콉 +콉 +콉 + +콊 +콊 +콊 +콊 +콊 + +콋 +콋 +콋 +콋 +콋 + +콌 +콌 +콌 +콌 +콌 + +콍 +콍 +콍 +콍 +콍 + +콎 +콎 +콎 +콎 +콎 + +콏 +콏 +콏 +콏 +콏 + +콐 +콐 +콐 +콐 +콐 + +콑 +콑 +콑 +콑 +콑 + +콒 +콒 +콒 +콒 +콒 + +콓 +콓 +콓 +콓 +콓 + +코 +코 +코 +코 +코 + +콕 +콕 +콕 +콕 +콕 + +콖 +콖 +콖 +콖 +콖 + +콗 +콗 +콗 +콗 +콗 + +콘 +콘 +콘 +콘 +콘 + +콙 +콙 +콙 +콙 +콙 + +콚 +콚 +콚 +콚 +콚 + +콛 +콛 +콛 +콛 +콛 + +콜 +콜 +콜 +콜 +콜 + +콝 +콝 +콝 +콝 +콝 + +콞 +콞 +콞 +콞 +콞 + +콟 +콟 +콟 +콟 +콟 + +콠 +콠 +콠 +콠 +콠 + +콡 +콡 +콡 +콡 +콡 + +콢 +콢 +콢 +콢 +콢 + +콣 +콣 +콣 +콣 +콣 + +콤 +콤 +콤 +콤 +콤 + +콥 +콥 +콥 +콥 +콥 + +콦 +콦 +콦 +콦 +콦 + +콧 +콧 +콧 +콧 +콧 + +콨 +콨 +콨 +콨 +콨 + +콩 +콩 +콩 +콩 +콩 + +콪 +콪 +콪 +콪 +콪 + +콫 +콫 +콫 +콫 +콫 + +콬 +콬 +콬 +콬 +콬 + +콭 +콭 +콭 +콭 +콭 + +콮 +콮 +콮 +콮 +콮 + +콯 +콯 +콯 +콯 +콯 + +콰 +콰 +콰 +콰 +콰 + +콱 +콱 +콱 +콱 +콱 + +콲 +콲 +콲 +콲 +콲 + +콳 +콳 +콳 +콳 +콳 + +콴 +콴 +콴 +콴 +콴 + +콵 +콵 +콵 +콵 +콵 + +콶 +콶 +콶 +콶 +콶 + +콷 +콷 +콷 +콷 +콷 + +콸 +콸 +콸 +콸 +콸 + +콹 +콹 +콹 +콹 +콹 + +콺 +콺 +콺 +콺 +콺 + +콻 +콻 +콻 +콻 +콻 + +콼 +콼 +콼 +콼 +콼 + +콽 +콽 +콽 +콽 +콽 + +콾 +콾 +콾 +콾 +콾 + +콿 +콿 +콿 +콿 +콿 + +쾀 +쾀 +쾀 +쾀 +쾀 + +쾁 +쾁 +쾁 +쾁 +쾁 + +쾂 +쾂 +쾂 +쾂 +쾂 + +쾃 +쾃 +쾃 +쾃 +쾃 + +쾄 +쾄 +쾄 +쾄 +쾄 + +쾅 +쾅 +쾅 +쾅 +쾅 + +쾆 +쾆 +쾆 +쾆 +쾆 + +쾇 +쾇 +쾇 +쾇 +쾇 + +쾈 +쾈 +쾈 +쾈 +쾈 + +쾉 +쾉 +쾉 +쾉 +쾉 + +쾊 +쾊 +쾊 +쾊 +쾊 + +쾋 +쾋 +쾋 +쾋 +쾋 + +쾌 +쾌 +쾌 +쾌 +쾌 + +쾍 +쾍 +쾍 +쾍 +쾍 + +쾎 +쾎 +쾎 +쾎 +쾎 + +쾏 +쾏 +쾏 +쾏 +쾏 + +쾐 +쾐 +쾐 +쾐 +쾐 + +쾑 +쾑 +쾑 +쾑 +쾑 + +쾒 +쾒 +쾒 +쾒 +쾒 + +쾓 +쾓 +쾓 +쾓 +쾓 + +쾔 +쾔 +쾔 +쾔 +쾔 + +쾕 +쾕 +쾕 +쾕 +쾕 + +쾖 +쾖 +쾖 +쾖 +쾖 + +쾗 +쾗 +쾗 +쾗 +쾗 + +쾘 +쾘 +쾘 +쾘 +쾘 + +쾙 +쾙 +쾙 +쾙 +쾙 + +쾚 +쾚 +쾚 +쾚 +쾚 + +쾛 +쾛 +쾛 +쾛 +쾛 + +쾜 +쾜 +쾜 +쾜 +쾜 + +쾝 +쾝 +쾝 +쾝 +쾝 + +쾞 +쾞 +쾞 +쾞 +쾞 + +쾟 +쾟 +쾟 +쾟 +쾟 + +쾠 +쾠 +쾠 +쾠 +쾠 + +쾡 +쾡 +쾡 +쾡 +쾡 + +쾢 +쾢 +쾢 +쾢 +쾢 + +쾣 +쾣 +쾣 +쾣 +쾣 + +쾤 +쾤 +쾤 +쾤 +쾤 + +쾥 +쾥 +쾥 +쾥 +쾥 + +쾦 +쾦 +쾦 +쾦 +쾦 + +쾧 +쾧 +쾧 +쾧 +쾧 + +쾨 +쾨 +쾨 +쾨 +쾨 + +쾩 +쾩 +쾩 +쾩 +쾩 + +쾪 +쾪 +쾪 +쾪 +쾪 + +쾫 +쾫 +쾫 +쾫 +쾫 + +쾬 +쾬 +쾬 +쾬 +쾬 + +쾭 +쾭 +쾭 +쾭 +쾭 + +쾮 +쾮 +쾮 +쾮 +쾮 + +쾯 +쾯 +쾯 +쾯 +쾯 + +쾰 +쾰 +쾰 +쾰 +쾰 + +쾱 +쾱 +쾱 +쾱 +쾱 + +쾲 +쾲 +쾲 +쾲 +쾲 + +쾳 +쾳 +쾳 +쾳 +쾳 + +쾴 +쾴 +쾴 +쾴 +쾴 + +쾵 +쾵 +쾵 +쾵 +쾵 + +쾶 +쾶 +쾶 +쾶 +쾶 + +쾷 +쾷 +쾷 +쾷 +쾷 + +쾸 +쾸 +쾸 +쾸 +쾸 + +쾹 +쾹 +쾹 +쾹 +쾹 + +쾺 +쾺 +쾺 +쾺 +쾺 + +쾻 +쾻 +쾻 +쾻 +쾻 + +쾼 +쾼 +쾼 +쾼 +쾼 + +쾽 +쾽 +쾽 +쾽 +쾽 + +쾾 +쾾 +쾾 +쾾 +쾾 + +쾿 +쾿 +쾿 +쾿 +쾿 + +쿀 +쿀 +쿀 +쿀 +쿀 + +쿁 +쿁 +쿁 +쿁 +쿁 + +쿂 +쿂 +쿂 +쿂 +쿂 + +쿃 +쿃 +쿃 +쿃 +쿃 + +쿄 +쿄 +쿄 +쿄 +쿄 + +쿅 +쿅 +쿅 +쿅 +쿅 + +쿆 +쿆 +쿆 +쿆 +쿆 + +쿇 +쿇 +쿇 +쿇 +쿇 + +쿈 +쿈 +쿈 +쿈 +쿈 + +쿉 +쿉 +쿉 +쿉 +쿉 + +쿊 +쿊 +쿊 +쿊 +쿊 + +쿋 +쿋 +쿋 +쿋 +쿋 + +쿌 +쿌 +쿌 +쿌 +쿌 + +쿍 +쿍 +쿍 +쿍 +쿍 + +쿎 +쿎 +쿎 +쿎 +쿎 + +쿏 +쿏 +쿏 +쿏 +쿏 + +쿐 +쿐 +쿐 +쿐 +쿐 + +쿑 +쿑 +쿑 +쿑 +쿑 + +쿒 +쿒 +쿒 +쿒 +쿒 + +쿓 +쿓 +쿓 +쿓 +쿓 + +쿔 +쿔 +쿔 +쿔 +쿔 + +쿕 +쿕 +쿕 +쿕 +쿕 + +쿖 +쿖 +쿖 +쿖 +쿖 + +쿗 +쿗 +쿗 +쿗 +쿗 + +쿘 +쿘 +쿘 +쿘 +쿘 + +쿙 +쿙 +쿙 +쿙 +쿙 + +쿚 +쿚 +쿚 +쿚 +쿚 + +쿛 +쿛 +쿛 +쿛 +쿛 + +쿜 +쿜 +쿜 +쿜 +쿜 + +쿝 +쿝 +쿝 +쿝 +쿝 + +쿞 +쿞 +쿞 +쿞 +쿞 + +쿟 +쿟 +쿟 +쿟 +쿟 + +쿠 +쿠 +쿠 +쿠 +쿠 + +쿡 +쿡 +쿡 +쿡 +쿡 + +쿢 +쿢 +쿢 +쿢 +쿢 + +쿣 +쿣 +쿣 +쿣 +쿣 + +쿤 +쿤 +쿤 +쿤 +쿤 + +쿥 +쿥 +쿥 +쿥 +쿥 + +쿦 +쿦 +쿦 +쿦 +쿦 + +쿧 +쿧 +쿧 +쿧 +쿧 + +쿨 +쿨 +쿨 +쿨 +쿨 + +쿩 +쿩 +쿩 +쿩 +쿩 + +쿪 +쿪 +쿪 +쿪 +쿪 + +쿫 +쿫 +쿫 +쿫 +쿫 + +쿬 +쿬 +쿬 +쿬 +쿬 + +쿭 +쿭 +쿭 +쿭 +쿭 + +쿮 +쿮 +쿮 +쿮 +쿮 + +쿯 +쿯 +쿯 +쿯 +쿯 + +쿰 +쿰 +쿰 +쿰 +쿰 + +쿱 +쿱 +쿱 +쿱 +쿱 + +쿲 +쿲 +쿲 +쿲 +쿲 + +쿳 +쿳 +쿳 +쿳 +쿳 + +쿴 +쿴 +쿴 +쿴 +쿴 + +쿵 +쿵 +쿵 +쿵 +쿵 + +쿶 +쿶 +쿶 +쿶 +쿶 + +쿷 +쿷 +쿷 +쿷 +쿷 + +쿸 +쿸 +쿸 +쿸 +쿸 + +쿹 +쿹 +쿹 +쿹 +쿹 + +쿺 +쿺 +쿺 +쿺 +쿺 + +쿻 +쿻 +쿻 +쿻 +쿻 + +쿼 +쿼 +쿼 +쿼 +쿼 + +쿽 +쿽 +쿽 +쿽 +쿽 + +쿾 +쿾 +쿾 +쿾 +쿾 + +쿿 +쿿 +쿿 +쿿 +쿿 + +퀀 +퀀 +퀀 +퀀 +퀀 + +퀁 +퀁 +퀁 +퀁 +퀁 + +퀂 +퀂 +퀂 +퀂 +퀂 + +퀃 +퀃 +퀃 +퀃 +퀃 + +퀄 +퀄 +퀄 +퀄 +퀄 + +퀅 +퀅 +퀅 +퀅 +퀅 + +퀆 +퀆 +퀆 +퀆 +퀆 + +퀇 +퀇 +퀇 +퀇 +퀇 + +퀈 +퀈 +퀈 +퀈 +퀈 + +퀉 +퀉 +퀉 +퀉 +퀉 + +퀊 +퀊 +퀊 +퀊 +퀊 + +퀋 +퀋 +퀋 +퀋 +퀋 + +퀌 +퀌 +퀌 +퀌 +퀌 + +퀍 +퀍 +퀍 +퀍 +퀍 + +퀎 +퀎 +퀎 +퀎 +퀎 + +퀏 +퀏 +퀏 +퀏 +퀏 + +퀐 +퀐 +퀐 +퀐 +퀐 + +퀑 +퀑 +퀑 +퀑 +퀑 + +퀒 +퀒 +퀒 +퀒 +퀒 + +퀓 +퀓 +퀓 +퀓 +퀓 + +퀔 +퀔 +퀔 +퀔 +퀔 + +퀕 +퀕 +퀕 +퀕 +퀕 + +퀖 +퀖 +퀖 +퀖 +퀖 + +퀗 +퀗 +퀗 +퀗 +퀗 + +퀘 +퀘 +퀘 +퀘 +퀘 + +퀙 +퀙 +퀙 +퀙 +퀙 + +퀚 +퀚 +퀚 +퀚 +퀚 + +퀛 +퀛 +퀛 +퀛 +퀛 + +퀜 +퀜 +퀜 +퀜 +퀜 + +퀝 +퀝 +퀝 +퀝 +퀝 + +퀞 +퀞 +퀞 +퀞 +퀞 + +퀟 +퀟 +퀟 +퀟 +퀟 + +퀠 +퀠 +퀠 +퀠 +퀠 + +퀡 +퀡 +퀡 +퀡 +퀡 + +퀢 +퀢 +퀢 +퀢 +퀢 + +퀣 +퀣 +퀣 +퀣 +퀣 + +퀤 +퀤 +퀤 +퀤 +퀤 + +퀥 +퀥 +퀥 +퀥 +퀥 + +퀦 +퀦 +퀦 +퀦 +퀦 + +퀧 +퀧 +퀧 +퀧 +퀧 + +퀨 +퀨 +퀨 +퀨 +퀨 + +퀩 +퀩 +퀩 +퀩 +퀩 + +퀪 +퀪 +퀪 +퀪 +퀪 + +퀫 +퀫 +퀫 +퀫 +퀫 + +퀬 +퀬 +퀬 +퀬 +퀬 + +퀭 +퀭 +퀭 +퀭 +퀭 + +퀮 +퀮 +퀮 +퀮 +퀮 + +퀯 +퀯 +퀯 +퀯 +퀯 + +퀰 +퀰 +퀰 +퀰 +퀰 + +퀱 +퀱 +퀱 +퀱 +퀱 + +퀲 +퀲 +퀲 +퀲 +퀲 + +퀳 +퀳 +퀳 +퀳 +퀳 + +퀴 +퀴 +퀴 +퀴 +퀴 + +퀵 +퀵 +퀵 +퀵 +퀵 + +퀶 +퀶 +퀶 +퀶 +퀶 + +퀷 +퀷 +퀷 +퀷 +퀷 + +퀸 +퀸 +퀸 +퀸 +퀸 + +퀹 +퀹 +퀹 +퀹 +퀹 + +퀺 +퀺 +퀺 +퀺 +퀺 + +퀻 +퀻 +퀻 +퀻 +퀻 + +퀼 +퀼 +퀼 +퀼 +퀼 + +퀽 +퀽 +퀽 +퀽 +퀽 + +퀾 +퀾 +퀾 +퀾 +퀾 + +퀿 +퀿 +퀿 +퀿 +퀿 + +큀 +큀 +큀 +큀 +큀 + +큁 +큁 +큁 +큁 +큁 + +큂 +큂 +큂 +큂 +큂 + +큃 +큃 +큃 +큃 +큃 + +큄 +큄 +큄 +큄 +큄 + +큅 +큅 +큅 +큅 +큅 + +큆 +큆 +큆 +큆 +큆 + +큇 +큇 +큇 +큇 +큇 + +큈 +큈 +큈 +큈 +큈 + +큉 +큉 +큉 +큉 +큉 + +큊 +큊 +큊 +큊 +큊 + +큋 +큋 +큋 +큋 +큋 + +큌 +큌 +큌 +큌 +큌 + +큍 +큍 +큍 +큍 +큍 + +큎 +큎 +큎 +큎 +큎 + +큏 +큏 +큏 +큏 +큏 + +큐 +큐 +큐 +큐 +큐 + +큑 +큑 +큑 +큑 +큑 + +큒 +큒 +큒 +큒 +큒 + +큓 +큓 +큓 +큓 +큓 + +큔 +큔 +큔 +큔 +큔 + +큕 +큕 +큕 +큕 +큕 + +큖 +큖 +큖 +큖 +큖 + +큗 +큗 +큗 +큗 +큗 + +큘 +큘 +큘 +큘 +큘 + +큙 +큙 +큙 +큙 +큙 + +큚 +큚 +큚 +큚 +큚 + +큛 +큛 +큛 +큛 +큛 + +큜 +큜 +큜 +큜 +큜 + +큝 +큝 +큝 +큝 +큝 + +큞 +큞 +큞 +큞 +큞 + +큟 +큟 +큟 +큟 +큟 + +큠 +큠 +큠 +큠 +큠 + +큡 +큡 +큡 +큡 +큡 + +큢 +큢 +큢 +큢 +큢 + +큣 +큣 +큣 +큣 +큣 + +큤 +큤 +큤 +큤 +큤 + +큥 +큥 +큥 +큥 +큥 + +큦 +큦 +큦 +큦 +큦 + +큧 +큧 +큧 +큧 +큧 + +큨 +큨 +큨 +큨 +큨 + +큩 +큩 +큩 +큩 +큩 + +큪 +큪 +큪 +큪 +큪 + +큫 +큫 +큫 +큫 +큫 + +크 +크 +크 +크 +크 + +큭 +큭 +큭 +큭 +큭 + +큮 +큮 +큮 +큮 +큮 + +큯 +큯 +큯 +큯 +큯 + +큰 +큰 +큰 +큰 +큰 + +큱 +큱 +큱 +큱 +큱 + +큲 +큲 +큲 +큲 +큲 + +큳 +큳 +큳 +큳 +큳 + +클 +클 +클 +클 +클 + +큵 +큵 +큵 +큵 +큵 + +큶 +큶 +큶 +큶 +큶 + +큷 +큷 +큷 +큷 +큷 + +큸 +큸 +큸 +큸 +큸 + +큹 +큹 +큹 +큹 +큹 + +큺 +큺 +큺 +큺 +큺 + +큻 +큻 +큻 +큻 +큻 + +큼 +큼 +큼 +큼 +큼 + +큽 +큽 +큽 +큽 +큽 + +큾 +큾 +큾 +큾 +큾 + +큿 +큿 +큿 +큿 +큿 + +킀 +킀 +킀 +킀 +킀 + +킁 +킁 +킁 +킁 +킁 + +킂 +킂 +킂 +킂 +킂 + +킃 +킃 +킃 +킃 +킃 + +킄 +킄 +킄 +킄 +킄 + +킅 +킅 +킅 +킅 +킅 + +킆 +킆 +킆 +킆 +킆 + +킇 +킇 +킇 +킇 +킇 + +킈 +킈 +킈 +킈 +킈 + +킉 +킉 +킉 +킉 +킉 + +킊 +킊 +킊 +킊 +킊 + +킋 +킋 +킋 +킋 +킋 + +킌 +킌 +킌 +킌 +킌 + +킍 +킍 +킍 +킍 +킍 + +킎 +킎 +킎 +킎 +킎 + +킏 +킏 +킏 +킏 +킏 + +킐 +킐 +킐 +킐 +킐 + +킑 +킑 +킑 +킑 +킑 + +킒 +킒 +킒 +킒 +킒 + +킓 +킓 +킓 +킓 +킓 + +킔 +킔 +킔 +킔 +킔 + +킕 +킕 +킕 +킕 +킕 + +킖 +킖 +킖 +킖 +킖 + +킗 +킗 +킗 +킗 +킗 + +킘 +킘 +킘 +킘 +킘 + +킙 +킙 +킙 +킙 +킙 + +킚 +킚 +킚 +킚 +킚 + +킛 +킛 +킛 +킛 +킛 + +킜 +킜 +킜 +킜 +킜 + +킝 +킝 +킝 +킝 +킝 + +킞 +킞 +킞 +킞 +킞 + +킟 +킟 +킟 +킟 +킟 + +킠 +킠 +킠 +킠 +킠 + +킡 +킡 +킡 +킡 +킡 + +킢 +킢 +킢 +킢 +킢 + +킣 +킣 +킣 +킣 +킣 + +키 +키 +키 +키 +키 + +킥 +킥 +킥 +킥 +킥 + +킦 +킦 +킦 +킦 +킦 + +킧 +킧 +킧 +킧 +킧 + +킨 +킨 +킨 +킨 +킨 + +킩 +킩 +킩 +킩 +킩 + +킪 +킪 +킪 +킪 +킪 + +킫 +킫 +킫 +킫 +킫 + +킬 +킬 +킬 +킬 +킬 + +킭 +킭 +킭 +킭 +킭 + +킮 +킮 +킮 +킮 +킮 + +킯 +킯 +킯 +킯 +킯 + +킰 +킰 +킰 +킰 +킰 + +킱 +킱 +킱 +킱 +킱 + +킲 +킲 +킲 +킲 +킲 + +킳 +킳 +킳 +킳 +킳 + +킴 +킴 +킴 +킴 +킴 + +킵 +킵 +킵 +킵 +킵 + +킶 +킶 +킶 +킶 +킶 + +킷 +킷 +킷 +킷 +킷 + +킸 +킸 +킸 +킸 +킸 + +킹 +킹 +킹 +킹 +킹 + +킺 +킺 +킺 +킺 +킺 + +킻 +킻 +킻 +킻 +킻 + +킼 +킼 +킼 +킼 +킼 + +킽 +킽 +킽 +킽 +킽 + +킾 +킾 +킾 +킾 +킾 + +킿 +킿 +킿 +킿 +킿 + +타 +타 +타 +타 +타 + +탁 +탁 +탁 +탁 +탁 + +탂 +탂 +탂 +탂 +탂 + +탃 +탃 +탃 +탃 +탃 + +탄 +탄 +탄 +탄 +탄 + +탅 +탅 +탅 +탅 +탅 + +탆 +탆 +탆 +탆 +탆 + +탇 +탇 +탇 +탇 +탇 + +탈 +탈 +탈 +탈 +탈 + +탉 +탉 +탉 +탉 +탉 + +탊 +탊 +탊 +탊 +탊 + +탋 +탋 +탋 +탋 +탋 + +탌 +탌 +탌 +탌 +탌 + +탍 +탍 +탍 +탍 +탍 + +탎 +탎 +탎 +탎 +탎 + +탏 +탏 +탏 +탏 +탏 + +탐 +탐 +탐 +탐 +탐 + +탑 +탑 +탑 +탑 +탑 + +탒 +탒 +탒 +탒 +탒 + +탓 +탓 +탓 +탓 +탓 + +탔 +탔 +탔 +탔 +탔 + +탕 +탕 +탕 +탕 +탕 + +탖 +탖 +탖 +탖 +탖 + +탗 +탗 +탗 +탗 +탗 + +탘 +탘 +탘 +탘 +탘 + +탙 +탙 +탙 +탙 +탙 + +탚 +탚 +탚 +탚 +탚 + +탛 +탛 +탛 +탛 +탛 + +태 +태 +태 +태 +태 + +택 +택 +택 +택 +택 + +탞 +탞 +탞 +탞 +탞 + +탟 +탟 +탟 +탟 +탟 + +탠 +탠 +탠 +탠 +탠 + +탡 +탡 +탡 +탡 +탡 + +탢 +탢 +탢 +탢 +탢 + +탣 +탣 +탣 +탣 +탣 + +탤 +탤 +탤 +탤 +탤 + +탥 +탥 +탥 +탥 +탥 + +탦 +탦 +탦 +탦 +탦 + +탧 +탧 +탧 +탧 +탧 + +탨 +탨 +탨 +탨 +탨 + +탩 +탩 +탩 +탩 +탩 + +탪 +탪 +탪 +탪 +탪 + +탫 +탫 +탫 +탫 +탫 + +탬 +탬 +탬 +탬 +탬 + +탭 +탭 +탭 +탭 +탭 + +탮 +탮 +탮 +탮 +탮 + +탯 +탯 +탯 +탯 +탯 + +탰 +탰 +탰 +탰 +탰 + +탱 +탱 +탱 +탱 +탱 + +탲 +탲 +탲 +탲 +탲 + +탳 +탳 +탳 +탳 +탳 + +탴 +탴 +탴 +탴 +탴 + +탵 +탵 +탵 +탵 +탵 + +탶 +탶 +탶 +탶 +탶 + +탷 +탷 +탷 +탷 +탷 + +탸 +탸 +탸 +탸 +탸 + +탹 +탹 +탹 +탹 +탹 + +탺 +탺 +탺 +탺 +탺 + +탻 +탻 +탻 +탻 +탻 + +탼 +탼 +탼 +탼 +탼 + +탽 +탽 +탽 +탽 +탽 + +탾 +탾 +탾 +탾 +탾 + +탿 +탿 +탿 +탿 +탿 + +턀 +턀 +턀 +턀 +턀 + +턁 +턁 +턁 +턁 +턁 + +턂 +턂 +턂 +턂 +턂 + +턃 +턃 +턃 +턃 +턃 + +턄 +턄 +턄 +턄 +턄 + +턅 +턅 +턅 +턅 +턅 + +턆 +턆 +턆 +턆 +턆 + +턇 +턇 +턇 +턇 +턇 + +턈 +턈 +턈 +턈 +턈 + +턉 +턉 +턉 +턉 +턉 + +턊 +턊 +턊 +턊 +턊 + +턋 +턋 +턋 +턋 +턋 + +턌 +턌 +턌 +턌 +턌 + +턍 +턍 +턍 +턍 +턍 + +턎 +턎 +턎 +턎 +턎 + +턏 +턏 +턏 +턏 +턏 + +턐 +턐 +턐 +턐 +턐 + +턑 +턑 +턑 +턑 +턑 + +턒 +턒 +턒 +턒 +턒 + +턓 +턓 +턓 +턓 +턓 + +턔 +턔 +턔 +턔 +턔 + +턕 +턕 +턕 +턕 +턕 + +턖 +턖 +턖 +턖 +턖 + +턗 +턗 +턗 +턗 +턗 + +턘 +턘 +턘 +턘 +턘 + +턙 +턙 +턙 +턙 +턙 + +턚 +턚 +턚 +턚 +턚 + +턛 +턛 +턛 +턛 +턛 + +턜 +턜 +턜 +턜 +턜 + +턝 +턝 +턝 +턝 +턝 + +턞 +턞 +턞 +턞 +턞 + +턟 +턟 +턟 +턟 +턟 + +턠 +턠 +턠 +턠 +턠 + +턡 +턡 +턡 +턡 +턡 + +턢 +턢 +턢 +턢 +턢 + +턣 +턣 +턣 +턣 +턣 + +턤 +턤 +턤 +턤 +턤 + +턥 +턥 +턥 +턥 +턥 + +턦 +턦 +턦 +턦 +턦 + +턧 +턧 +턧 +턧 +턧 + +턨 +턨 +턨 +턨 +턨 + +턩 +턩 +턩 +턩 +턩 + +턪 +턪 +턪 +턪 +턪 + +턫 +턫 +턫 +턫 +턫 + +턬 +턬 +턬 +턬 +턬 + +턭 +턭 +턭 +턭 +턭 + +턮 +턮 +턮 +턮 +턮 + +턯 +턯 +턯 +턯 +턯 + +터 +터 +터 +터 +터 + +턱 +턱 +턱 +턱 +턱 + +턲 +턲 +턲 +턲 +턲 + +턳 +턳 +턳 +턳 +턳 + +턴 +턴 +턴 +턴 +턴 + +턵 +턵 +턵 +턵 +턵 + +턶 +턶 +턶 +턶 +턶 + +턷 +턷 +턷 +턷 +턷 + +털 +털 +털 +털 +털 + +턹 +턹 +턹 +턹 +턹 + +턺 +턺 +턺 +턺 +턺 + +턻 +턻 +턻 +턻 +턻 + +턼 +턼 +턼 +턼 +턼 + +턽 +턽 +턽 +턽 +턽 + +턾 +턾 +턾 +턾 +턾 + +턿 +턿 +턿 +턿 +턿 + +텀 +텀 +텀 +텀 +텀 + +텁 +텁 +텁 +텁 +텁 + +텂 +텂 +텂 +텂 +텂 + +텃 +텃 +텃 +텃 +텃 + +텄 +텄 +텄 +텄 +텄 + +텅 +텅 +텅 +텅 +텅 + +텆 +텆 +텆 +텆 +텆 + +텇 +텇 +텇 +텇 +텇 + +텈 +텈 +텈 +텈 +텈 + +텉 +텉 +텉 +텉 +텉 + +텊 +텊 +텊 +텊 +텊 + +텋 +텋 +텋 +텋 +텋 + +테 +테 +테 +테 +테 + +텍 +텍 +텍 +텍 +텍 + +텎 +텎 +텎 +텎 +텎 + +텏 +텏 +텏 +텏 +텏 + +텐 +텐 +텐 +텐 +텐 + +텑 +텑 +텑 +텑 +텑 + +텒 +텒 +텒 +텒 +텒 + +텓 +텓 +텓 +텓 +텓 + +텔 +텔 +텔 +텔 +텔 + +텕 +텕 +텕 +텕 +텕 + +텖 +텖 +텖 +텖 +텖 + +텗 +텗 +텗 +텗 +텗 + +텘 +텘 +텘 +텘 +텘 + +텙 +텙 +텙 +텙 +텙 + +텚 +텚 +텚 +텚 +텚 + +텛 +텛 +텛 +텛 +텛 + +템 +템 +템 +템 +템 + +텝 +텝 +텝 +텝 +텝 + +텞 +텞 +텞 +텞 +텞 + +텟 +텟 +텟 +텟 +텟 + +텠 +텠 +텠 +텠 +텠 + +텡 +텡 +텡 +텡 +텡 + +텢 +텢 +텢 +텢 +텢 + +텣 +텣 +텣 +텣 +텣 + +텤 +텤 +텤 +텤 +텤 + +텥 +텥 +텥 +텥 +텥 + +텦 +텦 +텦 +텦 +텦 + +텧 +텧 +텧 +텧 +텧 + +텨 +텨 +텨 +텨 +텨 + +텩 +텩 +텩 +텩 +텩 + +텪 +텪 +텪 +텪 +텪 + +텫 +텫 +텫 +텫 +텫 + +텬 +텬 +텬 +텬 +텬 + +텭 +텭 +텭 +텭 +텭 + +텮 +텮 +텮 +텮 +텮 + +텯 +텯 +텯 +텯 +텯 + +텰 +텰 +텰 +텰 +텰 + +텱 +텱 +텱 +텱 +텱 + +텲 +텲 +텲 +텲 +텲 + +텳 +텳 +텳 +텳 +텳 + +텴 +텴 +텴 +텴 +텴 + +텵 +텵 +텵 +텵 +텵 + +텶 +텶 +텶 +텶 +텶 + +텷 +텷 +텷 +텷 +텷 + +텸 +텸 +텸 +텸 +텸 + +텹 +텹 +텹 +텹 +텹 + +텺 +텺 +텺 +텺 +텺 + +텻 +텻 +텻 +텻 +텻 + +텼 +텼 +텼 +텼 +텼 + +텽 +텽 +텽 +텽 +텽 + +텾 +텾 +텾 +텾 +텾 + +텿 +텿 +텿 +텿 +텿 + +톀 +톀 +톀 +톀 +톀 + +톁 +톁 +톁 +톁 +톁 + +톂 +톂 +톂 +톂 +톂 + +톃 +톃 +톃 +톃 +톃 + +톄 +톄 +톄 +톄 +톄 + +톅 +톅 +톅 +톅 +톅 + +톆 +톆 +톆 +톆 +톆 + +톇 +톇 +톇 +톇 +톇 + +톈 +톈 +톈 +톈 +톈 + +톉 +톉 +톉 +톉 +톉 + +톊 +톊 +톊 +톊 +톊 + +톋 +톋 +톋 +톋 +톋 + +톌 +톌 +톌 +톌 +톌 + +톍 +톍 +톍 +톍 +톍 + +톎 +톎 +톎 +톎 +톎 + +톏 +톏 +톏 +톏 +톏 + +톐 +톐 +톐 +톐 +톐 + +톑 +톑 +톑 +톑 +톑 + +톒 +톒 +톒 +톒 +톒 + +톓 +톓 +톓 +톓 +톓 + +톔 +톔 +톔 +톔 +톔 + +톕 +톕 +톕 +톕 +톕 + +톖 +톖 +톖 +톖 +톖 + +톗 +톗 +톗 +톗 +톗 + +톘 +톘 +톘 +톘 +톘 + +톙 +톙 +톙 +톙 +톙 + +톚 +톚 +톚 +톚 +톚 + +톛 +톛 +톛 +톛 +톛 + +톜 +톜 +톜 +톜 +톜 + +톝 +톝 +톝 +톝 +톝 + +톞 +톞 +톞 +톞 +톞 + +톟 +톟 +톟 +톟 +톟 + +토 +토 +토 +토 +토 + +톡 +톡 +톡 +톡 +톡 + +톢 +톢 +톢 +톢 +톢 + +톣 +톣 +톣 +톣 +톣 + +톤 +톤 +톤 +톤 +톤 + +톥 +톥 +톥 +톥 +톥 + +톦 +톦 +톦 +톦 +톦 + +톧 +톧 +톧 +톧 +톧 + +톨 +톨 +톨 +톨 +톨 + +톩 +톩 +톩 +톩 +톩 + +톪 +톪 +톪 +톪 +톪 + +톫 +톫 +톫 +톫 +톫 + +톬 +톬 +톬 +톬 +톬 + +톭 +톭 +톭 +톭 +톭 + +톮 +톮 +톮 +톮 +톮 + +톯 +톯 +톯 +톯 +톯 + +톰 +톰 +톰 +톰 +톰 + +톱 +톱 +톱 +톱 +톱 + +톲 +톲 +톲 +톲 +톲 + +톳 +톳 +톳 +톳 +톳 + +톴 +톴 +톴 +톴 +톴 + +통 +통 +통 +통 +통 + +톶 +톶 +톶 +톶 +톶 + +톷 +톷 +톷 +톷 +톷 + +톸 +톸 +톸 +톸 +톸 + +톹 +톹 +톹 +톹 +톹 + +톺 +톺 +톺 +톺 +톺 + +톻 +톻 +톻 +톻 +톻 + +톼 +톼 +톼 +톼 +톼 + +톽 +톽 +톽 +톽 +톽 + +톾 +톾 +톾 +톾 +톾 + +톿 +톿 +톿 +톿 +톿 + +퇀 +퇀 +퇀 +퇀 +퇀 + +퇁 +퇁 +퇁 +퇁 +퇁 + +퇂 +퇂 +퇂 +퇂 +퇂 + +퇃 +퇃 +퇃 +퇃 +퇃 + +퇄 +퇄 +퇄 +퇄 +퇄 + +퇅 +퇅 +퇅 +퇅 +퇅 + +퇆 +퇆 +퇆 +퇆 +퇆 + +퇇 +퇇 +퇇 +퇇 +퇇 + +퇈 +퇈 +퇈 +퇈 +퇈 + +퇉 +퇉 +퇉 +퇉 +퇉 + +퇊 +퇊 +퇊 +퇊 +퇊 + +퇋 +퇋 +퇋 +퇋 +퇋 + +퇌 +퇌 +퇌 +퇌 +퇌 + +퇍 +퇍 +퇍 +퇍 +퇍 + +퇎 +퇎 +퇎 +퇎 +퇎 + +퇏 +퇏 +퇏 +퇏 +퇏 + +퇐 +퇐 +퇐 +퇐 +퇐 + +퇑 +퇑 +퇑 +퇑 +퇑 + +퇒 +퇒 +퇒 +퇒 +퇒 + +퇓 +퇓 +퇓 +퇓 +퇓 + +퇔 +퇔 +퇔 +퇔 +퇔 + +퇕 +퇕 +퇕 +퇕 +퇕 + +퇖 +퇖 +퇖 +퇖 +퇖 + +퇗 +퇗 +퇗 +퇗 +퇗 + +퇘 +퇘 +퇘 +퇘 +퇘 + +퇙 +퇙 +퇙 +퇙 +퇙 + +퇚 +퇚 +퇚 +퇚 +퇚 + +퇛 +퇛 +퇛 +퇛 +퇛 + +퇜 +퇜 +퇜 +퇜 +퇜 + +퇝 +퇝 +퇝 +퇝 +퇝 + +퇞 +퇞 +퇞 +퇞 +퇞 + +퇟 +퇟 +퇟 +퇟 +퇟 + +퇠 +퇠 +퇠 +퇠 +퇠 + +퇡 +퇡 +퇡 +퇡 +퇡 + +퇢 +퇢 +퇢 +퇢 +퇢 + +퇣 +퇣 +퇣 +퇣 +퇣 + +퇤 +퇤 +퇤 +퇤 +퇤 + +퇥 +퇥 +퇥 +퇥 +퇥 + +퇦 +퇦 +퇦 +퇦 +퇦 + +퇧 +퇧 +퇧 +퇧 +퇧 + +퇨 +퇨 +퇨 +퇨 +퇨 + +퇩 +퇩 +퇩 +퇩 +퇩 + +퇪 +퇪 +퇪 +퇪 +퇪 + +퇫 +퇫 +퇫 +퇫 +퇫 + +퇬 +퇬 +퇬 +퇬 +퇬 + +퇭 +퇭 +퇭 +퇭 +퇭 + +퇮 +퇮 +퇮 +퇮 +퇮 + +퇯 +퇯 +퇯 +퇯 +퇯 + +퇰 +퇰 +퇰 +퇰 +퇰 + +퇱 +퇱 +퇱 +퇱 +퇱 + +퇲 +퇲 +퇲 +퇲 +퇲 + +퇳 +퇳 +퇳 +퇳 +퇳 + +퇴 +퇴 +퇴 +퇴 +퇴 + +퇵 +퇵 +퇵 +퇵 +퇵 + +퇶 +퇶 +퇶 +퇶 +퇶 + +퇷 +퇷 +퇷 +퇷 +퇷 + +퇸 +퇸 +퇸 +퇸 +퇸 + +퇹 +퇹 +퇹 +퇹 +퇹 + +퇺 +퇺 +퇺 +퇺 +퇺 + +퇻 +퇻 +퇻 +퇻 +퇻 + +퇼 +퇼 +퇼 +퇼 +퇼 + +퇽 +퇽 +퇽 +퇽 +퇽 + +퇾 +퇾 +퇾 +퇾 +퇾 + +퇿 +퇿 +퇿 +퇿 +퇿 + +툀 +툀 +툀 +툀 +툀 + +툁 +툁 +툁 +툁 +툁 + +툂 +툂 +툂 +툂 +툂 + +툃 +툃 +툃 +툃 +툃 + +툄 +툄 +툄 +툄 +툄 + +툅 +툅 +툅 +툅 +툅 + +툆 +툆 +툆 +툆 +툆 + +툇 +툇 +툇 +툇 +툇 + +툈 +툈 +툈 +툈 +툈 + +툉 +툉 +툉 +툉 +툉 + +툊 +툊 +툊 +툊 +툊 + +툋 +툋 +툋 +툋 +툋 + +툌 +툌 +툌 +툌 +툌 + +툍 +툍 +툍 +툍 +툍 + +툎 +툎 +툎 +툎 +툎 + +툏 +툏 +툏 +툏 +툏 + +툐 +툐 +툐 +툐 +툐 + +툑 +툑 +툑 +툑 +툑 + +툒 +툒 +툒 +툒 +툒 + +툓 +툓 +툓 +툓 +툓 + +툔 +툔 +툔 +툔 +툔 + +툕 +툕 +툕 +툕 +툕 + +툖 +툖 +툖 +툖 +툖 + +툗 +툗 +툗 +툗 +툗 + +툘 +툘 +툘 +툘 +툘 + +툙 +툙 +툙 +툙 +툙 + +툚 +툚 +툚 +툚 +툚 + +툛 +툛 +툛 +툛 +툛 + +툜 +툜 +툜 +툜 +툜 + +툝 +툝 +툝 +툝 +툝 + +툞 +툞 +툞 +툞 +툞 + +툟 +툟 +툟 +툟 +툟 + +툠 +툠 +툠 +툠 +툠 + +툡 +툡 +툡 +툡 +툡 + +툢 +툢 +툢 +툢 +툢 + +툣 +툣 +툣 +툣 +툣 + +툤 +툤 +툤 +툤 +툤 + +툥 +툥 +툥 +툥 +툥 + +툦 +툦 +툦 +툦 +툦 + +툧 +툧 +툧 +툧 +툧 + +툨 +툨 +툨 +툨 +툨 + +툩 +툩 +툩 +툩 +툩 + +툪 +툪 +툪 +툪 +툪 + +툫 +툫 +툫 +툫 +툫 + +투 +투 +투 +투 +투 + +툭 +툭 +툭 +툭 +툭 + +툮 +툮 +툮 +툮 +툮 + +툯 +툯 +툯 +툯 +툯 + +툰 +툰 +툰 +툰 +툰 + +툱 +툱 +툱 +툱 +툱 + +툲 +툲 +툲 +툲 +툲 + +툳 +툳 +툳 +툳 +툳 + +툴 +툴 +툴 +툴 +툴 + +툵 +툵 +툵 +툵 +툵 + +툶 +툶 +툶 +툶 +툶 + +툷 +툷 +툷 +툷 +툷 + +툸 +툸 +툸 +툸 +툸 + +툹 +툹 +툹 +툹 +툹 + +툺 +툺 +툺 +툺 +툺 + +툻 +툻 +툻 +툻 +툻 + +툼 +툼 +툼 +툼 +툼 + +툽 +툽 +툽 +툽 +툽 + +툾 +툾 +툾 +툾 +툾 + +툿 +툿 +툿 +툿 +툿 + +퉀 +퉀 +퉀 +퉀 +퉀 + +퉁 +퉁 +퉁 +퉁 +퉁 + +퉂 +퉂 +퉂 +퉂 +퉂 + +퉃 +퉃 +퉃 +퉃 +퉃 + +퉄 +퉄 +퉄 +퉄 +퉄 + +퉅 +퉅 +퉅 +퉅 +퉅 + +퉆 +퉆 +퉆 +퉆 +퉆 + +퉇 +퉇 +퉇 +퉇 +퉇 + +퉈 +퉈 +퉈 +퉈 +퉈 + +퉉 +퉉 +퉉 +퉉 +퉉 + +퉊 +퉊 +퉊 +퉊 +퉊 + +퉋 +퉋 +퉋 +퉋 +퉋 + +퉌 +퉌 +퉌 +퉌 +퉌 + +퉍 +퉍 +퉍 +퉍 +퉍 + +퉎 +퉎 +퉎 +퉎 +퉎 + +퉏 +퉏 +퉏 +퉏 +퉏 + +퉐 +퉐 +퉐 +퉐 +퉐 + +퉑 +퉑 +퉑 +퉑 +퉑 + +퉒 +퉒 +퉒 +퉒 +퉒 + +퉓 +퉓 +퉓 +퉓 +퉓 + +퉔 +퉔 +퉔 +퉔 +퉔 + +퉕 +퉕 +퉕 +퉕 +퉕 + +퉖 +퉖 +퉖 +퉖 +퉖 + +퉗 +퉗 +퉗 +퉗 +퉗 + +퉘 +퉘 +퉘 +퉘 +퉘 + +퉙 +퉙 +퉙 +퉙 +퉙 + +퉚 +퉚 +퉚 +퉚 +퉚 + +퉛 +퉛 +퉛 +퉛 +퉛 + +퉜 +퉜 +퉜 +퉜 +퉜 + +퉝 +퉝 +퉝 +퉝 +퉝 + +퉞 +퉞 +퉞 +퉞 +퉞 + +퉟 +퉟 +퉟 +퉟 +퉟 + +퉠 +퉠 +퉠 +퉠 +퉠 + +퉡 +퉡 +퉡 +퉡 +퉡 + +퉢 +퉢 +퉢 +퉢 +퉢 + +퉣 +퉣 +퉣 +퉣 +퉣 + +퉤 +퉤 +퉤 +퉤 +퉤 + +퉥 +퉥 +퉥 +퉥 +퉥 + +퉦 +퉦 +퉦 +퉦 +퉦 + +퉧 +퉧 +퉧 +퉧 +퉧 + +퉨 +퉨 +퉨 +퉨 +퉨 + +퉩 +퉩 +퉩 +퉩 +퉩 + +퉪 +퉪 +퉪 +퉪 +퉪 + +퉫 +퉫 +퉫 +퉫 +퉫 + +퉬 +퉬 +퉬 +퉬 +퉬 + +퉭 +퉭 +퉭 +퉭 +퉭 + +퉮 +퉮 +퉮 +퉮 +퉮 + +퉯 +퉯 +퉯 +퉯 +퉯 + +퉰 +퉰 +퉰 +퉰 +퉰 + +퉱 +퉱 +퉱 +퉱 +퉱 + +퉲 +퉲 +퉲 +퉲 +퉲 + +퉳 +퉳 +퉳 +퉳 +퉳 + +퉴 +퉴 +퉴 +퉴 +퉴 + +퉵 +퉵 +퉵 +퉵 +퉵 + +퉶 +퉶 +퉶 +퉶 +퉶 + +퉷 +퉷 +퉷 +퉷 +퉷 + +퉸 +퉸 +퉸 +퉸 +퉸 + +퉹 +퉹 +퉹 +퉹 +퉹 + +퉺 +퉺 +퉺 +퉺 +퉺 + +퉻 +퉻 +퉻 +퉻 +퉻 + +퉼 +퉼 +퉼 +퉼 +퉼 + +퉽 +퉽 +퉽 +퉽 +퉽 + +퉾 +퉾 +퉾 +퉾 +퉾 + +퉿 +퉿 +퉿 +퉿 +퉿 + +튀 +튀 +튀 +튀 +튀 + +튁 +튁 +튁 +튁 +튁 + +튂 +튂 +튂 +튂 +튂 + +튃 +튃 +튃 +튃 +튃 + +튄 +튄 +튄 +튄 +튄 + +튅 +튅 +튅 +튅 +튅 + +튆 +튆 +튆 +튆 +튆 + +튇 +튇 +튇 +튇 +튇 + +튈 +튈 +튈 +튈 +튈 + +튉 +튉 +튉 +튉 +튉 + +튊 +튊 +튊 +튊 +튊 + +튋 +튋 +튋 +튋 +튋 + +튌 +튌 +튌 +튌 +튌 + +튍 +튍 +튍 +튍 +튍 + +튎 +튎 +튎 +튎 +튎 + +튏 +튏 +튏 +튏 +튏 + +튐 +튐 +튐 +튐 +튐 + +튑 +튑 +튑 +튑 +튑 + +튒 +튒 +튒 +튒 +튒 + +튓 +튓 +튓 +튓 +튓 + +튔 +튔 +튔 +튔 +튔 + +튕 +튕 +튕 +튕 +튕 + +튖 +튖 +튖 +튖 +튖 + +튗 +튗 +튗 +튗 +튗 + +튘 +튘 +튘 +튘 +튘 + +튙 +튙 +튙 +튙 +튙 + +튚 +튚 +튚 +튚 +튚 + +튛 +튛 +튛 +튛 +튛 + +튜 +튜 +튜 +튜 +튜 + +튝 +튝 +튝 +튝 +튝 + +튞 +튞 +튞 +튞 +튞 + +튟 +튟 +튟 +튟 +튟 + +튠 +튠 +튠 +튠 +튠 + +튡 +튡 +튡 +튡 +튡 + +튢 +튢 +튢 +튢 +튢 + +튣 +튣 +튣 +튣 +튣 + +튤 +튤 +튤 +튤 +튤 + +튥 +튥 +튥 +튥 +튥 + +튦 +튦 +튦 +튦 +튦 + +튧 +튧 +튧 +튧 +튧 + +튨 +튨 +튨 +튨 +튨 + +튩 +튩 +튩 +튩 +튩 + +튪 +튪 +튪 +튪 +튪 + +튫 +튫 +튫 +튫 +튫 + +튬 +튬 +튬 +튬 +튬 + +튭 +튭 +튭 +튭 +튭 + +튮 +튮 +튮 +튮 +튮 + +튯 +튯 +튯 +튯 +튯 + +튰 +튰 +튰 +튰 +튰 + +튱 +튱 +튱 +튱 +튱 + +튲 +튲 +튲 +튲 +튲 + +튳 +튳 +튳 +튳 +튳 + +튴 +튴 +튴 +튴 +튴 + +튵 +튵 +튵 +튵 +튵 + +튶 +튶 +튶 +튶 +튶 + +튷 +튷 +튷 +튷 +튷 + +트 +트 +트 +트 +트 + +특 +특 +특 +특 +특 + +튺 +튺 +튺 +튺 +튺 + +튻 +튻 +튻 +튻 +튻 + +튼 +튼 +튼 +튼 +튼 + +튽 +튽 +튽 +튽 +튽 + +튾 +튾 +튾 +튾 +튾 + +튿 +튿 +튿 +튿 +튿 + +틀 +틀 +틀 +틀 +틀 + +틁 +틁 +틁 +틁 +틁 + +틂 +틂 +틂 +틂 +틂 + +틃 +틃 +틃 +틃 +틃 + +틄 +틄 +틄 +틄 +틄 + +틅 +틅 +틅 +틅 +틅 + +틆 +틆 +틆 +틆 +틆 + +틇 +틇 +틇 +틇 +틇 + +틈 +틈 +틈 +틈 +틈 + +틉 +틉 +틉 +틉 +틉 + +틊 +틊 +틊 +틊 +틊 + +틋 +틋 +틋 +틋 +틋 + +틌 +틌 +틌 +틌 +틌 + +틍 +틍 +틍 +틍 +틍 + +틎 +틎 +틎 +틎 +틎 + +틏 +틏 +틏 +틏 +틏 + +틐 +틐 +틐 +틐 +틐 + +틑 +틑 +틑 +틑 +틑 + +틒 +틒 +틒 +틒 +틒 + +틓 +틓 +틓 +틓 +틓 + +틔 +틔 +틔 +틔 +틔 + +틕 +틕 +틕 +틕 +틕 + +틖 +틖 +틖 +틖 +틖 + +틗 +틗 +틗 +틗 +틗 + +틘 +틘 +틘 +틘 +틘 + +틙 +틙 +틙 +틙 +틙 + +틚 +틚 +틚 +틚 +틚 + +틛 +틛 +틛 +틛 +틛 + +틜 +틜 +틜 +틜 +틜 + +틝 +틝 +틝 +틝 +틝 + +틞 +틞 +틞 +틞 +틞 + +틟 +틟 +틟 +틟 +틟 + +틠 +틠 +틠 +틠 +틠 + +틡 +틡 +틡 +틡 +틡 + +틢 +틢 +틢 +틢 +틢 + +틣 +틣 +틣 +틣 +틣 + +틤 +틤 +틤 +틤 +틤 + +틥 +틥 +틥 +틥 +틥 + +틦 +틦 +틦 +틦 +틦 + +틧 +틧 +틧 +틧 +틧 + +틨 +틨 +틨 +틨 +틨 + +틩 +틩 +틩 +틩 +틩 + +틪 +틪 +틪 +틪 +틪 + +틫 +틫 +틫 +틫 +틫 + +틬 +틬 +틬 +틬 +틬 + +틭 +틭 +틭 +틭 +틭 + +틮 +틮 +틮 +틮 +틮 + +틯 +틯 +틯 +틯 +틯 + +티 +티 +티 +티 +티 + +틱 +틱 +틱 +틱 +틱 + +틲 +틲 +틲 +틲 +틲 + +틳 +틳 +틳 +틳 +틳 + +틴 +틴 +틴 +틴 +틴 + +틵 +틵 +틵 +틵 +틵 + +틶 +틶 +틶 +틶 +틶 + +틷 +틷 +틷 +틷 +틷 + +틸 +틸 +틸 +틸 +틸 + +틹 +틹 +틹 +틹 +틹 + +틺 +틺 +틺 +틺 +틺 + +틻 +틻 +틻 +틻 +틻 + +틼 +틼 +틼 +틼 +틼 + +틽 +틽 +틽 +틽 +틽 + +틾 +틾 +틾 +틾 +틾 + +틿 +틿 +틿 +틿 +틿 + +팀 +팀 +팀 +팀 +팀 + +팁 +팁 +팁 +팁 +팁 + +팂 +팂 +팂 +팂 +팂 + +팃 +팃 +팃 +팃 +팃 + +팄 +팄 +팄 +팄 +팄 + +팅 +팅 +팅 +팅 +팅 + +팆 +팆 +팆 +팆 +팆 + +팇 +팇 +팇 +팇 +팇 + +팈 +팈 +팈 +팈 +팈 + +팉 +팉 +팉 +팉 +팉 + +팊 +팊 +팊 +팊 +팊 + +팋 +팋 +팋 +팋 +팋 + +파 +파 +파 +파 +파 + +팍 +팍 +팍 +팍 +팍 + +팎 +팎 +팎 +팎 +팎 + +팏 +팏 +팏 +팏 +팏 + +판 +판 +판 +판 +판 + +팑 +팑 +팑 +팑 +팑 + +팒 +팒 +팒 +팒 +팒 + +팓 +팓 +팓 +팓 +팓 + +팔 +팔 +팔 +팔 +팔 + +팕 +팕 +팕 +팕 +팕 + +팖 +팖 +팖 +팖 +팖 + +팗 +팗 +팗 +팗 +팗 + +팘 +팘 +팘 +팘 +팘 + +팙 +팙 +팙 +팙 +팙 + +팚 +팚 +팚 +팚 +팚 + +팛 +팛 +팛 +팛 +팛 + +팜 +팜 +팜 +팜 +팜 + +팝 +팝 +팝 +팝 +팝 + +팞 +팞 +팞 +팞 +팞 + +팟 +팟 +팟 +팟 +팟 + +팠 +팠 +팠 +팠 +팠 + +팡 +팡 +팡 +팡 +팡 + +팢 +팢 +팢 +팢 +팢 + +팣 +팣 +팣 +팣 +팣 + +팤 +팤 +팤 +팤 +팤 + +팥 +팥 +팥 +팥 +팥 + +팦 +팦 +팦 +팦 +팦 + +팧 +팧 +팧 +팧 +팧 + +패 +패 +패 +패 +패 + +팩 +팩 +팩 +팩 +팩 + +팪 +팪 +팪 +팪 +팪 + +팫 +팫 +팫 +팫 +팫 + +팬 +팬 +팬 +팬 +팬 + +팭 +팭 +팭 +팭 +팭 + +팮 +팮 +팮 +팮 +팮 + +팯 +팯 +팯 +팯 +팯 + +팰 +팰 +팰 +팰 +팰 + +팱 +팱 +팱 +팱 +팱 + +팲 +팲 +팲 +팲 +팲 + +팳 +팳 +팳 +팳 +팳 + +팴 +팴 +팴 +팴 +팴 + +팵 +팵 +팵 +팵 +팵 + +팶 +팶 +팶 +팶 +팶 + +팷 +팷 +팷 +팷 +팷 + +팸 +팸 +팸 +팸 +팸 + +팹 +팹 +팹 +팹 +팹 + +팺 +팺 +팺 +팺 +팺 + +팻 +팻 +팻 +팻 +팻 + +팼 +팼 +팼 +팼 +팼 + +팽 +팽 +팽 +팽 +팽 + +팾 +팾 +팾 +팾 +팾 + +팿 +팿 +팿 +팿 +팿 + +퍀 +퍀 +퍀 +퍀 +퍀 + +퍁 +퍁 +퍁 +퍁 +퍁 + +퍂 +퍂 +퍂 +퍂 +퍂 + +퍃 +퍃 +퍃 +퍃 +퍃 + +퍄 +퍄 +퍄 +퍄 +퍄 + +퍅 +퍅 +퍅 +퍅 +퍅 + +퍆 +퍆 +퍆 +퍆 +퍆 + +퍇 +퍇 +퍇 +퍇 +퍇 + +퍈 +퍈 +퍈 +퍈 +퍈 + +퍉 +퍉 +퍉 +퍉 +퍉 + +퍊 +퍊 +퍊 +퍊 +퍊 + +퍋 +퍋 +퍋 +퍋 +퍋 + +퍌 +퍌 +퍌 +퍌 +퍌 + +퍍 +퍍 +퍍 +퍍 +퍍 + +퍎 +퍎 +퍎 +퍎 +퍎 + +퍏 +퍏 +퍏 +퍏 +퍏 + +퍐 +퍐 +퍐 +퍐 +퍐 + +퍑 +퍑 +퍑 +퍑 +퍑 + +퍒 +퍒 +퍒 +퍒 +퍒 + +퍓 +퍓 +퍓 +퍓 +퍓 + +퍔 +퍔 +퍔 +퍔 +퍔 + +퍕 +퍕 +퍕 +퍕 +퍕 + +퍖 +퍖 +퍖 +퍖 +퍖 + +퍗 +퍗 +퍗 +퍗 +퍗 + +퍘 +퍘 +퍘 +퍘 +퍘 + +퍙 +퍙 +퍙 +퍙 +퍙 + +퍚 +퍚 +퍚 +퍚 +퍚 + +퍛 +퍛 +퍛 +퍛 +퍛 + +퍜 +퍜 +퍜 +퍜 +퍜 + +퍝 +퍝 +퍝 +퍝 +퍝 + +퍞 +퍞 +퍞 +퍞 +퍞 + +퍟 +퍟 +퍟 +퍟 +퍟 + +퍠 +퍠 +퍠 +퍠 +퍠 + +퍡 +퍡 +퍡 +퍡 +퍡 + +퍢 +퍢 +퍢 +퍢 +퍢 + +퍣 +퍣 +퍣 +퍣 +퍣 + +퍤 +퍤 +퍤 +퍤 +퍤 + +퍥 +퍥 +퍥 +퍥 +퍥 + +퍦 +퍦 +퍦 +퍦 +퍦 + +퍧 +퍧 +퍧 +퍧 +퍧 + +퍨 +퍨 +퍨 +퍨 +퍨 + +퍩 +퍩 +퍩 +퍩 +퍩 + +퍪 +퍪 +퍪 +퍪 +퍪 + +퍫 +퍫 +퍫 +퍫 +퍫 + +퍬 +퍬 +퍬 +퍬 +퍬 + +퍭 +퍭 +퍭 +퍭 +퍭 + +퍮 +퍮 +퍮 +퍮 +퍮 + +퍯 +퍯 +퍯 +퍯 +퍯 + +퍰 +퍰 +퍰 +퍰 +퍰 + +퍱 +퍱 +퍱 +퍱 +퍱 + +퍲 +퍲 +퍲 +퍲 +퍲 + +퍳 +퍳 +퍳 +퍳 +퍳 + +퍴 +퍴 +퍴 +퍴 +퍴 + +퍵 +퍵 +퍵 +퍵 +퍵 + +퍶 +퍶 +퍶 +퍶 +퍶 + +퍷 +퍷 +퍷 +퍷 +퍷 + +퍸 +퍸 +퍸 +퍸 +퍸 + +퍹 +퍹 +퍹 +퍹 +퍹 + +퍺 +퍺 +퍺 +퍺 +퍺 + +퍻 +퍻 +퍻 +퍻 +퍻 + +퍼 +퍼 +퍼 +퍼 +퍼 + +퍽 +퍽 +퍽 +퍽 +퍽 + +퍾 +퍾 +퍾 +퍾 +퍾 + +퍿 +퍿 +퍿 +퍿 +퍿 + +펀 +펀 +펀 +펀 +펀 + +펁 +펁 +펁 +펁 +펁 + +펂 +펂 +펂 +펂 +펂 + +펃 +펃 +펃 +펃 +펃 + +펄 +펄 +펄 +펄 +펄 + +펅 +펅 +펅 +펅 +펅 + +펆 +펆 +펆 +펆 +펆 + +펇 +펇 +펇 +펇 +펇 + +펈 +펈 +펈 +펈 +펈 + +펉 +펉 +펉 +펉 +펉 + +펊 +펊 +펊 +펊 +펊 + +펋 +펋 +펋 +펋 +펋 + +펌 +펌 +펌 +펌 +펌 + +펍 +펍 +펍 +펍 +펍 + +펎 +펎 +펎 +펎 +펎 + +펏 +펏 +펏 +펏 +펏 + +펐 +펐 +펐 +펐 +펐 + +펑 +펑 +펑 +펑 +펑 + +펒 +펒 +펒 +펒 +펒 + +펓 +펓 +펓 +펓 +펓 + +펔 +펔 +펔 +펔 +펔 + +펕 +펕 +펕 +펕 +펕 + +펖 +펖 +펖 +펖 +펖 + +펗 +펗 +펗 +펗 +펗 + +페 +페 +페 +페 +페 + +펙 +펙 +펙 +펙 +펙 + +펚 +펚 +펚 +펚 +펚 + +펛 +펛 +펛 +펛 +펛 + +펜 +펜 +펜 +펜 +펜 + +펝 +펝 +펝 +펝 +펝 + +펞 +펞 +펞 +펞 +펞 + +펟 +펟 +펟 +펟 +펟 + +펠 +펠 +펠 +펠 +펠 + +펡 +펡 +펡 +펡 +펡 + +펢 +펢 +펢 +펢 +펢 + +펣 +펣 +펣 +펣 +펣 + +펤 +펤 +펤 +펤 +펤 + +펥 +펥 +펥 +펥 +펥 + +펦 +펦 +펦 +펦 +펦 + +펧 +펧 +펧 +펧 +펧 + +펨 +펨 +펨 +펨 +펨 + +펩 +펩 +펩 +펩 +펩 + +펪 +펪 +펪 +펪 +펪 + +펫 +펫 +펫 +펫 +펫 + +펬 +펬 +펬 +펬 +펬 + +펭 +펭 +펭 +펭 +펭 + +펮 +펮 +펮 +펮 +펮 + +펯 +펯 +펯 +펯 +펯 + +펰 +펰 +펰 +펰 +펰 + +펱 +펱 +펱 +펱 +펱 + +펲 +펲 +펲 +펲 +펲 + +펳 +펳 +펳 +펳 +펳 + +펴 +펴 +펴 +펴 +펴 + +펵 +펵 +펵 +펵 +펵 + +펶 +펶 +펶 +펶 +펶 + +펷 +펷 +펷 +펷 +펷 + +편 +편 +편 +편 +편 + +펹 +펹 +펹 +펹 +펹 + +펺 +펺 +펺 +펺 +펺 + +펻 +펻 +펻 +펻 +펻 + +펼 +펼 +펼 +펼 +펼 + +펽 +펽 +펽 +펽 +펽 + +펾 +펾 +펾 +펾 +펾 + +펿 +펿 +펿 +펿 +펿 + +폀 +폀 +폀 +폀 +폀 + +폁 +폁 +폁 +폁 +폁 + +폂 +폂 +폂 +폂 +폂 + +폃 +폃 +폃 +폃 +폃 + +폄 +폄 +폄 +폄 +폄 + +폅 +폅 +폅 +폅 +폅 + +폆 +폆 +폆 +폆 +폆 + +폇 +폇 +폇 +폇 +폇 + +폈 +폈 +폈 +폈 +폈 + +평 +평 +평 +평 +평 + +폊 +폊 +폊 +폊 +폊 + +폋 +폋 +폋 +폋 +폋 + +폌 +폌 +폌 +폌 +폌 + +폍 +폍 +폍 +폍 +폍 + +폎 +폎 +폎 +폎 +폎 + +폏 +폏 +폏 +폏 +폏 + +폐 +폐 +폐 +폐 +폐 + +폑 +폑 +폑 +폑 +폑 + +폒 +폒 +폒 +폒 +폒 + +폓 +폓 +폓 +폓 +폓 + +폔 +폔 +폔 +폔 +폔 + +폕 +폕 +폕 +폕 +폕 + +폖 +폖 +폖 +폖 +폖 + +폗 +폗 +폗 +폗 +폗 + +폘 +폘 +폘 +폘 +폘 + +폙 +폙 +폙 +폙 +폙 + +폚 +폚 +폚 +폚 +폚 + +폛 +폛 +폛 +폛 +폛 + +폜 +폜 +폜 +폜 +폜 + +폝 +폝 +폝 +폝 +폝 + +폞 +폞 +폞 +폞 +폞 + +폟 +폟 +폟 +폟 +폟 + +폠 +폠 +폠 +폠 +폠 + +폡 +폡 +폡 +폡 +폡 + +폢 +폢 +폢 +폢 +폢 + +폣 +폣 +폣 +폣 +폣 + +폤 +폤 +폤 +폤 +폤 + +폥 +폥 +폥 +폥 +폥 + +폦 +폦 +폦 +폦 +폦 + +폧 +폧 +폧 +폧 +폧 + +폨 +폨 +폨 +폨 +폨 + +폩 +폩 +폩 +폩 +폩 + +폪 +폪 +폪 +폪 +폪 + +폫 +폫 +폫 +폫 +폫 + +포 +포 +포 +포 +포 + +폭 +폭 +폭 +폭 +폭 + +폮 +폮 +폮 +폮 +폮 + +폯 +폯 +폯 +폯 +폯 + +폰 +폰 +폰 +폰 +폰 + +폱 +폱 +폱 +폱 +폱 + +폲 +폲 +폲 +폲 +폲 + +폳 +폳 +폳 +폳 +폳 + +폴 +폴 +폴 +폴 +폴 + +폵 +폵 +폵 +폵 +폵 + +폶 +폶 +폶 +폶 +폶 + +폷 +폷 +폷 +폷 +폷 + +폸 +폸 +폸 +폸 +폸 + +폹 +폹 +폹 +폹 +폹 + +폺 +폺 +폺 +폺 +폺 + +폻 +폻 +폻 +폻 +폻 + +폼 +폼 +폼 +폼 +폼 + +폽 +폽 +폽 +폽 +폽 + +폾 +폾 +폾 +폾 +폾 + +폿 +폿 +폿 +폿 +폿 + +퐀 +퐀 +퐀 +퐀 +퐀 + +퐁 +퐁 +퐁 +퐁 +퐁 + +퐂 +퐂 +퐂 +퐂 +퐂 + +퐃 +퐃 +퐃 +퐃 +퐃 + +퐄 +퐄 +퐄 +퐄 +퐄 + +퐅 +퐅 +퐅 +퐅 +퐅 + +퐆 +퐆 +퐆 +퐆 +퐆 + +퐇 +퐇 +퐇 +퐇 +퐇 + +퐈 +퐈 +퐈 +퐈 +퐈 + +퐉 +퐉 +퐉 +퐉 +퐉 + +퐊 +퐊 +퐊 +퐊 +퐊 + +퐋 +퐋 +퐋 +퐋 +퐋 + +퐌 +퐌 +퐌 +퐌 +퐌 + +퐍 +퐍 +퐍 +퐍 +퐍 + +퐎 +퐎 +퐎 +퐎 +퐎 + +퐏 +퐏 +퐏 +퐏 +퐏 + +퐐 +퐐 +퐐 +퐐 +퐐 + +퐑 +퐑 +퐑 +퐑 +퐑 + +퐒 +퐒 +퐒 +퐒 +퐒 + +퐓 +퐓 +퐓 +퐓 +퐓 + +퐔 +퐔 +퐔 +퐔 +퐔 + +퐕 +퐕 +퐕 +퐕 +퐕 + +퐖 +퐖 +퐖 +퐖 +퐖 + +퐗 +퐗 +퐗 +퐗 +퐗 + +퐘 +퐘 +퐘 +퐘 +퐘 + +퐙 +퐙 +퐙 +퐙 +퐙 + +퐚 +퐚 +퐚 +퐚 +퐚 + +퐛 +퐛 +퐛 +퐛 +퐛 + +퐜 +퐜 +퐜 +퐜 +퐜 + +퐝 +퐝 +퐝 +퐝 +퐝 + +퐞 +퐞 +퐞 +퐞 +퐞 + +퐟 +퐟 +퐟 +퐟 +퐟 + +퐠 +퐠 +퐠 +퐠 +퐠 + +퐡 +퐡 +퐡 +퐡 +퐡 + +퐢 +퐢 +퐢 +퐢 +퐢 + +퐣 +퐣 +퐣 +퐣 +퐣 + +퐤 +퐤 +퐤 +퐤 +퐤 + +퐥 +퐥 +퐥 +퐥 +퐥 + +퐦 +퐦 +퐦 +퐦 +퐦 + +퐧 +퐧 +퐧 +퐧 +퐧 + +퐨 +퐨 +퐨 +퐨 +퐨 + +퐩 +퐩 +퐩 +퐩 +퐩 + +퐪 +퐪 +퐪 +퐪 +퐪 + +퐫 +퐫 +퐫 +퐫 +퐫 + +퐬 +퐬 +퐬 +퐬 +퐬 + +퐭 +퐭 +퐭 +퐭 +퐭 + +퐮 +퐮 +퐮 +퐮 +퐮 + +퐯 +퐯 +퐯 +퐯 +퐯 + +퐰 +퐰 +퐰 +퐰 +퐰 + +퐱 +퐱 +퐱 +퐱 +퐱 + +퐲 +퐲 +퐲 +퐲 +퐲 + +퐳 +퐳 +퐳 +퐳 +퐳 + +퐴 +퐴 +퐴 +퐴 +퐴 + +퐵 +퐵 +퐵 +퐵 +퐵 + +퐶 +퐶 +퐶 +퐶 +퐶 + +퐷 +퐷 +퐷 +퐷 +퐷 + +퐸 +퐸 +퐸 +퐸 +퐸 + +퐹 +퐹 +퐹 +퐹 +퐹 + +퐺 +퐺 +퐺 +퐺 +퐺 + +퐻 +퐻 +퐻 +퐻 +퐻 + +퐼 +퐼 +퐼 +퐼 +퐼 + +퐽 +퐽 +퐽 +퐽 +퐽 + +퐾 +퐾 +퐾 +퐾 +퐾 + +퐿 +퐿 +퐿 +퐿 +퐿 + +푀 +푀 +푀 +푀 +푀 + +푁 +푁 +푁 +푁 +푁 + +푂 +푂 +푂 +푂 +푂 + +푃 +푃 +푃 +푃 +푃 + +푄 +푄 +푄 +푄 +푄 + +푅 +푅 +푅 +푅 +푅 + +푆 +푆 +푆 +푆 +푆 + +푇 +푇 +푇 +푇 +푇 + +푈 +푈 +푈 +푈 +푈 + +푉 +푉 +푉 +푉 +푉 + +푊 +푊 +푊 +푊 +푊 + +푋 +푋 +푋 +푋 +푋 + +푌 +푌 +푌 +푌 +푌 + +푍 +푍 +푍 +푍 +푍 + +푎 +푎 +푎 +푎 +푎 + +푏 +푏 +푏 +푏 +푏 + +푐 +푐 +푐 +푐 +푐 + +푑 +푑 +푑 +푑 +푑 + +푒 +푒 +푒 +푒 +푒 + +푓 +푓 +푓 +푓 +푓 + +푔 +푔 +푔 +푔 +푔 + +푕 +푕 +푕 +푕 +푕 + +푖 +푖 +푖 +푖 +푖 + +푗 +푗 +푗 +푗 +푗 + +푘 +푘 +푘 +푘 +푘 + +푙 +푙 +푙 +푙 +푙 + +푚 +푚 +푚 +푚 +푚 + +푛 +푛 +푛 +푛 +푛 + +표 +표 +표 +표 +표 + +푝 +푝 +푝 +푝 +푝 + +푞 +푞 +푞 +푞 +푞 + +푟 +푟 +푟 +푟 +푟 + +푠 +푠 +푠 +푠 +푠 + +푡 +푡 +푡 +푡 +푡 + +푢 +푢 +푢 +푢 +푢 + +푣 +푣 +푣 +푣 +푣 + +푤 +푤 +푤 +푤 +푤 + +푥 +푥 +푥 +푥 +푥 + +푦 +푦 +푦 +푦 +푦 + +푧 +푧 +푧 +푧 +푧 + +푨 +푨 +푨 +푨 +푨 + +푩 +푩 +푩 +푩 +푩 + +푪 +푪 +푪 +푪 +푪 + +푫 +푫 +푫 +푫 +푫 + +푬 +푬 +푬 +푬 +푬 + +푭 +푭 +푭 +푭 +푭 + +푮 +푮 +푮 +푮 +푮 + +푯 +푯 +푯 +푯 +푯 + +푰 +푰 +푰 +푰 +푰 + +푱 +푱 +푱 +푱 +푱 + +푲 +푲 +푲 +푲 +푲 + +푳 +푳 +푳 +푳 +푳 + +푴 +푴 +푴 +푴 +푴 + +푵 +푵 +푵 +푵 +푵 + +푶 +푶 +푶 +푶 +푶 + +푷 +푷 +푷 +푷 +푷 + +푸 +푸 +푸 +푸 +푸 + +푹 +푹 +푹 +푹 +푹 + +푺 +푺 +푺 +푺 +푺 + +푻 +푻 +푻 +푻 +푻 + +푼 +푼 +푼 +푼 +푼 + +푽 +푽 +푽 +푽 +푽 + +푾 +푾 +푾 +푾 +푾 + +푿 +푿 +푿 +푿 +푿 + +풀 +풀 +풀 +풀 +풀 + +풁 +풁 +풁 +풁 +풁 + +풂 +풂 +풂 +풂 +풂 + +풃 +풃 +풃 +풃 +풃 + +풄 +풄 +풄 +풄 +풄 + +풅 +풅 +풅 +풅 +풅 + +풆 +풆 +풆 +풆 +풆 + +풇 +풇 +풇 +풇 +풇 + +품 +품 +품 +품 +품 + +풉 +풉 +풉 +풉 +풉 + +풊 +풊 +풊 +풊 +풊 + +풋 +풋 +풋 +풋 +풋 + +풌 +풌 +풌 +풌 +풌 + +풍 +풍 +풍 +풍 +풍 + +풎 +풎 +풎 +풎 +풎 + +풏 +풏 +풏 +풏 +풏 + +풐 +풐 +풐 +풐 +풐 + +풑 +풑 +풑 +풑 +풑 + +풒 +풒 +풒 +풒 +풒 + +풓 +풓 +풓 +풓 +풓 + +풔 +풔 +풔 +풔 +풔 + +풕 +풕 +풕 +풕 +풕 + +풖 +풖 +풖 +풖 +풖 + +풗 +풗 +풗 +풗 +풗 + +풘 +풘 +풘 +풘 +풘 + +풙 +풙 +풙 +풙 +풙 + +풚 +풚 +풚 +풚 +풚 + +풛 +풛 +풛 +풛 +풛 + +풜 +풜 +풜 +풜 +풜 + +풝 +풝 +풝 +풝 +풝 + +풞 +풞 +풞 +풞 +풞 + +풟 +풟 +풟 +풟 +풟 + +풠 +풠 +풠 +풠 +풠 + +풡 +풡 +풡 +풡 +풡 + +풢 +풢 +풢 +풢 +풢 + +풣 +풣 +풣 +풣 +풣 + +풤 +풤 +풤 +풤 +풤 + +풥 +풥 +풥 +풥 +풥 + +풦 +풦 +풦 +풦 +풦 + +풧 +풧 +풧 +풧 +풧 + +풨 +풨 +풨 +풨 +풨 + +풩 +풩 +풩 +풩 +풩 + +풪 +풪 +풪 +풪 +풪 + +풫 +풫 +풫 +풫 +풫 + +풬 +풬 +풬 +풬 +풬 + +풭 +풭 +풭 +풭 +풭 + +풮 +풮 +풮 +풮 +풮 + +풯 +풯 +풯 +풯 +풯 + +풰 +풰 +풰 +풰 +풰 + +풱 +풱 +풱 +풱 +풱 + +풲 +풲 +풲 +풲 +풲 + +풳 +풳 +풳 +풳 +풳 + +풴 +풴 +풴 +풴 +풴 + +풵 +풵 +풵 +풵 +풵 + +풶 +풶 +풶 +풶 +풶 + +풷 +풷 +풷 +풷 +풷 + +풸 +풸 +풸 +풸 +풸 + +풹 +풹 +풹 +풹 +풹 + +풺 +풺 +풺 +풺 +풺 + +풻 +풻 +풻 +풻 +풻 + +풼 +풼 +풼 +풼 +풼 + +풽 +풽 +풽 +풽 +풽 + +풾 +풾 +풾 +풾 +풾 + +풿 +풿 +풿 +풿 +풿 + +퓀 +퓀 +퓀 +퓀 +퓀 + +퓁 +퓁 +퓁 +퓁 +퓁 + +퓂 +퓂 +퓂 +퓂 +퓂 + +퓃 +퓃 +퓃 +퓃 +퓃 + +퓄 +퓄 +퓄 +퓄 +퓄 + +퓅 +퓅 +퓅 +퓅 +퓅 + +퓆 +퓆 +퓆 +퓆 +퓆 + +퓇 +퓇 +퓇 +퓇 +퓇 + +퓈 +퓈 +퓈 +퓈 +퓈 + +퓉 +퓉 +퓉 +퓉 +퓉 + +퓊 +퓊 +퓊 +퓊 +퓊 + +퓋 +퓋 +퓋 +퓋 +퓋 + +퓌 +퓌 +퓌 +퓌 +퓌 + +퓍 +퓍 +퓍 +퓍 +퓍 + +퓎 +퓎 +퓎 +퓎 +퓎 + +퓏 +퓏 +퓏 +퓏 +퓏 + +퓐 +퓐 +퓐 +퓐 +퓐 + +퓑 +퓑 +퓑 +퓑 +퓑 + +퓒 +퓒 +퓒 +퓒 +퓒 + +퓓 +퓓 +퓓 +퓓 +퓓 + +퓔 +퓔 +퓔 +퓔 +퓔 + +퓕 +퓕 +퓕 +퓕 +퓕 + +퓖 +퓖 +퓖 +퓖 +퓖 + +퓗 +퓗 +퓗 +퓗 +퓗 + +퓘 +퓘 +퓘 +퓘 +퓘 + +퓙 +퓙 +퓙 +퓙 +퓙 + +퓚 +퓚 +퓚 +퓚 +퓚 + +퓛 +퓛 +퓛 +퓛 +퓛 + +퓜 +퓜 +퓜 +퓜 +퓜 + +퓝 +퓝 +퓝 +퓝 +퓝 + +퓞 +퓞 +퓞 +퓞 +퓞 + +퓟 +퓟 +퓟 +퓟 +퓟 + +퓠 +퓠 +퓠 +퓠 +퓠 + +퓡 +퓡 +퓡 +퓡 +퓡 + +퓢 +퓢 +퓢 +퓢 +퓢 + +퓣 +퓣 +퓣 +퓣 +퓣 + +퓤 +퓤 +퓤 +퓤 +퓤 + +퓥 +퓥 +퓥 +퓥 +퓥 + +퓦 +퓦 +퓦 +퓦 +퓦 + +퓧 +퓧 +퓧 +퓧 +퓧 + +퓨 +퓨 +퓨 +퓨 +퓨 + +퓩 +퓩 +퓩 +퓩 +퓩 + +퓪 +퓪 +퓪 +퓪 +퓪 + +퓫 +퓫 +퓫 +퓫 +퓫 + +퓬 +퓬 +퓬 +퓬 +퓬 + +퓭 +퓭 +퓭 +퓭 +퓭 + +퓮 +퓮 +퓮 +퓮 +퓮 + +퓯 +퓯 +퓯 +퓯 +퓯 + +퓰 +퓰 +퓰 +퓰 +퓰 + +퓱 +퓱 +퓱 +퓱 +퓱 + +퓲 +퓲 +퓲 +퓲 +퓲 + +퓳 +퓳 +퓳 +퓳 +퓳 + +퓴 +퓴 +퓴 +퓴 +퓴 + +퓵 +퓵 +퓵 +퓵 +퓵 + +퓶 +퓶 +퓶 +퓶 +퓶 + +퓷 +퓷 +퓷 +퓷 +퓷 + +퓸 +퓸 +퓸 +퓸 +퓸 + +퓹 +퓹 +퓹 +퓹 +퓹 + +퓺 +퓺 +퓺 +퓺 +퓺 + +퓻 +퓻 +퓻 +퓻 +퓻 + +퓼 +퓼 +퓼 +퓼 +퓼 + +퓽 +퓽 +퓽 +퓽 +퓽 + +퓾 +퓾 +퓾 +퓾 +퓾 + +퓿 +퓿 +퓿 +퓿 +퓿 + +픀 +픀 +픀 +픀 +픀 + +픁 +픁 +픁 +픁 +픁 + +픂 +픂 +픂 +픂 +픂 + +픃 +픃 +픃 +픃 +픃 + +프 +프 +프 +프 +프 + +픅 +픅 +픅 +픅 +픅 + +픆 +픆 +픆 +픆 +픆 + +픇 +픇 +픇 +픇 +픇 + +픈 +픈 +픈 +픈 +픈 + +픉 +픉 +픉 +픉 +픉 + +픊 +픊 +픊 +픊 +픊 + +픋 +픋 +픋 +픋 +픋 + +플 +플 +플 +플 +플 + +픍 +픍 +픍 +픍 +픍 + +픎 +픎 +픎 +픎 +픎 + +픏 +픏 +픏 +픏 +픏 + +픐 +픐 +픐 +픐 +픐 + +픑 +픑 +픑 +픑 +픑 + +픒 +픒 +픒 +픒 +픒 + +픓 +픓 +픓 +픓 +픓 + +픔 +픔 +픔 +픔 +픔 + +픕 +픕 +픕 +픕 +픕 + +픖 +픖 +픖 +픖 +픖 + +픗 +픗 +픗 +픗 +픗 + +픘 +픘 +픘 +픘 +픘 + +픙 +픙 +픙 +픙 +픙 + +픚 +픚 +픚 +픚 +픚 + +픛 +픛 +픛 +픛 +픛 + +픜 +픜 +픜 +픜 +픜 + +픝 +픝 +픝 +픝 +픝 + +픞 +픞 +픞 +픞 +픞 + +픟 +픟 +픟 +픟 +픟 + +픠 +픠 +픠 +픠 +픠 + +픡 +픡 +픡 +픡 +픡 + +픢 +픢 +픢 +픢 +픢 + +픣 +픣 +픣 +픣 +픣 + +픤 +픤 +픤 +픤 +픤 + +픥 +픥 +픥 +픥 +픥 + +픦 +픦 +픦 +픦 +픦 + +픧 +픧 +픧 +픧 +픧 + +픨 +픨 +픨 +픨 +픨 + +픩 +픩 +픩 +픩 +픩 + +픪 +픪 +픪 +픪 +픪 + +픫 +픫 +픫 +픫 +픫 + +픬 +픬 +픬 +픬 +픬 + +픭 +픭 +픭 +픭 +픭 + +픮 +픮 +픮 +픮 +픮 + +픯 +픯 +픯 +픯 +픯 + +픰 +픰 +픰 +픰 +픰 + +픱 +픱 +픱 +픱 +픱 + +픲 +픲 +픲 +픲 +픲 + +픳 +픳 +픳 +픳 +픳 + +픴 +픴 +픴 +픴 +픴 + +픵 +픵 +픵 +픵 +픵 + +픶 +픶 +픶 +픶 +픶 + +픷 +픷 +픷 +픷 +픷 + +픸 +픸 +픸 +픸 +픸 + +픹 +픹 +픹 +픹 +픹 + +픺 +픺 +픺 +픺 +픺 + +픻 +픻 +픻 +픻 +픻 + +피 +피 +피 +피 +피 + +픽 +픽 +픽 +픽 +픽 + +픾 +픾 +픾 +픾 +픾 + +픿 +픿 +픿 +픿 +픿 + +핀 +핀 +핀 +핀 +핀 + +핁 +핁 +핁 +핁 +핁 + +핂 +핂 +핂 +핂 +핂 + +핃 +핃 +핃 +핃 +핃 + +필 +필 +필 +필 +필 + +핅 +핅 +핅 +핅 +핅 + +핆 +핆 +핆 +핆 +핆 + +핇 +핇 +핇 +핇 +핇 + +핈 +핈 +핈 +핈 +핈 + +핉 +핉 +핉 +핉 +핉 + +핊 +핊 +핊 +핊 +핊 + +핋 +핋 +핋 +핋 +핋 + +핌 +핌 +핌 +핌 +핌 + +핍 +핍 +핍 +핍 +핍 + +핎 +핎 +핎 +핎 +핎 + +핏 +핏 +핏 +핏 +핏 + +핐 +핐 +핐 +핐 +핐 + +핑 +핑 +핑 +핑 +핑 + +핒 +핒 +핒 +핒 +핒 + +핓 +핓 +핓 +핓 +핓 + +핔 +핔 +핔 +핔 +핔 + +핕 +핕 +핕 +핕 +핕 + +핖 +핖 +핖 +핖 +핖 + +핗 +핗 +핗 +핗 +핗 + +하 +하 +하 +하 +하 + +학 +학 +학 +학 +학 + +핚 +핚 +핚 +핚 +핚 + +핛 +핛 +핛 +핛 +핛 + +한 +한 +한 +한 +한 + +핝 +핝 +핝 +핝 +핝 + +핞 +핞 +핞 +핞 +핞 + +핟 +핟 +핟 +핟 +핟 + +할 +할 +할 +할 +할 + +핡 +핡 +핡 +핡 +핡 + +핢 +핢 +핢 +핢 +핢 + +핣 +핣 +핣 +핣 +핣 + +핤 +핤 +핤 +핤 +핤 + +핥 +핥 +핥 +핥 +핥 + +핦 +핦 +핦 +핦 +핦 + +핧 +핧 +핧 +핧 +핧 + +함 +함 +함 +함 +함 + +합 +합 +합 +합 +합 + +핪 +핪 +핪 +핪 +핪 + +핫 +핫 +핫 +핫 +핫 + +핬 +핬 +핬 +핬 +핬 + +항 +항 +항 +항 +항 + +핮 +핮 +핮 +핮 +핮 + +핯 +핯 +핯 +핯 +핯 + +핰 +핰 +핰 +핰 +핰 + +핱 +핱 +핱 +핱 +핱 + +핲 +핲 +핲 +핲 +핲 + +핳 +핳 +핳 +핳 +핳 + +해 +해 +해 +해 +해 + +핵 +핵 +핵 +핵 +핵 + +핶 +핶 +핶 +핶 +핶 + +핷 +핷 +핷 +핷 +핷 + +핸 +핸 +핸 +핸 +핸 + +핹 +핹 +핹 +핹 +핹 + +핺 +핺 +핺 +핺 +핺 + +핻 +핻 +핻 +핻 +핻 + +핼 +핼 +핼 +핼 +핼 + +핽 +핽 +핽 +핽 +핽 + +핾 +핾 +핾 +핾 +핾 + +핿 +핿 +핿 +핿 +핿 + +햀 +햀 +햀 +햀 +햀 + +햁 +햁 +햁 +햁 +햁 + +햂 +햂 +햂 +햂 +햂 + +햃 +햃 +햃 +햃 +햃 + +햄 +햄 +햄 +햄 +햄 + +햅 +햅 +햅 +햅 +햅 + +햆 +햆 +햆 +햆 +햆 + +햇 +햇 +햇 +햇 +햇 + +했 +했 +했 +했 +했 + +행 +행 +행 +행 +행 + +햊 +햊 +햊 +햊 +햊 + +햋 +햋 +햋 +햋 +햋 + +햌 +햌 +햌 +햌 +햌 + +햍 +햍 +햍 +햍 +햍 + +햎 +햎 +햎 +햎 +햎 + +햏 +햏 +햏 +햏 +햏 + +햐 +햐 +햐 +햐 +햐 + +햑 +햑 +햑 +햑 +햑 + +햒 +햒 +햒 +햒 +햒 + +햓 +햓 +햓 +햓 +햓 + +햔 +햔 +햔 +햔 +햔 + +햕 +햕 +햕 +햕 +햕 + +햖 +햖 +햖 +햖 +햖 + +햗 +햗 +햗 +햗 +햗 + +햘 +햘 +햘 +햘 +햘 + +햙 +햙 +햙 +햙 +햙 + +햚 +햚 +햚 +햚 +햚 + +햛 +햛 +햛 +햛 +햛 + +햜 +햜 +햜 +햜 +햜 + +햝 +햝 +햝 +햝 +햝 + +햞 +햞 +햞 +햞 +햞 + +햟 +햟 +햟 +햟 +햟 + +햠 +햠 +햠 +햠 +햠 + +햡 +햡 +햡 +햡 +햡 + +햢 +햢 +햢 +햢 +햢 + +햣 +햣 +햣 +햣 +햣 + +햤 +햤 +햤 +햤 +햤 + +향 +향 +향 +향 +향 + +햦 +햦 +햦 +햦 +햦 + +햧 +햧 +햧 +햧 +햧 + +햨 +햨 +햨 +햨 +햨 + +햩 +햩 +햩 +햩 +햩 + +햪 +햪 +햪 +햪 +햪 + +햫 +햫 +햫 +햫 +햫 + +햬 +햬 +햬 +햬 +햬 + +햭 +햭 +햭 +햭 +햭 + +햮 +햮 +햮 +햮 +햮 + +햯 +햯 +햯 +햯 +햯 + +햰 +햰 +햰 +햰 +햰 + +햱 +햱 +햱 +햱 +햱 + +햲 +햲 +햲 +햲 +햲 + +햳 +햳 +햳 +햳 +햳 + +햴 +햴 +햴 +햴 +햴 + +햵 +햵 +햵 +햵 +햵 + +햶 +햶 +햶 +햶 +햶 + +햷 +햷 +햷 +햷 +햷 + +햸 +햸 +햸 +햸 +햸 + +햹 +햹 +햹 +햹 +햹 + +햺 +햺 +햺 +햺 +햺 + +햻 +햻 +햻 +햻 +햻 + +햼 +햼 +햼 +햼 +햼 + +햽 +햽 +햽 +햽 +햽 + +햾 +햾 +햾 +햾 +햾 + +햿 +햿 +햿 +햿 +햿 + +헀 +헀 +헀 +헀 +헀 + +헁 +헁 +헁 +헁 +헁 + +헂 +헂 +헂 +헂 +헂 + +헃 +헃 +헃 +헃 +헃 + +헄 +헄 +헄 +헄 +헄 + +헅 +헅 +헅 +헅 +헅 + +헆 +헆 +헆 +헆 +헆 + +헇 +헇 +헇 +헇 +헇 + +허 +허 +허 +허 +허 + +헉 +헉 +헉 +헉 +헉 + +헊 +헊 +헊 +헊 +헊 + +헋 +헋 +헋 +헋 +헋 + +헌 +헌 +헌 +헌 +헌 + +헍 +헍 +헍 +헍 +헍 + +헎 +헎 +헎 +헎 +헎 + +헏 +헏 +헏 +헏 +헏 + +헐 +헐 +헐 +헐 +헐 + +헑 +헑 +헑 +헑 +헑 + +헒 +헒 +헒 +헒 +헒 + +헓 +헓 +헓 +헓 +헓 + +헔 +헔 +헔 +헔 +헔 + +헕 +헕 +헕 +헕 +헕 + +헖 +헖 +헖 +헖 +헖 + +헗 +헗 +헗 +헗 +헗 + +험 +험 +험 +험 +험 + +헙 +헙 +헙 +헙 +헙 + +헚 +헚 +헚 +헚 +헚 + +헛 +헛 +헛 +헛 +헛 + +헜 +헜 +헜 +헜 +헜 + +헝 +헝 +헝 +헝 +헝 + +헞 +헞 +헞 +헞 +헞 + +헟 +헟 +헟 +헟 +헟 + +헠 +헠 +헠 +헠 +헠 + +헡 +헡 +헡 +헡 +헡 + +헢 +헢 +헢 +헢 +헢 + +헣 +헣 +헣 +헣 +헣 + +헤 +헤 +헤 +헤 +헤 + +헥 +헥 +헥 +헥 +헥 + +헦 +헦 +헦 +헦 +헦 + +헧 +헧 +헧 +헧 +헧 + +헨 +헨 +헨 +헨 +헨 + +헩 +헩 +헩 +헩 +헩 + +헪 +헪 +헪 +헪 +헪 + +헫 +헫 +헫 +헫 +헫 + +헬 +헬 +헬 +헬 +헬 + +헭 +헭 +헭 +헭 +헭 + +헮 +헮 +헮 +헮 +헮 + +헯 +헯 +헯 +헯 +헯 + +헰 +헰 +헰 +헰 +헰 + +헱 +헱 +헱 +헱 +헱 + +헲 +헲 +헲 +헲 +헲 + +헳 +헳 +헳 +헳 +헳 + +헴 +헴 +헴 +헴 +헴 + +헵 +헵 +헵 +헵 +헵 + +헶 +헶 +헶 +헶 +헶 + +헷 +헷 +헷 +헷 +헷 + +헸 +헸 +헸 +헸 +헸 + +헹 +헹 +헹 +헹 +헹 + +헺 +헺 +헺 +헺 +헺 + +헻 +헻 +헻 +헻 +헻 + +헼 +헼 +헼 +헼 +헼 + +헽 +헽 +헽 +헽 +헽 + +헾 +헾 +헾 +헾 +헾 + +헿 +헿 +헿 +헿 +헿 + +혀 +혀 +혀 +혀 +혀 + +혁 +혁 +혁 +혁 +혁 + +혂 +혂 +혂 +혂 +혂 + +혃 +혃 +혃 +혃 +혃 + +현 +현 +현 +현 +현 + +혅 +혅 +혅 +혅 +혅 + +혆 +혆 +혆 +혆 +혆 + +혇 +혇 +혇 +혇 +혇 + +혈 +혈 +혈 +혈 +혈 + +혉 +혉 +혉 +혉 +혉 + +혊 +혊 +혊 +혊 +혊 + +혋 +혋 +혋 +혋 +혋 + +혌 +혌 +혌 +혌 +혌 + +혍 +혍 +혍 +혍 +혍 + +혎 +혎 +혎 +혎 +혎 + +혏 +혏 +혏 +혏 +혏 + +혐 +혐 +혐 +혐 +혐 + +협 +협 +협 +협 +협 + +혒 +혒 +혒 +혒 +혒 + +혓 +혓 +혓 +혓 +혓 + +혔 +혔 +혔 +혔 +혔 + +형 +형 +형 +형 +형 + +혖 +혖 +혖 +혖 +혖 + +혗 +혗 +혗 +혗 +혗 + +혘 +혘 +혘 +혘 +혘 + +혙 +혙 +혙 +혙 +혙 + +혚 +혚 +혚 +혚 +혚 + +혛 +혛 +혛 +혛 +혛 + +혜 +혜 +혜 +혜 +혜 + +혝 +혝 +혝 +혝 +혝 + +혞 +혞 +혞 +혞 +혞 + +혟 +혟 +혟 +혟 +혟 + +혠 +혠 +혠 +혠 +혠 + +혡 +혡 +혡 +혡 +혡 + +혢 +혢 +혢 +혢 +혢 + +혣 +혣 +혣 +혣 +혣 + +혤 +혤 +혤 +혤 +혤 + +혥 +혥 +혥 +혥 +혥 + +혦 +혦 +혦 +혦 +혦 + +혧 +혧 +혧 +혧 +혧 + +혨 +혨 +혨 +혨 +혨 + +혩 +혩 +혩 +혩 +혩 + +혪 +혪 +혪 +혪 +혪 + +혫 +혫 +혫 +혫 +혫 + +혬 +혬 +혬 +혬 +혬 + +혭 +혭 +혭 +혭 +혭 + +혮 +혮 +혮 +혮 +혮 + +혯 +혯 +혯 +혯 +혯 + +혰 +혰 +혰 +혰 +혰 + +혱 +혱 +혱 +혱 +혱 + +혲 +혲 +혲 +혲 +혲 + +혳 +혳 +혳 +혳 +혳 + +혴 +혴 +혴 +혴 +혴 + +혵 +혵 +혵 +혵 +혵 + +혶 +혶 +혶 +혶 +혶 + +혷 +혷 +혷 +혷 +혷 + +호 +호 +호 +호 +호 + +혹 +혹 +혹 +혹 +혹 + +혺 +혺 +혺 +혺 +혺 + +혻 +혻 +혻 +혻 +혻 + +혼 +혼 +혼 +혼 +혼 + +혽 +혽 +혽 +혽 +혽 + +혾 +혾 +혾 +혾 +혾 + +혿 +혿 +혿 +혿 +혿 + +홀 +홀 +홀 +홀 +홀 + +홁 +홁 +홁 +홁 +홁 + +홂 +홂 +홂 +홂 +홂 + +홃 +홃 +홃 +홃 +홃 + +홄 +홄 +홄 +홄 +홄 + +홅 +홅 +홅 +홅 +홅 + +홆 +홆 +홆 +홆 +홆 + +홇 +홇 +홇 +홇 +홇 + +홈 +홈 +홈 +홈 +홈 + +홉 +홉 +홉 +홉 +홉 + +홊 +홊 +홊 +홊 +홊 + +홋 +홋 +홋 +홋 +홋 + +홌 +홌 +홌 +홌 +홌 + +홍 +홍 +홍 +홍 +홍 + +홎 +홎 +홎 +홎 +홎 + +홏 +홏 +홏 +홏 +홏 + +홐 +홐 +홐 +홐 +홐 + +홑 +홑 +홑 +홑 +홑 + +홒 +홒 +홒 +홒 +홒 + +홓 +홓 +홓 +홓 +홓 + +화 +화 +화 +화 +화 + +확 +확 +확 +확 +확 + +홖 +홖 +홖 +홖 +홖 + +홗 +홗 +홗 +홗 +홗 + +환 +환 +환 +환 +환 + +홙 +홙 +홙 +홙 +홙 + +홚 +홚 +홚 +홚 +홚 + +홛 +홛 +홛 +홛 +홛 + +활 +활 +활 +활 +활 + +홝 +홝 +홝 +홝 +홝 + +홞 +홞 +홞 +홞 +홞 + +홟 +홟 +홟 +홟 +홟 + +홠 +홠 +홠 +홠 +홠 + +홡 +홡 +홡 +홡 +홡 + +홢 +홢 +홢 +홢 +홢 + +홣 +홣 +홣 +홣 +홣 + +홤 +홤 +홤 +홤 +홤 + +홥 +홥 +홥 +홥 +홥 + +홦 +홦 +홦 +홦 +홦 + +홧 +홧 +홧 +홧 +홧 + +홨 +홨 +홨 +홨 +홨 + +황 +황 +황 +황 +황 + +홪 +홪 +홪 +홪 +홪 + +홫 +홫 +홫 +홫 +홫 + +홬 +홬 +홬 +홬 +홬 + +홭 +홭 +홭 +홭 +홭 + +홮 +홮 +홮 +홮 +홮 + +홯 +홯 +홯 +홯 +홯 + +홰 +홰 +홰 +홰 +홰 + +홱 +홱 +홱 +홱 +홱 + +홲 +홲 +홲 +홲 +홲 + +홳 +홳 +홳 +홳 +홳 + +홴 +홴 +홴 +홴 +홴 + +홵 +홵 +홵 +홵 +홵 + +홶 +홶 +홶 +홶 +홶 + +홷 +홷 +홷 +홷 +홷 + +홸 +홸 +홸 +홸 +홸 + +홹 +홹 +홹 +홹 +홹 + +홺 +홺 +홺 +홺 +홺 + +홻 +홻 +홻 +홻 +홻 + +홼 +홼 +홼 +홼 +홼 + +홽 +홽 +홽 +홽 +홽 + +홾 +홾 +홾 +홾 +홾 + +홿 +홿 +홿 +홿 +홿 + +횀 +횀 +횀 +횀 +횀 + +횁 +횁 +횁 +횁 +횁 + +횂 +횂 +횂 +횂 +횂 + +횃 +횃 +횃 +횃 +횃 + +횄 +횄 +횄 +횄 +횄 + +횅 +횅 +횅 +횅 +횅 + +횆 +횆 +횆 +횆 +횆 + +횇 +횇 +횇 +횇 +횇 + +횈 +횈 +횈 +횈 +횈 + +횉 +횉 +횉 +횉 +횉 + +횊 +횊 +횊 +횊 +횊 + +횋 +횋 +횋 +횋 +횋 + +회 +회 +회 +회 +회 + +획 +획 +획 +획 +획 + +횎 +횎 +횎 +횎 +횎 + +횏 +횏 +횏 +횏 +횏 + +횐 +횐 +횐 +횐 +횐 + +횑 +횑 +횑 +횑 +횑 + +횒 +횒 +횒 +횒 +횒 + +횓 +횓 +횓 +횓 +횓 + +횔 +횔 +횔 +횔 +횔 + +횕 +횕 +횕 +횕 +횕 + +횖 +횖 +횖 +횖 +횖 + +횗 +횗 +횗 +횗 +횗 + +횘 +횘 +횘 +횘 +횘 + +횙 +횙 +횙 +횙 +횙 + +횚 +횚 +횚 +횚 +횚 + +횛 +횛 +횛 +횛 +횛 + +횜 +횜 +횜 +횜 +횜 + +횝 +횝 +횝 +횝 +횝 + +횞 +횞 +횞 +횞 +횞 + +횟 +횟 +횟 +횟 +횟 + +횠 +횠 +횠 +횠 +횠 + +횡 +횡 +횡 +횡 +횡 + +횢 +횢 +횢 +횢 +횢 + +횣 +횣 +횣 +횣 +횣 + +횤 +횤 +횤 +횤 +횤 + +횥 +횥 +횥 +횥 +횥 + +횦 +횦 +횦 +횦 +횦 + +횧 +횧 +횧 +횧 +횧 + +효 +효 +효 +효 +효 + +횩 +횩 +횩 +횩 +횩 + +횪 +횪 +횪 +횪 +횪 + +횫 +횫 +횫 +횫 +횫 + +횬 +횬 +횬 +횬 +횬 + +횭 +횭 +횭 +횭 +횭 + +횮 +횮 +횮 +횮 +횮 + +횯 +횯 +횯 +횯 +횯 + +횰 +횰 +횰 +횰 +횰 + +횱 +횱 +횱 +횱 +횱 + +횲 +횲 +횲 +횲 +횲 + +횳 +횳 +횳 +횳 +횳 + +횴 +횴 +횴 +횴 +횴 + +횵 +횵 +횵 +횵 +횵 + +횶 +횶 +횶 +횶 +횶 + +횷 +횷 +횷 +횷 +횷 + +횸 +횸 +횸 +횸 +횸 + +횹 +횹 +횹 +횹 +횹 + +횺 +횺 +횺 +횺 +횺 + +횻 +횻 +횻 +횻 +횻 + +횼 +횼 +횼 +횼 +횼 + +횽 +횽 +횽 +횽 +횽 + +횾 +횾 +횾 +횾 +횾 + +횿 +횿 +횿 +횿 +횿 + +훀 +훀 +훀 +훀 +훀 + +훁 +훁 +훁 +훁 +훁 + +훂 +훂 +훂 +훂 +훂 + +훃 +훃 +훃 +훃 +훃 + +후 +후 +후 +후 +후 + +훅 +훅 +훅 +훅 +훅 + +훆 +훆 +훆 +훆 +훆 + +훇 +훇 +훇 +훇 +훇 + +훈 +훈 +훈 +훈 +훈 + +훉 +훉 +훉 +훉 +훉 + +훊 +훊 +훊 +훊 +훊 + +훋 +훋 +훋 +훋 +훋 + +훌 +훌 +훌 +훌 +훌 + +훍 +훍 +훍 +훍 +훍 + +훎 +훎 +훎 +훎 +훎 + +훏 +훏 +훏 +훏 +훏 + +훐 +훐 +훐 +훐 +훐 + +훑 +훑 +훑 +훑 +훑 + +훒 +훒 +훒 +훒 +훒 + +훓 +훓 +훓 +훓 +훓 + +훔 +훔 +훔 +훔 +훔 + +훕 +훕 +훕 +훕 +훕 + +훖 +훖 +훖 +훖 +훖 + +훗 +훗 +훗 +훗 +훗 + +훘 +훘 +훘 +훘 +훘 + +훙 +훙 +훙 +훙 +훙 + +훚 +훚 +훚 +훚 +훚 + +훛 +훛 +훛 +훛 +훛 + +훜 +훜 +훜 +훜 +훜 + +훝 +훝 +훝 +훝 +훝 + +훞 +훞 +훞 +훞 +훞 + +훟 +훟 +훟 +훟 +훟 + +훠 +훠 +훠 +훠 +훠 + +훡 +훡 +훡 +훡 +훡 + +훢 +훢 +훢 +훢 +훢 + +훣 +훣 +훣 +훣 +훣 + +훤 +훤 +훤 +훤 +훤 + +훥 +훥 +훥 +훥 +훥 + +훦 +훦 +훦 +훦 +훦 + +훧 +훧 +훧 +훧 +훧 + +훨 +훨 +훨 +훨 +훨 + +훩 +훩 +훩 +훩 +훩 + +훪 +훪 +훪 +훪 +훪 + +훫 +훫 +훫 +훫 +훫 + +훬 +훬 +훬 +훬 +훬 + +훭 +훭 +훭 +훭 +훭 + +훮 +훮 +훮 +훮 +훮 + +훯 +훯 +훯 +훯 +훯 + +훰 +훰 +훰 +훰 +훰 + +훱 +훱 +훱 +훱 +훱 + +훲 +훲 +훲 +훲 +훲 + +훳 +훳 +훳 +훳 +훳 + +훴 +훴 +훴 +훴 +훴 + +훵 +훵 +훵 +훵 +훵 + +훶 +훶 +훶 +훶 +훶 + +훷 +훷 +훷 +훷 +훷 + +훸 +훸 +훸 +훸 +훸 + +훹 +훹 +훹 +훹 +훹 + +훺 +훺 +훺 +훺 +훺 + +훻 +훻 +훻 +훻 +훻 + +훼 +훼 +훼 +훼 +훼 + +훽 +훽 +훽 +훽 +훽 + +훾 +훾 +훾 +훾 +훾 + +훿 +훿 +훿 +훿 +훿 + +휀 +휀 +휀 +휀 +휀 + +휁 +휁 +휁 +휁 +휁 + +휂 +휂 +휂 +휂 +휂 + +휃 +휃 +휃 +휃 +휃 + +휄 +휄 +휄 +휄 +휄 + +휅 +휅 +휅 +휅 +휅 + +휆 +휆 +휆 +휆 +휆 + +휇 +휇 +휇 +휇 +휇 + +휈 +휈 +휈 +휈 +휈 + +휉 +휉 +휉 +휉 +휉 + +휊 +휊 +휊 +휊 +휊 + +휋 +휋 +휋 +휋 +휋 + +휌 +휌 +휌 +휌 +휌 + +휍 +휍 +휍 +휍 +휍 + +휎 +휎 +휎 +휎 +휎 + +휏 +휏 +휏 +휏 +휏 + +휐 +휐 +휐 +휐 +휐 + +휑 +휑 +휑 +휑 +휑 + +휒 +휒 +휒 +휒 +휒 + +휓 +휓 +휓 +휓 +휓 + +휔 +휔 +휔 +휔 +휔 + +휕 +휕 +휕 +휕 +휕 + +휖 +휖 +휖 +휖 +휖 + +휗 +휗 +휗 +휗 +휗 + +휘 +휘 +휘 +휘 +휘 + +휙 +휙 +휙 +휙 +휙 + +휚 +휚 +휚 +휚 +휚 + +휛 +휛 +휛 +휛 +휛 + +휜 +휜 +휜 +휜 +휜 + +휝 +휝 +휝 +휝 +휝 + +휞 +휞 +휞 +휞 +휞 + +휟 +휟 +휟 +휟 +휟 + +휠 +휠 +휠 +휠 +휠 + +휡 +휡 +휡 +휡 +휡 + +휢 +휢 +휢 +휢 +휢 + +휣 +휣 +휣 +휣 +휣 + +휤 +휤 +휤 +휤 +휤 + +휥 +휥 +휥 +휥 +휥 + +휦 +휦 +휦 +휦 +휦 + +휧 +휧 +휧 +휧 +휧 + +휨 +휨 +휨 +휨 +휨 + +휩 +휩 +휩 +휩 +휩 + +휪 +휪 +휪 +휪 +휪 + +휫 +휫 +휫 +휫 +휫 + +휬 +휬 +휬 +휬 +휬 + +휭 +휭 +휭 +휭 +휭 + +휮 +휮 +휮 +휮 +휮 + +휯 +휯 +휯 +휯 +휯 + +휰 +휰 +휰 +휰 +휰 + +휱 +휱 +휱 +휱 +휱 + +휲 +휲 +휲 +휲 +휲 + +휳 +휳 +휳 +휳 +휳 + +휴 +휴 +휴 +휴 +휴 + +휵 +휵 +휵 +휵 +휵 + +휶 +휶 +휶 +휶 +휶 + +휷 +휷 +휷 +휷 +휷 + +휸 +휸 +휸 +휸 +휸 + +휹 +휹 +휹 +휹 +휹 + +휺 +휺 +휺 +휺 +휺 + +휻 +휻 +휻 +휻 +휻 + +휼 +휼 +휼 +휼 +휼 + +휽 +휽 +휽 +휽 +휽 + +휾 +휾 +휾 +휾 +휾 + +휿 +휿 +휿 +휿 +휿 + +흀 +흀 +흀 +흀 +흀 + +흁 +흁 +흁 +흁 +흁 + +흂 +흂 +흂 +흂 +흂 + +흃 +흃 +흃 +흃 +흃 + +흄 +흄 +흄 +흄 +흄 + +흅 +흅 +흅 +흅 +흅 + +흆 +흆 +흆 +흆 +흆 + +흇 +흇 +흇 +흇 +흇 + +흈 +흈 +흈 +흈 +흈 + +흉 +흉 +흉 +흉 +흉 + +흊 +흊 +흊 +흊 +흊 + +흋 +흋 +흋 +흋 +흋 + +흌 +흌 +흌 +흌 +흌 + +흍 +흍 +흍 +흍 +흍 + +흎 +흎 +흎 +흎 +흎 + +흏 +흏 +흏 +흏 +흏 + +흐 +흐 +흐 +흐 +흐 + +흑 +흑 +흑 +흑 +흑 + +흒 +흒 +흒 +흒 +흒 + +흓 +흓 +흓 +흓 +흓 + +흔 +흔 +흔 +흔 +흔 + +흕 +흕 +흕 +흕 +흕 + +흖 +흖 +흖 +흖 +흖 + +흗 +흗 +흗 +흗 +흗 + +흘 +흘 +흘 +흘 +흘 + +흙 +흙 +흙 +흙 +흙 + +흚 +흚 +흚 +흚 +흚 + +흛 +흛 +흛 +흛 +흛 + +흜 +흜 +흜 +흜 +흜 + +흝 +흝 +흝 +흝 +흝 + +흞 +흞 +흞 +흞 +흞 + +흟 +흟 +흟 +흟 +흟 + +흠 +흠 +흠 +흠 +흠 + +흡 +흡 +흡 +흡 +흡 + +흢 +흢 +흢 +흢 +흢 + +흣 +흣 +흣 +흣 +흣 + +흤 +흤 +흤 +흤 +흤 + +흥 +흥 +흥 +흥 +흥 + +흦 +흦 +흦 +흦 +흦 + +흧 +흧 +흧 +흧 +흧 + +흨 +흨 +흨 +흨 +흨 + +흩 +흩 +흩 +흩 +흩 + +흪 +흪 +흪 +흪 +흪 + +흫 +흫 +흫 +흫 +흫 + +희 +희 +희 +희 +희 + +흭 +흭 +흭 +흭 +흭 + +흮 +흮 +흮 +흮 +흮 + +흯 +흯 +흯 +흯 +흯 + +흰 +흰 +흰 +흰 +흰 + +흱 +흱 +흱 +흱 +흱 + +흲 +흲 +흲 +흲 +흲 + +흳 +흳 +흳 +흳 +흳 + +흴 +흴 +흴 +흴 +흴 + +흵 +흵 +흵 +흵 +흵 + +흶 +흶 +흶 +흶 +흶 + +흷 +흷 +흷 +흷 +흷 + +흸 +흸 +흸 +흸 +흸 + +흹 +흹 +흹 +흹 +흹 + +흺 +흺 +흺 +흺 +흺 + +흻 +흻 +흻 +흻 +흻 + +흼 +흼 +흼 +흼 +흼 + +흽 +흽 +흽 +흽 +흽 + +흾 +흾 +흾 +흾 +흾 + +흿 +흿 +흿 +흿 +흿 + +힀 +힀 +힀 +힀 +힀 + +힁 +힁 +힁 +힁 +힁 + +힂 +힂 +힂 +힂 +힂 + +힃 +힃 +힃 +힃 +힃 + +힄 +힄 +힄 +힄 +힄 + +힅 +힅 +힅 +힅 +힅 + +힆 +힆 +힆 +힆 +힆 + +힇 +힇 +힇 +힇 +힇 + +히 +히 +히 +히 +히 + +힉 +힉 +힉 +힉 +힉 + +힊 +힊 +힊 +힊 +힊 + +힋 +힋 +힋 +힋 +힋 + +힌 +힌 +힌 +힌 +힌 + +힍 +힍 +힍 +힍 +힍 + +힎 +힎 +힎 +힎 +힎 + +힏 +힏 +힏 +힏 +힏 + +힐 +힐 +힐 +힐 +힐 + +힑 +힑 +힑 +힑 +힑 + +힒 +힒 +힒 +힒 +힒 + +힓 +힓 +힓 +힓 +힓 + +힔 +힔 +힔 +힔 +힔 + +힕 +힕 +힕 +힕 +힕 + +힖 +힖 +힖 +힖 +힖 + +힗 +힗 +힗 +힗 +힗 + +힘 +힘 +힘 +힘 +힘 + +힙 +힙 +힙 +힙 +힙 + +힚 +힚 +힚 +힚 +힚 + +힛 +힛 +힛 +힛 +힛 + +힜 +힜 +힜 +힜 +힜 + +힝 +힝 +힝 +힝 +힝 + +힞 +힞 +힞 +힞 +힞 + +힟 +힟 +힟 +힟 +힟 + +힠 +힠 +힠 +힠 +힠 + +힡 +힡 +힡 +힡 +힡 + +힢 +힢 +힢 +힢 +힢 + +힣 +힣 +힣 +힣 +힣 + +豈 +豈 +豈 +豈 +豈 + +更 +更 +更 +更 +更 + +車 +車 +車 +車 +車 + +賈 +賈 +賈 +賈 +賈 + +滑 +滑 +滑 +滑 +滑 + +串 +串 +串 +串 +串 + +句 +句 +句 +句 +句 + +龜 +龜 +龜 +龜 +龜 + +龜 +龜 +龜 +龜 +龜 + +契 +契 +契 +契 +契 + +金 +金 +金 +金 +金 + +喇 +喇 +喇 +喇 +喇 + +奈 +奈 +奈 +奈 +奈 + +懶 +懶 +懶 +懶 +懶 + +癩 +癩 +癩 +癩 +癩 + +羅 +羅 +羅 +羅 +羅 + +蘿 +蘿 +蘿 +蘿 +蘿 + +螺 +螺 +螺 +螺 +螺 + +裸 +裸 +裸 +裸 +裸 + +邏 +邏 +邏 +邏 +邏 + +樂 +樂 +樂 +樂 +樂 + +洛 +洛 +洛 +洛 +洛 + +烙 +烙 +烙 +烙 +烙 + +珞 +珞 +珞 +珞 +珞 + +落 +落 +落 +落 +落 + +酪 +酪 +酪 +酪 +酪 + +駱 +駱 +駱 +駱 +駱 + +亂 +亂 +亂 +亂 +亂 + +卵 +卵 +卵 +卵 +卵 + +欄 +欄 +欄 +欄 +欄 + +爛 +爛 +爛 +爛 +爛 + +蘭 +蘭 +蘭 +蘭 +蘭 + +鸞 +鸞 +鸞 +鸞 +鸞 + +嵐 +嵐 +嵐 +嵐 +嵐 + +濫 +濫 +濫 +濫 +濫 + +藍 +藍 +藍 +藍 +藍 + +襤 +襤 +襤 +襤 +襤 + +拉 +拉 +拉 +拉 +拉 + +臘 +臘 +臘 +臘 +臘 + +蠟 +蠟 +蠟 +蠟 +蠟 + +廊 +廊 +廊 +廊 +廊 + +朗 +朗 +朗 +朗 +朗 + +浪 +浪 +浪 +浪 +浪 + +狼 +狼 +狼 +狼 +狼 + +郎 +郎 +郎 +郎 +郎 + +來 +來 +來 +來 +來 + +冷 +冷 +冷 +冷 +冷 + +勞 +勞 +勞 +勞 +勞 + +擄 +擄 +擄 +擄 +擄 + +櫓 +櫓 +櫓 +櫓 +櫓 + +爐 +爐 +爐 +爐 +爐 + +盧 +盧 +盧 +盧 +盧 + +老 +老 +老 +老 +老 + +蘆 +蘆 +蘆 +蘆 +蘆 + +虜 +虜 +虜 +虜 +虜 + +路 +路 +路 +路 +路 + +露 +露 +露 +露 +露 + +魯 +魯 +魯 +魯 +魯 + +鷺 +鷺 +鷺 +鷺 +鷺 + +碌 +碌 +碌 +碌 +碌 + +祿 +祿 +祿 +祿 +祿 + +綠 +綠 +綠 +綠 +綠 + +菉 +菉 +菉 +菉 +菉 + +錄 +錄 +錄 +錄 +錄 + +鹿 +鹿 +鹿 +鹿 +鹿 + +論 +論 +論 +論 +論 + +壟 +壟 +壟 +壟 +壟 + +弄 +弄 +弄 +弄 +弄 + +籠 +籠 +籠 +籠 +籠 + +聾 +聾 +聾 +聾 +聾 + +牢 +牢 +牢 +牢 +牢 + +磊 +磊 +磊 +磊 +磊 + +賂 +賂 +賂 +賂 +賂 + +雷 +雷 +雷 +雷 +雷 + +壘 +壘 +壘 +壘 +壘 + +屢 +屢 +屢 +屢 +屢 + +樓 +樓 +樓 +樓 +樓 + +淚 +淚 +淚 +淚 +淚 + +漏 +漏 +漏 +漏 +漏 + +累 +累 +累 +累 +累 + +縷 +縷 +縷 +縷 +縷 + +陋 +陋 +陋 +陋 +陋 + +勒 +勒 +勒 +勒 +勒 + +肋 +肋 +肋 +肋 +肋 + +凜 +凜 +凜 +凜 +凜 + +凌 +凌 +凌 +凌 +凌 + +稜 +稜 +稜 +稜 +稜 + +綾 +綾 +綾 +綾 +綾 + +菱 +菱 +菱 +菱 +菱 + +陵 +陵 +陵 +陵 +陵 + +讀 +讀 +讀 +讀 +讀 + +拏 +拏 +拏 +拏 +拏 + +樂 +樂 +樂 +樂 +樂 + +諾 +諾 +諾 +諾 +諾 + +丹 +丹 +丹 +丹 +丹 + +寧 +寧 +寧 +寧 +寧 + +怒 +怒 +怒 +怒 +怒 + +率 +率 +率 +率 +率 + +異 +異 +異 +異 +異 + +北 +北 +北 +北 +北 + +磻 +磻 +磻 +磻 +磻 + +便 +便 +便 +便 +便 + +復 +復 +復 +復 +復 + +不 +不 +不 +不 +不 + +泌 +泌 +泌 +泌 +泌 + +數 +數 +數 +數 +數 + +索 +索 +索 +索 +索 + +參 +參 +參 +參 +參 + +塞 +塞 +塞 +塞 +塞 + +省 +省 +省 +省 +省 + +葉 +葉 +葉 +葉 +葉 + +說 +說 +說 +說 +說 + +殺 +殺 +殺 +殺 +殺 + +辰 +辰 +辰 +辰 +辰 + +沈 +沈 +沈 +沈 +沈 + +拾 +拾 +拾 +拾 +拾 + +若 +若 +若 +若 +若 + +掠 +掠 +掠 +掠 +掠 + +略 +略 +略 +略 +略 + +亮 +亮 +亮 +亮 +亮 + +兩 +兩 +兩 +兩 +兩 + +凉 +凉 +凉 +凉 +凉 + +梁 +梁 +梁 +梁 +梁 + +糧 +糧 +糧 +糧 +糧 + +良 +良 +良 +良 +良 + +諒 +諒 +諒 +諒 +諒 + +量 +量 +量 +量 +量 + +勵 +勵 +勵 +勵 +勵 + +呂 +呂 +呂 +呂 +呂 + +女 +女 +女 +女 +女 + +廬 +廬 +廬 +廬 +廬 + +旅 +旅 +旅 +旅 +旅 + +濾 +濾 +濾 +濾 +濾 + +礪 +礪 +礪 +礪 +礪 + +閭 +閭 +閭 +閭 +閭 + +驪 +驪 +驪 +驪 +驪 + +麗 +麗 +麗 +麗 +麗 + +黎 +黎 +黎 +黎 +黎 + +力 +力 +力 +力 +力 + +曆 +曆 +曆 +曆 +曆 + +歷 +歷 +歷 +歷 +歷 + +轢 +轢 +轢 +轢 +轢 + +年 +年 +年 +年 +年 + +憐 +憐 +憐 +憐 +憐 + +戀 +戀 +戀 +戀 +戀 + +撚 +撚 +撚 +撚 +撚 + +漣 +漣 +漣 +漣 +漣 + +煉 +煉 +煉 +煉 +煉 + +璉 +璉 +璉 +璉 +璉 + +秊 +秊 +秊 +秊 +秊 + +練 +練 +練 +練 +練 + +聯 +聯 +聯 +聯 +聯 + +輦 +輦 +輦 +輦 +輦 + +蓮 +蓮 +蓮 +蓮 +蓮 + +連 +連 +連 +連 +連 + +鍊 +鍊 +鍊 +鍊 +鍊 + +列 +列 +列 +列 +列 + +劣 +劣 +劣 +劣 +劣 + +咽 +咽 +咽 +咽 +咽 + +烈 +烈 +烈 +烈 +烈 + +裂 +裂 +裂 +裂 +裂 + +說 +說 +說 +說 +說 + +廉 +廉 +廉 +廉 +廉 + +念 +念 +念 +念 +念 + +捻 +捻 +捻 +捻 +捻 + +殮 +殮 +殮 +殮 +殮 + +簾 +簾 +簾 +簾 +簾 + +獵 +獵 +獵 +獵 +獵 + +令 +令 +令 +令 +令 + +囹 +囹 +囹 +囹 +囹 + +寧 +寧 +寧 +寧 +寧 + +嶺 +嶺 +嶺 +嶺 +嶺 + +怜 +怜 +怜 +怜 +怜 + +玲 +玲 +玲 +玲 +玲 + +瑩 +瑩 +瑩 +瑩 +瑩 + +羚 +羚 +羚 +羚 +羚 + +聆 +聆 +聆 +聆 +聆 + +鈴 +鈴 +鈴 +鈴 +鈴 + +零 +零 +零 +零 +零 + +靈 +靈 +靈 +靈 +靈 + +領 +領 +領 +領 +領 + +例 +例 +例 +例 +例 + +禮 +禮 +禮 +禮 +禮 + +醴 +醴 +醴 +醴 +醴 + +隸 +隸 +隸 +隸 +隸 + +惡 +惡 +惡 +惡 +惡 + +了 +了 +了 +了 +了 + +僚 +僚 +僚 +僚 +僚 + +寮 +寮 +寮 +寮 +寮 + +尿 +尿 +尿 +尿 +尿 + +料 +料 +料 +料 +料 + +樂 +樂 +樂 +樂 +樂 + +燎 +燎 +燎 +燎 +燎 + +療 +療 +療 +療 +療 + +蓼 +蓼 +蓼 +蓼 +蓼 + +遼 +遼 +遼 +遼 +遼 + +龍 +龍 +龍 +龍 +龍 + +暈 +暈 +暈 +暈 +暈 + +阮 +阮 +阮 +阮 +阮 + +劉 +劉 +劉 +劉 +劉 + +杻 +杻 +杻 +杻 +杻 + +柳 +柳 +柳 +柳 +柳 + +流 +流 +流 +流 +流 + +溜 +溜 +溜 +溜 +溜 + +琉 +琉 +琉 +琉 +琉 + +留 +留 +留 +留 +留 + +硫 +硫 +硫 +硫 +硫 + +紐 +紐 +紐 +紐 +紐 + +類 +類 +類 +類 +類 + +六 +六 +六 +六 +六 + +戮 +戮 +戮 +戮 +戮 + +陸 +陸 +陸 +陸 +陸 + +倫 +倫 +倫 +倫 +倫 + +崙 +崙 +崙 +崙 +崙 + +淪 +淪 +淪 +淪 +淪 + +輪 +輪 +輪 +輪 +輪 + +律 +律 +律 +律 +律 + +慄 +慄 +慄 +慄 +慄 + +栗 +栗 +栗 +栗 +栗 + +率 +率 +率 +率 +率 + +隆 +隆 +隆 +隆 +隆 + +利 +利 +利 +利 +利 + +吏 +吏 +吏 +吏 +吏 + +履 +履 +履 +履 +履 + +易 +易 +易 +易 +易 + +李 +李 +李 +李 +李 + +梨 +梨 +梨 +梨 +梨 + +泥 +泥 +泥 +泥 +泥 + +理 +理 +理 +理 +理 + +痢 +痢 +痢 +痢 +痢 + +罹 +罹 +罹 +罹 +罹 + +裏 +裏 +裏 +裏 +裏 + +裡 +裡 +裡 +裡 +裡 + +里 +里 +里 +里 +里 + +離 +離 +離 +離 +離 + +匿 +匿 +匿 +匿 +匿 + +溺 +溺 +溺 +溺 +溺 + +吝 +吝 +吝 +吝 +吝 + +燐 +燐 +燐 +燐 +燐 + +璘 +璘 +璘 +璘 +璘 + +藺 +藺 +藺 +藺 +藺 + +隣 +隣 +隣 +隣 +隣 + +鱗 +鱗 +鱗 +鱗 +鱗 + +麟 +麟 +麟 +麟 +麟 + +林 +林 +林 +林 +林 + +淋 +淋 +淋 +淋 +淋 + +臨 +臨 +臨 +臨 +臨 + +立 +立 +立 +立 +立 + +笠 +笠 +笠 +笠 +笠 + +粒 +粒 +粒 +粒 +粒 + +狀 +狀 +狀 +狀 +狀 + +炙 +炙 +炙 +炙 +炙 + +識 +識 +識 +識 +識 + +什 +什 +什 +什 +什 + +茶 +茶 +茶 +茶 +茶 + +刺 +刺 +刺 +刺 +刺 + +切 +切 +切 +切 +切 + +度 +度 +度 +度 +度 + +拓 +拓 +拓 +拓 +拓 + +糖 +糖 +糖 +糖 +糖 + +宅 +宅 +宅 +宅 +宅 + +洞 +洞 +洞 +洞 +洞 + +暴 +暴 +暴 +暴 +暴 + +輻 +輻 +輻 +輻 +輻 + +行 +行 +行 +行 +行 + +降 +降 +降 +降 +降 + +見 +見 +見 +見 +見 + +廓 +廓 +廓 +廓 +廓 + +兀 +兀 +兀 +兀 +兀 + +嗀 +嗀 +嗀 +嗀 +嗀 + +塚 +塚 +塚 +塚 +塚 + +晴 +晴 +晴 +晴 +晴 + +凞 +凞 +凞 +凞 +凞 + +猪 +猪 +猪 +猪 +猪 + +益 +益 +益 +益 +益 + +礼 +礼 +礼 +礼 +礼 + +神 +神 +神 +神 +神 + +祥 +祥 +祥 +祥 +祥 + +福 +福 +福 +福 +福 + +靖 +靖 +靖 +靖 +靖 + +精 +精 +精 +精 +精 + +羽 +羽 +羽 +羽 +羽 + +蘒 +蘒 +蘒 +蘒 +蘒 + +諸 +諸 +諸 +諸 +諸 + +逸 +逸 +逸 +逸 +逸 + +都 +都 +都 +都 +都 + +飯 +飯 +飯 +飯 +飯 + +飼 +飼 +飼 +飼 +飼 + +館 +館 +館 +館 +館 + +鶴 +鶴 +鶴 +鶴 +鶴 + +侮 +侮 +侮 +侮 +侮 + +僧 +僧 +僧 +僧 +僧 + +免 +免 +免 +免 +免 + +勉 +勉 +勉 +勉 +勉 + +勤 +勤 +勤 +勤 +勤 + +卑 +卑 +卑 +卑 +卑 + +喝 +喝 +喝 +喝 +喝 + +嘆 +嘆 +嘆 +嘆 +嘆 + +器 +器 +器 +器 +器 + +塀 +塀 +塀 +塀 +塀 + +墨 +墨 +墨 +墨 +墨 + +層 +層 +層 +層 +層 + +屮 +屮 +屮 +屮 +屮 + +悔 +悔 +悔 +悔 +悔 + +慨 +慨 +慨 +慨 +慨 + +憎 +憎 +憎 +憎 +憎 + +懲 +懲 +懲 +懲 +懲 + +敏 +敏 +敏 +敏 +敏 + +既 +既 +既 +既 +既 + +暑 +暑 +暑 +暑 +暑 + +梅 +梅 +梅 +梅 +梅 + +海 +海 +海 +海 +海 + +渚 +渚 +渚 +渚 +渚 + +漢 +漢 +漢 +漢 +漢 + +煮 +煮 +煮 +煮 +煮 + +爫 +爫 +爫 +爫 +爫 + +琢 +琢 +琢 +琢 +琢 + +碑 +碑 +碑 +碑 +碑 + +社 +社 +社 +社 +社 + +祉 +祉 +祉 +祉 +祉 + +祈 +祈 +祈 +祈 +祈 + +祐 +祐 +祐 +祐 +祐 + +祖 +祖 +祖 +祖 +祖 + +祝 +祝 +祝 +祝 +祝 + +禍 +禍 +禍 +禍 +禍 + +禎 +禎 +禎 +禎 +禎 + +穀 +穀 +穀 +穀 +穀 + +突 +突 +突 +突 +突 + +節 +節 +節 +節 +節 + +練 +練 +練 +練 +練 + +縉 +縉 +縉 +縉 +縉 + +繁 +繁 +繁 +繁 +繁 + +署 +署 +署 +署 +署 + +者 +者 +者 +者 +者 + +臭 +臭 +臭 +臭 +臭 + +艹 +艹 +艹 +艹 +艹 + +艹 +艹 +艹 +艹 +艹 + +著 +著 +著 +著 +著 + +褐 +褐 +褐 +褐 +褐 + +視 +視 +視 +視 +視 + +謁 +謁 +謁 +謁 +謁 + +謹 +謹 +謹 +謹 +謹 + +賓 +賓 +賓 +賓 +賓 + +贈 +贈 +贈 +贈 +贈 + +辶 +辶 +辶 +辶 +辶 + +逸 +逸 +逸 +逸 +逸 + +難 +難 +難 +難 +難 + +響 +響 +響 +響 +響 + +頻 +頻 +頻 +頻 +頻 + +恵 +恵 +恵 +恵 +恵 + +𤋮 +𤋮 +𤋮 +𤋮 +𤋮 + +舘 +舘 +舘 +舘 +舘 + +並 +並 +並 +並 +並 + +况 +况 +况 +况 +况 + +全 +全 +全 +全 +全 + +侀 +侀 +侀 +侀 +侀 + +充 +充 +充 +充 +充 + +冀 +冀 +冀 +冀 +冀 + +勇 +勇 +勇 +勇 +勇 + +勺 +勺 +勺 +勺 +勺 + +喝 +喝 +喝 +喝 +喝 + +啕 +啕 +啕 +啕 +啕 + +喙 +喙 +喙 +喙 +喙 + +嗢 +嗢 +嗢 +嗢 +嗢 + +塚 +塚 +塚 +塚 +塚 + +墳 +墳 +墳 +墳 +墳 + +奄 +奄 +奄 +奄 +奄 + +奔 +奔 +奔 +奔 +奔 + +婢 +婢 +婢 +婢 +婢 + +嬨 +嬨 +嬨 +嬨 +嬨 + +廒 +廒 +廒 +廒 +廒 + +廙 +廙 +廙 +廙 +廙 + +彩 +彩 +彩 +彩 +彩 + +徭 +徭 +徭 +徭 +徭 + +惘 +惘 +惘 +惘 +惘 + +慎 +慎 +慎 +慎 +慎 + +愈 +愈 +愈 +愈 +愈 + +憎 +憎 +憎 +憎 +憎 + +慠 +慠 +慠 +慠 +慠 + +懲 +懲 +懲 +懲 +懲 + +戴 +戴 +戴 +戴 +戴 + +揄 +揄 +揄 +揄 +揄 + +搜 +搜 +搜 +搜 +搜 + +摒 +摒 +摒 +摒 +摒 + +敖 +敖 +敖 +敖 +敖 + +晴 +晴 +晴 +晴 +晴 + +朗 +朗 +朗 +朗 +朗 + +望 +望 +望 +望 +望 + +杖 +杖 +杖 +杖 +杖 + +歹 +歹 +歹 +歹 +歹 + +殺 +殺 +殺 +殺 +殺 + +流 +流 +流 +流 +流 + +滛 +滛 +滛 +滛 +滛 + +滋 +滋 +滋 +滋 +滋 + +漢 +漢 +漢 +漢 +漢 + +瀞 +瀞 +瀞 +瀞 +瀞 + +煮 +煮 +煮 +煮 +煮 + +瞧 +瞧 +瞧 +瞧 +瞧 + +爵 +爵 +爵 +爵 +爵 + +犯 +犯 +犯 +犯 +犯 + +猪 +猪 +猪 +猪 +猪 + +瑱 +瑱 +瑱 +瑱 +瑱 + +甆 +甆 +甆 +甆 +甆 + +画 +画 +画 +画 +画 + +瘝 +瘝 +瘝 +瘝 +瘝 + +瘟 +瘟 +瘟 +瘟 +瘟 + +益 +益 +益 +益 +益 + +盛 +盛 +盛 +盛 +盛 + +直 +直 +直 +直 +直 + +睊 +睊 +睊 +睊 +睊 + +着 +着 +着 +着 +着 + +磌 +磌 +磌 +磌 +磌 + +窱 +窱 +窱 +窱 +窱 + +節 +節 +節 +節 +節 + +类 +类 +类 +类 +类 + +絛 +絛 +絛 +絛 +絛 + +練 +練 +練 +練 +練 + +缾 +缾 +缾 +缾 +缾 + +者 +者 +者 +者 +者 + +荒 +荒 +荒 +荒 +荒 + +華 +華 +華 +華 +華 + +蝹 +蝹 +蝹 +蝹 +蝹 + +襁 +襁 +襁 +襁 +襁 + +覆 +覆 +覆 +覆 +覆 + +視 +視 +視 +視 +視 + +調 +調 +調 +調 +調 + +諸 +諸 +諸 +諸 +諸 + +請 +請 +請 +請 +請 + +謁 +謁 +謁 +謁 +謁 + +諾 +諾 +諾 +諾 +諾 + +諭 +諭 +諭 +諭 +諭 + +謹 +謹 +謹 +謹 +謹 + +變 +變 +變 +變 +變 + +贈 +贈 +贈 +贈 +贈 + +輸 +輸 +輸 +輸 +輸 + +遲 +遲 +遲 +遲 +遲 + +醙 +醙 +醙 +醙 +醙 + +鉶 +鉶 +鉶 +鉶 +鉶 + +陼 +陼 +陼 +陼 +陼 + +難 +難 +難 +難 +難 + +靖 +靖 +靖 +靖 +靖 + +韛 +韛 +韛 +韛 +韛 + +響 +響 +響 +響 +響 + +頋 +頋 +頋 +頋 +頋 + +頻 +頻 +頻 +頻 +頻 + +鬒 +鬒 +鬒 +鬒 +鬒 + +龜 +龜 +龜 +龜 +龜 + +𢡊 +𢡊 +𢡊 +𢡊 +𢡊 + +𢡄 +𢡄 +𢡄 +𢡄 +𢡄 + +𣏕 +𣏕 +𣏕 +𣏕 +𣏕 + +㮝 +㮝 +㮝 +㮝 +㮝 + +䀘 +䀘 +䀘 +䀘 +䀘 + +䀹 +䀹 +䀹 +䀹 +䀹 + +𥉉 +𥉉 +𥉉 +𥉉 +𥉉 + +𥳐 +𥳐 +𥳐 +𥳐 +𥳐 + +𧻓 +𧻓 +𧻓 +𧻓 +𧻓 + +齃 +齃 +齃 +齃 +齃 + +龎 +龎 +龎 +龎 +龎 + +ff +ff +ff +ff +ff + +fi +fi +fi +fi +fi + +fl +fl +fl +fl +fl + +ffi +ffi +ffi +ffi +ffi + +ffl +ffl +ffl +ffl +ffl + +ſt +ſt +ſt +st +st + +st +st +st +st +st + +ﬓ +ﬓ +ﬓ +մն +մն + +ﬔ +ﬔ +ﬔ +մե +մե + +ﬕ +ﬕ +ﬕ +մի +մի + +ﬖ +ﬖ +ﬖ +վն +վն + +ﬗ +ﬗ +ﬗ +մխ +մխ + +יִ +יִ +יִ +יִ +יִ + +ײַ +ײַ +ײַ +ײַ +ײַ + +ﬠ +ﬠ +ﬠ +ע +ע + +ﬡ +ﬡ +ﬡ +א +א + +ﬢ +ﬢ +ﬢ +ד +ד + +ﬣ +ﬣ +ﬣ +ה +ה + +ﬤ +ﬤ +ﬤ +כ +כ + +ﬥ +ﬥ +ﬥ +ל +ל + +ﬦ +ﬦ +ﬦ +ם +ם + +ﬧ +ﬧ +ﬧ +ר +ר + +ﬨ +ﬨ +ﬨ +ת +ת + +﬩ +﬩ +﬩ ++ ++ + +שׁ +שׁ +שׁ +שׁ +שׁ + +שׂ +שׂ +שׂ +שׂ +שׂ + +שּׁ +שּׁ +שּׁ +שּׁ +שּׁ + +שּׂ +שּׂ +שּׂ +שּׂ +שּׂ + +אַ +אַ +אַ +אַ +אַ + +אָ +אָ +אָ +אָ +אָ + +אּ +אּ +אּ +אּ +אּ + +בּ +בּ +בּ +בּ +בּ + +גּ +גּ +גּ +גּ +גּ + +דּ +דּ +דּ +דּ +דּ + +הּ +הּ +הּ +הּ +הּ + +וּ +וּ +וּ +וּ +וּ + +זּ +זּ +זּ +זּ +זּ + +טּ +טּ +טּ +טּ +טּ + +יּ +יּ +יּ +יּ +יּ + +ךּ +ךּ +ךּ +ךּ +ךּ + +כּ +כּ +כּ +כּ +כּ + +לּ +לּ +לּ +לּ +לּ + +מּ +מּ +מּ +מּ +מּ + +נּ +נּ +נּ +נּ +נּ + +סּ +סּ +סּ +סּ +סּ + +ףּ +ףּ +ףּ +ףּ +ףּ + +פּ +פּ +פּ +פּ +פּ + +צּ +צּ +צּ +צּ +צּ + +קּ +קּ +קּ +קּ +קּ + +רּ +רּ +רּ +רּ +רּ + +שּ +שּ +שּ +שּ +שּ + +תּ +תּ +תּ +תּ +תּ + +וֹ +וֹ +וֹ +וֹ +וֹ + +בֿ +בֿ +בֿ +בֿ +בֿ + +כֿ +כֿ +כֿ +כֿ +כֿ + +פֿ +פֿ +פֿ +פֿ +פֿ + +ﭏ +ﭏ +ﭏ +אל +אל + +ﭐ +ﭐ +ﭐ +ٱ +ٱ + +ﭑ +ﭑ +ﭑ +ٱ +ٱ + +ﭒ +ﭒ +ﭒ +ٻ +ٻ + +ﭓ +ﭓ +ﭓ +ٻ +ٻ + +ﭔ +ﭔ +ﭔ +ٻ +ٻ + +ﭕ +ﭕ +ﭕ +ٻ +ٻ + +ﭖ +ﭖ +ﭖ +پ +پ + +ﭗ +ﭗ +ﭗ +پ +پ + +ﭘ +ﭘ +ﭘ +پ +پ + +ﭙ +ﭙ +ﭙ +پ +پ + +ﭚ +ﭚ +ﭚ +ڀ +ڀ + +ﭛ +ﭛ +ﭛ +ڀ +ڀ + +ﭜ +ﭜ +ﭜ +ڀ +ڀ + +ﭝ +ﭝ +ﭝ +ڀ +ڀ + +ﭞ +ﭞ +ﭞ +ٺ +ٺ + +ﭟ +ﭟ +ﭟ +ٺ +ٺ + +ﭠ +ﭠ +ﭠ +ٺ +ٺ + +ﭡ +ﭡ +ﭡ +ٺ +ٺ + +ﭢ +ﭢ +ﭢ +ٿ +ٿ + +ﭣ +ﭣ +ﭣ +ٿ +ٿ + +ﭤ +ﭤ +ﭤ +ٿ +ٿ + +ﭥ +ﭥ +ﭥ +ٿ +ٿ + +ﭦ +ﭦ +ﭦ +ٹ +ٹ + +ﭧ +ﭧ +ﭧ +ٹ +ٹ + +ﭨ +ﭨ +ﭨ +ٹ +ٹ + +ﭩ +ﭩ +ﭩ +ٹ +ٹ + +ﭪ +ﭪ +ﭪ +ڤ +ڤ + +ﭫ +ﭫ +ﭫ +ڤ +ڤ + +ﭬ +ﭬ +ﭬ +ڤ +ڤ + +ﭭ +ﭭ +ﭭ +ڤ +ڤ + +ﭮ +ﭮ +ﭮ +ڦ +ڦ + +ﭯ +ﭯ +ﭯ +ڦ +ڦ + +ﭰ +ﭰ +ﭰ +ڦ +ڦ + +ﭱ +ﭱ +ﭱ +ڦ +ڦ + +ﭲ +ﭲ +ﭲ +ڄ +ڄ + +ﭳ +ﭳ +ﭳ +ڄ +ڄ + +ﭴ +ﭴ +ﭴ +ڄ +ڄ + +ﭵ +ﭵ +ﭵ +ڄ +ڄ + +ﭶ +ﭶ +ﭶ +ڃ +ڃ + +ﭷ +ﭷ +ﭷ +ڃ +ڃ + +ﭸ +ﭸ +ﭸ +ڃ +ڃ + +ﭹ +ﭹ +ﭹ +ڃ +ڃ + +ﭺ +ﭺ +ﭺ +چ +چ + +ﭻ +ﭻ +ﭻ +چ +چ + +ﭼ +ﭼ +ﭼ +چ +چ + +ﭽ +ﭽ +ﭽ +چ +چ + +ﭾ +ﭾ +ﭾ +ڇ +ڇ + +ﭿ +ﭿ +ﭿ +ڇ +ڇ + +ﮀ +ﮀ +ﮀ +ڇ +ڇ + +ﮁ +ﮁ +ﮁ +ڇ +ڇ + +ﮂ +ﮂ +ﮂ +ڍ +ڍ + +ﮃ +ﮃ +ﮃ +ڍ +ڍ + +ﮄ +ﮄ +ﮄ +ڌ +ڌ + +ﮅ +ﮅ +ﮅ +ڌ +ڌ + +ﮆ +ﮆ +ﮆ +ڎ +ڎ + +ﮇ +ﮇ +ﮇ +ڎ +ڎ + +ﮈ +ﮈ +ﮈ +ڈ +ڈ + +ﮉ +ﮉ +ﮉ +ڈ +ڈ + +ﮊ +ﮊ +ﮊ +ژ +ژ + +ﮋ +ﮋ +ﮋ +ژ +ژ + +ﮌ +ﮌ +ﮌ +ڑ +ڑ + +ﮍ +ﮍ +ﮍ +ڑ +ڑ + +ﮎ +ﮎ +ﮎ +ک +ک + +ﮏ +ﮏ +ﮏ +ک +ک + +ﮐ +ﮐ +ﮐ +ک +ک + +ﮑ +ﮑ +ﮑ +ک +ک + +ﮒ +ﮒ +ﮒ +گ +گ + +ﮓ +ﮓ +ﮓ +گ +گ + +ﮔ +ﮔ +ﮔ +گ +گ + +ﮕ +ﮕ +ﮕ +گ +گ + +ﮖ +ﮖ +ﮖ +ڳ +ڳ + +ﮗ +ﮗ +ﮗ +ڳ +ڳ + +ﮘ +ﮘ +ﮘ +ڳ +ڳ + +ﮙ +ﮙ +ﮙ +ڳ +ڳ + +ﮚ +ﮚ +ﮚ +ڱ +ڱ + +ﮛ +ﮛ +ﮛ +ڱ +ڱ + +ﮜ +ﮜ +ﮜ +ڱ +ڱ + +ﮝ +ﮝ +ﮝ +ڱ +ڱ + +ﮞ +ﮞ +ﮞ +ں +ں + +ﮟ +ﮟ +ﮟ +ں +ں + +ﮠ +ﮠ +ﮠ +ڻ +ڻ + +ﮡ +ﮡ +ﮡ +ڻ +ڻ + +ﮢ +ﮢ +ﮢ +ڻ +ڻ + +ﮣ +ﮣ +ﮣ +ڻ +ڻ + +ﮤ +ﮤ +ﮤ +ۀ +ۀ + +ﮥ +ﮥ +ﮥ +ۀ +ۀ + +ﮦ +ﮦ +ﮦ +ہ +ہ + +ﮧ +ﮧ +ﮧ +ہ +ہ + +ﮨ +ﮨ +ﮨ +ہ +ہ + +ﮩ +ﮩ +ﮩ +ہ +ہ + +ﮪ +ﮪ +ﮪ +ھ +ھ + +ﮫ +ﮫ +ﮫ +ھ +ھ + +ﮬ +ﮬ +ﮬ +ھ +ھ + +ﮭ +ﮭ +ﮭ +ھ +ھ + +ﮮ +ﮮ +ﮮ +ے +ے + +ﮯ +ﮯ +ﮯ +ے +ے + +ﮰ +ﮰ +ﮰ +ۓ +ۓ + +ﮱ +ﮱ +ﮱ +ۓ +ۓ + +ﯓ +ﯓ +ﯓ +ڭ +ڭ + +ﯔ +ﯔ +ﯔ +ڭ +ڭ + +ﯕ +ﯕ +ﯕ +ڭ +ڭ + +ﯖ +ﯖ +ﯖ +ڭ +ڭ + +ﯗ +ﯗ +ﯗ +ۇ +ۇ + +ﯘ +ﯘ +ﯘ +ۇ +ۇ + +ﯙ +ﯙ +ﯙ +ۆ +ۆ + +ﯚ +ﯚ +ﯚ +ۆ +ۆ + +ﯛ +ﯛ +ﯛ +ۈ +ۈ + +ﯜ +ﯜ +ﯜ +ۈ +ۈ + +ﯝ +ﯝ +ﯝ +ۇٴ +ۇٴ + +ﯞ +ﯞ +ﯞ +ۋ +ۋ + +ﯟ +ﯟ +ﯟ +ۋ +ۋ + +ﯠ +ﯠ +ﯠ +ۅ +ۅ + +ﯡ +ﯡ +ﯡ +ۅ +ۅ + +ﯢ +ﯢ +ﯢ +ۉ +ۉ + +ﯣ +ﯣ +ﯣ +ۉ +ۉ + +ﯤ +ﯤ +ﯤ +ې +ې + +ﯥ +ﯥ +ﯥ +ې +ې + +ﯦ +ﯦ +ﯦ +ې +ې + +ﯧ +ﯧ +ﯧ +ې +ې + +ﯨ +ﯨ +ﯨ +ى +ى + +ﯩ +ﯩ +ﯩ +ى +ى + +ﯪ +ﯪ +ﯪ +ئا +ئا + +ﯫ +ﯫ +ﯫ +ئا +ئا + +ﯬ +ﯬ +ﯬ +ئە +ئە + +ﯭ +ﯭ +ﯭ +ئە +ئە + +ﯮ +ﯮ +ﯮ +ئو +ئو + +ﯯ +ﯯ +ﯯ +ئو +ئو + +ﯰ +ﯰ +ﯰ +ئۇ +ئۇ + +ﯱ +ﯱ +ﯱ +ئۇ +ئۇ + +ﯲ +ﯲ +ﯲ +ئۆ +ئۆ + +ﯳ +ﯳ +ﯳ +ئۆ +ئۆ + +ﯴ +ﯴ +ﯴ +ئۈ +ئۈ + +ﯵ +ﯵ +ﯵ +ئۈ +ئۈ + +ﯶ +ﯶ +ﯶ +ئې +ئې + +ﯷ +ﯷ +ﯷ +ئې +ئې + +ﯸ +ﯸ +ﯸ +ئې +ئې + +ﯹ +ﯹ +ﯹ +ئى +ئى + +ﯺ +ﯺ +ﯺ +ئى +ئى + +ﯻ +ﯻ +ﯻ +ئى +ئى + +ﯼ +ﯼ +ﯼ +ی +ی + +ﯽ +ﯽ +ﯽ +ی +ی + +ﯾ +ﯾ +ﯾ +ی +ی + +ﯿ +ﯿ +ﯿ +ی +ی + +ﰀ +ﰀ +ﰀ +ئج +ئج + +ﰁ +ﰁ +ﰁ +ئح +ئح + +ﰂ +ﰂ +ﰂ +ئم +ئم + +ﰃ +ﰃ +ﰃ +ئى +ئى + +ﰄ +ﰄ +ﰄ +ئي +ئي + +ﰅ +ﰅ +ﰅ +بج +بج + +ﰆ +ﰆ +ﰆ +بح +بح + +ﰇ +ﰇ +ﰇ +بخ +بخ + +ﰈ +ﰈ +ﰈ +بم +بم + +ﰉ +ﰉ +ﰉ +بى +بى + +ﰊ +ﰊ +ﰊ +بي +بي + +ﰋ +ﰋ +ﰋ +تج +تج + +ﰌ +ﰌ +ﰌ +تح +تح + +ﰍ +ﰍ +ﰍ +تخ +تخ + +ﰎ +ﰎ +ﰎ +تم +تم + +ﰏ +ﰏ +ﰏ +تى +تى + +ﰐ +ﰐ +ﰐ +تي +تي + +ﰑ +ﰑ +ﰑ +ثج +ثج + +ﰒ +ﰒ +ﰒ +ثم +ثم + +ﰓ +ﰓ +ﰓ +ثى +ثى + +ﰔ +ﰔ +ﰔ +ثي +ثي + +ﰕ +ﰕ +ﰕ +جح +جح + +ﰖ +ﰖ +ﰖ +جم +جم + +ﰗ +ﰗ +ﰗ +حج +حج + +ﰘ +ﰘ +ﰘ +حم +حم + +ﰙ +ﰙ +ﰙ +خج +خج + +ﰚ +ﰚ +ﰚ +خح +خح + +ﰛ +ﰛ +ﰛ +خم +خم + +ﰜ +ﰜ +ﰜ +سج +سج + +ﰝ +ﰝ +ﰝ +سح +سح + +ﰞ +ﰞ +ﰞ +سخ +سخ + +ﰟ +ﰟ +ﰟ +سم +سم + +ﰠ +ﰠ +ﰠ +صح +صح + +ﰡ +ﰡ +ﰡ +صم +صم + +ﰢ +ﰢ +ﰢ +ضج +ضج + +ﰣ +ﰣ +ﰣ +ضح +ضح + +ﰤ +ﰤ +ﰤ +ضخ +ضخ + +ﰥ +ﰥ +ﰥ +ضم +ضم + +ﰦ +ﰦ +ﰦ +طح +طح + +ﰧ +ﰧ +ﰧ +طم +طم + +ﰨ +ﰨ +ﰨ +ظم +ظم + +ﰩ +ﰩ +ﰩ +عج +عج + +ﰪ +ﰪ +ﰪ +عم +عم + +ﰫ +ﰫ +ﰫ +غج +غج + +ﰬ +ﰬ +ﰬ +غم +غم + +ﰭ +ﰭ +ﰭ +فج +فج + +ﰮ +ﰮ +ﰮ +فح +فح + +ﰯ +ﰯ +ﰯ +فخ +فخ + +ﰰ +ﰰ +ﰰ +فم +فم + +ﰱ +ﰱ +ﰱ +فى +فى + +ﰲ +ﰲ +ﰲ +في +في + +ﰳ +ﰳ +ﰳ +قح +قح + +ﰴ +ﰴ +ﰴ +قم +قم + +ﰵ +ﰵ +ﰵ +قى +قى + +ﰶ +ﰶ +ﰶ +قي +قي + +ﰷ +ﰷ +ﰷ +كا +كا + +ﰸ +ﰸ +ﰸ +كج +كج + +ﰹ +ﰹ +ﰹ +كح +كح + +ﰺ +ﰺ +ﰺ +كخ +كخ + +ﰻ +ﰻ +ﰻ +كل +كل + +ﰼ +ﰼ +ﰼ +كم +كم + +ﰽ +ﰽ +ﰽ +كى +كى + +ﰾ +ﰾ +ﰾ +كي +كي + +ﰿ +ﰿ +ﰿ +لج +لج + +ﱀ +ﱀ +ﱀ +لح +لح + +ﱁ +ﱁ +ﱁ +لخ +لخ + +ﱂ +ﱂ +ﱂ +لم +لم + +ﱃ +ﱃ +ﱃ +لى +لى + +ﱄ +ﱄ +ﱄ +لي +لي + +ﱅ +ﱅ +ﱅ +مج +مج + +ﱆ +ﱆ +ﱆ +مح +مح + +ﱇ +ﱇ +ﱇ +مخ +مخ + +ﱈ +ﱈ +ﱈ +مم +مم + +ﱉ +ﱉ +ﱉ +مى +مى + +ﱊ +ﱊ +ﱊ +مي +مي + +ﱋ +ﱋ +ﱋ +نج +نج + +ﱌ +ﱌ +ﱌ +نح +نح + +ﱍ +ﱍ +ﱍ +نخ +نخ + +ﱎ +ﱎ +ﱎ +نم +نم + +ﱏ +ﱏ +ﱏ +نى +نى + +ﱐ +ﱐ +ﱐ +ني +ني + +ﱑ +ﱑ +ﱑ +هج +هج + +ﱒ +ﱒ +ﱒ +هم +هم + +ﱓ +ﱓ +ﱓ +هى +هى + +ﱔ +ﱔ +ﱔ +هي +هي + +ﱕ +ﱕ +ﱕ +يج +يج + +ﱖ +ﱖ +ﱖ +يح +يح + +ﱗ +ﱗ +ﱗ +يخ +يخ + +ﱘ +ﱘ +ﱘ +يم +يم + +ﱙ +ﱙ +ﱙ +يى +يى + +ﱚ +ﱚ +ﱚ +يي +يي + +ﱛ +ﱛ +ﱛ +ذٰ +ذٰ + +ﱜ +ﱜ +ﱜ +رٰ +رٰ + +ﱝ +ﱝ +ﱝ +ىٰ +ىٰ + +ﱞ +ﱞ +ﱞ + ٌّ + ٌّ + +ﱟ +ﱟ +ﱟ + ٍّ + ٍّ + +ﱠ +ﱠ +ﱠ + َّ + َّ + +ﱡ +ﱡ +ﱡ + ُّ + ُّ + +ﱢ +ﱢ +ﱢ + ِّ + ِّ + +ﱣ +ﱣ +ﱣ + ّٰ + ّٰ + +ﱤ +ﱤ +ﱤ +ئر +ئر + +ﱥ +ﱥ +ﱥ +ئز +ئز + +ﱦ +ﱦ +ﱦ +ئم +ئم + +ﱧ +ﱧ +ﱧ +ئن +ئن + +ﱨ +ﱨ +ﱨ +ئى +ئى + +ﱩ +ﱩ +ﱩ +ئي +ئي + +ﱪ +ﱪ +ﱪ +بر +بر + +ﱫ +ﱫ +ﱫ +بز +بز + +ﱬ +ﱬ +ﱬ +بم +بم + +ﱭ +ﱭ +ﱭ +بن +بن + +ﱮ +ﱮ +ﱮ +بى +بى + +ﱯ +ﱯ +ﱯ +بي +بي + +ﱰ +ﱰ +ﱰ +تر +تر + +ﱱ +ﱱ +ﱱ +تز +تز + +ﱲ +ﱲ +ﱲ +تم +تم + +ﱳ +ﱳ +ﱳ +تن +تن + +ﱴ +ﱴ +ﱴ +تى +تى + +ﱵ +ﱵ +ﱵ +تي +تي + +ﱶ +ﱶ +ﱶ +ثر +ثر + +ﱷ +ﱷ +ﱷ +ثز +ثز + +ﱸ +ﱸ +ﱸ +ثم +ثم + +ﱹ +ﱹ +ﱹ +ثن +ثن + +ﱺ +ﱺ +ﱺ +ثى +ثى + +ﱻ +ﱻ +ﱻ +ثي +ثي + +ﱼ +ﱼ +ﱼ +فى +فى + +ﱽ +ﱽ +ﱽ +في +في + +ﱾ +ﱾ +ﱾ +قى +قى + +ﱿ +ﱿ +ﱿ +قي +قي + +ﲀ +ﲀ +ﲀ +كا +كا + +ﲁ +ﲁ +ﲁ +كل +كل + +ﲂ +ﲂ +ﲂ +كم +كم + +ﲃ +ﲃ +ﲃ +كى +كى + +ﲄ +ﲄ +ﲄ +كي +كي + +ﲅ +ﲅ +ﲅ +لم +لم + +ﲆ +ﲆ +ﲆ +لى +لى + +ﲇ +ﲇ +ﲇ +لي +لي + +ﲈ +ﲈ +ﲈ +ما +ما + +ﲉ +ﲉ +ﲉ +مم +مم + +ﲊ +ﲊ +ﲊ +نر +نر + +ﲋ +ﲋ +ﲋ +نز +نز + +ﲌ +ﲌ +ﲌ +نم +نم + +ﲍ +ﲍ +ﲍ +نن +نن + +ﲎ +ﲎ +ﲎ +نى +نى + +ﲏ +ﲏ +ﲏ +ني +ني + +ﲐ +ﲐ +ﲐ +ىٰ +ىٰ + +ﲑ +ﲑ +ﲑ +ير +ير + +ﲒ +ﲒ +ﲒ +يز +يز + +ﲓ +ﲓ +ﲓ +يم +يم + +ﲔ +ﲔ +ﲔ +ين +ين + +ﲕ +ﲕ +ﲕ +يى +يى + +ﲖ +ﲖ +ﲖ +يي +يي + +ﲗ +ﲗ +ﲗ +ئج +ئج + +ﲘ +ﲘ +ﲘ +ئح +ئح + +ﲙ +ﲙ +ﲙ +ئخ +ئخ + +ﲚ +ﲚ +ﲚ +ئم +ئم + +ﲛ +ﲛ +ﲛ +ئه +ئه + +ﲜ +ﲜ +ﲜ +بج +بج + +ﲝ +ﲝ +ﲝ +بح +بح + +ﲞ +ﲞ +ﲞ +بخ +بخ + +ﲟ +ﲟ +ﲟ +بم +بم + +ﲠ +ﲠ +ﲠ +به +به + +ﲡ +ﲡ +ﲡ +تج +تج + +ﲢ +ﲢ +ﲢ +تح +تح + +ﲣ +ﲣ +ﲣ +تخ +تخ + +ﲤ +ﲤ +ﲤ +تم +تم + +ﲥ +ﲥ +ﲥ +ته +ته + +ﲦ +ﲦ +ﲦ +ثم +ثم + +ﲧ +ﲧ +ﲧ +جح +جح + +ﲨ +ﲨ +ﲨ +جم +جم + +ﲩ +ﲩ +ﲩ +حج +حج + +ﲪ +ﲪ +ﲪ +حم +حم + +ﲫ +ﲫ +ﲫ +خج +خج + +ﲬ +ﲬ +ﲬ +خم +خم + +ﲭ +ﲭ +ﲭ +سج +سج + +ﲮ +ﲮ +ﲮ +سح +سح + +ﲯ +ﲯ +ﲯ +سخ +سخ + +ﲰ +ﲰ +ﲰ +سم +سم + +ﲱ +ﲱ +ﲱ +صح +صح + +ﲲ +ﲲ +ﲲ +صخ +صخ + +ﲳ +ﲳ +ﲳ +صم +صم + +ﲴ +ﲴ +ﲴ +ضج +ضج + +ﲵ +ﲵ +ﲵ +ضح +ضح + +ﲶ +ﲶ +ﲶ +ضخ +ضخ + +ﲷ +ﲷ +ﲷ +ضم +ضم + +ﲸ +ﲸ +ﲸ +طح +طح + +ﲹ +ﲹ +ﲹ +ظم +ظم + +ﲺ +ﲺ +ﲺ +عج +عج + +ﲻ +ﲻ +ﲻ +عم +عم + +ﲼ +ﲼ +ﲼ +غج +غج + +ﲽ +ﲽ +ﲽ +غم +غم + +ﲾ +ﲾ +ﲾ +فج +فج + +ﲿ +ﲿ +ﲿ +فح +فح + +ﳀ +ﳀ +ﳀ +فخ +فخ + +ﳁ +ﳁ +ﳁ +فم +فم + +ﳂ +ﳂ +ﳂ +قح +قح + +ﳃ +ﳃ +ﳃ +قم +قم + +ﳄ +ﳄ +ﳄ +كج +كج + +ﳅ +ﳅ +ﳅ +كح +كح + +ﳆ +ﳆ +ﳆ +كخ +كخ + +ﳇ +ﳇ +ﳇ +كل +كل + +ﳈ +ﳈ +ﳈ +كم +كم + +ﳉ +ﳉ +ﳉ +لج +لج + +ﳊ +ﳊ +ﳊ +لح +لح + +ﳋ +ﳋ +ﳋ +لخ +لخ + +ﳌ +ﳌ +ﳌ +لم +لم + +ﳍ +ﳍ +ﳍ +له +له + +ﳎ +ﳎ +ﳎ +مج +مج + +ﳏ +ﳏ +ﳏ +مح +مح + +ﳐ +ﳐ +ﳐ +مخ +مخ + +ﳑ +ﳑ +ﳑ +مم +مم + +ﳒ +ﳒ +ﳒ +نج +نج + +ﳓ +ﳓ +ﳓ +نح +نح + +ﳔ +ﳔ +ﳔ +نخ +نخ + +ﳕ +ﳕ +ﳕ +نم +نم + +ﳖ +ﳖ +ﳖ +نه +نه + +ﳗ +ﳗ +ﳗ +هج +هج + +ﳘ +ﳘ +ﳘ +هم +هم + +ﳙ +ﳙ +ﳙ +هٰ +هٰ + +ﳚ +ﳚ +ﳚ +يج +يج + +ﳛ +ﳛ +ﳛ +يح +يح + +ﳜ +ﳜ +ﳜ +يخ +يخ + +ﳝ +ﳝ +ﳝ +يم +يم + +ﳞ +ﳞ +ﳞ +يه +يه + +ﳟ +ﳟ +ﳟ +ئم +ئم + +ﳠ +ﳠ +ﳠ +ئه +ئه + +ﳡ +ﳡ +ﳡ +بم +بم + +ﳢ +ﳢ +ﳢ +به +به + +ﳣ +ﳣ +ﳣ +تم +تم + +ﳤ +ﳤ +ﳤ +ته +ته + +ﳥ +ﳥ +ﳥ +ثم +ثم + +ﳦ +ﳦ +ﳦ +ثه +ثه + +ﳧ +ﳧ +ﳧ +سم +سم + +ﳨ +ﳨ +ﳨ +سه +سه + +ﳩ +ﳩ +ﳩ +شم +شم + +ﳪ +ﳪ +ﳪ +شه +شه + +ﳫ +ﳫ +ﳫ +كل +كل + +ﳬ +ﳬ +ﳬ +كم +كم + +ﳭ +ﳭ +ﳭ +لم +لم + +ﳮ +ﳮ +ﳮ +نم +نم + +ﳯ +ﳯ +ﳯ +نه +نه + +ﳰ +ﳰ +ﳰ +يم +يم + +ﳱ +ﳱ +ﳱ +يه +يه + +ﳲ +ﳲ +ﳲ +ـَّ +ـَّ + +ﳳ +ﳳ +ﳳ +ـُّ +ـُّ + +ﳴ +ﳴ +ﳴ +ـِّ +ـِّ + +ﳵ +ﳵ +ﳵ +طى +طى + +ﳶ +ﳶ +ﳶ +طي +طي + +ﳷ +ﳷ +ﳷ +عى +عى + +ﳸ +ﳸ +ﳸ +عي +عي + +ﳹ +ﳹ +ﳹ +غى +غى + +ﳺ +ﳺ +ﳺ +غي +غي + +ﳻ +ﳻ +ﳻ +سى +سى + +ﳼ +ﳼ +ﳼ +سي +سي + +ﳽ +ﳽ +ﳽ +شى +شى + +ﳾ +ﳾ +ﳾ +شي +شي + +ﳿ +ﳿ +ﳿ +حى +حى + +ﴀ +ﴀ +ﴀ +حي +حي + +ﴁ +ﴁ +ﴁ +جى +جى + +ﴂ +ﴂ +ﴂ +جي +جي + +ﴃ +ﴃ +ﴃ +خى +خى + +ﴄ +ﴄ +ﴄ +خي +خي + +ﴅ +ﴅ +ﴅ +صى +صى + +ﴆ +ﴆ +ﴆ +صي +صي + +ﴇ +ﴇ +ﴇ +ضى +ضى + +ﴈ +ﴈ +ﴈ +ضي +ضي + +ﴉ +ﴉ +ﴉ +شج +شج + +ﴊ +ﴊ +ﴊ +شح +شح + +ﴋ +ﴋ +ﴋ +شخ +شخ + +ﴌ +ﴌ +ﴌ +شم +شم + +ﴍ +ﴍ +ﴍ +شر +شر + +ﴎ +ﴎ +ﴎ +سر +سر + +ﴏ +ﴏ +ﴏ +صر +صر + +ﴐ +ﴐ +ﴐ +ضر +ضر + +ﴑ +ﴑ +ﴑ +طى +طى + +ﴒ +ﴒ +ﴒ +طي +طي + +ﴓ +ﴓ +ﴓ +عى +عى + +ﴔ +ﴔ +ﴔ +عي +عي + +ﴕ +ﴕ +ﴕ +غى +غى + +ﴖ +ﴖ +ﴖ +غي +غي + +ﴗ +ﴗ +ﴗ +سى +سى + +ﴘ +ﴘ +ﴘ +سي +سي + +ﴙ +ﴙ +ﴙ +شى +شى + +ﴚ +ﴚ +ﴚ +شي +شي + +ﴛ +ﴛ +ﴛ +حى +حى + +ﴜ +ﴜ +ﴜ +حي +حي + +ﴝ +ﴝ +ﴝ +جى +جى + +ﴞ +ﴞ +ﴞ +جي +جي + +ﴟ +ﴟ +ﴟ +خى +خى + +ﴠ +ﴠ +ﴠ +خي +خي + +ﴡ +ﴡ +ﴡ +صى +صى + +ﴢ +ﴢ +ﴢ +صي +صي + +ﴣ +ﴣ +ﴣ +ضى +ضى + +ﴤ +ﴤ +ﴤ +ضي +ضي + +ﴥ +ﴥ +ﴥ +شج +شج + +ﴦ +ﴦ +ﴦ +شح +شح + +ﴧ +ﴧ +ﴧ +شخ +شخ + +ﴨ +ﴨ +ﴨ +شم +شم + +ﴩ +ﴩ +ﴩ +شر +شر + +ﴪ +ﴪ +ﴪ +سر +سر + +ﴫ +ﴫ +ﴫ +صر +صر + +ﴬ +ﴬ +ﴬ +ضر +ضر + +ﴭ +ﴭ +ﴭ +شج +شج + +ﴮ +ﴮ +ﴮ +شح +شح + +ﴯ +ﴯ +ﴯ +شخ +شخ + +ﴰ +ﴰ +ﴰ +شم +شم + +ﴱ +ﴱ +ﴱ +سه +سه + +ﴲ +ﴲ +ﴲ +شه +شه + +ﴳ +ﴳ +ﴳ +طم +طم + +ﴴ +ﴴ +ﴴ +سج +سج + +ﴵ +ﴵ +ﴵ +سح +سح + +ﴶ +ﴶ +ﴶ +سخ +سخ + +ﴷ +ﴷ +ﴷ +شج +شج + +ﴸ +ﴸ +ﴸ +شح +شح + +ﴹ +ﴹ +ﴹ +شخ +شخ + +ﴺ +ﴺ +ﴺ +طم +طم + +ﴻ +ﴻ +ﴻ +ظم +ظم + +ﴼ +ﴼ +ﴼ +اً +اً + +ﴽ +ﴽ +ﴽ +اً +اً + +ﵐ +ﵐ +ﵐ +تجم +تجم + +ﵑ +ﵑ +ﵑ +تحج +تحج + +ﵒ +ﵒ +ﵒ +تحج +تحج + +ﵓ +ﵓ +ﵓ +تحم +تحم + +ﵔ +ﵔ +ﵔ +تخم +تخم + +ﵕ +ﵕ +ﵕ +تمج +تمج + +ﵖ +ﵖ +ﵖ +تمح +تمح + +ﵗ +ﵗ +ﵗ +تمخ +تمخ + +ﵘ +ﵘ +ﵘ +جمح +جمح + +ﵙ +ﵙ +ﵙ +جمح +جمح + +ﵚ +ﵚ +ﵚ +حمي +حمي + +ﵛ +ﵛ +ﵛ +حمى +حمى + +ﵜ +ﵜ +ﵜ +سحج +سحج + +ﵝ +ﵝ +ﵝ +سجح +سجح + +ﵞ +ﵞ +ﵞ +سجى +سجى + +ﵟ +ﵟ +ﵟ +سمح +سمح + +ﵠ +ﵠ +ﵠ +سمح +سمح + +ﵡ +ﵡ +ﵡ +سمج +سمج + +ﵢ +ﵢ +ﵢ +سمم +سمم + +ﵣ +ﵣ +ﵣ +سمم +سمم + +ﵤ +ﵤ +ﵤ +صحح +صحح + +ﵥ +ﵥ +ﵥ +صحح +صحح + +ﵦ +ﵦ +ﵦ +صمم +صمم + +ﵧ +ﵧ +ﵧ +شحم +شحم + +ﵨ +ﵨ +ﵨ +شحم +شحم + +ﵩ +ﵩ +ﵩ +شجي +شجي + +ﵪ +ﵪ +ﵪ +شمخ +شمخ + +ﵫ +ﵫ +ﵫ +شمخ +شمخ + +ﵬ +ﵬ +ﵬ +شمم +شمم + +ﵭ +ﵭ +ﵭ +شمم +شمم + +ﵮ +ﵮ +ﵮ +ضحى +ضحى + +ﵯ +ﵯ +ﵯ +ضخم +ضخم + +ﵰ +ﵰ +ﵰ +ضخم +ضخم + +ﵱ +ﵱ +ﵱ +طمح +طمح + +ﵲ +ﵲ +ﵲ +طمح +طمح + +ﵳ +ﵳ +ﵳ +طمم +طمم + +ﵴ +ﵴ +ﵴ +طمي +طمي + +ﵵ +ﵵ +ﵵ +عجم +عجم + +ﵶ +ﵶ +ﵶ +عمم +عمم + +ﵷ +ﵷ +ﵷ +عمم +عمم + +ﵸ +ﵸ +ﵸ +عمى +عمى + +ﵹ +ﵹ +ﵹ +غمم +غمم + +ﵺ +ﵺ +ﵺ +غمي +غمي + +ﵻ +ﵻ +ﵻ +غمى +غمى + +ﵼ +ﵼ +ﵼ +فخم +فخم + +ﵽ +ﵽ +ﵽ +فخم +فخم + +ﵾ +ﵾ +ﵾ +قمح +قمح + +ﵿ +ﵿ +ﵿ +قمم +قمم + +ﶀ +ﶀ +ﶀ +لحم +لحم + +ﶁ +ﶁ +ﶁ +لحي +لحي + +ﶂ +ﶂ +ﶂ +لحى +لحى + +ﶃ +ﶃ +ﶃ +لجج +لجج + +ﶄ +ﶄ +ﶄ +لجج +لجج + +ﶅ +ﶅ +ﶅ +لخم +لخم + +ﶆ +ﶆ +ﶆ +لخم +لخم + +ﶇ +ﶇ +ﶇ +لمح +لمح + +ﶈ +ﶈ +ﶈ +لمح +لمح + +ﶉ +ﶉ +ﶉ +محج +محج + +ﶊ +ﶊ +ﶊ +محم +محم + +ﶋ +ﶋ +ﶋ +محي +محي + +ﶌ +ﶌ +ﶌ +مجح +مجح + +ﶍ +ﶍ +ﶍ +مجم +مجم + +ﶎ +ﶎ +ﶎ +مخج +مخج + +ﶏ +ﶏ +ﶏ +مخم +مخم + +ﶒ +ﶒ +ﶒ +مجخ +مجخ + +ﶓ +ﶓ +ﶓ +همج +همج + +ﶔ +ﶔ +ﶔ +همم +همم + +ﶕ +ﶕ +ﶕ +نحم +نحم + +ﶖ +ﶖ +ﶖ +نحى +نحى + +ﶗ +ﶗ +ﶗ +نجم +نجم + +ﶘ +ﶘ +ﶘ +نجم +نجم + +ﶙ +ﶙ +ﶙ +نجى +نجى + +ﶚ +ﶚ +ﶚ +نمي +نمي + +ﶛ +ﶛ +ﶛ +نمى +نمى + +ﶜ +ﶜ +ﶜ +يمم +يمم + +ﶝ +ﶝ +ﶝ +يمم +يمم + +ﶞ +ﶞ +ﶞ +بخي +بخي + +ﶟ +ﶟ +ﶟ +تجي +تجي + +ﶠ +ﶠ +ﶠ +تجى +تجى + +ﶡ +ﶡ +ﶡ +تخي +تخي + +ﶢ +ﶢ +ﶢ +تخى +تخى + +ﶣ +ﶣ +ﶣ +تمي +تمي + +ﶤ +ﶤ +ﶤ +تمى +تمى + +ﶥ +ﶥ +ﶥ +جمي +جمي + +ﶦ +ﶦ +ﶦ +جحى +جحى + +ﶧ +ﶧ +ﶧ +جمى +جمى + +ﶨ +ﶨ +ﶨ +سخى +سخى + +ﶩ +ﶩ +ﶩ +صحي +صحي + +ﶪ +ﶪ +ﶪ +شحي +شحي + +ﶫ +ﶫ +ﶫ +ضحي +ضحي + +ﶬ +ﶬ +ﶬ +لجي +لجي + +ﶭ +ﶭ +ﶭ +لمي +لمي + +ﶮ +ﶮ +ﶮ +يحي +يحي + +ﶯ +ﶯ +ﶯ +يجي +يجي + +ﶰ +ﶰ +ﶰ +يمي +يمي + +ﶱ +ﶱ +ﶱ +ممي +ممي + +ﶲ +ﶲ +ﶲ +قمي +قمي + +ﶳ +ﶳ +ﶳ +نحي +نحي + +ﶴ +ﶴ +ﶴ +قمح +قمح + +ﶵ +ﶵ +ﶵ +لحم +لحم + +ﶶ +ﶶ +ﶶ +عمي +عمي + +ﶷ +ﶷ +ﶷ +كمي +كمي + +ﶸ +ﶸ +ﶸ +نجح +نجح + +ﶹ +ﶹ +ﶹ +مخي +مخي + +ﶺ +ﶺ +ﶺ +لجم +لجم + +ﶻ +ﶻ +ﶻ +كمم +كمم + +ﶼ +ﶼ +ﶼ +لجم +لجم + +ﶽ +ﶽ +ﶽ +نجح +نجح + +ﶾ +ﶾ +ﶾ +جحي +جحي + +ﶿ +ﶿ +ﶿ +حجي +حجي + +ﷀ +ﷀ +ﷀ +مجي +مجي + +ﷁ +ﷁ +ﷁ +فمي +فمي + +ﷂ +ﷂ +ﷂ +بحي +بحي + +ﷃ +ﷃ +ﷃ +كمم +كمم + +ﷄ +ﷄ +ﷄ +عجم +عجم + +ﷅ +ﷅ +ﷅ +صمم +صمم + +ﷆ +ﷆ +ﷆ +سخي +سخي + +ﷇ +ﷇ +ﷇ +نجي +نجي + +ﷰ +ﷰ +ﷰ +صلے +صلے + +ﷱ +ﷱ +ﷱ +قلے +قلے + +ﷲ +ﷲ +ﷲ +الله +الله + +ﷳ +ﷳ +ﷳ +اكبر +اكبر + +ﷴ +ﷴ +ﷴ +محمد +محمد + +ﷵ +ﷵ +ﷵ +صلعم +صلعم + +ﷶ +ﷶ +ﷶ +رسول +رسول + +ﷷ +ﷷ +ﷷ +عليه +عليه + +ﷸ +ﷸ +ﷸ +وسلم +وسلم + +ﷹ +ﷹ +ﷹ +صلى +صلى + +ﷺ +ﷺ +ﷺ +صلى الله عليه وسلم +صلى الله عليه وسلم + +ﷻ +ﷻ +ﷻ +جل جلاله +جل جلاله + +﷼ +﷼ +﷼ +ریال +ریال + +︐ +︐ +︐ +, +, + +︑ +︑ +︑ +、 +、 + +︒ +︒ +︒ +。 +。 + +︓ +︓ +︓ +: +: + +︔ +︔ +︔ +; +; + +︕ +︕ +︕ +! +! + +︖ +︖ +︖ +? +? + +︗ +︗ +︗ +〖 +〖 + +︘ +︘ +︘ +〗 +〗 + +︙ +︙ +︙ +... +... + +︰ +︰ +︰ +.. +.. + +︱ +︱ +︱ +— +— + +︲ +︲ +︲ +– +– + +︳ +︳ +︳ +_ +_ + +︴ +︴ +︴ +_ +_ + +︵ +︵ +︵ +( +( + +︶ +︶ +︶ +) +) + +︷ +︷ +︷ +{ +{ + +︸ +︸ +︸ +} +} + +︹ +︹ +︹ +〔 +〔 + +︺ +︺ +︺ +〕 +〕 + +︻ +︻ +︻ +【 +【 + +︼ +︼ +︼ +】 +】 + +︽ +︽ +︽ +《 +《 + +︾ +︾ +︾ +》 +》 + +︿ +︿ +︿ +〈 +〈 + +﹀ +﹀ +﹀ +〉 +〉 + +﹁ +﹁ +﹁ +「 +「 + +﹂ +﹂ +﹂ +」 +」 + +﹃ +﹃ +﹃ +『 +『 + +﹄ +﹄ +﹄ +』 +』 + +﹇ +﹇ +﹇ +[ +[ + +﹈ +﹈ +﹈ +] +] + +﹉ +﹉ +﹉ + ̅ + ̅ + +﹊ +﹊ +﹊ + ̅ + ̅ + +﹋ +﹋ +﹋ + ̅ + ̅ + +﹌ +﹌ +﹌ + ̅ + ̅ + +﹍ +﹍ +﹍ +_ +_ + +﹎ +﹎ +﹎ +_ +_ + +﹏ +﹏ +﹏ +_ +_ + +﹐ +﹐ +﹐ +, +, + +﹑ +﹑ +﹑ +、 +、 + +﹒ +﹒ +﹒ +. +. + +﹔ +﹔ +﹔ +; +; + +﹕ +﹕ +﹕ +: +: + +﹖ +﹖ +﹖ +? +? + +﹗ +﹗ +﹗ +! +! + +﹘ +﹘ +﹘ +— +— + +﹙ +﹙ +﹙ +( +( + +﹚ +﹚ +﹚ +) +) + +﹛ +﹛ +﹛ +{ +{ + +﹜ +﹜ +﹜ +} +} + +﹝ +﹝ +﹝ +〔 +〔 + +﹞ +﹞ +﹞ +〕 +〕 + +﹟ +﹟ +﹟ +# +# + +﹠ +﹠ +﹠ +& +& + +﹡ +﹡ +﹡ +* +* + +﹢ +﹢ +﹢ ++ ++ + +﹣ +﹣ +﹣ +- +- + +﹤ +﹤ +﹤ +< +< + +﹥ +﹥ +﹥ +> +> + +﹦ +﹦ +﹦ += += + +﹨ +﹨ +﹨ +\ +\ + +﹩ +﹩ +﹩ +$ +$ + +﹪ +﹪ +﹪ +% +% + +﹫ +﹫ +﹫ +@ +@ + +ﹰ +ﹰ +ﹰ + ً + ً + +ﹱ +ﹱ +ﹱ +ـً +ـً + +ﹲ +ﹲ +ﹲ + ٌ + ٌ + +ﹴ +ﹴ +ﹴ + ٍ + ٍ + +ﹶ +ﹶ +ﹶ + َ + َ + +ﹷ +ﹷ +ﹷ +ـَ +ـَ + +ﹸ +ﹸ +ﹸ + ُ + ُ + +ﹹ +ﹹ +ﹹ +ـُ +ـُ + +ﹺ +ﹺ +ﹺ + ِ + ِ + +ﹻ +ﹻ +ﹻ +ـِ +ـِ + +ﹼ +ﹼ +ﹼ + ّ + ّ + +ﹽ +ﹽ +ﹽ +ـّ +ـّ + +ﹾ +ﹾ +ﹾ + ْ + ْ + +ﹿ +ﹿ +ﹿ +ـْ +ـْ + +ﺀ +ﺀ +ﺀ +ء +ء + +ﺁ +ﺁ +ﺁ +آ +آ + +ﺂ +ﺂ +ﺂ +آ +آ + +ﺃ +ﺃ +ﺃ +أ +أ + +ﺄ +ﺄ +ﺄ +أ +أ + +ﺅ +ﺅ +ﺅ +ؤ +ؤ + +ﺆ +ﺆ +ﺆ +ؤ +ؤ + +ﺇ +ﺇ +ﺇ +إ +إ + +ﺈ +ﺈ +ﺈ +إ +إ + +ﺉ +ﺉ +ﺉ +ئ +ئ + +ﺊ +ﺊ +ﺊ +ئ +ئ + +ﺋ +ﺋ +ﺋ +ئ +ئ + +ﺌ +ﺌ +ﺌ +ئ +ئ + +ﺍ +ﺍ +ﺍ +ا +ا + +ﺎ +ﺎ +ﺎ +ا +ا + +ﺏ +ﺏ +ﺏ +ب +ب + +ﺐ +ﺐ +ﺐ +ب +ب + +ﺑ +ﺑ +ﺑ +ب +ب + +ﺒ +ﺒ +ﺒ +ب +ب + +ﺓ +ﺓ +ﺓ +ة +ة + +ﺔ +ﺔ +ﺔ +ة +ة + +ﺕ +ﺕ +ﺕ +ت +ت + +ﺖ +ﺖ +ﺖ +ت +ت + +ﺗ +ﺗ +ﺗ +ت +ت + +ﺘ +ﺘ +ﺘ +ت +ت + +ﺙ +ﺙ +ﺙ +ث +ث + +ﺚ +ﺚ +ﺚ +ث +ث + +ﺛ +ﺛ +ﺛ +ث +ث + +ﺜ +ﺜ +ﺜ +ث +ث + +ﺝ +ﺝ +ﺝ +ج +ج + +ﺞ +ﺞ +ﺞ +ج +ج + +ﺟ +ﺟ +ﺟ +ج +ج + +ﺠ +ﺠ +ﺠ +ج +ج + +ﺡ +ﺡ +ﺡ +ح +ح + +ﺢ +ﺢ +ﺢ +ح +ح + +ﺣ +ﺣ +ﺣ +ح +ح + +ﺤ +ﺤ +ﺤ +ح +ح + +ﺥ +ﺥ +ﺥ +خ +خ + +ﺦ +ﺦ +ﺦ +خ +خ + +ﺧ +ﺧ +ﺧ +خ +خ + +ﺨ +ﺨ +ﺨ +خ +خ + +ﺩ +ﺩ +ﺩ +د +د + +ﺪ +ﺪ +ﺪ +د +د + +ﺫ +ﺫ +ﺫ +ذ +ذ + +ﺬ +ﺬ +ﺬ +ذ +ذ + +ﺭ +ﺭ +ﺭ +ر +ر + +ﺮ +ﺮ +ﺮ +ر +ر + +ﺯ +ﺯ +ﺯ +ز +ز + +ﺰ +ﺰ +ﺰ +ز +ز + +ﺱ +ﺱ +ﺱ +س +س + +ﺲ +ﺲ +ﺲ +س +س + +ﺳ +ﺳ +ﺳ +س +س + +ﺴ +ﺴ +ﺴ +س +س + +ﺵ +ﺵ +ﺵ +ش +ش + +ﺶ +ﺶ +ﺶ +ش +ش + +ﺷ +ﺷ +ﺷ +ش +ش + +ﺸ +ﺸ +ﺸ +ش +ش + +ﺹ +ﺹ +ﺹ +ص +ص + +ﺺ +ﺺ +ﺺ +ص +ص + +ﺻ +ﺻ +ﺻ +ص +ص + +ﺼ +ﺼ +ﺼ +ص +ص + +ﺽ +ﺽ +ﺽ +ض +ض + +ﺾ +ﺾ +ﺾ +ض +ض + +ﺿ +ﺿ +ﺿ +ض +ض + +ﻀ +ﻀ +ﻀ +ض +ض + +ﻁ +ﻁ +ﻁ +ط +ط + +ﻂ +ﻂ +ﻂ +ط +ط + +ﻃ +ﻃ +ﻃ +ط +ط + +ﻄ +ﻄ +ﻄ +ط +ط + +ﻅ +ﻅ +ﻅ +ظ +ظ + +ﻆ +ﻆ +ﻆ +ظ +ظ + +ﻇ +ﻇ +ﻇ +ظ +ظ + +ﻈ +ﻈ +ﻈ +ظ +ظ + +ﻉ +ﻉ +ﻉ +ع +ع + +ﻊ +ﻊ +ﻊ +ع +ع + +ﻋ +ﻋ +ﻋ +ع +ع + +ﻌ +ﻌ +ﻌ +ع +ع + +ﻍ +ﻍ +ﻍ +غ +غ + +ﻎ +ﻎ +ﻎ +غ +غ + +ﻏ +ﻏ +ﻏ +غ +غ + +ﻐ +ﻐ +ﻐ +غ +غ + +ﻑ +ﻑ +ﻑ +ف +ف + +ﻒ +ﻒ +ﻒ +ف +ف + +ﻓ +ﻓ +ﻓ +ف +ف + +ﻔ +ﻔ +ﻔ +ف +ف + +ﻕ +ﻕ +ﻕ +ق +ق + +ﻖ +ﻖ +ﻖ +ق +ق + +ﻗ +ﻗ +ﻗ +ق +ق + +ﻘ +ﻘ +ﻘ +ق +ق + +ﻙ +ﻙ +ﻙ +ك +ك + +ﻚ +ﻚ +ﻚ +ك +ك + +ﻛ +ﻛ +ﻛ +ك +ك + +ﻜ +ﻜ +ﻜ +ك +ك + +ﻝ +ﻝ +ﻝ +ل +ل + +ﻞ +ﻞ +ﻞ +ل +ل + +ﻟ +ﻟ +ﻟ +ل +ل + +ﻠ +ﻠ +ﻠ +ل +ل + +ﻡ +ﻡ +ﻡ +م +م + +ﻢ +ﻢ +ﻢ +م +م + +ﻣ +ﻣ +ﻣ +م +م + +ﻤ +ﻤ +ﻤ +م +م + +ﻥ +ﻥ +ﻥ +ن +ن + +ﻦ +ﻦ +ﻦ +ن +ن + +ﻧ +ﻧ +ﻧ +ن +ن + +ﻨ +ﻨ +ﻨ +ن +ن + +ﻩ +ﻩ +ﻩ +ه +ه + +ﻪ +ﻪ +ﻪ +ه +ه + +ﻫ +ﻫ +ﻫ +ه +ه + +ﻬ +ﻬ +ﻬ +ه +ه + +ﻭ +ﻭ +ﻭ +و +و + +ﻮ +ﻮ +ﻮ +و +و + +ﻯ +ﻯ +ﻯ +ى +ى + +ﻰ +ﻰ +ﻰ +ى +ى + +ﻱ +ﻱ +ﻱ +ي +ي + +ﻲ +ﻲ +ﻲ +ي +ي + +ﻳ +ﻳ +ﻳ +ي +ي + +ﻴ +ﻴ +ﻴ +ي +ي + +ﻵ +ﻵ +ﻵ +لآ +لآ + +ﻶ +ﻶ +ﻶ +لآ +لآ + +ﻷ +ﻷ +ﻷ +لأ +لأ + +ﻸ +ﻸ +ﻸ +لأ +لأ + +ﻹ +ﻹ +ﻹ +لإ +لإ + +ﻺ +ﻺ +ﻺ +لإ +لإ + +ﻻ +ﻻ +ﻻ +لا +لا + +ﻼ +ﻼ +ﻼ +لا +لا + +! +! +! +! +! + +" +" +" +" +" + +# +# +# +# +# + +$ +$ +$ +$ +$ + +% +% +% +% +% + +& +& +& +& +& + +' +' +' +' +' + +( +( +( +( +( + +) +) +) +) +) + +* +* +* +* +* + ++ ++ ++ ++ ++ + +, +, +, +, +, + +- +- +- +- +- + +. +. +. +. +. + +/ +/ +/ +/ +/ + +0 +0 +0 +0 +0 + +1 +1 +1 +1 +1 + +2 +2 +2 +2 +2 + +3 +3 +3 +3 +3 + +4 +4 +4 +4 +4 + +5 +5 +5 +5 +5 + +6 +6 +6 +6 +6 + +7 +7 +7 +7 +7 + +8 +8 +8 +8 +8 + +9 +9 +9 +9 +9 + +: +: +: +: +: + +; +; +; +; +; + +< +< +< +< +< + += += += += += + +> +> +> +> +> + +? +? +? +? +? + +@ +@ +@ +@ +@ + +A +A +A +A +A + +B +B +B +B +B + +C +C +C +C +C + +D +D +D +D +D + +E +E +E +E +E + +F +F +F +F +F + +G +G +G +G +G + +H +H +H +H +H + +I +I +I +I +I + +J +J +J +J +J + +K +K +K +K +K + +L +L +L +L +L + +M +M +M +M +M + +N +N +N +N +N + +O +O +O +O +O + +P +P +P +P +P + +Q +Q +Q +Q +Q + +R +R +R +R +R + +S +S +S +S +S + +T +T +T +T +T + +U +U +U +U +U + +V +V +V +V +V + +W +W +W +W +W + +X +X +X +X +X + +Y +Y +Y +Y +Y + +Z +Z +Z +Z +Z + +[ +[ +[ +[ +[ + +\ +\ +\ +\ +\ + +] +] +] +] +] + +^ +^ +^ +^ +^ + +_ +_ +_ +_ +_ + +` +` +` +` +` + +a +a +a +a +a + +b +b +b +b +b + +c +c +c +c +c + +d +d +d +d +d + +e +e +e +e +e + +f +f +f +f +f + +g +g +g +g +g + +h +h +h +h +h + +i +i +i +i +i + +j +j +j +j +j + +k +k +k +k +k + +l +l +l +l +l + +m +m +m +m +m + +n +n +n +n +n + +o +o +o +o +o + +p +p +p +p +p + +q +q +q +q +q + +r +r +r +r +r + +s +s +s +s +s + +t +t +t +t +t + +u +u +u +u +u + +v +v +v +v +v + +w +w +w +w +w + +x +x +x +x +x + +y +y +y +y +y + +z +z +z +z +z + +{ +{ +{ +{ +{ + +| +| +| +| +| + +} +} +} +} +} + +~ +~ +~ +~ +~ + +⦅ +⦅ +⦅ +⦅ +⦅ + +⦆ +⦆ +⦆ +⦆ +⦆ + +。 +。 +。 +。 +。 + +「 +「 +「 +「 +「 + +」 +」 +」 +」 +」 + +、 +、 +、 +、 +、 + +・ +・ +・ +・ +・ + +ヲ +ヲ +ヲ +ヲ +ヲ + +ァ +ァ +ァ +ァ +ァ + +ィ +ィ +ィ +ィ +ィ + +ゥ +ゥ +ゥ +ゥ +ゥ + +ェ +ェ +ェ +ェ +ェ + +ォ +ォ +ォ +ォ +ォ + +ャ +ャ +ャ +ャ +ャ + +ュ +ュ +ュ +ュ +ュ + +ョ +ョ +ョ +ョ +ョ + +ッ +ッ +ッ +ッ +ッ + +ー +ー +ー +ー +ー + +ア +ア +ア +ア +ア + +イ +イ +イ +イ +イ + +ウ +ウ +ウ +ウ +ウ + +エ +エ +エ +エ +エ + +オ +オ +オ +オ +オ + +カ +カ +カ +カ +カ + +キ +キ +キ +キ +キ + +ク +ク +ク +ク +ク + +ケ +ケ +ケ +ケ +ケ + +コ +コ +コ +コ +コ + +サ +サ +サ +サ +サ + +シ +シ +シ +シ +シ + +ス +ス +ス +ス +ス + +セ +セ +セ +セ +セ + +ソ +ソ +ソ +ソ +ソ + +タ +タ +タ +タ +タ + +チ +チ +チ +チ +チ + +ツ +ツ +ツ +ツ +ツ + +テ +テ +テ +テ +テ + +ト +ト +ト +ト +ト + +ナ +ナ +ナ +ナ +ナ + +ニ +ニ +ニ +ニ +ニ + +ヌ +ヌ +ヌ +ヌ +ヌ + +ネ +ネ +ネ +ネ +ネ + +ノ +ノ +ノ +ノ +ノ + +ハ +ハ +ハ +ハ +ハ + +ヒ +ヒ +ヒ +ヒ +ヒ + +フ +フ +フ +フ +フ + +ヘ +ヘ +ヘ +ヘ +ヘ + +ホ +ホ +ホ +ホ +ホ + +マ +マ +マ +マ +マ + +ミ +ミ +ミ +ミ +ミ + +ム +ム +ム +ム +ム + +メ +メ +メ +メ +メ + +モ +モ +モ +モ +モ + +ヤ +ヤ +ヤ +ヤ +ヤ + +ユ +ユ +ユ +ユ +ユ + +ヨ +ヨ +ヨ +ヨ +ヨ + +ラ +ラ +ラ +ラ +ラ + +リ +リ +リ +リ +リ + +ル +ル +ル +ル +ル + +レ +レ +レ +レ +レ + +ロ +ロ +ロ +ロ +ロ + +ワ +ワ +ワ +ワ +ワ + +ン +ン +ン +ン +ン + +゙ +゙ +゙ +゙ +゙ + +゚ +゚ +゚ +゚ +゚ + +ᅠ +ᅠ +ᅠ +ᅠ +ᅠ + +ᄀ +ᄀ +ᄀ +ᄀ +ᄀ + +ᄁ +ᄁ +ᄁ +ᄁ +ᄁ + +ᆪ +ᆪ +ᆪ +ᆪ +ᆪ + +ᄂ +ᄂ +ᄂ +ᄂ +ᄂ + +ᆬ +ᆬ +ᆬ +ᆬ +ᆬ + +ᆭ +ᆭ +ᆭ +ᆭ +ᆭ + +ᄃ +ᄃ +ᄃ +ᄃ +ᄃ + +ᄄ +ᄄ +ᄄ +ᄄ +ᄄ + +ᄅ +ᄅ +ᄅ +ᄅ +ᄅ + +ᆰ +ᆰ +ᆰ +ᆰ +ᆰ + +ᆱ +ᆱ +ᆱ +ᆱ +ᆱ + +ᆲ +ᆲ +ᆲ +ᆲ +ᆲ + +ᆳ +ᆳ +ᆳ +ᆳ +ᆳ + +ᆴ +ᆴ +ᆴ +ᆴ +ᆴ + +ᆵ +ᆵ +ᆵ +ᆵ +ᆵ + +ᄚ +ᄚ +ᄚ +ᄚ +ᄚ + +ᄆ +ᄆ +ᄆ +ᄆ +ᄆ + +ᄇ +ᄇ +ᄇ +ᄇ +ᄇ + +ᄈ +ᄈ +ᄈ +ᄈ +ᄈ + +ᄡ +ᄡ +ᄡ +ᄡ +ᄡ + +ᄉ +ᄉ +ᄉ +ᄉ +ᄉ + +ᄊ +ᄊ +ᄊ +ᄊ +ᄊ + +ᄋ +ᄋ +ᄋ +ᄋ +ᄋ + +ᄌ +ᄌ +ᄌ +ᄌ +ᄌ + +ᄍ +ᄍ +ᄍ +ᄍ +ᄍ + +ᄎ +ᄎ +ᄎ +ᄎ +ᄎ + +ᄏ +ᄏ +ᄏ +ᄏ +ᄏ + +ᄐ +ᄐ +ᄐ +ᄐ +ᄐ + +ᄑ +ᄑ +ᄑ +ᄑ +ᄑ + +ᄒ +ᄒ +ᄒ +ᄒ +ᄒ + +ᅡ +ᅡ +ᅡ +ᅡ +ᅡ + +ᅢ +ᅢ +ᅢ +ᅢ +ᅢ + +ᅣ +ᅣ +ᅣ +ᅣ +ᅣ + +ᅤ +ᅤ +ᅤ +ᅤ +ᅤ + +ᅥ +ᅥ +ᅥ +ᅥ +ᅥ + +ᅦ +ᅦ +ᅦ +ᅦ +ᅦ + +ᅧ +ᅧ +ᅧ +ᅧ +ᅧ + +ᅨ +ᅨ +ᅨ +ᅨ +ᅨ + +ᅩ +ᅩ +ᅩ +ᅩ +ᅩ + +ᅪ +ᅪ +ᅪ +ᅪ +ᅪ + +ᅫ +ᅫ +ᅫ +ᅫ +ᅫ + +ᅬ +ᅬ +ᅬ +ᅬ +ᅬ + +ᅭ +ᅭ +ᅭ +ᅭ +ᅭ + +ᅮ +ᅮ +ᅮ +ᅮ +ᅮ + +ᅯ +ᅯ +ᅯ +ᅯ +ᅯ + +ᅰ +ᅰ +ᅰ +ᅰ +ᅰ + +ᅱ +ᅱ +ᅱ +ᅱ +ᅱ + +ᅲ +ᅲ +ᅲ +ᅲ +ᅲ + +ᅳ +ᅳ +ᅳ +ᅳ +ᅳ + +ᅴ +ᅴ +ᅴ +ᅴ +ᅴ + +ᅵ +ᅵ +ᅵ +ᅵ +ᅵ + +¢ +¢ +¢ +¢ +¢ + +£ +£ +£ +£ +£ + +¬ +¬ +¬ +¬ +¬ + + ̄ + ̄ + ̄ + ̄ + ̄ + +¦ +¦ +¦ +¦ +¦ + +¥ +¥ +¥ +¥ +¥ + +₩ +₩ +₩ +₩ +₩ + +│ +│ +│ +│ +│ + +← +← +← +← +← + +↑ +↑ +↑ +↑ +↑ + +→ +→ +→ +→ +→ + +↓ +↓ +↓ +↓ +↓ + +■ +■ +■ +■ +■ + +○ +○ +○ +○ +○ + +𑂚 +𑂚 +𑂚 +𑂚 +𑂚 + +𑂜 +𑂜 +𑂜 +𑂜 +𑂜 + +𑂫 +𑂫 +𑂫 +𑂫 +𑂫 + +𝅗𝅥 +𝅗𝅥 +𝅗𝅥 +𝅗𝅥 +𝅗𝅥 + +𝅘𝅥 +𝅘𝅥 +𝅘𝅥 +𝅘𝅥 +𝅘𝅥 + +𝅘𝅥𝅮 +𝅘𝅥𝅮 +𝅘𝅥𝅮 +𝅘𝅥𝅮 +𝅘𝅥𝅮 + +𝅘𝅥𝅯 +𝅘𝅥𝅯 +𝅘𝅥𝅯 +𝅘𝅥𝅯 +𝅘𝅥𝅯 + +𝅘𝅥𝅰 +𝅘𝅥𝅰 +𝅘𝅥𝅰 +𝅘𝅥𝅰 +𝅘𝅥𝅰 + +𝅘𝅥𝅱 +𝅘𝅥𝅱 +𝅘𝅥𝅱 +𝅘𝅥𝅱 +𝅘𝅥𝅱 + +𝅘𝅥𝅲 +𝅘𝅥𝅲 +𝅘𝅥𝅲 +𝅘𝅥𝅲 +𝅘𝅥𝅲 + +𝆹𝅥 +𝆹𝅥 +𝆹𝅥 +𝆹𝅥 +𝆹𝅥 + +𝆺𝅥 +𝆺𝅥 +𝆺𝅥 +𝆺𝅥 +𝆺𝅥 + +𝆹𝅥𝅮 +𝆹𝅥𝅮 +𝆹𝅥𝅮 +𝆹𝅥𝅮 +𝆹𝅥𝅮 + +𝆺𝅥𝅮 +𝆺𝅥𝅮 +𝆺𝅥𝅮 +𝆺𝅥𝅮 +𝆺𝅥𝅮 + +𝆹𝅥𝅯 +𝆹𝅥𝅯 +𝆹𝅥𝅯 +𝆹𝅥𝅯 +𝆹𝅥𝅯 + +𝆺𝅥𝅯 +𝆺𝅥𝅯 +𝆺𝅥𝅯 +𝆺𝅥𝅯 +𝆺𝅥𝅯 + +𝐀 +𝐀 +𝐀 +A +A + +𝐁 +𝐁 +𝐁 +B +B + +𝐂 +𝐂 +𝐂 +C +C + +𝐃 +𝐃 +𝐃 +D +D + +𝐄 +𝐄 +𝐄 +E +E + +𝐅 +𝐅 +𝐅 +F +F + +𝐆 +𝐆 +𝐆 +G +G + +𝐇 +𝐇 +𝐇 +H +H + +𝐈 +𝐈 +𝐈 +I +I + +𝐉 +𝐉 +𝐉 +J +J + +𝐊 +𝐊 +𝐊 +K +K + +𝐋 +𝐋 +𝐋 +L +L + +𝐌 +𝐌 +𝐌 +M +M + +𝐍 +𝐍 +𝐍 +N +N + +𝐎 +𝐎 +𝐎 +O +O + +𝐏 +𝐏 +𝐏 +P +P + +𝐐 +𝐐 +𝐐 +Q +Q + +𝐑 +𝐑 +𝐑 +R +R + +𝐒 +𝐒 +𝐒 +S +S + +𝐓 +𝐓 +𝐓 +T +T + +𝐔 +𝐔 +𝐔 +U +U + +𝐕 +𝐕 +𝐕 +V +V + +𝐖 +𝐖 +𝐖 +W +W + +𝐗 +𝐗 +𝐗 +X +X + +𝐘 +𝐘 +𝐘 +Y +Y + +𝐙 +𝐙 +𝐙 +Z +Z + +𝐚 +𝐚 +𝐚 +a +a + +𝐛 +𝐛 +𝐛 +b +b + +𝐜 +𝐜 +𝐜 +c +c + +𝐝 +𝐝 +𝐝 +d +d + +𝐞 +𝐞 +𝐞 +e +e + +𝐟 +𝐟 +𝐟 +f +f + +𝐠 +𝐠 +𝐠 +g +g + +𝐡 +𝐡 +𝐡 +h +h + +𝐢 +𝐢 +𝐢 +i +i + +𝐣 +𝐣 +𝐣 +j +j + +𝐤 +𝐤 +𝐤 +k +k + +𝐥 +𝐥 +𝐥 +l +l + +𝐦 +𝐦 +𝐦 +m +m + +𝐧 +𝐧 +𝐧 +n +n + +𝐨 +𝐨 +𝐨 +o +o + +𝐩 +𝐩 +𝐩 +p +p + +𝐪 +𝐪 +𝐪 +q +q + +𝐫 +𝐫 +𝐫 +r +r + +𝐬 +𝐬 +𝐬 +s +s + +𝐭 +𝐭 +𝐭 +t +t + +𝐮 +𝐮 +𝐮 +u +u + +𝐯 +𝐯 +𝐯 +v +v + +𝐰 +𝐰 +𝐰 +w +w + +𝐱 +𝐱 +𝐱 +x +x + +𝐲 +𝐲 +𝐲 +y +y + +𝐳 +𝐳 +𝐳 +z +z + +𝐴 +𝐴 +𝐴 +A +A + +𝐵 +𝐵 +𝐵 +B +B + +𝐶 +𝐶 +𝐶 +C +C + +𝐷 +𝐷 +𝐷 +D +D + +𝐸 +𝐸 +𝐸 +E +E + +𝐹 +𝐹 +𝐹 +F +F + +𝐺 +𝐺 +𝐺 +G +G + +𝐻 +𝐻 +𝐻 +H +H + +𝐼 +𝐼 +𝐼 +I +I + +𝐽 +𝐽 +𝐽 +J +J + +𝐾 +𝐾 +𝐾 +K +K + +𝐿 +𝐿 +𝐿 +L +L + +𝑀 +𝑀 +𝑀 +M +M + +𝑁 +𝑁 +𝑁 +N +N + +𝑂 +𝑂 +𝑂 +O +O + +𝑃 +𝑃 +𝑃 +P +P + +𝑄 +𝑄 +𝑄 +Q +Q + +𝑅 +𝑅 +𝑅 +R +R + +𝑆 +𝑆 +𝑆 +S +S + +𝑇 +𝑇 +𝑇 +T +T + +𝑈 +𝑈 +𝑈 +U +U + +𝑉 +𝑉 +𝑉 +V +V + +𝑊 +𝑊 +𝑊 +W +W + +𝑋 +𝑋 +𝑋 +X +X + +𝑌 +𝑌 +𝑌 +Y +Y + +𝑍 +𝑍 +𝑍 +Z +Z + +𝑎 +𝑎 +𝑎 +a +a + +𝑏 +𝑏 +𝑏 +b +b + +𝑐 +𝑐 +𝑐 +c +c + +𝑑 +𝑑 +𝑑 +d +d + +𝑒 +𝑒 +𝑒 +e +e + +𝑓 +𝑓 +𝑓 +f +f + +𝑔 +𝑔 +𝑔 +g +g + +𝑖 +𝑖 +𝑖 +i +i + +𝑗 +𝑗 +𝑗 +j +j + +𝑘 +𝑘 +𝑘 +k +k + +𝑙 +𝑙 +𝑙 +l +l + +𝑚 +𝑚 +𝑚 +m +m + +𝑛 +𝑛 +𝑛 +n +n + +𝑜 +𝑜 +𝑜 +o +o + +𝑝 +𝑝 +𝑝 +p +p + +𝑞 +𝑞 +𝑞 +q +q + +𝑟 +𝑟 +𝑟 +r +r + +𝑠 +𝑠 +𝑠 +s +s + +𝑡 +𝑡 +𝑡 +t +t + +𝑢 +𝑢 +𝑢 +u +u + +𝑣 +𝑣 +𝑣 +v +v + +𝑤 +𝑤 +𝑤 +w +w + +𝑥 +𝑥 +𝑥 +x +x + +𝑦 +𝑦 +𝑦 +y +y + +𝑧 +𝑧 +𝑧 +z +z + +𝑨 +𝑨 +𝑨 +A +A + +𝑩 +𝑩 +𝑩 +B +B + +𝑪 +𝑪 +𝑪 +C +C + +𝑫 +𝑫 +𝑫 +D +D + +𝑬 +𝑬 +𝑬 +E +E + +𝑭 +𝑭 +𝑭 +F +F + +𝑮 +𝑮 +𝑮 +G +G + +𝑯 +𝑯 +𝑯 +H +H + +𝑰 +𝑰 +𝑰 +I +I + +𝑱 +𝑱 +𝑱 +J +J + +𝑲 +𝑲 +𝑲 +K +K + +𝑳 +𝑳 +𝑳 +L +L + +𝑴 +𝑴 +𝑴 +M +M + +𝑵 +𝑵 +𝑵 +N +N + +𝑶 +𝑶 +𝑶 +O +O + +𝑷 +𝑷 +𝑷 +P +P + +𝑸 +𝑸 +𝑸 +Q +Q + +𝑹 +𝑹 +𝑹 +R +R + +𝑺 +𝑺 +𝑺 +S +S + +𝑻 +𝑻 +𝑻 +T +T + +𝑼 +𝑼 +𝑼 +U +U + +𝑽 +𝑽 +𝑽 +V +V + +𝑾 +𝑾 +𝑾 +W +W + +𝑿 +𝑿 +𝑿 +X +X + +𝒀 +𝒀 +𝒀 +Y +Y + +𝒁 +𝒁 +𝒁 +Z +Z + +𝒂 +𝒂 +𝒂 +a +a + +𝒃 +𝒃 +𝒃 +b +b + +𝒄 +𝒄 +𝒄 +c +c + +𝒅 +𝒅 +𝒅 +d +d + +𝒆 +𝒆 +𝒆 +e +e + +𝒇 +𝒇 +𝒇 +f +f + +𝒈 +𝒈 +𝒈 +g +g + +𝒉 +𝒉 +𝒉 +h +h + +𝒊 +𝒊 +𝒊 +i +i + +𝒋 +𝒋 +𝒋 +j +j + +𝒌 +𝒌 +𝒌 +k +k + +𝒍 +𝒍 +𝒍 +l +l + +𝒎 +𝒎 +𝒎 +m +m + +𝒏 +𝒏 +𝒏 +n +n + +𝒐 +𝒐 +𝒐 +o +o + +𝒑 +𝒑 +𝒑 +p +p + +𝒒 +𝒒 +𝒒 +q +q + +𝒓 +𝒓 +𝒓 +r +r + +𝒔 +𝒔 +𝒔 +s +s + +𝒕 +𝒕 +𝒕 +t +t + +𝒖 +𝒖 +𝒖 +u +u + +𝒗 +𝒗 +𝒗 +v +v + +𝒘 +𝒘 +𝒘 +w +w + +𝒙 +𝒙 +𝒙 +x +x + +𝒚 +𝒚 +𝒚 +y +y + +𝒛 +𝒛 +𝒛 +z +z + +𝒜 +𝒜 +𝒜 +A +A + +𝒞 +𝒞 +𝒞 +C +C + +𝒟 +𝒟 +𝒟 +D +D + +𝒢 +𝒢 +𝒢 +G +G + +𝒥 +𝒥 +𝒥 +J +J + +𝒦 +𝒦 +𝒦 +K +K + +𝒩 +𝒩 +𝒩 +N +N + +𝒪 +𝒪 +𝒪 +O +O + +𝒫 +𝒫 +𝒫 +P +P + +𝒬 +𝒬 +𝒬 +Q +Q + +𝒮 +𝒮 +𝒮 +S +S + +𝒯 +𝒯 +𝒯 +T +T + +𝒰 +𝒰 +𝒰 +U +U + +𝒱 +𝒱 +𝒱 +V +V + +𝒲 +𝒲 +𝒲 +W +W + +𝒳 +𝒳 +𝒳 +X +X + +𝒴 +𝒴 +𝒴 +Y +Y + +𝒵 +𝒵 +𝒵 +Z +Z + +𝒶 +𝒶 +𝒶 +a +a + +𝒷 +𝒷 +𝒷 +b +b + +𝒸 +𝒸 +𝒸 +c +c + +𝒹 +𝒹 +𝒹 +d +d + +𝒻 +𝒻 +𝒻 +f +f + +𝒽 +𝒽 +𝒽 +h +h + +𝒾 +𝒾 +𝒾 +i +i + +𝒿 +𝒿 +𝒿 +j +j + +𝓀 +𝓀 +𝓀 +k +k + +𝓁 +𝓁 +𝓁 +l +l + +𝓂 +𝓂 +𝓂 +m +m + +𝓃 +𝓃 +𝓃 +n +n + +𝓅 +𝓅 +𝓅 +p +p + +𝓆 +𝓆 +𝓆 +q +q + +𝓇 +𝓇 +𝓇 +r +r + +𝓈 +𝓈 +𝓈 +s +s + +𝓉 +𝓉 +𝓉 +t +t + +𝓊 +𝓊 +𝓊 +u +u + +𝓋 +𝓋 +𝓋 +v +v + +𝓌 +𝓌 +𝓌 +w +w + +𝓍 +𝓍 +𝓍 +x +x + +𝓎 +𝓎 +𝓎 +y +y + +𝓏 +𝓏 +𝓏 +z +z + +𝓐 +𝓐 +𝓐 +A +A + +𝓑 +𝓑 +𝓑 +B +B + +𝓒 +𝓒 +𝓒 +C +C + +𝓓 +𝓓 +𝓓 +D +D + +𝓔 +𝓔 +𝓔 +E +E + +𝓕 +𝓕 +𝓕 +F +F + +𝓖 +𝓖 +𝓖 +G +G + +𝓗 +𝓗 +𝓗 +H +H + +𝓘 +𝓘 +𝓘 +I +I + +𝓙 +𝓙 +𝓙 +J +J + +𝓚 +𝓚 +𝓚 +K +K + +𝓛 +𝓛 +𝓛 +L +L + +𝓜 +𝓜 +𝓜 +M +M + +𝓝 +𝓝 +𝓝 +N +N + +𝓞 +𝓞 +𝓞 +O +O + +𝓟 +𝓟 +𝓟 +P +P + +𝓠 +𝓠 +𝓠 +Q +Q + +𝓡 +𝓡 +𝓡 +R +R + +𝓢 +𝓢 +𝓢 +S +S + +𝓣 +𝓣 +𝓣 +T +T + +𝓤 +𝓤 +𝓤 +U +U + +𝓥 +𝓥 +𝓥 +V +V + +𝓦 +𝓦 +𝓦 +W +W + +𝓧 +𝓧 +𝓧 +X +X + +𝓨 +𝓨 +𝓨 +Y +Y + +𝓩 +𝓩 +𝓩 +Z +Z + +𝓪 +𝓪 +𝓪 +a +a + +𝓫 +𝓫 +𝓫 +b +b + +𝓬 +𝓬 +𝓬 +c +c + +𝓭 +𝓭 +𝓭 +d +d + +𝓮 +𝓮 +𝓮 +e +e + +𝓯 +𝓯 +𝓯 +f +f + +𝓰 +𝓰 +𝓰 +g +g + +𝓱 +𝓱 +𝓱 +h +h + +𝓲 +𝓲 +𝓲 +i +i + +𝓳 +𝓳 +𝓳 +j +j + +𝓴 +𝓴 +𝓴 +k +k + +𝓵 +𝓵 +𝓵 +l +l + +𝓶 +𝓶 +𝓶 +m +m + +𝓷 +𝓷 +𝓷 +n +n + +𝓸 +𝓸 +𝓸 +o +o + +𝓹 +𝓹 +𝓹 +p +p + +𝓺 +𝓺 +𝓺 +q +q + +𝓻 +𝓻 +𝓻 +r +r + +𝓼 +𝓼 +𝓼 +s +s + +𝓽 +𝓽 +𝓽 +t +t + +𝓾 +𝓾 +𝓾 +u +u + +𝓿 +𝓿 +𝓿 +v +v + +𝔀 +𝔀 +𝔀 +w +w + +𝔁 +𝔁 +𝔁 +x +x + +𝔂 +𝔂 +𝔂 +y +y + +𝔃 +𝔃 +𝔃 +z +z + +𝔄 +𝔄 +𝔄 +A +A + +𝔅 +𝔅 +𝔅 +B +B + +𝔇 +𝔇 +𝔇 +D +D + +𝔈 +𝔈 +𝔈 +E +E + +𝔉 +𝔉 +𝔉 +F +F + +𝔊 +𝔊 +𝔊 +G +G + +𝔍 +𝔍 +𝔍 +J +J + +𝔎 +𝔎 +𝔎 +K +K + +𝔏 +𝔏 +𝔏 +L +L + +𝔐 +𝔐 +𝔐 +M +M + +𝔑 +𝔑 +𝔑 +N +N + +𝔒 +𝔒 +𝔒 +O +O + +𝔓 +𝔓 +𝔓 +P +P + +𝔔 +𝔔 +𝔔 +Q +Q + +𝔖 +𝔖 +𝔖 +S +S + +𝔗 +𝔗 +𝔗 +T +T + +𝔘 +𝔘 +𝔘 +U +U + +𝔙 +𝔙 +𝔙 +V +V + +𝔚 +𝔚 +𝔚 +W +W + +𝔛 +𝔛 +𝔛 +X +X + +𝔜 +𝔜 +𝔜 +Y +Y + +𝔞 +𝔞 +𝔞 +a +a + +𝔟 +𝔟 +𝔟 +b +b + +𝔠 +𝔠 +𝔠 +c +c + +𝔡 +𝔡 +𝔡 +d +d + +𝔢 +𝔢 +𝔢 +e +e + +𝔣 +𝔣 +𝔣 +f +f + +𝔤 +𝔤 +𝔤 +g +g + +𝔥 +𝔥 +𝔥 +h +h + +𝔦 +𝔦 +𝔦 +i +i + +𝔧 +𝔧 +𝔧 +j +j + +𝔨 +𝔨 +𝔨 +k +k + +𝔩 +𝔩 +𝔩 +l +l + +𝔪 +𝔪 +𝔪 +m +m + +𝔫 +𝔫 +𝔫 +n +n + +𝔬 +𝔬 +𝔬 +o +o + +𝔭 +𝔭 +𝔭 +p +p + +𝔮 +𝔮 +𝔮 +q +q + +𝔯 +𝔯 +𝔯 +r +r + +𝔰 +𝔰 +𝔰 +s +s + +𝔱 +𝔱 +𝔱 +t +t + +𝔲 +𝔲 +𝔲 +u +u + +𝔳 +𝔳 +𝔳 +v +v + +𝔴 +𝔴 +𝔴 +w +w + +𝔵 +𝔵 +𝔵 +x +x + +𝔶 +𝔶 +𝔶 +y +y + +𝔷 +𝔷 +𝔷 +z +z + +𝔸 +𝔸 +𝔸 +A +A + +𝔹 +𝔹 +𝔹 +B +B + +𝔻 +𝔻 +𝔻 +D +D + +𝔼 +𝔼 +𝔼 +E +E + +𝔽 +𝔽 +𝔽 +F +F + +𝔾 +𝔾 +𝔾 +G +G + +𝕀 +𝕀 +𝕀 +I +I + +𝕁 +𝕁 +𝕁 +J +J + +𝕂 +𝕂 +𝕂 +K +K + +𝕃 +𝕃 +𝕃 +L +L + +𝕄 +𝕄 +𝕄 +M +M + +𝕆 +𝕆 +𝕆 +O +O + +𝕊 +𝕊 +𝕊 +S +S + +𝕋 +𝕋 +𝕋 +T +T + +𝕌 +𝕌 +𝕌 +U +U + +𝕍 +𝕍 +𝕍 +V +V + +𝕎 +𝕎 +𝕎 +W +W + +𝕏 +𝕏 +𝕏 +X +X + +𝕐 +𝕐 +𝕐 +Y +Y + +𝕒 +𝕒 +𝕒 +a +a + +𝕓 +𝕓 +𝕓 +b +b + +𝕔 +𝕔 +𝕔 +c +c + +𝕕 +𝕕 +𝕕 +d +d + +𝕖 +𝕖 +𝕖 +e +e + +𝕗 +𝕗 +𝕗 +f +f + +𝕘 +𝕘 +𝕘 +g +g + +𝕙 +𝕙 +𝕙 +h +h + +𝕚 +𝕚 +𝕚 +i +i + +𝕛 +𝕛 +𝕛 +j +j + +𝕜 +𝕜 +𝕜 +k +k + +𝕝 +𝕝 +𝕝 +l +l + +𝕞 +𝕞 +𝕞 +m +m + +𝕟 +𝕟 +𝕟 +n +n + +𝕠 +𝕠 +𝕠 +o +o + +𝕡 +𝕡 +𝕡 +p +p + +𝕢 +𝕢 +𝕢 +q +q + +𝕣 +𝕣 +𝕣 +r +r + +𝕤 +𝕤 +𝕤 +s +s + +𝕥 +𝕥 +𝕥 +t +t + +𝕦 +𝕦 +𝕦 +u +u + +𝕧 +𝕧 +𝕧 +v +v + +𝕨 +𝕨 +𝕨 +w +w + +𝕩 +𝕩 +𝕩 +x +x + +𝕪 +𝕪 +𝕪 +y +y + +𝕫 +𝕫 +𝕫 +z +z + +𝕬 +𝕬 +𝕬 +A +A + +𝕭 +𝕭 +𝕭 +B +B + +𝕮 +𝕮 +𝕮 +C +C + +𝕯 +𝕯 +𝕯 +D +D + +𝕰 +𝕰 +𝕰 +E +E + +𝕱 +𝕱 +𝕱 +F +F + +𝕲 +𝕲 +𝕲 +G +G + +𝕳 +𝕳 +𝕳 +H +H + +𝕴 +𝕴 +𝕴 +I +I + +𝕵 +𝕵 +𝕵 +J +J + +𝕶 +𝕶 +𝕶 +K +K + +𝕷 +𝕷 +𝕷 +L +L + +𝕸 +𝕸 +𝕸 +M +M + +𝕹 +𝕹 +𝕹 +N +N + +𝕺 +𝕺 +𝕺 +O +O + +𝕻 +𝕻 +𝕻 +P +P + +𝕼 +𝕼 +𝕼 +Q +Q + +𝕽 +𝕽 +𝕽 +R +R + +𝕾 +𝕾 +𝕾 +S +S + +𝕿 +𝕿 +𝕿 +T +T + +𝖀 +𝖀 +𝖀 +U +U + +𝖁 +𝖁 +𝖁 +V +V + +𝖂 +𝖂 +𝖂 +W +W + +𝖃 +𝖃 +𝖃 +X +X + +𝖄 +𝖄 +𝖄 +Y +Y + +𝖅 +𝖅 +𝖅 +Z +Z + +𝖆 +𝖆 +𝖆 +a +a + +𝖇 +𝖇 +𝖇 +b +b + +𝖈 +𝖈 +𝖈 +c +c + +𝖉 +𝖉 +𝖉 +d +d + +𝖊 +𝖊 +𝖊 +e +e + +𝖋 +𝖋 +𝖋 +f +f + +𝖌 +𝖌 +𝖌 +g +g + +𝖍 +𝖍 +𝖍 +h +h + +𝖎 +𝖎 +𝖎 +i +i + +𝖏 +𝖏 +𝖏 +j +j + +𝖐 +𝖐 +𝖐 +k +k + +𝖑 +𝖑 +𝖑 +l +l + +𝖒 +𝖒 +𝖒 +m +m + +𝖓 +𝖓 +𝖓 +n +n + +𝖔 +𝖔 +𝖔 +o +o + +𝖕 +𝖕 +𝖕 +p +p + +𝖖 +𝖖 +𝖖 +q +q + +𝖗 +𝖗 +𝖗 +r +r + +𝖘 +𝖘 +𝖘 +s +s + +𝖙 +𝖙 +𝖙 +t +t + +𝖚 +𝖚 +𝖚 +u +u + +𝖛 +𝖛 +𝖛 +v +v + +𝖜 +𝖜 +𝖜 +w +w + +𝖝 +𝖝 +𝖝 +x +x + +𝖞 +𝖞 +𝖞 +y +y + +𝖟 +𝖟 +𝖟 +z +z + +𝖠 +𝖠 +𝖠 +A +A + +𝖡 +𝖡 +𝖡 +B +B + +𝖢 +𝖢 +𝖢 +C +C + +𝖣 +𝖣 +𝖣 +D +D + +𝖤 +𝖤 +𝖤 +E +E + +𝖥 +𝖥 +𝖥 +F +F + +𝖦 +𝖦 +𝖦 +G +G + +𝖧 +𝖧 +𝖧 +H +H + +𝖨 +𝖨 +𝖨 +I +I + +𝖩 +𝖩 +𝖩 +J +J + +𝖪 +𝖪 +𝖪 +K +K + +𝖫 +𝖫 +𝖫 +L +L + +𝖬 +𝖬 +𝖬 +M +M + +𝖭 +𝖭 +𝖭 +N +N + +𝖮 +𝖮 +𝖮 +O +O + +𝖯 +𝖯 +𝖯 +P +P + +𝖰 +𝖰 +𝖰 +Q +Q + +𝖱 +𝖱 +𝖱 +R +R + +𝖲 +𝖲 +𝖲 +S +S + +𝖳 +𝖳 +𝖳 +T +T + +𝖴 +𝖴 +𝖴 +U +U + +𝖵 +𝖵 +𝖵 +V +V + +𝖶 +𝖶 +𝖶 +W +W + +𝖷 +𝖷 +𝖷 +X +X + +𝖸 +𝖸 +𝖸 +Y +Y + +𝖹 +𝖹 +𝖹 +Z +Z + +𝖺 +𝖺 +𝖺 +a +a + +𝖻 +𝖻 +𝖻 +b +b + +𝖼 +𝖼 +𝖼 +c +c + +𝖽 +𝖽 +𝖽 +d +d + +𝖾 +𝖾 +𝖾 +e +e + +𝖿 +𝖿 +𝖿 +f +f + +𝗀 +𝗀 +𝗀 +g +g + +𝗁 +𝗁 +𝗁 +h +h + +𝗂 +𝗂 +𝗂 +i +i + +𝗃 +𝗃 +𝗃 +j +j + +𝗄 +𝗄 +𝗄 +k +k + +𝗅 +𝗅 +𝗅 +l +l + +𝗆 +𝗆 +𝗆 +m +m + +𝗇 +𝗇 +𝗇 +n +n + +𝗈 +𝗈 +𝗈 +o +o + +𝗉 +𝗉 +𝗉 +p +p + +𝗊 +𝗊 +𝗊 +q +q + +𝗋 +𝗋 +𝗋 +r +r + +𝗌 +𝗌 +𝗌 +s +s + +𝗍 +𝗍 +𝗍 +t +t + +𝗎 +𝗎 +𝗎 +u +u + +𝗏 +𝗏 +𝗏 +v +v + +𝗐 +𝗐 +𝗐 +w +w + +𝗑 +𝗑 +𝗑 +x +x + +𝗒 +𝗒 +𝗒 +y +y + +𝗓 +𝗓 +𝗓 +z +z + +𝗔 +𝗔 +𝗔 +A +A + +𝗕 +𝗕 +𝗕 +B +B + +𝗖 +𝗖 +𝗖 +C +C + +𝗗 +𝗗 +𝗗 +D +D + +𝗘 +𝗘 +𝗘 +E +E + +𝗙 +𝗙 +𝗙 +F +F + +𝗚 +𝗚 +𝗚 +G +G + +𝗛 +𝗛 +𝗛 +H +H + +𝗜 +𝗜 +𝗜 +I +I + +𝗝 +𝗝 +𝗝 +J +J + +𝗞 +𝗞 +𝗞 +K +K + +𝗟 +𝗟 +𝗟 +L +L + +𝗠 +𝗠 +𝗠 +M +M + +𝗡 +𝗡 +𝗡 +N +N + +𝗢 +𝗢 +𝗢 +O +O + +𝗣 +𝗣 +𝗣 +P +P + +𝗤 +𝗤 +𝗤 +Q +Q + +𝗥 +𝗥 +𝗥 +R +R + +𝗦 +𝗦 +𝗦 +S +S + +𝗧 +𝗧 +𝗧 +T +T + +𝗨 +𝗨 +𝗨 +U +U + +𝗩 +𝗩 +𝗩 +V +V + +𝗪 +𝗪 +𝗪 +W +W + +𝗫 +𝗫 +𝗫 +X +X + +𝗬 +𝗬 +𝗬 +Y +Y + +𝗭 +𝗭 +𝗭 +Z +Z + +𝗮 +𝗮 +𝗮 +a +a + +𝗯 +𝗯 +𝗯 +b +b + +𝗰 +𝗰 +𝗰 +c +c + +𝗱 +𝗱 +𝗱 +d +d + +𝗲 +𝗲 +𝗲 +e +e + +𝗳 +𝗳 +𝗳 +f +f + +𝗴 +𝗴 +𝗴 +g +g + +𝗵 +𝗵 +𝗵 +h +h + +𝗶 +𝗶 +𝗶 +i +i + +𝗷 +𝗷 +𝗷 +j +j + +𝗸 +𝗸 +𝗸 +k +k + +𝗹 +𝗹 +𝗹 +l +l + +𝗺 +𝗺 +𝗺 +m +m + +𝗻 +𝗻 +𝗻 +n +n + +𝗼 +𝗼 +𝗼 +o +o + +𝗽 +𝗽 +𝗽 +p +p + +𝗾 +𝗾 +𝗾 +q +q + +𝗿 +𝗿 +𝗿 +r +r + +𝘀 +𝘀 +𝘀 +s +s + +𝘁 +𝘁 +𝘁 +t +t + +𝘂 +𝘂 +𝘂 +u +u + +𝘃 +𝘃 +𝘃 +v +v + +𝘄 +𝘄 +𝘄 +w +w + +𝘅 +𝘅 +𝘅 +x +x + +𝘆 +𝘆 +𝘆 +y +y + +𝘇 +𝘇 +𝘇 +z +z + +𝘈 +𝘈 +𝘈 +A +A + +𝘉 +𝘉 +𝘉 +B +B + +𝘊 +𝘊 +𝘊 +C +C + +𝘋 +𝘋 +𝘋 +D +D + +𝘌 +𝘌 +𝘌 +E +E + +𝘍 +𝘍 +𝘍 +F +F + +𝘎 +𝘎 +𝘎 +G +G + +𝘏 +𝘏 +𝘏 +H +H + +𝘐 +𝘐 +𝘐 +I +I + +𝘑 +𝘑 +𝘑 +J +J + +𝘒 +𝘒 +𝘒 +K +K + +𝘓 +𝘓 +𝘓 +L +L + +𝘔 +𝘔 +𝘔 +M +M + +𝘕 +𝘕 +𝘕 +N +N + +𝘖 +𝘖 +𝘖 +O +O + +𝘗 +𝘗 +𝘗 +P +P + +𝘘 +𝘘 +𝘘 +Q +Q + +𝘙 +𝘙 +𝘙 +R +R + +𝘚 +𝘚 +𝘚 +S +S + +𝘛 +𝘛 +𝘛 +T +T + +𝘜 +𝘜 +𝘜 +U +U + +𝘝 +𝘝 +𝘝 +V +V + +𝘞 +𝘞 +𝘞 +W +W + +𝘟 +𝘟 +𝘟 +X +X + +𝘠 +𝘠 +𝘠 +Y +Y + +𝘡 +𝘡 +𝘡 +Z +Z + +𝘢 +𝘢 +𝘢 +a +a + +𝘣 +𝘣 +𝘣 +b +b + +𝘤 +𝘤 +𝘤 +c +c + +𝘥 +𝘥 +𝘥 +d +d + +𝘦 +𝘦 +𝘦 +e +e + +𝘧 +𝘧 +𝘧 +f +f + +𝘨 +𝘨 +𝘨 +g +g + +𝘩 +𝘩 +𝘩 +h +h + +𝘪 +𝘪 +𝘪 +i +i + +𝘫 +𝘫 +𝘫 +j +j + +𝘬 +𝘬 +𝘬 +k +k + +𝘭 +𝘭 +𝘭 +l +l + +𝘮 +𝘮 +𝘮 +m +m + +𝘯 +𝘯 +𝘯 +n +n + +𝘰 +𝘰 +𝘰 +o +o + +𝘱 +𝘱 +𝘱 +p +p + +𝘲 +𝘲 +𝘲 +q +q + +𝘳 +𝘳 +𝘳 +r +r + +𝘴 +𝘴 +𝘴 +s +s + +𝘵 +𝘵 +𝘵 +t +t + +𝘶 +𝘶 +𝘶 +u +u + +𝘷 +𝘷 +𝘷 +v +v + +𝘸 +𝘸 +𝘸 +w +w + +𝘹 +𝘹 +𝘹 +x +x + +𝘺 +𝘺 +𝘺 +y +y + +𝘻 +𝘻 +𝘻 +z +z + +𝘼 +𝘼 +𝘼 +A +A + +𝘽 +𝘽 +𝘽 +B +B + +𝘾 +𝘾 +𝘾 +C +C + +𝘿 +𝘿 +𝘿 +D +D + +𝙀 +𝙀 +𝙀 +E +E + +𝙁 +𝙁 +𝙁 +F +F + +𝙂 +𝙂 +𝙂 +G +G + +𝙃 +𝙃 +𝙃 +H +H + +𝙄 +𝙄 +𝙄 +I +I + +𝙅 +𝙅 +𝙅 +J +J + +𝙆 +𝙆 +𝙆 +K +K + +𝙇 +𝙇 +𝙇 +L +L + +𝙈 +𝙈 +𝙈 +M +M + +𝙉 +𝙉 +𝙉 +N +N + +𝙊 +𝙊 +𝙊 +O +O + +𝙋 +𝙋 +𝙋 +P +P + +𝙌 +𝙌 +𝙌 +Q +Q + +𝙍 +𝙍 +𝙍 +R +R + +𝙎 +𝙎 +𝙎 +S +S + +𝙏 +𝙏 +𝙏 +T +T + +𝙐 +𝙐 +𝙐 +U +U + +𝙑 +𝙑 +𝙑 +V +V + +𝙒 +𝙒 +𝙒 +W +W + +𝙓 +𝙓 +𝙓 +X +X + +𝙔 +𝙔 +𝙔 +Y +Y + +𝙕 +𝙕 +𝙕 +Z +Z + +𝙖 +𝙖 +𝙖 +a +a + +𝙗 +𝙗 +𝙗 +b +b + +𝙘 +𝙘 +𝙘 +c +c + +𝙙 +𝙙 +𝙙 +d +d + +𝙚 +𝙚 +𝙚 +e +e + +𝙛 +𝙛 +𝙛 +f +f + +𝙜 +𝙜 +𝙜 +g +g + +𝙝 +𝙝 +𝙝 +h +h + +𝙞 +𝙞 +𝙞 +i +i + +𝙟 +𝙟 +𝙟 +j +j + +𝙠 +𝙠 +𝙠 +k +k + +𝙡 +𝙡 +𝙡 +l +l + +𝙢 +𝙢 +𝙢 +m +m + +𝙣 +𝙣 +𝙣 +n +n + +𝙤 +𝙤 +𝙤 +o +o + +𝙥 +𝙥 +𝙥 +p +p + +𝙦 +𝙦 +𝙦 +q +q + +𝙧 +𝙧 +𝙧 +r +r + +𝙨 +𝙨 +𝙨 +s +s + +𝙩 +𝙩 +𝙩 +t +t + +𝙪 +𝙪 +𝙪 +u +u + +𝙫 +𝙫 +𝙫 +v +v + +𝙬 +𝙬 +𝙬 +w +w + +𝙭 +𝙭 +𝙭 +x +x + +𝙮 +𝙮 +𝙮 +y +y + +𝙯 +𝙯 +𝙯 +z +z + +𝙰 +𝙰 +𝙰 +A +A + +𝙱 +𝙱 +𝙱 +B +B + +𝙲 +𝙲 +𝙲 +C +C + +𝙳 +𝙳 +𝙳 +D +D + +𝙴 +𝙴 +𝙴 +E +E + +𝙵 +𝙵 +𝙵 +F +F + +𝙶 +𝙶 +𝙶 +G +G + +𝙷 +𝙷 +𝙷 +H +H + +𝙸 +𝙸 +𝙸 +I +I + +𝙹 +𝙹 +𝙹 +J +J + +𝙺 +𝙺 +𝙺 +K +K + +𝙻 +𝙻 +𝙻 +L +L + +𝙼 +𝙼 +𝙼 +M +M + +𝙽 +𝙽 +𝙽 +N +N + +𝙾 +𝙾 +𝙾 +O +O + +𝙿 +𝙿 +𝙿 +P +P + +𝚀 +𝚀 +𝚀 +Q +Q + +𝚁 +𝚁 +𝚁 +R +R + +𝚂 +𝚂 +𝚂 +S +S + +𝚃 +𝚃 +𝚃 +T +T + +𝚄 +𝚄 +𝚄 +U +U + +𝚅 +𝚅 +𝚅 +V +V + +𝚆 +𝚆 +𝚆 +W +W + +𝚇 +𝚇 +𝚇 +X +X + +𝚈 +𝚈 +𝚈 +Y +Y + +𝚉 +𝚉 +𝚉 +Z +Z + +𝚊 +𝚊 +𝚊 +a +a + +𝚋 +𝚋 +𝚋 +b +b + +𝚌 +𝚌 +𝚌 +c +c + +𝚍 +𝚍 +𝚍 +d +d + +𝚎 +𝚎 +𝚎 +e +e + +𝚏 +𝚏 +𝚏 +f +f + +𝚐 +𝚐 +𝚐 +g +g + +𝚑 +𝚑 +𝚑 +h +h + +𝚒 +𝚒 +𝚒 +i +i + +𝚓 +𝚓 +𝚓 +j +j + +𝚔 +𝚔 +𝚔 +k +k + +𝚕 +𝚕 +𝚕 +l +l + +𝚖 +𝚖 +𝚖 +m +m + +𝚗 +𝚗 +𝚗 +n +n + +𝚘 +𝚘 +𝚘 +o +o + +𝚙 +𝚙 +𝚙 +p +p + +𝚚 +𝚚 +𝚚 +q +q + +𝚛 +𝚛 +𝚛 +r +r + +𝚜 +𝚜 +𝚜 +s +s + +𝚝 +𝚝 +𝚝 +t +t + +𝚞 +𝚞 +𝚞 +u +u + +𝚟 +𝚟 +𝚟 +v +v + +𝚠 +𝚠 +𝚠 +w +w + +𝚡 +𝚡 +𝚡 +x +x + +𝚢 +𝚢 +𝚢 +y +y + +𝚣 +𝚣 +𝚣 +z +z + +𝚤 +𝚤 +𝚤 +ı +ı + +𝚥 +𝚥 +𝚥 +ȷ +ȷ + +𝚨 +𝚨 +𝚨 +Α +Α + +𝚩 +𝚩 +𝚩 +Β +Β + +𝚪 +𝚪 +𝚪 +Γ +Γ + +𝚫 +𝚫 +𝚫 +Δ +Δ + +𝚬 +𝚬 +𝚬 +Ε +Ε + +𝚭 +𝚭 +𝚭 +Ζ +Ζ + +𝚮 +𝚮 +𝚮 +Η +Η + +𝚯 +𝚯 +𝚯 +Θ +Θ + +𝚰 +𝚰 +𝚰 +Ι +Ι + +𝚱 +𝚱 +𝚱 +Κ +Κ + +𝚲 +𝚲 +𝚲 +Λ +Λ + +𝚳 +𝚳 +𝚳 +Μ +Μ + +𝚴 +𝚴 +𝚴 +Ν +Ν + +𝚵 +𝚵 +𝚵 +Ξ +Ξ + +𝚶 +𝚶 +𝚶 +Ο +Ο + +𝚷 +𝚷 +𝚷 +Π +Π + +𝚸 +𝚸 +𝚸 +Ρ +Ρ + +𝚹 +𝚹 +𝚹 +Θ +Θ + +𝚺 +𝚺 +𝚺 +Σ +Σ + +𝚻 +𝚻 +𝚻 +Τ +Τ + +𝚼 +𝚼 +𝚼 +Υ +Υ + +𝚽 +𝚽 +𝚽 +Φ +Φ + +𝚾 +𝚾 +𝚾 +Χ +Χ + +𝚿 +𝚿 +𝚿 +Ψ +Ψ + +𝛀 +𝛀 +𝛀 +Ω +Ω + +𝛁 +𝛁 +𝛁 +∇ +∇ + +𝛂 +𝛂 +𝛂 +α +α + +𝛃 +𝛃 +𝛃 +β +β + +𝛄 +𝛄 +𝛄 +γ +γ + +𝛅 +𝛅 +𝛅 +δ +δ + +𝛆 +𝛆 +𝛆 +ε +ε + +𝛇 +𝛇 +𝛇 +ζ +ζ + +𝛈 +𝛈 +𝛈 +η +η + +𝛉 +𝛉 +𝛉 +θ +θ + +𝛊 +𝛊 +𝛊 +ι +ι + +𝛋 +𝛋 +𝛋 +κ +κ + +𝛌 +𝛌 +𝛌 +λ +λ + +𝛍 +𝛍 +𝛍 +μ +μ + +𝛎 +𝛎 +𝛎 +ν +ν + +𝛏 +𝛏 +𝛏 +ξ +ξ + +𝛐 +𝛐 +𝛐 +ο +ο + +𝛑 +𝛑 +𝛑 +π +π + +𝛒 +𝛒 +𝛒 +ρ +ρ + +𝛓 +𝛓 +𝛓 +ς +ς + +𝛔 +𝛔 +𝛔 +σ +σ + +𝛕 +𝛕 +𝛕 +τ +τ + +𝛖 +𝛖 +𝛖 +υ +υ + +𝛗 +𝛗 +𝛗 +φ +φ + +𝛘 +𝛘 +𝛘 +χ +χ + +𝛙 +𝛙 +𝛙 +ψ +ψ + +𝛚 +𝛚 +𝛚 +ω +ω + +𝛛 +𝛛 +𝛛 +∂ +∂ + +𝛜 +𝛜 +𝛜 +ε +ε + +𝛝 +𝛝 +𝛝 +θ +θ + +𝛞 +𝛞 +𝛞 +κ +κ + +𝛟 +𝛟 +𝛟 +φ +φ + +𝛠 +𝛠 +𝛠 +ρ +ρ + +𝛡 +𝛡 +𝛡 +π +π + +𝛢 +𝛢 +𝛢 +Α +Α + +𝛣 +𝛣 +𝛣 +Β +Β + +𝛤 +𝛤 +𝛤 +Γ +Γ + +𝛥 +𝛥 +𝛥 +Δ +Δ + +𝛦 +𝛦 +𝛦 +Ε +Ε + +𝛧 +𝛧 +𝛧 +Ζ +Ζ + +𝛨 +𝛨 +𝛨 +Η +Η + +𝛩 +𝛩 +𝛩 +Θ +Θ + +𝛪 +𝛪 +𝛪 +Ι +Ι + +𝛫 +𝛫 +𝛫 +Κ +Κ + +𝛬 +𝛬 +𝛬 +Λ +Λ + +𝛭 +𝛭 +𝛭 +Μ +Μ + +𝛮 +𝛮 +𝛮 +Ν +Ν + +𝛯 +𝛯 +𝛯 +Ξ +Ξ + +𝛰 +𝛰 +𝛰 +Ο +Ο + +𝛱 +𝛱 +𝛱 +Π +Π + +𝛲 +𝛲 +𝛲 +Ρ +Ρ + +𝛳 +𝛳 +𝛳 +Θ +Θ + +𝛴 +𝛴 +𝛴 +Σ +Σ + +𝛵 +𝛵 +𝛵 +Τ +Τ + +𝛶 +𝛶 +𝛶 +Υ +Υ + +𝛷 +𝛷 +𝛷 +Φ +Φ + +𝛸 +𝛸 +𝛸 +Χ +Χ + +𝛹 +𝛹 +𝛹 +Ψ +Ψ + +𝛺 +𝛺 +𝛺 +Ω +Ω + +𝛻 +𝛻 +𝛻 +∇ +∇ + +𝛼 +𝛼 +𝛼 +α +α + +𝛽 +𝛽 +𝛽 +β +β + +𝛾 +𝛾 +𝛾 +γ +γ + +𝛿 +𝛿 +𝛿 +δ +δ + +𝜀 +𝜀 +𝜀 +ε +ε + +𝜁 +𝜁 +𝜁 +ζ +ζ + +𝜂 +𝜂 +𝜂 +η +η + +𝜃 +𝜃 +𝜃 +θ +θ + +𝜄 +𝜄 +𝜄 +ι +ι + +𝜅 +𝜅 +𝜅 +κ +κ + +𝜆 +𝜆 +𝜆 +λ +λ + +𝜇 +𝜇 +𝜇 +μ +μ + +𝜈 +𝜈 +𝜈 +ν +ν + +𝜉 +𝜉 +𝜉 +ξ +ξ + +𝜊 +𝜊 +𝜊 +ο +ο + +𝜋 +𝜋 +𝜋 +π +π + +𝜌 +𝜌 +𝜌 +ρ +ρ + +𝜍 +𝜍 +𝜍 +ς +ς + +𝜎 +𝜎 +𝜎 +σ +σ + +𝜏 +𝜏 +𝜏 +τ +τ + +𝜐 +𝜐 +𝜐 +υ +υ + +𝜑 +𝜑 +𝜑 +φ +φ + +𝜒 +𝜒 +𝜒 +χ +χ + +𝜓 +𝜓 +𝜓 +ψ +ψ + +𝜔 +𝜔 +𝜔 +ω +ω + +𝜕 +𝜕 +𝜕 +∂ +∂ + +𝜖 +𝜖 +𝜖 +ε +ε + +𝜗 +𝜗 +𝜗 +θ +θ + +𝜘 +𝜘 +𝜘 +κ +κ + +𝜙 +𝜙 +𝜙 +φ +φ + +𝜚 +𝜚 +𝜚 +ρ +ρ + +𝜛 +𝜛 +𝜛 +π +π + +𝜜 +𝜜 +𝜜 +Α +Α + +𝜝 +𝜝 +𝜝 +Β +Β + +𝜞 +𝜞 +𝜞 +Γ +Γ + +𝜟 +𝜟 +𝜟 +Δ +Δ + +𝜠 +𝜠 +𝜠 +Ε +Ε + +𝜡 +𝜡 +𝜡 +Ζ +Ζ + +𝜢 +𝜢 +𝜢 +Η +Η + +𝜣 +𝜣 +𝜣 +Θ +Θ + +𝜤 +𝜤 +𝜤 +Ι +Ι + +𝜥 +𝜥 +𝜥 +Κ +Κ + +𝜦 +𝜦 +𝜦 +Λ +Λ + +𝜧 +𝜧 +𝜧 +Μ +Μ + +𝜨 +𝜨 +𝜨 +Ν +Ν + +𝜩 +𝜩 +𝜩 +Ξ +Ξ + +𝜪 +𝜪 +𝜪 +Ο +Ο + +𝜫 +𝜫 +𝜫 +Π +Π + +𝜬 +𝜬 +𝜬 +Ρ +Ρ + +𝜭 +𝜭 +𝜭 +Θ +Θ + +𝜮 +𝜮 +𝜮 +Σ +Σ + +𝜯 +𝜯 +𝜯 +Τ +Τ + +𝜰 +𝜰 +𝜰 +Υ +Υ + +𝜱 +𝜱 +𝜱 +Φ +Φ + +𝜲 +𝜲 +𝜲 +Χ +Χ + +𝜳 +𝜳 +𝜳 +Ψ +Ψ + +𝜴 +𝜴 +𝜴 +Ω +Ω + +𝜵 +𝜵 +𝜵 +∇ +∇ + +𝜶 +𝜶 +𝜶 +α +α + +𝜷 +𝜷 +𝜷 +β +β + +𝜸 +𝜸 +𝜸 +γ +γ + +𝜹 +𝜹 +𝜹 +δ +δ + +𝜺 +𝜺 +𝜺 +ε +ε + +𝜻 +𝜻 +𝜻 +ζ +ζ + +𝜼 +𝜼 +𝜼 +η +η + +𝜽 +𝜽 +𝜽 +θ +θ + +𝜾 +𝜾 +𝜾 +ι +ι + +𝜿 +𝜿 +𝜿 +κ +κ + +𝝀 +𝝀 +𝝀 +λ +λ + +𝝁 +𝝁 +𝝁 +μ +μ + +𝝂 +𝝂 +𝝂 +ν +ν + +𝝃 +𝝃 +𝝃 +ξ +ξ + +𝝄 +𝝄 +𝝄 +ο +ο + +𝝅 +𝝅 +𝝅 +π +π + +𝝆 +𝝆 +𝝆 +ρ +ρ + +𝝇 +𝝇 +𝝇 +ς +ς + +𝝈 +𝝈 +𝝈 +σ +σ + +𝝉 +𝝉 +𝝉 +τ +τ + +𝝊 +𝝊 +𝝊 +υ +υ + +𝝋 +𝝋 +𝝋 +φ +φ + +𝝌 +𝝌 +𝝌 +χ +χ + +𝝍 +𝝍 +𝝍 +ψ +ψ + +𝝎 +𝝎 +𝝎 +ω +ω + +𝝏 +𝝏 +𝝏 +∂ +∂ + +𝝐 +𝝐 +𝝐 +ε +ε + +𝝑 +𝝑 +𝝑 +θ +θ + +𝝒 +𝝒 +𝝒 +κ +κ + +𝝓 +𝝓 +𝝓 +φ +φ + +𝝔 +𝝔 +𝝔 +ρ +ρ + +𝝕 +𝝕 +𝝕 +π +π + +𝝖 +𝝖 +𝝖 +Α +Α + +𝝗 +𝝗 +𝝗 +Β +Β + +𝝘 +𝝘 +𝝘 +Γ +Γ + +𝝙 +𝝙 +𝝙 +Δ +Δ + +𝝚 +𝝚 +𝝚 +Ε +Ε + +𝝛 +𝝛 +𝝛 +Ζ +Ζ + +𝝜 +𝝜 +𝝜 +Η +Η + +𝝝 +𝝝 +𝝝 +Θ +Θ + +𝝞 +𝝞 +𝝞 +Ι +Ι + +𝝟 +𝝟 +𝝟 +Κ +Κ + +𝝠 +𝝠 +𝝠 +Λ +Λ + +𝝡 +𝝡 +𝝡 +Μ +Μ + +𝝢 +𝝢 +𝝢 +Ν +Ν + +𝝣 +𝝣 +𝝣 +Ξ +Ξ + +𝝤 +𝝤 +𝝤 +Ο +Ο + +𝝥 +𝝥 +𝝥 +Π +Π + +𝝦 +𝝦 +𝝦 +Ρ +Ρ + +𝝧 +𝝧 +𝝧 +Θ +Θ + +𝝨 +𝝨 +𝝨 +Σ +Σ + +𝝩 +𝝩 +𝝩 +Τ +Τ + +𝝪 +𝝪 +𝝪 +Υ +Υ + +𝝫 +𝝫 +𝝫 +Φ +Φ + +𝝬 +𝝬 +𝝬 +Χ +Χ + +𝝭 +𝝭 +𝝭 +Ψ +Ψ + +𝝮 +𝝮 +𝝮 +Ω +Ω + +𝝯 +𝝯 +𝝯 +∇ +∇ + +𝝰 +𝝰 +𝝰 +α +α + +𝝱 +𝝱 +𝝱 +β +β + +𝝲 +𝝲 +𝝲 +γ +γ + +𝝳 +𝝳 +𝝳 +δ +δ + +𝝴 +𝝴 +𝝴 +ε +ε + +𝝵 +𝝵 +𝝵 +ζ +ζ + +𝝶 +𝝶 +𝝶 +η +η + +𝝷 +𝝷 +𝝷 +θ +θ + +𝝸 +𝝸 +𝝸 +ι +ι + +𝝹 +𝝹 +𝝹 +κ +κ + +𝝺 +𝝺 +𝝺 +λ +λ + +𝝻 +𝝻 +𝝻 +μ +μ + +𝝼 +𝝼 +𝝼 +ν +ν + +𝝽 +𝝽 +𝝽 +ξ +ξ + +𝝾 +𝝾 +𝝾 +ο +ο + +𝝿 +𝝿 +𝝿 +π +π + +𝞀 +𝞀 +𝞀 +ρ +ρ + +𝞁 +𝞁 +𝞁 +ς +ς + +𝞂 +𝞂 +𝞂 +σ +σ + +𝞃 +𝞃 +𝞃 +τ +τ + +𝞄 +𝞄 +𝞄 +υ +υ + +𝞅 +𝞅 +𝞅 +φ +φ + +𝞆 +𝞆 +𝞆 +χ +χ + +𝞇 +𝞇 +𝞇 +ψ +ψ + +𝞈 +𝞈 +𝞈 +ω +ω + +𝞉 +𝞉 +𝞉 +∂ +∂ + +𝞊 +𝞊 +𝞊 +ε +ε + +𝞋 +𝞋 +𝞋 +θ +θ + +𝞌 +𝞌 +𝞌 +κ +κ + +𝞍 +𝞍 +𝞍 +φ +φ + +𝞎 +𝞎 +𝞎 +ρ +ρ + +𝞏 +𝞏 +𝞏 +π +π + +𝞐 +𝞐 +𝞐 +Α +Α + +𝞑 +𝞑 +𝞑 +Β +Β + +𝞒 +𝞒 +𝞒 +Γ +Γ + +𝞓 +𝞓 +𝞓 +Δ +Δ + +𝞔 +𝞔 +𝞔 +Ε +Ε + +𝞕 +𝞕 +𝞕 +Ζ +Ζ + +𝞖 +𝞖 +𝞖 +Η +Η + +𝞗 +𝞗 +𝞗 +Θ +Θ + +𝞘 +𝞘 +𝞘 +Ι +Ι + +𝞙 +𝞙 +𝞙 +Κ +Κ + +𝞚 +𝞚 +𝞚 +Λ +Λ + +𝞛 +𝞛 +𝞛 +Μ +Μ + +𝞜 +𝞜 +𝞜 +Ν +Ν + +𝞝 +𝞝 +𝞝 +Ξ +Ξ + +𝞞 +𝞞 +𝞞 +Ο +Ο + +𝞟 +𝞟 +𝞟 +Π +Π + +𝞠 +𝞠 +𝞠 +Ρ +Ρ + +𝞡 +𝞡 +𝞡 +Θ +Θ + +𝞢 +𝞢 +𝞢 +Σ +Σ + +𝞣 +𝞣 +𝞣 +Τ +Τ + +𝞤 +𝞤 +𝞤 +Υ +Υ + +𝞥 +𝞥 +𝞥 +Φ +Φ + +𝞦 +𝞦 +𝞦 +Χ +Χ + +𝞧 +𝞧 +𝞧 +Ψ +Ψ + +𝞨 +𝞨 +𝞨 +Ω +Ω + +𝞩 +𝞩 +𝞩 +∇ +∇ + +𝞪 +𝞪 +𝞪 +α +α + +𝞫 +𝞫 +𝞫 +β +β + +𝞬 +𝞬 +𝞬 +γ +γ + +𝞭 +𝞭 +𝞭 +δ +δ + +𝞮 +𝞮 +𝞮 +ε +ε + +𝞯 +𝞯 +𝞯 +ζ +ζ + +𝞰 +𝞰 +𝞰 +η +η + +𝞱 +𝞱 +𝞱 +θ +θ + +𝞲 +𝞲 +𝞲 +ι +ι + +𝞳 +𝞳 +𝞳 +κ +κ + +𝞴 +𝞴 +𝞴 +λ +λ + +𝞵 +𝞵 +𝞵 +μ +μ + +𝞶 +𝞶 +𝞶 +ν +ν + +𝞷 +𝞷 +𝞷 +ξ +ξ + +𝞸 +𝞸 +𝞸 +ο +ο + +𝞹 +𝞹 +𝞹 +π +π + +𝞺 +𝞺 +𝞺 +ρ +ρ + +𝞻 +𝞻 +𝞻 +ς +ς + +𝞼 +𝞼 +𝞼 +σ +σ + +𝞽 +𝞽 +𝞽 +τ +τ + +𝞾 +𝞾 +𝞾 +υ +υ + +𝞿 +𝞿 +𝞿 +φ +φ + +𝟀 +𝟀 +𝟀 +χ +χ + +𝟁 +𝟁 +𝟁 +ψ +ψ + +𝟂 +𝟂 +𝟂 +ω +ω + +𝟃 +𝟃 +𝟃 +∂ +∂ + +𝟄 +𝟄 +𝟄 +ε +ε + +𝟅 +𝟅 +𝟅 +θ +θ + +𝟆 +𝟆 +𝟆 +κ +κ + +𝟇 +𝟇 +𝟇 +φ +φ + +𝟈 +𝟈 +𝟈 +ρ +ρ + +𝟉 +𝟉 +𝟉 +π +π + +𝟊 +𝟊 +𝟊 +Ϝ +Ϝ + +𝟋 +𝟋 +𝟋 +ϝ +ϝ + +𝟎 +𝟎 +𝟎 +0 +0 + +𝟏 +𝟏 +𝟏 +1 +1 + +𝟐 +𝟐 +𝟐 +2 +2 + +𝟑 +𝟑 +𝟑 +3 +3 + +𝟒 +𝟒 +𝟒 +4 +4 + +𝟓 +𝟓 +𝟓 +5 +5 + +𝟔 +𝟔 +𝟔 +6 +6 + +𝟕 +𝟕 +𝟕 +7 +7 + +𝟖 +𝟖 +𝟖 +8 +8 + +𝟗 +𝟗 +𝟗 +9 +9 + +𝟘 +𝟘 +𝟘 +0 +0 + +𝟙 +𝟙 +𝟙 +1 +1 + +𝟚 +𝟚 +𝟚 +2 +2 + +𝟛 +𝟛 +𝟛 +3 +3 + +𝟜 +𝟜 +𝟜 +4 +4 + +𝟝 +𝟝 +𝟝 +5 +5 + +𝟞 +𝟞 +𝟞 +6 +6 + +𝟟 +𝟟 +𝟟 +7 +7 + +𝟠 +𝟠 +𝟠 +8 +8 + +𝟡 +𝟡 +𝟡 +9 +9 + +𝟢 +𝟢 +𝟢 +0 +0 + +𝟣 +𝟣 +𝟣 +1 +1 + +𝟤 +𝟤 +𝟤 +2 +2 + +𝟥 +𝟥 +𝟥 +3 +3 + +𝟦 +𝟦 +𝟦 +4 +4 + +𝟧 +𝟧 +𝟧 +5 +5 + +𝟨 +𝟨 +𝟨 +6 +6 + +𝟩 +𝟩 +𝟩 +7 +7 + +𝟪 +𝟪 +𝟪 +8 +8 + +𝟫 +𝟫 +𝟫 +9 +9 + +𝟬 +𝟬 +𝟬 +0 +0 + +𝟭 +𝟭 +𝟭 +1 +1 + +𝟮 +𝟮 +𝟮 +2 +2 + +𝟯 +𝟯 +𝟯 +3 +3 + +𝟰 +𝟰 +𝟰 +4 +4 + +𝟱 +𝟱 +𝟱 +5 +5 + +𝟲 +𝟲 +𝟲 +6 +6 + +𝟳 +𝟳 +𝟳 +7 +7 + +𝟴 +𝟴 +𝟴 +8 +8 + +𝟵 +𝟵 +𝟵 +9 +9 + +𝟶 +𝟶 +𝟶 +0 +0 + +𝟷 +𝟷 +𝟷 +1 +1 + +𝟸 +𝟸 +𝟸 +2 +2 + +𝟹 +𝟹 +𝟹 +3 +3 + +𝟺 +𝟺 +𝟺 +4 +4 + +𝟻 +𝟻 +𝟻 +5 +5 + +𝟼 +𝟼 +𝟼 +6 +6 + +𝟽 +𝟽 +𝟽 +7 +7 + +𝟾 +𝟾 +𝟾 +8 +8 + +𝟿 +𝟿 +𝟿 +9 +9 + +🄀 +🄀 +🄀 +0. +0. + +🄁 +🄁 +🄁 +0, +0, + +🄂 +🄂 +🄂 +1, +1, + +🄃 +🄃 +🄃 +2, +2, + +🄄 +🄄 +🄄 +3, +3, + +🄅 +🄅 +🄅 +4, +4, + +🄆 +🄆 +🄆 +5, +5, + +🄇 +🄇 +🄇 +6, +6, + +🄈 +🄈 +🄈 +7, +7, + +🄉 +🄉 +🄉 +8, +8, + +🄊 +🄊 +🄊 +9, +9, + +🄐 +🄐 +🄐 +(A) +(A) + +🄑 +🄑 +🄑 +(B) +(B) + +🄒 +🄒 +🄒 +(C) +(C) + +🄓 +🄓 +🄓 +(D) +(D) + +🄔 +🄔 +🄔 +(E) +(E) + +🄕 +🄕 +🄕 +(F) +(F) + +🄖 +🄖 +🄖 +(G) +(G) + +🄗 +🄗 +🄗 +(H) +(H) + +🄘 +🄘 +🄘 +(I) +(I) + +🄙 +🄙 +🄙 +(J) +(J) + +🄚 +🄚 +🄚 +(K) +(K) + +🄛 +🄛 +🄛 +(L) +(L) + +🄜 +🄜 +🄜 +(M) +(M) + +🄝 +🄝 +🄝 +(N) +(N) + +🄞 +🄞 +🄞 +(O) +(O) + +🄟 +🄟 +🄟 +(P) +(P) + +🄠 +🄠 +🄠 +(Q) +(Q) + +🄡 +🄡 +🄡 +(R) +(R) + +🄢 +🄢 +🄢 +(S) +(S) + +🄣 +🄣 +🄣 +(T) +(T) + +🄤 +🄤 +🄤 +(U) +(U) + +🄥 +🄥 +🄥 +(V) +(V) + +🄦 +🄦 +🄦 +(W) +(W) + +🄧 +🄧 +🄧 +(X) +(X) + +🄨 +🄨 +🄨 +(Y) +(Y) + +🄩 +🄩 +🄩 +(Z) +(Z) + +🄪 +🄪 +🄪 +〔S〕 +〔S〕 + +🄫 +🄫 +🄫 +C +C + +🄬 +🄬 +🄬 +R +R + +🄭 +🄭 +🄭 +CD +CD + +🄮 +🄮 +🄮 +WZ +WZ + +🄰 +🄰 +🄰 +A +A + +🄱 +🄱 +🄱 +B +B + +🄲 +🄲 +🄲 +C +C + +🄳 +🄳 +🄳 +D +D + +🄴 +🄴 +🄴 +E +E + +🄵 +🄵 +🄵 +F +F + +🄶 +🄶 +🄶 +G +G + +🄷 +🄷 +🄷 +H +H + +🄸 +🄸 +🄸 +I +I + +🄹 +🄹 +🄹 +J +J + +🄺 +🄺 +🄺 +K +K + +🄻 +🄻 +🄻 +L +L + +🄼 +🄼 +🄼 +M +M + +🄽 +🄽 +🄽 +N +N + +🄾 +🄾 +🄾 +O +O + +🄿 +🄿 +🄿 +P +P + +🅀 +🅀 +🅀 +Q +Q + +🅁 +🅁 +🅁 +R +R + +🅂 +🅂 +🅂 +S +S + +🅃 +🅃 +🅃 +T +T + +🅄 +🅄 +🅄 +U +U + +🅅 +🅅 +🅅 +V +V + +🅆 +🅆 +🅆 +W +W + +🅇 +🅇 +🅇 +X +X + +🅈 +🅈 +🅈 +Y +Y + +🅉 +🅉 +🅉 +Z +Z + +🅊 +🅊 +🅊 +HV +HV + +🅋 +🅋 +🅋 +MV +MV + +🅌 +🅌 +🅌 +SD +SD + +🅍 +🅍 +🅍 +SS +SS + +🅎 +🅎 +🅎 +PPV +PPV + +🅏 +🅏 +🅏 +WC +WC + +🆐 +🆐 +🆐 +DJ +DJ + +🈀 +🈀 +🈀 +ほか +ほか + +🈁 +🈁 +🈁 +ココ +ココ + +🈂 +🈂 +🈂 +サ +サ + +🈐 +🈐 +🈐 +手 +手 + +🈑 +🈑 +🈑 +字 +字 + +🈒 +🈒 +🈒 +双 +双 + +🈓 +🈓 +🈓 +デ +デ + +🈔 +🈔 +🈔 +二 +二 + +🈕 +🈕 +🈕 +多 +多 + +🈖 +🈖 +🈖 +解 +解 + +🈗 +🈗 +🈗 +天 +天 + +🈘 +🈘 +🈘 +交 +交 + +🈙 +🈙 +🈙 +映 +映 + +🈚 +🈚 +🈚 +無 +無 + +🈛 +🈛 +🈛 +料 +料 + +🈜 +🈜 +🈜 +前 +前 + +🈝 +🈝 +🈝 +後 +後 + +🈞 +🈞 +🈞 +再 +再 + +🈟 +🈟 +🈟 +新 +新 + +🈠 +🈠 +🈠 +初 +初 + +🈡 +🈡 +🈡 +終 +終 + +🈢 +🈢 +🈢 +生 +生 + +🈣 +🈣 +🈣 +販 +販 + +🈤 +🈤 +🈤 +声 +声 + +🈥 +🈥 +🈥 +吹 +吹 + +🈦 +🈦 +🈦 +演 +演 + +🈧 +🈧 +🈧 +投 +投 + +🈨 +🈨 +🈨 +捕 +捕 + +🈩 +🈩 +🈩 +一 +一 + +🈪 +🈪 +🈪 +三 +三 + +🈫 +🈫 +🈫 +遊 +遊 + +🈬 +🈬 +🈬 +左 +左 + +🈭 +🈭 +🈭 +中 +中 + +🈮 +🈮 +🈮 +右 +右 + +🈯 +🈯 +🈯 +指 +指 + +🈰 +🈰 +🈰 +走 +走 + +🈱 +🈱 +🈱 +打 +打 + +🈲 +🈲 +🈲 +禁 +禁 + +🈳 +🈳 +🈳 +空 +空 + +🈴 +🈴 +🈴 +合 +合 + +🈵 +🈵 +🈵 +満 +満 + +🈶 +🈶 +🈶 +有 +有 + +🈷 +🈷 +🈷 +月 +月 + +🈸 +🈸 +🈸 +申 +申 + +🈹 +🈹 +🈹 +割 +割 + +🈺 +🈺 +🈺 +営 +営 + +🉀 +🉀 +🉀 +〔本〕 +〔本〕 + +🉁 +🉁 +🉁 +〔三〕 +〔三〕 + +🉂 +🉂 +🉂 +〔二〕 +〔二〕 + +🉃 +🉃 +🉃 +〔安〕 +〔安〕 + +🉄 +🉄 +🉄 +〔点〕 +〔点〕 + +🉅 +🉅 +🉅 +〔打〕 +〔打〕 + +🉆 +🉆 +🉆 +〔盗〕 +〔盗〕 + +🉇 +🉇 +🉇 +〔勝〕 +〔勝〕 + +🉈 +🉈 +🉈 +〔敗〕 +〔敗〕 + +🉐 +🉐 +🉐 +得 +得 + +🉑 +🉑 +🉑 +可 +可 + +丽 +丽 +丽 +丽 +丽 + +丸 +丸 +丸 +丸 +丸 + +乁 +乁 +乁 +乁 +乁 + +𠄢 +𠄢 +𠄢 +𠄢 +𠄢 + +你 +你 +你 +你 +你 + +侮 +侮 +侮 +侮 +侮 + +侻 +侻 +侻 +侻 +侻 + +倂 +倂 +倂 +倂 +倂 + +偺 +偺 +偺 +偺 +偺 + +備 +備 +備 +備 +備 + +僧 +僧 +僧 +僧 +僧 + +像 +像 +像 +像 +像 + +㒞 +㒞 +㒞 +㒞 +㒞 + +𠘺 +𠘺 +𠘺 +𠘺 +𠘺 + +免 +免 +免 +免 +免 + +兔 +兔 +兔 +兔 +兔 + +兤 +兤 +兤 +兤 +兤 + +具 +具 +具 +具 +具 + +𠔜 +𠔜 +𠔜 +𠔜 +𠔜 + +㒹 +㒹 +㒹 +㒹 +㒹 + +內 +內 +內 +內 +內 + +再 +再 +再 +再 +再 + +𠕋 +𠕋 +𠕋 +𠕋 +𠕋 + +冗 +冗 +冗 +冗 +冗 + +冤 +冤 +冤 +冤 +冤 + +仌 +仌 +仌 +仌 +仌 + +冬 +冬 +冬 +冬 +冬 + +况 +况 +况 +况 +况 + +𩇟 +𩇟 +𩇟 +𩇟 +𩇟 + +凵 +凵 +凵 +凵 +凵 + +刃 +刃 +刃 +刃 +刃 + +㓟 +㓟 +㓟 +㓟 +㓟 + +刻 +刻 +刻 +刻 +刻 + +剆 +剆 +剆 +剆 +剆 + +割 +割 +割 +割 +割 + +剷 +剷 +剷 +剷 +剷 + +㔕 +㔕 +㔕 +㔕 +㔕 + +勇 +勇 +勇 +勇 +勇 + +勉 +勉 +勉 +勉 +勉 + +勤 +勤 +勤 +勤 +勤 + +勺 +勺 +勺 +勺 +勺 + +包 +包 +包 +包 +包 + +匆 +匆 +匆 +匆 +匆 + +北 +北 +北 +北 +北 + +卉 +卉 +卉 +卉 +卉 + +卑 +卑 +卑 +卑 +卑 + +博 +博 +博 +博 +博 + +即 +即 +即 +即 +即 + +卽 +卽 +卽 +卽 +卽 + +卿 +卿 +卿 +卿 +卿 + +卿 +卿 +卿 +卿 +卿 + +卿 +卿 +卿 +卿 +卿 + +𠨬 +𠨬 +𠨬 +𠨬 +𠨬 + +灰 +灰 +灰 +灰 +灰 + +及 +及 +及 +及 +及 + +叟 +叟 +叟 +叟 +叟 + +𠭣 +𠭣 +𠭣 +𠭣 +𠭣 + +叫 +叫 +叫 +叫 +叫 + +叱 +叱 +叱 +叱 +叱 + +吆 +吆 +吆 +吆 +吆 + +咞 +咞 +咞 +咞 +咞 + +吸 +吸 +吸 +吸 +吸 + +呈 +呈 +呈 +呈 +呈 + +周 +周 +周 +周 +周 + +咢 +咢 +咢 +咢 +咢 + +哶 +哶 +哶 +哶 +哶 + +唐 +唐 +唐 +唐 +唐 + +啓 +啓 +啓 +啓 +啓 + +啣 +啣 +啣 +啣 +啣 + +善 +善 +善 +善 +善 + +善 +善 +善 +善 +善 + +喙 +喙 +喙 +喙 +喙 + +喫 +喫 +喫 +喫 +喫 + +喳 +喳 +喳 +喳 +喳 + +嗂 +嗂 +嗂 +嗂 +嗂 + +圖 +圖 +圖 +圖 +圖 + +嘆 +嘆 +嘆 +嘆 +嘆 + +圗 +圗 +圗 +圗 +圗 + +噑 +噑 +噑 +噑 +噑 + +噴 +噴 +噴 +噴 +噴 + +切 +切 +切 +切 +切 + +壮 +壮 +壮 +壮 +壮 + +城 +城 +城 +城 +城 + +埴 +埴 +埴 +埴 +埴 + +堍 +堍 +堍 +堍 +堍 + +型 +型 +型 +型 +型 + +堲 +堲 +堲 +堲 +堲 + +報 +報 +報 +報 +報 + +墬 +墬 +墬 +墬 +墬 + +𡓤 +𡓤 +𡓤 +𡓤 +𡓤 + +売 +売 +売 +売 +売 + +壷 +壷 +壷 +壷 +壷 + +夆 +夆 +夆 +夆 +夆 + +多 +多 +多 +多 +多 + +夢 +夢 +夢 +夢 +夢 + +奢 +奢 +奢 +奢 +奢 + +𡚨 +𡚨 +𡚨 +𡚨 +𡚨 + +𡛪 +𡛪 +𡛪 +𡛪 +𡛪 + +姬 +姬 +姬 +姬 +姬 + +娛 +娛 +娛 +娛 +娛 + +娧 +娧 +娧 +娧 +娧 + +姘 +姘 +姘 +姘 +姘 + +婦 +婦 +婦 +婦 +婦 + +㛮 +㛮 +㛮 +㛮 +㛮 + +㛼 +㛼 +㛼 +㛼 +㛼 + +嬈 +嬈 +嬈 +嬈 +嬈 + +嬾 +嬾 +嬾 +嬾 +嬾 + +嬾 +嬾 +嬾 +嬾 +嬾 + +𡧈 +𡧈 +𡧈 +𡧈 +𡧈 + +寃 +寃 +寃 +寃 +寃 + +寘 +寘 +寘 +寘 +寘 + +寧 +寧 +寧 +寧 +寧 + +寳 +寳 +寳 +寳 +寳 + +𡬘 +𡬘 +𡬘 +𡬘 +𡬘 + +寿 +寿 +寿 +寿 +寿 + +将 +将 +将 +将 +将 + +当 +当 +当 +当 +当 + +尢 +尢 +尢 +尢 +尢 + +㞁 +㞁 +㞁 +㞁 +㞁 + +屠 +屠 +屠 +屠 +屠 + +屮 +屮 +屮 +屮 +屮 + +峀 +峀 +峀 +峀 +峀 + +岍 +岍 +岍 +岍 +岍 + +𡷤 +𡷤 +𡷤 +𡷤 +𡷤 + +嵃 +嵃 +嵃 +嵃 +嵃 + +𡷦 +𡷦 +𡷦 +𡷦 +𡷦 + +嵮 +嵮 +嵮 +嵮 +嵮 + +嵫 +嵫 +嵫 +嵫 +嵫 + +嵼 +嵼 +嵼 +嵼 +嵼 + +巡 +巡 +巡 +巡 +巡 + +巢 +巢 +巢 +巢 +巢 + +㠯 +㠯 +㠯 +㠯 +㠯 + +巽 +巽 +巽 +巽 +巽 + +帨 +帨 +帨 +帨 +帨 + +帽 +帽 +帽 +帽 +帽 + +幩 +幩 +幩 +幩 +幩 + +㡢 +㡢 +㡢 +㡢 +㡢 + +𢆃 +𢆃 +𢆃 +𢆃 +𢆃 + +㡼 +㡼 +㡼 +㡼 +㡼 + +庰 +庰 +庰 +庰 +庰 + +庳 +庳 +庳 +庳 +庳 + +庶 +庶 +庶 +庶 +庶 + +廊 +廊 +廊 +廊 +廊 + +𪎒 +𪎒 +𪎒 +𪎒 +𪎒 + +廾 +廾 +廾 +廾 +廾 + +𢌱 +𢌱 +𢌱 +𢌱 +𢌱 + +𢌱 +𢌱 +𢌱 +𢌱 +𢌱 + +舁 +舁 +舁 +舁 +舁 + +弢 +弢 +弢 +弢 +弢 + +弢 +弢 +弢 +弢 +弢 + +㣇 +㣇 +㣇 +㣇 +㣇 + +𣊸 +𣊸 +𣊸 +𣊸 +𣊸 + +𦇚 +𦇚 +𦇚 +𦇚 +𦇚 + +形 +形 +形 +形 +形 + +彫 +彫 +彫 +彫 +彫 + +㣣 +㣣 +㣣 +㣣 +㣣 + +徚 +徚 +徚 +徚 +徚 + +忍 +忍 +忍 +忍 +忍 + +志 +志 +志 +志 +志 + +忹 +忹 +忹 +忹 +忹 + +悁 +悁 +悁 +悁 +悁 + +㤺 +㤺 +㤺 +㤺 +㤺 + +㤜 +㤜 +㤜 +㤜 +㤜 + +悔 +悔 +悔 +悔 +悔 + +𢛔 +𢛔 +𢛔 +𢛔 +𢛔 + +惇 +惇 +惇 +惇 +惇 + +慈 +慈 +慈 +慈 +慈 + +慌 +慌 +慌 +慌 +慌 + +慎 +慎 +慎 +慎 +慎 + +慌 +慌 +慌 +慌 +慌 + +慺 +慺 +慺 +慺 +慺 + +憎 +憎 +憎 +憎 +憎 + +憲 +憲 +憲 +憲 +憲 + +憤 +憤 +憤 +憤 +憤 + +憯 +憯 +憯 +憯 +憯 + +懞 +懞 +懞 +懞 +懞 + +懲 +懲 +懲 +懲 +懲 + +懶 +懶 +懶 +懶 +懶 + +成 +成 +成 +成 +成 + +戛 +戛 +戛 +戛 +戛 + +扝 +扝 +扝 +扝 +扝 + +抱 +抱 +抱 +抱 +抱 + +拔 +拔 +拔 +拔 +拔 + +捐 +捐 +捐 +捐 +捐 + +𢬌 +𢬌 +𢬌 +𢬌 +𢬌 + +挽 +挽 +挽 +挽 +挽 + +拼 +拼 +拼 +拼 +拼 + +捨 +捨 +捨 +捨 +捨 + +掃 +掃 +掃 +掃 +掃 + +揤 +揤 +揤 +揤 +揤 + +𢯱 +𢯱 +𢯱 +𢯱 +𢯱 + +搢 +搢 +搢 +搢 +搢 + +揅 +揅 +揅 +揅 +揅 + +掩 +掩 +掩 +掩 +掩 + +㨮 +㨮 +㨮 +㨮 +㨮 + +摩 +摩 +摩 +摩 +摩 + +摾 +摾 +摾 +摾 +摾 + +撝 +撝 +撝 +撝 +撝 + +摷 +摷 +摷 +摷 +摷 + +㩬 +㩬 +㩬 +㩬 +㩬 + +敏 +敏 +敏 +敏 +敏 + +敬 +敬 +敬 +敬 +敬 + +𣀊 +𣀊 +𣀊 +𣀊 +𣀊 + +旣 +旣 +旣 +旣 +旣 + +書 +書 +書 +書 +書 + +晉 +晉 +晉 +晉 +晉 + +㬙 +㬙 +㬙 +㬙 +㬙 + +暑 +暑 +暑 +暑 +暑 + +㬈 +㬈 +㬈 +㬈 +㬈 + +㫤 +㫤 +㫤 +㫤 +㫤 + +冒 +冒 +冒 +冒 +冒 + +冕 +冕 +冕 +冕 +冕 + +最 +最 +最 +最 +最 + +暜 +暜 +暜 +暜 +暜 + +肭 +肭 +肭 +肭 +肭 + +䏙 +䏙 +䏙 +䏙 +䏙 + +朗 +朗 +朗 +朗 +朗 + +望 +望 +望 +望 +望 + +朡 +朡 +朡 +朡 +朡 + +杞 +杞 +杞 +杞 +杞 + +杓 +杓 +杓 +杓 +杓 + +𣏃 +𣏃 +𣏃 +𣏃 +𣏃 + +㭉 +㭉 +㭉 +㭉 +㭉 + +柺 +柺 +柺 +柺 +柺 + +枅 +枅 +枅 +枅 +枅 + +桒 +桒 +桒 +桒 +桒 + +梅 +梅 +梅 +梅 +梅 + +𣑭 +𣑭 +𣑭 +𣑭 +𣑭 + +梎 +梎 +梎 +梎 +梎 + +栟 +栟 +栟 +栟 +栟 + +椔 +椔 +椔 +椔 +椔 + +㮝 +㮝 +㮝 +㮝 +㮝 + +楂 +楂 +楂 +楂 +楂 + +榣 +榣 +榣 +榣 +榣 + +槪 +槪 +槪 +槪 +槪 + +檨 +檨 +檨 +檨 +檨 + +𣚣 +𣚣 +𣚣 +𣚣 +𣚣 + +櫛 +櫛 +櫛 +櫛 +櫛 + +㰘 +㰘 +㰘 +㰘 +㰘 + +次 +次 +次 +次 +次 + +𣢧 +𣢧 +𣢧 +𣢧 +𣢧 + +歔 +歔 +歔 +歔 +歔 + +㱎 +㱎 +㱎 +㱎 +㱎 + +歲 +歲 +歲 +歲 +歲 + +殟 +殟 +殟 +殟 +殟 + +殺 +殺 +殺 +殺 +殺 + +殻 +殻 +殻 +殻 +殻 + +𣪍 +𣪍 +𣪍 +𣪍 +𣪍 + +𡴋 +𡴋 +𡴋 +𡴋 +𡴋 + +𣫺 +𣫺 +𣫺 +𣫺 +𣫺 + +汎 +汎 +汎 +汎 +汎 + +𣲼 +𣲼 +𣲼 +𣲼 +𣲼 + +沿 +沿 +沿 +沿 +沿 + +泍 +泍 +泍 +泍 +泍 + +汧 +汧 +汧 +汧 +汧 + +洖 +洖 +洖 +洖 +洖 + +派 +派 +派 +派 +派 + +海 +海 +海 +海 +海 + +流 +流 +流 +流 +流 + +浩 +浩 +浩 +浩 +浩 + +浸 +浸 +浸 +浸 +浸 + +涅 +涅 +涅 +涅 +涅 + +𣴞 +𣴞 +𣴞 +𣴞 +𣴞 + +洴 +洴 +洴 +洴 +洴 + +港 +港 +港 +港 +港 + +湮 +湮 +湮 +湮 +湮 + +㴳 +㴳 +㴳 +㴳 +㴳 + +滋 +滋 +滋 +滋 +滋 + +滇 +滇 +滇 +滇 +滇 + +𣻑 +𣻑 +𣻑 +𣻑 +𣻑 + +淹 +淹 +淹 +淹 +淹 + +潮 +潮 +潮 +潮 +潮 + +𣽞 +𣽞 +𣽞 +𣽞 +𣽞 + +𣾎 +𣾎 +𣾎 +𣾎 +𣾎 + +濆 +濆 +濆 +濆 +濆 + +瀹 +瀹 +瀹 +瀹 +瀹 + +瀞 +瀞 +瀞 +瀞 +瀞 + +瀛 +瀛 +瀛 +瀛 +瀛 + +㶖 +㶖 +㶖 +㶖 +㶖 + +灊 +灊 +灊 +灊 +灊 + +災 +災 +災 +災 +災 + +灷 +灷 +灷 +灷 +灷 + +炭 +炭 +炭 +炭 +炭 + +𠔥 +𠔥 +𠔥 +𠔥 +𠔥 + +煅 +煅 +煅 +煅 +煅 + +𤉣 +𤉣 +𤉣 +𤉣 +𤉣 + +熜 +熜 +熜 +熜 +熜 + +𤎫 +𤎫 +𤎫 +𤎫 +𤎫 + +爨 +爨 +爨 +爨 +爨 + +爵 +爵 +爵 +爵 +爵 + +牐 +牐 +牐 +牐 +牐 + +𤘈 +𤘈 +𤘈 +𤘈 +𤘈 + +犀 +犀 +犀 +犀 +犀 + +犕 +犕 +犕 +犕 +犕 + +𤜵 +𤜵 +𤜵 +𤜵 +𤜵 + +𤠔 +𤠔 +𤠔 +𤠔 +𤠔 + +獺 +獺 +獺 +獺 +獺 + +王 +王 +王 +王 +王 + +㺬 +㺬 +㺬 +㺬 +㺬 + +玥 +玥 +玥 +玥 +玥 + +㺸 +㺸 +㺸 +㺸 +㺸 + +㺸 +㺸 +㺸 +㺸 +㺸 + +瑇 +瑇 +瑇 +瑇 +瑇 + +瑜 +瑜 +瑜 +瑜 +瑜 + +瑱 +瑱 +瑱 +瑱 +瑱 + +璅 +璅 +璅 +璅 +璅 + +瓊 +瓊 +瓊 +瓊 +瓊 + +㼛 +㼛 +㼛 +㼛 +㼛 + +甤 +甤 +甤 +甤 +甤 + +𤰶 +𤰶 +𤰶 +𤰶 +𤰶 + +甾 +甾 +甾 +甾 +甾 + +𤲒 +𤲒 +𤲒 +𤲒 +𤲒 + +異 +異 +異 +異 +異 + +𢆟 +𢆟 +𢆟 +𢆟 +𢆟 + +瘐 +瘐 +瘐 +瘐 +瘐 + +𤾡 +𤾡 +𤾡 +𤾡 +𤾡 + +𤾸 +𤾸 +𤾸 +𤾸 +𤾸 + +𥁄 +𥁄 +𥁄 +𥁄 +𥁄 + +㿼 +㿼 +㿼 +㿼 +㿼 + +䀈 +䀈 +䀈 +䀈 +䀈 + +直 +直 +直 +直 +直 + +𥃳 +𥃳 +𥃳 +𥃳 +𥃳 + +𥃲 +𥃲 +𥃲 +𥃲 +𥃲 + +𥄙 +𥄙 +𥄙 +𥄙 +𥄙 + +𥄳 +𥄳 +𥄳 +𥄳 +𥄳 + +眞 +眞 +眞 +眞 +眞 + +真 +真 +真 +真 +真 + +真 +真 +真 +真 +真 + +睊 +睊 +睊 +睊 +睊 + +䀹 +䀹 +䀹 +䀹 +䀹 + +瞋 +瞋 +瞋 +瞋 +瞋 + +䁆 +䁆 +䁆 +䁆 +䁆 + +䂖 +䂖 +䂖 +䂖 +䂖 + +𥐝 +𥐝 +𥐝 +𥐝 +𥐝 + +硎 +硎 +硎 +硎 +硎 + +碌 +碌 +碌 +碌 +碌 + +磌 +磌 +磌 +磌 +磌 + +䃣 +䃣 +䃣 +䃣 +䃣 + +𥘦 +𥘦 +𥘦 +𥘦 +𥘦 + +祖 +祖 +祖 +祖 +祖 + +𥚚 +𥚚 +𥚚 +𥚚 +𥚚 + +𥛅 +𥛅 +𥛅 +𥛅 +𥛅 + +福 +福 +福 +福 +福 + +秫 +秫 +秫 +秫 +秫 + +䄯 +䄯 +䄯 +䄯 +䄯 + +穀 +穀 +穀 +穀 +穀 + +穊 +穊 +穊 +穊 +穊 + +穏 +穏 +穏 +穏 +穏 + +𥥼 +𥥼 +𥥼 +𥥼 +𥥼 + +𥪧 +𥪧 +𥪧 +𥪧 +𥪧 + +𥪧 +𥪧 +𥪧 +𥪧 +𥪧 + +竮 +竮 +竮 +竮 +竮 + +䈂 +䈂 +䈂 +䈂 +䈂 + +𥮫 +𥮫 +𥮫 +𥮫 +𥮫 + +篆 +篆 +篆 +篆 +篆 + +築 +築 +築 +築 +築 + +䈧 +䈧 +䈧 +䈧 +䈧 + +𥲀 +𥲀 +𥲀 +𥲀 +𥲀 + +糒 +糒 +糒 +糒 +糒 + +䊠 +䊠 +䊠 +䊠 +䊠 + +糨 +糨 +糨 +糨 +糨 + +糣 +糣 +糣 +糣 +糣 + +紀 +紀 +紀 +紀 +紀 + +𥾆 +𥾆 +𥾆 +𥾆 +𥾆 + +絣 +絣 +絣 +絣 +絣 + +䌁 +䌁 +䌁 +䌁 +䌁 + +緇 +緇 +緇 +緇 +緇 + +縂 +縂 +縂 +縂 +縂 + +繅 +繅 +繅 +繅 +繅 + +䌴 +䌴 +䌴 +䌴 +䌴 + +𦈨 +𦈨 +𦈨 +𦈨 +𦈨 + +𦉇 +𦉇 +𦉇 +𦉇 +𦉇 + +䍙 +䍙 +䍙 +䍙 +䍙 + +𦋙 +𦋙 +𦋙 +𦋙 +𦋙 + +罺 +罺 +罺 +罺 +罺 + +𦌾 +𦌾 +𦌾 +𦌾 +𦌾 + +羕 +羕 +羕 +羕 +羕 + +翺 +翺 +翺 +翺 +翺 + +者 +者 +者 +者 +者 + +𦓚 +𦓚 +𦓚 +𦓚 +𦓚 + +𦔣 +𦔣 +𦔣 +𦔣 +𦔣 + +聠 +聠 +聠 +聠 +聠 + +𦖨 +𦖨 +𦖨 +𦖨 +𦖨 + +聰 +聰 +聰 +聰 +聰 + +𣍟 +𣍟 +𣍟 +𣍟 +𣍟 + +䏕 +䏕 +䏕 +䏕 +䏕 + +育 +育 +育 +育 +育 + +脃 +脃 +脃 +脃 +脃 + +䐋 +䐋 +䐋 +䐋 +䐋 + +脾 +脾 +脾 +脾 +脾 + +媵 +媵 +媵 +媵 +媵 + +𦞧 +𦞧 +𦞧 +𦞧 +𦞧 + +𦞵 +𦞵 +𦞵 +𦞵 +𦞵 + +𣎓 +𣎓 +𣎓 +𣎓 +𣎓 + +𣎜 +𣎜 +𣎜 +𣎜 +𣎜 + +舁 +舁 +舁 +舁 +舁 + +舄 +舄 +舄 +舄 +舄 + +辞 +辞 +辞 +辞 +辞 + +䑫 +䑫 +䑫 +䑫 +䑫 + +芑 +芑 +芑 +芑 +芑 + +芋 +芋 +芋 +芋 +芋 + +芝 +芝 +芝 +芝 +芝 + +劳 +劳 +劳 +劳 +劳 + +花 +花 +花 +花 +花 + +芳 +芳 +芳 +芳 +芳 + +芽 +芽 +芽 +芽 +芽 + +苦 +苦 +苦 +苦 +苦 + +𦬼 +𦬼 +𦬼 +𦬼 +𦬼 + +若 +若 +若 +若 +若 + +茝 +茝 +茝 +茝 +茝 + +荣 +荣 +荣 +荣 +荣 + +莭 +莭 +莭 +莭 +莭 + +茣 +茣 +茣 +茣 +茣 + +莽 +莽 +莽 +莽 +莽 + +菧 +菧 +菧 +菧 +菧 + +著 +著 +著 +著 +著 + +荓 +荓 +荓 +荓 +荓 + +菊 +菊 +菊 +菊 +菊 + +菌 +菌 +菌 +菌 +菌 + +菜 +菜 +菜 +菜 +菜 + +𦰶 +𦰶 +𦰶 +𦰶 +𦰶 + +𦵫 +𦵫 +𦵫 +𦵫 +𦵫 + +𦳕 +𦳕 +𦳕 +𦳕 +𦳕 + +䔫 +䔫 +䔫 +䔫 +䔫 + +蓱 +蓱 +蓱 +蓱 +蓱 + +蓳 +蓳 +蓳 +蓳 +蓳 + +蔖 +蔖 +蔖 +蔖 +蔖 + +𧏊 +𧏊 +𧏊 +𧏊 +𧏊 + +蕤 +蕤 +蕤 +蕤 +蕤 + +𦼬 +𦼬 +𦼬 +𦼬 +𦼬 + +䕝 +䕝 +䕝 +䕝 +䕝 + +䕡 +䕡 +䕡 +䕡 +䕡 + +𦾱 +𦾱 +𦾱 +𦾱 +𦾱 + +𧃒 +𧃒 +𧃒 +𧃒 +𧃒 + +䕫 +䕫 +䕫 +䕫 +䕫 + +虐 +虐 +虐 +虐 +虐 + +虜 +虜 +虜 +虜 +虜 + +虧 +虧 +虧 +虧 +虧 + +虩 +虩 +虩 +虩 +虩 + +蚩 +蚩 +蚩 +蚩 +蚩 + +蚈 +蚈 +蚈 +蚈 +蚈 + +蜎 +蜎 +蜎 +蜎 +蜎 + +蛢 +蛢 +蛢 +蛢 +蛢 + +蝹 +蝹 +蝹 +蝹 +蝹 + +蜨 +蜨 +蜨 +蜨 +蜨 + +蝫 +蝫 +蝫 +蝫 +蝫 + +螆 +螆 +螆 +螆 +螆 + +䗗 +䗗 +䗗 +䗗 +䗗 + +蟡 +蟡 +蟡 +蟡 +蟡 + +蠁 +蠁 +蠁 +蠁 +蠁 + +䗹 +䗹 +䗹 +䗹 +䗹 + +衠 +衠 +衠 +衠 +衠 + +衣 +衣 +衣 +衣 +衣 + +𧙧 +𧙧 +𧙧 +𧙧 +𧙧 + +裗 +裗 +裗 +裗 +裗 + +裞 +裞 +裞 +裞 +裞 + +䘵 +䘵 +䘵 +䘵 +䘵 + +裺 +裺 +裺 +裺 +裺 + +㒻 +㒻 +㒻 +㒻 +㒻 + +𧢮 +𧢮 +𧢮 +𧢮 +𧢮 + +𧥦 +𧥦 +𧥦 +𧥦 +𧥦 + +䚾 +䚾 +䚾 +䚾 +䚾 + +䛇 +䛇 +䛇 +䛇 +䛇 + +誠 +誠 +誠 +誠 +誠 + +諭 +諭 +諭 +諭 +諭 + +變 +變 +變 +變 +變 + +豕 +豕 +豕 +豕 +豕 + +𧲨 +𧲨 +𧲨 +𧲨 +𧲨 + +貫 +貫 +貫 +貫 +貫 + +賁 +賁 +賁 +賁 +賁 + +贛 +贛 +贛 +贛 +贛 + +起 +起 +起 +起 +起 + +𧼯 +𧼯 +𧼯 +𧼯 +𧼯 + +𠠄 +𠠄 +𠠄 +𠠄 +𠠄 + +跋 +跋 +跋 +跋 +跋 + +趼 +趼 +趼 +趼 +趼 + +跰 +跰 +跰 +跰 +跰 + +𠣞 +𠣞 +𠣞 +𠣞 +𠣞 + +軔 +軔 +軔 +軔 +軔 + +輸 +輸 +輸 +輸 +輸 + +𨗒 +𨗒 +𨗒 +𨗒 +𨗒 + +𨗭 +𨗭 +𨗭 +𨗭 +𨗭 + +邔 +邔 +邔 +邔 +邔 + +郱 +郱 +郱 +郱 +郱 + +鄑 +鄑 +鄑 +鄑 +鄑 + +𨜮 +𨜮 +𨜮 +𨜮 +𨜮 + +鄛 +鄛 +鄛 +鄛 +鄛 + +鈸 +鈸 +鈸 +鈸 +鈸 + +鋗 +鋗 +鋗 +鋗 +鋗 + +鋘 +鋘 +鋘 +鋘 +鋘 + +鉼 +鉼 +鉼 +鉼 +鉼 + +鏹 +鏹 +鏹 +鏹 +鏹 + +鐕 +鐕 +鐕 +鐕 +鐕 + +𨯺 +𨯺 +𨯺 +𨯺 +𨯺 + +開 +開 +開 +開 +開 + +䦕 +䦕 +䦕 +䦕 +䦕 + +閷 +閷 +閷 +閷 +閷 + +𨵷 +𨵷 +𨵷 +𨵷 +𨵷 + +䧦 +䧦 +䧦 +䧦 +䧦 + +雃 +雃 +雃 +雃 +雃 + +嶲 +嶲 +嶲 +嶲 +嶲 + +霣 +霣 +霣 +霣 +霣 + +𩅅 +𩅅 +𩅅 +𩅅 +𩅅 + +𩈚 +𩈚 +𩈚 +𩈚 +𩈚 + +䩮 +䩮 +䩮 +䩮 +䩮 + +䩶 +䩶 +䩶 +䩶 +䩶 + +韠 +韠 +韠 +韠 +韠 + +𩐊 +𩐊 +𩐊 +𩐊 +𩐊 + +䪲 +䪲 +䪲 +䪲 +䪲 + +𩒖 +𩒖 +𩒖 +𩒖 +𩒖 + +頋 +頋 +頋 +頋 +頋 + +頋 +頋 +頋 +頋 +頋 + +頩 +頩 +頩 +頩 +頩 + +𩖶 +𩖶 +𩖶 +𩖶 +𩖶 + +飢 +飢 +飢 +飢 +飢 + +䬳 +䬳 +䬳 +䬳 +䬳 + +餩 +餩 +餩 +餩 +餩 + +馧 +馧 +馧 +馧 +馧 + +駂 +駂 +駂 +駂 +駂 + +駾 +駾 +駾 +駾 +駾 + +䯎 +䯎 +䯎 +䯎 +䯎 + +𩬰 +𩬰 +𩬰 +𩬰 +𩬰 + +鬒 +鬒 +鬒 +鬒 +鬒 + +鱀 +鱀 +鱀 +鱀 +鱀 + +鳽 +鳽 +鳽 +鳽 +鳽 + +䳎 +䳎 +䳎 +䳎 +䳎 + +䳭 +䳭 +䳭 +䳭 +䳭 + +鵧 +鵧 +鵧 +鵧 +鵧 + +𪃎 +𪃎 +𪃎 +𪃎 +𪃎 + +䳸 +䳸 +䳸 +䳸 +䳸 + +𪄅 +𪄅 +𪄅 +𪄅 +𪄅 + +𪈎 +𪈎 +𪈎 +𪈎 +𪈎 + +𪊑 +𪊑 +𪊑 +𪊑 +𪊑 + +麻 +麻 +麻 +麻 +麻 + +䵖 +䵖 +䵖 +䵖 +䵖 + +黹 +黹 +黹 +黹 +黹 + +黾 +黾 +黾 +黾 +黾 + +鼅 +鼅 +鼅 +鼅 +鼅 + +鼏 +鼏 +鼏 +鼏 +鼏 + +鼖 +鼖 +鼖 +鼖 +鼖 + +鼻 +鼻 +鼻 +鼻 +鼻 + +𪘀 +𪘀 +𪘀 +𪘀 +𪘀 + +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b + +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b + +à֮́̕b +à֮́̕b +à֮́̕b +à֮́̕b +à֮́̕b + +á֮̀̕b +á֮̀̕b +á֮̀̕b +á֮̀̕b +á֮̀̕b + +à֮̂̕b +à֮̂̕b +à֮̂̕b +à֮̂̕b +à֮̂̕b + +ầ֮̕b +ầ֮̕b +ầ֮̕b +ầ֮̕b +ầ֮̕b + +à֮̃̕b +à֮̃̕b +à֮̃̕b +à֮̃̕b +à֮̃̕b + +ã֮̀̕b +ã֮̀̕b +ã֮̀̕b +ã֮̀̕b +ã֮̀̕b + +à֮̄̕b +à֮̄̕b +à֮̄̕b +à֮̄̕b +à֮̄̕b + +ā֮̀̕b +ā֮̀̕b +ā֮̀̕b +ā֮̀̕b +ā֮̀̕b + +à֮̅̕b +à֮̅̕b +à֮̅̕b +à֮̅̕b +à֮̅̕b + +a֮̅̀̕b +a֮̅̀̕b +a֮̅̀̕b +a֮̅̀̕b +a֮̅̀̕b + +à֮̆̕b +à֮̆̕b +à֮̆̕b +à֮̆̕b +à֮̆̕b + +ằ֮̕b +ằ֮̕b +ằ֮̕b +ằ֮̕b +ằ֮̕b + +à֮̇̕b +à֮̇̕b +à֮̇̕b +à֮̇̕b +à֮̇̕b + +ȧ֮̀̕b +ȧ֮̀̕b +ȧ֮̀̕b +ȧ֮̀̕b +ȧ֮̀̕b + +à֮̈̕b +à֮̈̕b +à֮̈̕b +à֮̈̕b +à֮̈̕b + +ä֮̀̕b +ä֮̀̕b +ä֮̀̕b +ä֮̀̕b +ä֮̀̕b + +à֮̉̕b +à֮̉̕b +à֮̉̕b +à֮̉̕b +à֮̉̕b + +ả֮̀̕b +ả֮̀̕b +ả֮̀̕b +ả֮̀̕b +ả֮̀̕b + +à֮̊̕b +à֮̊̕b +à֮̊̕b +à֮̊̕b +à֮̊̕b + +å֮̀̕b +å֮̀̕b +å֮̀̕b +å֮̀̕b +å֮̀̕b + +à֮̋̕b +à֮̋̕b +à֮̋̕b +à֮̋̕b +à֮̋̕b + +a֮̋̀̕b +a֮̋̀̕b +a֮̋̀̕b +a֮̋̀̕b +a֮̋̀̕b + +à֮̌̕b +à֮̌̕b +à֮̌̕b +à֮̌̕b +à֮̌̕b + +ǎ֮̀̕b +ǎ֮̀̕b +ǎ֮̀̕b +ǎ֮̀̕b +ǎ֮̀̕b + +à֮̍̕b +à֮̍̕b +à֮̍̕b +à֮̍̕b +à֮̍̕b + +a֮̍̀̕b +a֮̍̀̕b +a֮̍̀̕b +a֮̍̀̕b +a֮̍̀̕b + +à֮̎̕b +à֮̎̕b +à֮̎̕b +à֮̎̕b +à֮̎̕b + +a֮̎̀̕b +a֮̎̀̕b +a֮̎̀̕b +a֮̎̀̕b +a֮̎̀̕b + +à֮̏̕b +à֮̏̕b +à֮̏̕b +à֮̏̕b +à֮̏̕b + +ȁ֮̀̕b +ȁ֮̀̕b +ȁ֮̀̕b +ȁ֮̀̕b +ȁ֮̀̕b + +à֮̐̕b +à֮̐̕b +à֮̐̕b +à֮̐̕b +à֮̐̕b + +a֮̐̀̕b +a֮̐̀̕b +a֮̐̀̕b +a֮̐̀̕b +a֮̐̀̕b + +à֮̑̕b +à֮̑̕b +à֮̑̕b +à֮̑̕b +à֮̑̕b + +ȃ֮̀̕b +ȃ֮̀̕b +ȃ֮̀̕b +ȃ֮̀̕b +ȃ֮̀̕b + +à֮̒̕b +à֮̒̕b +à֮̒̕b +à֮̒̕b +à֮̒̕b + +a֮̒̀̕b +a֮̒̀̕b +a֮̒̀̕b +a֮̒̀̕b +a֮̒̀̕b + +à֮̓̕b +à֮̓̕b +à֮̓̕b +à֮̓̕b +à֮̓̕b + +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b + +à֮̔̕b +à֮̔̕b +à֮̔̕b +à֮̔̕b +à֮̔̕b + +a֮̔̀̕b +a֮̔̀̕b +a֮̔̀̕b +a֮̔̀̕b +a֮̔̀̕b + +à̕̕͜b +à̕̕͜b +à̕̕͜b +à̕̕͜b +à̕̕͜b + +à̕̕͜b +à̕̕͜b +à̕̕͜b +à̕̕͜b +à̕̕͜b + +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b + +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b + +a〪̖̗֚b +a〪̖̗֚b +a〪̖̗֚b +a〪̖̗֚b +a〪̖̗֚b + +a〪̗̖֚b +a〪̗̖֚b +a〪̗̖֚b +a〪̗̖֚b +a〪̗̖֚b + +a〪̖̘֚b +a〪̖̘֚b +a〪̖̘֚b +a〪̖̘֚b +a〪̖̘֚b + +a〪̘̖֚b +a〪̘̖֚b +a〪̘̖֚b +a〪̘̖֚b +a〪̘̖֚b + +a〪̖̙֚b +a〪̖̙֚b +a〪̖̙֚b +a〪̖̙֚b +a〪̖̙֚b + +a〪̙̖֚b +a〪̙̖֚b +a〪̙̖֚b +a〪̙̖֚b +a〪̙̖֚b + +à̕̚͜b +à̕̚͜b +à̕̚͜b +à̕̚͜b +à̕̚͜b + +à̚̕͜b +à̚̕͜b +à̚̕͜b +à̚̕͜b +à̚̕͜b + +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b + +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b + +a〪̖̜֚b +a〪̖̜֚b +a〪̖̜֚b +a〪̖̜֚b +a〪̖̜֚b + +a〪̜̖֚b +a〪̜̖֚b +a〪̜̖֚b +a〪̜̖֚b +a〪̜̖֚b + +a〪̖̝֚b +a〪̖̝֚b +a〪̖̝֚b +a〪̖̝֚b +a〪̖̝֚b + +a〪̝̖֚b +a〪̝̖֚b +a〪̝̖֚b +a〪̝̖֚b +a〪̝̖֚b + +a〪̖̞֚b +a〪̖̞֚b +a〪̖̞֚b +a〪̖̞֚b +a〪̖̞֚b + +a〪̞̖֚b +a〪̞̖֚b +a〪̞̖֚b +a〪̞̖֚b +a〪̞̖֚b + +a〪̖̟֚b +a〪̖̟֚b +a〪̖̟֚b +a〪̖̟֚b +a〪̖̟֚b + +a〪̟̖֚b +a〪̟̖֚b +a〪̟̖֚b +a〪̟̖֚b +a〪̟̖֚b + +a〪̖̠֚b +a〪̖̠֚b +a〪̖̠֚b +a〪̖̠֚b +a〪̖̠֚b + +a〪̠̖֚b +a〪̠̖֚b +a〪̠̖֚b +a〪̠̖֚b +a〪̠̖֚b + +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b + +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b + +aུ̡̢᷎b +aུ̡̢᷎b +aུ̡̢᷎b +aུ̡̢᷎b +aུ̡̢᷎b + +aུ̢̡᷎b +aུ̢̡᷎b +aུ̢̡᷎b +aུ̢̡᷎b +aུ̢̡᷎b + +a〪̖̣֚b +a〪̖̣֚b +a〪̖̣֚b +a〪̖̣֚b +a〪̖̣֚b + +ạ〪̖֚b +ạ〪̖֚b +ạ〪̖֚b +ạ〪̖֚b +ạ〪̖֚b + +a〪̖̤֚b +a〪̖̤֚b +a〪̖̤֚b +a〪̖̤֚b +a〪̖̤֚b + +a〪̤̖֚b +a〪̤̖֚b +a〪̤̖֚b +a〪̤̖֚b +a〪̤̖֚b + +a〪̖̥֚b +a〪̖̥֚b +a〪̖̥֚b +a〪̖̥֚b +a〪̖̥֚b + +ḁ〪̖֚b +ḁ〪̖֚b +ḁ〪̖֚b +ḁ〪̖֚b +ḁ〪̖֚b + +a〪̖̦֚b +a〪̖̦֚b +a〪̖̦֚b +a〪̖̦֚b +a〪̖̦֚b + +a〪̦̖֚b +a〪̦̖֚b +a〪̦̖֚b +a〪̦̖֚b +a〪̦̖֚b + +aུ̡̧᷎b +aུ̡̧᷎b +aུ̡̧᷎b +aུ̡̧᷎b +aུ̡̧᷎b + +aུ̧̡᷎b +aུ̧̡᷎b +aུ̧̡᷎b +aུ̧̡᷎b +aུ̧̡᷎b + +aུ̡̨᷎b +aུ̡̨᷎b +aུ̡̨᷎b +aུ̡̨᷎b +aུ̡̨᷎b + +ąུ̡᷎b +ąུ̡᷎b +ąུ̡᷎b +ąུ̡᷎b +ąུ̡᷎b + +a〪̖̩֚b +a〪̖̩֚b +a〪̖̩֚b +a〪̖̩֚b +a〪̖̩֚b + +a〪̩̖֚b +a〪̩̖֚b +a〪̩̖֚b +a〪̩̖֚b +a〪̩̖֚b + +a〪̖̪֚b +a〪̖̪֚b +a〪̖̪֚b +a〪̖̪֚b +a〪̖̪֚b + +a〪̪̖֚b +a〪̪̖֚b +a〪̪̖֚b +a〪̪̖֚b +a〪̪̖֚b + +a〪̖̫֚b +a〪̖̫֚b +a〪̖̫֚b +a〪̖̫֚b +a〪̖̫֚b + +a〪̫̖֚b +a〪̫̖֚b +a〪̫̖֚b +a〪̫̖֚b +a〪̫̖֚b + +a〪̖̬֚b +a〪̖̬֚b +a〪̖̬֚b +a〪̖̬֚b +a〪̖̬֚b + +a〪̬̖֚b +a〪̬̖֚b +a〪̬̖֚b +a〪̬̖֚b +a〪̬̖֚b + +a〪̖̭֚b +a〪̖̭֚b +a〪̖̭֚b +a〪̖̭֚b +a〪̖̭֚b + +a〪̭̖֚b +a〪̭̖֚b +a〪̭̖֚b +a〪̭̖֚b +a〪̭̖֚b + +a〪̖̮֚b +a〪̖̮֚b +a〪̖̮֚b +a〪̖̮֚b +a〪̖̮֚b + +a〪̮̖֚b +a〪̮̖֚b +a〪̮̖֚b +a〪̮̖֚b +a〪̮̖֚b + +a〪̖̯֚b +a〪̖̯֚b +a〪̖̯֚b +a〪̖̯֚b +a〪̖̯֚b + +a〪̯̖֚b +a〪̯̖֚b +a〪̯̖֚b +a〪̯̖֚b +a〪̯̖֚b + +a〪̖̰֚b +a〪̖̰֚b +a〪̖̰֚b +a〪̖̰֚b +a〪̖̰֚b + +a〪̰̖֚b +a〪̰̖֚b +a〪̰̖֚b +a〪̰̖֚b +a〪̰̖֚b + +a〪̖̱֚b +a〪̖̱֚b +a〪̖̱֚b +a〪̖̱֚b +a〪̖̱֚b + +a〪̱̖֚b +a〪̱̖֚b +a〪̱̖֚b +a〪̱̖֚b +a〪̱̖֚b + +a〪̖̲֚b +a〪̖̲֚b +a〪̖̲֚b +a〪̖̲֚b +a〪̖̲֚b + +a〪̲̖֚b +a〪̲̖֚b +a〪̲̖֚b +a〪̲̖֚b +a〪̲̖֚b + +a〪̖̳֚b +a〪̖̳֚b +a〪̖̳֚b +a〪̖̳֚b +a〪̖̳֚b + +a〪̳̖֚b +a〪̳̖֚b +a〪̳̖֚b +a〪̳̖֚b +a〪̳̖֚b + +a̴̴़b +a̴̴़b +a̴̴़b +a̴̴़b +a̴̴़b + +a̴̴़b +a̴̴़b +a̴̴़b +a̴̴़b +a̴̴़b + +a̴̵़b +a̴̵़b +a̴̵़b +a̴̵़b +a̴̵़b + +a̵̴़b +a̵̴़b +a̵̴़b +a̵̴़b +a̵̴़b + +a̴̶़b +a̴̶़b +a̴̶़b +a̴̶़b +a̴̶़b + +a̶̴़b +a̶̴़b +a̶̴़b +a̶̴़b +a̶̴़b + +a̴̷़b +a̴̷़b +a̴̷़b +a̴̷़b +a̴̷़b + +a̷̴़b +a̷̴़b +a̷̴़b +a̷̴़b +a̷̴़b + +a̴̸़b +a̴̸़b +a̴̸़b +a̴̸़b +a̴̸़b + +a̸̴़b +a̸̴़b +a̸̴़b +a̸̴़b +a̸̴़b + +a〪̖̹֚b +a〪̖̹֚b +a〪̖̹֚b +a〪̖̹֚b +a〪̖̹֚b + +a〪̹̖֚b +a〪̹̖֚b +a〪̹̖֚b +a〪̹̖֚b +a〪̹̖֚b + +a〪̖̺֚b +a〪̖̺֚b +a〪̖̺֚b +a〪̖̺֚b +a〪̖̺֚b + +a〪̺̖֚b +a〪̺̖֚b +a〪̺̖֚b +a〪̺̖֚b +a〪̺̖֚b + +a〪̖̻֚b +a〪̖̻֚b +a〪̖̻֚b +a〪̖̻֚b +a〪̖̻֚b + +a〪̻̖֚b +a〪̻̖֚b +a〪̻̖֚b +a〪̻̖֚b +a〪̻̖֚b + +a〪̖̼֚b +a〪̖̼֚b +a〪̖̼֚b +a〪̖̼֚b +a〪̖̼֚b + +a〪̼̖֚b +a〪̼̖֚b +a〪̼̖֚b +a〪̼̖֚b +a〪̼̖֚b + +à֮̽̕b +à֮̽̕b +à֮̽̕b +à֮̽̕b +à֮̽̕b + +a֮̽̀̕b +a֮̽̀̕b +a֮̽̀̕b +a֮̽̀̕b +a֮̽̀̕b + +à֮̾̕b +à֮̾̕b +à֮̾̕b +à֮̾̕b +à֮̾̕b + +a֮̾̀̕b +a֮̾̀̕b +a֮̾̀̕b +a֮̾̀̕b +a֮̾̀̕b + +à֮̿̕b +à֮̿̕b +à֮̿̕b +à֮̿̕b +à֮̿̕b + +a֮̿̀̕b +a֮̿̀̕b +a֮̿̀̕b +a֮̿̀̕b +a֮̿̀̕b + +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b + +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b + +à֮́̕b +à֮́̕b +à֮́̕b +à֮́̕b +à֮́̕b + +á֮̀̕b +á֮̀̕b +á֮̀̕b +á֮̀̕b +á֮̀̕b + +à֮͂̕b +à֮͂̕b +à֮͂̕b +à֮͂̕b +à֮͂̕b + +a֮͂̀̕b +a֮͂̀̕b +a֮͂̀̕b +a֮͂̀̕b +a֮͂̀̕b + +à֮̓̕b +à֮̓̕b +à֮̓̕b +à֮̓̕b +à֮̓̕b + +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b + +à֮̈́̕b +à֮̈́̕b +à֮̈́̕b +à֮̈́̕b +à֮̈́̕b + +ä֮́̀̕b +ä֮́̀̕b +ä֮́̀̕b +ä֮́̀̕b +ä֮́̀̕b + +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb + +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb + +à֮͆̕b +à֮͆̕b +à֮͆̕b +à֮͆̕b +à֮͆̕b + +a֮͆̀̕b +a֮͆̀̕b +a֮͆̀̕b +a֮͆̀̕b +a֮͆̀̕b + +a〪̖͇֚b +a〪̖͇֚b +a〪̖͇֚b +a〪̖͇֚b +a〪̖͇֚b + +a〪͇̖֚b +a〪͇̖֚b +a〪͇̖֚b +a〪͇̖֚b +a〪͇̖֚b + +a〪̖͈֚b +a〪̖͈֚b +a〪̖͈֚b +a〪̖͈֚b +a〪̖͈֚b + +a〪͈̖֚b +a〪͈̖֚b +a〪͈̖֚b +a〪͈̖֚b +a〪͈̖֚b + +a〪̖͉֚b +a〪̖͉֚b +a〪̖͉֚b +a〪̖͉֚b +a〪̖͉֚b + +a〪͉̖֚b +a〪͉̖֚b +a〪͉̖֚b +a〪͉̖֚b +a〪͉̖֚b + +à֮͊̕b +à֮͊̕b +à֮͊̕b +à֮͊̕b +à֮͊̕b + +a֮͊̀̕b +a֮͊̀̕b +a֮͊̀̕b +a֮͊̀̕b +a֮͊̀̕b + +à֮͋̕b +à֮͋̕b +à֮͋̕b +à֮͋̕b +à֮͋̕b + +a֮͋̀̕b +a֮͋̀̕b +a֮͋̀̕b +a֮͋̀̕b +a֮͋̀̕b + +à֮͌̕b +à֮͌̕b +à֮͌̕b +à֮͌̕b +à֮͌̕b + +a֮͌̀̕b +a֮͌̀̕b +a֮͌̀̕b +a֮͌̀̕b +a֮͌̀̕b + +a〪̖͍֚b +a〪̖͍֚b +a〪̖͍֚b +a〪̖͍֚b +a〪̖͍֚b + +a〪͍̖֚b +a〪͍̖֚b +a〪͍̖֚b +a〪͍̖֚b +a〪͍̖֚b + +a〪̖͎֚b +a〪̖͎֚b +a〪̖͎֚b +a〪̖͎֚b +a〪̖͎֚b + +a〪͎̖֚b +a〪͎̖֚b +a〪͎̖֚b +a〪͎̖֚b +a〪͎̖֚b + +à֮͐̕b +à֮͐̕b +à֮͐̕b +à֮͐̕b +à֮͐̕b + +a֮͐̀̕b +a֮͐̀̕b +a֮͐̀̕b +a֮͐̀̕b +a֮͐̀̕b + +à֮͑̕b +à֮͑̕b +à֮͑̕b +à֮͑̕b +à֮͑̕b + +a֮͑̀̕b +a֮͑̀̕b +a֮͑̀̕b +a֮͑̀̕b +a֮͑̀̕b + +à֮͒̕b +à֮͒̕b +à֮͒̕b +à֮͒̕b +à֮͒̕b + +a֮͒̀̕b +a֮͒̀̕b +a֮͒̀̕b +a֮͒̀̕b +a֮͒̀̕b + +a〪̖͓֚b +a〪̖͓֚b +a〪̖͓֚b +a〪̖͓֚b +a〪̖͓֚b + +a〪͓̖֚b +a〪͓̖֚b +a〪͓̖֚b +a〪͓̖֚b +a〪͓̖֚b + +a〪̖͔֚b +a〪̖͔֚b +a〪̖͔֚b +a〪̖͔֚b +a〪̖͔֚b + +a〪͔̖֚b +a〪͔̖֚b +a〪͔̖֚b +a〪͔̖֚b +a〪͔̖֚b + +a〪̖͕֚b +a〪̖͕֚b +a〪̖͕֚b +a〪̖͕֚b +a〪̖͕֚b + +a〪͕̖֚b +a〪͕̖֚b +a〪͕̖֚b +a〪͕̖֚b +a〪͕̖֚b + +a〪̖͖֚b +a〪̖͖֚b +a〪̖͖֚b +a〪̖͖֚b +a〪̖͖֚b + +a〪͖̖֚b +a〪͖̖֚b +a〪͖̖֚b +a〪͖̖֚b +a〪͖̖֚b + +à֮͗̕b +à֮͗̕b +à֮͗̕b +à֮͗̕b +à֮͗̕b + +a֮͗̀̕b +a֮͗̀̕b +a֮͗̀̕b +a֮͗̀̕b +a֮͗̀̕b + +à̕͘͜b +à̕͘͜b +à̕͘͜b +à̕͘͜b +à̕͘͜b + +à͘̕͜b +à͘̕͜b +à͘̕͜b +à͘̕͜b +à͘̕͜b + +a〪̖͙֚b +a〪̖͙֚b +a〪̖͙֚b +a〪̖͙֚b +a〪̖͙֚b + +a〪͙̖֚b +a〪͙̖֚b +a〪͙̖֚b +a〪͙̖֚b +a〪͙̖֚b + +a〪̖͚֚b +a〪̖͚֚b +a〪̖͚֚b +a〪̖͚֚b +a〪̖͚֚b + +a〪͚̖֚b +a〪͚̖֚b +a〪͚̖֚b +a〪͚̖֚b +a〪͚̖֚b + +à֮͛̕b +à֮͛̕b +à֮͛̕b +à֮͛̕b +à֮͛̕b + +a֮͛̀̕b +a֮͛̀̕b +a֮͛̀̕b +a֮͛̀̕b +a֮͛̀̕b + +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b + +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b + +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb + +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb + +a͜͝͞ͅb +a͜͝͞ͅb +a͜͝͞ͅb +a͜͝͞ͅb +a͜͝͞ͅb + +a͜͞͝ͅb +a͜͞͝ͅb +a͜͞͝ͅb +a͜͞͝ͅb +a͜͞͝ͅb + +a̕͜͟͝b +a̕͜͟͝b +a̕͜͟͝b +a̕͜͟͝b +a̕͜͟͝b + +a̕͟͜͝b +a̕͟͜͝b +a̕͟͜͝b +a̕͟͜͝b +a̕͟͜͝b + +a͜͝͠ͅb +a͜͝͠ͅb +a͜͝͠ͅb +a͜͝͠ͅb +a͜͝͠ͅb + +a͜͠͝ͅb +a͜͠͝ͅb +a͜͠͝ͅb +a͜͠͝ͅb +a͜͠͝ͅb + +a͜͝͡ͅb +a͜͝͡ͅb +a͜͝͡ͅb +a͜͝͡ͅb +a͜͝͡ͅb + +a͜͡͝ͅb +a͜͡͝ͅb +a͜͡͝ͅb +a͜͡͝ͅb +a͜͡͝ͅb + +a̕͜͢͝b +a̕͜͢͝b +a̕͜͢͝b +a̕͜͢͝b +a̕͜͢͝b + +a̕͢͜͝b +a̕͢͜͝b +a̕͢͜͝b +a̕͢͜͝b +a̕͢͜͝b + +à֮ͣ̕b +à֮ͣ̕b +à֮ͣ̕b +à֮ͣ̕b +à֮ͣ̕b + +a֮ͣ̀̕b +a֮ͣ̀̕b +a֮ͣ̀̕b +a֮ͣ̀̕b +a֮ͣ̀̕b + +à֮ͤ̕b +à֮ͤ̕b +à֮ͤ̕b +à֮ͤ̕b +à֮ͤ̕b + +a֮ͤ̀̕b +a֮ͤ̀̕b +a֮ͤ̀̕b +a֮ͤ̀̕b +a֮ͤ̀̕b + +à֮ͥ̕b +à֮ͥ̕b +à֮ͥ̕b +à֮ͥ̕b +à֮ͥ̕b + +a֮ͥ̀̕b +a֮ͥ̀̕b +a֮ͥ̀̕b +a֮ͥ̀̕b +a֮ͥ̀̕b + +à֮ͦ̕b +à֮ͦ̕b +à֮ͦ̕b +à֮ͦ̕b +à֮ͦ̕b + +a֮ͦ̀̕b +a֮ͦ̀̕b +a֮ͦ̀̕b +a֮ͦ̀̕b +a֮ͦ̀̕b + +à֮ͧ̕b +à֮ͧ̕b +à֮ͧ̕b +à֮ͧ̕b +à֮ͧ̕b + +a֮ͧ̀̕b +a֮ͧ̀̕b +a֮ͧ̀̕b +a֮ͧ̀̕b +a֮ͧ̀̕b + +à֮ͨ̕b +à֮ͨ̕b +à֮ͨ̕b +à֮ͨ̕b +à֮ͨ̕b + +a֮ͨ̀̕b +a֮ͨ̀̕b +a֮ͨ̀̕b +a֮ͨ̀̕b +a֮ͨ̀̕b + +à֮ͩ̕b +à֮ͩ̕b +à֮ͩ̕b +à֮ͩ̕b +à֮ͩ̕b + +a֮ͩ̀̕b +a֮ͩ̀̕b +a֮ͩ̀̕b +a֮ͩ̀̕b +a֮ͩ̀̕b + +à֮ͪ̕b +à֮ͪ̕b +à֮ͪ̕b +à֮ͪ̕b +à֮ͪ̕b + +a֮ͪ̀̕b +a֮ͪ̀̕b +a֮ͪ̀̕b +a֮ͪ̀̕b +a֮ͪ̀̕b + +à֮ͫ̕b +à֮ͫ̕b +à֮ͫ̕b +à֮ͫ̕b +à֮ͫ̕b + +a֮ͫ̀̕b +a֮ͫ̀̕b +a֮ͫ̀̕b +a֮ͫ̀̕b +a֮ͫ̀̕b + +à֮ͬ̕b +à֮ͬ̕b +à֮ͬ̕b +à֮ͬ̕b +à֮ͬ̕b + +a֮ͬ̀̕b +a֮ͬ̀̕b +a֮ͬ̀̕b +a֮ͬ̀̕b +a֮ͬ̀̕b + +à֮ͭ̕b +à֮ͭ̕b +à֮ͭ̕b +à֮ͭ̕b +à֮ͭ̕b + +a֮ͭ̀̕b +a֮ͭ̀̕b +a֮ͭ̀̕b +a֮ͭ̀̕b +a֮ͭ̀̕b + +à֮ͮ̕b +à֮ͮ̕b +à֮ͮ̕b +à֮ͮ̕b +à֮ͮ̕b + +a֮ͮ̀̕b +a֮ͮ̀̕b +a֮ͮ̀̕b +a֮ͮ̀̕b +a֮ͮ̀̕b + +à֮ͯ̕b +à֮ͯ̕b +à֮ͯ̕b +à֮ͯ̕b +à֮ͯ̕b + +a֮ͯ̀̕b +a֮ͯ̀̕b +a֮ͯ̀̕b +a֮ͯ̀̕b +a֮ͯ̀̕b + +à֮҃̕b +à֮҃̕b +à֮҃̕b +à֮҃̕b +à֮҃̕b + +a֮҃̀̕b +a֮҃̀̕b +a֮҃̀̕b +a֮҃̀̕b +a֮҃̀̕b + +à֮҄̕b +à֮҄̕b +à֮҄̕b +à֮҄̕b +à֮҄̕b + +a֮҄̀̕b +a֮҄̀̕b +a֮҄̀̕b +a֮҄̀̕b +a֮҄̀̕b + +à֮҅̕b +à֮҅̕b +à֮҅̕b +à֮҅̕b +à֮҅̕b + +a֮҅̀̕b +a֮҅̀̕b +a֮҅̀̕b +a֮҅̀̕b +a֮҅̀̕b + +à֮҆̕b +à֮҆̕b +à֮҆̕b +à֮҆̕b +à֮҆̕b + +a֮҆̀̕b +a֮҆̀̕b +a֮҆̀̕b +a֮҆̀̕b +a֮҆̀̕b + +à֮҇̕b +à֮҇̕b +à֮҇̕b +à֮҇̕b +à֮҇̕b + +a֮҇̀̕b +a֮҇̀̕b +a֮҇̀̕b +a֮҇̀̕b +a֮҇̀̕b + +a〪̖֑֚b +a〪̖֑֚b +a〪̖֑֚b +a〪̖֑֚b +a〪̖֑֚b + +a〪֑̖֚b +a〪֑̖֚b +a〪֑̖֚b +a〪֑̖֚b +a〪֑̖֚b + +à֮֒̕b +à֮֒̕b +à֮֒̕b +à֮֒̕b +à֮֒̕b + +a֮֒̀̕b +a֮֒̀̕b +a֮֒̀̕b +a֮֒̀̕b +a֮֒̀̕b + +à֮֓̕b +à֮֓̕b +à֮֓̕b +à֮֓̕b +à֮֓̕b + +a֮֓̀̕b +a֮֓̀̕b +a֮֓̀̕b +a֮֓̀̕b +a֮֓̀̕b + +à֮֔̕b +à֮֔̕b +à֮֔̕b +à֮֔̕b +à֮֔̕b + +a֮֔̀̕b +a֮֔̀̕b +a֮֔̀̕b +a֮֔̀̕b +a֮֔̀̕b + +à֮֕̕b +à֮֕̕b +à֮֕̕b +à֮֕̕b +à֮֕̕b + +a֮֕̀̕b +a֮֕̀̕b +a֮֕̀̕b +a֮֕̀̕b +a֮֕̀̕b + +a〪̖֖֚b +a〪̖֖֚b +a〪̖֖֚b +a〪̖֖֚b +a〪̖֖֚b + +a〪֖̖֚b +a〪֖̖֚b +a〪֖̖֚b +a〪֖̖֚b +a〪֖̖֚b + +à֮֗̕b +à֮֗̕b +à֮֗̕b +à֮֗̕b +à֮֗̕b + +a֮֗̀̕b +a֮֗̀̕b +a֮֗̀̕b +a֮֗̀̕b +a֮֗̀̕b + +à֮֘̕b +à֮֘̕b +à֮֘̕b +à֮֘̕b +à֮֘̕b + +a֮֘̀̕b +a֮֘̀̕b +a֮֘̀̕b +a֮֘̀̕b +a֮֘̀̕b + +à֮֙̕b +à֮֙̕b +à֮֙̕b +à֮֙̕b +à֮֙̕b + +a֮֙̀̕b +a֮֙̀̕b +a֮֙̀̕b +a֮֙̀̕b +a֮֙̀̕b + +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b + +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b + +a〪̖֛֚b +a〪̖֛֚b +a〪̖֛֚b +a〪̖֛֚b +a〪̖֛֚b + +a〪֛̖֚b +a〪֛̖֚b +a〪֛̖֚b +a〪֛̖֚b +a〪֛̖֚b + +à֮֜̕b +à֮֜̕b +à֮֜̕b +à֮֜̕b +à֮֜̕b + +a֮֜̀̕b +a֮֜̀̕b +a֮֜̀̕b +a֮֜̀̕b +a֮֜̀̕b + +à֮֝̕b +à֮֝̕b +à֮֝̕b +à֮֝̕b +à֮֝̕b + +a֮֝̀̕b +a֮֝̀̕b +a֮֝̀̕b +a֮֝̀̕b +a֮֝̀̕b + +à֮֞̕b +à֮֞̕b +à֮֞̕b +à֮֞̕b +à֮֞̕b + +a֮֞̀̕b +a֮֞̀̕b +a֮֞̀̕b +a֮֞̀̕b +a֮֞̀̕b + +à֮֟̕b +à֮֟̕b +à֮֟̕b +à֮֟̕b +à֮֟̕b + +a֮֟̀̕b +a֮֟̀̕b +a֮֟̀̕b +a֮֟̀̕b +a֮֟̀̕b + +à֮֠̕b +à֮֠̕b +à֮֠̕b +à֮֠̕b +à֮֠̕b + +a֮֠̀̕b +a֮֠̀̕b +a֮֠̀̕b +a֮֠̀̕b +a֮֠̀̕b + +à֮֡̕b +à֮֡̕b +à֮֡̕b +à֮֡̕b +à֮֡̕b + +a֮֡̀̕b +a֮֡̀̕b +a֮֡̀̕b +a֮֡̀̕b +a֮֡̀̕b + +a〪̖֢֚b +a〪̖֢֚b +a〪̖֢֚b +a〪̖֢֚b +a〪̖֢֚b + +a〪֢̖֚b +a〪֢̖֚b +a〪֢̖֚b +a〪֢̖֚b +a〪֢̖֚b + +a〪̖֣֚b +a〪̖֣֚b +a〪̖֣֚b +a〪̖֣֚b +a〪̖֣֚b + +a〪֣̖֚b +a〪֣̖֚b +a〪֣̖֚b +a〪֣̖֚b +a〪֣̖֚b + +a〪̖֤֚b +a〪̖֤֚b +a〪̖֤֚b +a〪̖֤֚b +a〪̖֤֚b + +a〪֤̖֚b +a〪֤̖֚b +a〪֤̖֚b +a〪֤̖֚b +a〪֤̖֚b + +a〪̖֥֚b +a〪̖֥֚b +a〪̖֥֚b +a〪̖֥֚b +a〪̖֥֚b + +a〪֥̖֚b +a〪֥̖֚b +a〪֥̖֚b +a〪֥̖֚b +a〪֥̖֚b + +a〪̖֦֚b +a〪̖֦֚b +a〪̖֦֚b +a〪̖֦֚b +a〪̖֦֚b + +a〪֦̖֚b +a〪֦̖֚b +a〪֦̖֚b +a〪֦̖֚b +a〪֦̖֚b + +a〪̖֧֚b +a〪̖֧֚b +a〪̖֧֚b +a〪̖֧֚b +a〪̖֧֚b + +a〪֧̖֚b +a〪֧̖֚b +a〪֧̖֚b +a〪֧̖֚b +a〪֧̖֚b + +à֮֨̕b +à֮֨̕b +à֮֨̕b +à֮֨̕b +à֮֨̕b + +a֮֨̀̕b +a֮֨̀̕b +a֮֨̀̕b +a֮֨̀̕b +a֮֨̀̕b + +à֮֩̕b +à֮֩̕b +à֮֩̕b +à֮֩̕b +à֮֩̕b + +a֮֩̀̕b +a֮֩̀̕b +a֮֩̀̕b +a֮֩̀̕b +a֮֩̀̕b + +a〪̖֪֚b +a〪̖֪֚b +a〪̖֪֚b +a〪̖֪֚b +a〪̖֪֚b + +a〪֪̖֚b +a〪֪̖֚b +a〪֪̖֚b +a〪֪̖֚b +a〪֪̖֚b + +à֮֫̕b +à֮֫̕b +à֮֫̕b +à֮֫̕b +à֮֫̕b + +a֮֫̀̕b +a֮֫̀̕b +a֮֫̀̕b +a֮֫̀̕b +a֮֫̀̕b + +à֮֬̕b +à֮֬̕b +à֮֬̕b +à֮֬̕b +à֮֬̕b + +a֮֬̀̕b +a֮֬̀̕b +a֮֬̀̕b +a֮֬̀̕b +a֮֬̀̕b + +a̖֚֭〮b +a̖֚֭〮b +a̖֚֭〮b +a̖֚֭〮b +a̖֚֭〮b + +a̖֭֚〮b +a̖֭֚〮b +a̖֭֚〮b +a̖֭֚〮b +a̖֭֚〮b + +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b + +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b + +à֮֯̕b +à֮֯̕b +à֮֯̕b +à֮֯̕b +à֮֯̕b + +a֮֯̀̕b +a֮֯̀̕b +a֮֯̀̕b +a֮֯̀̕b +a֮֯̀̕b + +a्ְְֱb +a्ְְֱb +a्ְְֱb +a्ְְֱb +a्ְְֱb + +a्ְְֱb +a्ְְֱb +a्ְְֱb +a्ְְֱb +a्ְְֱb + +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb + +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb + +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb + +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb + +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb + +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb + +aֳִִֵb +aֳִִֵb +aֳִִֵb +aֳִִֵb +aֳִִֵb + +aֳִִֵb +aֳִִֵb +aֳִִֵb +aֳִִֵb +aֳִִֵb + +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb + +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb + +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb + +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb + +aֶַַָb +aֶַַָb +aֶַַָb +aֶַַָb +aֶַַָb + +aֶַַָb +aֶַַָb +aֶַַָb +aֶַַָb +aֶַַָb + +aַָָֹb +aַָָֹb +aַָָֹb +aַָָֹb +aַָָֹb + +aַָָֹb +aַָָֹb +aַָָֹb +aַָָֹb +aַָָֹb + +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb + +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb + +aָֹֺֻb +aָֹֺֻb +aָֹֺֻb +aָֹֺֻb +aָֹֺֻb + +aָֺֹֻb +aָֺֹֻb +aָֺֹֻb +aָֺֹֻb +aָֺֹֻb + +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb + +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb + +aֻּּֽb +aֻּּֽb +aֻּּֽb +aֻּּֽb +aֻּּֽb + +aֻּּֽb +aֻּּֽb +aֻּּֽb +aֻּּֽb +aֻּּֽb + +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb + +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb + +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb + +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb + +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb + +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb + +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb + +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb + +à֮ׄ̕b +à֮ׄ̕b +à֮ׄ̕b +à֮ׄ̕b +à֮ׄ̕b + +a֮ׄ̀̕b +a֮ׄ̀̕b +a֮ׄ̀̕b +a֮ׄ̀̕b +a֮ׄ̀̕b + +a〪̖ׅ֚b +a〪̖ׅ֚b +a〪̖ׅ֚b +a〪̖ׅ֚b +a〪̖ׅ֚b + +a〪ׅ̖֚b +a〪ׅ̖֚b +a〪ׅ̖֚b +a〪ׅ̖֚b +a〪ׅ̖֚b + +aַָׇֹb +aַָׇֹb +aַָׇֹb +aַָׇֹb +aַָׇֹb + +aַׇָֹb +aַׇָֹb +aַׇָֹb +aַׇָֹb +aַׇָֹb + +à֮ؐ̕b +à֮ؐ̕b +à֮ؐ̕b +à֮ؐ̕b +à֮ؐ̕b + +a֮ؐ̀̕b +a֮ؐ̀̕b +a֮ؐ̀̕b +a֮ؐ̀̕b +a֮ؐ̀̕b + +à֮ؑ̕b +à֮ؑ̕b +à֮ؑ̕b +à֮ؑ̕b +à֮ؑ̕b + +a֮ؑ̀̕b +a֮ؑ̀̕b +a֮ؑ̀̕b +a֮ؑ̀̕b +a֮ؑ̀̕b + +à֮ؒ̕b +à֮ؒ̕b +à֮ؒ̕b +à֮ؒ̕b +à֮ؒ̕b + +a֮ؒ̀̕b +a֮ؒ̀̕b +a֮ؒ̀̕b +a֮ؒ̀̕b +a֮ؒ̀̕b + +à֮ؓ̕b +à֮ؓ̕b +à֮ؓ̕b +à֮ؓ̕b +à֮ؓ̕b + +a֮ؓ̀̕b +a֮ؓ̀̕b +a֮ؓ̀̕b +a֮ؓ̀̕b +a֮ؓ̀̕b + +à֮ؔ̕b +à֮ؔ̕b +à֮ؔ̕b +à֮ؔ̕b +à֮ؔ̕b + +a֮ؔ̀̕b +a֮ؔ̀̕b +a֮ؔ̀̕b +a֮ؔ̀̕b +a֮ؔ̀̕b + +à֮ؕ̕b +à֮ؕ̕b +à֮ؕ̕b +à֮ؕ̕b +à֮ؕ̕b + +a֮ؕ̀̕b +a֮ؕ̀̕b +a֮ؕ̀̕b +a֮ؕ̀̕b +a֮ؕ̀̕b + +à֮ؖ̕b +à֮ؖ̕b +à֮ؖ̕b +à֮ؖ̕b +à֮ؖ̕b + +a֮ؖ̀̕b +a֮ؖ̀̕b +a֮ؖ̀̕b +a֮ؖ̀̕b +a֮ؖ̀̕b + +à֮ؗ̕b +à֮ؗ̕b +à֮ؗ̕b +à֮ؗ̕b +à֮ؗ̕b + +a֮ؗ̀̕b +a֮ؗ̀̕b +a֮ؗ̀̕b +a֮ؗ̀̕b +a֮ؗ̀̕b + +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb + +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb + +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb + +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb + +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb + +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb + +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb + +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb + +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb + +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb + +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb + +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb + +aٍؘَؙb +aٍؘَؙb +aٍؘَؙb +aٍؘَؙb +aٍؘَؙb + +aٍَؘؙb +aٍَؘؙb +aٍَؘؙb +aٍَؘؙb +aٍَؘؙb + +aؘؙُؚb +aؘؙُؚb +aؘؙُؚb +aؘؙُؚb +aؘؙُؚb + +aؘُؙؚb +aؘُؙؚb +aؘُؙؚb +aؘُؙؚb +aؘُؙؚb + +aؙؚِّb +aؙؚِّb +aؙؚِّb +aؙؚِّb +aؙؚِّb + +aؙِؚّb +aؙِؚّb +aؙِؚّb +aؙِؚّb +aؙِؚّb + +aؚّّْb +aؚّّْb +aؚّّْb +aؚّّْb +aؚّّْb + +aؚّّْb +aؚّّْb +aؚّّْb +aؚّّْb +aؚّّْb + +aّْْٰb +aّْْٰb +aّْْٰb +aّْْٰb +aّْْٰb + +aّْْٰb +aّْْٰb +aّْْٰb +aّْْٰb +aّْْٰb + +à֮ٓ̕b +à֮ٓ̕b +à֮ٓ̕b +à֮ٓ̕b +à֮ٓ̕b + +a֮ٓ̀̕b +a֮ٓ̀̕b +a֮ٓ̀̕b +a֮ٓ̀̕b +a֮ٓ̀̕b + +à֮ٔ̕b +à֮ٔ̕b +à֮ٔ̕b +à֮ٔ̕b +à֮ٔ̕b + +a֮ٔ̀̕b +a֮ٔ̀̕b +a֮ٔ̀̕b +a֮ٔ̀̕b +a֮ٔ̀̕b + +a〪̖ٕ֚b +a〪̖ٕ֚b +a〪̖ٕ֚b +a〪̖ٕ֚b +a〪̖ٕ֚b + +a〪ٕ̖֚b +a〪ٕ̖֚b +a〪ٕ̖֚b +a〪ٕ̖֚b +a〪ٕ̖֚b + +a〪̖ٖ֚b +a〪̖ٖ֚b +a〪̖ٖ֚b +a〪̖ٖ֚b +a〪̖ٖ֚b + +a〪ٖ̖֚b +a〪ٖ̖֚b +a〪ٖ̖֚b +a〪ٖ̖֚b +a〪ٖ̖֚b + +à֮ٗ̕b +à֮ٗ̕b +à֮ٗ̕b +à֮ٗ̕b +à֮ٗ̕b + +a֮ٗ̀̕b +a֮ٗ̀̕b +a֮ٗ̀̕b +a֮ٗ̀̕b +a֮ٗ̀̕b + +à֮٘̕b +à֮٘̕b +à֮٘̕b +à֮٘̕b +à֮٘̕b + +a֮٘̀̕b +a֮٘̀̕b +a֮٘̀̕b +a֮٘̀̕b +a֮٘̀̕b + +à֮ٙ̕b +à֮ٙ̕b +à֮ٙ̕b +à֮ٙ̕b +à֮ٙ̕b + +a֮ٙ̀̕b +a֮ٙ̀̕b +a֮ٙ̀̕b +a֮ٙ̀̕b +a֮ٙ̀̕b + +à֮ٚ̕b +à֮ٚ̕b +à֮ٚ̕b +à֮ٚ̕b +à֮ٚ̕b + +a֮ٚ̀̕b +a֮ٚ̀̕b +a֮ٚ̀̕b +a֮ٚ̀̕b +a֮ٚ̀̕b + +à֮ٛ̕b +à֮ٛ̕b +à֮ٛ̕b +à֮ٛ̕b +à֮ٛ̕b + +a֮ٛ̀̕b +a֮ٛ̀̕b +a֮ٛ̀̕b +a֮ٛ̀̕b +a֮ٛ̀̕b + +a〪̖ٜ֚b +a〪̖ٜ֚b +a〪̖ٜ֚b +a〪̖ٜ֚b +a〪̖ٜ֚b + +a〪ٜ̖֚b +a〪ٜ̖֚b +a〪ٜ̖֚b +a〪ٜ̖֚b +a〪ٜ̖֚b + +à֮ٝ̕b +à֮ٝ̕b +à֮ٝ̕b +à֮ٝ̕b +à֮ٝ̕b + +a֮ٝ̀̕b +a֮ٝ̀̕b +a֮ٝ̀̕b +a֮ٝ̀̕b +a֮ٝ̀̕b + +à֮ٞ̕b +à֮ٞ̕b +à֮ٞ̕b +à֮ٞ̕b +à֮ٞ̕b + +a֮ٞ̀̕b +a֮ٞ̀̕b +a֮ٞ̀̕b +a֮ٞ̀̕b +a֮ٞ̀̕b + +a〪̖ٟ֚b +a〪̖ٟ֚b +a〪̖ٟ֚b +a〪̖ٟ֚b +a〪̖ٟ֚b + +a〪ٟ̖֚b +a〪ٟ̖֚b +a〪ٟ̖֚b +a〪ٟ̖֚b +a〪ٟ̖֚b + +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb + +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb + +à֮ۖ̕b +à֮ۖ̕b +à֮ۖ̕b +à֮ۖ̕b +à֮ۖ̕b + +a֮ۖ̀̕b +a֮ۖ̀̕b +a֮ۖ̀̕b +a֮ۖ̀̕b +a֮ۖ̀̕b + +à֮ۗ̕b +à֮ۗ̕b +à֮ۗ̕b +à֮ۗ̕b +à֮ۗ̕b + +a֮ۗ̀̕b +a֮ۗ̀̕b +a֮ۗ̀̕b +a֮ۗ̀̕b +a֮ۗ̀̕b + +à֮ۘ̕b +à֮ۘ̕b +à֮ۘ̕b +à֮ۘ̕b +à֮ۘ̕b + +a֮ۘ̀̕b +a֮ۘ̀̕b +a֮ۘ̀̕b +a֮ۘ̀̕b +a֮ۘ̀̕b + +à֮ۙ̕b +à֮ۙ̕b +à֮ۙ̕b +à֮ۙ̕b +à֮ۙ̕b + +a֮ۙ̀̕b +a֮ۙ̀̕b +a֮ۙ̀̕b +a֮ۙ̀̕b +a֮ۙ̀̕b + +à֮ۚ̕b +à֮ۚ̕b +à֮ۚ̕b +à֮ۚ̕b +à֮ۚ̕b + +a֮ۚ̀̕b +a֮ۚ̀̕b +a֮ۚ̀̕b +a֮ۚ̀̕b +a֮ۚ̀̕b + +à֮ۛ̕b +à֮ۛ̕b +à֮ۛ̕b +à֮ۛ̕b +à֮ۛ̕b + +a֮ۛ̀̕b +a֮ۛ̀̕b +a֮ۛ̀̕b +a֮ۛ̀̕b +a֮ۛ̀̕b + +à֮ۜ̕b +à֮ۜ̕b +à֮ۜ̕b +à֮ۜ̕b +à֮ۜ̕b + +a֮ۜ̀̕b +a֮ۜ̀̕b +a֮ۜ̀̕b +a֮ۜ̀̕b +a֮ۜ̀̕b + +à֮۟̕b +à֮۟̕b +à֮۟̕b +à֮۟̕b +à֮۟̕b + +a֮۟̀̕b +a֮۟̀̕b +a֮۟̀̕b +a֮۟̀̕b +a֮۟̀̕b + +à֮۠̕b +à֮۠̕b +à֮۠̕b +à֮۠̕b +à֮۠̕b + +a֮۠̀̕b +a֮۠̀̕b +a֮۠̀̕b +a֮۠̀̕b +a֮۠̀̕b + +à֮ۡ̕b +à֮ۡ̕b +à֮ۡ̕b +à֮ۡ̕b +à֮ۡ̕b + +a֮ۡ̀̕b +a֮ۡ̀̕b +a֮ۡ̀̕b +a֮ۡ̀̕b +a֮ۡ̀̕b + +à֮ۢ̕b +à֮ۢ̕b +à֮ۢ̕b +à֮ۢ̕b +à֮ۢ̕b + +a֮ۢ̀̕b +a֮ۢ̀̕b +a֮ۢ̀̕b +a֮ۢ̀̕b +a֮ۢ̀̕b + +a〪̖ۣ֚b +a〪̖ۣ֚b +a〪̖ۣ֚b +a〪̖ۣ֚b +a〪̖ۣ֚b + +a〪ۣ̖֚b +a〪ۣ̖֚b +a〪ۣ̖֚b +a〪ۣ̖֚b +a〪ۣ̖֚b + +à֮ۤ̕b +à֮ۤ̕b +à֮ۤ̕b +à֮ۤ̕b +à֮ۤ̕b + +a֮ۤ̀̕b +a֮ۤ̀̕b +a֮ۤ̀̕b +a֮ۤ̀̕b +a֮ۤ̀̕b + +à֮ۧ̕b +à֮ۧ̕b +à֮ۧ̕b +à֮ۧ̕b +à֮ۧ̕b + +a֮ۧ̀̕b +a֮ۧ̀̕b +a֮ۧ̀̕b +a֮ۧ̀̕b +a֮ۧ̀̕b + +à֮ۨ̕b +à֮ۨ̕b +à֮ۨ̕b +à֮ۨ̕b +à֮ۨ̕b + +a֮ۨ̀̕b +a֮ۨ̀̕b +a֮ۨ̀̕b +a֮ۨ̀̕b +a֮ۨ̀̕b + +a〪̖۪֚b +a〪̖۪֚b +a〪̖۪֚b +a〪̖۪֚b +a〪̖۪֚b + +a〪۪̖֚b +a〪۪̖֚b +a〪۪̖֚b +a〪۪̖֚b +a〪۪̖֚b + +à֮۫̕b +à֮۫̕b +à֮۫̕b +à֮۫̕b +à֮۫̕b + +a֮۫̀̕b +a֮۫̀̕b +a֮۫̀̕b +a֮۫̀̕b +a֮۫̀̕b + +à֮۬̕b +à֮۬̕b +à֮۬̕b +à֮۬̕b +à֮۬̕b + +a֮۬̀̕b +a֮۬̀̕b +a֮۬̀̕b +a֮۬̀̕b +a֮۬̀̕b + +a〪̖ۭ֚b +a〪̖ۭ֚b +a〪̖ۭ֚b +a〪̖ۭ֚b +a〪̖ۭ֚b + +a〪ۭ̖֚b +a〪ۭ̖֚b +a〪ۭ̖֚b +a〪ۭ̖֚b +a〪ۭ̖֚b + +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb + +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb + +à֮ܰ̕b +à֮ܰ̕b +à֮ܰ̕b +à֮ܰ̕b +à֮ܰ̕b + +a֮ܰ̀̕b +a֮ܰ̀̕b +a֮ܰ̀̕b +a֮ܰ̀̕b +a֮ܰ̀̕b + +a〪̖ܱ֚b +a〪̖ܱ֚b +a〪̖ܱ֚b +a〪̖ܱ֚b +a〪̖ܱ֚b + +a〪ܱ̖֚b +a〪ܱ̖֚b +a〪ܱ̖֚b +a〪ܱ̖֚b +a〪ܱ̖֚b + +à֮ܲ̕b +à֮ܲ̕b +à֮ܲ̕b +à֮ܲ̕b +à֮ܲ̕b + +a֮ܲ̀̕b +a֮ܲ̀̕b +a֮ܲ̀̕b +a֮ܲ̀̕b +a֮ܲ̀̕b + +à֮ܳ̕b +à֮ܳ̕b +à֮ܳ̕b +à֮ܳ̕b +à֮ܳ̕b + +a֮ܳ̀̕b +a֮ܳ̀̕b +a֮ܳ̀̕b +a֮ܳ̀̕b +a֮ܳ̀̕b + +a〪̖ܴ֚b +a〪̖ܴ֚b +a〪̖ܴ֚b +a〪̖ܴ֚b +a〪̖ܴ֚b + +a〪ܴ̖֚b +a〪ܴ̖֚b +a〪ܴ̖֚b +a〪ܴ̖֚b +a〪ܴ̖֚b + +à֮ܵ̕b +à֮ܵ̕b +à֮ܵ̕b +à֮ܵ̕b +à֮ܵ̕b + +a֮ܵ̀̕b +a֮ܵ̀̕b +a֮ܵ̀̕b +a֮ܵ̀̕b +a֮ܵ̀̕b + +à֮ܶ̕b +à֮ܶ̕b +à֮ܶ̕b +à֮ܶ̕b +à֮ܶ̕b + +a֮ܶ̀̕b +a֮ܶ̀̕b +a֮ܶ̀̕b +a֮ܶ̀̕b +a֮ܶ̀̕b + +a〪̖ܷ֚b +a〪̖ܷ֚b +a〪̖ܷ֚b +a〪̖ܷ֚b +a〪̖ܷ֚b + +a〪ܷ̖֚b +a〪ܷ̖֚b +a〪ܷ̖֚b +a〪ܷ̖֚b +a〪ܷ̖֚b + +a〪̖ܸ֚b +a〪̖ܸ֚b +a〪̖ܸ֚b +a〪̖ܸ֚b +a〪̖ܸ֚b + +a〪ܸ̖֚b +a〪ܸ̖֚b +a〪ܸ̖֚b +a〪ܸ̖֚b +a〪ܸ̖֚b + +a〪̖ܹ֚b +a〪̖ܹ֚b +a〪̖ܹ֚b +a〪̖ܹ֚b +a〪̖ܹ֚b + +a〪ܹ̖֚b +a〪ܹ̖֚b +a〪ܹ̖֚b +a〪ܹ̖֚b +a〪ܹ̖֚b + +à֮ܺ̕b +à֮ܺ̕b +à֮ܺ̕b +à֮ܺ̕b +à֮ܺ̕b + +a֮ܺ̀̕b +a֮ܺ̀̕b +a֮ܺ̀̕b +a֮ܺ̀̕b +a֮ܺ̀̕b + +a〪̖ܻ֚b +a〪̖ܻ֚b +a〪̖ܻ֚b +a〪̖ܻ֚b +a〪̖ܻ֚b + +a〪ܻ̖֚b +a〪ܻ̖֚b +a〪ܻ̖֚b +a〪ܻ̖֚b +a〪ܻ̖֚b + +a〪̖ܼ֚b +a〪̖ܼ֚b +a〪̖ܼ֚b +a〪̖ܼ֚b +a〪̖ܼ֚b + +a〪ܼ̖֚b +a〪ܼ̖֚b +a〪ܼ̖֚b +a〪ܼ̖֚b +a〪ܼ̖֚b + +à֮ܽ̕b +à֮ܽ̕b +à֮ܽ̕b +à֮ܽ̕b +à֮ܽ̕b + +a֮ܽ̀̕b +a֮ܽ̀̕b +a֮ܽ̀̕b +a֮ܽ̀̕b +a֮ܽ̀̕b + +a〪̖ܾ֚b +a〪̖ܾ֚b +a〪̖ܾ֚b +a〪̖ܾ֚b +a〪̖ܾ֚b + +a〪ܾ̖֚b +a〪ܾ̖֚b +a〪ܾ̖֚b +a〪ܾ̖֚b +a〪ܾ̖֚b + +à֮ܿ̕b +à֮ܿ̕b +à֮ܿ̕b +à֮ܿ̕b +à֮ܿ̕b + +a֮ܿ̀̕b +a֮ܿ̀̕b +a֮ܿ̀̕b +a֮ܿ̀̕b +a֮ܿ̀̕b + +à֮݀̕b +à֮݀̕b +à֮݀̕b +à֮݀̕b +à֮݀̕b + +a֮݀̀̕b +a֮݀̀̕b +a֮݀̀̕b +a֮݀̀̕b +a֮݀̀̕b + +à֮݁̕b +à֮݁̕b +à֮݁̕b +à֮݁̕b +à֮݁̕b + +a֮݁̀̕b +a֮݁̀̕b +a֮݁̀̕b +a֮݁̀̕b +a֮݁̀̕b + +a〪̖݂֚b +a〪̖݂֚b +a〪̖݂֚b +a〪̖݂֚b +a〪̖݂֚b + +a〪݂̖֚b +a〪݂̖֚b +a〪݂̖֚b +a〪݂̖֚b +a〪݂̖֚b + +à֮݃̕b +à֮݃̕b +à֮݃̕b +à֮݃̕b +à֮݃̕b + +a֮݃̀̕b +a֮݃̀̕b +a֮݃̀̕b +a֮݃̀̕b +a֮݃̀̕b + +a〪̖݄֚b +a〪̖݄֚b +a〪̖݄֚b +a〪̖݄֚b +a〪̖݄֚b + +a〪݄̖֚b +a〪݄̖֚b +a〪݄̖֚b +a〪݄̖֚b +a〪݄̖֚b + +à֮݅̕b +à֮݅̕b +à֮݅̕b +à֮݅̕b +à֮݅̕b + +a֮݅̀̕b +a֮݅̀̕b +a֮݅̀̕b +a֮݅̀̕b +a֮݅̀̕b + +a〪̖݆֚b +a〪̖݆֚b +a〪̖݆֚b +a〪̖݆֚b +a〪̖݆֚b + +a〪݆̖֚b +a〪݆̖֚b +a〪݆̖֚b +a〪݆̖֚b +a〪݆̖֚b + +à֮݇̕b +à֮݇̕b +à֮݇̕b +à֮݇̕b +à֮݇̕b + +a֮݇̀̕b +a֮݇̀̕b +a֮݇̀̕b +a֮݇̀̕b +a֮݇̀̕b + +a〪̖݈֚b +a〪̖݈֚b +a〪̖݈֚b +a〪̖݈֚b +a〪̖݈֚b + +a〪݈̖֚b +a〪݈̖֚b +a〪݈̖֚b +a〪݈̖֚b +a〪݈̖֚b + +à֮݉̕b +à֮݉̕b +à֮݉̕b +à֮݉̕b +à֮݉̕b + +a֮݉̀̕b +a֮݉̀̕b +a֮݉̀̕b +a֮݉̀̕b +a֮݉̀̕b + +à֮݊̕b +à֮݊̕b +à֮݊̕b +à֮݊̕b +à֮݊̕b + +a֮݊̀̕b +a֮݊̀̕b +a֮݊̀̕b +a֮݊̀̕b +a֮݊̀̕b + +à֮߫̕b +à֮߫̕b +à֮߫̕b +à֮߫̕b +à֮߫̕b + +a֮߫̀̕b +a֮߫̀̕b +a֮߫̀̕b +a֮߫̀̕b +a֮߫̀̕b + +à֮߬̕b +à֮߬̕b +à֮߬̕b +à֮߬̕b +à֮߬̕b + +a֮߬̀̕b +a֮߬̀̕b +a֮߬̀̕b +a֮߬̀̕b +a֮߬̀̕b + +à֮߭̕b +à֮߭̕b +à֮߭̕b +à֮߭̕b +à֮߭̕b + +a֮߭̀̕b +a֮߭̀̕b +a֮߭̀̕b +a֮߭̀̕b +a֮߭̀̕b + +à֮߮̕b +à֮߮̕b +à֮߮̕b +à֮߮̕b +à֮߮̕b + +a֮߮̀̕b +a֮߮̀̕b +a֮߮̀̕b +a֮߮̀̕b +a֮߮̀̕b + +à֮߯̕b +à֮߯̕b +à֮߯̕b +à֮߯̕b +à֮߯̕b + +a֮߯̀̕b +a֮߯̀̕b +a֮߯̀̕b +a֮߯̀̕b +a֮߯̀̕b + +à֮߰̕b +à֮߰̕b +à֮߰̕b +à֮߰̕b +à֮߰̕b + +a֮߰̀̕b +a֮߰̀̕b +a֮߰̀̕b +a֮߰̀̕b +a֮߰̀̕b + +à֮߱̕b +à֮߱̕b +à֮߱̕b +à֮߱̕b +à֮߱̕b + +a֮߱̀̕b +a֮߱̀̕b +a֮߱̀̕b +a֮߱̀̕b +a֮߱̀̕b + +a〪̖߲֚b +a〪̖߲֚b +a〪̖߲֚b +a〪̖߲֚b +a〪̖߲֚b + +a〪߲̖֚b +a〪߲̖֚b +a〪߲̖֚b +a〪߲̖֚b +a〪߲̖֚b + +à֮߳̕b +à֮߳̕b +à֮߳̕b +à֮߳̕b +à֮߳̕b + +a֮߳̀̕b +a֮߳̀̕b +a֮߳̀̕b +a֮߳̀̕b +a֮߳̀̕b + +à֮ࠖ̕b +à֮ࠖ̕b +à֮ࠖ̕b +à֮ࠖ̕b +à֮ࠖ̕b + +a֮ࠖ̀̕b +a֮ࠖ̀̕b +a֮ࠖ̀̕b +a֮ࠖ̀̕b +a֮ࠖ̀̕b + +à֮ࠗ̕b +à֮ࠗ̕b +à֮ࠗ̕b +à֮ࠗ̕b +à֮ࠗ̕b + +a֮ࠗ̀̕b +a֮ࠗ̀̕b +a֮ࠗ̀̕b +a֮ࠗ̀̕b +a֮ࠗ̀̕b + +à֮࠘̕b +à֮࠘̕b +à֮࠘̕b +à֮࠘̕b +à֮࠘̕b + +a֮࠘̀̕b +a֮࠘̀̕b +a֮࠘̀̕b +a֮࠘̀̕b +a֮࠘̀̕b + +à֮࠙̕b +à֮࠙̕b +à֮࠙̕b +à֮࠙̕b +à֮࠙̕b + +a֮࠙̀̕b +a֮࠙̀̕b +a֮࠙̀̕b +a֮࠙̀̕b +a֮࠙̀̕b + +à֮ࠛ̕b +à֮ࠛ̕b +à֮ࠛ̕b +à֮ࠛ̕b +à֮ࠛ̕b + +a֮ࠛ̀̕b +a֮ࠛ̀̕b +a֮ࠛ̀̕b +a֮ࠛ̀̕b +a֮ࠛ̀̕b + +à֮ࠜ̕b +à֮ࠜ̕b +à֮ࠜ̕b +à֮ࠜ̕b +à֮ࠜ̕b + +a֮ࠜ̀̕b +a֮ࠜ̀̕b +a֮ࠜ̀̕b +a֮ࠜ̀̕b +a֮ࠜ̀̕b + +à֮ࠝ̕b +à֮ࠝ̕b +à֮ࠝ̕b +à֮ࠝ̕b +à֮ࠝ̕b + +a֮ࠝ̀̕b +a֮ࠝ̀̕b +a֮ࠝ̀̕b +a֮ࠝ̀̕b +a֮ࠝ̀̕b + +à֮ࠞ̕b +à֮ࠞ̕b +à֮ࠞ̕b +à֮ࠞ̕b +à֮ࠞ̕b + +a֮ࠞ̀̕b +a֮ࠞ̀̕b +a֮ࠞ̀̕b +a֮ࠞ̀̕b +a֮ࠞ̀̕b + +à֮ࠟ̕b +à֮ࠟ̕b +à֮ࠟ̕b +à֮ࠟ̕b +à֮ࠟ̕b + +a֮ࠟ̀̕b +a֮ࠟ̀̕b +a֮ࠟ̀̕b +a֮ࠟ̀̕b +a֮ࠟ̀̕b + +à֮ࠠ̕b +à֮ࠠ̕b +à֮ࠠ̕b +à֮ࠠ̕b +à֮ࠠ̕b + +a֮ࠠ̀̕b +a֮ࠠ̀̕b +a֮ࠠ̀̕b +a֮ࠠ̀̕b +a֮ࠠ̀̕b + +à֮ࠡ̕b +à֮ࠡ̕b +à֮ࠡ̕b +à֮ࠡ̕b +à֮ࠡ̕b + +a֮ࠡ̀̕b +a֮ࠡ̀̕b +a֮ࠡ̀̕b +a֮ࠡ̀̕b +a֮ࠡ̀̕b + +à֮ࠢ̕b +à֮ࠢ̕b +à֮ࠢ̕b +à֮ࠢ̕b +à֮ࠢ̕b + +a֮ࠢ̀̕b +a֮ࠢ̀̕b +a֮ࠢ̀̕b +a֮ࠢ̀̕b +a֮ࠢ̀̕b + +à֮ࠣ̕b +à֮ࠣ̕b +à֮ࠣ̕b +à֮ࠣ̕b +à֮ࠣ̕b + +a֮ࠣ̀̕b +a֮ࠣ̀̕b +a֮ࠣ̀̕b +a֮ࠣ̀̕b +a֮ࠣ̀̕b + +à֮ࠥ̕b +à֮ࠥ̕b +à֮ࠥ̕b +à֮ࠥ̕b +à֮ࠥ̕b + +a֮ࠥ̀̕b +a֮ࠥ̀̕b +a֮ࠥ̀̕b +a֮ࠥ̀̕b +a֮ࠥ̀̕b + +à֮ࠦ̕b +à֮ࠦ̕b +à֮ࠦ̕b +à֮ࠦ̕b +à֮ࠦ̕b + +a֮ࠦ̀̕b +a֮ࠦ̀̕b +a֮ࠦ̀̕b +a֮ࠦ̀̕b +a֮ࠦ̀̕b + +à֮ࠧ̕b +à֮ࠧ̕b +à֮ࠧ̕b +à֮ࠧ̕b +à֮ࠧ̕b + +a֮ࠧ̀̕b +a֮ࠧ̀̕b +a֮ࠧ̀̕b +a֮ࠧ̀̕b +a֮ࠧ̀̕b + +à֮ࠩ̕b +à֮ࠩ̕b +à֮ࠩ̕b +à֮ࠩ̕b +à֮ࠩ̕b + +a֮ࠩ̀̕b +a֮ࠩ̀̕b +a֮ࠩ̀̕b +a֮ࠩ̀̕b +a֮ࠩ̀̕b + +à֮ࠪ̕b +à֮ࠪ̕b +à֮ࠪ̕b +à֮ࠪ̕b +à֮ࠪ̕b + +a֮ࠪ̀̕b +a֮ࠪ̀̕b +a֮ࠪ̀̕b +a֮ࠪ̀̕b +a֮ࠪ̀̕b + +à֮ࠫ̕b +à֮ࠫ̕b +à֮ࠫ̕b +à֮ࠫ̕b +à֮ࠫ̕b + +a֮ࠫ̀̕b +a֮ࠫ̀̕b +a֮ࠫ̀̕b +a֮ࠫ̀̕b +a֮ࠫ̀̕b + +à֮ࠬ̕b +à֮ࠬ̕b +à֮ࠬ̕b +à֮ࠬ̕b +à֮ࠬ̕b + +a֮ࠬ̀̕b +a֮ࠬ̀̕b +a֮ࠬ̀̕b +a֮ࠬ̀̕b +a֮ࠬ̀̕b + +à֮࠭̕b +à֮࠭̕b +à֮࠭̕b +à֮࠭̕b +à֮࠭̕b + +a֮࠭̀̕b +a֮࠭̀̕b +a֮࠭̀̕b +a֮࠭̀̕b +a֮࠭̀̕b + +a〪̖࡙֚b +a〪̖࡙֚b +a〪̖࡙֚b +a〪̖࡙֚b +a〪̖࡙֚b + +a〪࡙̖֚b +a〪࡙̖֚b +a〪࡙̖֚b +a〪࡙̖֚b +a〪࡙̖֚b + +a〪̖࡚֚b +a〪̖࡚֚b +a〪̖࡚֚b +a〪̖࡚֚b +a〪̖࡚֚b + +a〪࡚̖֚b +a〪࡚̖֚b +a〪࡚̖֚b +a〪࡚̖֚b +a〪࡚̖֚b + +a〪̖࡛֚b +a〪̖࡛֚b +a〪̖࡛֚b +a〪̖࡛֚b +a〪̖࡛֚b + +a〪࡛̖֚b +a〪࡛̖֚b +a〪࡛̖֚b +a〪࡛̖֚b +a〪࡛̖֚b + +a̴़़゙b +a̴़़゙b +a̴़़゙b +a̴़़゙b +a̴़़゙b + +a̴़़゙b +a̴़़゙b +a̴़़゙b +a̴़़゙b +a̴़़゙b + +a゙््ְb +a゙््ְb +a゙््ְb +a゙््ְb +a゙््ְb + +a゙््ְb +a゙््ְb +a゙््ְb +a゙््ְb +a゙््ְb + +à֮॑̕b +à֮॑̕b +à֮॑̕b +à֮॑̕b +à֮॑̕b + +a֮॑̀̕b +a֮॑̀̕b +a֮॑̀̕b +a֮॑̀̕b +a֮॑̀̕b + +a〪̖॒֚b +a〪̖॒֚b +a〪̖॒֚b +a〪̖॒֚b +a〪̖॒֚b + +a〪॒̖֚b +a〪॒̖֚b +a〪॒̖֚b +a〪॒̖֚b +a〪॒̖֚b + +à֮॓̕b +à֮॓̕b +à֮॓̕b +à֮॓̕b +à֮॓̕b + +a֮॓̀̕b +a֮॓̀̕b +a֮॓̀̕b +a֮॓̀̕b +a֮॓̀̕b + +à֮॔̕b +à֮॔̕b +à֮॔̕b +à֮॔̕b +à֮॔̕b + +a֮॔̀̕b +a֮॔̀̕b +a֮॔̀̕b +a֮॔̀̕b +a֮॔̀̕b + +a̴़়゙b +a̴़়゙b +a̴़়゙b +a̴़়゙b +a̴़়゙b + +a̴়़゙b +a̴়़゙b +a̴়़゙b +a̴়़゙b +a̴়़゙b + +a゙्্ְb +a゙्্ְb +a゙्্ְb +a゙्্ְb +a゙्্ְb + +a゙্्ְb +a゙্्ְb +a゙্्ְb +a゙্्ְb +a゙্्ְb + +a̴़਼゙b +a̴़਼゙b +a̴़਼゙b +a̴़਼゙b +a̴़਼゙b + +a̴਼़゙b +a̴਼़゙b +a̴਼़゙b +a̴਼़゙b +a̴਼़゙b + +a゙्੍ְb +a゙्੍ְb +a゙्੍ְb +a゙्੍ְb +a゙्੍ְb + +a゙੍्ְb +a゙੍्ְb +a゙੍्ְb +a゙੍्ְb +a゙੍्ְb + +a̴़઼゙b +a̴़઼゙b +a̴़઼゙b +a̴़઼゙b +a̴़઼゙b + +a̴઼़゙b +a̴઼़゙b +a̴઼़゙b +a̴઼़゙b +a̴઼़゙b + +a゙्્ְb +a゙्્ְb +a゙्્ְb +a゙्્ְb +a゙्્ְb + +a゙્्ְb +a゙્्ְb +a゙્्ְb +a゙્्ְb +a゙્्ְb + +a̴़଼゙b +a̴़଼゙b +a̴़଼゙b +a̴़଼゙b +a̴़଼゙b + +a̴଼़゙b +a̴଼़゙b +a̴଼़゙b +a̴଼़゙b +a̴଼़゙b + +a゙्୍ְb +a゙्୍ְb +a゙्୍ְb +a゙्୍ְb +a゙्୍ְb + +a゙୍्ְb +a゙୍्ְb +a゙୍्ְb +a゙୍्ְb +a゙୍्ְb + +a゙्்ְb +a゙्்ְb +a゙्்ְb +a゙्்ְb +a゙्்ְb + +a゙்्ְb +a゙்्ְb +a゙்्ְb +a゙்्ְb +a゙்्ְb + +a゙्్ְb +a゙्్ְb +a゙्్ְb +a゙्్ְb +a゙्్ְb + +a゙్्ְb +a゙్्ְb +a゙్्ְb +a゙్्ְb +a゙్्ְb + +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb + +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb + +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb + +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb + +a̴़಼゙b +a̴़಼゙b +a̴़಼゙b +a̴़಼゙b +a̴़಼゙b + +a̴಼़゙b +a̴಼़゙b +a̴಼़゙b +a̴಼़゙b +a̴಼़゙b + +a゙्್ְb +a゙्್ְb +a゙्್ְb +a゙्್ְb +a゙्್ְb + +a゙್्ְb +a゙್्ְb +a゙್्ְb +a゙್्ְb +a゙್्ְb + +a゙्്ְb +a゙्്ְb +a゙्്ְb +a゙्്ְb +a゙्്ְb + +a゙്्ְb +a゙്्ְb +a゙്्ְb +a゙്्ְb +a゙്्ְb + +a゙्්ְb +a゙्්ְb +a゙्්ְb +a゙्්ְb +a゙्්ְb + +a゙්्ְb +a゙්्ְb +a゙්्ְb +a゙්्ְb +a゙්्ְb + +aౖุุ่b +aౖุุ่b +aౖุุ่b +aౖุุ่b +aౖุุ่b + +aౖุุ่b +aౖุุ่b +aౖุุ่b +aౖุุ่b +aౖุุ่b + +aౖุู่b +aౖุู่b +aౖุู่b +aౖุู่b +aౖุู่b + +aౖูุ่b +aౖูุ่b +aౖูุ่b +aౖูุ่b +aౖูุ่b + +a゙्ฺְb +a゙्ฺְb +a゙्ฺְb +a゙्ฺְb +a゙्ฺְb + +a゙ฺ्ְb +a゙ฺ्ְb +a゙ฺ्ְb +a゙ฺ्ְb +a゙ฺ्ְb + +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb + +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb + +aุ่้ຸb +aุ่้ຸb +aุ่้ຸb +aุ่้ຸb +aุ่้ຸb + +aุ้่ຸb +aุ้่ຸb +aุ้่ຸb +aุ้่ຸb +aุ้่ຸb + +aุ่๊ຸb +aุ่๊ຸb +aุ่๊ຸb +aุ่๊ຸb +aุ่๊ຸb + +aุ๊่ຸb +aุ๊่ຸb +aุ๊่ຸb +aุ๊่ຸb +aุ๊่ຸb + +aุ่๋ຸb +aุ่๋ຸb +aุ่๋ຸb +aุ่๋ຸb +aุ่๋ຸb + +aุ๋่ຸb +aุ๋่ຸb +aุ๋่ຸb +aุ๋่ຸb +aุ๋่ຸb + +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b + +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b + +a่ຸູ່b +a่ຸູ່b +a่ຸູ່b +a่ຸູ່b +a่ຸູ່b + +a่ູຸ່b +a่ູຸ່b +a่ູຸ່b +a่ູຸ່b +a่ູຸ່b + +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb + +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb + +aຸ່້ཱb +aຸ່້ཱb +aຸ່້ཱb +aຸ່້ཱb +aຸ່້ཱb + +aຸ້່ཱb +aຸ້່ཱb +aຸ້່ཱb +aຸ້່ཱb +aຸ້່ཱb + +aຸ່໊ཱb +aຸ່໊ཱb +aຸ່໊ཱb +aຸ່໊ཱb +aຸ່໊ཱb + +aຸ໊່ཱb +aຸ໊່ཱb +aຸ໊່ཱb +aຸ໊່ཱb +aຸ໊່ཱb + +aຸ່໋ཱb +aຸ່໋ཱb +aຸ່໋ཱb +aຸ່໋ཱb +aຸ່໋ཱb + +aຸ໋່ཱb +aຸ໋່ཱb +aຸ໋່ཱb +aຸ໋່ཱb +aຸ໋່ཱb + +a〪̖༘֚b +a〪̖༘֚b +a〪̖༘֚b +a〪̖༘֚b +a〪̖༘֚b + +a〪༘̖֚b +a〪༘̖֚b +a〪༘̖֚b +a〪༘̖֚b +a〪༘̖֚b + +a〪̖༙֚b +a〪̖༙֚b +a〪̖༙֚b +a〪̖༙֚b +a〪̖༙֚b + +a〪༙̖֚b +a〪༙̖֚b +a〪༙̖֚b +a〪༙̖֚b +a〪༙̖֚b + +a〪̖༵֚b +a〪̖༵֚b +a〪̖༵֚b +a〪̖༵֚b +a〪̖༵֚b + +a〪༵̖֚b +a〪༵̖֚b +a〪༵̖֚b +a〪༵̖֚b +a〪༵̖֚b + +a〪̖༷֚b +a〪̖༷֚b +a〪̖༷֚b +a〪̖༷֚b +a〪̖༷֚b + +a〪༷̖֚b +a〪༷̖֚b +a〪༷̖֚b +a〪༷̖֚b +a〪༷̖֚b + +a᷎̛༹〪b +a᷎̛༹〪b +a᷎̛༹〪b +a᷎̛༹〪b +a᷎̛༹〪b + +a᷎༹̛〪b +a᷎༹̛〪b +a᷎༹̛〪b +a᷎༹̛〪b +a᷎༹̛〪b + +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb + +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb + +aཱིིུb +aཱིིུb +aཱིིུb +aཱིིུb +aཱིིུb + +aཱིིུb +aཱིིུb +aཱིིུb +aཱིིུb +aཱིིུb + +aིུུ̡b +aིུུ̡b +aིུུ̡b +aིུུ̡b +aིུུ̡b + +aིུུ̡b +aིུུ̡b +aིུུ̡b +aིུུ̡b +aིུུ̡b + +aཱིེུb +aཱིེུb +aཱིེུb +aཱིེུb +aཱིེུb + +aཱེིུb +aཱེིུb +aཱེིུb +aཱེིུb +aཱེིུb + +aཱིཻུb +aཱིཻུb +aཱིཻུb +aཱིཻུb +aཱིཻུb + +aཱཻིུb +aཱཻིུb +aཱཻིུb +aཱཻིུb +aཱཻིུb + +aཱིོུb +aཱིོུb +aཱིོུb +aཱིོུb +aཱིོུb + +aཱོིུb +aཱོིུb +aཱོིུb +aཱོིུb +aཱོིུb + +aཱིཽུb +aཱིཽུb +aཱིཽུb +aཱིཽུb +aཱིཽུb + +aཱཽིུb +aཱཽིུb +aཱཽིུb +aཱཽིུb +aཱཽིུb + +aཱིྀུb +aཱིྀུb +aཱིྀུb +aཱིྀུb +aཱིྀུb + +aཱྀིུb +aཱྀིུb +aཱྀིུb +aཱྀིུb +aཱྀིུb + +à֮ྂ̕b +à֮ྂ̕b +à֮ྂ̕b +à֮ྂ̕b +à֮ྂ̕b + +a֮ྂ̀̕b +a֮ྂ̀̕b +a֮ྂ̀̕b +a֮ྂ̀̕b +a֮ྂ̀̕b + +à֮ྃ̕b +à֮ྃ̕b +à֮ྃ̕b +à֮ྃ̕b +à֮ྃ̕b + +a֮ྃ̀̕b +a֮ྃ̀̕b +a֮ྃ̀̕b +a֮ྃ̀̕b +a֮ྃ̀̕b + +a゙्྄ְb +a゙्྄ְb +a゙्྄ְb +a゙्྄ְb +a゙्྄ְb + +a゙྄्ְb +a゙྄्ְb +a゙྄्ְb +a゙྄्ְb +a゙྄्ְb + +à֮྆̕b +à֮྆̕b +à֮྆̕b +à֮྆̕b +à֮྆̕b + +a֮྆̀̕b +a֮྆̀̕b +a֮྆̀̕b +a֮྆̀̕b +a֮྆̀̕b + +à֮྇̕b +à֮྇̕b +à֮྇̕b +à֮྇̕b +à֮྇̕b + +a֮྇̀̕b +a֮྇̀̕b +a֮྇̀̕b +a֮྇̀̕b +a֮྇̀̕b + +a〪̖࿆֚b +a〪̖࿆֚b +a〪̖࿆֚b +a〪̖࿆֚b +a〪̖࿆֚b + +a〪࿆̖֚b +a〪࿆̖֚b +a〪࿆̖֚b +a〪࿆̖֚b +a〪࿆̖֚b + +a̴़့゙b +a̴़့゙b +a̴़့゙b +a̴़့゙b +a̴़့゙b + +a̴့़゙b +a̴့़゙b +a̴့़゙b +a̴့़゙b +a̴့़゙b + +a゙्္ְb +a゙्္ְb +a゙्္ְb +a゙्္ְb +a゙्္ְb + +a゙္्ְb +a゙္्ְb +a゙္्ְb +a゙္्ְb +a゙္्ְb + +a゙्်ְb +a゙्်ְb +a゙्်ְb +a゙्်ְb +a゙्်ְb + +a゙်्ְb +a゙်्ְb +a゙်्ְb +a゙်्ְb +a゙်्ְb + +a〪̖ႍ֚b +a〪̖ႍ֚b +a〪̖ႍ֚b +a〪̖ႍ֚b +a〪̖ႍ֚b + +a〪ႍ̖֚b +a〪ႍ̖֚b +a〪ႍ̖֚b +a〪ႍ̖֚b +a〪ႍ̖֚b + +à֮፝̕b +à֮፝̕b +à֮፝̕b +à֮፝̕b +à֮፝̕b + +a֮፝̀̕b +a֮፝̀̕b +a֮፝̀̕b +a֮፝̀̕b +a֮፝̀̕b + +à֮፞̕b +à֮፞̕b +à֮፞̕b +à֮፞̕b +à֮፞̕b + +a֮፞̀̕b +a֮፞̀̕b +a֮፞̀̕b +a֮፞̀̕b +a֮፞̀̕b + +à֮፟̕b +à֮፟̕b +à֮፟̕b +à֮፟̕b +à֮፟̕b + +a֮፟̀̕b +a֮፟̀̕b +a֮፟̀̕b +a֮፟̀̕b +a֮፟̀̕b + +a゙्᜔ְb +a゙्᜔ְb +a゙्᜔ְb +a゙्᜔ְb +a゙्᜔ְb + +a゙᜔्ְb +a゙᜔्ְb +a゙᜔्ְb +a゙᜔्ְb +a゙᜔्ְb + +a゙्᜴ְb +a゙्᜴ְb +a゙्᜴ְb +a゙्᜴ְb +a゙्᜴ְb + +a゙᜴्ְb +a゙᜴्ְb +a゙᜴्ְb +a゙᜴्ְb +a゙᜴्ְb + +a゙्្ְb +a゙्្ְb +a゙्្ְb +a゙्្ְb +a゙्្ְb + +a゙្्ְb +a゙្्ְb +a゙្्ְb +a゙្्ְb +a゙្्ְb + +à֮៝̕b +à֮៝̕b +à֮៝̕b +à֮៝̕b +à֮៝̕b + +a֮៝̀̕b +a֮៝̀̕b +a֮៝̀̕b +a֮៝̀̕b +a֮៝̀̕b + +à𝅭֮ᢩb +à𝅭֮ᢩb +à𝅭֮ᢩb +à𝅭֮ᢩb +à𝅭֮ᢩb + +à𝅭ᢩ֮b +à𝅭ᢩ֮b +à𝅭ᢩ֮b +à𝅭ᢩ֮b +à𝅭ᢩ֮b + +a̖֚᤹〮b +a̖֚᤹〮b +a̖֚᤹〮b +a̖֚᤹〮b +a̖֚᤹〮b + +a̖᤹֚〮b +a̖᤹֚〮b +a̖᤹֚〮b +a̖᤹֚〮b +a̖᤹֚〮b + +à֮᤺̕b +à֮᤺̕b +à֮᤺̕b +à֮᤺̕b +à֮᤺̕b + +a֮᤺̀̕b +a֮᤺̀̕b +a֮᤺̀̕b +a֮᤺̀̕b +a֮᤺̀̕b + +a〪̖᤻֚b +a〪̖᤻֚b +a〪̖᤻֚b +a〪̖᤻֚b +a〪̖᤻֚b + +a〪᤻̖֚b +a〪᤻̖֚b +a〪᤻̖֚b +a〪᤻̖֚b +a〪᤻̖֚b + +à֮ᨗ̕b +à֮ᨗ̕b +à֮ᨗ̕b +à֮ᨗ̕b +à֮ᨗ̕b + +a֮ᨗ̀̕b +a֮ᨗ̀̕b +a֮ᨗ̀̕b +a֮ᨗ̀̕b +a֮ᨗ̀̕b + +a〪̖ᨘ֚b +a〪̖ᨘ֚b +a〪̖ᨘ֚b +a〪̖ᨘ֚b +a〪̖ᨘ֚b + +a〪ᨘ̖֚b +a〪ᨘ̖֚b +a〪ᨘ̖֚b +a〪ᨘ̖֚b +a〪ᨘ̖֚b + +a゙्᩠ְb +a゙्᩠ְb +a゙्᩠ְb +a゙्᩠ְb +a゙्᩠ְb + +a゙᩠्ְb +a゙᩠्ְb +a゙᩠्ְb +a゙᩠्ְb +a゙᩠्ְb + +à֮᩵̕b +à֮᩵̕b +à֮᩵̕b +à֮᩵̕b +à֮᩵̕b + +a֮᩵̀̕b +a֮᩵̀̕b +a֮᩵̀̕b +a֮᩵̀̕b +a֮᩵̀̕b + +à֮᩶̕b +à֮᩶̕b +à֮᩶̕b +à֮᩶̕b +à֮᩶̕b + +a֮᩶̀̕b +a֮᩶̀̕b +a֮᩶̀̕b +a֮᩶̀̕b +a֮᩶̀̕b + +à֮᩷̕b +à֮᩷̕b +à֮᩷̕b +à֮᩷̕b +à֮᩷̕b + +a֮᩷̀̕b +a֮᩷̀̕b +a֮᩷̀̕b +a֮᩷̀̕b +a֮᩷̀̕b + +à֮᩸̕b +à֮᩸̕b +à֮᩸̕b +à֮᩸̕b +à֮᩸̕b + +a֮᩸̀̕b +a֮᩸̀̕b +a֮᩸̀̕b +a֮᩸̀̕b +a֮᩸̀̕b + +à֮᩹̕b +à֮᩹̕b +à֮᩹̕b +à֮᩹̕b +à֮᩹̕b + +a֮᩹̀̕b +a֮᩹̀̕b +a֮᩹̀̕b +a֮᩹̀̕b +a֮᩹̀̕b + +à֮᩺̕b +à֮᩺̕b +à֮᩺̕b +à֮᩺̕b +à֮᩺̕b + +a֮᩺̀̕b +a֮᩺̀̕b +a֮᩺̀̕b +a֮᩺̀̕b +a֮᩺̀̕b + +à֮᩻̕b +à֮᩻̕b +à֮᩻̕b +à֮᩻̕b +à֮᩻̕b + +a֮᩻̀̕b +a֮᩻̀̕b +a֮᩻̀̕b +a֮᩻̀̕b +a֮᩻̀̕b + +à֮᩼̕b +à֮᩼̕b +à֮᩼̕b +à֮᩼̕b +à֮᩼̕b + +a֮᩼̀̕b +a֮᩼̀̕b +a֮᩼̀̕b +a֮᩼̀̕b +a֮᩼̀̕b + +a〪̖᩿֚b +a〪̖᩿֚b +a〪̖᩿֚b +a〪̖᩿֚b +a〪̖᩿֚b + +a〪᩿̖֚b +a〪᩿̖֚b +a〪᩿̖֚b +a〪᩿̖֚b +a〪᩿̖֚b + +a̴़᬴゙b +a̴़᬴゙b +a̴़᬴゙b +a̴़᬴゙b +a̴़᬴゙b + +a̴᬴़゙b +a̴᬴़゙b +a̴᬴़゙b +a̴᬴़゙b +a̴᬴़゙b + +a゙्᭄ְb +a゙्᭄ְb +a゙्᭄ְb +a゙्᭄ְb +a゙्᭄ְb + +a゙᭄्ְb +a゙᭄्ְb +a゙᭄्ְb +a゙᭄्ְb +a゙᭄्ְb + +à֮᭫̕b +à֮᭫̕b +à֮᭫̕b +à֮᭫̕b +à֮᭫̕b + +a֮᭫̀̕b +a֮᭫̀̕b +a֮᭫̀̕b +a֮᭫̀̕b +a֮᭫̀̕b + +a〪̖᭬֚b +a〪̖᭬֚b +a〪̖᭬֚b +a〪̖᭬֚b +a〪̖᭬֚b + +a〪᭬̖֚b +a〪᭬̖֚b +a〪᭬̖֚b +a〪᭬̖֚b +a〪᭬̖֚b + +à֮᭭̕b +à֮᭭̕b +à֮᭭̕b +à֮᭭̕b +à֮᭭̕b + +a֮᭭̀̕b +a֮᭭̀̕b +a֮᭭̀̕b +a֮᭭̀̕b +a֮᭭̀̕b + +à֮᭮̕b +à֮᭮̕b +à֮᭮̕b +à֮᭮̕b +à֮᭮̕b + +a֮᭮̀̕b +a֮᭮̀̕b +a֮᭮̀̕b +a֮᭮̀̕b +a֮᭮̀̕b + +à֮᭯̕b +à֮᭯̕b +à֮᭯̕b +à֮᭯̕b +à֮᭯̕b + +a֮᭯̀̕b +a֮᭯̀̕b +a֮᭯̀̕b +a֮᭯̀̕b +a֮᭯̀̕b + +à֮᭰̕b +à֮᭰̕b +à֮᭰̕b +à֮᭰̕b +à֮᭰̕b + +a֮᭰̀̕b +a֮᭰̀̕b +a֮᭰̀̕b +a֮᭰̀̕b +a֮᭰̀̕b + +à֮᭱̕b +à֮᭱̕b +à֮᭱̕b +à֮᭱̕b +à֮᭱̕b + +a֮᭱̀̕b +a֮᭱̀̕b +a֮᭱̀̕b +a֮᭱̀̕b +a֮᭱̀̕b + +à֮᭲̕b +à֮᭲̕b +à֮᭲̕b +à֮᭲̕b +à֮᭲̕b + +a֮᭲̀̕b +a֮᭲̀̕b +a֮᭲̀̕b +a֮᭲̀̕b +a֮᭲̀̕b + +à֮᭳̕b +à֮᭳̕b +à֮᭳̕b +à֮᭳̕b +à֮᭳̕b + +a֮᭳̀̕b +a֮᭳̀̕b +a֮᭳̀̕b +a֮᭳̀̕b +a֮᭳̀̕b + +a゙्᮪ְb +a゙्᮪ְb +a゙्᮪ְb +a゙्᮪ְb +a゙्᮪ְb + +a゙᮪्ְb +a゙᮪्ְb +a゙᮪्ְb +a゙᮪्ְb +a゙᮪्ְb + +a̴़᯦゙b +a̴़᯦゙b +a̴़᯦゙b +a̴़᯦゙b +a̴़᯦゙b + +a̴᯦़゙b +a̴᯦़゙b +a̴᯦़゙b +a̴᯦़゙b +a̴᯦़゙b + +a゙्᯲ְb +a゙्᯲ְb +a゙्᯲ְb +a゙्᯲ְb +a゙्᯲ְb + +a゙᯲्ְb +a゙᯲्ְb +a゙᯲्ְb +a゙᯲्ְb +a゙᯲्ְb + +a゙्᯳ְb +a゙्᯳ְb +a゙्᯳ְb +a゙्᯳ְb +a゙्᯳ְb + +a゙᯳्ְb +a゙᯳्ְb +a゙᯳्ְb +a゙᯳्ְb +a゙᯳्ְb + +a̴़᰷゙b +a̴़᰷゙b +a̴़᰷゙b +a̴़᰷゙b +a̴़᰷゙b + +a̴᰷़゙b +a̴᰷़゙b +a̴᰷़゙b +a̴᰷़゙b +a̴᰷़゙b + +à֮᳐̕b +à֮᳐̕b +à֮᳐̕b +à֮᳐̕b +à֮᳐̕b + +a֮᳐̀̕b +a֮᳐̀̕b +a֮᳐̀̕b +a֮᳐̀̕b +a֮᳐̀̕b + +à֮᳑̕b +à֮᳑̕b +à֮᳑̕b +à֮᳑̕b +à֮᳑̕b + +a֮᳑̀̕b +a֮᳑̀̕b +a֮᳑̀̕b +a֮᳑̀̕b +a֮᳑̀̕b + +à֮᳒̕b +à֮᳒̕b +à֮᳒̕b +à֮᳒̕b +à֮᳒̕b + +a֮᳒̀̕b +a֮᳒̀̕b +a֮᳒̀̕b +a֮᳒̀̕b +a֮᳒̀̕b + +a̴᳔़b +a̴᳔़b +a̴᳔़b +a̴᳔़b +a̴᳔़b + +a᳔̴़b +a᳔̴़b +a᳔̴़b +a᳔̴़b +a᳔̴़b + +a〪̖᳕֚b +a〪̖᳕֚b +a〪̖᳕֚b +a〪̖᳕֚b +a〪̖᳕֚b + +a〪᳕̖֚b +a〪᳕̖֚b +a〪᳕̖֚b +a〪᳕̖֚b +a〪᳕̖֚b + +a〪̖᳖֚b +a〪̖᳖֚b +a〪̖᳖֚b +a〪̖᳖֚b +a〪̖᳖֚b + +a〪᳖̖֚b +a〪᳖̖֚b +a〪᳖̖֚b +a〪᳖̖֚b +a〪᳖̖֚b + +a〪̖᳗֚b +a〪̖᳗֚b +a〪̖᳗֚b +a〪̖᳗֚b +a〪̖᳗֚b + +a〪᳗̖֚b +a〪᳗̖֚b +a〪᳗̖֚b +a〪᳗̖֚b +a〪᳗̖֚b + +a〪̖᳘֚b +a〪̖᳘֚b +a〪̖᳘֚b +a〪̖᳘֚b +a〪̖᳘֚b + +a〪᳘̖֚b +a〪᳘̖֚b +a〪᳘̖֚b +a〪᳘̖֚b +a〪᳘̖֚b + +a〪̖᳙֚b +a〪̖᳙֚b +a〪̖᳙֚b +a〪̖᳙֚b +a〪̖᳙֚b + +a〪᳙̖֚b +a〪᳙̖֚b +a〪᳙̖֚b +a〪᳙̖֚b +a〪᳙̖֚b + +à֮᳚̕b +à֮᳚̕b +à֮᳚̕b +à֮᳚̕b +à֮᳚̕b + +a֮᳚̀̕b +a֮᳚̀̕b +a֮᳚̀̕b +a֮᳚̀̕b +a֮᳚̀̕b + +à֮᳛̕b +à֮᳛̕b +à֮᳛̕b +à֮᳛̕b +à֮᳛̕b + +a֮᳛̀̕b +a֮᳛̀̕b +a֮᳛̀̕b +a֮᳛̀̕b +a֮᳛̀̕b + +a〪̖᳜֚b +a〪̖᳜֚b +a〪̖᳜֚b +a〪̖᳜֚b +a〪̖᳜֚b + +a〪᳜̖֚b +a〪᳜̖֚b +a〪᳜̖֚b +a〪᳜̖֚b +a〪᳜̖֚b + +a〪̖᳝֚b +a〪̖᳝֚b +a〪̖᳝֚b +a〪̖᳝֚b +a〪̖᳝֚b + +a〪᳝̖֚b +a〪᳝̖֚b +a〪᳝̖֚b +a〪᳝̖֚b +a〪᳝̖֚b + +a〪̖᳞֚b +a〪̖᳞֚b +a〪̖᳞֚b +a〪̖᳞֚b +a〪̖᳞֚b + +a〪᳞̖֚b +a〪᳞̖֚b +a〪᳞̖֚b +a〪᳞̖֚b +a〪᳞̖֚b + +a〪̖᳟֚b +a〪̖᳟֚b +a〪̖᳟֚b +a〪̖᳟֚b +a〪̖᳟֚b + +a〪᳟̖֚b +a〪᳟̖֚b +a〪᳟̖֚b +a〪᳟̖֚b +a〪᳟̖֚b + +à֮᳠̕b +à֮᳠̕b +à֮᳠̕b +à֮᳠̕b +à֮᳠̕b + +a֮᳠̀̕b +a֮᳠̀̕b +a֮᳠̀̕b +a֮᳠̀̕b +a֮᳠̀̕b + +a̴᳢़b +a̴᳢़b +a̴᳢़b +a̴᳢़b +a̴᳢़b + +a᳢̴़b +a᳢̴़b +a᳢̴़b +a᳢̴़b +a᳢̴़b + +a̴᳣़b +a̴᳣़b +a̴᳣़b +a̴᳣़b +a̴᳣़b + +a᳣̴़b +a᳣̴़b +a᳣̴़b +a᳣̴़b +a᳣̴़b + +a̴᳤़b +a̴᳤़b +a̴᳤़b +a̴᳤़b +a̴᳤़b + +a᳤̴़b +a᳤̴़b +a᳤̴़b +a᳤̴़b +a᳤̴़b + +a̴᳥़b +a̴᳥़b +a̴᳥़b +a̴᳥़b +a̴᳥़b + +a᳥̴़b +a᳥̴़b +a᳥̴़b +a᳥̴़b +a᳥̴़b + +a̴᳦़b +a̴᳦़b +a̴᳦़b +a̴᳦़b +a̴᳦़b + +a᳦̴़b +a᳦̴़b +a᳦̴़b +a᳦̴़b +a᳦̴़b + +a̴᳧़b +a̴᳧़b +a̴᳧़b +a̴᳧़b +a̴᳧़b + +a᳧̴़b +a᳧̴़b +a᳧̴़b +a᳧̴़b +a᳧̴़b + +a̴᳨़b +a̴᳨़b +a̴᳨़b +a̴᳨़b +a̴᳨़b + +a᳨̴़b +a᳨̴़b +a᳨̴़b +a᳨̴़b +a᳨̴़b + +a〪̖᳭֚b +a〪̖᳭֚b +a〪̖᳭֚b +a〪̖᳭֚b +a〪̖᳭֚b + +a〪᳭̖֚b +a〪᳭̖֚b +a〪᳭̖֚b +a〪᳭̖֚b +a〪᳭̖֚b + +à֮᷀̕b +à֮᷀̕b +à֮᷀̕b +à֮᷀̕b +à֮᷀̕b + +a֮᷀̀̕b +a֮᷀̀̕b +a֮᷀̀̕b +a֮᷀̀̕b +a֮᷀̀̕b + +à֮᷁̕b +à֮᷁̕b +à֮᷁̕b +à֮᷁̕b +à֮᷁̕b + +a֮᷁̀̕b +a֮᷁̀̕b +a֮᷁̀̕b +a֮᷁̀̕b +a֮᷁̀̕b + +a〪̖᷂֚b +a〪̖᷂֚b +a〪̖᷂֚b +a〪̖᷂֚b +a〪̖᷂֚b + +a〪᷂̖֚b +a〪᷂̖֚b +a〪᷂̖֚b +a〪᷂̖֚b +a〪᷂̖֚b + +à֮᷃̕b +à֮᷃̕b +à֮᷃̕b +à֮᷃̕b +à֮᷃̕b + +a֮᷃̀̕b +a֮᷃̀̕b +a֮᷃̀̕b +a֮᷃̀̕b +a֮᷃̀̕b + +à֮᷄̕b +à֮᷄̕b +à֮᷄̕b +à֮᷄̕b +à֮᷄̕b + +a֮᷄̀̕b +a֮᷄̀̕b +a֮᷄̀̕b +a֮᷄̀̕b +a֮᷄̀̕b + +à֮᷅̕b +à֮᷅̕b +à֮᷅̕b +à֮᷅̕b +à֮᷅̕b + +a֮᷅̀̕b +a֮᷅̀̕b +a֮᷅̀̕b +a֮᷅̀̕b +a֮᷅̀̕b + +à֮᷆̕b +à֮᷆̕b +à֮᷆̕b +à֮᷆̕b +à֮᷆̕b + +a֮᷆̀̕b +a֮᷆̀̕b +a֮᷆̀̕b +a֮᷆̀̕b +a֮᷆̀̕b + +à֮᷇̕b +à֮᷇̕b +à֮᷇̕b +à֮᷇̕b +à֮᷇̕b + +a֮᷇̀̕b +a֮᷇̀̕b +a֮᷇̀̕b +a֮᷇̀̕b +a֮᷇̀̕b + +à֮᷈̕b +à֮᷈̕b +à֮᷈̕b +à֮᷈̕b +à֮᷈̕b + +a֮᷈̀̕b +a֮᷈̀̕b +a֮᷈̀̕b +a֮᷈̀̕b +a֮᷈̀̕b + +à֮᷉̕b +à֮᷉̕b +à֮᷉̕b +à֮᷉̕b +à֮᷉̕b + +a֮᷉̀̕b +a֮᷉̀̕b +a֮᷉̀̕b +a֮᷉̀̕b +a֮᷉̀̕b + +a〪̖᷊֚b +a〪̖᷊֚b +a〪̖᷊֚b +a〪̖᷊֚b +a〪̖᷊֚b + +a〪᷊̖֚b +a〪᷊̖֚b +a〪᷊̖֚b +a〪᷊̖֚b +a〪᷊̖֚b + +à֮᷋̕b +à֮᷋̕b +à֮᷋̕b +à֮᷋̕b +à֮᷋̕b + +a֮᷋̀̕b +a֮᷋̀̕b +a֮᷋̀̕b +a֮᷋̀̕b +a֮᷋̀̕b + +à֮᷌̕b +à֮᷌̕b +à֮᷌̕b +à֮᷌̕b +à֮᷌̕b + +a֮᷌̀̕b +a֮᷌̀̕b +a֮᷌̀̕b +a֮᷌̀̕b +a֮᷌̀̕b + +a͜͝᷍ͅb +a͜͝᷍ͅb +a͜͝᷍ͅb +a͜͝᷍ͅb +a͜͝᷍ͅb + +a͜᷍͝ͅb +a͜᷍͝ͅb +a͜᷍͝ͅb +a͜᷍͝ͅb +a͜᷍͝ͅb + +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b + +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b + +a〪̖᷏֚b +a〪̖᷏֚b +a〪̖᷏֚b +a〪̖᷏֚b +a〪̖᷏֚b + +a〪᷏̖֚b +a〪᷏̖֚b +a〪᷏̖֚b +a〪᷏̖֚b +a〪᷏̖֚b + +aུ̡᷐᷎b +aུ̡᷐᷎b +aུ̡᷐᷎b +aུ̡᷐᷎b +aུ̡᷐᷎b + +aུ᷐̡᷎b +aུ᷐̡᷎b +aུ᷐̡᷎b +aུ᷐̡᷎b +aུ᷐̡᷎b + +à֮᷑̕b +à֮᷑̕b +à֮᷑̕b +à֮᷑̕b +à֮᷑̕b + +a֮᷑̀̕b +a֮᷑̀̕b +a֮᷑̀̕b +a֮᷑̀̕b +a֮᷑̀̕b + +à֮᷒̕b +à֮᷒̕b +à֮᷒̕b +à֮᷒̕b +à֮᷒̕b + +a֮᷒̀̕b +a֮᷒̀̕b +a֮᷒̀̕b +a֮᷒̀̕b +a֮᷒̀̕b + +à֮ᷓ̕b +à֮ᷓ̕b +à֮ᷓ̕b +à֮ᷓ̕b +à֮ᷓ̕b + +a֮ᷓ̀̕b +a֮ᷓ̀̕b +a֮ᷓ̀̕b +a֮ᷓ̀̕b +a֮ᷓ̀̕b + +à֮ᷔ̕b +à֮ᷔ̕b +à֮ᷔ̕b +à֮ᷔ̕b +à֮ᷔ̕b + +a֮ᷔ̀̕b +a֮ᷔ̀̕b +a֮ᷔ̀̕b +a֮ᷔ̀̕b +a֮ᷔ̀̕b + +à֮ᷕ̕b +à֮ᷕ̕b +à֮ᷕ̕b +à֮ᷕ̕b +à֮ᷕ̕b + +a֮ᷕ̀̕b +a֮ᷕ̀̕b +a֮ᷕ̀̕b +a֮ᷕ̀̕b +a֮ᷕ̀̕b + +à֮ᷖ̕b +à֮ᷖ̕b +à֮ᷖ̕b +à֮ᷖ̕b +à֮ᷖ̕b + +a֮ᷖ̀̕b +a֮ᷖ̀̕b +a֮ᷖ̀̕b +a֮ᷖ̀̕b +a֮ᷖ̀̕b + +à֮ᷗ̕b +à֮ᷗ̕b +à֮ᷗ̕b +à֮ᷗ̕b +à֮ᷗ̕b + +a֮ᷗ̀̕b +a֮ᷗ̀̕b +a֮ᷗ̀̕b +a֮ᷗ̀̕b +a֮ᷗ̀̕b + +à֮ᷘ̕b +à֮ᷘ̕b +à֮ᷘ̕b +à֮ᷘ̕b +à֮ᷘ̕b + +a֮ᷘ̀̕b +a֮ᷘ̀̕b +a֮ᷘ̀̕b +a֮ᷘ̀̕b +a֮ᷘ̀̕b + +à֮ᷙ̕b +à֮ᷙ̕b +à֮ᷙ̕b +à֮ᷙ̕b +à֮ᷙ̕b + +a֮ᷙ̀̕b +a֮ᷙ̀̕b +a֮ᷙ̀̕b +a֮ᷙ̀̕b +a֮ᷙ̀̕b + +à֮ᷚ̕b +à֮ᷚ̕b +à֮ᷚ̕b +à֮ᷚ̕b +à֮ᷚ̕b + +a֮ᷚ̀̕b +a֮ᷚ̀̕b +a֮ᷚ̀̕b +a֮ᷚ̀̕b +a֮ᷚ̀̕b + +à֮ᷛ̕b +à֮ᷛ̕b +à֮ᷛ̕b +à֮ᷛ̕b +à֮ᷛ̕b + +a֮ᷛ̀̕b +a֮ᷛ̀̕b +a֮ᷛ̀̕b +a֮ᷛ̀̕b +a֮ᷛ̀̕b + +à֮ᷜ̕b +à֮ᷜ̕b +à֮ᷜ̕b +à֮ᷜ̕b +à֮ᷜ̕b + +a֮ᷜ̀̕b +a֮ᷜ̀̕b +a֮ᷜ̀̕b +a֮ᷜ̀̕b +a֮ᷜ̀̕b + +à֮ᷝ̕b +à֮ᷝ̕b +à֮ᷝ̕b +à֮ᷝ̕b +à֮ᷝ̕b + +a֮ᷝ̀̕b +a֮ᷝ̀̕b +a֮ᷝ̀̕b +a֮ᷝ̀̕b +a֮ᷝ̀̕b + +à֮ᷞ̕b +à֮ᷞ̕b +à֮ᷞ̕b +à֮ᷞ̕b +à֮ᷞ̕b + +a֮ᷞ̀̕b +a֮ᷞ̀̕b +a֮ᷞ̀̕b +a֮ᷞ̀̕b +a֮ᷞ̀̕b + +à֮ᷟ̕b +à֮ᷟ̕b +à֮ᷟ̕b +à֮ᷟ̕b +à֮ᷟ̕b + +a֮ᷟ̀̕b +a֮ᷟ̀̕b +a֮ᷟ̀̕b +a֮ᷟ̀̕b +a֮ᷟ̀̕b + +à֮ᷠ̕b +à֮ᷠ̕b +à֮ᷠ̕b +à֮ᷠ̕b +à֮ᷠ̕b + +a֮ᷠ̀̕b +a֮ᷠ̀̕b +a֮ᷠ̀̕b +a֮ᷠ̀̕b +a֮ᷠ̀̕b + +à֮ᷡ̕b +à֮ᷡ̕b +à֮ᷡ̕b +à֮ᷡ̕b +à֮ᷡ̕b + +a֮ᷡ̀̕b +a֮ᷡ̀̕b +a֮ᷡ̀̕b +a֮ᷡ̀̕b +a֮ᷡ̀̕b + +à֮ᷢ̕b +à֮ᷢ̕b +à֮ᷢ̕b +à֮ᷢ̕b +à֮ᷢ̕b + +a֮ᷢ̀̕b +a֮ᷢ̀̕b +a֮ᷢ̀̕b +a֮ᷢ̀̕b +a֮ᷢ̀̕b + +à֮ᷣ̕b +à֮ᷣ̕b +à֮ᷣ̕b +à֮ᷣ̕b +à֮ᷣ̕b + +a֮ᷣ̀̕b +a֮ᷣ̀̕b +a֮ᷣ̀̕b +a֮ᷣ̀̕b +a֮ᷣ̀̕b + +à֮ᷤ̕b +à֮ᷤ̕b +à֮ᷤ̕b +à֮ᷤ̕b +à֮ᷤ̕b + +a֮ᷤ̀̕b +a֮ᷤ̀̕b +a֮ᷤ̀̕b +a֮ᷤ̀̕b +a֮ᷤ̀̕b + +à֮ᷥ̕b +à֮ᷥ̕b +à֮ᷥ̕b +à֮ᷥ̕b +à֮ᷥ̕b + +a֮ᷥ̀̕b +a֮ᷥ̀̕b +a֮ᷥ̀̕b +a֮ᷥ̀̕b +a֮ᷥ̀̕b + +à֮ᷦ̕b +à֮ᷦ̕b +à֮ᷦ̕b +à֮ᷦ̕b +à֮ᷦ̕b + +a֮ᷦ̀̕b +a֮ᷦ̀̕b +a֮ᷦ̀̕b +a֮ᷦ̀̕b +a֮ᷦ̀̕b + +a̕͜᷼͝b +a̕͜᷼͝b +a̕͜᷼͝b +a̕͜᷼͝b +a̕͜᷼͝b + +a̕᷼͜͝b +a̕᷼͜͝b +a̕᷼͜͝b +a̕᷼͜͝b +a̕᷼͜͝b + +a〪̖᷽֚b +a〪̖᷽֚b +a〪̖᷽֚b +a〪̖᷽֚b +a〪̖᷽֚b + +a〪᷽̖֚b +a〪᷽̖֚b +a〪᷽̖֚b +a〪᷽̖֚b +a〪᷽̖֚b + +à֮᷾̕b +à֮᷾̕b +à֮᷾̕b +à֮᷾̕b +à֮᷾̕b + +a֮᷾̀̕b +a֮᷾̀̕b +a֮᷾̀̕b +a֮᷾̀̕b +a֮᷾̀̕b + +a〪̖᷿֚b +a〪̖᷿֚b +a〪̖᷿֚b +a〪̖᷿֚b +a〪̖᷿֚b + +a〪᷿̖֚b +a〪᷿̖֚b +a〪᷿̖֚b +a〪᷿̖֚b +a〪᷿̖֚b + +à֮⃐̕b +à֮⃐̕b +à֮⃐̕b +à֮⃐̕b +à֮⃐̕b + +a֮⃐̀̕b +a֮⃐̀̕b +a֮⃐̀̕b +a֮⃐̀̕b +a֮⃐̀̕b + +à֮⃑̕b +à֮⃑̕b +à֮⃑̕b +à֮⃑̕b +à֮⃑̕b + +a֮⃑̀̕b +a֮⃑̀̕b +a֮⃑̀̕b +a֮⃑̀̕b +a֮⃑̀̕b + +a̴⃒़b +a̴⃒़b +a̴⃒़b +a̴⃒़b +a̴⃒़b + +a⃒̴़b +a⃒̴़b +a⃒̴़b +a⃒̴़b +a⃒̴़b + +a̴⃓़b +a̴⃓़b +a̴⃓़b +a̴⃓़b +a̴⃓़b + +a⃓̴़b +a⃓̴़b +a⃓̴़b +a⃓̴़b +a⃓̴़b + +à֮⃔̕b +à֮⃔̕b +à֮⃔̕b +à֮⃔̕b +à֮⃔̕b + +a֮⃔̀̕b +a֮⃔̀̕b +a֮⃔̀̕b +a֮⃔̀̕b +a֮⃔̀̕b + +à֮⃕̕b +à֮⃕̕b +à֮⃕̕b +à֮⃕̕b +à֮⃕̕b + +a֮⃕̀̕b +a֮⃕̀̕b +a֮⃕̀̕b +a֮⃕̀̕b +a֮⃕̀̕b + +à֮⃖̕b +à֮⃖̕b +à֮⃖̕b +à֮⃖̕b +à֮⃖̕b + +a֮⃖̀̕b +a֮⃖̀̕b +a֮⃖̀̕b +a֮⃖̀̕b +a֮⃖̀̕b + +à֮⃗̕b +à֮⃗̕b +à֮⃗̕b +à֮⃗̕b +à֮⃗̕b + +a֮⃗̀̕b +a֮⃗̀̕b +a֮⃗̀̕b +a֮⃗̀̕b +a֮⃗̀̕b + +a̴⃘़b +a̴⃘़b +a̴⃘़b +a̴⃘़b +a̴⃘़b + +a⃘̴़b +a⃘̴़b +a⃘̴़b +a⃘̴़b +a⃘̴़b + +a̴⃙़b +a̴⃙़b +a̴⃙़b +a̴⃙़b +a̴⃙़b + +a⃙̴़b +a⃙̴़b +a⃙̴़b +a⃙̴़b +a⃙̴़b + +a̴⃚़b +a̴⃚़b +a̴⃚़b +a̴⃚़b +a̴⃚़b + +a⃚̴़b +a⃚̴़b +a⃚̴़b +a⃚̴़b +a⃚̴़b + +à֮⃛̕b +à֮⃛̕b +à֮⃛̕b +à֮⃛̕b +à֮⃛̕b + +a֮⃛̀̕b +a֮⃛̀̕b +a֮⃛̀̕b +a֮⃛̀̕b +a֮⃛̀̕b + +à֮⃜̕b +à֮⃜̕b +à֮⃜̕b +à֮⃜̕b +à֮⃜̕b + +a֮⃜̀̕b +a֮⃜̀̕b +a֮⃜̀̕b +a֮⃜̀̕b +a֮⃜̀̕b + +à֮⃡̕b +à֮⃡̕b +à֮⃡̕b +à֮⃡̕b +à֮⃡̕b + +a֮⃡̀̕b +a֮⃡̀̕b +a֮⃡̀̕b +a֮⃡̀̕b +a֮⃡̀̕b + +a̴⃥़b +a̴⃥़b +a̴⃥़b +a̴⃥़b +a̴⃥़b + +a⃥̴़b +a⃥̴़b +a⃥̴़b +a⃥̴़b +a⃥̴़b + +a̴⃦़b +a̴⃦़b +a̴⃦़b +a̴⃦़b +a̴⃦़b + +a⃦̴़b +a⃦̴़b +a⃦̴़b +a⃦̴़b +a⃦̴़b + +à֮⃧̕b +à֮⃧̕b +à֮⃧̕b +à֮⃧̕b +à֮⃧̕b + +a֮⃧̀̕b +a֮⃧̀̕b +a֮⃧̀̕b +a֮⃧̀̕b +a֮⃧̀̕b + +a〪̖⃨֚b +a〪̖⃨֚b +a〪̖⃨֚b +a〪̖⃨֚b +a〪̖⃨֚b + +a〪⃨̖֚b +a〪⃨̖֚b +a〪⃨̖֚b +a〪⃨̖֚b +a〪⃨̖֚b + +à֮⃩̕b +à֮⃩̕b +à֮⃩̕b +à֮⃩̕b +à֮⃩̕b + +a֮⃩̀̕b +a֮⃩̀̕b +a֮⃩̀̕b +a֮⃩̀̕b +a֮⃩̀̕b + +a̴⃪़b +a̴⃪़b +a̴⃪़b +a̴⃪़b +a̴⃪़b + +a⃪̴़b +a⃪̴़b +a⃪̴़b +a⃪̴़b +a⃪̴़b + +a̴⃫़b +a̴⃫़b +a̴⃫़b +a̴⃫़b +a̴⃫़b + +a⃫̴़b +a⃫̴़b +a⃫̴़b +a⃫̴़b +a⃫̴़b + +a〪̖⃬֚b +a〪̖⃬֚b +a〪̖⃬֚b +a〪̖⃬֚b +a〪̖⃬֚b + +a〪⃬̖֚b +a〪⃬̖֚b +a〪⃬̖֚b +a〪⃬̖֚b +a〪⃬̖֚b + +a〪̖⃭֚b +a〪̖⃭֚b +a〪̖⃭֚b +a〪̖⃭֚b +a〪̖⃭֚b + +a〪⃭̖֚b +a〪⃭̖֚b +a〪⃭̖֚b +a〪⃭̖֚b +a〪⃭̖֚b + +a〪̖⃮֚b +a〪̖⃮֚b +a〪̖⃮֚b +a〪̖⃮֚b +a〪̖⃮֚b + +a〪⃮̖֚b +a〪⃮̖֚b +a〪⃮̖֚b +a〪⃮̖֚b +a〪⃮̖֚b + +a〪̖⃯֚b +a〪̖⃯֚b +a〪̖⃯֚b +a〪̖⃯֚b +a〪̖⃯֚b + +a〪⃯̖֚b +a〪⃯̖֚b +a〪⃯̖֚b +a〪⃯̖֚b +a〪⃯̖֚b + +à֮⃰̕b +à֮⃰̕b +à֮⃰̕b +à֮⃰̕b +à֮⃰̕b + +a֮⃰̀̕b +a֮⃰̀̕b +a֮⃰̀̕b +a֮⃰̀̕b +a֮⃰̀̕b + +à֮⳯̕b +à֮⳯̕b +à֮⳯̕b +à֮⳯̕b +à֮⳯̕b + +a֮⳯̀̕b +a֮⳯̀̕b +a֮⳯̀̕b +a֮⳯̀̕b +a֮⳯̀̕b + +à֮⳰̕b +à֮⳰̕b +à֮⳰̕b +à֮⳰̕b +à֮⳰̕b + +a֮⳰̀̕b +a֮⳰̀̕b +a֮⳰̀̕b +a֮⳰̀̕b +a֮⳰̀̕b + +à֮⳱̕b +à֮⳱̕b +à֮⳱̕b +à֮⳱̕b +à֮⳱̕b + +a֮⳱̀̕b +a֮⳱̀̕b +a֮⳱̀̕b +a֮⳱̀̕b +a֮⳱̀̕b + +a゙्⵿ְb +a゙्⵿ְb +a゙्⵿ְb +a゙्⵿ְb +a゙्⵿ְb + +a゙⵿्ְb +a゙⵿्ְb +a゙⵿्ְb +a゙⵿्ְb +a゙⵿्ְb + +à֮ⷠ̕b +à֮ⷠ̕b +à֮ⷠ̕b +à֮ⷠ̕b +à֮ⷠ̕b + +a֮ⷠ̀̕b +a֮ⷠ̀̕b +a֮ⷠ̀̕b +a֮ⷠ̀̕b +a֮ⷠ̀̕b + +à֮ⷡ̕b +à֮ⷡ̕b +à֮ⷡ̕b +à֮ⷡ̕b +à֮ⷡ̕b + +a֮ⷡ̀̕b +a֮ⷡ̀̕b +a֮ⷡ̀̕b +a֮ⷡ̀̕b +a֮ⷡ̀̕b + +à֮ⷢ̕b +à֮ⷢ̕b +à֮ⷢ̕b +à֮ⷢ̕b +à֮ⷢ̕b + +a֮ⷢ̀̕b +a֮ⷢ̀̕b +a֮ⷢ̀̕b +a֮ⷢ̀̕b +a֮ⷢ̀̕b + +à֮ⷣ̕b +à֮ⷣ̕b +à֮ⷣ̕b +à֮ⷣ̕b +à֮ⷣ̕b + +a֮ⷣ̀̕b +a֮ⷣ̀̕b +a֮ⷣ̀̕b +a֮ⷣ̀̕b +a֮ⷣ̀̕b + +à֮ⷤ̕b +à֮ⷤ̕b +à֮ⷤ̕b +à֮ⷤ̕b +à֮ⷤ̕b + +a֮ⷤ̀̕b +a֮ⷤ̀̕b +a֮ⷤ̀̕b +a֮ⷤ̀̕b +a֮ⷤ̀̕b + +à֮ⷥ̕b +à֮ⷥ̕b +à֮ⷥ̕b +à֮ⷥ̕b +à֮ⷥ̕b + +a֮ⷥ̀̕b +a֮ⷥ̀̕b +a֮ⷥ̀̕b +a֮ⷥ̀̕b +a֮ⷥ̀̕b + +à֮ⷦ̕b +à֮ⷦ̕b +à֮ⷦ̕b +à֮ⷦ̕b +à֮ⷦ̕b + +a֮ⷦ̀̕b +a֮ⷦ̀̕b +a֮ⷦ̀̕b +a֮ⷦ̀̕b +a֮ⷦ̀̕b + +à֮ⷧ̕b +à֮ⷧ̕b +à֮ⷧ̕b +à֮ⷧ̕b +à֮ⷧ̕b + +a֮ⷧ̀̕b +a֮ⷧ̀̕b +a֮ⷧ̀̕b +a֮ⷧ̀̕b +a֮ⷧ̀̕b + +à֮ⷨ̕b +à֮ⷨ̕b +à֮ⷨ̕b +à֮ⷨ̕b +à֮ⷨ̕b + +a֮ⷨ̀̕b +a֮ⷨ̀̕b +a֮ⷨ̀̕b +a֮ⷨ̀̕b +a֮ⷨ̀̕b + +à֮ⷩ̕b +à֮ⷩ̕b +à֮ⷩ̕b +à֮ⷩ̕b +à֮ⷩ̕b + +a֮ⷩ̀̕b +a֮ⷩ̀̕b +a֮ⷩ̀̕b +a֮ⷩ̀̕b +a֮ⷩ̀̕b + +à֮ⷪ̕b +à֮ⷪ̕b +à֮ⷪ̕b +à֮ⷪ̕b +à֮ⷪ̕b + +a֮ⷪ̀̕b +a֮ⷪ̀̕b +a֮ⷪ̀̕b +a֮ⷪ̀̕b +a֮ⷪ̀̕b + +à֮ⷫ̕b +à֮ⷫ̕b +à֮ⷫ̕b +à֮ⷫ̕b +à֮ⷫ̕b + +a֮ⷫ̀̕b +a֮ⷫ̀̕b +a֮ⷫ̀̕b +a֮ⷫ̀̕b +a֮ⷫ̀̕b + +à֮ⷬ̕b +à֮ⷬ̕b +à֮ⷬ̕b +à֮ⷬ̕b +à֮ⷬ̕b + +a֮ⷬ̀̕b +a֮ⷬ̀̕b +a֮ⷬ̀̕b +a֮ⷬ̀̕b +a֮ⷬ̀̕b + +à֮ⷭ̕b +à֮ⷭ̕b +à֮ⷭ̕b +à֮ⷭ̕b +à֮ⷭ̕b + +a֮ⷭ̀̕b +a֮ⷭ̀̕b +a֮ⷭ̀̕b +a֮ⷭ̀̕b +a֮ⷭ̀̕b + +à֮ⷮ̕b +à֮ⷮ̕b +à֮ⷮ̕b +à֮ⷮ̕b +à֮ⷮ̕b + +a֮ⷮ̀̕b +a֮ⷮ̀̕b +a֮ⷮ̀̕b +a֮ⷮ̀̕b +a֮ⷮ̀̕b + +à֮ⷯ̕b +à֮ⷯ̕b +à֮ⷯ̕b +à֮ⷯ̕b +à֮ⷯ̕b + +a֮ⷯ̀̕b +a֮ⷯ̀̕b +a֮ⷯ̀̕b +a֮ⷯ̀̕b +a֮ⷯ̀̕b + +à֮ⷰ̕b +à֮ⷰ̕b +à֮ⷰ̕b +à֮ⷰ̕b +à֮ⷰ̕b + +a֮ⷰ̀̕b +a֮ⷰ̀̕b +a֮ⷰ̀̕b +a֮ⷰ̀̕b +a֮ⷰ̀̕b + +à֮ⷱ̕b +à֮ⷱ̕b +à֮ⷱ̕b +à֮ⷱ̕b +à֮ⷱ̕b + +a֮ⷱ̀̕b +a֮ⷱ̀̕b +a֮ⷱ̀̕b +a֮ⷱ̀̕b +a֮ⷱ̀̕b + +à֮ⷲ̕b +à֮ⷲ̕b +à֮ⷲ̕b +à֮ⷲ̕b +à֮ⷲ̕b + +a֮ⷲ̀̕b +a֮ⷲ̀̕b +a֮ⷲ̀̕b +a֮ⷲ̀̕b +a֮ⷲ̀̕b + +à֮ⷳ̕b +à֮ⷳ̕b +à֮ⷳ̕b +à֮ⷳ̕b +à֮ⷳ̕b + +a֮ⷳ̀̕b +a֮ⷳ̀̕b +a֮ⷳ̀̕b +a֮ⷳ̀̕b +a֮ⷳ̀̕b + +à֮ⷴ̕b +à֮ⷴ̕b +à֮ⷴ̕b +à֮ⷴ̕b +à֮ⷴ̕b + +a֮ⷴ̀̕b +a֮ⷴ̀̕b +a֮ⷴ̀̕b +a֮ⷴ̀̕b +a֮ⷴ̀̕b + +à֮ⷵ̕b +à֮ⷵ̕b +à֮ⷵ̕b +à֮ⷵ̕b +à֮ⷵ̕b + +a֮ⷵ̀̕b +a֮ⷵ̀̕b +a֮ⷵ̀̕b +a֮ⷵ̀̕b +a֮ⷵ̀̕b + +à֮ⷶ̕b +à֮ⷶ̕b +à֮ⷶ̕b +à֮ⷶ̕b +à֮ⷶ̕b + +a֮ⷶ̀̕b +a֮ⷶ̀̕b +a֮ⷶ̀̕b +a֮ⷶ̀̕b +a֮ⷶ̀̕b + +à֮ⷷ̕b +à֮ⷷ̕b +à֮ⷷ̕b +à֮ⷷ̕b +à֮ⷷ̕b + +a֮ⷷ̀̕b +a֮ⷷ̀̕b +a֮ⷷ̀̕b +a֮ⷷ̀̕b +a֮ⷷ̀̕b + +à֮ⷸ̕b +à֮ⷸ̕b +à֮ⷸ̕b +à֮ⷸ̕b +à֮ⷸ̕b + +a֮ⷸ̀̕b +a֮ⷸ̀̕b +a֮ⷸ̀̕b +a֮ⷸ̀̕b +a֮ⷸ̀̕b + +à֮ⷹ̕b +à֮ⷹ̕b +à֮ⷹ̕b +à֮ⷹ̕b +à֮ⷹ̕b + +a֮ⷹ̀̕b +a֮ⷹ̀̕b +a֮ⷹ̀̕b +a֮ⷹ̀̕b +a֮ⷹ̀̕b + +à֮ⷺ̕b +à֮ⷺ̕b +à֮ⷺ̕b +à֮ⷺ̕b +à֮ⷺ̕b + +a֮ⷺ̀̕b +a֮ⷺ̀̕b +a֮ⷺ̀̕b +a֮ⷺ̀̕b +a֮ⷺ̀̕b + +à֮ⷻ̕b +à֮ⷻ̕b +à֮ⷻ̕b +à֮ⷻ̕b +à֮ⷻ̕b + +a֮ⷻ̀̕b +a֮ⷻ̀̕b +a֮ⷻ̀̕b +a֮ⷻ̀̕b +a֮ⷻ̀̕b + +à֮ⷼ̕b +à֮ⷼ̕b +à֮ⷼ̕b +à֮ⷼ̕b +à֮ⷼ̕b + +a֮ⷼ̀̕b +a֮ⷼ̀̕b +a֮ⷼ̀̕b +a֮ⷼ̀̕b +a֮ⷼ̀̕b + +à֮ⷽ̕b +à֮ⷽ̕b +à֮ⷽ̕b +à֮ⷽ̕b +à֮ⷽ̕b + +a֮ⷽ̀̕b +a֮ⷽ̀̕b +a֮ⷽ̀̕b +a֮ⷽ̀̕b +a֮ⷽ̀̕b + +à֮ⷾ̕b +à֮ⷾ̕b +à֮ⷾ̕b +à֮ⷾ̕b +à֮ⷾ̕b + +a֮ⷾ̀̕b +a֮ⷾ̀̕b +a֮ⷾ̀̕b +a֮ⷾ̀̕b +a֮ⷾ̀̕b + +à֮ⷿ̕b +à֮ⷿ̕b +à֮ⷿ̕b +à֮ⷿ̕b +à֮ⷿ̕b + +a֮ⷿ̀̕b +a֮ⷿ̀̕b +a֮ⷿ̀̕b +a֮ⷿ̀̕b +a֮ⷿ̀̕b + +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b + +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b + +à𝅭֮〫b +à𝅭֮〫b +à𝅭֮〫b +à𝅭֮〫b +à𝅭֮〫b + +à𝅭〫֮b +à𝅭〫֮b +à𝅭〫֮b +à𝅭〫֮b +à𝅭〫֮b + +à̕〬͜b +à̕〬͜b +à̕〬͜b +à̕〬͜b +à̕〬͜b + +à〬̕͜b +à〬̕͜b +à〬̕͜b +à〬̕͜b +à〬̕͜b + +a̖֚〭〮b +a̖֚〭〮b +a̖֚〭〮b +a̖֚〭〮b +a̖֚〭〮b + +a̖〭֚〮b +a̖〭֚〮b +a̖〭֚〮b +a̖〭֚〮b +a̖〭֚〮b + +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b + +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b + +a֚〮〯𝅭b +a֚〮〯𝅭b +a֚〮〯𝅭b +a֚〮〯𝅭b +a֚〮〯𝅭b + +a֚〯〮𝅭b +a֚〯〮𝅭b +a֚〯〮𝅭b +a֚〯〮𝅭b +a֚〯〮𝅭b + +a़゙゙्b +a़゙゙्b +a़゙゙्b +a़゙゙्b +a़゙゙्b + +a़゙゙्b +a़゙゙्b +a़゙゙्b +a़゙゙्b +a़゙゙्b + +a़゙゚्b +a़゙゚्b +a़゙゚्b +a़゙゚्b +a़゙゚्b + +a़゚゙्b +a़゚゙्b +a़゚゙्b +a़゚゙्b +a़゚゙्b + +à֮꙯̕b +à֮꙯̕b +à֮꙯̕b +à֮꙯̕b +à֮꙯̕b + +a֮꙯̀̕b +a֮꙯̀̕b +a֮꙯̀̕b +a֮꙯̀̕b +a֮꙯̀̕b + +à֮꙼̕b +à֮꙼̕b +à֮꙼̕b +à֮꙼̕b +à֮꙼̕b + +a֮꙼̀̕b +a֮꙼̀̕b +a֮꙼̀̕b +a֮꙼̀̕b +a֮꙼̀̕b + +à֮꙽̕b +à֮꙽̕b +à֮꙽̕b +à֮꙽̕b +à֮꙽̕b + +a֮꙽̀̕b +a֮꙽̀̕b +a֮꙽̀̕b +a֮꙽̀̕b +a֮꙽̀̕b + +à֮꛰̕b +à֮꛰̕b +à֮꛰̕b +à֮꛰̕b +à֮꛰̕b + +a֮꛰̀̕b +a֮꛰̀̕b +a֮꛰̀̕b +a֮꛰̀̕b +a֮꛰̀̕b + +à֮꛱̕b +à֮꛱̕b +à֮꛱̕b +à֮꛱̕b +à֮꛱̕b + +a֮꛱̀̕b +a֮꛱̀̕b +a֮꛱̀̕b +a֮꛱̀̕b +a֮꛱̀̕b + +a゙्꠆ְb +a゙्꠆ְb +a゙्꠆ְb +a゙्꠆ְb +a゙्꠆ְb + +a゙꠆्ְb +a゙꠆्ְb +a゙꠆्ְb +a゙꠆्ְb +a゙꠆्ְb + +a゙्꣄ְb +a゙्꣄ְb +a゙्꣄ְb +a゙्꣄ְb +a゙्꣄ְb + +a゙꣄्ְb +a゙꣄्ְb +a゙꣄्ְb +a゙꣄्ְb +a゙꣄्ְb + +à֮꣠̕b +à֮꣠̕b +à֮꣠̕b +à֮꣠̕b +à֮꣠̕b + +a֮꣠̀̕b +a֮꣠̀̕b +a֮꣠̀̕b +a֮꣠̀̕b +a֮꣠̀̕b + +à֮꣡̕b +à֮꣡̕b +à֮꣡̕b +à֮꣡̕b +à֮꣡̕b + +a֮꣡̀̕b +a֮꣡̀̕b +a֮꣡̀̕b +a֮꣡̀̕b +a֮꣡̀̕b + +à֮꣢̕b +à֮꣢̕b +à֮꣢̕b +à֮꣢̕b +à֮꣢̕b + +a֮꣢̀̕b +a֮꣢̀̕b +a֮꣢̀̕b +a֮꣢̀̕b +a֮꣢̀̕b + +à֮꣣̕b +à֮꣣̕b +à֮꣣̕b +à֮꣣̕b +à֮꣣̕b + +a֮꣣̀̕b +a֮꣣̀̕b +a֮꣣̀̕b +a֮꣣̀̕b +a֮꣣̀̕b + +à֮꣤̕b +à֮꣤̕b +à֮꣤̕b +à֮꣤̕b +à֮꣤̕b + +a֮꣤̀̕b +a֮꣤̀̕b +a֮꣤̀̕b +a֮꣤̀̕b +a֮꣤̀̕b + +à֮꣥̕b +à֮꣥̕b +à֮꣥̕b +à֮꣥̕b +à֮꣥̕b + +a֮꣥̀̕b +a֮꣥̀̕b +a֮꣥̀̕b +a֮꣥̀̕b +a֮꣥̀̕b + +à֮꣦̕b +à֮꣦̕b +à֮꣦̕b +à֮꣦̕b +à֮꣦̕b + +a֮꣦̀̕b +a֮꣦̀̕b +a֮꣦̀̕b +a֮꣦̀̕b +a֮꣦̀̕b + +à֮꣧̕b +à֮꣧̕b +à֮꣧̕b +à֮꣧̕b +à֮꣧̕b + +a֮꣧̀̕b +a֮꣧̀̕b +a֮꣧̀̕b +a֮꣧̀̕b +a֮꣧̀̕b + +à֮꣨̕b +à֮꣨̕b +à֮꣨̕b +à֮꣨̕b +à֮꣨̕b + +a֮꣨̀̕b +a֮꣨̀̕b +a֮꣨̀̕b +a֮꣨̀̕b +a֮꣨̀̕b + +à֮꣩̕b +à֮꣩̕b +à֮꣩̕b +à֮꣩̕b +à֮꣩̕b + +a֮꣩̀̕b +a֮꣩̀̕b +a֮꣩̀̕b +a֮꣩̀̕b +a֮꣩̀̕b + +à֮꣪̕b +à֮꣪̕b +à֮꣪̕b +à֮꣪̕b +à֮꣪̕b + +a֮꣪̀̕b +a֮꣪̀̕b +a֮꣪̀̕b +a֮꣪̀̕b +a֮꣪̀̕b + +à֮꣫̕b +à֮꣫̕b +à֮꣫̕b +à֮꣫̕b +à֮꣫̕b + +a֮꣫̀̕b +a֮꣫̀̕b +a֮꣫̀̕b +a֮꣫̀̕b +a֮꣫̀̕b + +à֮꣬̕b +à֮꣬̕b +à֮꣬̕b +à֮꣬̕b +à֮꣬̕b + +a֮꣬̀̕b +a֮꣬̀̕b +a֮꣬̀̕b +a֮꣬̀̕b +a֮꣬̀̕b + +à֮꣭̕b +à֮꣭̕b +à֮꣭̕b +à֮꣭̕b +à֮꣭̕b + +a֮꣭̀̕b +a֮꣭̀̕b +a֮꣭̀̕b +a֮꣭̀̕b +a֮꣭̀̕b + +à֮꣮̕b +à֮꣮̕b +à֮꣮̕b +à֮꣮̕b +à֮꣮̕b + +a֮꣮̀̕b +a֮꣮̀̕b +a֮꣮̀̕b +a֮꣮̀̕b +a֮꣮̀̕b + +à֮꣯̕b +à֮꣯̕b +à֮꣯̕b +à֮꣯̕b +à֮꣯̕b + +a֮꣯̀̕b +a֮꣯̀̕b +a֮꣯̀̕b +a֮꣯̀̕b +a֮꣯̀̕b + +à֮꣰̕b +à֮꣰̕b +à֮꣰̕b +à֮꣰̕b +à֮꣰̕b + +a֮꣰̀̕b +a֮꣰̀̕b +a֮꣰̀̕b +a֮꣰̀̕b +a֮꣰̀̕b + +à֮꣱̕b +à֮꣱̕b +à֮꣱̕b +à֮꣱̕b +à֮꣱̕b + +a֮꣱̀̕b +a֮꣱̀̕b +a֮꣱̀̕b +a֮꣱̀̕b +a֮꣱̀̕b + +a〪̖꤫֚b +a〪̖꤫֚b +a〪̖꤫֚b +a〪̖꤫֚b +a〪̖꤫֚b + +a〪꤫̖֚b +a〪꤫̖֚b +a〪꤫̖֚b +a〪꤫̖֚b +a〪꤫̖֚b + +a〪̖꤬֚b +a〪̖꤬֚b +a〪̖꤬֚b +a〪̖꤬֚b +a〪̖꤬֚b + +a〪꤬̖֚b +a〪꤬̖֚b +a〪꤬̖֚b +a〪꤬̖֚b +a〪꤬̖֚b + +a〪̖꤭֚b +a〪̖꤭֚b +a〪̖꤭֚b +a〪̖꤭֚b +a〪̖꤭֚b + +a〪꤭̖֚b +a〪꤭̖֚b +a〪꤭̖֚b +a〪꤭̖֚b +a〪꤭̖֚b + +a゙्꥓ְb +a゙्꥓ְb +a゙्꥓ְb +a゙्꥓ְb +a゙्꥓ְb + +a゙꥓्ְb +a゙꥓्ְb +a゙꥓्ְb +a゙꥓्ְb +a゙꥓्ְb + +a̴़꦳゙b +a̴़꦳゙b +a̴़꦳゙b +a̴़꦳゙b +a̴़꦳゙b + +a̴꦳़゙b +a̴꦳़゙b +a̴꦳़゙b +a̴꦳़゙b +a̴꦳़゙b + +a゙्꧀ְb +a゙्꧀ְb +a゙्꧀ְb +a゙्꧀ְb +a゙्꧀ְb + +a゙꧀्ְb +a゙꧀्ְb +a゙꧀्ְb +a゙꧀्ְb +a゙꧀्ְb + +à֮ꪰ̕b +à֮ꪰ̕b +à֮ꪰ̕b +à֮ꪰ̕b +à֮ꪰ̕b + +a֮ꪰ̀̕b +a֮ꪰ̀̕b +a֮ꪰ̀̕b +a֮ꪰ̀̕b +a֮ꪰ̀̕b + +à֮ꪲ̕b +à֮ꪲ̕b +à֮ꪲ̕b +à֮ꪲ̕b +à֮ꪲ̕b + +a֮ꪲ̀̕b +a֮ꪲ̀̕b +a֮ꪲ̀̕b +a֮ꪲ̀̕b +a֮ꪲ̀̕b + +à֮ꪳ̕b +à֮ꪳ̕b +à֮ꪳ̕b +à֮ꪳ̕b +à֮ꪳ̕b + +a֮ꪳ̀̕b +a֮ꪳ̀̕b +a֮ꪳ̀̕b +a֮ꪳ̀̕b +a֮ꪳ̀̕b + +a〪̖ꪴ֚b +a〪̖ꪴ֚b +a〪̖ꪴ֚b +a〪̖ꪴ֚b +a〪̖ꪴ֚b + +a〪ꪴ̖֚b +a〪ꪴ̖֚b +a〪ꪴ̖֚b +a〪ꪴ̖֚b +a〪ꪴ̖֚b + +à֮ꪷ̕b +à֮ꪷ̕b +à֮ꪷ̕b +à֮ꪷ̕b +à֮ꪷ̕b + +a֮ꪷ̀̕b +a֮ꪷ̀̕b +a֮ꪷ̀̕b +a֮ꪷ̀̕b +a֮ꪷ̀̕b + +à֮ꪸ̕b +à֮ꪸ̕b +à֮ꪸ̕b +à֮ꪸ̕b +à֮ꪸ̕b + +a֮ꪸ̀̕b +a֮ꪸ̀̕b +a֮ꪸ̀̕b +a֮ꪸ̀̕b +a֮ꪸ̀̕b + +à֮ꪾ̕b +à֮ꪾ̕b +à֮ꪾ̕b +à֮ꪾ̕b +à֮ꪾ̕b + +a֮ꪾ̀̕b +a֮ꪾ̀̕b +a֮ꪾ̀̕b +a֮ꪾ̀̕b +a֮ꪾ̀̕b + +à֮꪿̕b +à֮꪿̕b +à֮꪿̕b +à֮꪿̕b +à֮꪿̕b + +a֮꪿̀̕b +a֮꪿̀̕b +a֮꪿̀̕b +a֮꪿̀̕b +a֮꪿̀̕b + +à֮꫁̕b +à֮꫁̕b +à֮꫁̕b +à֮꫁̕b +à֮꫁̕b + +a֮꫁̀̕b +a֮꫁̀̕b +a֮꫁̀̕b +a֮꫁̀̕b +a֮꫁̀̕b + +a゙्꯭ְb +a゙्꯭ְb +a゙्꯭ְb +a゙्꯭ְb +a゙्꯭ְb + +a゙꯭्ְb +a゙꯭्ְb +a゙꯭्ְb +a゙꯭्ְb +a゙꯭्ְb + +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb + +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb + +à֮︠̕b +à֮︠̕b +à֮︠̕b +à֮︠̕b +à֮︠̕b + +a֮︠̀̕b +a֮︠̀̕b +a֮︠̀̕b +a֮︠̀̕b +a֮︠̀̕b + +à֮︡̕b +à֮︡̕b +à֮︡̕b +à֮︡̕b +à֮︡̕b + +a֮︡̀̕b +a֮︡̀̕b +a֮︡̀̕b +a֮︡̀̕b +a֮︡̀̕b + +à֮︢̕b +à֮︢̕b +à֮︢̕b +à֮︢̕b +à֮︢̕b + +a֮︢̀̕b +a֮︢̀̕b +a֮︢̀̕b +a֮︢̀̕b +a֮︢̀̕b + +à֮︣̕b +à֮︣̕b +à֮︣̕b +à֮︣̕b +à֮︣̕b + +a֮︣̀̕b +a֮︣̀̕b +a֮︣̀̕b +a֮︣̀̕b +a֮︣̀̕b + +à֮︤̕b +à֮︤̕b +à֮︤̕b +à֮︤̕b +à֮︤̕b + +a֮︤̀̕b +a֮︤̀̕b +a֮︤̀̕b +a֮︤̀̕b +a֮︤̀̕b + +à֮︥̕b +à֮︥̕b +à֮︥̕b +à֮︥̕b +à֮︥̕b + +a֮︥̀̕b +a֮︥̀̕b +a֮︥̀̕b +a֮︥̀̕b +a֮︥̀̕b + +à֮︦̕b +à֮︦̕b +à֮︦̕b +à֮︦̕b +à֮︦̕b + +a֮︦̀̕b +a֮︦̀̕b +a֮︦̀̕b +a֮︦̀̕b +a֮︦̀̕b + +a〪̖𐇽֚b +a〪̖𐇽֚b +a〪̖𐇽֚b +a〪̖𐇽֚b +a〪̖𐇽֚b + +a〪𐇽̖֚b +a〪𐇽̖֚b +a〪𐇽̖֚b +a〪𐇽̖֚b +a〪𐇽̖֚b + +a〪̖𐨍֚b +a〪̖𐨍֚b +a〪̖𐨍֚b +a〪̖𐨍֚b +a〪̖𐨍֚b + +a〪𐨍̖֚b +a〪𐨍̖֚b +a〪𐨍̖֚b +a〪𐨍̖֚b +a〪𐨍̖֚b + +à֮𐨏̕b +à֮𐨏̕b +à֮𐨏̕b +à֮𐨏̕b +à֮𐨏̕b + +a֮𐨏̀̕b +a֮𐨏̀̕b +a֮𐨏̀̕b +a֮𐨏̀̕b +a֮𐨏̀̕b + +à֮𐨸̕b +à֮𐨸̕b +à֮𐨸̕b +à֮𐨸̕b +à֮𐨸̕b + +a֮𐨸̀̕b +a֮𐨸̀̕b +a֮𐨸̀̕b +a֮𐨸̀̕b +a֮𐨸̀̕b + +a̴𐨹़b +a̴𐨹़b +a̴𐨹़b +a̴𐨹़b +a̴𐨹़b + +a𐨹̴़b +a𐨹̴़b +a𐨹̴़b +a𐨹̴़b +a𐨹̴़b + +a〪̖𐨺֚b +a〪̖𐨺֚b +a〪̖𐨺֚b +a〪̖𐨺֚b +a〪̖𐨺֚b + +a〪𐨺̖֚b +a〪𐨺̖֚b +a〪𐨺̖֚b +a〪𐨺̖֚b +a〪𐨺̖֚b + +a゙्𐨿ְb +a゙्𐨿ְb +a゙्𐨿ְb +a゙्𐨿ְb +a゙्𐨿ְb + +a゙𐨿्ְb +a゙𐨿्ְb +a゙𐨿्ְb +a゙𐨿्ְb +a゙𐨿्ְb + +a゙्𑁆ְb +a゙्𑁆ְb +a゙्𑁆ְb +a゙्𑁆ְb +a゙्𑁆ְb + +a゙𑁆्ְb +a゙𑁆्ְb +a゙𑁆्ְb +a゙𑁆्ְb +a゙𑁆्ְb + +a゙्𑂹ְb +a゙्𑂹ְb +a゙्𑂹ְb +a゙्𑂹ְb +a゙्𑂹ְb + +a゙𑂹्ְb +a゙𑂹्ְb +a゙𑂹्ְb +a゙𑂹्ְb +a゙𑂹्ְb + +a̴़𑂺゙b +a̴़𑂺゙b +a̴़𑂺゙b +a̴़𑂺゙b +a̴़𑂺゙b + +a̴𑂺़゙b +a̴𑂺़゙b +a̴𑂺़゙b +a̴𑂺़゙b +a̴𑂺़゙b + +a᷎̛𝅥〪b +a᷎̛𝅥〪b +a᷎̛𝅥〪b +a᷎̛𝅥〪b +a᷎̛𝅥〪b + +a᷎𝅥̛〪b +a᷎𝅥̛〪b +a᷎𝅥̛〪b +a᷎𝅥̛〪b +a᷎𝅥̛〪b + +a᷎̛𝅦〪b +a᷎̛𝅦〪b +a᷎̛𝅦〪b +a᷎̛𝅦〪b +a᷎̛𝅦〪b + +a᷎𝅦̛〪b +a᷎𝅦̛〪b +a᷎𝅦̛〪b +a᷎𝅦̛〪b +a᷎𝅦̛〪b + +a̴𝅧़b +a̴𝅧़b +a̴𝅧़b +a̴𝅧़b +a̴𝅧़b + +a𝅧̴़b +a𝅧̴़b +a𝅧̴़b +a𝅧̴़b +a𝅧̴़b + +a̴𝅨़b +a̴𝅨़b +a̴𝅨़b +a̴𝅨़b +a̴𝅨़b + +a𝅨̴़b +a𝅨̴़b +a𝅨̴़b +a𝅨̴़b +a𝅨̴़b + +a̴𝅩़b +a̴𝅩़b +a̴𝅩़b +a̴𝅩़b +a̴𝅩़b + +a𝅩̴़b +a𝅩̴़b +a𝅩̴़b +a𝅩̴़b +a𝅩̴़b + +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b + +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b + +a᷎̛𝅮〪b +a᷎̛𝅮〪b +a᷎̛𝅮〪b +a᷎̛𝅮〪b +a᷎̛𝅮〪b + +a᷎𝅮̛〪b +a᷎𝅮̛〪b +a᷎𝅮̛〪b +a᷎𝅮̛〪b +a᷎𝅮̛〪b + +a᷎̛𝅯〪b +a᷎̛𝅯〪b +a᷎̛𝅯〪b +a᷎̛𝅯〪b +a᷎̛𝅯〪b + +a᷎𝅯̛〪b +a᷎𝅯̛〪b +a᷎𝅯̛〪b +a᷎𝅯̛〪b +a᷎𝅯̛〪b + +a᷎̛𝅰〪b +a᷎̛𝅰〪b +a᷎̛𝅰〪b +a᷎̛𝅰〪b +a᷎̛𝅰〪b + +a᷎𝅰̛〪b +a᷎𝅰̛〪b +a᷎𝅰̛〪b +a᷎𝅰̛〪b +a᷎𝅰̛〪b + +a᷎̛𝅱〪b +a᷎̛𝅱〪b +a᷎̛𝅱〪b +a᷎̛𝅱〪b +a᷎̛𝅱〪b + +a᷎𝅱̛〪b +a᷎𝅱̛〪b +a᷎𝅱̛〪b +a᷎𝅱̛〪b +a᷎𝅱̛〪b + +a᷎̛𝅲〪b +a᷎̛𝅲〪b +a᷎̛𝅲〪b +a᷎̛𝅲〪b +a᷎̛𝅲〪b + +a᷎𝅲̛〪b +a᷎𝅲̛〪b +a᷎𝅲̛〪b +a᷎𝅲̛〪b +a᷎𝅲̛〪b + +a〪̖𝅻֚b +a〪̖𝅻֚b +a〪̖𝅻֚b +a〪̖𝅻֚b +a〪̖𝅻֚b + +a〪𝅻̖֚b +a〪𝅻̖֚b +a〪𝅻̖֚b +a〪𝅻̖֚b +a〪𝅻̖֚b + +a〪̖𝅼֚b +a〪̖𝅼֚b +a〪̖𝅼֚b +a〪̖𝅼֚b +a〪̖𝅼֚b + +a〪𝅼̖֚b +a〪𝅼̖֚b +a〪𝅼̖֚b +a〪𝅼̖֚b +a〪𝅼̖֚b + +a〪̖𝅽֚b +a〪̖𝅽֚b +a〪̖𝅽֚b +a〪̖𝅽֚b +a〪̖𝅽֚b + +a〪𝅽̖֚b +a〪𝅽̖֚b +a〪𝅽̖֚b +a〪𝅽̖֚b +a〪𝅽̖֚b + +a〪̖𝅾֚b +a〪̖𝅾֚b +a〪̖𝅾֚b +a〪̖𝅾֚b +a〪̖𝅾֚b + +a〪𝅾̖֚b +a〪𝅾̖֚b +a〪𝅾̖֚b +a〪𝅾̖֚b +a〪𝅾̖֚b + +a〪̖𝅿֚b +a〪̖𝅿֚b +a〪̖𝅿֚b +a〪̖𝅿֚b +a〪̖𝅿֚b + +a〪𝅿̖֚b +a〪𝅿̖֚b +a〪𝅿̖֚b +a〪𝅿̖֚b +a〪𝅿̖֚b + +a〪̖𝆀֚b +a〪̖𝆀֚b +a〪̖𝆀֚b +a〪̖𝆀֚b +a〪̖𝆀֚b + +a〪𝆀̖֚b +a〪𝆀̖֚b +a〪𝆀̖֚b +a〪𝆀̖֚b +a〪𝆀̖֚b + +a〪̖𝆁֚b +a〪̖𝆁֚b +a〪̖𝆁֚b +a〪̖𝆁֚b +a〪̖𝆁֚b + +a〪𝆁̖֚b +a〪𝆁̖֚b +a〪𝆁̖֚b +a〪𝆁̖֚b +a〪𝆁̖֚b + +a〪̖𝆂֚b +a〪̖𝆂֚b +a〪̖𝆂֚b +a〪̖𝆂֚b +a〪̖𝆂֚b + +a〪𝆂̖֚b +a〪𝆂̖֚b +a〪𝆂̖֚b +a〪𝆂̖֚b +a〪𝆂̖֚b + +à֮𝆅̕b +à֮𝆅̕b +à֮𝆅̕b +à֮𝆅̕b +à֮𝆅̕b + +a֮𝆅̀̕b +a֮𝆅̀̕b +a֮𝆅̀̕b +a֮𝆅̀̕b +a֮𝆅̀̕b + +à֮𝆆̕b +à֮𝆆̕b +à֮𝆆̕b +à֮𝆆̕b +à֮𝆆̕b + +a֮𝆆̀̕b +a֮𝆆̀̕b +a֮𝆆̀̕b +a֮𝆆̀̕b +a֮𝆆̀̕b + +à֮𝆇̕b +à֮𝆇̕b +à֮𝆇̕b +à֮𝆇̕b +à֮𝆇̕b + +a֮𝆇̀̕b +a֮𝆇̀̕b +a֮𝆇̀̕b +a֮𝆇̀̕b +a֮𝆇̀̕b + +à֮𝆈̕b +à֮𝆈̕b +à֮𝆈̕b +à֮𝆈̕b +à֮𝆈̕b + +a֮𝆈̀̕b +a֮𝆈̀̕b +a֮𝆈̀̕b +a֮𝆈̀̕b +a֮𝆈̀̕b + +à֮𝆉̕b +à֮𝆉̕b +à֮𝆉̕b +à֮𝆉̕b +à֮𝆉̕b + +a֮𝆉̀̕b +a֮𝆉̀̕b +a֮𝆉̀̕b +a֮𝆉̀̕b +a֮𝆉̀̕b + +a〪̖𝆊֚b +a〪̖𝆊֚b +a〪̖𝆊֚b +a〪̖𝆊֚b +a〪̖𝆊֚b + +a〪𝆊̖֚b +a〪𝆊̖֚b +a〪𝆊̖֚b +a〪𝆊̖֚b +a〪𝆊̖֚b + +a〪̖𝆋֚b +a〪̖𝆋֚b +a〪̖𝆋֚b +a〪̖𝆋֚b +a〪̖𝆋֚b + +a〪𝆋̖֚b +a〪𝆋̖֚b +a〪𝆋̖֚b +a〪𝆋̖֚b +a〪𝆋̖֚b + +à֮𝆪̕b +à֮𝆪̕b +à֮𝆪̕b +à֮𝆪̕b +à֮𝆪̕b + +a֮𝆪̀̕b +a֮𝆪̀̕b +a֮𝆪̀̕b +a֮𝆪̀̕b +a֮𝆪̀̕b + +à֮𝆫̕b +à֮𝆫̕b +à֮𝆫̕b +à֮𝆫̕b +à֮𝆫̕b + +a֮𝆫̀̕b +a֮𝆫̀̕b +a֮𝆫̀̕b +a֮𝆫̀̕b +a֮𝆫̀̕b + +à֮𝆬̕b +à֮𝆬̕b +à֮𝆬̕b +à֮𝆬̕b +à֮𝆬̕b + +a֮𝆬̀̕b +a֮𝆬̀̕b +a֮𝆬̀̕b +a֮𝆬̀̕b +a֮𝆬̀̕b + +à֮𝆭̕b +à֮𝆭̕b +à֮𝆭̕b +à֮𝆭̕b +à֮𝆭̕b + +a֮𝆭̀̕b +a֮𝆭̀̕b +a֮𝆭̀̕b +a֮𝆭̀̕b +a֮𝆭̀̕b + +à֮𝉂̕b +à֮𝉂̕b +à֮𝉂̕b +à֮𝉂̕b +à֮𝉂̕b + +a֮𝉂̀̕b +a֮𝉂̀̕b +a֮𝉂̀̕b +a֮𝉂̀̕b +a֮𝉂̀̕b + +à֮𝉃̕b +à֮𝉃̕b +à֮𝉃̕b +à֮𝉃̕b +à֮𝉃̕b + +a֮𝉃̀̕b +a֮𝉃̀̕b +a֮𝉃̀̕b +a֮𝉃̀̕b +a֮𝉃̀̕b + +à֮𝉄̕b +à֮𝉄̕b +à֮𝉄̕b +à֮𝉄̕b +à֮𝉄̕b + +a֮𝉄̀̕b +a֮𝉄̀̕b +a֮𝉄̀̕b +a֮𝉄̀̕b +a֮𝉄̀̕b + +ে̴া +ে̴া +ে̴া +ে̴া +ে̴া + +ে̴ৗ +ে̴ৗ +ে̴ৗ +ে̴ৗ +ে̴ৗ + +େ̴ା +େ̴ା +େ̴ା +େ̴ା +େ̴ା + +େ̴ୖ +େ̴ୖ +େ̴ୖ +େ̴ୖ +େ̴ୖ + +େ̴ୗ +େ̴ୗ +େ̴ୗ +େ̴ୗ +େ̴ୗ + +ஒ̴ௗ +ஒ̴ௗ +ஒ̴ௗ +ஒ̴ௗ +ஒ̴ௗ + +ெ̴ா +ெ̴ா +ெ̴ா +ெ̴ா +ெ̴ா + +ெ̴ௗ +ெ̴ௗ +ெ̴ௗ +ெ̴ௗ +ெ̴ௗ + +ே̴ா +ே̴ா +ே̴ா +ே̴ா +ே̴ா + +ಿ̴ೕ +ಿ̴ೕ +ಿ̴ೕ +ಿ̴ೕ +ಿ̴ೕ + +ೆ̴ೂ +ೆ̴ೂ +ೆ̴ೂ +ೆ̴ೂ +ೆ̴ೂ + +ೆ̴ೕ +ೆ̴ೕ +ೆ̴ೕ +ೆ̴ೕ +ೆ̴ೕ + +ೆ̴ೖ +ೆ̴ೖ +ೆ̴ೖ +ೆ̴ೖ +ೆ̴ೖ + +ೊ̴ೕ +ೊ̴ೕ +ೊ̴ೕ +ೊ̴ೕ +ೊ̴ೕ + +െ̴ാ +െ̴ാ +െ̴ാ +െ̴ാ +െ̴ാ + +െ̴ൗ +െ̴ൗ +െ̴ൗ +െ̴ൗ +െ̴ൗ + +േ̴ാ +േ̴ാ +േ̴ാ +േ̴ാ +േ̴ാ + +ෙ̴ා +ෙ̴ා +ෙ̴ා +ෙ̴ා +ෙ̴ා + +ෙ̴ෟ +ෙ̴ෟ +ෙ̴ෟ +ෙ̴ෟ +ෙ̴ෟ + +ཀ̴ྵ +ཀ̴ྵ +ཀ̴ྵ +ཀ̴ྵ +ཀ̴ྵ + +ག̴ྷ +ག̴ྷ +ག̴ྷ +ག̴ྷ +ག̴ྷ + +ཌ̴ྷ +ཌ̴ྷ +ཌ̴ྷ +ཌ̴ྷ +ཌ̴ྷ + +ད̴ྷ +ད̴ྷ +ད̴ྷ +ད̴ྷ +ད̴ྷ + +བ̴ྷ +བ̴ྷ +བ̴ྷ +བ̴ྷ +བ̴ྷ + +ཛ̴ྷ +ཛ̴ྷ +ཛ̴ྷ +ཛ̴ྷ +ཛ̴ྷ + +ྐ̴ྵ +ྐ̴ྵ +ྐ̴ྵ +ྐ̴ྵ +ྐ̴ྵ + +ྒ̴ྷ +ྒ̴ྷ +ྒ̴ྷ +ྒ̴ྷ +ྒ̴ྷ + +ྜ̴ྷ +ྜ̴ྷ +ྜ̴ྷ +ྜ̴ྷ +ྜ̴ྷ + +ྡ̴ྷ +ྡ̴ྷ +ྡ̴ྷ +ྡ̴ྷ +ྡ̴ྷ + +ྦ̴ྷ +ྦ̴ྷ +ྦ̴ྷ +ྦ̴ྷ +ྦ̴ྷ + +ྫ̴ྷ +ྫ̴ྷ +ྫ̴ྷ +ྫ̴ྷ +ྫ̴ྷ + +ဥ̴ီ +ဥ̴ီ +ဥ̴ီ +ဥ̴ီ +ဥ̴ီ + +ᄀ̴ᅡ +ᄀ̴ᅡ +ᄀ̴ᅡ +ᄀ̴ᅡ +ᄀ̴ᅡ + +ᄀ̴ᅮ +ᄀ̴ᅮ +ᄀ̴ᅮ +ᄀ̴ᅮ +ᄀ̴ᅮ + +ᄁ̴ᅦ +ᄁ̴ᅦ +ᄁ̴ᅦ +ᄁ̴ᅦ +ᄁ̴ᅦ + +ᄁ̴ᅳ +ᄁ̴ᅳ +ᄁ̴ᅳ +ᄁ̴ᅳ +ᄁ̴ᅳ + +ᄂ̴ᅫ +ᄂ̴ᅫ +ᄂ̴ᅫ +ᄂ̴ᅫ +ᄂ̴ᅫ + +ᄃ̴ᅣ +ᄃ̴ᅣ +ᄃ̴ᅣ +ᄃ̴ᅣ +ᄃ̴ᅣ + +ᄃ̴ᅰ +ᄃ̴ᅰ +ᄃ̴ᅰ +ᄃ̴ᅰ +ᄃ̴ᅰ + +ᄄ̴ᅨ +ᄄ̴ᅨ +ᄄ̴ᅨ +ᄄ̴ᅨ +ᄄ̴ᅨ + +ᄄ̴ᅵ +ᄄ̴ᅵ +ᄄ̴ᅵ +ᄄ̴ᅵ +ᄄ̴ᅵ + +ᄅ̴ᅭ +ᄅ̴ᅭ +ᄅ̴ᅭ +ᄅ̴ᅭ +ᄅ̴ᅭ + +ᄆ̴ᅥ +ᄆ̴ᅥ +ᄆ̴ᅥ +ᄆ̴ᅥ +ᄆ̴ᅥ + +ᄆ̴ᅲ +ᄆ̴ᅲ +ᄆ̴ᅲ +ᄆ̴ᅲ +ᄆ̴ᅲ + +ᄇ̴ᅪ +ᄇ̴ᅪ +ᄇ̴ᅪ +ᄇ̴ᅪ +ᄇ̴ᅪ + +ᄈ̴ᅢ +ᄈ̴ᅢ +ᄈ̴ᅢ +ᄈ̴ᅢ +ᄈ̴ᅢ + +ᄈ̴ᅯ +ᄈ̴ᅯ +ᄈ̴ᅯ +ᄈ̴ᅯ +ᄈ̴ᅯ + +ᄉ̴ᅧ +ᄉ̴ᅧ +ᄉ̴ᅧ +ᄉ̴ᅧ +ᄉ̴ᅧ + +ᄉ̴ᅴ +ᄉ̴ᅴ +ᄉ̴ᅴ +ᄉ̴ᅴ +ᄉ̴ᅴ + +ᄊ̴ᅬ +ᄊ̴ᅬ +ᄊ̴ᅬ +ᄊ̴ᅬ +ᄊ̴ᅬ + +ᄋ̴ᅤ +ᄋ̴ᅤ +ᄋ̴ᅤ +ᄋ̴ᅤ +ᄋ̴ᅤ + +ᄋ̴ᅱ +ᄋ̴ᅱ +ᄋ̴ᅱ +ᄋ̴ᅱ +ᄋ̴ᅱ + +ᄌ̴ᅩ +ᄌ̴ᅩ +ᄌ̴ᅩ +ᄌ̴ᅩ +ᄌ̴ᅩ + +ᄍ̴ᅡ +ᄍ̴ᅡ +ᄍ̴ᅡ +ᄍ̴ᅡ +ᄍ̴ᅡ + +ᄍ̴ᅮ +ᄍ̴ᅮ +ᄍ̴ᅮ +ᄍ̴ᅮ +ᄍ̴ᅮ + +ᄎ̴ᅦ +ᄎ̴ᅦ +ᄎ̴ᅦ +ᄎ̴ᅦ +ᄎ̴ᅦ + +ᄎ̴ᅳ +ᄎ̴ᅳ +ᄎ̴ᅳ +ᄎ̴ᅳ +ᄎ̴ᅳ + +ᄏ̴ᅫ +ᄏ̴ᅫ +ᄏ̴ᅫ +ᄏ̴ᅫ +ᄏ̴ᅫ + +ᄐ̴ᅣ +ᄐ̴ᅣ +ᄐ̴ᅣ +ᄐ̴ᅣ +ᄐ̴ᅣ + +ᄐ̴ᅰ +ᄐ̴ᅰ +ᄐ̴ᅰ +ᄐ̴ᅰ +ᄐ̴ᅰ + +ᄑ̴ᅨ +ᄑ̴ᅨ +ᄑ̴ᅨ +ᄑ̴ᅨ +ᄑ̴ᅨ + +ᄑ̴ᅵ +ᄑ̴ᅵ +ᄑ̴ᅵ +ᄑ̴ᅵ +ᄑ̴ᅵ + +ᄒ̴ᅭ +ᄒ̴ᅭ +ᄒ̴ᅭ +ᄒ̴ᅭ +ᄒ̴ᅭ + +ᬅ̴ᬵ +ᬅ̴ᬵ +ᬅ̴ᬵ +ᬅ̴ᬵ +ᬅ̴ᬵ + +ᬇ̴ᬵ +ᬇ̴ᬵ +ᬇ̴ᬵ +ᬇ̴ᬵ +ᬇ̴ᬵ + +ᬉ̴ᬵ +ᬉ̴ᬵ +ᬉ̴ᬵ +ᬉ̴ᬵ +ᬉ̴ᬵ + +ᬋ̴ᬵ +ᬋ̴ᬵ +ᬋ̴ᬵ +ᬋ̴ᬵ +ᬋ̴ᬵ + +ᬍ̴ᬵ +ᬍ̴ᬵ +ᬍ̴ᬵ +ᬍ̴ᬵ +ᬍ̴ᬵ + +ᬑ̴ᬵ +ᬑ̴ᬵ +ᬑ̴ᬵ +ᬑ̴ᬵ +ᬑ̴ᬵ + +ᬺ̴ᬵ +ᬺ̴ᬵ +ᬺ̴ᬵ +ᬺ̴ᬵ +ᬺ̴ᬵ + +ᬼ̴ᬵ +ᬼ̴ᬵ +ᬼ̴ᬵ +ᬼ̴ᬵ +ᬼ̴ᬵ + +ᬾ̴ᬵ +ᬾ̴ᬵ +ᬾ̴ᬵ +ᬾ̴ᬵ +ᬾ̴ᬵ + +ᬿ̴ᬵ +ᬿ̴ᬵ +ᬿ̴ᬵ +ᬿ̴ᬵ +ᬿ̴ᬵ + +ᭂ̴ᬵ +ᭂ̴ᬵ +ᭂ̴ᬵ +ᭂ̴ᬵ +ᭂ̴ᬵ + +걔̴ᆮ +걔̴ᆮ +걔̴ᆮ +걔̴ᆮ +걔̴ᆮ + +겨̴ᆵ +겨̴ᆵ +겨̴ᆵ +겨̴ᆵ +겨̴ᆵ + +과̴ᆼ +과̴ᆼ +과̴ᆼ +과̴ᆼ +과̴ᆼ + +귀̴ᆮ +귀̴ᆮ +귀̴ᆮ +귀̴ᆮ +귀̴ᆮ + +긔̴ᆵ +긔̴ᆵ +긔̴ᆵ +긔̴ᆵ +긔̴ᆵ + +깨̴ᆼ +깨̴ᆼ +깨̴ᆼ +깨̴ᆼ +깨̴ᆼ + +꼬̴ᆮ +꼬̴ᆮ +꼬̴ᆮ +꼬̴ᆮ +꼬̴ᆮ + +꾀̴ᆵ +꾀̴ᆵ +꾀̴ᆵ +꾀̴ᆵ +꾀̴ᆵ + +꿔̴ᆼ +꿔̴ᆼ +꿔̴ᆼ +꿔̴ᆼ +꿔̴ᆼ + +나̴ᆮ +나̴ᆮ +나̴ᆮ +나̴ᆮ +나̴ᆮ + +냬̴ᆵ +냬̴ᆵ +냬̴ᆵ +냬̴ᆵ +냬̴ᆵ + +녀̴ᆼ +녀̴ᆼ +녀̴ᆼ +녀̴ᆼ +녀̴ᆼ + +누̴ᆮ +누̴ᆮ +누̴ᆮ +누̴ᆮ +누̴ᆮ + +뉘̴ᆵ +뉘̴ᆵ +뉘̴ᆵ +뉘̴ᆵ +뉘̴ᆵ + +늬̴ᆼ +늬̴ᆼ +늬̴ᆼ +늬̴ᆼ +늬̴ᆼ + +데̴ᆮ +데̴ᆮ +데̴ᆮ +데̴ᆮ +데̴ᆮ + +도̴ᆵ +도̴ᆵ +도̴ᆵ +도̴ᆵ +도̴ᆵ + +되̴ᆼ +되̴ᆼ +되̴ᆼ +되̴ᆼ +되̴ᆼ + +드̴ᆮ +드̴ᆮ +드̴ᆮ +드̴ᆮ +드̴ᆮ + +따̴ᆵ +따̴ᆵ +따̴ᆵ +따̴ᆵ +따̴ᆵ + +떄̴ᆼ +떄̴ᆼ +떄̴ᆼ +떄̴ᆼ +떄̴ᆼ + +뙈̴ᆮ +뙈̴ᆮ +뙈̴ᆮ +뙈̴ᆮ +뙈̴ᆮ + +뚜̴ᆵ +뚜̴ᆵ +뚜̴ᆵ +뚜̴ᆵ +뚜̴ᆵ + +뛰̴ᆼ +뛰̴ᆼ +뛰̴ᆼ +뛰̴ᆼ +뛰̴ᆼ + +랴̴ᆮ +랴̴ᆮ +랴̴ᆮ +랴̴ᆮ +랴̴ᆮ + +레̴ᆵ +레̴ᆵ +레̴ᆵ +레̴ᆵ +레̴ᆵ + +로̴ᆼ +로̴ᆼ +로̴ᆼ +로̴ᆼ +로̴ᆼ + +뤠̴ᆮ +뤠̴ᆮ +뤠̴ᆮ +뤠̴ᆮ +뤠̴ᆮ + +르̴ᆵ +르̴ᆵ +르̴ᆵ +르̴ᆵ +르̴ᆵ + +마̴ᆼ +마̴ᆼ +마̴ᆼ +마̴ᆼ +마̴ᆼ + +몌̴ᆮ +몌̴ᆮ +몌̴ᆮ +몌̴ᆮ +몌̴ᆮ + +뫠̴ᆵ +뫠̴ᆵ +뫠̴ᆵ +뫠̴ᆵ +뫠̴ᆵ + +무̴ᆼ +무̴ᆼ +무̴ᆼ +무̴ᆼ +무̴ᆼ + +미̴ᆮ +미̴ᆮ +미̴ᆮ +미̴ᆮ +미̴ᆮ + +뱌̴ᆵ +뱌̴ᆵ +뱌̴ᆵ +뱌̴ᆵ +뱌̴ᆵ + +베̴ᆼ +베̴ᆼ +베̴ᆼ +베̴ᆼ +베̴ᆼ + +뵤̴ᆮ +뵤̴ᆮ +뵤̴ᆮ +뵤̴ᆮ +뵤̴ᆮ + +붸̴ᆵ +붸̴ᆵ +붸̴ᆵ +붸̴ᆵ +붸̴ᆵ + +브̴ᆼ +브̴ᆼ +브̴ᆼ +브̴ᆼ +브̴ᆼ + +뻐̴ᆮ +뻐̴ᆮ +뻐̴ᆮ +뻐̴ᆮ +뻐̴ᆮ + +뼤̴ᆵ +뼤̴ᆵ +뼤̴ᆵ +뼤̴ᆵ +뼤̴ᆵ + +뽸̴ᆼ +뽸̴ᆼ +뽸̴ᆼ +뽸̴ᆼ +뽸̴ᆼ + +쀼̴ᆮ +쀼̴ᆮ +쀼̴ᆮ +쀼̴ᆮ +쀼̴ᆮ + +삐̴ᆵ +삐̴ᆵ +삐̴ᆵ +삐̴ᆵ +삐̴ᆵ + +샤̴ᆼ +샤̴ᆼ +샤̴ᆼ +샤̴ᆼ +샤̴ᆼ + +솨̴ᆮ +솨̴ᆮ +솨̴ᆮ +솨̴ᆮ +솨̴ᆮ + +쇼̴ᆵ +쇼̴ᆵ +쇼̴ᆵ +쇼̴ᆵ +쇼̴ᆵ + +쉐̴ᆼ +쉐̴ᆼ +쉐̴ᆼ +쉐̴ᆼ +쉐̴ᆼ + +쌔̴ᆮ +쌔̴ᆮ +쌔̴ᆮ +쌔̴ᆮ +쌔̴ᆮ + +써̴ᆵ +써̴ᆵ +써̴ᆵ +써̴ᆵ +써̴ᆵ + +쎼̴ᆼ +쎼̴ᆼ +쎼̴ᆼ +쎼̴ᆼ +쎼̴ᆼ + +쒀̴ᆮ +쒀̴ᆮ +쒀̴ᆮ +쒀̴ᆮ +쒀̴ᆮ + +쓔̴ᆵ +쓔̴ᆵ +쓔̴ᆵ +쓔̴ᆵ +쓔̴ᆵ + +씨̴ᆼ +씨̴ᆼ +씨̴ᆼ +씨̴ᆼ +씨̴ᆼ + +여̴ᆮ +여̴ᆮ +여̴ᆮ +여̴ᆮ +여̴ᆮ + +와̴ᆵ +와̴ᆵ +와̴ᆵ +와̴ᆵ +와̴ᆵ + +요̴ᆼ +요̴ᆼ +요̴ᆼ +요̴ᆼ +요̴ᆼ + +의̴ᆮ +의̴ᆮ +의̴ᆮ +의̴ᆮ +의̴ᆮ + +재̴ᆵ +재̴ᆵ +재̴ᆵ +재̴ᆵ +재̴ᆵ + +저̴ᆼ +저̴ᆼ +저̴ᆼ +저̴ᆼ +저̴ᆼ + +죄̴ᆮ +죄̴ᆮ +죄̴ᆮ +죄̴ᆮ +죄̴ᆮ + +줘̴ᆵ +줘̴ᆵ +줘̴ᆵ +줘̴ᆵ +줘̴ᆵ + +쥬̴ᆼ +쥬̴ᆼ +쥬̴ᆼ +쥬̴ᆼ +쥬̴ᆼ + +쨰̴ᆮ +쨰̴ᆮ +쨰̴ᆮ +쨰̴ᆮ +쨰̴ᆮ + +쪄̴ᆵ +쪄̴ᆵ +쪄̴ᆵ +쪄̴ᆵ +쪄̴ᆵ + +쫘̴ᆼ +쫘̴ᆼ +쫘̴ᆼ +쫘̴ᆼ +쫘̴ᆼ + +쮜̴ᆮ +쮜̴ᆮ +쮜̴ᆮ +쮜̴ᆮ +쮜̴ᆮ + +쯰̴ᆵ +쯰̴ᆵ +쯰̴ᆵ +쯰̴ᆵ +쯰̴ᆵ + +채̴ᆼ +채̴ᆼ +채̴ᆼ +채̴ᆼ +채̴ᆼ + +초̴ᆮ +초̴ᆮ +초̴ᆮ +초̴ᆮ +초̴ᆮ + +최̴ᆵ +최̴ᆵ +최̴ᆵ +최̴ᆵ +최̴ᆵ + +춰̴ᆼ +춰̴ᆼ +춰̴ᆼ +춰̴ᆼ +춰̴ᆼ + +카̴ᆮ +카̴ᆮ +카̴ᆮ +카̴ᆮ +카̴ᆮ + +컈̴ᆵ +컈̴ᆵ +컈̴ᆵ +컈̴ᆵ +컈̴ᆵ + +켜̴ᆼ +켜̴ᆼ +켜̴ᆼ +켜̴ᆼ +켜̴ᆼ + +쿠̴ᆮ +쿠̴ᆮ +쿠̴ᆮ +쿠̴ᆮ +쿠̴ᆮ + +퀴̴ᆵ +퀴̴ᆵ +퀴̴ᆵ +퀴̴ᆵ +퀴̴ᆵ + +킈̴ᆼ +킈̴ᆼ +킈̴ᆼ +킈̴ᆼ +킈̴ᆼ + +테̴ᆮ +테̴ᆮ +테̴ᆮ +테̴ᆮ +테̴ᆮ + +토̴ᆵ +토̴ᆵ +토̴ᆵ +토̴ᆵ +토̴ᆵ + +퇴̴ᆼ +퇴̴ᆼ +퇴̴ᆼ +퇴̴ᆼ +퇴̴ᆼ + +트̴ᆮ +트̴ᆮ +트̴ᆮ +트̴ᆮ +트̴ᆮ + +파̴ᆵ +파̴ᆵ +파̴ᆵ +파̴ᆵ +파̴ᆵ + +퍠̴ᆼ +퍠̴ᆼ +퍠̴ᆼ +퍠̴ᆼ +퍠̴ᆼ + +퐤̴ᆮ +퐤̴ᆮ +퐤̴ᆮ +퐤̴ᆮ +퐤̴ᆮ + +푸̴ᆵ +푸̴ᆵ +푸̴ᆵ +푸̴ᆵ +푸̴ᆵ + +퓌̴ᆼ +퓌̴ᆼ +퓌̴ᆼ +퓌̴ᆼ +퓌̴ᆼ + +햐̴ᆮ +햐̴ᆮ +햐̴ᆮ +햐̴ᆮ +햐̴ᆮ + +헤̴ᆵ +헤̴ᆵ +헤̴ᆵ +헤̴ᆵ +헤̴ᆵ + +호̴ᆼ +호̴ᆼ +호̴ᆼ +호̴ᆼ +호̴ᆼ + +훼̴ᆮ +훼̴ᆮ +훼̴ᆮ +훼̴ᆮ +훼̴ᆮ + +흐̴ᆵ +흐̴ᆵ +흐̴ᆵ +흐̴ᆵ +흐̴ᆵ + +マジ?! +マジ?! +マジ?! +マジ?! +マジ?! + +(゚ペ) +(゚ペ) +(゚ペ) +(゚ペ) +(゚ペ) + +(つ`Å´)つ +(つ`Å´)つ +(つ`Å´)つ +(つ`Å ́)つ +(つ`Å ́)つ + +(*´゚艸゚`*) +(*´゚艸゚`*) +(*´゚艸゚`*) +(* ゚́艸゚`*) +(* ゚́艸゚`*) + diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/test/test_unf.rb b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/test/test_unf.rb new file mode 100644 index 000000000000..b71e5a0dcf3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/test/test_unf.rb @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +require 'helper' +require 'pathname' + +class TestUNF < Test::Unit::TestCase + should "raise ArgumentError if an unknown normalization form is given" do + normalizer = UNF::Normalizer.instance + assert_raises(ArgumentError) { normalizer.normalize("が", :nfck) } + end + + should "pass all tests bundled with the original unf" do + normalizer = UNF::Normalizer.instance + open(Pathname(__FILE__).dirname + 'normalization-test.txt', 'r:utf-8').each_slice(6) { |lines| + flunk "broken test file" if lines.size != 6 || lines.pop !~ /^$/ + str, nfd, nfc, nfkd, nfkc = lines + assert nfd, normalizer.normalize(str, :nfd) + assert nfd, normalizer.normalize(nfd, :nfd) + assert nfd, normalizer.normalize(nfc, :nfd) + assert nfkd, normalizer.normalize(nfkc, :nfd) + assert nfkd, normalizer.normalize(nfkc, :nfd) + + assert nfc, normalizer.normalize(str, :nfd) + assert nfc, normalizer.normalize(nfd, :nfc) + assert nfc, normalizer.normalize(nfc, :nfc) + assert nfkc, normalizer.normalize(nfkc, :nfc) + assert nfkc, normalizer.normalize(nfkd, :nfc) + + assert nfkd, normalizer.normalize(str, :nfkd) + assert nfkd, normalizer.normalize(nfd, :nfkd) + assert nfkd, normalizer.normalize(nfc, :nfkd) + assert nfkd, normalizer.normalize(nfkc, :nfkd) + assert nfkd, normalizer.normalize(nfkd, :nfkd) + + assert nfkc, normalizer.normalize(str, :nfkc) + assert nfkc, normalizer.normalize(nfd, :nfkc) + assert nfkc, normalizer.normalize(nfc, :nfkc) + assert nfkc, normalizer.normalize(nfkc, :nfkc) + assert nfkc, normalizer.normalize(nfkd, :nfkc) + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/unf.gemspec b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/unf.gemspec new file mode 100644 index 000000000000..2d43004b70e2 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf-0.1.4/unf.gemspec @@ -0,0 +1,35 @@ +# -*- encoding: utf-8 -*- +require File.expand_path('../lib/unf/version', __FILE__) + +Gem::Specification.new do |gem| + gem.name = "unf" + gem.version = UNF::VERSION + gem.authors = ["Akinori MUSHA"] + gem.email = ["knu@idaemons.org"] + gem.description = <<-'EOS' +This is a wrapper library to bring Unicode Normalization Form support +to Ruby/JRuby. + EOS + gem.summary = %q{A wrapper library to bring Unicode Normalization Form support to Ruby/JRuby} + gem.homepage = "https://github.com/knu/ruby-unf" + gem.platform = defined?(JRUBY_VERSION) ? 'java' : Gem::Platform::RUBY + gem.license = "2-clause BSDL" + + gem.files = `git ls-files`.split("\n") + gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } + gem.test_files = gem.files.grep(%r{^(test|spec|features)/.*\.rb}) + gem.require_paths = ["lib"] + gem.extra_rdoc_files = ['README.md', 'LICENSE'] + + gem.add_dependency 'unf_ext', '>= 0' unless defined?(JRUBY_VERSION) + + gem.add_development_dependency 'shoulda', [RUBY_VERSION < '1.9' ? '< 3.5.0' : '>= 0'] + if RUBY_VERSION < '1.9' + # Cap dependency on activesupport with < 4.0 on behalf of + # shoulda-matchers to satisfy bundler. + gem.add_development_dependency 'activesupport', ['< 4.0'] + end + gem.add_development_dependency 'bundler', '>= 1.2.0' + gem.add_development_dependency 'rake', '>= 0.9.2.2' + gem.add_development_dependency 'rdoc', '> 2.4.2' +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/.document b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/.document new file mode 100644 index 000000000000..3d618dd8f9f5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/.document @@ -0,0 +1,5 @@ +lib/**/*.rb +bin/* +- +features/**/*.feature +LICENSE.txt diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/.gitignore b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/.gitignore new file mode 100644 index 000000000000..bffaafc18d0e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/.gitignore @@ -0,0 +1,19 @@ +*.gem +*.rbc +*.so +.bundle +.config +.yardoc +Gemfile.lock +InstalledFiles +_yardoc +coverage +doc/ +lib/bundler/man +ext/*/Makefile +pkg +rdoc +spec/reports +test/tmp +test/version_tmp +tmp diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/.travis.yml b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/.travis.yml new file mode 100644 index 000000000000..904721defe68 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/.travis.yml @@ -0,0 +1,22 @@ +language: ruby +sudo: false +rvm: + - 1.8.7 + - ree + - 1.9.3 + - 2.0 + - 2.1 + - 2.2 + - 2.3 + - 2.4 + - 2.5 + - 2.6 + - 2.7 + - ruby-head +matrix: + allow_failures: + - rvm: ruby-head +before_install: + - gem update --system --conservative || gem install --conservative bundler -v '<2' +before_script: + - rake compile diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/CHANGELOG.md new file mode 100644 index 000000000000..b3069a4af332 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/CHANGELOG.md @@ -0,0 +1,46 @@ +## 0.0.7.7 (2019-03-19) + +- Include Windows binaries for Ruby 2.7. + +## 0.0.7.6 (2019-03-19) + +- Include Windows binaries for Ruby 2.6. + +## 0.0.7.5 (2018-02-06) + +- Include Windows binaries for Ruby 2.5. + +## 0.0.7.4 (2017-04-19) + +- Fix build on ARM and GCC 6 again. + +## 0.0.7.3 (2017-04-11) + +- Update the base Unicode version to 9. + +- Fix compile issues on ARM and GCC 6. + +## 0.0.7.2 (2016-02-01) + +- Include Windows binaries for Ruby 2.3. + +## 0.0.7.1 (2015-04-18) + +- Windows fat binary gems no longer require libstd++ to + run, which are statically linked. + +- Add a fat binary gem for x64-mingw32 (64bit Windows). + +- Windows fat binary gems now include binaries for Ruby up to 2.2. + +## 0.0.6 (2013-02-16) + +- Migrate from Jeweler to Bundler. + +## 0.0.5 (2012-05-30) + +- Fix a type error for strict compilers. + +## 0.0.4 (2011-12-08) + +- Release under the current name of `unf_ext`. diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/Gemfile b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/Gemfile new file mode 100644 index 000000000000..82609cf8cc25 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in ruby-unf_ext.gemspec +gemspec diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/LICENSE.txt new file mode 100644 index 000000000000..a0a463139faf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/LICENSE.txt @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2010 Takeru Ohta <phjgt308@gmail.com> +Copyright (c) 2011-2018 Akinori MUSHA <knu@idaemons.org> (extended Ruby support) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/README.md b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/README.md new file mode 100644 index 000000000000..3377e03df75f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/README.md @@ -0,0 +1,57 @@ +ruby-unf_ext +============ + +Synopsis +-------- + +* Unicode Normalization Form support library for CRuby + +Description +----------- + +* Normalizes UTF-8 strings into and from NFC, NFD, NFKC or NFKD + + # For bulk conversion + normalizer = UNF::Normalizer.new + a_bunch_of_strings.map! { |string| + normalizer.normalize(string, :nfc) #=> string in NFC + } + +* Compliant with Unicode 9.0 + +Requirement +----------- + +* Ruby 1.8.7+, 1.9.2+ + +* C++ compiler and libstdc++ + +Installation +------------ + + gem install unf_ext + +Or: + + ruby extconf.rb && make && make install + +Development Resources +--------------------- + +* https://github.com/sile/unf + + For issues regarding files under the directory `unf`, please + contact this upstream. + +* https://github.com/knu/ruby-unf_ext + + The development site and the repository. + +License +------- + +Copyright (c) 2010-2017 Takeru Ohta +Copyright (c) 2011-2018 Akinori MUSHA + +Licensed under the MIT license. +See `LICENSE` for details. diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/Rakefile b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/Rakefile new file mode 100644 index 000000000000..cb3e8faecb87 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/Rakefile @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +require 'bundler/gem_tasks' + +gemspec = Bundler::GemHelper.gemspec + +require 'rake/extensiontask' +Rake::ExtensionTask.new('unf_ext', gemspec) do |ext| + ext.cross_compile = true + ext.cross_platform = %w[x86-mingw32 x64-mingw32] + ext.cross_config_options << '--with-ldflags="-static-libgcc"' << '--with-static-libstdc++' +end + +namespace :gem do + task :native do + require 'rake_compiler_dock' + RakeCompilerDock.sh "(bundle --local --quiet || bundle) && rake cross native gem" + end + + task :all => [:build, :native] +end + +task :gems => :'gem:all' + +require 'rake/testtask' +Rake::TestTask.new(:test) do |test| + test.libs << 'test' + test.test_files = gemspec.test_files + test.verbose = true +end + +task :default => :test diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/.sitearchdir.time b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/.sitearchdir.time new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/extconf.rb b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/extconf.rb new file mode 100644 index 000000000000..d506cc3645c7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/extconf.rb @@ -0,0 +1,50 @@ +require 'mkmf' + +if with_config('static-libstdc++') + $LDFLAGS << ' ' << `#{CONFIG['CC']} -print-file-name=libstdc++.a`.chomp +else + have_library('stdc++') + + case RbConfig::CONFIG['host_os'] + when /solaris(!?2.11)/ + # Do a little trickery here to enable C++ standard on Solaris 11 if found. + # This also forces 64bit compilation mode. + $CXX = CONFIG['CXX'] + $CXX << ' ' << '-m64' + $CFLAGS = CONFIG['CFLAGS'].gsub(/-std=c99/, '') + $CFLAGS << ' ' << '-m64 -std=c++11' + $CPPFLAGS = CONFIG['CFLAGS'].gsub(/-std=c99/, '') + $CPPFLAGS << ' ' << '-m64 -std=c++11' + $CXXFLAGS = CONFIG['CFLAGS'].gsub(/-std=c99/, '') + $CXXFLAGS << ' ' << '-m64 -std=c++11' + when /aix/ + # Compiler flags necessary on AIX. + # rubocop:disable Style/GlobalVars + $CFLAGS << ' ' << '-D_ALL_SOURCE=1' + $CPPFLAGS << ' ' << '-D_ALL_SOURCE=1' + $CXXFLAGS << ' ' << '-D_ALL_SOURCE=1' + end +end + +create_makefile 'unf_ext' + +unless CONFIG['CXX'] + case CONFIG['CC'] + when %r{((?:.*[-/])?)gcc([-0-9.]*)$} + cxx = $1 + 'g++' + $2 + when %r{((?:.*[-/])?)clang([-0-9.]*)$} + cxx = $1 + 'clang++' + $2 + else + cxx = CONFIG['CC'] + end + + warn "CXX is automatically set to #{cxx}" + + new_mf = <<-EOF << File.read('Makefile') +CXX=#{cxx} + EOF + + File.open('Makefile', 'w') { |mf| + mf.print new_mf + } +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf.cc b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf.cc new file mode 100644 index 000000000000..19338f9f6f80 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf.cc @@ -0,0 +1,75 @@ +#include "unf/normalizer.hh" + +#include <ruby.h> +#if defined(HAVE_RUBY_ENCODING_H) +#include <ruby/encoding.h> +#endif + +extern "C" { + VALUE unf_allocate(VALUE klass); + VALUE unf_initialize(VALUE self); + void unf_delete(UNF::Normalizer* ptr); + VALUE unf_normalize(VALUE self, VALUE source, VALUE normalization_form); + + ID FORM_NFD; + ID FORM_NFC; + ID FORM_NFKD; + ID FORM_NFKC; + + void Init_unf_ext() { + VALUE mdl = rb_define_module("UNF"); + + VALUE cls = rb_define_class_under(mdl, "Normalizer", rb_cObject); + rb_define_alloc_func(cls, unf_allocate); + rb_define_method(cls, "initialize", (VALUE (*)(...))unf_initialize, 0); + rb_define_method(cls, "normalize", (VALUE (*)(...))unf_normalize, 2); + + FORM_NFD = rb_intern("nfd"); + FORM_NFC = rb_intern("nfc"); + FORM_NFKD= rb_intern("nfkd"); + FORM_NFKC= rb_intern("nfkc"); + } + + + VALUE unf_allocate(VALUE klass) { + UNF::Normalizer* ptr; + VALUE obj = Data_Make_Struct(klass, UNF::Normalizer, NULL, unf_delete, ptr); + new ((void*)ptr) UNF::Normalizer; + return obj; + } + + VALUE unf_initialize(VALUE self) { + return self; + } + + void unf_delete(UNF::Normalizer* ptr) { + ptr->~Normalizer(); + ruby_xfree(ptr); + } + + VALUE unf_normalize(VALUE self, VALUE source, VALUE normalization_form) { + UNF::Normalizer* ptr; + Data_Get_Struct(self, UNF::Normalizer, ptr); + + const char* src = StringValueCStr(source); + const char* rlt; + ID form_id = SYM2ID(normalization_form); + + if(form_id == FORM_NFD) + rlt = ptr->normalize(src, UNF::Normalizer::FORM_NFD); + else if(form_id == FORM_NFC) + rlt = ptr->normalize(src, UNF::Normalizer::FORM_NFC); + else if(form_id == FORM_NFKD) + rlt = ptr->normalize(src, UNF::Normalizer::FORM_NFKD); + else if(form_id == FORM_NFKC) + rlt = ptr->normalize(src, UNF::Normalizer::FORM_NFKC); + else + rb_raise(rb_eArgError, "Specified Normalization-Form is unknown. Please select one from among :nfc, :nfd, :nfkc, :nfkd."); + +#if defined(HAVE_RUBY_ENCODING_H) + return rb_enc_str_new(rlt, strlen(rlt), rb_utf8_encoding()); +#else + return rb_str_new2(rlt); +#endif + } +} diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf.o b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf.o new file mode 100644 index 000000000000..d7672ee968bb Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf.o differ diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/normalizer.hh b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/normalizer.hh new file mode 100644 index 000000000000..d20244b18fd4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/normalizer.hh @@ -0,0 +1,139 @@ +#ifndef UNF_NORMALIZER_HH +#define UNF_NORMALIZER_HH + +#include <vector> +#include <string> +#include <algorithm> +#include <cstring> +#include "trie/searcher.hh" +#include "trie/char_stream.hh" +#include "table.hh" +#include "util.hh" + +namespace UNF { + class Normalizer { + public: + enum Form { FORM_NFD, FORM_NFC, FORM_NFKD, FORM_NFKC }; + + public: + Normalizer() + : nf_d(TABLE::NODES, TABLE::CANONICAL_DECOM_ROOT, (const char *)TABLE::STRINGS), + nf_kd(TABLE::NODES, TABLE::COMPATIBILITY_DECOM_ROOT, (const char *)TABLE::STRINGS), + nf_c(TABLE::NODES, TABLE::CANONICAL_COM_ROOT, (const char *)TABLE::STRINGS), + nf_c_qc(TABLE::NODES, TABLE::NFC_ILLEGAL_ROOT), + nf_kc_qc(TABLE::NODES, TABLE::NFKC_ILLEGAL_ROOT), + ccc(TABLE::NODES, TABLE::CANONICAL_CLASS_ROOT) + {} + + const char* normalize(const char* src, Form form) { + switch(form) { + case FORM_NFD: return nfd(src); + case FORM_NFC: return nfc(src); + case FORM_NFKD: return nfkd(src); + case FORM_NFKC: return nfkc(src); + default: return src; + } + } + const char* nfd(const char* src) { return decompose(src, nf_d); } + const char* nfkd(const char* src) { return decompose(src, nf_kd); } + const char* nfc(const char* src) { return compose(src, nf_c_qc, nf_d); } + const char* nfkc(const char* src) { return compose(src, nf_kc_qc, nf_kd); } + + private: + const char* decompose(const char* src, const Trie::NormalizationForm& nf) { + const char* beg = next_invalid_char(src, nf); + if(*beg=='\0') + return src; + + buffer.assign(src, beg); + do { + const char* end = next_valid_starter(beg, nf); + decompose_one(beg, end, nf, buffer); + beg = next_invalid_char(end, nf); + buffer.append(end, beg); + } while(*beg!='\0'); + + return buffer.c_str(); + } + + void decompose_one(const char* beg, const char* end, const Trie::NormalizationForm& nf, std::string& buf) { + unsigned last = buf.size(); + nf.decompose(Trie::RangeCharStream(beg,end), buf); + char* bufbeg = const_cast<char*>(buf.data()); + canonical_combining_class_ordering(bufbeg+last, bufbeg+buf.size()); + } + + const char* compose(const char* src, const Trie::NormalizationForm& nf, const Trie::NormalizationForm& nf_decomp) { + const char* beg = next_invalid_char(src, nf); + if(*beg=='\0') + return src; + + buffer.assign(src, beg); + while(*beg!='\0') { + const char* end = next_valid_starter(beg, nf); + buffer2.clear(); + decompose_one(beg, end, nf_decomp, buffer2); + end = compose_one(buffer2.c_str(), end, buffer); + beg = next_invalid_char(end, nf); + buffer.append(end, beg); + } + + return buffer.c_str(); + } + + const char* compose_one(const char* starter, const char* rest_starter, std::string& buf) { + Trie::CharStreamForComposition in(starter, rest_starter, canonical_classes, buffer3); + while(in.within_first()) + nf_c.compose(in, buf); + return in.cur(); + } + + void canonical_combining_class_ordering(char* beg, const char* end) { + canonical_classes.assign(end-beg+1, 0); // +1 is for sentinel value + ccc.sort(beg, canonical_classes); + } + + const char* next_invalid_char(const char* src, const Trie::NormalizationForm& nf) const { + int last_canonical_class = 0; + const char* cur = Util::nearest_utf8_char_start_point(src); + const char* starter = cur; + + for(; *cur != '\0'; cur = Util::nearest_utf8_char_start_point(cur+1)) { + int canonical_class = ccc.get_class(cur); + if(last_canonical_class > canonical_class && canonical_class != 0) + return starter; + + if(nf.quick_check(cur)==false) + return starter; + + if(canonical_class==0) + starter=cur; + + last_canonical_class = canonical_class; + } + return cur; + } + + const char* next_valid_starter(const char* src, const Trie::NormalizationForm& nf) const { + const char* cur = Util::nearest_utf8_char_start_point(src+1); + while(ccc.get_class(cur)!=0 || nf.quick_check(cur)==false) + cur = Util::nearest_utf8_char_start_point(cur+1); + return cur; + } + + private: + const Trie::NormalizationForm nf_d; + const Trie::NormalizationForm nf_kd; + const Trie::NormalizationForm nf_c; + const Trie::NormalizationForm nf_c_qc; + const Trie::NormalizationForm nf_kc_qc; + const Trie::CanonicalCombiningClass ccc; + + std::string buffer; + std::string buffer2; + std::string buffer3; + std::vector<unsigned char> canonical_classes; + }; +} + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/table.hh b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/table.hh new file mode 100644 index 000000000000..e8c5bab4f4ff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/table.hh @@ -0,0 +1,13617 @@ +#ifndef UNF_TABLE_HH +#define UNF_TABLE_HH +namespace UNF { +namespace TABLE { +const unsigned CANONICAL_COM_ROOT = 257; +const unsigned CANONICAL_DECOM_ROOT = 258; +const unsigned COMPATIBILITY_DECOM_ROOT = 259; +const unsigned CANONICAL_CLASS_ROOT = 260; +const unsigned NFC_ILLEGAL_ROOT = 261; +const unsigned NFKC_ILLEGAL_ROOT = 262; + +const unsigned NODES[]={ +0x000000D1,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0x300000CB,0x310066E9,0x3200CF1E, +0x3300E63A,0x3400EA2F,0x3500EC7C,0x3C00003E,0x3D00005A,0x3E00005D,0xCC000053,0xB800011C,0x41000070,0x420000B4, +0x430000B8,0x440000C3,0x450000DC,0x46000115,0x47000118,0x48000129,0x49000133,0x4A000161,0x4B000163,0x4C00016A, +0x4D00017A,0x4E000180,0x4F00018E,0x500001E1,0x000C9C99,0x520001E6,0x530001FC,0x5400020A,0x55000221,0x56000256, +0x5700025C,0x5800026B,0x59000277,0x5A00028B,0xCC00006F,0xB8000128,0x000C9C96,0xCC000072,0xB800012B,0x000C9C93, +0x61000297,0x620002CC,0x630002D6,0x640002E9,0x650002FB,0x66000334,0x67000337,0x68000346,0x69000355,0x6A000374, +0x6B00037D,0x6C00038A,0x6D000398,0x6E000399,0x6F0003B1,0x70000400,0xCC0000C6,0x72000402,0x73000412,0x74000426, +0x75000436,0x76000473,0x77000479,0x7800048A,0x7900048E,0x7A0004A3,0x8000014B,0x81000151,0x82000153,0x8300015D, +0x8400015E,0x00089C91,0x8600015F,0x87000168,0x8800016F,0x89000172,0x8A000173,0x00089C8F,0x8C000176,0x00089C8D, +0x000C9C8A,0x8F000177,0x000C9C87,0x91000178,0x80000154,0x81000156,0x000C9C84,0x8300015A,0x000C9C81,0x00089C7F, +0x00089C7D,0x00089C7B,0x000C9C78,0x8900015C,0x000C9C75,0x80000160,0x81000162,0x000C9C72,0x83000165,0x000C9C6F, +0x00089C6D,0xA3000179,0x8400016D,0xA500017D,0x89000167,0x00089C6B,0xA800017F,0x00089C69,0x84000171,0x00089C67, +0x000C9C64,0x00089C62,0x81000175,0x00089C60,0x00089C5E,0x00089C5C,0x00089C5A,0x000C9C57,0x8200017B,0x000C9C54, +0x000C9C51,0x000C9C4E,0x8600017C,0x00089C4C,0xCC0000FE,0x000C9C49,0x000C9C46,0x000C9C43,0xCC000111,0x87000181, +0x00089C41,0x00089C3F,0x00089C3D,0x00089C3B,0x00089C39,0x8100018C,0x000C9C36,0xC20004DC,0xC300050B,0xCC000119, +0xC50004E1,0xC60004F4,0x81000186,0x82000187,0x000C9C33,0xCA000523,0x00089C31,0x000C9C2E,0x87000188,0xCE00052B, +0xCF0006EE,0xD0000789,0xD10007EB,0x8C000189,0xD30007FF,0x000C9C2B,0x87000194,0xA3000182,0x000C9C28,0xD8000806, +0xD900082C,0x8C000196,0xDB000839,0x000C9C25,0xCC00014C,0x00089C23,0x00089C21,0xE0000823,0xE10008B3,0xE2006533, +0xE30065E0,0xB1000183,0x00089C1F,0x800001B3,0x810001B5,0x000C9C1C,0x830001B6,0x000C9C19,0x000C9C16,0x000C9C13, +0xA700018A,0x000C9C10,0x890001B7,0xF00066D9,0xA3000197,0x00089C0E,0x800001C1,0x810001C2,0xA700019F,0x000C9C0B, +0x000C9C08,0x00089C06,0x00089C04,0x00089C02,0xAD0001A2,0x000C9BFF,0x00089BFD,0x00089BFB,0xB10001A7,0x00089BF9, +0x800001A9,0x810001AA,0x820001B0,0x830001B9,0x840001BD,0x000C9BF6,0x860001C3,0x870001C4,0x880001C5,0x890001C7, +0x000C9BF3,0x820001D6,0x8C0001C8,0x00089BF1,0x000C9BEE,0x8F0001C9,0x00089BEC,0x910001CB,0x860001DA,0x000C9BE9, +0x000C9BE6,0xCC00015B,0x870001E3,0x000C9BE3,0xCC000164,0x810001E7,0x820001E9,0x00089BE1,0x840001EC,0x00089BDF, +0x860001ED,0x870001EE,0x000C9BDC,0x00089BDA,0x00089BD8,0xA30001D1,0x8C0001F1,0x00089BD6,0x00089BD4,0xA70001D9, +0xA80001DC,0xCC00017E,0x00089BD2,0x000C9BCF,0x000C9BCC,0xAD0001DF,0x00089BCA,0x000C9BC7,0xB00001E0,0x000C9BC4, +0x000C9BC1,0xCC00018D,0x820001F6,0x00089BBF,0x00089BBD,0x00089BBB,0x00089BB9,0x870001F7,0x880001F8,0x00089BB7, +0x00089BB5,0x00089BB3,0x8C0001FA,0xA70001F2,0x00089BB1,0x80000201,0x81000202,0x82000203,0x83000204,0x84000207, +0x81000217,0x86000208,0x87000209,0x8800020C,0x89000218,0x000C9BAE,0x000C9BAB,0x8C00021A,0x00089BA9,0x00089BA7, +0x8F00021B,0x00089BA5,0x9100021D,0xCC0000D8,0x000C9BA2,0xA30001FB,0x00089BA0,0x000C9B9D,0x00089B9B,0xA70001FD, +0x82000224,0x81000228,0x000C9B98,0x00089B96,0x000C9B93,0xCC0000E3,0xAE0001FE,0xCC0001A4,0x00089B91,0xCC0001A6, +0xA3000220,0x000C9B8E,0x8C000229,0x81000237,0xCC0000E6,0xA8000222,0xCC0001B2,0x00089B8C,0x00089B8A,0x000C9B87, +0x000C9B84,0xCC0000EC,0x8400023A,0xB0000223,0x8C000238,0xCC0000F3,0x00089B82,0x000C9B7F,0x000C9B7C,0x000C9B79, +0x000C9B76,0xCC0000F8,0xCC0001CA,0x000C9B73,0x00089B71,0xA300022A,0x00089B6F,0x81000243,0xCC0001DB,0xA700022E, +0x00089B6D,0x000C9B6A,0x00089B68,0x87000244,0x000C9B65,0x00089B63,0x000C9B60,0xA3000239,0xCC00010A,0xB1000231, +0x000C9B5D,0xA7000240,0xCC0001E8,0x80000248,0x8100024A,0x00089B5B,0x8300024E,0xAD000241,0x00089B59,0x00089B57, +0x8700024F,0xB1000242,0x000C9B54,0x000C9B51,0x000C9B4E,0x8C000250,0x8000025D,0x81000260,0x82000261,0x83000275, +0x8400027F,0xA3000247,0x86000287,0x8700028A,0x88000292,0x89000296,0x000C9B4B,0x8B000298,0x8C000299,0x00089B49, +0x000C9B46,0x8F00029A,0x00089B44,0x9100029B,0x81000276,0x000C9B41,0xCC000131,0x84000278,0xA3000252,0x00089B3F, +0x000C9B3C,0x8800027B,0xA7000253,0x9B00029C,0x000C9B39,0x80000280,0x81000284,0x00089B37,0xAD000254,0xCC00013E, +0x00089B35,0xA30002A8,0xB1000258,0x00089B33,0x80000264,0x81000265,0xA80002AB,0x83000266,0x00089B31,0x8400028D, +0x84000295,0x00089B2F,0x000C9B2C,0x89000272,0x00089B2A,0x00089B28,0x00089B26,0x00089B24,0x00089B22,0xCC000155, +0x800002A0,0x810002A2,0x000C9B1F,0x830002A3,0x000C9B1C,0x000C9B19,0x000C9B16,0xCC000158,0x000C9B13,0x890002A4, +0x000C9B10,0x820002AA,0x000C9B0D,0x00089B0B,0x00089B09,0xCC00022D,0x810002B0,0x840002AC,0x000C9B06,0x000C9B03, +0xCC000234,0x00089B01,0x870002B1,0x810002B3,0x000C9AFE,0x00089AFC,0x00089AFA,0x00089AF8,0x000C9AF5,0x870002B6, +0x000C9AF2,0x00089AF0,0x000C9AED,0x840002BC,0x8C0002B7,0xA30002A6,0x00089AEB,0x8F0002B8,0x870002C9,0x910002B9, +0x810002C2,0x820002CA,0xCC000245,0x000C9AE8,0x00089AE6,0x000C9AE3,0x870002CB,0x00089AE1,0x000C9ADE,0x000C9ADB, +0x870002CE,0x8C0002CD,0x870002D3,0x000C9AD8,0x00089AD6,0x00089AD4,0xCC000255,0xA30002BA,0xCC000191,0x000C9AD1, +0x00089ACF,0xA70002BD,0x870002D9,0x000C9ACC,0x00089ACA,0x00089AC8,0x000C9AC5,0x8C0002DA,0x000C9AC2,0x00089AC0, +0x00089ABE,0xB10002BE,0x00089ABC,0x00089ABA,0xA30002CF,0x810002EA,0x000C9AB7,0xA60002D4,0xA70002D5,0xCC000288, +0x00089AB5,0x880002F0,0x000C9AB2,0x00089AB0,0x00089AAE,0x800002F5,0x810002F6,0x00089AAC,0x00089AAA,0x840002F9, +0xA30002DD,0x00089AA8,0x00089AA6,0xA60002DE,0xA70002DF,0x000C9AA3,0x00089AA1,0x8C0002FA,0x00089A9F,0x00089A9D, +0xAD0002E0,0x00089A9B,0x00089A99,0xCC0001B8,0xB10002E2,0x00089A97,0x800002E3,0x810002E4,0x820002E6,0x830002E7, +0x840002EE,0x000C9A94,0x860002F1,0x000C9A91,0x880002F2,0x890002FD,0x8A0002FE,0x8B000300,0x8C000301,0x000C9A8E, +0x000C9A8B,0x8F000303,0x000C9A88,0x91000304,0x000C9A85,0x000C9A82,0x00089A80,0x8000030D,0x8100030F,0x000C9A7D, +0x83000315,0x000C9A7A,0xCC0002A1,0x9B000307,0x83000325,0x000C9A77,0x89000316,0x000C9A74,0xCC0002B2,0x000C9A71, +0x000C9A6E,0xA300031A,0xA400031B,0xCC00020E,0x00089A6C,0x000C9A69,0xA800031C,0x000C9A66,0x80000329,0x8100032A, +0x8200032E,0xAD00031F,0x000C9A63,0xCC0002B4,0xB0000321,0x8700032F,0x88000331,0x8700033D,0x8800033E,0x000C9A60, +0x000C9A5D,0x000C9A5A,0xA3000318,0xCC0001F9,0x00089A58,0xCC0002C6,0xA3000327,0x00089A56,0x8000033F,0x81000342, +0x82000345,0x8300034C,0x84000350,0xCC000205,0x000C9A53,0x87000351,0x88000352,0x89000353,0x00089A51,0x000C9A4E, +0x00089A4C,0x000C9A49,0x000C9A46,0xA3000336,0xCC00020F,0xCC0002D8,0x00089A44,0x81000358,0x8200035B,0x000C9A41, +0x00089A3F,0x00089A3D,0xCC000210,0x8700035C,0x000C9A3A,0x000C9A37,0x00089A35,0xCC00031D,0x8C00035D,0x00089A33, +0x00089A31,0x000C9A2E,0xCC00021E,0xA3000354,0x000C9A2B,0x000C9A28,0x80000367,0x8100036A,0x000C9A25,0x8300036B, +0x00089A23,0x00089A21,0x00089A1F,0x000C9A1C,0xCC000227,0x8900036E,0x000C9A19,0xCC00022B,0x000C9A16,0x000C9A13, +0x00089A11,0xA3000360,0x80000373,0x81000376,0x00089A0F,0x83000378,0x00089A0D,0x00089A0B,0x000C9A08,0x8400037E, +0x00089A06,0x89000379,0xCC00023B,0x00089A04,0x00089A02,0xB1000361,0x84000381,0x81000387,0x00089A00,0x000899FE, +0xCC00023D,0x000C99FB,0x82000391,0x000C99F8,0x000C99F5,0x000C99F2,0x86000392,0x000899F0,0x000C99ED,0x000C99EA, +0xCC000313,0xCC000249,0x87000396,0xCC00024B,0x000C99E7,0x80000362,0x81000365,0x82000366,0x83000370,0x84000371, +0xCC000330,0x86000372,0x8700037A,0x88000380,0x89000382,0x8A000384,0x000899E5,0x8C000388,0x000899E3,0x000899E1, +0x8F00038C,0x000899DF,0x9100038D,0x000899DD,0x000C99DA,0x810003A8,0x820003AA,0xCC000268,0x810003B0,0xCC00033A, +0xA3000397,0x870003AB,0x000C99D7,0x000899D5,0xCC000267,0x000C99D2,0x8C0003AD,0x000C99CF,0xCC000273,0x000C99CC, +0xA300038F,0x870003B8,0xA5000393,0x000C99C9,0xB100039C,0xA8000395,0x8C0003B9,0xCC000349,0x000899C7,0x800003C8, +0x810003CE,0x820003D4,0x830003DE,0x840003E3,0x000899C5,0x860003EA,0x870003ED,0x880003EE,0x890003EF,0xCC00029D, +0x000899C3,0x8C0003F2,0x000C99C0,0xA70003AF,0x8F0003F3,0x000C99BD,0x910003F4,0x000C99BA,0x000C99B7,0xA30003BB, +0x000C99B4,0x800003D6,0x810003D9,0xA70003BD,0x830003DB,0x000899B2,0x800003E6,0x810003E9,0x000C99AF,0xAD0003BF, +0x890003DC,0x000C99AC,0x000899AA,0xB10003C3,0xA30003F5,0x000899A8,0x000899A6,0x000C99A3,0xA70003FA,0xA80003FC, +0x000899A1,0x0008999F,0x0008999D,0x000C999A,0xAD0003FE,0x820003F8,0x000C9997,0xB00003FF,0x00089995,0x000C9992, +0x00089990,0x860003FB,0x000C998D,0x000C998A,0xCC00037B,0x000C9987,0x87000401,0xCC000383,0x81000406,0x82000408, +0x00089985,0x8400040B,0x00089983,0x8600040C,0x8700040D,0x000C9980,0x0008997E,0x0008997C,0x0008997A,0x8C00040E, +0x00089978,0x00089976,0xCC000394,0x000C9973,0x000C9970,0x0008996E,0x82000411,0x000C996B,0x000C9968,0x000C9965, +0x000C9962,0x87000413,0x88000414,0x00089960,0x0008995E,0x0008995C,0x8C000415,0xCC0003A5,0x0008995A,0x00089958, +0x00089956,0x8000041D,0x8100041E,0x8200041F,0x83000422,0x84000423,0xA7000410,0x86000424,0x00089954,0x8800042C, +0x89000433,0x81000430,0x000C9951,0x8C000435,0xCC0002EC,0x000C994E,0x8F000438,0x0008994C,0x91000439,0xA3000417, +0x0008994A,0x00089948,0x000C9945,0xA7000418,0x00089943,0x000C9940,0xCC0002FC,0x0008993E,0xCC0003C2,0x0008993C, +0xAE000419,0x000C9939,0x8200043F,0xB100041A,0xCC0002FF,0x81000443,0xA300043A,0xCC0003C6,0x00089937,0x000C9934, +0xCC000306,0xA800043C,0x8C000441,0x00089932,0xCC00030A,0x000C992F,0x8C00044A,0x81000454,0x0008992D,0xB000043D, +0xCC0003D2,0x0008992B,0x000C9928,0x8400045A,0x000C9925,0xCC00030E,0x00089923,0x000C9920,0x8C000457,0x000C991D, +0x81000461,0x000C991A,0x000C9917,0x000C9914,0xCC0003DF,0xCC0003E7,0x87000462,0x8000046B,0x8100046C,0xA300044B, +0x8300046F,0x00089912,0x00089910,0xA700044F,0x87000470,0x0008990E,0x000C990B,0x00089909,0x000C9906,0x8C000471, +0x00089904,0xA3000458,0x000C9901,0xB1000451,0x000C98FE,0xA700045C,0x000898FC,0xCC000333,0x000898FA,0xCC00041B, +0x000898F8,0xAD00045D,0x000C98F5,0x000C98F2,0xA3000463,0xB100045F,0x80000480,0x81000481,0x000C98EF,0x83000486, +0x000C98EC,0x000898EA,0xA3000472,0x000C98E7,0x000898E5,0x89000488,0xA7000474,0x000C98E2,0x8100048B,0x000898E0, +0x000C98DD,0x8400048C,0xAD000476,0x000C98DA,0x000898D8,0x8800048F,0xB1000478,0x000898D6,0x840004A5,0x8000047A, +0x8100047C,0x8200047E,0x83000489,0x84000491,0xCC00035F,0x86000496,0x87000499,0x880004AB,0x890004B0,0x000898D4, +0x8B0004B1,0x8C0004B2,0x80000492,0x81000495,0x8F0004B3,0x000898D2,0x910004B4,0x840004AE,0x000898D0,0xCC000364, +0x000C98CD,0x000898CB,0x000898C9,0x000898C7,0x000898C5,0x000898C3,0x9B0004B5,0x800004B9,0x810004BB,0x000C98C0, +0x830004BC,0x000C98BD,0x000C98BA,0x000C98B7,0xA30004C2,0x000C98B4,0x890004BD,0xCC000375,0x000C98B1,0xA80004C7, +0x820004C5,0x000C98AE,0xCC000377,0x000898AC,0x840004C9,0x000898AA,0x810004CB,0x000C98A7,0xCC000449,0x000C98A4, +0xCC000450,0x000898A2,0x870004CD,0x810004CF,0x000C989F,0x0008989D,0x0008989B,0x00089899,0x000C9896,0x870004D2, +0x000C9893,0x840004D8,0xA30004BF,0x00089891,0x8C0004D3,0x000C988E,0xCC000464,0x8F0004D4,0x0008988C,0x910004D5, +0x870004E3,0x000C9889,0x00089887,0x810004E0,0x820004E4,0x000C9884,0x00089882,0x000C987F,0x000C987C,0x870004E7, +0x870004E9,0x870004EE,0x000C9879,0x00089877,0x8C0004E8,0x00089875,0xCC00046D,0xA30004D6,0x870004F6,0x880004FA, +0x000C9872,0xA70004DB,0xCC0003AE,0x8C0004FB,0x000C986F,0x0008986D,0x000C986A,0x00089868,0x00089866,0x000C9863, +0x000C9860,0xB10004DD,0xCC00049F,0x0008985E,0x0008985C,0x0008985A,0x00089858,0xA30004EA,0x81000509,0x000C9855, +0xA60004EF,0xA70004F1,0x00089853,0x8800050E,0x000C9850,0x0008984E,0xA30004FC,0x0008984C,0x0008984A,0xA60004FD, +0xA70004FE,0x00089848,0x00089846,0x00089844,0x000C9841,0x0008983F,0xAD0004FF,0x0008983D,0x0008983B,0x00089839, +0xB1000500,0x80000503,0x81000504,0x82000505,0x83000506,0x8400050C,0xCC0003D5,0x8600050F,0x00089837,0x88000511, +0x89000518,0x8A000519,0x8B00051B,0x8C00051C,0x00089835,0x000C9832,0x8F00051D,0x000C982F,0x91000526,0x000C982C, +0x000C9829,0x000C9826,0x000C9823,0x000C9820,0x0008981E,0x000C981B,0x80000512,0x81000515,0x9B00052C,0x000C9818, +0x84000516,0x000C9815,0x000C9812,0xCC0004BE,0x000C980F,0x8300053D,0xA3000534,0xA4000535,0x8C000517,0xCC0004E2, +0x000C980C,0xA8000536,0x8000052D,0x8100052F,0xCC000404,0x83000531,0xAD000537,0x0008980A,0x000C9807,0xB000053B, +0x000C9804,0x89000532,0x000C9801,0x000C97FE,0x000C97FB,0xCC00040F,0xCC0004D0,0x87000554,0x88000559,0x000C97F8, +0xCC0004F2,0x000C97F5,0x000897F3,0xCC000428,0x000897F1,0x000C97EE,0x000897EC,0xA300053E,0x80000540,0x81000546, +0x8200054D,0xCC000416,0x000C97E9,0x000897E7,0x000C97E4,0x8700054E,0x88000550,0xA3000533,0x8A000552,0x000C97E1, +0x000C97DE,0xCC000501,0x000897DC,0x000C97D9,0x8000055B,0x8100055C,0x8200055E,0x8300055F,0x84000560,0xCC000429, +0x000897D7,0x87000566,0x88000567,0x89000568,0x8A00056D,0x000897D5,0x000C97D2,0x000C97CF,0x000C97CC,0xCC000437, +0x81000570,0x82000571,0xA80004BA,0xA3000553,0xCC00050A,0xCD00050D,0x87000578,0x000897CA,0x80000580,0x81000589, +0x000C97C7,0x8C00057D,0xCC000442,0x8200058C,0xCC000513,0x860004C4,0x000897C5,0xCC000444,0x81000592,0xA300056E, +0x000897C3,0x84000596,0xCC00051A,0x000897C1,0xCC000524,0x81000599,0x000897BF,0x000897BD,0x000897BB,0x8100059E, +0xBF0004DE,0x000C97B8,0xCC000455,0x980004CC,0xA300057E,0x8100059C,0xCC00051E,0x870005A1,0x8400059D,0x000897B6, +0xCC000520,0xB70004EB,0xCC00045B,0x8C0005A9,0x8C0005AF,0x000897B4,0x000C97B1,0xA60004CE,0xB100057F,0x000897AF, +0xCC000465,0x920004EC,0xCC000466,0xCC000521,0xCC000522,0xCC000547,0xCD00056F,0x000C97AC,0x910004ED,0x000C97A9, +0x000C97A6,0x000C97A3,0x95000527,0x850005C9,0x97000538,0xB80004DA,0x99000563,0x800005BF,0x810005CE,0x800005B0, +0x810005B3,0x000C97A0,0x9F000582,0x840005BB,0xA100058F,0x860005BD,0x000C979D,0x850005D1,0xA5000590,0x000C979A, +0xCC000487,0x820005D5,0xA90005A5,0x000C9797,0x850005D9,0x000C9794,0xCC000485,0x000C9791,0x930005BE,0x940005DE, +0xB10005D2,0xCC0004B8,0x000C978E,0x850005D7,0xB500060E,0x000C978B,0xB7000629,0x000C9788,0xB900065D,0x800005E1, +0x810005E8,0x850005E3,0x000C9785,0x850005EB,0xBF00068A,0x000C9782,0x820005ED,0x000C977F,0x850005F0,0x850005F1, +0x000C977C,0x000C9779,0x000C9776,0xCC000575,0x850005F2,0x800005F7,0x810005F9,0x000C9773,0xCC0004C8,0x00089771, +0x000C976E,0x800005FD,0x810005FE,0x000C976B,0x000C9768,0x000C9765,0x000C9762,0x80000600,0x81000603,0x000C975F, +0xCC000586,0xCD0005A7,0x8000060A,0x8100060B,0x930005FA,0x940005FF,0x000C975C,0x0008975A,0x000C9757,0x8000060F, +0x81000612,0x000C9754,0x85000611,0x000C9751,0x000C974E,0x85000614,0x000C974B,0x82000616,0x000C9748,0x000C9745, +0x8500061B,0x9300060C,0x9400061D,0x000C9742,0x85000617,0x000C973F,0x000C973C,0x8000061E,0x81000622,0x000C9739, +0x000C9736,0x000C9733,0x000C9730,0x85000621,0x82000624,0x85000623,0x8500062A,0x8500062B,0x000C972D,0x000C972A, +0x8500062D,0x000C9727,0x000C9724,0xCC0005B1,0x00089722,0x8000062E,0x81000630,0x000C971F,0x000C971C,0x84000633, +0x0008971A,0x86000634,0x000C9717,0x88000636,0x8000063C,0x8100063D,0x000C9714,0x000C9711,0x8200063F,0x000C970E, +0x000C970B,0x80000643,0x81000646,0x000C9708,0x93000638,0x94000640,0x000C9705,0x82000648,0x000C9702,0x000C96FF, +0x80000649,0x8100064C,0x000896FD,0x000C96FA,0xCC0005CA,0x80000651,0x81000652,0x000C96F7,0x000C96F4,0x000C96F1, +0x80000656,0x81000657,0x000C96EE,0x000C96EB,0x94000659,0x000C96E8,0x000C96E5,0xCC0005C4,0xCC0005DF,0x9300064D, +0x94000653,0x8000065A,0x81000661,0x000896E3,0x000C96E0,0x84000662,0x000C96DD,0x86000664,0x000896DB,0x88000666, +0x000C96D8,0x8000066B,0x8100066C,0x000C96D5,0x000C96D2,0x000C96CF,0x8200066D,0x80000674,0x81000675,0xCC0005EF, +0xCD000618,0x94000668,0x000C96CC,0x000896CA,0x000C96C7,0x000C96C4,0x80000677,0x8100067C,0x8500067B,0x000C96C1, +0x000C96BE,0x000C96BB,0x8200067F,0x000C96B8,0x8500067D,0x85000685,0x93000676,0x94000687,0x000C96B5,0x000C96B2, +0x85000684,0x000C96AF,0x8000068D,0x81000690,0xCC000545,0xCD000551,0xCD00053C,0x000C96AC,0x8500068F,0x000C96A9, +0x000C96A6,0x000C96A3,0x85000691,0x000C96A0,0x000C969D,0x82000693,0x000C969A,0x000C9697,0x85000696,0x000C9694, +0x85000694,0xCD00054A,0x000C9691,0x85000697,0xCC000620,0xCD000650,0x80000699,0x810006A3,0xCD00055A,0x0008968F, +0x840006A7,0x000C968C,0x860006A8,0x000C9689,0x000C9686,0x000C9683,0xCC000565,0xCD00056A,0x8500069C,0x850006A5, +0xCD000562,0x800006B1,0x810006B7,0x000C9680,0x000C967D,0x930006A9,0x940006C1,0xCD000564,0x850006B2,0x000C967A, +0x000C9677,0x000C9674,0xCD000569,0x820006B9,0x850006B8,0x000C9671,0x850006C0,0x850006BD,0x000C966E,0x000C966B, +0x800006C4,0x810006C7,0x000C9668,0x000C9665,0xCC00057B,0x000C9662,0x000C965F,0x850006C5,0x850006C8,0xCC000581, +0x820006CD,0x000C965C,0x000C9659,0x850006D1,0x850006CE,0x000C9656,0x820006D3,0x000C9653,0x850006D6,0x850006D7, +0x000C9650,0x000C964D,0xCC00058D,0xCD000593,0xCC000660,0x000C964A,0xCD00058B,0x00089648,0x000C9645,0xCD00058E, +0x800006DB,0x810006DD,0x000C9642,0xCD000597,0x000C963F,0x800006E2,0x810006E4,0x000C963C,0x000C9639,0xCC00059F, +0xCD0005A4,0xCD0005A0,0x000C9636,0x000C9633,0x850006F0,0xCD0005A2,0x000C9630,0xCD0005A3,0x0008962E,0x930006DE, +0x940006E7,0xCC00067E,0xCD00069F,0x850006FA,0x800006E8,0x810006EC,0x000C962B,0x000C9628,0x000C9625,0x000C9622, +0x800006ED,0x810006F2,0x800006FC,0x81000702,0x000C961F,0x000C961C,0xCC0005BA,0xCD0005BC,0x850006FD,0x85000703, +0x82000709,0x000C9619,0x000C9616,0x8500070F,0xCC0005C1,0xCD0005C5,0x8500070A,0x000C9613,0x000C9610,0x930006FB, +0x94000710,0x000C960D,0x000C960A,0x80000713,0x81000718,0x85000714,0x000C9607,0xCC0005CF,0x000C9604,0x000C9601, +0x000C95FE,0x8500071A,0x000C95FB,0xCC0005D4,0x8200071B,0x82000725,0x8500071C,0x8500071E,0x85000728,0x000C95F8, +0x85000727,0x000C95F5,0x000C95F2,0xCC0006AB,0xCD0006D0,0x8000072D,0x8100072E,0x000C95EF,0x000895ED,0x84000730, +0x000C95EA,0x86000732,0x000C95E7,0x88000736,0xCC0005E9,0xCD0005EC,0x000895E5,0x000C95E2,0x000895E0,0x000C95DD, +0x80000737,0x81000738,0x000C95DA,0x82000739,0x9300073C,0x9400074A,0x000C95D7,0x000C95D4,0xCC0005F8,0xCD0005FC, +0xCD0005F5,0x82000748,0x80000740,0x81000741,0x000C95D1,0xCD0005FB,0x000C95CE,0x000C95CB,0xCD000601,0x000C95C8, +0x82000751,0x8000074B,0x8100074D,0x000C95C5,0x82000755,0xCC000608,0xCD000613,0x000C95C2,0xCC0006D8,0x000C95BF, +0x80000757,0x8100075B,0xCD000609,0x000895BD,0x000C95BA,0xCD00060D,0x000C95B7,0x000C95B4,0xCD000615,0x8000075E, +0x8100075F,0x000C95B1,0x000C95AE,0x000C95AB,0xCD000627,0xCC0006DA,0x000C95A8,0x80000764,0x81000765,0x9300075C, +0x94000763,0x93000768,0x94000771,0x8100069B,0xCD000628,0x000C95A5,0x000C95A2,0x850006AC,0x000895A0,0xCC00062F, +0xCD000639,0x890006D9,0xCC000715,0xCD00071F,0x000C959D,0x000C959A,0x00089598,0x000C9595,0xCD000631,0x00089593, +0x92000716,0x8000077D,0x8100077F,0x000C9590,0xCD000637,0x000C958D,0xCD00063A,0x82000783,0x8000078A,0x8100078B, +0x000C958A,0x000C9587,0x000C9584,0xCC000642,0xCD00064A,0x8200078C,0x000C9581,0xCD000644,0x80000797,0x81000798, +0xCD000645,0x80000772,0x81000774,0x000C957E,0x000C957B,0x8400077A,0xCD00064B,0x8600077B,0x000C9578,0x8800077C, +0x000C9575,0x8200079C,0xCD00064F,0x8200079E,0x800007A4,0x810007AC,0x000C9572,0xCC000722,0xCD000756,0x000C956F, +0x93000785,0x94000790,0xCC000665,0x850007A7,0x0008956D,0x000C956A,0x850007AD,0x000C9567,0x000C9564,0x800007B0, +0x810007B8,0xCC000678,0x850007B7,0x930007AF,0x940007C3,0x000C9561,0x000C955E,0x850007BB,0xCD000669,0x000C955B, +0x000C9558,0x820007BC,0x000C9555,0xCD000672,0x850007C1,0x000C9552,0x850007BE,0x000C954F,0x800007C6,0x810007CC, +0x000C954C,0xCC000680,0xCD000686,0xCD000681,0x850007CB,0x000C9549,0x000C9546,0x000C9543,0x850007CD,0xCD000682, +0x820007D1,0x000C9540,0x000C953D,0x850007D5,0x850007D2,0x000C953A,0xCD000689,0x000C9537,0x820007D7,0x850007DA, +0x000C9534,0x850007DE,0xCC000695,0xCD00069E,0x000C9531,0x0008952F,0xCD000692,0x0008952D,0xCC000762,0x810007DF, +0x0008952B,0xCD000698,0x00089529,0x00089527,0xCD00069D,0x880007E4,0x880007E1,0x810007EE,0xCC000761,0xCC000769, +0x00089525,0x860007E6,0xCC00076A,0x880007E7,0xCD0006A1,0x800007F4,0x00089523,0x00089521,0xCC000773,0x0008951F, +0xCC000776,0x860007F5,0x0008951D,0x880007F7,0x860007FA,0x0008951B,0x880007FD,0xCC000778,0x88000801,0x00089519, +0xCC0006BA,0xCD0006BB,0x00089517,0x00089515,0xCC00078D,0x00089513,0xCC0006C6,0xCD0006C3,0x00089511,0xCC00078F, +0x0008950F,0x80000804,0xCC000792,0x86000720,0x8100080C,0x84000805,0x0008950D,0x86000807,0x0008950B,0x8800080A, +0xCC0006CF,0xCD0006CC,0xCC0007C8,0x90000721,0x88000812,0x00089509,0x93000724,0x00089507,0x9500072A,0x9600072C, +0x97000733,0x9800073A,0x00089505,0x9A00073F,0xCC00079D,0x88000826,0x00089503,0x9E000742,0xCC0006E1,0xCC0007A2, +0x8800082B,0x00089501,0xA300074C,0x8800082E,0x000894FF,0xCC0006E9,0xA7000758,0x000894FD,0xCC0007A5,0xCC0007B2, +0xAB00075D,0x000894FB,0xAD000766,0xCC0007BA,0x86000831,0xB0000767,0x88000835,0x8100083D,0xB300076B,0x000894F9, +0xB5000779,0xB600077E,0xB700078E,0xB8000793,0x000894F7,0xBA000799,0x000894F5,0xCC0007CF,0x000894F3,0xBE00079F, +0xCC000701,0xCD000705,0xCC0007C5,0x86000854,0x84000814,0x88000856,0x8600081B,0x80000842,0x8800081D,0xCC000708, +0xCD00070D,0x8B000822,0x000894F1,0x86000844,0x000894EF,0x88000846,0x88000859,0x000894ED,0xCC0007D0,0x000894EB, +0xCC000712,0xCD00071D,0x000894E9,0xCC0007E0,0x8000085B,0x000894E7,0x000894E5,0x81000867,0x8400085E,0xCC0007E2, +0x86000861,0x000894E3,0x88000862,0x000894E1,0x000894DF,0xCC0007E5,0xCC0007EF,0x88000869,0x830007A0,0x000894DD, +0x000894DB,0xCD000726,0x870007B3,0x8400086A,0x000894D9,0x8600086F,0x8B0007B6,0x88000870,0x8D0007BF,0xCD000729, +0x8B000874,0xCC000731,0xCD00073B,0xCD00072F,0x88000880,0xCC0007F6,0x000894D7,0x960007C0,0xCC0007FB,0x88000884, +0x000894D5,0xCD000734,0x88000887,0x000894D3,0x8800088A,0xCD00073D,0x000894D1,0xCC0007FE,0xCC000800,0x000894CF, +0xCC000802,0xCC000744,0xCD00074E,0x8F00088D,0x8F000894,0xCD000745,0x000894CD,0xCC000803,0xCC000813,0x980007CA, +0x990007D6,0xCD000749,0x000894CB,0x8800089A,0x000894C9,0x8800089C,0xCD00074F,0xB40007C2,0xB50007C9,0x880008A3, +0xCC000815,0x000894C7,0xCD000754,0xCC000819,0x880008AA,0xA80007D9,0xA90007DD,0xCC00081E,0x000894C5,0x000894C3, +0xD900081C,0xA70007D3,0x000894C1,0x930008AB,0x940008AE,0x950008B2,0x000894BF,0x940008B7,0x880007DC,0xD900081F, +0x8A0007E3,0x000894BD,0x940008B9,0x000894BB,0x810007E8,0x940008BD,0xD9000824,0x000894B9,0x940008BF,0x000894B7, +0x000894B5,0xD9000827,0xD900082A,0xD9000830,0x940008C0,0xA400080D,0x000C94B2,0xA400082F,0x000C94AF,0xBC0008C6, +0xA7000857,0x920007E9,0xE0000821,0xE0000837,0x950007EA,0x000C94AC,0xAD000860,0xAE000863,0xAF000871,0xBC0008C8, +0xB100087E,0xB2000848,0xB3000886,0xA80007EC,0xB5000892,0xE0000838,0xB700088F,0xA4000817,0xA4000825,0x000C94A9, +0x87000808,0xB00007ED,0x970008E3,0xBC0008CF,0xB30007F9,0x000C94A6,0xA6000828,0xA7000849,0xBE0008DD,0x87000809, +0xE000083E,0xE000083F,0x000C94A3,0xAC000832,0xAD000858,0x000C94A0,0x960008ED,0x970008F1,0xBE0008EA,0x000C949D, +0xAF00085C,0x970008F4,0x000C949A,0x92000816,0xE0000843,0x8600081A,0x87000820,0xBE0008FD,0xE000084D,0xAE00083B, +0xAF000868,0x000C9497,0x000C9494,0x970008FE,0xE0000853,0xAE000845,0x000C9491,0xBE000902,0x86000829,0x000C948E, +0xB1000872,0xBF00082D,0x96000905,0xE0000855,0x9500090B,0x000C948B,0x86000833,0xE000085D,0x8200090F,0x000C9488, +0xB3000875,0x95000914,0xB300088C,0xE000085F,0x000C9485,0x000C9482,0x000C947F,0xB300087C,0x8600083A,0x87000847, +0xE000086B,0x000C947C,0x9700091D,0x000C9479,0x000C9476,0xB4000865,0xB5000885,0x95000915,0x96000916,0xBE00091B, +0xBE00091E,0xB700089F,0x000C9473,0xE0000876,0x9900084B,0x8A000926,0xB4000866,0xE000086E,0x000C9470,0x000C946D, +0x8F00092C,0xB70008A6,0x8A00092D,0x000C946A,0xE10008B4,0x80000890,0x80000888,0xA5000851,0xAE000938,0x840008C1, +0x000C9467,0x000C9464,0x850008D2,0xE10008B5,0x860008E0,0x870008EC,0x9F000931,0x000C9461,0x000C945E,0x8000085A, +0x81000D50,0x82001235,0x83001702,0x84001BDE,0x850020AC,0x86002596,0x87002A5E,0x88002F48,0x89003410,0x8A0038FA, +0x8B003DC2,0x8C0042AC,0x8D004774,0x8E004C5E,0x8F005126,0x90005610,0x91005AD8,0x92005FC2,0x000C945B,0x000C9458, +0x000C9455,0x000C9452,0x000C944F,0x000C944C,0x000C9449,0x000C9446,0x000C9443,0x000C9440,0x000C943D,0xAC0064E6, +0xAD006516,0x000C943A,0x000C9437,0x000C9434,0x000C9431,0x000C942E,0x000C942B,0x000C9428,0x000C9425,0x000C9422, +0x000C941F,0x000C941C,0x8000096F,0x81000970,0x820009A0,0x000C9419,0x000C9416,0xBE0064E2,0xBF0064F3,0xA1000939, +0xA20009A1,0xA30009D7,0xA4000A15,0xA5000A4C,0xA6000A89,0xA7000AC0,0xA8000AE4,0xA9000B1E,0xAA000B6E,0xAB000B92, +0xAC000BE5,0xAD000C1C,0xAE000C59,0xAF000C93,0xB0000CCD,0xB1000D07,0xB2000D41,0xB3000D78,0xB4000DB5,0xB5000DEC, +0xA800093F,0xA9000940,0xAA000954,0xAB000955,0xAC000956,0xAD000957,0xAE000958,0xAF000959,0xB000095A,0xB100095B, +0xB200095C,0xB300095D,0xB400095E,0xB5000961,0xB6000962,0xB7000963,0xB8000964,0xB9000965,0xBA000966,0xBB000967, +0xBC000968,0xBD000969,0xBE00096A,0xBF00096B,0x000C9413,0x000C9410,0x860008FC,0x8700095F,0xA80009BC,0xA90009BD, +0xAA0009BE,0xAB0009BF,0xAC0009C0,0xAD0009C1,0xAE0009C2,0xAF0009C3,0xB00009C4,0xB10009C5,0xB20009C6,0xB30009C7, +0xB40009C8,0xB50009C9,0xB60009CA,0xB70009CB,0xB80009CC,0xB90009CD,0xBA0009CE,0xBB0009CF,0xBC0009D0,0xBD0009D1, +0xBE0009D2,0xBF0009D3,0x000C940D,0x000C940A,0x000C9407,0x000C9404,0x000C9401,0x000C93FE,0x000C93FB,0x000C93F8, +0x000C93F5,0x000C93F2,0x000C93EF,0x000C93EC,0x000C93E9,0x000C93E6,0x000C93E3,0x000C93E0,0x000C93DD,0x000C93DA, +0x000C93D7,0x000C93D4,0x000C93D1,0x000C93CE,0x000C93CB,0x000C93C8,0x000C93C5,0x000C93C2,0x000C93BF,0x000C93BC, +0x86000948,0x8700098F,0x000C93B9,0x000C93B6,0x000C93B3,0x000C93B0,0x000C93AD,0x800009D4,0x810009D5,0x820009D6, +0x000C93AA,0x000C93A7,0x000C93A4,0x000C93A1,0x000C939E,0x000C939B,0x000C9398,0x000C9395,0x000C9392,0x000C938F, +0x000C938C,0x000C9389,0x000C9386,0xE0000864,0xA80009DA,0xA90009DB,0xAA0009DC,0xAB0009DD,0xAC0009DE,0xAD0009E2, +0xAE0009E3,0xAF0009E4,0xB00009E5,0xB10009E6,0xB20009E7,0xB30009E8,0xB40009E9,0xB50009EA,0xB60009EB,0xB70009EC, +0xB80009ED,0xB90009EE,0xBA000A08,0xBB000A09,0xBC000A0A,0xBD000A0B,0xBE000A0D,0xBF000A0E,0x000C9383,0x000C9380, +0x000C937D,0x000C937A,0xE0000878,0x000C9377,0x000C9374,0x80000A12,0x81000A13,0x82000A14,0x000C9371,0x000C936E, +0x000C936B,0x000C9368,0x86000973,0x870009D8,0x000C9365,0x000C9362,0xE10008B6,0xA8000A18,0xA9000A19,0xAA000A33, +0xAB000A34,0xAC000A35,0xAD000A36,0xAE000A37,0xAF000A38,0xB0000A39,0xB1000A3A,0xB2000A3B,0xB3000A3C,0xB4000A3D, +0xB5000A3E,0xB6000A3F,0xB7000A40,0xB8000A41,0xB9000A42,0xBA000A43,0xBB000A44,0xBC000A45,0xBD000A46,0xBE000A47, +0xBF000A48,0x000C935F,0x000C935C,0x000C9359,0x000C9356,0x000C9353,0x000C9350,0x000C934D,0x000C934A,0x000C9347, +0x000C9344,0x000C9341,0x000C933E,0x000C933B,0x000C9338,0x000C9335,0x000C9332,0x000C932F,0x000C932C,0x000C9329, +0x000C9326,0x000C9323,0x000C9320,0x000C931D,0x000C931A,0x000C9317,0x000C9314,0x000C9311,0x000C930E,0x000C930B, +0x000C9308,0x000C9305,0x000C9302,0x000C92FF,0x000C92FC,0x000C92F9,0x000C92F6,0x000C92F3,0x80000A49,0x81000A4A, +0x82000A4B,0x000C92F0,0x000C92ED,0x000C92EA,0x000C92E7,0x860009B9,0x87000A03,0xA8000A4D,0xA9000A4E,0xAA000A4F, +0xAB000A50,0xAC000A51,0xAD000A52,0xAE000A53,0xAF000A54,0xB0000A55,0xB1000A56,0xB2000A57,0xB3000A5B,0xB4000A5C, +0xB5000A5D,0xB6000A5E,0xB7000A79,0xB8000A7A,0xB9000A7B,0xBA000A7C,0xBB000A7D,0xBC000A7E,0xBD000A7F,0xBE000A80, +0xBF000A81,0x000C92E4,0x000C92E1,0x000C92DE,0x000C92DB,0x000C92D8,0x000C92D5,0x000C92D2,0x000C92CF,0x000C92CC, +0xE100091C,0x80000A86,0x81000A87,0x82000A88,0x000C92C9,0x000C92C6,0x000C92C3,0x000C92C0,0x860009EF,0x87000A58, +0x000C92BD,0x000C92BA,0x000C92B7,0x000C92B4,0x000C92B1,0x000C92AE,0x000C92AB,0x000C92A8,0x000C92A5,0x000C92A2, +0x000C929F,0xA8000A8C,0xA9000A8D,0xAA000A8E,0xAB000A8F,0xAC000A90,0xAD000A91,0xAE000A92,0xAF000A93,0xB0000A94, +0xB1000A95,0xB2000A96,0xB3000AAF,0xB4000AB0,0xB5000AB1,0xB6000AB2,0xB7000AB3,0xB8000AB4,0xB9000AB5,0xBA000AB6, +0xBB000AB7,0xBC000AB9,0xBD000ABA,0xBE000ABB,0xBF000ABC,0x000C929C,0x000C9299,0x000C9296,0x000C9293,0x000C9290, +0x000C928D,0x000C928A,0x000C9287,0x000C9284,0xE1000952,0x000C9281,0x000C927E,0x000C927B,0x000C9278,0x000C9275, +0x000C9272,0x000C926F,0x000C926C,0x000C9269,0x000C9266,0x000C9263,0x000C9260,0x000C925D,0x000C925A,0x000C9257, +0x000C9254,0x000C9251,0x000C924E,0x000C924B,0x000C9248,0x000C9245,0x000C9242,0x000C923F,0x000C923C,0x000C9239, +0x000C9236,0x000C9233,0x000C9230,0x000C922D,0x000C922A,0x000C9227,0x80000ABD,0x81000ABE,0x82000ABF,0x000C9224, +0x000C9221,0x000C921E,0x000C921B,0x86000A5A,0x87000A61,0x80000ADC,0x81000ADD,0x82000ADE,0x000C9218,0x86000A8A, +0x87000A9A,0x000C9215,0x000C9212,0x000C920F,0x000C920C,0x000C9209,0x000C9206,0x000C9203,0x000C9200,0x000C91FD, +0x000C91FA,0x000C91F7,0x000C91F4,0x000C91F1,0x000C91EE,0x000C91EB,0xE1000990,0x000C91E8,0x000C91E5,0x000C91E2, +0x000C91DF,0x000C91DC,0x000C91D9,0x000C91D6,0x000C91D3,0x000C91D0,0x000C91CD,0x000C91CA,0xA8000AC1,0xA9000AC2, +0xAA000AC3,0xAB000AC4,0xAC000AC5,0xAD000AC6,0xAE000AC7,0xAF000AC8,0xB0000AC9,0xB1000ACA,0xB2000ACB,0xB3000ACC, +0xB4000ACD,0xB5000ACE,0xB6000ACF,0xB7000AD0,0xB8000AD1,0xB9000AD2,0xBA000AD3,0xBB000AD4,0xBC000AD5,0xBD000AD6, +0xBE000AD7,0xBF000ADB,0x80000B00,0x81000B01,0x82000B1D,0x000C91C7,0x000C91C4,0x86000AA2,0x87000AF6,0x000C91C1, +0x000C91BE,0x000C91BB,0x000C91B8,0x000C91B5,0x000C91B2,0x000C91AF,0x000C91AC,0x000C91A9,0x000C91A6,0x000C91A3, +0x000C91A0,0xE10009D9,0x000C919D,0x000C919A,0x000C9197,0x000C9194,0xA8000AE7,0xA9000AE8,0xAA000AE9,0xAB000AEA, +0xAC000AEB,0xAD000AEC,0xAE000AED,0xAF000AEE,0xB0000AEF,0xB1000AF0,0xB2000AF1,0xB3000AF2,0xB4000AF3,0xB5000AF4, +0xB6000AF5,0xB7000AF7,0xB8000AF8,0xB9000AF9,0xBA000AFA,0xBB000AFB,0xBC000AFC,0xBD000AFD,0xBE000AFE,0xBF000AFF, +0xA8000B21,0xA9000B22,0xAA000B23,0xAB000B24,0xAC000B25,0xAD000B26,0xAE000B27,0xAF000B28,0xB0000B29,0xB1000B2A, +0xB2000B2B,0xB3000B2C,0xB4000B2E,0xB5000B2F,0xB6000B30,0xB7000B31,0xB8000B62,0xB9000B63,0xBA000B64,0xBB000B65, +0xBC000B66,0xBD000B67,0xBE000B68,0xBF000B69,0x000C9191,0x000C918E,0x000C918B,0x000C9188,0x000C9185,0x000C9182, +0x000C917F,0x000C917C,0xE1000A04,0x000C9179,0x000C9176,0x000C9173,0x000C9170,0x000C916D,0x000C916A,0x000C9167, +0x000C9164,0x000C9161,0x000C915E,0x000C915B,0x80000B6B,0x81000B6C,0x82000B6D,0x000C9158,0x000C9155,0x000C9152, +0x000C914F,0x000C914C,0x000C9149,0x000C9146,0x000C9143,0x000C9140,0x000C913D,0x000C913A,0x000C9137,0x000C9134, +0x000C9131,0x000C912E,0x86000B03,0x87000B0C,0x000C912B,0x000C9128,0x80000B8F,0x81000B90,0x82000B91,0x000C9125, +0x000C9122,0x000C911F,0x000C911C,0x86000B1F,0x87000B5F,0x000C9119,0x000C9116,0x000C9113,0x000C9110,0x000C910D, +0x000C910A,0x000C9107,0x000C9104,0x000C9101,0x000C90FE,0x000C90FB,0x000C90F8,0xE1000A59,0x000C90F5,0x000C90F2, +0x000C90EF,0x000C90EC,0x000C90E9,0x000C90E6,0x000C90E3,0x000C90E0,0x000C90DD,0xA8000B6F,0xA9000B70,0xAA000B71, +0xAB000B72,0xAC000B73,0xAD000B74,0xAE000B75,0xAF000B79,0xB0000B7A,0xB1000B7B,0xB2000B7C,0xB3000B7D,0xB4000B7E, +0xB5000B7F,0xB6000B80,0xB7000B81,0xB8000B82,0xB9000B83,0xBA000B84,0xBB000B85,0xBC000B86,0xBD000B87,0xBE000B8A, +0xBF000B8B,0x000C90DA,0x000C90D7,0xE1000A5F,0x000C90D4,0xA8000B95,0xA9000B96,0xAA000B97,0xAB000B98,0xAC000B99, +0xAD000B9A,0xAE000B9B,0xAF000B9C,0xB0000B9D,0xB1000B9E,0xB2000B9F,0xB3000BA0,0xB4000BA2,0xB5000BA3,0xB6000BA4, +0xB7000BA5,0xB8000BA6,0xB9000BA7,0xBA000BA8,0xBB000BA9,0xBC000BAA,0xBD000BC3,0xBE000BC4,0xBF000BC6,0x80000BE2, +0x81000BE3,0x82000BE4,0x000C90D1,0x000C90CE,0x000C90CB,0x000C90C8,0x86000B58,0x87000BA1,0x000C90C5,0x000C90C2, +0x000C90BF,0x000C90BC,0x000C90B9,0x000C90B6,0x000C90B3,0x000C90B0,0x000C90AD,0x000C90AA,0x000C90A7,0x000C90A4, +0x000C90A1,0x000C909E,0x000C909B,0x000C9098,0x000C9095,0x000C9092,0x000C908F,0x000C908C,0x000C9089,0x000C9086, +0x000C9083,0xE1000A99,0xA8000BE8,0xA9000BE9,0xAA000BEA,0xAB000BEB,0xAC000BEC,0xAD000BED,0xAE000BEE,0xAF000BEF, +0xB0000BF0,0xB1000BF1,0xB2000BF2,0xB3000BF3,0xB4000BF4,0xB5000BF5,0xB6000BF6,0xB7000BF7,0xB8000BF8,0xB9000BF9, +0xBA000BFA,0xBB000BFB,0xBC000BFC,0xBD000BFD,0xBE000BFE,0xBF000C18,0x000C9080,0x000C907D,0x000C907A,0x000C9077, +0x000C9074,0x000C9071,0x000C906E,0x000C906B,0x000C9068,0x80000C19,0x81000C1A,0x82000C1B,0x000C9065,0x000C9062, +0x000C905F,0x000C905C,0x000C9059,0x000C9056,0x000C9053,0x000C9050,0x000C904D,0x000C904A,0x000C9047,0x000C9044, +0x000C9041,0x86000B8C,0x87000BD3,0x000C903E,0xA8000C1D,0xA9000C1E,0xAA000C1F,0xAB000C20,0xAC000C24,0xAD000C25, +0xAE000C26,0xAF000C27,0xB0000C28,0xB1000C29,0xB2000C2A,0xB3000C2B,0xB4000C2C,0xB5000C2D,0xB6000C2E,0xB7000C2F, +0xB8000C30,0xB9000C33,0xBA000C4C,0xBB000C4D,0xBC000C4E,0xBD000C50,0xBE000C51,0xBF000C52,0x000C903B,0x000C9038, +0x000C9035,0xE1000B02,0x000C9032,0x000C902F,0x000C902C,0x80000C56,0x81000C57,0x82000C58,0x000C9029,0x000C9026, +0x000C9023,0x000C9020,0x86000BCC,0x87000C0D,0x000C901D,0x000C901A,0x000C9017,0x000C9014,0x000C9011,0x000C900E, +0x000C900B,0x000C9008,0x000C9005,0x000C9002,0x000C8FFF,0x000C8FFC,0x000C8FF9,0x000C8FF6,0x000C8FF3,0x000C8FF0, +0x000C8FED,0x000C8FEA,0x000C8FE7,0x000C8FE4,0x000C8FE1,0x000C8FDE,0x000C8FDB,0xE1000B0D,0xA8000C5C,0xA9000C5D, +0xAA000C5E,0xAB000C5F,0xAC000C60,0xAD000C61,0xAE000C62,0xAF000C63,0xB0000C64,0xB1000C65,0xB2000C66,0xB3000C67, +0xB4000C68,0xB5000C69,0xB6000C6A,0xB7000C6B,0xB8000C6C,0xB9000C6D,0xBA000C6E,0xBB000C6F,0xBC000C70,0xBD000C71, +0xBE000C72,0xBF000C8C,0x000C8FD8,0x80000C90,0x81000C91,0x82000C92,0x000C8FD5,0x000C8FD2,0x000C8FCF,0x000C8FCC, +0x86000BFF,0x87000C47,0x000C8FC9,0x000C8FC6,0x000C8FC3,0x000C8FC0,0x000C8FBD,0x000C8FBA,0x000C8FB7,0x000C8FB4, +0x000C8FB1,0x000C8FAE,0x000C8FAB,0x000C8FA8,0x000C8FA5,0x000C8FA2,0x000C8F9F,0x000C8F9C,0x000C8F99,0xA8000C96, +0xA9000C97,0xAA000C98,0xAB000C99,0xAC000C9A,0xAD000C9B,0xAE000C9C,0xAF000C9D,0xB0000C9E,0xB1000C9F,0xB2000CA0, +0xB3000CA1,0xB4000CA2,0xB5000CA3,0xB6000CA4,0xB7000CA5,0xB8000CA6,0xB9000CBF,0xBA000CC0,0xBB000CC1,0xBC000CC2, +0xBD000CC3,0xBE000CC4,0xBF000CC5,0x000C8F96,0x000C8F93,0x000C8F90,0x000C8F8D,0x000C8F8A,0x000C8F87,0x000C8F84, +0xE1000B60,0x80000CCA,0x81000CCB,0x82000CCC,0x000C8F81,0x000C8F7E,0x000C8F7B,0x000C8F78,0x86000C31,0x87000C81, +0x000C8F75,0x000C8F72,0x000C8F6F,0x000C8F6C,0x000C8F69,0x000C8F66,0x000C8F63,0x000C8F60,0x000C8F5D,0xA8000CD0, +0xA9000CD1,0xAA000CD2,0xAB000CD3,0xAC000CD4,0xAD000CD5,0xAE000CD6,0xAF000CD7,0xB0000CD8,0xB1000CF1,0xB2000CF2, +0xB3000CF3,0xB4000CF4,0xB5000CF5,0xB6000CF6,0xB7000CF7,0xB8000CF8,0xB9000CF9,0xBA000CFA,0xBB000CFB,0xBC000CFC, +0xBD000CFE,0xBE000CFF,0xBF000D00,0x000C8F5A,0x000C8F57,0x000C8F54,0x000C8F51,0x000C8F4E,0x000C8F4B,0x000C8F48, +0x000C8F45,0x000C8F42,0x000C8F3F,0x000C8F3C,0x000C8F39,0xE1000BAB,0x000C8F36,0x000C8F33,0x000C8F30,0x80000D04, +0x81000D05,0x82000D06,0x000C8F2D,0x000C8F2A,0x000C8F27,0x000C8F24,0x86000C73,0x87000CBB,0x000C8F21,0x000C8F1E, +0x000C8F1B,0x000C8F18,0x000C8F15,0x000C8F12,0x000C8F0F,0x000C8F0C,0x000C8F09,0x000C8F06,0x000C8F03,0x000C8F00, +0x000C8EFD,0x000C8EFA,0x000C8EF7,0x000C8EF4,0x000C8EF1,0xA8000D0A,0xA9000D0B,0xAA000D0C,0xAB000D0D,0xAC000D0E, +0xAD000D0F,0xAE000D10,0xAF000D11,0xB0000D12,0xB1000D13,0xB2000D14,0xB3000D15,0xB4000D16,0xB5000D17,0xB6000D18, +0xB7000D19,0xB8000D1A,0xB9000D33,0xBA000D34,0xBB000D35,0xBC000D36,0xBD000D37,0xBE000D38,0xBF000D39,0x000C8EEE, +0x000C8EEB,0x000C8EE8,0x000C8EE5,0x000C8EE2,0x000C8EDF,0x000C8EDC,0xE1000BD4,0x80000D3E,0x81000D3F,0x82000D40, +0x000C8ED9,0x000C8ED6,0x000C8ED3,0x000C8ED0,0x86000CA7,0x87000CFD,0x000C8ECD,0x000C8ECA,0x000C8EC7,0x000C8EC4, +0x000C8EC1,0x000C8EBE,0x000C8EBB,0x000C8EB8,0x000C8EB5,0x000C8EB2,0x000C8EAF,0xA8000D44,0xA9000D45,0xAA000D46, +0xAB000D47,0xAC000D48,0xAD000D49,0xAE000D4A,0xAF000D4B,0xB0000D4C,0xB1000D4D,0xB2000D4E,0xB3000D67,0xB4000D68, +0xB5000D69,0xB6000D6A,0xB7000D6B,0xB8000D6C,0xB9000D6D,0xBA000D6E,0xBB000D6F,0xBC000D70,0xBD000D71,0xBE000D72, +0xBF000D73,0x000C8EAC,0x000C8EA9,0x000C8EA6,0x000C8EA3,0x000C8EA0,0x000C8E9D,0x000C8E9A,0x000C8E97,0x000C8E94, +0x000C8E91,0x000C8E8E,0x000C8E8B,0x000C8E88,0xE1000C0E,0x000C8E85,0x000C8E82,0x000C8E7F,0x000C8E7C,0x000C8E79, +0x000C8E76,0x000C8E73,0x000C8E70,0x80000D75,0x81000D76,0x82000D77,0x000C8E6D,0x000C8E6A,0x000C8E67,0x000C8E64, +0x000C8E61,0x000C8E5E,0x000C8E5B,0x86000CE1,0x87000D2F,0xA8000D79,0xA9000D7A,0xAA000D7B,0xAB000D7C,0xAC000D80, +0xAD000D81,0xAE000D82,0xAF000D83,0xB0000D84,0xB1000D85,0xB2000D86,0xB3000DA1,0xB4000DA2,0xB5000DA3,0xB6000DA4, +0xB7000DA5,0xB8000DA6,0xB9000DA7,0xBA000DA8,0xBB000DA9,0xBC000DAA,0xBD000DAB,0xBE000DAC,0xBF000DAD,0x000C8E58, +0x000C8E55,0x000C8E52,0x000C8E4F,0x000C8E4C,0x000C8E49,0x000C8E46,0x000C8E43,0x000C8E40,0x000C8E3D,0x000C8E3A, +0x000C8E37,0x000C8E34,0xE1000C48,0x80000DB2,0x81000DB3,0x82000DB4,0x000C8E31,0x000C8E2E,0x000C8E2B,0x000C8E28, +0x86000D1B,0x87000D74,0x000C8E25,0x000C8E22,0x000C8E1F,0x000C8E1C,0x000C8E19,0x000C8E16,0x000C8E13,0x000C8E10, +0x000C8E0D,0x000C8E0A,0x000C8E07,0xA8000DB8,0xA9000DB9,0xAA000DBA,0xAB000DBB,0xAC000DBC,0xAD000DBD,0xAE000DBE, +0xAF000DBF,0xB0000DC0,0xB1000DC1,0xB2000DC2,0xB3000DDB,0xB4000DDC,0xB5000DDD,0xB6000DDE,0xB7000DDF,0xB8000DE0, +0xB9000DE1,0xBA000DE2,0xBB000DE3,0xBC000DE4,0xBD000DE5,0xBE000DE6,0xBF000DE7,0x000C8E04,0x000C8E01,0x000C8DFE, +0x000C8DFB,0x000C8DF8,0x000C8DF5,0x000C8DF2,0x000C8DEF,0x000C8DEC,0x000C8DE9,0x000C8DE6,0x000C8DE3,0x000C8DE0, +0xE1000C82,0x000C8DDD,0x000C8DDA,0x000C8DD7,0x000C8DD4,0x000C8DD1,0x000C8DCE,0x000C8DCB,0x000C8DC8,0x000C8DC5, +0x000C8DC2,0x000C8DBF,0x80000DE9,0x81000DEA,0x82000DEB,0x000C8DBC,0x000C8DB9,0x000C8DB6,0x000C8DB3,0x000C8DB0, +0x000C8DAD,0x000C8DAA,0x000C8DA7,0x000C8DA4,0x000C8DA1,0x000C8D9E,0x000C8D9B,0x86000D5D,0x87000DAE,0xA8000DED, +0xA9000DEE,0xAA000DEF,0xAB000DF0,0xAC000DF1,0xAD000DF2,0xAE000DF3,0xAF000DF7,0xB0000DF8,0xB1000DF9,0xB2000DFA, +0xB3000DFB,0xB4000DFC,0xB5000DFD,0xB6000DFE,0xB7000DFF,0xB8000E00,0xB9000E01,0xBA000E02,0xBB000E1D,0xBC000E1E, +0xBD000E1F,0xBE000E20,0xBF000E21,0x000C8D98,0x000C8D95,0x000C8D92,0x000C8D8F,0x000C8D8C,0xE1000CBC,0x000C8D89, +0x000C8D86,0x000C8D83,0x000C8D80,0x000C8D7D,0x000C8D7A,0x000C8D77,0x000C8D74,0x000C8D71,0x000C8D6E,0x000C8D6B, +0x80000E23,0x81000E24,0x82000E25,0xE1000DAF,0x000C8D68,0x000C8D65,0x85000D94,0xA1000E26,0xA2000E7A,0xA3000EB4, +0xA4000ED3,0xA5000F25,0xA6000F62,0xA7000F9C,0xA8000FD3,0xA9001010,0xAA00104A,0xAB001081,0xAC0010BB,0xAD0010F8, +0xAE00112F,0xAF001153,0xB00011A3,0xB10011DD,0xB200121A,0xB3001254,0xB400128E,0xB50012C8,0x86000DB6,0x87000DF6, +0x000C8D62,0x000C8D5F,0x000C8D5C,0x000C8D59,0x000C8D56,0x000C8D53,0x000C8D50,0x000C8D4D,0x000C8D4A,0x000C8D47, +0x000C8D44,0x000C8D41,0x000C8D3E,0xE1000D01,0x000C8D3B,0x000C8D38,0x000C8D35,0x000C8D32,0xA8000E27,0xA9000E28, +0xAA000E29,0xAB000E2A,0xAC000E2B,0xAD000E2C,0xAE000E2D,0xAF000E32,0xB0000E33,0xB1000E4C,0xB2000E4D,0xB3000E4E, +0xB4000E4F,0xB5000E50,0xB6000E51,0xB7000E52,0xB8000E53,0xB9000E54,0xBA000E55,0xBB000E56,0xBC000E57,0xBD000E58, +0xBE000E5A,0xBF000E5B,0x80000E5C,0x81000E5D,0x82000E79,0x000C8D2F,0x000C8D2C,0x86000DD5,0x87000E2E,0xA8000E95, +0xA9000E97,0xAA000E98,0xAB000E99,0xAC000E9A,0xAD000E9B,0xAE000E9C,0xAF000E9D,0xB0000E9E,0xB1000E9F,0xB2000EA0, +0xB3000EA1,0xB4000EA2,0xB5000EA3,0xB6000EA4,0xB7000EA5,0xB8000EA6,0xB9000EA7,0xBA000EA8,0xBB000EA9,0xBC000EAA, +0xBD000EAB,0xBE000EAC,0xBF000EAD,0x000C8D29,0xE1000D30,0x000C8D26,0x000C8D23,0x000C8D20,0x000C8D1D,0x000C8D1A, +0x000C8D17,0x000C8D14,0x000C8D11,0x000C8D0E,0x000C8D0B,0x000C8D08,0x000C8D05,0x000C8D02,0x000C8CFF,0x000C8CFC, +0x000C8CF9,0x000C8CF6,0x000C8CF3,0x000C8CF0,0x000C8CED,0x000C8CEA,0x000C8CE7,0x000C8CE4,0x80000EB1,0x81000EB2, +0x82000EB3,0x000C8CE1,0x000C8CDE,0x000C8CDB,0x000C8CD8,0x86000E30,0x87000E70,0x000C8CD5,0x000C8CD2,0x000C8CCF, +0x000C8CCC,0x000C8CC9,0x000C8CC6,0x000C8CC3,0x000C8CC0,0x000C8CBD,0x000C8CBA,0x000C8CB7,0x000C8CB4,0x000C8CB1, +0x000C8CAE,0x000C8CAB,0x000C8CA8,0x000C8CA5,0x000C8CA2,0x000C8C9F,0x000C8C9C,0x000C8C99,0x000C8C96,0xE1000D7D, +0x000C8C93,0x000C8C90,0x000C8C8D,0x000C8C8A,0x000C8C87,0x000C8C84,0x000C8C81,0x000C8C7E,0x000C8C7B,0x000C8C78, +0xA8000EB7,0xA9000EB8,0xAA000EB9,0xAB000EBA,0xAC000EBB,0xAD000EBC,0xAE000EBD,0xAF000EBE,0xB0000EBF,0xB1000EC0, +0xB2000EC1,0xB3000EC2,0xB4000EC3,0xB5000EC4,0xB6000EC5,0xB7000EC6,0xB8000EC7,0xB9000EC8,0xBA000EC9,0xBB000ECA, +0xBC000ECB,0xBD000ECC,0xBE000ECE,0xBF000ECF,0x80000ED0,0x81000ED1,0x82000ED2,0x86000E60,0x87000EAE,0x000C8C75, +0x000C8C72,0x000C8C6F,0x000C8C6C,0x000C8C69,0x000C8C66,0x000C8C63,0x000C8C60,0x000C8C5D,0x000C8C5A,0x000C8C57, +0x000C8C54,0x000C8C51,0x000C8C4E,0x000C8C4B,0x000C8C48,0x000C8C45,0x000C8C42,0xE1000DC4,0xA8000ED4,0xA9000ED5, +0xAA000ED6,0xAB000ED7,0xAC000EF5,0xAD000EF6,0xAE000EF7,0xAF000EF8,0xB0000EF9,0xB1000EFA,0xB2000EFB,0xB3000EFC, +0xB4000EFD,0xB5000EFE,0xB6000EFF,0xB7000F00,0xB8000F01,0xB9000F02,0xBA000F03,0xBB000F04,0xBC000F05,0xBD000F06, +0xBE000F20,0xBF000F21,0x000C8C3F,0x000C8C3C,0x000C8C39,0x000C8C36,0x000C8C33,0x000C8C30,0x000C8C2D,0x000C8C2A, +0x000C8C27,0x000C8C24,0x000C8C21,0x000C8C1E,0x000C8C1B,0x000C8C18,0x80000F22,0x81000F23,0x82000F24,0x000C8C15, +0x000C8C12,0x000C8C0F,0x000C8C0C,0x86000E8F,0x87000EDC,0xA8000F26,0xA9000F27,0xAA000F28,0xAB000F29,0xAC000F2A, +0xAD000F2B,0xAE000F2C,0xAF000F2D,0xB0000F31,0xB1000F32,0xB2000F33,0xB3000F34,0xB4000F4F,0xB5000F50,0xB6000F51, +0xB7000F52,0xB8000F53,0xB9000F54,0xBA000F55,0xBB000F56,0xBC000F57,0xBD000F58,0xBE000F59,0xBF000F5A,0x000C8C09, +0x000C8C06,0x000C8C03,0x000C8C00,0x000C8BFD,0x000C8BFA,0x000C8BF7,0x000C8BF4,0x000C8BF1,0x000C8BEE,0x000C8BEB, +0x000C8BE8,0xE1000DF5,0x80000F5F,0x81000F60,0x82000F61,0x000C8BE5,0x000C8BE2,0x000C8BDF,0x000C8BDC,0x86000ECD, +0x87000F16,0x000C8BD9,0x000C8BD6,0x000C8BD3,0x000C8BD0,0x000C8BCD,0x000C8BCA,0x000C8BC7,0x000C8BC4,0x000C8BC1, +0x000C8BBE,0x000C8BBB,0x000C8BB8,0x000C8BB5,0x000C8BB2,0x000C8BAF,0x000C8BAC,0xA8000F65,0xA9000F66,0xAA000F67, +0xAB000F68,0xAC000F69,0xAD000F6A,0xAE000F6B,0xAF000F6C,0xB0000F6D,0xB1000F6E,0xB2000F6F,0xB3000F70,0xB4000F71, +0xB5000F72,0xB6000F73,0xB7000F74,0xB8000F8D,0xB9000F8E,0xBA000F8F,0xBB000F90,0xBC000F91,0xBD000F92,0xBE000F93, +0xBF000F94,0x000C8BA9,0x000C8BA6,0x000C8BA3,0x000C8BA0,0x000C8B9D,0x000C8B9A,0x000C8B97,0x000C8B94,0xE1000E2F, +0x80000F99,0x81000F9A,0x82000F9B,0x000C8B91,0x000C8B8E,0x000C8B8B,0x000C8B88,0x86000F0D,0x87000F5B,0x000C8B85, +0x000C8B82,0x000C8B7F,0x000C8B7C,0x000C8B79,0x000C8B76,0x000C8B73,0x000C8B70,0x000C8B6D,0x000C8B6A,0x000C8B67, +0x000C8B64,0x000C8B61,0x000C8B5E,0x000C8B5B,0x000C8B58,0x000C8B55,0x000C8B52,0x000C8B4F,0x000C8B4C,0x000C8B49, +0xE1000E6D,0xA8000F9F,0xA9000FA0,0xAA000FA1,0xAB000FA2,0xAC000FA3,0xAD000FA4,0xAE000FA5,0xAF000FA6,0xB0000FA7, +0xB1000FA8,0xB2000FA9,0xB3000FAA,0xB4000FAB,0xB5000FAC,0xB6000FAD,0xB7000FAE,0xB8000FAF,0xB9000FB0,0xBA000FB1, +0xBB000FB2,0xBC000FB3,0xBD000FCD,0xBE000FCE,0xBF000FCF,0x000C8B46,0x000C8B43,0x000C8B40,0x000C8B3D,0x000C8B3A, +0x000C8B37,0x000C8B34,0x86000F36,0x87000F8A,0x000C8B31,0x000C8B2E,0x000C8B2B,0x000C8B28,0x000C8B25,0x80000FD0, +0x81000FD1,0x82000FD2,0xA8000FD6,0xA9000FD7,0xAA000FD8,0xAB000FD9,0xAC000FDA,0xAD000FF6,0xAE000FF7,0xAF000FF8, +0xB0000FF9,0xB1000FFA,0xB2000FFB,0xB3000FFC,0xB4000FFD,0xB5000FFE,0xB6000FFF,0xB7001000,0xB8001001,0xB9001002, +0xBA001003,0xBB001004,0xBC001005,0xBD001007,0xBE001008,0xBF001009,0x000C8B22,0x000C8B1F,0x000C8B1C,0x000C8B19, +0x000C8B16,0x000C8B13,0x000C8B10,0x000C8B0D,0x000C8B0A,0x000C8B07,0x000C8B04,0x000C8B01,0x000C8AFE,0x000C8AFB, +0x000C8AF8,0x000C8AF5,0xE1000EAF,0x000C8AF2,0x000C8AEF,0x000C8AEC,0x8000100D,0x8100100E,0x8200100F,0x000C8AE9, +0x000C8AE6,0x000C8AE3,0x000C8AE0,0x86000F75,0x87000FC4,0x000C8ADD,0x000C8ADA,0x000C8AD7,0x000C8AD4,0x000C8AD1, +0x000C8ACE,0x000C8ACB,0x000C8AC8,0x000C8AC5,0x000C8AC2,0xA8001013,0xA9001014,0xAA001015,0xAB001016,0xAC001017, +0xAD001018,0xAE001019,0xAF00101A,0xB000101B,0xB100101C,0xB2001035,0xB3001036,0xB4001037,0xB5001038,0xB6001039, +0xB700103A,0xB800103B,0xB900103C,0xBA00103D,0xBB00103E,0xBC00103F,0xBD001040,0xBE001041,0xBF001042,0x000C8ABF, +0x000C8ABC,0x000C8AB9,0x000C8AB6,0x000C8AB3,0x000C8AB0,0x000C8AAD,0x000C8AAA,0x000C8AA7,0x000C8AA4,0x000C8AA1, +0x000C8A9E,0x000C8A9B,0x000C8A98,0xE1000EDD,0x80001047,0x81001048,0x82001049,0x000C8A95,0x000C8A92,0x000C8A8F, +0x000C8A8C,0x86000FB4,0x87001006,0x000C8A89,0x000C8A86,0x000C8A83,0x000C8A80,0x000C8A7D,0x000C8A7A,0x000C8A77, +0x000C8A74,0x000C8A71,0x000C8A6E,0x000C8A6B,0x000C8A68,0x000C8A65,0x000C8A62,0x000C8A5F,0xA800104D,0xA900104E, +0xAA00104F,0xAB001050,0xAC001051,0xAD001052,0xAE001053,0xAF001054,0xB0001055,0xB1001056,0xB2001057,0xB3001058, +0xB4001059,0xB500105A,0xB600105B,0xB7001074,0xB8001075,0xB9001076,0xBA001077,0xBB001078,0xBC001079,0xBD00107A, +0xBE00107B,0xBF00107C,0x000C8A5C,0x000C8A59,0x000C8A56,0x000C8A53,0x000C8A50,0x000C8A4D,0x000C8A4A,0x000C8A47, +0x000C8A44,0xE1000F17,0x000C8A41,0x000C8A3E,0x000C8A3B,0x000C8A38,0x000C8A35,0x000C8A32,0x000C8A2F,0x000C8A2C, +0x8000107E,0x8100107F,0x82001080,0x000C8A29,0x000C8A26,0x000C8A23,0x000C8A20,0x000C8A1D,0x000C8A1A,0x000C8A17, +0x86000FEA,0x87001043,0xA8001082,0xA9001083,0xAA001084,0xAB001085,0xAC001089,0xAD00108A,0xAE00108B,0xAF00108C, +0xB000108D,0xB100108E,0xB200108F,0xB30010AA,0xB40010AB,0xB50010AC,0xB60010AD,0xB70010AE,0xB80010AF,0xB90010B0, +0xBA0010B1,0xBB0010B2,0xBC0010B3,0xBD0010B5,0xBE0010B6,0xBF0010B7,0x000C8A14,0x000C8A11,0x000C8A0E,0x000C8A0B, +0x000C8A08,0x000C8A05,0x000C8A02,0x000C89FF,0x000C89FC,0x000C89F9,0xE1000F4E,0x000C89F6,0x000C89F3,0x000C89F0, +0x000C89ED,0x000C89EA,0x000C89E7,0x000C89E4,0x000C89E1,0x000C89DE,0x000C89DB,0x000C89D8,0x000C89D5,0x000C89D2, +0x000C89CF,0x800010B8,0x810010B9,0x820010BA,0x000C89CC,0x000C89C9,0x000C89C6,0x000C89C3,0x86001024,0x87001072, +0xA80010BC,0xA90010BD,0xAA0010BE,0xAB0010BF,0xAC0010C0,0xAD0010C1,0xAE0010C2,0xAF0010C6,0xB00010C7,0xB10010C8, +0xB20010C9,0xB30010E4,0xB40010E5,0xB50010E6,0xB60010E7,0xB70010E8,0xB80010E9,0xB90010EA,0xBA0010EB,0xBB0010EC, +0xBC0010ED,0xBD0010EE,0xBE0010EF,0xBF0010F0,0x000C89C0,0x000C89BD,0x000C89BA,0x000C89B7,0x000C89B4,0x000C89B1, +0x000C89AE,0x000C89AB,0x000C89A8,0x000C89A5,0x000C89A2,0x000C899F,0x000C899C,0xE1000F8B,0x800010F5,0x810010F6, +0x820010F7,0x000C8999,0x000C8996,0x000C8993,0x000C8990,0x8600105C,0x870010B4,0x000C898D,0x000C898A,0x000C8987, +0x000C8984,0x000C8981,0x000C897E,0x000C897B,0x000C8978,0x000C8975,0xA80010FB,0xA90010FC,0xAA0010FD,0xAB0010FE, +0xAC0010FF,0xAD001100,0xAE001101,0xAF001102,0xB0001103,0xB100111C,0xB200111D,0xB300111E,0xB400111F,0xB5001120, +0xB6001121,0xB7001122,0xB8001123,0xB9001124,0xBA001125,0xBB001126,0xBC001127,0xBD001128,0xBE001129,0xBF00112A, +0x000C8972,0x000C896F,0x000C896C,0x000C8969,0x000C8966,0x000C8963,0x000C8960,0x000C895D,0x000C895A,0x000C8957, +0x000C8954,0x000C8951,0x000C894E,0x000C894B,0x000C8948,0xE1000FC5,0x000C8945,0x000C8942,0x000C893F,0x000C893C, +0x000C8939,0x000C8936,0x000C8933,0x000C8930,0x8000112C,0x8100112D,0x8200112E,0x000C892D,0x000C892A,0x000C8927, +0x000C8924,0x000C8921,0x000C891E,0x000C891B,0x000C8918,0x000C8915,0x000C8912,0x000C890F,0x000C890C,0x000C8909, +0x000C8906,0x000C8903,0x000C8900,0x000C88FD,0x000C88FA,0x860010C4,0x870010CD,0x000C88F7,0x000C88F4,0x80001150, +0x81001151,0x82001152,0x000C88F1,0x000C88EE,0x000C88EB,0x000C88E8,0x860010DC,0x8700112B,0x000C88E5,0x000C88E2, +0x000C88DF,0x000C88DC,0x000C88D9,0x000C88D6,0x000C88D3,0x000C88D0,0x000C88CD,0x000C88CA,0x000C88C7,0x000C88C4, +0xE100100A,0x000C88C1,0x000C88BE,0x000C88BB,0x000C88B8,0x000C88B5,0x000C88B2,0x000C88AF,0x000C88AC,0x000C88A9, +0xA8001130,0xA9001131,0xAA001132,0xAB001133,0xAC001137,0xAD001138,0xAE001139,0xAF00113A,0xB000113B,0xB100113C, +0xB200113D,0xB300113E,0xB400113F,0xB5001140,0xB6001141,0xB7001142,0xB8001143,0xB9001144,0xBA001145,0xBB001146, +0xBC001147,0xBD001148,0xBE00114B,0xBF00114C,0xA8001156,0xA9001157,0xAA001158,0xAB001159,0xAC00115A,0xAD00115B, +0xAE00115C,0xAF00115D,0xB000115E,0xB100115F,0xB2001160,0xB3001161,0xB4001163,0xB5001164,0xB6001165,0xB7001166, +0xB8001167,0xB9001168,0xBA001169,0xBB00116A,0xBC00116B,0xBD00119D,0xBE00119E,0xBF00119F,0xE1001044,0x000C88A6, +0x000C88A3,0x000C88A0,0x000C889D,0x000C889A,0x000C8897,0x000C8894,0x000C8891,0x000C888E,0x000C888B,0x000C8888, +0x000C8885,0x000C8882,0x000C887F,0x800011A0,0x810011A1,0x820011A2,0x000C887C,0x000C8879,0x000C8876,0x000C8873, +0x000C8870,0x000C886D,0x000C886A,0x000C8867,0x000C8864,0x000C8861,0x000C885E,0x000C885B,0x86001114,0x87001162, +0xA80011A4,0xA90011A5,0xAA0011A6,0xAB0011A7,0xAC0011A8,0xAD0011A9,0xAE0011AA,0xAF0011AE,0xB00011AF,0xB10011B0, +0xB20011B1,0xB30011B2,0xB40011B3,0xB50011B4,0xB60011B5,0xB70011B6,0xB80011B7,0xB90011B8,0xBA0011B9,0xBB0011D4, +0xBC0011D5,0xBD0011D6,0xBE0011D7,0xBF0011D8,0x000C8858,0x000C8855,0x000C8852,0x000C884F,0x000C884C,0xE1001073, +0x000C8849,0x000C8846,0x000C8843,0x000C8840,0x000C883D,0x000C883A,0x000C8837,0x000C8834,0x800011DA,0x810011DB, +0x820011DC,0x000C8831,0x000C882E,0x000C882B,0x000C8828,0x000C8825,0x000C8822,0x000C881F,0x000C881C,0x000C8819, +0x000C8816,0x000C8813,0x000C8810,0x000C880D,0x8600114D,0x87001194,0x000C880A,0xA80011DE,0xA90011DF,0xAA0011E0, +0xAB0011E1,0xAC0011E5,0xAD0011E6,0xAE0011E7,0xAF0011E8,0xB00011E9,0xB10011EA,0xB20011EB,0xB30011EC,0xB40011ED, +0xB50011EE,0xB60011EF,0xB70011F0,0xB80011F1,0xB90011F4,0xBA00120D,0xBB00120E,0xBC00120F,0xBD001211,0xBE001212, +0xBF001213,0x000C8807,0x000C8804,0x000C8801,0xE10010C3,0x000C87FE,0x000C87FB,0x000C87F8,0x80001217,0x81001218, +0x82001219,0x000C87F5,0x000C87F2,0x000C87EF,0x000C87EC,0x8600118D,0x870011CE,0x000C87E9,0x000C87E6,0x000C87E3, +0x000C87E0,0x000C87DD,0x000C87DA,0x000C87D7,0x000C87D4,0x000C87D1,0x000C87CE,0x000C87CB,0x000C87C8,0x000C87C5, +0x000C87C2,0x000C87BF,0x000C87BC,0x000C87B9,0x000C87B6,0x000C87B3,0x000C87B0,0x000C87AD,0x000C87AA,0x000C87A7, +0xE10010CE,0xA800121D,0xA900121E,0xAA00121F,0xAB001220,0xAC001221,0xAD001222,0xAE001223,0xAF001224,0xB0001225, +0xB1001226,0xB2001227,0xB3001228,0xB4001229,0xB500122A,0xB600122B,0xB700122C,0xB800122D,0xB900122E,0xBA00122F, +0xBB001230,0xBC001231,0xBD001232,0xBE001233,0xBF00124D,0x000C87A4,0x80001251,0x81001252,0x82001253,0x000C87A1, +0x000C879E,0x000C879B,0x000C8798,0x860011BA,0x87001208,0x000C8795,0x000C8792,0x000C878F,0x000C878C,0x000C8789, +0x000C8786,0x000C8783,0x000C8780,0x000C877D,0x000C877A,0x000C8777,0xA8001257,0xA9001258,0xAA001259,0xAB00125A, +0xAC00125B,0xAD00125C,0xAE00125D,0xAF00125E,0xB000125F,0xB1001260,0xB2001261,0xB300127A,0xB400127B,0xB500127C, +0xB600127D,0xB700127E,0xB800127F,0xB9001280,0xBA001281,0xBB001282,0xBC001283,0xBD001285,0xBE001286,0xBF001287, +0x000C8774,0x000C8771,0x000C876E,0x000C876B,0x000C8768,0x000C8765,0x000C8762,0x000C875F,0x000C875C,0x000C8759, +0xE1001134,0x000C8756,0x000C8753,0x000C8750,0x8000128B,0x8100128C,0x8200128D,0x000C874D,0x000C874A,0x000C8747, +0x000C8744,0x860011F2,0x87001242,0x000C8741,0x000C873E,0x000C873B,0x000C8738,0x000C8735,0x000C8732,0x000C872F, +0x000C872C,0x000C8729,0xA8001291,0xA9001292,0xAA001293,0xAB001294,0xAC001295,0xAD001296,0xAE001297,0xAF001298, +0xB0001299,0xB10012B2,0xB20012B3,0xB30012B4,0xB40012B5,0xB50012B6,0xB60012B7,0xB70012B8,0xB80012B9,0xB90012BA, +0xBA0012BB,0xBB0012BC,0xBC0012BD,0xBD0012BF,0xBE0012C0,0xBF0012C1,0x000C8726,0x000C8723,0x000C8720,0x000C871D, +0x000C871A,0x000C8717,0x000C8714,0x000C8711,0x000C870E,0x000C870B,0x000C8708,0x000C8705,0xE100116C,0x000C8702, +0x000C86FF,0x000C86FC,0x800012C5,0x810012C6,0x820012C7,0x000C86F9,0x000C86F6,0x000C86F3,0x000C86F0,0x86001234, +0x87001284,0x000C86ED,0x000C86EA,0x000C86E7,0x000C86E4,0x000C86E1,0x000C86DE,0x000C86DB,0x000C86D8,0x000C86D5, +0x000C86D2,0x000C86CF,0x000C86CC,0x000C86C9,0x000C86C6,0x000C86C3,0x000C86C0,0x000C86BD,0xA80012CB,0xA90012CC, +0xAA0012CD,0xAB0012CE,0xAC0012CF,0xAD0012D0,0xAE0012D1,0xAF0012D2,0xB00012D3,0xB10012D4,0xB20012D5,0xB30012D6, +0xB40012D7,0xB50012D8,0xB60012D9,0xB70012DA,0xB80012DB,0xB90012F4,0xBA0012F5,0xBB0012F6,0xBC0012F7,0xBD0012F8, +0xBE0012F9,0xBF0012FA,0x000C86BA,0x000C86B7,0x000C86B4,0x000C86B1,0x000C86AE,0x000C86AB,0x000C86A8,0xE1001195, +0x000C86A5,0x000C86A2,0x000C869F,0x000C869C,0x000C8699,0x000C8696,0x000C8693,0x000C8690,0x800012FC,0x810012FD, +0x820012FE,0x000C868D,0x000C868A,0x000C8687,0x000C8684,0x000C8681,0x000C867E,0x85001276,0x000C867B,0x8600128F, +0x870012DC,0x000C8678,0x000C8675,0x000C8672,0x000C866F,0x000C866C,0xE1001288,0xA10012FF,0xA2001350,0xA300138A, +0xA40013C7,0xA5001401,0xA6001438,0xA7001475,0xA80014AC,0xA90014D0,0xAA001507,0xAB00155A,0xAC001594,0xAD0015D1, +0xAE00160B,0xAF001645,0xB000167F,0xB10016B6,0xB20016F3,0xB300172D,0xB4001764,0xB500179E,0x000C8669,0x000C8666, +0x000C8663,0x000C8660,0x000C865D,0x000C865A,0x000C8657,0x000C8654,0x000C8651,0xE10011CF,0x000C864E,0xA8001300, +0xA9001301,0xAA001302,0xAB001303,0xAC001307,0xAD001308,0xAE001309,0xAF00130A,0xB000130B,0xB100130C,0xB200130E, +0xB3001311,0xB4001312,0xB5001313,0xB6001314,0xB7001315,0xB800132C,0xB900132D,0xBA00132E,0xBB00132F,0xBC001330, +0xBD001331,0xBE001332,0xBF001333,0x000C864B,0x000C8648,0x000C8645,0x000C8642,0x000C863F,0x000C863C,0x000C8639, +0x000C8636,0x000C8633,0x000C8630,0x000C862D,0x000C862A,0x000C8627,0x80001334,0x81001336,0x8200134F,0x000C8624, +0x000C8621,0x000C861E,0x000C861B,0x860012C9,0x8700130D,0x000C8618,0x000C8615,0x000C8612,0x000C860F,0x000C860C, +0x000C8609,0x000C8606,0x000C8603,0x000C8600,0x000C85FD,0xE1001209,0x000C85FA,0xA8001351,0xA9001352,0xAA001353, +0xAB001354,0xAC001355,0xAD001356,0xAE001357,0xAF001358,0xB0001359,0xB100135A,0xB200135B,0xB300135F,0xB4001360, +0xB5001361,0xB6001362,0xB7001365,0xB8001366,0xB9001367,0xBA001368,0xBB001369,0xBC00136A,0xBD00136B,0xBE00136C, +0xBF00136D,0x000C85F7,0x000C85F4,0x860012E8,0x87001341,0x8000136E,0x81001370,0x82001389,0xA80013A8,0xA90013AA, +0xAA0013AB,0xAB0013AC,0xAC0013AD,0xAD0013AE,0xAE0013AF,0xAF0013B0,0xB00013B1,0xB10013B2,0xB20013B3,0xB30013B4, +0xB40013B5,0xB50013B6,0xB60013B7,0xB70013B8,0xB80013B9,0xB90013BA,0xBA0013BB,0xBB0013BC,0xBC0013BD,0xBD0013BE, +0xBE0013BF,0xBF0013C0,0x000C85F1,0xE1001243,0x000C85EE,0x000C85EB,0x000C85E8,0x000C85E5,0x000C85E2,0x000C85DF, +0x000C85DC,0x000C85D9,0x000C85D6,0x000C85D3,0x000C85D0,0x000C85CD,0x000C85CA,0x000C85C7,0x000C85C4,0x000C85C1, +0x000C85BE,0x000C85BB,0x000C85B8,0x000C85B5,0x000C85B2,0x000C85AF,0x000C85AC,0x800013C4,0x810013C5,0x820013C6, +0x000C85A9,0x000C85A6,0x000C85A3,0x000C85A0,0x86001339,0x8700137B,0x000C859D,0x000C859A,0x000C8597,0x000C8594, +0x000C8591,0x000C858E,0x000C858B,0x000C8588,0x000C8585,0x000C8582,0x000C857F,0x000C857C,0x000C8579,0x000C8576, +0x000C8573,0x000C8570,0x000C856D,0x000C856A,0x000C8567,0x000C8564,0x000C8561,0x000C855E,0xE1001289,0xA80013CA, +0xA90013CB,0xAA0013CC,0xAB0013CD,0xAC0013CE,0xAD0013CF,0xAE0013D0,0xAF0013D1,0xB00013D2,0xB10013D3,0xB20013D4, +0xB30013D5,0xB40013D6,0xB50013D7,0xB60013D8,0xB70013D9,0xB80013DA,0xB90013DB,0xBA0013DC,0xBB0013DD,0xBC0013DE, +0xBD0013DF,0xBE0013F9,0xBF0013FA,0x000C855B,0x000C8558,0x800013FE,0x810013FF,0x82001400,0x000C8555,0x000C8552, +0x000C854F,0x000C854C,0x8600135C,0x870013C1,0xA800141C,0xA900141D,0xAA00141E,0xAB00141F,0xAC001420,0xAD001421, +0xAE001422,0xAF001423,0xB0001424,0xB1001425,0xB2001426,0xB3001427,0xB4001428,0xB5001429,0xB600142A,0xB700142B, +0xB800142C,0xB900142D,0xBA00142E,0xBB00142F,0xBC001430,0xBD001432,0xBE001433,0xBF001434,0x000C8549,0x000C8546, +0x000C8543,0x000C8540,0x000C853D,0x000C853A,0x000C8537,0x000C8534,0x000C8531,0x000C852E,0x000C852B,0x000C8528, +0x000C8525,0x000C8522,0x000C851F,0x000C851C,0x000C8519,0x000C8516,0x000C8513,0x000C8510,0x000C850D,0xE10012DD, +0x000C850A,0x000C8507,0x000C8504,0x000C8501,0x000C84FE,0x000C84FB,0x000C84F8,0x000C84F5,0x000C84F2,0x000C84EF, +0x000C84EC,0x000C84E9,0x000C84E6,0x000C84E3,0x000C84E0,0x80001435,0x81001436,0x82001437,0x000C84DD,0x000C84DA, +0x000C84D7,0x000C84D4,0x860013A2,0x870013EF,0xA8001439,0xA900143A,0xAA00143B,0xAB00143C,0xAC00143D,0xAD00143E, +0xAE00143F,0xAF001440,0xB0001444,0xB1001445,0xB2001446,0xB3001447,0xB4001462,0xB5001463,0xB6001464,0xB7001465, +0xB8001466,0xB9001467,0xBA001468,0xBB001469,0xBC00146A,0xBD00146C,0xBE00146D,0xBF00146E,0x000C84D1,0x000C84CE, +0x000C84CB,0x000C84C8,0x000C84C5,0x000C84C2,0x000C84BF,0x000C84BC,0x000C84B9,0xE1001305,0x000C84B6,0x000C84B3, +0x000C84B0,0x80001472,0x81001473,0x82001474,0x000C84AD,0x000C84AA,0x000C84A7,0x000C84A4,0x860013E0,0x87001431, +0x000C84A1,0x000C849E,0x000C849B,0x000C8498,0x000C8495,0x000C8492,0x000C848F,0x000C848C,0x000C8489,0x000C8486, +0x000C8483,0x000C8480,0x000C847D,0x000C847A,0x000C8477,0x000C8474,0xA8001478,0xA9001479,0xAA00147A,0xAB00147B, +0xAC00147C,0xAD00147D,0xAE00147E,0xAF00147F,0xB0001480,0xB1001481,0xB2001482,0xB3001483,0xB4001484,0xB5001485, +0xB6001486,0xB7001487,0xB80014A0,0xB90014A1,0xBA0014A2,0xBB0014A3,0xBC0014A4,0xBD0014A5,0xBE0014A6,0xBF0014A7, +0x000C8471,0x000C846E,0x000C846B,0x000C8468,0x000C8465,0x000C8462,0x000C845F,0x000C845C,0xE1001342,0x000C8459, +0x000C8456,0x000C8453,0x000C8450,0x000C844D,0x000C844A,0x000C8447,0x000C8444,0x800014A9,0x810014AA,0x820014AB, +0x000C8441,0x000C843E,0x000C843B,0x000C8438,0x000C8435,0x000C8432,0x000C842F,0x000C842C,0x000C8429,0x000C8426, +0x000C8423,0x000C8420,0x000C841D,0x000C841A,0x000C8417,0x000C8414,0x000C8411,0x000C840E,0x000C840B,0x86001442, +0x8700144A,0x000C8408,0x800014CD,0x810014CE,0x820014CF,0x000C8405,0x000C8402,0x000C83FF,0x000C83FC,0x86001476, +0x87001488,0x000C83F9,0x000C83F6,0x000C83F3,0x000C83F0,0x000C83ED,0x000C83EA,0x000C83E7,0x000C83E4,0x000C83E1, +0x000C83DE,0x000C83DB,0x000C83D8,0x000C83D5,0x000C83D2,0x000C83CF,0xE100137C,0x000C83CC,0x000C83C9,0x000C83C6, +0x000C83C3,0x000C83C0,0x000C83BD,0x000C83BA,0xA80014AD,0xA90014AE,0xAA0014AF,0xAB0014B0,0xAC0014B4,0xAD0014B5, +0xAE0014B6,0xAF0014B7,0xB00014B8,0xB10014B9,0xB20014BA,0xB30014BB,0xB40014BC,0xB50014BD,0xB60014BE,0xB70014BF, +0xB80014C0,0xB90014C1,0xBA0014C2,0xBB0014C3,0xBC0014C4,0xBD0014C5,0xBE0014C6,0xBF0014C9,0x000C83B7,0x000C83B4, +0x000C83B1,0x000C83AE,0x000C83AB,0x000C83A8,0x80001504,0x81001505,0x82001506,0x000C83A5,0x000C83A2,0x000C839F, +0x000C839C,0x8600148E,0x870014E2,0x000C8399,0x000C8396,0x000C8393,0x000C8390,0x000C838D,0x000C838A,0x000C8387, +0x000C8384,0xE10013C2,0x000C8381,0x000C837E,0x000C837B,0x000C8378,0xA80014D3,0xA90014D4,0xAA0014D5,0xAB0014D6, +0xAC0014D7,0xAD0014D8,0xAE0014D9,0xAF0014DA,0xB00014DB,0xB10014DC,0xB20014DD,0xB30014DE,0xB40014DF,0xB50014E0, +0xB60014E1,0xB70014E3,0xB80014E4,0xB90014E5,0xBA0014E6,0xBB0014E7,0xBC0014E8,0xBD0014E9,0xBE001502,0xBF001503, +0xA800150B,0xA900150C,0xAA00150D,0xAB00150E,0xAC001511,0xAD001512,0xAE001513,0xAF001514,0xB0001515,0xB1001516, +0xB2001517,0xB3001518,0xB400151A,0xB500151B,0xB600151C,0xB700151D,0xB800154E,0xB900154F,0xBA001550,0xBB001551, +0xBC001552,0xBD001553,0xBE001554,0xBF001555,0x000C8375,0x000C8372,0x000C836F,0x000C836C,0x000C8369,0x000C8366, +0x000C8363,0x000C8360,0xE10013F0,0x000C835D,0x000C835A,0x000C8357,0x000C8354,0x000C8351,0x000C834E,0x000C834B, +0x000C8348,0x000C8345,0x000C8342,0x000C833F,0x80001557,0x81001558,0x82001559,0x000C833C,0x000C8339,0x000C8336, +0x000C8333,0x000C8330,0x000C832D,0x000C832A,0x000C8327,0x000C8324,0x000C8321,0x000C831E,0x860014CA,0x87001519, +0xA800155B,0xA900155C,0xAA00155D,0xAB00155E,0xAC00155F,0xAD001560,0xAE001561,0xAF001565,0xB0001566,0xB1001567, +0xB2001568,0xB3001569,0xB400156A,0xB500156B,0xB600156C,0xB700156D,0xB800156E,0xB900156F,0xBA00158A,0xBB00158B, +0xBC00158C,0xBD00158E,0xBE00158F,0xBF001590,0x000C831B,0x000C8318,0x000C8315,0xE1001441,0x000C8312,0x000C830F, +0x000C830C,0x000C8309,0x000C8306,0x000C8303,0x000C8300,0x8600150A,0x8700154B,0x000C82FD,0x000C82FA,0x80001591, +0x81001592,0x82001593,0x000C82F7,0x000C82F4,0x000C82F1,0x000C82EE,0x000C82EB,0x000C82E8,0x000C82E5,0x000C82E2, +0x000C82DF,0x000C82DC,0x000C82D9,0x000C82D6,0x000C82D3,0x000C82D0,0x000C82CD,0x000C82CA,0x000C82C7,0x000C82C4, +0x000C82C1,0x000C82BE,0x000C82BB,0xE100144B,0xA8001597,0xA9001598,0xAA00159C,0xAB00159D,0xAC00159E,0xAD00159F, +0xAE0015A0,0xAF0015A1,0xB00015A2,0xB10015A3,0xB20015A4,0xB30015A5,0xB40015A6,0xB50015A7,0xB60015A8,0xB70015A9, +0xB80015AA,0xB90015AB,0xBA0015AC,0xBB0015AD,0xBC0015AE,0xBD0015AF,0xBE0015B0,0xBF0015CA,0x000C82B8,0x800015CE, +0x810015CF,0x820015D0,0x000C82B5,0x000C82B2,0x000C82AF,0x000C82AC,0x86001541,0x87001585,0x000C82A9,0x000C82A6, +0x000C82A3,0x000C82A0,0x000C829D,0x000C829A,0x000C8297,0x000C8294,0x000C8291,0x000C828E,0x000C828B,0x000C8288, +0x000C8285,0x000C8282,0x000C827F,0x000C827C,0x000C8279,0x000C8276,0x000C8273,0x000C8270,0xE1001489,0xA80015D4, +0xA90015D5,0xAA0015D6,0xAB0015D7,0xAC0015D8,0xAD0015D9,0xAE0015DA,0xAF0015DB,0xB00015DC,0xB10015DD,0xB20015DE, +0xB30015DF,0xB40015E0,0xB50015E1,0xB60015E2,0xB70015E3,0xB80015E4,0xB90015E5,0xBA0015E6,0xBB0015E7,0xBC001601, +0xBD001602,0xBE001603,0xBF001604,0x000C826D,0x000C826A,0x000C8267,0x000C8264,0x80001608,0x81001609,0x8200160A, +0x000C8261,0x000C825E,0x000C825B,0x000C8258,0x86001570,0x870015BF,0x000C8255,0x000C8252,0x000C824F,0x000C824C, +0x000C8249,0x000C8246,0x000C8243,0x000C8240,0x000C823D,0x000C823A,0xA800160E,0xA900160F,0xAA001610,0xAB001611, +0xAC001612,0xAD001613,0xAE001614,0xAF001615,0xB0001616,0xB1001617,0xB2001630,0xB3001631,0xB4001632,0xB5001633, +0xB6001634,0xB7001635,0xB8001636,0xB9001637,0xBA001638,0xBB001639,0xBC00163A,0xBD00163C,0xBE00163D,0xBF00163E, +0x000C8237,0x000C8234,0x000C8231,0x000C822E,0x000C822B,0x000C8228,0x000C8225,0x000C8222,0x000C821F,0x000C821C, +0x000C8219,0xE10014EA,0x000C8216,0x000C8213,0x000C8210,0x80001642,0x81001643,0x82001644,0x000C820D,0x000C820A, +0x000C8207,0x000C8204,0x860015B1,0x870015F9,0x000C8201,0x000C81FE,0x000C81FB,0x000C81F8,0x000C81F5,0x000C81F2, +0x000C81EF,0x000C81EC,0x000C81E9,0x000C81E6,0x000C81E3,0x000C81E0,0x000C81DD,0x000C81DA,0x000C81D7,0x000C81D4, +0x000C81D1,0xA8001648,0xA9001649,0xAA00164A,0xAB00164B,0xAC00164C,0xAD00164D,0xAE00164E,0xAF00164F,0xB0001650, +0xB1001651,0xB2001652,0xB3001653,0xB4001654,0xB5001655,0xB6001656,0xB7001657,0xB8001658,0xB9001671,0xBA001672, +0xBB001673,0xBC001674,0xBD001676,0xBE001677,0xBF001678,0x000C81CE,0x000C81CB,0x000C81C8,0x000C81C5,0xE100150F, +0x000C81C2,0x000C81BF,0x000C81BC,0x8000167C,0x8100167D,0x8200167E,0x000C81B9,0x000C81B6,0x000C81B3,0x000C81B0, +0x860015E8,0x8700163B,0x000C81AD,0x000C81AA,0x000C81A7,0x000C81A4,0x000C81A1,0x000C819E,0x000C819B,0x000C8198, +0x000C8195,0x000C8192,0x000C818F,0x000C818C,0x000C8189,0x000C8186,0xA8001682,0xA9001683,0xAA001684,0xAB001685, +0xAC001686,0xAD001687,0xAE001688,0xAF001689,0xB000168A,0xB100168B,0xB200168C,0xB300168D,0xB400168E,0xB500168F, +0xB60016A8,0xB70016A9,0xB80016AA,0xB90016AB,0xBA0016AC,0xBB0016AD,0xBC0016AE,0xBD0016AF,0xBE0016B0,0xBF0016B1, +0x000C8183,0x000C8180,0x000C817D,0x000C817A,0x000C8177,0x000C8174,0x000C8171,0x000C816E,0x000C816B,0x000C8168, +0xE100154C,0x000C8165,0x000C8162,0x000C815F,0x000C815C,0x000C8159,0x000C8156,0x000C8153,0x000C8150,0x800016B3, +0x810016B4,0x820016B5,0x000C814D,0x000C814A,0x000C8147,0x000C8144,0x000C8141,0x000C813E,0x000C813B,0x8600161F, +0x8700166D,0xA80016B7,0xA90016B8,0xAA0016B9,0xAB0016BA,0xAC0016BE,0xAD0016BF,0xAE0016C0,0xAF0016C1,0xB00016C2, +0xB10016C3,0xB20016C4,0xB30016DF,0xB40016E0,0xB50016E1,0xB60016E2,0xB70016E3,0xB80016E4,0xB90016E5,0xBA0016E6, +0xBB0016E7,0xBC0016E8,0xBD0016E9,0xBE0016EA,0xBF0016EB,0x000C8138,0x000C8135,0x000C8132,0x000C812F,0x000C812C, +0x000C8129,0x000C8126,0x000C8123,0x000C8120,0x000C811D,0x000C811A,0x000C8117,0x000C8114,0xE1001586,0x800016F0, +0x810016F1,0x820016F2,0x000C8111,0x000C810E,0x000C810B,0x000C8108,0x86001659,0x870016A7,0x000C8105,0x000C8102, +0x000C80FF,0x000C80FC,0x000C80F9,0x000C80F6,0x000C80F3,0x000C80F0,0x000C80ED,0x000C80EA,0x000C80E7,0xA80016F6, +0xA90016F7,0xAA0016F8,0xAB0016F9,0xAC0016FA,0xAD0016FB,0xAE0016FC,0xAF0016FD,0xB00016FE,0xB10016FF,0xB2001700, +0xB3001719,0xB400171A,0xB500171B,0xB600171C,0xB700171D,0xB800171E,0xB900171F,0xBA001720,0xBB001721,0xBC001722, +0xBD001723,0xBE001724,0xBF001725,0x000C80E4,0x000C80E1,0x000C80DE,0x000C80DB,0x000C80D8,0x000C80D5,0x000C80D2, +0x000C80CF,0x000C80CC,0x000C80C9,0x000C80C6,0x000C80C3,0x000C80C0,0xE10015C0,0x8000172A,0x8100172B,0x8200172C, +0x000C80BD,0x000C80BA,0x000C80B7,0x000C80B4,0x000C80B1,0x000C80AE,0x000C80AB,0x000C80A8,0x000C80A5,0x000C80A2, +0x000C809F,0x000C809C,0x000C8099,0x000C8096,0x86001692,0x870016EC,0xA800172E,0xA900172F,0xAA001730,0xAB001731, +0xAC001732,0xAD001733,0xAE001734,0xAF001735,0xB0001736,0xB1001737,0xB2001752,0xB3001753,0xB4001754,0xB5001755, +0xB6001756,0xB7001757,0xB8001758,0xB9001759,0xBA00175A,0xBB00175B,0xBC00175C,0xBD00175D,0xBE00175E,0xBF00175F, +0x000C8093,0x000C8090,0x000C808D,0x000C808A,0x000C8087,0x000C8084,0x000C8081,0x000C807E,0x000C807B,0x000C8078, +0x000C8075,0x000C8072,0x000C806F,0x000C806C,0xE10015FA,0x000C8069,0x000C8066,0x000C8063,0x000C8060,0x000C805D, +0x000C805A,0x000C8057,0x000C8054,0x000C8051,0x000C804E,0x000C804B,0x80001761,0x81001762,0x82001763,0x000C8048, +0x000C8045,0x000C8042,0x000C803F,0x860016CD,0x87001726,0xA8001765,0xA9001766,0xAA001767,0xAB001768,0xAC001769, +0xAD00176A,0xAE00176B,0xAF00176F,0xB0001770,0xB1001771,0xB2001772,0xB300178D,0xB400178E,0xB500178F,0xB6001790, +0xB7001791,0xB8001792,0xB9001793,0xBA001794,0xBB001795,0xBC001796,0xBD001798,0xBE001799,0xBF00179A,0x000C803C, +0x000C8039,0x000C8036,0x000C8033,0x000C8030,0x000C802D,0x000C802A,0x000C8027,0x000C8024,0x000C8021,0xE100163F, +0x000C801E,0x000C801B,0x000C8018,0x000C8015,0x000C8012,0x000C800F,0x000C800C,0x000C8009,0x000C8006,0x000C8003, +0x000C8000,0x000C7FFD,0x000C7FFA,0x000C7FF7,0x8000179B,0x8100179C,0x8200179D,0x000C7FF4,0x000C7FF1,0x000C7FEE, +0x000C7FEB,0x86001707,0x87001760,0xA800179F,0xA90017A0,0xAA0017A1,0xAB0017A2,0xAC0017A3,0xAD0017A4,0xAE0017A5, +0xAF0017A9,0xB00017AA,0xB10017AB,0xB20017AC,0xB30017C7,0xB40017C8,0xB50017C9,0xB60017CA,0xB70017CB,0xB80017CC, +0xB90017CD,0xBA0017CE,0xBB0017CF,0xBC0017D0,0xBD0017D1,0xBE0017D2,0xBF0017D3,0x000C7FE8,0x000C7FE5,0x000C7FE2, +0x000C7FDF,0x000C7FDC,0x000C7FD9,0x000C7FD6,0x000C7FD3,0x000C7FD0,0x000C7FCD,0x000C7FCA,0x000C7FC7,0x000C7FC4, +0xE100166E,0x000C7FC1,0x000C7FBE,0x000C7FBB,0x000C7FB8,0x000C7FB5,0x000C7FB2,0x000C7FAF,0x000C7FAC,0x000C7FA9, +0x000C7FA6,0x000C7FA3,0x800017D5,0x810017D6,0x820017D7,0xE100176C,0x000C7FA0,0x000C7F9D,0x000C7F9A,0x000C7F97, +0x000C7F94,0x000C7F91,0x000C7F8E,0x000C7F8B,0x000C7F88,0x000C7F85,0x000C7F82,0x000C7F7F,0x000C7F7C,0x85001751, +0xA10017D8,0xA2001811,0xA300184B,0xA40018A0,0xA50018DA,0xA6001914,0xA700194E,0xA8001988,0xA90019C2,0xAA0019FC, +0xAB001A36,0xAC001A70,0xAD001AA7,0xAE001AE1,0xAF001B1B,0xB0001B55,0xB1001B79,0xB2001BCC,0xB3001C03,0xB4001C40, +0xB5001C7A,0x8600176D,0x870017AD,0x000C7F79,0x000C7F76,0x000C7F73,0x000C7F70,0x000C7F6D,0xE10016B2,0x000C7F6A, +0x000C7F67,0x000C7F64,0x860017A6,0x870017F1,0x000C7F61,0xA80017D9,0xA90017DA,0xAA0017DB,0xAB0017DC,0xAC0017DD, +0xAD0017DE,0xAE0017DF,0xAF0017E4,0xB00017E5,0xB10017E6,0xB20017E7,0xB30017E8,0xB40017E9,0xB50017EA,0xB60017EB, +0xB70017EC,0xB80017ED,0xB90017EE,0xBA0017EF,0xBB0017F0,0xBC001809,0xBD00180A,0xBE00180B,0xBF00180C,0x8000180D, +0x8100180F,0x82001810,0x000C7F5E,0x000C7F5B,0x000C7F58,0x000C7F55,0x000C7F52,0x000C7F4F,0x000C7F4C,0x000C7F49, +0x000C7F46,0x000C7F43,0x000C7F40,0x000C7F3D,0x000C7F3A,0x000C7F37,0x000C7F34,0x000C7F31,0x000C7F2E,0x000C7F2B, +0x000C7F28,0x000C7F25,0x000C7F22,0xE10016ED,0x000C7F1F,0x000C7F1C,0x000C7F19,0x000C7F16,0x000C7F13,0x000C7F10, +0x860017E0,0x87001802,0xA8001814,0xA9001830,0xAA001831,0xAB001832,0xAC001833,0xAD001834,0xAE001835,0xAF001836, +0xB0001837,0xB1001838,0xB2001839,0xB300183A,0xB400183B,0xB500183C,0xB600183D,0xB700183E,0xB800183F,0xB9001840, +0xBA001841,0xBB001842,0xBC001843,0xBD001844,0xBE001846,0xBF001847,0x000C7F0D,0x000C7F0A,0x000C7F07,0x000C7F04, +0x000C7F01,0x000C7EFE,0x000C7EFB,0x000C7EF8,0x000C7EF5,0x000C7EF2,0x000C7EEF,0x80001848,0x81001849,0x8200184A, +0x000C7EEC,0x000C7EE9,0x000C7EE6,0x000C7EE3,0x000C7EE0,0x000C7EDD,0x000C7EDA,0x000C7ED7,0x000C7ED4,0x000C7ED1, +0x000C7ECE,0xE1001727,0x000C7ECB,0x000C7EC8,0x80001885,0x81001886,0x82001887,0x000C7EC5,0x000C7EC2,0x000C7EBF, +0xA8001866,0xA9001867,0xAA001868,0xAB001869,0xAC00186A,0xAD00186B,0xAE00186C,0xAF00186D,0xB000186E,0xB100186F, +0xB2001870,0xB3001874,0xB4001875,0xB5001876,0xB6001877,0xB7001878,0xB8001879,0xB900187A,0xBA00187B,0xBB00187C, +0xBC00187D,0xBD00187E,0xBE001880,0xBF001881,0x000C7EBC,0x86001812,0x87001854,0x000C7EB9,0x000C7EB6,0x000C7EB3, +0x000C7EB0,0x000C7EAD,0x000C7EAA,0x000C7EA7,0x000C7EA4,0x000C7EA1,0x000C7E9E,0x000C7E9B,0x000C7E98,0x000C7E95, +0x000C7E92,0x000C7E8F,0x000C7E8C,0x000C7E89,0x000C7E86,0x000C7E83,0x000C7E80,0x000C7E7D,0x000C7E7A,0xE1001781, +0xA80018A3,0xA90018A4,0xAA0018A5,0xAB0018A6,0xAC0018A7,0xAD0018A8,0xAE0018A9,0xAF0018AA,0xB00018AB,0xB10018AC, +0xB20018AD,0xB30018AE,0xB40018AF,0xB50018B0,0xB60018B1,0xB70018B2,0xB80018B3,0xB90018B4,0xBA0018B5,0xBB0018B6, +0xBC0018B7,0xBD0018B8,0xBE0018D2,0xBF0018D3,0x000C7E77,0x000C7E74,0x800018D7,0x810018D8,0x820018D9,0x000C7E71, +0x000C7E6E,0x000C7E6B,0x000C7E68,0x8600184C,0x8700188E,0x000C7E65,0x000C7E62,0x000C7E5F,0x000C7E5C,0x000C7E59, +0x000C7E56,0x000C7E53,0x000C7E50,0x000C7E4D,0x000C7E4A,0x000C7E47,0x000C7E44,0x000C7E41,0x000C7E3E,0x000C7E3B, +0x000C7E38,0x000C7E35,0x000C7E32,0x000C7E2F,0x000C7E2C,0x000C7E29,0xE100178C,0x000C7E26,0xA80018DD,0xA90018DE, +0xAA0018DF,0xAB0018E0,0xAC0018E1,0xAD0018E2,0xAE0018E3,0xAF0018E4,0xB00018E5,0xB10018E6,0xB20018E7,0xB30018E8, +0xB40018E9,0xB50018EA,0xB60018EB,0xB70018EC,0xB80018ED,0xB90018EE,0xBA0018EF,0xBB0018F0,0xBC0018F1,0xBD0018F3, +0xBE00190C,0xBF00190D,0x000C7E23,0x000C7E20,0x80001911,0x81001912,0x82001913,0x000C7E1D,0x000C7E1A,0x000C7E17, +0x000C7E14,0x86001888,0x870018C8,0x000C7E11,0x000C7E0E,0x000C7E0B,0x000C7E08,0x000C7E05,0x000C7E02,0x000C7DFF, +0x000C7DFC,0x000C7DF9,0x000C7DF6,0x000C7DF3,0x000C7DF0,0x000C7DED,0x000C7DEA,0x000C7DE7,0x000C7DE4,0x000C7DE1, +0x000C7DDE,0x000C7DDB,0x000C7DD8,0x000C7DD5,0xE10017C6,0x000C7DD2,0x000C7DCF,0x000C7DCC,0xA8001917,0xA9001918, +0xAA001919,0xAB00191A,0xAC00191B,0xAD00191C,0xAE00191D,0xAF00191E,0xB000191F,0xB1001920,0xB2001921,0xB3001922, +0xB4001923,0xB5001924,0xB6001925,0xB7001926,0xB8001927,0xB9001928,0xBA001929,0xBB00192A,0xBC00192B,0xBD00192D, +0xBE00192E,0xBF00192F,0x8000194B,0x8100194C,0x8200194D,0x000C7DC9,0x000C7DC6,0x000C7DC3,0x000C7DC0,0x860018B9, +0x87001902,0x000C7DBD,0x000C7DBA,0x000C7DB7,0x000C7DB4,0x000C7DB1,0x000C7DAE,0x000C7DAB,0x000C7DA8,0x000C7DA5, +0x000C7DA2,0x000C7D9F,0x000C7D9C,0x000C7D99,0x000C7D96,0x000C7D93,0x000C7D90,0xA8001951,0xA9001952,0xAA001953, +0xAB001954,0xAC001955,0xAD001956,0xAE001957,0xAF001958,0xB0001959,0xB100195A,0xB200195B,0xB300195C,0xB400195D, +0xB500195E,0xB600195F,0xB7001960,0xB8001979,0xB900197A,0xBA00197B,0xBB00197C,0xBC00197D,0xBD00197E,0xBE00197F, +0xBF001980,0x000C7D8D,0x000C7D8A,0x000C7D87,0x000C7D84,0x000C7D81,0x000C7D7E,0x000C7D7B,0x000C7D78,0xE100181B, +0x80001985,0x81001986,0x82001987,0x000C7D75,0x000C7D72,0x000C7D6F,0x000C7D6C,0x860018F2,0x8700193C,0x000C7D69, +0x000C7D66,0x000C7D63,0x000C7D60,0x000C7D5D,0x000C7D5A,0x000C7D57,0x000C7D54,0x000C7D51,0x000C7D4E,0x000C7D4B, +0x000C7D48,0x000C7D45,0x000C7D42,0x000C7D3F,0xA800198B,0xA900198C,0xAA00198D,0xAB00198E,0xAC00198F,0xAD001990, +0xAE001991,0xAF001992,0xB0001993,0xB1001994,0xB2001995,0xB3001996,0xB4001997,0xB5001998,0xB6001999,0xB70019B2, +0xB80019B3,0xB90019B4,0xBA0019B5,0xBB0019B6,0xBC0019B7,0xBD0019B8,0xBE0019B9,0xBF0019BA,0x000C7D3C,0x000C7D39, +0x000C7D36,0x000C7D33,0x000C7D30,0x000C7D2D,0x000C7D2A,0x000C7D27,0x000C7D24,0xE1001855,0x800019BF,0x810019C0, +0x820019C1,0x000C7D21,0x000C7D1E,0x000C7D1B,0x000C7D18,0x8600192C,0x87001976,0x000C7D15,0x000C7D12,0x000C7D0F, +0x000C7D0C,0x000C7D09,0x000C7D06,0x000C7D03,0x000C7D00,0x000C7CFD,0x000C7CFA,0x000C7CF7,0x000C7CF4,0x000C7CF1, +0x000C7CEE,0x000C7CEB,0xA80019C5,0xA90019C6,0xAA0019C7,0xAB0019C8,0xAC0019C9,0xAD0019CA,0xAE0019CB,0xAF0019CC, +0xB00019CD,0xB10019CE,0xB20019CF,0xB30019D0,0xB40019D1,0xB50019D2,0xB60019D3,0xB70019EC,0xB80019ED,0xB90019EE, +0xBA0019EF,0xBB0019F0,0xBC0019F1,0xBD0019F2,0xBE0019F3,0xBF0019F4,0x000C7CE8,0x000C7CE5,0x000C7CE2,0x000C7CDF, +0x000C7CDC,0x000C7CD9,0x000C7CD6,0x000C7CD3,0x000C7CD0,0xE100188F,0x800019F9,0x810019FA,0x820019FB,0x000C7CCD, +0x000C7CCA,0x000C7CC7,0x000C7CC4,0x86001961,0x870019B0,0x000C7CC1,0x000C7CBE,0x000C7CBB,0x000C7CB8,0x000C7CB5, +0x000C7CB2,0x000C7CAF,0x000C7CAC,0x000C7CA9,0x000C7CA6,0xA80019FF,0xA9001A00,0xAA001A01,0xAB001A02,0xAC001A03, +0xAD001A04,0xAE001A05,0xAF001A06,0xB0001A07,0xB1001A08,0xB2001A21,0xB3001A22,0xB4001A23,0xB5001A24,0xB6001A25, +0xB7001A26,0xB8001A27,0xB9001A28,0xBA001A29,0xBB001A2A,0xBC001A2B,0xBD001A2C,0xBE001A2D,0xBF001A2E,0x000C7CA3, +0x000C7CA0,0x000C7C9D,0x000C7C9A,0x000C7C97,0x000C7C94,0x000C7C91,0x000C7C8E,0x000C7C8B,0x000C7C88,0x000C7C85, +0x000C7C82,0x000C7C7F,0x000C7C7C,0xE10018C9,0x80001A33,0x81001A34,0x82001A35,0x000C7C79,0x000C7C76,0x000C7C73, +0x000C7C70,0x8600199A,0x870019EA,0x000C7C6D,0x000C7C6A,0x000C7C67,0x000C7C64,0x000C7C61,0x000C7C5E,0x000C7C5B, +0x000C7C58,0x000C7C55,0xA8001A39,0xA9001A3A,0xAA001A3B,0xAB001A3C,0xAC001A3D,0xAD001A3E,0xAE001A3F,0xAF001A40, +0xB0001A41,0xB1001A5A,0xB2001A5B,0xB3001A5C,0xB4001A5D,0xB5001A5E,0xB6001A5F,0xB7001A60,0xB8001A61,0xB9001A62, +0xBA001A63,0xBB001A64,0xBC001A65,0xBD001A66,0xBE001A67,0xBF001A68,0x000C7C52,0x000C7C4F,0x000C7C4C,0x000C7C49, +0x000C7C46,0x000C7C43,0x000C7C40,0x000C7C3D,0x000C7C3A,0x000C7C37,0x000C7C34,0x000C7C31,0x000C7C2E,0x000C7C2B, +0x000C7C28,0xE1001903,0x80001A6D,0x81001A6E,0x82001A6F,0x000C7C25,0x000C7C22,0x000C7C1F,0x000C7C1C,0x860019D4, +0x87001A2F,0x000C7C19,0x000C7C16,0x000C7C13,0x000C7C10,0x000C7C0D,0x000C7C0A,0x000C7C07,0x000C7C04,0x000C7C01, +0xA8001A73,0xA9001A74,0xAA001A75,0xAB001A76,0xAC001A77,0xAD001A78,0xAE001A79,0xAF001A7A,0xB0001A7B,0xB1001A94, +0xB2001A95,0xB3001A96,0xB4001A97,0xB5001A98,0xB6001A99,0xB7001A9A,0xB8001A9B,0xB9001A9C,0xBA001A9D,0xBB001A9E, +0xBC001A9F,0xBD001AA0,0xBE001AA1,0xBF001AA2,0x000C7BFE,0x000C7BFB,0x000C7BF8,0x000C7BF5,0x000C7BF2,0x000C7BEF, +0x000C7BEC,0x000C7BE9,0x000C7BE6,0x000C7BE3,0x000C7BE0,0x000C7BDD,0x000C7BDA,0x000C7BD7,0x000C7BD4,0xE100193D, +0x000C7BD1,0x000C7BCE,0x000C7BCB,0x000C7BC8,0x000C7BC5,0x000C7BC2,0x000C7BBF,0x000C7BBC,0x000C7BB9,0x000C7BB6, +0x000C7BB3,0x80001AA4,0x81001AA5,0x82001AA6,0x000C7BB0,0x000C7BAD,0x000C7BAA,0x000C7BA7,0x86001A10,0x87001A69, +0xA8001AA8,0xA9001AA9,0xAA001AAA,0xAB001AAB,0xAC001AAC,0xAD001AAD,0xAE001AAE,0xAF001AB2,0xB0001AB3,0xB1001AB4, +0xB2001AB5,0xB3001AD0,0xB4001AD1,0xB5001AD2,0xB6001AD3,0xB7001AD4,0xB8001AD5,0xB9001AD6,0xBA001AD7,0xBB001AD8, +0xBC001AD9,0xBD001ADA,0xBE001ADB,0xBF001ADC,0x000C7BA4,0x000C7BA1,0x000C7B9E,0x000C7B9B,0x000C7B98,0x000C7B95, +0x000C7B92,0x000C7B8F,0x000C7B8C,0x000C7B89,0x000C7B86,0x000C7B83,0x000C7B80,0xE1001977,0x000C7B7D,0x000C7B7A, +0x000C7B77,0x000C7B74,0x000C7B71,0x000C7B6E,0x000C7B6B,0x000C7B68,0x000C7B65,0x000C7B62,0x000C7B5F,0x80001ADE, +0x81001ADF,0x82001AE0,0x000C7B5C,0x000C7B59,0x000C7B56,0x000C7B53,0x86001A4A,0x87001AA3,0xA8001AE2,0xA9001AE3, +0xAA001AE4,0xAB001AE5,0xAC001AE6,0xAD001AE7,0xAE001AE8,0xAF001AEC,0xB0001AED,0xB1001AEE,0xB2001AEF,0xB3001B0A, +0xB4001B0B,0xB5001B0C,0xB6001B0D,0xB7001B0E,0xB8001B0F,0xB9001B10,0xBA001B11,0xBB001B12,0xBC001B13,0xBD001B14, +0xBE001B15,0xBF001B16,0x000C7B50,0x000C7B4D,0x000C7B4A,0x000C7B47,0x000C7B44,0x000C7B41,0x000C7B3E,0x000C7B3B, +0x000C7B38,0x000C7B35,0x000C7B32,0x000C7B2F,0x000C7B2C,0xE10019B1,0x000C7B29,0x000C7B26,0x000C7B23,0x000C7B20, +0x000C7B1D,0x000C7B1A,0x000C7B17,0x000C7B14,0x000C7B11,0x000C7B0E,0x000C7B0B,0x80001B18,0x81001B19,0x82001B1A, +0x000C7B08,0x000C7B05,0x000C7B02,0x000C7AFF,0x000C7AFC,0x000C7AF9,0x000C7AF6,0x000C7AF3,0x000C7AF0,0x000C7AED, +0x000C7AEA,0x000C7AE7,0x000C7AE4,0x000C7AE1,0x000C7ADE,0x86001A8F,0x87001ADD,0xA8001B1C,0xA9001B1D,0xAA001B1E, +0xAB001B1F,0xAC001B20,0xAD001B21,0xAE001B22,0xAF001B26,0xB0001B27,0xB1001B28,0xB2001B29,0xB3001B2A,0xB4001B2B, +0xB5001B2C,0xB6001B2D,0xB7001B2E,0xB8001B2F,0xB9001B30,0xBA001B31,0xBB001B32,0xBC001B33,0xBD001B34,0xBE001B4F, +0xBF001B50,0x000C7ADB,0x000C7AD8,0xE10019EB,0x000C7AD5,0x000C7AD2,0x000C7ACF,0x000C7ACC,0x000C7AC9,0x000C7AC6, +0x000C7AC3,0x000C7AC0,0x000C7ABD,0x000C7ABA,0x000C7AB7,0x80001B52,0x81001B53,0x82001B54,0x000C7AB4,0x000C7AB1, +0x000C7AAE,0x000C7AAB,0x000C7AA8,0x000C7AA5,0x000C7AA2,0x000C7A9F,0x000C7A9C,0x000C7A99,0x000C7A96,0x000C7A93, +0x000C7A90,0x000C7A8D,0x000C7A8A,0x86001AEA,0x87001AF3,0x000C7A87,0x000C7A84,0x80001B76,0x81001B77,0x82001B78, +0x000C7A81,0x000C7A7E,0x000C7A7B,0x000C7A78,0x86001B02,0x87001B46,0x000C7A75,0x000C7A72,0x000C7A6F,0x000C7A6C, +0x000C7A69,0x000C7A66,0x000C7A63,0x000C7A60,0x000C7A5D,0x000C7A5A,0x000C7A57,0x000C7A54,0xE1001A30,0x000C7A51, +0x000C7A4E,0x000C7A4B,0x000C7A48,0x000C7A45,0x000C7A42,0x000C7A3F,0x000C7A3C,0x000C7A39,0xA8001B56,0xA9001B57, +0xAA001B58,0xAB001B59,0xAC001B5A,0xAD001B5B,0xAE001B5C,0xAF001B60,0xB0001B61,0xB1001B62,0xB2001B63,0xB3001B64, +0xB4001B65,0xB5001B66,0xB6001B67,0xB7001B68,0xB8001B69,0xB9001B6A,0xBA001B6B,0xBB001B6C,0xBC001B6D,0xBD001B6E, +0xBE001B71,0xBF001B72,0xA8001B7C,0xA9001B7D,0xAA001B7E,0xAB001B7F,0xAC001B80,0xAD001B81,0xAE001B82,0xAF001B83, +0xB0001B84,0xB1001B85,0xB2001B86,0xB3001B87,0xB4001B89,0xB5001B8A,0xB6001B8B,0xB7001B8C,0xB8001B8D,0xB9001B8E, +0xBA001B8F,0xBB001B90,0xBC001B91,0xBD001BC3,0xBE001BC4,0xBF001BC5,0xE1001A6A,0x000C7A36,0x000C7A33,0x000C7A30, +0x80001BC9,0x81001BCA,0x82001BCB,0x000C7A2D,0x000C7A2A,0x000C7A27,0x000C7A24,0x86001B35,0x87001B88,0x000C7A21, +0x000C7A1E,0x000C7A1B,0x000C7A18,0x000C7A15,0x000C7A12,0x000C7A0F,0x000C7A0C,0x000C7A09,0x000C7A06,0x000C7A03, +0x000C7A00,0x000C79FD,0x000C79FA,0xA8001BCF,0xA9001BD0,0xAA001BD1,0xAB001BD2,0xAC001BD3,0xAD001BD4,0xAE001BD5, +0xAF001BD6,0xB0001BD7,0xB1001BD8,0xB2001BD9,0xB3001BDA,0xB4001BDB,0xB5001BDC,0xB6001BF5,0xB7001BF6,0xB8001BF7, +0xB9001BF8,0xBA001BF9,0xBB001BFA,0xBC001BFB,0xBD001BFD,0xBE001BFE,0xBF001BFF,0x000C79F7,0x000C79F4,0x000C79F1, +0x000C79EE,0x000C79EB,0x000C79E8,0x000C79E5,0xE1001AAF,0x000C79E2,0x000C79DF,0x000C79DC,0x000C79D9,0x000C79D6, +0x000C79D3,0x000C79D0,0x000C79CD,0x000C79CA,0x000C79C7,0x000C79C4,0x80001C00,0x81001C01,0x82001C02,0x000C79C1, +0x000C79BE,0x000C79BB,0x000C79B8,0x000C79B5,0x000C79B2,0x000C79AF,0x000C79AC,0x000C79A9,0x000C79A6,0x000C79A3, +0x000C79A0,0x000C799D,0x86001B73,0x87001BBA,0x000C799A,0xA8001C04,0xA9001C05,0xAA001C06,0xAB001C07,0xAC001C0B, +0xAD001C0C,0xAE001C0D,0xAF001C0E,0xB0001C0F,0xB1001C10,0xB2001C11,0xB3001C12,0xB4001C13,0xB5001C14,0xB6001C15, +0xB7001C16,0xB8001C17,0xB9001C1A,0xBA001C33,0xBB001C34,0xBC001C35,0xBD001C37,0xBE001C38,0xBF001C39,0x000C7997, +0x000C7994,0x000C7991,0xE1001AE9,0x000C798E,0x000C798B,0x000C7988,0x80001C3D,0x81001C3E,0x82001C3F,0x000C7985, +0x000C7982,0x000C797F,0x000C797C,0x86001BB3,0x87001BF4,0x000C7979,0x000C7976,0x000C7973,0x000C7970,0x000C796D, +0x000C796A,0x000C7967,0x000C7964,0x000C7961,0x000C795E,0x000C795B,0x000C7958,0x000C7955,0x000C7952,0x000C794F, +0x000C794C,0x000C7949,0x000C7946,0x000C7943,0x000C7940,0x000C793D,0x000C793A,0x000C7937,0xE1001AF4,0xA8001C43, +0xA9001C44,0xAA001C45,0xAB001C46,0xAC001C47,0xAD001C48,0xAE001C49,0xAF001C4A,0xB0001C4B,0xB1001C4C,0xB2001C4D, +0xB3001C4E,0xB4001C4F,0xB5001C50,0xB6001C51,0xB7001C52,0xB8001C53,0xB9001C54,0xBA001C55,0xBB001C56,0xBC001C57, +0xBD001C58,0xBE001C59,0xBF001C73,0x000C7934,0x80001C77,0x81001C78,0x82001C79,0x000C7931,0x000C792E,0x000C792B, +0x000C7928,0x000C7925,0x000C7922,0x000C791F,0x000C791C,0x000C7919,0x000C7916,0x000C7913,0x86001BDD,0x87001C2E, +0x000C7910,0xA8001C7B,0xA9001C7C,0xAA001C7D,0xAB001C7E,0xAC001C7F,0xAD001C80,0xAE001C81,0xAF001C84,0xB0001C9D, +0xB1001C9E,0xB2001C9F,0xB3001CA0,0xB4001CA1,0xB5001CA2,0xB6001CA3,0xB7001CA4,0xB8001CA5,0xB9001CA6,0xBA001CA7, +0xBB001CA8,0xBC001CA9,0xBD001CAA,0xBE001CAB,0xBF001CAC,0x000C790D,0x000C790A,0x000C7907,0x000C7904,0x000C7901, +0x000C78FE,0x000C78FB,0x000C78F8,0x000C78F5,0x000C78F2,0x000C78EF,0x000C78EC,0x000C78E9,0x000C78E6,0x000C78E3, +0x000C78E0,0xE1001B47,0x80001CB1,0x81001CB2,0x82001CB3,0x000C78DD,0x000C78DA,0x000C78D7,0x85001C1F,0x000C78D4, +0x86001C41,0x87001C82,0x000C78D1,0x000C78CE,0x000C78CB,0x000C78C8,0x000C78C5,0x000C78C2,0x000C78BF,0xE1001C2F, +0xA1001CB5,0xA2001D05,0xA3001D24,0xA4001D79,0xA5001DB3,0xA6001DED,0xA7001E27,0xA8001E61,0xA9001E9B,0xAA001ED5, +0xAB001F0C,0xAC001F49,0xAD001F83,0xAE001FBA,0xAF001FF4,0xB000202E,0xB1002068,0xB200208C,0xB30020DF,0xB4002116, +0xB5002153,0x000C78BC,0x000C78B9,0x000C78B6,0x000C78B3,0x000C78B0,0x000C78AD,0x000C78AA,0x000C78A7,0x000C78A4, +0x000C78A1,0x000C789E,0x000C789B,0x000C7898,0x000C7895,0x000C7892,0xE1001B92,0x000C788F,0x000C788C,0x000C7889, +0x000C7886,0xA8001CB8,0xA9001CB9,0xAA001CBA,0xAB001CBB,0xAC001CBC,0xAD001CBD,0xAE001CBE,0xAF001CD5,0xB0001CD6, +0xB1001CD7,0xB2001CD8,0xB3001CD9,0xB4001CDA,0xB5001CDB,0xB6001CDC,0xB7001CDD,0xB8001CDE,0xB9001CDF,0xBA001CE0, +0xBB001CE1,0xBC001CE2,0xBD001CE3,0xBE001CE5,0xBF001CE6,0x000C7883,0x80001CE7,0x81001CE8,0x82001D01,0x000C7880, +0x000C787D,0x000C787A,0x000C7877,0x86001C85,0x87001CC5,0x000C7874,0x000C7871,0x000C786E,0x000C786B,0x000C7868, +0x000C7865,0x000C7862,0x000C785F,0x000C785C,0x000C7859,0x000C7856,0x000C7853,0x000C7850,0x000C784D,0x000C784A, +0x000C7847,0x000C7844,0x000C7841,0x000C783E,0x000C783B,0x000C7838,0x000C7835,0xE1001BBB,0x000C7832,0x000C782F, +0x000C782C,0x000C7829,0x000C7826,0x000C7823,0x000C7820,0x000C781D,0x000C781A,0x000C7817,0x000C7814,0xA8001D06, +0xA9001D07,0xAA001D08,0xAB001D0B,0xAC001D0C,0xAD001D0D,0xAE001D0E,0xAF001D0F,0xB0001D10,0xB1001D11,0xB2001D12, +0xB3001D13,0xB4001D14,0xB5001D15,0xB6001D16,0xB7001D17,0xB8001D18,0xB9001D19,0xBA001D1A,0xBB001D1B,0xBC001D1C, +0xBD001D1D,0xBE001D1E,0xBF001D1F,0x80001D20,0x81001D22,0x82001D23,0x86001CB4,0x87001CF4,0x000C7811,0x000C780E, +0x000C780B,0x000C7808,0x000C7805,0x000C7802,0x000C77FF,0x000C77FC,0x000C77F9,0x000C77F6,0x000C77F3,0x000C77F0, +0x000C77ED,0x000C77EA,0x000C77E7,0x000C77E4,0x000C77E1,0xE1001BFC,0xA8001D25,0xA9001D26,0xAA001D27,0xAB001D28, +0xAC001D29,0xAD001D2A,0xAE001D2B,0xAF001D2C,0xB0001D4A,0xB1001D4B,0xB2001D4C,0xB3001D4D,0xB4001D4E,0xB5001D4F, +0xB6001D50,0xB7001D51,0xB8001D52,0xB9001D53,0xBA001D54,0xBB001D55,0xBC001D56,0xBD001D57,0xBE001D58,0xBF001D59, +0x80001D5A,0x81001D77,0x82001D78,0x000C77DE,0x000C77DB,0x000C77D8,0x000C77D5,0x86001CEF,0x87001D2F,0x000C77D2, +0x000C77CF,0x000C77CC,0x000C77C9,0x000C77C6,0x000C77C3,0x000C77C0,0x000C77BD,0x000C77BA,0x000C77B7,0x000C77B4, +0x000C77B1,0x000C77AE,0x000C77AB,0x000C77A8,0x000C77A5,0x000C77A2,0x000C779F,0x000C779C,0x000C7799,0x000C7796, +0x000C7793,0x000C7790,0x000C778D,0x000C778A,0xE1001C30,0xA8001D7A,0xA9001D7D,0xAA001D7E,0xAB001D7F,0xAC001D80, +0xAD001D81,0xAE001D82,0xAF001D83,0xB0001D84,0xB1001D85,0xB2001D86,0xB3001D87,0xB4001D88,0xB5001D89,0xB6001D8A, +0xB7001D8B,0xB8001D8C,0xB9001D8D,0xBA001D8E,0xBB001D8F,0xBC001D90,0xBD001D91,0xBE001D92,0xBF001D93,0x80001D94, +0x81001D95,0x82001DB2,0x000C7787,0x000C7784,0x86001D21,0x87001D67,0x000C7781,0x000C777E,0x000C777B,0x000C7778, +0x000C7775,0x000C7772,0x000C776F,0x000C776C,0x000C7769,0x000C7766,0x000C7763,0x000C7760,0x000C775D,0x000C775A, +0x000C7757,0x000C7754,0x000C7751,0x000C774E,0x000C774B,0xA8001DB6,0xA9001DB7,0xAA001DB8,0xAB001DB9,0xAC001DBA, +0xAD001DBB,0xAE001DBC,0xAF001DBD,0xB0001DBE,0xB1001DBF,0xB2001DC0,0xB3001DC1,0xB4001DC2,0xB5001DC3,0xB6001DC4, +0xB7001DC5,0xB8001DC6,0xB9001DC7,0xBA001DC8,0xBB001DE1,0xBC001DE2,0xBD001DE3,0xBE001DE4,0xBF001DE5,0x000C7748, +0x000C7745,0x000C7742,0x000C773F,0x000C773C,0xE1001C83,0x80001DEA,0x81001DEB,0x82001DEC,0x000C7739,0x000C7736, +0x000C7733,0x000C7730,0x86001D5E,0x87001DA1,0x000C772D,0x000C772A,0x000C7727,0x000C7724,0x000C7721,0x000C771E, +0x000C771B,0x000C7718,0x000C7715,0x000C7712,0x000C770F,0x000C770C,0x000C7709,0x000C7706,0x000C7703,0x000C7700, +0x000C76FD,0x000C76FA,0x000C76F7,0x000C76F4,0x000C76F1,0xE1001CC2,0xA8001DF0,0xA9001DF1,0xAA001DF2,0xAB001DF3, +0xAC001DF4,0xAD001DF5,0xAE001DF6,0xAF001DF7,0xB0001DF8,0xB1001DF9,0xB2001DFA,0xB3001DFB,0xB4001DFC,0xB5001DFD, +0xB6001DFE,0xB7001DFF,0xB8001E00,0xB9001E01,0xBA001E02,0xBB001E03,0xBC001E04,0xBD001E1E,0xBE001E1F,0xBF001E20, +0x000C76EE,0x000C76EB,0x000C76E8,0x80001E24,0x81001E25,0x82001E26,0x000C76E5,0x000C76E2,0x000C76DF,0x000C76DC, +0x86001D96,0x87001DDB,0x000C76D9,0x000C76D6,0x000C76D3,0x000C76D0,0x000C76CD,0x000C76CA,0x000C76C7,0x000C76C4, +0x000C76C1,0x000C76BE,0x000C76BB,0x000C76B8,0x000C76B5,0x000C76B2,0x000C76AF,0x000C76AC,0x000C76A9,0x000C76A6, +0x000C76A3,0x000C76A0,0xA8001E2A,0xA9001E2B,0xAA001E2C,0xAB001E2D,0xAC001E2E,0xAD001E2F,0xAE001E30,0xAF001E31, +0xB0001E32,0xB1001E33,0xB2001E34,0xB3001E35,0xB4001E36,0xB5001E37,0xB6001E38,0xB7001E39,0xB8001E3A,0xB9001E3B, +0xBA001E3C,0xBB001E3D,0xBC001E56,0xBD001E57,0xBE001E58,0xBF001E59,0x000C769D,0x000C769A,0x000C7697,0x000C7694, +0xE1001CF5,0x80001E5E,0x81001E5F,0x82001E60,0x000C7691,0x000C768E,0x000C768B,0x000C7688,0x86001DC9,0x87001E15, +0x000C7685,0x000C7682,0x000C767F,0x000C767C,0x000C7679,0x000C7676,0x000C7673,0x000C7670,0x000C766D,0x000C766A, +0x000C7667,0x000C7664,0x000C7661,0xA8001E64,0xA9001E65,0xAA001E66,0xAB001E67,0xAC001E68,0xAD001E69,0xAE001E6A, +0xAF001E6B,0xB0001E6C,0xB1001E6D,0xB2001E6E,0xB3001E6F,0xB4001E70,0xB5001E89,0xB6001E8A,0xB7001E8B,0xB8001E8C, +0xB9001E8D,0xBA001E8E,0xBB001E8F,0xBC001E90,0xBD001E91,0xBE001E92,0xBF001E93,0x000C765E,0x000C765B,0x000C7658, +0x000C7655,0x000C7652,0x000C764F,0x000C764C,0x000C7649,0x000C7646,0x000C7643,0x000C7640,0xE1001D2E,0x80001E98, +0x81001E99,0x82001E9A,0x000C763D,0x000C763A,0x000C7637,0x000C7634,0x86001E05,0x87001E4F,0x000C7631,0x000C762E, +0x000C762B,0x000C7628,0x000C7625,0x000C7622,0x000C761F,0x000C761C,0x000C7619,0x000C7616,0x000C7613,0x000C7610, +0x000C760D,0x000C760A,0x000C7607,0xA8001E9E,0xA9001E9F,0xAA001EA0,0xAB001EA1,0xAC001EA2,0xAD001EA3,0xAE001EA4, +0xAF001EA5,0xB0001EA6,0xB1001EA7,0xB2001EA8,0xB3001EA9,0xB4001EAA,0xB5001EAB,0xB6001EAC,0xB7001EC5,0xB8001EC6, +0xB9001EC7,0xBA001EC8,0xBB001EC9,0xBC001ECA,0xBD001ECB,0xBE001ECC,0xBF001ECD,0x000C7604,0x000C7601,0x000C75FE, +0x000C75FB,0x000C75F8,0x000C75F5,0x000C75F2,0x000C75EF,0x000C75EC,0xE1001D68,0x80001ED2,0x81001ED3,0x82001ED4, +0x000C75E9,0x000C75E6,0x000C75E3,0x000C75E0,0x86001E3E,0x87001E94,0x000C75DD,0x000C75DA,0x000C75D7,0x000C75D4, +0x000C75D1,0x000C75CE,0x000C75CB,0x000C75C8,0x000C75C5,0x000C75C2,0x000C75BF,0x000C75BC,0x000C75B9,0x000C75B6, +0xA8001ED8,0xA9001ED9,0xAA001EDA,0xAB001EDB,0xAC001EDC,0xAD001EDD,0xAE001EDE,0xAF001EDF,0xB0001EE0,0xB1001EE1, +0xB2001EE2,0xB3001EE3,0xB4001EE4,0xB5001EE5,0xB6001EFE,0xB7001EFF,0xB8001F00,0xB9001F01,0xBA001F02,0xBB001F03, +0xBC001F04,0xBD001F05,0xBE001F06,0xBF001F07,0x000C75B3,0x000C75B0,0x000C75AD,0x000C75AA,0x000C75A7,0x000C75A4, +0x000C75A1,0x000C759E,0x000C759B,0x000C7598,0xE1001DA2,0x000C7595,0x000C7592,0x000C758F,0x000C758C,0x86001E71, +0x87001EC3,0x000C7589,0x000C7586,0x000C7583,0x000C7580,0x000C757D,0x80001F09,0x81001F0A,0x82001F0B,0x000C757A, +0x000C7577,0xA8001F0F,0xA9001F10,0xAA001F11,0xAB001F12,0xAC001F13,0xAD001F17,0xAE001F18,0xAF001F31,0xB0001F32, +0xB1001F33,0xB2001F34,0xB3001F35,0xB4001F36,0xB5001F37,0xB6001F38,0xB7001F39,0xB8001F3A,0xB9001F3B,0xBA001F3C, +0xBB001F3D,0xBC001F3E,0xBD001F3F,0xBE001F40,0xBF001F41,0x000C7574,0x000C7571,0x000C756E,0x000C756B,0x000C7568, +0x000C7565,0x000C7562,0x000C755F,0x000C755C,0x000C7559,0x000C7556,0x000C7553,0x000C7550,0x000C754D,0x000C754A, +0x000C7547,0x000C7544,0xE1001DDC,0x80001F46,0x81001F47,0x82001F48,0x000C7541,0x000C753E,0x000C753B,0x000C7538, +0x86001EAD,0x87001EFD,0x000C7535,0x000C7532,0x000C752F,0x000C752C,0x000C7529,0x000C7526,0x000C7523,0x000C7520, +0x000C751D,0xA8001F4C,0xA9001F4D,0xAA001F4E,0xAB001F4F,0xAC001F50,0xAD001F51,0xAE001F52,0xAF001F53,0xB0001F54, +0xB1001F6D,0xB2001F6E,0xB3001F6F,0xB4001F70,0xB5001F71,0xB6001F72,0xB7001F73,0xB8001F74,0xB9001F75,0xBA001F76, +0xBB001F77,0xBC001F78,0xBD001F79,0xBE001F7A,0xBF001F7B,0x000C751A,0x000C7517,0x000C7514,0x000C7511,0x000C750E, +0x000C750B,0x000C7508,0x000C7505,0x000C7502,0x000C74FF,0x000C74FC,0x000C74F9,0x000C74F6,0x000C74F3,0x000C74F0, +0xE1001E16,0x80001F80,0x81001F81,0x82001F82,0x000C74ED,0x000C74EA,0x000C74E7,0x000C74E4,0x000C74E1,0x000C74DE, +0x000C74DB,0x000C74D8,0x000C74D5,0x000C74D2,0x000C74CF,0x000C74CC,0x000C74C9,0x000C74C6,0x86001EE8,0x87001F42, +0xA8001F84,0xA9001F85,0xAA001F86,0xAB001F87,0xAC001F88,0xAD001F89,0xAE001F8A,0xAF001F8B,0xB0001F8C,0xB1001F8D, +0xB2001FA8,0xB3001FA9,0xB4001FAA,0xB5001FAB,0xB6001FAC,0xB7001FAD,0xB8001FAE,0xB9001FAF,0xBA001FB0,0xBB001FB1, +0xBC001FB2,0xBD001FB3,0xBE001FB4,0xBF001FB5,0x000C74C3,0x000C74C0,0x000C74BD,0x000C74BA,0x000C74B7,0x000C74B4, +0x000C74B1,0x000C74AE,0x000C74AB,0x000C74A8,0x000C74A5,0x000C74A2,0x000C749F,0x000C749C,0xE1001E50,0x000C7499, +0x000C7496,0x000C7493,0x000C7490,0x000C748D,0x000C748A,0x000C7487,0x000C7484,0x000C7481,0x000C747E,0x000C747B, +0x80001FB7,0x81001FB8,0x82001FB9,0x000C7478,0x000C7475,0x000C7472,0x000C746F,0x86001F23,0x87001F7C,0xA8001FBB, +0xA9001FBC,0xAA001FBD,0xAB001FBE,0xAC001FBF,0xAD001FC0,0xAE001FC1,0xAF001FC5,0xB0001FC6,0xB1001FC7,0xB2001FC8, +0xB3001FE3,0xB4001FE4,0xB5001FE5,0xB6001FE6,0xB7001FE7,0xB8001FE8,0xB9001FE9,0xBA001FEA,0xBB001FEB,0xBC001FEC, +0xBD001FEE,0xBE001FEF,0xBF001FF0,0x000C746C,0x000C7469,0x000C7466,0x000C7463,0x000C7460,0x000C745D,0x000C745A, +0x000C7457,0x000C7454,0x000C7451,0xE1001E87,0x000C744E,0x000C744B,0x000C7448,0x000C7445,0x000C7442,0x000C743F, +0x000C743C,0x000C7439,0x000C7436,0x000C7433,0x000C7430,0x000C742D,0x000C742A,0x000C7427,0x80001FF1,0x81001FF2, +0x82001FF3,0x000C7424,0x000C7421,0x000C741E,0x000C741B,0x86001F5D,0x87001FB6,0xA8001FF5,0xA9001FF6,0xAA001FF7, +0xAB001FF8,0xAC001FF9,0xAD001FFA,0xAE001FFB,0xAF001FFF,0xB0002000,0xB1002001,0xB2002002,0xB300201D,0xB400201E, +0xB500201F,0xB6002020,0xB7002021,0xB8002022,0xB9002023,0xBA002024,0xBB002025,0xBC002026,0xBD002027,0xBE002028, +0xBF002029,0x000C7418,0x000C7415,0x000C7412,0x000C740F,0x000C740C,0x000C7409,0x000C7406,0x000C7403,0x000C7400, +0x000C73FD,0x000C73FA,0x000C73F7,0x000C73F4,0xE1001EC4,0x000C73F1,0x000C73EE,0x000C73EB,0x000C73E8,0x000C73E5, +0x000C73E2,0x000C73DF,0x000C73DC,0x000C73D9,0x000C73D6,0x000C73D3,0x8000202B,0x8100202C,0x8200202D,0x000C73D0, +0x000C73CD,0x000C73CA,0x000C73C7,0x000C73C4,0x000C73C1,0x000C73BE,0x000C73BB,0x000C73B8,0x000C73B5,0x000C73B2, +0x000C73AF,0x000C73AC,0x000C73A9,0x000C73A6,0x86001FA2,0x87001FED,0xA800202F,0xA9002030,0xAA002031,0xAB002032, +0xAC002033,0xAD002034,0xAE002035,0xAF002039,0xB000203A,0xB100203B,0xB200203C,0xB300203D,0xB400203E,0xB500203F, +0xB6002040,0xB7002041,0xB8002042,0xB9002043,0xBA002044,0xBB002045,0xBC002046,0xBD002047,0xBE002062,0xBF002063, +0x000C73A3,0x000C73A0,0xE1001F08,0x000C739D,0x000C739A,0x000C7397,0x000C7394,0x000C7391,0x000C738E,0x000C738B, +0x000C7388,0x80002065,0x81002066,0x82002067,0x000C7385,0x000C7382,0x000C737F,0x000C737C,0x000C7379,0x000C7376, +0x000C7373,0x000C7370,0x000C736D,0x000C736A,0x000C7367,0x000C7364,0x000C7361,0x000C735E,0x000C735B,0x000C7358, +0x000C7355,0x000C7352,0x86001FFD,0x87002006,0x000C734F,0x000C734C,0x80002089,0x8100208A,0x8200208B,0x000C7349, +0x000C7346,0x000C7343,0x000C7340,0x86002015,0x87002059,0x000C733D,0x000C733A,0x000C7337,0x000C7334,0x000C7331, +0x000C732E,0x000C732B,0x000C7328,0x000C7325,0x000C7322,0x000C731F,0x000C731C,0xE1001F43,0x000C7319,0x000C7316, +0x000C7313,0x000C7310,0x000C730D,0x000C730A,0x000C7307,0x000C7304,0x000C7301,0xA8002069,0xA900206A,0xAA00206B, +0xAB00206C,0xAC002070,0xAD002071,0xAE002072,0xAF002073,0xB0002074,0xB1002075,0xB2002076,0xB3002077,0xB4002078, +0xB5002079,0xB600207A,0xB700207B,0xB800207C,0xB900207D,0xBA00207E,0xBB00207F,0xBC002080,0xBD002081,0xBE002084, +0xBF002085,0xA800208F,0xA9002090,0xAA002091,0xAB002092,0xAC002093,0xAD002094,0xAE002095,0xAF002096,0xB0002097, +0xB1002098,0xB2002099,0xB300209A,0xB400209C,0xB500209D,0xB600209E,0xB700209F,0xB80020A0,0xB90020A1,0xBA0020A2, +0xBB0020A3,0xBC0020A4,0xBD0020D6,0xBE0020D7,0xBF0020D8,0xE1001F7D,0x000C72FE,0x000C72FB,0x000C72F8,0x800020DC, +0x810020DD,0x820020DE,0x000C72F5,0x000C72F2,0x000C72EF,0x000C72EC,0x86002048,0x8700209B,0x000C72E9,0x000C72E6, +0x000C72E3,0x000C72E0,0x000C72DD,0x000C72DA,0x000C72D7,0x000C72D4,0x000C72D1,0x000C72CE,0x000C72CB,0x000C72C8, +0x000C72C5,0x000C72C2,0xA80020E2,0xA90020E3,0xAA0020E4,0xAB0020E5,0xAC0020E6,0xAD0020E7,0xAE0020E8,0xAF0020E9, +0xB00020EA,0xB10020EB,0xB20020EC,0xB30020ED,0xB40020EE,0xB50020EF,0xB6002108,0xB7002109,0xB800210A,0xB900210B, +0xBA00210C,0xBB00210D,0xBC00210E,0xBD002110,0xBE002111,0xBF002112,0x000C72BF,0x000C72BC,0x000C72B9,0x000C72B6, +0x000C72B3,0x000C72B0,0x000C72AD,0xE1001FC2,0x000C72AA,0x000C72A7,0x000C72A4,0x000C72A1,0x000C729E,0x000C729B, +0x000C7298,0x000C7295,0x000C7292,0x000C728F,0x000C728C,0x80002113,0x81002114,0x82002115,0x000C7289,0x000C7286, +0x000C7283,0x000C7280,0x000C727D,0x000C727A,0x000C7277,0x000C7274,0x000C7271,0x000C726E,0x000C726B,0x000C7268, +0x000C7265,0x86002086,0x870020CD,0x000C7262,0xA8002117,0xA9002118,0xAA002119,0xAB00211A,0xAC00211E,0xAD00211F, +0xAE002120,0xAF002121,0xB0002122,0xB1002123,0xB2002124,0xB3002125,0xB4002126,0xB5002127,0xB6002128,0xB7002129, +0xB800212A,0xB900212D,0xBA002146,0xBB002147,0xBC002148,0xBD00214A,0xBE00214B,0xBF00214C,0x000C725F,0x000C725C, +0x000C7259,0xE1001FFC,0x000C7256,0x000C7253,0x000C7250,0x80002150,0x81002151,0x82002152,0x000C724D,0x000C724A, +0x000C7247,0x000C7244,0x860020C6,0x87002107,0x000C7241,0x000C723E,0x000C723B,0x000C7238,0x000C7235,0x000C7232, +0x000C722F,0x000C722C,0x000C7229,0x000C7226,0x000C7223,0x000C7220,0x000C721D,0x000C721A,0x000C7217,0x000C7214, +0x000C7211,0x000C720E,0x000C720B,0x000C7208,0x000C7205,0x000C7202,0x000C71FF,0xE1002007,0xA8002156,0xA9002157, +0xAA002158,0xAB002159,0xAC00215A,0xAD00215B,0xAE00215C,0xAF00215D,0xB000215E,0xB100215F,0xB2002160,0xB3002161, +0xB4002162,0xB5002163,0xB6002164,0xB7002165,0xB8002166,0xB9002167,0xBA002168,0xBB002169,0xBC00216A,0xBD00216B, +0xBE00216C,0xBF002186,0x000C71FC,0x8000218A,0x8100218B,0x8200218C,0x000C71F9,0x000C71F6,0x000C71F3,0xE100210F, +0x000C71F0,0x000C71ED,0x000C71EA,0x000C71E7,0x000C71E4,0x000C71E1,0x850020F4,0xA100218E,0xA20021DB,0xA3002218, +0xA4002252,0xA500228C,0xA60022C6,0xA7002300,0xA8002337,0xA9002374,0xAA0023AE,0xAB0023E5,0xAC00241F,0xAD00245C, +0xAE002493,0xAF0024CD,0xB0002507,0xB1002544,0xB200257B,0xB300259C,0xB40025EF,0xB500262C,0x000C71DE,0x000C71DB, +0x000C71D8,0x000C71D5,0x000C71D2,0x000C71CF,0x000C71CC,0x8600211B,0x8700216D,0x000C71C9,0x000C71C6,0x000C71C3, +0x000C71C0,0x000C71BD,0x000C71BA,0x000C71B7,0x000C71B4,0x000C71B1,0x000C71AE,0x000C71AB,0x000C71A8,0x000C71A5, +0xE100205A,0x000C71A2,0x000C719F,0xA800218F,0xA9002190,0xAA002191,0xAB002192,0xAC002193,0xAD0021AA,0xAE0021AB, +0xAF0021AC,0xB00021AD,0xB10021AE,0xB20021AF,0xB30021B0,0xB40021B3,0xB50021B4,0xB60021B5,0xB70021B6,0xB80021B7, +0xB90021B8,0xBA0021B9,0xBB0021BA,0xBC0021BB,0xBD0021BC,0xBE0021BD,0xBF0021BE,0x000C719C,0x000C7199,0x000C7196, +0x000C7193,0x000C7190,0x000C718D,0x000C718A,0x000C7187,0x000C7184,0x000C7181,0x000C717E,0x000C717B,0x000C7178, +0x000C7175,0x000C7172,0x000C716F,0x000C716C,0x000C7169,0x800021BF,0x810021C1,0x820021C2,0x000C7166,0x000C7163, +0x000C7160,0x000C715D,0x86002154,0x87002194,0x000C715A,0xE10020A5,0x000C7157,0x000C7154,0x000C7151,0x000C714E, +0xA80021DC,0xA90021DD,0xAA0021DE,0xAB0021DF,0xAC0021E0,0xAD0021E1,0xAE0021E2,0xAF0021E3,0xB00021E4,0xB10021E5, +0xB20021E6,0xB30021E7,0xB40021E8,0xB50021E9,0xB60021EA,0xB70021EB,0xB80021EC,0xB90021F0,0xBA0021F1,0xBB0021F2, +0xBC0021F3,0xBD0021F6,0xBE0021F8,0xBF0021F9,0x800021FA,0x810021FB,0x82002217,0x000C714B,0x000C7148,0x000C7145, +0x000C7142,0x8600218D,0x870021CD,0x000C713F,0x000C713C,0x000C7139,0x000C7136,0x000C7133,0x000C7130,0x000C712D, +0x000C712A,0x000C7127,0x000C7124,0x000C7121,0x000C711E,0x000C711B,0x000C7118,0x000C7115,0x000C7112,0x000C710F, +0x000C710C,0x000C7109,0x000C7106,0x000C7103,0x000C7100,0x000C70FD,0xE10020CE,0xA8002219,0xA900221A,0xAA00221D, +0xAB00221E,0xAC00221F,0xAD002220,0xAE002221,0xAF002222,0xB0002223,0xB1002224,0xB2002225,0xB3002226,0xB4002227, +0xB5002228,0xB6002229,0xB700222A,0xB800222B,0xB900222C,0xBA00222D,0xBB00222E,0xBC00222F,0xBD002230,0xBE002231, +0xBF002232,0x80002233,0x81002250,0x82002251,0x000C70FA,0x000C70F7,0x000C70F4,0x000C70F1,0x860021C8,0x87002208, +0x000C70EE,0x000C70EB,0x000C70E8,0x000C70E5,0x000C70E2,0x000C70DF,0x000C70DC,0x000C70D9,0x000C70D6,0x000C70D3, +0x000C70D0,0x000C70CD,0x000C70CA,0x000C70C7,0x000C70C4,0x000C70C1,0x000C70BE,0x000C70BB,0x000C70B8,0x000C70B5, +0x000C70B2,0x000C70AF,0x000C70AC,0x000C70A9,0x000C70A6,0xE100212B,0xA8002253,0xA9002256,0xAA002257,0xAB002258, +0xAC002259,0xAD00225A,0xAE00225B,0xAF00225C,0xB000225D,0xB100225E,0xB200225F,0xB3002260,0xB4002261,0xB5002262, +0xB6002263,0xB7002264,0xB8002265,0xB9002266,0xBA002267,0xBB002268,0xBC002269,0xBD00226A,0xBE00226B,0xBF00226C, +0x8000226D,0x8100226E,0x8200228B,0x000C70A3,0x000C70A0,0x860021ED,0x87002240,0x000C709D,0x000C709A,0x000C7097, +0x000C7094,0x000C7091,0x000C708E,0xA800228F,0xA9002290,0xAA002291,0xAB002292,0xAC002293,0xAD002294,0xAE0022AD, +0xAF0022AE,0xB00022AF,0xB10022B0,0xB20022B1,0xB30022B2,0xB40022B3,0xB50022B4,0xB60022B5,0xB70022B6,0xB80022B7, +0xB90022B8,0xBA0022B9,0xBB0022BA,0xBC0022BB,0xBD0022BD,0xBE0022BE,0xBF0022BF,0x000C708B,0x000C7088,0x000C7085, +0x000C7082,0x000C707F,0x000C707C,0x000C7079,0x000C7076,0x000C7073,0x000C7070,0x000C706D,0x000C706A,0x000C7067, +0x000C7064,0x000C7061,0xE100216E,0x000C705E,0x000C705B,0x000C7058,0x800022C3,0x810022C4,0x820022C5,0x000C7055, +0x000C7052,0x000C704F,0x000C704C,0x86002234,0x8700227A,0x000C7049,0x000C7046,0x000C7043,0x000C7040,0x000C703D, +0x000C703A,0x000C7037,0x000C7034,0x000C7031,0x000C702E,0x000C702B,0x000C7028,0x000C7025,0x000C7022,0x000C701F, +0x000C701C,0x000C7019,0x000C7016,0x000C7013,0xA80022C9,0xA90022CA,0xAA0022CB,0xAB0022CC,0xAC0022CD,0xAD0022CE, +0xAE0022CF,0xAF0022D0,0xB00022D1,0xB10022D2,0xB20022D3,0xB30022D4,0xB40022D5,0xB50022D6,0xB60022D7,0xB70022D8, +0xB80022D9,0xB90022DA,0xBA0022DB,0xBB0022F4,0xBC0022F5,0xBD0022F6,0xBE0022F7,0xBF0022F8,0x000C7010,0x000C700D, +0x000C700A,0x000C7007,0x000C7004,0xE1002195,0x800022FD,0x810022FE,0x820022FF,0x000C7001,0x000C6FFE,0x000C6FFB, +0x000C6FF8,0x8600226F,0x870022BC,0x000C6FF5,0x000C6FF2,0x000C6FEF,0x000C6FEC,0x000C6FE9,0x000C6FE6,0x000C6FE3, +0x000C6FE0,0x000C6FDD,0x000C6FDA,0x000C6FD7,0x000C6FD4,0x000C6FD1,0x000C6FCE,0x000C6FCB,0x000C6FC8,0x000C6FC5, +0x000C6FC2,0x000C6FBF,0x000C6FBC,0xA8002303,0xA9002304,0xAA002305,0xAB002306,0xAC002307,0xAD002308,0xAE002309, +0xAF00230A,0xB000230B,0xB100230C,0xB200230D,0xB300230E,0xB400230F,0xB5002310,0xB6002311,0xB7002312,0xB8002313, +0xB9002314,0xBA002315,0xBB002316,0xBC00232F,0xBD002330,0xBE002331,0xBF002332,0x000C6FB9,0x000C6FB6,0x000C6FB3, +0x000C6FB0,0xE10021CE,0x000C6FAD,0x000C6FAA,0x000C6FA7,0x000C6FA4,0x000C6FA1,0x000C6F9E,0x000C6F9B,0x000C6F98, +0x80002334,0x81002335,0x82002336,0x000C6F95,0x000C6F92,0x000C6F8F,0x000C6F8C,0x000C6F89,0x000C6F86,0x000C6F83, +0x860022A0,0x870022EE,0xA8002338,0xA9002339,0xAA00233A,0xAB00233B,0xAC00233F,0xAD002340,0xAE002341,0xAF002342, +0xB0002343,0xB1002344,0xB2002345,0xB3002360,0xB4002361,0xB5002362,0xB6002363,0xB7002364,0xB8002365,0xB9002366, +0xBA002367,0xBB002368,0xBC002369,0xBD00236A,0xBE00236B,0xBF00236C,0x000C6F80,0x000C6F7D,0x000C6F7A,0x000C6F77, +0x000C6F74,0x000C6F71,0x000C6F6E,0x000C6F6B,0x000C6F68,0x000C6F65,0x000C6F62,0x000C6F5F,0x000C6F5C,0xE1002207, +0x80002371,0x81002372,0x82002373,0x000C6F59,0x000C6F56,0x000C6F53,0x000C6F50,0x860022DC,0x87002328,0x000C6F4D, +0x000C6F4A,0x000C6F47,0x000C6F44,0x000C6F41,0x000C6F3E,0x000C6F3B,0x000C6F38,0x000C6F35,0x000C6F32,0x000C6F2F, +0x000C6F2C,0x000C6F29,0xA8002377,0xA9002378,0xAA002379,0xAB00237A,0xAC00237B,0xAD00237C,0xAE00237D,0xAF00237E, +0xB000237F,0xB1002380,0xB2002381,0xB3002382,0xB4002383,0xB500239C,0xB600239D,0xB700239E,0xB800239F,0xB90023A0, +0xBA0023A1,0xBB0023A2,0xBC0023A3,0xBD0023A4,0xBE0023A5,0xBF0023A6,0x000C6F26,0x000C6F23,0x000C6F20,0x000C6F1D, +0x000C6F1A,0x000C6F17,0x000C6F14,0x000C6F11,0x000C6F0E,0x000C6F0B,0x000C6F08,0xE1002241,0x800023AB,0x810023AC, +0x820023AD,0x000C6F05,0x000C6F02,0x000C6EFF,0x000C6EFC,0x86002317,0x8700236D,0x000C6EF9,0x000C6EF6,0x000C6EF3, +0x000C6EF0,0x000C6EED,0x000C6EEA,0x000C6EE7,0x000C6EE4,0x000C6EE1,0x000C6EDE,0x000C6EDB,0x000C6ED8,0x000C6ED5, +0x000C6ED2,0xA80023B1,0xA90023B2,0xAA0023B3,0xAB0023B4,0xAC0023B5,0xAD0023B6,0xAE0023B7,0xAF0023B8,0xB00023B9, +0xB10023BA,0xB20023BB,0xB30023BC,0xB40023BD,0xB50023BE,0xB60023D7,0xB70023D8,0xB80023D9,0xB90023DA,0xBA0023DB, +0xBB0023DC,0xBC0023DD,0xBD0023DE,0xBE0023DF,0xBF0023E0,0x000C6ECF,0x000C6ECC,0x000C6EC9,0x000C6EC6,0x000C6EC3, +0x000C6EC0,0x000C6EBD,0x000C6EBA,0x000C6EB7,0x000C6EB4,0xE100227B,0x000C6EB1,0x000C6EAE,0x000C6EAB,0x000C6EA8, +0x000C6EA5,0x000C6EA2,0x000C6E9F,0x000C6E9C,0x000C6E99,0x000C6E96,0x000C6E93,0x800023E2,0x810023E3,0x820023E4, +0x000C6E90,0x000C6E8D,0x000C6E8A,0x000C6E87,0x8600234E,0x870023A7,0xA80023E6,0xA90023E7,0xAA0023E8,0xAB0023E9, +0xAC0023EA,0xAD0023EB,0xAE0023EC,0xAF0023F0,0xB00023F1,0xB10023F2,0xB20023F3,0xB300240E,0xB400240F,0xB5002410, +0xB6002411,0xB7002412,0xB8002413,0xB9002414,0xBA002415,0xBB002416,0xBC002417,0xBD002419,0xBE00241A,0xBF00241B, +0x000C6E84,0x000C6E81,0x000C6E7E,0x000C6E7B,0x000C6E78,0x000C6E75,0x000C6E72,0x000C6E6F,0x000C6E6C,0x000C6E69, +0xE10022C0,0x000C6E66,0x000C6E63,0x000C6E60,0x000C6E5D,0x000C6E5A,0x000C6E57,0x000C6E54,0x86002384,0x870023D6, +0x000C6E51,0x000C6E4E,0x000C6E4B,0x000C6E48,0x000C6E45,0x8000241C,0x8100241D,0x8200241E,0x000C6E42,0x000C6E3F, +0xA8002422,0xA9002423,0xAA002424,0xAB002425,0xAC002426,0xAD00242A,0xAE00242B,0xAF002444,0xB0002445,0xB1002446, +0xB2002447,0xB3002448,0xB4002449,0xB500244A,0xB600244B,0xB700244C,0xB800244D,0xB900244E,0xBA00244F,0xBB002450, +0xBC002451,0xBD002452,0xBE002453,0xBF002454,0x000C6E3C,0x000C6E39,0x000C6E36,0x000C6E33,0x000C6E30,0x000C6E2D, +0x000C6E2A,0x000C6E27,0x000C6E24,0x000C6E21,0x000C6E1E,0x000C6E1B,0x000C6E18,0x000C6E15,0x000C6E12,0x000C6E0F, +0x000C6E0C,0xE10022EF,0x80002459,0x8100245A,0x8200245B,0x000C6E09,0x000C6E06,0x000C6E03,0x000C6E00,0x000C6DFD, +0x000C6DFA,0x000C6DF7,0x000C6DF4,0x000C6DF1,0x000C6DEE,0x000C6DEB,0x000C6DE8,0x000C6DE5,0x000C6DE2,0x860023C1, +0x87002418,0xA800245D,0xA900245E,0xAA00245F,0xAB002460,0xAC002461,0xAD002462,0xAE002463,0xAF002464,0xB0002465, +0xB1002466,0xB2002481,0xB3002482,0xB4002483,0xB5002484,0xB6002485,0xB7002486,0xB8002487,0xB9002488,0xBA002489, +0xBB00248A,0xBC00248B,0xBD00248C,0xBE00248D,0xBF00248E,0x000C6DDF,0x000C6DDC,0x000C6DD9,0x000C6DD6,0x000C6DD3, +0x000C6DD0,0x000C6DCD,0x000C6DCA,0x000C6DC7,0x000C6DC4,0x000C6DC1,0x000C6DBE,0x000C6DBB,0x000C6DB8,0xE1002329, +0x000C6DB5,0x000C6DB2,0x000C6DAF,0x000C6DAC,0x000C6DA9,0x000C6DA6,0x000C6DA3,0x000C6DA0,0x80002490,0x81002491, +0x82002492,0x000C6D9D,0x000C6D9A,0x000C6D97,0x000C6D94,0x000C6D91,0x000C6D8E,0x000C6D8B,0x000C6D88,0x000C6D85, +0x000C6D82,0x000C6D7F,0x86002400,0x87002455,0xA8002494,0xA9002495,0xAA002496,0xAB002497,0xAC00249B,0xAD00249C, +0xAE00249D,0xAF00249E,0xB000249F,0xB10024A0,0xB20024A1,0xB30024A2,0xB40024A3,0xB50024A4,0xB60024A5,0xB70024C0, +0xB80024C1,0xB90024C2,0xBA0024C3,0xBB0024C4,0xBC0024C5,0xBD0024C7,0xBE0024C8,0xBF0024C9,0x000C6D7C,0x000C6D79, +0x000C6D76,0x000C6D73,0x000C6D70,0x000C6D6D,0xE100236E,0x000C6D6A,0x000C6D67,0x000C6D64,0x000C6D61,0x000C6D5E, +0x000C6D5B,0x000C6D58,0x000C6D55,0x000C6D52,0x000C6D4F,0x000C6D4C,0x000C6D49,0x000C6D46,0x000C6D43,0x800024CA, +0x810024CB,0x820024CC,0x000C6D40,0x000C6D3D,0x000C6D3A,0x000C6D37,0x86002436,0x8700248F,0xA80024CE,0xA90024CF, +0xAA0024D0,0xAB0024D1,0xAC0024D2,0xAD0024D3,0xAE0024D4,0xAF0024D8,0xB00024D9,0xB10024DA,0xB20024DB,0xB30024F6, +0xB40024F7,0xB50024F8,0xB60024F9,0xB70024FA,0xB80024FB,0xB90024FC,0xBA0024FD,0xBB0024FE,0xBC0024FF,0xBD002501, +0xBE002502,0xBF002503,0x000C6D34,0x000C6D31,0x000C6D2E,0x000C6D2B,0x000C6D28,0x000C6D25,0x000C6D22,0x000C6D1F, +0x000C6D1C,0x000C6D19,0xE100239A,0x000C6D16,0x000C6D13,0x000C6D10,0x000C6D0D,0x000C6D0A,0x000C6D07,0x000C6D04, +0x000C6D01,0x000C6CFE,0x000C6CFB,0x000C6CF8,0x000C6CF5,0x000C6CF2,0x000C6CEF,0x80002504,0x81002505,0x82002506, +0x000C6CEC,0x000C6CE9,0x000C6CE6,0x000C6CE3,0x000C6CE0,0x000C6CDD,0x000C6CDA,0x000C6CD7,0x000C6CD4,0x000C6CD1, +0x000C6CCE,0x000C6CCB,0x86002478,0x870024BE,0xA8002508,0xA9002509,0xAA00250A,0xAB00250B,0xAC00250C,0xAD00250D, +0xAE00250E,0xAF002512,0xB0002513,0xB1002514,0xB2002515,0xB3002516,0xB4002517,0xB5002518,0xB6002519,0xB700251A, +0xB800251B,0xB900251C,0xBA00251D,0xBB002538,0xBC002539,0xBD00253A,0xBE00253B,0xBF00253C,0x000C6CC8,0x000C6CC5, +0x000C6CC2,0x000C6CBF,0x000C6CBC,0xE10023E1,0x80002541,0x81002542,0x82002543,0x000C6CB9,0x000C6CB6,0x000C6CB3, +0x000C6CB0,0x860024A6,0x87002500,0x000C6CAD,0x000C6CAA,0x000C6CA7,0x000C6CA4,0x000C6CA1,0x000C6C9E,0x000C6C9B, +0xA8002547,0xA9002548,0xAA002549,0xAB00254A,0xAC00254B,0xAD00254C,0xAE00254D,0xAF002566,0xB0002567,0xB1002568, +0xB2002569,0xB300256A,0xB400256B,0xB500256C,0xB600256D,0xB700256E,0xB800256F,0xB9002570,0xBA002571,0xBB002572, +0xBC002573,0xBD002575,0xBE002576,0xBF002577,0x000C6C98,0x000C6C95,0x000C6C92,0x000C6C8F,0x000C6C8C,0x000C6C89, +0x000C6C86,0x000C6C83,0x000C6C80,0x000C6C7D,0x000C6C7A,0x000C6C77,0x000C6C74,0x000C6C71,0xE1002420,0x000C6C6E, +0x000C6C6B,0x000C6C68,0x000C6C65,0x000C6C62,0x000C6C5F,0x000C6C5C,0x000C6C59,0x000C6C56,0x000C6C53,0x000C6C50, +0x80002578,0x81002579,0x8200257A,0x000C6C4D,0x000C6C4A,0x000C6C47,0x000C6C44,0x000C6C41,0x000C6C3E,0x000C6C3B, +0x000C6C38,0x000C6C35,0x000C6C32,0x000C6C2F,0x000C6C2C,0x000C6C29,0x000C6C26,0x000C6C23,0x000C6C20,0x000C6C1D, +0x000C6C1A,0x86002510,0x8700251E,0x000C6C17,0x000C6C14,0x000C6C11,0x000C6C0E,0x000C6C0B,0x000C6C08,0x000C6C05, +0x80002599,0x8100259A,0x8200259B,0x000C6C02,0x000C6BFF,0x000C6BFC,0x000C6BF9,0x86002528,0x87002574,0x000C6BF6, +0x000C6BF3,0x000C6BF0,0x000C6BED,0x000C6BEA,0x000C6BE7,0x000C6BE4,0xE1002456,0x000C6BE1,0x000C6BDE,0x000C6BDB, +0x000C6BD8,0x000C6BD5,0x000C6BD2,0x000C6BCF,0x000C6BCC,0x000C6BC9,0xA800257C,0xA900257D,0xAA00257E,0xAB00257F, +0xAC002583,0xAD002584,0xAE002585,0xAF002586,0xB0002587,0xB1002588,0xB2002589,0xB300258A,0xB400258B,0xB500258C, +0xB600258D,0xB700258E,0xB800258F,0xB9002590,0xBA002591,0xBB002592,0xBC002593,0xBD002594,0xBE002597,0xBF002598, +0xA800259D,0xA90025A1,0xAA0025A2,0xAB0025A3,0xAC0025A4,0xAD0025A7,0xAE0025A8,0xAF0025A9,0xB00025AA,0xB10025AB, +0xB20025AC,0xB30025AD,0xB40025AF,0xB50025B0,0xB60025B1,0xB70025B2,0xB80025B3,0xB90025B4,0xBA0025B5,0xBB0025B6, +0xBC0025B7,0xBD0025E9,0xBE0025EA,0xBF0025EB,0xE1002498,0x000C6BC6,0x000C6BC3,0x000C6BC0,0x000C6BBD,0x000C6BBA, +0x000C6BB7,0x000C6BB4,0x000C6BB1,0x000C6BAE,0x000C6BAB,0x000C6BA8,0x800025EC,0x810025ED,0x820025EE,0x000C6BA5, +0x000C6BA2,0x000C6B9F,0x000C6B9C,0x000C6B99,0x000C6B96,0x000C6B93,0x000C6B90,0x000C6B8D,0x000C6B8A,0x000C6B87, +0x000C6B84,0x000C6B81,0x000C6B7E,0x000C6B7B,0x86002560,0x870025A6,0xA80025F0,0xA90025F1,0xAA0025F2,0xAB0025F3, +0xAC0025F7,0xAD0025F8,0xAE0025F9,0xAF0025FA,0xB00025FB,0xB10025FC,0xB20025FD,0xB30025FE,0xB40025FF,0xB5002600, +0xB6002601,0xB7002602,0xB8002603,0xB9002604,0xBA002605,0xBB002620,0xBC002621,0xBD002622,0xBE002623,0xBF002624, +0x000C6B78,0x000C6B75,0x000C6B72,0x000C6B6F,0x000C6B6C,0xE10024BF,0x80002629,0x8100262A,0x8200262B,0x000C6B69, +0x000C6B66,0x000C6B63,0x000C6B60,0x000C6B5D,0x000C6B5A,0x000C6B57,0x000C6B54,0x000C6B51,0x000C6B4E,0x000C6B4B, +0x86002595,0x870025E0,0x000C6B48,0x000C6B45,0x000C6B42,0x000C6B3F,0x000C6B3C,0x000C6B39,0x000C6B36,0xA800262D, +0xA900262E,0xAA00262F,0xAB002630,0xAC002631,0xAD002632,0xAE002633,0xAF002636,0xB0002637,0xB1002638,0xB2002639, +0xB300263A,0xB400263B,0xB500263C,0xB6002655,0xB7002656,0xB8002657,0xB9002658,0xBA002659,0xBB00265A,0xBC00265B, +0xBD00265D,0xBE00265E,0xBF00265F,0x000C6B33,0x000C6B30,0x000C6B2D,0x000C6B2A,0x000C6B27,0x000C6B24,0x000C6B21, +0xE100250F,0x000C6B1E,0x000C6B1B,0x000C6B18,0x80002663,0x81002664,0x82002665,0x000C6B15,0x000C6B12,0x000C6B0F, +0x850025DD,0x000C6B0C,0x860025F4,0x87002619,0x000C6B09,0x000C6B06,0x000C6B03,0x000C6B00,0x000C6AFD,0x000C6AFA, +0x000C6AF7,0x000C6AF4,0x000C6AF1,0x000C6AEE,0x000C6AEB,0x000C6AE8,0x000C6AE5,0xE10025E1,0x000C6AE2,0x000C6ADF, +0x000C6ADC,0x000C6AD9,0x000C6AD6,0xE100251F,0xA1002667,0xA20026B7,0xA30026D9,0xA400272B,0xA5002765,0xA600279C, +0xA70027C1,0xA8002813,0xA900284A,0xAA002884,0xAB0028BE,0xAC0028FB,0xAD002935,0xAE00296F,0xAF0029A6,0xB00029E0, +0xB1002A1A,0xB2002A54,0xB3002A8E,0xB4002ACB,0xB5002B05,0x000C6AD3,0x000C6AD0,0x000C6ACD,0x000C6ACA,0x000C6AC7, +0x000C6AC4,0x800026B4,0x810026B5,0x820026B6,0xA800266A,0xA900266B,0xAA00266C,0xAB00266D,0xAC00266E,0xAD00266F, +0xAE002670,0xAF002671,0xB0002672,0xB1002673,0xB2002674,0xB3002675,0xB4002676,0xB5002678,0xB6002679,0xB700267A, +0xB800267B,0xB900267C,0xBA002693,0xBB002694,0xBC002695,0xBD002696,0xBE002697,0xBF002698,0x000C6AC1,0x000C6ABE, +0x000C6ABB,0x000C6AB8,0x000C6AB5,0x000C6AB2,0x86002635,0x87002653,0x000C6AAF,0x000C6AAC,0x000C6AA9,0x000C6AA6, +0x000C6AA3,0x000C6AA0,0x000C6A9D,0x000C6A9A,0x000C6A97,0x000C6A94,0x000C6A91,0x000C6A8E,0x000C6A8B,0x000C6A88, +0x000C6A85,0x000C6A82,0x000C6A7F,0x000C6A7C,0x000C6A79,0x000C6A76,0xE1002580,0x000C6A73,0x000C6A70,0x800026D6, +0x810026D7,0x820026D8,0x000C6A6D,0x000C6A6A,0x000C6A67,0x000C6A64,0x8600264D,0x870026A5,0x000C6A61,0xA80026B8, +0xA90026B9,0xAA0026BC,0xAB0026BD,0xAC0026BE,0xAD0026BF,0xAE0026C0,0xAF0026C1,0xB00026C2,0xB10026C3,0xB20026C4, +0xB30026C5,0xB40026C6,0xB50026C7,0xB60026C8,0xB70026C9,0xB80026CA,0xB90026CB,0xBA0026CC,0xBB0026CD,0xBC0026CE, +0xBD0026CF,0xBE0026D1,0xBF0026D2,0xA80026DC,0xA900270E,0xAA00270F,0xAB002710,0xAC002711,0xAD002712,0xAE002713, +0xAF002714,0xB0002715,0xB1002716,0xB2002717,0xB3002718,0xB4002719,0xB500271A,0xB600271B,0xB700271C,0xB800271D, +0xB900271E,0xBA00271F,0xBB002720,0xBC002721,0xBD002722,0xBE002723,0xBF002724,0xE10025AE,0x000C6A5E,0x000C6A5B, +0x000C6A58,0x000C6A55,0x000C6A52,0x000C6A4F,0x000C6A4C,0x000C6A49,0x000C6A46,0x000C6A43,0x000C6A40,0x000C6A3D, +0x000C6A3A,0x000C6A37,0x000C6A34,0x000C6A31,0x000C6A2E,0x000C6A2B,0x000C6A28,0x000C6A25,0x000C6A22,0x000C6A1F, +0x000C6A1C,0x80002728,0x81002729,0x8200272A,0x000C6A19,0x000C6A16,0x000C6A13,0x000C6A10,0x86002686,0x870026DF, +0xA8002746,0xA9002747,0xAA002749,0xAB00274A,0xAC00274B,0xAD00274C,0xAE00274D,0xAF00274E,0xB000274F,0xB1002750, +0xB2002751,0xB3002752,0xB4002753,0xB5002754,0xB6002755,0xB7002756,0xB8002757,0xB9002758,0xBA002759,0xBB00275A, +0xBC00275B,0xBD00275C,0xBE00275D,0xBF00275E,0x000C6A0D,0x000C6A0A,0xE10025E2,0x000C6A07,0x000C6A04,0x000C6A01, +0x000C69FE,0x000C69FB,0x000C69F8,0x000C69F5,0x000C69F2,0x000C69EF,0x000C69EC,0x000C69E9,0x000C69E6,0x000C69E3, +0x000C69E0,0x000C69DD,0x000C69DA,0x000C69D7,0x000C69D4,0x000C69D1,0x000C69CE,0x000C69CB,0x000C69C8,0x80002762, +0x81002763,0x82002764,0x000C69C5,0x000C69C2,0x000C69BF,0x000C69BC,0x860026D0,0x87002725,0x000C69B9,0x000C69B6, +0x000C69B3,0x000C69B0,0x000C69AD,0x000C69AA,0x000C69A7,0x000C69A4,0x000C69A1,0x000C699E,0x000C699B,0x000C6998, +0x000C6995,0x000C6992,0x000C698F,0x000C698C,0xA8002768,0xA9002769,0xAA00276A,0xAB00276B,0xAC00276C,0xAD00276D, +0xAE00276E,0xAF00276F,0xB0002770,0xB1002771,0xB2002772,0xB3002773,0xB4002774,0xB5002775,0xB6002776,0xB7002777, +0xB8002790,0xB9002791,0xBA002792,0xBB002793,0xBC002794,0xBD002795,0xBE002796,0xBF002797,0x000C6989,0x000C6986, +0x000C6983,0x000C6980,0x000C697D,0x000C697A,0x000C6977,0x000C6974,0xE1002634,0x000C6971,0x000C696E,0x000C696B, +0x000C6968,0x000C6965,0x000C6962,0x000C695F,0x000C695C,0x000C6959,0x000C6956,0x000C6953,0x000C6950,0x80002799, +0x8100279A,0x8200279B,0x000C694D,0x000C694A,0x000C6947,0x000C6944,0x86002727,0x8700273B,0x000C6941,0x000C693E, +0x000C693B,0x000C6938,0x000C6935,0x000C6932,0x000C692F,0x000C692C,0x000C6929,0x000C6926,0x000C6923,0x000C6920, +0xE1002654,0x800027BE,0x810027BF,0x820027C0,0x000C691D,0x000C691A,0x000C6917,0x000C6914,0x8600273F,0x8700278D, +0x000C6911,0x000C690E,0x000C690B,0x000C6908,0x000C6905,0x000C6902,0x000C68FF,0x000C68FC,0x000C68F9,0x000C68F6, +0x000C68F3,0xA800279D,0xA900279E,0xAA00279F,0xAB0027A0,0xAC0027A1,0xAD0027A2,0xAE0027A3,0xAF0027A4,0xB00027A8, +0xB10027A9,0xB20027AA,0xB30027AB,0xB40027AE,0xB50027AF,0xB60027B0,0xB70027B1,0xB80027B2,0xB90027B3,0xBA0027B4, +0xBB0027B5,0xBC0027B6,0xBD0027B7,0xBE0027B8,0xBF0027B9,0xA80027C4,0xA90027C5,0xAA0027C6,0xAB0027C7,0xAC0027C8, +0xAD0027C9,0xAE0027CA,0xAF0027CB,0xB00027CC,0xB10027CD,0xB20027CE,0xB30027FF,0xB4002800,0xB5002801,0xB6002802, +0xB7002803,0xB8002804,0xB9002805,0xBA002806,0xBB002807,0xBC002808,0xBD002809,0xBE00280A,0xBF00280B,0x000C68F0, +0x000C68ED,0x000C68EA,0x000C68E7,0x000C68E4,0x000C68E1,0x000C68DE,0x000C68DB,0x000C68D8,0x000C68D5,0x000C68D2, +0x000C68CF,0x000C68CC,0xE10026A6,0x80002810,0x81002811,0x82002812,0x000C68C9,0x000C68C6,0x000C68C3,0x000C68C0, +0x86002778,0x870027CF,0x000C68BD,0x000C68BA,0x000C68B7,0x000C68B4,0x000C68B1,0x000C68AE,0x000C68AB,0x000C68A8, +0x000C68A5,0x000C68A2,0xA8002816,0xA9002817,0xAA002818,0xAB002819,0xAC00281A,0xAD00281B,0xAE00281C,0xAF00281D, +0xB000281E,0xB100281F,0xB2002838,0xB3002839,0xB400283A,0xB500283B,0xB600283C,0xB700283D,0xB800283E,0xB900283F, +0xBA002840,0xBB002841,0xBC002842,0xBD002843,0xBE002844,0xBF002845,0x000C689F,0x000C689C,0x000C6899,0x000C6896, +0x000C6893,0x000C6890,0x000C688D,0x000C688A,0x000C6887,0x000C6884,0x000C6881,0x000C687E,0x000C687B,0x000C6878, +0xE10026E0,0x000C6875,0x000C6872,0x000C686F,0x000C686C,0x000C6869,0x000C6866,0x000C6863,0x000C6860,0x80002847, +0x81002848,0x82002849,0x000C685D,0x000C685A,0x000C6857,0x000C6854,0x860027BA,0x8700280C,0x000C6851,0x000C684E, +0x000C684B,0x000C6848,0x000C6845,0x000C6842,0x000C683F,0x000C683C,0x000C6839,0x000C6836,0xA800284B,0xA900284C, +0xAA00284D,0xAB00284E,0xAC002852,0xAD002853,0xAE002854,0xAF002855,0xB0002858,0xB1002859,0xB200285A,0xB300285B, +0xB400285C,0xB500285D,0xB600285E,0xB700285F,0xB8002860,0xB9002861,0xBA00287A,0xBB00287B,0xBC00287C,0xBD00287E, +0xBE00287F,0xBF002880,0x000C6833,0x000C6830,0x000C682D,0xE1002726,0x000C682A,0x000C6827,0x000C6824,0x000C6821, +0x000C681E,0x000C681B,0x000C6818,0x000C6815,0x000C6812,0x000C680F,0x000C680C,0x000C6809,0x000C6806,0x000C6803, +0x80002881,0x81002882,0x82002883,0x000C6800,0x000C67FD,0x000C67FA,0x000C67F7,0x860027FB,0x87002846,0x000C67F4, +0x000C67F1,0x000C67EE,0x000C67EB,0x000C67E8,0x000C67E5,0x000C67E2,0x000C67DF,0x000C67DC,0x000C67D9,0x000C67D6, +0x000C67D3,0x000C67D0,0xE100273C,0xA8002885,0xA9002886,0xAA002887,0xAB002888,0xAC002889,0xAD00288A,0xAE00288B, +0xAF00288F,0xB0002890,0xB1002891,0xB2002892,0xB3002895,0xB4002896,0xB5002897,0xB6002898,0xB7002899,0xB800289A, +0xB900289B,0xBA00289C,0xBB00289D,0xBC00289E,0xBD00289F,0xBE0028A0,0xBF0028A1,0x000C67CD,0x000C67CA,0x000C67C7, +0x000C67C4,0x000C67C1,0x000C67BE,0x000C67BB,0x000C67B8,0x000C67B5,0x000C67B2,0x000C67AF,0x800028BB,0x810028BC, +0x820028BD,0x000C67AC,0x000C67A9,0x000C67A6,0x000C67A3,0x000C67A0,0x000C679D,0x000C679A,0x000C6797,0x000C6794, +0x000C6791,0x000C678E,0x000C678B,0x8600282F,0x87002875,0xA80028BF,0xA90028C0,0xAA0028C1,0xAB0028C2,0xAC0028C3, +0xAD0028C4,0xAE0028C5,0xAF0028C9,0xB00028CA,0xB10028CB,0xB20028CC,0xB30028CD,0xB40028CE,0xB50028CF,0xB60028D0, +0xB70028D1,0xB80028D2,0xB90028D3,0xBA0028D4,0xBB0028EF,0xBC0028F0,0xBD0028F1,0xBE0028F2,0xBF0028F3,0x000C6788, +0x000C6785,0x000C6782,0x000C677F,0x000C677C,0xE100278E,0x800028F8,0x810028F9,0x820028FA,0x000C6779,0x000C6776, +0x000C6773,0x000C6770,0x86002856,0x870028AF,0xA8002916,0xA9002917,0xAA002918,0xAB002919,0xAC00291A,0xAD00291B, +0xAE00291C,0xAF00291D,0xB000291E,0xB100291F,0xB2002920,0xB3002921,0xB4002922,0xB5002923,0xB6002924,0xB7002925, +0xB8002926,0xB9002927,0xBA002928,0xBB002929,0xBC00292A,0xBD00292C,0xBE00292D,0xBF00292E,0x000C676D,0x000C676A, +0x000C6767,0x000C6764,0x000C6761,0x000C675E,0x000C675B,0x000C6758,0x000C6755,0x000C6752,0x000C674F,0x000C674C, +0x000C6749,0x000C6746,0x000C6743,0x000C6740,0x000C673D,0x000C673A,0x000C6737,0x000C6734,0x000C6731,0xE10027D0, +0x000C672E,0x000C672B,0x000C6728,0x80002932,0x81002933,0x82002934,0x000C6725,0x000C6722,0x000C671F,0x000C671C, +0x86002893,0x870028E9,0x000C6719,0x000C6716,0x000C6713,0xA8002938,0xA9002939,0xAA00293A,0xAB002953,0xAC002954, +0xAD002955,0xAE002956,0xAF002957,0xB0002958,0xB1002959,0xB200295A,0xB300295B,0xB400295C,0xB500295D,0xB600295E, +0xB700295F,0xB8002960,0xB9002961,0xBA002962,0xBB002963,0xBC002964,0xBD002966,0xBE002967,0xBF002968,0x000C6710, +0x000C670D,0x000C670A,0x000C6707,0x000C6704,0x000C6701,0x000C66FE,0x000C66FB,0x000C66F8,0x000C66F5,0x000C66F2, +0x000C66EF,0x000C66EC,0x000C66E9,0x000C66E6,0x000C66E3,0x000C66E0,0x000C66DD,0xE100280D,0x000C66DA,0x000C66D7, +0x000C66D4,0x8000296C,0x8100296D,0x8200296E,0x000C66D1,0x000C66CE,0x000C66CB,0x000C66C8,0x860028D5,0x8700292B, +0x000C66C5,0x000C66C2,0x000C66BF,0x000C66BC,0x000C66B9,0x000C66B6,0x000C66B3,0x000C66B0,0x000C66AD,0x000C66AA, +0x000C66A7,0xA8002972,0xA9002973,0xAA002974,0xAB002975,0xAC002976,0xAD002977,0xAE002978,0xAF002979,0xB000297A, +0xB100297B,0xB200297C,0xB3002995,0xB4002996,0xB5002997,0xB6002998,0xB7002999,0xB800299A,0xB900299B,0xBA00299C, +0xBB00299D,0xBC00299E,0xBD0029A0,0xBE0029A1,0xBF0029A2,0x000C66A4,0x000C66A1,0x000C669E,0x000C669B,0x000C6698, +0x000C6695,0x000C6692,0x000C668F,0x000C668C,0x000C6689,0xE100284F,0x000C6686,0x000C6683,0x000C6680,0x000C667D, +0x000C667A,0x000C6677,0x000C6674,0x000C6671,0x000C666E,0x000C666B,0x000C6668,0x800029A3,0x810029A4,0x820029A5, +0x000C6665,0x000C6662,0x000C665F,0x000C665C,0x000C6659,0x000C6656,0x000C6653,0x8600290F,0x87002965,0xA80029A7, +0xA90029A8,0xAA0029A9,0xAB0029AA,0xAC0029AE,0xAD0029AF,0xAE0029B0,0xAF0029B1,0xB00029B2,0xB10029B3,0xB20029B4, +0xB30029CF,0xB40029D0,0xB50029D1,0xB60029D2,0xB70029D3,0xB80029D4,0xB90029D5,0xBA0029D6,0xBB0029D7,0xBC0029D8, +0xBD0029D9,0xBE0029DA,0xBF0029DB,0x000C6650,0x000C664D,0x000C664A,0x000C6647,0x000C6644,0x000C6641,0x000C663E, +0x000C663B,0x000C6638,0x000C6635,0x000C6632,0x000C662F,0x000C662C,0xE1002876,0x000C6629,0x000C6626,0x000C6623, +0x000C6620,0x000C661D,0x000C661A,0x000C6617,0x000C6614,0x800029DD,0x810029DE,0x820029DF,0x000C6611,0x000C660E, +0x000C660B,0x000C6608,0x000C6605,0x000C6602,0x000C65FF,0x86002949,0x8700299F,0xA80029E1,0xA90029E2,0xAA0029E3, +0xAB0029E4,0xAC0029E8,0xAD0029E9,0xAE0029EA,0xAF0029EB,0xB00029EC,0xB10029ED,0xB20029EE,0xB3002A09,0xB4002A0A, +0xB5002A0B,0xB6002A0C,0xB7002A0D,0xB8002A0E,0xB9002A0F,0xBA002A10,0xBB002A11,0xBC002A12,0xBD002A13,0xBE002A14, +0xBF002A15,0x000C65FC,0x000C65F9,0x000C65F6,0x000C65F3,0x000C65F0,0x000C65ED,0x000C65EA,0x000C65E7,0x000C65E4, +0x000C65E1,0x000C65DE,0x000C65DB,0x000C65D8,0xE10028B0,0x000C65D5,0x000C65D2,0x000C65CF,0x000C65CC,0x000C65C9, +0x000C65C6,0x000C65C3,0x000C65C0,0x80002A17,0x81002A18,0x82002A19,0x000C65BD,0x000C65BA,0x000C65B7,0x000C65B4, +0x000C65B1,0x000C65AE,0x000C65AB,0x000C65A8,0x000C65A5,0x000C65A2,0x000C659F,0x000C659C,0x000C6599,0x000C6596, +0x000C6593,0x8600298B,0x870029DC,0xA8002A1B,0xA9002A1C,0xAA002A1D,0xAB002A1E,0xAC002A22,0xAD002A23,0xAE002A24, +0xAF002A25,0xB0002A26,0xB1002A27,0xB2002A28,0xB3002A29,0xB4002A2A,0xB5002A2B,0xB6002A2C,0xB7002A2D,0xB8002A2E, +0xB9002A2F,0xBA002A30,0xBB002A4B,0xBC002A4C,0xBD002A4D,0xBE002A4E,0xBF002A4F,0x000C6590,0x000C658D,0x000C658A, +0x000C6587,0x000C6584,0xE10028EA,0x000C6581,0x000C657E,0x000C657B,0x000C6578,0x000C6575,0x000C6572,0x000C656F, +0x000C656C,0x000C6569,0x000C6566,0x000C6563,0x80002A51,0x81002A52,0x82002A53,0x000C6560,0x000C655D,0x000C655A, +0x000C6557,0x000C6554,0x000C6551,0x000C654E,0x000C654B,0x000C6548,0x000C6545,0x000C6542,0x000C653F,0x860029C5, +0x87002A16,0xA8002A55,0xA9002A56,0xAA002A57,0xAB002A58,0xAC002A59,0xAD002A5A,0xAE002A5B,0xAF002A5F,0xB0002A60, +0xB1002A61,0xB2002A62,0xB3002A63,0xB4002A64,0xB5002A65,0xB6002A66,0xB7002A67,0xB8002A68,0xB9002A69,0xBA002A6A, +0xBB002A85,0xBC002A86,0xBD002A88,0xBE002A89,0xBF002A8A,0x000C653C,0x000C6539,0xE100292F,0x000C6536,0x000C6533, +0x000C6530,0x000C652D,0x000C652A,0x000C6527,0x000C6524,0x000C6521,0x000C651E,0x000C651B,0x000C6518,0x000C6515, +0x000C6512,0x000C650F,0x80002A8B,0x81002A8C,0x82002A8D,0x000C650C,0x000C6509,0x000C6506,0x000C6503,0x000C6500, +0x000C64FD,0x000C64FA,0x000C64F7,0x000C64F4,0x000C64F1,0x000C64EE,0x000C64EB,0x860029FF,0x87002A45,0xA8002A8F, +0xA9002A90,0xAA002A91,0xAB002A92,0xAC002A93,0xAD002A94,0xAE002A95,0xAF002A99,0xB0002A9A,0xB1002A9B,0xB2002A9C, +0xB3002A9D,0xB4002A9E,0xB5002A9F,0xB6002AA0,0xB7002AA1,0xB8002AA2,0xB9002AA3,0xBA002AA4,0xBB002ABF,0xBC002AC0, +0xBD002AC2,0xBE002AC3,0xBF002AC4,0x000C64E8,0x000C64E5,0xE1002969,0x000C64E2,0x000C64DF,0x000C64DC,0x80002AC8, +0x81002AC9,0x82002ACA,0x000C64D9,0x000C64D6,0x000C64D3,0x000C64D0,0x86002A31,0x87002A7F,0x000C64CD,0x000C64CA, +0x000C64C7,0x000C64C4,0x000C64C1,0x000C64BE,0x000C64BB,0x000C64B8,0x000C64B5,0x000C64B2,0x000C64AF,0xA8002ACE, +0xA9002ACF,0xAA002AD0,0xAB002AD1,0xAC002AD2,0xAD002AD3,0xAE002AD4,0xAF002AD5,0xB0002AD6,0xB1002AD7,0xB2002AD8, +0xB3002AF1,0xB4002AF2,0xB5002AF3,0xB6002AF4,0xB7002AF5,0xB8002AF6,0xB9002AF7,0xBA002AF8,0xBB002AF9,0xBC002AFA, +0xBD002AFC,0xBE002AFD,0xBF002AFE,0x000C64AC,0x000C64A9,0x000C64A6,0x000C64A3,0x000C64A0,0x000C649D,0x000C649A, +0x000C6497,0x000C6494,0x000C6491,0xE10029AB,0x000C648E,0x000C648B,0x000C6488,0x80002B02,0x81002B03,0x82002B04, +0x000C6485,0x000C6482,0x000C647F,0x000C647C,0x86002A6B,0x87002AB9,0x000C6479,0x000C6476,0x000C6473,0x000C6470, +0x000C646D,0x000C646A,0x000C6467,0x000C6464,0x000C6461,0x000C645E,0x000C645B,0xA8002B08,0xA9002B09,0xAA002B0A, +0xAB002B0B,0xAC002B0C,0xAD002B0D,0xAE002B0E,0xAF002B0F,0xB0002B10,0xB1002B11,0xB2002B12,0xB3002B2B,0xB4002B2C, +0xB5002B2D,0xB6002B2E,0xB7002B2F,0xB8002B30,0xB9002B31,0xBA002B32,0xBB002B33,0xBC002B34,0xBD002B36,0xBE002B37, +0xBF002B38,0x000C6458,0x000C6455,0x000C6452,0x000C644F,0x000C644C,0x000C6449,0x000C6446,0x000C6443,0x000C6440, +0x000C643D,0xE10029E5,0x000C643A,0x000C6437,0x000C6434,0x80002B3C,0x81002B3D,0x82002B3E,0x000C6431,0x000C642E, +0x000C642B,0xE1002ABB,0x85002AA5,0x000C6428,0x86002ACC,0x87002B13,0x000C6425,0x000C6422,0xA1002B41,0xA2002B8D, +0xA3002BCA,0xA4002C04,0xA5002C3E,0xA6002C78,0xA7002CB2,0xA8002CE9,0xA9002D26,0xAA002D60,0xAB002D97,0xAC002DD1, +0xAD002E0E,0xAE002E45,0xAF002E7F,0xB0002EB9,0xB1002EF6,0xB2002F2D,0xB3002F4E,0xB4002FA1,0xB5002FDE,0x000C641F, +0x000C641C,0x000C6419,0x000C6416,0x000C6413,0x000C6410,0x000C640D,0x000C640A,0x000C6407,0x000C6404,0x000C6401, +0x000C63FE,0x000C63FB,0x000C63F8,0x000C63F5,0x000C63F2,0x000C63EF,0x000C63EC,0x000C63E9,0x000C63E6,0xE1002A1F, +0x000C63E3,0x000C63E0,0x000C63DD,0x000C63DA,0xA8002B44,0xA9002B45,0xAA002B5B,0xAB002B5C,0xAC002B5D,0xAD002B5E, +0xAE002B5F,0xAF002B60,0xB0002B61,0xB1002B62,0xB2002B63,0xB3002B64,0xB4002B65,0xB5002B66,0xB6002B67,0xB7002B68, +0xB8002B69,0xB9002B6A,0xBA002B6B,0xBB002B6C,0xBC002B6D,0xBD002B6E,0xBE002B70,0xBF002B71,0x000C63D7,0x000C63D4, +0x000C63D1,0x000C63CE,0x000C63CB,0x000C63C8,0x000C63C5,0x80002B72,0x81002B73,0x82002B8C,0x000C63C2,0x000C63BF, +0x000C63BC,0x000C63B9,0x86002B06,0x87002B46,0x000C63B6,0x000C63B3,0x000C63B0,0x000C63AD,0x000C63AA,0x000C63A7, +0x000C63A4,0x000C63A1,0x000C639E,0x000C639B,0x000C6398,0x000C6395,0x000C6392,0x000C638F,0x000C638C,0x000C6389, +0xE1002A46,0x000C6386,0xA8002B8E,0xA9002B8F,0xAA002B90,0xAB002B91,0xAC002B92,0xAD002B96,0xAE002B97,0xAF002B98, +0xB0002B99,0xB1002B9C,0xB2002B9D,0xB3002B9E,0xB4002B9F,0xB5002BA0,0xB6002BA1,0xB7002BA2,0xB8002BA3,0xB9002BA4, +0xBA002BA5,0xBB002BA6,0xBC002BA7,0xBD002BA8,0xBE002BA9,0xBF002BAA,0x80002BAB,0x81002BAD,0x82002BC9,0x000C6383, +0x000C6380,0x000C637D,0x000C637A,0x86002B3F,0x87002B7F,0x000C6377,0x000C6374,0x000C6371,0x000C636E,0x000C636B, +0x000C6368,0x000C6365,0x000C6362,0x000C635F,0x000C635C,0x000C6359,0x000C6356,0x000C6353,0x000C6350,0x000C634D, +0x000C634A,0x000C6347,0x000C6344,0x000C6341,0x000C633E,0x000C633B,0x000C6338,0x000C6335,0xE1002A80,0xA8002BCB, +0xA9002BCC,0xAA002BCF,0xAB002BD0,0xAC002BD1,0xAD002BD2,0xAE002BD3,0xAF002BD4,0xB0002BD5,0xB1002BD6,0xB2002BD7, +0xB3002BD8,0xB4002BD9,0xB5002BDA,0xB6002BDB,0xB7002BDC,0xB8002BDD,0xB9002BDE,0xBA002BDF,0xBB002BE0,0xBC002BE1, +0xBD002BE2,0xBE002BE3,0xBF002BE4,0x80002BE5,0x81002C02,0x82002C03,0x000C6332,0x000C632F,0x000C632C,0x000C6329, +0x86002B7B,0x87002BBB,0x000C6326,0x000C6323,0x000C6320,0x000C631D,0x000C631A,0x000C6317,0x000C6314,0x000C6311, +0x000C630E,0x000C630B,0x000C6308,0x000C6305,0x000C6302,0x000C62FF,0x000C62FC,0x000C62F9,0x000C62F6,0x000C62F3, +0x000C62F0,0x000C62ED,0x000C62EA,0x000C62E7,0x000C62E4,0x000C62E1,0x000C62DE,0x000C62DB,0xE1002ABC,0xA8002C05, +0xA9002C08,0xAA002C09,0xAB002C0A,0xAC002C0B,0xAD002C0C,0xAE002C0D,0xAF002C0E,0xB0002C0F,0xB1002C10,0xB2002C11, +0xB3002C12,0xB4002C13,0xB5002C14,0xB6002C15,0xB7002C16,0xB8002C17,0xB9002C18,0xBA002C19,0xBB002C1A,0xBC002C1B, +0xBD002C1C,0xBE002C1D,0xBF002C1E,0x80002C1F,0x81002C20,0x82002C21,0x000C62D8,0x86002B9A,0x87002BF2,0x000C62D5, +0xA8002C41,0xA9002C5A,0xAA002C5B,0xAB002C5C,0xAC002C5D,0xAD002C5E,0xAE002C5F,0xAF002C60,0xB0002C61,0xB1002C62, +0xB2002C63,0xB3002C64,0xB4002C65,0xB5002C66,0xB6002C67,0xB7002C68,0xB8002C69,0xB9002C6A,0xBA002C6B,0xBB002C6C, +0xBC002C6D,0xBD002C6F,0xBE002C70,0xBF002C71,0x000C62D2,0x000C62CF,0x000C62CC,0x000C62C9,0x000C62C6,0x000C62C3, +0x000C62C0,0x000C62BD,0x000C62BA,0x000C62B7,0x000C62B4,0x000C62B1,0x000C62AE,0x000C62AB,0x000C62A8,0x000C62A5, +0x000C62A2,0x000C629F,0x000C629C,0x000C6299,0xE1002B14,0x000C6296,0x000C6293,0x000C6290,0x80002C75,0x81002C76, +0x82002C77,0x000C628D,0x000C628A,0x000C6287,0x000C6284,0x86002BE6,0x87002C2C,0x000C6281,0x000C627E,0x000C627B, +0x000C6278,0x000C6275,0x000C6272,0x000C626F,0x000C626C,0x000C6269,0x000C6266,0x000C6263,0x000C6260,0x000C625D, +0x000C625A,0x000C6257,0x000C6254,0x000C6251,0x000C624E,0x000C624B,0xA8002C7B,0xA9002C7C,0xAA002C7D,0xAB002C7E, +0xAC002C7F,0xAD002C80,0xAE002C81,0xAF002C82,0xB0002C83,0xB1002C84,0xB2002C85,0xB3002C86,0xB4002C87,0xB5002C88, +0xB6002C89,0xB7002C8A,0xB8002C8B,0xB9002C8C,0xBA002C8D,0xBB002CA6,0xBC002CA7,0xBD002CA8,0xBE002CA9,0xBF002CAA, +0x000C6248,0x000C6245,0x000C6242,0x000C623F,0x000C623C,0xE1002B47,0x80002CAF,0x81002CB0,0x82002CB1,0x000C6239, +0x000C6236,0x000C6233,0x000C6230,0x86002C22,0x87002C6E,0x000C622D,0x000C622A,0x000C6227,0x000C6224,0x000C6221, +0x000C621E,0x000C621B,0x000C6218,0x000C6215,0x000C6212,0x000C620F,0x000C620C,0x000C6209,0x000C6206,0x000C6203, +0x000C6200,0x000C61FD,0x000C61FA,0x000C61F7,0x000C61F4,0x000C61F1,0xA8002CB5,0xA9002CB6,0xAA002CB7,0xAB002CB8, +0xAC002CB9,0xAD002CBA,0xAE002CBB,0xAF002CBC,0xB0002CBD,0xB1002CBE,0xB2002CBF,0xB3002CC0,0xB4002CC1,0xB5002CC2, +0xB6002CC3,0xB7002CC4,0xB8002CC5,0xB9002CC6,0xBA002CC7,0xBB002CC8,0xBC002CC9,0xBD002CE2,0xBE002CE3,0xBF002CE4, +0x000C61EE,0x000C61EB,0x000C61E8,0xE1002B80,0x000C61E5,0x000C61E2,0x000C61DF,0x000C61DC,0x000C61D9,0x000C61D6, +0x000C61D3,0x000C61D0,0x80002CE6,0x81002CE7,0x82002CE8,0x000C61CD,0x000C61CA,0x000C61C7,0x000C61C4,0x000C61C1, +0x000C61BE,0x000C61BB,0x86002C52,0x87002CA0,0xA8002CEA,0xA9002CEB,0xAA002CEC,0xAB002CED,0xAC002CF1,0xAD002CF2, +0xAE002CF3,0xAF002CF4,0xB0002CF5,0xB1002CF6,0xB2002CF7,0xB3002D12,0xB4002D13,0xB5002D14,0xB6002D15,0xB7002D16, +0xB8002D17,0xB9002D18,0xBA002D19,0xBB002D1A,0xBC002D1B,0xBD002D1C,0xBE002D1D,0xBF002D1E,0x000C61B8,0x000C61B5, +0x000C61B2,0x000C61AF,0x000C61AC,0x000C61A9,0x000C61A6,0x000C61A3,0x000C61A0,0x000C619D,0x000C619A,0x000C6197, +0x000C6194,0xE1002BB9,0x80002D23,0x81002D24,0x82002D25,0x000C6191,0x000C618E,0x000C618B,0x000C6188,0x86002C8E, +0x87002CDA,0x000C6185,0x000C6182,0x000C617F,0x000C617C,0x000C6179,0x000C6176,0x000C6173,0x000C6170,0x000C616D, +0x000C616A,0x000C6167,0x000C6164,0x000C6161,0xA8002D29,0xA9002D2A,0xAA002D2B,0xAB002D2C,0xAC002D2D,0xAD002D2E, +0xAE002D2F,0xAF002D30,0xB0002D31,0xB1002D32,0xB2002D33,0xB3002D34,0xB4002D35,0xB5002D4E,0xB6002D4F,0xB7002D50, +0xB8002D51,0xB9002D52,0xBA002D53,0xBB002D54,0xBC002D55,0xBD002D56,0xBE002D57,0xBF002D58,0x000C615E,0x000C615B, +0x000C6158,0x000C6155,0x000C6152,0x000C614F,0x000C614C,0x000C6149,0x000C6146,0x000C6143,0x000C6140,0xE1002BF3, +0x80002D5D,0x81002D5E,0x82002D5F,0x000C613D,0x000C613A,0x000C6137,0x000C6134,0x86002CCA,0x87002D1F,0x000C6131, +0x000C612E,0x000C612B,0x000C6128,0x000C6125,0x000C6122,0x000C611F,0x000C611C,0x000C6119,0x000C6116,0x000C6113, +0x000C6110,0x000C610D,0x000C610A,0x000C6107,0xA8002D63,0xA9002D64,0xAA002D65,0xAB002D66,0xAC002D67,0xAD002D68, +0xAE002D69,0xAF002D6A,0xB0002D6B,0xB1002D6C,0xB2002D6D,0xB3002D6E,0xB4002D6F,0xB5002D70,0xB6002D71,0xB7002D8A, +0xB8002D8B,0xB9002D8C,0xBA002D8D,0xBB002D8E,0xBC002D8F,0xBD002D90,0xBE002D91,0xBF002D92,0x000C6104,0x000C6101, +0x000C60FE,0x000C60FB,0x000C60F8,0x000C60F5,0x000C60F2,0x000C60EF,0x000C60EC,0xE1002C2D,0x000C60E9,0x000C60E6, +0x000C60E3,0x000C60E0,0x000C60DD,0x000C60DA,0x000C60D7,0x000C60D4,0x000C60D1,0x000C60CE,0x000C60CB,0x80002D94, +0x81002D95,0x82002D96,0x000C60C8,0x000C60C5,0x000C60C2,0x000C60BF,0x86002D00,0x87002D59,0xA8002D98,0xA9002D99, +0xAA002D9A,0xAB002D9B,0xAC002D9C,0xAD002D9D,0xAE002D9E,0xAF002DA2,0xB0002DA3,0xB1002DA4,0xB2002DA5,0xB3002DC0, +0xB4002DC1,0xB5002DC2,0xB6002DC3,0xB7002DC4,0xB8002DC5,0xB9002DC6,0xBA002DC7,0xBB002DC8,0xBC002DC9,0xBD002DCB, +0xBE002DCC,0xBF002DCD,0x000C60BC,0x000C60B9,0x000C60B6,0x000C60B3,0x000C60B0,0x000C60AD,0x000C60AA,0x000C60A7, +0x000C60A4,0x000C60A1,0xE1002C72,0x000C609E,0x000C609B,0x000C6098,0x000C6095,0x000C6092,0x000C608F,0x000C608C, +0x86002D36,0x87002D88,0x000C6089,0x000C6086,0x000C6083,0x000C6080,0x000C607D,0x80002DCE,0x81002DCF,0x82002DD0, +0x000C607A,0x000C6077,0xA8002DD4,0xA9002DD5,0xAA002DD6,0xAB002DD7,0xAC002DD8,0xAD002DDC,0xAE002DDD,0xAF002DF6, +0xB0002DF7,0xB1002DF8,0xB2002DF9,0xB3002DFA,0xB4002DFB,0xB5002DFC,0xB6002DFD,0xB7002DFE,0xB8002DFF,0xB9002E00, +0xBA002E01,0xBB002E02,0xBC002E03,0xBD002E04,0xBE002E05,0xBF002E06,0x000C6074,0x000C6071,0x000C606E,0x000C606B, +0x000C6068,0x000C6065,0x000C6062,0x000C605F,0x000C605C,0x000C6059,0x000C6056,0x000C6053,0x000C6050,0x000C604D, +0x000C604A,0x000C6047,0x000C6044,0xE1002CA1,0x80002E0B,0x81002E0C,0x82002E0D,0x000C6041,0x000C603E,0x000C603B, +0x000C6038,0x86002D72,0x87002DCA,0x000C6035,0x000C6032,0x000C602F,0x000C602C,0x000C6029,0x000C6026,0x000C6023, +0x000C6020,0x000C601D,0xA8002E11,0xA9002E12,0xAA002E13,0xAB002E14,0xAC002E15,0xAD002E16,0xAE002E17,0xAF002E18, +0xB0002E19,0xB1002E32,0xB2002E33,0xB3002E34,0xB4002E35,0xB5002E36,0xB6002E37,0xB7002E38,0xB8002E39,0xB9002E3A, +0xBA002E3B,0xBB002E3C,0xBC002E3D,0xBD002E3E,0xBE002E3F,0xBF002E40,0x000C601A,0x000C6017,0x000C6014,0x000C6011, +0x000C600E,0x000C600B,0x000C6008,0x000C6005,0x000C6002,0x000C5FFF,0x000C5FFC,0x000C5FF9,0x000C5FF6,0x000C5FF3, +0x000C5FF0,0xE1002CDB,0x000C5FED,0x000C5FEA,0x000C5FE7,0x000C5FE4,0x000C5FE1,0x000C5FDE,0x000C5FDB,0x000C5FD8, +0x80002E42,0x81002E43,0x82002E44,0x000C5FD5,0x000C5FD2,0x000C5FCF,0x000C5FCC,0x000C5FC9,0x000C5FC6,0x000C5FC3, +0x000C5FC0,0x000C5FBD,0x000C5FBA,0x000C5FB7,0x86002DB2,0x87002E07,0xA8002E46,0xA9002E47,0xAA002E48,0xAB002E49, +0xAC002E4D,0xAD002E4E,0xAE002E4F,0xAF002E50,0xB0002E51,0xB1002E52,0xB2002E53,0xB3002E54,0xB4002E55,0xB5002E56, +0xB6002E57,0xB7002E72,0xB8002E73,0xB9002E74,0xBA002E75,0xBB002E76,0xBC002E77,0xBD002E79,0xBE002E7A,0xBF002E7B, +0x000C5FB4,0x000C5FB1,0x000C5FAE,0x000C5FAB,0x000C5FA8,0x000C5FA5,0xE1002D20,0x000C5FA2,0x000C5F9F,0x000C5F9C, +0x000C5F99,0x000C5F96,0x000C5F93,0x000C5F90,0x000C5F8D,0x000C5F8A,0x000C5F87,0x000C5F84,0x000C5F81,0x000C5F7E, +0x000C5F7B,0x80002E7C,0x81002E7D,0x82002E7E,0x000C5F78,0x000C5F75,0x000C5F72,0x000C5F6F,0x86002DE8,0x87002E41, +0xA8002E80,0xA9002E81,0xAA002E82,0xAB002E83,0xAC002E84,0xAD002E85,0xAE002E86,0xAF002E8A,0xB0002E8B,0xB1002E8C, +0xB2002E8D,0xB3002EA8,0xB4002EA9,0xB5002EAA,0xB6002EAB,0xB7002EAC,0xB8002EAD,0xB9002EAE,0xBA002EAF,0xBB002EB0, +0xBC002EB1,0xBD002EB3,0xBE002EB4,0xBF002EB5,0x000C5F6C,0x000C5F69,0x000C5F66,0x000C5F63,0x000C5F60,0x000C5F5D, +0x000C5F5A,0x000C5F57,0x000C5F54,0x000C5F51,0xE1002D4C,0x000C5F4E,0x000C5F4B,0x000C5F48,0x000C5F45,0x000C5F42, +0x000C5F3F,0x000C5F3C,0x000C5F39,0x000C5F36,0x000C5F33,0x000C5F30,0x000C5F2D,0x000C5F2A,0x000C5F27,0x80002EB6, +0x81002EB7,0x82002EB8,0x000C5F24,0x000C5F21,0x000C5F1E,0x000C5F1B,0x000C5F18,0x000C5F15,0x000C5F12,0x000C5F0F, +0x000C5F0C,0x000C5F09,0x000C5F06,0x000C5F03,0x86002E2A,0x87002E70,0xA8002EBA,0xA9002EBB,0xAA002EBC,0xAB002EBD, +0xAC002EBE,0xAD002EBF,0xAE002EC0,0xAF002EC4,0xB0002EC5,0xB1002EC6,0xB2002EC7,0xB3002EC8,0xB4002EC9,0xB5002ECA, +0xB6002ECB,0xB7002ECC,0xB8002ECD,0xB9002ECE,0xBA002ECF,0xBB002EEA,0xBC002EEB,0xBD002EEC,0xBE002EED,0xBF002EEE, +0x000C5F00,0x000C5EFD,0x000C5EFA,0x000C5EF7,0x000C5EF4,0xE1002D89,0x80002EF3,0x81002EF4,0x82002EF5,0x000C5EF1, +0x000C5EEE,0x000C5EEB,0x000C5EE8,0x86002E58,0x87002EB2,0x000C5EE5,0x000C5EE2,0x000C5EDF,0x000C5EDC,0x000C5ED9, +0x000C5ED6,0x000C5ED3,0xA8002EF9,0xA9002EFA,0xAA002EFB,0xAB002EFC,0xAC002EFD,0xAD002EFE,0xAE002EFF,0xAF002F18, +0xB0002F19,0xB1002F1A,0xB2002F1B,0xB3002F1C,0xB4002F1D,0xB5002F1E,0xB6002F1F,0xB7002F20,0xB8002F21,0xB9002F22, +0xBA002F23,0xBB002F24,0xBC002F25,0xBD002F27,0xBE002F28,0xBF002F29,0x000C5ED0,0x000C5ECD,0x000C5ECA,0x000C5EC7, +0x000C5EC4,0x000C5EC1,0x000C5EBE,0x000C5EBB,0x000C5EB8,0x000C5EB5,0x000C5EB2,0x000C5EAF,0x000C5EAC,0x000C5EA9, +0xE1002DD2,0x000C5EA6,0x000C5EA3,0x000C5EA0,0x000C5E9D,0x000C5E9A,0x000C5E97,0x000C5E94,0x000C5E91,0x000C5E8E, +0x000C5E8B,0x000C5E88,0x80002F2A,0x81002F2B,0x82002F2C,0x000C5E85,0x000C5E82,0x000C5E7F,0x000C5E7C,0x000C5E79, +0x000C5E76,0x000C5E73,0x000C5E70,0x000C5E6D,0x000C5E6A,0x000C5E67,0x000C5E64,0x000C5E61,0x000C5E5E,0x000C5E5B, +0x000C5E58,0x000C5E55,0x000C5E52,0x86002EC2,0x87002ED0,0x000C5E4F,0x000C5E4C,0x000C5E49,0x000C5E46,0x000C5E43, +0x000C5E40,0x000C5E3D,0x80002F4B,0x81002F4C,0x82002F4D,0x000C5E3A,0x000C5E37,0x000C5E34,0x000C5E31,0x86002EDA, +0x87002F26,0x000C5E2E,0x000C5E2B,0x000C5E28,0x000C5E25,0x000C5E22,0x000C5E1F,0x000C5E1C,0xE1002E08,0x000C5E19, +0x000C5E16,0x000C5E13,0x000C5E10,0x000C5E0D,0x000C5E0A,0x000C5E07,0x000C5E04,0x000C5E01,0xA8002F2E,0xA9002F2F, +0xAA002F30,0xAB002F31,0xAC002F35,0xAD002F36,0xAE002F37,0xAF002F38,0xB0002F39,0xB1002F3A,0xB2002F3B,0xB3002F3C, +0xB4002F3D,0xB5002F3E,0xB6002F3F,0xB7002F40,0xB8002F41,0xB9002F42,0xBA002F43,0xBB002F44,0xBC002F45,0xBD002F46, +0xBE002F49,0xBF002F4A,0xA8002F4F,0xA9002F53,0xAA002F54,0xAB002F55,0xAC002F56,0xAD002F59,0xAE002F5A,0xAF002F5B, +0xB0002F5C,0xB1002F5D,0xB2002F5E,0xB3002F5F,0xB4002F61,0xB5002F62,0xB6002F63,0xB7002F64,0xB8002F65,0xB9002F66, +0xBA002F67,0xBB002F68,0xBC002F69,0xBD002F9B,0xBE002F9C,0xBF002F9D,0xE1002E4A,0x000C5DFE,0x000C5DFB,0x000C5DF8, +0x000C5DF5,0x000C5DF2,0x000C5DEF,0x000C5DEC,0x000C5DE9,0x000C5DE6,0x000C5DE3,0x000C5DE0,0x80002F9E,0x81002F9F, +0x82002FA0,0x000C5DDD,0x000C5DDA,0x000C5DD7,0x000C5DD4,0x000C5DD1,0x000C5DCE,0x000C5DCB,0x000C5DC8,0x000C5DC5, +0x000C5DC2,0x000C5DBF,0x000C5DBC,0x000C5DB9,0x000C5DB6,0x000C5DB3,0x86002F12,0x87002F58,0xA8002FA2,0xA9002FA3, +0xAA002FA4,0xAB002FA5,0xAC002FA9,0xAD002FAA,0xAE002FAB,0xAF002FAC,0xB0002FAD,0xB1002FAE,0xB2002FAF,0xB3002FB0, +0xB4002FB1,0xB5002FB2,0xB6002FB3,0xB7002FB4,0xB8002FB5,0xB9002FB6,0xBA002FB7,0xBB002FD2,0xBC002FD3,0xBD002FD4, +0xBE002FD5,0xBF002FD6,0x000C5DB0,0x000C5DAD,0x000C5DAA,0x000C5DA7,0x000C5DA4,0xE1002E71,0x80002FDB,0x81002FDC, +0x82002FDD,0x000C5DA1,0x000C5D9E,0x000C5D9B,0x000C5D98,0x000C5D95,0x000C5D92,0x000C5D8F,0x000C5D8C,0x000C5D89, +0x000C5D86,0x000C5D83,0x86002F47,0x87002F92,0x000C5D80,0x000C5D7D,0x000C5D7A,0x000C5D77,0x000C5D74,0x000C5D71, +0x000C5D6E,0xA8002FDF,0xA9002FE0,0xAA002FE1,0xAB002FE2,0xAC002FE3,0xAD002FE4,0xAE002FE5,0xAF002FE8,0xB0002FE9, +0xB1002FEA,0xB2002FEB,0xB3002FEC,0xB4002FED,0xB5002FEE,0xB6003007,0xB7003008,0xB8003009,0xB900300A,0xBA00300B, +0xBB00300C,0xBC00300D,0xBD00300F,0xBE003010,0xBF003011,0x000C5D6B,0x000C5D68,0x000C5D65,0x000C5D62,0x000C5D5F, +0x000C5D5C,0x000C5D59,0xE1002EC1,0x000C5D56,0x000C5D53,0x000C5D50,0x80003015,0x81003016,0x82003017,0x000C5D4D, +0x000C5D4A,0x000C5D47,0x85002F8F,0x000C5D44,0x86002FA6,0x87002FCB,0x000C5D41,0x000C5D3E,0x000C5D3B,0x000C5D38, +0x000C5D35,0x000C5D32,0x000C5D2F,0x000C5D2C,0x000C5D29,0x000C5D26,0x000C5D23,0x000C5D20,0x000C5D1D,0xE1002F93, +0x000C5D1A,0x000C5D17,0x000C5D14,0x000C5D11,0x000C5D0E,0xE1002ED1,0xA1003019,0xA2003069,0xA300308B,0xA40030DD, +0xA5003117,0xA600314E,0xA7003173,0xA80031C5,0xA90031FC,0xAA003236,0xAB003270,0xAC0032AD,0xAD0032E7,0xAE003321, +0xAF003358,0xB0003392,0xB10033CC,0xB2003406,0xB3003440,0xB400347D,0xB50034B7,0x000C5D0B,0x000C5D08,0x000C5D05, +0x000C5D02,0x000C5CFF,0x000C5CFC,0x80003066,0x81003067,0x82003068,0xA800301C,0xA900301D,0xAA00301E,0xAB00301F, +0xAC003020,0xAD003021,0xAE003022,0xAF003023,0xB0003024,0xB1003025,0xB2003026,0xB3003027,0xB4003028,0xB500302A, +0xB600302B,0xB700302C,0xB800302D,0xB900302E,0xBA003045,0xBB003046,0xBC003047,0xBD003048,0xBE003049,0xBF00304A, +0x000C5CF9,0x000C5CF6,0x000C5CF3,0x000C5CF0,0x000C5CED,0x000C5CEA,0x86002FE7,0x87003005,0x000C5CE7,0x000C5CE4, +0x000C5CE1,0x000C5CDE,0x000C5CDB,0x000C5CD8,0x000C5CD5,0x000C5CD2,0x000C5CCF,0x000C5CCC,0x000C5CC9,0x000C5CC6, +0x000C5CC3,0x000C5CC0,0x000C5CBD,0x000C5CBA,0x000C5CB7,0x000C5CB4,0x000C5CB1,0x000C5CAE,0xE1002F32,0x000C5CAB, +0x000C5CA8,0x80003088,0x81003089,0x8200308A,0x000C5CA5,0x000C5CA2,0x000C5C9F,0x000C5C9C,0x86002FFF,0x87003057, +0x000C5C99,0xA800306A,0xA900306B,0xAA00306E,0xAB00306F,0xAC003070,0xAD003071,0xAE003072,0xAF003073,0xB0003074, +0xB1003075,0xB2003076,0xB3003077,0xB4003078,0xB5003079,0xB600307A,0xB700307B,0xB800307C,0xB900307D,0xBA00307E, +0xBB00307F,0xBC003080,0xBD003081,0xBE003083,0xBF003084,0xA800308E,0xA90030C0,0xAA0030C1,0xAB0030C2,0xAC0030C3, +0xAD0030C4,0xAE0030C5,0xAF0030C6,0xB00030C7,0xB10030C8,0xB20030C9,0xB30030CA,0xB40030CB,0xB50030CC,0xB60030CD, +0xB70030CE,0xB80030CF,0xB90030D0,0xBA0030D1,0xBB0030D2,0xBC0030D3,0xBD0030D4,0xBE0030D5,0xBF0030D6,0xE1002F60, +0x000C5C96,0x000C5C93,0x000C5C90,0x000C5C8D,0x000C5C8A,0x000C5C87,0x000C5C84,0x000C5C81,0x000C5C7E,0x000C5C7B, +0x000C5C78,0x000C5C75,0x000C5C72,0x000C5C6F,0x000C5C6C,0x000C5C69,0x000C5C66,0x000C5C63,0x000C5C60,0x000C5C5D, +0x000C5C5A,0x000C5C57,0x000C5C54,0x800030DA,0x810030DB,0x820030DC,0x000C5C51,0x000C5C4E,0x000C5C4B,0x000C5C48, +0x86003038,0x87003091,0xA80030F8,0xA90030F9,0xAA0030FB,0xAB0030FC,0xAC0030FD,0xAD0030FE,0xAE0030FF,0xAF003100, +0xB0003101,0xB1003102,0xB2003103,0xB3003104,0xB4003105,0xB5003106,0xB6003107,0xB7003108,0xB8003109,0xB900310A, +0xBA00310B,0xBB00310C,0xBC00310D,0xBD00310E,0xBE00310F,0xBF003110,0x000C5C45,0x000C5C42,0xE1002F94,0x000C5C3F, +0x000C5C3C,0x000C5C39,0x000C5C36,0x000C5C33,0x000C5C30,0x000C5C2D,0x000C5C2A,0x000C5C27,0x000C5C24,0x000C5C21, +0x000C5C1E,0x000C5C1B,0x000C5C18,0x000C5C15,0x000C5C12,0x000C5C0F,0x000C5C0C,0x000C5C09,0x000C5C06,0x000C5C03, +0x000C5C00,0x80003114,0x81003115,0x82003116,0x000C5BFD,0x000C5BFA,0x000C5BF7,0x000C5BF4,0x86003082,0x870030D7, +0x000C5BF1,0x000C5BEE,0x000C5BEB,0x000C5BE8,0x000C5BE5,0x000C5BE2,0x000C5BDF,0x000C5BDC,0x000C5BD9,0x000C5BD6, +0x000C5BD3,0x000C5BD0,0x000C5BCD,0x000C5BCA,0x000C5BC7,0x000C5BC4,0xA800311A,0xA900311B,0xAA00311C,0xAB00311D, +0xAC00311E,0xAD00311F,0xAE003120,0xAF003121,0xB0003122,0xB1003123,0xB2003124,0xB3003125,0xB4003126,0xB5003127, +0xB6003128,0xB7003129,0xB8003142,0xB9003143,0xBA003144,0xBB003145,0xBC003146,0xBD003147,0xBE003148,0xBF003149, +0x000C5BC1,0x000C5BBE,0x000C5BBB,0x000C5BB8,0x000C5BB5,0x000C5BB2,0x000C5BAF,0x000C5BAC,0xE1002FE6,0x000C5BA9, +0x000C5BA6,0x000C5BA3,0x000C5BA0,0x000C5B9D,0x000C5B9A,0x000C5B97,0x000C5B94,0x000C5B91,0x000C5B8E,0x000C5B8B, +0x000C5B88,0x8000314B,0x8100314C,0x8200314D,0x000C5B85,0x000C5B82,0x000C5B7F,0x000C5B7C,0x860030D9,0x870030ED, +0x000C5B79,0x000C5B76,0x000C5B73,0x000C5B70,0x000C5B6D,0x000C5B6A,0x000C5B67,0x000C5B64,0x000C5B61,0x000C5B5E, +0x000C5B5B,0x000C5B58,0xE1003006,0x80003170,0x81003171,0x82003172,0x000C5B55,0x000C5B52,0x000C5B4F,0x000C5B4C, +0x860030F1,0x8700313F,0x000C5B49,0x000C5B46,0x000C5B43,0x000C5B40,0x000C5B3D,0x000C5B3A,0x000C5B37,0x000C5B34, +0x000C5B31,0x000C5B2E,0x000C5B2B,0xA800314F,0xA9003150,0xAA003151,0xAB003152,0xAC003153,0xAD003154,0xAE003155, +0xAF003156,0xB000315A,0xB100315B,0xB200315C,0xB300315D,0xB4003160,0xB5003161,0xB6003162,0xB7003163,0xB8003164, +0xB9003165,0xBA003166,0xBB003167,0xBC003168,0xBD003169,0xBE00316A,0xBF00316B,0xA8003176,0xA9003177,0xAA003178, +0xAB003179,0xAC00317A,0xAD00317B,0xAE00317C,0xAF00317D,0xB000317E,0xB100317F,0xB2003180,0xB30031B1,0xB40031B2, +0xB50031B3,0xB60031B4,0xB70031B5,0xB80031B6,0xB90031B7,0xBA0031B8,0xBB0031B9,0xBC0031BA,0xBD0031BB,0xBE0031BC, +0xBF0031BD,0x000C5B28,0x000C5B25,0x000C5B22,0x000C5B1F,0x000C5B1C,0x000C5B19,0x000C5B16,0x000C5B13,0x000C5B10, +0x000C5B0D,0x000C5B0A,0x000C5B07,0x000C5B04,0xE1003058,0x800031C2,0x810031C3,0x820031C4,0x000C5B01,0x000C5AFE, +0x000C5AFB,0x000C5AF8,0x8600312A,0x87003181,0x000C5AF5,0x000C5AF2,0x000C5AEF,0x000C5AEC,0x000C5AE9,0x000C5AE6, +0x000C5AE3,0x000C5AE0,0x000C5ADD,0x000C5ADA,0xA80031C8,0xA90031C9,0xAA0031CA,0xAB0031CB,0xAC0031CC,0xAD0031CD, +0xAE0031CE,0xAF0031CF,0xB00031D0,0xB10031D1,0xB20031EA,0xB30031EB,0xB40031EC,0xB50031ED,0xB60031EE,0xB70031EF, +0xB80031F0,0xB90031F1,0xBA0031F2,0xBB0031F3,0xBC0031F4,0xBD0031F5,0xBE0031F6,0xBF0031F7,0x000C5AD7,0x000C5AD4, +0x000C5AD1,0x000C5ACE,0x000C5ACB,0x000C5AC8,0x000C5AC5,0x000C5AC2,0x000C5ABF,0x000C5ABC,0x000C5AB9,0x000C5AB6, +0x000C5AB3,0x000C5AB0,0xE1003092,0x000C5AAD,0x000C5AAA,0x000C5AA7,0x000C5AA4,0x000C5AA1,0x000C5A9E,0x000C5A9B, +0x000C5A98,0x800031F9,0x810031FA,0x820031FB,0x000C5A95,0x000C5A92,0x000C5A8F,0x000C5A8C,0x8600316C,0x870031BE, +0x000C5A89,0x000C5A86,0x000C5A83,0x000C5A80,0x000C5A7D,0x000C5A7A,0x000C5A77,0x000C5A74,0x000C5A71,0x000C5A6E, +0xA80031FD,0xA90031FE,0xAA0031FF,0xAB003200,0xAC003204,0xAD003205,0xAE003206,0xAF003207,0xB000320A,0xB100320B, +0xB200320C,0xB300320D,0xB400320E,0xB500320F,0xB6003210,0xB7003211,0xB8003212,0xB9003213,0xBA00322C,0xBB00322D, +0xBC00322E,0xBD003230,0xBE003231,0xBF003232,0x000C5A6B,0x000C5A68,0x000C5A65,0xE10030D8,0x000C5A62,0x000C5A5F, +0x000C5A5C,0x000C5A59,0x000C5A56,0x000C5A53,0x000C5A50,0x000C5A4D,0x000C5A4A,0x000C5A47,0x000C5A44,0x000C5A41, +0x000C5A3E,0x000C5A3B,0x80003233,0x81003234,0x82003235,0x000C5A38,0x000C5A35,0x000C5A32,0x000C5A2F,0x860031AD, +0x870031F8,0x000C5A2C,0x000C5A29,0x000C5A26,0x000C5A23,0x000C5A20,0x000C5A1D,0x000C5A1A,0x000C5A17,0x000C5A14, +0x000C5A11,0x000C5A0E,0x000C5A0B,0x000C5A08,0xE10030EE,0xA8003237,0xA9003238,0xAA003239,0xAB00323A,0xAC00323B, +0xAD00323C,0xAE00323D,0xAF003241,0xB0003242,0xB1003243,0xB2003244,0xB3003247,0xB4003248,0xB5003249,0xB600324A, +0xB700324B,0xB800324C,0xB900324D,0xBA00324E,0xBB00324F,0xBC003250,0xBD003251,0xBE003252,0xBF003253,0x000C5A05, +0x000C5A02,0x000C59FF,0x000C59FC,0x000C59F9,0x000C59F6,0x000C59F3,0x000C59F0,0x000C59ED,0x000C59EA,0x000C59E7, +0x8000326D,0x8100326E,0x8200326F,0x000C59E4,0x000C59E1,0x000C59DE,0x000C59DB,0x000C59D8,0x000C59D5,0x000C59D2, +0x000C59CF,0x000C59CC,0x000C59C9,0x000C59C6,0x000C59C3,0x860031E1,0x87003227,0xA8003271,0xA9003272,0xAA003273, +0xAB003274,0xAC003275,0xAD003276,0xAE003277,0xAF00327B,0xB000327C,0xB100327D,0xB200327E,0xB300327F,0xB4003280, +0xB5003281,0xB6003282,0xB7003283,0xB8003284,0xB9003285,0xBA003286,0xBB0032A1,0xBC0032A2,0xBD0032A3,0xBE0032A4, +0xBF0032A5,0x000C59C0,0x000C59BD,0x000C59BA,0x000C59B7,0x000C59B4,0xE1003140,0x800032AA,0x810032AB,0x820032AC, +0x000C59B1,0x000C59AE,0x000C59AB,0x000C59A8,0x86003208,0x87003261,0xA80032C8,0xA90032C9,0xAA0032CA,0xAB0032CB, +0xAC0032CC,0xAD0032CD,0xAE0032CE,0xAF0032CF,0xB00032D0,0xB10032D1,0xB20032D2,0xB30032D3,0xB40032D4,0xB50032D5, +0xB60032D6,0xB70032D7,0xB80032D8,0xB90032D9,0xBA0032DA,0xBB0032DB,0xBC0032DC,0xBD0032DE,0xBE0032DF,0xBF0032E0, +0x000C59A5,0x000C59A2,0x000C599F,0x000C599C,0x000C5999,0x000C5996,0x000C5993,0x000C5990,0x000C598D,0x000C598A, +0x000C5987,0x000C5984,0x000C5981,0x000C597E,0x000C597B,0x000C5978,0x000C5975,0x000C5972,0x000C596F,0x000C596C, +0x000C5969,0xE1003182,0x000C5966,0x000C5963,0x000C5960,0x800032E4,0x810032E5,0x820032E6,0x000C595D,0x000C595A, +0x000C5957,0x000C5954,0x86003245,0x8700329B,0x000C5951,0x000C594E,0x000C594B,0xA80032EA,0xA90032EB,0xAA0032EC, +0xAB003305,0xAC003306,0xAD003307,0xAE003308,0xAF003309,0xB000330A,0xB100330B,0xB200330C,0xB300330D,0xB400330E, +0xB500330F,0xB6003310,0xB7003311,0xB8003312,0xB9003313,0xBA003314,0xBB003315,0xBC003316,0xBD003318,0xBE003319, +0xBF00331A,0x000C5948,0x000C5945,0x000C5942,0x000C593F,0x000C593C,0x000C5939,0x000C5936,0x000C5933,0x000C5930, +0x000C592D,0x000C592A,0x000C5927,0x000C5924,0x000C5921,0x000C591E,0x000C591B,0x000C5918,0x000C5915,0xE10031BF, +0x000C5912,0x000C590F,0x000C590C,0x8000331E,0x8100331F,0x82003320,0x000C5909,0x000C5906,0x000C5903,0x000C5900, +0x86003287,0x870032DD,0x000C58FD,0x000C58FA,0x000C58F7,0x000C58F4,0x000C58F1,0x000C58EE,0x000C58EB,0x000C58E8, +0x000C58E5,0x000C58E2,0x000C58DF,0xA8003324,0xA9003325,0xAA003326,0xAB003327,0xAC003328,0xAD003329,0xAE00332A, +0xAF00332B,0xB000332C,0xB100332D,0xB200332E,0xB3003347,0xB4003348,0xB5003349,0xB600334A,0xB700334B,0xB800334C, +0xB900334D,0xBA00334E,0xBB00334F,0xBC003350,0xBD003352,0xBE003353,0xBF003354,0x000C58DC,0x000C58D9,0x000C58D6, +0x000C58D3,0x000C58D0,0x000C58CD,0x000C58CA,0x000C58C7,0x000C58C4,0x000C58C1,0xE1003201,0x000C58BE,0x000C58BB, +0x000C58B8,0x000C58B5,0x000C58B2,0x000C58AF,0x000C58AC,0x000C58A9,0x000C58A6,0x000C58A3,0x000C58A0,0x80003355, +0x81003356,0x82003357,0x000C589D,0x000C589A,0x000C5897,0x000C5894,0x000C5891,0x000C588E,0x000C588B,0x860032C1, +0x87003317,0xA8003359,0xA900335A,0xAA00335B,0xAB00335C,0xAC003360,0xAD003361,0xAE003362,0xAF003363,0xB0003364, +0xB1003365,0xB2003366,0xB3003381,0xB4003382,0xB5003383,0xB6003384,0xB7003385,0xB8003386,0xB9003387,0xBA003388, +0xBB003389,0xBC00338A,0xBD00338B,0xBE00338C,0xBF00338D,0x000C5888,0x000C5885,0x000C5882,0x000C587F,0x000C587C, +0x000C5879,0x000C5876,0x000C5873,0x000C5870,0x000C586D,0x000C586A,0x000C5867,0x000C5864,0xE1003228,0x000C5861, +0x000C585E,0x000C585B,0x000C5858,0x000C5855,0x000C5852,0x000C584F,0x000C584C,0x8000338F,0x81003390,0x82003391, +0x000C5849,0x000C5846,0x000C5843,0x000C5840,0x000C583D,0x000C583A,0x000C5837,0x860032FB,0x87003351,0xA8003393, +0xA9003394,0xAA003395,0xAB003396,0xAC00339A,0xAD00339B,0xAE00339C,0xAF00339D,0xB000339E,0xB100339F,0xB20033A0, +0xB30033BB,0xB40033BC,0xB50033BD,0xB60033BE,0xB70033BF,0xB80033C0,0xB90033C1,0xBA0033C2,0xBB0033C3,0xBC0033C4, +0xBD0033C5,0xBE0033C6,0xBF0033C7,0x000C5834,0x000C5831,0x000C582E,0x000C582B,0x000C5828,0x000C5825,0x000C5822, +0x000C581F,0x000C581C,0x000C5819,0x000C5816,0x000C5813,0x000C5810,0xE1003262,0x000C580D,0x000C580A,0x000C5807, +0x000C5804,0x000C5801,0x000C57FE,0x000C57FB,0x000C57F8,0x800033C9,0x810033CA,0x820033CB,0x000C57F5,0x000C57F2, +0x000C57EF,0x000C57EC,0x000C57E9,0x000C57E6,0x000C57E3,0x000C57E0,0x000C57DD,0x000C57DA,0x000C57D7,0x000C57D4, +0x000C57D1,0x000C57CE,0x000C57CB,0x8600333D,0x8700338E,0xA80033CD,0xA90033CE,0xAA0033CF,0xAB0033D0,0xAC0033D4, +0xAD0033D5,0xAE0033D6,0xAF0033D7,0xB00033D8,0xB10033D9,0xB20033DA,0xB30033DB,0xB40033DC,0xB50033DD,0xB60033DE, +0xB70033DF,0xB80033E0,0xB90033E1,0xBA0033E2,0xBB0033FD,0xBC0033FE,0xBD0033FF,0xBE003400,0xBF003401,0x000C57C8, +0x000C57C5,0x000C57C2,0x000C57BF,0x000C57BC,0xE100329C,0x000C57B9,0x000C57B6,0x000C57B3,0x000C57B0,0x000C57AD, +0x000C57AA,0x000C57A7,0x000C57A4,0x000C57A1,0x000C579E,0x000C579B,0x80003403,0x81003404,0x82003405,0x000C5798, +0x000C5795,0x000C5792,0x000C578F,0x000C578C,0x000C5789,0x000C5786,0x000C5783,0x000C5780,0x000C577D,0x000C577A, +0x000C5777,0x86003377,0x870033C8,0xA8003407,0xA9003408,0xAA003409,0xAB00340A,0xAC00340B,0xAD00340C,0xAE00340D, +0xAF003411,0xB0003412,0xB1003413,0xB2003414,0xB3003415,0xB4003416,0xB5003417,0xB6003418,0xB7003419,0xB800341A, +0xB900341B,0xBA00341C,0xBB003437,0xBC003438,0xBD00343A,0xBE00343B,0xBF00343C,0x000C5774,0x000C5771,0xE10032E1, +0x000C576E,0x000C576B,0x000C5768,0x000C5765,0x000C5762,0x000C575F,0x000C575C,0x000C5759,0x000C5756,0x000C5753, +0x000C5750,0x000C574D,0x000C574A,0x000C5747,0x8000343D,0x8100343E,0x8200343F,0x000C5744,0x000C5741,0x000C573E, +0x000C573B,0x000C5738,0x000C5735,0x000C5732,0x000C572F,0x000C572C,0x000C5729,0x000C5726,0x000C5723,0x860033B1, +0x870033F7,0xA8003441,0xA9003442,0xAA003443,0xAB003444,0xAC003445,0xAD003446,0xAE003447,0xAF00344B,0xB000344C, +0xB100344D,0xB200344E,0xB300344F,0xB4003450,0xB5003451,0xB6003452,0xB7003453,0xB8003454,0xB9003455,0xBA003456, +0xBB003471,0xBC003472,0xBD003474,0xBE003475,0xBF003476,0x000C5720,0x000C571D,0xE100331B,0x000C571A,0x000C5717, +0x000C5714,0x8000347A,0x8100347B,0x8200347C,0x000C5711,0x000C570E,0x000C570B,0x000C5708,0x860033E3,0x87003431, +0x000C5705,0x000C5702,0x000C56FF,0x000C56FC,0x000C56F9,0x000C56F6,0x000C56F3,0x000C56F0,0x000C56ED,0x000C56EA, +0x000C56E7,0xA8003480,0xA9003481,0xAA003482,0xAB003483,0xAC003484,0xAD003485,0xAE003486,0xAF003487,0xB0003488, +0xB1003489,0xB200348A,0xB30034A3,0xB40034A4,0xB50034A5,0xB60034A6,0xB70034A7,0xB80034A8,0xB90034A9,0xBA0034AA, +0xBB0034AB,0xBC0034AC,0xBD0034AE,0xBE0034AF,0xBF0034B0,0x000C56E4,0x000C56E1,0x000C56DE,0x000C56DB,0x000C56D8, +0x000C56D5,0x000C56D2,0x000C56CF,0x000C56CC,0x000C56C9,0xE100335D,0x000C56C6,0x000C56C3,0x000C56C0,0x800034B4, +0x810034B5,0x820034B6,0x000C56BD,0x000C56BA,0x000C56B7,0x000C56B4,0x8600341D,0x8700346B,0x000C56B1,0x000C56AE, +0x000C56AB,0x000C56A8,0x000C56A5,0x000C56A2,0x000C569F,0x000C569C,0x000C5699,0x000C5696,0x000C5693,0xA80034BA, +0xA90034BB,0xAA0034BC,0xAB0034BD,0xAC0034BE,0xAD0034BF,0xAE0034C0,0xAF0034C1,0xB00034C2,0xB10034C3,0xB20034C4, +0xB30034DD,0xB40034DE,0xB50034DF,0xB60034E0,0xB70034E1,0xB80034E2,0xB90034E3,0xBA0034E4,0xBB0034E5,0xBC0034E6, +0xBD0034E8,0xBE0034E9,0xBF0034EA,0x000C5690,0x000C568D,0x000C568A,0x000C5687,0x000C5684,0x000C5681,0x000C567E, +0x000C567B,0x000C5678,0x000C5675,0xE1003397,0x000C5672,0x000C566F,0x000C566C,0x800034EE,0x810034EF,0x820034F0, +0x000C5669,0x000C5666,0x000C5663,0xE100346D,0x85003457,0x000C5660,0x8600347E,0x870034C5,0x000C565D,0x000C565A, +0xA10034F3,0xA200353F,0xA300357C,0xA40035B6,0xA50035F0,0xA600362A,0xA7003664,0xA800369B,0xA90036D8,0xAA003712, +0xAB003749,0xAC003783,0xAD0037C0,0xAE0037F7,0xAF003831,0xB000386B,0xB10038A8,0xB20038DF,0xB3003900,0xB4003953, +0xB5003990,0x000C5657,0x000C5654,0x000C5651,0x000C564E,0x000C564B,0x000C5648,0x000C5645,0x000C5642,0x000C563F, +0x000C563C,0x000C5639,0x000C5636,0x000C5633,0x000C5630,0x000C562D,0x000C562A,0x000C5627,0x000C5624,0x000C5621, +0x000C561E,0xE10033D1,0x000C561B,0x000C5618,0x000C5615,0x000C5612,0xA80034F6,0xA90034F7,0xAA00350D,0xAB00350E, +0xAC00350F,0xAD003510,0xAE003511,0xAF003512,0xB0003513,0xB1003514,0xB2003515,0xB3003516,0xB4003517,0xB5003518, +0xB6003519,0xB700351A,0xB800351B,0xB900351C,0xBA00351D,0xBB00351E,0xBC00351F,0xBD003520,0xBE003522,0xBF003523, +0x000C560F,0x000C560C,0x000C5609,0x000C5606,0x000C5603,0x000C5600,0x000C55FD,0x80003524,0x81003525,0x8200353E, +0x000C55FA,0x000C55F7,0x000C55F4,0x000C55F1,0x860034B8,0x870034F8,0x000C55EE,0x000C55EB,0x000C55E8,0x000C55E5, +0x000C55E2,0x000C55DF,0x000C55DC,0x000C55D9,0x000C55D6,0x000C55D3,0x000C55D0,0x000C55CD,0x000C55CA,0x000C55C7, +0x000C55C4,0x000C55C1,0xE10033F8,0x000C55BE,0xA8003540,0xA9003541,0xAA003542,0xAB003543,0xAC003544,0xAD003548, +0xAE003549,0xAF00354A,0xB000354B,0xB100354E,0xB200354F,0xB3003550,0xB4003551,0xB5003552,0xB6003553,0xB7003554, +0xB8003555,0xB9003556,0xBA003557,0xBB003558,0xBC003559,0xBD00355A,0xBE00355B,0xBF00355C,0x8000355D,0x8100355F, +0x8200357B,0x000C55BB,0x000C55B8,0x000C55B5,0x000C55B2,0x860034F1,0x87003531,0x000C55AF,0x000C55AC,0x000C55A9, +0x000C55A6,0x000C55A3,0x000C55A0,0x000C559D,0x000C559A,0x000C5597,0x000C5594,0x000C5591,0x000C558E,0x000C558B, +0x000C5588,0x000C5585,0x000C5582,0x000C557F,0x000C557C,0x000C5579,0x000C5576,0x000C5573,0x000C5570,0x000C556D, +0xE1003432,0xA800357D,0xA900357E,0xAA003581,0xAB003582,0xAC003583,0xAD003584,0xAE003585,0xAF003586,0xB0003587, +0xB1003588,0xB2003589,0xB300358A,0xB400358B,0xB500358C,0xB600358D,0xB700358E,0xB800358F,0xB9003590,0xBA003591, +0xBB003592,0xBC003593,0xBD003594,0xBE003595,0xBF003596,0x80003597,0x810035B4,0x820035B5,0x000C556A,0x000C5567, +0x000C5564,0x000C5561,0x8600352D,0x8700356D,0x000C555E,0x000C555B,0x000C5558,0x000C5555,0x000C5552,0x000C554F, +0x000C554C,0x000C5549,0x000C5546,0x000C5543,0x000C5540,0x000C553D,0x000C553A,0x000C5537,0x000C5534,0x000C5531, +0x000C552E,0x000C552B,0x000C5528,0x000C5525,0x000C5522,0x000C551F,0x000C551C,0x000C5519,0x000C5516,0x000C5513, +0xE100346E,0xA80035B7,0xA90035BA,0xAA0035BB,0xAB0035BC,0xAC0035BD,0xAD0035BE,0xAE0035BF,0xAF0035C0,0xB00035C1, +0xB10035C2,0xB20035C3,0xB30035C4,0xB40035C5,0xB50035C6,0xB60035C7,0xB70035C8,0xB80035C9,0xB90035CA,0xBA0035CB, +0xBB0035CC,0xBC0035CD,0xBD0035CE,0xBE0035CF,0xBF0035D0,0x800035D1,0x810035D2,0x820035D3,0x000C5510,0x8600354C, +0x870035A4,0x000C550D,0xA80035F3,0xA900360C,0xAA00360D,0xAB00360E,0xAC00360F,0xAD003610,0xAE003611,0xAF003612, +0xB0003613,0xB1003614,0xB2003615,0xB3003616,0xB4003617,0xB5003618,0xB6003619,0xB700361A,0xB800361B,0xB900361C, +0xBA00361D,0xBB00361E,0xBC00361F,0xBD003621,0xBE003622,0xBF003623,0x000C550A,0x000C5507,0x000C5504,0x000C5501, +0x000C54FE,0x000C54FB,0x000C54F8,0x000C54F5,0x000C54F2,0x000C54EF,0x000C54EC,0x000C54E9,0x000C54E6,0x000C54E3, +0x000C54E0,0x000C54DD,0x000C54DA,0x000C54D7,0x000C54D4,0x000C54D1,0xE10034C6,0x000C54CE,0x000C54CB,0x000C54C8, +0x80003627,0x81003628,0x82003629,0x000C54C5,0x000C54C2,0x000C54BF,0x000C54BC,0x86003598,0x870035DE,0x000C54B9, +0x000C54B6,0x000C54B3,0x000C54B0,0x000C54AD,0x000C54AA,0x000C54A7,0x000C54A4,0x000C54A1,0x000C549E,0x000C549B, +0x000C5498,0x000C5495,0x000C5492,0x000C548F,0x000C548C,0x000C5489,0x000C5486,0x000C5483,0xA800362D,0xA900362E, +0xAA00362F,0xAB003630,0xAC003631,0xAD003632,0xAE003633,0xAF003634,0xB0003635,0xB1003636,0xB2003637,0xB3003638, +0xB4003639,0xB500363A,0xB600363B,0xB700363C,0xB800363D,0xB900363E,0xBA00363F,0xBB003658,0xBC003659,0xBD00365A, +0xBE00365B,0xBF00365C,0x000C5480,0x000C547D,0x000C547A,0x000C5477,0x000C5474,0xE10034F9,0x80003661,0x81003662, +0x82003663,0x000C5471,0x000C546E,0x000C546B,0x000C5468,0x860035D4,0x87003620,0x000C5465,0x000C5462,0x000C545F, +0x000C545C,0x000C5459,0x000C5456,0x000C5453,0x000C5450,0x000C544D,0x000C544A,0x000C5447,0x000C5444,0x000C5441, +0x000C543E,0x000C543B,0x000C5438,0x000C5435,0x000C5432,0x000C542F,0x000C542C,0x000C5429,0xA8003667,0xA9003668, +0xAA003669,0xAB00366A,0xAC00366B,0xAD00366C,0xAE00366D,0xAF00366E,0xB000366F,0xB1003670,0xB2003671,0xB3003672, +0xB4003673,0xB5003674,0xB6003675,0xB7003676,0xB8003677,0xB9003678,0xBA003679,0xBB00367A,0xBC00367B,0xBD003694, +0xBE003695,0xBF003696,0x000C5426,0x000C5423,0x000C5420,0xE1003532,0x000C541D,0x000C541A,0x000C5417,0x000C5414, +0x000C5411,0x000C540E,0x000C540B,0x000C5408,0x80003698,0x81003699,0x8200369A,0x000C5405,0x000C5402,0x000C53FF, +0x000C53FC,0x000C53F9,0x000C53F6,0x000C53F3,0x86003604,0x87003652,0xA800369C,0xA900369D,0xAA00369E,0xAB00369F, +0xAC0036A3,0xAD0036A4,0xAE0036A5,0xAF0036A6,0xB00036A7,0xB10036A8,0xB20036A9,0xB30036C4,0xB40036C5,0xB50036C6, +0xB60036C7,0xB70036C8,0xB80036C9,0xB90036CA,0xBA0036CB,0xBB0036CC,0xBC0036CD,0xBD0036CE,0xBE0036CF,0xBF0036D0, +0x000C53F0,0x000C53ED,0x000C53EA,0x000C53E7,0x000C53E4,0x000C53E1,0x000C53DE,0x000C53DB,0x000C53D8,0x000C53D5, +0x000C53D2,0x000C53CF,0x000C53CC,0xE100356B,0x800036D5,0x810036D6,0x820036D7,0x000C53C9,0x000C53C6,0x000C53C3, +0x000C53C0,0x86003640,0x8700368C,0x000C53BD,0x000C53BA,0x000C53B7,0x000C53B4,0x000C53B1,0x000C53AE,0x000C53AB, +0x000C53A8,0x000C53A5,0x000C53A2,0x000C539F,0x000C539C,0x000C5399,0xA80036DB,0xA90036DC,0xAA0036DD,0xAB0036DE, +0xAC0036DF,0xAD0036E0,0xAE0036E1,0xAF0036E2,0xB00036E3,0xB10036E4,0xB20036E5,0xB30036E6,0xB40036E7,0xB5003700, +0xB6003701,0xB7003702,0xB8003703,0xB9003704,0xBA003705,0xBB003706,0xBC003707,0xBD003708,0xBE003709,0xBF00370A, +0x000C5396,0x000C5393,0x000C5390,0x000C538D,0x000C538A,0x000C5387,0x000C5384,0x000C5381,0x000C537E,0x000C537B, +0x000C5378,0xE10035A5,0x8000370F,0x81003710,0x82003711,0x000C5375,0x000C5372,0x000C536F,0x000C536C,0x8600367C, +0x870036D1,0x000C5369,0x000C5366,0x000C5363,0x000C5360,0x000C535D,0x000C535A,0x000C5357,0x000C5354,0x000C5351, +0x000C534E,0x000C534B,0x000C5348,0x000C5345,0x000C5342,0x000C533F,0xA8003715,0xA9003716,0xAA003717,0xAB003718, +0xAC003719,0xAD00371A,0xAE00371B,0xAF00371C,0xB000371D,0xB100371E,0xB200371F,0xB3003720,0xB4003721,0xB5003722, +0xB6003723,0xB700373C,0xB800373D,0xB900373E,0xBA00373F,0xBB003740,0xBC003741,0xBD003742,0xBE003743,0xBF003744, +0x000C533C,0x000C5339,0x000C5336,0x000C5333,0x000C5330,0x000C532D,0x000C532A,0x000C5327,0x000C5324,0xE10035DF, +0x000C5321,0x000C531E,0x000C531B,0x000C5318,0x000C5315,0x000C5312,0x000C530F,0x000C530C,0x000C5309,0x000C5306, +0x000C5303,0x80003746,0x81003747,0x82003748,0x000C5300,0x000C52FD,0x000C52FA,0x000C52F7,0x860036B2,0x8700370B, +0xA800374A,0xA900374B,0xAA00374C,0xAB00374D,0xAC00374E,0xAD00374F,0xAE003750,0xAF003754,0xB0003755,0xB1003756, +0xB2003757,0xB3003772,0xB4003773,0xB5003774,0xB6003775,0xB7003776,0xB8003777,0xB9003778,0xBA003779,0xBB00377A, +0xBC00377B,0xBD00377D,0xBE00377E,0xBF00377F,0x000C52F4,0x000C52F1,0x000C52EE,0x000C52EB,0x000C52E8,0x000C52E5, +0x000C52E2,0x000C52DF,0x000C52DC,0x000C52D9,0xE1003624,0x000C52D6,0x000C52D3,0x000C52D0,0x000C52CD,0x000C52CA, +0x000C52C7,0x000C52C4,0x860036E8,0x8700373A,0x000C52C1,0x000C52BE,0x000C52BB,0x000C52B8,0x000C52B5,0x80003780, +0x81003781,0x82003782,0x000C52B2,0x000C52AF,0xA8003786,0xA9003787,0xAA003788,0xAB003789,0xAC00378A,0xAD00378E, +0xAE00378F,0xAF0037A8,0xB00037A9,0xB10037AA,0xB20037AB,0xB30037AC,0xB40037AD,0xB50037AE,0xB60037AF,0xB70037B0, +0xB80037B1,0xB90037B2,0xBA0037B3,0xBB0037B4,0xBC0037B5,0xBD0037B6,0xBE0037B7,0xBF0037B8,0x000C52AC,0x000C52A9, +0x000C52A6,0x000C52A3,0x000C52A0,0x000C529D,0x000C529A,0x000C5297,0x000C5294,0x000C5291,0x000C528E,0x000C528B, +0x000C5288,0x000C5285,0x000C5282,0x000C527F,0x000C527C,0xE1003653,0x800037BD,0x810037BE,0x820037BF,0x000C5279, +0x000C5276,0x000C5273,0x000C5270,0x86003724,0x8700377C,0x000C526D,0x000C526A,0x000C5267,0x000C5264,0x000C5261, +0x000C525E,0x000C525B,0x000C5258,0x000C5255,0xA80037C3,0xA90037C4,0xAA0037C5,0xAB0037C6,0xAC0037C7,0xAD0037C8, +0xAE0037C9,0xAF0037CA,0xB00037CB,0xB10037E4,0xB20037E5,0xB30037E6,0xB40037E7,0xB50037E8,0xB60037E9,0xB70037EA, +0xB80037EB,0xB90037EC,0xBA0037ED,0xBB0037EE,0xBC0037EF,0xBD0037F0,0xBE0037F1,0xBF0037F2,0x000C5252,0x000C524F, +0x000C524C,0x000C5249,0x000C5246,0x000C5243,0x000C5240,0x000C523D,0x000C523A,0x000C5237,0x000C5234,0x000C5231, +0x000C522E,0x000C522B,0x000C5228,0xE100368D,0x000C5225,0x000C5222,0x000C521F,0x000C521C,0x000C5219,0x000C5216, +0x000C5213,0x000C5210,0x800037F4,0x810037F5,0x820037F6,0x000C520D,0x000C520A,0x000C5207,0x000C5204,0x000C5201, +0x000C51FE,0x000C51FB,0x000C51F8,0x000C51F5,0x000C51F2,0x000C51EF,0x86003764,0x870037B9,0xA80037F8,0xA90037F9, +0xAA0037FA,0xAB0037FB,0xAC0037FF,0xAD003800,0xAE003801,0xAF003802,0xB0003803,0xB1003804,0xB2003805,0xB3003806, +0xB4003807,0xB5003808,0xB6003809,0xB7003824,0xB8003825,0xB9003826,0xBA003827,0xBB003828,0xBC003829,0xBD00382B, +0xBE00382C,0xBF00382D,0x000C51EC,0x000C51E9,0x000C51E6,0x000C51E3,0x000C51E0,0x000C51DD,0xE10036D2,0x000C51DA, +0x000C51D7,0x000C51D4,0x000C51D1,0x000C51CE,0x000C51CB,0x000C51C8,0x000C51C5,0x000C51C2,0x000C51BF,0x000C51BC, +0x000C51B9,0x000C51B6,0x000C51B3,0x8000382E,0x8100382F,0x82003830,0x000C51B0,0x000C51AD,0x000C51AA,0x000C51A7, +0x8600379A,0x870037F3,0xA8003832,0xA9003833,0xAA003834,0xAB003835,0xAC003836,0xAD003837,0xAE003838,0xAF00383C, +0xB000383D,0xB100383E,0xB200383F,0xB300385A,0xB400385B,0xB500385C,0xB600385D,0xB700385E,0xB800385F,0xB9003860, +0xBA003861,0xBB003862,0xBC003863,0xBD003865,0xBE003866,0xBF003867,0x000C51A4,0x000C51A1,0x000C519E,0x000C519B, +0x000C5198,0x000C5195,0x000C5192,0x000C518F,0x000C518C,0x000C5189,0xE10036FE,0x000C5186,0x000C5183,0x000C5180, +0x000C517D,0x000C517A,0x000C5177,0x000C5174,0x000C5171,0x000C516E,0x000C516B,0x000C5168,0x000C5165,0x000C5162, +0x000C515F,0x80003868,0x81003869,0x8200386A,0x000C515C,0x000C5159,0x000C5156,0x000C5153,0x000C5150,0x000C514D, +0x000C514A,0x000C5147,0x000C5144,0x000C5141,0x000C513E,0x000C513B,0x860037DC,0x87003822,0xA800386C,0xA900386D, +0xAA00386E,0xAB00386F,0xAC003870,0xAD003871,0xAE003872,0xAF003876,0xB0003877,0xB1003878,0xB2003879,0xB300387A, +0xB400387B,0xB500387C,0xB600387D,0xB700387E,0xB800387F,0xB9003880,0xBA003881,0xBB00389C,0xBC00389D,0xBD00389E, +0xBE00389F,0xBF0038A0,0x000C5138,0x000C5135,0x000C5132,0x000C512F,0x000C512C,0xE100373B,0x800038A5,0x810038A6, +0x820038A7,0x000C5129,0x000C5126,0x000C5123,0x000C5120,0x8600380A,0x87003864,0x000C511D,0x000C511A,0x000C5117, +0x000C5114,0x000C5111,0x000C510E,0x000C510B,0xA80038AB,0xA90038AC,0xAA0038AD,0xAB0038AE,0xAC0038AF,0xAD0038B0, +0xAE0038B1,0xAF0038CA,0xB00038CB,0xB10038CC,0xB20038CD,0xB30038CE,0xB40038CF,0xB50038D0,0xB60038D1,0xB70038D2, +0xB80038D3,0xB90038D4,0xBA0038D5,0xBB0038D6,0xBC0038D7,0xBD0038D9,0xBE0038DA,0xBF0038DB,0x000C5108,0x000C5105, +0x000C5102,0x000C50FF,0x000C50FC,0x000C50F9,0x000C50F6,0x000C50F3,0x000C50F0,0x000C50ED,0x000C50EA,0x000C50E7, +0x000C50E4,0x000C50E1,0xE1003784,0x000C50DE,0x000C50DB,0x000C50D8,0x000C50D5,0x000C50D2,0x000C50CF,0x000C50CC, +0x000C50C9,0x000C50C6,0x000C50C3,0x000C50C0,0x800038DC,0x810038DD,0x820038DE,0x000C50BD,0x000C50BA,0x000C50B7, +0x000C50B4,0x000C50B1,0x000C50AE,0x000C50AB,0x000C50A8,0x000C50A5,0x000C50A2,0x000C509F,0x000C509C,0x000C5099, +0x000C5096,0x000C5093,0x000C5090,0x000C508D,0x000C508A,0x86003874,0x87003882,0x000C5087,0x000C5084,0x000C5081, +0x000C507E,0x000C507B,0x000C5078,0x000C5075,0x800038FD,0x810038FE,0x820038FF,0x000C5072,0x000C506F,0x000C506C, +0x000C5069,0x8600388C,0x870038D8,0x000C5066,0x000C5063,0x000C5060,0x000C505D,0x000C505A,0x000C5057,0x000C5054, +0xE10037BA,0x000C5051,0x000C504E,0x000C504B,0x000C5048,0x000C5045,0x000C5042,0x000C503F,0x000C503C,0x000C5039, +0xA80038E0,0xA90038E1,0xAA0038E2,0xAB0038E3,0xAC0038E7,0xAD0038E8,0xAE0038E9,0xAF0038EA,0xB00038EB,0xB10038EC, +0xB20038ED,0xB30038EE,0xB40038EF,0xB50038F0,0xB60038F1,0xB70038F2,0xB80038F3,0xB90038F4,0xBA0038F5,0xBB0038F6, +0xBC0038F7,0xBD0038F8,0xBE0038FB,0xBF0038FC,0xA8003901,0xA9003905,0xAA003906,0xAB003907,0xAC003908,0xAD00390B, +0xAE00390C,0xAF00390D,0xB000390E,0xB100390F,0xB2003910,0xB3003911,0xB4003913,0xB5003914,0xB6003915,0xB7003916, +0xB8003917,0xB9003918,0xBA003919,0xBB00391A,0xBC00391B,0xBD00394D,0xBE00394E,0xBF00394F,0xE10037FC,0x000C5036, +0x000C5033,0x000C5030,0x000C502D,0x000C502A,0x000C5027,0x000C5024,0x000C5021,0x000C501E,0x000C501B,0x000C5018, +0x80003950,0x81003951,0x82003952,0x000C5015,0x000C5012,0x000C500F,0x000C500C,0x000C5009,0x000C5006,0x000C5003, +0x000C5000,0x000C4FFD,0x000C4FFA,0x000C4FF7,0x000C4FF4,0x000C4FF1,0x000C4FEE,0x000C4FEB,0x860038C4,0x8700390A, +0xA8003954,0xA9003955,0xAA003956,0xAB003957,0xAC00395B,0xAD00395C,0xAE00395D,0xAF00395E,0xB000395F,0xB1003960, +0xB2003961,0xB3003962,0xB4003963,0xB5003964,0xB6003965,0xB7003966,0xB8003967,0xB9003968,0xBA003969,0xBB003984, +0xBC003985,0xBD003986,0xBE003987,0xBF003988,0x000C4FE8,0x000C4FE5,0x000C4FE2,0x000C4FDF,0x000C4FDC,0xE1003823, +0x8000398D,0x8100398E,0x8200398F,0x000C4FD9,0x000C4FD6,0x000C4FD3,0x000C4FD0,0x000C4FCD,0x000C4FCA,0x000C4FC7, +0x000C4FC4,0x000C4FC1,0x000C4FBE,0x000C4FBB,0x860038F9,0x87003944,0x000C4FB8,0x000C4FB5,0x000C4FB2,0x000C4FAF, +0x000C4FAC,0x000C4FA9,0x000C4FA6,0xA8003991,0xA9003992,0xAA003993,0xAB003994,0xAC003995,0xAD003996,0xAE003997, +0xAF00399A,0xB000399B,0xB100399C,0xB200399D,0xB300399E,0xB400399F,0xB50039A0,0xB60039B9,0xB70039BA,0xB80039BB, +0xB90039BC,0xBA0039BD,0xBB0039BE,0xBC0039BF,0xBD0039C1,0xBE0039C2,0xBF0039C3,0x000C4FA3,0x000C4FA0,0x000C4F9D, +0x000C4F9A,0x000C4F97,0x000C4F94,0x000C4F91,0xE1003873,0x000C4F8E,0x000C4F8B,0x000C4F88,0x800039C7,0x810039C8, +0x820039C9,0x000C4F85,0x000C4F82,0x000C4F7F,0x85003941,0x000C4F7C,0x86003958,0x8700397D,0x000C4F79,0x000C4F76, +0x000C4F73,0x000C4F70,0x000C4F6D,0x000C4F6A,0x000C4F67,0x000C4F64,0x000C4F61,0x000C4F5E,0x000C4F5B,0x000C4F58, +0x000C4F55,0xE1003945,0x000C4F52,0x000C4F4F,0x000C4F4C,0x000C4F49,0x000C4F46,0xE1003883,0xA10039CB,0xA2003A1B, +0xA3003A3D,0xA4003A8F,0xA5003AC9,0xA6003B00,0xA7003B25,0xA8003B77,0xA9003BAE,0xAA003BE8,0xAB003C22,0xAC003C5F, +0xAD003C99,0xAE003CD3,0xAF003D0A,0xB0003D44,0xB1003D7E,0xB2003DB8,0xB3003DF2,0xB4003E2F,0xB5003E69,0x000C4F43, +0x000C4F40,0x000C4F3D,0x000C4F3A,0x000C4F37,0x000C4F34,0x80003A18,0x81003A19,0x82003A1A,0xA80039CE,0xA90039CF, +0xAA0039D0,0xAB0039D1,0xAC0039D2,0xAD0039D3,0xAE0039D4,0xAF0039D5,0xB00039D6,0xB10039D7,0xB20039D8,0xB30039D9, +0xB40039DA,0xB50039DC,0xB60039DD,0xB70039DE,0xB80039DF,0xB90039E0,0xBA0039F7,0xBB0039F8,0xBC0039F9,0xBD0039FA, +0xBE0039FB,0xBF0039FC,0x000C4F31,0x000C4F2E,0x000C4F2B,0x000C4F28,0x000C4F25,0x000C4F22,0x86003999,0x870039B7, +0x000C4F1F,0x000C4F1C,0x000C4F19,0x000C4F16,0x000C4F13,0x000C4F10,0x000C4F0D,0x000C4F0A,0x000C4F07,0x000C4F04, +0x000C4F01,0x000C4EFE,0x000C4EFB,0x000C4EF8,0x000C4EF5,0x000C4EF2,0x000C4EEF,0x000C4EEC,0x000C4EE9,0x000C4EE6, +0xE10038E4,0x000C4EE3,0x000C4EE0,0x80003A3A,0x81003A3B,0x82003A3C,0x000C4EDD,0x000C4EDA,0x000C4ED7,0x000C4ED4, +0x860039B1,0x87003A09,0x000C4ED1,0xA8003A1C,0xA9003A1D,0xAA003A20,0xAB003A21,0xAC003A22,0xAD003A23,0xAE003A24, +0xAF003A25,0xB0003A26,0xB1003A27,0xB2003A28,0xB3003A29,0xB4003A2A,0xB5003A2B,0xB6003A2C,0xB7003A2D,0xB8003A2E, +0xB9003A2F,0xBA003A30,0xBB003A31,0xBC003A32,0xBD003A33,0xBE003A35,0xBF003A36,0xA8003A40,0xA9003A72,0xAA003A73, +0xAB003A74,0xAC003A75,0xAD003A76,0xAE003A77,0xAF003A78,0xB0003A79,0xB1003A7A,0xB2003A7B,0xB3003A7C,0xB4003A7D, +0xB5003A7E,0xB6003A7F,0xB7003A80,0xB8003A81,0xB9003A82,0xBA003A83,0xBB003A84,0xBC003A85,0xBD003A86,0xBE003A87, +0xBF003A88,0xE1003912,0x000C4ECE,0x000C4ECB,0x000C4EC8,0x000C4EC5,0x000C4EC2,0x000C4EBF,0x000C4EBC,0x000C4EB9, +0x000C4EB6,0x000C4EB3,0x000C4EB0,0x000C4EAD,0x000C4EAA,0x000C4EA7,0x000C4EA4,0x000C4EA1,0x000C4E9E,0x000C4E9B, +0x000C4E98,0x000C4E95,0x000C4E92,0x000C4E8F,0x000C4E8C,0x80003A8C,0x81003A8D,0x82003A8E,0x000C4E89,0x000C4E86, +0x000C4E83,0x000C4E80,0x860039EA,0x87003A43,0xA8003AAA,0xA9003AAB,0xAA003AAD,0xAB003AAE,0xAC003AAF,0xAD003AB0, +0xAE003AB1,0xAF003AB2,0xB0003AB3,0xB1003AB4,0xB2003AB5,0xB3003AB6,0xB4003AB7,0xB5003AB8,0xB6003AB9,0xB7003ABA, +0xB8003ABB,0xB9003ABC,0xBA003ABD,0xBB003ABE,0xBC003ABF,0xBD003AC0,0xBE003AC1,0xBF003AC2,0x000C4E7D,0x000C4E7A, +0xE1003946,0x000C4E77,0x000C4E74,0x000C4E71,0x000C4E6E,0x000C4E6B,0x000C4E68,0x000C4E65,0x000C4E62,0x000C4E5F, +0x000C4E5C,0x000C4E59,0x000C4E56,0x000C4E53,0x000C4E50,0x000C4E4D,0x000C4E4A,0x000C4E47,0x000C4E44,0x000C4E41, +0x000C4E3E,0x000C4E3B,0x000C4E38,0x80003AC6,0x81003AC7,0x82003AC8,0x000C4E35,0x000C4E32,0x000C4E2F,0x000C4E2C, +0x86003A34,0x87003A89,0x000C4E29,0x000C4E26,0x000C4E23,0x000C4E20,0x000C4E1D,0x000C4E1A,0x000C4E17,0x000C4E14, +0x000C4E11,0x000C4E0E,0x000C4E0B,0x000C4E08,0x000C4E05,0x000C4E02,0x000C4DFF,0x000C4DFC,0xA8003ACC,0xA9003ACD, +0xAA003ACE,0xAB003ACF,0xAC003AD0,0xAD003AD1,0xAE003AD2,0xAF003AD3,0xB0003AD4,0xB1003AD5,0xB2003AD6,0xB3003AD7, +0xB4003AD8,0xB5003AD9,0xB6003ADA,0xB7003ADB,0xB8003AF4,0xB9003AF5,0xBA003AF6,0xBB003AF7,0xBC003AF8,0xBD003AF9, +0xBE003AFA,0xBF003AFB,0x000C4DF9,0x000C4DF6,0x000C4DF3,0x000C4DF0,0x000C4DED,0x000C4DEA,0x000C4DE7,0x000C4DE4, +0xE1003998,0x000C4DE1,0x000C4DDE,0x000C4DDB,0x000C4DD8,0x000C4DD5,0x000C4DD2,0x000C4DCF,0x000C4DCC,0x000C4DC9, +0x000C4DC6,0x000C4DC3,0x000C4DC0,0x80003AFD,0x81003AFE,0x82003AFF,0x000C4DBD,0x000C4DBA,0x000C4DB7,0x000C4DB4, +0x86003A8B,0x87003A9F,0x000C4DB1,0x000C4DAE,0x000C4DAB,0x000C4DA8,0x000C4DA5,0x000C4DA2,0x000C4D9F,0x000C4D9C, +0x000C4D99,0x000C4D96,0x000C4D93,0x000C4D90,0xE10039B8,0x80003B22,0x81003B23,0x82003B24,0x000C4D8D,0x000C4D8A, +0x000C4D87,0x000C4D84,0x86003AA3,0x87003AF1,0x000C4D81,0x000C4D7E,0x000C4D7B,0x000C4D78,0x000C4D75,0x000C4D72, +0x000C4D6F,0x000C4D6C,0x000C4D69,0x000C4D66,0x000C4D63,0xA8003B01,0xA9003B02,0xAA003B03,0xAB003B04,0xAC003B05, +0xAD003B06,0xAE003B07,0xAF003B08,0xB0003B0C,0xB1003B0D,0xB2003B0E,0xB3003B0F,0xB4003B12,0xB5003B13,0xB6003B14, +0xB7003B15,0xB8003B16,0xB9003B17,0xBA003B18,0xBB003B19,0xBC003B1A,0xBD003B1B,0xBE003B1C,0xBF003B1D,0xA8003B28, +0xA9003B29,0xAA003B2A,0xAB003B2B,0xAC003B2C,0xAD003B2D,0xAE003B2E,0xAF003B2F,0xB0003B30,0xB1003B31,0xB2003B32, +0xB3003B63,0xB4003B64,0xB5003B65,0xB6003B66,0xB7003B67,0xB8003B68,0xB9003B69,0xBA003B6A,0xBB003B6B,0xBC003B6C, +0xBD003B6D,0xBE003B6E,0xBF003B6F,0x000C4D60,0x000C4D5D,0x000C4D5A,0x000C4D57,0x000C4D54,0x000C4D51,0x000C4D4E, +0x000C4D4B,0x000C4D48,0x000C4D45,0x000C4D42,0x000C4D3F,0x000C4D3C,0xE1003A0A,0x80003B74,0x81003B75,0x82003B76, +0x000C4D39,0x000C4D36,0x000C4D33,0x000C4D30,0x86003ADC,0x87003B33,0x000C4D2D,0x000C4D2A,0x000C4D27,0x000C4D24, +0x000C4D21,0x000C4D1E,0x000C4D1B,0x000C4D18,0x000C4D15,0x000C4D12,0xA8003B7A,0xA9003B7B,0xAA003B7C,0xAB003B7D, +0xAC003B7E,0xAD003B7F,0xAE003B80,0xAF003B81,0xB0003B82,0xB1003B83,0xB2003B9C,0xB3003B9D,0xB4003B9E,0xB5003B9F, +0xB6003BA0,0xB7003BA1,0xB8003BA2,0xB9003BA3,0xBA003BA4,0xBB003BA5,0xBC003BA6,0xBD003BA7,0xBE003BA8,0xBF003BA9, +0x000C4D0F,0x000C4D0C,0x000C4D09,0x000C4D06,0x000C4D03,0x000C4D00,0x000C4CFD,0x000C4CFA,0x000C4CF7,0x000C4CF4, +0x000C4CF1,0x000C4CEE,0x000C4CEB,0x000C4CE8,0xE1003A44,0x000C4CE5,0x000C4CE2,0x000C4CDF,0x000C4CDC,0x000C4CD9, +0x000C4CD6,0x000C4CD3,0x000C4CD0,0x80003BAB,0x81003BAC,0x82003BAD,0x000C4CCD,0x000C4CCA,0x000C4CC7,0x000C4CC4, +0x86003B1E,0x87003B70,0x000C4CC1,0x000C4CBE,0x000C4CBB,0x000C4CB8,0x000C4CB5,0x000C4CB2,0x000C4CAF,0x000C4CAC, +0x000C4CA9,0x000C4CA6,0xA8003BAF,0xA9003BB0,0xAA003BB1,0xAB003BB2,0xAC003BB6,0xAD003BB7,0xAE003BB8,0xAF003BB9, +0xB0003BBC,0xB1003BBD,0xB2003BBE,0xB3003BBF,0xB4003BC0,0xB5003BC1,0xB6003BC2,0xB7003BC3,0xB8003BC4,0xB9003BC5, +0xBA003BDE,0xBB003BDF,0xBC003BE0,0xBD003BE2,0xBE003BE3,0xBF003BE4,0x000C4CA3,0x000C4CA0,0x000C4C9D,0xE1003A8A, +0x000C4C9A,0x000C4C97,0x000C4C94,0x000C4C91,0x000C4C8E,0x000C4C8B,0x000C4C88,0x000C4C85,0x000C4C82,0x000C4C7F, +0x000C4C7C,0x000C4C79,0x000C4C76,0x000C4C73,0x80003BE5,0x81003BE6,0x82003BE7,0x000C4C70,0x000C4C6D,0x000C4C6A, +0x000C4C67,0x86003B5F,0x87003BAA,0x000C4C64,0x000C4C61,0x000C4C5E,0x000C4C5B,0x000C4C58,0x000C4C55,0x000C4C52, +0x000C4C4F,0x000C4C4C,0x000C4C49,0x000C4C46,0x000C4C43,0x000C4C40,0xE1003AA0,0xA8003BE9,0xA9003BEA,0xAA003BEB, +0xAB003BEC,0xAC003BED,0xAD003BEE,0xAE003BEF,0xAF003BF3,0xB0003BF4,0xB1003BF5,0xB2003BF6,0xB3003BF9,0xB4003BFA, +0xB5003BFB,0xB6003BFC,0xB7003BFD,0xB8003BFE,0xB9003BFF,0xBA003C00,0xBB003C01,0xBC003C02,0xBD003C03,0xBE003C04, +0xBF003C05,0x000C4C3D,0x000C4C3A,0x000C4C37,0x000C4C34,0x000C4C31,0x000C4C2E,0x000C4C2B,0x000C4C28,0x000C4C25, +0x000C4C22,0x000C4C1F,0x80003C1F,0x81003C20,0x82003C21,0x000C4C1C,0x000C4C19,0x000C4C16,0x000C4C13,0x000C4C10, +0x000C4C0D,0x000C4C0A,0x000C4C07,0x000C4C04,0x000C4C01,0x000C4BFE,0x000C4BFB,0x86003B93,0x87003BD9,0xA8003C23, +0xA9003C24,0xAA003C25,0xAB003C26,0xAC003C27,0xAD003C28,0xAE003C29,0xAF003C2D,0xB0003C2E,0xB1003C2F,0xB2003C30, +0xB3003C31,0xB4003C32,0xB5003C33,0xB6003C34,0xB7003C35,0xB8003C36,0xB9003C37,0xBA003C38,0xBB003C53,0xBC003C54, +0xBD003C55,0xBE003C56,0xBF003C57,0x000C4BF8,0x000C4BF5,0x000C4BF2,0x000C4BEF,0x000C4BEC,0xE1003AF2,0x80003C5C, +0x81003C5D,0x82003C5E,0x000C4BE9,0x000C4BE6,0x000C4BE3,0x000C4BE0,0x86003BBA,0x87003C13,0xA8003C7A,0xA9003C7B, +0xAA003C7C,0xAB003C7D,0xAC003C7E,0xAD003C7F,0xAE003C80,0xAF003C81,0xB0003C82,0xB1003C83,0xB2003C84,0xB3003C85, +0xB4003C86,0xB5003C87,0xB6003C88,0xB7003C89,0xB8003C8A,0xB9003C8B,0xBA003C8C,0xBB003C8D,0xBC003C8E,0xBD003C90, +0xBE003C91,0xBF003C92,0x000C4BDD,0x000C4BDA,0x000C4BD7,0x000C4BD4,0x000C4BD1,0x000C4BCE,0x000C4BCB,0x000C4BC8, +0x000C4BC5,0x000C4BC2,0x000C4BBF,0x000C4BBC,0x000C4BB9,0x000C4BB6,0x000C4BB3,0x000C4BB0,0x000C4BAD,0x000C4BAA, +0x000C4BA7,0x000C4BA4,0x000C4BA1,0xE1003B34,0x000C4B9E,0x000C4B9B,0x000C4B98,0x80003C96,0x81003C97,0x82003C98, +0x000C4B95,0x000C4B92,0x000C4B8F,0x000C4B8C,0x86003BF7,0x87003C4D,0x000C4B89,0x000C4B86,0x000C4B83,0xA8003C9C, +0xA9003C9D,0xAA003C9E,0xAB003CB7,0xAC003CB8,0xAD003CB9,0xAE003CBA,0xAF003CBB,0xB0003CBC,0xB1003CBD,0xB2003CBE, +0xB3003CBF,0xB4003CC0,0xB5003CC1,0xB6003CC2,0xB7003CC3,0xB8003CC4,0xB9003CC5,0xBA003CC6,0xBB003CC7,0xBC003CC8, +0xBD003CCA,0xBE003CCB,0xBF003CCC,0x000C4B80,0x000C4B7D,0x000C4B7A,0x000C4B77,0x000C4B74,0x000C4B71,0x000C4B6E, +0x000C4B6B,0x000C4B68,0x000C4B65,0x000C4B62,0x000C4B5F,0x000C4B5C,0x000C4B59,0x000C4B56,0x000C4B53,0x000C4B50, +0x000C4B4D,0xE1003B71,0x000C4B4A,0x000C4B47,0x000C4B44,0x80003CD0,0x81003CD1,0x82003CD2,0x000C4B41,0x000C4B3E, +0x000C4B3B,0x000C4B38,0x86003C39,0x87003C8F,0x000C4B35,0x000C4B32,0x000C4B2F,0x000C4B2C,0x000C4B29,0x000C4B26, +0x000C4B23,0x000C4B20,0x000C4B1D,0x000C4B1A,0x000C4B17,0xA8003CD6,0xA9003CD7,0xAA003CD8,0xAB003CD9,0xAC003CDA, +0xAD003CDB,0xAE003CDC,0xAF003CDD,0xB0003CDE,0xB1003CDF,0xB2003CE0,0xB3003CF9,0xB4003CFA,0xB5003CFB,0xB6003CFC, +0xB7003CFD,0xB8003CFE,0xB9003CFF,0xBA003D00,0xBB003D01,0xBC003D02,0xBD003D04,0xBE003D05,0xBF003D06,0x000C4B14, +0x000C4B11,0x000C4B0E,0x000C4B0B,0x000C4B08,0x000C4B05,0x000C4B02,0x000C4AFF,0x000C4AFC,0x000C4AF9,0xE1003BB3, +0x000C4AF6,0x000C4AF3,0x000C4AF0,0x000C4AED,0x000C4AEA,0x000C4AE7,0x000C4AE4,0x000C4AE1,0x000C4ADE,0x000C4ADB, +0x000C4AD8,0x80003D07,0x81003D08,0x82003D09,0x000C4AD5,0x000C4AD2,0x000C4ACF,0x000C4ACC,0x000C4AC9,0x000C4AC6, +0x000C4AC3,0x86003C73,0x87003CC9,0xA8003D0B,0xA9003D0C,0xAA003D0D,0xAB003D0E,0xAC003D12,0xAD003D13,0xAE003D14, +0xAF003D15,0xB0003D16,0xB1003D17,0xB2003D18,0xB3003D33,0xB4003D34,0xB5003D35,0xB6003D36,0xB7003D37,0xB8003D38, +0xB9003D39,0xBA003D3A,0xBB003D3B,0xBC003D3C,0xBD003D3D,0xBE003D3E,0xBF003D3F,0x000C4AC0,0x000C4ABD,0x000C4ABA, +0x000C4AB7,0x000C4AB4,0x000C4AB1,0x000C4AAE,0x000C4AAB,0x000C4AA8,0x000C4AA5,0x000C4AA2,0x000C4A9F,0x000C4A9C, +0xE1003BDA,0x000C4A99,0x000C4A96,0x000C4A93,0x000C4A90,0x000C4A8D,0x000C4A8A,0x000C4A87,0x000C4A84,0x80003D41, +0x81003D42,0x82003D43,0x000C4A81,0x000C4A7E,0x000C4A7B,0x000C4A78,0x000C4A75,0x000C4A72,0x000C4A6F,0x86003CAD, +0x87003D03,0xA8003D45,0xA9003D46,0xAA003D47,0xAB003D48,0xAC003D4C,0xAD003D4D,0xAE003D4E,0xAF003D4F,0xB0003D50, +0xB1003D51,0xB2003D52,0xB3003D6D,0xB4003D6E,0xB5003D6F,0xB6003D70,0xB7003D71,0xB8003D72,0xB9003D73,0xBA003D74, +0xBB003D75,0xBC003D76,0xBD003D77,0xBE003D78,0xBF003D79,0x000C4A6C,0x000C4A69,0x000C4A66,0x000C4A63,0x000C4A60, +0x000C4A5D,0x000C4A5A,0x000C4A57,0x000C4A54,0x000C4A51,0x000C4A4E,0x000C4A4B,0x000C4A48,0xE1003C14,0x000C4A45, +0x000C4A42,0x000C4A3F,0x000C4A3C,0x000C4A39,0x000C4A36,0x000C4A33,0x000C4A30,0x80003D7B,0x81003D7C,0x82003D7D, +0x000C4A2D,0x000C4A2A,0x000C4A27,0x000C4A24,0x000C4A21,0x000C4A1E,0x000C4A1B,0x000C4A18,0x000C4A15,0x000C4A12, +0x000C4A0F,0x000C4A0C,0x000C4A09,0x000C4A06,0x000C4A03,0x86003CEF,0x87003D40,0xA8003D7F,0xA9003D80,0xAA003D81, +0xAB003D82,0xAC003D86,0xAD003D87,0xAE003D88,0xAF003D89,0xB0003D8A,0xB1003D8B,0xB2003D8C,0xB3003D8D,0xB4003D8E, +0xB5003D8F,0xB6003D90,0xB7003D91,0xB8003D92,0xB9003D93,0xBA003D94,0xBB003DAF,0xBC003DB0,0xBD003DB1,0xBE003DB2, +0xBF003DB3,0x000C4A00,0x000C49FD,0x000C49FA,0x000C49F7,0x000C49F4,0xE1003C4E,0x000C49F1,0x000C49EE,0x000C49EB, +0x000C49E8,0x000C49E5,0x000C49E2,0x000C49DF,0x000C49DC,0x000C49D9,0x000C49D6,0x000C49D3,0x80003DB5,0x81003DB6, +0x82003DB7,0x000C49D0,0x000C49CD,0x000C49CA,0x000C49C7,0x000C49C4,0x000C49C1,0x000C49BE,0x000C49BB,0x000C49B8, +0x000C49B5,0x000C49B2,0x000C49AF,0x86003D29,0x87003D7A,0xA8003DB9,0xA9003DBA,0xAA003DBB,0xAB003DBC,0xAC003DBD, +0xAD003DBE,0xAE003DBF,0xAF003DC3,0xB0003DC4,0xB1003DC5,0xB2003DC6,0xB3003DC7,0xB4003DC8,0xB5003DC9,0xB6003DCA, +0xB7003DCB,0xB8003DCC,0xB9003DCD,0xBA003DCE,0xBB003DE9,0xBC003DEA,0xBD003DEC,0xBE003DED,0xBF003DEE,0x000C49AC, +0x000C49A9,0xE1003C93,0x000C49A6,0x000C49A3,0x000C49A0,0x000C499D,0x000C499A,0x000C4997,0x000C4994,0x000C4991, +0x000C498E,0x000C498B,0x000C4988,0x000C4985,0x000C4982,0x000C497F,0x80003DEF,0x81003DF0,0x82003DF1,0x000C497C, +0x000C4979,0x000C4976,0x000C4973,0x000C4970,0x000C496D,0x000C496A,0x000C4967,0x000C4964,0x000C4961,0x000C495E, +0x000C495B,0x86003D63,0x87003DA9,0xA8003DF3,0xA9003DF4,0xAA003DF5,0xAB003DF6,0xAC003DF7,0xAD003DF8,0xAE003DF9, +0xAF003DFD,0xB0003DFE,0xB1003DFF,0xB2003E00,0xB3003E01,0xB4003E02,0xB5003E03,0xB6003E04,0xB7003E05,0xB8003E06, +0xB9003E07,0xBA003E08,0xBB003E23,0xBC003E24,0xBD003E26,0xBE003E27,0xBF003E28,0x000C4958,0x000C4955,0xE1003CCD, +0x000C4952,0x000C494F,0x000C494C,0x80003E2C,0x81003E2D,0x82003E2E,0x000C4949,0x000C4946,0x000C4943,0x000C4940, +0x86003D95,0x87003DE3,0x000C493D,0x000C493A,0x000C4937,0x000C4934,0x000C4931,0x000C492E,0x000C492B,0x000C4928, +0x000C4925,0x000C4922,0x000C491F,0xA8003E32,0xA9003E33,0xAA003E34,0xAB003E35,0xAC003E36,0xAD003E37,0xAE003E38, +0xAF003E39,0xB0003E3A,0xB1003E3B,0xB2003E3C,0xB3003E55,0xB4003E56,0xB5003E57,0xB6003E58,0xB7003E59,0xB8003E5A, +0xB9003E5B,0xBA003E5C,0xBB003E5D,0xBC003E5E,0xBD003E60,0xBE003E61,0xBF003E62,0x000C491C,0x000C4919,0x000C4916, +0x000C4913,0x000C4910,0x000C490D,0x000C490A,0x000C4907,0x000C4904,0x000C4901,0xE1003D0F,0x000C48FE,0x000C48FB, +0x000C48F8,0x80003E66,0x81003E67,0x82003E68,0x000C48F5,0x000C48F2,0x000C48EF,0x000C48EC,0x86003DCF,0x87003E1D, +0x000C48E9,0x000C48E6,0x000C48E3,0x000C48E0,0x000C48DD,0x000C48DA,0x000C48D7,0x000C48D4,0x000C48D1,0x000C48CE, +0x000C48CB,0xA8003E6C,0xA9003E6D,0xAA003E6E,0xAB003E6F,0xAC003E70,0xAD003E71,0xAE003E72,0xAF003E73,0xB0003E74, +0xB1003E75,0xB2003E76,0xB3003E8F,0xB4003E90,0xB5003E91,0xB6003E92,0xB7003E93,0xB8003E94,0xB9003E95,0xBA003E96, +0xBB003E97,0xBC003E98,0xBD003E9A,0xBE003E9B,0xBF003E9C,0x000C48C8,0x000C48C5,0x000C48C2,0x000C48BF,0x000C48BC, +0x000C48B9,0x000C48B6,0x000C48B3,0x000C48B0,0x000C48AD,0xE1003D49,0x000C48AA,0x000C48A7,0x000C48A4,0x80003EA0, +0x81003EA1,0x82003EA2,0x000C48A1,0x000C489E,0x000C489B,0xE1003E1F,0x85003E09,0x000C4898,0x86003E30,0x87003E77, +0x000C4895,0x000C4892,0xA1003EA5,0xA2003EF1,0xA3003F2E,0xA4003F68,0xA5003FA2,0xA6003FDC,0xA7004016,0xA800404D, +0xA900408A,0xAA0040C4,0xAB0040FB,0xAC004135,0xAD004172,0xAE0041A9,0xAF0041E3,0xB000421D,0xB100425A,0xB2004291, +0xB30042B2,0xB4004305,0xB5004342,0x000C488F,0x000C488C,0x000C4889,0x000C4886,0x000C4883,0x000C4880,0x000C487D, +0x000C487A,0x000C4877,0x000C4874,0x000C4871,0x000C486E,0x000C486B,0x000C4868,0x000C4865,0x000C4862,0x000C485F, +0x000C485C,0x000C4859,0x000C4856,0xE1003D83,0x000C4853,0x000C4850,0x000C484D,0x000C484A,0xA8003EA8,0xA9003EA9, +0xAA003EBF,0xAB003EC0,0xAC003EC1,0xAD003EC2,0xAE003EC3,0xAF003EC4,0xB0003EC5,0xB1003EC6,0xB2003EC7,0xB3003EC8, +0xB4003EC9,0xB5003ECA,0xB6003ECB,0xB7003ECC,0xB8003ECD,0xB9003ECE,0xBA003ECF,0xBB003ED0,0xBC003ED1,0xBD003ED2, +0xBE003ED4,0xBF003ED5,0x000C4847,0x000C4844,0x000C4841,0x000C483E,0x000C483B,0x000C4838,0x000C4835,0x80003ED6, +0x81003ED7,0x82003EF0,0x000C4832,0x000C482F,0x000C482C,0x000C4829,0x86003E6A,0x87003EAA,0x000C4826,0x000C4823, +0x000C4820,0x000C481D,0x000C481A,0x000C4817,0x000C4814,0x000C4811,0x000C480E,0x000C480B,0x000C4808,0x000C4805, +0x000C4802,0x000C47FF,0x000C47FC,0x000C47F9,0xE1003DAA,0x000C47F6,0xA8003EF2,0xA9003EF3,0xAA003EF4,0xAB003EF5, +0xAC003EF6,0xAD003EFA,0xAE003EFB,0xAF003EFC,0xB0003EFD,0xB1003F00,0xB2003F01,0xB3003F02,0xB4003F03,0xB5003F04, +0xB6003F05,0xB7003F06,0xB8003F07,0xB9003F08,0xBA003F09,0xBB003F0A,0xBC003F0B,0xBD003F0C,0xBE003F0D,0xBF003F0E, +0x80003F0F,0x81003F11,0x82003F2D,0x000C47F3,0x000C47F0,0x000C47ED,0x000C47EA,0x86003EA3,0x87003EE3,0x000C47E7, +0x000C47E4,0x000C47E1,0x000C47DE,0x000C47DB,0x000C47D8,0x000C47D5,0x000C47D2,0x000C47CF,0x000C47CC,0x000C47C9, +0x000C47C6,0x000C47C3,0x000C47C0,0x000C47BD,0x000C47BA,0x000C47B7,0x000C47B4,0x000C47B1,0x000C47AE,0x000C47AB, +0x000C47A8,0x000C47A5,0xE1003DE4,0xA8003F2F,0xA9003F30,0xAA003F33,0xAB003F34,0xAC003F35,0xAD003F36,0xAE003F37, +0xAF003F38,0xB0003F39,0xB1003F3A,0xB2003F3B,0xB3003F3C,0xB4003F3D,0xB5003F3E,0xB6003F3F,0xB7003F40,0xB8003F41, +0xB9003F42,0xBA003F43,0xBB003F44,0xBC003F45,0xBD003F46,0xBE003F47,0xBF003F48,0x80003F49,0x81003F66,0x82003F67, +0x000C47A2,0x000C479F,0x000C479C,0x000C4799,0x86003EDF,0x87003F1F,0x000C4796,0x000C4793,0x000C4790,0x000C478D, +0x000C478A,0x000C4787,0x000C4784,0x000C4781,0x000C477E,0x000C477B,0x000C4778,0x000C4775,0x000C4772,0x000C476F, +0x000C476C,0x000C4769,0x000C4766,0x000C4763,0x000C4760,0x000C475D,0x000C475A,0x000C4757,0x000C4754,0x000C4751, +0x000C474E,0x000C474B,0xE1003E20,0xA8003F69,0xA9003F6C,0xAA003F6D,0xAB003F6E,0xAC003F6F,0xAD003F70,0xAE003F71, +0xAF003F72,0xB0003F73,0xB1003F74,0xB2003F75,0xB3003F76,0xB4003F77,0xB5003F78,0xB6003F79,0xB7003F7A,0xB8003F7B, +0xB9003F7C,0xBA003F7D,0xBB003F7E,0xBC003F7F,0xBD003F80,0xBE003F81,0xBF003F82,0x80003F83,0x81003F84,0x82003F85, +0x000C4748,0x86003EFE,0x87003F56,0x000C4745,0xA8003FA5,0xA9003FBE,0xAA003FBF,0xAB003FC0,0xAC003FC1,0xAD003FC2, +0xAE003FC3,0xAF003FC4,0xB0003FC5,0xB1003FC6,0xB2003FC7,0xB3003FC8,0xB4003FC9,0xB5003FCA,0xB6003FCB,0xB7003FCC, +0xB8003FCD,0xB9003FCE,0xBA003FCF,0xBB003FD0,0xBC003FD1,0xBD003FD3,0xBE003FD4,0xBF003FD5,0x000C4742,0x000C473F, +0x000C473C,0x000C4739,0x000C4736,0x000C4733,0x000C4730,0x000C472D,0x000C472A,0x000C4727,0x000C4724,0x000C4721, +0x000C471E,0x000C471B,0x000C4718,0x000C4715,0x000C4712,0x000C470F,0x000C470C,0x000C4709,0xE1003E78,0x000C4706, +0x000C4703,0x000C4700,0x80003FD9,0x81003FDA,0x82003FDB,0x000C46FD,0x000C46FA,0x000C46F7,0x000C46F4,0x86003F4A, +0x87003F90,0x000C46F1,0x000C46EE,0x000C46EB,0x000C46E8,0x000C46E5,0x000C46E2,0x000C46DF,0x000C46DC,0x000C46D9, +0x000C46D6,0x000C46D3,0x000C46D0,0x000C46CD,0x000C46CA,0x000C46C7,0x000C46C4,0x000C46C1,0x000C46BE,0x000C46BB, +0xA8003FDF,0xA9003FE0,0xAA003FE1,0xAB003FE2,0xAC003FE3,0xAD003FE4,0xAE003FE5,0xAF003FE6,0xB0003FE7,0xB1003FE8, +0xB2003FE9,0xB3003FEA,0xB4003FEB,0xB5003FEC,0xB6003FED,0xB7003FEE,0xB8003FEF,0xB9003FF0,0xBA003FF1,0xBB00400A, +0xBC00400B,0xBD00400C,0xBE00400D,0xBF00400E,0x000C46B8,0x000C46B5,0x000C46B2,0x000C46AF,0x000C46AC,0xE1003EAB, +0x80004013,0x81004014,0x82004015,0x000C46A9,0x000C46A6,0x000C46A3,0x000C46A0,0x86003F86,0x87003FD2,0x000C469D, +0x000C469A,0x000C4697,0x000C4694,0x000C4691,0x000C468E,0x000C468B,0x000C4688,0x000C4685,0x000C4682,0x000C467F, +0x000C467C,0x000C4679,0x000C4676,0x000C4673,0x000C4670,0x000C466D,0x000C466A,0x000C4667,0x000C4664,0x000C4661, +0xA8004019,0xA900401A,0xAA00401B,0xAB00401C,0xAC00401D,0xAD00401E,0xAE00401F,0xAF004020,0xB0004021,0xB1004022, +0xB2004023,0xB3004024,0xB4004025,0xB5004026,0xB6004027,0xB7004028,0xB8004029,0xB900402A,0xBA00402B,0xBB00402C, +0xBC00402D,0xBD004046,0xBE004047,0xBF004048,0x000C465E,0x000C465B,0x000C4658,0xE1003EE4,0x000C4655,0x000C4652, +0x000C464F,0x000C464C,0x000C4649,0x000C4646,0x000C4643,0x000C4640,0x8000404A,0x8100404B,0x8200404C,0x000C463D, +0x000C463A,0x000C4637,0x000C4634,0x000C4631,0x000C462E,0x000C462B,0x86003FB6,0x87004004,0xA800404E,0xA900404F, +0xAA004050,0xAB004051,0xAC004055,0xAD004056,0xAE004057,0xAF004058,0xB0004059,0xB100405A,0xB200405B,0xB3004076, +0xB4004077,0xB5004078,0xB6004079,0xB700407A,0xB800407B,0xB900407C,0xBA00407D,0xBB00407E,0xBC00407F,0xBD004080, +0xBE004081,0xBF004082,0x000C4628,0x000C4625,0x000C4622,0x000C461F,0x000C461C,0x000C4619,0x000C4616,0x000C4613, +0x000C4610,0x000C460D,0x000C460A,0x000C4607,0x000C4604,0xE1003F1D,0x80004087,0x81004088,0x82004089,0x000C4601, +0x000C45FE,0x000C45FB,0x000C45F8,0x86003FF2,0x8700403E,0x000C45F5,0x000C45F2,0x000C45EF,0x000C45EC,0x000C45E9, +0x000C45E6,0x000C45E3,0x000C45E0,0x000C45DD,0x000C45DA,0x000C45D7,0x000C45D4,0x000C45D1,0xA800408D,0xA900408E, +0xAA00408F,0xAB004090,0xAC004091,0xAD004092,0xAE004093,0xAF004094,0xB0004095,0xB1004096,0xB2004097,0xB3004098, +0xB4004099,0xB50040B2,0xB60040B3,0xB70040B4,0xB80040B5,0xB90040B6,0xBA0040B7,0xBB0040B8,0xBC0040B9,0xBD0040BA, +0xBE0040BB,0xBF0040BC,0x000C45CE,0x000C45CB,0x000C45C8,0x000C45C5,0x000C45C2,0x000C45BF,0x000C45BC,0x000C45B9, +0x000C45B6,0x000C45B3,0x000C45B0,0xE1003F57,0x800040C1,0x810040C2,0x820040C3,0x000C45AD,0x000C45AA,0x000C45A7, +0x000C45A4,0x8600402E,0x87004083,0x000C45A1,0x000C459E,0x000C459B,0x000C4598,0x000C4595,0x000C4592,0x000C458F, +0x000C458C,0x000C4589,0x000C4586,0x000C4583,0x000C4580,0x000C457D,0x000C457A,0x000C4577,0xA80040C7,0xA90040C8, +0xAA0040C9,0xAB0040CA,0xAC0040CB,0xAD0040CC,0xAE0040CD,0xAF0040CE,0xB00040CF,0xB10040D0,0xB20040D1,0xB30040D2, +0xB40040D3,0xB50040D4,0xB60040D5,0xB70040EE,0xB80040EF,0xB90040F0,0xBA0040F1,0xBB0040F2,0xBC0040F3,0xBD0040F4, +0xBE0040F5,0xBF0040F6,0x000C4574,0x000C4571,0x000C456E,0x000C456B,0x000C4568,0x000C4565,0x000C4562,0x000C455F, +0x000C455C,0xE1003F91,0x000C4559,0x000C4556,0x000C4553,0x000C4550,0x000C454D,0x000C454A,0x000C4547,0x000C4544, +0x000C4541,0x000C453E,0x000C453B,0x800040F8,0x810040F9,0x820040FA,0x000C4538,0x000C4535,0x000C4532,0x000C452F, +0x86004064,0x870040BD,0xA80040FC,0xA90040FD,0xAA0040FE,0xAB0040FF,0xAC004100,0xAD004101,0xAE004102,0xAF004106, +0xB0004107,0xB1004108,0xB2004109,0xB3004124,0xB4004125,0xB5004126,0xB6004127,0xB7004128,0xB8004129,0xB900412A, +0xBA00412B,0xBB00412C,0xBC00412D,0xBD00412F,0xBE004130,0xBF004131,0x000C452C,0x000C4529,0x000C4526,0x000C4523, +0x000C4520,0x000C451D,0x000C451A,0x000C4517,0x000C4514,0x000C4511,0xE1003FD6,0x000C450E,0x000C450B,0x000C4508, +0x000C4505,0x000C4502,0x000C44FF,0x000C44FC,0x8600409A,0x870040EC,0x000C44F9,0x000C44F6,0x000C44F3,0x000C44F0, +0x000C44ED,0x80004132,0x81004133,0x82004134,0x000C44EA,0x000C44E7,0xA8004138,0xA9004139,0xAA00413A,0xAB00413B, +0xAC00413C,0xAD004140,0xAE004141,0xAF00415A,0xB000415B,0xB100415C,0xB200415D,0xB300415E,0xB400415F,0xB5004160, +0xB6004161,0xB7004162,0xB8004163,0xB9004164,0xBA004165,0xBB004166,0xBC004167,0xBD004168,0xBE004169,0xBF00416A, +0x000C44E4,0x000C44E1,0x000C44DE,0x000C44DB,0x000C44D8,0x000C44D5,0x000C44D2,0x000C44CF,0x000C44CC,0x000C44C9, +0x000C44C6,0x000C44C3,0x000C44C0,0x000C44BD,0x000C44BA,0x000C44B7,0x000C44B4,0xE1004005,0x8000416F,0x81004170, +0x82004171,0x000C44B1,0x000C44AE,0x000C44AB,0x000C44A8,0x860040D6,0x8700412E,0x000C44A5,0x000C44A2,0x000C449F, +0x000C449C,0x000C4499,0x000C4496,0x000C4493,0x000C4490,0x000C448D,0xA8004175,0xA9004176,0xAA004177,0xAB004178, +0xAC004179,0xAD00417A,0xAE00417B,0xAF00417C,0xB000417D,0xB1004196,0xB2004197,0xB3004198,0xB4004199,0xB500419A, +0xB600419B,0xB700419C,0xB800419D,0xB900419E,0xBA00419F,0xBB0041A0,0xBC0041A1,0xBD0041A2,0xBE0041A3,0xBF0041A4, +0x000C448A,0x000C4487,0x000C4484,0x000C4481,0x000C447E,0x000C447B,0x000C4478,0x000C4475,0x000C4472,0x000C446F, +0x000C446C,0x000C4469,0x000C4466,0x000C4463,0x000C4460,0xE100403F,0x000C445D,0x000C445A,0x000C4457,0x000C4454, +0x000C4451,0x000C444E,0x000C444B,0x000C4448,0x800041A6,0x810041A7,0x820041A8,0x000C4445,0x000C4442,0x000C443F, +0x000C443C,0x000C4439,0x000C4436,0x000C4433,0x000C4430,0x000C442D,0x000C442A,0x000C4427,0x86004116,0x8700416B, +0xA80041AA,0xA90041AB,0xAA0041AC,0xAB0041AD,0xAC0041B1,0xAD0041B2,0xAE0041B3,0xAF0041B4,0xB00041B5,0xB10041B6, +0xB20041B7,0xB30041B8,0xB40041B9,0xB50041BA,0xB60041BB,0xB70041D6,0xB80041D7,0xB90041D8,0xBA0041D9,0xBB0041DA, +0xBC0041DB,0xBD0041DD,0xBE0041DE,0xBF0041DF,0x000C4424,0x000C4421,0x000C441E,0x000C441B,0x000C4418,0x000C4415, +0xE1004084,0x000C4412,0x000C440F,0x000C440C,0x000C4409,0x000C4406,0x000C4403,0x000C4400,0x000C43FD,0x000C43FA, +0x000C43F7,0x000C43F4,0x000C43F1,0x000C43EE,0x000C43EB,0x800041E0,0x810041E1,0x820041E2,0x000C43E8,0x000C43E5, +0x000C43E2,0x000C43DF,0x8600414C,0x870041A5,0xA80041E4,0xA90041E5,0xAA0041E6,0xAB0041E7,0xAC0041E8,0xAD0041E9, +0xAE0041EA,0xAF0041EE,0xB00041EF,0xB10041F0,0xB20041F1,0xB300420C,0xB400420D,0xB500420E,0xB600420F,0xB7004210, +0xB8004211,0xB9004212,0xBA004213,0xBB004214,0xBC004215,0xBD004217,0xBE004218,0xBF004219,0x000C43DC,0x000C43D9, +0x000C43D6,0x000C43D3,0x000C43D0,0x000C43CD,0x000C43CA,0x000C43C7,0x000C43C4,0x000C43C1,0xE10040B0,0x000C43BE, +0x000C43BB,0x000C43B8,0x000C43B5,0x000C43B2,0x000C43AF,0x000C43AC,0x000C43A9,0x000C43A6,0x000C43A3,0x000C43A0, +0x000C439D,0x000C439A,0x000C4397,0x8000421A,0x8100421B,0x8200421C,0x000C4394,0x000C4391,0x000C438E,0x000C438B, +0x000C4388,0x000C4385,0x000C4382,0x000C437F,0x000C437C,0x000C4379,0x000C4376,0x000C4373,0x8600418E,0x870041D4, +0xA800421E,0xA900421F,0xAA004220,0xAB004221,0xAC004222,0xAD004223,0xAE004224,0xAF004228,0xB0004229,0xB100422A, +0xB200422B,0xB300422C,0xB400422D,0xB500422E,0xB600422F,0xB7004230,0xB8004231,0xB9004232,0xBA004233,0xBB00424E, +0xBC00424F,0xBD004250,0xBE004251,0xBF004252,0x000C4370,0x000C436D,0x000C436A,0x000C4367,0x000C4364,0xE10040ED, +0x80004257,0x81004258,0x82004259,0x000C4361,0x000C435E,0x000C435B,0x000C4358,0x860041BC,0x87004216,0x000C4355, +0x000C4352,0x000C434F,0x000C434C,0x000C4349,0x000C4346,0x000C4343,0xA800425D,0xA900425E,0xAA00425F,0xAB004260, +0xAC004261,0xAD004262,0xAE004263,0xAF00427C,0xB000427D,0xB100427E,0xB200427F,0xB3004280,0xB4004281,0xB5004282, +0xB6004283,0xB7004284,0xB8004285,0xB9004286,0xBA004287,0xBB004288,0xBC004289,0xBD00428B,0xBE00428C,0xBF00428D, +0x000C4340,0x000C433D,0x000C433A,0x000C4337,0x000C4334,0x000C4331,0x000C432E,0x000C432B,0x000C4328,0x000C4325, +0x000C4322,0x000C431F,0x000C431C,0x000C4319,0xE1004136,0x000C4316,0x000C4313,0x000C4310,0x000C430D,0x000C430A, +0x000C4307,0x000C4304,0x000C4301,0x000C42FE,0x000C42FB,0x000C42F8,0x8000428E,0x8100428F,0x82004290,0x000C42F5, +0x000C42F2,0x000C42EF,0x000C42EC,0x000C42E9,0x000C42E6,0x000C42E3,0x000C42E0,0x000C42DD,0x000C42DA,0x000C42D7, +0x000C42D4,0x000C42D1,0x000C42CE,0x000C42CB,0x000C42C8,0x000C42C5,0x000C42C2,0x86004226,0x87004234,0x000C42BF, +0x000C42BC,0x000C42B9,0x000C42B6,0x000C42B3,0x000C42B0,0x000C42AD,0x800042AF,0x810042B0,0x820042B1,0x000C42AA, +0x000C42A7,0x000C42A4,0x000C42A1,0x8600423E,0x8700428A,0x000C429E,0x000C429B,0x000C4298,0x000C4295,0x000C4292, +0x000C428F,0x000C428C,0xE100416C,0x000C4289,0x000C4286,0x000C4283,0x000C4280,0x000C427D,0x000C427A,0x000C4277, +0x000C4274,0x000C4271,0xA8004292,0xA9004293,0xAA004294,0xAB004295,0xAC004299,0xAD00429A,0xAE00429B,0xAF00429C, +0xB000429D,0xB100429E,0xB200429F,0xB30042A0,0xB40042A1,0xB50042A2,0xB60042A3,0xB70042A4,0xB80042A5,0xB90042A6, +0xBA0042A7,0xBB0042A8,0xBC0042A9,0xBD0042AA,0xBE0042AD,0xBF0042AE,0xA80042B3,0xA90042B7,0xAA0042B8,0xAB0042B9, +0xAC0042BA,0xAD0042BD,0xAE0042BE,0xAF0042BF,0xB00042C0,0xB10042C1,0xB20042C2,0xB30042C3,0xB40042C5,0xB50042C6, +0xB60042C7,0xB70042C8,0xB80042C9,0xB90042CA,0xBA0042CB,0xBB0042CC,0xBC0042CD,0xBD0042FF,0xBE004300,0xBF004301, +0xE10041AE,0x000C426E,0x000C426B,0x000C4268,0x000C4265,0x000C4262,0x000C425F,0x000C425C,0x000C4259,0x000C4256, +0x000C4253,0x000C4250,0x80004302,0x81004303,0x82004304,0x000C424D,0x000C424A,0x000C4247,0x000C4244,0x000C4241, +0x000C423E,0x000C423B,0x000C4238,0x000C4235,0x000C4232,0x000C422F,0x000C422C,0x000C4229,0x000C4226,0x000C4223, +0x86004276,0x870042BC,0xA8004306,0xA9004307,0xAA004308,0xAB004309,0xAC00430D,0xAD00430E,0xAE00430F,0xAF004310, +0xB0004311,0xB1004312,0xB2004313,0xB3004314,0xB4004315,0xB5004316,0xB6004317,0xB7004318,0xB8004319,0xB900431A, +0xBA00431B,0xBB004336,0xBC004337,0xBD004338,0xBE004339,0xBF00433A,0x000C4220,0x000C421D,0x000C421A,0x000C4217, +0x000C4214,0xE10041D5,0x8000433F,0x81004340,0x82004341,0x000C4211,0x000C420E,0x000C420B,0x000C4208,0x000C4205, +0x000C4202,0x000C41FF,0x000C41FC,0x000C41F9,0x000C41F6,0x000C41F3,0x860042AB,0x870042F6,0x000C41F0,0x000C41ED, +0x000C41EA,0x000C41E7,0x000C41E4,0x000C41E1,0x000C41DE,0xA8004343,0xA9004344,0xAA004345,0xAB004346,0xAC004347, +0xAD004348,0xAE004349,0xAF00434C,0xB000434D,0xB100434E,0xB200434F,0xB3004350,0xB4004351,0xB5004352,0xB600436B, +0xB700436C,0xB800436D,0xB900436E,0xBA00436F,0xBB004370,0xBC004371,0xBD004373,0xBE004374,0xBF004375,0x000C41DB, +0x000C41D8,0x000C41D5,0x000C41D2,0x000C41CF,0x000C41CC,0x000C41C9,0xE1004225,0x000C41C6,0x000C41C3,0x000C41C0, +0x80004379,0x8100437A,0x8200437B,0x000C41BD,0x000C41BA,0x000C41B7,0x850042F3,0x000C41B4,0x8600430A,0x8700432F, +0x000C41B1,0x000C41AE,0x000C41AB,0x000C41A8,0x000C41A5,0x000C41A2,0x000C419F,0x000C419C,0x000C4199,0x000C4196, +0x000C4193,0x000C4190,0x000C418D,0xE10042F7,0x000C418A,0x000C4187,0x000C4184,0x000C4181,0x000C417E,0xE1004235, +0xA100437D,0xA20043CD,0xA30043EF,0xA4004441,0xA500447B,0xA60044B2,0xA70044D7,0xA8004529,0xA9004560,0xAA00459A, +0xAB0045D4,0xAC004611,0xAD00464B,0xAE004685,0xAF0046BC,0xB00046F6,0xB1004730,0xB200476A,0xB30047A4,0xB40047E1, +0xB500481B,0x000C417B,0x000C4178,0x000C4175,0x000C4172,0x000C416F,0x000C416C,0x800043CA,0x810043CB,0x820043CC, +0xA8004380,0xA9004381,0xAA004382,0xAB004383,0xAC004384,0xAD004385,0xAE004386,0xAF004387,0xB0004388,0xB1004389, +0xB200438A,0xB300438B,0xB400438C,0xB500438E,0xB600438F,0xB7004390,0xB8004391,0xB9004392,0xBA0043A9,0xBB0043AA, +0xBC0043AB,0xBD0043AC,0xBE0043AD,0xBF0043AE,0x000C4169,0x000C4166,0x000C4163,0x000C4160,0x000C415D,0x000C415A, +0x8600434B,0x87004369,0x000C4157,0x000C4154,0x000C4151,0x000C414E,0x000C414B,0x000C4148,0x000C4145,0x000C4142, +0x000C413F,0x000C413C,0x000C4139,0x000C4136,0x000C4133,0x000C4130,0x000C412D,0x000C412A,0x000C4127,0x000C4124, +0x000C4121,0x000C411E,0xE1004296,0x000C411B,0x000C4118,0x800043EC,0x810043ED,0x820043EE,0x000C4115,0x000C4112, +0x000C410F,0x000C410C,0x86004363,0x870043BB,0x000C4109,0xA80043CE,0xA90043CF,0xAA0043D2,0xAB0043D3,0xAC0043D4, +0xAD0043D5,0xAE0043D6,0xAF0043D7,0xB00043D8,0xB10043D9,0xB20043DA,0xB30043DB,0xB40043DC,0xB50043DD,0xB60043DE, +0xB70043DF,0xB80043E0,0xB90043E1,0xBA0043E2,0xBB0043E3,0xBC0043E4,0xBD0043E5,0xBE0043E7,0xBF0043E8,0xA80043F2, +0xA9004424,0xAA004425,0xAB004426,0xAC004427,0xAD004428,0xAE004429,0xAF00442A,0xB000442B,0xB100442C,0xB200442D, +0xB300442E,0xB400442F,0xB5004430,0xB6004431,0xB7004432,0xB8004433,0xB9004434,0xBA004435,0xBB004436,0xBC004437, +0xBD004438,0xBE004439,0xBF00443A,0xE10042C4,0x000C4106,0x000C4103,0x000C4100,0x000C40FD,0x000C40FA,0x000C40F7, +0x000C40F4,0x000C40F1,0x000C40EE,0x000C40EB,0x000C40E8,0x000C40E5,0x000C40E2,0x000C40DF,0x000C40DC,0x000C40D9, +0x000C40D6,0x000C40D3,0x000C40D0,0x000C40CD,0x000C40CA,0x000C40C7,0x000C40C4,0x8000443E,0x8100443F,0x82004440, +0x000C40C1,0x000C40BE,0x000C40BB,0x000C40B8,0x8600439C,0x870043F5,0xA800445C,0xA900445D,0xAA00445F,0xAB004460, +0xAC004461,0xAD004462,0xAE004463,0xAF004464,0xB0004465,0xB1004466,0xB2004467,0xB3004468,0xB4004469,0xB500446A, +0xB600446B,0xB700446C,0xB800446D,0xB900446E,0xBA00446F,0xBB004470,0xBC004471,0xBD004472,0xBE004473,0xBF004474, +0x000C40B5,0x000C40B2,0xE10042F8,0x000C40AF,0x000C40AC,0x000C40A9,0x000C40A6,0x000C40A3,0x000C40A0,0x000C409D, +0x000C409A,0x000C4097,0x000C4094,0x000C4091,0x000C408E,0x000C408B,0x000C4088,0x000C4085,0x000C4082,0x000C407F, +0x000C407C,0x000C4079,0x000C4076,0x000C4073,0x000C4070,0x80004478,0x81004479,0x8200447A,0x000C406D,0x000C406A, +0x000C4067,0x000C4064,0x860043E6,0x8700443B,0x000C4061,0x000C405E,0x000C405B,0x000C4058,0x000C4055,0x000C4052, +0x000C404F,0x000C404C,0x000C4049,0x000C4046,0x000C4043,0x000C4040,0x000C403D,0x000C403A,0x000C4037,0x000C4034, +0xA800447E,0xA900447F,0xAA004480,0xAB004481,0xAC004482,0xAD004483,0xAE004484,0xAF004485,0xB0004486,0xB1004487, +0xB2004488,0xB3004489,0xB400448A,0xB500448B,0xB600448C,0xB700448D,0xB80044A6,0xB90044A7,0xBA0044A8,0xBB0044A9, +0xBC0044AA,0xBD0044AB,0xBE0044AC,0xBF0044AD,0x000C4031,0x000C402E,0x000C402B,0x000C4028,0x000C4025,0x000C4022, +0x000C401F,0x000C401C,0xE100434A,0x000C4019,0x000C4016,0x000C4013,0x000C4010,0x000C400D,0x000C400A,0x000C4007, +0x000C4004,0x000C4001,0x000C3FFE,0x000C3FFB,0x000C3FF8,0x800044AF,0x810044B0,0x820044B1,0x000C3FF5,0x000C3FF2, +0x000C3FEF,0x000C3FEC,0x8600443D,0x87004451,0x000C3FE9,0x000C3FE6,0x000C3FE3,0x000C3FE0,0x000C3FDD,0x000C3FDA, +0x000C3FD7,0x000C3FD4,0x000C3FD1,0x000C3FCE,0x000C3FCB,0x000C3FC8,0xE100436A,0x800044D4,0x810044D5,0x820044D6, +0x000C3FC5,0x000C3FC2,0x000C3FBF,0x000C3FBC,0x86004455,0x870044A3,0x000C3FB9,0x000C3FB6,0x000C3FB3,0x000C3FB0, +0x000C3FAD,0x000C3FAA,0x000C3FA7,0x000C3FA4,0x000C3FA1,0x000C3F9E,0x000C3F9B,0xA80044B3,0xA90044B4,0xAA0044B5, +0xAB0044B6,0xAC0044B7,0xAD0044B8,0xAE0044B9,0xAF0044BA,0xB00044BE,0xB10044BF,0xB20044C0,0xB30044C1,0xB40044C4, +0xB50044C5,0xB60044C6,0xB70044C7,0xB80044C8,0xB90044C9,0xBA0044CA,0xBB0044CB,0xBC0044CC,0xBD0044CD,0xBE0044CE, +0xBF0044CF,0xA80044DA,0xA90044DB,0xAA0044DC,0xAB0044DD,0xAC0044DE,0xAD0044DF,0xAE0044E0,0xAF0044E1,0xB00044E2, +0xB10044E3,0xB20044E4,0xB3004515,0xB4004516,0xB5004517,0xB6004518,0xB7004519,0xB800451A,0xB900451B,0xBA00451C, +0xBB00451D,0xBC00451E,0xBD00451F,0xBE004520,0xBF004521,0x000C3F98,0x000C3F95,0x000C3F92,0x000C3F8F,0x000C3F8C, +0x000C3F89,0x000C3F86,0x000C3F83,0x000C3F80,0x000C3F7D,0x000C3F7A,0x000C3F77,0x000C3F74,0xE10043BC,0x80004526, +0x81004527,0x82004528,0x000C3F71,0x000C3F6E,0x000C3F6B,0x000C3F68,0x8600448E,0x870044E5,0x000C3F65,0x000C3F62, +0x000C3F5F,0x000C3F5C,0x000C3F59,0x000C3F56,0x000C3F53,0x000C3F50,0x000C3F4D,0x000C3F4A,0xA800452C,0xA900452D, +0xAA00452E,0xAB00452F,0xAC004530,0xAD004531,0xAE004532,0xAF004533,0xB0004534,0xB1004535,0xB200454E,0xB300454F, +0xB4004550,0xB5004551,0xB6004552,0xB7004553,0xB8004554,0xB9004555,0xBA004556,0xBB004557,0xBC004558,0xBD004559, +0xBE00455A,0xBF00455B,0x000C3F47,0x000C3F44,0x000C3F41,0x000C3F3E,0x000C3F3B,0x000C3F38,0x000C3F35,0x000C3F32, +0x000C3F2F,0x000C3F2C,0x000C3F29,0x000C3F26,0x000C3F23,0x000C3F20,0xE10043F6,0x000C3F1D,0x000C3F1A,0x000C3F17, +0x000C3F14,0x000C3F11,0x000C3F0E,0x000C3F0B,0x000C3F08,0x8000455D,0x8100455E,0x8200455F,0x000C3F05,0x000C3F02, +0x000C3EFF,0x000C3EFC,0x860044D0,0x87004522,0x000C3EF9,0x000C3EF6,0x000C3EF3,0x000C3EF0,0x000C3EED,0x000C3EEA, +0x000C3EE7,0x000C3EE4,0x000C3EE1,0x000C3EDE,0xA8004561,0xA9004562,0xAA004563,0xAB004564,0xAC004568,0xAD004569, +0xAE00456A,0xAF00456B,0xB000456E,0xB100456F,0xB2004570,0xB3004571,0xB4004572,0xB5004573,0xB6004574,0xB7004575, +0xB8004576,0xB9004577,0xBA004590,0xBB004591,0xBC004592,0xBD004594,0xBE004595,0xBF004596,0x000C3EDB,0x000C3ED8, +0x000C3ED5,0xE100443C,0x000C3ED2,0x000C3ECF,0x000C3ECC,0x000C3EC9,0x000C3EC6,0x000C3EC3,0x000C3EC0,0x000C3EBD, +0x000C3EBA,0x000C3EB7,0x000C3EB4,0x000C3EB1,0x000C3EAE,0x000C3EAB,0x80004597,0x81004598,0x82004599,0x000C3EA8, +0x000C3EA5,0x000C3EA2,0x000C3E9F,0x86004511,0x8700455C,0x000C3E9C,0x000C3E99,0x000C3E96,0x000C3E93,0x000C3E90, +0x000C3E8D,0x000C3E8A,0x000C3E87,0x000C3E84,0x000C3E81,0x000C3E7E,0x000C3E7B,0x000C3E78,0xE1004452,0xA800459B, +0xA900459C,0xAA00459D,0xAB00459E,0xAC00459F,0xAD0045A0,0xAE0045A1,0xAF0045A5,0xB00045A6,0xB10045A7,0xB20045A8, +0xB30045AB,0xB40045AC,0xB50045AD,0xB60045AE,0xB70045AF,0xB80045B0,0xB90045B1,0xBA0045B2,0xBB0045B3,0xBC0045B4, +0xBD0045B5,0xBE0045B6,0xBF0045B7,0x000C3E75,0x000C3E72,0x000C3E6F,0x000C3E6C,0x000C3E69,0x000C3E66,0x000C3E63, +0x000C3E60,0x000C3E5D,0x000C3E5A,0x000C3E57,0x800045D1,0x810045D2,0x820045D3,0x000C3E54,0x000C3E51,0x000C3E4E, +0x000C3E4B,0x000C3E48,0x000C3E45,0x000C3E42,0x000C3E3F,0x000C3E3C,0x000C3E39,0x000C3E36,0x000C3E33,0x86004545, +0x8700458B,0xA80045D5,0xA90045D6,0xAA0045D7,0xAB0045D8,0xAC0045D9,0xAD0045DA,0xAE0045DB,0xAF0045DF,0xB00045E0, +0xB10045E1,0xB20045E2,0xB30045E3,0xB40045E4,0xB50045E5,0xB60045E6,0xB70045E7,0xB80045E8,0xB90045E9,0xBA0045EA, +0xBB004605,0xBC004606,0xBD004607,0xBE004608,0xBF004609,0x000C3E30,0x000C3E2D,0x000C3E2A,0x000C3E27,0x000C3E24, +0xE10044A4,0x8000460E,0x8100460F,0x82004610,0x000C3E21,0x000C3E1E,0x000C3E1B,0x000C3E18,0x8600456C,0x870045C5, +0xA800462C,0xA900462D,0xAA00462E,0xAB00462F,0xAC004630,0xAD004631,0xAE004632,0xAF004633,0xB0004634,0xB1004635, +0xB2004636,0xB3004637,0xB4004638,0xB5004639,0xB600463A,0xB700463B,0xB800463C,0xB900463D,0xBA00463E,0xBB00463F, +0xBC004640,0xBD004642,0xBE004643,0xBF004644,0x000C3E15,0x000C3E12,0x000C3E0F,0x000C3E0C,0x000C3E09,0x000C3E06, +0x000C3E03,0x000C3E00,0x000C3DFD,0x000C3DFA,0x000C3DF7,0x000C3DF4,0x000C3DF1,0x000C3DEE,0x000C3DEB,0x000C3DE8, +0x000C3DE5,0x000C3DE2,0x000C3DDF,0x000C3DDC,0x000C3DD9,0xE10044E6,0x000C3DD6,0x000C3DD3,0x000C3DD0,0x80004648, +0x81004649,0x8200464A,0x000C3DCD,0x000C3DCA,0x000C3DC7,0x000C3DC4,0x860045A9,0x870045FF,0x000C3DC1,0x000C3DBE, +0x000C3DBB,0xA800464E,0xA900464F,0xAA004650,0xAB004669,0xAC00466A,0xAD00466B,0xAE00466C,0xAF00466D,0xB000466E, +0xB100466F,0xB2004670,0xB3004671,0xB4004672,0xB5004673,0xB6004674,0xB7004675,0xB8004676,0xB9004677,0xBA004678, +0xBB004679,0xBC00467A,0xBD00467C,0xBE00467D,0xBF00467E,0x000C3DB8,0x000C3DB5,0x000C3DB2,0x000C3DAF,0x000C3DAC, +0x000C3DA9,0x000C3DA6,0x000C3DA3,0x000C3DA0,0x000C3D9D,0x000C3D9A,0x000C3D97,0x000C3D94,0x000C3D91,0x000C3D8E, +0x000C3D8B,0x000C3D88,0x000C3D85,0xE1004523,0x000C3D82,0x000C3D7F,0x000C3D7C,0x80004682,0x81004683,0x82004684, +0x000C3D79,0x000C3D76,0x000C3D73,0x000C3D70,0x860045EB,0x87004641,0x000C3D6D,0x000C3D6A,0x000C3D67,0x000C3D64, +0x000C3D61,0x000C3D5E,0x000C3D5B,0x000C3D58,0x000C3D55,0x000C3D52,0x000C3D4F,0xA8004688,0xA9004689,0xAA00468A, +0xAB00468B,0xAC00468C,0xAD00468D,0xAE00468E,0xAF00468F,0xB0004690,0xB1004691,0xB2004692,0xB30046AB,0xB40046AC, +0xB50046AD,0xB60046AE,0xB70046AF,0xB80046B0,0xB90046B1,0xBA0046B2,0xBB0046B3,0xBC0046B4,0xBD0046B6,0xBE0046B7, +0xBF0046B8,0x000C3D4C,0x000C3D49,0x000C3D46,0x000C3D43,0x000C3D40,0x000C3D3D,0x000C3D3A,0x000C3D37,0x000C3D34, +0x000C3D31,0xE1004565,0x000C3D2E,0x000C3D2B,0x000C3D28,0x000C3D25,0x000C3D22,0x000C3D1F,0x000C3D1C,0x000C3D19, +0x000C3D16,0x000C3D13,0x000C3D10,0x800046B9,0x810046BA,0x820046BB,0x000C3D0D,0x000C3D0A,0x000C3D07,0x000C3D04, +0x000C3D01,0x000C3CFE,0x000C3CFB,0x86004625,0x8700467B,0xA80046BD,0xA90046BE,0xAA0046BF,0xAB0046C0,0xAC0046C4, +0xAD0046C5,0xAE0046C6,0xAF0046C7,0xB00046C8,0xB10046C9,0xB20046CA,0xB30046E5,0xB40046E6,0xB50046E7,0xB60046E8, +0xB70046E9,0xB80046EA,0xB90046EB,0xBA0046EC,0xBB0046ED,0xBC0046EE,0xBD0046EF,0xBE0046F0,0xBF0046F1,0x000C3CF8, +0x000C3CF5,0x000C3CF2,0x000C3CEF,0x000C3CEC,0x000C3CE9,0x000C3CE6,0x000C3CE3,0x000C3CE0,0x000C3CDD,0x000C3CDA, +0x000C3CD7,0x000C3CD4,0xE100458C,0x000C3CD1,0x000C3CCE,0x000C3CCB,0x000C3CC8,0x000C3CC5,0x000C3CC2,0x000C3CBF, +0x000C3CBC,0x800046F3,0x810046F4,0x820046F5,0x000C3CB9,0x000C3CB6,0x000C3CB3,0x000C3CB0,0x000C3CAD,0x000C3CAA, +0x000C3CA7,0x8600465F,0x870046B5,0xA80046F7,0xA90046F8,0xAA0046F9,0xAB0046FA,0xAC0046FE,0xAD0046FF,0xAE004700, +0xAF004701,0xB0004702,0xB1004703,0xB2004704,0xB300471F,0xB4004720,0xB5004721,0xB6004722,0xB7004723,0xB8004724, +0xB9004725,0xBA004726,0xBB004727,0xBC004728,0xBD004729,0xBE00472A,0xBF00472B,0x000C3CA4,0x000C3CA1,0x000C3C9E, +0x000C3C9B,0x000C3C98,0x000C3C95,0x000C3C92,0x000C3C8F,0x000C3C8C,0x000C3C89,0x000C3C86,0x000C3C83,0x000C3C80, +0xE10045C6,0x000C3C7D,0x000C3C7A,0x000C3C77,0x000C3C74,0x000C3C71,0x000C3C6E,0x000C3C6B,0x000C3C68,0x8000472D, +0x8100472E,0x8200472F,0x000C3C65,0x000C3C62,0x000C3C5F,0x000C3C5C,0x000C3C59,0x000C3C56,0x000C3C53,0x000C3C50, +0x000C3C4D,0x000C3C4A,0x000C3C47,0x000C3C44,0x000C3C41,0x000C3C3E,0x000C3C3B,0x860046A1,0x870046F2,0xA8004731, +0xA9004732,0xAA004733,0xAB004734,0xAC004738,0xAD004739,0xAE00473A,0xAF00473B,0xB000473C,0xB100473D,0xB200473E, +0xB300473F,0xB4004740,0xB5004741,0xB6004742,0xB7004743,0xB8004744,0xB9004745,0xBA004746,0xBB004761,0xBC004762, +0xBD004763,0xBE004764,0xBF004765,0x000C3C38,0x000C3C35,0x000C3C32,0x000C3C2F,0x000C3C2C,0xE1004600,0x000C3C29, +0x000C3C26,0x000C3C23,0x000C3C20,0x000C3C1D,0x000C3C1A,0x000C3C17,0x000C3C14,0x000C3C11,0x000C3C0E,0x000C3C0B, +0x80004767,0x81004768,0x82004769,0x000C3C08,0x000C3C05,0x000C3C02,0x000C3BFF,0x000C3BFC,0x000C3BF9,0x000C3BF6, +0x000C3BF3,0x000C3BF0,0x000C3BED,0x000C3BEA,0x000C3BE7,0x860046DB,0x8700472C,0xA800476B,0xA900476C,0xAA00476D, +0xAB00476E,0xAC00476F,0xAD004770,0xAE004771,0xAF004775,0xB0004776,0xB1004777,0xB2004778,0xB3004779,0xB400477A, +0xB500477B,0xB600477C,0xB700477D,0xB800477E,0xB900477F,0xBA004780,0xBB00479B,0xBC00479C,0xBD00479E,0xBE00479F, +0xBF0047A0,0x000C3BE4,0x000C3BE1,0xE1004645,0x000C3BDE,0x000C3BDB,0x000C3BD8,0x000C3BD5,0x000C3BD2,0x000C3BCF, +0x000C3BCC,0x000C3BC9,0x000C3BC6,0x000C3BC3,0x000C3BC0,0x000C3BBD,0x000C3BBA,0x000C3BB7,0x800047A1,0x810047A2, +0x820047A3,0x000C3BB4,0x000C3BB1,0x000C3BAE,0x000C3BAB,0x000C3BA8,0x000C3BA5,0x000C3BA2,0x000C3B9F,0x000C3B9C, +0x000C3B99,0x000C3B96,0x000C3B93,0x86004715,0x8700475B,0xA80047A5,0xA90047A6,0xAA0047A7,0xAB0047A8,0xAC0047A9, +0xAD0047AA,0xAE0047AB,0xAF0047AF,0xB00047B0,0xB10047B1,0xB20047B2,0xB30047B3,0xB40047B4,0xB50047B5,0xB60047B6, +0xB70047B7,0xB80047B8,0xB90047B9,0xBA0047BA,0xBB0047D5,0xBC0047D6,0xBD0047D8,0xBE0047D9,0xBF0047DA,0x000C3B90, +0x000C3B8D,0xE100467F,0x000C3B8A,0x000C3B87,0x000C3B84,0x800047DE,0x810047DF,0x820047E0,0x000C3B81,0x000C3B7E, +0x000C3B7B,0x000C3B78,0x86004747,0x87004795,0x000C3B75,0x000C3B72,0x000C3B6F,0x000C3B6C,0x000C3B69,0x000C3B66, +0x000C3B63,0x000C3B60,0x000C3B5D,0x000C3B5A,0x000C3B57,0xA80047E4,0xA90047E5,0xAA0047E6,0xAB0047E7,0xAC0047E8, +0xAD0047E9,0xAE0047EA,0xAF0047EB,0xB00047EC,0xB10047ED,0xB20047EE,0xB3004807,0xB4004808,0xB5004809,0xB600480A, +0xB700480B,0xB800480C,0xB900480D,0xBA00480E,0xBB00480F,0xBC004810,0xBD004812,0xBE004813,0xBF004814,0x000C3B54, +0x000C3B51,0x000C3B4E,0x000C3B4B,0x000C3B48,0x000C3B45,0x000C3B42,0x000C3B3F,0x000C3B3C,0x000C3B39,0xE10046C1, +0x000C3B36,0x000C3B33,0x000C3B30,0x80004818,0x81004819,0x8200481A,0x000C3B2D,0x000C3B2A,0x000C3B27,0x000C3B24, +0x86004781,0x870047CF,0x000C3B21,0x000C3B1E,0x000C3B1B,0x000C3B18,0x000C3B15,0x000C3B12,0x000C3B0F,0x000C3B0C, +0x000C3B09,0x000C3B06,0x000C3B03,0xA800481E,0xA900481F,0xAA004820,0xAB004821,0xAC004822,0xAD004823,0xAE004824, +0xAF004825,0xB0004826,0xB1004827,0xB2004828,0xB3004841,0xB4004842,0xB5004843,0xB6004844,0xB7004845,0xB8004846, +0xB9004847,0xBA004848,0xBB004849,0xBC00484A,0xBD00484C,0xBE00484D,0xBF00484E,0x000C3B00,0x000C3AFD,0x000C3AFA, +0x000C3AF7,0x000C3AF4,0x000C3AF1,0x000C3AEE,0x000C3AEB,0x000C3AE8,0x000C3AE5,0xE10046FB,0x000C3AE2,0x000C3ADF, +0x000C3ADC,0x80004852,0x81004853,0x82004854,0x000C3AD9,0x000C3AD6,0x000C3AD3,0xE10047D1,0x850047BB,0x000C3AD0, +0x860047E2,0x87004829,0x000C3ACD,0x000C3ACA,0xA1004857,0xA20048A3,0xA30048E0,0xA400491A,0xA5004954,0xA600498E, +0xA70049C8,0xA80049FF,0xA9004A3C,0xAA004A76,0xAB004AAD,0xAC004AE7,0xAD004B24,0xAE004B5B,0xAF004B95,0xB0004BCF, +0xB1004C0C,0xB2004C43,0xB3004C64,0xB4004CB7,0xB5004CF4,0x000C3AC7,0x000C3AC4,0x000C3AC1,0x000C3ABE,0x000C3ABB, +0x000C3AB8,0x000C3AB5,0x000C3AB2,0x000C3AAF,0x000C3AAC,0x000C3AA9,0x000C3AA6,0x000C3AA3,0x000C3AA0,0x000C3A9D, +0x000C3A9A,0x000C3A97,0x000C3A94,0x000C3A91,0x000C3A8E,0xE1004735,0x000C3A8B,0x000C3A88,0x000C3A85,0x000C3A82, +0xA800485A,0xA900485B,0xAA004871,0xAB004872,0xAC004873,0xAD004874,0xAE004875,0xAF004876,0xB0004877,0xB1004878, +0xB2004879,0xB300487A,0xB400487B,0xB500487C,0xB600487D,0xB700487E,0xB800487F,0xB9004880,0xBA004881,0xBB004882, +0xBC004883,0xBD004884,0xBE004886,0xBF004887,0x000C3A7F,0x000C3A7C,0x000C3A79,0x000C3A76,0x000C3A73,0x000C3A70, +0x000C3A6D,0x80004888,0x81004889,0x820048A2,0x000C3A6A,0x000C3A67,0x000C3A64,0x000C3A61,0x8600481C,0x8700485C, +0x000C3A5E,0x000C3A5B,0x000C3A58,0x000C3A55,0x000C3A52,0x000C3A4F,0x000C3A4C,0x000C3A49,0x000C3A46,0x000C3A43, +0x000C3A40,0x000C3A3D,0x000C3A3A,0x000C3A37,0x000C3A34,0x000C3A31,0xE100475C,0x000C3A2E,0xA80048A4,0xA90048A5, +0xAA0048A6,0xAB0048A7,0xAC0048A8,0xAD0048AC,0xAE0048AD,0xAF0048AE,0xB00048AF,0xB10048B2,0xB20048B3,0xB30048B4, +0xB40048B5,0xB50048B6,0xB60048B7,0xB70048B8,0xB80048B9,0xB90048BA,0xBA0048BB,0xBB0048BC,0xBC0048BD,0xBD0048BE, +0xBE0048BF,0xBF0048C0,0x800048C1,0x810048C3,0x820048DF,0x000C3A2B,0x000C3A28,0x000C3A25,0x000C3A22,0x86004855, +0x87004895,0x000C3A1F,0x000C3A1C,0x000C3A19,0x000C3A16,0x000C3A13,0x000C3A10,0x000C3A0D,0x000C3A0A,0x000C3A07, +0x000C3A04,0x000C3A01,0x000C39FE,0x000C39FB,0x000C39F8,0x000C39F5,0x000C39F2,0x000C39EF,0x000C39EC,0x000C39E9, +0x000C39E6,0x000C39E3,0x000C39E0,0x000C39DD,0xE1004796,0xA80048E1,0xA90048E2,0xAA0048E5,0xAB0048E6,0xAC0048E7, +0xAD0048E8,0xAE0048E9,0xAF0048EA,0xB00048EB,0xB10048EC,0xB20048ED,0xB30048EE,0xB40048EF,0xB50048F0,0xB60048F1, +0xB70048F2,0xB80048F3,0xB90048F4,0xBA0048F5,0xBB0048F6,0xBC0048F7,0xBD0048F8,0xBE0048F9,0xBF0048FA,0x800048FB, +0x81004918,0x82004919,0x000C39DA,0x000C39D7,0x000C39D4,0x000C39D1,0x86004891,0x870048D1,0x000C39CE,0x000C39CB, +0x000C39C8,0x000C39C5,0x000C39C2,0x000C39BF,0x000C39BC,0x000C39B9,0x000C39B6,0x000C39B3,0x000C39B0,0x000C39AD, +0x000C39AA,0x000C39A7,0x000C39A4,0x000C39A1,0x000C399E,0x000C399B,0x000C3998,0x000C3995,0x000C3992,0x000C398F, +0x000C398C,0x000C3989,0x000C3986,0x000C3983,0xE10047D2,0xA800491B,0xA900491E,0xAA00491F,0xAB004920,0xAC004921, +0xAD004922,0xAE004923,0xAF004924,0xB0004925,0xB1004926,0xB2004927,0xB3004928,0xB4004929,0xB500492A,0xB600492B, +0xB700492C,0xB800492D,0xB900492E,0xBA00492F,0xBB004930,0xBC004931,0xBD004932,0xBE004933,0xBF004934,0x80004935, +0x81004936,0x82004937,0x000C3980,0x860048B0,0x87004908,0x000C397D,0xA8004957,0xA9004970,0xAA004971,0xAB004972, +0xAC004973,0xAD004974,0xAE004975,0xAF004976,0xB0004977,0xB1004978,0xB2004979,0xB300497A,0xB400497B,0xB500497C, +0xB600497D,0xB700497E,0xB800497F,0xB9004980,0xBA004981,0xBB004982,0xBC004983,0xBD004985,0xBE004986,0xBF004987, +0x000C397A,0x000C3977,0x000C3974,0x000C3971,0x000C396E,0x000C396B,0x000C3968,0x000C3965,0x000C3962,0x000C395F, +0x000C395C,0x000C3959,0x000C3956,0x000C3953,0x000C3950,0x000C394D,0x000C394A,0x000C3947,0x000C3944,0x000C3941, +0xE100482A,0x000C393E,0x000C393B,0x000C3938,0x8000498B,0x8100498C,0x8200498D,0x000C3935,0x000C3932,0x000C392F, +0x000C392C,0x860048FC,0x87004942,0x000C3929,0x000C3926,0x000C3923,0x000C3920,0x000C391D,0x000C391A,0x000C3917, +0x000C3914,0x000C3911,0x000C390E,0x000C390B,0x000C3908,0x000C3905,0x000C3902,0x000C38FF,0x000C38FC,0x000C38F9, +0x000C38F6,0x000C38F3,0xA8004991,0xA9004992,0xAA004993,0xAB004994,0xAC004995,0xAD004996,0xAE004997,0xAF004998, +0xB0004999,0xB100499A,0xB200499B,0xB300499C,0xB400499D,0xB500499E,0xB600499F,0xB70049A0,0xB80049A1,0xB90049A2, +0xBA0049A3,0xBB0049BC,0xBC0049BD,0xBD0049BE,0xBE0049BF,0xBF0049C0,0x000C38F0,0x000C38ED,0x000C38EA,0x000C38E7, +0x000C38E4,0xE100485D,0x800049C5,0x810049C6,0x820049C7,0x000C38E1,0x000C38DE,0x000C38DB,0x000C38D8,0x86004938, +0x87004984,0x000C38D5,0x000C38D2,0x000C38CF,0x000C38CC,0x000C38C9,0x000C38C6,0x000C38C3,0x000C38C0,0x000C38BD, +0x000C38BA,0x000C38B7,0x000C38B4,0x000C38B1,0x000C38AE,0x000C38AB,0x000C38A8,0x000C38A5,0x000C38A2,0x000C389F, +0x000C389C,0x000C3899,0xA80049CB,0xA90049CC,0xAA0049CD,0xAB0049CE,0xAC0049CF,0xAD0049D0,0xAE0049D1,0xAF0049D2, +0xB00049D3,0xB10049D4,0xB20049D5,0xB30049D6,0xB40049D7,0xB50049D8,0xB60049D9,0xB70049DA,0xB80049DB,0xB90049DC, +0xBA0049DD,0xBB0049DE,0xBC0049DF,0xBD0049F8,0xBE0049F9,0xBF0049FA,0x000C3896,0x000C3893,0x000C3890,0xE1004896, +0x000C388D,0x000C388A,0x000C3887,0x000C3884,0x000C3881,0x000C387E,0x000C387B,0x000C3878,0x800049FC,0x810049FD, +0x820049FE,0x000C3875,0x000C3872,0x000C386F,0x000C386C,0x000C3869,0x000C3866,0x000C3863,0x86004968,0x870049B6, +0xA8004A00,0xA9004A01,0xAA004A02,0xAB004A03,0xAC004A07,0xAD004A08,0xAE004A09,0xAF004A0A,0xB0004A0B,0xB1004A0C, +0xB2004A0D,0xB3004A28,0xB4004A29,0xB5004A2A,0xB6004A2B,0xB7004A2C,0xB8004A2D,0xB9004A2E,0xBA004A2F,0xBB004A30, +0xBC004A31,0xBD004A32,0xBE004A33,0xBF004A34,0x000C3860,0x000C385D,0x000C385A,0x000C3857,0x000C3854,0x000C3851, +0x000C384E,0x000C384B,0x000C3848,0x000C3845,0x000C3842,0x000C383F,0x000C383C,0xE10048CF,0x80004A39,0x81004A3A, +0x82004A3B,0x000C3839,0x000C3836,0x000C3833,0x000C3830,0x860049A4,0x870049F0,0x000C382D,0x000C382A,0x000C3827, +0x000C3824,0x000C3821,0x000C381E,0x000C381B,0x000C3818,0x000C3815,0x000C3812,0x000C380F,0x000C380C,0x000C3809, +0xA8004A3F,0xA9004A40,0xAA004A41,0xAB004A42,0xAC004A43,0xAD004A44,0xAE004A45,0xAF004A46,0xB0004A47,0xB1004A48, +0xB2004A49,0xB3004A4A,0xB4004A4B,0xB5004A64,0xB6004A65,0xB7004A66,0xB8004A67,0xB9004A68,0xBA004A69,0xBB004A6A, +0xBC004A6B,0xBD004A6C,0xBE004A6D,0xBF004A6E,0x000C3806,0x000C3803,0x000C3800,0x000C37FD,0x000C37FA,0x000C37F7, +0x000C37F4,0x000C37F1,0x000C37EE,0x000C37EB,0x000C37E8,0xE1004909,0x80004A73,0x81004A74,0x82004A75,0x000C37E5, +0x000C37E2,0x000C37DF,0x000C37DC,0x860049E0,0x87004A35,0x000C37D9,0x000C37D6,0x000C37D3,0x000C37D0,0x000C37CD, +0x000C37CA,0x000C37C7,0x000C37C4,0x000C37C1,0x000C37BE,0x000C37BB,0x000C37B8,0x000C37B5,0x000C37B2,0x000C37AF, +0xA8004A79,0xA9004A7A,0xAA004A7B,0xAB004A7C,0xAC004A7D,0xAD004A7E,0xAE004A7F,0xAF004A80,0xB0004A81,0xB1004A82, +0xB2004A83,0xB3004A84,0xB4004A85,0xB5004A86,0xB6004A87,0xB7004AA0,0xB8004AA1,0xB9004AA2,0xBA004AA3,0xBB004AA4, +0xBC004AA5,0xBD004AA6,0xBE004AA7,0xBF004AA8,0x000C37AC,0x000C37A9,0x000C37A6,0x000C37A3,0x000C37A0,0x000C379D, +0x000C379A,0x000C3797,0x000C3794,0xE1004943,0x000C3791,0x000C378E,0x000C378B,0x000C3788,0x000C3785,0x000C3782, +0x000C377F,0x000C377C,0x000C3779,0x000C3776,0x000C3773,0x80004AAA,0x81004AAB,0x82004AAC,0x000C3770,0x000C376D, +0x000C376A,0x000C3767,0x86004A16,0x87004A6F,0xA8004AAE,0xA9004AAF,0xAA004AB0,0xAB004AB1,0xAC004AB2,0xAD004AB3, +0xAE004AB4,0xAF004AB8,0xB0004AB9,0xB1004ABA,0xB2004ABB,0xB3004AD6,0xB4004AD7,0xB5004AD8,0xB6004AD9,0xB7004ADA, +0xB8004ADB,0xB9004ADC,0xBA004ADD,0xBB004ADE,0xBC004ADF,0xBD004AE1,0xBE004AE2,0xBF004AE3,0x000C3764,0x000C3761, +0x000C375E,0x000C375B,0x000C3758,0x000C3755,0x000C3752,0x000C374F,0x000C374C,0x000C3749,0xE1004988,0x000C3746, +0x000C3743,0x000C3740,0x000C373D,0x000C373A,0x000C3737,0x000C3734,0x86004A4C,0x87004A9E,0x000C3731,0x000C372E, +0x000C372B,0x000C3728,0x000C3725,0x80004AE4,0x81004AE5,0x82004AE6,0x000C3722,0x000C371F,0xA8004AEA,0xA9004AEB, +0xAA004AEC,0xAB004AED,0xAC004AEE,0xAD004AF2,0xAE004AF3,0xAF004B0C,0xB0004B0D,0xB1004B0E,0xB2004B0F,0xB3004B10, +0xB4004B11,0xB5004B12,0xB6004B13,0xB7004B14,0xB8004B15,0xB9004B16,0xBA004B17,0xBB004B18,0xBC004B19,0xBD004B1A, +0xBE004B1B,0xBF004B1C,0x000C371C,0x000C3719,0x000C3716,0x000C3713,0x000C3710,0x000C370D,0x000C370A,0x000C3707, +0x000C3704,0x000C3701,0x000C36FE,0x000C36FB,0x000C36F8,0x000C36F5,0x000C36F2,0x000C36EF,0x000C36EC,0xE10049B7, +0x80004B21,0x81004B22,0x82004B23,0x000C36E9,0x000C36E6,0x000C36E3,0x000C36E0,0x86004A88,0x87004AE0,0x000C36DD, +0x000C36DA,0x000C36D7,0x000C36D4,0x000C36D1,0x000C36CE,0x000C36CB,0x000C36C8,0x000C36C5,0xA8004B27,0xA9004B28, +0xAA004B29,0xAB004B2A,0xAC004B2B,0xAD004B2C,0xAE004B2D,0xAF004B2E,0xB0004B2F,0xB1004B48,0xB2004B49,0xB3004B4A, +0xB4004B4B,0xB5004B4C,0xB6004B4D,0xB7004B4E,0xB8004B4F,0xB9004B50,0xBA004B51,0xBB004B52,0xBC004B53,0xBD004B54, +0xBE004B55,0xBF004B56,0x000C36C2,0x000C36BF,0x000C36BC,0x000C36B9,0x000C36B6,0x000C36B3,0x000C36B0,0x000C36AD, +0x000C36AA,0x000C36A7,0x000C36A4,0x000C36A1,0x000C369E,0x000C369B,0x000C3698,0xE10049F1,0x000C3695,0x000C3692, +0x000C368F,0x000C368C,0x000C3689,0x000C3686,0x000C3683,0x000C3680,0x80004B58,0x81004B59,0x82004B5A,0x000C367D, +0x000C367A,0x000C3677,0x000C3674,0x000C3671,0x000C366E,0x000C366B,0x000C3668,0x000C3665,0x000C3662,0x000C365F, +0x86004AC8,0x87004B1D,0xA8004B5C,0xA9004B5D,0xAA004B5E,0xAB004B5F,0xAC004B63,0xAD004B64,0xAE004B65,0xAF004B66, +0xB0004B67,0xB1004B68,0xB2004B69,0xB3004B6A,0xB4004B6B,0xB5004B6C,0xB6004B6D,0xB7004B88,0xB8004B89,0xB9004B8A, +0xBA004B8B,0xBB004B8C,0xBC004B8D,0xBD004B8F,0xBE004B90,0xBF004B91,0x000C365C,0x000C3659,0x000C3656,0x000C3653, +0x000C3650,0x000C364D,0xE1004A36,0x000C364A,0x000C3647,0x000C3644,0x000C3641,0x000C363E,0x000C363B,0x000C3638, +0x000C3635,0x000C3632,0x000C362F,0x000C362C,0x000C3629,0x000C3626,0x000C3623,0x80004B92,0x81004B93,0x82004B94, +0x000C3620,0x000C361D,0x000C361A,0x000C3617,0x86004AFE,0x87004B57,0xA8004B96,0xA9004B97,0xAA004B98,0xAB004B99, +0xAC004B9A,0xAD004B9B,0xAE004B9C,0xAF004BA0,0xB0004BA1,0xB1004BA2,0xB2004BA3,0xB3004BBE,0xB4004BBF,0xB5004BC0, +0xB6004BC1,0xB7004BC2,0xB8004BC3,0xB9004BC4,0xBA004BC5,0xBB004BC6,0xBC004BC7,0xBD004BC9,0xBE004BCA,0xBF004BCB, +0x000C3614,0x000C3611,0x000C360E,0x000C360B,0x000C3608,0x000C3605,0x000C3602,0x000C35FF,0x000C35FC,0x000C35F9, +0xE1004A62,0x000C35F6,0x000C35F3,0x000C35F0,0x000C35ED,0x000C35EA,0x000C35E7,0x000C35E4,0x000C35E1,0x000C35DE, +0x000C35DB,0x000C35D8,0x000C35D5,0x000C35D2,0x000C35CF,0x80004BCC,0x81004BCD,0x82004BCE,0x000C35CC,0x000C35C9, +0x000C35C6,0x000C35C3,0x000C35C0,0x000C35BD,0x000C35BA,0x000C35B7,0x000C35B4,0x000C35B1,0x000C35AE,0x000C35AB, +0x86004B40,0x87004B86,0xA8004BD0,0xA9004BD1,0xAA004BD2,0xAB004BD3,0xAC004BD4,0xAD004BD5,0xAE004BD6,0xAF004BDA, +0xB0004BDB,0xB1004BDC,0xB2004BDD,0xB3004BDE,0xB4004BDF,0xB5004BE0,0xB6004BE1,0xB7004BE2,0xB8004BE3,0xB9004BE4, +0xBA004BE5,0xBB004C00,0xBC004C01,0xBD004C02,0xBE004C03,0xBF004C04,0x000C35A8,0x000C35A5,0x000C35A2,0x000C359F, +0x000C359C,0xE1004A9F,0x80004C09,0x81004C0A,0x82004C0B,0x000C3599,0x000C3596,0x000C3593,0x000C3590,0x86004B6E, +0x87004BC8,0x000C358D,0x000C358A,0x000C3587,0x000C3584,0x000C3581,0x000C357E,0x000C357B,0xA8004C0F,0xA9004C10, +0xAA004C11,0xAB004C12,0xAC004C13,0xAD004C14,0xAE004C15,0xAF004C2E,0xB0004C2F,0xB1004C30,0xB2004C31,0xB3004C32, +0xB4004C33,0xB5004C34,0xB6004C35,0xB7004C36,0xB8004C37,0xB9004C38,0xBA004C39,0xBB004C3A,0xBC004C3B,0xBD004C3D, +0xBE004C3E,0xBF004C3F,0x000C3578,0x000C3575,0x000C3572,0x000C356F,0x000C356C,0x000C3569,0x000C3566,0x000C3563, +0x000C3560,0x000C355D,0x000C355A,0x000C3557,0x000C3554,0x000C3551,0xE1004AE8,0x000C354E,0x000C354B,0x000C3548, +0x000C3545,0x000C3542,0x000C353F,0x000C353C,0x000C3539,0x000C3536,0x000C3533,0x000C3530,0x80004C40,0x81004C41, +0x82004C42,0x000C352D,0x000C352A,0x000C3527,0x000C3524,0x000C3521,0x000C351E,0x000C351B,0x000C3518,0x000C3515, +0x000C3512,0x000C350F,0x000C350C,0x000C3509,0x000C3506,0x000C3503,0x000C3500,0x000C34FD,0x000C34FA,0x86004BD8, +0x87004BE6,0x000C34F7,0x000C34F4,0x000C34F1,0x000C34EE,0x000C34EB,0x000C34E8,0x000C34E5,0x80004C61,0x81004C62, +0x82004C63,0x000C34E2,0x000C34DF,0x000C34DC,0x000C34D9,0x86004BF0,0x87004C3C,0x000C34D6,0x000C34D3,0x000C34D0, +0x000C34CD,0x000C34CA,0x000C34C7,0x000C34C4,0xE1004B1E,0x000C34C1,0x000C34BE,0x000C34BB,0x000C34B8,0x000C34B5, +0x000C34B2,0x000C34AF,0x000C34AC,0x000C34A9,0xA8004C44,0xA9004C45,0xAA004C46,0xAB004C47,0xAC004C4B,0xAD004C4C, +0xAE004C4D,0xAF004C4E,0xB0004C4F,0xB1004C50,0xB2004C51,0xB3004C52,0xB4004C53,0xB5004C54,0xB6004C55,0xB7004C56, +0xB8004C57,0xB9004C58,0xBA004C59,0xBB004C5A,0xBC004C5B,0xBD004C5C,0xBE004C5F,0xBF004C60,0xA8004C65,0xA9004C69, +0xAA004C6A,0xAB004C6B,0xAC004C6C,0xAD004C6F,0xAE004C70,0xAF004C71,0xB0004C72,0xB1004C73,0xB2004C74,0xB3004C75, +0xB4004C77,0xB5004C78,0xB6004C79,0xB7004C7A,0xB8004C7B,0xB9004C7C,0xBA004C7D,0xBB004C7E,0xBC004C7F,0xBD004CB1, +0xBE004CB2,0xBF004CB3,0xE1004B60,0x000C34A6,0x000C34A3,0x000C34A0,0x000C349D,0x000C349A,0x000C3497,0x000C3494, +0x000C3491,0x000C348E,0x000C348B,0x000C3488,0x80004CB4,0x81004CB5,0x82004CB6,0x000C3485,0x000C3482,0x000C347F, +0x000C347C,0x000C3479,0x000C3476,0x000C3473,0x000C3470,0x000C346D,0x000C346A,0x000C3467,0x000C3464,0x000C3461, +0x000C345E,0x000C345B,0x86004C28,0x87004C6E,0xA8004CB8,0xA9004CB9,0xAA004CBA,0xAB004CBB,0xAC004CBF,0xAD004CC0, +0xAE004CC1,0xAF004CC2,0xB0004CC3,0xB1004CC4,0xB2004CC5,0xB3004CC6,0xB4004CC7,0xB5004CC8,0xB6004CC9,0xB7004CCA, +0xB8004CCB,0xB9004CCC,0xBA004CCD,0xBB004CE8,0xBC004CE9,0xBD004CEA,0xBE004CEB,0xBF004CEC,0x000C3458,0x000C3455, +0x000C3452,0x000C344F,0x000C344C,0xE1004B87,0x80004CF1,0x81004CF2,0x82004CF3,0x000C3449,0x000C3446,0x000C3443, +0x000C3440,0x000C343D,0x000C343A,0x000C3437,0x000C3434,0x000C3431,0x000C342E,0x000C342B,0x86004C5D,0x87004CA8, +0x000C3428,0x000C3425,0x000C3422,0x000C341F,0x000C341C,0x000C3419,0x000C3416,0xA8004CF5,0xA9004CF6,0xAA004CF7, +0xAB004CF8,0xAC004CF9,0xAD004CFA,0xAE004CFB,0xAF004CFE,0xB0004CFF,0xB1004D00,0xB2004D01,0xB3004D02,0xB4004D03, +0xB5004D04,0xB6004D1D,0xB7004D1E,0xB8004D1F,0xB9004D20,0xBA004D21,0xBB004D22,0xBC004D23,0xBD004D25,0xBE004D26, +0xBF004D27,0x000C3413,0x000C3410,0x000C340D,0x000C340A,0x000C3407,0x000C3404,0x000C3401,0xE1004BD7,0x000C33FE, +0x000C33FB,0x000C33F8,0x80004D2B,0x81004D2C,0x82004D2D,0x000C33F5,0x000C33F2,0x000C33EF,0x85004CA5,0x000C33EC, +0x86004CBC,0x87004CE1,0x000C33E9,0x000C33E6,0x000C33E3,0x000C33E0,0x000C33DD,0x000C33DA,0x000C33D7,0x000C33D4, +0x000C33D1,0x000C33CE,0x000C33CB,0x000C33C8,0x000C33C5,0xE1004CA9,0x000C33C2,0x000C33BF,0x000C33BC,0x000C33B9, +0x000C33B6,0xE1004BE7,0xA1004D2F,0xA2004D7F,0xA3004DA1,0xA4004DF3,0xA5004E2D,0xA6004E64,0xA7004E89,0xA8004EDB, +0xA9004F12,0xAA004F4C,0xAB004F86,0xAC004FC3,0xAD004FFD,0xAE005037,0xAF00506E,0xB00050A8,0xB10050E2,0xB200511C, +0xB3005156,0xB4005193,0xB50051CD,0x000C33B3,0x000C33B0,0x000C33AD,0x000C33AA,0x000C33A7,0x000C33A4,0x80004D7C, +0x81004D7D,0x82004D7E,0xA8004D32,0xA9004D33,0xAA004D34,0xAB004D35,0xAC004D36,0xAD004D37,0xAE004D38,0xAF004D39, +0xB0004D3A,0xB1004D3B,0xB2004D3C,0xB3004D3D,0xB4004D3E,0xB5004D40,0xB6004D41,0xB7004D42,0xB8004D43,0xB9004D44, +0xBA004D5B,0xBB004D5C,0xBC004D5D,0xBD004D5E,0xBE004D5F,0xBF004D60,0x000C33A1,0x000C339E,0x000C339B,0x000C3398, +0x000C3395,0x000C3392,0x86004CFD,0x87004D1B,0x000C338F,0x000C338C,0x000C3389,0x000C3386,0x000C3383,0x000C3380, +0x000C337D,0x000C337A,0x000C3377,0x000C3374,0x000C3371,0x000C336E,0x000C336B,0x000C3368,0x000C3365,0x000C3362, +0x000C335F,0x000C335C,0x000C3359,0x000C3356,0xE1004C48,0x000C3353,0x000C3350,0x80004D9E,0x81004D9F,0x82004DA0, +0x000C334D,0x000C334A,0x000C3347,0x000C3344,0x86004D15,0x87004D6D,0x000C3341,0xA8004D80,0xA9004D81,0xAA004D84, +0xAB004D85,0xAC004D86,0xAD004D87,0xAE004D88,0xAF004D89,0xB0004D8A,0xB1004D8B,0xB2004D8C,0xB3004D8D,0xB4004D8E, +0xB5004D8F,0xB6004D90,0xB7004D91,0xB8004D92,0xB9004D93,0xBA004D94,0xBB004D95,0xBC004D96,0xBD004D97,0xBE004D99, +0xBF004D9A,0xA8004DA4,0xA9004DD6,0xAA004DD7,0xAB004DD8,0xAC004DD9,0xAD004DDA,0xAE004DDB,0xAF004DDC,0xB0004DDD, +0xB1004DDE,0xB2004DDF,0xB3004DE0,0xB4004DE1,0xB5004DE2,0xB6004DE3,0xB7004DE4,0xB8004DE5,0xB9004DE6,0xBA004DE7, +0xBB004DE8,0xBC004DE9,0xBD004DEA,0xBE004DEB,0xBF004DEC,0xE1004C76,0x000C333E,0x000C333B,0x000C3338,0x000C3335, +0x000C3332,0x000C332F,0x000C332C,0x000C3329,0x000C3326,0x000C3323,0x000C3320,0x000C331D,0x000C331A,0x000C3317, +0x000C3314,0x000C3311,0x000C330E,0x000C330B,0x000C3308,0x000C3305,0x000C3302,0x000C32FF,0x000C32FC,0x80004DF0, +0x81004DF1,0x82004DF2,0x000C32F9,0x000C32F6,0x000C32F3,0x000C32F0,0x86004D4E,0x87004DA7,0xA8004E0E,0xA9004E0F, +0xAA004E11,0xAB004E12,0xAC004E13,0xAD004E14,0xAE004E15,0xAF004E16,0xB0004E17,0xB1004E18,0xB2004E19,0xB3004E1A, +0xB4004E1B,0xB5004E1C,0xB6004E1D,0xB7004E1E,0xB8004E1F,0xB9004E20,0xBA004E21,0xBB004E22,0xBC004E23,0xBD004E24, +0xBE004E25,0xBF004E26,0x000C32ED,0x000C32EA,0xE1004CAA,0x000C32E7,0x000C32E4,0x000C32E1,0x000C32DE,0x000C32DB, +0x000C32D8,0x000C32D5,0x000C32D2,0x000C32CF,0x000C32CC,0x000C32C9,0x000C32C6,0x000C32C3,0x000C32C0,0x000C32BD, +0x000C32BA,0x000C32B7,0x000C32B4,0x000C32B1,0x000C32AE,0x000C32AB,0x000C32A8,0x80004E2A,0x81004E2B,0x82004E2C, +0x000C32A5,0x000C32A2,0x000C329F,0x000C329C,0x86004D98,0x87004DED,0x000C3299,0x000C3296,0x000C3293,0x000C3290, +0x000C328D,0x000C328A,0x000C3287,0x000C3284,0x000C3281,0x000C327E,0x000C327B,0x000C3278,0x000C3275,0x000C3272, +0x000C326F,0x000C326C,0xA8004E30,0xA9004E31,0xAA004E32,0xAB004E33,0xAC004E34,0xAD004E35,0xAE004E36,0xAF004E37, +0xB0004E38,0xB1004E39,0xB2004E3A,0xB3004E3B,0xB4004E3C,0xB5004E3D,0xB6004E3E,0xB7004E3F,0xB8004E58,0xB9004E59, +0xBA004E5A,0xBB004E5B,0xBC004E5C,0xBD004E5D,0xBE004E5E,0xBF004E5F,0x000C3269,0x000C3266,0x000C3263,0x000C3260, +0x000C325D,0x000C325A,0x000C3257,0x000C3254,0xE1004CFC,0x000C3251,0x000C324E,0x000C324B,0x000C3248,0x000C3245, +0x000C3242,0x000C323F,0x000C323C,0x000C3239,0x000C3236,0x000C3233,0x000C3230,0x80004E61,0x81004E62,0x82004E63, +0x000C322D,0x000C322A,0x000C3227,0x000C3224,0x86004DEF,0x87004E03,0x000C3221,0x000C321E,0x000C321B,0x000C3218, +0x000C3215,0x000C3212,0x000C320F,0x000C320C,0x000C3209,0x000C3206,0x000C3203,0x000C3200,0xE1004D1C,0x80004E86, +0x81004E87,0x82004E88,0x000C31FD,0x000C31FA,0x000C31F7,0x000C31F4,0x86004E07,0x87004E55,0x000C31F1,0x000C31EE, +0x000C31EB,0x000C31E8,0x000C31E5,0x000C31E2,0x000C31DF,0x000C31DC,0x000C31D9,0x000C31D6,0x000C31D3,0xA8004E65, +0xA9004E66,0xAA004E67,0xAB004E68,0xAC004E69,0xAD004E6A,0xAE004E6B,0xAF004E6C,0xB0004E70,0xB1004E71,0xB2004E72, +0xB3004E73,0xB4004E76,0xB5004E77,0xB6004E78,0xB7004E79,0xB8004E7A,0xB9004E7B,0xBA004E7C,0xBB004E7D,0xBC004E7E, +0xBD004E7F,0xBE004E80,0xBF004E81,0xA8004E8C,0xA9004E8D,0xAA004E8E,0xAB004E8F,0xAC004E90,0xAD004E91,0xAE004E92, +0xAF004E93,0xB0004E94,0xB1004E95,0xB2004E96,0xB3004EC7,0xB4004EC8,0xB5004EC9,0xB6004ECA,0xB7004ECB,0xB8004ECC, +0xB9004ECD,0xBA004ECE,0xBB004ECF,0xBC004ED0,0xBD004ED1,0xBE004ED2,0xBF004ED3,0x000C31D0,0x000C31CD,0x000C31CA, +0x000C31C7,0x000C31C4,0x000C31C1,0x000C31BE,0x000C31BB,0x000C31B8,0x000C31B5,0x000C31B2,0x000C31AF,0x000C31AC, +0xE1004D6E,0x80004ED8,0x81004ED9,0x82004EDA,0x000C31A9,0x000C31A6,0x000C31A3,0x000C31A0,0x86004E40,0x87004E97, +0x000C319D,0x000C319A,0x000C3197,0x000C3194,0x000C3191,0x000C318E,0x000C318B,0x000C3188,0x000C3185,0x000C3182, +0xA8004EDE,0xA9004EDF,0xAA004EE0,0xAB004EE1,0xAC004EE2,0xAD004EE3,0xAE004EE4,0xAF004EE5,0xB0004EE6,0xB1004EE7, +0xB2004F00,0xB3004F01,0xB4004F02,0xB5004F03,0xB6004F04,0xB7004F05,0xB8004F06,0xB9004F07,0xBA004F08,0xBB004F09, +0xBC004F0A,0xBD004F0B,0xBE004F0C,0xBF004F0D,0x000C317F,0x000C317C,0x000C3179,0x000C3176,0x000C3173,0x000C3170, +0x000C316D,0x000C316A,0x000C3167,0x000C3164,0x000C3161,0x000C315E,0x000C315B,0x000C3158,0xE1004DA8,0x000C3155, +0x000C3152,0x000C314F,0x000C314C,0x000C3149,0x000C3146,0x000C3143,0x000C3140,0x80004F0F,0x81004F10,0x82004F11, +0x000C313D,0x000C313A,0x000C3137,0x000C3134,0x86004E82,0x87004ED4,0x000C3131,0x000C312E,0x000C312B,0x000C3128, +0x000C3125,0x000C3122,0x000C311F,0x000C311C,0x000C3119,0x000C3116,0xA8004F13,0xA9004F14,0xAA004F15,0xAB004F16, +0xAC004F1A,0xAD004F1B,0xAE004F1C,0xAF004F1D,0xB0004F20,0xB1004F21,0xB2004F22,0xB3004F23,0xB4004F24,0xB5004F25, +0xB6004F26,0xB7004F27,0xB8004F28,0xB9004F29,0xBA004F42,0xBB004F43,0xBC004F44,0xBD004F46,0xBE004F47,0xBF004F48, +0x000C3113,0x000C3110,0x000C310D,0xE1004DEE,0x000C310A,0x000C3107,0x000C3104,0x000C3101,0x000C30FE,0x000C30FB, +0x000C30F8,0x000C30F5,0x000C30F2,0x000C30EF,0x000C30EC,0x000C30E9,0x000C30E6,0x000C30E3,0x80004F49,0x81004F4A, +0x82004F4B,0x000C30E0,0x000C30DD,0x000C30DA,0x000C30D7,0x86004EC3,0x87004F0E,0x000C30D4,0x000C30D1,0x000C30CE, +0x000C30CB,0x000C30C8,0x000C30C5,0x000C30C2,0x000C30BF,0x000C30BC,0x000C30B9,0x000C30B6,0x000C30B3,0x000C30B0, +0xE1004E04,0xA8004F4D,0xA9004F4E,0xAA004F4F,0xAB004F50,0xAC004F51,0xAD004F52,0xAE004F53,0xAF004F57,0xB0004F58, +0xB1004F59,0xB2004F5A,0xB3004F5D,0xB4004F5E,0xB5004F5F,0xB6004F60,0xB7004F61,0xB8004F62,0xB9004F63,0xBA004F64, +0xBB004F65,0xBC004F66,0xBD004F67,0xBE004F68,0xBF004F69,0x000C30AD,0x000C30AA,0x000C30A7,0x000C30A4,0x000C30A1, +0x000C309E,0x000C309B,0x000C3098,0x000C3095,0x000C3092,0x000C308F,0x80004F83,0x81004F84,0x82004F85,0x000C308C, +0x000C3089,0x000C3086,0x000C3083,0x000C3080,0x000C307D,0x000C307A,0x000C3077,0x000C3074,0x000C3071,0x000C306E, +0x000C306B,0x86004EF7,0x87004F3D,0xA8004F87,0xA9004F88,0xAA004F89,0xAB004F8A,0xAC004F8B,0xAD004F8C,0xAE004F8D, +0xAF004F91,0xB0004F92,0xB1004F93,0xB2004F94,0xB3004F95,0xB4004F96,0xB5004F97,0xB6004F98,0xB7004F99,0xB8004F9A, +0xB9004F9B,0xBA004F9C,0xBB004FB7,0xBC004FB8,0xBD004FB9,0xBE004FBA,0xBF004FBB,0x000C3068,0x000C3065,0x000C3062, +0x000C305F,0x000C305C,0xE1004E56,0x80004FC0,0x81004FC1,0x82004FC2,0x000C3059,0x000C3056,0x000C3053,0x000C3050, +0x86004F1E,0x87004F77,0xA8004FDE,0xA9004FDF,0xAA004FE0,0xAB004FE1,0xAC004FE2,0xAD004FE3,0xAE004FE4,0xAF004FE5, +0xB0004FE6,0xB1004FE7,0xB2004FE8,0xB3004FE9,0xB4004FEA,0xB5004FEB,0xB6004FEC,0xB7004FED,0xB8004FEE,0xB9004FEF, +0xBA004FF0,0xBB004FF1,0xBC004FF2,0xBD004FF4,0xBE004FF5,0xBF004FF6,0x000C304D,0x000C304A,0x000C3047,0x000C3044, +0x000C3041,0x000C303E,0x000C303B,0x000C3038,0x000C3035,0x000C3032,0x000C302F,0x000C302C,0x000C3029,0x000C3026, +0x000C3023,0x000C3020,0x000C301D,0x000C301A,0x000C3017,0x000C3014,0x000C3011,0xE1004E98,0x000C300E,0x000C300B, +0x000C3008,0x80004FFA,0x81004FFB,0x82004FFC,0x000C3005,0x000C3002,0x000C2FFF,0x000C2FFC,0x86004F5B,0x87004FB1, +0x000C2FF9,0x000C2FF6,0x000C2FF3,0xA8005000,0xA9005001,0xAA005002,0xAB00501B,0xAC00501C,0xAD00501D,0xAE00501E, +0xAF00501F,0xB0005020,0xB1005021,0xB2005022,0xB3005023,0xB4005024,0xB5005025,0xB6005026,0xB7005027,0xB8005028, +0xB9005029,0xBA00502A,0xBB00502B,0xBC00502C,0xBD00502E,0xBE00502F,0xBF005030,0x000C2FF0,0x000C2FED,0x000C2FEA, +0x000C2FE7,0x000C2FE4,0x000C2FE1,0x000C2FDE,0x000C2FDB,0x000C2FD8,0x000C2FD5,0x000C2FD2,0x000C2FCF,0x000C2FCC, +0x000C2FC9,0x000C2FC6,0x000C2FC3,0x000C2FC0,0x000C2FBD,0xE1004ED5,0x000C2FBA,0x000C2FB7,0x000C2FB4,0x80005034, +0x81005035,0x82005036,0x000C2FB1,0x000C2FAE,0x000C2FAB,0x000C2FA8,0x86004F9D,0x87004FF3,0x000C2FA5,0x000C2FA2, +0x000C2F9F,0x000C2F9C,0x000C2F99,0x000C2F96,0x000C2F93,0x000C2F90,0x000C2F8D,0x000C2F8A,0x000C2F87,0xA800503A, +0xA900503B,0xAA00503C,0xAB00503D,0xAC00503E,0xAD00503F,0xAE005040,0xAF005041,0xB0005042,0xB1005043,0xB2005044, +0xB300505D,0xB400505E,0xB500505F,0xB6005060,0xB7005061,0xB8005062,0xB9005063,0xBA005064,0xBB005065,0xBC005066, +0xBD005068,0xBE005069,0xBF00506A,0x000C2F84,0x000C2F81,0x000C2F7E,0x000C2F7B,0x000C2F78,0x000C2F75,0x000C2F72, +0x000C2F6F,0x000C2F6C,0x000C2F69,0xE1004F17,0x000C2F66,0x000C2F63,0x000C2F60,0x000C2F5D,0x000C2F5A,0x000C2F57, +0x000C2F54,0x000C2F51,0x000C2F4E,0x000C2F4B,0x000C2F48,0x8000506B,0x8100506C,0x8200506D,0x000C2F45,0x000C2F42, +0x000C2F3F,0x000C2F3C,0x000C2F39,0x000C2F36,0x000C2F33,0x86004FD7,0x8700502D,0xA800506F,0xA9005070,0xAA005071, +0xAB005072,0xAC005076,0xAD005077,0xAE005078,0xAF005079,0xB000507A,0xB100507B,0xB200507C,0xB3005097,0xB4005098, +0xB5005099,0xB600509A,0xB700509B,0xB800509C,0xB900509D,0xBA00509E,0xBB00509F,0xBC0050A0,0xBD0050A1,0xBE0050A2, +0xBF0050A3,0x000C2F30,0x000C2F2D,0x000C2F2A,0x000C2F27,0x000C2F24,0x000C2F21,0x000C2F1E,0x000C2F1B,0x000C2F18, +0x000C2F15,0x000C2F12,0x000C2F0F,0x000C2F0C,0xE1004F3E,0x000C2F09,0x000C2F06,0x000C2F03,0x000C2F00,0x000C2EFD, +0x000C2EFA,0x000C2EF7,0x000C2EF4,0x800050A5,0x810050A6,0x820050A7,0x000C2EF1,0x000C2EEE,0x000C2EEB,0x000C2EE8, +0x000C2EE5,0x000C2EE2,0x000C2EDF,0x86005011,0x87005067,0xA80050A9,0xA90050AA,0xAA0050AB,0xAB0050AC,0xAC0050B0, +0xAD0050B1,0xAE0050B2,0xAF0050B3,0xB00050B4,0xB10050B5,0xB20050B6,0xB30050D1,0xB40050D2,0xB50050D3,0xB60050D4, +0xB70050D5,0xB80050D6,0xB90050D7,0xBA0050D8,0xBB0050D9,0xBC0050DA,0xBD0050DB,0xBE0050DC,0xBF0050DD,0x000C2EDC, +0x000C2ED9,0x000C2ED6,0x000C2ED3,0x000C2ED0,0x000C2ECD,0x000C2ECA,0x000C2EC7,0x000C2EC4,0x000C2EC1,0x000C2EBE, +0x000C2EBB,0x000C2EB8,0xE1004F78,0x000C2EB5,0x000C2EB2,0x000C2EAF,0x000C2EAC,0x000C2EA9,0x000C2EA6,0x000C2EA3, +0x000C2EA0,0x800050DF,0x810050E0,0x820050E1,0x000C2E9D,0x000C2E9A,0x000C2E97,0x000C2E94,0x000C2E91,0x000C2E8E, +0x000C2E8B,0x000C2E88,0x000C2E85,0x000C2E82,0x000C2E7F,0x000C2E7C,0x000C2E79,0x000C2E76,0x000C2E73,0x86005053, +0x870050A4,0xA80050E3,0xA90050E4,0xAA0050E5,0xAB0050E6,0xAC0050EA,0xAD0050EB,0xAE0050EC,0xAF0050ED,0xB00050EE, +0xB10050EF,0xB20050F0,0xB30050F1,0xB40050F2,0xB50050F3,0xB60050F4,0xB70050F5,0xB80050F6,0xB90050F7,0xBA0050F8, +0xBB005113,0xBC005114,0xBD005115,0xBE005116,0xBF005117,0x000C2E70,0x000C2E6D,0x000C2E6A,0x000C2E67,0x000C2E64, +0xE1004FB2,0x000C2E61,0x000C2E5E,0x000C2E5B,0x000C2E58,0x000C2E55,0x000C2E52,0x000C2E4F,0x000C2E4C,0x000C2E49, +0x000C2E46,0x000C2E43,0x80005119,0x8100511A,0x8200511B,0x000C2E40,0x000C2E3D,0x000C2E3A,0x000C2E37,0x000C2E34, +0x000C2E31,0x000C2E2E,0x000C2E2B,0x000C2E28,0x000C2E25,0x000C2E22,0x000C2E1F,0x8600508D,0x870050DE,0xA800511D, +0xA900511E,0xAA00511F,0xAB005120,0xAC005121,0xAD005122,0xAE005123,0xAF005127,0xB0005128,0xB1005129,0xB200512A, +0xB300512B,0xB400512C,0xB500512D,0xB600512E,0xB700512F,0xB8005130,0xB9005131,0xBA005132,0xBB00514D,0xBC00514E, +0xBD005150,0xBE005151,0xBF005152,0x000C2E1C,0x000C2E19,0xE1004FF7,0x000C2E16,0x000C2E13,0x000C2E10,0x000C2E0D, +0x000C2E0A,0x000C2E07,0x000C2E04,0x000C2E01,0x000C2DFE,0x000C2DFB,0x000C2DF8,0x000C2DF5,0x000C2DF2,0x000C2DEF, +0x80005153,0x81005154,0x82005155,0x000C2DEC,0x000C2DE9,0x000C2DE6,0x000C2DE3,0x000C2DE0,0x000C2DDD,0x000C2DDA, +0x000C2DD7,0x000C2DD4,0x000C2DD1,0x000C2DCE,0x000C2DCB,0x860050C7,0x8700510D,0xA8005157,0xA9005158,0xAA005159, +0xAB00515A,0xAC00515B,0xAD00515C,0xAE00515D,0xAF005161,0xB0005162,0xB1005163,0xB2005164,0xB3005165,0xB4005166, +0xB5005167,0xB6005168,0xB7005169,0xB800516A,0xB900516B,0xBA00516C,0xBB005187,0xBC005188,0xBD00518A,0xBE00518B, +0xBF00518C,0x000C2DC8,0x000C2DC5,0xE1005031,0x000C2DC2,0x000C2DBF,0x000C2DBC,0x80005190,0x81005191,0x82005192, +0x000C2DB9,0x000C2DB6,0x000C2DB3,0x000C2DB0,0x860050F9,0x87005147,0x000C2DAD,0x000C2DAA,0x000C2DA7,0x000C2DA4, +0x000C2DA1,0x000C2D9E,0x000C2D9B,0x000C2D98,0x000C2D95,0x000C2D92,0x000C2D8F,0xA8005196,0xA9005197,0xAA005198, +0xAB005199,0xAC00519A,0xAD00519B,0xAE00519C,0xAF00519D,0xB000519E,0xB100519F,0xB20051A0,0xB30051B9,0xB40051BA, +0xB50051BB,0xB60051BC,0xB70051BD,0xB80051BE,0xB90051BF,0xBA0051C0,0xBB0051C1,0xBC0051C2,0xBD0051C4,0xBE0051C5, +0xBF0051C6,0x000C2D8C,0x000C2D89,0x000C2D86,0x000C2D83,0x000C2D80,0x000C2D7D,0x000C2D7A,0x000C2D77,0x000C2D74, +0x000C2D71,0xE1005073,0x000C2D6E,0x000C2D6B,0x000C2D68,0x800051CA,0x810051CB,0x820051CC,0x000C2D65,0x000C2D62, +0x000C2D5F,0x000C2D5C,0x86005133,0x87005181,0x000C2D59,0x000C2D56,0x000C2D53,0x000C2D50,0x000C2D4D,0x000C2D4A, +0x000C2D47,0x000C2D44,0x000C2D41,0x000C2D3E,0x000C2D3B,0xA80051D0,0xA90051D1,0xAA0051D2,0xAB0051D3,0xAC0051D4, +0xAD0051D5,0xAE0051D6,0xAF0051D7,0xB00051D8,0xB10051D9,0xB20051DA,0xB30051F3,0xB40051F4,0xB50051F5,0xB60051F6, +0xB70051F7,0xB80051F8,0xB90051F9,0xBA0051FA,0xBB0051FB,0xBC0051FC,0xBD0051FE,0xBE0051FF,0xBF005200,0x000C2D38, +0x000C2D35,0x000C2D32,0x000C2D2F,0x000C2D2C,0x000C2D29,0x000C2D26,0x000C2D23,0x000C2D20,0x000C2D1D,0xE10050AD, +0x000C2D1A,0x000C2D17,0x000C2D14,0x80005204,0x81005205,0x82005206,0x000C2D11,0x000C2D0E,0x000C2D0B,0xE1005183, +0x8500516D,0x000C2D08,0x86005194,0x870051DB,0x000C2D05,0x000C2D02,0xA1005209,0xA2005255,0xA3005292,0xA40052CC, +0xA5005306,0xA6005340,0xA700537A,0xA80053B1,0xA90053EE,0xAA005428,0xAB00545F,0xAC005499,0xAD0054D6,0xAE00550D, +0xAF005547,0xB0005581,0xB10055BE,0xB20055F5,0xB3005616,0xB4005669,0xB50056A6,0x000C2CFF,0x000C2CFC,0x000C2CF9, +0x000C2CF6,0x000C2CF3,0x000C2CF0,0x000C2CED,0x000C2CEA,0x000C2CE7,0x000C2CE4,0x000C2CE1,0x000C2CDE,0x000C2CDB, +0x000C2CD8,0x000C2CD5,0x000C2CD2,0x000C2CCF,0x000C2CCC,0x000C2CC9,0x000C2CC6,0xE10050E7,0x000C2CC3,0x000C2CC0, +0x000C2CBD,0x000C2CBA,0xA800520C,0xA900520D,0xAA005223,0xAB005224,0xAC005225,0xAD005226,0xAE005227,0xAF005228, +0xB0005229,0xB100522A,0xB200522B,0xB300522C,0xB400522D,0xB500522E,0xB600522F,0xB7005230,0xB8005231,0xB9005232, +0xBA005233,0xBB005234,0xBC005235,0xBD005236,0xBE005238,0xBF005239,0x000C2CB7,0x000C2CB4,0x000C2CB1,0x000C2CAE, +0x000C2CAB,0x000C2CA8,0x000C2CA5,0x8000523A,0x8100523B,0x82005254,0x000C2CA2,0x000C2C9F,0x000C2C9C,0x000C2C99, +0x860051CE,0x8700520E,0x000C2C96,0x000C2C93,0x000C2C90,0x000C2C8D,0x000C2C8A,0x000C2C87,0x000C2C84,0x000C2C81, +0x000C2C7E,0x000C2C7B,0x000C2C78,0x000C2C75,0x000C2C72,0x000C2C6F,0x000C2C6C,0x000C2C69,0xE100510E,0x000C2C66, +0xA8005256,0xA9005257,0xAA005258,0xAB005259,0xAC00525A,0xAD00525E,0xAE00525F,0xAF005260,0xB0005261,0xB1005264, +0xB2005265,0xB3005266,0xB4005267,0xB5005268,0xB6005269,0xB700526A,0xB800526B,0xB900526C,0xBA00526D,0xBB00526E, +0xBC00526F,0xBD005270,0xBE005271,0xBF005272,0x80005273,0x81005275,0x82005291,0x000C2C63,0x000C2C60,0x000C2C5D, +0x000C2C5A,0x86005207,0x87005247,0x000C2C57,0x000C2C54,0x000C2C51,0x000C2C4E,0x000C2C4B,0x000C2C48,0x000C2C45, +0x000C2C42,0x000C2C3F,0x000C2C3C,0x000C2C39,0x000C2C36,0x000C2C33,0x000C2C30,0x000C2C2D,0x000C2C2A,0x000C2C27, +0x000C2C24,0x000C2C21,0x000C2C1E,0x000C2C1B,0x000C2C18,0x000C2C15,0xE1005148,0xA8005293,0xA9005294,0xAA005297, +0xAB005298,0xAC005299,0xAD00529A,0xAE00529B,0xAF00529C,0xB000529D,0xB100529E,0xB200529F,0xB30052A0,0xB40052A1, +0xB50052A2,0xB60052A3,0xB70052A4,0xB80052A5,0xB90052A6,0xBA0052A7,0xBB0052A8,0xBC0052A9,0xBD0052AA,0xBE0052AB, +0xBF0052AC,0x800052AD,0x810052CA,0x820052CB,0x000C2C12,0x000C2C0F,0x000C2C0C,0x000C2C09,0x86005243,0x87005283, +0x000C2C06,0x000C2C03,0x000C2C00,0x000C2BFD,0x000C2BFA,0x000C2BF7,0x000C2BF4,0x000C2BF1,0x000C2BEE,0x000C2BEB, +0x000C2BE8,0x000C2BE5,0x000C2BE2,0x000C2BDF,0x000C2BDC,0x000C2BD9,0x000C2BD6,0x000C2BD3,0x000C2BD0,0x000C2BCD, +0x000C2BCA,0x000C2BC7,0x000C2BC4,0x000C2BC1,0x000C2BBE,0x000C2BBB,0xE1005184,0xA80052CD,0xA90052D0,0xAA0052D1, +0xAB0052D2,0xAC0052D3,0xAD0052D4,0xAE0052D5,0xAF0052D6,0xB00052D7,0xB10052D8,0xB20052D9,0xB30052DA,0xB40052DB, +0xB50052DC,0xB60052DD,0xB70052DE,0xB80052DF,0xB90052E0,0xBA0052E1,0xBB0052E2,0xBC0052E3,0xBD0052E4,0xBE0052E5, +0xBF0052E6,0x800052E7,0x810052E8,0x820052E9,0x000C2BB8,0x86005262,0x870052BA,0x000C2BB5,0xA8005309,0xA9005322, +0xAA005323,0xAB005324,0xAC005325,0xAD005326,0xAE005327,0xAF005328,0xB0005329,0xB100532A,0xB200532B,0xB300532C, +0xB400532D,0xB500532E,0xB600532F,0xB7005330,0xB8005331,0xB9005332,0xBA005333,0xBB005334,0xBC005335,0xBD005337, +0xBE005338,0xBF005339,0x000C2BB2,0x000C2BAF,0x000C2BAC,0x000C2BA9,0x000C2BA6,0x000C2BA3,0x000C2BA0,0x000C2B9D, +0x000C2B9A,0x000C2B97,0x000C2B94,0x000C2B91,0x000C2B8E,0x000C2B8B,0x000C2B88,0x000C2B85,0x000C2B82,0x000C2B7F, +0x000C2B7C,0x000C2B79,0xE10051DC,0x000C2B76,0x000C2B73,0x000C2B70,0x8000533D,0x8100533E,0x8200533F,0x000C2B6D, +0x000C2B6A,0x000C2B67,0x000C2B64,0x860052AE,0x870052F4,0x000C2B61,0x000C2B5E,0x000C2B5B,0x000C2B58,0x000C2B55, +0x000C2B52,0x000C2B4F,0x000C2B4C,0x000C2B49,0x000C2B46,0x000C2B43,0x000C2B40,0x000C2B3D,0x000C2B3A,0x000C2B37, +0x000C2B34,0x000C2B31,0x000C2B2E,0x000C2B2B,0xA8005343,0xA9005344,0xAA005345,0xAB005346,0xAC005347,0xAD005348, +0xAE005349,0xAF00534A,0xB000534B,0xB100534C,0xB200534D,0xB300534E,0xB400534F,0xB5005350,0xB6005351,0xB7005352, +0xB8005353,0xB9005354,0xBA005355,0xBB00536E,0xBC00536F,0xBD005370,0xBE005371,0xBF005372,0x000C2B28,0x000C2B25, +0x000C2B22,0x000C2B1F,0x000C2B1C,0xE100520F,0x80005377,0x81005378,0x82005379,0x000C2B19,0x000C2B16,0x000C2B13, +0x000C2B10,0x860052EA,0x87005336,0x000C2B0D,0x000C2B0A,0x000C2B07,0x000C2B04,0x000C2B01,0x000C2AFE,0x000C2AFB, +0x000C2AF8,0x000C2AF5,0x000C2AF2,0x000C2AEF,0x000C2AEC,0x000C2AE9,0x000C2AE6,0x000C2AE3,0x000C2AE0,0x000C2ADD, +0x000C2ADA,0x000C2AD7,0x000C2AD4,0x000C2AD1,0xA800537D,0xA900537E,0xAA00537F,0xAB005380,0xAC005381,0xAD005382, +0xAE005383,0xAF005384,0xB0005385,0xB1005386,0xB2005387,0xB3005388,0xB4005389,0xB500538A,0xB600538B,0xB700538C, +0xB800538D,0xB900538E,0xBA00538F,0xBB005390,0xBC005391,0xBD0053AA,0xBE0053AB,0xBF0053AC,0x000C2ACE,0x000C2ACB, +0x000C2AC8,0xE1005248,0x000C2AC5,0x000C2AC2,0x000C2ABF,0x000C2ABC,0x000C2AB9,0x000C2AB6,0x000C2AB3,0x000C2AB0, +0x800053AE,0x810053AF,0x820053B0,0x000C2AAD,0x000C2AAA,0x000C2AA7,0x000C2AA4,0x000C2AA1,0x000C2A9E,0x000C2A9B, +0x8600531A,0x87005368,0xA80053B2,0xA90053B3,0xAA0053B4,0xAB0053B5,0xAC0053B9,0xAD0053BA,0xAE0053BB,0xAF0053BC, +0xB00053BD,0xB10053BE,0xB20053BF,0xB30053DA,0xB40053DB,0xB50053DC,0xB60053DD,0xB70053DE,0xB80053DF,0xB90053E0, +0xBA0053E1,0xBB0053E2,0xBC0053E3,0xBD0053E4,0xBE0053E5,0xBF0053E6,0x000C2A98,0x000C2A95,0x000C2A92,0x000C2A8F, +0x000C2A8C,0x000C2A89,0x000C2A86,0x000C2A83,0x000C2A80,0x000C2A7D,0x000C2A7A,0x000C2A77,0x000C2A74,0xE1005281, +0x800053EB,0x810053EC,0x820053ED,0x000C2A71,0x000C2A6E,0x000C2A6B,0x000C2A68,0x86005356,0x870053A2,0x000C2A65, +0x000C2A62,0x000C2A5F,0x000C2A5C,0x000C2A59,0x000C2A56,0x000C2A53,0x000C2A50,0x000C2A4D,0x000C2A4A,0x000C2A47, +0x000C2A44,0x000C2A41,0xA80053F1,0xA90053F2,0xAA0053F3,0xAB0053F4,0xAC0053F5,0xAD0053F6,0xAE0053F7,0xAF0053F8, +0xB00053F9,0xB10053FA,0xB20053FB,0xB30053FC,0xB40053FD,0xB5005416,0xB6005417,0xB7005418,0xB8005419,0xB900541A, +0xBA00541B,0xBB00541C,0xBC00541D,0xBD00541E,0xBE00541F,0xBF005420,0x000C2A3E,0x000C2A3B,0x000C2A38,0x000C2A35, +0x000C2A32,0x000C2A2F,0x000C2A2C,0x000C2A29,0x000C2A26,0x000C2A23,0x000C2A20,0xE10052BB,0x80005425,0x81005426, +0x82005427,0x000C2A1D,0x000C2A1A,0x000C2A17,0x000C2A14,0x86005392,0x870053E7,0x000C2A11,0x000C2A0E,0x000C2A0B, +0x000C2A08,0x000C2A05,0x000C2A02,0x000C29FF,0x000C29FC,0x000C29F9,0x000C29F6,0x000C29F3,0x000C29F0,0x000C29ED, +0x000C29EA,0x000C29E7,0xA800542B,0xA900542C,0xAA00542D,0xAB00542E,0xAC00542F,0xAD005430,0xAE005431,0xAF005432, +0xB0005433,0xB1005434,0xB2005435,0xB3005436,0xB4005437,0xB5005438,0xB6005439,0xB7005452,0xB8005453,0xB9005454, +0xBA005455,0xBB005456,0xBC005457,0xBD005458,0xBE005459,0xBF00545A,0x000C29E4,0x000C29E1,0x000C29DE,0x000C29DB, +0x000C29D8,0x000C29D5,0x000C29D2,0x000C29CF,0x000C29CC,0xE10052F5,0x000C29C9,0x000C29C6,0x000C29C3,0x000C29C0, +0x000C29BD,0x000C29BA,0x000C29B7,0x000C29B4,0x000C29B1,0x000C29AE,0x000C29AB,0x8000545C,0x8100545D,0x8200545E, +0x000C29A8,0x000C29A5,0x000C29A2,0x000C299F,0x860053C8,0x87005421,0xA8005460,0xA9005461,0xAA005462,0xAB005463, +0xAC005464,0xAD005465,0xAE005466,0xAF00546A,0xB000546B,0xB100546C,0xB200546D,0xB3005488,0xB4005489,0xB500548A, +0xB600548B,0xB700548C,0xB800548D,0xB900548E,0xBA00548F,0xBB005490,0xBC005491,0xBD005493,0xBE005494,0xBF005495, +0x000C299C,0x000C2999,0x000C2996,0x000C2993,0x000C2990,0x000C298D,0x000C298A,0x000C2987,0x000C2984,0x000C2981, +0xE100533A,0x000C297E,0x000C297B,0x000C2978,0x000C2975,0x000C2972,0x000C296F,0x000C296C,0x860053FE,0x87005450, +0x000C2969,0x000C2966,0x000C2963,0x000C2960,0x000C295D,0x80005496,0x81005497,0x82005498,0x000C295A,0x000C2957, +0xA800549C,0xA900549D,0xAA00549E,0xAB00549F,0xAC0054A0,0xAD0054A4,0xAE0054A5,0xAF0054BE,0xB00054BF,0xB10054C0, +0xB20054C1,0xB30054C2,0xB40054C3,0xB50054C4,0xB60054C5,0xB70054C6,0xB80054C7,0xB90054C8,0xBA0054C9,0xBB0054CA, +0xBC0054CB,0xBD0054CC,0xBE0054CD,0xBF0054CE,0x000C2954,0x000C2951,0x000C294E,0x000C294B,0x000C2948,0x000C2945, +0x000C2942,0x000C293F,0x000C293C,0x000C2939,0x000C2936,0x000C2933,0x000C2930,0x000C292D,0x000C292A,0x000C2927, +0x000C2924,0xE1005369,0x800054D3,0x810054D4,0x820054D5,0x000C2921,0x000C291E,0x000C291B,0x000C2918,0x8600543A, +0x87005492,0x000C2915,0x000C2912,0x000C290F,0x000C290C,0x000C2909,0x000C2906,0x000C2903,0x000C2900,0x000C28FD, +0xA80054D9,0xA90054DA,0xAA0054DB,0xAB0054DC,0xAC0054DD,0xAD0054DE,0xAE0054DF,0xAF0054E0,0xB00054E1,0xB10054FA, +0xB20054FB,0xB30054FC,0xB40054FD,0xB50054FE,0xB60054FF,0xB7005500,0xB8005501,0xB9005502,0xBA005503,0xBB005504, +0xBC005505,0xBD005506,0xBE005507,0xBF005508,0x000C28FA,0x000C28F7,0x000C28F4,0x000C28F1,0x000C28EE,0x000C28EB, +0x000C28E8,0x000C28E5,0x000C28E2,0x000C28DF,0x000C28DC,0x000C28D9,0x000C28D6,0x000C28D3,0x000C28D0,0xE10053A3, +0x000C28CD,0x000C28CA,0x000C28C7,0x000C28C4,0x000C28C1,0x000C28BE,0x000C28BB,0x000C28B8,0x8000550A,0x8100550B, +0x8200550C,0x000C28B5,0x000C28B2,0x000C28AF,0x000C28AC,0x000C28A9,0x000C28A6,0x000C28A3,0x000C28A0,0x000C289D, +0x000C289A,0x000C2897,0x8600547A,0x870054CF,0xA800550E,0xA900550F,0xAA005510,0xAB005511,0xAC005515,0xAD005516, +0xAE005517,0xAF005518,0xB0005519,0xB100551A,0xB200551B,0xB300551C,0xB400551D,0xB500551E,0xB600551F,0xB700553A, +0xB800553B,0xB900553C,0xBA00553D,0xBB00553E,0xBC00553F,0xBD005541,0xBE005542,0xBF005543,0x000C2894,0x000C2891, +0x000C288E,0x000C288B,0x000C2888,0x000C2885,0xE10053E8,0x000C2882,0x000C287F,0x000C287C,0x000C2879,0x000C2876, +0x000C2873,0x000C2870,0x000C286D,0x000C286A,0x000C2867,0x000C2864,0x000C2861,0x000C285E,0x000C285B,0x80005544, +0x81005545,0x82005546,0x000C2858,0x000C2855,0x000C2852,0x000C284F,0x860054B0,0x87005509,0xA8005548,0xA9005549, +0xAA00554A,0xAB00554B,0xAC00554C,0xAD00554D,0xAE00554E,0xAF005552,0xB0005553,0xB1005554,0xB2005555,0xB3005570, +0xB4005571,0xB5005572,0xB6005573,0xB7005574,0xB8005575,0xB9005576,0xBA005577,0xBB005578,0xBC005579,0xBD00557B, +0xBE00557C,0xBF00557D,0x000C284C,0x000C2849,0x000C2846,0x000C2843,0x000C2840,0x000C283D,0x000C283A,0x000C2837, +0x000C2834,0x000C2831,0xE1005414,0x000C282E,0x000C282B,0x000C2828,0x000C2825,0x000C2822,0x000C281F,0x000C281C, +0x000C2819,0x000C2816,0x000C2813,0x000C2810,0x000C280D,0x000C280A,0x000C2807,0x8000557E,0x8100557F,0x82005580, +0x000C2804,0x000C2801,0x000C27FE,0x000C27FB,0x000C27F8,0x000C27F5,0x000C27F2,0x000C27EF,0x000C27EC,0x000C27E9, +0x000C27E6,0x000C27E3,0x860054F2,0x87005538,0xA8005582,0xA9005583,0xAA005584,0xAB005585,0xAC005586,0xAD005587, +0xAE005588,0xAF00558C,0xB000558D,0xB100558E,0xB200558F,0xB3005590,0xB4005591,0xB5005592,0xB6005593,0xB7005594, +0xB8005595,0xB9005596,0xBA005597,0xBB0055B2,0xBC0055B3,0xBD0055B4,0xBE0055B5,0xBF0055B6,0x000C27E0,0x000C27DD, +0x000C27DA,0x000C27D7,0x000C27D4,0xE1005451,0x800055BB,0x810055BC,0x820055BD,0x000C27D1,0x000C27CE,0x000C27CB, +0x000C27C8,0x86005520,0x8700557A,0x000C27C5,0x000C27C2,0x000C27BF,0x000C27BC,0x000C27B9,0x000C27B6,0x000C27B3, +0xA80055C1,0xA90055C2,0xAA0055C3,0xAB0055C4,0xAC0055C5,0xAD0055C6,0xAE0055C7,0xAF0055E0,0xB00055E1,0xB10055E2, +0xB20055E3,0xB30055E4,0xB40055E5,0xB50055E6,0xB60055E7,0xB70055E8,0xB80055E9,0xB90055EA,0xBA0055EB,0xBB0055EC, +0xBC0055ED,0xBD0055EF,0xBE0055F0,0xBF0055F1,0x000C27B0,0x000C27AD,0x000C27AA,0x000C27A7,0x000C27A4,0x000C27A1, +0x000C279E,0x000C279B,0x000C2798,0x000C2795,0x000C2792,0x000C278F,0x000C278C,0x000C2789,0xE100549A,0x000C2786, +0x000C2783,0x000C2780,0x000C277D,0x000C277A,0x000C2777,0x000C2774,0x000C2771,0x000C276E,0x000C276B,0x000C2768, +0x800055F2,0x810055F3,0x820055F4,0x000C2765,0x000C2762,0x000C275F,0x000C275C,0x000C2759,0x000C2756,0x000C2753, +0x000C2750,0x000C274D,0x000C274A,0x000C2747,0x000C2744,0x000C2741,0x000C273E,0x000C273B,0x000C2738,0x000C2735, +0x000C2732,0x8600558A,0x87005598,0x000C272F,0x000C272C,0x000C2729,0x000C2726,0x000C2723,0x000C2720,0x000C271D, +0x80005613,0x81005614,0x82005615,0x000C271A,0x000C2717,0x000C2714,0x000C2711,0x860055A2,0x870055EE,0x000C270E, +0x000C270B,0x000C2708,0x000C2705,0x000C2702,0x000C26FF,0x000C26FC,0xE10054D0,0x000C26F9,0x000C26F6,0x000C26F3, +0x000C26F0,0x000C26ED,0x000C26EA,0x000C26E7,0x000C26E4,0x000C26E1,0xA80055F6,0xA90055F7,0xAA0055F8,0xAB0055F9, +0xAC0055FD,0xAD0055FE,0xAE0055FF,0xAF005600,0xB0005601,0xB1005602,0xB2005603,0xB3005604,0xB4005605,0xB5005606, +0xB6005607,0xB7005608,0xB8005609,0xB900560A,0xBA00560B,0xBB00560C,0xBC00560D,0xBD00560E,0xBE005611,0xBF005612, +0xA8005617,0xA900561B,0xAA00561C,0xAB00561D,0xAC00561E,0xAD005621,0xAE005622,0xAF005623,0xB0005624,0xB1005625, +0xB2005626,0xB3005627,0xB4005629,0xB500562A,0xB600562B,0xB700562C,0xB800562D,0xB900562E,0xBA00562F,0xBB005630, +0xBC005631,0xBD005663,0xBE005664,0xBF005665,0xE1005512,0x000C26DE,0x000C26DB,0x000C26D8,0x000C26D5,0x000C26D2, +0x000C26CF,0x000C26CC,0x000C26C9,0x000C26C6,0x000C26C3,0x000C26C0,0x80005666,0x81005667,0x82005668,0x000C26BD, +0x000C26BA,0x000C26B7,0x000C26B4,0x000C26B1,0x000C26AE,0x000C26AB,0x000C26A8,0x000C26A5,0x000C26A2,0x000C269F, +0x000C269C,0x000C2699,0x000C2696,0x000C2693,0x860055DA,0x87005620,0xA800566A,0xA900566B,0xAA00566C,0xAB00566D, +0xAC005671,0xAD005672,0xAE005673,0xAF005674,0xB0005675,0xB1005676,0xB2005677,0xB3005678,0xB4005679,0xB500567A, +0xB600567B,0xB700567C,0xB800567D,0xB900567E,0xBA00567F,0xBB00569A,0xBC00569B,0xBD00569C,0xBE00569D,0xBF00569E, +0x000C2690,0x000C268D,0x000C268A,0x000C2687,0x000C2684,0xE1005539,0x800056A3,0x810056A4,0x820056A5,0x000C2681, +0x000C267E,0x000C267B,0x000C2678,0x000C2675,0x000C2672,0x000C266F,0x000C266C,0x000C2669,0x000C2666,0x000C2663, +0x8600560F,0x8700565A,0x000C2660,0x000C265D,0x000C265A,0x000C2657,0x000C2654,0x000C2651,0x000C264E,0xA80056A7, +0xA90056A8,0xAA0056A9,0xAB0056AA,0xAC0056AB,0xAD0056AC,0xAE0056AD,0xAF0056B0,0xB00056B1,0xB10056B2,0xB20056B3, +0xB30056B4,0xB40056B5,0xB50056B6,0xB60056CF,0xB70056D0,0xB80056D1,0xB90056D2,0xBA0056D3,0xBB0056D4,0xBC0056D5, +0xBD0056D7,0xBE0056D8,0xBF0056D9,0x000C264B,0x000C2648,0x000C2645,0x000C2642,0x000C263F,0x000C263C,0x000C2639, +0xE1005589,0x000C2636,0x000C2633,0x000C2630,0x800056DD,0x810056DE,0x820056DF,0x000C262D,0x000C262A,0x000C2627, +0x85005657,0x000C2624,0x8600566E,0x87005693,0x000C2621,0x000C261E,0x000C261B,0x000C2618,0x000C2615,0x000C2612, +0x000C260F,0x000C260C,0x000C2609,0x000C2606,0x000C2603,0x000C2600,0x000C25FD,0xE100565B,0x000C25FA,0x000C25F7, +0x000C25F4,0x000C25F1,0x000C25EE,0xE1005599,0xA10056E1,0xA2005731,0xA3005753,0xA40057A5,0xA50057DF,0xA6005816, +0xA700583B,0xA800588D,0xA90058C4,0xAA0058FE,0xAB005938,0xAC005975,0xAD0059AF,0xAE0059E9,0xAF005A20,0xB0005A5A, +0xB1005A94,0xB2005ACE,0xB3005B08,0xB4005B45,0xB5005B7F,0x000C25EB,0x000C25E8,0x000C25E5,0x000C25E2,0x000C25DF, +0x000C25DC,0x8000572E,0x8100572F,0x82005730,0xA80056E4,0xA90056E5,0xAA0056E6,0xAB0056E7,0xAC0056E8,0xAD0056E9, +0xAE0056EA,0xAF0056EB,0xB00056EC,0xB10056ED,0xB20056EE,0xB30056EF,0xB40056F0,0xB50056F2,0xB60056F3,0xB70056F4, +0xB80056F5,0xB90056F6,0xBA00570D,0xBB00570E,0xBC00570F,0xBD005710,0xBE005711,0xBF005712,0x000C25D9,0x000C25D6, +0x000C25D3,0x000C25D0,0x000C25CD,0x000C25CA,0x860056AF,0x870056CD,0x000C25C7,0x000C25C4,0x000C25C1,0x000C25BE, +0x000C25BB,0x000C25B8,0x000C25B5,0x000C25B2,0x000C25AF,0x000C25AC,0x000C25A9,0x000C25A6,0x000C25A3,0x000C25A0, +0x000C259D,0x000C259A,0x000C2597,0x000C2594,0x000C2591,0x000C258E,0xE10055FA,0x000C258B,0x000C2588,0x80005750, +0x81005751,0x82005752,0x000C2585,0x000C2582,0x000C257F,0x000C257C,0x860056C7,0x8700571F,0x000C2579,0xA8005732, +0xA9005733,0xAA005736,0xAB005737,0xAC005738,0xAD005739,0xAE00573A,0xAF00573B,0xB000573C,0xB100573D,0xB200573E, +0xB300573F,0xB4005740,0xB5005741,0xB6005742,0xB7005743,0xB8005744,0xB9005745,0xBA005746,0xBB005747,0xBC005748, +0xBD005749,0xBE00574B,0xBF00574C,0xA8005756,0xA9005788,0xAA005789,0xAB00578A,0xAC00578B,0xAD00578C,0xAE00578D, +0xAF00578E,0xB000578F,0xB1005790,0xB2005791,0xB3005792,0xB4005793,0xB5005794,0xB6005795,0xB7005796,0xB8005797, +0xB9005798,0xBA005799,0xBB00579A,0xBC00579B,0xBD00579C,0xBE00579D,0xBF00579E,0xE1005628,0x000C2576,0x000C2573, +0x000C2570,0x000C256D,0x000C256A,0x000C2567,0x000C2564,0x000C2561,0x000C255E,0x000C255B,0x000C2558,0x000C2555, +0x000C2552,0x000C254F,0x000C254C,0x000C2549,0x000C2546,0x000C2543,0x000C2540,0x000C253D,0x000C253A,0x000C2537, +0x000C2534,0x800057A2,0x810057A3,0x820057A4,0x000C2531,0x000C252E,0x000C252B,0x000C2528,0x86005700,0x87005759, +0xA80057C0,0xA90057C1,0xAA0057C3,0xAB0057C4,0xAC0057C5,0xAD0057C6,0xAE0057C7,0xAF0057C8,0xB00057C9,0xB10057CA, +0xB20057CB,0xB30057CC,0xB40057CD,0xB50057CE,0xB60057CF,0xB70057D0,0xB80057D1,0xB90057D2,0xBA0057D3,0xBB0057D4, +0xBC0057D5,0xBD0057D6,0xBE0057D7,0xBF0057D8,0x000C2525,0x000C2522,0xE100565C,0x000C251F,0x000C251C,0x000C2519, +0x000C2516,0x000C2513,0x000C2510,0x000C250D,0x000C250A,0x000C2507,0x000C2504,0x000C2501,0x000C24FE,0x000C24FB, +0x000C24F8,0x000C24F5,0x000C24F2,0x000C24EF,0x000C24EC,0x000C24E9,0x000C24E6,0x000C24E3,0x000C24E0,0x800057DC, +0x810057DD,0x820057DE,0x000C24DD,0x000C24DA,0x000C24D7,0x000C24D4,0x8600574A,0x8700579F,0x000C24D1,0x000C24CE, +0x000C24CB,0x000C24C8,0x000C24C5,0x000C24C2,0x000C24BF,0x000C24BC,0x000C24B9,0x000C24B6,0x000C24B3,0x000C24B0, +0x000C24AD,0x000C24AA,0x000C24A7,0x000C24A4,0xA80057E2,0xA90057E3,0xAA0057E4,0xAB0057E5,0xAC0057E6,0xAD0057E7, +0xAE0057E8,0xAF0057E9,0xB00057EA,0xB10057EB,0xB20057EC,0xB30057ED,0xB40057EE,0xB50057EF,0xB60057F0,0xB70057F1, +0xB800580A,0xB900580B,0xBA00580C,0xBB00580D,0xBC00580E,0xBD00580F,0xBE005810,0xBF005811,0x000C24A1,0x000C249E, +0x000C249B,0x000C2498,0x000C2495,0x000C2492,0x000C248F,0x000C248C,0xE10056AE,0x000C2489,0x000C2486,0x000C2483, +0x000C2480,0x000C247D,0x000C247A,0x000C2477,0x000C2474,0x000C2471,0x000C246E,0x000C246B,0x000C2468,0x80005813, +0x81005814,0x82005815,0x000C2465,0x000C2462,0x000C245F,0x000C245C,0x860057A1,0x870057B5,0x000C2459,0x000C2456, +0x000C2453,0x000C2450,0x000C244D,0x000C244A,0x000C2447,0x000C2444,0x000C2441,0x000C243E,0x000C243B,0x000C2438, +0xE10056CE,0x80005838,0x81005839,0x8200583A,0x000C2435,0x000C2432,0x000C242F,0x000C242C,0x860057B9,0x87005807, +0x000C2429,0x000C2426,0x000C2423,0x000C2420,0x000C241D,0x000C241A,0x000C2417,0x000C2414,0x000C2411,0x000C240E, +0x000C240B,0xA8005817,0xA9005818,0xAA005819,0xAB00581A,0xAC00581B,0xAD00581C,0xAE00581D,0xAF00581E,0xB0005822, +0xB1005823,0xB2005824,0xB3005825,0xB4005828,0xB5005829,0xB600582A,0xB700582B,0xB800582C,0xB900582D,0xBA00582E, +0xBB00582F,0xBC005830,0xBD005831,0xBE005832,0xBF005833,0xA800583E,0xA900583F,0xAA005840,0xAB005841,0xAC005842, +0xAD005843,0xAE005844,0xAF005845,0xB0005846,0xB1005847,0xB2005848,0xB3005879,0xB400587A,0xB500587B,0xB600587C, +0xB700587D,0xB800587E,0xB900587F,0xBA005880,0xBB005881,0xBC005882,0xBD005883,0xBE005884,0xBF005885,0x000C2408, +0x000C2405,0x000C2402,0x000C23FF,0x000C23FC,0x000C23F9,0x000C23F6,0x000C23F3,0x000C23F0,0x000C23ED,0x000C23EA, +0x000C23E7,0x000C23E4,0xE1005720,0x8000588A,0x8100588B,0x8200588C,0x000C23E1,0x000C23DE,0x000C23DB,0x000C23D8, +0x860057F2,0x87005849,0x000C23D5,0x000C23D2,0x000C23CF,0x000C23CC,0x000C23C9,0x000C23C6,0x000C23C3,0x000C23C0, +0x000C23BD,0x000C23BA,0xA8005890,0xA9005891,0xAA005892,0xAB005893,0xAC005894,0xAD005895,0xAE005896,0xAF005897, +0xB0005898,0xB1005899,0xB20058B2,0xB30058B3,0xB40058B4,0xB50058B5,0xB60058B6,0xB70058B7,0xB80058B8,0xB90058B9, +0xBA0058BA,0xBB0058BB,0xBC0058BC,0xBD0058BD,0xBE0058BE,0xBF0058BF,0x000C23B7,0x000C23B4,0x000C23B1,0x000C23AE, +0x000C23AB,0x000C23A8,0x000C23A5,0x000C23A2,0x000C239F,0x000C239C,0x000C2399,0x000C2396,0x000C2393,0x000C2390, +0xE100575A,0x000C238D,0x000C238A,0x000C2387,0x000C2384,0x000C2381,0x000C237E,0x000C237B,0x000C2378,0x800058C1, +0x810058C2,0x820058C3,0x000C2375,0x000C2372,0x000C236F,0x000C236C,0x86005834,0x87005886,0x000C2369,0x000C2366, +0x000C2363,0x000C2360,0x000C235D,0x000C235A,0x000C2357,0x000C2354,0x000C2351,0x000C234E,0xA80058C5,0xA90058C6, +0xAA0058C7,0xAB0058C8,0xAC0058CC,0xAD0058CD,0xAE0058CE,0xAF0058CF,0xB00058D2,0xB10058D3,0xB20058D4,0xB30058D5, +0xB40058D6,0xB50058D7,0xB60058D8,0xB70058D9,0xB80058DA,0xB90058DB,0xBA0058F4,0xBB0058F5,0xBC0058F6,0xBD0058F8, +0xBE0058F9,0xBF0058FA,0x000C234B,0x000C2348,0x000C2345,0xE10057A0,0x000C2342,0x000C233F,0x000C233C,0x000C2339, +0x000C2336,0x000C2333,0x000C2330,0x000C232D,0x000C232A,0x000C2327,0x000C2324,0x000C2321,0x000C231E,0x000C231B, +0x800058FB,0x810058FC,0x820058FD,0x000C2318,0x000C2315,0x000C2312,0x000C230F,0x86005875,0x870058C0,0x000C230C, +0x000C2309,0x000C2306,0x000C2303,0x000C2300,0x000C22FD,0x000C22FA,0x000C22F7,0x000C22F4,0x000C22F1,0x000C22EE, +0x000C22EB,0x000C22E8,0xE10057B6,0xA80058FF,0xA9005900,0xAA005901,0xAB005902,0xAC005903,0xAD005904,0xAE005905, +0xAF005909,0xB000590A,0xB100590B,0xB200590C,0xB300590F,0xB4005910,0xB5005911,0xB6005912,0xB7005913,0xB8005914, +0xB9005915,0xBA005916,0xBB005917,0xBC005918,0xBD005919,0xBE00591A,0xBF00591B,0x000C22E5,0x000C22E2,0x000C22DF, +0x000C22DC,0x000C22D9,0x000C22D6,0x000C22D3,0x000C22D0,0x000C22CD,0x000C22CA,0x000C22C7,0x80005935,0x81005936, +0x82005937,0x000C22C4,0x000C22C1,0x000C22BE,0x000C22BB,0x000C22B8,0x000C22B5,0x000C22B2,0x000C22AF,0x000C22AC, +0x000C22A9,0x000C22A6,0x000C22A3,0x860058A9,0x870058EF,0xA8005939,0xA900593A,0xAA00593B,0xAB00593C,0xAC00593D, +0xAD00593E,0xAE00593F,0xAF005943,0xB0005944,0xB1005945,0xB2005946,0xB3005947,0xB4005948,0xB5005949,0xB600594A, +0xB700594B,0xB800594C,0xB900594D,0xBA00594E,0xBB005969,0xBC00596A,0xBD00596B,0xBE00596C,0xBF00596D,0x000C22A0, +0x000C229D,0x000C229A,0x000C2297,0x000C2294,0xE1005808,0x80005972,0x81005973,0x82005974,0x000C2291,0x000C228E, +0x000C228B,0x000C2288,0x860058D0,0x87005929,0xA8005990,0xA9005991,0xAA005992,0xAB005993,0xAC005994,0xAD005995, +0xAE005996,0xAF005997,0xB0005998,0xB1005999,0xB200599A,0xB300599B,0xB400599C,0xB500599D,0xB600599E,0xB700599F, +0xB80059A0,0xB90059A1,0xBA0059A2,0xBB0059A3,0xBC0059A4,0xBD0059A6,0xBE0059A7,0xBF0059A8,0x000C2285,0x000C2282, +0x000C227F,0x000C227C,0x000C2279,0x000C2276,0x000C2273,0x000C2270,0x000C226D,0x000C226A,0x000C2267,0x000C2264, +0x000C2261,0x000C225E,0x000C225B,0x000C2258,0x000C2255,0x000C2252,0x000C224F,0x000C224C,0x000C2249,0xE100584A, +0x000C2246,0x000C2243,0x000C2240,0x800059AC,0x810059AD,0x820059AE,0x000C223D,0x000C223A,0x000C2237,0x000C2234, +0x8600590D,0x87005963,0x000C2231,0x000C222E,0x000C222B,0xA80059B2,0xA90059B3,0xAA0059B4,0xAB0059CD,0xAC0059CE, +0xAD0059CF,0xAE0059D0,0xAF0059D1,0xB00059D2,0xB10059D3,0xB20059D4,0xB30059D5,0xB40059D6,0xB50059D7,0xB60059D8, +0xB70059D9,0xB80059DA,0xB90059DB,0xBA0059DC,0xBB0059DD,0xBC0059DE,0xBD0059E0,0xBE0059E1,0xBF0059E2,0x000C2228, +0x000C2225,0x000C2222,0x000C221F,0x000C221C,0x000C2219,0x000C2216,0x000C2213,0x000C2210,0x000C220D,0x000C220A, +0x000C2207,0x000C2204,0x000C2201,0x000C21FE,0x000C21FB,0x000C21F8,0x000C21F5,0xE1005887,0x000C21F2,0x000C21EF, +0x000C21EC,0x800059E6,0x810059E7,0x820059E8,0x000C21E9,0x000C21E6,0x000C21E3,0x000C21E0,0x8600594F,0x870059A5, +0x000C21DD,0x000C21DA,0x000C21D7,0x000C21D4,0x000C21D1,0x000C21CE,0x000C21CB,0x000C21C8,0x000C21C5,0x000C21C2, +0x000C21BF,0xA80059EC,0xA90059ED,0xAA0059EE,0xAB0059EF,0xAC0059F0,0xAD0059F1,0xAE0059F2,0xAF0059F3,0xB00059F4, +0xB10059F5,0xB20059F6,0xB3005A0F,0xB4005A10,0xB5005A11,0xB6005A12,0xB7005A13,0xB8005A14,0xB9005A15,0xBA005A16, +0xBB005A17,0xBC005A18,0xBD005A1A,0xBE005A1B,0xBF005A1C,0x000C21BC,0x000C21B9,0x000C21B6,0x000C21B3,0x000C21B0, +0x000C21AD,0x000C21AA,0x000C21A7,0x000C21A4,0x000C21A1,0xE10058C9,0x000C219E,0x000C219B,0x000C2198,0x000C2195, +0x000C2192,0x000C218F,0x000C218C,0x000C2189,0x000C2186,0x000C2183,0x000C2180,0x80005A1D,0x81005A1E,0x82005A1F, +0x000C217D,0x000C217A,0x000C2177,0x000C2174,0x000C2171,0x000C216E,0x000C216B,0x86005989,0x870059DF,0xA8005A21, +0xA9005A22,0xAA005A23,0xAB005A24,0xAC005A28,0xAD005A29,0xAE005A2A,0xAF005A2B,0xB0005A2C,0xB1005A2D,0xB2005A2E, +0xB3005A49,0xB4005A4A,0xB5005A4B,0xB6005A4C,0xB7005A4D,0xB8005A4E,0xB9005A4F,0xBA005A50,0xBB005A51,0xBC005A52, +0xBD005A53,0xBE005A54,0xBF005A55,0x000C2168,0x000C2165,0x000C2162,0x000C215F,0x000C215C,0x000C2159,0x000C2156, +0x000C2153,0x000C2150,0x000C214D,0x000C214A,0x000C2147,0x000C2144,0xE10058F0,0x000C2141,0x000C213E,0x000C213B, +0x000C2138,0x000C2135,0x000C2132,0x000C212F,0x000C212C,0x80005A57,0x81005A58,0x82005A59,0x000C2129,0x000C2126, +0x000C2123,0x000C2120,0x000C211D,0x000C211A,0x000C2117,0x860059C3,0x87005A19,0xA8005A5B,0xA9005A5C,0xAA005A5D, +0xAB005A5E,0xAC005A62,0xAD005A63,0xAE005A64,0xAF005A65,0xB0005A66,0xB1005A67,0xB2005A68,0xB3005A83,0xB4005A84, +0xB5005A85,0xB6005A86,0xB7005A87,0xB8005A88,0xB9005A89,0xBA005A8A,0xBB005A8B,0xBC005A8C,0xBD005A8D,0xBE005A8E, +0xBF005A8F,0x000C2114,0x000C2111,0x000C210E,0x000C210B,0x000C2108,0x000C2105,0x000C2102,0x000C20FF,0x000C20FC, +0x000C20F9,0x000C20F6,0x000C20F3,0x000C20F0,0xE100592A,0x000C20ED,0x000C20EA,0x000C20E7,0x000C20E4,0x000C20E1, +0x000C20DE,0x000C20DB,0x000C20D8,0x80005A91,0x81005A92,0x82005A93,0x000C20D5,0x000C20D2,0x000C20CF,0x000C20CC, +0x000C20C9,0x000C20C6,0x000C20C3,0x000C20C0,0x000C20BD,0x000C20BA,0x000C20B7,0x000C20B4,0x000C20B1,0x000C20AE, +0x000C20AB,0x86005A05,0x87005A56,0xA8005A95,0xA9005A96,0xAA005A97,0xAB005A98,0xAC005A9C,0xAD005A9D,0xAE005A9E, +0xAF005A9F,0xB0005AA0,0xB1005AA1,0xB2005AA2,0xB3005AA3,0xB4005AA4,0xB5005AA5,0xB6005AA6,0xB7005AA7,0xB8005AA8, +0xB9005AA9,0xBA005AAA,0xBB005AC5,0xBC005AC6,0xBD005AC7,0xBE005AC8,0xBF005AC9,0x000C20A8,0x000C20A5,0x000C20A2, +0x000C209F,0x000C209C,0xE1005964,0x000C2099,0x000C2096,0x000C2093,0x000C2090,0x000C208D,0x000C208A,0x000C2087, +0x000C2084,0x000C2081,0x000C207E,0x000C207B,0x80005ACB,0x81005ACC,0x82005ACD,0x000C2078,0x000C2075,0x000C2072, +0x000C206F,0x000C206C,0x000C2069,0x000C2066,0x000C2063,0x000C2060,0x000C205D,0x000C205A,0x000C2057,0x86005A3F, +0x87005A90,0xA8005ACF,0xA9005AD0,0xAA005AD1,0xAB005AD2,0xAC005AD3,0xAD005AD4,0xAE005AD5,0xAF005AD9,0xB0005ADA, +0xB1005ADB,0xB2005ADC,0xB3005ADD,0xB4005ADE,0xB5005ADF,0xB6005AE0,0xB7005AE1,0xB8005AE2,0xB9005AE3,0xBA005AE4, +0xBB005AFF,0xBC005B00,0xBD005B02,0xBE005B03,0xBF005B04,0x000C2054,0x000C2051,0xE10059A9,0x000C204E,0x000C204B, +0x000C2048,0x000C2045,0x000C2042,0x000C203F,0x000C203C,0x000C2039,0x000C2036,0x000C2033,0x000C2030,0x000C202D, +0x000C202A,0x000C2027,0x80005B05,0x81005B06,0x82005B07,0x000C2024,0x000C2021,0x000C201E,0x000C201B,0x000C2018, +0x000C2015,0x000C2012,0x000C200F,0x000C200C,0x000C2009,0x000C2006,0x000C2003,0x86005A79,0x87005ABF,0xA8005B09, +0xA9005B0A,0xAA005B0B,0xAB005B0C,0xAC005B0D,0xAD005B0E,0xAE005B0F,0xAF005B13,0xB0005B14,0xB1005B15,0xB2005B16, +0xB3005B17,0xB4005B18,0xB5005B19,0xB6005B1A,0xB7005B1B,0xB8005B1C,0xB9005B1D,0xBA005B1E,0xBB005B39,0xBC005B3A, +0xBD005B3C,0xBE005B3D,0xBF005B3E,0x000C2000,0x000C1FFD,0xE10059E3,0x000C1FFA,0x000C1FF7,0x000C1FF4,0x80005B42, +0x81005B43,0x82005B44,0x000C1FF1,0x000C1FEE,0x000C1FEB,0x000C1FE8,0x86005AAB,0x87005AF9,0x000C1FE5,0x000C1FE2, +0x000C1FDF,0x000C1FDC,0x000C1FD9,0x000C1FD6,0x000C1FD3,0x000C1FD0,0x000C1FCD,0x000C1FCA,0x000C1FC7,0xA8005B48, +0xA9005B49,0xAA005B4A,0xAB005B4B,0xAC005B4C,0xAD005B4D,0xAE005B4E,0xAF005B4F,0xB0005B50,0xB1005B51,0xB2005B52, +0xB3005B6B,0xB4005B6C,0xB5005B6D,0xB6005B6E,0xB7005B6F,0xB8005B70,0xB9005B71,0xBA005B72,0xBB005B73,0xBC005B74, +0xBD005B76,0xBE005B77,0xBF005B78,0x000C1FC4,0x000C1FC1,0x000C1FBE,0x000C1FBB,0x000C1FB8,0x000C1FB5,0x000C1FB2, +0x000C1FAF,0x000C1FAC,0x000C1FA9,0xE1005A25,0x000C1FA6,0x000C1FA3,0x000C1FA0,0x80005B7C,0x81005B7D,0x82005B7E, +0x000C1F9D,0x000C1F9A,0x000C1F97,0x000C1F94,0x86005AE5,0x87005B33,0x000C1F91,0x000C1F8E,0x000C1F8B,0x000C1F88, +0x000C1F85,0x000C1F82,0x000C1F7F,0x000C1F7C,0x000C1F79,0x000C1F76,0x000C1F73,0xA8005B82,0xA9005B83,0xAA005B84, +0xAB005B85,0xAC005B86,0xAD005B87,0xAE005B88,0xAF005B89,0xB0005B8A,0xB1005B8B,0xB2005B8C,0xB3005BA5,0xB4005BA6, +0xB5005BA7,0xB6005BA8,0xB7005BA9,0xB8005BAA,0xB9005BAB,0xBA005BAC,0xBB005BAD,0xBC005BAE,0xBD005BB0,0xBE005BB1, +0xBF005BB2,0x000C1F70,0x000C1F6D,0x000C1F6A,0x000C1F67,0x000C1F64,0x000C1F61,0x000C1F5E,0x000C1F5B,0x000C1F58, +0x000C1F55,0xE1005A5F,0x000C1F52,0x000C1F4F,0x000C1F4C,0x80005BB6,0x81005BB7,0x82005BB8,0x000C1F49,0x000C1F46, +0x000C1F43,0xE1005B35,0x85005B1F,0x000C1F40,0x86005B46,0x87005B8D,0x000C1F3D,0x000C1F3A,0xA1005BBB,0xA2005C07, +0xA3005C44,0xA4005C7E,0xA5005CB8,0xA6005CF2,0xA7005D2C,0xA8005D63,0xA9005DA0,0xAA005DDA,0xAB005E11,0xAC005E4B, +0xAD005E88,0xAE005EBF,0xAF005EF9,0xB0005F33,0xB1005F70,0xB2005FA7,0xB3005FC8,0xB400601B,0xB5006058,0x000C1F37, +0x000C1F34,0x000C1F31,0x000C1F2E,0x000C1F2B,0x000C1F28,0x000C1F25,0x000C1F22,0x000C1F1F,0x000C1F1C,0x000C1F19, +0x000C1F16,0x000C1F13,0x000C1F10,0x000C1F0D,0x000C1F0A,0x000C1F07,0x000C1F04,0x000C1F01,0x000C1EFE,0xE1005A99, +0x000C1EFB,0x000C1EF8,0x000C1EF5,0x000C1EF2,0xA8005BBE,0xA9005BBF,0xAA005BD5,0xAB005BD6,0xAC005BD7,0xAD005BD8, +0xAE005BD9,0xAF005BDA,0xB0005BDB,0xB1005BDC,0xB2005BDD,0xB3005BDE,0xB4005BDF,0xB5005BE0,0xB6005BE1,0xB7005BE2, +0xB8005BE3,0xB9005BE4,0xBA005BE5,0xBB005BE6,0xBC005BE7,0xBD005BE8,0xBE005BEA,0xBF005BEB,0x000C1EEF,0x000C1EEC, +0x000C1EE9,0x000C1EE6,0x000C1EE3,0x000C1EE0,0x000C1EDD,0x80005BEC,0x81005BED,0x82005C06,0x000C1EDA,0x000C1ED7, +0x000C1ED4,0x000C1ED1,0x86005B80,0x87005BC0,0x000C1ECE,0x000C1ECB,0x000C1EC8,0x000C1EC5,0x000C1EC2,0x000C1EBF, +0x000C1EBC,0x000C1EB9,0x000C1EB6,0x000C1EB3,0x000C1EB0,0x000C1EAD,0x000C1EAA,0x000C1EA7,0x000C1EA4,0x000C1EA1, +0xE1005AC0,0x000C1E9E,0xA8005C08,0xA9005C09,0xAA005C0A,0xAB005C0B,0xAC005C0C,0xAD005C10,0xAE005C11,0xAF005C12, +0xB0005C13,0xB1005C16,0xB2005C17,0xB3005C18,0xB4005C19,0xB5005C1A,0xB6005C1B,0xB7005C1C,0xB8005C1D,0xB9005C1E, +0xBA005C1F,0xBB005C20,0xBC005C21,0xBD005C22,0xBE005C23,0xBF005C24,0x80005C25,0x81005C27,0x82005C43,0x000C1E9B, +0x000C1E98,0x000C1E95,0x000C1E92,0x86005BB9,0x87005BF9,0x000C1E8F,0x000C1E8C,0x000C1E89,0x000C1E86,0x000C1E83, +0x000C1E80,0x000C1E7D,0x000C1E7A,0x000C1E77,0x000C1E74,0x000C1E71,0x000C1E6E,0x000C1E6B,0x000C1E68,0x000C1E65, +0x000C1E62,0x000C1E5F,0x000C1E5C,0x000C1E59,0x000C1E56,0x000C1E53,0x000C1E50,0x000C1E4D,0xE1005AFA,0xA8005C45, +0xA9005C46,0xAA005C49,0xAB005C4A,0xAC005C4B,0xAD005C4C,0xAE005C4D,0xAF005C4E,0xB0005C4F,0xB1005C50,0xB2005C51, +0xB3005C52,0xB4005C53,0xB5005C54,0xB6005C55,0xB7005C56,0xB8005C57,0xB9005C58,0xBA005C59,0xBB005C5A,0xBC005C5B, +0xBD005C5C,0xBE005C5D,0xBF005C5E,0x80005C5F,0x81005C7C,0x82005C7D,0x000C1E4A,0x000C1E47,0x000C1E44,0x000C1E41, +0x86005BF5,0x87005C35,0x000C1E3E,0x000C1E3B,0x000C1E38,0x000C1E35,0x000C1E32,0x000C1E2F,0x000C1E2C,0x000C1E29, +0x000C1E26,0x000C1E23,0x000C1E20,0x000C1E1D,0x000C1E1A,0x000C1E17,0x000C1E14,0x000C1E11,0x000C1E0E,0x000C1E0B, +0x000C1E08,0x000C1E05,0x000C1E02,0x000C1DFF,0x000C1DFC,0x000C1DF9,0x000C1DF6,0x000C1DF3,0xE1005B36,0xA8005C7F, +0xA9005C82,0xAA005C83,0xAB005C84,0xAC005C85,0xAD005C86,0xAE005C87,0xAF005C88,0xB0005C89,0xB1005C8A,0xB2005C8B, +0xB3005C8C,0xB4005C8D,0xB5005C8E,0xB6005C8F,0xB7005C90,0xB8005C91,0xB9005C92,0xBA005C93,0xBB005C94,0xBC005C95, +0xBD005C96,0xBE005C97,0xBF005C98,0x80005C99,0x81005C9A,0x82005C9B,0x000C1DF0,0x86005C14,0x87005C6C,0x000C1DED, +0xA8005CBB,0xA9005CD4,0xAA005CD5,0xAB005CD6,0xAC005CD7,0xAD005CD8,0xAE005CD9,0xAF005CDA,0xB0005CDB,0xB1005CDC, +0xB2005CDD,0xB3005CDE,0xB4005CDF,0xB5005CE0,0xB6005CE1,0xB7005CE2,0xB8005CE3,0xB9005CE4,0xBA005CE5,0xBB005CE6, +0xBC005CE7,0xBD005CE9,0xBE005CEA,0xBF005CEB,0x000C1DEA,0x000C1DE7,0x000C1DE4,0x000C1DE1,0x000C1DDE,0x000C1DDB, +0x000C1DD8,0x000C1DD5,0x000C1DD2,0x000C1DCF,0x000C1DCC,0x000C1DC9,0x000C1DC6,0x000C1DC3,0x000C1DC0,0x000C1DBD, +0x000C1DBA,0x000C1DB7,0x000C1DB4,0x000C1DB1,0xE1005B8E,0x000C1DAE,0x000C1DAB,0x000C1DA8,0x80005CEF,0x81005CF0, +0x82005CF1,0x000C1DA5,0x000C1DA2,0x000C1D9F,0x000C1D9C,0x86005C60,0x87005CA6,0x000C1D99,0x000C1D96,0x000C1D93, +0x000C1D90,0x000C1D8D,0x000C1D8A,0x000C1D87,0x000C1D84,0x000C1D81,0x000C1D7E,0x000C1D7B,0x000C1D78,0x000C1D75, +0x000C1D72,0x000C1D6F,0x000C1D6C,0x000C1D69,0x000C1D66,0x000C1D63,0xA8005CF5,0xA9005CF6,0xAA005CF7,0xAB005CF8, +0xAC005CF9,0xAD005CFA,0xAE005CFB,0xAF005CFC,0xB0005CFD,0xB1005CFE,0xB2005CFF,0xB3005D00,0xB4005D01,0xB5005D02, +0xB6005D03,0xB7005D04,0xB8005D05,0xB9005D06,0xBA005D07,0xBB005D20,0xBC005D21,0xBD005D22,0xBE005D23,0xBF005D24, +0x000C1D60,0x000C1D5D,0x000C1D5A,0x000C1D57,0x000C1D54,0xE1005BC1,0x80005D29,0x81005D2A,0x82005D2B,0x000C1D51, +0x000C1D4E,0x000C1D4B,0x000C1D48,0x86005C9C,0x87005CE8,0x000C1D45,0x000C1D42,0x000C1D3F,0x000C1D3C,0x000C1D39, +0x000C1D36,0x000C1D33,0x000C1D30,0x000C1D2D,0x000C1D2A,0x000C1D27,0x000C1D24,0x000C1D21,0x000C1D1E,0x000C1D1B, +0x000C1D18,0x000C1D15,0x000C1D12,0x000C1D0F,0x000C1D0C,0x000C1D09,0xA8005D2F,0xA9005D30,0xAA005D31,0xAB005D32, +0xAC005D33,0xAD005D34,0xAE005D35,0xAF005D36,0xB0005D37,0xB1005D38,0xB2005D39,0xB3005D3A,0xB4005D3B,0xB5005D3C, +0xB6005D3D,0xB7005D3E,0xB8005D3F,0xB9005D40,0xBA005D41,0xBB005D42,0xBC005D43,0xBD005D5C,0xBE005D5D,0xBF005D5E, +0x000C1D06,0x000C1D03,0x000C1D00,0xE1005BFA,0x000C1CFD,0x000C1CFA,0x000C1CF7,0x000C1CF4,0x000C1CF1,0x000C1CEE, +0x000C1CEB,0x000C1CE8,0x80005D60,0x81005D61,0x82005D62,0x000C1CE5,0x000C1CE2,0x000C1CDF,0x000C1CDC,0x000C1CD9, +0x000C1CD6,0x000C1CD3,0x86005CCC,0x87005D1A,0xA8005D64,0xA9005D65,0xAA005D66,0xAB005D67,0xAC005D6B,0xAD005D6C, +0xAE005D6D,0xAF005D6E,0xB0005D6F,0xB1005D70,0xB2005D71,0xB3005D8C,0xB4005D8D,0xB5005D8E,0xB6005D8F,0xB7005D90, +0xB8005D91,0xB9005D92,0xBA005D93,0xBB005D94,0xBC005D95,0xBD005D96,0xBE005D97,0xBF005D98,0x000C1CD0,0x000C1CCD, +0x000C1CCA,0x000C1CC7,0x000C1CC4,0x000C1CC1,0x000C1CBE,0x000C1CBB,0x000C1CB8,0x000C1CB5,0x000C1CB2,0x000C1CAF, +0x000C1CAC,0xE1005C33,0x80005D9D,0x81005D9E,0x82005D9F,0x000C1CA9,0x000C1CA6,0x000C1CA3,0x000C1CA0,0x86005D08, +0x87005D54,0x000C1C9D,0x000C1C9A,0x000C1C97,0x000C1C94,0x000C1C91,0x000C1C8E,0x000C1C8B,0x000C1C88,0x000C1C85, +0x000C1C82,0x000C1C7F,0x000C1C7C,0x000C1C79,0xA8005DA3,0xA9005DA4,0xAA005DA5,0xAB005DA6,0xAC005DA7,0xAD005DA8, +0xAE005DA9,0xAF005DAA,0xB0005DAB,0xB1005DAC,0xB2005DAD,0xB3005DAE,0xB4005DAF,0xB5005DC8,0xB6005DC9,0xB7005DCA, +0xB8005DCB,0xB9005DCC,0xBA005DCD,0xBB005DCE,0xBC005DCF,0xBD005DD0,0xBE005DD1,0xBF005DD2,0x000C1C76,0x000C1C73, +0x000C1C70,0x000C1C6D,0x000C1C6A,0x000C1C67,0x000C1C64,0x000C1C61,0x000C1C5E,0x000C1C5B,0x000C1C58,0xE1005C6D, +0x80005DD7,0x81005DD8,0x82005DD9,0x000C1C55,0x000C1C52,0x000C1C4F,0x000C1C4C,0x86005D44,0x87005D99,0x000C1C49, +0x000C1C46,0x000C1C43,0x000C1C40,0x000C1C3D,0x000C1C3A,0x000C1C37,0x000C1C34,0x000C1C31,0x000C1C2E,0x000C1C2B, +0x000C1C28,0x000C1C25,0x000C1C22,0x000C1C1F,0xA8005DDD,0xA9005DDE,0xAA005DDF,0xAB005DE0,0xAC005DE1,0xAD005DE2, +0xAE005DE3,0xAF005DE4,0xB0005DE5,0xB1005DE6,0xB2005DE7,0xB3005DE8,0xB4005DE9,0xB5005DEA,0xB6005DEB,0xB7005E04, +0xB8005E05,0xB9005E06,0xBA005E07,0xBB005E08,0xBC005E09,0xBD005E0A,0xBE005E0B,0xBF005E0C,0x000C1C1C,0x000C1C19, +0x000C1C16,0x000C1C13,0x000C1C10,0x000C1C0D,0x000C1C0A,0x000C1C07,0x000C1C04,0xE1005CA7,0x000C1C01,0x000C1BFE, +0x000C1BFB,0x000C1BF8,0x000C1BF5,0x000C1BF2,0x000C1BEF,0x000C1BEC,0x000C1BE9,0x000C1BE6,0x000C1BE3,0x80005E0E, +0x81005E0F,0x82005E10,0x000C1BE0,0x000C1BDD,0x000C1BDA,0x000C1BD7,0x86005D7A,0x87005DD3,0xA8005E12,0xA9005E13, +0xAA005E14,0xAB005E15,0xAC005E16,0xAD005E17,0xAE005E18,0xAF005E1C,0xB0005E1D,0xB1005E1E,0xB2005E1F,0xB3005E3A, +0xB4005E3B,0xB5005E3C,0xB6005E3D,0xB7005E3E,0xB8005E3F,0xB9005E40,0xBA005E41,0xBB005E42,0xBC005E43,0xBD005E45, +0xBE005E46,0xBF005E47,0x000C1BD4,0x000C1BD1,0x000C1BCE,0x000C1BCB,0x000C1BC8,0x000C1BC5,0x000C1BC2,0x000C1BBF, +0x000C1BBC,0x000C1BB9,0xE1005CEC,0x000C1BB6,0x000C1BB3,0x000C1BB0,0x000C1BAD,0x000C1BAA,0x000C1BA7,0x000C1BA4, +0x86005DB0,0x87005E02,0x000C1BA1,0x000C1B9E,0x000C1B9B,0x000C1B98,0x000C1B95,0x80005E48,0x81005E49,0x82005E4A, +0x000C1B92,0x000C1B8F,0xA8005E4E,0xA9005E4F,0xAA005E50,0xAB005E51,0xAC005E52,0xAD005E56,0xAE005E57,0xAF005E70, +0xB0005E71,0xB1005E72,0xB2005E73,0xB3005E74,0xB4005E75,0xB5005E76,0xB6005E77,0xB7005E78,0xB8005E79,0xB9005E7A, +0xBA005E7B,0xBB005E7C,0xBC005E7D,0xBD005E7E,0xBE005E7F,0xBF005E80,0x000C1B8C,0x000C1B89,0x000C1B86,0x000C1B83, +0x000C1B80,0x000C1B7D,0x000C1B7A,0x000C1B77,0x000C1B74,0x000C1B71,0x000C1B6E,0x000C1B6B,0x000C1B68,0x000C1B65, +0x000C1B62,0x000C1B5F,0x000C1B5C,0xE1005D1B,0x80005E85,0x81005E86,0x82005E87,0x000C1B59,0x000C1B56,0x000C1B53, +0x000C1B50,0x86005DEC,0x87005E44,0x000C1B4D,0x000C1B4A,0x000C1B47,0x000C1B44,0x000C1B41,0x000C1B3E,0x000C1B3B, +0x000C1B38,0x000C1B35,0xA8005E8B,0xA9005E8C,0xAA005E8D,0xAB005E8E,0xAC005E8F,0xAD005E90,0xAE005E91,0xAF005E92, +0xB0005E93,0xB1005EAC,0xB2005EAD,0xB3005EAE,0xB4005EAF,0xB5005EB0,0xB6005EB1,0xB7005EB2,0xB8005EB3,0xB9005EB4, +0xBA005EB5,0xBB005EB6,0xBC005EB7,0xBD005EB8,0xBE005EB9,0xBF005EBA,0x000C1B32,0x000C1B2F,0x000C1B2C,0x000C1B29, +0x000C1B26,0x000C1B23,0x000C1B20,0x000C1B1D,0x000C1B1A,0x000C1B17,0x000C1B14,0x000C1B11,0x000C1B0E,0x000C1B0B, +0x000C1B08,0xE1005D55,0x000C1B05,0x000C1B02,0x000C1AFF,0x000C1AFC,0x000C1AF9,0x000C1AF6,0x000C1AF3,0x000C1AF0, +0x80005EBC,0x81005EBD,0x82005EBE,0x000C1AED,0x000C1AEA,0x000C1AE7,0x000C1AE4,0x000C1AE1,0x000C1ADE,0x000C1ADB, +0x000C1AD8,0x000C1AD5,0x000C1AD2,0x000C1ACF,0x86005E2C,0x87005E81,0xA8005EC0,0xA9005EC1,0xAA005EC2,0xAB005EC3, +0xAC005EC7,0xAD005EC8,0xAE005EC9,0xAF005ECA,0xB0005ECB,0xB1005ECC,0xB2005ECD,0xB3005ECE,0xB4005ECF,0xB5005ED0, +0xB6005ED1,0xB7005EEC,0xB8005EED,0xB9005EEE,0xBA005EEF,0xBB005EF0,0xBC005EF1,0xBD005EF3,0xBE005EF4,0xBF005EF5, +0x000C1ACC,0x000C1AC9,0x000C1AC6,0x000C1AC3,0x000C1AC0,0x000C1ABD,0xE1005D9A,0x000C1ABA,0x000C1AB7,0x000C1AB4, +0x000C1AB1,0x000C1AAE,0x000C1AAB,0x000C1AA8,0x000C1AA5,0x000C1AA2,0x000C1A9F,0x000C1A9C,0x000C1A99,0x000C1A96, +0x000C1A93,0x80005EF6,0x81005EF7,0x82005EF8,0x000C1A90,0x000C1A8D,0x000C1A8A,0x000C1A87,0x86005E62,0x87005EBB, +0xA8005EFA,0xA9005EFB,0xAA005EFC,0xAB005EFD,0xAC005EFE,0xAD005EFF,0xAE005F00,0xAF005F04,0xB0005F05,0xB1005F06, +0xB2005F07,0xB3005F22,0xB4005F23,0xB5005F24,0xB6005F25,0xB7005F26,0xB8005F27,0xB9005F28,0xBA005F29,0xBB005F2A, +0xBC005F2B,0xBD005F2D,0xBE005F2E,0xBF005F2F,0x000C1A84,0x000C1A81,0x000C1A7E,0x000C1A7B,0x000C1A78,0x000C1A75, +0x000C1A72,0x000C1A6F,0x000C1A6C,0x000C1A69,0xE1005DC6,0x000C1A66,0x000C1A63,0x000C1A60,0x000C1A5D,0x000C1A5A, +0x000C1A57,0x000C1A54,0x000C1A51,0x000C1A4E,0x000C1A4B,0x000C1A48,0x000C1A45,0x000C1A42,0x000C1A3F,0x80005F30, +0x81005F31,0x82005F32,0x000C1A3C,0x000C1A39,0x000C1A36,0x000C1A33,0x000C1A30,0x000C1A2D,0x000C1A2A,0x000C1A27, +0x000C1A24,0x000C1A21,0x000C1A1E,0x000C1A1B,0x86005EA4,0x87005EEA,0xA8005F34,0xA9005F35,0xAA005F36,0xAB005F37, +0xAC005F38,0xAD005F39,0xAE005F3A,0xAF005F3E,0xB0005F3F,0xB1005F40,0xB2005F41,0xB3005F42,0xB4005F43,0xB5005F44, +0xB6005F45,0xB7005F46,0xB8005F47,0xB9005F48,0xBA005F49,0xBB005F64,0xBC005F65,0xBD005F66,0xBE005F67,0xBF005F68, +0x000C1A18,0x000C1A15,0x000C1A12,0x000C1A0F,0x000C1A0C,0xE1005E03,0x80005F6D,0x81005F6E,0x82005F6F,0x000C1A09, +0x000C1A06,0x000C1A03,0x000C1A00,0x86005ED2,0x87005F2C,0x000C19FD,0x000C19FA,0x000C19F7,0x000C19F4,0x000C19F1, +0x000C19EE,0x000C19EB,0xA8005F73,0xA9005F74,0xAA005F75,0xAB005F76,0xAC005F77,0xAD005F78,0xAE005F79,0xAF005F92, +0xB0005F93,0xB1005F94,0xB2005F95,0xB3005F96,0xB4005F97,0xB5005F98,0xB6005F99,0xB7005F9A,0xB8005F9B,0xB9005F9C, +0xBA005F9D,0xBB005F9E,0xBC005F9F,0xBD005FA1,0xBE005FA2,0xBF005FA3,0x000C19E8,0x000C19E5,0x000C19E2,0x000C19DF, +0x000C19DC,0x000C19D9,0x000C19D6,0x000C19D3,0x000C19D0,0x000C19CD,0x000C19CA,0x000C19C7,0x000C19C4,0x000C19C1, +0xE1005E4C,0x000C19BE,0x000C19BB,0x000C19B8,0x000C19B5,0x000C19B2,0x000C19AF,0x000C19AC,0x000C19A9,0x000C19A6, +0x000C19A3,0x000C19A0,0x80005FA4,0x81005FA5,0x82005FA6,0x000C199D,0x000C199A,0x000C1997,0x000C1994,0x000C1991, +0x000C198E,0x000C198B,0x000C1988,0x000C1985,0x000C1982,0x000C197F,0x000C197C,0x000C1979,0x000C1976,0x000C1973, +0x000C1970,0x000C196D,0x000C196A,0x86005F3C,0x87005F4A,0x000C1967,0x000C1964,0x000C1961,0x000C195E,0x000C195B, +0x000C1958,0x000C1955,0x80005FC5,0x81005FC6,0x82005FC7,0x000C1952,0x000C194F,0x000C194C,0x000C1949,0x86005F54, +0x87005FA0,0x000C1946,0x000C1943,0x000C1940,0x000C193D,0x000C193A,0x000C1937,0x000C1934,0xE1005E82,0x000C1931, +0x000C192E,0x000C192B,0x000C1928,0x000C1925,0x000C1922,0x000C191F,0x000C191C,0x000C1919,0xA8005FA8,0xA9005FA9, +0xAA005FAA,0xAB005FAB,0xAC005FAF,0xAD005FB0,0xAE005FB1,0xAF005FB2,0xB0005FB3,0xB1005FB4,0xB2005FB5,0xB3005FB6, +0xB4005FB7,0xB5005FB8,0xB6005FB9,0xB7005FBA,0xB8005FBB,0xB9005FBC,0xBA005FBD,0xBB005FBE,0xBC005FBF,0xBD005FC0, +0xBE005FC3,0xBF005FC4,0xA8005FC9,0xA9005FCD,0xAA005FCE,0xAB005FCF,0xAC005FD0,0xAD005FD3,0xAE005FD4,0xAF005FD5, +0xB0005FD6,0xB1005FD7,0xB2005FD8,0xB3005FD9,0xB4005FDB,0xB5005FDC,0xB6005FDD,0xB7005FDE,0xB8005FDF,0xB9005FE0, +0xBA005FE1,0xBB005FE2,0xBC005FE3,0xBD006015,0xBE006016,0xBF006017,0xE1005EC4,0x000C1916,0x000C1913,0x000C1910, +0x000C190D,0x000C190A,0x000C1907,0x000C1904,0x000C1901,0x000C18FE,0x000C18FB,0x000C18F8,0x80006018,0x81006019, +0x8200601A,0x000C18F5,0x000C18F2,0x000C18EF,0x000C18EC,0x000C18E9,0x000C18E6,0x000C18E3,0x000C18E0,0x000C18DD, +0x000C18DA,0x000C18D7,0x000C18D4,0x000C18D1,0x000C18CE,0x000C18CB,0x86005F8C,0x87005FD2,0xA800601C,0xA900601D, +0xAA00601E,0xAB00601F,0xAC006023,0xAD006024,0xAE006025,0xAF006026,0xB0006027,0xB1006028,0xB2006029,0xB300602A, +0xB400602B,0xB500602C,0xB600602D,0xB700602E,0xB800602F,0xB9006030,0xBA006031,0xBB00604C,0xBC00604D,0xBD00604E, +0xBE00604F,0xBF006050,0x000C18C8,0x000C18C5,0x000C18C2,0x000C18BF,0x000C18BC,0xE1005EEB,0x80006055,0x81006056, +0x82006057,0x000C18B9,0x000C18B6,0x000C18B3,0x000C18B0,0x000C18AD,0x000C18AA,0x000C18A7,0x000C18A4,0x000C18A1, +0x000C189E,0x000C189B,0x86005FC1,0x8700600C,0x000C1898,0x000C1895,0x000C1892,0x000C188F,0x000C188C,0x000C1889, +0x000C1886,0xA8006059,0xA900605A,0xAA00605B,0xAB00605C,0xAC00605D,0xAD00605E,0xAE00605F,0xAF006062,0xB0006063, +0xB1006064,0xB2006065,0xB3006066,0xB4006067,0xB5006068,0xB6006081,0xB7006082,0xB8006083,0xB9006084,0xBA006085, +0xBB006086,0xBC006087,0xBD006089,0xBE00608A,0xBF00608B,0x000C1883,0x000C1880,0x000C187D,0x000C187A,0x000C1877, +0x000C1874,0x000C1871,0xE1005F3B,0x000C186E,0x000C186B,0x000C1868,0x8000608F,0x81006090,0x82006091,0x000C1865, +0x000C1862,0x000C185F,0x85006009,0x000C185C,0x86006020,0x87006045,0x000C1859,0x000C1856,0x000C1853,0x000C1850, +0x000C184D,0x000C184A,0x000C1847,0x000C1844,0x000C1841,0x000C183E,0x000C183B,0x000C1838,0x000C1835,0xE100600D, +0x000C1832,0x000C182F,0x000C182C,0x000C1829,0x000C1826,0xE1005F4B,0xA1006093,0xA20060E3,0xA3006105,0xA4006157, +0xA5006191,0xA60061C8,0xA70061ED,0xA800623F,0xA9006276,0xAA0062B0,0xAB0062EA,0xAC006327,0xAD006361,0xAE00639B, +0xAF0063D2,0xB000640C,0xB1006446,0xB2006480,0xB30064BA,0xB40064F7,0xB5006531,0x000C1823,0x000C1820,0x000C181D, +0x000C181A,0x000C1817,0x000C1814,0x800060E0,0x810060E1,0x820060E2,0xA8006096,0xA9006097,0xAA006098,0xAB006099, +0xAC00609A,0xAD00609B,0xAE00609C,0xAF00609D,0xB000609E,0xB100609F,0xB20060A0,0xB30060A1,0xB40060A2,0xB50060A4, +0xB60060A5,0xB70060A6,0xB80060A7,0xB90060A8,0xBA0060BF,0xBB0060C0,0xBC0060C1,0xBD0060C2,0xBE0060C3,0xBF0060C4, +0x000C1811,0x000C180E,0x000C180B,0x000C1808,0x000C1805,0x000C1802,0x86006061,0x8700607F,0x000C17FF,0x000C17FC, +0x000C17F9,0x000C17F6,0x000C17F3,0x000C17F0,0x000C17ED,0x000C17EA,0x000C17E7,0x000C17E4,0x000C17E1,0x000C17DE, +0x000C17DB,0x000C17D8,0x000C17D5,0x000C17D2,0x000C17CF,0x000C17CC,0x000C17C9,0x000C17C6,0xE1005FAC,0x000C17C3, +0x000C17C0,0x80006102,0x81006103,0x82006104,0x000C17BD,0x000C17BA,0x000C17B7,0x000C17B4,0x86006079,0x870060D1, +0x000C17B1,0xA80060E4,0xA90060E5,0xAA0060E8,0xAB0060E9,0xAC0060EA,0xAD0060EB,0xAE0060EC,0xAF0060ED,0xB00060EE, +0xB10060EF,0xB20060F0,0xB30060F1,0xB40060F2,0xB50060F3,0xB60060F4,0xB70060F5,0xB80060F6,0xB90060F7,0xBA0060F8, +0xBB0060F9,0xBC0060FA,0xBD0060FB,0xBE0060FD,0xBF0060FE,0xA8006108,0xA900613A,0xAA00613B,0xAB00613C,0xAC00613D, +0xAD00613E,0xAE00613F,0xAF006140,0xB0006141,0xB1006142,0xB2006143,0xB3006144,0xB4006145,0xB5006146,0xB6006147, +0xB7006148,0xB8006149,0xB900614A,0xBA00614B,0xBB00614C,0xBC00614D,0xBD00614E,0xBE00614F,0xBF006150,0xE1005FDA, +0x000C17AE,0x000C17AB,0x000C17A8,0x000C17A5,0x000C17A2,0x000C179F,0x000C179C,0x000C1799,0x000C1796,0x000C1793, +0x000C1790,0x000C178D,0x000C178A,0x000C1787,0x000C1784,0x000C1781,0x000C177E,0x000C177B,0x000C1778,0x000C1775, +0x000C1772,0x000C176F,0x000C176C,0x80006154,0x81006155,0x82006156,0x000C1769,0x000C1766,0x000C1763,0x000C1760, +0x860060B2,0x8700610B,0xA8006172,0xA9006173,0xAA006175,0xAB006176,0xAC006177,0xAD006178,0xAE006179,0xAF00617A, +0xB000617B,0xB100617C,0xB200617D,0xB300617E,0xB400617F,0xB5006180,0xB6006181,0xB7006182,0xB8006183,0xB9006184, +0xBA006185,0xBB006186,0xBC006187,0xBD006188,0xBE006189,0xBF00618A,0x000C175D,0x000C175A,0xE100600E,0x000C1757, +0x000C1754,0x000C1751,0x000C174E,0x000C174B,0x000C1748,0x000C1745,0x000C1742,0x000C173F,0x000C173C,0x000C1739, +0x000C1736,0x000C1733,0x000C1730,0x000C172D,0x000C172A,0x000C1727,0x000C1724,0x000C1721,0x000C171E,0x000C171B, +0x000C1718,0x8000618E,0x8100618F,0x82006190,0x000C1715,0x000C1712,0x000C170F,0x000C170C,0x860060FC,0x87006151, +0x000C1709,0x000C1706,0x000C1703,0x000C1700,0x000C16FD,0x000C16FA,0x000C16F7,0x000C16F4,0x000C16F1,0x000C16EE, +0x000C16EB,0x000C16E8,0x000C16E5,0x000C16E2,0x000C16DF,0x000C16DC,0xA8006194,0xA9006195,0xAA006196,0xAB006197, +0xAC006198,0xAD006199,0xAE00619A,0xAF00619B,0xB000619C,0xB100619D,0xB200619E,0xB300619F,0xB40061A0,0xB50061A1, +0xB60061A2,0xB70061A3,0xB80061BC,0xB90061BD,0xBA0061BE,0xBB0061BF,0xBC0061C0,0xBD0061C1,0xBE0061C2,0xBF0061C3, +0x000C16D9,0x000C16D6,0x000C16D3,0x000C16D0,0x000C16CD,0x000C16CA,0x000C16C7,0x000C16C4,0xE1006060,0x000C16C1, +0x000C16BE,0x000C16BB,0x000C16B8,0x000C16B5,0x000C16B2,0x000C16AF,0x000C16AC,0x000C16A9,0x000C16A6,0x000C16A3, +0x000C16A0,0x800061C5,0x810061C6,0x820061C7,0x000C169D,0x000C169A,0x000C1697,0x000C1694,0x86006153,0x87006167, +0x000C1691,0x000C168E,0x000C168B,0x000C1688,0x000C1685,0x000C1682,0x000C167F,0x000C167C,0x000C1679,0x000C1676, +0x000C1673,0x000C1670,0xE1006080,0x800061EA,0x810061EB,0x820061EC,0x000C166D,0x000C166A,0x000C1667,0x000C1664, +0x8600616B,0x870061B9,0x000C1661,0x000C165E,0x000C165B,0x000C1658,0x000C1655,0x000C1652,0x000C164F,0x000C164C, +0x000C1649,0x000C1646,0x000C1643,0xA80061C9,0xA90061CA,0xAA0061CB,0xAB0061CC,0xAC0061CD,0xAD0061CE,0xAE0061CF, +0xAF0061D0,0xB00061D4,0xB10061D5,0xB20061D6,0xB30061D7,0xB40061DA,0xB50061DB,0xB60061DC,0xB70061DD,0xB80061DE, +0xB90061DF,0xBA0061E0,0xBB0061E1,0xBC0061E2,0xBD0061E3,0xBE0061E4,0xBF0061E5,0xA80061F0,0xA90061F1,0xAA0061F2, +0xAB0061F3,0xAC0061F4,0xAD0061F5,0xAE0061F6,0xAF0061F7,0xB00061F8,0xB10061F9,0xB20061FA,0xB300622B,0xB400622C, +0xB500622D,0xB600622E,0xB700622F,0xB8006230,0xB9006231,0xBA006232,0xBB006233,0xBC006234,0xBD006235,0xBE006236, +0xBF006237,0x000C1640,0x000C163D,0x000C163A,0x000C1637,0x000C1634,0x000C1631,0x000C162E,0x000C162B,0x000C1628, +0x000C1625,0x000C1622,0x000C161F,0x000C161C,0xE10060D2,0x8000623C,0x8100623D,0x8200623E,0x000C1619,0x000C1616, +0x000C1613,0x000C1610,0x860061A4,0x870061FB,0x000C160D,0x000C160A,0x000C1607,0x000C1604,0x000C1601,0x000C15FE, +0x000C15FB,0x000C15F8,0x000C15F5,0x000C15F2,0xA8006242,0xA9006243,0xAA006244,0xAB006245,0xAC006246,0xAD006247, +0xAE006248,0xAF006249,0xB000624A,0xB100624B,0xB2006264,0xB3006265,0xB4006266,0xB5006267,0xB6006268,0xB7006269, +0xB800626A,0xB900626B,0xBA00626C,0xBB00626D,0xBC00626E,0xBD00626F,0xBE006270,0xBF006271,0x000C15EF,0x000C15EC, +0x000C15E9,0x000C15E6,0x000C15E3,0x000C15E0,0x000C15DD,0x000C15DA,0x000C15D7,0x000C15D4,0x000C15D1,0x000C15CE, +0x000C15CB,0x000C15C8,0xE100610C,0x000C15C5,0x000C15C2,0x000C15BF,0x000C15BC,0x000C15B9,0x000C15B6,0x000C15B3, +0x000C15B0,0x80006273,0x81006274,0x82006275,0x000C15AD,0x000C15AA,0x000C15A7,0x000C15A4,0x860061E6,0x87006238, +0x000C15A1,0x000C159E,0x000C159B,0x000C1598,0x000C1595,0x000C1592,0x000C158F,0x000C158C,0x000C1589,0x000C1586, +0xA8006277,0xA9006278,0xAA006279,0xAB00627A,0xAC00627E,0xAD00627F,0xAE006280,0xAF006281,0xB0006284,0xB1006285, +0xB2006286,0xB3006287,0xB4006288,0xB5006289,0xB600628A,0xB700628B,0xB800628C,0xB900628D,0xBA0062A6,0xBB0062A7, +0xBC0062A8,0xBD0062AA,0xBE0062AB,0xBF0062AC,0x000C1583,0x000C1580,0x000C157D,0xE1006152,0x000C157A,0x000C1577, +0x000C1574,0x000C1571,0x000C156E,0x000C156B,0x000C1568,0x000C1565,0x000C1562,0x000C155F,0x000C155C,0x000C1559, +0x000C1556,0x000C1553,0x800062AD,0x810062AE,0x820062AF,0x000C1550,0x000C154D,0x000C154A,0x000C1547,0x86006227, +0x87006272,0x000C1544,0x000C1541,0x000C153E,0x000C153B,0x000C1538,0x000C1535,0x000C1532,0x000C152F,0x000C152C, +0x000C1529,0x000C1526,0x000C1523,0x000C1520,0xE1006168,0xA80062B1,0xA90062B2,0xAA0062B3,0xAB0062B4,0xAC0062B5, +0xAD0062B6,0xAE0062B7,0xAF0062BB,0xB00062BC,0xB10062BD,0xB20062BE,0xB30062C1,0xB40062C2,0xB50062C3,0xB60062C4, +0xB70062C5,0xB80062C6,0xB90062C7,0xBA0062C8,0xBB0062C9,0xBC0062CA,0xBD0062CB,0xBE0062CC,0xBF0062CD,0x000C151D, +0x000C151A,0x000C1517,0x000C1514,0x000C1511,0x000C150E,0x000C150B,0x000C1508,0x000C1505,0x000C1502,0x000C14FF, +0x800062E7,0x810062E8,0x820062E9,0x000C14FC,0x000C14F9,0x000C14F6,0x000C14F3,0x000C14F0,0x000C14ED,0x000C14EA, +0x000C14E7,0x000C14E4,0x000C14E1,0x000C14DE,0x000C14DB,0x8600625B,0x870062A1,0xA80062EB,0xA90062EC,0xAA0062ED, +0xAB0062EE,0xAC0062EF,0xAD0062F0,0xAE0062F1,0xAF0062F5,0xB00062F6,0xB10062F7,0xB20062F8,0xB30062F9,0xB40062FA, +0xB50062FB,0xB60062FC,0xB70062FD,0xB80062FE,0xB90062FF,0xBA006300,0xBB00631B,0xBC00631C,0xBD00631D,0xBE00631E, +0xBF00631F,0x000C14D8,0x000C14D5,0x000C14D2,0x000C14CF,0x000C14CC,0xE10061BA,0x80006324,0x81006325,0x82006326, +0x000C14C9,0x000C14C6,0x000C14C3,0x000C14C0,0x86006282,0x870062DB,0xA8006342,0xA9006343,0xAA006344,0xAB006345, +0xAC006346,0xAD006347,0xAE006348,0xAF006349,0xB000634A,0xB100634B,0xB200634C,0xB300634D,0xB400634E,0xB500634F, +0xB6006350,0xB7006351,0xB8006352,0xB9006353,0xBA006354,0xBB006355,0xBC006356,0xBD006358,0xBE006359,0xBF00635A, +0x000C14BD,0x000C14BA,0x000C14B7,0x000C14B4,0x000C14B1,0x000C14AE,0x000C14AB,0x000C14A8,0x000C14A5,0x000C14A2, +0x000C149F,0x000C149C,0x000C1499,0x000C1496,0x000C1493,0x000C1490,0x000C148D,0x000C148A,0x000C1487,0x000C1484, +0x000C1481,0xE10061FC,0x000C147E,0x000C147B,0x000C1478,0x8000635E,0x8100635F,0x82006360,0x000C1475,0x000C1472, +0x000C146F,0x000C146C,0x860062BF,0x87006315,0x000C1469,0x000C1466,0x000C1463,0xA8006364,0xA9006365,0xAA006366, +0xAB00637F,0xAC006380,0xAD006381,0xAE006382,0xAF006383,0xB0006384,0xB1006385,0xB2006386,0xB3006387,0xB4006388, +0xB5006389,0xB600638A,0xB700638B,0xB800638C,0xB900638D,0xBA00638E,0xBB00638F,0xBC006390,0xBD006392,0xBE006393, +0xBF006394,0x000C1460,0x000C145D,0x000C145A,0x000C1457,0x000C1454,0x000C1451,0x000C144E,0x000C144B,0x000C1448, +0x000C1445,0x000C1442,0x000C143F,0x000C143C,0x000C1439,0x000C1436,0x000C1433,0x000C1430,0x000C142D,0xE1006239, +0x000C142A,0x000C1427,0x000C1424,0x80006398,0x81006399,0x8200639A,0x000C1421,0x000C141E,0x000C141B,0x000C1418, +0x86006301,0x87006357,0x000C1415,0x000C1412,0x000C140F,0x000C140C,0x000C1409,0x000C1406,0x000C1403,0x000C1400, +0x000C13FD,0x000C13FA,0x000C13F7,0xA800639E,0xA900639F,0xAA0063A0,0xAB0063A1,0xAC0063A2,0xAD0063A3,0xAE0063A4, +0xAF0063A5,0xB00063A6,0xB10063A7,0xB20063A8,0xB30063C1,0xB40063C2,0xB50063C3,0xB60063C4,0xB70063C5,0xB80063C6, +0xB90063C7,0xBA0063C8,0xBB0063C9,0xBC0063CA,0xBD0063CC,0xBE0063CD,0xBF0063CE,0x000C13F4,0x000C13F1,0x000C13EE, +0x000C13EB,0x000C13E8,0x000C13E5,0x000C13E2,0x000C13DF,0x000C13DC,0x000C13D9,0xE100627B,0x000C13D6,0x000C13D3, +0x000C13D0,0x000C13CD,0x000C13CA,0x000C13C7,0x000C13C4,0x000C13C1,0x000C13BE,0x000C13BB,0x000C13B8,0x800063CF, +0x810063D0,0x820063D1,0x000C13B5,0x000C13B2,0x000C13AF,0x000C13AC,0x000C13A9,0x000C13A6,0x000C13A3,0x8600633B, +0x87006391,0xA80063D3,0xA90063D4,0xAA0063D5,0xAB0063D6,0xAC0063DA,0xAD0063DB,0xAE0063DC,0xAF0063DD,0xB00063DE, +0xB10063DF,0xB20063E0,0xB30063FB,0xB40063FC,0xB50063FD,0xB60063FE,0xB70063FF,0xB8006400,0xB9006401,0xBA006402, +0xBB006403,0xBC006404,0xBD006405,0xBE006406,0xBF006407,0x000C13A0,0x000C139D,0x000C139A,0x000C1397,0x000C1394, +0x000C1391,0x000C138E,0x000C138B,0x000C1388,0x000C1385,0x000C1382,0x000C137F,0x000C137C,0xE10062A2,0x000C1379, +0x000C1376,0x000C1373,0x000C1370,0x000C136D,0x000C136A,0x000C1367,0x000C1364,0x80006409,0x8100640A,0x8200640B, +0x000C1361,0x000C135E,0x000C135B,0x000C1358,0x000C1355,0x000C1352,0x000C134F,0x86006375,0x870063CB,0xA800640D, +0xA900640E,0xAA00640F,0xAB006410,0xAC006414,0xAD006415,0xAE006416,0xAF006417,0xB0006418,0xB1006419,0xB200641A, +0xB3006435,0xB4006436,0xB5006437,0xB6006438,0xB7006439,0xB800643A,0xB900643B,0xBA00643C,0xBB00643D,0xBC00643E, +0xBD00643F,0xBE006440,0xBF006441,0x000C134C,0x000C1349,0x000C1346,0x000C1343,0x000C1340,0x000C133D,0x000C133A, +0x000C1337,0x000C1334,0x000C1331,0x000C132E,0x000C132B,0x000C1328,0xE10062DC,0x000C1325,0x000C1322,0x000C131F, +0x000C131C,0x000C1319,0x000C1316,0x000C1313,0x000C1310,0x80006443,0x81006444,0x82006445,0x000C130D,0x000C130A, +0x000C1307,0x000C1304,0x000C1301,0x000C12FE,0x000C12FB,0x000C12F8,0x000C12F5,0x000C12F2,0x000C12EF,0x000C12EC, +0x000C12E9,0x000C12E6,0x000C12E3,0x860063B7,0x87006408,0xA8006447,0xA9006448,0xAA006449,0xAB00644A,0xAC00644E, +0xAD00644F,0xAE006450,0xAF006451,0xB0006452,0xB1006453,0xB2006454,0xB3006455,0xB4006456,0xB5006457,0xB6006458, +0xB7006459,0xB800645A,0xB900645B,0xBA00645C,0xBB006477,0xBC006478,0xBD006479,0xBE00647A,0xBF00647B,0x000C12E0, +0x000C12DD,0x000C12DA,0x000C12D7,0x000C12D4,0xE1006316,0x000C12D1,0x000C12CE,0x000C12CB,0x000C12C8,0x000C12C5, +0x000C12C2,0x000C12BF,0x000C12BC,0x000C12B9,0x000C12B6,0x000C12B3,0x8000647D,0x8100647E,0x8200647F,0x000C12B0, +0x000C12AD,0x000C12AA,0x000C12A7,0x000C12A4,0x000C12A1,0x000C129E,0x000C129B,0x000C1298,0x000C1295,0x000C1292, +0x000C128F,0x860063F1,0x87006442,0xA8006481,0xA9006482,0xAA006483,0xAB006484,0xAC006485,0xAD006486,0xAE006487, +0xAF00648B,0xB000648C,0xB100648D,0xB200648E,0xB300648F,0xB4006490,0xB5006491,0xB6006492,0xB7006493,0xB8006494, +0xB9006495,0xBA006496,0xBB0064B1,0xBC0064B2,0xBD0064B4,0xBE0064B5,0xBF0064B6,0x000C128C,0x000C1289,0xE100635B, +0x000C1286,0x000C1283,0x000C1280,0x000C127D,0x000C127A,0x000C1277,0x000C1274,0x000C1271,0x000C126E,0x000C126B, +0x000C1268,0x000C1265,0x000C1262,0x000C125F,0x800064B7,0x810064B8,0x820064B9,0x000C125C,0x000C1259,0x000C1256, +0x000C1253,0x000C1250,0x000C124D,0x000C124A,0x000C1247,0x000C1244,0x000C1241,0x000C123E,0x000C123B,0x8600642B, +0x87006471,0xA80064BB,0xA90064BC,0xAA0064BD,0xAB0064BE,0xAC0064BF,0xAD0064C0,0xAE0064C1,0xAF0064C5,0xB00064C6, +0xB10064C7,0xB20064C8,0xB30064C9,0xB40064CA,0xB50064CB,0xB60064CC,0xB70064CD,0xB80064CE,0xB90064CF,0xBA0064D0, +0xBB0064EB,0xBC0064EC,0xBD0064EE,0xBE0064EF,0xBF0064F0,0x000C1238,0x000C1235,0xE1006395,0x000C1232,0x000C122F, +0x000C122C,0x800064F4,0x810064F5,0x820064F6,0x000C1229,0x000C1226,0x000C1223,0x000C1220,0x8600645D,0x870064AB, +0x000C121D,0x000C121A,0x000C1217,0x000C1214,0x000C1211,0x000C120E,0x000C120B,0x000C1208,0x000C1205,0x000C1202, +0x000C11FF,0xA80064FA,0xA90064FB,0xAA0064FC,0xAB0064FD,0xAC0064FE,0xAD0064FF,0xAE006500,0xAF006501,0xB0006502, +0xB1006503,0xB2006504,0xB300651D,0xB400651E,0xB500651F,0xB6006520,0xB7006521,0xB8006522,0xB9006523,0xBA006524, +0xBB006525,0xBC006526,0xBD006528,0xBE006529,0xBF00652A,0x000C11FC,0x000C11F9,0x000C11F6,0x000C11F3,0x000C11F0, +0x000C11ED,0x000C11EA,0x000C11E7,0x000C11E4,0x000C11E1,0xE10063D7,0x000C11DE,0x000C11DB,0x000C11D8,0x8000652E, +0x8100652F,0x82006530,0x000C11D5,0x000C11D2,0x000C11CF,0x000C11CC,0x86006497,0x870064E5,0x000C11C9,0x000C11C6, +0x000C11C3,0x000C11C0,0x000C11BD,0x000C11BA,0x000C11B7,0x000C11B4,0x000C11B1,0x000C11AE,0x000C11AB,0xA8006534, +0xA9006535,0xAA006536,0xAB006537,0xAC006538,0xAD006539,0xAE00653A,0xAF00653B,0xB000653C,0xB100653D,0xB200653E, +0xB3006557,0xB4006558,0xB5006559,0xB600655A,0xB700655B,0xB800655C,0xB900655D,0xBA00655E,0xBB00655F,0xBC006560, +0xBD006562,0xBE006563,0xBF006564,0x000C11A8,0x000C11A5,0x000C11A2,0x000C119F,0x000C119C,0x000C1199,0x000C1196, +0x000C1193,0x000C1190,0x000C118D,0xE1006411,0x000C118A,0x000C1187,0x000C1184,0x80006568,0x81006569,0x8200656A, +0x000C1181,0x000C117E,0x000C117B,0x85006498,0x000C1178,0x87006499,0xAC0064C3,0x8900649A,0xAC0064D1,0x8B00649B, +0x000C1175,0x8D00649C,0x000C1172,0x000C116F,0x000C116C,0x9100649E,0xB500656C,0xE10064C2,0xE10064C4,0xE10064D2, +0xE10064D4,0xE10064D6,0xAC0064D3,0xE10064D8,0xAC0064D5,0x000C1169,0xAC0064D7,0xE10064DB,0xAC0064D9,0x000C1166, +0xB5006572,0xAC0064DA,0xB5006574,0xE10064DF,0xB5006575,0xAC0064DC,0xB5006576,0x000C1163,0xB5006581,0xB5006585, +0xE10064E7,0xB500658D,0xB5006594,0xAC0064DD,0x000C1160,0xAC0064E1,0xB5006597,0x000C115D,0x820064E0,0xAC0064E8, +0x000C115A,0xE100644B,0x000C1157,0xB500659A,0x000C1154,0x000C1151,0xBA0064A2,0xBF0064E3,0xBC0064A8,0x000C114E, +0xBE0064AF,0xBF0064DE,0x000C114B,0x8000659C,0x8100659E,0x000C1148,0x000C1145,0x000C1142,0x000C113F,0x8200659F, +0x820065A9,0xCC006527,0xCD00652B,0xBE0064EA,0x800065A3,0x810065A6,0x000C113C,0x000C1139,0xCC006532,0xCD00652C, +0x000C1136,0x8600653F,0x87006540,0x88006553,0x89006565,0x8A0065BE,0xCC006508,0xE10064E9,0xB80065AA,0xE10064ED, +0xB80065AB,0xB80065AC,0xCC00650A,0xCC00650B,0xB80065B4,0xB80065B5,0x000C1133,0xB80065B8,0xB80065C8,0x000C1130, +0x000C112D,0xB80065CB,0x000C112A,0x900064F2,0x90006509,0x920064F8,0x9200650D,0x940064F9,0x94006510,0xCC00650E, +0x83006513,0x000C1127,0xE1006472,0xCC00650F,0x000C1124,0x88006514,0xCC006511,0x000C1121,0x8B006517,0xCC006512, +0xCC006515,0x000C111E,0x000C111B,0xCC00652D,0xCC006541,0xB80065CC,0xCC006542,0xCC006543,0x83006544,0x000C1118, +0x85006547,0x000C1115,0x000C1112,0x88006548,0x000C110F,0x000C110C,0x000C1109,0x000C1106,0x8D00654A,0x000C1103, +0x000C1100,0x000C10FD,0xA3006518,0x000C10FA,0xA500651A,0xB80065CE,0xB80065D7,0xB80065DA,0x000C10F7,0xB80065DD, +0xB80065E1,0x000C10F4,0x000C10F1,0xB80065E2,0x000C10EE,0xB80065E9,0xB80065EB,0x000C10EB,0xA100654D,0xB80065EC, +0xB80065EE,0xA400654E,0xA5006551,0x000C10E8,0xB80065EF,0xB80065F0,0xB80065F1,0xBC00651B,0xCC006545,0x000C10E5, +0xE10064AC,0xCC006546,0xCC006549,0x000C10E2,0xCC00654B,0xB2006552,0xB3006561,0xCC00654C,0xCC00654F,0xB6006566, +0xB7006567,0xCC006550,0xCC006554,0xBA00656D,0xBB00656F,0xBC006571,0xBD006577,0xB80065F3,0x000C10DF,0x000C10DC, +0xB80065F4,0x000C10D9,0xB80065F5,0x000C10D6,0x000C10D3,0xB80065F7,0x000C10D0,0xCC006555,0x000C10CD,0x820065A5, +0xB80065FC,0xB80065FF,0xCC006556,0xCC00656B,0xB8006600,0x000C10CA,0xB8006602,0x000C10C7,0xB8006605,0xCC00656E, +0x000C10C4,0xCC006570,0xB800660B,0xCC006573,0x99006635,0xB8006611,0x8200657A,0x8300657B,0xB8006615,0xCC006578, +0x8600657D,0x8700657F,0xCC006579,0xCC00657C,0xB8006624,0xCC00657E,0xB8006625,0xCC006580,0x820065BD,0xB8006627, +0xCC006584,0x91006582,0x92006586,0xB8006629,0xCC006587,0xB800662A,0xCC00658A,0xCC006590,0x99006637,0xCC006592, +0xCC006595,0xB800662C,0xCC006599,0xCC00659B,0xB800662E,0xCC0065A1,0x820065CF,0xCC0065A4,0xA2006588,0x810065F2, +0x82006639,0x83006695,0x000C10C1,0x820065D1,0xA8006589,0xA900658B,0x9900663A,0xAB00658C,0x99006664,0x9900666D, +0x820065D2,0x000C10BE,0x99006674,0x820065D5,0xB200658E,0xB300658F,0xB4006591,0xB5006593,0x000C10BB,0x000C10B8, +0x000C10B5,0x99006675,0x86006596,0xE30065AD,0x820065DE,0xE30065CA,0x820065E5,0x8B006598,0x99006676,0x8D00659D, +0xE30065DC,0x8F0065A7,0x000C10B2,0x910065AF,0x000C10AF,0x930065B1,0x820065FE,0x950065B2,0x82006607,0x970065B6, +0xE30065E3,0x990065B9,0x82006609,0x9B0065BA,0x000C10AC,0x9D0065BB,0x8200660C,0x9F0065BC,0xE30065EA,0xA10065C0, +0xE30065ED,0xE30065F8,0xA40065C9,0x99006682,0xA60065CD,0xE30065FA,0xA80065D3,0x000C10A9,0xE3006604,0xE3006606, +0xE300660A,0xE300660E,0x99006684,0xAF0065D6,0x9900668E,0xE3006626,0xB20065DB,0x9900669B,0x990066A9,0xB50065E4, +0x8200660D,0x000C10A6,0xB80065E8,0x990066AE,0xE300662D,0xBB0065F6,0x000C10A3,0x82006612,0xE300662F,0x82006619, +0x990066B3,0x000C10A0,0x8200661C,0x990066B7,0xE3006632,0x000C109D,0x82006621,0xE3006636,0x990066BC,0x9A0066BD, +0x000C109A,0x000C1097,0xE300663D,0x82006628,0x000C1094,0x990066C0,0x9A0066C3,0x000C1091,0x82006630,0x000C108E, +0x000C108B,0xE3006642,0x82006633,0x990066C5,0x9A0066C6,0xE3006646,0x990066CE,0x9A0066CF,0x000C1088,0x000C1085, +0x82006638,0x990066D3,0x9A0066D4,0x000C1082,0x000C107F,0x8200663E,0x9D0065F9,0x990066D8,0x000C107C,0xE300664E, +0x82006644,0x000C1079,0xE3006653,0x990066DB,0xE3006658,0xA60065FB,0xE300665F,0x82006649,0x990066E3,0x000C1076, +0xAB0065FD,0x82006650,0xAD006608,0x000C1073,0xAF006610,0x990066E7,0xB1006614,0xE3006663,0xB3006618,0x82006656, +0xB500661D,0x990066F1,0xB7006620,0x000C1070,0xB9006623,0xE300666B,0xBB00662B,0x82006660,0xBD006631,0xE3006673, +0xBF006634,0x990066FA,0x000C106D,0xE300667A,0x82006665,0x000C106A,0x990066FD,0x82006668,0xE300667D,0x99006702, +0x000C1067,0xE3006683,0x000C1064,0x8200666E,0xE3006686,0x99006704,0x82006670,0x9900670A,0x000C1061,0x82006677, +0x000C105E,0x82006678,0xE3006689,0x000C105B,0x9900670C,0x9900670F,0x8200667C,0x000C1058,0xE300668B,0x99006713, +0x8100663B,0xE3006690,0x82006681,0x8400663C,0x9900671C,0x86006640,0x000C1055,0x88006648,0xE3006696,0xE300669E, +0x82006688,0x99006722,0x000C1052,0xE30066A3,0x8F00664C,0x8200668D,0x99006728,0x92006654,0x000C104F,0x82006693, +0x95006659,0xE30066A7,0x9900672E,0x98006666,0x000C104C,0xE30066AF,0x9B006669,0x82006699,0x99006734,0x9A006735, +0x000C1049,0x000C1046,0x8200669F,0xE30066B4,0x9900673A,0x9A00673B,0x000C1043,0x000C1040,0xE30066BB,0x820066A5, +0x99006740,0x9A006741,0x000C103D,0x000C103A,0x000C1037,0x820066B1,0xAF006671,0xB0006679,0xB100667B,0xB200667E, +0x000C1034,0xE30066C1,0x99006742,0x9A006748,0xE30066CB,0x820066B5,0x99006750,0x9A006751,0x000C1031,0x000C102E, +0xBD006680,0x820066BE,0xE30066D1,0x000C102B,0x000C1028,0x99006755,0x820066C2,0x820066C4,0x000C1025,0x99006756, +0xE30066D6,0x9900675A,0xE30066D7,0x820066C7,0x99006762,0xE30066DD,0x000C1022,0xE30066E2,0x820066CC,0x99006766, +0x000C101F,0x820066D5,0x820066B2,0x840066CD,0x910066E5,0x910066E6,0xBA00676D,0x0010101B,0x9900667F,0xF00066DA, +0x9B006685,0x910066F2,0x8D006706,0xBA006776,0x820066B9,0xF00066E0,0x00101017,0x920066DC,0x820066C8,0x910066F6, +0xA500668C,0x960066E4,0xF00066E8,0x00101013,0xB1006691,0xB2006697,0x910066FF,0xF00066EF,0xBA00677D,0x840066DE, +0x0010100F,0xA7006784,0x91006705,0xF00066F5,0xA700678A,0x840066E1,0x0010100B,0x00101007,0xF00066FE,0x8700669C, +0xBE00678B,0x91006707,0x97006791,0x00101003,0xF0006708,0x8C0066D0,0x8D0066F9,0xB90066A2,0x00100FFF,0x00100FFB, +0x00100FF7,0x91006709,0xB0006796,0x920066EA,0xB80066B0,0xB90066B6,0x9100670B,0xAF0067A2,0xF000670D,0x960066F0, +0x00100FF3,0x91006714,0xBA006797,0x00100FEF,0xF0006712,0xBD006798,0x000CA9B7,0x000CA9B4,0x960066FC,0xAF0067A5, +0xC300675B,0xC40067AC,0xC5006817,0xC6006865,0xC700689A,0xC8006905,0x000E2F42,0x000CA9B1,0x000E3064,0x000E3046, +0xCD00693A,0xCE006945,0xCF006955,0xD0006985,0xD1006986,0x000E3000,0xD30069AF,0x000CA9AE,0x000CA9AB,0x000E2EDE, +0x000CA9A8,0xD80069CA,0x000CA9A5,0x000CA9A2,0xDB0069E9,0x000CA99F,0x000E2FD8,0x000CA99C,0x000CA999,0xE00069D1, +0xE1006A6B,0xE2006E58,0xE3006EA6,0x000CA996,0x000E2EAC,0x000E2FBA,0x000E303C,0x000CA993,0x000CA990,0xEA006F28, +0xEB007737,0xEC0097B7,0xED00B7B8,0x000CA98D,0xEF00C6FB,0xF000CAD1,0x000E306E,0x800067A8,0x810067A9,0x820067B2, +0x830067B3,0x840067B4,0x850067B5,0x000CA98A,0x870067BB,0x880067BD,0x890067BE,0x8A0067BF,0x8B0067C0,0x8C0067C2, +0x8D0067C3,0x8E0067C5,0x8F0067C6,0x000CA987,0x910067C7,0x920067C8,0x930067CD,0x940067CE,0x950067CF,0x960067D0, +0x000CA984,0x000E2F3D,0x990067D1,0x9A0067D2,0x9B0067D7,0x9C0067DA,0x9D0067E1,0x000CA981,0x000E305F,0xA00067EB, +0xA10067F2,0xA20067F3,0xA30067F9,0xA40067FA,0xA5006801,0x000E3041,0xA700680B,0xA8006812,0xA9006813,0xAA006819, +0xAB00681B,0xAC00681C,0xAD00681D,0xAE00681E,0xAF00681F,0x000E2FFB,0xB1006820,0xB2006821,0xB3006822,0xB4006823, +0xB5006824,0xB6006825,0x000CA97E,0x000CA97B,0xB9006826,0xBA006827,0xBB006828,0xBC006829,0xBD00682A,0x000E2ED9, +0xBF00682B,0x000CA978,0x000CA975,0x000CA972,0x000CA96F,0x000E2FD3,0x000CA96C,0x000CA969,0x000CA966,0x000E2EA7, +0x000E2FB5,0x000E3037,0x000CA963,0x000CA960,0x000CA95D,0x000E3069,0x000CA95A,0x000CA957,0x8000683C,0x8100683D, +0x82006852,0x83006853,0x8400685D,0x8500685E,0x8600685F,0x87006864,0x8800686B,0x8900686C,0x8A00686D,0x8B00686E, +0x8C00686F,0x8D006870,0x8E006871,0x8F006872,0x000CA954,0x000CA951,0x92006873,0x93006874,0x94006875,0x95006876, +0x96006877,0x97006878,0x98006879,0x9900687A,0x9A00687B,0x9B00687C,0x9C00687D,0x9D00687E,0x9E00687F,0x9F006880, +0xA0006881,0xA1006882,0xA2006883,0xA3006884,0xA4006885,0xA5006886,0x000E2F10,0x000E2F0B,0xA8006887,0xA9006888, +0xAA006889,0xAB00688A,0xAC00688B,0xAD00688C,0xAE00688D,0xAF00688E,0xB000688F,0x000CA94E,0x000CA94B,0x000CA948, +0xB4006890,0xB5006891,0xB6006892,0xB7006893,0x000CA945,0xB9006894,0xBA006895,0xBB006896,0xBC006897,0xBD006898, +0xBE006899,0x000CA942,0x000CA93F,0x000CA93C,0x000CA939,0x000CA936,0x000CA933,0x000CA930,0x000CA92D,0x000E2FEC, +0x000E2FE7,0x000CA92A,0x000CA927,0x000CA924,0x000CA921,0x000CA91E,0x000CA91B,0x000CA918,0x000CA915,0x000CA912, +0x000CA90F,0x000CA90C,0x000CA909,0x000CA906,0x000CA903,0x000CA900,0x000CA8FD,0x000CA8FA,0x000CA8F7,0x000CA8F4, +0x000CA8F1,0x000CA8EE,0x000CA8EB,0x000CA8E8,0x000CA8E5,0x000CA8E2,0x000CA8DF,0x000CA8DC,0x000CA8D9,0x000CA8D6, +0x000CA8D3,0x000CA8D0,0x000CA8CD,0x000CA8CA,0x000CA8C7,0x000CA8C4,0x000CA8C1,0x000CA8BE,0x830068A0,0x840068A1, +0x850068A2,0x860068A9,0x870068AA,0x880068BD,0x000CA8BB,0x000CA8B8,0x000CA8B5,0x8C0068BE,0x8D0068D6,0x8E0068D7, +0x8F0068D8,0x900068D9,0x910068DA,0x000CA8B2,0x000CA8AF,0x940068DB,0x950068DC,0x960068DD,0x970068DE,0x980068DF, +0x990068E0,0x9A0068E1,0x9B0068E2,0x9C0068E3,0x9D0068E4,0x9E0068E5,0x9F0068E6,0xA00068E7,0xA10068E8,0xA20068E9, +0xA30068EA,0xA40068EB,0xA50068EC,0x000CA8AC,0x000E2FA6,0xA80068ED,0xA90068EE,0xAA0068EF,0xAB0068F0,0xAC0068F1, +0xAD0068F2,0xAE0068F3,0xAF0068F4,0xB00068F5,0xB10068F6,0xB20068F7,0xB30068F8,0xB40068F9,0xB50068FA,0xB60068FB, +0xB70068FC,0xB80068FD,0xB90068FE,0xBA0068FF,0xBB006900,0xBC006901,0xBD006902,0xBE006903,0x000E2FA1,0x000CA8A9, +0x000CA8A6,0x000CA8A3,0x000CA8A0,0x000CA89D,0x000CA89A,0x000CA897,0x000CA894,0x000CA891,0x000CA88E,0x000E2F92, +0x000E2F8D,0x000CA88B,0x000CA888,0x000CA885,0x000CA882,0x000E2F88,0x000E2F83,0x000CA87F,0x000CA87C,0x000CA879, +0x000CA876,0x000E2F74,0x000E2F6F,0x000E2F6A,0x000E2F65,0x000CA873,0x000CA870,0x000CA86D,0x000CA86A,0x000CA867, +0x000CA864,0x000CA861,0x000CA85E,0x000CA85B,0x000CA858,0x000CA855,0x000CA852,0x000CA84F,0x000CA84C,0x000CA849, +0x000CA846,0x000CA843,0x000CB190,0x000CB188,0x000E2E70,0xA0006904,0xA1006907,0x000E2E6B,0x000E2E3E,0x000E2E39, +0x000CA840,0x000CA83D,0x000CA83A,0x000CA837,0x000CA834,0x000CA831,0x000CA82E,0x000CA82B,0x0016308C,0x00163087, +0xAF006908,0xB0006909,0x00163082,0x0016307D,0x00163078,0x00163073,0x0016306E,0x00163069,0x00163064,0x0016305F, +0x0016305A,0x00163055,0x0010A827,0x0010A823,0x000CA820,0x000CA81D,0x000CA81A,0x000CA817,0x000E3050,0x8D00690A, +0x8E00690B,0x8F00690C,0x9000690D,0x9100690E,0x9200690F,0x93006910,0x94006911,0x95006912,0x96006913,0x97006916, +0x98006917,0x99006918,0x9A006919,0x9B00691A,0x9C00691B,0x000E304B,0x9E00691C,0x9F00691D,0xA000691E,0xA100691F, +0xA2006920,0xA3006921,0x00163050,0x0016304B,0xA6006922,0xA7006923,0xA8006924,0xA9006925,0xAA006926,0xAB006937, +0xAC00693E,0xAD00693F,0xAE00694B,0xAF00694C,0xB000694D,0x0010A813,0x0010A80F,0x000CA80C,0xB4006950,0xB5006951, +0x000CA809,0x000CA806,0xB800695A,0xB900695B,0xBA00695C,0xBB00695D,0xBC00695E,0xBD00695F,0xBE006960,0xBF006961, +0x000CA803,0x000CA800,0x00163046,0x00163041,0x0010A7FC,0x0010A7F8,0x0010A7F4,0x0010A7F0,0x000CA7ED,0x000CA7EA, +0x000CA7E7,0x000CA7E4,0x000CA7E1,0x000CA7DE,0x000CA7DB,0x000CA7D8,0x000CA7D5,0x000CA7D2,0x000CA7CF,0x000CA7CC, +0x000CA7C9,0x000CA7C6,0x000CA7C3,0x000CA7C0,0x000CA7BD,0x000CA7BA,0x000CA7B7,0x000CA7B4,0x000CA7B1,0x000CA7AE, +0x000CA7AB,0x000CA7A8,0x000CA7A5,0x000CA7A2,0x000CA79F,0x000CA79C,0x000CA799,0x000CA796,0x000E305A,0x000E3055, +0x000E2FE2,0x000E2FDD,0x0016303C,0x80006962,0x81006963,0x82006964,0x83006965,0x84006966,0x85006967,0x86006968, +0x87006969,0x8800696A,0x8900696B,0x8A00696C,0x8B00696D,0x8C00696E,0x8D00696F,0x8E006970,0x8F006971,0x90006972, +0x91006973,0x92006974,0x93006975,0x94006976,0x95006977,0x96006978,0x97006979,0x9800697A,0x9900697B,0x9A00697C, +0x9B00697D,0x00163037,0x00163032,0x9E00697E,0x9F00697F,0x0016302D,0x000E3028,0x000E3023,0x00163028,0x00163023, +0x000CA793,0xA6006980,0xA7006981,0xA8006982,0xA9006983,0xAA006984,0xAB0069A1,0xAC0069A2,0xAD0069A5,0xAE0069A6, +0xAF0069A7,0xB00069A8,0xB10069A9,0xB20069AA,0xB30069B9,0x000CA790,0x800069BC,0x810069BF,0x0008A288,0x830069C0, +0x840069C1,0x00089FCE,0x0008A2B0,0x0010B183,0x00080FED,0x00040FEC,0x0010A78C,0x0010A788,0x00089FC1,0x0010A784, +0x0010A780,0x0010A77C,0x850069C4,0x860069C5,0x870069C6,0x880069C7,0x890069C8,0x8A0069C9,0x0010A778,0x8C0069D0, +0x0010A774,0x8E0069D2,0x8F0069D6,0x900069D7,0x0010A770,0x001A301D,0x0010A76C,0x0010A768,0x00122D07,0x0010A764, +0x00122CF5,0x0010A760,0x001A3017,0x8A0069E4,0x8B0069E5,0x8C0069E6,0x8D0069E7,0x8E0069EA,0x00122CE3,0x00122CD7, +0x0010A75C,0x0010A758,0x930069EB,0x940069EC,0x00122CCB,0x0010A754,0x0010A750,0x0010A74C,0xB40069C2,0xAA0069D8, +0xAB0069D9,0xAC0069DA,0xAD0069DB,0xAE0069DC,0xAF0069DD,0xB00069DE,0x0010A748,0x0010A744,0xBE0069C3,0x0010A740, +0x0010A73C,0x0010A738,0x0010A734,0x0010A730,0x0010A72C,0x0010A728,0x0010A724,0x0010A720,0x0010A71C,0x0010A718, +0x0010A714,0x800069ED,0x810069F6,0x0010A710,0x830069F7,0x0010A70C,0x0010A708,0x0010A704,0x870069F9,0x0010A700, +0x0010A6FC,0x0010A6F8,0x0010A6F4,0x8C0069FA,0x8D0069FB,0x8E0069FC,0x0010A6F0,0x0010A6EC,0x900069FF,0x91006A00, +0x0010A6E8,0x93006A01,0x0010A6E4,0x0010A6E0,0x0010A6DC,0x97006A02,0x990069FD,0x0010A6D8,0x0010A6D4,0x0010A6D0, +0x9C006A03,0x9D006A04,0x9E006A07,0x0010A6CC,0x0010A6C8,0x0010A6C4,0x0010A6C0,0x0010A6BC,0x0010A6B8,0x0010A6B4, +0x0010A6B0,0x0010A6AC,0x0010A6A8,0x0010A6A4,0x81006A0B,0x82006A0D,0x0010A6A0,0x0010A69C,0x0010A698,0x0010A694, +0x0010A690,0x0010A68C,0x0010A688,0x0010A684,0x0010A680,0x0010AA71,0xB6006A09,0xB7006A0A,0xB90069FE,0x90006A0E, +0x91006A0F,0x92006A10,0x93006A14,0x0010AA6B,0x0010A67C,0x96006A15,0x97006A18,0x0010AA65,0x0010ACBB,0x9A006A1A, +0x9B006A1B,0x9C006A1C,0x9D006A1F,0x9E006A20,0x9F006A21,0x0010A678,0x0010A674,0xA2006A25,0xA3006A26,0xA4006A27, +0xA5006A28,0xA6006A29,0xA7006A2A,0x0010A670,0x0018A66A,0xAA006A2B,0xAB006A2C,0xAC006A2D,0xAD006A2E,0xAE006A2F, +0xAF006A32,0xB0006A33,0xB1006A34,0xB2006A35,0xB3006A36,0xB4006A37,0xB5006A38,0x0018A664,0x0018A65E,0xB8006A39, +0xB9006A3A,0x80006A4F,0x0018A658,0x82006A50,0xA2006A3B,0xA3006A43,0xA4006A44,0xA5006A47,0xA6006A48,0x0018A652, +0x0018A64C,0x0018A646,0x0018A640,0xA40069E0,0xA5006A05,0x0018A63A,0xA7006A0C,0xA80069DF,0xA9006A13,0x0018A634, +0x93006A57,0x0018A62E,0xAD006A30,0xAE006A12,0xAF006A3C,0x0018A628,0xB1006A31,0x0018A622,0xB3006A49,0x0018A61C, +0xB5006A4B,0x0018A616,0xB7006A3E,0xA9006A58,0x0018A610,0x0018A60A,0x0018A604,0x0018A5FE,0xBD006A4C,0xBE006A61, +0x0018A5F8,0xB1006A65,0xB3006A8B,0x0018A5F2,0xB4006A66,0xB6006A8C,0x0018A5EC,0x8B006A81,0x8C006A83,0x0018A5E6, +0x0018A5E0,0x0018A5DA,0x0018A5D4,0x98006A6A,0x99006A71,0x9A006A72,0x9B006A73,0x9C006A74,0x9D006A77,0x9E006A7B, +0x9F006A7D,0x0018A5CE,0x94006AA7,0x0018A5C8,0x9C006A85,0x9D006A87,0x0018A5C2,0x9F006A8A,0x99006A8D,0x9A006A90, +0x9B006A93,0x0018A5BC,0x0018A5B6,0x9E006A96,0x0018A5B0,0x0018A5AA,0x0018A5A4,0x0018A59E,0x001A300E,0x0026300E, +0x88006A99,0x88006AB2,0x0018A598,0x8B006A9A,0x8C006A9B,0x0018A592,0x0018A58C,0x0018A586,0x001A3005,0x00263005, +0x0018A580,0x0018A57A,0x0018A574,0x0018A56E,0x8A006AAA,0x8B006AAF,0x8C006AB0,0x80006AB3,0x0018A568,0x0018A562, +0x9C006A9C,0x9D006AA5,0x0018A55C,0x83006AC3,0x87006AB4,0x88006AB5,0x0018A556,0x8A006AB6,0x8B006AB7,0x8A006ABA, +0x8B006ABD,0x8C006ABE,0x9A006ABF,0x8D006AC4,0x9C006AC0,0x9D006AC1,0x9E006AC2,0x0018A550,0x92006AC5,0x0018A54A, +0x0018A544,0x0018B173,0x81006AE1,0x97006ACA,0x0018A53E,0x0018A538,0x0018A532,0x0018A52C,0x9C006ACB,0x0018A526, +0x0018A520,0x80006A46,0xA6006AED,0x0018A51A,0x0018A514,0x0018A50E,0x0018A508,0x0018A502,0x0018A4FC,0x0018A4F6, +0x93006AE4,0xA9006ACE,0x0018A4F0,0x0018A4EA,0x80006AFA,0x81006AFC,0x0018A4E4,0x83006AFD,0x0018A4DE,0x0018A4D8, +0x9D006AE5,0xB3006AD2,0x000CA4D5,0xB5006ADD,0xB6006ADF,0xA2006AE6,0xB8006AE0,0x000CA4D2,0x000CA4CF,0x000CA4CC, +0xA7006AE7,0x000CA4C9,0x86006AEE,0x000CA4C6,0x88006AEF,0xAC006AE9,0x8A006AF0,0x000CA4C3,0x8C006AF1,0x000CA4C0, +0x8E006AF2,0x00163000,0x00162FFB,0x000CA4BD,0x92006AF3,0xAC006A84,0xAD006A78,0x000CA4BA,0xB9006AEA,0x000CA4B7, +0x000CA4B4,0x000CA4B1,0x000CA4AE,0x000CA4AB,0x000CA4A8,0x000CA4A5,0x000CA4A2,0xB8006AC6,0xB9006B1A,0xBA006B9A, +0xBB006C1A,0xBC006C9A,0xBD006D1A,0xBE006D9A,0xBF006E1A,0x00162FF6,0x00162FF1,0x00162FEC,0x00162FE7,0x000CA49F, +0x000CA49C,0x000CA499,0x000CA496,0x00162FE2,0x00162FDD,0x000CA493,0x000CA490,0x000CA48D,0x000CA48A,0x000CA487, +0x000CA484,0x000CA481,0x000CA47E,0x000CA47B,0x000CA478,0xBB006AF6,0x000CA475,0xBD006AF7,0x000CA472,0x000CA46F, +0x000CA46C,0x000CA469,0x80006B00,0x81006B05,0x82006B06,0x83006B07,0x84006B09,0x85006B0B,0x86006B0F,0x87006B11, +0x88006B13,0x89006B14,0x8A006B15,0x8B006B19,0x8C006B1B,0x8D006B1C,0x8E006B1D,0x8F006B1E,0x90006B1F,0x91006B20, +0x92006B21,0x93006B22,0x94006B2B,0x95006B2C,0x96006B2D,0x97006B2E,0x98006B2F,0x99006B30,0x9A006B31,0x9B006B32, +0x9C006B33,0x9D006B34,0x9E006B35,0x9F006B36,0xA0006B37,0xA1006B38,0xA2006B39,0xA3006B3A,0xA4006B3B,0xA5006B3C, +0xA6006B3D,0xA7006B3E,0xA8006B40,0xA9006B42,0xAA006B43,0xAB006B44,0xAC006B45,0xAD006B86,0xAE006B87,0xAF006B88, +0xB0006B89,0xB1006B8A,0xB2006B8B,0xB3006B8C,0xB4006B8D,0xB5006B8E,0xB6006B8F,0xB7006B90,0xB8006B91,0xB9006B92, +0xBA006B93,0xBB006B94,0xBC006B95,0xBD006B96,0xBE006B97,0xBF006B98,0x000CA466,0x00162FD8,0x00162FD3,0x000CA463, +0x000CA460,0x000CA45D,0x000CA45A,0x000CA457,0x000CA454,0x000E2FCE,0x000E2FC9,0x00162FCE,0x00162FC9,0x000CA451, +0x000CA44E,0x000CA44B,0x000CA448,0x000CA445,0x000CA442,0x000CA43F,0x80006B99,0x81006BDA,0x82006BDB,0x83006BDC, +0x84006BDD,0x85006BDE,0x86006BDF,0x87006BE0,0x88006BE1,0x89006BE2,0x8A006BE3,0x8B006BE4,0x8C006BE5,0x8D006BE6, +0x8E006BE7,0x8F006BE8,0x90006BE9,0x91006BEA,0x92006BEB,0x93006BEC,0x94006BED,0x95006BEE,0x96006BEF,0x97006BF0, +0x98006BF1,0x99006BF2,0x9A006BF3,0x9B006BF4,0x9C006BF5,0x9D006BF6,0x9E006BF7,0x9F006BF8,0xA0006BF9,0xA1006BFA, +0xA2006BFB,0xA3006BFC,0xA4006BFD,0xA5006BFE,0xA6006BFF,0xA7006C00,0xA8006C01,0xA9006C02,0xAA006C03,0xAB006C04, +0xAC006C05,0xAD006C06,0xAE006C07,0xAF006C08,0xB0006C09,0xB1006C0A,0xB2006C0B,0xB3006C0C,0xB4006C0D,0xB5006C0E, +0xB6006C0F,0xB7006C10,0xB8006C11,0xB9006C12,0xBA006C13,0xBB006C14,0xBC006C15,0xBD006C16,0xBE006C17,0xBF006C18, +0x000CA43C,0x000CA439,0x000CA436,0x000CA433,0x000CA430,0x000CA42D,0x000CA42A,0x000CA427,0x000CA424,0x000CA421, +0x000CA41E,0x00162FC4,0x00162FBF,0x00162FBA,0x00162FB5,0x00162FB0,0x00162FAB,0x00162FA6,0x00162FA1,0x000CA41B, +0x000CA418,0x000CA415,0x000CA412,0x000CA40F,0x000CA40C,0x000E2F9C,0x000E2F97,0x00162F9C,0x00162F97,0x000CA409, +0x000CA406,0x000CA403,0x000CA400,0x000E2F7E,0x000E2F79,0x00162F92,0x00162F8D,0x00162F88,0x00162F83,0x00162F7E, +0x00162F79,0x000CA3FD,0x000CA3FA,0x000CA3F7,0x000CA3F4,0x000CA3F1,0x000CA3EE,0x000CA3EB,0x000CA3E8,0x000CA3E5, +0x000CA3E2,0x000CA3DF,0x000CA3DC,0x000CA3D9,0x000CA3D6,0x00162F74,0x00162F6F,0x00162F6A,0x00162F65,0x000CA3D3, +0x000CA3D0,0x000CA3CD,0x000CA3CA,0x000CA3C7,0x80006C19,0x81006C34,0x82006C36,0x83006C37,0x84006C38,0x85006C39, +0x86006C5A,0x87006C5B,0x88006C5C,0x89006C5D,0x8A006C5E,0x8B006C5F,0x8C006C60,0x8D006C61,0x8E006C62,0x8F006C63, +0x90006C64,0x91006C65,0x92006C66,0x93006C67,0x94006C68,0x95006C69,0x96006C6A,0x97006C6B,0x98006C6C,0x99006C6D, +0x000CA3C4,0x9B006C6E,0x000CA3C1,0x000CA3BE,0x000CA3BB,0x000CA3B8,0xA0006C6F,0xA1006C70,0xA2006C71,0xA3006C72, +0xA4006C73,0xA5006C74,0xA6006C75,0xA7006C76,0xA8006C77,0xA9006C78,0xAA006C79,0xAB006C7A,0xAC006C7B,0xAD006C7C, +0xAE006C7D,0xAF006C7E,0xB0006C7F,0xB1006C80,0xB2006C81,0xB3006C82,0xB4006C83,0xB5006C84,0xB6006C85,0xB7006C86, +0xB8006C87,0xB9006C88,0xBA006C89,0xBB006C8A,0xBC006C8B,0xBD006C8C,0xBE006C8D,0xBF006C8E,0x000CA3B5,0x000CA3B2, +0x000CA3AF,0x000CA3AC,0x000CA3A9,0x000CA3A6,0x000CA3A3,0x000CA3A0,0x000CA39D,0x000CA39A,0x000CA397,0x000CA394, +0x000CA391,0x000CA38E,0x000CA38B,0x000CA388,0x000CA385,0x000CA382,0x000CA37F,0x000CA37C,0x0010A378,0x000E2F06, +0x000E2F01,0x000CA375,0x000CA372,0x00162F60,0x00162F5B,0x00162F56,0x00162F51,0x00162F4C,0x00162F47,0x00162F42, +0x00162F3D,0x00162F38,0x00162F33,0x00162F2E,0x00162F29,0x00162F24,0x00162F1F,0x00162F1A,0x00162F15,0x00162F10, +0x00162F0B,0x00162F06,0x00162F01,0x000E2ED4,0x000E2ECF,0x000CA36F,0x000CA36C,0x000CA369,0x000CA366,0x00162EFC, +0x00162EF7,0x00162EF2,0x00162EED,0x00162EE8,0x00162EE3,0x00162EDE,0x00162ED9,0x00162ED4,0x00162ECF,0x000CA363, +0x000CA360,0x000CA35D,0x80006C8F,0x81006C90,0x82006C91,0x83006C92,0x84006C93,0x85006C94,0x86006C95,0x87006C96, +0x88006C97,0x89006C98,0x8A006C99,0x8B006CD4,0x8C006CD5,0x8D006CD6,0x8E006CD7,0x8F006CD8,0x90006CD9,0x91006CDA, +0x92006CDB,0x93006CDC,0x94006CDD,0x95006CDE,0x96006CDF,0x97006CE0,0x98006CE1,0x99006CE2,0x9A006CE3,0x9B006CE4, +0x9C006CE5,0x9D006CE6,0x9E006CE7,0x9F006CE8,0xA0006CE9,0xA1006CEA,0xA2006CEB,0xA3006CEC,0xA4006CED,0xA5006CEE, +0xA6006CEF,0xA7006CF0,0xA8006CF1,0xA9006CF2,0xAA006CF3,0xAB006CF4,0xAC006CF5,0xAD006CF6,0xAE006CF7,0xAF006CF8, +0xB0006CF9,0xB1006CFA,0xB2006CFB,0xB3006CFC,0xB4006CFD,0xB5006CFE,0xB6006CFF,0xB7006D00,0xB8006D01,0xB9006D02, +0x000CA35A,0x000E2EA2,0x000E2E9D,0x000CA357,0x000CA354,0x00162ECA,0x00162EC5,0x00162EC0,0x00162EBB,0x00162EB6, +0x00162EB1,0x00162EAC,0x00162EA7,0x00162EA2,0x00162E9D,0x00162E98,0x00162E93,0x00162E8E,0x00162E89,0x00162E84, +0x00162E7F,0x00162E7A,0x00162E75,0x00162E70,0x00162E6B,0x000CA351,0x000CA34E,0x000CA34B,0x000CA348,0x00162E66, +0x00162E61,0x00162E5C,0x00162E57,0x00162E52,0x00162E4D,0x00162E48,0x00162E43,0x00162E3E,0x00162E39,0x000CA345, +0x000CA342,0x000CA33F,0x000CA33C,0x000CA339,0x000CA336,0x000CA333,0x000CA330,0x00122D55,0x00122D4F,0x001A33F7, +0x001A33EF,0x001A33E7,0x001A33DF,0x001A33D7,0x001A33CF,0x00122D49,0x00122D43,0x001A33C7,0x001A33BF,0x001A33B7, +0x001A33AF,0x001A33A7,0x001A339F,0x00122E27,0x00122E21,0x001A2E33,0x001A2E2D,0x001A2E27,0x001A2E21,0x00122E0F, +0x80006D03,0x81006D04,0x82006D05,0x83006D06,0x84006D07,0x85006D08,0x86006D09,0x87006D0A,0x88006D0B,0x89006D0C, +0x8A006D0D,0x8B006D0E,0x8C006D0F,0x8D006D10,0x8E006D11,0x8F006D12,0x90006D13,0x91006D14,0x92006D15,0x93006D16, +0x94006D17,0x95006D18,0x00122E09,0x001A2E1B,0x98006D19,0x99006D30,0x9A006D31,0x9B006D38,0x9C006D39,0x9D006D5A, +0x001A2E15,0x001A2E0F,0xA0006D5B,0xA1006D5C,0xA2006D5D,0xA3006D5E,0xA4006D5F,0xA5006D60,0xA6006D61,0xA7006D62, +0xA8006D63,0xA9006D64,0xAA006D65,0xAB006D66,0xAC006D67,0xAD006D68,0xAE006D69,0xAF006D6A,0xB0006D6B,0xB1006D6C, +0xB2006D6D,0xB3006D6E,0xB4006D6F,0xB5006D70,0xB6006D71,0xB7006D72,0xB8006D73,0xB9006D74,0xBA006D75,0xBB006D76, +0xBC006D77,0xBD006D78,0xBE006D79,0xBF006D7A,0x001A2E09,0x00122D3D,0x00122D37,0x001A3397,0x001A338F,0x001A3387, +0x001A337F,0x001A3377,0x001A336F,0x00122D31,0x00122D2B,0x001A3367,0x001A335F,0x001A3357,0x001A334F,0x001A3347, +0x001A333F,0x00122DEB,0x00122DE5,0x001A2E03,0x001A2DFD,0x001A2DF7,0x001A2DF1,0x001A2DEB,0x001A2DE5,0x00122DC7, +0x00122DC1,0x001A2DDF,0x001A2DD9,0x001A2DD3,0x001A2DCD,0x001A2DC7,0x001A2DC1,0x00122DAF,0x00122DA9,0x001A2DBB, +0x001A2DB5,0x001A2DAF,0x001A2DA9,0x00122D97,0x00122D91,0x001A2DA3,0x001A2D9D,0x001A2D97,0x001A2D91,0x00122D73, +0x00122D6D,0x001A2D8B,0x001A2D85,0x001A2D7F,0x001A2D79,0x001A2D73,0x001A2D6D,0x00122D5B,0x001A2D67,0x001A2D61, +0x001A2D5B,0x00122D25,0x00122D1F,0x001A3337,0x001A332F,0x001A3327,0x001A331F,0x001A3317,0x80006D7B,0x81006D7C, +0x82006D7D,0x83006D7E,0x84006D7F,0x85006D80,0x001A330F,0x00122D19,0x88006D81,0x89006D82,0x8A006D83,0x8B006D84, +0x8C006D85,0x8D006D86,0x00122D13,0x001A3307,0x90006D87,0x91006D88,0x92006D89,0x93006D8A,0x94006D8B,0x95006D8C, +0x96006D8D,0x97006D8E,0x001A32FF,0x99006D8F,0x001A32F7,0x9B006D90,0x001A32EF,0x9D006D91,0x001A32E7,0x9F006D92, +0xA0006D93,0xA1006D94,0xA2006D95,0xA3006D96,0xA4006D97,0xA5006D98,0xA6006D99,0xA7006DA0,0xA8006DA1,0xA9006DA8, +0xAA006DA9,0xAB006DB2,0xAC006DB4,0xAD006DB6,0xAE006DB8,0xAF006DD8,0xB0006DD9,0xB10069DA,0xB2006DDA,0xB30069DB, +0xB4006DDB,0xB50069DC,0xB6006DDC,0xB70069DD,0xB8006DDD,0xB90069E6,0xBA006DDE,0xBB0069E7,0xBC006DDF,0xBD0069EA, +0x001A32DF,0x00122D0D,0x0010A32C,0x00122CFB,0x0010A328,0x0010A324,0x0010A320,0x00122CD1,0x001A2D55,0x001A2D4F, +0x002233F7,0x002233EF,0x002233E7,0x002233DF,0x002233D7,0x002233CF,0x001A2D49,0x001A2D43,0x002233C7,0x002233BF, +0x002233B7,0x002233AF,0x002233A7,0x0022339F,0x001A2D3D,0x001A2D37,0x00223397,0x0022338F,0x00223387,0x0022337F, +0x00223377,0x0022336F,0x001A2D31,0x001A2D2B,0x00223367,0x0022335F,0x00223357,0x0022334F,0x00223347,0x0022333F, +0x001A2D25,0x001A2D1F,0x00223337,0x0022332F,0x00223327,0x0022331F,0x00223317,0x0022330F,0x001A2D19,0x001A2D13, +0x00223307,0x002232FF,0x002232F7,0x002232EF,0x002232E7,0x002232DF,0x0010A31C,0x0010A318,0x001A2D0D,0x0010A314, +0x001A2D07,0x00122D01,0x001A2D01,0x0010A310,0x0010A30C,0x0010A308,0x80006DE0,0x81006DE1,0x82006DE2,0x83006DE3, +0x84006DE4,0x85006DE5,0x86006DE6,0x87006DE7,0x88006DE8,0x89006DE9,0x8A006DEA,0x8B006DEB,0x8C006DEC,0x8D006DED, +0x8E006DEE,0x8F006DEF,0x90006DF0,0x91006DF1,0x92006DF2,0x93006DF3,0x94006DF4,0x95006DF5,0x96006DF6,0x97006DF7, +0x98006DF8,0x99006DF9,0x9A006DFA,0x9B006DFB,0x9C006DFC,0x9D006DFD,0x9E006DFE,0x9F006DFF,0xA0006E00,0xA1006E01, +0xA2006E02,0xA3006E03,0xA4006E04,0xA5006E05,0xA6006E06,0xA7006E07,0xA8006E08,0xA9006E09,0xAA006E0A,0xAB006E0B, +0xAC006E0C,0xAD006E0D,0xAE006E0E,0xAF006E0F,0xB0006E10,0xB1006E11,0xB2006E12,0xB3006E13,0xB4006E14,0x0010A304, +0xB6006E15,0xB7006E16,0xB8006E17,0xB9006E18,0xBA006E19,0xBB0069C5,0xBC006E4F,0x0008A2D5,0xBE006E57,0x0010A300, +0x001A2CFB,0x0010A2FC,0x001A2CF5,0x00122CEF,0x001A2CEF,0x0010A2F8,0x0010A2F4,0x0010A2F0,0x0014A2EB,0x0014A2E6, +0x0014A2E1,0x0010A2DD,0x0010A2D9,0x001A2CE9,0x0010A2D5,0x001A2CE3,0x0010A2D1,0x0010A2CD,0x0010A2C9,0x0014A2C4, +0x0014A2BF,0x0014A2BA,0x0010A2B6,0x0010A2B2,0x001A2CDD,0x0010A2AE,0x0010A2AA,0x0010A2A6,0x001A2CD7,0x0010A2A2, +0x0010A29E,0x0010A29A,0x0010A296,0x0010A292,0x00040FEB,0x001A2CD1,0x0010A28E,0x001A2CCB,0x00122CC5,0x001A2CC5, +0x0010A28A,0x0010A286,0x0010A282,0x00080FE9,0x000C0FE6,0x000C0FE3,0x00089E65,0x00049E50,0x0014A27D,0x0014A278, +0x0014A273,0xBC00D0AC,0x0014A26E,0x0014A269,0x0014A264,0x0014A25F,0x0014A25A,0x0014A255,0xBF00E80E,0x0014A250, +0x0014A24B,0x0014A246,0x0014A241,0x0014A23C,0x0014A237,0x81006E59,0x82006E5A,0x83006E5B,0x84006E5C,0x000CA234, +0x86006E5D,0x87006E5E,0x88006E5F,0x890069C7,0x8A006E60,0x8B0069C8,0x8C006E61,0x8D006E62,0x8E006E63,0x8F006E64, +0x90006E65,0x91006E66,0x92006E67,0x930069D7,0x80006E86,0x81006E87,0x96006E68,0x97006E69,0x98006E6A,0x99006E6B, +0x9A006E6C,0x9B0069C9,0x0014A22F,0x9D006E6D,0x9E006E6E,0x9F006E6F,0xA0006E70,0xA1006E71,0xA2006E72,0xA30069DE, +0xA4006E73,0xA5006E74,0xA6006E75,0xA7006E76,0xA8006E77,0xA9006E78,0xAA006E79,0xAB0069D2,0xAC006E7A,0xAD006E7B, +0xAE0069C4,0xAF006E7C,0x0014A22A,0x000CA227,0xB2006E7D,0xB3006E7E,0xB4006E7F,0x000CA224,0xB6006E80,0xB7006E81, +0xB8006E82,0xB90069D0,0xBA006E83,0xBB0069D6,0xBC006E84,0xBD006E85,0x80006E2E,0x0014A21F,0x9A006E8A,0x9B006E8B, +0x84006E3F,0x0014A21A,0x86006E40,0x87006E8D,0x88006E94,0x89006E9D,0x8A006EAB,0x8B006EBB,0x8C006E56,0xA6006E88, +0x0014A215,0x0014A210,0x0014A20B,0xAA006E89,0xAB0067B5,0x0014A206,0x0014A201,0x0014A1FC,0xAE006E8C,0x0014A1F7, +0x0014A1F2,0x0014A1ED,0x0014A1E8,0x0014A1E3,0x0014A1DE,0x0014A1D9,0x0014A1D4,0x0014A1CF,0x0014A1CA,0x0014A1C5, +0x0014A1C0,0x0014A1BB,0x0014A1B6,0x0014A1B1,0x0014A1AC,0xA9006F01,0xAA006F02,0x000C0FE0,0x000C0FDD,0xAB006E9B, +0x0014A1A7,0x0018A1A1,0x0018A19B,0x0018A195,0x0018A18F,0x0018A189,0x0018A183,0x0018A17D,0x0018A177,0x0018A171, +0x0018A16B,0x0018A165,0x0018A15F,0x0018A159,0x0018A153,0x0018A14D,0x0018A147,0x0018A141,0x0018A13B,0x0018A135, +0x84006E91,0x0018A12F,0x8D006E8E,0x8E006E8F,0x8F006E90,0x89006E92,0x81006E97,0x0018A129,0x8C006E93,0x84006E98, +0x0018A123,0x0018A11D,0x87006E99,0x0018A117,0x89006E9A,0x81006EDE,0x82006EFF,0x83006F3A,0x0018A111,0x80006EEC, +0x81006EED,0x0018A10B,0x0018A105,0x84006EEF,0x85006EF0,0x001A31BB,0x001A31A9,0x88006EF1,0x89006EF2,0x001A3480, +0x001A34F1,0x9C006F04,0xA4006E95,0x0018A0FF,0xA6006E96,0x0018A0F9,0x001A3453,0xA0006E9F,0x0018A0F3,0xA2006EB6, +0x001A355A,0x0018A0ED,0x001A316D,0x0018A0E7,0x0018A0E1,0x0018AED4,0x0018AECB,0x001A3468,0x001A3161,0x0018AEA7, +0xAD006ECA,0xAE006ECB,0xAF006ECF,0xB0006ED9,0xB1006EDD,0x0018AEB0,0x001A3405,0xB4006EE6,0xB5006EE7,0x0018A0DB, +0x001A3125,0xB8006EE8,0xB9006EEB,0xAC006EF3,0xAD006EF4,0xAE006EF5,0xAF006EF6,0xA0006EF7,0xA1006EF8,0xA2006EF9, +0xA3006EFA,0x0018AE95,0x001A3119,0x001A318B,0x0018A0D5,0x0018A0CF,0x0018A0C9,0xAA006EFB,0xAB006EFC,0xAC006EFD, +0xAD006EFE,0x0018A0C3,0x8C006F05,0x0018A0BD,0x8E006F06,0x0018A0B7,0x90006F07,0x001A2BD2,0x92006F08,0x00262CBC, +0x94006F09,0x00262CB3,0x96006F0A,0x00262CAA,0x98006F0B,0x00262CA1,0x9A006F0C,0xB300D039,0x9C006F0D,0x00262C98, +0x9E006F0E,0x00262C8F,0xA0006F0F,0x00262C86,0xA2006F10,0x00262C7D,0x00262C74,0xA5006F11,0x00262C6B,0xA7006F12, +0x00262C62,0xA9006F13,0x00262C59,0x00262C50,0x00262C47,0x00262C3E,0x00262C35,0x00262C2C,0xB0006F14,0xB1006F15, +0x00262C23,0xB3006F16,0xB4006F17,0x94006F2D,0xB6006F19,0xB7006F1F,0x00262C1A,0xB9006F22,0xBA006F23,0x00262C11, +0xBC006F25,0xBD006F2A,0x00262C08,0x9E006F2E,0x00262BFF,0x00262BF6,0x00262BED,0x00262BE4,0x00262BDB,0x00262BD2, +0x001A2ADF,0x00262BC9,0x00262BC0,0x00262BB7,0x00262BAE,0x00262BA5,0x00262B9C,0xAC006F31,0x00262B93,0xAE006F32, +0x00262B8A,0xB0006F35,0x00262B81,0xB2006F36,0x00262B78,0xB4006F39,0x00262B6F,0xB6006F3B,0x00262B66,0xB8006F3C, +0x00262B5D,0xBA006F3E,0x80006F42,0xBC006F40,0x82006F43,0xBE006F41,0x00262B54,0x85006F44,0x00262B4B,0x87006F45, +0x00262B42,0x89006F46,0x00262B39,0x00262B30,0x00262B27,0x00262B1E,0x00262B15,0x00262B0C,0x90006F47,0x91006F48, +0x00262B03,0x93006F49,0x94006F4F,0x00262AFA,0x96006F50,0x97006F53,0x00262AF1,0x99006F54,0x9A006F5F,0x00262AE8, +0x9C006F60,0x9D006F61,0xB0006F79,0xB1006FB9,0xB2007037,0xB30070B7,0xB4007137,0xB50071B7,0xB6007237,0xB70072B7, +0xB8007337,0xB90073B7,0xBA007437,0xBB0074B7,0xBC007537,0xBD0075B7,0xBE007637,0xBF0076B7,0x00262ADF,0x001A29EC, +0x00262AD6,0x00262ACD,0x00262AC4,0x00262ABB,0xB4006F62,0x00262AB2,0x00262AA9,0xB7006F63,0xB8006F64,0xB9006F69, +0xBA006F6B,0x00262AA0,0x00262A97,0x00262A8E,0xBE006F6D,0x80006F6F,0x81006F71,0x82006F73,0x83006F75,0x84006F77, +0x85006F7B,0x86006F7D,0x87006F7F,0x88006F81,0x89006F82,0x8A006F84,0x8B006F86,0x8C006F88,0x8D006F89,0x8E006F8A, +0x8F006F8B,0x90006F8C,0x91006F8D,0x92006F90,0x93006F96,0x94006F99,0x95006F9C,0x96006F9E,0x97006F9F,0x98006FA0, +0x99006FA1,0x9A006FA2,0x9B006FA3,0x9C006FA4,0x9D006FA5,0x9E006FA6,0x9F006FA7,0xA0006FA8,0xA1006FA9,0xA2006FAA, +0xA3006FAC,0xA4006FAE,0xA5006FB0,0xA6006FB2,0xA7006FB4,0xA8006FB6,0xA9006FB8,0xAA006FBE,0xAB006FC0,0xAC006FC2, +0xAD006FC4,0xAE006FC5,0xAF006FC6,0xB0006FC7,0xB1006FC8,0xB2006FC9,0xB3006FCC,0xB4006FCF,0xB5006FD2,0xB6006FD5, +0xB7006FE8,0xB8006FE9,0xB9006FEA,0xBA006FEB,0xBB006FEC,0xBC006FED,0xBD006FEF,0xBE006FF0,0xBF006FF5,0x80006FF6, +0x81006FF7,0x82007079,0x8300707A,0x8400707B,0x8500707C,0x8600707D,0x8700707E,0x8800707F,0x89007080,0x8A007081, +0x8B007082,0x8C007083,0x8D007084,0x8E007085,0x8F007086,0x90007087,0x91007088,0x92007089,0x9300708A,0x9400708B, +0x9500708C,0x9600708D,0x9700708E,0x9800708F,0x99007090,0x9A007091,0x9B007092,0x9C007093,0x9D007094,0x9E007095, +0x9F007096,0xA0007097,0xA1007098,0xA2007099,0xA300709A,0xA400709B,0xA500709C,0xA600709D,0xA700709E,0xA800709F, +0xA90070A0,0xAA0070A1,0xAB0070A2,0xAC0070A3,0xAD0070A4,0xAE0070A5,0xAF0070A6,0xB00070A7,0xB10070A8,0xB20070A9, +0xB30070AA,0xB40070AB,0xB50070AC,0xB60070AD,0xB70070AE,0xB80070AF,0xB90070B0,0xBA0070B1,0xBB0070B2,0xBC0070B3, +0xBD0070B4,0xBE0070B5,0xBF0070B6,0x00262A85,0x00262A7C,0x00262A73,0x00262A6A,0x00262A61,0x00262A58,0x00262A4F, +0x00262A46,0x00262A3D,0x00262A34,0x00262A2B,0x00262A22,0x00262A19,0x00262A10,0x00262A07,0x002629FE,0x002629F5, +0x002629EC,0x001A28F9,0x002629E3,0x002629DA,0x002629D1,0x002629C8,0x002629BF,0x002629B6,0x002629AD,0x002629A4, +0x0026299B,0x00262992,0x00262989,0x00262980,0x00262977,0x0026296E,0x00262965,0x0026295C,0x00262953,0x0026294A, +0x00262941,0x00262938,0x0026292F,0x00262926,0x0026291D,0x00262914,0x0026290B,0x00262902,0x002628F9,0x001A2806, +0x002628F0,0x002628E7,0x002628DE,0x002628D5,0x002628CC,0x002628C3,0x002628BA,0x002628B1,0x002628A8,0x0026289F, +0x00262896,0x0026288D,0x00262884,0x0026287B,0x00262872,0x800070F7,0x810070F8,0x820070F9,0x830070FA,0x840070FB, +0x850070FC,0x860070FD,0x870070FE,0x880070FF,0x89007100,0x8A007101,0x8B007102,0x8C007103,0x8D007104,0x8E007105, +0x8F007106,0x90007107,0x91007108,0x92007109,0x9300710A,0x9400710B,0x9500710C,0x9600710D,0x9700710E,0x9800710F, +0x99007110,0x9A007111,0x9B007112,0x9C007113,0x9D007114,0x9E007115,0x9F007116,0xA0007117,0xA1007118,0xA2007119, +0xA300711A,0xA400711B,0xA500711C,0xA600711D,0xA700711E,0xA800711F,0xA9007120,0xAA007121,0xAB007122,0xAC007123, +0xAD007124,0xAE007125,0xAF007126,0xB0007127,0xB1007128,0xB2007129,0xB300712A,0xB400712B,0xB500712C,0xB600712D, +0xB700712E,0xB800712F,0xB9007130,0xBA007131,0xBB007132,0xBC007133,0xBD007134,0xBE007135,0xBF007136,0x00262869, +0x00262860,0x00262857,0x0026284E,0x00262845,0x0026283C,0x00262833,0x0026282A,0x00262821,0x00262818,0x0026280F, +0x00262806,0x001A2713,0x002627FD,0x002627F4,0x002627EB,0x002627E2,0x002627D9,0x002627D0,0x002627C7,0x002627BE, +0x002627B5,0x002627AC,0x002627A3,0x0026279A,0x00262791,0x00262788,0x0026277F,0x00262776,0x0026276D,0x00262764, +0x0026275B,0x00262752,0x00262749,0x00262740,0x00262737,0x0026272E,0x00262725,0x0026271C,0x00262713,0x001A2620, +0x0026270A,0x00262701,0x002626F8,0x002626EF,0x002626E6,0x002626DD,0x002626D4,0x002626CB,0x002626C2,0x002626B9, +0x002626B0,0x002626A7,0x0026269E,0x00262695,0x0026268C,0x00262683,0x0026267A,0x00262671,0x00262668,0x0026265F, +0x00262656,0x0026264D,0x00262644,0x80007177,0x81007178,0x82007179,0x8300717A,0x8400717B,0x8500717C,0x8600717D, +0x8700717E,0x8800717F,0x89007180,0x8A007181,0x8B007182,0x8C007183,0x8D007184,0x8E007185,0x8F007186,0x90007187, +0x91007188,0x92007189,0x9300718A,0x9400718B,0x9500718C,0x9600718D,0x9700718E,0x9800718F,0x99007190,0x9A007191, +0x9B007192,0x9C007193,0x9D007194,0x9E007195,0x9F007196,0xA0007197,0xA1007198,0xA2007199,0xA300719A,0xA400719B, +0xA500719C,0xA600719D,0xA700719E,0xA800719F,0xA90071A0,0xAA0071A1,0xAB0071A2,0xAC0071A3,0xAD0071A4,0xAE0071A5, +0xAF0071A6,0xB00071A7,0xB10071A8,0xB20071A9,0xB30071AA,0xB40071AB,0xB50071AC,0xB60071AD,0xB70071AE,0xB80071AF, +0xB90071B0,0xBA0071B1,0xBB0071B2,0xBC0071B3,0xBD0071B4,0xBE0071B5,0xBF0071B6,0x0026263B,0x00262632,0x00262629, +0x00262620,0x001A252D,0x00262617,0x0026260E,0x00262605,0x002625FC,0x002625F3,0x002625EA,0x002625E1,0x002625D8, +0x002625CF,0x002625C6,0x002625BD,0x002625B4,0x002625AB,0x002625A2,0x00262599,0x00262590,0x00262587,0x0026257E, +0x00262575,0x0026256C,0x00262563,0x0026255A,0x00262551,0x00262548,0x0026253F,0x00262536,0x0026252D,0x001A243A, +0x00262524,0x0026251B,0x00262512,0x00262509,0x00262500,0x002624F7,0x002624EE,0x002624E5,0x002624DC,0x002624D3, +0x002624CA,0x002624C1,0x002624B8,0x002624AF,0x002624A6,0x0026249D,0x00262494,0x0026248B,0x00262482,0x00262479, +0x00262470,0x00262467,0x0026245E,0x00262455,0x0026244C,0x00262443,0x0026243A,0x001A2347,0x00262431,0x00262428, +0x0026241F,0x800071F7,0x810071F8,0x820071F9,0x830071FA,0x840071FB,0x850071FC,0x860071FD,0x870071FE,0x880071FF, +0x89007200,0x8A007201,0x8B007202,0x8C007203,0x8D007204,0x8E007205,0x8F007206,0x90007207,0x91007208,0x92007209, +0x9300720A,0x9400720B,0x9500720C,0x9600720D,0x9700720E,0x9800720F,0x99007210,0x9A007211,0x9B007212,0x9C007213, +0x9D007214,0x9E007215,0x9F007216,0xA0007217,0xA1007218,0xA2007219,0xA300721A,0xA400721B,0xA500721C,0xA600721D, +0xA700721E,0xA800721F,0xA9007220,0xAA007221,0xAB007222,0xAC007223,0xAD007224,0xAE007225,0xAF007226,0xB0007227, +0xB1007228,0xB2007229,0xB300722A,0xB400722B,0xB500722C,0xB600722D,0xB700722E,0xB800722F,0xB9007230,0xBA007231, +0xBB007232,0xBC007233,0xBD007234,0xBE007235,0xBF007236,0x00262416,0x0026240D,0x00262404,0x002623FB,0x002623F2, +0x002623E9,0x002623E0,0x002623D7,0x002623CE,0x002623C5,0x002623BC,0x002623B3,0x002623AA,0x002623A1,0x00262398, +0x0026238F,0x00262386,0x0026237D,0x00262374,0x0026236B,0x00262362,0x00262359,0x00262350,0x00262347,0x001A2254, +0x0026233E,0x00262335,0x0026232C,0x00262323,0x0026231A,0x00262311,0x00262308,0x002622FF,0x002622F6,0x002622ED, +0x002622E4,0x002622DB,0x002622D2,0x002622C9,0x002622C0,0x002622B7,0x002622AE,0x002622A5,0x0026229C,0x00262293, +0x0026228A,0x00262281,0x00262278,0x0026226F,0x00262266,0x0026225D,0x00262254,0x001A2161,0x0026224B,0x00262242, +0x00262239,0x00262230,0x00262227,0x0026221E,0x00262215,0x0026220C,0x00262203,0x002621FA,0x002621F1,0x80007277, +0x81007278,0x82007279,0x8300727A,0x8400727B,0x8500727C,0x8600727D,0x8700727E,0x8800727F,0x89007280,0x8A007281, +0x8B007282,0x8C007283,0x8D007284,0x8E007285,0x8F007286,0x90007287,0x91007288,0x92007289,0x9300728A,0x9400728B, +0x9500728C,0x9600728D,0x9700728E,0x9800728F,0x99007290,0x9A007291,0x9B007292,0x9C007293,0x9D007294,0x9E007295, +0x9F007296,0xA0007297,0xA1007298,0xA2007299,0xA300729A,0xA400729B,0xA500729C,0xA600729D,0xA700729E,0xA800729F, +0xA90072A0,0xAA0072A1,0xAB0072A2,0xAC0072A3,0xAD0072A4,0xAE0072A5,0xAF0072A6,0xB00072A7,0xB10072A8,0xB20072A9, +0xB30072AA,0xB40072AB,0xB50072AC,0xB60072AD,0xB70072AE,0xB80072AF,0xB90072B0,0xBA0072B1,0xBB0072B2,0xBC0072B3, +0xBD0072B4,0xBE0072B5,0xBF0072B6,0x002621E8,0x002621DF,0x002621D6,0x002621CD,0x002621C4,0x002621BB,0x002621B2, +0x002621A9,0x002621A0,0x00262197,0x0026218E,0x00262185,0x0026217C,0x00262173,0x0026216A,0x00262161,0x001A206E, +0x00262158,0x0026214F,0x00262146,0x0026213D,0x00262134,0x0026212B,0x00262122,0x00262119,0x00262110,0x00262107, +0x002620FE,0x002620F5,0x002620EC,0x002620E3,0x002620DA,0x002620D1,0x002620C8,0x002620BF,0x002620B6,0x002620AD, +0x002620A4,0x0026209B,0x00262092,0x00262089,0x00262080,0x00262077,0x0026206E,0x001A1F7B,0x00262065,0x0026205C, +0x00262053,0x0026204A,0x00262041,0x00262038,0x0026202F,0x00262026,0x0026201D,0x00262014,0x0026200B,0x00262002, +0x00261FF9,0x00261FF0,0x00261FE7,0x00261FDE,0x00261FD5,0x00261FCC,0x00261FC3,0x800072F7,0x810072F8,0x820072F9, +0x830072FA,0x840072FB,0x850072FC,0x860072FD,0x870072FE,0x880072FF,0x89007300,0x8A007301,0x8B007302,0x8C007303, +0x8D007304,0x8E007305,0x8F007306,0x90007307,0x91007308,0x92007309,0x9300730A,0x9400730B,0x9500730C,0x9600730D, +0x9700730E,0x9800730F,0x99007310,0x9A007311,0x9B007312,0x9C007313,0x9D007314,0x9E007315,0x9F007316,0xA0007317, +0xA1007318,0xA2007319,0xA300731A,0xA400731B,0xA500731C,0xA600731D,0xA700731E,0xA800731F,0xA9007320,0xAA007321, +0xAB007322,0xAC007323,0xAD007324,0xAE007325,0xAF007326,0xB0007327,0xB1007328,0xB2007329,0xB300732A,0xB400732B, +0xB500732C,0xB600732D,0xB700732E,0xB800732F,0xB9007330,0xBA007331,0xBB007332,0xBC007333,0xBD007334,0xBE007335, +0xBF007336,0x00261FBA,0x00261FB1,0x00261FA8,0x00261F9F,0x00261F96,0x00261F8D,0x00261F84,0x00261F7B,0x001A1E88, +0x00261F72,0x00261F69,0x00261F60,0x00261F57,0x00261F4E,0x00261F45,0x00261F3C,0x00261F33,0x00261F2A,0x00261F21, +0x00261F18,0x00261F0F,0x00261F06,0x00261EFD,0x00261EF4,0x00261EEB,0x00261EE2,0x00261ED9,0x00261ED0,0x00261EC7, +0x00261EBE,0x00261EB5,0x00261EAC,0x00261EA3,0x00261E9A,0x00261E91,0x00261E88,0x001A1D95,0x00261E7F,0x00261E76, +0x00261E6D,0x00261E64,0x00261E5B,0x00261E52,0x00261E49,0x00261E40,0x00261E37,0x00261E2E,0x00261E25,0x00261E1C, +0x00261E13,0x00261E0A,0x00261E01,0x00261DF8,0x00261DEF,0x00261DE6,0x00261DDD,0x00261DD4,0x00261DCB,0x00261DC2, +0x00261DB9,0x00261DB0,0x00261DA7,0x00261D9E,0x00261D95,0x80007377,0x81007378,0x82007379,0x8300737A,0x8400737B, +0x8500737C,0x8600737D,0x8700737E,0x8800737F,0x89007380,0x8A007381,0x8B007382,0x8C007383,0x8D007384,0x8E007385, +0x8F007386,0x90007387,0x91007388,0x92007389,0x9300738A,0x9400738B,0x9500738C,0x9600738D,0x9700738E,0x9800738F, +0x99007390,0x9A007391,0x9B007392,0x9C007393,0x9D007394,0x9E007395,0x9F007396,0xA0007397,0xA1007398,0xA2007399, +0xA300739A,0xA400739B,0xA500739C,0xA600739D,0xA700739E,0xA800739F,0xA90073A0,0xAA0073A1,0xAB0073A2,0xAC0073A3, +0xAD0073A4,0xAE0073A5,0xAF0073A6,0xB00073A7,0xB10073A8,0xB20073A9,0xB30073AA,0xB40073AB,0xB50073AC,0xB60073AD, +0xB70073AE,0xB80073AF,0xB90073B0,0xBA0073B1,0xBB0073B2,0xBC0073B3,0xBD0073B4,0xBE0073B5,0xBF0073B6,0x001A1CA2, +0x00261D8C,0x00261D83,0x00261D7A,0x00261D71,0x00261D68,0x00261D5F,0x00261D56,0x00261D4D,0x00261D44,0x00261D3B, +0x00261D32,0x00261D29,0x00261D20,0x00261D17,0x00261D0E,0x00261D05,0x00261CFC,0x00261CF3,0x00261CEA,0x00261CE1, +0x00261CD8,0x00261CCF,0x00261CC6,0x00261CBD,0x00261CB4,0x00261CAB,0x00261CA2,0x001A1BAF,0x00261C99,0x00261C90, +0x00261C87,0x00261C7E,0x00261C75,0x00261C6C,0x00261C63,0x00261C5A,0x00261C51,0x00261C48,0x00261C3F,0x00261C36, +0x00261C2D,0x00261C24,0x00261C1B,0x00261C12,0x00261C09,0x00261C00,0x00261BF7,0x00261BEE,0x00261BE5,0x00261BDC, +0x00261BD3,0x00261BCA,0x00261BC1,0x00261BB8,0x00261BAF,0x001A1ABC,0x00261BA6,0x00261B9D,0x00261B94,0x00261B8B, +0x00261B82,0x00261B79,0x00261B70,0x800073F7,0x810073F8,0x820073F9,0x830073FA,0x840073FB,0x850073FC,0x860073FD, +0x870073FE,0x880073FF,0x89007400,0x8A007401,0x8B007402,0x8C007403,0x8D007404,0x8E007405,0x8F007406,0x90007407, +0x91007408,0x92007409,0x9300740A,0x9400740B,0x9500740C,0x9600740D,0x9700740E,0x9800740F,0x99007410,0x9A007411, +0x9B007412,0x9C007413,0x9D007414,0x9E007415,0x9F007416,0xA0007417,0xA1007418,0xA2007419,0xA300741A,0xA400741B, +0xA500741C,0xA600741D,0xA700741E,0xA800741F,0xA9007420,0xAA007421,0xAB007422,0xAC007423,0xAD007424,0xAE007425, +0xAF007426,0xB0007427,0xB1007428,0xB2007429,0xB300742A,0xB400742B,0xB500742C,0xB600742D,0xB700742E,0xB800742F, +0xB9007430,0xBA007431,0xBB007432,0xBC007433,0xBD007434,0xBE007435,0xBF007436,0x00261B67,0x00261B5E,0x00261B55, +0x00261B4C,0x00261B43,0x00261B3A,0x00261B31,0x00261B28,0x00261B1F,0x00261B16,0x00261B0D,0x00261B04,0x00261AFB, +0x00261AF2,0x00261AE9,0x00261AE0,0x00261AD7,0x00261ACE,0x00261AC5,0x00261ABC,0x001A19C9,0x00261AB3,0x00261AAA, +0x00261AA1,0x00261A98,0x00261A8F,0x00261A86,0x00261A7D,0x00261A74,0x00261A6B,0x00261A62,0x00261A59,0x00261A50, +0x00261A47,0x00261A3E,0x00261A35,0x00261A2C,0x00261A23,0x00261A1A,0x00261A11,0x00261A08,0x002619FF,0x002619F6, +0x002619ED,0x002619E4,0x002619DB,0x002619D2,0x002619C9,0x001A18D6,0x002619C0,0x002619B7,0x002619AE,0x002619A5, +0x0026199C,0x00261993,0x0026198A,0x00261981,0x00261978,0x0026196F,0x00261966,0x0026195D,0x00261954,0x0026194B, +0x00261942,0x80007477,0x81007478,0x82007479,0x8300747A,0x8400747B,0x8500747C,0x8600747D,0x8700747E,0x8800747F, +0x89007480,0x8A007481,0x8B007482,0x8C007483,0x8D007484,0x8E007485,0x8F007486,0x90007487,0x91007488,0x92007489, +0x9300748A,0x9400748B,0x9500748C,0x9600748D,0x9700748E,0x9800748F,0x99007490,0x9A007491,0x9B007492,0x9C007493, +0x9D007494,0x9E007495,0x9F007496,0xA0007497,0xA1007498,0xA2007499,0xA300749A,0xA400749B,0xA500749C,0xA600749D, +0xA700749E,0xA800749F,0xA90074A0,0xAA0074A1,0xAB0074A2,0xAC0074A3,0xAD0074A4,0xAE0074A5,0xAF0074A6,0xB00074A7, +0xB10074A8,0xB20074A9,0xB30074AA,0xB40074AB,0xB50074AC,0xB60074AD,0xB70074AE,0xB80074AF,0xB90074B0,0xBA0074B1, +0xBB0074B2,0xBC0074B3,0xBD0074B4,0xBE0074B5,0xBF0074B6,0x00261939,0x00261930,0x00261927,0x0026191E,0x00261915, +0x0026190C,0x00261903,0x002618FA,0x002618F1,0x002618E8,0x002618DF,0x002618D6,0x001A17E3,0x002618CD,0x002618C4, +0x002618BB,0x002618B2,0x002618A9,0x002618A0,0x00261897,0x0026188E,0x00261885,0x0026187C,0x00261873,0x0026186A, +0x00261861,0x00261858,0x0026184F,0x00261846,0x0026183D,0x00261834,0x0026182B,0x00261822,0x00261819,0x00261810, +0x00261807,0x002617FE,0x002617F5,0x002617EC,0x002617E3,0x001A16F0,0x002617DA,0x002617D1,0x002617C8,0x002617BF, +0x002617B6,0x002617AD,0x002617A4,0x0026179B,0x00261792,0x00261789,0x00261780,0x00261777,0x0026176E,0x00261765, +0x0026175C,0x00261753,0x0026174A,0x00261741,0x00261738,0x0026172F,0x00261726,0x0026171D,0x00261714,0x800074F7, +0x810074F8,0x820074F9,0x830074FA,0x840074FB,0x850074FC,0x860074FD,0x870074FE,0x880074FF,0x89007500,0x8A007501, +0x8B007502,0x8C007503,0x8D007504,0x8E007505,0x8F007506,0x90007507,0x91007508,0x92007509,0x9300750A,0x9400750B, +0x9500750C,0x9600750D,0x9700750E,0x9800750F,0x99007510,0x9A007511,0x9B007512,0x9C007513,0x9D007514,0x9E007515, +0x9F007516,0xA0007517,0xA1007518,0xA2007519,0xA300751A,0xA400751B,0xA500751C,0xA600751D,0xA700751E,0xA800751F, +0xA9007520,0xAA007521,0xAB007522,0xAC007523,0xAD007524,0xAE007525,0xAF007526,0xB0007527,0xB1007528,0xB2007529, +0xB300752A,0xB400752B,0xB500752C,0xB600752D,0xB700752E,0xB800752F,0xB9007530,0xBA007531,0xBB007532,0xBC007533, +0xBD007534,0xBE007535,0xBF007536,0x0026170B,0x00261702,0x002616F9,0x002616F0,0x001A15FD,0x002616E7,0x002616DE, +0x002616D5,0x002616CC,0x002616C3,0x002616BA,0x002616B1,0x002616A8,0x0026169F,0x00261696,0x0026168D,0x00261684, +0x0026167B,0x00261672,0x00261669,0x00261660,0x00261657,0x0026164E,0x00261645,0x0026163C,0x00261633,0x0026162A, +0x00261621,0x00261618,0x0026160F,0x00261606,0x002615FD,0x001A150A,0x002615F4,0x002615EB,0x002615E2,0x002615D9, +0x002615D0,0x002615C7,0x002615BE,0x002615B5,0x002615AC,0x002615A3,0x0026159A,0x00261591,0x00261588,0x0026157F, +0x00261576,0x0026156D,0x00261564,0x0026155B,0x00261552,0x00261549,0x00261540,0x00261537,0x0026152E,0x00261525, +0x0026151C,0x00261513,0x0026150A,0x001A1417,0x00261501,0x002614F8,0x002614EF,0x80007577,0x81007578,0x82007579, +0x8300757A,0x8400757B,0x8500757C,0x8600757D,0x8700757E,0x8800757F,0x89007580,0x8A007581,0x8B007582,0x8C007583, +0x8D007584,0x8E007585,0x8F007586,0x90007587,0x91007588,0x92007589,0x9300758A,0x9400758B,0x9500758C,0x9600758D, +0x9700758E,0x9800758F,0x99007590,0x9A007591,0x9B007592,0x9C007593,0x9D007594,0x9E007595,0x9F007596,0xA0007597, +0xA1007598,0xA2007599,0xA300759A,0xA400759B,0xA500759C,0xA600759D,0xA700759E,0xA800759F,0xA90075A0,0xAA0075A1, +0xAB0075A2,0xAC0075A3,0xAD0075A4,0xAE0075A5,0xAF0075A6,0xB00075A7,0xB10075A8,0xB20075A9,0xB30075AA,0xB40075AB, +0xB50075AC,0xB60075AD,0xB70075AE,0xB80075AF,0xB90075B0,0xBA0075B1,0xBB0075B2,0xBC0075B3,0xBD0075B4,0xBE0075B5, +0xBF0075B6,0x002614E6,0x002614DD,0x002614D4,0x002614CB,0x002614C2,0x002614B9,0x002614B0,0x002614A7,0x0026149E, +0x00261495,0x0026148C,0x00261483,0x0026147A,0x00261471,0x00261468,0x0026145F,0x00261456,0x0026144D,0x00261444, +0x0026143B,0x00261432,0x00261429,0x00261420,0x00261417,0x001A1324,0x0026140E,0x00261405,0x002613FC,0x002613F3, +0x002613EA,0x002613E1,0x002613D8,0x002613CF,0x002613C6,0x002613BD,0x002613B4,0x002613AB,0x002613A2,0x00261399, +0x00261390,0x00261387,0x0026137E,0x00261375,0x0026136C,0x00261363,0x0026135A,0x00261351,0x00261348,0x0026133F, +0x00261336,0x0026132D,0x00261324,0x001A1231,0x0026131B,0x00261312,0x00261309,0x00261300,0x002612F7,0x002612EE, +0x002612E5,0x002612DC,0x002612D3,0x002612CA,0x002612C1,0x800075F7,0x810075F8,0x820075F9,0x830075FA,0x840075FB, +0x850075FC,0x860075FD,0x870075FE,0x880075FF,0x89007600,0x8A007601,0x8B007602,0x8C007603,0x8D007604,0x8E007605, +0x8F007606,0x90007607,0x91007608,0x92007609,0x9300760A,0x9400760B,0x9500760C,0x9600760D,0x9700760E,0x9800760F, +0x99007610,0x9A007611,0x9B007612,0x9C007613,0x9D007614,0x9E007615,0x9F007616,0xA0007617,0xA1007618,0xA2007619, +0xA300761A,0xA400761B,0xA500761C,0xA600761D,0xA700761E,0xA800761F,0xA9007620,0xAA007621,0xAB007622,0xAC007623, +0xAD007624,0xAE007625,0xAF007626,0xB0007627,0xB1007628,0xB2007629,0xB300762A,0xB400762B,0xB500762C,0xB600762D, +0xB700762E,0xB800762F,0xB9007630,0xBA007631,0xBB007632,0xBC007633,0xBD007634,0xBE007635,0xBF007636,0x002612B8, +0x002612AF,0x002612A6,0x0026129D,0x00261294,0x0026128B,0x00261282,0x00261279,0x00261270,0x00261267,0x0026125E, +0x00261255,0x0026124C,0x00261243,0x0026123A,0x00261231,0x001A113E,0x00261228,0x0026121F,0x00261216,0x0026120D, +0x00261204,0x002611FB,0x002611F2,0x002611E9,0x002611E0,0x002611D7,0x002611CE,0x002611C5,0x002611BC,0x002611B3, +0x002611AA,0x002611A1,0x00261198,0x0026118F,0x00261186,0x0026117D,0x00261174,0x0026116B,0x00261162,0x00261159, +0x00261150,0x00261147,0x0026113E,0x001A104B,0x00261135,0x0026112C,0x00261123,0x0026111A,0x00261111,0x00261108, +0x002610FF,0x002610F6,0x002610ED,0x002610E4,0x002610DB,0x002610D2,0x002610C9,0x002610C0,0x002610B7,0x002610AE, +0x002610A5,0x0026109C,0x00261093,0x80007677,0x81007678,0x82007679,0x8300767A,0x8400767B,0x8500767C,0x8600767D, +0x8700767E,0x8800767F,0x89007680,0x8A007681,0x8B007682,0x8C007683,0x8D007684,0x8E007685,0x8F007686,0x90007687, +0x91007688,0x92007689,0x9300768A,0x9400768B,0x9500768C,0x9600768D,0x9700768E,0x9800768F,0x99007690,0x9A007691, +0x9B007692,0x9C007693,0x9D007694,0x9E007695,0x9F007696,0xA0007697,0xA1007698,0xA2007699,0xA300769A,0xA400769B, +0xA500769C,0xA600769D,0xA700769E,0xA800769F,0xA90076A0,0xAA0076A1,0xAB0076A2,0xAC0076A3,0xAD0076A4,0xAE0076A5, +0xAF0076A6,0xB00076A7,0xB10076A8,0xB20076A9,0xB30076AA,0xB40076AB,0xB50076AC,0xB60076AD,0xB70076AE,0xB80076AF, +0xB90076B0,0xBA0076B1,0xBB0076B2,0xBC0076B3,0xBD0076B4,0xBE0076B5,0xBF0076B6,0x0026108A,0x00261081,0x00261078, +0x0026106F,0x00261066,0x0026105D,0x00261054,0x0026104B,0x001A0F58,0x00261042,0x00261039,0x00261030,0x00261027, +0x0026101E,0x00261015,0x0026100C,0x00261003,0x00260FFA,0x00260FF1,0x00260FE8,0x00260FDF,0x00260FD6,0x00260FCD, +0x00260FC4,0x00260FBB,0x00260FB2,0x00260FA9,0x00260FA0,0x00260F97,0x00260F8E,0x00260F85,0x00260F7C,0x00260F73, +0x00260F6A,0x00260F61,0x00260F58,0x001A0E65,0x00260F4F,0x00260F46,0x00260F3D,0x00260F34,0x00260F2B,0x00260F22, +0x00260F19,0x00260F10,0x00260F07,0x00260EFE,0x00260EF5,0x00260EEC,0x00260EE3,0x00260EDA,0x00260ED1,0x00260EC8, +0x00260EBF,0x00260EB6,0x00260EAD,0x00260EA4,0x00260E9B,0x00260E92,0x00260E89,0x00260E80,0x00260E77,0x00260E6E, +0x00260E65,0x800076F7,0x810076F8,0x820076F9,0x830076FA,0x840076FB,0x850076FC,0x860076FD,0x870076FE,0x880076FF, +0x89007700,0x8A007701,0x8B007702,0x8C007703,0x8D007704,0x8E007705,0x8F007706,0x90007707,0x91007708,0x92007709, +0x9300770A,0x9400770B,0x9500770C,0x9600770D,0x9700770E,0x9800770F,0x99007710,0x9A007711,0x9B007712,0x9C007713, +0x9D007714,0x9E007715,0x9F007716,0xA0007717,0xA1007718,0xA2007719,0xA300771A,0xA400771B,0xA500771C,0xA600771D, +0xA700771E,0xA800771F,0xA9007720,0xAA007721,0xAB007722,0xAC007723,0xAD007724,0xAE007725,0xAF007726,0xB0007727, +0xB1007728,0xB2007729,0xB300772A,0xB400772B,0xB500772C,0xB600772D,0xB700772E,0xB800772F,0xB9007730,0xBA007731, +0xBB007732,0xBC007733,0xBD007734,0xBE007735,0xBF007736,0x001A0D72,0x00260E5C,0x00260E53,0x00260E4A,0x00260E41, +0x00260E38,0x00260E2F,0x00260E26,0x00260E1D,0x00260E14,0x00260E0B,0x00260E02,0x00260DF9,0x00260DF0,0x00260DE7, +0x00260DDE,0x00260DD5,0x00260DCC,0x00260DC3,0x00260DBA,0x00260DB1,0x00260DA8,0x00260D9F,0x00260D96,0x00260D8D, +0x00260D84,0x00260D7B,0x00260D72,0x001A0C7F,0x00260D69,0x00260D60,0x00260D57,0x00260D4E,0x00260D45,0x00260D3C, +0x00260D33,0x00260D2A,0x00260D21,0x00260D18,0x00260D0F,0x00260D06,0x00260CFD,0x00260CF4,0x00260CEB,0x00260CE2, +0x00260CD9,0x00260CD0,0x00260CC7,0x00260CBE,0x00260CB5,0x00260CAC,0x00260CA3,0x00260C9A,0x00260C91,0x00260C88, +0x00260C7F,0x001A0B8C,0x00260C76,0x00260C6D,0x00260C64,0x00260C5B,0x00260C52,0x00260C49,0x00260C40,0x80007777, +0x81007778,0x82007779,0x8300777A,0x8400777B,0x8500777C,0x8600777D,0x8700777E,0x8800777F,0x89007780,0x8A007781, +0x8B007782,0x8C007783,0x8D007784,0x8E007785,0x8F007786,0x90007787,0x91007788,0x92007789,0x9300778A,0x9400778B, +0x9500778C,0x9600778D,0x9700778E,0x9800778F,0x99007790,0x9A007791,0x9B007792,0x9C007793,0x9D007794,0x9E007795, +0x9F007796,0xA0007797,0xA1007798,0xA2007799,0xA300779A,0xA400779B,0xA500779C,0xA600779D,0xA700779E,0xA800779F, +0xA90077A0,0xAA0077A1,0xAB0077A2,0xAC0077A3,0xAD0077A4,0xAE0077A5,0xAF0077A6,0xB00077A7,0xB10077A8,0xB20077A9, +0xB30077AA,0xB40077AB,0xB50077AC,0xB60077AD,0xB70077AE,0xB80077AF,0xB90077B0,0xBA0077B1,0xBB0077B2,0xBC0077B3, +0xBD0077B4,0xBE0077B5,0xBF0077B6,0x00260C37,0x00260C2E,0x00260C25,0x00260C1C,0x00260C13,0x00260C0A,0x00260C01, +0x00260BF8,0x00260BEF,0x00260BE6,0x00260BDD,0x00260BD4,0x00260BCB,0x00260BC2,0x00260BB9,0x00260BB0,0x00260BA7, +0x00260B9E,0x00260B95,0x00260B8C,0x001A0A99,0x00260B83,0x00260B7A,0x00260B71,0x00260B68,0x00260B5F,0x00260B56, +0x00260B4D,0x00260B44,0x00260B3B,0x00260B32,0x00260B29,0x00260B20,0x00260B17,0x00260B0E,0x00260B05,0x00260AFC, +0x00260AF3,0x00260AEA,0x00260AE1,0x00260AD8,0x00260ACF,0x00260AC6,0x00260ABD,0x00260AB4,0x00260AAB,0x00260AA2, +0x00260A99,0x001A09A6,0x00260A90,0x00260A87,0x00260A7E,0x00260A75,0x00260A6C,0x00260A63,0x00260A5A,0x00260A51, +0x00260A48,0x00260A3F,0x00260A36,0x00260A2D,0x00260A24,0x00260A1B,0x00260A12,0x800077B7,0x81007837,0x820078B7, +0x83007937,0x840079B7,0x85007A37,0x86007AB7,0x87007B37,0x88007BB7,0x89007C37,0x8A007CB7,0x8B007D37,0x8C007DB7, +0x8D007E37,0x8E007EB7,0x8F007F37,0x90007FB7,0x91008037,0x920080B7,0x93008137,0x940081B7,0x95008237,0x960082B7, +0x97008337,0x980083B7,0x99008437,0x9A0084B7,0x9B008537,0x9C0085B7,0x9D008637,0x9E0086B7,0x9F008737,0xA00087B7, +0xA1008837,0xA20088B7,0xA3008937,0xA40089B7,0xA5008A37,0xA6008AB7,0xA7008B37,0xA8008BB7,0xA9008C37,0xAA008CB7, +0xAB008D37,0xAC008DB7,0xAD008E37,0xAE008EB7,0xAF008F37,0xB0008FB7,0xB1009037,0xB20090B7,0xB3009137,0xB40091B7, +0xB5009237,0xB60092B7,0xB7009337,0xB80093B7,0xB9009437,0xBA0094B7,0xBB009537,0xBC0095B7,0xBD009637,0xBE0096B7, +0xBF009737,0x00260A09,0x00260A00,0x002609F7,0x002609EE,0x002609E5,0x002609DC,0x002609D3,0x002609CA,0x002609C1, +0x002609B8,0x002609AF,0x002609A6,0x001A08B3,0x0026099D,0x00260994,0x0026098B,0x00260982,0x00260979,0x00260970, +0x00260967,0x0026095E,0x00260955,0x0026094C,0x00260943,0x0026093A,0x00260931,0x00260928,0x0026091F,0x00260916, +0x0026090D,0x00260904,0x002608FB,0x002608F2,0x002608E9,0x002608E0,0x002608D7,0x002608CE,0x002608C5,0x002608BC, +0x002608B3,0x001A07C0,0x002608AA,0x002608A1,0x00260898,0x0026088F,0x00260886,0x0026087D,0x00260874,0x0026086B, +0x00260862,0x00260859,0x00260850,0x00260847,0x0026083E,0x00260835,0x0026082C,0x00260823,0x0026081A,0x00260811, +0x00260808,0x002607FF,0x002607F6,0x002607ED,0x002607E4,0x800077F7,0x810077F8,0x820077F9,0x830077FA,0x840077FB, +0x850077FC,0x860077FD,0x870077FE,0x880077FF,0x89007800,0x8A007801,0x8B007802,0x8C007803,0x8D007804,0x8E007805, +0x8F007806,0x90007807,0x91007808,0x92007809,0x9300780A,0x9400780B,0x9500780C,0x9600780D,0x9700780E,0x9800780F, +0x99007810,0x9A007811,0x9B007812,0x9C007813,0x9D007814,0x9E007815,0x9F007816,0xA0007817,0xA1007818,0xA2007819, +0xA300781A,0xA400781B,0xA500781C,0xA600781D,0xA700781E,0xA800781F,0xA9007820,0xAA007821,0xAB007822,0xAC007823, +0xAD007824,0xAE007825,0xAF007826,0xB0007827,0xB1007828,0xB2007829,0xB300782A,0xB400782B,0xB500782C,0xB600782D, +0xB700782E,0xB800782F,0xB9007830,0xBA007831,0xBB007832,0xBC007833,0xBD007834,0xBE007835,0xBF007836,0x002607DB, +0x002607D2,0x002607C9,0x002607C0,0x001A06CD,0x002607B7,0x002607AE,0x002607A5,0x0026079C,0x00260793,0x0026078A, +0x00260781,0x00260778,0x0026076F,0x00260766,0x0026075D,0x00260754,0x0026074B,0x00260742,0x00260739,0x00260730, +0x00260727,0x0026071E,0x00260715,0x0026070C,0x00260703,0x002606FA,0x002606F1,0x002606E8,0x002606DF,0x002606D6, +0x002606CD,0x001A05DA,0x002606C4,0x002606BB,0x002606B2,0x002606A9,0x002606A0,0x00260697,0x0026068E,0x00260685, +0x0026067C,0x00260673,0x0026066A,0x00260661,0x00260658,0x0026064F,0x00260646,0x0026063D,0x00260634,0x0026062B, +0x00260622,0x00260619,0x00260610,0x00260607,0x002605FE,0x002605F5,0x002605EC,0x002605E3,0x002605DA,0x001A04E7, +0x002605D1,0x002605C8,0x002605BF,0x80007877,0x81007878,0x82007879,0x8300787A,0x8400787B,0x8500787C,0x8600787D, +0x8700787E,0x8800787F,0x89007880,0x8A007881,0x8B007882,0x8C007883,0x8D007884,0x8E007885,0x8F007886,0x90007887, +0x91007888,0x92007889,0x9300788A,0x9400788B,0x9500788C,0x9600788D,0x9700788E,0x9800788F,0x99007890,0x9A007891, +0x9B007892,0x9C007893,0x9D007894,0x9E007895,0x9F007896,0xA0007897,0xA1007898,0xA2007899,0xA300789A,0xA400789B, +0xA500789C,0xA600789D,0xA700789E,0xA800789F,0xA90078A0,0xAA0078A1,0xAB0078A2,0xAC0078A3,0xAD0078A4,0xAE0078A5, +0xAF0078A6,0xB00078A7,0xB10078A8,0xB20078A9,0xB30078AA,0xB40078AB,0xB50078AC,0xB60078AD,0xB70078AE,0xB80078AF, +0xB90078B0,0xBA0078B1,0xBB0078B2,0xBC0078B3,0xBD0078B4,0xBE0078B5,0xBF0078B6,0x002605B6,0x002605AD,0x002605A4, +0x0026059B,0x00260592,0x00260589,0x00260580,0x00260577,0x0026056E,0x00260565,0x0026055C,0x00260553,0x0026054A, +0x00260541,0x00260538,0x0026052F,0x00260526,0x0026051D,0x00260514,0x0026050B,0x00260502,0x002604F9,0x002604F0, +0x002604E7,0x001A03F4,0x002604DE,0x002604D5,0x002604CC,0x002604C3,0x002604BA,0x002604B1,0x002604A8,0x0026049F, +0x00260496,0x0026048D,0x00260484,0x0026047B,0x00260472,0x00260469,0x00260460,0x00260457,0x0026044E,0x00260445, +0x0026043C,0x00260433,0x0026042A,0x00260421,0x00260418,0x0026040F,0x00260406,0x002603FD,0x002603F4,0x001A0301, +0x002603EB,0x002603E2,0x002603D9,0x002603D0,0x002603C7,0x002603BE,0x002603B5,0x002603AC,0x002603A3,0x0026039A, +0x00260391,0x800078F7,0x810078F8,0x820078F9,0x830078FA,0x840078FB,0x850078FC,0x860078FD,0x870078FE,0x880078FF, +0x89007900,0x8A007901,0x8B007902,0x8C007903,0x8D007904,0x8E007905,0x8F007906,0x90007907,0x91007908,0x92007909, +0x9300790A,0x9400790B,0x9500790C,0x9600790D,0x9700790E,0x9800790F,0x99007910,0x9A007911,0x9B007912,0x9C007913, +0x9D007914,0x9E007915,0x9F007916,0xA0007917,0xA1007918,0xA2007919,0xA300791A,0xA400791B,0xA500791C,0xA600791D, +0xA700791E,0xA800791F,0xA9007920,0xAA007921,0xAB007922,0xAC007923,0xAD007924,0xAE007925,0xAF007926,0xB0007927, +0xB1007928,0xB2007929,0xB300792A,0xB400792B,0xB500792C,0xB600792D,0xB700792E,0xB800792F,0xB9007930,0xBA007931, +0xBB007932,0xBC007933,0xBD007934,0xBE007935,0xBF007936,0x00260388,0x0026037F,0x00260376,0x0026036D,0x00260364, +0x0026035B,0x00260352,0x00260349,0x00260340,0x00260337,0x0026032E,0x00260325,0x0026031C,0x00260313,0x0026030A, +0x00260301,0x001A020E,0x002602F8,0x002602EF,0x002602E6,0x002602DD,0x002602D4,0x002602CB,0x002602C2,0x002602B9, +0x002602B0,0x002602A7,0x0026029E,0x00260295,0x0026028C,0x00260283,0x0026027A,0x00260271,0x00260268,0x0026025F, +0x00260256,0x0026024D,0x00260244,0x0026023B,0x00260232,0x00260229,0x00260220,0x00260217,0x0026020E,0x001A011B, +0x00260205,0x002601FC,0x002601F3,0x002601EA,0x002601E1,0x002601D8,0x002601CF,0x002601C6,0x002601BD,0x002601B4, +0x002601AB,0x002601A2,0x00260199,0x00260190,0x00260187,0x0026017E,0x00260175,0x0026016C,0x00260163,0x80007977, +0x81007978,0x82007979,0x8300797A,0x8400797B,0x8500797C,0x8600797D,0x8700797E,0x8800797F,0x89007980,0x8A007981, +0x8B007982,0x8C007983,0x8D007984,0x8E007985,0x8F007986,0x90007987,0x91007988,0x92007989,0x9300798A,0x9400798B, +0x9500798C,0x9600798D,0x9700798E,0x9800798F,0x99007990,0x9A007991,0x9B007992,0x9C007993,0x9D007994,0x9E007995, +0x9F007996,0xA0007997,0xA1007998,0xA2007999,0xA300799A,0xA400799B,0xA500799C,0xA600799D,0xA700799E,0xA800799F, +0xA90079A0,0xAA0079A1,0xAB0079A2,0xAC0079A3,0xAD0079A4,0xAE0079A5,0xAF0079A6,0xB00079A7,0xB10079A8,0xB20079A9, +0xB30079AA,0xB40079AB,0xB50079AC,0xB60079AD,0xB70079AE,0xB80079AF,0xB90079B0,0xBA0079B1,0xBB0079B2,0xBC0079B3, +0xBD0079B4,0xBE0079B5,0xBF0079B6,0x0026015A,0x00260151,0x00260148,0x0026013F,0x00260136,0x0026012D,0x00260124, +0x0026011B,0x001A0028,0x00260112,0x00260109,0x00260100,0x002600F7,0x002600EE,0x002600E5,0x002600DC,0x002600D3, +0x002600CA,0x002600C1,0x002600B8,0x002600AF,0x002600A6,0x0026009D,0x00260094,0x0026008B,0x00260082,0x00260079, +0x00260070,0x00260067,0x0026005E,0x00260055,0x0026004C,0x00260043,0x0026003A,0x00260031,0x00260028,0x0019FF35, +0x0026001F,0x00260016,0x0026000D,0x00260004,0x0025FFFB,0x0025FFF2,0x0025FFE9,0x0025FFE0,0x0025FFD7,0x0025FFCE, +0x0025FFC5,0x0025FFBC,0x0025FFB3,0x0025FFAA,0x0025FFA1,0x0025FF98,0x0025FF8F,0x0025FF86,0x0025FF7D,0x0025FF74, +0x0025FF6B,0x0025FF62,0x0025FF59,0x0025FF50,0x0025FF47,0x0025FF3E,0x0025FF35,0x800079F7,0x810079F8,0x820079F9, +0x830079FA,0x840079FB,0x850079FC,0x860079FD,0x870079FE,0x880079FF,0x89007A00,0x8A007A01,0x8B007A02,0x8C007A03, +0x8D007A04,0x8E007A05,0x8F007A06,0x90007A07,0x91007A08,0x92007A09,0x93007A0A,0x94007A0B,0x95007A0C,0x96007A0D, +0x97007A0E,0x98007A0F,0x99007A10,0x9A007A11,0x9B007A12,0x9C007A13,0x9D007A14,0x9E007A15,0x9F007A16,0xA0007A17, +0xA1007A18,0xA2007A19,0xA3007A1A,0xA4007A1B,0xA5007A1C,0xA6007A1D,0xA7007A1E,0xA8007A1F,0xA9007A20,0xAA007A21, +0xAB007A22,0xAC007A23,0xAD007A24,0xAE007A25,0xAF007A26,0xB0007A27,0xB1007A28,0xB2007A29,0xB3007A2A,0xB4007A2B, +0xB5007A2C,0xB6007A2D,0xB7007A2E,0xB8007A2F,0xB9007A30,0xBA007A31,0xBB007A32,0xBC007A33,0xBD007A34,0xBE007A35, +0xBF007A36,0x0019FE42,0x0025FF2C,0x0025FF23,0x0025FF1A,0x0025FF11,0x0025FF08,0x0025FEFF,0x0025FEF6,0x0025FEED, +0x0025FEE4,0x0025FEDB,0x0025FED2,0x0025FEC9,0x0025FEC0,0x0025FEB7,0x0025FEAE,0x0025FEA5,0x0025FE9C,0x0025FE93, +0x0025FE8A,0x0025FE81,0x0025FE78,0x0025FE6F,0x0025FE66,0x0025FE5D,0x0025FE54,0x0025FE4B,0x0025FE42,0x0019FD4F, +0x0025FE39,0x0025FE30,0x0025FE27,0x0025FE1E,0x0025FE15,0x0025FE0C,0x0025FE03,0x0025FDFA,0x0025FDF1,0x0025FDE8, +0x0025FDDF,0x0025FDD6,0x0025FDCD,0x0025FDC4,0x0025FDBB,0x0025FDB2,0x0025FDA9,0x0025FDA0,0x0025FD97,0x0025FD8E, +0x0025FD85,0x0025FD7C,0x0025FD73,0x0025FD6A,0x0025FD61,0x0025FD58,0x0025FD4F,0x0019FC5C,0x0025FD46,0x0025FD3D, +0x0025FD34,0x0025FD2B,0x0025FD22,0x0025FD19,0x0025FD10,0x80007A77,0x81007A78,0x82007A79,0x83007A7A,0x84007A7B, +0x85007A7C,0x86007A7D,0x87007A7E,0x88007A7F,0x89007A80,0x8A007A81,0x8B007A82,0x8C007A83,0x8D007A84,0x8E007A85, +0x8F007A86,0x90007A87,0x91007A88,0x92007A89,0x93007A8A,0x94007A8B,0x95007A8C,0x96007A8D,0x97007A8E,0x98007A8F, +0x99007A90,0x9A007A91,0x9B007A92,0x9C007A93,0x9D007A94,0x9E007A95,0x9F007A96,0xA0007A97,0xA1007A98,0xA2007A99, +0xA3007A9A,0xA4007A9B,0xA5007A9C,0xA6007A9D,0xA7007A9E,0xA8007A9F,0xA9007AA0,0xAA007AA1,0xAB007AA2,0xAC007AA3, +0xAD007AA4,0xAE007AA5,0xAF007AA6,0xB0007AA7,0xB1007AA8,0xB2007AA9,0xB3007AAA,0xB4007AAB,0xB5007AAC,0xB6007AAD, +0xB7007AAE,0xB8007AAF,0xB9007AB0,0xBA007AB1,0xBB007AB2,0xBC007AB3,0xBD007AB4,0xBE007AB5,0xBF007AB6,0x0025FD07, +0x0025FCFE,0x0025FCF5,0x0025FCEC,0x0025FCE3,0x0025FCDA,0x0025FCD1,0x0025FCC8,0x0025FCBF,0x0025FCB6,0x0025FCAD, +0x0025FCA4,0x0025FC9B,0x0025FC92,0x0025FC89,0x0025FC80,0x0025FC77,0x0025FC6E,0x0025FC65,0x0025FC5C,0x0019FB69, +0x0025FC53,0x0025FC4A,0x0025FC41,0x0025FC38,0x0025FC2F,0x0025FC26,0x0025FC1D,0x0025FC14,0x0025FC0B,0x0025FC02, +0x0025FBF9,0x0025FBF0,0x0025FBE7,0x0025FBDE,0x0025FBD5,0x0025FBCC,0x0025FBC3,0x0025FBBA,0x0025FBB1,0x0025FBA8, +0x0025FB9F,0x0025FB96,0x0025FB8D,0x0025FB84,0x0025FB7B,0x0025FB72,0x0025FB69,0x0019FA76,0x0025FB60,0x0025FB57, +0x0025FB4E,0x0025FB45,0x0025FB3C,0x0025FB33,0x0025FB2A,0x0025FB21,0x0025FB18,0x0025FB0F,0x0025FB06,0x0025FAFD, +0x0025FAF4,0x0025FAEB,0x0025FAE2,0x80007AF7,0x81007AF8,0x82007AF9,0x83007AFA,0x84007AFB,0x85007AFC,0x86007AFD, +0x87007AFE,0x88007AFF,0x89007B00,0x8A007B01,0x8B007B02,0x8C007B03,0x8D007B04,0x8E007B05,0x8F007B06,0x90007B07, +0x91007B08,0x92007B09,0x93007B0A,0x94007B0B,0x95007B0C,0x96007B0D,0x97007B0E,0x98007B0F,0x99007B10,0x9A007B11, +0x9B007B12,0x9C007B13,0x9D007B14,0x9E007B15,0x9F007B16,0xA0007B17,0xA1007B18,0xA2007B19,0xA3007B1A,0xA4007B1B, +0xA5007B1C,0xA6007B1D,0xA7007B1E,0xA8007B1F,0xA9007B20,0xAA007B21,0xAB007B22,0xAC007B23,0xAD007B24,0xAE007B25, +0xAF007B26,0xB0007B27,0xB1007B28,0xB2007B29,0xB3007B2A,0xB4007B2B,0xB5007B2C,0xB6007B2D,0xB7007B2E,0xB8007B2F, +0xB9007B30,0xBA007B31,0xBB007B32,0xBC007B33,0xBD007B34,0xBE007B35,0xBF007B36,0x0025FAD9,0x0025FAD0,0x0025FAC7, +0x0025FABE,0x0025FAB5,0x0025FAAC,0x0025FAA3,0x0025FA9A,0x0025FA91,0x0025FA88,0x0025FA7F,0x0025FA76,0x0019F983, +0x0025FA6D,0x0025FA64,0x0025FA5B,0x0025FA52,0x0025FA49,0x0025FA40,0x0025FA37,0x0025FA2E,0x0025FA25,0x0025FA1C, +0x0025FA13,0x0025FA0A,0x0025FA01,0x0025F9F8,0x0025F9EF,0x0025F9E6,0x0025F9DD,0x0025F9D4,0x0025F9CB,0x0025F9C2, +0x0025F9B9,0x0025F9B0,0x0025F9A7,0x0025F99E,0x0025F995,0x0025F98C,0x0025F983,0x0019F890,0x0025F97A,0x0025F971, +0x0025F968,0x0025F95F,0x0025F956,0x0025F94D,0x0025F944,0x0025F93B,0x0025F932,0x0025F929,0x0025F920,0x0025F917, +0x0025F90E,0x0025F905,0x0025F8FC,0x0025F8F3,0x0025F8EA,0x0025F8E1,0x0025F8D8,0x0025F8CF,0x0025F8C6,0x0025F8BD, +0x0025F8B4,0x80007B77,0x81007B78,0x82007B79,0x83007B7A,0x84007B7B,0x85007B7C,0x86007B7D,0x87007B7E,0x88007B7F, +0x89007B80,0x8A007B81,0x8B007B82,0x8C007B83,0x8D007B84,0x8E007B85,0x8F007B86,0x90007B87,0x91007B88,0x92007B89, +0x93007B8A,0x94007B8B,0x95007B8C,0x96007B8D,0x97007B8E,0x98007B8F,0x99007B90,0x9A007B91,0x9B007B92,0x9C007B93, +0x9D007B94,0x9E007B95,0x9F007B96,0xA0007B97,0xA1007B98,0xA2007B99,0xA3007B9A,0xA4007B9B,0xA5007B9C,0xA6007B9D, +0xA7007B9E,0xA8007B9F,0xA9007BA0,0xAA007BA1,0xAB007BA2,0xAC007BA3,0xAD007BA4,0xAE007BA5,0xAF007BA6,0xB0007BA7, +0xB1007BA8,0xB2007BA9,0xB3007BAA,0xB4007BAB,0xB5007BAC,0xB6007BAD,0xB7007BAE,0xB8007BAF,0xB9007BB0,0xBA007BB1, +0xBB007BB2,0xBC007BB3,0xBD007BB4,0xBE007BB5,0xBF007BB6,0x0025F8AB,0x0025F8A2,0x0025F899,0x0025F890,0x0019F79D, +0x0025F887,0x0025F87E,0x0025F875,0x0025F86C,0x0025F863,0x0025F85A,0x0025F851,0x0025F848,0x0025F83F,0x0025F836, +0x0025F82D,0x0025F824,0x0025F81B,0x0025F812,0x0025F809,0x0025F800,0x0025F7F7,0x0025F7EE,0x0025F7E5,0x0025F7DC, +0x0025F7D3,0x0025F7CA,0x0025F7C1,0x0025F7B8,0x0025F7AF,0x0025F7A6,0x0025F79D,0x0019F6AA,0x0025F794,0x0025F78B, +0x0025F782,0x0025F779,0x0025F770,0x0025F767,0x0025F75E,0x0025F755,0x0025F74C,0x0025F743,0x0025F73A,0x0025F731, +0x0025F728,0x0025F71F,0x0025F716,0x0025F70D,0x0025F704,0x0025F6FB,0x0025F6F2,0x0025F6E9,0x0025F6E0,0x0025F6D7, +0x0025F6CE,0x0025F6C5,0x0025F6BC,0x0025F6B3,0x0025F6AA,0x0019F5B7,0x0025F6A1,0x0025F698,0x0025F68F,0x80007BF7, +0x81007BF8,0x82007BF9,0x83007BFA,0x84007BFB,0x85007BFC,0x86007BFD,0x87007BFE,0x88007BFF,0x89007C00,0x8A007C01, +0x8B007C02,0x8C007C03,0x8D007C04,0x8E007C05,0x8F007C06,0x90007C07,0x91007C08,0x92007C09,0x93007C0A,0x94007C0B, +0x95007C0C,0x96007C0D,0x97007C0E,0x98007C0F,0x99007C10,0x9A007C11,0x9B007C12,0x9C007C13,0x9D007C14,0x9E007C15, +0x9F007C16,0xA0007C17,0xA1007C18,0xA2007C19,0xA3007C1A,0xA4007C1B,0xA5007C1C,0xA6007C1D,0xA7007C1E,0xA8007C1F, +0xA9007C20,0xAA007C21,0xAB007C22,0xAC007C23,0xAD007C24,0xAE007C25,0xAF007C26,0xB0007C27,0xB1007C28,0xB2007C29, +0xB3007C2A,0xB4007C2B,0xB5007C2C,0xB6007C2D,0xB7007C2E,0xB8007C2F,0xB9007C30,0xBA007C31,0xBB007C32,0xBC007C33, +0xBD007C34,0xBE007C35,0xBF007C36,0x0025F686,0x0025F67D,0x0025F674,0x0025F66B,0x0025F662,0x0025F659,0x0025F650, +0x0025F647,0x0025F63E,0x0025F635,0x0025F62C,0x0025F623,0x0025F61A,0x0025F611,0x0025F608,0x0025F5FF,0x0025F5F6, +0x0025F5ED,0x0025F5E4,0x0025F5DB,0x0025F5D2,0x0025F5C9,0x0025F5C0,0x0025F5B7,0x0019F4C4,0x0025F5AE,0x0025F5A5, +0x0025F59C,0x0025F593,0x0025F58A,0x0025F581,0x0025F578,0x0025F56F,0x0025F566,0x0025F55D,0x0025F554,0x0025F54B, +0x0025F542,0x0025F539,0x0025F530,0x0025F527,0x0025F51E,0x0025F515,0x0025F50C,0x0025F503,0x0025F4FA,0x0025F4F1, +0x0025F4E8,0x0025F4DF,0x0025F4D6,0x0025F4CD,0x0025F4C4,0x0019F3D1,0x0025F4BB,0x0025F4B2,0x0025F4A9,0x0025F4A0, +0x0025F497,0x0025F48E,0x0025F485,0x0025F47C,0x0025F473,0x0025F46A,0x0025F461,0x80007C77,0x81007C78,0x82007C79, +0x83007C7A,0x84007C7B,0x85007C7C,0x86007C7D,0x87007C7E,0x88007C7F,0x89007C80,0x8A007C81,0x8B007C82,0x8C007C83, +0x8D007C84,0x8E007C85,0x8F007C86,0x90007C87,0x91007C88,0x92007C89,0x93007C8A,0x94007C8B,0x95007C8C,0x96007C8D, +0x97007C8E,0x98007C8F,0x99007C90,0x9A007C91,0x9B007C92,0x9C007C93,0x9D007C94,0x9E007C95,0x9F007C96,0xA0007C97, +0xA1007C98,0xA2007C99,0xA3007C9A,0xA4007C9B,0xA5007C9C,0xA6007C9D,0xA7007C9E,0xA8007C9F,0xA9007CA0,0xAA007CA1, +0xAB007CA2,0xAC007CA3,0xAD007CA4,0xAE007CA5,0xAF007CA6,0xB0007CA7,0xB1007CA8,0xB2007CA9,0xB3007CAA,0xB4007CAB, +0xB5007CAC,0xB6007CAD,0xB7007CAE,0xB8007CAF,0xB9007CB0,0xBA007CB1,0xBB007CB2,0xBC007CB3,0xBD007CB4,0xBE007CB5, +0xBF007CB6,0x0025F458,0x0025F44F,0x0025F446,0x0025F43D,0x0025F434,0x0025F42B,0x0025F422,0x0025F419,0x0025F410, +0x0025F407,0x0025F3FE,0x0025F3F5,0x0025F3EC,0x0025F3E3,0x0025F3DA,0x0025F3D1,0x0019F2DE,0x0025F3C8,0x0025F3BF, +0x0025F3B6,0x0025F3AD,0x0025F3A4,0x0025F39B,0x0025F392,0x0025F389,0x0025F380,0x0025F377,0x0025F36E,0x0025F365, +0x0025F35C,0x0025F353,0x0025F34A,0x0025F341,0x0025F338,0x0025F32F,0x0025F326,0x0025F31D,0x0025F314,0x0025F30B, +0x0025F302,0x0025F2F9,0x0025F2F0,0x0025F2E7,0x0025F2DE,0x0019F1EB,0x0025F2D5,0x0025F2CC,0x0025F2C3,0x0025F2BA, +0x0025F2B1,0x0025F2A8,0x0025F29F,0x0025F296,0x0025F28D,0x0025F284,0x0025F27B,0x0025F272,0x0025F269,0x0025F260, +0x0025F257,0x0025F24E,0x0025F245,0x0025F23C,0x0025F233,0x80007CF7,0x81007CF8,0x82007CF9,0x83007CFA,0x84007CFB, +0x85007CFC,0x86007CFD,0x87007CFE,0x88007CFF,0x89007D00,0x8A007D01,0x8B007D02,0x8C007D03,0x8D007D04,0x8E007D05, +0x8F007D06,0x90007D07,0x91007D08,0x92007D09,0x93007D0A,0x94007D0B,0x95007D0C,0x96007D0D,0x97007D0E,0x98007D0F, +0x99007D10,0x9A007D11,0x9B007D12,0x9C007D13,0x9D007D14,0x9E007D15,0x9F007D16,0xA0007D17,0xA1007D18,0xA2007D19, +0xA3007D1A,0xA4007D1B,0xA5007D1C,0xA6007D1D,0xA7007D1E,0xA8007D1F,0xA9007D20,0xAA007D21,0xAB007D22,0xAC007D23, +0xAD007D24,0xAE007D25,0xAF007D26,0xB0007D27,0xB1007D28,0xB2007D29,0xB3007D2A,0xB4007D2B,0xB5007D2C,0xB6007D2D, +0xB7007D2E,0xB8007D2F,0xB9007D30,0xBA007D31,0xBB007D32,0xBC007D33,0xBD007D34,0xBE007D35,0xBF007D36,0x0025F22A, +0x0025F221,0x0025F218,0x0025F20F,0x0025F206,0x0025F1FD,0x0025F1F4,0x0025F1EB,0x0019F0F8,0x0025F1E2,0x0025F1D9, +0x0025F1D0,0x0025F1C7,0x0025F1BE,0x0025F1B5,0x0025F1AC,0x0025F1A3,0x0025F19A,0x0025F191,0x0025F188,0x0025F17F, +0x0025F176,0x0025F16D,0x0025F164,0x0025F15B,0x0025F152,0x0025F149,0x0025F140,0x0025F137,0x0025F12E,0x0025F125, +0x0025F11C,0x0025F113,0x0025F10A,0x0025F101,0x0025F0F8,0x0019F005,0x0025F0EF,0x0025F0E6,0x0025F0DD,0x0025F0D4, +0x0025F0CB,0x0025F0C2,0x0025F0B9,0x0025F0B0,0x0025F0A7,0x0025F09E,0x0025F095,0x0025F08C,0x0025F083,0x0025F07A, +0x0025F071,0x0025F068,0x0025F05F,0x0025F056,0x0025F04D,0x0025F044,0x0025F03B,0x0025F032,0x0025F029,0x0025F020, +0x0025F017,0x0025F00E,0x0025F005,0x80007D77,0x81007D78,0x82007D79,0x83007D7A,0x84007D7B,0x85007D7C,0x86007D7D, +0x87007D7E,0x88007D7F,0x89007D80,0x8A007D81,0x8B007D82,0x8C007D83,0x8D007D84,0x8E007D85,0x8F007D86,0x90007D87, +0x91007D88,0x92007D89,0x93007D8A,0x94007D8B,0x95007D8C,0x96007D8D,0x97007D8E,0x98007D8F,0x99007D90,0x9A007D91, +0x9B007D92,0x9C007D93,0x9D007D94,0x9E007D95,0x9F007D96,0xA0007D97,0xA1007D98,0xA2007D99,0xA3007D9A,0xA4007D9B, +0xA5007D9C,0xA6007D9D,0xA7007D9E,0xA8007D9F,0xA9007DA0,0xAA007DA1,0xAB007DA2,0xAC007DA3,0xAD007DA4,0xAE007DA5, +0xAF007DA6,0xB0007DA7,0xB1007DA8,0xB2007DA9,0xB3007DAA,0xB4007DAB,0xB5007DAC,0xB6007DAD,0xB7007DAE,0xB8007DAF, +0xB9007DB0,0xBA007DB1,0xBB007DB2,0xBC007DB3,0xBD007DB4,0xBE007DB5,0xBF007DB6,0x0019EF12,0x0025EFFC,0x0025EFF3, +0x0025EFEA,0x0025EFE1,0x0025EFD8,0x0025EFCF,0x0025EFC6,0x0025EFBD,0x0025EFB4,0x0025EFAB,0x0025EFA2,0x0025EF99, +0x0025EF90,0x0025EF87,0x0025EF7E,0x0025EF75,0x0025EF6C,0x0025EF63,0x0025EF5A,0x0025EF51,0x0025EF48,0x0025EF3F, +0x0025EF36,0x0025EF2D,0x0025EF24,0x0025EF1B,0x0025EF12,0x0019EE1F,0x0025EF09,0x0025EF00,0x0025EEF7,0x0025EEEE, +0x0025EEE5,0x0025EEDC,0x0025EED3,0x0025EECA,0x0025EEC1,0x0025EEB8,0x0025EEAF,0x0025EEA6,0x0025EE9D,0x0025EE94, +0x0025EE8B,0x0025EE82,0x0025EE79,0x0025EE70,0x0025EE67,0x0025EE5E,0x0025EE55,0x0025EE4C,0x0025EE43,0x0025EE3A, +0x0025EE31,0x0025EE28,0x0025EE1F,0x0019ED2C,0x0025EE16,0x0025EE0D,0x0025EE04,0x0025EDFB,0x0025EDF2,0x0025EDE9, +0x0025EDE0,0x80007DF7,0x81007DF8,0x82007DF9,0x83007DFA,0x84007DFB,0x85007DFC,0x86007DFD,0x87007DFE,0x88007DFF, +0x89007E00,0x8A007E01,0x8B007E02,0x8C007E03,0x8D007E04,0x8E007E05,0x8F007E06,0x90007E07,0x91007E08,0x92007E09, +0x93007E0A,0x94007E0B,0x95007E0C,0x96007E0D,0x97007E0E,0x98007E0F,0x99007E10,0x9A007E11,0x9B007E12,0x9C007E13, +0x9D007E14,0x9E007E15,0x9F007E16,0xA0007E17,0xA1007E18,0xA2007E19,0xA3007E1A,0xA4007E1B,0xA5007E1C,0xA6007E1D, +0xA7007E1E,0xA8007E1F,0xA9007E20,0xAA007E21,0xAB007E22,0xAC007E23,0xAD007E24,0xAE007E25,0xAF007E26,0xB0007E27, +0xB1007E28,0xB2007E29,0xB3007E2A,0xB4007E2B,0xB5007E2C,0xB6007E2D,0xB7007E2E,0xB8007E2F,0xB9007E30,0xBA007E31, +0xBB007E32,0xBC007E33,0xBD007E34,0xBE007E35,0xBF007E36,0x0025EDD7,0x0025EDCE,0x0025EDC5,0x0025EDBC,0x0025EDB3, +0x0025EDAA,0x0025EDA1,0x0025ED98,0x0025ED8F,0x0025ED86,0x0025ED7D,0x0025ED74,0x0025ED6B,0x0025ED62,0x0025ED59, +0x0025ED50,0x0025ED47,0x0025ED3E,0x0025ED35,0x0025ED2C,0x0019EC39,0x0025ED23,0x0025ED1A,0x0025ED11,0x0025ED08, +0x0025ECFF,0x0025ECF6,0x0025ECED,0x0025ECE4,0x0025ECDB,0x0025ECD2,0x0025ECC9,0x0025ECC0,0x0025ECB7,0x0025ECAE, +0x0025ECA5,0x0025EC9C,0x0025EC93,0x0025EC8A,0x0025EC81,0x0025EC78,0x0025EC6F,0x0025EC66,0x0025EC5D,0x0025EC54, +0x0025EC4B,0x0025EC42,0x0025EC39,0x0019EB46,0x0025EC30,0x0025EC27,0x0025EC1E,0x0025EC15,0x0025EC0C,0x0025EC03, +0x0025EBFA,0x0025EBF1,0x0025EBE8,0x0025EBDF,0x0025EBD6,0x0025EBCD,0x0025EBC4,0x0025EBBB,0x0025EBB2,0x80007E77, +0x81007E78,0x82007E79,0x83007E7A,0x84007E7B,0x85007E7C,0x86007E7D,0x87007E7E,0x88007E7F,0x89007E80,0x8A007E81, +0x8B007E82,0x8C007E83,0x8D007E84,0x8E007E85,0x8F007E86,0x90007E87,0x91007E88,0x92007E89,0x93007E8A,0x94007E8B, +0x95007E8C,0x96007E8D,0x97007E8E,0x98007E8F,0x99007E90,0x9A007E91,0x9B007E92,0x9C007E93,0x9D007E94,0x9E007E95, +0x9F007E96,0xA0007E97,0xA1007E98,0xA2007E99,0xA3007E9A,0xA4007E9B,0xA5007E9C,0xA6007E9D,0xA7007E9E,0xA8007E9F, +0xA9007EA0,0xAA007EA1,0xAB007EA2,0xAC007EA3,0xAD007EA4,0xAE007EA5,0xAF007EA6,0xB0007EA7,0xB1007EA8,0xB2007EA9, +0xB3007EAA,0xB4007EAB,0xB5007EAC,0xB6007EAD,0xB7007EAE,0xB8007EAF,0xB9007EB0,0xBA007EB1,0xBB007EB2,0xBC007EB3, +0xBD007EB4,0xBE007EB5,0xBF007EB6,0x0025EBA9,0x0025EBA0,0x0025EB97,0x0025EB8E,0x0025EB85,0x0025EB7C,0x0025EB73, +0x0025EB6A,0x0025EB61,0x0025EB58,0x0025EB4F,0x0025EB46,0x0019EA53,0x0025EB3D,0x0025EB34,0x0025EB2B,0x0025EB22, +0x0025EB19,0x0025EB10,0x0025EB07,0x0025EAFE,0x0025EAF5,0x0025EAEC,0x0025EAE3,0x0025EADA,0x0025EAD1,0x0025EAC8, +0x0025EABF,0x0025EAB6,0x0025EAAD,0x0025EAA4,0x0025EA9B,0x0025EA92,0x0025EA89,0x0025EA80,0x0025EA77,0x0025EA6E, +0x0025EA65,0x0025EA5C,0x0025EA53,0x0019E960,0x0025EA4A,0x0025EA41,0x0025EA38,0x0025EA2F,0x0025EA26,0x0025EA1D, +0x0025EA14,0x0025EA0B,0x0025EA02,0x0025E9F9,0x0025E9F0,0x0025E9E7,0x0025E9DE,0x0025E9D5,0x0025E9CC,0x0025E9C3, +0x0025E9BA,0x0025E9B1,0x0025E9A8,0x0025E99F,0x0025E996,0x0025E98D,0x0025E984,0x80007EF7,0x81007EF8,0x82007EF9, +0x83007EFA,0x84007EFB,0x85007EFC,0x86007EFD,0x87007EFE,0x88007EFF,0x89007F00,0x8A007F01,0x8B007F02,0x8C007F03, +0x8D007F04,0x8E007F05,0x8F007F06,0x90007F07,0x91007F08,0x92007F09,0x93007F0A,0x94007F0B,0x95007F0C,0x96007F0D, +0x97007F0E,0x98007F0F,0x99007F10,0x9A007F11,0x9B007F12,0x9C007F13,0x9D007F14,0x9E007F15,0x9F007F16,0xA0007F17, +0xA1007F18,0xA2007F19,0xA3007F1A,0xA4007F1B,0xA5007F1C,0xA6007F1D,0xA7007F1E,0xA8007F1F,0xA9007F20,0xAA007F21, +0xAB007F22,0xAC007F23,0xAD007F24,0xAE007F25,0xAF007F26,0xB0007F27,0xB1007F28,0xB2007F29,0xB3007F2A,0xB4007F2B, +0xB5007F2C,0xB6007F2D,0xB7007F2E,0xB8007F2F,0xB9007F30,0xBA007F31,0xBB007F32,0xBC007F33,0xBD007F34,0xBE007F35, +0xBF007F36,0x0025E97B,0x0025E972,0x0025E969,0x0025E960,0x0019E86D,0x0025E957,0x0025E94E,0x0025E945,0x0025E93C, +0x0025E933,0x0025E92A,0x0025E921,0x0025E918,0x0025E90F,0x0025E906,0x0025E8FD,0x0025E8F4,0x0025E8EB,0x0025E8E2, +0x0025E8D9,0x0025E8D0,0x0025E8C7,0x0025E8BE,0x0025E8B5,0x0025E8AC,0x0025E8A3,0x0025E89A,0x0025E891,0x0025E888, +0x0025E87F,0x0025E876,0x0025E86D,0x0019E77A,0x0025E864,0x0025E85B,0x0025E852,0x0025E849,0x0025E840,0x0025E837, +0x0025E82E,0x0025E825,0x0025E81C,0x0025E813,0x0025E80A,0x0025E801,0x0025E7F8,0x0025E7EF,0x0025E7E6,0x0025E7DD, +0x0025E7D4,0x0025E7CB,0x0025E7C2,0x0025E7B9,0x0025E7B0,0x0025E7A7,0x0025E79E,0x0025E795,0x0025E78C,0x0025E783, +0x0025E77A,0x0019E687,0x0025E771,0x0025E768,0x0025E75F,0x80007F77,0x81007F78,0x82007F79,0x83007F7A,0x84007F7B, +0x85007F7C,0x86007F7D,0x87007F7E,0x88007F7F,0x89007F80,0x8A007F81,0x8B007F82,0x8C007F83,0x8D007F84,0x8E007F85, +0x8F007F86,0x90007F87,0x91007F88,0x92007F89,0x93007F8A,0x94007F8B,0x95007F8C,0x96007F8D,0x97007F8E,0x98007F8F, +0x99007F90,0x9A007F91,0x9B007F92,0x9C007F93,0x9D007F94,0x9E007F95,0x9F007F96,0xA0007F97,0xA1007F98,0xA2007F99, +0xA3007F9A,0xA4007F9B,0xA5007F9C,0xA6007F9D,0xA7007F9E,0xA8007F9F,0xA9007FA0,0xAA007FA1,0xAB007FA2,0xAC007FA3, +0xAD007FA4,0xAE007FA5,0xAF007FA6,0xB0007FA7,0xB1007FA8,0xB2007FA9,0xB3007FAA,0xB4007FAB,0xB5007FAC,0xB6007FAD, +0xB7007FAE,0xB8007FAF,0xB9007FB0,0xBA007FB1,0xBB007FB2,0xBC007FB3,0xBD007FB4,0xBE007FB5,0xBF007FB6,0x0025E756, +0x0025E74D,0x0025E744,0x0025E73B,0x0025E732,0x0025E729,0x0025E720,0x0025E717,0x0025E70E,0x0025E705,0x0025E6FC, +0x0025E6F3,0x0025E6EA,0x0025E6E1,0x0025E6D8,0x0025E6CF,0x0025E6C6,0x0025E6BD,0x0025E6B4,0x0025E6AB,0x0025E6A2, +0x0025E699,0x0025E690,0x0025E687,0x0019E594,0x0025E67E,0x0025E675,0x0025E66C,0x0025E663,0x0025E65A,0x0025E651, +0x0025E648,0x0025E63F,0x0025E636,0x0025E62D,0x0025E624,0x0025E61B,0x0025E612,0x0025E609,0x0025E600,0x0025E5F7, +0x0025E5EE,0x0025E5E5,0x0025E5DC,0x0025E5D3,0x0025E5CA,0x0025E5C1,0x0025E5B8,0x0025E5AF,0x0025E5A6,0x0025E59D, +0x0025E594,0x0019E4A1,0x0025E58B,0x0025E582,0x0025E579,0x0025E570,0x0025E567,0x0025E55E,0x0025E555,0x0025E54C, +0x0025E543,0x0025E53A,0x0025E531,0x80007FF7,0x81007FF8,0x82007FF9,0x83007FFA,0x84007FFB,0x85007FFC,0x86007FFD, +0x87007FFE,0x88007FFF,0x89008000,0x8A008001,0x8B008002,0x8C008003,0x8D008004,0x8E008005,0x8F008006,0x90008007, +0x91008008,0x92008009,0x9300800A,0x9400800B,0x9500800C,0x9600800D,0x9700800E,0x9800800F,0x99008010,0x9A008011, +0x9B008012,0x9C008013,0x9D008014,0x9E008015,0x9F008016,0xA0008017,0xA1008018,0xA2008019,0xA300801A,0xA400801B, +0xA500801C,0xA600801D,0xA700801E,0xA800801F,0xA9008020,0xAA008021,0xAB008022,0xAC008023,0xAD008024,0xAE008025, +0xAF008026,0xB0008027,0xB1008028,0xB2008029,0xB300802A,0xB400802B,0xB500802C,0xB600802D,0xB700802E,0xB800802F, +0xB9008030,0xBA008031,0xBB008032,0xBC008033,0xBD008034,0xBE008035,0xBF008036,0x0025E528,0x0025E51F,0x0025E516, +0x0025E50D,0x0025E504,0x0025E4FB,0x0025E4F2,0x0025E4E9,0x0025E4E0,0x0025E4D7,0x0025E4CE,0x0025E4C5,0x0025E4BC, +0x0025E4B3,0x0025E4AA,0x0025E4A1,0x0019E3AE,0x0025E498,0x0025E48F,0x0025E486,0x0025E47D,0x0025E474,0x0025E46B, +0x0025E462,0x0025E459,0x0025E450,0x0025E447,0x0025E43E,0x0025E435,0x0025E42C,0x0025E423,0x0025E41A,0x0025E411, +0x0025E408,0x0025E3FF,0x0025E3F6,0x0025E3ED,0x0025E3E4,0x0025E3DB,0x0025E3D2,0x0025E3C9,0x0025E3C0,0x0025E3B7, +0x0025E3AE,0x0019E2BB,0x0025E3A5,0x0025E39C,0x0025E393,0x0025E38A,0x0025E381,0x0025E378,0x0025E36F,0x0025E366, +0x0025E35D,0x0025E354,0x0025E34B,0x0025E342,0x0025E339,0x0025E330,0x0025E327,0x0025E31E,0x0025E315,0x0025E30C, +0x0025E303,0x80008077,0x81008078,0x82008079,0x8300807A,0x8400807B,0x8500807C,0x8600807D,0x8700807E,0x8800807F, +0x89008080,0x8A008081,0x8B008082,0x8C008083,0x8D008084,0x8E008085,0x8F008086,0x90008087,0x91008088,0x92008089, +0x9300808A,0x9400808B,0x9500808C,0x9600808D,0x9700808E,0x9800808F,0x99008090,0x9A008091,0x9B008092,0x9C008093, +0x9D008094,0x9E008095,0x9F008096,0xA0008097,0xA1008098,0xA2008099,0xA300809A,0xA400809B,0xA500809C,0xA600809D, +0xA700809E,0xA800809F,0xA90080A0,0xAA0080A1,0xAB0080A2,0xAC0080A3,0xAD0080A4,0xAE0080A5,0xAF0080A6,0xB00080A7, +0xB10080A8,0xB20080A9,0xB30080AA,0xB40080AB,0xB50080AC,0xB60080AD,0xB70080AE,0xB80080AF,0xB90080B0,0xBA0080B1, +0xBB0080B2,0xBC0080B3,0xBD0080B4,0xBE0080B5,0xBF0080B6,0x0025E2FA,0x0025E2F1,0x0025E2E8,0x0025E2DF,0x0025E2D6, +0x0025E2CD,0x0025E2C4,0x0025E2BB,0x0019E1C8,0x0025E2B2,0x0025E2A9,0x0025E2A0,0x0025E297,0x0025E28E,0x0025E285, +0x0025E27C,0x0025E273,0x0025E26A,0x0025E261,0x0025E258,0x0025E24F,0x0025E246,0x0025E23D,0x0025E234,0x0025E22B, +0x0025E222,0x0025E219,0x0025E210,0x0025E207,0x0025E1FE,0x0025E1F5,0x0025E1EC,0x0025E1E3,0x0025E1DA,0x0025E1D1, +0x0025E1C8,0x0019E0D5,0x0025E1BF,0x0025E1B6,0x0025E1AD,0x0025E1A4,0x0025E19B,0x0025E192,0x0025E189,0x0025E180, +0x0025E177,0x0025E16E,0x0025E165,0x0025E15C,0x0025E153,0x0025E14A,0x0025E141,0x0025E138,0x0025E12F,0x0025E126, +0x0025E11D,0x0025E114,0x0025E10B,0x0025E102,0x0025E0F9,0x0025E0F0,0x0025E0E7,0x0025E0DE,0x0025E0D5,0x800080F7, +0x810080F8,0x820080F9,0x830080FA,0x840080FB,0x850080FC,0x860080FD,0x870080FE,0x880080FF,0x89008100,0x8A008101, +0x8B008102,0x8C008103,0x8D008104,0x8E008105,0x8F008106,0x90008107,0x91008108,0x92008109,0x9300810A,0x9400810B, +0x9500810C,0x9600810D,0x9700810E,0x9800810F,0x99008110,0x9A008111,0x9B008112,0x9C008113,0x9D008114,0x9E008115, +0x9F008116,0xA0008117,0xA1008118,0xA2008119,0xA300811A,0xA400811B,0xA500811C,0xA600811D,0xA700811E,0xA800811F, +0xA9008120,0xAA008121,0xAB008122,0xAC008123,0xAD008124,0xAE008125,0xAF008126,0xB0008127,0xB1008128,0xB2008129, +0xB300812A,0xB400812B,0xB500812C,0xB600812D,0xB700812E,0xB800812F,0xB9008130,0xBA008131,0xBB008132,0xBC008133, +0xBD008134,0xBE008135,0xBF008136,0x0019DFE2,0x0025E0CC,0x0025E0C3,0x0025E0BA,0x0025E0B1,0x0025E0A8,0x0025E09F, +0x0025E096,0x0025E08D,0x0025E084,0x0025E07B,0x0025E072,0x0025E069,0x0025E060,0x0025E057,0x0025E04E,0x0025E045, +0x0025E03C,0x0025E033,0x0025E02A,0x0025E021,0x0025E018,0x0025E00F,0x0025E006,0x0025DFFD,0x0025DFF4,0x0025DFEB, +0x0025DFE2,0x0019DEEF,0x0025DFD9,0x0025DFD0,0x0025DFC7,0x0025DFBE,0x0025DFB5,0x0025DFAC,0x0025DFA3,0x0025DF9A, +0x0025DF91,0x0025DF88,0x0025DF7F,0x0025DF76,0x0025DF6D,0x0025DF64,0x0025DF5B,0x0025DF52,0x0025DF49,0x0025DF40, +0x0025DF37,0x0025DF2E,0x0025DF25,0x0025DF1C,0x0025DF13,0x0025DF0A,0x0025DF01,0x0025DEF8,0x0025DEEF,0x0019DDFC, +0x0025DEE6,0x0025DEDD,0x0025DED4,0x0025DECB,0x0025DEC2,0x0025DEB9,0x0025DEB0,0x80008177,0x81008178,0x82008179, +0x8300817A,0x8400817B,0x8500817C,0x8600817D,0x8700817E,0x8800817F,0x89008180,0x8A008181,0x8B008182,0x8C008183, +0x8D008184,0x8E008185,0x8F008186,0x90008187,0x91008188,0x92008189,0x9300818A,0x9400818B,0x9500818C,0x9600818D, +0x9700818E,0x9800818F,0x99008190,0x9A008191,0x9B008192,0x9C008193,0x9D008194,0x9E008195,0x9F008196,0xA0008197, +0xA1008198,0xA2008199,0xA300819A,0xA400819B,0xA500819C,0xA600819D,0xA700819E,0xA800819F,0xA90081A0,0xAA0081A1, +0xAB0081A2,0xAC0081A3,0xAD0081A4,0xAE0081A5,0xAF0081A6,0xB00081A7,0xB10081A8,0xB20081A9,0xB30081AA,0xB40081AB, +0xB50081AC,0xB60081AD,0xB70081AE,0xB80081AF,0xB90081B0,0xBA0081B1,0xBB0081B2,0xBC0081B3,0xBD0081B4,0xBE0081B5, +0xBF0081B6,0x0025DEA7,0x0025DE9E,0x0025DE95,0x0025DE8C,0x0025DE83,0x0025DE7A,0x0025DE71,0x0025DE68,0x0025DE5F, +0x0025DE56,0x0025DE4D,0x0025DE44,0x0025DE3B,0x0025DE32,0x0025DE29,0x0025DE20,0x0025DE17,0x0025DE0E,0x0025DE05, +0x0025DDFC,0x0019DD09,0x0025DDF3,0x0025DDEA,0x0025DDE1,0x0025DDD8,0x0025DDCF,0x0025DDC6,0x0025DDBD,0x0025DDB4, +0x0025DDAB,0x0025DDA2,0x0025DD99,0x0025DD90,0x0025DD87,0x0025DD7E,0x0025DD75,0x0025DD6C,0x0025DD63,0x0025DD5A, +0x0025DD51,0x0025DD48,0x0025DD3F,0x0025DD36,0x0025DD2D,0x0025DD24,0x0025DD1B,0x0025DD12,0x0025DD09,0x0019DC16, +0x0025DD00,0x0025DCF7,0x0025DCEE,0x0025DCE5,0x0025DCDC,0x0025DCD3,0x0025DCCA,0x0025DCC1,0x0025DCB8,0x0025DCAF, +0x0025DCA6,0x0025DC9D,0x0025DC94,0x0025DC8B,0x0025DC82,0x800081F7,0x810081F8,0x820081F9,0x830081FA,0x840081FB, +0x850081FC,0x860081FD,0x870081FE,0x880081FF,0x89008200,0x8A008201,0x8B008202,0x8C008203,0x8D008204,0x8E008205, +0x8F008206,0x90008207,0x91008208,0x92008209,0x9300820A,0x9400820B,0x9500820C,0x9600820D,0x9700820E,0x9800820F, +0x99008210,0x9A008211,0x9B008212,0x9C008213,0x9D008214,0x9E008215,0x9F008216,0xA0008217,0xA1008218,0xA2008219, +0xA300821A,0xA400821B,0xA500821C,0xA600821D,0xA700821E,0xA800821F,0xA9008220,0xAA008221,0xAB008222,0xAC008223, +0xAD008224,0xAE008225,0xAF008226,0xB0008227,0xB1008228,0xB2008229,0xB300822A,0xB400822B,0xB500822C,0xB600822D, +0xB700822E,0xB800822F,0xB9008230,0xBA008231,0xBB008232,0xBC008233,0xBD008234,0xBE008235,0xBF008236,0x0025DC79, +0x0025DC70,0x0025DC67,0x0025DC5E,0x0025DC55,0x0025DC4C,0x0025DC43,0x0025DC3A,0x0025DC31,0x0025DC28,0x0025DC1F, +0x0025DC16,0x0019DB23,0x0025DC0D,0x0025DC04,0x0025DBFB,0x0025DBF2,0x0025DBE9,0x0025DBE0,0x0025DBD7,0x0025DBCE, +0x0025DBC5,0x0025DBBC,0x0025DBB3,0x0025DBAA,0x0025DBA1,0x0025DB98,0x0025DB8F,0x0025DB86,0x0025DB7D,0x0025DB74, +0x0025DB6B,0x0025DB62,0x0025DB59,0x0025DB50,0x0025DB47,0x0025DB3E,0x0025DB35,0x0025DB2C,0x0025DB23,0x0019DA30, +0x0025DB1A,0x0025DB11,0x0025DB08,0x0025DAFF,0x0025DAF6,0x0025DAED,0x0025DAE4,0x0025DADB,0x0025DAD2,0x0025DAC9, +0x0025DAC0,0x0025DAB7,0x0025DAAE,0x0025DAA5,0x0025DA9C,0x0025DA93,0x0025DA8A,0x0025DA81,0x0025DA78,0x0025DA6F, +0x0025DA66,0x0025DA5D,0x0025DA54,0x80008277,0x81008278,0x82008279,0x8300827A,0x8400827B,0x8500827C,0x8600827D, +0x8700827E,0x8800827F,0x89008280,0x8A008281,0x8B008282,0x8C008283,0x8D008284,0x8E008285,0x8F008286,0x90008287, +0x91008288,0x92008289,0x9300828A,0x9400828B,0x9500828C,0x9600828D,0x9700828E,0x9800828F,0x99008290,0x9A008291, +0x9B008292,0x9C008293,0x9D008294,0x9E008295,0x9F008296,0xA0008297,0xA1008298,0xA2008299,0xA300829A,0xA400829B, +0xA500829C,0xA600829D,0xA700829E,0xA800829F,0xA90082A0,0xAA0082A1,0xAB0082A2,0xAC0082A3,0xAD0082A4,0xAE0082A5, +0xAF0082A6,0xB00082A7,0xB10082A8,0xB20082A9,0xB30082AA,0xB40082AB,0xB50082AC,0xB60082AD,0xB70082AE,0xB80082AF, +0xB90082B0,0xBA0082B1,0xBB0082B2,0xBC0082B3,0xBD0082B4,0xBE0082B5,0xBF0082B6,0x0025DA4B,0x0025DA42,0x0025DA39, +0x0025DA30,0x0019D93D,0x0025DA27,0x0025DA1E,0x0025DA15,0x0025DA0C,0x0025DA03,0x0025D9FA,0x0025D9F1,0x0025D9E8, +0x0025D9DF,0x0025D9D6,0x0025D9CD,0x0025D9C4,0x0025D9BB,0x0025D9B2,0x0025D9A9,0x0025D9A0,0x0025D997,0x0025D98E, +0x0025D985,0x0025D97C,0x0025D973,0x0025D96A,0x0025D961,0x0025D958,0x0025D94F,0x0025D946,0x0025D93D,0x0019D84A, +0x0025D934,0x0025D92B,0x0025D922,0x0025D919,0x0025D910,0x0025D907,0x0025D8FE,0x0025D8F5,0x0025D8EC,0x0025D8E3, +0x0025D8DA,0x0025D8D1,0x0025D8C8,0x0025D8BF,0x0025D8B6,0x0025D8AD,0x0025D8A4,0x0025D89B,0x0025D892,0x0025D889, +0x0025D880,0x0025D877,0x0025D86E,0x0025D865,0x0025D85C,0x0025D853,0x0025D84A,0x0019D757,0x0025D841,0x0025D838, +0x0025D82F,0x800082F7,0x810082F8,0x820082F9,0x830082FA,0x840082FB,0x850082FC,0x860082FD,0x870082FE,0x880082FF, +0x89008300,0x8A008301,0x8B008302,0x8C008303,0x8D008304,0x8E008305,0x8F008306,0x90008307,0x91008308,0x92008309, +0x9300830A,0x9400830B,0x9500830C,0x9600830D,0x9700830E,0x9800830F,0x99008310,0x9A008311,0x9B008312,0x9C008313, +0x9D008314,0x9E008315,0x9F008316,0xA0008317,0xA1008318,0xA2008319,0xA300831A,0xA400831B,0xA500831C,0xA600831D, +0xA700831E,0xA800831F,0xA9008320,0xAA008321,0xAB008322,0xAC008323,0xAD008324,0xAE008325,0xAF008326,0xB0008327, +0xB1008328,0xB2008329,0xB300832A,0xB400832B,0xB500832C,0xB600832D,0xB700832E,0xB800832F,0xB9008330,0xBA008331, +0xBB008332,0xBC008333,0xBD008334,0xBE008335,0xBF008336,0x0025D826,0x0025D81D,0x0025D814,0x0025D80B,0x0025D802, +0x0025D7F9,0x0025D7F0,0x0025D7E7,0x0025D7DE,0x0025D7D5,0x0025D7CC,0x0025D7C3,0x0025D7BA,0x0025D7B1,0x0025D7A8, +0x0025D79F,0x0025D796,0x0025D78D,0x0025D784,0x0025D77B,0x0025D772,0x0025D769,0x0025D760,0x0025D757,0x0019D664, +0x0025D74E,0x0025D745,0x0025D73C,0x0025D733,0x0025D72A,0x0025D721,0x0025D718,0x0025D70F,0x0025D706,0x0025D6FD, +0x0025D6F4,0x0025D6EB,0x0025D6E2,0x0025D6D9,0x0025D6D0,0x0025D6C7,0x0025D6BE,0x0025D6B5,0x0025D6AC,0x0025D6A3, +0x0025D69A,0x0025D691,0x0025D688,0x0025D67F,0x0025D676,0x0025D66D,0x0025D664,0x0019D571,0x0025D65B,0x0025D652, +0x0025D649,0x0025D640,0x0025D637,0x0025D62E,0x0025D625,0x0025D61C,0x0025D613,0x0025D60A,0x0025D601,0x80008377, +0x81008378,0x82008379,0x8300837A,0x8400837B,0x8500837C,0x8600837D,0x8700837E,0x8800837F,0x89008380,0x8A008381, +0x8B008382,0x8C008383,0x8D008384,0x8E008385,0x8F008386,0x90008387,0x91008388,0x92008389,0x9300838A,0x9400838B, +0x9500838C,0x9600838D,0x9700838E,0x9800838F,0x99008390,0x9A008391,0x9B008392,0x9C008393,0x9D008394,0x9E008395, +0x9F008396,0xA0008397,0xA1008398,0xA2008399,0xA300839A,0xA400839B,0xA500839C,0xA600839D,0xA700839E,0xA800839F, +0xA90083A0,0xAA0083A1,0xAB0083A2,0xAC0083A3,0xAD0083A4,0xAE0083A5,0xAF0083A6,0xB00083A7,0xB10083A8,0xB20083A9, +0xB30083AA,0xB40083AB,0xB50083AC,0xB60083AD,0xB70083AE,0xB80083AF,0xB90083B0,0xBA0083B1,0xBB0083B2,0xBC0083B3, +0xBD0083B4,0xBE0083B5,0xBF0083B6,0x0025D5F8,0x0025D5EF,0x0025D5E6,0x0025D5DD,0x0025D5D4,0x0025D5CB,0x0025D5C2, +0x0025D5B9,0x0025D5B0,0x0025D5A7,0x0025D59E,0x0025D595,0x0025D58C,0x0025D583,0x0025D57A,0x0025D571,0x0019D47E, +0x0025D568,0x0025D55F,0x0025D556,0x0025D54D,0x0025D544,0x0025D53B,0x0025D532,0x0025D529,0x0025D520,0x0025D517, +0x0025D50E,0x0025D505,0x0025D4FC,0x0025D4F3,0x0025D4EA,0x0025D4E1,0x0025D4D8,0x0025D4CF,0x0025D4C6,0x0025D4BD, +0x0025D4B4,0x0025D4AB,0x0025D4A2,0x0025D499,0x0025D490,0x0025D487,0x0025D47E,0x0019D38B,0x0025D475,0x0025D46C, +0x0025D463,0x0025D45A,0x0025D451,0x0025D448,0x0025D43F,0x0025D436,0x0025D42D,0x0025D424,0x0025D41B,0x0025D412, +0x0025D409,0x0025D400,0x0025D3F7,0x0025D3EE,0x0025D3E5,0x0025D3DC,0x0025D3D3,0x800083F7,0x810083F8,0x820083F9, +0x830083FA,0x840083FB,0x850083FC,0x860083FD,0x870083FE,0x880083FF,0x89008400,0x8A008401,0x8B008402,0x8C008403, +0x8D008404,0x8E008405,0x8F008406,0x90008407,0x91008408,0x92008409,0x9300840A,0x9400840B,0x9500840C,0x9600840D, +0x9700840E,0x9800840F,0x99008410,0x9A008411,0x9B008412,0x9C008413,0x9D008414,0x9E008415,0x9F008416,0xA0008417, +0xA1008418,0xA2008419,0xA300841A,0xA400841B,0xA500841C,0xA600841D,0xA700841E,0xA800841F,0xA9008420,0xAA008421, +0xAB008422,0xAC008423,0xAD008424,0xAE008425,0xAF008426,0xB0008427,0xB1008428,0xB2008429,0xB300842A,0xB400842B, +0xB500842C,0xB600842D,0xB700842E,0xB800842F,0xB9008430,0xBA008431,0xBB008432,0xBC008433,0xBD008434,0xBE008435, +0xBF008436,0x0025D3CA,0x0025D3C1,0x0025D3B8,0x0025D3AF,0x0025D3A6,0x0025D39D,0x0025D394,0x0025D38B,0x0019D298, +0x0025D382,0x0025D379,0x0025D370,0x0025D367,0x0025D35E,0x0025D355,0x0025D34C,0x0025D343,0x0025D33A,0x0025D331, +0x0025D328,0x0025D31F,0x0025D316,0x0025D30D,0x0025D304,0x0025D2FB,0x0025D2F2,0x0025D2E9,0x0025D2E0,0x0025D2D7, +0x0025D2CE,0x0025D2C5,0x0025D2BC,0x0025D2B3,0x0025D2AA,0x0025D2A1,0x0025D298,0x0019D1A5,0x0025D28F,0x0025D286, +0x0025D27D,0x0025D274,0x0025D26B,0x0025D262,0x0025D259,0x0025D250,0x0025D247,0x0025D23E,0x0025D235,0x0025D22C, +0x0025D223,0x0025D21A,0x0025D211,0x0025D208,0x0025D1FF,0x0025D1F6,0x0025D1ED,0x0025D1E4,0x0025D1DB,0x0025D1D2, +0x0025D1C9,0x0025D1C0,0x0025D1B7,0x0025D1AE,0x0025D1A5,0x80008477,0x81008478,0x82008479,0x8300847A,0x8400847B, +0x8500847C,0x8600847D,0x8700847E,0x8800847F,0x89008480,0x8A008481,0x8B008482,0x8C008483,0x8D008484,0x8E008485, +0x8F008486,0x90008487,0x91008488,0x92008489,0x9300848A,0x9400848B,0x9500848C,0x9600848D,0x9700848E,0x9800848F, +0x99008490,0x9A008491,0x9B008492,0x9C008493,0x9D008494,0x9E008495,0x9F008496,0xA0008497,0xA1008498,0xA2008499, +0xA300849A,0xA400849B,0xA500849C,0xA600849D,0xA700849E,0xA800849F,0xA90084A0,0xAA0084A1,0xAB0084A2,0xAC0084A3, +0xAD0084A4,0xAE0084A5,0xAF0084A6,0xB00084A7,0xB10084A8,0xB20084A9,0xB30084AA,0xB40084AB,0xB50084AC,0xB60084AD, +0xB70084AE,0xB80084AF,0xB90084B0,0xBA0084B1,0xBB0084B2,0xBC0084B3,0xBD0084B4,0xBE0084B5,0xBF0084B6,0x0019D0B2, +0x0025D19C,0x0025D193,0x0025D18A,0x0025D181,0x0025D178,0x0025D16F,0x0025D166,0x0025D15D,0x0025D154,0x0025D14B, +0x0025D142,0x0025D139,0x0025D130,0x0025D127,0x0025D11E,0x0025D115,0x0025D10C,0x0025D103,0x0025D0FA,0x0025D0F1, +0x0025D0E8,0x0025D0DF,0x0025D0D6,0x0025D0CD,0x0025D0C4,0x0025D0BB,0x0025D0B2,0x0019CFBF,0x0025D0A9,0x0025D0A0, +0x0025D097,0x0025D08E,0x0025D085,0x0025D07C,0x0025D073,0x0025D06A,0x0025D061,0x0025D058,0x0025D04F,0x0025D046, +0x0025D03D,0x0025D034,0x0025D02B,0x0025D022,0x0025D019,0x0025D010,0x0025D007,0x0025CFFE,0x0025CFF5,0x0025CFEC, +0x0025CFE3,0x0025CFDA,0x0025CFD1,0x0025CFC8,0x0025CFBF,0x0019CECC,0x0025CFB6,0x0025CFAD,0x0025CFA4,0x0025CF9B, +0x0025CF92,0x0025CF89,0x0025CF80,0x800084F7,0x810084F8,0x820084F9,0x830084FA,0x840084FB,0x850084FC,0x860084FD, +0x870084FE,0x880084FF,0x89008500,0x8A008501,0x8B008502,0x8C008503,0x8D008504,0x8E008505,0x8F008506,0x90008507, +0x91008508,0x92008509,0x9300850A,0x9400850B,0x9500850C,0x9600850D,0x9700850E,0x9800850F,0x99008510,0x9A008511, +0x9B008512,0x9C008513,0x9D008514,0x9E008515,0x9F008516,0xA0008517,0xA1008518,0xA2008519,0xA300851A,0xA400851B, +0xA500851C,0xA600851D,0xA700851E,0xA800851F,0xA9008520,0xAA008521,0xAB008522,0xAC008523,0xAD008524,0xAE008525, +0xAF008526,0xB0008527,0xB1008528,0xB2008529,0xB300852A,0xB400852B,0xB500852C,0xB600852D,0xB700852E,0xB800852F, +0xB9008530,0xBA008531,0xBB008532,0xBC008533,0xBD008534,0xBE008535,0xBF008536,0x0025CF77,0x0025CF6E,0x0025CF65, +0x0025CF5C,0x0025CF53,0x0025CF4A,0x0025CF41,0x0025CF38,0x0025CF2F,0x0025CF26,0x0025CF1D,0x0025CF14,0x0025CF0B, +0x0025CF02,0x0025CEF9,0x0025CEF0,0x0025CEE7,0x0025CEDE,0x0025CED5,0x0025CECC,0x0019CDD9,0x0025CEC3,0x0025CEBA, +0x0025CEB1,0x0025CEA8,0x0025CE9F,0x0025CE96,0x0025CE8D,0x0025CE84,0x0025CE7B,0x0025CE72,0x0025CE69,0x0025CE60, +0x0025CE57,0x0025CE4E,0x0025CE45,0x0025CE3C,0x0025CE33,0x0025CE2A,0x0025CE21,0x0025CE18,0x0025CE0F,0x0025CE06, +0x0025CDFD,0x0025CDF4,0x0025CDEB,0x0025CDE2,0x0025CDD9,0x0019CCE6,0x0025CDD0,0x0025CDC7,0x0025CDBE,0x0025CDB5, +0x0025CDAC,0x0025CDA3,0x0025CD9A,0x0025CD91,0x0025CD88,0x0025CD7F,0x0025CD76,0x0025CD6D,0x0025CD64,0x0025CD5B, +0x0025CD52,0x80008577,0x81008578,0x82008579,0x8300857A,0x8400857B,0x8500857C,0x8600857D,0x8700857E,0x8800857F, +0x89008580,0x8A008581,0x8B008582,0x8C008583,0x8D008584,0x8E008585,0x8F008586,0x90008587,0x91008588,0x92008589, +0x9300858A,0x9400858B,0x9500858C,0x9600858D,0x9700858E,0x9800858F,0x99008590,0x9A008591,0x9B008592,0x9C008593, +0x9D008594,0x9E008595,0x9F008596,0xA0008597,0xA1008598,0xA2008599,0xA300859A,0xA400859B,0xA500859C,0xA600859D, +0xA700859E,0xA800859F,0xA90085A0,0xAA0085A1,0xAB0085A2,0xAC0085A3,0xAD0085A4,0xAE0085A5,0xAF0085A6,0xB00085A7, +0xB10085A8,0xB20085A9,0xB30085AA,0xB40085AB,0xB50085AC,0xB60085AD,0xB70085AE,0xB80085AF,0xB90085B0,0xBA0085B1, +0xBB0085B2,0xBC0085B3,0xBD0085B4,0xBE0085B5,0xBF0085B6,0x0025CD49,0x0025CD40,0x0025CD37,0x0025CD2E,0x0025CD25, +0x0025CD1C,0x0025CD13,0x0025CD0A,0x0025CD01,0x0025CCF8,0x0025CCEF,0x0025CCE6,0x0019CBF3,0x0025CCDD,0x0025CCD4, +0x0025CCCB,0x0025CCC2,0x0025CCB9,0x0025CCB0,0x0025CCA7,0x0025CC9E,0x0025CC95,0x0025CC8C,0x0025CC83,0x0025CC7A, +0x0025CC71,0x0025CC68,0x0025CC5F,0x0025CC56,0x0025CC4D,0x0025CC44,0x0025CC3B,0x0025CC32,0x0025CC29,0x0025CC20, +0x0025CC17,0x0025CC0E,0x0025CC05,0x0025CBFC,0x0025CBF3,0x0019CB00,0x0025CBEA,0x0025CBE1,0x0025CBD8,0x0025CBCF, +0x0025CBC6,0x0025CBBD,0x0025CBB4,0x0025CBAB,0x0025CBA2,0x0025CB99,0x0025CB90,0x0025CB87,0x0025CB7E,0x0025CB75, +0x0025CB6C,0x0025CB63,0x0025CB5A,0x0025CB51,0x0025CB48,0x0025CB3F,0x0025CB36,0x0025CB2D,0x0025CB24,0x800085F7, +0x810085F8,0x820085F9,0x830085FA,0x840085FB,0x850085FC,0x860085FD,0x870085FE,0x880085FF,0x89008600,0x8A008601, +0x8B008602,0x8C008603,0x8D008604,0x8E008605,0x8F008606,0x90008607,0x91008608,0x92008609,0x9300860A,0x9400860B, +0x9500860C,0x9600860D,0x9700860E,0x9800860F,0x99008610,0x9A008611,0x9B008612,0x9C008613,0x9D008614,0x9E008615, +0x9F008616,0xA0008617,0xA1008618,0xA2008619,0xA300861A,0xA400861B,0xA500861C,0xA600861D,0xA700861E,0xA800861F, +0xA9008620,0xAA008621,0xAB008622,0xAC008623,0xAD008624,0xAE008625,0xAF008626,0xB0008627,0xB1008628,0xB2008629, +0xB300862A,0xB400862B,0xB500862C,0xB600862D,0xB700862E,0xB800862F,0xB9008630,0xBA008631,0xBB008632,0xBC008633, +0xBD008634,0xBE008635,0xBF008636,0x0025CB1B,0x0025CB12,0x0025CB09,0x0025CB00,0x0019CA0D,0x0025CAF7,0x0025CAEE, +0x0025CAE5,0x0025CADC,0x0025CAD3,0x0025CACA,0x0025CAC1,0x0025CAB8,0x0025CAAF,0x0025CAA6,0x0025CA9D,0x0025CA94, +0x0025CA8B,0x0025CA82,0x0025CA79,0x0025CA70,0x0025CA67,0x0025CA5E,0x0025CA55,0x0025CA4C,0x0025CA43,0x0025CA3A, +0x0025CA31,0x0025CA28,0x0025CA1F,0x0025CA16,0x0025CA0D,0x0019C91A,0x0025CA04,0x0025C9FB,0x0025C9F2,0x0025C9E9, +0x0025C9E0,0x0025C9D7,0x0025C9CE,0x0025C9C5,0x0025C9BC,0x0025C9B3,0x0025C9AA,0x0025C9A1,0x0025C998,0x0025C98F, +0x0025C986,0x0025C97D,0x0025C974,0x0025C96B,0x0025C962,0x0025C959,0x0025C950,0x0025C947,0x0025C93E,0x0025C935, +0x0025C92C,0x0025C923,0x0025C91A,0x0019C827,0x0025C911,0x0025C908,0x0025C8FF,0x80008677,0x81008678,0x82008679, +0x8300867A,0x8400867B,0x8500867C,0x8600867D,0x8700867E,0x8800867F,0x89008680,0x8A008681,0x8B008682,0x8C008683, +0x8D008684,0x8E008685,0x8F008686,0x90008687,0x91008688,0x92008689,0x9300868A,0x9400868B,0x9500868C,0x9600868D, +0x9700868E,0x9800868F,0x99008690,0x9A008691,0x9B008692,0x9C008693,0x9D008694,0x9E008695,0x9F008696,0xA0008697, +0xA1008698,0xA2008699,0xA300869A,0xA400869B,0xA500869C,0xA600869D,0xA700869E,0xA800869F,0xA90086A0,0xAA0086A1, +0xAB0086A2,0xAC0086A3,0xAD0086A4,0xAE0086A5,0xAF0086A6,0xB00086A7,0xB10086A8,0xB20086A9,0xB30086AA,0xB40086AB, +0xB50086AC,0xB60086AD,0xB70086AE,0xB80086AF,0xB90086B0,0xBA0086B1,0xBB0086B2,0xBC0086B3,0xBD0086B4,0xBE0086B5, +0xBF0086B6,0x0025C8F6,0x0025C8ED,0x0025C8E4,0x0025C8DB,0x0025C8D2,0x0025C8C9,0x0025C8C0,0x0025C8B7,0x0025C8AE, +0x0025C8A5,0x0025C89C,0x0025C893,0x0025C88A,0x0025C881,0x0025C878,0x0025C86F,0x0025C866,0x0025C85D,0x0025C854, +0x0025C84B,0x0025C842,0x0025C839,0x0025C830,0x0025C827,0x0019C734,0x0025C81E,0x0025C815,0x0025C80C,0x0025C803, +0x0025C7FA,0x0025C7F1,0x0025C7E8,0x0025C7DF,0x0025C7D6,0x0025C7CD,0x0025C7C4,0x0025C7BB,0x0025C7B2,0x0025C7A9, +0x0025C7A0,0x0025C797,0x0025C78E,0x0025C785,0x0025C77C,0x0025C773,0x0025C76A,0x0025C761,0x0025C758,0x0025C74F, +0x0025C746,0x0025C73D,0x0025C734,0x0019C641,0x0025C72B,0x0025C722,0x0025C719,0x0025C710,0x0025C707,0x0025C6FE, +0x0025C6F5,0x0025C6EC,0x0025C6E3,0x0025C6DA,0x0025C6D1,0x800086F7,0x810086F8,0x820086F9,0x830086FA,0x840086FB, +0x850086FC,0x860086FD,0x870086FE,0x880086FF,0x89008700,0x8A008701,0x8B008702,0x8C008703,0x8D008704,0x8E008705, +0x8F008706,0x90008707,0x91008708,0x92008709,0x9300870A,0x9400870B,0x9500870C,0x9600870D,0x9700870E,0x9800870F, +0x99008710,0x9A008711,0x9B008712,0x9C008713,0x9D008714,0x9E008715,0x9F008716,0xA0008717,0xA1008718,0xA2008719, +0xA300871A,0xA400871B,0xA500871C,0xA600871D,0xA700871E,0xA800871F,0xA9008720,0xAA008721,0xAB008722,0xAC008723, +0xAD008724,0xAE008725,0xAF008726,0xB0008727,0xB1008728,0xB2008729,0xB300872A,0xB400872B,0xB500872C,0xB600872D, +0xB700872E,0xB800872F,0xB9008730,0xBA008731,0xBB008732,0xBC008733,0xBD008734,0xBE008735,0xBF008736,0x0025C6C8, +0x0025C6BF,0x0025C6B6,0x0025C6AD,0x0025C6A4,0x0025C69B,0x0025C692,0x0025C689,0x0025C680,0x0025C677,0x0025C66E, +0x0025C665,0x0025C65C,0x0025C653,0x0025C64A,0x0025C641,0x0019C54E,0x0025C638,0x0025C62F,0x0025C626,0x0025C61D, +0x0025C614,0x0025C60B,0x0025C602,0x0025C5F9,0x0025C5F0,0x0025C5E7,0x0025C5DE,0x0025C5D5,0x0025C5CC,0x0025C5C3, +0x0025C5BA,0x0025C5B1,0x0025C5A8,0x0025C59F,0x0025C596,0x0025C58D,0x0025C584,0x0025C57B,0x0025C572,0x0025C569, +0x0025C560,0x0025C557,0x0025C54E,0x0019C45B,0x0025C545,0x0025C53C,0x0025C533,0x0025C52A,0x0025C521,0x0025C518, +0x0025C50F,0x0025C506,0x0025C4FD,0x0025C4F4,0x0025C4EB,0x0025C4E2,0x0025C4D9,0x0025C4D0,0x0025C4C7,0x0025C4BE, +0x0025C4B5,0x0025C4AC,0x0025C4A3,0x80008777,0x81008778,0x82008779,0x8300877A,0x8400877B,0x8500877C,0x8600877D, +0x8700877E,0x8800877F,0x89008780,0x8A008781,0x8B008782,0x8C008783,0x8D008784,0x8E008785,0x8F008786,0x90008787, +0x91008788,0x92008789,0x9300878A,0x9400878B,0x9500878C,0x9600878D,0x9700878E,0x9800878F,0x99008790,0x9A008791, +0x9B008792,0x9C008793,0x9D008794,0x9E008795,0x9F008796,0xA0008797,0xA1008798,0xA2008799,0xA300879A,0xA400879B, +0xA500879C,0xA600879D,0xA700879E,0xA800879F,0xA90087A0,0xAA0087A1,0xAB0087A2,0xAC0087A3,0xAD0087A4,0xAE0087A5, +0xAF0087A6,0xB00087A7,0xB10087A8,0xB20087A9,0xB30087AA,0xB40087AB,0xB50087AC,0xB60087AD,0xB70087AE,0xB80087AF, +0xB90087B0,0xBA0087B1,0xBB0087B2,0xBC0087B3,0xBD0087B4,0xBE0087B5,0xBF0087B6,0x0025C49A,0x0025C491,0x0025C488, +0x0025C47F,0x0025C476,0x0025C46D,0x0025C464,0x0025C45B,0x0019C368,0x0025C452,0x0025C449,0x0025C440,0x0025C437, +0x0025C42E,0x0025C425,0x0025C41C,0x0025C413,0x0025C40A,0x0025C401,0x0025C3F8,0x0025C3EF,0x0025C3E6,0x0025C3DD, +0x0025C3D4,0x0025C3CB,0x0025C3C2,0x0025C3B9,0x0025C3B0,0x0025C3A7,0x0025C39E,0x0025C395,0x0025C38C,0x0025C383, +0x0025C37A,0x0025C371,0x0025C368,0x0019C275,0x0025C35F,0x0025C356,0x0025C34D,0x0025C344,0x0025C33B,0x0025C332, +0x0025C329,0x0025C320,0x0025C317,0x0025C30E,0x0025C305,0x0025C2FC,0x0025C2F3,0x0025C2EA,0x0025C2E1,0x0025C2D8, +0x0025C2CF,0x0025C2C6,0x0025C2BD,0x0025C2B4,0x0025C2AB,0x0025C2A2,0x0025C299,0x0025C290,0x0025C287,0x0025C27E, +0x0025C275,0x800087F7,0x810087F8,0x820087F9,0x830087FA,0x840087FB,0x850087FC,0x860087FD,0x870087FE,0x880087FF, +0x89008800,0x8A008801,0x8B008802,0x8C008803,0x8D008804,0x8E008805,0x8F008806,0x90008807,0x91008808,0x92008809, +0x9300880A,0x9400880B,0x9500880C,0x9600880D,0x9700880E,0x9800880F,0x99008810,0x9A008811,0x9B008812,0x9C008813, +0x9D008814,0x9E008815,0x9F008816,0xA0008817,0xA1008818,0xA2008819,0xA300881A,0xA400881B,0xA500881C,0xA600881D, +0xA700881E,0xA800881F,0xA9008820,0xAA008821,0xAB008822,0xAC008823,0xAD008824,0xAE008825,0xAF008826,0xB0008827, +0xB1008828,0xB2008829,0xB300882A,0xB400882B,0xB500882C,0xB600882D,0xB700882E,0xB800882F,0xB9008830,0xBA008831, +0xBB008832,0xBC008833,0xBD008834,0xBE008835,0xBF008836,0x0019C182,0x0025C26C,0x0025C263,0x0025C25A,0x0025C251, +0x0025C248,0x0025C23F,0x0025C236,0x0025C22D,0x0025C224,0x0025C21B,0x0025C212,0x0025C209,0x0025C200,0x0025C1F7, +0x0025C1EE,0x0025C1E5,0x0025C1DC,0x0025C1D3,0x0025C1CA,0x0025C1C1,0x0025C1B8,0x0025C1AF,0x0025C1A6,0x0025C19D, +0x0025C194,0x0025C18B,0x0025C182,0x0019C08F,0x0025C179,0x0025C170,0x0025C167,0x0025C15E,0x0025C155,0x0025C14C, +0x0025C143,0x0025C13A,0x0025C131,0x0025C128,0x0025C11F,0x0025C116,0x0025C10D,0x0025C104,0x0025C0FB,0x0025C0F2, +0x0025C0E9,0x0025C0E0,0x0025C0D7,0x0025C0CE,0x0025C0C5,0x0025C0BC,0x0025C0B3,0x0025C0AA,0x0025C0A1,0x0025C098, +0x0025C08F,0x0019BF9C,0x0025C086,0x0025C07D,0x0025C074,0x0025C06B,0x0025C062,0x0025C059,0x0025C050,0x80008877, +0x81008878,0x82008879,0x8300887A,0x8400887B,0x8500887C,0x8600887D,0x8700887E,0x8800887F,0x89008880,0x8A008881, +0x8B008882,0x8C008883,0x8D008884,0x8E008885,0x8F008886,0x90008887,0x91008888,0x92008889,0x9300888A,0x9400888B, +0x9500888C,0x9600888D,0x9700888E,0x9800888F,0x99008890,0x9A008891,0x9B008892,0x9C008893,0x9D008894,0x9E008895, +0x9F008896,0xA0008897,0xA1008898,0xA2008899,0xA300889A,0xA400889B,0xA500889C,0xA600889D,0xA700889E,0xA800889F, +0xA90088A0,0xAA0088A1,0xAB0088A2,0xAC0088A3,0xAD0088A4,0xAE0088A5,0xAF0088A6,0xB00088A7,0xB10088A8,0xB20088A9, +0xB30088AA,0xB40088AB,0xB50088AC,0xB60088AD,0xB70088AE,0xB80088AF,0xB90088B0,0xBA0088B1,0xBB0088B2,0xBC0088B3, +0xBD0088B4,0xBE0088B5,0xBF0088B6,0x0025C047,0x0025C03E,0x0025C035,0x0025C02C,0x0025C023,0x0025C01A,0x0025C011, +0x0025C008,0x0025BFFF,0x0025BFF6,0x0025BFED,0x0025BFE4,0x0025BFDB,0x0025BFD2,0x0025BFC9,0x0025BFC0,0x0025BFB7, +0x0025BFAE,0x0025BFA5,0x0025BF9C,0x0019BEA9,0x0025BF93,0x0025BF8A,0x0025BF81,0x0025BF78,0x0025BF6F,0x0025BF66, +0x0025BF5D,0x0025BF54,0x0025BF4B,0x0025BF42,0x0025BF39,0x0025BF30,0x0025BF27,0x0025BF1E,0x0025BF15,0x0025BF0C, +0x0025BF03,0x0025BEFA,0x0025BEF1,0x0025BEE8,0x0025BEDF,0x0025BED6,0x0025BECD,0x0025BEC4,0x0025BEBB,0x0025BEB2, +0x0025BEA9,0x0019BDB6,0x0025BEA0,0x0025BE97,0x0025BE8E,0x0025BE85,0x0025BE7C,0x0025BE73,0x0025BE6A,0x0025BE61, +0x0025BE58,0x0025BE4F,0x0025BE46,0x0025BE3D,0x0025BE34,0x0025BE2B,0x0025BE22,0x800088F7,0x810088F8,0x820088F9, +0x830088FA,0x840088FB,0x850088FC,0x860088FD,0x870088FE,0x880088FF,0x89008900,0x8A008901,0x8B008902,0x8C008903, +0x8D008904,0x8E008905,0x8F008906,0x90008907,0x91008908,0x92008909,0x9300890A,0x9400890B,0x9500890C,0x9600890D, +0x9700890E,0x9800890F,0x99008910,0x9A008911,0x9B008912,0x9C008913,0x9D008914,0x9E008915,0x9F008916,0xA0008917, +0xA1008918,0xA2008919,0xA300891A,0xA400891B,0xA500891C,0xA600891D,0xA700891E,0xA800891F,0xA9008920,0xAA008921, +0xAB008922,0xAC008923,0xAD008924,0xAE008925,0xAF008926,0xB0008927,0xB1008928,0xB2008929,0xB300892A,0xB400892B, +0xB500892C,0xB600892D,0xB700892E,0xB800892F,0xB9008930,0xBA008931,0xBB008932,0xBC008933,0xBD008934,0xBE008935, +0xBF008936,0x0025BE19,0x0025BE10,0x0025BE07,0x0025BDFE,0x0025BDF5,0x0025BDEC,0x0025BDE3,0x0025BDDA,0x0025BDD1, +0x0025BDC8,0x0025BDBF,0x0025BDB6,0x0019BCC3,0x0025BDAD,0x0025BDA4,0x0025BD9B,0x0025BD92,0x0025BD89,0x0025BD80, +0x0025BD77,0x0025BD6E,0x0025BD65,0x0025BD5C,0x0025BD53,0x0025BD4A,0x0025BD41,0x0025BD38,0x0025BD2F,0x0025BD26, +0x0025BD1D,0x0025BD14,0x0025BD0B,0x0025BD02,0x0025BCF9,0x0025BCF0,0x0025BCE7,0x0025BCDE,0x0025BCD5,0x0025BCCC, +0x0025BCC3,0x0019BBD0,0x0025BCBA,0x0025BCB1,0x0025BCA8,0x0025BC9F,0x0025BC96,0x0025BC8D,0x0025BC84,0x0025BC7B, +0x0025BC72,0x0025BC69,0x0025BC60,0x0025BC57,0x0025BC4E,0x0025BC45,0x0025BC3C,0x0025BC33,0x0025BC2A,0x0025BC21, +0x0025BC18,0x0025BC0F,0x0025BC06,0x0025BBFD,0x0025BBF4,0x80008977,0x81008978,0x82008979,0x8300897A,0x8400897B, +0x8500897C,0x8600897D,0x8700897E,0x8800897F,0x89008980,0x8A008981,0x8B008982,0x8C008983,0x8D008984,0x8E008985, +0x8F008986,0x90008987,0x91008988,0x92008989,0x9300898A,0x9400898B,0x9500898C,0x9600898D,0x9700898E,0x9800898F, +0x99008990,0x9A008991,0x9B008992,0x9C008993,0x9D008994,0x9E008995,0x9F008996,0xA0008997,0xA1008998,0xA2008999, +0xA300899A,0xA400899B,0xA500899C,0xA600899D,0xA700899E,0xA800899F,0xA90089A0,0xAA0089A1,0xAB0089A2,0xAC0089A3, +0xAD0089A4,0xAE0089A5,0xAF0089A6,0xB00089A7,0xB10089A8,0xB20089A9,0xB30089AA,0xB40089AB,0xB50089AC,0xB60089AD, +0xB70089AE,0xB80089AF,0xB90089B0,0xBA0089B1,0xBB0089B2,0xBC0089B3,0xBD0089B4,0xBE0089B5,0xBF0089B6,0x0025BBEB, +0x0025BBE2,0x0025BBD9,0x0025BBD0,0x0019BADD,0x0025BBC7,0x0025BBBE,0x0025BBB5,0x0025BBAC,0x0025BBA3,0x0025BB9A, +0x0025BB91,0x0025BB88,0x0025BB7F,0x0025BB76,0x0025BB6D,0x0025BB64,0x0025BB5B,0x0025BB52,0x0025BB49,0x0025BB40, +0x0025BB37,0x0025BB2E,0x0025BB25,0x0025BB1C,0x0025BB13,0x0025BB0A,0x0025BB01,0x0025BAF8,0x0025BAEF,0x0025BAE6, +0x0025BADD,0x0019B9EA,0x0025BAD4,0x0025BACB,0x0025BAC2,0x0025BAB9,0x0025BAB0,0x0025BAA7,0x0025BA9E,0x0025BA95, +0x0025BA8C,0x0025BA83,0x0025BA7A,0x0025BA71,0x0025BA68,0x0025BA5F,0x0025BA56,0x0025BA4D,0x0025BA44,0x0025BA3B, +0x0025BA32,0x0025BA29,0x0025BA20,0x0025BA17,0x0025BA0E,0x0025BA05,0x0025B9FC,0x0025B9F3,0x0025B9EA,0x0019B8F7, +0x0025B9E1,0x0025B9D8,0x0025B9CF,0x800089F7,0x810089F8,0x820089F9,0x830089FA,0x840089FB,0x850089FC,0x860089FD, +0x870089FE,0x880089FF,0x89008A00,0x8A008A01,0x8B008A02,0x8C008A03,0x8D008A04,0x8E008A05,0x8F008A06,0x90008A07, +0x91008A08,0x92008A09,0x93008A0A,0x94008A0B,0x95008A0C,0x96008A0D,0x97008A0E,0x98008A0F,0x99008A10,0x9A008A11, +0x9B008A12,0x9C008A13,0x9D008A14,0x9E008A15,0x9F008A16,0xA0008A17,0xA1008A18,0xA2008A19,0xA3008A1A,0xA4008A1B, +0xA5008A1C,0xA6008A1D,0xA7008A1E,0xA8008A1F,0xA9008A20,0xAA008A21,0xAB008A22,0xAC008A23,0xAD008A24,0xAE008A25, +0xAF008A26,0xB0008A27,0xB1008A28,0xB2008A29,0xB3008A2A,0xB4008A2B,0xB5008A2C,0xB6008A2D,0xB7008A2E,0xB8008A2F, +0xB9008A30,0xBA008A31,0xBB008A32,0xBC008A33,0xBD008A34,0xBE008A35,0xBF008A36,0x0025B9C6,0x0025B9BD,0x0025B9B4, +0x0025B9AB,0x0025B9A2,0x0025B999,0x0025B990,0x0025B987,0x0025B97E,0x0025B975,0x0025B96C,0x0025B963,0x0025B95A, +0x0025B951,0x0025B948,0x0025B93F,0x0025B936,0x0025B92D,0x0025B924,0x0025B91B,0x0025B912,0x0025B909,0x0025B900, +0x0025B8F7,0x0019B804,0x0025B8EE,0x0025B8E5,0x0025B8DC,0x0025B8D3,0x0025B8CA,0x0025B8C1,0x0025B8B8,0x0025B8AF, +0x0025B8A6,0x0025B89D,0x0025B894,0x0025B88B,0x0025B882,0x0025B879,0x0025B870,0x0025B867,0x0025B85E,0x0025B855, +0x0025B84C,0x0025B843,0x0025B83A,0x0025B831,0x0025B828,0x0025B81F,0x0025B816,0x0025B80D,0x0025B804,0x0019B711, +0x0025B7FB,0x0025B7F2,0x0025B7E9,0x0025B7E0,0x0025B7D7,0x0025B7CE,0x0025B7C5,0x0025B7BC,0x0025B7B3,0x0025B7AA, +0x0025B7A1,0x80008A77,0x81008A78,0x82008A79,0x83008A7A,0x84008A7B,0x85008A7C,0x86008A7D,0x87008A7E,0x88008A7F, +0x89008A80,0x8A008A81,0x8B008A82,0x8C008A83,0x8D008A84,0x8E008A85,0x8F008A86,0x90008A87,0x91008A88,0x92008A89, +0x93008A8A,0x94008A8B,0x95008A8C,0x96008A8D,0x97008A8E,0x98008A8F,0x99008A90,0x9A008A91,0x9B008A92,0x9C008A93, +0x9D008A94,0x9E008A95,0x9F008A96,0xA0008A97,0xA1008A98,0xA2008A99,0xA3008A9A,0xA4008A9B,0xA5008A9C,0xA6008A9D, +0xA7008A9E,0xA8008A9F,0xA9008AA0,0xAA008AA1,0xAB008AA2,0xAC008AA3,0xAD008AA4,0xAE008AA5,0xAF008AA6,0xB0008AA7, +0xB1008AA8,0xB2008AA9,0xB3008AAA,0xB4008AAB,0xB5008AAC,0xB6008AAD,0xB7008AAE,0xB8008AAF,0xB9008AB0,0xBA008AB1, +0xBB008AB2,0xBC008AB3,0xBD008AB4,0xBE008AB5,0xBF008AB6,0x0025B798,0x0025B78F,0x0025B786,0x0025B77D,0x0025B774, +0x0025B76B,0x0025B762,0x0025B759,0x0025B750,0x0025B747,0x0025B73E,0x0025B735,0x0025B72C,0x0025B723,0x0025B71A, +0x0025B711,0x0019B61E,0x0025B708,0x0025B6FF,0x0025B6F6,0x0025B6ED,0x0025B6E4,0x0025B6DB,0x0025B6D2,0x0025B6C9, +0x0025B6C0,0x0025B6B7,0x0025B6AE,0x0025B6A5,0x0025B69C,0x0025B693,0x0025B68A,0x0025B681,0x0025B678,0x0025B66F, +0x0025B666,0x0025B65D,0x0025B654,0x0025B64B,0x0025B642,0x0025B639,0x0025B630,0x0025B627,0x0025B61E,0x0019B52B, +0x0025B615,0x0025B60C,0x0025B603,0x0025B5FA,0x0025B5F1,0x0025B5E8,0x0025B5DF,0x0025B5D6,0x0025B5CD,0x0025B5C4, +0x0025B5BB,0x0025B5B2,0x0025B5A9,0x0025B5A0,0x0025B597,0x0025B58E,0x0025B585,0x0025B57C,0x0025B573,0x80008AF7, +0x81008AF8,0x82008AF9,0x83008AFA,0x84008AFB,0x85008AFC,0x86008AFD,0x87008AFE,0x88008AFF,0x89008B00,0x8A008B01, +0x8B008B02,0x8C008B03,0x8D008B04,0x8E008B05,0x8F008B06,0x90008B07,0x91008B08,0x92008B09,0x93008B0A,0x94008B0B, +0x95008B0C,0x96008B0D,0x97008B0E,0x98008B0F,0x99008B10,0x9A008B11,0x9B008B12,0x9C008B13,0x9D008B14,0x9E008B15, +0x9F008B16,0xA0008B17,0xA1008B18,0xA2008B19,0xA3008B1A,0xA4008B1B,0xA5008B1C,0xA6008B1D,0xA7008B1E,0xA8008B1F, +0xA9008B20,0xAA008B21,0xAB008B22,0xAC008B23,0xAD008B24,0xAE008B25,0xAF008B26,0xB0008B27,0xB1008B28,0xB2008B29, +0xB3008B2A,0xB4008B2B,0xB5008B2C,0xB6008B2D,0xB7008B2E,0xB8008B2F,0xB9008B30,0xBA008B31,0xBB008B32,0xBC008B33, +0xBD008B34,0xBE008B35,0xBF008B36,0x0025B56A,0x0025B561,0x0025B558,0x0025B54F,0x0025B546,0x0025B53D,0x0025B534, +0x0025B52B,0x0019B438,0x0025B522,0x0025B519,0x0025B510,0x0025B507,0x0025B4FE,0x0025B4F5,0x0025B4EC,0x0025B4E3, +0x0025B4DA,0x0025B4D1,0x0025B4C8,0x0025B4BF,0x0025B4B6,0x0025B4AD,0x0025B4A4,0x0025B49B,0x0025B492,0x0025B489, +0x0025B480,0x0025B477,0x0025B46E,0x0025B465,0x0025B45C,0x0025B453,0x0025B44A,0x0025B441,0x0025B438,0x0019B345, +0x0025B42F,0x0025B426,0x0025B41D,0x0025B414,0x0025B40B,0x0025B402,0x0025B3F9,0x0025B3F0,0x0025B3E7,0x0025B3DE, +0x0025B3D5,0x0025B3CC,0x0025B3C3,0x0025B3BA,0x0025B3B1,0x0025B3A8,0x0025B39F,0x0025B396,0x0025B38D,0x0025B384, +0x0025B37B,0x0025B372,0x0025B369,0x0025B360,0x0025B357,0x0025B34E,0x0025B345,0x80008B77,0x81008B78,0x82008B79, +0x83008B7A,0x84008B7B,0x85008B7C,0x86008B7D,0x87008B7E,0x88008B7F,0x89008B80,0x8A008B81,0x8B008B82,0x8C008B83, +0x8D008B84,0x8E008B85,0x8F008B86,0x90008B87,0x91008B88,0x92008B89,0x93008B8A,0x94008B8B,0x95008B8C,0x96008B8D, +0x97008B8E,0x98008B8F,0x99008B90,0x9A008B91,0x9B008B92,0x9C008B93,0x9D008B94,0x9E008B95,0x9F008B96,0xA0008B97, +0xA1008B98,0xA2008B99,0xA3008B9A,0xA4008B9B,0xA5008B9C,0xA6008B9D,0xA7008B9E,0xA8008B9F,0xA9008BA0,0xAA008BA1, +0xAB008BA2,0xAC008BA3,0xAD008BA4,0xAE008BA5,0xAF008BA6,0xB0008BA7,0xB1008BA8,0xB2008BA9,0xB3008BAA,0xB4008BAB, +0xB5008BAC,0xB6008BAD,0xB7008BAE,0xB8008BAF,0xB9008BB0,0xBA008BB1,0xBB008BB2,0xBC008BB3,0xBD008BB4,0xBE008BB5, +0xBF008BB6,0x0019B252,0x0025B33C,0x0025B333,0x0025B32A,0x0025B321,0x0025B318,0x0025B30F,0x0025B306,0x0025B2FD, +0x0025B2F4,0x0025B2EB,0x0025B2E2,0x0025B2D9,0x0025B2D0,0x0025B2C7,0x0025B2BE,0x0025B2B5,0x0025B2AC,0x0025B2A3, +0x0025B29A,0x0025B291,0x0025B288,0x0025B27F,0x0025B276,0x0025B26D,0x0025B264,0x0025B25B,0x0025B252,0x0019B15F, +0x0025B249,0x0025B240,0x0025B237,0x0025B22E,0x0025B225,0x0025B21C,0x0025B213,0x0025B20A,0x0025B201,0x0025B1F8, +0x0025B1EF,0x0025B1E6,0x0025B1DD,0x0025B1D4,0x0025B1CB,0x0025B1C2,0x0025B1B9,0x0025B1B0,0x0025B1A7,0x0025B19E, +0x0025B195,0x0025B18C,0x0025B183,0x0025B17A,0x0025B171,0x0025B168,0x0025B15F,0x0019B06C,0x0025B156,0x0025B14D, +0x0025B144,0x0025B13B,0x0025B132,0x0025B129,0x0025B120,0x80008BF7,0x81008BF8,0x82008BF9,0x83008BFA,0x84008BFB, +0x85008BFC,0x86008BFD,0x87008BFE,0x88008BFF,0x89008C00,0x8A008C01,0x8B008C02,0x8C008C03,0x8D008C04,0x8E008C05, +0x8F008C06,0x90008C07,0x91008C08,0x92008C09,0x93008C0A,0x94008C0B,0x95008C0C,0x96008C0D,0x97008C0E,0x98008C0F, +0x99008C10,0x9A008C11,0x9B008C12,0x9C008C13,0x9D008C14,0x9E008C15,0x9F008C16,0xA0008C17,0xA1008C18,0xA2008C19, +0xA3008C1A,0xA4008C1B,0xA5008C1C,0xA6008C1D,0xA7008C1E,0xA8008C1F,0xA9008C20,0xAA008C21,0xAB008C22,0xAC008C23, +0xAD008C24,0xAE008C25,0xAF008C26,0xB0008C27,0xB1008C28,0xB2008C29,0xB3008C2A,0xB4008C2B,0xB5008C2C,0xB6008C2D, +0xB7008C2E,0xB8008C2F,0xB9008C30,0xBA008C31,0xBB008C32,0xBC008C33,0xBD008C34,0xBE008C35,0xBF008C36,0x0025B117, +0x0025B10E,0x0025B105,0x0025B0FC,0x0025B0F3,0x0025B0EA,0x0025B0E1,0x0025B0D8,0x0025B0CF,0x0025B0C6,0x0025B0BD, +0x0025B0B4,0x0025B0AB,0x0025B0A2,0x0025B099,0x0025B090,0x0025B087,0x0025B07E,0x0025B075,0x0025B06C,0x0019AF79, +0x0025B063,0x0025B05A,0x0025B051,0x0025B048,0x0025B03F,0x0025B036,0x0025B02D,0x0025B024,0x0025B01B,0x0025B012, +0x0025B009,0x0025B000,0x0025AFF7,0x0025AFEE,0x0025AFE5,0x0025AFDC,0x0025AFD3,0x0025AFCA,0x0025AFC1,0x0025AFB8, +0x0025AFAF,0x0025AFA6,0x0025AF9D,0x0025AF94,0x0025AF8B,0x0025AF82,0x0025AF79,0x0019AE86,0x0025AF70,0x0025AF67, +0x0025AF5E,0x0025AF55,0x0025AF4C,0x0025AF43,0x0025AF3A,0x0025AF31,0x0025AF28,0x0025AF1F,0x0025AF16,0x0025AF0D, +0x0025AF04,0x0025AEFB,0x0025AEF2,0x80008C77,0x81008C78,0x82008C79,0x83008C7A,0x84008C7B,0x85008C7C,0x86008C7D, +0x87008C7E,0x88008C7F,0x89008C80,0x8A008C81,0x8B008C82,0x8C008C83,0x8D008C84,0x8E008C85,0x8F008C86,0x90008C87, +0x91008C88,0x92008C89,0x93008C8A,0x94008C8B,0x95008C8C,0x96008C8D,0x97008C8E,0x98008C8F,0x99008C90,0x9A008C91, +0x9B008C92,0x9C008C93,0x9D008C94,0x9E008C95,0x9F008C96,0xA0008C97,0xA1008C98,0xA2008C99,0xA3008C9A,0xA4008C9B, +0xA5008C9C,0xA6008C9D,0xA7008C9E,0xA8008C9F,0xA9008CA0,0xAA008CA1,0xAB008CA2,0xAC008CA3,0xAD008CA4,0xAE008CA5, +0xAF008CA6,0xB0008CA7,0xB1008CA8,0xB2008CA9,0xB3008CAA,0xB4008CAB,0xB5008CAC,0xB6008CAD,0xB7008CAE,0xB8008CAF, +0xB9008CB0,0xBA008CB1,0xBB008CB2,0xBC008CB3,0xBD008CB4,0xBE008CB5,0xBF008CB6,0x0025AEE9,0x0025AEE0,0x0025AED7, +0x0025AECE,0x0025AEC5,0x0025AEBC,0x0025AEB3,0x0025AEAA,0x0025AEA1,0x0025AE98,0x0025AE8F,0x0025AE86,0x0019AD93, +0x0025AE7D,0x0025AE74,0x0025AE6B,0x0025AE62,0x0025AE59,0x0025AE50,0x0025AE47,0x0025AE3E,0x0025AE35,0x0025AE2C, +0x0025AE23,0x0025AE1A,0x0025AE11,0x0025AE08,0x0025ADFF,0x0025ADF6,0x0025ADED,0x0025ADE4,0x0025ADDB,0x0025ADD2, +0x0025ADC9,0x0025ADC0,0x0025ADB7,0x0025ADAE,0x0025ADA5,0x0025AD9C,0x0025AD93,0x0019ACA0,0x0025AD8A,0x0025AD81, +0x0025AD78,0x0025AD6F,0x0025AD66,0x0025AD5D,0x0025AD54,0x0025AD4B,0x0025AD42,0x0025AD39,0x0025AD30,0x0025AD27, +0x0025AD1E,0x0025AD15,0x0025AD0C,0x0025AD03,0x0025ACFA,0x0025ACF1,0x0025ACE8,0x0025ACDF,0x0025ACD6,0x0025ACCD, +0x0025ACC4,0x80008CF7,0x81008CF8,0x82008CF9,0x83008CFA,0x84008CFB,0x85008CFC,0x86008CFD,0x87008CFE,0x88008CFF, +0x89008D00,0x8A008D01,0x8B008D02,0x8C008D03,0x8D008D04,0x8E008D05,0x8F008D06,0x90008D07,0x91008D08,0x92008D09, +0x93008D0A,0x94008D0B,0x95008D0C,0x96008D0D,0x97008D0E,0x98008D0F,0x99008D10,0x9A008D11,0x9B008D12,0x9C008D13, +0x9D008D14,0x9E008D15,0x9F008D16,0xA0008D17,0xA1008D18,0xA2008D19,0xA3008D1A,0xA4008D1B,0xA5008D1C,0xA6008D1D, +0xA7008D1E,0xA8008D1F,0xA9008D20,0xAA008D21,0xAB008D22,0xAC008D23,0xAD008D24,0xAE008D25,0xAF008D26,0xB0008D27, +0xB1008D28,0xB2008D29,0xB3008D2A,0xB4008D2B,0xB5008D2C,0xB6008D2D,0xB7008D2E,0xB8008D2F,0xB9008D30,0xBA008D31, +0xBB008D32,0xBC008D33,0xBD008D34,0xBE008D35,0xBF008D36,0x0025ACBB,0x0025ACB2,0x0025ACA9,0x0025ACA0,0x0019ABAD, +0x0025AC97,0x0025AC8E,0x0025AC85,0x0025AC7C,0x0025AC73,0x0025AC6A,0x0025AC61,0x0025AC58,0x0025AC4F,0x0025AC46, +0x0025AC3D,0x0025AC34,0x0025AC2B,0x0025AC22,0x0025AC19,0x0025AC10,0x0025AC07,0x0025ABFE,0x0025ABF5,0x0025ABEC, +0x0025ABE3,0x0025ABDA,0x0025ABD1,0x0025ABC8,0x0025ABBF,0x0025ABB6,0x0025ABAD,0x0019AABA,0x0025ABA4,0x0025AB9B, +0x0025AB92,0x0025AB89,0x0025AB80,0x0025AB77,0x0025AB6E,0x0025AB65,0x0025AB5C,0x0025AB53,0x0025AB4A,0x0025AB41, +0x0025AB38,0x0025AB2F,0x0025AB26,0x0025AB1D,0x0025AB14,0x0025AB0B,0x0025AB02,0x0025AAF9,0x0025AAF0,0x0025AAE7, +0x0025AADE,0x0025AAD5,0x0025AACC,0x0025AAC3,0x0025AABA,0x0019A9C7,0x0025AAB1,0x0025AAA8,0x0025AA9F,0x80008D77, +0x81008D78,0x82008D79,0x83008D7A,0x84008D7B,0x85008D7C,0x86008D7D,0x87008D7E,0x88008D7F,0x89008D80,0x8A008D81, +0x8B008D82,0x8C008D83,0x8D008D84,0x8E008D85,0x8F008D86,0x90008D87,0x91008D88,0x92008D89,0x93008D8A,0x94008D8B, +0x95008D8C,0x96008D8D,0x97008D8E,0x98008D8F,0x99008D90,0x9A008D91,0x9B008D92,0x9C008D93,0x9D008D94,0x9E008D95, +0x9F008D96,0xA0008D97,0xA1008D98,0xA2008D99,0xA3008D9A,0xA4008D9B,0xA5008D9C,0xA6008D9D,0xA7008D9E,0xA8008D9F, +0xA9008DA0,0xAA008DA1,0xAB008DA2,0xAC008DA3,0xAD008DA4,0xAE008DA5,0xAF008DA6,0xB0008DA7,0xB1008DA8,0xB2008DA9, +0xB3008DAA,0xB4008DAB,0xB5008DAC,0xB6008DAD,0xB7008DAE,0xB8008DAF,0xB9008DB0,0xBA008DB1,0xBB008DB2,0xBC008DB3, +0xBD008DB4,0xBE008DB5,0xBF008DB6,0x0025AA96,0x0025AA8D,0x0025AA84,0x0025AA7B,0x0025AA72,0x0025AA69,0x0025AA60, +0x0025AA57,0x0025AA4E,0x0025AA45,0x0025AA3C,0x0025AA33,0x0025AA2A,0x0025AA21,0x0025AA18,0x0025AA0F,0x0025AA06, +0x0025A9FD,0x0025A9F4,0x0025A9EB,0x0025A9E2,0x0025A9D9,0x0025A9D0,0x0025A9C7,0x0019A8D4,0x0025A9BE,0x0025A9B5, +0x0025A9AC,0x0025A9A3,0x0025A99A,0x0025A991,0x0025A988,0x0025A97F,0x0025A976,0x0025A96D,0x0025A964,0x0025A95B, +0x0025A952,0x0025A949,0x0025A940,0x0025A937,0x0025A92E,0x0025A925,0x0025A91C,0x0025A913,0x0025A90A,0x0025A901, +0x0025A8F8,0x0025A8EF,0x0025A8E6,0x0025A8DD,0x0025A8D4,0x0019A7E1,0x0025A8CB,0x0025A8C2,0x0025A8B9,0x0025A8B0, +0x0025A8A7,0x0025A89E,0x0025A895,0x0025A88C,0x0025A883,0x0025A87A,0x0025A871,0x80008DF7,0x81008DF8,0x82008DF9, +0x83008DFA,0x84008DFB,0x85008DFC,0x86008DFD,0x87008DFE,0x88008DFF,0x89008E00,0x8A008E01,0x8B008E02,0x8C008E03, +0x8D008E04,0x8E008E05,0x8F008E06,0x90008E07,0x91008E08,0x92008E09,0x93008E0A,0x94008E0B,0x95008E0C,0x96008E0D, +0x97008E0E,0x98008E0F,0x99008E10,0x9A008E11,0x9B008E12,0x9C008E13,0x9D008E14,0x9E008E15,0x9F008E16,0xA0008E17, +0xA1008E18,0xA2008E19,0xA3008E1A,0xA4008E1B,0xA5008E1C,0xA6008E1D,0xA7008E1E,0xA8008E1F,0xA9008E20,0xAA008E21, +0xAB008E22,0xAC008E23,0xAD008E24,0xAE008E25,0xAF008E26,0xB0008E27,0xB1008E28,0xB2008E29,0xB3008E2A,0xB4008E2B, +0xB5008E2C,0xB6008E2D,0xB7008E2E,0xB8008E2F,0xB9008E30,0xBA008E31,0xBB008E32,0xBC008E33,0xBD008E34,0xBE008E35, +0xBF008E36,0x0025A868,0x0025A85F,0x0025A856,0x0025A84D,0x0025A844,0x0025A83B,0x0025A832,0x0025A829,0x0025A820, +0x0025A817,0x0025A80E,0x0025A805,0x0025A7FC,0x0025A7F3,0x0025A7EA,0x0025A7E1,0x0019A6EE,0x0025A7D8,0x0025A7CF, +0x0025A7C6,0x0025A7BD,0x0025A7B4,0x0025A7AB,0x0025A7A2,0x0025A799,0x0025A790,0x0025A787,0x0025A77E,0x0025A775, +0x0025A76C,0x0025A763,0x0025A75A,0x0025A751,0x0025A748,0x0025A73F,0x0025A736,0x0025A72D,0x0025A724,0x0025A71B, +0x0025A712,0x0025A709,0x0025A700,0x0025A6F7,0x0025A6EE,0x0019A5FB,0x0025A6E5,0x0025A6DC,0x0025A6D3,0x0025A6CA, +0x0025A6C1,0x0025A6B8,0x0025A6AF,0x0025A6A6,0x0025A69D,0x0025A694,0x0025A68B,0x0025A682,0x0025A679,0x0025A670, +0x0025A667,0x0025A65E,0x0025A655,0x0025A64C,0x0025A643,0x80008E77,0x81008E78,0x82008E79,0x83008E7A,0x84008E7B, +0x85008E7C,0x86008E7D,0x87008E7E,0x88008E7F,0x89008E80,0x8A008E81,0x8B008E82,0x8C008E83,0x8D008E84,0x8E008E85, +0x8F008E86,0x90008E87,0x91008E88,0x92008E89,0x93008E8A,0x94008E8B,0x95008E8C,0x96008E8D,0x97008E8E,0x98008E8F, +0x99008E90,0x9A008E91,0x9B008E92,0x9C008E93,0x9D008E94,0x9E008E95,0x9F008E96,0xA0008E97,0xA1008E98,0xA2008E99, +0xA3008E9A,0xA4008E9B,0xA5008E9C,0xA6008E9D,0xA7008E9E,0xA8008E9F,0xA9008EA0,0xAA008EA1,0xAB008EA2,0xAC008EA3, +0xAD008EA4,0xAE008EA5,0xAF008EA6,0xB0008EA7,0xB1008EA8,0xB2008EA9,0xB3008EAA,0xB4008EAB,0xB5008EAC,0xB6008EAD, +0xB7008EAE,0xB8008EAF,0xB9008EB0,0xBA008EB1,0xBB008EB2,0xBC008EB3,0xBD008EB4,0xBE008EB5,0xBF008EB6,0x0025A63A, +0x0025A631,0x0025A628,0x0025A61F,0x0025A616,0x0025A60D,0x0025A604,0x0025A5FB,0x0019A508,0x0025A5F2,0x0025A5E9, +0x0025A5E0,0x0025A5D7,0x0025A5CE,0x0025A5C5,0x0025A5BC,0x0025A5B3,0x0025A5AA,0x0025A5A1,0x0025A598,0x0025A58F, +0x0025A586,0x0025A57D,0x0025A574,0x0025A56B,0x0025A562,0x0025A559,0x0025A550,0x0025A547,0x0025A53E,0x0025A535, +0x0025A52C,0x0025A523,0x0025A51A,0x0025A511,0x0025A508,0x0019A415,0x0025A4FF,0x0025A4F6,0x0025A4ED,0x0025A4E4, +0x0025A4DB,0x0025A4D2,0x0025A4C9,0x0025A4C0,0x0025A4B7,0x0025A4AE,0x0025A4A5,0x0025A49C,0x0025A493,0x0025A48A, +0x0025A481,0x0025A478,0x0025A46F,0x0025A466,0x0025A45D,0x0025A454,0x0025A44B,0x0025A442,0x0025A439,0x0025A430, +0x0025A427,0x0025A41E,0x0025A415,0x80008EF7,0x81008EF8,0x82008EF9,0x83008EFA,0x84008EFB,0x85008EFC,0x86008EFD, +0x87008EFE,0x88008EFF,0x89008F00,0x8A008F01,0x8B008F02,0x8C008F03,0x8D008F04,0x8E008F05,0x8F008F06,0x90008F07, +0x91008F08,0x92008F09,0x93008F0A,0x94008F0B,0x95008F0C,0x96008F0D,0x97008F0E,0x98008F0F,0x99008F10,0x9A008F11, +0x9B008F12,0x9C008F13,0x9D008F14,0x9E008F15,0x9F008F16,0xA0008F17,0xA1008F18,0xA2008F19,0xA3008F1A,0xA4008F1B, +0xA5008F1C,0xA6008F1D,0xA7008F1E,0xA8008F1F,0xA9008F20,0xAA008F21,0xAB008F22,0xAC008F23,0xAD008F24,0xAE008F25, +0xAF008F26,0xB0008F27,0xB1008F28,0xB2008F29,0xB3008F2A,0xB4008F2B,0xB5008F2C,0xB6008F2D,0xB7008F2E,0xB8008F2F, +0xB9008F30,0xBA008F31,0xBB008F32,0xBC008F33,0xBD008F34,0xBE008F35,0xBF008F36,0x0019A322,0x0025A40C,0x0025A403, +0x0025A3FA,0x0025A3F1,0x0025A3E8,0x0025A3DF,0x0025A3D6,0x0025A3CD,0x0025A3C4,0x0025A3BB,0x0025A3B2,0x0025A3A9, +0x0025A3A0,0x0025A397,0x0025A38E,0x0025A385,0x0025A37C,0x0025A373,0x0025A36A,0x0025A361,0x0025A358,0x0025A34F, +0x0025A346,0x0025A33D,0x0025A334,0x0025A32B,0x0025A322,0x0019A22F,0x0025A319,0x0025A310,0x0025A307,0x0025A2FE, +0x0025A2F5,0x0025A2EC,0x0025A2E3,0x0025A2DA,0x0025A2D1,0x0025A2C8,0x0025A2BF,0x0025A2B6,0x0025A2AD,0x0025A2A4, +0x0025A29B,0x0025A292,0x0025A289,0x0025A280,0x0025A277,0x0025A26E,0x0025A265,0x0025A25C,0x0025A253,0x0025A24A, +0x0025A241,0x0025A238,0x0025A22F,0x0019A13C,0x0025A226,0x0025A21D,0x0025A214,0x0025A20B,0x0025A202,0x0025A1F9, +0x0025A1F0,0x80008F77,0x81008F78,0x82008F79,0x83008F7A,0x84008F7B,0x85008F7C,0x86008F7D,0x87008F7E,0x88008F7F, +0x89008F80,0x8A008F81,0x8B008F82,0x8C008F83,0x8D008F84,0x8E008F85,0x8F008F86,0x90008F87,0x91008F88,0x92008F89, +0x93008F8A,0x94008F8B,0x95008F8C,0x96008F8D,0x97008F8E,0x98008F8F,0x99008F90,0x9A008F91,0x9B008F92,0x9C008F93, +0x9D008F94,0x9E008F95,0x9F008F96,0xA0008F97,0xA1008F98,0xA2008F99,0xA3008F9A,0xA4008F9B,0xA5008F9C,0xA6008F9D, +0xA7008F9E,0xA8008F9F,0xA9008FA0,0xAA008FA1,0xAB008FA2,0xAC008FA3,0xAD008FA4,0xAE008FA5,0xAF008FA6,0xB0008FA7, +0xB1008FA8,0xB2008FA9,0xB3008FAA,0xB4008FAB,0xB5008FAC,0xB6008FAD,0xB7008FAE,0xB8008FAF,0xB9008FB0,0xBA008FB1, +0xBB008FB2,0xBC008FB3,0xBD008FB4,0xBE008FB5,0xBF008FB6,0x0025A1E7,0x0025A1DE,0x0025A1D5,0x0025A1CC,0x0025A1C3, +0x0025A1BA,0x0025A1B1,0x0025A1A8,0x0025A19F,0x0025A196,0x0025A18D,0x0025A184,0x0025A17B,0x0025A172,0x0025A169, +0x0025A160,0x0025A157,0x0025A14E,0x0025A145,0x0025A13C,0x0019A049,0x0025A133,0x0025A12A,0x0025A121,0x0025A118, +0x0025A10F,0x0025A106,0x0025A0FD,0x0025A0F4,0x0025A0EB,0x0025A0E2,0x0025A0D9,0x0025A0D0,0x0025A0C7,0x0025A0BE, +0x0025A0B5,0x0025A0AC,0x0025A0A3,0x0025A09A,0x0025A091,0x0025A088,0x0025A07F,0x0025A076,0x0025A06D,0x0025A064, +0x0025A05B,0x0025A052,0x0025A049,0x00199F56,0x0025A040,0x0025A037,0x0025A02E,0x0025A025,0x0025A01C,0x0025A013, +0x0025A00A,0x0025A001,0x00259FF8,0x00259FEF,0x00259FE6,0x00259FDD,0x00259FD4,0x00259FCB,0x00259FC2,0x80008FF7, +0x81008FF8,0x82008FF9,0x83008FFA,0x84008FFB,0x85008FFC,0x86008FFD,0x87008FFE,0x88008FFF,0x89009000,0x8A009001, +0x8B009002,0x8C009003,0x8D009004,0x8E009005,0x8F009006,0x90009007,0x91009008,0x92009009,0x9300900A,0x9400900B, +0x9500900C,0x9600900D,0x9700900E,0x9800900F,0x99009010,0x9A009011,0x9B009012,0x9C009013,0x9D009014,0x9E009015, +0x9F009016,0xA0009017,0xA1009018,0xA2009019,0xA300901A,0xA400901B,0xA500901C,0xA600901D,0xA700901E,0xA800901F, +0xA9009020,0xAA009021,0xAB009022,0xAC009023,0xAD009024,0xAE009025,0xAF009026,0xB0009027,0xB1009028,0xB2009029, +0xB300902A,0xB400902B,0xB500902C,0xB600902D,0xB700902E,0xB800902F,0xB9009030,0xBA009031,0xBB009032,0xBC009033, +0xBD009034,0xBE009035,0xBF009036,0x00259FB9,0x00259FB0,0x00259FA7,0x00259F9E,0x00259F95,0x00259F8C,0x00259F83, +0x00259F7A,0x00259F71,0x00259F68,0x00259F5F,0x00259F56,0x00199E63,0x00259F4D,0x00259F44,0x00259F3B,0x00259F32, +0x00259F29,0x00259F20,0x00259F17,0x00259F0E,0x00259F05,0x00259EFC,0x00259EF3,0x00259EEA,0x00259EE1,0x00259ED8, +0x00259ECF,0x00259EC6,0x00259EBD,0x00259EB4,0x00259EAB,0x00259EA2,0x00259E99,0x00259E90,0x00259E87,0x00259E7E, +0x00259E75,0x00259E6C,0x00259E63,0x00199D70,0x00259E5A,0x00259E51,0x00259E48,0x00259E3F,0x00259E36,0x00259E2D, +0x00259E24,0x00259E1B,0x00259E12,0x00259E09,0x00259E00,0x00259DF7,0x00259DEE,0x00259DE5,0x00259DDC,0x00259DD3, +0x00259DCA,0x00259DC1,0x00259DB8,0x00259DAF,0x00259DA6,0x00259D9D,0x00259D94,0x80009077,0x81009078,0x82009079, +0x8300907A,0x8400907B,0x8500907C,0x8600907D,0x8700907E,0x8800907F,0x89009080,0x8A009081,0x8B009082,0x8C009083, +0x8D009084,0x8E009085,0x8F009086,0x90009087,0x91009088,0x92009089,0x9300908A,0x9400908B,0x9500908C,0x9600908D, +0x9700908E,0x9800908F,0x99009090,0x9A009091,0x9B009092,0x9C009093,0x9D009094,0x9E009095,0x9F009096,0xA0009097, +0xA1009098,0xA2009099,0xA300909A,0xA400909B,0xA500909C,0xA600909D,0xA700909E,0xA800909F,0xA90090A0,0xAA0090A1, +0xAB0090A2,0xAC0090A3,0xAD0090A4,0xAE0090A5,0xAF0090A6,0xB00090A7,0xB10090A8,0xB20090A9,0xB30090AA,0xB40090AB, +0xB50090AC,0xB60090AD,0xB70090AE,0xB80090AF,0xB90090B0,0xBA0090B1,0xBB0090B2,0xBC0090B3,0xBD0090B4,0xBE0090B5, +0xBF0090B6,0x00259D8B,0x00259D82,0x00259D79,0x00259D70,0x00199C7D,0x00259D67,0x00259D5E,0x00259D55,0x00259D4C, +0x00259D43,0x00259D3A,0x00259D31,0x00259D28,0x00259D1F,0x00259D16,0x00259D0D,0x00259D04,0x00259CFB,0x00259CF2, +0x00259CE9,0x00259CE0,0x00259CD7,0x00259CCE,0x00259CC5,0x00259CBC,0x00259CB3,0x00259CAA,0x00259CA1,0x00259C98, +0x00259C8F,0x00259C86,0x00259C7D,0x00199B8A,0x00259C74,0x00259C6B,0x00259C62,0x00259C59,0x00259C50,0x00259C47, +0x00259C3E,0x00259C35,0x00259C2C,0x00259C23,0x00259C1A,0x00259C11,0x00259C08,0x00259BFF,0x00259BF6,0x00259BED, +0x00259BE4,0x00259BDB,0x00259BD2,0x00259BC9,0x00259BC0,0x00259BB7,0x00259BAE,0x00259BA5,0x00259B9C,0x00259B93, +0x00259B8A,0x00199A97,0x00259B81,0x00259B78,0x00259B6F,0x800090F7,0x810090F8,0x820090F9,0x830090FA,0x840090FB, +0x850090FC,0x860090FD,0x870090FE,0x880090FF,0x89009100,0x8A009101,0x8B009102,0x8C009103,0x8D009104,0x8E009105, +0x8F009106,0x90009107,0x91009108,0x92009109,0x9300910A,0x9400910B,0x9500910C,0x9600910D,0x9700910E,0x9800910F, +0x99009110,0x9A009111,0x9B009112,0x9C009113,0x9D009114,0x9E009115,0x9F009116,0xA0009117,0xA1009118,0xA2009119, +0xA300911A,0xA400911B,0xA500911C,0xA600911D,0xA700911E,0xA800911F,0xA9009120,0xAA009121,0xAB009122,0xAC009123, +0xAD009124,0xAE009125,0xAF009126,0xB0009127,0xB1009128,0xB2009129,0xB300912A,0xB400912B,0xB500912C,0xB600912D, +0xB700912E,0xB800912F,0xB9009130,0xBA009131,0xBB009132,0xBC009133,0xBD009134,0xBE009135,0xBF009136,0x00259B66, +0x00259B5D,0x00259B54,0x00259B4B,0x00259B42,0x00259B39,0x00259B30,0x00259B27,0x00259B1E,0x00259B15,0x00259B0C, +0x00259B03,0x00259AFA,0x00259AF1,0x00259AE8,0x00259ADF,0x00259AD6,0x00259ACD,0x00259AC4,0x00259ABB,0x00259AB2, +0x00259AA9,0x00259AA0,0x00259A97,0x001999A4,0x00259A8E,0x00259A85,0x00259A7C,0x00259A73,0x00259A6A,0x00259A61, +0x00259A58,0x00259A4F,0x00259A46,0x00259A3D,0x00259A34,0x00259A2B,0x00259A22,0x00259A19,0x00259A10,0x00259A07, +0x002599FE,0x002599F5,0x002599EC,0x002599E3,0x002599DA,0x002599D1,0x002599C8,0x002599BF,0x002599B6,0x002599AD, +0x002599A4,0x001998B1,0x0025999B,0x00259992,0x00259989,0x00259980,0x00259977,0x0025996E,0x00259965,0x0025995C, +0x00259953,0x0025994A,0x00259941,0x80009177,0x81009178,0x82009179,0x8300917A,0x8400917B,0x8500917C,0x8600917D, +0x8700917E,0x8800917F,0x89009180,0x8A009181,0x8B009182,0x8C009183,0x8D009184,0x8E009185,0x8F009186,0x90009187, +0x91009188,0x92009189,0x9300918A,0x9400918B,0x9500918C,0x9600918D,0x9700918E,0x9800918F,0x99009190,0x9A009191, +0x9B009192,0x9C009193,0x9D009194,0x9E009195,0x9F009196,0xA0009197,0xA1009198,0xA2009199,0xA300919A,0xA400919B, +0xA500919C,0xA600919D,0xA700919E,0xA800919F,0xA90091A0,0xAA0091A1,0xAB0091A2,0xAC0091A3,0xAD0091A4,0xAE0091A5, +0xAF0091A6,0xB00091A7,0xB10091A8,0xB20091A9,0xB30091AA,0xB40091AB,0xB50091AC,0xB60091AD,0xB70091AE,0xB80091AF, +0xB90091B0,0xBA0091B1,0xBB0091B2,0xBC0091B3,0xBD0091B4,0xBE0091B5,0xBF0091B6,0x00259938,0x0025992F,0x00259926, +0x0025991D,0x00259914,0x0025990B,0x00259902,0x002598F9,0x002598F0,0x002598E7,0x002598DE,0x002598D5,0x002598CC, +0x002598C3,0x002598BA,0x002598B1,0x001997BE,0x002598A8,0x0025989F,0x00259896,0x0025988D,0x00259884,0x0025987B, +0x00259872,0x00259869,0x00259860,0x00259857,0x0025984E,0x00259845,0x0025983C,0x00259833,0x0025982A,0x00259821, +0x00259818,0x0025980F,0x00259806,0x002597FD,0x002597F4,0x002597EB,0x002597E2,0x002597D9,0x002597D0,0x002597C7, +0x002597BE,0x001996CB,0x002597B5,0x002597AC,0x002597A3,0x0025979A,0x00259791,0x00259788,0x0025977F,0x00259776, +0x0025976D,0x00259764,0x0025975B,0x00259752,0x00259749,0x00259740,0x00259737,0x0025972E,0x00259725,0x0025971C, +0x00259713,0x800091F7,0x810091F8,0x820091F9,0x830091FA,0x840091FB,0x850091FC,0x860091FD,0x870091FE,0x880091FF, +0x89009200,0x8A009201,0x8B009202,0x8C009203,0x8D009204,0x8E009205,0x8F009206,0x90009207,0x91009208,0x92009209, +0x9300920A,0x9400920B,0x9500920C,0x9600920D,0x9700920E,0x9800920F,0x99009210,0x9A009211,0x9B009212,0x9C009213, +0x9D009214,0x9E009215,0x9F009216,0xA0009217,0xA1009218,0xA2009219,0xA300921A,0xA400921B,0xA500921C,0xA600921D, +0xA700921E,0xA800921F,0xA9009220,0xAA009221,0xAB009222,0xAC009223,0xAD009224,0xAE009225,0xAF009226,0xB0009227, +0xB1009228,0xB2009229,0xB300922A,0xB400922B,0xB500922C,0xB600922D,0xB700922E,0xB800922F,0xB9009230,0xBA009231, +0xBB009232,0xBC009233,0xBD009234,0xBE009235,0xBF009236,0x0025970A,0x00259701,0x002596F8,0x002596EF,0x002596E6, +0x002596DD,0x002596D4,0x002596CB,0x001995D8,0x002596C2,0x002596B9,0x002596B0,0x002596A7,0x0025969E,0x00259695, +0x0025968C,0x00259683,0x0025967A,0x00259671,0x00259668,0x0025965F,0x00259656,0x0025964D,0x00259644,0x0025963B, +0x00259632,0x00259629,0x00259620,0x00259617,0x0025960E,0x00259605,0x002595FC,0x002595F3,0x002595EA,0x002595E1, +0x002595D8,0x001994E5,0x002595CF,0x002595C6,0x002595BD,0x002595B4,0x002595AB,0x002595A2,0x00259599,0x00259590, +0x00259587,0x0025957E,0x00259575,0x0025956C,0x00259563,0x0025955A,0x00259551,0x00259548,0x0025953F,0x00259536, +0x0025952D,0x00259524,0x0025951B,0x00259512,0x00259509,0x00259500,0x002594F7,0x002594EE,0x002594E5,0x80009277, +0x81009278,0x82009279,0x8300927A,0x8400927B,0x8500927C,0x8600927D,0x8700927E,0x8800927F,0x89009280,0x8A009281, +0x8B009282,0x8C009283,0x8D009284,0x8E009285,0x8F009286,0x90009287,0x91009288,0x92009289,0x9300928A,0x9400928B, +0x9500928C,0x9600928D,0x9700928E,0x9800928F,0x99009290,0x9A009291,0x9B009292,0x9C009293,0x9D009294,0x9E009295, +0x9F009296,0xA0009297,0xA1009298,0xA2009299,0xA300929A,0xA400929B,0xA500929C,0xA600929D,0xA700929E,0xA800929F, +0xA90092A0,0xAA0092A1,0xAB0092A2,0xAC0092A3,0xAD0092A4,0xAE0092A5,0xAF0092A6,0xB00092A7,0xB10092A8,0xB20092A9, +0xB30092AA,0xB40092AB,0xB50092AC,0xB60092AD,0xB70092AE,0xB80092AF,0xB90092B0,0xBA0092B1,0xBB0092B2,0xBC0092B3, +0xBD0092B4,0xBE0092B5,0xBF0092B6,0x001993F2,0x002594DC,0x002594D3,0x002594CA,0x002594C1,0x002594B8,0x002594AF, +0x002594A6,0x0025949D,0x00259494,0x0025948B,0x00259482,0x00259479,0x00259470,0x00259467,0x0025945E,0x00259455, +0x0025944C,0x00259443,0x0025943A,0x00259431,0x00259428,0x0025941F,0x00259416,0x0025940D,0x00259404,0x002593FB, +0x002593F2,0x001992FF,0x002593E9,0x002593E0,0x002593D7,0x002593CE,0x002593C5,0x002593BC,0x002593B3,0x002593AA, +0x002593A1,0x00259398,0x0025938F,0x00259386,0x0025937D,0x00259374,0x0025936B,0x00259362,0x00259359,0x00259350, +0x00259347,0x0025933E,0x00259335,0x0025932C,0x00259323,0x0025931A,0x00259311,0x00259308,0x002592FF,0x0019920C, +0x002592F6,0x002592ED,0x002592E4,0x002592DB,0x002592D2,0x002592C9,0x002592C0,0x800092F7,0x810092F8,0x820092F9, +0x830092FA,0x840092FB,0x850092FC,0x860092FD,0x870092FE,0x880092FF,0x89009300,0x8A009301,0x8B009302,0x8C009303, +0x8D009304,0x8E009305,0x8F009306,0x90009307,0x91009308,0x92009309,0x9300930A,0x9400930B,0x9500930C,0x9600930D, +0x9700930E,0x9800930F,0x99009310,0x9A009311,0x9B009312,0x9C009313,0x9D009314,0x9E009315,0x9F009316,0xA0009317, +0xA1009318,0xA2009319,0xA300931A,0xA400931B,0xA500931C,0xA600931D,0xA700931E,0xA800931F,0xA9009320,0xAA009321, +0xAB009322,0xAC009323,0xAD009324,0xAE009325,0xAF009326,0xB0009327,0xB1009328,0xB2009329,0xB300932A,0xB400932B, +0xB500932C,0xB600932D,0xB700932E,0xB800932F,0xB9009330,0xBA009331,0xBB009332,0xBC009333,0xBD009334,0xBE009335, +0xBF009336,0x002592B7,0x002592AE,0x002592A5,0x0025929C,0x00259293,0x0025928A,0x00259281,0x00259278,0x0025926F, +0x00259266,0x0025925D,0x00259254,0x0025924B,0x00259242,0x00259239,0x00259230,0x00259227,0x0025921E,0x00259215, +0x0025920C,0x00199119,0x00259203,0x002591FA,0x002591F1,0x002591E8,0x002591DF,0x002591D6,0x002591CD,0x002591C4, +0x002591BB,0x002591B2,0x002591A9,0x002591A0,0x00259197,0x0025918E,0x00259185,0x0025917C,0x00259173,0x0025916A, +0x00259161,0x00259158,0x0025914F,0x00259146,0x0025913D,0x00259134,0x0025912B,0x00259122,0x00259119,0x00199026, +0x00259110,0x00259107,0x002590FE,0x002590F5,0x002590EC,0x002590E3,0x002590DA,0x002590D1,0x002590C8,0x002590BF, +0x002590B6,0x002590AD,0x002590A4,0x0025909B,0x00259092,0x80009377,0x81009378,0x82009379,0x8300937A,0x8400937B, +0x8500937C,0x8600937D,0x8700937E,0x8800937F,0x89009380,0x8A009381,0x8B009382,0x8C009383,0x8D009384,0x8E009385, +0x8F009386,0x90009387,0x91009388,0x92009389,0x9300938A,0x9400938B,0x9500938C,0x9600938D,0x9700938E,0x9800938F, +0x99009390,0x9A009391,0x9B009392,0x9C009393,0x9D009394,0x9E009395,0x9F009396,0xA0009397,0xA1009398,0xA2009399, +0xA300939A,0xA400939B,0xA500939C,0xA600939D,0xA700939E,0xA800939F,0xA90093A0,0xAA0093A1,0xAB0093A2,0xAC0093A3, +0xAD0093A4,0xAE0093A5,0xAF0093A6,0xB00093A7,0xB10093A8,0xB20093A9,0xB30093AA,0xB40093AB,0xB50093AC,0xB60093AD, +0xB70093AE,0xB80093AF,0xB90093B0,0xBA0093B1,0xBB0093B2,0xBC0093B3,0xBD0093B4,0xBE0093B5,0xBF0093B6,0x00259089, +0x00259080,0x00259077,0x0025906E,0x00259065,0x0025905C,0x00259053,0x0025904A,0x00259041,0x00259038,0x0025902F, +0x00259026,0x00198F33,0x0025901D,0x00259014,0x0025900B,0x00259002,0x00258FF9,0x00258FF0,0x00258FE7,0x00258FDE, +0x00258FD5,0x00258FCC,0x00258FC3,0x00258FBA,0x00258FB1,0x00258FA8,0x00258F9F,0x00258F96,0x00258F8D,0x00258F84, +0x00258F7B,0x00258F72,0x00258F69,0x00258F60,0x00258F57,0x00258F4E,0x00258F45,0x00258F3C,0x00258F33,0x00198E40, +0x00258F2A,0x00258F21,0x00258F18,0x00258F0F,0x00258F06,0x00258EFD,0x00258EF4,0x00258EEB,0x00258EE2,0x00258ED9, +0x00258ED0,0x00258EC7,0x00258EBE,0x00258EB5,0x00258EAC,0x00258EA3,0x00258E9A,0x00258E91,0x00258E88,0x00258E7F, +0x00258E76,0x00258E6D,0x00258E64,0x800093F7,0x810093F8,0x820093F9,0x830093FA,0x840093FB,0x850093FC,0x860093FD, +0x870093FE,0x880093FF,0x89009400,0x8A009401,0x8B009402,0x8C009403,0x8D009404,0x8E009405,0x8F009406,0x90009407, +0x91009408,0x92009409,0x9300940A,0x9400940B,0x9500940C,0x9600940D,0x9700940E,0x9800940F,0x99009410,0x9A009411, +0x9B009412,0x9C009413,0x9D009414,0x9E009415,0x9F009416,0xA0009417,0xA1009418,0xA2009419,0xA300941A,0xA400941B, +0xA500941C,0xA600941D,0xA700941E,0xA800941F,0xA9009420,0xAA009421,0xAB009422,0xAC009423,0xAD009424,0xAE009425, +0xAF009426,0xB0009427,0xB1009428,0xB2009429,0xB300942A,0xB400942B,0xB500942C,0xB600942D,0xB700942E,0xB800942F, +0xB9009430,0xBA009431,0xBB009432,0xBC009433,0xBD009434,0xBE009435,0xBF009436,0x00258E5B,0x00258E52,0x00258E49, +0x00258E40,0x00198D4D,0x00258E37,0x00258E2E,0x00258E25,0x00258E1C,0x00258E13,0x00258E0A,0x00258E01,0x00258DF8, +0x00258DEF,0x00258DE6,0x00258DDD,0x00258DD4,0x00258DCB,0x00258DC2,0x00258DB9,0x00258DB0,0x00258DA7,0x00258D9E, +0x00258D95,0x00258D8C,0x00258D83,0x00258D7A,0x00258D71,0x00258D68,0x00258D5F,0x00258D56,0x00258D4D,0x00198C5A, +0x00258D44,0x00258D3B,0x00258D32,0x00258D29,0x00258D20,0x00258D17,0x00258D0E,0x00258D05,0x00258CFC,0x00258CF3, +0x00258CEA,0x00258CE1,0x00258CD8,0x00258CCF,0x00258CC6,0x00258CBD,0x00258CB4,0x00258CAB,0x00258CA2,0x00258C99, +0x00258C90,0x00258C87,0x00258C7E,0x00258C75,0x00258C6C,0x00258C63,0x00258C5A,0x00198B67,0x00258C51,0x00258C48, +0x00258C3F,0x80009477,0x81009478,0x82009479,0x8300947A,0x8400947B,0x8500947C,0x8600947D,0x8700947E,0x8800947F, +0x89009480,0x8A009481,0x8B009482,0x8C009483,0x8D009484,0x8E009485,0x8F009486,0x90009487,0x91009488,0x92009489, +0x9300948A,0x9400948B,0x9500948C,0x9600948D,0x9700948E,0x9800948F,0x99009490,0x9A009491,0x9B009492,0x9C009493, +0x9D009494,0x9E009495,0x9F009496,0xA0009497,0xA1009498,0xA2009499,0xA300949A,0xA400949B,0xA500949C,0xA600949D, +0xA700949E,0xA800949F,0xA90094A0,0xAA0094A1,0xAB0094A2,0xAC0094A3,0xAD0094A4,0xAE0094A5,0xAF0094A6,0xB00094A7, +0xB10094A8,0xB20094A9,0xB30094AA,0xB40094AB,0xB50094AC,0xB60094AD,0xB70094AE,0xB80094AF,0xB90094B0,0xBA0094B1, +0xBB0094B2,0xBC0094B3,0xBD0094B4,0xBE0094B5,0xBF0094B6,0x00258C36,0x00258C2D,0x00258C24,0x00258C1B,0x00258C12, +0x00258C09,0x00258C00,0x00258BF7,0x00258BEE,0x00258BE5,0x00258BDC,0x00258BD3,0x00258BCA,0x00258BC1,0x00258BB8, +0x00258BAF,0x00258BA6,0x00258B9D,0x00258B94,0x00258B8B,0x00258B82,0x00258B79,0x00258B70,0x00258B67,0x00198A74, +0x00258B5E,0x00258B55,0x00258B4C,0x00258B43,0x00258B3A,0x00258B31,0x00258B28,0x00258B1F,0x00258B16,0x00258B0D, +0x00258B04,0x00258AFB,0x00258AF2,0x00258AE9,0x00258AE0,0x00258AD7,0x00258ACE,0x00258AC5,0x00258ABC,0x00258AB3, +0x00258AAA,0x00258AA1,0x00258A98,0x00258A8F,0x00258A86,0x00258A7D,0x00258A74,0x00198981,0x00258A6B,0x00258A62, +0x00258A59,0x00258A50,0x00258A47,0x00258A3E,0x00258A35,0x00258A2C,0x00258A23,0x00258A1A,0x00258A11,0x800094F7, +0x810094F8,0x820094F9,0x830094FA,0x840094FB,0x850094FC,0x860094FD,0x870094FE,0x880094FF,0x89009500,0x8A009501, +0x8B009502,0x8C009503,0x8D009504,0x8E009505,0x8F009506,0x90009507,0x91009508,0x92009509,0x9300950A,0x9400950B, +0x9500950C,0x9600950D,0x9700950E,0x9800950F,0x99009510,0x9A009511,0x9B009512,0x9C009513,0x9D009514,0x9E009515, +0x9F009516,0xA0009517,0xA1009518,0xA2009519,0xA300951A,0xA400951B,0xA500951C,0xA600951D,0xA700951E,0xA800951F, +0xA9009520,0xAA009521,0xAB009522,0xAC009523,0xAD009524,0xAE009525,0xAF009526,0xB0009527,0xB1009528,0xB2009529, +0xB300952A,0xB400952B,0xB500952C,0xB600952D,0xB700952E,0xB800952F,0xB9009530,0xBA009531,0xBB009532,0xBC009533, +0xBD009534,0xBE009535,0xBF009536,0x00258A08,0x002589FF,0x002589F6,0x002589ED,0x002589E4,0x002589DB,0x002589D2, +0x002589C9,0x002589C0,0x002589B7,0x002589AE,0x002589A5,0x0025899C,0x00258993,0x0025898A,0x00258981,0x0019888E, +0x00258978,0x0025896F,0x00258966,0x0025895D,0x00258954,0x0025894B,0x00258942,0x00258939,0x00258930,0x00258927, +0x0025891E,0x00258915,0x0025890C,0x00258903,0x002588FA,0x002588F1,0x002588E8,0x002588DF,0x002588D6,0x002588CD, +0x002588C4,0x002588BB,0x002588B2,0x002588A9,0x002588A0,0x00258897,0x0025888E,0x0019879B,0x00258885,0x0025887C, +0x00258873,0x0025886A,0x00258861,0x00258858,0x0025884F,0x00258846,0x0025883D,0x00258834,0x0025882B,0x00258822, +0x00258819,0x00258810,0x00258807,0x002587FE,0x002587F5,0x002587EC,0x002587E3,0x80009577,0x81009578,0x82009579, +0x8300957A,0x8400957B,0x8500957C,0x8600957D,0x8700957E,0x8800957F,0x89009580,0x8A009581,0x8B009582,0x8C009583, +0x8D009584,0x8E009585,0x8F009586,0x90009587,0x91009588,0x92009589,0x9300958A,0x9400958B,0x9500958C,0x9600958D, +0x9700958E,0x9800958F,0x99009590,0x9A009591,0x9B009592,0x9C009593,0x9D009594,0x9E009595,0x9F009596,0xA0009597, +0xA1009598,0xA2009599,0xA300959A,0xA400959B,0xA500959C,0xA600959D,0xA700959E,0xA800959F,0xA90095A0,0xAA0095A1, +0xAB0095A2,0xAC0095A3,0xAD0095A4,0xAE0095A5,0xAF0095A6,0xB00095A7,0xB10095A8,0xB20095A9,0xB30095AA,0xB40095AB, +0xB50095AC,0xB60095AD,0xB70095AE,0xB80095AF,0xB90095B0,0xBA0095B1,0xBB0095B2,0xBC0095B3,0xBD0095B4,0xBE0095B5, +0xBF0095B6,0x002587DA,0x002587D1,0x002587C8,0x002587BF,0x002587B6,0x002587AD,0x002587A4,0x0025879B,0x001986A8, +0x00258792,0x00258789,0x00258780,0x00258777,0x0025876E,0x00258765,0x0025875C,0x00258753,0x0025874A,0x00258741, +0x00258738,0x0025872F,0x00258726,0x0025871D,0x00258714,0x0025870B,0x00258702,0x002586F9,0x002586F0,0x002586E7, +0x002586DE,0x002586D5,0x002586CC,0x002586C3,0x002586BA,0x002586B1,0x002586A8,0x001985B5,0x0025869F,0x00258696, +0x0025868D,0x00258684,0x0025867B,0x00258672,0x00258669,0x00258660,0x00258657,0x0025864E,0x00258645,0x0025863C, +0x00258633,0x0025862A,0x00258621,0x00258618,0x0025860F,0x00258606,0x002585FD,0x002585F4,0x002585EB,0x002585E2, +0x002585D9,0x002585D0,0x002585C7,0x002585BE,0x002585B5,0x800095F7,0x810095F8,0x820095F9,0x830095FA,0x840095FB, +0x850095FC,0x860095FD,0x870095FE,0x880095FF,0x89009600,0x8A009601,0x8B009602,0x8C009603,0x8D009604,0x8E009605, +0x8F009606,0x90009607,0x91009608,0x92009609,0x9300960A,0x9400960B,0x9500960C,0x9600960D,0x9700960E,0x9800960F, +0x99009610,0x9A009611,0x9B009612,0x9C009613,0x9D009614,0x9E009615,0x9F009616,0xA0009617,0xA1009618,0xA2009619, +0xA300961A,0xA400961B,0xA500961C,0xA600961D,0xA700961E,0xA800961F,0xA9009620,0xAA009621,0xAB009622,0xAC009623, +0xAD009624,0xAE009625,0xAF009626,0xB0009627,0xB1009628,0xB2009629,0xB300962A,0xB400962B,0xB500962C,0xB600962D, +0xB700962E,0xB800962F,0xB9009630,0xBA009631,0xBB009632,0xBC009633,0xBD009634,0xBE009635,0xBF009636,0x001984C2, +0x002585AC,0x002585A3,0x0025859A,0x00258591,0x00258588,0x0025857F,0x00258576,0x0025856D,0x00258564,0x0025855B, +0x00258552,0x00258549,0x00258540,0x00258537,0x0025852E,0x00258525,0x0025851C,0x00258513,0x0025850A,0x00258501, +0x002584F8,0x002584EF,0x002584E6,0x002584DD,0x002584D4,0x002584CB,0x002584C2,0x001983CF,0x002584B9,0x002584B0, +0x002584A7,0x0025849E,0x00258495,0x0025848C,0x00258483,0x0025847A,0x00258471,0x00258468,0x0025845F,0x00258456, +0x0025844D,0x00258444,0x0025843B,0x00258432,0x00258429,0x00258420,0x00258417,0x0025840E,0x00258405,0x002583FC, +0x002583F3,0x002583EA,0x002583E1,0x002583D8,0x002583CF,0x001982DC,0x002583C6,0x002583BD,0x002583B4,0x002583AB, +0x002583A2,0x00258399,0x00258390,0x80009677,0x81009678,0x82009679,0x8300967A,0x8400967B,0x8500967C,0x8600967D, +0x8700967E,0x8800967F,0x89009680,0x8A009681,0x8B009682,0x8C009683,0x8D009684,0x8E009685,0x8F009686,0x90009687, +0x91009688,0x92009689,0x9300968A,0x9400968B,0x9500968C,0x9600968D,0x9700968E,0x9800968F,0x99009690,0x9A009691, +0x9B009692,0x9C009693,0x9D009694,0x9E009695,0x9F009696,0xA0009697,0xA1009698,0xA2009699,0xA300969A,0xA400969B, +0xA500969C,0xA600969D,0xA700969E,0xA800969F,0xA90096A0,0xAA0096A1,0xAB0096A2,0xAC0096A3,0xAD0096A4,0xAE0096A5, +0xAF0096A6,0xB00096A7,0xB10096A8,0xB20096A9,0xB30096AA,0xB40096AB,0xB50096AC,0xB60096AD,0xB70096AE,0xB80096AF, +0xB90096B0,0xBA0096B1,0xBB0096B2,0xBC0096B3,0xBD0096B4,0xBE0096B5,0xBF0096B6,0x00258387,0x0025837E,0x00258375, +0x0025836C,0x00258363,0x0025835A,0x00258351,0x00258348,0x0025833F,0x00258336,0x0025832D,0x00258324,0x0025831B, +0x00258312,0x00258309,0x00258300,0x002582F7,0x002582EE,0x002582E5,0x002582DC,0x001981E9,0x002582D3,0x002582CA, +0x002582C1,0x002582B8,0x002582AF,0x002582A6,0x0025829D,0x00258294,0x0025828B,0x00258282,0x00258279,0x00258270, +0x00258267,0x0025825E,0x00258255,0x0025824C,0x00258243,0x0025823A,0x00258231,0x00258228,0x0025821F,0x00258216, +0x0025820D,0x00258204,0x002581FB,0x002581F2,0x002581E9,0x001980F6,0x002581E0,0x002581D7,0x002581CE,0x002581C5, +0x002581BC,0x002581B3,0x002581AA,0x002581A1,0x00258198,0x0025818F,0x00258186,0x0025817D,0x00258174,0x0025816B, +0x00258162,0x800096F7,0x810096F8,0x820096F9,0x830096FA,0x840096FB,0x850096FC,0x860096FD,0x870096FE,0x880096FF, +0x89009700,0x8A009701,0x8B009702,0x8C009703,0x8D009704,0x8E009705,0x8F009706,0x90009707,0x91009708,0x92009709, +0x9300970A,0x9400970B,0x9500970C,0x9600970D,0x9700970E,0x9800970F,0x99009710,0x9A009711,0x9B009712,0x9C009713, +0x9D009714,0x9E009715,0x9F009716,0xA0009717,0xA1009718,0xA2009719,0xA300971A,0xA400971B,0xA500971C,0xA600971D, +0xA700971E,0xA800971F,0xA9009720,0xAA009721,0xAB009722,0xAC009723,0xAD009724,0xAE009725,0xAF009726,0xB0009727, +0xB1009728,0xB2009729,0xB300972A,0xB400972B,0xB500972C,0xB600972D,0xB700972E,0xB800972F,0xB9009730,0xBA009731, +0xBB009732,0xBC009733,0xBD009734,0xBE009735,0xBF009736,0x00258159,0x00258150,0x00258147,0x0025813E,0x00258135, +0x0025812C,0x00258123,0x0025811A,0x00258111,0x00258108,0x002580FF,0x002580F6,0x00198003,0x002580ED,0x002580E4, +0x002580DB,0x002580D2,0x002580C9,0x002580C0,0x002580B7,0x002580AE,0x002580A5,0x0025809C,0x00258093,0x0025808A, +0x00258081,0x00258078,0x0025806F,0x00258066,0x0025805D,0x00258054,0x0025804B,0x00258042,0x00258039,0x00258030, +0x00258027,0x0025801E,0x00258015,0x0025800C,0x00258003,0x00197F10,0x00257FFA,0x00257FF1,0x00257FE8,0x00257FDF, +0x00257FD6,0x00257FCD,0x00257FC4,0x00257FBB,0x00257FB2,0x00257FA9,0x00257FA0,0x00257F97,0x00257F8E,0x00257F85, +0x00257F7C,0x00257F73,0x00257F6A,0x00257F61,0x00257F58,0x00257F4F,0x00257F46,0x00257F3D,0x00257F34,0x80009777, +0x81009778,0x82009779,0x8300977A,0x8400977B,0x8500977C,0x8600977D,0x8700977E,0x8800977F,0x89009780,0x8A009781, +0x8B009782,0x8C009783,0x8D009784,0x8E009785,0x8F009786,0x90009787,0x91009788,0x92009789,0x9300978A,0x9400978B, +0x9500978C,0x9600978D,0x9700978E,0x9800978F,0x99009790,0x9A009791,0x9B009792,0x9C009793,0x9D009794,0x9E009795, +0x9F009796,0xA0009797,0xA1009798,0xA2009799,0xA300979A,0xA400979B,0xA500979C,0xA600979D,0xA700979E,0xA800979F, +0xA90097A0,0xAA0097A1,0xAB0097A2,0xAC0097A3,0xAD0097A4,0xAE0097A5,0xAF0097A6,0xB00097A7,0xB10097A8,0xB20097A9, +0xB30097AA,0xB40097AB,0xB50097AC,0xB60097AD,0xB70097AE,0xB80097AF,0xB90097B0,0xBA0097B1,0xBB0097B2,0xBC0097B3, +0xBD0097B4,0xBE0097B5,0xBF0097B6,0x8700D010,0x00257F2B,0x00257F22,0x00257F19,0x00257F10,0x00197E1D,0x00257F07, +0x00257EFE,0x00257EF5,0x00257EEC,0x00257EE3,0x00257EDA,0x00257ED1,0x00257EC8,0x00257EBF,0x00257EB6,0x00257EAD, +0x00257EA4,0x00257E9B,0x00257E92,0x00257E89,0x00257E80,0x00257E77,0x00257E6E,0x00257E65,0x00257E5C,0x00257E53, +0x00257E4A,0x00257E41,0x00257E38,0x00257E2F,0x00257E26,0x00257E1D,0x00197D2A,0x00257E14,0x00257E0B,0x00257E02, +0x00257DF9,0x00257DF0,0x00257DE7,0x00257DDE,0x00257DD5,0x00257DCC,0x00257DC3,0x00257DBA,0x00257DB1,0x00257DA8, +0x00257D9F,0x00257D96,0x00257D8D,0x00257D84,0x00257D7B,0x00257D72,0x00257D69,0x00257D60,0x00257D57,0x00257D4E, +0x00257D45,0x00257D3C,0x00257D33,0x00257D2A,0x00197C37,0x00257D21,0x00257D18,0x800097F7,0x81009838,0x820098B8, +0x83009938,0x840099B8,0x85009A38,0x86009AB8,0x87009B38,0x88009BB8,0x89009C38,0x8A009CB8,0x8B009D38,0x8C009DB8, +0x8D009E38,0x8E009EB8,0x8F009F38,0x90009FB8,0x9100A038,0x9200A0B8,0x9300A138,0x9400A1B8,0x9500A238,0x9600A2B8, +0x9700A338,0x9800A3B8,0x9900A438,0x9A00A4B8,0x9B00A538,0x9C00A5B8,0x9D00A638,0x9E00A6B8,0x9F00A738,0xA000A7B8, +0xA100A838,0xA200A8B8,0xA300A938,0xA400A9B8,0xA500AA38,0xA600AAB8,0xA700AB38,0xA800ABB8,0xA900AC38,0xAA00ACB8, +0xAB00AD38,0xAC00ADB8,0xAD00AE38,0xAE00AEB8,0xAF00AF38,0xB000AFB8,0xB100B038,0xB200B0B8,0xB300B138,0xB400B1B8, +0xB500B238,0xB600B2B8,0xB700B338,0xB800B3B8,0xB900B438,0xBA00B4B8,0xBB00B538,0xBC00B5B8,0xBD00B638,0xBE00B6B8, +0xBF00B738,0x800097F8,0x810097F9,0x820097FA,0x830097FB,0x840097FC,0x850097FD,0x860097FE,0x870097FF,0x88009800, +0x89009801,0x8A009802,0x8B009803,0x8C009804,0x8D009805,0x8E009806,0x8F009807,0x90009808,0x91009809,0x9200980A, +0x9300980B,0x9400980C,0x9500980D,0x9600980E,0x9700980F,0x98009810,0x99009811,0x9A009812,0x9B009813,0x9C009814, +0x9D009815,0x9E009816,0x9F009817,0xA0009818,0xA1009819,0xA200981A,0xA300981B,0xA400981C,0xA500981D,0xA600981E, +0xA700981F,0xA8009820,0xA9009821,0xAA009822,0xAB009823,0xAC009824,0xAD009825,0xAE009826,0xAF009827,0xB0009828, +0xB1009829,0xB200982A,0xB300982B,0xB400982C,0xB500982D,0xB600982E,0xB700982F,0xB8009830,0xB9009831,0xBA009832, +0xBB009833,0xBC009834,0xBD009835,0xBE009836,0xBF0098B7,0x00257D0F,0x800098F8,0x810098F9,0x820098FA,0x830098FB, +0x840098FC,0x850098FD,0x860098FE,0x870098FF,0x88009900,0x89009901,0x8A009902,0x8B009903,0x8C009904,0x8D009905, +0x8E009906,0x8F009907,0x90009908,0x91009909,0x9200990A,0x9300990B,0x9400990C,0x9500990D,0x9600990E,0x9700990F, +0x98009910,0x99009911,0x9A009912,0x9B009913,0x9C009914,0x9D009915,0x9E009916,0x9F009917,0xA0009918,0xA1009919, +0xA200991A,0xA300991B,0xA400991C,0xA500991D,0xA600991E,0xA700991F,0xA8009920,0xA9009921,0xAA009922,0xAB009923, +0xAC009924,0xAD009925,0xAE009926,0xAF009927,0xB0009928,0xB1009929,0xB200992A,0xB300992B,0xB400992C,0xB500992D, +0xB600992E,0xB700992F,0xB8009930,0xB9009931,0xBA009932,0xBB009933,0xBC009934,0xBD009935,0xBE009936,0xBF009937, +0x00257D06,0x00257CFD,0x00257CF4,0x00257CEB,0x00257CE2,0x00257CD9,0x00257CD0,0x00257CC7,0x00257CBE,0x00257CB5, +0x00257CAC,0x00257CA3,0x00257C9A,0x00257C91,0x00257C88,0x00257C7F,0x00257C76,0x00257C6D,0x00257C64,0x00257C5B, +0x00257C52,0x00257C49,0x00257C40,0x00257C37,0x00197B44,0x00257C2E,0x00257C25,0x00257C1C,0x00257C13,0x00257C0A, +0x00257C01,0x00257BF8,0x00257BEF,0x00257BE6,0x00257BDD,0x00257BD4,0x00257BCB,0x00257BC2,0x00257BB9,0x00257BB0, +0x00257BA7,0x00257B9E,0x00257B95,0x00257B8C,0x00257B83,0x00257B7A,0x00257B71,0x00257B68,0x00257B5F,0x00257B56, +0x00257B4D,0x00257B44,0x00197A51,0x00257B3B,0x00257B32,0x00257B29,0x00257B20,0x00257B17,0x00257B0E,0x00257B05, +0x00257AFC,0x00257AF3,0x00257AEA,0x00257AE1,0x80009978,0x81009979,0x8200997A,0x8300997B,0x8400997C,0x8500997D, +0x8600997E,0x8700997F,0x88009980,0x89009981,0x8A009982,0x8B009983,0x8C009984,0x8D009985,0x8E009986,0x8F009987, +0x90009988,0x91009989,0x9200998A,0x9300998B,0x9400998C,0x9500998D,0x9600998E,0x9700998F,0x98009990,0x99009991, +0x9A009992,0x9B009993,0x9C009994,0x9D009995,0x9E009996,0x9F009997,0xA0009998,0xA1009999,0xA200999A,0xA300999B, +0xA400999C,0xA500999D,0xA600999E,0xA700999F,0xA80099A0,0xA90099A1,0xAA0099A2,0xAB0099A3,0xAC0099A4,0xAD0099A5, +0xAE0099A6,0xAF0099A7,0xB00099A8,0xB10099A9,0xB20099AA,0xB30099AB,0xB40099AC,0xB50099AD,0xB60099AE,0xB70099AF, +0xB80099B0,0xB90099B1,0xBA0099B2,0xBB0099B3,0xBC0099B4,0xBD0099B5,0xBE0099B6,0xBF0099B7,0x00257AD8,0x00257ACF, +0x00257AC6,0x00257ABD,0x00257AB4,0x00257AAB,0x00257AA2,0x00257A99,0x00257A90,0x00257A87,0x00257A7E,0x00257A75, +0x00257A6C,0x00257A63,0x00257A5A,0x00257A51,0x0019795E,0x00257A48,0x00257A3F,0x00257A36,0x00257A2D,0x00257A24, +0x00257A1B,0x00257A12,0x00257A09,0x00257A00,0x002579F7,0x002579EE,0x002579E5,0x002579DC,0x002579D3,0x002579CA, +0x002579C1,0x002579B8,0x002579AF,0x002579A6,0x0025799D,0x00257994,0x0025798B,0x00257982,0x00257979,0x00257970, +0x00257967,0x0025795E,0x0019786B,0x00257955,0x0025794C,0x00257943,0x0025793A,0x00257931,0x00257928,0x0025791F, +0x00257916,0x0025790D,0x00257904,0x002578FB,0x002578F2,0x002578E9,0x002578E0,0x002578D7,0x002578CE,0x002578C5, +0x002578BC,0x002578B3,0x800099F8,0x810099F9,0x820099FA,0x830099FB,0x840099FC,0x850099FD,0x860099FE,0x870099FF, +0x88009A00,0x89009A01,0x8A009A02,0x8B009A03,0x8C009A04,0x8D009A05,0x8E009A06,0x8F009A07,0x90009A08,0x91009A09, +0x92009A0A,0x93009A0B,0x94009A0C,0x95009A0D,0x96009A0E,0x97009A0F,0x98009A10,0x99009A11,0x9A009A12,0x9B009A13, +0x9C009A14,0x9D009A15,0x9E009A16,0x9F009A17,0xA0009A18,0xA1009A19,0xA2009A1A,0xA3009A1B,0xA4009A1C,0xA5009A1D, +0xA6009A1E,0xA7009A1F,0xA8009A20,0xA9009A21,0xAA009A22,0xAB009A23,0xAC009A24,0xAD009A25,0xAE009A26,0xAF009A27, +0xB0009A28,0xB1009A29,0xB2009A2A,0xB3009A2B,0xB4009A2C,0xB5009A2D,0xB6009A2E,0xB7009A2F,0xB8009A30,0xB9009A31, +0xBA009A32,0xBB009A33,0xBC009A34,0xBD009A35,0xBE009A36,0xBF009A37,0x002578AA,0x002578A1,0x00257898,0x0025788F, +0x00257886,0x0025787D,0x00257874,0x0025786B,0x00197778,0x00257862,0x00257859,0x00257850,0x00257847,0x0025783E, +0x00257835,0x0025782C,0x00257823,0x0025781A,0x00257811,0x00257808,0x002577FF,0x002577F6,0x002577ED,0x002577E4, +0x002577DB,0x002577D2,0x002577C9,0x002577C0,0x002577B7,0x002577AE,0x002577A5,0x0025779C,0x00257793,0x0025778A, +0x00257781,0x00257778,0x00197685,0x0025776F,0x00257766,0x0025775D,0x00257754,0x0025774B,0x00257742,0x00257739, +0x00257730,0x00257727,0x0025771E,0x00257715,0x0025770C,0x00257703,0x002576FA,0x002576F1,0x002576E8,0x002576DF, +0x002576D6,0x002576CD,0x002576C4,0x002576BB,0x002576B2,0x002576A9,0x002576A0,0x00257697,0x0025768E,0x00257685, +0x80009A78,0x81009A79,0x82009A7A,0x83009A7B,0x84009A7C,0x85009A7D,0x86009A7E,0x87009A7F,0x88009A80,0x89009A81, +0x8A009A82,0x8B009A83,0x8C009A84,0x8D009A85,0x8E009A86,0x8F009A87,0x90009A88,0x91009A89,0x92009A8A,0x93009A8B, +0x94009A8C,0x95009A8D,0x96009A8E,0x97009A8F,0x98009A90,0x99009A91,0x9A009A92,0x9B009A93,0x9C009A94,0x9D009A95, +0x9E009A96,0x9F009A97,0xA0009A98,0xA1009A99,0xA2009A9A,0xA3009A9B,0xA4009A9C,0xA5009A9D,0xA6009A9E,0xA7009A9F, +0xA8009AA0,0xA9009AA1,0xAA009AA2,0xAB009AA3,0xAC009AA4,0xAD009AA5,0xAE009AA6,0xAF009AA7,0xB0009AA8,0xB1009AA9, +0xB2009AAA,0xB3009AAB,0xB4009AAC,0xB5009AAD,0xB6009AAE,0xB7009AAF,0xB8009AB0,0xB9009AB1,0xBA009AB2,0xBB009AB3, +0xBC009AB4,0xBD009AB5,0xBE009AB6,0xBF009AB7,0x00197592,0x0025767C,0x00257673,0x0025766A,0x00257661,0x00257658, +0x0025764F,0x00257646,0x0025763D,0x00257634,0x0025762B,0x00257622,0x00257619,0x00257610,0x00257607,0x002575FE, +0x002575F5,0x002575EC,0x002575E3,0x002575DA,0x002575D1,0x002575C8,0x002575BF,0x002575B6,0x002575AD,0x002575A4, +0x0025759B,0x00257592,0x0019749F,0x00257589,0x00257580,0x00257577,0x0025756E,0x00257565,0x0025755C,0x00257553, +0x0025754A,0x00257541,0x00257538,0x0025752F,0x00257526,0x0025751D,0x00257514,0x0025750B,0x00257502,0x002574F9, +0x002574F0,0x002574E7,0x002574DE,0x002574D5,0x002574CC,0x002574C3,0x002574BA,0x002574B1,0x002574A8,0x0025749F, +0x001973AC,0x00257496,0x0025748D,0x00257484,0x0025747B,0x00257472,0x00257469,0x00257460,0x80009AF8,0x81009AF9, +0x82009AFA,0x83009AFB,0x84009AFC,0x85009AFD,0x86009AFE,0x87009AFF,0x88009B00,0x89009B01,0x8A009B02,0x8B009B03, +0x8C009B04,0x8D009B05,0x8E009B06,0x8F009B07,0x90009B08,0x91009B09,0x92009B0A,0x93009B0B,0x94009B0C,0x95009B0D, +0x96009B0E,0x97009B0F,0x98009B10,0x99009B11,0x9A009B12,0x9B009B13,0x9C009B14,0x9D009B15,0x9E009B16,0x9F009B17, +0xA0009B18,0xA1009B19,0xA2009B1A,0xA3009B1B,0xA4009B1C,0xA5009B1D,0xA6009B1E,0xA7009B1F,0xA8009B20,0xA9009B21, +0xAA009B22,0xAB009B23,0xAC009B24,0xAD009B25,0xAE009B26,0xAF009B27,0xB0009B28,0xB1009B29,0xB2009B2A,0xB3009B2B, +0xB4009B2C,0xB5009B2D,0xB6009B2E,0xB7009B2F,0xB8009B30,0xB9009B31,0xBA009B32,0xBB009B33,0xBC009B34,0xBD009B35, +0xBE009B36,0xBF009B37,0x00257457,0x0025744E,0x00257445,0x0025743C,0x00257433,0x0025742A,0x00257421,0x00257418, +0x0025740F,0x00257406,0x002573FD,0x002573F4,0x002573EB,0x002573E2,0x002573D9,0x002573D0,0x002573C7,0x002573BE, +0x002573B5,0x002573AC,0x001972B9,0x002573A3,0x0025739A,0x00257391,0x00257388,0x0025737F,0x00257376,0x0025736D, +0x00257364,0x0025735B,0x00257352,0x00257349,0x00257340,0x00257337,0x0025732E,0x00257325,0x0025731C,0x00257313, +0x0025730A,0x00257301,0x002572F8,0x002572EF,0x002572E6,0x002572DD,0x002572D4,0x002572CB,0x002572C2,0x002572B9, +0x001971C6,0x002572B0,0x002572A7,0x0025729E,0x00257295,0x0025728C,0x00257283,0x0025727A,0x00257271,0x00257268, +0x0025725F,0x00257256,0x0025724D,0x00257244,0x0025723B,0x00257232,0x80009B78,0x81009B79,0x82009B7A,0x83009B7B, +0x84009B7C,0x85009B7D,0x86009B7E,0x87009B7F,0x88009B80,0x89009B81,0x8A009B82,0x8B009B83,0x8C009B84,0x8D009B85, +0x8E009B86,0x8F009B87,0x90009B88,0x91009B89,0x92009B8A,0x93009B8B,0x94009B8C,0x95009B8D,0x96009B8E,0x97009B8F, +0x98009B90,0x99009B91,0x9A009B92,0x9B009B93,0x9C009B94,0x9D009B95,0x9E009B96,0x9F009B97,0xA0009B98,0xA1009B99, +0xA2009B9A,0xA3009B9B,0xA4009B9C,0xA5009B9D,0xA6009B9E,0xA7009B9F,0xA8009BA0,0xA9009BA1,0xAA009BA2,0xAB009BA3, +0xAC009BA4,0xAD009BA5,0xAE009BA6,0xAF009BA7,0xB0009BA8,0xB1009BA9,0xB2009BAA,0xB3009BAB,0xB4009BAC,0xB5009BAD, +0xB6009BAE,0xB7009BAF,0xB8009BB0,0xB9009BB1,0xBA009BB2,0xBB009BB3,0xBC009BB4,0xBD009BB5,0xBE009BB6,0xBF009BB7, +0x00257229,0x00257220,0x00257217,0x0025720E,0x00257205,0x002571FC,0x002571F3,0x002571EA,0x002571E1,0x002571D8, +0x002571CF,0x002571C6,0x001970D3,0x002571BD,0x002571B4,0x002571AB,0x002571A2,0x00257199,0x00257190,0x00257187, +0x0025717E,0x00257175,0x0025716C,0x00257163,0x0025715A,0x00257151,0x00257148,0x0025713F,0x00257136,0x0025712D, +0x00257124,0x0025711B,0x00257112,0x00257109,0x00257100,0x002570F7,0x002570EE,0x002570E5,0x002570DC,0x002570D3, +0x00196FE0,0x002570CA,0x002570C1,0x002570B8,0x002570AF,0x002570A6,0x0025709D,0x00257094,0x0025708B,0x00257082, +0x00257079,0x00257070,0x00257067,0x0025705E,0x00257055,0x0025704C,0x00257043,0x0025703A,0x00257031,0x00257028, +0x0025701F,0x00257016,0x0025700D,0x00257004,0x80009BF8,0x81009BF9,0x82009BFA,0x83009BFB,0x84009BFC,0x85009BFD, +0x86009BFE,0x87009BFF,0x88009C00,0x89009C01,0x8A009C02,0x8B009C03,0x8C009C04,0x8D009C05,0x8E009C06,0x8F009C07, +0x90009C08,0x91009C09,0x92009C0A,0x93009C0B,0x94009C0C,0x95009C0D,0x96009C0E,0x97009C0F,0x98009C10,0x99009C11, +0x9A009C12,0x9B009C13,0x9C009C14,0x9D009C15,0x9E009C16,0x9F009C17,0xA0009C18,0xA1009C19,0xA2009C1A,0xA3009C1B, +0xA4009C1C,0xA5009C1D,0xA6009C1E,0xA7009C1F,0xA8009C20,0xA9009C21,0xAA009C22,0xAB009C23,0xAC009C24,0xAD009C25, +0xAE009C26,0xAF009C27,0xB0009C28,0xB1009C29,0xB2009C2A,0xB3009C2B,0xB4009C2C,0xB5009C2D,0xB6009C2E,0xB7009C2F, +0xB8009C30,0xB9009C31,0xBA009C32,0xBB009C33,0xBC009C34,0xBD009C35,0xBE009C36,0xBF009C37,0x00256FFB,0x00256FF2, +0x00256FE9,0x00256FE0,0x00196EED,0x00256FD7,0x00256FCE,0x00256FC5,0x00256FBC,0x00256FB3,0x00256FAA,0x00256FA1, +0x00256F98,0x00256F8F,0x00256F86,0x00256F7D,0x00256F74,0x00256F6B,0x00256F62,0x00256F59,0x00256F50,0x00256F47, +0x00256F3E,0x00256F35,0x00256F2C,0x00256F23,0x00256F1A,0x00256F11,0x00256F08,0x00256EFF,0x00256EF6,0x00256EED, +0x00196DFA,0x00256EE4,0x00256EDB,0x00256ED2,0x00256EC9,0x00256EC0,0x00256EB7,0x00256EAE,0x00256EA5,0x00256E9C, +0x00256E93,0x00256E8A,0x00256E81,0x00256E78,0x00256E6F,0x00256E66,0x00256E5D,0x00256E54,0x00256E4B,0x00256E42, +0x00256E39,0x00256E30,0x00256E27,0x00256E1E,0x00256E15,0x00256E0C,0x00256E03,0x00256DFA,0x00196D07,0x00256DF1, +0x00256DE8,0x00256DDF,0x80009C78,0x81009C79,0x82009C7A,0x83009C7B,0x84009C7C,0x85009C7D,0x86009C7E,0x87009C7F, +0x88009C80,0x89009C81,0x8A009C82,0x8B009C83,0x8C009C84,0x8D009C85,0x8E009C86,0x8F009C87,0x90009C88,0x91009C89, +0x92009C8A,0x93009C8B,0x94009C8C,0x95009C8D,0x96009C8E,0x97009C8F,0x98009C90,0x99009C91,0x9A009C92,0x9B009C93, +0x9C009C94,0x9D009C95,0x9E009C96,0x9F009C97,0xA0009C98,0xA1009C99,0xA2009C9A,0xA3009C9B,0xA4009C9C,0xA5009C9D, +0xA6009C9E,0xA7009C9F,0xA8009CA0,0xA9009CA1,0xAA009CA2,0xAB009CA3,0xAC009CA4,0xAD009CA5,0xAE009CA6,0xAF009CA7, +0xB0009CA8,0xB1009CA9,0xB2009CAA,0xB3009CAB,0xB4009CAC,0xB5009CAD,0xB6009CAE,0xB7009CAF,0xB8009CB0,0xB9009CB1, +0xBA009CB2,0xBB009CB3,0xBC009CB4,0xBD009CB5,0xBE009CB6,0xBF009CB7,0x00256DD6,0x00256DCD,0x00256DC4,0x00256DBB, +0x00256DB2,0x00256DA9,0x00256DA0,0x00256D97,0x00256D8E,0x00256D85,0x00256D7C,0x00256D73,0x00256D6A,0x00256D61, +0x00256D58,0x00256D4F,0x00256D46,0x00256D3D,0x00256D34,0x00256D2B,0x00256D22,0x00256D19,0x00256D10,0x00256D07, +0x00196C14,0x00256CFE,0x00256CF5,0x00256CEC,0x00256CE3,0x00256CDA,0x00256CD1,0x00256CC8,0x00256CBF,0x00256CB6, +0x00256CAD,0x00256CA4,0x00256C9B,0x00256C92,0x00256C89,0x00256C80,0x00256C77,0x00256C6E,0x00256C65,0x00256C5C, +0x00256C53,0x00256C4A,0x00256C41,0x00256C38,0x00256C2F,0x00256C26,0x00256C1D,0x00256C14,0x00196B21,0x00256C0B, +0x00256C02,0x00256BF9,0x00256BF0,0x00256BE7,0x00256BDE,0x00256BD5,0x00256BCC,0x00256BC3,0x00256BBA,0x00256BB1, +0x80009CF8,0x81009CF9,0x82009CFA,0x83009CFB,0x84009CFC,0x85009CFD,0x86009CFE,0x87009CFF,0x88009D00,0x89009D01, +0x8A009D02,0x8B009D03,0x8C009D04,0x8D009D05,0x8E009D06,0x8F009D07,0x90009D08,0x91009D09,0x92009D0A,0x93009D0B, +0x94009D0C,0x95009D0D,0x96009D0E,0x97009D0F,0x98009D10,0x99009D11,0x9A009D12,0x9B009D13,0x9C009D14,0x9D009D15, +0x9E009D16,0x9F009D17,0xA0009D18,0xA1009D19,0xA2009D1A,0xA3009D1B,0xA4009D1C,0xA5009D1D,0xA6009D1E,0xA7009D1F, +0xA8009D20,0xA9009D21,0xAA009D22,0xAB009D23,0xAC009D24,0xAD009D25,0xAE009D26,0xAF009D27,0xB0009D28,0xB1009D29, +0xB2009D2A,0xB3009D2B,0xB4009D2C,0xB5009D2D,0xB6009D2E,0xB7009D2F,0xB8009D30,0xB9009D31,0xBA009D32,0xBB009D33, +0xBC009D34,0xBD009D35,0xBE009D36,0xBF009D37,0x00256BA8,0x00256B9F,0x00256B96,0x00256B8D,0x00256B84,0x00256B7B, +0x00256B72,0x00256B69,0x00256B60,0x00256B57,0x00256B4E,0x00256B45,0x00256B3C,0x00256B33,0x00256B2A,0x00256B21, +0x00196A2E,0x00256B18,0x00256B0F,0x00256B06,0x00256AFD,0x00256AF4,0x00256AEB,0x00256AE2,0x00256AD9,0x00256AD0, +0x00256AC7,0x00256ABE,0x00256AB5,0x00256AAC,0x00256AA3,0x00256A9A,0x00256A91,0x00256A88,0x00256A7F,0x00256A76, +0x00256A6D,0x00256A64,0x00256A5B,0x00256A52,0x00256A49,0x00256A40,0x00256A37,0x00256A2E,0x0019693B,0x00256A25, +0x00256A1C,0x00256A13,0x00256A0A,0x00256A01,0x002569F8,0x002569EF,0x002569E6,0x002569DD,0x002569D4,0x002569CB, +0x002569C2,0x002569B9,0x002569B0,0x002569A7,0x0025699E,0x00256995,0x0025698C,0x00256983,0x80009D78,0x81009D79, +0x82009D7A,0x83009D7B,0x84009D7C,0x85009D7D,0x86009D7E,0x87009D7F,0x88009D80,0x89009D81,0x8A009D82,0x8B009D83, +0x8C009D84,0x8D009D85,0x8E009D86,0x8F009D87,0x90009D88,0x91009D89,0x92009D8A,0x93009D8B,0x94009D8C,0x95009D8D, +0x96009D8E,0x97009D8F,0x98009D90,0x99009D91,0x9A009D92,0x9B009D93,0x9C009D94,0x9D009D95,0x9E009D96,0x9F009D97, +0xA0009D98,0xA1009D99,0xA2009D9A,0xA3009D9B,0xA4009D9C,0xA5009D9D,0xA6009D9E,0xA7009D9F,0xA8009DA0,0xA9009DA1, +0xAA009DA2,0xAB009DA3,0xAC009DA4,0xAD009DA5,0xAE009DA6,0xAF009DA7,0xB0009DA8,0xB1009DA9,0xB2009DAA,0xB3009DAB, +0xB4009DAC,0xB5009DAD,0xB6009DAE,0xB7009DAF,0xB8009DB0,0xB9009DB1,0xBA009DB2,0xBB009DB3,0xBC009DB4,0xBD009DB5, +0xBE009DB6,0xBF009DB7,0x0025697A,0x00256971,0x00256968,0x0025695F,0x00256956,0x0025694D,0x00256944,0x0025693B, +0x00196848,0x00256932,0x00256929,0x00256920,0x00256917,0x0025690E,0x00256905,0x002568FC,0x002568F3,0x002568EA, +0x002568E1,0x002568D8,0x002568CF,0x002568C6,0x002568BD,0x002568B4,0x002568AB,0x002568A2,0x00256899,0x00256890, +0x00256887,0x0025687E,0x00256875,0x0025686C,0x00256863,0x0025685A,0x00256851,0x00256848,0x00196755,0x0025683F, +0x00256836,0x0025682D,0x00256824,0x0025681B,0x00256812,0x00256809,0x00256800,0x002567F7,0x002567EE,0x002567E5, +0x002567DC,0x002567D3,0x002567CA,0x002567C1,0x002567B8,0x002567AF,0x002567A6,0x0025679D,0x00256794,0x0025678B, +0x00256782,0x00256779,0x00256770,0x00256767,0x0025675E,0x00256755,0x80009DF8,0x81009DF9,0x82009DFA,0x83009DFB, +0x84009DFC,0x85009DFD,0x86009DFE,0x87009DFF,0x88009E00,0x89009E01,0x8A009E02,0x8B009E03,0x8C009E04,0x8D009E05, +0x8E009E06,0x8F009E07,0x90009E08,0x91009E09,0x92009E0A,0x93009E0B,0x94009E0C,0x95009E0D,0x96009E0E,0x97009E0F, +0x98009E10,0x99009E11,0x9A009E12,0x9B009E13,0x9C009E14,0x9D009E15,0x9E009E16,0x9F009E17,0xA0009E18,0xA1009E19, +0xA2009E1A,0xA3009E1B,0xA4009E1C,0xA5009E1D,0xA6009E1E,0xA7009E1F,0xA8009E20,0xA9009E21,0xAA009E22,0xAB009E23, +0xAC009E24,0xAD009E25,0xAE009E26,0xAF009E27,0xB0009E28,0xB1009E29,0xB2009E2A,0xB3009E2B,0xB4009E2C,0xB5009E2D, +0xB6009E2E,0xB7009E2F,0xB8009E30,0xB9009E31,0xBA009E32,0xBB009E33,0xBC009E34,0xBD009E35,0xBE009E36,0xBF009E37, +0x00196662,0x0025674C,0x00256743,0x0025673A,0x00256731,0x00256728,0x0025671F,0x00256716,0x0025670D,0x00256704, +0x002566FB,0x002566F2,0x002566E9,0x002566E0,0x002566D7,0x002566CE,0x002566C5,0x002566BC,0x002566B3,0x002566AA, +0x002566A1,0x00256698,0x0025668F,0x00256686,0x0025667D,0x00256674,0x0025666B,0x00256662,0x0019656F,0x00256659, +0x00256650,0x00256647,0x0025663E,0x00256635,0x0025662C,0x00256623,0x0025661A,0x00256611,0x00256608,0x002565FF, +0x002565F6,0x002565ED,0x002565E4,0x002565DB,0x002565D2,0x002565C9,0x002565C0,0x002565B7,0x002565AE,0x002565A5, +0x0025659C,0x00256593,0x0025658A,0x00256581,0x00256578,0x0025656F,0x0019647C,0x00256566,0x0025655D,0x00256554, +0x0025654B,0x00256542,0x00256539,0x00256530,0x80009E78,0x81009E79,0x82009E7A,0x83009E7B,0x84009E7C,0x85009E7D, +0x86009E7E,0x87009E7F,0x88009E80,0x89009E81,0x8A009E82,0x8B009E83,0x8C009E84,0x8D009E85,0x8E009E86,0x8F009E87, +0x90009E88,0x91009E89,0x92009E8A,0x93009E8B,0x94009E8C,0x95009E8D,0x96009E8E,0x97009E8F,0x98009E90,0x99009E91, +0x9A009E92,0x9B009E93,0x9C009E94,0x9D009E95,0x9E009E96,0x9F009E97,0xA0009E98,0xA1009E99,0xA2009E9A,0xA3009E9B, +0xA4009E9C,0xA5009E9D,0xA6009E9E,0xA7009E9F,0xA8009EA0,0xA9009EA1,0xAA009EA2,0xAB009EA3,0xAC009EA4,0xAD009EA5, +0xAE009EA6,0xAF009EA7,0xB0009EA8,0xB1009EA9,0xB2009EAA,0xB3009EAB,0xB4009EAC,0xB5009EAD,0xB6009EAE,0xB7009EAF, +0xB8009EB0,0xB9009EB1,0xBA009EB2,0xBB009EB3,0xBC009EB4,0xBD009EB5,0xBE009EB6,0xBF009EB7,0x00256527,0x0025651E, +0x00256515,0x0025650C,0x00256503,0x002564FA,0x002564F1,0x002564E8,0x002564DF,0x002564D6,0x002564CD,0x002564C4, +0x002564BB,0x002564B2,0x002564A9,0x002564A0,0x00256497,0x0025648E,0x00256485,0x0025647C,0x00196389,0x00256473, +0x0025646A,0x00256461,0x00256458,0x0025644F,0x00256446,0x0025643D,0x00256434,0x0025642B,0x00256422,0x00256419, +0x00256410,0x00256407,0x002563FE,0x002563F5,0x002563EC,0x002563E3,0x002563DA,0x002563D1,0x002563C8,0x002563BF, +0x002563B6,0x002563AD,0x002563A4,0x0025639B,0x00256392,0x00256389,0x00196296,0x00256380,0x00256377,0x0025636E, +0x00256365,0x0025635C,0x00256353,0x0025634A,0x00256341,0x00256338,0x0025632F,0x00256326,0x0025631D,0x00256314, +0x0025630B,0x00256302,0x80009EF8,0x81009EF9,0x82009EFA,0x83009EFB,0x84009EFC,0x85009EFD,0x86009EFE,0x87009EFF, +0x88009F00,0x89009F01,0x8A009F02,0x8B009F03,0x8C009F04,0x8D009F05,0x8E009F06,0x8F009F07,0x90009F08,0x91009F09, +0x92009F0A,0x93009F0B,0x94009F0C,0x95009F0D,0x96009F0E,0x97009F0F,0x98009F10,0x99009F11,0x9A009F12,0x9B009F13, +0x9C009F14,0x9D009F15,0x9E009F16,0x9F009F17,0xA0009F18,0xA1009F19,0xA2009F1A,0xA3009F1B,0xA4009F1C,0xA5009F1D, +0xA6009F1E,0xA7009F1F,0xA8009F20,0xA9009F21,0xAA009F22,0xAB009F23,0xAC009F24,0xAD009F25,0xAE009F26,0xAF009F27, +0xB0009F28,0xB1009F29,0xB2009F2A,0xB3009F2B,0xB4009F2C,0xB5009F2D,0xB6009F2E,0xB7009F2F,0xB8009F30,0xB9009F31, +0xBA009F32,0xBB009F33,0xBC009F34,0xBD009F35,0xBE009F36,0xBF009F37,0x002562F9,0x002562F0,0x002562E7,0x002562DE, +0x002562D5,0x002562CC,0x002562C3,0x002562BA,0x002562B1,0x002562A8,0x0025629F,0x00256296,0x001961A3,0x0025628D, +0x00256284,0x0025627B,0x00256272,0x00256269,0x00256260,0x00256257,0x0025624E,0x00256245,0x0025623C,0x00256233, +0x0025622A,0x00256221,0x00256218,0x0025620F,0x00256206,0x002561FD,0x002561F4,0x002561EB,0x002561E2,0x002561D9, +0x002561D0,0x002561C7,0x002561BE,0x002561B5,0x002561AC,0x002561A3,0x001960B0,0x0025619A,0x00256191,0x00256188, +0x0025617F,0x00256176,0x0025616D,0x00256164,0x0025615B,0x00256152,0x00256149,0x00256140,0x00256137,0x0025612E, +0x00256125,0x0025611C,0x00256113,0x0025610A,0x00256101,0x002560F8,0x002560EF,0x002560E6,0x002560DD,0x002560D4, +0x80009F78,0x81009F79,0x82009F7A,0x83009F7B,0x84009F7C,0x85009F7D,0x86009F7E,0x87009F7F,0x88009F80,0x89009F81, +0x8A009F82,0x8B009F83,0x8C009F84,0x8D009F85,0x8E009F86,0x8F009F87,0x90009F88,0x91009F89,0x92009F8A,0x93009F8B, +0x94009F8C,0x95009F8D,0x96009F8E,0x97009F8F,0x98009F90,0x99009F91,0x9A009F92,0x9B009F93,0x9C009F94,0x9D009F95, +0x9E009F96,0x9F009F97,0xA0009F98,0xA1009F99,0xA2009F9A,0xA3009F9B,0xA4009F9C,0xA5009F9D,0xA6009F9E,0xA7009F9F, +0xA8009FA0,0xA9009FA1,0xAA009FA2,0xAB009FA3,0xAC009FA4,0xAD009FA5,0xAE009FA6,0xAF009FA7,0xB0009FA8,0xB1009FA9, +0xB2009FAA,0xB3009FAB,0xB4009FAC,0xB5009FAD,0xB6009FAE,0xB7009FAF,0xB8009FB0,0xB9009FB1,0xBA009FB2,0xBB009FB3, +0xBC009FB4,0xBD009FB5,0xBE009FB6,0xBF009FB7,0x002560CB,0x002560C2,0x002560B9,0x002560B0,0x00195FBD,0x002560A7, +0x0025609E,0x00256095,0x0025608C,0x00256083,0x0025607A,0x00256071,0x00256068,0x0025605F,0x00256056,0x0025604D, +0x00256044,0x0025603B,0x00256032,0x00256029,0x00256020,0x00256017,0x0025600E,0x00256005,0x00255FFC,0x00255FF3, +0x00255FEA,0x00255FE1,0x00255FD8,0x00255FCF,0x00255FC6,0x00255FBD,0x00195ECA,0x00255FB4,0x00255FAB,0x00255FA2, +0x00255F99,0x00255F90,0x00255F87,0x00255F7E,0x00255F75,0x00255F6C,0x00255F63,0x00255F5A,0x00255F51,0x00255F48, +0x00255F3F,0x00255F36,0x00255F2D,0x00255F24,0x00255F1B,0x00255F12,0x00255F09,0x00255F00,0x00255EF7,0x00255EEE, +0x00255EE5,0x00255EDC,0x00255ED3,0x00255ECA,0x00195DD7,0x00255EC1,0x00255EB8,0x00255EAF,0x80009FF8,0x81009FF9, +0x82009FFA,0x83009FFB,0x84009FFC,0x85009FFD,0x86009FFE,0x87009FFF,0x8800A000,0x8900A001,0x8A00A002,0x8B00A003, +0x8C00A004,0x8D00A005,0x8E00A006,0x8F00A007,0x9000A008,0x9100A009,0x9200A00A,0x9300A00B,0x9400A00C,0x9500A00D, +0x9600A00E,0x9700A00F,0x9800A010,0x9900A011,0x9A00A012,0x9B00A013,0x9C00A014,0x9D00A015,0x9E00A016,0x9F00A017, +0xA000A018,0xA100A019,0xA200A01A,0xA300A01B,0xA400A01C,0xA500A01D,0xA600A01E,0xA700A01F,0xA800A020,0xA900A021, +0xAA00A022,0xAB00A023,0xAC00A024,0xAD00A025,0xAE00A026,0xAF00A027,0xB000A028,0xB100A029,0xB200A02A,0xB300A02B, +0xB400A02C,0xB500A02D,0xB600A02E,0xB700A02F,0xB800A030,0xB900A031,0xBA00A032,0xBB00A033,0xBC00A034,0xBD00A035, +0xBE00A036,0xBF00A037,0x00255EA6,0x00255E9D,0x00255E94,0x00255E8B,0x00255E82,0x00255E79,0x00255E70,0x00255E67, +0x00255E5E,0x00255E55,0x00255E4C,0x00255E43,0x00255E3A,0x00255E31,0x00255E28,0x00255E1F,0x00255E16,0x00255E0D, +0x00255E04,0x00255DFB,0x00255DF2,0x00255DE9,0x00255DE0,0x00255DD7,0x00195CE4,0x00255DCE,0x00255DC5,0x00255DBC, +0x00255DB3,0x00255DAA,0x00255DA1,0x00255D98,0x00255D8F,0x00255D86,0x00255D7D,0x00255D74,0x00255D6B,0x00255D62, +0x00255D59,0x00255D50,0x00255D47,0x00255D3E,0x00255D35,0x00255D2C,0x00255D23,0x00255D1A,0x00255D11,0x00255D08, +0x00255CFF,0x00255CF6,0x00255CED,0x00255CE4,0x00195BF1,0x00255CDB,0x00255CD2,0x00255CC9,0x00255CC0,0x00255CB7, +0x00255CAE,0x00255CA5,0x00255C9C,0x00255C93,0x00255C8A,0x00255C81,0x8000A078,0x8100A079,0x8200A07A,0x8300A07B, +0x8400A07C,0x8500A07D,0x8600A07E,0x8700A07F,0x8800A080,0x8900A081,0x8A00A082,0x8B00A083,0x8C00A084,0x8D00A085, +0x8E00A086,0x8F00A087,0x9000A088,0x9100A089,0x9200A08A,0x9300A08B,0x9400A08C,0x9500A08D,0x9600A08E,0x9700A08F, +0x9800A090,0x9900A091,0x9A00A092,0x9B00A093,0x9C00A094,0x9D00A095,0x9E00A096,0x9F00A097,0xA000A098,0xA100A099, +0xA200A09A,0xA300A09B,0xA400A09C,0xA500A09D,0xA600A09E,0xA700A09F,0xA800A0A0,0xA900A0A1,0xAA00A0A2,0xAB00A0A3, +0xAC00A0A4,0xAD00A0A5,0xAE00A0A6,0xAF00A0A7,0xB000A0A8,0xB100A0A9,0xB200A0AA,0xB300A0AB,0xB400A0AC,0xB500A0AD, +0xB600A0AE,0xB700A0AF,0xB800A0B0,0xB900A0B1,0xBA00A0B2,0xBB00A0B3,0xBC00A0B4,0xBD00A0B5,0xBE00A0B6,0xBF00A0B7, +0x00255C78,0x00255C6F,0x00255C66,0x00255C5D,0x00255C54,0x00255C4B,0x00255C42,0x00255C39,0x00255C30,0x00255C27, +0x00255C1E,0x00255C15,0x00255C0C,0x00255C03,0x00255BFA,0x00255BF1,0x00195AFE,0x00255BE8,0x00255BDF,0x00255BD6, +0x00255BCD,0x00255BC4,0x00255BBB,0x00255BB2,0x00255BA9,0x00255BA0,0x00255B97,0x00255B8E,0x00255B85,0x00255B7C, +0x00255B73,0x00255B6A,0x00255B61,0x00255B58,0x00255B4F,0x00255B46,0x00255B3D,0x00255B34,0x00255B2B,0x00255B22, +0x00255B19,0x00255B10,0x00255B07,0x00255AFE,0x00195A0B,0x00255AF5,0x00255AEC,0x00255AE3,0x00255ADA,0x00255AD1, +0x00255AC8,0x00255ABF,0x00255AB6,0x00255AAD,0x00255AA4,0x00255A9B,0x00255A92,0x00255A89,0x00255A80,0x00255A77, +0x00255A6E,0x00255A65,0x00255A5C,0x00255A53,0x8000A0F8,0x8100A0F9,0x8200A0FA,0x8300A0FB,0x8400A0FC,0x8500A0FD, +0x8600A0FE,0x8700A0FF,0x8800A100,0x8900A101,0x8A00A102,0x8B00A103,0x8C00A104,0x8D00A105,0x8E00A106,0x8F00A107, +0x9000A108,0x9100A109,0x9200A10A,0x9300A10B,0x9400A10C,0x9500A10D,0x9600A10E,0x9700A10F,0x9800A110,0x9900A111, +0x9A00A112,0x9B00A113,0x9C00A114,0x9D00A115,0x9E00A116,0x9F00A117,0xA000A118,0xA100A119,0xA200A11A,0xA300A11B, +0xA400A11C,0xA500A11D,0xA600A11E,0xA700A11F,0xA800A120,0xA900A121,0xAA00A122,0xAB00A123,0xAC00A124,0xAD00A125, +0xAE00A126,0xAF00A127,0xB000A128,0xB100A129,0xB200A12A,0xB300A12B,0xB400A12C,0xB500A12D,0xB600A12E,0xB700A12F, +0xB800A130,0xB900A131,0xBA00A132,0xBB00A133,0xBC00A134,0xBD00A135,0xBE00A136,0xBF00A137,0x00255A4A,0x00255A41, +0x00255A38,0x00255A2F,0x00255A26,0x00255A1D,0x00255A14,0x00255A0B,0x00195918,0x00255A02,0x002559F9,0x002559F0, +0x002559E7,0x002559DE,0x002559D5,0x002559CC,0x002559C3,0x002559BA,0x002559B1,0x002559A8,0x0025599F,0x00255996, +0x0025598D,0x00255984,0x0025597B,0x00255972,0x00255969,0x00255960,0x00255957,0x0025594E,0x00255945,0x0025593C, +0x00255933,0x0025592A,0x00255921,0x00255918,0x00195825,0x0025590F,0x00255906,0x002558FD,0x002558F4,0x002558EB, +0x002558E2,0x002558D9,0x002558D0,0x002558C7,0x002558BE,0x002558B5,0x002558AC,0x002558A3,0x0025589A,0x00255891, +0x00255888,0x0025587F,0x00255876,0x0025586D,0x00255864,0x0025585B,0x00255852,0x00255849,0x00255840,0x00255837, +0x0025582E,0x00255825,0x8000A178,0x8100A179,0x8200A17A,0x8300A17B,0x8400A17C,0x8500A17D,0x8600A17E,0x8700A17F, +0x8800A180,0x8900A181,0x8A00A182,0x8B00A183,0x8C00A184,0x8D00A185,0x8E00A186,0x8F00A187,0x9000A188,0x9100A189, +0x9200A18A,0x9300A18B,0x9400A18C,0x9500A18D,0x9600A18E,0x9700A18F,0x9800A190,0x9900A191,0x9A00A192,0x9B00A193, +0x9C00A194,0x9D00A195,0x9E00A196,0x9F00A197,0xA000A198,0xA100A199,0xA200A19A,0xA300A19B,0xA400A19C,0xA500A19D, +0xA600A19E,0xA700A19F,0xA800A1A0,0xA900A1A1,0xAA00A1A2,0xAB00A1A3,0xAC00A1A4,0xAD00A1A5,0xAE00A1A6,0xAF00A1A7, +0xB000A1A8,0xB100A1A9,0xB200A1AA,0xB300A1AB,0xB400A1AC,0xB500A1AD,0xB600A1AE,0xB700A1AF,0xB800A1B0,0xB900A1B1, +0xBA00A1B2,0xBB00A1B3,0xBC00A1B4,0xBD00A1B5,0xBE00A1B6,0xBF00A1B7,0x00195732,0x0025581C,0x00255813,0x0025580A, +0x00255801,0x002557F8,0x002557EF,0x002557E6,0x002557DD,0x002557D4,0x002557CB,0x002557C2,0x002557B9,0x002557B0, +0x002557A7,0x0025579E,0x00255795,0x0025578C,0x00255783,0x0025577A,0x00255771,0x00255768,0x0025575F,0x00255756, +0x0025574D,0x00255744,0x0025573B,0x00255732,0x0019563F,0x00255729,0x00255720,0x00255717,0x0025570E,0x00255705, +0x002556FC,0x002556F3,0x002556EA,0x002556E1,0x002556D8,0x002556CF,0x002556C6,0x002556BD,0x002556B4,0x002556AB, +0x002556A2,0x00255699,0x00255690,0x00255687,0x0025567E,0x00255675,0x0025566C,0x00255663,0x0025565A,0x00255651, +0x00255648,0x0025563F,0x0019554C,0x00255636,0x0025562D,0x00255624,0x0025561B,0x00255612,0x00255609,0x00255600, +0x8000A1F8,0x8100A1F9,0x8200A1FA,0x8300A1FB,0x8400A1FC,0x8500A1FD,0x8600A1FE,0x8700A1FF,0x8800A200,0x8900A201, +0x8A00A202,0x8B00A203,0x8C00A204,0x8D00A205,0x8E00A206,0x8F00A207,0x9000A208,0x9100A209,0x9200A20A,0x9300A20B, +0x9400A20C,0x9500A20D,0x9600A20E,0x9700A20F,0x9800A210,0x9900A211,0x9A00A212,0x9B00A213,0x9C00A214,0x9D00A215, +0x9E00A216,0x9F00A217,0xA000A218,0xA100A219,0xA200A21A,0xA300A21B,0xA400A21C,0xA500A21D,0xA600A21E,0xA700A21F, +0xA800A220,0xA900A221,0xAA00A222,0xAB00A223,0xAC00A224,0xAD00A225,0xAE00A226,0xAF00A227,0xB000A228,0xB100A229, +0xB200A22A,0xB300A22B,0xB400A22C,0xB500A22D,0xB600A22E,0xB700A22F,0xB800A230,0xB900A231,0xBA00A232,0xBB00A233, +0xBC00A234,0xBD00A235,0xBE00A236,0xBF00A237,0x002555F7,0x002555EE,0x002555E5,0x002555DC,0x002555D3,0x002555CA, +0x002555C1,0x002555B8,0x002555AF,0x002555A6,0x0025559D,0x00255594,0x0025558B,0x00255582,0x00255579,0x00255570, +0x00255567,0x0025555E,0x00255555,0x0025554C,0x00195459,0x00255543,0x0025553A,0x00255531,0x00255528,0x0025551F, +0x00255516,0x0025550D,0x00255504,0x002554FB,0x002554F2,0x002554E9,0x002554E0,0x002554D7,0x002554CE,0x002554C5, +0x002554BC,0x002554B3,0x002554AA,0x002554A1,0x00255498,0x0025548F,0x00255486,0x0025547D,0x00255474,0x0025546B, +0x00255462,0x00255459,0x00195366,0x00255450,0x00255447,0x0025543E,0x00255435,0x0025542C,0x00255423,0x0025541A, +0x00255411,0x00255408,0x002553FF,0x002553F6,0x002553ED,0x002553E4,0x002553DB,0x002553D2,0x8000A278,0x8100A279, +0x8200A27A,0x8300A27B,0x8400A27C,0x8500A27D,0x8600A27E,0x8700A27F,0x8800A280,0x8900A281,0x8A00A282,0x8B00A283, +0x8C00A284,0x8D00A285,0x8E00A286,0x8F00A287,0x9000A288,0x9100A289,0x9200A28A,0x9300A28B,0x9400A28C,0x9500A28D, +0x9600A28E,0x9700A28F,0x9800A290,0x9900A291,0x9A00A292,0x9B00A293,0x9C00A294,0x9D00A295,0x9E00A296,0x9F00A297, +0xA000A298,0xA100A299,0xA200A29A,0xA300A29B,0xA400A29C,0xA500A29D,0xA600A29E,0xA700A29F,0xA800A2A0,0xA900A2A1, +0xAA00A2A2,0xAB00A2A3,0xAC00A2A4,0xAD00A2A5,0xAE00A2A6,0xAF00A2A7,0xB000A2A8,0xB100A2A9,0xB200A2AA,0xB300A2AB, +0xB400A2AC,0xB500A2AD,0xB600A2AE,0xB700A2AF,0xB800A2B0,0xB900A2B1,0xBA00A2B2,0xBB00A2B3,0xBC00A2B4,0xBD00A2B5, +0xBE00A2B6,0xBF00A2B7,0x002553C9,0x002553C0,0x002553B7,0x002553AE,0x002553A5,0x0025539C,0x00255393,0x0025538A, +0x00255381,0x00255378,0x0025536F,0x00255366,0x00195273,0x0025535D,0x00255354,0x0025534B,0x00255342,0x00255339, +0x00255330,0x00255327,0x0025531E,0x00255315,0x0025530C,0x00255303,0x002552FA,0x002552F1,0x002552E8,0x002552DF, +0x002552D6,0x002552CD,0x002552C4,0x002552BB,0x002552B2,0x002552A9,0x002552A0,0x00255297,0x0025528E,0x00255285, +0x0025527C,0x00255273,0x00195180,0x0025526A,0x00255261,0x00255258,0x0025524F,0x00255246,0x0025523D,0x00255234, +0x0025522B,0x00255222,0x00255219,0x00255210,0x00255207,0x002551FE,0x002551F5,0x002551EC,0x002551E3,0x002551DA, +0x002551D1,0x002551C8,0x002551BF,0x002551B6,0x002551AD,0x002551A4,0x8000A2F8,0x8100A2F9,0x8200A2FA,0x8300A2FB, +0x8400A2FC,0x8500A2FD,0x8600A2FE,0x8700A2FF,0x8800A300,0x8900A301,0x8A00A302,0x8B00A303,0x8C00A304,0x8D00A305, +0x8E00A306,0x8F00A307,0x9000A308,0x9100A309,0x9200A30A,0x9300A30B,0x9400A30C,0x9500A30D,0x9600A30E,0x9700A30F, +0x9800A310,0x9900A311,0x9A00A312,0x9B00A313,0x9C00A314,0x9D00A315,0x9E00A316,0x9F00A317,0xA000A318,0xA100A319, +0xA200A31A,0xA300A31B,0xA400A31C,0xA500A31D,0xA600A31E,0xA700A31F,0xA800A320,0xA900A321,0xAA00A322,0xAB00A323, +0xAC00A324,0xAD00A325,0xAE00A326,0xAF00A327,0xB000A328,0xB100A329,0xB200A32A,0xB300A32B,0xB400A32C,0xB500A32D, +0xB600A32E,0xB700A32F,0xB800A330,0xB900A331,0xBA00A332,0xBB00A333,0xBC00A334,0xBD00A335,0xBE00A336,0xBF00A337, +0x0025519B,0x00255192,0x00255189,0x00255180,0x0019508D,0x00255177,0x0025516E,0x00255165,0x0025515C,0x00255153, +0x0025514A,0x00255141,0x00255138,0x0025512F,0x00255126,0x0025511D,0x00255114,0x0025510B,0x00255102,0x002550F9, +0x002550F0,0x002550E7,0x002550DE,0x002550D5,0x002550CC,0x002550C3,0x002550BA,0x002550B1,0x002550A8,0x0025509F, +0x00255096,0x0025508D,0x00194F9A,0x00255084,0x0025507B,0x00255072,0x00255069,0x00255060,0x00255057,0x0025504E, +0x00255045,0x0025503C,0x00255033,0x0025502A,0x00255021,0x00255018,0x0025500F,0x00255006,0x00254FFD,0x00254FF4, +0x00254FEB,0x00254FE2,0x00254FD9,0x00254FD0,0x00254FC7,0x00254FBE,0x00254FB5,0x00254FAC,0x00254FA3,0x00254F9A, +0x00194EA7,0x00254F91,0x00254F88,0x00254F7F,0x8000A378,0x8100A379,0x8200A37A,0x8300A37B,0x8400A37C,0x8500A37D, +0x8600A37E,0x8700A37F,0x8800A380,0x8900A381,0x8A00A382,0x8B00A383,0x8C00A384,0x8D00A385,0x8E00A386,0x8F00A387, +0x9000A388,0x9100A389,0x9200A38A,0x9300A38B,0x9400A38C,0x9500A38D,0x9600A38E,0x9700A38F,0x9800A390,0x9900A391, +0x9A00A392,0x9B00A393,0x9C00A394,0x9D00A395,0x9E00A396,0x9F00A397,0xA000A398,0xA100A399,0xA200A39A,0xA300A39B, +0xA400A39C,0xA500A39D,0xA600A39E,0xA700A39F,0xA800A3A0,0xA900A3A1,0xAA00A3A2,0xAB00A3A3,0xAC00A3A4,0xAD00A3A5, +0xAE00A3A6,0xAF00A3A7,0xB000A3A8,0xB100A3A9,0xB200A3AA,0xB300A3AB,0xB400A3AC,0xB500A3AD,0xB600A3AE,0xB700A3AF, +0xB800A3B0,0xB900A3B1,0xBA00A3B2,0xBB00A3B3,0xBC00A3B4,0xBD00A3B5,0xBE00A3B6,0xBF00A3B7,0x00254F76,0x00254F6D, +0x00254F64,0x00254F5B,0x00254F52,0x00254F49,0x00254F40,0x00254F37,0x00254F2E,0x00254F25,0x00254F1C,0x00254F13, +0x00254F0A,0x00254F01,0x00254EF8,0x00254EEF,0x00254EE6,0x00254EDD,0x00254ED4,0x00254ECB,0x00254EC2,0x00254EB9, +0x00254EB0,0x00254EA7,0x00194DB4,0x00254E9E,0x00254E95,0x00254E8C,0x00254E83,0x00254E7A,0x00254E71,0x00254E68, +0x00254E5F,0x00254E56,0x00254E4D,0x00254E44,0x00254E3B,0x00254E32,0x00254E29,0x00254E20,0x00254E17,0x00254E0E, +0x00254E05,0x00254DFC,0x00254DF3,0x00254DEA,0x00254DE1,0x00254DD8,0x00254DCF,0x00254DC6,0x00254DBD,0x00254DB4, +0x00194CC1,0x00254DAB,0x00254DA2,0x00254D99,0x00254D90,0x00254D87,0x00254D7E,0x00254D75,0x00254D6C,0x00254D63, +0x00254D5A,0x00254D51,0x8000A3F8,0x8100A3F9,0x8200A3FA,0x8300A3FB,0x8400A3FC,0x8500A3FD,0x8600A3FE,0x8700A3FF, +0x8800A400,0x8900A401,0x8A00A402,0x8B00A403,0x8C00A404,0x8D00A405,0x8E00A406,0x8F00A407,0x9000A408,0x9100A409, +0x9200A40A,0x9300A40B,0x9400A40C,0x9500A40D,0x9600A40E,0x9700A40F,0x9800A410,0x9900A411,0x9A00A412,0x9B00A413, +0x9C00A414,0x9D00A415,0x9E00A416,0x9F00A417,0xA000A418,0xA100A419,0xA200A41A,0xA300A41B,0xA400A41C,0xA500A41D, +0xA600A41E,0xA700A41F,0xA800A420,0xA900A421,0xAA00A422,0xAB00A423,0xAC00A424,0xAD00A425,0xAE00A426,0xAF00A427, +0xB000A428,0xB100A429,0xB200A42A,0xB300A42B,0xB400A42C,0xB500A42D,0xB600A42E,0xB700A42F,0xB800A430,0xB900A431, +0xBA00A432,0xBB00A433,0xBC00A434,0xBD00A435,0xBE00A436,0xBF00A437,0x00254D48,0x00254D3F,0x00254D36,0x00254D2D, +0x00254D24,0x00254D1B,0x00254D12,0x00254D09,0x00254D00,0x00254CF7,0x00254CEE,0x00254CE5,0x00254CDC,0x00254CD3, +0x00254CCA,0x00254CC1,0x00194BCE,0x00254CB8,0x00254CAF,0x00254CA6,0x00254C9D,0x00254C94,0x00254C8B,0x00254C82, +0x00254C79,0x00254C70,0x00254C67,0x00254C5E,0x00254C55,0x00254C4C,0x00254C43,0x00254C3A,0x00254C31,0x00254C28, +0x00254C1F,0x00254C16,0x00254C0D,0x00254C04,0x00254BFB,0x00254BF2,0x00254BE9,0x00254BE0,0x00254BD7,0x00254BCE, +0x00194ADB,0x00254BC5,0x00254BBC,0x00254BB3,0x00254BAA,0x00254BA1,0x00254B98,0x00254B8F,0x00254B86,0x00254B7D, +0x00254B74,0x00254B6B,0x00254B62,0x00254B59,0x00254B50,0x00254B47,0x00254B3E,0x00254B35,0x00254B2C,0x00254B23, +0x8000A478,0x8100A479,0x8200A47A,0x8300A47B,0x8400A47C,0x8500A47D,0x8600A47E,0x8700A47F,0x8800A480,0x8900A481, +0x8A00A482,0x8B00A483,0x8C00A484,0x8D00A485,0x8E00A486,0x8F00A487,0x9000A488,0x9100A489,0x9200A48A,0x9300A48B, +0x9400A48C,0x9500A48D,0x9600A48E,0x9700A48F,0x9800A490,0x9900A491,0x9A00A492,0x9B00A493,0x9C00A494,0x9D00A495, +0x9E00A496,0x9F00A497,0xA000A498,0xA100A499,0xA200A49A,0xA300A49B,0xA400A49C,0xA500A49D,0xA600A49E,0xA700A49F, +0xA800A4A0,0xA900A4A1,0xAA00A4A2,0xAB00A4A3,0xAC00A4A4,0xAD00A4A5,0xAE00A4A6,0xAF00A4A7,0xB000A4A8,0xB100A4A9, +0xB200A4AA,0xB300A4AB,0xB400A4AC,0xB500A4AD,0xB600A4AE,0xB700A4AF,0xB800A4B0,0xB900A4B1,0xBA00A4B2,0xBB00A4B3, +0xBC00A4B4,0xBD00A4B5,0xBE00A4B6,0xBF00A4B7,0x00254B1A,0x00254B11,0x00254B08,0x00254AFF,0x00254AF6,0x00254AED, +0x00254AE4,0x00254ADB,0x001949E8,0x00254AD2,0x00254AC9,0x00254AC0,0x00254AB7,0x00254AAE,0x00254AA5,0x00254A9C, +0x00254A93,0x00254A8A,0x00254A81,0x00254A78,0x00254A6F,0x00254A66,0x00254A5D,0x00254A54,0x00254A4B,0x00254A42, +0x00254A39,0x00254A30,0x00254A27,0x00254A1E,0x00254A15,0x00254A0C,0x00254A03,0x002549FA,0x002549F1,0x002549E8, +0x001948F5,0x002549DF,0x002549D6,0x002549CD,0x002549C4,0x002549BB,0x002549B2,0x002549A9,0x002549A0,0x00254997, +0x0025498E,0x00254985,0x0025497C,0x00254973,0x0025496A,0x00254961,0x00254958,0x0025494F,0x00254946,0x0025493D, +0x00254934,0x0025492B,0x00254922,0x00254919,0x00254910,0x00254907,0x002548FE,0x002548F5,0x8000A4F8,0x8100A4F9, +0x8200A4FA,0x8300A4FB,0x8400A4FC,0x8500A4FD,0x8600A4FE,0x8700A4FF,0x8800A500,0x8900A501,0x8A00A502,0x8B00A503, +0x8C00A504,0x8D00A505,0x8E00A506,0x8F00A507,0x9000A508,0x9100A509,0x9200A50A,0x9300A50B,0x9400A50C,0x9500A50D, +0x9600A50E,0x9700A50F,0x9800A510,0x9900A511,0x9A00A512,0x9B00A513,0x9C00A514,0x9D00A515,0x9E00A516,0x9F00A517, +0xA000A518,0xA100A519,0xA200A51A,0xA300A51B,0xA400A51C,0xA500A51D,0xA600A51E,0xA700A51F,0xA800A520,0xA900A521, +0xAA00A522,0xAB00A523,0xAC00A524,0xAD00A525,0xAE00A526,0xAF00A527,0xB000A528,0xB100A529,0xB200A52A,0xB300A52B, +0xB400A52C,0xB500A52D,0xB600A52E,0xB700A52F,0xB800A530,0xB900A531,0xBA00A532,0xBB00A533,0xBC00A534,0xBD00A535, +0xBE00A536,0xBF00A537,0x00194802,0x002548EC,0x002548E3,0x002548DA,0x002548D1,0x002548C8,0x002548BF,0x002548B6, +0x002548AD,0x002548A4,0x0025489B,0x00254892,0x00254889,0x00254880,0x00254877,0x0025486E,0x00254865,0x0025485C, +0x00254853,0x0025484A,0x00254841,0x00254838,0x0025482F,0x00254826,0x0025481D,0x00254814,0x0025480B,0x00254802, +0x0019470F,0x002547F9,0x002547F0,0x002547E7,0x002547DE,0x002547D5,0x002547CC,0x002547C3,0x002547BA,0x002547B1, +0x002547A8,0x0025479F,0x00254796,0x0025478D,0x00254784,0x0025477B,0x00254772,0x00254769,0x00254760,0x00254757, +0x0025474E,0x00254745,0x0025473C,0x00254733,0x0025472A,0x00254721,0x00254718,0x0025470F,0x0019461C,0x00254706, +0x002546FD,0x002546F4,0x002546EB,0x002546E2,0x002546D9,0x002546D0,0x8000A578,0x8100A579,0x8200A57A,0x8300A57B, +0x8400A57C,0x8500A57D,0x8600A57E,0x8700A57F,0x8800A580,0x8900A581,0x8A00A582,0x8B00A583,0x8C00A584,0x8D00A585, +0x8E00A586,0x8F00A587,0x9000A588,0x9100A589,0x9200A58A,0x9300A58B,0x9400A58C,0x9500A58D,0x9600A58E,0x9700A58F, +0x9800A590,0x9900A591,0x9A00A592,0x9B00A593,0x9C00A594,0x9D00A595,0x9E00A596,0x9F00A597,0xA000A598,0xA100A599, +0xA200A59A,0xA300A59B,0xA400A59C,0xA500A59D,0xA600A59E,0xA700A59F,0xA800A5A0,0xA900A5A1,0xAA00A5A2,0xAB00A5A3, +0xAC00A5A4,0xAD00A5A5,0xAE00A5A6,0xAF00A5A7,0xB000A5A8,0xB100A5A9,0xB200A5AA,0xB300A5AB,0xB400A5AC,0xB500A5AD, +0xB600A5AE,0xB700A5AF,0xB800A5B0,0xB900A5B1,0xBA00A5B2,0xBB00A5B3,0xBC00A5B4,0xBD00A5B5,0xBE00A5B6,0xBF00A5B7, +0x002546C7,0x002546BE,0x002546B5,0x002546AC,0x002546A3,0x0025469A,0x00254691,0x00254688,0x0025467F,0x00254676, +0x0025466D,0x00254664,0x0025465B,0x00254652,0x00254649,0x00254640,0x00254637,0x0025462E,0x00254625,0x0025461C, +0x00194529,0x00254613,0x0025460A,0x00254601,0x002545F8,0x002545EF,0x002545E6,0x002545DD,0x002545D4,0x002545CB, +0x002545C2,0x002545B9,0x002545B0,0x002545A7,0x0025459E,0x00254595,0x0025458C,0x00254583,0x0025457A,0x00254571, +0x00254568,0x0025455F,0x00254556,0x0025454D,0x00254544,0x0025453B,0x00254532,0x00254529,0x00194436,0x00254520, +0x00254517,0x0025450E,0x00254505,0x002544FC,0x002544F3,0x002544EA,0x002544E1,0x002544D8,0x002544CF,0x002544C6, +0x002544BD,0x002544B4,0x002544AB,0x002544A2,0x8000A5F8,0x8100A5F9,0x8200A5FA,0x8300A5FB,0x8400A5FC,0x8500A5FD, +0x8600A5FE,0x8700A5FF,0x8800A600,0x8900A601,0x8A00A602,0x8B00A603,0x8C00A604,0x8D00A605,0x8E00A606,0x8F00A607, +0x9000A608,0x9100A609,0x9200A60A,0x9300A60B,0x9400A60C,0x9500A60D,0x9600A60E,0x9700A60F,0x9800A610,0x9900A611, +0x9A00A612,0x9B00A613,0x9C00A614,0x9D00A615,0x9E00A616,0x9F00A617,0xA000A618,0xA100A619,0xA200A61A,0xA300A61B, +0xA400A61C,0xA500A61D,0xA600A61E,0xA700A61F,0xA800A620,0xA900A621,0xAA00A622,0xAB00A623,0xAC00A624,0xAD00A625, +0xAE00A626,0xAF00A627,0xB000A628,0xB100A629,0xB200A62A,0xB300A62B,0xB400A62C,0xB500A62D,0xB600A62E,0xB700A62F, +0xB800A630,0xB900A631,0xBA00A632,0xBB00A633,0xBC00A634,0xBD00A635,0xBE00A636,0xBF00A637,0x00254499,0x00254490, +0x00254487,0x0025447E,0x00254475,0x0025446C,0x00254463,0x0025445A,0x00254451,0x00254448,0x0025443F,0x00254436, +0x00194343,0x0025442D,0x00254424,0x0025441B,0x00254412,0x00254409,0x00254400,0x002543F7,0x002543EE,0x002543E5, +0x002543DC,0x002543D3,0x002543CA,0x002543C1,0x002543B8,0x002543AF,0x002543A6,0x0025439D,0x00254394,0x0025438B, +0x00254382,0x00254379,0x00254370,0x00254367,0x0025435E,0x00254355,0x0025434C,0x00254343,0x00194250,0x0025433A, +0x00254331,0x00254328,0x0025431F,0x00254316,0x0025430D,0x00254304,0x002542FB,0x002542F2,0x002542E9,0x002542E0, +0x002542D7,0x002542CE,0x002542C5,0x002542BC,0x002542B3,0x002542AA,0x002542A1,0x00254298,0x0025428F,0x00254286, +0x0025427D,0x00254274,0x8000A678,0x8100A679,0x8200A67A,0x8300A67B,0x8400A67C,0x8500A67D,0x8600A67E,0x8700A67F, +0x8800A680,0x8900A681,0x8A00A682,0x8B00A683,0x8C00A684,0x8D00A685,0x8E00A686,0x8F00A687,0x9000A688,0x9100A689, +0x9200A68A,0x9300A68B,0x9400A68C,0x9500A68D,0x9600A68E,0x9700A68F,0x9800A690,0x9900A691,0x9A00A692,0x9B00A693, +0x9C00A694,0x9D00A695,0x9E00A696,0x9F00A697,0xA000A698,0xA100A699,0xA200A69A,0xA300A69B,0xA400A69C,0xA500A69D, +0xA600A69E,0xA700A69F,0xA800A6A0,0xA900A6A1,0xAA00A6A2,0xAB00A6A3,0xAC00A6A4,0xAD00A6A5,0xAE00A6A6,0xAF00A6A7, +0xB000A6A8,0xB100A6A9,0xB200A6AA,0xB300A6AB,0xB400A6AC,0xB500A6AD,0xB600A6AE,0xB700A6AF,0xB800A6B0,0xB900A6B1, +0xBA00A6B2,0xBB00A6B3,0xBC00A6B4,0xBD00A6B5,0xBE00A6B6,0xBF00A6B7,0x0025426B,0x00254262,0x00254259,0x00254250, +0x0019415D,0x00254247,0x0025423E,0x00254235,0x0025422C,0x00254223,0x0025421A,0x00254211,0x00254208,0x002541FF, +0x002541F6,0x002541ED,0x002541E4,0x002541DB,0x002541D2,0x002541C9,0x002541C0,0x002541B7,0x002541AE,0x002541A5, +0x0025419C,0x00254193,0x0025418A,0x00254181,0x00254178,0x0025416F,0x00254166,0x0025415D,0x0019406A,0x00254154, +0x0025414B,0x00254142,0x00254139,0x00254130,0x00254127,0x0025411E,0x00254115,0x0025410C,0x00254103,0x002540FA, +0x002540F1,0x002540E8,0x002540DF,0x002540D6,0x002540CD,0x002540C4,0x002540BB,0x002540B2,0x002540A9,0x002540A0, +0x00254097,0x0025408E,0x00254085,0x0025407C,0x00254073,0x0025406A,0x00193F77,0x00254061,0x00254058,0x0025404F, +0x8000A6F8,0x8100A6F9,0x8200A6FA,0x8300A6FB,0x8400A6FC,0x8500A6FD,0x8600A6FE,0x8700A6FF,0x8800A700,0x8900A701, +0x8A00A702,0x8B00A703,0x8C00A704,0x8D00A705,0x8E00A706,0x8F00A707,0x9000A708,0x9100A709,0x9200A70A,0x9300A70B, +0x9400A70C,0x9500A70D,0x9600A70E,0x9700A70F,0x9800A710,0x9900A711,0x9A00A712,0x9B00A713,0x9C00A714,0x9D00A715, +0x9E00A716,0x9F00A717,0xA000A718,0xA100A719,0xA200A71A,0xA300A71B,0xA400A71C,0xA500A71D,0xA600A71E,0xA700A71F, +0xA800A720,0xA900A721,0xAA00A722,0xAB00A723,0xAC00A724,0xAD00A725,0xAE00A726,0xAF00A727,0xB000A728,0xB100A729, +0xB200A72A,0xB300A72B,0xB400A72C,0xB500A72D,0xB600A72E,0xB700A72F,0xB800A730,0xB900A731,0xBA00A732,0xBB00A733, +0xBC00A734,0xBD00A735,0xBE00A736,0xBF00A737,0x00254046,0x0025403D,0x00254034,0x0025402B,0x00254022,0x00254019, +0x00254010,0x00254007,0x00253FFE,0x00253FF5,0x00253FEC,0x00253FE3,0x00253FDA,0x00253FD1,0x00253FC8,0x00253FBF, +0x00253FB6,0x00253FAD,0x00253FA4,0x00253F9B,0x00253F92,0x00253F89,0x00253F80,0x00253F77,0x00193E84,0x00253F6E, +0x00253F65,0x00253F5C,0x00253F53,0x00253F4A,0x00253F41,0x00253F38,0x00253F2F,0x00253F26,0x00253F1D,0x00253F14, +0x00253F0B,0x00253F02,0x00253EF9,0x00253EF0,0x00253EE7,0x00253EDE,0x00253ED5,0x00253ECC,0x00253EC3,0x00253EBA, +0x00253EB1,0x00253EA8,0x00253E9F,0x00253E96,0x00253E8D,0x00253E84,0x00193D91,0x00253E7B,0x00253E72,0x00253E69, +0x00253E60,0x00253E57,0x00253E4E,0x00253E45,0x00253E3C,0x00253E33,0x00253E2A,0x00253E21,0x8000A778,0x8100A779, +0x8200A77A,0x8300A77B,0x8400A77C,0x8500A77D,0x8600A77E,0x8700A77F,0x8800A780,0x8900A781,0x8A00A782,0x8B00A783, +0x8C00A784,0x8D00A785,0x8E00A786,0x8F00A787,0x9000A788,0x9100A789,0x9200A78A,0x9300A78B,0x9400A78C,0x9500A78D, +0x9600A78E,0x9700A78F,0x9800A790,0x9900A791,0x9A00A792,0x9B00A793,0x9C00A794,0x9D00A795,0x9E00A796,0x9F00A797, +0xA000A798,0xA100A799,0xA200A79A,0xA300A79B,0xA400A79C,0xA500A79D,0xA600A79E,0xA700A79F,0xA800A7A0,0xA900A7A1, +0xAA00A7A2,0xAB00A7A3,0xAC00A7A4,0xAD00A7A5,0xAE00A7A6,0xAF00A7A7,0xB000A7A8,0xB100A7A9,0xB200A7AA,0xB300A7AB, +0xB400A7AC,0xB500A7AD,0xB600A7AE,0xB700A7AF,0xB800A7B0,0xB900A7B1,0xBA00A7B2,0xBB00A7B3,0xBC00A7B4,0xBD00A7B5, +0xBE00A7B6,0xBF00A7B7,0x00253E18,0x00253E0F,0x00253E06,0x00253DFD,0x00253DF4,0x00253DEB,0x00253DE2,0x00253DD9, +0x00253DD0,0x00253DC7,0x00253DBE,0x00253DB5,0x00253DAC,0x00253DA3,0x00253D9A,0x00253D91,0x00193C9E,0x00253D88, +0x00253D7F,0x00253D76,0x00253D6D,0x00253D64,0x00253D5B,0x00253D52,0x00253D49,0x00253D40,0x00253D37,0x00253D2E, +0x00253D25,0x00253D1C,0x00253D13,0x00253D0A,0x00253D01,0x00253CF8,0x00253CEF,0x00253CE6,0x00253CDD,0x00253CD4, +0x00253CCB,0x00253CC2,0x00253CB9,0x00253CB0,0x00253CA7,0x00253C9E,0x00193BAB,0x00253C95,0x00253C8C,0x00253C83, +0x00253C7A,0x00253C71,0x00253C68,0x00253C5F,0x00253C56,0x00253C4D,0x00253C44,0x00253C3B,0x00253C32,0x00253C29, +0x00253C20,0x00253C17,0x00253C0E,0x00253C05,0x00253BFC,0x00253BF3,0x8000A7F8,0x8100A7F9,0x8200A7FA,0x8300A7FB, +0x8400A7FC,0x8500A7FD,0x8600A7FE,0x8700A7FF,0x8800A800,0x8900A801,0x8A00A802,0x8B00A803,0x8C00A804,0x8D00A805, +0x8E00A806,0x8F00A807,0x9000A808,0x9100A809,0x9200A80A,0x9300A80B,0x9400A80C,0x9500A80D,0x9600A80E,0x9700A80F, +0x9800A810,0x9900A811,0x9A00A812,0x9B00A813,0x9C00A814,0x9D00A815,0x9E00A816,0x9F00A817,0xA000A818,0xA100A819, +0xA200A81A,0xA300A81B,0xA400A81C,0xA500A81D,0xA600A81E,0xA700A81F,0xA800A820,0xA900A821,0xAA00A822,0xAB00A823, +0xAC00A824,0xAD00A825,0xAE00A826,0xAF00A827,0xB000A828,0xB100A829,0xB200A82A,0xB300A82B,0xB400A82C,0xB500A82D, +0xB600A82E,0xB700A82F,0xB800A830,0xB900A831,0xBA00A832,0xBB00A833,0xBC00A834,0xBD00A835,0xBE00A836,0xBF00A837, +0x00253BEA,0x00253BE1,0x00253BD8,0x00253BCF,0x00253BC6,0x00253BBD,0x00253BB4,0x00253BAB,0x00193AB8,0x00253BA2, +0x00253B99,0x00253B90,0x00253B87,0x00253B7E,0x00253B75,0x00253B6C,0x00253B63,0x00253B5A,0x00253B51,0x00253B48, +0x00253B3F,0x00253B36,0x00253B2D,0x00253B24,0x00253B1B,0x00253B12,0x00253B09,0x00253B00,0x00253AF7,0x00253AEE, +0x00253AE5,0x00253ADC,0x00253AD3,0x00253ACA,0x00253AC1,0x00253AB8,0x001939C5,0x00253AAF,0x00253AA6,0x00253A9D, +0x00253A94,0x00253A8B,0x00253A82,0x00253A79,0x00253A70,0x00253A67,0x00253A5E,0x00253A55,0x00253A4C,0x00253A43, +0x00253A3A,0x00253A31,0x00253A28,0x00253A1F,0x00253A16,0x00253A0D,0x00253A04,0x002539FB,0x002539F2,0x002539E9, +0x002539E0,0x002539D7,0x002539CE,0x002539C5,0x8000A878,0x8100A879,0x8200A87A,0x8300A87B,0x8400A87C,0x8500A87D, +0x8600A87E,0x8700A87F,0x8800A880,0x8900A881,0x8A00A882,0x8B00A883,0x8C00A884,0x8D00A885,0x8E00A886,0x8F00A887, +0x9000A888,0x9100A889,0x9200A88A,0x9300A88B,0x9400A88C,0x9500A88D,0x9600A88E,0x9700A88F,0x9800A890,0x9900A891, +0x9A00A892,0x9B00A893,0x9C00A894,0x9D00A895,0x9E00A896,0x9F00A897,0xA000A898,0xA100A899,0xA200A89A,0xA300A89B, +0xA400A89C,0xA500A89D,0xA600A89E,0xA700A89F,0xA800A8A0,0xA900A8A1,0xAA00A8A2,0xAB00A8A3,0xAC00A8A4,0xAD00A8A5, +0xAE00A8A6,0xAF00A8A7,0xB000A8A8,0xB100A8A9,0xB200A8AA,0xB300A8AB,0xB400A8AC,0xB500A8AD,0xB600A8AE,0xB700A8AF, +0xB800A8B0,0xB900A8B1,0xBA00A8B2,0xBB00A8B3,0xBC00A8B4,0xBD00A8B5,0xBE00A8B6,0xBF00A8B7,0x001938DB,0x002539BC, +0x002539B3,0x002539AA,0x002635D5,0x002539A1,0x00253998,0x0025398F,0x00253986,0x0025397D,0x00253974,0x0025396B, +0x00253962,0x00253959,0x00253950,0x00253947,0x0025393E,0x00253935,0x0025392C,0x00253923,0x0025391A,0x00253911, +0x00253908,0x002538FF,0x002538F6,0x002538ED,0x002538E4,0x002538DB,0x001937E8,0x002538D2,0x002538C9,0x002538C0, +0x002538B7,0x002538AE,0x002538A5,0x0025389C,0x00253893,0x0025388A,0x00253881,0x00253878,0x0025386F,0x00253866, +0x0025385D,0x00253854,0x0025384B,0x00253842,0x00253839,0x00253830,0x00253827,0x0025381E,0x00253815,0x0025380C, +0x00253803,0x002537FA,0x002537F1,0x002537E8,0x001936F5,0x002537DF,0x002537D6,0x002537CD,0x002537C4,0x002537BB, +0x002537B2,0x002537A9,0x8000A8F8,0x8100A8F9,0x8200A8FA,0x8300A8FB,0x8400A8FC,0x8500A8FD,0x8600A8FE,0x8700A8FF, +0x8800A900,0x8900A901,0x8A00A902,0x8B00A903,0x8C00A904,0x8D00A905,0x8E00A906,0x8F00A907,0x9000A908,0x9100A909, +0x9200A90A,0x9300A90B,0x9400A90C,0x9500A90D,0x9600A90E,0x9700A90F,0x9800A910,0x9900A911,0x9A00A912,0x9B00A913, +0x9C00A914,0x9D00A915,0x9E00A916,0x9F00A917,0xA000A918,0xA100A919,0xA200A91A,0xA300A91B,0xA400A91C,0xA500A91D, +0xA600A91E,0xA700A91F,0xA800A920,0xA900A921,0xAA00A922,0xAB00A923,0xAC00A924,0xAD00A925,0xAE00A926,0xAF00A927, +0xB000A928,0xB100A929,0xB200A92A,0xB300A92B,0xB400A92C,0xB500A92D,0xB600A92E,0xB700A92F,0xB800A930,0xB900A931, +0xBA00A932,0xBB00A933,0xBC00A934,0xBD00A935,0xBE00A936,0xBF00A937,0x002537A0,0x00253797,0x0025378E,0x00253785, +0x0025377C,0x00253773,0x0025376A,0x00253761,0x00253758,0x0025374F,0x00253746,0x0025373D,0x00253734,0x0025372B, +0x00253722,0x00253719,0x00253710,0x00253707,0x002536FE,0x002536F5,0x00193602,0x002536EC,0x002536E3,0x002536DA, +0x002536D1,0x002536C8,0x002536BF,0x002536B6,0x002536AD,0x002536A4,0x0025369B,0x00253692,0x00253689,0x00253680, +0x00253677,0x0025366E,0x00253665,0x0025365C,0x00253653,0x0025364A,0x00253641,0x00253638,0x0025362F,0x00253626, +0x0025361D,0x00253614,0x0025360B,0x00253602,0x0019350F,0x002535F9,0x002535F0,0x002535E7,0x002535DE,0x002535D5, +0x002535CC,0x002535C3,0x002535BA,0x002535B1,0x002535A8,0x0025359F,0x00253596,0x0025358D,0x00253584,0x0025357B, +0x8000A978,0x8100A979,0x8200A97A,0x8300A97B,0x8400A97C,0x8500A97D,0x8600A97E,0x8700A97F,0x8800A980,0x8900A981, +0x8A00A982,0x8B00A983,0x8C00A984,0x8D00A985,0x8E00A986,0x8F00A987,0x9000A988,0x9100A989,0x9200A98A,0x9300A98B, +0x9400A98C,0x9500A98D,0x9600A98E,0x9700A98F,0x9800A990,0x9900A991,0x9A00A992,0x9B00A993,0x9C00A994,0x9D00A995, +0x9E00A996,0x9F00A997,0xA000A998,0xA100A999,0xA200A99A,0xA300A99B,0xA400A99C,0xA500A99D,0xA600A99E,0xA700A99F, +0xA800A9A0,0xA900A9A1,0xAA00A9A2,0xAB00A9A3,0xAC00A9A4,0xAD00A9A5,0xAE00A9A6,0xAF00A9A7,0xB000A9A8,0xB100A9A9, +0xB200A9AA,0xB300A9AB,0xB400A9AC,0xB500A9AD,0xB600A9AE,0xB700A9AF,0xB800A9B0,0xB900A9B1,0xBA00A9B2,0xBB00A9B3, +0xBC00A9B4,0xBD00A9B5,0xBE00A9B6,0xBF00A9B7,0x00253572,0x00253569,0x00253560,0x00253557,0x0025354E,0x00253545, +0x0025353C,0x00253533,0x0025352A,0x00253521,0x00253518,0x0025350F,0x0019341C,0x00253506,0x002534FD,0x002534F4, +0x002534EB,0x002534E2,0x002534D9,0x002534D0,0x002534C7,0x002534BE,0x002534B5,0x002534AC,0x002534A3,0x0025349A, +0x00253491,0x00253488,0x0025347F,0x00253476,0x0025346D,0x00253464,0x0025345B,0x00253452,0x00253449,0x00253440, +0x00253437,0x0025342E,0x00253425,0x0025341C,0x00193329,0x00253413,0x0025340A,0x00253401,0x002533F8,0x002533EF, +0x002533E6,0x002533DD,0x002533D4,0x002533CB,0x002533C2,0x002533B9,0x002533B0,0x002533A7,0x0025339E,0x00253395, +0x0025338C,0x00253383,0x0025337A,0x00253371,0x00253368,0x0025335F,0x00253356,0x0025334D,0x8000A9F8,0x8100A9F9, +0x8200A9FA,0x8300A9FB,0x8400A9FC,0x8500A9FD,0x8600A9FE,0x8700A9FF,0x8800AA00,0x8900AA01,0x8A00AA02,0x8B00AA03, +0x8C00AA04,0x8D00AA05,0x8E00AA06,0x8F00AA07,0x9000AA08,0x9100AA09,0x9200AA0A,0x9300AA0B,0x9400AA0C,0x9500AA0D, +0x9600AA0E,0x9700AA0F,0x9800AA10,0x9900AA11,0x9A00AA12,0x9B00AA13,0x9C00AA14,0x9D00AA15,0x9E00AA16,0x9F00AA17, +0xA000AA18,0xA100AA19,0xA200AA1A,0xA300AA1B,0xA400AA1C,0xA500AA1D,0xA600AA1E,0xA700AA1F,0xA800AA20,0xA900AA21, +0xAA00AA22,0xAB00AA23,0xAC00AA24,0xAD00AA25,0xAE00AA26,0xAF00AA27,0xB000AA28,0xB100AA29,0xB200AA2A,0xB300AA2B, +0xB400AA2C,0xB500AA2D,0xB600AA2E,0xB700AA2F,0xB800AA30,0xB900AA31,0xBA00AA32,0xBB00AA33,0xBC00AA34,0xBD00AA35, +0xBE00AA36,0xBF00AA37,0x00253344,0x0025333B,0x00253332,0x00253329,0x00193236,0x00253320,0x00253317,0x0025330E, +0x00253305,0x002532FC,0x002532F3,0x002532EA,0x002532E1,0x002532D8,0x002532CF,0x002532C6,0x002532BD,0x002532B4, +0x002532AB,0x002532A2,0x00253299,0x00253290,0x00253287,0x0025327E,0x00253275,0x0025326C,0x00253263,0x0025325A, +0x00253251,0x00253248,0x0025323F,0x00253236,0x00193143,0x0025322D,0x00253224,0x0025321B,0x00253212,0x00253209, +0x00253200,0x002531F7,0x002531EE,0x002531E5,0x002531DC,0x002531D3,0x002531CA,0x002531C1,0x002531B8,0x002531AF, +0x002531A6,0x0025319D,0x00253194,0x0025318B,0x00253182,0x00253179,0x00253170,0x00253167,0x0025315E,0x00253155, +0x0025314C,0x00253143,0x00193050,0x0025313A,0x00253131,0x00253128,0x8000AA78,0x8100AA79,0x8200AA7A,0x8300AA7B, +0x8400AA7C,0x8500AA7D,0x8600AA7E,0x8700AA7F,0x8800AA80,0x8900AA81,0x8A00AA82,0x8B00AA83,0x8C00AA84,0x8D00AA85, +0x8E00AA86,0x8F00AA87,0x9000AA88,0x9100AA89,0x9200AA8A,0x9300AA8B,0x9400AA8C,0x9500AA8D,0x9600AA8E,0x9700AA8F, +0x9800AA90,0x9900AA91,0x9A00AA92,0x9B00AA93,0x9C00AA94,0x9D00AA95,0x9E00AA96,0x9F00AA97,0xA000AA98,0xA100AA99, +0xA200AA9A,0xA300AA9B,0xA400AA9C,0xA500AA9D,0xA600AA9E,0xA700AA9F,0xA800AAA0,0xA900AAA1,0xAA00AAA2,0xAB00AAA3, +0xAC00AAA4,0xAD00AAA5,0xAE00AAA6,0xAF00AAA7,0xB000AAA8,0xB100AAA9,0xB200AAAA,0xB300AAAB,0xB400AAAC,0xB500AAAD, +0xB600AAAE,0xB700AAAF,0xB800AAB0,0xB900AAB1,0xBA00AAB2,0xBB00AAB3,0xBC00AAB4,0xBD00AAB5,0xBE00AAB6,0xBF00AAB7, +0x0025311F,0x00253116,0x0025310D,0x00253104,0x002530FB,0x002530F2,0x002530E9,0x002530E0,0x002530D7,0x002530CE, +0x002530C5,0x002530BC,0x002530B3,0x002530AA,0x002530A1,0x00253098,0x0025308F,0x00253086,0x0025307D,0x00253074, +0x0025306B,0x00253062,0x00253059,0x00253050,0x00192F5D,0x00253047,0x0025303E,0x00253035,0x0025302C,0x00253023, +0x0025301A,0x00253011,0x00253008,0x00252FFF,0x00252FF6,0x00252FED,0x00252FE4,0x00252FDB,0x00252FD2,0x00252FC9, +0x00252FC0,0x00252FB7,0x00252FAE,0x00252FA5,0x00252F9C,0x00252F93,0x00252F8A,0x00252F81,0x00252F78,0x00252F6F, +0x00252F66,0x00252F5D,0x00192E6A,0x00252F54,0x00252F4B,0x00252F42,0x00252F39,0x00252F30,0x00252F27,0x00252F1E, +0x00252F15,0x00252F0C,0x00252F03,0x00252EFA,0x8000AAF8,0x8100AAF9,0x8200AAFA,0x8300AAFB,0x8400AAFC,0x8500AAFD, +0x8600AAFE,0x8700AAFF,0x8800AB00,0x8900AB01,0x8A00AB02,0x8B00AB03,0x8C00AB04,0x8D00AB05,0x8E00AB06,0x8F00AB07, +0x9000AB08,0x9100AB09,0x9200AB0A,0x9300AB0B,0x9400AB0C,0x9500AB0D,0x9600AB0E,0x9700AB0F,0x9800AB10,0x9900AB11, +0x9A00AB12,0x9B00AB13,0x9C00AB14,0x9D00AB15,0x9E00AB16,0x9F00AB17,0xA000AB18,0xA100AB19,0xA200AB1A,0xA300AB1B, +0xA400AB1C,0xA500AB1D,0xA600AB1E,0xA700AB1F,0xA800AB20,0xA900AB21,0xAA00AB22,0xAB00AB23,0xAC00AB24,0xAD00AB25, +0xAE00AB26,0xAF00AB27,0xB000AB28,0xB100AB29,0xB200AB2A,0xB300AB2B,0xB400AB2C,0xB500AB2D,0xB600AB2E,0xB700AB2F, +0xB800AB30,0xB900AB31,0xBA00AB32,0xBB00AB33,0xBC00AB34,0xBD00AB35,0xBE00AB36,0xBF00AB37,0x00252EF1,0x00252EE8, +0x00252EDF,0x00252ED6,0x00252ECD,0x00252EC4,0x00252EBB,0x00252EB2,0x00252EA9,0x00252EA0,0x00252E97,0x00252E8E, +0x00252E85,0x00252E7C,0x00252E73,0x00252E6A,0x00192D77,0x00252E61,0x00252E58,0x00252E4F,0x00252E46,0x00252E3D, +0x00252E34,0x00252E2B,0x00252E22,0x00252E19,0x00252E10,0x00252E07,0x00252DFE,0x00252DF5,0x00252DEC,0x00252DE3, +0x00252DDA,0x00252DD1,0x00252DC8,0x00252DBF,0x00252DB6,0x00252DAD,0x00252DA4,0x00252D9B,0x00252D92,0x00252D89, +0x00252D80,0x00252D77,0x00192C84,0x00252D6E,0x00252D65,0x00252D5C,0x00252D53,0x00252D4A,0x00252D41,0x00252D38, +0x00252D2F,0x00252D26,0x00252D1D,0x00252D14,0x00252D0B,0x00252D02,0x00252CF9,0x00252CF0,0x00252CE7,0x00252CDE, +0x00252CD5,0x00252CCC,0x8000AB78,0x8100AB79,0x8200AB7A,0x8300AB7B,0x8400AB7C,0x8500AB7D,0x8600AB7E,0x8700AB7F, +0x8800AB80,0x8900AB81,0x8A00AB82,0x8B00AB83,0x8C00AB84,0x8D00AB85,0x8E00AB86,0x8F00AB87,0x9000AB88,0x9100AB89, +0x9200AB8A,0x9300AB8B,0x9400AB8C,0x9500AB8D,0x9600AB8E,0x9700AB8F,0x9800AB90,0x9900AB91,0x9A00AB92,0x9B00AB93, +0x9C00AB94,0x9D00AB95,0x9E00AB96,0x9F00AB97,0xA000AB98,0xA100AB99,0xA200AB9A,0xA300AB9B,0xA400AB9C,0xA500AB9D, +0xA600AB9E,0xA700AB9F,0xA800ABA0,0xA900ABA1,0xAA00ABA2,0xAB00ABA3,0xAC00ABA4,0xAD00ABA5,0xAE00ABA6,0xAF00ABA7, +0xB000ABA8,0xB100ABA9,0xB200ABAA,0xB300ABAB,0xB400ABAC,0xB500ABAD,0xB600ABAE,0xB700ABAF,0xB800ABB0,0xB900ABB1, +0xBA00ABB2,0xBB00ABB3,0xBC00ABB4,0xBD00ABB5,0xBE00ABB6,0xBF00ABB7,0x00252CC3,0x00252CBA,0x00252CB1,0x00252CA8, +0x00252C9F,0x00252C96,0x00252C8D,0x00252C84,0x00192B91,0x00252C7B,0x00252C72,0x00252C69,0x00252C60,0x00252C57, +0x00252C4E,0x00252C45,0x00252C3C,0x00252C33,0x00252C2A,0x00252C21,0x00252C18,0x00252C0F,0x00252C06,0x00252BFD, +0x00252BF4,0x00252BEB,0x00252BE2,0x00252BD9,0x00252BD0,0x00252BC7,0x00252BBE,0x00252BB5,0x00252BAC,0x00252BA3, +0x00252B9A,0x00252B91,0x00192A9E,0x00252B88,0x00252B7F,0x00252B76,0x00252B6D,0x00252B64,0x00252B5B,0x00252B52, +0x00252B49,0x00252B40,0x00252B37,0x00252B2E,0x00252B25,0x00252B1C,0x00252B13,0x00252B0A,0x00252B01,0x00252AF8, +0x00252AEF,0x00252AE6,0x00252ADD,0x00252AD4,0x00252ACB,0x00252AC2,0x00252AB9,0x00252AB0,0x00252AA7,0x00252A9E, +0x8000ABF8,0x8100ABF9,0x8200ABFA,0x8300ABFB,0x8400ABFC,0x8500ABFD,0x8600ABFE,0x8700ABFF,0x8800AC00,0x8900AC01, +0x8A00AC02,0x8B00AC03,0x8C00AC04,0x8D00AC05,0x8E00AC06,0x8F00AC07,0x9000AC08,0x9100AC09,0x9200AC0A,0x9300AC0B, +0x9400AC0C,0x9500AC0D,0x9600AC0E,0x9700AC0F,0x9800AC10,0x9900AC11,0x9A00AC12,0x9B00AC13,0x9C00AC14,0x9D00AC15, +0x9E00AC16,0x9F00AC17,0xA000AC18,0xA100AC19,0xA200AC1A,0xA300AC1B,0xA400AC1C,0xA500AC1D,0xA600AC1E,0xA700AC1F, +0xA800AC20,0xA900AC21,0xAA00AC22,0xAB00AC23,0xAC00AC24,0xAD00AC25,0xAE00AC26,0xAF00AC27,0xB000AC28,0xB100AC29, +0xB200AC2A,0xB300AC2B,0xB400AC2C,0xB500AC2D,0xB600AC2E,0xB700AC2F,0xB800AC30,0xB900AC31,0xBA00AC32,0xBB00AC33, +0xBC00AC34,0xBD00AC35,0xBE00AC36,0xBF00AC37,0x001929AB,0x00252A95,0x00252A8C,0x00252A83,0x00252A7A,0x00252A71, +0x00252A68,0x00252A5F,0x00252A56,0x00252A4D,0x00252A44,0x00252A3B,0x00252A32,0x00252A29,0x00252A20,0x00252A17, +0x00252A0E,0x00252A05,0x002529FC,0x002529F3,0x002529EA,0x002529E1,0x002529D8,0x002529CF,0x002529C6,0x002529BD, +0x002529B4,0x002529AB,0x001928B8,0x002529A2,0x00252999,0x00252990,0x00252987,0x0025297E,0x00252975,0x0025296C, +0x00252963,0x0025295A,0x00252951,0x00252948,0x0025293F,0x00252936,0x0025292D,0x00252924,0x0025291B,0x00252912, +0x00252909,0x00252900,0x002528F7,0x002528EE,0x002528E5,0x002528DC,0x002528D3,0x002528CA,0x002528C1,0x002528B8, +0x001927C5,0x002528AF,0x002528A6,0x0025289D,0x00252894,0x0025288B,0x00252882,0x00252879,0x8000AC78,0x8100AC79, +0x8200AC7A,0x8300AC7B,0x8400AC7C,0x8500AC7D,0x8600AC7E,0x8700AC7F,0x8800AC80,0x8900AC81,0x8A00AC82,0x8B00AC83, +0x8C00AC84,0x8D00AC85,0x8E00AC86,0x8F00AC87,0x9000AC88,0x9100AC89,0x9200AC8A,0x9300AC8B,0x9400AC8C,0x9500AC8D, +0x9600AC8E,0x9700AC8F,0x9800AC90,0x9900AC91,0x9A00AC92,0x9B00AC93,0x9C00AC94,0x9D00AC95,0x9E00AC96,0x9F00AC97, +0xA000AC98,0xA100AC99,0xA200AC9A,0xA300AC9B,0xA400AC9C,0xA500AC9D,0xA600AC9E,0xA700AC9F,0xA800ACA0,0xA900ACA1, +0xAA00ACA2,0xAB00ACA3,0xAC00ACA4,0xAD00ACA5,0xAE00ACA6,0xAF00ACA7,0xB000ACA8,0xB100ACA9,0xB200ACAA,0xB300ACAB, +0xB400ACAC,0xB500ACAD,0xB600ACAE,0xB700ACAF,0xB800ACB0,0xB900ACB1,0xBA00ACB2,0xBB00ACB3,0xBC00ACB4,0xBD00ACB5, +0xBE00ACB6,0xBF00ACB7,0x00252870,0x00252867,0x0025285E,0x00252855,0x0025284C,0x00252843,0x0025283A,0x00252831, +0x00252828,0x0025281F,0x00252816,0x0025280D,0x00252804,0x002527FB,0x002527F2,0x002527E9,0x002527E0,0x002527D7, +0x002527CE,0x002527C5,0x001926D2,0x002527BC,0x002527B3,0x002527AA,0x002527A1,0x00252798,0x0025278F,0x00252786, +0x0025277D,0x00252774,0x0025276B,0x00252762,0x00252759,0x00252750,0x00252747,0x0025273E,0x00252735,0x0025272C, +0x00252723,0x0025271A,0x00252711,0x00252708,0x002526FF,0x002526F6,0x002526ED,0x002526E4,0x002526DB,0x002526D2, +0x001925DF,0x002526C9,0x002526C0,0x002526B7,0x002526AE,0x002526A5,0x0025269C,0x00252693,0x0025268A,0x00252681, +0x00252678,0x0025266F,0x00252666,0x0025265D,0x00252654,0x0025264B,0x8000ACF8,0x8100ACF9,0x8200ACFA,0x8300ACFB, +0x8400ACFC,0x8500ACFD,0x8600ACFE,0x8700ACFF,0x8800AD00,0x8900AD01,0x8A00AD02,0x8B00AD03,0x8C00AD04,0x8D00AD05, +0x8E00AD06,0x8F00AD07,0x9000AD08,0x9100AD09,0x9200AD0A,0x9300AD0B,0x9400AD0C,0x9500AD0D,0x9600AD0E,0x9700AD0F, +0x9800AD10,0x9900AD11,0x9A00AD12,0x9B00AD13,0x9C00AD14,0x9D00AD15,0x9E00AD16,0x9F00AD17,0xA000AD18,0xA100AD19, +0xA200AD1A,0xA300AD1B,0xA400AD1C,0xA500AD1D,0xA600AD1E,0xA700AD1F,0xA800AD20,0xA900AD21,0xAA00AD22,0xAB00AD23, +0xAC00AD24,0xAD00AD25,0xAE00AD26,0xAF00AD27,0xB000AD28,0xB100AD29,0xB200AD2A,0xB300AD2B,0xB400AD2C,0xB500AD2D, +0xB600AD2E,0xB700AD2F,0xB800AD30,0xB900AD31,0xBA00AD32,0xBB00AD33,0xBC00AD34,0xBD00AD35,0xBE00AD36,0xBF00AD37, +0x00252642,0x00252639,0x00252630,0x00252627,0x0025261E,0x00252615,0x0025260C,0x00252603,0x002525FA,0x002525F1, +0x002525E8,0x002525DF,0x001924EC,0x002525D6,0x002525CD,0x002525C4,0x002525BB,0x002525B2,0x002525A9,0x002525A0, +0x00252597,0x0025258E,0x00252585,0x0025257C,0x00252573,0x0025256A,0x00252561,0x00252558,0x0025254F,0x00252546, +0x0025253D,0x00252534,0x0025252B,0x00252522,0x00252519,0x00252510,0x00252507,0x002524FE,0x002524F5,0x002524EC, +0x001923F9,0x002524E3,0x002524DA,0x002524D1,0x002524C8,0x002524BF,0x002524B6,0x002524AD,0x002524A4,0x0025249B, +0x00252492,0x00252489,0x00252480,0x00252477,0x0025246E,0x00252465,0x0025245C,0x00252453,0x0025244A,0x00252441, +0x00252438,0x0025242F,0x00252426,0x0025241D,0x8000AD78,0x8100AD79,0x8200AD7A,0x8300AD7B,0x8400AD7C,0x8500AD7D, +0x8600AD7E,0x8700AD7F,0x8800AD80,0x8900AD81,0x8A00AD82,0x8B00AD83,0x8C00AD84,0x8D00AD85,0x8E00AD86,0x8F00AD87, +0x9000AD88,0x9100AD89,0x9200AD8A,0x9300AD8B,0x9400AD8C,0x9500AD8D,0x9600AD8E,0x9700AD8F,0x9800AD90,0x9900AD91, +0x9A00AD92,0x9B00AD93,0x9C00AD94,0x9D00AD95,0x9E00AD96,0x9F00AD97,0xA000AD98,0xA100AD99,0xA200AD9A,0xA300AD9B, +0xA400AD9C,0xA500AD9D,0xA600AD9E,0xA700AD9F,0xA800ADA0,0xA900ADA1,0xAA00ADA2,0xAB00ADA3,0xAC00ADA4,0xAD00ADA5, +0xAE00ADA6,0xAF00ADA7,0xB000ADA8,0xB100ADA9,0xB200ADAA,0xB300ADAB,0xB400ADAC,0xB500ADAD,0xB600ADAE,0xB700ADAF, +0xB800ADB0,0xB900ADB1,0xBA00ADB2,0xBB00ADB3,0xBC00ADB4,0xBD00ADB5,0xBE00ADB6,0xBF00ADB7,0x00252414,0x0025240B, +0x00252402,0x002523F9,0x00192306,0x002523F0,0x002523E7,0x002523DE,0x002523D5,0x002523CC,0x002523C3,0x002523BA, +0x002523B1,0x002523A8,0x0025239F,0x00252396,0x0025238D,0x00252384,0x0025237B,0x00252372,0x00252369,0x00252360, +0x00252357,0x0025234E,0x00252345,0x0025233C,0x00252333,0x0025232A,0x00252321,0x00252318,0x0025230F,0x00252306, +0x00192213,0x002522FD,0x002522F4,0x002522EB,0x002522E2,0x002522D9,0x002522D0,0x002522C7,0x002522BE,0x002522B5, +0x002522AC,0x002522A3,0x0025229A,0x00252291,0x00252288,0x0025227F,0x00252276,0x0025226D,0x00252264,0x0025225B, +0x00252252,0x00252249,0x00252240,0x00252237,0x0025222E,0x00252225,0x0025221C,0x00252213,0x00192120,0x0025220A, +0x00252201,0x002521F8,0x8000ADF8,0x8100ADF9,0x8200ADFA,0x8300ADFB,0x8400ADFC,0x8500ADFD,0x8600ADFE,0x8700ADFF, +0x8800AE00,0x8900AE01,0x8A00AE02,0x8B00AE03,0x8C00AE04,0x8D00AE05,0x8E00AE06,0x8F00AE07,0x9000AE08,0x9100AE09, +0x9200AE0A,0x9300AE0B,0x9400AE0C,0x9500AE0D,0x9600AE0E,0x9700AE0F,0x9800AE10,0x9900AE11,0x9A00AE12,0x9B00AE13, +0x9C00AE14,0x9D00AE15,0x9E00AE16,0x9F00AE17,0xA000AE18,0xA100AE19,0xA200AE1A,0xA300AE1B,0xA400AE1C,0xA500AE1D, +0xA600AE1E,0xA700AE1F,0xA800AE20,0xA900AE21,0xAA00AE22,0xAB00AE23,0xAC00AE24,0xAD00AE25,0xAE00AE26,0xAF00AE27, +0xB000AE28,0xB100AE29,0xB200AE2A,0xB300AE2B,0xB400AE2C,0xB500AE2D,0xB600AE2E,0xB700AE2F,0xB800AE30,0xB900AE31, +0xBA00AE32,0xBB00AE33,0xBC00AE34,0xBD00AE35,0xBE00AE36,0xBF00AE37,0x002521EF,0x002521E6,0x002521DD,0x002521D4, +0x002521CB,0x002521C2,0x002521B9,0x002521B0,0x002521A7,0x0025219E,0x00252195,0x0025218C,0x00252183,0x0025217A, +0x00252171,0x00252168,0x0025215F,0x00252156,0x0025214D,0x00252144,0x0025213B,0x00252132,0x00252129,0x00252120, +0x0019202D,0x00252117,0x0025210E,0x00252105,0x002520FC,0x002520F3,0x002520EA,0x002520E1,0x002520D8,0x002520CF, +0x002520C6,0x002520BD,0x002520B4,0x002520AB,0x002520A2,0x00252099,0x00252090,0x00252087,0x0025207E,0x00252075, +0x0025206C,0x00252063,0x0025205A,0x00252051,0x00252048,0x0025203F,0x00252036,0x0025202D,0x00191F3A,0x00252024, +0x0025201B,0x00252012,0x00252009,0x00252000,0x00251FF7,0x00251FEE,0x00251FE5,0x00251FDC,0x00251FD3,0x00251FCA, +0x8000AE78,0x8100AE79,0x8200AE7A,0x8300AE7B,0x8400AE7C,0x8500AE7D,0x8600AE7E,0x8700AE7F,0x8800AE80,0x8900AE81, +0x8A00AE82,0x8B00AE83,0x8C00AE84,0x8D00AE85,0x8E00AE86,0x8F00AE87,0x9000AE88,0x9100AE89,0x9200AE8A,0x9300AE8B, +0x9400AE8C,0x9500AE8D,0x9600AE8E,0x9700AE8F,0x9800AE90,0x9900AE91,0x9A00AE92,0x9B00AE93,0x9C00AE94,0x9D00AE95, +0x9E00AE96,0x9F00AE97,0xA000AE98,0xA100AE99,0xA200AE9A,0xA300AE9B,0xA400AE9C,0xA500AE9D,0xA600AE9E,0xA700AE9F, +0xA800AEA0,0xA900AEA1,0xAA00AEA2,0xAB00AEA3,0xAC00AEA4,0xAD00AEA5,0xAE00AEA6,0xAF00AEA7,0xB000AEA8,0xB100AEA9, +0xB200AEAA,0xB300AEAB,0xB400AEAC,0xB500AEAD,0xB600AEAE,0xB700AEAF,0xB800AEB0,0xB900AEB1,0xBA00AEB2,0xBB00AEB3, +0xBC00AEB4,0xBD00AEB5,0xBE00AEB6,0xBF00AEB7,0x00251FC1,0x00251FB8,0x00251FAF,0x00251FA6,0x00251F9D,0x00251F94, +0x00251F8B,0x00251F82,0x00251F79,0x00251F70,0x00251F67,0x00251F5E,0x00251F55,0x00251F4C,0x00251F43,0x00251F3A, +0x00191E47,0x00251F31,0x00251F28,0x00251F1F,0x00251F16,0x00251F0D,0x00251F04,0x00251EFB,0x00251EF2,0x00251EE9, +0x00251EE0,0x00251ED7,0x00251ECE,0x00251EC5,0x00251EBC,0x00251EB3,0x00251EAA,0x00251EA1,0x00251E98,0x00251E8F, +0x00251E86,0x00251E7D,0x00251E74,0x00251E6B,0x00251E62,0x00251E59,0x00251E50,0x00251E47,0x00191D54,0x00251E3E, +0x00251E35,0x00251E2C,0x00251E23,0x00251E1A,0x00251E11,0x00251E08,0x00251DFF,0x00251DF6,0x00251DED,0x00251DE4, +0x00251DDB,0x00251DD2,0x00251DC9,0x00251DC0,0x00251DB7,0x00251DAE,0x00251DA5,0x00251D9C,0x8000AEF8,0x8100AEF9, +0x8200AEFA,0x8300AEFB,0x8400AEFC,0x8500AEFD,0x8600AEFE,0x8700AEFF,0x8800AF00,0x8900AF01,0x8A00AF02,0x8B00AF03, +0x8C00AF04,0x8D00AF05,0x8E00AF06,0x8F00AF07,0x9000AF08,0x9100AF09,0x9200AF0A,0x9300AF0B,0x9400AF0C,0x9500AF0D, +0x9600AF0E,0x9700AF0F,0x9800AF10,0x9900AF11,0x9A00AF12,0x9B00AF13,0x9C00AF14,0x9D00AF15,0x9E00AF16,0x9F00AF17, +0xA000AF18,0xA100AF19,0xA200AF1A,0xA300AF1B,0xA400AF1C,0xA500AF1D,0xA600AF1E,0xA700AF1F,0xA800AF20,0xA900AF21, +0xAA00AF22,0xAB00AF23,0xAC00AF24,0xAD00AF25,0xAE00AF26,0xAF00AF27,0xB000AF28,0xB100AF29,0xB200AF2A,0xB300AF2B, +0xB400AF2C,0xB500AF2D,0xB600AF2E,0xB700AF2F,0xB800AF30,0xB900AF31,0xBA00AF32,0xBB00AF33,0xBC00AF34,0xBD00AF35, +0xBE00AF36,0xBF00AF37,0x00251D93,0x00251D8A,0x00251D81,0x00251D78,0x00251D6F,0x00251D66,0x00251D5D,0x00251D54, +0x00191C61,0x00251D4B,0x00251D42,0x00251D39,0x00251D30,0x00251D27,0x00251D1E,0x00251D15,0x00251D0C,0x00251D03, +0x00251CFA,0x00251CF1,0x00251CE8,0x00251CDF,0x00251CD6,0x00251CCD,0x00251CC4,0x00251CBB,0x00251CB2,0x00251CA9, +0x00251CA0,0x00251C97,0x00251C8E,0x00251C85,0x00251C7C,0x00251C73,0x00251C6A,0x00251C61,0x00191B6E,0x00251C58, +0x00251C4F,0x00251C46,0x00251C3D,0x00251C34,0x00251C2B,0x00251C22,0x00251C19,0x00251C10,0x00251C07,0x00251BFE, +0x00251BF5,0x00251BEC,0x00251BE3,0x00251BDA,0x00251BD1,0x00251BC8,0x00251BBF,0x00251BB6,0x00251BAD,0x00251BA4, +0x00251B9B,0x00251B92,0x00251B89,0x00251B80,0x00251B77,0x00251B6E,0x8000AF78,0x8100AF79,0x8200AF7A,0x8300AF7B, +0x8400AF7C,0x8500AF7D,0x8600AF7E,0x8700AF7F,0x8800AF80,0x8900AF81,0x8A00AF82,0x8B00AF83,0x8C00AF84,0x8D00AF85, +0x8E00AF86,0x8F00AF87,0x9000AF88,0x9100AF89,0x9200AF8A,0x9300AF8B,0x9400AF8C,0x9500AF8D,0x9600AF8E,0x9700AF8F, +0x9800AF90,0x9900AF91,0x9A00AF92,0x9B00AF93,0x9C00AF94,0x9D00AF95,0x9E00AF96,0x9F00AF97,0xA000AF98,0xA100AF99, +0xA200AF9A,0xA300AF9B,0xA400AF9C,0xA500AF9D,0xA600AF9E,0xA700AF9F,0xA800AFA0,0xA900AFA1,0xAA00AFA2,0xAB00AFA3, +0xAC00AFA4,0xAD00AFA5,0xAE00AFA6,0xAF00AFA7,0xB000AFA8,0xB100AFA9,0xB200AFAA,0xB300AFAB,0xB400AFAC,0xB500AFAD, +0xB600AFAE,0xB700AFAF,0xB800AFB0,0xB900AFB1,0xBA00AFB2,0xBB00AFB3,0xBC00AFB4,0xBD00AFB5,0xBE00AFB6,0xBF00AFB7, +0x00191A7B,0x00251B65,0x00251B5C,0x00251B53,0x00251B4A,0x00251B41,0x00251B38,0x00251B2F,0x00251B26,0x00251B1D, +0x00251B14,0x00251B0B,0x00251B02,0x00251AF9,0x00251AF0,0x00251AE7,0x00251ADE,0x00251AD5,0x00251ACC,0x00251AC3, +0x00251ABA,0x00251AB1,0x00251AA8,0x00251A9F,0x00251A96,0x00251A8D,0x00251A84,0x00251A7B,0x00191988,0x00251A72, +0x00251A69,0x00251A60,0x00251A57,0x00251A4E,0x00251A45,0x00251A3C,0x00251A33,0x00251A2A,0x00251A21,0x00251A18, +0x00251A0F,0x00251A06,0x002519FD,0x002519F4,0x002519EB,0x002519E2,0x002519D9,0x002519D0,0x002519C7,0x002519BE, +0x002519B5,0x002519AC,0x002519A3,0x0025199A,0x00251991,0x00251988,0x00191895,0x0025197F,0x00251976,0x0025196D, +0x00251964,0x0025195B,0x00251952,0x00251949,0x8000AFF8,0x8100AFF9,0x8200AFFA,0x8300AFFB,0x8400AFFC,0x8500AFFD, +0x8600AFFE,0x8700AFFF,0x8800B000,0x8900B001,0x8A00B002,0x8B00B003,0x8C00B004,0x8D00B005,0x8E00B006,0x8F00B007, +0x9000B008,0x9100B009,0x9200B00A,0x9300B00B,0x9400B00C,0x9500B00D,0x9600B00E,0x9700B00F,0x9800B010,0x9900B011, +0x9A00B012,0x9B00B013,0x9C00B014,0x9D00B015,0x9E00B016,0x9F00B017,0xA000B018,0xA100B019,0xA200B01A,0xA300B01B, +0xA400B01C,0xA500B01D,0xA600B01E,0xA700B01F,0xA800B020,0xA900B021,0xAA00B022,0xAB00B023,0xAC00B024,0xAD00B025, +0xAE00B026,0xAF00B027,0xB000B028,0xB100B029,0xB200B02A,0xB300B02B,0xB400B02C,0xB500B02D,0xB600B02E,0xB700B02F, +0xB800B030,0xB900B031,0xBA00B032,0xBB00B033,0xBC00B034,0xBD00B035,0xBE00B036,0xBF00B037,0x00251940,0x00251937, +0x0025192E,0x00251925,0x0025191C,0x00251913,0x0025190A,0x00251901,0x002518F8,0x002518EF,0x002518E6,0x002518DD, +0x002518D4,0x002518CB,0x002518C2,0x002518B9,0x002518B0,0x002518A7,0x0025189E,0x00251895,0x001917A2,0x0025188C, +0x00251883,0x0025187A,0x00251871,0x00251868,0x0025185F,0x00251856,0x0025184D,0x00251844,0x0025183B,0x00251832, +0x00251829,0x00251820,0x00251817,0x0025180E,0x00251805,0x002517FC,0x002517F3,0x002517EA,0x002517E1,0x002517D8, +0x002517CF,0x002517C6,0x002517BD,0x002517B4,0x002517AB,0x002517A2,0x001916AF,0x00251799,0x00251790,0x00251787, +0x0025177E,0x00251775,0x0025176C,0x00251763,0x0025175A,0x00251751,0x00251748,0x0025173F,0x00251736,0x0025172D, +0x00251724,0x0025171B,0x8000B078,0x8100B079,0x8200B07A,0x8300B07B,0x8400B07C,0x8500B07D,0x8600B07E,0x8700B07F, +0x8800B080,0x8900B081,0x8A00B082,0x8B00B083,0x8C00B084,0x8D00B085,0x8E00B086,0x8F00B087,0x9000B088,0x9100B089, +0x9200B08A,0x9300B08B,0x9400B08C,0x9500B08D,0x9600B08E,0x9700B08F,0x9800B090,0x9900B091,0x9A00B092,0x9B00B093, +0x9C00B094,0x9D00B095,0x9E00B096,0x9F00B097,0xA000B098,0xA100B099,0xA200B09A,0xA300B09B,0xA400B09C,0xA500B09D, +0xA600B09E,0xA700B09F,0xA800B0A0,0xA900B0A1,0xAA00B0A2,0xAB00B0A3,0xAC00B0A4,0xAD00B0A5,0xAE00B0A6,0xAF00B0A7, +0xB000B0A8,0xB100B0A9,0xB200B0AA,0xB300B0AB,0xB400B0AC,0xB500B0AD,0xB600B0AE,0xB700B0AF,0xB800B0B0,0xB900B0B1, +0xBA00B0B2,0xBB00B0B3,0xBC00B0B4,0xBD00B0B5,0xBE00B0B6,0xBF00B0B7,0x00251712,0x00251709,0x00251700,0x002516F7, +0x002516EE,0x002516E5,0x002516DC,0x002516D3,0x002516CA,0x002516C1,0x002516B8,0x002516AF,0x001915BC,0x002516A6, +0x0025169D,0x00251694,0x0025168B,0x00251682,0x00251679,0x00251670,0x00251667,0x0025165E,0x00251655,0x0025164C, +0x00251643,0x0025163A,0x00251631,0x00251628,0x0025161F,0x00251616,0x0025160D,0x00251604,0x002515FB,0x002515F2, +0x002515E9,0x002515E0,0x002515D7,0x002515CE,0x002515C5,0x002515BC,0x001914D2,0x002515B3,0x002515AA,0x002515A1, +0x00251598,0x0025158F,0x00251586,0x0025157D,0x00251574,0x0025156B,0x00251562,0x00251559,0x00251550,0x00251547, +0x0025153E,0x00251535,0x002634D1,0x0025152C,0x00251523,0x0025151A,0x00251511,0x00251508,0x002514FF,0x002514F6, +0x8000B0F8,0x8100B0F9,0x8200B0FA,0x8300B0FB,0x8400B0FC,0x8500B0FD,0x8600B0FE,0x8700B0FF,0x8800B100,0x8900B101, +0x8A00B102,0x8B00B103,0x8C00B104,0x8D00B105,0x8E00B106,0x8F00B107,0x9000B108,0x9100B109,0x9200B10A,0x9300B10B, +0x9400B10C,0x9500B10D,0x9600B10E,0x9700B10F,0x9800B110,0x9900B111,0x9A00B112,0x9B00B113,0x9C00B114,0x9D00B115, +0x9E00B116,0x9F00B117,0xA000B118,0xA100B119,0xA200B11A,0xA300B11B,0xA400B11C,0xA500B11D,0xA600B11E,0xA700B11F, +0xA800B120,0xA900B121,0xAA00B122,0xAB00B123,0xAC00B124,0xAD00B125,0xAE00B126,0xAF00B127,0xB000B128,0xB100B129, +0xB200B12A,0xB300B12B,0xB400B12C,0xB500B12D,0xB600B12E,0xB700B12F,0xB800B130,0xB900B131,0xBA00B132,0xBB00B133, +0xBC00B134,0xBD00B135,0xBE00B136,0xBF00B137,0x002514ED,0x002514E4,0x002514DB,0x002514D2,0x001913DF,0x002514C9, +0x002514C0,0x002514B7,0x002514AE,0x002514A5,0x0025149C,0x00251493,0x0025148A,0x00251481,0x00251478,0x0025146F, +0x00251466,0x0025145D,0x00251454,0x0025144B,0x00251442,0x00251439,0x00251430,0x00251427,0x0025141E,0x00251415, +0x0025140C,0x00251403,0x002513FA,0x002513F1,0x002513E8,0x002513DF,0x001912EC,0x002513D6,0x002513CD,0x002513C4, +0x002513BB,0x002513B2,0x002513A9,0x002513A0,0x00251397,0x0025138E,0x00251385,0x0025137C,0x00251373,0x0025136A, +0x00251361,0x00251358,0x0025134F,0x00251346,0x0025133D,0x00251334,0x0025132B,0x00251322,0x00251319,0x00251310, +0x00251307,0x002512FE,0x002512F5,0x002512EC,0x001911F9,0x002512E3,0x002512DA,0x002512D1,0x8000B178,0x8100B179, +0x8200B17A,0x8300B17B,0x8400B17C,0x8500B17D,0x8600B17E,0x8700B17F,0x8800B180,0x8900B181,0x8A00B182,0x8B00B183, +0x8C00B184,0x8D00B185,0x8E00B186,0x8F00B187,0x9000B188,0x9100B189,0x9200B18A,0x9300B18B,0x9400B18C,0x9500B18D, +0x9600B18E,0x9700B18F,0x9800B190,0x9900B191,0x9A00B192,0x9B00B193,0x9C00B194,0x9D00B195,0x9E00B196,0x9F00B197, +0xA000B198,0xA100B199,0xA200B19A,0xA300B19B,0xA400B19C,0xA500B19D,0xA600B19E,0xA700B19F,0xA800B1A0,0xA900B1A1, +0xAA00B1A2,0xAB00B1A3,0xAC00B1A4,0xAD00B1A5,0xAE00B1A6,0xAF00B1A7,0xB000B1A8,0xB100B1A9,0xB200B1AA,0xB300B1AB, +0xB400B1AC,0xB500B1AD,0xB600B1AE,0xB700B1AF,0xB800B1B0,0xB900B1B1,0xBA00B1B2,0xBB00B1B3,0xBC00B1B4,0xBD00B1B5, +0xBE00B1B6,0xBF00B1B7,0x002512C8,0x002512BF,0x002512B6,0x002512AD,0x002512A4,0x0025129B,0x00251292,0x00251289, +0x00251280,0x00251277,0x0025126E,0x00251265,0x0025125C,0x00251253,0x0025124A,0x00251241,0x00251238,0x0025122F, +0x00251226,0x0025121D,0x00251214,0x0025120B,0x00251202,0x002511F9,0x00191106,0x002511F0,0x002511E7,0x002511DE, +0x002511D5,0x002511CC,0x002511C3,0x002511BA,0x002511B1,0x002511A8,0x0025119F,0x00251196,0x0025118D,0x00251184, +0x0025117B,0x00251172,0x00251169,0x00251160,0x00251157,0x0025114E,0x00251145,0x0025113C,0x00251133,0x0025112A, +0x00251121,0x00251118,0x0025110F,0x00251106,0x00191013,0x002510FD,0x002510F4,0x002510EB,0x002510E2,0x002510D9, +0x002510D0,0x002510C7,0x002510BE,0x002510B5,0x002510AC,0x002510A3,0x8000B1F8,0x8100B1F9,0x8200B1FA,0x8300B1FB, +0x8400B1FC,0x8500B1FD,0x8600B1FE,0x8700B1FF,0x8800B200,0x8900B201,0x8A00B202,0x8B00B203,0x8C00B204,0x8D00B205, +0x8E00B206,0x8F00B207,0x9000B208,0x9100B209,0x9200B20A,0x9300B20B,0x9400B20C,0x9500B20D,0x9600B20E,0x9700B20F, +0x9800B210,0x9900B211,0x9A00B212,0x9B00B213,0x9C00B214,0x9D00B215,0x9E00B216,0x9F00B217,0xA000B218,0xA100B219, +0xA200B21A,0xA300B21B,0xA400B21C,0xA500B21D,0xA600B21E,0xA700B21F,0xA800B220,0xA900B221,0xAA00B222,0xAB00B223, +0xAC00B224,0xAD00B225,0xAE00B226,0xAF00B227,0xB000B228,0xB100B229,0xB200B22A,0xB300B22B,0xB400B22C,0xB500B22D, +0xB600B22E,0xB700B22F,0xB800B230,0xB900B231,0xBA00B232,0xBB00B233,0xBC00B234,0xBD00B235,0xBE00B236,0xBF00B237, +0x0025109A,0x00251091,0x00251088,0x0025107F,0x00251076,0x0025106D,0x00251064,0x0025105B,0x00251052,0x00251049, +0x00251040,0x00251037,0x0025102E,0x00251025,0x0025101C,0x00251013,0x00190F20,0x0025100A,0x00251001,0x00250FF8, +0x00250FEF,0x00250FE6,0x00250FDD,0x00250FD4,0x00250FCB,0x00250FC2,0x00250FB9,0x00250FB0,0x00250FA7,0x00250F9E, +0x00250F95,0x00250F8C,0x00250F83,0x00250F7A,0x00250F71,0x00250F68,0x00250F5F,0x00250F56,0x00250F4D,0x00250F44, +0x00250F3B,0x00250F32,0x00250F29,0x00250F20,0x00190E2D,0x00250F17,0x00250F0E,0x00250F05,0x00250EFC,0x00250EF3, +0x00250EEA,0x00250EE1,0x00250ED8,0x00250ECF,0x00250EC6,0x00250EBD,0x00250EB4,0x00250EAB,0x00250EA2,0x00250E99, +0x00250E90,0x00250E87,0x00250E7E,0x00250E75,0x8000B278,0x8100B279,0x8200B27A,0x8300B27B,0x8400B27C,0x8500B27D, +0x8600B27E,0x8700B27F,0x8800B280,0x8900B281,0x8A00B282,0x8B00B283,0x8C00B284,0x8D00B285,0x8E00B286,0x8F00B287, +0x9000B288,0x9100B289,0x9200B28A,0x9300B28B,0x9400B28C,0x9500B28D,0x9600B28E,0x9700B28F,0x9800B290,0x9900B291, +0x9A00B292,0x9B00B293,0x9C00B294,0x9D00B295,0x9E00B296,0x9F00B297,0xA000B298,0xA100B299,0xA200B29A,0xA300B29B, +0xA400B29C,0xA500B29D,0xA600B29E,0xA700B29F,0xA800B2A0,0xA900B2A1,0xAA00B2A2,0xAB00B2A3,0xAC00B2A4,0xAD00B2A5, +0xAE00B2A6,0xAF00B2A7,0xB000B2A8,0xB100B2A9,0xB200B2AA,0xB300B2AB,0xB400B2AC,0xB500B2AD,0xB600B2AE,0xB700B2AF, +0xB800B2B0,0xB900B2B1,0xBA00B2B2,0xBB00B2B3,0xBC00B2B4,0xBD00B2B5,0xBE00B2B6,0xBF00B2B7,0x00250E6C,0x00250E63, +0x00250E5A,0x00250E51,0x00250E48,0x00250E3F,0x00250E36,0x00250E2D,0x00190D3A,0x00250E24,0x00250E1B,0x00250E12, +0x00250E09,0x00250E00,0x00250DF7,0x00250DEE,0x00250DE5,0x00250DDC,0x00250DD3,0x00250DCA,0x00250DC1,0x00250DB8, +0x00250DAF,0x00250DA6,0x00250D9D,0x00250D94,0x00250D8B,0x00250D82,0x00250D79,0x00250D70,0x00250D67,0x00250D5E, +0x00250D55,0x00250D4C,0x00250D43,0x00250D3A,0x00190C47,0x00250D31,0x00250D28,0x00250D1F,0x00250D16,0x00250D0D, +0x00250D04,0x00250CFB,0x00250CF2,0x00250CE9,0x00250CE0,0x00250CD7,0x00250CCE,0x00250CC5,0x00250CBC,0x00250CB3, +0x00250CAA,0x00250CA1,0x00250C98,0x00250C8F,0x00250C86,0x00250C7D,0x00250C74,0x00250C6B,0x00250C62,0x00250C59, +0x00250C50,0x00250C47,0x8000B2F8,0x8100B2F9,0x8200B2FA,0x8300B2FB,0x8400B2FC,0x8500B2FD,0x8600B2FE,0x8700B2FF, +0x8800B300,0x8900B301,0x8A00B302,0x8B00B303,0x8C00B304,0x8D00B305,0x8E00B306,0x8F00B307,0x9000B308,0x9100B309, +0x9200B30A,0x9300B30B,0x9400B30C,0x9500B30D,0x9600B30E,0x9700B30F,0x9800B310,0x9900B311,0x9A00B312,0x9B00B313, +0x9C00B314,0x9D00B315,0x9E00B316,0x9F00B317,0xA000B318,0xA100B319,0xA200B31A,0xA300B31B,0xA400B31C,0xA500B31D, +0xA600B31E,0xA700B31F,0xA800B320,0xA900B321,0xAA00B322,0xAB00B323,0xAC00B324,0xAD00B325,0xAE00B326,0xAF00B327, +0xB000B328,0xB100B329,0xB200B32A,0xB300B32B,0xB400B32C,0xB500B32D,0xB600B32E,0xB700B32F,0xB800B330,0xB900B331, +0xBA00B332,0xBB00B333,0xBC00B334,0xBD00B335,0xBE00B336,0xBF00B337,0x00190B54,0x00250C3E,0x00250C35,0x00250C2C, +0x00250C23,0x00250C1A,0x00250C11,0x00250C08,0x00250BFF,0x00250BF6,0x00250BED,0x00250BE4,0x00250BDB,0x00250BD2, +0x00250BC9,0x00250BC0,0x00250BB7,0x00250BAE,0x00250BA5,0x00250B9C,0x00250B93,0x00250B8A,0x00250B81,0x00250B78, +0x00250B6F,0x00250B66,0x00250B5D,0x00250B54,0x00190A61,0x00250B4B,0x00250B42,0x00250B39,0x00250B30,0x00250B27, +0x00250B1E,0x00250B15,0x00250B0C,0x00250B03,0x00250AFA,0x00250AF1,0x00250AE8,0x00250ADF,0x00250AD6,0x00250ACD, +0x00250AC4,0x00250ABB,0x00250AB2,0x00250AA9,0x00250AA0,0x00250A97,0x00250A8E,0x00250A85,0x00250A7C,0x00250A73, +0x00250A6A,0x00250A61,0x0019096E,0x00250A58,0x00250A4F,0x00250A46,0x00250A3D,0x00250A34,0x00250A2B,0x00250A22, +0x8000B378,0x8100B379,0x8200B37A,0x8300B37B,0x8400B37C,0x8500B37D,0x8600B37E,0x8700B37F,0x8800B380,0x8900B381, +0x8A00B382,0x8B00B383,0x8C00B384,0x8D00B385,0x8E00B386,0x8F00B387,0x9000B388,0x9100B389,0x9200B38A,0x9300B38B, +0x9400B38C,0x9500B38D,0x9600B38E,0x9700B38F,0x9800B390,0x9900B391,0x9A00B392,0x9B00B393,0x9C00B394,0x9D00B395, +0x9E00B396,0x9F00B397,0xA000B398,0xA100B399,0xA200B39A,0xA300B39B,0xA400B39C,0xA500B39D,0xA600B39E,0xA700B39F, +0xA800B3A0,0xA900B3A1,0xAA00B3A2,0xAB00B3A3,0xAC00B3A4,0xAD00B3A5,0xAE00B3A6,0xAF00B3A7,0xB000B3A8,0xB100B3A9, +0xB200B3AA,0xB300B3AB,0xB400B3AC,0xB500B3AD,0xB600B3AE,0xB700B3AF,0xB800B3B0,0xB900B3B1,0xBA00B3B2,0xBB00B3B3, +0xBC00B3B4,0xBD00B3B5,0xBE00B3B6,0xBF00B3B7,0x00250A19,0x00250A10,0x00250A07,0x002509FE,0x002509F5,0x002509EC, +0x002509E3,0x002509DA,0x002509D1,0x002509C8,0x002509BF,0x002509B6,0x002509AD,0x002509A4,0x0025099B,0x00250992, +0x00250989,0x00250980,0x00250977,0x0025096E,0x0019087B,0x00250965,0x0025095C,0x00250953,0x0025094A,0x00250941, +0x00250938,0x0025092F,0x00250926,0x0025091D,0x00250914,0x0025090B,0x00250902,0x002508F9,0x002508F0,0x002508E7, +0x002508DE,0x002508D5,0x002508CC,0x002508C3,0x002508BA,0x002508B1,0x002508A8,0x0025089F,0x00250896,0x0025088D, +0x00250884,0x0025087B,0x00190788,0x00250872,0x00250869,0x00250860,0x00250857,0x0025084E,0x00250845,0x0025083C, +0x00250833,0x0025082A,0x00250821,0x00250818,0x0025080F,0x00250806,0x002507FD,0x002507F4,0x8000B3F8,0x8100B3F9, +0x8200B3FA,0x8300B3FB,0x8400B3FC,0x8500B3FD,0x8600B3FE,0x8700B3FF,0x8800B400,0x8900B401,0x8A00B402,0x8B00B403, +0x8C00B404,0x8D00B405,0x8E00B406,0x8F00B407,0x9000B408,0x9100B409,0x9200B40A,0x9300B40B,0x9400B40C,0x9500B40D, +0x9600B40E,0x9700B40F,0x9800B410,0x9900B411,0x9A00B412,0x9B00B413,0x9C00B414,0x9D00B415,0x9E00B416,0x9F00B417, +0xA000B418,0xA100B419,0xA200B41A,0xA300B41B,0xA400B41C,0xA500B41D,0xA600B41E,0xA700B41F,0xA800B420,0xA900B421, +0xAA00B422,0xAB00B423,0xAC00B424,0xAD00B425,0xAE00B426,0xAF00B427,0xB000B428,0xB100B429,0xB200B42A,0xB300B42B, +0xB400B42C,0xB500B42D,0xB600B42E,0xB700B42F,0xB800B430,0xB900B431,0xBA00B432,0xBB00B433,0xBC00B434,0xBD00B435, +0xBE00B436,0xBF00B437,0x002507EB,0x002507E2,0x002507D9,0x002507D0,0x002507C7,0x002507BE,0x002507B5,0x002507AC, +0x002507A3,0x0025079A,0x00250791,0x00250788,0x00190695,0x0025077F,0x00250776,0x0025076D,0x00250764,0x0025075B, +0x00250752,0x00250749,0x00250740,0x00250737,0x0025072E,0x00250725,0x0025071C,0x00250713,0x0025070A,0x00250701, +0x002506F8,0x002506EF,0x002506E6,0x002506DD,0x002506D4,0x002506CB,0x002506C2,0x002506B9,0x002506B0,0x002506A7, +0x0025069E,0x00250695,0x001905A2,0x0025068C,0x00250683,0x0025067A,0x00250671,0x00250668,0x0025065F,0x00250656, +0x0025064D,0x00250644,0x0025063B,0x00250632,0x00250629,0x00250620,0x00250617,0x0025060E,0x00250605,0x002505FC, +0x002505F3,0x002505EA,0x002505E1,0x002505D8,0x002505CF,0x002505C6,0x8000B478,0x8100B479,0x8200B47A,0x8300B47B, +0x8400B47C,0x8500B47D,0x8600B47E,0x8700B47F,0x8800B480,0x8900B481,0x8A00B482,0x8B00B483,0x8C00B484,0x8D00B485, +0x8E00B486,0x8F00B487,0x9000B488,0x9100B489,0x9200B48A,0x9300B48B,0x9400B48C,0x9500B48D,0x9600B48E,0x9700B48F, +0x9800B490,0x9900B491,0x9A00B492,0x9B00B493,0x9C00B494,0x9D00B495,0x9E00B496,0x9F00B497,0xA000B498,0xA100B499, +0xA200B49A,0xA300B49B,0xA400B49C,0xA500B49D,0xA600B49E,0xA700B49F,0xA800B4A0,0xA900B4A1,0xAA00B4A2,0xAB00B4A3, +0xAC00B4A4,0xAD00B4A5,0xAE00B4A6,0xAF00B4A7,0xB000B4A8,0xB100B4A9,0xB200B4AA,0xB300B4AB,0xB400B4AC,0xB500B4AD, +0xB600B4AE,0xB700B4AF,0xB800B4B0,0xB900B4B1,0xBA00B4B2,0xBB00B4B3,0xBC00B4B4,0xBD00B4B5,0xBE00B4B6,0xBF00B4B7, +0x002505BD,0x002505B4,0x002505AB,0x002505A2,0x001904AF,0x00250599,0x00250590,0x00250587,0x0025057E,0x00250575, +0x0025056C,0x00250563,0x0025055A,0x00250551,0x00250548,0x0025053F,0x00250536,0x0025052D,0x00250524,0x0025051B, +0x00250512,0x00250509,0x00250500,0x002504F7,0x002504EE,0x002504E5,0x002504DC,0x002504D3,0x002504CA,0x002504C1, +0x002504B8,0x002504AF,0x001903BC,0x002504A6,0x0025049D,0x00250494,0x0025048B,0x00250482,0x00250479,0x00250470, +0x00250467,0x0025045E,0x00250455,0x0025044C,0x00250443,0x0025043A,0x00250431,0x00250428,0x0025041F,0x00250416, +0x0025040D,0x00250404,0x002503FB,0x002503F2,0x002503E9,0x002503E0,0x002503D7,0x002503CE,0x002503C5,0x002503BC, +0x001902C9,0x002503B3,0x002503AA,0x002503A1,0x8000B4F8,0x8100B4F9,0x8200B4FA,0x8300B4FB,0x8400B4FC,0x8500B4FD, +0x8600B4FE,0x8700B4FF,0x8800B500,0x8900B501,0x8A00B502,0x8B00B503,0x8C00B504,0x8D00B505,0x8E00B506,0x8F00B507, +0x9000B508,0x9100B509,0x9200B50A,0x9300B50B,0x9400B50C,0x9500B50D,0x9600B50E,0x9700B50F,0x9800B510,0x9900B511, +0x9A00B512,0x9B00B513,0x9C00B514,0x9D00B515,0x9E00B516,0x9F00B517,0xA000B518,0xA100B519,0xA200B51A,0xA300B51B, +0xA400B51C,0xA500B51D,0xA600B51E,0xA700B51F,0xA800B520,0xA900B521,0xAA00B522,0xAB00B523,0xAC00B524,0xAD00B525, +0xAE00B526,0xAF00B527,0xB000B528,0xB100B529,0xB200B52A,0xB300B52B,0xB400B52C,0xB500B52D,0xB600B52E,0xB700B52F, +0xB800B530,0xB900B531,0xBA00B532,0xBB00B533,0xBC00B534,0xBD00B535,0xBE00B536,0xBF00B537,0x00250398,0x0025038F, +0x00250386,0x0025037D,0x00250374,0x0025036B,0x00250362,0x00250359,0x00250350,0x00250347,0x0025033E,0x00250335, +0x0025032C,0x00250323,0x0025031A,0x00250311,0x00250308,0x002502FF,0x002502F6,0x002502ED,0x002502E4,0x002502DB, +0x002502D2,0x002502C9,0x001901D6,0x002502C0,0x002502B7,0x002502AE,0x002502A5,0x0025029C,0x00250293,0x0025028A, +0x00250281,0x00250278,0x0025026F,0x00250266,0x0025025D,0x00250254,0x0025024B,0x00250242,0x00250239,0x00250230, +0x00250227,0x0025021E,0x00250215,0x0025020C,0x00250203,0x002501FA,0x002501F1,0x002501E8,0x002501DF,0x002501D6, +0x001900E3,0x002501CD,0x002501C4,0x002501BB,0x002501B2,0x002501A9,0x002501A0,0x00250197,0x0025018E,0x00250185, +0x0025017C,0x00250173,0x8000B578,0x8100B579,0x8200B57A,0x8300B57B,0x8400B57C,0x8500B57D,0x8600B57E,0x8700B57F, +0x8800B580,0x8900B581,0x8A00B582,0x8B00B583,0x8C00B584,0x8D00B585,0x8E00B586,0x8F00B587,0x9000B588,0x9100B589, +0x9200B58A,0x9300B58B,0x9400B58C,0x9500B58D,0x9600B58E,0x9700B58F,0x9800B590,0x9900B591,0x9A00B592,0x9B00B593, +0x9C00B594,0x9D00B595,0x9E00B596,0x9F00B597,0xA000B598,0xA100B599,0xA200B59A,0xA300B59B,0xA400B59C,0xA500B59D, +0xA600B59E,0xA700B59F,0xA800B5A0,0xA900B5A1,0xAA00B5A2,0xAB00B5A3,0xAC00B5A4,0xAD00B5A5,0xAE00B5A6,0xAF00B5A7, +0xB000B5A8,0xB100B5A9,0xB200B5AA,0xB300B5AB,0xB400B5AC,0xB500B5AD,0xB600B5AE,0xB700B5AF,0xB800B5B0,0xB900B5B1, +0xBA00B5B2,0xBB00B5B3,0xBC00B5B4,0xBD00B5B5,0xBE00B5B6,0xBF00B5B7,0x0025016A,0x00250161,0x00250158,0x0025014F, +0x00250146,0x0025013D,0x00250134,0x0025012B,0x00250122,0x00250119,0x00250110,0x00250107,0x002500FE,0x002500F5, +0x002500EC,0x002500E3,0x0018FFF0,0x002500DA,0x002500D1,0x002500C8,0x002500BF,0x002500B6,0x002500AD,0x002500A4, +0x0025009B,0x00250092,0x00250089,0x00250080,0x00250077,0x0025006E,0x00250065,0x0025005C,0x00250053,0x0025004A, +0x00250041,0x00250038,0x0025002F,0x00250026,0x0025001D,0x00250014,0x0025000B,0x00250002,0x0024FFF9,0x0024FFF0, +0x0018FEFD,0x0024FFE7,0x0024FFDE,0x0024FFD5,0x0024FFCC,0x0024FFC3,0x0024FFBA,0x0024FFB1,0x0024FFA8,0x0024FF9F, +0x0024FF96,0x0024FF8D,0x0024FF84,0x0024FF7B,0x0024FF72,0x0024FF69,0x0024FF60,0x0024FF57,0x0024FF4E,0x0024FF45, +0x8000B5F8,0x8100B5F9,0x8200B5FA,0x8300B5FB,0x8400B5FC,0x8500B5FD,0x8600B5FE,0x8700B5FF,0x8800B600,0x8900B601, +0x8A00B602,0x8B00B603,0x8C00B604,0x8D00B605,0x8E00B606,0x8F00B607,0x9000B608,0x9100B609,0x9200B60A,0x9300B60B, +0x9400B60C,0x9500B60D,0x9600B60E,0x9700B60F,0x9800B610,0x9900B611,0x9A00B612,0x9B00B613,0x9C00B614,0x9D00B615, +0x9E00B616,0x9F00B617,0xA000B618,0xA100B619,0xA200B61A,0xA300B61B,0xA400B61C,0xA500B61D,0xA600B61E,0xA700B61F, +0xA800B620,0xA900B621,0xAA00B622,0xAB00B623,0xAC00B624,0xAD00B625,0xAE00B626,0xAF00B627,0xB000B628,0xB100B629, +0xB200B62A,0xB300B62B,0xB400B62C,0xB500B62D,0xB600B62E,0xB700B62F,0xB800B630,0xB900B631,0xBA00B632,0xBB00B633, +0xBC00B634,0xBD00B635,0xBE00B636,0xBF00B637,0x0024FF3C,0x0024FF33,0x0024FF2A,0x0024FF21,0x0024FF18,0x0024FF0F, +0x0024FF06,0x0024FEFD,0x0018FE0A,0x0024FEF4,0x0024FEEB,0x0024FEE2,0x0024FED9,0x0024FED0,0x0024FEC7,0x0024FEBE, +0x0024FEB5,0x0024FEAC,0x0024FEA3,0x0024FE9A,0x0024FE91,0x0024FE88,0x0024FE7F,0x0024FE76,0x0024FE6D,0x0024FE64, +0x0024FE5B,0x0024FE52,0x0024FE49,0x0024FE40,0x0024FE37,0x0024FE2E,0x0024FE25,0x0024FE1C,0x0024FE13,0x0024FE0A, +0x0018FD17,0x0024FE01,0x0024FDF8,0x0024FDEF,0x0024FDE6,0x0024FDDD,0x0024FDD4,0x0024FDCB,0x0024FDC2,0x0024FDB9, +0x0024FDB0,0x0024FDA7,0x0024FD9E,0x0024FD95,0x0024FD8C,0x0024FD83,0x0024FD7A,0x0024FD71,0x0024FD68,0x0024FD5F, +0x0024FD56,0x0024FD4D,0x0024FD44,0x0024FD3B,0x0024FD32,0x0024FD29,0x0024FD20,0x0024FD17,0x8000B678,0x8100B679, +0x8200B67A,0x8300B67B,0x8400B67C,0x8500B67D,0x8600B67E,0x8700B67F,0x8800B680,0x8900B681,0x8A00B682,0x8B00B683, +0x8C00B684,0x8D00B685,0x8E00B686,0x8F00B687,0x9000B688,0x9100B689,0x9200B68A,0x9300B68B,0x9400B68C,0x9500B68D, +0x9600B68E,0x9700B68F,0x9800B690,0x9900B691,0x9A00B692,0x9B00B693,0x9C00B694,0x9D00B695,0x9E00B696,0x9F00B697, +0xA000B698,0xA100B699,0xA200B69A,0xA300B69B,0xA400B69C,0xA500B69D,0xA600B69E,0xA700B69F,0xA800B6A0,0xA900B6A1, +0xAA00B6A2,0xAB00B6A3,0xAC00B6A4,0xAD00B6A5,0xAE00B6A6,0xAF00B6A7,0xB000B6A8,0xB100B6A9,0xB200B6AA,0xB300B6AB, +0xB400B6AC,0xB500B6AD,0xB600B6AE,0xB700B6AF,0xB800B6B0,0xB900B6B1,0xBA00B6B2,0xBB00B6B3,0xBC00B6B4,0xBD00B6B5, +0xBE00B6B6,0xBF00B6B7,0x0018FC24,0x0024FD0E,0x0024FD05,0x0024FCFC,0x0024FCF3,0x0024FCEA,0x0024FCE1,0x0024FCD8, +0x0024FCCF,0x0024FCC6,0x0024FCBD,0x0024FCB4,0x0024FCAB,0x0024FCA2,0x0024FC99,0x0024FC90,0x0024FC87,0x0024FC7E, +0x0024FC75,0x0024FC6C,0x0024FC63,0x0024FC5A,0x0024FC51,0x0024FC48,0x0024FC3F,0x0024FC36,0x0024FC2D,0x0024FC24, +0x0018FB31,0x0024FC1B,0x0024FC12,0x0024FC09,0x0024FC00,0x0024FBF7,0x0024FBEE,0x0024FBE5,0x0024FBDC,0x0024FBD3, +0x0024FBCA,0x0024FBC1,0x0024FBB8,0x0024FBAF,0x0024FBA6,0x0024FB9D,0x0024FB94,0x0024FB8B,0x0024FB82,0x0024FB79, +0x0024FB70,0x0024FB67,0x0024FB5E,0x0024FB55,0x0024FB4C,0x0024FB43,0x0024FB3A,0x0024FB31,0x0018FA3E,0x0024FB28, +0x0024FB1F,0x0024FB16,0x0024FB0D,0x0024FB04,0x0024FAFB,0x0024FAF2,0x8000B6F8,0x8100B6F9,0x8200B6FA,0x8300B6FB, +0x8400B6FC,0x8500B6FD,0x8600B6FE,0x8700B6FF,0x8800B700,0x8900B701,0x8A00B702,0x8B00B703,0x8C00B704,0x8D00B705, +0x8E00B706,0x8F00B707,0x9000B708,0x9100B709,0x9200B70A,0x9300B70B,0x9400B70C,0x9500B70D,0x9600B70E,0x9700B70F, +0x9800B710,0x9900B711,0x9A00B712,0x9B00B713,0x9C00B714,0x9D00B715,0x9E00B716,0x9F00B717,0xA000B718,0xA100B719, +0xA200B71A,0xA300B71B,0xA400B71C,0xA500B71D,0xA600B71E,0xA700B71F,0xA800B720,0xA900B721,0xAA00B722,0xAB00B723, +0xAC00B724,0xAD00B725,0xAE00B726,0xAF00B727,0xB000B728,0xB100B729,0xB200B72A,0xB300B72B,0xB400B72C,0xB500B72D, +0xB600B72E,0xB700B72F,0xB800B730,0xB900B731,0xBA00B732,0xBB00B733,0xBC00B734,0xBD00B735,0xBE00B736,0xBF00B737, +0x0024FAE9,0x0024FAE0,0x0024FAD7,0x0024FACE,0x0024FAC5,0x0024FABC,0x0024FAB3,0x0024FAAA,0x0024FAA1,0x0024FA98, +0x0024FA8F,0x0024FA86,0x0024FA7D,0x0024FA74,0x0024FA6B,0x0024FA62,0x0024FA59,0x0024FA50,0x0024FA47,0x0024FA3E, +0x0018F94B,0x0024FA35,0x0024FA2C,0x0024FA23,0x0024FA1A,0x0024FA11,0x0024FA08,0x0024F9FF,0x0024F9F6,0x0024F9ED, +0x0024F9E4,0x0024F9DB,0x0024F9D2,0x0024F9C9,0x0024F9C0,0x0024F9B7,0x0024F9AE,0x0024F9A5,0x0024F99C,0x0024F993, +0x0024F98A,0x0024F981,0x0024F978,0x0024F96F,0x0024F966,0x0024F95D,0x0024F954,0x0024F94B,0x0018F858,0x0024F942, +0x0024F939,0x0024F930,0x0024F927,0x0024F91E,0x0024F915,0x0024F90C,0x0024F903,0x0024F8FA,0x0024F8F1,0x0024F8E8, +0x0024F8DF,0x0024F8D6,0x0024F8CD,0x0024F8C4,0x8000B778,0x8100B779,0x8200B77A,0x8300B77B,0x8400B77C,0x8500B77D, +0x8600B77E,0x8700B77F,0x8800B780,0x8900B781,0x8A00B782,0x8B00B783,0x8C00B784,0x8D00B785,0x8E00B786,0x8F00B787, +0x9000B788,0x9100B789,0x9200B78A,0x9300B78B,0x9400B78C,0x9500B78D,0x9600B78E,0x9700B78F,0x9800B790,0x9900B791, +0x9A00B792,0x9B00B793,0x9C00B794,0x9D00B795,0x9E00B796,0x9F00B797,0xA000B798,0xA100B799,0xA200B79A,0xA300B79B, +0xA400B79C,0xA500B79D,0xA600B79E,0xA700B79F,0xA800B7A0,0xA900B7A1,0xAA00B7A2,0xAB00B7A3,0xAC00B7A4,0xAD00B7A5, +0xAE00B7A6,0xAF00B7A7,0xB000B7A8,0xB100B7A9,0xB200B7AA,0xB300B7AB,0xB400B7AC,0xB500B7AD,0xB600B7AE,0xB700B7AF, +0xB800B7B0,0xB900B7B1,0xBA00B7B2,0xBB00B7B3,0xBC00B7B4,0xBD00B7B5,0xBE00B7B6,0xBF00B7B7,0x0024F8BB,0x0024F8B2, +0x0024F8A9,0x0024F8A0,0x0024F897,0x0024F88E,0x0024F885,0x0024F87C,0x0024F873,0x0024F86A,0x0024F861,0x0024F858, +0x0018F765,0x0024F84F,0x0024F846,0x0024F83D,0x0024F834,0x0024F82B,0x0024F822,0x0024F819,0x0024F810,0x0024F807, +0x0024F7FE,0x0024F7F5,0x0024F7EC,0x0024F7E3,0x0024F7DA,0x0024F7D1,0x0024F7C8,0x0024F7BF,0x0024F7B6,0x0024F7AD, +0x0024F7A4,0x0024F79B,0x0024F792,0x0024F789,0x0024F780,0x0024F777,0x0024F76E,0x0024F765,0x0018F672,0x0024F75C, +0x0024F753,0x0024F74A,0x0024F741,0x0024F738,0x0024F72F,0x0024F726,0x0024F71D,0x0024F714,0x0024F70B,0x0024F702, +0x0024F6F9,0x0024F6F0,0x0024F6E7,0x0024F6DE,0x0024F6D5,0x0024F6CC,0x0024F6C3,0x0024F6BA,0x0024F6B1,0x0024F6A8, +0x0024F69F,0x0024F696,0x8000B7F8,0x8100B7F9,0x8200B7FA,0x8300B7FB,0x8400B7FC,0x8500B7FD,0x8600B7FE,0x8700B7FF, +0x8800B800,0x8900B801,0x8A00B802,0x8B00B803,0x8C00B804,0x8D00B805,0x8E00B806,0x8F00B807,0x9000B808,0x9100B809, +0x9200B80A,0x9300B80B,0x9400B80C,0x9500B80D,0x9600B80E,0x9700B80F,0x9800B810,0x9900B811,0x9A00B812,0x9B00B813, +0x9C00B814,0x9D00B815,0x9E00B816,0x9F00B817,0xA000B818,0xA100B819,0xA200B81A,0xA300B81B,0xA400B81C,0xA500B81D, +0xA600B81E,0xA700B81F,0xA800B820,0xA900B821,0xAA00B822,0xAB00B823,0xAC00B824,0xAD00B825,0xAE00B826,0xAF00B827, +0xB000B828,0xB100B829,0xB200B82A,0xB300B82B,0xB400B82C,0xB500B82D,0xB600B82E,0xB700B82F,0xB800B830,0xB900B831, +0xBA00B832,0xBB00B833,0xBC00B834,0xBD00B835,0xBE00B836,0xBF00B837,0x0024F68D,0x0024F684,0x0024F67B,0x0024F672, +0x0018F57F,0x0024F669,0x0024F660,0x0024F657,0x0024F64E,0x0024F645,0x0024F63C,0x0024F633,0x0024F62A,0x0024F621, +0x0024F618,0x0024F60F,0x0024F606,0x0024F5FD,0x0024F5F4,0x0024F5EB,0x0024F5E2,0x0024F5D9,0x0024F5D0,0x0024F5C7, +0x0024F5BE,0x0024F5B5,0x0024F5AC,0x0024F5A3,0x0024F59A,0x0024F591,0x0024F588,0x0024F57F,0x0018F48C,0x0024F576, +0x0024F56D,0x0024F564,0x0024F55B,0x0024F552,0x0024F549,0x0024F540,0x0024F537,0x0024F52E,0x0024F525,0x0024F51C, +0x0024F513,0x0024F50A,0x0024F501,0x0024F4F8,0x0024F4EF,0x0024F4E6,0x0024F4DD,0x0024F4D4,0x0024F4CB,0x0024F4C2, +0x0024F4B9,0x0024F4B0,0x0024F4A7,0x0024F49E,0x0024F495,0x0024F48C,0x0018F399,0x0024F483,0x0024F47A,0x0024F471, +0x8000B7D7,0x8100B857,0x8200B8D7,0x8300B957,0x8400B9D7,0x8500BA57,0x8600BAD7,0x8700BB57,0x8800BBD7,0x8900BC57, +0x8A00BCD7,0x8B00BD57,0x8C00BDD7,0x8D00BE57,0x8E00BED7,0x8F00BF57,0x9000BFD7,0x9100C057,0x9200C0D7,0x9300C157, +0x9400C1D7,0x9500C257,0x9600C2D7,0x9700C357,0x9800C3D7,0x9900C457,0x9A00C4D7,0x9B00C557,0x9C00C5D7,0x9D00C657, +0x9E00C6D7,0x8000B897,0x8100B898,0x8200B899,0x8300B89A,0x8400B89B,0x8500B89C,0x8600B89D,0x8700B89E,0x8800B89F, +0x8900B8A0,0x8A00B8A1,0x8B00B8A2,0x8C00B8A3,0x8D00B8A4,0x8E00B8A5,0x8F00B8A6,0x9000B8A7,0x9100B8A8,0x9200B8A9, +0x9300B8AA,0x9400B8AB,0x9500B8AC,0x9600B8AD,0x9700B8AE,0x9800B8AF,0x9900B8B0,0x9A00B8B1,0x9B00B8B2,0x9C00B8B3, +0x9D00B8B4,0x9E00B8B5,0x9F00B8B6,0xA000B8B7,0xA100B8B8,0xA200B8B9,0xA300B8BA,0xA400B8BB,0xA500B8BC,0xA600B8BD, +0xA700B8BE,0xA800B8BF,0xA900B8C0,0xAA00B8C1,0xAB00B8C2,0xAC00B8C3,0xAD00B8C4,0xAE00B8C5,0xAF00B8C6,0xB000B8C7, +0xB100B8C8,0xB200B8C9,0xB300B8CA,0xB400B8CB,0xB500B8CC,0xB600B8CD,0xB700B8CE,0xB800B8CF,0xB900B8D0,0xBA00B8D1, +0xBB00B8D2,0xBC00B8D3,0xBD00B8D4,0xBE00B8D5,0xBF00B8D6,0x0024F468,0x0024F45F,0x0024F456,0x0024F44D,0x0024F444, +0x0024F43B,0x0024F432,0x0024F429,0x0024F420,0x0024F417,0x0024F40E,0x0024F405,0x0024F3FC,0x0024F3F3,0x0024F3EA, +0x0024F3E1,0x0024F3D8,0x0024F3CF,0x0024F3C6,0x0024F3BD,0x0024F3B4,0x0024F3AB,0x0024F3A2,0x0024F399,0x0018F2A6, +0x0024F390,0x0024F387,0x0024F37E,0x0024F375,0x0024F36C,0x0024F363,0x0024F35A,0x0024F351,0x0024F348,0x0024F33F, +0x0024F336,0x0024F32D,0x0024F324,0x0024F31B,0x0024F312,0x0024F309,0x0024F300,0x0024F2F7,0x0024F2EE,0x0024F2E5, +0x0024F2DC,0x0024F2D3,0x0024F2CA,0x0024F2C1,0x0024F2B8,0x0024F2AF,0x0024F2A6,0x0018F1B3,0x0024F29D,0x0024F294, +0x0024F28B,0x0024F282,0x0024F279,0x0024F270,0x0024F267,0x0024F25E,0x0024F255,0x0024F24C,0x0024F243,0x8000B917, +0x8100B918,0x8200B919,0x8300B91A,0x8400B91B,0x8500B91C,0x8600B91D,0x8700B91E,0x8800B91F,0x8900B920,0x8A00B921, +0x8B00B922,0x8C00B923,0x8D00B924,0x8E00B925,0x8F00B926,0x9000B927,0x9100B928,0x9200B929,0x9300B92A,0x9400B92B, +0x9500B92C,0x9600B92D,0x9700B92E,0x9800B92F,0x9900B930,0x9A00B931,0x9B00B932,0x9C00B933,0x9D00B934,0x9E00B935, +0x9F00B936,0xA000B937,0xA100B938,0xA200B939,0xA300B93A,0xA400B93B,0xA500B93C,0xA600B93D,0xA700B93E,0xA800B93F, +0xA900B940,0xAA00B941,0xAB00B942,0xAC00B943,0xAD00B944,0xAE00B945,0xAF00B946,0xB000B947,0xB100B948,0xB200B949, +0xB300B94A,0xB400B94B,0xB500B94C,0xB600B94D,0xB700B94E,0xB800B94F,0xB900B950,0xBA00B951,0xBB00B952,0xBC00B953, +0xBD00B954,0xBE00B955,0xBF00B956,0x0024F23A,0x0024F231,0x0024F228,0x0024F21F,0x0024F216,0x0024F20D,0x0024F204, +0x0024F1FB,0x0024F1F2,0x0024F1E9,0x0024F1E0,0x0024F1D7,0x0024F1CE,0x0024F1C5,0x0024F1BC,0x0024F1B3,0x0018F0C0, +0x0024F1AA,0x0024F1A1,0x0024F198,0x0024F18F,0x0024F186,0x0024F17D,0x0024F174,0x0024F16B,0x0024F162,0x0024F159, +0x0024F150,0x0024F147,0x0024F13E,0x0024F135,0x0024F12C,0x0024F123,0x0024F11A,0x0024F111,0x0024F108,0x0024F0FF, +0x0024F0F6,0x0024F0ED,0x0024F0E4,0x0024F0DB,0x0024F0D2,0x0024F0C9,0x0024F0C0,0x0018EFCD,0x0024F0B7,0x0024F0AE, +0x0024F0A5,0x0024F09C,0x0024F093,0x0024F08A,0x0024F081,0x0024F078,0x0024F06F,0x0024F066,0x0024F05D,0x0024F054, +0x0024F04B,0x0024F042,0x0024F039,0x0024F030,0x0024F027,0x0024F01E,0x0024F015,0x8000B997,0x8100B998,0x8200B999, +0x8300B99A,0x8400B99B,0x8500B99C,0x8600B99D,0x8700B99E,0x8800B99F,0x8900B9A0,0x8A00B9A1,0x8B00B9A2,0x8C00B9A3, +0x8D00B9A4,0x8E00B9A5,0x8F00B9A6,0x9000B9A7,0x9100B9A8,0x9200B9A9,0x9300B9AA,0x9400B9AB,0x9500B9AC,0x9600B9AD, +0x9700B9AE,0x9800B9AF,0x9900B9B0,0x9A00B9B1,0x9B00B9B2,0x9C00B9B3,0x9D00B9B4,0x9E00B9B5,0x9F00B9B6,0xA000B9B7, +0xA100B9B8,0xA200B9B9,0xA300B9BA,0xA400B9BB,0xA500B9BC,0xA600B9BD,0xA700B9BE,0xA800B9BF,0xA900B9C0,0xAA00B9C1, +0xAB00B9C2,0xAC00B9C3,0xAD00B9C4,0xAE00B9C5,0xAF00B9C6,0xB000B9C7,0xB100B9C8,0xB200B9C9,0xB300B9CA,0xB400B9CB, +0xB500B9CC,0xB600B9CD,0xB700B9CE,0xB800B9CF,0xB900B9D0,0xBA00B9D1,0xBB00B9D2,0xBC00B9D3,0xBD00B9D4,0xBE00B9D5, +0xBF00B9D6,0x0024F00C,0x0024F003,0x0024EFFA,0x0024EFF1,0x0024EFE8,0x0024EFDF,0x0024EFD6,0x0024EFCD,0x0018EEDA, +0x0024EFC4,0x0024EFBB,0x0024EFB2,0x0024EFA9,0x0024EFA0,0x0024EF97,0x0024EF8E,0x0024EF85,0x0024EF7C,0x0024EF73, +0x0024EF6A,0x0024EF61,0x0024EF58,0x0024EF4F,0x0024EF46,0x0024EF3D,0x0024EF34,0x0024EF2B,0x0024EF22,0x0024EF19, +0x0024EF10,0x0024EF07,0x0024EEFE,0x0024EEF5,0x0024EEEC,0x0024EEE3,0x0024EEDA,0x0018EDE7,0x0024EED1,0x0024EEC8, +0x0024EEBF,0x0024EEB6,0x0024EEAD,0x0024EEA4,0x0024EE9B,0x0024EE92,0x0024EE89,0x0024EE80,0x0024EE77,0x0024EE6E, +0x0024EE65,0x0024EE5C,0x0024EE53,0x0024EE4A,0x0024EE41,0x0024EE38,0x0024EE2F,0x0024EE26,0x0024EE1D,0x0024EE14, +0x0024EE0B,0x0024EE02,0x0024EDF9,0x0024EDF0,0x0024EDE7,0x8000BA17,0x8100BA18,0x8200BA19,0x8300BA1A,0x8400BA1B, +0x8500BA1C,0x8600BA1D,0x8700BA1E,0x8800BA1F,0x8900BA20,0x8A00BA21,0x8B00BA22,0x8C00BA23,0x8D00BA24,0x8E00BA25, +0x8F00BA26,0x9000BA27,0x9100BA28,0x9200BA29,0x9300BA2A,0x9400BA2B,0x9500BA2C,0x9600BA2D,0x9700BA2E,0x9800BA2F, +0x9900BA30,0x9A00BA31,0x9B00BA32,0x9C00BA33,0x9D00BA34,0x9E00BA35,0x9F00BA36,0xA000BA37,0xA100BA38,0xA200BA39, +0xA300BA3A,0xA400BA3B,0xA500BA3C,0xA600BA3D,0xA700BA3E,0xA800BA3F,0xA900BA40,0xAA00BA41,0xAB00BA42,0xAC00BA43, +0xAD00BA44,0xAE00BA45,0xAF00BA46,0xB000BA47,0xB100BA48,0xB200BA49,0xB300BA4A,0xB400BA4B,0xB500BA4C,0xB600BA4D, +0xB700BA4E,0xB800BA4F,0xB900BA50,0xBA00BA51,0xBB00BA52,0xBC00BA53,0xBD00BA54,0xBE00BA55,0xBF00BA56,0x0018ECF4, +0x0024EDDE,0x0024EDD5,0x0024EDCC,0x0024EDC3,0x0024EDBA,0x0024EDB1,0x0024EDA8,0x0024ED9F,0x0024ED96,0x0024ED8D, +0x0024ED84,0x0024ED7B,0x0024ED72,0x0024ED69,0x0024ED60,0x0024ED57,0x0024ED4E,0x0024ED45,0x0024ED3C,0x0024ED33, +0x0024ED2A,0x0024ED21,0x0024ED18,0x0024ED0F,0x0024ED06,0x0024ECFD,0x0024ECF4,0x0018EC01,0x0024ECEB,0x0024ECE2, +0x0024ECD9,0x0024ECD0,0x0024ECC7,0x0024ECBE,0x0024ECB5,0x0024ECAC,0x0024ECA3,0x0024EC9A,0x0024EC91,0x0024EC88, +0x0024EC7F,0x0024EC76,0x0024EC6D,0x0024EC64,0x0024EC5B,0x0024EC52,0x0024EC49,0x0024EC40,0x0024EC37,0x0024EC2E, +0x0024EC25,0x0024EC1C,0x0024EC13,0x0024EC0A,0x0024EC01,0x0018EB0E,0x0024EBF8,0x0024EBEF,0x0024EBE6,0x0024EBDD, +0x0024EBD4,0x0024EBCB,0x0024EBC2,0x8000BA97,0x8100BA98,0x8200BA99,0x8300BA9A,0x8400BA9B,0x8500BA9C,0x8600BA9D, +0x8700BA9E,0x8800BA9F,0x8900BAA0,0x8A00BAA1,0x8B00BAA2,0x8C00BAA3,0x8D00BAA4,0x8E00BAA5,0x8F00BAA6,0x9000BAA7, +0x9100BAA8,0x9200BAA9,0x9300BAAA,0x9400BAAB,0x9500BAAC,0x9600BAAD,0x9700BAAE,0x9800BAAF,0x9900BAB0,0x9A00BAB1, +0x9B00BAB2,0x9C00BAB3,0x9D00BAB4,0x9E00BAB5,0x9F00BAB6,0xA000BAB7,0xA100BAB8,0xA200BAB9,0xA300BABA,0xA400BABB, +0xA500BABC,0xA600BABD,0xA700BABE,0xA800BABF,0xA900BAC0,0xAA00BAC1,0xAB00BAC2,0xAC00BAC3,0xAD00BAC4,0xAE00BAC5, +0xAF00BAC6,0xB000BAC7,0xB100BAC8,0xB200BAC9,0xB300BACA,0xB400BACB,0xB500BACC,0xB600BACD,0xB700BACE,0xB800BACF, +0xB900BAD0,0xBA00BAD1,0xBB00BAD2,0xBC00BAD3,0xBD00BAD4,0xBE00BAD5,0xBF00BAD6,0x0024EBB9,0x0024EBB0,0x0024EBA7, +0x0024EB9E,0x0024EB95,0x0024EB8C,0x0024EB83,0x0024EB7A,0x0024EB71,0x0024EB68,0x0024EB5F,0x0024EB56,0x0024EB4D, +0x0024EB44,0x0024EB3B,0x0024EB32,0x0024EB29,0x0024EB20,0x0024EB17,0x0024EB0E,0x0018EA1B,0x0024EB05,0x0024EAFC, +0x0024EAF3,0x0024EAEA,0x0024EAE1,0x0024EAD8,0x0024EACF,0x0024EAC6,0x0024EABD,0x0024EAB4,0x0024EAAB,0x0024EAA2, +0x0024EA99,0x0024EA90,0x0024EA87,0x0024EA7E,0x0024EA75,0x0024EA6C,0x0024EA63,0x0024EA5A,0x0024EA51,0x0024EA48, +0x0024EA3F,0x0024EA36,0x0024EA2D,0x0024EA24,0x0024EA1B,0x0018E928,0x0024EA12,0x0024EA09,0x0024EA00,0x0024E9F7, +0x0024E9EE,0x0024E9E5,0x0024E9DC,0x0024E9D3,0x0024E9CA,0x0024E9C1,0x0024E9B8,0x0024E9AF,0x0024E9A6,0x0024E99D, +0x0024E994,0x8000BB17,0x8100BB18,0x8200BB19,0x8300BB1A,0x8400BB1B,0x8500BB1C,0x8600BB1D,0x8700BB1E,0x8800BB1F, +0x8900BB20,0x8A00BB21,0x8B00BB22,0x8C00BB23,0x8D00BB24,0x8E00BB25,0x8F00BB26,0x9000BB27,0x9100BB28,0x9200BB29, +0x9300BB2A,0x9400BB2B,0x9500BB2C,0x9600BB2D,0x9700BB2E,0x9800BB2F,0x9900BB30,0x9A00BB31,0x9B00BB32,0x9C00BB33, +0x9D00BB34,0x9E00BB35,0x9F00BB36,0xA000BB37,0xA100BB38,0xA200BB39,0xA300BB3A,0xA400BB3B,0xA500BB3C,0xA600BB3D, +0xA700BB3E,0xA800BB3F,0xA900BB40,0xAA00BB41,0xAB00BB42,0xAC00BB43,0xAD00BB44,0xAE00BB45,0xAF00BB46,0xB000BB47, +0xB100BB48,0xB200BB49,0xB300BB4A,0xB400BB4B,0xB500BB4C,0xB600BB4D,0xB700BB4E,0xB800BB4F,0xB900BB50,0xBA00BB51, +0xBB00BB52,0xBC00BB53,0xBD00BB54,0xBE00BB55,0xBF00BB56,0x0024E98B,0x0024E982,0x0024E979,0x0024E970,0x0024E967, +0x0024E95E,0x0024E955,0x0024E94C,0x0024E943,0x0024E93A,0x0024E931,0x0024E928,0x0018E835,0x0024E91F,0x0024E916, +0x0024E90D,0x0024E904,0x0024E8FB,0x0024E8F2,0x0024E8E9,0x0024E8E0,0x0024E8D7,0x0024E8CE,0x0024E8C5,0x0024E8BC, +0x0024E8B3,0x0024E8AA,0x0024E8A1,0x0024E898,0x0024E88F,0x0024E886,0x0024E87D,0x0024E874,0x0024E86B,0x0024E862, +0x0024E859,0x0024E850,0x0024E847,0x0024E83E,0x0024E835,0x0018E742,0x0024E82C,0x0024E823,0x0024E81A,0x0024E811, +0x0024E808,0x0024E7FF,0x0024E7F6,0x0024E7ED,0x0024E7E4,0x0024E7DB,0x0024E7D2,0x0024E7C9,0x0024E7C0,0x0024E7B7, +0x0024E7AE,0x0024E7A5,0x0024E79C,0x0024E793,0x0024E78A,0x0024E781,0x0024E778,0x0024E76F,0x0024E766,0x8000BB97, +0x8100BB98,0x8200BB99,0x8300BB9A,0x8400BB9B,0x8500BB9C,0x8600BB9D,0x8700BB9E,0x8800BB9F,0x8900BBA0,0x8A00BBA1, +0x8B00BBA2,0x8C00BBA3,0x8D00BBA4,0x8E00BBA5,0x8F00BBA6,0x9000BBA7,0x9100BBA8,0x9200BBA9,0x9300BBAA,0x9400BBAB, +0x9500BBAC,0x9600BBAD,0x9700BBAE,0x9800BBAF,0x9900BBB0,0x9A00BBB1,0x9B00BBB2,0x9C00BBB3,0x9D00BBB4,0x9E00BBB5, +0x9F00BBB6,0xA000BBB7,0xA100BBB8,0xA200BBB9,0xA300BBBA,0xA400BBBB,0xA500BBBC,0xA600BBBD,0xA700BBBE,0xA800BBBF, +0xA900BBC0,0xAA00BBC1,0xAB00BBC2,0xAC00BBC3,0xAD00BBC4,0xAE00BBC5,0xAF00BBC6,0xB000BBC7,0xB100BBC8,0xB200BBC9, +0xB300BBCA,0xB400BBCB,0xB500BBCC,0xB600BBCD,0xB700BBCE,0xB800BBCF,0xB900BBD0,0xBA00BBD1,0xBB00BBD2,0xBC00BBD3, +0xBD00BBD4,0xBE00BBD5,0xBF00BBD6,0x0024E75D,0x0024E754,0x0024E74B,0x0024E742,0x0018E64F,0x0024E739,0x0024E730, +0x0024E727,0x0024E71E,0x0024E715,0x0024E70C,0x0024E703,0x0024E6FA,0x0024E6F1,0x0024E6E8,0x0024E6DF,0x0024E6D6, +0x0024E6CD,0x0024E6C4,0x0024E6BB,0x0024E6B2,0x0024E6A9,0x0024E6A0,0x0024E697,0x0024E68E,0x0024E685,0x0024E67C, +0x0024E673,0x0024E66A,0x0024E661,0x0024E658,0x0024E64F,0x0018E55C,0x0024E646,0x0024E63D,0x0024E634,0x0024E62B, +0x0024E622,0x0024E619,0x0024E610,0x0024E607,0x0024E5FE,0x0024E5F5,0x0024E5EC,0x0024E5E3,0x0024E5DA,0x0024E5D1, +0x0024E5C8,0x0024E5BF,0x0024E5B6,0x0024E5AD,0x0024E5A4,0x0024E59B,0x0024E592,0x0024E589,0x0024E580,0x0024E577, +0x0024E56E,0x0024E565,0x0024E55C,0x0018E469,0x0024E553,0x0024E54A,0x0024E541,0x8000BC17,0x8100BC18,0x8200BC19, +0x8300BC1A,0x8400BC1B,0x8500BC1C,0x8600BC1D,0x8700BC1E,0x8800BC1F,0x8900BC20,0x8A00BC21,0x8B00BC22,0x8C00BC23, +0x8D00BC24,0x8E00BC25,0x8F00BC26,0x9000BC27,0x9100BC28,0x9200BC29,0x9300BC2A,0x9400BC2B,0x9500BC2C,0x9600BC2D, +0x9700BC2E,0x9800BC2F,0x9900BC30,0x9A00BC31,0x9B00BC32,0x9C00BC33,0x9D00BC34,0x9E00BC35,0x9F00BC36,0xA000BC37, +0xA100BC38,0xA200BC39,0xA300BC3A,0xA400BC3B,0xA500BC3C,0xA600BC3D,0xA700BC3E,0xA800BC3F,0xA900BC40,0xAA00BC41, +0xAB00BC42,0xAC00BC43,0xAD00BC44,0xAE00BC45,0xAF00BC46,0xB000BC47,0xB100BC48,0xB200BC49,0xB300BC4A,0xB400BC4B, +0xB500BC4C,0xB600BC4D,0xB700BC4E,0xB800BC4F,0xB900BC50,0xBA00BC51,0xBB00BC52,0xBC00BC53,0xBD00BC54,0xBE00BC55, +0xBF00BC56,0x0024E538,0x0024E52F,0x0024E526,0x0024E51D,0x0024E514,0x0024E50B,0x0024E502,0x0024E4F9,0x0024E4F0, +0x0024E4E7,0x0024E4DE,0x0024E4D5,0x0024E4CC,0x0024E4C3,0x0024E4BA,0x0024E4B1,0x0024E4A8,0x0024E49F,0x0024E496, +0x0024E48D,0x0024E484,0x0024E47B,0x0024E472,0x0024E469,0x0018E376,0x0024E460,0x0024E457,0x0024E44E,0x0024E445, +0x0024E43C,0x0024E433,0x0024E42A,0x0024E421,0x0024E418,0x0024E40F,0x0024E406,0x0024E3FD,0x0024E3F4,0x0024E3EB, +0x0024E3E2,0x0024E3D9,0x0024E3D0,0x0024E3C7,0x0024E3BE,0x0024E3B5,0x0024E3AC,0x0024E3A3,0x0024E39A,0x0024E391, +0x0024E388,0x0024E37F,0x0024E376,0x0018E283,0x0024E36D,0x0024E364,0x0024E35B,0x0024E352,0x0024E349,0x0024E340, +0x0024E337,0x0024E32E,0x0024E325,0x0024E31C,0x0024E313,0x8000BC97,0x8100BC98,0x8200BC99,0x8300BC9A,0x8400BC9B, +0x8500BC9C,0x8600BC9D,0x8700BC9E,0x8800BC9F,0x8900BCA0,0x8A00BCA1,0x8B00BCA2,0x8C00BCA3,0x8D00BCA4,0x8E00BCA5, +0x8F00BCA6,0x9000BCA7,0x9100BCA8,0x9200BCA9,0x9300BCAA,0x9400BCAB,0x9500BCAC,0x9600BCAD,0x9700BCAE,0x9800BCAF, +0x9900BCB0,0x9A00BCB1,0x9B00BCB2,0x9C00BCB3,0x9D00BCB4,0x9E00BCB5,0x9F00BCB6,0xA000BCB7,0xA100BCB8,0xA200BCB9, +0xA300BCBA,0xA400BCBB,0xA500BCBC,0xA600BCBD,0xA700BCBE,0xA800BCBF,0xA900BCC0,0xAA00BCC1,0xAB00BCC2,0xAC00BCC3, +0xAD00BCC4,0xAE00BCC5,0xAF00BCC6,0xB000BCC7,0xB100BCC8,0xB200BCC9,0xB300BCCA,0xB400BCCB,0xB500BCCC,0xB600BCCD, +0xB700BCCE,0xB800BCCF,0xB900BCD0,0xBA00BCD1,0xBB00BCD2,0xBC00BCD3,0xBD00BCD4,0xBE00BCD5,0xBF00BCD6,0x0024E30A, +0x0024E301,0x0024E2F8,0x0024E2EF,0x0024E2E6,0x0024E2DD,0x0024E2D4,0x0024E2CB,0x0024E2C2,0x0024E2B9,0x0024E2B0, +0x0024E2A7,0x0024E29E,0x0024E295,0x0024E28C,0x0024E283,0x0018E190,0x0024E27A,0x0024E271,0x0024E268,0x0024E25F, +0x0024E256,0x0024E24D,0x0024E244,0x0024E23B,0x0024E232,0x0024E229,0x0024E220,0x0024E217,0x0024E20E,0x0024E205, +0x0024E1FC,0x0024E1F3,0x0024E1EA,0x0024E1E1,0x0024E1D8,0x0024E1CF,0x0024E1C6,0x0024E1BD,0x0024E1B4,0x0024E1AB, +0x0024E1A2,0x0024E199,0x0024E190,0x0018E09D,0x0024E187,0x0024E17E,0x0024E175,0x0024E16C,0x0024E163,0x0024E15A, +0x0024E151,0x0024E148,0x0024E13F,0x0024E136,0x0024E12D,0x0024E124,0x0024E11B,0x0024E112,0x0024E109,0x0024E100, +0x0024E0F7,0x0024E0EE,0x0024E0E5,0x8000BD17,0x8100BD18,0x8200BD19,0x8300BD1A,0x8400BD1B,0x8500BD1C,0x8600BD1D, +0x8700BD1E,0x8800BD1F,0x8900BD20,0x8A00BD21,0x8B00BD22,0x8C00BD23,0x8D00BD24,0x8E00BD25,0x8F00BD26,0x9000BD27, +0x9100BD28,0x9200BD29,0x9300BD2A,0x9400BD2B,0x9500BD2C,0x9600BD2D,0x9700BD2E,0x9800BD2F,0x9900BD30,0x9A00BD31, +0x9B00BD32,0x9C00BD33,0x9D00BD34,0x9E00BD35,0x9F00BD36,0xA000BD37,0xA100BD38,0xA200BD39,0xA300BD3A,0xA400BD3B, +0xA500BD3C,0xA600BD3D,0xA700BD3E,0xA800BD3F,0xA900BD40,0xAA00BD41,0xAB00BD42,0xAC00BD43,0xAD00BD44,0xAE00BD45, +0xAF00BD46,0xB000BD47,0xB100BD48,0xB200BD49,0xB300BD4A,0xB400BD4B,0xB500BD4C,0xB600BD4D,0xB700BD4E,0xB800BD4F, +0xB900BD50,0xBA00BD51,0xBB00BD52,0xBC00BD53,0xBD00BD54,0xBE00BD55,0xBF00BD56,0x0024E0DC,0x0024E0D3,0x0024E0CA, +0x0024E0C1,0x0024E0B8,0x0024E0AF,0x0024E0A6,0x0024E09D,0x0018DFAA,0x0024E094,0x0024E08B,0x0024E082,0x0024E079, +0x0024E070,0x0024E067,0x0024E05E,0x0024E055,0x0024E04C,0x0024E043,0x0024E03A,0x0024E031,0x0024E028,0x0024E01F, +0x0024E016,0x0024E00D,0x0024E004,0x0024DFFB,0x0024DFF2,0x0024DFE9,0x0024DFE0,0x0024DFD7,0x0024DFCE,0x0024DFC5, +0x0024DFBC,0x0024DFB3,0x0024DFAA,0x0018DEB7,0x0024DFA1,0x0024DF98,0x0024DF8F,0x0024DF86,0x0024DF7D,0x0024DF74, +0x0024DF6B,0x0024DF62,0x0024DF59,0x0024DF50,0x0024DF47,0x0024DF3E,0x0024DF35,0x0024DF2C,0x0024DF23,0x0024DF1A, +0x0024DF11,0x0024DF08,0x0024DEFF,0x0024DEF6,0x0024DEED,0x0024DEE4,0x0024DEDB,0x0024DED2,0x0024DEC9,0x0024DEC0, +0x0024DEB7,0x8000BD97,0x8100BD98,0x8200BD99,0x8300BD9A,0x8400BD9B,0x8500BD9C,0x8600BD9D,0x8700BD9E,0x8800BD9F, +0x8900BDA0,0x8A00BDA1,0x8B00BDA2,0x8C00BDA3,0x8D00BDA4,0x8E00BDA5,0x8F00BDA6,0x9000BDA7,0x9100BDA8,0x9200BDA9, +0x9300BDAA,0x9400BDAB,0x9500BDAC,0x9600BDAD,0x9700BDAE,0x9800BDAF,0x9900BDB0,0x9A00BDB1,0x9B00BDB2,0x9C00BDB3, +0x9D00BDB4,0x9E00BDB5,0x9F00BDB6,0xA000BDB7,0xA100BDB8,0xA200BDB9,0xA300BDBA,0xA400BDBB,0xA500BDBC,0xA600BDBD, +0xA700BDBE,0xA800BDBF,0xA900BDC0,0xAA00BDC1,0xAB00BDC2,0xAC00BDC3,0xAD00BDC4,0xAE00BDC5,0xAF00BDC6,0xB000BDC7, +0xB100BDC8,0xB200BDC9,0xB300BDCA,0xB400BDCB,0xB500BDCC,0xB600BDCD,0xB700BDCE,0xB800BDCF,0xB900BDD0,0xBA00BDD1, +0xBB00BDD2,0xBC00BDD3,0xBD00BDD4,0xBE00BDD5,0xBF00BDD6,0x0018DDC4,0x0024DEAE,0x0024DEA5,0x0024DE9C,0x0024DE93, +0x0024DE8A,0x0024DE81,0x0024DE78,0x0024DE6F,0x0024DE66,0x0024DE5D,0x0024DE54,0x0024DE4B,0x0024DE42,0x0024DE39, +0x0024DE30,0x0024DE27,0x0024DE1E,0x0024DE15,0x0024DE0C,0x0024DE03,0x0024DDFA,0x0024DDF1,0x0024DDE8,0x0024DDDF, +0x0024DDD6,0x0024DDCD,0x0024DDC4,0x0018DCD1,0x0024DDBB,0x0024DDB2,0x0024DDA9,0x0024DDA0,0x0024DD97,0x0024DD8E, +0x0024DD85,0x0024DD7C,0x0024DD73,0x0024DD6A,0x0024DD61,0x0024DD58,0x0024DD4F,0x0024DD46,0x0024DD3D,0x0024DD34, +0x0024DD2B,0x0024DD22,0x0024DD19,0x0024DD10,0x0024DD07,0x0024DCFE,0x0024DCF5,0x0024DCEC,0x0024DCE3,0x0024DCDA, +0x0024DCD1,0x0018DBDE,0x0024DCC8,0x0024DCBF,0x0024DCB6,0x0024DCAD,0x0024DCA4,0x0024DC9B,0x0024DC92,0x8000BE17, +0x8100BE18,0x8200BE19,0x8300BE1A,0x8400BE1B,0x8500BE1C,0x8600BE1D,0x8700BE1E,0x8800BE1F,0x8900BE20,0x8A00BE21, +0x8B00BE22,0x8C00BE23,0x8D00BE24,0x8E00BE25,0x8F00BE26,0x9000BE27,0x9100BE28,0x9200BE29,0x9300BE2A,0x9400BE2B, +0x9500BE2C,0x9600BE2D,0x9700BE2E,0x9800BE2F,0x9900BE30,0x9A00BE31,0x9B00BE32,0x9C00BE33,0x9D00BE34,0x9E00BE35, +0x9F00BE36,0xA000BE37,0xA100BE38,0xA200BE39,0xA300BE3A,0xA400BE3B,0xA500BE3C,0xA600BE3D,0xA700BE3E,0xA800BE3F, +0xA900BE40,0xAA00BE41,0xAB00BE42,0xAC00BE43,0xAD00BE44,0xAE00BE45,0xAF00BE46,0xB000BE47,0xB100BE48,0xB200BE49, +0xB300BE4A,0xB400BE4B,0xB500BE4C,0xB600BE4D,0xB700BE4E,0xB800BE4F,0xB900BE50,0xBA00BE51,0xBB00BE52,0xBC00BE53, +0xBD00BE54,0xBE00BE55,0xBF00BE56,0x0024DC89,0x0024DC80,0x0024DC77,0x0024DC6E,0x0024DC65,0x0024DC5C,0x0024DC53, +0x0024DC4A,0x0024DC41,0x0024DC38,0x0024DC2F,0x0024DC26,0x0024DC1D,0x0024DC14,0x0024DC0B,0x0024DC02,0x0024DBF9, +0x0024DBF0,0x0024DBE7,0x0024DBDE,0x0018DAEB,0x0024DBD5,0x0024DBCC,0x0024DBC3,0x0024DBBA,0x0024DBB1,0x0024DBA8, +0x0024DB9F,0x0024DB96,0x0024DB8D,0x0024DB84,0x0024DB7B,0x0024DB72,0x0024DB69,0x0024DB60,0x0024DB57,0x0024DB4E, +0x0024DB45,0x0024DB3C,0x0024DB33,0x0024DB2A,0x0024DB21,0x0024DB18,0x0024DB0F,0x0024DB06,0x0024DAFD,0x0024DAF4, +0x0024DAEB,0x0018D9F8,0x0024DAE2,0x0024DAD9,0x0024DAD0,0x0024DAC7,0x0024DABE,0x0024DAB5,0x0024DAAC,0x0024DAA3, +0x0024DA9A,0x0024DA91,0x0024DA88,0x0024DA7F,0x0024DA76,0x0024DA6D,0x0024DA64,0x8000BE97,0x8100BE98,0x8200BE99, +0x8300BE9A,0x8400BE9B,0x8500BE9C,0x8600BE9D,0x8700BE9E,0x8800BE9F,0x8900BEA0,0x8A00BEA1,0x8B00BEA2,0x8C00BEA3, +0x8D00BEA4,0x8E00BEA5,0x8F00BEA6,0x9000BEA7,0x9100BEA8,0x9200BEA9,0x9300BEAA,0x9400BEAB,0x9500BEAC,0x9600BEAD, +0x9700BEAE,0x9800BEAF,0x9900BEB0,0x9A00BEB1,0x9B00BEB2,0x9C00BEB3,0x9D00BEB4,0x9E00BEB5,0x9F00BEB6,0xA000BEB7, +0xA100BEB8,0xA200BEB9,0xA300BEBA,0xA400BEBB,0xA500BEBC,0xA600BEBD,0xA700BEBE,0xA800BEBF,0xA900BEC0,0xAA00BEC1, +0xAB00BEC2,0xAC00BEC3,0xAD00BEC4,0xAE00BEC5,0xAF00BEC6,0xB000BEC7,0xB100BEC8,0xB200BEC9,0xB300BECA,0xB400BECB, +0xB500BECC,0xB600BECD,0xB700BECE,0xB800BECF,0xB900BED0,0xBA00BED1,0xBB00BED2,0xBC00BED3,0xBD00BED4,0xBE00BED5, +0xBF00BED6,0x0024DA5B,0x0024DA52,0x0024DA49,0x0024DA40,0x0024DA37,0x0024DA2E,0x0024DA25,0x0024DA1C,0x0024DA13, +0x0024DA0A,0x0024DA01,0x0024D9F8,0x0018D905,0x0024D9EF,0x0024D9E6,0x0024D9DD,0x0024D9D4,0x0024D9CB,0x0024D9C2, +0x0024D9B9,0x0024D9B0,0x0024D9A7,0x0024D99E,0x0024D995,0x0024D98C,0x0024D983,0x0024D97A,0x0024D971,0x0024D968, +0x0024D95F,0x0024D956,0x0024D94D,0x0024D944,0x0024D93B,0x0024D932,0x0024D929,0x0024D920,0x0024D917,0x0024D90E, +0x0024D905,0x0018D812,0x0024D8FC,0x0024D8F3,0x0024D8EA,0x0024D8E1,0x0024D8D8,0x0024D8CF,0x0024D8C6,0x0024D8BD, +0x0024D8B4,0x0024D8AB,0x0024D8A2,0x0024D899,0x0024D890,0x0024D887,0x0024D87E,0x0024D875,0x0024D86C,0x0024D863, +0x0024D85A,0x0024D851,0x0024D848,0x0024D83F,0x0024D836,0x8000BF17,0x8100BF18,0x8200BF19,0x8300BF1A,0x8400BF1B, +0x8500BF1C,0x8600BF1D,0x8700BF1E,0x8800BF1F,0x8900BF20,0x8A00BF21,0x8B00BF22,0x8C00BF23,0x8D00BF24,0x8E00BF25, +0x8F00BF26,0x9000BF27,0x9100BF28,0x9200BF29,0x9300BF2A,0x9400BF2B,0x9500BF2C,0x9600BF2D,0x9700BF2E,0x9800BF2F, +0x9900BF30,0x9A00BF31,0x9B00BF32,0x9C00BF33,0x9D00BF34,0x9E00BF35,0x9F00BF36,0xA000BF37,0xA100BF38,0xA200BF39, +0xA300BF3A,0xA400BF3B,0xA500BF3C,0xA600BF3D,0xA700BF3E,0xA800BF3F,0xA900BF40,0xAA00BF41,0xAB00BF42,0xAC00BF43, +0xAD00BF44,0xAE00BF45,0xAF00BF46,0xB000BF47,0xB100BF48,0xB200BF49,0xB300BF4A,0xB400BF4B,0xB500BF4C,0xB600BF4D, +0xB700BF4E,0xB800BF4F,0xB900BF50,0xBA00BF51,0xBB00BF52,0xBC00BF53,0xBD00BF54,0xBE00BF55,0xBF00BF56,0x0024D82D, +0x0024D824,0x0024D81B,0x0024D812,0x0018D71F,0x0024D809,0x0024D800,0x0024D7F7,0x0024D7EE,0x0024D7E5,0x0024D7DC, +0x0024D7D3,0x0024D7CA,0x0024D7C1,0x0024D7B8,0x0024D7AF,0x0024D7A6,0x0024D79D,0x0024D794,0x0024D78B,0x0024D782, +0x0024D779,0x0024D770,0x0024D767,0x0024D75E,0x0024D755,0x0024D74C,0x0024D743,0x0024D73A,0x0024D731,0x0024D728, +0x0024D71F,0x0018D62C,0x0024D716,0x0024D70D,0x0024D704,0x0024D6FB,0x0024D6F2,0x0024D6E9,0x0024D6E0,0x0024D6D7, +0x0024D6CE,0x0024D6C5,0x0024D6BC,0x0024D6B3,0x0024D6AA,0x0024D6A1,0x0024D698,0x0024D68F,0x0024D686,0x0024D67D, +0x0024D674,0x0024D66B,0x0024D662,0x0024D659,0x0024D650,0x0024D647,0x0024D63E,0x0024D635,0x0024D62C,0x0018D539, +0x0024D623,0x0024D61A,0x0024D611,0x8000BF97,0x8100BF98,0x8200BF99,0x8300BF9A,0x8400BF9B,0x8500BF9C,0x8600BF9D, +0x8700BF9E,0x8800BF9F,0x8900BFA0,0x8A00BFA1,0x8B00BFA2,0x8C00BFA3,0x8D00BFA4,0x8E00BFA5,0x8F00BFA6,0x9000BFA7, +0x9100BFA8,0x9200BFA9,0x9300BFAA,0x9400BFAB,0x9500BFAC,0x9600BFAD,0x9700BFAE,0x9800BFAF,0x9900BFB0,0x9A00BFB1, +0x9B00BFB2,0x9C00BFB3,0x9D00BFB4,0x9E00BFB5,0x9F00BFB6,0xA000BFB7,0xA100BFB8,0xA200BFB9,0xA300BFBA,0xA400BFBB, +0xA500BFBC,0xA600BFBD,0xA700BFBE,0xA800BFBF,0xA900BFC0,0xAA00BFC1,0xAB00BFC2,0xAC00BFC3,0xAD00BFC4,0xAE00BFC5, +0xAF00BFC6,0xB000BFC7,0xB100BFC8,0xB200BFC9,0xB300BFCA,0xB400BFCB,0xB500BFCC,0xB600BFCD,0xB700BFCE,0xB800BFCF, +0xB900BFD0,0xBA00BFD1,0xBB00BFD2,0xBC00BFD3,0xBD00BFD4,0xBE00BFD5,0xBF00BFD6,0x0024D608,0x0024D5FF,0x0024D5F6, +0x0024D5ED,0x0024D5E4,0x0024D5DB,0x0024D5D2,0x0024D5C9,0x0024D5C0,0x0024D5B7,0x0024D5AE,0x0024D5A5,0x0024D59C, +0x0024D593,0x0024D58A,0x0024D581,0x0024D578,0x0024D56F,0x0024D566,0x0024D55D,0x0024D554,0x0024D54B,0x0024D542, +0x0024D539,0x0018D446,0x0024D530,0x0024D527,0x0024D51E,0x0024D515,0x0024D50C,0x0024D503,0x0024D4FA,0x0024D4F1, +0x0024D4E8,0x0024D4DF,0x0024D4D6,0x0024D4CD,0x0024D4C4,0x0024D4BB,0x0024D4B2,0x0024D4A9,0x0024D4A0,0x0024D497, +0x0024D48E,0x0024D485,0x0024D47C,0x0024D473,0x0024D46A,0x0024D461,0x0024D458,0x0024D44F,0x0024D446,0x0018D353, +0x0024D43D,0x0024D434,0x0024D42B,0x0024D422,0x0024D419,0x0024D410,0x0024D407,0x0024D3FE,0x0024D3F5,0x0024D3EC, +0x0024D3E3,0x8000C017,0x8100C018,0x8200C019,0x8300C01A,0x8400C01B,0x8500C01C,0x8600C01D,0x8700C01E,0x8800C01F, +0x8900C020,0x8A00C021,0x8B00C022,0x8C00C023,0x8D00C024,0x8E00C025,0x8F00C026,0x9000C027,0x9100C028,0x9200C029, +0x9300C02A,0x9400C02B,0x9500C02C,0x9600C02D,0x9700C02E,0x9800C02F,0x9900C030,0x9A00C031,0x9B00C032,0x9C00C033, +0x9D00C034,0x9E00C035,0x9F00C036,0xA000C037,0xA100C038,0xA200C039,0xA300C03A,0xA400C03B,0xA500C03C,0xA600C03D, +0xA700C03E,0xA800C03F,0xA900C040,0xAA00C041,0xAB00C042,0xAC00C043,0xAD00C044,0xAE00C045,0xAF00C046,0xB000C047, +0xB100C048,0xB200C049,0xB300C04A,0xB400C04B,0xB500C04C,0xB600C04D,0xB700C04E,0xB800C04F,0xB900C050,0xBA00C051, +0xBB00C052,0xBC00C053,0xBD00C054,0xBE00C055,0xBF00C056,0x0024D3DA,0x0024D3D1,0x0024D3C8,0x0024D3BF,0x0024D3B6, +0x0024D3AD,0x0024D3A4,0x0024D39B,0x0024D392,0x0024D389,0x0024D380,0x0024D377,0x0024D36E,0x0024D365,0x0024D35C, +0x0024D353,0x0018D260,0x0024D34A,0x0024D341,0x0024D338,0x0024D32F,0x0024D326,0x0024D31D,0x0024D314,0x0024D30B, +0x0024D302,0x0024D2F9,0x0024D2F0,0x0024D2E7,0x0024D2DE,0x0024D2D5,0x0024D2CC,0x0024D2C3,0x0024D2BA,0x0024D2B1, +0x0024D2A8,0x0024D29F,0x0024D296,0x0024D28D,0x0024D284,0x0024D27B,0x0024D272,0x0024D269,0x0024D260,0x0018D16D, +0x0024D257,0x0024D24E,0x0024D245,0x0024D23C,0x0024D233,0x0024D22A,0x0024D221,0x0024D218,0x0024D20F,0x0024D206, +0x0024D1FD,0x0024D1F4,0x0024D1EB,0x0024D1E2,0x0024D1D9,0x0024D1D0,0x0024D1C7,0x0024D1BE,0x0024D1B5,0x8000C097, +0x8100C098,0x8200C099,0x8300C09A,0x8400C09B,0x8500C09C,0x8600C09D,0x8700C09E,0x8800C09F,0x8900C0A0,0x8A00C0A1, +0x8B00C0A2,0x8C00C0A3,0x8D00C0A4,0x8E00C0A5,0x8F00C0A6,0x9000C0A7,0x9100C0A8,0x9200C0A9,0x9300C0AA,0x9400C0AB, +0x9500C0AC,0x9600C0AD,0x9700C0AE,0x9800C0AF,0x9900C0B0,0x9A00C0B1,0x9B00C0B2,0x9C00C0B3,0x9D00C0B4,0x9E00C0B5, +0x9F00C0B6,0xA000C0B7,0xA100C0B8,0xA200C0B9,0xA300C0BA,0xA400C0BB,0xA500C0BC,0xA600C0BD,0xA700C0BE,0xA800C0BF, +0xA900C0C0,0xAA00C0C1,0xAB00C0C2,0xAC00C0C3,0xAD00C0C4,0xAE00C0C5,0xAF00C0C6,0xB000C0C7,0xB100C0C8,0xB200C0C9, +0xB300C0CA,0xB400C0CB,0xB500C0CC,0xB600C0CD,0xB700C0CE,0xB800C0CF,0xB900C0D0,0xBA00C0D1,0xBB00C0D2,0xBC00C0D3, +0xBD00C0D4,0xBE00C0D5,0xBF00C0D6,0x0024D1AC,0x0024D1A3,0x0024D19A,0x0024D191,0x0024D188,0x0024D17F,0x0024D176, +0x0024D16D,0x0018D07A,0x0024D164,0x0024D15B,0x0024D152,0x0024D149,0x0024D140,0x0024D137,0x0024D12E,0x0024D125, +0x0024D11C,0x0024D113,0x0024D10A,0x0024D101,0x0024D0F8,0x0024D0EF,0x0024D0E6,0x0024D0DD,0x0024D0D4,0x0024D0CB, +0x0024D0C2,0x0024D0B9,0x0024D0B0,0x0024D0A7,0x0024D09E,0x0024D095,0x0024D08C,0x0024D083,0x0024D07A,0x0018CF87, +0x0024D071,0x0024D068,0x0024D05F,0x0024D056,0x0024D04D,0x0024D044,0x0024D03B,0x0024D032,0x0024D029,0x0024D020, +0x0024D017,0x0024D00E,0x0024D005,0x0024CFFC,0x0024CFF3,0x0024CFEA,0x0024CFE1,0x0024CFD8,0x0024CFCF,0x0024CFC6, +0x0024CFBD,0x0024CFB4,0x0024CFAB,0x0024CFA2,0x0024CF99,0x0024CF90,0x0024CF87,0x8000C117,0x8100C118,0x8200C119, +0x8300C11A,0x8400C11B,0x8500C11C,0x8600C11D,0x8700C11E,0x8800C11F,0x8900C120,0x8A00C121,0x8B00C122,0x8C00C123, +0x8D00C124,0x8E00C125,0x8F00C126,0x9000C127,0x9100C128,0x9200C129,0x9300C12A,0x9400C12B,0x9500C12C,0x9600C12D, +0x9700C12E,0x9800C12F,0x9900C130,0x9A00C131,0x9B00C132,0x9C00C133,0x9D00C134,0x9E00C135,0x9F00C136,0xA000C137, +0xA100C138,0xA200C139,0xA300C13A,0xA400C13B,0xA500C13C,0xA600C13D,0xA700C13E,0xA800C13F,0xA900C140,0xAA00C141, +0xAB00C142,0xAC00C143,0xAD00C144,0xAE00C145,0xAF00C146,0xB000C147,0xB100C148,0xB200C149,0xB300C14A,0xB400C14B, +0xB500C14C,0xB600C14D,0xB700C14E,0xB800C14F,0xB900C150,0xBA00C151,0xBB00C152,0xBC00C153,0xBD00C154,0xBE00C155, +0xBF00C156,0x0018CE94,0x0024CF7E,0x0024CF75,0x0024CF6C,0x0024CF63,0x0024CF5A,0x0024CF51,0x0024CF48,0x0024CF3F, +0x0024CF36,0x0024CF2D,0x0024CF24,0x0024CF1B,0x0024CF12,0x0024CF09,0x0024CF00,0x0024CEF7,0x0024CEEE,0x0024CEE5, +0x0024CEDC,0x0024CED3,0x0024CECA,0x0024CEC1,0x0024CEB8,0x0024CEAF,0x0024CEA6,0x0024CE9D,0x0024CE94,0x0018CDA1, +0x0024CE8B,0x0024CE82,0x0024CE79,0x0024CE70,0x0024CE67,0x0024CE5E,0x0024CE55,0x0024CE4C,0x0024CE43,0x0024CE3A, +0x0024CE31,0x0024CE28,0x0024CE1F,0x0024CE16,0x0024CE0D,0x0024CE04,0x0024CDFB,0x0024CDF2,0x0024CDE9,0x0024CDE0, +0x0024CDD7,0x0024CDCE,0x0024CDC5,0x0024CDBC,0x0024CDB3,0x0024CDAA,0x0024CDA1,0x0018CCAE,0x0024CD98,0x0024CD8F, +0x0024CD86,0x0024CD7D,0x0024CD74,0x0024CD6B,0x0024CD62,0x8000C197,0x8100C198,0x8200C199,0x8300C19A,0x8400C19B, +0x8500C19C,0x8600C19D,0x8700C19E,0x8800C19F,0x8900C1A0,0x8A00C1A1,0x8B00C1A2,0x8C00C1A3,0x8D00C1A4,0x8E00C1A5, +0x8F00C1A6,0x9000C1A7,0x9100C1A8,0x9200C1A9,0x9300C1AA,0x9400C1AB,0x9500C1AC,0x9600C1AD,0x9700C1AE,0x9800C1AF, +0x9900C1B0,0x9A00C1B1,0x9B00C1B2,0x9C00C1B3,0x9D00C1B4,0x9E00C1B5,0x9F00C1B6,0xA000C1B7,0xA100C1B8,0xA200C1B9, +0xA300C1BA,0xA400C1BB,0xA500C1BC,0xA600C1BD,0xA700C1BE,0xA800C1BF,0xA900C1C0,0xAA00C1C1,0xAB00C1C2,0xAC00C1C3, +0xAD00C1C4,0xAE00C1C5,0xAF00C1C6,0xB000C1C7,0xB100C1C8,0xB200C1C9,0xB300C1CA,0xB400C1CB,0xB500C1CC,0xB600C1CD, +0xB700C1CE,0xB800C1CF,0xB900C1D0,0xBA00C1D1,0xBB00C1D2,0xBC00C1D3,0xBD00C1D4,0xBE00C1D5,0xBF00C1D6,0x0024CD59, +0x0024CD50,0x0024CD47,0x0024CD3E,0x0024CD35,0x0024CD2C,0x0024CD23,0x0024CD1A,0x0024CD11,0x0024CD08,0x0024CCFF, +0x0024CCF6,0x0024CCED,0x0024CCE4,0x0024CCDB,0x0024CCD2,0x0024CCC9,0x0024CCC0,0x0024CCB7,0x0024CCAE,0x0018CBBB, +0x0024CCA5,0x0024CC9C,0x0024CC93,0x0024CC8A,0x0024CC81,0x0024CC78,0x0024CC6F,0x0024CC66,0x0024CC5D,0x0024CC54, +0x0024CC4B,0x0024CC42,0x0024CC39,0x0024CC30,0x0024CC27,0x0024CC1E,0x0024CC15,0x0024CC0C,0x0024CC03,0x0024CBFA, +0x0024CBF1,0x0024CBE8,0x0024CBDF,0x0024CBD6,0x0024CBCD,0x0024CBC4,0x0024CBBB,0x0018CAC8,0x0024CBB2,0x0024CBA9, +0x0024CBA0,0x0024CB97,0x0024CB8E,0x0024CB85,0x0024CB7C,0x0024CB73,0x0024CB6A,0x0024CB61,0x0024CB58,0x0024CB4F, +0x0024CB46,0x0024CB3D,0x0024CB34,0x8000C217,0x8100C218,0x8200C219,0x8300C21A,0x8400C21B,0x8500C21C,0x8600C21D, +0x8700C21E,0x8800C21F,0x8900C220,0x8A00C221,0x8B00C222,0x8C00C223,0x8D00C224,0x8E00C225,0x8F00C226,0x9000C227, +0x9100C228,0x9200C229,0x9300C22A,0x9400C22B,0x9500C22C,0x9600C22D,0x9700C22E,0x9800C22F,0x9900C230,0x9A00C231, +0x9B00C232,0x9C00C233,0x9D00C234,0x9E00C235,0x9F00C236,0xA000C237,0xA100C238,0xA200C239,0xA300C23A,0xA400C23B, +0xA500C23C,0xA600C23D,0xA700C23E,0xA800C23F,0xA900C240,0xAA00C241,0xAB00C242,0xAC00C243,0xAD00C244,0xAE00C245, +0xAF00C246,0xB000C247,0xB100C248,0xB200C249,0xB300C24A,0xB400C24B,0xB500C24C,0xB600C24D,0xB700C24E,0xB800C24F, +0xB900C250,0xBA00C251,0xBB00C252,0xBC00C253,0xBD00C254,0xBE00C255,0xBF00C256,0x0024CB2B,0x0024CB22,0x0024CB19, +0x0024CB10,0x0024CB07,0x0024CAFE,0x0024CAF5,0x0024CAEC,0x0024CAE3,0x0024CADA,0x0024CAD1,0x0024CAC8,0x0018C9D5, +0x0024CABF,0x0024CAB6,0x0024CAAD,0x0024CAA4,0x0024CA9B,0x0024CA92,0x0024CA89,0x0024CA80,0x0024CA77,0x0024CA6E, +0x0024CA65,0x0024CA5C,0x0024CA53,0x0024CA4A,0x0024CA41,0x0024CA38,0x0024CA2F,0x0024CA26,0x0024CA1D,0x0024CA14, +0x0024CA0B,0x0024CA02,0x0024C9F9,0x0024C9F0,0x0024C9E7,0x0024C9DE,0x0024C9D5,0x0018C8E2,0x0024C9CC,0x0024C9C3, +0x0024C9BA,0x0024C9B1,0x0024C9A8,0x0024C99F,0x0024C996,0x0024C98D,0x0024C984,0x0024C97B,0x0024C972,0x0024C969, +0x0024C960,0x0024C957,0x0024C94E,0x0024C945,0x0024C93C,0x0024C933,0x0024C92A,0x0024C921,0x0024C918,0x0024C90F, +0x0024C906,0x8000C297,0x8100C298,0x8200C299,0x8300C29A,0x8400C29B,0x8500C29C,0x8600C29D,0x8700C29E,0x8800C29F, +0x8900C2A0,0x8A00C2A1,0x8B00C2A2,0x8C00C2A3,0x8D00C2A4,0x8E00C2A5,0x8F00C2A6,0x9000C2A7,0x9100C2A8,0x9200C2A9, +0x9300C2AA,0x9400C2AB,0x9500C2AC,0x9600C2AD,0x9700C2AE,0x9800C2AF,0x9900C2B0,0x9A00C2B1,0x9B00C2B2,0x9C00C2B3, +0x9D00C2B4,0x9E00C2B5,0x9F00C2B6,0xA000C2B7,0xA100C2B8,0xA200C2B9,0xA300C2BA,0xA400C2BB,0xA500C2BC,0xA600C2BD, +0xA700C2BE,0xA800C2BF,0xA900C2C0,0xAA00C2C1,0xAB00C2C2,0xAC00C2C3,0xAD00C2C4,0xAE00C2C5,0xAF00C2C6,0xB000C2C7, +0xB100C2C8,0xB200C2C9,0xB300C2CA,0xB400C2CB,0xB500C2CC,0xB600C2CD,0xB700C2CE,0xB800C2CF,0xB900C2D0,0xBA00C2D1, +0xBB00C2D2,0xBC00C2D3,0xBD00C2D4,0xBE00C2D5,0xBF00C2D6,0x0024C8FD,0x0024C8F4,0x0024C8EB,0x0024C8E2,0x0018C7EF, +0x0024C8D9,0x0024C8D0,0x0024C8C7,0x0024C8BE,0x0024C8B5,0x0024C8AC,0x0024C8A3,0x0024C89A,0x0024C891,0x0024C888, +0x0024C87F,0x0024C876,0x0024C86D,0x0024C864,0x0024C85B,0x0024C852,0x0024C849,0x0024C840,0x0024C837,0x0024C82E, +0x0024C825,0x0024C81C,0x0024C813,0x0024C80A,0x0024C801,0x0024C7F8,0x0024C7EF,0x0018C6FC,0x0024C7E6,0x0024C7DD, +0x0024C7D4,0x0024C7CB,0x0024C7C2,0x0024C7B9,0x0024C7B0,0x0024C7A7,0x0024C79E,0x0024C795,0x0024C78C,0x0024C783, +0x0024C77A,0x0024C771,0x0024C768,0x0024C75F,0x0024C756,0x0024C74D,0x0024C744,0x0024C73B,0x0024C732,0x0024C729, +0x0024C720,0x0024C717,0x0024C70E,0x0024C705,0x0024C6FC,0x0018C609,0x0024C6F3,0x0024C6EA,0x0024C6E1,0x8000C317, +0x8100C318,0x8200C319,0x8300C31A,0x8400C31B,0x8500C31C,0x8600C31D,0x8700C31E,0x8800C31F,0x8900C320,0x8A00C321, +0x8B00C322,0x8C00C323,0x8D00C324,0x8E00C325,0x8F00C326,0x9000C327,0x9100C328,0x9200C329,0x9300C32A,0x9400C32B, +0x9500C32C,0x9600C32D,0x9700C32E,0x9800C32F,0x9900C330,0x9A00C331,0x9B00C332,0x9C00C333,0x9D00C334,0x9E00C335, +0x9F00C336,0xA000C337,0xA100C338,0xA200C339,0xA300C33A,0xA400C33B,0xA500C33C,0xA600C33D,0xA700C33E,0xA800C33F, +0xA900C340,0xAA00C341,0xAB00C342,0xAC00C343,0xAD00C344,0xAE00C345,0xAF00C346,0xB000C347,0xB100C348,0xB200C349, +0xB300C34A,0xB400C34B,0xB500C34C,0xB600C34D,0xB700C34E,0xB800C34F,0xB900C350,0xBA00C351,0xBB00C352,0xBC00C353, +0xBD00C354,0xBE00C355,0xBF00C356,0x0024C6D8,0x0024C6CF,0x0024C6C6,0x0024C6BD,0x0024C6B4,0x0024C6AB,0x0024C6A2, +0x0024C699,0x0024C690,0x0024C687,0x0024C67E,0x0024C675,0x0024C66C,0x0024C663,0x0024C65A,0x0024C651,0x0024C648, +0x0024C63F,0x0024C636,0x0024C62D,0x0024C624,0x0024C61B,0x0024C612,0x0024C609,0x0018C516,0x0024C600,0x0024C5F7, +0x0024C5EE,0x0024C5E5,0x0024C5DC,0x0024C5D3,0x0024C5CA,0x0024C5C1,0x0024C5B8,0x0024C5AF,0x0024C5A6,0x0024C59D, +0x0024C594,0x0024C58B,0x0024C582,0x0024C579,0x0024C570,0x0024C567,0x0024C55E,0x0024C555,0x0024C54C,0x0024C543, +0x0024C53A,0x0024C531,0x0024C528,0x0024C51F,0x0024C516,0x0018C423,0x0024C50D,0x0024C504,0x0024C4FB,0x0024C4F2, +0x0024C4E9,0x0024C4E0,0x0024C4D7,0x0024C4CE,0x0024C4C5,0x0024C4BC,0x0024C4B3,0x8000C397,0x8100C398,0x8200C399, +0x8300C39A,0x8400C39B,0x8500C39C,0x8600C39D,0x8700C39E,0x8800C39F,0x8900C3A0,0x8A00C3A1,0x8B00C3A2,0x8C00C3A3, +0x8D00C3A4,0x8E00C3A5,0x8F00C3A6,0x9000C3A7,0x9100C3A8,0x9200C3A9,0x9300C3AA,0x9400C3AB,0x9500C3AC,0x9600C3AD, +0x9700C3AE,0x9800C3AF,0x9900C3B0,0x9A00C3B1,0x9B00C3B2,0x9C00C3B3,0x9D00C3B4,0x9E00C3B5,0x9F00C3B6,0xA000C3B7, +0xA100C3B8,0xA200C3B9,0xA300C3BA,0xA400C3BB,0xA500C3BC,0xA600C3BD,0xA700C3BE,0xA800C3BF,0xA900C3C0,0xAA00C3C1, +0xAB00C3C2,0xAC00C3C3,0xAD00C3C4,0xAE00C3C5,0xAF00C3C6,0xB000C3C7,0xB100C3C8,0xB200C3C9,0xB300C3CA,0xB400C3CB, +0xB500C3CC,0xB600C3CD,0xB700C3CE,0xB800C3CF,0xB900C3D0,0xBA00C3D1,0xBB00C3D2,0xBC00C3D3,0xBD00C3D4,0xBE00C3D5, +0xBF00C3D6,0x0024C4AA,0x0024C4A1,0x0024C498,0x0024C48F,0x0024C486,0x0024C47D,0x0024C474,0x0024C46B,0x0024C462, +0x0024C459,0x0024C450,0x0024C447,0x0024C43E,0x0024C435,0x0024C42C,0x0024C423,0x0018C330,0x0024C41A,0x0024C411, +0x0024C408,0x0024C3FF,0x0024C3F6,0x0024C3ED,0x0024C3E4,0x0024C3DB,0x0024C3D2,0x0024C3C9,0x0024C3C0,0x0024C3B7, +0x0024C3AE,0x0024C3A5,0x0024C39C,0x0024C393,0x0024C38A,0x0024C381,0x0024C378,0x0024C36F,0x0024C366,0x0024C35D, +0x0024C354,0x0024C34B,0x0024C342,0x0024C339,0x0024C330,0x0018C23D,0x0024C327,0x0024C31E,0x0024C315,0x0024C30C, +0x0024C303,0x0024C2FA,0x0024C2F1,0x0024C2E8,0x0024C2DF,0x0024C2D6,0x0024C2CD,0x0024C2C4,0x0024C2BB,0x0024C2B2, +0x0024C2A9,0x0024C2A0,0x0024C297,0x0024C28E,0x0024C285,0x8000C417,0x8100C418,0x8200C419,0x8300C41A,0x8400C41B, +0x8500C41C,0x8600C41D,0x8700C41E,0x8800C41F,0x8900C420,0x8A00C421,0x8B00C422,0x8C00C423,0x8D00C424,0x8E00C425, +0x8F00C426,0x9000C427,0x9100C428,0x9200C429,0x9300C42A,0x9400C42B,0x9500C42C,0x9600C42D,0x9700C42E,0x9800C42F, +0x9900C430,0x9A00C431,0x9B00C432,0x9C00C433,0x9D00C434,0x9E00C435,0x9F00C436,0xA000C437,0xA100C438,0xA200C439, +0xA300C43A,0xA400C43B,0xA500C43C,0xA600C43D,0xA700C43E,0xA800C43F,0xA900C440,0xAA00C441,0xAB00C442,0xAC00C443, +0xAD00C444,0xAE00C445,0xAF00C446,0xB000C447,0xB100C448,0xB200C449,0xB300C44A,0xB400C44B,0xB500C44C,0xB600C44D, +0xB700C44E,0xB800C44F,0xB900C450,0xBA00C451,0xBB00C452,0xBC00C453,0xBD00C454,0xBE00C455,0xBF00C456,0x0024C27C, +0x0024C273,0x0024C26A,0x0024C261,0x0024C258,0x0024C24F,0x0024C246,0x0024C23D,0x0018C14A,0x0024C234,0x0024C22B, +0x0024C222,0x0024C219,0x0024C210,0x0024C207,0x0024C1FE,0x0024C1F5,0x0024C1EC,0x0024C1E3,0x0024C1DA,0x0024C1D1, +0x0024C1C8,0x0024C1BF,0x0024C1B6,0x0024C1AD,0x0024C1A4,0x0024C19B,0x0024C192,0x0024C189,0x0024C180,0x0024C177, +0x0024C16E,0x0024C165,0x0024C15C,0x0024C153,0x0024C14A,0x0018C057,0x0024C141,0x0024C138,0x0024C12F,0x0024C126, +0x0024C11D,0x0024C114,0x0024C10B,0x0024C102,0x0024C0F9,0x0024C0F0,0x0024C0E7,0x0024C0DE,0x0024C0D5,0x0024C0CC, +0x0024C0C3,0x0024C0BA,0x0024C0B1,0x0024C0A8,0x0024C09F,0x0024C096,0x0024C08D,0x0024C084,0x0024C07B,0x0024C072, +0x0024C069,0x0024C060,0x0024C057,0x8000C497,0x8100C498,0x8200C499,0x8300C49A,0x8400C49B,0x8500C49C,0x8600C49D, +0x8700C49E,0x8800C49F,0x8900C4A0,0x8A00C4A1,0x8B00C4A2,0x8C00C4A3,0x8D00C4A4,0x8E00C4A5,0x8F00C4A6,0x9000C4A7, +0x9100C4A8,0x9200C4A9,0x9300C4AA,0x9400C4AB,0x9500C4AC,0x9600C4AD,0x9700C4AE,0x9800C4AF,0x9900C4B0,0x9A00C4B1, +0x9B00C4B2,0x9C00C4B3,0x9D00C4B4,0x9E00C4B5,0x9F00C4B6,0xA000C4B7,0xA100C4B8,0xA200C4B9,0xA300C4BA,0xA400C4BB, +0xA500C4BC,0xA600C4BD,0xA700C4BE,0xA800C4BF,0xA900C4C0,0xAA00C4C1,0xAB00C4C2,0xAC00C4C3,0xAD00C4C4,0xAE00C4C5, +0xAF00C4C6,0xB000C4C7,0xB100C4C8,0xB200C4C9,0xB300C4CA,0xB400C4CB,0xB500C4CC,0xB600C4CD,0xB700C4CE,0xB800C4CF, +0xB900C4D0,0xBA00C4D1,0xBB00C4D2,0xBC00C4D3,0xBD00C4D4,0xBE00C4D5,0xBF00C4D6,0x0018BF64,0x0024C04E,0x0024C045, +0x0024C03C,0x0024C033,0x0024C02A,0x0024C021,0x0024C018,0x0024C00F,0x0024C006,0x0024BFFD,0x0024BFF4,0x0024BFEB, +0x0024BFE2,0x0024BFD9,0x0024BFD0,0x0024BFC7,0x0024BFBE,0x0024BFB5,0x0024BFAC,0x0024BFA3,0x0024BF9A,0x0024BF91, +0x0024BF88,0x0024BF7F,0x0024BF76,0x0024BF6D,0x0024BF64,0x0018BE71,0x0024BF5B,0x0024BF52,0x0024BF49,0x0024BF40, +0x0024BF37,0x0024BF2E,0x0024BF25,0x0024BF1C,0x0024BF13,0x0024BF0A,0x0024BF01,0x0024BEF8,0x0024BEEF,0x0024BEE6, +0x0024BEDD,0x0024BED4,0x0024BECB,0x0024BEC2,0x0024BEB9,0x0024BEB0,0x0024BEA7,0x0024BE9E,0x0024BE95,0x0024BE8C, +0x0024BE83,0x0024BE7A,0x0024BE71,0x0018BD7E,0x0024BE68,0x0024BE5F,0x0024BE56,0x0024BE4D,0x0024BE44,0x0024BE3B, +0x0024BE32,0x8000C517,0x8100C518,0x8200C519,0x8300C51A,0x8400C51B,0x8500C51C,0x8600C51D,0x8700C51E,0x8800C51F, +0x8900C520,0x8A00C521,0x8B00C522,0x8C00C523,0x8D00C524,0x8E00C525,0x8F00C526,0x9000C527,0x9100C528,0x9200C529, +0x9300C52A,0x9400C52B,0x9500C52C,0x9600C52D,0x9700C52E,0x9800C52F,0x9900C530,0x9A00C531,0x9B00C532,0x9C00C533, +0x9D00C534,0x9E00C535,0x9F00C536,0xA000C537,0xA100C538,0xA200C539,0xA300C53A,0xA400C53B,0xA500C53C,0xA600C53D, +0xA700C53E,0xA800C53F,0xA900C540,0xAA00C541,0xAB00C542,0xAC00C543,0xAD00C544,0xAE00C545,0xAF00C546,0xB000C547, +0xB100C548,0xB200C549,0xB300C54A,0xB400C54B,0xB500C54C,0xB600C54D,0xB700C54E,0xB800C54F,0xB900C550,0xBA00C551, +0xBB00C552,0xBC00C553,0xBD00C554,0xBE00C555,0xBF00C556,0x0024BE29,0x0024BE20,0x0024BE17,0x0024BE0E,0x0024BE05, +0x0024BDFC,0x0024BDF3,0x0024BDEA,0x0024BDE1,0x0024BDD8,0x0024BDCF,0x0024BDC6,0x0024BDBD,0x0024BDB4,0x0024BDAB, +0x0024BDA2,0x0024BD99,0x0024BD90,0x0024BD87,0x0024BD7E,0x0018BC8B,0x0024BD75,0x0024BD6C,0x0024BD63,0x0024BD5A, +0x0024BD51,0x0024BD48,0x0024BD3F,0x0024BD36,0x0024BD2D,0x0024BD24,0x0024BD1B,0x0024BD12,0x0024BD09,0x0024BD00, +0x0024BCF7,0x0024BCEE,0x0024BCE5,0x0024BCDC,0x0024BCD3,0x0024BCCA,0x0024BCC1,0x0024BCB8,0x0024BCAF,0x0024BCA6, +0x0024BC9D,0x0024BC94,0x0024BC8B,0x0018BB98,0x0024BC82,0x0024BC79,0x0024BC70,0x0024BC67,0x0024BC5E,0x0024BC55, +0x0024BC4C,0x0024BC43,0x0024BC3A,0x0024BC31,0x0024BC28,0x0024BC1F,0x0024BC16,0x0024BC0D,0x0024BC04,0x8000C597, +0x8100C598,0x8200C599,0x8300C59A,0x8400C59B,0x8500C59C,0x8600C59D,0x8700C59E,0x8800C59F,0x8900C5A0,0x8A00C5A1, +0x8B00C5A2,0x8C00C5A3,0x8D00C5A4,0x8E00C5A5,0x8F00C5A6,0x9000C5A7,0x9100C5A8,0x9200C5A9,0x9300C5AA,0x9400C5AB, +0x9500C5AC,0x9600C5AD,0x9700C5AE,0x9800C5AF,0x9900C5B0,0x9A00C5B1,0x9B00C5B2,0x9C00C5B3,0x9D00C5B4,0x9E00C5B5, +0x9F00C5B6,0xA000C5B7,0xA100C5B8,0xA200C5B9,0xA300C5BA,0xA400C5BB,0xA500C5BC,0xA600C5BD,0xA700C5BE,0xA800C5BF, +0xA900C5C0,0xAA00C5C1,0xAB00C5C2,0xAC00C5C3,0xAD00C5C4,0xAE00C5C5,0xAF00C5C6,0xB000C5C7,0xB100C5C8,0xB200C5C9, +0xB300C5CA,0xB400C5CB,0xB500C5CC,0xB600C5CD,0xB700C5CE,0xB800C5CF,0xB900C5D0,0xBA00C5D1,0xBB00C5D2,0xBC00C5D3, +0xBD00C5D4,0xBE00C5D5,0xBF00C5D6,0x0024BBFB,0x0024BBF2,0x0024BBE9,0x0024BBE0,0x0024BBD7,0x0024BBCE,0x0024BBC5, +0x0024BBBC,0x0024BBB3,0x0024BBAA,0x0024BBA1,0x0024BB98,0x0018BAA5,0x0024BB8F,0x0024BB86,0x0024BB7D,0x0024BB74, +0x0024BB6B,0x0024BB62,0x0024BB59,0x0024BB50,0x0024BB47,0x0024BB3E,0x0024BB35,0x0024BB2C,0x0024BB23,0x0024BB1A, +0x0024BB11,0x0024BB08,0x0024BAFF,0x0024BAF6,0x0024BAED,0x0024BAE4,0x0024BADB,0x0024BAD2,0x0024BAC9,0x0024BAC0, +0x0024BAB7,0x0024BAAE,0x0024BAA5,0x0018B9B2,0x0024BA9C,0x0024BA93,0x0024BA8A,0x0024BA81,0x0024BA78,0x0024BA6F, +0x0024BA66,0x0024BA5D,0x0024BA54,0x0024BA4B,0x0024BA42,0x0024BA39,0x0024BA30,0x0024BA27,0x0024BA1E,0x0024BA15, +0x0024BA0C,0x0024BA03,0x0024B9FA,0x0024B9F1,0x0024B9E8,0x0024B9DF,0x0024B9D6,0x8000C617,0x8100C618,0x8200C619, +0x8300C61A,0x8400C61B,0x8500C61C,0x8600C61D,0x8700C61E,0x8800C61F,0x8900C620,0x8A00C621,0x8B00C622,0x8C00C623, +0x8D00C624,0x8E00C625,0x8F00C626,0x9000C627,0x9100C628,0x9200C629,0x9300C62A,0x9400C62B,0x9500C62C,0x9600C62D, +0x9700C62E,0x9800C62F,0x9900C630,0x9A00C631,0x9B00C632,0x9C00C633,0x9D00C634,0x9E00C635,0x9F00C636,0xA000C637, +0xA100C638,0xA200C639,0xA300C63A,0xA400C63B,0xA500C63C,0xA600C63D,0xA700C63E,0xA800C63F,0xA900C640,0xAA00C641, +0xAB00C642,0xAC00C643,0xAD00C644,0xAE00C645,0xAF00C646,0xB000C647,0xB100C648,0xB200C649,0xB300C64A,0xB400C64B, +0xB500C64C,0xB600C64D,0xB700C64E,0xB800C64F,0xB900C650,0xBA00C651,0xBB00C652,0xBC00C653,0xBD00C654,0xBE00C655, +0xBF00C656,0x0024B9CD,0x0024B9C4,0x0024B9BB,0x0024B9B2,0x0018B8BF,0x0024B9A9,0x0024B9A0,0x0024B997,0x0024B98E, +0x0024B985,0x0024B97C,0x0024B973,0x0024B96A,0x0024B961,0x0024B958,0x0024B94F,0x0024B946,0x0024B93D,0x0024B934, +0x0024B92B,0x0024B922,0x0024B919,0x0024B910,0x0024B907,0x0024B8FE,0x0024B8F5,0x0024B8EC,0x0024B8E3,0x0024B8DA, +0x0024B8D1,0x0024B8C8,0x0024B8BF,0x0018B7CC,0x0024B8B6,0x0024B8AD,0x0024B8A4,0x0024B89B,0x0024B892,0x0024B889, +0x0024B880,0x0024B877,0x0024B86E,0x0024B865,0x0024B85C,0x0024B853,0x0024B84A,0x0024B841,0x0024B838,0x0024B82F, +0x0024B826,0x0024B81D,0x0024B814,0x0024B80B,0x0024B802,0x0024B7F9,0x0024B7F0,0x0024B7E7,0x0024B7DE,0x0024B7D5, +0x0024B7CC,0x0018B6D9,0x0024B7C3,0x0024B7BA,0x0024B7B1,0x8000C697,0x8100C698,0x8200C699,0x8300C69A,0x8400C69B, +0x8500C69C,0x8600C69D,0x8700C69E,0x8800C69F,0x8900C6A0,0x8A00C6A1,0x8B00C6A2,0x8C00C6A3,0x8D00C6A4,0x8E00C6A5, +0x8F00C6A6,0x9000C6A7,0x9100C6A8,0x9200C6A9,0x9300C6AA,0x9400C6AB,0x9500C6AC,0x9600C6AD,0x9700C6AE,0x9800C6AF, +0x9900C6B0,0x9A00C6B1,0x9B00C6B2,0x9C00C6B3,0x9D00C6B4,0x9E00C6B5,0x9F00C6B6,0xA000C6B7,0xA100C6B8,0xA200C6B9, +0xA300C6BA,0xA400C6BB,0xA500C6BC,0xA600C6BD,0xA700C6BE,0xA800C6BF,0xA900C6C0,0xAA00C6C1,0xAB00C6C2,0xAC00C6C3, +0xAD00C6C4,0xAE00C6C5,0xAF00C6C6,0xB000C6C7,0xB100C6C8,0xB200C6C9,0xB300C6CA,0xB400C6CB,0xB500C6CC,0xB600C6CD, +0xB700C6CE,0xB800C6CF,0xB900C6D0,0xBA00C6D1,0xBB00C6D2,0xBC00C6D3,0xBD00C6D4,0xBE00C6D5,0xBF00C6D6,0x0024B7A8, +0x0024B79F,0x0024B796,0x0024B78D,0x0024B784,0x0024B77B,0x0024B772,0x0024B769,0x0024B760,0x0024B757,0x0024B74E, +0x0024B745,0x0024B73C,0x0024B733,0x0024B72A,0x0024B721,0x0024B718,0x0024B70F,0x0024B706,0x0024B6FD,0x0024B6F4, +0x0024B6EB,0x0024B6E2,0x0024B6D9,0x0018B5E6,0x0024B6D0,0x0024B6C7,0x0024B6BE,0x0024B6B5,0x0024B6AC,0x0024B6A3, +0x0024B69A,0x0024B691,0x0024B688,0x0024B67F,0x0024B676,0x0024B66D,0x0024B664,0x0024B65B,0x0024B652,0x0024B649, +0x0024B640,0x0024B637,0x0024B62E,0x0024B625,0x0024B61C,0x0024B613,0x0024B60A,0x0024B601,0x0024B5F8,0x0024B5EF, +0x0024B5E6,0x0018B4F3,0x0024B5DD,0x0024B5D4,0x0024B5CB,0x0024B5C2,0x0024B5B9,0x0024B5B0,0x0024B5A7,0x0024B59E, +0x0024B595,0x0024B58C,0x0024B583,0x8000C717,0x8100C718,0x8200C719,0x8300C71A,0x8400C71B,0x8500C71C,0x8600C71D, +0x8700C71E,0x8800C71F,0x8900C720,0x8A00C721,0x8B00C722,0x8C00C723,0x8D00C724,0x8E00C725,0x8F00C726,0x9000C727, +0x9100C728,0x9200C729,0x9300C72A,0x9400C72B,0x9500C72C,0x9600C72D,0x9700C72E,0x9800C72F,0x9900C730,0x9A00C731, +0x9B00C732,0x9C00C733,0x9D00C734,0x9E00C735,0x9F00C736,0xA000C737,0xA100C738,0xA200C739,0xA300C73A,0xA400C73B, +0xA500C73C,0xA600C73D,0xA700C73E,0xA800C73F,0xA900C740,0xAA00C741,0xAB00C742,0xAC00C743,0xAD00C744,0xAE00C745, +0xAF00C746,0xB000C747,0xB100C748,0xB200C749,0xB300C74A,0xB400C74B,0xB500C74C,0xB600C74D,0xB700C74E,0xB800C74F, +0xB900C750,0xBA00C751,0xBB00C752,0xBC00C753,0xBD00C754,0xBE00C755,0xBF00C756,0x0024B57A,0x0024B571,0x0024B568, +0x0024B55F,0x0024B556,0x0024B54D,0x0024B544,0x0024B53B,0x0024B532,0x0024B529,0x0024B520,0x0024B517,0x0024B50E, +0x0024B505,0x0024B4FC,0x0024B4F3,0x0018B400,0x0024B4EA,0x0024B4E1,0x0024B4D8,0x0024B4CF,0x0024B4C6,0x0024B4BD, +0x0024B4B4,0x0024B4AB,0x0024B4A2,0x0024B499,0x0024B490,0x0024B487,0x0024B47E,0x0024B475,0x0024B46C,0x0024B463, +0x0024B45A,0x0024B451,0x0024B448,0x0024B43F,0x0024B436,0x0024B42D,0x0024B424,0x0024B41B,0x0024B412,0x0024B409, +0x0024B400,0x0018B30D,0x0024B3F7,0x0024B3EE,0x0024B3E5,0x0024B3DC,0x0024B3D3,0x0024B3CA,0x0024B3C1,0x0024B3B8, +0x0024B3AF,0x0024B3A6,0x0024B39D,0x0024B394,0x0024B38B,0x0024B382,0x0024B379,0x0024B370,0x0024B367,0x0024B35E, +0x0024B355,0x8000C77B,0x8100C77C,0x8200C77D,0x8300C77E,0x8400C77F,0x8500C780,0x8600C781,0x8700C782,0x8800C783, +0x8900C784,0x8A00C785,0x8B00C786,0x8C00C787,0x8D00C788,0x8E00C789,0x8F00C78A,0x9000C78B,0x9100C78C,0x9200C78D, +0x9300C78E,0x9400C78F,0x9500C790,0x9600C791,0x9700C792,0x9800C793,0x9900C794,0x9A00C795,0x9B00C796,0x9C00C797, +0x9D00C798,0x9E00C799,0x9F00C79A,0xA000C79B,0xA100C79C,0xA200C79D,0xA300C79E,0x0024B34C,0x0024B343,0x0024B33A, +0x0024B331,0x0024B328,0x0024B31F,0x0024B316,0x0024B30D,0x0018B21A,0x0024B304,0x0024B2FB,0x0024B2F2,0x0024B2E9, +0x0024B2E0,0x0024B2D7,0x0024B2CE,0x0024B2C5,0x0024B2BC,0x0024B2B3,0x0024B2AA,0x0024B2A1,0x0024B298,0x0024B28F, +0x0024B286,0x0024B27D,0x0024B274,0x0024B26B,0x0024B262,0x0024B259,0x0024B250,0x0024B247,0x0024B23E,0x0024B235, +0x0024B22C,0x0024B223,0x0024B21A,0xA400C757,0xA500C7A8,0xA600C828,0xA700C8A8,0xA800C928,0xA900C9A8,0xAA00CA28, +0xAB00CAA8,0xAC00CA67,0xAD00CAC8,0x000C0FDA,0x000C0FD7,0x000C0FD4,0x000C0FD1,0x000C0FCE,0x000C0FCB,0x000C0FC8, +0x000C0FC5,0x000C0FC2,0x000CAFB0,0x000C0FBF,0x000C0FBC,0x000C0FB9,0x000C0FB6,0x000C0FB3,0x000C0FB0,0x000C0FAD, +0x000C0FAA,0x000C0FA7,0x000C0FA4,0x000C0FA1,0x000C0F9E,0x000C0F9B,0x000C0F98,0x000C0F95,0x000C0F92,0x000C0F8F, +0x000C0F8C,0x000C0F89,0x000C0F86,0x000C0F83,0x000C0F80,0x000C0F7D,0x000C0F7A,0x000C0F77,0x000C0F74,0x000C0F71, +0x000C0F6E,0x000C0F6B,0x000C0F68,0x000C0F65,0x000C0F62,0x000C0F5F,0x000C0F5C,0x000C0F59,0x000C0F56,0x8000C7A9, +0x8100C7AA,0x8200C7AB,0x8300C7AC,0x8400C7AD,0x8500C7AE,0x8600C7AF,0x8700C7B0,0x8800C7B0,0x8900C7B1,0x8A00C7B2, +0x8B00C7B3,0x8C00C7B4,0x8D00C7B5,0x8E00C7B6,0x8F00C7B7,0x9000C7B8,0x9100C7B9,0x9200C7BA,0x9300C7BB,0x9400C7BC, +0x9500C7BD,0x9600C7BE,0x9700C7BF,0x9800C7C0,0x9900C7C1,0x9A00C7C2,0x9B00C7C3,0x9C00C7C4,0x9D00C7C5,0x9E00C7C6, +0x9F00C7C7,0xA000C7C8,0xA100C7C9,0xA200C7CA,0xA300C7CB,0xA400C7CC,0xA500C7CD,0xA600C7CE,0xA700C7CF,0xA800C7D0, +0xA900C7D1,0xAA00C7D2,0xAB00C7D3,0xAC00C7D4,0xAD00C7D5,0xAE00C7D6,0xAF00C817,0xB000C818,0xB100C819,0xB200C81A, +0xB300C81B,0xB400C81C,0xB500C81D,0xB600C81E,0xB700C81F,0xB800C820,0xB900C821,0xBA00C822,0xBB00C823,0xBC00C824, +0xBD00C825,0xBE00C826,0xBF00C827,0x000C0F53,0x000C0F50,0x000C0F4D,0x000C0F4A,0x000C0F47,0x000C0F44,0x000C0F41, +0x000C0F3E,0x000C0F3B,0x000C0F38,0x000C0F35,0x000C0F32,0x000C0F2F,0x000C0F2C,0x000C0F29,0x000C0F26,0x000C0F23, +0x8000C868,0x8100C869,0x8200C86A,0x8300C86B,0x8400C86C,0x8500C86D,0x8600C86E,0x8700C86F,0x8800C870,0x8900C871, +0x8A00C872,0x8B00C873,0x8C00C874,0x8D00C875,0x8E00C876,0x8F00C877,0x9000C878,0x9100C879,0x9200C87A,0x9300C87B, +0x9400C87C,0x9500C87D,0x9600C87E,0x9700C87F,0x9800C880,0x9900C881,0x9A00C882,0x9B00C883,0x9C00C7BC,0x9D00C884, +0x9E00C885,0x9F00C886,0xA000C887,0xA100C888,0xA200C889,0xA300C88A,0xA400C88B,0xA500C88C,0xA600C88D,0xA700C88E, +0xA800C88F,0xA900C890,0xAA00C891,0xAB00C892,0xAC00C893,0xAD00C894,0xAE00C895,0xAF00C896,0xB000C897,0xB100C898, +0xB200C899,0xB300C89A,0xB400C89B,0xB500C89C,0xB600C89D,0xB700C89E,0xB800C89F,0xB900C8A0,0xBA00C8A1,0xBB00C8A2, +0xBC00C8A3,0xBD00C8A4,0xBE00C8A5,0xBF00C8A6,0x000C0F20,0x000C0F1D,0x000C0F1A,0x000C0F17,0x000C0F14,0x000C0F11, +0x000C0F0E,0x000C0F0B,0x000C0F08,0x000C0F05,0x000C0F02,0x000C0EFF,0x000C0EFC,0x000C0EF9,0x000C0EF6,0x000C0EF3, +0x000C0EF0,0x000C0EED,0x000C0EEA,0x000C0EE7,0x000C0EE4,0x000C0EE1,0x000C0EDE,0x000C0EDB,0x000C0ED8,0x000C0ED5, +0x000C0ED2,0x000C0ECF,0x000C0ECC,0x000C0EC9,0x000C0EC6,0x000C0EC3,0x000C0EC0,0x000C0EBD,0x000C0EBA,0x000C0EB7, +0x000C0EB4,0x000C0EB1,0x000C0EAE,0x000C0EAB,0x000C0EA8,0x000C0EA5,0x000C0EA2,0x000C0E9F,0x000C0E9C,0x000C0E99, +0x000C0E96,0x000C0E93,0x000C0E90,0x000C0E8D,0x000C0E8A,0x000C0E87,0x000C0E84,0x000C0E81,0x000C0E7E,0x000C0E7B, +0x000C0E78,0x000C0E75,0x000C0E72,0x000C0E6F,0x000C0E6C,0x000C0E69,0x000C0E66,0x000C0E63,0x8000C8A7,0x8100C8E8, +0x8200C8E9,0x8300C8EA,0x8400C8EB,0x8500C8EC,0x8600C8ED,0x8700C8EE,0x8800C8EF,0x8900C8F0,0x8A00C8F1,0x8B00C8F2, +0x8C00C8F3,0x8D00C8F4,0x8E00C8F5,0x8F00C8F6,0x9000C8F7,0x9100C8F8,0x9200C8F9,0x9300C8FA,0x9400C8FB,0x9500C8FC, +0x9600C8FD,0x9700C8FE,0x9800C8FF,0x9900C900,0x9A00C901,0x9B00C902,0x9C00C903,0x9D00C904,0x9E00C905,0x9F00C906, +0xA000C907,0xA100C896,0xA200C908,0xA300C909,0xA400C90A,0xA500C90B,0xA600C90C,0xA700C90D,0xA800C90E,0xA900C90F, +0xAA00C886,0xAB00C910,0xAC00C911,0xAD00C912,0xAE00C913,0xAF00C914,0xB000C915,0xB100C916,0xB200C917,0xB300C918, +0xB400C919,0xB500C91A,0xB600C91B,0xB700C91C,0xB800C91D,0xB900C91E,0xBA00C91F,0xBB00C920,0xBC00C921,0xBD00C922, +0xBE00C923,0xBF00C7BC,0x000C0E60,0x000C0E5D,0x000C0E5A,0x000C0E57,0x000C0E54,0x000C0E51,0x000C0E4E,0x000C0E4B, +0x000C0E48,0x000C0E45,0x000C0E42,0x000C0E3F,0x000C0E3C,0x000C0E39,0x000C0E36,0x000C0E33,0x000C0E30,0x000C0E2D, +0x000C0E2A,0x000C0E27,0x000C0E24,0x000C0E21,0x000C0E1E,0x000C0E1B,0x000C0E18,0x000C0E15,0x000C0E12,0x000C0E0F, +0x000C0E0C,0x000C0E09,0x000C0E06,0x000C0E03,0x000C0E00,0x000C0DFD,0x000C0DFA,0x000C0DF7,0x000C0DF4,0x000C0DF1, +0x000C0DEE,0x000C0DEB,0x000C0DE8,0x000C0DE5,0x000C0DE2,0x000C0DDF,0x000C0DDC,0x000C0DD9,0x000C0DD6,0x000C0DD3, +0x000C0DD0,0x000C0DCD,0x000C0DCA,0x000C0DC7,0x000C0DC4,0x000C0DC1,0x000C0DBE,0x000C0DBB,0x000C0DB8,0x000C0DB5, +0x000C0DB2,0x000C0DAF,0x000C0DAC,0x000C0DA9,0x000C0DA6,0x000C0DA3,0x8000C924,0x8100C925,0x8200C926,0x8300C927, +0x8400C968,0x8500C969,0x8600C96A,0x8700C96B,0x8800C96C,0x8900C96D,0x8A00C96E,0x8B00C96F,0x8C00C970,0x8D00C971, +0x8E00C972,0x8F00C973,0x9000C974,0x9100C975,0x9200C976,0x9300C977,0x9400C978,0x9500C979,0x9600C97A,0x9700C97B, +0x9800C97C,0x9900C97D,0x9A00C97E,0x9B00C888,0x9C00C97F,0x9D00C980,0x9E00C981,0x9F00C982,0xA000C983,0xA100C984, +0xA200C985,0xA300C986,0xA400C987,0xA500C988,0xA600C989,0xA700C98A,0xA800C98B,0xA900C98C,0xAA00C98D,0xAB00C98E, +0xAC00C98F,0xAD00C990,0xAE00C991,0xAF00C992,0xB000C993,0xB100C994,0xB200C995,0xB300C996,0xB400C997,0xB500C998, +0xB600C999,0xB700C99A,0xB800C99B,0xB900C99C,0xBA00C99D,0xBB00C99E,0xBC00C99F,0xBD00C9A0,0xBE00C9A1,0xBF00C9A2, +0x000C0DA0,0x000C0D9D,0x000C0D9A,0x000C0D97,0x000C0D94,0x000C0D91,0x000C0D8E,0x000C0D8B,0x000C0D88,0x000C0D85, +0x000C0D82,0x000C0D7F,0x000C0D7C,0x000CAFDD,0x000C0D79,0x000C0D76,0x000C0D73,0x000C0D70,0x000C0D6D,0x000C0D6A, +0x000C0D67,0x000C0D64,0x000C0D61,0x000C0D5E,0x000C0D5B,0x000C0D58,0x000C0D55,0x000C0D52,0x000C0D4F,0x000C0D4C, +0x000C0D49,0x000C0D46,0x000C0D43,0x000C0D40,0x000C0D3D,0x000C0D3A,0x000C0D37,0x000C0D34,0x000C0D31,0x000C0D2E, +0x000C0D2B,0x000C0D28,0x000C0D25,0x000C0D22,0x000C0D1F,0x000C0D1C,0x000C0D19,0x000C0D16,0x000C0D13,0x000C0D10, +0x000C0D0D,0x000C0D0A,0x000C0D07,0x000C0D04,0x000C0D01,0x000C0CFE,0x000C0CFB,0x000C0CF8,0x000C0CF5,0x000C0CF2, +0x000C0CEF,0x000C0CEC,0x000C0CE9,0x000C0CE6,0x8000C9A3,0x8100C9A4,0x8200C9A5,0x8300C9A6,0x8400C9A7,0x8500C9B6, +0x8600C9B7,0x8700C9B9,0x8800C9BB,0x8900C9BC,0x8A00C9C7,0x8B00C9C9,0x8C00C9CB,0x8D00C9CC,0x000C0CE3,0x000C0CE0, +0x9000C9CF,0x000C0CDD,0x9200C9D0,0x000C0CDA,0x000C0CD7,0x9500C9D1,0x9600C9E8,0x9700C9E9,0x9800C9EA,0x9900C9EB, +0x9A00C9EC,0x9B00C9ED,0x9C00C9EE,0x9D00C9EF,0x9E00C9F0,0x000C0CD4,0xA000C9F1,0x000C0CD1,0xA200C9F2,0x000C0CCE, +0x000C0CCB,0xA500C9F3,0xA600C9F4,0x000C0CC8,0x000C0CC5,0x000C0CC2,0xAA00C9F5,0xAB00C9F6,0xAC00C9F7,0xAD00C9F8, +0xAE00C9F9,0xAF00C9FA,0xB000C9FB,0xB100C9FC,0xB200C9FD,0xB300C9FE,0xB400C9FF,0xB500CA00,0xB600CA01,0xB700CA02, +0xB800CA03,0xB900CA04,0xBA00CA05,0xBB00CA06,0xBC00CA07,0xBD00CA08,0xBE00CA09,0xBF00CA0A,0x000C0CBF,0x000C0CBC, +0x000C0CB9,0x000C0CB6,0x000C0CB3,0x000C0CB0,0x000C0CAD,0x000C0CAA,0x000C0CA7,0x000C0CA4,0x000C0CA1,0x000C0C9E, +0x000C0C9B,0x000C0C98,0x000C0C95,0x000C0C92,0x000C0C8F,0x000C0C8C,0x000C0C89,0x000C0C86,0x000C0C83,0x000C0C80, +0x000C0C7D,0x000C0C7A,0x000C0C77,0x000C0C74,0x000C0C71,0x000C0C6E,0x000C0C6B,0x000C0C68,0x000C0C65,0x000C0C62, +0x000C0C5F,0x000C0C5C,0x000C0C59,0x000C0C56,0x000C0C53,0x000C0C50,0x000C0C4D,0x000C0C4A,0x000C0C47,0x000C0C44, +0x000C0C41,0x000C0C3E,0x000C0C3B,0x000C0C38,0x000C0C35,0x000CAF97,0x000C0C32,0x000C0C2F,0x000C0C2C,0x000C0C29, +0x000CAF83,0x000C0C26,0x000C0C23,0x000C0C20,0x000C0C1D,0x000C0C1A,0x000C0C17,0x000C0C14,0x000C0C11,0x000C0C0E, +0x000C0C0B,0x000C0C08,0x8000CA0B,0x8100CA0C,0x8200CA0D,0x8300CA0E,0x8400CA0F,0x8500CA10,0x8600CA11,0x8700CA12, +0x8800CA13,0x8900CA14,0x8A00CA15,0x8B00CA16,0x8C00CA17,0x8D00CA18,0x8E00CA19,0x8F00CA1A,0x9000CA1B,0x9100CA1C, +0x9200CA1D,0x9300CA1E,0x9400CA1F,0x9500CA20,0x9600CA21,0x9700C8FD,0x9800CA22,0x9900CA23,0x9A00CA24,0x9B00CA25, +0x9C00CA26,0x9D00CA27,0x9E00CA27,0x9F00CA56,0xA000CA57,0xA100CA68,0xA200CA69,0xA300CA6A,0xA400CA6B,0xA500CA6C, +0xA600CA6D,0xA700C9F3,0xA800CA6E,0xA900CA6F,0xAA00CA70,0xAB00CA71,0xAC00CA72,0xAD00CA73,0x000C0C05,0x000C0C02, +0xB000CA74,0xB100CA75,0xB200CA76,0xB300CA77,0xB400CA78,0xB500CA79,0xB600CA7A,0xB700CA7B,0xB800CA01,0xB900CA7C, +0xBA00CA7D,0xBB00CA7E,0xBC00C9CF,0xBD00CA7F,0xBE00CA80,0xBF00CA81,0x000C0BFF,0x000C0BFC,0x000C0BF9,0x000C0BF6, +0x000C0BF3,0x000C0BF0,0x000C0BED,0x000C0BEA,0x000C0BE7,0x000C0BE4,0x00100BE0,0x000C0BDD,0x000C0BDA,0x000C0BD7, +0x000C0BD4,0x000C0BD1,0x000C0BCE,0x000C0BCB,0x000C0BC8,0x000C0BC5,0x000C0BC2,0x000C0BBF,0x000C0BBC,0x000C0BB9, +0x000C0BB6,0x000C0BB3,0x000C0BB0,0x000C0BAD,0x000C0BAA,0x000C0BA7,0x000C0BA4,0x000C0BA1,0x000C0B9E,0x000C0B9B, +0x000C0B98,0x000C0B95,0x000C0B92,0x000C0B8F,0x000C0B8C,0x000C0B89,0x000C0B86,0x000C0B83,0x000C0B80,0x000C0B7D, +0x000C0B7A,0x000C0B77,0x000C0B74,0x000C0B71,0x000C0B6E,0x000C0B6B,0x000C0B68,0x000C0B65,0x000C0B62,0x000C0B5F, +0x000C0B5C,0x000C0B59,0x000C0B56,0x000C0B53,0x000C0B50,0x000C0B4D,0x000C0B4A,0x000C0B47,0x000C0B44,0x000C0B41, +0x8000CA82,0x8100CA83,0x8200CA84,0x8300CA85,0x8400CA86,0x8500CA87,0x8600CA88,0x8700CA89,0x8800CA8A,0x8900CA0A, +0x8A00CA8B,0x8B00CA0B,0x8C00CA8C,0x8D00CA8D,0x8E00CA8E,0x8F00CA8F,0x9000CA90,0x9100C9D0,0x9200C7D1,0x9300CA91, +0x9400CA92,0x9500CA93,0x9600C897,0x9700C96E,0x9800CA94,0x9900CA95,0x9A00CA12,0x9B00CA96,0x9C00CA13,0x9D00CA97, +0x9E00CA98,0x9F00CA99,0xA000C9E8,0xA100CA9A,0xA200CA9B,0xA300CA9C,0xA400CA9D,0xA500CA9E,0xA600C9E9,0xA700CA9F, +0xA800CAA0,0xA900CAA1,0xAA00CAA2,0xAB00CAA3,0xAC00CAA4,0xAD00CA21,0xAE00CAA5,0xAF00CAA6,0xB000C8FD,0xB100CAA7, +0xB200CA25,0xB300CAE8,0xB400CAE9,0xB500CAEA,0xB600CAEB,0xB700CAEC,0xB800CA68,0xB900CAED,0xBA00C9F2,0xBB00CAEE, +0xBC00CA69,0xBD00C884,0xBE00CAEF,0xBF00CA6A,0x000C0B3E,0x000C0B3B,0x000C0B38,0x000C0B35,0x000C0B32,0x000C0B2F, +0x000C0B2C,0x000C0B29,0x000C0B26,0x000C0B23,0x000C0B20,0x000C0B1D,0x000C0B1A,0x000C0B17,0x000C0B14,0x000C0B11, +0x000C0B0E,0x00100B0A,0x00100B06,0x00100B02,0x000C0AFF,0x000C0AFC,0x000C0AF9,0x00100AF5,0x00100AF1,0x00100AED, +0x000C0AEA,0x000C0AE7,0x9D00CB05,0x0010A0B3,0x9F00CB07,0x0010A0AF,0x0010A0AB,0x0010A0A7,0x0018B214,0x0018B20E, +0x0010A0A3,0x0010A09F,0x0010A09B,0x0010A097,0x0010A093,0xAA00CB08,0xAB00CB09,0xAC00CB0A,0xAD00CB0B,0xAE00CB0C, +0xAF00CB0D,0xB000CB0E,0xB100CB0F,0xB200CB10,0xB300CB1E,0xB400CB24,0xB500CB26,0xB600CB27,0x0010A08F,0xB800CB42, +0xB900CB43,0xBA00CB44,0xBB00CB45,0xBC00CB46,0x0010A08B,0xBE00CB47,0x0010A087,0x0010A083,0x8000CAF0,0x8100CA6C, +0x8200CAF1,0x8300CAF2,0x8400CAF3,0x8500CAF4,0x8600CAF5,0x8700CA6E,0x8800C9EE,0x8900CAF6,0x8A00CA6F,0x8B00CAF7, +0x8C00CA70,0x8D00CAF8,0x8E00C7B0,0x8F00CAF9,0x9000CAFA,0x9100CAFB,0x9200CAFC,0x9300CAFD,0x9400CAFE,0x9500CAFF, +0x9600CB00,0x9700CB01,0x9800CB02,0x9900CB03,0x0010A07F,0x0010A07B,0x0010A077,0x0010A073,0x0010A06F,0x0010A06B, +0x8000CB4A,0x8100CB4D,0x0010A067,0x8300CB57,0x8400CB58,0x0010A063,0x8600CB59,0x8700CB5A,0x8800CB5B,0x8900CB5C, +0x8A00CB5D,0x8B00CB5E,0x8C00CB5F,0x8D00CB60,0x8E00CB61,0x0010A05F,0x0010A05B,0x0010A057,0x0010A053,0x0010A04F, +0x0010B20E,0x0010A04B,0x0010A047,0x0010A043,0x0010A03F,0x0010A03B,0x9100CAE2,0x0020A033,0x8200CACB,0x9A00CB63, +0x8400CABC,0x9C00CB68,0x0020A02B,0x0020A023,0xAE00CB6C,0xAF00CB6D,0x0020A01B,0x0020A013,0x9D00CB04,0x8D00CAE5, +0x8B00CB72,0x8C00CB73,0x0020A00B,0x0020A003,0x9200CABE,0x00209FFB,0xAB00CB69,0x00209FF3,0x9600CAC3,0xBB00CB75, +0xBC00CB77,0x00209FEB,0xBE00CB7B,0xBA00CB7F,0xBB00CB81,0x00209FE3,0xAF00CB06,0x00209FDB,0x9E00CB8C,0x9F00CB8D, +0xA000CB8E,0xA100CB8F,0xA200CB90,0xA300CB91,0xA400CB92,0x8500CAE4,0x8600CAD8,0x8700CB1D,0x00209FD3,0x0020B1D2, +0x0030B202,0x0030B1F6,0x0030B1EA,0x0030B1DE,0x0030B1D2,0xBB00CB98,0xBC00CB99,0xBD00CB9A,0xBE00CB9B,0xBF00CB9C, +0x0020B1AE,0x0020B1A2,0x0030B1C6,0x0030B1BA,0x0030B1AE,0x8000CB9E,0x0030B1A2,0x000C0AE4,0x000C0AE1,0x000C0ADE, +0x00100ADA,0x000C0AD7,0x000C0AD4,0x000C0AD1,0xA000CB2F,0xA100CB9D,0xA200CC1D,0xA300CC9D,0xA400CD1D,0xA500CD9D, +0xA600CE1D,0xA700CE9D,0xA800CF1D,0x8000CB9F,0x8100CBA0,0x8200CBA1,0x8300CBA2,0x8400CBA3,0x8500C9FB,0x8600CBA4, +0x8700CBA5,0x8800CBEF,0x8900CBF0,0x8A00C9FC,0x8B00CBF1,0x8C00CBF2,0x8D00CBF3,0x8E00C9FD,0x8F00CBF4,0x9000CBF5, +0x9100CBF6,0x9200CBF7,0x9300CBF8,0x9400CBF9,0x9500CBFA,0x9600CBFB,0x9700CBFC,0x9800CBFD,0x9900CBFE,0x9A00CBFF, +0x9B00CA75,0x9C00CC00,0x9D00CC01,0x9E00CC02,0x9F00CC03,0xA000CC04,0xA100CC05,0xA200CC06,0xA300CC07,0xA400CC08, +0xA500CA7A,0xA600C9FE,0xA700C9FF,0xA800CA7B,0xA900CC09,0xAA00CC0A,0xAB00C88A,0xAC00CC0B,0xAD00CA00,0xAE00CC0C, +0xAF00CC0D,0xB000CC0E,0xB100CC0F,0xB200CC0F,0xB300CC0F,0xB400CC10,0xB500CC11,0xB600CC12,0xB700CC13,0xB800CC14, +0xB900CC15,0xBA00CC16,0xBB00CC17,0xBC00CC18,0xBD00CC19,0xBE00CC1A,0xBF00CC1B,0x000C0ACE,0x000C0ACB,0x000C0AC8, +0x000C0AC5,0x00100AC1,0x000C0ABE,0x000C0ABB,0x000C0AB8,0x00100AB4,0x000C0AB1,0x000C0AAE,0x000C0AAB,0x00100AA7, +0x000C0AA4,0x000C0AA1,0x000C0A9E,0x000C0A9B,0x00100A97,0x000C0A94,0x000C0A91,0x000C0A8E,0x000C0A8B,0x000C0A88, +0x000C0A85,0x000C0A82,0x000C0A7F,0x000C0A7C,0x000C0A79,0x000C0A76,0x000C0A73,0x000C0A70,0x000C0A6D,0x000C0A6A, +0x00100A66,0x000C0A63,0x000C0A60,0x000C0A5D,0x00100A59,0x000C0A56,0x000C0A53,0x000C0A50,0x000C0A4D,0x000C0A4A, +0x000C0A47,0x000C0A44,0x000C0A41,0x8000CC1C,0x8100CC5D,0x8200CC5E,0x8300CC5F,0x8400CC60,0x8500CC61,0x8600CC61, +0x8700CA7D,0x8800CC62,0x8900CC63,0x8A00CC64,0x8B00CC65,0x8C00CA02,0x8D00CC66,0x8E00CC67,0x8F00CC68,0x9000C9A3, +0x9100CC69,0x9200CC6A,0x9300CC6B,0x9400CC6C,0x9500CC6D,0x9600CC6E,0x9700CC6F,0x9800CC70,0x9900CC71,0x9A00CC72, +0x9B00CC73,0x9C00CC74,0x9D00CC75,0x9E00CC76,0x9F00CC77,0xA000CC78,0xA100CC79,0xA200CC7A,0xA300CC7B,0xA400CC7C, +0xA500CC7D,0xA600CC7E,0xA700CC7F,0xA800CC80,0xA900CC81,0xAA00CC82,0xAB00CC82,0xAC00CC83,0xAD00CC84,0xAE00CC85, +0xAF00C886,0xB000CC86,0xB100CC87,0xB200CC88,0xB300CC89,0xB400CC8A,0xB500CC8B,0xB600CC8C,0xB700CC8D,0xB800CA07, +0xB900CC8E,0xBA00CC8F,0xBB00CC90,0xBC00CC91,0xBD00CC92,0xBE00CC93,0xBF00CC94,0x000C0A3E,0x000C0A3B,0x000C0A38, +0x000C0A35,0x000C0A32,0x000C0A2F,0x000C0A2C,0x000C0A29,0x000C0A26,0x000C0A23,0x000C0A20,0x000C0A1D,0x000C0A1A, +0x000C0A17,0x000C0A14,0x000C0A11,0x000C0A0E,0x000C0A0B,0x000C0A08,0x000C0A05,0x00100A01,0x000C09FE,0x000C09FB, +0x000C09F8,0x000C09F5,0x000C09F2,0x000C09EF,0x001009EB,0x001009E7,0x000C09E4,0x000C09E1,0x000C09DE,0x000C09DB, +0x000C09D8,0x000C09D5,0x000C09D2,0x000C09CF,0x000C09CC,0x001009C8,0x000C09C5,0x000C09C2,0x000C09BF,0x001009BB, +0x000C09B8,0x000C09B5,0x000C09B2,0x000C09AF,0x000C09AC,0x000C09A9,0x000C09A6,0x000C09A3,0x0010099F,0x000C099C, +0x00100998,0x000C0995,0x000C0992,0x000C098F,0x000C098C,0x000C0989,0x000C0986,0x000C0983,0x000C0980,0x000C097D, +0x000C097A,0x8000CC95,0x8100CC96,0x8200CC97,0x8300CC98,0x8400CC99,0x8500CC9A,0x8600CC9B,0x8700CC9C,0x8800CCDD, +0x8900CCDE,0x8A00CCDF,0x8B00CCE0,0x8C00CCE1,0x8D00CCE2,0x8E00C7D0,0x8F00CCE3,0x9000CCE4,0x9100CCE5,0x9200CCE5, +0x9300CCE6,0x9400CCE7,0x9500CCE7,0x9600CCE8,0x9700CCE9,0x9800CCEA,0x9900CCEB,0x9A00CCEC,0x9B00CCED,0x9C00CCEE, +0x9D00CCEF,0x9E00CCF0,0x9F00CCF1,0xA000CCF2,0xA100CCF3,0xA200CCF4,0xA300CA08,0xA400CCF5,0xA500CCF6,0xA600CCF7, +0xA700CCF8,0xA800CA89,0xA900CCF8,0xAA00CCF9,0xAB00CA0A,0xAC00CCFA,0xAD00CCFB,0xAE00CCFC,0xAF00CCFD,0xB000CA0B, +0xB100C7B5,0xB200CCFE,0xB300CCFF,0xB400CD00,0xB500CD01,0xB600CD02,0xB700CD03,0xB800CD04,0xB900CD05,0xBA00CD06, +0xBB00CD07,0xBC00CD08,0xBD00CD09,0xBE00CD0A,0xBF00CD0B,0x000C0977,0x00100973,0x000C0970,0x000C096D,0x000C096A, +0x000C0967,0x00100963,0x000C0960,0x0010095C,0x000C0959,0x000C0956,0x000C0953,0x0010094F,0x0010094B,0x000C0948, +0x000C0945,0x000C0942,0x000C093F,0x000C093C,0x000C0939,0x000C0936,0x000C0933,0x000C0930,0x000C092D,0x00100929, +0x000C0926,0x000C0923,0x000C0920,0x000C091D,0x000C091A,0x000C0917,0x000C0914,0x000C0911,0x000C9ECD,0x000C090E, +0x000C090B,0x000C0908,0x000C0905,0x000C0902,0x001008FE,0x000C08FB,0x000C08F8,0x000C08F5,0x000C08F2,0x000C08EF, +0x001008EB,0x000C08E8,0x000C08E5,0x000C08E2,0x000C08DF,0x000C08DC,0x000C08D9,0x000C08D6,0x000C08D3,0x000C08D0, +0x000C08CD,0x001008C9,0x000C08C6,0x000C08C3,0x000C08C0,0x000C08BD,0x000C08BA,0x000C08B7,0x000C08B4,0x8000CD0C, +0x8100CD0D,0x8200CD0E,0x8300CD0F,0x8400CD10,0x8500CD11,0x8600CD12,0x8700CD13,0x8800CA0C,0x8900CD14,0x8A00CD15, +0x8B00CD16,0x8C00CD17,0x8D00CD18,0x8E00CD19,0x8F00CA0E,0x9000CD1A,0x9100CD1B,0x9200CD1C,0x9300CD5D,0x9400CD5E, +0x9500CD5F,0x9600CD60,0x9700CD61,0x9800C7D1,0x9900CA91,0x9A00CD62,0x9B00CD63,0x9C00CD64,0x9D00CD65,0x9E00CD66, +0x9F00CD67,0xA000CD68,0xA100CD69,0xA200CA0F,0xA300CD6A,0xA400CD6B,0xA500CD6C,0xA600CD6D,0xA700CAFC,0xA800CD6E, +0xA900CD6F,0xAA00CD70,0xAB00CD71,0xAC00CD72,0xAD00CD73,0xAE00CD74,0xAF00CD75,0xB000CD76,0xB100CD77,0xB200CD78, +0xB300CD79,0xB400CD7A,0xB500C897,0xB600CD7B,0xB700CD7C,0xB800CD7D,0xB900CD7E,0xBA00CD7F,0xBB00CD80,0xBC00CD81, +0xBD00CD82,0xBE00CD83,0xBF00CD84,0x000C08B1,0x000C08AE,0x000C08AB,0x000C08A8,0x000C08A5,0x000C08A2,0x000C089F, +0x000C089C,0x00100898,0x000C0895,0x000C0892,0x000C088F,0x000C088C,0x00100888,0x000C0885,0x000C0882,0x000C087F, +0x000C087C,0x000C0879,0x000C0876,0x000C0873,0x0010086F,0x000C086C,0x000C0869,0x000C0866,0x00100862,0x000C085F, +0x000C085C,0x000C0859,0x000C0856,0x000C0853,0x0010084F,0x0010084B,0x00100847,0x000C0844,0x00100840,0x000C083D, +0x000C083A,0x000C0837,0x000C0834,0x000C0831,0x000C082E,0x000C082B,0x000C0828,0x00100824,0x000C0821,0x000C081E, +0x000C081B,0x000C0818,0x000C0815,0x00100811,0x000C080E,0x000C080B,0x00100807,0x00100803,0x000C0800,0x000C07FD, +0x000C07FA,0x000C07F7,0x000C07F4,0x000C07F1,0x000C07EE,0x000C07EB,0x001007E7,0x8000CD85,0x8100CA10,0x8200C96E, +0x8300CD86,0x8400CD87,0x8500CD88,0x8600CD89,0x8700CD8A,0x8800CD8B,0x8900CD8C,0x8A00CD8D,0x8B00CA95,0x8C00CD8E, +0x8D00CD8F,0x8E00CD90,0x8F00CD91,0x9000CD92,0x9100CD93,0x9200CD94,0x9300CD95,0x9400CA96,0x9500CD96,0x9600CD97, +0x9700CD98,0x9800CD99,0x9900CD9A,0x9A00CD9B,0x9B00CD9C,0x9C00CDDD,0x9D00CDDE,0x9E00CDDF,0x9F00CDE0,0xA000CDE1, +0xA100CA98,0xA200CDE2,0xA300CDE3,0xA400CDE4,0xA500CDE5,0xA600CDE6,0xA700CDE7,0xA800CDE8,0xA900CDE9,0xAA00CDEA, +0xAB00CDEB,0xAC00CDEC,0xAD00CDEC,0xAE00CDED,0xAF00CDEE,0xB000CA9A,0xB100CDEF,0xB200CDF0,0xB300CDF1,0xB400CDF2, +0xB500CDF3,0xB600CDF4,0xB700CDF5,0xB800C889,0xB900CDF6,0xBA00CDF7,0xBB00CDF8,0xBC00CDF9,0xBD00CDFA,0xBE00CDFB, +0xBF00CDFC,0x000C07E4,0x001007E0,0x000C07DD,0x001007D9,0x000C07D6,0x000C07D3,0x001007CF,0x000C07CC,0x000C07C9, +0x001007C5,0x001007C1,0x000C07BE,0x000C07BB,0x000C07B8,0x000C07B5,0x000C07B2,0x000C07AF,0x000C07AC,0x000C07A9, +0x000C07A6,0x000C07A3,0x000C07A0,0x0010079C,0x000C0799,0x00100795,0x00100791,0x000C078E,0x0010078A,0x00100786, +0x00100782,0x000C077F,0x000C077C,0x00100778,0x00100774,0x00100770,0x0010076C,0x000C0769,0x000C0766,0x000C0763, +0x000C0760,0x000C075D,0x00100759,0x000C0756,0x000C0753,0x0010074F,0x0010074B,0x00100747,0x000C0744,0x000C0741, +0x000C073E,0x000C073B,0x00100737,0x00100733,0x000C0730,0x000C072D,0x00100729,0x000C0726,0x000C0723,0x000C0720, +0x0010071C,0x000C0719,0x000C0716,0x000C0713,0x000C0710,0x8000CAA0,0x8100CDFD,0x8200CDFE,0x8300CDFF,0x8400CE00, +0x8500CE01,0x8600CE02,0x8700CE02,0x8800CAA1,0x8900CAFE,0x8A00CE03,0x8B00CE04,0x8C00CE05,0x8D00CE06,0x8E00CE07, +0x8F00C823,0x9000CAA3,0x9100CE08,0x9200CE09,0x9300CA1B,0x9400CE0A,0x9500CE0B,0x9600C9ED,0x9700CE0C,0x9800CE0D, +0x9900CA1F,0x9A00CE0E,0x9B00CE0F,0x9C00CE10,0x9D00CE11,0x9E00CE11,0x9F00CE12,0xA000CE13,0xA100CE14,0xA200CE15, +0xA300CE16,0xA400CE17,0xA500CE18,0xA600CE19,0xA700CE1A,0xA800CE1B,0xA900CE1C,0xAA00CE5D,0xAB00CE5E,0xAC00CE5F, +0xAD00CE60,0xAE00CE61,0xAF00CE62,0xB000CE63,0xB100CE64,0xB200CE65,0xB300CE66,0xB400CE67,0xB500CE68,0xB600CE69, +0xB700CE6A,0xB800CE6B,0xB900CE6C,0xBA00CA25,0xBB00CE6D,0xBC00CE6E,0xBD00CE6F,0xBE00CE70,0xBF00CE71,0x000C070D, +0x00100709,0x000C0706,0x000C0703,0x000C0700,0x000C06FD,0x000C06FA,0x000C06F7,0x001006F3,0x001006EF,0x000C06EC, +0x001006E8,0x000C06E5,0x001006E1,0x000C06DE,0x000C06DB,0x001006D7,0x001006D3,0x000C06D0,0x001006CC,0x000C06C9, +0x001006C5,0x000C06C2,0x000C06BF,0x000C06BC,0x000C06B9,0x000C06B6,0x000C06B3,0x001006AF,0x001006AB,0x001006A7, +0x001006A3,0x000C06A0,0x000C069D,0x000C069A,0x000C0697,0x000C0694,0x000C0691,0x000C068E,0x000C068B,0x000C0688, +0x000C0685,0x000C0682,0x0010067E,0x000C067B,0x000C0678,0x000C0675,0x000C0672,0x000C066F,0x000C066C,0x000C0669, +0x000C0666,0x000C0663,0x000C0660,0x0010065C,0x00100658,0x00100654,0x000C0651,0x000C064E,0x000C064B,0x000C0648, +0x00100644,0x000C0641,0x0010063D,0x8000CE72,0x8100CE73,0x8200CE74,0x8300CE75,0x8400CE76,0x8500CE77,0x8600CE78, +0x8700CE79,0x8800CE7A,0x8900CE7B,0x8A00CE7C,0x8B00CCE6,0x8C00CE7D,0x8D00CE7E,0x8E00CE7F,0x8F00CE80,0x9000CE81, +0x9100CE82,0x9200CE83,0x9300CE84,0x9400CE85,0x9500CE86,0x9600CE87,0x9700CE88,0x9800C89B,0x9900CE89,0x9A00CE8A, +0x9B00CE8B,0x9C00CE8C,0x9D00CE8D,0x9E00CE8E,0x9F00CA56,0xA000CE8F,0xA100CE90,0xA200CE91,0xA300CE92,0xA400CE93, +0xA500CE94,0xA600CE95,0xA700CE96,0xA800CE97,0xA900CE98,0xAA00CE99,0xAB00CE9A,0xAC00CE9B,0xAD00CE9C,0xAE00CEDD, +0xAF00CEDE,0xB000CEDF,0xB100CEE0,0xB200CEE1,0xB300CEE2,0xB400C81E,0xB500CEE3,0xB600CEE4,0xB700CEE5,0xB800CEE6, +0xB900CEE7,0xBA00CEE8,0xBB00CAEA,0xBC00CEE9,0xBD00CEEA,0xBE00CEEB,0xBF00CEEC,0x000C063A,0x000C0637,0x00100633, +0x0010062F,0x000C062C,0x000C0629,0x000C0626,0x000C0623,0x000C0620,0x000C061D,0x000C061A,0x000C0617,0x000C0614, +0x000C0611,0x000C060E,0x000C060B,0x000C0608,0x000C0605,0x000C0602,0x000C05FF,0x000C05FC,0x001005F8,0x000C05F5, +0x000C05F2,0x000C05EF,0x000C05EC,0x000C05E9,0x001005E5,0x001005E1,0x000C05DE,0x000C05DB,0x000C05D8,0x000C05D5, +0x001005D1,0x000C05CE,0x000C05CB,0x000C05C8,0x000C05C5,0x001005C1,0x001005BD,0x000C05BA,0x000C05B7,0x000C05B4, +0x001005B0,0x000C05AD,0x001005A9,0x001005A5,0x000C05A2,0x000C059F,0x000C059C,0x00100598,0x000C0595,0x000C0592, +0x000C058F,0x000C058C,0x000C0589,0x000C0586,0x000C0583,0x0010057F,0x000C057C,0x000C0579,0x000C0576,0x00100572, +0x000C056F,0x8000CEED,0x8100CEEE,0x8200CEEF,0x8300CEF0,0x8400CEF1,0x8500CEF2,0x8600CEF3,0x8700CEF4,0x8800CEF5, +0x8900CEF6,0x8A00CEF7,0x8B00CEF8,0x8C00CEF9,0x8D00CEFA,0x8E00CEFB,0x8F00CEFC,0x9000CAEF,0x9100CAF0,0x9200CEFD, +0x9300CEFE,0x9400CEFF,0x9500CF00,0x9600CF01,0x9700CF02,0x9800CF03,0x9900CF04,0x9A00CF05,0x9B00CF06,0x9C00CF07, +0x9D00CF08,0x9E00CF09,0x9F00CAF1,0xA000CF0A,0xA100CF0B,0xA200CF0C,0xA300CF0D,0xA400CF0E,0xA500CF0F,0xA600CF10, +0xA700CF11,0xA800CF12,0xA900CF13,0xAA00CF14,0xAB00CF15,0xAC00CF16,0xAD00CF17,0xAE00CF18,0xAF00CF19,0xB000CF1A, +0xB100CF1B,0xB200CF1C,0xB300CF5D,0xB400CF5E,0xB500CF5F,0xB600CF60,0xB700CF61,0xB800CF62,0xB900CF63,0xBA00CF64, +0xBB00CF65,0xBC00CF66,0xBD00CF67,0xBE00CAF7,0xBF00CAF7,0x000C056C,0x000C0569,0x000C0566,0x00100562,0x0010055E, +0x000C055B,0x000C0558,0x000C0555,0x00100551,0x000C054E,0x0010054A,0x000C0547,0x00100543,0x000C0540,0x000C053D, +0x000C053A,0x000C0537,0x000C0534,0x000C0531,0x000C052E,0x0010052A,0x000C0527,0x000C0524,0x000C0521,0x000C051E, +0x000C051B,0x00100517,0x000C0514,0x00100510,0x0010050C,0x00100508,0x000C0505,0x000C0502,0x000C04FF,0x000C04FC, +0x000C04F9,0x000C04F6,0x000C04F3,0x000C04F0,0x001004EC,0x00049CD2,0x000CB148,0x00049E59,0x000C9FD0,0x00049CC8, +0x00049CC6,0x000C9FCD,0x00089E70,0x000C9FCA,0x00049CCA,0x00049ED4,0x0014B19D,0x0014B198,0x0014B193,0xBC00E805, +0x00089FC8,0x00089FC6,0x000C9FC3,0x000C9FC0,0x000C9FBD,0x00049E3C,0x0010B18F,0x0010B18B,0x0010B187,0x8000CF68, +0x8100CF69,0x8200CF6A,0x8300CF6B,0x8400CF6C,0x8500CF6D,0x8600CF6E,0x8700CF6F,0x8800CF70,0x8900CF71,0x8A00CAF8, +0x8B00CF72,0x8C00CF73,0x8D00CF74,0x8E00CF75,0x8F00CF76,0x9000CF77,0x9100CF78,0x9200CF79,0x9300CF7A,0x9400CF7B, +0x9500CF7C,0x9600CF7D,0x9700CF7E,0x9800CF7F,0x9900CF80,0x9A00CF81,0x9B00CF82,0x9C00CF83,0x9D00CF84,0x00089FBB, +0x00089FB9,0x00089FB7,0x00089FB5,0xA000CF85,0x00089FB3,0x00089FB1,0x0008B18F,0x0008B18B,0x0008B187,0x00049E58, +0x000804EA,0xA800CF86,0x00049FB2,0xAA00CF87,0x00049E43,0x000804E8,0x000804E6,0x000804E4,0xAF00CF88,0x0004A37F, +0x00049E5B,0xB200CF89,0xB300CF8A,0xB400CF8B,0xB500CF8C,0x000C9FAE,0x000C9FAB,0xB800CF8D,0xB900CF8E,0xBA00CF8F, +0x000C9FA8,0xBC00CF90,0xBD00CF91,0xBE00CF92,0x000C9FA5,0x000C9FA2,0xC200CF1F,0xC300675B,0xC400CF93,0xC500CFD3, +0xC6006865,0xC700D00F,0xC8006905,0x000C9F9F,0xCA00D01F,0xCB00D040,0x000804E2,0xCD00D065,0xCE00D066,0xCF00D070, +0xD0006985,0xD1006986,0x00049E4A,0xD30069AF,0x00049E4B,0x000804E0,0xD6009770,0x000C9F9C,0xD80069CA,0xD900D052, +0x0014B182,0xDB0069E9,0x000804DE,0x000804DC,0x0008A29A,0x000804DA,0xE000D083,0xE100D0C4,0xE200D237,0xE300D5E1, +0x000804D8,0x000804D6,0x0008A2AA,0x000804D4,0x000804D2,0x0008A32C,0xEA00DAAE,0xEB007737,0xEC0097B7,0xED00B7B8, +0x000804D0,0xEF00DACC,0xF000E0DE,0xB300D03A,0x00109F98,0x00109F94,0x00109F90,0x8000683C,0x8100683D,0x82006852, +0x83006853,0x8400685D,0x8500685E,0x8600685F,0x87006864,0x8800686B,0x8900686C,0x8A00686D,0x8B00686E,0x8C00686F, +0x8D006870,0x8E006871,0x8F006872,0x00109F8C,0x00109F88,0x92006873,0x93006874,0x94006875,0x95006876,0x96006877, +0x97006878,0x98006879,0x9900687A,0x9A00687B,0x9B00687C,0x9C00687D,0x9D00687E,0x9E00687F,0x9F006880,0xA0006881, +0xA1006882,0xA2006883,0xA3006884,0xA4006885,0xA5006886,0x00189F82,0x00189F7C,0xA8006887,0xA9006888,0xAA006889, +0xAB00688A,0xAC00688B,0xAD00688C,0xAE00688D,0xAF00688E,0xB000688F,0x00189F76,0xB200CF94,0xB300CF95,0xB4006890, +0xB5006891,0xB6006892,0xB7006893,0x00189F70,0xB9006894,0xBA006895,0xBB006896,0xBC006897,0xBD006898,0xBE006899, +0xBF00CF96,0x8000CF97,0x9C00D044,0x9D00D04B,0x830068A0,0x840068A1,0x850068A2,0x860068A9,0x870068AA,0x880068BD, +0x8900CF98,0x8C00D05E,0x000C04CD,0x8C0068BE,0x8D0068D6,0x8E0068D7,0x8F0068D8,0x900068D9,0x910068DA,0x8C00D4BF, +0xAF00D4C8,0x940068DB,0x950068DC,0x960068DD,0x970068DE,0x980068DF,0x990068E0,0x9A0068E1,0x9B0068E2,0x9C0068E3, +0x9D0068E4,0x9E0068E5,0x9F0068E6,0xA00068E7,0xA10068E8,0xA20068E9,0xA30068EA,0xA40068EB,0xA50068EC,0x0024B179, +0x0024B170,0xA80068ED,0xA90068EE,0xAA0068EF,0xAB0068F0,0xAC0068F1,0xAD0068F2,0xAE0068F3,0xAF0068F4,0xB00068F5, +0xB10068F6,0xB20068F7,0xB30068F8,0xB40068F9,0xB50068FA,0xB60068FB,0xB70068FC,0xB80068FD,0xB90068FE,0xBA0068FF, +0xBB006900,0xBC006901,0xBD006902,0xBE006903,0xBF00CF99,0x8400CF9A,0x8500CF9B,0x8600CF9C,0x8700CFBB,0x8800CFBC, +0x8900CFBD,0x8A00CFBE,0x8B00CFC0,0x8C00CFC1,0x8D00690A,0x8E00690B,0x8F00690C,0x9000690D,0x9100690E,0x9200690F, +0x93006910,0x94006911,0x95006912,0x96006913,0x97006916,0x98006917,0x99006918,0x9A006919,0x9B00691A,0x9C00691B, +0x000C04CA,0x9E00691C,0x9F00691D,0xA000691E,0xA100691F,0xA2006920,0xA3006921,0x00049EAE,0x0008A7FC,0xA6006922, +0xA7006923,0xA8006924,0xA9006925,0xAA006926,0xAB006937,0xAC00693E,0xAD00693F,0xAE00694B,0xAF00694C,0xB000694D, +0xB100CFC2,0xB200CFC3,0xB300CFC4,0xB4006950,0xB5006951,0x00049E5D,0x00049CA8,0xB800695A,0xB900695B,0xBA00695C, +0xBB00695D,0xBC00695E,0xBD00695F,0xBE006960,0xBF006961,0xB000CFC5,0xB100CFC6,0xB200CFC8,0xB300CFCA,0xB400CFCB, +0xB500CFCC,0xB600CFCD,0xB700CFCF,0xB800CFD0,0x9800CFD5,0x9900CFD6,0x9A00CFDA,0x9B00CFDE,0x9C00CFDF,0x9D00CFE7, +0x0004A369,0x000804C8,0xA000CFEA,0xA100CFF0,0xA200CF99,0xA300CFF2,0xA400CFF3,0x800069BC,0x810069BF,0x00049E5A, +0x830069C0,0x840069C1,0x8400CF8B,0x8500CFF8,0x860069C5,0x870069C6,0x880069C7,0x890069C8,0x8A0069C9,0x00049CB4, +0x8C0069D0,0x00049ED0,0x8E0069D2,0x8F0069D6,0x900069D7,0x00049CA9,0x00049FB9,0x00049CAA,0x8A0069E4,0x8B0069E5, +0x8C0069E6,0x8D0069E7,0x8E0069EA,0x00049F54,0x9000CFFA,0x9100CFFB,0x9200CFFC,0x930069D2,0x940069D9,0x9500CFFD, +0x9600D002,0xB500D011,0xB600D012,0xB700D023,0xB800D024,0x0004A357,0x000804C6,0x00049E44,0x00049E45,0x00049F50, +0xAA0069D8,0xAB0069D9,0xAC0069DA,0xAD0069DB,0xAE0069DC,0xAF0069DD,0xB00069DE,0x00049ED1,0xB000DB30,0xB40069C2, +0x00049CAE,0x000804C4,0x000804C2,0x000C04BF,0x00049E3F,0xBA00CFF5,0xB000D003,0xB100D004,0xB200D005,0xBE0069C3, +0xB400D006,0xB500D007,0x00049E5C,0xA40069E0,0xA5006A05,0xB900D00C,0xA7006A0C,0xA80069DF,0xA9006A13,0x00049EF2, +0x000804BD,0x000804BB,0xAD006A30,0xAE006A12,0xAF006A3C,0x000804B9,0xB1006A31,0x00049E9C,0xB3006A49,0x00049E4E, +0xB5006A4B,0x83006AC3,0xB7006A3E,0xB8006EC6,0x00049E48,0xBA00CF5C,0xBB00CFB8,0xBC00CFD1,0xBD00D0B6,0xBE006A61, +0x000804B7,0x8D006AC4,0x80006A46,0x000804B5,0x000C04B2,0x83006DD1,0x92006AC5,0x000C04AF,0x00049E75,0x00049E3D, +0x0004A348,0x97006ACA,0x000C04AC,0x000804AA,0x00049E41,0x000C04A7,0x9C006ACB,0x000804A5,0x000804A3,0x000804A1, +0x00049E54,0x0008049F,0x0008049D,0x00049E5E,0x0008049B,0x00080499,0x00049E90,0x00080497,0x00080495,0xA9006ACE, +0x00080493,0x00080491,0x0008048F,0x0008048D,0x000C048A,0x00080488,0x00080486,0x000C0483,0x00080481,0xB3006AD2, +0x0008047F,0xB5006ADD,0xB6006ADF,0xB700D079,0xB8006AE0,0xB900D07A,0xAC006A84,0xAD006A78,0x0008047D,0x0008047B, +0x00080479,0x00080477,0x00080475,0x00080473,0xB400D0D8,0xB500D118,0xB600D136,0x00080471,0xB8006AC6,0xB9006B1A, +0xBA00D178,0xBB006C1A,0xBC006C9A,0xBD006D1A,0xBE00D1B8,0xBF00D1F8,0xAC00D0B3,0xAD00D0B4,0xAE00D0C5,0x0008046F, +0xB000D0C6,0xB100D0DE,0xB200D0DF,0xB300D0E7,0xB400D0F1,0xB500D0F3,0xB600D0F7,0xB7006E89,0xB800D0F8,0xB900D0F9, +0xBA00D0FF,0x0008046D,0xBC00D10B,0xBD00D10C,0xBE00D10D,0xBF00D10E,0x8000D10F,0x8100D117,0x8200D11A,0x8300CF87, +0x8400D11B,0x8500D11C,0x8600D11D,0x8700D11E,0x8800D126,0x8900D12D,0x8A00D12E,0x8B00D12F,0x8C00D133,0x8D00D135, +0x0008046B,0x8F00D137,0x9000D13C,0x9100D142,0x9200CF8F,0x9300D145,0x9400D146,0x9500D149,0x9600D14A,0x9700D14B, +0x9800D14C,0x9900D14E,0x9A00D14F,0x9B00D150,0x9C00D151,0x9D00CFFA,0x9E00D153,0x9F00D154,0xA000CFFD,0xA100D155, +0xA200D156,0xA300CFCA,0xA400D14C,0xA500D150,0xA600CFFA,0xA700D153,0xA800D004,0xA900CFFD,0xAA00D155,0x00080469, +0x000C0466,0x00080464,0x00080462,0x0004A388,0x00080460,0x0008045E,0x0008A80F,0x000C9F6D,0x000CB15C,0x000C9F6A, +0x0014B16B,0x0014B166,0xB800D157,0x9B00D158,0x9C00D159,0x9D00D15A,0x9E00D15B,0x9F00D133,0xA000D15C,0xA100D15D, +0xA200D15E,0xA300D160,0xA400D161,0xA500D162,0xA600D163,0xA700D164,0xA800D165,0xA900D166,0xAA00D167,0xAB00D168, +0xAC00D16A,0xAD00D172,0xAE00D173,0xAF00D174,0xB000D175,0xB100D176,0xB200D177,0xB300D17B,0xB400D187,0xB500D193, +0xB600D1A6,0xB700D1C3,0xB800D1C4,0xB900D1C5,0xBA00D1C6,0xBB00D1C7,0xBC00D1C8,0xBD00D1C9,0xBE00D1CA,0xBF00CFFB, +0x0014B161,0x0014B15C,0x80006C19,0x81006C34,0x82006C36,0x83006C37,0x84006C38,0x85006C39,0x86006C5A,0x87006C5B, +0x88006C5C,0x89006C5D,0x8A006C5E,0x8B006C5F,0x8C006C60,0x8D006C61,0x8E006C62,0x8F006C63,0x90006C64,0x91006C65, +0x92006C66,0x93006C67,0x94006C68,0x95006C69,0x96006C6A,0x97006C6B,0x98006C6C,0x99006C6D,0x9A00D1CB,0x9B006BFA, +0x0014B157,0x0014B152,0x0014B14D,0x0014B148,0xA0006C6F,0xA1006C70,0xA2006C71,0xA3006C72,0xA4006C73,0xA5006C74, +0xA6006C75,0xA7006C76,0xA8006C77,0xA9006C78,0xAA006C79,0xAB006C7A,0xAC006C7B,0xAD006C7C,0xAE006C7D,0xAF006C7E, +0xB0006C7F,0xB1006C80,0xB2006C81,0xB3006C82,0xB4006C83,0xB5006C84,0xB6006C85,0xB7006C86,0xB8006C87,0xB9006C88, +0xBA006C89,0xBB006C8A,0xBC006C8B,0xBD006C8C,0xBE006C8D,0xBF006C8E,0x80006DE0,0x81006DE1,0x82006DE2,0x83006DE3, +0x84006DE4,0x85006DE5,0x86006DE6,0x87006DE7,0x88006DE8,0x89006DE9,0x8A006DEA,0x8B006DEB,0x8C006DEC,0x8D006DED, +0x8E006DEE,0x8F006DEF,0x90006DF0,0x91006DF1,0x92006DF2,0x93006DF3,0x94006DF4,0x95006DF5,0x96006DF6,0x97006DF7, +0x98006DF8,0x99006DF9,0x9A006DFA,0x9B006DFB,0x9C006DFC,0x9D006DFD,0x9E006DFE,0x9F006DFF,0xA0006E00,0xA1006E01, +0xA2006E02,0xA3006E03,0xA4006E04,0xA5006E05,0xA6006E06,0xA7006E07,0xA8006E08,0xA9006E09,0xAA006E0A,0xAB006E0B, +0xAC006E0C,0xAD006E0D,0xAE006E0E,0xAF006E0F,0xB0006E10,0xB1006E11,0xB2006E12,0xB3006E13,0xB4006E14,0x000CB14D, +0xB6006E15,0xB7006E16,0xB8006E17,0xB9006E18,0xBA006E19,0xBB0069C5,0xBC006E4F,0xBD00D1CC,0xBE006E57,0xBF00D1CC, +0x8000D1CD,0x8100D1CE,0x82006E5A,0x83006E5B,0x84006E5C,0x000C045B,0x86006E5D,0x87006E5E,0x88006E5F,0x890069C7, +0x8A006E60,0x8B0069C8,0x8C006E61,0x8D00D1CF,0x8E00D1F6,0x8F00D1F7,0x90006E65,0x91006E66,0x92006E67,0x930069D7, +0x000C9F67,0x0004ADCE,0x96006E68,0x97006E69,0x98006E6A,0x99006E6B,0x9A006E6C,0x9B0069C9,0x0008B145,0x9D00D214, +0x9E00D215,0x9F00D216,0xA0006E70,0xA1006E71,0xA2006E72,0xA30069DE,0xA4006E73,0xA5006E74,0xA6006E75,0xA7006E76, +0xA8006E77,0xA9006E78,0xAA006E79,0xAB0069D2,0xAC006E7A,0xAD00D217,0xAE00CFF8,0xAF006E7C,0x000CB145,0x001A32D3, +0xB2006E7D,0xB3006E7E,0xB4006E7F,0x002632D3,0xB6006E80,0xB7006E81,0xB8006E82,0xB90069D0,0xBA006E83,0xBB0069D6, +0xBC006E84,0xBD00CF8B,0xBE00D26D,0x8000D253,0x8100D266,0x8200D2A6,0x0018B13C,0x8400D2CA,0x8500D30A,0x8600D34A, +0x87006E8D,0x8800D350,0x89006E9D,0x8A006EAB,0x8B006EBB,0x8C006E56,0x0024B13C,0x00089F65,0x000C9F62,0x00089F60, +0x9100D363,0x9200D3A3,0x9300D411,0x00089F5E,0x00089F5F,0x003232D3,0x00049CCC,0x00049CC4,0x00049CC2,0x00049CC0, +0x00049CBE,0x8000CF85,0x8100CF85,0x8200CF85,0x8300CF85,0x8400CF85,0x8500CF85,0x8600CF85,0x8700CF85,0x8800CF85, +0x8900CF85,0x8A00CF85,0x00049CBC,0xA800CFD9,0xA900D40C,0x00049CBA,0xAB006E9B,0x0004045A,0x9100D27D,0x000C0457, +0x0004A234,0x0004AA15,0xB100D40A,0x0004AA17,0x9700D28C,0x00049E4D,0xB500CFB7,0x8700D2C7,0x8800D2CB,0x8900D2CC, +0x00089F5C,0xBA00D42A,0xBB00D418,0xBC00D44D,0xBD00D4C7,0xBE00D547,0xBF00D5C7,0xA400D28D,0xA500D294,0xA600D2A8, +0x000CB139,0x000CB136,0x00049CAD,0x9700D2CD,0x000C9F59,0x000CB133,0x000CB130,0x00080455,0xAF00CF85,0x000C9F56, +0x00080453,0x9F00CF85,0xB300D2A9,0xB400D2AD,0x00089F54,0xB600D2BA,0xB700D2C4,0x0004AA31,0x00089F52,0x000CB12D, +0x00089F50,0xBC00D2C5,0x00049CB7,0xBE00D2C6,0x00049EA2,0x00089E24,0x0008A043,0x0008A093,0xB000D2CE,0xB100D156, +0x0008A08F,0x000CB12A,0xB400D2CF,0xB500D2D0,0xB600D2D1,0xB700D2D2,0xB800D2DE,0xB900D2E1,0xBA00D2E3,0xBB00D2E5, +0xBC00D2E6,0xBD00D2E7,0xBE00D2E9,0xBF00D2EB,0x8000D2CE,0x8100CF8E,0x8200CF89,0x8300CF8A,0x8400D2CF,0x8500D2D0, +0x8600D2D1,0x8700D2D2,0x8800D2DE,0x8900D2E1,0x8A00D2E3,0x8B00D2E5,0x8C00D2E6,0x8D00D2E7,0x8E00D2E9,0x00080451, +0x9000CF87,0x9100D12D,0x9200CF8F,0x9300CFF2,0x9400D12E,0x9500CFC5,0x9600D137,0x9700CFF0,0x9800D13C,0x9900D2EB, +0x9A00D14A,0x9B00CF99,0x9C00D14B,0x0008044F,0x000C044C,0x0014B125,0x0014B120,0x001A32CD,0x0014B11B,0x0014B116, +0x8000D2FA,0x8100D2FB,0x8200D2FC,0x8300D2FE,0xA800D2F0,0x8500D2FF,0x8600D300,0x8700D301,0x0014B111,0x8900D303, +0x8A00D135,0x8B00D0F1,0x8C00D0F1,0x8D00D0F1,0x8E00CFC5,0x8F00D304,0x9000D0F3,0x9100D0F3,0x9200D0F8,0x9300CFF0, +0x0014B10C,0x9500D0FF,0x9600D308,0x0014B107,0x0014B102,0x9900D10D,0x9A00D30B,0x9B00D10E,0x9C00D10E,0x9D00D10E, +0x0014B0FD,0x0014B0F8,0xA000D30C,0xA100D30D,0xA200D30E,0x0014B0F3,0xA400D310,0x0014B0EE,0xA6006E88,0x0014B0E9, +0xA800D310,0x0014B0E4,0xAA006E89,0xAB0067B5,0xAC00D0C5,0xAD00D2FC,0x0010B0F3,0xAF00D12D,0xB000D0DE,0xB100D312, +0x0008B0E2,0xB300D0F9,0xB400CF8F,0xB500D313,0xB600D314,0xB700D315,0xB800D318,0xB900D156,0x000E32CA,0xBB00D319, +0xBC00D002,0xBD00D153,0xBE00D335,0xBF00D343,0x8000D344,0x00089F4E,0x00049CB5,0x000A32C9,0x000E32C9,0x8500D0C6, +0x8600D126,0x8700D12D,0x8800D156,0x8900CFC8,0x001232C9,0x00089F4C,0x00049F4D,0x00089F4D,0x000CB0E1,0x0008B0DF, +0x9000D345,0x9100D346,0x9200D347,0x9300D348,0x9400D349,0x9500D352,0x9600D35E,0x9700D361,0x9800D362,0x9900D368, +0x9A00D369,0x9B00D36D,0x9C00D36F,0x9D00D371,0x9E00D373,0x9F00D378,0xA000D0F3,0xA100D37C,0xA200D384,0xA300D38B, +0xA400D38C,0xA500D38D,0xA600D38E,0xA700D394,0xA800D395,0xA900D396,0xAA00D397,0xAB00D398,0xAC00D0F8,0xAD00D2FC, +0xAE00D0C6,0xAF00D0F9,0xB000D156,0xB100D399,0xB200D3CA,0xB300D3CB,0xB400D150,0xB500D3CC,0xB600D3CD,0xB700D3CE, +0xB800D3CF,0xB900CFF2,0xBA00D3D0,0xBB00D3D1,0xBC00CFF0,0xBD00D159,0xBE00D126,0xBF00D13C,0x000E32C6,0x00089F4A, +0x000A32C5,0x000E32C5,0x001232C5,0x00089F48,0x00089F49,0x000CB0DE,0x0014B0D9,0x8900D3D2,0x84006E91,0x001A328D, +0x0026328D,0x0018B0D0,0x0024B0D0,0x89006E92,0x0008ADB1,0x0008ADAC,0x8C006E93,0x0008ADA7,0x0008ADA2,0x0008AD9D, +0x0008AD98,0x0008AD93,0x0008AD8E,0x0008AD89,0x9A006E8A,0x9B006E8B,0x0008AD84,0x0008AD7F,0x000CB0CD,0x000CB0CA, +0x000CB0C7,0x000CB0C4,0x000CB0C1,0x000CB0BE,0x000CB0BB,0x000CB0B8,0x000CB0B5,0x001232C1,0x001232BD,0x001232B9, +0xA4006E95,0x001232B5,0xA6006E96,0x001232B1,0xAE006E8C,0x001232AD,0x001232A9,0x001232A5,0xAC00D3D5,0xAD00D3D6, +0x001232A1,0xAF00D3D7,0xB000D3D8,0x0012329D,0x00123299,0xA000CF8E,0xA100CF89,0xA200CF8A,0xA300D2CF,0xA400D2D0, +0xA500D2D1,0xA600D2D2,0xA700D2DE,0xA800D2E1,0xA900D3DA,0xAA00D3DB,0xAB00D3DD,0xAC00D3DE,0xAD00D3DF,0xAE00D3E0, +0xAF00D3E1,0xB000D3E2,0xB100D3E3,0xB200D3E6,0xB300D3E7,0xB400D3E8,0xB500D3E9,0xB600D3EA,0xB700D3EB,0xB800D3EC, +0xB900D3ED,0xBA00D3EE,0xBB00D3EF,0xBC00D3F0,0xBD00D3F1,0xBE00D3F2,0xBF00D3F3,0x8000D3F5,0x8100D3F7,0x8200D3F9, +0x8300D3FA,0x8400D3FB,0x8500D3FE,0x8600D401,0x8700D402,0x8800D463,0x8900D464,0x8A00D465,0x8B00D466,0x8C00D467, +0x8D00D468,0x8E00D469,0x8F00D46A,0x9000D46B,0x9100D46C,0x9200D46D,0x9300D46E,0x9400D46F,0x9500D470,0x9600D471, +0x9700D472,0x9800D473,0x9900D474,0x9A00D475,0x9B00D476,0x9C00D477,0x9D00D478,0x9E00D479,0x9F00D47A,0xA000D47B, +0xA100D47C,0xA200D47D,0xA300D47E,0xA400D47F,0xA500D480,0xA600D481,0xA700D482,0xA800D483,0xA900D484,0xAA00D485, +0xAB00D486,0xAC00D487,0xAD00D488,0xAE00D489,0xAF00D48A,0xB000D48B,0xB100D48C,0xB200D48D,0xB300D48E,0xB400D48F, +0xB500D490,0xB600D0B3,0xB700D0C5,0xB800D2FC,0xB900D0C6,0xBA00D0DE,0xBB00D312,0xBC00D0E7,0xBD00D0F1,0xBE00D0F3, +0xBF00D0F7,0x0008B0B0,0x0008B0AD,0x0008B0AA,0x0008B0A7,0x0008B0A4,0x0008B0A1,0x0008B09E,0x0008B09B,0x0008B098, +0x000CB0B2,0x000CB0AF,0x000CB0AC,0x000CB0A9,0x000CB0A6,0x000CB0A3,0x000CB0A0,0x000CB09D,0x000CB09A,0x000CB097, +0x000CB094,0x000CB091,0x000CB08E,0x000CB08B,0x000CB088,0x000CB085,0x000CB082,0x000CB07F,0x000CB07C,0x000CB079, +0x000CB076,0x000CB073,0x000CB070,0x000CB06D,0x000CB06A,0x000CB067,0x000CB064,0x000CB061,0x000CB05E,0x000CB05B, +0x000CB058,0x000CB055,0x000CB052,0x000CB04F,0x000CB04C,0x000CB049,0x000CB046,0x80006E89,0x8100D0F8,0x8200D0F9, +0x8300D0FF,0x8400D10B,0x8500D10D,0x8600D30B,0x8700D10E,0x8800D4BC,0x8900D10F,0x8A00D117,0x8B00D38C,0x8C00D11A, +0x8D00D396,0x8E00D4BD,0x8F00D310,0x9000CF87,0x9100D11E,0x9200D159,0x9300D126,0x9400D12D,0x9500D15C,0x9600D135, +0x9700CFC5,0x9800D156,0x9900CFC8,0x9A00D137,0x9B00CFF0,0x9C00D13C,0x9D00D2EB,0x9E00CF8F,0x9F00D14A,0xA000D4BE, +0xA100CFCA,0xA200CF99,0xA300D14B,0xA400D14C,0xA500D150,0xA600CFCF,0xA700CFF2,0xA800CFD0,0xA900D1C7,0xAA00D2CE, +0x00049CB0,0x0004A333,0x00049E63,0x0032328D,0xB400D4C3,0xB500D4C4,0xB600D4C5,0x000CB043,0x0008B040,0x000CB040, +0xBC00CFC8,0xBD00D38C,0x000C0449,0x9F00D4CA,0x000C0446,0xB300D4CC,0x000C0443,0x8000D50D,0x8100D50E,0x8200D50F, +0x8300D510,0x8400D511,0x8500D512,0x8600D513,0x8700D514,0x8800D515,0x8900D516,0x8A00D517,0x8B00D518,0x8C00D519, +0x8D00D51A,0x8E00D51B,0x8F00D51C,0x9000CC01,0x9100D51D,0x9200C8F1,0x9300D51E,0x9400D51F,0x9500D520,0x9600D521, +0x9700D522,0x9800D523,0x9900D524,0x9A00D525,0x9B00D526,0x9C00D527,0x9D00D528,0x9E00D529,0x9F00D52A,0xA000D52B, +0xA100D52C,0xA200D52D,0xA300D52E,0xA400D52F,0xA500C8E8,0xA600D530,0xA700D531,0xA800D532,0xA900D533,0xAA00CC8B, +0xAB00D534,0xAC00CA07,0xAD00D535,0xAE00D536,0xAF00D537,0xB000D538,0xB100D539,0xB200D53A,0xB300D53B,0xB400D53C, +0xB500D53D,0xB600CCE4,0xB700D53E,0xB800D53F,0xB900D540,0xBA00D541,0xBB00D542,0xBC00D543,0xBD00D544,0xBE00D545, +0xBF00D546,0x000CAFF6,0x000C0440,0x000C043D,0x000C043A,0x000C0437,0x000C0434,0x000CA9F3,0x000C0431,0x000C042E, +0x000C042B,0x000C0428,0x000CAFD3,0x000C0425,0x000C0422,0x000C041F,0x000C041C,0x000C0419,0x000C0416,0x000C0413, +0x000C0410,0x000C040D,0x000CAFC9,0x000C040A,0x000C0407,0x000C0404,0x000C0401,0x000C03FE,0x000C03FB,0x000C03F8, +0x000CAFAB,0x000C03F5,0x000C03F2,0x000C03EF,0x000C03EC,0x000C9EBE,0x000C03E9,0x000C03E6,0x000C03E3,0x000C03E0, +0x000C03DD,0x000C03DA,0x000C03D7,0x000C03D4,0x000C03D1,0x000C03CE,0x000C03CB,0x000C03C8,0x000C03C5,0x000C03C2, +0x000C03BF,0x000C03BC,0x000C03B9,0x000C03B6,0x000C03B3,0x000C03B0,0x000C03AD,0x000C03AA,0x000C03A7,0x8000D587, +0x8100D588,0x8200D589,0x8300D58A,0x8400D58B,0x8500D58C,0x8600D58D,0x8700D58E,0x8800D58F,0x8900D590,0x8A00D591, +0x8B00D592,0x8C00D593,0x8D00CA93,0x8E00D594,0x8F00D595,0x9000D596,0x9100D597,0x9200D598,0x9300D599,0x9400D59A, +0x9500D59B,0x9600D59C,0x9700D59D,0x9800D59E,0x9900D59F,0x9A00D5A0,0x9B00D5A1,0x9C00D5A2,0x9D00D5A3,0x9E00D5A4, +0x9F00D5A5,0xA000D5A6,0xA100D5A7,0xA200D5A8,0xA300D5A9,0xA400D5AA,0xA500D5AB,0xA600D5AC,0xA700D5AD,0xA800D5AE, +0xA900D5AF,0xAA00D5B0,0xAB00D5B1,0xAC00D5B2,0xAD00D5B3,0xAE00D5B4,0xAF00D5B5,0xB000D5B6,0xB100D5B7,0xB200D5B8, +0xB300D5B9,0xB400C99A,0xB500D5BA,0xB600D5BB,0xB700D5BC,0xB800D5BD,0xB900D5BE,0xBA00D5BF,0xBB00C9F0,0xBC00C81C, +0xBD00D5C0,0xBE00D5C1,0xBF00D5C2,0x000C03A4,0x000C03A1,0x000C039E,0x000C039B,0x000C0398,0x000C0395,0x000C0392, +0x000CAD4A,0x000C038F,0x000C9EF7,0x000CAFB5,0x000C038C,0x000C0389,0x000C0386,0x000C0383,0x000C0380,0x000C037D, +0x000C037A,0x000C0377,0x000CAFBA,0x000CAFBF,0x000C0374,0x000C0371,0x000C036E,0x000C036B,0x000C0368,0x000C0365, +0x000C0362,0x000C035F,0x000C035C,0x000C0359,0x000C0356,0x000C0353,0x000C0350,0x000C034D,0x000C034A,0x000C0347, +0x000C0344,0x000C0341,0x000C033E,0x000C033B,0x000C0338,0x000C0335,0x000C0332,0x000C032F,0x000C032C,0x000C0329, +0x000C0326,0x000C0323,0x000C0320,0x000C031D,0x000C031A,0x000C0317,0x000C0314,0x000C0311,0x000C030E,0x000C030B, +0x000C0308,0x000C0305,0x000C0302,0x000C02FF,0x000C02FC,0x000C02F9,0x000CAF4C,0x8000D5C3,0x8100D5C4,0x8200D5C5, +0x8300D5C6,0x8400D607,0x8500D608,0x8600D609,0x8700D60A,0x8800D60B,0x8900D60C,0x8A00D60D,0x8B00D60E,0x8C00D60F, +0x8D00D610,0x8E00D611,0x8F00C9BB,0x9000CEF1,0x9100D612,0x9200C9C7,0x9300D613,0x9400D614,0x9500D615,0x9600D616, +0x9700CEFD,0x9800D617,0x9900D618,0x9A00D619,0x9B00D61A,0x9C00D61B,0x9D00D61C,0x9E00C7AB,0x9F00D61D,0xA000C898, +0xA100D61E,0xA200D61F,0xA300D620,0xA400D621,0xA500C98C,0xA600C7B2,0xA700D622,0xA800D623,0xA900D624,0xAA00D625, +0xAB00D626,0xAC00D627,0xAD00D628,0xAE00D629,0xAF00D62A,0xB000D62B,0xB100D62C,0xB200D62D,0xB300D62E,0xB400D62F, +0xB500D630,0xB600D631,0xB700D632,0xB800D633,0xB900D634,0xBA00D635,0xBB00D636,0xBC00D637,0xBD00D638,0xBE00D639, +0xBF00D63A,0x000CAF47,0x000C02F6,0x000C02F3,0x000C02F0,0x000C02ED,0x000C02EA,0x000C02E7,0x000C02E4,0x000C02E1, +0x000C02DE,0x000C02DB,0x000C02D8,0x000C02D5,0x000C02D2,0x000C02CF,0x000C02CC,0x000C02C9,0x000C02C6,0x000C02C3, +0x000C02C0,0x000C02BD,0x000C02BA,0x000C02B7,0x000C02B4,0x000C02B1,0x000C02AE,0x000C02AB,0x000C02A8,0x000C02A5, +0x000C02A2,0x000C029F,0x000C029C,0x000C0299,0x000C0296,0x000C0293,0x000C0290,0x000C028D,0x000C028A,0x000C0287, +0x000C0284,0x000C0281,0x000C027E,0x000C027B,0x000C0278,0x000C0275,0x000C0272,0x000C026F,0x000C026C,0x000C0269, +0x000C0266,0x000C0263,0x000C0260,0x000C025D,0x000C025A,0x000C0257,0x000C0254,0x000C0251,0x000C024E,0x000C024B, +0x000C0248,0x000C0245,0x000C0242,0x000C023F,0x000C023C,0x8000D63B,0x8100D63C,0x8200D63D,0x8300D63E,0x8400D63F, +0x8500C868,0x8600D640,0x8700CF7C,0x8800D641,0x8900D642,0x8A00D643,0x8B00CF7E,0x8C00D644,0x8D00D645,0x8E00D646, +0x8F00D65D,0x9000CF83,0x9100D65E,0x9200D65F,0x9300C968,0x9400C7B0,0x9500D660,0x000C0239,0x000C0236,0x000C0233, +0x000C0230,0x8000D5E8,0x81006EDE,0x8200D5F7,0x8300D647,0x8400D5C8,0x8500D687,0x8600D6C7,0x8000CF85,0x8800D6FB, +0x8900D77B,0x8A00D7FB,0x8B00D86F,0x8C00D8AE,0x8D00D92E,0x8E00D9AE,0x8F00DA2E,0x000C022D,0x000C022A,0x000C0227, +0x00109F44,0x00109F40,0x00189F3A,0x00189F34,0x000CB03C,0xB100D678,0xB200D688,0xB300D689,0xB400D68A,0xB500D68C, +0xB600D68D,0xB700D68E,0xB800D68F,0xB900D690,0xBA00D691,0xBB00D694,0xBC00D697,0xBD00D698,0xBE00D699,0xBF00D69A, +0x000E04E7,0x000CB2F8,0x000CB037,0x94006F2D,0x000CB2E6,0x000CB2DD,0x000CB032,0x000DC91A,0x000CB02D,0x000CB2C2, +0x9B00D674,0x9C00D675,0x000CB2B9,0x9E006F2E,0x9F00D676,0x000CB2B0,0x000CB2A7,0x000CB29E,0x000CB295,0x000C0224, +0x000CB028,0x000CB023,0xB600D671,0x000D795E,0xB800D522,0xB900D672,0xBA00D673,0xAC006F31,0x000C0221,0xAE006F32, +0x000CB01E,0xB0006F35,0x000D5180,0xB2006F36,0x000CB019,0xB4006F39,0x000CB014,0xB6006F3B,0x000D15BC,0xB8006F3C, +0x000CB00F,0xBA006F3E,0x000CB00A,0xBC006F40,0x000CB005,0xBE006F41,0x000CB000,0x000CAFFB,0x000CC519,0x000CC426, +0x000CC333,0x000CC240,0x000CC14D,0x000CC05A,0x000CBF67,0x000CBE74,0x000CBD81,0x000CBC8E,0x000CBB9B,0x000CBAA8, +0x000CB9B5,0x000CB8C2,0x000CB7CF,0x80006F42,0x000CB6DC,0x82006F43,0x000CB5E9,0x000CB4F6,0x85006F44,0x000CB403, +0x87006F45,0x000CB310,0x89006F46,0x000CB21D,0x000C021E,0x000C021B,0x000C0218,0x000C0215,0x000C0212,0x90006F47, +0x91006F48,0x000C020F,0x93006F49,0x94006F4F,0x000C020C,0x96006F50,0x97006F53,0x000C0209,0x99006F54,0x9A006F5F, +0x000C0206,0x9C006F60,0x9D006F61,0x000C0203,0x000C0200,0x000C01FD,0x000C01FA,0x000C01F7,0x000C01F4,0x000C01F1, +0x000C01EE,0x000C01EB,0x000C01E8,0x000C01E5,0x000C01E2,0x000C01DF,0x000C01DC,0x000C01D9,0x000C01D6,0x000C01D3, +0x000C01D0,0x000C01CD,0x000C01CA,0x000C01C7,0x000C01C4,0xB4006F62,0x000C01C1,0x000C01BE,0xB7006F63,0xB8006F64, +0xB9006F69,0xBA006F6B,0x000C01BB,0x000C01B8,0x000C01B5,0xBE006F6D,0xBF00D677,0x8000D69B,0x8100D69C,0x8200D69D, +0x8300D69F,0x8400D6A4,0x8500D6A6,0x8600D6A8,0x8700D6AA,0x8800D6AC,0x8900D6AE,0x8A00D6B0,0x8B00D6B2,0x8C00D6B4, +0x8D00D6B6,0x8E00D6B7,0x8F00D6B8,0x9000D6B9,0x9100D6BA,0x9200D6BB,0x9300D6BC,0x9400D6BD,0x9500D6BE,0x9600D6BF, +0x9700D6C0,0x9800D6C1,0x9900D6C2,0x9A00D6C3,0x9B00D6C4,0x9C00D6C5,0x9D00D6C6,0x9E00D6C8,0x9F00D6CA,0xA000D6CB, +0xA100D6CD,0xA200D6CF,0xA300D6D1,0xA400D6D2,0xA500D6D3,0xA600D6D4,0xA700D6D5,0xA800D6D6,0xA900D6D9,0xAA00D6DC, +0xAB00D6DF,0xAC00D6E2,0xAD00D6E5,0xAE00D6E6,0xAF00D6E7,0xB000D6E8,0xB100D6E9,0xB200D6EA,0xB300D6EB,0xB400D6EC, +0xB500D6ED,0xB600D6EE,0xB700D6EF,0xB800D6F0,0xB900D6F1,0xBA00D6F2,0xBB00D6F3,0xBC00D6F4,0xBD00D6F5,0xBE00D6F6, +0xBF00D6F7,0x8000D6F8,0x8100D6F9,0x8200D6FA,0x8300D6FC,0x8400D6FD,0x8500D702,0x8600D703,0x8700D704,0x8800D756, +0x8900D757,0x8A00D758,0x8B00D767,0x8C00D768,0x8D00D769,0x8E00D76A,0x000C01B2,0x000C01AF,0x000C01AC,0x9200D50D, +0x9300D513,0x9400D76B,0x9500D76C,0x9600D76D,0x9700D76E,0x9800D76F,0x9900D770,0x9A00D511,0x9B00D771,0x9C00D772, +0x9D00D773,0x9E00D774,0x9F00D515,0x000C01A9,0x000C01A6,0x000C01A3,0x000C01A0,0x000CA9FC,0x000CAFE7,0x000C019D, +0x000C019A,0x000C0197,0x000C0194,0x000C0191,0x000C018E,0x000C018B,0x000C0188,0x0014B03B,0x0014B036,0x0014B031, +0x0014B02C,0x0014B027,0x0014B022,0x8000D775,0x8100D776,0x8200D777,0x8300D778,0x8400D779,0x8500D77A,0x8600D79A, +0x8700D7BB,0x8800D7BC,0x8900D7BD,0x8A00D7BE,0x8B00D7BF,0x8C00D7C0,0x8D00D7C1,0x8E00D7C2,0x8F00D7C3,0x9000D7C4, +0x9100D7C5,0x9200D7C6,0x9300D7C7,0x9400D7C8,0x9500D7C9,0x9600D7CA,0x9700D7CB,0x9800D7CC,0x9900D7CD,0x9A00D7CE, +0x9B00D7CF,0x9C00D7D0,0x9D00D7D1,0x9E00D7D2,0x0014B01D,0xA000D7D3,0xA100D7D4,0xA200D7D5,0xA300D7D6,0xA400D7D7, +0xA500D7D8,0xA600D7D9,0xA700D7DA,0xA800D7DB,0xA900D7DC,0xAA00D7DD,0xAB00D7DE,0xAC00D7DF,0xAD00D7E0,0xAE00D7E1, +0xAF00D7E2,0xB000D7E3,0xB100D7E4,0xB200D7E5,0xB300D7E6,0xB400D7E7,0xB500D7E8,0xB600D7E9,0xB700D7EA,0xB800D7EB, +0xB900D7EC,0xBA00D7ED,0xBB00D7EE,0xBC00D7EF,0xBD00D7F0,0xBE00D7F1,0xBF00D7F2,0x0014B018,0x0014B013,0x0014B00E, +0x0014B009,0x0014B004,0x0014AFFF,0x0014AFFA,0x00223285,0x0022327D,0x00223275,0x0022326D,0x00223265,0x0022325D, +0x00223255,0x0022324D,0x00223245,0x0022323D,0x00223235,0x0022322D,0x00223225,0x0022321D,0x00223215,0x004635CE, +0x003A35C0,0x0014AFF5,0x0014AFF0,0x0014AFEB,0x0014AFE6,0x0014AFE1,0x0014AFDC,0x0014AFD7,0x0014AFD2,0x0014AFCD, +0x0014AFC8,0x0014AFC3,0x0014AFBE,0x0014AFB9,0x0014AFB4,0x0014AFAF,0x0014AFAA,0x0014AFA5,0x0014AFA0,0x0014AF9B, +0x0014AF96,0x0014AF91,0x0014AF8C,0x0014AF87,0x0014AF82,0x0014AF7D,0x0014AF78,0x0014AF73,0x0014AF6E,0x0014AF69, +0x0014AF64,0x0014AF5F,0x0014AF5A,0x0014AF55,0x0014AF50,0x0014AF4B,0x0014AF46,0x000C0185,0x000C0182,0x000C017F, +0x000CAF43,0x8000D7F3,0x8100D7F4,0x8200D7F5,0x8300D7F6,0x8400D7F7,0x8500D7F8,0x8600D589,0x8700D7F9,0x0008AD7A, +0x0008AD75,0x0008AD70,0x00089F21,0x0008AD66,0x0008AD61,0x0008AD5C,0x0008AD57,0x9000D7FA,0x9100D803,0x9200D804, +0x9300D805,0x9400D806,0x9500D807,0x9600D808,0x9700D809,0x9800D80A,0x9900D83A,0x9A00D83B,0x9B00D83C,0x9C00D83D, +0x9D00D83E,0x9E00D83F,0x9F00D840,0xA000D678,0xA100D68A,0xA200D68E,0xA300D690,0xA400D69C,0xA500D69D,0xA600D6A6, +0xA700D6AA,0xA800D6AC,0xA900D6B0,0xAA00D6B2,0xAB00D6B4,0xAC00D6B6,0xAD00D6B7,0xAE006F6F,0xAF00790F,0xB0007D9B, +0xB10086B3,0xB2008B7F,0xB300900B,0xB40099A4,0xB500A2FC,0xB600A788,0xB700B0A0,0xB800B52C,0xB900BA17,0xBA00BEA3, +0xBB00C32F,0xBC00D841,0xBD00D842,0xBE00A5A8,0x0008AD52,0x0008AD4D,0x0008AD48,0x00089F32,0x00089F30,0x00089F2E, +0x00089F2C,0x003E34D1,0x00323209,0x000CAFE2,0x000CAFD8,0x000CAFCE,0x000CAFA1,0x000CAF9C,0x000CAF92,0x000CAF8D, +0x000CAF88,0x000CAF7E,0x000C017C,0x000C0179,0x000C0176,0x000C0173,0x000C0170,0x000C016D,0x000C016A,0x000CAF51, +0x000C0167,0x000C9EC1,0x000C0164,0x000C0161,0x000C015E,0x000C015B,0x000CAF6F,0x000CAF6A,0x000CAF65,0x000CAF60, +0x000CAF5B,0x000C0158,0x00089F2A,0x00089F28,0x00089F26,0x00089F24,0x00089F22,0x0008B197,0x00089F20,0x00089F2F, +0x00089F1E,0x00089F1C,0x00089F1A,0x00089F18,0x00089F16,0x00089F14,0x00089F12,0xB700E805,0x0010AF3A,0x0010AF35, +0x00109F0E,0x00109F0A,0x00109F06,0x00109F02,0x00109EFE,0x00109EFA,0x00109EF6,0x0014AF3E,0x0014AF39,0x8000D50D, +0x8100D513,0x8200D76B,0x8300D76C,0x8400D843,0x8500C975,0x8600D844,0x8700D518,0x8800D845,0x8900D522,0x8A00D590, +0x8B00D59B,0x8C00D59A,0x8D00D591,0x8E00C7B2,0x8F00D52A,0x9000D58E,0x9100D846,0x9200D847,0x9300CA17,0x9400D848, +0x9500D849,0x9600D84A,0x9700CA1C,0x9800D84B,0x9900D84C,0x9A00D84D,0x9B00C8E8,0x9C00D84E,0x9D00D84F,0x9E00D850, +0x9F00D851,0xA000D852,0xA100D853,0xA200D854,0xA300D855,0xA400D76D,0xA500D76E,0xA600D76F,0xA700D856,0xA800D857, +0xA900D858,0xAA00D859,0xAB00D85A,0xAC00D85B,0xAD00D85C,0xAE00D85D,0xAF00D85E,0xB000D85F,0xB100D860,0xB200D861, +0xB300D862,0xB400D863,0xB500D864,0xB600D865,0xB700D866,0xB800D867,0xB900D868,0xBA00D869,0xBB00D86A,0xBC00D86B, +0xBD00D86C,0xBE00D86D,0xBF00D86E,0x0014AF34,0x00089EF4,0x000CAF31,0x00089EF2,0x000CAF2E,0x000CAE50,0x000CAE74, +0x000CA0D5,0x000E31F1,0x000CAF01,0x000CAEF8,0x000E319D,0x000CAE65,0x000CAEEF,0x000C9C9C,0x000CA0F9,0x000CAEDA, +0x000CA0F3,0x000CAEDD,0x000CA0ED,0x000E312E,0x000CA0E7,0x000CA0E1,0x000CAED4,0x000C9F37,0x000C9EEC,0x000E3143, +0x000C0155,0x000E319A,0x000C9EEF,0x000CAE6E,0x000CAEA7,0x000CA0DB,0x000CAE8C,0x000C9EE6,0x000CAE5F,0x000E3101, +0x000C9EDD,0x000E340E,0x000C0152,0x000CAE56,0x000CAE4D,0x000C014F,0x000C9EE3,0x000C9EE0,0x000CAE5C,0x000C9EDA, +0x000E3107,0x000CA0CF,0x000CA0C9,0x000CA0C3,0x000CA0BD,0x8000D870,0x8100D871,0x8200D872,0x8300D873,0x8400D874, +0x8500D875,0x8600D876,0x8700D877,0x8800D878,0x8900D879,0x8A00D87A,0x8B00D8BB,0x8C00D8BC,0x8D00D8BD,0x8E00D8BE, +0x8F00D8BF,0x9000D8C0,0x9100D8C1,0x9200D8C2,0x9300D8C3,0x9400D8C4,0x9500D8C5,0x9600D8C6,0x9700D8C7,0x9800D8C8, +0x9900D8C9,0x9A00D8CA,0x9B00D8CB,0x9C00D8CC,0x9D00D8CD,0x9E00D8CE,0x9F00D8CF,0xA000D8D0,0xA100D8D1,0xA200D8D2, +0xA300D8D3,0xA400D8D4,0xA500D8D5,0xA600D8D6,0xA700D8D7,0xA800D8D8,0xA900D8D9,0xAA00D8DA,0xAB00D8DB,0xAC00D8DC, +0xAD00D8DD,0xAE00D8DE,0xAF00D8DF,0xB000D8E0,0xB100D8E1,0xB200D8E2,0xB300D8E3,0xB400D8E4,0xB500D8E5,0xB600D8E6, +0xB700D8E7,0xB800D8E8,0xB900D8E9,0xBA00D8EA,0xBB00D8EB,0xBC00D8EC,0xBD00D8ED,0xBE00D8EE,0x8000D96E,0x8100D96F, +0x8200D970,0x8300D971,0x8400D972,0x8500D973,0x8600D974,0x8700D975,0x8800D976,0x8900D977,0x8A00D978,0x8B00D979, +0x8C00D97A,0x8D00D97B,0x8E00D97C,0x8F00D97D,0x9000D97E,0x9100D97F,0x9200D980,0x9300D981,0x9400D982,0x9500D983, +0x9600D984,0x9700D985,0x9800D986,0x9900D987,0x9A00D988,0x9B00D989,0x9C00D98A,0x9D00D98B,0x9E00D98C,0x9F00D98D, +0xA000D98E,0xA100D98F,0xA200D990,0xA300D991,0xA400D992,0xA500D993,0xA600D994,0xA700D995,0xA800D996,0xA900D997, +0xAA00D998,0xAB00D999,0xAC00D99A,0xAD00D99B,0xAE00D99C,0xAF00D99D,0xB000D99E,0xB100D99F,0xB200D9A0,0xB300D9A1, +0xB400D9A2,0xB500D9A3,0xB600D9A4,0xB700D9A5,0xB800D9A6,0xB900D9A7,0xBA00D9A8,0xBB00D9A9,0xBC00D9AA,0xBD00D9AB, +0xBE00D9AC,0xBF00D9AD,0x003E34C2,0x003231FD,0x003E34B3,0x0024AF25,0x003E34A4,0x0024AF1C,0x0024AF13,0x004A35AE, +0x003231F1,0x0024AF0A,0x0024AF01,0x0024AEF8,0x003231E5,0x003231D9,0x003231CD,0x003231C1,0x003231B5,0x003231A9, +0x0032319D,0x004A359C,0x001A3495,0x004A358A,0x004A3578,0x003E3495,0x00323566,0x004A3566,0x004A3554,0x00323191, +0x0024AEEF,0x0024AEE6,0x00323185,0x00323179,0x003E3486,0x003E3477,0x0024AEDD,0x0026354B,0x0032316D,0x0024AED4, +0x0024AECB,0x001A3417,0x00189EEC,0x0024AEC2,0x0024AEB9,0x004A3542,0x00323161,0x003E3468,0x004A3530,0x00323155, +0x0024AEB0,0x0024AEA7,0x004A351E,0x00323149,0x004A350C,0x0024AE9E,0x003E3459,0x0024AE95,0x0032313D,0x0024AE8C, +0x00323131,0x003E344A,0x00323125,0x003E343B,0x00323119,0x00189EE6,0x8000D9EE,0x8100D9EF,0x8200D9F0,0x8300D9F1, +0x8400D9F2,0x8500D9F3,0x8600D9F4,0x8700D9F5,0x8800D9F6,0x8900D9F7,0x8A00D9F8,0x8B00D9F9,0x8C00D9FA,0x8D00D9FB, +0x8E00D9FC,0x8F00D9FD,0x9000D9FE,0x9100D9FF,0x9200DA00,0x9300DA01,0x9400DA02,0x9500DA03,0x9600DA04,0x9700DA05, +0x9800DA06,0x9900DA07,0x9A00DA08,0x9B00DA09,0x9C00DA0A,0x9D00DA0B,0x9E00DA0C,0x9F00DA0D,0xA000DA0E,0xA100DA0F, +0xA200DA10,0xA300DA11,0xA400DA12,0xA500DA13,0xA600DA14,0xA700DA15,0xA800DA16,0xA900DA17,0xAA00DA18,0xAB00DA19, +0xAC00DA1A,0xAD00DA1B,0xAE00DA1C,0xAF00DA1D,0xB000DA1E,0xB100DA1F,0xB200DA20,0xB300DA21,0xB400DA22,0xB500DA23, +0xB600DA24,0xB700DA25,0xB800DA26,0xB900DA27,0xBA00DA28,0xBB00DA29,0xBC00DA2A,0xBD00DA2B,0xBE00DA2C,0xBF00DA2D, +0x003E342C,0x0024AE83,0x0024AE7A,0x0032310D,0x0024AE71,0x0024AE68,0x0024AE5F,0x003E341D,0x00323101,0x001A34FA, +0x004A34FA,0x0026340E,0x003E340E,0x0032357E,0x003230F5,0x0024AE56,0x0024AE4D,0x003230E9,0x00189EE0,0x003230DD, +0x003E33FF,0x00189EDA,0x004A34E8,0x0026349B,0x0010AE17,0x0010AE12,0x0010AE0D,0x0010AE08,0x0010AE03,0x0010AE30, +0x0010AE2B,0x0010AE26,0x0010AE21,0x0010AE1C,0x0014AE48,0x0014AE43,0x0014AE3E,0x0014AE39,0x0014AE34,0x0014AE2F, +0x0014AE2A,0x0014AE25,0x0014AE20,0x0014AE1B,0x0014AE16,0x0014AE11,0x0014AE0C,0x0014AE07,0x0014AE02,0x000CADFF, +0x00089ED8,0x00089ED6,0x000CADFC,0x00089ED4,0x00089ED2,0x0008ADF6,0x000CADF9,0x000CADF6,0x00089ED0,0x00189ECA, +0x00189EC4,0x00189EBE,0x00189EB8,0x003230D1,0x8000DA6E,0x8100DA6F,0x8200DA70,0x8300DA71,0x8400DA72,0x8500DA73, +0x8600DA74,0x8700DA75,0x8800DA76,0x8900DA77,0x8A00DA78,0x8B00DA79,0x8C00DA7A,0x8D00DA7B,0x8E00DA7C,0x8F00DA7D, +0x9000DA7E,0x9100DA7F,0x9200DA80,0x9300DA81,0x9400DA82,0x9500DA83,0x9600DA84,0x9700DA85,0x9800DA86,0x9900DA87, +0x9A00DA88,0x9B00DA89,0x9C00DA8A,0x9D00DA8B,0x9E00DA8C,0x9F00DA8D,0xA000DA8E,0xA100DA8F,0xA200DA90,0xA300DA91, +0xA400DA92,0xA500DA93,0xA600DA94,0xA700DA95,0xA800DA96,0xA900DA97,0xAA00DA98,0xAB00DA99,0xAC00DA9A,0xAD00DA9B, +0xAE00DA9C,0xAF00DA9D,0xB000DA9E,0xB100DA9F,0xB200DAA0,0xB300DAA1,0xB400DAA2,0xB500DAA3,0xB600DAA4,0xB700DAA5, +0xB800DAA6,0xB900DAA7,0xBA00DAA8,0xBB00DAA9,0xBC00DAAA,0xBD00DAAB,0xBE00DAAC,0xBF00DAAD,0x00089EB6,0x00089EB4, +0x000C9EB1,0x00089EAF,0x00089EAD,0x00089EAB,0x00089EA9,0x00089EA7,0x000E30CE,0x001230CD,0x00089EA5,0x00089EA3, +0x000C9EA0,0x000C9E9D,0x00089E9B,0x000A30C1,0x0008ADEB,0x000CADF3,0x000CADF0,0x000CADED,0x000CADEA,0x000C9E98, +0x00089E96,0x00089E94,0x00089E92,0x00089E90,0x00089E8E,0x000C9E8B,0x0008ADDE,0x0008ADDB,0x0008ADD8,0x000CADE7, +0x000CADE4,0x0008ADE2,0x000CADE1,0x000CADDE,0x000CADDB,0x0008ADD9,0x000CADD8,0x001630C7,0x001A30C7,0x0008ADD0, +0x000CADD5,0x000CADD2,0x000CADCF,0x000E34E0,0x001E34E0,0x002234E0,0x00089E89,0x00089E87,0x000C9E84,0x00089E82, +0x00089E80,0x00089E7E,0x000C9E7B,0x0008ADBA,0x00089E79,0x00089E77,0x00089E75,0x00089E73,0x000C9E70,0x00089E6E, +0x00089E6C,0x00089E6A,0x8000DAEE,0x8100DAEF,0x8200DAF0,0x8300DAF1,0x8400DAF2,0x8500DAF3,0x8600DAF4,0x8700DAF5, +0x8800DAF6,0x8900DAF7,0x8A00DAF8,0x8B00DAF9,0x8C00DAFA,0x8D00DAFB,0x8E00DAFC,0x8F00DAFD,0x9000DAFE,0x9100DAFF, +0x9200DB00,0x9300DB01,0x9400DB02,0x9500DB03,0x9600DB04,0x9700DB05,0x9800DB06,0x9900DB07,0x9A00DB08,0x9B00DB09, +0x9C00DB0A,0x9D00DB0B,0x9E00DB0C,0x9F00DB0D,0xA000DB0E,0xA100DB0F,0xA200DB10,0xA300DB11,0xA400DB12,0xA500DB13, +0xA600DB14,0xA700DB15,0xA800DB16,0xA900DB17,0xAA00DB18,0xAB00DB19,0xAC00DB1A,0xAD00DB1B,0xAE00DB1C,0xAF00DB1D, +0xB000DB1E,0xB100DB1F,0xB200DB20,0xB300DB21,0xB400DB22,0xB500DB23,0xB600DB24,0xB700DB25,0xB800DB26,0xB900DB27, +0xBA00DB28,0xBB00DB29,0xBC00DB2A,0xBD00DB2B,0xBE00DB2C,0xBF00DB2D,0x000C9E67,0x000C9E64,0x001230C3,0x00089E62, +0x00089E60,0x00089E5E,0x001A30BD,0x000CADCC,0x00089E5C,0x00089E5A,0x00089E58,0x00089E56,0x00089E54,0x00089E52, +0x00089E50,0x00089E4E,0x00089E95,0x00089E4C,0x000CADC9,0x00089E4A,0x00089E48,0x000CADC6,0x000CADC3,0x00089E46, +0x001230B9,0x000CADC0,0x00089E44,0x00089E42,0x00089E40,0x00089E3E,0x0014ADBB,0x0014ADB6,0x0010AD49,0x0010AD76, +0x0010AD71,0x0010AD6C,0x0010AD67,0x0010AD62,0x0010AD5D,0x0010AD58,0x0010AD53,0x0014ADB1,0x0014ADAC,0x0014ADA7, +0x0014ADA2,0x0014AD9D,0x0014AD98,0x0014AD93,0x0014AD8E,0x0014AD89,0x0014AD84,0x0014AD7F,0x0014AD7A,0x0014AD75, +0x0014AD70,0x0014AD6B,0x0014AD66,0x0014AD61,0x0014AD5C,0x0014AD57,0x0014AD52,0x0014AD4D,0x0014AD48,0x000CAD45, +0x0008014D,0x0008014B,0x000C0148,0x00080146,0x00080144,0x000C0141,0x000C013E,0x0008013C,0x000C0139,0x8600E70A, +0x0008AD3F,0x0008AD43,0x0008AD40,0x000CAD42,0x000CAD3F,0x00089E3C,0x00109E38,0x00109E34,0x00109E30,0x00109E2C, +0x00109E28,0x00080137,0x0008A08B,0x0008A03F,0x00089E26,0x00080135,0x9A00DAB2,0x0008A04F,0x0008A04B,0x9D00D068, +0x00109E24,0x9F00DAB6,0x9C00DB2E,0x9D00DB2F,0x9C00DB33,0x9D00DB34,0x9E00DB35,0x9F00DB36,0x00080133,0x00080131, +0x0008012F,0x0008012D,0x0008012B,0x00080129,0x00080127,0xAD00DAB4,0x00080125,0x00080123,0xB0006F79,0xB1006FB9, +0xB2007037,0xB30070B7,0xB4007137,0xB50071B7,0xB6007237,0xB70072B7,0xB8007337,0xB90073B7,0xBA007437,0xBB0074B7, +0xBC007537,0xBD0075B7,0xBE007637,0xBF0076B7,0xB800DB31,0xB900DB32,0xA400C757,0xA500C7A8,0xA600C828,0xA700C8A8, +0xA800C928,0xA900C9A8,0xAA00CA28,0xAB00CAA8,0xAC00DB37,0xAD00DB76,0xAE00DBB6,0xAF00DBD5,0xB000DC15,0xB100DC7A, +0xB200DCFA,0xB300DD76,0xB400DDB6,0xB500DDE4,0xB600DE31,0xB700DEB1,0xB800DEBE,0xB900DF31,0xBA00DF71,0xBB00DFB1, +0xBC00DFED,0xBD00E02E,0xBE00E07D,0xBF00E0BD,0x00080121,0x0008011F,0x0008011D,0x0008011B,0x00080119,0x00080117, +0x00080115,0x00080113,0x00080111,0x0008010F,0x0008010D,0x0008010B,0x00080109,0x00080107,0x00080105,0x00080103, +0x0008A674,0x00080101,0x0008A670,0x000800FF,0x00089F8C,0x0008AD25,0x0008AD1F,0x000800FD,0x000800FB,0x000800F9, +0x0008AD19,0x00089CFE,0x0018AD39,0x0018AD33,0x0018AD2D,0x0018AD27,0x0018AD21,0x0018AD1B,0x0018AD15,0x0018AD0F, +0x000A3093,0x0018AD09,0x0018AD03,0x0018ACFD,0x0018ACF7,0x00109E20,0xFF000000,0x8000DB38,0x8100DB39,0x8200DB3A, +0x8300DB3B,0x8400DB3C,0x8500DB3D,0x8600DB3D,0x0010AA8D,0x0010AB4D,0x00109E1C,0x00109E18,0x00109E14,0x0010AB41, +0x0010AC97,0x0010AB35,0x0010AB29,0x00109E10,0x00109E0C,0x00109E08,0x9300DB3E,0x9400DB3F,0x9500DB40,0x9600DB41, +0x9700DB42,0x00109E04,0x00109E00,0x00109DFC,0x0010AAA5,0x0010AAB3,0x9D00CB05,0x8D00E80E,0x9F00CB07,0xA000DB43, +0xA100D313,0xA200D318,0xA300DB44,0xA400DB45,0xA500DB46,0xA600DB47,0xA700DB49,0xA800DB4A,0xA900D2E3,0xAA00CB08, +0xAB00CB09,0xAC00CB0A,0xAD00CB0B,0xAE00CB0C,0xAF00CB0D,0xB000CB0E,0xB100CB0F,0xB200CB10,0xB300CB1E,0xB400CB24, +0xB500CB26,0xB600CB27,0x0010AA9F,0xB800CB42,0xB900CB43,0xBA00CB44,0xBB00CB45,0xBC00CB46,0x0010AB79,0xBE00CB47, +0x8000CB4A,0x8100CB4D,0x0010AB97,0x8300CB57,0x8400CB58,0x00109DF8,0x8600CB59,0x8700CB5A,0x8800CB5B,0x8900CB5C, +0x8A00CB5D,0x8B00CB5E,0x8C00CB5F,0x8D00CB60,0x8E00CB61,0x8F00DB4C,0x9000DB54,0x9100DB54,0x9200DB55,0x9300DB55, +0x9400DB55,0x9500DB55,0x9600DB56,0x9700DB56,0x9800DB56,0x9900DB56,0x9A00DB57,0x9B00DB57,0x9C00DB57,0x9D00DB57, +0x9E00DB58,0x9F00DB58,0xA000DB58,0xA100DB58,0xA200DB59,0xA300DB59,0xA400DB59,0xA500DB59,0xA600DB5A,0xA700DB5A, +0xA800DB5A,0xA900DB5A,0xAA00DB5C,0xAB00DB5C,0xAC00DB5C,0xAD00DB5C,0xAE00DB5D,0xAF00DB5D,0xB000DB5D,0xB100DB5D, +0xB200DB8C,0xB300DB8C,0xB400DB8C,0xB500DB8C,0xB600DB8D,0xB700DB8D,0xB800DB8D,0xB900DB8D,0xBA00DB8E,0xBB00DB8E, +0xBC00DB8E,0xBD00DB8E,0xBE00DB8F,0xBF00DB8F,0x8000DB8F,0x8100DB8F,0x8200DB90,0x8300DB90,0x8400DB91,0x8500DB91, +0x8600DB92,0x8700DB92,0x8800DB93,0x8900DB93,0x8A00DB94,0x8B00DB94,0x8C00DB95,0x8D00DB95,0x8E00DB96,0x8F00DB96, +0x9000DB96,0x9100DB96,0x9200DB97,0x9300DB97,0x9400DB97,0x9500DB97,0x9600DB98,0x9700DB98,0x9800DB98,0x9900DB98, +0x9A00DB99,0x9B00DB99,0x9C00DB99,0x9D00DB99,0x9E00DB9A,0x9F00DB9A,0xA000DB9B,0xA100DB9B,0xA200DB9B,0xA300DB9B, +0xA4006A4F,0xA5006A4F,0xA600DB9C,0xA700DB9C,0xA800DB9C,0xA900DB9C,0xAA00DB9D,0xAB00DB9D,0xAC00DB9D,0xAD00DB9D, +0xAE00DB9E,0xAF00DB9E,0xB0006A57,0xB1006A57,0x9300DB9F,0x9400DB9F,0x9500DB9F,0x9600DB9F,0x9700DBA0,0x9800DBA0, +0x9900DBA1,0x9A00DBA1,0x9B00DBA2,0x9C00DBA2,0x9D00D023,0x9E00DBA3,0x9F00DBA3,0xA000DBA4,0xA100DBA4,0xA200DBA5, +0xA300DBA5,0xA400DBA6,0xA500DBA6,0xA600DBA6,0xA700DBA6,0xA800DBA7,0xA900DBA7,0xAA00DBA8,0xAB00DBA8,0xAC00DBA9, +0xAD00DBA9,0xAE00DBAA,0xAF00DBAA,0xB000DBAB,0xB100DBAB,0xB200DBAC,0xB300DBAC,0xB400DBAD,0xB500DBAD,0xB600DBAE, +0xB700DBAE,0xB800DBAE,0xB900DBAF,0xBA00DBAF,0xBB00DBAF,0xBC00DBB0,0xBD00DBB0,0xBE00DBB0,0xBF00DBB0,0x8000DBB1, +0x8100DBB2,0x8200DBB3,0x8300DBAF,0x8400DBB4,0x8500DBB5,0x8600DBBE,0x8700DBBF,0x8800DBC0,0x8900DBC1,0x8A00DBC2, +0x8B00DBC3,0x8C00DBC4,0x8D00DBC5,0x8E00DBC6,0x8F00DBC7,0x9000DBC8,0x9100DBC9,0x9200DBCF,0x9300DBD0,0x9400DBD1, +0x9500DBD2,0x9600DBD3,0x9700DBEE,0x9800DBF4,0x9900DBF8,0x9A00DBFB,0x9B00DCD5,0x9C00DCD6,0x9D00DCD7,0x9E00DCD8, +0x9F00DCD9,0xA000DCDA,0xA100DCDB,0xA200DCDC,0xA300DCDD,0xA400DCDE,0xA500DCDF,0xA600DCE0,0xA700DCE1,0xA800DCE2, +0xA900DCE3,0xAA00DCE4,0xAB00DCE5,0xAC00DCE6,0xAD00DCE7,0xAE00DCE8,0xAF00DCE9,0xB000DCEA,0xB100DCEB,0xB200DCEC, +0xB300DCED,0xB400DCEE,0xB500DCEF,0xB600DCF0,0xB700DCF1,0xB800DCF2,0xB900DCF3,0xBA00DCF4,0xBB00DCF5,0xBC00DCF6, +0xBD00DCF7,0xBE00DCF8,0xBF00DCF9,0x0010AB8D,0x0010AC5B,0x0010AC67,0x0010AA87,0x0010AC49,0x0010AB0B,0x0010AC3D, +0x00109DF4,0x0010AAFF,0x0010AC19,0x00109DF0,0x00109DEC,0x0010AC07,0x00109DE8,0x0010AC01,0x0010AAC9,0x00109DE4, +0x0010ABE9,0x00109DE0,0x00109DDC,0x0010ABE3,0x0010AA93,0x00109DD8,0x00109DD4,0x00109DD0,0x0010AAD5,0x00109DCC, +0x00109DC8,0x00109DC4,0x00109DC0,0x00109DBC,0x00109DB8,0x00109DB4,0x0010AAAB,0x00109DB0,0x00109DAC,0x0010AAB1, +0x8000DD3A,0x8100DD3B,0x8200DD3C,0x8300DD3D,0x8400DD3E,0x8500DD3F,0x8600DD40,0x8700DD41,0x8800DD42,0x8900DD43, +0x8A00DD44,0x8B00DD45,0x8C00DD46,0x8D00DD47,0x8E00DD48,0x8F00DD49,0x9000DD4A,0x9100DD4B,0x9200DD4C,0x9300DD4D, +0x9400DD4E,0x9500DD4F,0x9600DD50,0x9700DD51,0x9800DD52,0x9900DD53,0x9A00DD54,0x9B00DD55,0x9C00DD56,0x9D00DD57, +0x9E00DD58,0x9F00DD59,0xA000DD5A,0xA100DD5B,0xA200DD5C,0xA300DD5D,0xA400DD5E,0xA500DD5F,0xA600DBB3,0xA700DD60, +0xA800DBAF,0xA900DBB4,0xAA00DD61,0xAB00DD62,0xAC00DBC0,0xAD00DD63,0xAE00DBC1,0xAF00DBC2,0xB000DD64,0xB100DD65, +0xB200DBC6,0xB300DD66,0xB400DBC7,0xB500DBC8,0xB600DD67,0xB700DD68,0xB800DBCF,0xB900DD69,0xBA00DBD0,0xBB00DBD1, +0xBC00DCEB,0xBD00DCEC,0xBE00DCEF,0xBF00DCF0,0x0010ABC5,0x0010ABB9,0x0010AAF3,0x001235F0,0x00123600,0x0010AA99, +0x0010ABA7,0x0010AAB7,0x0010AAAD,0x0010AB19,0x0010AA95,0x0010AA81,0x0010AACF,0x00109DA8,0x0010AB59,0x00109DA4, +0x0010ACCB,0x00109DA0,0x0010AB7D,0x00109D9C,0x00109D4E,0x0010AAA3,0x0010AA9D,0x00109D98,0x0010AA97,0x00109D94, +0x0010AADF,0x00109D90,0x00109D8C,0x00109D88,0x0014ACF2,0x0014ACED,0x0014ACE8,0x0014ACE3,0x0014ACDE,0x0014ACD9, +0x0018ACD3,0x0018ACCD,0x0018ACC7,0x001230B5,0x00109D84,0x00109D80,0x00109D7C,0x00109D78,0x00109D74,0x00109D70, +0x00109D6C,0x00109D68,0x00109D64,0x00109D60,0x00109D5C,0x00109D58,0x00109D54,0x00109D50,0x0010AABB,0x0018ACC1, +0x0018ACBB,0x00109D4C,0x00109D48,0x00109D44,0xA900E725,0x001235EA,0x00109D40,0x00109D3C,0x8000DCF1,0x8100DCF5, +0x8200DCF6,0x8300DCF7,0x8400DCF8,0x8500DD3C,0x8600DD3D,0x8700DD3E,0x8800DD6A,0x8900DD42,0x8A00DD6B,0x8B00DD6C, +0x8C00DD48,0x8D00DD6D,0x8E00DD49,0x8F00DD4A,0x9000DD57,0x9100DD6E,0x9200DD6F,0x9300DD52,0x9400DD70,0x9500DD53, +0x9600DD54,0x9700DBB1,0x9800DBB2,0x9900DD71,0x9A00DBB3,0x9B00DD72,0x9C00DBB5,0x9D00DBBE,0x9E00DBBF,0x9F00DBC0, +0xA000DD73,0xA100DBC3,0xA200DBC4,0xA300DBC5,0xA400DBC6,0xA500DD74,0xA600DBCF,0xA700DBD2,0xA800DBD3,0xA900DBEE, +0xAA00DBF4,0xAB00DBF8,0xAC00DCD5,0xAD00DCD6,0xAE00DCD7,0xAF00DCD8,0xB000DCD9,0xB100DCDA,0xB200DD75,0xB300DCDB, +0xB400DCDC,0xB500DCDD,0xB600DCDE,0xB700DCDF,0xB800DCE0,0xB900DCE2,0xBA00DCE3,0xBB00DCE4,0xBC00DCE5,0xBD00DCE6, +0xBE00DCE7,0xBF00DCE8,0x00123602,0x00109D38,0x00109D34,0x0010AC25,0x00109D30,0x0018ACB5,0x0018ACAF,0x0018ACA9, +0x00109D2C,0x00109D28,0x00109D24,0x00109D20,0x00109D1C,0x00109D18,0x00109D14,0x00109D10,0x00109D0C,0x00109D08, +0x0010AB1F,0x0010AA8F,0x0010AB43,0x0010AA83,0x0010AB13,0x0010AA89,0x00109D04,0x00109D00,0x00109CFC,0x00109CF8, +0x0010AC31,0x0010AB05,0x00109CF4,0x00109CF0,0x00109CEC,0x00109CE8,0x00109CE4,0x00109CE0,0x0018ACA3,0x0018AC9D, +0x0018AC97,0x0018AC91,0x0018AC8B,0x0018AC85,0xB400E805,0x0018AC7F,0x0018AC79,0x0018AC73,0x0018AC6D,0x0018AC67, +0x0018AC61,0x0018AC5B,0x0018AC55,0x0018AC4F,0x0018AC49,0x0018AC43,0x0018AC3D,0x0018AC37,0x0018AC31,0x0018AC2B, +0x0018AC25,0x0018AC1F,0x8000DCE9,0x8100DCEA,0x8200DCED,0x8300DCEE,0x8400DCF2,0x8500DCF3,0x8600DCF4,0x8700DCF5, +0x8800DCF6,0x8900DCF9,0x8A00DD3A,0x8B00DD3B,0x8C00DD3C,0x8D00DD77,0x8E00DD3F,0x8F00DD40,0x9000DD41,0x9100DD42, +0x9200DD45,0x9300DD46,0x9400DD47,0x9500DD48,0x9600DD78,0x9700DD4B,0x9800DD4C,0x9900DD79,0x9A00DD4F,0x9B00DD50, +0x9C00DD51,0x9D00DD52,0x9E00DDBA,0x9F00DBB3,0xA000DD72,0xA100DBC0,0xA200DD73,0xA300DBC6,0xA400DD74,0xA500DBCF, +0xA600DDBB,0xA700DCD9,0xA800DDBC,0xA900DDBD,0xAA00DDBE,0xAB00DCF5,0xAC00DCF6,0xAD00DD3C,0xAE00DD48,0xAF00DD78, +0xB000DD52,0xB100DDBA,0xB200DDBF,0xB300DDC0,0xB400DDC1,0xB500DDC2,0xB600DDC3,0xB700DDC4,0xB800DDC5,0xB900DDC6, +0xBA00DDC7,0xBB00DDC8,0xBC00DDC9,0xBD00DDCA,0xBE00DDCB,0xBF00DDCC,0x8000DDCD,0x8100DDCE,0x8200DDCF,0x8300DDD0, +0x8400DDD1,0x8500DDD2,0x8600DDD3,0x8700DDD4,0x8800DDD5,0x8900DDD6,0x8A00DDD7,0x8B00DDD8,0x8C00DDBD,0x8D00DDD9, +0x8E00DDDA,0x8F00DDDB,0x9000DDDC,0x9100DDC2,0x9200DDC3,0x9300DDC4,0x9400DDC5,0x9500DDC6,0x9600DDC7,0x9700DDC8, +0x9800DDC9,0x9900DDCA,0x9A00DDCB,0x9B00DDCC,0x9C00DDCD,0x9D00DDCE,0x9E00DDCF,0x9F00DDD0,0xA000DDD1,0xA100DDD2, +0xA200DDD3,0xA300DDD4,0xA400DDD5,0xA500DDD6,0xA600DDD7,0xA700DDD8,0xA800DDBD,0xA900DDD9,0xAA00DDDA,0xAB00DDDB, +0xAC00DDDC,0xAD00DDD6,0xAE00DDD7,0xAF00DDD8,0xB000DDBD,0xB100DDBC,0xB200DDBE,0xB300DCE1,0xB400DCD6,0xB500DCD7, +0xB600DCD8,0xB700DDD6,0xB800DDD7,0xB900DDD8,0xBA00DCE1,0xBB00DCE2,0xBC00DDDD,0xBD00DDDD,0x9000DDDE,0x9100DDDF, +0x9200DDDF,0x9300DDE0,0x9400DDE1,0x9500DDE2,0x9600DDE3,0x9700DDE5,0x9800DDE6,0x9900DDE6,0x9A00DDE7,0x9B00DDE8, +0x9C00DDE9,0x9D00DDEA,0x9E00DDEB,0x9F00DDEC,0xA000DDEC,0xA100DDED,0xA200DDEE,0xA300DDEE,0xA400DDEF,0xA500DDEF, +0xA600DDF0,0xA700DDF1,0xA800DDF1,0xA900DDF2,0xAA00DDF3,0xAB00DDF3,0xAC00DDF4,0xAD00DDF4,0xAE00DDF5,0xAF00DEA4, +0xB000DEA4,0xB100DEA5,0xB200DEA5,0xB300DEA6,0xB400DEA7,0xB500DEA8,0xB600DEA9,0xB700DEA9,0xB800DEAA,0xB900DEAB, +0xBA00DEAC,0xBB00DEAD,0xBC00DEAE,0xBD00DEAE,0xBE00DEAF,0xBF00DEB0,0x0018AC19,0x0018AC13,0x0018AC0D,0x0018AC07, +0x0018AC01,0x001A30A5,0x0018ABFB,0x0018ABF5,0x0018ABEF,0x0018ABE9,0x0018ABE3,0x0018ABDD,0x0018ABD7,0x8000DEC1, +0x8100DEC2,0x8200DEF1,0x8300DEF2,0x8400DEF2,0x8500DEF3,0x8600DEF3,0x8700DEF4,0x8800DEF4,0x8900DEF5,0x8A00DEF6, +0x8B00DEF7,0x8C00DEF8,0x8D00DEF9,0x8E00DEFA,0x8F00DEFB,0x0018ABD1,0x0018ABCB,0x9200DEFC,0x9300DEFD,0x9400DEFE, +0x9500DEFF,0x9600DF00,0x9700DF01,0x9800DF01,0x9900DF02,0x9A00DF03,0x9B00DF04,0x9C00DF05,0x9D00DF05,0x9E00DF06, +0x9F00DF07,0xA000DF08,0xA100DF09,0xA200DF0A,0xA300DF0B,0xA400DF0C,0xA500DF0D,0xA600DF0E,0xA700DF0F,0xA800DF10, +0xA900DF11,0xAA00DF12,0xAB00DF13,0xAC00DF14,0xAD00DF15,0xAE00DF16,0xAF00DF17,0xB000DF18,0xB100DF19,0xB200DF1A, +0xB300DF1B,0xB400DEAF,0xB500DEC1,0xB600DF1C,0xB700DF1D,0xB800DF1E,0xB900DF1F,0xBA00DF20,0xBB00DF21,0xBC00DF20, +0xBD00DF1E,0xBE00DF22,0xBF00DF23,0x0018ABC5,0x0018ABBF,0x0018ABB9,0x0018ABB3,0x0018ABAD,0x001A30A9,0x0018ABA7, +0x0018ABA1,0x0018AB85,0x0018AB95,0x0018AB8F,0x0018AB89,0x0018AB83,0x0018AB7D,0x0018AB77,0x0018AB71,0x0018AB6B, +0x0018AB65,0x0018AB5F,0x0018AB59,0x0018AAD9,0x0018AB4D,0x0018AB47,0x0018AB41,0x0018AB3B,0x0018AB35,0x0018AB2F, +0x0018AB29,0x0018AB23,0x0018AB1D,0x0018AB17,0x0018AB11,0x0018AB0B,0x0018AB05,0x0018AAFF,0x0018AAF9,0x0018AAF3, +0x0018AAED,0x0018AAE7,0x0018AAE1,0x0018AADB,0x0018AAD5,0x0018AACF,0x0018AAC9,0x0018AAC3,0x0018AABD,0x0018AAB7, +0x0018AAB1,0x0018AAAB,0x0018AAA5,0x0018AA9F,0x0018AA99,0x0018AA93,0x0018AA8D,0x0018AA87,0x0018AA81,0x0018AA7B, +0x0018AA75,0x002235F5,0x002230B1,0x002230A9,0x002230A1,0x00223099,0x002235FE,0x8000DF24,0x8100DF25,0x8200DF26, +0x8300DF21,0x8400DEA8,0x8500DDF0,0x8600DF27,0x8700DF28,0x00223607,0x001A35EE,0x008635EE,0x003E35DF,0x00223091, +0x00049CBB,0x000C00F6,0x000C00F3,0x0004B043,0x00049F5F,0x00049F5E,0x000C00F0,0x000C00ED,0x000C00EA,0x000C00E7, +0x000400E6,0x000400E5,0x000400E4,0x000CA9BA,0x000CA9C0,0x000C00E1,0x9000DF3E,0x9100DF3F,0x9200DF40,0x9300DF41, +0x940069C3,0x9500DF42,0x9600DF43,0x9700DF44,0x9800DF45,0x9900D2A8,0x000C00DE,0x000C00DB,0x000C00D8,0x000C00D5, +0x000C00D2,0x000C00CF,0x000C00CC,0x000400CB,0x000400CA,0xB000DF29,0xB100DF2A,0xB200DF2B,0xB300DF2C,0xB400DF2D, +0xB500DF2E,0xB600DF2F,0xB700DF30,0xB800DF39,0xB900DF3A,0xBA00DF3B,0xBB00DF3C,0xBC00DF3D,0xB000D294,0xB100DF46, +0xB200DF47,0xB300DF48,0xB400DF48,0xB500D2E7,0xB600D2E9,0xB700DF49,0xB800DF4A,0xB900DF4B,0xBA00DF4C,0xBB00DF4D, +0xBC00DF58,0xBD00DF59,0xBE00DF5A,0xBF006F01,0x000400C9,0x000400C8,0x000400C7,0x000400C6,0x0004A227,0x0004A224, +0x000400C5,0x000400C4,0x000400C3,0x000400C2,0x000C9CDD,0x00109CD9,0x000CACF2,0x000CACED,0x000CACE8,0x0010ACB5, +0x000CACE3,0x0010ACAF,0x000CACDE,0x0010ACA9,0x000CACD9,0x00109CD5,0x000C9CD2,0x00109CCE,0x000800C0,0x00089CE0, +0x00089D4C,0x000800BE,0x00089D48,0x00089D38,0x00089DA2,0x00089DBE,0x00089CF6,0x000A30AF,0x00089D90,0x00089CE6, +0x00089D52,0x00089CEC,0x00089CF0,0x00089CE8,0x00089CE4,0x00089D28,0x00089DE8,0x00089D20,0x00089D18,0x00089DD4, +0x00089DC8,0x00089DAC,0x00089DB6,0x00089D64,0x00089D40,0x80006F02,0x8100DF5B,0x8200DF5C,0x8300DF5D,0x8400DF5E, +0x00089D32,0x00089F90,0x8700DF5F,0x8800DF60,0x8900D2C6,0x8A00D2C6,0x8B00D2C6,0x8C00D2C6,0x8D00DF48,0x8E00DF48, +0x8F00DF48,0x9000DF3E,0x9100DF3F,0x9200D28D,0x00089CFA,0x940069C3,0x9500DF41,0x9600DF43,0x9700DF42,0x9800DF46, +0x9900D2E7,0x9A00D2E9,0x9B00DF49,0x9C00DF4A,0x9D00DF4B,0x9E00DF4C,0x9F00DF7E,0xA000DF7F,0xA100DF80,0xA200D2E3, +0xA300DF81,0xA400DF82,0xA500DF83,0xA600D2E6,0x0018AA6F,0xA800DF84,0xA900DF85,0xAA00DF86,0xAB00DF87,0x0018AA69, +0x0018AA63,0x0010AA63,0x000400BD,0xB000DF88,0xB100DF89,0xB200DF8A,0x000400BC,0xB400DF8B,0x0004B131,0xB600DF8C, +0xB700DF8D,0xB800DF8E,0xB900DF8F,0xBA00DF90,0xBB00DF91,0xBC00DF92,0xBD00DF93,0xBE00DF94,0xBF00DF95,0x8000DF96, +0x81006A3B,0x82006A3B,0x83006A43,0x84006A43,0x85006A44,0x86006A44,0x87006A47,0x88006A47,0x89006A48,0x8A006A48, +0x8B006A48,0x8C006A48,0x8D00DF97,0x8E00DF97,0x8F00DF98,0x9000DF98,0x9100DF98,0x9200DF98,0x9300DF99,0x9400DF99, +0x9500DF9A,0x9600DF9A,0x9700DF9A,0x9800DF9A,0x9900DF9B,0x9A00DF9B,0x9B00DF9B,0x9C00DF9B,0x9D00DF9C,0x9E00DF9C, +0x9F00DF9C,0xA000DF9C,0xA100DF9D,0xA200DF9D,0xA300DF9D,0xA400DF9D,0xA500DF9E,0xA600DF9E,0xA700DF9E,0xA800DF9E, +0xA900DF9F,0xAA00DF9F,0xAB00DFA0,0xAC00DFA0,0xAD00DFA1,0xAE00DFA1,0xAF00DFA2,0xB000DFA2,0xB100DFA3,0xB200DFA3, +0xB300DFA3,0xB400DFA3,0xB500DFA4,0xB600DFA4,0xB700DFA4,0xB800DFA4,0xB900DFA5,0xBA00DFA5,0xBB00DFA5,0xBC00DFA5, +0xBD00DFA6,0xBE00DFA6,0xBF00DFA6,0x8000DFA6,0x8100DFA7,0x8200DFA7,0x8300DFA7,0x8400DFA7,0x8500DFA8,0x8600DFA8, +0x8700DFA8,0x8800DFA8,0x8900DFA9,0x8A00DFA9,0x8B00DFA9,0x8C00DFA9,0x8D00DFAA,0x8E00DFAA,0x8F00DFAA,0x9000DFAA, +0x9100DFAB,0x9200DFAB,0x9300DFAB,0x9400DFAB,0x9500DFAC,0x9600DFAC,0x9700DFAC,0x9800DFAC,0x9900DFAD,0x9A00DFAD, +0x9B00DFAD,0x9C00DFAD,0x9D00DFAE,0x9E00DFAE,0x9F00DFAE,0xA000DFAE,0xA100DFAF,0xA200DFAF,0xA300DFAF,0xA400DFAF, +0xA500DFB0,0xA600DFB0,0xA700DFB0,0xA800DFB0,0xA900DFB6,0xAA00DFB6,0xAB00DFB6,0xAC00DFB6,0xAD00DFB7,0xAE00DFB7, +0xAF00DBA7,0xB000DBA7,0xB100DFC4,0xB200DFC4,0xB300DFC4,0xB400DFC4,0xB500DFD8,0xB600DFD8,0xB700DFDD,0xB800DFDD, +0xB900DFDE,0xBA00DFDE,0xBB00DFDF,0xBC00DFDF,0x8100DF42,0x8200DFE0,0x8300DF7E,0x8400DF85,0x8500DF86,0x8600DF7F, +0x8700DFE4,0x8800D2E7,0x8900D2E9,0x8A00DF80,0x8B00D2E3,0x8C00DF3E,0x8D00DF81,0x8E00D28D,0x8F00DFE6,0x9000D2CE, +0x9100CF8E,0x9200CF89,0x9300CF8A,0x9400D2CF,0x9500D2D0,0x9600D2D1,0x9700D2D2,0x9800D2DE,0x9900D2E1,0x9A00DF41, +0x9B0069C3,0x9C00DF82,0x9D00D2E6,0x9E00DF83,0x9F00DF43,0xA000DF87,0xA100D0B3,0xA200D0C5,0xA300D2FC,0xA400D0C6, +0xA500D0DE,0xA600D312,0xA700D0E7,0xA800D0F1,0xA900D0F3,0xAA00D0F7,0xAB006E89,0xAC00D0F8,0xAD00D0F9,0xAE00D0FF, +0xAF00D10B,0xB000D10D,0xB100D30B,0xB200D10E,0xB300D4BC,0xB400D10F,0xB500D117,0xB600D38C,0xB700D11A,0xB800D396, +0xB900D4BD,0xBA00D310,0xBB00DF5F,0xBC00DF84,0xBD00DF60,0xBE00E0AD,0xBF00DF48,0x000400BB,0x80006E7C,0x8100CF87, +0x8200D11E,0x8300D159,0x8400D126,0x8500D12D,0x8600D15C,0x8700D135,0x8800CFC5,0x8900D156,0x8A00CFC8,0x8B00D137, +0x8C00CFF0,0x8D00D13C,0x8E00D2EB,0x8F00CF8F,0x9000D14A,0x9100D4BE,0x9200CFCA,0x9300CF99,0x9400D14B,0x9500D14C, +0x9600D150,0x9700CFCF,0x9800CFF2,0x9900CFD0,0x9A00D1C7,0x9B00DF49,0x9C00E0EE,0x9D00DF4A,0x9E00E0EF,0x9F00E0F0, +0xA000E0F1,0xA100DF40,0xA200DF5B,0xA300DF5C,0xA400DF3F,0xA500E0F2,0xA600D8EE,0xA700E0F3,0xA800E0F4,0xA900E0F5, +0xAA00E0F6,0xAB00E0F7,0xAC00E0F8,0xAD00E0F9,0xAE00E0FA,0xAF00E0FB,0xB000E0FC,0xB100D8C0,0xB200D8C1,0xB300D8C2, +0xB400D8C3,0xB500D8C4,0xB600D8C5,0xB700D8C6,0xB800D8C7,0xB900D8C8,0xBA00D8C9,0xBB00D8CA,0xBC00D8CB,0xBD00D8CC, +0xBE00D8CD,0xBF00D8CE,0x000400BA,0x000400B9,0x000C00B6,0x000C00B3,0x000C00B0,0x000E3206,0x000E314C,0x000C00AD, +0x000E3518,0x000CAF16,0x000C00AA,0x000E31A0,0x000E3426,0x000CAE6B,0x000CAE59,0x8000D8CF,0x8100D8D0,0x8200D8D1, +0x8300D8D2,0x8400D8D3,0x8500D8D4,0x8600D8D5,0x8700D8D6,0x8800D8D7,0x8900D8D8,0x8A00D8D9,0x8B00D8DA,0x8C00D8DB, +0x8D00D8DC,0x8E00D8DD,0x8F00D8DE,0x9000D8DF,0x9100D8E0,0x9200D8E1,0x9300D8E2,0x9400D8E3,0x9500D8E4,0x9600D8E5, +0x9700D8E6,0x9800D8E7,0x9900D8E8,0x9A00D8E9,0x9B00D8EA,0x9C00D8EB,0x9D00E13C,0x9E00E13D,0x9F00E13E,0xA000D6D2, +0xA100D678,0xA200D688,0xA300D689,0xA400D68A,0xA500D68C,0xA600D68D,0xA700D68E,0xA800D68F,0xA900D690,0xAA00D691, +0xAB00D694,0xAC00D697,0xAD00D698,0xAE00D699,0xAF00D69A,0xB000D69B,0xB100D69C,0xB200D69D,0xB300D69F,0xB400D6A4, +0xB500D6A6,0xB600D6A8,0xB700D6AA,0xB800D6AC,0xB900D6AE,0xBA00D6B0,0xBB00D6B2,0xBC00D6B4,0xBD00D6B6,0xBE00D6B7, +0x000C9EE9,0x000C9F45,0x000C9F41,0x8200D6B8,0x8300D6B9,0x8400D6BA,0x8500D6BB,0x8600D6BC,0x8700D6BD,0x000800A8, +0x000800A6,0x8A00D6BE,0x8B00D6BF,0x8C00D6C0,0x8D00D6C1,0x8E00D6C2,0x8F00D6C3,0x000800A4,0x000800A2,0x9200D6C4, +0x9300D6C5,0x9400D6C6,0x9500D6C8,0x9600D6CA,0x9700D6CB,0x000800A0,0x000C009D,0x9A00D6CD,0x9B00D6CF,0x9C00D6D1, +0x000C009A,0x000CA27D,0x000C0097,0xA000E145,0xA100E146,0xA200E14D,0xA300CF88,0xA400E14E,0xA500E155,0xA600E156, +0x000CA278,0xA800E15A,0xA900E15B,0xAA00E15C,0xAB00E164,0xAC00E16C,0xAD00E16D,0xAE00E16E,0x000C0094,0x000C0091, +0x000C008E,0x9100CAE2,0x0008008C,0x0008008A,0x0008A304,0x00080088,0x00080086,0x0008A2F8,0x00080084,0x0008A2F0, +0x0008A2C9,0x00080082,0x00080080,0x9D00E0FE,0x9E00E22C,0x9F00E5C5,0x0008007E,0x0008007C,0x0008007A,0x0008A28A, +0x0008A296,0x8500CAE4,0x8600CAD8,0x8700CB1D,0x00080078,0x00080076,0x00080074,0x00080072,0x000C006F,0x0008A314, +0x0008006D,0xAF00CB06,0x9000E11E,0x9100E15E,0x9200E19E,0x9300E1DE,0x9400E21E,0x9500E25D,0x9600E29D,0x9700E2DD, +0x9800E31D,0x9900E35D,0x9A00E39D,0x9B00E3DD,0x9C00E41D,0x9D00E45D,0x9E00E49D,0x9F00E4DD,0x8000D0B3,0x8100D0C5, +0x8200D2FC,0x8300D0C6,0x8400D0DE,0x8500D312,0x8600D0E7,0x8700D0F1,0x8800D0F3,0x8900D0F7,0x8A006E89,0x8B00D0F8, +0x8C00D0F9,0x8D00D0FF,0x8E00D10B,0x8F00D10D,0x9000D30B,0x9100D10E,0x9200D4BC,0x9300D10F,0x9400D117,0x9500D38C, +0x9600D11A,0x9700D396,0x9800D4BD,0x9900D310,0x9A00CF87,0x9B00D11E,0x9C00D159,0x9D00D126,0x9E00D12D,0x9F00D15C, +0xA000D135,0xA100CFC5,0xA200D156,0xA300CFC8,0xA400D137,0xA500CFF0,0xA600D13C,0xA700D2EB,0xA800CF8F,0xA900D14A, +0xAA00D4BE,0xAB00CFCA,0xAC00CF99,0xAD00D14B,0xAE00D14C,0xAF00D150,0xB000CFCF,0xB100CFF2,0xB200CFD0,0xB300D1C7, +0xB400D0B3,0xB500D0C5,0xB600D2FC,0xB700D0C6,0xB800D0DE,0xB900D312,0xBA00D0E7,0xBB00D0F1,0xBC00D0F3,0xBD00D0F7, +0xBE006E89,0xBF00D0F8,0x8000D0F9,0x8100D0FF,0x8200D10B,0x8300D10D,0x8400D30B,0x8500D10E,0x8600D4BC,0x8700D10F, +0x8800D117,0x8900D38C,0x8A00D11A,0x8B00D396,0x8C00D4BD,0x8D00D310,0x8E00CF87,0x8F00D11E,0x9000D159,0x9100D126, +0x9200D12D,0x9300D15C,0x9400D135,0x0008A2FC,0x9600D156,0x9700CFC8,0x9800D137,0x9900CFF0,0x9A00D13C,0x9B00D2EB, +0x9C00CF8F,0x9D00D14A,0x9E00D4BE,0x9F00CFCA,0xA000CF99,0xA100D14B,0xA200D14C,0xA300D150,0xA400CFCF,0xA500CFF2, +0xA600CFD0,0xA700D1C7,0xA800D0B3,0xA900D0C5,0xAA00D2FC,0xAB00D0C6,0xAC00D0DE,0xAD00D312,0xAE00D0E7,0xAF00D0F1, +0xB000D0F3,0xB100D0F7,0xB2006E89,0xB300D0F8,0xB400D0F9,0xB500D0FF,0xB600D10B,0xB700D10D,0xB800D30B,0xB900D10E, +0xBA00D4BC,0xBB00D10F,0xBC00D117,0xBD00D38C,0xBE00D11A,0xBF00D396,0x8000D4BD,0x8100D310,0x8200CF87,0x8300D11E, +0x8400D159,0x8500D126,0x8600D12D,0x8700D15C,0x8800D135,0x8900CFC5,0x8A00D156,0x8B00CFC8,0x8C00D137,0x8D00CFF0, +0x8E00D13C,0x8F00D2EB,0x9000CF8F,0x9100D14A,0x9200D4BE,0x9300CFCA,0x9400CF99,0x9500D14B,0x9600D14C,0x9700D150, +0x9800CFCF,0x9900CFF2,0x9A00CFD0,0x9B00D1C7,0x9C00D0B3,0x0008006B,0x9E00D2FC,0x9F00D0C6,0x00080069,0x00080067, +0xA200D0E7,0x0008A324,0x00080065,0xA500D0F7,0xA6006E89,0x00080063,0x0008A2A6,0xA900D0FF,0xAA00D10B,0xAB00D10D, +0xAC00D30B,0x00080061,0xAE00D4BC,0xAF00D10F,0xB000D117,0xB100D38C,0xB200D11A,0xB300D396,0xB400D4BD,0xB500D310, +0xB600CF87,0xB700D11E,0xB800D159,0xB900D126,0x0008A28E,0xBB00D15C,0x000C005E,0xBD00CFC5,0xBE00D156,0xBF00CFC8, +0x8000D137,0x8100CFF0,0x8200D13C,0x8300D2EB,0x0008005C,0x8500D14A,0x8600D4BE,0x8700CFCA,0x8800CF99,0x8900D14B, +0x8A00D14C,0x8B00D150,0x8C00CFCF,0x8D00CFF2,0x8E00CFD0,0x8F00D1C7,0x9000D0B3,0x9100D0C5,0x9200D2FC,0x9300D0C6, +0x9400D0DE,0x9500D312,0x9600D0E7,0x9700D0F1,0x9800D0F3,0x9900D0F7,0x9A006E89,0x9B00D0F8,0x9C00D0F9,0x9D00D0FF, +0x9E00D10B,0x9F00D10D,0xA000D30B,0xA100D10E,0xA200D4BC,0xA300D10F,0xA400D117,0xA500D38C,0xA600D11A,0xA700D396, +0xA800D4BD,0xA900D310,0xAA00CF87,0xAB00D11E,0xAC00D159,0xAD00D126,0xAE00D12D,0xAF00D15C,0xB000D135,0xB100CFC5, +0xB200D156,0xB300CFC8,0xB400D137,0xB500CFF0,0xB600D13C,0xB700D2EB,0xB800CF8F,0xB900D14A,0xBA00D4BE,0xBB00CFCA, +0xBC00CF99,0xBD00D14B,0xBE00D14C,0xBF00D150,0x8000CFCF,0x8100CFF2,0x8200CFD0,0x8300D1C7,0x8400D0B3,0x8500D0C5, +0x0008005A,0x8700D0C6,0x8800D0DE,0x8900D312,0x8A00D0E7,0x00080058,0x00080056,0x8D00D0F7,0x8E006E89,0x8F00D0F8, +0x9000D0F9,0x9100D0FF,0x9200D10B,0x9300D10D,0x9400D30B,0x00080054,0x9600D4BC,0x9700D10F,0x9800D117,0x9900D38C, +0x9A00D11A,0x9B00D396,0x9C00D4BD,0x0008B095,0x9E00CF87,0x9F00D11E,0xA000D159,0xA100D126,0xA200D12D,0xA300D15C, +0xA400D135,0xA500CFC5,0xA600D156,0xA700CFC8,0xA800D137,0xA900CFF0,0xAA00D13C,0xAB00D2EB,0xAC00CF8F,0xAD00D14A, +0xAE00D4BE,0xAF00CFCA,0xB000CF99,0xB100D14B,0xB200D14C,0xB300D150,0xB400CFCF,0xB500CFF2,0xB600CFD0,0xB700D1C7, +0xB800D0B3,0xB900D0C5,0x00089CCC,0xBB00D0C6,0xBC00D0DE,0xBD00D312,0xBE00D0E7,0x8000D0F3,0x8100D0F7,0x82006E89, +0x8300D0F8,0x8400D0F9,0x00089CCA,0x8600D10B,0xB800E51D,0xB900E54E,0xBA00E58D,0x8A00D4BC,0x8B00D10F,0x8C00D117, +0x8D00D38C,0x8E00D11A,0x8F00D396,0x9000D4BD,0x00089CC8,0x9200CF87,0x9300D11E,0x9400D159,0x9500D126,0x9600D12D, +0x9700D15C,0x9800D135,0x9900CFC5,0x9A00D156,0x9B00CFC8,0x9C00D137,0x9D00CFF0,0x9E00D13C,0x9F00D2EB,0xA000CF8F, +0xA100D14A,0xA200D4BE,0xA300CFCA,0xA400CF99,0xA500D14B,0xA600D14C,0xA700D150,0xA800CFCF,0xA900CFF2,0xAA00CFD0, +0xAB00D1C7,0xAC00D0B3,0xAD00D0C5,0xAE00D2FC,0xAF00D0C6,0xB000D0DE,0xB100D312,0xB200D0E7,0xB300D0F1,0xB400D0F3, +0xB500D0F7,0xB6006E89,0xB700D0F8,0xB800D0F9,0xB900D0FF,0xBA00D10B,0xBB00D10D,0xBC00D30B,0xBD00D10E,0xBE00D4BC, +0xBF00D10F,0x8000D117,0x8100D38C,0x8200D11A,0x8300D396,0x8400D4BD,0x8500D310,0x8600CF87,0x8700D11E,0x8800D159, +0x8900D126,0x8A00D12D,0x8B00D15C,0x8C00D135,0x8D00CFC5,0x8E00D156,0x8F00CFC8,0x9000D137,0x9100CFF0,0x9200D13C, +0x9300D2EB,0x9400CF8F,0x9500D14A,0x9600D4BE,0x9700CFCA,0x9800CF99,0x9900D14B,0x9A00D14C,0x9B00D150,0x9C00CFCF, +0x9D00CFF2,0x9E00CFD0,0x9F00D1C7,0xA000D0B3,0xA100D0C5,0xA200D2FC,0xA300D0C6,0xA400D0DE,0xA500D312,0xA600D0E7, +0xA700D0F1,0xA800D0F3,0xA900D0F7,0xAA006E89,0xAB00D0F8,0xAC00D0F9,0xAD00D0FF,0xAE00D10B,0xAF00D10D,0xB000D30B, +0xB100D10E,0xB200D4BC,0xB300D10F,0xB400D117,0xB500D38C,0xB600D11A,0xB700D396,0xB800D4BD,0xB900D310,0xBA00CF87, +0xBB00D11E,0xBC00D159,0xBD00D126,0xBE00D12D,0xBF00D15C,0x8000D135,0x8100CFC5,0x8200D156,0x8300CFC8,0x8400D137, +0x8500CFF0,0x8600D13C,0x8700D2EB,0x8800CF8F,0x8900D14A,0x8A00D4BE,0x8B00CFCA,0x8C00CF99,0x8D00D14B,0x8E00D14C, +0x8F00D150,0x9000CFCF,0x9100CFF2,0x9200CFD0,0x9300D1C7,0x9400D0B3,0x9500D0C5,0x9600D2FC,0x9700D0C6,0x9800D0DE, +0x9900D312,0x9A00D0E7,0x9B00D0F1,0x9C00D0F3,0x9D00D0F7,0x9E006E89,0x9F00D0F8,0xA000D0F9,0xA100D0FF,0xA200D10B, +0xA300D10D,0xA400D30B,0xA500D10E,0xA600D4BC,0xA700D10F,0xA800D117,0xA900D38C,0xAA00D11A,0xAB00D396,0xAC00D4BD, +0xAD00D310,0xAE00CF87,0xAF00D11E,0xB000D159,0xB100D126,0xB200D12D,0xB300D15C,0xB400D135,0xB500CFC5,0xB600D156, +0xB700CFC8,0xB800D137,0xB900CFF0,0xBA00D13C,0xBB00D2EB,0xBC00CF8F,0xBD00D14A,0xBE00D4BE,0xBF00CFCA,0x8000CF99, +0x8100D14B,0x8200D14C,0x8300D150,0x8400CFCF,0x8500CFF2,0x8600CFD0,0x8700D1C7,0x8800D0B3,0x8900D0C5,0x8A00D2FC, +0x8B00D0C6,0x8C00D0DE,0x8D00D312,0x8E00D0E7,0x8F00D0F1,0x9000D0F3,0x9100D0F7,0x92006E89,0x9300D0F8,0x9400D0F9, +0x9500D0FF,0x9600D10B,0x9700D10D,0x9800D30B,0x9900D10E,0x9A00D4BC,0x9B00D10F,0x9C00D117,0x9D00D38C,0x9E00D11A, +0x9F00D396,0xA000D4BD,0xA100D310,0xA200CF87,0xA300D11E,0xA400D159,0xA500D126,0xA600D12D,0xA700D15C,0xA800D135, +0xA900CFC5,0xAA00D156,0xAB00CFC8,0xAC00D137,0xAD00CFF0,0xAE00D13C,0xAF00D2EB,0xB000CF8F,0xB100D14A,0xB200D4BE, +0xB300CFCA,0xB400CF99,0xB500D14B,0xB600D14C,0xB700D150,0xB800CFCF,0xB900CFF2,0xBA00CFD0,0xBB00D1C7,0xBC00D0B3, +0xBD00D0C5,0xBE00D2FC,0xBF00D0C6,0x8000D0DE,0x8100D312,0x8200D0E7,0x8300D0F1,0x8400D0F3,0x8500D0F7,0x86006E89, +0x8700D0F8,0x8800D0F9,0x8900D0FF,0x8A00D10B,0x8B00D10D,0x8C00D30B,0x8D00D10E,0x8E00D4BC,0x8F00D10F,0x9000D117, +0x9100D38C,0x9200D11A,0x9300D396,0x9400D4BD,0x9500D310,0x9600CF87,0x9700D11E,0x9800D159,0x9900D126,0x9A00D12D, +0x9B00D15C,0x9C00D135,0x9D00CFC5,0x9E00D156,0x9F00CFC8,0xA000D137,0xA100CFF0,0xA200D13C,0xA300D2EB,0xA400CF8F, +0xA500D14A,0xA600D4BE,0xA700CFCA,0xA800CF99,0xA900D14B,0xAA00D14C,0xAB00D150,0xAC00CFCF,0xAD00CFF2,0xAE00CFD0, +0xAF00D1C7,0xB000D0B3,0xB100D0C5,0xB200D2FC,0xB300D0C6,0xB400D0DE,0xB500D312,0xB600D0E7,0xB700D0F1,0xB800D0F3, +0xB900D0F7,0xBA006E89,0xBB00D0F8,0xBC00D0F9,0xBD00D0FF,0xBE00D10B,0xBF00D10D,0x8000D30B,0x8100D10E,0x8200D4BC, +0x8300D10F,0x8400D117,0x8500D38C,0x8600D11A,0x8700D396,0x8800D4BD,0x8900D310,0x8A00CF87,0x8B00D11E,0x8C00D159, +0x8D00D126,0x8E00D12D,0x8F00D15C,0x9000D135,0x9100CFC5,0x9200D156,0x9300CFC8,0x9400D137,0x9500CFF0,0x9600D13C, +0x9700D2EB,0x9800CF8F,0x9900D14A,0x9A00D4BE,0x9B00CFCA,0x9C00CF99,0x9D00D14B,0x9E00D14C,0x9F00D150,0xA000CFCF, +0xA100CFF2,0xA200CFD0,0xA300D1C7,0xA400E170,0xA500E171,0x00089CC6,0x00089CC4,0xA800E172,0xA900E173,0xAA00D335, +0xAB00E174,0xAC00E175,0xAD00E176,0xAE00E177,0xAF00D006,0xB000E178,0xB100E179,0xB200E17A,0xB300E17E,0xB400E17F, +0xB500E180,0xB600E181,0xB700D343,0xB800E182,0xB900D006,0xBA00D00C,0xBB00E186,0xBC00CFFC,0xBD00E187,0xBE00E188, +0xBF00E189,0x80006E88,0x8100E18A,0x8200E18B,0x8300CFFA,0x8400D153,0x8500D154,0x8600D007,0x8700E18C,0x8800E1F3, +0x8900CFFB,0x8A006E57,0x8B00D003,0x8C00E23B,0x8D00CF8C,0x8E00E23E,0x8F00E23F,0x9000E241,0x9100D002,0x9200D004, +0x9300D005,0x9400E242,0x9500E245,0x9600E246,0x9700CFFD,0x9800D155,0x9900E24B,0x9A00E258,0x9B00E25A,0x9C00D007, +0x9D00CFFB,0x9E00D003,0x9F00CFFD,0xA000D004,0xA100D002,0xA200E172,0xA300E173,0xA400D335,0xA500E174,0xA600E175, +0xA700E176,0xA800E177,0xA900D006,0xAA00E178,0xAB00E179,0xAC00E17A,0xAD00E17E,0xAE00E17F,0xAF00E180,0xB000E181, +0xB100D343,0xB200E182,0xB300D006,0xB400D00C,0xB500E186,0xB600CFFC,0xB700E187,0xB800E188,0xB900E189,0xBA006E88, +0xBB00E18A,0xBC00E18B,0xBD00CFFA,0xBE00D153,0xBF00D154,0x8000D007,0x8100E18C,0x8200E1F3,0x8300CFFB,0x84006E57, +0x8500D003,0x8600E23B,0x8700CF8C,0x8800E23E,0x8900E23F,0x8A00E241,0x8B00D002,0x8C00D004,0x8D00D005,0x8E00E242, +0x8F00E245,0x9000E246,0x9100CFFD,0x9200D155,0x9300E24B,0x9400E258,0x9500E25A,0x9600D007,0x9700CFFB,0x9800D003, +0x9900CFFD,0x9A00D004,0x9B00D002,0x9C00E172,0x9D00E173,0x9E00D335,0x9F00E174,0xA000E175,0xA100E176,0xA200E177, +0xA300D006,0xA400E178,0xA500E179,0xA600E17A,0xA700E17E,0xA800E17F,0xA900E180,0xAA00E181,0xAB00D343,0xAC00E182, +0xAD00D006,0xAE00D00C,0xAF00E186,0xB000CFFC,0xB100E187,0xB200E188,0xB300E189,0xB4006E88,0xB500E18A,0xB600E18B, +0xB700CFFA,0xB800D153,0xB900D154,0xBA00D007,0xBB00E18C,0xBC00E1F3,0xBD00CFFB,0xBE006E57,0xBF00D003,0x8000E23B, +0x8100CF8C,0x8200E23E,0x8300E23F,0x8400E241,0x8500D002,0x8600D004,0x8700D005,0x8800E242,0x8900E245,0x8A00E246, +0x8B00CFFD,0x8C00D155,0x8D00E24B,0x8E00E258,0x8F00E25A,0x9000D007,0x9100CFFB,0x9200D003,0x9300CFFD,0x9400D004, +0x9500D002,0x9600E172,0x9700E173,0x9800D335,0x9900E174,0x9A00E175,0x9B00E176,0x9C00E177,0x9D00D006,0x9E00E178, +0x9F00E179,0xA000E17A,0xA100E17E,0xA200E17F,0xA300E180,0xA400E181,0xA500D343,0xA600E182,0xA700D006,0xA800D00C, +0xA900E186,0xAA00CFFC,0xAB00E187,0xAC00E188,0xAD00E189,0xAE006E88,0xAF00E18A,0xB000E18B,0xB100CFFA,0xB200D153, +0xB300D154,0xB400D007,0xB500E18C,0xB600E1F3,0xB700CFFB,0xB8006E57,0xB900D003,0xBA00E23B,0xBB00CF8C,0xBC00E23E, +0xBD00E23F,0xBE00E241,0xBF00D002,0x8000D004,0x8100D005,0x8200E242,0x8300E245,0x8400E246,0x8500CFFD,0x8600D155, +0x8700E24B,0x8800E258,0x8900E25A,0x8A00D007,0x8B00CFFB,0x8C00D003,0x8D00CFFD,0x8E00D004,0x8F00D002,0x9000E172, +0x9100E173,0x9200D335,0x9300E174,0x9400E175,0x9500E176,0x9600E177,0x9700D006,0x9800E178,0x9900E179,0x9A00E17A, +0x9B00E17E,0x9C00E17F,0x9D00E180,0x9E00E181,0x9F00D343,0xA000E182,0xA100D006,0xA200D00C,0xA300E186,0xA400CFFC, +0xA500E187,0xA600E188,0xA700E189,0xA8006E88,0xA900E18A,0xAA00E18B,0xAB00CFFA,0xAC00D153,0xAD00D154,0xAE00D007, +0xAF00E18C,0xB000E1F3,0xB100CFFB,0xB2006E57,0xB300D003,0xB400E23B,0xB500CF8C,0xB600E23E,0xB700E23F,0xB800E241, +0xB900D002,0xBA00D004,0xBB00D005,0xBC00E242,0xBD00E245,0xBE00E246,0xBF00CFFD,0x8000D155,0x8100E24B,0x8200E258, +0x8300E25A,0x8400D007,0x8500CFFB,0x8600D003,0x8700CFFD,0x8800D004,0x8900D002,0x8A00E262,0x8B00E2A4,0x00089CC2, +0x00089CC0,0x8E00D2CE,0x8F00CF8E,0x9000CF89,0x9100CF8A,0x9200D2CF,0x9300D2D0,0x9400D2D1,0x9500D2D2,0x9600D2DE, +0x9700D2E1,0x9800D2CE,0x9900CF8E,0x9A00CF89,0x9B00CF8A,0x9C00D2CF,0x9D00D2D0,0x9E00D2D1,0x9F00D2D2,0xA000D2DE, +0xA100D2E1,0xA200D2CE,0xA300CF8E,0xA400CF89,0xA500CF8A,0xA600D2CF,0xA700D2D0,0xA800D2D1,0xA900D2D2,0xAA00D2DE, +0xAB00D2E1,0xAC00D2CE,0xAD00CF8E,0xAE00CF89,0xAF00CF8A,0xB000D2CF,0xB100D2D0,0xB200D2D1,0xB300D2D2,0xB400D2DE, +0xB500D2E1,0xB600D2CE,0xB700CF8E,0xB800CF89,0xB900CF8A,0xBA00D2CF,0xBB00D2D0,0xBC00D2D1,0xBD00D2D2,0xBE00D2DE, +0xBF00D2E1,0x8000DF97,0x8100DF98,0x8200DF9C,0x8300DF9F,0x00089CBE,0x8500DFB7,0x8600DFA2,0x8700DF9D,0x8800DFA7, +0x8900DFC4,0x8A00DFAD,0x8B00DFAE,0x8C00DFAF,0x8D00DFB0,0x8E00DFA3,0x8F00DFA9,0x9000DFAB,0x9100DFA5,0x9200DFAC, +0x9300DFA1,0x9400DFA4,0x9500DF9A,0x9600DF9B,0x9700DF9E,0x9800DFA0,0x9900DFA6,0x9A00DFA8,0x9B00DFAA,0x9C00E2A9, +0x9D00DB9A,0x9E00E2AA,0x9F00E2B3,0x00089CBC,0xA100DF98,0xA200DF9C,0x00089CBA,0xA400DFB6,0x000CAA60,0x000CAA5D, +0xA700DF9D,0x9000E6A1,0xA900DFC4,0xAA00DFAD,0xAB00DFAE,0xAC00DFAF,0xAD00DFB0,0xAE00DFA3,0xAF00DFA9,0xB000DFAB, +0xB100DFA5,0xB200DFAC,0x8200DF9C,0xB400DFA4,0xB500DF9A,0xB600DF9B,0xB700DF9E,0x8700DF9D,0xB900DFA6,0x8900DFC4, +0xBB00DFAA,0x8B00DFAE,0x000CAA5A,0x8D00DFB0,0x8E00DFA3,0x8F00DFA9,0x000CAA57,0x9100DFA5,0x9200DFAC,0x000CAA54, +0x9400DFA4,0x000CAA51,0x000CAA4E,0x9700DF9E,0x000CAA4B,0x9900DFA6,0x000CAA48,0x9B00DFAA,0x000CAA45,0x9D00DB9A, +0x000CAA42,0x9F00E2B3,0x000CAA3F,0xA100DF98,0xA200DF9C,0x000CAA3C,0xA400DFB6,0x000CAA39,0x000CAA36,0xA700DF9D, +0xA800DFA7,0xA900DFC4,0xAA00DFAD,0x000CAA33,0xAC00DFAF,0xAD00DFB0,0xAE00DFA3,0xAF00DFA9,0xB000DFAB,0xB100DFA5, +0xB200DFAC,0x000CAA30,0xB400DFA4,0xB500DF9A,0xB600DF9B,0xB700DF9E,0x000CAA2D,0xB900DFA6,0xBA00DFA8,0xBB00DFAA, +0xBC00E2A9,0x000CAA2A,0xBE00E2AA,0x8000DF97,0x8100DF98,0x8200DF9C,0x8300DF9F,0x8400DFB6,0x8500DFB7,0x8600DFA2, +0x8700DF9D,0x8800DFA7,0x8900DFC4,0x000CAA27,0x8B00DFAE,0x8C00DFAF,0x8D00DFB0,0x8E00DFA3,0x8F00DFA9,0x9000DFAB, +0x9100DFA5,0x9200DFAC,0x9300DFA1,0x9400DFA4,0x9500DF9A,0x9600DF9B,0x9700DF9E,0x9800DFA0,0x9900DFA6,0x9A00DFA8, +0x9B00DFAA,0x000CAA24,0x000CAA21,0x000CAA1E,0x000CAA1B,0x000CAA18,0xA100DF98,0xA200DF9C,0xA300DF9F,0x000CAA15, +0xA500DFB7,0xA600DFA2,0xA700DF9D,0xA800DFA7,0xA900DFC4,0x001CAA0E,0xAB00DFAE,0xAC00DFAF,0xAD00DFB0,0xAE00DFA3, +0xAF00DFA9,0xB000DFAB,0xB100DFA5,0xB200DFAC,0xB300DFA1,0xB400DFA4,0xB500DF9A,0xB600DF9B,0xB700DF9E,0xB800DFA0, +0xB900DFA6,0xBA00DFA8,0xBB00DFAA,0x8400E5CF,0x8500E60F,0x8600E535,0x00089CB8,0x8800E62E,0x8900E670,0x8000E2BB, +0x8100E2D8,0x8200E2E2,0x8300E2EE,0x8400E443,0x8500E444,0x8600E569,0x8700E56A,0x8800E5A1,0x8900E5BD,0x8A00E5C0, +0x00089CB6,0x00089CB4,0x00089CB2,0x00089CB0,0x000CAA0B,0x9000E5C2,0x9100E5C3,0x9200E5DA,0x9300E5DE,0x9400E5E1, +0x9500E5E3,0x9600E5E4,0x9700E5E6,0x9800E5E8,0x9900E5EA,0x9A00E5EC,0x9B00E5EE,0x9C00E5F1,0x9D00E5F3,0x9E00E5F4, +0x9F00E5F9,0xA000E601,0xA100E606,0xA200E60B,0xA300E617,0xA400E629,0xA500E62A,0xA600E62B,0xA700E62C,0xA800E62D, +0xA900E631,0xAA00E637,0xAB00D2FC,0xAC00D10E,0xAD00E64C,0xAE00E65A,0x00089CAE,0xB000D0B3,0xB100D0C5,0xB200D2FC, +0xB300D0C6,0xB400D0DE,0xB500D312,0xB600D0E7,0xB700D0F1,0xB800D0F3,0xB900D0F7,0xBA006E89,0xBB00D0F8,0xBC00D0F9, +0xBD00D0FF,0xBE00D10B,0xBF00D10D,0x8000D30B,0x8100D10E,0x8200D4BC,0x8300D10F,0x8400D117,0x8500D38C,0x8600D11A, +0x8700D396,0x8800D4BD,0x8900D310,0x8A00E65B,0x8B00DAA7,0x8C00E65C,0x8D00E65D,0x8E00E65E,0x8F00E67E,0x00089CAC, +0x00089CAA,0x00089CA8,0x00189CA2,0x00189C9C,0x000C0051,0x000C004E,0x000C004B,0x000C0048,0x000C0045,0x000C0042, +0x000C003F,0x000C003C,0x000C0039,0x000C0036,0x8000E6A2,0x8100E6A3,0x8200D8CA,0x000C0033,0x000C0030,0x000C002D, +0x000C002A,0x000C0027,0x000C0024,0x000C0021,0x000C001E,0xAA00E69F,0xAB00E6A0,0x000C001B,0x000CA9D8,0x000C0018, +0x9000D546,0x9100E6A4,0x9200E6A5,0x93006F45,0x9400D513,0x9500CC75,0x9600E6A6,0x9700D773,0x9800E6A7,0x9900E6A8, +0x9A00E6A9,0x9B00C923,0x9C00E6AA,0x9D00E6AB,0x9E00CBFA,0x9F00E6AC,0xA000E6AD,0xA100E6B1,0xA200D5A9,0xA300E6B2, +0xA400E6B3,0xA500E6B4,0xA600E6B5,0xA700E6B6,0xA800E6B7,0xA900D50D,0xAA00D76B,0xAB00E6B8,0xAC00D856,0xAD00D76E, +0xAE00D857,0xAF00E6BB,0xB000D61A,0xB100E6BC,0xB200E6BD,0xB300E6EA,0xB400E6EB,0xB500E6EC,0xB600D847,0xB700D590, +0xB800E6ED,0xB900CC06,0xBA00E6EE,0xBB00E6EF,0x000C0015,0x000C0012,0x000C000F,0x000C000C,0x000C0009,0x000C0006, +0x8000E6F9,0x8100E6FA,0x8200E6FB,0x8300E6FC,0x8400E6FD,0x8500E6FE,0x8600E6FF,0x8700E702,0x8800E703,0x0024AA02, +0x0024A9F9,0x0024A9F0,0x0024A9E7,0x0024A9DE,0x0024A9D5,0x0024A9CC,0x9000E704,0x9100E705,0x0024A9C3,0x0024A9BA, +0x000C0003,0x000C0000,0xCC00E6AE,0xCD00E6F0,0x000000E6,0x000000E8,0x000000DC,0x000000D8,0xD200E69B,0x000000CA, +0x00000001,0x000000F0,0xD600E710,0xD700E752,0xD800E74A,0xD900E75D,0x000000E9,0xDB00E770,0xDC00E772,0xDD00E7B2, +0x000000EA,0xDF00E792,0xE000E7A6,0xE100E847,0xE200E906,0xE300E844,0x8300E708,0x8400E708,0x8500E708,0x8600E708, +0x8700E708,0x000000DE,0xEA00E945,0x000000E4,0x0000000A,0x0000000B,0x0000000C,0xEF00E936,0xF000E9A2,0x0000000D, +0x0000000E,0x0000000F,0x8000E708,0x8100E708,0x8200E708,0x8300E708,0x8400E708,0x8500E708,0x8600E708,0x8700E708, +0x8800E708,0x8900E708,0x8A00E708,0x8B00E708,0x8C00E708,0x8D00E708,0x8E00E708,0x8F00E708,0x9000E708,0x9100E708, +0x9200E708,0x9300E708,0x9400E708,0x9500E709,0x9600E70A,0x9700E70A,0x9800E70A,0x9900E70A,0x9A00E709,0x9B00E70B, +0x9C00E70A,0x9D00E70A,0x9E00E70A,0x9F00E70A,0xA000E70A,0xA100E70D,0xA200E70D,0xA300E70A,0xA400E70A,0xA500E70A, +0xA600E70A,0xA700E70D,0xA800E70D,0xA900E70A,0xAA00E70A,0xAB00E70A,0xAC00E70A,0xAD00E70A,0xAE00E70A,0xAF00E70A, +0xB000E70A,0xB100E70A,0xB200E70A,0xB300E70A,0xB400E70E,0xB500E70E,0xB600E70E,0xB700E70E,0xB800E70E,0xB900E70A, +0xBA00E70A,0xBB00E70A,0xBC00E70A,0xBD00E708,0xBE00E708,0xBF00E708,0x00000010,0x00000011,0x8000E708,0x8100E708, +0x8200E708,0x8300E708,0x8400E708,0x8500E70F,0x8600E708,0x8700E70A,0x8800E70A,0x8900E70A,0x8A00E708,0x8B00E708, +0x8C00E708,0x8D00E70A,0x8E00E70A,0x00000012,0x9000E708,0x9100E708,0x9200E708,0x9300E70A,0x9400E70A,0x9500E70A, +0x9600E70A,0x9700E708,0x9800E709,0x9900E70A,0x9A00E70A,0x9B00E708,0x9C00E714,0x9D00E718,0x9E00E718,0x9F00E714, +0xA000E718,0xA100E718,0xA200E714,0xA300E708,0xA400E708,0xA500E708,0xA600E708,0xA700E708,0xA800E708,0xA900E708, +0xAA00E708,0xAB00E708,0xAC00E708,0xAD00E708,0xAE00E708,0xAF00E708,0x00000013,0x9100E70A,0x9200E708,0x9300E708, +0x9400E708,0x9500E708,0x9600E70A,0x9700E708,0x9800E708,0x9900E708,0x9A00E723,0x9B00E70A,0x9C00E708,0x9D00E708, +0x9E00E708,0x9F00E708,0xA000E708,0xA100E708,0xA200E70A,0xA300E70A,0xA400E70A,0xA500E70A,0xA600E70A,0xA700E70A, +0xA800E708,0xA900E708,0xAA00E70A,0xAB00E708,0xAC00E708,0xAD00E723,0xAE00E725,0xAF00E708,0xB000E726,0xB100E727, +0xB200E728,0xB300E72B,0xB400E72C,0xB500E72D,0xB600E76E,0xB700E76F,0xB800E77F,0xB900E7A0,0xBA00E7A0,0xBB00E7CE, +0xBC00E7D0,0xBD00E7D1,0x00000014,0xBF00E7D2,0x00000015,0x00000016,0x00000017,0x8100E7D5,0x8200E7D8,0x00000018, +0x8400E708,0x8500E70A,0x00000019,0x8700E77F,0x9000E708,0x9100E708,0x9200E708,0x9300E708,0x9400E708,0x9500E708, +0x9600E708,0x9700E708,0x9800E7E5,0x9900E7E6,0x9A00E7E7,0x0000001E,0x0000001F,0x00000020,0x8B00E7FD,0x8C00E7FE, +0x8D00E7FF,0x8E00E7E5,0x8F00E7E6,0x9000E7E7,0x9100E800,0x9200E801,0x9300E708,0x9400E708,0x9500E70A,0x9600E70A, +0x9700E708,0x9800E708,0x9900E708,0x9A00E708,0x9B00E708,0x9C00E70A,0x9D00E708,0x9E00E708,0x9F00E70A,0x0000001B, +0x0000001C,0x0000001D,0x00000021,0x00000022,0x00000023,0x9100E804,0x00000024,0x00000007,0x9600E708,0x9700E708, +0x9800E708,0x9900E708,0x9A00E708,0x9B00E708,0x9C00E708,0xB000E802,0x00000009,0x9F00E708,0xA000E708,0xA100E708, +0xA200E708,0xA300E70A,0xA400E708,0x00000054,0x0000005B,0xA700E708,0xA800E708,0x8A00E80E,0xAA00E70A,0xAB00E708, +0xAC00E708,0xAD00E70A,0x9900E70A,0x9A00E70A,0x9B00E70A,0x8D00E70A,0xB000E708,0xB100E70A,0xB200E708,0xB300E708, +0xB400E70A,0xB500E708,0xB600E708,0xB700E70A,0xB800E70A,0xB900E70A,0xBA00E708,0xBB00E70A,0xBC00E70A,0xBD00E708, +0xBE00E70A,0xBF00E708,0x8000E708,0x8100E708,0x8200E70A,0x8300E708,0x8400E70A,0x8500E708,0x8600E70A,0x8700E708, +0x8800E70A,0x8900E708,0x8A00E708,0xAB00E708,0xAC00E708,0xAD00E708,0xAE00E708,0xAF00E708,0xB000E708,0xB100E708, +0xB200E70A,0xB300E708,0xA000E7D3,0xA100E785,0x00000067,0xA300E7ED,0xA400CED7,0xA500E820,0xA600CED7,0xA700DB48, +0xA800CED7,0xA900DB48,0xAA00CED7,0xAB00DB48,0xAC00CED7,0xAD00DB48,0x0000006B,0xAF00DB48,0x00000076,0xB100E821, +0xB200CED7,0xB300DB48,0x0000007A,0xB500DB48,0x00000081,0xB700E78F,0xB800E7AE,0xB900E830,0xBA00E7F7,0xBB00E834, +0xBC00E828,0xBD00E811,0xBE00E84F,0xBF00DAB1,0xB800E848,0xB900E848,0xBA00E80E,0x9600E708,0x9700E708,0x9800E708, +0x9900E708,0x00000082,0x9B00E708,0x9C00E708,0x9D00E708,0x9E00E708,0x9F00E708,0xA000E708,0xA100E708,0xA200E708, +0xA300E708,0x00000084,0xA500E708,0xA600E708,0xA700E708,0x000000D6,0xA900E708,0xAA00E708,0xAB00E708,0xAC00E708, +0xAD00E708,0x9400E708,0x9500E708,0x9600E708,0x9700E708,0x9800E708,0x9900E708,0x9A00E708,0x9B00E708,0x9C00E708, +0x9D00E708,0x9E00E708,0x9F00E708,0xA000E708,0xA100E708,0x000000DA,0xA300E70A,0xA400E708,0xA500E708,0xA600E70A, +0xA700E708,0xA800E708,0xA900E70A,0xAA00E708,0xAB00E708,0xAC00E708,0xAD00E70A,0xAE00E70A,0xAF00E70A,0xB000E7FD, +0xB100E7FE,0xB200E7FF,0xB300E708,0xB400E708,0xB500E708,0xB600E70A,0xB700E708,0xB800E708,0xB900E70A,0xBA00E70A, +0xBB00E708,0xBC00E708,0xBD00E708,0xBE00E708,0xBF00E708,0x8D00E80E,0x8D00E80E,0xB800E856,0xB900E856,0x9100E708, +0x9200E70A,0x9300E708,0x9400E708,0x000000E0,0x9500E815,0x9600E816,0x8800E854,0x8900E854,0x8A00E854,0x8B00E854, +0x8800E85A,0x8900E85A,0x8A00E85A,0x8B00E85A,0x9800E70A,0x9900E70A,0xB100E85C,0xB200E86D,0x8000E89D,0xB400E877, +0x8200E86B,0x8000E822,0x00000008,0x8200E794,0x9400E80E,0xBA00E86D,0xBB00E86D,0xBC00E86D,0xBD00E86D,0x8000E86D, +0x8600E80E,0x8200E708,0x8300E708,0x8400E80E,0x8D00E85E,0x8600E708,0x8700E708,0x9200E80E,0xB300E805,0xB700E805, +0xAD00E80E,0xB900E80E,0xBA00E80E,0xB500E70A,0x9300E80E,0xB700E70A,0x8000E80E,0xB900E70B,0x9D00E708,0x9C00E836, +0x9700E708,0x9800E70A,0x9F00E845,0xAA00E80E,0xAB00E80E,0xA200DCCD,0xB400E80E,0xA400E833,0xB900E723,0xBA00E708, +0xBB00E70A,0xA800E84D,0xA900E852,0xAA00E862,0xA000E80E,0xAC00DD30,0xAD00E875,0xAE00E83D,0xAF00E85D,0xB000D7B8, +0x0000001A,0x8400E80E,0xB300E899,0x9D00E708,0x9E00E708,0x9F00E708,0xB700E8D3,0xAF00E708,0xB000E708,0xB100E708, +0x9E00E8F8,0xA600E805,0x9900E8C8,0x9A00E8C8,0xBD00E70A,0xB500E708,0xB600E708,0xB700E708,0xB800E708,0xB900E708, +0xBA00E708,0xBB00E708,0xBC00E708,0xB200E80E,0xB300E80E,0xBF00E70A,0xB000E708,0xB100E708,0xB200E708,0xB300E708, +0xB400E708,0xB500E70A,0xB600E70A,0xB700E70A,0xB800E70A,0xB900E70A,0xBA00E70A,0xBB00E708,0xBC00E708,0xBD00E70A, +0xAB00E708,0xAC00E70A,0xAD00E708,0xAE00E708,0xAF00E708,0xB000E708,0xB100E708,0xB200E708,0xB300E708,0x9000E708, +0x9100E708,0x9200E708,0xA000E70A,0x9400E70E,0x9500E70A,0x9600E70A,0x9700E70A,0x9800E70A,0x9900E70A,0x9A00E708, +0x9B00E708,0x9C00E70A,0x9D00E70A,0x9E00E70A,0x9F00E70A,0xA000E708,0x8000E805,0xA200E70E,0xA300E70E,0xA400E70E, +0xA500E70E,0xA600E70E,0xA700E70E,0xA800E70E,0x9E00E708,0x9F00E708,0xB000E708,0xB100E708,0xAD00E70A,0xAA00E88F, +0xAB00E725,0xAC00E709,0xAD00E723,0xAE00E8B5,0xAF00E8B5,0xB400E708,0xAB00E70A,0xAC00E70A,0xAD00E70A,0xB800E708, +0xB900E708,0x8000E708,0x8100E708,0x8200E70A,0x8300E708,0x8400E708,0x8500E708,0x8600E708,0x8700E708,0x8800E708, +0x8900E708,0x8A00E70A,0x8B00E708,0x8C00E708,0x8D00E718,0x8E00E87B,0x8F00E70A,0x9000E70D,0x9100E708,0x9200E708, +0x9300E708,0x9400E708,0x9500E708,0x9600E708,0x9700E708,0x9800E708,0x9900E708,0x9A00E708,0x9B00E708,0x9C00E708, +0x9D00E708,0x9E00E708,0x9F00E708,0xA000E708,0xA100E708,0xA200E708,0xA300E708,0xA400E708,0xA500E708,0xA600E708, +0xA700E708,0xA800E708,0xA900E708,0xAA00E708,0xAB00E708,0xAC00E708,0xAD00E708,0xAE00E708,0xAF00E708,0xB000E708, +0xB100E708,0xB200E708,0xB300E708,0xB400E708,0xB500E708,0x8300E903,0x8D00E70A,0xAB00E80E,0x8F00E708,0xB200E909, +0xBB00E708,0xBC00E714,0xBD00E70A,0xBE00E708,0xBF00E70A,0x9000E708,0x9100E708,0x9200E70E,0x9300E70E,0x9400E708, +0x9500E708,0x9600E708,0x9700E708,0x9800E70E,0x9900E70E,0x9A00E70E,0x9B00E708,0x9C00E708,0xA500E708,0xA600E70A, +0xB900E80E,0xBA00E805,0xA100E708,0xB500E80E,0xB600E805,0x9E00E70E,0xA500E70E,0xA600E70E,0xA700E708,0xA800E70A, +0xA900E708,0xAA00E70E,0xAB00E70E,0xAC00E70A,0xAD00E70A,0xAE00E70A,0xAF00E70A,0xB000E708,0x8700E9E3,0xB800E708, +0xB900E70E,0xBA00E70A,0x8100E708,0xB300E850,0x8600E80E,0xB5006DD5,0xBF00E80E,0xB700E91E,0xA000E708,0xA100E708, +0xA200E708,0xA300E708,0xA400E708,0xA500E708,0xA600E708,0xA700E708,0xA800E708,0xA900E708,0xAA00E708,0xAB00E708, +0xAC00E708,0xAD00E708,0xAE00E708,0xAF00E708,0xB000E708,0xB100E708,0xB200E708,0xB300E708,0xB400E708,0xB500E708, +0xB600E708,0xB700E708,0xB800E708,0xB900E708,0xBA00E708,0xBB00E708,0xBC00E708,0xBD00E708,0xBE00E708,0xBF00E708, +0x9900E942,0x9A00E8A4,0x9B00E894,0x000000E2,0xAC00E864,0x00000000,0x8400E80E,0xA000E84A,0xA900E805,0xAA00E80E, +0xA300E960,0xA400E8A3,0xA500E84B,0xA600E825,0xA700E860,0xB600E80E,0xB800E982,0xAA00E962,0xAB00E937,0xAF00E708, +0x9700E9E3,0xBF00E80E,0xAF00E82D,0xBC00E9E3,0xB400E708,0xB500E708,0xB600E708,0xB700E708,0xB800E708,0xB900E708, +0xBA00E708,0xBB00E708,0xBC00E708,0xBD00E708,0xA000E708,0xA100E708,0xA200E708,0xA300E708,0xA400E708,0xA500E708, +0xA600E708,0xA700E708,0xA800E708,0xA900E708,0xAA00E708,0xAB00E708,0xAC00E708,0xAD00E708,0xAE00E708,0xAF00E708, +0xB000E708,0xB100E708,0xB000E708,0x8000E80E,0xB200E708,0xB300E708,0xB400E70A,0x8200E80E,0x8700E849,0xB700E708, +0xB800E708,0x8600E805,0x8B00E88C,0x8A00E805,0x8D00E98B,0xBE00E9E3,0xBE00E708,0xBF00E708,0xA000E708,0xA100E708, +0xA200E708,0xA300E708,0xA400E708,0xA500E708,0xA600E708,0xA700E70A,0xA800E70A,0xA900E70A,0xAA00E70A,0xAB00E70A, +0xAC00E70A,0xAD00E70A,0xAE00E708,0xAF00E708,0x9000E991,0x9100E9C5,0x8000E708,0x8100E708,0x8200E708,0x9600E9E3, +0x9600E9A9,0xA800E8FD,0x8200E80E,0x8300E805,0xAB00E8FB,0x9B00E8DB,0xAE00E9E3,0x9D00E9FD,0x9E00E9F3,0xB600E708, +0xB700E708,0xB800E708,0xB900E708,0xBA00E708,0x8100E934,0x8200E8E9,0x9C00E9E3,0x8400E9B4,0x8500E825,0xB500E9E3, +0x8700E993,0x8800E8F0,0xB600E80E,0xB700E805,0x8B00E93D,0x8C00CED7,0x8D00E9C6,0x8D00E80E,0xAB00E9B2,0xAC00E9CB, +0x9100E995,0xB300E9E3,0x9300E9B8,0x8200EA24,0xB600E9E3,0x96006DD5,0x9700E8BA,0x98006DD5,0xA700E9E3,0x9A00E998, +0xBA00E9E3,0x9C00E8E0,0xB000E70E,0xB100E70E,0xB200E70E,0xB300E70E,0xB400E70E,0xB300E80E,0xB400E80E,0x8200E708, +0x8300E708,0x8400E708,0xA600E708,0xA700E708,0xA800E708,0xA900E708,0xAA00E708,0xAB00E708,0xAC00E708,0x8000EA50, +0x8000E9E3,0xB0006DD5,0xB000E708,0xB100E708,0xB200E708,0xB300E708,0xB400E708,0xB000E708,0xB100E708,0xB200E708, +0xB300E708,0xB400E708,0xB500E708,0xB600E708,0x8500E9E2,0x8600EA22,0x8000E9E3,0x8100E9E3,0x8900E9E7,0xA500E70B, +0xA600E70B,0xA700E70E,0xA800E70E,0xA900E70E,0x9300E9E3,0x9400E9E3,0x9500E9E3,0xAD00E9E1,0xAE00E70B,0xAF00E70B, +0xB000E70B,0xB100E70B,0xB200E70B,0xAF00E9E3,0xA300EA1E,0xB300E9E3,0xA500EA31,0x8000E9E3,0x8100E9E3,0x8200E9E3, +0x8C00E9E3,0xBB00E70A,0xBC00E70A,0xBD00E70A,0xBE00E70A,0xBF00E70A,0x8000E70A,0x8100E70A,0x8200E70A,0xA900E9E3, +0xAA00E9E3,0x8500E708,0x8600E708,0x8700E708,0x8800E708,0x8900E708,0x8A00E70A,0x8B00E70A,0x9000E70A,0x9100E70A, +0x9200E70A,0x9300E70A,0x9400E70A,0x9500E70A,0x9600E70A,0x8400E708,0x8500E708,0x8600E708,0x8700E708,0x8800E708, +0x8900E708,0x8A00E805,0xBB00E9E3,0x9900E9E3,0x9A00E9E3,0xBE00E9E3,0x8900E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3, +0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8500EB3B,0x8600EA4E,0x8700E9F4,0x9F00E9E3,0x9100EAF6,0xAA00E708,0xAB00E708, +0xAC00E708,0xAD00E708,0x8000E708,0x8100E708,0x8200E708,0x8300E708,0x8400E708,0x8500E708,0x8600E708,0x9D00EA42, +0x8800E708,0x8900E708,0x8A00E708,0x8B00E708,0x8C00E708,0x8D00E708,0x8E00E708,0x8F00E708,0x9000E708,0x9100E708, +0x9200E708,0x9300E708,0x9400E708,0x9500E708,0x9600E708,0x9700E708,0x9800E708,0xAF00EB5D,0x9000E9E3,0x9B00E708, +0x9C00E708,0x9D00E708,0x9E00E708,0x9F00E708,0xA000E708,0xA100E708,0xBF00E9E3,0xA300E708,0xA400E708,0xB400E9E3, +0xA600E708,0xA700E708,0xA800E708,0xA900E708,0xAA00E708,0xCC00EAA0,0xCD00EA41,0xCE00E92D,0xFF000000,0xBE00E9E3, +0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xD900E9F9,0xBB00E9E3, +0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x9700E9E3,0xE000EAAE,0xE100EAE9,0xE200EAF5,0xE300E9D7,0x9C00E9E3, +0x9D00E9E3,0xB000E9E3,0x9F00E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x8200E9E3,0xFF000000,0x9E00E9E3,0xFF000000, +0xEF00EB67,0xF000EA3A,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0xFF000000,0x8600E9E3,0x8700E9E3, +0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x9500E9E3,0x9600E9E3,0x8F00E9E3,0xFF000000,0x9100E9E3, +0xFF000000,0x9300E9E3,0x9400E9E3,0x8A00E9E3,0xFF000000,0x9600E9E3,0x9700E9E3,0xFF000000,0x8F00E9E3,0x9B00E9E3, +0xA600E9E3,0x9C00E9E3,0x9D00E9E3,0xB000E9E3,0xAA00E9E3,0xAB00E9E3,0xFF000000,0xA300E9E3,0xA400E9E3,0xA500E9E3, +0xA600E9E3,0xA700E9E3,0xA800E9E3,0xBA00E9E3,0x9F00E9E3,0xFF000000,0xBD00E9E3,0xAD00E9E3,0xAE00E9E3,0xFF000000, +0xB000E9E3,0xB100E9E3,0xA400E939,0xA500EA68,0xA600E961,0xA700EA77,0xA800E9A4,0xA900EA7E,0xB800E9E3,0xFF000000, +0xAC00E961,0xAD00EAA1,0xAE00E961,0xAF00E95B,0x8300E9E3,0xB100E9A1,0xFF000000,0xB300EA98,0xB400E961,0xB500E95B, +0x8100E9E3,0xB700EAAB,0xB200E9E3,0xB300E9E3,0x8D00E9E3,0x8000E990,0xFF000000,0xBD00EADB,0xBE00EAE3,0x9200E9E3, +0x8500EB08,0x8600EB16,0x8700EA19,0xFF000000,0x9700E9E3,0xBF00E9E3,0xFF000000,0x8000EA04,0x9300E9E3,0x9C00E9E3, +0x8200E9A6,0x8400EA96,0x8400E9B7,0x8400E9E3,0x8500E9E3,0xFF000000,0x8700E9E3,0xFF000000,0x9D00E9E3,0x8C00E9FC, +0x8C00E961,0x8D00E95B,0xA900E9E3,0xA200E9E3,0x9C00E9E3,0x9D00E9E3,0x9200EA8F,0xFF000000,0xA700E9E3,0xFF000000, +0x9600E9E6,0xFF000000,0xB300E9E3,0xAC00E9E3,0xB500E9E3,0xB600E9E3,0xFF000000,0xB800E9E3,0xFF000000,0xAC00E996, +0xFF000000,0xB100E9E3,0xFF000000,0xB300E9E3,0xFF000000,0xB500E9E3,0xB900E9E3,0xB700E9E3,0xFF000000,0xB900E9E3, +0xAB00E9AC,0xBB00E9E3,0xFF000000,0xBD00E9E3,0x9A00E9E3,0x9B00E9E3,0xBD00EAE6,0xBE00EA01,0xBF00EB4D,0xA100E9E3, +0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3, +0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3, +0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3, +0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3, +0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8900E9E3,0xFF000000,0x8B00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3, +0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0x9300E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3, +0x9D00E9E3,0xFF000000,0x9B00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xFF000000,0xBB00E9E3, +0xA300E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0xBC00E9E3,0xBD00E9E3,0xAC00E9E3,0xAD00E9E3,0xAB00E9E3,0xAF00E9E3, +0xB000E9E3,0xAE00E9E3,0xAF00E9E3,0xA000EB95,0xA100EB95,0xA200EB95,0xA300EB95,0xA400EB95,0xA500EB95,0xA600EB95, +0xA700EB95,0xA800ECA0,0xB900E9E3,0xFF000000,0xBB00E9E3,0xFF000000,0xBD00E9E3,0xA400EB95,0xA500EB95,0xA600EB95, +0xA700EB95,0xA800EBD5,0xA900EC15,0xAA00EB95,0xAB00EC55,0xAC00EC52,0xAD00EC91,0x8000E9E3,0x8100E9E3,0x8200E9E3, +0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3, +0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3, +0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3, +0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3, +0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3, +0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3, +0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3, +0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x9A00EAEA,0xFF000000,0x9000E9E3,0x9D00EA65,0x9200E9E3, +0x9F00EBC0,0xFF000000,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3, +0x9D00E9E3,0x9E00E9E3,0xFF000000,0xA000E9E3,0xAD00ECBA,0xA200E9E3,0xB800E9E3,0xB900E9E3,0xA500E9E3,0xA600E9E3, +0xB400E9E3,0xB500E9E3,0xB600E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3, +0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3, +0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3, +0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3, +0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3, +0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3, +0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3, +0xAD00E9E3,0xFF000000,0xFF000000,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3, +0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3, +0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3, +0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3, +0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9D00E9E3,0xFF000000,0x9F00E9E3,0xB000E9E3,0xB100E9E3, +0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xFF000000,0xAA00E9E3,0xAB00E9E3, +0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3, +0xB600E9E3,0xFF000000,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xFF000000,0xBE00E9E3,0x8000E9E3, +0x8100E9E3,0xFF000000,0x8300E9E3,0x8400E9E3,0x8000E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3, +0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3, +0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3, +0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3, +0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0xC200ECBB,0xFF000000,0xC400EAB4,0xC500ECC4,0xFF000000,0xC700ECF6, +0x8000E9E3,0xFF000000,0xCA00EC42,0xCB00EB49,0xCC00EAA0,0xCD00ED04,0xCE00EAF7,0xCF00ECFA,0xB600E9E3,0x8900E9E3, +0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xFF000000,0xD600E92D,0xFF000000,0x9100EAF6,0xD900ECFF,0x9C00E9E3,0x9D00E9E3, +0x9E00E9E3,0x9F00E9E3,0xFF000000,0xA000E9E3,0xE000ED1F,0xE100ED60,0xE200EE32,0xE300ED15,0x9D00F38A,0x9E00ECAF, +0x9F00ED67,0xA800E9E3,0xFF000000,0xAA00E9E3,0xEA00EBC9,0xB800F569,0xB900F59A,0xBA00F5D9,0xAF00E9E3,0xEF00F08D, +0xF000ECC3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xFF000000,0xAF00EB5D,0xB800E9E3,0xB900E9E3,0xBA00E9E3, +0xFF000000,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3, +0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3, +0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0xFF000000,0x9300E9E3,0x9400E9E3, +0x9500E9E3,0x8000EC96,0xFF000000,0x8200ED20,0x8300EA33,0x8400EF93,0x8500EB95,0x8600EFD3,0xFF000000,0x8800EFF3, +0x8900F033,0x8A00EB95,0x8B00F072,0x8C00EB95,0x8D00EB95,0x8E00EB95,0x8F00EB95,0xFF000000,0xFF000000,0xB100E9E3, +0xB200E9E3,0xB300E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xFF000000,0xB400E9E3,0xB500E9E3,0xFF000000,0xFF000000, +0xFF000000,0xB900E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB400E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3, +0x9C00E9E3,0xFF000000,0xBA00E9E3,0x9F00E9E3,0xFF000000,0xFF000000,0xBE00E9E3,0xA400E939,0xA500EA68,0xA600E961, +0xA700EA77,0xA800E9A4,0xA900EA7E,0xFF000000,0xFF000000,0xAC00E961,0xAD00EAA1,0xAE00E961,0xAF00E95B,0xFF000000, +0xB100E9A1,0xFF000000,0xB300EA98,0xB400E961,0xB500E95B,0x8300E9E3,0xB700EAAB,0xB800E9E4,0xFF000000,0xBA00E9E4, +0xBB00EAEA,0xBC00EA10,0xBD00ED52,0xBE00EAE3,0xFF000000,0x8D00E9E3,0x8000E990,0xFF000000,0xFF000000,0x8300E939, +0x9200E9E3,0x8500EB08,0x8600EB16,0x8700EA19,0xFF000000,0x9700E9E3,0xFF000000,0x8400F615,0x8500F655,0x8600EA5A, +0x9C00E9E3,0x8800F671,0x8900ED71,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3, +0x8700E9E3,0x8800E9E3,0xFF000000,0xA900E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0x9000E9E3, +0x9100E9E3,0xFF000000,0xFF000000,0xB300E9E3,0xFF000000,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3, +0xAC00E996,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xB400ED74,0xB500EDB4, +0xB600EDD2,0xFF000000,0xFF000000,0xFF000000,0xBA00EB0A,0xFF000000,0xFF000000,0xBD00EAE6,0xBE00EB34,0xBF00EE12, +0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xFF000000,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3, +0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xFF000000,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3, +0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3, +0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0xFF000000,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3, +0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3, +0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3, +0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xB800E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3, +0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3, +0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3, +0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3, +0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0x8900E9E3,0xFF000000,0x8B00E9E3,0xFF000000,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3, +0xFF000000,0xFF000000,0xFF000000,0x9300E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0x9B00E9E3,0xFF000000,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0x8000EE72,0x8100EE83,0x8200EEC3,0xA300E9E3, +0x8400EEE3,0x8500EF23,0x8600EA37,0xFF000000,0x8800EB4A,0xFF000000,0xFF000000,0xAB00E9E3,0x8C00E9FC,0xAD00E9E3, +0xAE00E9E3,0xAF00E9E3,0xFF000000,0x9100EF43,0x9200EB95,0x9300EF83,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xB900E9E3,0xFF000000,0xBB00E9E3,0xFF000000,0xBD00E9E3,0xBE00E9E3,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xA800EA10,0xA900EBC8,0xFF000000,0xAB00E9AC, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xB100EB38,0xFF000000,0xFF000000,0xFF000000,0xB500E9E6, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xBA00EA2B,0xBB00E9E4,0xBC00EB95,0xBD00EB95,0xBE00EB95,0xBF00EFAE, +0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3, +0x8A00E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0x9100E9E3,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0x9700E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xFF000000, +0x9700E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xAF00E9E3,0x9F00E9E3,0xFF000000, +0xFF000000,0xB300E9E3,0xB400E9E3,0xFF000000,0xB600E9E3,0xB700E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xBC00E9E3,0xFF000000,0xBE00E9E3,0xFF000000,0xFF000000,0xB000E9E3,0xB100E9E3,0xFF000000,0xFF000000,0xB400E9E3, +0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3, +0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3, +0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0xFF000000,0x9000E9E3,0x9100E9E3,0x9200E9E3, +0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3, +0xFF000000,0xFF000000,0xFF000000,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0xFF000000,0x8500E9E3,0x8600E9E3, +0x8700E9E3,0xA800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3, +0x9100E9E3,0x9200E9E3,0x9300E9E3,0xFF000000,0x9500E9E3,0x9600E9E3,0xFF000000,0xFF000000,0x9900E9E3,0x9A00E9E3, +0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0xFF000000,0xFF000000,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xFF000000,0xA400E9E3, +0xFF000000,0xA600E9E3,0xFF000000,0xA800E9E3,0xFF000000,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xFF000000, +0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xFF000000,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3, +0xB900E9E3,0xFF000000,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3, +0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3, +0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3, +0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3, +0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3, +0xBF00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3, +0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3, +0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3, +0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3, +0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3, +0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3, +0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3, +0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3, +0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3, +0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0xB100E9E3,0xB200E9E3, +0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3, +0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3, +0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0xFF000000,0xFF000000, +0xFF000000,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3, +0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3, +0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3, +0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3, +0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0xFF000000,0xA000E9E3,0xA100E9E3,0xA200E9E3, +0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3, +0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3, +0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3, +0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3, +0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3, +0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3, +0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3, +0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3, +0xBD00E9E3,0xBE00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3, +0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3, +0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3, +0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3, +0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3, +0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3, +0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xA400EB95,0xA500EB95,0xA600EB95,0xA700EB95,0xA800EBD5, +0xA900EC15,0xAA00EB95,0xAB00EC55,0xAC00F0CD,0xAD00F10C,0xAE00F14C,0xAF00F16B,0xB000EB95,0xB100EB95,0xB200EB95, +0xB300EB95,0xB400F1AB,0xB500F1D9,0xB600F219,0xB700F259,0xB800F266,0xB900F2A6,0xBA00EB95,0xBB00F2E6,0xBC00F322, +0xBD00EB95,0xBE00F072,0xBF00F360,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0x9D00E9E3,0xFF000000,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3, +0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3, +0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xFF000000,0xB800E9E3, +0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xFF000000,0xBE00E9E3,0x8000E9E3,0x8100E9E3,0xFF000000,0x8300E9E3, +0x8400E9E3,0xFF000000,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3, +0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3, +0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3, +0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3, +0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3, +0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3, +0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3, +0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3, +0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3, +0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3, +0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3, +0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3, +0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3, +0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3, +0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3, +0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3, +0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3, +0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3, +0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3, +0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3, +0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3, +0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3, +0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3, +0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3, +0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3, +0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3, +0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3, +0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3, +0x8F00E9E3,0xFF000000,0xFF000000,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3, +0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3, +0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3, +0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3, +0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3, +0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0x9000E9E3,0x9100E9E3, +0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xB000E9E3,0xB100E9E3,0xB200E9E3, +0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3, +0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3, +0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3, +0x8400E9E3,0xFF000000,0xFF000000,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3, +0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0xFF000000,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3, +0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3, +0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xFF000000,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xFF000000,0xB400E9E3,0xFF000000, +0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3, +0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3, +0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3, +0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3, +0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3, +0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3, +0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3, +0xBC00E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3, +0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3, +0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3, +0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3, +0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3, +0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3, +0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3, +0xFF000000,0xFF000000,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0xFF000000,0xFF000000, +0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0xFF000000,0xFF000000,0x9A00E9E3,0x9B00E9E3, +0x9C00E9E3,0xFF000000,0xFF000000,0xFF000000,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3, +0xA600E9E3,0xFF000000,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0x8500EB3B, +0x8600EA4E,0x8700E9F4,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0x9000EB95,0x9100F3AA,0x9200F3EA,0x9300F42A,0x9400F46A,0x9500F4A9,0x9600EB95,0x9700EB95,0x9800EB95,0x9900EB95, +0x9A00F4E9,0x9B00EB95,0x9C00EB95,0x9D00EB95,0x9E00EB95,0x9F00F529,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3, +0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3, +0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0xFF000000,0x9600E9E3,0x9700E9E3, +0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3, +0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3, +0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3, +0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3, +0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3, +0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3, +0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0xFF000000, +0x9E00E9E3,0x9F00E9E3,0xFF000000,0xFF000000,0xA200E9E3,0xFF000000,0xFF000000,0xA500E9E3,0xA600E9E3,0xFF000000, +0xFF000000,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xFF000000,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3, +0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xFF000000,0xBB00E9E3, +0xFF000000,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0xFF000000,0x8500E9E3, +0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3, +0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3, +0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3, +0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3, +0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3, +0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3, +0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0xFF000000,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0xFF000000, +0xFF000000,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0xFF000000, +0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0xFF000000,0x9E00E9E3,0x9F00E9E3, +0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3, +0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3, +0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xFF000000,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3, +0xBE00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0xFF000000,0x8600E9E3,0xFF000000,0xFF000000, +0xFF000000,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0xFF000000,0x9200E9E3, +0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3, +0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3, +0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3, +0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3, +0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3, +0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3, +0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3, +0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3, +0xA300E9E3,0xA400E9E3,0xA500E9E3,0xFF000000,0xFF000000,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3, +0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3, +0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3, +0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3, +0x8B00E9E3,0xFF000000,0xFF000000,0x8E00E9E3,0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3, +0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3, +0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3, +0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3, +0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3, +0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0xFF000000,0x8500E9E3,0x8600E9E3, +0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0x9000E9E3, +0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3, +0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xFF000000,0xA100E9E3,0xA200E9E3,0xFF000000,0xA400E9E3, +0xFF000000,0xFF000000,0xA700E9E3,0xFF000000,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3, +0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0x8200E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0x8700E9E3, +0xB900E9E3,0x8900E9E3,0xBB00E9E3,0x8B00E9E3,0xFF000000,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0xFF000000,0x9100E9E3, +0x9200E9E3,0xFF000000,0x9400E9E3,0xFF000000,0xFF000000,0x9700E9E3,0xFF000000,0x9900E9E3,0xFF000000,0x9B00E9E3, +0xFF000000,0x9D00E9E3,0xFF000000,0x9F00E9E3,0xFF000000,0xA100E9E3,0xA200E9E3,0xFF000000,0xA400E9E3,0xFF000000, +0xFF000000,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xFF000000,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3, +0xB000E9E3,0xB100E9E3,0xB200E9E3,0xFF000000,0xB400E9E3,0xB500E9E3,0xB600E9E3,0xB700E9E3,0xFF000000,0xB900E9E3, +0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xFF000000,0xBE00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3, +0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0xFF000000,0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3, +0x8F00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3, +0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xA100E9E3,0xA200E9E3, +0xA300E9E3,0xFF000000,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xFF000000,0xAB00E9E3,0xAC00E9E3, +0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3, +0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0x8000E9E3,0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3, +0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3,0x9700E9E3,0x9800E9E3, +0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3,0xA100E9E3,0xA200E9E3, +0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3,0xAB00E9E3,0xAC00E9E3, +0xAD00E9E3,0xAE00E9E3,0xFF000000,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3,0xB500E9E3,0xB600E9E3, +0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xBC00E9E3,0xBD00E9E3,0xBE00E9E3,0xBF00E9E3,0x8000E9E3, +0x8100E9E3,0x8200E9E3,0x8300E9E3,0x8400E9E3,0x8500E9E3,0x8600E9E3,0x8700E9E3,0x8800E9E3,0x8900E9E3,0x8A00E9E3, +0x8B00E9E3,0x8C00E9E3,0x8D00E9E3,0x8E00E9E3,0x8F00E9E3,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0x8000E9E3,0x8100E9E3,0x8200E9E3, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xAA00E9E3,0xAB00E9E3,0x9000E9E3,0x9100E9E3,0x9200E9E3,0x9300E9E3,0x9400E9E3,0x9500E9E3,0x9600E9E3, +0x9700E9E3,0x9800E9E3,0x9900E9E3,0x9A00E9E3,0x9B00E9E3,0x9C00E9E3,0x9D00E9E3,0x9E00E9E3,0x9F00E9E3,0xA000E9E3, +0xA100E9E3,0xA200E9E3,0xA300E9E3,0xA400E9E3,0xA500E9E3,0xA600E9E3,0xA700E9E3,0xA800E9E3,0xA900E9E3,0xAA00E9E3, +0xAB00E9E3,0xAC00E9E3,0xAD00E9E3,0xAE00E9E3,0xAF00E9E3,0xB000E9E3,0xB100E9E3,0xB200E9E3,0xB300E9E3,0xB400E9E3, +0xB500E9E3,0xB600E9E3,0xB700E9E3,0xB800E9E3,0xB900E9E3,0xBA00E9E3,0xBB00E9E3,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000,0xFF000000, +0xFF000000,0xFF000000,0xFF000000}; + +const signed char STRINGS[]={ + -27,-113, -81, -27, -66,-105, -23,-123,-115, -27,-106, -74, -25,-108, -77, -26, -70,-128, -27,-112, +-120, -25, -87, -70, -25, -90,-127, -26,-116,-121, -23,-127,-118, -26,-115,-107, -26,-118,-107, -26, + -68,-108, -27,-112, -71, -27, -93, -80, -24, -78, -87, -25, -75,-126, -27,-120, -99, -26,-106, -80, + -27, -66,-116, -27,-119,-115, -25,-124, -95, -26,-104, -96, -28, -70, -92, -24, -89, -93, -27,-113, +-116, -27, -83,-105, -39, -81, -38, -95, -39, -82, -49, -99, -49,-100, -30,-120,-126, -49,-120, -49, +-124, -49,-125, -50, -66, -50, -67, -50, -69, -50, -74, -30,-120,-121, -50, -88, -50, -89, -50, -90, + -50, -92, -50, -98, -50, -99, -50,-100, -50,-101, -50,-102, -50,-106, -50,-108, -50,-110, -56, -73, + -60, -79, -30,-105,-117, -30,-106, -96, -30,-122,-109, -30,-122,-111, -30,-108,-126, -30,-126, -87, + -62, -91, -62, -90, -62, -84, -62, -93, -62, -94, -29,-125, -93, -29,-126, -91, -29,-125, -69, -30, + -90,-122, -30, -90,-123, 126, 124, 94, 39, 34, -40, -87, -40, -95, 64, 37, 36, 92, 45, 42, + 38, 35, 93, 91, -29,-128,-113, -29,-128,-114, -29,-128,-115, -29,-128,-116, -29,-128,-117, -29, +-128,-118, -29,-128,-111, -29,-128,-112, 125, 123, 95, -30,-128,-109, -30,-128,-108, -29,-128,-105, + -29,-128,-106, -29,-128,-126, -29,-128,-127, -37,-119, -37,-123, -37,-117, -38, -83, -38, -66, -38, + -69, -38, -70, -38, -79, -38, -77, -38, -81, -38, -87, -38,-111, -38,-104, -38,-120, -38,-114, -38, +-116, -38,-115, -38,-121, -38,-122, -38,-125, -38,-124, -38, -90, -38, -92, -39, -71, -39, -65, -39, + -70, -38,-128, -39, -66, -39, -69, -39, -79, -41, -99, -41, -94, -22, -83,-110, -55, -85, -22, -84, + -73, -22,-100, -89, -59,-109, -60, -90, -22, -99, -81, -47,-116, -47,-118, -29,-125, -88, -29,-125, + -94, -29,-125,-116, -27, -92,-100, -27, -82,-105, -27,-116, -69, -27,-113, -77, -27, -73, -90, -27, +-122,-103, -23, -96,-123, -26, -77, -88, -27,-115, -80, -27,-124, -86, -23,-127, -87, -25,-108, -73, + -25, -89,-104, -25, -82,-113, -27, -71, -68, -27,-107,-113, -27,-100, -80, -27, -92, -87, -28, -72, +-127, -28, -72,-103, -25,-108, -78, -28, -72,-117, -28, -72, -83, -28, -72,-118, -31,-122, -95, -31, +-122, -98, -31,-122,-108, -31,-122,-110, -31,-122,-111, -31,-122,-120, -31,-122,-123, -31,-122,-124, + -31,-123,-103, -31,-123,-104, -31,-123,-105, -31,-121, -78, -31,-121, -79, -31,-123,-116, -31,-123, +-121, -31,-123,-128, -31,-124, -74, -31,-124, -78, -31,-124, -81, -31,-124, -82, -31,-124, -83, -31, +-124, -84, -31,-124, -85, -31,-124, -87, -31,-124, -89, -31,-124, -93, -31,-124, -94, -31,-124, -96, + -31,-124, -98, -31,-124, -99, -31,-121, -97, -31,-121, -99, -31,-124,-100, -31,-121,-103, -31,-121, +-105, -31,-121,-109, -31,-121,-114, -31,-121,-116, -31,-121,-120, -31,-121,-121, -31,-124,-107, -31, +-124,-108, -31,-123, -96, -31,-124, -95, -31,-124,-102, -27,-115,-123, -27,-115,-124, -29,-128,-110, + -23, -66, -96, -23, -67,-110, -23, -67,-118, -23, -68, -96, -23, -68,-109, -23, -68,-114, -23, -69, + -67, -23, -69,-111, -23, -69,-115, -23, -69,-125, -23, -70, -91, -23, -71, -75, -23, -77, -91, -23, + -83,-102, -23, -84, -68, -23, -84, -78, -23, -84, -81, -23, -84, -91, -23, -85, -97, -23, -85,-104, + -23, -86, -88, -23, -90, -84, -23, -90,-103, -23, -90,-106, -23, -93, -97, -23, -93,-101, -23, -94, + -88, -23, -96,-127, -23, -97, -77, -23, -97, -83, -23, -97,-117, -23, -99, -87, -23, -99, -94, -23, + -99, -98, -23, -99,-111, -23,-101, -88, -23,-102, -71, -23,-102, -74, -23,-104,-100, -23,-106,-128, + -23,-107, -73, -23,-121,-122, -23,-123,-119, -23,-126,-111, -24, -66, -75, -24, -66,-101, -24, -70, + -85, -24, -74, -77, -24, -75, -80, -24, -75, -92, -24, -78, -99, -24, -79, -72, -24, -79,-122, -24, + -80, -73, -24, -88,-128, -24, -89,-110, -24, -91, -66, -24, -95,-128, -24,-103, -85, -24,-103,-115, + -24,-119, -72, -24,-119, -78, -24,-119, -82, -24,-120, -97, -24,-120,-101, -24,-120,-116, -24,-121, + -68, -24,-121, -93, -24,-126,-119, -24,-127, -65, -24,-128, -77, -24,-128,-110, -24,-128,-116, -25, + -66,-118, -25, -67,-111, -25, -68, -74, -25, -77, -72, -25, -79, -77, -25, -85, -71, -25, -87, -76, + -25, -90, -66, -25, -90, -72, -25, -92, -70, -25, -97, -77, -25, -97, -94, -25, -97,-101, -25,-101, + -82, -25,-102, -65, -25,-102, -82, -25,-103, -67, -25,-103, -74, -25,-106,-110, -25,-106,-117, -25, +-108, -80, -25,-108, -88, -25,-108, -97, -25,-108,-104, -25,-109, -90, -25,-109,-100, -25,-114,-119, + -25,-114,-124, -25,-118, -84, -25,-119,-101, -25,-119,-103, -25,-119,-121, -25,-120, -65, -25,-120, + -69, -25,-120, -74, -25,-120, -86, -26, -80,-108, -26, -80,-113, -26, -81,-101, -26, -81,-108, -26, + -81,-117, -26, -82, -77, -26, -83, -94, -26, -84, -96, -26,-101, -80, -26,-105, -96, -26,-106, -71, + -26,-106, -92, -26,-106,-105, -26,-106,-121, -26,-108, -76, -26,-108, -81, -26,-119,-117, -26,-120, + -74, -26,-120,-120, -27, -65,-125, -27, -67, -77, -27, -67, -95, -27, -67,-112, -27, -68,-109, -27, + -68,-117, -27, -69, -76, -27, -71, -65, -27, -71, -70, -27, -71, -78, -27, -73, -66, -27, -73, -79, + -27, -73, -91, -27, -73,-101, -27, -79, -79, -27, -80, -72, -27, -80,-113, -27, -81, -72, -27, -82, +-128, -27, -83,-112, -27, -92,-107, -27, -92,-118, -27, -92,-126, -27, -93, -85, -27,-101,-105, -27, +-113, -93, -27,-113,-120, -27,-114, -74, -27,-114,-126, -27,-115, -87, -27,-115,-100, -27,-116, -72, + -27,-116,-102, -27,-116,-107, -27,-117, -71, -27,-120,-128, -27,-121, -96, -27,-122, -85, -27,-122, +-106, -27,-122,-126, -27,-123, -91, -27,-124, -65, -28, -70, -70, -28, -70, -96, -28, -70,-123, -28, + -71,-103, -28, -72, -65, -28, -72, -74, -28, -72, -88, -23, -66, -97, -26, -81,-115, -30, -75, -95, + -30,-120,-111, -50, -96, -50,-109, -60, -89, -58,-112, -30,-120,-110, 43, -30,-128,-112, -54,-111, + -54,-112, -54,-116, -54,-117, -31, -76,-100, -54,-118, -54,-119, -58, -85, -54,-125, -54,-126, -55, + -72, -55, -75, -55, -76, -55, -77, -55, -78, -55, -80, -55, -79, -54, -97, -31, -74,-123, -55, -83, + -54, -99, -31, -75, -69, -55, -86, -55, -87, -55, -88, -55, -91, -55, -95, -55, -97, -61, -80, -55, +-107, -55,-110, -48, -67, -49,-121, -50, -76, -50, -77, -31, -76, -91, -55, -81, -31, -76, -99, -31, + -76,-105, -31, -76,-106, -55,-108, -59,-117, -55,-100, -55,-101, -55,-103, -31, -76,-126, -55,-111, + -55,-112, -56, -94, -58,-114, -31,-125,-100, -32, -68,-117, -50, -93, -50,-104, -49,-126, -50, -70, + -49,-128, -49,-122, -50, -72, -50, -78, -54,-107, -55, -93, -54,-127, -55, -69, -55, -71, -55, -90, + -16, -86,-104,-128, -23, -68, -69, -23, -68,-106, -23, -68,-113, -23, -68,-123, -23, -69, -66, -23, + -69, -71, -28, -75,-106, -23, -70, -69, -16, -86,-118,-111, -16, -86,-120,-114, -16, -86,-124,-123, + -28, -77, -72, -16, -86,-125,-114, -23, -75, -89, -28, -77, -83, -28, -77,-114, -23, -77, -67, -23, + -79,-128, -16, -87, -84, -80, -28, -81,-114, -23, -89, -66, -23, -89,-126, -23, -90, -89, -23, -92, + -87, -28, -84, -77, -23, -93, -94, -16, -87,-106, -74, -23, -96, -87, -16, -87,-110,-106, -28, -86, + -78, -16, -87,-112,-118, -23, -97, -96, -28, -87, -74, -28, -87, -82, -16, -87,-120,-102, -16, -87, +-123,-123, -23,-100, -93, -27, -74, -78, -23,-101,-125, -28, -89, -90, -16, -88, -75, -73, -23,-106, + -73, -28, -90,-107, -23,-106,-117, -16, -88, -81, -70, -23,-112,-107, -23,-113, -71, -23,-119, -68, + -23,-117,-104, -23,-117,-105, -23,-120, -72, -23,-124,-101, -16, -88,-100, -82, -23,-124,-111, -23, +-125, -79, -23,-126,-108, -16, -88,-105, -83, -16, -88,-105,-110, -24, -69,-108, -16, -96, -93, -98, + -24, -73, -80, -24, -74, -68, -24, -73,-117, -16, -96, -96,-124, -16, -89, -68, -81, -24, -75, -73, + -24, -76,-101, -24, -77,-127, -24, -78, -85, -16, -89, -78, -88, -24, -79,-107, -24, -86, -96, -28, +-101,-121, -28,-102, -66, -16, -89, -91, -90, -16, -89, -94, -82, -29,-110, -69, -24, -93, -70, -28, +-104, -75, -24, -93, -98, -24, -93,-105, -16, -89,-103, -89, -24, -95, -93, -24, -95, -96, -28,-105, + -71, -24, -96,-127, -24, -97, -95, -28,-105,-105, -24, -98,-122, -24, -99, -85, -24,-100, -88, -24, +-101, -94, -24,-100,-114, -24,-102,-120, -24,-102, -87, -24,-103, -87, -24,-103, -89, -24,-103,-112, + -28,-107, -85, -16, -89,-125,-110, -16, -90, -66, -79, -28,-107, -95, -28,-107, -99, -16, -90, -68, + -84, -24,-107, -92, -16, -89,-113,-118, -24,-108,-106, -24,-109, -77, -24,-109, -79, -28,-108, -85, + -16, -90, -77,-107, -16, -90, -75, -85, -16, -90, -80, -74, -24,-113,-100, -24,-113,-116, -24,-113, +-118, -24,-115,-109, -24,-113, -89, -24,-114, -67, -24,-116, -93, -24,-114, -83, -24,-115, -93, -24, +-116, -99, -16, -90, -84, -68, -24,-117, -90, -24,-118, -67, -24,-118, -77, -24,-118, -79, -27,-118, + -77, -24,-118, -99, -24,-118,-117, -24,-118,-111, -28,-111, -85, -24, -66, -98, -24,-120,-124, -16, + -93,-114,-100, -16, -93,-114,-109, -16, -90, -98, -75, -16, -90, -98, -89, -27, -86, -75, -24,-124, + -66, -28,-112,-117, -24,-124,-125, -24,-126, -78, -28,-113,-107, -16, -93,-115, -97, -24,-127, -80, + -16, -90,-106, -88, -24,-127, -96, -16, -90,-108, -93, -16, -90,-109,-102, -25, -65, -70, -25, -66, +-107, -16, -90,-116, -66, -25, -67, -70, -16, -90,-117,-103, -28,-115,-103, -16, -90,-119,-121, -16, + -90,-120, -88, -28,-116, -76, -25, -71,-123, -25, -72,-126, -25, -73,-121, -28,-116,-127, -25, -75, + -93, -16, -91, -66,-122, -25, -76,-128, -25, -77, -93, -25, -77, -88, -28,-118, -96, -25, -77,-110, + -16, -91, -78,-128, -28,-120, -89, -25, -81,-119, -25, -81,-122, -16, -91, -82, -85, -28,-120,-126, + -25, -85, -82, -16, -91, -86, -89, -16, -91, -91, -68, -25, -87,-113, -25, -87,-118, -28,-124, -81, + -25, -89, -85, -16, -91,-101,-123, -16, -91,-102,-102, -16, -91,-104, -90, -28,-125, -93, -25, -95, +-114, -16, -91,-112, -99, -28,-126,-106, -28,-127,-122, -25, -98,-117, -25,-100, -97, -25,-100, -98, + -16, -91,-124, -77, -16, -91,-124,-103, -16, -91,-125, -78, -16, -91,-125, -77, -28,-128,-120, -29, + -65, -68, -16, -91,-127,-124, -16, -92, -66, -72, -16, -92, -66, -95, -25,-104,-112, -16, -94,-122, + -97, -16, -92, -78,-110, -25,-108, -66, -16, -92, -80, -74, -25,-108, -92, -29, -68,-101, -25,-109, +-118, -25,-110,-123, -25,-111,-100, -25,-111,-121, -29, -70, -72, -25,-114, -91, -29, -70, -84, -25, +-114,-117, -25,-115, -70, -16, -92, -96,-108, -16, -92,-100, -75, -25,-118,-107, -25,-118,-128, -16, + -92,-104,-120, -25,-119,-112, -25,-120, -88, -16, -92,-114, -85, -25,-122,-100, -16, -92,-119, -93, + -25,-123,-123, -16, -96,-108, -91, -25,-126, -83, -25,-127, -73, -25,-127, -67, -25,-127,-118, -29, + -74,-106, -25,-128,-101, -25,-128, -71, -26, -65,-122, -16, -93, -66,-114, -16, -93, -67, -98, -26, + -67, -82, -26, -73, -71, -16, -93, -69,-111, -26, -69,-121, -29, -76, -77, -26, -71, -82, -26, -72, + -81, -26, -76, -76, -16, -93, -76, -98, -26, -74,-123, -26, -75, -72, -26, -75, -87, -26, -76, -66, + -26, -76,-106, -26, -79, -89, -26, -77,-115, -26, -78, -65, -16, -93, -78, -68, -26, -79,-114, -16, + -93, -85, -70, -16, -95, -76,-117, -16, -93, -86,-115, -26, -82, -69, -26, -82, -97, -26, -83, -78, + -29, -79,-114, -26, -83,-108, -16, -93, -94, -89, -26, -84, -95, -29, -80,-104, -26, -85,-101, -16, + -93,-102, -93, -26, -86, -88, -26, -89, -86, -26, -90, -93, -26, -91,-126, -26, -92,-108, -26, -96, + -97, -26, -94,-114, -16, -93,-111, -83, -26, -95,-110, -26, -98,-123, -26, -97, -70, -29, -83,-119, + -16, -93,-113,-125, -26, -99,-109, -26, -99, -98, -26,-100, -95, -28,-113,-103, -24,-126, -83, -26, +-102,-100, -26,-100,-128, -27,-122,-107, -27,-122,-110, -29, -85, -92, -29, -84,-120, -29, -84,-103, + -26,-103,-119, -26,-101, -72, -26,-105, -93, -16, -93,-128,-118, -26,-107, -84, -29, -87, -84, -26, +-111, -73, -26,-110, -99, -26,-111, -66, -26,-111, -87, -29, -88, -82, -26,-114, -87, -26,-113,-123, + -26,-112, -94, -16, -94, -81, -79, -26,-113, -92, -26,-114,-125, -26,-115, -88, -26,-117, -68, -26, +-116, -67, -16, -94, -84,-116, -26,-115,-112, -26,-117,-108, -26,-118, -79, -26,-119, -99, -26,-120, +-101, -26,-121, -98, -26,-122, -81, -26,-122, -92, -26,-122, -78, -26,-123, -70, -26,-123,-116, -26, +-123,-120, -26,-125,-121, -16, -94,-101,-108, -29, -92,-100, -29, -92, -70, -26,-126,-127, -27, -65, + -71, -27, -65,-105, -27, -65,-115, -27, -66,-102, -29, -93, -93, -27, -67, -85, -27, -67, -94, -16, + -90,-121,-102, -16, -93,-118, -72, -29, -93,-121, -27, -68, -94, -24,-120,-127, -16, -94,-116, -79, + -27, -69, -66, -16, -86,-114,-110, -27, -70, -74, -27, -70, -77, -27, -70, -80, -29, -95, -68, -16, + -94,-122,-125, -29, -95, -94, -27, -71, -87, -27, -72, -67, -27, -72, -88, -27, -73, -67, -29, -96, + -81, -27, -73, -94, -27, -73, -95, -27, -75, -68, -27, -75, -85, -27, -75, -82, -16, -95, -73, -90, + -27, -75,-125, -16, -95, -73, -92, -27, -78,-115, -27, -77,-128, -27, -79, -96, -29, -98,-127, -27, + -80, -94, -27, -67,-109, -27, -80,-122, -27, -81, -65, -16, -95, -84,-104, -27, -81, -77, -27, -81, +-104, -27, -81,-125, -16, -95, -89,-120, -27, -84, -66, -27, -84,-120, -29,-101, -68, -29,-101, -82, + -27, -87, -90, -27, -89,-104, -27, -88, -89, -27, -88,-101, -27, -89, -84, -16, -95,-101, -86, -16, + -95,-102, -88, -27, -91, -94, -27, -92, -94, -27, -92,-102, -27, -92,-122, -27, -93, -73, -27, -93, + -78, -16, -95,-109, -92, -27, -94, -84, -27, -96, -79, -27, -96, -78, -27, -98,-117, -27, -96,-115, + -27, -97, -76, -27, -97,-114, -27, -93, -82, -27,-103, -76, -27,-103,-111, -27,-100,-105, -27,-100, +-106, -27,-105,-126, -27,-106, -77, -27,-106, -85, -27,-106,-124, -27,-107, -93, -27,-107,-109, -27, +-108,-112, -27,-109, -74, -27,-110, -94, -27,-111, -88, -27,-111,-120, -27,-112, -72, -27,-110, -98, + -27,-112,-122, -27,-113, -79, -27,-113, -85, -16, -96, -83, -93, -27,-113, -97, -27,-113,-118, -25, +-127, -80, -16, -96, -88, -84, -27,-115, -65, -27,-115, -67, -27,-115, -77, -27,-115,-102, -27,-115, +-119, -27,-116,-122, -27,-116,-123, -29,-108,-107, -27,-119, -73, -27,-119, -78, -27,-119,-122, -27, +-120, -69, -29,-109, -97, -27,-120,-125, -27,-121, -75, -16, -87,-121, -97, -27,-122, -84, -28, -69, +-116, -27,-122, -92, -27,-122,-105, -16, -96,-107,-117, -27,-122,-115, -27,-123, -89, -29,-110, -71, + -16, -96,-108,-100, -27,-123, -73, -27,-123, -92, -27,-123,-108, -16, -96,-104, -70, -29,-110, -98, + -27,-125,-113, -27,-126,-103, -27,-127, -70, -27,-128,-126, -28, -66, -69, -28, -67, -96, -16, -96, +-124, -94, -28, -71,-127, -28, -72, -72, -28, -72, -67, -23, -66,-114, -23, -67,-125, -16, -89, -69, +-109, -16, -91, -77,-112, -16, -91,-119,-119, -28,-128, -71, -28,-128,-104, -29, -82, -99, -16, -93, +-113,-107, -16, -94, -95,-124, -16, -94, -95,-118, -23, -84,-110, -23, -96,-117, -23, -97,-101, -23, +-103, -68, -23,-119, -74, -23,-122,-103, -23,-127, -78, -24, -68, -72, -24, -82,-118, -24, -85, -83, + -24, -85,-117, -24, -86, -65, -24, -90,-122, -24, -91,-127, -24, -99, -71, -24,-113, -81, -24,-115, +-110, -25, -68, -66, -25, -75,-101, -25, -79, -69, -25, -86, -79, -25, -93,-116, -25, -99,-128, -25, + -99,-118, -25,-101, -76, -25,-101,-101, -25,-104, -97, -25,-104, -99, -25,-108, -69, -25,-108,-122, + -25,-111, -79, -25,-118, -81, -25,-120, -75, -25, -98, -89, -25,-128, -98, -26, -69,-117, -26, -69, +-101, -26, -83, -71, -26, -99,-106, -26,-100,-101, -26,-107,-106, -26,-111,-110, -26,-112,-100, -26, +-113,-124, -26,-120, -76, -26,-123, -96, -26,-124,-120, -26,-123,-114, -26,-125,-104, -27, -66, -83, + -27, -67, -87, -27, -69,-103, -27, -69,-110, -27, -84, -88, -27, -87, -94, -27, -91,-108, -27, -91, +-124, -27, -94, -77, -27,-105, -94, -27,-106,-103, -27,-107,-107, -27,-117, -70, -27,-117,-121, -27, +-122,-128, -27,-123,-123, -28, -66,-128, -27,-123, -88, -27,-122, -75, -28, -72, -90, -24,-120,-104, + -16, -92,-117, -82, -26,-127, -75, -23, -96, -69, -23, -97, -65, -23,-101, -93, -24, -66, -74, -24, + -76,-120, -24, -77,-109, -24, -84, -71, -24, -84,-127, -24, -90,-106, -24, -92,-112, -24,-111,-105, + -24,-119, -71, -24,-121, -83, -24,-128,-123, -25, -67, -78, -25, -71,-127, -25, -72,-119, -25, -81, +-128, -25, -86,-127, -25, -87,-128, -25, -90,-114, -25, -90,-115, -25, -91,-106, -25, -91,-112, -25, + -91,-120, -25, -91,-119, -25, -94,-111, -25,-112, -94, -25,-120, -85, -25,-123, -82, -26, -68, -94, + -26, -72,-102, -26, -75, -73, -26, -94,-123, -26,-102,-111, -26,-105, -94, -26,-107,-113, -26,-121, + -78, -26,-122,-114, -26,-123, -88, -26,-126,-108, -27, -79, -82, -27, -79, -92, -27, -94, -88, -27, + -95,-128, -27,-103, -88, -27,-104,-122, -27,-106, -99, -27,-115,-111, -27,-117, -92, -27,-117,-119, + -27,-123,-115, -27,-125, -89, -28, -66, -82, -23,-102, -73, -23,-125, -98, -23, -74, -76, -23, -92, + -88, -23, -93, -68, -23, -93, -81, -23,-125, -67, -23,-128, -72, -24, -85, -72, -24,-104,-110, -25, + -66, -67, -25, -78, -66, -23, -99,-106, -25, -90,-113, -25, -91, -91, -25, -91, -98, -25, -92, -68, + -25,-101,-118, -25,-116, -86, -27,-121, -98, -26,-103, -76, -27, -95,-102, -27,-105,-128, -27,-123, +-128, -27, -69,-109, -24, -90,-117, -23,-103,-115, -24, -95,-116, -24, -68, -69, -26,-102, -76, -26, + -76, -98, -27, -82,-123, -25, -77,-106, -26,-117,-109, -27, -70, -90, -27,-120,-121, -27,-120, -70, + -24,-116, -74, -28, -69,-128, -24, -83,-104, -25,-126,-103, -25,-117,-128, -25, -78,-110, -25, -84, + -96, -25, -85,-117, -24,-121, -88, -26, -73,-117, -26, -98,-105, -23, -70, -97, -23, -79,-105, -23, +-102, -93, -24,-105, -70, -25,-110,-104, -25,-121,-112, -27,-112, -99, -26, -70, -70, -27,-116, -65, + -23,-101, -94, -23,-121,-116, -24, -93, -95, -24, -93,-113, -25, -67, -71, -25,-105, -94, -25,-112, +-122, -26, -77, -91, -26, -94, -88, -26, -99,-114, -26,-104,-109, -27, -79, -91, -27,-112,-113, -27, +-120, -87, -23,-102,-122, -26, -96,-105, -26,-123,-124, -27, -66,-117, -24, -68, -86, -26, -73, -86, + -27, -76,-103, -27,-128, -85, -23,-103, -72, -26,-120, -82, -23, -95, -98, -25, -76,-112, -25, -95, + -85, -25,-107,-103, -25,-112,-119, -26, -70,-100, -26, -75,-127, -26, -97, -77, -26, -99, -69, -27, +-118,-119, -23,-104, -82, -26,-102,-120, -23, -66,-115, -23,-127, -68, -24,-109, -68, -25,-103,-126, + -25,-121,-114, -26,-106,-103, -27, -80, -65, -27, -81, -82, -27,-125,-102, -28, -70,-122, -26,-125, + -95, -23,-102, -72, -23,-122, -76, -25, -90, -82, -28, -66,-117, -23, -96,-104, -23, -99,-120, -23, +-101, -74, -23,-120, -76, -24,-127,-122, -25, -66,-102, -25,-111, -87, -25,-114, -78, -26,-128,-100, + -27, -74, -70, -27,-101, -71, -28, -69, -92, -25,-115, -75, -25, -80, -66, -26, -82, -82, -26,-115, + -69, -27, -65, -75, -27, -69,-119, -24, -93,-126, -25,-125,-120, -27,-110, -67, -27,-118, -93, -27, +-120,-105, -23,-115,-118, -23,-128, -93, -24,-109, -82, -24, -68, -90, -24,-127, -81, -25, -73, -76, + -25, -89,-118, -25,-110,-119, -25,-123,-119, -26, -68, -93, -26,-110,-102, -26,-120,-128, -26,-122, +-112, -27, -71, -76, -24, -67, -94, -26, -83, -73, -26,-101,-122, -27,-118,-101, -23, -69,-114, -23, + -70,-105, -23, -87, -86, -23,-106, -83, -25, -92, -86, -26, -65, -66, -26,-105,-123, -27, -69, -84, + -27, -91, -77, -27,-111,-126, -27,-117, -75, -23,-121,-113, -24, -85,-110, -24,-119, -81, -25, -77, + -89, -26, -94,-127, -27,-121,-119, -27,-123, -87, -28, -70, -82, -25,-107, -91, -26,-114, -96, -24, +-117, -91, -26,-117, -66, -26, -78,-120, -24, -66, -80, -26, -82, -70, -24, -86, -86, -24,-111,-119, + -25,-100,-127, -27, -95, -98, -27,-113,-125, -25, -76, -94, -26,-107, -72, -26, -77,-116, -28, -72, +-115, -27, -66, -87, -28, -66, -65, -25, -93, -69, -27,-116,-105, -25,-107, -80, -25,-114,-121, -26, +-128,-110, -27, -81, -89, -28, -72, -71, -24, -85, -66, -26,-117,-113, -24, -82,-128, -23,-103, -75, + -24,-113, -79, -25, -74, -66, -25, -88,-100, -27,-121,-116, -27,-121,-100, -24,-126,-117, -27,-117, +-110, -23,-103,-117, -25, -72, -73, -25, -76, -81, -26, -68,-113, -26, -73,-102, -26, -88,-109, -27, + -79, -94, -27, -93,-104, -23,-101, -73, -24, -77,-126, -25, -93,-118, -25,-119, -94, -24,-127, -66, + -25, -79, -96, -27, -68,-124, -27, -93, -97, -24, -85,-106, -23, -71, -65, -23,-116,-124, -24,-113, +-119, -25, -74, -96, -25, -91, -65, -25, -94,-116, -23, -73, -70, -23, -83, -81, -23,-100, -78, -24, + -73, -81, -24,-103,-100, -24,-104,-122, -24,-128,-127, -25,-101, -89, -25,-120,-112, -26, -85,-109, + -26,-109,-124, -27,-117, -98, -27,-122, -73, -28, -66,-122, -23,-125,-114, -25,-117, -68, -26, -75, + -86, -26,-100,-105, -27, -69,-118, -24, -96, -97, -24,-121,-104, -26,-117,-119, -24, -91, -92, -24, +-105,-115, -26, -65, -85, -27, -75,-112, -23, -72, -98, -24,-104, -83, -25,-120,-101, -26, -84,-124, + -27,-115, -75, -28, -70,-126, -23, -89, -79, -23,-123, -86, -24,-112, -67, -25,-113, -98, -25,-125, +-103, -26, -76,-101, -26, -88,-126, -23,-126,-113, -24, -93, -72, -24, -98, -70, -24,-104, -65, -25, + -66,-123, -25,-103, -87, -26,-121, -74, -27, -91,-120, -27,-106,-121, -27, -91,-111, -23, -66,-100, + -27,-113, -91, -28, -72, -78, -26, -69,-111, -24, -77,-120, -24, -69,-118, -26,-101, -76, -24, -79, +-120, -29,-128,-119, -29,-128,-120, -30,-128,-125, -30,-128,-126, -62, -76, 96, 59, -54, -71, -16, +-111,-106, -69, -16,-111,-106, -70, -16,-111,-110, -66, -16,-111,-110, -69, -16,-111,-110, -68, -16, +-111,-115,-116, -16,-111,-115,-117, -16,-111,-124, -81, -16,-111,-124, -82, -16,-111,-126, -85, -16, +-111,-126,-100, -16,-111,-126,-102, -29,-125, -66, -29,-125, -70, -29,-125, -71, -29,-125, -72, -29, +-125, -73, -29,-125, -99, -29,-125,-100, -29,-125,-102, -29,-125,-103, -29,-125,-105, -29,-125,-106, + -29,-125,-108, -29,-125,-109, -29,-125,-111, -29,-125,-112, -29,-125,-119, -29,-125,-121, -29,-125, +-123, -29,-125,-126, -29,-125,-128, -29,-126, -66, -29,-126, -68, -29,-126, -70, -29,-126, -72, -29, +-126, -74, -29,-126, -76, -29,-126, -78, -29,-126, -80, -29,-126, -82, -29,-126, -84, -29,-125, -76, + -29,-126, -98, -29,-127, -67, -29,-127, -68, -29,-127, -70, -29,-127, -71, -29,-127, -73, -29,-127, + -74, -29,-127, -76, -29,-127, -77, -29,-127, -79, -29,-127, -80, -29,-127, -87, -29,-127, -89, -29, +-127, -91, -29,-127, -94, -29,-127, -96, -29,-127, -98, -29,-127,-100, -29,-127,-102, -29,-127,-104, + -29,-127,-106, -29,-127,-108, -29,-127,-110, -29,-127,-112, -29,-127,-114, -29,-127,-116, -29,-126, +-108, -30,-117, -83, -30,-117, -84, -30,-117, -85, -30,-117, -86, -30,-118, -81, -30,-118, -82, -30, +-118, -83, -30,-118, -84, -30,-117, -93, -30,-117, -94, -30,-118,-119, -30,-118,-120, -30,-118,-123, + -30,-118,-124, -30,-117, -95, -30,-117, -96, -30,-118,-127, -30,-118,-128, -30,-119, -71, -30,-119, + -72, -30,-119, -75, -30,-119, -76, -30,-119, -79, -30,-119, -80, -30,-119, -94, -30,-119, -83, -30, +-119,-119, -30,-119,-121, -30,-119,-124, -30,-119,-127, -30,-120, -90, -30,-120, -92, -30,-120,-116, + -30,-120,-119, -30,-120,-124, -30,-121,-114, -30,-121,-113, -30,-121,-115, -30,-122, -82, -30,-122, +-101, -30,-122,-102, -31, -65, -97, -31, -65, -98, -31, -65, -99, -31, -65,-113, -31, -65,-114, -31, + -65,-115, -31, -83,-125, -31, -83,-127, -31, -83,-128, -31, -84, -67, -31, -84, -69, -31, -84,-110, + -31, -84,-114, -31, -84,-116, -31, -84,-118, -31, -84,-120, -31, -84,-122, -19, -98, -93, -19, -98, + -94, -19, -98, -95, -19, -98, -96, -19, -98, -97, -19, -98, -98, -19, -98, -99, -19, -98,-100, -19, + -98,-101, -19, -98,-102, -19, -98,-103, -19, -98,-104, -19, -98,-105, -19, -98,-106, -19, -98,-107, + -19, -98,-108, -19, -98,-109, -19, -98,-110, -19, -98,-111, -19, -98,-112, -19, -98,-113, -19, -98, +-114, -19, -98,-115, -19, -98,-116, -19, -98,-117, -19, -98,-118, -19, -98,-119, -19, -98,-120, -19, + -98,-121, -19, -98,-122, -19, -98,-123, -19, -98,-124, -19, -98,-125, -19, -98,-126, -19, -98,-127, + -19, -98,-128, -19, -99, -65, -19, -99, -66, -19, -99, -67, -19, -99, -68, -19, -99, -69, -19, -99, + -70, -19, -99, -71, -19, -99, -72, -19, -99, -73, -19, -99, -74, -19, -99, -75, -19, -99, -76, -19, + -99, -77, -19, -99, -78, -19, -99, -79, -19, -99, -80, -19, -99, -81, -19, -99, -82, -19, -99, -83, + -19, -99, -84, -19, -99, -85, -19, -99, -86, -19, -99, -87, -19, -99, -88, -19, -99, -89, -19, -99, + -90, -19, -99, -91, -19, -99, -92, -19, -99, -93, -19, -99, -94, -19, -99, -95, -19, -99, -96, -19, + -99, -97, -19, -99, -98, -19, -99, -99, -19, -99,-100, -19, -99,-101, -19, -99,-102, -19, -99,-103, + -19, -99,-104, -19, -99,-105, -19, -99,-106, -19, -99,-107, -19, -99,-108, -19, -99,-109, -19, -99, +-110, -19, -99,-111, -19, -99,-112, -19, -99,-113, -19, -99,-114, -19, -99,-115, -19, -99,-116, -19, + -99,-117, -19, -99,-118, -19, -99,-119, -19, -99,-120, -19, -99,-121, -19, -99,-122, -19, -99,-123, + -19, -99,-124, -19, -99,-125, -19, -99,-126, -19, -99,-127, -19, -99,-128, -19,-100, -65, -19,-100, + -66, -19,-100, -67, -19,-100, -68, -19,-100, -69, -19,-100, -70, -19,-100, -71, -19,-100, -72, -19, +-100, -73, -19,-100, -74, -19,-100, -75, -19,-100, -76, -19,-100, -77, -19,-100, -78, -19,-100, -79, + -19,-100, -80, -19,-100, -81, -19,-100, -82, -19,-100, -83, -19,-100, -84, -19,-100, -85, -19,-100, + -86, -19,-100, -87, -19,-100, -88, -19,-100, -89, -19,-100, -90, -19,-100, -91, -19,-100, -92, -19, +-100, -93, -19,-100, -94, -19,-100, -95, -19,-100, -96, -19,-100, -97, -19,-100, -98, -19,-100, -99, + -19,-100,-100, -19,-100,-101, -19,-100,-102, -19,-100,-103, -19,-100,-104, -19,-100,-105, -19,-100, +-106, -19,-100,-107, -19,-100,-108, -19,-100,-109, -19,-100,-110, -19,-100,-111, -19,-100,-112, -19, +-100,-113, -19,-100,-114, -19,-100,-115, -19,-100,-116, -19,-100,-117, -19,-100,-118, -19,-100,-119, + -19,-100,-120, -19,-100,-121, -19,-100,-122, -19,-100,-123, -19,-100,-124, -19,-100,-125, -19,-100, +-126, -19,-100,-127, -19,-100,-128, -19,-101, -65, -19,-101, -66, -19,-101, -67, -19,-101, -68, -19, +-101, -69, -19,-101, -70, -19,-101, -71, -19,-101, -72, -19,-101, -73, -19,-101, -74, -19,-101, -75, + -19,-101, -76, -19,-101, -77, -19,-101, -78, -19,-101, -79, -19,-101, -80, -19,-101, -81, -19,-101, + -82, -19,-101, -83, -19,-101, -84, -19,-101, -85, -19,-101, -86, -19,-101, -87, -19,-101, -88, -19, +-101, -89, -19,-101, -90, -19,-101, -91, -19,-101, -92, -19,-101, -93, -19,-101, -94, -19,-101, -95, + -19,-101, -96, -19,-101, -97, -19,-101, -98, -19,-101, -99, -19,-101,-100, -19,-101,-101, -19,-101, +-102, -19,-101,-103, -19,-101,-104, -19,-101,-105, -19,-101,-106, -19,-101,-107, -19,-101,-108, -19, +-101,-109, -19,-101,-110, -19,-101,-111, -19,-101,-112, -19,-101,-113, -19,-101,-114, -19,-101,-115, + -19,-101,-116, -19,-101,-117, -19,-101,-118, -19,-101,-119, -19,-101,-120, -19,-101,-121, -19,-101, +-122, -19,-101,-123, -19,-101,-124, -19,-101,-125, -19,-101,-126, -19,-101,-127, -19,-101,-128, -19, +-102, -65, -19,-102, -66, -19,-102, -67, -19,-102, -68, -19,-102, -69, -19,-102, -70, -19,-102, -71, + -19,-102, -72, -19,-102, -73, -19,-102, -74, -19,-102, -75, -19,-102, -76, -19,-102, -77, -19,-102, + -78, -19,-102, -79, -19,-102, -80, -19,-102, -81, -19,-102, -82, -19,-102, -83, -19,-102, -84, -19, +-102, -85, -19,-102, -86, -19,-102, -87, -19,-102, -88, -19,-102, -89, -19,-102, -90, -19,-102, -91, + -19,-102, -92, -19,-102, -93, -19,-102, -94, -19,-102, -95, -19,-102, -96, -19,-102, -97, -19,-102, + -98, -19,-102, -99, -19,-102,-100, -19,-102,-101, -19,-102,-102, -19,-102,-103, -19,-102,-104, -19, +-102,-105, -19,-102,-106, -19,-102,-107, -19,-102,-108, -19,-102,-109, -19,-102,-110, -19,-102,-111, + -19,-102,-112, -19,-102,-113, -19,-102,-114, -19,-102,-115, -19,-102,-116, -19,-102,-117, -19,-102, +-118, -19,-102,-119, -19,-102,-120, -19,-102,-121, -19,-102,-122, -19,-102,-123, -19,-102,-124, -19, +-102,-125, -19,-102,-126, -19,-102,-127, -19,-102,-128, -19,-103, -65, -19,-103, -66, -19,-103, -67, + -19,-103, -68, -19,-103, -69, -19,-103, -70, -19,-103, -71, -19,-103, -72, -19,-103, -73, -19,-103, + -74, -19,-103, -75, -19,-103, -76, -19,-103, -77, -19,-103, -78, -19,-103, -79, -19,-103, -80, -19, +-103, -81, -19,-103, -82, -19,-103, -83, -19,-103, -84, -19,-103, -85, -19,-103, -86, -19,-103, -87, + -19,-103, -88, -19,-103, -89, -19,-103, -90, -19,-103, -91, -19,-103, -92, -19,-103, -93, -19,-103, + -94, -19,-103, -95, -19,-103, -96, -19,-103, -97, -19,-103, -98, -19,-103, -99, -19,-103,-100, -19, +-103,-101, -19,-103,-102, -19,-103,-103, -19,-103,-104, -19,-103,-105, -19,-103,-106, -19,-103,-107, + -19,-103,-108, -19,-103,-109, -19,-103,-110, -19,-103,-111, -19,-103,-112, -19,-103,-113, -19,-103, +-114, -19,-103,-115, -19,-103,-116, -19,-103,-117, -19,-103,-118, -19,-103,-119, -19,-103,-120, -19, +-103,-121, -19,-103,-122, -19,-103,-123, -19,-103,-124, -19,-103,-125, -19,-103,-126, -19,-103,-127, + -19,-103,-128, -19,-104, -65, -19,-104, -66, -19,-104, -67, -19,-104, -68, -19,-104, -69, -19,-104, + -70, -19,-104, -71, -19,-104, -72, -19,-104, -73, -19,-104, -74, -19,-104, -75, -19,-104, -76, -19, +-104, -77, -19,-104, -78, -19,-104, -79, -19,-104, -80, -19,-104, -81, -19,-104, -82, -19,-104, -83, + -19,-104, -84, -19,-104, -85, -19,-104, -86, -19,-104, -87, -19,-104, -88, -19,-104, -89, -19,-104, + -90, -19,-104, -91, -19,-104, -92, -19,-104, -93, -19,-104, -94, -19,-104, -95, -19,-104, -96, -19, +-104, -97, -19,-104, -98, -19,-104, -99, -19,-104,-100, -19,-104,-101, -19,-104,-102, -19,-104,-103, + -19,-104,-104, -19,-104,-105, -19,-104,-106, -19,-104,-107, -19,-104,-108, -19,-104,-109, -19,-104, +-110, -19,-104,-111, -19,-104,-112, -19,-104,-113, -19,-104,-114, -19,-104,-115, -19,-104,-116, -19, +-104,-117, -19,-104,-118, -19,-104,-119, -19,-104,-120, -19,-104,-121, -19,-104,-122, -19,-104,-123, + -19,-104,-124, -19,-104,-125, -19,-104,-126, -19,-104,-127, -19,-104,-128, -19,-105, -65, -19,-105, + -66, -19,-105, -67, -19,-105, -68, -19,-105, -69, -19,-105, -70, -19,-105, -71, -19,-105, -72, -19, +-105, -73, -19,-105, -74, -19,-105, -75, -19,-105, -76, -19,-105, -77, -19,-105, -78, -19,-105, -79, + -19,-105, -80, -19,-105, -81, -19,-105, -82, -19,-105, -83, -19,-105, -84, -19,-105, -85, -19,-105, + -86, -19,-105, -87, -19,-105, -88, -19,-105, -89, -19,-105, -90, -19,-105, -91, -19,-105, -92, -19, +-105, -93, -19,-105, -94, -19,-105, -95, -19,-105, -96, -19,-105, -97, -19,-105, -98, -19,-105, -99, + -19,-105,-100, -19,-105,-101, -19,-105,-102, -19,-105,-103, -19,-105,-104, -19,-105,-105, -19,-105, +-106, -19,-105,-107, -19,-105,-108, -19,-105,-109, -19,-105,-110, -19,-105,-111, -19,-105,-112, -19, +-105,-113, -19,-105,-114, -19,-105,-115, -19,-105,-116, -19,-105,-117, -19,-105,-118, -19,-105,-119, + -19,-105,-120, -19,-105,-121, -19,-105,-122, -19,-105,-123, -19,-105,-124, -19,-105,-125, -19,-105, +-126, -19,-105,-127, -19,-105,-128, -19,-106, -65, -19,-106, -66, -19,-106, -67, -19,-106, -68, -19, +-106, -69, -19,-106, -70, -19,-106, -71, -19,-106, -72, -19,-106, -73, -19,-106, -74, -19,-106, -75, + -19,-106, -76, -19,-106, -77, -19,-106, -78, -19,-106, -79, -19,-106, -80, -19,-106, -81, -19,-106, + -82, -19,-106, -83, -19,-106, -84, -19,-106, -85, -19,-106, -86, -19,-106, -87, -19,-106, -88, -19, +-106, -89, -19,-106, -90, -19,-106, -91, -19,-106, -92, -19,-106, -93, -19,-106, -94, -19,-106, -95, + -19,-106, -96, -19,-106, -97, -19,-106, -98, -19,-106, -99, -19,-106,-100, -19,-106,-101, -19,-106, +-102, -19,-106,-103, -19,-106,-104, -19,-106,-105, -19,-106,-106, -19,-106,-107, -19,-106,-108, -19, +-106,-109, -19,-106,-110, -19,-106,-111, -19,-106,-112, -19,-106,-113, -19,-106,-114, -19,-106,-115, + -19,-106,-116, -19,-106,-117, -19,-106,-118, -19,-106,-119, -19,-106,-120, -19,-106,-121, -19,-106, +-122, -19,-106,-123, -19,-106,-124, -19,-106,-125, -19,-106,-126, -19,-106,-127, -19,-106,-128, -19, +-107, -65, -19,-107, -66, -19,-107, -67, -19,-107, -68, -19,-107, -69, -19,-107, -70, -19,-107, -71, + -19,-107, -72, -19,-107, -73, -19,-107, -74, -19,-107, -75, -19,-107, -76, -19,-107, -77, -19,-107, + -78, -19,-107, -79, -19,-107, -80, -19,-107, -81, -19,-107, -82, -19,-107, -83, -19,-107, -84, -19, +-107, -85, -19,-107, -86, -19,-107, -87, -19,-107, -88, -19,-107, -89, -19,-107, -90, -19,-107, -91, + -19,-107, -92, -19,-107, -93, -19,-107, -94, -19,-107, -95, -19,-107, -96, -19,-107, -97, -19,-107, + -98, -19,-107, -99, -19,-107,-100, -19,-107,-101, -19,-107,-102, -19,-107,-103, -19,-107,-104, -19, +-107,-105, -19,-107,-106, -19,-107,-107, -19,-107,-108, -19,-107,-109, -19,-107,-110, -19,-107,-111, + -19,-107,-112, -19,-107,-113, -19,-107,-114, -19,-107,-115, -19,-107,-116, -19,-107,-117, -19,-107, +-118, -19,-107,-119, -19,-107,-120, -19,-107,-121, -19,-107,-122, -19,-107,-123, -19,-107,-124, -19, +-107,-125, -19,-107,-126, -19,-107,-127, -19,-107,-128, -19,-108, -65, -19,-108, -66, -19,-108, -67, + -19,-108, -68, -19,-108, -69, -19,-108, -70, -19,-108, -71, -19,-108, -72, -19,-108, -73, -19,-108, + -74, -19,-108, -75, -19,-108, -76, -19,-108, -77, -19,-108, -78, -19,-108, -79, -19,-108, -80, -19, +-108, -81, -19,-108, -82, -19,-108, -83, -19,-108, -84, -19,-108, -85, -19,-108, -86, -19,-108, -87, + -19,-108, -88, -19,-108, -89, -19,-108, -90, -19,-108, -91, -19,-108, -92, -19,-108, -93, -19,-108, + -94, -19,-108, -95, -19,-108, -96, -19,-108, -97, -19,-108, -98, -19,-108, -99, -19,-108,-100, -19, +-108,-101, -19,-108,-102, -19,-108,-103, -19,-108,-104, -19,-108,-105, -19,-108,-106, -19,-108,-107, + -19,-108,-108, -19,-108,-109, -19,-108,-110, -19,-108,-111, -19,-108,-112, -19,-108,-113, -19,-108, +-114, -19,-108,-115, -19,-108,-116, -19,-108,-117, -19,-108,-118, -19,-108,-119, -19,-108,-120, -19, +-108,-121, -19,-108,-122, -19,-108,-123, -19,-108,-124, -19,-108,-125, -19,-108,-126, -19,-108,-127, + -19,-108,-128, -19,-109, -65, -19,-109, -66, -19,-109, -67, -19,-109, -68, -19,-109, -69, -19,-109, + -70, -19,-109, -71, -19,-109, -72, -19,-109, -73, -19,-109, -74, -19,-109, -75, -19,-109, -76, -19, +-109, -77, -19,-109, -78, -19,-109, -79, -19,-109, -80, -19,-109, -81, -19,-109, -82, -19,-109, -83, + -19,-109, -84, -19,-109, -85, -19,-109, -86, -19,-109, -87, -19,-109, -88, -19,-109, -89, -19,-109, + -90, -19,-109, -91, -19,-109, -92, -19,-109, -93, -19,-109, -94, -19,-109, -95, -19,-109, -96, -19, +-109, -97, -19,-109, -98, -19,-109, -99, -19,-109,-100, -19,-109,-101, -19,-109,-102, -19,-109,-103, + -19,-109,-104, -19,-109,-105, -19,-109,-106, -19,-109,-107, -19,-109,-108, -19,-109,-109, -19,-109, +-110, -19,-109,-111, -19,-109,-112, -19,-109,-113, -19,-109,-114, -19,-109,-115, -19,-109,-116, -19, +-109,-117, -19,-109,-118, -19,-109,-119, -19,-109,-120, -19,-109,-121, -19,-109,-122, -19,-109,-123, + -19,-109,-124, -19,-109,-125, -19,-109,-126, -19,-109,-127, -19,-109,-128, -19,-110, -65, -19,-110, + -66, -19,-110, -67, -19,-110, -68, -19,-110, -69, -19,-110, -70, -19,-110, -71, -19,-110, -72, -19, +-110, -73, -19,-110, -74, -19,-110, -75, -19,-110, -76, -19,-110, -77, -19,-110, -78, -19,-110, -79, + -19,-110, -80, -19,-110, -81, -19,-110, -82, -19,-110, -83, -19,-110, -84, -19,-110, -85, -19,-110, + -86, -19,-110, -87, -19,-110, -88, -19,-110, -89, -19,-110, -90, -19,-110, -91, -19,-110, -92, -19, +-110, -93, -19,-110, -94, -19,-110, -95, -19,-110, -96, -19,-110, -97, -19,-110, -98, -19,-110, -99, + -19,-110,-100, -19,-110,-101, -19,-110,-102, -19,-110,-103, -19,-110,-104, -19,-110,-105, -19,-110, +-106, -19,-110,-107, -19,-110,-108, -19,-110,-109, -19,-110,-110, -19,-110,-111, -19,-110,-112, -19, +-110,-113, -19,-110,-114, -19,-110,-115, -19,-110,-116, -19,-110,-117, -19,-110,-118, -19,-110,-119, + -19,-110,-120, -19,-110,-121, -19,-110,-122, -19,-110,-123, -19,-110,-124, -19,-110,-125, -19,-110, +-126, -19,-110,-127, -19,-110,-128, -19,-111, -65, -19,-111, -66, -19,-111, -67, -19,-111, -68, -19, +-111, -69, -19,-111, -70, -19,-111, -71, -19,-111, -72, -19,-111, -73, -19,-111, -74, -19,-111, -75, + -19,-111, -76, -19,-111, -77, -19,-111, -78, -19,-111, -79, -19,-111, -80, -19,-111, -81, -19,-111, + -82, -19,-111, -83, -19,-111, -84, -19,-111, -85, -19,-111, -86, -19,-111, -87, -19,-111, -88, -19, +-111, -89, -19,-111, -90, -19,-111, -91, -19,-111, -92, -19,-111, -93, -19,-111, -94, -19,-111, -95, + -19,-111, -96, -19,-111, -97, -19,-111, -98, -19,-111, -99, -19,-111,-100, -19,-111,-101, -19,-111, +-102, -19,-111,-103, -19,-111,-104, -19,-111,-105, -19,-111,-106, -19,-111,-107, -19,-111,-108, -19, +-111,-109, -19,-111,-110, -19,-111,-111, -19,-111,-112, -19,-111,-113, -19,-111,-114, -19,-111,-115, + -19,-111,-116, -19,-111,-117, -19,-111,-118, -19,-111,-119, -19,-111,-120, -19,-111,-121, -19,-111, +-122, -19,-111,-123, -19,-111,-124, -19,-111,-125, -19,-111,-126, -19,-111,-127, -19,-111,-128, -19, +-112, -65, -19,-112, -66, -19,-112, -67, -19,-112, -68, -19,-112, -69, -19,-112, -70, -19,-112, -71, + -19,-112, -72, -19,-112, -73, -19,-112, -74, -19,-112, -75, -19,-112, -76, -19,-112, -77, -19,-112, + -78, -19,-112, -79, -19,-112, -80, -19,-112, -81, -19,-112, -82, -19,-112, -83, -19,-112, -84, -19, +-112, -85, -19,-112, -86, -19,-112, -87, -19,-112, -88, -19,-112, -89, -19,-112, -90, -19,-112, -91, + -19,-112, -92, -19,-112, -93, -19,-112, -94, -19,-112, -95, -19,-112, -96, -19,-112, -97, -19,-112, + -98, -19,-112, -99, -19,-112,-100, -19,-112,-101, -19,-112,-102, -19,-112,-103, -19,-112,-104, -19, +-112,-105, -19,-112,-106, -19,-112,-107, -19,-112,-108, -19,-112,-109, -19,-112,-110, -19,-112,-111, + -19,-112,-112, -19,-112,-113, -19,-112,-114, -19,-112,-115, -19,-112,-116, -19,-112,-117, -19,-112, +-118, -19,-112,-119, -19,-112,-120, -19,-112,-121, -19,-112,-122, -19,-112,-123, -19,-112,-124, -19, +-112,-125, -19,-112,-126, -19,-112,-127, -19,-112,-128, -19,-113, -65, -19,-113, -66, -19,-113, -67, + -19,-113, -68, -19,-113, -69, -19,-113, -70, -19,-113, -71, -19,-113, -72, -19,-113, -73, -19,-113, + -74, -19,-113, -75, -19,-113, -76, -19,-113, -77, -19,-113, -78, -19,-113, -79, -19,-113, -80, -19, +-113, -81, -19,-113, -82, -19,-113, -83, -19,-113, -84, -19,-113, -85, -19,-113, -86, -19,-113, -87, + -19,-113, -88, -19,-113, -89, -19,-113, -90, -19,-113, -91, -19,-113, -92, -19,-113, -93, -19,-113, + -94, -19,-113, -95, -19,-113, -96, -19,-113, -97, -19,-113, -98, -19,-113, -99, -19,-113,-100, -19, +-113,-101, -19,-113,-102, -19,-113,-103, -19,-113,-104, -19,-113,-105, -19,-113,-106, -19,-113,-107, + -19,-113,-108, -19,-113,-109, -19,-113,-110, -19,-113,-111, -19,-113,-112, -19,-113,-113, -19,-113, +-114, -19,-113,-115, -19,-113,-116, -19,-113,-117, -19,-113,-118, -19,-113,-119, -19,-113,-120, -19, +-113,-121, -19,-113,-122, -19,-113,-123, -19,-113,-124, -19,-113,-125, -19,-113,-126, -19,-113,-127, + -19,-113,-128, -19,-114, -65, -19,-114, -66, -19,-114, -67, -19,-114, -68, -19,-114, -69, -19,-114, + -70, -19,-114, -71, -19,-114, -72, -19,-114, -73, -19,-114, -74, -19,-114, -75, -19,-114, -76, -19, +-114, -77, -19,-114, -78, -19,-114, -79, -19,-114, -80, -19,-114, -81, -19,-114, -82, -19,-114, -83, + -19,-114, -84, -19,-114, -85, -19,-114, -86, -19,-114, -87, -19,-114, -88, -19,-114, -89, -19,-114, + -90, -19,-114, -91, -19,-114, -92, -19,-114, -93, -19,-114, -94, -19,-114, -95, -19,-114, -96, -19, +-114, -97, -19,-114, -98, -19,-114, -99, -19,-114,-100, -19,-114,-101, -19,-114,-102, -19,-114,-103, + -19,-114,-104, -19,-114,-105, -19,-114,-106, -19,-114,-107, -19,-114,-108, -19,-114,-109, -19,-114, +-110, -19,-114,-111, -19,-114,-112, -19,-114,-113, -19,-114,-114, -19,-114,-115, -19,-114,-116, -19, +-114,-117, -19,-114,-118, -19,-114,-119, -19,-114,-120, -19,-114,-121, -19,-114,-122, -19,-114,-123, + -19,-114,-124, -19,-114,-125, -19,-114,-126, -19,-114,-127, -19,-114,-128, -19,-115, -65, -19,-115, + -66, -19,-115, -67, -19,-115, -68, -19,-115, -69, -19,-115, -70, -19,-115, -71, -19,-115, -72, -19, +-115, -73, -19,-115, -74, -19,-115, -75, -19,-115, -76, -19,-115, -77, -19,-115, -78, -19,-115, -79, + -19,-115, -80, -19,-115, -81, -19,-115, -82, -19,-115, -83, -19,-115, -84, -19,-115, -85, -19,-115, + -86, -19,-115, -87, -19,-115, -88, -19,-115, -89, -19,-115, -90, -19,-115, -91, -19,-115, -92, -19, +-115, -93, -19,-115, -94, -19,-115, -95, -19,-115, -96, -19,-115, -97, -19,-115, -98, -19,-115, -99, + -19,-115,-100, -19,-115,-101, -19,-115,-102, -19,-115,-103, -19,-115,-104, -19,-115,-105, -19,-115, +-106, -19,-115,-107, -19,-115,-108, -19,-115,-109, -19,-115,-110, -19,-115,-111, -19,-115,-112, -19, +-115,-113, -19,-115,-114, -19,-115,-115, -19,-115,-116, -19,-115,-117, -19,-115,-118, -19,-115,-119, + -19,-115,-120, -19,-115,-121, -19,-115,-122, -19,-115,-123, -19,-115,-124, -19,-115,-125, -19,-115, +-126, -19,-115,-127, -19,-115,-128, -19,-116, -65, -19,-116, -66, -19,-116, -67, -19,-116, -68, -19, +-116, -69, -19,-116, -70, -19,-116, -71, -19,-116, -72, -19,-116, -73, -19,-116, -74, -19,-116, -75, + -19,-116, -76, -19,-116, -77, -19,-116, -78, -19,-116, -79, -19,-116, -80, -19,-116, -81, -19,-116, + -82, -19,-116, -83, -19,-116, -84, -19,-116, -85, -19,-116, -86, -19,-116, -87, -19,-116, -88, -19, +-116, -89, -19,-116, -90, -19,-116, -91, -19,-116, -92, -19,-116, -93, -19,-116, -94, -19,-116, -95, + -19,-116, -96, -19,-116, -97, -19,-116, -98, -19,-116, -99, -19,-116,-100, -19,-116,-101, -19,-116, +-102, -19,-116,-103, -19,-116,-104, -19,-116,-105, -19,-116,-106, -19,-116,-107, -19,-116,-108, -19, +-116,-109, -19,-116,-110, -19,-116,-111, -19,-116,-112, -19,-116,-113, -19,-116,-114, -19,-116,-115, + -19,-116,-116, -19,-116,-117, -19,-116,-118, -19,-116,-119, -19,-116,-120, -19,-116,-121, -19,-116, +-122, -19,-116,-123, -19,-116,-124, -19,-116,-125, -19,-116,-126, -19,-116,-127, -19,-116,-128, -19, +-117, -65, -19,-117, -66, -19,-117, -67, -19,-117, -68, -19,-117, -69, -19,-117, -70, -19,-117, -71, + -19,-117, -72, -19,-117, -73, -19,-117, -74, -19,-117, -75, -19,-117, -76, -19,-117, -77, -19,-117, + -78, -19,-117, -79, -19,-117, -80, -19,-117, -81, -19,-117, -82, -19,-117, -83, -19,-117, -84, -19, +-117, -85, -19,-117, -86, -19,-117, -87, -19,-117, -88, -19,-117, -89, -19,-117, -90, -19,-117, -91, + -19,-117, -92, -19,-117, -93, -19,-117, -94, -19,-117, -95, -19,-117, -96, -19,-117, -97, -19,-117, + -98, -19,-117, -99, -19,-117,-100, -19,-117,-101, -19,-117,-102, -19,-117,-103, -19,-117,-104, -19, +-117,-105, -19,-117,-106, -19,-117,-107, -19,-117,-108, -19,-117,-109, -19,-117,-110, -19,-117,-111, + -19,-117,-112, -19,-117,-113, -19,-117,-114, -19,-117,-115, -19,-117,-116, -19,-117,-117, -19,-117, +-118, -19,-117,-119, -19,-117,-120, -19,-117,-121, -19,-117,-122, -19,-117,-123, -19,-117,-124, -19, +-117,-125, -19,-117,-126, -19,-117,-127, -19,-117,-128, -19,-118, -65, -19,-118, -66, -19,-118, -67, + -19,-118, -68, -19,-118, -69, -19,-118, -70, -19,-118, -71, -19,-118, -72, -19,-118, -73, -19,-118, + -74, -19,-118, -75, -19,-118, -76, -19,-118, -77, -19,-118, -78, -19,-118, -79, -19,-118, -80, -19, +-118, -81, -19,-118, -82, -19,-118, -83, -19,-118, -84, -19,-118, -85, -19,-118, -86, -19,-118, -87, + -19,-118, -88, -19,-118, -89, -19,-118, -90, -19,-118, -91, -19,-118, -92, -19,-118, -93, -19,-118, + -94, -19,-118, -95, -19,-118, -96, -19,-118, -97, -19,-118, -98, -19,-118, -99, -19,-118,-100, -19, +-118,-101, -19,-118,-102, -19,-118,-103, -19,-118,-104, -19,-118,-105, -19,-118,-106, -19,-118,-107, + -19,-118,-108, -19,-118,-109, -19,-118,-110, -19,-118,-111, -19,-118,-112, -19,-118,-113, -19,-118, +-114, -19,-118,-115, -19,-118,-116, -19,-118,-117, -19,-118,-118, -19,-118,-119, -19,-118,-120, -19, +-118,-121, -19,-118,-122, -19,-118,-123, -19,-118,-124, -19,-118,-125, -19,-118,-126, -19,-118,-127, + -19,-118,-128, -19,-119, -65, -19,-119, -66, -19,-119, -67, -19,-119, -68, -19,-119, -69, -19,-119, + -70, -19,-119, -71, -19,-119, -72, -19,-119, -73, -19,-119, -74, -19,-119, -75, -19,-119, -76, -19, +-119, -77, -19,-119, -78, -19,-119, -79, -19,-119, -80, -19,-119, -81, -19,-119, -82, -19,-119, -83, + -19,-119, -84, -19,-119, -85, -19,-119, -86, -19,-119, -87, -19,-119, -88, -19,-119, -89, -19,-119, + -90, -19,-119, -91, -19,-119, -92, -19,-119, -93, -19,-119, -94, -19,-119, -95, -19,-119, -96, -19, +-119, -97, -19,-119, -98, -19,-119, -99, -19,-119,-100, -19,-119,-101, -19,-119,-102, -19,-119,-103, + -19,-119,-104, -19,-119,-105, -19,-119,-106, -19,-119,-107, -19,-119,-108, -19,-119,-109, -19,-119, +-110, -19,-119,-111, -19,-119,-112, -19,-119,-113, -19,-119,-114, -19,-119,-115, -19,-119,-116, -19, +-119,-117, -19,-119,-118, -19,-119,-119, -19,-119,-120, -19,-119,-121, -19,-119,-122, -19,-119,-123, + -19,-119,-124, -19,-119,-125, -19,-119,-126, -19,-119,-127, -19,-119,-128, -19,-120, -65, -19,-120, + -66, -19,-120, -67, -19,-120, -68, -19,-120, -69, -19,-120, -70, -19,-120, -71, -19,-120, -72, -19, +-120, -73, -19,-120, -74, -19,-120, -75, -19,-120, -76, -19,-120, -77, -19,-120, -78, -19,-120, -79, + -19,-120, -80, -19,-120, -81, -19,-120, -82, -19,-120, -83, -19,-120, -84, -19,-120, -85, -19,-120, + -86, -19,-120, -87, -19,-120, -88, -19,-120, -89, -19,-120, -90, -19,-120, -91, -19,-120, -92, -19, +-120, -93, -19,-120, -94, -19,-120, -95, -19,-120, -96, -19,-120, -97, -19,-120, -98, -19,-120, -99, + -19,-120,-100, -19,-120,-101, -19,-120,-102, -19,-120,-103, -19,-120,-104, -19,-120,-105, -19,-120, +-106, -19,-120,-107, -19,-120,-108, -19,-120,-109, -19,-120,-110, -19,-120,-111, -19,-120,-112, -19, +-120,-113, -19,-120,-114, -19,-120,-115, -19,-120,-116, -19,-120,-117, -19,-120,-118, -19,-120,-119, + -19,-120,-120, -19,-120,-121, -19,-120,-122, -19,-120,-123, -19,-120,-124, -19,-120,-125, -19,-120, +-126, -19,-120,-127, -19,-120,-128, -19,-121, -65, -19,-121, -66, -19,-121, -67, -19,-121, -68, -19, +-121, -69, -19,-121, -70, -19,-121, -71, -19,-121, -72, -19,-121, -73, -19,-121, -74, -19,-121, -75, + -19,-121, -76, -19,-121, -77, -19,-121, -78, -19,-121, -79, -19,-121, -80, -19,-121, -81, -19,-121, + -82, -19,-121, -83, -19,-121, -84, -19,-121, -85, -19,-121, -86, -19,-121, -87, -19,-121, -88, -19, +-121, -89, -19,-121, -90, -19,-121, -91, -19,-121, -92, -19,-121, -93, -19,-121, -94, -19,-121, -95, + -19,-121, -96, -19,-121, -97, -19,-121, -98, -19,-121, -99, -19,-121,-100, -19,-121,-101, -19,-121, +-102, -19,-121,-103, -19,-121,-104, -19,-121,-105, -19,-121,-106, -19,-121,-107, -19,-121,-108, -19, +-121,-109, -19,-121,-110, -19,-121,-111, -19,-121,-112, -19,-121,-113, -19,-121,-114, -19,-121,-115, + -19,-121,-116, -19,-121,-117, -19,-121,-118, -19,-121,-119, -19,-121,-120, -19,-121,-121, -19,-121, +-122, -19,-121,-123, -19,-121,-124, -19,-121,-125, -19,-121,-126, -19,-121,-127, -19,-121,-128, -19, +-122, -65, -19,-122, -66, -19,-122, -67, -19,-122, -68, -19,-122, -69, -19,-122, -70, -19,-122, -71, + -19,-122, -72, -19,-122, -73, -19,-122, -74, -19,-122, -75, -19,-122, -76, -19,-122, -77, -19,-122, + -78, -19,-122, -79, -19,-122, -80, -19,-122, -81, -19,-122, -82, -19,-122, -83, -19,-122, -84, -19, +-122, -85, -19,-122, -86, -19,-122, -87, -19,-122, -88, -19,-122, -89, -19,-122, -90, -19,-122, -91, + -19,-122, -92, -19,-122, -93, -19,-122, -94, -19,-122, -95, -19,-122, -96, -19,-122, -97, -19,-122, + -98, -19,-122, -99, -19,-122,-100, -19,-122,-101, -19,-122,-102, -19,-122,-103, -19,-122,-104, -19, +-122,-105, -19,-122,-106, -19,-122,-107, -19,-122,-108, -19,-122,-109, -19,-122,-110, -19,-122,-111, + -19,-122,-112, -19,-122,-113, -19,-122,-114, -19,-122,-115, -19,-122,-116, -19,-122,-117, -19,-122, +-118, -19,-122,-119, -19,-122,-120, -19,-122,-121, -19,-122,-122, -19,-122,-123, -19,-122,-124, -19, +-122,-125, -19,-122,-126, -19,-122,-127, -19,-122,-128, -19,-123, -65, -19,-123, -66, -19,-123, -67, + -19,-123, -68, -19,-123, -69, -19,-123, -70, -19,-123, -71, -19,-123, -72, -19,-123, -73, -19,-123, + -74, -19,-123, -75, -19,-123, -76, -19,-123, -77, -19,-123, -78, -19,-123, -79, -19,-123, -80, -19, +-123, -81, -19,-123, -82, -19,-123, -83, -19,-123, -84, -19,-123, -85, -19,-123, -86, -19,-123, -87, + -19,-123, -88, -19,-123, -89, -19,-123, -90, -19,-123, -91, -19,-123, -92, -19,-123, -93, -19,-123, + -94, -19,-123, -95, -19,-123, -96, -19,-123, -97, -19,-123, -98, -19,-123, -99, -19,-123,-100, -19, +-123,-101, -19,-123,-102, -19,-123,-103, -19,-123,-104, -19,-123,-105, -19,-123,-106, -19,-123,-107, + -19,-123,-108, -19,-123,-109, -19,-123,-110, -19,-123,-111, -19,-123,-112, -19,-123,-113, -19,-123, +-114, -19,-123,-115, -19,-123,-116, -19,-123,-117, -19,-123,-118, -19,-123,-119, -19,-123,-120, -19, +-123,-121, -19,-123,-122, -19,-123,-123, -19,-123,-124, -19,-123,-125, -19,-123,-126, -19,-123,-127, + -19,-123,-128, -19,-124, -65, -19,-124, -66, -19,-124, -67, -19,-124, -68, -19,-124, -69, -19,-124, + -70, -19,-124, -71, -19,-124, -72, -19,-124, -73, -19,-124, -74, -19,-124, -75, -19,-124, -76, -19, +-124, -77, -19,-124, -78, -19,-124, -79, -19,-124, -80, -19,-124, -81, -19,-124, -82, -19,-124, -83, + -19,-124, -84, -19,-124, -85, -19,-124, -86, -19,-124, -87, -19,-124, -88, -19,-124, -89, -19,-124, + -90, -19,-124, -91, -19,-124, -92, -19,-124, -93, -19,-124, -94, -19,-124, -95, -19,-124, -96, -19, +-124, -97, -19,-124, -98, -19,-124, -99, -19,-124,-100, -19,-124,-101, -19,-124,-102, -19,-124,-103, + -19,-124,-104, -19,-124,-105, -19,-124,-106, -19,-124,-107, -19,-124,-108, -19,-124,-109, -19,-124, +-110, -19,-124,-111, -19,-124,-112, -19,-124,-113, -19,-124,-114, -19,-124,-115, -19,-124,-116, -19, +-124,-117, -19,-124,-118, -19,-124,-119, -19,-124,-120, -19,-124,-121, -19,-124,-122, -19,-124,-123, + -19,-124,-124, -19,-124,-125, -19,-124,-126, -19,-124,-127, -19,-124,-128, -19,-125, -65, -19,-125, + -66, -19,-125, -67, -19,-125, -68, -19,-125, -69, -19,-125, -70, -19,-125, -71, -19,-125, -72, -19, +-125, -73, -19,-125, -74, -19,-125, -75, -19,-125, -76, -19,-125, -77, -19,-125, -78, -19,-125, -79, + -19,-125, -80, -19,-125, -81, -19,-125, -82, -19,-125, -83, -19,-125, -84, -19,-125, -85, -19,-125, + -86, -19,-125, -87, -19,-125, -88, -19,-125, -89, -19,-125, -90, -19,-125, -91, -19,-125, -92, -19, +-125, -93, -19,-125, -94, -19,-125, -95, -19,-125, -96, -19,-125, -97, -19,-125, -98, -19,-125, -99, + -19,-125,-100, -19,-125,-101, -19,-125,-102, -19,-125,-103, -19,-125,-104, -19,-125,-105, -19,-125, +-106, -19,-125,-107, -19,-125,-108, -19,-125,-109, -19,-125,-110, -19,-125,-111, -19,-125,-112, -19, +-125,-113, -19,-125,-114, -19,-125,-115, -19,-125,-116, -19,-125,-117, -19,-125,-118, -19,-125,-119, + -19,-125,-120, -19,-125,-121, -19,-125,-122, -19,-125,-123, -19,-125,-124, -19,-125,-125, -19,-125, +-126, -19,-125,-127, -19,-125,-128, -19,-126, -65, -19,-126, -66, -19,-126, -67, -19,-126, -68, -19, +-126, -69, -19,-126, -70, -19,-126, -71, -19,-126, -72, -19,-126, -73, -19,-126, -74, -19,-126, -75, + -19,-126, -76, -19,-126, -77, -19,-126, -78, -19,-126, -79, -19,-126, -80, -19,-126, -81, -19,-126, + -82, -19,-126, -83, -19,-126, -84, -19,-126, -85, -19,-126, -86, -19,-126, -87, -19,-126, -88, -19, +-126, -89, -19,-126, -90, -19,-126, -91, -19,-126, -92, -19,-126, -93, -19,-126, -94, -19,-126, -95, + -19,-126, -96, -19,-126, -97, -19,-126, -98, -19,-126, -99, -19,-126,-100, -19,-126,-101, -19,-126, +-102, -19,-126,-103, -19,-126,-104, -19,-126,-105, -19,-126,-106, -19,-126,-107, -19,-126,-108, -19, +-126,-109, -19,-126,-110, -19,-126,-111, -19,-126,-112, -19,-126,-113, -19,-126,-114, -19,-126,-115, + -19,-126,-116, -19,-126,-117, -19,-126,-118, -19,-126,-119, -19,-126,-120, -19,-126,-121, -19,-126, +-122, -19,-126,-123, -19,-126,-124, -19,-126,-125, -19,-126,-126, -19,-126,-127, -19,-126,-128, -19, +-127, -65, -19,-127, -66, -19,-127, -67, -19,-127, -68, -19,-127, -69, -19,-127, -70, -19,-127, -71, + -19,-127, -72, -19,-127, -73, -19,-127, -74, -19,-127, -75, -19,-127, -76, -19,-127, -77, -19,-127, + -78, -19,-127, -79, -19,-127, -80, -19,-127, -81, -19,-127, -82, -19,-127, -83, -19,-127, -84, -19, +-127, -85, -19,-127, -86, -19,-127, -87, -19,-127, -88, -19,-127, -89, -19,-127, -90, -19,-127, -91, + -19,-127, -92, -19,-127, -93, -19,-127, -94, -19,-127, -95, -19,-127, -96, -19,-127, -97, -19,-127, + -98, -19,-127, -99, -19,-127,-100, -19,-127,-101, -19,-127,-102, -19,-127,-103, -19,-127,-104, -19, +-127,-105, -19,-127,-106, -19,-127,-107, -19,-127,-108, -19,-127,-109, -19,-127,-110, -19,-127,-111, + -19,-127,-112, -19,-127,-113, -19,-127,-114, -19,-127,-115, -19,-127,-116, -19,-127,-117, -19,-127, +-118, -19,-127,-119, -19,-127,-120, -19,-127,-121, -19,-127,-122, -19,-127,-123, -19,-127,-124, -19, +-127,-125, -19,-127,-126, -19,-127,-127, -19,-127,-128, -19,-128, -65, -19,-128, -66, -19,-128, -67, + -19,-128, -68, -19,-128, -69, -19,-128, -70, -19,-128, -71, -19,-128, -72, -19,-128, -73, -19,-128, + -74, -19,-128, -75, -19,-128, -76, -19,-128, -77, -19,-128, -78, -19,-128, -79, -19,-128, -80, -19, +-128, -81, -19,-128, -82, -19,-128, -83, -19,-128, -84, -19,-128, -85, -19,-128, -86, -19,-128, -87, + -19,-128, -88, -19,-128, -89, -19,-128, -90, -19,-128, -91, -19,-128, -92, -19,-128, -93, -19,-128, + -94, -19,-128, -95, -19,-128, -96, -19,-128, -97, -19,-128, -98, -19,-128, -99, -19,-128,-100, -19, +-128,-101, -19,-128,-102, -19,-128,-103, -19,-128,-104, -19,-128,-105, -19,-128,-106, -19,-128,-107, + -19,-128,-108, -19,-128,-109, -19,-128,-110, -19,-128,-111, -19,-128,-112, -19,-128,-113, -19,-128, +-114, -19,-128,-115, -19,-128,-116, -19,-128,-117, -19,-128,-118, -19,-128,-119, -19,-128,-120, -19, +-128,-121, -19,-128,-122, -19,-128,-123, -19,-128,-124, -19,-128,-125, -19,-128,-126, -19,-128,-127, + -19,-128,-128, -20, -65, -65, -20, -65, -66, -20, -65, -67, -20, -65, -68, -20, -65, -69, -20, -65, + -70, -20, -65, -71, -20, -65, -72, -20, -65, -73, -20, -65, -74, -20, -65, -75, -20, -65, -76, -20, + -65, -77, -20, -65, -78, -20, -65, -79, -20, -65, -80, -20, -65, -81, -20, -65, -82, -20, -65, -83, + -20, -65, -84, -20, -65, -85, -20, -65, -86, -20, -65, -87, -20, -65, -88, -20, -65, -89, -20, -65, + -90, -20, -65, -91, -20, -65, -92, -20, -65, -93, -20, -65, -94, -20, -65, -95, -20, -65, -96, -20, + -65, -97, -20, -65, -98, -20, -65, -99, -20, -65,-100, -20, -65,-101, -20, -65,-102, -20, -65,-103, + -20, -65,-104, -20, -65,-105, -20, -65,-106, -20, -65,-107, -20, -65,-108, -20, -65,-109, -20, -65, +-110, -20, -65,-111, -20, -65,-112, -20, -65,-113, -20, -65,-114, -20, -65,-115, -20, -65,-116, -20, + -65,-117, -20, -65,-118, -20, -65,-119, -20, -65,-120, -20, -65,-121, -20, -65,-122, -20, -65,-123, + -20, -65,-124, -20, -65,-125, -20, -65,-126, -20, -65,-127, -20, -65,-128, -20, -66, -65, -20, -66, + -66, -20, -66, -67, -20, -66, -68, -20, -66, -69, -20, -66, -70, -20, -66, -71, -20, -66, -72, -20, + -66, -73, -20, -66, -74, -20, -66, -75, -20, -66, -76, -20, -66, -77, -20, -66, -78, -20, -66, -79, + -20, -66, -80, -20, -66, -81, -20, -66, -82, -20, -66, -83, -20, -66, -84, -20, -66, -85, -20, -66, + -86, -20, -66, -87, -20, -66, -88, -20, -66, -89, -20, -66, -90, -20, -66, -91, -20, -66, -92, -20, + -66, -93, -20, -66, -94, -20, -66, -95, -20, -66, -96, -20, -66, -97, -20, -66, -98, -20, -66, -99, + -20, -66,-100, -20, -66,-101, -20, -66,-102, -20, -66,-103, -20, -66,-104, -20, -66,-105, -20, -66, +-106, -20, -66,-107, -20, -66,-108, -20, -66,-109, -20, -66,-110, -20, -66,-111, -20, -66,-112, -20, + -66,-113, -20, -66,-114, -20, -66,-115, -20, -66,-116, -20, -66,-117, -20, -66,-118, -20, -66,-119, + -20, -66,-120, -20, -66,-121, -20, -66,-122, -20, -66,-123, -20, -66,-124, -20, -66,-125, -20, -66, +-126, -20, -66,-127, -20, -66,-128, -20, -67, -65, -20, -67, -66, -20, -67, -67, -20, -67, -68, -20, + -67, -69, -20, -67, -70, -20, -67, -71, -20, -67, -72, -20, -67, -73, -20, -67, -74, -20, -67, -75, + -20, -67, -76, -20, -67, -77, -20, -67, -78, -20, -67, -79, -20, -67, -80, -20, -67, -81, -20, -67, + -82, -20, -67, -83, -20, -67, -84, -20, -67, -85, -20, -67, -86, -20, -67, -87, -20, -67, -88, -20, + -67, -89, -20, -67, -90, -20, -67, -91, -20, -67, -92, -20, -67, -93, -20, -67, -94, -20, -67, -95, + -20, -67, -96, -20, -67, -97, -20, -67, -98, -20, -67, -99, -20, -67,-100, -20, -67,-101, -20, -67, +-102, -20, -67,-103, -20, -67,-104, -20, -67,-105, -20, -67,-106, -20, -67,-107, -20, -67,-108, -20, + -67,-109, -20, -67,-110, -20, -67,-111, -20, -67,-112, -20, -67,-113, -20, -67,-114, -20, -67,-115, + -20, -67,-116, -20, -67,-117, -20, -67,-118, -20, -67,-119, -20, -67,-120, -20, -67,-121, -20, -67, +-122, -20, -67,-123, -20, -67,-124, -20, -67,-125, -20, -67,-126, -20, -67,-127, -20, -67,-128, -20, + -68, -65, -20, -68, -66, -20, -68, -67, -20, -68, -68, -20, -68, -69, -20, -68, -70, -20, -68, -71, + -20, -68, -72, -20, -68, -73, -20, -68, -74, -20, -68, -75, -20, -68, -76, -20, -68, -77, -20, -68, + -78, -20, -68, -79, -20, -68, -80, -20, -68, -81, -20, -68, -82, -20, -68, -83, -20, -68, -84, -20, + -68, -85, -20, -68, -86, -20, -68, -87, -20, -68, -88, -20, -68, -89, -20, -68, -90, -20, -68, -91, + -20, -68, -92, -20, -68, -93, -20, -68, -94, -20, -68, -95, -20, -68, -96, -20, -68, -97, -20, -68, + -98, -20, -68, -99, -20, -68,-100, -20, -68,-101, -20, -68,-102, -20, -68,-103, -20, -68,-104, -20, + -68,-105, -20, -68,-106, -20, -68,-107, -20, -68,-108, -20, -68,-109, -20, -68,-110, -20, -68,-111, + -20, -68,-112, -20, -68,-113, -20, -68,-114, -20, -68,-115, -20, -68,-116, -20, -68,-117, -20, -68, +-118, -20, -68,-119, -20, -68,-120, -20, -68,-121, -20, -68,-122, -20, -68,-123, -20, -68,-124, -20, + -68,-125, -20, -68,-126, -20, -68,-127, -20, -68,-128, -20, -69, -65, -20, -69, -66, -20, -69, -67, + -20, -69, -68, -20, -69, -69, -20, -69, -70, -20, -69, -71, -20, -69, -72, -20, -69, -73, -20, -69, + -74, -20, -69, -75, -20, -69, -76, -20, -69, -77, -20, -69, -78, -20, -69, -79, -20, -69, -80, -20, + -69, -81, -20, -69, -82, -20, -69, -83, -20, -69, -84, -20, -69, -85, -20, -69, -86, -20, -69, -87, + -20, -69, -88, -20, -69, -89, -20, -69, -90, -20, -69, -91, -20, -69, -92, -20, -69, -93, -20, -69, + -94, -20, -69, -95, -20, -69, -96, -20, -69, -97, -20, -69, -98, -20, -69, -99, -20, -69,-100, -20, + -69,-101, -20, -69,-102, -20, -69,-103, -20, -69,-104, -20, -69,-105, -20, -69,-106, -20, -69,-107, + -20, -69,-108, -20, -69,-109, -20, -69,-110, -20, -69,-111, -20, -69,-112, -20, -69,-113, -20, -69, +-114, -20, -69,-115, -20, -69,-116, -20, -69,-117, -20, -69,-118, -20, -69,-119, -20, -69,-120, -20, + -69,-121, -20, -69,-122, -20, -69,-123, -20, -69,-124, -20, -69,-125, -20, -69,-126, -20, -69,-127, + -20, -69,-128, -20, -70, -65, -20, -70, -66, -20, -70, -67, -20, -70, -68, -20, -70, -69, -20, -70, + -70, -20, -70, -71, -20, -70, -72, -20, -70, -73, -20, -70, -74, -20, -70, -75, -20, -70, -76, -20, + -70, -77, -20, -70, -78, -20, -70, -79, -20, -70, -80, -20, -70, -81, -20, -70, -82, -20, -70, -83, + -20, -70, -84, -20, -70, -85, -20, -70, -86, -20, -70, -87, -20, -70, -88, -20, -70, -89, -20, -70, + -90, -20, -70, -91, -20, -70, -92, -20, -70, -93, -20, -70, -94, -20, -70, -95, -20, -70, -96, -20, + -70, -97, -20, -70, -98, -20, -70, -99, -20, -70,-100, -20, -70,-101, -20, -70,-102, -20, -70,-103, + -20, -70,-104, -20, -70,-105, -20, -70,-106, -20, -70,-107, -20, -70,-108, -20, -70,-109, -20, -70, +-110, -20, -70,-111, -20, -70,-112, -20, -70,-113, -20, -70,-114, -20, -70,-115, -20, -70,-116, -20, + -70,-117, -20, -70,-118, -20, -70,-119, -20, -70,-120, -20, -70,-121, -20, -70,-122, -20, -70,-123, + -20, -70,-124, -20, -70,-125, -20, -70,-126, -20, -70,-127, -20, -70,-128, -20, -71, -65, -20, -71, + -66, -20, -71, -67, -20, -71, -68, -20, -71, -69, -20, -71, -70, -20, -71, -71, -20, -71, -72, -20, + -71, -73, -20, -71, -74, -20, -71, -75, -20, -71, -76, -20, -71, -77, -20, -71, -78, -20, -71, -79, + -20, -71, -80, -20, -71, -81, -20, -71, -82, -20, -71, -83, -20, -71, -84, -20, -71, -85, -20, -71, + -86, -20, -71, -87, -20, -71, -88, -20, -71, -89, -20, -71, -90, -20, -71, -91, -20, -71, -92, -20, + -71, -93, -20, -71, -94, -20, -71, -95, -20, -71, -96, -20, -71, -97, -20, -71, -98, -20, -71, -99, + -20, -71,-100, -20, -71,-101, -20, -71,-102, -20, -71,-103, -20, -71,-104, -20, -71,-105, -20, -71, +-106, -20, -71,-107, -20, -71,-108, -20, -71,-109, -20, -71,-110, -20, -71,-111, -20, -71,-112, -20, + -71,-113, -20, -71,-114, -20, -71,-115, -20, -71,-116, -20, -71,-117, -20, -71,-118, -20, -71,-119, + -20, -71,-120, -20, -71,-121, -20, -71,-122, -20, -71,-123, -20, -71,-124, -20, -71,-125, -20, -71, +-126, -20, -71,-127, -20, -71,-128, -20, -72, -65, -20, -72, -66, -20, -72, -67, -20, -72, -68, -20, + -72, -69, -20, -72, -70, -20, -72, -71, -20, -72, -72, -20, -72, -73, -20, -72, -74, -20, -72, -75, + -20, -72, -76, -20, -72, -77, -20, -72, -78, -20, -72, -79, -20, -72, -80, -20, -72, -81, -20, -72, + -82, -20, -72, -83, -20, -72, -84, -20, -72, -85, -20, -72, -86, -20, -72, -87, -20, -72, -88, -20, + -72, -89, -20, -72, -90, -20, -72, -91, -20, -72, -92, -20, -72, -93, -20, -72, -94, -20, -72, -95, + -20, -72, -96, -20, -72, -97, -20, -72, -98, -20, -72, -99, -20, -72,-100, -20, -72,-101, -20, -72, +-102, -20, -72,-103, -20, -72,-104, -20, -72,-105, -20, -72,-106, -20, -72,-107, -20, -72,-108, -20, + -72,-109, -20, -72,-110, -20, -72,-111, -20, -72,-112, -20, -72,-113, -20, -72,-114, -20, -72,-115, + -20, -72,-116, -20, -72,-117, -20, -72,-118, -20, -72,-119, -20, -72,-120, -20, -72,-121, -20, -72, +-122, -20, -72,-123, -20, -72,-124, -20, -72,-125, -20, -72,-126, -20, -72,-127, -20, -72,-128, -20, + -73, -65, -20, -73, -66, -20, -73, -67, -20, -73, -68, -20, -73, -69, -20, -73, -70, -20, -73, -71, + -20, -73, -72, -20, -73, -73, -20, -73, -74, -20, -73, -75, -20, -73, -76, -20, -73, -77, -20, -73, + -78, -20, -73, -79, -20, -73, -80, -20, -73, -81, -20, -73, -82, -20, -73, -83, -20, -73, -84, -20, + -73, -85, -20, -73, -86, -20, -73, -87, -20, -73, -88, -20, -73, -89, -20, -73, -90, -20, -73, -91, + -20, -73, -92, -20, -73, -93, -20, -73, -94, -20, -73, -95, -20, -73, -96, -20, -73, -97, -20, -73, + -98, -20, -73, -99, -20, -73,-100, -20, -73,-101, -20, -73,-102, -20, -73,-103, -20, -73,-104, -20, + -73,-105, -20, -73,-106, -20, -73,-107, -20, -73,-108, -20, -73,-109, -20, -73,-110, -20, -73,-111, + -20, -73,-112, -20, -73,-113, -20, -73,-114, -20, -73,-115, -20, -73,-116, -20, -73,-117, -20, -73, +-118, -20, -73,-119, -20, -73,-120, -20, -73,-121, -20, -73,-122, -20, -73,-123, -20, -73,-124, -20, + -73,-125, -20, -73,-126, -20, -73,-127, -20, -73,-128, -20, -74, -65, -20, -74, -66, -20, -74, -67, + -20, -74, -68, -20, -74, -69, -20, -74, -70, -20, -74, -71, -20, -74, -72, -20, -74, -73, -20, -74, + -74, -20, -74, -75, -20, -74, -76, -20, -74, -77, -20, -74, -78, -20, -74, -79, -20, -74, -80, -20, + -74, -81, -20, -74, -82, -20, -74, -83, -20, -74, -84, -20, -74, -85, -20, -74, -86, -20, -74, -87, + -20, -74, -88, -20, -74, -89, -20, -74, -90, -20, -74, -91, -20, -74, -92, -20, -74, -93, -20, -74, + -94, -20, -74, -95, -20, -74, -96, -20, -74, -97, -20, -74, -98, -20, -74, -99, -20, -74,-100, -20, + -74,-101, -20, -74,-102, -20, -74,-103, -20, -74,-104, -20, -74,-105, -20, -74,-106, -20, -74,-107, + -20, -74,-108, -20, -74,-109, -20, -74,-110, -20, -74,-111, -20, -74,-112, -20, -74,-113, -20, -74, +-114, -20, -74,-115, -20, -74,-116, -20, -74,-117, -20, -74,-118, -20, -74,-119, -20, -74,-120, -20, + -74,-121, -20, -74,-122, -20, -74,-123, -20, -74,-124, -20, -74,-125, -20, -74,-126, -20, -74,-127, + -20, -74,-128, -20, -75, -65, -20, -75, -66, -20, -75, -67, -20, -75, -68, -20, -75, -69, -20, -75, + -70, -20, -75, -71, -20, -75, -72, -20, -75, -73, -20, -75, -74, -20, -75, -75, -20, -75, -76, -20, + -75, -77, -20, -75, -78, -20, -75, -79, -20, -75, -80, -20, -75, -81, -20, -75, -82, -20, -75, -83, + -20, -75, -84, -20, -75, -85, -20, -75, -86, -20, -75, -87, -20, -75, -88, -20, -75, -89, -20, -75, + -90, -20, -75, -91, -20, -75, -92, -20, -75, -93, -20, -75, -94, -20, -75, -95, -20, -75, -96, -20, + -75, -97, -20, -75, -98, -20, -75, -99, -20, -75,-100, -20, -75,-101, -20, -75,-102, -20, -75,-103, + -20, -75,-104, -20, -75,-105, -20, -75,-106, -20, -75,-107, -20, -75,-108, -20, -75,-109, -20, -75, +-110, -20, -75,-111, -20, -75,-112, -20, -75,-113, -20, -75,-114, -20, -75,-115, -20, -75,-116, -20, + -75,-117, -20, -75,-118, -20, -75,-119, -20, -75,-120, -20, -75,-121, -20, -75,-122, -20, -75,-123, + -20, -75,-124, -20, -75,-125, -20, -75,-126, -20, -75,-127, -20, -75,-128, -20, -76, -65, -20, -76, + -66, -20, -76, -67, -20, -76, -68, -20, -76, -69, -20, -76, -70, -20, -76, -71, -20, -76, -72, -20, + -76, -73, -20, -76, -74, -20, -76, -75, -20, -76, -76, -20, -76, -77, -20, -76, -78, -20, -76, -79, + -20, -76, -80, -20, -76, -81, -20, -76, -82, -20, -76, -83, -20, -76, -84, -20, -76, -85, -20, -76, + -86, -20, -76, -87, -20, -76, -88, -20, -76, -89, -20, -76, -90, -20, -76, -91, -20, -76, -92, -20, + -76, -93, -20, -76, -94, -20, -76, -95, -20, -76, -96, -20, -76, -97, -20, -76, -98, -20, -76, -99, + -20, -76,-100, -20, -76,-101, -20, -76,-102, -20, -76,-103, -20, -76,-104, -20, -76,-105, -20, -76, +-106, -20, -76,-107, -20, -76,-108, -20, -76,-109, -20, -76,-110, -20, -76,-111, -20, -76,-112, -20, + -76,-113, -20, -76,-114, -20, -76,-115, -20, -76,-116, -20, -76,-117, -20, -76,-118, -20, -76,-119, + -20, -76,-120, -20, -76,-121, -20, -76,-122, -20, -76,-123, -20, -76,-124, -20, -76,-125, -20, -76, +-126, -20, -76,-127, -20, -76,-128, -20, -77, -65, -20, -77, -66, -20, -77, -67, -20, -77, -68, -20, + -77, -69, -20, -77, -70, -20, -77, -71, -20, -77, -72, -20, -77, -73, -20, -77, -74, -20, -77, -75, + -20, -77, -76, -20, -77, -77, -20, -77, -78, -20, -77, -79, -20, -77, -80, -20, -77, -81, -20, -77, + -82, -20, -77, -83, -20, -77, -84, -20, -77, -85, -20, -77, -86, -20, -77, -87, -20, -77, -88, -20, + -77, -89, -20, -77, -90, -20, -77, -91, -20, -77, -92, -20, -77, -93, -20, -77, -94, -20, -77, -95, + -20, -77, -96, -20, -77, -97, -20, -77, -98, -20, -77, -99, -20, -77,-100, -20, -77,-101, -20, -77, +-102, -20, -77,-103, -20, -77,-104, -20, -77,-105, -20, -77,-106, -20, -77,-107, -20, -77,-108, -20, + -77,-109, -20, -77,-110, -20, -77,-111, -20, -77,-112, -20, -77,-113, -20, -77,-114, -20, -77,-115, + -20, -77,-116, -20, -77,-117, -20, -77,-118, -20, -77,-119, -20, -77,-120, -20, -77,-121, -20, -77, +-122, -20, -77,-123, -20, -77,-124, -20, -77,-125, -20, -77,-126, -20, -77,-127, -20, -77,-128, -20, + -78, -65, -20, -78, -66, -20, -78, -67, -20, -78, -68, -20, -78, -69, -20, -78, -70, -20, -78, -71, + -20, -78, -72, -20, -78, -73, -20, -78, -74, -20, -78, -75, -20, -78, -76, -20, -78, -77, -20, -78, + -78, -20, -78, -79, -20, -78, -80, -20, -78, -81, -20, -78, -82, -20, -78, -83, -20, -78, -84, -20, + -78, -85, -20, -78, -86, -20, -78, -87, -20, -78, -88, -20, -78, -89, -20, -78, -90, -20, -78, -91, + -20, -78, -92, -20, -78, -93, -20, -78, -94, -20, -78, -95, -20, -78, -96, -20, -78, -97, -20, -78, + -98, -20, -78, -99, -20, -78,-100, -20, -78,-101, -20, -78,-102, -20, -78,-103, -20, -78,-104, -20, + -78,-105, -20, -78,-106, -20, -78,-107, -20, -78,-108, -20, -78,-109, -20, -78,-110, -20, -78,-111, + -20, -78,-112, -20, -78,-113, -20, -78,-114, -20, -78,-115, -20, -78,-116, -20, -78,-117, -20, -78, +-118, -20, -78,-119, -20, -78,-120, -20, -78,-121, -20, -78,-122, -20, -78,-123, -20, -78,-124, -20, + -78,-125, -20, -78,-126, -20, -78,-127, -20, -78,-128, -20, -79, -65, -20, -79, -66, -20, -79, -67, + -20, -79, -68, -20, -79, -69, -20, -79, -70, -20, -79, -71, -20, -79, -72, -20, -79, -73, -20, -79, + -74, -20, -79, -75, -20, -79, -76, -20, -79, -77, -20, -79, -78, -20, -79, -79, -20, -79, -80, -20, + -79, -81, -20, -79, -82, -20, -79, -83, -20, -79, -84, -20, -79, -85, -20, -79, -86, -20, -79, -87, + -20, -79, -88, -20, -79, -89, -20, -79, -90, -20, -79, -91, -20, -79, -92, -20, -79, -93, -20, -79, + -94, -20, -79, -95, -20, -79, -96, -20, -79, -97, -20, -79, -98, -20, -79, -99, -20, -79,-100, -20, + -79,-101, -20, -79,-102, -20, -79,-103, -20, -79,-104, -20, -79,-105, -20, -79,-106, -20, -79,-107, + -20, -79,-108, -20, -79,-109, -20, -79,-110, -20, -79,-111, -20, -79,-112, -20, -79,-113, -20, -79, +-114, -20, -79,-115, -20, -79,-116, -20, -79,-117, -20, -79,-118, -20, -79,-119, -20, -79,-120, -20, + -79,-121, -20, -79,-122, -20, -79,-123, -20, -79,-124, -20, -79,-125, -20, -79,-126, -20, -79,-127, + -20, -79,-128, -20, -80, -65, -20, -80, -66, -20, -80, -67, -20, -80, -68, -20, -80, -69, -20, -80, + -70, -20, -80, -71, -20, -80, -72, -20, -80, -73, -20, -80, -74, -20, -80, -75, -20, -80, -76, -20, + -80, -77, -20, -80, -78, -20, -80, -79, -20, -80, -80, -20, -80, -81, -20, -80, -82, -20, -80, -83, + -20, -80, -84, -20, -80, -85, -20, -80, -86, -20, -80, -87, -20, -80, -88, -20, -80, -89, -20, -80, + -90, -20, -80, -91, -20, -80, -92, -20, -80, -93, -20, -80, -94, -20, -80, -95, -20, -80, -96, -20, + -80, -97, -20, -80, -98, -20, -80, -99, -20, -80,-100, -20, -80,-101, -20, -80,-102, -20, -80,-103, + -20, -80,-104, -20, -80,-105, -20, -80,-106, -20, -80,-107, -20, -80,-108, -20, -80,-109, -20, -80, +-110, -20, -80,-111, -20, -80,-112, -20, -80,-113, -20, -80,-114, -20, -80,-115, -20, -80,-116, -20, + -80,-117, -20, -80,-118, -20, -80,-119, -20, -80,-120, -20, -80,-121, -20, -80,-122, -20, -80,-123, + -20, -80,-124, -20, -80,-125, -20, -80,-126, -20, -80,-127, -20, -80,-128, -20, -81, -65, -20, -81, + -66, -20, -81, -67, -20, -81, -68, -20, -81, -69, -20, -81, -70, -20, -81, -71, -20, -81, -72, -20, + -81, -73, -20, -81, -74, -20, -81, -75, -20, -81, -76, -20, -81, -77, -20, -81, -78, -20, -81, -79, + -20, -81, -80, -20, -81, -81, -20, -81, -82, -20, -81, -83, -20, -81, -84, -20, -81, -85, -20, -81, + -86, -20, -81, -87, -20, -81, -88, -20, -81, -89, -20, -81, -90, -20, -81, -91, -20, -81, -92, -20, + -81, -93, -20, -81, -94, -20, -81, -95, -20, -81, -96, -20, -81, -97, -20, -81, -98, -20, -81, -99, + -20, -81,-100, -20, -81,-101, -20, -81,-102, -20, -81,-103, -20, -81,-104, -20, -81,-105, -20, -81, +-106, -20, -81,-107, -20, -81,-108, -20, -81,-109, -20, -81,-110, -20, -81,-111, -20, -81,-112, -20, + -81,-113, -20, -81,-114, -20, -81,-115, -20, -81,-116, -20, -81,-117, -20, -81,-118, -20, -81,-119, + -20, -81,-120, -20, -81,-121, -20, -81,-122, -20, -81,-123, -20, -81,-124, -20, -81,-125, -20, -81, +-126, -20, -81,-127, -20, -81,-128, -20, -82, -65, -20, -82, -66, -20, -82, -67, -20, -82, -68, -20, + -82, -69, -20, -82, -70, -20, -82, -71, -20, -82, -72, -20, -82, -73, -20, -82, -74, -20, -82, -75, + -20, -82, -76, -20, -82, -77, -20, -82, -78, -20, -82, -79, -20, -82, -80, -20, -82, -81, -20, -82, + -82, -20, -82, -83, -20, -82, -84, -20, -82, -85, -20, -82, -86, -20, -82, -87, -20, -82, -88, -20, + -82, -89, -20, -82, -90, -20, -82, -91, -20, -82, -92, -20, -82, -93, -20, -82, -94, -20, -82, -95, + -20, -82, -96, -20, -82, -97, -20, -82, -98, -20, -82, -99, -20, -82,-100, -20, -82,-101, -20, -82, +-102, -20, -82,-103, -20, -82,-104, -20, -82,-105, -20, -82,-106, -20, -82,-107, -20, -82,-108, -20, + -82,-109, -20, -82,-110, -20, -82,-111, -20, -82,-112, -20, -82,-113, -20, -82,-114, -20, -82,-115, + -20, -82,-116, -20, -82,-117, -20, -82,-118, -20, -82,-119, -20, -82,-120, -20, -82,-121, -20, -82, +-122, -20, -82,-123, -20, -82,-124, -20, -82,-125, -20, -82,-126, -20, -82,-127, -20, -82,-128, -20, + -83, -65, -20, -83, -66, -20, -83, -67, -20, -83, -68, -20, -83, -69, -20, -83, -70, -20, -83, -71, + -20, -83, -72, -20, -83, -73, -20, -83, -74, -20, -83, -75, -20, -83, -76, -20, -83, -77, -20, -83, + -78, -20, -83, -79, -20, -83, -80, -20, -83, -81, -20, -83, -82, -20, -83, -83, -20, -83, -84, -20, + -83, -85, -20, -83, -86, -20, -83, -87, -20, -83, -88, -20, -83, -89, -20, -83, -90, -20, -83, -91, + -20, -83, -92, -20, -83, -93, -20, -83, -94, -20, -83, -95, -20, -83, -96, -20, -83, -97, -20, -83, + -98, -20, -83, -99, -20, -83,-100, -20, -83,-101, -20, -83,-102, -20, -83,-103, -20, -83,-104, -20, + -83,-105, -20, -83,-106, -20, -83,-107, -20, -83,-108, -20, -83,-109, -20, -83,-110, -20, -83,-111, + -20, -83,-112, -20, -83,-113, -20, -83,-114, -20, -83,-115, -20, -83,-116, -20, -83,-117, -20, -83, +-118, -20, -83,-119, -20, -83,-120, -20, -83,-121, -20, -83,-122, -20, -83,-123, -20, -83,-124, -20, + -83,-125, -20, -83,-126, -20, -83,-127, -20, -83,-128, -20, -84, -65, -20, -84, -66, -20, -84, -67, + -20, -84, -68, -20, -84, -69, -20, -84, -70, -20, -84, -71, -20, -84, -72, -20, -84, -73, -20, -84, + -74, -20, -84, -75, -20, -84, -76, -20, -84, -77, -20, -84, -78, -20, -84, -79, -20, -84, -80, -20, + -84, -81, -20, -84, -82, -20, -84, -83, -20, -84, -84, -20, -84, -85, -20, -84, -86, -20, -84, -87, + -20, -84, -88, -20, -84, -89, -20, -84, -90, -20, -84, -91, -20, -84, -92, -20, -84, -93, -20, -84, + -94, -20, -84, -95, -20, -84, -96, -20, -84, -97, -20, -84, -98, -20, -84, -99, -20, -84,-100, -20, + -84,-101, -20, -84,-102, -20, -84,-103, -20, -84,-104, -20, -84,-105, -20, -84,-106, -20, -84,-107, + -20, -84,-108, -20, -84,-109, -20, -84,-110, -20, -84,-111, -20, -84,-112, -20, -84,-113, -20, -84, +-114, -20, -84,-115, -20, -84,-116, -20, -84,-117, -20, -84,-118, -20, -84,-119, -20, -84,-120, -20, + -84,-121, -20, -84,-122, -20, -84,-123, -20, -84,-124, -20, -84,-125, -20, -84,-126, -20, -84,-127, + -20, -84,-128, -20, -85, -65, -20, -85, -66, -20, -85, -67, -20, -85, -68, -20, -85, -69, -20, -85, + -70, -20, -85, -71, -20, -85, -72, -20, -85, -73, -20, -85, -74, -20, -85, -75, -20, -85, -76, -20, + -85, -77, -20, -85, -78, -20, -85, -79, -20, -85, -80, -20, -85, -81, -20, -85, -82, -20, -85, -83, + -20, -85, -84, -20, -85, -85, -20, -85, -86, -20, -85, -87, -20, -85, -88, -20, -85, -89, -20, -85, + -90, -20, -85, -91, -20, -85, -92, -20, -85, -93, -20, -85, -94, -20, -85, -95, -20, -85, -96, -20, + -85, -97, -20, -85, -98, -20, -85, -99, -20, -85,-100, -20, -85,-101, -20, -85,-102, -20, -85,-103, + -20, -85,-104, -20, -85,-105, -20, -85,-106, -20, -85,-107, -20, -85,-108, -20, -85,-109, -20, -85, +-110, -20, -85,-111, -20, -85,-112, -20, -85,-113, -20, -85,-114, -20, -85,-115, -20, -85,-116, -20, + -85,-117, -20, -85,-118, -20, -85,-119, -20, -85,-120, -20, -85,-121, -20, -85,-122, -20, -85,-123, + -20, -85,-124, -20, -85,-125, -20, -85,-126, -20, -85,-127, -20, -85,-128, -20, -86, -65, -20, -86, + -66, -20, -86, -67, -20, -86, -68, -20, -86, -69, -20, -86, -70, -20, -86, -71, -20, -86, -72, -20, + -86, -73, -20, -86, -74, -20, -86, -75, -20, -86, -76, -20, -86, -77, -20, -86, -78, -20, -86, -79, + -20, -86, -80, -20, -86, -81, -20, -86, -82, -20, -86, -83, -20, -86, -84, -20, -86, -85, -20, -86, + -86, -20, -86, -87, -20, -86, -88, -20, -86, -89, -20, -86, -90, -20, -86, -91, -20, -86, -92, -20, + -86, -93, -20, -86, -94, -20, -86, -95, -20, -86, -96, -20, -86, -97, -20, -86, -98, -20, -86, -99, + -20, -86,-100, -20, -86,-101, -20, -86,-102, -20, -86,-103, -20, -86,-104, -20, -86,-105, -20, -86, +-106, -20, -86,-107, -20, -86,-108, -20, -86,-109, -20, -86,-110, -20, -86,-111, -20, -86,-112, -20, + -86,-113, -20, -86,-114, -20, -86,-115, -20, -86,-116, -20, -86,-117, -20, -86,-118, -20, -86,-119, + -20, -86,-120, -20, -86,-121, -20, -86,-122, -20, -86,-123, -20, -86,-124, -20, -86,-125, -20, -86, +-126, -20, -86,-127, -20, -86,-128, -20, -87, -65, -20, -87, -66, -20, -87, -67, -20, -87, -68, -20, + -87, -69, -20, -87, -70, -20, -87, -71, -20, -87, -72, -20, -87, -73, -20, -87, -74, -20, -87, -75, + -20, -87, -76, -20, -87, -77, -20, -87, -78, -20, -87, -79, -20, -87, -80, -20, -87, -81, -20, -87, + -82, -20, -87, -83, -20, -87, -84, -20, -87, -85, -20, -87, -86, -20, -87, -87, -20, -87, -88, -20, + -87, -89, -20, -87, -90, -20, -87, -91, -20, -87, -92, -20, -87, -93, -20, -87, -94, -20, -87, -95, + -20, -87, -96, -20, -87, -97, -20, -87, -98, -20, -87, -99, -20, -87,-100, -20, -87,-101, -20, -87, +-102, -20, -87,-103, -20, -87,-104, -20, -87,-105, -20, -87,-106, -20, -87,-107, -20, -87,-108, -20, + -87,-109, -20, -87,-110, -20, -87,-111, -20, -87,-112, -20, -87,-113, -20, -87,-114, -20, -87,-115, + -20, -87,-116, -20, -87,-117, -20, -87,-118, -20, -87,-119, -20, -87,-120, -20, -87,-121, -20, -87, +-122, -20, -87,-123, -20, -87,-124, -20, -87,-125, -20, -87,-126, -20, -87,-127, -20, -87,-128, -20, + -88, -65, -20, -88, -66, -20, -88, -67, -20, -88, -68, -20, -88, -69, -20, -88, -70, -20, -88, -71, + -20, -88, -72, -20, -88, -73, -20, -88, -74, -20, -88, -75, -20, -88, -76, -20, -88, -77, -20, -88, + -78, -20, -88, -79, -20, -88, -80, -20, -88, -81, -20, -88, -82, -20, -88, -83, -20, -88, -84, -20, + -88, -85, -20, -88, -86, -20, -88, -87, -20, -88, -88, -20, -88, -89, -20, -88, -90, -20, -88, -91, + -20, -88, -92, -20, -88, -93, -20, -88, -94, -20, -88, -95, -20, -88, -96, -20, -88, -97, -20, -88, + -98, -20, -88, -99, -20, -88,-100, -20, -88,-101, -20, -88,-102, -20, -88,-103, -20, -88,-104, -20, + -88,-105, -20, -88,-106, -20, -88,-107, -20, -88,-108, -20, -88,-109, -20, -88,-110, -20, -88,-111, + -20, -88,-112, -20, -88,-113, -20, -88,-114, -20, -88,-115, -20, -88,-116, -20, -88,-117, -20, -88, +-118, -20, -88,-119, -20, -88,-120, -20, -88,-121, -20, -88,-122, -20, -88,-123, -20, -88,-124, -20, + -88,-125, -20, -88,-126, -20, -88,-127, -20, -88,-128, -20, -89, -65, -20, -89, -66, -20, -89, -67, + -20, -89, -68, -20, -89, -69, -20, -89, -70, -20, -89, -71, -20, -89, -72, -20, -89, -73, -20, -89, + -74, -20, -89, -75, -20, -89, -76, -20, -89, -77, -20, -89, -78, -20, -89, -79, -20, -89, -80, -20, + -89, -81, -20, -89, -82, -20, -89, -83, -20, -89, -84, -20, -89, -85, -20, -89, -86, -20, -89, -87, + -20, -89, -88, -20, -89, -89, -20, -89, -90, -20, -89, -91, -20, -89, -92, -20, -89, -93, -20, -89, + -94, -20, -89, -95, -20, -89, -96, -20, -89, -97, -20, -89, -98, -20, -89, -99, -20, -89,-100, -20, + -89,-101, -20, -89,-102, -20, -89,-103, -20, -89,-104, -20, -89,-105, -20, -89,-106, -20, -89,-107, + -20, -89,-108, -20, -89,-109, -20, -89,-110, -20, -89,-111, -20, -89,-112, -20, -89,-113, -20, -89, +-114, -20, -89,-115, -20, -89,-116, -20, -89,-117, -20, -89,-118, -20, -89,-119, -20, -89,-120, -20, + -89,-121, -20, -89,-122, -20, -89,-123, -20, -89,-124, -20, -89,-125, -20, -89,-126, -20, -89,-127, + -20, -89,-128, -20, -90, -65, -20, -90, -66, -20, -90, -67, -20, -90, -68, -20, -90, -69, -20, -90, + -70, -20, -90, -71, -20, -90, -72, -20, -90, -73, -20, -90, -74, -20, -90, -75, -20, -90, -76, -20, + -90, -77, -20, -90, -78, -20, -90, -79, -20, -90, -80, -20, -90, -81, -20, -90, -82, -20, -90, -83, + -20, -90, -84, -20, -90, -85, -20, -90, -86, -20, -90, -87, -20, -90, -88, -20, -90, -89, -20, -90, + -90, -20, -90, -91, -20, -90, -92, -20, -90, -93, -20, -90, -94, -20, -90, -95, -20, -90, -96, -20, + -90, -97, -20, -90, -98, -20, -90, -99, -20, -90,-100, -20, -90,-101, -20, -90,-102, -20, -90,-103, + -20, -90,-104, -20, -90,-105, -20, -90,-106, -20, -90,-107, -20, -90,-108, -20, -90,-109, -20, -90, +-110, -20, -90,-111, -20, -90,-112, -20, -90,-113, -20, -90,-114, -20, -90,-115, -20, -90,-116, -20, + -90,-117, -20, -90,-118, -20, -90,-119, -20, -90,-120, -20, -90,-121, -20, -90,-122, -20, -90,-123, + -20, -90,-124, -20, -90,-125, -20, -90,-126, -20, -90,-127, -20, -90,-128, -20, -91, -65, -20, -91, + -66, -20, -91, -67, -20, -91, -68, -20, -91, -69, -20, -91, -70, -20, -91, -71, -20, -91, -72, -20, + -91, -73, -20, -91, -74, -20, -91, -75, -20, -91, -76, -20, -91, -77, -20, -91, -78, -20, -91, -79, + -20, -91, -80, -20, -91, -81, -20, -91, -82, -20, -91, -83, -20, -91, -84, -20, -91, -85, -20, -91, + -86, -20, -91, -87, -20, -91, -88, -20, -91, -89, -20, -91, -90, -20, -91, -91, -20, -91, -92, -20, + -91, -93, -20, -91, -94, -20, -91, -95, -20, -91, -96, -20, -91, -97, -20, -91, -98, -20, -91, -99, + -20, -91,-100, -20, -91,-101, -20, -91,-102, -20, -91,-103, -20, -91,-104, -20, -91,-105, -20, -91, +-106, -20, -91,-107, -20, -91,-108, -20, -91,-109, -20, -91,-110, -20, -91,-111, -20, -91,-112, -20, + -91,-113, -20, -91,-114, -20, -91,-115, -20, -91,-116, -20, -91,-117, -20, -91,-118, -20, -91,-119, + -20, -91,-120, -20, -91,-121, -20, -91,-122, -20, -91,-123, -20, -91,-124, -20, -91,-125, -20, -91, +-126, -20, -91,-127, -20, -91,-128, -20, -92, -65, -20, -92, -66, -20, -92, -67, -20, -92, -68, -20, + -92, -69, -20, -92, -70, -20, -92, -71, -20, -92, -72, -20, -92, -73, -20, -92, -74, -20, -92, -75, + -20, -92, -76, -20, -92, -77, -20, -92, -78, -20, -92, -79, -20, -92, -80, -20, -92, -81, -20, -92, + -82, -20, -92, -83, -20, -92, -84, -20, -92, -85, -20, -92, -86, -20, -92, -87, -20, -92, -88, -20, + -92, -89, -20, -92, -90, -20, -92, -91, -20, -92, -92, -20, -92, -93, -20, -92, -94, -20, -92, -95, + -20, -92, -96, -20, -92, -97, -20, -92, -98, -20, -92, -99, -20, -92,-100, -20, -92,-101, -20, -92, +-102, -20, -92,-103, -20, -92,-104, -20, -92,-105, -20, -92,-106, -20, -92,-107, -20, -92,-108, -20, + -92,-109, -20, -92,-110, -20, -92,-111, -20, -92,-112, -20, -92,-113, -20, -92,-114, -20, -92,-115, + -20, -92,-116, -20, -92,-117, -20, -92,-118, -20, -92,-119, -20, -92,-120, -20, -92,-121, -20, -92, +-122, -20, -92,-123, -20, -92,-124, -20, -92,-125, -20, -92,-126, -20, -92,-127, -20, -92,-128, -20, + -93, -65, -20, -93, -66, -20, -93, -67, -20, -93, -68, -20, -93, -69, -20, -93, -70, -20, -93, -71, + -20, -93, -72, -20, -93, -73, -20, -93, -74, -20, -93, -75, -20, -93, -76, -20, -93, -77, -20, -93, + -78, -20, -93, -79, -20, -93, -80, -20, -93, -81, -20, -93, -82, -20, -93, -83, -20, -93, -84, -20, + -93, -85, -20, -93, -86, -20, -93, -87, -20, -93, -88, -20, -93, -89, -20, -93, -90, -20, -93, -91, + -20, -93, -92, -20, -93, -93, -20, -93, -94, -20, -93, -95, -20, -93, -96, -20, -93, -97, -20, -93, + -98, -20, -93, -99, -20, -93,-100, -20, -93,-101, -20, -93,-102, -20, -93,-103, -20, -93,-104, -20, + -93,-105, -20, -93,-106, -20, -93,-107, -20, -93,-108, -20, -93,-109, -20, -93,-110, -20, -93,-111, + -20, -93,-112, -20, -93,-113, -20, -93,-114, -20, -93,-115, -20, -93,-116, -20, -93,-117, -20, -93, +-118, -20, -93,-119, -20, -93,-120, -20, -93,-121, -20, -93,-122, -20, -93,-123, -20, -93,-124, -20, + -93,-125, -20, -93,-126, -20, -93,-127, -20, -93,-128, -20, -94, -65, -20, -94, -66, -20, -94, -67, + -20, -94, -68, -20, -94, -69, -20, -94, -70, -20, -94, -71, -20, -94, -72, -20, -94, -73, -20, -94, + -74, -20, -94, -75, -20, -94, -76, -20, -94, -77, -20, -94, -78, -20, -94, -79, -20, -94, -80, -20, + -94, -81, -20, -94, -82, -20, -94, -83, -20, -94, -84, -20, -94, -85, -20, -94, -86, -20, -94, -87, + -20, -94, -88, -20, -94, -89, -20, -94, -90, -20, -94, -91, -20, -94, -92, -20, -94, -93, -20, -94, + -94, -20, -94, -95, -20, -94, -96, -20, -94, -97, -20, -94, -98, -20, -94, -99, -20, -94,-100, -20, + -94,-101, -20, -94,-102, -20, -94,-103, -20, -94,-104, -20, -94,-105, -20, -94,-106, -20, -94,-107, + -20, -94,-108, -20, -94,-109, -20, -94,-110, -20, -94,-111, -20, -94,-112, -20, -94,-113, -20, -94, +-114, -20, -94,-115, -20, -94,-116, -20, -94,-117, -20, -94,-118, -20, -94,-119, -20, -94,-120, -20, + -94,-121, -20, -94,-122, -20, -94,-123, -20, -94,-124, -20, -94,-125, -20, -94,-126, -20, -94,-127, + -20, -94,-128, -20, -95, -65, -20, -95, -66, -20, -95, -67, -20, -95, -68, -20, -95, -69, -20, -95, + -70, -20, -95, -71, -20, -95, -72, -20, -95, -73, -20, -95, -74, -20, -95, -75, -20, -95, -76, -20, + -95, -77, -20, -95, -78, -20, -95, -79, -20, -95, -80, -20, -95, -81, -20, -95, -82, -20, -95, -83, + -20, -95, -84, -20, -95, -85, -20, -95, -86, -20, -95, -87, -20, -95, -88, -20, -95, -89, -20, -95, + -90, -20, -95, -91, -20, -95, -92, -20, -95, -93, -20, -95, -94, -20, -95, -95, -20, -95, -96, -20, + -95, -97, -20, -95, -98, -20, -95, -99, -20, -95,-100, -20, -95,-101, -20, -95,-102, -20, -95,-103, + -20, -95,-104, -20, -95,-105, -20, -95,-106, -20, -95,-107, -20, -95,-108, -20, -95,-109, -20, -95, +-110, -20, -95,-111, -20, -95,-112, -20, -95,-113, -20, -95,-114, -20, -95,-115, -20, -95,-116, -20, + -95,-117, -20, -95,-118, -20, -95,-119, -20, -95,-120, -20, -95,-121, -20, -95,-122, -20, -95,-123, + -20, -95,-124, -20, -95,-125, -20, -95,-126, -20, -95,-127, -20, -95,-128, -20, -96, -65, -20, -96, + -66, -20, -96, -67, -20, -96, -68, -20, -96, -69, -20, -96, -70, -20, -96, -71, -20, -96, -72, -20, + -96, -73, -20, -96, -74, -20, -96, -75, -20, -96, -76, -20, -96, -77, -20, -96, -78, -20, -96, -79, + -20, -96, -80, -20, -96, -81, -20, -96, -82, -20, -96, -83, -20, -96, -84, -20, -96, -85, -20, -96, + -86, -20, -96, -87, -20, -96, -88, -20, -96, -89, -20, -96, -90, -20, -96, -91, -20, -96, -92, -20, + -96, -93, -20, -96, -94, -20, -96, -95, -20, -96, -96, -20, -96, -97, -20, -96, -98, -20, -96, -99, + -20, -96,-100, -20, -96,-101, -20, -96,-102, -20, -96,-103, -20, -96,-104, -20, -96,-105, -20, -96, +-106, -20, -96,-107, -20, -96,-108, -20, -96,-109, -20, -96,-110, -20, -96,-111, -20, -96,-112, -20, + -96,-113, -20, -96,-114, -20, -96,-115, -20, -96,-116, -20, -96,-117, -20, -96,-118, -20, -96,-119, + -20, -96,-120, -20, -96,-121, -20, -96,-122, -20, -96,-123, -20, -96,-124, -20, -96,-125, -20, -96, +-126, -20, -96,-127, -20, -96,-128, -20, -97, -65, -20, -97, -66, -20, -97, -67, -20, -97, -68, -20, + -97, -69, -20, -97, -70, -20, -97, -71, -20, -97, -72, -20, -97, -73, -20, -97, -74, -20, -97, -75, + -20, -97, -76, -20, -97, -77, -20, -97, -78, -20, -97, -79, -20, -97, -80, -20, -97, -81, -20, -97, + -82, -20, -97, -83, -20, -97, -84, -20, -97, -85, -20, -97, -86, -20, -97, -87, -20, -97, -88, -20, + -97, -89, -20, -97, -90, -20, -97, -91, -20, -97, -92, -20, -97, -93, -20, -97, -94, -20, -97, -95, + -20, -97, -96, -20, -97, -97, -20, -97, -98, -20, -97, -99, -20, -97,-100, -20, -97,-101, -20, -97, +-102, -20, -97,-103, -20, -97,-104, -20, -97,-105, -20, -97,-106, -20, -97,-107, -20, -97,-108, -20, + -97,-109, -20, -97,-110, -20, -97,-111, -20, -97,-112, -20, -97,-113, -20, -97,-114, -20, -97,-115, + -20, -97,-116, -20, -97,-117, -20, -97,-118, -20, -97,-119, -20, -97,-120, -20, -97,-121, -20, -97, +-122, -20, -97,-123, -20, -97,-124, -20, -97,-125, -20, -97,-126, -20, -97,-127, -20, -97,-128, -20, + -98, -65, -20, -98, -66, -20, -98, -67, -20, -98, -68, -20, -98, -69, -20, -98, -70, -20, -98, -71, + -20, -98, -72, -20, -98, -73, -20, -98, -74, -20, -98, -75, -20, -98, -76, -20, -98, -77, -20, -98, + -78, -20, -98, -79, -20, -98, -80, -20, -98, -81, -20, -98, -82, -20, -98, -83, -20, -98, -84, -20, + -98, -85, -20, -98, -86, -20, -98, -87, -20, -98, -88, -20, -98, -89, -20, -98, -90, -20, -98, -91, + -20, -98, -92, -20, -98, -93, -20, -98, -94, -20, -98, -95, -20, -98, -96, -20, -98, -97, -20, -98, + -98, -20, -98, -99, -20, -98,-100, -20, -98,-101, -20, -98,-102, -20, -98,-103, -20, -98,-104, -20, + -98,-105, -20, -98,-106, -20, -98,-107, -20, -98,-108, -20, -98,-109, -20, -98,-110, -20, -98,-111, + -20, -98,-112, -20, -98,-113, -20, -98,-114, -20, -98,-115, -20, -98,-116, -20, -98,-117, -20, -98, +-118, -20, -98,-119, -20, -98,-120, -20, -98,-121, -20, -98,-122, -20, -98,-123, -20, -98,-124, -20, + -98,-125, -20, -98,-126, -20, -98,-127, -20, -98,-128, -20, -99, -65, -20, -99, -66, -20, -99, -67, + -20, -99, -68, -20, -99, -69, -20, -99, -70, -20, -99, -71, -20, -99, -72, -20, -99, -73, -20, -99, + -74, -20, -99, -75, -20, -99, -76, -20, -99, -77, -20, -99, -78, -20, -99, -79, -20, -99, -80, -20, + -99, -81, -20, -99, -82, -20, -99, -83, -20, -99, -84, -20, -99, -85, -20, -99, -86, -20, -99, -87, + -20, -99, -88, -20, -99, -89, -20, -99, -90, -20, -99, -91, -20, -99, -92, -20, -99, -93, -20, -99, + -94, -20, -99, -95, -20, -99, -96, -20, -99, -97, -20, -99, -98, -20, -99, -99, -20, -99,-100, -20, + -99,-101, -20, -99,-102, -20, -99,-103, -20, -99,-104, -20, -99,-105, -20, -99,-106, -20, -99,-107, + -20, -99,-108, -20, -99,-109, -20, -99,-110, -20, -99,-111, -20, -99,-112, -20, -99,-113, -20, -99, +-114, -20, -99,-115, -20, -99,-116, -20, -99,-117, -20, -99,-118, -20, -99,-119, -20, -99,-120, -20, + -99,-121, -20, -99,-122, -20, -99,-123, -20, -99,-124, -20, -99,-125, -20, -99,-126, -20, -99,-127, + -20, -99,-128, -20,-100, -65, -20,-100, -66, -20,-100, -67, -20,-100, -68, -20,-100, -69, -20,-100, + -70, -20,-100, -71, -20,-100, -72, -20,-100, -73, -20,-100, -74, -20,-100, -75, -20,-100, -76, -20, +-100, -77, -20,-100, -78, -20,-100, -79, -20,-100, -80, -20,-100, -81, -20,-100, -82, -20,-100, -83, + -20,-100, -84, -20,-100, -85, -20,-100, -86, -20,-100, -87, -20,-100, -88, -20,-100, -89, -20,-100, + -90, -20,-100, -91, -20,-100, -92, -20,-100, -93, -20,-100, -94, -20,-100, -95, -20,-100, -96, -20, +-100, -97, -20,-100, -98, -20,-100, -99, -20,-100,-100, -20,-100,-101, -20,-100,-102, -20,-100,-103, + -20,-100,-104, -20,-100,-105, -20,-100,-106, -20,-100,-107, -20,-100,-108, -20,-100,-109, -20,-100, +-110, -20,-100,-111, -20,-100,-112, -20,-100,-113, -20,-100,-114, -20,-100,-115, -20,-100,-116, -20, +-100,-117, -20,-100,-118, -20,-100,-119, -20,-100,-120, -20,-100,-121, -20,-100,-122, -20,-100,-123, + -20,-100,-124, -20,-100,-125, -20,-100,-126, -20,-100,-127, -20,-100,-128, -20,-101, -65, -20,-101, + -66, -20,-101, -67, -20,-101, -68, -20,-101, -69, -20,-101, -70, -20,-101, -71, -20,-101, -72, -20, +-101, -73, -20,-101, -74, -20,-101, -75, -20,-101, -76, -20,-101, -77, -20,-101, -78, -20,-101, -79, + -20,-101, -80, -20,-101, -81, -20,-101, -82, -20,-101, -83, -20,-101, -84, -20,-101, -85, -20,-101, + -86, -20,-101, -87, -20,-101, -88, -20,-101, -89, -20,-101, -90, -20,-101, -91, -20,-101, -92, -20, +-101, -93, -20,-101, -94, -20,-101, -95, -20,-101, -96, -20,-101, -97, -20,-101, -98, -20,-101, -99, + -20,-101,-100, -20,-101,-101, -20,-101,-102, -20,-101,-103, -20,-101,-104, -20,-101,-105, -20,-101, +-106, -20,-101,-107, -20,-101,-108, -20,-101,-109, -20,-101,-110, -20,-101,-111, -20,-101,-112, -20, +-101,-113, -20,-101,-114, -20,-101,-115, -20,-101,-116, -20,-101,-117, -20,-101,-118, -20,-101,-119, + -20,-101,-120, -20,-101,-121, -20,-101,-122, -20,-101,-123, -20,-101,-124, -20,-101,-125, -20,-101, +-126, -20,-101,-127, -20,-101,-128, -20,-102, -65, -20,-102, -66, -20,-102, -67, -20,-102, -68, -20, +-102, -69, -20,-102, -70, -20,-102, -71, -20,-102, -72, -20,-102, -73, -20,-102, -74, -20,-102, -75, + -20,-102, -76, -20,-102, -77, -20,-102, -78, -20,-102, -79, -20,-102, -80, -20,-102, -81, -20,-102, + -82, -20,-102, -83, -20,-102, -84, -20,-102, -85, -20,-102, -86, -20,-102, -87, -20,-102, -88, -20, +-102, -89, -20,-102, -90, -20,-102, -91, -20,-102, -92, -20,-102, -93, -20,-102, -94, -20,-102, -95, + -20,-102, -96, -20,-102, -97, -20,-102, -98, -20,-102, -99, -20,-102,-100, -20,-102,-101, -20,-102, +-102, -20,-102,-103, -20,-102,-104, -20,-102,-105, -20,-102,-106, -20,-102,-107, -20,-102,-108, -20, +-102,-109, -20,-102,-110, -20,-102,-111, -20,-102,-112, -20,-102,-113, -20,-102,-114, -20,-102,-115, + -20,-102,-116, -20,-102,-117, -20,-102,-118, -20,-102,-119, -20,-102,-120, -20,-102,-121, -20,-102, +-122, -20,-102,-123, -20,-102,-124, -20,-102,-125, -20,-102,-126, -20,-102,-127, -20,-102,-128, -20, +-103, -65, -20,-103, -66, -20,-103, -67, -20,-103, -68, -20,-103, -69, -20,-103, -70, -20,-103, -71, + -20,-103, -72, -20,-103, -73, -20,-103, -74, -20,-103, -75, -20,-103, -76, -20,-103, -77, -20,-103, + -78, -20,-103, -79, -20,-103, -80, -20,-103, -81, -20,-103, -82, -20,-103, -83, -20,-103, -84, -20, +-103, -85, -20,-103, -86, -20,-103, -87, -20,-103, -88, -20,-103, -89, -20,-103, -90, -20,-103, -91, + -20,-103, -92, -20,-103, -93, -20,-103, -94, -20,-103, -95, -20,-103, -96, -20,-103, -97, -20,-103, + -98, -20,-103, -99, -20,-103,-100, -20,-103,-101, -20,-103,-102, -20,-103,-103, -20,-103,-104, -20, +-103,-105, -20,-103,-106, -20,-103,-107, -20,-103,-108, -20,-103,-109, -20,-103,-110, -20,-103,-111, + -20,-103,-112, -20,-103,-113, -20,-103,-114, -20,-103,-115, -20,-103,-116, -20,-103,-117, -20,-103, +-118, -20,-103,-119, -20,-103,-120, -20,-103,-121, -20,-103,-122, -20,-103,-123, -20,-103,-124, -20, +-103,-125, -20,-103,-126, -20,-103,-127, -20,-103,-128, -20,-104, -65, -20,-104, -66, -20,-104, -67, + -20,-104, -68, -20,-104, -69, -20,-104, -70, -20,-104, -71, -20,-104, -72, -20,-104, -73, -20,-104, + -74, -20,-104, -75, -20,-104, -76, -20,-104, -77, -20,-104, -78, -20,-104, -79, -20,-104, -80, -20, +-104, -81, -20,-104, -82, -20,-104, -83, -20,-104, -84, -20,-104, -85, -20,-104, -86, -20,-104, -87, + -20,-104, -88, -20,-104, -89, -20,-104, -90, -20,-104, -91, -20,-104, -92, -20,-104, -93, -20,-104, + -94, -20,-104, -95, -20,-104, -96, -20,-104, -97, -20,-104, -98, -20,-104, -99, -20,-104,-100, -20, +-104,-101, -20,-104,-102, -20,-104,-103, -20,-104,-104, -20,-104,-105, -20,-104,-106, -20,-104,-107, + -20,-104,-108, -20,-104,-109, -20,-104,-110, -20,-104,-111, -20,-104,-112, -20,-104,-113, -20,-104, +-114, -20,-104,-115, -20,-104,-116, -20,-104,-117, -20,-104,-118, -20,-104,-119, -20,-104,-120, -20, +-104,-121, -20,-104,-122, -20,-104,-123, -20,-104,-124, -20,-104,-125, -20,-104,-126, -20,-104,-127, + -20,-104,-128, -20,-105, -65, -20,-105, -66, -20,-105, -67, -20,-105, -68, -20,-105, -69, -20,-105, + -70, -20,-105, -71, -20,-105, -72, -20,-105, -73, -20,-105, -74, -20,-105, -75, -20,-105, -76, -20, +-105, -77, -20,-105, -78, -20,-105, -79, -20,-105, -80, -20,-105, -81, -20,-105, -82, -20,-105, -83, + -20,-105, -84, -20,-105, -85, -20,-105, -86, -20,-105, -87, -20,-105, -88, -20,-105, -89, -20,-105, + -90, -20,-105, -91, -20,-105, -92, -20,-105, -93, -20,-105, -94, -20,-105, -95, -20,-105, -96, -20, +-105, -97, -20,-105, -98, -20,-105, -99, -20,-105,-100, -20,-105,-101, -20,-105,-102, -20,-105,-103, + -20,-105,-104, -20,-105,-105, -20,-105,-106, -20,-105,-107, -20,-105,-108, -20,-105,-109, -20,-105, +-110, -20,-105,-111, -20,-105,-112, -20,-105,-113, -20,-105,-114, -20,-105,-115, -20,-105,-116, -20, +-105,-117, -20,-105,-118, -20,-105,-119, -20,-105,-120, -20,-105,-121, -20,-105,-122, -20,-105,-123, + -20,-105,-124, -20,-105,-125, -20,-105,-126, -20,-105,-127, -20,-105,-128, -20,-106, -65, -20,-106, + -66, -20,-106, -67, -20,-106, -68, -20,-106, -69, -20,-106, -70, -20,-106, -71, -20,-106, -72, -20, +-106, -73, -20,-106, -74, -20,-106, -75, -20,-106, -76, -20,-106, -77, -20,-106, -78, -20,-106, -79, + -20,-106, -80, -20,-106, -81, -20,-106, -82, -20,-106, -83, -20,-106, -84, -20,-106, -85, -20,-106, + -86, -20,-106, -87, -20,-106, -88, -20,-106, -89, -20,-106, -90, -20,-106, -91, -20,-106, -92, -20, +-106, -93, -20,-106, -94, -20,-106, -95, -20,-106, -96, -20,-106, -97, -20,-106, -98, -20,-106, -99, + -20,-106,-100, -20,-106,-101, -20,-106,-102, -20,-106,-103, -20,-106,-104, -20,-106,-105, -20,-106, +-106, -20,-106,-107, -20,-106,-108, -20,-106,-109, -20,-106,-110, -20,-106,-111, -20,-106,-112, -20, +-106,-113, -20,-106,-114, -20,-106,-115, -20,-106,-116, -20,-106,-117, -20,-106,-118, -20,-106,-119, + -20,-106,-120, -20,-106,-121, -20,-106,-122, -20,-106,-123, -20,-106,-124, -20,-106,-125, -20,-106, +-126, -20,-106,-127, -20,-106,-128, -20,-107, -65, -20,-107, -66, -20,-107, -67, -20,-107, -68, -20, +-107, -69, -20,-107, -70, -20,-107, -71, -20,-107, -72, -20,-107, -73, -20,-107, -74, -20,-107, -75, + -20,-107, -76, -20,-107, -77, -20,-107, -78, -20,-107, -79, -20,-107, -80, -20,-107, -81, -20,-107, + -82, -20,-107, -83, -20,-107, -84, -20,-107, -85, -20,-107, -86, -20,-107, -87, -20,-107, -88, -20, +-107, -89, -20,-107, -90, -20,-107, -91, -20,-107, -92, -20,-107, -93, -20,-107, -94, -20,-107, -95, + -20,-107, -96, -20,-107, -97, -20,-107, -98, -20,-107, -99, -20,-107,-100, -20,-107,-101, -20,-107, +-102, -20,-107,-103, -20,-107,-104, -20,-107,-105, -20,-107,-106, -20,-107,-107, -20,-107,-108, -20, +-107,-109, -20,-107,-110, -20,-107,-111, -20,-107,-112, -20,-107,-113, -20,-107,-114, -20,-107,-115, + -20,-107,-116, -20,-107,-117, -20,-107,-118, -20,-107,-119, -20,-107,-120, -20,-107,-121, -20,-107, +-122, -20,-107,-123, -20,-107,-124, -20,-107,-125, -20,-107,-126, -20,-107,-127, -20,-107,-128, -20, +-108, -65, -20,-108, -66, -20,-108, -67, -20,-108, -68, -20,-108, -69, -20,-108, -70, -20,-108, -71, + -20,-108, -72, -20,-108, -73, -20,-108, -74, -20,-108, -75, -20,-108, -76, -20,-108, -77, -20,-108, + -78, -20,-108, -79, -20,-108, -80, -20,-108, -81, -20,-108, -82, -20,-108, -83, -20,-108, -84, -20, +-108, -85, -20,-108, -86, -20,-108, -87, -20,-108, -88, -20,-108, -89, -20,-108, -90, -20,-108, -91, + -20,-108, -92, -20,-108, -93, -20,-108, -94, -20,-108, -95, -20,-108, -96, -20,-108, -97, -20,-108, + -98, -20,-108, -99, -20,-108,-100, -20,-108,-101, -20,-108,-102, -20,-108,-103, -20,-108,-104, -20, +-108,-105, -20,-108,-106, -20,-108,-107, -20,-108,-108, -20,-108,-109, -20,-108,-110, -20,-108,-111, + -20,-108,-112, -20,-108,-113, -20,-108,-114, -20,-108,-115, -20,-108,-116, -20,-108,-117, -20,-108, +-118, -20,-108,-119, -20,-108,-120, -20,-108,-121, -20,-108,-122, -20,-108,-123, -20,-108,-124, -20, +-108,-125, -20,-108,-126, -20,-108,-127, -20,-108,-128, -20,-109, -65, -20,-109, -66, -20,-109, -67, + -20,-109, -68, -20,-109, -69, -20,-109, -70, -20,-109, -71, -20,-109, -72, -20,-109, -73, -20,-109, + -74, -20,-109, -75, -20,-109, -76, -20,-109, -77, -20,-109, -78, -20,-109, -79, -20,-109, -80, -20, +-109, -81, -20,-109, -82, -20,-109, -83, -20,-109, -84, -20,-109, -85, -20,-109, -86, -20,-109, -87, + -20,-109, -88, -20,-109, -89, -20,-109, -90, -20,-109, -91, -20,-109, -92, -20,-109, -93, -20,-109, + -94, -20,-109, -95, -20,-109, -96, -20,-109, -97, -20,-109, -98, -20,-109, -99, -20,-109,-100, -20, +-109,-101, -20,-109,-102, -20,-109,-103, -20,-109,-104, -20,-109,-105, -20,-109,-106, -20,-109,-107, + -20,-109,-108, -20,-109,-109, -20,-109,-110, -20,-109,-111, -20,-109,-112, -20,-109,-113, -20,-109, +-114, -20,-109,-115, -20,-109,-116, -20,-109,-117, -20,-109,-118, -20,-109,-119, -20,-109,-120, -20, +-109,-121, -20,-109,-122, -20,-109,-123, -20,-109,-124, -20,-109,-125, -20,-109,-126, -20,-109,-127, + -20,-109,-128, -20,-110, -65, -20,-110, -66, -20,-110, -67, -20,-110, -68, -20,-110, -69, -20,-110, + -70, -20,-110, -71, -20,-110, -72, -20,-110, -73, -20,-110, -74, -20,-110, -75, -20,-110, -76, -20, +-110, -77, -20,-110, -78, -20,-110, -79, -20,-110, -80, -20,-110, -81, -20,-110, -82, -20,-110, -83, + -20,-110, -84, -20,-110, -85, -20,-110, -86, -20,-110, -87, -20,-110, -88, -20,-110, -89, -20,-110, + -90, -20,-110, -91, -20,-110, -92, -20,-110, -93, -20,-110, -94, -20,-110, -95, -20,-110, -96, -20, +-110, -97, -20,-110, -98, -20,-110, -99, -20,-110,-100, -20,-110,-101, -20,-110,-102, -20,-110,-103, + -20,-110,-104, -20,-110,-105, -20,-110,-106, -20,-110,-107, -20,-110,-108, -20,-110,-109, -20,-110, +-110, -20,-110,-111, -20,-110,-112, -20,-110,-113, -20,-110,-114, -20,-110,-115, -20,-110,-116, -20, +-110,-117, -20,-110,-118, -20,-110,-119, -20,-110,-120, -20,-110,-121, -20,-110,-122, -20,-110,-123, + -20,-110,-124, -20,-110,-125, -20,-110,-126, -20,-110,-127, -20,-110,-128, -20,-111, -65, -20,-111, + -66, -20,-111, -67, -20,-111, -68, -20,-111, -69, -20,-111, -70, -20,-111, -71, -20,-111, -72, -20, +-111, -73, -20,-111, -74, -20,-111, -75, -20,-111, -76, -20,-111, -77, -20,-111, -78, -20,-111, -79, + -20,-111, -80, -20,-111, -81, -20,-111, -82, -20,-111, -83, -20,-111, -84, -20,-111, -85, -20,-111, + -86, -20,-111, -87, -20,-111, -88, -20,-111, -89, -20,-111, -90, -20,-111, -91, -20,-111, -92, -20, +-111, -93, -20,-111, -94, -20,-111, -95, -20,-111, -96, -20,-111, -97, -20,-111, -98, -20,-111, -99, + -20,-111,-100, -20,-111,-101, -20,-111,-102, -20,-111,-103, -20,-111,-104, -20,-111,-105, -20,-111, +-106, -20,-111,-107, -20,-111,-108, -20,-111,-109, -20,-111,-110, -20,-111,-111, -20,-111,-112, -20, +-111,-113, -20,-111,-114, -20,-111,-115, -20,-111,-116, -20,-111,-117, -20,-111,-118, -20,-111,-119, + -20,-111,-120, -20,-111,-121, -20,-111,-122, -20,-111,-123, -20,-111,-124, -20,-111,-125, -20,-111, +-126, -20,-111,-127, -20,-111,-128, -20,-112, -65, -20,-112, -66, -20,-112, -67, -20,-112, -68, -20, +-112, -69, -20,-112, -70, -20,-112, -71, -20,-112, -72, -20,-112, -73, -20,-112, -74, -20,-112, -75, + -20,-112, -76, -20,-112, -77, -20,-112, -78, -20,-112, -79, -20,-112, -80, -20,-112, -81, -20,-112, + -82, -20,-112, -83, -20,-112, -84, -20,-112, -85, -20,-112, -86, -20,-112, -87, -20,-112, -88, -20, +-112, -89, -20,-112, -90, -20,-112, -91, -20,-112, -92, -20,-112, -93, -20,-112, -94, -20,-112, -95, + -20,-112, -96, -20,-112, -97, -20,-112, -98, -20,-112, -99, -20,-112,-100, -20,-112,-101, -20,-112, +-102, -20,-112,-103, -20,-112,-104, -20,-112,-105, -20,-112,-106, -20,-112,-107, -20,-112,-108, -20, +-112,-109, -20,-112,-110, -20,-112,-111, -20,-112,-112, -20,-112,-113, -20,-112,-114, -20,-112,-115, + -20,-112,-116, -20,-112,-117, -20,-112,-118, -20,-112,-119, -20,-112,-120, -20,-112,-121, -20,-112, +-122, -20,-112,-123, -20,-112,-124, -20,-112,-125, -20,-112,-126, -20,-112,-127, -20,-112,-128, -20, +-113, -65, -20,-113, -66, -20,-113, -67, -20,-113, -68, -20,-113, -69, -20,-113, -70, -20,-113, -71, + -20,-113, -72, -20,-113, -73, -20,-113, -74, -20,-113, -75, -20,-113, -76, -20,-113, -77, -20,-113, + -78, -20,-113, -79, -20,-113, -80, -20,-113, -81, -20,-113, -82, -20,-113, -83, -20,-113, -84, -20, +-113, -85, -20,-113, -86, -20,-113, -87, -20,-113, -88, -20,-113, -89, -20,-113, -90, -20,-113, -91, + -20,-113, -92, -20,-113, -93, -20,-113, -94, -20,-113, -95, -20,-113, -96, -20,-113, -97, -20,-113, + -98, -20,-113, -99, -20,-113,-100, -20,-113,-101, -20,-113,-102, -20,-113,-103, -20,-113,-104, -20, +-113,-105, -20,-113,-106, -20,-113,-107, -20,-113,-108, -20,-113,-109, -20,-113,-110, -20,-113,-111, + -20,-113,-112, -20,-113,-113, -20,-113,-114, -20,-113,-115, -20,-113,-116, -20,-113,-117, -20,-113, +-118, -20,-113,-119, -20,-113,-120, -20,-113,-121, -20,-113,-122, -20,-113,-123, -20,-113,-124, -20, +-113,-125, -20,-113,-126, -20,-113,-127, -20,-113,-128, -20,-114, -65, -20,-114, -66, -20,-114, -67, + -20,-114, -68, -20,-114, -69, -20,-114, -70, -20,-114, -71, -20,-114, -72, -20,-114, -73, -20,-114, + -74, -20,-114, -75, -20,-114, -76, -20,-114, -77, -20,-114, -78, -20,-114, -79, -20,-114, -80, -20, +-114, -81, -20,-114, -82, -20,-114, -83, -20,-114, -84, -20,-114, -85, -20,-114, -86, -20,-114, -87, + -20,-114, -88, -20,-114, -89, -20,-114, -90, -20,-114, -91, -20,-114, -92, -20,-114, -93, -20,-114, + -94, -20,-114, -95, -20,-114, -96, -20,-114, -97, -20,-114, -98, -20,-114, -99, -20,-114,-100, -20, +-114,-101, -20,-114,-102, -20,-114,-103, -20,-114,-104, -20,-114,-105, -20,-114,-106, -20,-114,-107, + -20,-114,-108, -20,-114,-109, -20,-114,-110, -20,-114,-111, -20,-114,-112, -20,-114,-113, -20,-114, +-114, -20,-114,-115, -20,-114,-116, -20,-114,-117, -20,-114,-118, -20,-114,-119, -20,-114,-120, -20, +-114,-121, -20,-114,-122, -20,-114,-123, -20,-114,-124, -20,-114,-125, -20,-114,-126, -20,-114,-127, + -20,-114,-128, -20,-115, -65, -20,-115, -66, -20,-115, -67, -20,-115, -68, -20,-115, -69, -20,-115, + -70, -20,-115, -71, -20,-115, -72, -20,-115, -73, -20,-115, -74, -20,-115, -75, -20,-115, -76, -20, +-115, -77, -20,-115, -78, -20,-115, -79, -20,-115, -80, -20,-115, -81, -20,-115, -82, -20,-115, -83, + -20,-115, -84, -20,-115, -85, -20,-115, -86, -20,-115, -87, -20,-115, -88, -20,-115, -89, -20,-115, + -90, -20,-115, -91, -20,-115, -92, -20,-115, -93, -20,-115, -94, -20,-115, -95, -20,-115, -96, -20, +-115, -97, -20,-115, -98, -20,-115, -99, -20,-115,-100, -20,-115,-101, -20,-115,-102, -20,-115,-103, + -20,-115,-104, -20,-115,-105, -20,-115,-106, -20,-115,-107, -20,-115,-108, -20,-115,-109, -20,-115, +-110, -20,-115,-111, -20,-115,-112, -20,-115,-113, -20,-115,-114, -20,-115,-115, -20,-115,-116, -20, +-115,-117, -20,-115,-118, -20,-115,-119, -20,-115,-120, -20,-115,-121, -20,-115,-122, -20,-115,-123, + -20,-115,-124, -20,-115,-125, -20,-115,-126, -20,-115,-127, -20,-115,-128, -20,-116, -65, -20,-116, + -66, -20,-116, -67, -20,-116, -68, -20,-116, -69, -20,-116, -70, -20,-116, -71, -20,-116, -72, -20, +-116, -73, -20,-116, -74, -20,-116, -75, -20,-116, -76, -20,-116, -77, -20,-116, -78, -20,-116, -79, + -20,-116, -80, -20,-116, -81, -20,-116, -82, -20,-116, -83, -20,-116, -84, -20,-116, -85, -20,-116, + -86, -20,-116, -87, -20,-116, -88, -20,-116, -89, -20,-116, -90, -20,-116, -91, -20,-116, -92, -20, +-116, -93, -20,-116, -94, -20,-116, -95, -20,-116, -96, -20,-116, -97, -20,-116, -98, -20,-116, -99, + -20,-116,-100, -20,-116,-101, -20,-116,-102, -20,-116,-103, -20,-116,-104, -20,-116,-105, -20,-116, +-106, -20,-116,-107, -20,-116,-108, -20,-116,-109, -20,-116,-110, -20,-116,-111, -20,-116,-112, -20, +-116,-113, -20,-116,-114, -20,-116,-115, -20,-116,-116, -20,-116,-117, -20,-116,-118, -20,-116,-119, + -20,-116,-120, -20,-116,-121, -20,-116,-122, -20,-116,-123, -20,-116,-124, -20,-116,-125, -20,-116, +-126, -20,-116,-127, -20,-116,-128, -20,-117, -65, -20,-117, -66, -20,-117, -67, -20,-117, -68, -20, +-117, -69, -20,-117, -70, -20,-117, -71, -20,-117, -72, -20,-117, -73, -20,-117, -74, -20,-117, -75, + -20,-117, -76, -20,-117, -77, -20,-117, -78, -20,-117, -79, -20,-117, -80, -20,-117, -81, -20,-117, + -82, -20,-117, -83, -20,-117, -84, -20,-117, -85, -20,-117, -86, -20,-117, -87, -20,-117, -88, -20, +-117, -89, -20,-117, -90, -20,-117, -91, -20,-117, -92, -20,-117, -93, -20,-117, -94, -20,-117, -95, + -20,-117, -96, -20,-117, -97, -20,-117, -98, -20,-117, -99, -20,-117,-100, -20,-117,-101, -20,-117, +-102, -20,-117,-103, -20,-117,-104, -20,-117,-105, -20,-117,-106, -20,-117,-107, -20,-117,-108, -20, +-117,-109, -20,-117,-110, -20,-117,-111, -20,-117,-112, -20,-117,-113, -20,-117,-114, -20,-117,-115, + -20,-117,-116, -20,-117,-117, -20,-117,-118, -20,-117,-119, -20,-117,-120, -20,-117,-121, -20,-117, +-122, -20,-117,-123, -20,-117,-124, -20,-117,-125, -20,-117,-126, -20,-117,-127, -20,-117,-128, -20, +-118, -65, -20,-118, -66, -20,-118, -67, -20,-118, -68, -20,-118, -69, -20,-118, -70, -20,-118, -71, + -20,-118, -72, -20,-118, -73, -20,-118, -74, -20,-118, -75, -20,-118, -76, -20,-118, -77, -20,-118, + -78, -20,-118, -79, -20,-118, -80, -20,-118, -81, -20,-118, -82, -20,-118, -83, -20,-118, -84, -20, +-118, -85, -20,-118, -86, -20,-118, -87, -20,-118, -88, -20,-118, -89, -20,-118, -90, -20,-118, -91, + -20,-118, -92, -20,-118, -93, -20,-118, -94, -20,-118, -95, -20,-118, -96, -20,-118, -97, -20,-118, + -98, -20,-118, -99, -20,-118,-100, -20,-118,-101, -20,-118,-102, -20,-118,-103, -20,-118,-104, -20, +-118,-105, -20,-118,-106, -20,-118,-107, -20,-118,-108, -20,-118,-109, -20,-118,-110, -20,-118,-111, + -20,-118,-112, -20,-118,-113, -20,-118,-114, -20,-118,-115, -20,-118,-116, -20,-118,-117, -20,-118, +-118, -20,-118,-119, -20,-118,-120, -20,-118,-121, -20,-118,-122, -20,-118,-123, -20,-118,-124, -20, +-118,-125, -20,-118,-126, -20,-118,-127, -20,-118,-128, -20,-119, -65, -20,-119, -66, -20,-119, -67, + -20,-119, -68, -20,-119, -69, -20,-119, -70, -20,-119, -71, -20,-119, -72, -20,-119, -73, -20,-119, + -74, -20,-119, -75, -20,-119, -76, -20,-119, -77, -20,-119, -78, -20,-119, -79, -20,-119, -80, -20, +-119, -81, -20,-119, -82, -20,-119, -83, -20,-119, -84, -20,-119, -85, -20,-119, -86, -20,-119, -87, + -20,-119, -88, -20,-119, -89, -20,-119, -90, -20,-119, -91, -20,-119, -92, -20,-119, -93, -20,-119, + -94, -20,-119, -95, -20,-119, -96, -20,-119, -97, -20,-119, -98, -20,-119, -99, -20,-119,-100, -20, +-119,-101, -20,-119,-102, -20,-119,-103, -20,-119,-104, -20,-119,-105, -20,-119,-106, -20,-119,-107, + -20,-119,-108, -20,-119,-109, -20,-119,-110, -20,-119,-111, -20,-119,-112, -20,-119,-113, -20,-119, +-114, -20,-119,-115, -20,-119,-116, -20,-119,-117, -20,-119,-118, -20,-119,-119, -20,-119,-120, -20, +-119,-121, -20,-119,-122, -20,-119,-123, -20,-119,-124, -20,-119,-125, -20,-119,-126, -20,-119,-127, + -20,-119,-128, -20,-120, -65, -20,-120, -66, -20,-120, -67, -20,-120, -68, -20,-120, -69, -20,-120, + -70, -20,-120, -71, -20,-120, -72, -20,-120, -73, -20,-120, -74, -20,-120, -75, -20,-120, -76, -20, +-120, -77, -20,-120, -78, -20,-120, -79, -20,-120, -80, -20,-120, -81, -20,-120, -82, -20,-120, -83, + -20,-120, -84, -20,-120, -85, -20,-120, -86, -20,-120, -87, -20,-120, -88, -20,-120, -89, -20,-120, + -90, -20,-120, -91, -20,-120, -92, -20,-120, -93, -20,-120, -94, -20,-120, -95, -20,-120, -96, -20, +-120, -97, -20,-120, -98, -20,-120, -99, -20,-120,-100, -20,-120,-101, -20,-120,-102, -20,-120,-103, + -20,-120,-104, -20,-120,-105, -20,-120,-106, -20,-120,-107, -20,-120,-108, -20,-120,-109, -20,-120, +-110, -20,-120,-111, -20,-120,-112, -20,-120,-113, -20,-120,-114, -20,-120,-115, -20,-120,-116, -20, +-120,-117, -20,-120,-118, -20,-120,-119, -20,-120,-120, -20,-120,-121, -20,-120,-122, -20,-120,-123, + -20,-120,-124, -20,-120,-125, -20,-120,-126, -20,-120,-127, -20,-120,-128, -20,-121, -65, -20,-121, + -66, -20,-121, -67, -20,-121, -68, -20,-121, -69, -20,-121, -70, -20,-121, -71, -20,-121, -72, -20, +-121, -73, -20,-121, -74, -20,-121, -75, -20,-121, -76, -20,-121, -77, -20,-121, -78, -20,-121, -79, + -20,-121, -80, -20,-121, -81, -20,-121, -82, -20,-121, -83, -20,-121, -84, -20,-121, -85, -20,-121, + -86, -20,-121, -87, -20,-121, -88, -20,-121, -89, -20,-121, -90, -20,-121, -91, -20,-121, -92, -20, +-121, -93, -20,-121, -94, -20,-121, -95, -20,-121, -96, -20,-121, -97, -20,-121, -98, -20,-121, -99, + -20,-121,-100, -20,-121,-101, -20,-121,-102, -20,-121,-103, -20,-121,-104, -20,-121,-105, -20,-121, +-106, -20,-121,-107, -20,-121,-108, -20,-121,-109, -20,-121,-110, -20,-121,-111, -20,-121,-112, -20, +-121,-113, -20,-121,-114, -20,-121,-115, -20,-121,-116, -20,-121,-117, -20,-121,-118, -20,-121,-119, + -20,-121,-120, -20,-121,-121, -20,-121,-122, -20,-121,-123, -20,-121,-124, -20,-121,-125, -20,-121, +-126, -20,-121,-127, -20,-121,-128, -20,-122, -65, -20,-122, -66, -20,-122, -67, -20,-122, -68, -20, +-122, -69, -20,-122, -70, -20,-122, -71, -20,-122, -72, -20,-122, -73, -20,-122, -74, -20,-122, -75, + -20,-122, -76, -20,-122, -77, -20,-122, -78, -20,-122, -79, -20,-122, -80, -20,-122, -81, -20,-122, + -82, -20,-122, -83, -20,-122, -84, -20,-122, -85, -20,-122, -86, -20,-122, -87, -20,-122, -88, -20, +-122, -89, -20,-122, -90, -20,-122, -91, -20,-122, -92, -20,-122, -93, -20,-122, -94, -20,-122, -95, + -20,-122, -96, -20,-122, -97, -20,-122, -98, -20,-122, -99, -20,-122,-100, -20,-122,-101, -20,-122, +-102, -20,-122,-103, -20,-122,-104, -20,-122,-105, -20,-122,-106, -20,-122,-107, -20,-122,-108, -20, +-122,-109, -20,-122,-110, -20,-122,-111, -20,-122,-112, -20,-122,-113, -20,-122,-114, -20,-122,-115, + -20,-122,-116, -20,-122,-117, -20,-122,-118, -20,-122,-119, -20,-122,-120, -20,-122,-121, -20,-122, +-122, -20,-122,-123, -20,-122,-124, -20,-122,-125, -20,-122,-126, -20,-122,-127, -20,-122,-128, -20, +-123, -65, -20,-123, -66, -20,-123, -67, -20,-123, -68, -20,-123, -69, -20,-123, -70, -20,-123, -71, + -20,-123, -72, -20,-123, -73, -20,-123, -74, -20,-123, -75, -20,-123, -76, -20,-123, -77, -20,-123, + -78, -20,-123, -79, -20,-123, -80, -20,-123, -81, -20,-123, -82, -20,-123, -83, -20,-123, -84, -20, +-123, -85, -20,-123, -86, -20,-123, -87, -20,-123, -88, -20,-123, -89, -20,-123, -90, -20,-123, -91, + -20,-123, -92, -20,-123, -93, -20,-123, -94, -20,-123, -95, -20,-123, -96, -20,-123, -97, -20,-123, + -98, -20,-123, -99, -20,-123,-100, -20,-123,-101, -20,-123,-102, -20,-123,-103, -20,-123,-104, -20, +-123,-105, -20,-123,-106, -20,-123,-107, -20,-123,-108, -20,-123,-109, -20,-123,-110, -20,-123,-111, + -20,-123,-112, -20,-123,-113, -20,-123,-114, -20,-123,-115, -20,-123,-116, -20,-123,-117, -20,-123, +-118, -20,-123,-119, -20,-123,-120, -20,-123,-121, -20,-123,-122, -20,-123,-123, -20,-123,-124, -20, +-123,-125, -20,-123,-126, -20,-123,-127, -20,-123,-128, -20,-124, -65, -20,-124, -66, -20,-124, -67, + -20,-124, -68, -20,-124, -69, -20,-124, -70, -20,-124, -71, -20,-124, -72, -20,-124, -73, -20,-124, + -74, -20,-124, -75, -20,-124, -76, -20,-124, -77, -20,-124, -78, -20,-124, -79, -20,-124, -80, -20, +-124, -81, -20,-124, -82, -20,-124, -83, -20,-124, -84, -20,-124, -85, -20,-124, -86, -20,-124, -87, + -20,-124, -88, -20,-124, -89, -20,-124, -90, -20,-124, -91, -20,-124, -92, -20,-124, -93, -20,-124, + -94, -20,-124, -95, -20,-124, -96, -20,-124, -97, -20,-124, -98, -20,-124, -99, -20,-124,-100, -20, +-124,-101, -20,-124,-102, -20,-124,-103, -20,-124,-104, -20,-124,-105, -20,-124,-106, -20,-124,-107, + -20,-124,-108, -20,-124,-109, -20,-124,-110, -20,-124,-111, -20,-124,-112, -20,-124,-113, -20,-124, +-114, -20,-124,-115, -20,-124,-116, -20,-124,-117, -20,-124,-118, -20,-124,-119, -20,-124,-120, -20, +-124,-121, -20,-124,-122, -20,-124,-123, -20,-124,-124, -20,-124,-125, -20,-124,-126, -20,-124,-127, + -20,-124,-128, -20,-125, -65, -20,-125, -66, -20,-125, -67, -20,-125, -68, -20,-125, -69, -20,-125, + -70, -20,-125, -71, -20,-125, -72, -20,-125, -73, -20,-125, -74, -20,-125, -75, -20,-125, -76, -20, +-125, -77, -20,-125, -78, -20,-125, -79, -20,-125, -80, -20,-125, -81, -20,-125, -82, -20,-125, -83, + -20,-125, -84, -20,-125, -85, -20,-125, -86, -20,-125, -87, -20,-125, -88, -20,-125, -89, -20,-125, + -90, -20,-125, -91, -20,-125, -92, -20,-125, -93, -20,-125, -94, -20,-125, -95, -20,-125, -96, -20, +-125, -97, -20,-125, -98, -20,-125, -99, -20,-125,-100, -20,-125,-101, -20,-125,-102, -20,-125,-103, + -20,-125,-104, -20,-125,-105, -20,-125,-106, -20,-125,-107, -20,-125,-108, -20,-125,-109, -20,-125, +-110, -20,-125,-111, -20,-125,-112, -20,-125,-113, -20,-125,-114, -20,-125,-115, -20,-125,-116, -20, +-125,-117, -20,-125,-118, -20,-125,-119, -20,-125,-120, -20,-125,-121, -20,-125,-122, -20,-125,-123, + -20,-125,-124, -20,-125,-125, -20,-125,-126, -20,-125,-127, -20,-125,-128, -20,-126, -65, -20,-126, + -66, -20,-126, -67, -20,-126, -68, -20,-126, -69, -20,-126, -70, -20,-126, -71, -20,-126, -72, -20, +-126, -73, -20,-126, -74, -20,-126, -75, -20,-126, -76, -20,-126, -77, -20,-126, -78, -20,-126, -79, + -20,-126, -80, -20,-126, -81, -20,-126, -82, -20,-126, -83, -20,-126, -84, -20,-126, -85, -20,-126, + -86, -20,-126, -87, -20,-126, -88, -20,-126, -89, -20,-126, -90, -20,-126, -91, -20,-126, -92, -20, +-126, -93, -20,-126, -94, -20,-126, -95, -20,-126, -96, -20,-126, -97, -20,-126, -98, -20,-126, -99, + -20,-126,-100, -20,-126,-101, -20,-126,-102, -20,-126,-103, -20,-126,-104, -20,-126,-105, -20,-126, +-106, -20,-126,-107, -20,-126,-108, -20,-126,-109, -20,-126,-110, -20,-126,-111, -20,-126,-112, -20, +-126,-113, -20,-126,-114, -20,-126,-115, -20,-126,-116, -20,-126,-117, -20,-126,-118, -20,-126,-119, + -20,-126,-120, -20,-126,-121, -20,-126,-122, -20,-126,-123, -20,-126,-124, -20,-126,-125, -20,-126, +-126, -20,-126,-127, -20,-126,-128, -20,-127, -65, -20,-127, -66, -20,-127, -67, -20,-127, -68, -20, +-127, -69, -20,-127, -70, -20,-127, -71, -20,-127, -72, -20,-127, -73, -20,-127, -74, -20,-127, -75, + -20,-127, -76, -20,-127, -77, -20,-127, -78, -20,-127, -79, -20,-127, -80, -20,-127, -81, -20,-127, + -82, -20,-127, -83, -20,-127, -84, -20,-127, -85, -20,-127, -86, -20,-127, -87, -20,-127, -88, -20, +-127, -89, -20,-127, -90, -20,-127, -91, -20,-127, -92, -20,-127, -93, -20,-127, -94, -20,-127, -95, + -20,-127, -96, -20,-127, -97, -20,-127, -98, -20,-127, -99, -20,-127,-100, -20,-127,-101, -20,-127, +-102, -20,-127,-103, -20,-127,-104, -20,-127,-105, -20,-127,-106, -20,-127,-107, -20,-127,-108, -20, +-127,-109, -20,-127,-110, -20,-127,-111, -20,-127,-112, -20,-127,-113, -20,-127,-114, -20,-127,-115, + -20,-127,-116, -20,-127,-117, -20,-127,-118, -20,-127,-119, -20,-127,-120, -20,-127,-121, -20,-127, +-122, -20,-127,-123, -20,-127,-124, -20,-127,-125, -20,-127,-126, -20,-127,-127, -20,-127,-128, -20, +-128, -65, -20,-128, -66, -20,-128, -67, -20,-128, -68, -20,-128, -69, -20,-128, -70, -20,-128, -71, + -20,-128, -72, -20,-128, -73, -20,-128, -74, -20,-128, -75, -20,-128, -76, -20,-128, -77, -20,-128, + -78, -20,-128, -79, -20,-128, -80, -20,-128, -81, -20,-128, -82, -20,-128, -83, -20,-128, -84, -20, +-128, -85, -20,-128, -86, -20,-128, -87, -20,-128, -88, -20,-128, -89, -20,-128, -90, -20,-128, -91, + -20,-128, -92, -20,-128, -93, -20,-128, -94, -20,-128, -95, -20,-128, -96, -20,-128, -97, -20,-128, + -98, -20,-128, -99, -20,-128,-100, -20,-128,-101, -20,-128,-102, -20,-128,-103, -20,-128,-104, -20, +-128,-105, -20,-128,-106, -20,-128,-107, -20,-128,-108, -20,-128,-109, -20,-128,-110, -20,-128,-111, + -20,-128,-112, -20,-128,-113, -20,-128,-114, -20,-128,-115, -20,-128,-116, -20,-128,-117, -20,-128, +-118, -20,-128,-119, -20,-128,-120, -20,-128,-121, -20,-128,-122, -20,-128,-123, -20,-128,-124, -20, +-128,-125, -20,-128,-126, -20,-128,-127, -20,-128,-128, -21, -65, -65, -21, -65, -66, -21, -65, -67, + -21, -65, -68, -21, -65, -69, -21, -65, -70, -21, -65, -71, -21, -65, -72, -21, -65, -73, -21, -65, + -74, -21, -65, -75, -21, -65, -76, -21, -65, -77, -21, -65, -78, -21, -65, -79, -21, -65, -80, -21, + -65, -81, -21, -65, -82, -21, -65, -83, -21, -65, -84, -21, -65, -85, -21, -65, -86, -21, -65, -87, + -21, -65, -88, -21, -65, -89, -21, -65, -90, -21, -65, -91, -21, -65, -92, -21, -65, -93, -21, -65, + -94, -21, -65, -95, -21, -65, -96, -21, -65, -97, -21, -65, -98, -21, -65, -99, -21, -65,-100, -21, + -65,-101, -21, -65,-102, -21, -65,-103, -21, -65,-104, -21, -65,-105, -21, -65,-106, -21, -65,-107, + -21, -65,-108, -21, -65,-109, -21, -65,-110, -21, -65,-111, -21, -65,-112, -21, -65,-113, -21, -65, +-114, -21, -65,-115, -21, -65,-116, -21, -65,-117, -21, -65,-118, -21, -65,-119, -21, -65,-120, -21, + -65,-121, -21, -65,-122, -21, -65,-123, -21, -65,-124, -21, -65,-125, -21, -65,-126, -21, -65,-127, + -21, -65,-128, -21, -66, -65, -21, -66, -66, -21, -66, -67, -21, -66, -68, -21, -66, -69, -21, -66, + -70, -21, -66, -71, -21, -66, -72, -21, -66, -73, -21, -66, -74, -21, -66, -75, -21, -66, -76, -21, + -66, -77, -21, -66, -78, -21, -66, -79, -21, -66, -80, -21, -66, -81, -21, -66, -82, -21, -66, -83, + -21, -66, -84, -21, -66, -85, -21, -66, -86, -21, -66, -87, -21, -66, -88, -21, -66, -89, -21, -66, + -90, -21, -66, -91, -21, -66, -92, -21, -66, -93, -21, -66, -94, -21, -66, -95, -21, -66, -96, -21, + -66, -97, -21, -66, -98, -21, -66, -99, -21, -66,-100, -21, -66,-101, -21, -66,-102, -21, -66,-103, + -21, -66,-104, -21, -66,-105, -21, -66,-106, -21, -66,-107, -21, -66,-108, -21, -66,-109, -21, -66, +-110, -21, -66,-111, -21, -66,-112, -21, -66,-113, -21, -66,-114, -21, -66,-115, -21, -66,-116, -21, + -66,-117, -21, -66,-118, -21, -66,-119, -21, -66,-120, -21, -66,-121, -21, -66,-122, -21, -66,-123, + -21, -66,-124, -21, -66,-125, -21, -66,-126, -21, -66,-127, -21, -66,-128, -21, -67, -65, -21, -67, + -66, -21, -67, -67, -21, -67, -68, -21, -67, -69, -21, -67, -70, -21, -67, -71, -21, -67, -72, -21, + -67, -73, -21, -67, -74, -21, -67, -75, -21, -67, -76, -21, -67, -77, -21, -67, -78, -21, -67, -79, + -21, -67, -80, -21, -67, -81, -21, -67, -82, -21, -67, -83, -21, -67, -84, -21, -67, -85, -21, -67, + -86, -21, -67, -87, -21, -67, -88, -21, -67, -89, -21, -67, -90, -21, -67, -91, -21, -67, -92, -21, + -67, -93, -21, -67, -94, -21, -67, -95, -21, -67, -96, -21, -67, -97, -21, -67, -98, -21, -67, -99, + -21, -67,-100, -21, -67,-101, -21, -67,-102, -21, -67,-103, -21, -67,-104, -21, -67,-105, -21, -67, +-106, -21, -67,-107, -21, -67,-108, -21, -67,-109, -21, -67,-110, -21, -67,-111, -21, -67,-112, -21, + -67,-113, -21, -67,-114, -21, -67,-115, -21, -67,-116, -21, -67,-117, -21, -67,-118, -21, -67,-119, + -21, -67,-120, -21, -67,-121, -21, -67,-122, -21, -67,-123, -21, -67,-124, -21, -67,-125, -21, -67, +-126, -21, -67,-127, -21, -67,-128, -21, -68, -65, -21, -68, -66, -21, -68, -67, -21, -68, -68, -21, + -68, -69, -21, -68, -70, -21, -68, -71, -21, -68, -72, -21, -68, -73, -21, -68, -74, -21, -68, -75, + -21, -68, -76, -21, -68, -77, -21, -68, -78, -21, -68, -79, -21, -68, -80, -21, -68, -81, -21, -68, + -82, -21, -68, -83, -21, -68, -84, -21, -68, -85, -21, -68, -86, -21, -68, -87, -21, -68, -88, -21, + -68, -89, -21, -68, -90, -21, -68, -91, -21, -68, -92, -21, -68, -93, -21, -68, -94, -21, -68, -95, + -21, -68, -96, -21, -68, -97, -21, -68, -98, -21, -68, -99, -21, -68,-100, -21, -68,-101, -21, -68, +-102, -21, -68,-103, -21, -68,-104, -21, -68,-105, -21, -68,-106, -21, -68,-107, -21, -68,-108, -21, + -68,-109, -21, -68,-110, -21, -68,-111, -21, -68,-112, -21, -68,-113, -21, -68,-114, -21, -68,-115, + -21, -68,-116, -21, -68,-117, -21, -68,-118, -21, -68,-119, -21, -68,-120, -21, -68,-121, -21, -68, +-122, -21, -68,-123, -21, -68,-124, -21, -68,-125, -21, -68,-126, -21, -68,-127, -21, -68,-128, -21, + -69, -65, -21, -69, -66, -21, -69, -67, -21, -69, -68, -21, -69, -69, -21, -69, -70, -21, -69, -71, + -21, -69, -72, -21, -69, -73, -21, -69, -74, -21, -69, -75, -21, -69, -76, -21, -69, -77, -21, -69, + -78, -21, -69, -79, -21, -69, -80, -21, -69, -81, -21, -69, -82, -21, -69, -83, -21, -69, -84, -21, + -69, -85, -21, -69, -86, -21, -69, -87, -21, -69, -88, -21, -69, -89, -21, -69, -90, -21, -69, -91, + -21, -69, -92, -21, -69, -93, -21, -69, -94, -21, -69, -95, -21, -69, -96, -21, -69, -97, -21, -69, + -98, -21, -69, -99, -21, -69,-100, -21, -69,-101, -21, -69,-102, -21, -69,-103, -21, -69,-104, -21, + -69,-105, -21, -69,-106, -21, -69,-107, -21, -69,-108, -21, -69,-109, -21, -69,-110, -21, -69,-111, + -21, -69,-112, -21, -69,-113, -21, -69,-114, -21, -69,-115, -21, -69,-116, -21, -69,-117, -21, -69, +-118, -21, -69,-119, -21, -69,-120, -21, -69,-121, -21, -69,-122, -21, -69,-123, -21, -69,-124, -21, + -69,-125, -21, -69,-126, -21, -69,-127, -21, -69,-128, -21, -70, -65, -21, -70, -66, -21, -70, -67, + -21, -70, -68, -21, -70, -69, -21, -70, -70, -21, -70, -71, -21, -70, -72, -21, -70, -73, -21, -70, + -74, -21, -70, -75, -21, -70, -76, -21, -70, -77, -21, -70, -78, -21, -70, -79, -21, -70, -80, -21, + -70, -81, -21, -70, -82, -21, -70, -83, -21, -70, -84, -21, -70, -85, -21, -70, -86, -21, -70, -87, + -21, -70, -88, -21, -70, -89, -21, -70, -90, -21, -70, -91, -21, -70, -92, -21, -70, -93, -21, -70, + -94, -21, -70, -95, -21, -70, -96, -21, -70, -97, -21, -70, -98, -21, -70, -99, -21, -70,-100, -21, + -70,-101, -21, -70,-102, -21, -70,-103, -21, -70,-104, -21, -70,-105, -21, -70,-106, -21, -70,-107, + -21, -70,-108, -21, -70,-109, -21, -70,-110, -21, -70,-111, -21, -70,-112, -21, -70,-113, -21, -70, +-114, -21, -70,-115, -21, -70,-116, -21, -70,-117, -21, -70,-118, -21, -70,-119, -21, -70,-120, -21, + -70,-121, -21, -70,-122, -21, -70,-123, -21, -70,-124, -21, -70,-125, -21, -70,-126, -21, -70,-127, + -21, -70,-128, -21, -71, -65, -21, -71, -66, -21, -71, -67, -21, -71, -68, -21, -71, -69, -21, -71, + -70, -21, -71, -71, -21, -71, -72, -21, -71, -73, -21, -71, -74, -21, -71, -75, -21, -71, -76, -21, + -71, -77, -21, -71, -78, -21, -71, -79, -21, -71, -80, -21, -71, -81, -21, -71, -82, -21, -71, -83, + -21, -71, -84, -21, -71, -85, -21, -71, -86, -21, -71, -87, -21, -71, -88, -21, -71, -89, -21, -71, + -90, -21, -71, -91, -21, -71, -92, -21, -71, -93, -21, -71, -94, -21, -71, -95, -21, -71, -96, -21, + -71, -97, -21, -71, -98, -21, -71, -99, -21, -71,-100, -21, -71,-101, -21, -71,-102, -21, -71,-103, + -21, -71,-104, -21, -71,-105, -21, -71,-106, -21, -71,-107, -21, -71,-108, -21, -71,-109, -21, -71, +-110, -21, -71,-111, -21, -71,-112, -21, -71,-113, -21, -71,-114, -21, -71,-115, -21, -71,-116, -21, + -71,-117, -21, -71,-118, -21, -71,-119, -21, -71,-120, -21, -71,-121, -21, -71,-122, -21, -71,-123, + -21, -71,-124, -21, -71,-125, -21, -71,-126, -21, -71,-127, -21, -71,-128, -21, -72, -65, -21, -72, + -66, -21, -72, -67, -21, -72, -68, -21, -72, -69, -21, -72, -70, -21, -72, -71, -21, -72, -72, -21, + -72, -73, -21, -72, -74, -21, -72, -75, -21, -72, -76, -21, -72, -77, -21, -72, -78, -21, -72, -79, + -21, -72, -80, -21, -72, -81, -21, -72, -82, -21, -72, -83, -21, -72, -84, -21, -72, -85, -21, -72, + -86, -21, -72, -87, -21, -72, -88, -21, -72, -89, -21, -72, -90, -21, -72, -91, -21, -72, -92, -21, + -72, -93, -21, -72, -94, -21, -72, -95, -21, -72, -96, -21, -72, -97, -21, -72, -98, -21, -72, -99, + -21, -72,-100, -21, -72,-101, -21, -72,-102, -21, -72,-103, -21, -72,-104, -21, -72,-105, -21, -72, +-106, -21, -72,-107, -21, -72,-108, -21, -72,-109, -21, -72,-110, -21, -72,-111, -21, -72,-112, -21, + -72,-113, -21, -72,-114, -21, -72,-115, -21, -72,-116, -21, -72,-117, -21, -72,-118, -21, -72,-119, + -21, -72,-120, -21, -72,-121, -21, -72,-122, -21, -72,-123, -21, -72,-124, -21, -72,-125, -21, -72, +-126, -21, -72,-127, -21, -72,-128, -21, -73, -65, -21, -73, -66, -21, -73, -67, -21, -73, -68, -21, + -73, -69, -21, -73, -70, -21, -73, -71, -21, -73, -72, -21, -73, -73, -21, -73, -74, -21, -73, -75, + -21, -73, -76, -21, -73, -77, -21, -73, -78, -21, -73, -79, -21, -73, -80, -21, -73, -81, -21, -73, + -82, -21, -73, -83, -21, -73, -84, -21, -73, -85, -21, -73, -86, -21, -73, -87, -21, -73, -88, -21, + -73, -89, -21, -73, -90, -21, -73, -91, -21, -73, -92, -21, -73, -93, -21, -73, -94, -21, -73, -95, + -21, -73, -96, -21, -73, -97, -21, -73, -98, -21, -73, -99, -21, -73,-100, -21, -73,-101, -21, -73, +-102, -21, -73,-103, -21, -73,-104, -21, -73,-105, -21, -73,-106, -21, -73,-107, -21, -73,-108, -21, + -73,-109, -21, -73,-110, -21, -73,-111, -21, -73,-112, -21, -73,-113, -21, -73,-114, -21, -73,-115, + -21, -73,-116, -21, -73,-117, -21, -73,-118, -21, -73,-119, -21, -73,-120, -21, -73,-121, -21, -73, +-122, -21, -73,-123, -21, -73,-124, -21, -73,-125, -21, -73,-126, -21, -73,-127, -21, -73,-128, -21, + -74, -65, -21, -74, -66, -21, -74, -67, -21, -74, -68, -21, -74, -69, -21, -74, -70, -21, -74, -71, + -21, -74, -72, -21, -74, -73, -21, -74, -74, -21, -74, -75, -21, -74, -76, -21, -74, -77, -21, -74, + -78, -21, -74, -79, -21, -74, -80, -21, -74, -81, -21, -74, -82, -21, -74, -83, -21, -74, -84, -21, + -74, -85, -21, -74, -86, -21, -74, -87, -21, -74, -88, -21, -74, -89, -21, -74, -90, -21, -74, -91, + -21, -74, -92, -21, -74, -93, -21, -74, -94, -21, -74, -95, -21, -74, -96, -21, -74, -97, -21, -74, + -98, -21, -74, -99, -21, -74,-100, -21, -74,-101, -21, -74,-102, -21, -74,-103, -21, -74,-104, -21, + -74,-105, -21, -74,-106, -21, -74,-107, -21, -74,-108, -21, -74,-109, -21, -74,-110, -21, -74,-111, + -21, -74,-112, -21, -74,-113, -21, -74,-114, -21, -74,-115, -21, -74,-116, -21, -74,-117, -21, -74, +-118, -21, -74,-119, -21, -74,-120, -21, -74,-121, -21, -74,-122, -21, -74,-123, -21, -74,-124, -21, + -74,-125, -21, -74,-126, -21, -74,-127, -21, -74,-128, -21, -75, -65, -21, -75, -66, -21, -75, -67, + -21, -75, -68, -21, -75, -69, -21, -75, -70, -21, -75, -71, -21, -75, -72, -21, -75, -73, -21, -75, + -74, -21, -75, -75, -21, -75, -76, -21, -75, -77, -21, -75, -78, -21, -75, -79, -21, -75, -80, -21, + -75, -81, -21, -75, -82, -21, -75, -83, -21, -75, -84, -21, -75, -85, -21, -75, -86, -21, -75, -87, + -21, -75, -88, -21, -75, -89, -21, -75, -90, -21, -75, -91, -21, -75, -92, -21, -75, -93, -21, -75, + -94, -21, -75, -95, -21, -75, -96, -21, -75, -97, -21, -75, -98, -21, -75, -99, -21, -75,-100, -21, + -75,-101, -21, -75,-102, -21, -75,-103, -21, -75,-104, -21, -75,-105, -21, -75,-106, -21, -75,-107, + -21, -75,-108, -21, -75,-109, -21, -75,-110, -21, -75,-111, -21, -75,-112, -21, -75,-113, -21, -75, +-114, -21, -75,-115, -21, -75,-116, -21, -75,-117, -21, -75,-118, -21, -75,-119, -21, -75,-120, -21, + -75,-121, -21, -75,-122, -21, -75,-123, -21, -75,-124, -21, -75,-125, -21, -75,-126, -21, -75,-127, + -21, -75,-128, -21, -76, -65, -21, -76, -66, -21, -76, -67, -21, -76, -68, -21, -76, -69, -21, -76, + -70, -21, -76, -71, -21, -76, -72, -21, -76, -73, -21, -76, -74, -21, -76, -75, -21, -76, -76, -21, + -76, -77, -21, -76, -78, -21, -76, -79, -21, -76, -80, -21, -76, -81, -21, -76, -82, -21, -76, -83, + -21, -76, -84, -21, -76, -85, -21, -76, -86, -21, -76, -87, -21, -76, -88, -21, -76, -89, -21, -76, + -90, -21, -76, -91, -21, -76, -92, -21, -76, -93, -21, -76, -94, -21, -76, -95, -21, -76, -96, -21, + -76, -97, -21, -76, -98, -21, -76, -99, -21, -76,-100, -21, -76,-101, -21, -76,-102, -21, -76,-103, + -21, -76,-104, -21, -76,-105, -21, -76,-106, -21, -76,-107, -21, -76,-108, -21, -76,-109, -21, -76, +-110, -21, -76,-111, -21, -76,-112, -21, -76,-113, -21, -76,-114, -21, -76,-115, -21, -76,-116, -21, + -76,-117, -21, -76,-118, -21, -76,-119, -21, -76,-120, -21, -76,-121, -21, -76,-122, -21, -76,-123, + -21, -76,-124, -21, -76,-125, -21, -76,-126, -21, -76,-127, -21, -76,-128, -21, -77, -65, -21, -77, + -66, -21, -77, -67, -21, -77, -68, -21, -77, -69, -21, -77, -70, -21, -77, -71, -21, -77, -72, -21, + -77, -73, -21, -77, -74, -21, -77, -75, -21, -77, -76, -21, -77, -77, -21, -77, -78, -21, -77, -79, + -21, -77, -80, -21, -77, -81, -21, -77, -82, -21, -77, -83, -21, -77, -84, -21, -77, -85, -21, -77, + -86, -21, -77, -87, -21, -77, -88, -21, -77, -89, -21, -77, -90, -21, -77, -91, -21, -77, -92, -21, + -77, -93, -21, -77, -94, -21, -77, -95, -21, -77, -96, -21, -77, -97, -21, -77, -98, -21, -77, -99, + -21, -77,-100, -21, -77,-101, -21, -77,-102, -21, -77,-103, -21, -77,-104, -21, -77,-105, -21, -77, +-106, -21, -77,-107, -21, -77,-108, -21, -77,-109, -21, -77,-110, -21, -77,-111, -21, -77,-112, -21, + -77,-113, -21, -77,-114, -21, -77,-115, -21, -77,-116, -21, -77,-117, -21, -77,-118, -21, -77,-119, + -21, -77,-120, -21, -77,-121, -21, -77,-122, -21, -77,-123, -21, -77,-124, -21, -77,-125, -21, -77, +-126, -21, -77,-127, -21, -77,-128, -21, -78, -65, -21, -78, -66, -21, -78, -67, -21, -78, -68, -21, + -78, -69, -21, -78, -70, -21, -78, -71, -21, -78, -72, -21, -78, -73, -21, -78, -74, -21, -78, -75, + -21, -78, -76, -21, -78, -77, -21, -78, -78, -21, -78, -79, -21, -78, -80, -21, -78, -81, -21, -78, + -82, -21, -78, -83, -21, -78, -84, -21, -78, -85, -21, -78, -86, -21, -78, -87, -21, -78, -88, -21, + -78, -89, -21, -78, -90, -21, -78, -91, -21, -78, -92, -21, -78, -93, -21, -78, -94, -21, -78, -95, + -21, -78, -96, -21, -78, -97, -21, -78, -98, -21, -78, -99, -21, -78,-100, -21, -78,-101, -21, -78, +-102, -21, -78,-103, -21, -78,-104, -21, -78,-105, -21, -78,-106, -21, -78,-107, -21, -78,-108, -21, + -78,-109, -21, -78,-110, -21, -78,-111, -21, -78,-112, -21, -78,-113, -21, -78,-114, -21, -78,-115, + -21, -78,-116, -21, -78,-117, -21, -78,-118, -21, -78,-119, -21, -78,-120, -21, -78,-121, -21, -78, +-122, -21, -78,-123, -21, -78,-124, -21, -78,-125, -21, -78,-126, -21, -78,-127, -21, -78,-128, -21, + -79, -65, -21, -79, -66, -21, -79, -67, -21, -79, -68, -21, -79, -69, -21, -79, -70, -21, -79, -71, + -21, -79, -72, -21, -79, -73, -21, -79, -74, -21, -79, -75, -21, -79, -76, -21, -79, -77, -21, -79, + -78, -21, -79, -79, -21, -79, -80, -21, -79, -81, -21, -79, -82, -21, -79, -83, -21, -79, -84, -21, + -79, -85, -21, -79, -86, -21, -79, -87, -21, -79, -88, -21, -79, -89, -21, -79, -90, -21, -79, -91, + -21, -79, -92, -21, -79, -93, -21, -79, -94, -21, -79, -95, -21, -79, -96, -21, -79, -97, -21, -79, + -98, -21, -79, -99, -21, -79,-100, -21, -79,-101, -21, -79,-102, -21, -79,-103, -21, -79,-104, -21, + -79,-105, -21, -79,-106, -21, -79,-107, -21, -79,-108, -21, -79,-109, -21, -79,-110, -21, -79,-111, + -21, -79,-112, -21, -79,-113, -21, -79,-114, -21, -79,-115, -21, -79,-116, -21, -79,-117, -21, -79, +-118, -21, -79,-119, -21, -79,-120, -21, -79,-121, -21, -79,-122, -21, -79,-123, -21, -79,-124, -21, + -79,-125, -21, -79,-126, -21, -79,-127, -21, -79,-128, -21, -80, -65, -21, -80, -66, -21, -80, -67, + -21, -80, -68, -21, -80, -69, -21, -80, -70, -21, -80, -71, -21, -80, -72, -21, -80, -73, -21, -80, + -74, -21, -80, -75, -21, -80, -76, -21, -80, -77, -21, -80, -78, -21, -80, -79, -21, -80, -80, -21, + -80, -81, -21, -80, -82, -21, -80, -83, -21, -80, -84, -21, -80, -85, -21, -80, -86, -21, -80, -87, + -21, -80, -88, -21, -80, -89, -21, -80, -90, -21, -80, -91, -21, -80, -92, -21, -80, -93, -21, -80, + -94, -21, -80, -95, -21, -80, -96, -21, -80, -97, -21, -80, -98, -21, -80, -99, -21, -80,-100, -21, + -80,-101, -21, -80,-102, -21, -80,-103, -21, -80,-104, -21, -80,-105, -21, -80,-106, -21, -80,-107, + -21, -80,-108, -21, -80,-109, -21, -80,-110, -21, -80,-111, -21, -80,-112, -21, -80,-113, -21, -80, +-114, -21, -80,-115, -21, -80,-116, -21, -80,-117, -21, -80,-118, -21, -80,-119, -21, -80,-120, -21, + -80,-121, -21, -80,-122, -21, -80,-123, -21, -80,-124, -21, -80,-125, -21, -80,-126, -21, -80,-127, + -21, -80,-128, -21, -81, -65, -21, -81, -66, -21, -81, -67, -21, -81, -68, -21, -81, -69, -21, -81, + -70, -21, -81, -71, -21, -81, -72, -21, -81, -73, -21, -81, -74, -21, -81, -75, -21, -81, -76, -21, + -81, -77, -21, -81, -78, -21, -81, -79, -21, -81, -80, -21, -81, -81, -21, -81, -82, -21, -81, -83, + -21, -81, -84, -21, -81, -85, -21, -81, -86, -21, -81, -87, -21, -81, -88, -21, -81, -89, -21, -81, + -90, -21, -81, -91, -21, -81, -92, -21, -81, -93, -21, -81, -94, -21, -81, -95, -21, -81, -96, -21, + -81, -97, -21, -81, -98, -21, -81, -99, -21, -81,-100, -21, -81,-101, -21, -81,-102, -21, -81,-103, + -21, -81,-104, -21, -81,-105, -21, -81,-106, -21, -81,-107, -21, -81,-108, -21, -81,-109, -21, -81, +-110, -21, -81,-111, -21, -81,-112, -21, -81,-113, -21, -81,-114, -21, -81,-115, -21, -81,-116, -21, + -81,-117, -21, -81,-118, -21, -81,-119, -21, -81,-120, -21, -81,-121, -21, -81,-122, -21, -81,-123, + -21, -81,-124, -21, -81,-125, -21, -81,-126, -21, -81,-127, -21, -81,-128, -21, -82, -65, -21, -82, + -66, -21, -82, -67, -21, -82, -68, -21, -82, -69, -21, -82, -70, -21, -82, -71, -21, -82, -72, -21, + -82, -73, -21, -82, -74, -21, -82, -75, -21, -82, -76, -21, -82, -77, -21, -82, -78, -21, -82, -79, + -21, -82, -80, -21, -82, -81, -21, -82, -82, -21, -82, -83, -21, -82, -84, -21, -82, -85, -21, -82, + -86, -21, -82, -87, -21, -82, -88, -21, -82, -89, -21, -82, -90, -21, -82, -91, -21, -82, -92, -21, + -82, -93, -21, -82, -94, -21, -82, -95, -21, -82, -96, -21, -82, -97, -21, -82, -98, -21, -82, -99, + -21, -82,-100, -21, -82,-101, -21, -82,-102, -21, -82,-103, -21, -82,-104, -21, -82,-105, -21, -82, +-106, -21, -82,-107, -21, -82,-108, -21, -82,-109, -21, -82,-110, -21, -82,-111, -21, -82,-112, -21, + -82,-113, -21, -82,-114, -21, -82,-115, -21, -82,-116, -21, -82,-117, -21, -82,-118, -21, -82,-119, + -21, -82,-120, -21, -82,-121, -21, -82,-122, -21, -82,-123, -21, -82,-124, -21, -82,-125, -21, -82, +-126, -21, -82,-127, -21, -82,-128, -21, -83, -65, -21, -83, -66, -21, -83, -67, -21, -83, -68, -21, + -83, -69, -21, -83, -70, -21, -83, -71, -21, -83, -72, -21, -83, -73, -21, -83, -74, -21, -83, -75, + -21, -83, -76, -21, -83, -77, -21, -83, -78, -21, -83, -79, -21, -83, -80, -21, -83, -81, -21, -83, + -82, -21, -83, -83, -21, -83, -84, -21, -83, -85, -21, -83, -86, -21, -83, -87, -21, -83, -88, -21, + -83, -89, -21, -83, -90, -21, -83, -91, -21, -83, -92, -21, -83, -93, -21, -83, -94, -21, -83, -95, + -21, -83, -96, -21, -83, -97, -21, -83, -98, -21, -83, -99, -21, -83,-100, -21, -83,-101, -21, -83, +-102, -21, -83,-103, -21, -83,-104, -21, -83,-105, -21, -83,-106, -21, -83,-107, -21, -83,-108, -21, + -83,-109, -21, -83,-110, -21, -83,-111, -21, -83,-112, -21, -83,-113, -21, -83,-114, -21, -83,-115, + -21, -83,-116, -21, -83,-117, -21, -83,-118, -21, -83,-119, -21, -83,-120, -21, -83,-121, -21, -83, +-122, -21, -83,-123, -21, -83,-124, -21, -83,-125, -21, -83,-126, -21, -83,-127, -21, -83,-128, -21, + -84, -65, -21, -84, -66, -21, -84, -67, -21, -84, -68, -21, -84, -69, -21, -84, -70, -21, -84, -71, + -21, -84, -72, -21, -84, -73, -21, -84, -74, -21, -84, -75, -21, -84, -76, -21, -84, -77, -21, -84, + -78, -21, -84, -79, -21, -84, -80, -21, -84, -81, -21, -84, -82, -21, -84, -83, -21, -84, -84, -21, + -84, -85, -21, -84, -86, -21, -84, -87, -21, -84, -88, -21, -84, -89, -21, -84, -90, -21, -84, -91, + -21, -84, -92, -21, -84, -93, -21, -84, -94, -21, -84, -95, -21, -84, -96, -21, -84, -97, -21, -84, + -98, -21, -84, -99, -21, -84,-100, -21, -84,-101, -21, -84,-102, -21, -84,-103, -21, -84,-104, -21, + -84,-105, -21, -84,-106, -21, -84,-107, -21, -84,-108, -21, -84,-109, -21, -84,-110, -21, -84,-111, + -21, -84,-112, -21, -84,-113, -21, -84,-114, -21, -84,-115, -21, -84,-116, -21, -84,-117, -21, -84, +-118, -21, -84,-119, -21, -84,-120, -21, -84,-121, -21, -84,-122, -21, -84,-123, -21, -84,-124, -21, + -84,-125, -21, -84,-126, -21, -84,-127, -21, -84,-128, -21, -85, -65, -21, -85, -66, -21, -85, -67, + -21, -85, -68, -21, -85, -69, -21, -85, -70, -21, -85, -71, -21, -85, -72, -21, -85, -73, -21, -85, + -74, -21, -85, -75, -21, -85, -76, -21, -85, -77, -21, -85, -78, -21, -85, -79, -21, -85, -80, -21, + -85, -81, -21, -85, -82, -21, -85, -83, -21, -85, -84, -21, -85, -85, -21, -85, -86, -21, -85, -87, + -21, -85, -88, -21, -85, -89, -21, -85, -90, -21, -85, -91, -21, -85, -92, -21, -85, -93, -21, -85, + -94, -21, -85, -95, -21, -85, -96, -21, -85, -97, -21, -85, -98, -21, -85, -99, -21, -85,-100, -21, + -85,-101, -21, -85,-102, -21, -85,-103, -21, -85,-104, -21, -85,-105, -21, -85,-106, -21, -85,-107, + -21, -85,-108, -21, -85,-109, -21, -85,-110, -21, -85,-111, -21, -85,-112, -21, -85,-113, -21, -85, +-114, -21, -85,-115, -21, -85,-116, -21, -85,-117, -21, -85,-118, -21, -85,-119, -21, -85,-120, -21, + -85,-121, -21, -85,-122, -21, -85,-123, -21, -85,-124, -21, -85,-125, -21, -85,-126, -21, -85,-127, + -21, -85,-128, -21, -86, -65, -21, -86, -66, -21, -86, -67, -21, -86, -68, -21, -86, -69, -21, -86, + -70, -21, -86, -71, -21, -86, -72, -21, -86, -73, -21, -86, -74, -21, -86, -75, -21, -86, -76, -21, + -86, -77, -21, -86, -78, -21, -86, -79, -21, -86, -80, -21, -86, -81, -21, -86, -82, -21, -86, -83, + -21, -86, -84, -21, -86, -85, -21, -86, -86, -21, -86, -87, -21, -86, -88, -21, -86, -89, -21, -86, + -90, -21, -86, -91, -21, -86, -92, -21, -86, -93, -21, -86, -94, -21, -86, -95, -21, -86, -96, -21, + -86, -97, -21, -86, -98, -21, -86, -99, -21, -86,-100, -21, -86,-101, -21, -86,-102, -21, -86,-103, + -21, -86,-104, -21, -86,-105, -21, -86,-106, -21, -86,-107, -21, -86,-108, -21, -86,-109, -21, -86, +-110, -21, -86,-111, -21, -86,-112, -21, -86,-113, -21, -86,-114, -21, -86,-115, -21, -86,-116, -21, + -86,-117, -21, -86,-118, -21, -86,-119, -21, -86,-120, -21, -86,-121, -21, -86,-122, -21, -86,-123, + -21, -86,-124, -21, -86,-125, -21, -86,-126, -21, -86,-127, -21, -86,-128, -21, -87, -65, -21, -87, + -66, -21, -87, -67, -21, -87, -68, -21, -87, -69, -21, -87, -70, -21, -87, -71, -21, -87, -72, -21, + -87, -73, -21, -87, -74, -21, -87, -75, -21, -87, -76, -21, -87, -77, -21, -87, -78, -21, -87, -79, + -21, -87, -80, -21, -87, -81, -21, -87, -82, -21, -87, -83, -21, -87, -84, -21, -87, -85, -21, -87, + -86, -21, -87, -87, -21, -87, -88, -21, -87, -89, -21, -87, -90, -21, -87, -91, -21, -87, -92, -21, + -87, -93, -21, -87, -94, -21, -87, -95, -21, -87, -96, -21, -87, -97, -21, -87, -98, -21, -87, -99, + -21, -87,-100, -21, -87,-101, -21, -87,-102, -21, -87,-103, -21, -87,-104, -21, -87,-105, -21, -87, +-106, -21, -87,-107, -21, -87,-108, -21, -87,-109, -21, -87,-110, -21, -87,-111, -21, -87,-112, -21, + -87,-113, -21, -87,-114, -21, -87,-115, -21, -87,-116, -21, -87,-117, -21, -87,-118, -21, -87,-119, + -21, -87,-120, -21, -87,-121, -21, -87,-122, -21, -87,-123, -21, -87,-124, -21, -87,-125, -21, -87, +-126, -21, -87,-127, -21, -87,-128, -21, -88, -65, -21, -88, -66, -21, -88, -67, -21, -88, -68, -21, + -88, -69, -21, -88, -70, -21, -88, -71, -21, -88, -72, -21, -88, -73, -21, -88, -74, -21, -88, -75, + -21, -88, -76, -21, -88, -77, -21, -88, -78, -21, -88, -79, -21, -88, -80, -21, -88, -81, -21, -88, + -82, -21, -88, -83, -21, -88, -84, -21, -88, -85, -21, -88, -86, -21, -88, -87, -21, -88, -88, -21, + -88, -89, -21, -88, -90, -21, -88, -91, -21, -88, -92, -21, -88, -93, -21, -88, -94, -21, -88, -95, + -21, -88, -96, -21, -88, -97, -21, -88, -98, -21, -88, -99, -21, -88,-100, -21, -88,-101, -21, -88, +-102, -21, -88,-103, -21, -88,-104, -21, -88,-105, -21, -88,-106, -21, -88,-107, -21, -88,-108, -21, + -88,-109, -21, -88,-110, -21, -88,-111, -21, -88,-112, -21, -88,-113, -21, -88,-114, -21, -88,-115, + -21, -88,-116, -21, -88,-117, -21, -88,-118, -21, -88,-119, -21, -88,-120, -21, -88,-121, -21, -88, +-122, -21, -88,-123, -21, -88,-124, -21, -88,-125, -21, -88,-126, -21, -88,-127, -21, -88,-128, -21, + -89, -65, -21, -89, -66, -21, -89, -67, -21, -89, -68, -21, -89, -69, -21, -89, -70, -21, -89, -71, + -21, -89, -72, -21, -89, -73, -21, -89, -74, -21, -89, -75, -21, -89, -76, -21, -89, -77, -21, -89, + -78, -21, -89, -79, -21, -89, -80, -21, -89, -81, -21, -89, -82, -21, -89, -83, -21, -89, -84, -21, + -89, -85, -21, -89, -86, -21, -89, -87, -21, -89, -88, -21, -89, -89, -21, -89, -90, -21, -89, -91, + -21, -89, -92, -21, -89, -93, -21, -89, -94, -21, -89, -95, -21, -89, -96, -21, -89, -97, -21, -89, + -98, -21, -89, -99, -21, -89,-100, -21, -89,-101, -21, -89,-102, -21, -89,-103, -21, -89,-104, -21, + -89,-105, -21, -89,-106, -21, -89,-107, -21, -89,-108, -21, -89,-109, -21, -89,-110, -21, -89,-111, + -21, -89,-112, -21, -89,-113, -21, -89,-114, -21, -89,-115, -21, -89,-116, -21, -89,-117, -21, -89, +-118, -21, -89,-119, -21, -89,-120, -21, -89,-121, -21, -89,-122, -21, -89,-123, -21, -89,-124, -21, + -89,-125, -21, -89,-126, -21, -89,-127, -21, -89,-128, -21, -90, -65, -21, -90, -66, -21, -90, -67, + -21, -90, -68, -21, -90, -69, -21, -90, -70, -21, -90, -71, -21, -90, -72, -21, -90, -73, -21, -90, + -74, -21, -90, -75, -21, -90, -76, -21, -90, -77, -21, -90, -78, -21, -90, -79, -21, -90, -80, -21, + -90, -81, -21, -90, -82, -21, -90, -83, -21, -90, -84, -21, -90, -85, -21, -90, -86, -21, -90, -87, + -21, -90, -88, -21, -90, -89, -21, -90, -90, -21, -90, -91, -21, -90, -92, -21, -90, -93, -21, -90, + -94, -21, -90, -95, -21, -90, -96, -21, -90, -97, -21, -90, -98, -21, -90, -99, -21, -90,-100, -21, + -90,-101, -21, -90,-102, -21, -90,-103, -21, -90,-104, -21, -90,-105, -21, -90,-106, -21, -90,-107, + -21, -90,-108, -21, -90,-109, -21, -90,-110, -21, -90,-111, -21, -90,-112, -21, -90,-113, -21, -90, +-114, -21, -90,-115, -21, -90,-116, -21, -90,-117, -21, -90,-118, -21, -90,-119, -21, -90,-120, -21, + -90,-121, -21, -90,-122, -21, -90,-123, -21, -90,-124, -21, -90,-125, -21, -90,-126, -21, -90,-127, + -21, -90,-128, -21, -91, -65, -21, -91, -66, -21, -91, -67, -21, -91, -68, -21, -91, -69, -21, -91, + -70, -21, -91, -71, -21, -91, -72, -21, -91, -73, -21, -91, -74, -21, -91, -75, -21, -91, -76, -21, + -91, -77, -21, -91, -78, -21, -91, -79, -21, -91, -80, -21, -91, -81, -21, -91, -82, -21, -91, -83, + -21, -91, -84, -21, -91, -85, -21, -91, -86, -21, -91, -87, -21, -91, -88, -21, -91, -89, -21, -91, + -90, -21, -91, -91, -21, -91, -92, -21, -91, -93, -21, -91, -94, -21, -91, -95, -21, -91, -96, -21, + -91, -97, -21, -91, -98, -21, -91, -99, -21, -91,-100, -21, -91,-101, -21, -91,-102, -21, -91,-103, + -21, -91,-104, -21, -91,-105, -21, -91,-106, -21, -91,-107, -21, -91,-108, -21, -91,-109, -21, -91, +-110, -21, -91,-111, -21, -91,-112, -21, -91,-113, -21, -91,-114, -21, -91,-115, -21, -91,-116, -21, + -91,-117, -21, -91,-118, -21, -91,-119, -21, -91,-120, -21, -91,-121, -21, -91,-122, -21, -91,-123, + -21, -91,-124, -21, -91,-125, -21, -91,-126, -21, -91,-127, -21, -91,-128, -21, -92, -65, -21, -92, + -66, -21, -92, -67, -21, -92, -68, -21, -92, -69, -21, -92, -70, -21, -92, -71, -21, -92, -72, -21, + -92, -73, -21, -92, -74, -21, -92, -75, -21, -92, -76, -21, -92, -77, -21, -92, -78, -21, -92, -79, + -21, -92, -80, -21, -92, -81, -21, -92, -82, -21, -92, -83, -21, -92, -84, -21, -92, -85, -21, -92, + -86, -21, -92, -87, -21, -92, -88, -21, -92, -89, -21, -92, -90, -21, -92, -91, -21, -92, -92, -21, + -92, -93, -21, -92, -94, -21, -92, -95, -21, -92, -96, -21, -92, -97, -21, -92, -98, -21, -92, -99, + -21, -92,-100, -21, -92,-101, -21, -92,-102, -21, -92,-103, -21, -92,-104, -21, -92,-105, -21, -92, +-106, -21, -92,-107, -21, -92,-108, -21, -92,-109, -21, -92,-110, -21, -92,-111, -21, -92,-112, -21, + -92,-113, -21, -92,-114, -21, -92,-115, -21, -92,-116, -21, -92,-117, -21, -92,-118, -21, -92,-119, + -21, -92,-120, -21, -92,-121, -21, -92,-122, -21, -92,-123, -21, -92,-124, -21, -92,-125, -21, -92, +-126, -21, -92,-127, -21, -92,-128, -21, -93, -65, -21, -93, -66, -21, -93, -67, -21, -93, -68, -21, + -93, -69, -21, -93, -70, -21, -93, -71, -21, -93, -72, -21, -93, -73, -21, -93, -74, -21, -93, -75, + -21, -93, -76, -21, -93, -77, -21, -93, -78, -21, -93, -79, -21, -93, -80, -21, -93, -81, -21, -93, + -82, -21, -93, -83, -21, -93, -84, -21, -93, -85, -21, -93, -86, -21, -93, -87, -21, -93, -88, -21, + -93, -89, -21, -93, -90, -21, -93, -91, -21, -93, -92, -21, -93, -93, -21, -93, -94, -21, -93, -95, + -21, -93, -96, -21, -93, -97, -21, -93, -98, -21, -93, -99, -21, -93,-100, -21, -93,-101, -21, -93, +-102, -21, -93,-103, -21, -93,-104, -21, -93,-105, -21, -93,-106, -21, -93,-107, -21, -93,-108, -21, + -93,-109, -21, -93,-110, -21, -93,-111, -21, -93,-112, -21, -93,-113, -21, -93,-114, -21, -93,-115, + -21, -93,-116, -21, -93,-117, -21, -93,-118, -21, -93,-119, -21, -93,-120, -21, -93,-121, -21, -93, +-122, -21, -93,-123, -21, -93,-124, -21, -93,-125, -21, -93,-126, -21, -93,-127, -21, -93,-128, -21, + -94, -65, -21, -94, -66, -21, -94, -67, -21, -94, -68, -21, -94, -69, -21, -94, -70, -21, -94, -71, + -21, -94, -72, -21, -94, -73, -21, -94, -74, -21, -94, -75, -21, -94, -76, -21, -94, -77, -21, -94, + -78, -21, -94, -79, -21, -94, -80, -21, -94, -81, -21, -94, -82, -21, -94, -83, -21, -94, -84, -21, + -94, -85, -21, -94, -86, -21, -94, -87, -21, -94, -88, -21, -94, -89, -21, -94, -90, -21, -94, -91, + -21, -94, -92, -21, -94, -93, -21, -94, -94, -21, -94, -95, -21, -94, -96, -21, -94, -97, -21, -94, + -98, -21, -94, -99, -21, -94,-100, -21, -94,-101, -21, -94,-102, -21, -94,-103, -21, -94,-104, -21, + -94,-105, -21, -94,-106, -21, -94,-107, -21, -94,-108, -21, -94,-109, -21, -94,-110, -21, -94,-111, + -21, -94,-112, -21, -94,-113, -21, -94,-114, -21, -94,-115, -21, -94,-116, -21, -94,-117, -21, -94, +-118, -21, -94,-119, -21, -94,-120, -21, -94,-121, -21, -94,-122, -21, -94,-123, -21, -94,-124, -21, + -94,-125, -21, -94,-126, -21, -94,-127, -21, -94,-128, -21, -95, -65, -21, -95, -66, -21, -95, -67, + -21, -95, -68, -21, -95, -69, -21, -95, -70, -21, -95, -71, -21, -95, -72, -21, -95, -73, -21, -95, + -74, -21, -95, -75, -21, -95, -76, -21, -95, -77, -21, -95, -78, -21, -95, -79, -21, -95, -80, -21, + -95, -81, -21, -95, -82, -21, -95, -83, -21, -95, -84, -21, -95, -85, -21, -95, -86, -21, -95, -87, + -21, -95, -88, -21, -95, -89, -21, -95, -90, -21, -95, -91, -21, -95, -92, -21, -95, -93, -21, -95, + -94, -21, -95, -95, -21, -95, -96, -21, -95, -97, -21, -95, -98, -21, -95, -99, -21, -95,-100, -21, + -95,-101, -21, -95,-102, -21, -95,-103, -21, -95,-104, -21, -95,-105, -21, -95,-106, -21, -95,-107, + -21, -95,-108, -21, -95,-109, -21, -95,-110, -21, -95,-111, -21, -95,-112, -21, -95,-113, -21, -95, +-114, -21, -95,-115, -21, -95,-116, -21, -95,-117, -21, -95,-118, -21, -95,-119, -21, -95,-120, -21, + -95,-121, -21, -95,-122, -21, -95,-123, -21, -95,-124, -21, -95,-125, -21, -95,-126, -21, -95,-127, + -21, -95,-128, -21, -96, -65, -21, -96, -66, -21, -96, -67, -21, -96, -68, -21, -96, -69, -21, -96, + -70, -21, -96, -71, -21, -96, -72, -21, -96, -73, -21, -96, -74, -21, -96, -75, -21, -96, -76, -21, + -96, -77, -21, -96, -78, -21, -96, -79, -21, -96, -80, -21, -96, -81, -21, -96, -82, -21, -96, -83, + -21, -96, -84, -21, -96, -85, -21, -96, -86, -21, -96, -87, -21, -96, -88, -21, -96, -89, -21, -96, + -90, -21, -96, -91, -21, -96, -92, -21, -96, -93, -21, -96, -94, -21, -96, -95, -21, -96, -96, -21, + -96, -97, -21, -96, -98, -21, -96, -99, -21, -96,-100, -21, -96,-101, -21, -96,-102, -21, -96,-103, + -21, -96,-104, -21, -96,-105, -21, -96,-106, -21, -96,-107, -21, -96,-108, -21, -96,-109, -21, -96, +-110, -21, -96,-111, -21, -96,-112, -21, -96,-113, -21, -96,-114, -21, -96,-115, -21, -96,-116, -21, + -96,-117, -21, -96,-118, -21, -96,-119, -21, -96,-120, -21, -96,-121, -21, -96,-122, -21, -96,-123, + -21, -96,-124, -21, -96,-125, -21, -96,-126, -21, -96,-127, -21, -96,-128, -21, -97, -65, -21, -97, + -66, -21, -97, -67, -21, -97, -68, -21, -97, -69, -21, -97, -70, -21, -97, -71, -21, -97, -72, -21, + -97, -73, -21, -97, -74, -21, -97, -75, -21, -97, -76, -21, -97, -77, -21, -97, -78, -21, -97, -79, + -21, -97, -80, -21, -97, -81, -21, -97, -82, -21, -97, -83, -21, -97, -84, -21, -97, -85, -21, -97, + -86, -21, -97, -87, -21, -97, -88, -21, -97, -89, -21, -97, -90, -21, -97, -91, -21, -97, -92, -21, + -97, -93, -21, -97, -94, -21, -97, -95, -21, -97, -96, -21, -97, -97, -21, -97, -98, -21, -97, -99, + -21, -97,-100, -21, -97,-101, -21, -97,-102, -21, -97,-103, -21, -97,-104, -21, -97,-105, -21, -97, +-106, -21, -97,-107, -21, -97,-108, -21, -97,-109, -21, -97,-110, -21, -97,-111, -21, -97,-112, -21, + -97,-113, -21, -97,-114, -21, -97,-115, -21, -97,-116, -21, -97,-117, -21, -97,-118, -21, -97,-119, + -21, -97,-120, -21, -97,-121, -21, -97,-122, -21, -97,-123, -21, -97,-124, -21, -97,-125, -21, -97, +-126, -21, -97,-127, -21, -97,-128, -21, -98, -65, -21, -98, -66, -21, -98, -67, -21, -98, -68, -21, + -98, -69, -21, -98, -70, -21, -98, -71, -21, -98, -72, -21, -98, -73, -21, -98, -74, -21, -98, -75, + -21, -98, -76, -21, -98, -77, -21, -98, -78, -21, -98, -79, -21, -98, -80, -21, -98, -81, -21, -98, + -82, -21, -98, -83, -21, -98, -84, -21, -98, -85, -21, -98, -86, -21, -98, -87, -21, -98, -88, -21, + -98, -89, -21, -98, -90, -21, -98, -91, -21, -98, -92, -21, -98, -93, -21, -98, -94, -21, -98, -95, + -21, -98, -96, -21, -98, -97, -21, -98, -98, -21, -98, -99, -21, -98,-100, -21, -98,-101, -21, -98, +-102, -21, -98,-103, -21, -98,-104, -21, -98,-105, -21, -98,-106, -21, -98,-107, -21, -98,-108, -21, + -98,-109, -21, -98,-110, -21, -98,-111, -21, -98,-112, -21, -98,-113, -21, -98,-114, -21, -98,-115, + -21, -98,-116, -21, -98,-117, -21, -98,-118, -21, -98,-119, -21, -98,-120, -21, -98,-121, -21, -98, +-122, -21, -98,-123, -21, -98,-124, -21, -98,-125, -21, -98,-126, -21, -98,-127, -21, -98,-128, -21, + -99, -65, -21, -99, -66, -21, -99, -67, -21, -99, -68, -21, -99, -69, -21, -99, -70, -21, -99, -71, + -21, -99, -72, -21, -99, -73, -21, -99, -74, -21, -99, -75, -21, -99, -76, -21, -99, -77, -21, -99, + -78, -21, -99, -79, -21, -99, -80, -21, -99, -81, -21, -99, -82, -21, -99, -83, -21, -99, -84, -21, + -99, -85, -21, -99, -86, -21, -99, -87, -21, -99, -88, -21, -99, -89, -21, -99, -90, -21, -99, -91, + -21, -99, -92, -21, -99, -93, -21, -99, -94, -21, -99, -95, -21, -99, -96, -21, -99, -97, -21, -99, + -98, -21, -99, -99, -21, -99,-100, -21, -99,-101, -21, -99,-102, -21, -99,-103, -21, -99,-104, -21, + -99,-105, -21, -99,-106, -21, -99,-107, -21, -99,-108, -21, -99,-109, -21, -99,-110, -21, -99,-111, + -21, -99,-112, -21, -99,-113, -21, -99,-114, -21, -99,-115, -21, -99,-116, -21, -99,-117, -21, -99, +-118, -21, -99,-119, -21, -99,-120, -21, -99,-121, -21, -99,-122, -21, -99,-123, -21, -99,-124, -21, + -99,-125, -21, -99,-126, -21, -99,-127, -21, -99,-128, -21,-100, -65, -21,-100, -66, -21,-100, -67, + -21,-100, -68, -21,-100, -69, -21,-100, -70, -21,-100, -71, -21,-100, -72, -21,-100, -73, -21,-100, + -74, -21,-100, -75, -21,-100, -76, -21,-100, -77, -21,-100, -78, -21,-100, -79, -21,-100, -80, -21, +-100, -81, -21,-100, -82, -21,-100, -83, -21,-100, -84, -21,-100, -85, -21,-100, -86, -21,-100, -87, + -21,-100, -88, -21,-100, -89, -21,-100, -90, -21,-100, -91, -21,-100, -92, -21,-100, -93, -21,-100, + -94, -21,-100, -95, -21,-100, -96, -21,-100, -97, -21,-100, -98, -21,-100, -99, -21,-100,-100, -21, +-100,-101, -21,-100,-102, -21,-100,-103, -21,-100,-104, -21,-100,-105, -21,-100,-106, -21,-100,-107, + -21,-100,-108, -21,-100,-109, -21,-100,-110, -21,-100,-111, -21,-100,-112, -21,-100,-113, -21,-100, +-114, -21,-100,-115, -21,-100,-116, -21,-100,-117, -21,-100,-118, -21,-100,-119, -21,-100,-120, -21, +-100,-121, -21,-100,-122, -21,-100,-123, -21,-100,-124, -21,-100,-125, -21,-100,-126, -21,-100,-127, + -21,-100,-128, -21,-101, -65, -21,-101, -66, -21,-101, -67, -21,-101, -68, -21,-101, -69, -21,-101, + -70, -21,-101, -71, -21,-101, -72, -21,-101, -73, -21,-101, -74, -21,-101, -75, -21,-101, -76, -21, +-101, -77, -21,-101, -78, -21,-101, -79, -21,-101, -80, -21,-101, -81, -21,-101, -82, -21,-101, -83, + -21,-101, -84, -21,-101, -85, -21,-101, -86, -21,-101, -87, -21,-101, -88, -21,-101, -89, -21,-101, + -90, -21,-101, -91, -21,-101, -92, -21,-101, -93, -21,-101, -94, -21,-101, -95, -21,-101, -96, -21, +-101, -97, -21,-101, -98, -21,-101, -99, -21,-101,-100, -21,-101,-101, -21,-101,-102, -21,-101,-103, + -21,-101,-104, -21,-101,-105, -21,-101,-106, -21,-101,-107, -21,-101,-108, -21,-101,-109, -21,-101, +-110, -21,-101,-111, -21,-101,-112, -21,-101,-113, -21,-101,-114, -21,-101,-115, -21,-101,-116, -21, +-101,-117, -21,-101,-118, -21,-101,-119, -21,-101,-120, -21,-101,-121, -21,-101,-122, -21,-101,-123, + -21,-101,-124, -21,-101,-125, -21,-101,-126, -21,-101,-127, -21,-101,-128, -21,-102, -65, -21,-102, + -66, -21,-102, -67, -21,-102, -68, -21,-102, -69, -21,-102, -70, -21,-102, -71, -21,-102, -72, -21, +-102, -73, -21,-102, -74, -21,-102, -75, -21,-102, -76, -21,-102, -77, -21,-102, -78, -21,-102, -79, + -21,-102, -80, -21,-102, -81, -21,-102, -82, -21,-102, -83, -21,-102, -84, -21,-102, -85, -21,-102, + -86, -21,-102, -87, -21,-102, -88, -21,-102, -89, -21,-102, -90, -21,-102, -91, -21,-102, -92, -21, +-102, -93, -21,-102, -94, -21,-102, -95, -21,-102, -96, -21,-102, -97, -21,-102, -98, -21,-102, -99, + -21,-102,-100, -21,-102,-101, -21,-102,-102, -21,-102,-103, -21,-102,-104, -21,-102,-105, -21,-102, +-106, -21,-102,-107, -21,-102,-108, -21,-102,-109, -21,-102,-110, -21,-102,-111, -21,-102,-112, -21, +-102,-113, -21,-102,-114, -21,-102,-115, -21,-102,-116, -21,-102,-117, -21,-102,-118, -21,-102,-119, + -21,-102,-120, -21,-102,-121, -21,-102,-122, -21,-102,-123, -21,-102,-124, -21,-102,-125, -21,-102, +-126, -21,-102,-127, -21,-102,-128, -21,-103, -65, -21,-103, -66, -21,-103, -67, -21,-103, -68, -21, +-103, -69, -21,-103, -70, -21,-103, -71, -21,-103, -72, -21,-103, -73, -21,-103, -74, -21,-103, -75, + -21,-103, -76, -21,-103, -77, -21,-103, -78, -21,-103, -79, -21,-103, -80, -21,-103, -81, -21,-103, + -82, -21,-103, -83, -21,-103, -84, -21,-103, -85, -21,-103, -86, -21,-103, -87, -21,-103, -88, -21, +-103, -89, -21,-103, -90, -21,-103, -91, -21,-103, -92, -21,-103, -93, -21,-103, -94, -21,-103, -95, + -21,-103, -96, -21,-103, -97, -21,-103, -98, -21,-103, -99, -21,-103,-100, -21,-103,-101, -21,-103, +-102, -21,-103,-103, -21,-103,-104, -21,-103,-105, -21,-103,-106, -21,-103,-107, -21,-103,-108, -21, +-103,-109, -21,-103,-110, -21,-103,-111, -21,-103,-112, -21,-103,-113, -21,-103,-114, -21,-103,-115, + -21,-103,-116, -21,-103,-117, -21,-103,-118, -21,-103,-119, -21,-103,-120, -21,-103,-121, -21,-103, +-122, -21,-103,-123, -21,-103,-124, -21,-103,-125, -21,-103,-126, -21,-103,-127, -21,-103,-128, -21, +-104, -65, -21,-104, -66, -21,-104, -67, -21,-104, -68, -21,-104, -69, -21,-104, -70, -21,-104, -71, + -21,-104, -72, -21,-104, -73, -21,-104, -74, -21,-104, -75, -21,-104, -76, -21,-104, -77, -21,-104, + -78, -21,-104, -79, -21,-104, -80, -21,-104, -81, -21,-104, -82, -21,-104, -83, -21,-104, -84, -21, +-104, -85, -21,-104, -86, -21,-104, -87, -21,-104, -88, -21,-104, -89, -21,-104, -90, -21,-104, -91, + -21,-104, -92, -21,-104, -93, -21,-104, -94, -21,-104, -95, -21,-104, -96, -21,-104, -97, -21,-104, + -98, -21,-104, -99, -21,-104,-100, -21,-104,-101, -21,-104,-102, -21,-104,-103, -21,-104,-104, -21, +-104,-105, -21,-104,-106, -21,-104,-107, -21,-104,-108, -21,-104,-109, -21,-104,-110, -21,-104,-111, + -21,-104,-112, -21,-104,-113, -21,-104,-114, -21,-104,-115, -21,-104,-116, -21,-104,-117, -21,-104, +-118, -21,-104,-119, -21,-104,-120, -21,-104,-121, -21,-104,-122, -21,-104,-123, -21,-104,-124, -21, +-104,-125, -21,-104,-126, -21,-104,-127, -21,-104,-128, -21,-105, -65, -21,-105, -66, -21,-105, -67, + -21,-105, -68, -21,-105, -69, -21,-105, -70, -21,-105, -71, -21,-105, -72, -21,-105, -73, -21,-105, + -74, -21,-105, -75, -21,-105, -76, -21,-105, -77, -21,-105, -78, -21,-105, -79, -21,-105, -80, -21, +-105, -81, -21,-105, -82, -21,-105, -83, -21,-105, -84, -21,-105, -85, -21,-105, -86, -21,-105, -87, + -21,-105, -88, -21,-105, -89, -21,-105, -90, -21,-105, -91, -21,-105, -92, -21,-105, -93, -21,-105, + -94, -21,-105, -95, -21,-105, -96, -21,-105, -97, -21,-105, -98, -21,-105, -99, -21,-105,-100, -21, +-105,-101, -21,-105,-102, -21,-105,-103, -21,-105,-104, -21,-105,-105, -21,-105,-106, -21,-105,-107, + -21,-105,-108, -21,-105,-109, -21,-105,-110, -21,-105,-111, -21,-105,-112, -21,-105,-113, -21,-105, +-114, -21,-105,-115, -21,-105,-116, -21,-105,-117, -21,-105,-118, -21,-105,-119, -21,-105,-120, -21, +-105,-121, -21,-105,-122, -21,-105,-123, -21,-105,-124, -21,-105,-125, -21,-105,-126, -21,-105,-127, + -21,-105,-128, -21,-106, -65, -21,-106, -66, -21,-106, -67, -21,-106, -68, -21,-106, -69, -21,-106, + -70, -21,-106, -71, -21,-106, -72, -21,-106, -73, -21,-106, -74, -21,-106, -75, -21,-106, -76, -21, +-106, -77, -21,-106, -78, -21,-106, -79, -21,-106, -80, -21,-106, -81, -21,-106, -82, -21,-106, -83, + -21,-106, -84, -21,-106, -85, -21,-106, -86, -21,-106, -87, -21,-106, -88, -21,-106, -89, -21,-106, + -90, -21,-106, -91, -21,-106, -92, -21,-106, -93, -21,-106, -94, -21,-106, -95, -21,-106, -96, -21, +-106, -97, -21,-106, -98, -21,-106, -99, -21,-106,-100, -21,-106,-101, -21,-106,-102, -21,-106,-103, + -21,-106,-104, -21,-106,-105, -21,-106,-106, -21,-106,-107, -21,-106,-108, -21,-106,-109, -21,-106, +-110, -21,-106,-111, -21,-106,-112, -21,-106,-113, -21,-106,-114, -21,-106,-115, -21,-106,-116, -21, +-106,-117, -21,-106,-118, -21,-106,-119, -21,-106,-120, -21,-106,-121, -21,-106,-122, -21,-106,-123, + -21,-106,-124, -21,-106,-125, -21,-106,-126, -21,-106,-127, -21,-106,-128, -21,-107, -65, -21,-107, + -66, -21,-107, -67, -21,-107, -68, -21,-107, -69, -21,-107, -70, -21,-107, -71, -21,-107, -72, -21, +-107, -73, -21,-107, -74, -21,-107, -75, -21,-107, -76, -21,-107, -77, -21,-107, -78, -21,-107, -79, + -21,-107, -80, -21,-107, -81, -21,-107, -82, -21,-107, -83, -21,-107, -84, -21,-107, -85, -21,-107, + -86, -21,-107, -87, -21,-107, -88, -21,-107, -89, -21,-107, -90, -21,-107, -91, -21,-107, -92, -21, +-107, -93, -21,-107, -94, -21,-107, -95, -21,-107, -96, -21,-107, -97, -21,-107, -98, -21,-107, -99, + -21,-107,-100, -21,-107,-101, -21,-107,-102, -21,-107,-103, -21,-107,-104, -21,-107,-105, -21,-107, +-106, -21,-107,-107, -21,-107,-108, -21,-107,-109, -21,-107,-110, -21,-107,-111, -21,-107,-112, -21, +-107,-113, -21,-107,-114, -21,-107,-115, -21,-107,-116, -21,-107,-117, -21,-107,-118, -21,-107,-119, + -21,-107,-120, -21,-107,-121, -21,-107,-122, -21,-107,-123, -21,-107,-124, -21,-107,-125, -21,-107, +-126, -21,-107,-127, -21,-107,-128, -21,-108, -65, -21,-108, -66, -21,-108, -67, -21,-108, -68, -21, +-108, -69, -21,-108, -70, -21,-108, -71, -21,-108, -72, -21,-108, -73, -21,-108, -74, -21,-108, -75, + -21,-108, -76, -21,-108, -77, -21,-108, -78, -21,-108, -79, -21,-108, -80, -21,-108, -81, -21,-108, + -82, -21,-108, -83, -21,-108, -84, -21,-108, -85, -21,-108, -86, -21,-108, -87, -21,-108, -88, -21, +-108, -89, -21,-108, -90, -21,-108, -91, -21,-108, -92, -21,-108, -93, -21,-108, -94, -21,-108, -95, + -21,-108, -96, -21,-108, -97, -21,-108, -98, -21,-108, -99, -21,-108,-100, -21,-108,-101, -21,-108, +-102, -21,-108,-103, -21,-108,-104, -21,-108,-105, -21,-108,-106, -21,-108,-107, -21,-108,-108, -21, +-108,-109, -21,-108,-110, -21,-108,-111, -21,-108,-112, -21,-108,-113, -21,-108,-114, -21,-108,-115, + -21,-108,-116, -21,-108,-117, -21,-108,-118, -21,-108,-119, -21,-108,-120, -21,-108,-121, -21,-108, +-122, -21,-108,-123, -21,-108,-124, -21,-108,-125, -21,-108,-126, -21,-108,-127, -21,-108,-128, -21, +-109, -65, -21,-109, -66, -21,-109, -67, -21,-109, -68, -21,-109, -69, -21,-109, -70, -21,-109, -71, + -21,-109, -72, -21,-109, -73, -21,-109, -74, -21,-109, -75, -21,-109, -76, -21,-109, -77, -21,-109, + -78, -21,-109, -79, -21,-109, -80, -21,-109, -81, -21,-109, -82, -21,-109, -83, -21,-109, -84, -21, +-109, -85, -21,-109, -86, -21,-109, -87, -21,-109, -88, -21,-109, -89, -21,-109, -90, -21,-109, -91, + -21,-109, -92, -21,-109, -93, -21,-109, -94, -21,-109, -95, -21,-109, -96, -21,-109, -97, -21,-109, + -98, -21,-109, -99, -21,-109,-100, -21,-109,-101, -21,-109,-102, -21,-109,-103, -21,-109,-104, -21, +-109,-105, -21,-109,-106, -21,-109,-107, -21,-109,-108, -21,-109,-109, -21,-109,-110, -21,-109,-111, + -21,-109,-112, -21,-109,-113, -21,-109,-114, -21,-109,-115, -21,-109,-116, -21,-109,-117, -21,-109, +-118, -21,-109,-119, -21,-109,-120, -21,-109,-121, -21,-109,-122, -21,-109,-123, -21,-109,-124, -21, +-109,-125, -21,-109,-126, -21,-109,-127, -21,-109,-128, -21,-110, -65, -21,-110, -66, -21,-110, -67, + -21,-110, -68, -21,-110, -69, -21,-110, -70, -21,-110, -71, -21,-110, -72, -21,-110, -73, -21,-110, + -74, -21,-110, -75, -21,-110, -76, -21,-110, -77, -21,-110, -78, -21,-110, -79, -21,-110, -80, -21, +-110, -81, -21,-110, -82, -21,-110, -83, -21,-110, -84, -21,-110, -85, -21,-110, -86, -21,-110, -87, + -21,-110, -88, -21,-110, -89, -21,-110, -90, -21,-110, -91, -21,-110, -92, -21,-110, -93, -21,-110, + -94, -21,-110, -95, -21,-110, -96, -21,-110, -97, -21,-110, -98, -21,-110, -99, -21,-110,-100, -21, +-110,-101, -21,-110,-102, -21,-110,-103, -21,-110,-104, -21,-110,-105, -21,-110,-106, -21,-110,-107, + -21,-110,-108, -21,-110,-109, -21,-110,-110, -21,-110,-111, -21,-110,-112, -21,-110,-113, -21,-110, +-114, -21,-110,-115, -21,-110,-116, -21,-110,-117, -21,-110,-118, -21,-110,-119, -21,-110,-120, -21, +-110,-121, -21,-110,-122, -21,-110,-123, -21,-110,-124, -21,-110,-125, -21,-110,-126, -21,-110,-127, + -21,-110,-128, -21,-111, -65, -21,-111, -66, -21,-111, -67, -21,-111, -68, -21,-111, -69, -21,-111, + -70, -21,-111, -71, -21,-111, -72, -21,-111, -73, -21,-111, -74, -21,-111, -75, -21,-111, -76, -21, +-111, -77, -21,-111, -78, -21,-111, -79, -21,-111, -80, -21,-111, -81, -21,-111, -82, -21,-111, -83, + -21,-111, -84, -21,-111, -85, -21,-111, -86, -21,-111, -87, -21,-111, -88, -21,-111, -89, -21,-111, + -90, -21,-111, -91, -21,-111, -92, -21,-111, -93, -21,-111, -94, -21,-111, -95, -21,-111, -96, -21, +-111, -97, -21,-111, -98, -21,-111, -99, -21,-111,-100, -21,-111,-101, -21,-111,-102, -21,-111,-103, + -21,-111,-104, -21,-111,-105, -21,-111,-106, -21,-111,-107, -21,-111,-108, -21,-111,-109, -21,-111, +-110, -21,-111,-111, -21,-111,-112, -21,-111,-113, -21,-111,-114, -21,-111,-115, -21,-111,-116, -21, +-111,-117, -21,-111,-118, -21,-111,-119, -21,-111,-120, -21,-111,-121, -21,-111,-122, -21,-111,-123, + -21,-111,-124, -21,-111,-125, -21,-111,-126, -21,-111,-127, -21,-111,-128, -21,-112, -65, -21,-112, + -66, -21,-112, -67, -21,-112, -68, -21,-112, -69, -21,-112, -70, -21,-112, -71, -21,-112, -72, -21, +-112, -73, -21,-112, -74, -21,-112, -75, -21,-112, -76, -21,-112, -77, -21,-112, -78, -21,-112, -79, + -21,-112, -80, -21,-112, -81, -21,-112, -82, -21,-112, -83, -21,-112, -84, -21,-112, -85, -21,-112, + -86, -21,-112, -87, -21,-112, -88, -21,-112, -89, -21,-112, -90, -21,-112, -91, -21,-112, -92, -21, +-112, -93, -21,-112, -94, -21,-112, -95, -21,-112, -96, -21,-112, -97, -21,-112, -98, -21,-112, -99, + -21,-112,-100, -21,-112,-101, -21,-112,-102, -21,-112,-103, -21,-112,-104, -21,-112,-105, -21,-112, +-106, -21,-112,-107, -21,-112,-108, -21,-112,-109, -21,-112,-110, -21,-112,-111, -21,-112,-112, -21, +-112,-113, -21,-112,-114, -21,-112,-115, -21,-112,-116, -21,-112,-117, -21,-112,-118, -21,-112,-119, + -21,-112,-120, -21,-112,-121, -21,-112,-122, -21,-112,-123, -21,-112,-124, -21,-112,-125, -21,-112, +-126, -21,-112,-127, -21,-112,-128, -21,-113, -65, -21,-113, -66, -21,-113, -67, -21,-113, -68, -21, +-113, -69, -21,-113, -70, -21,-113, -71, -21,-113, -72, -21,-113, -73, -21,-113, -74, -21,-113, -75, + -21,-113, -76, -21,-113, -77, -21,-113, -78, -21,-113, -79, -21,-113, -80, -21,-113, -81, -21,-113, + -82, -21,-113, -83, -21,-113, -84, -21,-113, -85, -21,-113, -86, -21,-113, -87, -21,-113, -88, -21, +-113, -89, -21,-113, -90, -21,-113, -91, -21,-113, -92, -21,-113, -93, -21,-113, -94, -21,-113, -95, + -21,-113, -96, -21,-113, -97, -21,-113, -98, -21,-113, -99, -21,-113,-100, -21,-113,-101, -21,-113, +-102, -21,-113,-103, -21,-113,-104, -21,-113,-105, -21,-113,-106, -21,-113,-107, -21,-113,-108, -21, +-113,-109, -21,-113,-110, -21,-113,-111, -21,-113,-112, -21,-113,-113, -21,-113,-114, -21,-113,-115, + -21,-113,-116, -21,-113,-117, -21,-113,-118, -21,-113,-119, -21,-113,-120, -21,-113,-121, -21,-113, +-122, -21,-113,-123, -21,-113,-124, -21,-113,-125, -21,-113,-126, -21,-113,-127, -21,-113,-128, -21, +-114, -65, -21,-114, -66, -21,-114, -67, -21,-114, -68, -21,-114, -69, -21,-114, -70, -21,-114, -71, + -21,-114, -72, -21,-114, -73, -21,-114, -74, -21,-114, -75, -21,-114, -76, -21,-114, -77, -21,-114, + -78, -21,-114, -79, -21,-114, -80, -21,-114, -81, -21,-114, -82, -21,-114, -83, -21,-114, -84, -21, +-114, -85, -21,-114, -86, -21,-114, -87, -21,-114, -88, -21,-114, -89, -21,-114, -90, -21,-114, -91, + -21,-114, -92, -21,-114, -93, -21,-114, -94, -21,-114, -95, -21,-114, -96, -21,-114, -97, -21,-114, + -98, -21,-114, -99, -21,-114,-100, -21,-114,-101, -21,-114,-102, -21,-114,-103, -21,-114,-104, -21, +-114,-105, -21,-114,-106, -21,-114,-107, -21,-114,-108, -21,-114,-109, -21,-114,-110, -21,-114,-111, + -21,-114,-112, -21,-114,-113, -21,-114,-114, -21,-114,-115, -21,-114,-116, -21,-114,-117, -21,-114, +-118, -21,-114,-119, -21,-114,-120, -21,-114,-121, -21,-114,-122, -21,-114,-123, -21,-114,-124, -21, +-114,-125, -21,-114,-126, -21,-114,-127, -21,-114,-128, -21,-115, -65, -21,-115, -66, -21,-115, -67, + -21,-115, -68, -21,-115, -69, -21,-115, -70, -21,-115, -71, -21,-115, -72, -21,-115, -73, -21,-115, + -74, -21,-115, -75, -21,-115, -76, -21,-115, -77, -21,-115, -78, -21,-115, -79, -21,-115, -80, -21, +-115, -81, -21,-115, -82, -21,-115, -83, -21,-115, -84, -21,-115, -85, -21,-115, -86, -21,-115, -87, + -21,-115, -88, -21,-115, -89, -21,-115, -90, -21,-115, -91, -21,-115, -92, -21,-115, -93, -21,-115, + -94, -21,-115, -95, -21,-115, -96, -21,-115, -97, -21,-115, -98, -21,-115, -99, -21,-115,-100, -21, +-115,-101, -21,-115,-102, -21,-115,-103, -21,-115,-104, -21,-115,-105, -21,-115,-106, -21,-115,-107, + -21,-115,-108, -21,-115,-109, -21,-115,-110, -21,-115,-111, -21,-115,-112, -21,-115,-113, -21,-115, +-114, -21,-115,-115, -21,-115,-116, -21,-115,-117, -21,-115,-118, -21,-115,-119, -21,-115,-120, -21, +-115,-121, -21,-115,-122, -21,-115,-123, -21,-115,-124, -21,-115,-125, -21,-115,-126, -21,-115,-127, + -21,-115,-128, -21,-116, -65, -21,-116, -66, -21,-116, -67, -21,-116, -68, -21,-116, -69, -21,-116, + -70, -21,-116, -71, -21,-116, -72, -21,-116, -73, -21,-116, -74, -21,-116, -75, -21,-116, -76, -21, +-116, -77, -21,-116, -78, -21,-116, -79, -21,-116, -80, -21,-116, -81, -21,-116, -82, -21,-116, -83, + -21,-116, -84, -21,-116, -85, -21,-116, -86, -21,-116, -87, -21,-116, -88, -21,-116, -89, -21,-116, + -90, -21,-116, -91, -21,-116, -92, -21,-116, -93, -21,-116, -94, -21,-116, -95, -21,-116, -96, -21, +-116, -97, -21,-116, -98, -21,-116, -99, -21,-116,-100, -21,-116,-101, -21,-116,-102, -21,-116,-103, + -21,-116,-104, -21,-116,-105, -21,-116,-106, -21,-116,-107, -21,-116,-108, -21,-116,-109, -21,-116, +-110, -21,-116,-111, -21,-116,-112, -21,-116,-113, -21,-116,-114, -21,-116,-115, -21,-116,-116, -21, +-116,-117, -21,-116,-118, -21,-116,-119, -21,-116,-120, -21,-116,-121, -21,-116,-122, -21,-116,-123, + -21,-116,-124, -21,-116,-125, -21,-116,-126, -21,-116,-127, -21,-116,-128, -21,-117, -65, -21,-117, + -66, -21,-117, -67, -21,-117, -68, -21,-117, -69, -21,-117, -70, -21,-117, -71, -21,-117, -72, -21, +-117, -73, -21,-117, -74, -21,-117, -75, -21,-117, -76, -21,-117, -77, -21,-117, -78, -21,-117, -79, + -21,-117, -80, -21,-117, -81, -21,-117, -82, -21,-117, -83, -21,-117, -84, -21,-117, -85, -21,-117, + -86, -21,-117, -87, -21,-117, -88, -21,-117, -89, -21,-117, -90, -21,-117, -91, -21,-117, -92, -21, +-117, -93, -21,-117, -94, -21,-117, -95, -21,-117, -96, -21,-117, -97, -21,-117, -98, -21,-117, -99, + -21,-117,-100, -21,-117,-101, -21,-117,-102, -21,-117,-103, -21,-117,-104, -21,-117,-105, -21,-117, +-106, -21,-117,-107, -21,-117,-108, -21,-117,-109, -21,-117,-110, -21,-117,-111, -21,-117,-112, -21, +-117,-113, -21,-117,-114, -21,-117,-115, -21,-117,-116, -21,-117,-117, -21,-117,-118, -21,-117,-119, + -21,-117,-120, -21,-117,-121, -21,-117,-122, -21,-117,-123, -21,-117,-124, -21,-117,-125, -21,-117, +-126, -21,-117,-127, -21,-117,-128, -21,-118, -65, -21,-118, -66, -21,-118, -67, -21,-118, -68, -21, +-118, -69, -21,-118, -70, -21,-118, -71, -21,-118, -72, -21,-118, -73, -21,-118, -74, -21,-118, -75, + -21,-118, -76, -21,-118, -77, -21,-118, -78, -21,-118, -79, -21,-118, -80, -21,-118, -81, -21,-118, + -82, -21,-118, -83, -21,-118, -84, -21,-118, -85, -21,-118, -86, -21,-118, -87, -21,-118, -88, -21, +-118, -89, -21,-118, -90, -21,-118, -91, -21,-118, -92, -21,-118, -93, -21,-118, -94, -21,-118, -95, + -21,-118, -96, -21,-118, -97, -21,-118, -98, -21,-118, -99, -21,-118,-100, -21,-118,-101, -21,-118, +-102, -21,-118,-103, -21,-118,-104, -21,-118,-105, -21,-118,-106, -21,-118,-107, -21,-118,-108, -21, +-118,-109, -21,-118,-110, -21,-118,-111, -21,-118,-112, -21,-118,-113, -21,-118,-114, -21,-118,-115, + -21,-118,-116, -21,-118,-117, -21,-118,-118, -21,-118,-119, -21,-118,-120, -21,-118,-121, -21,-118, +-122, -21,-118,-123, -21,-118,-124, -21,-118,-125, -21,-118,-126, -21,-118,-127, -21,-118,-128, -21, +-119, -65, -21,-119, -66, -21,-119, -67, -21,-119, -68, -21,-119, -69, -21,-119, -70, -21,-119, -71, + -21,-119, -72, -21,-119, -73, -21,-119, -74, -21,-119, -75, -21,-119, -76, -21,-119, -77, -21,-119, + -78, -21,-119, -79, -21,-119, -80, -21,-119, -81, -21,-119, -82, -21,-119, -83, -21,-119, -84, -21, +-119, -85, -21,-119, -86, -21,-119, -87, -21,-119, -88, -21,-119, -89, -21,-119, -90, -21,-119, -91, + -21,-119, -92, -21,-119, -93, -21,-119, -94, -21,-119, -95, -21,-119, -96, -21,-119, -97, -21,-119, + -98, -21,-119, -99, -21,-119,-100, -21,-119,-101, -21,-119,-102, -21,-119,-103, -21,-119,-104, -21, +-119,-105, -21,-119,-106, -21,-119,-107, -21,-119,-108, -21,-119,-109, -21,-119,-110, -21,-119,-111, + -21,-119,-112, -21,-119,-113, -21,-119,-114, -21,-119,-115, -21,-119,-116, -21,-119,-117, -21,-119, +-118, -21,-119,-119, -21,-119,-120, -21,-119,-121, -21,-119,-122, -21,-119,-123, -21,-119,-124, -21, +-119,-125, -21,-119,-126, -21,-119,-127, -21,-119,-128, -21,-120, -65, -21,-120, -66, -21,-120, -67, + -21,-120, -68, -21,-120, -69, -21,-120, -70, -21,-120, -71, -21,-120, -72, -21,-120, -73, -21,-120, + -74, -21,-120, -75, -21,-120, -76, -21,-120, -77, -21,-120, -78, -21,-120, -79, -21,-120, -80, -21, +-120, -81, -21,-120, -82, -21,-120, -83, -21,-120, -84, -21,-120, -85, -21,-120, -86, -21,-120, -87, + -21,-120, -88, -21,-120, -89, -21,-120, -90, -21,-120, -91, -21,-120, -92, -21,-120, -93, -21,-120, + -94, -21,-120, -95, -21,-120, -96, -21,-120, -97, -21,-120, -98, -21,-120, -99, -21,-120,-100, -21, +-120,-101, -21,-120,-102, -21,-120,-103, -21,-120,-104, -21,-120,-105, -21,-120,-106, -21,-120,-107, + -21,-120,-108, -21,-120,-109, -21,-120,-110, -21,-120,-111, -21,-120,-112, -21,-120,-113, -21,-120, +-114, -21,-120,-115, -21,-120,-116, -21,-120,-117, -21,-120,-118, -21,-120,-119, -21,-120,-120, -21, +-120,-121, -21,-120,-122, -21,-120,-123, -21,-120,-124, -21,-120,-125, -21,-120,-126, -21,-120,-127, + -21,-120,-128, -21,-121, -65, -21,-121, -66, -21,-121, -67, -21,-121, -68, -21,-121, -69, -21,-121, + -70, -21,-121, -71, -21,-121, -72, -21,-121, -73, -21,-121, -74, -21,-121, -75, -21,-121, -76, -21, +-121, -77, -21,-121, -78, -21,-121, -79, -21,-121, -80, -21,-121, -81, -21,-121, -82, -21,-121, -83, + -21,-121, -84, -21,-121, -85, -21,-121, -86, -21,-121, -87, -21,-121, -88, -21,-121, -89, -21,-121, + -90, -21,-121, -91, -21,-121, -92, -21,-121, -93, -21,-121, -94, -21,-121, -95, -21,-121, -96, -21, +-121, -97, -21,-121, -98, -21,-121, -99, -21,-121,-100, -21,-121,-101, -21,-121,-102, -21,-121,-103, + -21,-121,-104, -21,-121,-105, -21,-121,-106, -21,-121,-107, -21,-121,-108, -21,-121,-109, -21,-121, +-110, -21,-121,-111, -21,-121,-112, -21,-121,-113, -21,-121,-114, -21,-121,-115, -21,-121,-116, -21, +-121,-117, -21,-121,-118, -21,-121,-119, -21,-121,-120, -21,-121,-121, -21,-121,-122, -21,-121,-123, + -21,-121,-124, -21,-121,-125, -21,-121,-126, -21,-121,-127, -21,-121,-128, -21,-122, -65, -21,-122, + -66, -21,-122, -67, -21,-122, -68, -21,-122, -69, -21,-122, -70, -21,-122, -71, -21,-122, -72, -21, +-122, -73, -21,-122, -74, -21,-122, -75, -21,-122, -76, -21,-122, -77, -21,-122, -78, -21,-122, -79, + -21,-122, -80, -21,-122, -81, -21,-122, -82, -21,-122, -83, -21,-122, -84, -21,-122, -85, -21,-122, + -86, -21,-122, -87, -21,-122, -88, -21,-122, -89, -21,-122, -90, -21,-122, -91, -21,-122, -92, -21, +-122, -93, -21,-122, -94, -21,-122, -95, -21,-122, -96, -21,-122, -97, -21,-122, -98, -21,-122, -99, + -21,-122,-100, -21,-122,-101, -21,-122,-102, -21,-122,-103, -21,-122,-104, -21,-122,-105, -21,-122, +-106, -21,-122,-107, -21,-122,-108, -21,-122,-109, -21,-122,-110, -21,-122,-111, -21,-122,-112, -21, +-122,-113, -21,-122,-114, -21,-122,-115, -21,-122,-116, -21,-122,-117, -21,-122,-118, -21,-122,-119, + -21,-122,-120, -21,-122,-121, -21,-122,-122, -21,-122,-123, -21,-122,-124, -21,-122,-125, -21,-122, +-126, -21,-122,-127, -21,-122,-128, -21,-123, -65, -21,-123, -66, -21,-123, -67, -21,-123, -68, -21, +-123, -69, -21,-123, -70, -21,-123, -71, -21,-123, -72, -21,-123, -73, -21,-123, -74, -21,-123, -75, + -21,-123, -76, -21,-123, -77, -21,-123, -78, -21,-123, -79, -21,-123, -80, -21,-123, -81, -21,-123, + -82, -21,-123, -83, -21,-123, -84, -21,-123, -85, -21,-123, -86, -21,-123, -87, -21,-123, -88, -21, +-123, -89, -21,-123, -90, -21,-123, -91, -21,-123, -92, -21,-123, -93, -21,-123, -94, -21,-123, -95, + -21,-123, -96, -21,-123, -97, -21,-123, -98, -21,-123, -99, -21,-123,-100, -21,-123,-101, -21,-123, +-102, -21,-123,-103, -21,-123,-104, -21,-123,-105, -21,-123,-106, -21,-123,-107, -21,-123,-108, -21, +-123,-109, -21,-123,-110, -21,-123,-111, -21,-123,-112, -21,-123,-113, -21,-123,-114, -21,-123,-115, + -21,-123,-116, -21,-123,-117, -21,-123,-118, -21,-123,-119, -21,-123,-120, -21,-123,-121, -21,-123, +-122, -21,-123,-123, -21,-123,-124, -21,-123,-125, -21,-123,-126, -21,-123,-127, -21,-123,-128, -21, +-124, -65, -21,-124, -66, -21,-124, -67, -21,-124, -68, -21,-124, -69, -21,-124, -70, -21,-124, -71, + -21,-124, -72, -21,-124, -73, -21,-124, -74, -21,-124, -75, -21,-124, -76, -21,-124, -77, -21,-124, + -78, -21,-124, -79, -21,-124, -80, -21,-124, -81, -21,-124, -82, -21,-124, -83, -21,-124, -84, -21, +-124, -85, -21,-124, -86, -21,-124, -87, -21,-124, -88, -21,-124, -89, -21,-124, -90, -21,-124, -91, + -21,-124, -92, -21,-124, -93, -21,-124, -94, -21,-124, -95, -21,-124, -96, -21,-124, -97, -21,-124, + -98, -21,-124, -99, -21,-124,-100, -21,-124,-101, -21,-124,-102, -21,-124,-103, -21,-124,-104, -21, +-124,-105, -21,-124,-106, -21,-124,-107, -21,-124,-108, -21,-124,-109, -21,-124,-110, -21,-124,-111, + -21,-124,-112, -21,-124,-113, -21,-124,-114, -21,-124,-115, -21,-124,-116, -21,-124,-117, -21,-124, +-118, -21,-124,-119, -21,-124,-120, -21,-124,-121, -21,-124,-122, -21,-124,-123, -21,-124,-124, -21, +-124,-125, -21,-124,-126, -21,-124,-127, -21,-124,-128, -21,-125, -65, -21,-125, -66, -21,-125, -67, + -21,-125, -68, -21,-125, -69, -21,-125, -70, -21,-125, -71, -21,-125, -72, -21,-125, -73, -21,-125, + -74, -21,-125, -75, -21,-125, -76, -21,-125, -77, -21,-125, -78, -21,-125, -79, -21,-125, -80, -21, +-125, -81, -21,-125, -82, -21,-125, -83, -21,-125, -84, -21,-125, -85, -21,-125, -86, -21,-125, -87, + -21,-125, -88, -21,-125, -89, -21,-125, -90, -21,-125, -91, -21,-125, -92, -21,-125, -93, -21,-125, + -94, -21,-125, -95, -21,-125, -96, -21,-125, -97, -21,-125, -98, -21,-125, -99, -21,-125,-100, -21, +-125,-101, -21,-125,-102, -21,-125,-103, -21,-125,-104, -21,-125,-105, -21,-125,-106, -21,-125,-107, + -21,-125,-108, -21,-125,-109, -21,-125,-110, -21,-125,-111, -21,-125,-112, -21,-125,-113, -21,-125, +-114, -21,-125,-115, -21,-125,-116, -21,-125,-117, -21,-125,-118, -21,-125,-119, -21,-125,-120, -21, +-125,-121, -21,-125,-122, -21,-125,-123, -21,-125,-124, -21,-125,-125, -21,-125,-126, -21,-125,-127, + -21,-125,-128, -21,-126, -65, -21,-126, -66, -21,-126, -67, -21,-126, -68, -21,-126, -69, -21,-126, + -70, -21,-126, -71, -21,-126, -72, -21,-126, -73, -21,-126, -74, -21,-126, -75, -21,-126, -76, -21, +-126, -77, -21,-126, -78, -21,-126, -79, -21,-126, -80, -21,-126, -81, -21,-126, -82, -21,-126, -83, + -21,-126, -84, -21,-126, -85, -21,-126, -86, -21,-126, -87, -21,-126, -88, -21,-126, -89, -21,-126, + -90, -21,-126, -91, -21,-126, -92, -21,-126, -93, -21,-126, -94, -21,-126, -95, -21,-126, -96, -21, +-126, -97, -21,-126, -98, -21,-126, -99, -21,-126,-100, -21,-126,-101, -21,-126,-102, -21,-126,-103, + -21,-126,-104, -21,-126,-105, -21,-126,-106, -21,-126,-107, -21,-126,-108, -21,-126,-109, -21,-126, +-110, -21,-126,-111, -21,-126,-112, -21,-126,-113, -21,-126,-114, -21,-126,-115, -21,-126,-116, -21, +-126,-117, -21,-126,-118, -21,-126,-119, -21,-126,-120, -21,-126,-121, -21,-126,-122, -21,-126,-123, + -21,-126,-124, -21,-126,-125, -21,-126,-126, -21,-126,-127, -21,-126,-128, -21,-127, -65, -21,-127, + -66, -21,-127, -67, -21,-127, -68, -21,-127, -69, -21,-127, -70, -21,-127, -71, -21,-127, -72, -21, +-127, -73, -21,-127, -74, -21,-127, -75, -21,-127, -76, -21,-127, -77, -21,-127, -78, -21,-127, -79, + -21,-127, -80, -21,-127, -81, -21,-127, -82, -21,-127, -83, -21,-127, -84, -21,-127, -85, -21,-127, + -86, -21,-127, -87, -21,-127, -88, -21,-127, -89, -21,-127, -90, -21,-127, -91, -21,-127, -92, -21, +-127, -93, -21,-127, -94, -21,-127, -95, -21,-127, -96, -21,-127, -97, -21,-127, -98, -21,-127, -99, + -21,-127,-100, -21,-127,-101, -21,-127,-102, -21,-127,-103, -21,-127,-104, -21,-127,-105, -21,-127, +-106, -21,-127,-107, -21,-127,-108, -21,-127,-109, -21,-127,-110, -21,-127,-111, -21,-127,-112, -21, +-127,-113, -21,-127,-114, -21,-127,-115, -21,-127,-116, -21,-127,-117, -21,-127,-118, -21,-127,-119, + -21,-127,-120, -21,-127,-121, -21,-127,-122, -21,-127,-123, -21,-127,-124, -21,-127,-125, -21,-127, +-126, -21,-127,-127, -21,-127,-128, -21,-128, -65, -21,-128, -66, -21,-128, -67, -21,-128, -68, -21, +-128, -69, -21,-128, -70, -21,-128, -71, -21,-128, -72, -21,-128, -73, -21,-128, -74, -21,-128, -75, + -21,-128, -76, -21,-128, -77, -21,-128, -78, -21,-128, -79, -21,-128, -80, -21,-128, -81, -21,-128, + -82, -21,-128, -83, -21,-128, -84, -21,-128, -85, -21,-128, -86, -21,-128, -87, -21,-128, -88, -21, +-128, -89, -21,-128, -90, -21,-128, -91, -21,-128, -92, -21,-128, -93, -21,-128, -94, -21,-128, -95, + -21,-128, -96, -21,-128, -97, -21,-128, -98, -21,-128, -99, -21,-128,-100, -21,-128,-101, -21,-128, +-102, -21,-128,-103, -21,-128,-104, -21,-128,-105, -21,-128,-106, -21,-128,-107, -21,-128,-108, -21, +-128,-109, -21,-128,-110, -21,-128,-111, -21,-128,-112, -21,-128,-113, -21,-128,-114, -21,-128,-115, + -21,-128,-116, -21,-128,-117, -21,-128,-118, -21,-128,-119, -21,-128,-120, -21,-128,-121, -21,-128, +-122, -21,-128,-123, -21,-128,-124, -21,-128,-125, -21,-128,-126, -21,-128,-127, -21,-128,-128, -22, + -65, -65, -22, -65, -66, -22, -65, -67, -22, -65, -68, -22, -65, -69, -22, -65, -70, -22, -65, -71, + -22, -65, -72, -22, -65, -73, -22, -65, -74, -22, -65, -75, -22, -65, -76, -22, -65, -77, -22, -65, + -78, -22, -65, -79, -22, -65, -80, -22, -65, -81, -22, -65, -82, -22, -65, -83, -22, -65, -84, -22, + -65, -85, -22, -65, -86, -22, -65, -87, -22, -65, -88, -22, -65, -89, -22, -65, -90, -22, -65, -91, + -22, -65, -92, -22, -65, -93, -22, -65, -94, -22, -65, -95, -22, -65, -96, -22, -65, -97, -22, -65, + -98, -22, -65, -99, -22, -65,-100, -22, -65,-101, -22, -65,-102, -22, -65,-103, -22, -65,-104, -22, + -65,-105, -22, -65,-106, -22, -65,-107, -22, -65,-108, -22, -65,-109, -22, -65,-110, -22, -65,-111, + -22, -65,-112, -22, -65,-113, -22, -65,-114, -22, -65,-115, -22, -65,-116, -22, -65,-117, -22, -65, +-118, -22, -65,-119, -22, -65,-120, -22, -65,-121, -22, -65,-122, -22, -65,-123, -22, -65,-124, -22, + -65,-125, -22, -65,-126, -22, -65,-127, -22, -65,-128, -22, -66, -65, -22, -66, -66, -22, -66, -67, + -22, -66, -68, -22, -66, -69, -22, -66, -70, -22, -66, -71, -22, -66, -72, -22, -66, -73, -22, -66, + -74, -22, -66, -75, -22, -66, -76, -22, -66, -77, -22, -66, -78, -22, -66, -79, -22, -66, -80, -22, + -66, -81, -22, -66, -82, -22, -66, -83, -22, -66, -84, -22, -66, -85, -22, -66, -86, -22, -66, -87, + -22, -66, -88, -22, -66, -89, -22, -66, -90, -22, -66, -91, -22, -66, -92, -22, -66, -93, -22, -66, + -94, -22, -66, -95, -22, -66, -96, -22, -66, -97, -22, -66, -98, -22, -66, -99, -22, -66,-100, -22, + -66,-101, -22, -66,-102, -22, -66,-103, -22, -66,-104, -22, -66,-105, -22, -66,-106, -22, -66,-107, + -22, -66,-108, -22, -66,-109, -22, -66,-110, -22, -66,-111, -22, -66,-112, -22, -66,-113, -22, -66, +-114, -22, -66,-115, -22, -66,-116, -22, -66,-117, -22, -66,-118, -22, -66,-119, -22, -66,-120, -22, + -66,-121, -22, -66,-122, -22, -66,-123, -22, -66,-124, -22, -66,-125, -22, -66,-126, -22, -66,-127, + -22, -66,-128, -22, -67, -65, -22, -67, -66, -22, -67, -67, -22, -67, -68, -22, -67, -69, -22, -67, + -70, -22, -67, -71, -22, -67, -72, -22, -67, -73, -22, -67, -74, -22, -67, -75, -22, -67, -76, -22, + -67, -77, -22, -67, -78, -22, -67, -79, -22, -67, -80, -22, -67, -81, -22, -67, -82, -22, -67, -83, + -22, -67, -84, -22, -67, -85, -22, -67, -86, -22, -67, -87, -22, -67, -88, -22, -67, -89, -22, -67, + -90, -22, -67, -91, -22, -67, -92, -22, -67, -93, -22, -67, -94, -22, -67, -95, -22, -67, -96, -22, + -67, -97, -22, -67, -98, -22, -67, -99, -22, -67,-100, -22, -67,-101, -22, -67,-102, -22, -67,-103, + -22, -67,-104, -22, -67,-105, -22, -67,-106, -22, -67,-107, -22, -67,-108, -22, -67,-109, -22, -67, +-110, -22, -67,-111, -22, -67,-112, -22, -67,-113, -22, -67,-114, -22, -67,-115, -22, -67,-116, -22, + -67,-117, -22, -67,-118, -22, -67,-119, -22, -67,-120, -22, -67,-121, -22, -67,-122, -22, -67,-123, + -22, -67,-124, -22, -67,-125, -22, -67,-126, -22, -67,-127, -22, -67,-128, -22, -68, -65, -22, -68, + -66, -22, -68, -67, -22, -68, -68, -22, -68, -69, -22, -68, -70, -22, -68, -71, -22, -68, -72, -22, + -68, -73, -22, -68, -74, -22, -68, -75, -22, -68, -76, -22, -68, -77, -22, -68, -78, -22, -68, -79, + -22, -68, -80, -22, -68, -81, -22, -68, -82, -22, -68, -83, -22, -68, -84, -22, -68, -85, -22, -68, + -86, -22, -68, -87, -22, -68, -88, -22, -68, -89, -22, -68, -90, -22, -68, -91, -22, -68, -92, -22, + -68, -93, -22, -68, -94, -22, -68, -95, -22, -68, -96, -22, -68, -97, -22, -68, -98, -22, -68, -99, + -22, -68,-100, -22, -68,-101, -22, -68,-102, -22, -68,-103, -22, -68,-104, -22, -68,-105, -22, -68, +-106, -22, -68,-107, -22, -68,-108, -22, -68,-109, -22, -68,-110, -22, -68,-111, -22, -68,-112, -22, + -68,-113, -22, -68,-114, -22, -68,-115, -22, -68,-116, -22, -68,-117, -22, -68,-118, -22, -68,-119, + -22, -68,-120, -22, -68,-121, -22, -68,-122, -22, -68,-123, -22, -68,-124, -22, -68,-125, -22, -68, +-126, -22, -68,-127, -22, -68,-128, -22, -69, -65, -22, -69, -66, -22, -69, -67, -22, -69, -68, -22, + -69, -69, -22, -69, -70, -22, -69, -71, -22, -69, -72, -22, -69, -73, -22, -69, -74, -22, -69, -75, + -22, -69, -76, -22, -69, -77, -22, -69, -78, -22, -69, -79, -22, -69, -80, -22, -69, -81, -22, -69, + -82, -22, -69, -83, -22, -69, -84, -22, -69, -85, -22, -69, -86, -22, -69, -87, -22, -69, -88, -22, + -69, -89, -22, -69, -90, -22, -69, -91, -22, -69, -92, -22, -69, -93, -22, -69, -94, -22, -69, -95, + -22, -69, -96, -22, -69, -97, -22, -69, -98, -22, -69, -99, -22, -69,-100, -22, -69,-101, -22, -69, +-102, -22, -69,-103, -22, -69,-104, -22, -69,-105, -22, -69,-106, -22, -69,-107, -22, -69,-108, -22, + -69,-109, -22, -69,-110, -22, -69,-111, -22, -69,-112, -22, -69,-113, -22, -69,-114, -22, -69,-115, + -22, -69,-116, -22, -69,-117, -22, -69,-118, -22, -69,-119, -22, -69,-120, -22, -69,-121, -22, -69, +-122, -22, -69,-123, -22, -69,-124, -22, -69,-125, -22, -69,-126, -22, -69,-127, -22, -69,-128, -22, + -70, -65, -22, -70, -66, -22, -70, -67, -22, -70, -68, -22, -70, -69, -22, -70, -70, -22, -70, -71, + -22, -70, -72, -22, -70, -73, -22, -70, -74, -22, -70, -75, -22, -70, -76, -22, -70, -77, -22, -70, + -78, -22, -70, -79, -22, -70, -80, -22, -70, -81, -22, -70, -82, -22, -70, -83, -22, -70, -84, -22, + -70, -85, -22, -70, -86, -22, -70, -87, -22, -70, -88, -22, -70, -89, -22, -70, -90, -22, -70, -91, + -22, -70, -92, -22, -70, -93, -22, -70, -94, -22, -70, -95, -22, -70, -96, -22, -70, -97, -22, -70, + -98, -22, -70, -99, -22, -70,-100, -22, -70,-101, -22, -70,-102, -22, -70,-103, -22, -70,-104, -22, + -70,-105, -22, -70,-106, -22, -70,-107, -22, -70,-108, -22, -70,-109, -22, -70,-110, -22, -70,-111, + -22, -70,-112, -22, -70,-113, -22, -70,-114, -22, -70,-115, -22, -70,-116, -22, -70,-117, -22, -70, +-118, -22, -70,-119, -22, -70,-120, -22, -70,-121, -22, -70,-122, -22, -70,-123, -22, -70,-124, -22, + -70,-125, -22, -70,-126, -22, -70,-127, -22, -70,-128, -22, -71, -65, -22, -71, -66, -22, -71, -67, + -22, -71, -68, -22, -71, -69, -22, -71, -70, -22, -71, -71, -22, -71, -72, -22, -71, -73, -22, -71, + -74, -22, -71, -75, -22, -71, -76, -22, -71, -77, -22, -71, -78, -22, -71, -79, -22, -71, -80, -22, + -71, -81, -22, -71, -82, -22, -71, -83, -22, -71, -84, -22, -71, -85, -22, -71, -86, -22, -71, -87, + -22, -71, -88, -22, -71, -89, -22, -71, -90, -22, -71, -91, -22, -71, -92, -22, -71, -93, -22, -71, + -94, -22, -71, -95, -22, -71, -96, -22, -71, -97, -22, -71, -98, -22, -71, -99, -22, -71,-100, -22, + -71,-101, -22, -71,-102, -22, -71,-103, -22, -71,-104, -22, -71,-105, -22, -71,-106, -22, -71,-107, + -22, -71,-108, -22, -71,-109, -22, -71,-110, -22, -71,-111, -22, -71,-112, -22, -71,-113, -22, -71, +-114, -22, -71,-115, -22, -71,-116, -22, -71,-117, -22, -71,-118, -22, -71,-119, -22, -71,-120, -22, + -71,-121, -22, -71,-122, -22, -71,-123, -22, -71,-124, -22, -71,-125, -22, -71,-126, -22, -71,-127, + -22, -71,-128, -22, -72, -65, -22, -72, -66, -22, -72, -67, -22, -72, -68, -22, -72, -69, -22, -72, + -70, -22, -72, -71, -22, -72, -72, -22, -72, -73, -22, -72, -74, -22, -72, -75, -22, -72, -76, -22, + -72, -77, -22, -72, -78, -22, -72, -79, -22, -72, -80, -22, -72, -81, -22, -72, -82, -22, -72, -83, + -22, -72, -84, -22, -72, -85, -22, -72, -86, -22, -72, -87, -22, -72, -88, -22, -72, -89, -22, -72, + -90, -22, -72, -91, -22, -72, -92, -22, -72, -93, -22, -72, -94, -22, -72, -95, -22, -72, -96, -22, + -72, -97, -22, -72, -98, -22, -72, -99, -22, -72,-100, -22, -72,-101, -22, -72,-102, -22, -72,-103, + -22, -72,-104, -22, -72,-105, -22, -72,-106, -22, -72,-107, -22, -72,-108, -22, -72,-109, -22, -72, +-110, -22, -72,-111, -22, -72,-112, -22, -72,-113, -22, -72,-114, -22, -72,-115, -22, -72,-116, -22, + -72,-117, -22, -72,-118, -22, -72,-119, -22, -72,-120, -22, -72,-121, -22, -72,-122, -22, -72,-123, + -22, -72,-124, -22, -72,-125, -22, -72,-126, -22, -72,-127, -22, -72,-128, -22, -73, -65, -22, -73, + -66, -22, -73, -67, -22, -73, -68, -22, -73, -69, -22, -73, -70, -22, -73, -71, -22, -73, -72, -22, + -73, -73, -22, -73, -74, -22, -73, -75, -22, -73, -76, -22, -73, -77, -22, -73, -78, -22, -73, -79, + -22, -73, -80, -22, -73, -81, -22, -73, -82, -22, -73, -83, -22, -73, -84, -22, -73, -85, -22, -73, + -86, -22, -73, -87, -22, -73, -88, -22, -73, -89, -22, -73, -90, -22, -73, -91, -22, -73, -92, -22, + -73, -93, -22, -73, -94, -22, -73, -95, -22, -73, -96, -22, -73, -97, -22, -73, -98, -22, -73, -99, + -22, -73,-100, -22, -73,-101, -22, -73,-102, -22, -73,-103, -22, -73,-104, -22, -73,-105, -22, -73, +-106, -22, -73,-107, -22, -73,-108, -22, -73,-109, -22, -73,-110, -22, -73,-111, -22, -73,-112, -22, + -73,-113, -22, -73,-114, -22, -73,-115, -22, -73,-116, -22, -73,-117, -22, -73,-118, -22, -73,-119, + -22, -73,-120, -22, -73,-121, -22, -73,-122, -22, -73,-123, -22, -73,-124, -22, -73,-125, -22, -73, +-126, -22, -73,-127, -22, -73,-128, -22, -74, -65, -22, -74, -66, -22, -74, -67, -22, -74, -68, -22, + -74, -69, -22, -74, -70, -22, -74, -71, -22, -74, -72, -22, -74, -73, -22, -74, -74, -22, -74, -75, + -22, -74, -76, -22, -74, -77, -22, -74, -78, -22, -74, -79, -22, -74, -80, -22, -74, -81, -22, -74, + -82, -22, -74, -83, -22, -74, -84, -22, -74, -85, -22, -74, -86, -22, -74, -87, -22, -74, -88, -22, + -74, -89, -22, -74, -90, -22, -74, -91, -22, -74, -92, -22, -74, -93, -22, -74, -94, -22, -74, -95, + -22, -74, -96, -22, -74, -97, -22, -74, -98, -22, -74, -99, -22, -74,-100, -22, -74,-101, -22, -74, +-102, -22, -74,-103, -22, -74,-104, -22, -74,-105, -22, -74,-106, -22, -74,-107, -22, -74,-108, -22, + -74,-109, -22, -74,-110, -22, -74,-111, -22, -74,-112, -22, -74,-113, -22, -74,-114, -22, -74,-115, + -22, -74,-116, -22, -74,-117, -22, -74,-118, -22, -74,-119, -22, -74,-120, -22, -74,-121, -22, -74, +-122, -22, -74,-123, -22, -74,-124, -22, -74,-125, -22, -74,-126, -22, -74,-127, -22, -74,-128, -22, + -75, -65, -22, -75, -66, -22, -75, -67, -22, -75, -68, -22, -75, -69, -22, -75, -70, -22, -75, -71, + -22, -75, -72, -22, -75, -73, -22, -75, -74, -22, -75, -75, -22, -75, -76, -22, -75, -77, -22, -75, + -78, -22, -75, -79, -22, -75, -80, -22, -75, -81, -22, -75, -82, -22, -75, -83, -22, -75, -84, -22, + -75, -85, -22, -75, -86, -22, -75, -87, -22, -75, -88, -22, -75, -89, -22, -75, -90, -22, -75, -91, + -22, -75, -92, -22, -75, -93, -22, -75, -94, -22, -75, -95, -22, -75, -96, -22, -75, -97, -22, -75, + -98, -22, -75, -99, -22, -75,-100, -22, -75,-101, -22, -75,-102, -22, -75,-103, -22, -75,-104, -22, + -75,-105, -22, -75,-106, -22, -75,-107, -22, -75,-108, -22, -75,-109, -22, -75,-110, -22, -75,-111, + -22, -75,-112, -22, -75,-113, -22, -75,-114, -22, -75,-115, -22, -75,-116, -22, -75,-117, -22, -75, +-118, -22, -75,-119, -22, -75,-120, -22, -75,-121, -22, -75,-122, -22, -75,-123, -22, -75,-124, -22, + -75,-125, -22, -75,-126, -22, -75,-127, -22, -75,-128, -22, -76, -65, -22, -76, -66, -22, -76, -67, + -22, -76, -68, -22, -76, -69, -22, -76, -70, -22, -76, -71, -22, -76, -72, -22, -76, -73, -22, -76, + -74, -22, -76, -75, -22, -76, -76, -22, -76, -77, -22, -76, -78, -22, -76, -79, -22, -76, -80, -22, + -76, -81, -22, -76, -82, -22, -76, -83, -22, -76, -84, -22, -76, -85, -22, -76, -86, -22, -76, -87, + -22, -76, -88, -22, -76, -89, -22, -76, -90, -22, -76, -91, -22, -76, -92, -22, -76, -93, -22, -76, + -94, -22, -76, -95, -22, -76, -96, -22, -76, -97, -22, -76, -98, -22, -76, -99, -22, -76,-100, -22, + -76,-101, -22, -76,-102, -22, -76,-103, -22, -76,-104, -22, -76,-105, -22, -76,-106, -22, -76,-107, + -22, -76,-108, -22, -76,-109, -22, -76,-110, -22, -76,-111, -22, -76,-112, -22, -76,-113, -22, -76, +-114, -22, -76,-115, -22, -76,-116, -22, -76,-117, -22, -76,-118, -22, -76,-119, -22, -76,-120, -22, + -76,-121, -22, -76,-122, -22, -76,-123, -22, -76,-124, -22, -76,-125, -22, -76,-126, -22, -76,-127, + -22, -76,-128, -22, -77, -65, -22, -77, -66, -22, -77, -67, -22, -77, -68, -22, -77, -69, -22, -77, + -70, -22, -77, -71, -22, -77, -72, -22, -77, -73, -22, -77, -74, -22, -77, -75, -22, -77, -76, -22, + -77, -77, -22, -77, -78, -22, -77, -79, -22, -77, -80, -22, -77, -81, -22, -77, -82, -22, -77, -83, + -22, -77, -84, -22, -77, -85, -22, -77, -86, -22, -77, -87, -22, -77, -88, -22, -77, -89, -22, -77, + -90, -22, -77, -91, -22, -77, -92, -22, -77, -93, -22, -77, -94, -22, -77, -95, -22, -77, -96, -22, + -77, -97, -22, -77, -98, -22, -77, -99, -22, -77,-100, -22, -77,-101, -22, -77,-102, -22, -77,-103, + -22, -77,-104, -22, -77,-105, -22, -77,-106, -22, -77,-107, -22, -77,-108, -22, -77,-109, -22, -77, +-110, -22, -77,-111, -22, -77,-112, -22, -77,-113, -22, -77,-114, -22, -77,-115, -22, -77,-116, -22, + -77,-117, -22, -77,-118, -22, -77,-119, -22, -77,-120, -22, -77,-121, -22, -77,-122, -22, -77,-123, + -22, -77,-124, -22, -77,-125, -22, -77,-126, -22, -77,-127, -22, -77,-128, -22, -78, -65, -22, -78, + -66, -22, -78, -67, -22, -78, -68, -22, -78, -69, -22, -78, -70, -22, -78, -71, -22, -78, -72, -22, + -78, -73, -22, -78, -74, -22, -78, -75, -22, -78, -76, -22, -78, -77, -22, -78, -78, -22, -78, -79, + -22, -78, -80, -22, -78, -81, -22, -78, -82, -22, -78, -83, -22, -78, -84, -22, -78, -85, -22, -78, + -86, -22, -78, -87, -22, -78, -88, -22, -78, -89, -22, -78, -90, -22, -78, -91, -22, -78, -92, -22, + -78, -93, -22, -78, -94, -22, -78, -95, -22, -78, -96, -22, -78, -97, -22, -78, -98, -22, -78, -99, + -22, -78,-100, -22, -78,-101, -22, -78,-102, -22, -78,-103, -22, -78,-104, -22, -78,-105, -22, -78, +-106, -22, -78,-107, -22, -78,-108, -22, -78,-109, -22, -78,-110, -22, -78,-111, -22, -78,-112, -22, + -78,-113, -22, -78,-114, -22, -78,-115, -22, -78,-116, -22, -78,-117, -22, -78,-118, -22, -78,-119, + -22, -78,-120, -22, -78,-121, -22, -78,-122, -22, -78,-123, -22, -78,-124, -22, -78,-125, -22, -78, +-126, -22, -78,-127, -22, -78,-128, -22, -79, -65, -22, -79, -66, -22, -79, -67, -22, -79, -68, -22, + -79, -69, -22, -79, -70, -22, -79, -71, -22, -79, -72, -22, -79, -73, -22, -79, -74, -22, -79, -75, + -22, -79, -76, -22, -79, -77, -22, -79, -78, -22, -79, -79, -22, -79, -80, -22, -79, -81, -22, -79, + -82, -22, -79, -83, -22, -79, -84, -22, -79, -85, -22, -79, -86, -22, -79, -87, -22, -79, -88, -22, + -79, -89, -22, -79, -90, -22, -79, -91, -22, -79, -92, -22, -79, -93, -22, -79, -94, -22, -79, -95, + -22, -79, -96, -22, -79, -97, -22, -79, -98, -22, -79, -99, -22, -79,-100, -22, -79,-101, -22, -79, +-102, -22, -79,-103, -22, -79,-104, -22, -79,-105, -22, -79,-106, -22, -79,-107, -22, -79,-108, -22, + -79,-109, -22, -79,-110, -22, -79,-111, -22, -79,-112, -22, -79,-113, -22, -79,-114, -22, -79,-115, + -22, -79,-116, -22, -79,-117, -22, -79,-118, -22, -79,-119, -22, -79,-120, -22, -79,-121, -22, -79, +-122, -22, -79,-123, -22, -79,-124, -22, -79,-125, -22, -79,-126, -22, -79,-127, -22, -79,-128, -22, + -80, -65, -22, -80, -66, -22, -80, -67, -22, -80, -68, -22, -80, -69, -22, -80, -70, -22, -80, -71, + -22, -80, -72, -22, -80, -73, -22, -80, -74, -22, -80, -75, -22, -80, -76, -22, -80, -77, -22, -80, + -78, -22, -80, -79, -22, -80, -80, -22, -80, -81, -22, -80, -82, -22, -80, -83, -22, -80, -84, -22, + -80, -85, -22, -80, -86, -22, -80, -87, -22, -80, -88, -22, -80, -89, -22, -80, -90, -22, -80, -91, + -22, -80, -92, -22, -80, -93, -22, -80, -94, -22, -80, -95, -22, -80, -96, -22, -80, -97, -22, -80, + -98, -22, -80, -99, -22, -80,-100, -22, -80,-101, -22, -80,-102, -22, -80,-103, -22, -80,-104, -22, + -80,-105, -22, -80,-106, -22, -80,-107, -22, -80,-108, -22, -80,-109, -22, -80,-110, -22, -80,-111, + -22, -80,-112, -22, -80,-113, -22, -80,-114, -22, -80,-115, -22, -80,-116, -22, -80,-117, -22, -80, +-118, -22, -80,-119, -22, -80,-120, -22, -80,-121, -22, -80,-122, -22, -80,-123, -22, -80,-124, -22, + -80,-125, -22, -80,-126, -22, -80,-127, -22, -80,-128, -31,-128, -90, -32, -73, -98, -32, -73, -99, + -32, -73,-100, -32, -73,-102, -32, -75,-117, -32, -75,-116, -32, -75,-118, -32, -77,-120, -32, -77, +-121, -32, -77,-117, -32, -77,-118, -32, -77,-128, -32, -79,-120, -32, -81,-117, -32, -81,-116, -32, + -81,-118, -32, -82,-108, -32, -83,-116, -32, -83,-120, -32, -83,-117, -32, -89,-116, -32, -89,-117, + -32, -92, -76, -32, -92, -79, -32, -92, -87, -37,-128, -37,-109, -37,-126, -40, -90, -40, -92, -40, + -91, -40, -93, -40, -94, -45, -85, -45, -86, -45,-101, -45,-102, -47, -73, -47, -74, -47,-105, -45, + -83, -45, -71, -45, -75, -45, -77, -45, -79, -47, -98, -45, -81, -45, -89, -47,-100, -45, -91, -48, + -71, -45, -93, -47, -99, -45, -97, -45, -99, -45,-126, -47,-111, -45,-105, -47,-112, -47,-109, -45, +-109, -45,-111, -45, -84, -45, -72, -45, -76, -45, -78, -45, -80, -48,-114, -45, -82, -45, -90, -48, +-116, -45, -92, -48,-103, -45, -94, -48,-115, -45, -98, -45,-100, -45,-127, -48,-127, -45,-106, -48, +-128, -48,-125, -45,-110, -45,-112, -48,-121, -49,-108, -49,-109, -31, -65, -77, -31, -65, -73, -31, + -65, -74, -31, -66, -95, -31, -66, -89, -31, -67, -89, -31, -66, -91, -31, -67, -91, -31, -66, -93, + -31, -67, -93, -31, -67, -95, -31, -66, -96, -31, -66, -90, -31, -67, -90, -31, -66, -92, -31, -67, + -92, -31, -66, -94, -31, -67, -94, -31, -67, -96, -31, -65, -76, -49,-114, -31, -65, -78, -31, -67, + -68, -31, -65, -90, -31, -67,-105, -31, -67,-107, -31, -67,-109, -31, -67,-111, -31, -67,-106, -31, + -67,-108, -31, -67,-110, -31, -67,-112, -31, -65, -89, -50, -80, -31, -65, -94, -49,-117, -31, -65, + -96, -31, -65, -95, -49,-115, -31, -67, -70, -31, -65, -91, -31, -65, -92, -31, -67,-123, -31, -67, +-125, -31, -67,-127, -31, -67,-124, -31, -67,-126, -31, -67,-128, -49,-116, -31, -67, -72, -31, -65, +-106, -31, -68, -73, -31, -68, -75, -31, -68, -77, -31, -68, -79, -31, -68, -74, -31, -68, -76, -31, + -68, -78, -31, -68, -80, -31, -65,-105, -50,-112, -31, -65,-110, -49,-118, -31, -65,-112, -31, -65, +-111, -50, -81, -31, -67, -74, -31, -65,-125, -31, -65,-121, -31, -65,-122, -31, -66,-111, -31, -66, +-105, -31, -68, -89, -31, -66,-107, -31, -68, -91, -31, -66,-109, -31, -68, -93, -31, -68, -95, -31, + -66,-112, -31, -66,-106, -31, -68, -90, -31, -66,-108, -31, -68, -92, -31, -66,-110, -31, -68, -94, + -31, -68, -96, -31, -65,-124, -50, -82, -31, -65,-126, -31, -67, -76, -31, -68,-107, -31, -68,-109, + -31, -68,-111, -31, -68,-108, -31, -68,-110, -31, -68,-112, -50, -83, -31, -67, -78, -31, -66, -77, + -31, -66, -73, -31, -66, -74, -31, -66,-127, -31, -66,-121, -31, -68,-121, -31, -66,-123, -31, -68, +-123, -31, -66,-125, -31, -68,-125, -31, -68,-127, -31, -66,-128, -31, -66,-122, -31, -68,-122, -31, + -66,-124, -31, -68,-124, -31, -66,-126, -31, -68,-126, -31, -68,-128, -31, -66, -80, -31, -66, -79, + -31, -66, -76, -50, -84, -31, -66, -78, -31, -67, -80, -31, -65, -68, -31, -66, -87, -31, -66, -81, + -31, -67, -81, -31, -66, -83, -31, -67, -83, -31, -66, -85, -31, -67, -85, -31, -67, -87, -31, -66, + -88, -31, -66, -82, -31, -67, -82, -31, -66, -84, -31, -67, -84, -31, -66, -86, -31, -67, -86, -31, + -67, -88, -50,-113, -31, -65, -70, -31, -67, -97, -31, -67, -99, -31, -67,-101, -31, -67,-103, -50, + -85, -31, -65, -88, -31, -65, -87, -50,-114, -31, -65, -86, -31, -65, -84, -31, -67,-115, -31, -67, +-117, -31, -67,-119, -31, -67,-116, -31, -67,-118, -31, -67,-120, -50,-116, -31, -65, -72, -31, -68, + -65, -31, -68, -67, -31, -68, -69, -31, -68, -71, -31, -68, -66, -31, -68, -68, -31, -68, -70, -31, + -68, -72, -50, -86, -31, -65,-104, -31, -65,-103, -50,-118, -31, -65,-102, -31, -65,-116, -31, -66, +-103, -31, -66, -97, -31, -68, -81, -31, -66, -99, -31, -68, -83, -31, -66,-101, -31, -68, -85, -31, + -68, -87, -31, -66,-104, -31, -66, -98, -31, -68, -82, -31, -66,-100, -31, -68, -84, -31, -66,-102, + -31, -68, -86, -31, -68, -88, -50,-119, -31, -65,-118, -31, -68, -99, -31, -68,-101, -31, -68,-103, + -31, -68,-100, -31, -68,-102, -31, -68,-104, -50,-120, -31, -65,-120, -31, -66, -68, -31, -66,-119, + -31, -66,-113, -31, -68,-113, -31, -66,-115, -31, -68,-115, -31, -66,-117, -31, -68,-117, -31, -68, +-119, -31, -66,-120, -31, -66,-114, -31, -68,-114, -31, -66,-116, -31, -68,-116, -31, -66,-118, -31, + -68,-118, -31, -68,-120, -31, -66, -72, -31, -66, -71, -50,-122, -31, -66, -70, -57, -81, -57, -82, + -31, -70,-101, -57, -65, -57, -93, -57, -67, -57, -66, -57, -94, -57, -68, -31, -65,-127, -50,-123, + -31, -65, -83, -31, -70,-107, -31, -70,-109, -59, -66, -59, -68, -31, -70,-111, -59, -70, -31, -69, + -75, -31, -70,-103, -31, -69, -73, -61, -65, -31, -70,-113, -56, -77, -31, -69, -71, -59, -73, -61, + -67, -31, -69, -77, -31, -70,-115, -31, -70,-117, -31, -70,-119, -31, -70,-104, -31, -70,-123, -31, + -70,-121, -59, -75, -31, -70,-125, -31, -70,-127, -31, -71, -65, -31, -71, -67, -31, -71, -75, -31, + -71, -73, -59, -77, -31, -71, -77, -31, -69, -91, -31, -69, -79, -31, -69, -83, -31, -69, -81, -31, + -69, -87, -31, -69, -85, -58, -80, -56,-105, -56,-107, -57,-108, -59, -79, -59, -81, -31, -69, -89, + -57,-102, -57,-106, -57,-104, -57,-100, -61, -68, -59, -83, -31, -71, -69, -59, -85, -31, -71, -71, + -59, -87, -61, -69, -61, -70, -61, -71, -31, -71, -81, -31, -71, -79, -59, -93, -56,-101, -31, -71, + -83, -59, -91, -31, -70,-105, -31, -71, -85, -59, -97, -56,-103, -31, -71, -87, -31, -71, -93, -31, + -71, -89, -59, -95, -31, -71, -95, -59, -99, -31, -71, -91, -59,-101, -31, -71, -97, -59,-105, -31, + -71, -99, -31, -71,-101, -56,-109, -56,-111, -59,-103, -31, -71,-103, -59,-107, -31, -71,-105, -31, + -71,-107, -57, -83, -57, -85, -31, -69,-103, -31, -69,-115, -31, -69, -93, -31, -69, -97, -31, -69, + -95, -31, -69,-101, -31, -69, -99, -58, -95, -56,-113, -56,-115, -57,-110, -59,-111, -31, -69,-113, + -56, -85, -61, -74, -56, -79, -56, -81, -59,-113, -31, -71,-109, -31, -71,-111, -59,-115, -31, -71, +-113, -56, -83, -31, -71,-115, -61, -75, -31, -69,-107, -31, -69,-105, -31, -69,-111, -31, -69,-109, + -61, -76, -61, -77, -61, -78, -31, -71,-119, -31, -71,-117, -59,-122, -31, -71,-121, -59,-120, -31, + -71,-123, -61, -79, -59,-124, -57, -71, -31, -71,-125, -31, -71,-127, -31, -72, -65, -31, -72, -69, + -31, -72, -67, -60, -68, -31, -72, -71, -31, -72, -73, -60, -66, -60, -70, -31, -72, -75, -60, -73, + -31, -72, -77, -57, -87, -31, -72, -79, -57, -80, -60, -75, -31, -72, -83, -60, -81, -31, -69,-117, + -56,-117, -56,-119, -57,-112, -31, -69,-119, -31, -72, -81, -61, -81, -60, -83, -60, -85, -60, -87, + -61, -82, -61, -83, -61, -84, -31, -70,-106, -31, -72, -85, -31, -72, -87, -31, -72, -91, -56, -97, + -31, -72, -89, -31, -72, -93, -60, -91, -60, -93, -57, -89, -60, -95, -60, -97, -31, -72, -95, -60, + -99, -57, -75, -31, -72, -97, -31, -72,-101, -31, -72,-103, -60,-103, -31, -72, -99, -56, -87, -31, + -69,-121, -31, -70, -71, -56,-121, -56,-123, -60,-101, -31, -70, -69, -61, -85, -60,-105, -60,-107, + -31, -72,-105, -31, -72,-107, -60,-109, -31, -70, -67, -31, -69,-125, -31, -69,-123, -31, -70, -65, + -31, -69,-127, -61, -86, -61, -87, -61, -88, -31, -72,-113, -31, -72,-109, -31, -72,-111, -31, -72, +-115, -60,-113, -31, -72,-117, -31, -72,-119, -61, -89, -60,-115, -60,-117, -60,-119, -60,-121, -31, + -72,-121, -31, -72,-123, -31, -72,-125, -60,-123, -31, -72,-127, -31, -70, -73, -31, -70, -83, -31, + -70, -95, -56,-125, -56,-127, -57,-114, -57, -69, -61, -91, -31, -70, -93, -57, -97, -61, -92, -57, + -95, -56, -89, -31, -70, -77, -31, -70, -75, -31, -70, -81, -31, -70, -79, -60,-125, -60,-127, -61, + -93, -31, -70, -87, -31, -70, -85, -31, -70, -91, -31, -70, -89, -61, -94, -61, -95, -61, -96, -31, + -70,-108, -31, -70,-110, -59, -67, -59, -69, -31, -70,-112, -59, -71, -31, -69, -76, -31, -69, -74, + -59, -72, -31, -70,-114, -56, -78, -31, -69, -72, -59, -74, -61, -99, -31, -69, -78, -31, -70,-116, + -31, -70,-118, -31, -70,-120, -31, -70,-124, -31, -70,-122, -59, -76, -31, -70,-126, -31, -70,-128, + -31, -71, -66, -31, -71, -68, -31, -71, -76, -31, -71, -74, -59, -78, -31, -71, -78, -31, -69, -92, + -31, -69, -80, -31, -69, -84, -31, -69, -82, -31, -69, -88, -31, -69, -86, -58, -81, -56,-106, -56, +-108, -57,-109, -59, -80, -59, -82, -31, -69, -90, -57,-103, -57,-107, -57,-105, -57,-101, -61,-100, + -59, -84, -31, -71, -70, -59, -86, -31, -71, -72, -59, -88, -61,-101, -61,-102, -61,-103, -31, -71, + -82, -31, -71, -80, -59, -94, -56,-102, -31, -71, -84, -59, -92, -31, -71, -86, -59, -98, -56,-104, + -31, -71, -88, -31, -71, -94, -31, -71, -90, -59, -96, -31, -71, -96, -59,-100, -31, -71, -92, -59, +-102, -31, -71, -98, -59,-106, -31, -71,-100, -31, -71,-102, -56,-110, -56,-112, -59,-104, -31, -71, +-104, -59,-108, -31, -71,-106, -31, -71,-108, -57, -84, -57, -86, -31, -69,-104, -31, -69,-116, -31, + -69, -94, -31, -69, -98, -31, -69, -96, -31, -69,-102, -31, -69,-100, -58, -96, -56,-114, -56,-116, + -57,-111, -59,-112, -31, -69,-114, -56, -86, -61,-106, -56, -80, -56, -82, -59,-114, -31, -71,-110, + -31, -71,-112, -59,-116, -31, -71,-114, -56, -84, -31, -71,-116, -61,-107, -31, -69,-108, -31, -69, +-106, -31, -69,-112, -31, -69,-110, -61,-108, -61,-109, -61,-110, -31, -71,-120, -31, -71,-118, -59, +-123, -31, -71,-122, -59,-121, -31, -71,-124, -61,-111, -59,-125, -57, -72, -31, -71,-126, -31, -71, +-128, -31, -72, -66, -31, -72, -70, -31, -72, -68, -60, -69, -31, -72, -72, -31, -72, -74, -60, -67, + -60, -71, -31, -72, -76, -60, -74, -31, -72, -78, -57, -88, -31, -72, -80, -60, -76, -31, -72, -84, + -60, -82, -31, -69,-118, -56,-118, -56,-120, -57,-113, -31, -69,-120, -31, -72, -82, -61,-113, -60, + -80, -60, -84, -60, -86, -60, -88, -61,-114, -61,-115, -61,-116, -31, -72, -86, -31, -72, -88, -31, + -72, -92, -56, -98, -31, -72, -90, -31, -72, -94, -60, -92, -60, -94, -57, -90, -60, -96, -60, -98, + -31, -72, -96, -60,-100, -57, -76, -31, -72, -98, -31, -72,-102, -31, -72,-104, -60,-104, -31, -72, +-100, -56, -88, -31, -69,-122, -31, -70, -72, -56,-122, -56,-124, -60,-102, -31, -70, -70, -61,-117, + -60,-106, -60,-108, -31, -72,-106, -31, -72,-108, -60,-110, -31, -70, -68, -31, -69,-126, -31, -69, +-124, -31, -70, -66, -31, -69,-128, -61,-118, -61,-119, -61,-120, -31, -72,-114, -31, -72,-110, -31, + -72,-112, -31, -72,-116, -60,-114, -31, -72,-118, -31, -72,-120, -61,-121, -60,-116, -60,-118, -60, +-120, -60,-122, -31, -72,-122, -31, -72,-124, -31, -72,-126, -60,-124, -31, -72,-128, -31, -70, -74, + -31, -70, -84, -31, -70, -96, -56,-126, -56,-128, -57,-115, -57, -70, -61,-123, -31, -70, -94, -57, + -98, -61,-124, -57, -96, -56, -90, -31, -70, -78, -31, -70, -76, -31, -70, -82, -31, -70, -80, -60, +-126, -60,-128, -61,-125, -31, -70, -88, -31, -70, -86, -31, -70, -92, -31, -70, -90, -61,-126, -61, +-127, -61,-128, -30,-119, -81, -30,-119, -96, -30,-119, -82, -29,-126, -77, -29,-126, -77, -29,-127, + -69, -29,-127,-117, 68, 74, 77, 68, 77, 67, 87, 67, 83, 83, 83, 68, 72, 86, 87, 90, + 67, 68, 57, 44, 56, 44, 55, 44, 54, 44, 53, 44, 52, 44, 51, 44, 50, 44, 49, 44, + 48, 44, -39,-128, -39,-110, 32, -39,-110, -39,-128, -39,-111, -39,-128, -39,-117, 32, -39,-117, + -40, -89, -39,-117, -40, -74, -40, -79, -40, -75, -40, -79, -40, -77, -40, -79, -40, -76, -40, -79, + -40, -76, -40, -82, -40, -74, -39,-118, -40, -74, -39,-119, -40, -75, -39,-118, -40, -75, -39,-119, + -40, -76, -39,-118, -40, -76, -39,-119, -40, -77, -39,-118, -40, -77, -39,-119, -40, -70, -39,-118, + -40, -70, -39,-119, -40, -71, -39,-118, -40, -71, -39,-119, -40, -73, -39,-118, -40, -73, -39,-119, + -40, -76, -39,-121, -40, -77, -39,-121, -40, -85, -39,-121, -39,-121, -39, -80, -39,-122, -39,-121, + -40, -75, -40, -82, -40, -86, -39,-121, -40, -88, -39,-121, -39,-118, -40, -78, -39,-118, -40, -79, + -39,-122, -39,-122, -39,-122, -40, -78, -39,-122, -40, -79, -39,-123, -40, -89, -40, -85, -39,-122, + -40, -85, -40, -78, -40, -85, -40, -79, -40, -86, -39,-122, -40, -86, -40, -78, -40, -86, -40, -79, + -40, -88, -39,-122, -40, -88, -40, -78, -39,-119, -39, -80, -40, -79, -39, -80, -40, -80, -39, -80, + -39,-118, -39,-119, -39,-118, -40, -82, -39,-121, -39,-119, -39,-121, -40, -84, -39,-122, -39,-119, + -39,-122, -40, -82, -39,-125, -39,-118, -39,-125, -39,-119, -39,-125, -39,-124, -39,-125, -40, -82, + -39,-125, -40, -83, -39,-125, -40, -84, -39,-125, -40, -89, -39,-126, -39,-118, -39,-126, -39,-119, + -39,-126, -40, -83, -39,-127, -39,-118, -39,-127, -39,-119, -39,-127, -40, -83, -39,-127, -40, -84, + -40, -70, -40, -84, -40, -72, -39,-123, -40, -73, -40, -83, -40, -74, -39,-123, -40, -74, -40, -84, + -40, -82, -40, -83, -40, -85, -39,-118, -40, -85, -39,-119, -40, -85, -39,-123, -40, -85, -40, -84, + -40, -86, -39,-118, -40, -86, -39,-119, -40, -88, -39,-118, -40, -88, -39,-119, -40, -88, -39,-123, + -40, -88, -40, -84, -41,-112, -41,-100, -43, -76, -43, -83, -43, -66, -43, -74, -43, -76, -43, -85, + -43, -76, -43, -91, -43, -76, -43, -74, 115, 116, 87, 98, 83, 118, 115, 114, 80, 82, 80, 72, + 109, 98, 108, 120, 108, 110, 107, 116, 75, 77, 75, 75, 105, 110, 72, 80, 104, 97, 71, 121, + 100, 66, 99, 100, 99, 99, 66, 113, 77, -50, -87, 107, -50, -87, 77, 87, 107, 87, 109, 87, + -50, -68, 87, 110, 87, 112, 87, 77, 86, 107, 86, -50, -68, 86, 110, 86, 112, 86, 109, 115, + -50, -68, 115, 110, 115, 112, 115, -50, -68, 109, 110, 109, 102, 109, 107, 108, 100, 108, 109, 108, + -50, -68, 108, 109, 103, -50, -68, 103, -50, -68, 70, 110, 70, 112, 70, 71, 66, 77, 66, 75, + 66, 107, 65, 109, 65, -50, -68, 65, 110, 65, 112, 65, -26,-104,-114, -26, -78, -69, -27, -92, + -89, -26, -83, -93, -26,-104, -83, -27,-110,-116, -27, -71, -77, -26,-120,-112, 73, 85, 112, 99, + 111, 86, 65, 85, 100, 97, -29,-125, -84, -29,-125, -96, -29,-125, -86, -29,-125, -87, -29,-125, +-101, -29,-125, -77, -29,-125,-118, -29,-125,-114, 101, 86, 72, 103, 57, -26,-100,-120, 56, -26, +-100,-120, 55, -26,-100,-120, 54, -26,-100,-120, 53, -26,-100,-120, 52, -26,-100,-120, 51, -26, +-100,-120, 53, 48, 52, 57, 52, 56, 52, 55, 52, 54, 52, 53, 52, 52, 52, 50, 52, 48, + 51, 57, 51, 56, 51, 55, 51, 54, 51, 53, 51, 52, 51, 51, 51, 50, -29,-126, -77, -29, +-125,-120, -29,-126,-120, -29,-126,-118, 32, -29,-126,-102, 32, -29,-126,-103, 105, 120, 105, 118, + 73, 88, 73, 86, 84, 77, 83, 77, 78, 111, -62, -80, 70, -62, -80, 67, 82, 115, 63, 33, + 63, 63, 32, -52,-123, 33, 33, 32, -52, -77, 32, -51,-126, 97, -54, -66, -32, -70, -85, -32, + -70, -95, -32, -70, -85, -32, -70,-103, -32, -69,-115, -32, -70, -78, -32, -71,-115, -32, -72, -78, + -39,-118, -39, -76, -37,-121, -39, -76, -39,-120, -39, -76, -40, -89, -39, -76, -43, -91, -42,-126, + 32, -51,-123, 32, -52,-117, 32, -52,-125, 32, -52, -88, 32, -52,-118, 32, -52,-121, 32, -52, +-122, 110, 106, 78, 106, 78, 74, 108, 106, 76, 106, 76, 74, -54, -68, 110, 108, -62, -73, 76, + -62, -73, 105, 106, 73, 74, 32, -52, -89, 32, -52,-127, 32, -52,-124, -16, -99,-123,-105, -16, + -99,-123, -91, -16,-111,-106, -71, -16,-111,-106, -81, -16,-111,-106, -72, -16,-111,-106, -81, -16, +-111,-110, -71, -16,-111,-110, -67, -16,-111,-110, -71, -16,-111,-110, -80, -16,-111,-110, -71, -16, +-111,-110, -70, -16,-111,-115,-121, -16,-111,-115,-105, -16,-111,-115,-121, -16,-111,-116, -66, -16, +-111,-124, -78, -16,-111,-124, -89, -16,-111,-124, -79, -16,-111,-124, -89, -16,-111,-126, -91, -16, +-111,-126, -70, -16,-111,-126,-101, -16,-111,-126, -70, -16,-111,-126,-103, -16,-111,-126, -70, -41, + -92, -42, -65, -41,-101, -42, -65, -41,-111, -42, -65, -41,-107, -42, -71, -41, -86, -42, -68, -41, + -88, -42, -68, -41, -89, -42, -68, -41, -90, -42, -68, -41, -92, -42, -68, -41, -93, -42, -68, -41, + -95, -42, -68, -41, -96, -42, -68, -41, -98, -42, -68, -41,-100, -42, -68, -41,-101, -42, -68, -41, +-102, -42, -68, -41,-103, -42, -68, -41,-104, -42, -68, -41,-106, -42, -68, -41,-107, -42, -68, -41, +-108, -42, -68, -41,-109, -42, -68, -41,-110, -42, -68, -41,-111, -42, -68, -41,-112, -42, -68, -41, +-112, -42, -72, -41,-112, -42, -73, -41, -87, -41,-126, -41, -87, -41,-127, -41, -78, -42, -73, -41, +-103, -42, -76, -29,-125, -67, -29,-126,-103, -29,-125, -78, -29,-126,-103, -29,-125, -79, -29,-126, +-103, -29,-125, -80, -29,-126,-103, -29,-125, -81, -29,-126,-103, -29,-126, -90, -29,-126,-103, -29, +-125,-107, -29,-126,-102, -29,-125,-124, -29,-126,-103, -29,-125,-127, -29,-126,-103, -29,-126, -67, + -29,-126,-103, -29,-126, -71, -29,-126,-103, -29,-126, -75, -29,-126,-103, -29,-126, -77, -29,-126, +-103, -29,-126, -99, -29,-126,-103, -29,-127,-122, -29,-126,-103, -29,-127, -69, -29,-126,-102, -29, +-127, -69, -29,-126,-103, -29,-127, -72, -29,-126,-102, -29,-127, -72, -29,-126,-103, -29,-127, -75, + -29,-126,-102, -29,-127, -75, -29,-126,-103, -29,-127, -78, -29,-126,-102, -29,-127, -78, -29,-126, +-103, -29,-127, -81, -29,-126,-102, -29,-127, -81, -29,-126,-103, -29,-127, -88, -29,-126,-103, -29, +-127, -90, -29,-126,-103, -29,-127, -92, -29,-126,-103, -29,-127, -95, -29,-126,-103, -29,-127, -97, + -29,-126,-103, -29,-127, -99, -29,-126,-103, -29,-127,-101, -29,-126,-103, -29,-127,-103, -29,-126, +-103, -29,-127,-105, -29,-126,-103, -29,-127,-107, -29,-126,-103, -29,-127,-109, -29,-126,-103, -29, +-127,-111, -29,-126,-103, -29,-127,-113, -29,-126,-103, -29,-127,-115, -29,-126,-103, -29,-127,-117, + -29,-126,-103, -30, -85, -99, -52, -72, -30,-118, -75, -52, -72, -30,-118, -76, -52, -72, -30,-118, + -77, -52, -72, -30,-118, -78, -52, -72, -30,-118,-110, -52, -72, -30,-118,-111, -52, -72, -30,-119, + -67, -52, -72, -30,-119, -68, -52, -72, -30,-118, -85, -52, -72, -30,-118, -87, -52, -72, -30,-118, + -88, -52, -72, -30,-118, -94, -52, -72, -30,-118,-121, -52, -72, -30,-118,-122, -52, -72, -30,-118, +-125, -52, -72, -30,-118,-126, -52, -72, -30,-119, -69, -52, -72, -30,-119, -70, -52, -72, -30,-119, + -73, -52, -72, -30,-119, -74, -52, -72, -30,-119, -77, -52, -72, -30,-119, -78, -52, -72, -30,-119, + -91, -52, -72, -30,-119, -92, -52, -72, 62, -52, -72, 60, -52, -72, -30,-119,-115, -52, -72, -30, +-119, -95, -52, -72, 61, -52, -72, -30,-119,-120, -52, -72, -30,-119,-123, -52, -72, -30,-119,-125, + -52, -72, -30,-120, -68, -52, -72, -30,-120, -91, -52, -72, -30,-120, -93, -52, -72, -30,-120,-117, + -52, -72, -30,-120,-120, -52, -72, -30,-120,-125, -52, -72, -30,-121,-110, -52, -72, -30,-121,-108, + -52, -72, -30,-121,-112, -52, -72, -30,-122,-108, -52, -72, -30,-122,-110, -52, -72, -30,-122,-112, + -52, -72, -50, -87, -51,-123, -50, -87, -52,-128, -50, -97, -52,-128, -49,-119, -51,-123, -62, -88, + -52,-128, -50, -95, -52,-108, -50, -91, -52,-128, -50, -91, -52,-124, -50, -91, -52,-122, -49,-123, + -51,-126, -49,-127, -52,-108, -49,-127, -52,-109, -49,-123, -52,-124, -49,-123, -52,-122, -31, -65, + -66, -51,-126, -31, -65, -66, -52,-127, -31, -65, -66, -52,-128, -50,-103, -52,-128, -50,-103, -52, +-124, -50,-103, -52,-122, -50, -71, -51,-126, -50, -71, -52,-124, -50, -71, -52,-122, -31, -66, -65, + -51,-126, -31, -66, -65, -52,-127, -31, -66, -65, -52,-128, -50,-105, -51,-123, -50,-105, -52,-128, + -50,-107, -52,-128, -50, -73, -51,-123, -62, -88, -51,-126, -50,-111, -51,-123, -50,-111, -52,-128, + -50,-111, -52,-124, -50,-111, -52,-122, -50, -79, -51,-123, -50, -79, -52,-124, -50, -79, -52,-122, + -49,-123, -52,-128, -50, -65, -52,-128, -50, -71, -52,-128, -50, -75, -52,-128, 121, -52,-125, 89, + -52,-125, 121, -52,-119, 89, -52,-119, 121, -52, -93, 89, -52, -93, 121, -52,-128, 89, -52,-128, + 117, -52,-119, 85, -52,-119, 117, -52, -93, 85, -52, -93, 111, -52,-119, 79, -52,-119, 105, -52, + -93, 73, -52, -93, 105, -52,-119, 73, -52,-119, 101, -52,-125, 69, -52,-125, 101, -52,-119, 69, + -52,-119, 97, -52,-119, 65, -52,-119, -59, -65, -52,-121, 121, -52,-118, 119, -52,-118, 116, -52, +-120, 104, -52, -79, 122, -52, -79, 90, -52, -79, 122, -52, -93, 90, -52, -93, 122, -52,-126, 90, + -52,-126, 121, -52,-121, 89, -52,-121, 120, -52,-120, 88, -52,-120, 120, -52,-121, 88, -52,-121, + 119, -52, -93, 87, -52, -93, 119, -52,-121, 87, -52,-121, 119, -52,-120, 87, -52,-120, 119, -52, +-127, 87, -52,-127, 119, -52,-128, 87, -52,-128, 118, -52, -93, 86, -52, -93, 118, -52,-125, 86, + -52,-125, 117, -52, -83, 85, -52, -83, 117, -52, -80, 85, -52, -80, 117, -52, -92, 85, -52, -92, + 116, -52, -83, 84, -52, -83, 116, -52, -79, 84, -52, -79, 116, -52, -93, 84, -52, -93, 116, -52, +-121, 84, -52,-121, 115, -52,-121, 83, -52,-121, 114, -52, -79, 82, -52, -79, 114, -52,-121, 82, + -52,-121, 112, -52,-121, 80, -52,-121, 112, -52,-127, 80, -52,-127, 110, -52, -83, 78, -52, -83, + 110, -52, -79, 78, -52, -79, 110, -52, -93, 78, -52, -93, 110, -52,-121, 78, -52,-121, 109, -52, + -93, 77, -52, -93, 109, -52,-121, 77, -52,-121, 109, -52,-127, 77, -52,-127, 108, -52, -83, 76, + -52, -83, 108, -52, -79, 76, -52, -79, 107, -52, -79, 75, -52, -79, 107, -52, -93, 75, -52, -93, + 107, -52,-127, 75, -52,-127, 105, -52, -80, 73, -52, -80, 104, -52, -82, 72, -52, -82, 104, -52, + -89, 72, -52, -89, 104, -52,-120, 72, -52,-120, 104, -52, -93, 72, -52, -93, 104, -52,-121, 72, + -52,-121, 103, -52,-124, 71, -52,-124, 102, -52,-121, 70, -52,-121, 101, -52, -80, 69, -52, -80, + 101, -52, -83, 69, -52, -83, 100, -52, -83, 68, -52, -83, 100, -52, -89, 68, -52, -89, 100, -52, + -79, 68, -52, -79, 100, -52, -93, 68, -52, -93, 100, -52,-121, 68, -52,-121, 98, -52, -79, 66, + -52, -79, 98, -52, -93, 66, -52, -93, 98, -52,-121, 66, -52,-121, 97, -52, -91, 65, -52, -91, + -31, -83,-126, -31, -84, -75, -31, -84, -65, -31, -84, -75, -31, -84, -66, -31, -84, -75, -31, -84, + -68, -31, -84, -75, -31, -84, -70, -31, -84, -75, -31, -84,-111, -31, -84, -75, -31, -84,-115, -31, + -84, -75, -31, -84,-117, -31, -84, -75, -31, -84,-119, -31, -84, -75, -31, -84,-121, -31, -84, -75, + -31, -84,-123, -31, -84, -75, -31,-128, -91, -31,-128, -82, -32, -66,-112, -32, -66, -75, -32, -66, + -85, -32, -66, -73, -32, -66, -90, -32, -66, -73, -32, -66, -95, -32, -66, -73, -32, -66,-100, -32, + -66, -73, -32, -66,-110, -32, -66, -73, -32, -66, -77, -32, -66,-128, -32, -66, -78, -32, -66,-128, + -32, -67, -79, -32, -67, -76, -32, -67, -79, -32, -67, -78, -32, -67,-128, -32, -66, -75, -32, -67, +-101, -32, -66, -73, -32, -67,-106, -32, -66, -73, -32, -67,-111, -32, -66, -73, -32, -67,-116, -32, + -66, -73, -32, -67,-126, -32, -66, -73, -32, -73,-103, -32, -73, -97, -32, -73,-103, -32, -73,-118, + -32, -75,-122, -32, -75,-105, -32, -75,-121, -32, -76, -66, -32, -75,-122, -32, -76, -66, -32, -77, +-122, -32, -77,-106, -32, -77,-122, -32, -77,-107, -32, -78, -65, -32, -77,-107, -32, -79,-122, -32, + -79,-106, -32, -81,-122, -32, -81,-105, -32, -81,-121, -32, -82, -66, -32, -81,-122, -32, -82, -66, + -32, -82,-110, -32, -81,-105, -32, -84, -94, -32, -84, -68, -32, -84, -95, -32, -84, -68, -32, -83, +-121, -32, -83,-105, -32, -83,-121, -32, -84, -66, -32, -83,-121, -32, -83,-106, -32, -88, -85, -32, + -88, -68, -32, -88,-100, -32, -88, -68, -32, -88,-105, -32, -88, -68, -32, -88,-106, -32, -88, -68, + -32, -88, -72, -32, -88, -68, -32, -88, -78, -32, -88, -68, -32, -90, -81, -32, -90, -68, -32, -90, + -94, -32, -90, -68, -32, -90, -95, -32, -90, -68, -32, -89,-121, -32, -89,-105, -32, -89,-121, -32, + -90, -66, -32, -92, -81, -32, -92, -68, -32, -92, -85, -32, -92, -68, -32, -92, -94, -32, -92, -68, + -32, -92, -95, -32, -92, -68, -32, -92,-100, -32, -92, -68, -32, -92,-105, -32, -92, -68, -32, -92, +-106, -32, -92, -68, -32, -92,-107, -32, -92, -68, -32, -92, -77, -32, -92, -68, -32, -92, -80, -32, + -92, -68, -32, -92, -88, -32, -92, -68, -37,-110, -39,-108, -37,-127, -39,-108, -37,-107, -39,-108, + -39,-120, -39,-108, -47,-117, -52,-120, -48, -85, -52,-120, -47,-121, -52,-120, -48, -89, -52,-120, + -47,-125, -52,-117, -48, -93, -52,-117, -47,-125, -52,-120, -48, -93, -52,-120, -47,-125, -52,-124, + -48, -93, -52,-124, -47,-115, -52,-120, -48, -83, -52,-120, -45, -87, -52,-120, -45, -88, -52,-120, + -48, -66, -52,-120, -48, -98, -52,-120, -48, -72, -52,-120, -48,-104, -52,-120, -48, -72, -52,-124, + -48,-104, -52,-124, -48, -73, -52,-120, -48,-105, -52,-120, -48, -74, -52,-120, -48,-106, -52,-120, + -45,-103, -52,-120, -45,-104, -52,-120, -48, -75, -52,-122, -48,-107, -52,-122, -48, -80, -52,-120, + -48,-112, -52,-120, -48, -80, -52,-122, -48,-112, -52,-122, -48, -74, -52,-122, -48,-106, -52,-122, + -47, -75, -52,-113, -47, -76, -52,-113, -47,-125, -52,-122, -48, -72, -52,-128, -48, -70, -52,-127, + -47,-106, -52,-120, -48, -77, -52,-127, -48, -75, -52,-120, -48, -75, -52,-128, -48, -72, -52,-122, + -48,-104, -52,-122, -48, -93, -52,-122, -48,-104, -52,-128, -48,-102, -52,-127, -48,-122, -52,-120, + -48,-109, -52,-127, -48,-107, -52,-120, -48,-107, -52,-128, -49,-110, -52,-120, -49,-110, -52,-127, + -49,-123, -52,-127, -50, -65, -52,-127, -50, -71, -52,-127, -50, -75, -52,-127, -50, -91, -52,-120, + -50,-103, -52,-120, -50, -87, -52,-127, -50, -91, -52,-127, -50, -97, -52,-127, -50,-103, -52,-127, + -50,-105, -52,-127, -50,-107, -52,-127, -50,-111, -52,-127, -62, -88, -52,-127, 121, -52,-124, 89, + -52,-124, 104, -52,-116, 72, -52,-116, 116, -52, -90, 84, -52, -90, 115, -52, -90, 83, -52, -90, + 117, -52,-111, 85, -52,-111, 117, -52,-113, 85, -52,-113, 114, -52,-111, 82, -52,-111, 114, -52, +-113, 82, -52,-113, 111, -52,-111, 79, -52,-111, 111, -52,-113, 79, -52,-113, 105, -52,-111, 73, + -52,-111, 105, -52,-113, 73, -52,-113, 101, -52,-111, 69, -52,-111, 101, -52,-113, 69, -52,-113, + 97, -52,-111, 65, -52,-111, 97, -52,-113, 65, -52,-113, -61, -72, -52,-127, -61,-104, -52,-127, + -61, -90, -52,-127, -61,-122, -52,-127, 110, -52,-128, 78, -52,-128, 103, -52,-127, 71, -52,-127, + 106, -52,-116, -54,-110, -52,-116, -58, -73, -52,-116, 107, -52,-116, 75, -52,-116, 103, -52,-116, + 71, -52,-116, -61, -90, -52,-124, -61,-122, -52,-124, 117, -52,-116, 85, -52,-116, 111, -52,-116, + 79, -52,-116, 105, -52,-116, 73, -52,-116, 97, -52,-116, 65, -52,-116, 122, -52,-121, 90, -52, +-121, 122, -52,-127, 90, -52,-127, 89, -52,-120, 121, -52,-126, 89, -52,-126, 119, -52,-126, 87, + -52,-126, 117, -52, -88, 85, -52, -88, 117, -52,-117, 85, -52,-117, 117, -52,-118, 85, -52,-118, + 117, -52,-122, 85, -52,-122, 116, -52,-116, 84, -52,-116, 116, -52, -89, 84, -52, -89, 115, -52, + -89, 83, -52, -89, 115, -52,-126, 83, -52,-126, 114, -52,-116, 82, -52,-116, 114, -52, -89, 82, + -52, -89, 114, -52,-127, 82, -52,-127, 111, -52,-117, 79, -52,-117, 111, -52,-122, 79, -52,-122, + 110, -52,-116, 78, -52,-116, 110, -52, -89, 78, -52, -89, 110, -52,-127, 78, -52,-127, 108, -52, +-116, 76, -52,-116, 108, -52, -89, 76, -52, -89, 108, -52,-127, 76, -52,-127, 107, -52, -89, 75, + -52, -89, 106, -52,-126, 74, -52,-126, 73, -52,-121, 105, -52, -88, 73, -52, -88, 105, -52,-122, + 73, -52,-122, 105, -52,-124, 73, -52,-124, 105, -52,-125, 73, -52,-125, 104, -52,-126, 72, -52, +-126, 103, -52, -89, 71, -52, -89, 103, -52,-121, 71, -52,-121, 103, -52,-122, 71, -52,-122, 103, + -52,-126, 71, -52,-126, 101, -52,-116, 69, -52,-116, 101, -52, -88, 69, -52, -88, 101, -52,-121, + 69, -52,-121, 101, -52,-122, 69, -52,-122, 100, -52,-116, 68, -52,-116, 99, -52,-116, 67, -52, +-116, 99, -52,-121, 67, -52,-121, 99, -52,-126, 67, -52,-126, 99, -52,-127, 67, -52,-127, 97, + -52, -88, 65, -52, -88, 97, -52,-124, 65, -52,-124, 121, -52,-120, 121, -52,-127, 117, -52,-126, + 117, -52,-127, 117, -52,-128, 111, -52,-127, 111, -52,-128, 110, -52,-125, 105, -52,-126, 105, -52, +-127, 105, -52,-128, 101, -52,-120, 101, -52,-127, 101, -52,-128, 97, -52,-125, 97, -52,-127, 97, + -52,-128, 89, -52,-127, 85, -52,-126, 85, -52,-127, 85, -52,-128, 79, -52,-127, 79, -52,-128, + 78, -52,-125, 73, -52,-126, 73, -52,-127, 73, -52,-128, 69, -52,-120, 69, -52,-127, 69, -52, +-128, 65, -52,-125, 65, -52,-127, 65, -52,-128, -29,-128,-108, -26,-107,-105, -29,-128,-107, -29, +-128,-108, -27,-117, -99, -29,-128,-107, -29,-128,-108, -25,-101,-105, -29,-128,-107, -29,-128,-108, + -26,-119,-109, -29,-128,-107, -29,-128,-108, -25,-126, -71, -29,-128,-107, -29,-128,-108, -27, -82, +-119, -29,-128,-107, -29,-128,-108, -28, -70,-116, -29,-128,-107, -29,-128,-108, -28, -72,-119, -29, +-128,-107, -29,-128,-108, -26,-100, -84, -29,-128,-107, 80, 80, 86, -29,-128,-108, 83, -29,-128, +-107, 40, 90, 41, 40, 89, 41, 40, 88, 41, 40, 87, 41, 40, 86, 41, 40, 85, 41, 40, + 84, 41, 40, 83, 41, 40, 82, 41, 40, 81, 41, 40, 80, 41, 40, 79, 41, 40, 78, 41, + 40, 77, 41, 40, 76, 41, 40, 75, 41, 40, 74, 41, 40, 73, 41, 40, 72, 41, 40, 71, + 41, 40, 70, 41, 40, 69, 41, 40, 68, 41, 40, 67, 41, 40, 66, 41, 40, 65, 41, -39, +-124, -40, -89, -39,-107, -39,-124, -40, -89, -39,-108, -39,-124, -40, -89, -39,-109, -39,-126, -39, +-124, -37,-110, -40, -75, -39,-124, -37,-110, -39,-122, -40, -84, -39,-118, -40, -77, -40, -82, -39, +-118, -40, -88, -40, -83, -39,-118, -39,-127, -39,-123, -39,-118, -39,-123, -40, -84, -39,-118, -40, + -83, -40, -84, -39,-118, -40, -84, -40, -83, -39,-118, -39,-125, -39,-123, -39,-123, -39,-124, -40, + -84, -39,-123, -39,-123, -40, -82, -39,-118, -39,-122, -40, -84, -40, -83, -39,-125, -39,-123, -39, +-118, -40, -71, -39,-123, -39,-118, -39,-122, -40, -83, -39,-118, -39,-126, -39,-123, -39,-118, -39, +-123, -39,-123, -39,-118, -39,-118, -39,-123, -39,-118, -39,-118, -40, -84, -39,-118, -39,-118, -40, + -83, -39,-118, -39,-124, -39,-123, -39,-118, -39,-124, -40, -84, -39,-118, -40, -74, -40, -83, -39, +-118, -40, -76, -40, -83, -39,-118, -40, -75, -40, -83, -39,-118, -40, -77, -40, -82, -39,-119, -40, + -84, -39,-123, -39,-119, -40, -84, -40, -83, -39,-119, -40, -84, -39,-123, -39,-118, -40, -86, -39, +-123, -39,-119, -40, -86, -39,-123, -39,-118, -40, -86, -40, -82, -39,-119, -40, -86, -40, -82, -39, +-118, -40, -86, -40, -84, -39,-119, -40, -86, -40, -84, -39,-118, -40, -88, -40, -82, -39,-118, -39, +-118, -39,-123, -39,-123, -39,-122, -39,-123, -39,-119, -39,-122, -39,-123, -39,-118, -39,-122, -40, + -84, -39,-119, -39,-122, -40, -84, -39,-123, -39,-122, -40, -83, -39,-119, -39,-122, -40, -83, -39, +-123, -39,-121, -39,-123, -39,-123, -39,-121, -39,-123, -40, -84, -39,-123, -40, -84, -40, -82, -39, +-123, -40, -82, -39,-123, -39,-123, -40, -82, -40, -84, -39,-123, -40, -84, -39,-123, -39,-123, -40, + -84, -40, -83, -39,-123, -40, -83, -39,-118, -39,-123, -40, -83, -40, -84, -39,-124, -39,-123, -40, + -83, -39,-124, -40, -82, -39,-123, -39,-124, -40, -84, -40, -84, -39,-124, -40, -83, -39,-119, -39, +-124, -40, -83, -39,-118, -39,-124, -40, -83, -39,-123, -39,-126, -39,-123, -39,-123, -39,-126, -39, +-123, -40, -83, -39,-127, -40, -82, -39,-123, -40, -70, -39,-123, -39,-119, -40, -70, -39,-123, -39, +-118, -40, -70, -39,-123, -39,-123, -40, -71, -39,-123, -39,-119, -40, -71, -40, -84, -39,-123, -40, + -73, -39,-123, -39,-118, -40, -73, -39,-123, -39,-123, -40, -73, -39,-123, -40, -83, -40, -74, -40, + -82, -39,-123, -40, -74, -40, -83, -39,-119, -40, -76, -39,-123, -39,-123, -40, -76, -39,-123, -40, + -82, -40, -76, -40, -84, -39,-118, -40, -76, -40, -83, -39,-123, -40, -75, -39,-123, -39,-123, -40, + -75, -40, -83, -40, -83, -40, -77, -39,-123, -39,-123, -40, -77, -39,-123, -40, -84, -40, -77, -39, +-123, -40, -83, -40, -77, -40, -84, -39,-119, -40, -77, -40, -84, -40, -83, -40, -77, -40, -83, -40, + -84, -40, -83, -39,-123, -39,-119, -40, -83, -39,-123, -39,-118, -40, -84, -39,-123, -40, -83, -40, + -86, -39,-123, -40, -82, -40, -86, -39,-123, -40, -83, -40, -86, -39,-123, -40, -84, -40, -86, -40, + -82, -39,-123, -40, -86, -40, -83, -39,-123, -40, -86, -40, -83, -40, -84, -40, -86, -40, -84, -39, +-123, -39,-128, -39,-112, -39,-111, -39,-128, -39,-113, -39,-111, -39,-128, -39,-114, -39,-111, -39, +-118, -39,-108, -39,-121, -39,-118, -39,-108, -40, -82, -39,-118, -39,-108, -39,-122, -39,-118, -39, +-108, -40, -78, -39,-118, -39,-108, -40, -79, 32, -39,-111, -39, -80, 32, -39,-112, -39,-111, 32, + -39,-113, -39,-111, 32, -39,-114, -39,-111, 32, -39,-115, -39,-111, 32, -39,-116, -39,-111, -39, +-118, -39,-108, -39,-118, -39,-118, -39,-108, -39,-123, -39,-118, -39,-108, -40, -83, -39,-118, -39, +-108, -40, -84, -39,-118, -39,-108, -39,-119, -39,-118, -39,-108, -37,-112, -39,-118, -39,-108, -37, +-120, -39,-118, -39,-108, -37,-122, -39,-118, -39,-108, -37,-121, -39,-118, -39,-108, -39,-120, -39, +-118, -39,-108, -37,-107, -39,-118, -39,-108, -40, -89, 102, 102, 108, 102, 102, 105, 103, 97, 108, + 51, 49, -26,-105, -91, 51, 48, -26,-105, -91, 50, 57, -26,-105, -91, 50, 56, -26,-105, -91, + 50, 55, -26,-105, -91, 50, 54, -26,-105, -91, 50, 53, -26,-105, -91, 50, 52, -26,-105, -91, + 50, 51, -26,-105, -91, 50, 50, -26,-105, -91, 50, 49, -26,-105, -91, 50, 48, -26,-105, -91, + 49, 57, -26,-105, -91, 49, 56, -26,-105, -91, 49, 55, -26,-105, -91, 49, 54, -26,-105, -91, + 49, 53, -26,-105, -91, 49, 52, -26,-105, -91, 49, 51, -26,-105, -91, 49, 50, -26,-105, -91, + 49, 49, -26,-105, -91, 49, 48, -26,-105, -91, 65, -30,-120,-107, 109, 86, -30,-120,-107, 109, + 80, 80, 77, 109, 111, 108, 109, 105, 108, 108, 111, 103, 67, 111, 46, 71, 80, 97, 77, 80, + 97, 107, 80, 97, 107, 109, 51, 99, 109, 51, 109, 109, 51, 107, 109, 50, 99, 109, 50, 109, + 109, 50, 84, 72, 122, 71, 72, 122, 77, 72, 122, 107, 72, 122, 100, 109, 51, 100, 109, 50, + 98, 97, 114, 104, 80, 97, 50, 52, -25,-126, -71, 50, 51, -25,-126, -71, 50, 50, -25,-126, + -71, 50, 49, -25,-126, -71, 50, 48, -25,-126, -71, 49, 57, -25,-126, -71, 49, 56, -25,-126, + -71, 49, 55, -25,-126, -71, 49, 54, -25,-126, -71, 49, 53, -25,-126, -71, 49, 52, -25,-126, + -71, 49, 51, -25,-126, -71, 49, 50, -25,-126, -71, 49, 49, -25,-126, -71, 49, 48, -25,-126, + -71, -29,-125, -90, -29,-126, -94, -29,-125, -77, -29,-125, -92, -29,-125, -68, -29,-125, -85, -29, +-125, -98, -29,-125, -85, -29,-126, -81, -29,-125, -98, -29,-125,-125, -29,-125,-113, -29,-125, -98, + -29,-126, -92, -29,-125, -85, -29,-125,-101, -29,-125, -68, -29,-125, -77, -29,-125,-101, -29,-125, + -68, -29,-125, -85, -29,-125,-104, -29,-125, -85, -29,-125,-124, -29,-125,-104, -29,-126,-102, -29, +-126, -67, -29,-125,-107, -29,-125, -87, -29,-125, -77, -29,-125,-110, -29,-126,-103, -29,-125, -85, + -29,-125,-110, -29,-126,-102, -29,-126, -77, -29,-125,-113, -29,-126, -92, -29,-125,-124, -29,-125, +-114, -29,-125,-125, -29,-125,-120, -29,-125,-120, -29,-126,-103, -29,-125, -85, -29,-125,-122, -29, +-126,-103, -29,-126, -73, -29,-126, -69, -29,-125, -77, -29,-125,-127, -29,-126, -77, -29,-125, -85, + -29,-125,-118, -29,-126, -79, -29,-125, -68, -29,-126, -71, -29,-126, -85, -29,-126, -92, -29,-125, + -86, -29,-126, -86, -29,-125, -68, -29,-125, -96, -29,-126, -86, -29,-125, -77, -29,-126, -71, -29, +-126, -90, -29,-126, -87, -29,-125, -77, -29,-126, -92, -29,-125, -77, -29,-125,-127, -29,-126, -94, + -29,-125, -68, -29,-125, -85, 76, 84, 68, 101, 114, 103, 49, 50, -26,-100,-120, 49, 49, -26, +-100,-120, 49, 48, -26,-100,-120, 80, 84, 69, 40, -24,-121, -77, 41, 40, -24,-121, -86, 41, + 40, -28, -68,-111, 41, 40, -25, -91, -83, 41, 40, -27,-115,-108, 41, 40, -24, -77,-121, 41, + 40, -28, -68,-127, 41, 40, -25,-101, -93, 41, 40, -27, -83, -90, 41, 40, -27,-111, -68, 41, + 40, -28, -69, -93, 41, 40, -27,-118, -76, 41, 40, -25, -91, -99, 41, 40, -24, -78, -95, 41, + 40, -25,-119, -71, 41, 40, -27,-112,-115, 41, 40, -25, -92, -66, 41, 40, -26,-100,-119, 41, + 40, -26, -96, -86, 41, 40, -26,-105, -91, 41, 40, -27,-100, -97, 41, 40, -23,-121,-111, 41, + 40, -26,-100, -88, 41, 40, -26, -80, -76, 41, 40, -25,-127, -85, 41, 40, -26,-100,-120, 41, + 40, -27,-115,-127, 41, 40, -28, -71, -99, 41, 40, -27,-123, -85, 41, 40, -28, -72,-125, 41, + 40, -27,-123, -83, 41, 40, -28, -70,-108, 41, 40, -27,-101,-101, 41, 40, -28, -72,-119, 41, + 40, -28, -70,-116, 41, 40, -28, -72,-128, 41, 40, -31,-124,-110, 41, 40, -31,-124,-111, 41, + 40, -31,-124,-112, 41, 40, -31,-124,-113, 41, 40, -31,-124,-114, 41, 40, -31,-124,-116, 41, + 40, -31,-124,-117, 41, 40, -31,-124,-119, 41, 40, -31,-124,-121, 41, 40, -31,-124,-122, 41, + 40, -31,-124,-123, 41, 40, -31,-124,-125, 41, 40, -31,-124,-126, 41, 40, -31,-124,-128, 41, + 61, 61, 61, 58, 58, 61, 40, 122, 41, 40, 121, 41, 40, 120, 41, 40, 119, 41, 40, 118, + 41, 40, 117, 41, 40, 116, 41, 40, 115, 41, 40, 114, 41, 40, 113, 41, 40, 112, 41, 40, + 111, 41, 40, 110, 41, 40, 109, 41, 40, 108, 41, 40, 107, 41, 40, 106, 41, 40, 105, 41, + 40, 104, 41, 40, 103, 41, 40, 102, 41, 40, 101, 41, 40, 100, 41, 40, 99, 41, 40, 98, + 41, 40, 97, 41, 50, 48, 46, 49, 57, 46, 49, 56, 46, 49, 55, 46, 49, 54, 46, 49, + 53, 46, 49, 52, 46, 49, 51, 46, 49, 50, 46, 49, 49, 46, 49, 48, 46, 40, 57, 41, + 40, 56, 41, 40, 55, 41, 40, 54, 41, 40, 53, 41, 40, 52, 41, 40, 51, 41, 40, 50, + 41, 40, 49, 41, -30,-120, -82, -30,-120, -82, -30,-120, -82, 48, -30,-127,-124, 51, 120, 105, + 105, 88, 73, 73, 55, -30,-127,-124, 56, 53, -30,-127,-124, 56, 51, -30,-127,-124, 56, 49, + -30,-127,-124, 56, 53, -30,-127,-124, 54, 49, -30,-127,-124, 54, 52, -30,-127,-124, 53, 51, + -30,-127,-124, 53, 50, -30,-127,-124, 53, 49, -30,-127,-124, 53, 50, -30,-127,-124, 51, 49, + -30,-127,-124, 51, 49, -30,-127,-124, 57, 49, -30,-127,-124, 55, 70, 65, 88, 84, 69, 76, + 99, 47, 117, 99, 47, 111, 97, 47, 115, 97, 47, 99, -30,-128, -75, -30,-128, -75, -30,-128, + -75, 46, 46, 46, 32, -52,-120, -52,-128, 32, -52,-108, -51,-126, 32, -52,-108, -52,-127, 32, + -52,-108, -52,-128, 32, -52,-109, -51,-126, 32, -52,-109, -52,-127, 32, -52,-109, -52,-128, 32, + -52,-120, -51,-126, -32, -66, -77, -32, -67, -79, -32, -66,-128, -32, -66, -78, -32, -67, -79, -32, + -66,-128, 32, -52,-120, -52,-127, 100, 122, -52,-116, 68, 122, -52,-116, 68, 90, -52,-116, 51, + -30,-127,-124, 52, 49, -30,-127,-124, 50, 49, -30,-127,-124, 52, -16, -99,-122, -70, -16, -99, +-123, -91, -16, -99,-123, -81, -16, -99,-122, -71, -16, -99,-123, -91, -16, -99,-123, -81, -16, -99, +-122, -70, -16, -99,-123, -91, -16, -99,-123, -82, -16, -99,-122, -71, -16, -99,-123, -91, -16, -99, +-123, -82, -16, -99,-123,-104, -16, -99,-123, -91, -16, -99,-123, -78, -16, -99,-123,-104, -16, -99, +-123, -91, -16, -99,-123, -79, -16, -99,-123,-104, -16, -99,-123, -91, -16, -99,-123, -80, -16, -99, +-123,-104, -16, -99,-123, -91, -16, -99,-123, -81, -16, -99,-123,-104, -16, -99,-123, -91, -16, -99, +-123, -82, -41, -87, -42, -68, -41,-126, -41, -87, -42, -68, -41,-127, -31,-124,-110, -31,-123, -75, + -31,-121,-126, -31,-124,-110, -31,-123, -75, -31,-121,-127, -31,-124,-110, -31,-123, -75, -31,-121, +-128, -31,-124,-110, -31,-123, -75, -31,-122, -65, -31,-124,-110, -31,-123, -75, -31,-122, -66, -31, +-124,-110, -31,-123, -75, -31,-122, -67, -31,-124,-110, -31,-123, -75, -31,-122, -68, -31,-124,-110, + -31,-123, -75, -31,-122, -69, -31,-124,-110, -31,-123, -75, -31,-122, -70, -31,-124,-110, -31,-123, + -75, -31,-122, -71, -31,-124,-110, -31,-123, -75, -31,-122, -72, -31,-124,-110, -31,-123, -75, -31, +-122, -73, -31,-124,-110, -31,-123, -75, -31,-122, -74, -31,-124,-110, -31,-123, -75, -31,-122, -75, + -31,-124,-110, -31,-123, -75, -31,-122, -76, -31,-124,-110, -31,-123, -75, -31,-122, -77, -31,-124, +-110, -31,-123, -75, -31,-122, -78, -31,-124,-110, -31,-123, -75, -31,-122, -79, -31,-124,-110, -31, +-123, -75, -31,-122, -80, -31,-124,-110, -31,-123, -75, -31,-122, -81, -31,-124,-110, -31,-123, -75, + -31,-122, -82, -31,-124,-110, -31,-123, -75, -31,-122, -83, -31,-124,-110, -31,-123, -75, -31,-122, + -84, -31,-124,-110, -31,-123, -75, -31,-122, -85, -31,-124,-110, -31,-123, -75, -31,-122, -86, -31, +-124,-110, -31,-123, -75, -31,-122, -87, -31,-124,-110, -31,-123, -75, -31,-122, -88, -31,-124,-110, + -31,-123, -76, -31,-121,-126, -31,-124,-110, -31,-123, -76, -31,-121,-127, -31,-124,-110, -31,-123, + -76, -31,-121,-128, -31,-124,-110, -31,-123, -76, -31,-122, -65, -31,-124,-110, -31,-123, -76, -31, +-122, -66, -31,-124,-110, -31,-123, -76, -31,-122, -67, -31,-124,-110, -31,-123, -76, -31,-122, -68, + -31,-124,-110, -31,-123, -76, -31,-122, -69, -31,-124,-110, -31,-123, -76, -31,-122, -70, -31,-124, +-110, -31,-123, -76, -31,-122, -71, -31,-124,-110, -31,-123, -76, -31,-122, -72, -31,-124,-110, -31, +-123, -76, -31,-122, -73, -31,-124,-110, -31,-123, -76, -31,-122, -74, -31,-124,-110, -31,-123, -76, + -31,-122, -75, -31,-124,-110, -31,-123, -76, -31,-122, -76, -31,-124,-110, -31,-123, -76, -31,-122, + -77, -31,-124,-110, -31,-123, -76, -31,-122, -78, -31,-124,-110, -31,-123, -76, -31,-122, -79, -31, +-124,-110, -31,-123, -76, -31,-122, -80, -31,-124,-110, -31,-123, -76, -31,-122, -81, -31,-124,-110, + -31,-123, -76, -31,-122, -82, -31,-124,-110, -31,-123, -76, -31,-122, -83, -31,-124,-110, -31,-123, + -76, -31,-122, -84, -31,-124,-110, -31,-123, -76, -31,-122, -85, -31,-124,-110, -31,-123, -76, -31, +-122, -86, -31,-124,-110, -31,-123, -76, -31,-122, -87, -31,-124,-110, -31,-123, -76, -31,-122, -88, + -31,-124,-110, -31,-123, -77, -31,-121,-126, -31,-124,-110, -31,-123, -77, -31,-121,-127, -31,-124, +-110, -31,-123, -77, -31,-121,-128, -31,-124,-110, -31,-123, -77, -31,-122, -65, -31,-124,-110, -31, +-123, -77, -31,-122, -66, -31,-124,-110, -31,-123, -77, -31,-122, -67, -31,-124,-110, -31,-123, -77, + -31,-122, -68, -31,-124,-110, -31,-123, -77, -31,-122, -69, -31,-124,-110, -31,-123, -77, -31,-122, + -70, -31,-124,-110, -31,-123, -77, -31,-122, -71, -31,-124,-110, -31,-123, -77, -31,-122, -72, -31, +-124,-110, -31,-123, -77, -31,-122, -73, -31,-124,-110, -31,-123, -77, -31,-122, -74, -31,-124,-110, + -31,-123, -77, -31,-122, -75, -31,-124,-110, -31,-123, -77, -31,-122, -76, -31,-124,-110, -31,-123, + -77, -31,-122, -77, -31,-124,-110, -31,-123, -77, -31,-122, -78, -31,-124,-110, -31,-123, -77, -31, +-122, -79, -31,-124,-110, -31,-123, -77, -31,-122, -80, -31,-124,-110, -31,-123, -77, -31,-122, -81, + -31,-124,-110, -31,-123, -77, -31,-122, -82, -31,-124,-110, -31,-123, -77, -31,-122, -83, -31,-124, +-110, -31,-123, -77, -31,-122, -84, -31,-124,-110, -31,-123, -77, -31,-122, -85, -31,-124,-110, -31, +-123, -77, -31,-122, -86, -31,-124,-110, -31,-123, -77, -31,-122, -87, -31,-124,-110, -31,-123, -77, + -31,-122, -88, -31,-124,-110, -31,-123, -78, -31,-121,-126, -31,-124,-110, -31,-123, -78, -31,-121, +-127, -31,-124,-110, -31,-123, -78, -31,-121,-128, -31,-124,-110, -31,-123, -78, -31,-122, -65, -31, +-124,-110, -31,-123, -78, -31,-122, -66, -31,-124,-110, -31,-123, -78, -31,-122, -67, -31,-124,-110, + -31,-123, -78, -31,-122, -68, -31,-124,-110, -31,-123, -78, -31,-122, -69, -31,-124,-110, -31,-123, + -78, -31,-122, -70, -31,-124,-110, -31,-123, -78, -31,-122, -71, -31,-124,-110, -31,-123, -78, -31, +-122, -72, -31,-124,-110, -31,-123, -78, -31,-122, -73, -31,-124,-110, -31,-123, -78, -31,-122, -74, + -31,-124,-110, -31,-123, -78, -31,-122, -75, -31,-124,-110, -31,-123, -78, -31,-122, -76, -31,-124, +-110, -31,-123, -78, -31,-122, -77, -31,-124,-110, -31,-123, -78, -31,-122, -78, -31,-124,-110, -31, +-123, -78, -31,-122, -79, -31,-124,-110, -31,-123, -78, -31,-122, -80, -31,-124,-110, -31,-123, -78, + -31,-122, -81, -31,-124,-110, -31,-123, -78, -31,-122, -82, -31,-124,-110, -31,-123, -78, -31,-122, + -83, -31,-124,-110, -31,-123, -78, -31,-122, -84, -31,-124,-110, -31,-123, -78, -31,-122, -85, -31, +-124,-110, -31,-123, -78, -31,-122, -86, -31,-124,-110, -31,-123, -78, -31,-122, -87, -31,-124,-110, + -31,-123, -78, -31,-122, -88, -31,-124,-110, -31,-123, -79, -31,-121,-126, -31,-124,-110, -31,-123, + -79, -31,-121,-127, -31,-124,-110, -31,-123, -79, -31,-121,-128, -31,-124,-110, -31,-123, -79, -31, +-122, -65, -31,-124,-110, -31,-123, -79, -31,-122, -66, -31,-124,-110, -31,-123, -79, -31,-122, -67, + -31,-124,-110, -31,-123, -79, -31,-122, -68, -31,-124,-110, -31,-123, -79, -31,-122, -69, -31,-124, +-110, -31,-123, -79, -31,-122, -70, -31,-124,-110, -31,-123, -79, -31,-122, -71, -31,-124,-110, -31, +-123, -79, -31,-122, -72, -31,-124,-110, -31,-123, -79, -31,-122, -73, -31,-124,-110, -31,-123, -79, + -31,-122, -74, -31,-124,-110, -31,-123, -79, -31,-122, -75, -31,-124,-110, -31,-123, -79, -31,-122, + -76, -31,-124,-110, -31,-123, -79, -31,-122, -77, -31,-124,-110, -31,-123, -79, -31,-122, -78, -31, +-124,-110, -31,-123, -79, -31,-122, -79, -31,-124,-110, -31,-123, -79, -31,-122, -80, -31,-124,-110, + -31,-123, -79, -31,-122, -81, -31,-124,-110, -31,-123, -79, -31,-122, -82, -31,-124,-110, -31,-123, + -79, -31,-122, -83, -31,-124,-110, -31,-123, -79, -31,-122, -84, -31,-124,-110, -31,-123, -79, -31, +-122, -85, -31,-124,-110, -31,-123, -79, -31,-122, -86, -31,-124,-110, -31,-123, -79, -31,-122, -87, + -31,-124,-110, -31,-123, -79, -31,-122, -88, -31,-124,-110, -31,-123, -80, -31,-121,-126, -31,-124, +-110, -31,-123, -80, -31,-121,-127, -31,-124,-110, -31,-123, -80, -31,-121,-128, -31,-124,-110, -31, +-123, -80, -31,-122, -65, -31,-124,-110, -31,-123, -80, -31,-122, -66, -31,-124,-110, -31,-123, -80, + -31,-122, -67, -31,-124,-110, -31,-123, -80, -31,-122, -68, -31,-124,-110, -31,-123, -80, -31,-122, + -69, -31,-124,-110, -31,-123, -80, -31,-122, -70, -31,-124,-110, -31,-123, -80, -31,-122, -71, -31, +-124,-110, -31,-123, -80, -31,-122, -72, -31,-124,-110, -31,-123, -80, -31,-122, -73, -31,-124,-110, + -31,-123, -80, -31,-122, -74, -31,-124,-110, -31,-123, -80, -31,-122, -75, -31,-124,-110, -31,-123, + -80, -31,-122, -76, -31,-124,-110, -31,-123, -80, -31,-122, -77, -31,-124,-110, -31,-123, -80, -31, +-122, -78, -31,-124,-110, -31,-123, -80, -31,-122, -79, -31,-124,-110, -31,-123, -80, -31,-122, -80, + -31,-124,-110, -31,-123, -80, -31,-122, -81, -31,-124,-110, -31,-123, -80, -31,-122, -82, -31,-124, +-110, -31,-123, -80, -31,-122, -83, -31,-124,-110, -31,-123, -80, -31,-122, -84, -31,-124,-110, -31, +-123, -80, -31,-122, -85, -31,-124,-110, -31,-123, -80, -31,-122, -86, -31,-124,-110, -31,-123, -80, + -31,-122, -87, -31,-124,-110, -31,-123, -80, -31,-122, -88, -31,-124,-110, -31,-123, -81, -31,-121, +-126, -31,-124,-110, -31,-123, -81, -31,-121,-127, -31,-124,-110, -31,-123, -81, -31,-121,-128, -31, +-124,-110, -31,-123, -81, -31,-122, -65, -31,-124,-110, -31,-123, -81, -31,-122, -66, -31,-124,-110, + -31,-123, -81, -31,-122, -67, -31,-124,-110, -31,-123, -81, -31,-122, -68, -31,-124,-110, -31,-123, + -81, -31,-122, -69, -31,-124,-110, -31,-123, -81, -31,-122, -70, -31,-124,-110, -31,-123, -81, -31, +-122, -71, -31,-124,-110, -31,-123, -81, -31,-122, -72, -31,-124,-110, -31,-123, -81, -31,-122, -73, + -31,-124,-110, -31,-123, -81, -31,-122, -74, -31,-124,-110, -31,-123, -81, -31,-122, -75, -31,-124, +-110, -31,-123, -81, -31,-122, -76, -31,-124,-110, -31,-123, -81, -31,-122, -77, -31,-124,-110, -31, +-123, -81, -31,-122, -78, -31,-124,-110, -31,-123, -81, -31,-122, -79, -31,-124,-110, -31,-123, -81, + -31,-122, -80, -31,-124,-110, -31,-123, -81, -31,-122, -81, -31,-124,-110, -31,-123, -81, -31,-122, + -82, -31,-124,-110, -31,-123, -81, -31,-122, -83, -31,-124,-110, -31,-123, -81, -31,-122, -84, -31, +-124,-110, -31,-123, -81, -31,-122, -85, -31,-124,-110, -31,-123, -81, -31,-122, -86, -31,-124,-110, + -31,-123, -81, -31,-122, -87, -31,-124,-110, -31,-123, -81, -31,-122, -88, -31,-124,-110, -31,-123, + -82, -31,-121,-126, -31,-124,-110, -31,-123, -82, -31,-121,-127, -31,-124,-110, -31,-123, -82, -31, +-121,-128, -31,-124,-110, -31,-123, -82, -31,-122, -65, -31,-124,-110, -31,-123, -82, -31,-122, -66, + -31,-124,-110, -31,-123, -82, -31,-122, -67, -31,-124,-110, -31,-123, -82, -31,-122, -68, -31,-124, +-110, -31,-123, -82, -31,-122, -69, -31,-124,-110, -31,-123, -82, -31,-122, -70, -31,-124,-110, -31, +-123, -82, -31,-122, -71, -31,-124,-110, -31,-123, -82, -31,-122, -72, -31,-124,-110, -31,-123, -82, + -31,-122, -73, -31,-124,-110, -31,-123, -82, -31,-122, -74, -31,-124,-110, -31,-123, -82, -31,-122, + -75, -31,-124,-110, -31,-123, -82, -31,-122, -76, -31,-124,-110, -31,-123, -82, -31,-122, -77, -31, +-124,-110, -31,-123, -82, -31,-122, -78, -31,-124,-110, -31,-123, -82, -31,-122, -79, -31,-124,-110, + -31,-123, -82, -31,-122, -80, -31,-124,-110, -31,-123, -82, -31,-122, -81, -31,-124,-110, -31,-123, + -82, -31,-122, -82, -31,-124,-110, -31,-123, -82, -31,-122, -83, -31,-124,-110, -31,-123, -82, -31, +-122, -84, -31,-124,-110, -31,-123, -82, -31,-122, -85, -31,-124,-110, -31,-123, -82, -31,-122, -86, + -31,-124,-110, -31,-123, -82, -31,-122, -87, -31,-124,-110, -31,-123, -82, -31,-122, -88, -31,-124, +-110, -31,-123, -83, -31,-121,-126, -31,-124,-110, -31,-123, -83, -31,-121,-127, -31,-124,-110, -31, +-123, -83, -31,-121,-128, -31,-124,-110, -31,-123, -83, -31,-122, -65, -31,-124,-110, -31,-123, -83, + -31,-122, -66, -31,-124,-110, -31,-123, -83, -31,-122, -67, -31,-124,-110, -31,-123, -83, -31,-122, + -68, -31,-124,-110, -31,-123, -83, -31,-122, -69, -31,-124,-110, -31,-123, -83, -31,-122, -70, -31, +-124,-110, -31,-123, -83, -31,-122, -71, -31,-124,-110, -31,-123, -83, -31,-122, -72, -31,-124,-110, + -31,-123, -83, -31,-122, -73, -31,-124,-110, -31,-123, -83, -31,-122, -74, -31,-124,-110, -31,-123, + -83, -31,-122, -75, -31,-124,-110, -31,-123, -83, -31,-122, -76, -31,-124,-110, -31,-123, -83, -31, +-122, -77, -31,-124,-110, -31,-123, -83, -31,-122, -78, -31,-124,-110, -31,-123, -83, -31,-122, -79, + -31,-124,-110, -31,-123, -83, -31,-122, -80, -31,-124,-110, -31,-123, -83, -31,-122, -81, -31,-124, +-110, -31,-123, -83, -31,-122, -82, -31,-124,-110, -31,-123, -83, -31,-122, -83, -31,-124,-110, -31, +-123, -83, -31,-122, -84, -31,-124,-110, -31,-123, -83, -31,-122, -85, -31,-124,-110, -31,-123, -83, + -31,-122, -86, -31,-124,-110, -31,-123, -83, -31,-122, -87, -31,-124,-110, -31,-123, -83, -31,-122, + -88, -31,-124,-110, -31,-123, -84, -31,-121,-126, -31,-124,-110, -31,-123, -84, -31,-121,-127, -31, +-124,-110, -31,-123, -84, -31,-121,-128, -31,-124,-110, -31,-123, -84, -31,-122, -65, -31,-124,-110, + -31,-123, -84, -31,-122, -66, -31,-124,-110, -31,-123, -84, -31,-122, -67, -31,-124,-110, -31,-123, + -84, -31,-122, -68, -31,-124,-110, -31,-123, -84, -31,-122, -69, -31,-124,-110, -31,-123, -84, -31, +-122, -70, -31,-124,-110, -31,-123, -84, -31,-122, -71, -31,-124,-110, -31,-123, -84, -31,-122, -72, + -31,-124,-110, -31,-123, -84, -31,-122, -73, -31,-124,-110, -31,-123, -84, -31,-122, -74, -31,-124, +-110, -31,-123, -84, -31,-122, -75, -31,-124,-110, -31,-123, -84, -31,-122, -76, -31,-124,-110, -31, +-123, -84, -31,-122, -77, -31,-124,-110, -31,-123, -84, -31,-122, -78, -31,-124,-110, -31,-123, -84, + -31,-122, -79, -31,-124,-110, -31,-123, -84, -31,-122, -80, -31,-124,-110, -31,-123, -84, -31,-122, + -81, -31,-124,-110, -31,-123, -84, -31,-122, -82, -31,-124,-110, -31,-123, -84, -31,-122, -83, -31, +-124,-110, -31,-123, -84, -31,-122, -84, -31,-124,-110, -31,-123, -84, -31,-122, -85, -31,-124,-110, + -31,-123, -84, -31,-122, -86, -31,-124,-110, -31,-123, -84, -31,-122, -87, -31,-124,-110, -31,-123, + -84, -31,-122, -88, -31,-124,-110, -31,-123, -85, -31,-121,-126, -31,-124,-110, -31,-123, -85, -31, +-121,-127, -31,-124,-110, -31,-123, -85, -31,-121,-128, -31,-124,-110, -31,-123, -85, -31,-122, -65, + -31,-124,-110, -31,-123, -85, -31,-122, -66, -31,-124,-110, -31,-123, -85, -31,-122, -67, -31,-124, +-110, -31,-123, -85, -31,-122, -68, -31,-124,-110, -31,-123, -85, -31,-122, -69, -31,-124,-110, -31, +-123, -85, -31,-122, -70, -31,-124,-110, -31,-123, -85, -31,-122, -71, -31,-124,-110, -31,-123, -85, + -31,-122, -72, -31,-124,-110, -31,-123, -85, -31,-122, -73, -31,-124,-110, -31,-123, -85, -31,-122, + -74, -31,-124,-110, -31,-123, -85, -31,-122, -75, -31,-124,-110, -31,-123, -85, -31,-122, -76, -31, +-124,-110, -31,-123, -85, -31,-122, -77, -31,-124,-110, -31,-123, -85, -31,-122, -78, -31,-124,-110, + -31,-123, -85, -31,-122, -79, -31,-124,-110, -31,-123, -85, -31,-122, -80, -31,-124,-110, -31,-123, + -85, -31,-122, -81, -31,-124,-110, -31,-123, -85, -31,-122, -82, -31,-124,-110, -31,-123, -85, -31, +-122, -83, -31,-124,-110, -31,-123, -85, -31,-122, -84, -31,-124,-110, -31,-123, -85, -31,-122, -85, + -31,-124,-110, -31,-123, -85, -31,-122, -86, -31,-124,-110, -31,-123, -85, -31,-122, -87, -31,-124, +-110, -31,-123, -85, -31,-122, -88, -31,-124,-110, -31,-123, -86, -31,-121,-126, -31,-124,-110, -31, +-123, -86, -31,-121,-127, -31,-124,-110, -31,-123, -86, -31,-121,-128, -31,-124,-110, -31,-123, -86, + -31,-122, -65, -31,-124,-110, -31,-123, -86, -31,-122, -66, -31,-124,-110, -31,-123, -86, -31,-122, + -67, -31,-124,-110, -31,-123, -86, -31,-122, -68, -31,-124,-110, -31,-123, -86, -31,-122, -69, -31, +-124,-110, -31,-123, -86, -31,-122, -70, -31,-124,-110, -31,-123, -86, -31,-122, -71, -31,-124,-110, + -31,-123, -86, -31,-122, -72, -31,-124,-110, -31,-123, -86, -31,-122, -73, -31,-124,-110, -31,-123, + -86, -31,-122, -74, -31,-124,-110, -31,-123, -86, -31,-122, -75, -31,-124,-110, -31,-123, -86, -31, +-122, -76, -31,-124,-110, -31,-123, -86, -31,-122, -77, -31,-124,-110, -31,-123, -86, -31,-122, -78, + -31,-124,-110, -31,-123, -86, -31,-122, -79, -31,-124,-110, -31,-123, -86, -31,-122, -80, -31,-124, +-110, -31,-123, -86, -31,-122, -81, -31,-124,-110, -31,-123, -86, -31,-122, -82, -31,-124,-110, -31, +-123, -86, -31,-122, -83, -31,-124,-110, -31,-123, -86, -31,-122, -84, -31,-124,-110, -31,-123, -86, + -31,-122, -85, -31,-124,-110, -31,-123, -86, -31,-122, -86, -31,-124,-110, -31,-123, -86, -31,-122, + -87, -31,-124,-110, -31,-123, -86, -31,-122, -88, -31,-124,-110, -31,-123, -87, -31,-121,-126, -31, +-124,-110, -31,-123, -87, -31,-121,-127, -31,-124,-110, -31,-123, -87, -31,-121,-128, -31,-124,-110, + -31,-123, -87, -31,-122, -65, -31,-124,-110, -31,-123, -87, -31,-122, -66, -31,-124,-110, -31,-123, + -87, -31,-122, -67, -31,-124,-110, -31,-123, -87, -31,-122, -68, -31,-124,-110, -31,-123, -87, -31, +-122, -69, -31,-124,-110, -31,-123, -87, -31,-122, -70, -31,-124,-110, -31,-123, -87, -31,-122, -71, + -31,-124,-110, -31,-123, -87, -31,-122, -72, -31,-124,-110, -31,-123, -87, -31,-122, -73, -31,-124, +-110, -31,-123, -87, -31,-122, -74, -31,-124,-110, -31,-123, -87, -31,-122, -75, -31,-124,-110, -31, +-123, -87, -31,-122, -76, -31,-124,-110, -31,-123, -87, -31,-122, -77, -31,-124,-110, -31,-123, -87, + -31,-122, -78, -31,-124,-110, -31,-123, -87, -31,-122, -79, -31,-124,-110, -31,-123, -87, -31,-122, + -80, -31,-124,-110, -31,-123, -87, -31,-122, -81, -31,-124,-110, -31,-123, -87, -31,-122, -82, -31, +-124,-110, -31,-123, -87, -31,-122, -83, -31,-124,-110, -31,-123, -87, -31,-122, -84, -31,-124,-110, + -31,-123, -87, -31,-122, -85, -31,-124,-110, -31,-123, -87, -31,-122, -86, -31,-124,-110, -31,-123, + -87, -31,-122, -87, -31,-124,-110, -31,-123, -87, -31,-122, -88, -31,-124,-110, -31,-123, -88, -31, +-121,-126, -31,-124,-110, -31,-123, -88, -31,-121,-127, -31,-124,-110, -31,-123, -88, -31,-121,-128, + -31,-124,-110, -31,-123, -88, -31,-122, -65, -31,-124,-110, -31,-123, -88, -31,-122, -66, -31,-124, +-110, -31,-123, -88, -31,-122, -67, -31,-124,-110, -31,-123, -88, -31,-122, -68, -31,-124,-110, -31, +-123, -88, -31,-122, -69, -31,-124,-110, -31,-123, -88, -31,-122, -70, -31,-124,-110, -31,-123, -88, + -31,-122, -71, -31,-124,-110, -31,-123, -88, -31,-122, -72, -31,-124,-110, -31,-123, -88, -31,-122, + -73, -31,-124,-110, -31,-123, -88, -31,-122, -74, -31,-124,-110, -31,-123, -88, -31,-122, -75, -31, +-124,-110, -31,-123, -88, -31,-122, -76, -31,-124,-110, -31,-123, -88, -31,-122, -77, -31,-124,-110, + -31,-123, -88, -31,-122, -78, -31,-124,-110, -31,-123, -88, -31,-122, -79, -31,-124,-110, -31,-123, + -88, -31,-122, -80, -31,-124,-110, -31,-123, -88, -31,-122, -81, -31,-124,-110, -31,-123, -88, -31, +-122, -82, -31,-124,-110, -31,-123, -88, -31,-122, -83, -31,-124,-110, -31,-123, -88, -31,-122, -84, + -31,-124,-110, -31,-123, -88, -31,-122, -85, -31,-124,-110, -31,-123, -88, -31,-122, -86, -31,-124, +-110, -31,-123, -88, -31,-122, -87, -31,-124,-110, -31,-123, -88, -31,-122, -88, -31,-124,-110, -31, +-123, -89, -31,-121,-126, -31,-124,-110, -31,-123, -89, -31,-121,-127, -31,-124,-110, -31,-123, -89, + -31,-121,-128, -31,-124,-110, -31,-123, -89, -31,-122, -65, -31,-124,-110, -31,-123, -89, -31,-122, + -66, -31,-124,-110, -31,-123, -89, -31,-122, -67, -31,-124,-110, -31,-123, -89, -31,-122, -68, -31, +-124,-110, -31,-123, -89, -31,-122, -69, -31,-124,-110, -31,-123, -89, -31,-122, -70, -31,-124,-110, + -31,-123, -89, -31,-122, -71, -31,-124,-110, -31,-123, -89, -31,-122, -72, -31,-124,-110, -31,-123, + -89, -31,-122, -73, -31,-124,-110, -31,-123, -89, -31,-122, -74, -31,-124,-110, -31,-123, -89, -31, +-122, -75, -31,-124,-110, -31,-123, -89, -31,-122, -76, -31,-124,-110, -31,-123, -89, -31,-122, -77, + -31,-124,-110, -31,-123, -89, -31,-122, -78, -31,-124,-110, -31,-123, -89, -31,-122, -79, -31,-124, +-110, -31,-123, -89, -31,-122, -80, -31,-124,-110, -31,-123, -89, -31,-122, -81, -31,-124,-110, -31, +-123, -89, -31,-122, -82, -31,-124,-110, -31,-123, -89, -31,-122, -83, -31,-124,-110, -31,-123, -89, + -31,-122, -84, -31,-124,-110, -31,-123, -89, -31,-122, -85, -31,-124,-110, -31,-123, -89, -31,-122, + -86, -31,-124,-110, -31,-123, -89, -31,-122, -87, -31,-124,-110, -31,-123, -89, -31,-122, -88, -31, +-124,-110, -31,-123, -90, -31,-121,-126, -31,-124,-110, -31,-123, -90, -31,-121,-127, -31,-124,-110, + -31,-123, -90, -31,-121,-128, -31,-124,-110, -31,-123, -90, -31,-122, -65, -31,-124,-110, -31,-123, + -90, -31,-122, -66, -31,-124,-110, -31,-123, -90, -31,-122, -67, -31,-124,-110, -31,-123, -90, -31, +-122, -68, -31,-124,-110, -31,-123, -90, -31,-122, -69, -31,-124,-110, -31,-123, -90, -31,-122, -70, + -31,-124,-110, -31,-123, -90, -31,-122, -71, -31,-124,-110, -31,-123, -90, -31,-122, -72, -31,-124, +-110, -31,-123, -90, -31,-122, -73, -31,-124,-110, -31,-123, -90, -31,-122, -74, -31,-124,-110, -31, +-123, -90, -31,-122, -75, -31,-124,-110, -31,-123, -90, -31,-122, -76, -31,-124,-110, -31,-123, -90, + -31,-122, -77, -31,-124,-110, -31,-123, -90, -31,-122, -78, -31,-124,-110, -31,-123, -90, -31,-122, + -79, -31,-124,-110, -31,-123, -90, -31,-122, -80, -31,-124,-110, -31,-123, -90, -31,-122, -81, -31, +-124,-110, -31,-123, -90, -31,-122, -82, -31,-124,-110, -31,-123, -90, -31,-122, -83, -31,-124,-110, + -31,-123, -90, -31,-122, -84, -31,-124,-110, -31,-123, -90, -31,-122, -85, -31,-124,-110, -31,-123, + -90, -31,-122, -86, -31,-124,-110, -31,-123, -90, -31,-122, -87, -31,-124,-110, -31,-123, -90, -31, +-122, -88, -31,-124,-110, -31,-123, -91, -31,-121,-126, -31,-124,-110, -31,-123, -91, -31,-121,-127, + -31,-124,-110, -31,-123, -91, -31,-121,-128, -31,-124,-110, -31,-123, -91, -31,-122, -65, -31,-124, +-110, -31,-123, -91, -31,-122, -66, -31,-124,-110, -31,-123, -91, -31,-122, -67, -31,-124,-110, -31, +-123, -91, -31,-122, -68, -31,-124,-110, -31,-123, -91, -31,-122, -69, -31,-124,-110, -31,-123, -91, + -31,-122, -70, -31,-124,-110, -31,-123, -91, -31,-122, -71, -31,-124,-110, -31,-123, -91, -31,-122, + -72, -31,-124,-110, -31,-123, -91, -31,-122, -73, -31,-124,-110, -31,-123, -91, -31,-122, -74, -31, +-124,-110, -31,-123, -91, -31,-122, -75, -31,-124,-110, -31,-123, -91, -31,-122, -76, -31,-124,-110, + -31,-123, -91, -31,-122, -77, -31,-124,-110, -31,-123, -91, -31,-122, -78, -31,-124,-110, -31,-123, + -91, -31,-122, -79, -31,-124,-110, -31,-123, -91, -31,-122, -80, -31,-124,-110, -31,-123, -91, -31, +-122, -81, -31,-124,-110, -31,-123, -91, -31,-122, -82, -31,-124,-110, -31,-123, -91, -31,-122, -83, + -31,-124,-110, -31,-123, -91, -31,-122, -84, -31,-124,-110, -31,-123, -91, -31,-122, -85, -31,-124, +-110, -31,-123, -91, -31,-122, -86, -31,-124,-110, -31,-123, -91, -31,-122, -87, -31,-124,-110, -31, +-123, -91, -31,-122, -88, -31,-124,-110, -31,-123, -92, -31,-121,-126, -31,-124,-110, -31,-123, -92, + -31,-121,-127, -31,-124,-110, -31,-123, -92, -31,-121,-128, -31,-124,-110, -31,-123, -92, -31,-122, + -65, -31,-124,-110, -31,-123, -92, -31,-122, -66, -31,-124,-110, -31,-123, -92, -31,-122, -67, -31, +-124,-110, -31,-123, -92, -31,-122, -68, -31,-124,-110, -31,-123, -92, -31,-122, -69, -31,-124,-110, + -31,-123, -92, -31,-122, -70, -31,-124,-110, -31,-123, -92, -31,-122, -71, -31,-124,-110, -31,-123, + -92, -31,-122, -72, -31,-124,-110, -31,-123, -92, -31,-122, -73, -31,-124,-110, -31,-123, -92, -31, +-122, -74, -31,-124,-110, -31,-123, -92, -31,-122, -75, -31,-124,-110, -31,-123, -92, -31,-122, -76, + -31,-124,-110, -31,-123, -92, -31,-122, -77, -31,-124,-110, -31,-123, -92, -31,-122, -78, -31,-124, +-110, -31,-123, -92, -31,-122, -79, -31,-124,-110, -31,-123, -92, -31,-122, -80, -31,-124,-110, -31, +-123, -92, -31,-122, -81, -31,-124,-110, -31,-123, -92, -31,-122, -82, -31,-124,-110, -31,-123, -92, + -31,-122, -83, -31,-124,-110, -31,-123, -92, -31,-122, -84, -31,-124,-110, -31,-123, -92, -31,-122, + -85, -31,-124,-110, -31,-123, -92, -31,-122, -86, -31,-124,-110, -31,-123, -92, -31,-122, -87, -31, +-124,-110, -31,-123, -92, -31,-122, -88, -31,-124,-110, -31,-123, -93, -31,-121,-126, -31,-124,-110, + -31,-123, -93, -31,-121,-127, -31,-124,-110, -31,-123, -93, -31,-121,-128, -31,-124,-110, -31,-123, + -93, -31,-122, -65, -31,-124,-110, -31,-123, -93, -31,-122, -66, -31,-124,-110, -31,-123, -93, -31, +-122, -67, -31,-124,-110, -31,-123, -93, -31,-122, -68, -31,-124,-110, -31,-123, -93, -31,-122, -69, + -31,-124,-110, -31,-123, -93, -31,-122, -70, -31,-124,-110, -31,-123, -93, -31,-122, -71, -31,-124, +-110, -31,-123, -93, -31,-122, -72, -31,-124,-110, -31,-123, -93, -31,-122, -73, -31,-124,-110, -31, +-123, -93, -31,-122, -74, -31,-124,-110, -31,-123, -93, -31,-122, -75, -31,-124,-110, -31,-123, -93, + -31,-122, -76, -31,-124,-110, -31,-123, -93, -31,-122, -77, -31,-124,-110, -31,-123, -93, -31,-122, + -78, -31,-124,-110, -31,-123, -93, -31,-122, -79, -31,-124,-110, -31,-123, -93, -31,-122, -80, -31, +-124,-110, -31,-123, -93, -31,-122, -81, -31,-124,-110, -31,-123, -93, -31,-122, -82, -31,-124,-110, + -31,-123, -93, -31,-122, -83, -31,-124,-110, -31,-123, -93, -31,-122, -84, -31,-124,-110, -31,-123, + -93, -31,-122, -85, -31,-124,-110, -31,-123, -93, -31,-122, -86, -31,-124,-110, -31,-123, -93, -31, +-122, -87, -31,-124,-110, -31,-123, -93, -31,-122, -88, -31,-124,-110, -31,-123, -94, -31,-121,-126, + -31,-124,-110, -31,-123, -94, -31,-121,-127, -31,-124,-110, -31,-123, -94, -31,-121,-128, -31,-124, +-110, -31,-123, -94, -31,-122, -65, -31,-124,-110, -31,-123, -94, -31,-122, -66, -31,-124,-110, -31, +-123, -94, -31,-122, -67, -31,-124,-110, -31,-123, -94, -31,-122, -68, -31,-124,-110, -31,-123, -94, + -31,-122, -69, -31,-124,-110, -31,-123, -94, -31,-122, -70, -31,-124,-110, -31,-123, -94, -31,-122, + -71, -31,-124,-110, -31,-123, -94, -31,-122, -72, -31,-124,-110, -31,-123, -94, -31,-122, -73, -31, +-124,-110, -31,-123, -94, -31,-122, -74, -31,-124,-110, -31,-123, -94, -31,-122, -75, -31,-124,-110, + -31,-123, -94, -31,-122, -76, -31,-124,-110, -31,-123, -94, -31,-122, -77, -31,-124,-110, -31,-123, + -94, -31,-122, -78, -31,-124,-110, -31,-123, -94, -31,-122, -79, -31,-124,-110, -31,-123, -94, -31, +-122, -80, -31,-124,-110, -31,-123, -94, -31,-122, -81, -31,-124,-110, -31,-123, -94, -31,-122, -82, + -31,-124,-110, -31,-123, -94, -31,-122, -83, -31,-124,-110, -31,-123, -94, -31,-122, -84, -31,-124, +-110, -31,-123, -94, -31,-122, -85, -31,-124,-110, -31,-123, -94, -31,-122, -86, -31,-124,-110, -31, +-123, -94, -31,-122, -87, -31,-124,-110, -31,-123, -94, -31,-122, -88, -31,-124,-110, -31,-123, -95, + -31,-121,-126, -31,-124,-110, -31,-123, -95, -31,-121,-127, -31,-124,-110, -31,-123, -95, -31,-121, +-128, -31,-124,-110, -31,-123, -95, -31,-122, -65, -31,-124,-110, -31,-123, -95, -31,-122, -66, -31, +-124,-110, -31,-123, -95, -31,-122, -67, -31,-124,-110, -31,-123, -95, -31,-122, -68, -31,-124,-110, + -31,-123, -95, -31,-122, -69, -31,-124,-110, -31,-123, -95, -31,-122, -70, -31,-124,-110, -31,-123, + -95, -31,-122, -71, -31,-124,-110, -31,-123, -95, -31,-122, -72, -31,-124,-110, -31,-123, -95, -31, +-122, -73, -31,-124,-110, -31,-123, -95, -31,-122, -74, -31,-124,-110, -31,-123, -95, -31,-122, -75, + -31,-124,-110, -31,-123, -95, -31,-122, -76, -31,-124,-110, -31,-123, -95, -31,-122, -77, -31,-124, +-110, -31,-123, -95, -31,-122, -78, -31,-124,-110, -31,-123, -95, -31,-122, -79, -31,-124,-110, -31, +-123, -95, -31,-122, -80, -31,-124,-110, -31,-123, -95, -31,-122, -81, -31,-124,-110, -31,-123, -95, + -31,-122, -82, -31,-124,-110, -31,-123, -95, -31,-122, -83, -31,-124,-110, -31,-123, -95, -31,-122, + -84, -31,-124,-110, -31,-123, -95, -31,-122, -85, -31,-124,-110, -31,-123, -95, -31,-122, -86, -31, +-124,-110, -31,-123, -95, -31,-122, -87, -31,-124,-110, -31,-123, -95, -31,-122, -88, -31,-124,-111, + -31,-123, -75, -31,-121,-126, -31,-124,-111, -31,-123, -75, -31,-121,-127, -31,-124,-111, -31,-123, + -75, -31,-121,-128, -31,-124,-111, -31,-123, -75, -31,-122, -65, -31,-124,-111, -31,-123, -75, -31, +-122, -66, -31,-124,-111, -31,-123, -75, -31,-122, -67, -31,-124,-111, -31,-123, -75, -31,-122, -68, + -31,-124,-111, -31,-123, -75, -31,-122, -69, -31,-124,-111, -31,-123, -75, -31,-122, -70, -31,-124, +-111, -31,-123, -75, -31,-122, -71, -31,-124,-111, -31,-123, -75, -31,-122, -72, -31,-124,-111, -31, +-123, -75, -31,-122, -73, -31,-124,-111, -31,-123, -75, -31,-122, -74, -31,-124,-111, -31,-123, -75, + -31,-122, -75, -31,-124,-111, -31,-123, -75, -31,-122, -76, -31,-124,-111, -31,-123, -75, -31,-122, + -77, -31,-124,-111, -31,-123, -75, -31,-122, -78, -31,-124,-111, -31,-123, -75, -31,-122, -79, -31, +-124,-111, -31,-123, -75, -31,-122, -80, -31,-124,-111, -31,-123, -75, -31,-122, -81, -31,-124,-111, + -31,-123, -75, -31,-122, -82, -31,-124,-111, -31,-123, -75, -31,-122, -83, -31,-124,-111, -31,-123, + -75, -31,-122, -84, -31,-124,-111, -31,-123, -75, -31,-122, -85, -31,-124,-111, -31,-123, -75, -31, +-122, -86, -31,-124,-111, -31,-123, -75, -31,-122, -87, -31,-124,-111, -31,-123, -75, -31,-122, -88, + -31,-124,-111, -31,-123, -76, -31,-121,-126, -31,-124,-111, -31,-123, -76, -31,-121,-127, -31,-124, +-111, -31,-123, -76, -31,-121,-128, -31,-124,-111, -31,-123, -76, -31,-122, -65, -31,-124,-111, -31, +-123, -76, -31,-122, -66, -31,-124,-111, -31,-123, -76, -31,-122, -67, -31,-124,-111, -31,-123, -76, + -31,-122, -68, -31,-124,-111, -31,-123, -76, -31,-122, -69, -31,-124,-111, -31,-123, -76, -31,-122, + -70, -31,-124,-111, -31,-123, -76, -31,-122, -71, -31,-124,-111, -31,-123, -76, -31,-122, -72, -31, +-124,-111, -31,-123, -76, -31,-122, -73, -31,-124,-111, -31,-123, -76, -31,-122, -74, -31,-124,-111, + -31,-123, -76, -31,-122, -75, -31,-124,-111, -31,-123, -76, -31,-122, -76, -31,-124,-111, -31,-123, + -76, -31,-122, -77, -31,-124,-111, -31,-123, -76, -31,-122, -78, -31,-124,-111, -31,-123, -76, -31, +-122, -79, -31,-124,-111, -31,-123, -76, -31,-122, -80, -31,-124,-111, -31,-123, -76, -31,-122, -81, + -31,-124,-111, -31,-123, -76, -31,-122, -82, -31,-124,-111, -31,-123, -76, -31,-122, -83, -31,-124, +-111, -31,-123, -76, -31,-122, -84, -31,-124,-111, -31,-123, -76, -31,-122, -85, -31,-124,-111, -31, +-123, -76, -31,-122, -86, -31,-124,-111, -31,-123, -76, -31,-122, -87, -31,-124,-111, -31,-123, -76, + -31,-122, -88, -31,-124,-111, -31,-123, -77, -31,-121,-126, -31,-124,-111, -31,-123, -77, -31,-121, +-127, -31,-124,-111, -31,-123, -77, -31,-121,-128, -31,-124,-111, -31,-123, -77, -31,-122, -65, -31, +-124,-111, -31,-123, -77, -31,-122, -66, -31,-124,-111, -31,-123, -77, -31,-122, -67, -31,-124,-111, + -31,-123, -77, -31,-122, -68, -31,-124,-111, -31,-123, -77, -31,-122, -69, -31,-124,-111, -31,-123, + -77, -31,-122, -70, -31,-124,-111, -31,-123, -77, -31,-122, -71, -31,-124,-111, -31,-123, -77, -31, +-122, -72, -31,-124,-111, -31,-123, -77, -31,-122, -73, -31,-124,-111, -31,-123, -77, -31,-122, -74, + -31,-124,-111, -31,-123, -77, -31,-122, -75, -31,-124,-111, -31,-123, -77, -31,-122, -76, -31,-124, +-111, -31,-123, -77, -31,-122, -77, -31,-124,-111, -31,-123, -77, -31,-122, -78, -31,-124,-111, -31, +-123, -77, -31,-122, -79, -31,-124,-111, -31,-123, -77, -31,-122, -80, -31,-124,-111, -31,-123, -77, + -31,-122, -81, -31,-124,-111, -31,-123, -77, -31,-122, -82, -31,-124,-111, -31,-123, -77, -31,-122, + -83, -31,-124,-111, -31,-123, -77, -31,-122, -84, -31,-124,-111, -31,-123, -77, -31,-122, -85, -31, +-124,-111, -31,-123, -77, -31,-122, -86, -31,-124,-111, -31,-123, -77, -31,-122, -87, -31,-124,-111, + -31,-123, -77, -31,-122, -88, -31,-124,-111, -31,-123, -78, -31,-121,-126, -31,-124,-111, -31,-123, + -78, -31,-121,-127, -31,-124,-111, -31,-123, -78, -31,-121,-128, -31,-124,-111, -31,-123, -78, -31, +-122, -65, -31,-124,-111, -31,-123, -78, -31,-122, -66, -31,-124,-111, -31,-123, -78, -31,-122, -67, + -31,-124,-111, -31,-123, -78, -31,-122, -68, -31,-124,-111, -31,-123, -78, -31,-122, -69, -31,-124, +-111, -31,-123, -78, -31,-122, -70, -31,-124,-111, -31,-123, -78, -31,-122, -71, -31,-124,-111, -31, +-123, -78, -31,-122, -72, -31,-124,-111, -31,-123, -78, -31,-122, -73, -31,-124,-111, -31,-123, -78, + -31,-122, -74, -31,-124,-111, -31,-123, -78, -31,-122, -75, -31,-124,-111, -31,-123, -78, -31,-122, + -76, -31,-124,-111, -31,-123, -78, -31,-122, -77, -31,-124,-111, -31,-123, -78, -31,-122, -78, -31, +-124,-111, -31,-123, -78, -31,-122, -79, -31,-124,-111, -31,-123, -78, -31,-122, -80, -31,-124,-111, + -31,-123, -78, -31,-122, -81, -31,-124,-111, -31,-123, -78, -31,-122, -82, -31,-124,-111, -31,-123, + -78, -31,-122, -83, -31,-124,-111, -31,-123, -78, -31,-122, -84, -31,-124,-111, -31,-123, -78, -31, +-122, -85, -31,-124,-111, -31,-123, -78, -31,-122, -86, -31,-124,-111, -31,-123, -78, -31,-122, -87, + -31,-124,-111, -31,-123, -78, -31,-122, -88, -31,-124,-111, -31,-123, -79, -31,-121,-126, -31,-124, +-111, -31,-123, -79, -31,-121,-127, -31,-124,-111, -31,-123, -79, -31,-121,-128, -31,-124,-111, -31, +-123, -79, -31,-122, -65, -31,-124,-111, -31,-123, -79, -31,-122, -66, -31,-124,-111, -31,-123, -79, + -31,-122, -67, -31,-124,-111, -31,-123, -79, -31,-122, -68, -31,-124,-111, -31,-123, -79, -31,-122, + -69, -31,-124,-111, -31,-123, -79, -31,-122, -70, -31,-124,-111, -31,-123, -79, -31,-122, -71, -31, +-124,-111, -31,-123, -79, -31,-122, -72, -31,-124,-111, -31,-123, -79, -31,-122, -73, -31,-124,-111, + -31,-123, -79, -31,-122, -74, -31,-124,-111, -31,-123, -79, -31,-122, -75, -31,-124,-111, -31,-123, + -79, -31,-122, -76, -31,-124,-111, -31,-123, -79, -31,-122, -77, -31,-124,-111, -31,-123, -79, -31, +-122, -78, -31,-124,-111, -31,-123, -79, -31,-122, -79, -31,-124,-111, -31,-123, -79, -31,-122, -80, + -31,-124,-111, -31,-123, -79, -31,-122, -81, -31,-124,-111, -31,-123, -79, -31,-122, -82, -31,-124, +-111, -31,-123, -79, -31,-122, -83, -31,-124,-111, -31,-123, -79, -31,-122, -84, -31,-124,-111, -31, +-123, -79, -31,-122, -85, -31,-124,-111, -31,-123, -79, -31,-122, -86, -31,-124,-111, -31,-123, -79, + -31,-122, -87, -31,-124,-111, -31,-123, -79, -31,-122, -88, -31,-124,-111, -31,-123, -80, -31,-121, +-126, -31,-124,-111, -31,-123, -80, -31,-121,-127, -31,-124,-111, -31,-123, -80, -31,-121,-128, -31, +-124,-111, -31,-123, -80, -31,-122, -65, -31,-124,-111, -31,-123, -80, -31,-122, -66, -31,-124,-111, + -31,-123, -80, -31,-122, -67, -31,-124,-111, -31,-123, -80, -31,-122, -68, -31,-124,-111, -31,-123, + -80, -31,-122, -69, -31,-124,-111, -31,-123, -80, -31,-122, -70, -31,-124,-111, -31,-123, -80, -31, +-122, -71, -31,-124,-111, -31,-123, -80, -31,-122, -72, -31,-124,-111, -31,-123, -80, -31,-122, -73, + -31,-124,-111, -31,-123, -80, -31,-122, -74, -31,-124,-111, -31,-123, -80, -31,-122, -75, -31,-124, +-111, -31,-123, -80, -31,-122, -76, -31,-124,-111, -31,-123, -80, -31,-122, -77, -31,-124,-111, -31, +-123, -80, -31,-122, -78, -31,-124,-111, -31,-123, -80, -31,-122, -79, -31,-124,-111, -31,-123, -80, + -31,-122, -80, -31,-124,-111, -31,-123, -80, -31,-122, -81, -31,-124,-111, -31,-123, -80, -31,-122, + -82, -31,-124,-111, -31,-123, -80, -31,-122, -83, -31,-124,-111, -31,-123, -80, -31,-122, -84, -31, +-124,-111, -31,-123, -80, -31,-122, -85, -31,-124,-111, -31,-123, -80, -31,-122, -86, -31,-124,-111, + -31,-123, -80, -31,-122, -87, -31,-124,-111, -31,-123, -80, -31,-122, -88, -31,-124,-111, -31,-123, + -81, -31,-121,-126, -31,-124,-111, -31,-123, -81, -31,-121,-127, -31,-124,-111, -31,-123, -81, -31, +-121,-128, -31,-124,-111, -31,-123, -81, -31,-122, -65, -31,-124,-111, -31,-123, -81, -31,-122, -66, + -31,-124,-111, -31,-123, -81, -31,-122, -67, -31,-124,-111, -31,-123, -81, -31,-122, -68, -31,-124, +-111, -31,-123, -81, -31,-122, -69, -31,-124,-111, -31,-123, -81, -31,-122, -70, -31,-124,-111, -31, +-123, -81, -31,-122, -71, -31,-124,-111, -31,-123, -81, -31,-122, -72, -31,-124,-111, -31,-123, -81, + -31,-122, -73, -31,-124,-111, -31,-123, -81, -31,-122, -74, -31,-124,-111, -31,-123, -81, -31,-122, + -75, -31,-124,-111, -31,-123, -81, -31,-122, -76, -31,-124,-111, -31,-123, -81, -31,-122, -77, -31, +-124,-111, -31,-123, -81, -31,-122, -78, -31,-124,-111, -31,-123, -81, -31,-122, -79, -31,-124,-111, + -31,-123, -81, -31,-122, -80, -31,-124,-111, -31,-123, -81, -31,-122, -81, -31,-124,-111, -31,-123, + -81, -31,-122, -82, -31,-124,-111, -31,-123, -81, -31,-122, -83, -31,-124,-111, -31,-123, -81, -31, +-122, -84, -31,-124,-111, -31,-123, -81, -31,-122, -85, -31,-124,-111, -31,-123, -81, -31,-122, -86, + -31,-124,-111, -31,-123, -81, -31,-122, -87, -31,-124,-111, -31,-123, -81, -31,-122, -88, -31,-124, +-111, -31,-123, -82, -31,-121,-126, -31,-124,-111, -31,-123, -82, -31,-121,-127, -31,-124,-111, -31, +-123, -82, -31,-121,-128, -31,-124,-111, -31,-123, -82, -31,-122, -65, -31,-124,-111, -31,-123, -82, + -31,-122, -66, -31,-124,-111, -31,-123, -82, -31,-122, -67, -31,-124,-111, -31,-123, -82, -31,-122, + -68, -31,-124,-111, -31,-123, -82, -31,-122, -69, -31,-124,-111, -31,-123, -82, -31,-122, -70, -31, +-124,-111, -31,-123, -82, -31,-122, -71, -31,-124,-111, -31,-123, -82, -31,-122, -72, -31,-124,-111, + -31,-123, -82, -31,-122, -73, -31,-124,-111, -31,-123, -82, -31,-122, -74, -31,-124,-111, -31,-123, + -82, -31,-122, -75, -31,-124,-111, -31,-123, -82, -31,-122, -76, -31,-124,-111, -31,-123, -82, -31, +-122, -77, -31,-124,-111, -31,-123, -82, -31,-122, -78, -31,-124,-111, -31,-123, -82, -31,-122, -79, + -31,-124,-111, -31,-123, -82, -31,-122, -80, -31,-124,-111, -31,-123, -82, -31,-122, -81, -31,-124, +-111, -31,-123, -82, -31,-122, -82, -31,-124,-111, -31,-123, -82, -31,-122, -83, -31,-124,-111, -31, +-123, -82, -31,-122, -84, -31,-124,-111, -31,-123, -82, -31,-122, -85, -31,-124,-111, -31,-123, -82, + -31,-122, -86, -31,-124,-111, -31,-123, -82, -31,-122, -87, -31,-124,-111, -31,-123, -82, -31,-122, + -88, -31,-124,-111, -31,-123, -83, -31,-121,-126, -31,-124,-111, -31,-123, -83, -31,-121,-127, -31, +-124,-111, -31,-123, -83, -31,-121,-128, -31,-124,-111, -31,-123, -83, -31,-122, -65, -31,-124,-111, + -31,-123, -83, -31,-122, -66, -31,-124,-111, -31,-123, -83, -31,-122, -67, -31,-124,-111, -31,-123, + -83, -31,-122, -68, -31,-124,-111, -31,-123, -83, -31,-122, -69, -31,-124,-111, -31,-123, -83, -31, +-122, -70, -31,-124,-111, -31,-123, -83, -31,-122, -71, -31,-124,-111, -31,-123, -83, -31,-122, -72, + -31,-124,-111, -31,-123, -83, -31,-122, -73, -31,-124,-111, -31,-123, -83, -31,-122, -74, -31,-124, +-111, -31,-123, -83, -31,-122, -75, -31,-124,-111, -31,-123, -83, -31,-122, -76, -31,-124,-111, -31, +-123, -83, -31,-122, -77, -31,-124,-111, -31,-123, -83, -31,-122, -78, -31,-124,-111, -31,-123, -83, + -31,-122, -79, -31,-124,-111, -31,-123, -83, -31,-122, -80, -31,-124,-111, -31,-123, -83, -31,-122, + -81, -31,-124,-111, -31,-123, -83, -31,-122, -82, -31,-124,-111, -31,-123, -83, -31,-122, -83, -31, +-124,-111, -31,-123, -83, -31,-122, -84, -31,-124,-111, -31,-123, -83, -31,-122, -85, -31,-124,-111, + -31,-123, -83, -31,-122, -86, -31,-124,-111, -31,-123, -83, -31,-122, -87, -31,-124,-111, -31,-123, + -83, -31,-122, -88, -31,-124,-111, -31,-123, -84, -31,-121,-126, -31,-124,-111, -31,-123, -84, -31, +-121,-127, -31,-124,-111, -31,-123, -84, -31,-121,-128, -31,-124,-111, -31,-123, -84, -31,-122, -65, + -31,-124,-111, -31,-123, -84, -31,-122, -66, -31,-124,-111, -31,-123, -84, -31,-122, -67, -31,-124, +-111, -31,-123, -84, -31,-122, -68, -31,-124,-111, -31,-123, -84, -31,-122, -69, -31,-124,-111, -31, +-123, -84, -31,-122, -70, -31,-124,-111, -31,-123, -84, -31,-122, -71, -31,-124,-111, -31,-123, -84, + -31,-122, -72, -31,-124,-111, -31,-123, -84, -31,-122, -73, -31,-124,-111, -31,-123, -84, -31,-122, + -74, -31,-124,-111, -31,-123, -84, -31,-122, -75, -31,-124,-111, -31,-123, -84, -31,-122, -76, -31, +-124,-111, -31,-123, -84, -31,-122, -77, -31,-124,-111, -31,-123, -84, -31,-122, -78, -31,-124,-111, + -31,-123, -84, -31,-122, -79, -31,-124,-111, -31,-123, -84, -31,-122, -80, -31,-124,-111, -31,-123, + -84, -31,-122, -81, -31,-124,-111, -31,-123, -84, -31,-122, -82, -31,-124,-111, -31,-123, -84, -31, +-122, -83, -31,-124,-111, -31,-123, -84, -31,-122, -84, -31,-124,-111, -31,-123, -84, -31,-122, -85, + -31,-124,-111, -31,-123, -84, -31,-122, -86, -31,-124,-111, -31,-123, -84, -31,-122, -87, -31,-124, +-111, -31,-123, -84, -31,-122, -88, -31,-124,-111, -31,-123, -85, -31,-121,-126, -31,-124,-111, -31, +-123, -85, -31,-121,-127, -31,-124,-111, -31,-123, -85, -31,-121,-128, -31,-124,-111, -31,-123, -85, + -31,-122, -65, -31,-124,-111, -31,-123, -85, -31,-122, -66, -31,-124,-111, -31,-123, -85, -31,-122, + -67, -31,-124,-111, -31,-123, -85, -31,-122, -68, -31,-124,-111, -31,-123, -85, -31,-122, -69, -31, +-124,-111, -31,-123, -85, -31,-122, -70, -31,-124,-111, -31,-123, -85, -31,-122, -71, -31,-124,-111, + -31,-123, -85, -31,-122, -72, -31,-124,-111, -31,-123, -85, -31,-122, -73, -31,-124,-111, -31,-123, + -85, -31,-122, -74, -31,-124,-111, -31,-123, -85, -31,-122, -75, -31,-124,-111, -31,-123, -85, -31, +-122, -76, -31,-124,-111, -31,-123, -85, -31,-122, -77, -31,-124,-111, -31,-123, -85, -31,-122, -78, + -31,-124,-111, -31,-123, -85, -31,-122, -79, -31,-124,-111, -31,-123, -85, -31,-122, -80, -31,-124, +-111, -31,-123, -85, -31,-122, -81, -31,-124,-111, -31,-123, -85, -31,-122, -82, -31,-124,-111, -31, +-123, -85, -31,-122, -83, -31,-124,-111, -31,-123, -85, -31,-122, -84, -31,-124,-111, -31,-123, -85, + -31,-122, -85, -31,-124,-111, -31,-123, -85, -31,-122, -86, -31,-124,-111, -31,-123, -85, -31,-122, + -87, -31,-124,-111, -31,-123, -85, -31,-122, -88, -31,-124,-111, -31,-123, -86, -31,-121,-126, -31, +-124,-111, -31,-123, -86, -31,-121,-127, -31,-124,-111, -31,-123, -86, -31,-121,-128, -31,-124,-111, + -31,-123, -86, -31,-122, -65, -31,-124,-111, -31,-123, -86, -31,-122, -66, -31,-124,-111, -31,-123, + -86, -31,-122, -67, -31,-124,-111, -31,-123, -86, -31,-122, -68, -31,-124,-111, -31,-123, -86, -31, +-122, -69, -31,-124,-111, -31,-123, -86, -31,-122, -70, -31,-124,-111, -31,-123, -86, -31,-122, -71, + -31,-124,-111, -31,-123, -86, -31,-122, -72, -31,-124,-111, -31,-123, -86, -31,-122, -73, -31,-124, +-111, -31,-123, -86, -31,-122, -74, -31,-124,-111, -31,-123, -86, -31,-122, -75, -31,-124,-111, -31, +-123, -86, -31,-122, -76, -31,-124,-111, -31,-123, -86, -31,-122, -77, -31,-124,-111, -31,-123, -86, + -31,-122, -78, -31,-124,-111, -31,-123, -86, -31,-122, -79, -31,-124,-111, -31,-123, -86, -31,-122, + -80, -31,-124,-111, -31,-123, -86, -31,-122, -81, -31,-124,-111, -31,-123, -86, -31,-122, -82, -31, +-124,-111, -31,-123, -86, -31,-122, -83, -31,-124,-111, -31,-123, -86, -31,-122, -84, -31,-124,-111, + -31,-123, -86, -31,-122, -85, -31,-124,-111, -31,-123, -86, -31,-122, -86, -31,-124,-111, -31,-123, + -86, -31,-122, -87, -31,-124,-111, -31,-123, -86, -31,-122, -88, -31,-124,-111, -31,-123, -87, -31, +-121,-126, -31,-124,-111, -31,-123, -87, -31,-121,-127, -31,-124,-111, -31,-123, -87, -31,-121,-128, + -31,-124,-111, -31,-123, -87, -31,-122, -65, -31,-124,-111, -31,-123, -87, -31,-122, -66, -31,-124, +-111, -31,-123, -87, -31,-122, -67, -31,-124,-111, -31,-123, -87, -31,-122, -68, -31,-124,-111, -31, +-123, -87, -31,-122, -69, -31,-124,-111, -31,-123, -87, -31,-122, -70, -31,-124,-111, -31,-123, -87, + -31,-122, -71, -31,-124,-111, -31,-123, -87, -31,-122, -72, -31,-124,-111, -31,-123, -87, -31,-122, + -73, -31,-124,-111, -31,-123, -87, -31,-122, -74, -31,-124,-111, -31,-123, -87, -31,-122, -75, -31, +-124,-111, -31,-123, -87, -31,-122, -76, -31,-124,-111, -31,-123, -87, -31,-122, -77, -31,-124,-111, + -31,-123, -87, -31,-122, -78, -31,-124,-111, -31,-123, -87, -31,-122, -79, -31,-124,-111, -31,-123, + -87, -31,-122, -80, -31,-124,-111, -31,-123, -87, -31,-122, -81, -31,-124,-111, -31,-123, -87, -31, +-122, -82, -31,-124,-111, -31,-123, -87, -31,-122, -83, -31,-124,-111, -31,-123, -87, -31,-122, -84, + -31,-124,-111, -31,-123, -87, -31,-122, -85, -31,-124,-111, -31,-123, -87, -31,-122, -86, -31,-124, +-111, -31,-123, -87, -31,-122, -87, -31,-124,-111, -31,-123, -87, -31,-122, -88, -31,-124,-111, -31, +-123, -88, -31,-121,-126, -31,-124,-111, -31,-123, -88, -31,-121,-127, -31,-124,-111, -31,-123, -88, + -31,-121,-128, -31,-124,-111, -31,-123, -88, -31,-122, -65, -31,-124,-111, -31,-123, -88, -31,-122, + -66, -31,-124,-111, -31,-123, -88, -31,-122, -67, -31,-124,-111, -31,-123, -88, -31,-122, -68, -31, +-124,-111, -31,-123, -88, -31,-122, -69, -31,-124,-111, -31,-123, -88, -31,-122, -70, -31,-124,-111, + -31,-123, -88, -31,-122, -71, -31,-124,-111, -31,-123, -88, -31,-122, -72, -31,-124,-111, -31,-123, + -88, -31,-122, -73, -31,-124,-111, -31,-123, -88, -31,-122, -74, -31,-124,-111, -31,-123, -88, -31, +-122, -75, -31,-124,-111, -31,-123, -88, -31,-122, -76, -31,-124,-111, -31,-123, -88, -31,-122, -77, + -31,-124,-111, -31,-123, -88, -31,-122, -78, -31,-124,-111, -31,-123, -88, -31,-122, -79, -31,-124, +-111, -31,-123, -88, -31,-122, -80, -31,-124,-111, -31,-123, -88, -31,-122, -81, -31,-124,-111, -31, +-123, -88, -31,-122, -82, -31,-124,-111, -31,-123, -88, -31,-122, -83, -31,-124,-111, -31,-123, -88, + -31,-122, -84, -31,-124,-111, -31,-123, -88, -31,-122, -85, -31,-124,-111, -31,-123, -88, -31,-122, + -86, -31,-124,-111, -31,-123, -88, -31,-122, -87, -31,-124,-111, -31,-123, -88, -31,-122, -88, -31, +-124,-111, -31,-123, -89, -31,-121,-126, -31,-124,-111, -31,-123, -89, -31,-121,-127, -31,-124,-111, + -31,-123, -89, -31,-121,-128, -31,-124,-111, -31,-123, -89, -31,-122, -65, -31,-124,-111, -31,-123, + -89, -31,-122, -66, -31,-124,-111, -31,-123, -89, -31,-122, -67, -31,-124,-111, -31,-123, -89, -31, +-122, -68, -31,-124,-111, -31,-123, -89, -31,-122, -69, -31,-124,-111, -31,-123, -89, -31,-122, -70, + -31,-124,-111, -31,-123, -89, -31,-122, -71, -31,-124,-111, -31,-123, -89, -31,-122, -72, -31,-124, +-111, -31,-123, -89, -31,-122, -73, -31,-124,-111, -31,-123, -89, -31,-122, -74, -31,-124,-111, -31, +-123, -89, -31,-122, -75, -31,-124,-111, -31,-123, -89, -31,-122, -76, -31,-124,-111, -31,-123, -89, + -31,-122, -77, -31,-124,-111, -31,-123, -89, -31,-122, -78, -31,-124,-111, -31,-123, -89, -31,-122, + -79, -31,-124,-111, -31,-123, -89, -31,-122, -80, -31,-124,-111, -31,-123, -89, -31,-122, -81, -31, +-124,-111, -31,-123, -89, -31,-122, -82, -31,-124,-111, -31,-123, -89, -31,-122, -83, -31,-124,-111, + -31,-123, -89, -31,-122, -84, -31,-124,-111, -31,-123, -89, -31,-122, -85, -31,-124,-111, -31,-123, + -89, -31,-122, -86, -31,-124,-111, -31,-123, -89, -31,-122, -87, -31,-124,-111, -31,-123, -89, -31, +-122, -88, -31,-124,-111, -31,-123, -90, -31,-121,-126, -31,-124,-111, -31,-123, -90, -31,-121,-127, + -31,-124,-111, -31,-123, -90, -31,-121,-128, -31,-124,-111, -31,-123, -90, -31,-122, -65, -31,-124, +-111, -31,-123, -90, -31,-122, -66, -31,-124,-111, -31,-123, -90, -31,-122, -67, -31,-124,-111, -31, +-123, -90, -31,-122, -68, -31,-124,-111, -31,-123, -90, -31,-122, -69, -31,-124,-111, -31,-123, -90, + -31,-122, -70, -31,-124,-111, -31,-123, -90, -31,-122, -71, -31,-124,-111, -31,-123, -90, -31,-122, + -72, -31,-124,-111, -31,-123, -90, -31,-122, -73, -31,-124,-111, -31,-123, -90, -31,-122, -74, -31, +-124,-111, -31,-123, -90, -31,-122, -75, -31,-124,-111, -31,-123, -90, -31,-122, -76, -31,-124,-111, + -31,-123, -90, -31,-122, -77, -31,-124,-111, -31,-123, -90, -31,-122, -78, -31,-124,-111, -31,-123, + -90, -31,-122, -79, -31,-124,-111, -31,-123, -90, -31,-122, -80, -31,-124,-111, -31,-123, -90, -31, +-122, -81, -31,-124,-111, -31,-123, -90, -31,-122, -82, -31,-124,-111, -31,-123, -90, -31,-122, -83, + -31,-124,-111, -31,-123, -90, -31,-122, -84, -31,-124,-111, -31,-123, -90, -31,-122, -85, -31,-124, +-111, -31,-123, -90, -31,-122, -86, -31,-124,-111, -31,-123, -90, -31,-122, -87, -31,-124,-111, -31, +-123, -90, -31,-122, -88, -31,-124,-111, -31,-123, -91, -31,-121,-126, -31,-124,-111, -31,-123, -91, + -31,-121,-127, -31,-124,-111, -31,-123, -91, -31,-121,-128, -31,-124,-111, -31,-123, -91, -31,-122, + -65, -31,-124,-111, -31,-123, -91, -31,-122, -66, -31,-124,-111, -31,-123, -91, -31,-122, -67, -31, +-124,-111, -31,-123, -91, -31,-122, -68, -31,-124,-111, -31,-123, -91, -31,-122, -69, -31,-124,-111, + -31,-123, -91, -31,-122, -70, -31,-124,-111, -31,-123, -91, -31,-122, -71, -31,-124,-111, -31,-123, + -91, -31,-122, -72, -31,-124,-111, -31,-123, -91, -31,-122, -73, -31,-124,-111, -31,-123, -91, -31, +-122, -74, -31,-124,-111, -31,-123, -91, -31,-122, -75, -31,-124,-111, -31,-123, -91, -31,-122, -76, + -31,-124,-111, -31,-123, -91, -31,-122, -77, -31,-124,-111, -31,-123, -91, -31,-122, -78, -31,-124, +-111, -31,-123, -91, -31,-122, -79, -31,-124,-111, -31,-123, -91, -31,-122, -80, -31,-124,-111, -31, +-123, -91, -31,-122, -81, -31,-124,-111, -31,-123, -91, -31,-122, -82, -31,-124,-111, -31,-123, -91, + -31,-122, -83, -31,-124,-111, -31,-123, -91, -31,-122, -84, -31,-124,-111, -31,-123, -91, -31,-122, + -85, -31,-124,-111, -31,-123, -91, -31,-122, -86, -31,-124,-111, -31,-123, -91, -31,-122, -87, -31, +-124,-111, -31,-123, -91, -31,-122, -88, -31,-124,-111, -31,-123, -92, -31,-121,-126, -31,-124,-111, + -31,-123, -92, -31,-121,-127, -31,-124,-111, -31,-123, -92, -31,-121,-128, -31,-124,-111, -31,-123, + -92, -31,-122, -65, -31,-124,-111, -31,-123, -92, -31,-122, -66, -31,-124,-111, -31,-123, -92, -31, +-122, -67, -31,-124,-111, -31,-123, -92, -31,-122, -68, -31,-124,-111, -31,-123, -92, -31,-122, -69, + -31,-124,-111, -31,-123, -92, -31,-122, -70, -31,-124,-111, -31,-123, -92, -31,-122, -71, -31,-124, +-111, -31,-123, -92, -31,-122, -72, -31,-124,-111, -31,-123, -92, -31,-122, -73, -31,-124,-111, -31, +-123, -92, -31,-122, -74, -31,-124,-111, -31,-123, -92, -31,-122, -75, -31,-124,-111, -31,-123, -92, + -31,-122, -76, -31,-124,-111, -31,-123, -92, -31,-122, -77, -31,-124,-111, -31,-123, -92, -31,-122, + -78, -31,-124,-111, -31,-123, -92, -31,-122, -79, -31,-124,-111, -31,-123, -92, -31,-122, -80, -31, +-124,-111, -31,-123, -92, -31,-122, -81, -31,-124,-111, -31,-123, -92, -31,-122, -82, -31,-124,-111, + -31,-123, -92, -31,-122, -83, -31,-124,-111, -31,-123, -92, -31,-122, -84, -31,-124,-111, -31,-123, + -92, -31,-122, -85, -31,-124,-111, -31,-123, -92, -31,-122, -86, -31,-124,-111, -31,-123, -92, -31, +-122, -87, -31,-124,-111, -31,-123, -92, -31,-122, -88, -31,-124,-111, -31,-123, -93, -31,-121,-126, + -31,-124,-111, -31,-123, -93, -31,-121,-127, -31,-124,-111, -31,-123, -93, -31,-121,-128, -31,-124, +-111, -31,-123, -93, -31,-122, -65, -31,-124,-111, -31,-123, -93, -31,-122, -66, -31,-124,-111, -31, +-123, -93, -31,-122, -67, -31,-124,-111, -31,-123, -93, -31,-122, -68, -31,-124,-111, -31,-123, -93, + -31,-122, -69, -31,-124,-111, -31,-123, -93, -31,-122, -70, -31,-124,-111, -31,-123, -93, -31,-122, + -71, -31,-124,-111, -31,-123, -93, -31,-122, -72, -31,-124,-111, -31,-123, -93, -31,-122, -73, -31, +-124,-111, -31,-123, -93, -31,-122, -74, -31,-124,-111, -31,-123, -93, -31,-122, -75, -31,-124,-111, + -31,-123, -93, -31,-122, -76, -31,-124,-111, -31,-123, -93, -31,-122, -77, -31,-124,-111, -31,-123, + -93, -31,-122, -78, -31,-124,-111, -31,-123, -93, -31,-122, -79, -31,-124,-111, -31,-123, -93, -31, +-122, -80, -31,-124,-111, -31,-123, -93, -31,-122, -81, -31,-124,-111, -31,-123, -93, -31,-122, -82, + -31,-124,-111, -31,-123, -93, -31,-122, -83, -31,-124,-111, -31,-123, -93, -31,-122, -84, -31,-124, +-111, -31,-123, -93, -31,-122, -85, -31,-124,-111, -31,-123, -93, -31,-122, -86, -31,-124,-111, -31, +-123, -93, -31,-122, -87, -31,-124,-111, -31,-123, -93, -31,-122, -88, -31,-124,-111, -31,-123, -94, + -31,-121,-126, -31,-124,-111, -31,-123, -94, -31,-121,-127, -31,-124,-111, -31,-123, -94, -31,-121, +-128, -31,-124,-111, -31,-123, -94, -31,-122, -65, -31,-124,-111, -31,-123, -94, -31,-122, -66, -31, +-124,-111, -31,-123, -94, -31,-122, -67, -31,-124,-111, -31,-123, -94, -31,-122, -68, -31,-124,-111, + -31,-123, -94, -31,-122, -69, -31,-124,-111, -31,-123, -94, -31,-122, -70, -31,-124,-111, -31,-123, + -94, -31,-122, -71, -31,-124,-111, -31,-123, -94, -31,-122, -72, -31,-124,-111, -31,-123, -94, -31, +-122, -73, -31,-124,-111, -31,-123, -94, -31,-122, -74, -31,-124,-111, -31,-123, -94, -31,-122, -75, + -31,-124,-111, -31,-123, -94, -31,-122, -76, -31,-124,-111, -31,-123, -94, -31,-122, -77, -31,-124, +-111, -31,-123, -94, -31,-122, -78, -31,-124,-111, -31,-123, -94, -31,-122, -79, -31,-124,-111, -31, +-123, -94, -31,-122, -80, -31,-124,-111, -31,-123, -94, -31,-122, -81, -31,-124,-111, -31,-123, -94, + -31,-122, -82, -31,-124,-111, -31,-123, -94, -31,-122, -83, -31,-124,-111, -31,-123, -94, -31,-122, + -84, -31,-124,-111, -31,-123, -94, -31,-122, -85, -31,-124,-111, -31,-123, -94, -31,-122, -86, -31, +-124,-111, -31,-123, -94, -31,-122, -87, -31,-124,-111, -31,-123, -94, -31,-122, -88, -31,-124,-111, + -31,-123, -95, -31,-121,-126, -31,-124,-111, -31,-123, -95, -31,-121,-127, -31,-124,-111, -31,-123, + -95, -31,-121,-128, -31,-124,-111, -31,-123, -95, -31,-122, -65, -31,-124,-111, -31,-123, -95, -31, +-122, -66, -31,-124,-111, -31,-123, -95, -31,-122, -67, -31,-124,-111, -31,-123, -95, -31,-122, -68, + -31,-124,-111, -31,-123, -95, -31,-122, -69, -31,-124,-111, -31,-123, -95, -31,-122, -70, -31,-124, +-111, -31,-123, -95, -31,-122, -71, -31,-124,-111, -31,-123, -95, -31,-122, -72, -31,-124,-111, -31, +-123, -95, -31,-122, -73, -31,-124,-111, -31,-123, -95, -31,-122, -74, -31,-124,-111, -31,-123, -95, + -31,-122, -75, -31,-124,-111, -31,-123, -95, -31,-122, -76, -31,-124,-111, -31,-123, -95, -31,-122, + -77, -31,-124,-111, -31,-123, -95, -31,-122, -78, -31,-124,-111, -31,-123, -95, -31,-122, -79, -31, +-124,-111, -31,-123, -95, -31,-122, -80, -31,-124,-111, -31,-123, -95, -31,-122, -81, -31,-124,-111, + -31,-123, -95, -31,-122, -82, -31,-124,-111, -31,-123, -95, -31,-122, -83, -31,-124,-111, -31,-123, + -95, -31,-122, -84, -31,-124,-111, -31,-123, -95, -31,-122, -85, -31,-124,-111, -31,-123, -95, -31, +-122, -86, -31,-124,-111, -31,-123, -95, -31,-122, -87, -31,-124,-111, -31,-123, -95, -31,-122, -88, + -31,-124,-112, -31,-123, -75, -31,-121,-126, -31,-124,-112, -31,-123, -75, -31,-121,-127, -31,-124, +-112, -31,-123, -75, -31,-121,-128, -31,-124,-112, -31,-123, -75, -31,-122, -65, -31,-124,-112, -31, +-123, -75, -31,-122, -66, -31,-124,-112, -31,-123, -75, -31,-122, -67, -31,-124,-112, -31,-123, -75, + -31,-122, -68, -31,-124,-112, -31,-123, -75, -31,-122, -69, -31,-124,-112, -31,-123, -75, -31,-122, + -70, -31,-124,-112, -31,-123, -75, -31,-122, -71, -31,-124,-112, -31,-123, -75, -31,-122, -72, -31, +-124,-112, -31,-123, -75, -31,-122, -73, -31,-124,-112, -31,-123, -75, -31,-122, -74, -31,-124,-112, + -31,-123, -75, -31,-122, -75, -31,-124,-112, -31,-123, -75, -31,-122, -76, -31,-124,-112, -31,-123, + -75, -31,-122, -77, -31,-124,-112, -31,-123, -75, -31,-122, -78, -31,-124,-112, -31,-123, -75, -31, +-122, -79, -31,-124,-112, -31,-123, -75, -31,-122, -80, -31,-124,-112, -31,-123, -75, -31,-122, -81, + -31,-124,-112, -31,-123, -75, -31,-122, -82, -31,-124,-112, -31,-123, -75, -31,-122, -83, -31,-124, +-112, -31,-123, -75, -31,-122, -84, -31,-124,-112, -31,-123, -75, -31,-122, -85, -31,-124,-112, -31, +-123, -75, -31,-122, -86, -31,-124,-112, -31,-123, -75, -31,-122, -87, -31,-124,-112, -31,-123, -75, + -31,-122, -88, -31,-124,-112, -31,-123, -76, -31,-121,-126, -31,-124,-112, -31,-123, -76, -31,-121, +-127, -31,-124,-112, -31,-123, -76, -31,-121,-128, -31,-124,-112, -31,-123, -76, -31,-122, -65, -31, +-124,-112, -31,-123, -76, -31,-122, -66, -31,-124,-112, -31,-123, -76, -31,-122, -67, -31,-124,-112, + -31,-123, -76, -31,-122, -68, -31,-124,-112, -31,-123, -76, -31,-122, -69, -31,-124,-112, -31,-123, + -76, -31,-122, -70, -31,-124,-112, -31,-123, -76, -31,-122, -71, -31,-124,-112, -31,-123, -76, -31, +-122, -72, -31,-124,-112, -31,-123, -76, -31,-122, -73, -31,-124,-112, -31,-123, -76, -31,-122, -74, + -31,-124,-112, -31,-123, -76, -31,-122, -75, -31,-124,-112, -31,-123, -76, -31,-122, -76, -31,-124, +-112, -31,-123, -76, -31,-122, -77, -31,-124,-112, -31,-123, -76, -31,-122, -78, -31,-124,-112, -31, +-123, -76, -31,-122, -79, -31,-124,-112, -31,-123, -76, -31,-122, -80, -31,-124,-112, -31,-123, -76, + -31,-122, -81, -31,-124,-112, -31,-123, -76, -31,-122, -82, -31,-124,-112, -31,-123, -76, -31,-122, + -83, -31,-124,-112, -31,-123, -76, -31,-122, -84, -31,-124,-112, -31,-123, -76, -31,-122, -85, -31, +-124,-112, -31,-123, -76, -31,-122, -86, -31,-124,-112, -31,-123, -76, -31,-122, -87, -31,-124,-112, + -31,-123, -76, -31,-122, -88, -31,-124,-112, -31,-123, -77, -31,-121,-126, -31,-124,-112, -31,-123, + -77, -31,-121,-127, -31,-124,-112, -31,-123, -77, -31,-121,-128, -31,-124,-112, -31,-123, -77, -31, +-122, -65, -31,-124,-112, -31,-123, -77, -31,-122, -66, -31,-124,-112, -31,-123, -77, -31,-122, -67, + -31,-124,-112, -31,-123, -77, -31,-122, -68, -31,-124,-112, -31,-123, -77, -31,-122, -69, -31,-124, +-112, -31,-123, -77, -31,-122, -70, -31,-124,-112, -31,-123, -77, -31,-122, -71, -31,-124,-112, -31, +-123, -77, -31,-122, -72, -31,-124,-112, -31,-123, -77, -31,-122, -73, -31,-124,-112, -31,-123, -77, + -31,-122, -74, -31,-124,-112, -31,-123, -77, -31,-122, -75, -31,-124,-112, -31,-123, -77, -31,-122, + -76, -31,-124,-112, -31,-123, -77, -31,-122, -77, -31,-124,-112, -31,-123, -77, -31,-122, -78, -31, +-124,-112, -31,-123, -77, -31,-122, -79, -31,-124,-112, -31,-123, -77, -31,-122, -80, -31,-124,-112, + -31,-123, -77, -31,-122, -81, -31,-124,-112, -31,-123, -77, -31,-122, -82, -31,-124,-112, -31,-123, + -77, -31,-122, -83, -31,-124,-112, -31,-123, -77, -31,-122, -84, -31,-124,-112, -31,-123, -77, -31, +-122, -85, -31,-124,-112, -31,-123, -77, -31,-122, -86, -31,-124,-112, -31,-123, -77, -31,-122, -87, + -31,-124,-112, -31,-123, -77, -31,-122, -88, -31,-124,-112, -31,-123, -78, -31,-121,-126, -31,-124, +-112, -31,-123, -78, -31,-121,-127, -31,-124,-112, -31,-123, -78, -31,-121,-128, -31,-124,-112, -31, +-123, -78, -31,-122, -65, -31,-124,-112, -31,-123, -78, -31,-122, -66, -31,-124,-112, -31,-123, -78, + -31,-122, -67, -31,-124,-112, -31,-123, -78, -31,-122, -68, -31,-124,-112, -31,-123, -78, -31,-122, + -69, -31,-124,-112, -31,-123, -78, -31,-122, -70, -31,-124,-112, -31,-123, -78, -31,-122, -71, -31, +-124,-112, -31,-123, -78, -31,-122, -72, -31,-124,-112, -31,-123, -78, -31,-122, -73, -31,-124,-112, + -31,-123, -78, -31,-122, -74, -31,-124,-112, -31,-123, -78, -31,-122, -75, -31,-124,-112, -31,-123, + -78, -31,-122, -76, -31,-124,-112, -31,-123, -78, -31,-122, -77, -31,-124,-112, -31,-123, -78, -31, +-122, -78, -31,-124,-112, -31,-123, -78, -31,-122, -79, -31,-124,-112, -31,-123, -78, -31,-122, -80, + -31,-124,-112, -31,-123, -78, -31,-122, -81, -31,-124,-112, -31,-123, -78, -31,-122, -82, -31,-124, +-112, -31,-123, -78, -31,-122, -83, -31,-124,-112, -31,-123, -78, -31,-122, -84, -31,-124,-112, -31, +-123, -78, -31,-122, -85, -31,-124,-112, -31,-123, -78, -31,-122, -86, -31,-124,-112, -31,-123, -78, + -31,-122, -87, -31,-124,-112, -31,-123, -78, -31,-122, -88, -31,-124,-112, -31,-123, -79, -31,-121, +-126, -31,-124,-112, -31,-123, -79, -31,-121,-127, -31,-124,-112, -31,-123, -79, -31,-121,-128, -31, +-124,-112, -31,-123, -79, -31,-122, -65, -31,-124,-112, -31,-123, -79, -31,-122, -66, -31,-124,-112, + -31,-123, -79, -31,-122, -67, -31,-124,-112, -31,-123, -79, -31,-122, -68, -31,-124,-112, -31,-123, + -79, -31,-122, -69, -31,-124,-112, -31,-123, -79, -31,-122, -70, -31,-124,-112, -31,-123, -79, -31, +-122, -71, -31,-124,-112, -31,-123, -79, -31,-122, -72, -31,-124,-112, -31,-123, -79, -31,-122, -73, + -31,-124,-112, -31,-123, -79, -31,-122, -74, -31,-124,-112, -31,-123, -79, -31,-122, -75, -31,-124, +-112, -31,-123, -79, -31,-122, -76, -31,-124,-112, -31,-123, -79, -31,-122, -77, -31,-124,-112, -31, +-123, -79, -31,-122, -78, -31,-124,-112, -31,-123, -79, -31,-122, -79, -31,-124,-112, -31,-123, -79, + -31,-122, -80, -31,-124,-112, -31,-123, -79, -31,-122, -81, -31,-124,-112, -31,-123, -79, -31,-122, + -82, -31,-124,-112, -31,-123, -79, -31,-122, -83, -31,-124,-112, -31,-123, -79, -31,-122, -84, -31, +-124,-112, -31,-123, -79, -31,-122, -85, -31,-124,-112, -31,-123, -79, -31,-122, -86, -31,-124,-112, + -31,-123, -79, -31,-122, -87, -31,-124,-112, -31,-123, -79, -31,-122, -88, -31,-124,-112, -31,-123, + -80, -31,-121,-126, -31,-124,-112, -31,-123, -80, -31,-121,-127, -31,-124,-112, -31,-123, -80, -31, +-121,-128, -31,-124,-112, -31,-123, -80, -31,-122, -65, -31,-124,-112, -31,-123, -80, -31,-122, -66, + -31,-124,-112, -31,-123, -80, -31,-122, -67, -31,-124,-112, -31,-123, -80, -31,-122, -68, -31,-124, +-112, -31,-123, -80, -31,-122, -69, -31,-124,-112, -31,-123, -80, -31,-122, -70, -31,-124,-112, -31, +-123, -80, -31,-122, -71, -31,-124,-112, -31,-123, -80, -31,-122, -72, -31,-124,-112, -31,-123, -80, + -31,-122, -73, -31,-124,-112, -31,-123, -80, -31,-122, -74, -31,-124,-112, -31,-123, -80, -31,-122, + -75, -31,-124,-112, -31,-123, -80, -31,-122, -76, -31,-124,-112, -31,-123, -80, -31,-122, -77, -31, +-124,-112, -31,-123, -80, -31,-122, -78, -31,-124,-112, -31,-123, -80, -31,-122, -79, -31,-124,-112, + -31,-123, -80, -31,-122, -80, -31,-124,-112, -31,-123, -80, -31,-122, -81, -31,-124,-112, -31,-123, + -80, -31,-122, -82, -31,-124,-112, -31,-123, -80, -31,-122, -83, -31,-124,-112, -31,-123, -80, -31, +-122, -84, -31,-124,-112, -31,-123, -80, -31,-122, -85, -31,-124,-112, -31,-123, -80, -31,-122, -86, + -31,-124,-112, -31,-123, -80, -31,-122, -87, -31,-124,-112, -31,-123, -80, -31,-122, -88, -31,-124, +-112, -31,-123, -81, -31,-121,-126, -31,-124,-112, -31,-123, -81, -31,-121,-127, -31,-124,-112, -31, +-123, -81, -31,-121,-128, -31,-124,-112, -31,-123, -81, -31,-122, -65, -31,-124,-112, -31,-123, -81, + -31,-122, -66, -31,-124,-112, -31,-123, -81, -31,-122, -67, -31,-124,-112, -31,-123, -81, -31,-122, + -68, -31,-124,-112, -31,-123, -81, -31,-122, -69, -31,-124,-112, -31,-123, -81, -31,-122, -70, -31, +-124,-112, -31,-123, -81, -31,-122, -71, -31,-124,-112, -31,-123, -81, -31,-122, -72, -31,-124,-112, + -31,-123, -81, -31,-122, -73, -31,-124,-112, -31,-123, -81, -31,-122, -74, -31,-124,-112, -31,-123, + -81, -31,-122, -75, -31,-124,-112, -31,-123, -81, -31,-122, -76, -31,-124,-112, -31,-123, -81, -31, +-122, -77, -31,-124,-112, -31,-123, -81, -31,-122, -78, -31,-124,-112, -31,-123, -81, -31,-122, -79, + -31,-124,-112, -31,-123, -81, -31,-122, -80, -31,-124,-112, -31,-123, -81, -31,-122, -81, -31,-124, +-112, -31,-123, -81, -31,-122, -82, -31,-124,-112, -31,-123, -81, -31,-122, -83, -31,-124,-112, -31, +-123, -81, -31,-122, -84, -31,-124,-112, -31,-123, -81, -31,-122, -85, -31,-124,-112, -31,-123, -81, + -31,-122, -86, -31,-124,-112, -31,-123, -81, -31,-122, -87, -31,-124,-112, -31,-123, -81, -31,-122, + -88, -31,-124,-112, -31,-123, -82, -31,-121,-126, -31,-124,-112, -31,-123, -82, -31,-121,-127, -31, +-124,-112, -31,-123, -82, -31,-121,-128, -31,-124,-112, -31,-123, -82, -31,-122, -65, -31,-124,-112, + -31,-123, -82, -31,-122, -66, -31,-124,-112, -31,-123, -82, -31,-122, -67, -31,-124,-112, -31,-123, + -82, -31,-122, -68, -31,-124,-112, -31,-123, -82, -31,-122, -69, -31,-124,-112, -31,-123, -82, -31, +-122, -70, -31,-124,-112, -31,-123, -82, -31,-122, -71, -31,-124,-112, -31,-123, -82, -31,-122, -72, + -31,-124,-112, -31,-123, -82, -31,-122, -73, -31,-124,-112, -31,-123, -82, -31,-122, -74, -31,-124, +-112, -31,-123, -82, -31,-122, -75, -31,-124,-112, -31,-123, -82, -31,-122, -76, -31,-124,-112, -31, +-123, -82, -31,-122, -77, -31,-124,-112, -31,-123, -82, -31,-122, -78, -31,-124,-112, -31,-123, -82, + -31,-122, -79, -31,-124,-112, -31,-123, -82, -31,-122, -80, -31,-124,-112, -31,-123, -82, -31,-122, + -81, -31,-124,-112, -31,-123, -82, -31,-122, -82, -31,-124,-112, -31,-123, -82, -31,-122, -83, -31, +-124,-112, -31,-123, -82, -31,-122, -84, -31,-124,-112, -31,-123, -82, -31,-122, -85, -31,-124,-112, + -31,-123, -82, -31,-122, -86, -31,-124,-112, -31,-123, -82, -31,-122, -87, -31,-124,-112, -31,-123, + -82, -31,-122, -88, -31,-124,-112, -31,-123, -83, -31,-121,-126, -31,-124,-112, -31,-123, -83, -31, +-121,-127, -31,-124,-112, -31,-123, -83, -31,-121,-128, -31,-124,-112, -31,-123, -83, -31,-122, -65, + -31,-124,-112, -31,-123, -83, -31,-122, -66, -31,-124,-112, -31,-123, -83, -31,-122, -67, -31,-124, +-112, -31,-123, -83, -31,-122, -68, -31,-124,-112, -31,-123, -83, -31,-122, -69, -31,-124,-112, -31, +-123, -83, -31,-122, -70, -31,-124,-112, -31,-123, -83, -31,-122, -71, -31,-124,-112, -31,-123, -83, + -31,-122, -72, -31,-124,-112, -31,-123, -83, -31,-122, -73, -31,-124,-112, -31,-123, -83, -31,-122, + -74, -31,-124,-112, -31,-123, -83, -31,-122, -75, -31,-124,-112, -31,-123, -83, -31,-122, -76, -31, +-124,-112, -31,-123, -83, -31,-122, -77, -31,-124,-112, -31,-123, -83, -31,-122, -78, -31,-124,-112, + -31,-123, -83, -31,-122, -79, -31,-124,-112, -31,-123, -83, -31,-122, -80, -31,-124,-112, -31,-123, + -83, -31,-122, -81, -31,-124,-112, -31,-123, -83, -31,-122, -82, -31,-124,-112, -31,-123, -83, -31, +-122, -83, -31,-124,-112, -31,-123, -83, -31,-122, -84, -31,-124,-112, -31,-123, -83, -31,-122, -85, + -31,-124,-112, -31,-123, -83, -31,-122, -86, -31,-124,-112, -31,-123, -83, -31,-122, -87, -31,-124, +-112, -31,-123, -83, -31,-122, -88, -31,-124,-112, -31,-123, -84, -31,-121,-126, -31,-124,-112, -31, +-123, -84, -31,-121,-127, -31,-124,-112, -31,-123, -84, -31,-121,-128, -31,-124,-112, -31,-123, -84, + -31,-122, -65, -31,-124,-112, -31,-123, -84, -31,-122, -66, -31,-124,-112, -31,-123, -84, -31,-122, + -67, -31,-124,-112, -31,-123, -84, -31,-122, -68, -31,-124,-112, -31,-123, -84, -31,-122, -69, -31, +-124,-112, -31,-123, -84, -31,-122, -70, -31,-124,-112, -31,-123, -84, -31,-122, -71, -31,-124,-112, + -31,-123, -84, -31,-122, -72, -31,-124,-112, -31,-123, -84, -31,-122, -73, -31,-124,-112, -31,-123, + -84, -31,-122, -74, -31,-124,-112, -31,-123, -84, -31,-122, -75, -31,-124,-112, -31,-123, -84, -31, +-122, -76, -31,-124,-112, -31,-123, -84, -31,-122, -77, -31,-124,-112, -31,-123, -84, -31,-122, -78, + -31,-124,-112, -31,-123, -84, -31,-122, -79, -31,-124,-112, -31,-123, -84, -31,-122, -80, -31,-124, +-112, -31,-123, -84, -31,-122, -81, -31,-124,-112, -31,-123, -84, -31,-122, -82, -31,-124,-112, -31, +-123, -84, -31,-122, -83, -31,-124,-112, -31,-123, -84, -31,-122, -84, -31,-124,-112, -31,-123, -84, + -31,-122, -85, -31,-124,-112, -31,-123, -84, -31,-122, -86, -31,-124,-112, -31,-123, -84, -31,-122, + -87, -31,-124,-112, -31,-123, -84, -31,-122, -88, -31,-124,-112, -31,-123, -85, -31,-121,-126, -31, +-124,-112, -31,-123, -85, -31,-121,-127, -31,-124,-112, -31,-123, -85, -31,-121,-128, -31,-124,-112, + -31,-123, -85, -31,-122, -65, -31,-124,-112, -31,-123, -85, -31,-122, -66, -31,-124,-112, -31,-123, + -85, -31,-122, -67, -31,-124,-112, -31,-123, -85, -31,-122, -68, -31,-124,-112, -31,-123, -85, -31, +-122, -69, -31,-124,-112, -31,-123, -85, -31,-122, -70, -31,-124,-112, -31,-123, -85, -31,-122, -71, + -31,-124,-112, -31,-123, -85, -31,-122, -72, -31,-124,-112, -31,-123, -85, -31,-122, -73, -31,-124, +-112, -31,-123, -85, -31,-122, -74, -31,-124,-112, -31,-123, -85, -31,-122, -75, -31,-124,-112, -31, +-123, -85, -31,-122, -76, -31,-124,-112, -31,-123, -85, -31,-122, -77, -31,-124,-112, -31,-123, -85, + -31,-122, -78, -31,-124,-112, -31,-123, -85, -31,-122, -79, -31,-124,-112, -31,-123, -85, -31,-122, + -80, -31,-124,-112, -31,-123, -85, -31,-122, -81, -31,-124,-112, -31,-123, -85, -31,-122, -82, -31, +-124,-112, -31,-123, -85, -31,-122, -83, -31,-124,-112, -31,-123, -85, -31,-122, -84, -31,-124,-112, + -31,-123, -85, -31,-122, -85, -31,-124,-112, -31,-123, -85, -31,-122, -86, -31,-124,-112, -31,-123, + -85, -31,-122, -87, -31,-124,-112, -31,-123, -85, -31,-122, -88, -31,-124,-112, -31,-123, -86, -31, +-121,-126, -31,-124,-112, -31,-123, -86, -31,-121,-127, -31,-124,-112, -31,-123, -86, -31,-121,-128, + -31,-124,-112, -31,-123, -86, -31,-122, -65, -31,-124,-112, -31,-123, -86, -31,-122, -66, -31,-124, +-112, -31,-123, -86, -31,-122, -67, -31,-124,-112, -31,-123, -86, -31,-122, -68, -31,-124,-112, -31, +-123, -86, -31,-122, -69, -31,-124,-112, -31,-123, -86, -31,-122, -70, -31,-124,-112, -31,-123, -86, + -31,-122, -71, -31,-124,-112, -31,-123, -86, -31,-122, -72, -31,-124,-112, -31,-123, -86, -31,-122, + -73, -31,-124,-112, -31,-123, -86, -31,-122, -74, -31,-124,-112, -31,-123, -86, -31,-122, -75, -31, +-124,-112, -31,-123, -86, -31,-122, -76, -31,-124,-112, -31,-123, -86, -31,-122, -77, -31,-124,-112, + -31,-123, -86, -31,-122, -78, -31,-124,-112, -31,-123, -86, -31,-122, -79, -31,-124,-112, -31,-123, + -86, -31,-122, -80, -31,-124,-112, -31,-123, -86, -31,-122, -81, -31,-124,-112, -31,-123, -86, -31, +-122, -82, -31,-124,-112, -31,-123, -86, -31,-122, -83, -31,-124,-112, -31,-123, -86, -31,-122, -84, + -31,-124,-112, -31,-123, -86, -31,-122, -85, -31,-124,-112, -31,-123, -86, -31,-122, -86, -31,-124, +-112, -31,-123, -86, -31,-122, -87, -31,-124,-112, -31,-123, -86, -31,-122, -88, -31,-124,-112, -31, +-123, -87, -31,-121,-126, -31,-124,-112, -31,-123, -87, -31,-121,-127, -31,-124,-112, -31,-123, -87, + -31,-121,-128, -31,-124,-112, -31,-123, -87, -31,-122, -65, -31,-124,-112, -31,-123, -87, -31,-122, + -66, -31,-124,-112, -31,-123, -87, -31,-122, -67, -31,-124,-112, -31,-123, -87, -31,-122, -68, -31, +-124,-112, -31,-123, -87, -31,-122, -69, -31,-124,-112, -31,-123, -87, -31,-122, -70, -31,-124,-112, + -31,-123, -87, -31,-122, -71, -31,-124,-112, -31,-123, -87, -31,-122, -72, -31,-124,-112, -31,-123, + -87, -31,-122, -73, -31,-124,-112, -31,-123, -87, -31,-122, -74, -31,-124,-112, -31,-123, -87, -31, +-122, -75, -31,-124,-112, -31,-123, -87, -31,-122, -76, -31,-124,-112, -31,-123, -87, -31,-122, -77, + -31,-124,-112, -31,-123, -87, -31,-122, -78, -31,-124,-112, -31,-123, -87, -31,-122, -79, -31,-124, +-112, -31,-123, -87, -31,-122, -80, -31,-124,-112, -31,-123, -87, -31,-122, -81, -31,-124,-112, -31, +-123, -87, -31,-122, -82, -31,-124,-112, -31,-123, -87, -31,-122, -83, -31,-124,-112, -31,-123, -87, + -31,-122, -84, -31,-124,-112, -31,-123, -87, -31,-122, -85, -31,-124,-112, -31,-123, -87, -31,-122, + -86, -31,-124,-112, -31,-123, -87, -31,-122, -87, -31,-124,-112, -31,-123, -87, -31,-122, -88, -31, +-124,-112, -31,-123, -88, -31,-121,-126, -31,-124,-112, -31,-123, -88, -31,-121,-127, -31,-124,-112, + -31,-123, -88, -31,-121,-128, -31,-124,-112, -31,-123, -88, -31,-122, -65, -31,-124,-112, -31,-123, + -88, -31,-122, -66, -31,-124,-112, -31,-123, -88, -31,-122, -67, -31,-124,-112, -31,-123, -88, -31, +-122, -68, -31,-124,-112, -31,-123, -88, -31,-122, -69, -31,-124,-112, -31,-123, -88, -31,-122, -70, + -31,-124,-112, -31,-123, -88, -31,-122, -71, -31,-124,-112, -31,-123, -88, -31,-122, -72, -31,-124, +-112, -31,-123, -88, -31,-122, -73, -31,-124,-112, -31,-123, -88, -31,-122, -74, -31,-124,-112, -31, +-123, -88, -31,-122, -75, -31,-124,-112, -31,-123, -88, -31,-122, -76, -31,-124,-112, -31,-123, -88, + -31,-122, -77, -31,-124,-112, -31,-123, -88, -31,-122, -78, -31,-124,-112, -31,-123, -88, -31,-122, + -79, -31,-124,-112, -31,-123, -88, -31,-122, -80, -31,-124,-112, -31,-123, -88, -31,-122, -81, -31, +-124,-112, -31,-123, -88, -31,-122, -82, -31,-124,-112, -31,-123, -88, -31,-122, -83, -31,-124,-112, + -31,-123, -88, -31,-122, -84, -31,-124,-112, -31,-123, -88, -31,-122, -85, -31,-124,-112, -31,-123, + -88, -31,-122, -86, -31,-124,-112, -31,-123, -88, -31,-122, -87, -31,-124,-112, -31,-123, -88, -31, +-122, -88, -31,-124,-112, -31,-123, -89, -31,-121,-126, -31,-124,-112, -31,-123, -89, -31,-121,-127, + -31,-124,-112, -31,-123, -89, -31,-121,-128, -31,-124,-112, -31,-123, -89, -31,-122, -65, -31,-124, +-112, -31,-123, -89, -31,-122, -66, -31,-124,-112, -31,-123, -89, -31,-122, -67, -31,-124,-112, -31, +-123, -89, -31,-122, -68, -31,-124,-112, -31,-123, -89, -31,-122, -69, -31,-124,-112, -31,-123, -89, + -31,-122, -70, -31,-124,-112, -31,-123, -89, -31,-122, -71, -31,-124,-112, -31,-123, -89, -31,-122, + -72, -31,-124,-112, -31,-123, -89, -31,-122, -73, -31,-124,-112, -31,-123, -89, -31,-122, -74, -31, +-124,-112, -31,-123, -89, -31,-122, -75, -31,-124,-112, -31,-123, -89, -31,-122, -76, -31,-124,-112, + -31,-123, -89, -31,-122, -77, -31,-124,-112, -31,-123, -89, -31,-122, -78, -31,-124,-112, -31,-123, + -89, -31,-122, -79, -31,-124,-112, -31,-123, -89, -31,-122, -80, -31,-124,-112, -31,-123, -89, -31, +-122, -81, -31,-124,-112, -31,-123, -89, -31,-122, -82, -31,-124,-112, -31,-123, -89, -31,-122, -83, + -31,-124,-112, -31,-123, -89, -31,-122, -84, -31,-124,-112, -31,-123, -89, -31,-122, -85, -31,-124, +-112, -31,-123, -89, -31,-122, -86, -31,-124,-112, -31,-123, -89, -31,-122, -87, -31,-124,-112, -31, +-123, -89, -31,-122, -88, -31,-124,-112, -31,-123, -90, -31,-121,-126, -31,-124,-112, -31,-123, -90, + -31,-121,-127, -31,-124,-112, -31,-123, -90, -31,-121,-128, -31,-124,-112, -31,-123, -90, -31,-122, + -65, -31,-124,-112, -31,-123, -90, -31,-122, -66, -31,-124,-112, -31,-123, -90, -31,-122, -67, -31, +-124,-112, -31,-123, -90, -31,-122, -68, -31,-124,-112, -31,-123, -90, -31,-122, -69, -31,-124,-112, + -31,-123, -90, -31,-122, -70, -31,-124,-112, -31,-123, -90, -31,-122, -71, -31,-124,-112, -31,-123, + -90, -31,-122, -72, -31,-124,-112, -31,-123, -90, -31,-122, -73, -31,-124,-112, -31,-123, -90, -31, +-122, -74, -31,-124,-112, -31,-123, -90, -31,-122, -75, -31,-124,-112, -31,-123, -90, -31,-122, -76, + -31,-124,-112, -31,-123, -90, -31,-122, -77, -31,-124,-112, -31,-123, -90, -31,-122, -78, -31,-124, +-112, -31,-123, -90, -31,-122, -79, -31,-124,-112, -31,-123, -90, -31,-122, -80, -31,-124,-112, -31, +-123, -90, -31,-122, -81, -31,-124,-112, -31,-123, -90, -31,-122, -82, -31,-124,-112, -31,-123, -90, + -31,-122, -83, -31,-124,-112, -31,-123, -90, -31,-122, -84, -31,-124,-112, -31,-123, -90, -31,-122, + -85, -31,-124,-112, -31,-123, -90, -31,-122, -86, -31,-124,-112, -31,-123, -90, -31,-122, -87, -31, +-124,-112, -31,-123, -90, -31,-122, -88, -31,-124,-112, -31,-123, -91, -31,-121,-126, -31,-124,-112, + -31,-123, -91, -31,-121,-127, -31,-124,-112, -31,-123, -91, -31,-121,-128, -31,-124,-112, -31,-123, + -91, -31,-122, -65, -31,-124,-112, -31,-123, -91, -31,-122, -66, -31,-124,-112, -31,-123, -91, -31, +-122, -67, -31,-124,-112, -31,-123, -91, -31,-122, -68, -31,-124,-112, -31,-123, -91, -31,-122, -69, + -31,-124,-112, -31,-123, -91, -31,-122, -70, -31,-124,-112, -31,-123, -91, -31,-122, -71, -31,-124, +-112, -31,-123, -91, -31,-122, -72, -31,-124,-112, -31,-123, -91, -31,-122, -73, -31,-124,-112, -31, +-123, -91, -31,-122, -74, -31,-124,-112, -31,-123, -91, -31,-122, -75, -31,-124,-112, -31,-123, -91, + -31,-122, -76, -31,-124,-112, -31,-123, -91, -31,-122, -77, -31,-124,-112, -31,-123, -91, -31,-122, + -78, -31,-124,-112, -31,-123, -91, -31,-122, -79, -31,-124,-112, -31,-123, -91, -31,-122, -80, -31, +-124,-112, -31,-123, -91, -31,-122, -81, -31,-124,-112, -31,-123, -91, -31,-122, -82, -31,-124,-112, + -31,-123, -91, -31,-122, -83, -31,-124,-112, -31,-123, -91, -31,-122, -84, -31,-124,-112, -31,-123, + -91, -31,-122, -85, -31,-124,-112, -31,-123, -91, -31,-122, -86, -31,-124,-112, -31,-123, -91, -31, +-122, -87, -31,-124,-112, -31,-123, -91, -31,-122, -88, -31,-124,-112, -31,-123, -92, -31,-121,-126, + -31,-124,-112, -31,-123, -92, -31,-121,-127, -31,-124,-112, -31,-123, -92, -31,-121,-128, -31,-124, +-112, -31,-123, -92, -31,-122, -65, -31,-124,-112, -31,-123, -92, -31,-122, -66, -31,-124,-112, -31, +-123, -92, -31,-122, -67, -31,-124,-112, -31,-123, -92, -31,-122, -68, -31,-124,-112, -31,-123, -92, + -31,-122, -69, -31,-124,-112, -31,-123, -92, -31,-122, -70, -31,-124,-112, -31,-123, -92, -31,-122, + -71, -31,-124,-112, -31,-123, -92, -31,-122, -72, -31,-124,-112, -31,-123, -92, -31,-122, -73, -31, +-124,-112, -31,-123, -92, -31,-122, -74, -31,-124,-112, -31,-123, -92, -31,-122, -75, -31,-124,-112, + -31,-123, -92, -31,-122, -76, -31,-124,-112, -31,-123, -92, -31,-122, -77, -31,-124,-112, -31,-123, + -92, -31,-122, -78, -31,-124,-112, -31,-123, -92, -31,-122, -79, -31,-124,-112, -31,-123, -92, -31, +-122, -80, -31,-124,-112, -31,-123, -92, -31,-122, -81, -31,-124,-112, -31,-123, -92, -31,-122, -82, + -31,-124,-112, -31,-123, -92, -31,-122, -83, -31,-124,-112, -31,-123, -92, -31,-122, -84, -31,-124, +-112, -31,-123, -92, -31,-122, -85, -31,-124,-112, -31,-123, -92, -31,-122, -86, -31,-124,-112, -31, +-123, -92, -31,-122, -87, -31,-124,-112, -31,-123, -92, -31,-122, -88, -31,-124,-112, -31,-123, -93, + -31,-121,-126, -31,-124,-112, -31,-123, -93, -31,-121,-127, -31,-124,-112, -31,-123, -93, -31,-121, +-128, -31,-124,-112, -31,-123, -93, -31,-122, -65, -31,-124,-112, -31,-123, -93, -31,-122, -66, -31, +-124,-112, -31,-123, -93, -31,-122, -67, -31,-124,-112, -31,-123, -93, -31,-122, -68, -31,-124,-112, + -31,-123, -93, -31,-122, -69, -31,-124,-112, -31,-123, -93, -31,-122, -70, -31,-124,-112, -31,-123, + -93, -31,-122, -71, -31,-124,-112, -31,-123, -93, -31,-122, -72, -31,-124,-112, -31,-123, -93, -31, +-122, -73, -31,-124,-112, -31,-123, -93, -31,-122, -74, -31,-124,-112, -31,-123, -93, -31,-122, -75, + -31,-124,-112, -31,-123, -93, -31,-122, -76, -31,-124,-112, -31,-123, -93, -31,-122, -77, -31,-124, +-112, -31,-123, -93, -31,-122, -78, -31,-124,-112, -31,-123, -93, -31,-122, -79, -31,-124,-112, -31, +-123, -93, -31,-122, -80, -31,-124,-112, -31,-123, -93, -31,-122, -81, -31,-124,-112, -31,-123, -93, + -31,-122, -82, -31,-124,-112, -31,-123, -93, -31,-122, -83, -31,-124,-112, -31,-123, -93, -31,-122, + -84, -31,-124,-112, -31,-123, -93, -31,-122, -85, -31,-124,-112, -31,-123, -93, -31,-122, -86, -31, +-124,-112, -31,-123, -93, -31,-122, -87, -31,-124,-112, -31,-123, -93, -31,-122, -88, -31,-124,-112, + -31,-123, -94, -31,-121,-126, -31,-124,-112, -31,-123, -94, -31,-121,-127, -31,-124,-112, -31,-123, + -94, -31,-121,-128, -31,-124,-112, -31,-123, -94, -31,-122, -65, -31,-124,-112, -31,-123, -94, -31, +-122, -66, -31,-124,-112, -31,-123, -94, -31,-122, -67, -31,-124,-112, -31,-123, -94, -31,-122, -68, + -31,-124,-112, -31,-123, -94, -31,-122, -69, -31,-124,-112, -31,-123, -94, -31,-122, -70, -31,-124, +-112, -31,-123, -94, -31,-122, -71, -31,-124,-112, -31,-123, -94, -31,-122, -72, -31,-124,-112, -31, +-123, -94, -31,-122, -73, -31,-124,-112, -31,-123, -94, -31,-122, -74, -31,-124,-112, -31,-123, -94, + -31,-122, -75, -31,-124,-112, -31,-123, -94, -31,-122, -76, -31,-124,-112, -31,-123, -94, -31,-122, + -77, -31,-124,-112, -31,-123, -94, -31,-122, -78, -31,-124,-112, -31,-123, -94, -31,-122, -79, -31, +-124,-112, -31,-123, -94, -31,-122, -80, -31,-124,-112, -31,-123, -94, -31,-122, -81, -31,-124,-112, + -31,-123, -94, -31,-122, -82, -31,-124,-112, -31,-123, -94, -31,-122, -83, -31,-124,-112, -31,-123, + -94, -31,-122, -84, -31,-124,-112, -31,-123, -94, -31,-122, -85, -31,-124,-112, -31,-123, -94, -31, +-122, -86, -31,-124,-112, -31,-123, -94, -31,-122, -87, -31,-124,-112, -31,-123, -94, -31,-122, -88, + -31,-124,-112, -31,-123, -95, -31,-121,-126, -31,-124,-112, -31,-123, -95, -31,-121,-127, -31,-124, +-112, -31,-123, -95, -31,-121,-128, -31,-124,-112, -31,-123, -95, -31,-122, -65, -31,-124,-112, -31, +-123, -95, -31,-122, -66, -31,-124,-112, -31,-123, -95, -31,-122, -67, -31,-124,-112, -31,-123, -95, + -31,-122, -68, -31,-124,-112, -31,-123, -95, -31,-122, -69, -31,-124,-112, -31,-123, -95, -31,-122, + -70, -31,-124,-112, -31,-123, -95, -31,-122, -71, -31,-124,-112, -31,-123, -95, -31,-122, -72, -31, +-124,-112, -31,-123, -95, -31,-122, -73, -31,-124,-112, -31,-123, -95, -31,-122, -74, -31,-124,-112, + -31,-123, -95, -31,-122, -75, -31,-124,-112, -31,-123, -95, -31,-122, -76, -31,-124,-112, -31,-123, + -95, -31,-122, -77, -31,-124,-112, -31,-123, -95, -31,-122, -78, -31,-124,-112, -31,-123, -95, -31, +-122, -79, -31,-124,-112, -31,-123, -95, -31,-122, -80, -31,-124,-112, -31,-123, -95, -31,-122, -81, + -31,-124,-112, -31,-123, -95, -31,-122, -82, -31,-124,-112, -31,-123, -95, -31,-122, -83, -31,-124, +-112, -31,-123, -95, -31,-122, -84, -31,-124,-112, -31,-123, -95, -31,-122, -85, -31,-124,-112, -31, +-123, -95, -31,-122, -86, -31,-124,-112, -31,-123, -95, -31,-122, -87, -31,-124,-112, -31,-123, -95, + -31,-122, -88, -31,-124,-113, -31,-123, -75, -31,-121,-126, -31,-124,-113, -31,-123, -75, -31,-121, +-127, -31,-124,-113, -31,-123, -75, -31,-121,-128, -31,-124,-113, -31,-123, -75, -31,-122, -65, -31, +-124,-113, -31,-123, -75, -31,-122, -66, -31,-124,-113, -31,-123, -75, -31,-122, -67, -31,-124,-113, + -31,-123, -75, -31,-122, -68, -31,-124,-113, -31,-123, -75, -31,-122, -69, -31,-124,-113, -31,-123, + -75, -31,-122, -70, -31,-124,-113, -31,-123, -75, -31,-122, -71, -31,-124,-113, -31,-123, -75, -31, +-122, -72, -31,-124,-113, -31,-123, -75, -31,-122, -73, -31,-124,-113, -31,-123, -75, -31,-122, -74, + -31,-124,-113, -31,-123, -75, -31,-122, -75, -31,-124,-113, -31,-123, -75, -31,-122, -76, -31,-124, +-113, -31,-123, -75, -31,-122, -77, -31,-124,-113, -31,-123, -75, -31,-122, -78, -31,-124,-113, -31, +-123, -75, -31,-122, -79, -31,-124,-113, -31,-123, -75, -31,-122, -80, -31,-124,-113, -31,-123, -75, + -31,-122, -81, -31,-124,-113, -31,-123, -75, -31,-122, -82, -31,-124,-113, -31,-123, -75, -31,-122, + -83, -31,-124,-113, -31,-123, -75, -31,-122, -84, -31,-124,-113, -31,-123, -75, -31,-122, -85, -31, +-124,-113, -31,-123, -75, -31,-122, -86, -31,-124,-113, -31,-123, -75, -31,-122, -87, -31,-124,-113, + -31,-123, -75, -31,-122, -88, -31,-124,-113, -31,-123, -76, -31,-121,-126, -31,-124,-113, -31,-123, + -76, -31,-121,-127, -31,-124,-113, -31,-123, -76, -31,-121,-128, -31,-124,-113, -31,-123, -76, -31, +-122, -65, -31,-124,-113, -31,-123, -76, -31,-122, -66, -31,-124,-113, -31,-123, -76, -31,-122, -67, + -31,-124,-113, -31,-123, -76, -31,-122, -68, -31,-124,-113, -31,-123, -76, -31,-122, -69, -31,-124, +-113, -31,-123, -76, -31,-122, -70, -31,-124,-113, -31,-123, -76, -31,-122, -71, -31,-124,-113, -31, +-123, -76, -31,-122, -72, -31,-124,-113, -31,-123, -76, -31,-122, -73, -31,-124,-113, -31,-123, -76, + -31,-122, -74, -31,-124,-113, -31,-123, -76, -31,-122, -75, -31,-124,-113, -31,-123, -76, -31,-122, + -76, -31,-124,-113, -31,-123, -76, -31,-122, -77, -31,-124,-113, -31,-123, -76, -31,-122, -78, -31, +-124,-113, -31,-123, -76, -31,-122, -79, -31,-124,-113, -31,-123, -76, -31,-122, -80, -31,-124,-113, + -31,-123, -76, -31,-122, -81, -31,-124,-113, -31,-123, -76, -31,-122, -82, -31,-124,-113, -31,-123, + -76, -31,-122, -83, -31,-124,-113, -31,-123, -76, -31,-122, -84, -31,-124,-113, -31,-123, -76, -31, +-122, -85, -31,-124,-113, -31,-123, -76, -31,-122, -86, -31,-124,-113, -31,-123, -76, -31,-122, -87, + -31,-124,-113, -31,-123, -76, -31,-122, -88, -31,-124,-113, -31,-123, -77, -31,-121,-126, -31,-124, +-113, -31,-123, -77, -31,-121,-127, -31,-124,-113, -31,-123, -77, -31,-121,-128, -31,-124,-113, -31, +-123, -77, -31,-122, -65, -31,-124,-113, -31,-123, -77, -31,-122, -66, -31,-124,-113, -31,-123, -77, + -31,-122, -67, -31,-124,-113, -31,-123, -77, -31,-122, -68, -31,-124,-113, -31,-123, -77, -31,-122, + -69, -31,-124,-113, -31,-123, -77, -31,-122, -70, -31,-124,-113, -31,-123, -77, -31,-122, -71, -31, +-124,-113, -31,-123, -77, -31,-122, -72, -31,-124,-113, -31,-123, -77, -31,-122, -73, -31,-124,-113, + -31,-123, -77, -31,-122, -74, -31,-124,-113, -31,-123, -77, -31,-122, -75, -31,-124,-113, -31,-123, + -77, -31,-122, -76, -31,-124,-113, -31,-123, -77, -31,-122, -77, -31,-124,-113, -31,-123, -77, -31, +-122, -78, -31,-124,-113, -31,-123, -77, -31,-122, -79, -31,-124,-113, -31,-123, -77, -31,-122, -80, + -31,-124,-113, -31,-123, -77, -31,-122, -81, -31,-124,-113, -31,-123, -77, -31,-122, -82, -31,-124, +-113, -31,-123, -77, -31,-122, -83, -31,-124,-113, -31,-123, -77, -31,-122, -84, -31,-124,-113, -31, +-123, -77, -31,-122, -85, -31,-124,-113, -31,-123, -77, -31,-122, -86, -31,-124,-113, -31,-123, -77, + -31,-122, -87, -31,-124,-113, -31,-123, -77, -31,-122, -88, -31,-124,-113, -31,-123, -78, -31,-121, +-126, -31,-124,-113, -31,-123, -78, -31,-121,-127, -31,-124,-113, -31,-123, -78, -31,-121,-128, -31, +-124,-113, -31,-123, -78, -31,-122, -65, -31,-124,-113, -31,-123, -78, -31,-122, -66, -31,-124,-113, + -31,-123, -78, -31,-122, -67, -31,-124,-113, -31,-123, -78, -31,-122, -68, -31,-124,-113, -31,-123, + -78, -31,-122, -69, -31,-124,-113, -31,-123, -78, -31,-122, -70, -31,-124,-113, -31,-123, -78, -31, +-122, -71, -31,-124,-113, -31,-123, -78, -31,-122, -72, -31,-124,-113, -31,-123, -78, -31,-122, -73, + -31,-124,-113, -31,-123, -78, -31,-122, -74, -31,-124,-113, -31,-123, -78, -31,-122, -75, -31,-124, +-113, -31,-123, -78, -31,-122, -76, -31,-124,-113, -31,-123, -78, -31,-122, -77, -31,-124,-113, -31, +-123, -78, -31,-122, -78, -31,-124,-113, -31,-123, -78, -31,-122, -79, -31,-124,-113, -31,-123, -78, + -31,-122, -80, -31,-124,-113, -31,-123, -78, -31,-122, -81, -31,-124,-113, -31,-123, -78, -31,-122, + -82, -31,-124,-113, -31,-123, -78, -31,-122, -83, -31,-124,-113, -31,-123, -78, -31,-122, -84, -31, +-124,-113, -31,-123, -78, -31,-122, -85, -31,-124,-113, -31,-123, -78, -31,-122, -86, -31,-124,-113, + -31,-123, -78, -31,-122, -87, -31,-124,-113, -31,-123, -78, -31,-122, -88, -31,-124,-113, -31,-123, + -79, -31,-121,-126, -31,-124,-113, -31,-123, -79, -31,-121,-127, -31,-124,-113, -31,-123, -79, -31, +-121,-128, -31,-124,-113, -31,-123, -79, -31,-122, -65, -31,-124,-113, -31,-123, -79, -31,-122, -66, + -31,-124,-113, -31,-123, -79, -31,-122, -67, -31,-124,-113, -31,-123, -79, -31,-122, -68, -31,-124, +-113, -31,-123, -79, -31,-122, -69, -31,-124,-113, -31,-123, -79, -31,-122, -70, -31,-124,-113, -31, +-123, -79, -31,-122, -71, -31,-124,-113, -31,-123, -79, -31,-122, -72, -31,-124,-113, -31,-123, -79, + -31,-122, -73, -31,-124,-113, -31,-123, -79, -31,-122, -74, -31,-124,-113, -31,-123, -79, -31,-122, + -75, -31,-124,-113, -31,-123, -79, -31,-122, -76, -31,-124,-113, -31,-123, -79, -31,-122, -77, -31, +-124,-113, -31,-123, -79, -31,-122, -78, -31,-124,-113, -31,-123, -79, -31,-122, -79, -31,-124,-113, + -31,-123, -79, -31,-122, -80, -31,-124,-113, -31,-123, -79, -31,-122, -81, -31,-124,-113, -31,-123, + -79, -31,-122, -82, -31,-124,-113, -31,-123, -79, -31,-122, -83, -31,-124,-113, -31,-123, -79, -31, +-122, -84, -31,-124,-113, -31,-123, -79, -31,-122, -85, -31,-124,-113, -31,-123, -79, -31,-122, -86, + -31,-124,-113, -31,-123, -79, -31,-122, -87, -31,-124,-113, -31,-123, -79, -31,-122, -88, -31,-124, +-113, -31,-123, -80, -31,-121,-126, -31,-124,-113, -31,-123, -80, -31,-121,-127, -31,-124,-113, -31, +-123, -80, -31,-121,-128, -31,-124,-113, -31,-123, -80, -31,-122, -65, -31,-124,-113, -31,-123, -80, + -31,-122, -66, -31,-124,-113, -31,-123, -80, -31,-122, -67, -31,-124,-113, -31,-123, -80, -31,-122, + -68, -31,-124,-113, -31,-123, -80, -31,-122, -69, -31,-124,-113, -31,-123, -80, -31,-122, -70, -31, +-124,-113, -31,-123, -80, -31,-122, -71, -31,-124,-113, -31,-123, -80, -31,-122, -72, -31,-124,-113, + -31,-123, -80, -31,-122, -73, -31,-124,-113, -31,-123, -80, -31,-122, -74, -31,-124,-113, -31,-123, + -80, -31,-122, -75, -31,-124,-113, -31,-123, -80, -31,-122, -76, -31,-124,-113, -31,-123, -80, -31, +-122, -77, -31,-124,-113, -31,-123, -80, -31,-122, -78, -31,-124,-113, -31,-123, -80, -31,-122, -79, + -31,-124,-113, -31,-123, -80, -31,-122, -80, -31,-124,-113, -31,-123, -80, -31,-122, -81, -31,-124, +-113, -31,-123, -80, -31,-122, -82, -31,-124,-113, -31,-123, -80, -31,-122, -83, -31,-124,-113, -31, +-123, -80, -31,-122, -84, -31,-124,-113, -31,-123, -80, -31,-122, -85, -31,-124,-113, -31,-123, -80, + -31,-122, -86, -31,-124,-113, -31,-123, -80, -31,-122, -87, -31,-124,-113, -31,-123, -80, -31,-122, + -88, -31,-124,-113, -31,-123, -81, -31,-121,-126, -31,-124,-113, -31,-123, -81, -31,-121,-127, -31, +-124,-113, -31,-123, -81, -31,-121,-128, -31,-124,-113, -31,-123, -81, -31,-122, -65, -31,-124,-113, + -31,-123, -81, -31,-122, -66, -31,-124,-113, -31,-123, -81, -31,-122, -67, -31,-124,-113, -31,-123, + -81, -31,-122, -68, -31,-124,-113, -31,-123, -81, -31,-122, -69, -31,-124,-113, -31,-123, -81, -31, +-122, -70, -31,-124,-113, -31,-123, -81, -31,-122, -71, -31,-124,-113, -31,-123, -81, -31,-122, -72, + -31,-124,-113, -31,-123, -81, -31,-122, -73, -31,-124,-113, -31,-123, -81, -31,-122, -74, -31,-124, +-113, -31,-123, -81, -31,-122, -75, -31,-124,-113, -31,-123, -81, -31,-122, -76, -31,-124,-113, -31, +-123, -81, -31,-122, -77, -31,-124,-113, -31,-123, -81, -31,-122, -78, -31,-124,-113, -31,-123, -81, + -31,-122, -79, -31,-124,-113, -31,-123, -81, -31,-122, -80, -31,-124,-113, -31,-123, -81, -31,-122, + -81, -31,-124,-113, -31,-123, -81, -31,-122, -82, -31,-124,-113, -31,-123, -81, -31,-122, -83, -31, +-124,-113, -31,-123, -81, -31,-122, -84, -31,-124,-113, -31,-123, -81, -31,-122, -85, -31,-124,-113, + -31,-123, -81, -31,-122, -86, -31,-124,-113, -31,-123, -81, -31,-122, -87, -31,-124,-113, -31,-123, + -81, -31,-122, -88, -31,-124,-113, -31,-123, -82, -31,-121,-126, -31,-124,-113, -31,-123, -82, -31, +-121,-127, -31,-124,-113, -31,-123, -82, -31,-121,-128, -31,-124,-113, -31,-123, -82, -31,-122, -65, + -31,-124,-113, -31,-123, -82, -31,-122, -66, -31,-124,-113, -31,-123, -82, -31,-122, -67, -31,-124, +-113, -31,-123, -82, -31,-122, -68, -31,-124,-113, -31,-123, -82, -31,-122, -69, -31,-124,-113, -31, +-123, -82, -31,-122, -70, -31,-124,-113, -31,-123, -82, -31,-122, -71, -31,-124,-113, -31,-123, -82, + -31,-122, -72, -31,-124,-113, -31,-123, -82, -31,-122, -73, -31,-124,-113, -31,-123, -82, -31,-122, + -74, -31,-124,-113, -31,-123, -82, -31,-122, -75, -31,-124,-113, -31,-123, -82, -31,-122, -76, -31, +-124,-113, -31,-123, -82, -31,-122, -77, -31,-124,-113, -31,-123, -82, -31,-122, -78, -31,-124,-113, + -31,-123, -82, -31,-122, -79, -31,-124,-113, -31,-123, -82, -31,-122, -80, -31,-124,-113, -31,-123, + -82, -31,-122, -81, -31,-124,-113, -31,-123, -82, -31,-122, -82, -31,-124,-113, -31,-123, -82, -31, +-122, -83, -31,-124,-113, -31,-123, -82, -31,-122, -84, -31,-124,-113, -31,-123, -82, -31,-122, -85, + -31,-124,-113, -31,-123, -82, -31,-122, -86, -31,-124,-113, -31,-123, -82, -31,-122, -87, -31,-124, +-113, -31,-123, -82, -31,-122, -88, -31,-124,-113, -31,-123, -83, -31,-121,-126, -31,-124,-113, -31, +-123, -83, -31,-121,-127, -31,-124,-113, -31,-123, -83, -31,-121,-128, -31,-124,-113, -31,-123, -83, + -31,-122, -65, -31,-124,-113, -31,-123, -83, -31,-122, -66, -31,-124,-113, -31,-123, -83, -31,-122, + -67, -31,-124,-113, -31,-123, -83, -31,-122, -68, -31,-124,-113, -31,-123, -83, -31,-122, -69, -31, +-124,-113, -31,-123, -83, -31,-122, -70, -31,-124,-113, -31,-123, -83, -31,-122, -71, -31,-124,-113, + -31,-123, -83, -31,-122, -72, -31,-124,-113, -31,-123, -83, -31,-122, -73, -31,-124,-113, -31,-123, + -83, -31,-122, -74, -31,-124,-113, -31,-123, -83, -31,-122, -75, -31,-124,-113, -31,-123, -83, -31, +-122, -76, -31,-124,-113, -31,-123, -83, -31,-122, -77, -31,-124,-113, -31,-123, -83, -31,-122, -78, + -31,-124,-113, -31,-123, -83, -31,-122, -79, -31,-124,-113, -31,-123, -83, -31,-122, -80, -31,-124, +-113, -31,-123, -83, -31,-122, -81, -31,-124,-113, -31,-123, -83, -31,-122, -82, -31,-124,-113, -31, +-123, -83, -31,-122, -83, -31,-124,-113, -31,-123, -83, -31,-122, -84, -31,-124,-113, -31,-123, -83, + -31,-122, -85, -31,-124,-113, -31,-123, -83, -31,-122, -86, -31,-124,-113, -31,-123, -83, -31,-122, + -87, -31,-124,-113, -31,-123, -83, -31,-122, -88, -31,-124,-113, -31,-123, -84, -31,-121,-126, -31, +-124,-113, -31,-123, -84, -31,-121,-127, -31,-124,-113, -31,-123, -84, -31,-121,-128, -31,-124,-113, + -31,-123, -84, -31,-122, -65, -31,-124,-113, -31,-123, -84, -31,-122, -66, -31,-124,-113, -31,-123, + -84, -31,-122, -67, -31,-124,-113, -31,-123, -84, -31,-122, -68, -31,-124,-113, -31,-123, -84, -31, +-122, -69, -31,-124,-113, -31,-123, -84, -31,-122, -70, -31,-124,-113, -31,-123, -84, -31,-122, -71, + -31,-124,-113, -31,-123, -84, -31,-122, -72, -31,-124,-113, -31,-123, -84, -31,-122, -73, -31,-124, +-113, -31,-123, -84, -31,-122, -74, -31,-124,-113, -31,-123, -84, -31,-122, -75, -31,-124,-113, -31, +-123, -84, -31,-122, -76, -31,-124,-113, -31,-123, -84, -31,-122, -77, -31,-124,-113, -31,-123, -84, + -31,-122, -78, -31,-124,-113, -31,-123, -84, -31,-122, -79, -31,-124,-113, -31,-123, -84, -31,-122, + -80, -31,-124,-113, -31,-123, -84, -31,-122, -81, -31,-124,-113, -31,-123, -84, -31,-122, -82, -31, +-124,-113, -31,-123, -84, -31,-122, -83, -31,-124,-113, -31,-123, -84, -31,-122, -84, -31,-124,-113, + -31,-123, -84, -31,-122, -85, -31,-124,-113, -31,-123, -84, -31,-122, -86, -31,-124,-113, -31,-123, + -84, -31,-122, -87, -31,-124,-113, -31,-123, -84, -31,-122, -88, -31,-124,-113, -31,-123, -85, -31, +-121,-126, -31,-124,-113, -31,-123, -85, -31,-121,-127, -31,-124,-113, -31,-123, -85, -31,-121,-128, + -31,-124,-113, -31,-123, -85, -31,-122, -65, -31,-124,-113, -31,-123, -85, -31,-122, -66, -31,-124, +-113, -31,-123, -85, -31,-122, -67, -31,-124,-113, -31,-123, -85, -31,-122, -68, -31,-124,-113, -31, +-123, -85, -31,-122, -69, -31,-124,-113, -31,-123, -85, -31,-122, -70, -31,-124,-113, -31,-123, -85, + -31,-122, -71, -31,-124,-113, -31,-123, -85, -31,-122, -72, -31,-124,-113, -31,-123, -85, -31,-122, + -73, -31,-124,-113, -31,-123, -85, -31,-122, -74, -31,-124,-113, -31,-123, -85, -31,-122, -75, -31, +-124,-113, -31,-123, -85, -31,-122, -76, -31,-124,-113, -31,-123, -85, -31,-122, -77, -31,-124,-113, + -31,-123, -85, -31,-122, -78, -31,-124,-113, -31,-123, -85, -31,-122, -79, -31,-124,-113, -31,-123, + -85, -31,-122, -80, -31,-124,-113, -31,-123, -85, -31,-122, -81, -31,-124,-113, -31,-123, -85, -31, +-122, -82, -31,-124,-113, -31,-123, -85, -31,-122, -83, -31,-124,-113, -31,-123, -85, -31,-122, -84, + -31,-124,-113, -31,-123, -85, -31,-122, -85, -31,-124,-113, -31,-123, -85, -31,-122, -86, -31,-124, +-113, -31,-123, -85, -31,-122, -87, -31,-124,-113, -31,-123, -85, -31,-122, -88, -31,-124,-113, -31, +-123, -86, -31,-121,-126, -31,-124,-113, -31,-123, -86, -31,-121,-127, -31,-124,-113, -31,-123, -86, + -31,-121,-128, -31,-124,-113, -31,-123, -86, -31,-122, -65, -31,-124,-113, -31,-123, -86, -31,-122, + -66, -31,-124,-113, -31,-123, -86, -31,-122, -67, -31,-124,-113, -31,-123, -86, -31,-122, -68, -31, +-124,-113, -31,-123, -86, -31,-122, -69, -31,-124,-113, -31,-123, -86, -31,-122, -70, -31,-124,-113, + -31,-123, -86, -31,-122, -71, -31,-124,-113, -31,-123, -86, -31,-122, -72, -31,-124,-113, -31,-123, + -86, -31,-122, -73, -31,-124,-113, -31,-123, -86, -31,-122, -74, -31,-124,-113, -31,-123, -86, -31, +-122, -75, -31,-124,-113, -31,-123, -86, -31,-122, -76, -31,-124,-113, -31,-123, -86, -31,-122, -77, + -31,-124,-113, -31,-123, -86, -31,-122, -78, -31,-124,-113, -31,-123, -86, -31,-122, -79, -31,-124, +-113, -31,-123, -86, -31,-122, -80, -31,-124,-113, -31,-123, -86, -31,-122, -81, -31,-124,-113, -31, +-123, -86, -31,-122, -82, -31,-124,-113, -31,-123, -86, -31,-122, -83, -31,-124,-113, -31,-123, -86, + -31,-122, -84, -31,-124,-113, -31,-123, -86, -31,-122, -85, -31,-124,-113, -31,-123, -86, -31,-122, + -86, -31,-124,-113, -31,-123, -86, -31,-122, -87, -31,-124,-113, -31,-123, -86, -31,-122, -88, -31, +-124,-113, -31,-123, -87, -31,-121,-126, -31,-124,-113, -31,-123, -87, -31,-121,-127, -31,-124,-113, + -31,-123, -87, -31,-121,-128, -31,-124,-113, -31,-123, -87, -31,-122, -65, -31,-124,-113, -31,-123, + -87, -31,-122, -66, -31,-124,-113, -31,-123, -87, -31,-122, -67, -31,-124,-113, -31,-123, -87, -31, +-122, -68, -31,-124,-113, -31,-123, -87, -31,-122, -69, -31,-124,-113, -31,-123, -87, -31,-122, -70, + -31,-124,-113, -31,-123, -87, -31,-122, -71, -31,-124,-113, -31,-123, -87, -31,-122, -72, -31,-124, +-113, -31,-123, -87, -31,-122, -73, -31,-124,-113, -31,-123, -87, -31,-122, -74, -31,-124,-113, -31, +-123, -87, -31,-122, -75, -31,-124,-113, -31,-123, -87, -31,-122, -76, -31,-124,-113, -31,-123, -87, + -31,-122, -77, -31,-124,-113, -31,-123, -87, -31,-122, -78, -31,-124,-113, -31,-123, -87, -31,-122, + -79, -31,-124,-113, -31,-123, -87, -31,-122, -80, -31,-124,-113, -31,-123, -87, -31,-122, -81, -31, +-124,-113, -31,-123, -87, -31,-122, -82, -31,-124,-113, -31,-123, -87, -31,-122, -83, -31,-124,-113, + -31,-123, -87, -31,-122, -84, -31,-124,-113, -31,-123, -87, -31,-122, -85, -31,-124,-113, -31,-123, + -87, -31,-122, -86, -31,-124,-113, -31,-123, -87, -31,-122, -87, -31,-124,-113, -31,-123, -87, -31, +-122, -88, -31,-124,-113, -31,-123, -88, -31,-121,-126, -31,-124,-113, -31,-123, -88, -31,-121,-127, + -31,-124,-113, -31,-123, -88, -31,-121,-128, -31,-124,-113, -31,-123, -88, -31,-122, -65, -31,-124, +-113, -31,-123, -88, -31,-122, -66, -31,-124,-113, -31,-123, -88, -31,-122, -67, -31,-124,-113, -31, +-123, -88, -31,-122, -68, -31,-124,-113, -31,-123, -88, -31,-122, -69, -31,-124,-113, -31,-123, -88, + -31,-122, -70, -31,-124,-113, -31,-123, -88, -31,-122, -71, -31,-124,-113, -31,-123, -88, -31,-122, + -72, -31,-124,-113, -31,-123, -88, -31,-122, -73, -31,-124,-113, -31,-123, -88, -31,-122, -74, -31, +-124,-113, -31,-123, -88, -31,-122, -75, -31,-124,-113, -31,-123, -88, -31,-122, -76, -31,-124,-113, + -31,-123, -88, -31,-122, -77, -31,-124,-113, -31,-123, -88, -31,-122, -78, -31,-124,-113, -31,-123, + -88, -31,-122, -79, -31,-124,-113, -31,-123, -88, -31,-122, -80, -31,-124,-113, -31,-123, -88, -31, +-122, -81, -31,-124,-113, -31,-123, -88, -31,-122, -82, -31,-124,-113, -31,-123, -88, -31,-122, -83, + -31,-124,-113, -31,-123, -88, -31,-122, -84, -31,-124,-113, -31,-123, -88, -31,-122, -85, -31,-124, +-113, -31,-123, -88, -31,-122, -86, -31,-124,-113, -31,-123, -88, -31,-122, -87, -31,-124,-113, -31, +-123, -88, -31,-122, -88, -31,-124,-113, -31,-123, -89, -31,-121,-126, -31,-124,-113, -31,-123, -89, + -31,-121,-127, -31,-124,-113, -31,-123, -89, -31,-121,-128, -31,-124,-113, -31,-123, -89, -31,-122, + -65, -31,-124,-113, -31,-123, -89, -31,-122, -66, -31,-124,-113, -31,-123, -89, -31,-122, -67, -31, +-124,-113, -31,-123, -89, -31,-122, -68, -31,-124,-113, -31,-123, -89, -31,-122, -69, -31,-124,-113, + -31,-123, -89, -31,-122, -70, -31,-124,-113, -31,-123, -89, -31,-122, -71, -31,-124,-113, -31,-123, + -89, -31,-122, -72, -31,-124,-113, -31,-123, -89, -31,-122, -73, -31,-124,-113, -31,-123, -89, -31, +-122, -74, -31,-124,-113, -31,-123, -89, -31,-122, -75, -31,-124,-113, -31,-123, -89, -31,-122, -76, + -31,-124,-113, -31,-123, -89, -31,-122, -77, -31,-124,-113, -31,-123, -89, -31,-122, -78, -31,-124, +-113, -31,-123, -89, -31,-122, -79, -31,-124,-113, -31,-123, -89, -31,-122, -80, -31,-124,-113, -31, +-123, -89, -31,-122, -81, -31,-124,-113, -31,-123, -89, -31,-122, -82, -31,-124,-113, -31,-123, -89, + -31,-122, -83, -31,-124,-113, -31,-123, -89, -31,-122, -84, -31,-124,-113, -31,-123, -89, -31,-122, + -85, -31,-124,-113, -31,-123, -89, -31,-122, -86, -31,-124,-113, -31,-123, -89, -31,-122, -87, -31, +-124,-113, -31,-123, -89, -31,-122, -88, -31,-124,-113, -31,-123, -90, -31,-121,-126, -31,-124,-113, + -31,-123, -90, -31,-121,-127, -31,-124,-113, -31,-123, -90, -31,-121,-128, -31,-124,-113, -31,-123, + -90, -31,-122, -65, -31,-124,-113, -31,-123, -90, -31,-122, -66, -31,-124,-113, -31,-123, -90, -31, +-122, -67, -31,-124,-113, -31,-123, -90, -31,-122, -68, -31,-124,-113, -31,-123, -90, -31,-122, -69, + -31,-124,-113, -31,-123, -90, -31,-122, -70, -31,-124,-113, -31,-123, -90, -31,-122, -71, -31,-124, +-113, -31,-123, -90, -31,-122, -72, -31,-124,-113, -31,-123, -90, -31,-122, -73, -31,-124,-113, -31, +-123, -90, -31,-122, -74, -31,-124,-113, -31,-123, -90, -31,-122, -75, -31,-124,-113, -31,-123, -90, + -31,-122, -76, -31,-124,-113, -31,-123, -90, -31,-122, -77, -31,-124,-113, -31,-123, -90, -31,-122, + -78, -31,-124,-113, -31,-123, -90, -31,-122, -79, -31,-124,-113, -31,-123, -90, -31,-122, -80, -31, +-124,-113, -31,-123, -90, -31,-122, -81, -31,-124,-113, -31,-123, -90, -31,-122, -82, -31,-124,-113, + -31,-123, -90, -31,-122, -83, -31,-124,-113, -31,-123, -90, -31,-122, -84, -31,-124,-113, -31,-123, + -90, -31,-122, -85, -31,-124,-113, -31,-123, -90, -31,-122, -86, -31,-124,-113, -31,-123, -90, -31, +-122, -87, -31,-124,-113, -31,-123, -90, -31,-122, -88, -31,-124,-113, -31,-123, -91, -31,-121,-126, + -31,-124,-113, -31,-123, -91, -31,-121,-127, -31,-124,-113, -31,-123, -91, -31,-121,-128, -31,-124, +-113, -31,-123, -91, -31,-122, -65, -31,-124,-113, -31,-123, -91, -31,-122, -66, -31,-124,-113, -31, +-123, -91, -31,-122, -67, -31,-124,-113, -31,-123, -91, -31,-122, -68, -31,-124,-113, -31,-123, -91, + -31,-122, -69, -31,-124,-113, -31,-123, -91, -31,-122, -70, -31,-124,-113, -31,-123, -91, -31,-122, + -71, -31,-124,-113, -31,-123, -91, -31,-122, -72, -31,-124,-113, -31,-123, -91, -31,-122, -73, -31, +-124,-113, -31,-123, -91, -31,-122, -74, -31,-124,-113, -31,-123, -91, -31,-122, -75, -31,-124,-113, + -31,-123, -91, -31,-122, -76, -31,-124,-113, -31,-123, -91, -31,-122, -77, -31,-124,-113, -31,-123, + -91, -31,-122, -78, -31,-124,-113, -31,-123, -91, -31,-122, -79, -31,-124,-113, -31,-123, -91, -31, +-122, -80, -31,-124,-113, -31,-123, -91, -31,-122, -81, -31,-124,-113, -31,-123, -91, -31,-122, -82, + -31,-124,-113, -31,-123, -91, -31,-122, -83, -31,-124,-113, -31,-123, -91, -31,-122, -84, -31,-124, +-113, -31,-123, -91, -31,-122, -85, -31,-124,-113, -31,-123, -91, -31,-122, -86, -31,-124,-113, -31, +-123, -91, -31,-122, -87, -31,-124,-113, -31,-123, -91, -31,-122, -88, -31,-124,-113, -31,-123, -92, + -31,-121,-126, -31,-124,-113, -31,-123, -92, -31,-121,-127, -31,-124,-113, -31,-123, -92, -31,-121, +-128, -31,-124,-113, -31,-123, -92, -31,-122, -65, -31,-124,-113, -31,-123, -92, -31,-122, -66, -31, +-124,-113, -31,-123, -92, -31,-122, -67, -31,-124,-113, -31,-123, -92, -31,-122, -68, -31,-124,-113, + -31,-123, -92, -31,-122, -69, -31,-124,-113, -31,-123, -92, -31,-122, -70, -31,-124,-113, -31,-123, + -92, -31,-122, -71, -31,-124,-113, -31,-123, -92, -31,-122, -72, -31,-124,-113, -31,-123, -92, -31, +-122, -73, -31,-124,-113, -31,-123, -92, -31,-122, -74, -31,-124,-113, -31,-123, -92, -31,-122, -75, + -31,-124,-113, -31,-123, -92, -31,-122, -76, -31,-124,-113, -31,-123, -92, -31,-122, -77, -31,-124, +-113, -31,-123, -92, -31,-122, -78, -31,-124,-113, -31,-123, -92, -31,-122, -79, -31,-124,-113, -31, +-123, -92, -31,-122, -80, -31,-124,-113, -31,-123, -92, -31,-122, -81, -31,-124,-113, -31,-123, -92, + -31,-122, -82, -31,-124,-113, -31,-123, -92, -31,-122, -83, -31,-124,-113, -31,-123, -92, -31,-122, + -84, -31,-124,-113, -31,-123, -92, -31,-122, -85, -31,-124,-113, -31,-123, -92, -31,-122, -86, -31, +-124,-113, -31,-123, -92, -31,-122, -87, -31,-124,-113, -31,-123, -92, -31,-122, -88, -31,-124,-113, + -31,-123, -93, -31,-121,-126, -31,-124,-113, -31,-123, -93, -31,-121,-127, -31,-124,-113, -31,-123, + -93, -31,-121,-128, -31,-124,-113, -31,-123, -93, -31,-122, -65, -31,-124,-113, -31,-123, -93, -31, +-122, -66, -31,-124,-113, -31,-123, -93, -31,-122, -67, -31,-124,-113, -31,-123, -93, -31,-122, -68, + -31,-124,-113, -31,-123, -93, -31,-122, -69, -31,-124,-113, -31,-123, -93, -31,-122, -70, -31,-124, +-113, -31,-123, -93, -31,-122, -71, -31,-124,-113, -31,-123, -93, -31,-122, -72, -31,-124,-113, -31, +-123, -93, -31,-122, -73, -31,-124,-113, -31,-123, -93, -31,-122, -74, -31,-124,-113, -31,-123, -93, + -31,-122, -75, -31,-124,-113, -31,-123, -93, -31,-122, -76, -31,-124,-113, -31,-123, -93, -31,-122, + -77, -31,-124,-113, -31,-123, -93, -31,-122, -78, -31,-124,-113, -31,-123, -93, -31,-122, -79, -31, +-124,-113, -31,-123, -93, -31,-122, -80, -31,-124,-113, -31,-123, -93, -31,-122, -81, -31,-124,-113, + -31,-123, -93, -31,-122, -82, -31,-124,-113, -31,-123, -93, -31,-122, -83, -31,-124,-113, -31,-123, + -93, -31,-122, -84, -31,-124,-113, -31,-123, -93, -31,-122, -85, -31,-124,-113, -31,-123, -93, -31, +-122, -86, -31,-124,-113, -31,-123, -93, -31,-122, -87, -31,-124,-113, -31,-123, -93, -31,-122, -88, + -31,-124,-113, -31,-123, -94, -31,-121,-126, -31,-124,-113, -31,-123, -94, -31,-121,-127, -31,-124, +-113, -31,-123, -94, -31,-121,-128, -31,-124,-113, -31,-123, -94, -31,-122, -65, -31,-124,-113, -31, +-123, -94, -31,-122, -66, -31,-124,-113, -31,-123, -94, -31,-122, -67, -31,-124,-113, -31,-123, -94, + -31,-122, -68, -31,-124,-113, -31,-123, -94, -31,-122, -69, -31,-124,-113, -31,-123, -94, -31,-122, + -70, -31,-124,-113, -31,-123, -94, -31,-122, -71, -31,-124,-113, -31,-123, -94, -31,-122, -72, -31, +-124,-113, -31,-123, -94, -31,-122, -73, -31,-124,-113, -31,-123, -94, -31,-122, -74, -31,-124,-113, + -31,-123, -94, -31,-122, -75, -31,-124,-113, -31,-123, -94, -31,-122, -76, -31,-124,-113, -31,-123, + -94, -31,-122, -77, -31,-124,-113, -31,-123, -94, -31,-122, -78, -31,-124,-113, -31,-123, -94, -31, +-122, -79, -31,-124,-113, -31,-123, -94, -31,-122, -80, -31,-124,-113, -31,-123, -94, -31,-122, -81, + -31,-124,-113, -31,-123, -94, -31,-122, -82, -31,-124,-113, -31,-123, -94, -31,-122, -83, -31,-124, +-113, -31,-123, -94, -31,-122, -84, -31,-124,-113, -31,-123, -94, -31,-122, -85, -31,-124,-113, -31, +-123, -94, -31,-122, -86, -31,-124,-113, -31,-123, -94, -31,-122, -87, -31,-124,-113, -31,-123, -94, + -31,-122, -88, -31,-124,-113, -31,-123, -95, -31,-121,-126, -31,-124,-113, -31,-123, -95, -31,-121, +-127, -31,-124,-113, -31,-123, -95, -31,-121,-128, -31,-124,-113, -31,-123, -95, -31,-122, -65, -31, +-124,-113, -31,-123, -95, -31,-122, -66, -31,-124,-113, -31,-123, -95, -31,-122, -67, -31,-124,-113, + -31,-123, -95, -31,-122, -68, -31,-124,-113, -31,-123, -95, -31,-122, -69, -31,-124,-113, -31,-123, + -95, -31,-122, -70, -31,-124,-113, -31,-123, -95, -31,-122, -71, -31,-124,-113, -31,-123, -95, -31, +-122, -72, -31,-124,-113, -31,-123, -95, -31,-122, -73, -31,-124,-113, -31,-123, -95, -31,-122, -74, + -31,-124,-113, -31,-123, -95, -31,-122, -75, -31,-124,-113, -31,-123, -95, -31,-122, -76, -31,-124, +-113, -31,-123, -95, -31,-122, -77, -31,-124,-113, -31,-123, -95, -31,-122, -78, -31,-124,-113, -31, +-123, -95, -31,-122, -79, -31,-124,-113, -31,-123, -95, -31,-122, -80, -31,-124,-113, -31,-123, -95, + -31,-122, -81, -31,-124,-113, -31,-123, -95, -31,-122, -82, -31,-124,-113, -31,-123, -95, -31,-122, + -83, -31,-124,-113, -31,-123, -95, -31,-122, -84, -31,-124,-113, -31,-123, -95, -31,-122, -85, -31, +-124,-113, -31,-123, -95, -31,-122, -86, -31,-124,-113, -31,-123, -95, -31,-122, -87, -31,-124,-113, + -31,-123, -95, -31,-122, -88, -31,-124,-114, -31,-123, -75, -31,-121,-126, -31,-124,-114, -31,-123, + -75, -31,-121,-127, -31,-124,-114, -31,-123, -75, -31,-121,-128, -31,-124,-114, -31,-123, -75, -31, +-122, -65, -31,-124,-114, -31,-123, -75, -31,-122, -66, -31,-124,-114, -31,-123, -75, -31,-122, -67, + -31,-124,-114, -31,-123, -75, -31,-122, -68, -31,-124,-114, -31,-123, -75, -31,-122, -69, -31,-124, +-114, -31,-123, -75, -31,-122, -70, -31,-124,-114, -31,-123, -75, -31,-122, -71, -31,-124,-114, -31, +-123, -75, -31,-122, -72, -31,-124,-114, -31,-123, -75, -31,-122, -73, -31,-124,-114, -31,-123, -75, + -31,-122, -74, -31,-124,-114, -31,-123, -75, -31,-122, -75, -31,-124,-114, -31,-123, -75, -31,-122, + -76, -31,-124,-114, -31,-123, -75, -31,-122, -77, -31,-124,-114, -31,-123, -75, -31,-122, -78, -31, +-124,-114, -31,-123, -75, -31,-122, -79, -31,-124,-114, -31,-123, -75, -31,-122, -80, -31,-124,-114, + -31,-123, -75, -31,-122, -81, -31,-124,-114, -31,-123, -75, -31,-122, -82, -31,-124,-114, -31,-123, + -75, -31,-122, -83, -31,-124,-114, -31,-123, -75, -31,-122, -84, -31,-124,-114, -31,-123, -75, -31, +-122, -85, -31,-124,-114, -31,-123, -75, -31,-122, -86, -31,-124,-114, -31,-123, -75, -31,-122, -87, + -31,-124,-114, -31,-123, -75, -31,-122, -88, -31,-124,-114, -31,-123, -76, -31,-121,-126, -31,-124, +-114, -31,-123, -76, -31,-121,-127, -31,-124,-114, -31,-123, -76, -31,-121,-128, -31,-124,-114, -31, +-123, -76, -31,-122, -65, -31,-124,-114, -31,-123, -76, -31,-122, -66, -31,-124,-114, -31,-123, -76, + -31,-122, -67, -31,-124,-114, -31,-123, -76, -31,-122, -68, -31,-124,-114, -31,-123, -76, -31,-122, + -69, -31,-124,-114, -31,-123, -76, -31,-122, -70, -31,-124,-114, -31,-123, -76, -31,-122, -71, -31, +-124,-114, -31,-123, -76, -31,-122, -72, -31,-124,-114, -31,-123, -76, -31,-122, -73, -31,-124,-114, + -31,-123, -76, -31,-122, -74, -31,-124,-114, -31,-123, -76, -31,-122, -75, -31,-124,-114, -31,-123, + -76, -31,-122, -76, -31,-124,-114, -31,-123, -76, -31,-122, -77, -31,-124,-114, -31,-123, -76, -31, +-122, -78, -31,-124,-114, -31,-123, -76, -31,-122, -79, -31,-124,-114, -31,-123, -76, -31,-122, -80, + -31,-124,-114, -31,-123, -76, -31,-122, -81, -31,-124,-114, -31,-123, -76, -31,-122, -82, -31,-124, +-114, -31,-123, -76, -31,-122, -83, -31,-124,-114, -31,-123, -76, -31,-122, -84, -31,-124,-114, -31, +-123, -76, -31,-122, -85, -31,-124,-114, -31,-123, -76, -31,-122, -86, -31,-124,-114, -31,-123, -76, + -31,-122, -87, -31,-124,-114, -31,-123, -76, -31,-122, -88, -31,-124,-114, -31,-123, -77, -31,-121, +-126, -31,-124,-114, -31,-123, -77, -31,-121,-127, -31,-124,-114, -31,-123, -77, -31,-121,-128, -31, +-124,-114, -31,-123, -77, -31,-122, -65, -31,-124,-114, -31,-123, -77, -31,-122, -66, -31,-124,-114, + -31,-123, -77, -31,-122, -67, -31,-124,-114, -31,-123, -77, -31,-122, -68, -31,-124,-114, -31,-123, + -77, -31,-122, -69, -31,-124,-114, -31,-123, -77, -31,-122, -70, -31,-124,-114, -31,-123, -77, -31, +-122, -71, -31,-124,-114, -31,-123, -77, -31,-122, -72, -31,-124,-114, -31,-123, -77, -31,-122, -73, + -31,-124,-114, -31,-123, -77, -31,-122, -74, -31,-124,-114, -31,-123, -77, -31,-122, -75, -31,-124, +-114, -31,-123, -77, -31,-122, -76, -31,-124,-114, -31,-123, -77, -31,-122, -77, -31,-124,-114, -31, +-123, -77, -31,-122, -78, -31,-124,-114, -31,-123, -77, -31,-122, -79, -31,-124,-114, -31,-123, -77, + -31,-122, -80, -31,-124,-114, -31,-123, -77, -31,-122, -81, -31,-124,-114, -31,-123, -77, -31,-122, + -82, -31,-124,-114, -31,-123, -77, -31,-122, -83, -31,-124,-114, -31,-123, -77, -31,-122, -84, -31, +-124,-114, -31,-123, -77, -31,-122, -85, -31,-124,-114, -31,-123, -77, -31,-122, -86, -31,-124,-114, + -31,-123, -77, -31,-122, -87, -31,-124,-114, -31,-123, -77, -31,-122, -88, -31,-124,-114, -31,-123, + -78, -31,-121,-126, -31,-124,-114, -31,-123, -78, -31,-121,-127, -31,-124,-114, -31,-123, -78, -31, +-121,-128, -31,-124,-114, -31,-123, -78, -31,-122, -65, -31,-124,-114, -31,-123, -78, -31,-122, -66, + -31,-124,-114, -31,-123, -78, -31,-122, -67, -31,-124,-114, -31,-123, -78, -31,-122, -68, -31,-124, +-114, -31,-123, -78, -31,-122, -69, -31,-124,-114, -31,-123, -78, -31,-122, -70, -31,-124,-114, -31, +-123, -78, -31,-122, -71, -31,-124,-114, -31,-123, -78, -31,-122, -72, -31,-124,-114, -31,-123, -78, + -31,-122, -73, -31,-124,-114, -31,-123, -78, -31,-122, -74, -31,-124,-114, -31,-123, -78, -31,-122, + -75, -31,-124,-114, -31,-123, -78, -31,-122, -76, -31,-124,-114, -31,-123, -78, -31,-122, -77, -31, +-124,-114, -31,-123, -78, -31,-122, -78, -31,-124,-114, -31,-123, -78, -31,-122, -79, -31,-124,-114, + -31,-123, -78, -31,-122, -80, -31,-124,-114, -31,-123, -78, -31,-122, -81, -31,-124,-114, -31,-123, + -78, -31,-122, -82, -31,-124,-114, -31,-123, -78, -31,-122, -83, -31,-124,-114, -31,-123, -78, -31, +-122, -84, -31,-124,-114, -31,-123, -78, -31,-122, -85, -31,-124,-114, -31,-123, -78, -31,-122, -86, + -31,-124,-114, -31,-123, -78, -31,-122, -87, -31,-124,-114, -31,-123, -78, -31,-122, -88, -31,-124, +-114, -31,-123, -79, -31,-121,-126, -31,-124,-114, -31,-123, -79, -31,-121,-127, -31,-124,-114, -31, +-123, -79, -31,-121,-128, -31,-124,-114, -31,-123, -79, -31,-122, -65, -31,-124,-114, -31,-123, -79, + -31,-122, -66, -31,-124,-114, -31,-123, -79, -31,-122, -67, -31,-124,-114, -31,-123, -79, -31,-122, + -68, -31,-124,-114, -31,-123, -79, -31,-122, -69, -31,-124,-114, -31,-123, -79, -31,-122, -70, -31, +-124,-114, -31,-123, -79, -31,-122, -71, -31,-124,-114, -31,-123, -79, -31,-122, -72, -31,-124,-114, + -31,-123, -79, -31,-122, -73, -31,-124,-114, -31,-123, -79, -31,-122, -74, -31,-124,-114, -31,-123, + -79, -31,-122, -75, -31,-124,-114, -31,-123, -79, -31,-122, -76, -31,-124,-114, -31,-123, -79, -31, +-122, -77, -31,-124,-114, -31,-123, -79, -31,-122, -78, -31,-124,-114, -31,-123, -79, -31,-122, -79, + -31,-124,-114, -31,-123, -79, -31,-122, -80, -31,-124,-114, -31,-123, -79, -31,-122, -81, -31,-124, +-114, -31,-123, -79, -31,-122, -82, -31,-124,-114, -31,-123, -79, -31,-122, -83, -31,-124,-114, -31, +-123, -79, -31,-122, -84, -31,-124,-114, -31,-123, -79, -31,-122, -85, -31,-124,-114, -31,-123, -79, + -31,-122, -86, -31,-124,-114, -31,-123, -79, -31,-122, -87, -31,-124,-114, -31,-123, -79, -31,-122, + -88, -31,-124,-114, -31,-123, -80, -31,-121,-126, -31,-124,-114, -31,-123, -80, -31,-121,-127, -31, +-124,-114, -31,-123, -80, -31,-121,-128, -31,-124,-114, -31,-123, -80, -31,-122, -65, -31,-124,-114, + -31,-123, -80, -31,-122, -66, -31,-124,-114, -31,-123, -80, -31,-122, -67, -31,-124,-114, -31,-123, + -80, -31,-122, -68, -31,-124,-114, -31,-123, -80, -31,-122, -69, -31,-124,-114, -31,-123, -80, -31, +-122, -70, -31,-124,-114, -31,-123, -80, -31,-122, -71, -31,-124,-114, -31,-123, -80, -31,-122, -72, + -31,-124,-114, -31,-123, -80, -31,-122, -73, -31,-124,-114, -31,-123, -80, -31,-122, -74, -31,-124, +-114, -31,-123, -80, -31,-122, -75, -31,-124,-114, -31,-123, -80, -31,-122, -76, -31,-124,-114, -31, +-123, -80, -31,-122, -77, -31,-124,-114, -31,-123, -80, -31,-122, -78, -31,-124,-114, -31,-123, -80, + -31,-122, -79, -31,-124,-114, -31,-123, -80, -31,-122, -80, -31,-124,-114, -31,-123, -80, -31,-122, + -81, -31,-124,-114, -31,-123, -80, -31,-122, -82, -31,-124,-114, -31,-123, -80, -31,-122, -83, -31, +-124,-114, -31,-123, -80, -31,-122, -84, -31,-124,-114, -31,-123, -80, -31,-122, -85, -31,-124,-114, + -31,-123, -80, -31,-122, -86, -31,-124,-114, -31,-123, -80, -31,-122, -87, -31,-124,-114, -31,-123, + -80, -31,-122, -88, -31,-124,-114, -31,-123, -81, -31,-121,-126, -31,-124,-114, -31,-123, -81, -31, +-121,-127, -31,-124,-114, -31,-123, -81, -31,-121,-128, -31,-124,-114, -31,-123, -81, -31,-122, -65, + -31,-124,-114, -31,-123, -81, -31,-122, -66, -31,-124,-114, -31,-123, -81, -31,-122, -67, -31,-124, +-114, -31,-123, -81, -31,-122, -68, -31,-124,-114, -31,-123, -81, -31,-122, -69, -31,-124,-114, -31, +-123, -81, -31,-122, -70, -31,-124,-114, -31,-123, -81, -31,-122, -71, -31,-124,-114, -31,-123, -81, + -31,-122, -72, -31,-124,-114, -31,-123, -81, -31,-122, -73, -31,-124,-114, -31,-123, -81, -31,-122, + -74, -31,-124,-114, -31,-123, -81, -31,-122, -75, -31,-124,-114, -31,-123, -81, -31,-122, -76, -31, +-124,-114, -31,-123, -81, -31,-122, -77, -31,-124,-114, -31,-123, -81, -31,-122, -78, -31,-124,-114, + -31,-123, -81, -31,-122, -79, -31,-124,-114, -31,-123, -81, -31,-122, -80, -31,-124,-114, -31,-123, + -81, -31,-122, -81, -31,-124,-114, -31,-123, -81, -31,-122, -82, -31,-124,-114, -31,-123, -81, -31, +-122, -83, -31,-124,-114, -31,-123, -81, -31,-122, -84, -31,-124,-114, -31,-123, -81, -31,-122, -85, + -31,-124,-114, -31,-123, -81, -31,-122, -86, -31,-124,-114, -31,-123, -81, -31,-122, -87, -31,-124, +-114, -31,-123, -81, -31,-122, -88, -31,-124,-114, -31,-123, -82, -31,-121,-126, -31,-124,-114, -31, +-123, -82, -31,-121,-127, -31,-124,-114, -31,-123, -82, -31,-121,-128, -31,-124,-114, -31,-123, -82, + -31,-122, -65, -31,-124,-114, -31,-123, -82, -31,-122, -66, -31,-124,-114, -31,-123, -82, -31,-122, + -67, -31,-124,-114, -31,-123, -82, -31,-122, -68, -31,-124,-114, -31,-123, -82, -31,-122, -69, -31, +-124,-114, -31,-123, -82, -31,-122, -70, -31,-124,-114, -31,-123, -82, -31,-122, -71, -31,-124,-114, + -31,-123, -82, -31,-122, -72, -31,-124,-114, -31,-123, -82, -31,-122, -73, -31,-124,-114, -31,-123, + -82, -31,-122, -74, -31,-124,-114, -31,-123, -82, -31,-122, -75, -31,-124,-114, -31,-123, -82, -31, +-122, -76, -31,-124,-114, -31,-123, -82, -31,-122, -77, -31,-124,-114, -31,-123, -82, -31,-122, -78, + -31,-124,-114, -31,-123, -82, -31,-122, -79, -31,-124,-114, -31,-123, -82, -31,-122, -80, -31,-124, +-114, -31,-123, -82, -31,-122, -81, -31,-124,-114, -31,-123, -82, -31,-122, -82, -31,-124,-114, -31, +-123, -82, -31,-122, -83, -31,-124,-114, -31,-123, -82, -31,-122, -84, -31,-124,-114, -31,-123, -82, + -31,-122, -85, -31,-124,-114, -31,-123, -82, -31,-122, -86, -31,-124,-114, -31,-123, -82, -31,-122, + -87, -31,-124,-114, -31,-123, -82, -31,-122, -88, -31,-124,-114, -31,-123, -83, -31,-121,-126, -31, +-124,-114, -31,-123, -83, -31,-121,-127, -31,-124,-114, -31,-123, -83, -31,-121,-128, -31,-124,-114, + -31,-123, -83, -31,-122, -65, -31,-124,-114, -31,-123, -83, -31,-122, -66, -31,-124,-114, -31,-123, + -83, -31,-122, -67, -31,-124,-114, -31,-123, -83, -31,-122, -68, -31,-124,-114, -31,-123, -83, -31, +-122, -69, -31,-124,-114, -31,-123, -83, -31,-122, -70, -31,-124,-114, -31,-123, -83, -31,-122, -71, + -31,-124,-114, -31,-123, -83, -31,-122, -72, -31,-124,-114, -31,-123, -83, -31,-122, -73, -31,-124, +-114, -31,-123, -83, -31,-122, -74, -31,-124,-114, -31,-123, -83, -31,-122, -75, -31,-124,-114, -31, +-123, -83, -31,-122, -76, -31,-124,-114, -31,-123, -83, -31,-122, -77, -31,-124,-114, -31,-123, -83, + -31,-122, -78, -31,-124,-114, -31,-123, -83, -31,-122, -79, -31,-124,-114, -31,-123, -83, -31,-122, + -80, -31,-124,-114, -31,-123, -83, -31,-122, -81, -31,-124,-114, -31,-123, -83, -31,-122, -82, -31, +-124,-114, -31,-123, -83, -31,-122, -83, -31,-124,-114, -31,-123, -83, -31,-122, -84, -31,-124,-114, + -31,-123, -83, -31,-122, -85, -31,-124,-114, -31,-123, -83, -31,-122, -86, -31,-124,-114, -31,-123, + -83, -31,-122, -87, -31,-124,-114, -31,-123, -83, -31,-122, -88, -31,-124,-114, -31,-123, -84, -31, +-121,-126, -31,-124,-114, -31,-123, -84, -31,-121,-127, -31,-124,-114, -31,-123, -84, -31,-121,-128, + -31,-124,-114, -31,-123, -84, -31,-122, -65, -31,-124,-114, -31,-123, -84, -31,-122, -66, -31,-124, +-114, -31,-123, -84, -31,-122, -67, -31,-124,-114, -31,-123, -84, -31,-122, -68, -31,-124,-114, -31, +-123, -84, -31,-122, -69, -31,-124,-114, -31,-123, -84, -31,-122, -70, -31,-124,-114, -31,-123, -84, + -31,-122, -71, -31,-124,-114, -31,-123, -84, -31,-122, -72, -31,-124,-114, -31,-123, -84, -31,-122, + -73, -31,-124,-114, -31,-123, -84, -31,-122, -74, -31,-124,-114, -31,-123, -84, -31,-122, -75, -31, +-124,-114, -31,-123, -84, -31,-122, -76, -31,-124,-114, -31,-123, -84, -31,-122, -77, -31,-124,-114, + -31,-123, -84, -31,-122, -78, -31,-124,-114, -31,-123, -84, -31,-122, -79, -31,-124,-114, -31,-123, + -84, -31,-122, -80, -31,-124,-114, -31,-123, -84, -31,-122, -81, -31,-124,-114, -31,-123, -84, -31, +-122, -82, -31,-124,-114, -31,-123, -84, -31,-122, -83, -31,-124,-114, -31,-123, -84, -31,-122, -84, + -31,-124,-114, -31,-123, -84, -31,-122, -85, -31,-124,-114, -31,-123, -84, -31,-122, -86, -31,-124, +-114, -31,-123, -84, -31,-122, -87, -31,-124,-114, -31,-123, -84, -31,-122, -88, -31,-124,-114, -31, +-123, -85, -31,-121,-126, -31,-124,-114, -31,-123, -85, -31,-121,-127, -31,-124,-114, -31,-123, -85, + -31,-121,-128, -31,-124,-114, -31,-123, -85, -31,-122, -65, -31,-124,-114, -31,-123, -85, -31,-122, + -66, -31,-124,-114, -31,-123, -85, -31,-122, -67, -31,-124,-114, -31,-123, -85, -31,-122, -68, -31, +-124,-114, -31,-123, -85, -31,-122, -69, -31,-124,-114, -31,-123, -85, -31,-122, -70, -31,-124,-114, + -31,-123, -85, -31,-122, -71, -31,-124,-114, -31,-123, -85, -31,-122, -72, -31,-124,-114, -31,-123, + -85, -31,-122, -73, -31,-124,-114, -31,-123, -85, -31,-122, -74, -31,-124,-114, -31,-123, -85, -31, +-122, -75, -31,-124,-114, -31,-123, -85, -31,-122, -76, -31,-124,-114, -31,-123, -85, -31,-122, -77, + -31,-124,-114, -31,-123, -85, -31,-122, -78, -31,-124,-114, -31,-123, -85, -31,-122, -79, -31,-124, +-114, -31,-123, -85, -31,-122, -80, -31,-124,-114, -31,-123, -85, -31,-122, -81, -31,-124,-114, -31, +-123, -85, -31,-122, -82, -31,-124,-114, -31,-123, -85, -31,-122, -83, -31,-124,-114, -31,-123, -85, + -31,-122, -84, -31,-124,-114, -31,-123, -85, -31,-122, -85, -31,-124,-114, -31,-123, -85, -31,-122, + -86, -31,-124,-114, -31,-123, -85, -31,-122, -87, -31,-124,-114, -31,-123, -85, -31,-122, -88, -31, +-124,-114, -31,-123, -86, -31,-121,-126, -31,-124,-114, -31,-123, -86, -31,-121,-127, -31,-124,-114, + -31,-123, -86, -31,-121,-128, -31,-124,-114, -31,-123, -86, -31,-122, -65, -31,-124,-114, -31,-123, + -86, -31,-122, -66, -31,-124,-114, -31,-123, -86, -31,-122, -67, -31,-124,-114, -31,-123, -86, -31, +-122, -68, -31,-124,-114, -31,-123, -86, -31,-122, -69, -31,-124,-114, -31,-123, -86, -31,-122, -70, + -31,-124,-114, -31,-123, -86, -31,-122, -71, -31,-124,-114, -31,-123, -86, -31,-122, -72, -31,-124, +-114, -31,-123, -86, -31,-122, -73, -31,-124,-114, -31,-123, -86, -31,-122, -74, -31,-124,-114, -31, +-123, -86, -31,-122, -75, -31,-124,-114, -31,-123, -86, -31,-122, -76, -31,-124,-114, -31,-123, -86, + -31,-122, -77, -31,-124,-114, -31,-123, -86, -31,-122, -78, -31,-124,-114, -31,-123, -86, -31,-122, + -79, -31,-124,-114, -31,-123, -86, -31,-122, -80, -31,-124,-114, -31,-123, -86, -31,-122, -81, -31, +-124,-114, -31,-123, -86, -31,-122, -82, -31,-124,-114, -31,-123, -86, -31,-122, -83, -31,-124,-114, + -31,-123, -86, -31,-122, -84, -31,-124,-114, -31,-123, -86, -31,-122, -85, -31,-124,-114, -31,-123, + -86, -31,-122, -86, -31,-124,-114, -31,-123, -86, -31,-122, -87, -31,-124,-114, -31,-123, -86, -31, +-122, -88, -31,-124,-114, -31,-123, -87, -31,-121,-126, -31,-124,-114, -31,-123, -87, -31,-121,-127, + -31,-124,-114, -31,-123, -87, -31,-121,-128, -31,-124,-114, -31,-123, -87, -31,-122, -65, -31,-124, +-114, -31,-123, -87, -31,-122, -66, -31,-124,-114, -31,-123, -87, -31,-122, -67, -31,-124,-114, -31, +-123, -87, -31,-122, -68, -31,-124,-114, -31,-123, -87, -31,-122, -69, -31,-124,-114, -31,-123, -87, + -31,-122, -70, -31,-124,-114, -31,-123, -87, -31,-122, -71, -31,-124,-114, -31,-123, -87, -31,-122, + -72, -31,-124,-114, -31,-123, -87, -31,-122, -73, -31,-124,-114, -31,-123, -87, -31,-122, -74, -31, +-124,-114, -31,-123, -87, -31,-122, -75, -31,-124,-114, -31,-123, -87, -31,-122, -76, -31,-124,-114, + -31,-123, -87, -31,-122, -77, -31,-124,-114, -31,-123, -87, -31,-122, -78, -31,-124,-114, -31,-123, + -87, -31,-122, -79, -31,-124,-114, -31,-123, -87, -31,-122, -80, -31,-124,-114, -31,-123, -87, -31, +-122, -81, -31,-124,-114, -31,-123, -87, -31,-122, -82, -31,-124,-114, -31,-123, -87, -31,-122, -83, + -31,-124,-114, -31,-123, -87, -31,-122, -84, -31,-124,-114, -31,-123, -87, -31,-122, -85, -31,-124, +-114, -31,-123, -87, -31,-122, -86, -31,-124,-114, -31,-123, -87, -31,-122, -87, -31,-124,-114, -31, +-123, -87, -31,-122, -88, -31,-124,-114, -31,-123, -88, -31,-121,-126, -31,-124,-114, -31,-123, -88, + -31,-121,-127, -31,-124,-114, -31,-123, -88, -31,-121,-128, -31,-124,-114, -31,-123, -88, -31,-122, + -65, -31,-124,-114, -31,-123, -88, -31,-122, -66, -31,-124,-114, -31,-123, -88, -31,-122, -67, -31, +-124,-114, -31,-123, -88, -31,-122, -68, -31,-124,-114, -31,-123, -88, -31,-122, -69, -31,-124,-114, + -31,-123, -88, -31,-122, -70, -31,-124,-114, -31,-123, -88, -31,-122, -71, -31,-124,-114, -31,-123, + -88, -31,-122, -72, -31,-124,-114, -31,-123, -88, -31,-122, -73, -31,-124,-114, -31,-123, -88, -31, +-122, -74, -31,-124,-114, -31,-123, -88, -31,-122, -75, -31,-124,-114, -31,-123, -88, -31,-122, -76, + -31,-124,-114, -31,-123, -88, -31,-122, -77, -31,-124,-114, -31,-123, -88, -31,-122, -78, -31,-124, +-114, -31,-123, -88, -31,-122, -79, -31,-124,-114, -31,-123, -88, -31,-122, -80, -31,-124,-114, -31, +-123, -88, -31,-122, -81, -31,-124,-114, -31,-123, -88, -31,-122, -82, -31,-124,-114, -31,-123, -88, + -31,-122, -83, -31,-124,-114, -31,-123, -88, -31,-122, -84, -31,-124,-114, -31,-123, -88, -31,-122, + -85, -31,-124,-114, -31,-123, -88, -31,-122, -86, -31,-124,-114, -31,-123, -88, -31,-122, -87, -31, +-124,-114, -31,-123, -88, -31,-122, -88, -31,-124,-114, -31,-123, -89, -31,-121,-126, -31,-124,-114, + -31,-123, -89, -31,-121,-127, -31,-124,-114, -31,-123, -89, -31,-121,-128, -31,-124,-114, -31,-123, + -89, -31,-122, -65, -31,-124,-114, -31,-123, -89, -31,-122, -66, -31,-124,-114, -31,-123, -89, -31, +-122, -67, -31,-124,-114, -31,-123, -89, -31,-122, -68, -31,-124,-114, -31,-123, -89, -31,-122, -69, + -31,-124,-114, -31,-123, -89, -31,-122, -70, -31,-124,-114, -31,-123, -89, -31,-122, -71, -31,-124, +-114, -31,-123, -89, -31,-122, -72, -31,-124,-114, -31,-123, -89, -31,-122, -73, -31,-124,-114, -31, +-123, -89, -31,-122, -74, -31,-124,-114, -31,-123, -89, -31,-122, -75, -31,-124,-114, -31,-123, -89, + -31,-122, -76, -31,-124,-114, -31,-123, -89, -31,-122, -77, -31,-124,-114, -31,-123, -89, -31,-122, + -78, -31,-124,-114, -31,-123, -89, -31,-122, -79, -31,-124,-114, -31,-123, -89, -31,-122, -80, -31, +-124,-114, -31,-123, -89, -31,-122, -81, -31,-124,-114, -31,-123, -89, -31,-122, -82, -31,-124,-114, + -31,-123, -89, -31,-122, -83, -31,-124,-114, -31,-123, -89, -31,-122, -84, -31,-124,-114, -31,-123, + -89, -31,-122, -85, -31,-124,-114, -31,-123, -89, -31,-122, -86, -31,-124,-114, -31,-123, -89, -31, +-122, -87, -31,-124,-114, -31,-123, -89, -31,-122, -88, -31,-124,-114, -31,-123, -90, -31,-121,-126, + -31,-124,-114, -31,-123, -90, -31,-121,-127, -31,-124,-114, -31,-123, -90, -31,-121,-128, -31,-124, +-114, -31,-123, -90, -31,-122, -65, -31,-124,-114, -31,-123, -90, -31,-122, -66, -31,-124,-114, -31, +-123, -90, -31,-122, -67, -31,-124,-114, -31,-123, -90, -31,-122, -68, -31,-124,-114, -31,-123, -90, + -31,-122, -69, -31,-124,-114, -31,-123, -90, -31,-122, -70, -31,-124,-114, -31,-123, -90, -31,-122, + -71, -31,-124,-114, -31,-123, -90, -31,-122, -72, -31,-124,-114, -31,-123, -90, -31,-122, -73, -31, +-124,-114, -31,-123, -90, -31,-122, -74, -31,-124,-114, -31,-123, -90, -31,-122, -75, -31,-124,-114, + -31,-123, -90, -31,-122, -76, -31,-124,-114, -31,-123, -90, -31,-122, -77, -31,-124,-114, -31,-123, + -90, -31,-122, -78, -31,-124,-114, -31,-123, -90, -31,-122, -79, -31,-124,-114, -31,-123, -90, -31, +-122, -80, -31,-124,-114, -31,-123, -90, -31,-122, -81, -31,-124,-114, -31,-123, -90, -31,-122, -82, + -31,-124,-114, -31,-123, -90, -31,-122, -83, -31,-124,-114, -31,-123, -90, -31,-122, -84, -31,-124, +-114, -31,-123, -90, -31,-122, -85, -31,-124,-114, -31,-123, -90, -31,-122, -86, -31,-124,-114, -31, +-123, -90, -31,-122, -87, -31,-124,-114, -31,-123, -90, -31,-122, -88, -31,-124,-114, -31,-123, -91, + -31,-121,-126, -31,-124,-114, -31,-123, -91, -31,-121,-127, -31,-124,-114, -31,-123, -91, -31,-121, +-128, -31,-124,-114, -31,-123, -91, -31,-122, -65, -31,-124,-114, -31,-123, -91, -31,-122, -66, -31, +-124,-114, -31,-123, -91, -31,-122, -67, -31,-124,-114, -31,-123, -91, -31,-122, -68, -31,-124,-114, + -31,-123, -91, -31,-122, -69, -31,-124,-114, -31,-123, -91, -31,-122, -70, -31,-124,-114, -31,-123, + -91, -31,-122, -71, -31,-124,-114, -31,-123, -91, -31,-122, -72, -31,-124,-114, -31,-123, -91, -31, +-122, -73, -31,-124,-114, -31,-123, -91, -31,-122, -74, -31,-124,-114, -31,-123, -91, -31,-122, -75, + -31,-124,-114, -31,-123, -91, -31,-122, -76, -31,-124,-114, -31,-123, -91, -31,-122, -77, -31,-124, +-114, -31,-123, -91, -31,-122, -78, -31,-124,-114, -31,-123, -91, -31,-122, -79, -31,-124,-114, -31, +-123, -91, -31,-122, -80, -31,-124,-114, -31,-123, -91, -31,-122, -81, -31,-124,-114, -31,-123, -91, + -31,-122, -82, -31,-124,-114, -31,-123, -91, -31,-122, -83, -31,-124,-114, -31,-123, -91, -31,-122, + -84, -31,-124,-114, -31,-123, -91, -31,-122, -85, -31,-124,-114, -31,-123, -91, -31,-122, -86, -31, +-124,-114, -31,-123, -91, -31,-122, -87, -31,-124,-114, -31,-123, -91, -31,-122, -88, -31,-124,-114, + -31,-123, -92, -31,-121,-126, -31,-124,-114, -31,-123, -92, -31,-121,-127, -31,-124,-114, -31,-123, + -92, -31,-121,-128, -31,-124,-114, -31,-123, -92, -31,-122, -65, -31,-124,-114, -31,-123, -92, -31, +-122, -66, -31,-124,-114, -31,-123, -92, -31,-122, -67, -31,-124,-114, -31,-123, -92, -31,-122, -68, + -31,-124,-114, -31,-123, -92, -31,-122, -69, -31,-124,-114, -31,-123, -92, -31,-122, -70, -31,-124, +-114, -31,-123, -92, -31,-122, -71, -31,-124,-114, -31,-123, -92, -31,-122, -72, -31,-124,-114, -31, +-123, -92, -31,-122, -73, -31,-124,-114, -31,-123, -92, -31,-122, -74, -31,-124,-114, -31,-123, -92, + -31,-122, -75, -31,-124,-114, -31,-123, -92, -31,-122, -76, -31,-124,-114, -31,-123, -92, -31,-122, + -77, -31,-124,-114, -31,-123, -92, -31,-122, -78, -31,-124,-114, -31,-123, -92, -31,-122, -79, -31, +-124,-114, -31,-123, -92, -31,-122, -80, -31,-124,-114, -31,-123, -92, -31,-122, -81, -31,-124,-114, + -31,-123, -92, -31,-122, -82, -31,-124,-114, -31,-123, -92, -31,-122, -83, -31,-124,-114, -31,-123, + -92, -31,-122, -84, -31,-124,-114, -31,-123, -92, -31,-122, -85, -31,-124,-114, -31,-123, -92, -31, +-122, -86, -31,-124,-114, -31,-123, -92, -31,-122, -87, -31,-124,-114, -31,-123, -92, -31,-122, -88, + -31,-124,-114, -31,-123, -93, -31,-121,-126, -31,-124,-114, -31,-123, -93, -31,-121,-127, -31,-124, +-114, -31,-123, -93, -31,-121,-128, -31,-124,-114, -31,-123, -93, -31,-122, -65, -31,-124,-114, -31, +-123, -93, -31,-122, -66, -31,-124,-114, -31,-123, -93, -31,-122, -67, -31,-124,-114, -31,-123, -93, + -31,-122, -68, -31,-124,-114, -31,-123, -93, -31,-122, -69, -31,-124,-114, -31,-123, -93, -31,-122, + -70, -31,-124,-114, -31,-123, -93, -31,-122, -71, -31,-124,-114, -31,-123, -93, -31,-122, -72, -31, +-124,-114, -31,-123, -93, -31,-122, -73, -31,-124,-114, -31,-123, -93, -31,-122, -74, -31,-124,-114, + -31,-123, -93, -31,-122, -75, -31,-124,-114, -31,-123, -93, -31,-122, -76, -31,-124,-114, -31,-123, + -93, -31,-122, -77, -31,-124,-114, -31,-123, -93, -31,-122, -78, -31,-124,-114, -31,-123, -93, -31, +-122, -79, -31,-124,-114, -31,-123, -93, -31,-122, -80, -31,-124,-114, -31,-123, -93, -31,-122, -81, + -31,-124,-114, -31,-123, -93, -31,-122, -82, -31,-124,-114, -31,-123, -93, -31,-122, -83, -31,-124, +-114, -31,-123, -93, -31,-122, -84, -31,-124,-114, -31,-123, -93, -31,-122, -85, -31,-124,-114, -31, +-123, -93, -31,-122, -86, -31,-124,-114, -31,-123, -93, -31,-122, -87, -31,-124,-114, -31,-123, -93, + -31,-122, -88, -31,-124,-114, -31,-123, -94, -31,-121,-126, -31,-124,-114, -31,-123, -94, -31,-121, +-127, -31,-124,-114, -31,-123, -94, -31,-121,-128, -31,-124,-114, -31,-123, -94, -31,-122, -65, -31, +-124,-114, -31,-123, -94, -31,-122, -66, -31,-124,-114, -31,-123, -94, -31,-122, -67, -31,-124,-114, + -31,-123, -94, -31,-122, -68, -31,-124,-114, -31,-123, -94, -31,-122, -69, -31,-124,-114, -31,-123, + -94, -31,-122, -70, -31,-124,-114, -31,-123, -94, -31,-122, -71, -31,-124,-114, -31,-123, -94, -31, +-122, -72, -31,-124,-114, -31,-123, -94, -31,-122, -73, -31,-124,-114, -31,-123, -94, -31,-122, -74, + -31,-124,-114, -31,-123, -94, -31,-122, -75, -31,-124,-114, -31,-123, -94, -31,-122, -76, -31,-124, +-114, -31,-123, -94, -31,-122, -77, -31,-124,-114, -31,-123, -94, -31,-122, -78, -31,-124,-114, -31, +-123, -94, -31,-122, -79, -31,-124,-114, -31,-123, -94, -31,-122, -80, -31,-124,-114, -31,-123, -94, + -31,-122, -81, -31,-124,-114, -31,-123, -94, -31,-122, -82, -31,-124,-114, -31,-123, -94, -31,-122, + -83, -31,-124,-114, -31,-123, -94, -31,-122, -84, -31,-124,-114, -31,-123, -94, -31,-122, -85, -31, +-124,-114, -31,-123, -94, -31,-122, -86, -31,-124,-114, -31,-123, -94, -31,-122, -87, -31,-124,-114, + -31,-123, -94, -31,-122, -88, -31,-124,-114, -31,-123, -95, -31,-121,-126, -31,-124,-114, -31,-123, + -95, -31,-121,-127, -31,-124,-114, -31,-123, -95, -31,-121,-128, -31,-124,-114, -31,-123, -95, -31, +-122, -65, -31,-124,-114, -31,-123, -95, -31,-122, -66, -31,-124,-114, -31,-123, -95, -31,-122, -67, + -31,-124,-114, -31,-123, -95, -31,-122, -68, -31,-124,-114, -31,-123, -95, -31,-122, -69, -31,-124, +-114, -31,-123, -95, -31,-122, -70, -31,-124,-114, -31,-123, -95, -31,-122, -71, -31,-124,-114, -31, +-123, -95, -31,-122, -72, -31,-124,-114, -31,-123, -95, -31,-122, -74, -31,-124,-114, -31,-123, -95, + -31,-122, -75, -31,-124,-114, -31,-123, -95, -31,-122, -76, -31,-124,-114, -31,-123, -95, -31,-122, + -77, -31,-124,-114, -31,-123, -95, -31,-122, -78, -31,-124,-114, -31,-123, -95, -31,-122, -79, -31, +-124,-114, -31,-123, -95, -31,-122, -80, -31,-124,-114, -31,-123, -95, -31,-122, -81, -31,-124,-114, + -31,-123, -95, -31,-122, -82, -31,-124,-114, -31,-123, -95, -31,-122, -83, -31,-124,-114, -31,-123, + -95, -31,-122, -84, -31,-124,-114, -31,-123, -95, -31,-122, -85, -31,-124,-114, -31,-123, -95, -31, +-122, -86, -31,-124,-114, -31,-123, -95, -31,-122, -87, -31,-124,-114, -31,-123, -95, -31,-122, -88, + -31,-124,-115, -31,-123, -75, -31,-121,-126, -31,-124,-115, -31,-123, -75, -31,-121,-127, -31,-124, +-115, -31,-123, -75, -31,-121,-128, -31,-124,-115, -31,-123, -75, -31,-122, -65, -31,-124,-115, -31, +-123, -75, -31,-122, -66, -31,-124,-115, -31,-123, -75, -31,-122, -67, -31,-124,-115, -31,-123, -75, + -31,-122, -68, -31,-124,-115, -31,-123, -75, -31,-122, -69, -31,-124,-115, -31,-123, -75, -31,-122, + -70, -31,-124,-115, -31,-123, -75, -31,-122, -71, -31,-124,-115, -31,-123, -75, -31,-122, -72, -31, +-124,-115, -31,-123, -75, -31,-122, -73, -31,-124,-115, -31,-123, -75, -31,-122, -74, -31,-124,-115, + -31,-123, -75, -31,-122, -75, -31,-124,-115, -31,-123, -75, -31,-122, -76, -31,-124,-115, -31,-123, + -75, -31,-122, -77, -31,-124,-115, -31,-123, -75, -31,-122, -78, -31,-124,-115, -31,-123, -75, -31, +-122, -79, -31,-124,-115, -31,-123, -75, -31,-122, -80, -31,-124,-115, -31,-123, -75, -31,-122, -81, + -31,-124,-115, -31,-123, -75, -31,-122, -82, -31,-124,-115, -31,-123, -75, -31,-122, -83, -31,-124, +-115, -31,-123, -75, -31,-122, -84, -31,-124,-115, -31,-123, -75, -31,-122, -85, -31,-124,-115, -31, +-123, -75, -31,-122, -86, -31,-124,-115, -31,-123, -75, -31,-122, -87, -31,-124,-115, -31,-123, -75, + -31,-122, -88, -31,-124,-115, -31,-123, -76, -31,-121,-126, -31,-124,-115, -31,-123, -76, -31,-121, +-127, -31,-124,-115, -31,-123, -76, -31,-121,-128, -31,-124,-115, -31,-123, -76, -31,-122, -65, -31, +-124,-115, -31,-123, -76, -31,-122, -66, -31,-124,-115, -31,-123, -76, -31,-122, -67, -31,-124,-115, + -31,-123, -76, -31,-122, -68, -31,-124,-115, -31,-123, -76, -31,-122, -69, -31,-124,-115, -31,-123, + -76, -31,-122, -70, -31,-124,-115, -31,-123, -76, -31,-122, -71, -31,-124,-115, -31,-123, -76, -31, +-122, -72, -31,-124,-115, -31,-123, -76, -31,-122, -73, -31,-124,-115, -31,-123, -76, -31,-122, -74, + -31,-124,-115, -31,-123, -76, -31,-122, -75, -31,-124,-115, -31,-123, -76, -31,-122, -76, -31,-124, +-115, -31,-123, -76, -31,-122, -77, -31,-124,-115, -31,-123, -76, -31,-122, -78, -31,-124,-115, -31, +-123, -76, -31,-122, -79, -31,-124,-115, -31,-123, -76, -31,-122, -80, -31,-124,-115, -31,-123, -76, + -31,-122, -81, -31,-124,-115, -31,-123, -76, -31,-122, -82, -31,-124,-115, -31,-123, -76, -31,-122, + -83, -31,-124,-115, -31,-123, -76, -31,-122, -84, -31,-124,-115, -31,-123, -76, -31,-122, -85, -31, +-124,-115, -31,-123, -76, -31,-122, -86, -31,-124,-115, -31,-123, -76, -31,-122, -87, -31,-124,-115, + -31,-123, -76, -31,-122, -88, -31,-124,-115, -31,-123, -77, -31,-121,-126, -31,-124,-115, -31,-123, + -77, -31,-121,-127, -31,-124,-115, -31,-123, -77, -31,-121,-128, -31,-124,-115, -31,-123, -77, -31, +-122, -65, -31,-124,-115, -31,-123, -77, -31,-122, -66, -31,-124,-115, -31,-123, -77, -31,-122, -67, + -31,-124,-115, -31,-123, -77, -31,-122, -68, -31,-124,-115, -31,-123, -77, -31,-122, -69, -31,-124, +-115, -31,-123, -77, -31,-122, -70, -31,-124,-115, -31,-123, -77, -31,-122, -71, -31,-124,-115, -31, +-123, -77, -31,-122, -72, -31,-124,-115, -31,-123, -77, -31,-122, -73, -31,-124,-115, -31,-123, -77, + -31,-122, -74, -31,-124,-115, -31,-123, -77, -31,-122, -75, -31,-124,-115, -31,-123, -77, -31,-122, + -76, -31,-124,-115, -31,-123, -77, -31,-122, -77, -31,-124,-115, -31,-123, -77, -31,-122, -78, -31, +-124,-115, -31,-123, -77, -31,-122, -79, -31,-124,-115, -31,-123, -77, -31,-122, -80, -31,-124,-115, + -31,-123, -77, -31,-122, -81, -31,-124,-115, -31,-123, -77, -31,-122, -82, -31,-124,-115, -31,-123, + -77, -31,-122, -83, -31,-124,-115, -31,-123, -77, -31,-122, -84, -31,-124,-115, -31,-123, -77, -31, +-122, -85, -31,-124,-115, -31,-123, -77, -31,-122, -86, -31,-124,-115, -31,-123, -77, -31,-122, -87, + -31,-124,-115, -31,-123, -77, -31,-122, -88, -31,-124,-115, -31,-123, -78, -31,-121,-126, -31,-124, +-115, -31,-123, -78, -31,-121,-127, -31,-124,-115, -31,-123, -78, -31,-121,-128, -31,-124,-115, -31, +-123, -78, -31,-122, -65, -31,-124,-115, -31,-123, -78, -31,-122, -66, -31,-124,-115, -31,-123, -78, + -31,-122, -67, -31,-124,-115, -31,-123, -78, -31,-122, -68, -31,-124,-115, -31,-123, -78, -31,-122, + -69, -31,-124,-115, -31,-123, -78, -31,-122, -70, -31,-124,-115, -31,-123, -78, -31,-122, -71, -31, +-124,-115, -31,-123, -78, -31,-122, -72, -31,-124,-115, -31,-123, -78, -31,-122, -73, -31,-124,-115, + -31,-123, -78, -31,-122, -74, -31,-124,-115, -31,-123, -78, -31,-122, -75, -31,-124,-115, -31,-123, + -78, -31,-122, -76, -31,-124,-115, -31,-123, -78, -31,-122, -77, -31,-124,-115, -31,-123, -78, -31, +-122, -78, -31,-124,-115, -31,-123, -78, -31,-122, -79, -31,-124,-115, -31,-123, -78, -31,-122, -80, + -31,-124,-115, -31,-123, -78, -31,-122, -81, -31,-124,-115, -31,-123, -78, -31,-122, -82, -31,-124, +-115, -31,-123, -78, -31,-122, -83, -31,-124,-115, -31,-123, -78, -31,-122, -84, -31,-124,-115, -31, +-123, -78, -31,-122, -85, -31,-124,-115, -31,-123, -78, -31,-122, -86, -31,-124,-115, -31,-123, -78, + -31,-122, -87, -31,-124,-115, -31,-123, -78, -31,-122, -88, -31,-124,-115, -31,-123, -79, -31,-121, +-126, -31,-124,-115, -31,-123, -79, -31,-121,-127, -31,-124,-115, -31,-123, -79, -31,-121,-128, -31, +-124,-115, -31,-123, -79, -31,-122, -65, -31,-124,-115, -31,-123, -79, -31,-122, -66, -31,-124,-115, + -31,-123, -79, -31,-122, -67, -31,-124,-115, -31,-123, -79, -31,-122, -68, -31,-124,-115, -31,-123, + -79, -31,-122, -69, -31,-124,-115, -31,-123, -79, -31,-122, -70, -31,-124,-115, -31,-123, -79, -31, +-122, -71, -31,-124,-115, -31,-123, -79, -31,-122, -72, -31,-124,-115, -31,-123, -79, -31,-122, -73, + -31,-124,-115, -31,-123, -79, -31,-122, -74, -31,-124,-115, -31,-123, -79, -31,-122, -75, -31,-124, +-115, -31,-123, -79, -31,-122, -76, -31,-124,-115, -31,-123, -79, -31,-122, -77, -31,-124,-115, -31, +-123, -79, -31,-122, -78, -31,-124,-115, -31,-123, -79, -31,-122, -79, -31,-124,-115, -31,-123, -79, + -31,-122, -80, -31,-124,-115, -31,-123, -79, -31,-122, -81, -31,-124,-115, -31,-123, -79, -31,-122, + -82, -31,-124,-115, -31,-123, -79, -31,-122, -83, -31,-124,-115, -31,-123, -79, -31,-122, -84, -31, +-124,-115, -31,-123, -79, -31,-122, -85, -31,-124,-115, -31,-123, -79, -31,-122, -86, -31,-124,-115, + -31,-123, -79, -31,-122, -87, -31,-124,-115, -31,-123, -79, -31,-122, -88, -31,-124,-115, -31,-123, + -80, -31,-121,-126, -31,-124,-115, -31,-123, -80, -31,-121,-127, -31,-124,-115, -31,-123, -80, -31, +-121,-128, -31,-124,-115, -31,-123, -80, -31,-122, -65, -31,-124,-115, -31,-123, -80, -31,-122, -66, + -31,-124,-115, -31,-123, -80, -31,-122, -67, -31,-124,-115, -31,-123, -80, -31,-122, -68, -31,-124, +-115, -31,-123, -80, -31,-122, -69, -31,-124,-115, -31,-123, -80, -31,-122, -70, -31,-124,-115, -31, +-123, -80, -31,-122, -71, -31,-124,-115, -31,-123, -80, -31,-122, -72, -31,-124,-115, -31,-123, -80, + -31,-122, -73, -31,-124,-115, -31,-123, -80, -31,-122, -74, -31,-124,-115, -31,-123, -80, -31,-122, + -75, -31,-124,-115, -31,-123, -80, -31,-122, -76, -31,-124,-115, -31,-123, -80, -31,-122, -77, -31, +-124,-115, -31,-123, -80, -31,-122, -78, -31,-124,-115, -31,-123, -80, -31,-122, -79, -31,-124,-115, + -31,-123, -80, -31,-122, -80, -31,-124,-115, -31,-123, -80, -31,-122, -81, -31,-124,-115, -31,-123, + -80, -31,-122, -82, -31,-124,-115, -31,-123, -80, -31,-122, -83, -31,-124,-115, -31,-123, -80, -31, +-122, -84, -31,-124,-115, -31,-123, -80, -31,-122, -85, -31,-124,-115, -31,-123, -80, -31,-122, -86, + -31,-124,-115, -31,-123, -80, -31,-122, -87, -31,-124,-115, -31,-123, -80, -31,-122, -88, -31,-124, +-115, -31,-123, -81, -31,-121,-126, -31,-124,-115, -31,-123, -81, -31,-121,-127, -31,-124,-115, -31, +-123, -81, -31,-121,-128, -31,-124,-115, -31,-123, -81, -31,-122, -65, -31,-124,-115, -31,-123, -81, + -31,-122, -66, -31,-124,-115, -31,-123, -81, -31,-122, -67, -31,-124,-115, -31,-123, -81, -31,-122, + -68, -31,-124,-115, -31,-123, -81, -31,-122, -69, -31,-124,-115, -31,-123, -81, -31,-122, -70, -31, +-124,-115, -31,-123, -81, -31,-122, -71, -31,-124,-115, -31,-123, -81, -31,-122, -72, -31,-124,-115, + -31,-123, -81, -31,-122, -73, -31,-124,-115, -31,-123, -81, -31,-122, -74, -31,-124,-115, -31,-123, + -81, -31,-122, -75, -31,-124,-115, -31,-123, -81, -31,-122, -76, -31,-124,-115, -31,-123, -81, -31, +-122, -77, -31,-124,-115, -31,-123, -81, -31,-122, -78, -31,-124,-115, -31,-123, -81, -31,-122, -79, + -31,-124,-115, -31,-123, -81, -31,-122, -80, -31,-124,-115, -31,-123, -81, -31,-122, -81, -31,-124, +-115, -31,-123, -81, -31,-122, -82, -31,-124,-115, -31,-123, -81, -31,-122, -83, -31,-124,-115, -31, +-123, -81, -31,-122, -84, -31,-124,-115, -31,-123, -81, -31,-122, -85, -31,-124,-115, -31,-123, -81, + -31,-122, -86, -31,-124,-115, -31,-123, -81, -31,-122, -87, -31,-124,-115, -31,-123, -81, -31,-122, + -88, -31,-124,-115, -31,-123, -82, -31,-121,-126, -31,-124,-115, -31,-123, -82, -31,-121,-127, -31, +-124,-115, -31,-123, -82, -31,-121,-128, -31,-124,-115, -31,-123, -82, -31,-122, -65, -31,-124,-115, + -31,-123, -82, -31,-122, -66, -31,-124,-115, -31,-123, -82, -31,-122, -67, -31,-124,-115, -31,-123, + -82, -31,-122, -68, -31,-124,-115, -31,-123, -82, -31,-122, -69, -31,-124,-115, -31,-123, -82, -31, +-122, -70, -31,-124,-115, -31,-123, -82, -31,-122, -71, -31,-124,-115, -31,-123, -82, -31,-122, -72, + -31,-124,-115, -31,-123, -82, -31,-122, -73, -31,-124,-115, -31,-123, -82, -31,-122, -74, -31,-124, +-115, -31,-123, -82, -31,-122, -75, -31,-124,-115, -31,-123, -82, -31,-122, -76, -31,-124,-115, -31, +-123, -82, -31,-122, -77, -31,-124,-115, -31,-123, -82, -31,-122, -78, -31,-124,-115, -31,-123, -82, + -31,-122, -79, -31,-124,-115, -31,-123, -82, -31,-122, -80, -31,-124,-115, -31,-123, -82, -31,-122, + -81, -31,-124,-115, -31,-123, -82, -31,-122, -82, -31,-124,-115, -31,-123, -82, -31,-122, -83, -31, +-124,-115, -31,-123, -82, -31,-122, -84, -31,-124,-115, -31,-123, -82, -31,-122, -85, -31,-124,-115, + -31,-123, -82, -31,-122, -86, -31,-124,-115, -31,-123, -82, -31,-122, -87, -31,-124,-115, -31,-123, + -82, -31,-122, -88, -31,-124,-115, -31,-123, -83, -31,-121,-126, -31,-124,-115, -31,-123, -83, -31, +-121,-127, -31,-124,-115, -31,-123, -83, -31,-121,-128, -31,-124,-115, -31,-123, -83, -31,-122, -65, + -31,-124,-115, -31,-123, -83, -31,-122, -66, -31,-124,-115, -31,-123, -83, -31,-122, -67, -31,-124, +-115, -31,-123, -83, -31,-122, -68, -31,-124,-115, -31,-123, -83, -31,-122, -69, -31,-124,-115, -31, +-123, -83, -31,-122, -70, -31,-124,-115, -31,-123, -83, -31,-122, -71, -31,-124,-115, -31,-123, -83, + -31,-122, -72, -31,-124,-115, -31,-123, -83, -31,-122, -73, -31,-124,-115, -31,-123, -83, -31,-122, + -74, -31,-124,-115, -31,-123, -83, -31,-122, -75, -31,-124,-115, -31,-123, -83, -31,-122, -76, -31, +-124,-115, -31,-123, -83, -31,-122, -77, -31,-124,-115, -31,-123, -83, -31,-122, -78, -31,-124,-115, + -31,-123, -83, -31,-122, -79, -31,-124,-115, -31,-123, -83, -31,-122, -80, -31,-124,-115, -31,-123, + -83, -31,-122, -81, -31,-124,-115, -31,-123, -83, -31,-122, -82, -31,-124,-115, -31,-123, -83, -31, +-122, -83, -31,-124,-115, -31,-123, -83, -31,-122, -84, -31,-124,-115, -31,-123, -83, -31,-122, -85, + -31,-124,-115, -31,-123, -83, -31,-122, -86, -31,-124,-115, -31,-123, -83, -31,-122, -87, -31,-124, +-115, -31,-123, -83, -31,-122, -88, -31,-124,-115, -31,-123, -84, -31,-121,-126, -31,-124,-115, -31, +-123, -84, -31,-121,-127, -31,-124,-115, -31,-123, -84, -31,-121,-128, -31,-124,-115, -31,-123, -84, + -31,-122, -65, -31,-124,-115, -31,-123, -84, -31,-122, -66, -31,-124,-115, -31,-123, -84, -31,-122, + -67, -31,-124,-115, -31,-123, -84, -31,-122, -68, -31,-124,-115, -31,-123, -84, -31,-122, -69, -31, +-124,-115, -31,-123, -84, -31,-122, -70, -31,-124,-115, -31,-123, -84, -31,-122, -71, -31,-124,-115, + -31,-123, -84, -31,-122, -72, -31,-124,-115, -31,-123, -84, -31,-122, -73, -31,-124,-115, -31,-123, + -84, -31,-122, -74, -31,-124,-115, -31,-123, -84, -31,-122, -75, -31,-124,-115, -31,-123, -84, -31, +-122, -76, -31,-124,-115, -31,-123, -84, -31,-122, -77, -31,-124,-115, -31,-123, -84, -31,-122, -78, + -31,-124,-115, -31,-123, -84, -31,-122, -79, -31,-124,-115, -31,-123, -84, -31,-122, -80, -31,-124, +-115, -31,-123, -84, -31,-122, -81, -31,-124,-115, -31,-123, -84, -31,-122, -82, -31,-124,-115, -31, +-123, -84, -31,-122, -83, -31,-124,-115, -31,-123, -84, -31,-122, -84, -31,-124,-115, -31,-123, -84, + -31,-122, -85, -31,-124,-115, -31,-123, -84, -31,-122, -86, -31,-124,-115, -31,-123, -84, -31,-122, + -87, -31,-124,-115, -31,-123, -84, -31,-122, -88, -31,-124,-115, -31,-123, -85, -31,-121,-126, -31, +-124,-115, -31,-123, -85, -31,-121,-127, -31,-124,-115, -31,-123, -85, -31,-121,-128, -31,-124,-115, + -31,-123, -85, -31,-122, -65, -31,-124,-115, -31,-123, -85, -31,-122, -66, -31,-124,-115, -31,-123, + -85, -31,-122, -67, -31,-124,-115, -31,-123, -85, -31,-122, -68, -31,-124,-115, -31,-123, -85, -31, +-122, -69, -31,-124,-115, -31,-123, -85, -31,-122, -70, -31,-124,-115, -31,-123, -85, -31,-122, -71, + -31,-124,-115, -31,-123, -85, -31,-122, -72, -31,-124,-115, -31,-123, -85, -31,-122, -73, -31,-124, +-115, -31,-123, -85, -31,-122, -74, -31,-124,-115, -31,-123, -85, -31,-122, -75, -31,-124,-115, -31, +-123, -85, -31,-122, -76, -31,-124,-115, -31,-123, -85, -31,-122, -77, -31,-124,-115, -31,-123, -85, + -31,-122, -78, -31,-124,-115, -31,-123, -85, -31,-122, -79, -31,-124,-115, -31,-123, -85, -31,-122, + -80, -31,-124,-115, -31,-123, -85, -31,-122, -81, -31,-124,-115, -31,-123, -85, -31,-122, -82, -31, +-124,-115, -31,-123, -85, -31,-122, -83, -31,-124,-115, -31,-123, -85, -31,-122, -84, -31,-124,-115, + -31,-123, -85, -31,-122, -85, -31,-124,-115, -31,-123, -85, -31,-122, -86, -31,-124,-115, -31,-123, + -85, -31,-122, -87, -31,-124,-115, -31,-123, -85, -31,-122, -88, -31,-124,-115, -31,-123, -86, -31, +-121,-126, -31,-124,-115, -31,-123, -86, -31,-121,-127, -31,-124,-115, -31,-123, -86, -31,-121,-128, + -31,-124,-115, -31,-123, -86, -31,-122, -65, -31,-124,-115, -31,-123, -86, -31,-122, -66, -31,-124, +-115, -31,-123, -86, -31,-122, -67, -31,-124,-115, -31,-123, -86, -31,-122, -68, -31,-124,-115, -31, +-123, -86, -31,-122, -69, -31,-124,-115, -31,-123, -86, -31,-122, -70, -31,-124,-115, -31,-123, -86, + -31,-122, -71, -31,-124,-115, -31,-123, -86, -31,-122, -72, -31,-124,-115, -31,-123, -86, -31,-122, + -73, -31,-124,-115, -31,-123, -86, -31,-122, -74, -31,-124,-115, -31,-123, -86, -31,-122, -75, -31, +-124,-115, -31,-123, -86, -31,-122, -76, -31,-124,-115, -31,-123, -86, -31,-122, -77, -31,-124,-115, + -31,-123, -86, -31,-122, -78, -31,-124,-115, -31,-123, -86, -31,-122, -79, -31,-124,-115, -31,-123, + -86, -31,-122, -80, -31,-124,-115, -31,-123, -86, -31,-122, -81, -31,-124,-115, -31,-123, -86, -31, +-122, -82, -31,-124,-115, -31,-123, -86, -31,-122, -83, -31,-124,-115, -31,-123, -86, -31,-122, -84, + -31,-124,-115, -31,-123, -86, -31,-122, -85, -31,-124,-115, -31,-123, -86, -31,-122, -86, -31,-124, +-115, -31,-123, -86, -31,-122, -87, -31,-124,-115, -31,-123, -86, -31,-122, -88, -31,-124,-115, -31, +-123, -87, -31,-121,-126, -31,-124,-115, -31,-123, -87, -31,-121,-127, -31,-124,-115, -31,-123, -87, + -31,-121,-128, -31,-124,-115, -31,-123, -87, -31,-122, -65, -31,-124,-115, -31,-123, -87, -31,-122, + -66, -31,-124,-115, -31,-123, -87, -31,-122, -67, -31,-124,-115, -31,-123, -87, -31,-122, -68, -31, +-124,-115, -31,-123, -87, -31,-122, -69, -31,-124,-115, -31,-123, -87, -31,-122, -70, -31,-124,-115, + -31,-123, -87, -31,-122, -71, -31,-124,-115, -31,-123, -87, -31,-122, -72, -31,-124,-115, -31,-123, + -87, -31,-122, -73, -31,-124,-115, -31,-123, -87, -31,-122, -74, -31,-124,-115, -31,-123, -87, -31, +-122, -75, -31,-124,-115, -31,-123, -87, -31,-122, -76, -31,-124,-115, -31,-123, -87, -31,-122, -77, + -31,-124,-115, -31,-123, -87, -31,-122, -78, -31,-124,-115, -31,-123, -87, -31,-122, -79, -31,-124, +-115, -31,-123, -87, -31,-122, -80, -31,-124,-115, -31,-123, -87, -31,-122, -81, -31,-124,-115, -31, +-123, -87, -31,-122, -82, -31,-124,-115, -31,-123, -87, -31,-122, -83, -31,-124,-115, -31,-123, -87, + -31,-122, -84, -31,-124,-115, -31,-123, -87, -31,-122, -85, -31,-124,-115, -31,-123, -87, -31,-122, + -86, -31,-124,-115, -31,-123, -87, -31,-122, -87, -31,-124,-115, -31,-123, -87, -31,-122, -88, -31, +-124,-115, -31,-123, -88, -31,-121,-126, -31,-124,-115, -31,-123, -88, -31,-121,-127, -31,-124,-115, + -31,-123, -88, -31,-121,-128, -31,-124,-115, -31,-123, -88, -31,-122, -65, -31,-124,-115, -31,-123, + -88, -31,-122, -66, -31,-124,-115, -31,-123, -88, -31,-122, -67, -31,-124,-115, -31,-123, -88, -31, +-122, -68, -31,-124,-115, -31,-123, -88, -31,-122, -69, -31,-124,-115, -31,-123, -88, -31,-122, -70, + -31,-124,-115, -31,-123, -88, -31,-122, -71, -31,-124,-115, -31,-123, -88, -31,-122, -72, -31,-124, +-115, -31,-123, -88, -31,-122, -73, -31,-124,-115, -31,-123, -88, -31,-122, -74, -31,-124,-115, -31, +-123, -88, -31,-122, -75, -31,-124,-115, -31,-123, -88, -31,-122, -76, -31,-124,-115, -31,-123, -88, + -31,-122, -77, -31,-124,-115, -31,-123, -88, -31,-122, -78, -31,-124,-115, -31,-123, -88, -31,-122, + -79, -31,-124,-115, -31,-123, -88, -31,-122, -80, -31,-124,-115, -31,-123, -88, -31,-122, -81, -31, +-124,-115, -31,-123, -88, -31,-122, -82, -31,-124,-115, -31,-123, -88, -31,-122, -83, -31,-124,-115, + -31,-123, -88, -31,-122, -84, -31,-124,-115, -31,-123, -88, -31,-122, -85, -31,-124,-115, -31,-123, + -88, -31,-122, -86, -31,-124,-115, -31,-123, -88, -31,-122, -87, -31,-124,-115, -31,-123, -88, -31, +-122, -88, -31,-124,-115, -31,-123, -89, -31,-121,-126, -31,-124,-115, -31,-123, -89, -31,-121,-127, + -31,-124,-115, -31,-123, -89, -31,-121,-128, -31,-124,-115, -31,-123, -89, -31,-122, -65, -31,-124, +-115, -31,-123, -89, -31,-122, -66, -31,-124,-115, -31,-123, -89, -31,-122, -67, -31,-124,-115, -31, +-123, -89, -31,-122, -68, -31,-124,-115, -31,-123, -89, -31,-122, -69, -31,-124,-115, -31,-123, -89, + -31,-122, -70, -31,-124,-115, -31,-123, -89, -31,-122, -71, -31,-124,-115, -31,-123, -89, -31,-122, + -72, -31,-124,-115, -31,-123, -89, -31,-122, -73, -31,-124,-115, -31,-123, -89, -31,-122, -74, -31, +-124,-115, -31,-123, -89, -31,-122, -75, -31,-124,-115, -31,-123, -89, -31,-122, -76, -31,-124,-115, + -31,-123, -89, -31,-122, -77, -31,-124,-115, -31,-123, -89, -31,-122, -78, -31,-124,-115, -31,-123, + -89, -31,-122, -79, -31,-124,-115, -31,-123, -89, -31,-122, -80, -31,-124,-115, -31,-123, -89, -31, +-122, -81, -31,-124,-115, -31,-123, -89, -31,-122, -82, -31,-124,-115, -31,-123, -89, -31,-122, -83, + -31,-124,-115, -31,-123, -89, -31,-122, -84, -31,-124,-115, -31,-123, -89, -31,-122, -85, -31,-124, +-115, -31,-123, -89, -31,-122, -86, -31,-124,-115, -31,-123, -89, -31,-122, -87, -31,-124,-115, -31, +-123, -89, -31,-122, -88, -31,-124,-115, -31,-123, -90, -31,-121,-126, -31,-124,-115, -31,-123, -90, + -31,-121,-127, -31,-124,-115, -31,-123, -90, -31,-121,-128, -31,-124,-115, -31,-123, -90, -31,-122, + -65, -31,-124,-115, -31,-123, -90, -31,-122, -66, -31,-124,-115, -31,-123, -90, -31,-122, -67, -31, +-124,-115, -31,-123, -90, -31,-122, -68, -31,-124,-115, -31,-123, -90, -31,-122, -69, -31,-124,-115, + -31,-123, -90, -31,-122, -70, -31,-124,-115, -31,-123, -90, -31,-122, -71, -31,-124,-115, -31,-123, + -90, -31,-122, -72, -31,-124,-115, -31,-123, -90, -31,-122, -73, -31,-124,-115, -31,-123, -90, -31, +-122, -74, -31,-124,-115, -31,-123, -90, -31,-122, -75, -31,-124,-115, -31,-123, -90, -31,-122, -76, + -31,-124,-115, -31,-123, -90, -31,-122, -77, -31,-124,-115, -31,-123, -90, -31,-122, -78, -31,-124, +-115, -31,-123, -90, -31,-122, -79, -31,-124,-115, -31,-123, -90, -31,-122, -80, -31,-124,-115, -31, +-123, -90, -31,-122, -81, -31,-124,-115, -31,-123, -90, -31,-122, -82, -31,-124,-115, -31,-123, -90, + -31,-122, -83, -31,-124,-115, -31,-123, -90, -31,-122, -84, -31,-124,-115, -31,-123, -90, -31,-122, + -85, -31,-124,-115, -31,-123, -90, -31,-122, -86, -31,-124,-115, -31,-123, -90, -31,-122, -87, -31, +-124,-115, -31,-123, -90, -31,-122, -88, -31,-124,-115, -31,-123, -91, -31,-121,-126, -31,-124,-115, + -31,-123, -91, -31,-121,-127, -31,-124,-115, -31,-123, -91, -31,-121,-128, -31,-124,-115, -31,-123, + -91, -31,-122, -65, -31,-124,-115, -31,-123, -91, -31,-122, -66, -31,-124,-115, -31,-123, -91, -31, +-122, -67, -31,-124,-115, -31,-123, -91, -31,-122, -68, -31,-124,-115, -31,-123, -91, -31,-122, -69, + -31,-124,-115, -31,-123, -91, -31,-122, -70, -31,-124,-115, -31,-123, -91, -31,-122, -71, -31,-124, +-115, -31,-123, -91, -31,-122, -72, -31,-124,-115, -31,-123, -91, -31,-122, -73, -31,-124,-115, -31, +-123, -91, -31,-122, -74, -31,-124,-115, -31,-123, -91, -31,-122, -75, -31,-124,-115, -31,-123, -91, + -31,-122, -76, -31,-124,-115, -31,-123, -91, -31,-122, -77, -31,-124,-115, -31,-123, -91, -31,-122, + -78, -31,-124,-115, -31,-123, -91, -31,-122, -79, -31,-124,-115, -31,-123, -91, -31,-122, -80, -31, +-124,-115, -31,-123, -91, -31,-122, -81, -31,-124,-115, -31,-123, -91, -31,-122, -82, -31,-124,-115, + -31,-123, -91, -31,-122, -83, -31,-124,-115, -31,-123, -91, -31,-122, -84, -31,-124,-115, -31,-123, + -91, -31,-122, -85, -31,-124,-115, -31,-123, -91, -31,-122, -86, -31,-124,-115, -31,-123, -91, -31, +-122, -87, -31,-124,-115, -31,-123, -91, -31,-122, -88, -31,-124,-115, -31,-123, -92, -31,-121,-126, + -31,-124,-115, -31,-123, -92, -31,-121,-127, -31,-124,-115, -31,-123, -92, -31,-121,-128, -31,-124, +-115, -31,-123, -92, -31,-122, -65, -31,-124,-115, -31,-123, -92, -31,-122, -66, -31,-124,-115, -31, +-123, -92, -31,-122, -67, -31,-124,-115, -31,-123, -92, -31,-122, -68, -31,-124,-115, -31,-123, -92, + -31,-122, -69, -31,-124,-115, -31,-123, -92, -31,-122, -70, -31,-124,-115, -31,-123, -92, -31,-122, + -71, -31,-124,-115, -31,-123, -92, -31,-122, -72, -31,-124,-115, -31,-123, -92, -31,-122, -73, -31, +-124,-115, -31,-123, -92, -31,-122, -74, -31,-124,-115, -31,-123, -92, -31,-122, -75, -31,-124,-115, + -31,-123, -92, -31,-122, -76, -31,-124,-115, -31,-123, -92, -31,-122, -77, -31,-124,-115, -31,-123, + -92, -31,-122, -78, -31,-124,-115, -31,-123, -92, -31,-122, -79, -31,-124,-115, -31,-123, -92, -31, +-122, -80, -31,-124,-115, -31,-123, -92, -31,-122, -81, -31,-124,-115, -31,-123, -92, -31,-122, -82, + -31,-124,-115, -31,-123, -92, -31,-122, -83, -31,-124,-115, -31,-123, -92, -31,-122, -84, -31,-124, +-115, -31,-123, -92, -31,-122, -85, -31,-124,-115, -31,-123, -92, -31,-122, -86, -31,-124,-115, -31, +-123, -92, -31,-122, -87, -31,-124,-115, -31,-123, -92, -31,-122, -88, -31,-124,-115, -31,-123, -93, + -31,-121,-126, -31,-124,-115, -31,-123, -93, -31,-121,-127, -31,-124,-115, -31,-123, -93, -31,-121, +-128, -31,-124,-115, -31,-123, -93, -31,-122, -65, -31,-124,-115, -31,-123, -93, -31,-122, -66, -31, +-124,-115, -31,-123, -93, -31,-122, -67, -31,-124,-115, -31,-123, -93, -31,-122, -68, -31,-124,-115, + -31,-123, -93, -31,-122, -69, -31,-124,-115, -31,-123, -93, -31,-122, -70, -31,-124,-115, -31,-123, + -93, -31,-122, -71, -31,-124,-115, -31,-123, -93, -31,-122, -72, -31,-124,-115, -31,-123, -93, -31, +-122, -73, -31,-124,-115, -31,-123, -93, -31,-122, -74, -31,-124,-115, -31,-123, -93, -31,-122, -75, + -31,-124,-115, -31,-123, -93, -31,-122, -76, -31,-124,-115, -31,-123, -93, -31,-122, -77, -31,-124, +-115, -31,-123, -93, -31,-122, -78, -31,-124,-115, -31,-123, -93, -31,-122, -79, -31,-124,-115, -31, +-123, -93, -31,-122, -80, -31,-124,-115, -31,-123, -93, -31,-122, -81, -31,-124,-115, -31,-123, -93, + -31,-122, -82, -31,-124,-115, -31,-123, -93, -31,-122, -83, -31,-124,-115, -31,-123, -93, -31,-122, + -84, -31,-124,-115, -31,-123, -93, -31,-122, -85, -31,-124,-115, -31,-123, -93, -31,-122, -86, -31, +-124,-115, -31,-123, -93, -31,-122, -87, -31,-124,-115, -31,-123, -93, -31,-122, -88, -31,-124,-115, + -31,-123, -94, -31,-121,-126, -31,-124,-115, -31,-123, -94, -31,-121,-127, -31,-124,-115, -31,-123, + -94, -31,-121,-128, -31,-124,-115, -31,-123, -94, -31,-122, -65, -31,-124,-115, -31,-123, -94, -31, +-122, -66, -31,-124,-115, -31,-123, -94, -31,-122, -67, -31,-124,-115, -31,-123, -94, -31,-122, -68, + -31,-124,-115, -31,-123, -94, -31,-122, -69, -31,-124,-115, -31,-123, -94, -31,-122, -70, -31,-124, +-115, -31,-123, -94, -31,-122, -71, -31,-124,-115, -31,-123, -94, -31,-122, -72, -31,-124,-115, -31, +-123, -94, -31,-122, -73, -31,-124,-115, -31,-123, -94, -31,-122, -74, -31,-124,-115, -31,-123, -94, + -31,-122, -75, -31,-124,-115, -31,-123, -94, -31,-122, -76, -31,-124,-115, -31,-123, -94, -31,-122, + -77, -31,-124,-115, -31,-123, -94, -31,-122, -78, -31,-124,-115, -31,-123, -94, -31,-122, -79, -31, +-124,-115, -31,-123, -94, -31,-122, -80, -31,-124,-115, -31,-123, -94, -31,-122, -81, -31,-124,-115, + -31,-123, -94, -31,-122, -82, -31,-124,-115, -31,-123, -94, -31,-122, -83, -31,-124,-115, -31,-123, + -94, -31,-122, -84, -31,-124,-115, -31,-123, -94, -31,-122, -85, -31,-124,-115, -31,-123, -94, -31, +-122, -86, -31,-124,-115, -31,-123, -94, -31,-122, -87, -31,-124,-115, -31,-123, -94, -31,-122, -88, + -31,-124,-115, -31,-123, -95, -31,-121,-126, -31,-124,-115, -31,-123, -95, -31,-121,-127, -31,-124, +-115, -31,-123, -95, -31,-121,-128, -31,-124,-115, -31,-123, -95, -31,-122, -65, -31,-124,-115, -31, +-123, -95, -31,-122, -66, -31,-124,-115, -31,-123, -95, -31,-122, -67, -31,-124,-115, -31,-123, -95, + -31,-122, -68, -31,-124,-115, -31,-123, -95, -31,-122, -69, -31,-124,-115, -31,-123, -95, -31,-122, + -70, -31,-124,-115, -31,-123, -95, -31,-122, -71, -31,-124,-115, -31,-123, -95, -31,-122, -72, -31, +-124,-115, -31,-123, -95, -31,-122, -73, -31,-124,-115, -31,-123, -95, -31,-122, -74, -31,-124,-115, + -31,-123, -95, -31,-122, -75, -31,-124,-115, -31,-123, -95, -31,-122, -76, -31,-124,-115, -31,-123, + -95, -31,-122, -77, -31,-124,-115, -31,-123, -95, -31,-122, -78, -31,-124,-115, -31,-123, -95, -31, +-122, -79, -31,-124,-115, -31,-123, -95, -31,-122, -80, -31,-124,-115, -31,-123, -95, -31,-122, -81, + -31,-124,-115, -31,-123, -95, -31,-122, -82, -31,-124,-115, -31,-123, -95, -31,-122, -83, -31,-124, +-115, -31,-123, -95, -31,-122, -84, -31,-124,-115, -31,-123, -95, -31,-122, -85, -31,-124,-115, -31, +-123, -95, -31,-122, -86, -31,-124,-115, -31,-123, -95, -31,-122, -87, -31,-124,-115, -31,-123, -95, + -31,-122, -88, -31,-124,-116, -31,-123, -75, -31,-121,-126, -31,-124,-116, -31,-123, -75, -31,-121, +-127, -31,-124,-116, -31,-123, -75, -31,-121,-128, -31,-124,-116, -31,-123, -75, -31,-122, -65, -31, +-124,-116, -31,-123, -75, -31,-122, -66, -31,-124,-116, -31,-123, -75, -31,-122, -67, -31,-124,-116, + -31,-123, -75, -31,-122, -68, -31,-124,-116, -31,-123, -75, -31,-122, -69, -31,-124,-116, -31,-123, + -75, -31,-122, -70, -31,-124,-116, -31,-123, -75, -31,-122, -71, -31,-124,-116, -31,-123, -75, -31, +-122, -72, -31,-124,-116, -31,-123, -75, -31,-122, -73, -31,-124,-116, -31,-123, -75, -31,-122, -74, + -31,-124,-116, -31,-123, -75, -31,-122, -75, -31,-124,-116, -31,-123, -75, -31,-122, -76, -31,-124, +-116, -31,-123, -75, -31,-122, -77, -31,-124,-116, -31,-123, -75, -31,-122, -78, -31,-124,-116, -31, +-123, -75, -31,-122, -79, -31,-124,-116, -31,-123, -75, -31,-122, -80, -31,-124,-116, -31,-123, -75, + -31,-122, -81, -31,-124,-116, -31,-123, -75, -31,-122, -82, -31,-124,-116, -31,-123, -75, -31,-122, + -83, -31,-124,-116, -31,-123, -75, -31,-122, -84, -31,-124,-116, -31,-123, -75, -31,-122, -85, -31, +-124,-116, -31,-123, -75, -31,-122, -86, -31,-124,-116, -31,-123, -75, -31,-122, -87, -31,-124,-116, + -31,-123, -75, -31,-122, -88, -31,-124,-116, -31,-123, -76, -31,-121,-126, -31,-124,-116, -31,-123, + -76, -31,-121,-127, -31,-124,-116, -31,-123, -76, -31,-121,-128, -31,-124,-116, -31,-123, -76, -31, +-122, -65, -31,-124,-116, -31,-123, -76, -31,-122, -66, -31,-124,-116, -31,-123, -76, -31,-122, -67, + -31,-124,-116, -31,-123, -76, -31,-122, -68, -31,-124,-116, -31,-123, -76, -31,-122, -69, -31,-124, +-116, -31,-123, -76, -31,-122, -70, -31,-124,-116, -31,-123, -76, -31,-122, -71, -31,-124,-116, -31, +-123, -76, -31,-122, -72, -31,-124,-116, -31,-123, -76, -31,-122, -73, -31,-124,-116, -31,-123, -76, + -31,-122, -74, -31,-124,-116, -31,-123, -76, -31,-122, -75, -31,-124,-116, -31,-123, -76, -31,-122, + -76, -31,-124,-116, -31,-123, -76, -31,-122, -77, -31,-124,-116, -31,-123, -76, -31,-122, -78, -31, +-124,-116, -31,-123, -76, -31,-122, -79, -31,-124,-116, -31,-123, -76, -31,-122, -80, -31,-124,-116, + -31,-123, -76, -31,-122, -81, -31,-124,-116, -31,-123, -76, -31,-122, -82, -31,-124,-116, -31,-123, + -76, -31,-122, -83, -31,-124,-116, -31,-123, -76, -31,-122, -84, -31,-124,-116, -31,-123, -76, -31, +-122, -85, -31,-124,-116, -31,-123, -76, -31,-122, -86, -31,-124,-116, -31,-123, -76, -31,-122, -87, + -31,-124,-116, -31,-123, -76, -31,-122, -88, -31,-124,-116, -31,-123, -77, -31,-121,-126, -31,-124, +-116, -31,-123, -77, -31,-121,-127, -31,-124,-116, -31,-123, -77, -31,-121,-128, -31,-124,-116, -31, +-123, -77, -31,-122, -65, -31,-124,-116, -31,-123, -77, -31,-122, -66, -31,-124,-116, -31,-123, -77, + -31,-122, -67, -31,-124,-116, -31,-123, -77, -31,-122, -68, -31,-124,-116, -31,-123, -77, -31,-122, + -69, -31,-124,-116, -31,-123, -77, -31,-122, -70, -31,-124,-116, -31,-123, -77, -31,-122, -71, -31, +-124,-116, -31,-123, -77, -31,-122, -72, -31,-124,-116, -31,-123, -77, -31,-122, -73, -31,-124,-116, + -31,-123, -77, -31,-122, -74, -31,-124,-116, -31,-123, -77, -31,-122, -75, -31,-124,-116, -31,-123, + -77, -31,-122, -76, -31,-124,-116, -31,-123, -77, -31,-122, -77, -31,-124,-116, -31,-123, -77, -31, +-122, -78, -31,-124,-116, -31,-123, -77, -31,-122, -79, -31,-124,-116, -31,-123, -77, -31,-122, -80, + -31,-124,-116, -31,-123, -77, -31,-122, -81, -31,-124,-116, -31,-123, -77, -31,-122, -82, -31,-124, +-116, -31,-123, -77, -31,-122, -83, -31,-124,-116, -31,-123, -77, -31,-122, -84, -31,-124,-116, -31, +-123, -77, -31,-122, -85, -31,-124,-116, -31,-123, -77, -31,-122, -86, -31,-124,-116, -31,-123, -77, + -31,-122, -87, -31,-124,-116, -31,-123, -77, -31,-122, -88, -31,-124,-116, -31,-123, -78, -31,-121, +-126, -31,-124,-116, -31,-123, -78, -31,-121,-127, -31,-124,-116, -31,-123, -78, -31,-121,-128, -31, +-124,-116, -31,-123, -78, -31,-122, -65, -31,-124,-116, -31,-123, -78, -31,-122, -66, -31,-124,-116, + -31,-123, -78, -31,-122, -67, -31,-124,-116, -31,-123, -78, -31,-122, -68, -31,-124,-116, -31,-123, + -78, -31,-122, -69, -31,-124,-116, -31,-123, -78, -31,-122, -70, -31,-124,-116, -31,-123, -78, -31, +-122, -71, -31,-124,-116, -31,-123, -78, -31,-122, -72, -31,-124,-116, -31,-123, -78, -31,-122, -73, + -31,-124,-116, -31,-123, -78, -31,-122, -74, -31,-124,-116, -31,-123, -78, -31,-122, -75, -31,-124, +-116, -31,-123, -78, -31,-122, -76, -31,-124,-116, -31,-123, -78, -31,-122, -77, -31,-124,-116, -31, +-123, -78, -31,-122, -78, -31,-124,-116, -31,-123, -78, -31,-122, -79, -31,-124,-116, -31,-123, -78, + -31,-122, -80, -31,-124,-116, -31,-123, -78, -31,-122, -81, -31,-124,-116, -31,-123, -78, -31,-122, + -82, -31,-124,-116, -31,-123, -78, -31,-122, -83, -31,-124,-116, -31,-123, -78, -31,-122, -84, -31, +-124,-116, -31,-123, -78, -31,-122, -85, -31,-124,-116, -31,-123, -78, -31,-122, -86, -31,-124,-116, + -31,-123, -78, -31,-122, -87, -31,-124,-116, -31,-123, -78, -31,-122, -88, -31,-124,-116, -31,-123, + -79, -31,-121,-126, -31,-124,-116, -31,-123, -79, -31,-121,-127, -31,-124,-116, -31,-123, -79, -31, +-121,-128, -31,-124,-116, -31,-123, -79, -31,-122, -65, -31,-124,-116, -31,-123, -79, -31,-122, -66, + -31,-124,-116, -31,-123, -79, -31,-122, -67, -31,-124,-116, -31,-123, -79, -31,-122, -68, -31,-124, +-116, -31,-123, -79, -31,-122, -69, -31,-124,-116, -31,-123, -79, -31,-122, -70, -31,-124,-116, -31, +-123, -79, -31,-122, -71, -31,-124,-116, -31,-123, -79, -31,-122, -72, -31,-124,-116, -31,-123, -79, + -31,-122, -73, -31,-124,-116, -31,-123, -79, -31,-122, -74, -31,-124,-116, -31,-123, -79, -31,-122, + -75, -31,-124,-116, -31,-123, -79, -31,-122, -76, -31,-124,-116, -31,-123, -79, -31,-122, -77, -31, +-124,-116, -31,-123, -79, -31,-122, -78, -31,-124,-116, -31,-123, -79, -31,-122, -79, -31,-124,-116, + -31,-123, -79, -31,-122, -80, -31,-124,-116, -31,-123, -79, -31,-122, -81, -31,-124,-116, -31,-123, + -79, -31,-122, -82, -31,-124,-116, -31,-123, -79, -31,-122, -83, -31,-124,-116, -31,-123, -79, -31, +-122, -84, -31,-124,-116, -31,-123, -79, -31,-122, -85, -31,-124,-116, -31,-123, -79, -31,-122, -86, + -31,-124,-116, -31,-123, -79, -31,-122, -87, -31,-124,-116, -31,-123, -79, -31,-122, -88, -31,-124, +-116, -31,-123, -80, -31,-121,-126, -31,-124,-116, -31,-123, -80, -31,-121,-127, -31,-124,-116, -31, +-123, -80, -31,-121,-128, -31,-124,-116, -31,-123, -80, -31,-122, -65, -31,-124,-116, -31,-123, -80, + -31,-122, -66, -31,-124,-116, -31,-123, -80, -31,-122, -67, -31,-124,-116, -31,-123, -80, -31,-122, + -68, -31,-124,-116, -31,-123, -80, -31,-122, -69, -31,-124,-116, -31,-123, -80, -31,-122, -70, -31, +-124,-116, -31,-123, -80, -31,-122, -71, -31,-124,-116, -31,-123, -80, -31,-122, -72, -31,-124,-116, + -31,-123, -80, -31,-122, -73, -31,-124,-116, -31,-123, -80, -31,-122, -74, -31,-124,-116, -31,-123, + -80, -31,-122, -75, -31,-124,-116, -31,-123, -80, -31,-122, -76, -31,-124,-116, -31,-123, -80, -31, +-122, -77, -31,-124,-116, -31,-123, -80, -31,-122, -78, -31,-124,-116, -31,-123, -80, -31,-122, -79, + -31,-124,-116, -31,-123, -80, -31,-122, -80, -31,-124,-116, -31,-123, -80, -31,-122, -81, -31,-124, +-116, -31,-123, -80, -31,-122, -82, -31,-124,-116, -31,-123, -80, -31,-122, -83, -31,-124,-116, -31, +-123, -80, -31,-122, -84, -31,-124,-116, -31,-123, -80, -31,-122, -85, -31,-124,-116, -31,-123, -80, + -31,-122, -86, -31,-124,-116, -31,-123, -80, -31,-122, -87, -31,-124,-116, -31,-123, -80, -31,-122, + -88, -31,-124,-116, -31,-123, -81, -31,-121,-126, -31,-124,-116, -31,-123, -81, -31,-121,-127, -31, +-124,-116, -31,-123, -81, -31,-121,-128, -31,-124,-116, -31,-123, -81, -31,-122, -65, -31,-124,-116, + -31,-123, -81, -31,-122, -66, -31,-124,-116, -31,-123, -81, -31,-122, -67, -31,-124,-116, -31,-123, + -81, -31,-122, -68, -31,-124,-116, -31,-123, -81, -31,-122, -69, -31,-124,-116, -31,-123, -81, -31, +-122, -70, -31,-124,-116, -31,-123, -81, -31,-122, -71, -31,-124,-116, -31,-123, -81, -31,-122, -72, + -31,-124,-116, -31,-123, -81, -31,-122, -73, -31,-124,-116, -31,-123, -81, -31,-122, -74, -31,-124, +-116, -31,-123, -81, -31,-122, -75, -31,-124,-116, -31,-123, -81, -31,-122, -76, -31,-124,-116, -31, +-123, -81, -31,-122, -77, -31,-124,-116, -31,-123, -81, -31,-122, -78, -31,-124,-116, -31,-123, -81, + -31,-122, -79, -31,-124,-116, -31,-123, -81, -31,-122, -80, -31,-124,-116, -31,-123, -81, -31,-122, + -81, -31,-124,-116, -31,-123, -81, -31,-122, -82, -31,-124,-116, -31,-123, -81, -31,-122, -83, -31, +-124,-116, -31,-123, -81, -31,-122, -84, -31,-124,-116, -31,-123, -81, -31,-122, -85, -31,-124,-116, + -31,-123, -81, -31,-122, -86, -31,-124,-116, -31,-123, -81, -31,-122, -87, -31,-124,-116, -31,-123, + -81, -31,-122, -88, -31,-124,-116, -31,-123, -82, -31,-121,-126, -31,-124,-116, -31,-123, -82, -31, +-121,-127, -31,-124,-116, -31,-123, -82, -31,-121,-128, -31,-124,-116, -31,-123, -82, -31,-122, -65, + -31,-124,-116, -31,-123, -82, -31,-122, -66, -31,-124,-116, -31,-123, -82, -31,-122, -67, -31,-124, +-116, -31,-123, -82, -31,-122, -68, -31,-124,-116, -31,-123, -82, -31,-122, -69, -31,-124,-116, -31, +-123, -82, -31,-122, -70, -31,-124,-116, -31,-123, -82, -31,-122, -71, -31,-124,-116, -31,-123, -82, + -31,-122, -72, -31,-124,-116, -31,-123, -82, -31,-122, -73, -31,-124,-116, -31,-123, -82, -31,-122, + -74, -31,-124,-116, -31,-123, -82, -31,-122, -75, -31,-124,-116, -31,-123, -82, -31,-122, -76, -31, +-124,-116, -31,-123, -82, -31,-122, -77, -31,-124,-116, -31,-123, -82, -31,-122, -78, -31,-124,-116, + -31,-123, -82, -31,-122, -79, -31,-124,-116, -31,-123, -82, -31,-122, -80, -31,-124,-116, -31,-123, + -82, -31,-122, -81, -31,-124,-116, -31,-123, -82, -31,-122, -82, -31,-124,-116, -31,-123, -82, -31, +-122, -83, -31,-124,-116, -31,-123, -82, -31,-122, -84, -31,-124,-116, -31,-123, -82, -31,-122, -85, + -31,-124,-116, -31,-123, -82, -31,-122, -86, -31,-124,-116, -31,-123, -82, -31,-122, -87, -31,-124, +-116, -31,-123, -82, -31,-122, -88, -31,-124,-116, -31,-123, -83, -31,-121,-126, -31,-124,-116, -31, +-123, -83, -31,-121,-127, -31,-124,-116, -31,-123, -83, -31,-121,-128, -31,-124,-116, -31,-123, -83, + -31,-122, -65, -31,-124,-116, -31,-123, -83, -31,-122, -66, -31,-124,-116, -31,-123, -83, -31,-122, + -67, -31,-124,-116, -31,-123, -83, -31,-122, -68, -31,-124,-116, -31,-123, -83, -31,-122, -69, -31, +-124,-116, -31,-123, -83, -31,-122, -70, -31,-124,-116, -31,-123, -83, -31,-122, -71, -31,-124,-116, + -31,-123, -83, -31,-122, -72, -31,-124,-116, -31,-123, -83, -31,-122, -73, -31,-124,-116, -31,-123, + -83, -31,-122, -74, -31,-124,-116, -31,-123, -83, -31,-122, -75, -31,-124,-116, -31,-123, -83, -31, +-122, -76, -31,-124,-116, -31,-123, -83, -31,-122, -77, -31,-124,-116, -31,-123, -83, -31,-122, -78, + -31,-124,-116, -31,-123, -83, -31,-122, -79, -31,-124,-116, -31,-123, -83, -31,-122, -80, -31,-124, +-116, -31,-123, -83, -31,-122, -81, -31,-124,-116, -31,-123, -83, -31,-122, -82, -31,-124,-116, -31, +-123, -83, -31,-122, -83, -31,-124,-116, -31,-123, -83, -31,-122, -84, -31,-124,-116, -31,-123, -83, + -31,-122, -85, -31,-124,-116, -31,-123, -83, -31,-122, -86, -31,-124,-116, -31,-123, -83, -31,-122, + -87, -31,-124,-116, -31,-123, -83, -31,-122, -88, -31,-124,-116, -31,-123, -84, -31,-121,-126, -31, +-124,-116, -31,-123, -84, -31,-121,-127, -31,-124,-116, -31,-123, -84, -31,-121,-128, -31,-124,-116, + -31,-123, -84, -31,-122, -65, -31,-124,-116, -31,-123, -84, -31,-122, -66, -31,-124,-116, -31,-123, + -84, -31,-122, -67, -31,-124,-116, -31,-123, -84, -31,-122, -68, -31,-124,-116, -31,-123, -84, -31, +-122, -69, -31,-124,-116, -31,-123, -84, -31,-122, -70, -31,-124,-116, -31,-123, -84, -31,-122, -71, + -31,-124,-116, -31,-123, -84, -31,-122, -72, -31,-124,-116, -31,-123, -84, -31,-122, -73, -31,-124, +-116, -31,-123, -84, -31,-122, -74, -31,-124,-116, -31,-123, -84, -31,-122, -75, -31,-124,-116, -31, +-123, -84, -31,-122, -76, -31,-124,-116, -31,-123, -84, -31,-122, -77, -31,-124,-116, -31,-123, -84, + -31,-122, -78, -31,-124,-116, -31,-123, -84, -31,-122, -79, -31,-124,-116, -31,-123, -84, -31,-122, + -80, -31,-124,-116, -31,-123, -84, -31,-122, -81, -31,-124,-116, -31,-123, -84, -31,-122, -82, -31, +-124,-116, -31,-123, -84, -31,-122, -83, -31,-124,-116, -31,-123, -84, -31,-122, -84, -31,-124,-116, + -31,-123, -84, -31,-122, -85, -31,-124,-116, -31,-123, -84, -31,-122, -86, -31,-124,-116, -31,-123, + -84, -31,-122, -87, -31,-124,-116, -31,-123, -84, -31,-122, -88, -31,-124,-116, -31,-123, -85, -31, +-121,-126, -31,-124,-116, -31,-123, -85, -31,-121,-127, -31,-124,-116, -31,-123, -85, -31,-121,-128, + -31,-124,-116, -31,-123, -85, -31,-122, -65, -31,-124,-116, -31,-123, -85, -31,-122, -66, -31,-124, +-116, -31,-123, -85, -31,-122, -67, -31,-124,-116, -31,-123, -85, -31,-122, -68, -31,-124,-116, -31, +-123, -85, -31,-122, -69, -31,-124,-116, -31,-123, -85, -31,-122, -70, -31,-124,-116, -31,-123, -85, + -31,-122, -71, -31,-124,-116, -31,-123, -85, -31,-122, -72, -31,-124,-116, -31,-123, -85, -31,-122, + -73, -31,-124,-116, -31,-123, -85, -31,-122, -74, -31,-124,-116, -31,-123, -85, -31,-122, -75, -31, +-124,-116, -31,-123, -85, -31,-122, -76, -31,-124,-116, -31,-123, -85, -31,-122, -77, -31,-124,-116, + -31,-123, -85, -31,-122, -78, -31,-124,-116, -31,-123, -85, -31,-122, -79, -31,-124,-116, -31,-123, + -85, -31,-122, -80, -31,-124,-116, -31,-123, -85, -31,-122, -81, -31,-124,-116, -31,-123, -85, -31, +-122, -82, -31,-124,-116, -31,-123, -85, -31,-122, -83, -31,-124,-116, -31,-123, -85, -31,-122, -84, + -31,-124,-116, -31,-123, -85, -31,-122, -85, -31,-124,-116, -31,-123, -85, -31,-122, -86, -31,-124, +-116, -31,-123, -85, -31,-122, -87, -31,-124,-116, -31,-123, -85, -31,-122, -88, -31,-124,-116, -31, +-123, -86, -31,-121,-126, -31,-124,-116, -31,-123, -86, -31,-121,-127, -31,-124,-116, -31,-123, -86, + -31,-121,-128, -31,-124,-116, -31,-123, -86, -31,-122, -65, -31,-124,-116, -31,-123, -86, -31,-122, + -66, -31,-124,-116, -31,-123, -86, -31,-122, -67, -31,-124,-116, -31,-123, -86, -31,-122, -68, -31, +-124,-116, -31,-123, -86, -31,-122, -69, -31,-124,-116, -31,-123, -86, -31,-122, -70, -31,-124,-116, + -31,-123, -86, -31,-122, -71, -31,-124,-116, -31,-123, -86, -31,-122, -72, -31,-124,-116, -31,-123, + -86, -31,-122, -73, -31,-124,-116, -31,-123, -86, -31,-122, -74, -31,-124,-116, -31,-123, -86, -31, +-122, -75, -31,-124,-116, -31,-123, -86, -31,-122, -76, -31,-124,-116, -31,-123, -86, -31,-122, -77, + -31,-124,-116, -31,-123, -86, -31,-122, -78, -31,-124,-116, -31,-123, -86, -31,-122, -79, -31,-124, +-116, -31,-123, -86, -31,-122, -80, -31,-124,-116, -31,-123, -86, -31,-122, -81, -31,-124,-116, -31, +-123, -86, -31,-122, -82, -31,-124,-116, -31,-123, -86, -31,-122, -83, -31,-124,-116, -31,-123, -86, + -31,-122, -84, -31,-124,-116, -31,-123, -86, -31,-122, -85, -31,-124,-116, -31,-123, -86, -31,-122, + -86, -31,-124,-116, -31,-123, -86, -31,-122, -87, -31,-124,-116, -31,-123, -86, -31,-122, -88, -31, +-124,-116, -31,-123, -87, -31,-121,-126, -31,-124,-116, -31,-123, -87, -31,-121,-127, -31,-124,-116, + -31,-123, -87, -31,-121,-128, -31,-124,-116, -31,-123, -87, -31,-122, -65, -31,-124,-116, -31,-123, + -87, -31,-122, -66, -31,-124,-116, -31,-123, -87, -31,-122, -67, -31,-124,-116, -31,-123, -87, -31, +-122, -68, -31,-124,-116, -31,-123, -87, -31,-122, -69, -31,-124,-116, -31,-123, -87, -31,-122, -70, + -31,-124,-116, -31,-123, -87, -31,-122, -71, -31,-124,-116, -31,-123, -87, -31,-122, -72, -31,-124, +-116, -31,-123, -87, -31,-122, -73, -31,-124,-116, -31,-123, -87, -31,-122, -74, -31,-124,-116, -31, +-123, -87, -31,-122, -75, -31,-124,-116, -31,-123, -87, -31,-122, -76, -31,-124,-116, -31,-123, -87, + -31,-122, -77, -31,-124,-116, -31,-123, -87, -31,-122, -78, -31,-124,-116, -31,-123, -87, -31,-122, + -79, -31,-124,-116, -31,-123, -87, -31,-122, -80, -31,-124,-116, -31,-123, -87, -31,-122, -81, -31, +-124,-116, -31,-123, -87, -31,-122, -82, -31,-124,-116, -31,-123, -87, -31,-122, -83, -31,-124,-116, + -31,-123, -87, -31,-122, -84, -31,-124,-116, -31,-123, -87, -31,-122, -85, -31,-124,-116, -31,-123, + -87, -31,-122, -86, -31,-124,-116, -31,-123, -87, -31,-122, -87, -31,-124,-116, -31,-123, -87, -31, +-122, -88, -31,-124,-116, -31,-123, -88, -31,-121,-126, -31,-124,-116, -31,-123, -88, -31,-121,-127, + -31,-124,-116, -31,-123, -88, -31,-121,-128, -31,-124,-116, -31,-123, -88, -31,-122, -65, -31,-124, +-116, -31,-123, -88, -31,-122, -66, -31,-124,-116, -31,-123, -88, -31,-122, -67, -31,-124,-116, -31, +-123, -88, -31,-122, -68, -31,-124,-116, -31,-123, -88, -31,-122, -69, -31,-124,-116, -31,-123, -88, + -31,-122, -70, -31,-124,-116, -31,-123, -88, -31,-122, -71, -31,-124,-116, -31,-123, -88, -31,-122, + -72, -31,-124,-116, -31,-123, -88, -31,-122, -73, -31,-124,-116, -31,-123, -88, -31,-122, -74, -31, +-124,-116, -31,-123, -88, -31,-122, -75, -31,-124,-116, -31,-123, -88, -31,-122, -76, -31,-124,-116, + -31,-123, -88, -31,-122, -77, -31,-124,-116, -31,-123, -88, -31,-122, -78, -31,-124,-116, -31,-123, + -88, -31,-122, -79, -31,-124,-116, -31,-123, -88, -31,-122, -80, -31,-124,-116, -31,-123, -88, -31, +-122, -81, -31,-124,-116, -31,-123, -88, -31,-122, -82, -31,-124,-116, -31,-123, -88, -31,-122, -83, + -31,-124,-116, -31,-123, -88, -31,-122, -84, -31,-124,-116, -31,-123, -88, -31,-122, -85, -31,-124, +-116, -31,-123, -88, -31,-122, -86, -31,-124,-116, -31,-123, -88, -31,-122, -87, -31,-124,-116, -31, +-123, -88, -31,-122, -88, -31,-124,-116, -31,-123, -89, -31,-121,-126, -31,-124,-116, -31,-123, -89, + -31,-121,-127, -31,-124,-116, -31,-123, -89, -31,-121,-128, -31,-124,-116, -31,-123, -89, -31,-122, + -65, -31,-124,-116, -31,-123, -89, -31,-122, -66, -31,-124,-116, -31,-123, -89, -31,-122, -67, -31, +-124,-116, -31,-123, -89, -31,-122, -68, -31,-124,-116, -31,-123, -89, -31,-122, -69, -31,-124,-116, + -31,-123, -89, -31,-122, -70, -31,-124,-116, -31,-123, -89, -31,-122, -71, -31,-124,-116, -31,-123, + -89, -31,-122, -72, -31,-124,-116, -31,-123, -89, -31,-122, -73, -31,-124,-116, -31,-123, -89, -31, +-122, -74, -31,-124,-116, -31,-123, -89, -31,-122, -75, -31,-124,-116, -31,-123, -89, -31,-122, -76, + -31,-124,-116, -31,-123, -89, -31,-122, -77, -31,-124,-116, -31,-123, -89, -31,-122, -78, -31,-124, +-116, -31,-123, -89, -31,-122, -79, -31,-124,-116, -31,-123, -89, -31,-122, -80, -31,-124,-116, -31, +-123, -89, -31,-122, -81, -31,-124,-116, -31,-123, -89, -31,-122, -82, -31,-124,-116, -31,-123, -89, + -31,-122, -83, -31,-124,-116, -31,-123, -89, -31,-122, -84, -31,-124,-116, -31,-123, -89, -31,-122, + -85, -31,-124,-116, -31,-123, -89, -31,-122, -86, -31,-124,-116, -31,-123, -89, -31,-122, -87, -31, +-124,-116, -31,-123, -89, -31,-122, -88, -31,-124,-116, -31,-123, -90, -31,-121,-126, -31,-124,-116, + -31,-123, -90, -31,-121,-127, -31,-124,-116, -31,-123, -90, -31,-121,-128, -31,-124,-116, -31,-123, + -90, -31,-122, -65, -31,-124,-116, -31,-123, -90, -31,-122, -66, -31,-124,-116, -31,-123, -90, -31, +-122, -67, -31,-124,-116, -31,-123, -90, -31,-122, -68, -31,-124,-116, -31,-123, -90, -31,-122, -69, + -31,-124,-116, -31,-123, -90, -31,-122, -70, -31,-124,-116, -31,-123, -90, -31,-122, -71, -31,-124, +-116, -31,-123, -90, -31,-122, -72, -31,-124,-116, -31,-123, -90, -31,-122, -73, -31,-124,-116, -31, +-123, -90, -31,-122, -74, -31,-124,-116, -31,-123, -90, -31,-122, -75, -31,-124,-116, -31,-123, -90, + -31,-122, -76, -31,-124,-116, -31,-123, -90, -31,-122, -77, -31,-124,-116, -31,-123, -90, -31,-122, + -78, -31,-124,-116, -31,-123, -90, -31,-122, -79, -31,-124,-116, -31,-123, -90, -31,-122, -80, -31, +-124,-116, -31,-123, -90, -31,-122, -81, -31,-124,-116, -31,-123, -90, -31,-122, -82, -31,-124,-116, + -31,-123, -90, -31,-122, -83, -31,-124,-116, -31,-123, -90, -31,-122, -84, -31,-124,-116, -31,-123, + -90, -31,-122, -85, -31,-124,-116, -31,-123, -90, -31,-122, -86, -31,-124,-116, -31,-123, -90, -31, +-122, -87, -31,-124,-116, -31,-123, -90, -31,-122, -88, -31,-124,-116, -31,-123, -91, -31,-121,-126, + -31,-124,-116, -31,-123, -91, -31,-121,-127, -31,-124,-116, -31,-123, -91, -31,-121,-128, -31,-124, +-116, -31,-123, -91, -31,-122, -65, -31,-124,-116, -31,-123, -91, -31,-122, -66, -31,-124,-116, -31, +-123, -91, -31,-122, -67, -31,-124,-116, -31,-123, -91, -31,-122, -68, -31,-124,-116, -31,-123, -91, + -31,-122, -69, -31,-124,-116, -31,-123, -91, -31,-122, -70, -31,-124,-116, -31,-123, -91, -31,-122, + -71, -31,-124,-116, -31,-123, -91, -31,-122, -72, -31,-124,-116, -31,-123, -91, -31,-122, -73, -31, +-124,-116, -31,-123, -91, -31,-122, -74, -31,-124,-116, -31,-123, -91, -31,-122, -75, -31,-124,-116, + -31,-123, -91, -31,-122, -76, -31,-124,-116, -31,-123, -91, -31,-122, -77, -31,-124,-116, -31,-123, + -91, -31,-122, -78, -31,-124,-116, -31,-123, -91, -31,-122, -79, -31,-124,-116, -31,-123, -91, -31, +-122, -80, -31,-124,-116, -31,-123, -91, -31,-122, -81, -31,-124,-116, -31,-123, -91, -31,-122, -82, + -31,-124,-116, -31,-123, -91, -31,-122, -83, -31,-124,-116, -31,-123, -91, -31,-122, -84, -31,-124, +-116, -31,-123, -91, -31,-122, -86, -31,-124,-116, -31,-123, -91, -31,-122, -87, -31,-124,-116, -31, +-123, -91, -31,-122, -88, -31,-124,-116, -31,-123, -92, -31,-121,-126, -31,-124,-116, -31,-123, -92, + -31,-121,-127, -31,-124,-116, -31,-123, -92, -31,-121,-128, -31,-124,-116, -31,-123, -92, -31,-122, + -65, -31,-124,-116, -31,-123, -92, -31,-122, -66, -31,-124,-116, -31,-123, -92, -31,-122, -67, -31, +-124,-116, -31,-123, -92, -31,-122, -68, -31,-124,-116, -31,-123, -92, -31,-122, -69, -31,-124,-116, + -31,-123, -92, -31,-122, -70, -31,-124,-116, -31,-123, -92, -31,-122, -71, -31,-124,-116, -31,-123, + -92, -31,-122, -72, -31,-124,-116, -31,-123, -92, -31,-122, -73, -31,-124,-116, -31,-123, -92, -31, +-122, -74, -31,-124,-116, -31,-123, -92, -31,-122, -75, -31,-124,-116, -31,-123, -92, -31,-122, -76, + -31,-124,-116, -31,-123, -92, -31,-122, -77, -31,-124,-116, -31,-123, -92, -31,-122, -78, -31,-124, +-116, -31,-123, -92, -31,-122, -79, -31,-124,-116, -31,-123, -92, -31,-122, -80, -31,-124,-116, -31, +-123, -92, -31,-122, -81, -31,-124,-116, -31,-123, -92, -31,-122, -82, -31,-124,-116, -31,-123, -92, + -31,-122, -83, -31,-124,-116, -31,-123, -92, -31,-122, -84, -31,-124,-116, -31,-123, -92, -31,-122, + -85, -31,-124,-116, -31,-123, -92, -31,-122, -86, -31,-124,-116, -31,-123, -92, -31,-122, -87, -31, +-124,-116, -31,-123, -92, -31,-122, -88, -31,-124,-116, -31,-123, -93, -31,-121,-126, -31,-124,-116, + -31,-123, -93, -31,-121,-127, -31,-124,-116, -31,-123, -93, -31,-121,-128, -31,-124,-116, -31,-123, + -93, -31,-122, -65, -31,-124,-116, -31,-123, -93, -31,-122, -66, -31,-124,-116, -31,-123, -93, -31, +-122, -67, -31,-124,-116, -31,-123, -93, -31,-122, -68, -31,-124,-116, -31,-123, -93, -31,-122, -69, + -31,-124,-116, -31,-123, -93, -31,-122, -70, -31,-124,-116, -31,-123, -93, -31,-122, -71, -31,-124, +-116, -31,-123, -93, -31,-122, -72, -31,-124,-116, -31,-123, -93, -31,-122, -73, -31,-124,-116, -31, +-123, -93, -31,-122, -74, -31,-124,-116, -31,-123, -93, -31,-122, -75, -31,-124,-116, -31,-123, -93, + -31,-122, -76, -31,-124,-116, -31,-123, -93, -31,-122, -77, -31,-124,-116, -31,-123, -93, -31,-122, + -78, -31,-124,-116, -31,-123, -93, -31,-122, -79, -31,-124,-116, -31,-123, -93, -31,-122, -80, -31, +-124,-116, -31,-123, -93, -31,-122, -81, -31,-124,-116, -31,-123, -93, -31,-122, -82, -31,-124,-116, + -31,-123, -93, -31,-122, -83, -31,-124,-116, -31,-123, -93, -31,-122, -84, -31,-124,-116, -31,-123, + -93, -31,-122, -85, -31,-124,-116, -31,-123, -93, -31,-122, -86, -31,-124,-116, -31,-123, -93, -31, +-122, -87, -31,-124,-116, -31,-123, -93, -31,-122, -88, -31,-124,-116, -31,-123, -94, -31,-121,-126, + -31,-124,-116, -31,-123, -94, -31,-121,-127, -31,-124,-116, -31,-123, -94, -31,-121,-128, -31,-124, +-116, -31,-123, -94, -31,-122, -65, -31,-124,-116, -31,-123, -94, -31,-122, -66, -31,-124,-116, -31, +-123, -94, -31,-122, -67, -31,-124,-116, -31,-123, -94, -31,-122, -68, -31,-124,-116, -31,-123, -94, + -31,-122, -69, -31,-124,-116, -31,-123, -94, -31,-122, -70, -31,-124,-116, -31,-123, -94, -31,-122, + -71, -31,-124,-116, -31,-123, -94, -31,-122, -72, -31,-124,-116, -31,-123, -94, -31,-122, -73, -31, +-124,-116, -31,-123, -94, -31,-122, -74, -31,-124,-116, -31,-123, -94, -31,-122, -75, -31,-124,-116, + -31,-123, -94, -31,-122, -76, -31,-124,-116, -31,-123, -94, -31,-122, -77, -31,-124,-116, -31,-123, + -94, -31,-122, -78, -31,-124,-116, -31,-123, -94, -31,-122, -79, -31,-124,-116, -31,-123, -94, -31, +-122, -80, -31,-124,-116, -31,-123, -94, -31,-122, -81, -31,-124,-116, -31,-123, -94, -31,-122, -82, + -31,-124,-116, -31,-123, -94, -31,-122, -83, -31,-124,-116, -31,-123, -94, -31,-122, -84, -31,-124, +-116, -31,-123, -94, -31,-122, -85, -31,-124,-116, -31,-123, -94, -31,-122, -86, -31,-124,-116, -31, +-123, -94, -31,-122, -87, -31,-124,-116, -31,-123, -94, -31,-122, -88, -31,-124,-116, -31,-123, -95, + -31,-121,-126, -31,-124,-116, -31,-123, -95, -31,-121,-127, -31,-124,-116, -31,-123, -95, -31,-121, +-128, -31,-124,-116, -31,-123, -95, -31,-122, -65, -31,-124,-116, -31,-123, -95, -31,-122, -66, -31, +-124,-116, -31,-123, -95, -31,-122, -67, -31,-124,-116, -31,-123, -95, -31,-122, -68, -31,-124,-116, + -31,-123, -95, -31,-122, -69, -31,-124,-116, -31,-123, -95, -31,-122, -70, -31,-124,-116, -31,-123, + -95, -31,-122, -71, -31,-124,-116, -31,-123, -95, -31,-122, -72, -31,-124,-116, -31,-123, -95, -31, +-122, -73, -31,-124,-116, -31,-123, -95, -31,-122, -74, -31,-124,-116, -31,-123, -95, -31,-122, -75, + -31,-124,-116, -31,-123, -95, -31,-122, -76, -31,-124,-116, -31,-123, -95, -31,-122, -77, -31,-124, +-116, -31,-123, -95, -31,-122, -78, -31,-124,-116, -31,-123, -95, -31,-122, -79, -31,-124,-116, -31, +-123, -95, -31,-122, -80, -31,-124,-116, -31,-123, -95, -31,-122, -81, -31,-124,-116, -31,-123, -95, + -31,-122, -82, -31,-124,-116, -31,-123, -95, -31,-122, -83, -31,-124,-116, -31,-123, -95, -31,-122, + -84, -31,-124,-116, -31,-123, -95, -31,-122, -85, -31,-124,-116, -31,-123, -95, -31,-122, -86, -31, +-124,-116, -31,-123, -95, -31,-122, -87, -31,-124,-116, -31,-123, -95, -31,-122, -88, -31,-124,-117, + -31,-123, -75, -31,-121,-126, -31,-124,-117, -31,-123, -75, -31,-121,-127, -31,-124,-117, -31,-123, + -75, -31,-121,-128, -31,-124,-117, -31,-123, -75, -31,-122, -65, -31,-124,-117, -31,-123, -75, -31, +-122, -66, -31,-124,-117, -31,-123, -75, -31,-122, -67, -31,-124,-117, -31,-123, -75, -31,-122, -68, + -31,-124,-117, -31,-123, -75, -31,-122, -69, -31,-124,-117, -31,-123, -75, -31,-122, -70, -31,-124, +-117, -31,-123, -75, -31,-122, -71, -31,-124,-117, -31,-123, -75, -31,-122, -72, -31,-124,-117, -31, +-123, -75, -31,-122, -73, -31,-124,-117, -31,-123, -75, -31,-122, -74, -31,-124,-117, -31,-123, -75, + -31,-122, -75, -31,-124,-117, -31,-123, -75, -31,-122, -76, -31,-124,-117, -31,-123, -75, -31,-122, + -77, -31,-124,-117, -31,-123, -75, -31,-122, -78, -31,-124,-117, -31,-123, -75, -31,-122, -79, -31, +-124,-117, -31,-123, -75, -31,-122, -80, -31,-124,-117, -31,-123, -75, -31,-122, -81, -31,-124,-117, + -31,-123, -75, -31,-122, -82, -31,-124,-117, -31,-123, -75, -31,-122, -83, -31,-124,-117, -31,-123, + -75, -31,-122, -84, -31,-124,-117, -31,-123, -75, -31,-122, -85, -31,-124,-117, -31,-123, -75, -31, +-122, -86, -31,-124,-117, -31,-123, -75, -31,-122, -87, -31,-124,-117, -31,-123, -75, -31,-122, -88, + -31,-124,-117, -31,-123, -76, -31,-121,-126, -31,-124,-117, -31,-123, -76, -31,-121,-127, -31,-124, +-117, -31,-123, -76, -31,-121,-128, -31,-124,-117, -31,-123, -76, -31,-122, -65, -31,-124,-117, -31, +-123, -76, -31,-122, -66, -31,-124,-117, -31,-123, -76, -31,-122, -67, -31,-124,-117, -31,-123, -76, + -31,-122, -68, -31,-124,-117, -31,-123, -76, -31,-122, -69, -31,-124,-117, -31,-123, -76, -31,-122, + -70, -31,-124,-117, -31,-123, -76, -31,-122, -71, -31,-124,-117, -31,-123, -76, -31,-122, -72, -31, +-124,-117, -31,-123, -76, -31,-122, -73, -31,-124,-117, -31,-123, -76, -31,-122, -74, -31,-124,-117, + -31,-123, -76, -31,-122, -75, -31,-124,-117, -31,-123, -76, -31,-122, -76, -31,-124,-117, -31,-123, + -76, -31,-122, -77, -31,-124,-117, -31,-123, -76, -31,-122, -78, -31,-124,-117, -31,-123, -76, -31, +-122, -79, -31,-124,-117, -31,-123, -76, -31,-122, -80, -31,-124,-117, -31,-123, -76, -31,-122, -81, + -31,-124,-117, -31,-123, -76, -31,-122, -82, -31,-124,-117, -31,-123, -76, -31,-122, -83, -31,-124, +-117, -31,-123, -76, -31,-122, -84, -31,-124,-117, -31,-123, -76, -31,-122, -85, -31,-124,-117, -31, +-123, -76, -31,-122, -86, -31,-124,-117, -31,-123, -76, -31,-122, -87, -31,-124,-117, -31,-123, -76, + -31,-122, -88, -31,-124,-117, -31,-123, -77, -31,-121,-126, -31,-124,-117, -31,-123, -77, -31,-121, +-127, -31,-124,-117, -31,-123, -77, -31,-121,-128, -31,-124,-117, -31,-123, -77, -31,-122, -65, -31, +-124,-117, -31,-123, -77, -31,-122, -66, -31,-124,-117, -31,-123, -77, -31,-122, -67, -31,-124,-117, + -31,-123, -77, -31,-122, -68, -31,-124,-117, -31,-123, -77, -31,-122, -69, -31,-124,-117, -31,-123, + -77, -31,-122, -70, -31,-124,-117, -31,-123, -77, -31,-122, -71, -31,-124,-117, -31,-123, -77, -31, +-122, -72, -31,-124,-117, -31,-123, -77, -31,-122, -73, -31,-124,-117, -31,-123, -77, -31,-122, -74, + -31,-124,-117, -31,-123, -77, -31,-122, -75, -31,-124,-117, -31,-123, -77, -31,-122, -76, -31,-124, +-117, -31,-123, -77, -31,-122, -77, -31,-124,-117, -31,-123, -77, -31,-122, -78, -31,-124,-117, -31, +-123, -77, -31,-122, -79, -31,-124,-117, -31,-123, -77, -31,-122, -80, -31,-124,-117, -31,-123, -77, + -31,-122, -81, -31,-124,-117, -31,-123, -77, -31,-122, -82, -31,-124,-117, -31,-123, -77, -31,-122, + -83, -31,-124,-117, -31,-123, -77, -31,-122, -84, -31,-124,-117, -31,-123, -77, -31,-122, -85, -31, +-124,-117, -31,-123, -77, -31,-122, -86, -31,-124,-117, -31,-123, -77, -31,-122, -87, -31,-124,-117, + -31,-123, -77, -31,-122, -88, -31,-124,-117, -31,-123, -78, -31,-121,-126, -31,-124,-117, -31,-123, + -78, -31,-121,-127, -31,-124,-117, -31,-123, -78, -31,-121,-128, -31,-124,-117, -31,-123, -78, -31, +-122, -65, -31,-124,-117, -31,-123, -78, -31,-122, -66, -31,-124,-117, -31,-123, -78, -31,-122, -67, + -31,-124,-117, -31,-123, -78, -31,-122, -68, -31,-124,-117, -31,-123, -78, -31,-122, -69, -31,-124, +-117, -31,-123, -78, -31,-122, -70, -31,-124,-117, -31,-123, -78, -31,-122, -71, -31,-124,-117, -31, +-123, -78, -31,-122, -72, -31,-124,-117, -31,-123, -78, -31,-122, -73, -31,-124,-117, -31,-123, -78, + -31,-122, -74, -31,-124,-117, -31,-123, -78, -31,-122, -75, -31,-124,-117, -31,-123, -78, -31,-122, + -76, -31,-124,-117, -31,-123, -78, -31,-122, -77, -31,-124,-117, -31,-123, -78, -31,-122, -78, -31, +-124,-117, -31,-123, -78, -31,-122, -79, -31,-124,-117, -31,-123, -78, -31,-122, -80, -31,-124,-117, + -31,-123, -78, -31,-122, -81, -31,-124,-117, -31,-123, -78, -31,-122, -82, -31,-124,-117, -31,-123, + -78, -31,-122, -83, -31,-124,-117, -31,-123, -78, -31,-122, -84, -31,-124,-117, -31,-123, -78, -31, +-122, -85, -31,-124,-117, -31,-123, -78, -31,-122, -86, -31,-124,-117, -31,-123, -78, -31,-122, -87, + -31,-124,-117, -31,-123, -78, -31,-122, -88, -31,-124,-117, -31,-123, -79, -31,-121,-126, -31,-124, +-117, -31,-123, -79, -31,-121,-127, -31,-124,-117, -31,-123, -79, -31,-121,-128, -31,-124,-117, -31, +-123, -79, -31,-122, -65, -31,-124,-117, -31,-123, -79, -31,-122, -66, -31,-124,-117, -31,-123, -79, + -31,-122, -67, -31,-124,-117, -31,-123, -79, -31,-122, -68, -31,-124,-117, -31,-123, -79, -31,-122, + -69, -31,-124,-117, -31,-123, -79, -31,-122, -70, -31,-124,-117, -31,-123, -79, -31,-122, -71, -31, +-124,-117, -31,-123, -79, -31,-122, -72, -31,-124,-117, -31,-123, -79, -31,-122, -73, -31,-124,-117, + -31,-123, -79, -31,-122, -74, -31,-124,-117, -31,-123, -79, -31,-122, -75, -31,-124,-117, -31,-123, + -79, -31,-122, -76, -31,-124,-117, -31,-123, -79, -31,-122, -77, -31,-124,-117, -31,-123, -79, -31, +-122, -78, -31,-124,-117, -31,-123, -79, -31,-122, -79, -31,-124,-117, -31,-123, -79, -31,-122, -80, + -31,-124,-117, -31,-123, -79, -31,-122, -81, -31,-124,-117, -31,-123, -79, -31,-122, -82, -31,-124, +-117, -31,-123, -79, -31,-122, -83, -31,-124,-117, -31,-123, -79, -31,-122, -84, -31,-124,-117, -31, +-123, -79, -31,-122, -85, -31,-124,-117, -31,-123, -79, -31,-122, -86, -31,-124,-117, -31,-123, -79, + -31,-122, -87, -31,-124,-117, -31,-123, -79, -31,-122, -88, -31,-124,-117, -31,-123, -80, -31,-121, +-126, -31,-124,-117, -31,-123, -80, -31,-121,-127, -31,-124,-117, -31,-123, -80, -31,-121,-128, -31, +-124,-117, -31,-123, -80, -31,-122, -65, -31,-124,-117, -31,-123, -80, -31,-122, -66, -31,-124,-117, + -31,-123, -80, -31,-122, -67, -31,-124,-117, -31,-123, -80, -31,-122, -68, -31,-124,-117, -31,-123, + -80, -31,-122, -69, -31,-124,-117, -31,-123, -80, -31,-122, -70, -31,-124,-117, -31,-123, -80, -31, +-122, -71, -31,-124,-117, -31,-123, -80, -31,-122, -72, -31,-124,-117, -31,-123, -80, -31,-122, -73, + -31,-124,-117, -31,-123, -80, -31,-122, -74, -31,-124,-117, -31,-123, -80, -31,-122, -75, -31,-124, +-117, -31,-123, -80, -31,-122, -76, -31,-124,-117, -31,-123, -80, -31,-122, -77, -31,-124,-117, -31, +-123, -80, -31,-122, -78, -31,-124,-117, -31,-123, -80, -31,-122, -79, -31,-124,-117, -31,-123, -80, + -31,-122, -80, -31,-124,-117, -31,-123, -80, -31,-122, -81, -31,-124,-117, -31,-123, -80, -31,-122, + -82, -31,-124,-117, -31,-123, -80, -31,-122, -83, -31,-124,-117, -31,-123, -80, -31,-122, -84, -31, +-124,-117, -31,-123, -80, -31,-122, -85, -31,-124,-117, -31,-123, -80, -31,-122, -86, -31,-124,-117, + -31,-123, -80, -31,-122, -87, -31,-124,-117, -31,-123, -80, -31,-122, -88, -31,-124,-117, -31,-123, + -81, -31,-121,-126, -31,-124,-117, -31,-123, -81, -31,-121,-127, -31,-124,-117, -31,-123, -81, -31, +-121,-128, -31,-124,-117, -31,-123, -81, -31,-122, -65, -31,-124,-117, -31,-123, -81, -31,-122, -66, + -31,-124,-117, -31,-123, -81, -31,-122, -67, -31,-124,-117, -31,-123, -81, -31,-122, -68, -31,-124, +-117, -31,-123, -81, -31,-122, -69, -31,-124,-117, -31,-123, -81, -31,-122, -70, -31,-124,-117, -31, +-123, -81, -31,-122, -71, -31,-124,-117, -31,-123, -81, -31,-122, -72, -31,-124,-117, -31,-123, -81, + -31,-122, -73, -31,-124,-117, -31,-123, -81, -31,-122, -74, -31,-124,-117, -31,-123, -81, -31,-122, + -75, -31,-124,-117, -31,-123, -81, -31,-122, -76, -31,-124,-117, -31,-123, -81, -31,-122, -77, -31, +-124,-117, -31,-123, -81, -31,-122, -78, -31,-124,-117, -31,-123, -81, -31,-122, -79, -31,-124,-117, + -31,-123, -81, -31,-122, -80, -31,-124,-117, -31,-123, -81, -31,-122, -81, -31,-124,-117, -31,-123, + -81, -31,-122, -82, -31,-124,-117, -31,-123, -81, -31,-122, -83, -31,-124,-117, -31,-123, -81, -31, +-122, -84, -31,-124,-117, -31,-123, -81, -31,-122, -85, -31,-124,-117, -31,-123, -81, -31,-122, -86, + -31,-124,-117, -31,-123, -81, -31,-122, -87, -31,-124,-117, -31,-123, -81, -31,-122, -88, -31,-124, +-117, -31,-123, -82, -31,-121,-126, -31,-124,-117, -31,-123, -82, -31,-121,-127, -31,-124,-117, -31, +-123, -82, -31,-121,-128, -31,-124,-117, -31,-123, -82, -31,-122, -65, -31,-124,-117, -31,-123, -82, + -31,-122, -66, -31,-124,-117, -31,-123, -82, -31,-122, -67, -31,-124,-117, -31,-123, -82, -31,-122, + -68, -31,-124,-117, -31,-123, -82, -31,-122, -69, -31,-124,-117, -31,-123, -82, -31,-122, -70, -31, +-124,-117, -31,-123, -82, -31,-122, -71, -31,-124,-117, -31,-123, -82, -31,-122, -72, -31,-124,-117, + -31,-123, -82, -31,-122, -73, -31,-124,-117, -31,-123, -82, -31,-122, -74, -31,-124,-117, -31,-123, + -82, -31,-122, -75, -31,-124,-117, -31,-123, -82, -31,-122, -76, -31,-124,-117, -31,-123, -82, -31, +-122, -77, -31,-124,-117, -31,-123, -82, -31,-122, -78, -31,-124,-117, -31,-123, -82, -31,-122, -79, + -31,-124,-117, -31,-123, -82, -31,-122, -80, -31,-124,-117, -31,-123, -82, -31,-122, -81, -31,-124, +-117, -31,-123, -82, -31,-122, -82, -31,-124,-117, -31,-123, -82, -31,-122, -83, -31,-124,-117, -31, +-123, -82, -31,-122, -84, -31,-124,-117, -31,-123, -82, -31,-122, -85, -31,-124,-117, -31,-123, -82, + -31,-122, -86, -31,-124,-117, -31,-123, -82, -31,-122, -87, -31,-124,-117, -31,-123, -82, -31,-122, + -88, -31,-124,-117, -31,-123, -83, -31,-121,-126, -31,-124,-117, -31,-123, -83, -31,-121,-127, -31, +-124,-117, -31,-123, -83, -31,-121,-128, -31,-124,-117, -31,-123, -83, -31,-122, -65, -31,-124,-117, + -31,-123, -83, -31,-122, -66, -31,-124,-117, -31,-123, -83, -31,-122, -67, -31,-124,-117, -31,-123, + -83, -31,-122, -68, -31,-124,-117, -31,-123, -83, -31,-122, -69, -31,-124,-117, -31,-123, -83, -31, +-122, -70, -31,-124,-117, -31,-123, -83, -31,-122, -71, -31,-124,-117, -31,-123, -83, -31,-122, -72, + -31,-124,-117, -31,-123, -83, -31,-122, -73, -31,-124,-117, -31,-123, -83, -31,-122, -74, -31,-124, +-117, -31,-123, -83, -31,-122, -75, -31,-124,-117, -31,-123, -83, -31,-122, -76, -31,-124,-117, -31, +-123, -83, -31,-122, -77, -31,-124,-117, -31,-123, -83, -31,-122, -78, -31,-124,-117, -31,-123, -83, + -31,-122, -79, -31,-124,-117, -31,-123, -83, -31,-122, -80, -31,-124,-117, -31,-123, -83, -31,-122, + -81, -31,-124,-117, -31,-123, -83, -31,-122, -82, -31,-124,-117, -31,-123, -83, -31,-122, -83, -31, +-124,-117, -31,-123, -83, -31,-122, -84, -31,-124,-117, -31,-123, -83, -31,-122, -85, -31,-124,-117, + -31,-123, -83, -31,-122, -86, -31,-124,-117, -31,-123, -83, -31,-122, -87, -31,-124,-117, -31,-123, + -83, -31,-122, -88, -31,-124,-117, -31,-123, -84, -31,-121,-126, -31,-124,-117, -31,-123, -84, -31, +-121,-127, -31,-124,-117, -31,-123, -84, -31,-121,-128, -31,-124,-117, -31,-123, -84, -31,-122, -65, + -31,-124,-117, -31,-123, -84, -31,-122, -66, -31,-124,-117, -31,-123, -84, -31,-122, -67, -31,-124, +-117, -31,-123, -84, -31,-122, -68, -31,-124,-117, -31,-123, -84, -31,-122, -69, -31,-124,-117, -31, +-123, -84, -31,-122, -70, -31,-124,-117, -31,-123, -84, -31,-122, -71, -31,-124,-117, -31,-123, -84, + -31,-122, -72, -31,-124,-117, -31,-123, -84, -31,-122, -73, -31,-124,-117, -31,-123, -84, -31,-122, + -74, -31,-124,-117, -31,-123, -84, -31,-122, -75, -31,-124,-117, -31,-123, -84, -31,-122, -76, -31, +-124,-117, -31,-123, -84, -31,-122, -77, -31,-124,-117, -31,-123, -84, -31,-122, -78, -31,-124,-117, + -31,-123, -84, -31,-122, -79, -31,-124,-117, -31,-123, -84, -31,-122, -80, -31,-124,-117, -31,-123, + -84, -31,-122, -81, -31,-124,-117, -31,-123, -84, -31,-122, -82, -31,-124,-117, -31,-123, -84, -31, +-122, -83, -31,-124,-117, -31,-123, -84, -31,-122, -84, -31,-124,-117, -31,-123, -84, -31,-122, -85, + -31,-124,-117, -31,-123, -84, -31,-122, -86, -31,-124,-117, -31,-123, -84, -31,-122, -87, -31,-124, +-117, -31,-123, -84, -31,-122, -88, -31,-124,-117, -31,-123, -85, -31,-121,-126, -31,-124,-117, -31, +-123, -85, -31,-121,-127, -31,-124,-117, -31,-123, -85, -31,-121,-128, -31,-124,-117, -31,-123, -85, + -31,-122, -65, -31,-124,-117, -31,-123, -85, -31,-122, -66, -31,-124,-117, -31,-123, -85, -31,-122, + -67, -31,-124,-117, -31,-123, -85, -31,-122, -68, -31,-124,-117, -31,-123, -85, -31,-122, -69, -31, +-124,-117, -31,-123, -85, -31,-122, -70, -31,-124,-117, -31,-123, -85, -31,-122, -71, -31,-124,-117, + -31,-123, -85, -31,-122, -72, -31,-124,-117, -31,-123, -85, -31,-122, -73, -31,-124,-117, -31,-123, + -85, -31,-122, -74, -31,-124,-117, -31,-123, -85, -31,-122, -75, -31,-124,-117, -31,-123, -85, -31, +-122, -76, -31,-124,-117, -31,-123, -85, -31,-122, -77, -31,-124,-117, -31,-123, -85, -31,-122, -78, + -31,-124,-117, -31,-123, -85, -31,-122, -79, -31,-124,-117, -31,-123, -85, -31,-122, -80, -31,-124, +-117, -31,-123, -85, -31,-122, -81, -31,-124,-117, -31,-123, -85, -31,-122, -82, -31,-124,-117, -31, +-123, -85, -31,-122, -83, -31,-124,-117, -31,-123, -85, -31,-122, -84, -31,-124,-117, -31,-123, -85, + -31,-122, -85, -31,-124,-117, -31,-123, -85, -31,-122, -86, -31,-124,-117, -31,-123, -85, -31,-122, + -87, -31,-124,-117, -31,-123, -85, -31,-122, -88, -31,-124,-117, -31,-123, -86, -31,-121,-126, -31, +-124,-117, -31,-123, -86, -31,-121,-127, -31,-124,-117, -31,-123, -86, -31,-121,-128, -31,-124,-117, + -31,-123, -86, -31,-122, -65, -31,-124,-117, -31,-123, -86, -31,-122, -66, -31,-124,-117, -31,-123, + -86, -31,-122, -67, -31,-124,-117, -31,-123, -86, -31,-122, -68, -31,-124,-117, -31,-123, -86, -31, +-122, -69, -31,-124,-117, -31,-123, -86, -31,-122, -70, -31,-124,-117, -31,-123, -86, -31,-122, -71, + -31,-124,-117, -31,-123, -86, -31,-122, -72, -31,-124,-117, -31,-123, -86, -31,-122, -73, -31,-124, +-117, -31,-123, -86, -31,-122, -74, -31,-124,-117, -31,-123, -86, -31,-122, -75, -31,-124,-117, -31, +-123, -86, -31,-122, -76, -31,-124,-117, -31,-123, -86, -31,-122, -77, -31,-124,-117, -31,-123, -86, + -31,-122, -78, -31,-124,-117, -31,-123, -86, -31,-122, -79, -31,-124,-117, -31,-123, -86, -31,-122, + -80, -31,-124,-117, -31,-123, -86, -31,-122, -81, -31,-124,-117, -31,-123, -86, -31,-122, -82, -31, +-124,-117, -31,-123, -86, -31,-122, -83, -31,-124,-117, -31,-123, -86, -31,-122, -84, -31,-124,-117, + -31,-123, -86, -31,-122, -85, -31,-124,-117, -31,-123, -86, -31,-122, -86, -31,-124,-117, -31,-123, + -86, -31,-122, -87, -31,-124,-117, -31,-123, -86, -31,-122, -88, -31,-124,-117, -31,-123, -87, -31, +-121,-126, -31,-124,-117, -31,-123, -87, -31,-121,-127, -31,-124,-117, -31,-123, -87, -31,-121,-128, + -31,-124,-117, -31,-123, -87, -31,-122, -65, -31,-124,-117, -31,-123, -87, -31,-122, -66, -31,-124, +-117, -31,-123, -87, -31,-122, -67, -31,-124,-117, -31,-123, -87, -31,-122, -68, -31,-124,-117, -31, +-123, -87, -31,-122, -69, -31,-124,-117, -31,-123, -87, -31,-122, -70, -31,-124,-117, -31,-123, -87, + -31,-122, -71, -31,-124,-117, -31,-123, -87, -31,-122, -72, -31,-124,-117, -31,-123, -87, -31,-122, + -73, -31,-124,-117, -31,-123, -87, -31,-122, -74, -31,-124,-117, -31,-123, -87, -31,-122, -75, -31, +-124,-117, -31,-123, -87, -31,-122, -76, -31,-124,-117, -31,-123, -87, -31,-122, -77, -31,-124,-117, + -31,-123, -87, -31,-122, -78, -31,-124,-117, -31,-123, -87, -31,-122, -79, -31,-124,-117, -31,-123, + -87, -31,-122, -80, -31,-124,-117, -31,-123, -87, -31,-122, -81, -31,-124,-117, -31,-123, -87, -31, +-122, -82, -31,-124,-117, -31,-123, -87, -31,-122, -83, -31,-124,-117, -31,-123, -87, -31,-122, -84, + -31,-124,-117, -31,-123, -87, -31,-122, -85, -31,-124,-117, -31,-123, -87, -31,-122, -86, -31,-124, +-117, -31,-123, -87, -31,-122, -87, -31,-124,-117, -31,-123, -87, -31,-122, -88, -31,-124,-117, -31, +-123, -88, -31,-121,-126, -31,-124,-117, -31,-123, -88, -31,-121,-127, -31,-124,-117, -31,-123, -88, + -31,-121,-128, -31,-124,-117, -31,-123, -88, -31,-122, -65, -31,-124,-117, -31,-123, -88, -31,-122, + -66, -31,-124,-117, -31,-123, -88, -31,-122, -67, -31,-124,-117, -31,-123, -88, -31,-122, -68, -31, +-124,-117, -31,-123, -88, -31,-122, -69, -31,-124,-117, -31,-123, -88, -31,-122, -70, -31,-124,-117, + -31,-123, -88, -31,-122, -71, -31,-124,-117, -31,-123, -88, -31,-122, -72, -31,-124,-117, -31,-123, + -88, -31,-122, -73, -31,-124,-117, -31,-123, -88, -31,-122, -74, -31,-124,-117, -31,-123, -88, -31, +-122, -75, -31,-124,-117, -31,-123, -88, -31,-122, -76, -31,-124,-117, -31,-123, -88, -31,-122, -77, + -31,-124,-117, -31,-123, -88, -31,-122, -78, -31,-124,-117, -31,-123, -88, -31,-122, -79, -31,-124, +-117, -31,-123, -88, -31,-122, -80, -31,-124,-117, -31,-123, -88, -31,-122, -81, -31,-124,-117, -31, +-123, -88, -31,-122, -82, -31,-124,-117, -31,-123, -88, -31,-122, -83, -31,-124,-117, -31,-123, -88, + -31,-122, -84, -31,-124,-117, -31,-123, -88, -31,-122, -85, -31,-124,-117, -31,-123, -88, -31,-122, + -86, -31,-124,-117, -31,-123, -88, -31,-122, -87, -31,-124,-117, -31,-123, -88, -31,-122, -88, -31, +-124,-117, -31,-123, -89, -31,-121,-126, -31,-124,-117, -31,-123, -89, -31,-121,-127, -31,-124,-117, + -31,-123, -89, -31,-121,-128, -31,-124,-117, -31,-123, -89, -31,-122, -65, -31,-124,-117, -31,-123, + -89, -31,-122, -66, -31,-124,-117, -31,-123, -89, -31,-122, -67, -31,-124,-117, -31,-123, -89, -31, +-122, -68, -31,-124,-117, -31,-123, -89, -31,-122, -69, -31,-124,-117, -31,-123, -89, -31,-122, -70, + -31,-124,-117, -31,-123, -89, -31,-122, -71, -31,-124,-117, -31,-123, -89, -31,-122, -72, -31,-124, +-117, -31,-123, -89, -31,-122, -73, -31,-124,-117, -31,-123, -89, -31,-122, -74, -31,-124,-117, -31, +-123, -89, -31,-122, -75, -31,-124,-117, -31,-123, -89, -31,-122, -76, -31,-124,-117, -31,-123, -89, + -31,-122, -77, -31,-124,-117, -31,-123, -89, -31,-122, -78, -31,-124,-117, -31,-123, -89, -31,-122, + -79, -31,-124,-117, -31,-123, -89, -31,-122, -80, -31,-124,-117, -31,-123, -89, -31,-122, -81, -31, +-124,-117, -31,-123, -89, -31,-122, -82, -31,-124,-117, -31,-123, -89, -31,-122, -83, -31,-124,-117, + -31,-123, -89, -31,-122, -84, -31,-124,-117, -31,-123, -89, -31,-122, -85, -31,-124,-117, -31,-123, + -89, -31,-122, -86, -31,-124,-117, -31,-123, -89, -31,-122, -87, -31,-124,-117, -31,-123, -89, -31, +-122, -88, -31,-124,-117, -31,-123, -90, -31,-121,-126, -31,-124,-117, -31,-123, -90, -31,-121,-127, + -31,-124,-117, -31,-123, -90, -31,-121,-128, -31,-124,-117, -31,-123, -90, -31,-122, -65, -31,-124, +-117, -31,-123, -90, -31,-122, -66, -31,-124,-117, -31,-123, -90, -31,-122, -67, -31,-124,-117, -31, +-123, -90, -31,-122, -68, -31,-124,-117, -31,-123, -90, -31,-122, -69, -31,-124,-117, -31,-123, -90, + -31,-122, -70, -31,-124,-117, -31,-123, -90, -31,-122, -71, -31,-124,-117, -31,-123, -90, -31,-122, + -72, -31,-124,-117, -31,-123, -90, -31,-122, -73, -31,-124,-117, -31,-123, -90, -31,-122, -74, -31, +-124,-117, -31,-123, -90, -31,-122, -75, -31,-124,-117, -31,-123, -90, -31,-122, -76, -31,-124,-117, + -31,-123, -90, -31,-122, -77, -31,-124,-117, -31,-123, -90, -31,-122, -78, -31,-124,-117, -31,-123, + -90, -31,-122, -79, -31,-124,-117, -31,-123, -90, -31,-122, -80, -31,-124,-117, -31,-123, -90, -31, +-122, -81, -31,-124,-117, -31,-123, -90, -31,-122, -82, -31,-124,-117, -31,-123, -90, -31,-122, -83, + -31,-124,-117, -31,-123, -90, -31,-122, -84, -31,-124,-117, -31,-123, -90, -31,-122, -85, -31,-124, +-117, -31,-123, -90, -31,-122, -86, -31,-124,-117, -31,-123, -90, -31,-122, -87, -31,-124,-117, -31, +-123, -90, -31,-122, -88, -31,-124,-117, -31,-123, -91, -31,-121,-126, -31,-124,-117, -31,-123, -91, + -31,-121,-127, -31,-124,-117, -31,-123, -91, -31,-121,-128, -31,-124,-117, -31,-123, -91, -31,-122, + -65, -31,-124,-117, -31,-123, -91, -31,-122, -66, -31,-124,-117, -31,-123, -91, -31,-122, -67, -31, +-124,-117, -31,-123, -91, -31,-122, -68, -31,-124,-117, -31,-123, -91, -31,-122, -69, -31,-124,-117, + -31,-123, -91, -31,-122, -70, -31,-124,-117, -31,-123, -91, -31,-122, -71, -31,-124,-117, -31,-123, + -91, -31,-122, -72, -31,-124,-117, -31,-123, -91, -31,-122, -73, -31,-124,-117, -31,-123, -91, -31, +-122, -74, -31,-124,-117, -31,-123, -91, -31,-122, -75, -31,-124,-117, -31,-123, -91, -31,-122, -76, + -31,-124,-117, -31,-123, -91, -31,-122, -77, -31,-124,-117, -31,-123, -91, -31,-122, -78, -31,-124, +-117, -31,-123, -91, -31,-122, -79, -31,-124,-117, -31,-123, -91, -31,-122, -80, -31,-124,-117, -31, +-123, -91, -31,-122, -81, -31,-124,-117, -31,-123, -91, -31,-122, -82, -31,-124,-117, -31,-123, -91, + -31,-122, -83, -31,-124,-117, -31,-123, -91, -31,-122, -84, -31,-124,-117, -31,-123, -91, -31,-122, + -85, -31,-124,-117, -31,-123, -91, -31,-122, -86, -31,-124,-117, -31,-123, -91, -31,-122, -87, -31, +-124,-117, -31,-123, -91, -31,-122, -88, -31,-124,-117, -31,-123, -92, -31,-121,-126, -31,-124,-117, + -31,-123, -92, -31,-121,-127, -31,-124,-117, -31,-123, -92, -31,-121,-128, -31,-124,-117, -31,-123, + -92, -31,-122, -65, -31,-124,-117, -31,-123, -92, -31,-122, -66, -31,-124,-117, -31,-123, -92, -31, +-122, -67, -31,-124,-117, -31,-123, -92, -31,-122, -68, -31,-124,-117, -31,-123, -92, -31,-122, -69, + -31,-124,-117, -31,-123, -92, -31,-122, -70, -31,-124,-117, -31,-123, -92, -31,-122, -71, -31,-124, +-117, -31,-123, -92, -31,-122, -72, -31,-124,-117, -31,-123, -92, -31,-122, -73, -31,-124,-117, -31, +-123, -92, -31,-122, -74, -31,-124,-117, -31,-123, -92, -31,-122, -75, -31,-124,-117, -31,-123, -92, + -31,-122, -76, -31,-124,-117, -31,-123, -92, -31,-122, -77, -31,-124,-117, -31,-123, -92, -31,-122, + -78, -31,-124,-117, -31,-123, -92, -31,-122, -79, -31,-124,-117, -31,-123, -92, -31,-122, -80, -31, +-124,-117, -31,-123, -92, -31,-122, -81, -31,-124,-117, -31,-123, -92, -31,-122, -82, -31,-124,-117, + -31,-123, -92, -31,-122, -83, -31,-124,-117, -31,-123, -92, -31,-122, -84, -31,-124,-117, -31,-123, + -92, -31,-122, -85, -31,-124,-117, -31,-123, -92, -31,-122, -86, -31,-124,-117, -31,-123, -92, -31, +-122, -87, -31,-124,-117, -31,-123, -92, -31,-122, -88, -31,-124,-117, -31,-123, -93, -31,-121,-126, + -31,-124,-117, -31,-123, -93, -31,-121,-127, -31,-124,-117, -31,-123, -93, -31,-121,-128, -31,-124, +-117, -31,-123, -93, -31,-122, -65, -31,-124,-117, -31,-123, -93, -31,-122, -66, -31,-124,-117, -31, +-123, -93, -31,-122, -67, -31,-124,-117, -31,-123, -93, -31,-122, -68, -31,-124,-117, -31,-123, -93, + -31,-122, -69, -31,-124,-117, -31,-123, -93, -31,-122, -70, -31,-124,-117, -31,-123, -93, -31,-122, + -71, -31,-124,-117, -31,-123, -93, -31,-122, -72, -31,-124,-117, -31,-123, -93, -31,-122, -73, -31, +-124,-117, -31,-123, -93, -31,-122, -74, -31,-124,-117, -31,-123, -93, -31,-122, -75, -31,-124,-117, + -31,-123, -93, -31,-122, -76, -31,-124,-117, -31,-123, -93, -31,-122, -77, -31,-124,-117, -31,-123, + -93, -31,-122, -78, -31,-124,-117, -31,-123, -93, -31,-122, -79, -31,-124,-117, -31,-123, -93, -31, +-122, -80, -31,-124,-117, -31,-123, -93, -31,-122, -81, -31,-124,-117, -31,-123, -93, -31,-122, -82, + -31,-124,-117, -31,-123, -93, -31,-122, -83, -31,-124,-117, -31,-123, -93, -31,-122, -84, -31,-124, +-117, -31,-123, -93, -31,-122, -85, -31,-124,-117, -31,-123, -93, -31,-122, -86, -31,-124,-117, -31, +-123, -93, -31,-122, -87, -31,-124,-117, -31,-123, -93, -31,-122, -88, -31,-124,-117, -31,-123, -94, + -31,-121,-126, -31,-124,-117, -31,-123, -94, -31,-121,-127, -31,-124,-117, -31,-123, -94, -31,-121, +-128, -31,-124,-117, -31,-123, -94, -31,-122, -65, -31,-124,-117, -31,-123, -94, -31,-122, -66, -31, +-124,-117, -31,-123, -94, -31,-122, -67, -31,-124,-117, -31,-123, -94, -31,-122, -68, -31,-124,-117, + -31,-123, -94, -31,-122, -69, -31,-124,-117, -31,-123, -94, -31,-122, -70, -31,-124,-117, -31,-123, + -94, -31,-122, -71, -31,-124,-117, -31,-123, -94, -31,-122, -72, -31,-124,-117, -31,-123, -94, -31, +-122, -73, -31,-124,-117, -31,-123, -94, -31,-122, -74, -31,-124,-117, -31,-123, -94, -31,-122, -75, + -31,-124,-117, -31,-123, -94, -31,-122, -76, -31,-124,-117, -31,-123, -94, -31,-122, -77, -31,-124, +-117, -31,-123, -94, -31,-122, -78, -31,-124,-117, -31,-123, -94, -31,-122, -79, -31,-124,-117, -31, +-123, -94, -31,-122, -80, -31,-124,-117, -31,-123, -94, -31,-122, -81, -31,-124,-117, -31,-123, -94, + -31,-122, -82, -31,-124,-117, -31,-123, -94, -31,-122, -83, -31,-124,-117, -31,-123, -94, -31,-122, + -84, -31,-124,-117, -31,-123, -94, -31,-122, -85, -31,-124,-117, -31,-123, -94, -31,-122, -86, -31, +-124,-117, -31,-123, -94, -31,-122, -87, -31,-124,-117, -31,-123, -94, -31,-122, -88, -31,-124,-117, + -31,-123, -95, -31,-121,-126, -31,-124,-117, -31,-123, -95, -31,-121,-127, -31,-124,-117, -31,-123, + -95, -31,-121,-128, -31,-124,-117, -31,-123, -95, -31,-122, -65, -31,-124,-117, -31,-123, -95, -31, +-122, -66, -31,-124,-117, -31,-123, -95, -31,-122, -67, -31,-124,-117, -31,-123, -95, -31,-122, -68, + -31,-124,-117, -31,-123, -95, -31,-122, -69, -31,-124,-117, -31,-123, -95, -31,-122, -70, -31,-124, +-117, -31,-123, -95, -31,-122, -71, -31,-124,-117, -31,-123, -95, -31,-122, -72, -31,-124,-117, -31, +-123, -95, -31,-122, -73, -31,-124,-117, -31,-123, -95, -31,-122, -74, -31,-124,-117, -31,-123, -95, + -31,-122, -75, -31,-124,-117, -31,-123, -95, -31,-122, -76, -31,-124,-117, -31,-123, -95, -31,-122, + -77, -31,-124,-117, -31,-123, -95, -31,-122, -78, -31,-124,-117, -31,-123, -95, -31,-122, -79, -31, +-124,-117, -31,-123, -95, -31,-122, -80, -31,-124,-117, -31,-123, -95, -31,-122, -81, -31,-124,-117, + -31,-123, -95, -31,-122, -82, -31,-124,-117, -31,-123, -95, -31,-122, -83, -31,-124,-117, -31,-123, + -95, -31,-122, -84, -31,-124,-117, -31,-123, -95, -31,-122, -85, -31,-124,-117, -31,-123, -95, -31, +-122, -86, -31,-124,-117, -31,-123, -95, -31,-122, -87, -31,-124,-117, -31,-123, -95, -31,-122, -88, + -31,-124,-118, -31,-123, -75, -31,-121,-126, -31,-124,-118, -31,-123, -75, -31,-121,-127, -31,-124, +-118, -31,-123, -75, -31,-121,-128, -31,-124,-118, -31,-123, -75, -31,-122, -65, -31,-124,-118, -31, +-123, -75, -31,-122, -66, -31,-124,-118, -31,-123, -75, -31,-122, -67, -31,-124,-118, -31,-123, -75, + -31,-122, -68, -31,-124,-118, -31,-123, -75, -31,-122, -69, -31,-124,-118, -31,-123, -75, -31,-122, + -70, -31,-124,-118, -31,-123, -75, -31,-122, -71, -31,-124,-118, -31,-123, -75, -31,-122, -72, -31, +-124,-118, -31,-123, -75, -31,-122, -73, -31,-124,-118, -31,-123, -75, -31,-122, -74, -31,-124,-118, + -31,-123, -75, -31,-122, -75, -31,-124,-118, -31,-123, -75, -31,-122, -76, -31,-124,-118, -31,-123, + -75, -31,-122, -77, -31,-124,-118, -31,-123, -75, -31,-122, -78, -31,-124,-118, -31,-123, -75, -31, +-122, -79, -31,-124,-118, -31,-123, -75, -31,-122, -80, -31,-124,-118, -31,-123, -75, -31,-122, -81, + -31,-124,-118, -31,-123, -75, -31,-122, -82, -31,-124,-118, -31,-123, -75, -31,-122, -83, -31,-124, +-118, -31,-123, -75, -31,-122, -84, -31,-124,-118, -31,-123, -75, -31,-122, -85, -31,-124,-118, -31, +-123, -75, -31,-122, -86, -31,-124,-118, -31,-123, -75, -31,-122, -87, -31,-124,-118, -31,-123, -75, + -31,-122, -88, -31,-124,-118, -31,-123, -76, -31,-121,-126, -31,-124,-118, -31,-123, -76, -31,-121, +-127, -31,-124,-118, -31,-123, -76, -31,-121,-128, -31,-124,-118, -31,-123, -76, -31,-122, -65, -31, +-124,-118, -31,-123, -76, -31,-122, -66, -31,-124,-118, -31,-123, -76, -31,-122, -67, -31,-124,-118, + -31,-123, -76, -31,-122, -68, -31,-124,-118, -31,-123, -76, -31,-122, -69, -31,-124,-118, -31,-123, + -76, -31,-122, -70, -31,-124,-118, -31,-123, -76, -31,-122, -71, -31,-124,-118, -31,-123, -76, -31, +-122, -72, -31,-124,-118, -31,-123, -76, -31,-122, -73, -31,-124,-118, -31,-123, -76, -31,-122, -74, + -31,-124,-118, -31,-123, -76, -31,-122, -75, -31,-124,-118, -31,-123, -76, -31,-122, -76, -31,-124, +-118, -31,-123, -76, -31,-122, -77, -31,-124,-118, -31,-123, -76, -31,-122, -78, -31,-124,-118, -31, +-123, -76, -31,-122, -79, -31,-124,-118, -31,-123, -76, -31,-122, -80, -31,-124,-118, -31,-123, -76, + -31,-122, -81, -31,-124,-118, -31,-123, -76, -31,-122, -82, -31,-124,-118, -31,-123, -76, -31,-122, + -83, -31,-124,-118, -31,-123, -76, -31,-122, -84, -31,-124,-118, -31,-123, -76, -31,-122, -85, -31, +-124,-118, -31,-123, -76, -31,-122, -86, -31,-124,-118, -31,-123, -76, -31,-122, -87, -31,-124,-118, + -31,-123, -76, -31,-122, -88, -31,-124,-118, -31,-123, -77, -31,-121,-126, -31,-124,-118, -31,-123, + -77, -31,-121,-127, -31,-124,-118, -31,-123, -77, -31,-121,-128, -31,-124,-118, -31,-123, -77, -31, +-122, -65, -31,-124,-118, -31,-123, -77, -31,-122, -66, -31,-124,-118, -31,-123, -77, -31,-122, -67, + -31,-124,-118, -31,-123, -77, -31,-122, -68, -31,-124,-118, -31,-123, -77, -31,-122, -69, -31,-124, +-118, -31,-123, -77, -31,-122, -70, -31,-124,-118, -31,-123, -77, -31,-122, -71, -31,-124,-118, -31, +-123, -77, -31,-122, -72, -31,-124,-118, -31,-123, -77, -31,-122, -73, -31,-124,-118, -31,-123, -77, + -31,-122, -74, -31,-124,-118, -31,-123, -77, -31,-122, -75, -31,-124,-118, -31,-123, -77, -31,-122, + -76, -31,-124,-118, -31,-123, -77, -31,-122, -77, -31,-124,-118, -31,-123, -77, -31,-122, -78, -31, +-124,-118, -31,-123, -77, -31,-122, -79, -31,-124,-118, -31,-123, -77, -31,-122, -80, -31,-124,-118, + -31,-123, -77, -31,-122, -81, -31,-124,-118, -31,-123, -77, -31,-122, -82, -31,-124,-118, -31,-123, + -77, -31,-122, -83, -31,-124,-118, -31,-123, -77, -31,-122, -84, -31,-124,-118, -31,-123, -77, -31, +-122, -85, -31,-124,-118, -31,-123, -77, -31,-122, -86, -31,-124,-118, -31,-123, -77, -31,-122, -87, + -31,-124,-118, -31,-123, -77, -31,-122, -88, -31,-124,-118, -31,-123, -78, -31,-121,-126, -31,-124, +-118, -31,-123, -78, -31,-121,-127, -31,-124,-118, -31,-123, -78, -31,-121,-128, -31,-124,-118, -31, +-123, -78, -31,-122, -65, -31,-124,-118, -31,-123, -78, -31,-122, -66, -31,-124,-118, -31,-123, -78, + -31,-122, -67, -31,-124,-118, -31,-123, -78, -31,-122, -68, -31,-124,-118, -31,-123, -78, -31,-122, + -69, -31,-124,-118, -31,-123, -78, -31,-122, -70, -31,-124,-118, -31,-123, -78, -31,-122, -71, -31, +-124,-118, -31,-123, -78, -31,-122, -72, -31,-124,-118, -31,-123, -78, -31,-122, -73, -31,-124,-118, + -31,-123, -78, -31,-122, -74, -31,-124,-118, -31,-123, -78, -31,-122, -75, -31,-124,-118, -31,-123, + -78, -31,-122, -76, -31,-124,-118, -31,-123, -78, -31,-122, -77, -31,-124,-118, -31,-123, -78, -31, +-122, -78, -31,-124,-118, -31,-123, -78, -31,-122, -79, -31,-124,-118, -31,-123, -78, -31,-122, -80, + -31,-124,-118, -31,-123, -78, -31,-122, -81, -31,-124,-118, -31,-123, -78, -31,-122, -82, -31,-124, +-118, -31,-123, -78, -31,-122, -83, -31,-124,-118, -31,-123, -78, -31,-122, -84, -31,-124,-118, -31, +-123, -78, -31,-122, -85, -31,-124,-118, -31,-123, -78, -31,-122, -86, -31,-124,-118, -31,-123, -78, + -31,-122, -87, -31,-124,-118, -31,-123, -78, -31,-122, -88, -31,-124,-118, -31,-123, -79, -31,-121, +-126, -31,-124,-118, -31,-123, -79, -31,-121,-127, -31,-124,-118, -31,-123, -79, -31,-121,-128, -31, +-124,-118, -31,-123, -79, -31,-122, -65, -31,-124,-118, -31,-123, -79, -31,-122, -66, -31,-124,-118, + -31,-123, -79, -31,-122, -67, -31,-124,-118, -31,-123, -79, -31,-122, -68, -31,-124,-118, -31,-123, + -79, -31,-122, -69, -31,-124,-118, -31,-123, -79, -31,-122, -70, -31,-124,-118, -31,-123, -79, -31, +-122, -71, -31,-124,-118, -31,-123, -79, -31,-122, -72, -31,-124,-118, -31,-123, -79, -31,-122, -73, + -31,-124,-118, -31,-123, -79, -31,-122, -74, -31,-124,-118, -31,-123, -79, -31,-122, -75, -31,-124, +-118, -31,-123, -79, -31,-122, -76, -31,-124,-118, -31,-123, -79, -31,-122, -77, -31,-124,-118, -31, +-123, -79, -31,-122, -78, -31,-124,-118, -31,-123, -79, -31,-122, -79, -31,-124,-118, -31,-123, -79, + -31,-122, -80, -31,-124,-118, -31,-123, -79, -31,-122, -81, -31,-124,-118, -31,-123, -79, -31,-122, + -82, -31,-124,-118, -31,-123, -79, -31,-122, -83, -31,-124,-118, -31,-123, -79, -31,-122, -84, -31, +-124,-118, -31,-123, -79, -31,-122, -85, -31,-124,-118, -31,-123, -79, -31,-122, -86, -31,-124,-118, + -31,-123, -79, -31,-122, -87, -31,-124,-118, -31,-123, -79, -31,-122, -88, -31,-124,-118, -31,-123, + -80, -31,-121,-126, -31,-124,-118, -31,-123, -80, -31,-121,-127, -31,-124,-118, -31,-123, -80, -31, +-121,-128, -31,-124,-118, -31,-123, -80, -31,-122, -65, -31,-124,-118, -31,-123, -80, -31,-122, -66, + -31,-124,-118, -31,-123, -80, -31,-122, -67, -31,-124,-118, -31,-123, -80, -31,-122, -68, -31,-124, +-118, -31,-123, -80, -31,-122, -69, -31,-124,-118, -31,-123, -80, -31,-122, -70, -31,-124,-118, -31, +-123, -80, -31,-122, -71, -31,-124,-118, -31,-123, -80, -31,-122, -72, -31,-124,-118, -31,-123, -80, + -31,-122, -73, -31,-124,-118, -31,-123, -80, -31,-122, -74, -31,-124,-118, -31,-123, -80, -31,-122, + -75, -31,-124,-118, -31,-123, -80, -31,-122, -76, -31,-124,-118, -31,-123, -80, -31,-122, -77, -31, +-124,-118, -31,-123, -80, -31,-122, -78, -31,-124,-118, -31,-123, -80, -31,-122, -79, -31,-124,-118, + -31,-123, -80, -31,-122, -80, -31,-124,-118, -31,-123, -80, -31,-122, -81, -31,-124,-118, -31,-123, + -80, -31,-122, -82, -31,-124,-118, -31,-123, -80, -31,-122, -83, -31,-124,-118, -31,-123, -80, -31, +-122, -84, -31,-124,-118, -31,-123, -80, -31,-122, -85, -31,-124,-118, -31,-123, -80, -31,-122, -86, + -31,-124,-118, -31,-123, -80, -31,-122, -87, -31,-124,-118, -31,-123, -80, -31,-122, -88, -31,-124, +-118, -31,-123, -81, -31,-121,-126, -31,-124,-118, -31,-123, -81, -31,-121,-127, -31,-124,-118, -31, +-123, -81, -31,-121,-128, -31,-124,-118, -31,-123, -81, -31,-122, -65, -31,-124,-118, -31,-123, -81, + -31,-122, -66, -31,-124,-118, -31,-123, -81, -31,-122, -67, -31,-124,-118, -31,-123, -81, -31,-122, + -68, -31,-124,-118, -31,-123, -81, -31,-122, -69, -31,-124,-118, -31,-123, -81, -31,-122, -70, -31, +-124,-118, -31,-123, -81, -31,-122, -71, -31,-124,-118, -31,-123, -81, -31,-122, -72, -31,-124,-118, + -31,-123, -81, -31,-122, -73, -31,-124,-118, -31,-123, -81, -31,-122, -74, -31,-124,-118, -31,-123, + -81, -31,-122, -75, -31,-124,-118, -31,-123, -81, -31,-122, -76, -31,-124,-118, -31,-123, -81, -31, +-122, -77, -31,-124,-118, -31,-123, -81, -31,-122, -78, -31,-124,-118, -31,-123, -81, -31,-122, -79, + -31,-124,-118, -31,-123, -81, -31,-122, -80, -31,-124,-118, -31,-123, -81, -31,-122, -81, -31,-124, +-118, -31,-123, -81, -31,-122, -82, -31,-124,-118, -31,-123, -81, -31,-122, -83, -31,-124,-118, -31, +-123, -81, -31,-122, -84, -31,-124,-118, -31,-123, -81, -31,-122, -85, -31,-124,-118, -31,-123, -81, + -31,-122, -86, -31,-124,-118, -31,-123, -81, -31,-122, -87, -31,-124,-118, -31,-123, -81, -31,-122, + -88, -31,-124,-118, -31,-123, -82, -31,-121,-126, -31,-124,-118, -31,-123, -82, -31,-121,-127, -31, +-124,-118, -31,-123, -82, -31,-121,-128, -31,-124,-118, -31,-123, -82, -31,-122, -65, -31,-124,-118, + -31,-123, -82, -31,-122, -66, -31,-124,-118, -31,-123, -82, -31,-122, -67, -31,-124,-118, -31,-123, + -82, -31,-122, -68, -31,-124,-118, -31,-123, -82, -31,-122, -69, -31,-124,-118, -31,-123, -82, -31, +-122, -70, -31,-124,-118, -31,-123, -82, -31,-122, -71, -31,-124,-118, -31,-123, -82, -31,-122, -72, + -31,-124,-118, -31,-123, -82, -31,-122, -73, -31,-124,-118, -31,-123, -82, -31,-122, -74, -31,-124, +-118, -31,-123, -82, -31,-122, -75, -31,-124,-118, -31,-123, -82, -31,-122, -76, -31,-124,-118, -31, +-123, -82, -31,-122, -77, -31,-124,-118, -31,-123, -82, -31,-122, -78, -31,-124,-118, -31,-123, -82, + -31,-122, -79, -31,-124,-118, -31,-123, -82, -31,-122, -80, -31,-124,-118, -31,-123, -82, -31,-122, + -81, -31,-124,-118, -31,-123, -82, -31,-122, -82, -31,-124,-118, -31,-123, -82, -31,-122, -83, -31, +-124,-118, -31,-123, -82, -31,-122, -84, -31,-124,-118, -31,-123, -82, -31,-122, -85, -31,-124,-118, + -31,-123, -82, -31,-122, -86, -31,-124,-118, -31,-123, -82, -31,-122, -87, -31,-124,-118, -31,-123, + -82, -31,-122, -88, -31,-124,-118, -31,-123, -83, -31,-121,-126, -31,-124,-118, -31,-123, -83, -31, +-121,-127, -31,-124,-118, -31,-123, -83, -31,-121,-128, -31,-124,-118, -31,-123, -83, -31,-122, -65, + -31,-124,-118, -31,-123, -83, -31,-122, -66, -31,-124,-118, -31,-123, -83, -31,-122, -67, -31,-124, +-118, -31,-123, -83, -31,-122, -68, -31,-124,-118, -31,-123, -83, -31,-122, -69, -31,-124,-118, -31, +-123, -83, -31,-122, -70, -31,-124,-118, -31,-123, -83, -31,-122, -71, -31,-124,-118, -31,-123, -83, + -31,-122, -72, -31,-124,-118, -31,-123, -83, -31,-122, -73, -31,-124,-118, -31,-123, -83, -31,-122, + -74, -31,-124,-118, -31,-123, -83, -31,-122, -75, -31,-124,-118, -31,-123, -83, -31,-122, -76, -31, +-124,-118, -31,-123, -83, -31,-122, -77, -31,-124,-118, -31,-123, -83, -31,-122, -78, -31,-124,-118, + -31,-123, -83, -31,-122, -79, -31,-124,-118, -31,-123, -83, -31,-122, -80, -31,-124,-118, -31,-123, + -83, -31,-122, -81, -31,-124,-118, -31,-123, -83, -31,-122, -82, -31,-124,-118, -31,-123, -83, -31, +-122, -83, -31,-124,-118, -31,-123, -83, -31,-122, -84, -31,-124,-118, -31,-123, -83, -31,-122, -85, + -31,-124,-118, -31,-123, -83, -31,-122, -86, -31,-124,-118, -31,-123, -83, -31,-122, -87, -31,-124, +-118, -31,-123, -83, -31,-122, -88, -31,-124,-118, -31,-123, -84, -31,-121,-126, -31,-124,-118, -31, +-123, -84, -31,-121,-127, -31,-124,-118, -31,-123, -84, -31,-121,-128, -31,-124,-118, -31,-123, -84, + -31,-122, -65, -31,-124,-118, -31,-123, -84, -31,-122, -66, -31,-124,-118, -31,-123, -84, -31,-122, + -67, -31,-124,-118, -31,-123, -84, -31,-122, -68, -31,-124,-118, -31,-123, -84, -31,-122, -69, -31, +-124,-118, -31,-123, -84, -31,-122, -70, -31,-124,-118, -31,-123, -84, -31,-122, -71, -31,-124,-118, + -31,-123, -84, -31,-122, -72, -31,-124,-118, -31,-123, -84, -31,-122, -73, -31,-124,-118, -31,-123, + -84, -31,-122, -74, -31,-124,-118, -31,-123, -84, -31,-122, -75, -31,-124,-118, -31,-123, -84, -31, +-122, -76, -31,-124,-118, -31,-123, -84, -31,-122, -77, -31,-124,-118, -31,-123, -84, -31,-122, -78, + -31,-124,-118, -31,-123, -84, -31,-122, -79, -31,-124,-118, -31,-123, -84, -31,-122, -80, -31,-124, +-118, -31,-123, -84, -31,-122, -81, -31,-124,-118, -31,-123, -84, -31,-122, -82, -31,-124,-118, -31, +-123, -84, -31,-122, -83, -31,-124,-118, -31,-123, -84, -31,-122, -84, -31,-124,-118, -31,-123, -84, + -31,-122, -85, -31,-124,-118, -31,-123, -84, -31,-122, -86, -31,-124,-118, -31,-123, -84, -31,-122, + -87, -31,-124,-118, -31,-123, -84, -31,-122, -88, -31,-124,-118, -31,-123, -85, -31,-121,-126, -31, +-124,-118, -31,-123, -85, -31,-121,-127, -31,-124,-118, -31,-123, -85, -31,-121,-128, -31,-124,-118, + -31,-123, -85, -31,-122, -65, -31,-124,-118, -31,-123, -85, -31,-122, -66, -31,-124,-118, -31,-123, + -85, -31,-122, -67, -31,-124,-118, -31,-123, -85, -31,-122, -68, -31,-124,-118, -31,-123, -85, -31, +-122, -69, -31,-124,-118, -31,-123, -85, -31,-122, -70, -31,-124,-118, -31,-123, -85, -31,-122, -71, + -31,-124,-118, -31,-123, -85, -31,-122, -72, -31,-124,-118, -31,-123, -85, -31,-122, -73, -31,-124, +-118, -31,-123, -85, -31,-122, -74, -31,-124,-118, -31,-123, -85, -31,-122, -75, -31,-124,-118, -31, +-123, -85, -31,-122, -76, -31,-124,-118, -31,-123, -85, -31,-122, -77, -31,-124,-118, -31,-123, -85, + -31,-122, -78, -31,-124,-118, -31,-123, -85, -31,-122, -79, -31,-124,-118, -31,-123, -85, -31,-122, + -80, -31,-124,-118, -31,-123, -85, -31,-122, -81, -31,-124,-118, -31,-123, -85, -31,-122, -82, -31, +-124,-118, -31,-123, -85, -31,-122, -83, -31,-124,-118, -31,-123, -85, -31,-122, -84, -31,-124,-118, + -31,-123, -85, -31,-122, -85, -31,-124,-118, -31,-123, -85, -31,-122, -86, -31,-124,-118, -31,-123, + -85, -31,-122, -87, -31,-124,-118, -31,-123, -85, -31,-122, -88, -31,-124,-118, -31,-123, -86, -31, +-121,-126, -31,-124,-118, -31,-123, -86, -31,-121,-127, -31,-124,-118, -31,-123, -86, -31,-121,-128, + -31,-124,-118, -31,-123, -86, -31,-122, -65, -31,-124,-118, -31,-123, -86, -31,-122, -66, -31,-124, +-118, -31,-123, -86, -31,-122, -67, -31,-124,-118, -31,-123, -86, -31,-122, -68, -31,-124,-118, -31, +-123, -86, -31,-122, -69, -31,-124,-118, -31,-123, -86, -31,-122, -70, -31,-124,-118, -31,-123, -86, + -31,-122, -71, -31,-124,-118, -31,-123, -86, -31,-122, -72, -31,-124,-118, -31,-123, -86, -31,-122, + -73, -31,-124,-118, -31,-123, -86, -31,-122, -74, -31,-124,-118, -31,-123, -86, -31,-122, -75, -31, +-124,-118, -31,-123, -86, -31,-122, -76, -31,-124,-118, -31,-123, -86, -31,-122, -77, -31,-124,-118, + -31,-123, -86, -31,-122, -78, -31,-124,-118, -31,-123, -86, -31,-122, -79, -31,-124,-118, -31,-123, + -86, -31,-122, -80, -31,-124,-118, -31,-123, -86, -31,-122, -81, -31,-124,-118, -31,-123, -86, -31, +-122, -82, -31,-124,-118, -31,-123, -86, -31,-122, -83, -31,-124,-118, -31,-123, -86, -31,-122, -84, + -31,-124,-118, -31,-123, -86, -31,-122, -85, -31,-124,-118, -31,-123, -86, -31,-122, -86, -31,-124, +-118, -31,-123, -86, -31,-122, -87, -31,-124,-118, -31,-123, -86, -31,-122, -88, -31,-124,-118, -31, +-123, -87, -31,-121,-126, -31,-124,-118, -31,-123, -87, -31,-121,-127, -31,-124,-118, -31,-123, -87, + -31,-121,-128, -31,-124,-118, -31,-123, -87, -31,-122, -65, -31,-124,-118, -31,-123, -87, -31,-122, + -66, -31,-124,-118, -31,-123, -87, -31,-122, -67, -31,-124,-118, -31,-123, -87, -31,-122, -68, -31, +-124,-118, -31,-123, -87, -31,-122, -69, -31,-124,-118, -31,-123, -87, -31,-122, -70, -31,-124,-118, + -31,-123, -87, -31,-122, -71, -31,-124,-118, -31,-123, -87, -31,-122, -72, -31,-124,-118, -31,-123, + -87, -31,-122, -73, -31,-124,-118, -31,-123, -87, -31,-122, -74, -31,-124,-118, -31,-123, -87, -31, +-122, -75, -31,-124,-118, -31,-123, -87, -31,-122, -76, -31,-124,-118, -31,-123, -87, -31,-122, -77, + -31,-124,-118, -31,-123, -87, -31,-122, -78, -31,-124,-118, -31,-123, -87, -31,-122, -79, -31,-124, +-118, -31,-123, -87, -31,-122, -80, -31,-124,-118, -31,-123, -87, -31,-122, -81, -31,-124,-118, -31, +-123, -87, -31,-122, -82, -31,-124,-118, -31,-123, -87, -31,-122, -83, -31,-124,-118, -31,-123, -87, + -31,-122, -84, -31,-124,-118, -31,-123, -87, -31,-122, -85, -31,-124,-118, -31,-123, -87, -31,-122, + -86, -31,-124,-118, -31,-123, -87, -31,-122, -87, -31,-124,-118, -31,-123, -87, -31,-122, -88, -31, +-124,-118, -31,-123, -88, -31,-121,-126, -31,-124,-118, -31,-123, -88, -31,-121,-127, -31,-124,-118, + -31,-123, -88, -31,-121,-128, -31,-124,-118, -31,-123, -88, -31,-122, -65, -31,-124,-118, -31,-123, + -88, -31,-122, -66, -31,-124,-118, -31,-123, -88, -31,-122, -67, -31,-124,-118, -31,-123, -88, -31, +-122, -68, -31,-124,-118, -31,-123, -88, -31,-122, -69, -31,-124,-118, -31,-123, -88, -31,-122, -70, + -31,-124,-118, -31,-123, -88, -31,-122, -71, -31,-124,-118, -31,-123, -88, -31,-122, -72, -31,-124, +-118, -31,-123, -88, -31,-122, -73, -31,-124,-118, -31,-123, -88, -31,-122, -74, -31,-124,-118, -31, +-123, -88, -31,-122, -75, -31,-124,-118, -31,-123, -88, -31,-122, -76, -31,-124,-118, -31,-123, -88, + -31,-122, -77, -31,-124,-118, -31,-123, -88, -31,-122, -78, -31,-124,-118, -31,-123, -88, -31,-122, + -79, -31,-124,-118, -31,-123, -88, -31,-122, -80, -31,-124,-118, -31,-123, -88, -31,-122, -81, -31, +-124,-118, -31,-123, -88, -31,-122, -82, -31,-124,-118, -31,-123, -88, -31,-122, -83, -31,-124,-118, + -31,-123, -88, -31,-122, -84, -31,-124,-118, -31,-123, -88, -31,-122, -85, -31,-124,-118, -31,-123, + -88, -31,-122, -86, -31,-124,-118, -31,-123, -88, -31,-122, -87, -31,-124,-118, -31,-123, -88, -31, +-122, -88, -31,-124,-118, -31,-123, -89, -31,-121,-126, -31,-124,-118, -31,-123, -89, -31,-121,-127, + -31,-124,-118, -31,-123, -89, -31,-121,-128, -31,-124,-118, -31,-123, -89, -31,-122, -65, -31,-124, +-118, -31,-123, -89, -31,-122, -66, -31,-124,-118, -31,-123, -89, -31,-122, -67, -31,-124,-118, -31, +-123, -89, -31,-122, -68, -31,-124,-118, -31,-123, -89, -31,-122, -69, -31,-124,-118, -31,-123, -89, + -31,-122, -70, -31,-124,-118, -31,-123, -89, -31,-122, -71, -31,-124,-118, -31,-123, -89, -31,-122, + -72, -31,-124,-118, -31,-123, -89, -31,-122, -73, -31,-124,-118, -31,-123, -89, -31,-122, -74, -31, +-124,-118, -31,-123, -89, -31,-122, -75, -31,-124,-118, -31,-123, -89, -31,-122, -76, -31,-124,-118, + -31,-123, -89, -31,-122, -77, -31,-124,-118, -31,-123, -89, -31,-122, -78, -31,-124,-118, -31,-123, + -89, -31,-122, -79, -31,-124,-118, -31,-123, -89, -31,-122, -80, -31,-124,-118, -31,-123, -89, -31, +-122, -81, -31,-124,-118, -31,-123, -89, -31,-122, -82, -31,-124,-118, -31,-123, -89, -31,-122, -83, + -31,-124,-118, -31,-123, -89, -31,-122, -84, -31,-124,-118, -31,-123, -89, -31,-122, -85, -31,-124, +-118, -31,-123, -89, -31,-122, -86, -31,-124,-118, -31,-123, -89, -31,-122, -87, -31,-124,-118, -31, +-123, -89, -31,-122, -88, -31,-124,-118, -31,-123, -90, -31,-121,-126, -31,-124,-118, -31,-123, -90, + -31,-121,-127, -31,-124,-118, -31,-123, -90, -31,-121,-128, -31,-124,-118, -31,-123, -90, -31,-122, + -65, -31,-124,-118, -31,-123, -90, -31,-122, -66, -31,-124,-118, -31,-123, -90, -31,-122, -67, -31, +-124,-118, -31,-123, -90, -31,-122, -68, -31,-124,-118, -31,-123, -90, -31,-122, -69, -31,-124,-118, + -31,-123, -90, -31,-122, -70, -31,-124,-118, -31,-123, -90, -31,-122, -71, -31,-124,-118, -31,-123, + -90, -31,-122, -72, -31,-124,-118, -31,-123, -90, -31,-122, -73, -31,-124,-118, -31,-123, -90, -31, +-122, -74, -31,-124,-118, -31,-123, -90, -31,-122, -75, -31,-124,-118, -31,-123, -90, -31,-122, -76, + -31,-124,-118, -31,-123, -90, -31,-122, -77, -31,-124,-118, -31,-123, -90, -31,-122, -78, -31,-124, +-118, -31,-123, -90, -31,-122, -79, -31,-124,-118, -31,-123, -90, -31,-122, -80, -31,-124,-118, -31, +-123, -90, -31,-122, -81, -31,-124,-118, -31,-123, -90, -31,-122, -82, -31,-124,-118, -31,-123, -90, + -31,-122, -83, -31,-124,-118, -31,-123, -90, -31,-122, -84, -31,-124,-118, -31,-123, -90, -31,-122, + -85, -31,-124,-118, -31,-123, -90, -31,-122, -86, -31,-124,-118, -31,-123, -90, -31,-122, -87, -31, +-124,-118, -31,-123, -90, -31,-122, -88, -31,-124,-118, -31,-123, -91, -31,-121,-126, -31,-124,-118, + -31,-123, -91, -31,-121,-127, -31,-124,-118, -31,-123, -91, -31,-121,-128, -31,-124,-118, -31,-123, + -91, -31,-122, -65, -31,-124,-118, -31,-123, -91, -31,-122, -66, -31,-124,-118, -31,-123, -91, -31, +-122, -67, -31,-124,-118, -31,-123, -91, -31,-122, -68, -31,-124,-118, -31,-123, -91, -31,-122, -69, + -31,-124,-118, -31,-123, -91, -31,-122, -70, -31,-124,-118, -31,-123, -91, -31,-122, -71, -31,-124, +-118, -31,-123, -91, -31,-122, -72, -31,-124,-118, -31,-123, -91, -31,-122, -73, -31,-124,-118, -31, +-123, -91, -31,-122, -74, -31,-124,-118, -31,-123, -91, -31,-122, -75, -31,-124,-118, -31,-123, -91, + -31,-122, -76, -31,-124,-118, -31,-123, -91, -31,-122, -77, -31,-124,-118, -31,-123, -91, -31,-122, + -78, -31,-124,-118, -31,-123, -91, -31,-122, -79, -31,-124,-118, -31,-123, -91, -31,-122, -80, -31, +-124,-118, -31,-123, -91, -31,-122, -81, -31,-124,-118, -31,-123, -91, -31,-122, -82, -31,-124,-118, + -31,-123, -91, -31,-122, -83, -31,-124,-118, -31,-123, -91, -31,-122, -84, -31,-124,-118, -31,-123, + -91, -31,-122, -85, -31,-124,-118, -31,-123, -91, -31,-122, -86, -31,-124,-118, -31,-123, -91, -31, +-122, -87, -31,-124,-118, -31,-123, -91, -31,-122, -88, -31,-124,-118, -31,-123, -92, -31,-121,-126, + -31,-124,-118, -31,-123, -92, -31,-121,-127, -31,-124,-118, -31,-123, -92, -31,-121,-128, -31,-124, +-118, -31,-123, -92, -31,-122, -65, -31,-124,-118, -31,-123, -92, -31,-122, -66, -31,-124,-118, -31, +-123, -92, -31,-122, -67, -31,-124,-118, -31,-123, -92, -31,-122, -68, -31,-124,-118, -31,-123, -92, + -31,-122, -69, -31,-124,-118, -31,-123, -92, -31,-122, -70, -31,-124,-118, -31,-123, -92, -31,-122, + -71, -31,-124,-118, -31,-123, -92, -31,-122, -72, -31,-124,-118, -31,-123, -92, -31,-122, -73, -31, +-124,-118, -31,-123, -92, -31,-122, -74, -31,-124,-118, -31,-123, -92, -31,-122, -75, -31,-124,-118, + -31,-123, -92, -31,-122, -76, -31,-124,-118, -31,-123, -92, -31,-122, -77, -31,-124,-118, -31,-123, + -92, -31,-122, -78, -31,-124,-118, -31,-123, -92, -31,-122, -79, -31,-124,-118, -31,-123, -92, -31, +-122, -80, -31,-124,-118, -31,-123, -92, -31,-122, -81, -31,-124,-118, -31,-123, -92, -31,-122, -82, + -31,-124,-118, -31,-123, -92, -31,-122, -83, -31,-124,-118, -31,-123, -92, -31,-122, -84, -31,-124, +-118, -31,-123, -92, -31,-122, -85, -31,-124,-118, -31,-123, -92, -31,-122, -86, -31,-124,-118, -31, +-123, -92, -31,-122, -87, -31,-124,-118, -31,-123, -92, -31,-122, -88, -31,-124,-118, -31,-123, -93, + -31,-121,-126, -31,-124,-118, -31,-123, -93, -31,-121,-127, -31,-124,-118, -31,-123, -93, -31,-121, +-128, -31,-124,-118, -31,-123, -93, -31,-122, -65, -31,-124,-118, -31,-123, -93, -31,-122, -66, -31, +-124,-118, -31,-123, -93, -31,-122, -67, -31,-124,-118, -31,-123, -93, -31,-122, -68, -31,-124,-118, + -31,-123, -93, -31,-122, -69, -31,-124,-118, -31,-123, -93, -31,-122, -70, -31,-124,-118, -31,-123, + -93, -31,-122, -71, -31,-124,-118, -31,-123, -93, -31,-122, -72, -31,-124,-118, -31,-123, -93, -31, +-122, -73, -31,-124,-118, -31,-123, -93, -31,-122, -74, -31,-124,-118, -31,-123, -93, -31,-122, -75, + -31,-124,-118, -31,-123, -93, -31,-122, -76, -31,-124,-118, -31,-123, -93, -31,-122, -77, -31,-124, +-118, -31,-123, -93, -31,-122, -78, -31,-124,-118, -31,-123, -93, -31,-122, -79, -31,-124,-118, -31, +-123, -93, -31,-122, -80, -31,-124,-118, -31,-123, -93, -31,-122, -81, -31,-124,-118, -31,-123, -93, + -31,-122, -82, -31,-124,-118, -31,-123, -93, -31,-122, -83, -31,-124,-118, -31,-123, -93, -31,-122, + -84, -31,-124,-118, -31,-123, -93, -31,-122, -85, -31,-124,-118, -31,-123, -93, -31,-122, -86, -31, +-124,-118, -31,-123, -93, -31,-122, -87, -31,-124,-118, -31,-123, -93, -31,-122, -88, -31,-124,-118, + -31,-123, -94, -31,-121,-126, -31,-124,-118, -31,-123, -94, -31,-121,-127, -31,-124,-118, -31,-123, + -94, -31,-121,-128, -31,-124,-118, -31,-123, -94, -31,-122, -65, -31,-124,-118, -31,-123, -94, -31, +-122, -66, -31,-124,-118, -31,-123, -94, -31,-122, -67, -31,-124,-118, -31,-123, -94, -31,-122, -68, + -31,-124,-118, -31,-123, -94, -31,-122, -69, -31,-124,-118, -31,-123, -94, -31,-122, -70, -31,-124, +-118, -31,-123, -94, -31,-122, -71, -31,-124,-118, -31,-123, -94, -31,-122, -72, -31,-124,-118, -31, +-123, -94, -31,-122, -73, -31,-124,-118, -31,-123, -94, -31,-122, -74, -31,-124,-118, -31,-123, -94, + -31,-122, -75, -31,-124,-118, -31,-123, -94, -31,-122, -76, -31,-124,-118, -31,-123, -94, -31,-122, + -77, -31,-124,-118, -31,-123, -94, -31,-122, -78, -31,-124,-118, -31,-123, -94, -31,-122, -79, -31, +-124,-118, -31,-123, -94, -31,-122, -80, -31,-124,-118, -31,-123, -94, -31,-122, -81, -31,-124,-118, + -31,-123, -94, -31,-122, -82, -31,-124,-118, -31,-123, -94, -31,-122, -83, -31,-124,-118, -31,-123, + -94, -31,-122, -84, -31,-124,-118, -31,-123, -94, -31,-122, -85, -31,-124,-118, -31,-123, -94, -31, +-122, -86, -31,-124,-118, -31,-123, -94, -31,-122, -87, -31,-124,-118, -31,-123, -94, -31,-122, -88, + -31,-124,-118, -31,-123, -95, -31,-121,-126, -31,-124,-118, -31,-123, -95, -31,-121,-127, -31,-124, +-118, -31,-123, -95, -31,-121,-128, -31,-124,-118, -31,-123, -95, -31,-122, -65, -31,-124,-118, -31, +-123, -95, -31,-122, -66, -31,-124,-118, -31,-123, -95, -31,-122, -67, -31,-124,-118, -31,-123, -95, + -31,-122, -68, -31,-124,-118, -31,-123, -95, -31,-122, -69, -31,-124,-118, -31,-123, -95, -31,-122, + -70, -31,-124,-118, -31,-123, -95, -31,-122, -71, -31,-124,-118, -31,-123, -95, -31,-122, -72, -31, +-124,-118, -31,-123, -95, -31,-122, -73, -31,-124,-118, -31,-123, -95, -31,-122, -74, -31,-124,-118, + -31,-123, -95, -31,-122, -75, -31,-124,-118, -31,-123, -95, -31,-122, -76, -31,-124,-118, -31,-123, + -95, -31,-122, -77, -31,-124,-118, -31,-123, -95, -31,-122, -78, -31,-124,-118, -31,-123, -95, -31, +-122, -79, -31,-124,-118, -31,-123, -95, -31,-122, -80, -31,-124,-118, -31,-123, -95, -31,-122, -81, + -31,-124,-118, -31,-123, -95, -31,-122, -82, -31,-124,-118, -31,-123, -95, -31,-122, -83, -31,-124, +-118, -31,-123, -95, -31,-122, -84, -31,-124,-118, -31,-123, -95, -31,-122, -85, -31,-124,-118, -31, +-123, -95, -31,-122, -86, -31,-124,-118, -31,-123, -95, -31,-122, -87, -31,-124,-118, -31,-123, -95, + -31,-122, -88, -31,-124,-119, -31,-123, -75, -31,-121,-126, -31,-124,-119, -31,-123, -75, -31,-121, +-127, -31,-124,-119, -31,-123, -75, -31,-121,-128, -31,-124,-119, -31,-123, -75, -31,-122, -65, -31, +-124,-119, -31,-123, -75, -31,-122, -66, -31,-124,-119, -31,-123, -75, -31,-122, -67, -31,-124,-119, + -31,-123, -75, -31,-122, -68, -31,-124,-119, -31,-123, -75, -31,-122, -69, -31,-124,-119, -31,-123, + -75, -31,-122, -70, -31,-124,-119, -31,-123, -75, -31,-122, -71, -31,-124,-119, -31,-123, -75, -31, +-122, -72, -31,-124,-119, -31,-123, -75, -31,-122, -73, -31,-124,-119, -31,-123, -75, -31,-122, -74, + -31,-124,-119, -31,-123, -75, -31,-122, -75, -31,-124,-119, -31,-123, -75, -31,-122, -76, -31,-124, +-119, -31,-123, -75, -31,-122, -77, -31,-124,-119, -31,-123, -75, -31,-122, -78, -31,-124,-119, -31, +-123, -75, -31,-122, -79, -31,-124,-119, -31,-123, -75, -31,-122, -80, -31,-124,-119, -31,-123, -75, + -31,-122, -81, -31,-124,-119, -31,-123, -75, -31,-122, -82, -31,-124,-119, -31,-123, -75, -31,-122, + -83, -31,-124,-119, -31,-123, -75, -31,-122, -84, -31,-124,-119, -31,-123, -75, -31,-122, -85, -31, +-124,-119, -31,-123, -75, -31,-122, -86, -31,-124,-119, -31,-123, -75, -31,-122, -87, -31,-124,-119, + -31,-123, -75, -31,-122, -88, -31,-124,-119, -31,-123, -76, -31,-121,-126, -31,-124,-119, -31,-123, + -76, -31,-121,-127, -31,-124,-119, -31,-123, -76, -31,-121,-128, -31,-124,-119, -31,-123, -76, -31, +-122, -65, -31,-124,-119, -31,-123, -76, -31,-122, -66, -31,-124,-119, -31,-123, -76, -31,-122, -67, + -31,-124,-119, -31,-123, -76, -31,-122, -68, -31,-124,-119, -31,-123, -76, -31,-122, -69, -31,-124, +-119, -31,-123, -76, -31,-122, -70, -31,-124,-119, -31,-123, -76, -31,-122, -71, -31,-124,-119, -31, +-123, -76, -31,-122, -72, -31,-124,-119, -31,-123, -76, -31,-122, -73, -31,-124,-119, -31,-123, -76, + -31,-122, -74, -31,-124,-119, -31,-123, -76, -31,-122, -75, -31,-124,-119, -31,-123, -76, -31,-122, + -76, -31,-124,-119, -31,-123, -76, -31,-122, -77, -31,-124,-119, -31,-123, -76, -31,-122, -78, -31, +-124,-119, -31,-123, -76, -31,-122, -79, -31,-124,-119, -31,-123, -76, -31,-122, -80, -31,-124,-119, + -31,-123, -76, -31,-122, -81, -31,-124,-119, -31,-123, -76, -31,-122, -82, -31,-124,-119, -31,-123, + -76, -31,-122, -83, -31,-124,-119, -31,-123, -76, -31,-122, -84, -31,-124,-119, -31,-123, -76, -31, +-122, -85, -31,-124,-119, -31,-123, -76, -31,-122, -86, -31,-124,-119, -31,-123, -76, -31,-122, -87, + -31,-124,-119, -31,-123, -76, -31,-122, -88, -31,-124,-119, -31,-123, -77, -31,-121,-126, -31,-124, +-119, -31,-123, -77, -31,-121,-127, -31,-124,-119, -31,-123, -77, -31,-121,-128, -31,-124,-119, -31, +-123, -77, -31,-122, -65, -31,-124,-119, -31,-123, -77, -31,-122, -66, -31,-124,-119, -31,-123, -77, + -31,-122, -67, -31,-124,-119, -31,-123, -77, -31,-122, -68, -31,-124,-119, -31,-123, -77, -31,-122, + -69, -31,-124,-119, -31,-123, -77, -31,-122, -70, -31,-124,-119, -31,-123, -77, -31,-122, -71, -31, +-124,-119, -31,-123, -77, -31,-122, -72, -31,-124,-119, -31,-123, -77, -31,-122, -73, -31,-124,-119, + -31,-123, -77, -31,-122, -74, -31,-124,-119, -31,-123, -77, -31,-122, -75, -31,-124,-119, -31,-123, + -77, -31,-122, -76, -31,-124,-119, -31,-123, -77, -31,-122, -77, -31,-124,-119, -31,-123, -77, -31, +-122, -78, -31,-124,-119, -31,-123, -77, -31,-122, -79, -31,-124,-119, -31,-123, -77, -31,-122, -80, + -31,-124,-119, -31,-123, -77, -31,-122, -81, -31,-124,-119, -31,-123, -77, -31,-122, -82, -31,-124, +-119, -31,-123, -77, -31,-122, -83, -31,-124,-119, -31,-123, -77, -31,-122, -84, -31,-124,-119, -31, +-123, -77, -31,-122, -85, -31,-124,-119, -31,-123, -77, -31,-122, -86, -31,-124,-119, -31,-123, -77, + -31,-122, -87, -31,-124,-119, -31,-123, -77, -31,-122, -88, -31,-124,-119, -31,-123, -78, -31,-121, +-126, -31,-124,-119, -31,-123, -78, -31,-121,-127, -31,-124,-119, -31,-123, -78, -31,-121,-128, -31, +-124,-119, -31,-123, -78, -31,-122, -65, -31,-124,-119, -31,-123, -78, -31,-122, -66, -31,-124,-119, + -31,-123, -78, -31,-122, -67, -31,-124,-119, -31,-123, -78, -31,-122, -68, -31,-124,-119, -31,-123, + -78, -31,-122, -69, -31,-124,-119, -31,-123, -78, -31,-122, -70, -31,-124,-119, -31,-123, -78, -31, +-122, -71, -31,-124,-119, -31,-123, -78, -31,-122, -72, -31,-124,-119, -31,-123, -78, -31,-122, -73, + -31,-124,-119, -31,-123, -78, -31,-122, -74, -31,-124,-119, -31,-123, -78, -31,-122, -75, -31,-124, +-119, -31,-123, -78, -31,-122, -76, -31,-124,-119, -31,-123, -78, -31,-122, -77, -31,-124,-119, -31, +-123, -78, -31,-122, -78, -31,-124,-119, -31,-123, -78, -31,-122, -79, -31,-124,-119, -31,-123, -78, + -31,-122, -80, -31,-124,-119, -31,-123, -78, -31,-122, -81, -31,-124,-119, -31,-123, -78, -31,-122, + -82, -31,-124,-119, -31,-123, -78, -31,-122, -83, -31,-124,-119, -31,-123, -78, -31,-122, -84, -31, +-124,-119, -31,-123, -78, -31,-122, -85, -31,-124,-119, -31,-123, -78, -31,-122, -86, -31,-124,-119, + -31,-123, -78, -31,-122, -87, -31,-124,-119, -31,-123, -78, -31,-122, -88, -31,-124,-119, -31,-123, + -79, -31,-121,-126, -31,-124,-119, -31,-123, -79, -31,-121,-127, -31,-124,-119, -31,-123, -79, -31, +-121,-128, -31,-124,-119, -31,-123, -79, -31,-122, -65, -31,-124,-119, -31,-123, -79, -31,-122, -66, + -31,-124,-119, -31,-123, -79, -31,-122, -67, -31,-124,-119, -31,-123, -79, -31,-122, -68, -31,-124, +-119, -31,-123, -79, -31,-122, -69, -31,-124,-119, -31,-123, -79, -31,-122, -70, -31,-124,-119, -31, +-123, -79, -31,-122, -71, -31,-124,-119, -31,-123, -79, -31,-122, -72, -31,-124,-119, -31,-123, -79, + -31,-122, -73, -31,-124,-119, -31,-123, -79, -31,-122, -74, -31,-124,-119, -31,-123, -79, -31,-122, + -75, -31,-124,-119, -31,-123, -79, -31,-122, -76, -31,-124,-119, -31,-123, -79, -31,-122, -77, -31, +-124,-119, -31,-123, -79, -31,-122, -78, -31,-124,-119, -31,-123, -79, -31,-122, -79, -31,-124,-119, + -31,-123, -79, -31,-122, -80, -31,-124,-119, -31,-123, -79, -31,-122, -81, -31,-124,-119, -31,-123, + -79, -31,-122, -82, -31,-124,-119, -31,-123, -79, -31,-122, -83, -31,-124,-119, -31,-123, -79, -31, +-122, -84, -31,-124,-119, -31,-123, -79, -31,-122, -85, -31,-124,-119, -31,-123, -79, -31,-122, -86, + -31,-124,-119, -31,-123, -79, -31,-122, -87, -31,-124,-119, -31,-123, -79, -31,-122, -88, -31,-124, +-119, -31,-123, -80, -31,-121,-126, -31,-124,-119, -31,-123, -80, -31,-121,-127, -31,-124,-119, -31, +-123, -80, -31,-121,-128, -31,-124,-119, -31,-123, -80, -31,-122, -65, -31,-124,-119, -31,-123, -80, + -31,-122, -66, -31,-124,-119, -31,-123, -80, -31,-122, -67, -31,-124,-119, -31,-123, -80, -31,-122, + -68, -31,-124,-119, -31,-123, -80, -31,-122, -69, -31,-124,-119, -31,-123, -80, -31,-122, -70, -31, +-124,-119, -31,-123, -80, -31,-122, -71, -31,-124,-119, -31,-123, -80, -31,-122, -72, -31,-124,-119, + -31,-123, -80, -31,-122, -73, -31,-124,-119, -31,-123, -80, -31,-122, -74, -31,-124,-119, -31,-123, + -80, -31,-122, -75, -31,-124,-119, -31,-123, -80, -31,-122, -76, -31,-124,-119, -31,-123, -80, -31, +-122, -77, -31,-124,-119, -31,-123, -80, -31,-122, -78, -31,-124,-119, -31,-123, -80, -31,-122, -79, + -31,-124,-119, -31,-123, -80, -31,-122, -80, -31,-124,-119, -31,-123, -80, -31,-122, -81, -31,-124, +-119, -31,-123, -80, -31,-122, -82, -31,-124,-119, -31,-123, -80, -31,-122, -83, -31,-124,-119, -31, +-123, -80, -31,-122, -84, -31,-124,-119, -31,-123, -80, -31,-122, -85, -31,-124,-119, -31,-123, -80, + -31,-122, -86, -31,-124,-119, -31,-123, -80, -31,-122, -87, -31,-124,-119, -31,-123, -80, -31,-122, + -88, -31,-124,-119, -31,-123, -81, -31,-121,-126, -31,-124,-119, -31,-123, -81, -31,-121,-127, -31, +-124,-119, -31,-123, -81, -31,-121,-128, -31,-124,-119, -31,-123, -81, -31,-122, -65, -31,-124,-119, + -31,-123, -81, -31,-122, -66, -31,-124,-119, -31,-123, -81, -31,-122, -67, -31,-124,-119, -31,-123, + -81, -31,-122, -68, -31,-124,-119, -31,-123, -81, -31,-122, -69, -31,-124,-119, -31,-123, -81, -31, +-122, -70, -31,-124,-119, -31,-123, -81, -31,-122, -71, -31,-124,-119, -31,-123, -81, -31,-122, -72, + -31,-124,-119, -31,-123, -81, -31,-122, -73, -31,-124,-119, -31,-123, -81, -31,-122, -74, -31,-124, +-119, -31,-123, -81, -31,-122, -75, -31,-124,-119, -31,-123, -81, -31,-122, -76, -31,-124,-119, -31, +-123, -81, -31,-122, -77, -31,-124,-119, -31,-123, -81, -31,-122, -78, -31,-124,-119, -31,-123, -81, + -31,-122, -79, -31,-124,-119, -31,-123, -81, -31,-122, -80, -31,-124,-119, -31,-123, -81, -31,-122, + -81, -31,-124,-119, -31,-123, -81, -31,-122, -82, -31,-124,-119, -31,-123, -81, -31,-122, -83, -31, +-124,-119, -31,-123, -81, -31,-122, -84, -31,-124,-119, -31,-123, -81, -31,-122, -85, -31,-124,-119, + -31,-123, -81, -31,-122, -86, -31,-124,-119, -31,-123, -81, -31,-122, -87, -31,-124,-119, -31,-123, + -81, -31,-122, -88, -31,-124,-119, -31,-123, -82, -31,-121,-126, -31,-124,-119, -31,-123, -82, -31, +-121,-127, -31,-124,-119, -31,-123, -82, -31,-121,-128, -31,-124,-119, -31,-123, -82, -31,-122, -65, + -31,-124,-119, -31,-123, -82, -31,-122, -66, -31,-124,-119, -31,-123, -82, -31,-122, -67, -31,-124, +-119, -31,-123, -82, -31,-122, -68, -31,-124,-119, -31,-123, -82, -31,-122, -69, -31,-124,-119, -31, +-123, -82, -31,-122, -70, -31,-124,-119, -31,-123, -82, -31,-122, -71, -31,-124,-119, -31,-123, -82, + -31,-122, -72, -31,-124,-119, -31,-123, -82, -31,-122, -73, -31,-124,-119, -31,-123, -82, -31,-122, + -74, -31,-124,-119, -31,-123, -82, -31,-122, -75, -31,-124,-119, -31,-123, -82, -31,-122, -76, -31, +-124,-119, -31,-123, -82, -31,-122, -77, -31,-124,-119, -31,-123, -82, -31,-122, -78, -31,-124,-119, + -31,-123, -82, -31,-122, -79, -31,-124,-119, -31,-123, -82, -31,-122, -80, -31,-124,-119, -31,-123, + -82, -31,-122, -81, -31,-124,-119, -31,-123, -82, -31,-122, -82, -31,-124,-119, -31,-123, -82, -31, +-122, -83, -31,-124,-119, -31,-123, -82, -31,-122, -84, -31,-124,-119, -31,-123, -82, -31,-122, -85, + -31,-124,-119, -31,-123, -82, -31,-122, -86, -31,-124,-119, -31,-123, -82, -31,-122, -87, -31,-124, +-119, -31,-123, -82, -31,-122, -88, -31,-124,-119, -31,-123, -83, -31,-121,-126, -31,-124,-119, -31, +-123, -83, -31,-121,-127, -31,-124,-119, -31,-123, -83, -31,-121,-128, -31,-124,-119, -31,-123, -83, + -31,-122, -65, -31,-124,-119, -31,-123, -83, -31,-122, -66, -31,-124,-119, -31,-123, -83, -31,-122, + -67, -31,-124,-119, -31,-123, -83, -31,-122, -68, -31,-124,-119, -31,-123, -83, -31,-122, -69, -31, +-124,-119, -31,-123, -83, -31,-122, -70, -31,-124,-119, -31,-123, -83, -31,-122, -71, -31,-124,-119, + -31,-123, -83, -31,-122, -72, -31,-124,-119, -31,-123, -83, -31,-122, -73, -31,-124,-119, -31,-123, + -83, -31,-122, -74, -31,-124,-119, -31,-123, -83, -31,-122, -75, -31,-124,-119, -31,-123, -83, -31, +-122, -76, -31,-124,-119, -31,-123, -83, -31,-122, -77, -31,-124,-119, -31,-123, -83, -31,-122, -78, + -31,-124,-119, -31,-123, -83, -31,-122, -79, -31,-124,-119, -31,-123, -83, -31,-122, -80, -31,-124, +-119, -31,-123, -83, -31,-122, -81, -31,-124,-119, -31,-123, -83, -31,-122, -82, -31,-124,-119, -31, +-123, -83, -31,-122, -83, -31,-124,-119, -31,-123, -83, -31,-122, -84, -31,-124,-119, -31,-123, -83, + -31,-122, -85, -31,-124,-119, -31,-123, -83, -31,-122, -86, -31,-124,-119, -31,-123, -83, -31,-122, + -87, -31,-124,-119, -31,-123, -83, -31,-122, -88, -31,-124,-119, -31,-123, -84, -31,-121,-126, -31, +-124,-119, -31,-123, -84, -31,-121,-127, -31,-124,-119, -31,-123, -84, -31,-121,-128, -31,-124,-119, + -31,-123, -84, -31,-122, -65, -31,-124,-119, -31,-123, -84, -31,-122, -66, -31,-124,-119, -31,-123, + -84, -31,-122, -67, -31,-124,-119, -31,-123, -84, -31,-122, -68, -31,-124,-119, -31,-123, -84, -31, +-122, -69, -31,-124,-119, -31,-123, -84, -31,-122, -70, -31,-124,-119, -31,-123, -84, -31,-122, -71, + -31,-124,-119, -31,-123, -84, -31,-122, -72, -31,-124,-119, -31,-123, -84, -31,-122, -73, -31,-124, +-119, -31,-123, -84, -31,-122, -74, -31,-124,-119, -31,-123, -84, -31,-122, -75, -31,-124,-119, -31, +-123, -84, -31,-122, -76, -31,-124,-119, -31,-123, -84, -31,-122, -77, -31,-124,-119, -31,-123, -84, + -31,-122, -78, -31,-124,-119, -31,-123, -84, -31,-122, -79, -31,-124,-119, -31,-123, -84, -31,-122, + -80, -31,-124,-119, -31,-123, -84, -31,-122, -81, -31,-124,-119, -31,-123, -84, -31,-122, -82, -31, +-124,-119, -31,-123, -84, -31,-122, -83, -31,-124,-119, -31,-123, -84, -31,-122, -84, -31,-124,-119, + -31,-123, -84, -31,-122, -85, -31,-124,-119, -31,-123, -84, -31,-122, -86, -31,-124,-119, -31,-123, + -84, -31,-122, -87, -31,-124,-119, -31,-123, -84, -31,-122, -88, -31,-124,-119, -31,-123, -85, -31, +-121,-126, -31,-124,-119, -31,-123, -85, -31,-121,-127, -31,-124,-119, -31,-123, -85, -31,-121,-128, + -31,-124,-119, -31,-123, -85, -31,-122, -65, -31,-124,-119, -31,-123, -85, -31,-122, -66, -31,-124, +-119, -31,-123, -85, -31,-122, -67, -31,-124,-119, -31,-123, -85, -31,-122, -68, -31,-124,-119, -31, +-123, -85, -31,-122, -69, -31,-124,-119, -31,-123, -85, -31,-122, -70, -31,-124,-119, -31,-123, -85, + -31,-122, -71, -31,-124,-119, -31,-123, -85, -31,-122, -72, -31,-124,-119, -31,-123, -85, -31,-122, + -73, -31,-124,-119, -31,-123, -85, -31,-122, -74, -31,-124,-119, -31,-123, -85, -31,-122, -75, -31, +-124,-119, -31,-123, -85, -31,-122, -76, -31,-124,-119, -31,-123, -85, -31,-122, -77, -31,-124,-119, + -31,-123, -85, -31,-122, -78, -31,-124,-119, -31,-123, -85, -31,-122, -79, -31,-124,-119, -31,-123, + -85, -31,-122, -80, -31,-124,-119, -31,-123, -85, -31,-122, -81, -31,-124,-119, -31,-123, -85, -31, +-122, -82, -31,-124,-119, -31,-123, -85, -31,-122, -83, -31,-124,-119, -31,-123, -85, -31,-122, -84, + -31,-124,-119, -31,-123, -85, -31,-122, -85, -31,-124,-119, -31,-123, -85, -31,-122, -86, -31,-124, +-119, -31,-123, -85, -31,-122, -87, -31,-124,-119, -31,-123, -85, -31,-122, -88, -31,-124,-119, -31, +-123, -86, -31,-121,-126, -31,-124,-119, -31,-123, -86, -31,-121,-127, -31,-124,-119, -31,-123, -86, + -31,-121,-128, -31,-124,-119, -31,-123, -86, -31,-122, -65, -31,-124,-119, -31,-123, -86, -31,-122, + -66, -31,-124,-119, -31,-123, -86, -31,-122, -67, -31,-124,-119, -31,-123, -86, -31,-122, -68, -31, +-124,-119, -31,-123, -86, -31,-122, -69, -31,-124,-119, -31,-123, -86, -31,-122, -70, -31,-124,-119, + -31,-123, -86, -31,-122, -71, -31,-124,-119, -31,-123, -86, -31,-122, -72, -31,-124,-119, -31,-123, + -86, -31,-122, -73, -31,-124,-119, -31,-123, -86, -31,-122, -74, -31,-124,-119, -31,-123, -86, -31, +-122, -75, -31,-124,-119, -31,-123, -86, -31,-122, -76, -31,-124,-119, -31,-123, -86, -31,-122, -77, + -31,-124,-119, -31,-123, -86, -31,-122, -78, -31,-124,-119, -31,-123, -86, -31,-122, -79, -31,-124, +-119, -31,-123, -86, -31,-122, -80, -31,-124,-119, -31,-123, -86, -31,-122, -81, -31,-124,-119, -31, +-123, -86, -31,-122, -82, -31,-124,-119, -31,-123, -86, -31,-122, -83, -31,-124,-119, -31,-123, -86, + -31,-122, -84, -31,-124,-119, -31,-123, -86, -31,-122, -85, -31,-124,-119, -31,-123, -86, -31,-122, + -86, -31,-124,-119, -31,-123, -86, -31,-122, -87, -31,-124,-119, -31,-123, -86, -31,-122, -88, -31, +-124,-119, -31,-123, -87, -31,-121,-126, -31,-124,-119, -31,-123, -87, -31,-121,-127, -31,-124,-119, + -31,-123, -87, -31,-121,-128, -31,-124,-119, -31,-123, -87, -31,-122, -65, -31,-124,-119, -31,-123, + -87, -31,-122, -66, -31,-124,-119, -31,-123, -87, -31,-122, -67, -31,-124,-119, -31,-123, -87, -31, +-122, -68, -31,-124,-119, -31,-123, -87, -31,-122, -69, -31,-124,-119, -31,-123, -87, -31,-122, -70, + -31,-124,-119, -31,-123, -87, -31,-122, -71, -31,-124,-119, -31,-123, -87, -31,-122, -72, -31,-124, +-119, -31,-123, -87, -31,-122, -73, -31,-124,-119, -31,-123, -87, -31,-122, -74, -31,-124,-119, -31, +-123, -87, -31,-122, -75, -31,-124,-119, -31,-123, -87, -31,-122, -76, -31,-124,-119, -31,-123, -87, + -31,-122, -77, -31,-124,-119, -31,-123, -87, -31,-122, -78, -31,-124,-119, -31,-123, -87, -31,-122, + -79, -31,-124,-119, -31,-123, -87, -31,-122, -80, -31,-124,-119, -31,-123, -87, -31,-122, -81, -31, +-124,-119, -31,-123, -87, -31,-122, -82, -31,-124,-119, -31,-123, -87, -31,-122, -83, -31,-124,-119, + -31,-123, -87, -31,-122, -84, -31,-124,-119, -31,-123, -87, -31,-122, -85, -31,-124,-119, -31,-123, + -87, -31,-122, -86, -31,-124,-119, -31,-123, -87, -31,-122, -87, -31,-124,-119, -31,-123, -87, -31, +-122, -88, -31,-124,-119, -31,-123, -88, -31,-121,-126, -31,-124,-119, -31,-123, -88, -31,-121,-127, + -31,-124,-119, -31,-123, -88, -31,-121,-128, -31,-124,-119, -31,-123, -88, -31,-122, -65, -31,-124, +-119, -31,-123, -88, -31,-122, -66, -31,-124,-119, -31,-123, -88, -31,-122, -67, -31,-124,-119, -31, +-123, -88, -31,-122, -68, -31,-124,-119, -31,-123, -88, -31,-122, -69, -31,-124,-119, -31,-123, -88, + -31,-122, -70, -31,-124,-119, -31,-123, -88, -31,-122, -71, -31,-124,-119, -31,-123, -88, -31,-122, + -72, -31,-124,-119, -31,-123, -88, -31,-122, -73, -31,-124,-119, -31,-123, -88, -31,-122, -74, -31, +-124,-119, -31,-123, -88, -31,-122, -75, -31,-124,-119, -31,-123, -88, -31,-122, -76, -31,-124,-119, + -31,-123, -88, -31,-122, -77, -31,-124,-119, -31,-123, -88, -31,-122, -78, -31,-124,-119, -31,-123, + -88, -31,-122, -79, -31,-124,-119, -31,-123, -88, -31,-122, -80, -31,-124,-119, -31,-123, -88, -31, +-122, -81, -31,-124,-119, -31,-123, -88, -31,-122, -82, -31,-124,-119, -31,-123, -88, -31,-122, -83, + -31,-124,-119, -31,-123, -88, -31,-122, -84, -31,-124,-119, -31,-123, -88, -31,-122, -85, -31,-124, +-119, -31,-123, -88, -31,-122, -86, -31,-124,-119, -31,-123, -88, -31,-122, -87, -31,-124,-119, -31, +-123, -88, -31,-122, -88, -31,-124,-119, -31,-123, -89, -31,-121,-126, -31,-124,-119, -31,-123, -89, + -31,-121,-127, -31,-124,-119, -31,-123, -89, -31,-121,-128, -31,-124,-119, -31,-123, -89, -31,-122, + -65, -31,-124,-119, -31,-123, -89, -31,-122, -66, -31,-124,-119, -31,-123, -89, -31,-122, -67, -31, +-124,-119, -31,-123, -89, -31,-122, -68, -31,-124,-119, -31,-123, -89, -31,-122, -69, -31,-124,-119, + -31,-123, -89, -31,-122, -70, -31,-124,-119, -31,-123, -89, -31,-122, -71, -31,-124,-119, -31,-123, + -89, -31,-122, -72, -31,-124,-119, -31,-123, -89, -31,-122, -73, -31,-124,-119, -31,-123, -89, -31, +-122, -74, -31,-124,-119, -31,-123, -89, -31,-122, -75, -31,-124,-119, -31,-123, -89, -31,-122, -76, + -31,-124,-119, -31,-123, -89, -31,-122, -77, -31,-124,-119, -31,-123, -89, -31,-122, -78, -31,-124, +-119, -31,-123, -89, -31,-122, -79, -31,-124,-119, -31,-123, -89, -31,-122, -80, -31,-124,-119, -31, +-123, -89, -31,-122, -81, -31,-124,-119, -31,-123, -89, -31,-122, -82, -31,-124,-119, -31,-123, -89, + -31,-122, -83, -31,-124,-119, -31,-123, -89, -31,-122, -84, -31,-124,-119, -31,-123, -89, -31,-122, + -85, -31,-124,-119, -31,-123, -89, -31,-122, -86, -31,-124,-119, -31,-123, -89, -31,-122, -87, -31, +-124,-119, -31,-123, -89, -31,-122, -88, -31,-124,-119, -31,-123, -90, -31,-121,-126, -31,-124,-119, + -31,-123, -90, -31,-121,-127, -31,-124,-119, -31,-123, -90, -31,-121,-128, -31,-124,-119, -31,-123, + -90, -31,-122, -65, -31,-124,-119, -31,-123, -90, -31,-122, -66, -31,-124,-119, -31,-123, -90, -31, +-122, -67, -31,-124,-119, -31,-123, -90, -31,-122, -68, -31,-124,-119, -31,-123, -90, -31,-122, -69, + -31,-124,-119, -31,-123, -90, -31,-122, -70, -31,-124,-119, -31,-123, -90, -31,-122, -71, -31,-124, +-119, -31,-123, -90, -31,-122, -72, -31,-124,-119, -31,-123, -90, -31,-122, -73, -31,-124,-119, -31, +-123, -90, -31,-122, -74, -31,-124,-119, -31,-123, -90, -31,-122, -75, -31,-124,-119, -31,-123, -90, + -31,-122, -76, -31,-124,-119, -31,-123, -90, -31,-122, -77, -31,-124,-119, -31,-123, -90, -31,-122, + -78, -31,-124,-119, -31,-123, -90, -31,-122, -79, -31,-124,-119, -31,-123, -90, -31,-122, -80, -31, +-124,-119, -31,-123, -90, -31,-122, -81, -31,-124,-119, -31,-123, -90, -31,-122, -82, -31,-124,-119, + -31,-123, -90, -31,-122, -83, -31,-124,-119, -31,-123, -90, -31,-122, -84, -31,-124,-119, -31,-123, + -90, -31,-122, -85, -31,-124,-119, -31,-123, -90, -31,-122, -86, -31,-124,-119, -31,-123, -90, -31, +-122, -87, -31,-124,-119, -31,-123, -90, -31,-122, -88, -31,-124,-119, -31,-123, -91, -31,-121,-126, + -31,-124,-119, -31,-123, -91, -31,-121,-127, -31,-124,-119, -31,-123, -91, -31,-121,-128, -31,-124, +-119, -31,-123, -91, -31,-122, -65, -31,-124,-119, -31,-123, -91, -31,-122, -66, -31,-124,-119, -31, +-123, -91, -31,-122, -67, -31,-124,-119, -31,-123, -91, -31,-122, -68, -31,-124,-119, -31,-123, -91, + -31,-122, -69, -31,-124,-119, -31,-123, -91, -31,-122, -70, -31,-124,-119, -31,-123, -91, -31,-122, + -71, -31,-124,-119, -31,-123, -91, -31,-122, -72, -31,-124,-119, -31,-123, -91, -31,-122, -73, -31, +-124,-119, -31,-123, -91, -31,-122, -74, -31,-124,-119, -31,-123, -91, -31,-122, -75, -31,-124,-119, + -31,-123, -91, -31,-122, -76, -31,-124,-119, -31,-123, -91, -31,-122, -77, -31,-124,-119, -31,-123, + -91, -31,-122, -78, -31,-124,-119, -31,-123, -91, -31,-122, -79, -31,-124,-119, -31,-123, -91, -31, +-122, -80, -31,-124,-119, -31,-123, -91, -31,-122, -81, -31,-124,-119, -31,-123, -91, -31,-122, -82, + -31,-124,-119, -31,-123, -91, -31,-122, -83, -31,-124,-119, -31,-123, -91, -31,-122, -84, -31,-124, +-119, -31,-123, -91, -31,-122, -85, -31,-124,-119, -31,-123, -91, -31,-122, -86, -31,-124,-119, -31, +-123, -91, -31,-122, -87, -31,-124,-119, -31,-123, -91, -31,-122, -88, -31,-124,-119, -31,-123, -92, + -31,-121,-126, -31,-124,-119, -31,-123, -92, -31,-121,-127, -31,-124,-119, -31,-123, -92, -31,-121, +-128, -31,-124,-119, -31,-123, -92, -31,-122, -65, -31,-124,-119, -31,-123, -92, -31,-122, -66, -31, +-124,-119, -31,-123, -92, -31,-122, -67, -31,-124,-119, -31,-123, -92, -31,-122, -68, -31,-124,-119, + -31,-123, -92, -31,-122, -69, -31,-124,-119, -31,-123, -92, -31,-122, -70, -31,-124,-119, -31,-123, + -92, -31,-122, -71, -31,-124,-119, -31,-123, -92, -31,-122, -72, -31,-124,-119, -31,-123, -92, -31, +-122, -73, -31,-124,-119, -31,-123, -92, -31,-122, -74, -31,-124,-119, -31,-123, -92, -31,-122, -75, + -31,-124,-119, -31,-123, -92, -31,-122, -76, -31,-124,-119, -31,-123, -92, -31,-122, -77, -31,-124, +-119, -31,-123, -92, -31,-122, -78, -31,-124,-119, -31,-123, -92, -31,-122, -79, -31,-124,-119, -31, +-123, -92, -31,-122, -80, -31,-124,-119, -31,-123, -92, -31,-122, -81, -31,-124,-119, -31,-123, -92, + -31,-122, -82, -31,-124,-119, -31,-123, -92, -31,-122, -83, -31,-124,-119, -31,-123, -92, -31,-122, + -84, -31,-124,-119, -31,-123, -92, -31,-122, -85, -31,-124,-119, -31,-123, -92, -31,-122, -86, -31, +-124,-119, -31,-123, -92, -31,-122, -87, -31,-124,-119, -31,-123, -92, -31,-122, -88, -31,-124,-119, + -31,-123, -93, -31,-121,-126, -31,-124,-119, -31,-123, -93, -31,-121,-127, -31,-124,-119, -31,-123, + -93, -31,-121,-128, -31,-124,-119, -31,-123, -93, -31,-122, -65, -31,-124,-119, -31,-123, -93, -31, +-122, -66, -31,-124,-119, -31,-123, -93, -31,-122, -67, -31,-124,-119, -31,-123, -93, -31,-122, -68, + -31,-124,-119, -31,-123, -93, -31,-122, -69, -31,-124,-119, -31,-123, -93, -31,-122, -70, -31,-124, +-119, -31,-123, -93, -31,-122, -71, -31,-124,-119, -31,-123, -93, -31,-122, -72, -31,-124,-119, -31, +-123, -93, -31,-122, -73, -31,-124,-119, -31,-123, -93, -31,-122, -74, -31,-124,-119, -31,-123, -93, + -31,-122, -75, -31,-124,-119, -31,-123, -93, -31,-122, -76, -31,-124,-119, -31,-123, -93, -31,-122, + -77, -31,-124,-119, -31,-123, -93, -31,-122, -78, -31,-124,-119, -31,-123, -93, -31,-122, -79, -31, +-124,-119, -31,-123, -93, -31,-122, -80, -31,-124,-119, -31,-123, -93, -31,-122, -81, -31,-124,-119, + -31,-123, -93, -31,-122, -82, -31,-124,-119, -31,-123, -93, -31,-122, -83, -31,-124,-119, -31,-123, + -93, -31,-122, -84, -31,-124,-119, -31,-123, -93, -31,-122, -85, -31,-124,-119, -31,-123, -93, -31, +-122, -86, -31,-124,-119, -31,-123, -93, -31,-122, -87, -31,-124,-119, -31,-123, -93, -31,-122, -88, + -31,-124,-119, -31,-123, -94, -31,-121,-126, -31,-124,-119, -31,-123, -94, -31,-121,-127, -31,-124, +-119, -31,-123, -94, -31,-121,-128, -31,-124,-119, -31,-123, -94, -31,-122, -65, -31,-124,-119, -31, +-123, -94, -31,-122, -66, -31,-124,-119, -31,-123, -94, -31,-122, -67, -31,-124,-119, -31,-123, -94, + -31,-122, -68, -31,-124,-119, -31,-123, -94, -31,-122, -69, -31,-124,-119, -31,-123, -94, -31,-122, + -70, -31,-124,-119, -31,-123, -94, -31,-122, -71, -31,-124,-119, -31,-123, -94, -31,-122, -72, -31, +-124,-119, -31,-123, -94, -31,-122, -73, -31,-124,-119, -31,-123, -94, -31,-122, -74, -31,-124,-119, + -31,-123, -94, -31,-122, -75, -31,-124,-119, -31,-123, -94, -31,-122, -76, -31,-124,-119, -31,-123, + -94, -31,-122, -77, -31,-124,-119, -31,-123, -94, -31,-122, -78, -31,-124,-119, -31,-123, -94, -31, +-122, -79, -31,-124,-119, -31,-123, -94, -31,-122, -80, -31,-124,-119, -31,-123, -94, -31,-122, -81, + -31,-124,-119, -31,-123, -94, -31,-122, -82, -31,-124,-119, -31,-123, -94, -31,-122, -83, -31,-124, +-119, -31,-123, -94, -31,-122, -84, -31,-124,-119, -31,-123, -94, -31,-122, -85, -31,-124,-119, -31, +-123, -94, -31,-122, -86, -31,-124,-119, -31,-123, -94, -31,-122, -87, -31,-124,-119, -31,-123, -94, + -31,-122, -88, -31,-124,-119, -31,-123, -95, -31,-121,-126, -31,-124,-119, -31,-123, -95, -31,-121, +-127, -31,-124,-119, -31,-123, -95, -31,-121,-128, -31,-124,-119, -31,-123, -95, -31,-122, -65, -31, +-124,-119, -31,-123, -95, -31,-122, -66, -31,-124,-119, -31,-123, -95, -31,-122, -67, -31,-124,-119, + -31,-123, -95, -31,-122, -68, -31,-124,-119, -31,-123, -95, -31,-122, -69, -31,-124,-119, -31,-123, + -95, -31,-122, -70, -31,-124,-119, -31,-123, -95, -31,-122, -71, -31,-124,-119, -31,-123, -95, -31, +-122, -72, -31,-124,-119, -31,-123, -95, -31,-122, -73, -31,-124,-119, -31,-123, -95, -31,-122, -74, + -31,-124,-119, -31,-123, -95, -31,-122, -75, -31,-124,-119, -31,-123, -95, -31,-122, -76, -31,-124, +-119, -31,-123, -95, -31,-122, -77, -31,-124,-119, -31,-123, -95, -31,-122, -78, -31,-124,-119, -31, +-123, -95, -31,-122, -79, -31,-124,-119, -31,-123, -95, -31,-122, -80, -31,-124,-119, -31,-123, -95, + -31,-122, -81, -31,-124,-119, -31,-123, -95, -31,-122, -82, -31,-124,-119, -31,-123, -95, -31,-122, + -83, -31,-124,-119, -31,-123, -95, -31,-122, -84, -31,-124,-119, -31,-123, -95, -31,-122, -85, -31, +-124,-119, -31,-123, -95, -31,-122, -86, -31,-124,-119, -31,-123, -95, -31,-122, -87, -31,-124,-119, + -31,-123, -95, -31,-122, -88, -31,-124,-120, -31,-123, -75, -31,-121,-126, -31,-124,-120, -31,-123, + -75, -31,-121,-127, -31,-124,-120, -31,-123, -75, -31,-121,-128, -31,-124,-120, -31,-123, -75, -31, +-122, -65, -31,-124,-120, -31,-123, -75, -31,-122, -66, -31,-124,-120, -31,-123, -75, -31,-122, -67, + -31,-124,-120, -31,-123, -75, -31,-122, -68, -31,-124,-120, -31,-123, -75, -31,-122, -69, -31,-124, +-120, -31,-123, -75, -31,-122, -70, -31,-124,-120, -31,-123, -75, -31,-122, -71, -31,-124,-120, -31, +-123, -75, -31,-122, -72, -31,-124,-120, -31,-123, -75, -31,-122, -73, -31,-124,-120, -31,-123, -75, + -31,-122, -74, -31,-124,-120, -31,-123, -75, -31,-122, -75, -31,-124,-120, -31,-123, -75, -31,-122, + -76, -31,-124,-120, -31,-123, -75, -31,-122, -77, -31,-124,-120, -31,-123, -75, -31,-122, -78, -31, +-124,-120, -31,-123, -75, -31,-122, -79, -31,-124,-120, -31,-123, -75, -31,-122, -80, -31,-124,-120, + -31,-123, -75, -31,-122, -81, -31,-124,-120, -31,-123, -75, -31,-122, -82, -31,-124,-120, -31,-123, + -75, -31,-122, -83, -31,-124,-120, -31,-123, -75, -31,-122, -84, -31,-124,-120, -31,-123, -75, -31, +-122, -85, -31,-124,-120, -31,-123, -75, -31,-122, -86, -31,-124,-120, -31,-123, -75, -31,-122, -87, + -31,-124,-120, -31,-123, -75, -31,-122, -88, -31,-124,-120, -31,-123, -76, -31,-121,-126, -31,-124, +-120, -31,-123, -76, -31,-121,-127, -31,-124,-120, -31,-123, -76, -31,-121,-128, -31,-124,-120, -31, +-123, -76, -31,-122, -65, -31,-124,-120, -31,-123, -76, -31,-122, -66, -31,-124,-120, -31,-123, -76, + -31,-122, -67, -31,-124,-120, -31,-123, -76, -31,-122, -68, -31,-124,-120, -31,-123, -76, -31,-122, + -69, -31,-124,-120, -31,-123, -76, -31,-122, -70, -31,-124,-120, -31,-123, -76, -31,-122, -71, -31, +-124,-120, -31,-123, -76, -31,-122, -72, -31,-124,-120, -31,-123, -76, -31,-122, -73, -31,-124,-120, + -31,-123, -76, -31,-122, -74, -31,-124,-120, -31,-123, -76, -31,-122, -75, -31,-124,-120, -31,-123, + -76, -31,-122, -76, -31,-124,-120, -31,-123, -76, -31,-122, -77, -31,-124,-120, -31,-123, -76, -31, +-122, -78, -31,-124,-120, -31,-123, -76, -31,-122, -79, -31,-124,-120, -31,-123, -76, -31,-122, -80, + -31,-124,-120, -31,-123, -76, -31,-122, -81, -31,-124,-120, -31,-123, -76, -31,-122, -82, -31,-124, +-120, -31,-123, -76, -31,-122, -83, -31,-124,-120, -31,-123, -76, -31,-122, -84, -31,-124,-120, -31, +-123, -76, -31,-122, -85, -31,-124,-120, -31,-123, -76, -31,-122, -86, -31,-124,-120, -31,-123, -76, + -31,-122, -87, -31,-124,-120, -31,-123, -76, -31,-122, -88, -31,-124,-120, -31,-123, -77, -31,-121, +-126, -31,-124,-120, -31,-123, -77, -31,-121,-127, -31,-124,-120, -31,-123, -77, -31,-121,-128, -31, +-124,-120, -31,-123, -77, -31,-122, -65, -31,-124,-120, -31,-123, -77, -31,-122, -66, -31,-124,-120, + -31,-123, -77, -31,-122, -67, -31,-124,-120, -31,-123, -77, -31,-122, -68, -31,-124,-120, -31,-123, + -77, -31,-122, -69, -31,-124,-120, -31,-123, -77, -31,-122, -70, -31,-124,-120, -31,-123, -77, -31, +-122, -71, -31,-124,-120, -31,-123, -77, -31,-122, -72, -31,-124,-120, -31,-123, -77, -31,-122, -73, + -31,-124,-120, -31,-123, -77, -31,-122, -74, -31,-124,-120, -31,-123, -77, -31,-122, -75, -31,-124, +-120, -31,-123, -77, -31,-122, -76, -31,-124,-120, -31,-123, -77, -31,-122, -77, -31,-124,-120, -31, +-123, -77, -31,-122, -78, -31,-124,-120, -31,-123, -77, -31,-122, -79, -31,-124,-120, -31,-123, -77, + -31,-122, -80, -31,-124,-120, -31,-123, -77, -31,-122, -81, -31,-124,-120, -31,-123, -77, -31,-122, + -82, -31,-124,-120, -31,-123, -77, -31,-122, -83, -31,-124,-120, -31,-123, -77, -31,-122, -84, -31, +-124,-120, -31,-123, -77, -31,-122, -85, -31,-124,-120, -31,-123, -77, -31,-122, -86, -31,-124,-120, + -31,-123, -77, -31,-122, -87, -31,-124,-120, -31,-123, -77, -31,-122, -88, -31,-124,-120, -31,-123, + -78, -31,-121,-126, -31,-124,-120, -31,-123, -78, -31,-121,-127, -31,-124,-120, -31,-123, -78, -31, +-121,-128, -31,-124,-120, -31,-123, -78, -31,-122, -65, -31,-124,-120, -31,-123, -78, -31,-122, -66, + -31,-124,-120, -31,-123, -78, -31,-122, -67, -31,-124,-120, -31,-123, -78, -31,-122, -68, -31,-124, +-120, -31,-123, -78, -31,-122, -69, -31,-124,-120, -31,-123, -78, -31,-122, -70, -31,-124,-120, -31, +-123, -78, -31,-122, -71, -31,-124,-120, -31,-123, -78, -31,-122, -72, -31,-124,-120, -31,-123, -78, + -31,-122, -73, -31,-124,-120, -31,-123, -78, -31,-122, -74, -31,-124,-120, -31,-123, -78, -31,-122, + -75, -31,-124,-120, -31,-123, -78, -31,-122, -76, -31,-124,-120, -31,-123, -78, -31,-122, -77, -31, +-124,-120, -31,-123, -78, -31,-122, -78, -31,-124,-120, -31,-123, -78, -31,-122, -79, -31,-124,-120, + -31,-123, -78, -31,-122, -80, -31,-124,-120, -31,-123, -78, -31,-122, -81, -31,-124,-120, -31,-123, + -78, -31,-122, -82, -31,-124,-120, -31,-123, -78, -31,-122, -83, -31,-124,-120, -31,-123, -78, -31, +-122, -84, -31,-124,-120, -31,-123, -78, -31,-122, -85, -31,-124,-120, -31,-123, -78, -31,-122, -86, + -31,-124,-120, -31,-123, -78, -31,-122, -87, -31,-124,-120, -31,-123, -78, -31,-122, -88, -31,-124, +-120, -31,-123, -79, -31,-121,-126, -31,-124,-120, -31,-123, -79, -31,-121,-127, -31,-124,-120, -31, +-123, -79, -31,-121,-128, -31,-124,-120, -31,-123, -79, -31,-122, -65, -31,-124,-120, -31,-123, -79, + -31,-122, -66, -31,-124,-120, -31,-123, -79, -31,-122, -67, -31,-124,-120, -31,-123, -79, -31,-122, + -68, -31,-124,-120, -31,-123, -79, -31,-122, -69, -31,-124,-120, -31,-123, -79, -31,-122, -70, -31, +-124,-120, -31,-123, -79, -31,-122, -71, -31,-124,-120, -31,-123, -79, -31,-122, -72, -31,-124,-120, + -31,-123, -79, -31,-122, -73, -31,-124,-120, -31,-123, -79, -31,-122, -74, -31,-124,-120, -31,-123, + -79, -31,-122, -75, -31,-124,-120, -31,-123, -79, -31,-122, -76, -31,-124,-120, -31,-123, -79, -31, +-122, -77, -31,-124,-120, -31,-123, -79, -31,-122, -78, -31,-124,-120, -31,-123, -79, -31,-122, -79, + -31,-124,-120, -31,-123, -79, -31,-122, -80, -31,-124,-120, -31,-123, -79, -31,-122, -81, -31,-124, +-120, -31,-123, -79, -31,-122, -82, -31,-124,-120, -31,-123, -79, -31,-122, -83, -31,-124,-120, -31, +-123, -79, -31,-122, -84, -31,-124,-120, -31,-123, -79, -31,-122, -85, -31,-124,-120, -31,-123, -79, + -31,-122, -86, -31,-124,-120, -31,-123, -79, -31,-122, -87, -31,-124,-120, -31,-123, -79, -31,-122, + -88, -31,-124,-120, -31,-123, -80, -31,-121,-126, -31,-124,-120, -31,-123, -80, -31,-121,-127, -31, +-124,-120, -31,-123, -80, -31,-121,-128, -31,-124,-120, -31,-123, -80, -31,-122, -65, -31,-124,-120, + -31,-123, -80, -31,-122, -66, -31,-124,-120, -31,-123, -80, -31,-122, -67, -31,-124,-120, -31,-123, + -80, -31,-122, -68, -31,-124,-120, -31,-123, -80, -31,-122, -69, -31,-124,-120, -31,-123, -80, -31, +-122, -70, -31,-124,-120, -31,-123, -80, -31,-122, -71, -31,-124,-120, -31,-123, -80, -31,-122, -72, + -31,-124,-120, -31,-123, -80, -31,-122, -73, -31,-124,-120, -31,-123, -80, -31,-122, -74, -31,-124, +-120, -31,-123, -80, -31,-122, -75, -31,-124,-120, -31,-123, -80, -31,-122, -76, -31,-124,-120, -31, +-123, -80, -31,-122, -77, -31,-124,-120, -31,-123, -80, -31,-122, -78, -31,-124,-120, -31,-123, -80, + -31,-122, -79, -31,-124,-120, -31,-123, -80, -31,-122, -80, -31,-124,-120, -31,-123, -80, -31,-122, + -81, -31,-124,-120, -31,-123, -80, -31,-122, -82, -31,-124,-120, -31,-123, -80, -31,-122, -83, -31, +-124,-120, -31,-123, -80, -31,-122, -84, -31,-124,-120, -31,-123, -80, -31,-122, -85, -31,-124,-120, + -31,-123, -80, -31,-122, -86, -31,-124,-120, -31,-123, -80, -31,-122, -87, -31,-124,-120, -31,-123, + -80, -31,-122, -88, -31,-124,-120, -31,-123, -81, -31,-121,-126, -31,-124,-120, -31,-123, -81, -31, +-121,-127, -31,-124,-120, -31,-123, -81, -31,-121,-128, -31,-124,-120, -31,-123, -81, -31,-122, -65, + -31,-124,-120, -31,-123, -81, -31,-122, -66, -31,-124,-120, -31,-123, -81, -31,-122, -67, -31,-124, +-120, -31,-123, -81, -31,-122, -68, -31,-124,-120, -31,-123, -81, -31,-122, -69, -31,-124,-120, -31, +-123, -81, -31,-122, -70, -31,-124,-120, -31,-123, -81, -31,-122, -71, -31,-124,-120, -31,-123, -81, + -31,-122, -72, -31,-124,-120, -31,-123, -81, -31,-122, -73, -31,-124,-120, -31,-123, -81, -31,-122, + -74, -31,-124,-120, -31,-123, -81, -31,-122, -75, -31,-124,-120, -31,-123, -81, -31,-122, -76, -31, +-124,-120, -31,-123, -81, -31,-122, -77, -31,-124,-120, -31,-123, -81, -31,-122, -78, -31,-124,-120, + -31,-123, -81, -31,-122, -79, -31,-124,-120, -31,-123, -81, -31,-122, -80, -31,-124,-120, -31,-123, + -81, -31,-122, -81, -31,-124,-120, -31,-123, -81, -31,-122, -82, -31,-124,-120, -31,-123, -81, -31, +-122, -83, -31,-124,-120, -31,-123, -81, -31,-122, -84, -31,-124,-120, -31,-123, -81, -31,-122, -85, + -31,-124,-120, -31,-123, -81, -31,-122, -86, -31,-124,-120, -31,-123, -81, -31,-122, -87, -31,-124, +-120, -31,-123, -81, -31,-122, -88, -31,-124,-120, -31,-123, -82, -31,-121,-126, -31,-124,-120, -31, +-123, -82, -31,-121,-127, -31,-124,-120, -31,-123, -82, -31,-121,-128, -31,-124,-120, -31,-123, -82, + -31,-122, -65, -31,-124,-120, -31,-123, -82, -31,-122, -66, -31,-124,-120, -31,-123, -82, -31,-122, + -67, -31,-124,-120, -31,-123, -82, -31,-122, -68, -31,-124,-120, -31,-123, -82, -31,-122, -69, -31, +-124,-120, -31,-123, -82, -31,-122, -70, -31,-124,-120, -31,-123, -82, -31,-122, -71, -31,-124,-120, + -31,-123, -82, -31,-122, -72, -31,-124,-120, -31,-123, -82, -31,-122, -73, -31,-124,-120, -31,-123, + -82, -31,-122, -74, -31,-124,-120, -31,-123, -82, -31,-122, -75, -31,-124,-120, -31,-123, -82, -31, +-122, -76, -31,-124,-120, -31,-123, -82, -31,-122, -77, -31,-124,-120, -31,-123, -82, -31,-122, -78, + -31,-124,-120, -31,-123, -82, -31,-122, -79, -31,-124,-120, -31,-123, -82, -31,-122, -80, -31,-124, +-120, -31,-123, -82, -31,-122, -81, -31,-124,-120, -31,-123, -82, -31,-122, -82, -31,-124,-120, -31, +-123, -82, -31,-122, -83, -31,-124,-120, -31,-123, -82, -31,-122, -84, -31,-124,-120, -31,-123, -82, + -31,-122, -85, -31,-124,-120, -31,-123, -82, -31,-122, -86, -31,-124,-120, -31,-123, -82, -31,-122, + -87, -31,-124,-120, -31,-123, -82, -31,-122, -88, -31,-124,-120, -31,-123, -83, -31,-121,-126, -31, +-124,-120, -31,-123, -83, -31,-121,-127, -31,-124,-120, -31,-123, -83, -31,-121,-128, -31,-124,-120, + -31,-123, -83, -31,-122, -65, -31,-124,-120, -31,-123, -83, -31,-122, -66, -31,-124,-120, -31,-123, + -83, -31,-122, -67, -31,-124,-120, -31,-123, -83, -31,-122, -68, -31,-124,-120, -31,-123, -83, -31, +-122, -69, -31,-124,-120, -31,-123, -83, -31,-122, -70, -31,-124,-120, -31,-123, -83, -31,-122, -71, + -31,-124,-120, -31,-123, -83, -31,-122, -72, -31,-124,-120, -31,-123, -83, -31,-122, -73, -31,-124, +-120, -31,-123, -83, -31,-122, -74, -31,-124,-120, -31,-123, -83, -31,-122, -75, -31,-124,-120, -31, +-123, -83, -31,-122, -76, -31,-124,-120, -31,-123, -83, -31,-122, -77, -31,-124,-120, -31,-123, -83, + -31,-122, -78, -31,-124,-120, -31,-123, -83, -31,-122, -79, -31,-124,-120, -31,-123, -83, -31,-122, + -80, -31,-124,-120, -31,-123, -83, -31,-122, -81, -31,-124,-120, -31,-123, -83, -31,-122, -82, -31, +-124,-120, -31,-123, -83, -31,-122, -83, -31,-124,-120, -31,-123, -83, -31,-122, -84, -31,-124,-120, + -31,-123, -83, -31,-122, -85, -31,-124,-120, -31,-123, -83, -31,-122, -86, -31,-124,-120, -31,-123, + -83, -31,-122, -87, -31,-124,-120, -31,-123, -83, -31,-122, -88, -31,-124,-120, -31,-123, -84, -31, +-121,-126, -31,-124,-120, -31,-123, -84, -31,-121,-127, -31,-124,-120, -31,-123, -84, -31,-121,-128, + -31,-124,-120, -31,-123, -84, -31,-122, -65, -31,-124,-120, -31,-123, -84, -31,-122, -66, -31,-124, +-120, -31,-123, -84, -31,-122, -67, -31,-124,-120, -31,-123, -84, -31,-122, -68, -31,-124,-120, -31, +-123, -84, -31,-122, -69, -31,-124,-120, -31,-123, -84, -31,-122, -70, -31,-124,-120, -31,-123, -84, + -31,-122, -71, -31,-124,-120, -31,-123, -84, -31,-122, -72, -31,-124,-120, -31,-123, -84, -31,-122, + -73, -31,-124,-120, -31,-123, -84, -31,-122, -74, -31,-124,-120, -31,-123, -84, -31,-122, -75, -31, +-124,-120, -31,-123, -84, -31,-122, -76, -31,-124,-120, -31,-123, -84, -31,-122, -77, -31,-124,-120, + -31,-123, -84, -31,-122, -78, -31,-124,-120, -31,-123, -84, -31,-122, -79, -31,-124,-120, -31,-123, + -84, -31,-122, -80, -31,-124,-120, -31,-123, -84, -31,-122, -81, -31,-124,-120, -31,-123, -84, -31, +-122, -82, -31,-124,-120, -31,-123, -84, -31,-122, -83, -31,-124,-120, -31,-123, -84, -31,-122, -84, + -31,-124,-120, -31,-123, -84, -31,-122, -85, -31,-124,-120, -31,-123, -84, -31,-122, -86, -31,-124, +-120, -31,-123, -84, -31,-122, -87, -31,-124,-120, -31,-123, -84, -31,-122, -88, -31,-124,-120, -31, +-123, -85, -31,-121,-126, -31,-124,-120, -31,-123, -85, -31,-121,-127, -31,-124,-120, -31,-123, -85, + -31,-121,-128, -31,-124,-120, -31,-123, -85, -31,-122, -65, -31,-124,-120, -31,-123, -85, -31,-122, + -66, -31,-124,-120, -31,-123, -85, -31,-122, -67, -31,-124,-120, -31,-123, -85, -31,-122, -68, -31, +-124,-120, -31,-123, -85, -31,-122, -69, -31,-124,-120, -31,-123, -85, -31,-122, -70, -31,-124,-120, + -31,-123, -85, -31,-122, -71, -31,-124,-120, -31,-123, -85, -31,-122, -72, -31,-124,-120, -31,-123, + -85, -31,-122, -73, -31,-124,-120, -31,-123, -85, -31,-122, -74, -31,-124,-120, -31,-123, -85, -31, +-122, -75, -31,-124,-120, -31,-123, -85, -31,-122, -76, -31,-124,-120, -31,-123, -85, -31,-122, -77, + -31,-124,-120, -31,-123, -85, -31,-122, -78, -31,-124,-120, -31,-123, -85, -31,-122, -79, -31,-124, +-120, -31,-123, -85, -31,-122, -80, -31,-124,-120, -31,-123, -85, -31,-122, -81, -31,-124,-120, -31, +-123, -85, -31,-122, -82, -31,-124,-120, -31,-123, -85, -31,-122, -83, -31,-124,-120, -31,-123, -85, + -31,-122, -84, -31,-124,-120, -31,-123, -85, -31,-122, -85, -31,-124,-120, -31,-123, -85, -31,-122, + -86, -31,-124,-120, -31,-123, -85, -31,-122, -87, -31,-124,-120, -31,-123, -85, -31,-122, -88, -31, +-124,-120, -31,-123, -86, -31,-121,-126, -31,-124,-120, -31,-123, -86, -31,-121,-127, -31,-124,-120, + -31,-123, -86, -31,-121,-128, -31,-124,-120, -31,-123, -86, -31,-122, -65, -31,-124,-120, -31,-123, + -86, -31,-122, -66, -31,-124,-120, -31,-123, -86, -31,-122, -67, -31,-124,-120, -31,-123, -86, -31, +-122, -68, -31,-124,-120, -31,-123, -86, -31,-122, -69, -31,-124,-120, -31,-123, -86, -31,-122, -70, + -31,-124,-120, -31,-123, -86, -31,-122, -71, -31,-124,-120, -31,-123, -86, -31,-122, -72, -31,-124, +-120, -31,-123, -86, -31,-122, -73, -31,-124,-120, -31,-123, -86, -31,-122, -74, -31,-124,-120, -31, +-123, -86, -31,-122, -75, -31,-124,-120, -31,-123, -86, -31,-122, -76, -31,-124,-120, -31,-123, -86, + -31,-122, -77, -31,-124,-120, -31,-123, -86, -31,-122, -78, -31,-124,-120, -31,-123, -86, -31,-122, + -79, -31,-124,-120, -31,-123, -86, -31,-122, -80, -31,-124,-120, -31,-123, -86, -31,-122, -81, -31, +-124,-120, -31,-123, -86, -31,-122, -82, -31,-124,-120, -31,-123, -86, -31,-122, -83, -31,-124,-120, + -31,-123, -86, -31,-122, -84, -31,-124,-120, -31,-123, -86, -31,-122, -85, -31,-124,-120, -31,-123, + -86, -31,-122, -86, -31,-124,-120, -31,-123, -86, -31,-122, -87, -31,-124,-120, -31,-123, -86, -31, +-122, -88, -31,-124,-120, -31,-123, -87, -31,-121,-126, -31,-124,-120, -31,-123, -87, -31,-121,-127, + -31,-124,-120, -31,-123, -87, -31,-121,-128, -31,-124,-120, -31,-123, -87, -31,-122, -65, -31,-124, +-120, -31,-123, -87, -31,-122, -66, -31,-124,-120, -31,-123, -87, -31,-122, -67, -31,-124,-120, -31, +-123, -87, -31,-122, -68, -31,-124,-120, -31,-123, -87, -31,-122, -69, -31,-124,-120, -31,-123, -87, + -31,-122, -70, -31,-124,-120, -31,-123, -87, -31,-122, -71, -31,-124,-120, -31,-123, -87, -31,-122, + -72, -31,-124,-120, -31,-123, -87, -31,-122, -73, -31,-124,-120, -31,-123, -87, -31,-122, -74, -31, +-124,-120, -31,-123, -87, -31,-122, -75, -31,-124,-120, -31,-123, -87, -31,-122, -76, -31,-124,-120, + -31,-123, -87, -31,-122, -77, -31,-124,-120, -31,-123, -87, -31,-122, -78, -31,-124,-120, -31,-123, + -87, -31,-122, -79, -31,-124,-120, -31,-123, -87, -31,-122, -80, -31,-124,-120, -31,-123, -87, -31, +-122, -81, -31,-124,-120, -31,-123, -87, -31,-122, -82, -31,-124,-120, -31,-123, -87, -31,-122, -83, + -31,-124,-120, -31,-123, -87, -31,-122, -84, -31,-124,-120, -31,-123, -87, -31,-122, -85, -31,-124, +-120, -31,-123, -87, -31,-122, -86, -31,-124,-120, -31,-123, -87, -31,-122, -87, -31,-124,-120, -31, +-123, -87, -31,-122, -88, -31,-124,-120, -31,-123, -88, -31,-121,-126, -31,-124,-120, -31,-123, -88, + -31,-121,-127, -31,-124,-120, -31,-123, -88, -31,-121,-128, -31,-124,-120, -31,-123, -88, -31,-122, + -65, -31,-124,-120, -31,-123, -88, -31,-122, -66, -31,-124,-120, -31,-123, -88, -31,-122, -67, -31, +-124,-120, -31,-123, -88, -31,-122, -68, -31,-124,-120, -31,-123, -88, -31,-122, -69, -31,-124,-120, + -31,-123, -88, -31,-122, -70, -31,-124,-120, -31,-123, -88, -31,-122, -71, -31,-124,-120, -31,-123, + -88, -31,-122, -72, -31,-124,-120, -31,-123, -88, -31,-122, -73, -31,-124,-120, -31,-123, -88, -31, +-122, -74, -31,-124,-120, -31,-123, -88, -31,-122, -75, -31,-124,-120, -31,-123, -88, -31,-122, -76, + -31,-124,-120, -31,-123, -88, -31,-122, -77, -31,-124,-120, -31,-123, -88, -31,-122, -78, -31,-124, +-120, -31,-123, -88, -31,-122, -79, -31,-124,-120, -31,-123, -88, -31,-122, -80, -31,-124,-120, -31, +-123, -88, -31,-122, -81, -31,-124,-120, -31,-123, -88, -31,-122, -82, -31,-124,-120, -31,-123, -88, + -31,-122, -83, -31,-124,-120, -31,-123, -88, -31,-122, -84, -31,-124,-120, -31,-123, -88, -31,-122, + -85, -31,-124,-120, -31,-123, -88, -31,-122, -86, -31,-124,-120, -31,-123, -88, -31,-122, -87, -31, +-124,-120, -31,-123, -88, -31,-122, -88, -31,-124,-120, -31,-123, -89, -31,-121,-126, -31,-124,-120, + -31,-123, -89, -31,-121,-127, -31,-124,-120, -31,-123, -89, -31,-121,-128, -31,-124,-120, -31,-123, + -89, -31,-122, -65, -31,-124,-120, -31,-123, -89, -31,-122, -66, -31,-124,-120, -31,-123, -89, -31, +-122, -67, -31,-124,-120, -31,-123, -89, -31,-122, -68, -31,-124,-120, -31,-123, -89, -31,-122, -69, + -31,-124,-120, -31,-123, -89, -31,-122, -70, -31,-124,-120, -31,-123, -89, -31,-122, -71, -31,-124, +-120, -31,-123, -89, -31,-122, -72, -31,-124,-120, -31,-123, -89, -31,-122, -73, -31,-124,-120, -31, +-123, -89, -31,-122, -74, -31,-124,-120, -31,-123, -89, -31,-122, -75, -31,-124,-120, -31,-123, -89, + -31,-122, -76, -31,-124,-120, -31,-123, -89, -31,-122, -77, -31,-124,-120, -31,-123, -89, -31,-122, + -78, -31,-124,-120, -31,-123, -89, -31,-122, -79, -31,-124,-120, -31,-123, -89, -31,-122, -80, -31, +-124,-120, -31,-123, -89, -31,-122, -81, -31,-124,-120, -31,-123, -89, -31,-122, -82, -31,-124,-120, + -31,-123, -89, -31,-122, -83, -31,-124,-120, -31,-123, -89, -31,-122, -84, -31,-124,-120, -31,-123, + -89, -31,-122, -85, -31,-124,-120, -31,-123, -89, -31,-122, -86, -31,-124,-120, -31,-123, -89, -31, +-122, -87, -31,-124,-120, -31,-123, -89, -31,-122, -88, -31,-124,-120, -31,-123, -90, -31,-121,-126, + -31,-124,-120, -31,-123, -90, -31,-121,-127, -31,-124,-120, -31,-123, -90, -31,-121,-128, -31,-124, +-120, -31,-123, -90, -31,-122, -65, -31,-124,-120, -31,-123, -90, -31,-122, -66, -31,-124,-120, -31, +-123, -90, -31,-122, -67, -31,-124,-120, -31,-123, -90, -31,-122, -68, -31,-124,-120, -31,-123, -90, + -31,-122, -69, -31,-124,-120, -31,-123, -90, -31,-122, -70, -31,-124,-120, -31,-123, -90, -31,-122, + -71, -31,-124,-120, -31,-123, -90, -31,-122, -72, -31,-124,-120, -31,-123, -90, -31,-122, -73, -31, +-124,-120, -31,-123, -90, -31,-122, -74, -31,-124,-120, -31,-123, -90, -31,-122, -75, -31,-124,-120, + -31,-123, -90, -31,-122, -76, -31,-124,-120, -31,-123, -90, -31,-122, -77, -31,-124,-120, -31,-123, + -90, -31,-122, -78, -31,-124,-120, -31,-123, -90, -31,-122, -79, -31,-124,-120, -31,-123, -90, -31, +-122, -80, -31,-124,-120, -31,-123, -90, -31,-122, -81, -31,-124,-120, -31,-123, -90, -31,-122, -82, + -31,-124,-120, -31,-123, -90, -31,-122, -83, -31,-124,-120, -31,-123, -90, -31,-122, -84, -31,-124, +-120, -31,-123, -90, -31,-122, -85, -31,-124,-120, -31,-123, -90, -31,-122, -86, -31,-124,-120, -31, +-123, -90, -31,-122, -87, -31,-124,-120, -31,-123, -90, -31,-122, -88, -31,-124,-120, -31,-123, -91, + -31,-121,-126, -31,-124,-120, -31,-123, -91, -31,-121,-127, -31,-124,-120, -31,-123, -91, -31,-121, +-128, -31,-124,-120, -31,-123, -91, -31,-122, -65, -31,-124,-120, -31,-123, -91, -31,-122, -66, -31, +-124,-120, -31,-123, -91, -31,-122, -67, -31,-124,-120, -31,-123, -91, -31,-122, -68, -31,-124,-120, + -31,-123, -91, -31,-122, -69, -31,-124,-120, -31,-123, -91, -31,-122, -70, -31,-124,-120, -31,-123, + -91, -31,-122, -71, -31,-124,-120, -31,-123, -91, -31,-122, -72, -31,-124,-120, -31,-123, -91, -31, +-122, -73, -31,-124,-120, -31,-123, -91, -31,-122, -74, -31,-124,-120, -31,-123, -91, -31,-122, -75, + -31,-124,-120, -31,-123, -91, -31,-122, -76, -31,-124,-120, -31,-123, -91, -31,-122, -77, -31,-124, +-120, -31,-123, -91, -31,-122, -78, -31,-124,-120, -31,-123, -91, -31,-122, -79, -31,-124,-120, -31, +-123, -91, -31,-122, -80, -31,-124,-120, -31,-123, -91, -31,-122, -81, -31,-124,-120, -31,-123, -91, + -31,-122, -82, -31,-124,-120, -31,-123, -91, -31,-122, -83, -31,-124,-120, -31,-123, -91, -31,-122, + -84, -31,-124,-120, -31,-123, -91, -31,-122, -85, -31,-124,-120, -31,-123, -91, -31,-122, -86, -31, +-124,-120, -31,-123, -91, -31,-122, -87, -31,-124,-120, -31,-123, -91, -31,-122, -88, -31,-124,-120, + -31,-123, -92, -31,-121,-126, -31,-124,-120, -31,-123, -92, -31,-121,-127, -31,-124,-120, -31,-123, + -92, -31,-121,-128, -31,-124,-120, -31,-123, -92, -31,-122, -65, -31,-124,-120, -31,-123, -92, -31, +-122, -66, -31,-124,-120, -31,-123, -92, -31,-122, -67, -31,-124,-120, -31,-123, -92, -31,-122, -68, + -31,-124,-120, -31,-123, -92, -31,-122, -69, -31,-124,-120, -31,-123, -92, -31,-122, -70, -31,-124, +-120, -31,-123, -92, -31,-122, -71, -31,-124,-120, -31,-123, -92, -31,-122, -72, -31,-124,-120, -31, +-123, -92, -31,-122, -73, -31,-124,-120, -31,-123, -92, -31,-122, -74, -31,-124,-120, -31,-123, -92, + -31,-122, -75, -31,-124,-120, -31,-123, -92, -31,-122, -76, -31,-124,-120, -31,-123, -92, -31,-122, + -77, -31,-124,-120, -31,-123, -92, -31,-122, -78, -31,-124,-120, -31,-123, -92, -31,-122, -79, -31, +-124,-120, -31,-123, -92, -31,-122, -80, -31,-124,-120, -31,-123, -92, -31,-122, -81, -31,-124,-120, + -31,-123, -92, -31,-122, -82, -31,-124,-120, -31,-123, -92, -31,-122, -83, -31,-124,-120, -31,-123, + -92, -31,-122, -84, -31,-124,-120, -31,-123, -92, -31,-122, -85, -31,-124,-120, -31,-123, -92, -31, +-122, -86, -31,-124,-120, -31,-123, -92, -31,-122, -87, -31,-124,-120, -31,-123, -92, -31,-122, -88, + -31,-124,-120, -31,-123, -93, -31,-121,-126, -31,-124,-120, -31,-123, -93, -31,-121,-127, -31,-124, +-120, -31,-123, -93, -31,-121,-128, -31,-124,-120, -31,-123, -93, -31,-122, -65, -31,-124,-120, -31, +-123, -93, -31,-122, -66, -31,-124,-120, -31,-123, -93, -31,-122, -67, -31,-124,-120, -31,-123, -93, + -31,-122, -68, -31,-124,-120, -31,-123, -93, -31,-122, -69, -31,-124,-120, -31,-123, -93, -31,-122, + -70, -31,-124,-120, -31,-123, -93, -31,-122, -71, -31,-124,-120, -31,-123, -93, -31,-122, -72, -31, +-124,-120, -31,-123, -93, -31,-122, -73, -31,-124,-120, -31,-123, -93, -31,-122, -74, -31,-124,-120, + -31,-123, -93, -31,-122, -75, -31,-124,-120, -31,-123, -93, -31,-122, -76, -31,-124,-120, -31,-123, + -93, -31,-122, -77, -31,-124,-120, -31,-123, -93, -31,-122, -78, -31,-124,-120, -31,-123, -93, -31, +-122, -79, -31,-124,-120, -31,-123, -93, -31,-122, -80, -31,-124,-120, -31,-123, -93, -31,-122, -81, + -31,-124,-120, -31,-123, -93, -31,-122, -82, -31,-124,-120, -31,-123, -93, -31,-122, -83, -31,-124, +-120, -31,-123, -93, -31,-122, -84, -31,-124,-120, -31,-123, -93, -31,-122, -85, -31,-124,-120, -31, +-123, -93, -31,-122, -86, -31,-124,-120, -31,-123, -93, -31,-122, -87, -31,-124,-120, -31,-123, -93, + -31,-122, -88, -31,-124,-120, -31,-123, -94, -31,-121,-126, -31,-124,-120, -31,-123, -94, -31,-121, +-127, -31,-124,-120, -31,-123, -94, -31,-121,-128, -31,-124,-120, -31,-123, -94, -31,-122, -65, -31, +-124,-120, -31,-123, -94, -31,-122, -66, -31,-124,-120, -31,-123, -94, -31,-122, -67, -31,-124,-120, + -31,-123, -94, -31,-122, -68, -31,-124,-120, -31,-123, -94, -31,-122, -69, -31,-124,-120, -31,-123, + -94, -31,-122, -70, -31,-124,-120, -31,-123, -94, -31,-122, -71, -31,-124,-120, -31,-123, -94, -31, +-122, -72, -31,-124,-120, -31,-123, -94, -31,-122, -73, -31,-124,-120, -31,-123, -94, -31,-122, -74, + -31,-124,-120, -31,-123, -94, -31,-122, -75, -31,-124,-120, -31,-123, -94, -31,-122, -76, -31,-124, +-120, -31,-123, -94, -31,-122, -77, -31,-124,-120, -31,-123, -94, -31,-122, -78, -31,-124,-120, -31, +-123, -94, -31,-122, -79, -31,-124,-120, -31,-123, -94, -31,-122, -80, -31,-124,-120, -31,-123, -94, + -31,-122, -81, -31,-124,-120, -31,-123, -94, -31,-122, -82, -31,-124,-120, -31,-123, -94, -31,-122, + -83, -31,-124,-120, -31,-123, -94, -31,-122, -84, -31,-124,-120, -31,-123, -94, -31,-122, -85, -31, +-124,-120, -31,-123, -94, -31,-122, -86, -31,-124,-120, -31,-123, -94, -31,-122, -87, -31,-124,-120, + -31,-123, -94, -31,-122, -88, -31,-124,-120, -31,-123, -95, -31,-121,-126, -31,-124,-120, -31,-123, + -95, -31,-121,-127, -31,-124,-120, -31,-123, -95, -31,-121,-128, -31,-124,-120, -31,-123, -95, -31, +-122, -65, -31,-124,-120, -31,-123, -95, -31,-122, -66, -31,-124,-120, -31,-123, -95, -31,-122, -67, + -31,-124,-120, -31,-123, -95, -31,-122, -68, -31,-124,-120, -31,-123, -95, -31,-122, -69, -31,-124, +-120, -31,-123, -95, -31,-122, -70, -31,-124,-120, -31,-123, -95, -31,-122, -71, -31,-124,-120, -31, +-123, -95, -31,-122, -72, -31,-124,-120, -31,-123, -95, -31,-122, -73, -31,-124,-120, -31,-123, -95, + -31,-122, -74, -31,-124,-120, -31,-123, -95, -31,-122, -75, -31,-124,-120, -31,-123, -95, -31,-122, + -76, -31,-124,-120, -31,-123, -95, -31,-122, -77, -31,-124,-120, -31,-123, -95, -31,-122, -78, -31, +-124,-120, -31,-123, -95, -31,-122, -79, -31,-124,-120, -31,-123, -95, -31,-122, -80, -31,-124,-120, + -31,-123, -95, -31,-122, -81, -31,-124,-120, -31,-123, -95, -31,-122, -82, -31,-124,-120, -31,-123, + -95, -31,-122, -83, -31,-124,-120, -31,-123, -95, -31,-122, -84, -31,-124,-120, -31,-123, -95, -31, +-122, -85, -31,-124,-120, -31,-123, -95, -31,-122, -86, -31,-124,-120, -31,-123, -95, -31,-122, -87, + -31,-124,-120, -31,-123, -95, -31,-122, -88, -31,-124,-121, -31,-123, -75, -31,-121,-126, -31,-124, +-121, -31,-123, -75, -31,-121,-127, -31,-124,-121, -31,-123, -75, -31,-121,-128, -31,-124,-121, -31, +-123, -75, -31,-122, -65, -31,-124,-121, -31,-123, -75, -31,-122, -66, -31,-124,-121, -31,-123, -75, + -31,-122, -67, -31,-124,-121, -31,-123, -75, -31,-122, -68, -31,-124,-121, -31,-123, -75, -31,-122, + -69, -31,-124,-121, -31,-123, -75, -31,-122, -70, -31,-124,-121, -31,-123, -75, -31,-122, -71, -31, +-124,-121, -31,-123, -75, -31,-122, -72, -31,-124,-121, -31,-123, -75, -31,-122, -73, -31,-124,-121, + -31,-123, -75, -31,-122, -74, -31,-124,-121, -31,-123, -75, -31,-122, -75, -31,-124,-121, -31,-123, + -75, -31,-122, -76, -31,-124,-121, -31,-123, -75, -31,-122, -77, -31,-124,-121, -31,-123, -75, -31, +-122, -78, -31,-124,-121, -31,-123, -75, -31,-122, -79, -31,-124,-121, -31,-123, -75, -31,-122, -80, + -31,-124,-121, -31,-123, -75, -31,-122, -81, -31,-124,-121, -31,-123, -75, -31,-122, -82, -31,-124, +-121, -31,-123, -75, -31,-122, -83, -31,-124,-121, -31,-123, -75, -31,-122, -84, -31,-124,-121, -31, +-123, -75, -31,-122, -85, -31,-124,-121, -31,-123, -75, -31,-122, -86, -31,-124,-121, -31,-123, -75, + -31,-122, -87, -31,-124,-121, -31,-123, -75, -31,-122, -88, -31,-124,-121, -31,-123, -76, -31,-121, +-126, -31,-124,-121, -31,-123, -76, -31,-121,-127, -31,-124,-121, -31,-123, -76, -31,-121,-128, -31, +-124,-121, -31,-123, -76, -31,-122, -65, -31,-124,-121, -31,-123, -76, -31,-122, -66, -31,-124,-121, + -31,-123, -76, -31,-122, -67, -31,-124,-121, -31,-123, -76, -31,-122, -68, -31,-124,-121, -31,-123, + -76, -31,-122, -69, -31,-124,-121, -31,-123, -76, -31,-122, -70, -31,-124,-121, -31,-123, -76, -31, +-122, -71, -31,-124,-121, -31,-123, -76, -31,-122, -72, -31,-124,-121, -31,-123, -76, -31,-122, -73, + -31,-124,-121, -31,-123, -76, -31,-122, -74, -31,-124,-121, -31,-123, -76, -31,-122, -75, -31,-124, +-121, -31,-123, -76, -31,-122, -76, -31,-124,-121, -31,-123, -76, -31,-122, -77, -31,-124,-121, -31, +-123, -76, -31,-122, -78, -31,-124,-121, -31,-123, -76, -31,-122, -79, -31,-124,-121, -31,-123, -76, + -31,-122, -80, -31,-124,-121, -31,-123, -76, -31,-122, -81, -31,-124,-121, -31,-123, -76, -31,-122, + -82, -31,-124,-121, -31,-123, -76, -31,-122, -83, -31,-124,-121, -31,-123, -76, -31,-122, -84, -31, +-124,-121, -31,-123, -76, -31,-122, -85, -31,-124,-121, -31,-123, -76, -31,-122, -86, -31,-124,-121, + -31,-123, -76, -31,-122, -87, -31,-124,-121, -31,-123, -76, -31,-122, -88, -31,-124,-121, -31,-123, + -77, -31,-121,-126, -31,-124,-121, -31,-123, -77, -31,-121,-127, -31,-124,-121, -31,-123, -77, -31, +-121,-128, -31,-124,-121, -31,-123, -77, -31,-122, -65, -31,-124,-121, -31,-123, -77, -31,-122, -66, + -31,-124,-121, -31,-123, -77, -31,-122, -67, -31,-124,-121, -31,-123, -77, -31,-122, -68, -31,-124, +-121, -31,-123, -77, -31,-122, -69, -31,-124,-121, -31,-123, -77, -31,-122, -70, -31,-124,-121, -31, +-123, -77, -31,-122, -71, -31,-124,-121, -31,-123, -77, -31,-122, -72, -31,-124,-121, -31,-123, -77, + -31,-122, -73, -31,-124,-121, -31,-123, -77, -31,-122, -74, -31,-124,-121, -31,-123, -77, -31,-122, + -75, -31,-124,-121, -31,-123, -77, -31,-122, -76, -31,-124,-121, -31,-123, -77, -31,-122, -77, -31, +-124,-121, -31,-123, -77, -31,-122, -78, -31,-124,-121, -31,-123, -77, -31,-122, -79, -31,-124,-121, + -31,-123, -77, -31,-122, -80, -31,-124,-121, -31,-123, -77, -31,-122, -81, -31,-124,-121, -31,-123, + -77, -31,-122, -82, -31,-124,-121, -31,-123, -77, -31,-122, -83, -31,-124,-121, -31,-123, -77, -31, +-122, -84, -31,-124,-121, -31,-123, -77, -31,-122, -85, -31,-124,-121, -31,-123, -77, -31,-122, -86, + -31,-124,-121, -31,-123, -77, -31,-122, -87, -31,-124,-121, -31,-123, -77, -31,-122, -88, -31,-124, +-121, -31,-123, -78, -31,-121,-126, -31,-124,-121, -31,-123, -78, -31,-121,-127, -31,-124,-121, -31, +-123, -78, -31,-121,-128, -31,-124,-121, -31,-123, -78, -31,-122, -65, -31,-124,-121, -31,-123, -78, + -31,-122, -66, -31,-124,-121, -31,-123, -78, -31,-122, -67, -31,-124,-121, -31,-123, -78, -31,-122, + -68, -31,-124,-121, -31,-123, -78, -31,-122, -69, -31,-124,-121, -31,-123, -78, -31,-122, -70, -31, +-124,-121, -31,-123, -78, -31,-122, -71, -31,-124,-121, -31,-123, -78, -31,-122, -72, -31,-124,-121, + -31,-123, -78, -31,-122, -73, -31,-124,-121, -31,-123, -78, -31,-122, -74, -31,-124,-121, -31,-123, + -78, -31,-122, -75, -31,-124,-121, -31,-123, -78, -31,-122, -76, -31,-124,-121, -31,-123, -78, -31, +-122, -77, -31,-124,-121, -31,-123, -78, -31,-122, -78, -31,-124,-121, -31,-123, -78, -31,-122, -79, + -31,-124,-121, -31,-123, -78, -31,-122, -80, -31,-124,-121, -31,-123, -78, -31,-122, -81, -31,-124, +-121, -31,-123, -78, -31,-122, -82, -31,-124,-121, -31,-123, -78, -31,-122, -83, -31,-124,-121, -31, +-123, -78, -31,-122, -84, -31,-124,-121, -31,-123, -78, -31,-122, -85, -31,-124,-121, -31,-123, -78, + -31,-122, -86, -31,-124,-121, -31,-123, -78, -31,-122, -87, -31,-124,-121, -31,-123, -78, -31,-122, + -88, -31,-124,-121, -31,-123, -79, -31,-121,-126, -31,-124,-121, -31,-123, -79, -31,-121,-127, -31, +-124,-121, -31,-123, -79, -31,-121,-128, -31,-124,-121, -31,-123, -79, -31,-122, -65, -31,-124,-121, + -31,-123, -79, -31,-122, -66, -31,-124,-121, -31,-123, -79, -31,-122, -67, -31,-124,-121, -31,-123, + -79, -31,-122, -68, -31,-124,-121, -31,-123, -79, -31,-122, -69, -31,-124,-121, -31,-123, -79, -31, +-122, -70, -31,-124,-121, -31,-123, -79, -31,-122, -71, -31,-124,-121, -31,-123, -79, -31,-122, -72, + -31,-124,-121, -31,-123, -79, -31,-122, -73, -31,-124,-121, -31,-123, -79, -31,-122, -74, -31,-124, +-121, -31,-123, -79, -31,-122, -75, -31,-124,-121, -31,-123, -79, -31,-122, -76, -31,-124,-121, -31, +-123, -79, -31,-122, -77, -31,-124,-121, -31,-123, -79, -31,-122, -78, -31,-124,-121, -31,-123, -79, + -31,-122, -79, -31,-124,-121, -31,-123, -79, -31,-122, -80, -31,-124,-121, -31,-123, -79, -31,-122, + -81, -31,-124,-121, -31,-123, -79, -31,-122, -82, -31,-124,-121, -31,-123, -79, -31,-122, -83, -31, +-124,-121, -31,-123, -79, -31,-122, -84, -31,-124,-121, -31,-123, -79, -31,-122, -85, -31,-124,-121, + -31,-123, -79, -31,-122, -86, -31,-124,-121, -31,-123, -79, -31,-122, -87, -31,-124,-121, -31,-123, + -79, -31,-122, -88, -31,-124,-121, -31,-123, -80, -31,-121,-126, -31,-124,-121, -31,-123, -80, -31, +-121,-127, -31,-124,-121, -31,-123, -80, -31,-121,-128, -31,-124,-121, -31,-123, -80, -31,-122, -65, + -31,-124,-121, -31,-123, -80, -31,-122, -66, -31,-124,-121, -31,-123, -80, -31,-122, -67, -31,-124, +-121, -31,-123, -80, -31,-122, -68, -31,-124,-121, -31,-123, -80, -31,-122, -69, -31,-124,-121, -31, +-123, -80, -31,-122, -70, -31,-124,-121, -31,-123, -80, -31,-122, -71, -31,-124,-121, -31,-123, -80, + -31,-122, -72, -31,-124,-121, -31,-123, -80, -31,-122, -73, -31,-124,-121, -31,-123, -80, -31,-122, + -74, -31,-124,-121, -31,-123, -80, -31,-122, -75, -31,-124,-121, -31,-123, -80, -31,-122, -76, -31, +-124,-121, -31,-123, -80, -31,-122, -77, -31,-124,-121, -31,-123, -80, -31,-122, -78, -31,-124,-121, + -31,-123, -80, -31,-122, -79, -31,-124,-121, -31,-123, -80, -31,-122, -80, -31,-124,-121, -31,-123, + -80, -31,-122, -81, -31,-124,-121, -31,-123, -80, -31,-122, -82, -31,-124,-121, -31,-123, -80, -31, +-122, -83, -31,-124,-121, -31,-123, -80, -31,-122, -84, -31,-124,-121, -31,-123, -80, -31,-122, -85, + -31,-124,-121, -31,-123, -80, -31,-122, -86, -31,-124,-121, -31,-123, -80, -31,-122, -87, -31,-124, +-121, -31,-123, -80, -31,-122, -88, -31,-124,-121, -31,-123, -81, -31,-121,-126, -31,-124,-121, -31, +-123, -81, -31,-121,-127, -31,-124,-121, -31,-123, -81, -31,-121,-128, -31,-124,-121, -31,-123, -81, + -31,-122, -65, -31,-124,-121, -31,-123, -81, -31,-122, -66, -31,-124,-121, -31,-123, -81, -31,-122, + -67, -31,-124,-121, -31,-123, -81, -31,-122, -68, -31,-124,-121, -31,-123, -81, -31,-122, -69, -31, +-124,-121, -31,-123, -81, -31,-122, -70, -31,-124,-121, -31,-123, -81, -31,-122, -71, -31,-124,-121, + -31,-123, -81, -31,-122, -72, -31,-124,-121, -31,-123, -81, -31,-122, -73, -31,-124,-121, -31,-123, + -81, -31,-122, -74, -31,-124,-121, -31,-123, -81, -31,-122, -75, -31,-124,-121, -31,-123, -81, -31, +-122, -76, -31,-124,-121, -31,-123, -81, -31,-122, -77, -31,-124,-121, -31,-123, -81, -31,-122, -78, + -31,-124,-121, -31,-123, -81, -31,-122, -79, -31,-124,-121, -31,-123, -81, -31,-122, -80, -31,-124, +-121, -31,-123, -81, -31,-122, -81, -31,-124,-121, -31,-123, -81, -31,-122, -82, -31,-124,-121, -31, +-123, -81, -31,-122, -83, -31,-124,-121, -31,-123, -81, -31,-122, -84, -31,-124,-121, -31,-123, -81, + -31,-122, -85, -31,-124,-121, -31,-123, -81, -31,-122, -86, -31,-124,-121, -31,-123, -81, -31,-122, + -87, -31,-124,-121, -31,-123, -81, -31,-122, -88, -31,-124,-121, -31,-123, -82, -31,-121,-126, -31, +-124,-121, -31,-123, -82, -31,-121,-127, -31,-124,-121, -31,-123, -82, -31,-121,-128, -31,-124,-121, + -31,-123, -82, -31,-122, -65, -31,-124,-121, -31,-123, -82, -31,-122, -66, -31,-124,-121, -31,-123, + -82, -31,-122, -67, -31,-124,-121, -31,-123, -82, -31,-122, -68, -31,-124,-121, -31,-123, -82, -31, +-122, -69, -31,-124,-121, -31,-123, -82, -31,-122, -70, -31,-124,-121, -31,-123, -82, -31,-122, -71, + -31,-124,-121, -31,-123, -82, -31,-122, -72, -31,-124,-121, -31,-123, -82, -31,-122, -73, -31,-124, +-121, -31,-123, -82, -31,-122, -74, -31,-124,-121, -31,-123, -82, -31,-122, -75, -31,-124,-121, -31, +-123, -82, -31,-122, -76, -31,-124,-121, -31,-123, -82, -31,-122, -77, -31,-124,-121, -31,-123, -82, + -31,-122, -78, -31,-124,-121, -31,-123, -82, -31,-122, -79, -31,-124,-121, -31,-123, -82, -31,-122, + -80, -31,-124,-121, -31,-123, -82, -31,-122, -81, -31,-124,-121, -31,-123, -82, -31,-122, -82, -31, +-124,-121, -31,-123, -82, -31,-122, -83, -31,-124,-121, -31,-123, -82, -31,-122, -84, -31,-124,-121, + -31,-123, -82, -31,-122, -85, -31,-124,-121, -31,-123, -82, -31,-122, -86, -31,-124,-121, -31,-123, + -82, -31,-122, -87, -31,-124,-121, -31,-123, -82, -31,-122, -88, -31,-124,-121, -31,-123, -83, -31, +-121,-126, -31,-124,-121, -31,-123, -83, -31,-121,-127, -31,-124,-121, -31,-123, -83, -31,-121,-128, + -31,-124,-121, -31,-123, -83, -31,-122, -65, -31,-124,-121, -31,-123, -83, -31,-122, -66, -31,-124, +-121, -31,-123, -83, -31,-122, -67, -31,-124,-121, -31,-123, -83, -31,-122, -68, -31,-124,-121, -31, +-123, -83, -31,-122, -69, -31,-124,-121, -31,-123, -83, -31,-122, -70, -31,-124,-121, -31,-123, -83, + -31,-122, -71, -31,-124,-121, -31,-123, -83, -31,-122, -72, -31,-124,-121, -31,-123, -83, -31,-122, + -73, -31,-124,-121, -31,-123, -83, -31,-122, -74, -31,-124,-121, -31,-123, -83, -31,-122, -75, -31, +-124,-121, -31,-123, -83, -31,-122, -76, -31,-124,-121, -31,-123, -83, -31,-122, -77, -31,-124,-121, + -31,-123, -83, -31,-122, -78, -31,-124,-121, -31,-123, -83, -31,-122, -79, -31,-124,-121, -31,-123, + -83, -31,-122, -80, -31,-124,-121, -31,-123, -83, -31,-122, -81, -31,-124,-121, -31,-123, -83, -31, +-122, -82, -31,-124,-121, -31,-123, -83, -31,-122, -83, -31,-124,-121, -31,-123, -83, -31,-122, -84, + -31,-124,-121, -31,-123, -83, -31,-122, -85, -31,-124,-121, -31,-123, -83, -31,-122, -86, -31,-124, +-121, -31,-123, -83, -31,-122, -87, -31,-124,-121, -31,-123, -83, -31,-122, -88, -31,-124,-121, -31, +-123, -84, -31,-121,-126, -31,-124,-121, -31,-123, -84, -31,-121,-127, -31,-124,-121, -31,-123, -84, + -31,-121,-128, -31,-124,-121, -31,-123, -84, -31,-122, -65, -31,-124,-121, -31,-123, -84, -31,-122, + -66, -31,-124,-121, -31,-123, -84, -31,-122, -67, -31,-124,-121, -31,-123, -84, -31,-122, -68, -31, +-124,-121, -31,-123, -84, -31,-122, -69, -31,-124,-121, -31,-123, -84, -31,-122, -70, -31,-124,-121, + -31,-123, -84, -31,-122, -71, -31,-124,-121, -31,-123, -84, -31,-122, -72, -31,-124,-121, -31,-123, + -84, -31,-122, -73, -31,-124,-121, -31,-123, -84, -31,-122, -74, -31,-124,-121, -31,-123, -84, -31, +-122, -75, -31,-124,-121, -31,-123, -84, -31,-122, -76, -31,-124,-121, -31,-123, -84, -31,-122, -77, + -31,-124,-121, -31,-123, -84, -31,-122, -78, -31,-124,-121, -31,-123, -84, -31,-122, -79, -31,-124, +-121, -31,-123, -84, -31,-122, -80, -31,-124,-121, -31,-123, -84, -31,-122, -81, -31,-124,-121, -31, +-123, -84, -31,-122, -82, -31,-124,-121, -31,-123, -84, -31,-122, -83, -31,-124,-121, -31,-123, -84, + -31,-122, -84, -31,-124,-121, -31,-123, -84, -31,-122, -85, -31,-124,-121, -31,-123, -84, -31,-122, + -86, -31,-124,-121, -31,-123, -84, -31,-122, -87, -31,-124,-121, -31,-123, -84, -31,-122, -88, -31, +-124,-121, -31,-123, -85, -31,-121,-126, -31,-124,-121, -31,-123, -85, -31,-121,-127, -31,-124,-121, + -31,-123, -85, -31,-121,-128, -31,-124,-121, -31,-123, -85, -31,-122, -65, -31,-124,-121, -31,-123, + -85, -31,-122, -66, -31,-124,-121, -31,-123, -85, -31,-122, -67, -31,-124,-121, -31,-123, -85, -31, +-122, -68, -31,-124,-121, -31,-123, -85, -31,-122, -69, -31,-124,-121, -31,-123, -85, -31,-122, -70, + -31,-124,-121, -31,-123, -85, -31,-122, -71, -31,-124,-121, -31,-123, -85, -31,-122, -72, -31,-124, +-121, -31,-123, -85, -31,-122, -73, -31,-124,-121, -31,-123, -85, -31,-122, -74, -31,-124,-121, -31, +-123, -85, -31,-122, -75, -31,-124,-121, -31,-123, -85, -31,-122, -76, -31,-124,-121, -31,-123, -85, + -31,-122, -77, -31,-124,-121, -31,-123, -85, -31,-122, -78, -31,-124,-121, -31,-123, -85, -31,-122, + -79, -31,-124,-121, -31,-123, -85, -31,-122, -80, -31,-124,-121, -31,-123, -85, -31,-122, -81, -31, +-124,-121, -31,-123, -85, -31,-122, -82, -31,-124,-121, -31,-123, -85, -31,-122, -83, -31,-124,-121, + -31,-123, -85, -31,-122, -84, -31,-124,-121, -31,-123, -85, -31,-122, -85, -31,-124,-121, -31,-123, + -85, -31,-122, -86, -31,-124,-121, -31,-123, -85, -31,-122, -87, -31,-124,-121, -31,-123, -85, -31, +-122, -88, -31,-124,-121, -31,-123, -86, -31,-121,-126, -31,-124,-121, -31,-123, -86, -31,-121,-127, + -31,-124,-121, -31,-123, -86, -31,-121,-128, -31,-124,-121, -31,-123, -86, -31,-122, -65, -31,-124, +-121, -31,-123, -86, -31,-122, -66, -31,-124,-121, -31,-123, -86, -31,-122, -67, -31,-124,-121, -31, +-123, -86, -31,-122, -68, -31,-124,-121, -31,-123, -86, -31,-122, -69, -31,-124,-121, -31,-123, -86, + -31,-122, -70, -31,-124,-121, -31,-123, -86, -31,-122, -71, -31,-124,-121, -31,-123, -86, -31,-122, + -72, -31,-124,-121, -31,-123, -86, -31,-122, -73, -31,-124,-121, -31,-123, -86, -31,-122, -74, -31, +-124,-121, -31,-123, -86, -31,-122, -75, -31,-124,-121, -31,-123, -86, -31,-122, -76, -31,-124,-121, + -31,-123, -86, -31,-122, -77, -31,-124,-121, -31,-123, -86, -31,-122, -78, -31,-124,-121, -31,-123, + -86, -31,-122, -79, -31,-124,-121, -31,-123, -86, -31,-122, -80, -31,-124,-121, -31,-123, -86, -31, +-122, -81, -31,-124,-121, -31,-123, -86, -31,-122, -82, -31,-124,-121, -31,-123, -86, -31,-122, -83, + -31,-124,-121, -31,-123, -86, -31,-122, -84, -31,-124,-121, -31,-123, -86, -31,-122, -85, -31,-124, +-121, -31,-123, -86, -31,-122, -86, -31,-124,-121, -31,-123, -86, -31,-122, -87, -31,-124,-121, -31, +-123, -86, -31,-122, -88, -31,-124,-121, -31,-123, -87, -31,-121,-126, -31,-124,-121, -31,-123, -87, + -31,-121,-127, -31,-124,-121, -31,-123, -87, -31,-121,-128, -31,-124,-121, -31,-123, -87, -31,-122, + -65, -31,-124,-121, -31,-123, -87, -31,-122, -66, -31,-124,-121, -31,-123, -87, -31,-122, -67, -31, +-124,-121, -31,-123, -87, -31,-122, -68, -31,-124,-121, -31,-123, -87, -31,-122, -69, -31,-124,-121, + -31,-123, -87, -31,-122, -70, -31,-124,-121, -31,-123, -87, -31,-122, -71, -31,-124,-121, -31,-123, + -87, -31,-122, -72, -31,-124,-121, -31,-123, -87, -31,-122, -73, -31,-124,-121, -31,-123, -87, -31, +-122, -74, -31,-124,-121, -31,-123, -87, -31,-122, -75, -31,-124,-121, -31,-123, -87, -31,-122, -76, + -31,-124,-121, -31,-123, -87, -31,-122, -77, -31,-124,-121, -31,-123, -87, -31,-122, -78, -31,-124, +-121, -31,-123, -87, -31,-122, -79, -31,-124,-121, -31,-123, -87, -31,-122, -80, -31,-124,-121, -31, +-123, -87, -31,-122, -81, -31,-124,-121, -31,-123, -87, -31,-122, -82, -31,-124,-121, -31,-123, -87, + -31,-122, -83, -31,-124,-121, -31,-123, -87, -31,-122, -84, -31,-124,-121, -31,-123, -87, -31,-122, + -85, -31,-124,-121, -31,-123, -87, -31,-122, -86, -31,-124,-121, -31,-123, -87, -31,-122, -87, -31, +-124,-121, -31,-123, -87, -31,-122, -88, -31,-124,-121, -31,-123, -88, -31,-121,-126, -31,-124,-121, + -31,-123, -88, -31,-121,-127, -31,-124,-121, -31,-123, -88, -31,-121,-128, -31,-124,-121, -31,-123, + -88, -31,-122, -65, -31,-124,-121, -31,-123, -88, -31,-122, -66, -31,-124,-121, -31,-123, -88, -31, +-122, -67, -31,-124,-121, -31,-123, -88, -31,-122, -68, -31,-124,-121, -31,-123, -88, -31,-122, -69, + -31,-124,-121, -31,-123, -88, -31,-122, -70, -31,-124,-121, -31,-123, -88, -31,-122, -71, -31,-124, +-121, -31,-123, -88, -31,-122, -72, -31,-124,-121, -31,-123, -88, -31,-122, -73, -31,-124,-121, -31, +-123, -88, -31,-122, -74, -31,-124,-121, -31,-123, -88, -31,-122, -75, -31,-124,-121, -31,-123, -88, + -31,-122, -76, -31,-124,-121, -31,-123, -88, -31,-122, -77, -31,-124,-121, -31,-123, -88, -31,-122, + -78, -31,-124,-121, -31,-123, -88, -31,-122, -79, -31,-124,-121, -31,-123, -88, -31,-122, -80, -31, +-124,-121, -31,-123, -88, -31,-122, -81, -31,-124,-121, -31,-123, -88, -31,-122, -82, -31,-124,-121, + -31,-123, -88, -31,-122, -83, -31,-124,-121, -31,-123, -88, -31,-122, -84, -31,-124,-121, -31,-123, + -88, -31,-122, -85, -31,-124,-121, -31,-123, -88, -31,-122, -86, -31,-124,-121, -31,-123, -88, -31, +-122, -87, -31,-124,-121, -31,-123, -88, -31,-122, -88, -31,-124,-121, -31,-123, -89, -31,-121,-126, + -31,-124,-121, -31,-123, -89, -31,-121,-127, -31,-124,-121, -31,-123, -89, -31,-121,-128, -31,-124, +-121, -31,-123, -89, -31,-122, -65, -31,-124,-121, -31,-123, -89, -31,-122, -66, -31,-124,-121, -31, +-123, -89, -31,-122, -67, -31,-124,-121, -31,-123, -89, -31,-122, -68, -31,-124,-121, -31,-123, -89, + -31,-122, -69, -31,-124,-121, -31,-123, -89, -31,-122, -70, -31,-124,-121, -31,-123, -89, -31,-122, + -71, -31,-124,-121, -31,-123, -89, -31,-122, -72, -31,-124,-121, -31,-123, -89, -31,-122, -73, -31, +-124,-121, -31,-123, -89, -31,-122, -74, -31,-124,-121, -31,-123, -89, -31,-122, -75, -31,-124,-121, + -31,-123, -89, -31,-122, -76, -31,-124,-121, -31,-123, -89, -31,-122, -77, -31,-124,-121, -31,-123, + -89, -31,-122, -78, -31,-124,-121, -31,-123, -89, -31,-122, -79, -31,-124,-121, -31,-123, -89, -31, +-122, -80, -31,-124,-121, -31,-123, -89, -31,-122, -81, -31,-124,-121, -31,-123, -89, -31,-122, -82, + -31,-124,-121, -31,-123, -89, -31,-122, -83, -31,-124,-121, -31,-123, -89, -31,-122, -84, -31,-124, +-121, -31,-123, -89, -31,-122, -85, -31,-124,-121, -31,-123, -89, -31,-122, -86, -31,-124,-121, -31, +-123, -89, -31,-122, -87, -31,-124,-121, -31,-123, -89, -31,-122, -88, -31,-124,-121, -31,-123, -90, + -31,-121,-126, -31,-124,-121, -31,-123, -90, -31,-121,-127, -31,-124,-121, -31,-123, -90, -31,-121, +-128, -31,-124,-121, -31,-123, -90, -31,-122, -65, -31,-124,-121, -31,-123, -90, -31,-122, -66, -31, +-124,-121, -31,-123, -90, -31,-122, -67, -31,-124,-121, -31,-123, -90, -31,-122, -68, -31,-124,-121, + -31,-123, -90, -31,-122, -69, -31,-124,-121, -31,-123, -90, -31,-122, -70, -31,-124,-121, -31,-123, + -90, -31,-122, -71, -31,-124,-121, -31,-123, -90, -31,-122, -72, -31,-124,-121, -31,-123, -90, -31, +-122, -73, -31,-124,-121, -31,-123, -90, -31,-122, -74, -31,-124,-121, -31,-123, -90, -31,-122, -75, + -31,-124,-121, -31,-123, -90, -31,-122, -76, -31,-124,-121, -31,-123, -90, -31,-122, -77, -31,-124, +-121, -31,-123, -90, -31,-122, -78, -31,-124,-121, -31,-123, -90, -31,-122, -79, -31,-124,-121, -31, +-123, -90, -31,-122, -80, -31,-124,-121, -31,-123, -90, -31,-122, -81, -31,-124,-121, -31,-123, -90, + -31,-122, -82, -31,-124,-121, -31,-123, -90, -31,-122, -83, -31,-124,-121, -31,-123, -90, -31,-122, + -84, -31,-124,-121, -31,-123, -90, -31,-122, -85, -31,-124,-121, -31,-123, -90, -31,-122, -86, -31, +-124,-121, -31,-123, -90, -31,-122, -87, -31,-124,-121, -31,-123, -90, -31,-122, -88, -31,-124,-121, + -31,-123, -91, -31,-121,-126, -31,-124,-121, -31,-123, -91, -31,-121,-127, -31,-124,-121, -31,-123, + -91, -31,-121,-128, -31,-124,-121, -31,-123, -91, -31,-122, -65, -31,-124,-121, -31,-123, -91, -31, +-122, -66, -31,-124,-121, -31,-123, -91, -31,-122, -67, -31,-124,-121, -31,-123, -91, -31,-122, -68, + -31,-124,-121, -31,-123, -91, -31,-122, -69, -31,-124,-121, -31,-123, -91, -31,-122, -70, -31,-124, +-121, -31,-123, -91, -31,-122, -71, -31,-124,-121, -31,-123, -91, -31,-122, -72, -31,-124,-121, -31, +-123, -91, -31,-122, -73, -31,-124,-121, -31,-123, -91, -31,-122, -74, -31,-124,-121, -31,-123, -91, + -31,-122, -75, -31,-124,-121, -31,-123, -91, -31,-122, -76, -31,-124,-121, -31,-123, -91, -31,-122, + -77, -31,-124,-121, -31,-123, -91, -31,-122, -78, -31,-124,-121, -31,-123, -91, -31,-122, -79, -31, +-124,-121, -31,-123, -91, -31,-122, -80, -31,-124,-121, -31,-123, -91, -31,-122, -81, -31,-124,-121, + -31,-123, -91, -31,-122, -82, -31,-124,-121, -31,-123, -91, -31,-122, -83, -31,-124,-121, -31,-123, + -91, -31,-122, -84, -31,-124,-121, -31,-123, -91, -31,-122, -85, -31,-124,-121, -31,-123, -91, -31, +-122, -86, -31,-124,-121, -31,-123, -91, -31,-122, -87, -31,-124,-121, -31,-123, -91, -31,-122, -88, + -31,-124,-121, -31,-123, -92, -31,-121,-126, -31,-124,-121, -31,-123, -92, -31,-121,-127, -31,-124, +-121, -31,-123, -92, -31,-121,-128, -31,-124,-121, -31,-123, -92, -31,-122, -65, -31,-124,-121, -31, +-123, -92, -31,-122, -66, -31,-124,-121, -31,-123, -92, -31,-122, -67, -31,-124,-121, -31,-123, -92, + -31,-122, -68, -31,-124,-121, -31,-123, -92, -31,-122, -69, -31,-124,-121, -31,-123, -92, -31,-122, + -70, -31,-124,-121, -31,-123, -92, -31,-122, -71, -31,-124,-121, -31,-123, -92, -31,-122, -72, -31, +-124,-121, -31,-123, -92, -31,-122, -73, -31,-124,-121, -31,-123, -92, -31,-122, -74, -31,-124,-121, + -31,-123, -92, -31,-122, -75, -31,-124,-121, -31,-123, -92, -31,-122, -76, -31,-124,-121, -31,-123, + -92, -31,-122, -77, -31,-124,-121, -31,-123, -92, -31,-122, -78, -31,-124,-121, -31,-123, -92, -31, +-122, -79, -31,-124,-121, -31,-123, -92, -31,-122, -80, -31,-124,-121, -31,-123, -92, -31,-122, -81, + -31,-124,-121, -31,-123, -92, -31,-122, -82, -31,-124,-121, -31,-123, -92, -31,-122, -83, -31,-124, +-121, -31,-123, -92, -31,-122, -84, -31,-124,-121, -31,-123, -92, -31,-122, -85, -31,-124,-121, -31, +-123, -92, -31,-122, -86, -31,-124,-121, -31,-123, -92, -31,-122, -87, -31,-124,-121, -31,-123, -92, + -31,-122, -88, -31,-124,-121, -31,-123, -93, -31,-121,-126, -31,-124,-121, -31,-123, -93, -31,-121, +-127, -31,-124,-121, -31,-123, -93, -31,-121,-128, -31,-124,-121, -31,-123, -93, -31,-122, -65, -31, +-124,-121, -31,-123, -93, -31,-122, -66, -31,-124,-121, -31,-123, -93, -31,-122, -67, -31,-124,-121, + -31,-123, -93, -31,-122, -68, -31,-124,-121, -31,-123, -93, -31,-122, -69, -31,-124,-121, -31,-123, + -93, -31,-122, -70, -31,-124,-121, -31,-123, -93, -31,-122, -71, -31,-124,-121, -31,-123, -93, -31, +-122, -72, -31,-124,-121, -31,-123, -93, -31,-122, -73, -31,-124,-121, -31,-123, -93, -31,-122, -74, + -31,-124,-121, -31,-123, -93, -31,-122, -75, -31,-124,-121, -31,-123, -93, -31,-122, -76, -31,-124, +-121, -31,-123, -93, -31,-122, -77, -31,-124,-121, -31,-123, -93, -31,-122, -78, -31,-124,-121, -31, +-123, -93, -31,-122, -79, -31,-124,-121, -31,-123, -93, -31,-122, -80, -31,-124,-121, -31,-123, -93, + -31,-122, -81, -31,-124,-121, -31,-123, -93, -31,-122, -82, -31,-124,-121, -31,-123, -93, -31,-122, + -83, -31,-124,-121, -31,-123, -93, -31,-122, -84, -31,-124,-121, -31,-123, -93, -31,-122, -85, -31, +-124,-121, -31,-123, -93, -31,-122, -86, -31,-124,-121, -31,-123, -93, -31,-122, -87, -31,-124,-121, + -31,-123, -93, -31,-122, -88, -31,-124,-121, -31,-123, -94, -31,-121,-126, -31,-124,-121, -31,-123, + -94, -31,-121,-127, -31,-124,-121, -31,-123, -94, -31,-121,-128, -31,-124,-121, -31,-123, -94, -31, +-122, -65, -31,-124,-121, -31,-123, -94, -31,-122, -66, -31,-124,-121, -31,-123, -94, -31,-122, -67, + -31,-124,-121, -31,-123, -94, -31,-122, -68, -31,-124,-121, -31,-123, -94, -31,-122, -69, -31,-124, +-121, -31,-123, -94, -31,-122, -70, -31,-124,-121, -31,-123, -94, -31,-122, -71, -31,-124,-121, -31, +-123, -94, -31,-122, -72, -31,-124,-121, -31,-123, -94, -31,-122, -73, -31,-124,-121, -31,-123, -94, + -31,-122, -74, -31,-124,-121, -31,-123, -94, -31,-122, -75, -31,-124,-121, -31,-123, -94, -31,-122, + -76, -31,-124,-121, -31,-123, -94, -31,-122, -77, -31,-124,-121, -31,-123, -94, -31,-122, -78, -31, +-124,-121, -31,-123, -94, -31,-122, -79, -31,-124,-121, -31,-123, -94, -31,-122, -80, -31,-124,-121, + -31,-123, -94, -31,-122, -81, -31,-124,-121, -31,-123, -94, -31,-122, -82, -31,-124,-121, -31,-123, + -94, -31,-122, -83, -31,-124,-121, -31,-123, -94, -31,-122, -84, -31,-124,-121, -31,-123, -94, -31, +-122, -85, -31,-124,-121, -31,-123, -94, -31,-122, -86, -31,-124,-121, -31,-123, -94, -31,-122, -87, + -31,-124,-121, -31,-123, -94, -31,-122, -88, -31,-124,-121, -31,-123, -95, -31,-121,-126, -31,-124, +-121, -31,-123, -95, -31,-121,-127, -31,-124,-121, -31,-123, -95, -31,-121,-128, -31,-124,-121, -31, +-123, -95, -31,-122, -65, -31,-124,-121, -31,-123, -95, -31,-122, -66, -31,-124,-121, -31,-123, -95, + -31,-122, -67, -31,-124,-121, -31,-123, -95, -31,-122, -68, -31,-124,-121, -31,-123, -95, -31,-122, + -69, -31,-124,-121, -31,-123, -95, -31,-122, -70, -31,-124,-121, -31,-123, -95, -31,-122, -71, -31, +-124,-121, -31,-123, -95, -31,-122, -72, -31,-124,-121, -31,-123, -95, -31,-122, -73, -31,-124,-121, + -31,-123, -95, -31,-122, -74, -31,-124,-121, -31,-123, -95, -31,-122, -75, -31,-124,-121, -31,-123, + -95, -31,-122, -76, -31,-124,-121, -31,-123, -95, -31,-122, -77, -31,-124,-121, -31,-123, -95, -31, +-122, -78, -31,-124,-121, -31,-123, -95, -31,-122, -79, -31,-124,-121, -31,-123, -95, -31,-122, -80, + -31,-124,-121, -31,-123, -95, -31,-122, -81, -31,-124,-121, -31,-123, -95, -31,-122, -82, -31,-124, +-121, -31,-123, -95, -31,-122, -83, -31,-124,-121, -31,-123, -95, -31,-122, -84, -31,-124,-121, -31, +-123, -95, -31,-122, -85, -31,-124,-121, -31,-123, -95, -31,-122, -86, -31,-124,-121, -31,-123, -95, + -31,-122, -87, -31,-124,-121, -31,-123, -95, -31,-122, -88, -31,-124,-122, -31,-123, -75, -31,-121, +-126, -31,-124,-122, -31,-123, -75, -31,-121,-127, -31,-124,-122, -31,-123, -75, -31,-121,-128, -31, +-124,-122, -31,-123, -75, -31,-122, -65, -31,-124,-122, -31,-123, -75, -31,-122, -66, -31,-124,-122, + -31,-123, -75, -31,-122, -67, -31,-124,-122, -31,-123, -75, -31,-122, -68, -31,-124,-122, -31,-123, + -75, -31,-122, -69, -31,-124,-122, -31,-123, -75, -31,-122, -70, -31,-124,-122, -31,-123, -75, -31, +-122, -71, -31,-124,-122, -31,-123, -75, -31,-122, -72, -31,-124,-122, -31,-123, -75, -31,-122, -73, + -31,-124,-122, -31,-123, -75, -31,-122, -74, -31,-124,-122, -31,-123, -75, -31,-122, -75, -31,-124, +-122, -31,-123, -75, -31,-122, -76, -31,-124,-122, -31,-123, -75, -31,-122, -77, -31,-124,-122, -31, +-123, -75, -31,-122, -78, -31,-124,-122, -31,-123, -75, -31,-122, -79, -31,-124,-122, -31,-123, -75, + -31,-122, -80, -31,-124,-122, -31,-123, -75, -31,-122, -81, -31,-124,-122, -31,-123, -75, -31,-122, + -82, -31,-124,-122, -31,-123, -75, -31,-122, -83, -31,-124,-122, -31,-123, -75, -31,-122, -84, -31, +-124,-122, -31,-123, -75, -31,-122, -85, -31,-124,-122, -31,-123, -75, -31,-122, -86, -31,-124,-122, + -31,-123, -75, -31,-122, -87, -31,-124,-122, -31,-123, -75, -31,-122, -88, -31,-124,-122, -31,-123, + -76, -31,-121,-126, -31,-124,-122, -31,-123, -76, -31,-121,-127, -31,-124,-122, -31,-123, -76, -31, +-121,-128, -31,-124,-122, -31,-123, -76, -31,-122, -65, -31,-124,-122, -31,-123, -76, -31,-122, -66, + -31,-124,-122, -31,-123, -76, -31,-122, -67, -31,-124,-122, -31,-123, -76, -31,-122, -68, -31,-124, +-122, -31,-123, -76, -31,-122, -69, -31,-124,-122, -31,-123, -76, -31,-122, -70, -31,-124,-122, -31, +-123, -76, -31,-122, -71, -31,-124,-122, -31,-123, -76, -31,-122, -72, -31,-124,-122, -31,-123, -76, + -31,-122, -73, -31,-124,-122, -31,-123, -76, -31,-122, -74, -31,-124,-122, -31,-123, -76, -31,-122, + -75, -31,-124,-122, -31,-123, -76, -31,-122, -76, -31,-124,-122, -31,-123, -76, -31,-122, -77, -31, +-124,-122, -31,-123, -76, -31,-122, -78, -31,-124,-122, -31,-123, -76, -31,-122, -79, -31,-124,-122, + -31,-123, -76, -31,-122, -80, -31,-124,-122, -31,-123, -76, -31,-122, -81, -31,-124,-122, -31,-123, + -76, -31,-122, -82, -31,-124,-122, -31,-123, -76, -31,-122, -83, -31,-124,-122, -31,-123, -76, -31, +-122, -84, -31,-124,-122, -31,-123, -76, -31,-122, -85, -31,-124,-122, -31,-123, -76, -31,-122, -86, + -31,-124,-122, -31,-123, -76, -31,-122, -87, -31,-124,-122, -31,-123, -76, -31,-122, -88, -31,-124, +-122, -31,-123, -77, -31,-121,-126, -31,-124,-122, -31,-123, -77, -31,-121,-127, -31,-124,-122, -31, +-123, -77, -31,-121,-128, -31,-124,-122, -31,-123, -77, -31,-122, -65, -31,-124,-122, -31,-123, -77, + -31,-122, -66, -31,-124,-122, -31,-123, -77, -31,-122, -67, -31,-124,-122, -31,-123, -77, -31,-122, + -68, -31,-124,-122, -31,-123, -77, -31,-122, -69, -31,-124,-122, -31,-123, -77, -31,-122, -70, -31, +-124,-122, -31,-123, -77, -31,-122, -71, -31,-124,-122, -31,-123, -77, -31,-122, -72, -31,-124,-122, + -31,-123, -77, -31,-122, -73, -31,-124,-122, -31,-123, -77, -31,-122, -74, -31,-124,-122, -31,-123, + -77, -31,-122, -75, -31,-124,-122, -31,-123, -77, -31,-122, -76, -31,-124,-122, -31,-123, -77, -31, +-122, -77, -31,-124,-122, -31,-123, -77, -31,-122, -78, -31,-124,-122, -31,-123, -77, -31,-122, -79, + -31,-124,-122, -31,-123, -77, -31,-122, -80, -31,-124,-122, -31,-123, -77, -31,-122, -81, -31,-124, +-122, -31,-123, -77, -31,-122, -82, -31,-124,-122, -31,-123, -77, -31,-122, -83, -31,-124,-122, -31, +-123, -77, -31,-122, -84, -31,-124,-122, -31,-123, -77, -31,-122, -85, -31,-124,-122, -31,-123, -77, + -31,-122, -86, -31,-124,-122, -31,-123, -77, -31,-122, -87, -31,-124,-122, -31,-123, -77, -31,-122, + -88, -31,-124,-122, -31,-123, -78, -31,-121,-126, -31,-124,-122, -31,-123, -78, -31,-121,-127, -31, +-124,-122, -31,-123, -78, -31,-121,-128, -31,-124,-122, -31,-123, -78, -31,-122, -65, -31,-124,-122, + -31,-123, -78, -31,-122, -66, -31,-124,-122, -31,-123, -78, -31,-122, -67, -31,-124,-122, -31,-123, + -78, -31,-122, -68, -31,-124,-122, -31,-123, -78, -31,-122, -69, -31,-124,-122, -31,-123, -78, -31, +-122, -70, -31,-124,-122, -31,-123, -78, -31,-122, -71, -31,-124,-122, -31,-123, -78, -31,-122, -72, + -31,-124,-122, -31,-123, -78, -31,-122, -73, -31,-124,-122, -31,-123, -78, -31,-122, -74, -31,-124, +-122, -31,-123, -78, -31,-122, -75, -31,-124,-122, -31,-123, -78, -31,-122, -76, -31,-124,-122, -31, +-123, -78, -31,-122, -77, -31,-124,-122, -31,-123, -78, -31,-122, -78, -31,-124,-122, -31,-123, -78, + -31,-122, -79, -31,-124,-122, -31,-123, -78, -31,-122, -80, -31,-124,-122, -31,-123, -78, -31,-122, + -81, -31,-124,-122, -31,-123, -78, -31,-122, -82, -31,-124,-122, -31,-123, -78, -31,-122, -83, -31, +-124,-122, -31,-123, -78, -31,-122, -84, -31,-124,-122, -31,-123, -78, -31,-122, -85, -31,-124,-122, + -31,-123, -78, -31,-122, -86, -31,-124,-122, -31,-123, -78, -31,-122, -87, -31,-124,-122, -31,-123, + -78, -31,-122, -88, -31,-124,-122, -31,-123, -79, -31,-121,-126, -31,-124,-122, -31,-123, -79, -31, +-121,-127, -31,-124,-122, -31,-123, -79, -31,-121,-128, -31,-124,-122, -31,-123, -79, -31,-122, -65, + -31,-124,-122, -31,-123, -79, -31,-122, -66, -31,-124,-122, -31,-123, -79, -31,-122, -67, -31,-124, +-122, -31,-123, -79, -31,-122, -68, -31,-124,-122, -31,-123, -79, -31,-122, -69, -31,-124,-122, -31, +-123, -79, -31,-122, -70, -31,-124,-122, -31,-123, -79, -31,-122, -71, -31,-124,-122, -31,-123, -79, + -31,-122, -72, -31,-124,-122, -31,-123, -79, -31,-122, -73, -31,-124,-122, -31,-123, -79, -31,-122, + -74, -31,-124,-122, -31,-123, -79, -31,-122, -75, -31,-124,-122, -31,-123, -79, -31,-122, -76, -31, +-124,-122, -31,-123, -79, -31,-122, -77, -31,-124,-122, -31,-123, -79, -31,-122, -78, -31,-124,-122, + -31,-123, -79, -31,-122, -79, -31,-124,-122, -31,-123, -79, -31,-122, -80, -31,-124,-122, -31,-123, + -79, -31,-122, -81, -31,-124,-122, -31,-123, -79, -31,-122, -82, -31,-124,-122, -31,-123, -79, -31, +-122, -83, -31,-124,-122, -31,-123, -79, -31,-122, -84, -31,-124,-122, -31,-123, -79, -31,-122, -85, + -31,-124,-122, -31,-123, -79, -31,-122, -86, -31,-124,-122, -31,-123, -79, -31,-122, -87, -31,-124, +-122, -31,-123, -79, -31,-122, -88, -31,-124,-122, -31,-123, -80, -31,-121,-126, -31,-124,-122, -31, +-123, -80, -31,-121,-127, -31,-124,-122, -31,-123, -80, -31,-121,-128, -31,-124,-122, -31,-123, -80, + -31,-122, -65, -31,-124,-122, -31,-123, -80, -31,-122, -66, -31,-124,-122, -31,-123, -80, -31,-122, + -67, -31,-124,-122, -31,-123, -80, -31,-122, -68, -31,-124,-122, -31,-123, -80, -31,-122, -69, -31, +-124,-122, -31,-123, -80, -31,-122, -70, -31,-124,-122, -31,-123, -80, -31,-122, -71, -31,-124,-122, + -31,-123, -80, -31,-122, -72, -31,-124,-122, -31,-123, -80, -31,-122, -73, -31,-124,-122, -31,-123, + -80, -31,-122, -74, -31,-124,-122, -31,-123, -80, -31,-122, -75, -31,-124,-122, -31,-123, -80, -31, +-122, -76, -31,-124,-122, -31,-123, -80, -31,-122, -77, -31,-124,-122, -31,-123, -80, -31,-122, -78, + -31,-124,-122, -31,-123, -80, -31,-122, -79, -31,-124,-122, -31,-123, -80, -31,-122, -80, -31,-124, +-122, -31,-123, -80, -31,-122, -81, -31,-124,-122, -31,-123, -80, -31,-122, -82, -31,-124,-122, -31, +-123, -80, -31,-122, -83, -31,-124,-122, -31,-123, -80, -31,-122, -84, -31,-124,-122, -31,-123, -80, + -31,-122, -85, -31,-124,-122, -31,-123, -80, -31,-122, -86, -31,-124,-122, -31,-123, -80, -31,-122, + -87, -31,-124,-122, -31,-123, -80, -31,-122, -88, -31,-124,-122, -31,-123, -81, -31,-121,-126, -31, +-124,-122, -31,-123, -81, -31,-121,-127, -31,-124,-122, -31,-123, -81, -31,-121,-128, -31,-124,-122, + -31,-123, -81, -31,-122, -65, -31,-124,-122, -31,-123, -81, -31,-122, -66, -31,-124,-122, -31,-123, + -81, -31,-122, -67, -31,-124,-122, -31,-123, -81, -31,-122, -68, -31,-124,-122, -31,-123, -81, -31, +-122, -69, -31,-124,-122, -31,-123, -81, -31,-122, -70, -31,-124,-122, -31,-123, -81, -31,-122, -71, + -31,-124,-122, -31,-123, -81, -31,-122, -72, -31,-124,-122, -31,-123, -81, -31,-122, -73, -31,-124, +-122, -31,-123, -81, -31,-122, -74, -31,-124,-122, -31,-123, -81, -31,-122, -75, -31,-124,-122, -31, +-123, -81, -31,-122, -76, -31,-124,-122, -31,-123, -81, -31,-122, -77, -31,-124,-122, -31,-123, -81, + -31,-122, -78, -31,-124,-122, -31,-123, -81, -31,-122, -79, -31,-124,-122, -31,-123, -81, -31,-122, + -80, -31,-124,-122, -31,-123, -81, -31,-122, -81, -31,-124,-122, -31,-123, -81, -31,-122, -82, -31, +-124,-122, -31,-123, -81, -31,-122, -83, -31,-124,-122, -31,-123, -81, -31,-122, -84, -31,-124,-122, + -31,-123, -81, -31,-122, -85, -31,-124,-122, -31,-123, -81, -31,-122, -86, -31,-124,-122, -31,-123, + -81, -31,-122, -87, -31,-124,-122, -31,-123, -81, -31,-122, -88, -31,-124,-122, -31,-123, -82, -31, +-121,-126, -31,-124,-122, -31,-123, -82, -31,-121,-127, -31,-124,-122, -31,-123, -82, -31,-121,-128, + -31,-124,-122, -31,-123, -82, -31,-122, -65, -31,-124,-122, -31,-123, -82, -31,-122, -66, -31,-124, +-122, -31,-123, -82, -31,-122, -67, -31,-124,-122, -31,-123, -82, -31,-122, -68, -31,-124,-122, -31, +-123, -82, -31,-122, -69, -31,-124,-122, -31,-123, -82, -31,-122, -70, -31,-124,-122, -31,-123, -82, + -31,-122, -71, -31,-124,-122, -31,-123, -82, -31,-122, -72, -31,-124,-122, -31,-123, -82, -31,-122, + -73, -31,-124,-122, -31,-123, -82, -31,-122, -74, -31,-124,-122, -31,-123, -82, -31,-122, -75, -31, +-124,-122, -31,-123, -82, -31,-122, -76, -31,-124,-122, -31,-123, -82, -31,-122, -77, -31,-124,-122, + -31,-123, -82, -31,-122, -78, -31,-124,-122, -31,-123, -82, -31,-122, -79, -31,-124,-122, -31,-123, + -82, -31,-122, -80, -31,-124,-122, -31,-123, -82, -31,-122, -81, -31,-124,-122, -31,-123, -82, -31, +-122, -82, -31,-124,-122, -31,-123, -82, -31,-122, -83, -31,-124,-122, -31,-123, -82, -31,-122, -84, + -31,-124,-122, -31,-123, -82, -31,-122, -85, -31,-124,-122, -31,-123, -82, -31,-122, -86, -31,-124, +-122, -31,-123, -82, -31,-122, -87, -31,-124,-122, -31,-123, -82, -31,-122, -88, -31,-124,-122, -31, +-123, -83, -31,-121,-126, -31,-124,-122, -31,-123, -83, -31,-121,-127, -31,-124,-122, -31,-123, -83, + -31,-121,-128, -31,-124,-122, -31,-123, -83, -31,-122, -65, -31,-124,-122, -31,-123, -83, -31,-122, + -66, -31,-124,-122, -31,-123, -83, -31,-122, -67, -31,-124,-122, -31,-123, -83, -31,-122, -68, -31, +-124,-122, -31,-123, -83, -31,-122, -69, -31,-124,-122, -31,-123, -83, -31,-122, -70, -31,-124,-122, + -31,-123, -83, -31,-122, -71, -31,-124,-122, -31,-123, -83, -31,-122, -72, -31,-124,-122, -31,-123, + -83, -31,-122, -73, -31,-124,-122, -31,-123, -83, -31,-122, -74, -31,-124,-122, -31,-123, -83, -31, +-122, -75, -31,-124,-122, -31,-123, -83, -31,-122, -76, -31,-124,-122, -31,-123, -83, -31,-122, -77, + -31,-124,-122, -31,-123, -83, -31,-122, -78, -31,-124,-122, -31,-123, -83, -31,-122, -79, -31,-124, +-122, -31,-123, -83, -31,-122, -80, -31,-124,-122, -31,-123, -83, -31,-122, -81, -31,-124,-122, -31, +-123, -83, -31,-122, -82, -31,-124,-122, -31,-123, -83, -31,-122, -83, -31,-124,-122, -31,-123, -83, + -31,-122, -84, -31,-124,-122, -31,-123, -83, -31,-122, -85, -31,-124,-122, -31,-123, -83, -31,-122, + -86, -31,-124,-122, -31,-123, -83, -31,-122, -87, -31,-124,-122, -31,-123, -83, -31,-122, -88, -31, +-124,-122, -31,-123, -84, -31,-121,-126, -31,-124,-122, -31,-123, -84, -31,-121,-127, -31,-124,-122, + -31,-123, -84, -31,-121,-128, -31,-124,-122, -31,-123, -84, -31,-122, -65, -31,-124,-122, -31,-123, + -84, -31,-122, -66, -31,-124,-122, -31,-123, -84, -31,-122, -67, -31,-124,-122, -31,-123, -84, -31, +-122, -68, -31,-124,-122, -31,-123, -84, -31,-122, -69, -31,-124,-122, -31,-123, -84, -31,-122, -70, + -31,-124,-122, -31,-123, -84, -31,-122, -71, -31,-124,-122, -31,-123, -84, -31,-122, -72, -31,-124, +-122, -31,-123, -84, -31,-122, -73, -31,-124,-122, -31,-123, -84, -31,-122, -74, -31,-124,-122, -31, +-123, -84, -31,-122, -75, -31,-124,-122, -31,-123, -84, -31,-122, -76, -31,-124,-122, -31,-123, -84, + -31,-122, -77, -31,-124,-122, -31,-123, -84, -31,-122, -78, -31,-124,-122, -31,-123, -84, -31,-122, + -79, -31,-124,-122, -31,-123, -84, -31,-122, -80, -31,-124,-122, -31,-123, -84, -31,-122, -81, -31, +-124,-122, -31,-123, -84, -31,-122, -82, -31,-124,-122, -31,-123, -84, -31,-122, -83, -31,-124,-122, + -31,-123, -84, -31,-122, -84, -31,-124,-122, -31,-123, -84, -31,-122, -85, -31,-124,-122, -31,-123, + -84, -31,-122, -86, -31,-124,-122, -31,-123, -84, -31,-122, -87, -31,-124,-122, -31,-123, -84, -31, +-122, -88, -31,-124,-122, -31,-123, -85, -31,-121,-126, -31,-124,-122, -31,-123, -85, -31,-121,-127, + -31,-124,-122, -31,-123, -85, -31,-121,-128, -31,-124,-122, -31,-123, -85, -31,-122, -65, -31,-124, +-122, -31,-123, -85, -31,-122, -66, -31,-124,-122, -31,-123, -85, -31,-122, -67, -31,-124,-122, -31, +-123, -85, -31,-122, -68, -31,-124,-122, -31,-123, -85, -31,-122, -69, -31,-124,-122, -31,-123, -85, + -31,-122, -70, -31,-124,-122, -31,-123, -85, -31,-122, -71, -31,-124,-122, -31,-123, -85, -31,-122, + -72, -31,-124,-122, -31,-123, -85, -31,-122, -73, -31,-124,-122, -31,-123, -85, -31,-122, -74, -31, +-124,-122, -31,-123, -85, -31,-122, -75, -31,-124,-122, -31,-123, -85, -31,-122, -76, -31,-124,-122, + -31,-123, -85, -31,-122, -77, -31,-124,-122, -31,-123, -85, -31,-122, -78, -31,-124,-122, -31,-123, + -85, -31,-122, -79, -31,-124,-122, -31,-123, -85, -31,-122, -80, -31,-124,-122, -31,-123, -85, -31, +-122, -81, -31,-124,-122, -31,-123, -85, -31,-122, -82, -31,-124,-122, -31,-123, -85, -31,-122, -83, + -31,-124,-122, -31,-123, -85, -31,-122, -84, -31,-124,-122, -31,-123, -85, -31,-122, -85, -31,-124, +-122, -31,-123, -85, -31,-122, -86, -31,-124,-122, -31,-123, -85, -31,-122, -87, -31,-124,-122, -31, +-123, -85, -31,-122, -88, -31,-124,-122, -31,-123, -86, -31,-121,-126, -31,-124,-122, -31,-123, -86, + -31,-121,-127, -31,-124,-122, -31,-123, -86, -31,-121,-128, -31,-124,-122, -31,-123, -86, -31,-122, + -65, -31,-124,-122, -31,-123, -86, -31,-122, -66, -31,-124,-122, -31,-123, -86, -31,-122, -67, -31, +-124,-122, -31,-123, -86, -31,-122, -68, -31,-124,-122, -31,-123, -86, -31,-122, -69, -31,-124,-122, + -31,-123, -86, -31,-122, -70, -31,-124,-122, -31,-123, -86, -31,-122, -71, -31,-124,-122, -31,-123, + -86, -31,-122, -72, -31,-124,-122, -31,-123, -86, -31,-122, -73, -31,-124,-122, -31,-123, -86, -31, +-122, -74, -31,-124,-122, -31,-123, -86, -31,-122, -75, -31,-124,-122, -31,-123, -86, -31,-122, -76, + -31,-124,-122, -31,-123, -86, -31,-122, -77, -31,-124,-122, -31,-123, -86, -31,-122, -78, -31,-124, +-122, -31,-123, -86, -31,-122, -79, -31,-124,-122, -31,-123, -86, -31,-122, -80, -31,-124,-122, -31, +-123, -86, -31,-122, -81, -31,-124,-122, -31,-123, -86, -31,-122, -82, -31,-124,-122, -31,-123, -86, + -31,-122, -83, -31,-124,-122, -31,-123, -86, -31,-122, -84, -31,-124,-122, -31,-123, -86, -31,-122, + -85, -31,-124,-122, -31,-123, -86, -31,-122, -86, -31,-124,-122, -31,-123, -86, -31,-122, -87, -31, +-124,-122, -31,-123, -86, -31,-122, -88, -31,-124,-122, -31,-123, -87, -31,-121,-126, -31,-124,-122, + -31,-123, -87, -31,-121,-127, -31,-124,-122, -31,-123, -87, -31,-121,-128, -31,-124,-122, -31,-123, + -87, -31,-122, -65, -31,-124,-122, -31,-123, -87, -31,-122, -66, -31,-124,-122, -31,-123, -87, -31, +-122, -67, -31,-124,-122, -31,-123, -87, -31,-122, -68, -31,-124,-122, -31,-123, -87, -31,-122, -69, + -31,-124,-122, -31,-123, -87, -31,-122, -70, -31,-124,-122, -31,-123, -87, -31,-122, -71, -31,-124, +-122, -31,-123, -87, -31,-122, -72, -31,-124,-122, -31,-123, -87, -31,-122, -73, -31,-124,-122, -31, +-123, -87, -31,-122, -74, -31,-124,-122, -31,-123, -87, -31,-122, -75, -31,-124,-122, -31,-123, -87, + -31,-122, -76, -31,-124,-122, -31,-123, -87, -31,-122, -77, -31,-124,-122, -31,-123, -87, -31,-122, + -78, -31,-124,-122, -31,-123, -87, -31,-122, -79, -31,-124,-122, -31,-123, -87, -31,-122, -80, -31, +-124,-122, -31,-123, -87, -31,-122, -81, -31,-124,-122, -31,-123, -87, -31,-122, -82, -31,-124,-122, + -31,-123, -87, -31,-122, -83, -31,-124,-122, -31,-123, -87, -31,-122, -84, -31,-124,-122, -31,-123, + -87, -31,-122, -85, -31,-124,-122, -31,-123, -87, -31,-122, -86, -31,-124,-122, -31,-123, -87, -31, +-122, -87, -31,-124,-122, -31,-123, -87, -31,-122, -88, -31,-124,-122, -31,-123, -88, -31,-121,-126, + -31,-124,-122, -31,-123, -88, -31,-121,-127, -31,-124,-122, -31,-123, -88, -31,-121,-128, -31,-124, +-122, -31,-123, -88, -31,-122, -65, -31,-124,-122, -31,-123, -88, -31,-122, -66, -31,-124,-122, -31, +-123, -88, -31,-122, -67, -31,-124,-122, -31,-123, -88, -31,-122, -68, -31,-124,-122, -31,-123, -88, + -31,-122, -69, -31,-124,-122, -31,-123, -88, -31,-122, -70, -31,-124,-122, -31,-123, -88, -31,-122, + -71, -31,-124,-122, -31,-123, -88, -31,-122, -72, -31,-124,-122, -31,-123, -88, -31,-122, -73, -31, +-124,-122, -31,-123, -88, -31,-122, -74, -31,-124,-122, -31,-123, -88, -31,-122, -75, -31,-124,-122, + -31,-123, -88, -31,-122, -76, -31,-124,-122, -31,-123, -88, -31,-122, -77, -31,-124,-122, -31,-123, + -88, -31,-122, -78, -31,-124,-122, -31,-123, -88, -31,-122, -79, -31,-124,-122, -31,-123, -88, -31, +-122, -80, -31,-124,-122, -31,-123, -88, -31,-122, -81, -31,-124,-122, -31,-123, -88, -31,-122, -82, + -31,-124,-122, -31,-123, -88, -31,-122, -83, -31,-124,-122, -31,-123, -88, -31,-122, -84, -31,-124, +-122, -31,-123, -88, -31,-122, -85, -31,-124,-122, -31,-123, -88, -31,-122, -86, -31,-124,-122, -31, +-123, -88, -31,-122, -87, -31,-124,-122, -31,-123, -88, -31,-122, -88, -31,-124,-122, -31,-123, -89, + -31,-121,-126, -31,-124,-122, -31,-123, -89, -31,-121,-127, -31,-124,-122, -31,-123, -89, -31,-121, +-128, -31,-124,-122, -31,-123, -89, -31,-122, -65, -31,-124,-122, -31,-123, -89, -31,-122, -66, -31, +-124,-122, -31,-123, -89, -31,-122, -67, -31,-124,-122, -31,-123, -89, -31,-122, -68, -31,-124,-122, + -31,-123, -89, -31,-122, -69, -31,-124,-122, -31,-123, -89, -31,-122, -70, -31,-124,-122, -31,-123, + -89, -31,-122, -71, -31,-124,-122, -31,-123, -89, -31,-122, -72, -31,-124,-122, -31,-123, -89, -31, +-122, -73, -31,-124,-122, -31,-123, -89, -31,-122, -74, -31,-124,-122, -31,-123, -89, -31,-122, -75, + -31,-124,-122, -31,-123, -89, -31,-122, -76, -31,-124,-122, -31,-123, -89, -31,-122, -77, -31,-124, +-122, -31,-123, -89, -31,-122, -78, -31,-124,-122, -31,-123, -89, -31,-122, -79, -31,-124,-122, -31, +-123, -89, -31,-122, -80, -31,-124,-122, -31,-123, -89, -31,-122, -81, -31,-124,-122, -31,-123, -89, + -31,-122, -82, -31,-124,-122, -31,-123, -89, -31,-122, -83, -31,-124,-122, -31,-123, -89, -31,-122, + -84, -31,-124,-122, -31,-123, -89, -31,-122, -85, -31,-124,-122, -31,-123, -89, -31,-122, -86, -31, +-124,-122, -31,-123, -89, -31,-122, -87, -31,-124,-122, -31,-123, -89, -31,-122, -88, -31,-124,-122, + -31,-123, -90, -31,-121,-126, -31,-124,-122, -31,-123, -90, -31,-121,-127, -31,-124,-122, -31,-123, + -90, -31,-121,-128, -31,-124,-122, -31,-123, -90, -31,-122, -65, -31,-124,-122, -31,-123, -90, -31, +-122, -66, -31,-124,-122, -31,-123, -90, -31,-122, -67, -31,-124,-122, -31,-123, -90, -31,-122, -68, + -31,-124,-122, -31,-123, -90, -31,-122, -69, -31,-124,-122, -31,-123, -90, -31,-122, -70, -31,-124, +-122, -31,-123, -90, -31,-122, -71, -31,-124,-122, -31,-123, -90, -31,-122, -72, -31,-124,-122, -31, +-123, -90, -31,-122, -73, -31,-124,-122, -31,-123, -90, -31,-122, -74, -31,-124,-122, -31,-123, -90, + -31,-122, -75, -31,-124,-122, -31,-123, -90, -31,-122, -76, -31,-124,-122, -31,-123, -90, -31,-122, + -77, -31,-124,-122, -31,-123, -90, -31,-122, -78, -31,-124,-122, -31,-123, -90, -31,-122, -79, -31, +-124,-122, -31,-123, -90, -31,-122, -80, -31,-124,-122, -31,-123, -90, -31,-122, -81, -31,-124,-122, + -31,-123, -90, -31,-122, -82, -31,-124,-122, -31,-123, -90, -31,-122, -83, -31,-124,-122, -31,-123, + -90, -31,-122, -84, -31,-124,-122, -31,-123, -90, -31,-122, -85, -31,-124,-122, -31,-123, -90, -31, +-122, -86, -31,-124,-122, -31,-123, -90, -31,-122, -87, -31,-124,-122, -31,-123, -90, -31,-122, -88, + -31,-124,-122, -31,-123, -91, -31,-121,-126, -31,-124,-122, -31,-123, -91, -31,-121,-127, -31,-124, +-122, -31,-123, -91, -31,-121,-128, -31,-124,-122, -31,-123, -91, -31,-122, -65, -31,-124,-122, -31, +-123, -91, -31,-122, -66, -31,-124,-122, -31,-123, -91, -31,-122, -67, -31,-124,-122, -31,-123, -91, + -31,-122, -68, -31,-124,-122, -31,-123, -91, -31,-122, -69, -31,-124,-122, -31,-123, -91, -31,-122, + -70, -31,-124,-122, -31,-123, -91, -31,-122, -71, -31,-124,-122, -31,-123, -91, -31,-122, -72, -31, +-124,-122, -31,-123, -91, -31,-122, -73, -31,-124,-122, -31,-123, -91, -31,-122, -74, -31,-124,-122, + -31,-123, -91, -31,-122, -75, -31,-124,-122, -31,-123, -91, -31,-122, -76, -31,-124,-122, -31,-123, + -91, -31,-122, -77, -31,-124,-122, -31,-123, -91, -31,-122, -78, -31,-124,-122, -31,-123, -91, -31, +-122, -79, -31,-124,-122, -31,-123, -91, -31,-122, -80, -31,-124,-122, -31,-123, -91, -31,-122, -81, + -31,-124,-122, -31,-123, -91, -31,-122, -82, -31,-124,-122, -31,-123, -91, -31,-122, -83, -31,-124, +-122, -31,-123, -91, -31,-122, -84, -31,-124,-122, -31,-123, -91, -31,-122, -85, -31,-124,-122, -31, +-123, -91, -31,-122, -86, -31,-124,-122, -31,-123, -91, -31,-122, -87, -31,-124,-122, -31,-123, -91, + -31,-122, -88, -31,-124,-122, -31,-123, -92, -31,-121,-126, -31,-124,-122, -31,-123, -92, -31,-121, +-127, -31,-124,-122, -31,-123, -92, -31,-121,-128, -31,-124,-122, -31,-123, -92, -31,-122, -65, -31, +-124,-122, -31,-123, -92, -31,-122, -66, -31,-124,-122, -31,-123, -92, -31,-122, -67, -31,-124,-122, + -31,-123, -92, -31,-122, -68, -31,-124,-122, -31,-123, -92, -31,-122, -69, -31,-124,-122, -31,-123, + -92, -31,-122, -70, -31,-124,-122, -31,-123, -92, -31,-122, -71, -31,-124,-122, -31,-123, -92, -31, +-122, -72, -31,-124,-122, -31,-123, -92, -31,-122, -73, -31,-124,-122, -31,-123, -92, -31,-122, -74, + -31,-124,-122, -31,-123, -92, -31,-122, -75, -31,-124,-122, -31,-123, -92, -31,-122, -76, -31,-124, +-122, -31,-123, -92, -31,-122, -77, -31,-124,-122, -31,-123, -92, -31,-122, -78, -31,-124,-122, -31, +-123, -92, -31,-122, -79, -31,-124,-122, -31,-123, -92, -31,-122, -80, -31,-124,-122, -31,-123, -92, + -31,-122, -81, -31,-124,-122, -31,-123, -92, -31,-122, -82, -31,-124,-122, -31,-123, -92, -31,-122, + -83, -31,-124,-122, -31,-123, -92, -31,-122, -84, -31,-124,-122, -31,-123, -92, -31,-122, -85, -31, +-124,-122, -31,-123, -92, -31,-122, -86, -31,-124,-122, -31,-123, -92, -31,-122, -87, -31,-124,-122, + -31,-123, -92, -31,-122, -88, -31,-124,-122, -31,-123, -93, -31,-121,-126, -31,-124,-122, -31,-123, + -93, -31,-121,-127, -31,-124,-122, -31,-123, -93, -31,-121,-128, -31,-124,-122, -31,-123, -93, -31, +-122, -65, -31,-124,-122, -31,-123, -93, -31,-122, -66, -31,-124,-122, -31,-123, -93, -31,-122, -67, + -31,-124,-122, -31,-123, -93, -31,-122, -68, -31,-124,-122, -31,-123, -93, -31,-122, -69, -31,-124, +-122, -31,-123, -93, -31,-122, -70, -31,-124,-122, -31,-123, -93, -31,-122, -71, -31,-124,-122, -31, +-123, -93, -31,-122, -72, -31,-124,-122, -31,-123, -93, -31,-122, -73, -31,-124,-122, -31,-123, -93, + -31,-122, -74, -31,-124,-122, -31,-123, -93, -31,-122, -75, -31,-124,-122, -31,-123, -93, -31,-122, + -76, -31,-124,-122, -31,-123, -93, -31,-122, -77, -31,-124,-122, -31,-123, -93, -31,-122, -78, -31, +-124,-122, -31,-123, -93, -31,-122, -79, -31,-124,-122, -31,-123, -93, -31,-122, -80, -31,-124,-122, + -31,-123, -93, -31,-122, -81, -31,-124,-122, -31,-123, -93, -31,-122, -82, -31,-124,-122, -31,-123, + -93, -31,-122, -83, -31,-124,-122, -31,-123, -93, -31,-122, -84, -31,-124,-122, -31,-123, -93, -31, +-122, -85, -31,-124,-122, -31,-123, -93, -31,-122, -86, -31,-124,-122, -31,-123, -93, -31,-122, -87, + -31,-124,-122, -31,-123, -93, -31,-122, -88, -31,-124,-122, -31,-123, -94, -31,-121,-126, -31,-124, +-122, -31,-123, -94, -31,-121,-127, -31,-124,-122, -31,-123, -94, -31,-121,-128, -31,-124,-122, -31, +-123, -94, -31,-122, -65, -31,-124,-122, -31,-123, -94, -31,-122, -66, -31,-124,-122, -31,-123, -94, + -31,-122, -67, -31,-124,-122, -31,-123, -94, -31,-122, -68, -31,-124,-122, -31,-123, -94, -31,-122, + -69, -31,-124,-122, -31,-123, -94, -31,-122, -70, -31,-124,-122, -31,-123, -94, -31,-122, -71, -31, +-124,-122, -31,-123, -94, -31,-122, -72, -31,-124,-122, -31,-123, -94, -31,-122, -73, -31,-124,-122, + -31,-123, -94, -31,-122, -74, -31,-124,-122, -31,-123, -94, -31,-122, -75, -31,-124,-122, -31,-123, + -94, -31,-122, -76, -31,-124,-122, -31,-123, -94, -31,-122, -77, -31,-124,-122, -31,-123, -94, -31, +-122, -78, -31,-124,-122, -31,-123, -94, -31,-122, -79, -31,-124,-122, -31,-123, -94, -31,-122, -80, + -31,-124,-122, -31,-123, -94, -31,-122, -81, -31,-124,-122, -31,-123, -94, -31,-122, -82, -31,-124, +-122, -31,-123, -94, -31,-122, -83, -31,-124,-122, -31,-123, -94, -31,-122, -84, -31,-124,-122, -31, +-123, -94, -31,-122, -85, -31,-124,-122, -31,-123, -94, -31,-122, -86, -31,-124,-122, -31,-123, -94, + -31,-122, -87, -31,-124,-122, -31,-123, -94, -31,-122, -88, -31,-124,-122, -31,-123, -95, -31,-121, +-126, -31,-124,-122, -31,-123, -95, -31,-121,-127, -31,-124,-122, -31,-123, -95, -31,-121,-128, -31, +-124,-122, -31,-123, -95, -31,-122, -65, -31,-124,-122, -31,-123, -95, -31,-122, -66, -31,-124,-122, + -31,-123, -95, -31,-122, -67, -31,-124,-122, -31,-123, -95, -31,-122, -68, -31,-124,-122, -31,-123, + -95, -31,-122, -69, -31,-124,-122, -31,-123, -95, -31,-122, -70, -31,-124,-122, -31,-123, -95, -31, +-122, -71, -31,-124,-122, -31,-123, -95, -31,-122, -72, -31,-124,-122, -31,-123, -95, -31,-122, -73, + -31,-124,-122, -31,-123, -95, -31,-122, -74, -31,-124,-122, -31,-123, -95, -31,-122, -75, -31,-124, +-122, -31,-123, -95, -31,-122, -76, -31,-124,-122, -31,-123, -95, -31,-122, -77, -31,-124,-122, -31, +-123, -95, -31,-122, -78, -31,-124,-122, -31,-123, -95, -31,-122, -79, -31,-124,-122, -31,-123, -95, + -31,-122, -80, -31,-124,-122, -31,-123, -95, -31,-122, -81, -31,-124,-122, -31,-123, -95, -31,-122, + -82, -31,-124,-122, -31,-123, -95, -31,-122, -83, -31,-124,-122, -31,-123, -95, -31,-122, -84, -31, +-124,-122, -31,-123, -95, -31,-122, -85, -31,-124,-122, -31,-123, -95, -31,-122, -86, -31,-124,-122, + -31,-123, -95, -31,-122, -87, -31,-124,-122, -31,-123, -95, -31,-122, -88, -31,-124,-123, -31,-123, + -75, -31,-121,-126, -31,-124,-123, -31,-123, -75, -31,-121,-127, -31,-124,-123, -31,-123, -75, -31, +-121,-128, -31,-124,-123, -31,-123, -75, -31,-122, -65, -31,-124,-123, -31,-123, -75, -31,-122, -66, + -31,-124,-123, -31,-123, -75, -31,-122, -67, -31,-124,-123, -31,-123, -75, -31,-122, -68, -31,-124, +-123, -31,-123, -75, -31,-122, -69, -31,-124,-123, -31,-123, -75, -31,-122, -70, -31,-124,-123, -31, +-123, -75, -31,-122, -71, -31,-124,-123, -31,-123, -75, -31,-122, -72, -31,-124,-123, -31,-123, -75, + -31,-122, -73, -31,-124,-123, -31,-123, -75, -31,-122, -74, -31,-124,-123, -31,-123, -75, -31,-122, + -75, -31,-124,-123, -31,-123, -75, -31,-122, -76, -31,-124,-123, -31,-123, -75, -31,-122, -77, -31, +-124,-123, -31,-123, -75, -31,-122, -78, -31,-124,-123, -31,-123, -75, -31,-122, -79, -31,-124,-123, + -31,-123, -75, -31,-122, -80, -31,-124,-123, -31,-123, -75, -31,-122, -81, -31,-124,-123, -31,-123, + -75, -31,-122, -82, -31,-124,-123, -31,-123, -75, -31,-122, -83, -31,-124,-123, -31,-123, -75, -31, +-122, -84, -31,-124,-123, -31,-123, -75, -31,-122, -85, -31,-124,-123, -31,-123, -75, -31,-122, -86, + -31,-124,-123, -31,-123, -75, -31,-122, -87, -31,-124,-123, -31,-123, -75, -31,-122, -88, -31,-124, +-123, -31,-123, -76, -31,-121,-126, -31,-124,-123, -31,-123, -76, -31,-121,-127, -31,-124,-123, -31, +-123, -76, -31,-121,-128, -31,-124,-123, -31,-123, -76, -31,-122, -65, -31,-124,-123, -31,-123, -76, + -31,-122, -66, -31,-124,-123, -31,-123, -76, -31,-122, -67, -31,-124,-123, -31,-123, -76, -31,-122, + -68, -31,-124,-123, -31,-123, -76, -31,-122, -69, -31,-124,-123, -31,-123, -76, -31,-122, -70, -31, +-124,-123, -31,-123, -76, -31,-122, -71, -31,-124,-123, -31,-123, -76, -31,-122, -72, -31,-124,-123, + -31,-123, -76, -31,-122, -73, -31,-124,-123, -31,-123, -76, -31,-122, -74, -31,-124,-123, -31,-123, + -76, -31,-122, -75, -31,-124,-123, -31,-123, -76, -31,-122, -76, -31,-124,-123, -31,-123, -76, -31, +-122, -77, -31,-124,-123, -31,-123, -76, -31,-122, -78, -31,-124,-123, -31,-123, -76, -31,-122, -79, + -31,-124,-123, -31,-123, -76, -31,-122, -80, -31,-124,-123, -31,-123, -76, -31,-122, -81, -31,-124, +-123, -31,-123, -76, -31,-122, -82, -31,-124,-123, -31,-123, -76, -31,-122, -83, -31,-124,-123, -31, +-123, -76, -31,-122, -84, -31,-124,-123, -31,-123, -76, -31,-122, -85, -31,-124,-123, -31,-123, -76, + -31,-122, -86, -31,-124,-123, -31,-123, -76, -31,-122, -87, -31,-124,-123, -31,-123, -76, -31,-122, + -88, -31,-124,-123, -31,-123, -77, -31,-121,-126, -31,-124,-123, -31,-123, -77, -31,-121,-127, -31, +-124,-123, -31,-123, -77, -31,-121,-128, -31,-124,-123, -31,-123, -77, -31,-122, -65, -31,-124,-123, + -31,-123, -77, -31,-122, -66, -31,-124,-123, -31,-123, -77, -31,-122, -67, -31,-124,-123, -31,-123, + -77, -31,-122, -68, -31,-124,-123, -31,-123, -77, -31,-122, -69, -31,-124,-123, -31,-123, -77, -31, +-122, -70, -31,-124,-123, -31,-123, -77, -31,-122, -71, -31,-124,-123, -31,-123, -77, -31,-122, -72, + -31,-124,-123, -31,-123, -77, -31,-122, -73, -31,-124,-123, -31,-123, -77, -31,-122, -74, -31,-124, +-123, -31,-123, -77, -31,-122, -75, -31,-124,-123, -31,-123, -77, -31,-122, -76, -31,-124,-123, -31, +-123, -77, -31,-122, -77, -31,-124,-123, -31,-123, -77, -31,-122, -78, -31,-124,-123, -31,-123, -77, + -31,-122, -79, -31,-124,-123, -31,-123, -77, -31,-122, -80, -31,-124,-123, -31,-123, -77, -31,-122, + -81, -31,-124,-123, -31,-123, -77, -31,-122, -82, -31,-124,-123, -31,-123, -77, -31,-122, -83, -31, +-124,-123, -31,-123, -77, -31,-122, -84, -31,-124,-123, -31,-123, -77, -31,-122, -85, -31,-124,-123, + -31,-123, -77, -31,-122, -86, -31,-124,-123, -31,-123, -77, -31,-122, -87, -31,-124,-123, -31,-123, + -77, -31,-122, -88, -31,-124,-123, -31,-123, -78, -31,-121,-126, -31,-124,-123, -31,-123, -78, -31, +-121,-127, -31,-124,-123, -31,-123, -78, -31,-121,-128, -31,-124,-123, -31,-123, -78, -31,-122, -65, + -31,-124,-123, -31,-123, -78, -31,-122, -66, -31,-124,-123, -31,-123, -78, -31,-122, -67, -31,-124, +-123, -31,-123, -78, -31,-122, -68, -31,-124,-123, -31,-123, -78, -31,-122, -69, -31,-124,-123, -31, +-123, -78, -31,-122, -70, -31,-124,-123, -31,-123, -78, -31,-122, -71, -31,-124,-123, -31,-123, -78, + -31,-122, -72, -31,-124,-123, -31,-123, -78, -31,-122, -73, -31,-124,-123, -31,-123, -78, -31,-122, + -74, -31,-124,-123, -31,-123, -78, -31,-122, -75, -31,-124,-123, -31,-123, -78, -31,-122, -76, -31, +-124,-123, -31,-123, -78, -31,-122, -77, -31,-124,-123, -31,-123, -78, -31,-122, -78, -31,-124,-123, + -31,-123, -78, -31,-122, -79, -31,-124,-123, -31,-123, -78, -31,-122, -80, -31,-124,-123, -31,-123, + -78, -31,-122, -81, -31,-124,-123, -31,-123, -78, -31,-122, -82, -31,-124,-123, -31,-123, -78, -31, +-122, -83, -31,-124,-123, -31,-123, -78, -31,-122, -84, -31,-124,-123, -31,-123, -78, -31,-122, -85, + -31,-124,-123, -31,-123, -78, -31,-122, -86, -31,-124,-123, -31,-123, -78, -31,-122, -87, -31,-124, +-123, -31,-123, -78, -31,-122, -88, -31,-124,-123, -31,-123, -79, -31,-121,-126, -31,-124,-123, -31, +-123, -79, -31,-121,-127, -31,-124,-123, -31,-123, -79, -31,-121,-128, -31,-124,-123, -31,-123, -79, + -31,-122, -65, -31,-124,-123, -31,-123, -79, -31,-122, -66, -31,-124,-123, -31,-123, -79, -31,-122, + -67, -31,-124,-123, -31,-123, -79, -31,-122, -68, -31,-124,-123, -31,-123, -79, -31,-122, -69, -31, +-124,-123, -31,-123, -79, -31,-122, -70, -31,-124,-123, -31,-123, -79, -31,-122, -71, -31,-124,-123, + -31,-123, -79, -31,-122, -72, -31,-124,-123, -31,-123, -79, -31,-122, -73, -31,-124,-123, -31,-123, + -79, -31,-122, -74, -31,-124,-123, -31,-123, -79, -31,-122, -75, -31,-124,-123, -31,-123, -79, -31, +-122, -76, -31,-124,-123, -31,-123, -79, -31,-122, -77, -31,-124,-123, -31,-123, -79, -31,-122, -78, + -31,-124,-123, -31,-123, -79, -31,-122, -79, -31,-124,-123, -31,-123, -79, -31,-122, -80, -31,-124, +-123, -31,-123, -79, -31,-122, -81, -31,-124,-123, -31,-123, -79, -31,-122, -82, -31,-124,-123, -31, +-123, -79, -31,-122, -83, -31,-124,-123, -31,-123, -79, -31,-122, -84, -31,-124,-123, -31,-123, -79, + -31,-122, -85, -31,-124,-123, -31,-123, -79, -31,-122, -86, -31,-124,-123, -31,-123, -79, -31,-122, + -87, -31,-124,-123, -31,-123, -79, -31,-122, -88, -31,-124,-123, -31,-123, -80, -31,-121,-126, -31, +-124,-123, -31,-123, -80, -31,-121,-127, -31,-124,-123, -31,-123, -80, -31,-121,-128, -31,-124,-123, + -31,-123, -80, -31,-122, -65, -31,-124,-123, -31,-123, -80, -31,-122, -66, -31,-124,-123, -31,-123, + -80, -31,-122, -67, -31,-124,-123, -31,-123, -80, -31,-122, -68, -31,-124,-123, -31,-123, -80, -31, +-122, -69, -31,-124,-123, -31,-123, -80, -31,-122, -70, -31,-124,-123, -31,-123, -80, -31,-122, -71, + -31,-124,-123, -31,-123, -80, -31,-122, -72, -31,-124,-123, -31,-123, -80, -31,-122, -73, -31,-124, +-123, -31,-123, -80, -31,-122, -74, -31,-124,-123, -31,-123, -80, -31,-122, -75, -31,-124,-123, -31, +-123, -80, -31,-122, -76, -31,-124,-123, -31,-123, -80, -31,-122, -77, -31,-124,-123, -31,-123, -80, + -31,-122, -78, -31,-124,-123, -31,-123, -80, -31,-122, -79, -31,-124,-123, -31,-123, -80, -31,-122, + -80, -31,-124,-123, -31,-123, -80, -31,-122, -81, -31,-124,-123, -31,-123, -80, -31,-122, -82, -31, +-124,-123, -31,-123, -80, -31,-122, -83, -31,-124,-123, -31,-123, -80, -31,-122, -84, -31,-124,-123, + -31,-123, -80, -31,-122, -85, -31,-124,-123, -31,-123, -80, -31,-122, -86, -31,-124,-123, -31,-123, + -80, -31,-122, -87, -31,-124,-123, -31,-123, -80, -31,-122, -88, -31,-124,-123, -31,-123, -81, -31, +-121,-126, -31,-124,-123, -31,-123, -81, -31,-121,-127, -31,-124,-123, -31,-123, -81, -31,-121,-128, + -31,-124,-123, -31,-123, -81, -31,-122, -65, -31,-124,-123, -31,-123, -81, -31,-122, -66, -31,-124, +-123, -31,-123, -81, -31,-122, -67, -31,-124,-123, -31,-123, -81, -31,-122, -68, -31,-124,-123, -31, +-123, -81, -31,-122, -69, -31,-124,-123, -31,-123, -81, -31,-122, -70, -31,-124,-123, -31,-123, -81, + -31,-122, -71, -31,-124,-123, -31,-123, -81, -31,-122, -72, -31,-124,-123, -31,-123, -81, -31,-122, + -73, -31,-124,-123, -31,-123, -81, -31,-122, -74, -31,-124,-123, -31,-123, -81, -31,-122, -75, -31, +-124,-123, -31,-123, -81, -31,-122, -76, -31,-124,-123, -31,-123, -81, -31,-122, -77, -31,-124,-123, + -31,-123, -81, -31,-122, -78, -31,-124,-123, -31,-123, -81, -31,-122, -79, -31,-124,-123, -31,-123, + -81, -31,-122, -80, -31,-124,-123, -31,-123, -81, -31,-122, -81, -31,-124,-123, -31,-123, -81, -31, +-122, -82, -31,-124,-123, -31,-123, -81, -31,-122, -83, -31,-124,-123, -31,-123, -81, -31,-122, -84, + -31,-124,-123, -31,-123, -81, -31,-122, -85, -31,-124,-123, -31,-123, -81, -31,-122, -86, -31,-124, +-123, -31,-123, -81, -31,-122, -87, -31,-124,-123, -31,-123, -81, -31,-122, -88, -31,-124,-123, -31, +-123, -82, -31,-121,-126, -31,-124,-123, -31,-123, -82, -31,-121,-127, -31,-124,-123, -31,-123, -82, + -31,-121,-128, -31,-124,-123, -31,-123, -82, -31,-122, -65, -31,-124,-123, -31,-123, -82, -31,-122, + -66, -31,-124,-123, -31,-123, -82, -31,-122, -67, -31,-124,-123, -31,-123, -82, -31,-122, -68, -31, +-124,-123, -31,-123, -82, -31,-122, -69, -31,-124,-123, -31,-123, -82, -31,-122, -70, -31,-124,-123, + -31,-123, -82, -31,-122, -71, -31,-124,-123, -31,-123, -82, -31,-122, -72, -31,-124,-123, -31,-123, + -82, -31,-122, -73, -31,-124,-123, -31,-123, -82, -31,-122, -74, -31,-124,-123, -31,-123, -82, -31, +-122, -75, -31,-124,-123, -31,-123, -82, -31,-122, -76, -31,-124,-123, -31,-123, -82, -31,-122, -77, + -31,-124,-123, -31,-123, -82, -31,-122, -78, -31,-124,-123, -31,-123, -82, -31,-122, -79, -31,-124, +-123, -31,-123, -82, -31,-122, -80, -31,-124,-123, -31,-123, -82, -31,-122, -81, -31,-124,-123, -31, +-123, -82, -31,-122, -82, -31,-124,-123, -31,-123, -82, -31,-122, -83, -31,-124,-123, -31,-123, -82, + -31,-122, -84, -31,-124,-123, -31,-123, -82, -31,-122, -85, -31,-124,-123, -31,-123, -82, -31,-122, + -86, -31,-124,-123, -31,-123, -82, -31,-122, -87, -31,-124,-123, -31,-123, -82, -31,-122, -88, -31, +-124,-123, -31,-123, -83, -31,-121,-126, -31,-124,-123, -31,-123, -83, -31,-121,-127, -31,-124,-123, + -31,-123, -83, -31,-121,-128, -31,-124,-123, -31,-123, -83, -31,-122, -65, -31,-124,-123, -31,-123, + -83, -31,-122, -66, -31,-124,-123, -31,-123, -83, -31,-122, -67, -31,-124,-123, -31,-123, -83, -31, +-122, -68, -31,-124,-123, -31,-123, -83, -31,-122, -69, -31,-124,-123, -31,-123, -83, -31,-122, -70, + -31,-124,-123, -31,-123, -83, -31,-122, -71, -31,-124,-123, -31,-123, -83, -31,-122, -72, -31,-124, +-123, -31,-123, -83, -31,-122, -73, -31,-124,-123, -31,-123, -83, -31,-122, -74, -31,-124,-123, -31, +-123, -83, -31,-122, -75, -31,-124,-123, -31,-123, -83, -31,-122, -76, -31,-124,-123, -31,-123, -83, + -31,-122, -77, -31,-124,-123, -31,-123, -83, -31,-122, -78, -31,-124,-123, -31,-123, -83, -31,-122, + -79, -31,-124,-123, -31,-123, -83, -31,-122, -80, -31,-124,-123, -31,-123, -83, -31,-122, -81, -31, +-124,-123, -31,-123, -83, -31,-122, -82, -31,-124,-123, -31,-123, -83, -31,-122, -83, -31,-124,-123, + -31,-123, -83, -31,-122, -84, -31,-124,-123, -31,-123, -83, -31,-122, -85, -31,-124,-123, -31,-123, + -83, -31,-122, -86, -31,-124,-123, -31,-123, -83, -31,-122, -87, -31,-124,-123, -31,-123, -83, -31, +-122, -88, -31,-124,-123, -31,-123, -84, -31,-121,-126, -31,-124,-123, -31,-123, -84, -31,-121,-127, + -31,-124,-123, -31,-123, -84, -31,-121,-128, -31,-124,-123, -31,-123, -84, -31,-122, -65, -31,-124, +-123, -31,-123, -84, -31,-122, -66, -31,-124,-123, -31,-123, -84, -31,-122, -67, -31,-124,-123, -31, +-123, -84, -31,-122, -68, -31,-124,-123, -31,-123, -84, -31,-122, -69, -31,-124,-123, -31,-123, -84, + -31,-122, -70, -31,-124,-123, -31,-123, -84, -31,-122, -71, -31,-124,-123, -31,-123, -84, -31,-122, + -72, -31,-124,-123, -31,-123, -84, -31,-122, -73, -31,-124,-123, -31,-123, -84, -31,-122, -74, -31, +-124,-123, -31,-123, -84, -31,-122, -75, -31,-124,-123, -31,-123, -84, -31,-122, -76, -31,-124,-123, + -31,-123, -84, -31,-122, -77, -31,-124,-123, -31,-123, -84, -31,-122, -78, -31,-124,-123, -31,-123, + -84, -31,-122, -79, -31,-124,-123, -31,-123, -84, -31,-122, -80, -31,-124,-123, -31,-123, -84, -31, +-122, -81, -31,-124,-123, -31,-123, -84, -31,-122, -82, -31,-124,-123, -31,-123, -84, -31,-122, -83, + -31,-124,-123, -31,-123, -84, -31,-122, -84, -31,-124,-123, -31,-123, -84, -31,-122, -85, -31,-124, +-123, -31,-123, -84, -31,-122, -86, -31,-124,-123, -31,-123, -84, -31,-122, -87, -31,-124,-123, -31, +-123, -84, -31,-122, -88, -31,-124,-123, -31,-123, -85, -31,-121,-126, -31,-124,-123, -31,-123, -85, + -31,-121,-127, -31,-124,-123, -31,-123, -85, -31,-121,-128, -31,-124,-123, -31,-123, -85, -31,-122, + -65, -31,-124,-123, -31,-123, -85, -31,-122, -66, -31,-124,-123, -31,-123, -85, -31,-122, -67, -31, +-124,-123, -31,-123, -85, -31,-122, -68, -31,-124,-123, -31,-123, -85, -31,-122, -69, -31,-124,-123, + -31,-123, -85, -31,-122, -70, -31,-124,-123, -31,-123, -85, -31,-122, -71, -31,-124,-123, -31,-123, + -85, -31,-122, -72, -31,-124,-123, -31,-123, -85, -31,-122, -73, -31,-124,-123, -31,-123, -85, -31, +-122, -74, -31,-124,-123, -31,-123, -85, -31,-122, -75, -31,-124,-123, -31,-123, -85, -31,-122, -76, + -31,-124,-123, -31,-123, -85, -31,-122, -77, -31,-124,-123, -31,-123, -85, -31,-122, -78, -31,-124, +-123, -31,-123, -85, -31,-122, -79, -31,-124,-123, -31,-123, -85, -31,-122, -80, -31,-124,-123, -31, +-123, -85, -31,-122, -81, -31,-124,-123, -31,-123, -85, -31,-122, -82, -31,-124,-123, -31,-123, -85, + -31,-122, -83, -31,-124,-123, -31,-123, -85, -31,-122, -84, -31,-124,-123, -31,-123, -85, -31,-122, + -85, -31,-124,-123, -31,-123, -85, -31,-122, -86, -31,-124,-123, -31,-123, -85, -31,-122, -87, -31, +-124,-123, -31,-123, -85, -31,-122, -88, -31,-124,-123, -31,-123, -86, -31,-121,-126, -31,-124,-123, + -31,-123, -86, -31,-121,-127, -31,-124,-123, -31,-123, -86, -31,-121,-128, -31,-124,-123, -31,-123, + -86, -31,-122, -65, -31,-124,-123, -31,-123, -86, -31,-122, -66, -31,-124,-123, -31,-123, -86, -31, +-122, -67, -31,-124,-123, -31,-123, -86, -31,-122, -68, -31,-124,-123, -31,-123, -86, -31,-122, -69, + -31,-124,-123, -31,-123, -86, -31,-122, -70, -31,-124,-123, -31,-123, -86, -31,-122, -71, -31,-124, +-123, -31,-123, -86, -31,-122, -72, -31,-124,-123, -31,-123, -86, -31,-122, -73, -31,-124,-123, -31, +-123, -86, -31,-122, -74, -31,-124,-123, -31,-123, -86, -31,-122, -75, -31,-124,-123, -31,-123, -86, + -31,-122, -76, -31,-124,-123, -31,-123, -86, -31,-122, -77, -31,-124,-123, -31,-123, -86, -31,-122, + -78, -31,-124,-123, -31,-123, -86, -31,-122, -79, -31,-124,-123, -31,-123, -86, -31,-122, -80, -31, +-124,-123, -31,-123, -86, -31,-122, -81, -31,-124,-123, -31,-123, -86, -31,-122, -82, -31,-124,-123, + -31,-123, -86, -31,-122, -83, -31,-124,-123, -31,-123, -86, -31,-122, -84, -31,-124,-123, -31,-123, + -86, -31,-122, -85, -31,-124,-123, -31,-123, -86, -31,-122, -86, -31,-124,-123, -31,-123, -86, -31, +-122, -87, -31,-124,-123, -31,-123, -86, -31,-122, -88, -31,-124,-123, -31,-123, -87, -31,-121,-126, + -31,-124,-123, -31,-123, -87, -31,-121,-127, -31,-124,-123, -31,-123, -87, -31,-121,-128, -31,-124, +-123, -31,-123, -87, -31,-122, -65, -31,-124,-123, -31,-123, -87, -31,-122, -66, -31,-124,-123, -31, +-123, -87, -31,-122, -67, -31,-124,-123, -31,-123, -87, -31,-122, -68, -31,-124,-123, -31,-123, -87, + -31,-122, -69, -31,-124,-123, -31,-123, -87, -31,-122, -70, -31,-124,-123, -31,-123, -87, -31,-122, + -71, -31,-124,-123, -31,-123, -87, -31,-122, -72, -31,-124,-123, -31,-123, -87, -31,-122, -73, -31, +-124,-123, -31,-123, -87, -31,-122, -74, -31,-124,-123, -31,-123, -87, -31,-122, -75, -31,-124,-123, + -31,-123, -87, -31,-122, -76, -31,-124,-123, -31,-123, -87, -31,-122, -77, -31,-124,-123, -31,-123, + -87, -31,-122, -78, -31,-124,-123, -31,-123, -87, -31,-122, -79, -31,-124,-123, -31,-123, -87, -31, +-122, -80, -31,-124,-123, -31,-123, -87, -31,-122, -81, -31,-124,-123, -31,-123, -87, -31,-122, -82, + -31,-124,-123, -31,-123, -87, -31,-122, -83, -31,-124,-123, -31,-123, -87, -31,-122, -84, -31,-124, +-123, -31,-123, -87, -31,-122, -85, -31,-124,-123, -31,-123, -87, -31,-122, -86, -31,-124,-123, -31, +-123, -87, -31,-122, -87, -31,-124,-123, -31,-123, -87, -31,-122, -88, -31,-124,-123, -31,-123, -88, + -31,-121,-126, -31,-124,-123, -31,-123, -88, -31,-121,-127, -31,-124,-123, -31,-123, -88, -31,-121, +-128, -31,-124,-123, -31,-123, -88, -31,-122, -65, -31,-124,-123, -31,-123, -88, -31,-122, -66, -31, +-124,-123, -31,-123, -88, -31,-122, -67, -31,-124,-123, -31,-123, -88, -31,-122, -68, -31,-124,-123, + -31,-123, -88, -31,-122, -69, -31,-124,-123, -31,-123, -88, -31,-122, -70, -31,-124,-123, -31,-123, + -88, -31,-122, -71, -31,-124,-123, -31,-123, -88, -31,-122, -72, -31,-124,-123, -31,-123, -88, -31, +-122, -73, -31,-124,-123, -31,-123, -88, -31,-122, -74, -31,-124,-123, -31,-123, -88, -31,-122, -75, + -31,-124,-123, -31,-123, -88, -31,-122, -76, -31,-124,-123, -31,-123, -88, -31,-122, -77, -31,-124, +-123, -31,-123, -88, -31,-122, -78, -31,-124,-123, -31,-123, -88, -31,-122, -79, -31,-124,-123, -31, +-123, -88, -31,-122, -80, -31,-124,-123, -31,-123, -88, -31,-122, -81, -31,-124,-123, -31,-123, -88, + -31,-122, -82, -31,-124,-123, -31,-123, -88, -31,-122, -83, -31,-124,-123, -31,-123, -88, -31,-122, + -84, -31,-124,-123, -31,-123, -88, -31,-122, -85, -31,-124,-123, -31,-123, -88, -31,-122, -86, -31, +-124,-123, -31,-123, -88, -31,-122, -87, -31,-124,-123, -31,-123, -88, -31,-122, -88, -31,-124,-123, + -31,-123, -89, -31,-121,-126, -31,-124,-123, -31,-123, -89, -31,-121,-127, -31,-124,-123, -31,-123, + -89, -31,-121,-128, -31,-124,-123, -31,-123, -89, -31,-122, -65, -31,-124,-123, -31,-123, -89, -31, +-122, -66, -31,-124,-123, -31,-123, -89, -31,-122, -67, -31,-124,-123, -31,-123, -89, -31,-122, -68, + -31,-124,-123, -31,-123, -89, -31,-122, -69, -31,-124,-123, -31,-123, -89, -31,-122, -70, -31,-124, +-123, -31,-123, -89, -31,-122, -71, -31,-124,-123, -31,-123, -89, -31,-122, -72, -31,-124,-123, -31, +-123, -89, -31,-122, -73, -31,-124,-123, -31,-123, -89, -31,-122, -74, -31,-124,-123, -31,-123, -89, + -31,-122, -75, -31,-124,-123, -31,-123, -89, -31,-122, -76, -31,-124,-123, -31,-123, -89, -31,-122, + -77, -31,-124,-123, -31,-123, -89, -31,-122, -78, -31,-124,-123, -31,-123, -89, -31,-122, -79, -31, +-124,-123, -31,-123, -89, -31,-122, -80, -31,-124,-123, -31,-123, -89, -31,-122, -81, -31,-124,-123, + -31,-123, -89, -31,-122, -82, -31,-124,-123, -31,-123, -89, -31,-122, -83, -31,-124,-123, -31,-123, + -89, -31,-122, -84, -31,-124,-123, -31,-123, -89, -31,-122, -85, -31,-124,-123, -31,-123, -89, -31, +-122, -86, -31,-124,-123, -31,-123, -89, -31,-122, -87, -31,-124,-123, -31,-123, -89, -31,-122, -88, + -31,-124,-123, -31,-123, -90, -31,-121,-126, -31,-124,-123, -31,-123, -90, -31,-121,-127, -31,-124, +-123, -31,-123, -90, -31,-121,-128, -31,-124,-123, -31,-123, -90, -31,-122, -65, -31,-124,-123, -31, +-123, -90, -31,-122, -66, -31,-124,-123, -31,-123, -90, -31,-122, -67, -31,-124,-123, -31,-123, -90, + -31,-122, -68, -31,-124,-123, -31,-123, -90, -31,-122, -69, -31,-124,-123, -31,-123, -90, -31,-122, + -70, -31,-124,-123, -31,-123, -90, -31,-122, -71, -31,-124,-123, -31,-123, -90, -31,-122, -72, -31, +-124,-123, -31,-123, -90, -31,-122, -73, -31,-124,-123, -31,-123, -90, -31,-122, -74, -31,-124,-123, + -31,-123, -90, -31,-122, -75, -31,-124,-123, -31,-123, -90, -31,-122, -76, -31,-124,-123, -31,-123, + -90, -31,-122, -77, -31,-124,-123, -31,-123, -90, -31,-122, -78, -31,-124,-123, -31,-123, -90, -31, +-122, -79, -31,-124,-123, -31,-123, -90, -31,-122, -80, -31,-124,-123, -31,-123, -90, -31,-122, -81, + -31,-124,-123, -31,-123, -90, -31,-122, -82, -31,-124,-123, -31,-123, -90, -31,-122, -83, -31,-124, +-123, -31,-123, -90, -31,-122, -84, -31,-124,-123, -31,-123, -90, -31,-122, -85, -31,-124,-123, -31, +-123, -90, -31,-122, -86, -31,-124,-123, -31,-123, -90, -31,-122, -87, -31,-124,-123, -31,-123, -90, + -31,-122, -88, -31,-124,-123, -31,-123, -91, -31,-121,-126, -31,-124,-123, -31,-123, -91, -31,-121, +-127, -31,-124,-123, -31,-123, -91, -31,-121,-128, -31,-124,-123, -31,-123, -91, -31,-122, -65, -31, +-124,-123, -31,-123, -91, -31,-122, -66, -31,-124,-123, -31,-123, -91, -31,-122, -67, -31,-124,-123, + -31,-123, -91, -31,-122, -68, -31,-124,-123, -31,-123, -91, -31,-122, -69, -31,-124,-123, -31,-123, + -91, -31,-122, -70, -31,-124,-123, -31,-123, -91, -31,-122, -71, -31,-124,-123, -31,-123, -91, -31, +-122, -72, -31,-124,-123, -31,-123, -91, -31,-122, -73, -31,-124,-123, -31,-123, -91, -31,-122, -74, + -31,-124,-123, -31,-123, -91, -31,-122, -75, -31,-124,-123, -31,-123, -91, -31,-122, -76, -31,-124, +-123, -31,-123, -91, -31,-122, -77, -31,-124,-123, -31,-123, -91, -31,-122, -78, -31,-124,-123, -31, +-123, -91, -31,-122, -79, -31,-124,-123, -31,-123, -91, -31,-122, -80, -31,-124,-123, -31,-123, -91, + -31,-122, -81, -31,-124,-123, -31,-123, -91, -31,-122, -82, -31,-124,-123, -31,-123, -91, -31,-122, + -83, -31,-124,-123, -31,-123, -91, -31,-122, -84, -31,-124,-123, -31,-123, -91, -31,-122, -85, -31, +-124,-123, -31,-123, -91, -31,-122, -86, -31,-124,-123, -31,-123, -91, -31,-122, -87, -31,-124,-123, + -31,-123, -91, -31,-122, -88, -31,-124,-123, -31,-123, -92, -31,-121,-126, -31,-124,-123, -31,-123, + -92, -31,-121,-127, -31,-124,-123, -31,-123, -92, -31,-121,-128, -31,-124,-123, -31,-123, -92, -31, +-122, -65, -31,-124,-123, -31,-123, -92, -31,-122, -66, -31,-124,-123, -31,-123, -92, -31,-122, -67, + -31,-124,-123, -31,-123, -92, -31,-122, -68, -31,-124,-123, -31,-123, -92, -31,-122, -69, -31,-124, +-123, -31,-123, -92, -31,-122, -70, -31,-124,-123, -31,-123, -92, -31,-122, -71, -31,-124,-123, -31, +-123, -92, -31,-122, -72, -31,-124,-123, -31,-123, -92, -31,-122, -73, -31,-124,-123, -31,-123, -92, + -31,-122, -74, -31,-124,-123, -31,-123, -92, -31,-122, -75, -31,-124,-123, -31,-123, -92, -31,-122, + -76, -31,-124,-123, -31,-123, -92, -31,-122, -77, -31,-124,-123, -31,-123, -92, -31,-122, -78, -31, +-124,-123, -31,-123, -92, -31,-122, -79, -31,-124,-123, -31,-123, -92, -31,-122, -80, -31,-124,-123, + -31,-123, -92, -31,-122, -81, -31,-124,-123, -31,-123, -92, -31,-122, -82, -31,-124,-123, -31,-123, + -92, -31,-122, -83, -31,-124,-123, -31,-123, -92, -31,-122, -84, -31,-124,-123, -31,-123, -92, -31, +-122, -85, -31,-124,-123, -31,-123, -92, -31,-122, -86, -31,-124,-123, -31,-123, -92, -31,-122, -87, + -31,-124,-123, -31,-123, -92, -31,-122, -88, -31,-124,-123, -31,-123, -93, -31,-121,-126, -31,-124, +-123, -31,-123, -93, -31,-121,-127, -31,-124,-123, -31,-123, -93, -31,-121,-128, -31,-124,-123, -31, +-123, -93, -31,-122, -65, -31,-124,-123, -31,-123, -93, -31,-122, -66, -31,-124,-123, -31,-123, -93, + -31,-122, -67, -31,-124,-123, -31,-123, -93, -31,-122, -68, -31,-124,-123, -31,-123, -93, -31,-122, + -69, -31,-124,-123, -31,-123, -93, -31,-122, -70, -31,-124,-123, -31,-123, -93, -31,-122, -71, -31, +-124,-123, -31,-123, -93, -31,-122, -72, -31,-124,-123, -31,-123, -93, -31,-122, -73, -31,-124,-123, + -31,-123, -93, -31,-122, -74, -31,-124,-123, -31,-123, -93, -31,-122, -75, -31,-124,-123, -31,-123, + -93, -31,-122, -76, -31,-124,-123, -31,-123, -93, -31,-122, -77, -31,-124,-123, -31,-123, -93, -31, +-122, -78, -31,-124,-123, -31,-123, -93, -31,-122, -79, -31,-124,-123, -31,-123, -93, -31,-122, -80, + -31,-124,-123, -31,-123, -93, -31,-122, -81, -31,-124,-123, -31,-123, -93, -31,-122, -82, -31,-124, +-123, -31,-123, -93, -31,-122, -83, -31,-124,-123, -31,-123, -93, -31,-122, -84, -31,-124,-123, -31, +-123, -93, -31,-122, -85, -31,-124,-123, -31,-123, -93, -31,-122, -86, -31,-124,-123, -31,-123, -93, + -31,-122, -87, -31,-124,-123, -31,-123, -93, -31,-122, -88, -31,-124,-123, -31,-123, -94, -31,-121, +-126, -31,-124,-123, -31,-123, -94, -31,-121,-127, -31,-124,-123, -31,-123, -94, -31,-121,-128, -31, +-124,-123, -31,-123, -94, -31,-122, -65, -31,-124,-123, -31,-123, -94, -31,-122, -66, -31,-124,-123, + -31,-123, -94, -31,-122, -67, -31,-124,-123, -31,-123, -94, -31,-122, -68, -31,-124,-123, -31,-123, + -94, -31,-122, -69, -31,-124,-123, -31,-123, -94, -31,-122, -70, -31,-124,-123, -31,-123, -94, -31, +-122, -71, -31,-124,-123, -31,-123, -94, -31,-122, -72, -31,-124,-123, -31,-123, -94, -31,-122, -73, + -31,-124,-123, -31,-123, -94, -31,-122, -74, -31,-124,-123, -31,-123, -94, -31,-122, -75, -31,-124, +-123, -31,-123, -94, -31,-122, -76, -31,-124,-123, -31,-123, -94, -31,-122, -77, -31,-124,-123, -31, +-123, -94, -31,-122, -78, -31,-124,-123, -31,-123, -94, -31,-122, -79, -31,-124,-123, -31,-123, -94, + -31,-122, -80, -31,-124,-123, -31,-123, -94, -31,-122, -81, -31,-124,-123, -31,-123, -94, -31,-122, + -82, -31,-124,-123, -31,-123, -94, -31,-122, -83, -31,-124,-123, -31,-123, -94, -31,-122, -84, -31, +-124,-123, -31,-123, -94, -31,-122, -85, -31,-124,-123, -31,-123, -94, -31,-122, -86, -31,-124,-123, + -31,-123, -94, -31,-122, -87, -31,-124,-123, -31,-123, -94, -31,-122, -88, -31,-124,-123, -31,-123, + -95, -31,-121,-126, -31,-124,-123, -31,-123, -95, -31,-121,-127, -31,-124,-123, -31,-123, -95, -31, +-121,-128, -31,-124,-123, -31,-123, -95, -31,-122, -65, -31,-124,-123, -31,-123, -95, -31,-122, -66, + -31,-124,-123, -31,-123, -95, -31,-122, -67, -31,-124,-123, -31,-123, -95, -31,-122, -68, -31,-124, +-123, -31,-123, -95, -31,-122, -69, -31,-124,-123, -31,-123, -95, -31,-122, -70, -31,-124,-123, -31, +-123, -95, -31,-122, -71, -31,-124,-123, -31,-123, -95, -31,-122, -72, -31,-124,-123, -31,-123, -95, + -31,-122, -73, -31,-124,-123, -31,-123, -95, -31,-122, -74, -31,-124,-123, -31,-123, -95, -31,-122, + -75, -31,-124,-123, -31,-123, -95, -31,-122, -76, -31,-124,-123, -31,-123, -95, -31,-122, -77, -31, +-124,-123, -31,-123, -95, -31,-122, -78, -31,-124,-123, -31,-123, -95, -31,-122, -79, -31,-124,-123, + -31,-123, -95, -31,-122, -80, -31,-124,-123, -31,-123, -95, -31,-122, -81, -31,-124,-123, -31,-123, + -95, -31,-122, -82, -31,-124,-123, -31,-123, -95, -31,-122, -83, -31,-124,-123, -31,-123, -95, -31, +-122, -84, -31,-124,-123, -31,-123, -95, -31,-122, -85, -31,-124,-123, -31,-123, -95, -31,-122, -86, + -31,-124,-123, -31,-123, -95, -31,-122, -87, -31,-124,-123, -31,-123, -95, -31,-122, -88, -31,-124, +-124, -31,-123, -75, -31,-121,-126, -31,-124,-124, -31,-123, -75, -31,-121,-127, -31,-124,-124, -31, +-123, -75, -31,-121,-128, -31,-124,-124, -31,-123, -75, -31,-122, -65, -31,-124,-124, -31,-123, -75, + -31,-122, -66, -31,-124,-124, -31,-123, -75, -31,-122, -67, -31,-124,-124, -31,-123, -75, -31,-122, + -68, -31,-124,-124, -31,-123, -75, -31,-122, -69, -31,-124,-124, -31,-123, -75, -31,-122, -70, -31, +-124,-124, -31,-123, -75, -31,-122, -71, -31,-124,-124, -31,-123, -75, -31,-122, -72, -31,-124,-124, + -31,-123, -75, -31,-122, -73, -31,-124,-124, -31,-123, -75, -31,-122, -74, -31,-124,-124, -31,-123, + -75, -31,-122, -75, -31,-124,-124, -31,-123, -75, -31,-122, -76, -31,-124,-124, -31,-123, -75, -31, +-122, -77, -31,-124,-124, -31,-123, -75, -31,-122, -78, -31,-124,-124, -31,-123, -75, -31,-122, -79, + -31,-124,-124, -31,-123, -75, -31,-122, -80, -31,-124,-124, -31,-123, -75, -31,-122, -81, -31,-124, +-124, -31,-123, -75, -31,-122, -82, -31,-124,-124, -31,-123, -75, -31,-122, -83, -31,-124,-124, -31, +-123, -75, -31,-122, -84, -31,-124,-124, -31,-123, -75, -31,-122, -85, -31,-124,-124, -31,-123, -75, + -31,-122, -86, -31,-124,-124, -31,-123, -75, -31,-122, -87, -31,-124,-124, -31,-123, -75, -31,-122, + -88, -31,-124,-124, -31,-123, -76, -31,-121,-126, -31,-124,-124, -31,-123, -76, -31,-121,-127, -31, +-124,-124, -31,-123, -76, -31,-121,-128, -31,-124,-124, -31,-123, -76, -31,-122, -65, -31,-124,-124, + -31,-123, -76, -31,-122, -66, -31,-124,-124, -31,-123, -76, -31,-122, -67, -31,-124,-124, -31,-123, + -76, -31,-122, -68, -31,-124,-124, -31,-123, -76, -31,-122, -69, -31,-124,-124, -31,-123, -76, -31, +-122, -70, -31,-124,-124, -31,-123, -76, -31,-122, -71, -31,-124,-124, -31,-123, -76, -31,-122, -72, + -31,-124,-124, -31,-123, -76, -31,-122, -73, -31,-124,-124, -31,-123, -76, -31,-122, -74, -31,-124, +-124, -31,-123, -76, -31,-122, -75, -31,-124,-124, -31,-123, -76, -31,-122, -76, -31,-124,-124, -31, +-123, -76, -31,-122, -77, -31,-124,-124, -31,-123, -76, -31,-122, -78, -31,-124,-124, -31,-123, -76, + -31,-122, -79, -31,-124,-124, -31,-123, -76, -31,-122, -80, -31,-124,-124, -31,-123, -76, -31,-122, + -81, -31,-124,-124, -31,-123, -76, -31,-122, -82, -31,-124,-124, -31,-123, -76, -31,-122, -83, -31, +-124,-124, -31,-123, -76, -31,-122, -84, -31,-124,-124, -31,-123, -76, -31,-122, -85, -31,-124,-124, + -31,-123, -76, -31,-122, -86, -31,-124,-124, -31,-123, -76, -31,-122, -87, -31,-124,-124, -31,-123, + -76, -31,-122, -88, -31,-124,-124, -31,-123, -77, -31,-121,-126, -31,-124,-124, -31,-123, -77, -31, +-121,-127, -31,-124,-124, -31,-123, -77, -31,-121,-128, -31,-124,-124, -31,-123, -77, -31,-122, -65, + -31,-124,-124, -31,-123, -77, -31,-122, -66, -31,-124,-124, -31,-123, -77, -31,-122, -67, -31,-124, +-124, -31,-123, -77, -31,-122, -68, -31,-124,-124, -31,-123, -77, -31,-122, -69, -31,-124,-124, -31, +-123, -77, -31,-122, -70, -31,-124,-124, -31,-123, -77, -31,-122, -71, -31,-124,-124, -31,-123, -77, + -31,-122, -72, -31,-124,-124, -31,-123, -77, -31,-122, -73, -31,-124,-124, -31,-123, -77, -31,-122, + -74, -31,-124,-124, -31,-123, -77, -31,-122, -75, -31,-124,-124, -31,-123, -77, -31,-122, -76, -31, +-124,-124, -31,-123, -77, -31,-122, -77, -31,-124,-124, -31,-123, -77, -31,-122, -78, -31,-124,-124, + -31,-123, -77, -31,-122, -79, -31,-124,-124, -31,-123, -77, -31,-122, -80, -31,-124,-124, -31,-123, + -77, -31,-122, -81, -31,-124,-124, -31,-123, -77, -31,-122, -82, -31,-124,-124, -31,-123, -77, -31, +-122, -83, -31,-124,-124, -31,-123, -77, -31,-122, -84, -31,-124,-124, -31,-123, -77, -31,-122, -85, + -31,-124,-124, -31,-123, -77, -31,-122, -86, -31,-124,-124, -31,-123, -77, -31,-122, -87, -31,-124, +-124, -31,-123, -77, -31,-122, -88, -31,-124,-124, -31,-123, -78, -31,-121,-126, -31,-124,-124, -31, +-123, -78, -31,-121,-127, -31,-124,-124, -31,-123, -78, -31,-121,-128, -31,-124,-124, -31,-123, -78, + -31,-122, -65, -31,-124,-124, -31,-123, -78, -31,-122, -66, -31,-124,-124, -31,-123, -78, -31,-122, + -67, -31,-124,-124, -31,-123, -78, -31,-122, -68, -31,-124,-124, -31,-123, -78, -31,-122, -69, -31, +-124,-124, -31,-123, -78, -31,-122, -70, -31,-124,-124, -31,-123, -78, -31,-122, -71, -31,-124,-124, + -31,-123, -78, -31,-122, -72, -31,-124,-124, -31,-123, -78, -31,-122, -73, -31,-124,-124, -31,-123, + -78, -31,-122, -74, -31,-124,-124, -31,-123, -78, -31,-122, -75, -31,-124,-124, -31,-123, -78, -31, +-122, -76, -31,-124,-124, -31,-123, -78, -31,-122, -77, -31,-124,-124, -31,-123, -78, -31,-122, -78, + -31,-124,-124, -31,-123, -78, -31,-122, -79, -31,-124,-124, -31,-123, -78, -31,-122, -80, -31,-124, +-124, -31,-123, -78, -31,-122, -81, -31,-124,-124, -31,-123, -78, -31,-122, -82, -31,-124,-124, -31, +-123, -78, -31,-122, -83, -31,-124,-124, -31,-123, -78, -31,-122, -84, -31,-124,-124, -31,-123, -78, + -31,-122, -85, -31,-124,-124, -31,-123, -78, -31,-122, -86, -31,-124,-124, -31,-123, -78, -31,-122, + -87, -31,-124,-124, -31,-123, -78, -31,-122, -88, -31,-124,-124, -31,-123, -79, -31,-121,-126, -31, +-124,-124, -31,-123, -79, -31,-121,-127, -31,-124,-124, -31,-123, -79, -31,-121,-128, -31,-124,-124, + -31,-123, -79, -31,-122, -65, -31,-124,-124, -31,-123, -79, -31,-122, -66, -31,-124,-124, -31,-123, + -79, -31,-122, -67, -31,-124,-124, -31,-123, -79, -31,-122, -68, -31,-124,-124, -31,-123, -79, -31, +-122, -69, -31,-124,-124, -31,-123, -79, -31,-122, -70, -31,-124,-124, -31,-123, -79, -31,-122, -71, + -31,-124,-124, -31,-123, -79, -31,-122, -72, -31,-124,-124, -31,-123, -79, -31,-122, -73, -31,-124, +-124, -31,-123, -79, -31,-122, -74, -31,-124,-124, -31,-123, -79, -31,-122, -75, -31,-124,-124, -31, +-123, -79, -31,-122, -76, -31,-124,-124, -31,-123, -79, -31,-122, -77, -31,-124,-124, -31,-123, -79, + -31,-122, -78, -31,-124,-124, -31,-123, -79, -31,-122, -79, -31,-124,-124, -31,-123, -79, -31,-122, + -80, -31,-124,-124, -31,-123, -79, -31,-122, -81, -31,-124,-124, -31,-123, -79, -31,-122, -82, -31, +-124,-124, -31,-123, -79, -31,-122, -83, -31,-124,-124, -31,-123, -79, -31,-122, -84, -31,-124,-124, + -31,-123, -79, -31,-122, -85, -31,-124,-124, -31,-123, -79, -31,-122, -86, -31,-124,-124, -31,-123, + -79, -31,-122, -87, -31,-124,-124, -31,-123, -79, -31,-122, -88, -31,-124,-124, -31,-123, -80, -31, +-121,-126, -31,-124,-124, -31,-123, -80, -31,-121,-127, -31,-124,-124, -31,-123, -80, -31,-121,-128, + -31,-124,-124, -31,-123, -80, -31,-122, -65, -31,-124,-124, -31,-123, -80, -31,-122, -66, -31,-124, +-124, -31,-123, -80, -31,-122, -67, -31,-124,-124, -31,-123, -80, -31,-122, -68, -31,-124,-124, -31, +-123, -80, -31,-122, -69, -31,-124,-124, -31,-123, -80, -31,-122, -70, -31,-124,-124, -31,-123, -80, + -31,-122, -71, -31,-124,-124, -31,-123, -80, -31,-122, -72, -31,-124,-124, -31,-123, -80, -31,-122, + -73, -31,-124,-124, -31,-123, -80, -31,-122, -74, -31,-124,-124, -31,-123, -80, -31,-122, -75, -31, +-124,-124, -31,-123, -80, -31,-122, -76, -31,-124,-124, -31,-123, -80, -31,-122, -77, -31,-124,-124, + -31,-123, -80, -31,-122, -78, -31,-124,-124, -31,-123, -80, -31,-122, -79, -31,-124,-124, -31,-123, + -80, -31,-122, -80, -31,-124,-124, -31,-123, -80, -31,-122, -81, -31,-124,-124, -31,-123, -80, -31, +-122, -82, -31,-124,-124, -31,-123, -80, -31,-122, -83, -31,-124,-124, -31,-123, -80, -31,-122, -84, + -31,-124,-124, -31,-123, -80, -31,-122, -85, -31,-124,-124, -31,-123, -80, -31,-122, -86, -31,-124, +-124, -31,-123, -80, -31,-122, -87, -31,-124,-124, -31,-123, -80, -31,-122, -88, -31,-124,-124, -31, +-123, -81, -31,-121,-126, -31,-124,-124, -31,-123, -81, -31,-121,-127, -31,-124,-124, -31,-123, -81, + -31,-121,-128, -31,-124,-124, -31,-123, -81, -31,-122, -65, -31,-124,-124, -31,-123, -81, -31,-122, + -66, -31,-124,-124, -31,-123, -81, -31,-122, -67, -31,-124,-124, -31,-123, -81, -31,-122, -68, -31, +-124,-124, -31,-123, -81, -31,-122, -69, -31,-124,-124, -31,-123, -81, -31,-122, -70, -31,-124,-124, + -31,-123, -81, -31,-122, -71, -31,-124,-124, -31,-123, -81, -31,-122, -72, -31,-124,-124, -31,-123, + -81, -31,-122, -73, -31,-124,-124, -31,-123, -81, -31,-122, -74, -31,-124,-124, -31,-123, -81, -31, +-122, -75, -31,-124,-124, -31,-123, -81, -31,-122, -76, -31,-124,-124, -31,-123, -81, -31,-122, -77, + -31,-124,-124, -31,-123, -81, -31,-122, -78, -31,-124,-124, -31,-123, -81, -31,-122, -79, -31,-124, +-124, -31,-123, -81, -31,-122, -80, -31,-124,-124, -31,-123, -81, -31,-122, -81, -31,-124,-124, -31, +-123, -81, -31,-122, -82, -31,-124,-124, -31,-123, -81, -31,-122, -83, -31,-124,-124, -31,-123, -81, + -31,-122, -84, -31,-124,-124, -31,-123, -81, -31,-122, -85, -31,-124,-124, -31,-123, -81, -31,-122, + -86, -31,-124,-124, -31,-123, -81, -31,-122, -87, -31,-124,-124, -31,-123, -81, -31,-122, -88, -31, +-124,-124, -31,-123, -82, -31,-121,-126, -31,-124,-124, -31,-123, -82, -31,-121,-127, -31,-124,-124, + -31,-123, -82, -31,-121,-128, -31,-124,-124, -31,-123, -82, -31,-122, -65, -31,-124,-124, -31,-123, + -82, -31,-122, -66, -31,-124,-124, -31,-123, -82, -31,-122, -67, -31,-124,-124, -31,-123, -82, -31, +-122, -68, -31,-124,-124, -31,-123, -82, -31,-122, -69, -31,-124,-124, -31,-123, -82, -31,-122, -70, + -31,-124,-124, -31,-123, -82, -31,-122, -71, -31,-124,-124, -31,-123, -82, -31,-122, -72, -31,-124, +-124, -31,-123, -82, -31,-122, -73, -31,-124,-124, -31,-123, -82, -31,-122, -74, -31,-124,-124, -31, +-123, -82, -31,-122, -75, -31,-124,-124, -31,-123, -82, -31,-122, -76, -31,-124,-124, -31,-123, -82, + -31,-122, -77, -31,-124,-124, -31,-123, -82, -31,-122, -78, -31,-124,-124, -31,-123, -82, -31,-122, + -79, -31,-124,-124, -31,-123, -82, -31,-122, -80, -31,-124,-124, -31,-123, -82, -31,-122, -81, -31, +-124,-124, -31,-123, -82, -31,-122, -82, -31,-124,-124, -31,-123, -82, -31,-122, -83, -31,-124,-124, + -31,-123, -82, -31,-122, -84, -31,-124,-124, -31,-123, -82, -31,-122, -85, -31,-124,-124, -31,-123, + -82, -31,-122, -86, -31,-124,-124, -31,-123, -82, -31,-122, -87, -31,-124,-124, -31,-123, -82, -31, +-122, -88, -31,-124,-124, -31,-123, -83, -31,-121,-126, -31,-124,-124, -31,-123, -83, -31,-121,-127, + -31,-124,-124, -31,-123, -83, -31,-121,-128, -31,-124,-124, -31,-123, -83, -31,-122, -65, -31,-124, +-124, -31,-123, -83, -31,-122, -66, -31,-124,-124, -31,-123, -83, -31,-122, -67, -31,-124,-124, -31, +-123, -83, -31,-122, -68, -31,-124,-124, -31,-123, -83, -31,-122, -69, -31,-124,-124, -31,-123, -83, + -31,-122, -70, -31,-124,-124, -31,-123, -83, -31,-122, -71, -31,-124,-124, -31,-123, -83, -31,-122, + -72, -31,-124,-124, -31,-123, -83, -31,-122, -73, -31,-124,-124, -31,-123, -83, -31,-122, -74, -31, +-124,-124, -31,-123, -83, -31,-122, -75, -31,-124,-124, -31,-123, -83, -31,-122, -76, -31,-124,-124, + -31,-123, -83, -31,-122, -77, -31,-124,-124, -31,-123, -83, -31,-122, -78, -31,-124,-124, -31,-123, + -83, -31,-122, -79, -31,-124,-124, -31,-123, -83, -31,-122, -80, -31,-124,-124, -31,-123, -83, -31, +-122, -81, -31,-124,-124, -31,-123, -83, -31,-122, -82, -31,-124,-124, -31,-123, -83, -31,-122, -83, + -31,-124,-124, -31,-123, -83, -31,-122, -84, -31,-124,-124, -31,-123, -83, -31,-122, -85, -31,-124, +-124, -31,-123, -83, -31,-122, -86, -31,-124,-124, -31,-123, -83, -31,-122, -87, -31,-124,-124, -31, +-123, -83, -31,-122, -88, -31,-124,-124, -31,-123, -84, -31,-121,-126, -31,-124,-124, -31,-123, -84, + -31,-121,-127, -31,-124,-124, -31,-123, -84, -31,-121,-128, -31,-124,-124, -31,-123, -84, -31,-122, + -65, -31,-124,-124, -31,-123, -84, -31,-122, -66, -31,-124,-124, -31,-123, -84, -31,-122, -67, -31, +-124,-124, -31,-123, -84, -31,-122, -68, -31,-124,-124, -31,-123, -84, -31,-122, -69, -31,-124,-124, + -31,-123, -84, -31,-122, -70, -31,-124,-124, -31,-123, -84, -31,-122, -71, -31,-124,-124, -31,-123, + -84, -31,-122, -72, -31,-124,-124, -31,-123, -84, -31,-122, -73, -31,-124,-124, -31,-123, -84, -31, +-122, -74, -31,-124,-124, -31,-123, -84, -31,-122, -75, -31,-124,-124, -31,-123, -84, -31,-122, -76, + -31,-124,-124, -31,-123, -84, -31,-122, -77, -31,-124,-124, -31,-123, -84, -31,-122, -78, -31,-124, +-124, -31,-123, -84, -31,-122, -79, -31,-124,-124, -31,-123, -84, -31,-122, -80, -31,-124,-124, -31, +-123, -84, -31,-122, -81, -31,-124,-124, -31,-123, -84, -31,-122, -82, -31,-124,-124, -31,-123, -84, + -31,-122, -83, -31,-124,-124, -31,-123, -84, -31,-122, -84, -31,-124,-124, -31,-123, -84, -31,-122, + -85, -31,-124,-124, -31,-123, -84, -31,-122, -86, -31,-124,-124, -31,-123, -84, -31,-122, -87, -31, +-124,-124, -31,-123, -84, -31,-122, -88, -31,-124,-124, -31,-123, -85, -31,-121,-126, -31,-124,-124, + -31,-123, -85, -31,-121,-127, -31,-124,-124, -31,-123, -85, -31,-121,-128, -31,-124,-124, -31,-123, + -85, -31,-122, -65, -31,-124,-124, -31,-123, -85, -31,-122, -66, -31,-124,-124, -31,-123, -85, -31, +-122, -67, -31,-124,-124, -31,-123, -85, -31,-122, -68, -31,-124,-124, -31,-123, -85, -31,-122, -69, + -31,-124,-124, -31,-123, -85, -31,-122, -70, -31,-124,-124, -31,-123, -85, -31,-122, -71, -31,-124, +-124, -31,-123, -85, -31,-122, -72, -31,-124,-124, -31,-123, -85, -31,-122, -73, -31,-124,-124, -31, +-123, -85, -31,-122, -74, -31,-124,-124, -31,-123, -85, -31,-122, -75, -31,-124,-124, -31,-123, -85, + -31,-122, -76, -31,-124,-124, -31,-123, -85, -31,-122, -77, -31,-124,-124, -31,-123, -85, -31,-122, + -78, -31,-124,-124, -31,-123, -85, -31,-122, -79, -31,-124,-124, -31,-123, -85, -31,-122, -80, -31, +-124,-124, -31,-123, -85, -31,-122, -81, -31,-124,-124, -31,-123, -85, -31,-122, -82, -31,-124,-124, + -31,-123, -85, -31,-122, -83, -31,-124,-124, -31,-123, -85, -31,-122, -84, -31,-124,-124, -31,-123, + -85, -31,-122, -85, -31,-124,-124, -31,-123, -85, -31,-122, -86, -31,-124,-124, -31,-123, -85, -31, +-122, -87, -31,-124,-124, -31,-123, -85, -31,-122, -88, -31,-124,-124, -31,-123, -86, -31,-121,-126, + -31,-124,-124, -31,-123, -86, -31,-121,-127, -31,-124,-124, -31,-123, -86, -31,-121,-128, -31,-124, +-124, -31,-123, -86, -31,-122, -65, -31,-124,-124, -31,-123, -86, -31,-122, -66, -31,-124,-124, -31, +-123, -86, -31,-122, -67, -31,-124,-124, -31,-123, -86, -31,-122, -68, -31,-124,-124, -31,-123, -86, + -31,-122, -69, -31,-124,-124, -31,-123, -86, -31,-122, -70, -31,-124,-124, -31,-123, -86, -31,-122, + -71, -31,-124,-124, -31,-123, -86, -31,-122, -72, -31,-124,-124, -31,-123, -86, -31,-122, -73, -31, +-124,-124, -31,-123, -86, -31,-122, -74, -31,-124,-124, -31,-123, -86, -31,-122, -75, -31,-124,-124, + -31,-123, -86, -31,-122, -76, -31,-124,-124, -31,-123, -86, -31,-122, -77, -31,-124,-124, -31,-123, + -86, -31,-122, -78, -31,-124,-124, -31,-123, -86, -31,-122, -79, -31,-124,-124, -31,-123, -86, -31, +-122, -80, -31,-124,-124, -31,-123, -86, -31,-122, -81, -31,-124,-124, -31,-123, -86, -31,-122, -82, + -31,-124,-124, -31,-123, -86, -31,-122, -83, -31,-124,-124, -31,-123, -86, -31,-122, -84, -31,-124, +-124, -31,-123, -86, -31,-122, -85, -31,-124,-124, -31,-123, -86, -31,-122, -86, -31,-124,-124, -31, +-123, -86, -31,-122, -87, -31,-124,-124, -31,-123, -86, -31,-122, -88, -31,-124,-124, -31,-123, -87, + -31,-121,-126, -31,-124,-124, -31,-123, -87, -31,-121,-127, -31,-124,-124, -31,-123, -87, -31,-121, +-128, -31,-124,-124, -31,-123, -87, -31,-122, -65, -31,-124,-124, -31,-123, -87, -31,-122, -66, -31, +-124,-124, -31,-123, -87, -31,-122, -67, -31,-124,-124, -31,-123, -87, -31,-122, -68, -31,-124,-124, + -31,-123, -87, -31,-122, -69, -31,-124,-124, -31,-123, -87, -31,-122, -70, -31,-124,-124, -31,-123, + -87, -31,-122, -71, -31,-124,-124, -31,-123, -87, -31,-122, -72, -31,-124,-124, -31,-123, -87, -31, +-122, -73, -31,-124,-124, -31,-123, -87, -31,-122, -74, -31,-124,-124, -31,-123, -87, -31,-122, -75, + -31,-124,-124, -31,-123, -87, -31,-122, -76, -31,-124,-124, -31,-123, -87, -31,-122, -77, -31,-124, +-124, -31,-123, -87, -31,-122, -78, -31,-124,-124, -31,-123, -87, -31,-122, -79, -31,-124,-124, -31, +-123, -87, -31,-122, -80, -31,-124,-124, -31,-123, -87, -31,-122, -81, -31,-124,-124, -31,-123, -87, + -31,-122, -82, -31,-124,-124, -31,-123, -87, -31,-122, -83, -31,-124,-124, -31,-123, -87, -31,-122, + -84, -31,-124,-124, -31,-123, -87, -31,-122, -85, -31,-124,-124, -31,-123, -87, -31,-122, -86, -31, +-124,-124, -31,-123, -87, -31,-122, -87, -31,-124,-124, -31,-123, -87, -31,-122, -88, -31,-124,-124, + -31,-123, -88, -31,-121,-126, -31,-124,-124, -31,-123, -88, -31,-121,-127, -31,-124,-124, -31,-123, + -88, -31,-121,-128, -31,-124,-124, -31,-123, -88, -31,-122, -65, -31,-124,-124, -31,-123, -88, -31, +-122, -66, -31,-124,-124, -31,-123, -88, -31,-122, -67, -31,-124,-124, -31,-123, -88, -31,-122, -68, + -31,-124,-124, -31,-123, -88, -31,-122, -69, -31,-124,-124, -31,-123, -88, -31,-122, -70, -31,-124, +-124, -31,-123, -88, -31,-122, -71, -31,-124,-124, -31,-123, -88, -31,-122, -72, -31,-124,-124, -31, +-123, -88, -31,-122, -73, -31,-124,-124, -31,-123, -88, -31,-122, -74, -31,-124,-124, -31,-123, -88, + -31,-122, -75, -31,-124,-124, -31,-123, -88, -31,-122, -76, -31,-124,-124, -31,-123, -88, -31,-122, + -77, -31,-124,-124, -31,-123, -88, -31,-122, -78, -31,-124,-124, -31,-123, -88, -31,-122, -79, -31, +-124,-124, -31,-123, -88, -31,-122, -80, -31,-124,-124, -31,-123, -88, -31,-122, -81, -31,-124,-124, + -31,-123, -88, -31,-122, -82, -31,-124,-124, -31,-123, -88, -31,-122, -83, -31,-124,-124, -31,-123, + -88, -31,-122, -84, -31,-124,-124, -31,-123, -88, -31,-122, -85, -31,-124,-124, -31,-123, -88, -31, +-122, -86, -31,-124,-124, -31,-123, -88, -31,-122, -87, -31,-124,-124, -31,-123, -88, -31,-122, -88, + -31,-124,-124, -31,-123, -89, -31,-121,-126, -31,-124,-124, -31,-123, -89, -31,-121,-127, -31,-124, +-124, -31,-123, -89, -31,-121,-128, -31,-124,-124, -31,-123, -89, -31,-122, -65, -31,-124,-124, -31, +-123, -89, -31,-122, -66, -31,-124,-124, -31,-123, -89, -31,-122, -67, -31,-124,-124, -31,-123, -89, + -31,-122, -68, -31,-124,-124, -31,-123, -89, -31,-122, -69, -31,-124,-124, -31,-123, -89, -31,-122, + -70, -31,-124,-124, -31,-123, -89, -31,-122, -71, -31,-124,-124, -31,-123, -89, -31,-122, -72, -31, +-124,-124, -31,-123, -89, -31,-122, -73, -31,-124,-124, -31,-123, -89, -31,-122, -74, -31,-124,-124, + -31,-123, -89, -31,-122, -75, -31,-124,-124, -31,-123, -89, -31,-122, -76, -31,-124,-124, -31,-123, + -89, -31,-122, -77, -31,-124,-124, -31,-123, -89, -31,-122, -78, -31,-124,-124, -31,-123, -89, -31, +-122, -79, -31,-124,-124, -31,-123, -89, -31,-122, -80, -31,-124,-124, -31,-123, -89, -31,-122, -81, + -31,-124,-124, -31,-123, -89, -31,-122, -82, -31,-124,-124, -31,-123, -89, -31,-122, -83, -31,-124, +-124, -31,-123, -89, -31,-122, -84, -31,-124,-124, -31,-123, -89, -31,-122, -85, -31,-124,-124, -31, +-123, -89, -31,-122, -86, -31,-124,-124, -31,-123, -89, -31,-122, -87, -31,-124,-124, -31,-123, -89, + -31,-122, -88, -31,-124,-124, -31,-123, -90, -31,-121,-126, -31,-124,-124, -31,-123, -90, -31,-121, +-127, -31,-124,-124, -31,-123, -90, -31,-121,-128, -31,-124,-124, -31,-123, -90, -31,-122, -65, -31, +-124,-124, -31,-123, -90, -31,-122, -66, -31,-124,-124, -31,-123, -90, -31,-122, -67, -31,-124,-124, + -31,-123, -90, -31,-122, -68, -31,-124,-124, -31,-123, -90, -31,-122, -69, -31,-124,-124, -31,-123, + -90, -31,-122, -70, -31,-124,-124, -31,-123, -90, -31,-122, -71, -31,-124,-124, -31,-123, -90, -31, +-122, -72, -31,-124,-124, -31,-123, -90, -31,-122, -73, -31,-124,-124, -31,-123, -90, -31,-122, -74, + -31,-124,-124, -31,-123, -90, -31,-122, -75, -31,-124,-124, -31,-123, -90, -31,-122, -76, -31,-124, +-124, -31,-123, -90, -31,-122, -77, -31,-124,-124, -31,-123, -90, -31,-122, -78, -31,-124,-124, -31, +-123, -90, -31,-122, -79, -31,-124,-124, -31,-123, -90, -31,-122, -80, -31,-124,-124, -31,-123, -90, + -31,-122, -81, -31,-124,-124, -31,-123, -90, -31,-122, -82, -31,-124,-124, -31,-123, -90, -31,-122, + -83, -31,-124,-124, -31,-123, -90, -31,-122, -84, -31,-124,-124, -31,-123, -90, -31,-122, -85, -31, +-124,-124, -31,-123, -90, -31,-122, -86, -31,-124,-124, -31,-123, -90, -31,-122, -87, -31,-124,-124, + -31,-123, -90, -31,-122, -88, -31,-124,-124, -31,-123, -91, -31,-121,-126, -31,-124,-124, -31,-123, + -91, -31,-121,-127, -31,-124,-124, -31,-123, -91, -31,-121,-128, -31,-124,-124, -31,-123, -91, -31, +-122, -65, -31,-124,-124, -31,-123, -91, -31,-122, -66, -31,-124,-124, -31,-123, -91, -31,-122, -67, + -31,-124,-124, -31,-123, -91, -31,-122, -68, -31,-124,-124, -31,-123, -91, -31,-122, -69, -31,-124, +-124, -31,-123, -91, -31,-122, -70, -31,-124,-124, -31,-123, -91, -31,-122, -71, -31,-124,-124, -31, +-123, -91, -31,-122, -72, -31,-124,-124, -31,-123, -91, -31,-122, -73, -31,-124,-124, -31,-123, -91, + -31,-122, -74, -31,-124,-124, -31,-123, -91, -31,-122, -75, -31,-124,-124, -31,-123, -91, -31,-122, + -76, -31,-124,-124, -31,-123, -91, -31,-122, -77, -31,-124,-124, -31,-123, -91, -31,-122, -78, -31, +-124,-124, -31,-123, -91, -31,-122, -79, -31,-124,-124, -31,-123, -91, -31,-122, -80, -31,-124,-124, + -31,-123, -91, -31,-122, -81, -31,-124,-124, -31,-123, -91, -31,-122, -82, -31,-124,-124, -31,-123, + -91, -31,-122, -83, -31,-124,-124, -31,-123, -91, -31,-122, -84, -31,-124,-124, -31,-123, -91, -31, +-122, -85, -31,-124,-124, -31,-123, -91, -31,-122, -86, -31,-124,-124, -31,-123, -91, -31,-122, -87, + -31,-124,-124, -31,-123, -91, -31,-122, -88, -31,-124,-124, -31,-123, -92, -31,-121,-126, -31,-124, +-124, -31,-123, -92, -31,-121,-127, -31,-124,-124, -31,-123, -92, -31,-121,-128, -31,-124,-124, -31, +-123, -92, -31,-122, -65, -31,-124,-124, -31,-123, -92, -31,-122, -66, -31,-124,-124, -31,-123, -92, + -31,-122, -67, -31,-124,-124, -31,-123, -92, -31,-122, -68, -31,-124,-124, -31,-123, -92, -31,-122, + -69, -31,-124,-124, -31,-123, -92, -31,-122, -70, -31,-124,-124, -31,-123, -92, -31,-122, -71, -31, +-124,-124, -31,-123, -92, -31,-122, -72, -31,-124,-124, -31,-123, -92, -31,-122, -73, -31,-124,-124, + -31,-123, -92, -31,-122, -74, -31,-124,-124, -31,-123, -92, -31,-122, -75, -31,-124,-124, -31,-123, + -92, -31,-122, -76, -31,-124,-124, -31,-123, -92, -31,-122, -77, -31,-124,-124, -31,-123, -92, -31, +-122, -78, -31,-124,-124, -31,-123, -92, -31,-122, -79, -31,-124,-124, -31,-123, -92, -31,-122, -80, + -31,-124,-124, -31,-123, -92, -31,-122, -81, -31,-124,-124, -31,-123, -92, -31,-122, -82, -31,-124, +-124, -31,-123, -92, -31,-122, -83, -31,-124,-124, -31,-123, -92, -31,-122, -84, -31,-124,-124, -31, +-123, -92, -31,-122, -85, -31,-124,-124, -31,-123, -92, -31,-122, -86, -31,-124,-124, -31,-123, -92, + -31,-122, -87, -31,-124,-124, -31,-123, -92, -31,-122, -88, -31,-124,-124, -31,-123, -93, -31,-121, +-126, -31,-124,-124, -31,-123, -93, -31,-121,-127, -31,-124,-124, -31,-123, -93, -31,-121,-128, -31, +-124,-124, -31,-123, -93, -31,-122, -65, -31,-124,-124, -31,-123, -93, -31,-122, -66, -31,-124,-124, + -31,-123, -93, -31,-122, -67, -31,-124,-124, -31,-123, -93, -31,-122, -68, -31,-124,-124, -31,-123, + -93, -31,-122, -69, -31,-124,-124, -31,-123, -93, -31,-122, -70, -31,-124,-124, -31,-123, -93, -31, +-122, -71, -31,-124,-124, -31,-123, -93, -31,-122, -72, -31,-124,-124, -31,-123, -93, -31,-122, -73, + -31,-124,-124, -31,-123, -93, -31,-122, -74, -31,-124,-124, -31,-123, -93, -31,-122, -75, -31,-124, +-124, -31,-123, -93, -31,-122, -76, -31,-124,-124, -31,-123, -93, -31,-122, -77, -31,-124,-124, -31, +-123, -93, -31,-122, -78, -31,-124,-124, -31,-123, -93, -31,-122, -79, -31,-124,-124, -31,-123, -93, + -31,-122, -80, -31,-124,-124, -31,-123, -93, -31,-122, -81, -31,-124,-124, -31,-123, -93, -31,-122, + -82, -31,-124,-124, -31,-123, -93, -31,-122, -83, -31,-124,-124, -31,-123, -93, -31,-122, -84, -31, +-124,-124, -31,-123, -93, -31,-122, -85, -31,-124,-124, -31,-123, -93, -31,-122, -86, -31,-124,-124, + -31,-123, -93, -31,-122, -87, -31,-124,-124, -31,-123, -93, -31,-122, -88, -31,-124,-124, -31,-123, + -94, -31,-121,-126, -31,-124,-124, -31,-123, -94, -31,-121,-127, -31,-124,-124, -31,-123, -94, -31, +-121,-128, -31,-124,-124, -31,-123, -94, -31,-122, -65, -31,-124,-124, -31,-123, -94, -31,-122, -66, + -31,-124,-124, -31,-123, -94, -31,-122, -67, -31,-124,-124, -31,-123, -94, -31,-122, -68, -31,-124, +-124, -31,-123, -94, -31,-122, -69, -31,-124,-124, -31,-123, -94, -31,-122, -70, -31,-124,-124, -31, +-123, -94, -31,-122, -71, -31,-124,-124, -31,-123, -94, -31,-122, -72, -31,-124,-124, -31,-123, -94, + -31,-122, -73, -31,-124,-124, -31,-123, -94, -31,-122, -74, -31,-124,-124, -31,-123, -94, -31,-122, + -75, -31,-124,-124, -31,-123, -94, -31,-122, -76, -31,-124,-124, -31,-123, -94, -31,-122, -77, -31, +-124,-124, -31,-123, -94, -31,-122, -78, -31,-124,-124, -31,-123, -94, -31,-122, -79, -31,-124,-124, + -31,-123, -94, -31,-122, -80, -31,-124,-124, -31,-123, -94, -31,-122, -81, -31,-124,-124, -31,-123, + -94, -31,-122, -82, -31,-124,-124, -31,-123, -94, -31,-122, -83, -31,-124,-124, -31,-123, -94, -31, +-122, -84, -31,-124,-124, -31,-123, -94, -31,-122, -85, -31,-124,-124, -31,-123, -94, -31,-122, -86, + -31,-124,-124, -31,-123, -94, -31,-122, -87, -31,-124,-124, -31,-123, -94, -31,-122, -88, -31,-124, +-124, -31,-123, -95, -31,-121,-126, -31,-124,-124, -31,-123, -95, -31,-121,-127, -31,-124,-124, -31, +-123, -95, -31,-121,-128, -31,-124,-124, -31,-123, -95, -31,-122, -65, -31,-124,-124, -31,-123, -95, + -31,-122, -66, -31,-124,-124, -31,-123, -95, -31,-122, -67, -31,-124,-124, -31,-123, -95, -31,-122, + -68, -31,-124,-124, -31,-123, -95, -31,-122, -69, -31,-124,-124, -31,-123, -95, -31,-122, -70, -31, +-124,-124, -31,-123, -95, -31,-122, -71, -31,-124,-124, -31,-123, -95, -31,-122, -72, -31,-124,-124, + -31,-123, -95, -31,-122, -73, -31,-124,-124, -31,-123, -95, -31,-122, -74, -31,-124,-124, -31,-123, + -95, -31,-122, -75, -31,-124,-124, -31,-123, -95, -31,-122, -76, -31,-124,-124, -31,-123, -95, -31, +-122, -77, -31,-124,-124, -31,-123, -95, -31,-122, -78, -31,-124,-124, -31,-123, -95, -31,-122, -79, + -31,-124,-124, -31,-123, -95, -31,-122, -80, -31,-124,-124, -31,-123, -95, -31,-122, -81, -31,-124, +-124, -31,-123, -95, -31,-122, -82, -31,-124,-124, -31,-123, -95, -31,-122, -83, -31,-124,-124, -31, +-123, -95, -31,-122, -84, -31,-124,-124, -31,-123, -95, -31,-122, -85, -31,-124,-124, -31,-123, -95, + -31,-122, -86, -31,-124,-124, -31,-123, -95, -31,-122, -87, -31,-124,-124, -31,-123, -95, -31,-122, + -88, -31,-124,-125, -31,-123, -75, -31,-121,-126, -31,-124,-125, -31,-123, -75, -31,-121,-127, -31, +-124,-125, -31,-123, -75, -31,-121,-128, -31,-124,-125, -31,-123, -75, -31,-122, -65, -31,-124,-125, + -31,-123, -75, -31,-122, -66, -31,-124,-125, -31,-123, -75, -31,-122, -67, -31,-124,-125, -31,-123, + -75, -31,-122, -68, -31,-124,-125, -31,-123, -75, -31,-122, -69, -31,-124,-125, -31,-123, -75, -31, +-122, -70, -31,-124,-125, -31,-123, -75, -31,-122, -71, -31,-124,-125, -31,-123, -75, -31,-122, -72, + -31,-124,-125, -31,-123, -75, -31,-122, -73, -31,-124,-125, -31,-123, -75, -31,-122, -74, -31,-124, +-125, -31,-123, -75, -31,-122, -75, -31,-124,-125, -31,-123, -75, -31,-122, -76, -31,-124,-125, -31, +-123, -75, -31,-122, -77, -31,-124,-125, -31,-123, -75, -31,-122, -78, -31,-124,-125, -31,-123, -75, + -31,-122, -79, -31,-124,-125, -31,-123, -75, -31,-122, -80, -31,-124,-125, -31,-123, -75, -31,-122, + -81, -31,-124,-125, -31,-123, -75, -31,-122, -82, -31,-124,-125, -31,-123, -75, -31,-122, -83, -31, +-124,-125, -31,-123, -75, -31,-122, -84, -31,-124,-125, -31,-123, -75, -31,-122, -85, -31,-124,-125, + -31,-123, -75, -31,-122, -86, -31,-124,-125, -31,-123, -75, -31,-122, -87, -31,-124,-125, -31,-123, + -75, -31,-122, -88, -31,-124,-125, -31,-123, -76, -31,-121,-126, -31,-124,-125, -31,-123, -76, -31, +-121,-127, -31,-124,-125, -31,-123, -76, -31,-121,-128, -31,-124,-125, -31,-123, -76, -31,-122, -65, + -31,-124,-125, -31,-123, -76, -31,-122, -66, -31,-124,-125, -31,-123, -76, -31,-122, -67, -31,-124, +-125, -31,-123, -76, -31,-122, -68, -31,-124,-125, -31,-123, -76, -31,-122, -69, -31,-124,-125, -31, +-123, -76, -31,-122, -70, -31,-124,-125, -31,-123, -76, -31,-122, -71, -31,-124,-125, -31,-123, -76, + -31,-122, -72, -31,-124,-125, -31,-123, -76, -31,-122, -73, -31,-124,-125, -31,-123, -76, -31,-122, + -74, -31,-124,-125, -31,-123, -76, -31,-122, -75, -31,-124,-125, -31,-123, -76, -31,-122, -76, -31, +-124,-125, -31,-123, -76, -31,-122, -77, -31,-124,-125, -31,-123, -76, -31,-122, -78, -31,-124,-125, + -31,-123, -76, -31,-122, -79, -31,-124,-125, -31,-123, -76, -31,-122, -80, -31,-124,-125, -31,-123, + -76, -31,-122, -81, -31,-124,-125, -31,-123, -76, -31,-122, -82, -31,-124,-125, -31,-123, -76, -31, +-122, -83, -31,-124,-125, -31,-123, -76, -31,-122, -84, -31,-124,-125, -31,-123, -76, -31,-122, -85, + -31,-124,-125, -31,-123, -76, -31,-122, -86, -31,-124,-125, -31,-123, -76, -31,-122, -87, -31,-124, +-125, -31,-123, -76, -31,-122, -88, -31,-124,-125, -31,-123, -77, -31,-121,-126, -31,-124,-125, -31, +-123, -77, -31,-121,-127, -31,-124,-125, -31,-123, -77, -31,-121,-128, -31,-124,-125, -31,-123, -77, + -31,-122, -65, -31,-124,-125, -31,-123, -77, -31,-122, -66, -31,-124,-125, -31,-123, -77, -31,-122, + -67, -31,-124,-125, -31,-123, -77, -31,-122, -68, -31,-124,-125, -31,-123, -77, -31,-122, -69, -31, +-124,-125, -31,-123, -77, -31,-122, -70, -31,-124,-125, -31,-123, -77, -31,-122, -71, -31,-124,-125, + -31,-123, -77, -31,-122, -72, -31,-124,-125, -31,-123, -77, -31,-122, -73, -31,-124,-125, -31,-123, + -77, -31,-122, -74, -31,-124,-125, -31,-123, -77, -31,-122, -75, -31,-124,-125, -31,-123, -77, -31, +-122, -76, -31,-124,-125, -31,-123, -77, -31,-122, -77, -31,-124,-125, -31,-123, -77, -31,-122, -78, + -31,-124,-125, -31,-123, -77, -31,-122, -79, -31,-124,-125, -31,-123, -77, -31,-122, -80, -31,-124, +-125, -31,-123, -77, -31,-122, -81, -31,-124,-125, -31,-123, -77, -31,-122, -82, -31,-124,-125, -31, +-123, -77, -31,-122, -83, -31,-124,-125, -31,-123, -77, -31,-122, -84, -31,-124,-125, -31,-123, -77, + -31,-122, -85, -31,-124,-125, -31,-123, -77, -31,-122, -86, -31,-124,-125, -31,-123, -77, -31,-122, + -87, -31,-124,-125, -31,-123, -77, -31,-122, -88, -31,-124,-125, -31,-123, -78, -31,-121,-126, -31, +-124,-125, -31,-123, -78, -31,-121,-127, -31,-124,-125, -31,-123, -78, -31,-121,-128, -31,-124,-125, + -31,-123, -78, -31,-122, -65, -31,-124,-125, -31,-123, -78, -31,-122, -66, -31,-124,-125, -31,-123, + -78, -31,-122, -67, -31,-124,-125, -31,-123, -78, -31,-122, -68, -31,-124,-125, -31,-123, -78, -31, +-122, -69, -31,-124,-125, -31,-123, -78, -31,-122, -70, -31,-124,-125, -31,-123, -78, -31,-122, -71, + -31,-124,-125, -31,-123, -78, -31,-122, -72, -31,-124,-125, -31,-123, -78, -31,-122, -73, -31,-124, +-125, -31,-123, -78, -31,-122, -74, -31,-124,-125, -31,-123, -78, -31,-122, -75, -31,-124,-125, -31, +-123, -78, -31,-122, -76, -31,-124,-125, -31,-123, -78, -31,-122, -77, -31,-124,-125, -31,-123, -78, + -31,-122, -78, -31,-124,-125, -31,-123, -78, -31,-122, -79, -31,-124,-125, -31,-123, -78, -31,-122, + -80, -31,-124,-125, -31,-123, -78, -31,-122, -81, -31,-124,-125, -31,-123, -78, -31,-122, -82, -31, +-124,-125, -31,-123, -78, -31,-122, -83, -31,-124,-125, -31,-123, -78, -31,-122, -84, -31,-124,-125, + -31,-123, -78, -31,-122, -85, -31,-124,-125, -31,-123, -78, -31,-122, -86, -31,-124,-125, -31,-123, + -78, -31,-122, -87, -31,-124,-125, -31,-123, -78, -31,-122, -88, -31,-124,-125, -31,-123, -79, -31, +-121,-126, -31,-124,-125, -31,-123, -79, -31,-121,-127, -31,-124,-125, -31,-123, -79, -31,-121,-128, + -31,-124,-125, -31,-123, -79, -31,-122, -65, -31,-124,-125, -31,-123, -79, -31,-122, -66, -31,-124, +-125, -31,-123, -79, -31,-122, -67, -31,-124,-125, -31,-123, -79, -31,-122, -68, -31,-124,-125, -31, +-123, -79, -31,-122, -69, -31,-124,-125, -31,-123, -79, -31,-122, -70, -31,-124,-125, -31,-123, -79, + -31,-122, -71, -31,-124,-125, -31,-123, -79, -31,-122, -72, -31,-124,-125, -31,-123, -79, -31,-122, + -73, -31,-124,-125, -31,-123, -79, -31,-122, -74, -31,-124,-125, -31,-123, -79, -31,-122, -75, -31, +-124,-125, -31,-123, -79, -31,-122, -76, -31,-124,-125, -31,-123, -79, -31,-122, -77, -31,-124,-125, + -31,-123, -79, -31,-122, -78, -31,-124,-125, -31,-123, -79, -31,-122, -79, -31,-124,-125, -31,-123, + -79, -31,-122, -80, -31,-124,-125, -31,-123, -79, -31,-122, -81, -31,-124,-125, -31,-123, -79, -31, +-122, -82, -31,-124,-125, -31,-123, -79, -31,-122, -83, -31,-124,-125, -31,-123, -79, -31,-122, -84, + -31,-124,-125, -31,-123, -79, -31,-122, -85, -31,-124,-125, -31,-123, -79, -31,-122, -86, -31,-124, +-125, -31,-123, -79, -31,-122, -87, -31,-124,-125, -31,-123, -79, -31,-122, -88, -31,-124,-125, -31, +-123, -80, -31,-121,-126, -31,-124,-125, -31,-123, -80, -31,-121,-127, -31,-124,-125, -31,-123, -80, + -31,-121,-128, -31,-124,-125, -31,-123, -80, -31,-122, -65, -31,-124,-125, -31,-123, -80, -31,-122, + -66, -31,-124,-125, -31,-123, -80, -31,-122, -67, -31,-124,-125, -31,-123, -80, -31,-122, -68, -31, +-124,-125, -31,-123, -80, -31,-122, -69, -31,-124,-125, -31,-123, -80, -31,-122, -70, -31,-124,-125, + -31,-123, -80, -31,-122, -71, -31,-124,-125, -31,-123, -80, -31,-122, -72, -31,-124,-125, -31,-123, + -80, -31,-122, -73, -31,-124,-125, -31,-123, -80, -31,-122, -74, -31,-124,-125, -31,-123, -80, -31, +-122, -75, -31,-124,-125, -31,-123, -80, -31,-122, -76, -31,-124,-125, -31,-123, -80, -31,-122, -77, + -31,-124,-125, -31,-123, -80, -31,-122, -78, -31,-124,-125, -31,-123, -80, -31,-122, -79, -31,-124, +-125, -31,-123, -80, -31,-122, -80, -31,-124,-125, -31,-123, -80, -31,-122, -81, -31,-124,-125, -31, +-123, -80, -31,-122, -82, -31,-124,-125, -31,-123, -80, -31,-122, -83, -31,-124,-125, -31,-123, -80, + -31,-122, -84, -31,-124,-125, -31,-123, -80, -31,-122, -85, -31,-124,-125, -31,-123, -80, -31,-122, + -86, -31,-124,-125, -31,-123, -80, -31,-122, -87, -31,-124,-125, -31,-123, -80, -31,-122, -88, -31, +-124,-125, -31,-123, -81, -31,-121,-126, -31,-124,-125, -31,-123, -81, -31,-121,-127, -31,-124,-125, + -31,-123, -81, -31,-121,-128, -31,-124,-125, -31,-123, -81, -31,-122, -65, -31,-124,-125, -31,-123, + -81, -31,-122, -66, -31,-124,-125, -31,-123, -81, -31,-122, -67, -31,-124,-125, -31,-123, -81, -31, +-122, -68, -31,-124,-125, -31,-123, -81, -31,-122, -69, -31,-124,-125, -31,-123, -81, -31,-122, -70, + -31,-124,-125, -31,-123, -81, -31,-122, -71, -31,-124,-125, -31,-123, -81, -31,-122, -72, -31,-124, +-125, -31,-123, -81, -31,-122, -73, -31,-124,-125, -31,-123, -81, -31,-122, -74, -31,-124,-125, -31, +-123, -81, -31,-122, -75, -31,-124,-125, -31,-123, -81, -31,-122, -76, -31,-124,-125, -31,-123, -81, + -31,-122, -77, -31,-124,-125, -31,-123, -81, -31,-122, -78, -31,-124,-125, -31,-123, -81, -31,-122, + -79, -31,-124,-125, -31,-123, -81, -31,-122, -80, -31,-124,-125, -31,-123, -81, -31,-122, -81, -31, +-124,-125, -31,-123, -81, -31,-122, -82, -31,-124,-125, -31,-123, -81, -31,-122, -83, -31,-124,-125, + -31,-123, -81, -31,-122, -84, -31,-124,-125, -31,-123, -81, -31,-122, -85, -31,-124,-125, -31,-123, + -81, -31,-122, -86, -31,-124,-125, -31,-123, -81, -31,-122, -87, -31,-124,-125, -31,-123, -81, -31, +-122, -88, -31,-124,-125, -31,-123, -82, -31,-121,-126, -31,-124,-125, -31,-123, -82, -31,-121,-127, + -31,-124,-125, -31,-123, -82, -31,-121,-128, -31,-124,-125, -31,-123, -82, -31,-122, -65, -31,-124, +-125, -31,-123, -82, -31,-122, -66, -31,-124,-125, -31,-123, -82, -31,-122, -67, -31,-124,-125, -31, +-123, -82, -31,-122, -68, -31,-124,-125, -31,-123, -82, -31,-122, -69, -31,-124,-125, -31,-123, -82, + -31,-122, -70, -31,-124,-125, -31,-123, -82, -31,-122, -71, -31,-124,-125, -31,-123, -82, -31,-122, + -72, -31,-124,-125, -31,-123, -82, -31,-122, -73, -31,-124,-125, -31,-123, -82, -31,-122, -74, -31, +-124,-125, -31,-123, -82, -31,-122, -75, -31,-124,-125, -31,-123, -82, -31,-122, -76, -31,-124,-125, + -31,-123, -82, -31,-122, -77, -31,-124,-125, -31,-123, -82, -31,-122, -78, -31,-124,-125, -31,-123, + -82, -31,-122, -79, -31,-124,-125, -31,-123, -82, -31,-122, -80, -31,-124,-125, -31,-123, -82, -31, +-122, -81, -31,-124,-125, -31,-123, -82, -31,-122, -82, -31,-124,-125, -31,-123, -82, -31,-122, -83, + -31,-124,-125, -31,-123, -82, -31,-122, -84, -31,-124,-125, -31,-123, -82, -31,-122, -85, -31,-124, +-125, -31,-123, -82, -31,-122, -86, -31,-124,-125, -31,-123, -82, -31,-122, -87, -31,-124,-125, -31, +-123, -82, -31,-122, -88, -31,-124,-125, -31,-123, -83, -31,-121,-126, -31,-124,-125, -31,-123, -83, + -31,-121,-127, -31,-124,-125, -31,-123, -83, -31,-121,-128, -31,-124,-125, -31,-123, -83, -31,-122, + -65, -31,-124,-125, -31,-123, -83, -31,-122, -66, -31,-124,-125, -31,-123, -83, -31,-122, -67, -31, +-124,-125, -31,-123, -83, -31,-122, -68, -31,-124,-125, -31,-123, -83, -31,-122, -69, -31,-124,-125, + -31,-123, -83, -31,-122, -70, -31,-124,-125, -31,-123, -83, -31,-122, -71, -31,-124,-125, -31,-123, + -83, -31,-122, -72, -31,-124,-125, -31,-123, -83, -31,-122, -73, -31,-124,-125, -31,-123, -83, -31, +-122, -74, -31,-124,-125, -31,-123, -83, -31,-122, -75, -31,-124,-125, -31,-123, -83, -31,-122, -76, + -31,-124,-125, -31,-123, -83, -31,-122, -77, -31,-124,-125, -31,-123, -83, -31,-122, -78, -31,-124, +-125, -31,-123, -83, -31,-122, -79, -31,-124,-125, -31,-123, -83, -31,-122, -80, -31,-124,-125, -31, +-123, -83, -31,-122, -81, -31,-124,-125, -31,-123, -83, -31,-122, -82, -31,-124,-125, -31,-123, -83, + -31,-122, -83, -31,-124,-125, -31,-123, -83, -31,-122, -84, -31,-124,-125, -31,-123, -83, -31,-122, + -85, -31,-124,-125, -31,-123, -83, -31,-122, -86, -31,-124,-125, -31,-123, -83, -31,-122, -87, -31, +-124,-125, -31,-123, -83, -31,-122, -88, -31,-124,-125, -31,-123, -84, -31,-121,-126, -31,-124,-125, + -31,-123, -84, -31,-121,-127, -31,-124,-125, -31,-123, -84, -31,-121,-128, -31,-124,-125, -31,-123, + -84, -31,-122, -65, -31,-124,-125, -31,-123, -84, -31,-122, -66, -31,-124,-125, -31,-123, -84, -31, +-122, -67, -31,-124,-125, -31,-123, -84, -31,-122, -68, -31,-124,-125, -31,-123, -84, -31,-122, -69, + -31,-124,-125, -31,-123, -84, -31,-122, -70, -31,-124,-125, -31,-123, -84, -31,-122, -71, -31,-124, +-125, -31,-123, -84, -31,-122, -72, -31,-124,-125, -31,-123, -84, -31,-122, -73, -31,-124,-125, -31, +-123, -84, -31,-122, -74, -31,-124,-125, -31,-123, -84, -31,-122, -75, -31,-124,-125, -31,-123, -84, + -31,-122, -76, -31,-124,-125, -31,-123, -84, -31,-122, -77, -31,-124,-125, -31,-123, -84, -31,-122, + -78, -31,-124,-125, -31,-123, -84, -31,-122, -79, -31,-124,-125, -31,-123, -84, -31,-122, -80, -31, +-124,-125, -31,-123, -84, -31,-122, -81, -31,-124,-125, -31,-123, -84, -31,-122, -82, -31,-124,-125, + -31,-123, -84, -31,-122, -83, -31,-124,-125, -31,-123, -84, -31,-122, -84, -31,-124,-125, -31,-123, + -84, -31,-122, -85, -31,-124,-125, -31,-123, -84, -31,-122, -86, -31,-124,-125, -31,-123, -84, -31, +-122, -87, -31,-124,-125, -31,-123, -84, -31,-122, -88, -31,-124,-125, -31,-123, -85, -31,-121,-126, + -31,-124,-125, -31,-123, -85, -31,-121,-127, -31,-124,-125, -31,-123, -85, -31,-121,-128, -31,-124, +-125, -31,-123, -85, -31,-122, -65, -31,-124,-125, -31,-123, -85, -31,-122, -66, -31,-124,-125, -31, +-123, -85, -31,-122, -67, -31,-124,-125, -31,-123, -85, -31,-122, -68, -31,-124,-125, -31,-123, -85, + -31,-122, -69, -31,-124,-125, -31,-123, -85, -31,-122, -70, -31,-124,-125, -31,-123, -85, -31,-122, + -71, -31,-124,-125, -31,-123, -85, -31,-122, -72, -31,-124,-125, -31,-123, -85, -31,-122, -73, -31, +-124,-125, -31,-123, -85, -31,-122, -74, -31,-124,-125, -31,-123, -85, -31,-122, -75, -31,-124,-125, + -31,-123, -85, -31,-122, -76, -31,-124,-125, -31,-123, -85, -31,-122, -77, -31,-124,-125, -31,-123, + -85, -31,-122, -78, -31,-124,-125, -31,-123, -85, -31,-122, -79, -31,-124,-125, -31,-123, -85, -31, +-122, -80, -31,-124,-125, -31,-123, -85, -31,-122, -81, -31,-124,-125, -31,-123, -85, -31,-122, -82, + -31,-124,-125, -31,-123, -85, -31,-122, -83, -31,-124,-125, -31,-123, -85, -31,-122, -84, -31,-124, +-125, -31,-123, -85, -31,-122, -85, -31,-124,-125, -31,-123, -85, -31,-122, -86, -31,-124,-125, -31, +-123, -85, -31,-122, -87, -31,-124,-125, -31,-123, -85, -31,-122, -88, -31,-124,-125, -31,-123, -86, + -31,-121,-126, -31,-124,-125, -31,-123, -86, -31,-121,-127, -31,-124,-125, -31,-123, -86, -31,-121, +-128, -31,-124,-125, -31,-123, -86, -31,-122, -65, -31,-124,-125, -31,-123, -86, -31,-122, -66, -31, +-124,-125, -31,-123, -86, -31,-122, -67, -31,-124,-125, -31,-123, -86, -31,-122, -68, -31,-124,-125, + -31,-123, -86, -31,-122, -69, -31,-124,-125, -31,-123, -86, -31,-122, -70, -31,-124,-125, -31,-123, + -86, -31,-122, -71, -31,-124,-125, -31,-123, -86, -31,-122, -72, -31,-124,-125, -31,-123, -86, -31, +-122, -73, -31,-124,-125, -31,-123, -86, -31,-122, -74, -31,-124,-125, -31,-123, -86, -31,-122, -75, + -31,-124,-125, -31,-123, -86, -31,-122, -76, -31,-124,-125, -31,-123, -86, -31,-122, -77, -31,-124, +-125, -31,-123, -86, -31,-122, -78, -31,-124,-125, -31,-123, -86, -31,-122, -79, -31,-124,-125, -31, +-123, -86, -31,-122, -80, -31,-124,-125, -31,-123, -86, -31,-122, -81, -31,-124,-125, -31,-123, -86, + -31,-122, -82, -31,-124,-125, -31,-123, -86, -31,-122, -83, -31,-124,-125, -31,-123, -86, -31,-122, + -84, -31,-124,-125, -31,-123, -86, -31,-122, -85, -31,-124,-125, -31,-123, -86, -31,-122, -86, -31, +-124,-125, -31,-123, -86, -31,-122, -87, -31,-124,-125, -31,-123, -86, -31,-122, -88, -31,-124,-125, + -31,-123, -87, -31,-121,-126, -31,-124,-125, -31,-123, -87, -31,-121,-127, -31,-124,-125, -31,-123, + -87, -31,-121,-128, -31,-124,-125, -31,-123, -87, -31,-122, -65, -31,-124,-125, -31,-123, -87, -31, +-122, -66, -31,-124,-125, -31,-123, -87, -31,-122, -67, -31,-124,-125, -31,-123, -87, -31,-122, -68, + -31,-124,-125, -31,-123, -87, -31,-122, -69, -31,-124,-125, -31,-123, -87, -31,-122, -70, -31,-124, +-125, -31,-123, -87, -31,-122, -71, -31,-124,-125, -31,-123, -87, -31,-122, -72, -31,-124,-125, -31, +-123, -87, -31,-122, -73, -31,-124,-125, -31,-123, -87, -31,-122, -74, -31,-124,-125, -31,-123, -87, + -31,-122, -75, -31,-124,-125, -31,-123, -87, -31,-122, -76, -31,-124,-125, -31,-123, -87, -31,-122, + -77, -31,-124,-125, -31,-123, -87, -31,-122, -78, -31,-124,-125, -31,-123, -87, -31,-122, -79, -31, +-124,-125, -31,-123, -87, -31,-122, -80, -31,-124,-125, -31,-123, -87, -31,-122, -81, -31,-124,-125, + -31,-123, -87, -31,-122, -82, -31,-124,-125, -31,-123, -87, -31,-122, -83, -31,-124,-125, -31,-123, + -87, -31,-122, -84, -31,-124,-125, -31,-123, -87, -31,-122, -85, -31,-124,-125, -31,-123, -87, -31, +-122, -86, -31,-124,-125, -31,-123, -87, -31,-122, -87, -31,-124,-125, -31,-123, -87, -31,-122, -88, + -31,-124,-125, -31,-123, -88, -31,-121,-126, -31,-124,-125, -31,-123, -88, -31,-121,-127, -31,-124, +-125, -31,-123, -88, -31,-121,-128, -31,-124,-125, -31,-123, -88, -31,-122, -65, -31,-124,-125, -31, +-123, -88, -31,-122, -66, -31,-124,-125, -31,-123, -88, -31,-122, -67, -31,-124,-125, -31,-123, -88, + -31,-122, -68, -31,-124,-125, -31,-123, -88, -31,-122, -69, -31,-124,-125, -31,-123, -88, -31,-122, + -70, -31,-124,-125, -31,-123, -88, -31,-122, -71, -31,-124,-125, -31,-123, -88, -31,-122, -72, -31, +-124,-125, -31,-123, -88, -31,-122, -73, -31,-124,-125, -31,-123, -88, -31,-122, -74, -31,-124,-125, + -31,-123, -88, -31,-122, -75, -31,-124,-125, -31,-123, -88, -31,-122, -76, -31,-124,-125, -31,-123, + -88, -31,-122, -77, -31,-124,-125, -31,-123, -88, -31,-122, -78, -31,-124,-125, -31,-123, -88, -31, +-122, -79, -31,-124,-125, -31,-123, -88, -31,-122, -80, -31,-124,-125, -31,-123, -88, -31,-122, -81, + -31,-124,-125, -31,-123, -88, -31,-122, -82, -31,-124,-125, -31,-123, -88, -31,-122, -83, -31,-124, +-125, -31,-123, -88, -31,-122, -84, -31,-124,-125, -31,-123, -88, -31,-122, -85, -31,-124,-125, -31, +-123, -88, -31,-122, -86, -31,-124,-125, -31,-123, -88, -31,-122, -87, -31,-124,-125, -31,-123, -88, + -31,-122, -88, -31,-124,-125, -31,-123, -89, -31,-121,-126, -31,-124,-125, -31,-123, -89, -31,-121, +-127, -31,-124,-125, -31,-123, -89, -31,-121,-128, -31,-124,-125, -31,-123, -89, -31,-122, -65, -31, +-124,-125, -31,-123, -89, -31,-122, -66, -31,-124,-125, -31,-123, -89, -31,-122, -67, -31,-124,-125, + -31,-123, -89, -31,-122, -68, -31,-124,-125, -31,-123, -89, -31,-122, -69, -31,-124,-125, -31,-123, + -89, -31,-122, -70, -31,-124,-125, -31,-123, -89, -31,-122, -71, -31,-124,-125, -31,-123, -89, -31, +-122, -72, -31,-124,-125, -31,-123, -89, -31,-122, -73, -31,-124,-125, -31,-123, -89, -31,-122, -74, + -31,-124,-125, -31,-123, -89, -31,-122, -75, -31,-124,-125, -31,-123, -89, -31,-122, -76, -31,-124, +-125, -31,-123, -89, -31,-122, -77, -31,-124,-125, -31,-123, -89, -31,-122, -78, -31,-124,-125, -31, +-123, -89, -31,-122, -79, -31,-124,-125, -31,-123, -89, -31,-122, -80, -31,-124,-125, -31,-123, -89, + -31,-122, -81, -31,-124,-125, -31,-123, -89, -31,-122, -82, -31,-124,-125, -31,-123, -89, -31,-122, + -83, -31,-124,-125, -31,-123, -89, -31,-122, -84, -31,-124,-125, -31,-123, -89, -31,-122, -85, -31, +-124,-125, -31,-123, -89, -31,-122, -86, -31,-124,-125, -31,-123, -89, -31,-122, -87, -31,-124,-125, + -31,-123, -89, -31,-122, -88, -31,-124,-125, -31,-123, -90, -31,-121,-126, -31,-124,-125, -31,-123, + -90, -31,-121,-127, -31,-124,-125, -31,-123, -90, -31,-121,-128, -31,-124,-125, -31,-123, -90, -31, +-122, -65, -31,-124,-125, -31,-123, -90, -31,-122, -66, -31,-124,-125, -31,-123, -90, -31,-122, -67, + -31,-124,-125, -31,-123, -90, -31,-122, -68, -31,-124,-125, -31,-123, -90, -31,-122, -69, -31,-124, +-125, -31,-123, -90, -31,-122, -70, -31,-124,-125, -31,-123, -90, -31,-122, -71, -31,-124,-125, -31, +-123, -90, -31,-122, -72, -31,-124,-125, -31,-123, -90, -31,-122, -73, -31,-124,-125, -31,-123, -90, + -31,-122, -74, -31,-124,-125, -31,-123, -90, -31,-122, -75, -31,-124,-125, -31,-123, -90, -31,-122, + -76, -31,-124,-125, -31,-123, -90, -31,-122, -77, -31,-124,-125, -31,-123, -90, -31,-122, -78, -31, +-124,-125, -31,-123, -90, -31,-122, -79, -31,-124,-125, -31,-123, -90, -31,-122, -80, -31,-124,-125, + -31,-123, -90, -31,-122, -81, -31,-124,-125, -31,-123, -90, -31,-122, -82, -31,-124,-125, -31,-123, + -90, -31,-122, -83, -31,-124,-125, -31,-123, -90, -31,-122, -84, -31,-124,-125, -31,-123, -90, -31, +-122, -85, -31,-124,-125, -31,-123, -90, -31,-122, -86, -31,-124,-125, -31,-123, -90, -31,-122, -87, + -31,-124,-125, -31,-123, -90, -31,-122, -88, -31,-124,-125, -31,-123, -91, -31,-121,-126, -31,-124, +-125, -31,-123, -91, -31,-121,-127, -31,-124,-125, -31,-123, -91, -31,-121,-128, -31,-124,-125, -31, +-123, -91, -31,-122, -65, -31,-124,-125, -31,-123, -91, -31,-122, -66, -31,-124,-125, -31,-123, -91, + -31,-122, -67, -31,-124,-125, -31,-123, -91, -31,-122, -68, -31,-124,-125, -31,-123, -91, -31,-122, + -69, -31,-124,-125, -31,-123, -91, -31,-122, -70, -31,-124,-125, -31,-123, -91, -31,-122, -71, -31, +-124,-125, -31,-123, -91, -31,-122, -72, -31,-124,-125, -31,-123, -91, -31,-122, -73, -31,-124,-125, + -31,-123, -91, -31,-122, -74, -31,-124,-125, -31,-123, -91, -31,-122, -75, -31,-124,-125, -31,-123, + -91, -31,-122, -76, -31,-124,-125, -31,-123, -91, -31,-122, -77, -31,-124,-125, -31,-123, -91, -31, +-122, -78, -31,-124,-125, -31,-123, -91, -31,-122, -79, -31,-124,-125, -31,-123, -91, -31,-122, -80, + -31,-124,-125, -31,-123, -91, -31,-122, -81, -31,-124,-125, -31,-123, -91, -31,-122, -82, -31,-124, +-125, -31,-123, -91, -31,-122, -83, -31,-124,-125, -31,-123, -91, -31,-122, -84, -31,-124,-125, -31, +-123, -91, -31,-122, -85, -31,-124,-125, -31,-123, -91, -31,-122, -86, -31,-124,-125, -31,-123, -91, + -31,-122, -87, -31,-124,-125, -31,-123, -91, -31,-122, -88, -31,-124,-125, -31,-123, -92, -31,-121, +-126, -31,-124,-125, -31,-123, -92, -31,-121,-127, -31,-124,-125, -31,-123, -92, -31,-121,-128, -31, +-124,-125, -31,-123, -92, -31,-122, -65, -31,-124,-125, -31,-123, -92, -31,-122, -66, -31,-124,-125, + -31,-123, -92, -31,-122, -67, -31,-124,-125, -31,-123, -92, -31,-122, -68, -31,-124,-125, -31,-123, + -92, -31,-122, -69, -31,-124,-125, -31,-123, -92, -31,-122, -70, -31,-124,-125, -31,-123, -92, -31, +-122, -71, -31,-124,-125, -31,-123, -92, -31,-122, -72, -31,-124,-125, -31,-123, -92, -31,-122, -73, + -31,-124,-125, -31,-123, -92, -31,-122, -74, -31,-124,-125, -31,-123, -92, -31,-122, -75, -31,-124, +-125, -31,-123, -92, -31,-122, -76, -31,-124,-125, -31,-123, -92, -31,-122, -77, -31,-124,-125, -31, +-123, -92, -31,-122, -78, -31,-124,-125, -31,-123, -92, -31,-122, -79, -31,-124,-125, -31,-123, -92, + -31,-122, -80, -31,-124,-125, -31,-123, -92, -31,-122, -81, -31,-124,-125, -31,-123, -92, -31,-122, + -82, -31,-124,-125, -31,-123, -92, -31,-122, -83, -31,-124,-125, -31,-123, -92, -31,-122, -84, -31, +-124,-125, -31,-123, -92, -31,-122, -85, -31,-124,-125, -31,-123, -92, -31,-122, -86, -31,-124,-125, + -31,-123, -92, -31,-122, -87, -31,-124,-125, -31,-123, -92, -31,-122, -88, -31,-124,-125, -31,-123, + -93, -31,-121,-126, -31,-124,-125, -31,-123, -93, -31,-121,-127, -31,-124,-125, -31,-123, -93, -31, +-121,-128, -31,-124,-125, -31,-123, -93, -31,-122, -65, -31,-124,-125, -31,-123, -93, -31,-122, -66, + -31,-124,-125, -31,-123, -93, -31,-122, -67, -31,-124,-125, -31,-123, -93, -31,-122, -68, -31,-124, +-125, -31,-123, -93, -31,-122, -69, -31,-124,-125, -31,-123, -93, -31,-122, -70, -31,-124,-125, -31, +-123, -93, -31,-122, -71, -31,-124,-125, -31,-123, -93, -31,-122, -72, -31,-124,-125, -31,-123, -93, + -31,-122, -73, -31,-124,-125, -31,-123, -93, -31,-122, -74, -31,-124,-125, -31,-123, -93, -31,-122, + -75, -31,-124,-125, -31,-123, -93, -31,-122, -76, -31,-124,-125, -31,-123, -93, -31,-122, -77, -31, +-124,-125, -31,-123, -93, -31,-122, -78, -31,-124,-125, -31,-123, -93, -31,-122, -79, -31,-124,-125, + -31,-123, -93, -31,-122, -80, -31,-124,-125, -31,-123, -93, -31,-122, -81, -31,-124,-125, -31,-123, + -93, -31,-122, -82, -31,-124,-125, -31,-123, -93, -31,-122, -83, -31,-124,-125, -31,-123, -93, -31, +-122, -84, -31,-124,-125, -31,-123, -93, -31,-122, -85, -31,-124,-125, -31,-123, -93, -31,-122, -86, + -31,-124,-125, -31,-123, -93, -31,-122, -87, -31,-124,-125, -31,-123, -93, -31,-122, -88, -31,-124, +-125, -31,-123, -94, -31,-121,-126, -31,-124,-125, -31,-123, -94, -31,-121,-127, -31,-124,-125, -31, +-123, -94, -31,-121,-128, -31,-124,-125, -31,-123, -94, -31,-122, -65, -31,-124,-125, -31,-123, -94, + -31,-122, -66, -31,-124,-125, -31,-123, -94, -31,-122, -67, -31,-124,-125, -31,-123, -94, -31,-122, + -68, -31,-124,-125, -31,-123, -94, -31,-122, -69, -31,-124,-125, -31,-123, -94, -31,-122, -70, -31, +-124,-125, -31,-123, -94, -31,-122, -71, -31,-124,-125, -31,-123, -94, -31,-122, -72, -31,-124,-125, + -31,-123, -94, -31,-122, -73, -31,-124,-125, -31,-123, -94, -31,-122, -74, -31,-124,-125, -31,-123, + -94, -31,-122, -75, -31,-124,-125, -31,-123, -94, -31,-122, -76, -31,-124,-125, -31,-123, -94, -31, +-122, -77, -31,-124,-125, -31,-123, -94, -31,-122, -78, -31,-124,-125, -31,-123, -94, -31,-122, -79, + -31,-124,-125, -31,-123, -94, -31,-122, -80, -31,-124,-125, -31,-123, -94, -31,-122, -81, -31,-124, +-125, -31,-123, -94, -31,-122, -82, -31,-124,-125, -31,-123, -94, -31,-122, -83, -31,-124,-125, -31, +-123, -94, -31,-122, -84, -31,-124,-125, -31,-123, -94, -31,-122, -85, -31,-124,-125, -31,-123, -94, + -31,-122, -86, -31,-124,-125, -31,-123, -94, -31,-122, -87, -31,-124,-125, -31,-123, -94, -31,-122, + -88, -31,-124,-125, -31,-123, -95, -31,-121,-126, -31,-124,-125, -31,-123, -95, -31,-121,-127, -31, +-124,-125, -31,-123, -95, -31,-121,-128, -31,-124,-125, -31,-123, -95, -31,-122, -65, -31,-124,-125, + -31,-123, -95, -31,-122, -66, -31,-124,-125, -31,-123, -95, -31,-122, -67, -31,-124,-125, -31,-123, + -95, -31,-122, -68, -31,-124,-125, -31,-123, -95, -31,-122, -69, -31,-124,-125, -31,-123, -95, -31, +-122, -70, -31,-124,-125, -31,-123, -95, -31,-122, -71, -31,-124,-125, -31,-123, -95, -31,-122, -72, + -31,-124,-125, -31,-123, -95, -31,-122, -73, -31,-124,-125, -31,-123, -95, -31,-122, -74, -31,-124, +-125, -31,-123, -95, -31,-122, -75, -31,-124,-125, -31,-123, -95, -31,-122, -76, -31,-124,-125, -31, +-123, -95, -31,-122, -77, -31,-124,-125, -31,-123, -95, -31,-122, -78, -31,-124,-125, -31,-123, -95, + -31,-122, -79, -31,-124,-125, -31,-123, -95, -31,-122, -80, -31,-124,-125, -31,-123, -95, -31,-122, + -81, -31,-124,-125, -31,-123, -95, -31,-122, -82, -31,-124,-125, -31,-123, -95, -31,-122, -83, -31, +-124,-125, -31,-123, -95, -31,-122, -84, -31,-124,-125, -31,-123, -95, -31,-122, -85, -31,-124,-125, + -31,-123, -95, -31,-122, -86, -31,-124,-125, -31,-123, -95, -31,-122, -87, -31,-124,-125, -31,-123, + -95, -31,-122, -88, -31,-124,-126, -31,-123, -75, -31,-121,-126, -31,-124,-126, -31,-123, -75, -31, +-121,-127, -31,-124,-126, -31,-123, -75, -31,-121,-128, -31,-124,-126, -31,-123, -75, -31,-122, -65, + -31,-124,-126, -31,-123, -75, -31,-122, -66, -31,-124,-126, -31,-123, -75, -31,-122, -67, -31,-124, +-126, -31,-123, -75, -31,-122, -68, -31,-124,-126, -31,-123, -75, -31,-122, -69, -31,-124,-126, -31, +-123, -75, -31,-122, -70, -31,-124,-126, -31,-123, -75, -31,-122, -71, -31,-124,-126, -31,-123, -75, + -31,-122, -72, -31,-124,-126, -31,-123, -75, -31,-122, -73, -31,-124,-126, -31,-123, -75, -31,-122, + -74, -31,-124,-126, -31,-123, -75, -31,-122, -75, -31,-124,-126, -31,-123, -75, -31,-122, -76, -31, +-124,-126, -31,-123, -75, -31,-122, -77, -31,-124,-126, -31,-123, -75, -31,-122, -78, -31,-124,-126, + -31,-123, -75, -31,-122, -79, -31,-124,-126, -31,-123, -75, -31,-122, -80, -31,-124,-126, -31,-123, + -75, -31,-122, -81, -31,-124,-126, -31,-123, -75, -31,-122, -82, -31,-124,-126, -31,-123, -75, -31, +-122, -83, -31,-124,-126, -31,-123, -75, -31,-122, -84, -31,-124,-126, -31,-123, -75, -31,-122, -85, + -31,-124,-126, -31,-123, -75, -31,-122, -86, -31,-124,-126, -31,-123, -75, -31,-122, -87, -31,-124, +-126, -31,-123, -75, -31,-122, -88, -31,-124,-126, -31,-123, -76, -31,-121,-126, -31,-124,-126, -31, +-123, -76, -31,-121,-127, -31,-124,-126, -31,-123, -76, -31,-121,-128, -31,-124,-126, -31,-123, -76, + -31,-122, -65, -31,-124,-126, -31,-123, -76, -31,-122, -66, -31,-124,-126, -31,-123, -76, -31,-122, + -67, -31,-124,-126, -31,-123, -76, -31,-122, -68, -31,-124,-126, -31,-123, -76, -31,-122, -69, -31, +-124,-126, -31,-123, -76, -31,-122, -70, -31,-124,-126, -31,-123, -76, -31,-122, -71, -31,-124,-126, + -31,-123, -76, -31,-122, -72, -31,-124,-126, -31,-123, -76, -31,-122, -73, -31,-124,-126, -31,-123, + -76, -31,-122, -74, -31,-124,-126, -31,-123, -76, -31,-122, -75, -31,-124,-126, -31,-123, -76, -31, +-122, -76, -31,-124,-126, -31,-123, -76, -31,-122, -77, -31,-124,-126, -31,-123, -76, -31,-122, -78, + -31,-124,-126, -31,-123, -76, -31,-122, -79, -31,-124,-126, -31,-123, -76, -31,-122, -80, -31,-124, +-126, -31,-123, -76, -31,-122, -81, -31,-124,-126, -31,-123, -76, -31,-122, -82, -31,-124,-126, -31, +-123, -76, -31,-122, -83, -31,-124,-126, -31,-123, -76, -31,-122, -84, -31,-124,-126, -31,-123, -76, + -31,-122, -85, -31,-124,-126, -31,-123, -76, -31,-122, -86, -31,-124,-126, -31,-123, -76, -31,-122, + -87, -31,-124,-126, -31,-123, -76, -31,-122, -88, -31,-124,-126, -31,-123, -77, -31,-121,-126, -31, +-124,-126, -31,-123, -77, -31,-121,-127, -31,-124,-126, -31,-123, -77, -31,-121,-128, -31,-124,-126, + -31,-123, -77, -31,-122, -65, -31,-124,-126, -31,-123, -77, -31,-122, -66, -31,-124,-126, -31,-123, + -77, -31,-122, -67, -31,-124,-126, -31,-123, -77, -31,-122, -68, -31,-124,-126, -31,-123, -77, -31, +-122, -69, -31,-124,-126, -31,-123, -77, -31,-122, -70, -31,-124,-126, -31,-123, -77, -31,-122, -71, + -31,-124,-126, -31,-123, -77, -31,-122, -72, -31,-124,-126, -31,-123, -77, -31,-122, -73, -31,-124, +-126, -31,-123, -77, -31,-122, -74, -31,-124,-126, -31,-123, -77, -31,-122, -75, -31,-124,-126, -31, +-123, -77, -31,-122, -76, -31,-124,-126, -31,-123, -77, -31,-122, -77, -31,-124,-126, -31,-123, -77, + -31,-122, -78, -31,-124,-126, -31,-123, -77, -31,-122, -79, -31,-124,-126, -31,-123, -77, -31,-122, + -80, -31,-124,-126, -31,-123, -77, -31,-122, -81, -31,-124,-126, -31,-123, -77, -31,-122, -82, -31, +-124,-126, -31,-123, -77, -31,-122, -83, -31,-124,-126, -31,-123, -77, -31,-122, -84, -31,-124,-126, + -31,-123, -77, -31,-122, -85, -31,-124,-126, -31,-123, -77, -31,-122, -86, -31,-124,-126, -31,-123, + -77, -31,-122, -87, -31,-124,-126, -31,-123, -77, -31,-122, -88, -31,-124,-126, -31,-123, -78, -31, +-121,-126, -31,-124,-126, -31,-123, -78, -31,-121,-127, -31,-124,-126, -31,-123, -78, -31,-121,-128, + -31,-124,-126, -31,-123, -78, -31,-122, -65, -31,-124,-126, -31,-123, -78, -31,-122, -66, -31,-124, +-126, -31,-123, -78, -31,-122, -67, -31,-124,-126, -31,-123, -78, -31,-122, -68, -31,-124,-126, -31, +-123, -78, -31,-122, -69, -31,-124,-126, -31,-123, -78, -31,-122, -70, -31,-124,-126, -31,-123, -78, + -31,-122, -71, -31,-124,-126, -31,-123, -78, -31,-122, -72, -31,-124,-126, -31,-123, -78, -31,-122, + -73, -31,-124,-126, -31,-123, -78, -31,-122, -74, -31,-124,-126, -31,-123, -78, -31,-122, -75, -31, +-124,-126, -31,-123, -78, -31,-122, -76, -31,-124,-126, -31,-123, -78, -31,-122, -77, -31,-124,-126, + -31,-123, -78, -31,-122, -78, -31,-124,-126, -31,-123, -78, -31,-122, -79, -31,-124,-126, -31,-123, + -78, -31,-122, -80, -31,-124,-126, -31,-123, -78, -31,-122, -81, -31,-124,-126, -31,-123, -78, -31, +-122, -82, -31,-124,-126, -31,-123, -78, -31,-122, -83, -31,-124,-126, -31,-123, -78, -31,-122, -84, + -31,-124,-126, -31,-123, -78, -31,-122, -85, -31,-124,-126, -31,-123, -78, -31,-122, -86, -31,-124, +-126, -31,-123, -78, -31,-122, -87, -31,-124,-126, -31,-123, -78, -31,-122, -88, -31,-124,-126, -31, +-123, -79, -31,-121,-126, -31,-124,-126, -31,-123, -79, -31,-121,-127, -31,-124,-126, -31,-123, -79, + -31,-121,-128, -31,-124,-126, -31,-123, -79, -31,-122, -65, -31,-124,-126, -31,-123, -79, -31,-122, + -66, -31,-124,-126, -31,-123, -79, -31,-122, -67, -31,-124,-126, -31,-123, -79, -31,-122, -68, -31, +-124,-126, -31,-123, -79, -31,-122, -69, -31,-124,-126, -31,-123, -79, -31,-122, -70, -31,-124,-126, + -31,-123, -79, -31,-122, -71, -31,-124,-126, -31,-123, -79, -31,-122, -72, -31,-124,-126, -31,-123, + -79, -31,-122, -73, -31,-124,-126, -31,-123, -79, -31,-122, -74, -31,-124,-126, -31,-123, -79, -31, +-122, -75, -31,-124,-126, -31,-123, -79, -31,-122, -76, -31,-124,-126, -31,-123, -79, -31,-122, -77, + -31,-124,-126, -31,-123, -79, -31,-122, -78, -31,-124,-126, -31,-123, -79, -31,-122, -79, -31,-124, +-126, -31,-123, -79, -31,-122, -80, -31,-124,-126, -31,-123, -79, -31,-122, -81, -31,-124,-126, -31, +-123, -79, -31,-122, -82, -31,-124,-126, -31,-123, -79, -31,-122, -83, -31,-124,-126, -31,-123, -79, + -31,-122, -84, -31,-124,-126, -31,-123, -79, -31,-122, -85, -31,-124,-126, -31,-123, -79, -31,-122, + -86, -31,-124,-126, -31,-123, -79, -31,-122, -87, -31,-124,-126, -31,-123, -79, -31,-122, -88, -31, +-124,-126, -31,-123, -80, -31,-121,-126, -31,-124,-126, -31,-123, -80, -31,-121,-127, -31,-124,-126, + -31,-123, -80, -31,-121,-128, -31,-124,-126, -31,-123, -80, -31,-122, -65, -31,-124,-126, -31,-123, + -80, -31,-122, -66, -31,-124,-126, -31,-123, -80, -31,-122, -67, -31,-124,-126, -31,-123, -80, -31, +-122, -68, -31,-124,-126, -31,-123, -80, -31,-122, -69, -31,-124,-126, -31,-123, -80, -31,-122, -70, + -31,-124,-126, -31,-123, -80, -31,-122, -71, -31,-124,-126, -31,-123, -80, -31,-122, -72, -31,-124, +-126, -31,-123, -80, -31,-122, -73, -31,-124,-126, -31,-123, -80, -31,-122, -74, -31,-124,-126, -31, +-123, -80, -31,-122, -75, -31,-124,-126, -31,-123, -80, -31,-122, -76, -31,-124,-126, -31,-123, -80, + -31,-122, -77, -31,-124,-126, -31,-123, -80, -31,-122, -78, -31,-124,-126, -31,-123, -80, -31,-122, + -79, -31,-124,-126, -31,-123, -80, -31,-122, -80, -31,-124,-126, -31,-123, -80, -31,-122, -81, -31, +-124,-126, -31,-123, -80, -31,-122, -82, -31,-124,-126, -31,-123, -80, -31,-122, -83, -31,-124,-126, + -31,-123, -80, -31,-122, -84, -31,-124,-126, -31,-123, -80, -31,-122, -85, -31,-124,-126, -31,-123, + -80, -31,-122, -86, -31,-124,-126, -31,-123, -80, -31,-122, -87, -31,-124,-126, -31,-123, -80, -31, +-122, -88, -31,-124,-126, -31,-123, -81, -31,-121,-126, -31,-124,-126, -31,-123, -81, -31,-121,-127, + -31,-124,-126, -31,-123, -81, -31,-121,-128, -31,-124,-126, -31,-123, -81, -31,-122, -65, -31,-124, +-126, -31,-123, -81, -31,-122, -66, -31,-124,-126, -31,-123, -81, -31,-122, -67, -31,-124,-126, -31, +-123, -81, -31,-122, -68, -31,-124,-126, -31,-123, -81, -31,-122, -69, -31,-124,-126, -31,-123, -81, + -31,-122, -70, -31,-124,-126, -31,-123, -81, -31,-122, -71, -31,-124,-126, -31,-123, -81, -31,-122, + -72, -31,-124,-126, -31,-123, -81, -31,-122, -73, -31,-124,-126, -31,-123, -81, -31,-122, -74, -31, +-124,-126, -31,-123, -81, -31,-122, -75, -31,-124,-126, -31,-123, -81, -31,-122, -76, -31,-124,-126, + -31,-123, -81, -31,-122, -77, -31,-124,-126, -31,-123, -81, -31,-122, -78, -31,-124,-126, -31,-123, + -81, -31,-122, -79, -31,-124,-126, -31,-123, -81, -31,-122, -80, -31,-124,-126, -31,-123, -81, -31, +-122, -81, -31,-124,-126, -31,-123, -81, -31,-122, -82, -31,-124,-126, -31,-123, -81, -31,-122, -83, + -31,-124,-126, -31,-123, -81, -31,-122, -84, -31,-124,-126, -31,-123, -81, -31,-122, -85, -31,-124, +-126, -31,-123, -81, -31,-122, -86, -31,-124,-126, -31,-123, -81, -31,-122, -87, -31,-124,-126, -31, +-123, -81, -31,-122, -88, -31,-124,-126, -31,-123, -82, -31,-121,-126, -31,-124,-126, -31,-123, -82, + -31,-121,-127, -31,-124,-126, -31,-123, -82, -31,-121,-128, -31,-124,-126, -31,-123, -82, -31,-122, + -65, -31,-124,-126, -31,-123, -82, -31,-122, -66, -31,-124,-126, -31,-123, -82, -31,-122, -67, -31, +-124,-126, -31,-123, -82, -31,-122, -68, -31,-124,-126, -31,-123, -82, -31,-122, -69, -31,-124,-126, + -31,-123, -82, -31,-122, -70, -31,-124,-126, -31,-123, -82, -31,-122, -71, -31,-124,-126, -31,-123, + -82, -31,-122, -72, -31,-124,-126, -31,-123, -82, -31,-122, -73, -31,-124,-126, -31,-123, -82, -31, +-122, -74, -31,-124,-126, -31,-123, -82, -31,-122, -75, -31,-124,-126, -31,-123, -82, -31,-122, -76, + -31,-124,-126, -31,-123, -82, -31,-122, -77, -31,-124,-126, -31,-123, -82, -31,-122, -78, -31,-124, +-126, -31,-123, -82, -31,-122, -79, -31,-124,-126, -31,-123, -82, -31,-122, -80, -31,-124,-126, -31, +-123, -82, -31,-122, -81, -31,-124,-126, -31,-123, -82, -31,-122, -82, -31,-124,-126, -31,-123, -82, + -31,-122, -83, -31,-124,-126, -31,-123, -82, -31,-122, -84, -31,-124,-126, -31,-123, -82, -31,-122, + -85, -31,-124,-126, -31,-123, -82, -31,-122, -86, -31,-124,-126, -31,-123, -82, -31,-122, -87, -31, +-124,-126, -31,-123, -82, -31,-122, -88, -31,-124,-126, -31,-123, -83, -31,-121,-126, -31,-124,-126, + -31,-123, -83, -31,-121,-127, -31,-124,-126, -31,-123, -83, -31,-121,-128, -31,-124,-126, -31,-123, + -83, -31,-122, -65, -31,-124,-126, -31,-123, -83, -31,-122, -66, -31,-124,-126, -31,-123, -83, -31, +-122, -67, -31,-124,-126, -31,-123, -83, -31,-122, -68, -31,-124,-126, -31,-123, -83, -31,-122, -69, + -31,-124,-126, -31,-123, -83, -31,-122, -70, -31,-124,-126, -31,-123, -83, -31,-122, -71, -31,-124, +-126, -31,-123, -83, -31,-122, -72, -31,-124,-126, -31,-123, -83, -31,-122, -73, -31,-124,-126, -31, +-123, -83, -31,-122, -74, -31,-124,-126, -31,-123, -83, -31,-122, -75, -31,-124,-126, -31,-123, -83, + -31,-122, -76, -31,-124,-126, -31,-123, -83, -31,-122, -77, -31,-124,-126, -31,-123, -83, -31,-122, + -78, -31,-124,-126, -31,-123, -83, -31,-122, -79, -31,-124,-126, -31,-123, -83, -31,-122, -80, -31, +-124,-126, -31,-123, -83, -31,-122, -81, -31,-124,-126, -31,-123, -83, -31,-122, -82, -31,-124,-126, + -31,-123, -83, -31,-122, -83, -31,-124,-126, -31,-123, -83, -31,-122, -84, -31,-124,-126, -31,-123, + -83, -31,-122, -85, -31,-124,-126, -31,-123, -83, -31,-122, -86, -31,-124,-126, -31,-123, -83, -31, +-122, -87, -31,-124,-126, -31,-123, -83, -31,-122, -88, -31,-124,-126, -31,-123, -84, -31,-121,-126, + -31,-124,-126, -31,-123, -84, -31,-121,-127, -31,-124,-126, -31,-123, -84, -31,-121,-128, -31,-124, +-126, -31,-123, -84, -31,-122, -65, -31,-124,-126, -31,-123, -84, -31,-122, -66, -31,-124,-126, -31, +-123, -84, -31,-122, -67, -31,-124,-126, -31,-123, -84, -31,-122, -68, -31,-124,-126, -31,-123, -84, + -31,-122, -69, -31,-124,-126, -31,-123, -84, -31,-122, -70, -31,-124,-126, -31,-123, -84, -31,-122, + -71, -31,-124,-126, -31,-123, -84, -31,-122, -72, -31,-124,-126, -31,-123, -84, -31,-122, -73, -31, +-124,-126, -31,-123, -84, -31,-122, -74, -31,-124,-126, -31,-123, -84, -31,-122, -75, -31,-124,-126, + -31,-123, -84, -31,-122, -76, -31,-124,-126, -31,-123, -84, -31,-122, -77, -31,-124,-126, -31,-123, + -84, -31,-122, -78, -31,-124,-126, -31,-123, -84, -31,-122, -79, -31,-124,-126, -31,-123, -84, -31, +-122, -80, -31,-124,-126, -31,-123, -84, -31,-122, -81, -31,-124,-126, -31,-123, -84, -31,-122, -82, + -31,-124,-126, -31,-123, -84, -31,-122, -83, -31,-124,-126, -31,-123, -84, -31,-122, -84, -31,-124, +-126, -31,-123, -84, -31,-122, -85, -31,-124,-126, -31,-123, -84, -31,-122, -86, -31,-124,-126, -31, +-123, -84, -31,-122, -87, -31,-124,-126, -31,-123, -84, -31,-122, -88, -31,-124,-126, -31,-123, -85, + -31,-121,-126, -31,-124,-126, -31,-123, -85, -31,-121,-127, -31,-124,-126, -31,-123, -85, -31,-121, +-128, -31,-124,-126, -31,-123, -85, -31,-122, -65, -31,-124,-126, -31,-123, -85, -31,-122, -66, -31, +-124,-126, -31,-123, -85, -31,-122, -67, -31,-124,-126, -31,-123, -85, -31,-122, -68, -31,-124,-126, + -31,-123, -85, -31,-122, -69, -31,-124,-126, -31,-123, -85, -31,-122, -70, -31,-124,-126, -31,-123, + -85, -31,-122, -71, -31,-124,-126, -31,-123, -85, -31,-122, -72, -31,-124,-126, -31,-123, -85, -31, +-122, -73, -31,-124,-126, -31,-123, -85, -31,-122, -74, -31,-124,-126, -31,-123, -85, -31,-122, -75, + -31,-124,-126, -31,-123, -85, -31,-122, -76, -31,-124,-126, -31,-123, -85, -31,-122, -77, -31,-124, +-126, -31,-123, -85, -31,-122, -78, -31,-124,-126, -31,-123, -85, -31,-122, -79, -31,-124,-126, -31, +-123, -85, -31,-122, -80, -31,-124,-126, -31,-123, -85, -31,-122, -81, -31,-124,-126, -31,-123, -85, + -31,-122, -82, -31,-124,-126, -31,-123, -85, -31,-122, -83, -31,-124,-126, -31,-123, -85, -31,-122, + -84, -31,-124,-126, -31,-123, -85, -31,-122, -85, -31,-124,-126, -31,-123, -85, -31,-122, -86, -31, +-124,-126, -31,-123, -85, -31,-122, -87, -31,-124,-126, -31,-123, -85, -31,-122, -88, -31,-124,-126, + -31,-123, -86, -31,-121,-126, -31,-124,-126, -31,-123, -86, -31,-121,-127, -31,-124,-126, -31,-123, + -86, -31,-121,-128, -31,-124,-126, -31,-123, -86, -31,-122, -65, -31,-124,-126, -31,-123, -86, -31, +-122, -66, -31,-124,-126, -31,-123, -86, -31,-122, -67, -31,-124,-126, -31,-123, -86, -31,-122, -68, + -31,-124,-126, -31,-123, -86, -31,-122, -69, -31,-124,-126, -31,-123, -86, -31,-122, -70, -31,-124, +-126, -31,-123, -86, -31,-122, -71, -31,-124,-126, -31,-123, -86, -31,-122, -72, -31,-124,-126, -31, +-123, -86, -31,-122, -73, -31,-124,-126, -31,-123, -86, -31,-122, -74, -31,-124,-126, -31,-123, -86, + -31,-122, -75, -31,-124,-126, -31,-123, -86, -31,-122, -76, -31,-124,-126, -31,-123, -86, -31,-122, + -77, -31,-124,-126, -31,-123, -86, -31,-122, -78, -31,-124,-126, -31,-123, -86, -31,-122, -79, -31, +-124,-126, -31,-123, -86, -31,-122, -80, -31,-124,-126, -31,-123, -86, -31,-122, -81, -31,-124,-126, + -31,-123, -86, -31,-122, -82, -31,-124,-126, -31,-123, -86, -31,-122, -83, -31,-124,-126, -31,-123, + -86, -31,-122, -84, -31,-124,-126, -31,-123, -86, -31,-122, -85, -31,-124,-126, -31,-123, -86, -31, +-122, -86, -31,-124,-126, -31,-123, -86, -31,-122, -87, -31,-124,-126, -31,-123, -86, -31,-122, -88, + -31,-124,-126, -31,-123, -87, -31,-121,-126, -31,-124,-126, -31,-123, -87, -31,-121,-127, -31,-124, +-126, -31,-123, -87, -31,-121,-128, -31,-124,-126, -31,-123, -87, -31,-122, -65, -31,-124,-126, -31, +-123, -87, -31,-122, -66, -31,-124,-126, -31,-123, -87, -31,-122, -67, -31,-124,-126, -31,-123, -87, + -31,-122, -68, -31,-124,-126, -31,-123, -87, -31,-122, -69, -31,-124,-126, -31,-123, -87, -31,-122, + -70, -31,-124,-126, -31,-123, -87, -31,-122, -71, -31,-124,-126, -31,-123, -87, -31,-122, -72, -31, +-124,-126, -31,-123, -87, -31,-122, -73, -31,-124,-126, -31,-123, -87, -31,-122, -74, -31,-124,-126, + -31,-123, -87, -31,-122, -75, -31,-124,-126, -31,-123, -87, -31,-122, -76, -31,-124,-126, -31,-123, + -87, -31,-122, -77, -31,-124,-126, -31,-123, -87, -31,-122, -78, -31,-124,-126, -31,-123, -87, -31, +-122, -79, -31,-124,-126, -31,-123, -87, -31,-122, -80, -31,-124,-126, -31,-123, -87, -31,-122, -81, + -31,-124,-126, -31,-123, -87, -31,-122, -82, -31,-124,-126, -31,-123, -87, -31,-122, -83, -31,-124, +-126, -31,-123, -87, -31,-122, -84, -31,-124,-126, -31,-123, -87, -31,-122, -85, -31,-124,-126, -31, +-123, -87, -31,-122, -86, -31,-124,-126, -31,-123, -87, -31,-122, -87, -31,-124,-126, -31,-123, -87, + -31,-122, -88, -31,-124,-126, -31,-123, -88, -31,-121,-126, -31,-124,-126, -31,-123, -88, -31,-121, +-127, -31,-124,-126, -31,-123, -88, -31,-121,-128, -31,-124,-126, -31,-123, -88, -31,-122, -65, -31, +-124,-126, -31,-123, -88, -31,-122, -66, -31,-124,-126, -31,-123, -88, -31,-122, -67, -31,-124,-126, + -31,-123, -88, -31,-122, -68, -31,-124,-126, -31,-123, -88, -31,-122, -69, -31,-124,-126, -31,-123, + -88, -31,-122, -70, -31,-124,-126, -31,-123, -88, -31,-122, -71, -31,-124,-126, -31,-123, -88, -31, +-122, -72, -31,-124,-126, -31,-123, -88, -31,-122, -73, -31,-124,-126, -31,-123, -88, -31,-122, -74, + -31,-124,-126, -31,-123, -88, -31,-122, -75, -31,-124,-126, -31,-123, -88, -31,-122, -76, -31,-124, +-126, -31,-123, -88, -31,-122, -77, -31,-124,-126, -31,-123, -88, -31,-122, -78, -31,-124,-126, -31, +-123, -88, -31,-122, -79, -31,-124,-126, -31,-123, -88, -31,-122, -80, -31,-124,-126, -31,-123, -88, + -31,-122, -81, -31,-124,-126, -31,-123, -88, -31,-122, -82, -31,-124,-126, -31,-123, -88, -31,-122, + -83, -31,-124,-126, -31,-123, -88, -31,-122, -84, -31,-124,-126, -31,-123, -88, -31,-122, -85, -31, +-124,-126, -31,-123, -88, -31,-122, -86, -31,-124,-126, -31,-123, -88, -31,-122, -87, -31,-124,-126, + -31,-123, -88, -31,-122, -88, -31,-124,-126, -31,-123, -89, -31,-121,-126, -31,-124,-126, -31,-123, + -89, -31,-121,-127, -31,-124,-126, -31,-123, -89, -31,-121,-128, -31,-124,-126, -31,-123, -89, -31, +-122, -65, -31,-124,-126, -31,-123, -89, -31,-122, -66, -31,-124,-126, -31,-123, -89, -31,-122, -67, + -31,-124,-126, -31,-123, -89, -31,-122, -68, -31,-124,-126, -31,-123, -89, -31,-122, -69, -31,-124, +-126, -31,-123, -89, -31,-122, -70, -31,-124,-126, -31,-123, -89, -31,-122, -71, -31,-124,-126, -31, +-123, -89, -31,-122, -72, -31,-124,-126, -31,-123, -89, -31,-122, -73, -31,-124,-126, -31,-123, -89, + -31,-122, -74, -31,-124,-126, -31,-123, -89, -31,-122, -75, -31,-124,-126, -31,-123, -89, -31,-122, + -76, -31,-124,-126, -31,-123, -89, -31,-122, -77, -31,-124,-126, -31,-123, -89, -31,-122, -78, -31, +-124,-126, -31,-123, -89, -31,-122, -79, -31,-124,-126, -31,-123, -89, -31,-122, -80, -31,-124,-126, + -31,-123, -89, -31,-122, -81, -31,-124,-126, -31,-123, -89, -31,-122, -82, -31,-124,-126, -31,-123, + -89, -31,-122, -83, -31,-124,-126, -31,-123, -89, -31,-122, -84, -31,-124,-126, -31,-123, -89, -31, +-122, -85, -31,-124,-126, -31,-123, -89, -31,-122, -86, -31,-124,-126, -31,-123, -89, -31,-122, -87, + -31,-124,-126, -31,-123, -89, -31,-122, -88, -31,-124,-126, -31,-123, -90, -31,-121,-126, -31,-124, +-126, -31,-123, -90, -31,-121,-127, -31,-124,-126, -31,-123, -90, -31,-121,-128, -31,-124,-126, -31, +-123, -90, -31,-122, -65, -31,-124,-126, -31,-123, -90, -31,-122, -66, -31,-124,-126, -31,-123, -90, + -31,-122, -67, -31,-124,-126, -31,-123, -90, -31,-122, -68, -31,-124,-126, -31,-123, -90, -31,-122, + -69, -31,-124,-126, -31,-123, -90, -31,-122, -70, -31,-124,-126, -31,-123, -90, -31,-122, -71, -31, +-124,-126, -31,-123, -90, -31,-122, -72, -31,-124,-126, -31,-123, -90, -31,-122, -73, -31,-124,-126, + -31,-123, -90, -31,-122, -74, -31,-124,-126, -31,-123, -90, -31,-122, -75, -31,-124,-126, -31,-123, + -90, -31,-122, -76, -31,-124,-126, -31,-123, -90, -31,-122, -77, -31,-124,-126, -31,-123, -90, -31, +-122, -78, -31,-124,-126, -31,-123, -90, -31,-122, -79, -31,-124,-126, -31,-123, -90, -31,-122, -80, + -31,-124,-126, -31,-123, -90, -31,-122, -81, -31,-124,-126, -31,-123, -90, -31,-122, -82, -31,-124, +-126, -31,-123, -90, -31,-122, -83, -31,-124,-126, -31,-123, -90, -31,-122, -84, -31,-124,-126, -31, +-123, -90, -31,-122, -85, -31,-124,-126, -31,-123, -90, -31,-122, -86, -31,-124,-126, -31,-123, -90, + -31,-122, -87, -31,-124,-126, -31,-123, -90, -31,-122, -88, -31,-124,-126, -31,-123, -91, -31,-121, +-126, -31,-124,-126, -31,-123, -91, -31,-121,-127, -31,-124,-126, -31,-123, -91, -31,-121,-128, -31, +-124,-126, -31,-123, -91, -31,-122, -65, -31,-124,-126, -31,-123, -91, -31,-122, -66, -31,-124,-126, + -31,-123, -91, -31,-122, -67, -31,-124,-126, -31,-123, -91, -31,-122, -68, -31,-124,-126, -31,-123, + -91, -31,-122, -69, -31,-124,-126, -31,-123, -91, -31,-122, -70, -31,-124,-126, -31,-123, -91, -31, +-122, -71, -31,-124,-126, -31,-123, -91, -31,-122, -72, -31,-124,-126, -31,-123, -91, -31,-122, -73, + -31,-124,-126, -31,-123, -91, -31,-122, -74, -31,-124,-126, -31,-123, -91, -31,-122, -75, -31,-124, +-126, -31,-123, -91, -31,-122, -76, -31,-124,-126, -31,-123, -91, -31,-122, -77, -31,-124,-126, -31, +-123, -91, -31,-122, -78, -31,-124,-126, -31,-123, -91, -31,-122, -79, -31,-124,-126, -31,-123, -91, + -31,-122, -80, -31,-124,-126, -31,-123, -91, -31,-122, -81, -31,-124,-126, -31,-123, -91, -31,-122, + -82, -31,-124,-126, -31,-123, -91, -31,-122, -83, -31,-124,-126, -31,-123, -91, -31,-122, -84, -31, +-124,-126, -31,-123, -91, -31,-122, -85, -31,-124,-126, -31,-123, -91, -31,-122, -86, -31,-124,-126, + -31,-123, -91, -31,-122, -87, -31,-124,-126, -31,-123, -91, -31,-122, -88, -31,-124,-126, -31,-123, + -92, -31,-121,-126, -31,-124,-126, -31,-123, -92, -31,-121,-127, -31,-124,-126, -31,-123, -92, -31, +-121,-128, -31,-124,-126, -31,-123, -92, -31,-122, -65, -31,-124,-126, -31,-123, -92, -31,-122, -66, + -31,-124,-126, -31,-123, -92, -31,-122, -67, -31,-124,-126, -31,-123, -92, -31,-122, -68, -31,-124, +-126, -31,-123, -92, -31,-122, -69, -31,-124,-126, -31,-123, -92, -31,-122, -70, -31,-124,-126, -31, +-123, -92, -31,-122, -71, -31,-124,-126, -31,-123, -92, -31,-122, -72, -31,-124,-126, -31,-123, -92, + -31,-122, -73, -31,-124,-126, -31,-123, -92, -31,-122, -74, -31,-124,-126, -31,-123, -92, -31,-122, + -75, -31,-124,-126, -31,-123, -92, -31,-122, -76, -31,-124,-126, -31,-123, -92, -31,-122, -77, -31, +-124,-126, -31,-123, -92, -31,-122, -78, -31,-124,-126, -31,-123, -92, -31,-122, -79, -31,-124,-126, + -31,-123, -92, -31,-122, -80, -31,-124,-126, -31,-123, -92, -31,-122, -81, -31,-124,-126, -31,-123, + -92, -31,-122, -82, -31,-124,-126, -31,-123, -92, -31,-122, -83, -31,-124,-126, -31,-123, -92, -31, +-122, -84, -31,-124,-126, -31,-123, -92, -31,-122, -85, -31,-124,-126, -31,-123, -92, -31,-122, -86, + -31,-124,-126, -31,-123, -92, -31,-122, -87, -31,-124,-126, -31,-123, -92, -31,-122, -88, -31,-124, +-126, -31,-123, -93, -31,-121,-126, -31,-124,-126, -31,-123, -93, -31,-121,-127, -31,-124,-126, -31, +-123, -93, -31,-121,-128, -31,-124,-126, -31,-123, -93, -31,-122, -65, -31,-124,-126, -31,-123, -93, + -31,-122, -66, -31,-124,-126, -31,-123, -93, -31,-122, -67, -31,-124,-126, -31,-123, -93, -31,-122, + -68, -31,-124,-126, -31,-123, -93, -31,-122, -69, -31,-124,-126, -31,-123, -93, -31,-122, -70, -31, +-124,-126, -31,-123, -93, -31,-122, -71, -31,-124,-126, -31,-123, -93, -31,-122, -72, -31,-124,-126, + -31,-123, -93, -31,-122, -73, -31,-124,-126, -31,-123, -93, -31,-122, -74, -31,-124,-126, -31,-123, + -93, -31,-122, -75, -31,-124,-126, -31,-123, -93, -31,-122, -76, -31,-124,-126, -31,-123, -93, -31, +-122, -77, -31,-124,-126, -31,-123, -93, -31,-122, -78, -31,-124,-126, -31,-123, -93, -31,-122, -79, + -31,-124,-126, -31,-123, -93, -31,-122, -80, -31,-124,-126, -31,-123, -93, -31,-122, -81, -31,-124, +-126, -31,-123, -93, -31,-122, -82, -31,-124,-126, -31,-123, -93, -31,-122, -83, -31,-124,-126, -31, +-123, -93, -31,-122, -84, -31,-124,-126, -31,-123, -93, -31,-122, -85, -31,-124,-126, -31,-123, -93, + -31,-122, -86, -31,-124,-126, -31,-123, -93, -31,-122, -87, -31,-124,-126, -31,-123, -93, -31,-122, + -88, -31,-124,-126, -31,-123, -94, -31,-121,-126, -31,-124,-126, -31,-123, -94, -31,-121,-127, -31, +-124,-126, -31,-123, -94, -31,-121,-128, -31,-124,-126, -31,-123, -94, -31,-122, -65, -31,-124,-126, + -31,-123, -94, -31,-122, -66, -31,-124,-126, -31,-123, -94, -31,-122, -67, -31,-124,-126, -31,-123, + -94, -31,-122, -68, -31,-124,-126, -31,-123, -94, -31,-122, -69, -31,-124,-126, -31,-123, -94, -31, +-122, -70, -31,-124,-126, -31,-123, -94, -31,-122, -71, -31,-124,-126, -31,-123, -94, -31,-122, -72, + -31,-124,-126, -31,-123, -94, -31,-122, -73, -31,-124,-126, -31,-123, -94, -31,-122, -74, -31,-124, +-126, -31,-123, -94, -31,-122, -75, -31,-124,-126, -31,-123, -94, -31,-122, -76, -31,-124,-126, -31, +-123, -94, -31,-122, -77, -31,-124,-126, -31,-123, -94, -31,-122, -78, -31,-124,-126, -31,-123, -94, + -31,-122, -79, -31,-124,-126, -31,-123, -94, -31,-122, -80, -31,-124,-126, -31,-123, -94, -31,-122, + -81, -31,-124,-126, -31,-123, -94, -31,-122, -82, -31,-124,-126, -31,-123, -94, -31,-122, -83, -31, +-124,-126, -31,-123, -94, -31,-122, -84, -31,-124,-126, -31,-123, -94, -31,-122, -85, -31,-124,-126, + -31,-123, -94, -31,-122, -86, -31,-124,-126, -31,-123, -94, -31,-122, -87, -31,-124,-126, -31,-123, + -94, -31,-122, -88, -31,-124,-126, -31,-123, -95, -31,-121,-126, -31,-124,-126, -31,-123, -95, -31, +-121,-127, -31,-124,-126, -31,-123, -95, -31,-121,-128, -31,-124,-126, -31,-123, -95, -31,-122, -65, + -31,-124,-126, -31,-123, -95, -31,-122, -66, -31,-124,-126, -31,-123, -95, -31,-122, -67, -31,-124, +-126, -31,-123, -95, -31,-122, -68, -31,-124,-126, -31,-123, -95, -31,-122, -69, -31,-124,-126, -31, +-123, -95, -31,-122, -70, -31,-124,-126, -31,-123, -95, -31,-122, -71, -31,-124,-126, -31,-123, -95, + -31,-122, -72, -31,-124,-126, -31,-123, -95, -31,-122, -73, -31,-124,-126, -31,-123, -95, -31,-122, + -74, -31,-124,-126, -31,-123, -95, -31,-122, -75, -31,-124,-126, -31,-123, -95, -31,-122, -76, -31, +-124,-126, -31,-123, -95, -31,-122, -77, -31,-124,-126, -31,-123, -95, -31,-122, -78, -31,-124,-126, + -31,-123, -95, -31,-122, -79, -31,-124,-126, -31,-123, -95, -31,-122, -80, -31,-124,-126, -31,-123, + -95, -31,-122, -81, -31,-124,-126, -31,-123, -95, -31,-122, -82, -31,-124,-126, -31,-123, -95, -31, +-122, -83, -31,-124,-126, -31,-123, -95, -31,-122, -84, -31,-124,-126, -31,-123, -95, -31,-122, -85, + -31,-124,-126, -31,-123, -95, -31,-122, -86, -31,-124,-126, -31,-123, -95, -31,-122, -87, -31,-124, +-126, -31,-123, -95, -31,-122, -88, -31,-124,-127, -31,-123, -75, -31,-121,-126, -31,-124,-127, -31, +-123, -75, -31,-121,-127, -31,-124,-127, -31,-123, -75, -31,-121,-128, -31,-124,-127, -31,-123, -75, + -31,-122, -65, -31,-124,-127, -31,-123, -75, -31,-122, -66, -31,-124,-127, -31,-123, -75, -31,-122, + -67, -31,-124,-127, -31,-123, -75, -31,-122, -68, -31,-124,-127, -31,-123, -75, -31,-122, -69, -31, +-124,-127, -31,-123, -75, -31,-122, -70, -31,-124,-127, -31,-123, -75, -31,-122, -71, -31,-124,-127, + -31,-123, -75, -31,-122, -72, -31,-124,-127, -31,-123, -75, -31,-122, -73, -31,-124,-127, -31,-123, + -75, -31,-122, -74, -31,-124,-127, -31,-123, -75, -31,-122, -75, -31,-124,-127, -31,-123, -75, -31, +-122, -76, -31,-124,-127, -31,-123, -75, -31,-122, -77, -31,-124,-127, -31,-123, -75, -31,-122, -78, + -31,-124,-127, -31,-123, -75, -31,-122, -79, -31,-124,-127, -31,-123, -75, -31,-122, -80, -31,-124, +-127, -31,-123, -75, -31,-122, -81, -31,-124,-127, -31,-123, -75, -31,-122, -82, -31,-124,-127, -31, +-123, -75, -31,-122, -83, -31,-124,-127, -31,-123, -75, -31,-122, -84, -31,-124,-127, -31,-123, -75, + -31,-122, -85, -31,-124,-127, -31,-123, -75, -31,-122, -86, -31,-124,-127, -31,-123, -75, -31,-122, + -87, -31,-124,-127, -31,-123, -75, -31,-122, -88, -31,-124,-127, -31,-123, -76, -31,-121,-126, -31, +-124,-127, -31,-123, -76, -31,-121,-127, -31,-124,-127, -31,-123, -76, -31,-121,-128, -31,-124,-127, + -31,-123, -76, -31,-122, -65, -31,-124,-127, -31,-123, -76, -31,-122, -66, -31,-124,-127, -31,-123, + -76, -31,-122, -67, -31,-124,-127, -31,-123, -76, -31,-122, -68, -31,-124,-127, -31,-123, -76, -31, +-122, -69, -31,-124,-127, -31,-123, -76, -31,-122, -70, -31,-124,-127, -31,-123, -76, -31,-122, -71, + -31,-124,-127, -31,-123, -76, -31,-122, -72, -31,-124,-127, -31,-123, -76, -31,-122, -73, -31,-124, +-127, -31,-123, -76, -31,-122, -74, -31,-124,-127, -31,-123, -76, -31,-122, -75, -31,-124,-127, -31, +-123, -76, -31,-122, -76, -31,-124,-127, -31,-123, -76, -31,-122, -77, -31,-124,-127, -31,-123, -76, + -31,-122, -78, -31,-124,-127, -31,-123, -76, -31,-122, -79, -31,-124,-127, -31,-123, -76, -31,-122, + -80, -31,-124,-127, -31,-123, -76, -31,-122, -81, -31,-124,-127, -31,-123, -76, -31,-122, -82, -31, +-124,-127, -31,-123, -76, -31,-122, -83, -31,-124,-127, -31,-123, -76, -31,-122, -84, -31,-124,-127, + -31,-123, -76, -31,-122, -85, -31,-124,-127, -31,-123, -76, -31,-122, -86, -31,-124,-127, -31,-123, + -76, -31,-122, -87, -31,-124,-127, -31,-123, -76, -31,-122, -88, -31,-124,-127, -31,-123, -77, -31, +-121,-126, -31,-124,-127, -31,-123, -77, -31,-121,-127, -31,-124,-127, -31,-123, -77, -31,-121,-128, + -31,-124,-127, -31,-123, -77, -31,-122, -65, -31,-124,-127, -31,-123, -77, -31,-122, -66, -31,-124, +-127, -31,-123, -77, -31,-122, -67, -31,-124,-127, -31,-123, -77, -31,-122, -68, -31,-124,-127, -31, +-123, -77, -31,-122, -69, -31,-124,-127, -31,-123, -77, -31,-122, -70, -31,-124,-127, -31,-123, -77, + -31,-122, -71, -31,-124,-127, -31,-123, -77, -31,-122, -72, -31,-124,-127, -31,-123, -77, -31,-122, + -73, -31,-124,-127, -31,-123, -77, -31,-122, -74, -31,-124,-127, -31,-123, -77, -31,-122, -75, -31, +-124,-127, -31,-123, -77, -31,-122, -76, -31,-124,-127, -31,-123, -77, -31,-122, -77, -31,-124,-127, + -31,-123, -77, -31,-122, -78, -31,-124,-127, -31,-123, -77, -31,-122, -79, -31,-124,-127, -31,-123, + -77, -31,-122, -80, -31,-124,-127, -31,-123, -77, -31,-122, -81, -31,-124,-127, -31,-123, -77, -31, +-122, -82, -31,-124,-127, -31,-123, -77, -31,-122, -83, -31,-124,-127, -31,-123, -77, -31,-122, -84, + -31,-124,-127, -31,-123, -77, -31,-122, -85, -31,-124,-127, -31,-123, -77, -31,-122, -86, -31,-124, +-127, -31,-123, -77, -31,-122, -87, -31,-124,-127, -31,-123, -77, -31,-122, -88, -31,-124,-127, -31, +-123, -78, -31,-121,-126, -31,-124,-127, -31,-123, -78, -31,-121,-127, -31,-124,-127, -31,-123, -78, + -31,-121,-128, -31,-124,-127, -31,-123, -78, -31,-122, -65, -31,-124,-127, -31,-123, -78, -31,-122, + -66, -31,-124,-127, -31,-123, -78, -31,-122, -67, -31,-124,-127, -31,-123, -78, -31,-122, -68, -31, +-124,-127, -31,-123, -78, -31,-122, -69, -31,-124,-127, -31,-123, -78, -31,-122, -70, -31,-124,-127, + -31,-123, -78, -31,-122, -71, -31,-124,-127, -31,-123, -78, -31,-122, -72, -31,-124,-127, -31,-123, + -78, -31,-122, -73, -31,-124,-127, -31,-123, -78, -31,-122, -74, -31,-124,-127, -31,-123, -78, -31, +-122, -75, -31,-124,-127, -31,-123, -78, -31,-122, -76, -31,-124,-127, -31,-123, -78, -31,-122, -77, + -31,-124,-127, -31,-123, -78, -31,-122, -78, -31,-124,-127, -31,-123, -78, -31,-122, -79, -31,-124, +-127, -31,-123, -78, -31,-122, -80, -31,-124,-127, -31,-123, -78, -31,-122, -81, -31,-124,-127, -31, +-123, -78, -31,-122, -82, -31,-124,-127, -31,-123, -78, -31,-122, -83, -31,-124,-127, -31,-123, -78, + -31,-122, -84, -31,-124,-127, -31,-123, -78, -31,-122, -85, -31,-124,-127, -31,-123, -78, -31,-122, + -86, -31,-124,-127, -31,-123, -78, -31,-122, -87, -31,-124,-127, -31,-123, -78, -31,-122, -88, -31, +-124,-127, -31,-123, -79, -31,-121,-126, -31,-124,-127, -31,-123, -79, -31,-121,-127, -31,-124,-127, + -31,-123, -79, -31,-121,-128, -31,-124,-127, -31,-123, -79, -31,-122, -65, -31,-124,-127, -31,-123, + -79, -31,-122, -66, -31,-124,-127, -31,-123, -79, -31,-122, -67, -31,-124,-127, -31,-123, -79, -31, +-122, -68, -31,-124,-127, -31,-123, -79, -31,-122, -69, -31,-124,-127, -31,-123, -79, -31,-122, -70, + -31,-124,-127, -31,-123, -79, -31,-122, -71, -31,-124,-127, -31,-123, -79, -31,-122, -72, -31,-124, +-127, -31,-123, -79, -31,-122, -73, -31,-124,-127, -31,-123, -79, -31,-122, -74, -31,-124,-127, -31, +-123, -79, -31,-122, -75, -31,-124,-127, -31,-123, -79, -31,-122, -76, -31,-124,-127, -31,-123, -79, + -31,-122, -77, -31,-124,-127, -31,-123, -79, -31,-122, -78, -31,-124,-127, -31,-123, -79, -31,-122, + -79, -31,-124,-127, -31,-123, -79, -31,-122, -80, -31,-124,-127, -31,-123, -79, -31,-122, -81, -31, +-124,-127, -31,-123, -79, -31,-122, -82, -31,-124,-127, -31,-123, -79, -31,-122, -83, -31,-124,-127, + -31,-123, -79, -31,-122, -84, -31,-124,-127, -31,-123, -79, -31,-122, -85, -31,-124,-127, -31,-123, + -79, -31,-122, -86, -31,-124,-127, -31,-123, -79, -31,-122, -87, -31,-124,-127, -31,-123, -79, -31, +-122, -88, -31,-124,-127, -31,-123, -80, -31,-121,-126, -31,-124,-127, -31,-123, -80, -31,-121,-127, + -31,-124,-127, -31,-123, -80, -31,-121,-128, -31,-124,-127, -31,-123, -80, -31,-122, -65, -31,-124, +-127, -31,-123, -80, -31,-122, -66, -31,-124,-127, -31,-123, -80, -31,-122, -67, -31,-124,-127, -31, +-123, -80, -31,-122, -68, -31,-124,-127, -31,-123, -80, -31,-122, -69, -31,-124,-127, -31,-123, -80, + -31,-122, -70, -31,-124,-127, -31,-123, -80, -31,-122, -71, -31,-124,-127, -31,-123, -80, -31,-122, + -72, -31,-124,-127, -31,-123, -80, -31,-122, -73, -31,-124,-127, -31,-123, -80, -31,-122, -74, -31, +-124,-127, -31,-123, -80, -31,-122, -75, -31,-124,-127, -31,-123, -80, -31,-122, -76, -31,-124,-127, + -31,-123, -80, -31,-122, -77, -31,-124,-127, -31,-123, -80, -31,-122, -78, -31,-124,-127, -31,-123, + -80, -31,-122, -79, -31,-124,-127, -31,-123, -80, -31,-122, -80, -31,-124,-127, -31,-123, -80, -31, +-122, -81, -31,-124,-127, -31,-123, -80, -31,-122, -82, -31,-124,-127, -31,-123, -80, -31,-122, -83, + -31,-124,-127, -31,-123, -80, -31,-122, -84, -31,-124,-127, -31,-123, -80, -31,-122, -85, -31,-124, +-127, -31,-123, -80, -31,-122, -86, -31,-124,-127, -31,-123, -80, -31,-122, -87, -31,-124,-127, -31, +-123, -80, -31,-122, -88, -31,-124,-127, -31,-123, -81, -31,-121,-126, -31,-124,-127, -31,-123, -81, + -31,-121,-127, -31,-124,-127, -31,-123, -81, -31,-121,-128, -31,-124,-127, -31,-123, -81, -31,-122, + -65, -31,-124,-127, -31,-123, -81, -31,-122, -66, -31,-124,-127, -31,-123, -81, -31,-122, -67, -31, +-124,-127, -31,-123, -81, -31,-122, -68, -31,-124,-127, -31,-123, -81, -31,-122, -69, -31,-124,-127, + -31,-123, -81, -31,-122, -70, -31,-124,-127, -31,-123, -81, -31,-122, -71, -31,-124,-127, -31,-123, + -81, -31,-122, -72, -31,-124,-127, -31,-123, -81, -31,-122, -73, -31,-124,-127, -31,-123, -81, -31, +-122, -74, -31,-124,-127, -31,-123, -81, -31,-122, -75, -31,-124,-127, -31,-123, -81, -31,-122, -76, + -31,-124,-127, -31,-123, -81, -31,-122, -77, -31,-124,-127, -31,-123, -81, -31,-122, -78, -31,-124, +-127, -31,-123, -81, -31,-122, -79, -31,-124,-127, -31,-123, -81, -31,-122, -80, -31,-124,-127, -31, +-123, -81, -31,-122, -81, -31,-124,-127, -31,-123, -81, -31,-122, -82, -31,-124,-127, -31,-123, -81, + -31,-122, -83, -31,-124,-127, -31,-123, -81, -31,-122, -84, -31,-124,-127, -31,-123, -81, -31,-122, + -85, -31,-124,-127, -31,-123, -81, -31,-122, -86, -31,-124,-127, -31,-123, -81, -31,-122, -87, -31, +-124,-127, -31,-123, -81, -31,-122, -88, -31,-124,-127, -31,-123, -82, -31,-121,-126, -31,-124,-127, + -31,-123, -82, -31,-121,-127, -31,-124,-127, -31,-123, -82, -31,-121,-128, -31,-124,-127, -31,-123, + -82, -31,-122, -65, -31,-124,-127, -31,-123, -82, -31,-122, -66, -31,-124,-127, -31,-123, -82, -31, +-122, -67, -31,-124,-127, -31,-123, -82, -31,-122, -68, -31,-124,-127, -31,-123, -82, -31,-122, -69, + -31,-124,-127, -31,-123, -82, -31,-122, -70, -31,-124,-127, -31,-123, -82, -31,-122, -71, -31,-124, +-127, -31,-123, -82, -31,-122, -72, -31,-124,-127, -31,-123, -82, -31,-122, -73, -31,-124,-127, -31, +-123, -82, -31,-122, -74, -31,-124,-127, -31,-123, -82, -31,-122, -75, -31,-124,-127, -31,-123, -82, + -31,-122, -76, -31,-124,-127, -31,-123, -82, -31,-122, -77, -31,-124,-127, -31,-123, -82, -31,-122, + -78, -31,-124,-127, -31,-123, -82, -31,-122, -79, -31,-124,-127, -31,-123, -82, -31,-122, -80, -31, +-124,-127, -31,-123, -82, -31,-122, -81, -31,-124,-127, -31,-123, -82, -31,-122, -82, -31,-124,-127, + -31,-123, -82, -31,-122, -83, -31,-124,-127, -31,-123, -82, -31,-122, -84, -31,-124,-127, -31,-123, + -82, -31,-122, -85, -31,-124,-127, -31,-123, -82, -31,-122, -86, -31,-124,-127, -31,-123, -82, -31, +-122, -87, -31,-124,-127, -31,-123, -82, -31,-122, -88, -31,-124,-127, -31,-123, -83, -31,-121,-126, + -31,-124,-127, -31,-123, -83, -31,-121,-127, -31,-124,-127, -31,-123, -83, -31,-121,-128, -31,-124, +-127, -31,-123, -83, -31,-122, -65, -31,-124,-127, -31,-123, -83, -31,-122, -66, -31,-124,-127, -31, +-123, -83, -31,-122, -67, -31,-124,-127, -31,-123, -83, -31,-122, -68, -31,-124,-127, -31,-123, -83, + -31,-122, -69, -31,-124,-127, -31,-123, -83, -31,-122, -70, -31,-124,-127, -31,-123, -83, -31,-122, + -71, -31,-124,-127, -31,-123, -83, -31,-122, -72, -31,-124,-127, -31,-123, -83, -31,-122, -73, -31, +-124,-127, -31,-123, -83, -31,-122, -74, -31,-124,-127, -31,-123, -83, -31,-122, -75, -31,-124,-127, + -31,-123, -83, -31,-122, -76, -31,-124,-127, -31,-123, -83, -31,-122, -77, -31,-124,-127, -31,-123, + -83, -31,-122, -78, -31,-124,-127, -31,-123, -83, -31,-122, -79, -31,-124,-127, -31,-123, -83, -31, +-122, -80, -31,-124,-127, -31,-123, -83, -31,-122, -81, -31,-124,-127, -31,-123, -83, -31,-122, -82, + -31,-124,-127, -31,-123, -83, -31,-122, -83, -31,-124,-127, -31,-123, -83, -31,-122, -84, -31,-124, +-127, -31,-123, -83, -31,-122, -85, -31,-124,-127, -31,-123, -83, -31,-122, -86, -31,-124,-127, -31, +-123, -83, -31,-122, -87, -31,-124,-127, -31,-123, -83, -31,-122, -88, -31,-124,-127, -31,-123, -84, + -31,-121,-126, -31,-124,-127, -31,-123, -84, -31,-121,-127, -31,-124,-127, -31,-123, -84, -31,-121, +-128, -31,-124,-127, -31,-123, -84, -31,-122, -65, -31,-124,-127, -31,-123, -84, -31,-122, -66, -31, +-124,-127, -31,-123, -84, -31,-122, -67, -31,-124,-127, -31,-123, -84, -31,-122, -68, -31,-124,-127, + -31,-123, -84, -31,-122, -69, -31,-124,-127, -31,-123, -84, -31,-122, -70, -31,-124,-127, -31,-123, + -84, -31,-122, -71, -31,-124,-127, -31,-123, -84, -31,-122, -72, -31,-124,-127, -31,-123, -84, -31, +-122, -73, -31,-124,-127, -31,-123, -84, -31,-122, -74, -31,-124,-127, -31,-123, -84, -31,-122, -75, + -31,-124,-127, -31,-123, -84, -31,-122, -76, -31,-124,-127, -31,-123, -84, -31,-122, -77, -31,-124, +-127, -31,-123, -84, -31,-122, -78, -31,-124,-127, -31,-123, -84, -31,-122, -79, -31,-124,-127, -31, +-123, -84, -31,-122, -80, -31,-124,-127, -31,-123, -84, -31,-122, -81, -31,-124,-127, -31,-123, -84, + -31,-122, -82, -31,-124,-127, -31,-123, -84, -31,-122, -83, -31,-124,-127, -31,-123, -84, -31,-122, + -84, -31,-124,-127, -31,-123, -84, -31,-122, -85, -31,-124,-127, -31,-123, -84, -31,-122, -86, -31, +-124,-127, -31,-123, -84, -31,-122, -87, -31,-124,-127, -31,-123, -84, -31,-122, -88, -31,-124,-127, + -31,-123, -85, -31,-121,-126, -31,-124,-127, -31,-123, -85, -31,-121,-127, -31,-124,-127, -31,-123, + -85, -31,-121,-128, -31,-124,-127, -31,-123, -85, -31,-122, -65, -31,-124,-127, -31,-123, -85, -31, +-122, -66, -31,-124,-127, -31,-123, -85, -31,-122, -67, -31,-124,-127, -31,-123, -85, -31,-122, -68, + -31,-124,-127, -31,-123, -85, -31,-122, -69, -31,-124,-127, -31,-123, -85, -31,-122, -70, -31,-124, +-127, -31,-123, -85, -31,-122, -71, -31,-124,-127, -31,-123, -85, -31,-122, -72, -31,-124,-127, -31, +-123, -85, -31,-122, -73, -31,-124,-127, -31,-123, -85, -31,-122, -74, -31,-124,-127, -31,-123, -85, + -31,-122, -75, -31,-124,-127, -31,-123, -85, -31,-122, -76, -31,-124,-127, -31,-123, -85, -31,-122, + -77, -31,-124,-127, -31,-123, -85, -31,-122, -78, -31,-124,-127, -31,-123, -85, -31,-122, -79, -31, +-124,-127, -31,-123, -85, -31,-122, -80, -31,-124,-127, -31,-123, -85, -31,-122, -81, -31,-124,-127, + -31,-123, -85, -31,-122, -82, -31,-124,-127, -31,-123, -85, -31,-122, -83, -31,-124,-127, -31,-123, + -85, -31,-122, -84, -31,-124,-127, -31,-123, -85, -31,-122, -85, -31,-124,-127, -31,-123, -85, -31, +-122, -86, -31,-124,-127, -31,-123, -85, -31,-122, -87, -31,-124,-127, -31,-123, -85, -31,-122, -88, + -31,-124,-127, -31,-123, -86, -31,-121,-126, -31,-124,-127, -31,-123, -86, -31,-121,-127, -31,-124, +-127, -31,-123, -86, -31,-121,-128, -31,-124,-127, -31,-123, -86, -31,-122, -65, -31,-124,-127, -31, +-123, -86, -31,-122, -66, -31,-124,-127, -31,-123, -86, -31,-122, -67, -31,-124,-127, -31,-123, -86, + -31,-122, -68, -31,-124,-127, -31,-123, -86, -31,-122, -69, -31,-124,-127, -31,-123, -86, -31,-122, + -70, -31,-124,-127, -31,-123, -86, -31,-122, -71, -31,-124,-127, -31,-123, -86, -31,-122, -72, -31, +-124,-127, -31,-123, -86, -31,-122, -73, -31,-124,-127, -31,-123, -86, -31,-122, -74, -31,-124,-127, + -31,-123, -86, -31,-122, -75, -31,-124,-127, -31,-123, -86, -31,-122, -76, -31,-124,-127, -31,-123, + -86, -31,-122, -77, -31,-124,-127, -31,-123, -86, -31,-122, -78, -31,-124,-127, -31,-123, -86, -31, +-122, -79, -31,-124,-127, -31,-123, -86, -31,-122, -80, -31,-124,-127, -31,-123, -86, -31,-122, -81, + -31,-124,-127, -31,-123, -86, -31,-122, -82, -31,-124,-127, -31,-123, -86, -31,-122, -83, -31,-124, +-127, -31,-123, -86, -31,-122, -84, -31,-124,-127, -31,-123, -86, -31,-122, -85, -31,-124,-127, -31, +-123, -86, -31,-122, -86, -31,-124,-127, -31,-123, -86, -31,-122, -87, -31,-124,-127, -31,-123, -86, + -31,-122, -88, -31,-124,-127, -31,-123, -87, -31,-121,-126, -31,-124,-127, -31,-123, -87, -31,-121, +-127, -31,-124,-127, -31,-123, -87, -31,-121,-128, -31,-124,-127, -31,-123, -87, -31,-122, -65, -31, +-124,-127, -31,-123, -87, -31,-122, -66, -31,-124,-127, -31,-123, -87, -31,-122, -67, -31,-124,-127, + -31,-123, -87, -31,-122, -68, -31,-124,-127, -31,-123, -87, -31,-122, -69, -31,-124,-127, -31,-123, + -87, -31,-122, -70, -31,-124,-127, -31,-123, -87, -31,-122, -71, -31,-124,-127, -31,-123, -87, -31, +-122, -72, -31,-124,-127, -31,-123, -87, -31,-122, -73, -31,-124,-127, -31,-123, -87, -31,-122, -74, + -31,-124,-127, -31,-123, -87, -31,-122, -75, -31,-124,-127, -31,-123, -87, -31,-122, -76, -31,-124, +-127, -31,-123, -87, -31,-122, -77, -31,-124,-127, -31,-123, -87, -31,-122, -78, -31,-124,-127, -31, +-123, -87, -31,-122, -79, -31,-124,-127, -31,-123, -87, -31,-122, -80, -31,-124,-127, -31,-123, -87, + -31,-122, -81, -31,-124,-127, -31,-123, -87, -31,-122, -82, -31,-124,-127, -31,-123, -87, -31,-122, + -83, -31,-124,-127, -31,-123, -87, -31,-122, -84, -31,-124,-127, -31,-123, -87, -31,-122, -85, -31, +-124,-127, -31,-123, -87, -31,-122, -86, -31,-124,-127, -31,-123, -87, -31,-122, -87, -31,-124,-127, + -31,-123, -87, -31,-122, -88, -31,-124,-127, -31,-123, -88, -31,-121,-126, -31,-124,-127, -31,-123, + -88, -31,-121,-127, -31,-124,-127, -31,-123, -88, -31,-121,-128, -31,-124,-127, -31,-123, -88, -31, +-122, -65, -31,-124,-127, -31,-123, -88, -31,-122, -66, -31,-124,-127, -31,-123, -88, -31,-122, -67, + -31,-124,-127, -31,-123, -88, -31,-122, -68, -31,-124,-127, -31,-123, -88, -31,-122, -69, -31,-124, +-127, -31,-123, -88, -31,-122, -70, -31,-124,-127, -31,-123, -88, -31,-122, -71, -31,-124,-127, -31, +-123, -88, -31,-122, -72, -31,-124,-127, -31,-123, -88, -31,-122, -73, -31,-124,-127, -31,-123, -88, + -31,-122, -74, -31,-124,-127, -31,-123, -88, -31,-122, -75, -31,-124,-127, -31,-123, -88, -31,-122, + -76, -31,-124,-127, -31,-123, -88, -31,-122, -77, -31,-124,-127, -31,-123, -88, -31,-122, -78, -31, +-124,-127, -31,-123, -88, -31,-122, -79, -31,-124,-127, -31,-123, -88, -31,-122, -80, -31,-124,-127, + -31,-123, -88, -31,-122, -81, -31,-124,-127, -31,-123, -88, -31,-122, -82, -31,-124,-127, -31,-123, + -88, -31,-122, -83, -31,-124,-127, -31,-123, -88, -31,-122, -84, -31,-124,-127, -31,-123, -88, -31, +-122, -85, -31,-124,-127, -31,-123, -88, -31,-122, -86, -31,-124,-127, -31,-123, -88, -31,-122, -87, + -31,-124,-127, -31,-123, -88, -31,-122, -88, -31,-124,-127, -31,-123, -89, -31,-121,-126, -31,-124, +-127, -31,-123, -89, -31,-121,-127, -31,-124,-127, -31,-123, -89, -31,-121,-128, -31,-124,-127, -31, +-123, -89, -31,-122, -65, -31,-124,-127, -31,-123, -89, -31,-122, -66, -31,-124,-127, -31,-123, -89, + -31,-122, -67, -31,-124,-127, -31,-123, -89, -31,-122, -68, -31,-124,-127, -31,-123, -89, -31,-122, + -69, -31,-124,-127, -31,-123, -89, -31,-122, -70, -31,-124,-127, -31,-123, -89, -31,-122, -71, -31, +-124,-127, -31,-123, -89, -31,-122, -72, -31,-124,-127, -31,-123, -89, -31,-122, -73, -31,-124,-127, + -31,-123, -89, -31,-122, -74, -31,-124,-127, -31,-123, -89, -31,-122, -75, -31,-124,-127, -31,-123, + -89, -31,-122, -76, -31,-124,-127, -31,-123, -89, -31,-122, -77, -31,-124,-127, -31,-123, -89, -31, +-122, -78, -31,-124,-127, -31,-123, -89, -31,-122, -79, -31,-124,-127, -31,-123, -89, -31,-122, -80, + -31,-124,-127, -31,-123, -89, -31,-122, -81, -31,-124,-127, -31,-123, -89, -31,-122, -82, -31,-124, +-127, -31,-123, -89, -31,-122, -83, -31,-124,-127, -31,-123, -89, -31,-122, -84, -31,-124,-127, -31, +-123, -89, -31,-122, -85, -31,-124,-127, -31,-123, -89, -31,-122, -86, -31,-124,-127, -31,-123, -89, + -31,-122, -87, -31,-124,-127, -31,-123, -89, -31,-122, -88, -31,-124,-127, -31,-123, -90, -31,-121, +-126, -31,-124,-127, -31,-123, -90, -31,-121,-127, -31,-124,-127, -31,-123, -90, -31,-121,-128, -31, +-124,-127, -31,-123, -90, -31,-122, -65, -31,-124,-127, -31,-123, -90, -31,-122, -66, -31,-124,-127, + -31,-123, -90, -31,-122, -67, -31,-124,-127, -31,-123, -90, -31,-122, -68, -31,-124,-127, -31,-123, + -90, -31,-122, -69, -31,-124,-127, -31,-123, -90, -31,-122, -70, -31,-124,-127, -31,-123, -90, -31, +-122, -71, -31,-124,-127, -31,-123, -90, -31,-122, -72, -31,-124,-127, -31,-123, -90, -31,-122, -73, + -31,-124,-127, -31,-123, -90, -31,-122, -74, -31,-124,-127, -31,-123, -90, -31,-122, -75, -31,-124, +-127, -31,-123, -90, -31,-122, -76, -31,-124,-127, -31,-123, -90, -31,-122, -77, -31,-124,-127, -31, +-123, -90, -31,-122, -78, -31,-124,-127, -31,-123, -90, -31,-122, -79, -31,-124,-127, -31,-123, -90, + -31,-122, -80, -31,-124,-127, -31,-123, -90, -31,-122, -81, -31,-124,-127, -31,-123, -90, -31,-122, + -82, -31,-124,-127, -31,-123, -90, -31,-122, -83, -31,-124,-127, -31,-123, -90, -31,-122, -84, -31, +-124,-127, -31,-123, -90, -31,-122, -85, -31,-124,-127, -31,-123, -90, -31,-122, -86, -31,-124,-127, + -31,-123, -90, -31,-122, -87, -31,-124,-127, -31,-123, -90, -31,-122, -88, -31,-124,-127, -31,-123, + -91, -31,-121,-126, -31,-124,-127, -31,-123, -91, -31,-121,-127, -31,-124,-127, -31,-123, -91, -31, +-121,-128, -31,-124,-127, -31,-123, -91, -31,-122, -65, -31,-124,-127, -31,-123, -91, -31,-122, -66, + -31,-124,-127, -31,-123, -91, -31,-122, -67, -31,-124,-127, -31,-123, -91, -31,-122, -68, -31,-124, +-127, -31,-123, -91, -31,-122, -69, -31,-124,-127, -31,-123, -91, -31,-122, -70, -31,-124,-127, -31, +-123, -91, -31,-122, -71, -31,-124,-127, -31,-123, -91, -31,-122, -72, -31,-124,-127, -31,-123, -91, + -31,-122, -73, -31,-124,-127, -31,-123, -91, -31,-122, -74, -31,-124,-127, -31,-123, -91, -31,-122, + -75, -31,-124,-127, -31,-123, -91, -31,-122, -76, -31,-124,-127, -31,-123, -91, -31,-122, -77, -31, +-124,-127, -31,-123, -91, -31,-122, -78, -31,-124,-127, -31,-123, -91, -31,-122, -79, -31,-124,-127, + -31,-123, -91, -31,-122, -80, -31,-124,-127, -31,-123, -91, -31,-122, -81, -31,-124,-127, -31,-123, + -91, -31,-122, -82, -31,-124,-127, -31,-123, -91, -31,-122, -83, -31,-124,-127, -31,-123, -91, -31, +-122, -84, -31,-124,-127, -31,-123, -91, -31,-122, -85, -31,-124,-127, -31,-123, -91, -31,-122, -86, + -31,-124,-127, -31,-123, -91, -31,-122, -87, -31,-124,-127, -31,-123, -91, -31,-122, -88, -31,-124, +-127, -31,-123, -92, -31,-121,-126, -31,-124,-127, -31,-123, -92, -31,-121,-127, -31,-124,-127, -31, +-123, -92, -31,-121,-128, -31,-124,-127, -31,-123, -92, -31,-122, -65, -31,-124,-127, -31,-123, -92, + -31,-122, -66, -31,-124,-127, -31,-123, -92, -31,-122, -67, -31,-124,-127, -31,-123, -92, -31,-122, + -68, -31,-124,-127, -31,-123, -92, -31,-122, -69, -31,-124,-127, -31,-123, -92, -31,-122, -70, -31, +-124,-127, -31,-123, -92, -31,-122, -71, -31,-124,-127, -31,-123, -92, -31,-122, -72, -31,-124,-127, + -31,-123, -92, -31,-122, -73, -31,-124,-127, -31,-123, -92, -31,-122, -74, -31,-124,-127, -31,-123, + -92, -31,-122, -75, -31,-124,-127, -31,-123, -92, -31,-122, -76, -31,-124,-127, -31,-123, -92, -31, +-122, -77, -31,-124,-127, -31,-123, -92, -31,-122, -78, -31,-124,-127, -31,-123, -92, -31,-122, -79, + -31,-124,-127, -31,-123, -92, -31,-122, -80, -31,-124,-127, -31,-123, -92, -31,-122, -81, -31,-124, +-127, -31,-123, -92, -31,-122, -82, -31,-124,-127, -31,-123, -92, -31,-122, -83, -31,-124,-127, -31, +-123, -92, -31,-122, -84, -31,-124,-127, -31,-123, -92, -31,-122, -85, -31,-124,-127, -31,-123, -92, + -31,-122, -86, -31,-124,-127, -31,-123, -92, -31,-122, -87, -31,-124,-127, -31,-123, -92, -31,-122, + -88, -31,-124,-127, -31,-123, -93, -31,-121,-126, -31,-124,-127, -31,-123, -93, -31,-121,-127, -31, +-124,-127, -31,-123, -93, -31,-121,-128, -31,-124,-127, -31,-123, -93, -31,-122, -65, -31,-124,-127, + -31,-123, -93, -31,-122, -66, -31,-124,-127, -31,-123, -93, -31,-122, -67, -31,-124,-127, -31,-123, + -93, -31,-122, -68, -31,-124,-127, -31,-123, -93, -31,-122, -69, -31,-124,-127, -31,-123, -93, -31, +-122, -70, -31,-124,-127, -31,-123, -93, -31,-122, -71, -31,-124,-127, -31,-123, -93, -31,-122, -72, + -31,-124,-127, -31,-123, -93, -31,-122, -73, -31,-124,-127, -31,-123, -93, -31,-122, -74, -31,-124, +-127, -31,-123, -93, -31,-122, -75, -31,-124,-127, -31,-123, -93, -31,-122, -76, -31,-124,-127, -31, +-123, -93, -31,-122, -77, -31,-124,-127, -31,-123, -93, -31,-122, -78, -31,-124,-127, -31,-123, -93, + -31,-122, -79, -31,-124,-127, -31,-123, -93, -31,-122, -80, -31,-124,-127, -31,-123, -93, -31,-122, + -81, -31,-124,-127, -31,-123, -93, -31,-122, -82, -31,-124,-127, -31,-123, -93, -31,-122, -83, -31, +-124,-127, -31,-123, -93, -31,-122, -84, -31,-124,-127, -31,-123, -93, -31,-122, -85, -31,-124,-127, + -31,-123, -93, -31,-122, -86, -31,-124,-127, -31,-123, -93, -31,-122, -87, -31,-124,-127, -31,-123, + -93, -31,-122, -88, -31,-124,-127, -31,-123, -94, -31,-121,-126, -31,-124,-127, -31,-123, -94, -31, +-121,-127, -31,-124,-127, -31,-123, -94, -31,-121,-128, -31,-124,-127, -31,-123, -94, -31,-122, -65, + -31,-124,-127, -31,-123, -94, -31,-122, -66, -31,-124,-127, -31,-123, -94, -31,-122, -67, -31,-124, +-127, -31,-123, -94, -31,-122, -68, -31,-124,-127, -31,-123, -94, -31,-122, -69, -31,-124,-127, -31, +-123, -94, -31,-122, -70, -31,-124,-127, -31,-123, -94, -31,-122, -71, -31,-124,-127, -31,-123, -94, + -31,-122, -72, -31,-124,-127, -31,-123, -94, -31,-122, -73, -31,-124,-127, -31,-123, -94, -31,-122, + -74, -31,-124,-127, -31,-123, -94, -31,-122, -75, -31,-124,-127, -31,-123, -94, -31,-122, -76, -31, +-124,-127, -31,-123, -94, -31,-122, -77, -31,-124,-127, -31,-123, -94, -31,-122, -78, -31,-124,-127, + -31,-123, -94, -31,-122, -79, -31,-124,-127, -31,-123, -94, -31,-122, -80, -31,-124,-127, -31,-123, + -94, -31,-122, -81, -31,-124,-127, -31,-123, -94, -31,-122, -82, -31,-124,-127, -31,-123, -94, -31, +-122, -83, -31,-124,-127, -31,-123, -94, -31,-122, -84, -31,-124,-127, -31,-123, -94, -31,-122, -85, + -31,-124,-127, -31,-123, -94, -31,-122, -86, -31,-124,-127, -31,-123, -94, -31,-122, -87, -31,-124, +-127, -31,-123, -94, -31,-122, -88, -31,-124,-127, -31,-123, -95, -31,-121,-126, -31,-124,-127, -31, +-123, -95, -31,-121,-127, -31,-124,-127, -31,-123, -95, -31,-121,-128, -31,-124,-127, -31,-123, -95, + -31,-122, -65, -31,-124,-127, -31,-123, -95, -31,-122, -66, -31,-124,-127, -31,-123, -95, -31,-122, + -67, -31,-124,-127, -31,-123, -95, -31,-122, -68, -31,-124,-127, -31,-123, -95, -31,-122, -69, -31, +-124,-127, -31,-123, -95, -31,-122, -70, -31,-124,-127, -31,-123, -95, -31,-122, -71, -31,-124,-127, + -31,-123, -95, -31,-122, -72, -31,-124,-127, -31,-123, -95, -31,-122, -73, -31,-124,-127, -31,-123, + -95, -31,-122, -74, -31,-124,-127, -31,-123, -95, -31,-122, -75, -31,-124,-127, -31,-123, -95, -31, +-122, -76, -31,-124,-127, -31,-123, -95, -31,-122, -77, -31,-124,-127, -31,-123, -95, -31,-122, -78, + -31,-124,-127, -31,-123, -95, -31,-122, -79, -31,-124,-127, -31,-123, -95, -31,-122, -80, -31,-124, +-127, -31,-123, -95, -31,-122, -81, -31,-124,-127, -31,-123, -95, -31,-122, -82, -31,-124,-127, -31, +-123, -95, -31,-122, -83, -31,-124,-127, -31,-123, -95, -31,-122, -84, -31,-124,-127, -31,-123, -95, + -31,-122, -85, -31,-124,-127, -31,-123, -95, -31,-122, -86, -31,-124,-127, -31,-123, -95, -31,-122, + -87, -31,-124,-127, -31,-123, -95, -31,-122, -88, -31,-124,-128, -31,-123, -75, -31,-121,-126, -31, +-124,-128, -31,-123, -75, -31,-121,-127, -31,-124,-128, -31,-123, -75, -31,-121,-128, -31,-124,-128, + -31,-123, -75, -31,-122, -65, -31,-124,-128, -31,-123, -75, -31,-122, -66, -31,-124,-128, -31,-123, + -75, -31,-122, -67, -31,-124,-128, -31,-123, -75, -31,-122, -68, -31,-124,-128, -31,-123, -75, -31, +-122, -69, -31,-124,-128, -31,-123, -75, -31,-122, -70, -31,-124,-128, -31,-123, -75, -31,-122, -71, + -31,-124,-128, -31,-123, -75, -31,-122, -72, -31,-124,-128, -31,-123, -75, -31,-122, -73, -31,-124, +-128, -31,-123, -75, -31,-122, -74, -31,-124,-128, -31,-123, -75, -31,-122, -75, -31,-124,-128, -31, +-123, -75, -31,-122, -76, -31,-124,-128, -31,-123, -75, -31,-122, -77, -31,-124,-128, -31,-123, -75, + -31,-122, -78, -31,-124,-128, -31,-123, -75, -31,-122, -79, -31,-124,-128, -31,-123, -75, -31,-122, + -80, -31,-124,-128, -31,-123, -75, -31,-122, -81, -31,-124,-128, -31,-123, -75, -31,-122, -82, -31, +-124,-128, -31,-123, -75, -31,-122, -83, -31,-124,-128, -31,-123, -75, -31,-122, -84, -31,-124,-128, + -31,-123, -75, -31,-122, -85, -31,-124,-128, -31,-123, -75, -31,-122, -86, -31,-124,-128, -31,-123, + -75, -31,-122, -87, -31,-124,-128, -31,-123, -75, -31,-122, -88, -31,-124,-128, -31,-123, -76, -31, +-121,-126, -31,-124,-128, -31,-123, -76, -31,-121,-127, -31,-124,-128, -31,-123, -76, -31,-121,-128, + -31,-124,-128, -31,-123, -76, -31,-122, -65, -31,-124,-128, -31,-123, -76, -31,-122, -66, -31,-124, +-128, -31,-123, -76, -31,-122, -67, -31,-124,-128, -31,-123, -76, -31,-122, -68, -31,-124,-128, -31, +-123, -76, -31,-122, -69, -31,-124,-128, -31,-123, -76, -31,-122, -70, -31,-124,-128, -31,-123, -76, + -31,-122, -71, -31,-124,-128, -31,-123, -76, -31,-122, -72, -31,-124,-128, -31,-123, -76, -31,-122, + -73, -31,-124,-128, -31,-123, -76, -31,-122, -74, -31,-124,-128, -31,-123, -76, -31,-122, -75, -31, +-124,-128, -31,-123, -76, -31,-122, -76, -31,-124,-128, -31,-123, -76, -31,-122, -77, -31,-124,-128, + -31,-123, -76, -31,-122, -78, -31,-124,-128, -31,-123, -76, -31,-122, -79, -31,-124,-128, -31,-123, + -76, -31,-122, -80, -31,-124,-128, -31,-123, -76, -31,-122, -81, -31,-124,-128, -31,-123, -76, -31, +-122, -82, -31,-124,-128, -31,-123, -76, -31,-122, -83, -31,-124,-128, -31,-123, -76, -31,-122, -84, + -31,-124,-128, -31,-123, -76, -31,-122, -85, -31,-124,-128, -31,-123, -76, -31,-122, -86, -31,-124, +-128, -31,-123, -76, -31,-122, -87, -31,-124,-128, -31,-123, -76, -31,-122, -88, -31,-124,-128, -31, +-123, -77, -31,-121,-126, -31,-124,-128, -31,-123, -77, -31,-121,-127, -31,-124,-128, -31,-123, -77, + -31,-121,-128, -31,-124,-128, -31,-123, -77, -31,-122, -65, -31,-124,-128, -31,-123, -77, -31,-122, + -66, -31,-124,-128, -31,-123, -77, -31,-122, -67, -31,-124,-128, -31,-123, -77, -31,-122, -68, -31, +-124,-128, -31,-123, -77, -31,-122, -69, -31,-124,-128, -31,-123, -77, -31,-122, -70, -31,-124,-128, + -31,-123, -77, -31,-122, -71, -31,-124,-128, -31,-123, -77, -31,-122, -72, -31,-124,-128, -31,-123, + -77, -31,-122, -73, -31,-124,-128, -31,-123, -77, -31,-122, -74, -31,-124,-128, -31,-123, -77, -31, +-122, -75, -31,-124,-128, -31,-123, -77, -31,-122, -76, -31,-124,-128, -31,-123, -77, -31,-122, -77, + -31,-124,-128, -31,-123, -77, -31,-122, -78, -31,-124,-128, -31,-123, -77, -31,-122, -79, -31,-124, +-128, -31,-123, -77, -31,-122, -80, -31,-124,-128, -31,-123, -77, -31,-122, -81, -31,-124,-128, -31, +-123, -77, -31,-122, -82, -31,-124,-128, -31,-123, -77, -31,-122, -83, -31,-124,-128, -31,-123, -77, + -31,-122, -84, -31,-124,-128, -31,-123, -77, -31,-122, -85, -31,-124,-128, -31,-123, -77, -31,-122, + -86, -31,-124,-128, -31,-123, -77, -31,-122, -87, -31,-124,-128, -31,-123, -77, -31,-122, -88, -31, +-124,-128, -31,-123, -78, -31,-121,-126, -31,-124,-128, -31,-123, -78, -31,-121,-127, -31,-124,-128, + -31,-123, -78, -31,-121,-128, -31,-124,-128, -31,-123, -78, -31,-122, -65, -31,-124,-128, -31,-123, + -78, -31,-122, -66, -31,-124,-128, -31,-123, -78, -31,-122, -67, -31,-124,-128, -31,-123, -78, -31, +-122, -68, -31,-124,-128, -31,-123, -78, -31,-122, -69, -31,-124,-128, -31,-123, -78, -31,-122, -70, + -31,-124,-128, -31,-123, -78, -31,-122, -71, -31,-124,-128, -31,-123, -78, -31,-122, -72, -31,-124, +-128, -31,-123, -78, -31,-122, -73, -31,-124,-128, -31,-123, -78, -31,-122, -74, -31,-124,-128, -31, +-123, -78, -31,-122, -75, -31,-124,-128, -31,-123, -78, -31,-122, -76, -31,-124,-128, -31,-123, -78, + -31,-122, -77, -31,-124,-128, -31,-123, -78, -31,-122, -78, -31,-124,-128, -31,-123, -78, -31,-122, + -79, -31,-124,-128, -31,-123, -78, -31,-122, -80, -31,-124,-128, -31,-123, -78, -31,-122, -81, -31, +-124,-128, -31,-123, -78, -31,-122, -82, -31,-124,-128, -31,-123, -78, -31,-122, -83, -31,-124,-128, + -31,-123, -78, -31,-122, -84, -31,-124,-128, -31,-123, -78, -31,-122, -85, -31,-124,-128, -31,-123, + -78, -31,-122, -86, -31,-124,-128, -31,-123, -78, -31,-122, -87, -31,-124,-128, -31,-123, -78, -31, +-122, -88, -31,-124,-128, -31,-123, -79, -31,-121,-126, -31,-124,-128, -31,-123, -79, -31,-121,-127, + -31,-124,-128, -31,-123, -79, -31,-121,-128, -31,-124,-128, -31,-123, -79, -31,-122, -65, -31,-124, +-128, -31,-123, -79, -31,-122, -66, -31,-124,-128, -31,-123, -79, -31,-122, -67, -31,-124,-128, -31, +-123, -79, -31,-122, -68, -31,-124,-128, -31,-123, -79, -31,-122, -69, -31,-124,-128, -31,-123, -79, + -31,-122, -70, -31,-124,-128, -31,-123, -79, -31,-122, -71, -31,-124,-128, -31,-123, -79, -31,-122, + -72, -31,-124,-128, -31,-123, -79, -31,-122, -73, -31,-124,-128, -31,-123, -79, -31,-122, -74, -31, +-124,-128, -31,-123, -79, -31,-122, -75, -31,-124,-128, -31,-123, -79, -31,-122, -76, -31,-124,-128, + -31,-123, -79, -31,-122, -77, -31,-124,-128, -31,-123, -79, -31,-122, -78, -31,-124,-128, -31,-123, + -79, -31,-122, -79, -31,-124,-128, -31,-123, -79, -31,-122, -80, -31,-124,-128, -31,-123, -79, -31, +-122, -81, -31,-124,-128, -31,-123, -79, -31,-122, -82, -31,-124,-128, -31,-123, -79, -31,-122, -83, + -31,-124,-128, -31,-123, -79, -31,-122, -84, -31,-124,-128, -31,-123, -79, -31,-122, -85, -31,-124, +-128, -31,-123, -79, -31,-122, -86, -31,-124,-128, -31,-123, -79, -31,-122, -87, -31,-124,-128, -31, +-123, -79, -31,-122, -88, -31,-124,-128, -31,-123, -80, -31,-121,-126, -31,-124,-128, -31,-123, -80, + -31,-121,-127, -31,-124,-128, -31,-123, -80, -31,-121,-128, -31,-124,-128, -31,-123, -80, -31,-122, + -65, -31,-124,-128, -31,-123, -80, -31,-122, -66, -31,-124,-128, -31,-123, -80, -31,-122, -67, -31, +-124,-128, -31,-123, -80, -31,-122, -68, -31,-124,-128, -31,-123, -80, -31,-122, -69, -31,-124,-128, + -31,-123, -80, -31,-122, -70, -31,-124,-128, -31,-123, -80, -31,-122, -71, -31,-124,-128, -31,-123, + -80, -31,-122, -72, -31,-124,-128, -31,-123, -80, -31,-122, -73, -31,-124,-128, -31,-123, -80, -31, +-122, -74, -31,-124,-128, -31,-123, -80, -31,-122, -75, -31,-124,-128, -31,-123, -80, -31,-122, -76, + -31,-124,-128, -31,-123, -80, -31,-122, -77, -31,-124,-128, -31,-123, -80, -31,-122, -78, -31,-124, +-128, -31,-123, -80, -31,-122, -79, -31,-124,-128, -31,-123, -80, -31,-122, -80, -31,-124,-128, -31, +-123, -80, -31,-122, -81, -31,-124,-128, -31,-123, -80, -31,-122, -82, -31,-124,-128, -31,-123, -80, + -31,-122, -83, -31,-124,-128, -31,-123, -80, -31,-122, -84, -31,-124,-128, -31,-123, -80, -31,-122, + -85, -31,-124,-128, -31,-123, -80, -31,-122, -86, -31,-124,-128, -31,-123, -80, -31,-122, -87, -31, +-124,-128, -31,-123, -80, -31,-122, -88, -31,-124,-128, -31,-123, -81, -31,-121,-126, -31,-124,-128, + -31,-123, -81, -31,-121,-127, -31,-124,-128, -31,-123, -81, -31,-121,-128, -31,-124,-128, -31,-123, + -81, -31,-122, -65, -31,-124,-128, -31,-123, -81, -31,-122, -66, -31,-124,-128, -31,-123, -81, -31, +-122, -67, -31,-124,-128, -31,-123, -81, -31,-122, -68, -31,-124,-128, -31,-123, -81, -31,-122, -69, + -31,-124,-128, -31,-123, -81, -31,-122, -70, -31,-124,-128, -31,-123, -81, -31,-122, -71, -31,-124, +-128, -31,-123, -81, -31,-122, -72, -31,-124,-128, -31,-123, -81, -31,-122, -73, -31,-124,-128, -31, +-123, -81, -31,-122, -74, -31,-124,-128, -31,-123, -81, -31,-122, -75, -31,-124,-128, -31,-123, -81, + -31,-122, -76, -31,-124,-128, -31,-123, -81, -31,-122, -77, -31,-124,-128, -31,-123, -81, -31,-122, + -78, -31,-124,-128, -31,-123, -81, -31,-122, -79, -31,-124,-128, -31,-123, -81, -31,-122, -80, -31, +-124,-128, -31,-123, -81, -31,-122, -81, -31,-124,-128, -31,-123, -81, -31,-122, -82, -31,-124,-128, + -31,-123, -81, -31,-122, -83, -31,-124,-128, -31,-123, -81, -31,-122, -84, -31,-124,-128, -31,-123, + -81, -31,-122, -85, -31,-124,-128, -31,-123, -81, -31,-122, -86, -31,-124,-128, -31,-123, -81, -31, +-122, -87, -31,-124,-128, -31,-123, -81, -31,-122, -88, -31,-124,-128, -31,-123, -82, -31,-121,-126, + -31,-124,-128, -31,-123, -82, -31,-121,-127, -31,-124,-128, -31,-123, -82, -31,-121,-128, -31,-124, +-128, -31,-123, -82, -31,-122, -65, -31,-124,-128, -31,-123, -82, -31,-122, -66, -31,-124,-128, -31, +-123, -82, -31,-122, -67, -31,-124,-128, -31,-123, -82, -31,-122, -68, -31,-124,-128, -31,-123, -82, + -31,-122, -69, -31,-124,-128, -31,-123, -82, -31,-122, -70, -31,-124,-128, -31,-123, -82, -31,-122, + -71, -31,-124,-128, -31,-123, -82, -31,-122, -72, -31,-124,-128, -31,-123, -82, -31,-122, -73, -31, +-124,-128, -31,-123, -82, -31,-122, -74, -31,-124,-128, -31,-123, -82, -31,-122, -75, -31,-124,-128, + -31,-123, -82, -31,-122, -76, -31,-124,-128, -31,-123, -82, -31,-122, -77, -31,-124,-128, -31,-123, + -82, -31,-122, -78, -31,-124,-128, -31,-123, -82, -31,-122, -79, -31,-124,-128, -31,-123, -82, -31, +-122, -80, -31,-124,-128, -31,-123, -82, -31,-122, -81, -31,-124,-128, -31,-123, -82, -31,-122, -82, + -31,-124,-128, -31,-123, -82, -31,-122, -83, -31,-124,-128, -31,-123, -82, -31,-122, -84, -31,-124, +-128, -31,-123, -82, -31,-122, -85, -31,-124,-128, -31,-123, -82, -31,-122, -86, -31,-124,-128, -31, +-123, -82, -31,-122, -87, -31,-124,-128, -31,-123, -82, -31,-122, -88, -31,-124,-128, -31,-123, -83, + -31,-121,-126, -31,-124,-128, -31,-123, -83, -31,-121,-127, -31,-124,-128, -31,-123, -83, -31,-121, +-128, -31,-124,-128, -31,-123, -83, -31,-122, -65, -31,-124,-128, -31,-123, -83, -31,-122, -66, -31, +-124,-128, -31,-123, -83, -31,-122, -67, -31,-124,-128, -31,-123, -83, -31,-122, -68, -31,-124,-128, + -31,-123, -83, -31,-122, -69, -31,-124,-128, -31,-123, -83, -31,-122, -70, -31,-124,-128, -31,-123, + -83, -31,-122, -71, -31,-124,-128, -31,-123, -83, -31,-122, -72, -31,-124,-128, -31,-123, -83, -31, +-122, -73, -31,-124,-128, -31,-123, -83, -31,-122, -74, -31,-124,-128, -31,-123, -83, -31,-122, -75, + -31,-124,-128, -31,-123, -83, -31,-122, -76, -31,-124,-128, -31,-123, -83, -31,-122, -77, -31,-124, +-128, -31,-123, -83, -31,-122, -78, -31,-124,-128, -31,-123, -83, -31,-122, -79, -31,-124,-128, -31, +-123, -83, -31,-122, -80, -31,-124,-128, -31,-123, -83, -31,-122, -81, -31,-124,-128, -31,-123, -83, + -31,-122, -82, -31,-124,-128, -31,-123, -83, -31,-122, -83, -31,-124,-128, -31,-123, -83, -31,-122, + -84, -31,-124,-128, -31,-123, -83, -31,-122, -85, -31,-124,-128, -31,-123, -83, -31,-122, -86, -31, +-124,-128, -31,-123, -83, -31,-122, -87, -31,-124,-128, -31,-123, -83, -31,-122, -88, -31,-124,-128, + -31,-123, -84, -31,-121,-126, -31,-124,-128, -31,-123, -84, -31,-121,-127, -31,-124,-128, -31,-123, + -84, -31,-121,-128, -31,-124,-128, -31,-123, -84, -31,-122, -65, -31,-124,-128, -31,-123, -84, -31, +-122, -66, -31,-124,-128, -31,-123, -84, -31,-122, -67, -31,-124,-128, -31,-123, -84, -31,-122, -68, + -31,-124,-128, -31,-123, -84, -31,-122, -69, -31,-124,-128, -31,-123, -84, -31,-122, -70, -31,-124, +-128, -31,-123, -84, -31,-122, -71, -31,-124,-128, -31,-123, -84, -31,-122, -72, -31,-124,-128, -31, +-123, -84, -31,-122, -73, -31,-124,-128, -31,-123, -84, -31,-122, -74, -31,-124,-128, -31,-123, -84, + -31,-122, -75, -31,-124,-128, -31,-123, -84, -31,-122, -76, -31,-124,-128, -31,-123, -84, -31,-122, + -77, -31,-124,-128, -31,-123, -84, -31,-122, -78, -31,-124,-128, -31,-123, -84, -31,-122, -79, -31, +-124,-128, -31,-123, -84, -31,-122, -80, -31,-124,-128, -31,-123, -84, -31,-122, -81, -31,-124,-128, + -31,-123, -84, -31,-122, -82, -31,-124,-128, -31,-123, -84, -31,-122, -83, -31,-124,-128, -31,-123, + -84, -31,-122, -84, -31,-124,-128, -31,-123, -84, -31,-122, -85, -31,-124,-128, -31,-123, -84, -31, +-122, -86, -31,-124,-128, -31,-123, -84, -31,-122, -87, -31,-124,-128, -31,-123, -84, -31,-122, -88, + -31,-124,-128, -31,-123, -85, -31,-121,-126, -31,-124,-128, -31,-123, -85, -31,-121,-127, -31,-124, +-128, -31,-123, -85, -31,-121,-128, -31,-124,-128, -31,-123, -85, -31,-122, -65, -31,-124,-128, -31, +-123, -85, -31,-122, -66, -31,-124,-128, -31,-123, -85, -31,-122, -67, -31,-124,-128, -31,-123, -85, + -31,-122, -68, -31,-124,-128, -31,-123, -85, -31,-122, -69, -31,-124,-128, -31,-123, -85, -31,-122, + -70, -31,-124,-128, -31,-123, -85, -31,-122, -71, -31,-124,-128, -31,-123, -85, -31,-122, -72, -31, +-124,-128, -31,-123, -85, -31,-122, -73, -31,-124,-128, -31,-123, -85, -31,-122, -74, -31,-124,-128, + -31,-123, -85, -31,-122, -75, -31,-124,-128, -31,-123, -85, -31,-122, -76, -31,-124,-128, -31,-123, + -85, -31,-122, -77, -31,-124,-128, -31,-123, -85, -31,-122, -78, -31,-124,-128, -31,-123, -85, -31, +-122, -79, -31,-124,-128, -31,-123, -85, -31,-122, -80, -31,-124,-128, -31,-123, -85, -31,-122, -81, + -31,-124,-128, -31,-123, -85, -31,-122, -82, -31,-124,-128, -31,-123, -85, -31,-122, -83, -31,-124, +-128, -31,-123, -85, -31,-122, -84, -31,-124,-128, -31,-123, -85, -31,-122, -85, -31,-124,-128, -31, +-123, -85, -31,-122, -86, -31,-124,-128, -31,-123, -85, -31,-122, -87, -31,-124,-128, -31,-123, -85, + -31,-122, -88, -31,-124,-128, -31,-123, -86, -31,-121,-126, -31,-124,-128, -31,-123, -86, -31,-121, +-127, -31,-124,-128, -31,-123, -86, -31,-121,-128, -31,-124,-128, -31,-123, -86, -31,-122, -65, -31, +-124,-128, -31,-123, -86, -31,-122, -66, -31,-124,-128, -31,-123, -86, -31,-122, -67, -31,-124,-128, + -31,-123, -86, -31,-122, -68, -31,-124,-128, -31,-123, -86, -31,-122, -69, -31,-124,-128, -31,-123, + -86, -31,-122, -70, -31,-124,-128, -31,-123, -86, -31,-122, -71, -31,-124,-128, -31,-123, -86, -31, +-122, -72, -31,-124,-128, -31,-123, -86, -31,-122, -73, -31,-124,-128, -31,-123, -86, -31,-122, -74, + -31,-124,-128, -31,-123, -86, -31,-122, -75, -31,-124,-128, -31,-123, -86, -31,-122, -76, -31,-124, +-128, -31,-123, -86, -31,-122, -77, -31,-124,-128, -31,-123, -86, -31,-122, -78, -31,-124,-128, -31, +-123, -86, -31,-122, -79, -31,-124,-128, -31,-123, -86, -31,-122, -80, -31,-124,-128, -31,-123, -86, + -31,-122, -81, -31,-124,-128, -31,-123, -86, -31,-122, -82, -31,-124,-128, -31,-123, -86, -31,-122, + -83, -31,-124,-128, -31,-123, -86, -31,-122, -84, -31,-124,-128, -31,-123, -86, -31,-122, -85, -31, +-124,-128, -31,-123, -86, -31,-122, -86, -31,-124,-128, -31,-123, -86, -31,-122, -87, -31,-124,-128, + -31,-123, -86, -31,-122, -88, -31,-124,-128, -31,-123, -87, -31,-121,-126, -31,-124,-128, -31,-123, + -87, -31,-121,-127, -31,-124,-128, -31,-123, -87, -31,-121,-128, -31,-124,-128, -31,-123, -87, -31, +-122, -65, -31,-124,-128, -31,-123, -87, -31,-122, -66, -31,-124,-128, -31,-123, -87, -31,-122, -67, + -31,-124,-128, -31,-123, -87, -31,-122, -68, -31,-124,-128, -31,-123, -87, -31,-122, -69, -31,-124, +-128, -31,-123, -87, -31,-122, -70, -31,-124,-128, -31,-123, -87, -31,-122, -71, -31,-124,-128, -31, +-123, -87, -31,-122, -72, -31,-124,-128, -31,-123, -87, -31,-122, -73, -31,-124,-128, -31,-123, -87, + -31,-122, -74, -31,-124,-128, -31,-123, -87, -31,-122, -75, -31,-124,-128, -31,-123, -87, -31,-122, + -76, -31,-124,-128, -31,-123, -87, -31,-122, -77, -31,-124,-128, -31,-123, -87, -31,-122, -78, -31, +-124,-128, -31,-123, -87, -31,-122, -79, -31,-124,-128, -31,-123, -87, -31,-122, -80, -31,-124,-128, + -31,-123, -87, -31,-122, -81, -31,-124,-128, -31,-123, -87, -31,-122, -82, -31,-124,-128, -31,-123, + -87, -31,-122, -83, -31,-124,-128, -31,-123, -87, -31,-122, -84, -31,-124,-128, -31,-123, -87, -31, +-122, -85, -31,-124,-128, -31,-123, -87, -31,-122, -86, -31,-124,-128, -31,-123, -87, -31,-122, -87, + -31,-124,-128, -31,-123, -87, -31,-122, -88, -31,-124,-128, -31,-123, -88, -31,-121,-126, -31,-124, +-128, -31,-123, -88, -31,-121,-127, -31,-124,-128, -31,-123, -88, -31,-121,-128, -31,-124,-128, -31, +-123, -88, -31,-122, -65, -31,-124,-128, -31,-123, -88, -31,-122, -66, -31,-124,-128, -31,-123, -88, + -31,-122, -67, -31,-124,-128, -31,-123, -88, -31,-122, -68, -31,-124,-128, -31,-123, -88, -31,-122, + -69, -31,-124,-128, -31,-123, -88, -31,-122, -70, -31,-124,-128, -31,-123, -88, -31,-122, -71, -31, +-124,-128, -31,-123, -88, -31,-122, -72, -31,-124,-128, -31,-123, -88, -31,-122, -73, -31,-124,-128, + -31,-123, -88, -31,-122, -74, -31,-124,-128, -31,-123, -88, -31,-122, -75, -31,-124,-128, -31,-123, + -88, -31,-122, -76, -31,-124,-128, -31,-123, -88, -31,-122, -77, -31,-124,-128, -31,-123, -88, -31, +-122, -78, -31,-124,-128, -31,-123, -88, -31,-122, -79, -31,-124,-128, -31,-123, -88, -31,-122, -80, + -31,-124,-128, -31,-123, -88, -31,-122, -81, -31,-124,-128, -31,-123, -88, -31,-122, -82, -31,-124, +-128, -31,-123, -88, -31,-122, -83, -31,-124,-128, -31,-123, -88, -31,-122, -84, -31,-124,-128, -31, +-123, -88, -31,-122, -85, -31,-124,-128, -31,-123, -88, -31,-122, -86, -31,-124,-128, -31,-123, -88, + -31,-122, -87, -31,-124,-128, -31,-123, -88, -31,-122, -88, -31,-124,-128, -31,-123, -89, -31,-121, +-126, -31,-124,-128, -31,-123, -89, -31,-121,-127, -31,-124,-128, -31,-123, -89, -31,-121,-128, -31, +-124,-128, -31,-123, -89, -31,-122, -65, -31,-124,-128, -31,-123, -89, -31,-122, -66, -31,-124,-128, + -31,-123, -89, -31,-122, -67, -31,-124,-128, -31,-123, -89, -31,-122, -68, -31,-124,-128, -31,-123, + -89, -31,-122, -69, -31,-124,-128, -31,-123, -89, -31,-122, -70, -31,-124,-128, -31,-123, -89, -31, +-122, -71, -31,-124,-128, -31,-123, -89, -31,-122, -72, -31,-124,-128, -31,-123, -89, -31,-122, -73, + -31,-124,-128, -31,-123, -89, -31,-122, -74, -31,-124,-128, -31,-123, -89, -31,-122, -75, -31,-124, +-128, -31,-123, -89, -31,-122, -76, -31,-124,-128, -31,-123, -89, -31,-122, -77, -31,-124,-128, -31, +-123, -89, -31,-122, -78, -31,-124,-128, -31,-123, -89, -31,-122, -79, -31,-124,-128, -31,-123, -89, + -31,-122, -80, -31,-124,-128, -31,-123, -89, -31,-122, -81, -31,-124,-128, -31,-123, -89, -31,-122, + -82, -31,-124,-128, -31,-123, -89, -31,-122, -83, -31,-124,-128, -31,-123, -89, -31,-122, -84, -31, +-124,-128, -31,-123, -89, -31,-122, -85, -31,-124,-128, -31,-123, -89, -31,-122, -86, -31,-124,-128, + -31,-123, -89, -31,-122, -87, -31,-124,-128, -31,-123, -89, -31,-122, -88, -31,-124,-128, -31,-123, + -90, -31,-121,-126, -31,-124,-128, -31,-123, -90, -31,-121,-127, -31,-124,-128, -31,-123, -90, -31, +-121,-128, -31,-124,-128, -31,-123, -90, -31,-122, -65, -31,-124,-128, -31,-123, -90, -31,-122, -66, + -31,-124,-128, -31,-123, -90, -31,-122, -67, -31,-124,-128, -31,-123, -90, -31,-122, -68, -31,-124, +-128, -31,-123, -90, -31,-122, -69, -31,-124,-128, -31,-123, -90, -31,-122, -70, -31,-124,-128, -31, +-123, -90, -31,-122, -71, -31,-124,-128, -31,-123, -90, -31,-122, -72, -31,-124,-128, -31,-123, -90, + -31,-122, -73, -31,-124,-128, -31,-123, -90, -31,-122, -74, -31,-124,-128, -31,-123, -90, -31,-122, + -75, -31,-124,-128, -31,-123, -90, -31,-122, -76, -31,-124,-128, -31,-123, -90, -31,-122, -77, -31, +-124,-128, -31,-123, -90, -31,-122, -78, -31,-124,-128, -31,-123, -90, -31,-122, -79, -31,-124,-128, + -31,-123, -90, -31,-122, -80, -31,-124,-128, -31,-123, -90, -31,-122, -81, -31,-124,-128, -31,-123, + -90, -31,-122, -82, -31,-124,-128, -31,-123, -90, -31,-122, -83, -31,-124,-128, -31,-123, -90, -31, +-122, -84, -31,-124,-128, -31,-123, -90, -31,-122, -85, -31,-124,-128, -31,-123, -90, -31,-122, -86, + -31,-124,-128, -31,-123, -90, -31,-122, -87, -31,-124,-128, -31,-123, -90, -31,-122, -88, -31,-124, +-128, -31,-123, -91, -31,-121,-126, -31,-124,-128, -31,-123, -91, -31,-121,-127, -31,-124,-128, -31, +-123, -91, -31,-121,-128, -31,-124,-128, -31,-123, -91, -31,-122, -65, -31,-124,-128, -31,-123, -91, + -31,-122, -66, -31,-124,-128, -31,-123, -91, -31,-122, -67, -31,-124,-128, -31,-123, -91, -31,-122, + -68, -31,-124,-128, -31,-123, -91, -31,-122, -69, -31,-124,-128, -31,-123, -91, -31,-122, -70, -31, +-124,-128, -31,-123, -91, -31,-122, -71, -31,-124,-128, -31,-123, -91, -31,-122, -72, -31,-124,-128, + -31,-123, -91, -31,-122, -73, -31,-124,-128, -31,-123, -91, -31,-122, -74, -31,-124,-128, -31,-123, + -91, -31,-122, -75, -31,-124,-128, -31,-123, -91, -31,-122, -76, -31,-124,-128, -31,-123, -91, -31, +-122, -77, -31,-124,-128, -31,-123, -91, -31,-122, -78, -31,-124,-128, -31,-123, -91, -31,-122, -79, + -31,-124,-128, -31,-123, -91, -31,-122, -80, -31,-124,-128, -31,-123, -91, -31,-122, -81, -31,-124, +-128, -31,-123, -91, -31,-122, -82, -31,-124,-128, -31,-123, -91, -31,-122, -83, -31,-124,-128, -31, +-123, -91, -31,-122, -84, -31,-124,-128, -31,-123, -91, -31,-122, -85, -31,-124,-128, -31,-123, -91, + -31,-122, -86, -31,-124,-128, -31,-123, -91, -31,-122, -87, -31,-124,-128, -31,-123, -91, -31,-122, + -88, -31,-124,-128, -31,-123, -92, -31,-121,-126, -31,-124,-128, -31,-123, -92, -31,-121,-127, -31, +-124,-128, -31,-123, -92, -31,-121,-128, -31,-124,-128, -31,-123, -92, -31,-122, -65, -31,-124,-128, + -31,-123, -92, -31,-122, -66, -31,-124,-128, -31,-123, -92, -31,-122, -67, -31,-124,-128, -31,-123, + -92, -31,-122, -68, -31,-124,-128, -31,-123, -92, -31,-122, -69, -31,-124,-128, -31,-123, -92, -31, +-122, -70, -31,-124,-128, -31,-123, -92, -31,-122, -71, -31,-124,-128, -31,-123, -92, -31,-122, -72, + -31,-124,-128, -31,-123, -92, -31,-122, -73, -31,-124,-128, -31,-123, -92, -31,-122, -74, -31,-124, +-128, -31,-123, -92, -31,-122, -75, -31,-124,-128, -31,-123, -92, -31,-122, -76, -31,-124,-128, -31, +-123, -92, -31,-122, -77, -31,-124,-128, -31,-123, -92, -31,-122, -78, -31,-124,-128, -31,-123, -92, + -31,-122, -79, -31,-124,-128, -31,-123, -92, -31,-122, -80, -31,-124,-128, -31,-123, -92, -31,-122, + -81, -31,-124,-128, -31,-123, -92, -31,-122, -82, -31,-124,-128, -31,-123, -92, -31,-122, -83, -31, +-124,-128, -31,-123, -92, -31,-122, -84, -31,-124,-128, -31,-123, -92, -31,-122, -85, -31,-124,-128, + -31,-123, -92, -31,-122, -86, -31,-124,-128, -31,-123, -92, -31,-122, -87, -31,-124,-128, -31,-123, + -92, -31,-122, -88, -31,-124,-128, -31,-123, -93, -31,-121,-126, -31,-124,-128, -31,-123, -93, -31, +-121,-127, -31,-124,-128, -31,-123, -93, -31,-121,-128, -31,-124,-128, -31,-123, -93, -31,-122, -65, + -31,-124,-128, -31,-123, -93, -31,-122, -66, -31,-124,-128, -31,-123, -93, -31,-122, -67, -31,-124, +-128, -31,-123, -93, -31,-122, -68, -31,-124,-128, -31,-123, -93, -31,-122, -69, -31,-124,-128, -31, +-123, -93, -31,-122, -70, -31,-124,-128, -31,-123, -93, -31,-122, -71, -31,-124,-128, -31,-123, -93, + -31,-122, -72, -31,-124,-128, -31,-123, -93, -31,-122, -73, -31,-124,-128, -31,-123, -93, -31,-122, + -74, -31,-124,-128, -31,-123, -93, -31,-122, -75, -31,-124,-128, -31,-123, -93, -31,-122, -76, -31, +-124,-128, -31,-123, -93, -31,-122, -77, -31,-124,-128, -31,-123, -93, -31,-122, -78, -31,-124,-128, + -31,-123, -93, -31,-122, -79, -31,-124,-128, -31,-123, -93, -31,-122, -80, -31,-124,-128, -31,-123, + -93, -31,-122, -81, -31,-124,-128, -31,-123, -93, -31,-122, -82, -31,-124,-128, -31,-123, -93, -31, +-122, -83, -31,-124,-128, -31,-123, -93, -31,-122, -84, -31,-124,-128, -31,-123, -93, -31,-122, -85, + -31,-124,-128, -31,-123, -93, -31,-122, -86, -31,-124,-128, -31,-123, -93, -31,-122, -87, -31,-124, +-128, -31,-123, -93, -31,-122, -88, -31,-124,-128, -31,-123, -94, -31,-121,-126, -31,-124,-128, -31, +-123, -94, -31,-121,-127, -31,-124,-128, -31,-123, -94, -31,-121,-128, -31,-124,-128, -31,-123, -94, + -31,-122, -65, -31,-124,-128, -31,-123, -94, -31,-122, -66, -31,-124,-128, -31,-123, -94, -31,-122, + -67, -31,-124,-128, -31,-123, -94, -31,-122, -68, -31,-124,-128, -31,-123, -94, -31,-122, -69, -31, +-124,-128, -31,-123, -94, -31,-122, -70, -31,-124,-128, -31,-123, -94, -31,-122, -71, -31,-124,-128, + -31,-123, -94, -31,-122, -72, -31,-124,-128, -31,-123, -94, -31,-122, -73, -31,-124,-128, -31,-123, + -94, -31,-122, -74, -31,-124,-128, -31,-123, -94, -31,-122, -75, -31,-124,-128, -31,-123, -94, -31, +-122, -76, -31,-124,-128, -31,-123, -94, -31,-122, -77, -31,-124,-128, -31,-123, -94, -31,-122, -78, + -31,-124,-128, -31,-123, -94, -31,-122, -79, -31,-124,-128, -31,-123, -94, -31,-122, -80, -31,-124, +-128, -31,-123, -94, -31,-122, -81, -31,-124,-128, -31,-123, -94, -31,-122, -82, -31,-124,-128, -31, +-123, -94, -31,-122, -83, -31,-124,-128, -31,-123, -94, -31,-122, -84, -31,-124,-128, -31,-123, -94, + -31,-122, -85, -31,-124,-128, -31,-123, -94, -31,-122, -86, -31,-124,-128, -31,-123, -94, -31,-122, + -87, -31,-124,-128, -31,-123, -94, -31,-122, -88, -31,-124,-128, -31,-123, -95, -31,-121,-126, -31, +-124,-128, -31,-123, -95, -31,-121,-127, -31,-124,-128, -31,-123, -95, -31,-121,-128, -31,-124,-128, + -31,-123, -95, -31,-122, -65, -31,-124,-128, -31,-123, -95, -31,-122, -66, -31,-124,-128, -31,-123, + -95, -31,-122, -67, -31,-124,-128, -31,-123, -95, -31,-122, -68, -31,-124,-128, -31,-123, -95, -31, +-122, -69, -31,-124,-128, -31,-123, -95, -31,-122, -70, -31,-124,-128, -31,-123, -95, -31,-122, -71, + -31,-124,-128, -31,-123, -95, -31,-122, -72, -31,-124,-128, -31,-123, -95, -31,-122, -73, -31,-124, +-128, -31,-123, -95, -31,-122, -74, -31,-124,-128, -31,-123, -95, -31,-122, -75, -31,-124,-128, -31, +-123, -95, -31,-122, -76, -31,-124,-128, -31,-123, -95, -31,-122, -77, -31,-124,-128, -31,-123, -95, + -31,-122, -78, -31,-124,-128, -31,-123, -95, -31,-122, -79, -31,-124,-128, -31,-123, -95, -31,-122, + -80, -31,-124,-128, -31,-123, -95, -31,-122, -81, -31,-124,-128, -31,-123, -95, -31,-122, -82, -31, +-124,-128, -31,-123, -95, -31,-122, -83, -31,-124,-128, -31,-123, -95, -31,-122, -84, -31,-124,-128, + -31,-123, -95, -31,-122, -85, -31,-124,-128, -31,-123, -95, -31,-122, -86, -31,-124,-128, -31,-123, + -95, -31,-122, -87, -31,-124,-128, -31,-123, -95, -31,-122, -88, -49,-119, -51,-126, -51,-123, -49, +-119, -52,-127, -51,-123, -49,-119, -52,-128, -51,-123, -49,-123, -52,-120, -51,-126, -49,-123, -52, +-120, -52,-128, -50, -71, -52,-120, -51,-126, -50, -71, -52,-120, -52,-128, -50, -73, -51,-126, -51, +-123, -50, -73, -52,-127, -51,-123, -50, -73, -52,-128, -51,-123, -50, -79, -51,-126, -51,-123, -50, + -79, -52,-127, -51,-123, -50, -79, -52,-128, -51,-123, -50, -87, -52,-108, -51,-123, -50, -87, -52, +-109, -51,-123, -49,-119, -52,-108, -51,-123, -49,-119, -52,-109, -51,-123, -50,-105, -52,-108, -51, +-123, -50,-105, -52,-109, -51,-123, -50, -73, -52,-108, -51,-123, -50, -73, -52,-109, -51,-123, -50, +-111, -52,-108, -51,-123, -50,-111, -52,-109, -51,-123, -50, -79, -52,-108, -51,-123, -50, -79, -52, +-109, -51,-123, -50, -91, -52,-108, -51,-126, -50, -91, -52,-108, -52,-127, -50, -91, -52,-108, -52, +-128, -49,-123, -52,-108, -51,-126, -49,-123, -52,-109, -51,-126, -49,-123, -52,-108, -52,-127, -49, +-123, -52,-109, -52,-127, -49,-123, -52,-108, -52,-128, -49,-123, -52,-109, -52,-128, -50, -97, -52, +-108, -52,-127, -50, -97, -52,-109, -52,-127, -50, -97, -52,-108, -52,-128, -50, -97, -52,-109, -52, +-128, -50, -65, -52,-108, -52,-127, -50, -65, -52,-109, -52,-127, -50, -65, -52,-108, -52,-128, -50, + -65, -52,-109, -52,-128, -50,-103, -52,-108, -51,-126, -50,-103, -52,-109, -51,-126, -50,-103, -52, +-108, -52,-127, -50,-103, -52,-109, -52,-127, -50,-103, -52,-108, -52,-128, -50,-103, -52,-109, -52, +-128, -50, -71, -52,-108, -51,-126, -50, -71, -52,-109, -51,-126, -50, -71, -52,-108, -52,-127, -50, + -71, -52,-109, -52,-127, -50, -71, -52,-108, -52,-128, -50, -71, -52,-109, -52,-128, -50,-107, -52, +-108, -52,-127, -50,-107, -52,-109, -52,-127, -50,-107, -52,-108, -52,-128, -50,-107, -52,-109, -52, +-128, -50, -75, -52,-108, -52,-127, -50, -75, -52,-109, -52,-127, -50, -75, -52,-108, -52,-128, -50, + -75, -52,-109, -52,-128, 117, -52,-101, -52, -93, 85, -52,-101, -52, -93, 117, -52,-101, -52,-125, + 85, -52,-101, -52,-125, 117, -52,-101, -52,-119, 85, -52,-101, -52,-119, 117, -52,-101, -52,-128, + 85, -52,-101, -52,-128, 117, -52,-101, -52,-127, 85, -52,-101, -52,-127, 111, -52,-101, -52, -93, + 79, -52,-101, -52, -93, 111, -52,-101, -52,-125, 79, -52,-101, -52,-125, 111, -52,-101, -52,-119, + 79, -52,-101, -52,-119, 111, -52,-101, -52,-128, 79, -52,-101, -52,-128, 111, -52,-101, -52,-127, + 79, -52,-101, -52,-127, 111, -52, -93, -52,-126, 79, -52, -93, -52,-126, 111, -52,-126, -52,-125, + 79, -52,-126, -52,-125, 111, -52,-126, -52,-119, 79, -52,-126, -52,-119, 111, -52,-126, -52,-128, + 79, -52,-126, -52,-128, 111, -52,-126, -52,-127, 79, -52,-126, -52,-127, 101, -52, -93, -52,-126, + 69, -52, -93, -52,-126, 101, -52,-126, -52,-125, 69, -52,-126, -52,-125, 101, -52,-126, -52,-119, + 69, -52,-126, -52,-119, 101, -52,-126, -52,-128, 69, -52,-126, -52,-128, 101, -52,-126, -52,-127, + 69, -52,-126, -52,-127, 97, -52, -93, -52,-122, 65, -52, -93, -52,-122, 97, -52,-122, -52,-125, + 65, -52,-122, -52,-125, 97, -52,-122, -52,-119, 65, -52,-122, -52,-119, 97, -52,-122, -52,-128, + 65, -52,-122, -52,-128, 97, -52,-122, -52,-127, 65, -52,-122, -52,-127, 97, -52, -93, -52,-126, + 65, -52, -93, -52,-126, 97, -52,-126, -52,-125, 65, -52,-126, -52,-125, 97, -52,-126, -52,-119, + 65, -52,-126, -52,-119, 97, -52,-126, -52,-128, 65, -52,-126, -52,-128, 97, -52,-126, -52,-127, + 65, -52,-126, -52,-127, 117, -52,-124, -52,-120, 85, -52,-124, -52,-120, 117, -52,-125, -52,-127, + 85, -52,-125, -52,-127, 115, -52, -93, -52,-121, 83, -52, -93, -52,-121, 115, -52,-116, -52,-121, + 83, -52,-116, -52,-121, 115, -52,-127, -52,-121, 83, -52,-127, -52,-121, 114, -52, -93, -52,-124, + 82, -52, -93, -52,-124, 111, -52,-124, -52,-127, 79, -52,-124, -52,-127, 111, -52,-124, -52,-128, + 79, -52,-124, -52,-128, 111, -52,-125, -52,-120, 79, -52,-125, -52,-120, 111, -52,-125, -52,-127, + 79, -52,-125, -52,-127, 108, -52, -93, -52,-124, 76, -52, -93, -52,-124, 105, -52,-120, -52,-127, + 73, -52,-120, -52,-127, 101, -52, -89, -52,-122, 69, -52, -89, -52,-122, 101, -52,-124, -52,-127, + 69, -52,-124, -52,-127, 101, -52,-124, -52,-128, 69, -52,-124, -52,-128, 99, -52, -89, -52,-127, + 67, -52, -89, -52,-127, -32, -73,-103, -32, -73,-113, -32, -73,-118, -32, -77,-122, -32, -77,-126, + -32, -77,-107, -49,-123, -52,-120, -52,-127, -50, -71, -52,-120, -52,-127, 111, -52,-121, -52,-124, + 79, -52,-121, -52,-124, 111, -52,-125, -52,-124, 79, -52,-125, -52,-124, 111, -52,-120, -52,-124, + 79, -52,-120, -52,-124, 97, -52,-118, -52,-127, 65, -52,-118, -52,-127, 111, -52, -88, -52,-124, + 79, -52, -88, -52,-124, 97, -52,-121, -52,-124, 65, -52,-121, -52,-124, 97, -52,-120, -52,-124, + 65, -52,-120, -52,-124, 117, -52,-120, -52,-128, 85, -52,-120, -52,-128, 117, -52,-120, -52,-116, + 85, -52,-120, -52,-116, 117, -52,-120, -52,-127, 85, -52,-120, -52,-127, 117, -52,-120, -52,-124, + 85, -52,-120, -52,-124, -40, -79, -37,-116, -40, -89, -39,-124, -40, -79, -40, -77, -39,-120, -39, +-124, -40, -75, -39,-124, -40, -71, -39,-123, -39,-123, -40, -83, -39,-123, -40, -81, -40, -89, -39, +-125, -40, -88, -40, -79, 112, 46, 109, 46, 67, -30,-120,-107, 107, 103, 97, 46, 109, 46, 109, + -30,-120,-107, 115, 50, 107, 99, 97, 108, -26, -96, -86, -27, -68,-113, -28, -68,-102, -25, -92, + -66, -29,-125, -85, -29,-125,-110, -29,-126,-102, -29,-125, -68, -29,-125, -86, -29,-125,-125, -29, +-125,-120, -29,-125, -85, -29,-125, -92, -29,-125, -68, -29,-125,-120, -29,-126,-103, -29,-125, -97, + -29,-126, -81, -29,-125, -83, -29,-125, -77, -29,-125, -98, -29,-126, -92, -29,-126, -81, -29,-125, + -83, -29,-125,-101, -29,-126,-103, -29,-125, -85, -29,-125,-120, -29,-125,-104, -29,-126,-103, -29, +-125, -68, -29,-126, -65, -29,-125,-104, -29,-126,-102, -29,-125, -77, -29,-126, -71, -29,-125,-104, + -29,-126,-102, -29,-125,-117, -29,-125,-110, -29,-125,-107, -29,-126, -93, -29,-125, -68, -29,-125, +-120, -29,-125,-110, -29,-126,-102, -29,-126, -81, -29,-125, -85, -29,-125,-113, -29,-126,-102, -29, +-125, -68, -29,-125,-124, -29,-126, -65, -29,-126,-103, -29,-125, -68, -29,-126, -71, -29,-126, -75, + -29,-126, -92, -29,-126, -81, -29,-125, -85, -29,-126, -77, -29,-125, -68, -29,-125,-101, -29,-126, +-102, -29,-126, -81, -29,-125, -83, -29,-125, -68, -29,-125,-115, -29,-126, -83, -29,-125, -91, -29, +-125, -86, -29,-125, -68, -29,-126, -83, -29,-126,-103, -29,-125,-117, -29,-125, -68, -29,-126, -83, + -29,-126,-103, -29,-126, -85, -29,-126,-103, -29,-126, -85, -29,-126,-103, -29,-125, -77, -29,-125, + -98, -29,-126, -85, -29,-126,-103, -29,-125, -83, -29,-125, -77, -29,-126, -85, -29,-125, -83, -29, +-125, -86, -29,-125, -68, -29,-126, -85, -29,-125, -87, -29,-125,-125, -29,-125,-120, -29,-126, -88, + -29,-125, -68, -29,-126, -85, -29,-125, -68, -29,-126, -94, -29,-125, -85, -29,-125,-107, -29,-126, + -95, -31,-124,-116, -31,-123, -82, -31,-124,-117, -31,-123, -76, 40, -31,-124,-116, -31,-123, -82, + 41, 40, -31,-124,-110, -31,-123, -95, 41, 40, -31,-124,-111, -31,-123, -95, 41, 40, -31,-124, +-112, -31,-123, -95, 41, 40, -31,-124,-113, -31,-123, -95, 41, 40, -31,-124,-114, -31,-123, -95, + 41, 40, -31,-124,-116, -31,-123, -95, 41, 40, -31,-124,-117, -31,-123, -95, 41, 40, -31,-124, +-119, -31,-123, -95, 41, 40, -31,-124,-121, -31,-123, -95, 41, 40, -31,-124,-122, -31,-123, -95, + 41, 40, -31,-124,-123, -31,-123, -95, 41, 40, -31,-124,-125, -31,-123, -95, 41, 40, -31,-124, +-126, -31,-123, -95, 41, 40, -31,-124,-128, -31,-123, -95, 41, -30,-120, -85, -30,-120, -85, -30, +-120, -85, -30,-120, -85, 40, 50, 48, 41, 40, 49, 57, 41, 40, 49, 56, 41, 40, 49, 55, + 41, 40, 49, 54, 41, 40, 49, 53, 41, 40, 49, 52, 41, 40, 49, 51, 41, 40, 49, 50, + 41, 40, 49, 49, 41, 40, 49, 48, 41, 118, 105, 105, 105, 86, 73, 73, 73, 49, -30,-127, +-124, 49, 48, -30,-128, -78, -30,-128, -78, -30,-128, -78, -30,-128, -78, -50, -87, -52,-108, -51, +-126, -51,-123, -50, -87, -52,-109, -51,-126, -51,-123, -50, -87, -52,-108, -52,-127, -51,-123, -50, + -87, -52,-109, -52,-127, -51,-123, -50, -87, -52,-108, -52,-128, -51,-123, -50, -87, -52,-109, -52, +-128, -51,-123, -49,-119, -52,-108, -51,-126, -51,-123, -49,-119, -52,-109, -51,-126, -51,-123, -49, +-119, -52,-108, -52,-127, -51,-123, -49,-119, -52,-109, -52,-127, -51,-123, -49,-119, -52,-108, -52, +-128, -51,-123, -49,-119, -52,-109, -52,-128, -51,-123, -50,-105, -52,-108, -51,-126, -51,-123, -50, +-105, -52,-109, -51,-126, -51,-123, -50,-105, -52,-108, -52,-127, -51,-123, -50,-105, -52,-109, -52, +-127, -51,-123, -50,-105, -52,-108, -52,-128, -51,-123, -50,-105, -52,-109, -52,-128, -51,-123, -50, + -73, -52,-108, -51,-126, -51,-123, -50, -73, -52,-109, -51,-126, -51,-123, -50, -73, -52,-108, -52, +-127, -51,-123, -50, -73, -52,-109, -52,-127, -51,-123, -50, -73, -52,-108, -52,-128, -51,-123, -50, + -73, -52,-109, -52,-128, -51,-123, -50,-111, -52,-108, -51,-126, -51,-123, -50,-111, -52,-109, -51, +-126, -51,-123, -50,-111, -52,-108, -52,-127, -51,-123, -50,-111, -52,-109, -52,-127, -51,-123, -50, +-111, -52,-108, -52,-128, -51,-123, -50,-111, -52,-109, -52,-128, -51,-123, -50, -79, -52,-108, -51, +-126, -51,-123, -50, -79, -52,-109, -51,-126, -51,-123, -50, -79, -52,-108, -52,-127, -51,-123, -50, + -79, -52,-109, -52,-127, -51,-123, -50, -79, -52,-108, -52,-128, -51,-123, -50, -79, -52,-109, -52, +-128, -51,-123, -29,-125, -85, -29,-125, -68, -29,-125,-107, -29,-126,-103, -29,-125, -85, -29,-125, + -95, -29,-126, -85, -29,-126,-103, -29,-125,-120, -29,-125, -77, -29,-125, -98, -29,-125, -77, -29, +-126, -73, -29,-125, -89, -29,-125, -77, -29,-125,-101, -29,-126,-102, -29,-125, -77, -29,-125,-120, + -29,-126,-103, -29,-125,-101, -29,-126,-102, -29,-126, -92, -29,-125, -77, -29,-125,-120, -29,-125, +-104, -29,-126,-102, -29,-125, -68, -29,-126, -73, -29,-126,-103, -29,-125,-104, -29,-126, -81, -29, +-126, -65, -29,-125, -68, -29,-125, -85, -29,-125,-113, -29,-126,-103, -29,-125, -68, -29,-125, -84, + -29,-125, -85, -29,-126, -73, -29,-125, -86, -29,-125, -77, -29,-126, -81, -29,-126,-103, -29,-126, + -75, -29,-125, -77, -29,-125,-127, -29,-125, -68, -29,-125, -96, -29,-126, -83, -29,-125, -83, -29, +-125, -81, -29,-125,-125, -29,-125,-120, -29,-126, -92, -29,-125,-117, -29,-125, -77, -29,-126, -81, + -29,-126,-103, -29,-126, -94, -29,-125, -77, -29,-125,-104, -29,-126,-102, -29,-126, -94, -29,-126, + -94, -29,-125,-113, -29,-126,-102, -29,-125, -68, -29,-125,-120, -31,-124,-114, -31,-123, -95, -31, +-122, -73, -31,-124,-128, -31,-123, -87, 114, 97, 100, -30,-120,-107, 115, 50, -29,-125, -84, -29, +-125, -77, -29,-125,-120, -29,-126, -79, -29,-126,-103, -29,-125, -77, -29,-125, -97, -29,-125, -86, + -29,-125,-113, -29,-126,-103, -29,-125, -68, -29,-125, -85, -29,-125,-107, -29,-126,-103, -29,-125, +-125, -29,-126, -73, -29,-126, -89, -29,-125, -85, -29,-125,-107, -29,-126, -95, -29,-125, -87, -29, +-125,-125, -29,-125,-120, -29,-126,-103, -29,-125,-110, -29,-126,-102, -29,-126, -94, -29,-126, -71, + -29,-125,-120, -29,-125, -85, -29,-125,-113, -29,-126,-102, -29,-125, -68, -29,-126, -69, -29,-125, + -77, -29,-125,-120, -29,-126, -81, -29,-125, -85, -29,-126, -69, -29,-126,-103, -29,-126, -92, -29, +-125, -83, -29,-126, -81, -29,-126,-103, -29,-125, -87, -29,-125, -96, -29,-125,-120, -29,-125, -77, + -29,-126, -83, -29,-125, -83, -29,-125, -95, -29,-125, -68, -29,-125,-120, -29,-125, -85, -29,-126, + -83, -29,-125, -83, -29,-126, -81, -29,-126,-103, -29,-125, -87, -29,-125, -96, -29,-126, -83, -29, +-126,-103, -29,-125, -85, -29,-126, -65, -29,-126,-103, -29,-125, -68, -29,-126, -88, -29,-126, -71, + -29,-126, -81, -29,-125, -68, -29,-125,-120, -29,-126,-103, 40, -31,-124,-117, -31,-123, -87, -31, +-124,-110, -31,-123, -82, 41, 40, -31,-124,-117, -31,-123, -87, -31,-124,-116, -31,-123, -91, -31, +-122, -85, 41, -40, -84, -39,-124, 32, -40, -84, -39,-124, -40, -89, -39,-124, -39,-121, -40, -75, + -39,-124, -39,-119, 32, -40, -89, -39,-124, -39,-124, -39,-121, 32, -40, -71, -39,-124, -39,-118, + -39,-121, 32, -39,-120, -40, -77, -39,-124, -39,-123}; +} +} +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/trie/char_stream.hh b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/trie/char_stream.hh new file mode 100644 index 000000000000..78a72ed2f5ba --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/trie/char_stream.hh @@ -0,0 +1,150 @@ +#ifndef UNF_TRIE_CHAR_STREAM_HH +#define UNF_TRIE_CHAR_STREAM_HH + +#include <vector> +#include <string> +#include "../util.hh" + +namespace UNF { + namespace Trie { + class CharStream { + public: + CharStream(const char* str) : cur_(str) {} + unsigned char read() { return eos() ? '\0' : *cur_++; } + unsigned char prev() const { return cur_[-1]; } + unsigned char peek() const { return *cur_; } + const char* cur() const { return cur_; } + bool eos() const { return *cur_ == '\0'; } + void setCur(const char* new_cur) { cur_ = new_cur; } + + private: + const char* cur_; + }; + + class RangeCharStream { + public: + RangeCharStream(const char* beg, const char* end) : cur_(beg), end_(end) {} + unsigned char read() { return eos() ? '\0' : *cur_++; } + unsigned char prev() const { return cur_[-1]; } + unsigned char peek() const { return *cur_; } + const char* cur() const { return cur_; } + const char* end() const { return end_; } + bool eos() const { return cur_ == end_; } + + private: + const char* cur_; + const char* end_; + }; + + class CompoundCharStream { + public: + CompoundCharStream(const char* first, const char* second) + : beg1(first), beg2(second), cur1(beg1), cur2(beg2) {} + + unsigned char read() { return !eos1() ? read1() : read2(); } + unsigned char peek() const { return !eos1() ? *cur1 : *cur2; } + unsigned char prev() const { return !eos1() || beg2==cur2 ? cur1[-1] : cur2[-1]; } + + const char* cur() const { return !eos1() ? cur1 : cur2; } + bool eos() const { return eos1() && eos2(); } + bool within_first() const { return !eos1(); } + + unsigned offset() const { return cur1-beg1 + cur2-beg2; } + void setCur(const char* p) { + if(beg1 <= p && p <= cur1) { + cur1=p; + cur2=beg2; + } else { + cur2=p; + } + } + + protected: + unsigned char read1() { return eos1() ? '\0' : *cur1++; } + unsigned char read2() { return eos2() ? '\0' : *cur2++; } + bool eos1() const { return *cur1=='\0'; } + bool eos2() const { return *cur2=='\0'; } + + protected: + const char* beg1; + const char* beg2; + const char* cur1; + const char* cur2; + }; + + class CharStreamForComposition : public CompoundCharStream { + public: + CharStreamForComposition (const char* first, const char* second, + const std::vector<unsigned char>& canonical_classes, + std::string& buf) + : CompoundCharStream(first, second), classes(canonical_classes), skipped(buf) + {} + + void init_skipinfo() { + skipped.clear(); + skipped_tail = 0; + } + + void mark_as_last_valid_point() { + skipped_tail = skipped.size(); + marked_point = cur(); + } + + void reset_at_marked_point() { + setCur(marked_point); + } + + void append_read_char_to_str(std::string& s, const char* beg) const { + if(eos1()==false) { + s.append(beg, cur()); + } else { + s.append(beg, cur1); + s.append(beg2, cur()); + } + } + + void append_skipped_chars_to_str(std::string& s) const { + s.append(skipped.begin(), skipped.begin()+skipped_tail); + } + + unsigned char get_canonical_class() const { + return offset() < classes.size() ? classes[offset()] : 0; + } + + bool next_combining_char(unsigned char prev_class, const char* ppp) { + while(Util::is_utf8_char_start_byte(peek()) == false) + read(); + + unsigned char mid_class = get_prev_canonical_class(); + unsigned char cur_class = get_canonical_class(); + + if(prev_class==0 && mid_class==0 && cur_class!=0) + return false; + + if(prev_class < cur_class && mid_class < cur_class) { + skipped.append(ppp, cur()); + return true; + } else { + if(cur_class != 0) { + read(); + return next_combining_char(prev_class,ppp); + } + return false; + } + } + + private: + unsigned char get_prev_canonical_class() const { + return offset()-1 < classes.size() ? classes[offset()-1] : 0; + } + + private: + const std::vector<unsigned char>& classes; + std::string& skipped; + unsigned skipped_tail; + const char* marked_point; + }; + } +} + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/trie/node.hh b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/trie/node.hh new file mode 100644 index 000000000000..1b173cf062eb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/trie/node.hh @@ -0,0 +1,25 @@ +#ifndef UNF_TRIE_NODE_HH +#define UNF_TRIE_NODE_HH + +namespace UNF { + namespace Trie { + class Node { + public: + unsigned jump(unsigned char ch) const { return base() + ch; } + unsigned value() const { return base(); } + unsigned check_char() const { return data>>24; } + unsigned to_uint() const { return data; } + + static const Node* from_uint_array(const unsigned* node_uints) + { return reinterpret_cast<const Node*>(node_uints); } + + private: + unsigned base() const { return data & 0xFFFFFF; } + + private: + unsigned data; + }; + } +} + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/trie/searcher.hh b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/trie/searcher.hh new file mode 100644 index 000000000000..dcc1b23da4ce --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/trie/searcher.hh @@ -0,0 +1,194 @@ +#ifndef UNF_TRIE_SEARCHER_HH +#define UNF_TRIE_SEARCHER_HH + +#include "char_stream.hh" +#include "node.hh" +#include "../util.hh" + +namespace UNF { + namespace Trie { + class Searcher { + public: + Searcher(const Node* nodes, unsigned root, const char* value=NULL) + : nodes(nodes), root(root), value(value) {} + + unsigned find_value(const char* key, int default_value) const { + unsigned node_index=root; + for(CharStream in(key);; in.read()) { + node_index = nodes[node_index].jump(in.peek()); + if(nodes[node_index].check_char()==in.peek()) { + unsigned terminal_index = nodes[node_index].jump('\0'); + if(nodes[terminal_index].check_char()=='\0') { + return nodes[terminal_index].value(); + } + } else + return default_value; + } + } + + protected: + const Node* nodes; + const unsigned root; + const char* value; + }; + + class CanonicalCombiningClass : private Searcher { + public: + CanonicalCombiningClass(const unsigned* node_uints, unsigned root) + : Searcher(Node::from_uint_array(node_uints), root) {} + + unsigned get_class(const char* str) const { return find_value(str,0); } + + void sort(char* str, std::vector<unsigned char>& classes) const { + CharStream in(str); + unsigned sort_beg=0; + unsigned sort_end=0; + unsigned unicode_char_count=0; + + loop_head: + unsigned beg = in.cur()-str; + + for(unsigned node_index=root;;){ + node_index = nodes[node_index].jump(in.read()); + + if(nodes[node_index].check_char()==in.prev()) { + unsigned terminal_index = nodes[node_index].jump('\0'); + if(nodes[terminal_index].check_char()=='\0') { + if((unicode_char_count++)==0) + sort_beg = beg; + sort_end = in.cur()-str; + + unsigned char klass = nodes[terminal_index].value(); + for(unsigned i=beg; i < sort_end; i++) + classes[i] = klass; + break; + } + } else { + if(unicode_char_count > 1) + bubble_sort(str, classes, sort_beg, sort_end); + unicode_char_count = 0; + break; + } + } + Util::eat_until_utf8_char_start_point(in); + + if(in.eos()==false) + goto loop_head; + + if(unicode_char_count > 1) + bubble_sort(str, classes, sort_beg, sort_end); + } + + private: + void bubble_sort(char* str, std::vector<unsigned char>& canonical_classes, unsigned beg, unsigned end) const { + for(unsigned limit=beg, next=end; limit != next;) { + limit = next; + for(unsigned i=beg+1; i < limit; i++) + if(canonical_classes[i-1] > canonical_classes[i]) { + std::swap(canonical_classes[i-1], canonical_classes[i]); + std::swap(str[i-1], str[i]); + next = i; + } + } + } + }; + + class NormalizationForm : private Searcher { + public: + NormalizationForm(const unsigned* node_uints, unsigned root, const char* value=NULL) + : Searcher(Node::from_uint_array(node_uints), root, value) {} + + bool quick_check(const char* key) const { return find_value(key,0xFFFFFFFF)==0xFFFFFFFF; } + + void decompose(RangeCharStream in, std::string& buffer) const { + loop_head: + const char* beg = in.cur(); + + for(unsigned node_index=root;;) { + node_index = nodes[node_index].jump(in.read()); + if(nodes[node_index].check_char()==in.prev()) { + unsigned terminal_index = nodes[node_index].jump('\0'); + if(nodes[terminal_index].check_char()=='\0') { + word_append(buffer, value, nodes[terminal_index].value()); + beg = in.cur(); + break; + } + } else { + Util::eat_until_utf8_char_start_point(in); + buffer.append(beg, in.cur()); + break; + } + } + + if(in.eos()==false) + goto loop_head; + } + + void compose(CharStreamForComposition& in, std::string& buf) const { + in.init_skipinfo(); + + const char* const beg = in.cur(); + const char* current_char_head = in.cur(); + unsigned composed_char_info = 0; + + unsigned node_index = root; + unsigned retry_root_node = root; + unsigned char retry_root_class = 0; + + for(bool first=true;;) { + if(Util::is_utf8_char_start_byte(in.peek())) { + if(node_index != root) + first=false; + current_char_head = in.cur(); + + retry_root_node = node_index; + retry_root_class = in.get_canonical_class(); + } + + retry: + unsigned next_index = nodes[node_index].jump(in.peek()); + if(nodes[next_index].check_char()==in.read()) { + // succeeded + node_index = next_index; + unsigned terminal_index = nodes[node_index].jump('\0'); + if(nodes[terminal_index].check_char()=='\0') { + composed_char_info = nodes[terminal_index].value(); + + in.mark_as_last_valid_point(); + if(in.eos() || retry_root_class > in.get_canonical_class()) + break; + } + } else if (first==true) { + // no retry if current point is a part of first starter + break; + } else if (in.next_combining_char(retry_root_class, current_char_head)==true) { + // back previous code-point and retry + node_index = retry_root_node; + current_char_head = in.cur(); + goto retry; + } else { + break; + } + } + + if(composed_char_info != 0) { + // append composed unicode-character and skipped combining-characters + word_append(buf, value, composed_char_info); + in.append_skipped_chars_to_str(buf); + in.reset_at_marked_point(); + } else { + // append one unicode-character + in.setCur(Util::nearest_utf8_char_start_point(beg+1)); + in.append_read_char_to_str(buf, beg); + } + } + + private: + static void word_append(std::string& buffer, const char* base, unsigned pos_info) { + buffer.append(base+(pos_info&0x3FFFF), pos_info>>18); + } + }; + } +} + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/util.hh b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/util.hh new file mode 100644 index 000000000000..56aaf77cb6d3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/ext/unf_ext/unf/util.hh @@ -0,0 +1,24 @@ +#ifndef UNF_UTIL_HH +#define UNF_UTIL_HH + +namespace UNF { + namespace Util { + inline bool is_utf8_char_start_byte(char byte) { + if(!(byte&0x80)) return true; // ascii + else if (byte&0x40) return true; // start of a UTF-8 character byte sequence + return false; + } + + inline const char* nearest_utf8_char_start_point(const char* s) { + for(; is_utf8_char_start_byte(*s)==false; s++); + return s; + } + + template <class CharStream> + inline void eat_until_utf8_char_start_point(CharStream& in) { + for(; is_utf8_char_start_byte(in.peek())==false; in.read()); + } + } +} + +#endif diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/lib/unf_ext.rb b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/lib/unf_ext.rb new file mode 100644 index 000000000000..40a2bdd66971 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/lib/unf_ext.rb @@ -0,0 +1,5 @@ +begin + require "#{RUBY_VERSION[/\A[0-9]+\.[0-9]+/]}/unf_ext.so" +rescue LoadError + require "unf_ext.so" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/lib/unf_ext/version.rb b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/lib/unf_ext/version.rb new file mode 100644 index 000000000000..85b23dd0e0a1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/lib/unf_ext/version.rb @@ -0,0 +1,5 @@ +module UNF + class Normalizer + VERSION = "0.0.7.7" + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/test/helper.rb b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/test/helper.rb new file mode 100644 index 000000000000..2f7bd8ab027e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/test/helper.rb @@ -0,0 +1,18 @@ +require 'rubygems' +require 'bundler' +begin + Bundler.setup(:default, :development) +rescue Bundler::BundlerError => e + $stderr.puts e.message + $stderr.puts "Run `bundle install` to install missing gems" + exit e.status_code +end +require 'test/unit' + +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..')) +$LOAD_PATH.unshift(File.dirname(__FILE__)) +require 'unf_ext' + +class Test::Unit::TestCase +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/test/normalization-test.txt b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/test/normalization-test.txt new file mode 100644 index 000000000000..4f91bfab883e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/test/normalization-test.txt @@ -0,0 +1,112332 @@ +Ḋ +Ḋ +Ḋ +Ḋ +Ḋ + +Ḍ +Ḍ +Ḍ +Ḍ +Ḍ + +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ + +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ + +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ + +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ +Ḍ̇ + +Ḋ̛ +Ḋ̛ +Ḋ̛ +Ḋ̛ +Ḋ̛ + +Ḍ̛ +Ḍ̛ +Ḍ̛ +Ḍ̛ +Ḍ̛ + +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ + +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ + +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ + +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ +Ḍ̛̇ + +È +È +È +È +È + +Ē +Ē +Ē +Ē +Ē + +È +È +È +È +È + +Ē +Ē +Ē +Ē +Ē + +Ḕ +Ḕ +Ḕ +Ḕ +Ḕ + +Ḕ +Ḕ +Ḕ +Ḕ +Ḕ + +Ḕ̄ +Ḕ̄ +Ḕ̄ +Ḕ̄ +Ḕ̄ + +Ḕ +Ḕ +Ḕ +Ḕ +Ḕ + +È̄ +È̄ +È̄ +È̄ +È̄ + +ֱָֹ֑׃ְ֬֟ +ֱָֹ֑׃ְ֬֟ +ֱָֹ֑׃ְ֬֟ +ֱָֹ֑׃ְ֬֟ +ֱָֹ֑׃ְ֬֟ + +ְַּ֥֒׀֭ׄ +ְַּ֥֒׀֭ׄ +ְַּ֥֒׀֭ׄ +ְַּ֥֒׀֭ׄ +ְַּ֥֒׀֭ׄ + +ᄀ각 +ᄀ각 +ᄀ각 +ᄀ각 +ᄀ각 + +ᄀ각ᆨ +ᄀ각ᆨ +ᄀ각ᆨ +ᄀ각ᆨ +ᄀ각ᆨ + +  +  +  + + + +¨ +¨ +¨ + ̈ + ̈ + +ª +ª +ª +a +a + +¯ +¯ +¯ + ̄ + ̄ + +² +² +² +2 +2 + +³ +³ +³ +3 +3 + +´ +´ +´ + ́ + ́ + +µ +µ +µ +μ +μ + +¸ +¸ +¸ + ̧ + ̧ + +¹ +¹ +¹ +1 +1 + +º +º +º +o +o + +¼ +¼ +¼ +1⁄4 +1⁄4 + +½ +½ +½ +1⁄2 +1⁄2 + +¾ +¾ +¾ +3⁄4 +3⁄4 + +À +À +À +À +À + +Á +Á +Á +Á +Á + + + + + + + +à +à +à +à +à + +Ä +Ä +Ä +Ä +Ä + +Å +Å +Å +Å +Å + +Ç +Ç +Ç +Ç +Ç + +È +È +È +È +È + +É +É +É +É +É + +Ê +Ê +Ê +Ê +Ê + +Ë +Ë +Ë +Ë +Ë + +Ì +Ì +Ì +Ì +Ì + +Í +Í +Í +Í +Í + +Î +Î +Î +Î +Î + +Ï +Ï +Ï +Ï +Ï + +Ñ +Ñ +Ñ +Ñ +Ñ + +Ò +Ò +Ò +Ò +Ò + +Ó +Ó +Ó +Ó +Ó + +Ô +Ô +Ô +Ô +Ô + +Õ +Õ +Õ +Õ +Õ + +Ö +Ö +Ö +Ö +Ö + +Ù +Ù +Ù +Ù +Ù + +Ú +Ú +Ú +Ú +Ú + +Û +Û +Û +Û +Û + +Ü +Ü +Ü +Ü +Ü + +Ý +Ý +Ý +Ý +Ý + +à +à +à +à +à + +á +á +á +á +á + +â +â +â +â +â + +ã +ã +ã +ã +ã + +ä +ä +ä +ä +ä + +å +å +å +å +å + +ç +ç +ç +ç +ç + +è +è +è +è +è + +é +é +é +é +é + +ê +ê +ê +ê +ê + +ë +ë +ë +ë +ë + +ì +ì +ì +ì +ì + +í +í +í +í +í + +î +î +î +î +î + +ï +ï +ï +ï +ï + +ñ +ñ +ñ +ñ +ñ + +ò +ò +ò +ò +ò + +ó +ó +ó +ó +ó + +ô +ô +ô +ô +ô + +õ +õ +õ +õ +õ + +ö +ö +ö +ö +ö + +ù +ù +ù +ù +ù + +ú +ú +ú +ú +ú + +û +û +û +û +û + +ü +ü +ü +ü +ü + +ý +ý +ý +ý +ý + +ÿ +ÿ +ÿ +ÿ +ÿ + +Ā +Ā +Ā +Ā +Ā + +ā +ā +ā +ā +ā + +Ă +Ă +Ă +Ă +Ă + +ă +ă +ă +ă +ă + +Ą +Ą +Ą +Ą +Ą + +ą +ą +ą +ą +ą + +Ć +Ć +Ć +Ć +Ć + +ć +ć +ć +ć +ć + +Ĉ +Ĉ +Ĉ +Ĉ +Ĉ + +ĉ +ĉ +ĉ +ĉ +ĉ + +Ċ +Ċ +Ċ +Ċ +Ċ + +ċ +ċ +ċ +ċ +ċ + +Č +Č +Č +Č +Č + +č +č +č +č +č + +Ď +Ď +Ď +Ď +Ď + +ď +ď +ď +ď +ď + +Ē +Ē +Ē +Ē +Ē + +ē +ē +ē +ē +ē + +Ĕ +Ĕ +Ĕ +Ĕ +Ĕ + +ĕ +ĕ +ĕ +ĕ +ĕ + +Ė +Ė +Ė +Ė +Ė + +ė +ė +ė +ė +ė + +Ę +Ę +Ę +Ę +Ę + +ę +ę +ę +ę +ę + +Ě +Ě +Ě +Ě +Ě + +ě +ě +ě +ě +ě + +Ĝ +Ĝ +Ĝ +Ĝ +Ĝ + +ĝ +ĝ +ĝ +ĝ +ĝ + +Ğ +Ğ +Ğ +Ğ +Ğ + +ğ +ğ +ğ +ğ +ğ + +Ġ +Ġ +Ġ +Ġ +Ġ + +ġ +ġ +ġ +ġ +ġ + +Ģ +Ģ +Ģ +Ģ +Ģ + +ģ +ģ +ģ +ģ +ģ + +Ĥ +Ĥ +Ĥ +Ĥ +Ĥ + +ĥ +ĥ +ĥ +ĥ +ĥ + +Ĩ +Ĩ +Ĩ +Ĩ +Ĩ + +ĩ +ĩ +ĩ +ĩ +ĩ + +Ī +Ī +Ī +Ī +Ī + +ī +ī +ī +ī +ī + +Ĭ +Ĭ +Ĭ +Ĭ +Ĭ + +ĭ +ĭ +ĭ +ĭ +ĭ + +Į +Į +Į +Į +Į + +į +į +į +į +į + +İ +İ +İ +İ +İ + +IJ +IJ +IJ +IJ +IJ + +ij +ij +ij +ij +ij + +Ĵ +Ĵ +Ĵ +Ĵ +Ĵ + +ĵ +ĵ +ĵ +ĵ +ĵ + +Ķ +Ķ +Ķ +Ķ +Ķ + +ķ +ķ +ķ +ķ +ķ + +Ĺ +Ĺ +Ĺ +Ĺ +Ĺ + +ĺ +ĺ +ĺ +ĺ +ĺ + +Ļ +Ļ +Ļ +Ļ +Ļ + +ļ +ļ +ļ +ļ +ļ + +Ľ +Ľ +Ľ +Ľ +Ľ + +ľ +ľ +ľ +ľ +ľ + +Ŀ +Ŀ +Ŀ +L· +L· + +ŀ +ŀ +ŀ +l· +l· + +Ń +Ń +Ń +Ń +Ń + +ń +ń +ń +ń +ń + +Ņ +Ņ +Ņ +Ņ +Ņ + +ņ +ņ +ņ +ņ +ņ + +Ň +Ň +Ň +Ň +Ň + +ň +ň +ň +ň +ň + +ʼn +ʼn +ʼn +ʼn +ʼn + +Ō +Ō +Ō +Ō +Ō + +ō +ō +ō +ō +ō + +Ŏ +Ŏ +Ŏ +Ŏ +Ŏ + +ŏ +ŏ +ŏ +ŏ +ŏ + +Ő +Ő +Ő +Ő +Ő + +ő +ő +ő +ő +ő + +Ŕ +Ŕ +Ŕ +Ŕ +Ŕ + +ŕ +ŕ +ŕ +ŕ +ŕ + +Ŗ +Ŗ +Ŗ +Ŗ +Ŗ + +ŗ +ŗ +ŗ +ŗ +ŗ + +Ř +Ř +Ř +Ř +Ř + +ř +ř +ř +ř +ř + +Ś +Ś +Ś +Ś +Ś + +ś +ś +ś +ś +ś + +Ŝ +Ŝ +Ŝ +Ŝ +Ŝ + +ŝ +ŝ +ŝ +ŝ +ŝ + +Ş +Ş +Ş +Ş +Ş + +ş +ş +ş +ş +ş + +Š +Š +Š +Š +Š + +š +š +š +š +š + +Ţ +Ţ +Ţ +Ţ +Ţ + +ţ +ţ +ţ +ţ +ţ + +Ť +Ť +Ť +Ť +Ť + +ť +ť +ť +ť +ť + +Ũ +Ũ +Ũ +Ũ +Ũ + +ũ +ũ +ũ +ũ +ũ + +Ū +Ū +Ū +Ū +Ū + +ū +ū +ū +ū +ū + +Ŭ +Ŭ +Ŭ +Ŭ +Ŭ + +ŭ +ŭ +ŭ +ŭ +ŭ + +Ů +Ů +Ů +Ů +Ů + +ů +ů +ů +ů +ů + +Ű +Ű +Ű +Ű +Ű + +ű +ű +ű +ű +ű + +Ų +Ų +Ų +Ų +Ų + +ų +ų +ų +ų +ų + +Ŵ +Ŵ +Ŵ +Ŵ +Ŵ + +ŵ +ŵ +ŵ +ŵ +ŵ + +Ŷ +Ŷ +Ŷ +Ŷ +Ŷ + +ŷ +ŷ +ŷ +ŷ +ŷ + +Ÿ +Ÿ +Ÿ +Ÿ +Ÿ + +Ź +Ź +Ź +Ź +Ź + +ź +ź +ź +ź +ź + +Ż +Ż +Ż +Ż +Ż + +ż +ż +ż +ż +ż + +Ž +Ž +Ž +Ž +Ž + +ž +ž +ž +ž +ž + +ſ +ſ +ſ +s +s + +Ơ +Ơ +Ơ +Ơ +Ơ + +ơ +ơ +ơ +ơ +ơ + +Ư +Ư +Ư +Ư +Ư + +ư +ư +ư +ư +ư + +DŽ +DŽ +DŽ +DŽ +DŽ + +Dž +Dž +Dž +Dž +Dž + +dž +dž +dž +dž +dž + +LJ +LJ +LJ +LJ +LJ + +Lj +Lj +Lj +Lj +Lj + +lj +lj +lj +lj +lj + +NJ +NJ +NJ +NJ +NJ + +Nj +Nj +Nj +Nj +Nj + +nj +nj +nj +nj +nj + +Ǎ +Ǎ +Ǎ +Ǎ +Ǎ + +ǎ +ǎ +ǎ +ǎ +ǎ + +Ǐ +Ǐ +Ǐ +Ǐ +Ǐ + +ǐ +ǐ +ǐ +ǐ +ǐ + +Ǒ +Ǒ +Ǒ +Ǒ +Ǒ + +ǒ +ǒ +ǒ +ǒ +ǒ + +Ǔ +Ǔ +Ǔ +Ǔ +Ǔ + +ǔ +ǔ +ǔ +ǔ +ǔ + +Ǖ +Ǖ +Ǖ +Ǖ +Ǖ + +ǖ +ǖ +ǖ +ǖ +ǖ + +Ǘ +Ǘ +Ǘ +Ǘ +Ǘ + +ǘ +ǘ +ǘ +ǘ +ǘ + +Ǚ +Ǚ +Ǚ +Ǚ +Ǚ + +ǚ +ǚ +ǚ +ǚ +ǚ + +Ǜ +Ǜ +Ǜ +Ǜ +Ǜ + +ǜ +ǜ +ǜ +ǜ +ǜ + +Ǟ +Ǟ +Ǟ +Ǟ +Ǟ + +ǟ +ǟ +ǟ +ǟ +ǟ + +Ǡ +Ǡ +Ǡ +Ǡ +Ǡ + +ǡ +ǡ +ǡ +ǡ +ǡ + +Ǣ +Ǣ +Ǣ +Ǣ +Ǣ + +ǣ +ǣ +ǣ +ǣ +ǣ + +Ǧ +Ǧ +Ǧ +Ǧ +Ǧ + +ǧ +ǧ +ǧ +ǧ +ǧ + +Ǩ +Ǩ +Ǩ +Ǩ +Ǩ + +ǩ +ǩ +ǩ +ǩ +ǩ + +Ǫ +Ǫ +Ǫ +Ǫ +Ǫ + +ǫ +ǫ +ǫ +ǫ +ǫ + +Ǭ +Ǭ +Ǭ +Ǭ +Ǭ + +ǭ +ǭ +ǭ +ǭ +ǭ + +Ǯ +Ǯ +Ǯ +Ǯ +Ǯ + +ǯ +ǯ +ǯ +ǯ +ǯ + +ǰ +ǰ +ǰ +ǰ +ǰ + +DZ +DZ +DZ +DZ +DZ + +Dz +Dz +Dz +Dz +Dz + +dz +dz +dz +dz +dz + +Ǵ +Ǵ +Ǵ +Ǵ +Ǵ + +ǵ +ǵ +ǵ +ǵ +ǵ + +Ǹ +Ǹ +Ǹ +Ǹ +Ǹ + +ǹ +ǹ +ǹ +ǹ +ǹ + +Ǻ +Ǻ +Ǻ +Ǻ +Ǻ + +ǻ +ǻ +ǻ +ǻ +ǻ + +Ǽ +Ǽ +Ǽ +Ǽ +Ǽ + +ǽ +ǽ +ǽ +ǽ +ǽ + +Ǿ +Ǿ +Ǿ +Ǿ +Ǿ + +ǿ +ǿ +ǿ +ǿ +ǿ + +Ȁ +Ȁ +Ȁ +Ȁ +Ȁ + +ȁ +ȁ +ȁ +ȁ +ȁ + +Ȃ +Ȃ +Ȃ +Ȃ +Ȃ + +ȃ +ȃ +ȃ +ȃ +ȃ + +Ȅ +Ȅ +Ȅ +Ȅ +Ȅ + +ȅ +ȅ +ȅ +ȅ +ȅ + +Ȇ +Ȇ +Ȇ +Ȇ +Ȇ + +ȇ +ȇ +ȇ +ȇ +ȇ + +Ȉ +Ȉ +Ȉ +Ȉ +Ȉ + +ȉ +ȉ +ȉ +ȉ +ȉ + +Ȋ +Ȋ +Ȋ +Ȋ +Ȋ + +ȋ +ȋ +ȋ +ȋ +ȋ + +Ȍ +Ȍ +Ȍ +Ȍ +Ȍ + +ȍ +ȍ +ȍ +ȍ +ȍ + +Ȏ +Ȏ +Ȏ +Ȏ +Ȏ + +ȏ +ȏ +ȏ +ȏ +ȏ + +Ȑ +Ȑ +Ȑ +Ȑ +Ȑ + +ȑ +ȑ +ȑ +ȑ +ȑ + +Ȓ +Ȓ +Ȓ +Ȓ +Ȓ + +ȓ +ȓ +ȓ +ȓ +ȓ + +Ȕ +Ȕ +Ȕ +Ȕ +Ȕ + +ȕ +ȕ +ȕ +ȕ +ȕ + +Ȗ +Ȗ +Ȗ +Ȗ +Ȗ + +ȗ +ȗ +ȗ +ȗ +ȗ + +Ș +Ș +Ș +Ș +Ș + +ș +ș +ș +ș +ș + +Ț +Ț +Ț +Ț +Ț + +ț +ț +ț +ț +ț + +Ȟ +Ȟ +Ȟ +Ȟ +Ȟ + +ȟ +ȟ +ȟ +ȟ +ȟ + +Ȧ +Ȧ +Ȧ +Ȧ +Ȧ + +ȧ +ȧ +ȧ +ȧ +ȧ + +Ȩ +Ȩ +Ȩ +Ȩ +Ȩ + +ȩ +ȩ +ȩ +ȩ +ȩ + +Ȫ +Ȫ +Ȫ +Ȫ +Ȫ + +ȫ +ȫ +ȫ +ȫ +ȫ + +Ȭ +Ȭ +Ȭ +Ȭ +Ȭ + +ȭ +ȭ +ȭ +ȭ +ȭ + +Ȯ +Ȯ +Ȯ +Ȯ +Ȯ + +ȯ +ȯ +ȯ +ȯ +ȯ + +Ȱ +Ȱ +Ȱ +Ȱ +Ȱ + +ȱ +ȱ +ȱ +ȱ +ȱ + +Ȳ +Ȳ +Ȳ +Ȳ +Ȳ + +ȳ +ȳ +ȳ +ȳ +ȳ + +ʰ +ʰ +ʰ +h +h + +ʱ +ʱ +ʱ +ɦ +ɦ + +ʲ +ʲ +ʲ +j +j + +ʳ +ʳ +ʳ +r +r + +ʴ +ʴ +ʴ +ɹ +ɹ + +ʵ +ʵ +ʵ +ɻ +ɻ + +ʶ +ʶ +ʶ +ʁ +ʁ + +ʷ +ʷ +ʷ +w +w + +ʸ +ʸ +ʸ +y +y + +˘ +˘ +˘ + ̆ + ̆ + +˙ +˙ +˙ + ̇ + ̇ + +˚ +˚ +˚ + ̊ + ̊ + +˛ +˛ +˛ + ̨ + ̨ + +˜ +˜ +˜ + ̃ + ̃ + +˝ +˝ +˝ + ̋ + ̋ + +ˠ +ˠ +ˠ +ɣ +ɣ + +ˡ +ˡ +ˡ +l +l + +ˢ +ˢ +ˢ +s +s + +ˣ +ˣ +ˣ +x +x + +ˤ +ˤ +ˤ +ʕ +ʕ + +̀ +̀ +̀ +̀ +̀ + +́ +́ +́ +́ +́ + +̓ +̓ +̓ +̓ +̓ + +̈́ +̈́ +̈́ +̈́ +̈́ + +ʹ +ʹ +ʹ +ʹ +ʹ + +ͺ +ͺ +ͺ + ͅ + ͅ + +; +; +; +; +; + +΄ +΄ +΄ + ́ + ́ + +΅ +΅ +΅ + ̈́ + ̈́ + +Ά +Ά +Ά +Ά +Ά + +· +· +· +· +· + +Έ +Έ +Έ +Έ +Έ + +Ή +Ή +Ή +Ή +Ή + +Ί +Ί +Ί +Ί +Ί + +Ό +Ό +Ό +Ό +Ό + +Ύ +Ύ +Ύ +Ύ +Ύ + +Ώ +Ώ +Ώ +Ώ +Ώ + +ΐ +ΐ +ΐ +ΐ +ΐ + +Ϊ +Ϊ +Ϊ +Ϊ +Ϊ + +Ϋ +Ϋ +Ϋ +Ϋ +Ϋ + +ά +ά +ά +ά +ά + +έ +έ +έ +έ +έ + +ή +ή +ή +ή +ή + +ί +ί +ί +ί +ί + +ΰ +ΰ +ΰ +ΰ +ΰ + +ϊ +ϊ +ϊ +ϊ +ϊ + +ϋ +ϋ +ϋ +ϋ +ϋ + +ό +ό +ό +ό +ό + +ύ +ύ +ύ +ύ +ύ + +ώ +ώ +ώ +ώ +ώ + +ϐ +ϐ +ϐ +β +β + +ϑ +ϑ +ϑ +θ +θ + +ϒ +ϒ +ϒ +Υ +Υ + +ϓ +ϓ +ϓ +Ύ +Ύ + +ϔ +ϔ +ϔ +Ϋ +Ϋ + +ϕ +ϕ +ϕ +φ +φ + +ϖ +ϖ +ϖ +π +π + +ϰ +ϰ +ϰ +κ +κ + +ϱ +ϱ +ϱ +ρ +ρ + +ϲ +ϲ +ϲ +ς +ς + +ϴ +ϴ +ϴ +Θ +Θ + +ϵ +ϵ +ϵ +ε +ε + +Ϲ +Ϲ +Ϲ +Σ +Σ + +Ѐ +Ѐ +Ѐ +Ѐ +Ѐ + +Ё +Ё +Ё +Ё +Ё + +Ѓ +Ѓ +Ѓ +Ѓ +Ѓ + +Ї +Ї +Ї +Ї +Ї + +Ќ +Ќ +Ќ +Ќ +Ќ + +Ѝ +Ѝ +Ѝ +Ѝ +Ѝ + +Ў +Ў +Ў +Ў +Ў + +Й +Й +Й +Й +Й + +й +й +й +й +й + +ѐ +ѐ +ѐ +ѐ +ѐ + +ё +ё +ё +ё +ё + +ѓ +ѓ +ѓ +ѓ +ѓ + +ї +ї +ї +ї +ї + +ќ +ќ +ќ +ќ +ќ + +ѝ +ѝ +ѝ +ѝ +ѝ + +ў +ў +ў +ў +ў + +Ѷ +Ѷ +Ѷ +Ѷ +Ѷ + +ѷ +ѷ +ѷ +ѷ +ѷ + +Ӂ +Ӂ +Ӂ +Ӂ +Ӂ + +ӂ +ӂ +ӂ +ӂ +ӂ + +Ӑ +Ӑ +Ӑ +Ӑ +Ӑ + +ӑ +ӑ +ӑ +ӑ +ӑ + +Ӓ +Ӓ +Ӓ +Ӓ +Ӓ + +ӓ +ӓ +ӓ +ӓ +ӓ + +Ӗ +Ӗ +Ӗ +Ӗ +Ӗ + +ӗ +ӗ +ӗ +ӗ +ӗ + +Ӛ +Ӛ +Ӛ +Ӛ +Ӛ + +ӛ +ӛ +ӛ +ӛ +ӛ + +Ӝ +Ӝ +Ӝ +Ӝ +Ӝ + +ӝ +ӝ +ӝ +ӝ +ӝ + +Ӟ +Ӟ +Ӟ +Ӟ +Ӟ + +ӟ +ӟ +ӟ +ӟ +ӟ + +Ӣ +Ӣ +Ӣ +Ӣ +Ӣ + +ӣ +ӣ +ӣ +ӣ +ӣ + +Ӥ +Ӥ +Ӥ +Ӥ +Ӥ + +ӥ +ӥ +ӥ +ӥ +ӥ + +Ӧ +Ӧ +Ӧ +Ӧ +Ӧ + +ӧ +ӧ +ӧ +ӧ +ӧ + +Ӫ +Ӫ +Ӫ +Ӫ +Ӫ + +ӫ +ӫ +ӫ +ӫ +ӫ + +Ӭ +Ӭ +Ӭ +Ӭ +Ӭ + +ӭ +ӭ +ӭ +ӭ +ӭ + +Ӯ +Ӯ +Ӯ +Ӯ +Ӯ + +ӯ +ӯ +ӯ +ӯ +ӯ + +Ӱ +Ӱ +Ӱ +Ӱ +Ӱ + +ӱ +ӱ +ӱ +ӱ +ӱ + +Ӳ +Ӳ +Ӳ +Ӳ +Ӳ + +ӳ +ӳ +ӳ +ӳ +ӳ + +Ӵ +Ӵ +Ӵ +Ӵ +Ӵ + +ӵ +ӵ +ӵ +ӵ +ӵ + +Ӹ +Ӹ +Ӹ +Ӹ +Ӹ + +ӹ +ӹ +ӹ +ӹ +ӹ + +և +և +և +եւ +եւ + +آ +آ +آ +آ +آ + +أ +أ +أ +أ +أ + +ؤ +ؤ +ؤ +ؤ +ؤ + +إ +إ +إ +إ +إ + +ئ +ئ +ئ +ئ +ئ + +ٵ +ٵ +ٵ +اٴ +اٴ + +ٶ +ٶ +ٶ +وٴ +وٴ + +ٷ +ٷ +ٷ +ۇٴ +ۇٴ + +ٸ +ٸ +ٸ +يٴ +يٴ + +ۀ +ۀ +ۀ +ۀ +ۀ + +ۂ +ۂ +ۂ +ۂ +ۂ + +ۓ +ۓ +ۓ +ۓ +ۓ + +ऩ +ऩ +ऩ +ऩ +ऩ + +ऱ +ऱ +ऱ +ऱ +ऱ + +ऴ +ऴ +ऴ +ऴ +ऴ + +क़ +क़ +क़ +क़ +क़ + +ख़ +ख़ +ख़ +ख़ +ख़ + +ग़ +ग़ +ग़ +ग़ +ग़ + +ज़ +ज़ +ज़ +ज़ +ज़ + +ड़ +ड़ +ड़ +ड़ +ड़ + +ढ़ +ढ़ +ढ़ +ढ़ +ढ़ + +फ़ +फ़ +फ़ +फ़ +फ़ + +य़ +य़ +य़ +य़ +य़ + +ো +ো +ো +ো +ো + +ৌ +ৌ +ৌ +ৌ +ৌ + +ড় +ড় +ড় +ড় +ড় + +ঢ় +ঢ় +ঢ় +ঢ় +ঢ় + +য় +য় +য় +য় +য় + +ਲ਼ +ਲ਼ +ਲ਼ +ਲ਼ +ਲ਼ + +ਸ਼ +ਸ਼ +ਸ਼ +ਸ਼ +ਸ਼ + +ਖ਼ +ਖ਼ +ਖ਼ +ਖ਼ +ਖ਼ + +ਗ਼ +ਗ਼ +ਗ਼ +ਗ਼ +ਗ਼ + +ਜ਼ +ਜ਼ +ਜ਼ +ਜ਼ +ਜ਼ + +ਫ਼ +ਫ਼ +ਫ਼ +ਫ਼ +ਫ਼ + +ୈ +ୈ +ୈ +ୈ +ୈ + +ୋ +ୋ +ୋ +ୋ +ୋ + +ୌ +ୌ +ୌ +ୌ +ୌ + +ଡ଼ +ଡ଼ +ଡ଼ +ଡ଼ +ଡ଼ + +ଢ଼ +ଢ଼ +ଢ଼ +ଢ଼ +ଢ଼ + +ஔ +ஔ +ஔ +ஔ +ஔ + +ொ +ொ +ொ +ொ +ொ + +ோ +ோ +ோ +ோ +ோ + +ௌ +ௌ +ௌ +ௌ +ௌ + +ై +ై +ై +ై +ై + +ೀ +ೀ +ೀ +ೀ +ೀ + +ೇ +ೇ +ೇ +ೇ +ೇ + +ೈ +ೈ +ೈ +ೈ +ೈ + +ೊ +ೊ +ೊ +ೊ +ೊ + +ೋ +ೋ +ೋ +ೋ +ೋ + +ൊ +ൊ +ൊ +ൊ +ൊ + +ോ +ോ +ോ +ോ +ോ + +ൌ +ൌ +ൌ +ൌ +ൌ + +ේ +ේ +ේ +ේ +ේ + +ො +ො +ො +ො +ො + +ෝ +ෝ +ෝ +ෝ +ෝ + +ෞ +ෞ +ෞ +ෞ +ෞ + +ำ +ำ +ำ +ํา +ํา + +ຳ +ຳ +ຳ +ໍາ +ໍາ + +ໜ +ໜ +ໜ +ຫນ +ຫນ + +ໝ +ໝ +ໝ +ຫມ +ຫມ + +༌ +༌ +༌ +་ +་ + +གྷ +གྷ +གྷ +གྷ +གྷ + +ཌྷ +ཌྷ +ཌྷ +ཌྷ +ཌྷ + +དྷ +དྷ +དྷ +དྷ +དྷ + +བྷ +བྷ +བྷ +བྷ +བྷ + +ཛྷ +ཛྷ +ཛྷ +ཛྷ +ཛྷ + +ཀྵ +ཀྵ +ཀྵ +ཀྵ +ཀྵ + +ཱི +ཱི +ཱི +ཱི +ཱི + +ཱུ +ཱུ +ཱུ +ཱུ +ཱུ + +ྲྀ +ྲྀ +ྲྀ +ྲྀ +ྲྀ + +ཷ +ཷ +ཷ +ྲཱྀ +ྲཱྀ + +ླྀ +ླྀ +ླྀ +ླྀ +ླྀ + +ཹ +ཹ +ཹ +ླཱྀ +ླཱྀ + +ཱྀ +ཱྀ +ཱྀ +ཱྀ +ཱྀ + +ྒྷ +ྒྷ +ྒྷ +ྒྷ +ྒྷ + +ྜྷ +ྜྷ +ྜྷ +ྜྷ +ྜྷ + +ྡྷ +ྡྷ +ྡྷ +ྡྷ +ྡྷ + +ྦྷ +ྦྷ +ྦྷ +ྦྷ +ྦྷ + +ྫྷ +ྫྷ +ྫྷ +ྫྷ +ྫྷ + +ྐྵ +ྐྵ +ྐྵ +ྐྵ +ྐྵ + +ဦ +ဦ +ဦ +ဦ +ဦ + +ჼ +ჼ +ჼ +ნ +ნ + +ᬆ +ᬆ +ᬆ +ᬆ +ᬆ + +ᬈ +ᬈ +ᬈ +ᬈ +ᬈ + +ᬊ +ᬊ +ᬊ +ᬊ +ᬊ + +ᬌ +ᬌ +ᬌ +ᬌ +ᬌ + +ᬎ +ᬎ +ᬎ +ᬎ +ᬎ + +ᬒ +ᬒ +ᬒ +ᬒ +ᬒ + +ᬻ +ᬻ +ᬻ +ᬻ +ᬻ + +ᬽ +ᬽ +ᬽ +ᬽ +ᬽ + +ᭀ +ᭀ +ᭀ +ᭀ +ᭀ + +ᭁ +ᭁ +ᭁ +ᭁ +ᭁ + +ᭃ +ᭃ +ᭃ +ᭃ +ᭃ + +ᴬ +ᴬ +ᴬ +A +A + +ᴭ +ᴭ +ᴭ +Æ +Æ + +ᴮ +ᴮ +ᴮ +B +B + +ᴰ +ᴰ +ᴰ +D +D + +ᴱ +ᴱ +ᴱ +E +E + +ᴲ +ᴲ +ᴲ +Ǝ +Ǝ + +ᴳ +ᴳ +ᴳ +G +G + +ᴴ +ᴴ +ᴴ +H +H + +ᴵ +ᴵ +ᴵ +I +I + +ᴶ +ᴶ +ᴶ +J +J + +ᴷ +ᴷ +ᴷ +K +K + +ᴸ +ᴸ +ᴸ +L +L + +ᴹ +ᴹ +ᴹ +M +M + +ᴺ +ᴺ +ᴺ +N +N + +ᴼ +ᴼ +ᴼ +O +O + +ᴽ +ᴽ +ᴽ +Ȣ +Ȣ + +ᴾ +ᴾ +ᴾ +P +P + +ᴿ +ᴿ +ᴿ +R +R + +ᵀ +ᵀ +ᵀ +T +T + +ᵁ +ᵁ +ᵁ +U +U + +ᵂ +ᵂ +ᵂ +W +W + +ᵃ +ᵃ +ᵃ +a +a + +ᵄ +ᵄ +ᵄ +ɐ +ɐ + +ᵅ +ᵅ +ᵅ +ɑ +ɑ + +ᵆ +ᵆ +ᵆ +ᴂ +ᴂ + +ᵇ +ᵇ +ᵇ +b +b + +ᵈ +ᵈ +ᵈ +d +d + +ᵉ +ᵉ +ᵉ +e +e + +ᵊ +ᵊ +ᵊ +ə +ə + +ᵋ +ᵋ +ᵋ +ɛ +ɛ + +ᵌ +ᵌ +ᵌ +ɜ +ɜ + +ᵍ +ᵍ +ᵍ +g +g + +ᵏ +ᵏ +ᵏ +k +k + +ᵐ +ᵐ +ᵐ +m +m + +ᵑ +ᵑ +ᵑ +ŋ +ŋ + +ᵒ +ᵒ +ᵒ +o +o + +ᵓ +ᵓ +ᵓ +ɔ +ɔ + +ᵔ +ᵔ +ᵔ +ᴖ +ᴖ + +ᵕ +ᵕ +ᵕ +ᴗ +ᴗ + +ᵖ +ᵖ +ᵖ +p +p + +ᵗ +ᵗ +ᵗ +t +t + +ᵘ +ᵘ +ᵘ +u +u + +ᵙ +ᵙ +ᵙ +ᴝ +ᴝ + +ᵚ +ᵚ +ᵚ +ɯ +ɯ + +ᵛ +ᵛ +ᵛ +v +v + +ᵜ +ᵜ +ᵜ +ᴥ +ᴥ + +ᵝ +ᵝ +ᵝ +β +β + +ᵞ +ᵞ +ᵞ +γ +γ + +ᵟ +ᵟ +ᵟ +δ +δ + +ᵠ +ᵠ +ᵠ +φ +φ + +ᵡ +ᵡ +ᵡ +χ +χ + +ᵢ +ᵢ +ᵢ +i +i + +ᵣ +ᵣ +ᵣ +r +r + +ᵤ +ᵤ +ᵤ +u +u + +ᵥ +ᵥ +ᵥ +v +v + +ᵦ +ᵦ +ᵦ +β +β + +ᵧ +ᵧ +ᵧ +γ +γ + +ᵨ +ᵨ +ᵨ +ρ +ρ + +ᵩ +ᵩ +ᵩ +φ +φ + +ᵪ +ᵪ +ᵪ +χ +χ + +ᵸ +ᵸ +ᵸ +н +н + +ᶛ +ᶛ +ᶛ +ɒ +ɒ + +ᶜ +ᶜ +ᶜ +c +c + +ᶝ +ᶝ +ᶝ +ɕ +ɕ + +ᶞ +ᶞ +ᶞ +ð +ð + +ᶟ +ᶟ +ᶟ +ɜ +ɜ + +ᶠ +ᶠ +ᶠ +f +f + +ᶡ +ᶡ +ᶡ +ɟ +ɟ + +ᶢ +ᶢ +ᶢ +ɡ +ɡ + +ᶣ +ᶣ +ᶣ +ɥ +ɥ + +ᶤ +ᶤ +ᶤ +ɨ +ɨ + +ᶥ +ᶥ +ᶥ +ɩ +ɩ + +ᶦ +ᶦ +ᶦ +ɪ +ɪ + +ᶧ +ᶧ +ᶧ +ᵻ +ᵻ + +ᶨ +ᶨ +ᶨ +ʝ +ʝ + +ᶩ +ᶩ +ᶩ +ɭ +ɭ + +ᶪ +ᶪ +ᶪ +ᶅ +ᶅ + +ᶫ +ᶫ +ᶫ +ʟ +ʟ + +ᶬ +ᶬ +ᶬ +ɱ +ɱ + +ᶭ +ᶭ +ᶭ +ɰ +ɰ + +ᶮ +ᶮ +ᶮ +ɲ +ɲ + +ᶯ +ᶯ +ᶯ +ɳ +ɳ + +ᶰ +ᶰ +ᶰ +ɴ +ɴ + +ᶱ +ᶱ +ᶱ +ɵ +ɵ + +ᶲ +ᶲ +ᶲ +ɸ +ɸ + +ᶳ +ᶳ +ᶳ +ʂ +ʂ + +ᶴ +ᶴ +ᶴ +ʃ +ʃ + +ᶵ +ᶵ +ᶵ +ƫ +ƫ + +ᶶ +ᶶ +ᶶ +ʉ +ʉ + +ᶷ +ᶷ +ᶷ +ʊ +ʊ + +ᶸ +ᶸ +ᶸ +ᴜ +ᴜ + +ᶹ +ᶹ +ᶹ +ʋ +ʋ + +ᶺ +ᶺ +ᶺ +ʌ +ʌ + +ᶻ +ᶻ +ᶻ +z +z + +ᶼ +ᶼ +ᶼ +ʐ +ʐ + +ᶽ +ᶽ +ᶽ +ʑ +ʑ + +ᶾ +ᶾ +ᶾ +ʒ +ʒ + +ᶿ +ᶿ +ᶿ +θ +θ + +Ḁ +Ḁ +Ḁ +Ḁ +Ḁ + +ḁ +ḁ +ḁ +ḁ +ḁ + +Ḃ +Ḃ +Ḃ +Ḃ +Ḃ + +ḃ +ḃ +ḃ +ḃ +ḃ + +Ḅ +Ḅ +Ḅ +Ḅ +Ḅ + +ḅ +ḅ +ḅ +ḅ +ḅ + +Ḇ +Ḇ +Ḇ +Ḇ +Ḇ + +ḇ +ḇ +ḇ +ḇ +ḇ + +Ḉ +Ḉ +Ḉ +Ḉ +Ḉ + +ḉ +ḉ +ḉ +ḉ +ḉ + +Ḋ +Ḋ +Ḋ +Ḋ +Ḋ + +ḋ +ḋ +ḋ +ḋ +ḋ + +Ḍ +Ḍ +Ḍ +Ḍ +Ḍ + +ḍ +ḍ +ḍ +ḍ +ḍ + +Ḏ +Ḏ +Ḏ +Ḏ +Ḏ + +ḏ +ḏ +ḏ +ḏ +ḏ + +Ḑ +Ḑ +Ḑ +Ḑ +Ḑ + +ḑ +ḑ +ḑ +ḑ +ḑ + +Ḓ +Ḓ +Ḓ +Ḓ +Ḓ + +ḓ +ḓ +ḓ +ḓ +ḓ + +Ḕ +Ḕ +Ḕ +Ḕ +Ḕ + +ḕ +ḕ +ḕ +ḕ +ḕ + +Ḗ +Ḗ +Ḗ +Ḗ +Ḗ + +ḗ +ḗ +ḗ +ḗ +ḗ + +Ḙ +Ḙ +Ḙ +Ḙ +Ḙ + +ḙ +ḙ +ḙ +ḙ +ḙ + +Ḛ +Ḛ +Ḛ +Ḛ +Ḛ + +ḛ +ḛ +ḛ +ḛ +ḛ + +Ḝ +Ḝ +Ḝ +Ḝ +Ḝ + +ḝ +ḝ +ḝ +ḝ +ḝ + +Ḟ +Ḟ +Ḟ +Ḟ +Ḟ + +ḟ +ḟ +ḟ +ḟ +ḟ + +Ḡ +Ḡ +Ḡ +Ḡ +Ḡ + +ḡ +ḡ +ḡ +ḡ +ḡ + +Ḣ +Ḣ +Ḣ +Ḣ +Ḣ + +ḣ +ḣ +ḣ +ḣ +ḣ + +Ḥ +Ḥ +Ḥ +Ḥ +Ḥ + +ḥ +ḥ +ḥ +ḥ +ḥ + +Ḧ +Ḧ +Ḧ +Ḧ +Ḧ + +ḧ +ḧ +ḧ +ḧ +ḧ + +Ḩ +Ḩ +Ḩ +Ḩ +Ḩ + +ḩ +ḩ +ḩ +ḩ +ḩ + +Ḫ +Ḫ +Ḫ +Ḫ +Ḫ + +ḫ +ḫ +ḫ +ḫ +ḫ + +Ḭ +Ḭ +Ḭ +Ḭ +Ḭ + +ḭ +ḭ +ḭ +ḭ +ḭ + +Ḯ +Ḯ +Ḯ +Ḯ +Ḯ + +ḯ +ḯ +ḯ +ḯ +ḯ + +Ḱ +Ḱ +Ḱ +Ḱ +Ḱ + +ḱ +ḱ +ḱ +ḱ +ḱ + +Ḳ +Ḳ +Ḳ +Ḳ +Ḳ + +ḳ +ḳ +ḳ +ḳ +ḳ + +Ḵ +Ḵ +Ḵ +Ḵ +Ḵ + +ḵ +ḵ +ḵ +ḵ +ḵ + +Ḷ +Ḷ +Ḷ +Ḷ +Ḷ + +ḷ +ḷ +ḷ +ḷ +ḷ + +Ḹ +Ḹ +Ḹ +Ḹ +Ḹ + +ḹ +ḹ +ḹ +ḹ +ḹ + +Ḻ +Ḻ +Ḻ +Ḻ +Ḻ + +ḻ +ḻ +ḻ +ḻ +ḻ + +Ḽ +Ḽ +Ḽ +Ḽ +Ḽ + +ḽ +ḽ +ḽ +ḽ +ḽ + +Ḿ +Ḿ +Ḿ +Ḿ +Ḿ + +ḿ +ḿ +ḿ +ḿ +ḿ + +Ṁ +Ṁ +Ṁ +Ṁ +Ṁ + +ṁ +ṁ +ṁ +ṁ +ṁ + +Ṃ +Ṃ +Ṃ +Ṃ +Ṃ + +ṃ +ṃ +ṃ +ṃ +ṃ + +Ṅ +Ṅ +Ṅ +Ṅ +Ṅ + +ṅ +ṅ +ṅ +ṅ +ṅ + +Ṇ +Ṇ +Ṇ +Ṇ +Ṇ + +ṇ +ṇ +ṇ +ṇ +ṇ + +Ṉ +Ṉ +Ṉ +Ṉ +Ṉ + +ṉ +ṉ +ṉ +ṉ +ṉ + +Ṋ +Ṋ +Ṋ +Ṋ +Ṋ + +ṋ +ṋ +ṋ +ṋ +ṋ + +Ṍ +Ṍ +Ṍ +Ṍ +Ṍ + +ṍ +ṍ +ṍ +ṍ +ṍ + +Ṏ +Ṏ +Ṏ +Ṏ +Ṏ + +ṏ +ṏ +ṏ +ṏ +ṏ + +Ṑ +Ṑ +Ṑ +Ṑ +Ṑ + +ṑ +ṑ +ṑ +ṑ +ṑ + +Ṓ +Ṓ +Ṓ +Ṓ +Ṓ + +ṓ +ṓ +ṓ +ṓ +ṓ + +Ṕ +Ṕ +Ṕ +Ṕ +Ṕ + +ṕ +ṕ +ṕ +ṕ +ṕ + +Ṗ +Ṗ +Ṗ +Ṗ +Ṗ + +ṗ +ṗ +ṗ +ṗ +ṗ + +Ṙ +Ṙ +Ṙ +Ṙ +Ṙ + +ṙ +ṙ +ṙ +ṙ +ṙ + +Ṛ +Ṛ +Ṛ +Ṛ +Ṛ + +ṛ +ṛ +ṛ +ṛ +ṛ + +Ṝ +Ṝ +Ṝ +Ṝ +Ṝ + +ṝ +ṝ +ṝ +ṝ +ṝ + +Ṟ +Ṟ +Ṟ +Ṟ +Ṟ + +ṟ +ṟ +ṟ +ṟ +ṟ + +Ṡ +Ṡ +Ṡ +Ṡ +Ṡ + +ṡ +ṡ +ṡ +ṡ +ṡ + +Ṣ +Ṣ +Ṣ +Ṣ +Ṣ + +ṣ +ṣ +ṣ +ṣ +ṣ + +Ṥ +Ṥ +Ṥ +Ṥ +Ṥ + +ṥ +ṥ +ṥ +ṥ +ṥ + +Ṧ +Ṧ +Ṧ +Ṧ +Ṧ + +ṧ +ṧ +ṧ +ṧ +ṧ + +Ṩ +Ṩ +Ṩ +Ṩ +Ṩ + +ṩ +ṩ +ṩ +ṩ +ṩ + +Ṫ +Ṫ +Ṫ +Ṫ +Ṫ + +ṫ +ṫ +ṫ +ṫ +ṫ + +Ṭ +Ṭ +Ṭ +Ṭ +Ṭ + +ṭ +ṭ +ṭ +ṭ +ṭ + +Ṯ +Ṯ +Ṯ +Ṯ +Ṯ + +ṯ +ṯ +ṯ +ṯ +ṯ + +Ṱ +Ṱ +Ṱ +Ṱ +Ṱ + +ṱ +ṱ +ṱ +ṱ +ṱ + +Ṳ +Ṳ +Ṳ +Ṳ +Ṳ + +ṳ +ṳ +ṳ +ṳ +ṳ + +Ṵ +Ṵ +Ṵ +Ṵ +Ṵ + +ṵ +ṵ +ṵ +ṵ +ṵ + +Ṷ +Ṷ +Ṷ +Ṷ +Ṷ + +ṷ +ṷ +ṷ +ṷ +ṷ + +Ṹ +Ṹ +Ṹ +Ṹ +Ṹ + +ṹ +ṹ +ṹ +ṹ +ṹ + +Ṻ +Ṻ +Ṻ +Ṻ +Ṻ + +ṻ +ṻ +ṻ +ṻ +ṻ + +Ṽ +Ṽ +Ṽ +Ṽ +Ṽ + +ṽ +ṽ +ṽ +ṽ +ṽ + +Ṿ +Ṿ +Ṿ +Ṿ +Ṿ + +ṿ +ṿ +ṿ +ṿ +ṿ + +Ẁ +Ẁ +Ẁ +Ẁ +Ẁ + +ẁ +ẁ +ẁ +ẁ +ẁ + +Ẃ +Ẃ +Ẃ +Ẃ +Ẃ + +ẃ +ẃ +ẃ +ẃ +ẃ + +Ẅ +Ẅ +Ẅ +Ẅ +Ẅ + +ẅ +ẅ +ẅ +ẅ +ẅ + +Ẇ +Ẇ +Ẇ +Ẇ +Ẇ + +ẇ +ẇ +ẇ +ẇ +ẇ + +Ẉ +Ẉ +Ẉ +Ẉ +Ẉ + +ẉ +ẉ +ẉ +ẉ +ẉ + +Ẋ +Ẋ +Ẋ +Ẋ +Ẋ + +ẋ +ẋ +ẋ +ẋ +ẋ + +Ẍ +Ẍ +Ẍ +Ẍ +Ẍ + +ẍ +ẍ +ẍ +ẍ +ẍ + +Ẏ +Ẏ +Ẏ +Ẏ +Ẏ + +ẏ +ẏ +ẏ +ẏ +ẏ + +Ẑ +Ẑ +Ẑ +Ẑ +Ẑ + +ẑ +ẑ +ẑ +ẑ +ẑ + +Ẓ +Ẓ +Ẓ +Ẓ +Ẓ + +ẓ +ẓ +ẓ +ẓ +ẓ + +Ẕ +Ẕ +Ẕ +Ẕ +Ẕ + +ẕ +ẕ +ẕ +ẕ +ẕ + +ẖ +ẖ +ẖ +ẖ +ẖ + +ẗ +ẗ +ẗ +ẗ +ẗ + +ẘ +ẘ +ẘ +ẘ +ẘ + +ẙ +ẙ +ẙ +ẙ +ẙ + +ẚ +ẚ +ẚ +aʾ +aʾ + +ẛ +ẛ +ẛ +ṡ +ṡ + +Ạ +Ạ +Ạ +Ạ +Ạ + +ạ +ạ +ạ +ạ +ạ + +Ả +Ả +Ả +Ả +Ả + +ả +ả +ả +ả +ả + +Ấ +Ấ +Ấ +Ấ +Ấ + +ấ +ấ +ấ +ấ +ấ + +Ầ +Ầ +Ầ +Ầ +Ầ + +ầ +ầ +ầ +ầ +ầ + +Ẩ +Ẩ +Ẩ +Ẩ +Ẩ + +ẩ +ẩ +ẩ +ẩ +ẩ + +Ẫ +Ẫ +Ẫ +Ẫ +Ẫ + +ẫ +ẫ +ẫ +ẫ +ẫ + +Ậ +Ậ +Ậ +Ậ +Ậ + +ậ +ậ +ậ +ậ +ậ + +Ắ +Ắ +Ắ +Ắ +Ắ + +ắ +ắ +ắ +ắ +ắ + +Ằ +Ằ +Ằ +Ằ +Ằ + +ằ +ằ +ằ +ằ +ằ + +Ẳ +Ẳ +Ẳ +Ẳ +Ẳ + +ẳ +ẳ +ẳ +ẳ +ẳ + +Ẵ +Ẵ +Ẵ +Ẵ +Ẵ + +ẵ +ẵ +ẵ +ẵ +ẵ + +Ặ +Ặ +Ặ +Ặ +Ặ + +ặ +ặ +ặ +ặ +ặ + +Ẹ +Ẹ +Ẹ +Ẹ +Ẹ + +ẹ +ẹ +ẹ +ẹ +ẹ + +Ẻ +Ẻ +Ẻ +Ẻ +Ẻ + +ẻ +ẻ +ẻ +ẻ +ẻ + +Ẽ +Ẽ +Ẽ +Ẽ +Ẽ + +ẽ +ẽ +ẽ +ẽ +ẽ + +Ế +Ế +Ế +Ế +Ế + +ế +ế +ế +ế +ế + +Ề +Ề +Ề +Ề +Ề + +ề +ề +ề +ề +ề + +Ể +Ể +Ể +Ể +Ể + +ể +ể +ể +ể +ể + +Ễ +Ễ +Ễ +Ễ +Ễ + +ễ +ễ +ễ +ễ +ễ + +Ệ +Ệ +Ệ +Ệ +Ệ + +ệ +ệ +ệ +ệ +ệ + +Ỉ +Ỉ +Ỉ +Ỉ +Ỉ + +ỉ +ỉ +ỉ +ỉ +ỉ + +Ị +Ị +Ị +Ị +Ị + +ị +ị +ị +ị +ị + +Ọ +Ọ +Ọ +Ọ +Ọ + +ọ +ọ +ọ +ọ +ọ + +Ỏ +Ỏ +Ỏ +Ỏ +Ỏ + +ỏ +ỏ +ỏ +ỏ +ỏ + +Ố +Ố +Ố +Ố +Ố + +ố +ố +ố +ố +ố + +Ồ +Ồ +Ồ +Ồ +Ồ + +ồ +ồ +ồ +ồ +ồ + +Ổ +Ổ +Ổ +Ổ +Ổ + +ổ +ổ +ổ +ổ +ổ + +Ỗ +Ỗ +Ỗ +Ỗ +Ỗ + +ỗ +ỗ +ỗ +ỗ +ỗ + +Ộ +Ộ +Ộ +Ộ +Ộ + +ộ +ộ +ộ +ộ +ộ + +Ớ +Ớ +Ớ +Ớ +Ớ + +ớ +ớ +ớ +ớ +ớ + +Ờ +Ờ +Ờ +Ờ +Ờ + +ờ +ờ +ờ +ờ +ờ + +Ở +Ở +Ở +Ở +Ở + +ở +ở +ở +ở +ở + +Ỡ +Ỡ +Ỡ +Ỡ +Ỡ + +ỡ +ỡ +ỡ +ỡ +ỡ + +Ợ +Ợ +Ợ +Ợ +Ợ + +ợ +ợ +ợ +ợ +ợ + +Ụ +Ụ +Ụ +Ụ +Ụ + +ụ +ụ +ụ +ụ +ụ + +Ủ +Ủ +Ủ +Ủ +Ủ + +ủ +ủ +ủ +ủ +ủ + +Ứ +Ứ +Ứ +Ứ +Ứ + +ứ +ứ +ứ +ứ +ứ + +Ừ +Ừ +Ừ +Ừ +Ừ + +ừ +ừ +ừ +ừ +ừ + +Ử +Ử +Ử +Ử +Ử + +ử +ử +ử +ử +ử + +Ữ +Ữ +Ữ +Ữ +Ữ + +ữ +ữ +ữ +ữ +ữ + +Ự +Ự +Ự +Ự +Ự + +ự +ự +ự +ự +ự + +Ỳ +Ỳ +Ỳ +Ỳ +Ỳ + +ỳ +ỳ +ỳ +ỳ +ỳ + +Ỵ +Ỵ +Ỵ +Ỵ +Ỵ + +ỵ +ỵ +ỵ +ỵ +ỵ + +Ỷ +Ỷ +Ỷ +Ỷ +Ỷ + +ỷ +ỷ +ỷ +ỷ +ỷ + +Ỹ +Ỹ +Ỹ +Ỹ +Ỹ + +ỹ +ỹ +ỹ +ỹ +ỹ + +ἀ +ἀ +ἀ +ἀ +ἀ + +ἁ +ἁ +ἁ +ἁ +ἁ + +ἂ +ἂ +ἂ +ἂ +ἂ + +ἃ +ἃ +ἃ +ἃ +ἃ + +ἄ +ἄ +ἄ +ἄ +ἄ + +ἅ +ἅ +ἅ +ἅ +ἅ + +ἆ +ἆ +ἆ +ἆ +ἆ + +ἇ +ἇ +ἇ +ἇ +ἇ + +Ἀ +Ἀ +Ἀ +Ἀ +Ἀ + +Ἁ +Ἁ +Ἁ +Ἁ +Ἁ + +Ἂ +Ἂ +Ἂ +Ἂ +Ἂ + +Ἃ +Ἃ +Ἃ +Ἃ +Ἃ + +Ἄ +Ἄ +Ἄ +Ἄ +Ἄ + +Ἅ +Ἅ +Ἅ +Ἅ +Ἅ + +Ἆ +Ἆ +Ἆ +Ἆ +Ἆ + +Ἇ +Ἇ +Ἇ +Ἇ +Ἇ + +ἐ +ἐ +ἐ +ἐ +ἐ + +ἑ +ἑ +ἑ +ἑ +ἑ + +ἒ +ἒ +ἒ +ἒ +ἒ + +ἓ +ἓ +ἓ +ἓ +ἓ + +ἔ +ἔ +ἔ +ἔ +ἔ + +ἕ +ἕ +ἕ +ἕ +ἕ + +Ἐ +Ἐ +Ἐ +Ἐ +Ἐ + +Ἑ +Ἑ +Ἑ +Ἑ +Ἑ + +Ἒ +Ἒ +Ἒ +Ἒ +Ἒ + +Ἓ +Ἓ +Ἓ +Ἓ +Ἓ + +Ἔ +Ἔ +Ἔ +Ἔ +Ἔ + +Ἕ +Ἕ +Ἕ +Ἕ +Ἕ + +ἠ +ἠ +ἠ +ἠ +ἠ + +ἡ +ἡ +ἡ +ἡ +ἡ + +ἢ +ἢ +ἢ +ἢ +ἢ + +ἣ +ἣ +ἣ +ἣ +ἣ + +ἤ +ἤ +ἤ +ἤ +ἤ + +ἥ +ἥ +ἥ +ἥ +ἥ + +ἦ +ἦ +ἦ +ἦ +ἦ + +ἧ +ἧ +ἧ +ἧ +ἧ + +Ἠ +Ἠ +Ἠ +Ἠ +Ἠ + +Ἡ +Ἡ +Ἡ +Ἡ +Ἡ + +Ἢ +Ἢ +Ἢ +Ἢ +Ἢ + +Ἣ +Ἣ +Ἣ +Ἣ +Ἣ + +Ἤ +Ἤ +Ἤ +Ἤ +Ἤ + +Ἥ +Ἥ +Ἥ +Ἥ +Ἥ + +Ἦ +Ἦ +Ἦ +Ἦ +Ἦ + +Ἧ +Ἧ +Ἧ +Ἧ +Ἧ + +ἰ +ἰ +ἰ +ἰ +ἰ + +ἱ +ἱ +ἱ +ἱ +ἱ + +ἲ +ἲ +ἲ +ἲ +ἲ + +ἳ +ἳ +ἳ +ἳ +ἳ + +ἴ +ἴ +ἴ +ἴ +ἴ + +ἵ +ἵ +ἵ +ἵ +ἵ + +ἶ +ἶ +ἶ +ἶ +ἶ + +ἷ +ἷ +ἷ +ἷ +ἷ + +Ἰ +Ἰ +Ἰ +Ἰ +Ἰ + +Ἱ +Ἱ +Ἱ +Ἱ +Ἱ + +Ἲ +Ἲ +Ἲ +Ἲ +Ἲ + +Ἳ +Ἳ +Ἳ +Ἳ +Ἳ + +Ἴ +Ἴ +Ἴ +Ἴ +Ἴ + +Ἵ +Ἵ +Ἵ +Ἵ +Ἵ + +Ἶ +Ἶ +Ἶ +Ἶ +Ἶ + +Ἷ +Ἷ +Ἷ +Ἷ +Ἷ + +ὀ +ὀ +ὀ +ὀ +ὀ + +ὁ +ὁ +ὁ +ὁ +ὁ + +ὂ +ὂ +ὂ +ὂ +ὂ + +ὃ +ὃ +ὃ +ὃ +ὃ + +ὄ +ὄ +ὄ +ὄ +ὄ + +ὅ +ὅ +ὅ +ὅ +ὅ + +Ὀ +Ὀ +Ὀ +Ὀ +Ὀ + +Ὁ +Ὁ +Ὁ +Ὁ +Ὁ + +Ὂ +Ὂ +Ὂ +Ὂ +Ὂ + +Ὃ +Ὃ +Ὃ +Ὃ +Ὃ + +Ὄ +Ὄ +Ὄ +Ὄ +Ὄ + +Ὅ +Ὅ +Ὅ +Ὅ +Ὅ + +ὐ +ὐ +ὐ +ὐ +ὐ + +ὑ +ὑ +ὑ +ὑ +ὑ + +ὒ +ὒ +ὒ +ὒ +ὒ + +ὓ +ὓ +ὓ +ὓ +ὓ + +ὔ +ὔ +ὔ +ὔ +ὔ + +ὕ +ὕ +ὕ +ὕ +ὕ + +ὖ +ὖ +ὖ +ὖ +ὖ + +ὗ +ὗ +ὗ +ὗ +ὗ + +Ὑ +Ὑ +Ὑ +Ὑ +Ὑ + +Ὓ +Ὓ +Ὓ +Ὓ +Ὓ + +Ὕ +Ὕ +Ὕ +Ὕ +Ὕ + +Ὗ +Ὗ +Ὗ +Ὗ +Ὗ + +ὠ +ὠ +ὠ +ὠ +ὠ + +ὡ +ὡ +ὡ +ὡ +ὡ + +ὢ +ὢ +ὢ +ὢ +ὢ + +ὣ +ὣ +ὣ +ὣ +ὣ + +ὤ +ὤ +ὤ +ὤ +ὤ + +ὥ +ὥ +ὥ +ὥ +ὥ + +ὦ +ὦ +ὦ +ὦ +ὦ + +ὧ +ὧ +ὧ +ὧ +ὧ + +Ὠ +Ὠ +Ὠ +Ὠ +Ὠ + +Ὡ +Ὡ +Ὡ +Ὡ +Ὡ + +Ὢ +Ὢ +Ὢ +Ὢ +Ὢ + +Ὣ +Ὣ +Ὣ +Ὣ +Ὣ + +Ὤ +Ὤ +Ὤ +Ὤ +Ὤ + +Ὥ +Ὥ +Ὥ +Ὥ +Ὥ + +Ὦ +Ὦ +Ὦ +Ὦ +Ὦ + +Ὧ +Ὧ +Ὧ +Ὧ +Ὧ + +ὰ +ὰ +ὰ +ὰ +ὰ + +ά +ά +ά +ά +ά + +ὲ +ὲ +ὲ +ὲ +ὲ + +έ +έ +έ +έ +έ + +ὴ +ὴ +ὴ +ὴ +ὴ + +ή +ή +ή +ή +ή + +ὶ +ὶ +ὶ +ὶ +ὶ + +ί +ί +ί +ί +ί + +ὸ +ὸ +ὸ +ὸ +ὸ + +ό +ό +ό +ό +ό + +ὺ +ὺ +ὺ +ὺ +ὺ + +ύ +ύ +ύ +ύ +ύ + +ὼ +ὼ +ὼ +ὼ +ὼ + +ώ +ώ +ώ +ώ +ώ + +ᾀ +ᾀ +ᾀ +ᾀ +ᾀ + +ᾁ +ᾁ +ᾁ +ᾁ +ᾁ + +ᾂ +ᾂ +ᾂ +ᾂ +ᾂ + +ᾃ +ᾃ +ᾃ +ᾃ +ᾃ + +ᾄ +ᾄ +ᾄ +ᾄ +ᾄ + +ᾅ +ᾅ +ᾅ +ᾅ +ᾅ + +ᾆ +ᾆ +ᾆ +ᾆ +ᾆ + +ᾇ +ᾇ +ᾇ +ᾇ +ᾇ + +ᾈ +ᾈ +ᾈ +ᾈ +ᾈ + +ᾉ +ᾉ +ᾉ +ᾉ +ᾉ + +ᾊ +ᾊ +ᾊ +ᾊ +ᾊ + +ᾋ +ᾋ +ᾋ +ᾋ +ᾋ + +ᾌ +ᾌ +ᾌ +ᾌ +ᾌ + +ᾍ +ᾍ +ᾍ +ᾍ +ᾍ + +ᾎ +ᾎ +ᾎ +ᾎ +ᾎ + +ᾏ +ᾏ +ᾏ +ᾏ +ᾏ + +ᾐ +ᾐ +ᾐ +ᾐ +ᾐ + +ᾑ +ᾑ +ᾑ +ᾑ +ᾑ + +ᾒ +ᾒ +ᾒ +ᾒ +ᾒ + +ᾓ +ᾓ +ᾓ +ᾓ +ᾓ + +ᾔ +ᾔ +ᾔ +ᾔ +ᾔ + +ᾕ +ᾕ +ᾕ +ᾕ +ᾕ + +ᾖ +ᾖ +ᾖ +ᾖ +ᾖ + +ᾗ +ᾗ +ᾗ +ᾗ +ᾗ + +ᾘ +ᾘ +ᾘ +ᾘ +ᾘ + +ᾙ +ᾙ +ᾙ +ᾙ +ᾙ + +ᾚ +ᾚ +ᾚ +ᾚ +ᾚ + +ᾛ +ᾛ +ᾛ +ᾛ +ᾛ + +ᾜ +ᾜ +ᾜ +ᾜ +ᾜ + +ᾝ +ᾝ +ᾝ +ᾝ +ᾝ + +ᾞ +ᾞ +ᾞ +ᾞ +ᾞ + +ᾟ +ᾟ +ᾟ +ᾟ +ᾟ + +ᾠ +ᾠ +ᾠ +ᾠ +ᾠ + +ᾡ +ᾡ +ᾡ +ᾡ +ᾡ + +ᾢ +ᾢ +ᾢ +ᾢ +ᾢ + +ᾣ +ᾣ +ᾣ +ᾣ +ᾣ + +ᾤ +ᾤ +ᾤ +ᾤ +ᾤ + +ᾥ +ᾥ +ᾥ +ᾥ +ᾥ + +ᾦ +ᾦ +ᾦ +ᾦ +ᾦ + +ᾧ +ᾧ +ᾧ +ᾧ +ᾧ + +ᾨ +ᾨ +ᾨ +ᾨ +ᾨ + +ᾩ +ᾩ +ᾩ +ᾩ +ᾩ + +ᾪ +ᾪ +ᾪ +ᾪ +ᾪ + +ᾫ +ᾫ +ᾫ +ᾫ +ᾫ + +ᾬ +ᾬ +ᾬ +ᾬ +ᾬ + +ᾭ +ᾭ +ᾭ +ᾭ +ᾭ + +ᾮ +ᾮ +ᾮ +ᾮ +ᾮ + +ᾯ +ᾯ +ᾯ +ᾯ +ᾯ + +ᾰ +ᾰ +ᾰ +ᾰ +ᾰ + +ᾱ +ᾱ +ᾱ +ᾱ +ᾱ + +ᾲ +ᾲ +ᾲ +ᾲ +ᾲ + +ᾳ +ᾳ +ᾳ +ᾳ +ᾳ + +ᾴ +ᾴ +ᾴ +ᾴ +ᾴ + +ᾶ +ᾶ +ᾶ +ᾶ +ᾶ + +ᾷ +ᾷ +ᾷ +ᾷ +ᾷ + +Ᾰ +Ᾰ +Ᾰ +Ᾰ +Ᾰ + +Ᾱ +Ᾱ +Ᾱ +Ᾱ +Ᾱ + +Ὰ +Ὰ +Ὰ +Ὰ +Ὰ + +Ά +Ά +Ά +Ά +Ά + +ᾼ +ᾼ +ᾼ +ᾼ +ᾼ + +᾽ +᾽ +᾽ + ̓ + ̓ + +ι +ι +ι +ι +ι + +᾿ +᾿ +᾿ + ̓ + ̓ + +῀ +῀ +῀ + ͂ + ͂ + +῁ +῁ +῁ + ̈͂ + ̈͂ + +ῂ +ῂ +ῂ +ῂ +ῂ + +ῃ +ῃ +ῃ +ῃ +ῃ + +ῄ +ῄ +ῄ +ῄ +ῄ + +ῆ +ῆ +ῆ +ῆ +ῆ + +ῇ +ῇ +ῇ +ῇ +ῇ + +Ὲ +Ὲ +Ὲ +Ὲ +Ὲ + +Έ +Έ +Έ +Έ +Έ + +Ὴ +Ὴ +Ὴ +Ὴ +Ὴ + +Ή +Ή +Ή +Ή +Ή + +ῌ +ῌ +ῌ +ῌ +ῌ + +῍ +῍ +῍ + ̓̀ + ̓̀ + +῎ +῎ +῎ + ̓́ + ̓́ + +῏ +῏ +῏ + ̓͂ + ̓͂ + +ῐ +ῐ +ῐ +ῐ +ῐ + +ῑ +ῑ +ῑ +ῑ +ῑ + +ῒ +ῒ +ῒ +ῒ +ῒ + +ΐ +ΐ +ΐ +ΐ +ΐ + +ῖ +ῖ +ῖ +ῖ +ῖ + +ῗ +ῗ +ῗ +ῗ +ῗ + +Ῐ +Ῐ +Ῐ +Ῐ +Ῐ + +Ῑ +Ῑ +Ῑ +Ῑ +Ῑ + +Ὶ +Ὶ +Ὶ +Ὶ +Ὶ + +Ί +Ί +Ί +Ί +Ί + +῝ +῝ +῝ + ̔̀ + ̔̀ + +῞ +῞ +῞ + ̔́ + ̔́ + +῟ +῟ +῟ + ̔͂ + ̔͂ + +ῠ +ῠ +ῠ +ῠ +ῠ + +ῡ +ῡ +ῡ +ῡ +ῡ + +ῢ +ῢ +ῢ +ῢ +ῢ + +ΰ +ΰ +ΰ +ΰ +ΰ + +ῤ +ῤ +ῤ +ῤ +ῤ + +ῥ +ῥ +ῥ +ῥ +ῥ + +ῦ +ῦ +ῦ +ῦ +ῦ + +ῧ +ῧ +ῧ +ῧ +ῧ + +Ῠ +Ῠ +Ῠ +Ῠ +Ῠ + +Ῡ +Ῡ +Ῡ +Ῡ +Ῡ + +Ὺ +Ὺ +Ὺ +Ὺ +Ὺ + +Ύ +Ύ +Ύ +Ύ +Ύ + +Ῥ +Ῥ +Ῥ +Ῥ +Ῥ + +῭ +῭ +῭ + ̈̀ + ̈̀ + +΅ +΅ +΅ + ̈́ + ̈́ + +` +` +` +` +` + +ῲ +ῲ +ῲ +ῲ +ῲ + +ῳ +ῳ +ῳ +ῳ +ῳ + +ῴ +ῴ +ῴ +ῴ +ῴ + +ῶ +ῶ +ῶ +ῶ +ῶ + +ῷ +ῷ +ῷ +ῷ +ῷ + +Ὸ +Ὸ +Ὸ +Ὸ +Ὸ + +Ό +Ό +Ό +Ό +Ό + +Ὼ +Ὼ +Ὼ +Ὼ +Ὼ + +Ώ +Ώ +Ώ +Ώ +Ώ + +ῼ +ῼ +ῼ +ῼ +ῼ + +´ +´ +´ + ́ + ́ + +῾ +῾ +῾ + ̔ + ̔ + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +  +  +  + + + +‑ +‑ +‑ +‐ +‐ + +‗ +‗ +‗ + ̳ + ̳ + +․ +․ +․ +. +. + +‥ +‥ +‥ +.. +.. + +… +… +… +... +... + +  +  +  + + + +″ +″ +″ +′′ +′′ + +‴ +‴ +‴ +′′′ +′′′ + +‶ +‶ +‶ +‵‵ +‵‵ + +‷ +‷ +‷ +‵‵‵ +‵‵‵ + +‼ +‼ +‼ +!! +!! + +‾ +‾ +‾ + ̅ + ̅ + +⁇ +⁇ +⁇ +?? +?? + +⁈ +⁈ +⁈ +?! +?! + +⁉ +⁉ +⁉ +!? +!? + +⁗ +⁗ +⁗ +′′′′ +′′′′ + +  +  +  + + + +⁰ +⁰ +⁰ +0 +0 + +ⁱ +ⁱ +ⁱ +i +i + +⁴ +⁴ +⁴ +4 +4 + +⁵ +⁵ +⁵ +5 +5 + +⁶ +⁶ +⁶ +6 +6 + +⁷ +⁷ +⁷ +7 +7 + +⁸ +⁸ +⁸ +8 +8 + +⁹ +⁹ +⁹ +9 +9 + +⁺ +⁺ +⁺ ++ ++ + +⁻ +⁻ +⁻ +− +− + +⁼ +⁼ +⁼ += += + +⁽ +⁽ +⁽ +( +( + +⁾ +⁾ +⁾ +) +) + +ⁿ +ⁿ +ⁿ +n +n + +₀ +₀ +₀ +0 +0 + +₁ +₁ +₁ +1 +1 + +₂ +₂ +₂ +2 +2 + +₃ +₃ +₃ +3 +3 + +₄ +₄ +₄ +4 +4 + +₅ +₅ +₅ +5 +5 + +₆ +₆ +₆ +6 +6 + +₇ +₇ +₇ +7 +7 + +₈ +₈ +₈ +8 +8 + +₉ +₉ +₉ +9 +9 + +₊ +₊ +₊ ++ ++ + +₋ +₋ +₋ +− +− + +₌ +₌ +₌ += += + +₍ +₍ +₍ +( +( + +₎ +₎ +₎ +) +) + +ₐ +ₐ +ₐ +a +a + +ₑ +ₑ +ₑ +e +e + +ₒ +ₒ +ₒ +o +o + +ₓ +ₓ +ₓ +x +x + +ₔ +ₔ +ₔ +ə +ə + +ₕ +ₕ +ₕ +h +h + +ₖ +ₖ +ₖ +k +k + +ₗ +ₗ +ₗ +l +l + +ₘ +ₘ +ₘ +m +m + +ₙ +ₙ +ₙ +n +n + +ₚ +ₚ +ₚ +p +p + +ₛ +ₛ +ₛ +s +s + +ₜ +ₜ +ₜ +t +t + +₨ +₨ +₨ +Rs +Rs + +℀ +℀ +℀ +a/c +a/c + +℁ +℁ +℁ +a/s +a/s + +ℂ +ℂ +ℂ +C +C + +℃ +℃ +℃ +°C +°C + +℅ +℅ +℅ +c/o +c/o + +℆ +℆ +℆ +c/u +c/u + +ℇ +ℇ +ℇ +Ɛ +Ɛ + +℉ +℉ +℉ +°F +°F + +ℊ +ℊ +ℊ +g +g + +ℋ +ℋ +ℋ +H +H + +ℌ +ℌ +ℌ +H +H + +ℍ +ℍ +ℍ +H +H + +ℎ +ℎ +ℎ +h +h + +ℏ +ℏ +ℏ +ħ +ħ + +ℐ +ℐ +ℐ +I +I + +ℑ +ℑ +ℑ +I +I + +ℒ +ℒ +ℒ +L +L + +ℓ +ℓ +ℓ +l +l + +ℕ +ℕ +ℕ +N +N + +№ +№ +№ +No +No + +ℙ +ℙ +ℙ +P +P + +ℚ +ℚ +ℚ +Q +Q + +ℛ +ℛ +ℛ +R +R + +ℜ +ℜ +ℜ +R +R + +ℝ +ℝ +ℝ +R +R + +℠ +℠ +℠ +SM +SM + +℡ +℡ +℡ +TEL +TEL + +™ +™ +™ +TM +TM + +ℤ +ℤ +ℤ +Z +Z + +Ω +Ω +Ω +Ω +Ω + +ℨ +ℨ +ℨ +Z +Z + +K +K +K +K +K + +Å +Å +Å +Å +Å + +ℬ +ℬ +ℬ +B +B + +ℭ +ℭ +ℭ +C +C + +ℯ +ℯ +ℯ +e +e + +ℰ +ℰ +ℰ +E +E + +ℱ +ℱ +ℱ +F +F + +ℳ +ℳ +ℳ +M +M + +ℴ +ℴ +ℴ +o +o + +ℵ +ℵ +ℵ +א +א + +ℶ +ℶ +ℶ +ב +ב + +ℷ +ℷ +ℷ +ג +ג + +ℸ +ℸ +ℸ +ד +ד + +ℹ +ℹ +ℹ +i +i + +℻ +℻ +℻ +FAX +FAX + +ℼ +ℼ +ℼ +π +π + +ℽ +ℽ +ℽ +γ +γ + +ℾ +ℾ +ℾ +Γ +Γ + +ℿ +ℿ +ℿ +Π +Π + +⅀ +⅀ +⅀ +∑ +∑ + +ⅅ +ⅅ +ⅅ +D +D + +ⅆ +ⅆ +ⅆ +d +d + +ⅇ +ⅇ +ⅇ +e +e + +ⅈ +ⅈ +ⅈ +i +i + +ⅉ +ⅉ +ⅉ +j +j + +⅐ +⅐ +⅐ +1⁄7 +1⁄7 + +⅑ +⅑ +⅑ +1⁄9 +1⁄9 + +⅒ +⅒ +⅒ +1⁄10 +1⁄10 + +⅓ +⅓ +⅓ +1⁄3 +1⁄3 + +⅔ +⅔ +⅔ +2⁄3 +2⁄3 + +⅕ +⅕ +⅕ +1⁄5 +1⁄5 + +⅖ +⅖ +⅖ +2⁄5 +2⁄5 + +⅗ +⅗ +⅗ +3⁄5 +3⁄5 + +⅘ +⅘ +⅘ +4⁄5 +4⁄5 + +⅙ +⅙ +⅙ +1⁄6 +1⁄6 + +⅚ +⅚ +⅚ +5⁄6 +5⁄6 + +⅛ +⅛ +⅛ +1⁄8 +1⁄8 + +⅜ +⅜ +⅜ +3⁄8 +3⁄8 + +⅝ +⅝ +⅝ +5⁄8 +5⁄8 + +⅞ +⅞ +⅞ +7⁄8 +7⁄8 + +⅟ +⅟ +⅟ +1⁄ +1⁄ + +Ⅰ +Ⅰ +Ⅰ +I +I + +Ⅱ +Ⅱ +Ⅱ +II +II + +Ⅲ +Ⅲ +Ⅲ +III +III + +Ⅳ +Ⅳ +Ⅳ +IV +IV + +Ⅴ +Ⅴ +Ⅴ +V +V + +Ⅵ +Ⅵ +Ⅵ +VI +VI + +Ⅶ +Ⅶ +Ⅶ +VII +VII + +Ⅷ +Ⅷ +Ⅷ +VIII +VIII + +Ⅸ +Ⅸ +Ⅸ +IX +IX + +Ⅹ +Ⅹ +Ⅹ +X +X + +Ⅺ +Ⅺ +Ⅺ +XI +XI + +Ⅻ +Ⅻ +Ⅻ +XII +XII + +Ⅼ +Ⅼ +Ⅼ +L +L + +Ⅽ +Ⅽ +Ⅽ +C +C + +Ⅾ +Ⅾ +Ⅾ +D +D + +Ⅿ +Ⅿ +Ⅿ +M +M + +ⅰ +ⅰ +ⅰ +i +i + +ⅱ +ⅱ +ⅱ +ii +ii + +ⅲ +ⅲ +ⅲ +iii +iii + +ⅳ +ⅳ +ⅳ +iv +iv + +ⅴ +ⅴ +ⅴ +v +v + +ⅵ +ⅵ +ⅵ +vi +vi + +ⅶ +ⅶ +ⅶ +vii +vii + +ⅷ +ⅷ +ⅷ +viii +viii + +ⅸ +ⅸ +ⅸ +ix +ix + +ⅹ +ⅹ +ⅹ +x +x + +ⅺ +ⅺ +ⅺ +xi +xi + +ⅻ +ⅻ +ⅻ +xii +xii + +ⅼ +ⅼ +ⅼ +l +l + +ⅽ +ⅽ +ⅽ +c +c + +ⅾ +ⅾ +ⅾ +d +d + +ⅿ +ⅿ +ⅿ +m +m + +↉ +↉ +↉ +0⁄3 +0⁄3 + +↚ +↚ +↚ +↚ +↚ + +↛ +↛ +↛ +↛ +↛ + +↮ +↮ +↮ +↮ +↮ + +⇍ +⇍ +⇍ +⇍ +⇍ + +⇎ +⇎ +⇎ +⇎ +⇎ + +⇏ +⇏ +⇏ +⇏ +⇏ + +∄ +∄ +∄ +∄ +∄ + +∉ +∉ +∉ +∉ +∉ + +∌ +∌ +∌ +∌ +∌ + +∤ +∤ +∤ +∤ +∤ + +∦ +∦ +∦ +∦ +∦ + +∬ +∬ +∬ +∫∫ +∫∫ + +∭ +∭ +∭ +∫∫∫ +∫∫∫ + +∯ +∯ +∯ +∮∮ +∮∮ + +∰ +∰ +∰ +∮∮∮ +∮∮∮ + +≁ +≁ +≁ +≁ +≁ + +≄ +≄ +≄ +≄ +≄ + +≇ +≇ +≇ +≇ +≇ + +≉ +≉ +≉ +≉ +≉ + +≠ +≠ +≠ +≠ +≠ + +≢ +≢ +≢ +≢ +≢ + +≭ +≭ +≭ +≭ +≭ + +≮ +≮ +≮ +≮ +≮ + +≯ +≯ +≯ +≯ +≯ + +≰ +≰ +≰ +≰ +≰ + +≱ +≱ +≱ +≱ +≱ + +≴ +≴ +≴ +≴ +≴ + +≵ +≵ +≵ +≵ +≵ + +≸ +≸ +≸ +≸ +≸ + +≹ +≹ +≹ +≹ +≹ + +⊀ +⊀ +⊀ +⊀ +⊀ + +⊁ +⊁ +⊁ +⊁ +⊁ + +⊄ +⊄ +⊄ +⊄ +⊄ + +⊅ +⊅ +⊅ +⊅ +⊅ + +⊈ +⊈ +⊈ +⊈ +⊈ + +⊉ +⊉ +⊉ +⊉ +⊉ + +⊬ +⊬ +⊬ +⊬ +⊬ + +⊭ +⊭ +⊭ +⊭ +⊭ + +⊮ +⊮ +⊮ +⊮ +⊮ + +⊯ +⊯ +⊯ +⊯ +⊯ + +⋠ +⋠ +⋠ +⋠ +⋠ + +⋡ +⋡ +⋡ +⋡ +⋡ + +⋢ +⋢ +⋢ +⋢ +⋢ + +⋣ +⋣ +⋣ +⋣ +⋣ + +⋪ +⋪ +⋪ +⋪ +⋪ + +⋫ +⋫ +⋫ +⋫ +⋫ + +⋬ +⋬ +⋬ +⋬ +⋬ + +⋭ +⋭ +⋭ +⋭ +⋭ + +〈 +〈 +〈 +〈 +〈 + +〉 +〉 +〉 +〉 +〉 + +① +① +① +1 +1 + +② +② +② +2 +2 + +③ +③ +③ +3 +3 + +④ +④ +④ +4 +4 + +⑤ +⑤ +⑤ +5 +5 + +⑥ +⑥ +⑥ +6 +6 + +⑦ +⑦ +⑦ +7 +7 + +⑧ +⑧ +⑧ +8 +8 + +⑨ +⑨ +⑨ +9 +9 + +⑩ +⑩ +⑩ +10 +10 + +⑪ +⑪ +⑪ +11 +11 + +⑫ +⑫ +⑫ +12 +12 + +⑬ +⑬ +⑬ +13 +13 + +⑭ +⑭ +⑭ +14 +14 + +⑮ +⑮ +⑮ +15 +15 + +⑯ +⑯ +⑯ +16 +16 + +⑰ +⑰ +⑰ +17 +17 + +⑱ +⑱ +⑱ +18 +18 + +⑲ +⑲ +⑲ +19 +19 + +⑳ +⑳ +⑳ +20 +20 + +⑴ +⑴ +⑴ +(1) +(1) + +⑵ +⑵ +⑵ +(2) +(2) + +⑶ +⑶ +⑶ +(3) +(3) + +⑷ +⑷ +⑷ +(4) +(4) + +⑸ +⑸ +⑸ +(5) +(5) + +⑹ +⑹ +⑹ +(6) +(6) + +⑺ +⑺ +⑺ +(7) +(7) + +⑻ +⑻ +⑻ +(8) +(8) + +⑼ +⑼ +⑼ +(9) +(9) + +⑽ +⑽ +⑽ +(10) +(10) + +⑾ +⑾ +⑾ +(11) +(11) + +⑿ +⑿ +⑿ +(12) +(12) + +⒀ +⒀ +⒀ +(13) +(13) + +⒁ +⒁ +⒁ +(14) +(14) + +⒂ +⒂ +⒂ +(15) +(15) + +⒃ +⒃ +⒃ +(16) +(16) + +⒄ +⒄ +⒄ +(17) +(17) + +⒅ +⒅ +⒅ +(18) +(18) + +⒆ +⒆ +⒆ +(19) +(19) + +⒇ +⒇ +⒇ +(20) +(20) + +⒈ +⒈ +⒈ +1. +1. + +⒉ +⒉ +⒉ +2. +2. + +⒊ +⒊ +⒊ +3. +3. + +⒋ +⒋ +⒋ +4. +4. + +⒌ +⒌ +⒌ +5. +5. + +⒍ +⒍ +⒍ +6. +6. + +⒎ +⒎ +⒎ +7. +7. + +⒏ +⒏ +⒏ +8. +8. + +⒐ +⒐ +⒐ +9. +9. + +⒑ +⒑ +⒑ +10. +10. + +⒒ +⒒ +⒒ +11. +11. + +⒓ +⒓ +⒓ +12. +12. + +⒔ +⒔ +⒔ +13. +13. + +⒕ +⒕ +⒕ +14. +14. + +⒖ +⒖ +⒖ +15. +15. + +⒗ +⒗ +⒗ +16. +16. + +⒘ +⒘ +⒘ +17. +17. + +⒙ +⒙ +⒙ +18. +18. + +⒚ +⒚ +⒚ +19. +19. + +⒛ +⒛ +⒛ +20. +20. + +⒜ +⒜ +⒜ +(a) +(a) + +⒝ +⒝ +⒝ +(b) +(b) + +⒞ +⒞ +⒞ +(c) +(c) + +⒟ +⒟ +⒟ +(d) +(d) + +⒠ +⒠ +⒠ +(e) +(e) + +⒡ +⒡ +⒡ +(f) +(f) + +⒢ +⒢ +⒢ +(g) +(g) + +⒣ +⒣ +⒣ +(h) +(h) + +⒤ +⒤ +⒤ +(i) +(i) + +⒥ +⒥ +⒥ +(j) +(j) + +⒦ +⒦ +⒦ +(k) +(k) + +⒧ +⒧ +⒧ +(l) +(l) + +⒨ +⒨ +⒨ +(m) +(m) + +⒩ +⒩ +⒩ +(n) +(n) + +⒪ +⒪ +⒪ +(o) +(o) + +⒫ +⒫ +⒫ +(p) +(p) + +⒬ +⒬ +⒬ +(q) +(q) + +⒭ +⒭ +⒭ +(r) +(r) + +⒮ +⒮ +⒮ +(s) +(s) + +⒯ +⒯ +⒯ +(t) +(t) + +⒰ +⒰ +⒰ +(u) +(u) + +⒱ +⒱ +⒱ +(v) +(v) + +⒲ +⒲ +⒲ +(w) +(w) + +⒳ +⒳ +⒳ +(x) +(x) + +⒴ +⒴ +⒴ +(y) +(y) + +⒵ +⒵ +⒵ +(z) +(z) + +Ⓐ +Ⓐ +Ⓐ +A +A + +Ⓑ +Ⓑ +Ⓑ +B +B + +Ⓒ +Ⓒ +Ⓒ +C +C + +Ⓓ +Ⓓ +Ⓓ +D +D + +Ⓔ +Ⓔ +Ⓔ +E +E + +Ⓕ +Ⓕ +Ⓕ +F +F + +Ⓖ +Ⓖ +Ⓖ +G +G + +Ⓗ +Ⓗ +Ⓗ +H +H + +Ⓘ +Ⓘ +Ⓘ +I +I + +Ⓙ +Ⓙ +Ⓙ +J +J + +Ⓚ +Ⓚ +Ⓚ +K +K + +Ⓛ +Ⓛ +Ⓛ +L +L + +Ⓜ +Ⓜ +Ⓜ +M +M + +Ⓝ +Ⓝ +Ⓝ +N +N + +Ⓞ +Ⓞ +Ⓞ +O +O + +Ⓟ +Ⓟ +Ⓟ +P +P + +Ⓠ +Ⓠ +Ⓠ +Q +Q + +Ⓡ +Ⓡ +Ⓡ +R +R + +Ⓢ +Ⓢ +Ⓢ +S +S + +Ⓣ +Ⓣ +Ⓣ +T +T + +Ⓤ +Ⓤ +Ⓤ +U +U + +Ⓥ +Ⓥ +Ⓥ +V +V + +Ⓦ +Ⓦ +Ⓦ +W +W + +Ⓧ +Ⓧ +Ⓧ +X +X + +Ⓨ +Ⓨ +Ⓨ +Y +Y + +Ⓩ +Ⓩ +Ⓩ +Z +Z + +ⓐ +ⓐ +ⓐ +a +a + +ⓑ +ⓑ +ⓑ +b +b + +ⓒ +ⓒ +ⓒ +c +c + +ⓓ +ⓓ +ⓓ +d +d + +ⓔ +ⓔ +ⓔ +e +e + +ⓕ +ⓕ +ⓕ +f +f + +ⓖ +ⓖ +ⓖ +g +g + +ⓗ +ⓗ +ⓗ +h +h + +ⓘ +ⓘ +ⓘ +i +i + +ⓙ +ⓙ +ⓙ +j +j + +ⓚ +ⓚ +ⓚ +k +k + +ⓛ +ⓛ +ⓛ +l +l + +ⓜ +ⓜ +ⓜ +m +m + +ⓝ +ⓝ +ⓝ +n +n + +ⓞ +ⓞ +ⓞ +o +o + +ⓟ +ⓟ +ⓟ +p +p + +ⓠ +ⓠ +ⓠ +q +q + +ⓡ +ⓡ +ⓡ +r +r + +ⓢ +ⓢ +ⓢ +s +s + +ⓣ +ⓣ +ⓣ +t +t + +ⓤ +ⓤ +ⓤ +u +u + +ⓥ +ⓥ +ⓥ +v +v + +ⓦ +ⓦ +ⓦ +w +w + +ⓧ +ⓧ +ⓧ +x +x + +ⓨ +ⓨ +ⓨ +y +y + +ⓩ +ⓩ +ⓩ +z +z + +⓪ +⓪ +⓪ +0 +0 + +⨌ +⨌ +⨌ +∫∫∫∫ +∫∫∫∫ + +⩴ +⩴ +⩴ +::= +::= + +⩵ +⩵ +⩵ +== +== + +⩶ +⩶ +⩶ +=== +=== + +⫝̸ +⫝̸ +⫝̸ +⫝̸ +⫝̸ + +ⱼ +ⱼ +ⱼ +j +j + +ⱽ +ⱽ +ⱽ +V +V + +ⵯ +ⵯ +ⵯ +ⵡ +ⵡ + +⺟ +⺟ +⺟ +母 +母 + +⻳ +⻳ +⻳ +龟 +龟 + +⼀ +⼀ +⼀ +一 +一 + +⼁ +⼁ +⼁ +丨 +丨 + +⼂ +⼂ +⼂ +丶 +丶 + +⼃ +⼃ +⼃ +丿 +丿 + +⼄ +⼄ +⼄ +乙 +乙 + +⼅ +⼅ +⼅ +亅 +亅 + +⼆ +⼆ +⼆ +二 +二 + +⼇ +⼇ +⼇ +亠 +亠 + +⼈ +⼈ +⼈ +人 +人 + +⼉ +⼉ +⼉ +儿 +儿 + +⼊ +⼊ +⼊ +入 +入 + +⼋ +⼋ +⼋ +八 +八 + +⼌ +⼌ +⼌ +冂 +冂 + +⼍ +⼍ +⼍ +冖 +冖 + +⼎ +⼎ +⼎ +冫 +冫 + +⼏ +⼏ +⼏ +几 +几 + +⼐ +⼐ +⼐ +凵 +凵 + +⼑ +⼑ +⼑ +刀 +刀 + +⼒ +⼒ +⼒ +力 +力 + +⼓ +⼓ +⼓ +勹 +勹 + +⼔ +⼔ +⼔ +匕 +匕 + +⼕ +⼕ +⼕ +匚 +匚 + +⼖ +⼖ +⼖ +匸 +匸 + +⼗ +⼗ +⼗ +十 +十 + +⼘ +⼘ +⼘ +卜 +卜 + +⼙ +⼙ +⼙ +卩 +卩 + +⼚ +⼚ +⼚ +厂 +厂 + +⼛ +⼛ +⼛ +厶 +厶 + +⼜ +⼜ +⼜ +又 +又 + +⼝ +⼝ +⼝ +口 +口 + +⼞ +⼞ +⼞ +囗 +囗 + +⼟ +⼟ +⼟ +土 +土 + +⼠ +⼠ +⼠ +士 +士 + +⼡ +⼡ +⼡ +夂 +夂 + +⼢ +⼢ +⼢ +夊 +夊 + +⼣ +⼣ +⼣ +夕 +夕 + +⼤ +⼤ +⼤ +大 +大 + +⼥ +⼥ +⼥ +女 +女 + +⼦ +⼦ +⼦ +子 +子 + +⼧ +⼧ +⼧ +宀 +宀 + +⼨ +⼨ +⼨ +寸 +寸 + +⼩ +⼩ +⼩ +小 +小 + +⼪ +⼪ +⼪ +尢 +尢 + +⼫ +⼫ +⼫ +尸 +尸 + +⼬ +⼬ +⼬ +屮 +屮 + +⼭ +⼭ +⼭ +山 +山 + +⼮ +⼮ +⼮ +巛 +巛 + +⼯ +⼯ +⼯ +工 +工 + +⼰ +⼰ +⼰ +己 +己 + +⼱ +⼱ +⼱ +巾 +巾 + +⼲ +⼲ +⼲ +干 +干 + +⼳ +⼳ +⼳ +幺 +幺 + +⼴ +⼴ +⼴ +广 +广 + +⼵ +⼵ +⼵ +廴 +廴 + +⼶ +⼶ +⼶ +廾 +廾 + +⼷ +⼷ +⼷ +弋 +弋 + +⼸ +⼸ +⼸ +弓 +弓 + +⼹ +⼹ +⼹ +彐 +彐 + +⼺ +⼺ +⼺ +彡 +彡 + +⼻ +⼻ +⼻ +彳 +彳 + +⼼ +⼼ +⼼ +心 +心 + +⼽ +⼽ +⼽ +戈 +戈 + +⼾ +⼾ +⼾ +戶 +戶 + +⼿ +⼿ +⼿ +手 +手 + +⽀ +⽀ +⽀ +支 +支 + +⽁ +⽁ +⽁ +攴 +攴 + +⽂ +⽂ +⽂ +文 +文 + +⽃ +⽃ +⽃ +斗 +斗 + +⽄ +⽄ +⽄ +斤 +斤 + +⽅ +⽅ +⽅ +方 +方 + +⽆ +⽆ +⽆ +无 +无 + +⽇ +⽇ +⽇ +日 +日 + +⽈ +⽈ +⽈ +曰 +曰 + +⽉ +⽉ +⽉ +月 +月 + +⽊ +⽊ +⽊ +木 +木 + +⽋ +⽋ +⽋ +欠 +欠 + +⽌ +⽌ +⽌ +止 +止 + +⽍ +⽍ +⽍ +歹 +歹 + +⽎ +⽎ +⽎ +殳 +殳 + +⽏ +⽏ +⽏ +毋 +毋 + +⽐ +⽐ +⽐ +比 +比 + +⽑ +⽑ +⽑ +毛 +毛 + +⽒ +⽒ +⽒ +氏 +氏 + +⽓ +⽓ +⽓ +气 +气 + +⽔ +⽔ +⽔ +水 +水 + +⽕ +⽕ +⽕ +火 +火 + +⽖ +⽖ +⽖ +爪 +爪 + +⽗ +⽗ +⽗ +父 +父 + +⽘ +⽘ +⽘ +爻 +爻 + +⽙ +⽙ +⽙ +爿 +爿 + +⽚ +⽚ +⽚ +片 +片 + +⽛ +⽛ +⽛ +牙 +牙 + +⽜ +⽜ +⽜ +牛 +牛 + +⽝ +⽝ +⽝ +犬 +犬 + +⽞ +⽞ +⽞ +玄 +玄 + +⽟ +⽟ +⽟ +玉 +玉 + +⽠ +⽠ +⽠ +瓜 +瓜 + +⽡ +⽡ +⽡ +瓦 +瓦 + +⽢ +⽢ +⽢ +甘 +甘 + +⽣ +⽣ +⽣ +生 +生 + +⽤ +⽤ +⽤ +用 +用 + +⽥ +⽥ +⽥ +田 +田 + +⽦ +⽦ +⽦ +疋 +疋 + +⽧ +⽧ +⽧ +疒 +疒 + +⽨ +⽨ +⽨ +癶 +癶 + +⽩ +⽩ +⽩ +白 +白 + +⽪ +⽪ +⽪ +皮 +皮 + +⽫ +⽫ +⽫ +皿 +皿 + +⽬ +⽬ +⽬ +目 +目 + +⽭ +⽭ +⽭ +矛 +矛 + +⽮ +⽮ +⽮ +矢 +矢 + +⽯ +⽯ +⽯ +石 +石 + +⽰ +⽰ +⽰ +示 +示 + +⽱ +⽱ +⽱ +禸 +禸 + +⽲ +⽲ +⽲ +禾 +禾 + +⽳ +⽳ +⽳ +穴 +穴 + +⽴ +⽴ +⽴ +立 +立 + +⽵ +⽵ +⽵ +竹 +竹 + +⽶ +⽶ +⽶ +米 +米 + +⽷ +⽷ +⽷ +糸 +糸 + +⽸ +⽸ +⽸ +缶 +缶 + +⽹ +⽹ +⽹ +网 +网 + +⽺ +⽺ +⽺ +羊 +羊 + +⽻ +⽻ +⽻ +羽 +羽 + +⽼ +⽼ +⽼ +老 +老 + +⽽ +⽽ +⽽ +而 +而 + +⽾ +⽾ +⽾ +耒 +耒 + +⽿ +⽿ +⽿ +耳 +耳 + +⾀ +⾀ +⾀ +聿 +聿 + +⾁ +⾁ +⾁ +肉 +肉 + +⾂ +⾂ +⾂ +臣 +臣 + +⾃ +⾃ +⾃ +自 +自 + +⾄ +⾄ +⾄ +至 +至 + +⾅ +⾅ +⾅ +臼 +臼 + +⾆ +⾆ +⾆ +舌 +舌 + +⾇ +⾇ +⾇ +舛 +舛 + +⾈ +⾈ +⾈ +舟 +舟 + +⾉ +⾉ +⾉ +艮 +艮 + +⾊ +⾊ +⾊ +色 +色 + +⾋ +⾋ +⾋ +艸 +艸 + +⾌ +⾌ +⾌ +虍 +虍 + +⾍ +⾍ +⾍ +虫 +虫 + +⾎ +⾎ +⾎ +血 +血 + +⾏ +⾏ +⾏ +行 +行 + +⾐ +⾐ +⾐ +衣 +衣 + +⾑ +⾑ +⾑ +襾 +襾 + +⾒ +⾒ +⾒ +見 +見 + +⾓ +⾓ +⾓ +角 +角 + +⾔ +⾔ +⾔ +言 +言 + +⾕ +⾕ +⾕ +谷 +谷 + +⾖ +⾖ +⾖ +豆 +豆 + +⾗ +⾗ +⾗ +豕 +豕 + +⾘ +⾘ +⾘ +豸 +豸 + +⾙ +⾙ +⾙ +貝 +貝 + +⾚ +⾚ +⾚ +赤 +赤 + +⾛ +⾛ +⾛ +走 +走 + +⾜ +⾜ +⾜ +足 +足 + +⾝ +⾝ +⾝ +身 +身 + +⾞ +⾞ +⾞ +車 +車 + +⾟ +⾟ +⾟ +辛 +辛 + +⾠ +⾠ +⾠ +辰 +辰 + +⾡ +⾡ +⾡ +辵 +辵 + +⾢ +⾢ +⾢ +邑 +邑 + +⾣ +⾣ +⾣ +酉 +酉 + +⾤ +⾤ +⾤ +釆 +釆 + +⾥ +⾥ +⾥ +里 +里 + +⾦ +⾦ +⾦ +金 +金 + +⾧ +⾧ +⾧ +長 +長 + +⾨ +⾨ +⾨ +門 +門 + +⾩ +⾩ +⾩ +阜 +阜 + +⾪ +⾪ +⾪ +隶 +隶 + +⾫ +⾫ +⾫ +隹 +隹 + +⾬ +⾬ +⾬ +雨 +雨 + +⾭ +⾭ +⾭ +靑 +靑 + +⾮ +⾮ +⾮ +非 +非 + +⾯ +⾯ +⾯ +面 +面 + +⾰ +⾰ +⾰ +革 +革 + +⾱ +⾱ +⾱ +韋 +韋 + +⾲ +⾲ +⾲ +韭 +韭 + +⾳ +⾳ +⾳ +音 +音 + +⾴ +⾴ +⾴ +頁 +頁 + +⾵ +⾵ +⾵ +風 +風 + +⾶ +⾶ +⾶ +飛 +飛 + +⾷ +⾷ +⾷ +食 +食 + +⾸ +⾸ +⾸ +首 +首 + +⾹ +⾹ +⾹ +香 +香 + +⾺ +⾺ +⾺ +馬 +馬 + +⾻ +⾻ +⾻ +骨 +骨 + +⾼ +⾼ +⾼ +高 +高 + +⾽ +⾽ +⾽ +髟 +髟 + +⾾ +⾾ +⾾ +鬥 +鬥 + +⾿ +⾿ +⾿ +鬯 +鬯 + +⿀ +⿀ +⿀ +鬲 +鬲 + +⿁ +⿁ +⿁ +鬼 +鬼 + +⿂ +⿂ +⿂ +魚 +魚 + +⿃ +⿃ +⿃ +鳥 +鳥 + +⿄ +⿄ +⿄ +鹵 +鹵 + +⿅ +⿅ +⿅ +鹿 +鹿 + +⿆ +⿆ +⿆ +麥 +麥 + +⿇ +⿇ +⿇ +麻 +麻 + +⿈ +⿈ +⿈ +黃 +黃 + +⿉ +⿉ +⿉ +黍 +黍 + +⿊ +⿊ +⿊ +黑 +黑 + +⿋ +⿋ +⿋ +黹 +黹 + +⿌ +⿌ +⿌ +黽 +黽 + +⿍ +⿍ +⿍ +鼎 +鼎 + +⿎ +⿎ +⿎ +鼓 +鼓 + +⿏ +⿏ +⿏ +鼠 +鼠 + +⿐ +⿐ +⿐ +鼻 +鼻 + +⿑ +⿑ +⿑ +齊 +齊 + +⿒ +⿒ +⿒ +齒 +齒 + +⿓ +⿓ +⿓ +龍 +龍 + +⿔ +⿔ +⿔ +龜 +龜 + +⿕ +⿕ +⿕ +龠 +龠 + +  +  +  + + + +〶 +〶 +〶 +〒 +〒 + +〸 +〸 +〸 +十 +十 + +〹 +〹 +〹 +卄 +卄 + +〺 +〺 +〺 +卅 +卅 + +が +が +が +が +が + +ぎ +ぎ +ぎ +ぎ +ぎ + +ぐ +ぐ +ぐ +ぐ +ぐ + +げ +げ +げ +げ +げ + +ご +ご +ご +ご +ご + +ざ +ざ +ざ +ざ +ざ + +じ +じ +じ +じ +じ + +ず +ず +ず +ず +ず + +ぜ +ぜ +ぜ +ぜ +ぜ + +ぞ +ぞ +ぞ +ぞ +ぞ + +だ +だ +だ +だ +だ + +ぢ +ぢ +ぢ +ぢ +ぢ + +づ +づ +づ +づ +づ + +で +で +で +で +で + +ど +ど +ど +ど +ど + +ば +ば +ば +ば +ば + +ぱ +ぱ +ぱ +ぱ +ぱ + +び +び +び +び +び + +ぴ +ぴ +ぴ +ぴ +ぴ + +ぶ +ぶ +ぶ +ぶ +ぶ + +ぷ +ぷ +ぷ +ぷ +ぷ + +べ +べ +べ +べ +べ + +ぺ +ぺ +ぺ +ぺ +ぺ + +ぼ +ぼ +ぼ +ぼ +ぼ + +ぽ +ぽ +ぽ +ぽ +ぽ + +ゔ +ゔ +ゔ +ゔ +ゔ + +゛ +゛ +゛ + ゙ + ゙ + +゜ +゜ +゜ + ゚ + ゚ + +ゞ +ゞ +ゞ +ゞ +ゞ + +ゟ +ゟ +ゟ +より +より + +ガ +ガ +ガ +ガ +ガ + +ギ +ギ +ギ +ギ +ギ + +グ +グ +グ +グ +グ + +ゲ +ゲ +ゲ +ゲ +ゲ + +ゴ +ゴ +ゴ +ゴ +ゴ + +ザ +ザ +ザ +ザ +ザ + +ジ +ジ +ジ +ジ +ジ + +ズ +ズ +ズ +ズ +ズ + +ゼ +ゼ +ゼ +ゼ +ゼ + +ゾ +ゾ +ゾ +ゾ +ゾ + +ダ +ダ +ダ +ダ +ダ + +ヂ +ヂ +ヂ +ヂ +ヂ + +ヅ +ヅ +ヅ +ヅ +ヅ + +デ +デ +デ +デ +デ + +ド +ド +ド +ド +ド + +バ +バ +バ +バ +バ + +パ +パ +パ +パ +パ + +ビ +ビ +ビ +ビ +ビ + +ピ +ピ +ピ +ピ +ピ + +ブ +ブ +ブ +ブ +ブ + +プ +プ +プ +プ +プ + +ベ +ベ +ベ +ベ +ベ + +ペ +ペ +ペ +ペ +ペ + +ボ +ボ +ボ +ボ +ボ + +ポ +ポ +ポ +ポ +ポ + +ヴ +ヴ +ヴ +ヴ +ヴ + +ヷ +ヷ +ヷ +ヷ +ヷ + +ヸ +ヸ +ヸ +ヸ +ヸ + +ヹ +ヹ +ヹ +ヹ +ヹ + +ヺ +ヺ +ヺ +ヺ +ヺ + +ヾ +ヾ +ヾ +ヾ +ヾ + +ヿ +ヿ +ヿ +コト +コト + +ㄱ +ㄱ +ㄱ +ᄀ +ᄀ + +ㄲ +ㄲ +ㄲ +ᄁ +ᄁ + +ㄳ +ㄳ +ㄳ +ᆪ +ᆪ + +ㄴ +ㄴ +ㄴ +ᄂ +ᄂ + +ㄵ +ㄵ +ㄵ +ᆬ +ᆬ + +ㄶ +ㄶ +ㄶ +ᆭ +ᆭ + +ㄷ +ㄷ +ㄷ +ᄃ +ᄃ + +ㄸ +ㄸ +ㄸ +ᄄ +ᄄ + +ㄹ +ㄹ +ㄹ +ᄅ +ᄅ + +ㄺ +ㄺ +ㄺ +ᆰ +ᆰ + +ㄻ +ㄻ +ㄻ +ᆱ +ᆱ + +ㄼ +ㄼ +ㄼ +ᆲ +ᆲ + +ㄽ +ㄽ +ㄽ +ᆳ +ᆳ + +ㄾ +ㄾ +ㄾ +ᆴ +ᆴ + +ㄿ +ㄿ +ㄿ +ᆵ +ᆵ + +ㅀ +ㅀ +ㅀ +ᄚ +ᄚ + +ㅁ +ㅁ +ㅁ +ᄆ +ᄆ + +ㅂ +ㅂ +ㅂ +ᄇ +ᄇ + +ㅃ +ㅃ +ㅃ +ᄈ +ᄈ + +ㅄ +ㅄ +ㅄ +ᄡ +ᄡ + +ㅅ +ㅅ +ㅅ +ᄉ +ᄉ + +ㅆ +ㅆ +ㅆ +ᄊ +ᄊ + +ㅇ +ㅇ +ㅇ +ᄋ +ᄋ + +ㅈ +ㅈ +ㅈ +ᄌ +ᄌ + +ㅉ +ㅉ +ㅉ +ᄍ +ᄍ + +ㅊ +ㅊ +ㅊ +ᄎ +ᄎ + +ㅋ +ㅋ +ㅋ +ᄏ +ᄏ + +ㅌ +ㅌ +ㅌ +ᄐ +ᄐ + +ㅍ +ㅍ +ㅍ +ᄑ +ᄑ + +ㅎ +ㅎ +ㅎ +ᄒ +ᄒ + +ㅏ +ㅏ +ㅏ +ᅡ +ᅡ + +ㅐ +ㅐ +ㅐ +ᅢ +ᅢ + +ㅑ +ㅑ +ㅑ +ᅣ +ᅣ + +ㅒ +ㅒ +ㅒ +ᅤ +ᅤ + +ㅓ +ㅓ +ㅓ +ᅥ +ᅥ + +ㅔ +ㅔ +ㅔ +ᅦ +ᅦ + +ㅕ +ㅕ +ㅕ +ᅧ +ᅧ + +ㅖ +ㅖ +ㅖ +ᅨ +ᅨ + +ㅗ +ㅗ +ㅗ +ᅩ +ᅩ + +ㅘ +ㅘ +ㅘ +ᅪ +ᅪ + +ㅙ +ㅙ +ㅙ +ᅫ +ᅫ + +ㅚ +ㅚ +ㅚ +ᅬ +ᅬ + +ㅛ +ㅛ +ㅛ +ᅭ +ᅭ + +ㅜ +ㅜ +ㅜ +ᅮ +ᅮ + +ㅝ +ㅝ +ㅝ +ᅯ +ᅯ + +ㅞ +ㅞ +ㅞ +ᅰ +ᅰ + +ㅟ +ㅟ +ㅟ +ᅱ +ᅱ + +ㅠ +ㅠ +ㅠ +ᅲ +ᅲ + +ㅡ +ㅡ +ㅡ +ᅳ +ᅳ + +ㅢ +ㅢ +ㅢ +ᅴ +ᅴ + +ㅣ +ㅣ +ㅣ +ᅵ +ᅵ + +ㅤ +ㅤ +ㅤ +ᅠ +ᅠ + +ㅥ +ㅥ +ㅥ +ᄔ +ᄔ + +ㅦ +ㅦ +ㅦ +ᄕ +ᄕ + +ㅧ +ㅧ +ㅧ +ᇇ +ᇇ + +ㅨ +ㅨ +ㅨ +ᇈ +ᇈ + +ㅩ +ㅩ +ㅩ +ᇌ +ᇌ + +ㅪ +ㅪ +ㅪ +ᇎ +ᇎ + +ㅫ +ㅫ +ㅫ +ᇓ +ᇓ + +ㅬ +ㅬ +ㅬ +ᇗ +ᇗ + +ㅭ +ㅭ +ㅭ +ᇙ +ᇙ + +ㅮ +ㅮ +ㅮ +ᄜ +ᄜ + +ㅯ +ㅯ +ㅯ +ᇝ +ᇝ + +ㅰ +ㅰ +ㅰ +ᇟ +ᇟ + +ㅱ +ㅱ +ㅱ +ᄝ +ᄝ + +ㅲ +ㅲ +ㅲ +ᄞ +ᄞ + +ㅳ +ㅳ +ㅳ +ᄠ +ᄠ + +ㅴ +ㅴ +ㅴ +ᄢ +ᄢ + +ㅵ +ㅵ +ㅵ +ᄣ +ᄣ + +ㅶ +ㅶ +ㅶ +ᄧ +ᄧ + +ㅷ +ㅷ +ㅷ +ᄩ +ᄩ + +ㅸ +ㅸ +ㅸ +ᄫ +ᄫ + +ㅹ +ㅹ +ㅹ +ᄬ +ᄬ + +ㅺ +ㅺ +ㅺ +ᄭ +ᄭ + +ㅻ +ㅻ +ㅻ +ᄮ +ᄮ + +ㅼ +ㅼ +ㅼ +ᄯ +ᄯ + +ㅽ +ㅽ +ㅽ +ᄲ +ᄲ + +ㅾ +ㅾ +ㅾ +ᄶ +ᄶ + +ㅿ +ㅿ +ㅿ +ᅀ +ᅀ + +ㆀ +ㆀ +ㆀ +ᅇ +ᅇ + +ㆁ +ㆁ +ㆁ +ᅌ +ᅌ + +ㆂ +ㆂ +ㆂ +ᇱ +ᇱ + +ㆃ +ㆃ +ㆃ +ᇲ +ᇲ + +ㆄ +ㆄ +ㆄ +ᅗ +ᅗ + +ㆅ +ㆅ +ㆅ +ᅘ +ᅘ + +ㆆ +ㆆ +ㆆ +ᅙ +ᅙ + +ㆇ +ㆇ +ㆇ +ᆄ +ᆄ + +ㆈ +ㆈ +ㆈ +ᆅ +ᆅ + +ㆉ +ㆉ +ㆉ +ᆈ +ᆈ + +ㆊ +ㆊ +ㆊ +ᆑ +ᆑ + +ㆋ +ㆋ +ㆋ +ᆒ +ᆒ + +ㆌ +ㆌ +ㆌ +ᆔ +ᆔ + +ㆍ +ㆍ +ㆍ +ᆞ +ᆞ + +ㆎ +ㆎ +ㆎ +ᆡ +ᆡ + +㆒ +㆒ +㆒ +一 +一 + +㆓ +㆓ +㆓ +二 +二 + +㆔ +㆔ +㆔ +三 +三 + +㆕ +㆕ +㆕ +四 +四 + +㆖ +㆖ +㆖ +上 +上 + +㆗ +㆗ +㆗ +中 +中 + +㆘ +㆘ +㆘ +下 +下 + +㆙ +㆙ +㆙ +甲 +甲 + +㆚ +㆚ +㆚ +乙 +乙 + +㆛ +㆛ +㆛ +丙 +丙 + +㆜ +㆜ +㆜ +丁 +丁 + +㆝ +㆝ +㆝ +天 +天 + +㆞ +㆞ +㆞ +地 +地 + +㆟ +㆟ +㆟ +人 +人 + +㈀ +㈀ +㈀ +(ᄀ) +(ᄀ) + +㈁ +㈁ +㈁ +(ᄂ) +(ᄂ) + +㈂ +㈂ +㈂ +(ᄃ) +(ᄃ) + +㈃ +㈃ +㈃ +(ᄅ) +(ᄅ) + +㈄ +㈄ +㈄ +(ᄆ) +(ᄆ) + +㈅ +㈅ +㈅ +(ᄇ) +(ᄇ) + +㈆ +㈆ +㈆ +(ᄉ) +(ᄉ) + +㈇ +㈇ +㈇ +(ᄋ) +(ᄋ) + +㈈ +㈈ +㈈ +(ᄌ) +(ᄌ) + +㈉ +㈉ +㈉ +(ᄎ) +(ᄎ) + +㈊ +㈊ +㈊ +(ᄏ) +(ᄏ) + +㈋ +㈋ +㈋ +(ᄐ) +(ᄐ) + +㈌ +㈌ +㈌ +(ᄑ) +(ᄑ) + +㈍ +㈍ +㈍ +(ᄒ) +(ᄒ) + +㈎ +㈎ +㈎ +(가) +(가) + +㈏ +㈏ +㈏ +(나) +(나) + +㈐ +㈐ +㈐ +(다) +(다) + +㈑ +㈑ +㈑ +(라) +(라) + +㈒ +㈒ +㈒ +(마) +(마) + +㈓ +㈓ +㈓ +(바) +(바) + +㈔ +㈔ +㈔ +(사) +(사) + +㈕ +㈕ +㈕ +(아) +(아) + +㈖ +㈖ +㈖ +(자) +(자) + +㈗ +㈗ +㈗ +(차) +(차) + +㈘ +㈘ +㈘ +(카) +(카) + +㈙ +㈙ +㈙ +(타) +(타) + +㈚ +㈚ +㈚ +(파) +(파) + +㈛ +㈛ +㈛ +(하) +(하) + +㈜ +㈜ +㈜ +(주) +(주) + +㈝ +㈝ +㈝ +(오전) +(오전) + +㈞ +㈞ +㈞ +(오후) +(오후) + +㈠ +㈠ +㈠ +(一) +(一) + +㈡ +㈡ +㈡ +(二) +(二) + +㈢ +㈢ +㈢ +(三) +(三) + +㈣ +㈣ +㈣ +(四) +(四) + +㈤ +㈤ +㈤ +(五) +(五) + +㈥ +㈥ +㈥ +(六) +(六) + +㈦ +㈦ +㈦ +(七) +(七) + +㈧ +㈧ +㈧ +(八) +(八) + +㈨ +㈨ +㈨ +(九) +(九) + +㈩ +㈩ +㈩ +(十) +(十) + +㈪ +㈪ +㈪ +(月) +(月) + +㈫ +㈫ +㈫ +(火) +(火) + +㈬ +㈬ +㈬ +(水) +(水) + +㈭ +㈭ +㈭ +(木) +(木) + +㈮ +㈮ +㈮ +(金) +(金) + +㈯ +㈯ +㈯ +(土) +(土) + +㈰ +㈰ +㈰ +(日) +(日) + +㈱ +㈱ +㈱ +(株) +(株) + +㈲ +㈲ +㈲ +(有) +(有) + +㈳ +㈳ +㈳ +(社) +(社) + +㈴ +㈴ +㈴ +(名) +(名) + +㈵ +㈵ +㈵ +(特) +(特) + +㈶ +㈶ +㈶ +(財) +(財) + +㈷ +㈷ +㈷ +(祝) +(祝) + +㈸ +㈸ +㈸ +(労) +(労) + +㈹ +㈹ +㈹ +(代) +(代) + +㈺ +㈺ +㈺ +(呼) +(呼) + +㈻ +㈻ +㈻ +(学) +(学) + +㈼ +㈼ +㈼ +(監) +(監) + +㈽ +㈽ +㈽ +(企) +(企) + +㈾ +㈾ +㈾ +(資) +(資) + +㈿ +㈿ +㈿ +(協) +(協) + +㉀ +㉀ +㉀ +(祭) +(祭) + +㉁ +㉁ +㉁ +(休) +(休) + +㉂ +㉂ +㉂ +(自) +(自) + +㉃ +㉃ +㉃ +(至) +(至) + +㉄ +㉄ +㉄ +問 +問 + +㉅ +㉅ +㉅ +幼 +幼 + +㉆ +㉆ +㉆ +文 +文 + +㉇ +㉇ +㉇ +箏 +箏 + +㉐ +㉐ +㉐ +PTE +PTE + +㉑ +㉑ +㉑ +21 +21 + +㉒ +㉒ +㉒ +22 +22 + +㉓ +㉓ +㉓ +23 +23 + +㉔ +㉔ +㉔ +24 +24 + +㉕ +㉕ +㉕ +25 +25 + +㉖ +㉖ +㉖ +26 +26 + +㉗ +㉗ +㉗ +27 +27 + +㉘ +㉘ +㉘ +28 +28 + +㉙ +㉙ +㉙ +29 +29 + +㉚ +㉚ +㉚ +30 +30 + +㉛ +㉛ +㉛ +31 +31 + +㉜ +㉜ +㉜ +32 +32 + +㉝ +㉝ +㉝ +33 +33 + +㉞ +㉞ +㉞ +34 +34 + +㉟ +㉟ +㉟ +35 +35 + +㉠ +㉠ +㉠ +ᄀ +ᄀ + +㉡ +㉡ +㉡ +ᄂ +ᄂ + +㉢ +㉢ +㉢ +ᄃ +ᄃ + +㉣ +㉣ +㉣ +ᄅ +ᄅ + +㉤ +㉤ +㉤ +ᄆ +ᄆ + +㉥ +㉥ +㉥ +ᄇ +ᄇ + +㉦ +㉦ +㉦ +ᄉ +ᄉ + +㉧ +㉧ +㉧ +ᄋ +ᄋ + +㉨ +㉨ +㉨ +ᄌ +ᄌ + +㉩ +㉩ +㉩ +ᄎ +ᄎ + +㉪ +㉪ +㉪ +ᄏ +ᄏ + +㉫ +㉫ +㉫ +ᄐ +ᄐ + +㉬ +㉬ +㉬ +ᄑ +ᄑ + +㉭ +㉭ +㉭ +ᄒ +ᄒ + +㉮ +㉮ +㉮ +가 +가 + +㉯ +㉯ +㉯ +나 +나 + +㉰ +㉰ +㉰ +다 +다 + +㉱ +㉱ +㉱ +라 +라 + +㉲ +㉲ +㉲ +마 +마 + +㉳ +㉳ +㉳ +바 +바 + +㉴ +㉴ +㉴ +사 +사 + +㉵ +㉵ +㉵ +아 +아 + +㉶ +㉶ +㉶ +자 +자 + +㉷ +㉷ +㉷ +차 +차 + +㉸ +㉸ +㉸ +카 +카 + +㉹ +㉹ +㉹ +타 +타 + +㉺ +㉺ +㉺ +파 +파 + +㉻ +㉻ +㉻ +하 +하 + +㉼ +㉼ +㉼ +참고 +참고 + +㉽ +㉽ +㉽ +주의 +주의 + +㉾ +㉾ +㉾ +우 +우 + +㊀ +㊀ +㊀ +一 +一 + +㊁ +㊁ +㊁ +二 +二 + +㊂ +㊂ +㊂ +三 +三 + +㊃ +㊃ +㊃ +四 +四 + +㊄ +㊄ +㊄ +五 +五 + +㊅ +㊅ +㊅ +六 +六 + +㊆ +㊆ +㊆ +七 +七 + +㊇ +㊇ +㊇ +八 +八 + +㊈ +㊈ +㊈ +九 +九 + +㊉ +㊉ +㊉ +十 +十 + +㊊ +㊊ +㊊ +月 +月 + +㊋ +㊋ +㊋ +火 +火 + +㊌ +㊌ +㊌ +水 +水 + +㊍ +㊍ +㊍ +木 +木 + +㊎ +㊎ +㊎ +金 +金 + +㊏ +㊏ +㊏ +土 +土 + +㊐ +㊐ +㊐ +日 +日 + +㊑ +㊑ +㊑ +株 +株 + +㊒ +㊒ +㊒ +有 +有 + +㊓ +㊓ +㊓ +社 +社 + +㊔ +㊔ +㊔ +名 +名 + +㊕ +㊕ +㊕ +特 +特 + +㊖ +㊖ +㊖ +財 +財 + +㊗ +㊗ +㊗ +祝 +祝 + +㊘ +㊘ +㊘ +労 +労 + +㊙ +㊙ +㊙ +秘 +秘 + +㊚ +㊚ +㊚ +男 +男 + +㊛ +㊛ +㊛ +女 +女 + +㊜ +㊜ +㊜ +適 +適 + +㊝ +㊝ +㊝ +優 +優 + +㊞ +㊞ +㊞ +印 +印 + +㊟ +㊟ +㊟ +注 +注 + +㊠ +㊠ +㊠ +項 +項 + +㊡ +㊡ +㊡ +休 +休 + +㊢ +㊢ +㊢ +写 +写 + +㊣ +㊣ +㊣ +正 +正 + +㊤ +㊤ +㊤ +上 +上 + +㊥ +㊥ +㊥ +中 +中 + +㊦ +㊦ +㊦ +下 +下 + +㊧ +㊧ +㊧ +左 +左 + +㊨ +㊨ +㊨ +右 +右 + +㊩ +㊩ +㊩ +医 +医 + +㊪ +㊪ +㊪ +宗 +宗 + +㊫ +㊫ +㊫ +学 +学 + +㊬ +㊬ +㊬ +監 +監 + +㊭ +㊭ +㊭ +企 +企 + +㊮ +㊮ +㊮ +資 +資 + +㊯ +㊯ +㊯ +協 +協 + +㊰ +㊰ +㊰ +夜 +夜 + +㊱ +㊱ +㊱ +36 +36 + +㊲ +㊲ +㊲ +37 +37 + +㊳ +㊳ +㊳ +38 +38 + +㊴ +㊴ +㊴ +39 +39 + +㊵ +㊵ +㊵ +40 +40 + +㊶ +㊶ +㊶ +41 +41 + +㊷ +㊷ +㊷ +42 +42 + +㊸ +㊸ +㊸ +43 +43 + +㊹ +㊹ +㊹ +44 +44 + +㊺ +㊺ +㊺ +45 +45 + +㊻ +㊻ +㊻ +46 +46 + +㊼ +㊼ +㊼ +47 +47 + +㊽ +㊽ +㊽ +48 +48 + +㊾ +㊾ +㊾ +49 +49 + +㊿ +㊿ +㊿ +50 +50 + +㋀ +㋀ +㋀ +1月 +1月 + +㋁ +㋁ +㋁ +2月 +2月 + +㋂ +㋂ +㋂ +3月 +3月 + +㋃ +㋃ +㋃ +4月 +4月 + +㋄ +㋄ +㋄ +5月 +5月 + +㋅ +㋅ +㋅ +6月 +6月 + +㋆ +㋆ +㋆ +7月 +7月 + +㋇ +㋇ +㋇ +8月 +8月 + +㋈ +㋈ +㋈ +9月 +9月 + +㋉ +㋉ +㋉ +10月 +10月 + +㋊ +㋊ +㋊ +11月 +11月 + +㋋ +㋋ +㋋ +12月 +12月 + +㋌ +㋌ +㋌ +Hg +Hg + +㋍ +㋍ +㋍ +erg +erg + +㋎ +㋎ +㋎ +eV +eV + +㋏ +㋏ +㋏ +LTD +LTD + +㋐ +㋐ +㋐ +ア +ア + +㋑ +㋑ +㋑ +イ +イ + +㋒ +㋒ +㋒ +ウ +ウ + +㋓ +㋓ +㋓ +エ +エ + +㋔ +㋔ +㋔ +オ +オ + +㋕ +㋕ +㋕ +カ +カ + +㋖ +㋖ +㋖ +キ +キ + +㋗ +㋗ +㋗ +ク +ク + +㋘ +㋘ +㋘ +ケ +ケ + +㋙ +㋙ +㋙ +コ +コ + +㋚ +㋚ +㋚ +サ +サ + +㋛ +㋛ +㋛ +シ +シ + +㋜ +㋜ +㋜ +ス +ス + +㋝ +㋝ +㋝ +セ +セ + +㋞ +㋞ +㋞ +ソ +ソ + +㋟ +㋟ +㋟ +タ +タ + +㋠ +㋠ +㋠ +チ +チ + +㋡ +㋡ +㋡ +ツ +ツ + +㋢ +㋢ +㋢ +テ +テ + +㋣ +㋣ +㋣ +ト +ト + +㋤ +㋤ +㋤ +ナ +ナ + +㋥ +㋥ +㋥ +ニ +ニ + +㋦ +㋦ +㋦ +ヌ +ヌ + +㋧ +㋧ +㋧ +ネ +ネ + +㋨ +㋨ +㋨ +ノ +ノ + +㋩ +㋩ +㋩ +ハ +ハ + +㋪ +㋪ +㋪ +ヒ +ヒ + +㋫ +㋫ +㋫ +フ +フ + +㋬ +㋬ +㋬ +ヘ +ヘ + +㋭ +㋭ +㋭ +ホ +ホ + +㋮ +㋮ +㋮ +マ +マ + +㋯ +㋯ +㋯ +ミ +ミ + +㋰ +㋰ +㋰ +ム +ム + +㋱ +㋱ +㋱ +メ +メ + +㋲ +㋲ +㋲ +モ +モ + +㋳ +㋳ +㋳ +ヤ +ヤ + +㋴ +㋴ +㋴ +ユ +ユ + +㋵ +㋵ +㋵ +ヨ +ヨ + +㋶ +㋶ +㋶ +ラ +ラ + +㋷ +㋷ +㋷ +リ +リ + +㋸ +㋸ +㋸ +ル +ル + +㋹ +㋹ +㋹ +レ +レ + +㋺ +㋺ +㋺ +ロ +ロ + +㋻ +㋻ +㋻ +ワ +ワ + +㋼ +㋼ +㋼ +ヰ +ヰ + +㋽ +㋽ +㋽ +ヱ +ヱ + +㋾ +㋾ +㋾ +ヲ +ヲ + +㌀ +㌀ +㌀ +アパート +アパート + +㌁ +㌁ +㌁ +アルファ +アルファ + +㌂ +㌂ +㌂ +アンペア +アンペア + +㌃ +㌃ +㌃ +アール +アール + +㌄ +㌄ +㌄ +イニング +イニング + +㌅ +㌅ +㌅ +インチ +インチ + +㌆ +㌆ +㌆ +ウォン +ウォン + +㌇ +㌇ +㌇ +エスクード +エスクード + +㌈ +㌈ +㌈ +エーカー +エーカー + +㌉ +㌉ +㌉ +オンス +オンス + +㌊ +㌊ +㌊ +オーム +オーム + +㌋ +㌋ +㌋ +カイリ +カイリ + +㌌ +㌌ +㌌ +カラット +カラット + +㌍ +㌍ +㌍ +カロリー +カロリー + +㌎ +㌎ +㌎ +ガロン +ガロン + +㌏ +㌏ +㌏ +ガンマ +ガンマ + +㌐ +㌐ +㌐ +ギガ +ギガ + +㌑ +㌑ +㌑ +ギニー +ギニー + +㌒ +㌒ +㌒ +キュリー +キュリー + +㌓ +㌓ +㌓ +ギルダー +ギルダー + +㌔ +㌔ +㌔ +キロ +キロ + +㌕ +㌕ +㌕ +キログラム +キログラム + +㌖ +㌖ +㌖ +キロメートル +キロメートル + +㌗ +㌗ +㌗ +キロワット +キロワット + +㌘ +㌘ +㌘ +グラム +グラム + +㌙ +㌙ +㌙ +グラムトン +グラムトン + +㌚ +㌚ +㌚ +クルゼイロ +クルゼイロ + +㌛ +㌛ +㌛ +クローネ +クローネ + +㌜ +㌜ +㌜ +ケース +ケース + +㌝ +㌝ +㌝ +コルナ +コルナ + +㌞ +㌞ +㌞ +コーポ +コーポ + +㌟ +㌟ +㌟ +サイクル +サイクル + +㌠ +㌠ +㌠ +サンチーム +サンチーム + +㌡ +㌡ +㌡ +シリング +シリング + +㌢ +㌢ +㌢ +センチ +センチ + +㌣ +㌣ +㌣ +セント +セント + +㌤ +㌤ +㌤ +ダース +ダース + +㌥ +㌥ +㌥ +デシ +デシ + +㌦ +㌦ +㌦ +ドル +ドル + +㌧ +㌧ +㌧ +トン +トン + +㌨ +㌨ +㌨ +ナノ +ナノ + +㌩ +㌩ +㌩ +ノット +ノット + +㌪ +㌪ +㌪ +ハイツ +ハイツ + +㌫ +㌫ +㌫ +パーセント +パーセント + +㌬ +㌬ +㌬ +パーツ +パーツ + +㌭ +㌭ +㌭ +バーレル +バーレル + +㌮ +㌮ +㌮ +ピアストル +ピアストル + +㌯ +㌯ +㌯ +ピクル +ピクル + +㌰ +㌰ +㌰ +ピコ +ピコ + +㌱ +㌱ +㌱ +ビル +ビル + +㌲ +㌲ +㌲ +ファラッド +ファラッド + +㌳ +㌳ +㌳ +フィート +フィート + +㌴ +㌴ +㌴ +ブッシェル +ブッシェル + +㌵ +㌵ +㌵ +フラン +フラン + +㌶ +㌶ +㌶ +ヘクタール +ヘクタール + +㌷ +㌷ +㌷ +ペソ +ペソ + +㌸ +㌸ +㌸ +ペニヒ +ペニヒ + +㌹ +㌹ +㌹ +ヘルツ +ヘルツ + +㌺ +㌺ +㌺ +ペンス +ペンス + +㌻ +㌻ +㌻ +ページ +ページ + +㌼ +㌼ +㌼ +ベータ +ベータ + +㌽ +㌽ +㌽ +ポイント +ポイント + +㌾ +㌾ +㌾ +ボルト +ボルト + +㌿ +㌿ +㌿ +ホン +ホン + +㍀ +㍀ +㍀ +ポンド +ポンド + +㍁ +㍁ +㍁ +ホール +ホール + +㍂ +㍂ +㍂ +ホーン +ホーン + +㍃ +㍃ +㍃ +マイクロ +マイクロ + +㍄ +㍄ +㍄ +マイル +マイル + +㍅ +㍅ +㍅ +マッハ +マッハ + +㍆ +㍆ +㍆ +マルク +マルク + +㍇ +㍇ +㍇ +マンション +マンション + +㍈ +㍈ +㍈ +ミクロン +ミクロン + +㍉ +㍉ +㍉ +ミリ +ミリ + +㍊ +㍊ +㍊ +ミリバール +ミリバール + +㍋ +㍋ +㍋ +メガ +メガ + +㍌ +㍌ +㍌ +メガトン +メガトン + +㍍ +㍍ +㍍ +メートル +メートル + +㍎ +㍎ +㍎ +ヤード +ヤード + +㍏ +㍏ +㍏ +ヤール +ヤール + +㍐ +㍐ +㍐ +ユアン +ユアン + +㍑ +㍑ +㍑ +リットル +リットル + +㍒ +㍒ +㍒ +リラ +リラ + +㍓ +㍓ +㍓ +ルピー +ルピー + +㍔ +㍔ +㍔ +ルーブル +ルーブル + +㍕ +㍕ +㍕ +レム +レム + +㍖ +㍖ +㍖ +レントゲン +レントゲン + +㍗ +㍗ +㍗ +ワット +ワット + +㍘ +㍘ +㍘ +0点 +0点 + +㍙ +㍙ +㍙ +1点 +1点 + +㍚ +㍚ +㍚ +2点 +2点 + +㍛ +㍛ +㍛ +3点 +3点 + +㍜ +㍜ +㍜ +4点 +4点 + +㍝ +㍝ +㍝ +5点 +5点 + +㍞ +㍞ +㍞ +6点 +6点 + +㍟ +㍟ +㍟ +7点 +7点 + +㍠ +㍠ +㍠ +8点 +8点 + +㍡ +㍡ +㍡ +9点 +9点 + +㍢ +㍢ +㍢ +10点 +10点 + +㍣ +㍣ +㍣ +11点 +11点 + +㍤ +㍤ +㍤ +12点 +12点 + +㍥ +㍥ +㍥ +13点 +13点 + +㍦ +㍦ +㍦ +14点 +14点 + +㍧ +㍧ +㍧ +15点 +15点 + +㍨ +㍨ +㍨ +16点 +16点 + +㍩ +㍩ +㍩ +17点 +17点 + +㍪ +㍪ +㍪ +18点 +18点 + +㍫ +㍫ +㍫ +19点 +19点 + +㍬ +㍬ +㍬ +20点 +20点 + +㍭ +㍭ +㍭ +21点 +21点 + +㍮ +㍮ +㍮ +22点 +22点 + +㍯ +㍯ +㍯ +23点 +23点 + +㍰ +㍰ +㍰ +24点 +24点 + +㍱ +㍱ +㍱ +hPa +hPa + +㍲ +㍲ +㍲ +da +da + +㍳ +㍳ +㍳ +AU +AU + +㍴ +㍴ +㍴ +bar +bar + +㍵ +㍵ +㍵ +oV +oV + +㍶ +㍶ +㍶ +pc +pc + +㍷ +㍷ +㍷ +dm +dm + +㍸ +㍸ +㍸ +dm2 +dm2 + +㍹ +㍹ +㍹ +dm3 +dm3 + +㍺ +㍺ +㍺ +IU +IU + +㍻ +㍻ +㍻ +平成 +平成 + +㍼ +㍼ +㍼ +昭和 +昭和 + +㍽ +㍽ +㍽ +大正 +大正 + +㍾ +㍾ +㍾ +明治 +明治 + +㍿ +㍿ +㍿ +株式会社 +株式会社 + +㎀ +㎀ +㎀ +pA +pA + +㎁ +㎁ +㎁ +nA +nA + +㎂ +㎂ +㎂ +μA +μA + +㎃ +㎃ +㎃ +mA +mA + +㎄ +㎄ +㎄ +kA +kA + +㎅ +㎅ +㎅ +KB +KB + +㎆ +㎆ +㎆ +MB +MB + +㎇ +㎇ +㎇ +GB +GB + +㎈ +㎈ +㎈ +cal +cal + +㎉ +㎉ +㎉ +kcal +kcal + +㎊ +㎊ +㎊ +pF +pF + +㎋ +㎋ +㎋ +nF +nF + +㎌ +㎌ +㎌ +μF +μF + +㎍ +㎍ +㎍ +μg +μg + +㎎ +㎎ +㎎ +mg +mg + +㎏ +㎏ +㎏ +kg +kg + +㎐ +㎐ +㎐ +Hz +Hz + +㎑ +㎑ +㎑ +kHz +kHz + +㎒ +㎒ +㎒ +MHz +MHz + +㎓ +㎓ +㎓ +GHz +GHz + +㎔ +㎔ +㎔ +THz +THz + +㎕ +㎕ +㎕ +μl +μl + +㎖ +㎖ +㎖ +ml +ml + +㎗ +㎗ +㎗ +dl +dl + +㎘ +㎘ +㎘ +kl +kl + +㎙ +㎙ +㎙ +fm +fm + +㎚ +㎚ +㎚ +nm +nm + +㎛ +㎛ +㎛ +μm +μm + +㎜ +㎜ +㎜ +mm +mm + +㎝ +㎝ +㎝ +cm +cm + +㎞ +㎞ +㎞ +km +km + +㎟ +㎟ +㎟ +mm2 +mm2 + +㎠ +㎠ +㎠ +cm2 +cm2 + +㎡ +㎡ +㎡ +m2 +m2 + +㎢ +㎢ +㎢ +km2 +km2 + +㎣ +㎣ +㎣ +mm3 +mm3 + +㎤ +㎤ +㎤ +cm3 +cm3 + +㎥ +㎥ +㎥ +m3 +m3 + +㎦ +㎦ +㎦ +km3 +km3 + +㎧ +㎧ +㎧ +m∕s +m∕s + +㎨ +㎨ +㎨ +m∕s2 +m∕s2 + +㎩ +㎩ +㎩ +Pa +Pa + +㎪ +㎪ +㎪ +kPa +kPa + +㎫ +㎫ +㎫ +MPa +MPa + +㎬ +㎬ +㎬ +GPa +GPa + +㎭ +㎭ +㎭ +rad +rad + +㎮ +㎮ +㎮ +rad∕s +rad∕s + +㎯ +㎯ +㎯ +rad∕s2 +rad∕s2 + +㎰ +㎰ +㎰ +ps +ps + +㎱ +㎱ +㎱ +ns +ns + +㎲ +㎲ +㎲ +μs +μs + +㎳ +㎳ +㎳ +ms +ms + +㎴ +㎴ +㎴ +pV +pV + +㎵ +㎵ +㎵ +nV +nV + +㎶ +㎶ +㎶ +μV +μV + +㎷ +㎷ +㎷ +mV +mV + +㎸ +㎸ +㎸ +kV +kV + +㎹ +㎹ +㎹ +MV +MV + +㎺ +㎺ +㎺ +pW +pW + +㎻ +㎻ +㎻ +nW +nW + +㎼ +㎼ +㎼ +μW +μW + +㎽ +㎽ +㎽ +mW +mW + +㎾ +㎾ +㎾ +kW +kW + +㎿ +㎿ +㎿ +MW +MW + +㏀ +㏀ +㏀ +kΩ +kΩ + +㏁ +㏁ +㏁ +MΩ +MΩ + +㏂ +㏂ +㏂ +a.m. +a.m. + +㏃ +㏃ +㏃ +Bq +Bq + +㏄ +㏄ +㏄ +cc +cc + +㏅ +㏅ +㏅ +cd +cd + +㏆ +㏆ +㏆ +C∕kg +C∕kg + +㏇ +㏇ +㏇ +Co. +Co. + +㏈ +㏈ +㏈ +dB +dB + +㏉ +㏉ +㏉ +Gy +Gy + +㏊ +㏊ +㏊ +ha +ha + +㏋ +㏋ +㏋ +HP +HP + +㏌ +㏌ +㏌ +in +in + +㏍ +㏍ +㏍ +KK +KK + +㏎ +㏎ +㏎ +KM +KM + +㏏ +㏏ +㏏ +kt +kt + +㏐ +㏐ +㏐ +lm +lm + +㏑ +㏑ +㏑ +ln +ln + +㏒ +㏒ +㏒ +log +log + +㏓ +㏓ +㏓ +lx +lx + +㏔ +㏔ +㏔ +mb +mb + +㏕ +㏕ +㏕ +mil +mil + +㏖ +㏖ +㏖ +mol +mol + +㏗ +㏗ +㏗ +PH +PH + +㏘ +㏘ +㏘ +p.m. +p.m. + +㏙ +㏙ +㏙ +PPM +PPM + +㏚ +㏚ +㏚ +PR +PR + +㏛ +㏛ +㏛ +sr +sr + +㏜ +㏜ +㏜ +Sv +Sv + +㏝ +㏝ +㏝ +Wb +Wb + +㏞ +㏞ +㏞ +V∕m +V∕m + +㏟ +㏟ +㏟ +A∕m +A∕m + +㏠ +㏠ +㏠ +1日 +1日 + +㏡ +㏡ +㏡ +2日 +2日 + +㏢ +㏢ +㏢ +3日 +3日 + +㏣ +㏣ +㏣ +4日 +4日 + +㏤ +㏤ +㏤ +5日 +5日 + +㏥ +㏥ +㏥ +6日 +6日 + +㏦ +㏦ +㏦ +7日 +7日 + +㏧ +㏧ +㏧ +8日 +8日 + +㏨ +㏨ +㏨ +9日 +9日 + +㏩ +㏩ +㏩ +10日 +10日 + +㏪ +㏪ +㏪ +11日 +11日 + +㏫ +㏫ +㏫ +12日 +12日 + +㏬ +㏬ +㏬ +13日 +13日 + +㏭ +㏭ +㏭ +14日 +14日 + +㏮ +㏮ +㏮ +15日 +15日 + +㏯ +㏯ +㏯ +16日 +16日 + +㏰ +㏰ +㏰ +17日 +17日 + +㏱ +㏱ +㏱ +18日 +18日 + +㏲ +㏲ +㏲ +19日 +19日 + +㏳ +㏳ +㏳ +20日 +20日 + +㏴ +㏴ +㏴ +21日 +21日 + +㏵ +㏵ +㏵ +22日 +22日 + +㏶ +㏶ +㏶ +23日 +23日 + +㏷ +㏷ +㏷ +24日 +24日 + +㏸ +㏸ +㏸ +25日 +25日 + +㏹ +㏹ +㏹ +26日 +26日 + +㏺ +㏺ +㏺ +27日 +27日 + +㏻ +㏻ +㏻ +28日 +28日 + +㏼ +㏼ +㏼ +29日 +29日 + +㏽ +㏽ +㏽ +30日 +30日 + +㏾ +㏾ +㏾ +31日 +31日 + +㏿ +㏿ +㏿ +gal +gal + +ꚜ +ꚜ +ꚜ +ъ +ъ + +ꚝ +ꚝ +ꚝ +ь +ь + +ꝰ +ꝰ +ꝰ +ꝯ +ꝯ + +ꟸ +ꟸ +ꟸ +Ħ +Ħ + +ꟹ +ꟹ +ꟹ +œ +œ + +ꭜ +ꭜ +ꭜ +ꜧ +ꜧ + +ꭝ +ꭝ +ꭝ +ꬷ +ꬷ + +ꭞ +ꭞ +ꭞ +ɫ +ɫ + +ꭟ +ꭟ +ꭟ +ꭒ +ꭒ + +가 +가 +가 +가 +가 + +각 +각 +각 +각 +각 + +갂 +갂 +갂 +갂 +갂 + +갃 +갃 +갃 +갃 +갃 + +간 +간 +간 +간 +간 + +갅 +갅 +갅 +갅 +갅 + +갆 +갆 +갆 +갆 +갆 + +갇 +갇 +갇 +갇 +갇 + +갈 +갈 +갈 +갈 +갈 + +갉 +갉 +갉 +갉 +갉 + +갊 +갊 +갊 +갊 +갊 + +갋 +갋 +갋 +갋 +갋 + +갌 +갌 +갌 +갌 +갌 + +갍 +갍 +갍 +갍 +갍 + +갎 +갎 +갎 +갎 +갎 + +갏 +갏 +갏 +갏 +갏 + +감 +감 +감 +감 +감 + +갑 +갑 +갑 +갑 +갑 + +값 +값 +값 +값 +값 + +갓 +갓 +갓 +갓 +갓 + +갔 +갔 +갔 +갔 +갔 + +강 +강 +강 +강 +강 + +갖 +갖 +갖 +갖 +갖 + +갗 +갗 +갗 +갗 +갗 + +갘 +갘 +갘 +갘 +갘 + +같 +같 +같 +같 +같 + +갚 +갚 +갚 +갚 +갚 + +갛 +갛 +갛 +갛 +갛 + +개 +개 +개 +개 +개 + +객 +객 +객 +객 +객 + +갞 +갞 +갞 +갞 +갞 + +갟 +갟 +갟 +갟 +갟 + +갠 +갠 +갠 +갠 +갠 + +갡 +갡 +갡 +갡 +갡 + +갢 +갢 +갢 +갢 +갢 + +갣 +갣 +갣 +갣 +갣 + +갤 +갤 +갤 +갤 +갤 + +갥 +갥 +갥 +갥 +갥 + +갦 +갦 +갦 +갦 +갦 + +갧 +갧 +갧 +갧 +갧 + +갨 +갨 +갨 +갨 +갨 + +갩 +갩 +갩 +갩 +갩 + +갪 +갪 +갪 +갪 +갪 + +갫 +갫 +갫 +갫 +갫 + +갬 +갬 +갬 +갬 +갬 + +갭 +갭 +갭 +갭 +갭 + +갮 +갮 +갮 +갮 +갮 + +갯 +갯 +갯 +갯 +갯 + +갰 +갰 +갰 +갰 +갰 + +갱 +갱 +갱 +갱 +갱 + +갲 +갲 +갲 +갲 +갲 + +갳 +갳 +갳 +갳 +갳 + +갴 +갴 +갴 +갴 +갴 + +갵 +갵 +갵 +갵 +갵 + +갶 +갶 +갶 +갶 +갶 + +갷 +갷 +갷 +갷 +갷 + +갸 +갸 +갸 +갸 +갸 + +갹 +갹 +갹 +갹 +갹 + +갺 +갺 +갺 +갺 +갺 + +갻 +갻 +갻 +갻 +갻 + +갼 +갼 +갼 +갼 +갼 + +갽 +갽 +갽 +갽 +갽 + +갾 +갾 +갾 +갾 +갾 + +갿 +갿 +갿 +갿 +갿 + +걀 +걀 +걀 +걀 +걀 + +걁 +걁 +걁 +걁 +걁 + +걂 +걂 +걂 +걂 +걂 + +걃 +걃 +걃 +걃 +걃 + +걄 +걄 +걄 +걄 +걄 + +걅 +걅 +걅 +걅 +걅 + +걆 +걆 +걆 +걆 +걆 + +걇 +걇 +걇 +걇 +걇 + +걈 +걈 +걈 +걈 +걈 + +걉 +걉 +걉 +걉 +걉 + +걊 +걊 +걊 +걊 +걊 + +걋 +걋 +걋 +걋 +걋 + +걌 +걌 +걌 +걌 +걌 + +걍 +걍 +걍 +걍 +걍 + +걎 +걎 +걎 +걎 +걎 + +걏 +걏 +걏 +걏 +걏 + +걐 +걐 +걐 +걐 +걐 + +걑 +걑 +걑 +걑 +걑 + +걒 +걒 +걒 +걒 +걒 + +걓 +걓 +걓 +걓 +걓 + +걔 +걔 +걔 +걔 +걔 + +걕 +걕 +걕 +걕 +걕 + +걖 +걖 +걖 +걖 +걖 + +걗 +걗 +걗 +걗 +걗 + +걘 +걘 +걘 +걘 +걘 + +걙 +걙 +걙 +걙 +걙 + +걚 +걚 +걚 +걚 +걚 + +걛 +걛 +걛 +걛 +걛 + +걜 +걜 +걜 +걜 +걜 + +걝 +걝 +걝 +걝 +걝 + +걞 +걞 +걞 +걞 +걞 + +걟 +걟 +걟 +걟 +걟 + +걠 +걠 +걠 +걠 +걠 + +걡 +걡 +걡 +걡 +걡 + +걢 +걢 +걢 +걢 +걢 + +걣 +걣 +걣 +걣 +걣 + +걤 +걤 +걤 +걤 +걤 + +걥 +걥 +걥 +걥 +걥 + +걦 +걦 +걦 +걦 +걦 + +걧 +걧 +걧 +걧 +걧 + +걨 +걨 +걨 +걨 +걨 + +걩 +걩 +걩 +걩 +걩 + +걪 +걪 +걪 +걪 +걪 + +걫 +걫 +걫 +걫 +걫 + +걬 +걬 +걬 +걬 +걬 + +걭 +걭 +걭 +걭 +걭 + +걮 +걮 +걮 +걮 +걮 + +걯 +걯 +걯 +걯 +걯 + +거 +거 +거 +거 +거 + +걱 +걱 +걱 +걱 +걱 + +걲 +걲 +걲 +걲 +걲 + +걳 +걳 +걳 +걳 +걳 + +건 +건 +건 +건 +건 + +걵 +걵 +걵 +걵 +걵 + +걶 +걶 +걶 +걶 +걶 + +걷 +걷 +걷 +걷 +걷 + +걸 +걸 +걸 +걸 +걸 + +걹 +걹 +걹 +걹 +걹 + +걺 +걺 +걺 +걺 +걺 + +걻 +걻 +걻 +걻 +걻 + +걼 +걼 +걼 +걼 +걼 + +걽 +걽 +걽 +걽 +걽 + +걾 +걾 +걾 +걾 +걾 + +걿 +걿 +걿 +걿 +걿 + +검 +검 +검 +검 +검 + +겁 +겁 +겁 +겁 +겁 + +겂 +겂 +겂 +겂 +겂 + +것 +것 +것 +것 +것 + +겄 +겄 +겄 +겄 +겄 + +겅 +겅 +겅 +겅 +겅 + +겆 +겆 +겆 +겆 +겆 + +겇 +겇 +겇 +겇 +겇 + +겈 +겈 +겈 +겈 +겈 + +겉 +겉 +겉 +겉 +겉 + +겊 +겊 +겊 +겊 +겊 + +겋 +겋 +겋 +겋 +겋 + +게 +게 +게 +게 +게 + +겍 +겍 +겍 +겍 +겍 + +겎 +겎 +겎 +겎 +겎 + +겏 +겏 +겏 +겏 +겏 + +겐 +겐 +겐 +겐 +겐 + +겑 +겑 +겑 +겑 +겑 + +겒 +겒 +겒 +겒 +겒 + +겓 +겓 +겓 +겓 +겓 + +겔 +겔 +겔 +겔 +겔 + +겕 +겕 +겕 +겕 +겕 + +겖 +겖 +겖 +겖 +겖 + +겗 +겗 +겗 +겗 +겗 + +겘 +겘 +겘 +겘 +겘 + +겙 +겙 +겙 +겙 +겙 + +겚 +겚 +겚 +겚 +겚 + +겛 +겛 +겛 +겛 +겛 + +겜 +겜 +겜 +겜 +겜 + +겝 +겝 +겝 +겝 +겝 + +겞 +겞 +겞 +겞 +겞 + +겟 +겟 +겟 +겟 +겟 + +겠 +겠 +겠 +겠 +겠 + +겡 +겡 +겡 +겡 +겡 + +겢 +겢 +겢 +겢 +겢 + +겣 +겣 +겣 +겣 +겣 + +겤 +겤 +겤 +겤 +겤 + +겥 +겥 +겥 +겥 +겥 + +겦 +겦 +겦 +겦 +겦 + +겧 +겧 +겧 +겧 +겧 + +겨 +겨 +겨 +겨 +겨 + +격 +격 +격 +격 +격 + +겪 +겪 +겪 +겪 +겪 + +겫 +겫 +겫 +겫 +겫 + +견 +견 +견 +견 +견 + +겭 +겭 +겭 +겭 +겭 + +겮 +겮 +겮 +겮 +겮 + +겯 +겯 +겯 +겯 +겯 + +결 +결 +결 +결 +결 + +겱 +겱 +겱 +겱 +겱 + +겲 +겲 +겲 +겲 +겲 + +겳 +겳 +겳 +겳 +겳 + +겴 +겴 +겴 +겴 +겴 + +겵 +겵 +겵 +겵 +겵 + +겶 +겶 +겶 +겶 +겶 + +겷 +겷 +겷 +겷 +겷 + +겸 +겸 +겸 +겸 +겸 + +겹 +겹 +겹 +겹 +겹 + +겺 +겺 +겺 +겺 +겺 + +겻 +겻 +겻 +겻 +겻 + +겼 +겼 +겼 +겼 +겼 + +경 +경 +경 +경 +경 + +겾 +겾 +겾 +겾 +겾 + +겿 +겿 +겿 +겿 +겿 + +곀 +곀 +곀 +곀 +곀 + +곁 +곁 +곁 +곁 +곁 + +곂 +곂 +곂 +곂 +곂 + +곃 +곃 +곃 +곃 +곃 + +계 +계 +계 +계 +계 + +곅 +곅 +곅 +곅 +곅 + +곆 +곆 +곆 +곆 +곆 + +곇 +곇 +곇 +곇 +곇 + +곈 +곈 +곈 +곈 +곈 + +곉 +곉 +곉 +곉 +곉 + +곊 +곊 +곊 +곊 +곊 + +곋 +곋 +곋 +곋 +곋 + +곌 +곌 +곌 +곌 +곌 + +곍 +곍 +곍 +곍 +곍 + +곎 +곎 +곎 +곎 +곎 + +곏 +곏 +곏 +곏 +곏 + +곐 +곐 +곐 +곐 +곐 + +곑 +곑 +곑 +곑 +곑 + +곒 +곒 +곒 +곒 +곒 + +곓 +곓 +곓 +곓 +곓 + +곔 +곔 +곔 +곔 +곔 + +곕 +곕 +곕 +곕 +곕 + +곖 +곖 +곖 +곖 +곖 + +곗 +곗 +곗 +곗 +곗 + +곘 +곘 +곘 +곘 +곘 + +곙 +곙 +곙 +곙 +곙 + +곚 +곚 +곚 +곚 +곚 + +곛 +곛 +곛 +곛 +곛 + +곜 +곜 +곜 +곜 +곜 + +곝 +곝 +곝 +곝 +곝 + +곞 +곞 +곞 +곞 +곞 + +곟 +곟 +곟 +곟 +곟 + +고 +고 +고 +고 +고 + +곡 +곡 +곡 +곡 +곡 + +곢 +곢 +곢 +곢 +곢 + +곣 +곣 +곣 +곣 +곣 + +곤 +곤 +곤 +곤 +곤 + +곥 +곥 +곥 +곥 +곥 + +곦 +곦 +곦 +곦 +곦 + +곧 +곧 +곧 +곧 +곧 + +골 +골 +골 +골 +골 + +곩 +곩 +곩 +곩 +곩 + +곪 +곪 +곪 +곪 +곪 + +곫 +곫 +곫 +곫 +곫 + +곬 +곬 +곬 +곬 +곬 + +곭 +곭 +곭 +곭 +곭 + +곮 +곮 +곮 +곮 +곮 + +곯 +곯 +곯 +곯 +곯 + +곰 +곰 +곰 +곰 +곰 + +곱 +곱 +곱 +곱 +곱 + +곲 +곲 +곲 +곲 +곲 + +곳 +곳 +곳 +곳 +곳 + +곴 +곴 +곴 +곴 +곴 + +공 +공 +공 +공 +공 + +곶 +곶 +곶 +곶 +곶 + +곷 +곷 +곷 +곷 +곷 + +곸 +곸 +곸 +곸 +곸 + +곹 +곹 +곹 +곹 +곹 + +곺 +곺 +곺 +곺 +곺 + +곻 +곻 +곻 +곻 +곻 + +과 +과 +과 +과 +과 + +곽 +곽 +곽 +곽 +곽 + +곾 +곾 +곾 +곾 +곾 + +곿 +곿 +곿 +곿 +곿 + +관 +관 +관 +관 +관 + +괁 +괁 +괁 +괁 +괁 + +괂 +괂 +괂 +괂 +괂 + +괃 +괃 +괃 +괃 +괃 + +괄 +괄 +괄 +괄 +괄 + +괅 +괅 +괅 +괅 +괅 + +괆 +괆 +괆 +괆 +괆 + +괇 +괇 +괇 +괇 +괇 + +괈 +괈 +괈 +괈 +괈 + +괉 +괉 +괉 +괉 +괉 + +괊 +괊 +괊 +괊 +괊 + +괋 +괋 +괋 +괋 +괋 + +괌 +괌 +괌 +괌 +괌 + +괍 +괍 +괍 +괍 +괍 + +괎 +괎 +괎 +괎 +괎 + +괏 +괏 +괏 +괏 +괏 + +괐 +괐 +괐 +괐 +괐 + +광 +광 +광 +광 +광 + +괒 +괒 +괒 +괒 +괒 + +괓 +괓 +괓 +괓 +괓 + +괔 +괔 +괔 +괔 +괔 + +괕 +괕 +괕 +괕 +괕 + +괖 +괖 +괖 +괖 +괖 + +괗 +괗 +괗 +괗 +괗 + +괘 +괘 +괘 +괘 +괘 + +괙 +괙 +괙 +괙 +괙 + +괚 +괚 +괚 +괚 +괚 + +괛 +괛 +괛 +괛 +괛 + +괜 +괜 +괜 +괜 +괜 + +괝 +괝 +괝 +괝 +괝 + +괞 +괞 +괞 +괞 +괞 + +괟 +괟 +괟 +괟 +괟 + +괠 +괠 +괠 +괠 +괠 + +괡 +괡 +괡 +괡 +괡 + +괢 +괢 +괢 +괢 +괢 + +괣 +괣 +괣 +괣 +괣 + +괤 +괤 +괤 +괤 +괤 + +괥 +괥 +괥 +괥 +괥 + +괦 +괦 +괦 +괦 +괦 + +괧 +괧 +괧 +괧 +괧 + +괨 +괨 +괨 +괨 +괨 + +괩 +괩 +괩 +괩 +괩 + +괪 +괪 +괪 +괪 +괪 + +괫 +괫 +괫 +괫 +괫 + +괬 +괬 +괬 +괬 +괬 + +괭 +괭 +괭 +괭 +괭 + +괮 +괮 +괮 +괮 +괮 + +괯 +괯 +괯 +괯 +괯 + +괰 +괰 +괰 +괰 +괰 + +괱 +괱 +괱 +괱 +괱 + +괲 +괲 +괲 +괲 +괲 + +괳 +괳 +괳 +괳 +괳 + +괴 +괴 +괴 +괴 +괴 + +괵 +괵 +괵 +괵 +괵 + +괶 +괶 +괶 +괶 +괶 + +괷 +괷 +괷 +괷 +괷 + +괸 +괸 +괸 +괸 +괸 + +괹 +괹 +괹 +괹 +괹 + +괺 +괺 +괺 +괺 +괺 + +괻 +괻 +괻 +괻 +괻 + +괼 +괼 +괼 +괼 +괼 + +괽 +괽 +괽 +괽 +괽 + +괾 +괾 +괾 +괾 +괾 + +괿 +괿 +괿 +괿 +괿 + +굀 +굀 +굀 +굀 +굀 + +굁 +굁 +굁 +굁 +굁 + +굂 +굂 +굂 +굂 +굂 + +굃 +굃 +굃 +굃 +굃 + +굄 +굄 +굄 +굄 +굄 + +굅 +굅 +굅 +굅 +굅 + +굆 +굆 +굆 +굆 +굆 + +굇 +굇 +굇 +굇 +굇 + +굈 +굈 +굈 +굈 +굈 + +굉 +굉 +굉 +굉 +굉 + +굊 +굊 +굊 +굊 +굊 + +굋 +굋 +굋 +굋 +굋 + +굌 +굌 +굌 +굌 +굌 + +굍 +굍 +굍 +굍 +굍 + +굎 +굎 +굎 +굎 +굎 + +굏 +굏 +굏 +굏 +굏 + +교 +교 +교 +교 +교 + +굑 +굑 +굑 +굑 +굑 + +굒 +굒 +굒 +굒 +굒 + +굓 +굓 +굓 +굓 +굓 + +굔 +굔 +굔 +굔 +굔 + +굕 +굕 +굕 +굕 +굕 + +굖 +굖 +굖 +굖 +굖 + +굗 +굗 +굗 +굗 +굗 + +굘 +굘 +굘 +굘 +굘 + +굙 +굙 +굙 +굙 +굙 + +굚 +굚 +굚 +굚 +굚 + +굛 +굛 +굛 +굛 +굛 + +굜 +굜 +굜 +굜 +굜 + +굝 +굝 +굝 +굝 +굝 + +굞 +굞 +굞 +굞 +굞 + +굟 +굟 +굟 +굟 +굟 + +굠 +굠 +굠 +굠 +굠 + +굡 +굡 +굡 +굡 +굡 + +굢 +굢 +굢 +굢 +굢 + +굣 +굣 +굣 +굣 +굣 + +굤 +굤 +굤 +굤 +굤 + +굥 +굥 +굥 +굥 +굥 + +굦 +굦 +굦 +굦 +굦 + +굧 +굧 +굧 +굧 +굧 + +굨 +굨 +굨 +굨 +굨 + +굩 +굩 +굩 +굩 +굩 + +굪 +굪 +굪 +굪 +굪 + +굫 +굫 +굫 +굫 +굫 + +구 +구 +구 +구 +구 + +국 +국 +국 +국 +국 + +굮 +굮 +굮 +굮 +굮 + +굯 +굯 +굯 +굯 +굯 + +군 +군 +군 +군 +군 + +굱 +굱 +굱 +굱 +굱 + +굲 +굲 +굲 +굲 +굲 + +굳 +굳 +굳 +굳 +굳 + +굴 +굴 +굴 +굴 +굴 + +굵 +굵 +굵 +굵 +굵 + +굶 +굶 +굶 +굶 +굶 + +굷 +굷 +굷 +굷 +굷 + +굸 +굸 +굸 +굸 +굸 + +굹 +굹 +굹 +굹 +굹 + +굺 +굺 +굺 +굺 +굺 + +굻 +굻 +굻 +굻 +굻 + +굼 +굼 +굼 +굼 +굼 + +굽 +굽 +굽 +굽 +굽 + +굾 +굾 +굾 +굾 +굾 + +굿 +굿 +굿 +굿 +굿 + +궀 +궀 +궀 +궀 +궀 + +궁 +궁 +궁 +궁 +궁 + +궂 +궂 +궂 +궂 +궂 + +궃 +궃 +궃 +궃 +궃 + +궄 +궄 +궄 +궄 +궄 + +궅 +궅 +궅 +궅 +궅 + +궆 +궆 +궆 +궆 +궆 + +궇 +궇 +궇 +궇 +궇 + +궈 +궈 +궈 +궈 +궈 + +궉 +궉 +궉 +궉 +궉 + +궊 +궊 +궊 +궊 +궊 + +궋 +궋 +궋 +궋 +궋 + +권 +권 +권 +권 +권 + +궍 +궍 +궍 +궍 +궍 + +궎 +궎 +궎 +궎 +궎 + +궏 +궏 +궏 +궏 +궏 + +궐 +궐 +궐 +궐 +궐 + +궑 +궑 +궑 +궑 +궑 + +궒 +궒 +궒 +궒 +궒 + +궓 +궓 +궓 +궓 +궓 + +궔 +궔 +궔 +궔 +궔 + +궕 +궕 +궕 +궕 +궕 + +궖 +궖 +궖 +궖 +궖 + +궗 +궗 +궗 +궗 +궗 + +궘 +궘 +궘 +궘 +궘 + +궙 +궙 +궙 +궙 +궙 + +궚 +궚 +궚 +궚 +궚 + +궛 +궛 +궛 +궛 +궛 + +궜 +궜 +궜 +궜 +궜 + +궝 +궝 +궝 +궝 +궝 + +궞 +궞 +궞 +궞 +궞 + +궟 +궟 +궟 +궟 +궟 + +궠 +궠 +궠 +궠 +궠 + +궡 +궡 +궡 +궡 +궡 + +궢 +궢 +궢 +궢 +궢 + +궣 +궣 +궣 +궣 +궣 + +궤 +궤 +궤 +궤 +궤 + +궥 +궥 +궥 +궥 +궥 + +궦 +궦 +궦 +궦 +궦 + +궧 +궧 +궧 +궧 +궧 + +궨 +궨 +궨 +궨 +궨 + +궩 +궩 +궩 +궩 +궩 + +궪 +궪 +궪 +궪 +궪 + +궫 +궫 +궫 +궫 +궫 + +궬 +궬 +궬 +궬 +궬 + +궭 +궭 +궭 +궭 +궭 + +궮 +궮 +궮 +궮 +궮 + +궯 +궯 +궯 +궯 +궯 + +궰 +궰 +궰 +궰 +궰 + +궱 +궱 +궱 +궱 +궱 + +궲 +궲 +궲 +궲 +궲 + +궳 +궳 +궳 +궳 +궳 + +궴 +궴 +궴 +궴 +궴 + +궵 +궵 +궵 +궵 +궵 + +궶 +궶 +궶 +궶 +궶 + +궷 +궷 +궷 +궷 +궷 + +궸 +궸 +궸 +궸 +궸 + +궹 +궹 +궹 +궹 +궹 + +궺 +궺 +궺 +궺 +궺 + +궻 +궻 +궻 +궻 +궻 + +궼 +궼 +궼 +궼 +궼 + +궽 +궽 +궽 +궽 +궽 + +궾 +궾 +궾 +궾 +궾 + +궿 +궿 +궿 +궿 +궿 + +귀 +귀 +귀 +귀 +귀 + +귁 +귁 +귁 +귁 +귁 + +귂 +귂 +귂 +귂 +귂 + +귃 +귃 +귃 +귃 +귃 + +귄 +귄 +귄 +귄 +귄 + +귅 +귅 +귅 +귅 +귅 + +귆 +귆 +귆 +귆 +귆 + +귇 +귇 +귇 +귇 +귇 + +귈 +귈 +귈 +귈 +귈 + +귉 +귉 +귉 +귉 +귉 + +귊 +귊 +귊 +귊 +귊 + +귋 +귋 +귋 +귋 +귋 + +귌 +귌 +귌 +귌 +귌 + +귍 +귍 +귍 +귍 +귍 + +귎 +귎 +귎 +귎 +귎 + +귏 +귏 +귏 +귏 +귏 + +귐 +귐 +귐 +귐 +귐 + +귑 +귑 +귑 +귑 +귑 + +귒 +귒 +귒 +귒 +귒 + +귓 +귓 +귓 +귓 +귓 + +귔 +귔 +귔 +귔 +귔 + +귕 +귕 +귕 +귕 +귕 + +귖 +귖 +귖 +귖 +귖 + +귗 +귗 +귗 +귗 +귗 + +귘 +귘 +귘 +귘 +귘 + +귙 +귙 +귙 +귙 +귙 + +귚 +귚 +귚 +귚 +귚 + +귛 +귛 +귛 +귛 +귛 + +규 +규 +규 +규 +규 + +귝 +귝 +귝 +귝 +귝 + +귞 +귞 +귞 +귞 +귞 + +귟 +귟 +귟 +귟 +귟 + +균 +균 +균 +균 +균 + +귡 +귡 +귡 +귡 +귡 + +귢 +귢 +귢 +귢 +귢 + +귣 +귣 +귣 +귣 +귣 + +귤 +귤 +귤 +귤 +귤 + +귥 +귥 +귥 +귥 +귥 + +귦 +귦 +귦 +귦 +귦 + +귧 +귧 +귧 +귧 +귧 + +귨 +귨 +귨 +귨 +귨 + +귩 +귩 +귩 +귩 +귩 + +귪 +귪 +귪 +귪 +귪 + +귫 +귫 +귫 +귫 +귫 + +귬 +귬 +귬 +귬 +귬 + +귭 +귭 +귭 +귭 +귭 + +귮 +귮 +귮 +귮 +귮 + +귯 +귯 +귯 +귯 +귯 + +귰 +귰 +귰 +귰 +귰 + +귱 +귱 +귱 +귱 +귱 + +귲 +귲 +귲 +귲 +귲 + +귳 +귳 +귳 +귳 +귳 + +귴 +귴 +귴 +귴 +귴 + +귵 +귵 +귵 +귵 +귵 + +귶 +귶 +귶 +귶 +귶 + +귷 +귷 +귷 +귷 +귷 + +그 +그 +그 +그 +그 + +극 +극 +극 +극 +극 + +귺 +귺 +귺 +귺 +귺 + +귻 +귻 +귻 +귻 +귻 + +근 +근 +근 +근 +근 + +귽 +귽 +귽 +귽 +귽 + +귾 +귾 +귾 +귾 +귾 + +귿 +귿 +귿 +귿 +귿 + +글 +글 +글 +글 +글 + +긁 +긁 +긁 +긁 +긁 + +긂 +긂 +긂 +긂 +긂 + +긃 +긃 +긃 +긃 +긃 + +긄 +긄 +긄 +긄 +긄 + +긅 +긅 +긅 +긅 +긅 + +긆 +긆 +긆 +긆 +긆 + +긇 +긇 +긇 +긇 +긇 + +금 +금 +금 +금 +금 + +급 +급 +급 +급 +급 + +긊 +긊 +긊 +긊 +긊 + +긋 +긋 +긋 +긋 +긋 + +긌 +긌 +긌 +긌 +긌 + +긍 +긍 +긍 +긍 +긍 + +긎 +긎 +긎 +긎 +긎 + +긏 +긏 +긏 +긏 +긏 + +긐 +긐 +긐 +긐 +긐 + +긑 +긑 +긑 +긑 +긑 + +긒 +긒 +긒 +긒 +긒 + +긓 +긓 +긓 +긓 +긓 + +긔 +긔 +긔 +긔 +긔 + +긕 +긕 +긕 +긕 +긕 + +긖 +긖 +긖 +긖 +긖 + +긗 +긗 +긗 +긗 +긗 + +긘 +긘 +긘 +긘 +긘 + +긙 +긙 +긙 +긙 +긙 + +긚 +긚 +긚 +긚 +긚 + +긛 +긛 +긛 +긛 +긛 + +긜 +긜 +긜 +긜 +긜 + +긝 +긝 +긝 +긝 +긝 + +긞 +긞 +긞 +긞 +긞 + +긟 +긟 +긟 +긟 +긟 + +긠 +긠 +긠 +긠 +긠 + +긡 +긡 +긡 +긡 +긡 + +긢 +긢 +긢 +긢 +긢 + +긣 +긣 +긣 +긣 +긣 + +긤 +긤 +긤 +긤 +긤 + +긥 +긥 +긥 +긥 +긥 + +긦 +긦 +긦 +긦 +긦 + +긧 +긧 +긧 +긧 +긧 + +긨 +긨 +긨 +긨 +긨 + +긩 +긩 +긩 +긩 +긩 + +긪 +긪 +긪 +긪 +긪 + +긫 +긫 +긫 +긫 +긫 + +긬 +긬 +긬 +긬 +긬 + +긭 +긭 +긭 +긭 +긭 + +긮 +긮 +긮 +긮 +긮 + +긯 +긯 +긯 +긯 +긯 + +기 +기 +기 +기 +기 + +긱 +긱 +긱 +긱 +긱 + +긲 +긲 +긲 +긲 +긲 + +긳 +긳 +긳 +긳 +긳 + +긴 +긴 +긴 +긴 +긴 + +긵 +긵 +긵 +긵 +긵 + +긶 +긶 +긶 +긶 +긶 + +긷 +긷 +긷 +긷 +긷 + +길 +길 +길 +길 +길 + +긹 +긹 +긹 +긹 +긹 + +긺 +긺 +긺 +긺 +긺 + +긻 +긻 +긻 +긻 +긻 + +긼 +긼 +긼 +긼 +긼 + +긽 +긽 +긽 +긽 +긽 + +긾 +긾 +긾 +긾 +긾 + +긿 +긿 +긿 +긿 +긿 + +김 +김 +김 +김 +김 + +깁 +깁 +깁 +깁 +깁 + +깂 +깂 +깂 +깂 +깂 + +깃 +깃 +깃 +깃 +깃 + +깄 +깄 +깄 +깄 +깄 + +깅 +깅 +깅 +깅 +깅 + +깆 +깆 +깆 +깆 +깆 + +깇 +깇 +깇 +깇 +깇 + +깈 +깈 +깈 +깈 +깈 + +깉 +깉 +깉 +깉 +깉 + +깊 +깊 +깊 +깊 +깊 + +깋 +깋 +깋 +깋 +깋 + +까 +까 +까 +까 +까 + +깍 +깍 +깍 +깍 +깍 + +깎 +깎 +깎 +깎 +깎 + +깏 +깏 +깏 +깏 +깏 + +깐 +깐 +깐 +깐 +깐 + +깑 +깑 +깑 +깑 +깑 + +깒 +깒 +깒 +깒 +깒 + +깓 +깓 +깓 +깓 +깓 + +깔 +깔 +깔 +깔 +깔 + +깕 +깕 +깕 +깕 +깕 + +깖 +깖 +깖 +깖 +깖 + +깗 +깗 +깗 +깗 +깗 + +깘 +깘 +깘 +깘 +깘 + +깙 +깙 +깙 +깙 +깙 + +깚 +깚 +깚 +깚 +깚 + +깛 +깛 +깛 +깛 +깛 + +깜 +깜 +깜 +깜 +깜 + +깝 +깝 +깝 +깝 +깝 + +깞 +깞 +깞 +깞 +깞 + +깟 +깟 +깟 +깟 +깟 + +깠 +깠 +깠 +깠 +깠 + +깡 +깡 +깡 +깡 +깡 + +깢 +깢 +깢 +깢 +깢 + +깣 +깣 +깣 +깣 +깣 + +깤 +깤 +깤 +깤 +깤 + +깥 +깥 +깥 +깥 +깥 + +깦 +깦 +깦 +깦 +깦 + +깧 +깧 +깧 +깧 +깧 + +깨 +깨 +깨 +깨 +깨 + +깩 +깩 +깩 +깩 +깩 + +깪 +깪 +깪 +깪 +깪 + +깫 +깫 +깫 +깫 +깫 + +깬 +깬 +깬 +깬 +깬 + +깭 +깭 +깭 +깭 +깭 + +깮 +깮 +깮 +깮 +깮 + +깯 +깯 +깯 +깯 +깯 + +깰 +깰 +깰 +깰 +깰 + +깱 +깱 +깱 +깱 +깱 + +깲 +깲 +깲 +깲 +깲 + +깳 +깳 +깳 +깳 +깳 + +깴 +깴 +깴 +깴 +깴 + +깵 +깵 +깵 +깵 +깵 + +깶 +깶 +깶 +깶 +깶 + +깷 +깷 +깷 +깷 +깷 + +깸 +깸 +깸 +깸 +깸 + +깹 +깹 +깹 +깹 +깹 + +깺 +깺 +깺 +깺 +깺 + +깻 +깻 +깻 +깻 +깻 + +깼 +깼 +깼 +깼 +깼 + +깽 +깽 +깽 +깽 +깽 + +깾 +깾 +깾 +깾 +깾 + +깿 +깿 +깿 +깿 +깿 + +꺀 +꺀 +꺀 +꺀 +꺀 + +꺁 +꺁 +꺁 +꺁 +꺁 + +꺂 +꺂 +꺂 +꺂 +꺂 + +꺃 +꺃 +꺃 +꺃 +꺃 + +꺄 +꺄 +꺄 +꺄 +꺄 + +꺅 +꺅 +꺅 +꺅 +꺅 + +꺆 +꺆 +꺆 +꺆 +꺆 + +꺇 +꺇 +꺇 +꺇 +꺇 + +꺈 +꺈 +꺈 +꺈 +꺈 + +꺉 +꺉 +꺉 +꺉 +꺉 + +꺊 +꺊 +꺊 +꺊 +꺊 + +꺋 +꺋 +꺋 +꺋 +꺋 + +꺌 +꺌 +꺌 +꺌 +꺌 + +꺍 +꺍 +꺍 +꺍 +꺍 + +꺎 +꺎 +꺎 +꺎 +꺎 + +꺏 +꺏 +꺏 +꺏 +꺏 + +꺐 +꺐 +꺐 +꺐 +꺐 + +꺑 +꺑 +꺑 +꺑 +꺑 + +꺒 +꺒 +꺒 +꺒 +꺒 + +꺓 +꺓 +꺓 +꺓 +꺓 + +꺔 +꺔 +꺔 +꺔 +꺔 + +꺕 +꺕 +꺕 +꺕 +꺕 + +꺖 +꺖 +꺖 +꺖 +꺖 + +꺗 +꺗 +꺗 +꺗 +꺗 + +꺘 +꺘 +꺘 +꺘 +꺘 + +꺙 +꺙 +꺙 +꺙 +꺙 + +꺚 +꺚 +꺚 +꺚 +꺚 + +꺛 +꺛 +꺛 +꺛 +꺛 + +꺜 +꺜 +꺜 +꺜 +꺜 + +꺝 +꺝 +꺝 +꺝 +꺝 + +꺞 +꺞 +꺞 +꺞 +꺞 + +꺟 +꺟 +꺟 +꺟 +꺟 + +꺠 +꺠 +꺠 +꺠 +꺠 + +꺡 +꺡 +꺡 +꺡 +꺡 + +꺢 +꺢 +꺢 +꺢 +꺢 + +꺣 +꺣 +꺣 +꺣 +꺣 + +꺤 +꺤 +꺤 +꺤 +꺤 + +꺥 +꺥 +꺥 +꺥 +꺥 + +꺦 +꺦 +꺦 +꺦 +꺦 + +꺧 +꺧 +꺧 +꺧 +꺧 + +꺨 +꺨 +꺨 +꺨 +꺨 + +꺩 +꺩 +꺩 +꺩 +꺩 + +꺪 +꺪 +꺪 +꺪 +꺪 + +꺫 +꺫 +꺫 +꺫 +꺫 + +꺬 +꺬 +꺬 +꺬 +꺬 + +꺭 +꺭 +꺭 +꺭 +꺭 + +꺮 +꺮 +꺮 +꺮 +꺮 + +꺯 +꺯 +꺯 +꺯 +꺯 + +꺰 +꺰 +꺰 +꺰 +꺰 + +꺱 +꺱 +꺱 +꺱 +꺱 + +꺲 +꺲 +꺲 +꺲 +꺲 + +꺳 +꺳 +꺳 +꺳 +꺳 + +꺴 +꺴 +꺴 +꺴 +꺴 + +꺵 +꺵 +꺵 +꺵 +꺵 + +꺶 +꺶 +꺶 +꺶 +꺶 + +꺷 +꺷 +꺷 +꺷 +꺷 + +꺸 +꺸 +꺸 +꺸 +꺸 + +꺹 +꺹 +꺹 +꺹 +꺹 + +꺺 +꺺 +꺺 +꺺 +꺺 + +꺻 +꺻 +꺻 +꺻 +꺻 + +꺼 +꺼 +꺼 +꺼 +꺼 + +꺽 +꺽 +꺽 +꺽 +꺽 + +꺾 +꺾 +꺾 +꺾 +꺾 + +꺿 +꺿 +꺿 +꺿 +꺿 + +껀 +껀 +껀 +껀 +껀 + +껁 +껁 +껁 +껁 +껁 + +껂 +껂 +껂 +껂 +껂 + +껃 +껃 +껃 +껃 +껃 + +껄 +껄 +껄 +껄 +껄 + +껅 +껅 +껅 +껅 +껅 + +껆 +껆 +껆 +껆 +껆 + +껇 +껇 +껇 +껇 +껇 + +껈 +껈 +껈 +껈 +껈 + +껉 +껉 +껉 +껉 +껉 + +껊 +껊 +껊 +껊 +껊 + +껋 +껋 +껋 +껋 +껋 + +껌 +껌 +껌 +껌 +껌 + +껍 +껍 +껍 +껍 +껍 + +껎 +껎 +껎 +껎 +껎 + +껏 +껏 +껏 +껏 +껏 + +껐 +껐 +껐 +껐 +껐 + +껑 +껑 +껑 +껑 +껑 + +껒 +껒 +껒 +껒 +껒 + +껓 +껓 +껓 +껓 +껓 + +껔 +껔 +껔 +껔 +껔 + +껕 +껕 +껕 +껕 +껕 + +껖 +껖 +껖 +껖 +껖 + +껗 +껗 +껗 +껗 +껗 + +께 +께 +께 +께 +께 + +껙 +껙 +껙 +껙 +껙 + +껚 +껚 +껚 +껚 +껚 + +껛 +껛 +껛 +껛 +껛 + +껜 +껜 +껜 +껜 +껜 + +껝 +껝 +껝 +껝 +껝 + +껞 +껞 +껞 +껞 +껞 + +껟 +껟 +껟 +껟 +껟 + +껠 +껠 +껠 +껠 +껠 + +껡 +껡 +껡 +껡 +껡 + +껢 +껢 +껢 +껢 +껢 + +껣 +껣 +껣 +껣 +껣 + +껤 +껤 +껤 +껤 +껤 + +껥 +껥 +껥 +껥 +껥 + +껦 +껦 +껦 +껦 +껦 + +껧 +껧 +껧 +껧 +껧 + +껨 +껨 +껨 +껨 +껨 + +껩 +껩 +껩 +껩 +껩 + +껪 +껪 +껪 +껪 +껪 + +껫 +껫 +껫 +껫 +껫 + +껬 +껬 +껬 +껬 +껬 + +껭 +껭 +껭 +껭 +껭 + +껮 +껮 +껮 +껮 +껮 + +껯 +껯 +껯 +껯 +껯 + +껰 +껰 +껰 +껰 +껰 + +껱 +껱 +껱 +껱 +껱 + +껲 +껲 +껲 +껲 +껲 + +껳 +껳 +껳 +껳 +껳 + +껴 +껴 +껴 +껴 +껴 + +껵 +껵 +껵 +껵 +껵 + +껶 +껶 +껶 +껶 +껶 + +껷 +껷 +껷 +껷 +껷 + +껸 +껸 +껸 +껸 +껸 + +껹 +껹 +껹 +껹 +껹 + +껺 +껺 +껺 +껺 +껺 + +껻 +껻 +껻 +껻 +껻 + +껼 +껼 +껼 +껼 +껼 + +껽 +껽 +껽 +껽 +껽 + +껾 +껾 +껾 +껾 +껾 + +껿 +껿 +껿 +껿 +껿 + +꼀 +꼀 +꼀 +꼀 +꼀 + +꼁 +꼁 +꼁 +꼁 +꼁 + +꼂 +꼂 +꼂 +꼂 +꼂 + +꼃 +꼃 +꼃 +꼃 +꼃 + +꼄 +꼄 +꼄 +꼄 +꼄 + +꼅 +꼅 +꼅 +꼅 +꼅 + +꼆 +꼆 +꼆 +꼆 +꼆 + +꼇 +꼇 +꼇 +꼇 +꼇 + +꼈 +꼈 +꼈 +꼈 +꼈 + +꼉 +꼉 +꼉 +꼉 +꼉 + +꼊 +꼊 +꼊 +꼊 +꼊 + +꼋 +꼋 +꼋 +꼋 +꼋 + +꼌 +꼌 +꼌 +꼌 +꼌 + +꼍 +꼍 +꼍 +꼍 +꼍 + +꼎 +꼎 +꼎 +꼎 +꼎 + +꼏 +꼏 +꼏 +꼏 +꼏 + +꼐 +꼐 +꼐 +꼐 +꼐 + +꼑 +꼑 +꼑 +꼑 +꼑 + +꼒 +꼒 +꼒 +꼒 +꼒 + +꼓 +꼓 +꼓 +꼓 +꼓 + +꼔 +꼔 +꼔 +꼔 +꼔 + +꼕 +꼕 +꼕 +꼕 +꼕 + +꼖 +꼖 +꼖 +꼖 +꼖 + +꼗 +꼗 +꼗 +꼗 +꼗 + +꼘 +꼘 +꼘 +꼘 +꼘 + +꼙 +꼙 +꼙 +꼙 +꼙 + +꼚 +꼚 +꼚 +꼚 +꼚 + +꼛 +꼛 +꼛 +꼛 +꼛 + +꼜 +꼜 +꼜 +꼜 +꼜 + +꼝 +꼝 +꼝 +꼝 +꼝 + +꼞 +꼞 +꼞 +꼞 +꼞 + +꼟 +꼟 +꼟 +꼟 +꼟 + +꼠 +꼠 +꼠 +꼠 +꼠 + +꼡 +꼡 +꼡 +꼡 +꼡 + +꼢 +꼢 +꼢 +꼢 +꼢 + +꼣 +꼣 +꼣 +꼣 +꼣 + +꼤 +꼤 +꼤 +꼤 +꼤 + +꼥 +꼥 +꼥 +꼥 +꼥 + +꼦 +꼦 +꼦 +꼦 +꼦 + +꼧 +꼧 +꼧 +꼧 +꼧 + +꼨 +꼨 +꼨 +꼨 +꼨 + +꼩 +꼩 +꼩 +꼩 +꼩 + +꼪 +꼪 +꼪 +꼪 +꼪 + +꼫 +꼫 +꼫 +꼫 +꼫 + +꼬 +꼬 +꼬 +꼬 +꼬 + +꼭 +꼭 +꼭 +꼭 +꼭 + +꼮 +꼮 +꼮 +꼮 +꼮 + +꼯 +꼯 +꼯 +꼯 +꼯 + +꼰 +꼰 +꼰 +꼰 +꼰 + +꼱 +꼱 +꼱 +꼱 +꼱 + +꼲 +꼲 +꼲 +꼲 +꼲 + +꼳 +꼳 +꼳 +꼳 +꼳 + +꼴 +꼴 +꼴 +꼴 +꼴 + +꼵 +꼵 +꼵 +꼵 +꼵 + +꼶 +꼶 +꼶 +꼶 +꼶 + +꼷 +꼷 +꼷 +꼷 +꼷 + +꼸 +꼸 +꼸 +꼸 +꼸 + +꼹 +꼹 +꼹 +꼹 +꼹 + +꼺 +꼺 +꼺 +꼺 +꼺 + +꼻 +꼻 +꼻 +꼻 +꼻 + +꼼 +꼼 +꼼 +꼼 +꼼 + +꼽 +꼽 +꼽 +꼽 +꼽 + +꼾 +꼾 +꼾 +꼾 +꼾 + +꼿 +꼿 +꼿 +꼿 +꼿 + +꽀 +꽀 +꽀 +꽀 +꽀 + +꽁 +꽁 +꽁 +꽁 +꽁 + +꽂 +꽂 +꽂 +꽂 +꽂 + +꽃 +꽃 +꽃 +꽃 +꽃 + +꽄 +꽄 +꽄 +꽄 +꽄 + +꽅 +꽅 +꽅 +꽅 +꽅 + +꽆 +꽆 +꽆 +꽆 +꽆 + +꽇 +꽇 +꽇 +꽇 +꽇 + +꽈 +꽈 +꽈 +꽈 +꽈 + +꽉 +꽉 +꽉 +꽉 +꽉 + +꽊 +꽊 +꽊 +꽊 +꽊 + +꽋 +꽋 +꽋 +꽋 +꽋 + +꽌 +꽌 +꽌 +꽌 +꽌 + +꽍 +꽍 +꽍 +꽍 +꽍 + +꽎 +꽎 +꽎 +꽎 +꽎 + +꽏 +꽏 +꽏 +꽏 +꽏 + +꽐 +꽐 +꽐 +꽐 +꽐 + +꽑 +꽑 +꽑 +꽑 +꽑 + +꽒 +꽒 +꽒 +꽒 +꽒 + +꽓 +꽓 +꽓 +꽓 +꽓 + +꽔 +꽔 +꽔 +꽔 +꽔 + +꽕 +꽕 +꽕 +꽕 +꽕 + +꽖 +꽖 +꽖 +꽖 +꽖 + +꽗 +꽗 +꽗 +꽗 +꽗 + +꽘 +꽘 +꽘 +꽘 +꽘 + +꽙 +꽙 +꽙 +꽙 +꽙 + +꽚 +꽚 +꽚 +꽚 +꽚 + +꽛 +꽛 +꽛 +꽛 +꽛 + +꽜 +꽜 +꽜 +꽜 +꽜 + +꽝 +꽝 +꽝 +꽝 +꽝 + +꽞 +꽞 +꽞 +꽞 +꽞 + +꽟 +꽟 +꽟 +꽟 +꽟 + +꽠 +꽠 +꽠 +꽠 +꽠 + +꽡 +꽡 +꽡 +꽡 +꽡 + +꽢 +꽢 +꽢 +꽢 +꽢 + +꽣 +꽣 +꽣 +꽣 +꽣 + +꽤 +꽤 +꽤 +꽤 +꽤 + +꽥 +꽥 +꽥 +꽥 +꽥 + +꽦 +꽦 +꽦 +꽦 +꽦 + +꽧 +꽧 +꽧 +꽧 +꽧 + +꽨 +꽨 +꽨 +꽨 +꽨 + +꽩 +꽩 +꽩 +꽩 +꽩 + +꽪 +꽪 +꽪 +꽪 +꽪 + +꽫 +꽫 +꽫 +꽫 +꽫 + +꽬 +꽬 +꽬 +꽬 +꽬 + +꽭 +꽭 +꽭 +꽭 +꽭 + +꽮 +꽮 +꽮 +꽮 +꽮 + +꽯 +꽯 +꽯 +꽯 +꽯 + +꽰 +꽰 +꽰 +꽰 +꽰 + +꽱 +꽱 +꽱 +꽱 +꽱 + +꽲 +꽲 +꽲 +꽲 +꽲 + +꽳 +꽳 +꽳 +꽳 +꽳 + +꽴 +꽴 +꽴 +꽴 +꽴 + +꽵 +꽵 +꽵 +꽵 +꽵 + +꽶 +꽶 +꽶 +꽶 +꽶 + +꽷 +꽷 +꽷 +꽷 +꽷 + +꽸 +꽸 +꽸 +꽸 +꽸 + +꽹 +꽹 +꽹 +꽹 +꽹 + +꽺 +꽺 +꽺 +꽺 +꽺 + +꽻 +꽻 +꽻 +꽻 +꽻 + +꽼 +꽼 +꽼 +꽼 +꽼 + +꽽 +꽽 +꽽 +꽽 +꽽 + +꽾 +꽾 +꽾 +꽾 +꽾 + +꽿 +꽿 +꽿 +꽿 +꽿 + +꾀 +꾀 +꾀 +꾀 +꾀 + +꾁 +꾁 +꾁 +꾁 +꾁 + +꾂 +꾂 +꾂 +꾂 +꾂 + +꾃 +꾃 +꾃 +꾃 +꾃 + +꾄 +꾄 +꾄 +꾄 +꾄 + +꾅 +꾅 +꾅 +꾅 +꾅 + +꾆 +꾆 +꾆 +꾆 +꾆 + +꾇 +꾇 +꾇 +꾇 +꾇 + +꾈 +꾈 +꾈 +꾈 +꾈 + +꾉 +꾉 +꾉 +꾉 +꾉 + +꾊 +꾊 +꾊 +꾊 +꾊 + +꾋 +꾋 +꾋 +꾋 +꾋 + +꾌 +꾌 +꾌 +꾌 +꾌 + +꾍 +꾍 +꾍 +꾍 +꾍 + +꾎 +꾎 +꾎 +꾎 +꾎 + +꾏 +꾏 +꾏 +꾏 +꾏 + +꾐 +꾐 +꾐 +꾐 +꾐 + +꾑 +꾑 +꾑 +꾑 +꾑 + +꾒 +꾒 +꾒 +꾒 +꾒 + +꾓 +꾓 +꾓 +꾓 +꾓 + +꾔 +꾔 +꾔 +꾔 +꾔 + +꾕 +꾕 +꾕 +꾕 +꾕 + +꾖 +꾖 +꾖 +꾖 +꾖 + +꾗 +꾗 +꾗 +꾗 +꾗 + +꾘 +꾘 +꾘 +꾘 +꾘 + +꾙 +꾙 +꾙 +꾙 +꾙 + +꾚 +꾚 +꾚 +꾚 +꾚 + +꾛 +꾛 +꾛 +꾛 +꾛 + +꾜 +꾜 +꾜 +꾜 +꾜 + +꾝 +꾝 +꾝 +꾝 +꾝 + +꾞 +꾞 +꾞 +꾞 +꾞 + +꾟 +꾟 +꾟 +꾟 +꾟 + +꾠 +꾠 +꾠 +꾠 +꾠 + +꾡 +꾡 +꾡 +꾡 +꾡 + +꾢 +꾢 +꾢 +꾢 +꾢 + +꾣 +꾣 +꾣 +꾣 +꾣 + +꾤 +꾤 +꾤 +꾤 +꾤 + +꾥 +꾥 +꾥 +꾥 +꾥 + +꾦 +꾦 +꾦 +꾦 +꾦 + +꾧 +꾧 +꾧 +꾧 +꾧 + +꾨 +꾨 +꾨 +꾨 +꾨 + +꾩 +꾩 +꾩 +꾩 +꾩 + +꾪 +꾪 +꾪 +꾪 +꾪 + +꾫 +꾫 +꾫 +꾫 +꾫 + +꾬 +꾬 +꾬 +꾬 +꾬 + +꾭 +꾭 +꾭 +꾭 +꾭 + +꾮 +꾮 +꾮 +꾮 +꾮 + +꾯 +꾯 +꾯 +꾯 +꾯 + +꾰 +꾰 +꾰 +꾰 +꾰 + +꾱 +꾱 +꾱 +꾱 +꾱 + +꾲 +꾲 +꾲 +꾲 +꾲 + +꾳 +꾳 +꾳 +꾳 +꾳 + +꾴 +꾴 +꾴 +꾴 +꾴 + +꾵 +꾵 +꾵 +꾵 +꾵 + +꾶 +꾶 +꾶 +꾶 +꾶 + +꾷 +꾷 +꾷 +꾷 +꾷 + +꾸 +꾸 +꾸 +꾸 +꾸 + +꾹 +꾹 +꾹 +꾹 +꾹 + +꾺 +꾺 +꾺 +꾺 +꾺 + +꾻 +꾻 +꾻 +꾻 +꾻 + +꾼 +꾼 +꾼 +꾼 +꾼 + +꾽 +꾽 +꾽 +꾽 +꾽 + +꾾 +꾾 +꾾 +꾾 +꾾 + +꾿 +꾿 +꾿 +꾿 +꾿 + +꿀 +꿀 +꿀 +꿀 +꿀 + +꿁 +꿁 +꿁 +꿁 +꿁 + +꿂 +꿂 +꿂 +꿂 +꿂 + +꿃 +꿃 +꿃 +꿃 +꿃 + +꿄 +꿄 +꿄 +꿄 +꿄 + +꿅 +꿅 +꿅 +꿅 +꿅 + +꿆 +꿆 +꿆 +꿆 +꿆 + +꿇 +꿇 +꿇 +꿇 +꿇 + +꿈 +꿈 +꿈 +꿈 +꿈 + +꿉 +꿉 +꿉 +꿉 +꿉 + +꿊 +꿊 +꿊 +꿊 +꿊 + +꿋 +꿋 +꿋 +꿋 +꿋 + +꿌 +꿌 +꿌 +꿌 +꿌 + +꿍 +꿍 +꿍 +꿍 +꿍 + +꿎 +꿎 +꿎 +꿎 +꿎 + +꿏 +꿏 +꿏 +꿏 +꿏 + +꿐 +꿐 +꿐 +꿐 +꿐 + +꿑 +꿑 +꿑 +꿑 +꿑 + +꿒 +꿒 +꿒 +꿒 +꿒 + +꿓 +꿓 +꿓 +꿓 +꿓 + +꿔 +꿔 +꿔 +꿔 +꿔 + +꿕 +꿕 +꿕 +꿕 +꿕 + +꿖 +꿖 +꿖 +꿖 +꿖 + +꿗 +꿗 +꿗 +꿗 +꿗 + +꿘 +꿘 +꿘 +꿘 +꿘 + +꿙 +꿙 +꿙 +꿙 +꿙 + +꿚 +꿚 +꿚 +꿚 +꿚 + +꿛 +꿛 +꿛 +꿛 +꿛 + +꿜 +꿜 +꿜 +꿜 +꿜 + +꿝 +꿝 +꿝 +꿝 +꿝 + +꿞 +꿞 +꿞 +꿞 +꿞 + +꿟 +꿟 +꿟 +꿟 +꿟 + +꿠 +꿠 +꿠 +꿠 +꿠 + +꿡 +꿡 +꿡 +꿡 +꿡 + +꿢 +꿢 +꿢 +꿢 +꿢 + +꿣 +꿣 +꿣 +꿣 +꿣 + +꿤 +꿤 +꿤 +꿤 +꿤 + +꿥 +꿥 +꿥 +꿥 +꿥 + +꿦 +꿦 +꿦 +꿦 +꿦 + +꿧 +꿧 +꿧 +꿧 +꿧 + +꿨 +꿨 +꿨 +꿨 +꿨 + +꿩 +꿩 +꿩 +꿩 +꿩 + +꿪 +꿪 +꿪 +꿪 +꿪 + +꿫 +꿫 +꿫 +꿫 +꿫 + +꿬 +꿬 +꿬 +꿬 +꿬 + +꿭 +꿭 +꿭 +꿭 +꿭 + +꿮 +꿮 +꿮 +꿮 +꿮 + +꿯 +꿯 +꿯 +꿯 +꿯 + +꿰 +꿰 +꿰 +꿰 +꿰 + +꿱 +꿱 +꿱 +꿱 +꿱 + +꿲 +꿲 +꿲 +꿲 +꿲 + +꿳 +꿳 +꿳 +꿳 +꿳 + +꿴 +꿴 +꿴 +꿴 +꿴 + +꿵 +꿵 +꿵 +꿵 +꿵 + +꿶 +꿶 +꿶 +꿶 +꿶 + +꿷 +꿷 +꿷 +꿷 +꿷 + +꿸 +꿸 +꿸 +꿸 +꿸 + +꿹 +꿹 +꿹 +꿹 +꿹 + +꿺 +꿺 +꿺 +꿺 +꿺 + +꿻 +꿻 +꿻 +꿻 +꿻 + +꿼 +꿼 +꿼 +꿼 +꿼 + +꿽 +꿽 +꿽 +꿽 +꿽 + +꿾 +꿾 +꿾 +꿾 +꿾 + +꿿 +꿿 +꿿 +꿿 +꿿 + +뀀 +뀀 +뀀 +뀀 +뀀 + +뀁 +뀁 +뀁 +뀁 +뀁 + +뀂 +뀂 +뀂 +뀂 +뀂 + +뀃 +뀃 +뀃 +뀃 +뀃 + +뀄 +뀄 +뀄 +뀄 +뀄 + +뀅 +뀅 +뀅 +뀅 +뀅 + +뀆 +뀆 +뀆 +뀆 +뀆 + +뀇 +뀇 +뀇 +뀇 +뀇 + +뀈 +뀈 +뀈 +뀈 +뀈 + +뀉 +뀉 +뀉 +뀉 +뀉 + +뀊 +뀊 +뀊 +뀊 +뀊 + +뀋 +뀋 +뀋 +뀋 +뀋 + +뀌 +뀌 +뀌 +뀌 +뀌 + +뀍 +뀍 +뀍 +뀍 +뀍 + +뀎 +뀎 +뀎 +뀎 +뀎 + +뀏 +뀏 +뀏 +뀏 +뀏 + +뀐 +뀐 +뀐 +뀐 +뀐 + +뀑 +뀑 +뀑 +뀑 +뀑 + +뀒 +뀒 +뀒 +뀒 +뀒 + +뀓 +뀓 +뀓 +뀓 +뀓 + +뀔 +뀔 +뀔 +뀔 +뀔 + +뀕 +뀕 +뀕 +뀕 +뀕 + +뀖 +뀖 +뀖 +뀖 +뀖 + +뀗 +뀗 +뀗 +뀗 +뀗 + +뀘 +뀘 +뀘 +뀘 +뀘 + +뀙 +뀙 +뀙 +뀙 +뀙 + +뀚 +뀚 +뀚 +뀚 +뀚 + +뀛 +뀛 +뀛 +뀛 +뀛 + +뀜 +뀜 +뀜 +뀜 +뀜 + +뀝 +뀝 +뀝 +뀝 +뀝 + +뀞 +뀞 +뀞 +뀞 +뀞 + +뀟 +뀟 +뀟 +뀟 +뀟 + +뀠 +뀠 +뀠 +뀠 +뀠 + +뀡 +뀡 +뀡 +뀡 +뀡 + +뀢 +뀢 +뀢 +뀢 +뀢 + +뀣 +뀣 +뀣 +뀣 +뀣 + +뀤 +뀤 +뀤 +뀤 +뀤 + +뀥 +뀥 +뀥 +뀥 +뀥 + +뀦 +뀦 +뀦 +뀦 +뀦 + +뀧 +뀧 +뀧 +뀧 +뀧 + +뀨 +뀨 +뀨 +뀨 +뀨 + +뀩 +뀩 +뀩 +뀩 +뀩 + +뀪 +뀪 +뀪 +뀪 +뀪 + +뀫 +뀫 +뀫 +뀫 +뀫 + +뀬 +뀬 +뀬 +뀬 +뀬 + +뀭 +뀭 +뀭 +뀭 +뀭 + +뀮 +뀮 +뀮 +뀮 +뀮 + +뀯 +뀯 +뀯 +뀯 +뀯 + +뀰 +뀰 +뀰 +뀰 +뀰 + +뀱 +뀱 +뀱 +뀱 +뀱 + +뀲 +뀲 +뀲 +뀲 +뀲 + +뀳 +뀳 +뀳 +뀳 +뀳 + +뀴 +뀴 +뀴 +뀴 +뀴 + +뀵 +뀵 +뀵 +뀵 +뀵 + +뀶 +뀶 +뀶 +뀶 +뀶 + +뀷 +뀷 +뀷 +뀷 +뀷 + +뀸 +뀸 +뀸 +뀸 +뀸 + +뀹 +뀹 +뀹 +뀹 +뀹 + +뀺 +뀺 +뀺 +뀺 +뀺 + +뀻 +뀻 +뀻 +뀻 +뀻 + +뀼 +뀼 +뀼 +뀼 +뀼 + +뀽 +뀽 +뀽 +뀽 +뀽 + +뀾 +뀾 +뀾 +뀾 +뀾 + +뀿 +뀿 +뀿 +뀿 +뀿 + +끀 +끀 +끀 +끀 +끀 + +끁 +끁 +끁 +끁 +끁 + +끂 +끂 +끂 +끂 +끂 + +끃 +끃 +끃 +끃 +끃 + +끄 +끄 +끄 +끄 +끄 + +끅 +끅 +끅 +끅 +끅 + +끆 +끆 +끆 +끆 +끆 + +끇 +끇 +끇 +끇 +끇 + +끈 +끈 +끈 +끈 +끈 + +끉 +끉 +끉 +끉 +끉 + +끊 +끊 +끊 +끊 +끊 + +끋 +끋 +끋 +끋 +끋 + +끌 +끌 +끌 +끌 +끌 + +끍 +끍 +끍 +끍 +끍 + +끎 +끎 +끎 +끎 +끎 + +끏 +끏 +끏 +끏 +끏 + +끐 +끐 +끐 +끐 +끐 + +끑 +끑 +끑 +끑 +끑 + +끒 +끒 +끒 +끒 +끒 + +끓 +끓 +끓 +끓 +끓 + +끔 +끔 +끔 +끔 +끔 + +끕 +끕 +끕 +끕 +끕 + +끖 +끖 +끖 +끖 +끖 + +끗 +끗 +끗 +끗 +끗 + +끘 +끘 +끘 +끘 +끘 + +끙 +끙 +끙 +끙 +끙 + +끚 +끚 +끚 +끚 +끚 + +끛 +끛 +끛 +끛 +끛 + +끜 +끜 +끜 +끜 +끜 + +끝 +끝 +끝 +끝 +끝 + +끞 +끞 +끞 +끞 +끞 + +끟 +끟 +끟 +끟 +끟 + +끠 +끠 +끠 +끠 +끠 + +끡 +끡 +끡 +끡 +끡 + +끢 +끢 +끢 +끢 +끢 + +끣 +끣 +끣 +끣 +끣 + +끤 +끤 +끤 +끤 +끤 + +끥 +끥 +끥 +끥 +끥 + +끦 +끦 +끦 +끦 +끦 + +끧 +끧 +끧 +끧 +끧 + +끨 +끨 +끨 +끨 +끨 + +끩 +끩 +끩 +끩 +끩 + +끪 +끪 +끪 +끪 +끪 + +끫 +끫 +끫 +끫 +끫 + +끬 +끬 +끬 +끬 +끬 + +끭 +끭 +끭 +끭 +끭 + +끮 +끮 +끮 +끮 +끮 + +끯 +끯 +끯 +끯 +끯 + +끰 +끰 +끰 +끰 +끰 + +끱 +끱 +끱 +끱 +끱 + +끲 +끲 +끲 +끲 +끲 + +끳 +끳 +끳 +끳 +끳 + +끴 +끴 +끴 +끴 +끴 + +끵 +끵 +끵 +끵 +끵 + +끶 +끶 +끶 +끶 +끶 + +끷 +끷 +끷 +끷 +끷 + +끸 +끸 +끸 +끸 +끸 + +끹 +끹 +끹 +끹 +끹 + +끺 +끺 +끺 +끺 +끺 + +끻 +끻 +끻 +끻 +끻 + +끼 +끼 +끼 +끼 +끼 + +끽 +끽 +끽 +끽 +끽 + +끾 +끾 +끾 +끾 +끾 + +끿 +끿 +끿 +끿 +끿 + +낀 +낀 +낀 +낀 +낀 + +낁 +낁 +낁 +낁 +낁 + +낂 +낂 +낂 +낂 +낂 + +낃 +낃 +낃 +낃 +낃 + +낄 +낄 +낄 +낄 +낄 + +낅 +낅 +낅 +낅 +낅 + +낆 +낆 +낆 +낆 +낆 + +낇 +낇 +낇 +낇 +낇 + +낈 +낈 +낈 +낈 +낈 + +낉 +낉 +낉 +낉 +낉 + +낊 +낊 +낊 +낊 +낊 + +낋 +낋 +낋 +낋 +낋 + +낌 +낌 +낌 +낌 +낌 + +낍 +낍 +낍 +낍 +낍 + +낎 +낎 +낎 +낎 +낎 + +낏 +낏 +낏 +낏 +낏 + +낐 +낐 +낐 +낐 +낐 + +낑 +낑 +낑 +낑 +낑 + +낒 +낒 +낒 +낒 +낒 + +낓 +낓 +낓 +낓 +낓 + +낔 +낔 +낔 +낔 +낔 + +낕 +낕 +낕 +낕 +낕 + +낖 +낖 +낖 +낖 +낖 + +낗 +낗 +낗 +낗 +낗 + +나 +나 +나 +나 +나 + +낙 +낙 +낙 +낙 +낙 + +낚 +낚 +낚 +낚 +낚 + +낛 +낛 +낛 +낛 +낛 + +난 +난 +난 +난 +난 + +낝 +낝 +낝 +낝 +낝 + +낞 +낞 +낞 +낞 +낞 + +낟 +낟 +낟 +낟 +낟 + +날 +날 +날 +날 +날 + +낡 +낡 +낡 +낡 +낡 + +낢 +낢 +낢 +낢 +낢 + +낣 +낣 +낣 +낣 +낣 + +낤 +낤 +낤 +낤 +낤 + +낥 +낥 +낥 +낥 +낥 + +낦 +낦 +낦 +낦 +낦 + +낧 +낧 +낧 +낧 +낧 + +남 +남 +남 +남 +남 + +납 +납 +납 +납 +납 + +낪 +낪 +낪 +낪 +낪 + +낫 +낫 +낫 +낫 +낫 + +났 +났 +났 +났 +났 + +낭 +낭 +낭 +낭 +낭 + +낮 +낮 +낮 +낮 +낮 + +낯 +낯 +낯 +낯 +낯 + +낰 +낰 +낰 +낰 +낰 + +낱 +낱 +낱 +낱 +낱 + +낲 +낲 +낲 +낲 +낲 + +낳 +낳 +낳 +낳 +낳 + +내 +내 +내 +내 +내 + +낵 +낵 +낵 +낵 +낵 + +낶 +낶 +낶 +낶 +낶 + +낷 +낷 +낷 +낷 +낷 + +낸 +낸 +낸 +낸 +낸 + +낹 +낹 +낹 +낹 +낹 + +낺 +낺 +낺 +낺 +낺 + +낻 +낻 +낻 +낻 +낻 + +낼 +낼 +낼 +낼 +낼 + +낽 +낽 +낽 +낽 +낽 + +낾 +낾 +낾 +낾 +낾 + +낿 +낿 +낿 +낿 +낿 + +냀 +냀 +냀 +냀 +냀 + +냁 +냁 +냁 +냁 +냁 + +냂 +냂 +냂 +냂 +냂 + +냃 +냃 +냃 +냃 +냃 + +냄 +냄 +냄 +냄 +냄 + +냅 +냅 +냅 +냅 +냅 + +냆 +냆 +냆 +냆 +냆 + +냇 +냇 +냇 +냇 +냇 + +냈 +냈 +냈 +냈 +냈 + +냉 +냉 +냉 +냉 +냉 + +냊 +냊 +냊 +냊 +냊 + +냋 +냋 +냋 +냋 +냋 + +냌 +냌 +냌 +냌 +냌 + +냍 +냍 +냍 +냍 +냍 + +냎 +냎 +냎 +냎 +냎 + +냏 +냏 +냏 +냏 +냏 + +냐 +냐 +냐 +냐 +냐 + +냑 +냑 +냑 +냑 +냑 + +냒 +냒 +냒 +냒 +냒 + +냓 +냓 +냓 +냓 +냓 + +냔 +냔 +냔 +냔 +냔 + +냕 +냕 +냕 +냕 +냕 + +냖 +냖 +냖 +냖 +냖 + +냗 +냗 +냗 +냗 +냗 + +냘 +냘 +냘 +냘 +냘 + +냙 +냙 +냙 +냙 +냙 + +냚 +냚 +냚 +냚 +냚 + +냛 +냛 +냛 +냛 +냛 + +냜 +냜 +냜 +냜 +냜 + +냝 +냝 +냝 +냝 +냝 + +냞 +냞 +냞 +냞 +냞 + +냟 +냟 +냟 +냟 +냟 + +냠 +냠 +냠 +냠 +냠 + +냡 +냡 +냡 +냡 +냡 + +냢 +냢 +냢 +냢 +냢 + +냣 +냣 +냣 +냣 +냣 + +냤 +냤 +냤 +냤 +냤 + +냥 +냥 +냥 +냥 +냥 + +냦 +냦 +냦 +냦 +냦 + +냧 +냧 +냧 +냧 +냧 + +냨 +냨 +냨 +냨 +냨 + +냩 +냩 +냩 +냩 +냩 + +냪 +냪 +냪 +냪 +냪 + +냫 +냫 +냫 +냫 +냫 + +냬 +냬 +냬 +냬 +냬 + +냭 +냭 +냭 +냭 +냭 + +냮 +냮 +냮 +냮 +냮 + +냯 +냯 +냯 +냯 +냯 + +냰 +냰 +냰 +냰 +냰 + +냱 +냱 +냱 +냱 +냱 + +냲 +냲 +냲 +냲 +냲 + +냳 +냳 +냳 +냳 +냳 + +냴 +냴 +냴 +냴 +냴 + +냵 +냵 +냵 +냵 +냵 + +냶 +냶 +냶 +냶 +냶 + +냷 +냷 +냷 +냷 +냷 + +냸 +냸 +냸 +냸 +냸 + +냹 +냹 +냹 +냹 +냹 + +냺 +냺 +냺 +냺 +냺 + +냻 +냻 +냻 +냻 +냻 + +냼 +냼 +냼 +냼 +냼 + +냽 +냽 +냽 +냽 +냽 + +냾 +냾 +냾 +냾 +냾 + +냿 +냿 +냿 +냿 +냿 + +넀 +넀 +넀 +넀 +넀 + +넁 +넁 +넁 +넁 +넁 + +넂 +넂 +넂 +넂 +넂 + +넃 +넃 +넃 +넃 +넃 + +넄 +넄 +넄 +넄 +넄 + +넅 +넅 +넅 +넅 +넅 + +넆 +넆 +넆 +넆 +넆 + +넇 +넇 +넇 +넇 +넇 + +너 +너 +너 +너 +너 + +넉 +넉 +넉 +넉 +넉 + +넊 +넊 +넊 +넊 +넊 + +넋 +넋 +넋 +넋 +넋 + +넌 +넌 +넌 +넌 +넌 + +넍 +넍 +넍 +넍 +넍 + +넎 +넎 +넎 +넎 +넎 + +넏 +넏 +넏 +넏 +넏 + +널 +널 +널 +널 +널 + +넑 +넑 +넑 +넑 +넑 + +넒 +넒 +넒 +넒 +넒 + +넓 +넓 +넓 +넓 +넓 + +넔 +넔 +넔 +넔 +넔 + +넕 +넕 +넕 +넕 +넕 + +넖 +넖 +넖 +넖 +넖 + +넗 +넗 +넗 +넗 +넗 + +넘 +넘 +넘 +넘 +넘 + +넙 +넙 +넙 +넙 +넙 + +넚 +넚 +넚 +넚 +넚 + +넛 +넛 +넛 +넛 +넛 + +넜 +넜 +넜 +넜 +넜 + +넝 +넝 +넝 +넝 +넝 + +넞 +넞 +넞 +넞 +넞 + +넟 +넟 +넟 +넟 +넟 + +넠 +넠 +넠 +넠 +넠 + +넡 +넡 +넡 +넡 +넡 + +넢 +넢 +넢 +넢 +넢 + +넣 +넣 +넣 +넣 +넣 + +네 +네 +네 +네 +네 + +넥 +넥 +넥 +넥 +넥 + +넦 +넦 +넦 +넦 +넦 + +넧 +넧 +넧 +넧 +넧 + +넨 +넨 +넨 +넨 +넨 + +넩 +넩 +넩 +넩 +넩 + +넪 +넪 +넪 +넪 +넪 + +넫 +넫 +넫 +넫 +넫 + +넬 +넬 +넬 +넬 +넬 + +넭 +넭 +넭 +넭 +넭 + +넮 +넮 +넮 +넮 +넮 + +넯 +넯 +넯 +넯 +넯 + +넰 +넰 +넰 +넰 +넰 + +넱 +넱 +넱 +넱 +넱 + +넲 +넲 +넲 +넲 +넲 + +넳 +넳 +넳 +넳 +넳 + +넴 +넴 +넴 +넴 +넴 + +넵 +넵 +넵 +넵 +넵 + +넶 +넶 +넶 +넶 +넶 + +넷 +넷 +넷 +넷 +넷 + +넸 +넸 +넸 +넸 +넸 + +넹 +넹 +넹 +넹 +넹 + +넺 +넺 +넺 +넺 +넺 + +넻 +넻 +넻 +넻 +넻 + +넼 +넼 +넼 +넼 +넼 + +넽 +넽 +넽 +넽 +넽 + +넾 +넾 +넾 +넾 +넾 + +넿 +넿 +넿 +넿 +넿 + +녀 +녀 +녀 +녀 +녀 + +녁 +녁 +녁 +녁 +녁 + +녂 +녂 +녂 +녂 +녂 + +녃 +녃 +녃 +녃 +녃 + +년 +년 +년 +년 +년 + +녅 +녅 +녅 +녅 +녅 + +녆 +녆 +녆 +녆 +녆 + +녇 +녇 +녇 +녇 +녇 + +녈 +녈 +녈 +녈 +녈 + +녉 +녉 +녉 +녉 +녉 + +녊 +녊 +녊 +녊 +녊 + +녋 +녋 +녋 +녋 +녋 + +녌 +녌 +녌 +녌 +녌 + +녍 +녍 +녍 +녍 +녍 + +녎 +녎 +녎 +녎 +녎 + +녏 +녏 +녏 +녏 +녏 + +념 +념 +념 +념 +념 + +녑 +녑 +녑 +녑 +녑 + +녒 +녒 +녒 +녒 +녒 + +녓 +녓 +녓 +녓 +녓 + +녔 +녔 +녔 +녔 +녔 + +녕 +녕 +녕 +녕 +녕 + +녖 +녖 +녖 +녖 +녖 + +녗 +녗 +녗 +녗 +녗 + +녘 +녘 +녘 +녘 +녘 + +녙 +녙 +녙 +녙 +녙 + +녚 +녚 +녚 +녚 +녚 + +녛 +녛 +녛 +녛 +녛 + +녜 +녜 +녜 +녜 +녜 + +녝 +녝 +녝 +녝 +녝 + +녞 +녞 +녞 +녞 +녞 + +녟 +녟 +녟 +녟 +녟 + +녠 +녠 +녠 +녠 +녠 + +녡 +녡 +녡 +녡 +녡 + +녢 +녢 +녢 +녢 +녢 + +녣 +녣 +녣 +녣 +녣 + +녤 +녤 +녤 +녤 +녤 + +녥 +녥 +녥 +녥 +녥 + +녦 +녦 +녦 +녦 +녦 + +녧 +녧 +녧 +녧 +녧 + +녨 +녨 +녨 +녨 +녨 + +녩 +녩 +녩 +녩 +녩 + +녪 +녪 +녪 +녪 +녪 + +녫 +녫 +녫 +녫 +녫 + +녬 +녬 +녬 +녬 +녬 + +녭 +녭 +녭 +녭 +녭 + +녮 +녮 +녮 +녮 +녮 + +녯 +녯 +녯 +녯 +녯 + +녰 +녰 +녰 +녰 +녰 + +녱 +녱 +녱 +녱 +녱 + +녲 +녲 +녲 +녲 +녲 + +녳 +녳 +녳 +녳 +녳 + +녴 +녴 +녴 +녴 +녴 + +녵 +녵 +녵 +녵 +녵 + +녶 +녶 +녶 +녶 +녶 + +녷 +녷 +녷 +녷 +녷 + +노 +노 +노 +노 +노 + +녹 +녹 +녹 +녹 +녹 + +녺 +녺 +녺 +녺 +녺 + +녻 +녻 +녻 +녻 +녻 + +논 +논 +논 +논 +논 + +녽 +녽 +녽 +녽 +녽 + +녾 +녾 +녾 +녾 +녾 + +녿 +녿 +녿 +녿 +녿 + +놀 +놀 +놀 +놀 +놀 + +놁 +놁 +놁 +놁 +놁 + +놂 +놂 +놂 +놂 +놂 + +놃 +놃 +놃 +놃 +놃 + +놄 +놄 +놄 +놄 +놄 + +놅 +놅 +놅 +놅 +놅 + +놆 +놆 +놆 +놆 +놆 + +놇 +놇 +놇 +놇 +놇 + +놈 +놈 +놈 +놈 +놈 + +놉 +놉 +놉 +놉 +놉 + +놊 +놊 +놊 +놊 +놊 + +놋 +놋 +놋 +놋 +놋 + +놌 +놌 +놌 +놌 +놌 + +농 +농 +농 +농 +농 + +놎 +놎 +놎 +놎 +놎 + +놏 +놏 +놏 +놏 +놏 + +놐 +놐 +놐 +놐 +놐 + +놑 +놑 +놑 +놑 +놑 + +높 +높 +높 +높 +높 + +놓 +놓 +놓 +놓 +놓 + +놔 +놔 +놔 +놔 +놔 + +놕 +놕 +놕 +놕 +놕 + +놖 +놖 +놖 +놖 +놖 + +놗 +놗 +놗 +놗 +놗 + +놘 +놘 +놘 +놘 +놘 + +놙 +놙 +놙 +놙 +놙 + +놚 +놚 +놚 +놚 +놚 + +놛 +놛 +놛 +놛 +놛 + +놜 +놜 +놜 +놜 +놜 + +놝 +놝 +놝 +놝 +놝 + +놞 +놞 +놞 +놞 +놞 + +놟 +놟 +놟 +놟 +놟 + +놠 +놠 +놠 +놠 +놠 + +놡 +놡 +놡 +놡 +놡 + +놢 +놢 +놢 +놢 +놢 + +놣 +놣 +놣 +놣 +놣 + +놤 +놤 +놤 +놤 +놤 + +놥 +놥 +놥 +놥 +놥 + +놦 +놦 +놦 +놦 +놦 + +놧 +놧 +놧 +놧 +놧 + +놨 +놨 +놨 +놨 +놨 + +놩 +놩 +놩 +놩 +놩 + +놪 +놪 +놪 +놪 +놪 + +놫 +놫 +놫 +놫 +놫 + +놬 +놬 +놬 +놬 +놬 + +놭 +놭 +놭 +놭 +놭 + +놮 +놮 +놮 +놮 +놮 + +놯 +놯 +놯 +놯 +놯 + +놰 +놰 +놰 +놰 +놰 + +놱 +놱 +놱 +놱 +놱 + +놲 +놲 +놲 +놲 +놲 + +놳 +놳 +놳 +놳 +놳 + +놴 +놴 +놴 +놴 +놴 + +놵 +놵 +놵 +놵 +놵 + +놶 +놶 +놶 +놶 +놶 + +놷 +놷 +놷 +놷 +놷 + +놸 +놸 +놸 +놸 +놸 + +놹 +놹 +놹 +놹 +놹 + +놺 +놺 +놺 +놺 +놺 + +놻 +놻 +놻 +놻 +놻 + +놼 +놼 +놼 +놼 +놼 + +놽 +놽 +놽 +놽 +놽 + +놾 +놾 +놾 +놾 +놾 + +놿 +놿 +놿 +놿 +놿 + +뇀 +뇀 +뇀 +뇀 +뇀 + +뇁 +뇁 +뇁 +뇁 +뇁 + +뇂 +뇂 +뇂 +뇂 +뇂 + +뇃 +뇃 +뇃 +뇃 +뇃 + +뇄 +뇄 +뇄 +뇄 +뇄 + +뇅 +뇅 +뇅 +뇅 +뇅 + +뇆 +뇆 +뇆 +뇆 +뇆 + +뇇 +뇇 +뇇 +뇇 +뇇 + +뇈 +뇈 +뇈 +뇈 +뇈 + +뇉 +뇉 +뇉 +뇉 +뇉 + +뇊 +뇊 +뇊 +뇊 +뇊 + +뇋 +뇋 +뇋 +뇋 +뇋 + +뇌 +뇌 +뇌 +뇌 +뇌 + +뇍 +뇍 +뇍 +뇍 +뇍 + +뇎 +뇎 +뇎 +뇎 +뇎 + +뇏 +뇏 +뇏 +뇏 +뇏 + +뇐 +뇐 +뇐 +뇐 +뇐 + +뇑 +뇑 +뇑 +뇑 +뇑 + +뇒 +뇒 +뇒 +뇒 +뇒 + +뇓 +뇓 +뇓 +뇓 +뇓 + +뇔 +뇔 +뇔 +뇔 +뇔 + +뇕 +뇕 +뇕 +뇕 +뇕 + +뇖 +뇖 +뇖 +뇖 +뇖 + +뇗 +뇗 +뇗 +뇗 +뇗 + +뇘 +뇘 +뇘 +뇘 +뇘 + +뇙 +뇙 +뇙 +뇙 +뇙 + +뇚 +뇚 +뇚 +뇚 +뇚 + +뇛 +뇛 +뇛 +뇛 +뇛 + +뇜 +뇜 +뇜 +뇜 +뇜 + +뇝 +뇝 +뇝 +뇝 +뇝 + +뇞 +뇞 +뇞 +뇞 +뇞 + +뇟 +뇟 +뇟 +뇟 +뇟 + +뇠 +뇠 +뇠 +뇠 +뇠 + +뇡 +뇡 +뇡 +뇡 +뇡 + +뇢 +뇢 +뇢 +뇢 +뇢 + +뇣 +뇣 +뇣 +뇣 +뇣 + +뇤 +뇤 +뇤 +뇤 +뇤 + +뇥 +뇥 +뇥 +뇥 +뇥 + +뇦 +뇦 +뇦 +뇦 +뇦 + +뇧 +뇧 +뇧 +뇧 +뇧 + +뇨 +뇨 +뇨 +뇨 +뇨 + +뇩 +뇩 +뇩 +뇩 +뇩 + +뇪 +뇪 +뇪 +뇪 +뇪 + +뇫 +뇫 +뇫 +뇫 +뇫 + +뇬 +뇬 +뇬 +뇬 +뇬 + +뇭 +뇭 +뇭 +뇭 +뇭 + +뇮 +뇮 +뇮 +뇮 +뇮 + +뇯 +뇯 +뇯 +뇯 +뇯 + +뇰 +뇰 +뇰 +뇰 +뇰 + +뇱 +뇱 +뇱 +뇱 +뇱 + +뇲 +뇲 +뇲 +뇲 +뇲 + +뇳 +뇳 +뇳 +뇳 +뇳 + +뇴 +뇴 +뇴 +뇴 +뇴 + +뇵 +뇵 +뇵 +뇵 +뇵 + +뇶 +뇶 +뇶 +뇶 +뇶 + +뇷 +뇷 +뇷 +뇷 +뇷 + +뇸 +뇸 +뇸 +뇸 +뇸 + +뇹 +뇹 +뇹 +뇹 +뇹 + +뇺 +뇺 +뇺 +뇺 +뇺 + +뇻 +뇻 +뇻 +뇻 +뇻 + +뇼 +뇼 +뇼 +뇼 +뇼 + +뇽 +뇽 +뇽 +뇽 +뇽 + +뇾 +뇾 +뇾 +뇾 +뇾 + +뇿 +뇿 +뇿 +뇿 +뇿 + +눀 +눀 +눀 +눀 +눀 + +눁 +눁 +눁 +눁 +눁 + +눂 +눂 +눂 +눂 +눂 + +눃 +눃 +눃 +눃 +눃 + +누 +누 +누 +누 +누 + +눅 +눅 +눅 +눅 +눅 + +눆 +눆 +눆 +눆 +눆 + +눇 +눇 +눇 +눇 +눇 + +눈 +눈 +눈 +눈 +눈 + +눉 +눉 +눉 +눉 +눉 + +눊 +눊 +눊 +눊 +눊 + +눋 +눋 +눋 +눋 +눋 + +눌 +눌 +눌 +눌 +눌 + +눍 +눍 +눍 +눍 +눍 + +눎 +눎 +눎 +눎 +눎 + +눏 +눏 +눏 +눏 +눏 + +눐 +눐 +눐 +눐 +눐 + +눑 +눑 +눑 +눑 +눑 + +눒 +눒 +눒 +눒 +눒 + +눓 +눓 +눓 +눓 +눓 + +눔 +눔 +눔 +눔 +눔 + +눕 +눕 +눕 +눕 +눕 + +눖 +눖 +눖 +눖 +눖 + +눗 +눗 +눗 +눗 +눗 + +눘 +눘 +눘 +눘 +눘 + +눙 +눙 +눙 +눙 +눙 + +눚 +눚 +눚 +눚 +눚 + +눛 +눛 +눛 +눛 +눛 + +눜 +눜 +눜 +눜 +눜 + +눝 +눝 +눝 +눝 +눝 + +눞 +눞 +눞 +눞 +눞 + +눟 +눟 +눟 +눟 +눟 + +눠 +눠 +눠 +눠 +눠 + +눡 +눡 +눡 +눡 +눡 + +눢 +눢 +눢 +눢 +눢 + +눣 +눣 +눣 +눣 +눣 + +눤 +눤 +눤 +눤 +눤 + +눥 +눥 +눥 +눥 +눥 + +눦 +눦 +눦 +눦 +눦 + +눧 +눧 +눧 +눧 +눧 + +눨 +눨 +눨 +눨 +눨 + +눩 +눩 +눩 +눩 +눩 + +눪 +눪 +눪 +눪 +눪 + +눫 +눫 +눫 +눫 +눫 + +눬 +눬 +눬 +눬 +눬 + +눭 +눭 +눭 +눭 +눭 + +눮 +눮 +눮 +눮 +눮 + +눯 +눯 +눯 +눯 +눯 + +눰 +눰 +눰 +눰 +눰 + +눱 +눱 +눱 +눱 +눱 + +눲 +눲 +눲 +눲 +눲 + +눳 +눳 +눳 +눳 +눳 + +눴 +눴 +눴 +눴 +눴 + +눵 +눵 +눵 +눵 +눵 + +눶 +눶 +눶 +눶 +눶 + +눷 +눷 +눷 +눷 +눷 + +눸 +눸 +눸 +눸 +눸 + +눹 +눹 +눹 +눹 +눹 + +눺 +눺 +눺 +눺 +눺 + +눻 +눻 +눻 +눻 +눻 + +눼 +눼 +눼 +눼 +눼 + +눽 +눽 +눽 +눽 +눽 + +눾 +눾 +눾 +눾 +눾 + +눿 +눿 +눿 +눿 +눿 + +뉀 +뉀 +뉀 +뉀 +뉀 + +뉁 +뉁 +뉁 +뉁 +뉁 + +뉂 +뉂 +뉂 +뉂 +뉂 + +뉃 +뉃 +뉃 +뉃 +뉃 + +뉄 +뉄 +뉄 +뉄 +뉄 + +뉅 +뉅 +뉅 +뉅 +뉅 + +뉆 +뉆 +뉆 +뉆 +뉆 + +뉇 +뉇 +뉇 +뉇 +뉇 + +뉈 +뉈 +뉈 +뉈 +뉈 + +뉉 +뉉 +뉉 +뉉 +뉉 + +뉊 +뉊 +뉊 +뉊 +뉊 + +뉋 +뉋 +뉋 +뉋 +뉋 + +뉌 +뉌 +뉌 +뉌 +뉌 + +뉍 +뉍 +뉍 +뉍 +뉍 + +뉎 +뉎 +뉎 +뉎 +뉎 + +뉏 +뉏 +뉏 +뉏 +뉏 + +뉐 +뉐 +뉐 +뉐 +뉐 + +뉑 +뉑 +뉑 +뉑 +뉑 + +뉒 +뉒 +뉒 +뉒 +뉒 + +뉓 +뉓 +뉓 +뉓 +뉓 + +뉔 +뉔 +뉔 +뉔 +뉔 + +뉕 +뉕 +뉕 +뉕 +뉕 + +뉖 +뉖 +뉖 +뉖 +뉖 + +뉗 +뉗 +뉗 +뉗 +뉗 + +뉘 +뉘 +뉘 +뉘 +뉘 + +뉙 +뉙 +뉙 +뉙 +뉙 + +뉚 +뉚 +뉚 +뉚 +뉚 + +뉛 +뉛 +뉛 +뉛 +뉛 + +뉜 +뉜 +뉜 +뉜 +뉜 + +뉝 +뉝 +뉝 +뉝 +뉝 + +뉞 +뉞 +뉞 +뉞 +뉞 + +뉟 +뉟 +뉟 +뉟 +뉟 + +뉠 +뉠 +뉠 +뉠 +뉠 + +뉡 +뉡 +뉡 +뉡 +뉡 + +뉢 +뉢 +뉢 +뉢 +뉢 + +뉣 +뉣 +뉣 +뉣 +뉣 + +뉤 +뉤 +뉤 +뉤 +뉤 + +뉥 +뉥 +뉥 +뉥 +뉥 + +뉦 +뉦 +뉦 +뉦 +뉦 + +뉧 +뉧 +뉧 +뉧 +뉧 + +뉨 +뉨 +뉨 +뉨 +뉨 + +뉩 +뉩 +뉩 +뉩 +뉩 + +뉪 +뉪 +뉪 +뉪 +뉪 + +뉫 +뉫 +뉫 +뉫 +뉫 + +뉬 +뉬 +뉬 +뉬 +뉬 + +뉭 +뉭 +뉭 +뉭 +뉭 + +뉮 +뉮 +뉮 +뉮 +뉮 + +뉯 +뉯 +뉯 +뉯 +뉯 + +뉰 +뉰 +뉰 +뉰 +뉰 + +뉱 +뉱 +뉱 +뉱 +뉱 + +뉲 +뉲 +뉲 +뉲 +뉲 + +뉳 +뉳 +뉳 +뉳 +뉳 + +뉴 +뉴 +뉴 +뉴 +뉴 + +뉵 +뉵 +뉵 +뉵 +뉵 + +뉶 +뉶 +뉶 +뉶 +뉶 + +뉷 +뉷 +뉷 +뉷 +뉷 + +뉸 +뉸 +뉸 +뉸 +뉸 + +뉹 +뉹 +뉹 +뉹 +뉹 + +뉺 +뉺 +뉺 +뉺 +뉺 + +뉻 +뉻 +뉻 +뉻 +뉻 + +뉼 +뉼 +뉼 +뉼 +뉼 + +뉽 +뉽 +뉽 +뉽 +뉽 + +뉾 +뉾 +뉾 +뉾 +뉾 + +뉿 +뉿 +뉿 +뉿 +뉿 + +늀 +늀 +늀 +늀 +늀 + +늁 +늁 +늁 +늁 +늁 + +늂 +늂 +늂 +늂 +늂 + +늃 +늃 +늃 +늃 +늃 + +늄 +늄 +늄 +늄 +늄 + +늅 +늅 +늅 +늅 +늅 + +늆 +늆 +늆 +늆 +늆 + +늇 +늇 +늇 +늇 +늇 + +늈 +늈 +늈 +늈 +늈 + +늉 +늉 +늉 +늉 +늉 + +늊 +늊 +늊 +늊 +늊 + +늋 +늋 +늋 +늋 +늋 + +늌 +늌 +늌 +늌 +늌 + +늍 +늍 +늍 +늍 +늍 + +늎 +늎 +늎 +늎 +늎 + +늏 +늏 +늏 +늏 +늏 + +느 +느 +느 +느 +느 + +늑 +늑 +늑 +늑 +늑 + +늒 +늒 +늒 +늒 +늒 + +늓 +늓 +늓 +늓 +늓 + +는 +는 +는 +는 +는 + +늕 +늕 +늕 +늕 +늕 + +늖 +늖 +늖 +늖 +늖 + +늗 +늗 +늗 +늗 +늗 + +늘 +늘 +늘 +늘 +늘 + +늙 +늙 +늙 +늙 +늙 + +늚 +늚 +늚 +늚 +늚 + +늛 +늛 +늛 +늛 +늛 + +늜 +늜 +늜 +늜 +늜 + +늝 +늝 +늝 +늝 +늝 + +늞 +늞 +늞 +늞 +늞 + +늟 +늟 +늟 +늟 +늟 + +늠 +늠 +늠 +늠 +늠 + +늡 +늡 +늡 +늡 +늡 + +늢 +늢 +늢 +늢 +늢 + +늣 +늣 +늣 +늣 +늣 + +늤 +늤 +늤 +늤 +늤 + +능 +능 +능 +능 +능 + +늦 +늦 +늦 +늦 +늦 + +늧 +늧 +늧 +늧 +늧 + +늨 +늨 +늨 +늨 +늨 + +늩 +늩 +늩 +늩 +늩 + +늪 +늪 +늪 +늪 +늪 + +늫 +늫 +늫 +늫 +늫 + +늬 +늬 +늬 +늬 +늬 + +늭 +늭 +늭 +늭 +늭 + +늮 +늮 +늮 +늮 +늮 + +늯 +늯 +늯 +늯 +늯 + +늰 +늰 +늰 +늰 +늰 + +늱 +늱 +늱 +늱 +늱 + +늲 +늲 +늲 +늲 +늲 + +늳 +늳 +늳 +늳 +늳 + +늴 +늴 +늴 +늴 +늴 + +늵 +늵 +늵 +늵 +늵 + +늶 +늶 +늶 +늶 +늶 + +늷 +늷 +늷 +늷 +늷 + +늸 +늸 +늸 +늸 +늸 + +늹 +늹 +늹 +늹 +늹 + +늺 +늺 +늺 +늺 +늺 + +늻 +늻 +늻 +늻 +늻 + +늼 +늼 +늼 +늼 +늼 + +늽 +늽 +늽 +늽 +늽 + +늾 +늾 +늾 +늾 +늾 + +늿 +늿 +늿 +늿 +늿 + +닀 +닀 +닀 +닀 +닀 + +닁 +닁 +닁 +닁 +닁 + +닂 +닂 +닂 +닂 +닂 + +닃 +닃 +닃 +닃 +닃 + +닄 +닄 +닄 +닄 +닄 + +닅 +닅 +닅 +닅 +닅 + +닆 +닆 +닆 +닆 +닆 + +닇 +닇 +닇 +닇 +닇 + +니 +니 +니 +니 +니 + +닉 +닉 +닉 +닉 +닉 + +닊 +닊 +닊 +닊 +닊 + +닋 +닋 +닋 +닋 +닋 + +닌 +닌 +닌 +닌 +닌 + +닍 +닍 +닍 +닍 +닍 + +닎 +닎 +닎 +닎 +닎 + +닏 +닏 +닏 +닏 +닏 + +닐 +닐 +닐 +닐 +닐 + +닑 +닑 +닑 +닑 +닑 + +닒 +닒 +닒 +닒 +닒 + +닓 +닓 +닓 +닓 +닓 + +닔 +닔 +닔 +닔 +닔 + +닕 +닕 +닕 +닕 +닕 + +닖 +닖 +닖 +닖 +닖 + +닗 +닗 +닗 +닗 +닗 + +님 +님 +님 +님 +님 + +닙 +닙 +닙 +닙 +닙 + +닚 +닚 +닚 +닚 +닚 + +닛 +닛 +닛 +닛 +닛 + +닜 +닜 +닜 +닜 +닜 + +닝 +닝 +닝 +닝 +닝 + +닞 +닞 +닞 +닞 +닞 + +닟 +닟 +닟 +닟 +닟 + +닠 +닠 +닠 +닠 +닠 + +닡 +닡 +닡 +닡 +닡 + +닢 +닢 +닢 +닢 +닢 + +닣 +닣 +닣 +닣 +닣 + +다 +다 +다 +다 +다 + +닥 +닥 +닥 +닥 +닥 + +닦 +닦 +닦 +닦 +닦 + +닧 +닧 +닧 +닧 +닧 + +단 +단 +단 +단 +단 + +닩 +닩 +닩 +닩 +닩 + +닪 +닪 +닪 +닪 +닪 + +닫 +닫 +닫 +닫 +닫 + +달 +달 +달 +달 +달 + +닭 +닭 +닭 +닭 +닭 + +닮 +닮 +닮 +닮 +닮 + +닯 +닯 +닯 +닯 +닯 + +닰 +닰 +닰 +닰 +닰 + +닱 +닱 +닱 +닱 +닱 + +닲 +닲 +닲 +닲 +닲 + +닳 +닳 +닳 +닳 +닳 + +담 +담 +담 +담 +담 + +답 +답 +답 +답 +답 + +닶 +닶 +닶 +닶 +닶 + +닷 +닷 +닷 +닷 +닷 + +닸 +닸 +닸 +닸 +닸 + +당 +당 +당 +당 +당 + +닺 +닺 +닺 +닺 +닺 + +닻 +닻 +닻 +닻 +닻 + +닼 +닼 +닼 +닼 +닼 + +닽 +닽 +닽 +닽 +닽 + +닾 +닾 +닾 +닾 +닾 + +닿 +닿 +닿 +닿 +닿 + +대 +대 +대 +대 +대 + +댁 +댁 +댁 +댁 +댁 + +댂 +댂 +댂 +댂 +댂 + +댃 +댃 +댃 +댃 +댃 + +댄 +댄 +댄 +댄 +댄 + +댅 +댅 +댅 +댅 +댅 + +댆 +댆 +댆 +댆 +댆 + +댇 +댇 +댇 +댇 +댇 + +댈 +댈 +댈 +댈 +댈 + +댉 +댉 +댉 +댉 +댉 + +댊 +댊 +댊 +댊 +댊 + +댋 +댋 +댋 +댋 +댋 + +댌 +댌 +댌 +댌 +댌 + +댍 +댍 +댍 +댍 +댍 + +댎 +댎 +댎 +댎 +댎 + +댏 +댏 +댏 +댏 +댏 + +댐 +댐 +댐 +댐 +댐 + +댑 +댑 +댑 +댑 +댑 + +댒 +댒 +댒 +댒 +댒 + +댓 +댓 +댓 +댓 +댓 + +댔 +댔 +댔 +댔 +댔 + +댕 +댕 +댕 +댕 +댕 + +댖 +댖 +댖 +댖 +댖 + +댗 +댗 +댗 +댗 +댗 + +댘 +댘 +댘 +댘 +댘 + +댙 +댙 +댙 +댙 +댙 + +댚 +댚 +댚 +댚 +댚 + +댛 +댛 +댛 +댛 +댛 + +댜 +댜 +댜 +댜 +댜 + +댝 +댝 +댝 +댝 +댝 + +댞 +댞 +댞 +댞 +댞 + +댟 +댟 +댟 +댟 +댟 + +댠 +댠 +댠 +댠 +댠 + +댡 +댡 +댡 +댡 +댡 + +댢 +댢 +댢 +댢 +댢 + +댣 +댣 +댣 +댣 +댣 + +댤 +댤 +댤 +댤 +댤 + +댥 +댥 +댥 +댥 +댥 + +댦 +댦 +댦 +댦 +댦 + +댧 +댧 +댧 +댧 +댧 + +댨 +댨 +댨 +댨 +댨 + +댩 +댩 +댩 +댩 +댩 + +댪 +댪 +댪 +댪 +댪 + +댫 +댫 +댫 +댫 +댫 + +댬 +댬 +댬 +댬 +댬 + +댭 +댭 +댭 +댭 +댭 + +댮 +댮 +댮 +댮 +댮 + +댯 +댯 +댯 +댯 +댯 + +댰 +댰 +댰 +댰 +댰 + +댱 +댱 +댱 +댱 +댱 + +댲 +댲 +댲 +댲 +댲 + +댳 +댳 +댳 +댳 +댳 + +댴 +댴 +댴 +댴 +댴 + +댵 +댵 +댵 +댵 +댵 + +댶 +댶 +댶 +댶 +댶 + +댷 +댷 +댷 +댷 +댷 + +댸 +댸 +댸 +댸 +댸 + +댹 +댹 +댹 +댹 +댹 + +댺 +댺 +댺 +댺 +댺 + +댻 +댻 +댻 +댻 +댻 + +댼 +댼 +댼 +댼 +댼 + +댽 +댽 +댽 +댽 +댽 + +댾 +댾 +댾 +댾 +댾 + +댿 +댿 +댿 +댿 +댿 + +덀 +덀 +덀 +덀 +덀 + +덁 +덁 +덁 +덁 +덁 + +덂 +덂 +덂 +덂 +덂 + +덃 +덃 +덃 +덃 +덃 + +덄 +덄 +덄 +덄 +덄 + +덅 +덅 +덅 +덅 +덅 + +덆 +덆 +덆 +덆 +덆 + +덇 +덇 +덇 +덇 +덇 + +덈 +덈 +덈 +덈 +덈 + +덉 +덉 +덉 +덉 +덉 + +덊 +덊 +덊 +덊 +덊 + +덋 +덋 +덋 +덋 +덋 + +덌 +덌 +덌 +덌 +덌 + +덍 +덍 +덍 +덍 +덍 + +덎 +덎 +덎 +덎 +덎 + +덏 +덏 +덏 +덏 +덏 + +덐 +덐 +덐 +덐 +덐 + +덑 +덑 +덑 +덑 +덑 + +덒 +덒 +덒 +덒 +덒 + +덓 +덓 +덓 +덓 +덓 + +더 +더 +더 +더 +더 + +덕 +덕 +덕 +덕 +덕 + +덖 +덖 +덖 +덖 +덖 + +덗 +덗 +덗 +덗 +덗 + +던 +던 +던 +던 +던 + +덙 +덙 +덙 +덙 +덙 + +덚 +덚 +덚 +덚 +덚 + +덛 +덛 +덛 +덛 +덛 + +덜 +덜 +덜 +덜 +덜 + +덝 +덝 +덝 +덝 +덝 + +덞 +덞 +덞 +덞 +덞 + +덟 +덟 +덟 +덟 +덟 + +덠 +덠 +덠 +덠 +덠 + +덡 +덡 +덡 +덡 +덡 + +덢 +덢 +덢 +덢 +덢 + +덣 +덣 +덣 +덣 +덣 + +덤 +덤 +덤 +덤 +덤 + +덥 +덥 +덥 +덥 +덥 + +덦 +덦 +덦 +덦 +덦 + +덧 +덧 +덧 +덧 +덧 + +덨 +덨 +덨 +덨 +덨 + +덩 +덩 +덩 +덩 +덩 + +덪 +덪 +덪 +덪 +덪 + +덫 +덫 +덫 +덫 +덫 + +덬 +덬 +덬 +덬 +덬 + +덭 +덭 +덭 +덭 +덭 + +덮 +덮 +덮 +덮 +덮 + +덯 +덯 +덯 +덯 +덯 + +데 +데 +데 +데 +데 + +덱 +덱 +덱 +덱 +덱 + +덲 +덲 +덲 +덲 +덲 + +덳 +덳 +덳 +덳 +덳 + +덴 +덴 +덴 +덴 +덴 + +덵 +덵 +덵 +덵 +덵 + +덶 +덶 +덶 +덶 +덶 + +덷 +덷 +덷 +덷 +덷 + +델 +델 +델 +델 +델 + +덹 +덹 +덹 +덹 +덹 + +덺 +덺 +덺 +덺 +덺 + +덻 +덻 +덻 +덻 +덻 + +덼 +덼 +덼 +덼 +덼 + +덽 +덽 +덽 +덽 +덽 + +덾 +덾 +덾 +덾 +덾 + +덿 +덿 +덿 +덿 +덿 + +뎀 +뎀 +뎀 +뎀 +뎀 + +뎁 +뎁 +뎁 +뎁 +뎁 + +뎂 +뎂 +뎂 +뎂 +뎂 + +뎃 +뎃 +뎃 +뎃 +뎃 + +뎄 +뎄 +뎄 +뎄 +뎄 + +뎅 +뎅 +뎅 +뎅 +뎅 + +뎆 +뎆 +뎆 +뎆 +뎆 + +뎇 +뎇 +뎇 +뎇 +뎇 + +뎈 +뎈 +뎈 +뎈 +뎈 + +뎉 +뎉 +뎉 +뎉 +뎉 + +뎊 +뎊 +뎊 +뎊 +뎊 + +뎋 +뎋 +뎋 +뎋 +뎋 + +뎌 +뎌 +뎌 +뎌 +뎌 + +뎍 +뎍 +뎍 +뎍 +뎍 + +뎎 +뎎 +뎎 +뎎 +뎎 + +뎏 +뎏 +뎏 +뎏 +뎏 + +뎐 +뎐 +뎐 +뎐 +뎐 + +뎑 +뎑 +뎑 +뎑 +뎑 + +뎒 +뎒 +뎒 +뎒 +뎒 + +뎓 +뎓 +뎓 +뎓 +뎓 + +뎔 +뎔 +뎔 +뎔 +뎔 + +뎕 +뎕 +뎕 +뎕 +뎕 + +뎖 +뎖 +뎖 +뎖 +뎖 + +뎗 +뎗 +뎗 +뎗 +뎗 + +뎘 +뎘 +뎘 +뎘 +뎘 + +뎙 +뎙 +뎙 +뎙 +뎙 + +뎚 +뎚 +뎚 +뎚 +뎚 + +뎛 +뎛 +뎛 +뎛 +뎛 + +뎜 +뎜 +뎜 +뎜 +뎜 + +뎝 +뎝 +뎝 +뎝 +뎝 + +뎞 +뎞 +뎞 +뎞 +뎞 + +뎟 +뎟 +뎟 +뎟 +뎟 + +뎠 +뎠 +뎠 +뎠 +뎠 + +뎡 +뎡 +뎡 +뎡 +뎡 + +뎢 +뎢 +뎢 +뎢 +뎢 + +뎣 +뎣 +뎣 +뎣 +뎣 + +뎤 +뎤 +뎤 +뎤 +뎤 + +뎥 +뎥 +뎥 +뎥 +뎥 + +뎦 +뎦 +뎦 +뎦 +뎦 + +뎧 +뎧 +뎧 +뎧 +뎧 + +뎨 +뎨 +뎨 +뎨 +뎨 + +뎩 +뎩 +뎩 +뎩 +뎩 + +뎪 +뎪 +뎪 +뎪 +뎪 + +뎫 +뎫 +뎫 +뎫 +뎫 + +뎬 +뎬 +뎬 +뎬 +뎬 + +뎭 +뎭 +뎭 +뎭 +뎭 + +뎮 +뎮 +뎮 +뎮 +뎮 + +뎯 +뎯 +뎯 +뎯 +뎯 + +뎰 +뎰 +뎰 +뎰 +뎰 + +뎱 +뎱 +뎱 +뎱 +뎱 + +뎲 +뎲 +뎲 +뎲 +뎲 + +뎳 +뎳 +뎳 +뎳 +뎳 + +뎴 +뎴 +뎴 +뎴 +뎴 + +뎵 +뎵 +뎵 +뎵 +뎵 + +뎶 +뎶 +뎶 +뎶 +뎶 + +뎷 +뎷 +뎷 +뎷 +뎷 + +뎸 +뎸 +뎸 +뎸 +뎸 + +뎹 +뎹 +뎹 +뎹 +뎹 + +뎺 +뎺 +뎺 +뎺 +뎺 + +뎻 +뎻 +뎻 +뎻 +뎻 + +뎼 +뎼 +뎼 +뎼 +뎼 + +뎽 +뎽 +뎽 +뎽 +뎽 + +뎾 +뎾 +뎾 +뎾 +뎾 + +뎿 +뎿 +뎿 +뎿 +뎿 + +돀 +돀 +돀 +돀 +돀 + +돁 +돁 +돁 +돁 +돁 + +돂 +돂 +돂 +돂 +돂 + +돃 +돃 +돃 +돃 +돃 + +도 +도 +도 +도 +도 + +독 +독 +독 +독 +독 + +돆 +돆 +돆 +돆 +돆 + +돇 +돇 +돇 +돇 +돇 + +돈 +돈 +돈 +돈 +돈 + +돉 +돉 +돉 +돉 +돉 + +돊 +돊 +돊 +돊 +돊 + +돋 +돋 +돋 +돋 +돋 + +돌 +돌 +돌 +돌 +돌 + +돍 +돍 +돍 +돍 +돍 + +돎 +돎 +돎 +돎 +돎 + +돏 +돏 +돏 +돏 +돏 + +돐 +돐 +돐 +돐 +돐 + +돑 +돑 +돑 +돑 +돑 + +돒 +돒 +돒 +돒 +돒 + +돓 +돓 +돓 +돓 +돓 + +돔 +돔 +돔 +돔 +돔 + +돕 +돕 +돕 +돕 +돕 + +돖 +돖 +돖 +돖 +돖 + +돗 +돗 +돗 +돗 +돗 + +돘 +돘 +돘 +돘 +돘 + +동 +동 +동 +동 +동 + +돚 +돚 +돚 +돚 +돚 + +돛 +돛 +돛 +돛 +돛 + +돜 +돜 +돜 +돜 +돜 + +돝 +돝 +돝 +돝 +돝 + +돞 +돞 +돞 +돞 +돞 + +돟 +돟 +돟 +돟 +돟 + +돠 +돠 +돠 +돠 +돠 + +돡 +돡 +돡 +돡 +돡 + +돢 +돢 +돢 +돢 +돢 + +돣 +돣 +돣 +돣 +돣 + +돤 +돤 +돤 +돤 +돤 + +돥 +돥 +돥 +돥 +돥 + +돦 +돦 +돦 +돦 +돦 + +돧 +돧 +돧 +돧 +돧 + +돨 +돨 +돨 +돨 +돨 + +돩 +돩 +돩 +돩 +돩 + +돪 +돪 +돪 +돪 +돪 + +돫 +돫 +돫 +돫 +돫 + +돬 +돬 +돬 +돬 +돬 + +돭 +돭 +돭 +돭 +돭 + +돮 +돮 +돮 +돮 +돮 + +돯 +돯 +돯 +돯 +돯 + +돰 +돰 +돰 +돰 +돰 + +돱 +돱 +돱 +돱 +돱 + +돲 +돲 +돲 +돲 +돲 + +돳 +돳 +돳 +돳 +돳 + +돴 +돴 +돴 +돴 +돴 + +돵 +돵 +돵 +돵 +돵 + +돶 +돶 +돶 +돶 +돶 + +돷 +돷 +돷 +돷 +돷 + +돸 +돸 +돸 +돸 +돸 + +돹 +돹 +돹 +돹 +돹 + +돺 +돺 +돺 +돺 +돺 + +돻 +돻 +돻 +돻 +돻 + +돼 +돼 +돼 +돼 +돼 + +돽 +돽 +돽 +돽 +돽 + +돾 +돾 +돾 +돾 +돾 + +돿 +돿 +돿 +돿 +돿 + +됀 +됀 +됀 +됀 +됀 + +됁 +됁 +됁 +됁 +됁 + +됂 +됂 +됂 +됂 +됂 + +됃 +됃 +됃 +됃 +됃 + +됄 +됄 +됄 +됄 +됄 + +됅 +됅 +됅 +됅 +됅 + +됆 +됆 +됆 +됆 +됆 + +됇 +됇 +됇 +됇 +됇 + +됈 +됈 +됈 +됈 +됈 + +됉 +됉 +됉 +됉 +됉 + +됊 +됊 +됊 +됊 +됊 + +됋 +됋 +됋 +됋 +됋 + +됌 +됌 +됌 +됌 +됌 + +됍 +됍 +됍 +됍 +됍 + +됎 +됎 +됎 +됎 +됎 + +됏 +됏 +됏 +됏 +됏 + +됐 +됐 +됐 +됐 +됐 + +됑 +됑 +됑 +됑 +됑 + +됒 +됒 +됒 +됒 +됒 + +됓 +됓 +됓 +됓 +됓 + +됔 +됔 +됔 +됔 +됔 + +됕 +됕 +됕 +됕 +됕 + +됖 +됖 +됖 +됖 +됖 + +됗 +됗 +됗 +됗 +됗 + +되 +되 +되 +되 +되 + +됙 +됙 +됙 +됙 +됙 + +됚 +됚 +됚 +됚 +됚 + +됛 +됛 +됛 +됛 +됛 + +된 +된 +된 +된 +된 + +됝 +됝 +됝 +됝 +됝 + +됞 +됞 +됞 +됞 +됞 + +됟 +됟 +됟 +됟 +됟 + +될 +될 +될 +될 +될 + +됡 +됡 +됡 +됡 +됡 + +됢 +됢 +됢 +됢 +됢 + +됣 +됣 +됣 +됣 +됣 + +됤 +됤 +됤 +됤 +됤 + +됥 +됥 +됥 +됥 +됥 + +됦 +됦 +됦 +됦 +됦 + +됧 +됧 +됧 +됧 +됧 + +됨 +됨 +됨 +됨 +됨 + +됩 +됩 +됩 +됩 +됩 + +됪 +됪 +됪 +됪 +됪 + +됫 +됫 +됫 +됫 +됫 + +됬 +됬 +됬 +됬 +됬 + +됭 +됭 +됭 +됭 +됭 + +됮 +됮 +됮 +됮 +됮 + +됯 +됯 +됯 +됯 +됯 + +됰 +됰 +됰 +됰 +됰 + +됱 +됱 +됱 +됱 +됱 + +됲 +됲 +됲 +됲 +됲 + +됳 +됳 +됳 +됳 +됳 + +됴 +됴 +됴 +됴 +됴 + +됵 +됵 +됵 +됵 +됵 + +됶 +됶 +됶 +됶 +됶 + +됷 +됷 +됷 +됷 +됷 + +됸 +됸 +됸 +됸 +됸 + +됹 +됹 +됹 +됹 +됹 + +됺 +됺 +됺 +됺 +됺 + +됻 +됻 +됻 +됻 +됻 + +됼 +됼 +됼 +됼 +됼 + +됽 +됽 +됽 +됽 +됽 + +됾 +됾 +됾 +됾 +됾 + +됿 +됿 +됿 +됿 +됿 + +둀 +둀 +둀 +둀 +둀 + +둁 +둁 +둁 +둁 +둁 + +둂 +둂 +둂 +둂 +둂 + +둃 +둃 +둃 +둃 +둃 + +둄 +둄 +둄 +둄 +둄 + +둅 +둅 +둅 +둅 +둅 + +둆 +둆 +둆 +둆 +둆 + +둇 +둇 +둇 +둇 +둇 + +둈 +둈 +둈 +둈 +둈 + +둉 +둉 +둉 +둉 +둉 + +둊 +둊 +둊 +둊 +둊 + +둋 +둋 +둋 +둋 +둋 + +둌 +둌 +둌 +둌 +둌 + +둍 +둍 +둍 +둍 +둍 + +둎 +둎 +둎 +둎 +둎 + +둏 +둏 +둏 +둏 +둏 + +두 +두 +두 +두 +두 + +둑 +둑 +둑 +둑 +둑 + +둒 +둒 +둒 +둒 +둒 + +둓 +둓 +둓 +둓 +둓 + +둔 +둔 +둔 +둔 +둔 + +둕 +둕 +둕 +둕 +둕 + +둖 +둖 +둖 +둖 +둖 + +둗 +둗 +둗 +둗 +둗 + +둘 +둘 +둘 +둘 +둘 + +둙 +둙 +둙 +둙 +둙 + +둚 +둚 +둚 +둚 +둚 + +둛 +둛 +둛 +둛 +둛 + +둜 +둜 +둜 +둜 +둜 + +둝 +둝 +둝 +둝 +둝 + +둞 +둞 +둞 +둞 +둞 + +둟 +둟 +둟 +둟 +둟 + +둠 +둠 +둠 +둠 +둠 + +둡 +둡 +둡 +둡 +둡 + +둢 +둢 +둢 +둢 +둢 + +둣 +둣 +둣 +둣 +둣 + +둤 +둤 +둤 +둤 +둤 + +둥 +둥 +둥 +둥 +둥 + +둦 +둦 +둦 +둦 +둦 + +둧 +둧 +둧 +둧 +둧 + +둨 +둨 +둨 +둨 +둨 + +둩 +둩 +둩 +둩 +둩 + +둪 +둪 +둪 +둪 +둪 + +둫 +둫 +둫 +둫 +둫 + +둬 +둬 +둬 +둬 +둬 + +둭 +둭 +둭 +둭 +둭 + +둮 +둮 +둮 +둮 +둮 + +둯 +둯 +둯 +둯 +둯 + +둰 +둰 +둰 +둰 +둰 + +둱 +둱 +둱 +둱 +둱 + +둲 +둲 +둲 +둲 +둲 + +둳 +둳 +둳 +둳 +둳 + +둴 +둴 +둴 +둴 +둴 + +둵 +둵 +둵 +둵 +둵 + +둶 +둶 +둶 +둶 +둶 + +둷 +둷 +둷 +둷 +둷 + +둸 +둸 +둸 +둸 +둸 + +둹 +둹 +둹 +둹 +둹 + +둺 +둺 +둺 +둺 +둺 + +둻 +둻 +둻 +둻 +둻 + +둼 +둼 +둼 +둼 +둼 + +둽 +둽 +둽 +둽 +둽 + +둾 +둾 +둾 +둾 +둾 + +둿 +둿 +둿 +둿 +둿 + +뒀 +뒀 +뒀 +뒀 +뒀 + +뒁 +뒁 +뒁 +뒁 +뒁 + +뒂 +뒂 +뒂 +뒂 +뒂 + +뒃 +뒃 +뒃 +뒃 +뒃 + +뒄 +뒄 +뒄 +뒄 +뒄 + +뒅 +뒅 +뒅 +뒅 +뒅 + +뒆 +뒆 +뒆 +뒆 +뒆 + +뒇 +뒇 +뒇 +뒇 +뒇 + +뒈 +뒈 +뒈 +뒈 +뒈 + +뒉 +뒉 +뒉 +뒉 +뒉 + +뒊 +뒊 +뒊 +뒊 +뒊 + +뒋 +뒋 +뒋 +뒋 +뒋 + +뒌 +뒌 +뒌 +뒌 +뒌 + +뒍 +뒍 +뒍 +뒍 +뒍 + +뒎 +뒎 +뒎 +뒎 +뒎 + +뒏 +뒏 +뒏 +뒏 +뒏 + +뒐 +뒐 +뒐 +뒐 +뒐 + +뒑 +뒑 +뒑 +뒑 +뒑 + +뒒 +뒒 +뒒 +뒒 +뒒 + +뒓 +뒓 +뒓 +뒓 +뒓 + +뒔 +뒔 +뒔 +뒔 +뒔 + +뒕 +뒕 +뒕 +뒕 +뒕 + +뒖 +뒖 +뒖 +뒖 +뒖 + +뒗 +뒗 +뒗 +뒗 +뒗 + +뒘 +뒘 +뒘 +뒘 +뒘 + +뒙 +뒙 +뒙 +뒙 +뒙 + +뒚 +뒚 +뒚 +뒚 +뒚 + +뒛 +뒛 +뒛 +뒛 +뒛 + +뒜 +뒜 +뒜 +뒜 +뒜 + +뒝 +뒝 +뒝 +뒝 +뒝 + +뒞 +뒞 +뒞 +뒞 +뒞 + +뒟 +뒟 +뒟 +뒟 +뒟 + +뒠 +뒠 +뒠 +뒠 +뒠 + +뒡 +뒡 +뒡 +뒡 +뒡 + +뒢 +뒢 +뒢 +뒢 +뒢 + +뒣 +뒣 +뒣 +뒣 +뒣 + +뒤 +뒤 +뒤 +뒤 +뒤 + +뒥 +뒥 +뒥 +뒥 +뒥 + +뒦 +뒦 +뒦 +뒦 +뒦 + +뒧 +뒧 +뒧 +뒧 +뒧 + +뒨 +뒨 +뒨 +뒨 +뒨 + +뒩 +뒩 +뒩 +뒩 +뒩 + +뒪 +뒪 +뒪 +뒪 +뒪 + +뒫 +뒫 +뒫 +뒫 +뒫 + +뒬 +뒬 +뒬 +뒬 +뒬 + +뒭 +뒭 +뒭 +뒭 +뒭 + +뒮 +뒮 +뒮 +뒮 +뒮 + +뒯 +뒯 +뒯 +뒯 +뒯 + +뒰 +뒰 +뒰 +뒰 +뒰 + +뒱 +뒱 +뒱 +뒱 +뒱 + +뒲 +뒲 +뒲 +뒲 +뒲 + +뒳 +뒳 +뒳 +뒳 +뒳 + +뒴 +뒴 +뒴 +뒴 +뒴 + +뒵 +뒵 +뒵 +뒵 +뒵 + +뒶 +뒶 +뒶 +뒶 +뒶 + +뒷 +뒷 +뒷 +뒷 +뒷 + +뒸 +뒸 +뒸 +뒸 +뒸 + +뒹 +뒹 +뒹 +뒹 +뒹 + +뒺 +뒺 +뒺 +뒺 +뒺 + +뒻 +뒻 +뒻 +뒻 +뒻 + +뒼 +뒼 +뒼 +뒼 +뒼 + +뒽 +뒽 +뒽 +뒽 +뒽 + +뒾 +뒾 +뒾 +뒾 +뒾 + +뒿 +뒿 +뒿 +뒿 +뒿 + +듀 +듀 +듀 +듀 +듀 + +듁 +듁 +듁 +듁 +듁 + +듂 +듂 +듂 +듂 +듂 + +듃 +듃 +듃 +듃 +듃 + +듄 +듄 +듄 +듄 +듄 + +듅 +듅 +듅 +듅 +듅 + +듆 +듆 +듆 +듆 +듆 + +듇 +듇 +듇 +듇 +듇 + +듈 +듈 +듈 +듈 +듈 + +듉 +듉 +듉 +듉 +듉 + +듊 +듊 +듊 +듊 +듊 + +듋 +듋 +듋 +듋 +듋 + +듌 +듌 +듌 +듌 +듌 + +듍 +듍 +듍 +듍 +듍 + +듎 +듎 +듎 +듎 +듎 + +듏 +듏 +듏 +듏 +듏 + +듐 +듐 +듐 +듐 +듐 + +듑 +듑 +듑 +듑 +듑 + +듒 +듒 +듒 +듒 +듒 + +듓 +듓 +듓 +듓 +듓 + +듔 +듔 +듔 +듔 +듔 + +듕 +듕 +듕 +듕 +듕 + +듖 +듖 +듖 +듖 +듖 + +듗 +듗 +듗 +듗 +듗 + +듘 +듘 +듘 +듘 +듘 + +듙 +듙 +듙 +듙 +듙 + +듚 +듚 +듚 +듚 +듚 + +듛 +듛 +듛 +듛 +듛 + +드 +드 +드 +드 +드 + +득 +득 +득 +득 +득 + +듞 +듞 +듞 +듞 +듞 + +듟 +듟 +듟 +듟 +듟 + +든 +든 +든 +든 +든 + +듡 +듡 +듡 +듡 +듡 + +듢 +듢 +듢 +듢 +듢 + +듣 +듣 +듣 +듣 +듣 + +들 +들 +들 +들 +들 + +듥 +듥 +듥 +듥 +듥 + +듦 +듦 +듦 +듦 +듦 + +듧 +듧 +듧 +듧 +듧 + +듨 +듨 +듨 +듨 +듨 + +듩 +듩 +듩 +듩 +듩 + +듪 +듪 +듪 +듪 +듪 + +듫 +듫 +듫 +듫 +듫 + +듬 +듬 +듬 +듬 +듬 + +듭 +듭 +듭 +듭 +듭 + +듮 +듮 +듮 +듮 +듮 + +듯 +듯 +듯 +듯 +듯 + +듰 +듰 +듰 +듰 +듰 + +등 +등 +등 +등 +등 + +듲 +듲 +듲 +듲 +듲 + +듳 +듳 +듳 +듳 +듳 + +듴 +듴 +듴 +듴 +듴 + +듵 +듵 +듵 +듵 +듵 + +듶 +듶 +듶 +듶 +듶 + +듷 +듷 +듷 +듷 +듷 + +듸 +듸 +듸 +듸 +듸 + +듹 +듹 +듹 +듹 +듹 + +듺 +듺 +듺 +듺 +듺 + +듻 +듻 +듻 +듻 +듻 + +듼 +듼 +듼 +듼 +듼 + +듽 +듽 +듽 +듽 +듽 + +듾 +듾 +듾 +듾 +듾 + +듿 +듿 +듿 +듿 +듿 + +딀 +딀 +딀 +딀 +딀 + +딁 +딁 +딁 +딁 +딁 + +딂 +딂 +딂 +딂 +딂 + +딃 +딃 +딃 +딃 +딃 + +딄 +딄 +딄 +딄 +딄 + +딅 +딅 +딅 +딅 +딅 + +딆 +딆 +딆 +딆 +딆 + +딇 +딇 +딇 +딇 +딇 + +딈 +딈 +딈 +딈 +딈 + +딉 +딉 +딉 +딉 +딉 + +딊 +딊 +딊 +딊 +딊 + +딋 +딋 +딋 +딋 +딋 + +딌 +딌 +딌 +딌 +딌 + +딍 +딍 +딍 +딍 +딍 + +딎 +딎 +딎 +딎 +딎 + +딏 +딏 +딏 +딏 +딏 + +딐 +딐 +딐 +딐 +딐 + +딑 +딑 +딑 +딑 +딑 + +딒 +딒 +딒 +딒 +딒 + +딓 +딓 +딓 +딓 +딓 + +디 +디 +디 +디 +디 + +딕 +딕 +딕 +딕 +딕 + +딖 +딖 +딖 +딖 +딖 + +딗 +딗 +딗 +딗 +딗 + +딘 +딘 +딘 +딘 +딘 + +딙 +딙 +딙 +딙 +딙 + +딚 +딚 +딚 +딚 +딚 + +딛 +딛 +딛 +딛 +딛 + +딜 +딜 +딜 +딜 +딜 + +딝 +딝 +딝 +딝 +딝 + +딞 +딞 +딞 +딞 +딞 + +딟 +딟 +딟 +딟 +딟 + +딠 +딠 +딠 +딠 +딠 + +딡 +딡 +딡 +딡 +딡 + +딢 +딢 +딢 +딢 +딢 + +딣 +딣 +딣 +딣 +딣 + +딤 +딤 +딤 +딤 +딤 + +딥 +딥 +딥 +딥 +딥 + +딦 +딦 +딦 +딦 +딦 + +딧 +딧 +딧 +딧 +딧 + +딨 +딨 +딨 +딨 +딨 + +딩 +딩 +딩 +딩 +딩 + +딪 +딪 +딪 +딪 +딪 + +딫 +딫 +딫 +딫 +딫 + +딬 +딬 +딬 +딬 +딬 + +딭 +딭 +딭 +딭 +딭 + +딮 +딮 +딮 +딮 +딮 + +딯 +딯 +딯 +딯 +딯 + +따 +따 +따 +따 +따 + +딱 +딱 +딱 +딱 +딱 + +딲 +딲 +딲 +딲 +딲 + +딳 +딳 +딳 +딳 +딳 + +딴 +딴 +딴 +딴 +딴 + +딵 +딵 +딵 +딵 +딵 + +딶 +딶 +딶 +딶 +딶 + +딷 +딷 +딷 +딷 +딷 + +딸 +딸 +딸 +딸 +딸 + +딹 +딹 +딹 +딹 +딹 + +딺 +딺 +딺 +딺 +딺 + +딻 +딻 +딻 +딻 +딻 + +딼 +딼 +딼 +딼 +딼 + +딽 +딽 +딽 +딽 +딽 + +딾 +딾 +딾 +딾 +딾 + +딿 +딿 +딿 +딿 +딿 + +땀 +땀 +땀 +땀 +땀 + +땁 +땁 +땁 +땁 +땁 + +땂 +땂 +땂 +땂 +땂 + +땃 +땃 +땃 +땃 +땃 + +땄 +땄 +땄 +땄 +땄 + +땅 +땅 +땅 +땅 +땅 + +땆 +땆 +땆 +땆 +땆 + +땇 +땇 +땇 +땇 +땇 + +땈 +땈 +땈 +땈 +땈 + +땉 +땉 +땉 +땉 +땉 + +땊 +땊 +땊 +땊 +땊 + +땋 +땋 +땋 +땋 +땋 + +때 +때 +때 +때 +때 + +땍 +땍 +땍 +땍 +땍 + +땎 +땎 +땎 +땎 +땎 + +땏 +땏 +땏 +땏 +땏 + +땐 +땐 +땐 +땐 +땐 + +땑 +땑 +땑 +땑 +땑 + +땒 +땒 +땒 +땒 +땒 + +땓 +땓 +땓 +땓 +땓 + +땔 +땔 +땔 +땔 +땔 + +땕 +땕 +땕 +땕 +땕 + +땖 +땖 +땖 +땖 +땖 + +땗 +땗 +땗 +땗 +땗 + +땘 +땘 +땘 +땘 +땘 + +땙 +땙 +땙 +땙 +땙 + +땚 +땚 +땚 +땚 +땚 + +땛 +땛 +땛 +땛 +땛 + +땜 +땜 +땜 +땜 +땜 + +땝 +땝 +땝 +땝 +땝 + +땞 +땞 +땞 +땞 +땞 + +땟 +땟 +땟 +땟 +땟 + +땠 +땠 +땠 +땠 +땠 + +땡 +땡 +땡 +땡 +땡 + +땢 +땢 +땢 +땢 +땢 + +땣 +땣 +땣 +땣 +땣 + +땤 +땤 +땤 +땤 +땤 + +땥 +땥 +땥 +땥 +땥 + +땦 +땦 +땦 +땦 +땦 + +땧 +땧 +땧 +땧 +땧 + +땨 +땨 +땨 +땨 +땨 + +땩 +땩 +땩 +땩 +땩 + +땪 +땪 +땪 +땪 +땪 + +땫 +땫 +땫 +땫 +땫 + +땬 +땬 +땬 +땬 +땬 + +땭 +땭 +땭 +땭 +땭 + +땮 +땮 +땮 +땮 +땮 + +땯 +땯 +땯 +땯 +땯 + +땰 +땰 +땰 +땰 +땰 + +땱 +땱 +땱 +땱 +땱 + +땲 +땲 +땲 +땲 +땲 + +땳 +땳 +땳 +땳 +땳 + +땴 +땴 +땴 +땴 +땴 + +땵 +땵 +땵 +땵 +땵 + +땶 +땶 +땶 +땶 +땶 + +땷 +땷 +땷 +땷 +땷 + +땸 +땸 +땸 +땸 +땸 + +땹 +땹 +땹 +땹 +땹 + +땺 +땺 +땺 +땺 +땺 + +땻 +땻 +땻 +땻 +땻 + +땼 +땼 +땼 +땼 +땼 + +땽 +땽 +땽 +땽 +땽 + +땾 +땾 +땾 +땾 +땾 + +땿 +땿 +땿 +땿 +땿 + +떀 +떀 +떀 +떀 +떀 + +떁 +떁 +떁 +떁 +떁 + +떂 +떂 +떂 +떂 +떂 + +떃 +떃 +떃 +떃 +떃 + +떄 +떄 +떄 +떄 +떄 + +떅 +떅 +떅 +떅 +떅 + +떆 +떆 +떆 +떆 +떆 + +떇 +떇 +떇 +떇 +떇 + +떈 +떈 +떈 +떈 +떈 + +떉 +떉 +떉 +떉 +떉 + +떊 +떊 +떊 +떊 +떊 + +떋 +떋 +떋 +떋 +떋 + +떌 +떌 +떌 +떌 +떌 + +떍 +떍 +떍 +떍 +떍 + +떎 +떎 +떎 +떎 +떎 + +떏 +떏 +떏 +떏 +떏 + +떐 +떐 +떐 +떐 +떐 + +떑 +떑 +떑 +떑 +떑 + +떒 +떒 +떒 +떒 +떒 + +떓 +떓 +떓 +떓 +떓 + +떔 +떔 +떔 +떔 +떔 + +떕 +떕 +떕 +떕 +떕 + +떖 +떖 +떖 +떖 +떖 + +떗 +떗 +떗 +떗 +떗 + +떘 +떘 +떘 +떘 +떘 + +떙 +떙 +떙 +떙 +떙 + +떚 +떚 +떚 +떚 +떚 + +떛 +떛 +떛 +떛 +떛 + +떜 +떜 +떜 +떜 +떜 + +떝 +떝 +떝 +떝 +떝 + +떞 +떞 +떞 +떞 +떞 + +떟 +떟 +떟 +떟 +떟 + +떠 +떠 +떠 +떠 +떠 + +떡 +떡 +떡 +떡 +떡 + +떢 +떢 +떢 +떢 +떢 + +떣 +떣 +떣 +떣 +떣 + +떤 +떤 +떤 +떤 +떤 + +떥 +떥 +떥 +떥 +떥 + +떦 +떦 +떦 +떦 +떦 + +떧 +떧 +떧 +떧 +떧 + +떨 +떨 +떨 +떨 +떨 + +떩 +떩 +떩 +떩 +떩 + +떪 +떪 +떪 +떪 +떪 + +떫 +떫 +떫 +떫 +떫 + +떬 +떬 +떬 +떬 +떬 + +떭 +떭 +떭 +떭 +떭 + +떮 +떮 +떮 +떮 +떮 + +떯 +떯 +떯 +떯 +떯 + +떰 +떰 +떰 +떰 +떰 + +떱 +떱 +떱 +떱 +떱 + +떲 +떲 +떲 +떲 +떲 + +떳 +떳 +떳 +떳 +떳 + +떴 +떴 +떴 +떴 +떴 + +떵 +떵 +떵 +떵 +떵 + +떶 +떶 +떶 +떶 +떶 + +떷 +떷 +떷 +떷 +떷 + +떸 +떸 +떸 +떸 +떸 + +떹 +떹 +떹 +떹 +떹 + +떺 +떺 +떺 +떺 +떺 + +떻 +떻 +떻 +떻 +떻 + +떼 +떼 +떼 +떼 +떼 + +떽 +떽 +떽 +떽 +떽 + +떾 +떾 +떾 +떾 +떾 + +떿 +떿 +떿 +떿 +떿 + +뗀 +뗀 +뗀 +뗀 +뗀 + +뗁 +뗁 +뗁 +뗁 +뗁 + +뗂 +뗂 +뗂 +뗂 +뗂 + +뗃 +뗃 +뗃 +뗃 +뗃 + +뗄 +뗄 +뗄 +뗄 +뗄 + +뗅 +뗅 +뗅 +뗅 +뗅 + +뗆 +뗆 +뗆 +뗆 +뗆 + +뗇 +뗇 +뗇 +뗇 +뗇 + +뗈 +뗈 +뗈 +뗈 +뗈 + +뗉 +뗉 +뗉 +뗉 +뗉 + +뗊 +뗊 +뗊 +뗊 +뗊 + +뗋 +뗋 +뗋 +뗋 +뗋 + +뗌 +뗌 +뗌 +뗌 +뗌 + +뗍 +뗍 +뗍 +뗍 +뗍 + +뗎 +뗎 +뗎 +뗎 +뗎 + +뗏 +뗏 +뗏 +뗏 +뗏 + +뗐 +뗐 +뗐 +뗐 +뗐 + +뗑 +뗑 +뗑 +뗑 +뗑 + +뗒 +뗒 +뗒 +뗒 +뗒 + +뗓 +뗓 +뗓 +뗓 +뗓 + +뗔 +뗔 +뗔 +뗔 +뗔 + +뗕 +뗕 +뗕 +뗕 +뗕 + +뗖 +뗖 +뗖 +뗖 +뗖 + +뗗 +뗗 +뗗 +뗗 +뗗 + +뗘 +뗘 +뗘 +뗘 +뗘 + +뗙 +뗙 +뗙 +뗙 +뗙 + +뗚 +뗚 +뗚 +뗚 +뗚 + +뗛 +뗛 +뗛 +뗛 +뗛 + +뗜 +뗜 +뗜 +뗜 +뗜 + +뗝 +뗝 +뗝 +뗝 +뗝 + +뗞 +뗞 +뗞 +뗞 +뗞 + +뗟 +뗟 +뗟 +뗟 +뗟 + +뗠 +뗠 +뗠 +뗠 +뗠 + +뗡 +뗡 +뗡 +뗡 +뗡 + +뗢 +뗢 +뗢 +뗢 +뗢 + +뗣 +뗣 +뗣 +뗣 +뗣 + +뗤 +뗤 +뗤 +뗤 +뗤 + +뗥 +뗥 +뗥 +뗥 +뗥 + +뗦 +뗦 +뗦 +뗦 +뗦 + +뗧 +뗧 +뗧 +뗧 +뗧 + +뗨 +뗨 +뗨 +뗨 +뗨 + +뗩 +뗩 +뗩 +뗩 +뗩 + +뗪 +뗪 +뗪 +뗪 +뗪 + +뗫 +뗫 +뗫 +뗫 +뗫 + +뗬 +뗬 +뗬 +뗬 +뗬 + +뗭 +뗭 +뗭 +뗭 +뗭 + +뗮 +뗮 +뗮 +뗮 +뗮 + +뗯 +뗯 +뗯 +뗯 +뗯 + +뗰 +뗰 +뗰 +뗰 +뗰 + +뗱 +뗱 +뗱 +뗱 +뗱 + +뗲 +뗲 +뗲 +뗲 +뗲 + +뗳 +뗳 +뗳 +뗳 +뗳 + +뗴 +뗴 +뗴 +뗴 +뗴 + +뗵 +뗵 +뗵 +뗵 +뗵 + +뗶 +뗶 +뗶 +뗶 +뗶 + +뗷 +뗷 +뗷 +뗷 +뗷 + +뗸 +뗸 +뗸 +뗸 +뗸 + +뗹 +뗹 +뗹 +뗹 +뗹 + +뗺 +뗺 +뗺 +뗺 +뗺 + +뗻 +뗻 +뗻 +뗻 +뗻 + +뗼 +뗼 +뗼 +뗼 +뗼 + +뗽 +뗽 +뗽 +뗽 +뗽 + +뗾 +뗾 +뗾 +뗾 +뗾 + +뗿 +뗿 +뗿 +뗿 +뗿 + +똀 +똀 +똀 +똀 +똀 + +똁 +똁 +똁 +똁 +똁 + +똂 +똂 +똂 +똂 +똂 + +똃 +똃 +똃 +똃 +똃 + +똄 +똄 +똄 +똄 +똄 + +똅 +똅 +똅 +똅 +똅 + +똆 +똆 +똆 +똆 +똆 + +똇 +똇 +똇 +똇 +똇 + +똈 +똈 +똈 +똈 +똈 + +똉 +똉 +똉 +똉 +똉 + +똊 +똊 +똊 +똊 +똊 + +똋 +똋 +똋 +똋 +똋 + +똌 +똌 +똌 +똌 +똌 + +똍 +똍 +똍 +똍 +똍 + +똎 +똎 +똎 +똎 +똎 + +똏 +똏 +똏 +똏 +똏 + +또 +또 +또 +또 +또 + +똑 +똑 +똑 +똑 +똑 + +똒 +똒 +똒 +똒 +똒 + +똓 +똓 +똓 +똓 +똓 + +똔 +똔 +똔 +똔 +똔 + +똕 +똕 +똕 +똕 +똕 + +똖 +똖 +똖 +똖 +똖 + +똗 +똗 +똗 +똗 +똗 + +똘 +똘 +똘 +똘 +똘 + +똙 +똙 +똙 +똙 +똙 + +똚 +똚 +똚 +똚 +똚 + +똛 +똛 +똛 +똛 +똛 + +똜 +똜 +똜 +똜 +똜 + +똝 +똝 +똝 +똝 +똝 + +똞 +똞 +똞 +똞 +똞 + +똟 +똟 +똟 +똟 +똟 + +똠 +똠 +똠 +똠 +똠 + +똡 +똡 +똡 +똡 +똡 + +똢 +똢 +똢 +똢 +똢 + +똣 +똣 +똣 +똣 +똣 + +똤 +똤 +똤 +똤 +똤 + +똥 +똥 +똥 +똥 +똥 + +똦 +똦 +똦 +똦 +똦 + +똧 +똧 +똧 +똧 +똧 + +똨 +똨 +똨 +똨 +똨 + +똩 +똩 +똩 +똩 +똩 + +똪 +똪 +똪 +똪 +똪 + +똫 +똫 +똫 +똫 +똫 + +똬 +똬 +똬 +똬 +똬 + +똭 +똭 +똭 +똭 +똭 + +똮 +똮 +똮 +똮 +똮 + +똯 +똯 +똯 +똯 +똯 + +똰 +똰 +똰 +똰 +똰 + +똱 +똱 +똱 +똱 +똱 + +똲 +똲 +똲 +똲 +똲 + +똳 +똳 +똳 +똳 +똳 + +똴 +똴 +똴 +똴 +똴 + +똵 +똵 +똵 +똵 +똵 + +똶 +똶 +똶 +똶 +똶 + +똷 +똷 +똷 +똷 +똷 + +똸 +똸 +똸 +똸 +똸 + +똹 +똹 +똹 +똹 +똹 + +똺 +똺 +똺 +똺 +똺 + +똻 +똻 +똻 +똻 +똻 + +똼 +똼 +똼 +똼 +똼 + +똽 +똽 +똽 +똽 +똽 + +똾 +똾 +똾 +똾 +똾 + +똿 +똿 +똿 +똿 +똿 + +뙀 +뙀 +뙀 +뙀 +뙀 + +뙁 +뙁 +뙁 +뙁 +뙁 + +뙂 +뙂 +뙂 +뙂 +뙂 + +뙃 +뙃 +뙃 +뙃 +뙃 + +뙄 +뙄 +뙄 +뙄 +뙄 + +뙅 +뙅 +뙅 +뙅 +뙅 + +뙆 +뙆 +뙆 +뙆 +뙆 + +뙇 +뙇 +뙇 +뙇 +뙇 + +뙈 +뙈 +뙈 +뙈 +뙈 + +뙉 +뙉 +뙉 +뙉 +뙉 + +뙊 +뙊 +뙊 +뙊 +뙊 + +뙋 +뙋 +뙋 +뙋 +뙋 + +뙌 +뙌 +뙌 +뙌 +뙌 + +뙍 +뙍 +뙍 +뙍 +뙍 + +뙎 +뙎 +뙎 +뙎 +뙎 + +뙏 +뙏 +뙏 +뙏 +뙏 + +뙐 +뙐 +뙐 +뙐 +뙐 + +뙑 +뙑 +뙑 +뙑 +뙑 + +뙒 +뙒 +뙒 +뙒 +뙒 + +뙓 +뙓 +뙓 +뙓 +뙓 + +뙔 +뙔 +뙔 +뙔 +뙔 + +뙕 +뙕 +뙕 +뙕 +뙕 + +뙖 +뙖 +뙖 +뙖 +뙖 + +뙗 +뙗 +뙗 +뙗 +뙗 + +뙘 +뙘 +뙘 +뙘 +뙘 + +뙙 +뙙 +뙙 +뙙 +뙙 + +뙚 +뙚 +뙚 +뙚 +뙚 + +뙛 +뙛 +뙛 +뙛 +뙛 + +뙜 +뙜 +뙜 +뙜 +뙜 + +뙝 +뙝 +뙝 +뙝 +뙝 + +뙞 +뙞 +뙞 +뙞 +뙞 + +뙟 +뙟 +뙟 +뙟 +뙟 + +뙠 +뙠 +뙠 +뙠 +뙠 + +뙡 +뙡 +뙡 +뙡 +뙡 + +뙢 +뙢 +뙢 +뙢 +뙢 + +뙣 +뙣 +뙣 +뙣 +뙣 + +뙤 +뙤 +뙤 +뙤 +뙤 + +뙥 +뙥 +뙥 +뙥 +뙥 + +뙦 +뙦 +뙦 +뙦 +뙦 + +뙧 +뙧 +뙧 +뙧 +뙧 + +뙨 +뙨 +뙨 +뙨 +뙨 + +뙩 +뙩 +뙩 +뙩 +뙩 + +뙪 +뙪 +뙪 +뙪 +뙪 + +뙫 +뙫 +뙫 +뙫 +뙫 + +뙬 +뙬 +뙬 +뙬 +뙬 + +뙭 +뙭 +뙭 +뙭 +뙭 + +뙮 +뙮 +뙮 +뙮 +뙮 + +뙯 +뙯 +뙯 +뙯 +뙯 + +뙰 +뙰 +뙰 +뙰 +뙰 + +뙱 +뙱 +뙱 +뙱 +뙱 + +뙲 +뙲 +뙲 +뙲 +뙲 + +뙳 +뙳 +뙳 +뙳 +뙳 + +뙴 +뙴 +뙴 +뙴 +뙴 + +뙵 +뙵 +뙵 +뙵 +뙵 + +뙶 +뙶 +뙶 +뙶 +뙶 + +뙷 +뙷 +뙷 +뙷 +뙷 + +뙸 +뙸 +뙸 +뙸 +뙸 + +뙹 +뙹 +뙹 +뙹 +뙹 + +뙺 +뙺 +뙺 +뙺 +뙺 + +뙻 +뙻 +뙻 +뙻 +뙻 + +뙼 +뙼 +뙼 +뙼 +뙼 + +뙽 +뙽 +뙽 +뙽 +뙽 + +뙾 +뙾 +뙾 +뙾 +뙾 + +뙿 +뙿 +뙿 +뙿 +뙿 + +뚀 +뚀 +뚀 +뚀 +뚀 + +뚁 +뚁 +뚁 +뚁 +뚁 + +뚂 +뚂 +뚂 +뚂 +뚂 + +뚃 +뚃 +뚃 +뚃 +뚃 + +뚄 +뚄 +뚄 +뚄 +뚄 + +뚅 +뚅 +뚅 +뚅 +뚅 + +뚆 +뚆 +뚆 +뚆 +뚆 + +뚇 +뚇 +뚇 +뚇 +뚇 + +뚈 +뚈 +뚈 +뚈 +뚈 + +뚉 +뚉 +뚉 +뚉 +뚉 + +뚊 +뚊 +뚊 +뚊 +뚊 + +뚋 +뚋 +뚋 +뚋 +뚋 + +뚌 +뚌 +뚌 +뚌 +뚌 + +뚍 +뚍 +뚍 +뚍 +뚍 + +뚎 +뚎 +뚎 +뚎 +뚎 + +뚏 +뚏 +뚏 +뚏 +뚏 + +뚐 +뚐 +뚐 +뚐 +뚐 + +뚑 +뚑 +뚑 +뚑 +뚑 + +뚒 +뚒 +뚒 +뚒 +뚒 + +뚓 +뚓 +뚓 +뚓 +뚓 + +뚔 +뚔 +뚔 +뚔 +뚔 + +뚕 +뚕 +뚕 +뚕 +뚕 + +뚖 +뚖 +뚖 +뚖 +뚖 + +뚗 +뚗 +뚗 +뚗 +뚗 + +뚘 +뚘 +뚘 +뚘 +뚘 + +뚙 +뚙 +뚙 +뚙 +뚙 + +뚚 +뚚 +뚚 +뚚 +뚚 + +뚛 +뚛 +뚛 +뚛 +뚛 + +뚜 +뚜 +뚜 +뚜 +뚜 + +뚝 +뚝 +뚝 +뚝 +뚝 + +뚞 +뚞 +뚞 +뚞 +뚞 + +뚟 +뚟 +뚟 +뚟 +뚟 + +뚠 +뚠 +뚠 +뚠 +뚠 + +뚡 +뚡 +뚡 +뚡 +뚡 + +뚢 +뚢 +뚢 +뚢 +뚢 + +뚣 +뚣 +뚣 +뚣 +뚣 + +뚤 +뚤 +뚤 +뚤 +뚤 + +뚥 +뚥 +뚥 +뚥 +뚥 + +뚦 +뚦 +뚦 +뚦 +뚦 + +뚧 +뚧 +뚧 +뚧 +뚧 + +뚨 +뚨 +뚨 +뚨 +뚨 + +뚩 +뚩 +뚩 +뚩 +뚩 + +뚪 +뚪 +뚪 +뚪 +뚪 + +뚫 +뚫 +뚫 +뚫 +뚫 + +뚬 +뚬 +뚬 +뚬 +뚬 + +뚭 +뚭 +뚭 +뚭 +뚭 + +뚮 +뚮 +뚮 +뚮 +뚮 + +뚯 +뚯 +뚯 +뚯 +뚯 + +뚰 +뚰 +뚰 +뚰 +뚰 + +뚱 +뚱 +뚱 +뚱 +뚱 + +뚲 +뚲 +뚲 +뚲 +뚲 + +뚳 +뚳 +뚳 +뚳 +뚳 + +뚴 +뚴 +뚴 +뚴 +뚴 + +뚵 +뚵 +뚵 +뚵 +뚵 + +뚶 +뚶 +뚶 +뚶 +뚶 + +뚷 +뚷 +뚷 +뚷 +뚷 + +뚸 +뚸 +뚸 +뚸 +뚸 + +뚹 +뚹 +뚹 +뚹 +뚹 + +뚺 +뚺 +뚺 +뚺 +뚺 + +뚻 +뚻 +뚻 +뚻 +뚻 + +뚼 +뚼 +뚼 +뚼 +뚼 + +뚽 +뚽 +뚽 +뚽 +뚽 + +뚾 +뚾 +뚾 +뚾 +뚾 + +뚿 +뚿 +뚿 +뚿 +뚿 + +뛀 +뛀 +뛀 +뛀 +뛀 + +뛁 +뛁 +뛁 +뛁 +뛁 + +뛂 +뛂 +뛂 +뛂 +뛂 + +뛃 +뛃 +뛃 +뛃 +뛃 + +뛄 +뛄 +뛄 +뛄 +뛄 + +뛅 +뛅 +뛅 +뛅 +뛅 + +뛆 +뛆 +뛆 +뛆 +뛆 + +뛇 +뛇 +뛇 +뛇 +뛇 + +뛈 +뛈 +뛈 +뛈 +뛈 + +뛉 +뛉 +뛉 +뛉 +뛉 + +뛊 +뛊 +뛊 +뛊 +뛊 + +뛋 +뛋 +뛋 +뛋 +뛋 + +뛌 +뛌 +뛌 +뛌 +뛌 + +뛍 +뛍 +뛍 +뛍 +뛍 + +뛎 +뛎 +뛎 +뛎 +뛎 + +뛏 +뛏 +뛏 +뛏 +뛏 + +뛐 +뛐 +뛐 +뛐 +뛐 + +뛑 +뛑 +뛑 +뛑 +뛑 + +뛒 +뛒 +뛒 +뛒 +뛒 + +뛓 +뛓 +뛓 +뛓 +뛓 + +뛔 +뛔 +뛔 +뛔 +뛔 + +뛕 +뛕 +뛕 +뛕 +뛕 + +뛖 +뛖 +뛖 +뛖 +뛖 + +뛗 +뛗 +뛗 +뛗 +뛗 + +뛘 +뛘 +뛘 +뛘 +뛘 + +뛙 +뛙 +뛙 +뛙 +뛙 + +뛚 +뛚 +뛚 +뛚 +뛚 + +뛛 +뛛 +뛛 +뛛 +뛛 + +뛜 +뛜 +뛜 +뛜 +뛜 + +뛝 +뛝 +뛝 +뛝 +뛝 + +뛞 +뛞 +뛞 +뛞 +뛞 + +뛟 +뛟 +뛟 +뛟 +뛟 + +뛠 +뛠 +뛠 +뛠 +뛠 + +뛡 +뛡 +뛡 +뛡 +뛡 + +뛢 +뛢 +뛢 +뛢 +뛢 + +뛣 +뛣 +뛣 +뛣 +뛣 + +뛤 +뛤 +뛤 +뛤 +뛤 + +뛥 +뛥 +뛥 +뛥 +뛥 + +뛦 +뛦 +뛦 +뛦 +뛦 + +뛧 +뛧 +뛧 +뛧 +뛧 + +뛨 +뛨 +뛨 +뛨 +뛨 + +뛩 +뛩 +뛩 +뛩 +뛩 + +뛪 +뛪 +뛪 +뛪 +뛪 + +뛫 +뛫 +뛫 +뛫 +뛫 + +뛬 +뛬 +뛬 +뛬 +뛬 + +뛭 +뛭 +뛭 +뛭 +뛭 + +뛮 +뛮 +뛮 +뛮 +뛮 + +뛯 +뛯 +뛯 +뛯 +뛯 + +뛰 +뛰 +뛰 +뛰 +뛰 + +뛱 +뛱 +뛱 +뛱 +뛱 + +뛲 +뛲 +뛲 +뛲 +뛲 + +뛳 +뛳 +뛳 +뛳 +뛳 + +뛴 +뛴 +뛴 +뛴 +뛴 + +뛵 +뛵 +뛵 +뛵 +뛵 + +뛶 +뛶 +뛶 +뛶 +뛶 + +뛷 +뛷 +뛷 +뛷 +뛷 + +뛸 +뛸 +뛸 +뛸 +뛸 + +뛹 +뛹 +뛹 +뛹 +뛹 + +뛺 +뛺 +뛺 +뛺 +뛺 + +뛻 +뛻 +뛻 +뛻 +뛻 + +뛼 +뛼 +뛼 +뛼 +뛼 + +뛽 +뛽 +뛽 +뛽 +뛽 + +뛾 +뛾 +뛾 +뛾 +뛾 + +뛿 +뛿 +뛿 +뛿 +뛿 + +뜀 +뜀 +뜀 +뜀 +뜀 + +뜁 +뜁 +뜁 +뜁 +뜁 + +뜂 +뜂 +뜂 +뜂 +뜂 + +뜃 +뜃 +뜃 +뜃 +뜃 + +뜄 +뜄 +뜄 +뜄 +뜄 + +뜅 +뜅 +뜅 +뜅 +뜅 + +뜆 +뜆 +뜆 +뜆 +뜆 + +뜇 +뜇 +뜇 +뜇 +뜇 + +뜈 +뜈 +뜈 +뜈 +뜈 + +뜉 +뜉 +뜉 +뜉 +뜉 + +뜊 +뜊 +뜊 +뜊 +뜊 + +뜋 +뜋 +뜋 +뜋 +뜋 + +뜌 +뜌 +뜌 +뜌 +뜌 + +뜍 +뜍 +뜍 +뜍 +뜍 + +뜎 +뜎 +뜎 +뜎 +뜎 + +뜏 +뜏 +뜏 +뜏 +뜏 + +뜐 +뜐 +뜐 +뜐 +뜐 + +뜑 +뜑 +뜑 +뜑 +뜑 + +뜒 +뜒 +뜒 +뜒 +뜒 + +뜓 +뜓 +뜓 +뜓 +뜓 + +뜔 +뜔 +뜔 +뜔 +뜔 + +뜕 +뜕 +뜕 +뜕 +뜕 + +뜖 +뜖 +뜖 +뜖 +뜖 + +뜗 +뜗 +뜗 +뜗 +뜗 + +뜘 +뜘 +뜘 +뜘 +뜘 + +뜙 +뜙 +뜙 +뜙 +뜙 + +뜚 +뜚 +뜚 +뜚 +뜚 + +뜛 +뜛 +뜛 +뜛 +뜛 + +뜜 +뜜 +뜜 +뜜 +뜜 + +뜝 +뜝 +뜝 +뜝 +뜝 + +뜞 +뜞 +뜞 +뜞 +뜞 + +뜟 +뜟 +뜟 +뜟 +뜟 + +뜠 +뜠 +뜠 +뜠 +뜠 + +뜡 +뜡 +뜡 +뜡 +뜡 + +뜢 +뜢 +뜢 +뜢 +뜢 + +뜣 +뜣 +뜣 +뜣 +뜣 + +뜤 +뜤 +뜤 +뜤 +뜤 + +뜥 +뜥 +뜥 +뜥 +뜥 + +뜦 +뜦 +뜦 +뜦 +뜦 + +뜧 +뜧 +뜧 +뜧 +뜧 + +뜨 +뜨 +뜨 +뜨 +뜨 + +뜩 +뜩 +뜩 +뜩 +뜩 + +뜪 +뜪 +뜪 +뜪 +뜪 + +뜫 +뜫 +뜫 +뜫 +뜫 + +뜬 +뜬 +뜬 +뜬 +뜬 + +뜭 +뜭 +뜭 +뜭 +뜭 + +뜮 +뜮 +뜮 +뜮 +뜮 + +뜯 +뜯 +뜯 +뜯 +뜯 + +뜰 +뜰 +뜰 +뜰 +뜰 + +뜱 +뜱 +뜱 +뜱 +뜱 + +뜲 +뜲 +뜲 +뜲 +뜲 + +뜳 +뜳 +뜳 +뜳 +뜳 + +뜴 +뜴 +뜴 +뜴 +뜴 + +뜵 +뜵 +뜵 +뜵 +뜵 + +뜶 +뜶 +뜶 +뜶 +뜶 + +뜷 +뜷 +뜷 +뜷 +뜷 + +뜸 +뜸 +뜸 +뜸 +뜸 + +뜹 +뜹 +뜹 +뜹 +뜹 + +뜺 +뜺 +뜺 +뜺 +뜺 + +뜻 +뜻 +뜻 +뜻 +뜻 + +뜼 +뜼 +뜼 +뜼 +뜼 + +뜽 +뜽 +뜽 +뜽 +뜽 + +뜾 +뜾 +뜾 +뜾 +뜾 + +뜿 +뜿 +뜿 +뜿 +뜿 + +띀 +띀 +띀 +띀 +띀 + +띁 +띁 +띁 +띁 +띁 + +띂 +띂 +띂 +띂 +띂 + +띃 +띃 +띃 +띃 +띃 + +띄 +띄 +띄 +띄 +띄 + +띅 +띅 +띅 +띅 +띅 + +띆 +띆 +띆 +띆 +띆 + +띇 +띇 +띇 +띇 +띇 + +띈 +띈 +띈 +띈 +띈 + +띉 +띉 +띉 +띉 +띉 + +띊 +띊 +띊 +띊 +띊 + +띋 +띋 +띋 +띋 +띋 + +띌 +띌 +띌 +띌 +띌 + +띍 +띍 +띍 +띍 +띍 + +띎 +띎 +띎 +띎 +띎 + +띏 +띏 +띏 +띏 +띏 + +띐 +띐 +띐 +띐 +띐 + +띑 +띑 +띑 +띑 +띑 + +띒 +띒 +띒 +띒 +띒 + +띓 +띓 +띓 +띓 +띓 + +띔 +띔 +띔 +띔 +띔 + +띕 +띕 +띕 +띕 +띕 + +띖 +띖 +띖 +띖 +띖 + +띗 +띗 +띗 +띗 +띗 + +띘 +띘 +띘 +띘 +띘 + +띙 +띙 +띙 +띙 +띙 + +띚 +띚 +띚 +띚 +띚 + +띛 +띛 +띛 +띛 +띛 + +띜 +띜 +띜 +띜 +띜 + +띝 +띝 +띝 +띝 +띝 + +띞 +띞 +띞 +띞 +띞 + +띟 +띟 +띟 +띟 +띟 + +띠 +띠 +띠 +띠 +띠 + +띡 +띡 +띡 +띡 +띡 + +띢 +띢 +띢 +띢 +띢 + +띣 +띣 +띣 +띣 +띣 + +띤 +띤 +띤 +띤 +띤 + +띥 +띥 +띥 +띥 +띥 + +띦 +띦 +띦 +띦 +띦 + +띧 +띧 +띧 +띧 +띧 + +띨 +띨 +띨 +띨 +띨 + +띩 +띩 +띩 +띩 +띩 + +띪 +띪 +띪 +띪 +띪 + +띫 +띫 +띫 +띫 +띫 + +띬 +띬 +띬 +띬 +띬 + +띭 +띭 +띭 +띭 +띭 + +띮 +띮 +띮 +띮 +띮 + +띯 +띯 +띯 +띯 +띯 + +띰 +띰 +띰 +띰 +띰 + +띱 +띱 +띱 +띱 +띱 + +띲 +띲 +띲 +띲 +띲 + +띳 +띳 +띳 +띳 +띳 + +띴 +띴 +띴 +띴 +띴 + +띵 +띵 +띵 +띵 +띵 + +띶 +띶 +띶 +띶 +띶 + +띷 +띷 +띷 +띷 +띷 + +띸 +띸 +띸 +띸 +띸 + +띹 +띹 +띹 +띹 +띹 + +띺 +띺 +띺 +띺 +띺 + +띻 +띻 +띻 +띻 +띻 + +라 +라 +라 +라 +라 + +락 +락 +락 +락 +락 + +띾 +띾 +띾 +띾 +띾 + +띿 +띿 +띿 +띿 +띿 + +란 +란 +란 +란 +란 + +랁 +랁 +랁 +랁 +랁 + +랂 +랂 +랂 +랂 +랂 + +랃 +랃 +랃 +랃 +랃 + +랄 +랄 +랄 +랄 +랄 + +랅 +랅 +랅 +랅 +랅 + +랆 +랆 +랆 +랆 +랆 + +랇 +랇 +랇 +랇 +랇 + +랈 +랈 +랈 +랈 +랈 + +랉 +랉 +랉 +랉 +랉 + +랊 +랊 +랊 +랊 +랊 + +랋 +랋 +랋 +랋 +랋 + +람 +람 +람 +람 +람 + +랍 +랍 +랍 +랍 +랍 + +랎 +랎 +랎 +랎 +랎 + +랏 +랏 +랏 +랏 +랏 + +랐 +랐 +랐 +랐 +랐 + +랑 +랑 +랑 +랑 +랑 + +랒 +랒 +랒 +랒 +랒 + +랓 +랓 +랓 +랓 +랓 + +랔 +랔 +랔 +랔 +랔 + +랕 +랕 +랕 +랕 +랕 + +랖 +랖 +랖 +랖 +랖 + +랗 +랗 +랗 +랗 +랗 + +래 +래 +래 +래 +래 + +랙 +랙 +랙 +랙 +랙 + +랚 +랚 +랚 +랚 +랚 + +랛 +랛 +랛 +랛 +랛 + +랜 +랜 +랜 +랜 +랜 + +랝 +랝 +랝 +랝 +랝 + +랞 +랞 +랞 +랞 +랞 + +랟 +랟 +랟 +랟 +랟 + +랠 +랠 +랠 +랠 +랠 + +랡 +랡 +랡 +랡 +랡 + +랢 +랢 +랢 +랢 +랢 + +랣 +랣 +랣 +랣 +랣 + +랤 +랤 +랤 +랤 +랤 + +랥 +랥 +랥 +랥 +랥 + +랦 +랦 +랦 +랦 +랦 + +랧 +랧 +랧 +랧 +랧 + +램 +램 +램 +램 +램 + +랩 +랩 +랩 +랩 +랩 + +랪 +랪 +랪 +랪 +랪 + +랫 +랫 +랫 +랫 +랫 + +랬 +랬 +랬 +랬 +랬 + +랭 +랭 +랭 +랭 +랭 + +랮 +랮 +랮 +랮 +랮 + +랯 +랯 +랯 +랯 +랯 + +랰 +랰 +랰 +랰 +랰 + +랱 +랱 +랱 +랱 +랱 + +랲 +랲 +랲 +랲 +랲 + +랳 +랳 +랳 +랳 +랳 + +랴 +랴 +랴 +랴 +랴 + +략 +략 +략 +략 +략 + +랶 +랶 +랶 +랶 +랶 + +랷 +랷 +랷 +랷 +랷 + +랸 +랸 +랸 +랸 +랸 + +랹 +랹 +랹 +랹 +랹 + +랺 +랺 +랺 +랺 +랺 + +랻 +랻 +랻 +랻 +랻 + +랼 +랼 +랼 +랼 +랼 + +랽 +랽 +랽 +랽 +랽 + +랾 +랾 +랾 +랾 +랾 + +랿 +랿 +랿 +랿 +랿 + +럀 +럀 +럀 +럀 +럀 + +럁 +럁 +럁 +럁 +럁 + +럂 +럂 +럂 +럂 +럂 + +럃 +럃 +럃 +럃 +럃 + +럄 +럄 +럄 +럄 +럄 + +럅 +럅 +럅 +럅 +럅 + +럆 +럆 +럆 +럆 +럆 + +럇 +럇 +럇 +럇 +럇 + +럈 +럈 +럈 +럈 +럈 + +량 +량 +량 +량 +량 + +럊 +럊 +럊 +럊 +럊 + +럋 +럋 +럋 +럋 +럋 + +럌 +럌 +럌 +럌 +럌 + +럍 +럍 +럍 +럍 +럍 + +럎 +럎 +럎 +럎 +럎 + +럏 +럏 +럏 +럏 +럏 + +럐 +럐 +럐 +럐 +럐 + +럑 +럑 +럑 +럑 +럑 + +럒 +럒 +럒 +럒 +럒 + +럓 +럓 +럓 +럓 +럓 + +럔 +럔 +럔 +럔 +럔 + +럕 +럕 +럕 +럕 +럕 + +럖 +럖 +럖 +럖 +럖 + +럗 +럗 +럗 +럗 +럗 + +럘 +럘 +럘 +럘 +럘 + +럙 +럙 +럙 +럙 +럙 + +럚 +럚 +럚 +럚 +럚 + +럛 +럛 +럛 +럛 +럛 + +럜 +럜 +럜 +럜 +럜 + +럝 +럝 +럝 +럝 +럝 + +럞 +럞 +럞 +럞 +럞 + +럟 +럟 +럟 +럟 +럟 + +럠 +럠 +럠 +럠 +럠 + +럡 +럡 +럡 +럡 +럡 + +럢 +럢 +럢 +럢 +럢 + +럣 +럣 +럣 +럣 +럣 + +럤 +럤 +럤 +럤 +럤 + +럥 +럥 +럥 +럥 +럥 + +럦 +럦 +럦 +럦 +럦 + +럧 +럧 +럧 +럧 +럧 + +럨 +럨 +럨 +럨 +럨 + +럩 +럩 +럩 +럩 +럩 + +럪 +럪 +럪 +럪 +럪 + +럫 +럫 +럫 +럫 +럫 + +러 +러 +러 +러 +러 + +럭 +럭 +럭 +럭 +럭 + +럮 +럮 +럮 +럮 +럮 + +럯 +럯 +럯 +럯 +럯 + +런 +런 +런 +런 +런 + +럱 +럱 +럱 +럱 +럱 + +럲 +럲 +럲 +럲 +럲 + +럳 +럳 +럳 +럳 +럳 + +럴 +럴 +럴 +럴 +럴 + +럵 +럵 +럵 +럵 +럵 + +럶 +럶 +럶 +럶 +럶 + +럷 +럷 +럷 +럷 +럷 + +럸 +럸 +럸 +럸 +럸 + +럹 +럹 +럹 +럹 +럹 + +럺 +럺 +럺 +럺 +럺 + +럻 +럻 +럻 +럻 +럻 + +럼 +럼 +럼 +럼 +럼 + +럽 +럽 +럽 +럽 +럽 + +럾 +럾 +럾 +럾 +럾 + +럿 +럿 +럿 +럿 +럿 + +렀 +렀 +렀 +렀 +렀 + +렁 +렁 +렁 +렁 +렁 + +렂 +렂 +렂 +렂 +렂 + +렃 +렃 +렃 +렃 +렃 + +렄 +렄 +렄 +렄 +렄 + +렅 +렅 +렅 +렅 +렅 + +렆 +렆 +렆 +렆 +렆 + +렇 +렇 +렇 +렇 +렇 + +레 +레 +레 +레 +레 + +렉 +렉 +렉 +렉 +렉 + +렊 +렊 +렊 +렊 +렊 + +렋 +렋 +렋 +렋 +렋 + +렌 +렌 +렌 +렌 +렌 + +렍 +렍 +렍 +렍 +렍 + +렎 +렎 +렎 +렎 +렎 + +렏 +렏 +렏 +렏 +렏 + +렐 +렐 +렐 +렐 +렐 + +렑 +렑 +렑 +렑 +렑 + +렒 +렒 +렒 +렒 +렒 + +렓 +렓 +렓 +렓 +렓 + +렔 +렔 +렔 +렔 +렔 + +렕 +렕 +렕 +렕 +렕 + +렖 +렖 +렖 +렖 +렖 + +렗 +렗 +렗 +렗 +렗 + +렘 +렘 +렘 +렘 +렘 + +렙 +렙 +렙 +렙 +렙 + +렚 +렚 +렚 +렚 +렚 + +렛 +렛 +렛 +렛 +렛 + +렜 +렜 +렜 +렜 +렜 + +렝 +렝 +렝 +렝 +렝 + +렞 +렞 +렞 +렞 +렞 + +렟 +렟 +렟 +렟 +렟 + +렠 +렠 +렠 +렠 +렠 + +렡 +렡 +렡 +렡 +렡 + +렢 +렢 +렢 +렢 +렢 + +렣 +렣 +렣 +렣 +렣 + +려 +려 +려 +려 +려 + +력 +력 +력 +력 +력 + +렦 +렦 +렦 +렦 +렦 + +렧 +렧 +렧 +렧 +렧 + +련 +련 +련 +련 +련 + +렩 +렩 +렩 +렩 +렩 + +렪 +렪 +렪 +렪 +렪 + +렫 +렫 +렫 +렫 +렫 + +렬 +렬 +렬 +렬 +렬 + +렭 +렭 +렭 +렭 +렭 + +렮 +렮 +렮 +렮 +렮 + +렯 +렯 +렯 +렯 +렯 + +렰 +렰 +렰 +렰 +렰 + +렱 +렱 +렱 +렱 +렱 + +렲 +렲 +렲 +렲 +렲 + +렳 +렳 +렳 +렳 +렳 + +렴 +렴 +렴 +렴 +렴 + +렵 +렵 +렵 +렵 +렵 + +렶 +렶 +렶 +렶 +렶 + +렷 +렷 +렷 +렷 +렷 + +렸 +렸 +렸 +렸 +렸 + +령 +령 +령 +령 +령 + +렺 +렺 +렺 +렺 +렺 + +렻 +렻 +렻 +렻 +렻 + +렼 +렼 +렼 +렼 +렼 + +렽 +렽 +렽 +렽 +렽 + +렾 +렾 +렾 +렾 +렾 + +렿 +렿 +렿 +렿 +렿 + +례 +례 +례 +례 +례 + +롁 +롁 +롁 +롁 +롁 + +롂 +롂 +롂 +롂 +롂 + +롃 +롃 +롃 +롃 +롃 + +롄 +롄 +롄 +롄 +롄 + +롅 +롅 +롅 +롅 +롅 + +롆 +롆 +롆 +롆 +롆 + +롇 +롇 +롇 +롇 +롇 + +롈 +롈 +롈 +롈 +롈 + +롉 +롉 +롉 +롉 +롉 + +롊 +롊 +롊 +롊 +롊 + +롋 +롋 +롋 +롋 +롋 + +롌 +롌 +롌 +롌 +롌 + +롍 +롍 +롍 +롍 +롍 + +롎 +롎 +롎 +롎 +롎 + +롏 +롏 +롏 +롏 +롏 + +롐 +롐 +롐 +롐 +롐 + +롑 +롑 +롑 +롑 +롑 + +롒 +롒 +롒 +롒 +롒 + +롓 +롓 +롓 +롓 +롓 + +롔 +롔 +롔 +롔 +롔 + +롕 +롕 +롕 +롕 +롕 + +롖 +롖 +롖 +롖 +롖 + +롗 +롗 +롗 +롗 +롗 + +롘 +롘 +롘 +롘 +롘 + +롙 +롙 +롙 +롙 +롙 + +롚 +롚 +롚 +롚 +롚 + +롛 +롛 +롛 +롛 +롛 + +로 +로 +로 +로 +로 + +록 +록 +록 +록 +록 + +롞 +롞 +롞 +롞 +롞 + +롟 +롟 +롟 +롟 +롟 + +론 +론 +론 +론 +론 + +롡 +롡 +롡 +롡 +롡 + +롢 +롢 +롢 +롢 +롢 + +롣 +롣 +롣 +롣 +롣 + +롤 +롤 +롤 +롤 +롤 + +롥 +롥 +롥 +롥 +롥 + +롦 +롦 +롦 +롦 +롦 + +롧 +롧 +롧 +롧 +롧 + +롨 +롨 +롨 +롨 +롨 + +롩 +롩 +롩 +롩 +롩 + +롪 +롪 +롪 +롪 +롪 + +롫 +롫 +롫 +롫 +롫 + +롬 +롬 +롬 +롬 +롬 + +롭 +롭 +롭 +롭 +롭 + +롮 +롮 +롮 +롮 +롮 + +롯 +롯 +롯 +롯 +롯 + +롰 +롰 +롰 +롰 +롰 + +롱 +롱 +롱 +롱 +롱 + +롲 +롲 +롲 +롲 +롲 + +롳 +롳 +롳 +롳 +롳 + +롴 +롴 +롴 +롴 +롴 + +롵 +롵 +롵 +롵 +롵 + +롶 +롶 +롶 +롶 +롶 + +롷 +롷 +롷 +롷 +롷 + +롸 +롸 +롸 +롸 +롸 + +롹 +롹 +롹 +롹 +롹 + +롺 +롺 +롺 +롺 +롺 + +롻 +롻 +롻 +롻 +롻 + +롼 +롼 +롼 +롼 +롼 + +롽 +롽 +롽 +롽 +롽 + +롾 +롾 +롾 +롾 +롾 + +롿 +롿 +롿 +롿 +롿 + +뢀 +뢀 +뢀 +뢀 +뢀 + +뢁 +뢁 +뢁 +뢁 +뢁 + +뢂 +뢂 +뢂 +뢂 +뢂 + +뢃 +뢃 +뢃 +뢃 +뢃 + +뢄 +뢄 +뢄 +뢄 +뢄 + +뢅 +뢅 +뢅 +뢅 +뢅 + +뢆 +뢆 +뢆 +뢆 +뢆 + +뢇 +뢇 +뢇 +뢇 +뢇 + +뢈 +뢈 +뢈 +뢈 +뢈 + +뢉 +뢉 +뢉 +뢉 +뢉 + +뢊 +뢊 +뢊 +뢊 +뢊 + +뢋 +뢋 +뢋 +뢋 +뢋 + +뢌 +뢌 +뢌 +뢌 +뢌 + +뢍 +뢍 +뢍 +뢍 +뢍 + +뢎 +뢎 +뢎 +뢎 +뢎 + +뢏 +뢏 +뢏 +뢏 +뢏 + +뢐 +뢐 +뢐 +뢐 +뢐 + +뢑 +뢑 +뢑 +뢑 +뢑 + +뢒 +뢒 +뢒 +뢒 +뢒 + +뢓 +뢓 +뢓 +뢓 +뢓 + +뢔 +뢔 +뢔 +뢔 +뢔 + +뢕 +뢕 +뢕 +뢕 +뢕 + +뢖 +뢖 +뢖 +뢖 +뢖 + +뢗 +뢗 +뢗 +뢗 +뢗 + +뢘 +뢘 +뢘 +뢘 +뢘 + +뢙 +뢙 +뢙 +뢙 +뢙 + +뢚 +뢚 +뢚 +뢚 +뢚 + +뢛 +뢛 +뢛 +뢛 +뢛 + +뢜 +뢜 +뢜 +뢜 +뢜 + +뢝 +뢝 +뢝 +뢝 +뢝 + +뢞 +뢞 +뢞 +뢞 +뢞 + +뢟 +뢟 +뢟 +뢟 +뢟 + +뢠 +뢠 +뢠 +뢠 +뢠 + +뢡 +뢡 +뢡 +뢡 +뢡 + +뢢 +뢢 +뢢 +뢢 +뢢 + +뢣 +뢣 +뢣 +뢣 +뢣 + +뢤 +뢤 +뢤 +뢤 +뢤 + +뢥 +뢥 +뢥 +뢥 +뢥 + +뢦 +뢦 +뢦 +뢦 +뢦 + +뢧 +뢧 +뢧 +뢧 +뢧 + +뢨 +뢨 +뢨 +뢨 +뢨 + +뢩 +뢩 +뢩 +뢩 +뢩 + +뢪 +뢪 +뢪 +뢪 +뢪 + +뢫 +뢫 +뢫 +뢫 +뢫 + +뢬 +뢬 +뢬 +뢬 +뢬 + +뢭 +뢭 +뢭 +뢭 +뢭 + +뢮 +뢮 +뢮 +뢮 +뢮 + +뢯 +뢯 +뢯 +뢯 +뢯 + +뢰 +뢰 +뢰 +뢰 +뢰 + +뢱 +뢱 +뢱 +뢱 +뢱 + +뢲 +뢲 +뢲 +뢲 +뢲 + +뢳 +뢳 +뢳 +뢳 +뢳 + +뢴 +뢴 +뢴 +뢴 +뢴 + +뢵 +뢵 +뢵 +뢵 +뢵 + +뢶 +뢶 +뢶 +뢶 +뢶 + +뢷 +뢷 +뢷 +뢷 +뢷 + +뢸 +뢸 +뢸 +뢸 +뢸 + +뢹 +뢹 +뢹 +뢹 +뢹 + +뢺 +뢺 +뢺 +뢺 +뢺 + +뢻 +뢻 +뢻 +뢻 +뢻 + +뢼 +뢼 +뢼 +뢼 +뢼 + +뢽 +뢽 +뢽 +뢽 +뢽 + +뢾 +뢾 +뢾 +뢾 +뢾 + +뢿 +뢿 +뢿 +뢿 +뢿 + +룀 +룀 +룀 +룀 +룀 + +룁 +룁 +룁 +룁 +룁 + +룂 +룂 +룂 +룂 +룂 + +룃 +룃 +룃 +룃 +룃 + +룄 +룄 +룄 +룄 +룄 + +룅 +룅 +룅 +룅 +룅 + +룆 +룆 +룆 +룆 +룆 + +룇 +룇 +룇 +룇 +룇 + +룈 +룈 +룈 +룈 +룈 + +룉 +룉 +룉 +룉 +룉 + +룊 +룊 +룊 +룊 +룊 + +룋 +룋 +룋 +룋 +룋 + +료 +료 +료 +료 +료 + +룍 +룍 +룍 +룍 +룍 + +룎 +룎 +룎 +룎 +룎 + +룏 +룏 +룏 +룏 +룏 + +룐 +룐 +룐 +룐 +룐 + +룑 +룑 +룑 +룑 +룑 + +룒 +룒 +룒 +룒 +룒 + +룓 +룓 +룓 +룓 +룓 + +룔 +룔 +룔 +룔 +룔 + +룕 +룕 +룕 +룕 +룕 + +룖 +룖 +룖 +룖 +룖 + +룗 +룗 +룗 +룗 +룗 + +룘 +룘 +룘 +룘 +룘 + +룙 +룙 +룙 +룙 +룙 + +룚 +룚 +룚 +룚 +룚 + +룛 +룛 +룛 +룛 +룛 + +룜 +룜 +룜 +룜 +룜 + +룝 +룝 +룝 +룝 +룝 + +룞 +룞 +룞 +룞 +룞 + +룟 +룟 +룟 +룟 +룟 + +룠 +룠 +룠 +룠 +룠 + +룡 +룡 +룡 +룡 +룡 + +룢 +룢 +룢 +룢 +룢 + +룣 +룣 +룣 +룣 +룣 + +룤 +룤 +룤 +룤 +룤 + +룥 +룥 +룥 +룥 +룥 + +룦 +룦 +룦 +룦 +룦 + +룧 +룧 +룧 +룧 +룧 + +루 +루 +루 +루 +루 + +룩 +룩 +룩 +룩 +룩 + +룪 +룪 +룪 +룪 +룪 + +룫 +룫 +룫 +룫 +룫 + +룬 +룬 +룬 +룬 +룬 + +룭 +룭 +룭 +룭 +룭 + +룮 +룮 +룮 +룮 +룮 + +룯 +룯 +룯 +룯 +룯 + +룰 +룰 +룰 +룰 +룰 + +룱 +룱 +룱 +룱 +룱 + +룲 +룲 +룲 +룲 +룲 + +룳 +룳 +룳 +룳 +룳 + +룴 +룴 +룴 +룴 +룴 + +룵 +룵 +룵 +룵 +룵 + +룶 +룶 +룶 +룶 +룶 + +룷 +룷 +룷 +룷 +룷 + +룸 +룸 +룸 +룸 +룸 + +룹 +룹 +룹 +룹 +룹 + +룺 +룺 +룺 +룺 +룺 + +룻 +룻 +룻 +룻 +룻 + +룼 +룼 +룼 +룼 +룼 + +룽 +룽 +룽 +룽 +룽 + +룾 +룾 +룾 +룾 +룾 + +룿 +룿 +룿 +룿 +룿 + +뤀 +뤀 +뤀 +뤀 +뤀 + +뤁 +뤁 +뤁 +뤁 +뤁 + +뤂 +뤂 +뤂 +뤂 +뤂 + +뤃 +뤃 +뤃 +뤃 +뤃 + +뤄 +뤄 +뤄 +뤄 +뤄 + +뤅 +뤅 +뤅 +뤅 +뤅 + +뤆 +뤆 +뤆 +뤆 +뤆 + +뤇 +뤇 +뤇 +뤇 +뤇 + +뤈 +뤈 +뤈 +뤈 +뤈 + +뤉 +뤉 +뤉 +뤉 +뤉 + +뤊 +뤊 +뤊 +뤊 +뤊 + +뤋 +뤋 +뤋 +뤋 +뤋 + +뤌 +뤌 +뤌 +뤌 +뤌 + +뤍 +뤍 +뤍 +뤍 +뤍 + +뤎 +뤎 +뤎 +뤎 +뤎 + +뤏 +뤏 +뤏 +뤏 +뤏 + +뤐 +뤐 +뤐 +뤐 +뤐 + +뤑 +뤑 +뤑 +뤑 +뤑 + +뤒 +뤒 +뤒 +뤒 +뤒 + +뤓 +뤓 +뤓 +뤓 +뤓 + +뤔 +뤔 +뤔 +뤔 +뤔 + +뤕 +뤕 +뤕 +뤕 +뤕 + +뤖 +뤖 +뤖 +뤖 +뤖 + +뤗 +뤗 +뤗 +뤗 +뤗 + +뤘 +뤘 +뤘 +뤘 +뤘 + +뤙 +뤙 +뤙 +뤙 +뤙 + +뤚 +뤚 +뤚 +뤚 +뤚 + +뤛 +뤛 +뤛 +뤛 +뤛 + +뤜 +뤜 +뤜 +뤜 +뤜 + +뤝 +뤝 +뤝 +뤝 +뤝 + +뤞 +뤞 +뤞 +뤞 +뤞 + +뤟 +뤟 +뤟 +뤟 +뤟 + +뤠 +뤠 +뤠 +뤠 +뤠 + +뤡 +뤡 +뤡 +뤡 +뤡 + +뤢 +뤢 +뤢 +뤢 +뤢 + +뤣 +뤣 +뤣 +뤣 +뤣 + +뤤 +뤤 +뤤 +뤤 +뤤 + +뤥 +뤥 +뤥 +뤥 +뤥 + +뤦 +뤦 +뤦 +뤦 +뤦 + +뤧 +뤧 +뤧 +뤧 +뤧 + +뤨 +뤨 +뤨 +뤨 +뤨 + +뤩 +뤩 +뤩 +뤩 +뤩 + +뤪 +뤪 +뤪 +뤪 +뤪 + +뤫 +뤫 +뤫 +뤫 +뤫 + +뤬 +뤬 +뤬 +뤬 +뤬 + +뤭 +뤭 +뤭 +뤭 +뤭 + +뤮 +뤮 +뤮 +뤮 +뤮 + +뤯 +뤯 +뤯 +뤯 +뤯 + +뤰 +뤰 +뤰 +뤰 +뤰 + +뤱 +뤱 +뤱 +뤱 +뤱 + +뤲 +뤲 +뤲 +뤲 +뤲 + +뤳 +뤳 +뤳 +뤳 +뤳 + +뤴 +뤴 +뤴 +뤴 +뤴 + +뤵 +뤵 +뤵 +뤵 +뤵 + +뤶 +뤶 +뤶 +뤶 +뤶 + +뤷 +뤷 +뤷 +뤷 +뤷 + +뤸 +뤸 +뤸 +뤸 +뤸 + +뤹 +뤹 +뤹 +뤹 +뤹 + +뤺 +뤺 +뤺 +뤺 +뤺 + +뤻 +뤻 +뤻 +뤻 +뤻 + +뤼 +뤼 +뤼 +뤼 +뤼 + +뤽 +뤽 +뤽 +뤽 +뤽 + +뤾 +뤾 +뤾 +뤾 +뤾 + +뤿 +뤿 +뤿 +뤿 +뤿 + +륀 +륀 +륀 +륀 +륀 + +륁 +륁 +륁 +륁 +륁 + +륂 +륂 +륂 +륂 +륂 + +륃 +륃 +륃 +륃 +륃 + +륄 +륄 +륄 +륄 +륄 + +륅 +륅 +륅 +륅 +륅 + +륆 +륆 +륆 +륆 +륆 + +륇 +륇 +륇 +륇 +륇 + +륈 +륈 +륈 +륈 +륈 + +륉 +륉 +륉 +륉 +륉 + +륊 +륊 +륊 +륊 +륊 + +륋 +륋 +륋 +륋 +륋 + +륌 +륌 +륌 +륌 +륌 + +륍 +륍 +륍 +륍 +륍 + +륎 +륎 +륎 +륎 +륎 + +륏 +륏 +륏 +륏 +륏 + +륐 +륐 +륐 +륐 +륐 + +륑 +륑 +륑 +륑 +륑 + +륒 +륒 +륒 +륒 +륒 + +륓 +륓 +륓 +륓 +륓 + +륔 +륔 +륔 +륔 +륔 + +륕 +륕 +륕 +륕 +륕 + +륖 +륖 +륖 +륖 +륖 + +륗 +륗 +륗 +륗 +륗 + +류 +류 +류 +류 +류 + +륙 +륙 +륙 +륙 +륙 + +륚 +륚 +륚 +륚 +륚 + +륛 +륛 +륛 +륛 +륛 + +륜 +륜 +륜 +륜 +륜 + +륝 +륝 +륝 +륝 +륝 + +륞 +륞 +륞 +륞 +륞 + +륟 +륟 +륟 +륟 +륟 + +률 +률 +률 +률 +률 + +륡 +륡 +륡 +륡 +륡 + +륢 +륢 +륢 +륢 +륢 + +륣 +륣 +륣 +륣 +륣 + +륤 +륤 +륤 +륤 +륤 + +륥 +륥 +륥 +륥 +륥 + +륦 +륦 +륦 +륦 +륦 + +륧 +륧 +륧 +륧 +륧 + +륨 +륨 +륨 +륨 +륨 + +륩 +륩 +륩 +륩 +륩 + +륪 +륪 +륪 +륪 +륪 + +륫 +륫 +륫 +륫 +륫 + +륬 +륬 +륬 +륬 +륬 + +륭 +륭 +륭 +륭 +륭 + +륮 +륮 +륮 +륮 +륮 + +륯 +륯 +륯 +륯 +륯 + +륰 +륰 +륰 +륰 +륰 + +륱 +륱 +륱 +륱 +륱 + +륲 +륲 +륲 +륲 +륲 + +륳 +륳 +륳 +륳 +륳 + +르 +르 +르 +르 +르 + +륵 +륵 +륵 +륵 +륵 + +륶 +륶 +륶 +륶 +륶 + +륷 +륷 +륷 +륷 +륷 + +른 +른 +른 +른 +른 + +륹 +륹 +륹 +륹 +륹 + +륺 +륺 +륺 +륺 +륺 + +륻 +륻 +륻 +륻 +륻 + +를 +를 +를 +를 +를 + +륽 +륽 +륽 +륽 +륽 + +륾 +륾 +륾 +륾 +륾 + +륿 +륿 +륿 +륿 +륿 + +릀 +릀 +릀 +릀 +릀 + +릁 +릁 +릁 +릁 +릁 + +릂 +릂 +릂 +릂 +릂 + +릃 +릃 +릃 +릃 +릃 + +름 +름 +름 +름 +름 + +릅 +릅 +릅 +릅 +릅 + +릆 +릆 +릆 +릆 +릆 + +릇 +릇 +릇 +릇 +릇 + +릈 +릈 +릈 +릈 +릈 + +릉 +릉 +릉 +릉 +릉 + +릊 +릊 +릊 +릊 +릊 + +릋 +릋 +릋 +릋 +릋 + +릌 +릌 +릌 +릌 +릌 + +릍 +릍 +릍 +릍 +릍 + +릎 +릎 +릎 +릎 +릎 + +릏 +릏 +릏 +릏 +릏 + +릐 +릐 +릐 +릐 +릐 + +릑 +릑 +릑 +릑 +릑 + +릒 +릒 +릒 +릒 +릒 + +릓 +릓 +릓 +릓 +릓 + +릔 +릔 +릔 +릔 +릔 + +릕 +릕 +릕 +릕 +릕 + +릖 +릖 +릖 +릖 +릖 + +릗 +릗 +릗 +릗 +릗 + +릘 +릘 +릘 +릘 +릘 + +릙 +릙 +릙 +릙 +릙 + +릚 +릚 +릚 +릚 +릚 + +릛 +릛 +릛 +릛 +릛 + +릜 +릜 +릜 +릜 +릜 + +릝 +릝 +릝 +릝 +릝 + +릞 +릞 +릞 +릞 +릞 + +릟 +릟 +릟 +릟 +릟 + +릠 +릠 +릠 +릠 +릠 + +릡 +릡 +릡 +릡 +릡 + +릢 +릢 +릢 +릢 +릢 + +릣 +릣 +릣 +릣 +릣 + +릤 +릤 +릤 +릤 +릤 + +릥 +릥 +릥 +릥 +릥 + +릦 +릦 +릦 +릦 +릦 + +릧 +릧 +릧 +릧 +릧 + +릨 +릨 +릨 +릨 +릨 + +릩 +릩 +릩 +릩 +릩 + +릪 +릪 +릪 +릪 +릪 + +릫 +릫 +릫 +릫 +릫 + +리 +리 +리 +리 +리 + +릭 +릭 +릭 +릭 +릭 + +릮 +릮 +릮 +릮 +릮 + +릯 +릯 +릯 +릯 +릯 + +린 +린 +린 +린 +린 + +릱 +릱 +릱 +릱 +릱 + +릲 +릲 +릲 +릲 +릲 + +릳 +릳 +릳 +릳 +릳 + +릴 +릴 +릴 +릴 +릴 + +릵 +릵 +릵 +릵 +릵 + +릶 +릶 +릶 +릶 +릶 + +릷 +릷 +릷 +릷 +릷 + +릸 +릸 +릸 +릸 +릸 + +릹 +릹 +릹 +릹 +릹 + +릺 +릺 +릺 +릺 +릺 + +릻 +릻 +릻 +릻 +릻 + +림 +림 +림 +림 +림 + +립 +립 +립 +립 +립 + +릾 +릾 +릾 +릾 +릾 + +릿 +릿 +릿 +릿 +릿 + +맀 +맀 +맀 +맀 +맀 + +링 +링 +링 +링 +링 + +맂 +맂 +맂 +맂 +맂 + +맃 +맃 +맃 +맃 +맃 + +맄 +맄 +맄 +맄 +맄 + +맅 +맅 +맅 +맅 +맅 + +맆 +맆 +맆 +맆 +맆 + +맇 +맇 +맇 +맇 +맇 + +마 +마 +마 +마 +마 + +막 +막 +막 +막 +막 + +맊 +맊 +맊 +맊 +맊 + +맋 +맋 +맋 +맋 +맋 + +만 +만 +만 +만 +만 + +맍 +맍 +맍 +맍 +맍 + +많 +많 +많 +많 +많 + +맏 +맏 +맏 +맏 +맏 + +말 +말 +말 +말 +말 + +맑 +맑 +맑 +맑 +맑 + +맒 +맒 +맒 +맒 +맒 + +맓 +맓 +맓 +맓 +맓 + +맔 +맔 +맔 +맔 +맔 + +맕 +맕 +맕 +맕 +맕 + +맖 +맖 +맖 +맖 +맖 + +맗 +맗 +맗 +맗 +맗 + +맘 +맘 +맘 +맘 +맘 + +맙 +맙 +맙 +맙 +맙 + +맚 +맚 +맚 +맚 +맚 + +맛 +맛 +맛 +맛 +맛 + +맜 +맜 +맜 +맜 +맜 + +망 +망 +망 +망 +망 + +맞 +맞 +맞 +맞 +맞 + +맟 +맟 +맟 +맟 +맟 + +맠 +맠 +맠 +맠 +맠 + +맡 +맡 +맡 +맡 +맡 + +맢 +맢 +맢 +맢 +맢 + +맣 +맣 +맣 +맣 +맣 + +매 +매 +매 +매 +매 + +맥 +맥 +맥 +맥 +맥 + +맦 +맦 +맦 +맦 +맦 + +맧 +맧 +맧 +맧 +맧 + +맨 +맨 +맨 +맨 +맨 + +맩 +맩 +맩 +맩 +맩 + +맪 +맪 +맪 +맪 +맪 + +맫 +맫 +맫 +맫 +맫 + +맬 +맬 +맬 +맬 +맬 + +맭 +맭 +맭 +맭 +맭 + +맮 +맮 +맮 +맮 +맮 + +맯 +맯 +맯 +맯 +맯 + +맰 +맰 +맰 +맰 +맰 + +맱 +맱 +맱 +맱 +맱 + +맲 +맲 +맲 +맲 +맲 + +맳 +맳 +맳 +맳 +맳 + +맴 +맴 +맴 +맴 +맴 + +맵 +맵 +맵 +맵 +맵 + +맶 +맶 +맶 +맶 +맶 + +맷 +맷 +맷 +맷 +맷 + +맸 +맸 +맸 +맸 +맸 + +맹 +맹 +맹 +맹 +맹 + +맺 +맺 +맺 +맺 +맺 + +맻 +맻 +맻 +맻 +맻 + +맼 +맼 +맼 +맼 +맼 + +맽 +맽 +맽 +맽 +맽 + +맾 +맾 +맾 +맾 +맾 + +맿 +맿 +맿 +맿 +맿 + +먀 +먀 +먀 +먀 +먀 + +먁 +먁 +먁 +먁 +먁 + +먂 +먂 +먂 +먂 +먂 + +먃 +먃 +먃 +먃 +먃 + +먄 +먄 +먄 +먄 +먄 + +먅 +먅 +먅 +먅 +먅 + +먆 +먆 +먆 +먆 +먆 + +먇 +먇 +먇 +먇 +먇 + +먈 +먈 +먈 +먈 +먈 + +먉 +먉 +먉 +먉 +먉 + +먊 +먊 +먊 +먊 +먊 + +먋 +먋 +먋 +먋 +먋 + +먌 +먌 +먌 +먌 +먌 + +먍 +먍 +먍 +먍 +먍 + +먎 +먎 +먎 +먎 +먎 + +먏 +먏 +먏 +먏 +먏 + +먐 +먐 +먐 +먐 +먐 + +먑 +먑 +먑 +먑 +먑 + +먒 +먒 +먒 +먒 +먒 + +먓 +먓 +먓 +먓 +먓 + +먔 +먔 +먔 +먔 +먔 + +먕 +먕 +먕 +먕 +먕 + +먖 +먖 +먖 +먖 +먖 + +먗 +먗 +먗 +먗 +먗 + +먘 +먘 +먘 +먘 +먘 + +먙 +먙 +먙 +먙 +먙 + +먚 +먚 +먚 +먚 +먚 + +먛 +먛 +먛 +먛 +먛 + +먜 +먜 +먜 +먜 +먜 + +먝 +먝 +먝 +먝 +먝 + +먞 +먞 +먞 +먞 +먞 + +먟 +먟 +먟 +먟 +먟 + +먠 +먠 +먠 +먠 +먠 + +먡 +먡 +먡 +먡 +먡 + +먢 +먢 +먢 +먢 +먢 + +먣 +먣 +먣 +먣 +먣 + +먤 +먤 +먤 +먤 +먤 + +먥 +먥 +먥 +먥 +먥 + +먦 +먦 +먦 +먦 +먦 + +먧 +먧 +먧 +먧 +먧 + +먨 +먨 +먨 +먨 +먨 + +먩 +먩 +먩 +먩 +먩 + +먪 +먪 +먪 +먪 +먪 + +먫 +먫 +먫 +먫 +먫 + +먬 +먬 +먬 +먬 +먬 + +먭 +먭 +먭 +먭 +먭 + +먮 +먮 +먮 +먮 +먮 + +먯 +먯 +먯 +먯 +먯 + +먰 +먰 +먰 +먰 +먰 + +먱 +먱 +먱 +먱 +먱 + +먲 +먲 +먲 +먲 +먲 + +먳 +먳 +먳 +먳 +먳 + +먴 +먴 +먴 +먴 +먴 + +먵 +먵 +먵 +먵 +먵 + +먶 +먶 +먶 +먶 +먶 + +먷 +먷 +먷 +먷 +먷 + +머 +머 +머 +머 +머 + +먹 +먹 +먹 +먹 +먹 + +먺 +먺 +먺 +먺 +먺 + +먻 +먻 +먻 +먻 +먻 + +먼 +먼 +먼 +먼 +먼 + +먽 +먽 +먽 +먽 +먽 + +먾 +먾 +먾 +먾 +먾 + +먿 +먿 +먿 +먿 +먿 + +멀 +멀 +멀 +멀 +멀 + +멁 +멁 +멁 +멁 +멁 + +멂 +멂 +멂 +멂 +멂 + +멃 +멃 +멃 +멃 +멃 + +멄 +멄 +멄 +멄 +멄 + +멅 +멅 +멅 +멅 +멅 + +멆 +멆 +멆 +멆 +멆 + +멇 +멇 +멇 +멇 +멇 + +멈 +멈 +멈 +멈 +멈 + +멉 +멉 +멉 +멉 +멉 + +멊 +멊 +멊 +멊 +멊 + +멋 +멋 +멋 +멋 +멋 + +멌 +멌 +멌 +멌 +멌 + +멍 +멍 +멍 +멍 +멍 + +멎 +멎 +멎 +멎 +멎 + +멏 +멏 +멏 +멏 +멏 + +멐 +멐 +멐 +멐 +멐 + +멑 +멑 +멑 +멑 +멑 + +멒 +멒 +멒 +멒 +멒 + +멓 +멓 +멓 +멓 +멓 + +메 +메 +메 +메 +메 + +멕 +멕 +멕 +멕 +멕 + +멖 +멖 +멖 +멖 +멖 + +멗 +멗 +멗 +멗 +멗 + +멘 +멘 +멘 +멘 +멘 + +멙 +멙 +멙 +멙 +멙 + +멚 +멚 +멚 +멚 +멚 + +멛 +멛 +멛 +멛 +멛 + +멜 +멜 +멜 +멜 +멜 + +멝 +멝 +멝 +멝 +멝 + +멞 +멞 +멞 +멞 +멞 + +멟 +멟 +멟 +멟 +멟 + +멠 +멠 +멠 +멠 +멠 + +멡 +멡 +멡 +멡 +멡 + +멢 +멢 +멢 +멢 +멢 + +멣 +멣 +멣 +멣 +멣 + +멤 +멤 +멤 +멤 +멤 + +멥 +멥 +멥 +멥 +멥 + +멦 +멦 +멦 +멦 +멦 + +멧 +멧 +멧 +멧 +멧 + +멨 +멨 +멨 +멨 +멨 + +멩 +멩 +멩 +멩 +멩 + +멪 +멪 +멪 +멪 +멪 + +멫 +멫 +멫 +멫 +멫 + +멬 +멬 +멬 +멬 +멬 + +멭 +멭 +멭 +멭 +멭 + +멮 +멮 +멮 +멮 +멮 + +멯 +멯 +멯 +멯 +멯 + +며 +며 +며 +며 +며 + +멱 +멱 +멱 +멱 +멱 + +멲 +멲 +멲 +멲 +멲 + +멳 +멳 +멳 +멳 +멳 + +면 +면 +면 +면 +면 + +멵 +멵 +멵 +멵 +멵 + +멶 +멶 +멶 +멶 +멶 + +멷 +멷 +멷 +멷 +멷 + +멸 +멸 +멸 +멸 +멸 + +멹 +멹 +멹 +멹 +멹 + +멺 +멺 +멺 +멺 +멺 + +멻 +멻 +멻 +멻 +멻 + +멼 +멼 +멼 +멼 +멼 + +멽 +멽 +멽 +멽 +멽 + +멾 +멾 +멾 +멾 +멾 + +멿 +멿 +멿 +멿 +멿 + +몀 +몀 +몀 +몀 +몀 + +몁 +몁 +몁 +몁 +몁 + +몂 +몂 +몂 +몂 +몂 + +몃 +몃 +몃 +몃 +몃 + +몄 +몄 +몄 +몄 +몄 + +명 +명 +명 +명 +명 + +몆 +몆 +몆 +몆 +몆 + +몇 +몇 +몇 +몇 +몇 + +몈 +몈 +몈 +몈 +몈 + +몉 +몉 +몉 +몉 +몉 + +몊 +몊 +몊 +몊 +몊 + +몋 +몋 +몋 +몋 +몋 + +몌 +몌 +몌 +몌 +몌 + +몍 +몍 +몍 +몍 +몍 + +몎 +몎 +몎 +몎 +몎 + +몏 +몏 +몏 +몏 +몏 + +몐 +몐 +몐 +몐 +몐 + +몑 +몑 +몑 +몑 +몑 + +몒 +몒 +몒 +몒 +몒 + +몓 +몓 +몓 +몓 +몓 + +몔 +몔 +몔 +몔 +몔 + +몕 +몕 +몕 +몕 +몕 + +몖 +몖 +몖 +몖 +몖 + +몗 +몗 +몗 +몗 +몗 + +몘 +몘 +몘 +몘 +몘 + +몙 +몙 +몙 +몙 +몙 + +몚 +몚 +몚 +몚 +몚 + +몛 +몛 +몛 +몛 +몛 + +몜 +몜 +몜 +몜 +몜 + +몝 +몝 +몝 +몝 +몝 + +몞 +몞 +몞 +몞 +몞 + +몟 +몟 +몟 +몟 +몟 + +몠 +몠 +몠 +몠 +몠 + +몡 +몡 +몡 +몡 +몡 + +몢 +몢 +몢 +몢 +몢 + +몣 +몣 +몣 +몣 +몣 + +몤 +몤 +몤 +몤 +몤 + +몥 +몥 +몥 +몥 +몥 + +몦 +몦 +몦 +몦 +몦 + +몧 +몧 +몧 +몧 +몧 + +모 +모 +모 +모 +모 + +목 +목 +목 +목 +목 + +몪 +몪 +몪 +몪 +몪 + +몫 +몫 +몫 +몫 +몫 + +몬 +몬 +몬 +몬 +몬 + +몭 +몭 +몭 +몭 +몭 + +몮 +몮 +몮 +몮 +몮 + +몯 +몯 +몯 +몯 +몯 + +몰 +몰 +몰 +몰 +몰 + +몱 +몱 +몱 +몱 +몱 + +몲 +몲 +몲 +몲 +몲 + +몳 +몳 +몳 +몳 +몳 + +몴 +몴 +몴 +몴 +몴 + +몵 +몵 +몵 +몵 +몵 + +몶 +몶 +몶 +몶 +몶 + +몷 +몷 +몷 +몷 +몷 + +몸 +몸 +몸 +몸 +몸 + +몹 +몹 +몹 +몹 +몹 + +몺 +몺 +몺 +몺 +몺 + +못 +못 +못 +못 +못 + +몼 +몼 +몼 +몼 +몼 + +몽 +몽 +몽 +몽 +몽 + +몾 +몾 +몾 +몾 +몾 + +몿 +몿 +몿 +몿 +몿 + +뫀 +뫀 +뫀 +뫀 +뫀 + +뫁 +뫁 +뫁 +뫁 +뫁 + +뫂 +뫂 +뫂 +뫂 +뫂 + +뫃 +뫃 +뫃 +뫃 +뫃 + +뫄 +뫄 +뫄 +뫄 +뫄 + +뫅 +뫅 +뫅 +뫅 +뫅 + +뫆 +뫆 +뫆 +뫆 +뫆 + +뫇 +뫇 +뫇 +뫇 +뫇 + +뫈 +뫈 +뫈 +뫈 +뫈 + +뫉 +뫉 +뫉 +뫉 +뫉 + +뫊 +뫊 +뫊 +뫊 +뫊 + +뫋 +뫋 +뫋 +뫋 +뫋 + +뫌 +뫌 +뫌 +뫌 +뫌 + +뫍 +뫍 +뫍 +뫍 +뫍 + +뫎 +뫎 +뫎 +뫎 +뫎 + +뫏 +뫏 +뫏 +뫏 +뫏 + +뫐 +뫐 +뫐 +뫐 +뫐 + +뫑 +뫑 +뫑 +뫑 +뫑 + +뫒 +뫒 +뫒 +뫒 +뫒 + +뫓 +뫓 +뫓 +뫓 +뫓 + +뫔 +뫔 +뫔 +뫔 +뫔 + +뫕 +뫕 +뫕 +뫕 +뫕 + +뫖 +뫖 +뫖 +뫖 +뫖 + +뫗 +뫗 +뫗 +뫗 +뫗 + +뫘 +뫘 +뫘 +뫘 +뫘 + +뫙 +뫙 +뫙 +뫙 +뫙 + +뫚 +뫚 +뫚 +뫚 +뫚 + +뫛 +뫛 +뫛 +뫛 +뫛 + +뫜 +뫜 +뫜 +뫜 +뫜 + +뫝 +뫝 +뫝 +뫝 +뫝 + +뫞 +뫞 +뫞 +뫞 +뫞 + +뫟 +뫟 +뫟 +뫟 +뫟 + +뫠 +뫠 +뫠 +뫠 +뫠 + +뫡 +뫡 +뫡 +뫡 +뫡 + +뫢 +뫢 +뫢 +뫢 +뫢 + +뫣 +뫣 +뫣 +뫣 +뫣 + +뫤 +뫤 +뫤 +뫤 +뫤 + +뫥 +뫥 +뫥 +뫥 +뫥 + +뫦 +뫦 +뫦 +뫦 +뫦 + +뫧 +뫧 +뫧 +뫧 +뫧 + +뫨 +뫨 +뫨 +뫨 +뫨 + +뫩 +뫩 +뫩 +뫩 +뫩 + +뫪 +뫪 +뫪 +뫪 +뫪 + +뫫 +뫫 +뫫 +뫫 +뫫 + +뫬 +뫬 +뫬 +뫬 +뫬 + +뫭 +뫭 +뫭 +뫭 +뫭 + +뫮 +뫮 +뫮 +뫮 +뫮 + +뫯 +뫯 +뫯 +뫯 +뫯 + +뫰 +뫰 +뫰 +뫰 +뫰 + +뫱 +뫱 +뫱 +뫱 +뫱 + +뫲 +뫲 +뫲 +뫲 +뫲 + +뫳 +뫳 +뫳 +뫳 +뫳 + +뫴 +뫴 +뫴 +뫴 +뫴 + +뫵 +뫵 +뫵 +뫵 +뫵 + +뫶 +뫶 +뫶 +뫶 +뫶 + +뫷 +뫷 +뫷 +뫷 +뫷 + +뫸 +뫸 +뫸 +뫸 +뫸 + +뫹 +뫹 +뫹 +뫹 +뫹 + +뫺 +뫺 +뫺 +뫺 +뫺 + +뫻 +뫻 +뫻 +뫻 +뫻 + +뫼 +뫼 +뫼 +뫼 +뫼 + +뫽 +뫽 +뫽 +뫽 +뫽 + +뫾 +뫾 +뫾 +뫾 +뫾 + +뫿 +뫿 +뫿 +뫿 +뫿 + +묀 +묀 +묀 +묀 +묀 + +묁 +묁 +묁 +묁 +묁 + +묂 +묂 +묂 +묂 +묂 + +묃 +묃 +묃 +묃 +묃 + +묄 +묄 +묄 +묄 +묄 + +묅 +묅 +묅 +묅 +묅 + +묆 +묆 +묆 +묆 +묆 + +묇 +묇 +묇 +묇 +묇 + +묈 +묈 +묈 +묈 +묈 + +묉 +묉 +묉 +묉 +묉 + +묊 +묊 +묊 +묊 +묊 + +묋 +묋 +묋 +묋 +묋 + +묌 +묌 +묌 +묌 +묌 + +묍 +묍 +묍 +묍 +묍 + +묎 +묎 +묎 +묎 +묎 + +묏 +묏 +묏 +묏 +묏 + +묐 +묐 +묐 +묐 +묐 + +묑 +묑 +묑 +묑 +묑 + +묒 +묒 +묒 +묒 +묒 + +묓 +묓 +묓 +묓 +묓 + +묔 +묔 +묔 +묔 +묔 + +묕 +묕 +묕 +묕 +묕 + +묖 +묖 +묖 +묖 +묖 + +묗 +묗 +묗 +묗 +묗 + +묘 +묘 +묘 +묘 +묘 + +묙 +묙 +묙 +묙 +묙 + +묚 +묚 +묚 +묚 +묚 + +묛 +묛 +묛 +묛 +묛 + +묜 +묜 +묜 +묜 +묜 + +묝 +묝 +묝 +묝 +묝 + +묞 +묞 +묞 +묞 +묞 + +묟 +묟 +묟 +묟 +묟 + +묠 +묠 +묠 +묠 +묠 + +묡 +묡 +묡 +묡 +묡 + +묢 +묢 +묢 +묢 +묢 + +묣 +묣 +묣 +묣 +묣 + +묤 +묤 +묤 +묤 +묤 + +묥 +묥 +묥 +묥 +묥 + +묦 +묦 +묦 +묦 +묦 + +묧 +묧 +묧 +묧 +묧 + +묨 +묨 +묨 +묨 +묨 + +묩 +묩 +묩 +묩 +묩 + +묪 +묪 +묪 +묪 +묪 + +묫 +묫 +묫 +묫 +묫 + +묬 +묬 +묬 +묬 +묬 + +묭 +묭 +묭 +묭 +묭 + +묮 +묮 +묮 +묮 +묮 + +묯 +묯 +묯 +묯 +묯 + +묰 +묰 +묰 +묰 +묰 + +묱 +묱 +묱 +묱 +묱 + +묲 +묲 +묲 +묲 +묲 + +묳 +묳 +묳 +묳 +묳 + +무 +무 +무 +무 +무 + +묵 +묵 +묵 +묵 +묵 + +묶 +묶 +묶 +묶 +묶 + +묷 +묷 +묷 +묷 +묷 + +문 +문 +문 +문 +문 + +묹 +묹 +묹 +묹 +묹 + +묺 +묺 +묺 +묺 +묺 + +묻 +묻 +묻 +묻 +묻 + +물 +물 +물 +물 +물 + +묽 +묽 +묽 +묽 +묽 + +묾 +묾 +묾 +묾 +묾 + +묿 +묿 +묿 +묿 +묿 + +뭀 +뭀 +뭀 +뭀 +뭀 + +뭁 +뭁 +뭁 +뭁 +뭁 + +뭂 +뭂 +뭂 +뭂 +뭂 + +뭃 +뭃 +뭃 +뭃 +뭃 + +뭄 +뭄 +뭄 +뭄 +뭄 + +뭅 +뭅 +뭅 +뭅 +뭅 + +뭆 +뭆 +뭆 +뭆 +뭆 + +뭇 +뭇 +뭇 +뭇 +뭇 + +뭈 +뭈 +뭈 +뭈 +뭈 + +뭉 +뭉 +뭉 +뭉 +뭉 + +뭊 +뭊 +뭊 +뭊 +뭊 + +뭋 +뭋 +뭋 +뭋 +뭋 + +뭌 +뭌 +뭌 +뭌 +뭌 + +뭍 +뭍 +뭍 +뭍 +뭍 + +뭎 +뭎 +뭎 +뭎 +뭎 + +뭏 +뭏 +뭏 +뭏 +뭏 + +뭐 +뭐 +뭐 +뭐 +뭐 + +뭑 +뭑 +뭑 +뭑 +뭑 + +뭒 +뭒 +뭒 +뭒 +뭒 + +뭓 +뭓 +뭓 +뭓 +뭓 + +뭔 +뭔 +뭔 +뭔 +뭔 + +뭕 +뭕 +뭕 +뭕 +뭕 + +뭖 +뭖 +뭖 +뭖 +뭖 + +뭗 +뭗 +뭗 +뭗 +뭗 + +뭘 +뭘 +뭘 +뭘 +뭘 + +뭙 +뭙 +뭙 +뭙 +뭙 + +뭚 +뭚 +뭚 +뭚 +뭚 + +뭛 +뭛 +뭛 +뭛 +뭛 + +뭜 +뭜 +뭜 +뭜 +뭜 + +뭝 +뭝 +뭝 +뭝 +뭝 + +뭞 +뭞 +뭞 +뭞 +뭞 + +뭟 +뭟 +뭟 +뭟 +뭟 + +뭠 +뭠 +뭠 +뭠 +뭠 + +뭡 +뭡 +뭡 +뭡 +뭡 + +뭢 +뭢 +뭢 +뭢 +뭢 + +뭣 +뭣 +뭣 +뭣 +뭣 + +뭤 +뭤 +뭤 +뭤 +뭤 + +뭥 +뭥 +뭥 +뭥 +뭥 + +뭦 +뭦 +뭦 +뭦 +뭦 + +뭧 +뭧 +뭧 +뭧 +뭧 + +뭨 +뭨 +뭨 +뭨 +뭨 + +뭩 +뭩 +뭩 +뭩 +뭩 + +뭪 +뭪 +뭪 +뭪 +뭪 + +뭫 +뭫 +뭫 +뭫 +뭫 + +뭬 +뭬 +뭬 +뭬 +뭬 + +뭭 +뭭 +뭭 +뭭 +뭭 + +뭮 +뭮 +뭮 +뭮 +뭮 + +뭯 +뭯 +뭯 +뭯 +뭯 + +뭰 +뭰 +뭰 +뭰 +뭰 + +뭱 +뭱 +뭱 +뭱 +뭱 + +뭲 +뭲 +뭲 +뭲 +뭲 + +뭳 +뭳 +뭳 +뭳 +뭳 + +뭴 +뭴 +뭴 +뭴 +뭴 + +뭵 +뭵 +뭵 +뭵 +뭵 + +뭶 +뭶 +뭶 +뭶 +뭶 + +뭷 +뭷 +뭷 +뭷 +뭷 + +뭸 +뭸 +뭸 +뭸 +뭸 + +뭹 +뭹 +뭹 +뭹 +뭹 + +뭺 +뭺 +뭺 +뭺 +뭺 + +뭻 +뭻 +뭻 +뭻 +뭻 + +뭼 +뭼 +뭼 +뭼 +뭼 + +뭽 +뭽 +뭽 +뭽 +뭽 + +뭾 +뭾 +뭾 +뭾 +뭾 + +뭿 +뭿 +뭿 +뭿 +뭿 + +뮀 +뮀 +뮀 +뮀 +뮀 + +뮁 +뮁 +뮁 +뮁 +뮁 + +뮂 +뮂 +뮂 +뮂 +뮂 + +뮃 +뮃 +뮃 +뮃 +뮃 + +뮄 +뮄 +뮄 +뮄 +뮄 + +뮅 +뮅 +뮅 +뮅 +뮅 + +뮆 +뮆 +뮆 +뮆 +뮆 + +뮇 +뮇 +뮇 +뮇 +뮇 + +뮈 +뮈 +뮈 +뮈 +뮈 + +뮉 +뮉 +뮉 +뮉 +뮉 + +뮊 +뮊 +뮊 +뮊 +뮊 + +뮋 +뮋 +뮋 +뮋 +뮋 + +뮌 +뮌 +뮌 +뮌 +뮌 + +뮍 +뮍 +뮍 +뮍 +뮍 + +뮎 +뮎 +뮎 +뮎 +뮎 + +뮏 +뮏 +뮏 +뮏 +뮏 + +뮐 +뮐 +뮐 +뮐 +뮐 + +뮑 +뮑 +뮑 +뮑 +뮑 + +뮒 +뮒 +뮒 +뮒 +뮒 + +뮓 +뮓 +뮓 +뮓 +뮓 + +뮔 +뮔 +뮔 +뮔 +뮔 + +뮕 +뮕 +뮕 +뮕 +뮕 + +뮖 +뮖 +뮖 +뮖 +뮖 + +뮗 +뮗 +뮗 +뮗 +뮗 + +뮘 +뮘 +뮘 +뮘 +뮘 + +뮙 +뮙 +뮙 +뮙 +뮙 + +뮚 +뮚 +뮚 +뮚 +뮚 + +뮛 +뮛 +뮛 +뮛 +뮛 + +뮜 +뮜 +뮜 +뮜 +뮜 + +뮝 +뮝 +뮝 +뮝 +뮝 + +뮞 +뮞 +뮞 +뮞 +뮞 + +뮟 +뮟 +뮟 +뮟 +뮟 + +뮠 +뮠 +뮠 +뮠 +뮠 + +뮡 +뮡 +뮡 +뮡 +뮡 + +뮢 +뮢 +뮢 +뮢 +뮢 + +뮣 +뮣 +뮣 +뮣 +뮣 + +뮤 +뮤 +뮤 +뮤 +뮤 + +뮥 +뮥 +뮥 +뮥 +뮥 + +뮦 +뮦 +뮦 +뮦 +뮦 + +뮧 +뮧 +뮧 +뮧 +뮧 + +뮨 +뮨 +뮨 +뮨 +뮨 + +뮩 +뮩 +뮩 +뮩 +뮩 + +뮪 +뮪 +뮪 +뮪 +뮪 + +뮫 +뮫 +뮫 +뮫 +뮫 + +뮬 +뮬 +뮬 +뮬 +뮬 + +뮭 +뮭 +뮭 +뮭 +뮭 + +뮮 +뮮 +뮮 +뮮 +뮮 + +뮯 +뮯 +뮯 +뮯 +뮯 + +뮰 +뮰 +뮰 +뮰 +뮰 + +뮱 +뮱 +뮱 +뮱 +뮱 + +뮲 +뮲 +뮲 +뮲 +뮲 + +뮳 +뮳 +뮳 +뮳 +뮳 + +뮴 +뮴 +뮴 +뮴 +뮴 + +뮵 +뮵 +뮵 +뮵 +뮵 + +뮶 +뮶 +뮶 +뮶 +뮶 + +뮷 +뮷 +뮷 +뮷 +뮷 + +뮸 +뮸 +뮸 +뮸 +뮸 + +뮹 +뮹 +뮹 +뮹 +뮹 + +뮺 +뮺 +뮺 +뮺 +뮺 + +뮻 +뮻 +뮻 +뮻 +뮻 + +뮼 +뮼 +뮼 +뮼 +뮼 + +뮽 +뮽 +뮽 +뮽 +뮽 + +뮾 +뮾 +뮾 +뮾 +뮾 + +뮿 +뮿 +뮿 +뮿 +뮿 + +므 +므 +므 +므 +므 + +믁 +믁 +믁 +믁 +믁 + +믂 +믂 +믂 +믂 +믂 + +믃 +믃 +믃 +믃 +믃 + +믄 +믄 +믄 +믄 +믄 + +믅 +믅 +믅 +믅 +믅 + +믆 +믆 +믆 +믆 +믆 + +믇 +믇 +믇 +믇 +믇 + +믈 +믈 +믈 +믈 +믈 + +믉 +믉 +믉 +믉 +믉 + +믊 +믊 +믊 +믊 +믊 + +믋 +믋 +믋 +믋 +믋 + +믌 +믌 +믌 +믌 +믌 + +믍 +믍 +믍 +믍 +믍 + +믎 +믎 +믎 +믎 +믎 + +믏 +믏 +믏 +믏 +믏 + +믐 +믐 +믐 +믐 +믐 + +믑 +믑 +믑 +믑 +믑 + +믒 +믒 +믒 +믒 +믒 + +믓 +믓 +믓 +믓 +믓 + +믔 +믔 +믔 +믔 +믔 + +믕 +믕 +믕 +믕 +믕 + +믖 +믖 +믖 +믖 +믖 + +믗 +믗 +믗 +믗 +믗 + +믘 +믘 +믘 +믘 +믘 + +믙 +믙 +믙 +믙 +믙 + +믚 +믚 +믚 +믚 +믚 + +믛 +믛 +믛 +믛 +믛 + +믜 +믜 +믜 +믜 +믜 + +믝 +믝 +믝 +믝 +믝 + +믞 +믞 +믞 +믞 +믞 + +믟 +믟 +믟 +믟 +믟 + +믠 +믠 +믠 +믠 +믠 + +믡 +믡 +믡 +믡 +믡 + +믢 +믢 +믢 +믢 +믢 + +믣 +믣 +믣 +믣 +믣 + +믤 +믤 +믤 +믤 +믤 + +믥 +믥 +믥 +믥 +믥 + +믦 +믦 +믦 +믦 +믦 + +믧 +믧 +믧 +믧 +믧 + +믨 +믨 +믨 +믨 +믨 + +믩 +믩 +믩 +믩 +믩 + +믪 +믪 +믪 +믪 +믪 + +믫 +믫 +믫 +믫 +믫 + +믬 +믬 +믬 +믬 +믬 + +믭 +믭 +믭 +믭 +믭 + +믮 +믮 +믮 +믮 +믮 + +믯 +믯 +믯 +믯 +믯 + +믰 +믰 +믰 +믰 +믰 + +믱 +믱 +믱 +믱 +믱 + +믲 +믲 +믲 +믲 +믲 + +믳 +믳 +믳 +믳 +믳 + +믴 +믴 +믴 +믴 +믴 + +믵 +믵 +믵 +믵 +믵 + +믶 +믶 +믶 +믶 +믶 + +믷 +믷 +믷 +믷 +믷 + +미 +미 +미 +미 +미 + +믹 +믹 +믹 +믹 +믹 + +믺 +믺 +믺 +믺 +믺 + +믻 +믻 +믻 +믻 +믻 + +민 +민 +민 +민 +민 + +믽 +믽 +믽 +믽 +믽 + +믾 +믾 +믾 +믾 +믾 + +믿 +믿 +믿 +믿 +믿 + +밀 +밀 +밀 +밀 +밀 + +밁 +밁 +밁 +밁 +밁 + +밂 +밂 +밂 +밂 +밂 + +밃 +밃 +밃 +밃 +밃 + +밄 +밄 +밄 +밄 +밄 + +밅 +밅 +밅 +밅 +밅 + +밆 +밆 +밆 +밆 +밆 + +밇 +밇 +밇 +밇 +밇 + +밈 +밈 +밈 +밈 +밈 + +밉 +밉 +밉 +밉 +밉 + +밊 +밊 +밊 +밊 +밊 + +밋 +밋 +밋 +밋 +밋 + +밌 +밌 +밌 +밌 +밌 + +밍 +밍 +밍 +밍 +밍 + +밎 +밎 +밎 +밎 +밎 + +및 +및 +및 +및 +및 + +밐 +밐 +밐 +밐 +밐 + +밑 +밑 +밑 +밑 +밑 + +밒 +밒 +밒 +밒 +밒 + +밓 +밓 +밓 +밓 +밓 + +바 +바 +바 +바 +바 + +박 +박 +박 +박 +박 + +밖 +밖 +밖 +밖 +밖 + +밗 +밗 +밗 +밗 +밗 + +반 +반 +반 +반 +반 + +밙 +밙 +밙 +밙 +밙 + +밚 +밚 +밚 +밚 +밚 + +받 +받 +받 +받 +받 + +발 +발 +발 +발 +발 + +밝 +밝 +밝 +밝 +밝 + +밞 +밞 +밞 +밞 +밞 + +밟 +밟 +밟 +밟 +밟 + +밠 +밠 +밠 +밠 +밠 + +밡 +밡 +밡 +밡 +밡 + +밢 +밢 +밢 +밢 +밢 + +밣 +밣 +밣 +밣 +밣 + +밤 +밤 +밤 +밤 +밤 + +밥 +밥 +밥 +밥 +밥 + +밦 +밦 +밦 +밦 +밦 + +밧 +밧 +밧 +밧 +밧 + +밨 +밨 +밨 +밨 +밨 + +방 +방 +방 +방 +방 + +밪 +밪 +밪 +밪 +밪 + +밫 +밫 +밫 +밫 +밫 + +밬 +밬 +밬 +밬 +밬 + +밭 +밭 +밭 +밭 +밭 + +밮 +밮 +밮 +밮 +밮 + +밯 +밯 +밯 +밯 +밯 + +배 +배 +배 +배 +배 + +백 +백 +백 +백 +백 + +밲 +밲 +밲 +밲 +밲 + +밳 +밳 +밳 +밳 +밳 + +밴 +밴 +밴 +밴 +밴 + +밵 +밵 +밵 +밵 +밵 + +밶 +밶 +밶 +밶 +밶 + +밷 +밷 +밷 +밷 +밷 + +밸 +밸 +밸 +밸 +밸 + +밹 +밹 +밹 +밹 +밹 + +밺 +밺 +밺 +밺 +밺 + +밻 +밻 +밻 +밻 +밻 + +밼 +밼 +밼 +밼 +밼 + +밽 +밽 +밽 +밽 +밽 + +밾 +밾 +밾 +밾 +밾 + +밿 +밿 +밿 +밿 +밿 + +뱀 +뱀 +뱀 +뱀 +뱀 + +뱁 +뱁 +뱁 +뱁 +뱁 + +뱂 +뱂 +뱂 +뱂 +뱂 + +뱃 +뱃 +뱃 +뱃 +뱃 + +뱄 +뱄 +뱄 +뱄 +뱄 + +뱅 +뱅 +뱅 +뱅 +뱅 + +뱆 +뱆 +뱆 +뱆 +뱆 + +뱇 +뱇 +뱇 +뱇 +뱇 + +뱈 +뱈 +뱈 +뱈 +뱈 + +뱉 +뱉 +뱉 +뱉 +뱉 + +뱊 +뱊 +뱊 +뱊 +뱊 + +뱋 +뱋 +뱋 +뱋 +뱋 + +뱌 +뱌 +뱌 +뱌 +뱌 + +뱍 +뱍 +뱍 +뱍 +뱍 + +뱎 +뱎 +뱎 +뱎 +뱎 + +뱏 +뱏 +뱏 +뱏 +뱏 + +뱐 +뱐 +뱐 +뱐 +뱐 + +뱑 +뱑 +뱑 +뱑 +뱑 + +뱒 +뱒 +뱒 +뱒 +뱒 + +뱓 +뱓 +뱓 +뱓 +뱓 + +뱔 +뱔 +뱔 +뱔 +뱔 + +뱕 +뱕 +뱕 +뱕 +뱕 + +뱖 +뱖 +뱖 +뱖 +뱖 + +뱗 +뱗 +뱗 +뱗 +뱗 + +뱘 +뱘 +뱘 +뱘 +뱘 + +뱙 +뱙 +뱙 +뱙 +뱙 + +뱚 +뱚 +뱚 +뱚 +뱚 + +뱛 +뱛 +뱛 +뱛 +뱛 + +뱜 +뱜 +뱜 +뱜 +뱜 + +뱝 +뱝 +뱝 +뱝 +뱝 + +뱞 +뱞 +뱞 +뱞 +뱞 + +뱟 +뱟 +뱟 +뱟 +뱟 + +뱠 +뱠 +뱠 +뱠 +뱠 + +뱡 +뱡 +뱡 +뱡 +뱡 + +뱢 +뱢 +뱢 +뱢 +뱢 + +뱣 +뱣 +뱣 +뱣 +뱣 + +뱤 +뱤 +뱤 +뱤 +뱤 + +뱥 +뱥 +뱥 +뱥 +뱥 + +뱦 +뱦 +뱦 +뱦 +뱦 + +뱧 +뱧 +뱧 +뱧 +뱧 + +뱨 +뱨 +뱨 +뱨 +뱨 + +뱩 +뱩 +뱩 +뱩 +뱩 + +뱪 +뱪 +뱪 +뱪 +뱪 + +뱫 +뱫 +뱫 +뱫 +뱫 + +뱬 +뱬 +뱬 +뱬 +뱬 + +뱭 +뱭 +뱭 +뱭 +뱭 + +뱮 +뱮 +뱮 +뱮 +뱮 + +뱯 +뱯 +뱯 +뱯 +뱯 + +뱰 +뱰 +뱰 +뱰 +뱰 + +뱱 +뱱 +뱱 +뱱 +뱱 + +뱲 +뱲 +뱲 +뱲 +뱲 + +뱳 +뱳 +뱳 +뱳 +뱳 + +뱴 +뱴 +뱴 +뱴 +뱴 + +뱵 +뱵 +뱵 +뱵 +뱵 + +뱶 +뱶 +뱶 +뱶 +뱶 + +뱷 +뱷 +뱷 +뱷 +뱷 + +뱸 +뱸 +뱸 +뱸 +뱸 + +뱹 +뱹 +뱹 +뱹 +뱹 + +뱺 +뱺 +뱺 +뱺 +뱺 + +뱻 +뱻 +뱻 +뱻 +뱻 + +뱼 +뱼 +뱼 +뱼 +뱼 + +뱽 +뱽 +뱽 +뱽 +뱽 + +뱾 +뱾 +뱾 +뱾 +뱾 + +뱿 +뱿 +뱿 +뱿 +뱿 + +벀 +벀 +벀 +벀 +벀 + +벁 +벁 +벁 +벁 +벁 + +벂 +벂 +벂 +벂 +벂 + +벃 +벃 +벃 +벃 +벃 + +버 +버 +버 +버 +버 + +벅 +벅 +벅 +벅 +벅 + +벆 +벆 +벆 +벆 +벆 + +벇 +벇 +벇 +벇 +벇 + +번 +번 +번 +번 +번 + +벉 +벉 +벉 +벉 +벉 + +벊 +벊 +벊 +벊 +벊 + +벋 +벋 +벋 +벋 +벋 + +벌 +벌 +벌 +벌 +벌 + +벍 +벍 +벍 +벍 +벍 + +벎 +벎 +벎 +벎 +벎 + +벏 +벏 +벏 +벏 +벏 + +벐 +벐 +벐 +벐 +벐 + +벑 +벑 +벑 +벑 +벑 + +벒 +벒 +벒 +벒 +벒 + +벓 +벓 +벓 +벓 +벓 + +범 +범 +범 +범 +범 + +법 +법 +법 +법 +법 + +벖 +벖 +벖 +벖 +벖 + +벗 +벗 +벗 +벗 +벗 + +벘 +벘 +벘 +벘 +벘 + +벙 +벙 +벙 +벙 +벙 + +벚 +벚 +벚 +벚 +벚 + +벛 +벛 +벛 +벛 +벛 + +벜 +벜 +벜 +벜 +벜 + +벝 +벝 +벝 +벝 +벝 + +벞 +벞 +벞 +벞 +벞 + +벟 +벟 +벟 +벟 +벟 + +베 +베 +베 +베 +베 + +벡 +벡 +벡 +벡 +벡 + +벢 +벢 +벢 +벢 +벢 + +벣 +벣 +벣 +벣 +벣 + +벤 +벤 +벤 +벤 +벤 + +벥 +벥 +벥 +벥 +벥 + +벦 +벦 +벦 +벦 +벦 + +벧 +벧 +벧 +벧 +벧 + +벨 +벨 +벨 +벨 +벨 + +벩 +벩 +벩 +벩 +벩 + +벪 +벪 +벪 +벪 +벪 + +벫 +벫 +벫 +벫 +벫 + +벬 +벬 +벬 +벬 +벬 + +벭 +벭 +벭 +벭 +벭 + +벮 +벮 +벮 +벮 +벮 + +벯 +벯 +벯 +벯 +벯 + +벰 +벰 +벰 +벰 +벰 + +벱 +벱 +벱 +벱 +벱 + +벲 +벲 +벲 +벲 +벲 + +벳 +벳 +벳 +벳 +벳 + +벴 +벴 +벴 +벴 +벴 + +벵 +벵 +벵 +벵 +벵 + +벶 +벶 +벶 +벶 +벶 + +벷 +벷 +벷 +벷 +벷 + +벸 +벸 +벸 +벸 +벸 + +벹 +벹 +벹 +벹 +벹 + +벺 +벺 +벺 +벺 +벺 + +벻 +벻 +벻 +벻 +벻 + +벼 +벼 +벼 +벼 +벼 + +벽 +벽 +벽 +벽 +벽 + +벾 +벾 +벾 +벾 +벾 + +벿 +벿 +벿 +벿 +벿 + +변 +변 +변 +변 +변 + +볁 +볁 +볁 +볁 +볁 + +볂 +볂 +볂 +볂 +볂 + +볃 +볃 +볃 +볃 +볃 + +별 +별 +별 +별 +별 + +볅 +볅 +볅 +볅 +볅 + +볆 +볆 +볆 +볆 +볆 + +볇 +볇 +볇 +볇 +볇 + +볈 +볈 +볈 +볈 +볈 + +볉 +볉 +볉 +볉 +볉 + +볊 +볊 +볊 +볊 +볊 + +볋 +볋 +볋 +볋 +볋 + +볌 +볌 +볌 +볌 +볌 + +볍 +볍 +볍 +볍 +볍 + +볎 +볎 +볎 +볎 +볎 + +볏 +볏 +볏 +볏 +볏 + +볐 +볐 +볐 +볐 +볐 + +병 +병 +병 +병 +병 + +볒 +볒 +볒 +볒 +볒 + +볓 +볓 +볓 +볓 +볓 + +볔 +볔 +볔 +볔 +볔 + +볕 +볕 +볕 +볕 +볕 + +볖 +볖 +볖 +볖 +볖 + +볗 +볗 +볗 +볗 +볗 + +볘 +볘 +볘 +볘 +볘 + +볙 +볙 +볙 +볙 +볙 + +볚 +볚 +볚 +볚 +볚 + +볛 +볛 +볛 +볛 +볛 + +볜 +볜 +볜 +볜 +볜 + +볝 +볝 +볝 +볝 +볝 + +볞 +볞 +볞 +볞 +볞 + +볟 +볟 +볟 +볟 +볟 + +볠 +볠 +볠 +볠 +볠 + +볡 +볡 +볡 +볡 +볡 + +볢 +볢 +볢 +볢 +볢 + +볣 +볣 +볣 +볣 +볣 + +볤 +볤 +볤 +볤 +볤 + +볥 +볥 +볥 +볥 +볥 + +볦 +볦 +볦 +볦 +볦 + +볧 +볧 +볧 +볧 +볧 + +볨 +볨 +볨 +볨 +볨 + +볩 +볩 +볩 +볩 +볩 + +볪 +볪 +볪 +볪 +볪 + +볫 +볫 +볫 +볫 +볫 + +볬 +볬 +볬 +볬 +볬 + +볭 +볭 +볭 +볭 +볭 + +볮 +볮 +볮 +볮 +볮 + +볯 +볯 +볯 +볯 +볯 + +볰 +볰 +볰 +볰 +볰 + +볱 +볱 +볱 +볱 +볱 + +볲 +볲 +볲 +볲 +볲 + +볳 +볳 +볳 +볳 +볳 + +보 +보 +보 +보 +보 + +복 +복 +복 +복 +복 + +볶 +볶 +볶 +볶 +볶 + +볷 +볷 +볷 +볷 +볷 + +본 +본 +본 +본 +본 + +볹 +볹 +볹 +볹 +볹 + +볺 +볺 +볺 +볺 +볺 + +볻 +볻 +볻 +볻 +볻 + +볼 +볼 +볼 +볼 +볼 + +볽 +볽 +볽 +볽 +볽 + +볾 +볾 +볾 +볾 +볾 + +볿 +볿 +볿 +볿 +볿 + +봀 +봀 +봀 +봀 +봀 + +봁 +봁 +봁 +봁 +봁 + +봂 +봂 +봂 +봂 +봂 + +봃 +봃 +봃 +봃 +봃 + +봄 +봄 +봄 +봄 +봄 + +봅 +봅 +봅 +봅 +봅 + +봆 +봆 +봆 +봆 +봆 + +봇 +봇 +봇 +봇 +봇 + +봈 +봈 +봈 +봈 +봈 + +봉 +봉 +봉 +봉 +봉 + +봊 +봊 +봊 +봊 +봊 + +봋 +봋 +봋 +봋 +봋 + +봌 +봌 +봌 +봌 +봌 + +봍 +봍 +봍 +봍 +봍 + +봎 +봎 +봎 +봎 +봎 + +봏 +봏 +봏 +봏 +봏 + +봐 +봐 +봐 +봐 +봐 + +봑 +봑 +봑 +봑 +봑 + +봒 +봒 +봒 +봒 +봒 + +봓 +봓 +봓 +봓 +봓 + +봔 +봔 +봔 +봔 +봔 + +봕 +봕 +봕 +봕 +봕 + +봖 +봖 +봖 +봖 +봖 + +봗 +봗 +봗 +봗 +봗 + +봘 +봘 +봘 +봘 +봘 + +봙 +봙 +봙 +봙 +봙 + +봚 +봚 +봚 +봚 +봚 + +봛 +봛 +봛 +봛 +봛 + +봜 +봜 +봜 +봜 +봜 + +봝 +봝 +봝 +봝 +봝 + +봞 +봞 +봞 +봞 +봞 + +봟 +봟 +봟 +봟 +봟 + +봠 +봠 +봠 +봠 +봠 + +봡 +봡 +봡 +봡 +봡 + +봢 +봢 +봢 +봢 +봢 + +봣 +봣 +봣 +봣 +봣 + +봤 +봤 +봤 +봤 +봤 + +봥 +봥 +봥 +봥 +봥 + +봦 +봦 +봦 +봦 +봦 + +봧 +봧 +봧 +봧 +봧 + +봨 +봨 +봨 +봨 +봨 + +봩 +봩 +봩 +봩 +봩 + +봪 +봪 +봪 +봪 +봪 + +봫 +봫 +봫 +봫 +봫 + +봬 +봬 +봬 +봬 +봬 + +봭 +봭 +봭 +봭 +봭 + +봮 +봮 +봮 +봮 +봮 + +봯 +봯 +봯 +봯 +봯 + +봰 +봰 +봰 +봰 +봰 + +봱 +봱 +봱 +봱 +봱 + +봲 +봲 +봲 +봲 +봲 + +봳 +봳 +봳 +봳 +봳 + +봴 +봴 +봴 +봴 +봴 + +봵 +봵 +봵 +봵 +봵 + +봶 +봶 +봶 +봶 +봶 + +봷 +봷 +봷 +봷 +봷 + +봸 +봸 +봸 +봸 +봸 + +봹 +봹 +봹 +봹 +봹 + +봺 +봺 +봺 +봺 +봺 + +봻 +봻 +봻 +봻 +봻 + +봼 +봼 +봼 +봼 +봼 + +봽 +봽 +봽 +봽 +봽 + +봾 +봾 +봾 +봾 +봾 + +봿 +봿 +봿 +봿 +봿 + +뵀 +뵀 +뵀 +뵀 +뵀 + +뵁 +뵁 +뵁 +뵁 +뵁 + +뵂 +뵂 +뵂 +뵂 +뵂 + +뵃 +뵃 +뵃 +뵃 +뵃 + +뵄 +뵄 +뵄 +뵄 +뵄 + +뵅 +뵅 +뵅 +뵅 +뵅 + +뵆 +뵆 +뵆 +뵆 +뵆 + +뵇 +뵇 +뵇 +뵇 +뵇 + +뵈 +뵈 +뵈 +뵈 +뵈 + +뵉 +뵉 +뵉 +뵉 +뵉 + +뵊 +뵊 +뵊 +뵊 +뵊 + +뵋 +뵋 +뵋 +뵋 +뵋 + +뵌 +뵌 +뵌 +뵌 +뵌 + +뵍 +뵍 +뵍 +뵍 +뵍 + +뵎 +뵎 +뵎 +뵎 +뵎 + +뵏 +뵏 +뵏 +뵏 +뵏 + +뵐 +뵐 +뵐 +뵐 +뵐 + +뵑 +뵑 +뵑 +뵑 +뵑 + +뵒 +뵒 +뵒 +뵒 +뵒 + +뵓 +뵓 +뵓 +뵓 +뵓 + +뵔 +뵔 +뵔 +뵔 +뵔 + +뵕 +뵕 +뵕 +뵕 +뵕 + +뵖 +뵖 +뵖 +뵖 +뵖 + +뵗 +뵗 +뵗 +뵗 +뵗 + +뵘 +뵘 +뵘 +뵘 +뵘 + +뵙 +뵙 +뵙 +뵙 +뵙 + +뵚 +뵚 +뵚 +뵚 +뵚 + +뵛 +뵛 +뵛 +뵛 +뵛 + +뵜 +뵜 +뵜 +뵜 +뵜 + +뵝 +뵝 +뵝 +뵝 +뵝 + +뵞 +뵞 +뵞 +뵞 +뵞 + +뵟 +뵟 +뵟 +뵟 +뵟 + +뵠 +뵠 +뵠 +뵠 +뵠 + +뵡 +뵡 +뵡 +뵡 +뵡 + +뵢 +뵢 +뵢 +뵢 +뵢 + +뵣 +뵣 +뵣 +뵣 +뵣 + +뵤 +뵤 +뵤 +뵤 +뵤 + +뵥 +뵥 +뵥 +뵥 +뵥 + +뵦 +뵦 +뵦 +뵦 +뵦 + +뵧 +뵧 +뵧 +뵧 +뵧 + +뵨 +뵨 +뵨 +뵨 +뵨 + +뵩 +뵩 +뵩 +뵩 +뵩 + +뵪 +뵪 +뵪 +뵪 +뵪 + +뵫 +뵫 +뵫 +뵫 +뵫 + +뵬 +뵬 +뵬 +뵬 +뵬 + +뵭 +뵭 +뵭 +뵭 +뵭 + +뵮 +뵮 +뵮 +뵮 +뵮 + +뵯 +뵯 +뵯 +뵯 +뵯 + +뵰 +뵰 +뵰 +뵰 +뵰 + +뵱 +뵱 +뵱 +뵱 +뵱 + +뵲 +뵲 +뵲 +뵲 +뵲 + +뵳 +뵳 +뵳 +뵳 +뵳 + +뵴 +뵴 +뵴 +뵴 +뵴 + +뵵 +뵵 +뵵 +뵵 +뵵 + +뵶 +뵶 +뵶 +뵶 +뵶 + +뵷 +뵷 +뵷 +뵷 +뵷 + +뵸 +뵸 +뵸 +뵸 +뵸 + +뵹 +뵹 +뵹 +뵹 +뵹 + +뵺 +뵺 +뵺 +뵺 +뵺 + +뵻 +뵻 +뵻 +뵻 +뵻 + +뵼 +뵼 +뵼 +뵼 +뵼 + +뵽 +뵽 +뵽 +뵽 +뵽 + +뵾 +뵾 +뵾 +뵾 +뵾 + +뵿 +뵿 +뵿 +뵿 +뵿 + +부 +부 +부 +부 +부 + +북 +북 +북 +북 +북 + +붂 +붂 +붂 +붂 +붂 + +붃 +붃 +붃 +붃 +붃 + +분 +분 +분 +분 +분 + +붅 +붅 +붅 +붅 +붅 + +붆 +붆 +붆 +붆 +붆 + +붇 +붇 +붇 +붇 +붇 + +불 +불 +불 +불 +불 + +붉 +붉 +붉 +붉 +붉 + +붊 +붊 +붊 +붊 +붊 + +붋 +붋 +붋 +붋 +붋 + +붌 +붌 +붌 +붌 +붌 + +붍 +붍 +붍 +붍 +붍 + +붎 +붎 +붎 +붎 +붎 + +붏 +붏 +붏 +붏 +붏 + +붐 +붐 +붐 +붐 +붐 + +붑 +붑 +붑 +붑 +붑 + +붒 +붒 +붒 +붒 +붒 + +붓 +붓 +붓 +붓 +붓 + +붔 +붔 +붔 +붔 +붔 + +붕 +붕 +붕 +붕 +붕 + +붖 +붖 +붖 +붖 +붖 + +붗 +붗 +붗 +붗 +붗 + +붘 +붘 +붘 +붘 +붘 + +붙 +붙 +붙 +붙 +붙 + +붚 +붚 +붚 +붚 +붚 + +붛 +붛 +붛 +붛 +붛 + +붜 +붜 +붜 +붜 +붜 + +붝 +붝 +붝 +붝 +붝 + +붞 +붞 +붞 +붞 +붞 + +붟 +붟 +붟 +붟 +붟 + +붠 +붠 +붠 +붠 +붠 + +붡 +붡 +붡 +붡 +붡 + +붢 +붢 +붢 +붢 +붢 + +붣 +붣 +붣 +붣 +붣 + +붤 +붤 +붤 +붤 +붤 + +붥 +붥 +붥 +붥 +붥 + +붦 +붦 +붦 +붦 +붦 + +붧 +붧 +붧 +붧 +붧 + +붨 +붨 +붨 +붨 +붨 + +붩 +붩 +붩 +붩 +붩 + +붪 +붪 +붪 +붪 +붪 + +붫 +붫 +붫 +붫 +붫 + +붬 +붬 +붬 +붬 +붬 + +붭 +붭 +붭 +붭 +붭 + +붮 +붮 +붮 +붮 +붮 + +붯 +붯 +붯 +붯 +붯 + +붰 +붰 +붰 +붰 +붰 + +붱 +붱 +붱 +붱 +붱 + +붲 +붲 +붲 +붲 +붲 + +붳 +붳 +붳 +붳 +붳 + +붴 +붴 +붴 +붴 +붴 + +붵 +붵 +붵 +붵 +붵 + +붶 +붶 +붶 +붶 +붶 + +붷 +붷 +붷 +붷 +붷 + +붸 +붸 +붸 +붸 +붸 + +붹 +붹 +붹 +붹 +붹 + +붺 +붺 +붺 +붺 +붺 + +붻 +붻 +붻 +붻 +붻 + +붼 +붼 +붼 +붼 +붼 + +붽 +붽 +붽 +붽 +붽 + +붾 +붾 +붾 +붾 +붾 + +붿 +붿 +붿 +붿 +붿 + +뷀 +뷀 +뷀 +뷀 +뷀 + +뷁 +뷁 +뷁 +뷁 +뷁 + +뷂 +뷂 +뷂 +뷂 +뷂 + +뷃 +뷃 +뷃 +뷃 +뷃 + +뷄 +뷄 +뷄 +뷄 +뷄 + +뷅 +뷅 +뷅 +뷅 +뷅 + +뷆 +뷆 +뷆 +뷆 +뷆 + +뷇 +뷇 +뷇 +뷇 +뷇 + +뷈 +뷈 +뷈 +뷈 +뷈 + +뷉 +뷉 +뷉 +뷉 +뷉 + +뷊 +뷊 +뷊 +뷊 +뷊 + +뷋 +뷋 +뷋 +뷋 +뷋 + +뷌 +뷌 +뷌 +뷌 +뷌 + +뷍 +뷍 +뷍 +뷍 +뷍 + +뷎 +뷎 +뷎 +뷎 +뷎 + +뷏 +뷏 +뷏 +뷏 +뷏 + +뷐 +뷐 +뷐 +뷐 +뷐 + +뷑 +뷑 +뷑 +뷑 +뷑 + +뷒 +뷒 +뷒 +뷒 +뷒 + +뷓 +뷓 +뷓 +뷓 +뷓 + +뷔 +뷔 +뷔 +뷔 +뷔 + +뷕 +뷕 +뷕 +뷕 +뷕 + +뷖 +뷖 +뷖 +뷖 +뷖 + +뷗 +뷗 +뷗 +뷗 +뷗 + +뷘 +뷘 +뷘 +뷘 +뷘 + +뷙 +뷙 +뷙 +뷙 +뷙 + +뷚 +뷚 +뷚 +뷚 +뷚 + +뷛 +뷛 +뷛 +뷛 +뷛 + +뷜 +뷜 +뷜 +뷜 +뷜 + +뷝 +뷝 +뷝 +뷝 +뷝 + +뷞 +뷞 +뷞 +뷞 +뷞 + +뷟 +뷟 +뷟 +뷟 +뷟 + +뷠 +뷠 +뷠 +뷠 +뷠 + +뷡 +뷡 +뷡 +뷡 +뷡 + +뷢 +뷢 +뷢 +뷢 +뷢 + +뷣 +뷣 +뷣 +뷣 +뷣 + +뷤 +뷤 +뷤 +뷤 +뷤 + +뷥 +뷥 +뷥 +뷥 +뷥 + +뷦 +뷦 +뷦 +뷦 +뷦 + +뷧 +뷧 +뷧 +뷧 +뷧 + +뷨 +뷨 +뷨 +뷨 +뷨 + +뷩 +뷩 +뷩 +뷩 +뷩 + +뷪 +뷪 +뷪 +뷪 +뷪 + +뷫 +뷫 +뷫 +뷫 +뷫 + +뷬 +뷬 +뷬 +뷬 +뷬 + +뷭 +뷭 +뷭 +뷭 +뷭 + +뷮 +뷮 +뷮 +뷮 +뷮 + +뷯 +뷯 +뷯 +뷯 +뷯 + +뷰 +뷰 +뷰 +뷰 +뷰 + +뷱 +뷱 +뷱 +뷱 +뷱 + +뷲 +뷲 +뷲 +뷲 +뷲 + +뷳 +뷳 +뷳 +뷳 +뷳 + +뷴 +뷴 +뷴 +뷴 +뷴 + +뷵 +뷵 +뷵 +뷵 +뷵 + +뷶 +뷶 +뷶 +뷶 +뷶 + +뷷 +뷷 +뷷 +뷷 +뷷 + +뷸 +뷸 +뷸 +뷸 +뷸 + +뷹 +뷹 +뷹 +뷹 +뷹 + +뷺 +뷺 +뷺 +뷺 +뷺 + +뷻 +뷻 +뷻 +뷻 +뷻 + +뷼 +뷼 +뷼 +뷼 +뷼 + +뷽 +뷽 +뷽 +뷽 +뷽 + +뷾 +뷾 +뷾 +뷾 +뷾 + +뷿 +뷿 +뷿 +뷿 +뷿 + +븀 +븀 +븀 +븀 +븀 + +븁 +븁 +븁 +븁 +븁 + +븂 +븂 +븂 +븂 +븂 + +븃 +븃 +븃 +븃 +븃 + +븄 +븄 +븄 +븄 +븄 + +븅 +븅 +븅 +븅 +븅 + +븆 +븆 +븆 +븆 +븆 + +븇 +븇 +븇 +븇 +븇 + +븈 +븈 +븈 +븈 +븈 + +븉 +븉 +븉 +븉 +븉 + +븊 +븊 +븊 +븊 +븊 + +븋 +븋 +븋 +븋 +븋 + +브 +브 +브 +브 +브 + +븍 +븍 +븍 +븍 +븍 + +븎 +븎 +븎 +븎 +븎 + +븏 +븏 +븏 +븏 +븏 + +븐 +븐 +븐 +븐 +븐 + +븑 +븑 +븑 +븑 +븑 + +븒 +븒 +븒 +븒 +븒 + +븓 +븓 +븓 +븓 +븓 + +블 +블 +블 +블 +블 + +븕 +븕 +븕 +븕 +븕 + +븖 +븖 +븖 +븖 +븖 + +븗 +븗 +븗 +븗 +븗 + +븘 +븘 +븘 +븘 +븘 + +븙 +븙 +븙 +븙 +븙 + +븚 +븚 +븚 +븚 +븚 + +븛 +븛 +븛 +븛 +븛 + +븜 +븜 +븜 +븜 +븜 + +븝 +븝 +븝 +븝 +븝 + +븞 +븞 +븞 +븞 +븞 + +븟 +븟 +븟 +븟 +븟 + +븠 +븠 +븠 +븠 +븠 + +븡 +븡 +븡 +븡 +븡 + +븢 +븢 +븢 +븢 +븢 + +븣 +븣 +븣 +븣 +븣 + +븤 +븤 +븤 +븤 +븤 + +븥 +븥 +븥 +븥 +븥 + +븦 +븦 +븦 +븦 +븦 + +븧 +븧 +븧 +븧 +븧 + +븨 +븨 +븨 +븨 +븨 + +븩 +븩 +븩 +븩 +븩 + +븪 +븪 +븪 +븪 +븪 + +븫 +븫 +븫 +븫 +븫 + +븬 +븬 +븬 +븬 +븬 + +븭 +븭 +븭 +븭 +븭 + +븮 +븮 +븮 +븮 +븮 + +븯 +븯 +븯 +븯 +븯 + +븰 +븰 +븰 +븰 +븰 + +븱 +븱 +븱 +븱 +븱 + +븲 +븲 +븲 +븲 +븲 + +븳 +븳 +븳 +븳 +븳 + +븴 +븴 +븴 +븴 +븴 + +븵 +븵 +븵 +븵 +븵 + +븶 +븶 +븶 +븶 +븶 + +븷 +븷 +븷 +븷 +븷 + +븸 +븸 +븸 +븸 +븸 + +븹 +븹 +븹 +븹 +븹 + +븺 +븺 +븺 +븺 +븺 + +븻 +븻 +븻 +븻 +븻 + +븼 +븼 +븼 +븼 +븼 + +븽 +븽 +븽 +븽 +븽 + +븾 +븾 +븾 +븾 +븾 + +븿 +븿 +븿 +븿 +븿 + +빀 +빀 +빀 +빀 +빀 + +빁 +빁 +빁 +빁 +빁 + +빂 +빂 +빂 +빂 +빂 + +빃 +빃 +빃 +빃 +빃 + +비 +비 +비 +비 +비 + +빅 +빅 +빅 +빅 +빅 + +빆 +빆 +빆 +빆 +빆 + +빇 +빇 +빇 +빇 +빇 + +빈 +빈 +빈 +빈 +빈 + +빉 +빉 +빉 +빉 +빉 + +빊 +빊 +빊 +빊 +빊 + +빋 +빋 +빋 +빋 +빋 + +빌 +빌 +빌 +빌 +빌 + +빍 +빍 +빍 +빍 +빍 + +빎 +빎 +빎 +빎 +빎 + +빏 +빏 +빏 +빏 +빏 + +빐 +빐 +빐 +빐 +빐 + +빑 +빑 +빑 +빑 +빑 + +빒 +빒 +빒 +빒 +빒 + +빓 +빓 +빓 +빓 +빓 + +빔 +빔 +빔 +빔 +빔 + +빕 +빕 +빕 +빕 +빕 + +빖 +빖 +빖 +빖 +빖 + +빗 +빗 +빗 +빗 +빗 + +빘 +빘 +빘 +빘 +빘 + +빙 +빙 +빙 +빙 +빙 + +빚 +빚 +빚 +빚 +빚 + +빛 +빛 +빛 +빛 +빛 + +빜 +빜 +빜 +빜 +빜 + +빝 +빝 +빝 +빝 +빝 + +빞 +빞 +빞 +빞 +빞 + +빟 +빟 +빟 +빟 +빟 + +빠 +빠 +빠 +빠 +빠 + +빡 +빡 +빡 +빡 +빡 + +빢 +빢 +빢 +빢 +빢 + +빣 +빣 +빣 +빣 +빣 + +빤 +빤 +빤 +빤 +빤 + +빥 +빥 +빥 +빥 +빥 + +빦 +빦 +빦 +빦 +빦 + +빧 +빧 +빧 +빧 +빧 + +빨 +빨 +빨 +빨 +빨 + +빩 +빩 +빩 +빩 +빩 + +빪 +빪 +빪 +빪 +빪 + +빫 +빫 +빫 +빫 +빫 + +빬 +빬 +빬 +빬 +빬 + +빭 +빭 +빭 +빭 +빭 + +빮 +빮 +빮 +빮 +빮 + +빯 +빯 +빯 +빯 +빯 + +빰 +빰 +빰 +빰 +빰 + +빱 +빱 +빱 +빱 +빱 + +빲 +빲 +빲 +빲 +빲 + +빳 +빳 +빳 +빳 +빳 + +빴 +빴 +빴 +빴 +빴 + +빵 +빵 +빵 +빵 +빵 + +빶 +빶 +빶 +빶 +빶 + +빷 +빷 +빷 +빷 +빷 + +빸 +빸 +빸 +빸 +빸 + +빹 +빹 +빹 +빹 +빹 + +빺 +빺 +빺 +빺 +빺 + +빻 +빻 +빻 +빻 +빻 + +빼 +빼 +빼 +빼 +빼 + +빽 +빽 +빽 +빽 +빽 + +빾 +빾 +빾 +빾 +빾 + +빿 +빿 +빿 +빿 +빿 + +뺀 +뺀 +뺀 +뺀 +뺀 + +뺁 +뺁 +뺁 +뺁 +뺁 + +뺂 +뺂 +뺂 +뺂 +뺂 + +뺃 +뺃 +뺃 +뺃 +뺃 + +뺄 +뺄 +뺄 +뺄 +뺄 + +뺅 +뺅 +뺅 +뺅 +뺅 + +뺆 +뺆 +뺆 +뺆 +뺆 + +뺇 +뺇 +뺇 +뺇 +뺇 + +뺈 +뺈 +뺈 +뺈 +뺈 + +뺉 +뺉 +뺉 +뺉 +뺉 + +뺊 +뺊 +뺊 +뺊 +뺊 + +뺋 +뺋 +뺋 +뺋 +뺋 + +뺌 +뺌 +뺌 +뺌 +뺌 + +뺍 +뺍 +뺍 +뺍 +뺍 + +뺎 +뺎 +뺎 +뺎 +뺎 + +뺏 +뺏 +뺏 +뺏 +뺏 + +뺐 +뺐 +뺐 +뺐 +뺐 + +뺑 +뺑 +뺑 +뺑 +뺑 + +뺒 +뺒 +뺒 +뺒 +뺒 + +뺓 +뺓 +뺓 +뺓 +뺓 + +뺔 +뺔 +뺔 +뺔 +뺔 + +뺕 +뺕 +뺕 +뺕 +뺕 + +뺖 +뺖 +뺖 +뺖 +뺖 + +뺗 +뺗 +뺗 +뺗 +뺗 + +뺘 +뺘 +뺘 +뺘 +뺘 + +뺙 +뺙 +뺙 +뺙 +뺙 + +뺚 +뺚 +뺚 +뺚 +뺚 + +뺛 +뺛 +뺛 +뺛 +뺛 + +뺜 +뺜 +뺜 +뺜 +뺜 + +뺝 +뺝 +뺝 +뺝 +뺝 + +뺞 +뺞 +뺞 +뺞 +뺞 + +뺟 +뺟 +뺟 +뺟 +뺟 + +뺠 +뺠 +뺠 +뺠 +뺠 + +뺡 +뺡 +뺡 +뺡 +뺡 + +뺢 +뺢 +뺢 +뺢 +뺢 + +뺣 +뺣 +뺣 +뺣 +뺣 + +뺤 +뺤 +뺤 +뺤 +뺤 + +뺥 +뺥 +뺥 +뺥 +뺥 + +뺦 +뺦 +뺦 +뺦 +뺦 + +뺧 +뺧 +뺧 +뺧 +뺧 + +뺨 +뺨 +뺨 +뺨 +뺨 + +뺩 +뺩 +뺩 +뺩 +뺩 + +뺪 +뺪 +뺪 +뺪 +뺪 + +뺫 +뺫 +뺫 +뺫 +뺫 + +뺬 +뺬 +뺬 +뺬 +뺬 + +뺭 +뺭 +뺭 +뺭 +뺭 + +뺮 +뺮 +뺮 +뺮 +뺮 + +뺯 +뺯 +뺯 +뺯 +뺯 + +뺰 +뺰 +뺰 +뺰 +뺰 + +뺱 +뺱 +뺱 +뺱 +뺱 + +뺲 +뺲 +뺲 +뺲 +뺲 + +뺳 +뺳 +뺳 +뺳 +뺳 + +뺴 +뺴 +뺴 +뺴 +뺴 + +뺵 +뺵 +뺵 +뺵 +뺵 + +뺶 +뺶 +뺶 +뺶 +뺶 + +뺷 +뺷 +뺷 +뺷 +뺷 + +뺸 +뺸 +뺸 +뺸 +뺸 + +뺹 +뺹 +뺹 +뺹 +뺹 + +뺺 +뺺 +뺺 +뺺 +뺺 + +뺻 +뺻 +뺻 +뺻 +뺻 + +뺼 +뺼 +뺼 +뺼 +뺼 + +뺽 +뺽 +뺽 +뺽 +뺽 + +뺾 +뺾 +뺾 +뺾 +뺾 + +뺿 +뺿 +뺿 +뺿 +뺿 + +뻀 +뻀 +뻀 +뻀 +뻀 + +뻁 +뻁 +뻁 +뻁 +뻁 + +뻂 +뻂 +뻂 +뻂 +뻂 + +뻃 +뻃 +뻃 +뻃 +뻃 + +뻄 +뻄 +뻄 +뻄 +뻄 + +뻅 +뻅 +뻅 +뻅 +뻅 + +뻆 +뻆 +뻆 +뻆 +뻆 + +뻇 +뻇 +뻇 +뻇 +뻇 + +뻈 +뻈 +뻈 +뻈 +뻈 + +뻉 +뻉 +뻉 +뻉 +뻉 + +뻊 +뻊 +뻊 +뻊 +뻊 + +뻋 +뻋 +뻋 +뻋 +뻋 + +뻌 +뻌 +뻌 +뻌 +뻌 + +뻍 +뻍 +뻍 +뻍 +뻍 + +뻎 +뻎 +뻎 +뻎 +뻎 + +뻏 +뻏 +뻏 +뻏 +뻏 + +뻐 +뻐 +뻐 +뻐 +뻐 + +뻑 +뻑 +뻑 +뻑 +뻑 + +뻒 +뻒 +뻒 +뻒 +뻒 + +뻓 +뻓 +뻓 +뻓 +뻓 + +뻔 +뻔 +뻔 +뻔 +뻔 + +뻕 +뻕 +뻕 +뻕 +뻕 + +뻖 +뻖 +뻖 +뻖 +뻖 + +뻗 +뻗 +뻗 +뻗 +뻗 + +뻘 +뻘 +뻘 +뻘 +뻘 + +뻙 +뻙 +뻙 +뻙 +뻙 + +뻚 +뻚 +뻚 +뻚 +뻚 + +뻛 +뻛 +뻛 +뻛 +뻛 + +뻜 +뻜 +뻜 +뻜 +뻜 + +뻝 +뻝 +뻝 +뻝 +뻝 + +뻞 +뻞 +뻞 +뻞 +뻞 + +뻟 +뻟 +뻟 +뻟 +뻟 + +뻠 +뻠 +뻠 +뻠 +뻠 + +뻡 +뻡 +뻡 +뻡 +뻡 + +뻢 +뻢 +뻢 +뻢 +뻢 + +뻣 +뻣 +뻣 +뻣 +뻣 + +뻤 +뻤 +뻤 +뻤 +뻤 + +뻥 +뻥 +뻥 +뻥 +뻥 + +뻦 +뻦 +뻦 +뻦 +뻦 + +뻧 +뻧 +뻧 +뻧 +뻧 + +뻨 +뻨 +뻨 +뻨 +뻨 + +뻩 +뻩 +뻩 +뻩 +뻩 + +뻪 +뻪 +뻪 +뻪 +뻪 + +뻫 +뻫 +뻫 +뻫 +뻫 + +뻬 +뻬 +뻬 +뻬 +뻬 + +뻭 +뻭 +뻭 +뻭 +뻭 + +뻮 +뻮 +뻮 +뻮 +뻮 + +뻯 +뻯 +뻯 +뻯 +뻯 + +뻰 +뻰 +뻰 +뻰 +뻰 + +뻱 +뻱 +뻱 +뻱 +뻱 + +뻲 +뻲 +뻲 +뻲 +뻲 + +뻳 +뻳 +뻳 +뻳 +뻳 + +뻴 +뻴 +뻴 +뻴 +뻴 + +뻵 +뻵 +뻵 +뻵 +뻵 + +뻶 +뻶 +뻶 +뻶 +뻶 + +뻷 +뻷 +뻷 +뻷 +뻷 + +뻸 +뻸 +뻸 +뻸 +뻸 + +뻹 +뻹 +뻹 +뻹 +뻹 + +뻺 +뻺 +뻺 +뻺 +뻺 + +뻻 +뻻 +뻻 +뻻 +뻻 + +뻼 +뻼 +뻼 +뻼 +뻼 + +뻽 +뻽 +뻽 +뻽 +뻽 + +뻾 +뻾 +뻾 +뻾 +뻾 + +뻿 +뻿 +뻿 +뻿 +뻿 + +뼀 +뼀 +뼀 +뼀 +뼀 + +뼁 +뼁 +뼁 +뼁 +뼁 + +뼂 +뼂 +뼂 +뼂 +뼂 + +뼃 +뼃 +뼃 +뼃 +뼃 + +뼄 +뼄 +뼄 +뼄 +뼄 + +뼅 +뼅 +뼅 +뼅 +뼅 + +뼆 +뼆 +뼆 +뼆 +뼆 + +뼇 +뼇 +뼇 +뼇 +뼇 + +뼈 +뼈 +뼈 +뼈 +뼈 + +뼉 +뼉 +뼉 +뼉 +뼉 + +뼊 +뼊 +뼊 +뼊 +뼊 + +뼋 +뼋 +뼋 +뼋 +뼋 + +뼌 +뼌 +뼌 +뼌 +뼌 + +뼍 +뼍 +뼍 +뼍 +뼍 + +뼎 +뼎 +뼎 +뼎 +뼎 + +뼏 +뼏 +뼏 +뼏 +뼏 + +뼐 +뼐 +뼐 +뼐 +뼐 + +뼑 +뼑 +뼑 +뼑 +뼑 + +뼒 +뼒 +뼒 +뼒 +뼒 + +뼓 +뼓 +뼓 +뼓 +뼓 + +뼔 +뼔 +뼔 +뼔 +뼔 + +뼕 +뼕 +뼕 +뼕 +뼕 + +뼖 +뼖 +뼖 +뼖 +뼖 + +뼗 +뼗 +뼗 +뼗 +뼗 + +뼘 +뼘 +뼘 +뼘 +뼘 + +뼙 +뼙 +뼙 +뼙 +뼙 + +뼚 +뼚 +뼚 +뼚 +뼚 + +뼛 +뼛 +뼛 +뼛 +뼛 + +뼜 +뼜 +뼜 +뼜 +뼜 + +뼝 +뼝 +뼝 +뼝 +뼝 + +뼞 +뼞 +뼞 +뼞 +뼞 + +뼟 +뼟 +뼟 +뼟 +뼟 + +뼠 +뼠 +뼠 +뼠 +뼠 + +뼡 +뼡 +뼡 +뼡 +뼡 + +뼢 +뼢 +뼢 +뼢 +뼢 + +뼣 +뼣 +뼣 +뼣 +뼣 + +뼤 +뼤 +뼤 +뼤 +뼤 + +뼥 +뼥 +뼥 +뼥 +뼥 + +뼦 +뼦 +뼦 +뼦 +뼦 + +뼧 +뼧 +뼧 +뼧 +뼧 + +뼨 +뼨 +뼨 +뼨 +뼨 + +뼩 +뼩 +뼩 +뼩 +뼩 + +뼪 +뼪 +뼪 +뼪 +뼪 + +뼫 +뼫 +뼫 +뼫 +뼫 + +뼬 +뼬 +뼬 +뼬 +뼬 + +뼭 +뼭 +뼭 +뼭 +뼭 + +뼮 +뼮 +뼮 +뼮 +뼮 + +뼯 +뼯 +뼯 +뼯 +뼯 + +뼰 +뼰 +뼰 +뼰 +뼰 + +뼱 +뼱 +뼱 +뼱 +뼱 + +뼲 +뼲 +뼲 +뼲 +뼲 + +뼳 +뼳 +뼳 +뼳 +뼳 + +뼴 +뼴 +뼴 +뼴 +뼴 + +뼵 +뼵 +뼵 +뼵 +뼵 + +뼶 +뼶 +뼶 +뼶 +뼶 + +뼷 +뼷 +뼷 +뼷 +뼷 + +뼸 +뼸 +뼸 +뼸 +뼸 + +뼹 +뼹 +뼹 +뼹 +뼹 + +뼺 +뼺 +뼺 +뼺 +뼺 + +뼻 +뼻 +뼻 +뼻 +뼻 + +뼼 +뼼 +뼼 +뼼 +뼼 + +뼽 +뼽 +뼽 +뼽 +뼽 + +뼾 +뼾 +뼾 +뼾 +뼾 + +뼿 +뼿 +뼿 +뼿 +뼿 + +뽀 +뽀 +뽀 +뽀 +뽀 + +뽁 +뽁 +뽁 +뽁 +뽁 + +뽂 +뽂 +뽂 +뽂 +뽂 + +뽃 +뽃 +뽃 +뽃 +뽃 + +뽄 +뽄 +뽄 +뽄 +뽄 + +뽅 +뽅 +뽅 +뽅 +뽅 + +뽆 +뽆 +뽆 +뽆 +뽆 + +뽇 +뽇 +뽇 +뽇 +뽇 + +뽈 +뽈 +뽈 +뽈 +뽈 + +뽉 +뽉 +뽉 +뽉 +뽉 + +뽊 +뽊 +뽊 +뽊 +뽊 + +뽋 +뽋 +뽋 +뽋 +뽋 + +뽌 +뽌 +뽌 +뽌 +뽌 + +뽍 +뽍 +뽍 +뽍 +뽍 + +뽎 +뽎 +뽎 +뽎 +뽎 + +뽏 +뽏 +뽏 +뽏 +뽏 + +뽐 +뽐 +뽐 +뽐 +뽐 + +뽑 +뽑 +뽑 +뽑 +뽑 + +뽒 +뽒 +뽒 +뽒 +뽒 + +뽓 +뽓 +뽓 +뽓 +뽓 + +뽔 +뽔 +뽔 +뽔 +뽔 + +뽕 +뽕 +뽕 +뽕 +뽕 + +뽖 +뽖 +뽖 +뽖 +뽖 + +뽗 +뽗 +뽗 +뽗 +뽗 + +뽘 +뽘 +뽘 +뽘 +뽘 + +뽙 +뽙 +뽙 +뽙 +뽙 + +뽚 +뽚 +뽚 +뽚 +뽚 + +뽛 +뽛 +뽛 +뽛 +뽛 + +뽜 +뽜 +뽜 +뽜 +뽜 + +뽝 +뽝 +뽝 +뽝 +뽝 + +뽞 +뽞 +뽞 +뽞 +뽞 + +뽟 +뽟 +뽟 +뽟 +뽟 + +뽠 +뽠 +뽠 +뽠 +뽠 + +뽡 +뽡 +뽡 +뽡 +뽡 + +뽢 +뽢 +뽢 +뽢 +뽢 + +뽣 +뽣 +뽣 +뽣 +뽣 + +뽤 +뽤 +뽤 +뽤 +뽤 + +뽥 +뽥 +뽥 +뽥 +뽥 + +뽦 +뽦 +뽦 +뽦 +뽦 + +뽧 +뽧 +뽧 +뽧 +뽧 + +뽨 +뽨 +뽨 +뽨 +뽨 + +뽩 +뽩 +뽩 +뽩 +뽩 + +뽪 +뽪 +뽪 +뽪 +뽪 + +뽫 +뽫 +뽫 +뽫 +뽫 + +뽬 +뽬 +뽬 +뽬 +뽬 + +뽭 +뽭 +뽭 +뽭 +뽭 + +뽮 +뽮 +뽮 +뽮 +뽮 + +뽯 +뽯 +뽯 +뽯 +뽯 + +뽰 +뽰 +뽰 +뽰 +뽰 + +뽱 +뽱 +뽱 +뽱 +뽱 + +뽲 +뽲 +뽲 +뽲 +뽲 + +뽳 +뽳 +뽳 +뽳 +뽳 + +뽴 +뽴 +뽴 +뽴 +뽴 + +뽵 +뽵 +뽵 +뽵 +뽵 + +뽶 +뽶 +뽶 +뽶 +뽶 + +뽷 +뽷 +뽷 +뽷 +뽷 + +뽸 +뽸 +뽸 +뽸 +뽸 + +뽹 +뽹 +뽹 +뽹 +뽹 + +뽺 +뽺 +뽺 +뽺 +뽺 + +뽻 +뽻 +뽻 +뽻 +뽻 + +뽼 +뽼 +뽼 +뽼 +뽼 + +뽽 +뽽 +뽽 +뽽 +뽽 + +뽾 +뽾 +뽾 +뽾 +뽾 + +뽿 +뽿 +뽿 +뽿 +뽿 + +뾀 +뾀 +뾀 +뾀 +뾀 + +뾁 +뾁 +뾁 +뾁 +뾁 + +뾂 +뾂 +뾂 +뾂 +뾂 + +뾃 +뾃 +뾃 +뾃 +뾃 + +뾄 +뾄 +뾄 +뾄 +뾄 + +뾅 +뾅 +뾅 +뾅 +뾅 + +뾆 +뾆 +뾆 +뾆 +뾆 + +뾇 +뾇 +뾇 +뾇 +뾇 + +뾈 +뾈 +뾈 +뾈 +뾈 + +뾉 +뾉 +뾉 +뾉 +뾉 + +뾊 +뾊 +뾊 +뾊 +뾊 + +뾋 +뾋 +뾋 +뾋 +뾋 + +뾌 +뾌 +뾌 +뾌 +뾌 + +뾍 +뾍 +뾍 +뾍 +뾍 + +뾎 +뾎 +뾎 +뾎 +뾎 + +뾏 +뾏 +뾏 +뾏 +뾏 + +뾐 +뾐 +뾐 +뾐 +뾐 + +뾑 +뾑 +뾑 +뾑 +뾑 + +뾒 +뾒 +뾒 +뾒 +뾒 + +뾓 +뾓 +뾓 +뾓 +뾓 + +뾔 +뾔 +뾔 +뾔 +뾔 + +뾕 +뾕 +뾕 +뾕 +뾕 + +뾖 +뾖 +뾖 +뾖 +뾖 + +뾗 +뾗 +뾗 +뾗 +뾗 + +뾘 +뾘 +뾘 +뾘 +뾘 + +뾙 +뾙 +뾙 +뾙 +뾙 + +뾚 +뾚 +뾚 +뾚 +뾚 + +뾛 +뾛 +뾛 +뾛 +뾛 + +뾜 +뾜 +뾜 +뾜 +뾜 + +뾝 +뾝 +뾝 +뾝 +뾝 + +뾞 +뾞 +뾞 +뾞 +뾞 + +뾟 +뾟 +뾟 +뾟 +뾟 + +뾠 +뾠 +뾠 +뾠 +뾠 + +뾡 +뾡 +뾡 +뾡 +뾡 + +뾢 +뾢 +뾢 +뾢 +뾢 + +뾣 +뾣 +뾣 +뾣 +뾣 + +뾤 +뾤 +뾤 +뾤 +뾤 + +뾥 +뾥 +뾥 +뾥 +뾥 + +뾦 +뾦 +뾦 +뾦 +뾦 + +뾧 +뾧 +뾧 +뾧 +뾧 + +뾨 +뾨 +뾨 +뾨 +뾨 + +뾩 +뾩 +뾩 +뾩 +뾩 + +뾪 +뾪 +뾪 +뾪 +뾪 + +뾫 +뾫 +뾫 +뾫 +뾫 + +뾬 +뾬 +뾬 +뾬 +뾬 + +뾭 +뾭 +뾭 +뾭 +뾭 + +뾮 +뾮 +뾮 +뾮 +뾮 + +뾯 +뾯 +뾯 +뾯 +뾯 + +뾰 +뾰 +뾰 +뾰 +뾰 + +뾱 +뾱 +뾱 +뾱 +뾱 + +뾲 +뾲 +뾲 +뾲 +뾲 + +뾳 +뾳 +뾳 +뾳 +뾳 + +뾴 +뾴 +뾴 +뾴 +뾴 + +뾵 +뾵 +뾵 +뾵 +뾵 + +뾶 +뾶 +뾶 +뾶 +뾶 + +뾷 +뾷 +뾷 +뾷 +뾷 + +뾸 +뾸 +뾸 +뾸 +뾸 + +뾹 +뾹 +뾹 +뾹 +뾹 + +뾺 +뾺 +뾺 +뾺 +뾺 + +뾻 +뾻 +뾻 +뾻 +뾻 + +뾼 +뾼 +뾼 +뾼 +뾼 + +뾽 +뾽 +뾽 +뾽 +뾽 + +뾾 +뾾 +뾾 +뾾 +뾾 + +뾿 +뾿 +뾿 +뾿 +뾿 + +뿀 +뿀 +뿀 +뿀 +뿀 + +뿁 +뿁 +뿁 +뿁 +뿁 + +뿂 +뿂 +뿂 +뿂 +뿂 + +뿃 +뿃 +뿃 +뿃 +뿃 + +뿄 +뿄 +뿄 +뿄 +뿄 + +뿅 +뿅 +뿅 +뿅 +뿅 + +뿆 +뿆 +뿆 +뿆 +뿆 + +뿇 +뿇 +뿇 +뿇 +뿇 + +뿈 +뿈 +뿈 +뿈 +뿈 + +뿉 +뿉 +뿉 +뿉 +뿉 + +뿊 +뿊 +뿊 +뿊 +뿊 + +뿋 +뿋 +뿋 +뿋 +뿋 + +뿌 +뿌 +뿌 +뿌 +뿌 + +뿍 +뿍 +뿍 +뿍 +뿍 + +뿎 +뿎 +뿎 +뿎 +뿎 + +뿏 +뿏 +뿏 +뿏 +뿏 + +뿐 +뿐 +뿐 +뿐 +뿐 + +뿑 +뿑 +뿑 +뿑 +뿑 + +뿒 +뿒 +뿒 +뿒 +뿒 + +뿓 +뿓 +뿓 +뿓 +뿓 + +뿔 +뿔 +뿔 +뿔 +뿔 + +뿕 +뿕 +뿕 +뿕 +뿕 + +뿖 +뿖 +뿖 +뿖 +뿖 + +뿗 +뿗 +뿗 +뿗 +뿗 + +뿘 +뿘 +뿘 +뿘 +뿘 + +뿙 +뿙 +뿙 +뿙 +뿙 + +뿚 +뿚 +뿚 +뿚 +뿚 + +뿛 +뿛 +뿛 +뿛 +뿛 + +뿜 +뿜 +뿜 +뿜 +뿜 + +뿝 +뿝 +뿝 +뿝 +뿝 + +뿞 +뿞 +뿞 +뿞 +뿞 + +뿟 +뿟 +뿟 +뿟 +뿟 + +뿠 +뿠 +뿠 +뿠 +뿠 + +뿡 +뿡 +뿡 +뿡 +뿡 + +뿢 +뿢 +뿢 +뿢 +뿢 + +뿣 +뿣 +뿣 +뿣 +뿣 + +뿤 +뿤 +뿤 +뿤 +뿤 + +뿥 +뿥 +뿥 +뿥 +뿥 + +뿦 +뿦 +뿦 +뿦 +뿦 + +뿧 +뿧 +뿧 +뿧 +뿧 + +뿨 +뿨 +뿨 +뿨 +뿨 + +뿩 +뿩 +뿩 +뿩 +뿩 + +뿪 +뿪 +뿪 +뿪 +뿪 + +뿫 +뿫 +뿫 +뿫 +뿫 + +뿬 +뿬 +뿬 +뿬 +뿬 + +뿭 +뿭 +뿭 +뿭 +뿭 + +뿮 +뿮 +뿮 +뿮 +뿮 + +뿯 +뿯 +뿯 +뿯 +뿯 + +뿰 +뿰 +뿰 +뿰 +뿰 + +뿱 +뿱 +뿱 +뿱 +뿱 + +뿲 +뿲 +뿲 +뿲 +뿲 + +뿳 +뿳 +뿳 +뿳 +뿳 + +뿴 +뿴 +뿴 +뿴 +뿴 + +뿵 +뿵 +뿵 +뿵 +뿵 + +뿶 +뿶 +뿶 +뿶 +뿶 + +뿷 +뿷 +뿷 +뿷 +뿷 + +뿸 +뿸 +뿸 +뿸 +뿸 + +뿹 +뿹 +뿹 +뿹 +뿹 + +뿺 +뿺 +뿺 +뿺 +뿺 + +뿻 +뿻 +뿻 +뿻 +뿻 + +뿼 +뿼 +뿼 +뿼 +뿼 + +뿽 +뿽 +뿽 +뿽 +뿽 + +뿾 +뿾 +뿾 +뿾 +뿾 + +뿿 +뿿 +뿿 +뿿 +뿿 + +쀀 +쀀 +쀀 +쀀 +쀀 + +쀁 +쀁 +쀁 +쀁 +쀁 + +쀂 +쀂 +쀂 +쀂 +쀂 + +쀃 +쀃 +쀃 +쀃 +쀃 + +쀄 +쀄 +쀄 +쀄 +쀄 + +쀅 +쀅 +쀅 +쀅 +쀅 + +쀆 +쀆 +쀆 +쀆 +쀆 + +쀇 +쀇 +쀇 +쀇 +쀇 + +쀈 +쀈 +쀈 +쀈 +쀈 + +쀉 +쀉 +쀉 +쀉 +쀉 + +쀊 +쀊 +쀊 +쀊 +쀊 + +쀋 +쀋 +쀋 +쀋 +쀋 + +쀌 +쀌 +쀌 +쀌 +쀌 + +쀍 +쀍 +쀍 +쀍 +쀍 + +쀎 +쀎 +쀎 +쀎 +쀎 + +쀏 +쀏 +쀏 +쀏 +쀏 + +쀐 +쀐 +쀐 +쀐 +쀐 + +쀑 +쀑 +쀑 +쀑 +쀑 + +쀒 +쀒 +쀒 +쀒 +쀒 + +쀓 +쀓 +쀓 +쀓 +쀓 + +쀔 +쀔 +쀔 +쀔 +쀔 + +쀕 +쀕 +쀕 +쀕 +쀕 + +쀖 +쀖 +쀖 +쀖 +쀖 + +쀗 +쀗 +쀗 +쀗 +쀗 + +쀘 +쀘 +쀘 +쀘 +쀘 + +쀙 +쀙 +쀙 +쀙 +쀙 + +쀚 +쀚 +쀚 +쀚 +쀚 + +쀛 +쀛 +쀛 +쀛 +쀛 + +쀜 +쀜 +쀜 +쀜 +쀜 + +쀝 +쀝 +쀝 +쀝 +쀝 + +쀞 +쀞 +쀞 +쀞 +쀞 + +쀟 +쀟 +쀟 +쀟 +쀟 + +쀠 +쀠 +쀠 +쀠 +쀠 + +쀡 +쀡 +쀡 +쀡 +쀡 + +쀢 +쀢 +쀢 +쀢 +쀢 + +쀣 +쀣 +쀣 +쀣 +쀣 + +쀤 +쀤 +쀤 +쀤 +쀤 + +쀥 +쀥 +쀥 +쀥 +쀥 + +쀦 +쀦 +쀦 +쀦 +쀦 + +쀧 +쀧 +쀧 +쀧 +쀧 + +쀨 +쀨 +쀨 +쀨 +쀨 + +쀩 +쀩 +쀩 +쀩 +쀩 + +쀪 +쀪 +쀪 +쀪 +쀪 + +쀫 +쀫 +쀫 +쀫 +쀫 + +쀬 +쀬 +쀬 +쀬 +쀬 + +쀭 +쀭 +쀭 +쀭 +쀭 + +쀮 +쀮 +쀮 +쀮 +쀮 + +쀯 +쀯 +쀯 +쀯 +쀯 + +쀰 +쀰 +쀰 +쀰 +쀰 + +쀱 +쀱 +쀱 +쀱 +쀱 + +쀲 +쀲 +쀲 +쀲 +쀲 + +쀳 +쀳 +쀳 +쀳 +쀳 + +쀴 +쀴 +쀴 +쀴 +쀴 + +쀵 +쀵 +쀵 +쀵 +쀵 + +쀶 +쀶 +쀶 +쀶 +쀶 + +쀷 +쀷 +쀷 +쀷 +쀷 + +쀸 +쀸 +쀸 +쀸 +쀸 + +쀹 +쀹 +쀹 +쀹 +쀹 + +쀺 +쀺 +쀺 +쀺 +쀺 + +쀻 +쀻 +쀻 +쀻 +쀻 + +쀼 +쀼 +쀼 +쀼 +쀼 + +쀽 +쀽 +쀽 +쀽 +쀽 + +쀾 +쀾 +쀾 +쀾 +쀾 + +쀿 +쀿 +쀿 +쀿 +쀿 + +쁀 +쁀 +쁀 +쁀 +쁀 + +쁁 +쁁 +쁁 +쁁 +쁁 + +쁂 +쁂 +쁂 +쁂 +쁂 + +쁃 +쁃 +쁃 +쁃 +쁃 + +쁄 +쁄 +쁄 +쁄 +쁄 + +쁅 +쁅 +쁅 +쁅 +쁅 + +쁆 +쁆 +쁆 +쁆 +쁆 + +쁇 +쁇 +쁇 +쁇 +쁇 + +쁈 +쁈 +쁈 +쁈 +쁈 + +쁉 +쁉 +쁉 +쁉 +쁉 + +쁊 +쁊 +쁊 +쁊 +쁊 + +쁋 +쁋 +쁋 +쁋 +쁋 + +쁌 +쁌 +쁌 +쁌 +쁌 + +쁍 +쁍 +쁍 +쁍 +쁍 + +쁎 +쁎 +쁎 +쁎 +쁎 + +쁏 +쁏 +쁏 +쁏 +쁏 + +쁐 +쁐 +쁐 +쁐 +쁐 + +쁑 +쁑 +쁑 +쁑 +쁑 + +쁒 +쁒 +쁒 +쁒 +쁒 + +쁓 +쁓 +쁓 +쁓 +쁓 + +쁔 +쁔 +쁔 +쁔 +쁔 + +쁕 +쁕 +쁕 +쁕 +쁕 + +쁖 +쁖 +쁖 +쁖 +쁖 + +쁗 +쁗 +쁗 +쁗 +쁗 + +쁘 +쁘 +쁘 +쁘 +쁘 + +쁙 +쁙 +쁙 +쁙 +쁙 + +쁚 +쁚 +쁚 +쁚 +쁚 + +쁛 +쁛 +쁛 +쁛 +쁛 + +쁜 +쁜 +쁜 +쁜 +쁜 + +쁝 +쁝 +쁝 +쁝 +쁝 + +쁞 +쁞 +쁞 +쁞 +쁞 + +쁟 +쁟 +쁟 +쁟 +쁟 + +쁠 +쁠 +쁠 +쁠 +쁠 + +쁡 +쁡 +쁡 +쁡 +쁡 + +쁢 +쁢 +쁢 +쁢 +쁢 + +쁣 +쁣 +쁣 +쁣 +쁣 + +쁤 +쁤 +쁤 +쁤 +쁤 + +쁥 +쁥 +쁥 +쁥 +쁥 + +쁦 +쁦 +쁦 +쁦 +쁦 + +쁧 +쁧 +쁧 +쁧 +쁧 + +쁨 +쁨 +쁨 +쁨 +쁨 + +쁩 +쁩 +쁩 +쁩 +쁩 + +쁪 +쁪 +쁪 +쁪 +쁪 + +쁫 +쁫 +쁫 +쁫 +쁫 + +쁬 +쁬 +쁬 +쁬 +쁬 + +쁭 +쁭 +쁭 +쁭 +쁭 + +쁮 +쁮 +쁮 +쁮 +쁮 + +쁯 +쁯 +쁯 +쁯 +쁯 + +쁰 +쁰 +쁰 +쁰 +쁰 + +쁱 +쁱 +쁱 +쁱 +쁱 + +쁲 +쁲 +쁲 +쁲 +쁲 + +쁳 +쁳 +쁳 +쁳 +쁳 + +쁴 +쁴 +쁴 +쁴 +쁴 + +쁵 +쁵 +쁵 +쁵 +쁵 + +쁶 +쁶 +쁶 +쁶 +쁶 + +쁷 +쁷 +쁷 +쁷 +쁷 + +쁸 +쁸 +쁸 +쁸 +쁸 + +쁹 +쁹 +쁹 +쁹 +쁹 + +쁺 +쁺 +쁺 +쁺 +쁺 + +쁻 +쁻 +쁻 +쁻 +쁻 + +쁼 +쁼 +쁼 +쁼 +쁼 + +쁽 +쁽 +쁽 +쁽 +쁽 + +쁾 +쁾 +쁾 +쁾 +쁾 + +쁿 +쁿 +쁿 +쁿 +쁿 + +삀 +삀 +삀 +삀 +삀 + +삁 +삁 +삁 +삁 +삁 + +삂 +삂 +삂 +삂 +삂 + +삃 +삃 +삃 +삃 +삃 + +삄 +삄 +삄 +삄 +삄 + +삅 +삅 +삅 +삅 +삅 + +삆 +삆 +삆 +삆 +삆 + +삇 +삇 +삇 +삇 +삇 + +삈 +삈 +삈 +삈 +삈 + +삉 +삉 +삉 +삉 +삉 + +삊 +삊 +삊 +삊 +삊 + +삋 +삋 +삋 +삋 +삋 + +삌 +삌 +삌 +삌 +삌 + +삍 +삍 +삍 +삍 +삍 + +삎 +삎 +삎 +삎 +삎 + +삏 +삏 +삏 +삏 +삏 + +삐 +삐 +삐 +삐 +삐 + +삑 +삑 +삑 +삑 +삑 + +삒 +삒 +삒 +삒 +삒 + +삓 +삓 +삓 +삓 +삓 + +삔 +삔 +삔 +삔 +삔 + +삕 +삕 +삕 +삕 +삕 + +삖 +삖 +삖 +삖 +삖 + +삗 +삗 +삗 +삗 +삗 + +삘 +삘 +삘 +삘 +삘 + +삙 +삙 +삙 +삙 +삙 + +삚 +삚 +삚 +삚 +삚 + +삛 +삛 +삛 +삛 +삛 + +삜 +삜 +삜 +삜 +삜 + +삝 +삝 +삝 +삝 +삝 + +삞 +삞 +삞 +삞 +삞 + +삟 +삟 +삟 +삟 +삟 + +삠 +삠 +삠 +삠 +삠 + +삡 +삡 +삡 +삡 +삡 + +삢 +삢 +삢 +삢 +삢 + +삣 +삣 +삣 +삣 +삣 + +삤 +삤 +삤 +삤 +삤 + +삥 +삥 +삥 +삥 +삥 + +삦 +삦 +삦 +삦 +삦 + +삧 +삧 +삧 +삧 +삧 + +삨 +삨 +삨 +삨 +삨 + +삩 +삩 +삩 +삩 +삩 + +삪 +삪 +삪 +삪 +삪 + +삫 +삫 +삫 +삫 +삫 + +사 +사 +사 +사 +사 + +삭 +삭 +삭 +삭 +삭 + +삮 +삮 +삮 +삮 +삮 + +삯 +삯 +삯 +삯 +삯 + +산 +산 +산 +산 +산 + +삱 +삱 +삱 +삱 +삱 + +삲 +삲 +삲 +삲 +삲 + +삳 +삳 +삳 +삳 +삳 + +살 +살 +살 +살 +살 + +삵 +삵 +삵 +삵 +삵 + +삶 +삶 +삶 +삶 +삶 + +삷 +삷 +삷 +삷 +삷 + +삸 +삸 +삸 +삸 +삸 + +삹 +삹 +삹 +삹 +삹 + +삺 +삺 +삺 +삺 +삺 + +삻 +삻 +삻 +삻 +삻 + +삼 +삼 +삼 +삼 +삼 + +삽 +삽 +삽 +삽 +삽 + +삾 +삾 +삾 +삾 +삾 + +삿 +삿 +삿 +삿 +삿 + +샀 +샀 +샀 +샀 +샀 + +상 +상 +상 +상 +상 + +샂 +샂 +샂 +샂 +샂 + +샃 +샃 +샃 +샃 +샃 + +샄 +샄 +샄 +샄 +샄 + +샅 +샅 +샅 +샅 +샅 + +샆 +샆 +샆 +샆 +샆 + +샇 +샇 +샇 +샇 +샇 + +새 +새 +새 +새 +새 + +색 +색 +색 +색 +색 + +샊 +샊 +샊 +샊 +샊 + +샋 +샋 +샋 +샋 +샋 + +샌 +샌 +샌 +샌 +샌 + +샍 +샍 +샍 +샍 +샍 + +샎 +샎 +샎 +샎 +샎 + +샏 +샏 +샏 +샏 +샏 + +샐 +샐 +샐 +샐 +샐 + +샑 +샑 +샑 +샑 +샑 + +샒 +샒 +샒 +샒 +샒 + +샓 +샓 +샓 +샓 +샓 + +샔 +샔 +샔 +샔 +샔 + +샕 +샕 +샕 +샕 +샕 + +샖 +샖 +샖 +샖 +샖 + +샗 +샗 +샗 +샗 +샗 + +샘 +샘 +샘 +샘 +샘 + +샙 +샙 +샙 +샙 +샙 + +샚 +샚 +샚 +샚 +샚 + +샛 +샛 +샛 +샛 +샛 + +샜 +샜 +샜 +샜 +샜 + +생 +생 +생 +생 +생 + +샞 +샞 +샞 +샞 +샞 + +샟 +샟 +샟 +샟 +샟 + +샠 +샠 +샠 +샠 +샠 + +샡 +샡 +샡 +샡 +샡 + +샢 +샢 +샢 +샢 +샢 + +샣 +샣 +샣 +샣 +샣 + +샤 +샤 +샤 +샤 +샤 + +샥 +샥 +샥 +샥 +샥 + +샦 +샦 +샦 +샦 +샦 + +샧 +샧 +샧 +샧 +샧 + +샨 +샨 +샨 +샨 +샨 + +샩 +샩 +샩 +샩 +샩 + +샪 +샪 +샪 +샪 +샪 + +샫 +샫 +샫 +샫 +샫 + +샬 +샬 +샬 +샬 +샬 + +샭 +샭 +샭 +샭 +샭 + +샮 +샮 +샮 +샮 +샮 + +샯 +샯 +샯 +샯 +샯 + +샰 +샰 +샰 +샰 +샰 + +샱 +샱 +샱 +샱 +샱 + +샲 +샲 +샲 +샲 +샲 + +샳 +샳 +샳 +샳 +샳 + +샴 +샴 +샴 +샴 +샴 + +샵 +샵 +샵 +샵 +샵 + +샶 +샶 +샶 +샶 +샶 + +샷 +샷 +샷 +샷 +샷 + +샸 +샸 +샸 +샸 +샸 + +샹 +샹 +샹 +샹 +샹 + +샺 +샺 +샺 +샺 +샺 + +샻 +샻 +샻 +샻 +샻 + +샼 +샼 +샼 +샼 +샼 + +샽 +샽 +샽 +샽 +샽 + +샾 +샾 +샾 +샾 +샾 + +샿 +샿 +샿 +샿 +샿 + +섀 +섀 +섀 +섀 +섀 + +섁 +섁 +섁 +섁 +섁 + +섂 +섂 +섂 +섂 +섂 + +섃 +섃 +섃 +섃 +섃 + +섄 +섄 +섄 +섄 +섄 + +섅 +섅 +섅 +섅 +섅 + +섆 +섆 +섆 +섆 +섆 + +섇 +섇 +섇 +섇 +섇 + +섈 +섈 +섈 +섈 +섈 + +섉 +섉 +섉 +섉 +섉 + +섊 +섊 +섊 +섊 +섊 + +섋 +섋 +섋 +섋 +섋 + +섌 +섌 +섌 +섌 +섌 + +섍 +섍 +섍 +섍 +섍 + +섎 +섎 +섎 +섎 +섎 + +섏 +섏 +섏 +섏 +섏 + +섐 +섐 +섐 +섐 +섐 + +섑 +섑 +섑 +섑 +섑 + +섒 +섒 +섒 +섒 +섒 + +섓 +섓 +섓 +섓 +섓 + +섔 +섔 +섔 +섔 +섔 + +섕 +섕 +섕 +섕 +섕 + +섖 +섖 +섖 +섖 +섖 + +섗 +섗 +섗 +섗 +섗 + +섘 +섘 +섘 +섘 +섘 + +섙 +섙 +섙 +섙 +섙 + +섚 +섚 +섚 +섚 +섚 + +섛 +섛 +섛 +섛 +섛 + +서 +서 +서 +서 +서 + +석 +석 +석 +석 +석 + +섞 +섞 +섞 +섞 +섞 + +섟 +섟 +섟 +섟 +섟 + +선 +선 +선 +선 +선 + +섡 +섡 +섡 +섡 +섡 + +섢 +섢 +섢 +섢 +섢 + +섣 +섣 +섣 +섣 +섣 + +설 +설 +설 +설 +설 + +섥 +섥 +섥 +섥 +섥 + +섦 +섦 +섦 +섦 +섦 + +섧 +섧 +섧 +섧 +섧 + +섨 +섨 +섨 +섨 +섨 + +섩 +섩 +섩 +섩 +섩 + +섪 +섪 +섪 +섪 +섪 + +섫 +섫 +섫 +섫 +섫 + +섬 +섬 +섬 +섬 +섬 + +섭 +섭 +섭 +섭 +섭 + +섮 +섮 +섮 +섮 +섮 + +섯 +섯 +섯 +섯 +섯 + +섰 +섰 +섰 +섰 +섰 + +성 +성 +성 +성 +성 + +섲 +섲 +섲 +섲 +섲 + +섳 +섳 +섳 +섳 +섳 + +섴 +섴 +섴 +섴 +섴 + +섵 +섵 +섵 +섵 +섵 + +섶 +섶 +섶 +섶 +섶 + +섷 +섷 +섷 +섷 +섷 + +세 +세 +세 +세 +세 + +섹 +섹 +섹 +섹 +섹 + +섺 +섺 +섺 +섺 +섺 + +섻 +섻 +섻 +섻 +섻 + +센 +센 +센 +센 +센 + +섽 +섽 +섽 +섽 +섽 + +섾 +섾 +섾 +섾 +섾 + +섿 +섿 +섿 +섿 +섿 + +셀 +셀 +셀 +셀 +셀 + +셁 +셁 +셁 +셁 +셁 + +셂 +셂 +셂 +셂 +셂 + +셃 +셃 +셃 +셃 +셃 + +셄 +셄 +셄 +셄 +셄 + +셅 +셅 +셅 +셅 +셅 + +셆 +셆 +셆 +셆 +셆 + +셇 +셇 +셇 +셇 +셇 + +셈 +셈 +셈 +셈 +셈 + +셉 +셉 +셉 +셉 +셉 + +셊 +셊 +셊 +셊 +셊 + +셋 +셋 +셋 +셋 +셋 + +셌 +셌 +셌 +셌 +셌 + +셍 +셍 +셍 +셍 +셍 + +셎 +셎 +셎 +셎 +셎 + +셏 +셏 +셏 +셏 +셏 + +셐 +셐 +셐 +셐 +셐 + +셑 +셑 +셑 +셑 +셑 + +셒 +셒 +셒 +셒 +셒 + +셓 +셓 +셓 +셓 +셓 + +셔 +셔 +셔 +셔 +셔 + +셕 +셕 +셕 +셕 +셕 + +셖 +셖 +셖 +셖 +셖 + +셗 +셗 +셗 +셗 +셗 + +션 +션 +션 +션 +션 + +셙 +셙 +셙 +셙 +셙 + +셚 +셚 +셚 +셚 +셚 + +셛 +셛 +셛 +셛 +셛 + +셜 +셜 +셜 +셜 +셜 + +셝 +셝 +셝 +셝 +셝 + +셞 +셞 +셞 +셞 +셞 + +셟 +셟 +셟 +셟 +셟 + +셠 +셠 +셠 +셠 +셠 + +셡 +셡 +셡 +셡 +셡 + +셢 +셢 +셢 +셢 +셢 + +셣 +셣 +셣 +셣 +셣 + +셤 +셤 +셤 +셤 +셤 + +셥 +셥 +셥 +셥 +셥 + +셦 +셦 +셦 +셦 +셦 + +셧 +셧 +셧 +셧 +셧 + +셨 +셨 +셨 +셨 +셨 + +셩 +셩 +셩 +셩 +셩 + +셪 +셪 +셪 +셪 +셪 + +셫 +셫 +셫 +셫 +셫 + +셬 +셬 +셬 +셬 +셬 + +셭 +셭 +셭 +셭 +셭 + +셮 +셮 +셮 +셮 +셮 + +셯 +셯 +셯 +셯 +셯 + +셰 +셰 +셰 +셰 +셰 + +셱 +셱 +셱 +셱 +셱 + +셲 +셲 +셲 +셲 +셲 + +셳 +셳 +셳 +셳 +셳 + +셴 +셴 +셴 +셴 +셴 + +셵 +셵 +셵 +셵 +셵 + +셶 +셶 +셶 +셶 +셶 + +셷 +셷 +셷 +셷 +셷 + +셸 +셸 +셸 +셸 +셸 + +셹 +셹 +셹 +셹 +셹 + +셺 +셺 +셺 +셺 +셺 + +셻 +셻 +셻 +셻 +셻 + +셼 +셼 +셼 +셼 +셼 + +셽 +셽 +셽 +셽 +셽 + +셾 +셾 +셾 +셾 +셾 + +셿 +셿 +셿 +셿 +셿 + +솀 +솀 +솀 +솀 +솀 + +솁 +솁 +솁 +솁 +솁 + +솂 +솂 +솂 +솂 +솂 + +솃 +솃 +솃 +솃 +솃 + +솄 +솄 +솄 +솄 +솄 + +솅 +솅 +솅 +솅 +솅 + +솆 +솆 +솆 +솆 +솆 + +솇 +솇 +솇 +솇 +솇 + +솈 +솈 +솈 +솈 +솈 + +솉 +솉 +솉 +솉 +솉 + +솊 +솊 +솊 +솊 +솊 + +솋 +솋 +솋 +솋 +솋 + +소 +소 +소 +소 +소 + +속 +속 +속 +속 +속 + +솎 +솎 +솎 +솎 +솎 + +솏 +솏 +솏 +솏 +솏 + +손 +손 +손 +손 +손 + +솑 +솑 +솑 +솑 +솑 + +솒 +솒 +솒 +솒 +솒 + +솓 +솓 +솓 +솓 +솓 + +솔 +솔 +솔 +솔 +솔 + +솕 +솕 +솕 +솕 +솕 + +솖 +솖 +솖 +솖 +솖 + +솗 +솗 +솗 +솗 +솗 + +솘 +솘 +솘 +솘 +솘 + +솙 +솙 +솙 +솙 +솙 + +솚 +솚 +솚 +솚 +솚 + +솛 +솛 +솛 +솛 +솛 + +솜 +솜 +솜 +솜 +솜 + +솝 +솝 +솝 +솝 +솝 + +솞 +솞 +솞 +솞 +솞 + +솟 +솟 +솟 +솟 +솟 + +솠 +솠 +솠 +솠 +솠 + +송 +송 +송 +송 +송 + +솢 +솢 +솢 +솢 +솢 + +솣 +솣 +솣 +솣 +솣 + +솤 +솤 +솤 +솤 +솤 + +솥 +솥 +솥 +솥 +솥 + +솦 +솦 +솦 +솦 +솦 + +솧 +솧 +솧 +솧 +솧 + +솨 +솨 +솨 +솨 +솨 + +솩 +솩 +솩 +솩 +솩 + +솪 +솪 +솪 +솪 +솪 + +솫 +솫 +솫 +솫 +솫 + +솬 +솬 +솬 +솬 +솬 + +솭 +솭 +솭 +솭 +솭 + +솮 +솮 +솮 +솮 +솮 + +솯 +솯 +솯 +솯 +솯 + +솰 +솰 +솰 +솰 +솰 + +솱 +솱 +솱 +솱 +솱 + +솲 +솲 +솲 +솲 +솲 + +솳 +솳 +솳 +솳 +솳 + +솴 +솴 +솴 +솴 +솴 + +솵 +솵 +솵 +솵 +솵 + +솶 +솶 +솶 +솶 +솶 + +솷 +솷 +솷 +솷 +솷 + +솸 +솸 +솸 +솸 +솸 + +솹 +솹 +솹 +솹 +솹 + +솺 +솺 +솺 +솺 +솺 + +솻 +솻 +솻 +솻 +솻 + +솼 +솼 +솼 +솼 +솼 + +솽 +솽 +솽 +솽 +솽 + +솾 +솾 +솾 +솾 +솾 + +솿 +솿 +솿 +솿 +솿 + +쇀 +쇀 +쇀 +쇀 +쇀 + +쇁 +쇁 +쇁 +쇁 +쇁 + +쇂 +쇂 +쇂 +쇂 +쇂 + +쇃 +쇃 +쇃 +쇃 +쇃 + +쇄 +쇄 +쇄 +쇄 +쇄 + +쇅 +쇅 +쇅 +쇅 +쇅 + +쇆 +쇆 +쇆 +쇆 +쇆 + +쇇 +쇇 +쇇 +쇇 +쇇 + +쇈 +쇈 +쇈 +쇈 +쇈 + +쇉 +쇉 +쇉 +쇉 +쇉 + +쇊 +쇊 +쇊 +쇊 +쇊 + +쇋 +쇋 +쇋 +쇋 +쇋 + +쇌 +쇌 +쇌 +쇌 +쇌 + +쇍 +쇍 +쇍 +쇍 +쇍 + +쇎 +쇎 +쇎 +쇎 +쇎 + +쇏 +쇏 +쇏 +쇏 +쇏 + +쇐 +쇐 +쇐 +쇐 +쇐 + +쇑 +쇑 +쇑 +쇑 +쇑 + +쇒 +쇒 +쇒 +쇒 +쇒 + +쇓 +쇓 +쇓 +쇓 +쇓 + +쇔 +쇔 +쇔 +쇔 +쇔 + +쇕 +쇕 +쇕 +쇕 +쇕 + +쇖 +쇖 +쇖 +쇖 +쇖 + +쇗 +쇗 +쇗 +쇗 +쇗 + +쇘 +쇘 +쇘 +쇘 +쇘 + +쇙 +쇙 +쇙 +쇙 +쇙 + +쇚 +쇚 +쇚 +쇚 +쇚 + +쇛 +쇛 +쇛 +쇛 +쇛 + +쇜 +쇜 +쇜 +쇜 +쇜 + +쇝 +쇝 +쇝 +쇝 +쇝 + +쇞 +쇞 +쇞 +쇞 +쇞 + +쇟 +쇟 +쇟 +쇟 +쇟 + +쇠 +쇠 +쇠 +쇠 +쇠 + +쇡 +쇡 +쇡 +쇡 +쇡 + +쇢 +쇢 +쇢 +쇢 +쇢 + +쇣 +쇣 +쇣 +쇣 +쇣 + +쇤 +쇤 +쇤 +쇤 +쇤 + +쇥 +쇥 +쇥 +쇥 +쇥 + +쇦 +쇦 +쇦 +쇦 +쇦 + +쇧 +쇧 +쇧 +쇧 +쇧 + +쇨 +쇨 +쇨 +쇨 +쇨 + +쇩 +쇩 +쇩 +쇩 +쇩 + +쇪 +쇪 +쇪 +쇪 +쇪 + +쇫 +쇫 +쇫 +쇫 +쇫 + +쇬 +쇬 +쇬 +쇬 +쇬 + +쇭 +쇭 +쇭 +쇭 +쇭 + +쇮 +쇮 +쇮 +쇮 +쇮 + +쇯 +쇯 +쇯 +쇯 +쇯 + +쇰 +쇰 +쇰 +쇰 +쇰 + +쇱 +쇱 +쇱 +쇱 +쇱 + +쇲 +쇲 +쇲 +쇲 +쇲 + +쇳 +쇳 +쇳 +쇳 +쇳 + +쇴 +쇴 +쇴 +쇴 +쇴 + +쇵 +쇵 +쇵 +쇵 +쇵 + +쇶 +쇶 +쇶 +쇶 +쇶 + +쇷 +쇷 +쇷 +쇷 +쇷 + +쇸 +쇸 +쇸 +쇸 +쇸 + +쇹 +쇹 +쇹 +쇹 +쇹 + +쇺 +쇺 +쇺 +쇺 +쇺 + +쇻 +쇻 +쇻 +쇻 +쇻 + +쇼 +쇼 +쇼 +쇼 +쇼 + +쇽 +쇽 +쇽 +쇽 +쇽 + +쇾 +쇾 +쇾 +쇾 +쇾 + +쇿 +쇿 +쇿 +쇿 +쇿 + +숀 +숀 +숀 +숀 +숀 + +숁 +숁 +숁 +숁 +숁 + +숂 +숂 +숂 +숂 +숂 + +숃 +숃 +숃 +숃 +숃 + +숄 +숄 +숄 +숄 +숄 + +숅 +숅 +숅 +숅 +숅 + +숆 +숆 +숆 +숆 +숆 + +숇 +숇 +숇 +숇 +숇 + +숈 +숈 +숈 +숈 +숈 + +숉 +숉 +숉 +숉 +숉 + +숊 +숊 +숊 +숊 +숊 + +숋 +숋 +숋 +숋 +숋 + +숌 +숌 +숌 +숌 +숌 + +숍 +숍 +숍 +숍 +숍 + +숎 +숎 +숎 +숎 +숎 + +숏 +숏 +숏 +숏 +숏 + +숐 +숐 +숐 +숐 +숐 + +숑 +숑 +숑 +숑 +숑 + +숒 +숒 +숒 +숒 +숒 + +숓 +숓 +숓 +숓 +숓 + +숔 +숔 +숔 +숔 +숔 + +숕 +숕 +숕 +숕 +숕 + +숖 +숖 +숖 +숖 +숖 + +숗 +숗 +숗 +숗 +숗 + +수 +수 +수 +수 +수 + +숙 +숙 +숙 +숙 +숙 + +숚 +숚 +숚 +숚 +숚 + +숛 +숛 +숛 +숛 +숛 + +순 +순 +순 +순 +순 + +숝 +숝 +숝 +숝 +숝 + +숞 +숞 +숞 +숞 +숞 + +숟 +숟 +숟 +숟 +숟 + +술 +술 +술 +술 +술 + +숡 +숡 +숡 +숡 +숡 + +숢 +숢 +숢 +숢 +숢 + +숣 +숣 +숣 +숣 +숣 + +숤 +숤 +숤 +숤 +숤 + +숥 +숥 +숥 +숥 +숥 + +숦 +숦 +숦 +숦 +숦 + +숧 +숧 +숧 +숧 +숧 + +숨 +숨 +숨 +숨 +숨 + +숩 +숩 +숩 +숩 +숩 + +숪 +숪 +숪 +숪 +숪 + +숫 +숫 +숫 +숫 +숫 + +숬 +숬 +숬 +숬 +숬 + +숭 +숭 +숭 +숭 +숭 + +숮 +숮 +숮 +숮 +숮 + +숯 +숯 +숯 +숯 +숯 + +숰 +숰 +숰 +숰 +숰 + +숱 +숱 +숱 +숱 +숱 + +숲 +숲 +숲 +숲 +숲 + +숳 +숳 +숳 +숳 +숳 + +숴 +숴 +숴 +숴 +숴 + +숵 +숵 +숵 +숵 +숵 + +숶 +숶 +숶 +숶 +숶 + +숷 +숷 +숷 +숷 +숷 + +숸 +숸 +숸 +숸 +숸 + +숹 +숹 +숹 +숹 +숹 + +숺 +숺 +숺 +숺 +숺 + +숻 +숻 +숻 +숻 +숻 + +숼 +숼 +숼 +숼 +숼 + +숽 +숽 +숽 +숽 +숽 + +숾 +숾 +숾 +숾 +숾 + +숿 +숿 +숿 +숿 +숿 + +쉀 +쉀 +쉀 +쉀 +쉀 + +쉁 +쉁 +쉁 +쉁 +쉁 + +쉂 +쉂 +쉂 +쉂 +쉂 + +쉃 +쉃 +쉃 +쉃 +쉃 + +쉄 +쉄 +쉄 +쉄 +쉄 + +쉅 +쉅 +쉅 +쉅 +쉅 + +쉆 +쉆 +쉆 +쉆 +쉆 + +쉇 +쉇 +쉇 +쉇 +쉇 + +쉈 +쉈 +쉈 +쉈 +쉈 + +쉉 +쉉 +쉉 +쉉 +쉉 + +쉊 +쉊 +쉊 +쉊 +쉊 + +쉋 +쉋 +쉋 +쉋 +쉋 + +쉌 +쉌 +쉌 +쉌 +쉌 + +쉍 +쉍 +쉍 +쉍 +쉍 + +쉎 +쉎 +쉎 +쉎 +쉎 + +쉏 +쉏 +쉏 +쉏 +쉏 + +쉐 +쉐 +쉐 +쉐 +쉐 + +쉑 +쉑 +쉑 +쉑 +쉑 + +쉒 +쉒 +쉒 +쉒 +쉒 + +쉓 +쉓 +쉓 +쉓 +쉓 + +쉔 +쉔 +쉔 +쉔 +쉔 + +쉕 +쉕 +쉕 +쉕 +쉕 + +쉖 +쉖 +쉖 +쉖 +쉖 + +쉗 +쉗 +쉗 +쉗 +쉗 + +쉘 +쉘 +쉘 +쉘 +쉘 + +쉙 +쉙 +쉙 +쉙 +쉙 + +쉚 +쉚 +쉚 +쉚 +쉚 + +쉛 +쉛 +쉛 +쉛 +쉛 + +쉜 +쉜 +쉜 +쉜 +쉜 + +쉝 +쉝 +쉝 +쉝 +쉝 + +쉞 +쉞 +쉞 +쉞 +쉞 + +쉟 +쉟 +쉟 +쉟 +쉟 + +쉠 +쉠 +쉠 +쉠 +쉠 + +쉡 +쉡 +쉡 +쉡 +쉡 + +쉢 +쉢 +쉢 +쉢 +쉢 + +쉣 +쉣 +쉣 +쉣 +쉣 + +쉤 +쉤 +쉤 +쉤 +쉤 + +쉥 +쉥 +쉥 +쉥 +쉥 + +쉦 +쉦 +쉦 +쉦 +쉦 + +쉧 +쉧 +쉧 +쉧 +쉧 + +쉨 +쉨 +쉨 +쉨 +쉨 + +쉩 +쉩 +쉩 +쉩 +쉩 + +쉪 +쉪 +쉪 +쉪 +쉪 + +쉫 +쉫 +쉫 +쉫 +쉫 + +쉬 +쉬 +쉬 +쉬 +쉬 + +쉭 +쉭 +쉭 +쉭 +쉭 + +쉮 +쉮 +쉮 +쉮 +쉮 + +쉯 +쉯 +쉯 +쉯 +쉯 + +쉰 +쉰 +쉰 +쉰 +쉰 + +쉱 +쉱 +쉱 +쉱 +쉱 + +쉲 +쉲 +쉲 +쉲 +쉲 + +쉳 +쉳 +쉳 +쉳 +쉳 + +쉴 +쉴 +쉴 +쉴 +쉴 + +쉵 +쉵 +쉵 +쉵 +쉵 + +쉶 +쉶 +쉶 +쉶 +쉶 + +쉷 +쉷 +쉷 +쉷 +쉷 + +쉸 +쉸 +쉸 +쉸 +쉸 + +쉹 +쉹 +쉹 +쉹 +쉹 + +쉺 +쉺 +쉺 +쉺 +쉺 + +쉻 +쉻 +쉻 +쉻 +쉻 + +쉼 +쉼 +쉼 +쉼 +쉼 + +쉽 +쉽 +쉽 +쉽 +쉽 + +쉾 +쉾 +쉾 +쉾 +쉾 + +쉿 +쉿 +쉿 +쉿 +쉿 + +슀 +슀 +슀 +슀 +슀 + +슁 +슁 +슁 +슁 +슁 + +슂 +슂 +슂 +슂 +슂 + +슃 +슃 +슃 +슃 +슃 + +슄 +슄 +슄 +슄 +슄 + +슅 +슅 +슅 +슅 +슅 + +슆 +슆 +슆 +슆 +슆 + +슇 +슇 +슇 +슇 +슇 + +슈 +슈 +슈 +슈 +슈 + +슉 +슉 +슉 +슉 +슉 + +슊 +슊 +슊 +슊 +슊 + +슋 +슋 +슋 +슋 +슋 + +슌 +슌 +슌 +슌 +슌 + +슍 +슍 +슍 +슍 +슍 + +슎 +슎 +슎 +슎 +슎 + +슏 +슏 +슏 +슏 +슏 + +슐 +슐 +슐 +슐 +슐 + +슑 +슑 +슑 +슑 +슑 + +슒 +슒 +슒 +슒 +슒 + +슓 +슓 +슓 +슓 +슓 + +슔 +슔 +슔 +슔 +슔 + +슕 +슕 +슕 +슕 +슕 + +슖 +슖 +슖 +슖 +슖 + +슗 +슗 +슗 +슗 +슗 + +슘 +슘 +슘 +슘 +슘 + +슙 +슙 +슙 +슙 +슙 + +슚 +슚 +슚 +슚 +슚 + +슛 +슛 +슛 +슛 +슛 + +슜 +슜 +슜 +슜 +슜 + +슝 +슝 +슝 +슝 +슝 + +슞 +슞 +슞 +슞 +슞 + +슟 +슟 +슟 +슟 +슟 + +슠 +슠 +슠 +슠 +슠 + +슡 +슡 +슡 +슡 +슡 + +슢 +슢 +슢 +슢 +슢 + +슣 +슣 +슣 +슣 +슣 + +스 +스 +스 +스 +스 + +슥 +슥 +슥 +슥 +슥 + +슦 +슦 +슦 +슦 +슦 + +슧 +슧 +슧 +슧 +슧 + +슨 +슨 +슨 +슨 +슨 + +슩 +슩 +슩 +슩 +슩 + +슪 +슪 +슪 +슪 +슪 + +슫 +슫 +슫 +슫 +슫 + +슬 +슬 +슬 +슬 +슬 + +슭 +슭 +슭 +슭 +슭 + +슮 +슮 +슮 +슮 +슮 + +슯 +슯 +슯 +슯 +슯 + +슰 +슰 +슰 +슰 +슰 + +슱 +슱 +슱 +슱 +슱 + +슲 +슲 +슲 +슲 +슲 + +슳 +슳 +슳 +슳 +슳 + +슴 +슴 +슴 +슴 +슴 + +습 +습 +습 +습 +습 + +슶 +슶 +슶 +슶 +슶 + +슷 +슷 +슷 +슷 +슷 + +슸 +슸 +슸 +슸 +슸 + +승 +승 +승 +승 +승 + +슺 +슺 +슺 +슺 +슺 + +슻 +슻 +슻 +슻 +슻 + +슼 +슼 +슼 +슼 +슼 + +슽 +슽 +슽 +슽 +슽 + +슾 +슾 +슾 +슾 +슾 + +슿 +슿 +슿 +슿 +슿 + +싀 +싀 +싀 +싀 +싀 + +싁 +싁 +싁 +싁 +싁 + +싂 +싂 +싂 +싂 +싂 + +싃 +싃 +싃 +싃 +싃 + +싄 +싄 +싄 +싄 +싄 + +싅 +싅 +싅 +싅 +싅 + +싆 +싆 +싆 +싆 +싆 + +싇 +싇 +싇 +싇 +싇 + +싈 +싈 +싈 +싈 +싈 + +싉 +싉 +싉 +싉 +싉 + +싊 +싊 +싊 +싊 +싊 + +싋 +싋 +싋 +싋 +싋 + +싌 +싌 +싌 +싌 +싌 + +싍 +싍 +싍 +싍 +싍 + +싎 +싎 +싎 +싎 +싎 + +싏 +싏 +싏 +싏 +싏 + +싐 +싐 +싐 +싐 +싐 + +싑 +싑 +싑 +싑 +싑 + +싒 +싒 +싒 +싒 +싒 + +싓 +싓 +싓 +싓 +싓 + +싔 +싔 +싔 +싔 +싔 + +싕 +싕 +싕 +싕 +싕 + +싖 +싖 +싖 +싖 +싖 + +싗 +싗 +싗 +싗 +싗 + +싘 +싘 +싘 +싘 +싘 + +싙 +싙 +싙 +싙 +싙 + +싚 +싚 +싚 +싚 +싚 + +싛 +싛 +싛 +싛 +싛 + +시 +시 +시 +시 +시 + +식 +식 +식 +식 +식 + +싞 +싞 +싞 +싞 +싞 + +싟 +싟 +싟 +싟 +싟 + +신 +신 +신 +신 +신 + +싡 +싡 +싡 +싡 +싡 + +싢 +싢 +싢 +싢 +싢 + +싣 +싣 +싣 +싣 +싣 + +실 +실 +실 +실 +실 + +싥 +싥 +싥 +싥 +싥 + +싦 +싦 +싦 +싦 +싦 + +싧 +싧 +싧 +싧 +싧 + +싨 +싨 +싨 +싨 +싨 + +싩 +싩 +싩 +싩 +싩 + +싪 +싪 +싪 +싪 +싪 + +싫 +싫 +싫 +싫 +싫 + +심 +심 +심 +심 +심 + +십 +십 +십 +십 +십 + +싮 +싮 +싮 +싮 +싮 + +싯 +싯 +싯 +싯 +싯 + +싰 +싰 +싰 +싰 +싰 + +싱 +싱 +싱 +싱 +싱 + +싲 +싲 +싲 +싲 +싲 + +싳 +싳 +싳 +싳 +싳 + +싴 +싴 +싴 +싴 +싴 + +싵 +싵 +싵 +싵 +싵 + +싶 +싶 +싶 +싶 +싶 + +싷 +싷 +싷 +싷 +싷 + +싸 +싸 +싸 +싸 +싸 + +싹 +싹 +싹 +싹 +싹 + +싺 +싺 +싺 +싺 +싺 + +싻 +싻 +싻 +싻 +싻 + +싼 +싼 +싼 +싼 +싼 + +싽 +싽 +싽 +싽 +싽 + +싾 +싾 +싾 +싾 +싾 + +싿 +싿 +싿 +싿 +싿 + +쌀 +쌀 +쌀 +쌀 +쌀 + +쌁 +쌁 +쌁 +쌁 +쌁 + +쌂 +쌂 +쌂 +쌂 +쌂 + +쌃 +쌃 +쌃 +쌃 +쌃 + +쌄 +쌄 +쌄 +쌄 +쌄 + +쌅 +쌅 +쌅 +쌅 +쌅 + +쌆 +쌆 +쌆 +쌆 +쌆 + +쌇 +쌇 +쌇 +쌇 +쌇 + +쌈 +쌈 +쌈 +쌈 +쌈 + +쌉 +쌉 +쌉 +쌉 +쌉 + +쌊 +쌊 +쌊 +쌊 +쌊 + +쌋 +쌋 +쌋 +쌋 +쌋 + +쌌 +쌌 +쌌 +쌌 +쌌 + +쌍 +쌍 +쌍 +쌍 +쌍 + +쌎 +쌎 +쌎 +쌎 +쌎 + +쌏 +쌏 +쌏 +쌏 +쌏 + +쌐 +쌐 +쌐 +쌐 +쌐 + +쌑 +쌑 +쌑 +쌑 +쌑 + +쌒 +쌒 +쌒 +쌒 +쌒 + +쌓 +쌓 +쌓 +쌓 +쌓 + +쌔 +쌔 +쌔 +쌔 +쌔 + +쌕 +쌕 +쌕 +쌕 +쌕 + +쌖 +쌖 +쌖 +쌖 +쌖 + +쌗 +쌗 +쌗 +쌗 +쌗 + +쌘 +쌘 +쌘 +쌘 +쌘 + +쌙 +쌙 +쌙 +쌙 +쌙 + +쌚 +쌚 +쌚 +쌚 +쌚 + +쌛 +쌛 +쌛 +쌛 +쌛 + +쌜 +쌜 +쌜 +쌜 +쌜 + +쌝 +쌝 +쌝 +쌝 +쌝 + +쌞 +쌞 +쌞 +쌞 +쌞 + +쌟 +쌟 +쌟 +쌟 +쌟 + +쌠 +쌠 +쌠 +쌠 +쌠 + +쌡 +쌡 +쌡 +쌡 +쌡 + +쌢 +쌢 +쌢 +쌢 +쌢 + +쌣 +쌣 +쌣 +쌣 +쌣 + +쌤 +쌤 +쌤 +쌤 +쌤 + +쌥 +쌥 +쌥 +쌥 +쌥 + +쌦 +쌦 +쌦 +쌦 +쌦 + +쌧 +쌧 +쌧 +쌧 +쌧 + +쌨 +쌨 +쌨 +쌨 +쌨 + +쌩 +쌩 +쌩 +쌩 +쌩 + +쌪 +쌪 +쌪 +쌪 +쌪 + +쌫 +쌫 +쌫 +쌫 +쌫 + +쌬 +쌬 +쌬 +쌬 +쌬 + +쌭 +쌭 +쌭 +쌭 +쌭 + +쌮 +쌮 +쌮 +쌮 +쌮 + +쌯 +쌯 +쌯 +쌯 +쌯 + +쌰 +쌰 +쌰 +쌰 +쌰 + +쌱 +쌱 +쌱 +쌱 +쌱 + +쌲 +쌲 +쌲 +쌲 +쌲 + +쌳 +쌳 +쌳 +쌳 +쌳 + +쌴 +쌴 +쌴 +쌴 +쌴 + +쌵 +쌵 +쌵 +쌵 +쌵 + +쌶 +쌶 +쌶 +쌶 +쌶 + +쌷 +쌷 +쌷 +쌷 +쌷 + +쌸 +쌸 +쌸 +쌸 +쌸 + +쌹 +쌹 +쌹 +쌹 +쌹 + +쌺 +쌺 +쌺 +쌺 +쌺 + +쌻 +쌻 +쌻 +쌻 +쌻 + +쌼 +쌼 +쌼 +쌼 +쌼 + +쌽 +쌽 +쌽 +쌽 +쌽 + +쌾 +쌾 +쌾 +쌾 +쌾 + +쌿 +쌿 +쌿 +쌿 +쌿 + +썀 +썀 +썀 +썀 +썀 + +썁 +썁 +썁 +썁 +썁 + +썂 +썂 +썂 +썂 +썂 + +썃 +썃 +썃 +썃 +썃 + +썄 +썄 +썄 +썄 +썄 + +썅 +썅 +썅 +썅 +썅 + +썆 +썆 +썆 +썆 +썆 + +썇 +썇 +썇 +썇 +썇 + +썈 +썈 +썈 +썈 +썈 + +썉 +썉 +썉 +썉 +썉 + +썊 +썊 +썊 +썊 +썊 + +썋 +썋 +썋 +썋 +썋 + +썌 +썌 +썌 +썌 +썌 + +썍 +썍 +썍 +썍 +썍 + +썎 +썎 +썎 +썎 +썎 + +썏 +썏 +썏 +썏 +썏 + +썐 +썐 +썐 +썐 +썐 + +썑 +썑 +썑 +썑 +썑 + +썒 +썒 +썒 +썒 +썒 + +썓 +썓 +썓 +썓 +썓 + +썔 +썔 +썔 +썔 +썔 + +썕 +썕 +썕 +썕 +썕 + +썖 +썖 +썖 +썖 +썖 + +썗 +썗 +썗 +썗 +썗 + +썘 +썘 +썘 +썘 +썘 + +썙 +썙 +썙 +썙 +썙 + +썚 +썚 +썚 +썚 +썚 + +썛 +썛 +썛 +썛 +썛 + +썜 +썜 +썜 +썜 +썜 + +썝 +썝 +썝 +썝 +썝 + +썞 +썞 +썞 +썞 +썞 + +썟 +썟 +썟 +썟 +썟 + +썠 +썠 +썠 +썠 +썠 + +썡 +썡 +썡 +썡 +썡 + +썢 +썢 +썢 +썢 +썢 + +썣 +썣 +썣 +썣 +썣 + +썤 +썤 +썤 +썤 +썤 + +썥 +썥 +썥 +썥 +썥 + +썦 +썦 +썦 +썦 +썦 + +썧 +썧 +썧 +썧 +썧 + +써 +써 +써 +써 +써 + +썩 +썩 +썩 +썩 +썩 + +썪 +썪 +썪 +썪 +썪 + +썫 +썫 +썫 +썫 +썫 + +썬 +썬 +썬 +썬 +썬 + +썭 +썭 +썭 +썭 +썭 + +썮 +썮 +썮 +썮 +썮 + +썯 +썯 +썯 +썯 +썯 + +썰 +썰 +썰 +썰 +썰 + +썱 +썱 +썱 +썱 +썱 + +썲 +썲 +썲 +썲 +썲 + +썳 +썳 +썳 +썳 +썳 + +썴 +썴 +썴 +썴 +썴 + +썵 +썵 +썵 +썵 +썵 + +썶 +썶 +썶 +썶 +썶 + +썷 +썷 +썷 +썷 +썷 + +썸 +썸 +썸 +썸 +썸 + +썹 +썹 +썹 +썹 +썹 + +썺 +썺 +썺 +썺 +썺 + +썻 +썻 +썻 +썻 +썻 + +썼 +썼 +썼 +썼 +썼 + +썽 +썽 +썽 +썽 +썽 + +썾 +썾 +썾 +썾 +썾 + +썿 +썿 +썿 +썿 +썿 + +쎀 +쎀 +쎀 +쎀 +쎀 + +쎁 +쎁 +쎁 +쎁 +쎁 + +쎂 +쎂 +쎂 +쎂 +쎂 + +쎃 +쎃 +쎃 +쎃 +쎃 + +쎄 +쎄 +쎄 +쎄 +쎄 + +쎅 +쎅 +쎅 +쎅 +쎅 + +쎆 +쎆 +쎆 +쎆 +쎆 + +쎇 +쎇 +쎇 +쎇 +쎇 + +쎈 +쎈 +쎈 +쎈 +쎈 + +쎉 +쎉 +쎉 +쎉 +쎉 + +쎊 +쎊 +쎊 +쎊 +쎊 + +쎋 +쎋 +쎋 +쎋 +쎋 + +쎌 +쎌 +쎌 +쎌 +쎌 + +쎍 +쎍 +쎍 +쎍 +쎍 + +쎎 +쎎 +쎎 +쎎 +쎎 + +쎏 +쎏 +쎏 +쎏 +쎏 + +쎐 +쎐 +쎐 +쎐 +쎐 + +쎑 +쎑 +쎑 +쎑 +쎑 + +쎒 +쎒 +쎒 +쎒 +쎒 + +쎓 +쎓 +쎓 +쎓 +쎓 + +쎔 +쎔 +쎔 +쎔 +쎔 + +쎕 +쎕 +쎕 +쎕 +쎕 + +쎖 +쎖 +쎖 +쎖 +쎖 + +쎗 +쎗 +쎗 +쎗 +쎗 + +쎘 +쎘 +쎘 +쎘 +쎘 + +쎙 +쎙 +쎙 +쎙 +쎙 + +쎚 +쎚 +쎚 +쎚 +쎚 + +쎛 +쎛 +쎛 +쎛 +쎛 + +쎜 +쎜 +쎜 +쎜 +쎜 + +쎝 +쎝 +쎝 +쎝 +쎝 + +쎞 +쎞 +쎞 +쎞 +쎞 + +쎟 +쎟 +쎟 +쎟 +쎟 + +쎠 +쎠 +쎠 +쎠 +쎠 + +쎡 +쎡 +쎡 +쎡 +쎡 + +쎢 +쎢 +쎢 +쎢 +쎢 + +쎣 +쎣 +쎣 +쎣 +쎣 + +쎤 +쎤 +쎤 +쎤 +쎤 + +쎥 +쎥 +쎥 +쎥 +쎥 + +쎦 +쎦 +쎦 +쎦 +쎦 + +쎧 +쎧 +쎧 +쎧 +쎧 + +쎨 +쎨 +쎨 +쎨 +쎨 + +쎩 +쎩 +쎩 +쎩 +쎩 + +쎪 +쎪 +쎪 +쎪 +쎪 + +쎫 +쎫 +쎫 +쎫 +쎫 + +쎬 +쎬 +쎬 +쎬 +쎬 + +쎭 +쎭 +쎭 +쎭 +쎭 + +쎮 +쎮 +쎮 +쎮 +쎮 + +쎯 +쎯 +쎯 +쎯 +쎯 + +쎰 +쎰 +쎰 +쎰 +쎰 + +쎱 +쎱 +쎱 +쎱 +쎱 + +쎲 +쎲 +쎲 +쎲 +쎲 + +쎳 +쎳 +쎳 +쎳 +쎳 + +쎴 +쎴 +쎴 +쎴 +쎴 + +쎵 +쎵 +쎵 +쎵 +쎵 + +쎶 +쎶 +쎶 +쎶 +쎶 + +쎷 +쎷 +쎷 +쎷 +쎷 + +쎸 +쎸 +쎸 +쎸 +쎸 + +쎹 +쎹 +쎹 +쎹 +쎹 + +쎺 +쎺 +쎺 +쎺 +쎺 + +쎻 +쎻 +쎻 +쎻 +쎻 + +쎼 +쎼 +쎼 +쎼 +쎼 + +쎽 +쎽 +쎽 +쎽 +쎽 + +쎾 +쎾 +쎾 +쎾 +쎾 + +쎿 +쎿 +쎿 +쎿 +쎿 + +쏀 +쏀 +쏀 +쏀 +쏀 + +쏁 +쏁 +쏁 +쏁 +쏁 + +쏂 +쏂 +쏂 +쏂 +쏂 + +쏃 +쏃 +쏃 +쏃 +쏃 + +쏄 +쏄 +쏄 +쏄 +쏄 + +쏅 +쏅 +쏅 +쏅 +쏅 + +쏆 +쏆 +쏆 +쏆 +쏆 + +쏇 +쏇 +쏇 +쏇 +쏇 + +쏈 +쏈 +쏈 +쏈 +쏈 + +쏉 +쏉 +쏉 +쏉 +쏉 + +쏊 +쏊 +쏊 +쏊 +쏊 + +쏋 +쏋 +쏋 +쏋 +쏋 + +쏌 +쏌 +쏌 +쏌 +쏌 + +쏍 +쏍 +쏍 +쏍 +쏍 + +쏎 +쏎 +쏎 +쏎 +쏎 + +쏏 +쏏 +쏏 +쏏 +쏏 + +쏐 +쏐 +쏐 +쏐 +쏐 + +쏑 +쏑 +쏑 +쏑 +쏑 + +쏒 +쏒 +쏒 +쏒 +쏒 + +쏓 +쏓 +쏓 +쏓 +쏓 + +쏔 +쏔 +쏔 +쏔 +쏔 + +쏕 +쏕 +쏕 +쏕 +쏕 + +쏖 +쏖 +쏖 +쏖 +쏖 + +쏗 +쏗 +쏗 +쏗 +쏗 + +쏘 +쏘 +쏘 +쏘 +쏘 + +쏙 +쏙 +쏙 +쏙 +쏙 + +쏚 +쏚 +쏚 +쏚 +쏚 + +쏛 +쏛 +쏛 +쏛 +쏛 + +쏜 +쏜 +쏜 +쏜 +쏜 + +쏝 +쏝 +쏝 +쏝 +쏝 + +쏞 +쏞 +쏞 +쏞 +쏞 + +쏟 +쏟 +쏟 +쏟 +쏟 + +쏠 +쏠 +쏠 +쏠 +쏠 + +쏡 +쏡 +쏡 +쏡 +쏡 + +쏢 +쏢 +쏢 +쏢 +쏢 + +쏣 +쏣 +쏣 +쏣 +쏣 + +쏤 +쏤 +쏤 +쏤 +쏤 + +쏥 +쏥 +쏥 +쏥 +쏥 + +쏦 +쏦 +쏦 +쏦 +쏦 + +쏧 +쏧 +쏧 +쏧 +쏧 + +쏨 +쏨 +쏨 +쏨 +쏨 + +쏩 +쏩 +쏩 +쏩 +쏩 + +쏪 +쏪 +쏪 +쏪 +쏪 + +쏫 +쏫 +쏫 +쏫 +쏫 + +쏬 +쏬 +쏬 +쏬 +쏬 + +쏭 +쏭 +쏭 +쏭 +쏭 + +쏮 +쏮 +쏮 +쏮 +쏮 + +쏯 +쏯 +쏯 +쏯 +쏯 + +쏰 +쏰 +쏰 +쏰 +쏰 + +쏱 +쏱 +쏱 +쏱 +쏱 + +쏲 +쏲 +쏲 +쏲 +쏲 + +쏳 +쏳 +쏳 +쏳 +쏳 + +쏴 +쏴 +쏴 +쏴 +쏴 + +쏵 +쏵 +쏵 +쏵 +쏵 + +쏶 +쏶 +쏶 +쏶 +쏶 + +쏷 +쏷 +쏷 +쏷 +쏷 + +쏸 +쏸 +쏸 +쏸 +쏸 + +쏹 +쏹 +쏹 +쏹 +쏹 + +쏺 +쏺 +쏺 +쏺 +쏺 + +쏻 +쏻 +쏻 +쏻 +쏻 + +쏼 +쏼 +쏼 +쏼 +쏼 + +쏽 +쏽 +쏽 +쏽 +쏽 + +쏾 +쏾 +쏾 +쏾 +쏾 + +쏿 +쏿 +쏿 +쏿 +쏿 + +쐀 +쐀 +쐀 +쐀 +쐀 + +쐁 +쐁 +쐁 +쐁 +쐁 + +쐂 +쐂 +쐂 +쐂 +쐂 + +쐃 +쐃 +쐃 +쐃 +쐃 + +쐄 +쐄 +쐄 +쐄 +쐄 + +쐅 +쐅 +쐅 +쐅 +쐅 + +쐆 +쐆 +쐆 +쐆 +쐆 + +쐇 +쐇 +쐇 +쐇 +쐇 + +쐈 +쐈 +쐈 +쐈 +쐈 + +쐉 +쐉 +쐉 +쐉 +쐉 + +쐊 +쐊 +쐊 +쐊 +쐊 + +쐋 +쐋 +쐋 +쐋 +쐋 + +쐌 +쐌 +쐌 +쐌 +쐌 + +쐍 +쐍 +쐍 +쐍 +쐍 + +쐎 +쐎 +쐎 +쐎 +쐎 + +쐏 +쐏 +쐏 +쐏 +쐏 + +쐐 +쐐 +쐐 +쐐 +쐐 + +쐑 +쐑 +쐑 +쐑 +쐑 + +쐒 +쐒 +쐒 +쐒 +쐒 + +쐓 +쐓 +쐓 +쐓 +쐓 + +쐔 +쐔 +쐔 +쐔 +쐔 + +쐕 +쐕 +쐕 +쐕 +쐕 + +쐖 +쐖 +쐖 +쐖 +쐖 + +쐗 +쐗 +쐗 +쐗 +쐗 + +쐘 +쐘 +쐘 +쐘 +쐘 + +쐙 +쐙 +쐙 +쐙 +쐙 + +쐚 +쐚 +쐚 +쐚 +쐚 + +쐛 +쐛 +쐛 +쐛 +쐛 + +쐜 +쐜 +쐜 +쐜 +쐜 + +쐝 +쐝 +쐝 +쐝 +쐝 + +쐞 +쐞 +쐞 +쐞 +쐞 + +쐟 +쐟 +쐟 +쐟 +쐟 + +쐠 +쐠 +쐠 +쐠 +쐠 + +쐡 +쐡 +쐡 +쐡 +쐡 + +쐢 +쐢 +쐢 +쐢 +쐢 + +쐣 +쐣 +쐣 +쐣 +쐣 + +쐤 +쐤 +쐤 +쐤 +쐤 + +쐥 +쐥 +쐥 +쐥 +쐥 + +쐦 +쐦 +쐦 +쐦 +쐦 + +쐧 +쐧 +쐧 +쐧 +쐧 + +쐨 +쐨 +쐨 +쐨 +쐨 + +쐩 +쐩 +쐩 +쐩 +쐩 + +쐪 +쐪 +쐪 +쐪 +쐪 + +쐫 +쐫 +쐫 +쐫 +쐫 + +쐬 +쐬 +쐬 +쐬 +쐬 + +쐭 +쐭 +쐭 +쐭 +쐭 + +쐮 +쐮 +쐮 +쐮 +쐮 + +쐯 +쐯 +쐯 +쐯 +쐯 + +쐰 +쐰 +쐰 +쐰 +쐰 + +쐱 +쐱 +쐱 +쐱 +쐱 + +쐲 +쐲 +쐲 +쐲 +쐲 + +쐳 +쐳 +쐳 +쐳 +쐳 + +쐴 +쐴 +쐴 +쐴 +쐴 + +쐵 +쐵 +쐵 +쐵 +쐵 + +쐶 +쐶 +쐶 +쐶 +쐶 + +쐷 +쐷 +쐷 +쐷 +쐷 + +쐸 +쐸 +쐸 +쐸 +쐸 + +쐹 +쐹 +쐹 +쐹 +쐹 + +쐺 +쐺 +쐺 +쐺 +쐺 + +쐻 +쐻 +쐻 +쐻 +쐻 + +쐼 +쐼 +쐼 +쐼 +쐼 + +쐽 +쐽 +쐽 +쐽 +쐽 + +쐾 +쐾 +쐾 +쐾 +쐾 + +쐿 +쐿 +쐿 +쐿 +쐿 + +쑀 +쑀 +쑀 +쑀 +쑀 + +쑁 +쑁 +쑁 +쑁 +쑁 + +쑂 +쑂 +쑂 +쑂 +쑂 + +쑃 +쑃 +쑃 +쑃 +쑃 + +쑄 +쑄 +쑄 +쑄 +쑄 + +쑅 +쑅 +쑅 +쑅 +쑅 + +쑆 +쑆 +쑆 +쑆 +쑆 + +쑇 +쑇 +쑇 +쑇 +쑇 + +쑈 +쑈 +쑈 +쑈 +쑈 + +쑉 +쑉 +쑉 +쑉 +쑉 + +쑊 +쑊 +쑊 +쑊 +쑊 + +쑋 +쑋 +쑋 +쑋 +쑋 + +쑌 +쑌 +쑌 +쑌 +쑌 + +쑍 +쑍 +쑍 +쑍 +쑍 + +쑎 +쑎 +쑎 +쑎 +쑎 + +쑏 +쑏 +쑏 +쑏 +쑏 + +쑐 +쑐 +쑐 +쑐 +쑐 + +쑑 +쑑 +쑑 +쑑 +쑑 + +쑒 +쑒 +쑒 +쑒 +쑒 + +쑓 +쑓 +쑓 +쑓 +쑓 + +쑔 +쑔 +쑔 +쑔 +쑔 + +쑕 +쑕 +쑕 +쑕 +쑕 + +쑖 +쑖 +쑖 +쑖 +쑖 + +쑗 +쑗 +쑗 +쑗 +쑗 + +쑘 +쑘 +쑘 +쑘 +쑘 + +쑙 +쑙 +쑙 +쑙 +쑙 + +쑚 +쑚 +쑚 +쑚 +쑚 + +쑛 +쑛 +쑛 +쑛 +쑛 + +쑜 +쑜 +쑜 +쑜 +쑜 + +쑝 +쑝 +쑝 +쑝 +쑝 + +쑞 +쑞 +쑞 +쑞 +쑞 + +쑟 +쑟 +쑟 +쑟 +쑟 + +쑠 +쑠 +쑠 +쑠 +쑠 + +쑡 +쑡 +쑡 +쑡 +쑡 + +쑢 +쑢 +쑢 +쑢 +쑢 + +쑣 +쑣 +쑣 +쑣 +쑣 + +쑤 +쑤 +쑤 +쑤 +쑤 + +쑥 +쑥 +쑥 +쑥 +쑥 + +쑦 +쑦 +쑦 +쑦 +쑦 + +쑧 +쑧 +쑧 +쑧 +쑧 + +쑨 +쑨 +쑨 +쑨 +쑨 + +쑩 +쑩 +쑩 +쑩 +쑩 + +쑪 +쑪 +쑪 +쑪 +쑪 + +쑫 +쑫 +쑫 +쑫 +쑫 + +쑬 +쑬 +쑬 +쑬 +쑬 + +쑭 +쑭 +쑭 +쑭 +쑭 + +쑮 +쑮 +쑮 +쑮 +쑮 + +쑯 +쑯 +쑯 +쑯 +쑯 + +쑰 +쑰 +쑰 +쑰 +쑰 + +쑱 +쑱 +쑱 +쑱 +쑱 + +쑲 +쑲 +쑲 +쑲 +쑲 + +쑳 +쑳 +쑳 +쑳 +쑳 + +쑴 +쑴 +쑴 +쑴 +쑴 + +쑵 +쑵 +쑵 +쑵 +쑵 + +쑶 +쑶 +쑶 +쑶 +쑶 + +쑷 +쑷 +쑷 +쑷 +쑷 + +쑸 +쑸 +쑸 +쑸 +쑸 + +쑹 +쑹 +쑹 +쑹 +쑹 + +쑺 +쑺 +쑺 +쑺 +쑺 + +쑻 +쑻 +쑻 +쑻 +쑻 + +쑼 +쑼 +쑼 +쑼 +쑼 + +쑽 +쑽 +쑽 +쑽 +쑽 + +쑾 +쑾 +쑾 +쑾 +쑾 + +쑿 +쑿 +쑿 +쑿 +쑿 + +쒀 +쒀 +쒀 +쒀 +쒀 + +쒁 +쒁 +쒁 +쒁 +쒁 + +쒂 +쒂 +쒂 +쒂 +쒂 + +쒃 +쒃 +쒃 +쒃 +쒃 + +쒄 +쒄 +쒄 +쒄 +쒄 + +쒅 +쒅 +쒅 +쒅 +쒅 + +쒆 +쒆 +쒆 +쒆 +쒆 + +쒇 +쒇 +쒇 +쒇 +쒇 + +쒈 +쒈 +쒈 +쒈 +쒈 + +쒉 +쒉 +쒉 +쒉 +쒉 + +쒊 +쒊 +쒊 +쒊 +쒊 + +쒋 +쒋 +쒋 +쒋 +쒋 + +쒌 +쒌 +쒌 +쒌 +쒌 + +쒍 +쒍 +쒍 +쒍 +쒍 + +쒎 +쒎 +쒎 +쒎 +쒎 + +쒏 +쒏 +쒏 +쒏 +쒏 + +쒐 +쒐 +쒐 +쒐 +쒐 + +쒑 +쒑 +쒑 +쒑 +쒑 + +쒒 +쒒 +쒒 +쒒 +쒒 + +쒓 +쒓 +쒓 +쒓 +쒓 + +쒔 +쒔 +쒔 +쒔 +쒔 + +쒕 +쒕 +쒕 +쒕 +쒕 + +쒖 +쒖 +쒖 +쒖 +쒖 + +쒗 +쒗 +쒗 +쒗 +쒗 + +쒘 +쒘 +쒘 +쒘 +쒘 + +쒙 +쒙 +쒙 +쒙 +쒙 + +쒚 +쒚 +쒚 +쒚 +쒚 + +쒛 +쒛 +쒛 +쒛 +쒛 + +쒜 +쒜 +쒜 +쒜 +쒜 + +쒝 +쒝 +쒝 +쒝 +쒝 + +쒞 +쒞 +쒞 +쒞 +쒞 + +쒟 +쒟 +쒟 +쒟 +쒟 + +쒠 +쒠 +쒠 +쒠 +쒠 + +쒡 +쒡 +쒡 +쒡 +쒡 + +쒢 +쒢 +쒢 +쒢 +쒢 + +쒣 +쒣 +쒣 +쒣 +쒣 + +쒤 +쒤 +쒤 +쒤 +쒤 + +쒥 +쒥 +쒥 +쒥 +쒥 + +쒦 +쒦 +쒦 +쒦 +쒦 + +쒧 +쒧 +쒧 +쒧 +쒧 + +쒨 +쒨 +쒨 +쒨 +쒨 + +쒩 +쒩 +쒩 +쒩 +쒩 + +쒪 +쒪 +쒪 +쒪 +쒪 + +쒫 +쒫 +쒫 +쒫 +쒫 + +쒬 +쒬 +쒬 +쒬 +쒬 + +쒭 +쒭 +쒭 +쒭 +쒭 + +쒮 +쒮 +쒮 +쒮 +쒮 + +쒯 +쒯 +쒯 +쒯 +쒯 + +쒰 +쒰 +쒰 +쒰 +쒰 + +쒱 +쒱 +쒱 +쒱 +쒱 + +쒲 +쒲 +쒲 +쒲 +쒲 + +쒳 +쒳 +쒳 +쒳 +쒳 + +쒴 +쒴 +쒴 +쒴 +쒴 + +쒵 +쒵 +쒵 +쒵 +쒵 + +쒶 +쒶 +쒶 +쒶 +쒶 + +쒷 +쒷 +쒷 +쒷 +쒷 + +쒸 +쒸 +쒸 +쒸 +쒸 + +쒹 +쒹 +쒹 +쒹 +쒹 + +쒺 +쒺 +쒺 +쒺 +쒺 + +쒻 +쒻 +쒻 +쒻 +쒻 + +쒼 +쒼 +쒼 +쒼 +쒼 + +쒽 +쒽 +쒽 +쒽 +쒽 + +쒾 +쒾 +쒾 +쒾 +쒾 + +쒿 +쒿 +쒿 +쒿 +쒿 + +쓀 +쓀 +쓀 +쓀 +쓀 + +쓁 +쓁 +쓁 +쓁 +쓁 + +쓂 +쓂 +쓂 +쓂 +쓂 + +쓃 +쓃 +쓃 +쓃 +쓃 + +쓄 +쓄 +쓄 +쓄 +쓄 + +쓅 +쓅 +쓅 +쓅 +쓅 + +쓆 +쓆 +쓆 +쓆 +쓆 + +쓇 +쓇 +쓇 +쓇 +쓇 + +쓈 +쓈 +쓈 +쓈 +쓈 + +쓉 +쓉 +쓉 +쓉 +쓉 + +쓊 +쓊 +쓊 +쓊 +쓊 + +쓋 +쓋 +쓋 +쓋 +쓋 + +쓌 +쓌 +쓌 +쓌 +쓌 + +쓍 +쓍 +쓍 +쓍 +쓍 + +쓎 +쓎 +쓎 +쓎 +쓎 + +쓏 +쓏 +쓏 +쓏 +쓏 + +쓐 +쓐 +쓐 +쓐 +쓐 + +쓑 +쓑 +쓑 +쓑 +쓑 + +쓒 +쓒 +쓒 +쓒 +쓒 + +쓓 +쓓 +쓓 +쓓 +쓓 + +쓔 +쓔 +쓔 +쓔 +쓔 + +쓕 +쓕 +쓕 +쓕 +쓕 + +쓖 +쓖 +쓖 +쓖 +쓖 + +쓗 +쓗 +쓗 +쓗 +쓗 + +쓘 +쓘 +쓘 +쓘 +쓘 + +쓙 +쓙 +쓙 +쓙 +쓙 + +쓚 +쓚 +쓚 +쓚 +쓚 + +쓛 +쓛 +쓛 +쓛 +쓛 + +쓜 +쓜 +쓜 +쓜 +쓜 + +쓝 +쓝 +쓝 +쓝 +쓝 + +쓞 +쓞 +쓞 +쓞 +쓞 + +쓟 +쓟 +쓟 +쓟 +쓟 + +쓠 +쓠 +쓠 +쓠 +쓠 + +쓡 +쓡 +쓡 +쓡 +쓡 + +쓢 +쓢 +쓢 +쓢 +쓢 + +쓣 +쓣 +쓣 +쓣 +쓣 + +쓤 +쓤 +쓤 +쓤 +쓤 + +쓥 +쓥 +쓥 +쓥 +쓥 + +쓦 +쓦 +쓦 +쓦 +쓦 + +쓧 +쓧 +쓧 +쓧 +쓧 + +쓨 +쓨 +쓨 +쓨 +쓨 + +쓩 +쓩 +쓩 +쓩 +쓩 + +쓪 +쓪 +쓪 +쓪 +쓪 + +쓫 +쓫 +쓫 +쓫 +쓫 + +쓬 +쓬 +쓬 +쓬 +쓬 + +쓭 +쓭 +쓭 +쓭 +쓭 + +쓮 +쓮 +쓮 +쓮 +쓮 + +쓯 +쓯 +쓯 +쓯 +쓯 + +쓰 +쓰 +쓰 +쓰 +쓰 + +쓱 +쓱 +쓱 +쓱 +쓱 + +쓲 +쓲 +쓲 +쓲 +쓲 + +쓳 +쓳 +쓳 +쓳 +쓳 + +쓴 +쓴 +쓴 +쓴 +쓴 + +쓵 +쓵 +쓵 +쓵 +쓵 + +쓶 +쓶 +쓶 +쓶 +쓶 + +쓷 +쓷 +쓷 +쓷 +쓷 + +쓸 +쓸 +쓸 +쓸 +쓸 + +쓹 +쓹 +쓹 +쓹 +쓹 + +쓺 +쓺 +쓺 +쓺 +쓺 + +쓻 +쓻 +쓻 +쓻 +쓻 + +쓼 +쓼 +쓼 +쓼 +쓼 + +쓽 +쓽 +쓽 +쓽 +쓽 + +쓾 +쓾 +쓾 +쓾 +쓾 + +쓿 +쓿 +쓿 +쓿 +쓿 + +씀 +씀 +씀 +씀 +씀 + +씁 +씁 +씁 +씁 +씁 + +씂 +씂 +씂 +씂 +씂 + +씃 +씃 +씃 +씃 +씃 + +씄 +씄 +씄 +씄 +씄 + +씅 +씅 +씅 +씅 +씅 + +씆 +씆 +씆 +씆 +씆 + +씇 +씇 +씇 +씇 +씇 + +씈 +씈 +씈 +씈 +씈 + +씉 +씉 +씉 +씉 +씉 + +씊 +씊 +씊 +씊 +씊 + +씋 +씋 +씋 +씋 +씋 + +씌 +씌 +씌 +씌 +씌 + +씍 +씍 +씍 +씍 +씍 + +씎 +씎 +씎 +씎 +씎 + +씏 +씏 +씏 +씏 +씏 + +씐 +씐 +씐 +씐 +씐 + +씑 +씑 +씑 +씑 +씑 + +씒 +씒 +씒 +씒 +씒 + +씓 +씓 +씓 +씓 +씓 + +씔 +씔 +씔 +씔 +씔 + +씕 +씕 +씕 +씕 +씕 + +씖 +씖 +씖 +씖 +씖 + +씗 +씗 +씗 +씗 +씗 + +씘 +씘 +씘 +씘 +씘 + +씙 +씙 +씙 +씙 +씙 + +씚 +씚 +씚 +씚 +씚 + +씛 +씛 +씛 +씛 +씛 + +씜 +씜 +씜 +씜 +씜 + +씝 +씝 +씝 +씝 +씝 + +씞 +씞 +씞 +씞 +씞 + +씟 +씟 +씟 +씟 +씟 + +씠 +씠 +씠 +씠 +씠 + +씡 +씡 +씡 +씡 +씡 + +씢 +씢 +씢 +씢 +씢 + +씣 +씣 +씣 +씣 +씣 + +씤 +씤 +씤 +씤 +씤 + +씥 +씥 +씥 +씥 +씥 + +씦 +씦 +씦 +씦 +씦 + +씧 +씧 +씧 +씧 +씧 + +씨 +씨 +씨 +씨 +씨 + +씩 +씩 +씩 +씩 +씩 + +씪 +씪 +씪 +씪 +씪 + +씫 +씫 +씫 +씫 +씫 + +씬 +씬 +씬 +씬 +씬 + +씭 +씭 +씭 +씭 +씭 + +씮 +씮 +씮 +씮 +씮 + +씯 +씯 +씯 +씯 +씯 + +씰 +씰 +씰 +씰 +씰 + +씱 +씱 +씱 +씱 +씱 + +씲 +씲 +씲 +씲 +씲 + +씳 +씳 +씳 +씳 +씳 + +씴 +씴 +씴 +씴 +씴 + +씵 +씵 +씵 +씵 +씵 + +씶 +씶 +씶 +씶 +씶 + +씷 +씷 +씷 +씷 +씷 + +씸 +씸 +씸 +씸 +씸 + +씹 +씹 +씹 +씹 +씹 + +씺 +씺 +씺 +씺 +씺 + +씻 +씻 +씻 +씻 +씻 + +씼 +씼 +씼 +씼 +씼 + +씽 +씽 +씽 +씽 +씽 + +씾 +씾 +씾 +씾 +씾 + +씿 +씿 +씿 +씿 +씿 + +앀 +앀 +앀 +앀 +앀 + +앁 +앁 +앁 +앁 +앁 + +앂 +앂 +앂 +앂 +앂 + +앃 +앃 +앃 +앃 +앃 + +아 +아 +아 +아 +아 + +악 +악 +악 +악 +악 + +앆 +앆 +앆 +앆 +앆 + +앇 +앇 +앇 +앇 +앇 + +안 +안 +안 +안 +안 + +앉 +앉 +앉 +앉 +앉 + +않 +않 +않 +않 +않 + +앋 +앋 +앋 +앋 +앋 + +알 +알 +알 +알 +알 + +앍 +앍 +앍 +앍 +앍 + +앎 +앎 +앎 +앎 +앎 + +앏 +앏 +앏 +앏 +앏 + +앐 +앐 +앐 +앐 +앐 + +앑 +앑 +앑 +앑 +앑 + +앒 +앒 +앒 +앒 +앒 + +앓 +앓 +앓 +앓 +앓 + +암 +암 +암 +암 +암 + +압 +압 +압 +압 +압 + +앖 +앖 +앖 +앖 +앖 + +앗 +앗 +앗 +앗 +앗 + +았 +았 +았 +았 +았 + +앙 +앙 +앙 +앙 +앙 + +앚 +앚 +앚 +앚 +앚 + +앛 +앛 +앛 +앛 +앛 + +앜 +앜 +앜 +앜 +앜 + +앝 +앝 +앝 +앝 +앝 + +앞 +앞 +앞 +앞 +앞 + +앟 +앟 +앟 +앟 +앟 + +애 +애 +애 +애 +애 + +액 +액 +액 +액 +액 + +앢 +앢 +앢 +앢 +앢 + +앣 +앣 +앣 +앣 +앣 + +앤 +앤 +앤 +앤 +앤 + +앥 +앥 +앥 +앥 +앥 + +앦 +앦 +앦 +앦 +앦 + +앧 +앧 +앧 +앧 +앧 + +앨 +앨 +앨 +앨 +앨 + +앩 +앩 +앩 +앩 +앩 + +앪 +앪 +앪 +앪 +앪 + +앫 +앫 +앫 +앫 +앫 + +앬 +앬 +앬 +앬 +앬 + +앭 +앭 +앭 +앭 +앭 + +앮 +앮 +앮 +앮 +앮 + +앯 +앯 +앯 +앯 +앯 + +앰 +앰 +앰 +앰 +앰 + +앱 +앱 +앱 +앱 +앱 + +앲 +앲 +앲 +앲 +앲 + +앳 +앳 +앳 +앳 +앳 + +앴 +앴 +앴 +앴 +앴 + +앵 +앵 +앵 +앵 +앵 + +앶 +앶 +앶 +앶 +앶 + +앷 +앷 +앷 +앷 +앷 + +앸 +앸 +앸 +앸 +앸 + +앹 +앹 +앹 +앹 +앹 + +앺 +앺 +앺 +앺 +앺 + +앻 +앻 +앻 +앻 +앻 + +야 +야 +야 +야 +야 + +약 +약 +약 +약 +약 + +앾 +앾 +앾 +앾 +앾 + +앿 +앿 +앿 +앿 +앿 + +얀 +얀 +얀 +얀 +얀 + +얁 +얁 +얁 +얁 +얁 + +얂 +얂 +얂 +얂 +얂 + +얃 +얃 +얃 +얃 +얃 + +얄 +얄 +얄 +얄 +얄 + +얅 +얅 +얅 +얅 +얅 + +얆 +얆 +얆 +얆 +얆 + +얇 +얇 +얇 +얇 +얇 + +얈 +얈 +얈 +얈 +얈 + +얉 +얉 +얉 +얉 +얉 + +얊 +얊 +얊 +얊 +얊 + +얋 +얋 +얋 +얋 +얋 + +얌 +얌 +얌 +얌 +얌 + +얍 +얍 +얍 +얍 +얍 + +얎 +얎 +얎 +얎 +얎 + +얏 +얏 +얏 +얏 +얏 + +얐 +얐 +얐 +얐 +얐 + +양 +양 +양 +양 +양 + +얒 +얒 +얒 +얒 +얒 + +얓 +얓 +얓 +얓 +얓 + +얔 +얔 +얔 +얔 +얔 + +얕 +얕 +얕 +얕 +얕 + +얖 +얖 +얖 +얖 +얖 + +얗 +얗 +얗 +얗 +얗 + +얘 +얘 +얘 +얘 +얘 + +얙 +얙 +얙 +얙 +얙 + +얚 +얚 +얚 +얚 +얚 + +얛 +얛 +얛 +얛 +얛 + +얜 +얜 +얜 +얜 +얜 + +얝 +얝 +얝 +얝 +얝 + +얞 +얞 +얞 +얞 +얞 + +얟 +얟 +얟 +얟 +얟 + +얠 +얠 +얠 +얠 +얠 + +얡 +얡 +얡 +얡 +얡 + +얢 +얢 +얢 +얢 +얢 + +얣 +얣 +얣 +얣 +얣 + +얤 +얤 +얤 +얤 +얤 + +얥 +얥 +얥 +얥 +얥 + +얦 +얦 +얦 +얦 +얦 + +얧 +얧 +얧 +얧 +얧 + +얨 +얨 +얨 +얨 +얨 + +얩 +얩 +얩 +얩 +얩 + +얪 +얪 +얪 +얪 +얪 + +얫 +얫 +얫 +얫 +얫 + +얬 +얬 +얬 +얬 +얬 + +얭 +얭 +얭 +얭 +얭 + +얮 +얮 +얮 +얮 +얮 + +얯 +얯 +얯 +얯 +얯 + +얰 +얰 +얰 +얰 +얰 + +얱 +얱 +얱 +얱 +얱 + +얲 +얲 +얲 +얲 +얲 + +얳 +얳 +얳 +얳 +얳 + +어 +어 +어 +어 +어 + +억 +억 +억 +억 +억 + +얶 +얶 +얶 +얶 +얶 + +얷 +얷 +얷 +얷 +얷 + +언 +언 +언 +언 +언 + +얹 +얹 +얹 +얹 +얹 + +얺 +얺 +얺 +얺 +얺 + +얻 +얻 +얻 +얻 +얻 + +얼 +얼 +얼 +얼 +얼 + +얽 +얽 +얽 +얽 +얽 + +얾 +얾 +얾 +얾 +얾 + +얿 +얿 +얿 +얿 +얿 + +엀 +엀 +엀 +엀 +엀 + +엁 +엁 +엁 +엁 +엁 + +엂 +엂 +엂 +엂 +엂 + +엃 +엃 +엃 +엃 +엃 + +엄 +엄 +엄 +엄 +엄 + +업 +업 +업 +업 +업 + +없 +없 +없 +없 +없 + +엇 +엇 +엇 +엇 +엇 + +었 +었 +었 +었 +었 + +엉 +엉 +엉 +엉 +엉 + +엊 +엊 +엊 +엊 +엊 + +엋 +엋 +엋 +엋 +엋 + +엌 +엌 +엌 +엌 +엌 + +엍 +엍 +엍 +엍 +엍 + +엎 +엎 +엎 +엎 +엎 + +엏 +엏 +엏 +엏 +엏 + +에 +에 +에 +에 +에 + +엑 +엑 +엑 +엑 +엑 + +엒 +엒 +엒 +엒 +엒 + +엓 +엓 +엓 +엓 +엓 + +엔 +엔 +엔 +엔 +엔 + +엕 +엕 +엕 +엕 +엕 + +엖 +엖 +엖 +엖 +엖 + +엗 +엗 +엗 +엗 +엗 + +엘 +엘 +엘 +엘 +엘 + +엙 +엙 +엙 +엙 +엙 + +엚 +엚 +엚 +엚 +엚 + +엛 +엛 +엛 +엛 +엛 + +엜 +엜 +엜 +엜 +엜 + +엝 +엝 +엝 +엝 +엝 + +엞 +엞 +엞 +엞 +엞 + +엟 +엟 +엟 +엟 +엟 + +엠 +엠 +엠 +엠 +엠 + +엡 +엡 +엡 +엡 +엡 + +엢 +엢 +엢 +엢 +엢 + +엣 +엣 +엣 +엣 +엣 + +엤 +엤 +엤 +엤 +엤 + +엥 +엥 +엥 +엥 +엥 + +엦 +엦 +엦 +엦 +엦 + +엧 +엧 +엧 +엧 +엧 + +엨 +엨 +엨 +엨 +엨 + +엩 +엩 +엩 +엩 +엩 + +엪 +엪 +엪 +엪 +엪 + +엫 +엫 +엫 +엫 +엫 + +여 +여 +여 +여 +여 + +역 +역 +역 +역 +역 + +엮 +엮 +엮 +엮 +엮 + +엯 +엯 +엯 +엯 +엯 + +연 +연 +연 +연 +연 + +엱 +엱 +엱 +엱 +엱 + +엲 +엲 +엲 +엲 +엲 + +엳 +엳 +엳 +엳 +엳 + +열 +열 +열 +열 +열 + +엵 +엵 +엵 +엵 +엵 + +엶 +엶 +엶 +엶 +엶 + +엷 +엷 +엷 +엷 +엷 + +엸 +엸 +엸 +엸 +엸 + +엹 +엹 +엹 +엹 +엹 + +엺 +엺 +엺 +엺 +엺 + +엻 +엻 +엻 +엻 +엻 + +염 +염 +염 +염 +염 + +엽 +엽 +엽 +엽 +엽 + +엾 +엾 +엾 +엾 +엾 + +엿 +엿 +엿 +엿 +엿 + +였 +였 +였 +였 +였 + +영 +영 +영 +영 +영 + +옂 +옂 +옂 +옂 +옂 + +옃 +옃 +옃 +옃 +옃 + +옄 +옄 +옄 +옄 +옄 + +옅 +옅 +옅 +옅 +옅 + +옆 +옆 +옆 +옆 +옆 + +옇 +옇 +옇 +옇 +옇 + +예 +예 +예 +예 +예 + +옉 +옉 +옉 +옉 +옉 + +옊 +옊 +옊 +옊 +옊 + +옋 +옋 +옋 +옋 +옋 + +옌 +옌 +옌 +옌 +옌 + +옍 +옍 +옍 +옍 +옍 + +옎 +옎 +옎 +옎 +옎 + +옏 +옏 +옏 +옏 +옏 + +옐 +옐 +옐 +옐 +옐 + +옑 +옑 +옑 +옑 +옑 + +옒 +옒 +옒 +옒 +옒 + +옓 +옓 +옓 +옓 +옓 + +옔 +옔 +옔 +옔 +옔 + +옕 +옕 +옕 +옕 +옕 + +옖 +옖 +옖 +옖 +옖 + +옗 +옗 +옗 +옗 +옗 + +옘 +옘 +옘 +옘 +옘 + +옙 +옙 +옙 +옙 +옙 + +옚 +옚 +옚 +옚 +옚 + +옛 +옛 +옛 +옛 +옛 + +옜 +옜 +옜 +옜 +옜 + +옝 +옝 +옝 +옝 +옝 + +옞 +옞 +옞 +옞 +옞 + +옟 +옟 +옟 +옟 +옟 + +옠 +옠 +옠 +옠 +옠 + +옡 +옡 +옡 +옡 +옡 + +옢 +옢 +옢 +옢 +옢 + +옣 +옣 +옣 +옣 +옣 + +오 +오 +오 +오 +오 + +옥 +옥 +옥 +옥 +옥 + +옦 +옦 +옦 +옦 +옦 + +옧 +옧 +옧 +옧 +옧 + +온 +온 +온 +온 +온 + +옩 +옩 +옩 +옩 +옩 + +옪 +옪 +옪 +옪 +옪 + +옫 +옫 +옫 +옫 +옫 + +올 +올 +올 +올 +올 + +옭 +옭 +옭 +옭 +옭 + +옮 +옮 +옮 +옮 +옮 + +옯 +옯 +옯 +옯 +옯 + +옰 +옰 +옰 +옰 +옰 + +옱 +옱 +옱 +옱 +옱 + +옲 +옲 +옲 +옲 +옲 + +옳 +옳 +옳 +옳 +옳 + +옴 +옴 +옴 +옴 +옴 + +옵 +옵 +옵 +옵 +옵 + +옶 +옶 +옶 +옶 +옶 + +옷 +옷 +옷 +옷 +옷 + +옸 +옸 +옸 +옸 +옸 + +옹 +옹 +옹 +옹 +옹 + +옺 +옺 +옺 +옺 +옺 + +옻 +옻 +옻 +옻 +옻 + +옼 +옼 +옼 +옼 +옼 + +옽 +옽 +옽 +옽 +옽 + +옾 +옾 +옾 +옾 +옾 + +옿 +옿 +옿 +옿 +옿 + +와 +와 +와 +와 +와 + +왁 +왁 +왁 +왁 +왁 + +왂 +왂 +왂 +왂 +왂 + +왃 +왃 +왃 +왃 +왃 + +완 +완 +완 +완 +완 + +왅 +왅 +왅 +왅 +왅 + +왆 +왆 +왆 +왆 +왆 + +왇 +왇 +왇 +왇 +왇 + +왈 +왈 +왈 +왈 +왈 + +왉 +왉 +왉 +왉 +왉 + +왊 +왊 +왊 +왊 +왊 + +왋 +왋 +왋 +왋 +왋 + +왌 +왌 +왌 +왌 +왌 + +왍 +왍 +왍 +왍 +왍 + +왎 +왎 +왎 +왎 +왎 + +왏 +왏 +왏 +왏 +왏 + +왐 +왐 +왐 +왐 +왐 + +왑 +왑 +왑 +왑 +왑 + +왒 +왒 +왒 +왒 +왒 + +왓 +왓 +왓 +왓 +왓 + +왔 +왔 +왔 +왔 +왔 + +왕 +왕 +왕 +왕 +왕 + +왖 +왖 +왖 +왖 +왖 + +왗 +왗 +왗 +왗 +왗 + +왘 +왘 +왘 +왘 +왘 + +왙 +왙 +왙 +왙 +왙 + +왚 +왚 +왚 +왚 +왚 + +왛 +왛 +왛 +왛 +왛 + +왜 +왜 +왜 +왜 +왜 + +왝 +왝 +왝 +왝 +왝 + +왞 +왞 +왞 +왞 +왞 + +왟 +왟 +왟 +왟 +왟 + +왠 +왠 +왠 +왠 +왠 + +왡 +왡 +왡 +왡 +왡 + +왢 +왢 +왢 +왢 +왢 + +왣 +왣 +왣 +왣 +왣 + +왤 +왤 +왤 +왤 +왤 + +왥 +왥 +왥 +왥 +왥 + +왦 +왦 +왦 +왦 +왦 + +왧 +왧 +왧 +왧 +왧 + +왨 +왨 +왨 +왨 +왨 + +왩 +왩 +왩 +왩 +왩 + +왪 +왪 +왪 +왪 +왪 + +왫 +왫 +왫 +왫 +왫 + +왬 +왬 +왬 +왬 +왬 + +왭 +왭 +왭 +왭 +왭 + +왮 +왮 +왮 +왮 +왮 + +왯 +왯 +왯 +왯 +왯 + +왰 +왰 +왰 +왰 +왰 + +왱 +왱 +왱 +왱 +왱 + +왲 +왲 +왲 +왲 +왲 + +왳 +왳 +왳 +왳 +왳 + +왴 +왴 +왴 +왴 +왴 + +왵 +왵 +왵 +왵 +왵 + +왶 +왶 +왶 +왶 +왶 + +왷 +왷 +왷 +왷 +왷 + +외 +외 +외 +외 +외 + +왹 +왹 +왹 +왹 +왹 + +왺 +왺 +왺 +왺 +왺 + +왻 +왻 +왻 +왻 +왻 + +왼 +왼 +왼 +왼 +왼 + +왽 +왽 +왽 +왽 +왽 + +왾 +왾 +왾 +왾 +왾 + +왿 +왿 +왿 +왿 +왿 + +욀 +욀 +욀 +욀 +욀 + +욁 +욁 +욁 +욁 +욁 + +욂 +욂 +욂 +욂 +욂 + +욃 +욃 +욃 +욃 +욃 + +욄 +욄 +욄 +욄 +욄 + +욅 +욅 +욅 +욅 +욅 + +욆 +욆 +욆 +욆 +욆 + +욇 +욇 +욇 +욇 +욇 + +욈 +욈 +욈 +욈 +욈 + +욉 +욉 +욉 +욉 +욉 + +욊 +욊 +욊 +욊 +욊 + +욋 +욋 +욋 +욋 +욋 + +욌 +욌 +욌 +욌 +욌 + +욍 +욍 +욍 +욍 +욍 + +욎 +욎 +욎 +욎 +욎 + +욏 +욏 +욏 +욏 +욏 + +욐 +욐 +욐 +욐 +욐 + +욑 +욑 +욑 +욑 +욑 + +욒 +욒 +욒 +욒 +욒 + +욓 +욓 +욓 +욓 +욓 + +요 +요 +요 +요 +요 + +욕 +욕 +욕 +욕 +욕 + +욖 +욖 +욖 +욖 +욖 + +욗 +욗 +욗 +욗 +욗 + +욘 +욘 +욘 +욘 +욘 + +욙 +욙 +욙 +욙 +욙 + +욚 +욚 +욚 +욚 +욚 + +욛 +욛 +욛 +욛 +욛 + +욜 +욜 +욜 +욜 +욜 + +욝 +욝 +욝 +욝 +욝 + +욞 +욞 +욞 +욞 +욞 + +욟 +욟 +욟 +욟 +욟 + +욠 +욠 +욠 +욠 +욠 + +욡 +욡 +욡 +욡 +욡 + +욢 +욢 +욢 +욢 +욢 + +욣 +욣 +욣 +욣 +욣 + +욤 +욤 +욤 +욤 +욤 + +욥 +욥 +욥 +욥 +욥 + +욦 +욦 +욦 +욦 +욦 + +욧 +욧 +욧 +욧 +욧 + +욨 +욨 +욨 +욨 +욨 + +용 +용 +용 +용 +용 + +욪 +욪 +욪 +욪 +욪 + +욫 +욫 +욫 +욫 +욫 + +욬 +욬 +욬 +욬 +욬 + +욭 +욭 +욭 +욭 +욭 + +욮 +욮 +욮 +욮 +욮 + +욯 +욯 +욯 +욯 +욯 + +우 +우 +우 +우 +우 + +욱 +욱 +욱 +욱 +욱 + +욲 +욲 +욲 +욲 +욲 + +욳 +욳 +욳 +욳 +욳 + +운 +운 +운 +운 +운 + +욵 +욵 +욵 +욵 +욵 + +욶 +욶 +욶 +욶 +욶 + +욷 +욷 +욷 +욷 +욷 + +울 +울 +울 +울 +울 + +욹 +욹 +욹 +욹 +욹 + +욺 +욺 +욺 +욺 +욺 + +욻 +욻 +욻 +욻 +욻 + +욼 +욼 +욼 +욼 +욼 + +욽 +욽 +욽 +욽 +욽 + +욾 +욾 +욾 +욾 +욾 + +욿 +욿 +욿 +욿 +욿 + +움 +움 +움 +움 +움 + +웁 +웁 +웁 +웁 +웁 + +웂 +웂 +웂 +웂 +웂 + +웃 +웃 +웃 +웃 +웃 + +웄 +웄 +웄 +웄 +웄 + +웅 +웅 +웅 +웅 +웅 + +웆 +웆 +웆 +웆 +웆 + +웇 +웇 +웇 +웇 +웇 + +웈 +웈 +웈 +웈 +웈 + +웉 +웉 +웉 +웉 +웉 + +웊 +웊 +웊 +웊 +웊 + +웋 +웋 +웋 +웋 +웋 + +워 +워 +워 +워 +워 + +웍 +웍 +웍 +웍 +웍 + +웎 +웎 +웎 +웎 +웎 + +웏 +웏 +웏 +웏 +웏 + +원 +원 +원 +원 +원 + +웑 +웑 +웑 +웑 +웑 + +웒 +웒 +웒 +웒 +웒 + +웓 +웓 +웓 +웓 +웓 + +월 +월 +월 +월 +월 + +웕 +웕 +웕 +웕 +웕 + +웖 +웖 +웖 +웖 +웖 + +웗 +웗 +웗 +웗 +웗 + +웘 +웘 +웘 +웘 +웘 + +웙 +웙 +웙 +웙 +웙 + +웚 +웚 +웚 +웚 +웚 + +웛 +웛 +웛 +웛 +웛 + +웜 +웜 +웜 +웜 +웜 + +웝 +웝 +웝 +웝 +웝 + +웞 +웞 +웞 +웞 +웞 + +웟 +웟 +웟 +웟 +웟 + +웠 +웠 +웠 +웠 +웠 + +웡 +웡 +웡 +웡 +웡 + +웢 +웢 +웢 +웢 +웢 + +웣 +웣 +웣 +웣 +웣 + +웤 +웤 +웤 +웤 +웤 + +웥 +웥 +웥 +웥 +웥 + +웦 +웦 +웦 +웦 +웦 + +웧 +웧 +웧 +웧 +웧 + +웨 +웨 +웨 +웨 +웨 + +웩 +웩 +웩 +웩 +웩 + +웪 +웪 +웪 +웪 +웪 + +웫 +웫 +웫 +웫 +웫 + +웬 +웬 +웬 +웬 +웬 + +웭 +웭 +웭 +웭 +웭 + +웮 +웮 +웮 +웮 +웮 + +웯 +웯 +웯 +웯 +웯 + +웰 +웰 +웰 +웰 +웰 + +웱 +웱 +웱 +웱 +웱 + +웲 +웲 +웲 +웲 +웲 + +웳 +웳 +웳 +웳 +웳 + +웴 +웴 +웴 +웴 +웴 + +웵 +웵 +웵 +웵 +웵 + +웶 +웶 +웶 +웶 +웶 + +웷 +웷 +웷 +웷 +웷 + +웸 +웸 +웸 +웸 +웸 + +웹 +웹 +웹 +웹 +웹 + +웺 +웺 +웺 +웺 +웺 + +웻 +웻 +웻 +웻 +웻 + +웼 +웼 +웼 +웼 +웼 + +웽 +웽 +웽 +웽 +웽 + +웾 +웾 +웾 +웾 +웾 + +웿 +웿 +웿 +웿 +웿 + +윀 +윀 +윀 +윀 +윀 + +윁 +윁 +윁 +윁 +윁 + +윂 +윂 +윂 +윂 +윂 + +윃 +윃 +윃 +윃 +윃 + +위 +위 +위 +위 +위 + +윅 +윅 +윅 +윅 +윅 + +윆 +윆 +윆 +윆 +윆 + +윇 +윇 +윇 +윇 +윇 + +윈 +윈 +윈 +윈 +윈 + +윉 +윉 +윉 +윉 +윉 + +윊 +윊 +윊 +윊 +윊 + +윋 +윋 +윋 +윋 +윋 + +윌 +윌 +윌 +윌 +윌 + +윍 +윍 +윍 +윍 +윍 + +윎 +윎 +윎 +윎 +윎 + +윏 +윏 +윏 +윏 +윏 + +윐 +윐 +윐 +윐 +윐 + +윑 +윑 +윑 +윑 +윑 + +윒 +윒 +윒 +윒 +윒 + +윓 +윓 +윓 +윓 +윓 + +윔 +윔 +윔 +윔 +윔 + +윕 +윕 +윕 +윕 +윕 + +윖 +윖 +윖 +윖 +윖 + +윗 +윗 +윗 +윗 +윗 + +윘 +윘 +윘 +윘 +윘 + +윙 +윙 +윙 +윙 +윙 + +윚 +윚 +윚 +윚 +윚 + +윛 +윛 +윛 +윛 +윛 + +윜 +윜 +윜 +윜 +윜 + +윝 +윝 +윝 +윝 +윝 + +윞 +윞 +윞 +윞 +윞 + +윟 +윟 +윟 +윟 +윟 + +유 +유 +유 +유 +유 + +육 +육 +육 +육 +육 + +윢 +윢 +윢 +윢 +윢 + +윣 +윣 +윣 +윣 +윣 + +윤 +윤 +윤 +윤 +윤 + +윥 +윥 +윥 +윥 +윥 + +윦 +윦 +윦 +윦 +윦 + +윧 +윧 +윧 +윧 +윧 + +율 +율 +율 +율 +율 + +윩 +윩 +윩 +윩 +윩 + +윪 +윪 +윪 +윪 +윪 + +윫 +윫 +윫 +윫 +윫 + +윬 +윬 +윬 +윬 +윬 + +윭 +윭 +윭 +윭 +윭 + +윮 +윮 +윮 +윮 +윮 + +윯 +윯 +윯 +윯 +윯 + +윰 +윰 +윰 +윰 +윰 + +윱 +윱 +윱 +윱 +윱 + +윲 +윲 +윲 +윲 +윲 + +윳 +윳 +윳 +윳 +윳 + +윴 +윴 +윴 +윴 +윴 + +융 +융 +융 +융 +융 + +윶 +윶 +윶 +윶 +윶 + +윷 +윷 +윷 +윷 +윷 + +윸 +윸 +윸 +윸 +윸 + +윹 +윹 +윹 +윹 +윹 + +윺 +윺 +윺 +윺 +윺 + +윻 +윻 +윻 +윻 +윻 + +으 +으 +으 +으 +으 + +윽 +윽 +윽 +윽 +윽 + +윾 +윾 +윾 +윾 +윾 + +윿 +윿 +윿 +윿 +윿 + +은 +은 +은 +은 +은 + +읁 +읁 +읁 +읁 +읁 + +읂 +읂 +읂 +읂 +읂 + +읃 +읃 +읃 +읃 +읃 + +을 +을 +을 +을 +을 + +읅 +읅 +읅 +읅 +읅 + +읆 +읆 +읆 +읆 +읆 + +읇 +읇 +읇 +읇 +읇 + +읈 +읈 +읈 +읈 +읈 + +읉 +읉 +읉 +읉 +읉 + +읊 +읊 +읊 +읊 +읊 + +읋 +읋 +읋 +읋 +읋 + +음 +음 +음 +음 +음 + +읍 +읍 +읍 +읍 +읍 + +읎 +읎 +읎 +읎 +읎 + +읏 +읏 +읏 +읏 +읏 + +읐 +읐 +읐 +읐 +읐 + +응 +응 +응 +응 +응 + +읒 +읒 +읒 +읒 +읒 + +읓 +읓 +읓 +읓 +읓 + +읔 +읔 +읔 +읔 +읔 + +읕 +읕 +읕 +읕 +읕 + +읖 +읖 +읖 +읖 +읖 + +읗 +읗 +읗 +읗 +읗 + +의 +의 +의 +의 +의 + +읙 +읙 +읙 +읙 +읙 + +읚 +읚 +읚 +읚 +읚 + +읛 +읛 +읛 +읛 +읛 + +읜 +읜 +읜 +읜 +읜 + +읝 +읝 +읝 +읝 +읝 + +읞 +읞 +읞 +읞 +읞 + +읟 +읟 +읟 +읟 +읟 + +읠 +읠 +읠 +읠 +읠 + +읡 +읡 +읡 +읡 +읡 + +읢 +읢 +읢 +읢 +읢 + +읣 +읣 +읣 +읣 +읣 + +읤 +읤 +읤 +읤 +읤 + +읥 +읥 +읥 +읥 +읥 + +읦 +읦 +읦 +읦 +읦 + +읧 +읧 +읧 +읧 +읧 + +읨 +읨 +읨 +읨 +읨 + +읩 +읩 +읩 +읩 +읩 + +읪 +읪 +읪 +읪 +읪 + +읫 +읫 +읫 +읫 +읫 + +읬 +읬 +읬 +읬 +읬 + +읭 +읭 +읭 +읭 +읭 + +읮 +읮 +읮 +읮 +읮 + +읯 +읯 +읯 +읯 +읯 + +읰 +읰 +읰 +읰 +읰 + +읱 +읱 +읱 +읱 +읱 + +읲 +읲 +읲 +읲 +읲 + +읳 +읳 +읳 +읳 +읳 + +이 +이 +이 +이 +이 + +익 +익 +익 +익 +익 + +읶 +읶 +읶 +읶 +읶 + +읷 +읷 +읷 +읷 +읷 + +인 +인 +인 +인 +인 + +읹 +읹 +읹 +읹 +읹 + +읺 +읺 +읺 +읺 +읺 + +읻 +읻 +읻 +읻 +읻 + +일 +일 +일 +일 +일 + +읽 +읽 +읽 +읽 +읽 + +읾 +읾 +읾 +읾 +읾 + +읿 +읿 +읿 +읿 +읿 + +잀 +잀 +잀 +잀 +잀 + +잁 +잁 +잁 +잁 +잁 + +잂 +잂 +잂 +잂 +잂 + +잃 +잃 +잃 +잃 +잃 + +임 +임 +임 +임 +임 + +입 +입 +입 +입 +입 + +잆 +잆 +잆 +잆 +잆 + +잇 +잇 +잇 +잇 +잇 + +있 +있 +있 +있 +있 + +잉 +잉 +잉 +잉 +잉 + +잊 +잊 +잊 +잊 +잊 + +잋 +잋 +잋 +잋 +잋 + +잌 +잌 +잌 +잌 +잌 + +잍 +잍 +잍 +잍 +잍 + +잎 +잎 +잎 +잎 +잎 + +잏 +잏 +잏 +잏 +잏 + +자 +자 +자 +자 +자 + +작 +작 +작 +작 +작 + +잒 +잒 +잒 +잒 +잒 + +잓 +잓 +잓 +잓 +잓 + +잔 +잔 +잔 +잔 +잔 + +잕 +잕 +잕 +잕 +잕 + +잖 +잖 +잖 +잖 +잖 + +잗 +잗 +잗 +잗 +잗 + +잘 +잘 +잘 +잘 +잘 + +잙 +잙 +잙 +잙 +잙 + +잚 +잚 +잚 +잚 +잚 + +잛 +잛 +잛 +잛 +잛 + +잜 +잜 +잜 +잜 +잜 + +잝 +잝 +잝 +잝 +잝 + +잞 +잞 +잞 +잞 +잞 + +잟 +잟 +잟 +잟 +잟 + +잠 +잠 +잠 +잠 +잠 + +잡 +잡 +잡 +잡 +잡 + +잢 +잢 +잢 +잢 +잢 + +잣 +잣 +잣 +잣 +잣 + +잤 +잤 +잤 +잤 +잤 + +장 +장 +장 +장 +장 + +잦 +잦 +잦 +잦 +잦 + +잧 +잧 +잧 +잧 +잧 + +잨 +잨 +잨 +잨 +잨 + +잩 +잩 +잩 +잩 +잩 + +잪 +잪 +잪 +잪 +잪 + +잫 +잫 +잫 +잫 +잫 + +재 +재 +재 +재 +재 + +잭 +잭 +잭 +잭 +잭 + +잮 +잮 +잮 +잮 +잮 + +잯 +잯 +잯 +잯 +잯 + +잰 +잰 +잰 +잰 +잰 + +잱 +잱 +잱 +잱 +잱 + +잲 +잲 +잲 +잲 +잲 + +잳 +잳 +잳 +잳 +잳 + +잴 +잴 +잴 +잴 +잴 + +잵 +잵 +잵 +잵 +잵 + +잶 +잶 +잶 +잶 +잶 + +잷 +잷 +잷 +잷 +잷 + +잸 +잸 +잸 +잸 +잸 + +잹 +잹 +잹 +잹 +잹 + +잺 +잺 +잺 +잺 +잺 + +잻 +잻 +잻 +잻 +잻 + +잼 +잼 +잼 +잼 +잼 + +잽 +잽 +잽 +잽 +잽 + +잾 +잾 +잾 +잾 +잾 + +잿 +잿 +잿 +잿 +잿 + +쟀 +쟀 +쟀 +쟀 +쟀 + +쟁 +쟁 +쟁 +쟁 +쟁 + +쟂 +쟂 +쟂 +쟂 +쟂 + +쟃 +쟃 +쟃 +쟃 +쟃 + +쟄 +쟄 +쟄 +쟄 +쟄 + +쟅 +쟅 +쟅 +쟅 +쟅 + +쟆 +쟆 +쟆 +쟆 +쟆 + +쟇 +쟇 +쟇 +쟇 +쟇 + +쟈 +쟈 +쟈 +쟈 +쟈 + +쟉 +쟉 +쟉 +쟉 +쟉 + +쟊 +쟊 +쟊 +쟊 +쟊 + +쟋 +쟋 +쟋 +쟋 +쟋 + +쟌 +쟌 +쟌 +쟌 +쟌 + +쟍 +쟍 +쟍 +쟍 +쟍 + +쟎 +쟎 +쟎 +쟎 +쟎 + +쟏 +쟏 +쟏 +쟏 +쟏 + +쟐 +쟐 +쟐 +쟐 +쟐 + +쟑 +쟑 +쟑 +쟑 +쟑 + +쟒 +쟒 +쟒 +쟒 +쟒 + +쟓 +쟓 +쟓 +쟓 +쟓 + +쟔 +쟔 +쟔 +쟔 +쟔 + +쟕 +쟕 +쟕 +쟕 +쟕 + +쟖 +쟖 +쟖 +쟖 +쟖 + +쟗 +쟗 +쟗 +쟗 +쟗 + +쟘 +쟘 +쟘 +쟘 +쟘 + +쟙 +쟙 +쟙 +쟙 +쟙 + +쟚 +쟚 +쟚 +쟚 +쟚 + +쟛 +쟛 +쟛 +쟛 +쟛 + +쟜 +쟜 +쟜 +쟜 +쟜 + +쟝 +쟝 +쟝 +쟝 +쟝 + +쟞 +쟞 +쟞 +쟞 +쟞 + +쟟 +쟟 +쟟 +쟟 +쟟 + +쟠 +쟠 +쟠 +쟠 +쟠 + +쟡 +쟡 +쟡 +쟡 +쟡 + +쟢 +쟢 +쟢 +쟢 +쟢 + +쟣 +쟣 +쟣 +쟣 +쟣 + +쟤 +쟤 +쟤 +쟤 +쟤 + +쟥 +쟥 +쟥 +쟥 +쟥 + +쟦 +쟦 +쟦 +쟦 +쟦 + +쟧 +쟧 +쟧 +쟧 +쟧 + +쟨 +쟨 +쟨 +쟨 +쟨 + +쟩 +쟩 +쟩 +쟩 +쟩 + +쟪 +쟪 +쟪 +쟪 +쟪 + +쟫 +쟫 +쟫 +쟫 +쟫 + +쟬 +쟬 +쟬 +쟬 +쟬 + +쟭 +쟭 +쟭 +쟭 +쟭 + +쟮 +쟮 +쟮 +쟮 +쟮 + +쟯 +쟯 +쟯 +쟯 +쟯 + +쟰 +쟰 +쟰 +쟰 +쟰 + +쟱 +쟱 +쟱 +쟱 +쟱 + +쟲 +쟲 +쟲 +쟲 +쟲 + +쟳 +쟳 +쟳 +쟳 +쟳 + +쟴 +쟴 +쟴 +쟴 +쟴 + +쟵 +쟵 +쟵 +쟵 +쟵 + +쟶 +쟶 +쟶 +쟶 +쟶 + +쟷 +쟷 +쟷 +쟷 +쟷 + +쟸 +쟸 +쟸 +쟸 +쟸 + +쟹 +쟹 +쟹 +쟹 +쟹 + +쟺 +쟺 +쟺 +쟺 +쟺 + +쟻 +쟻 +쟻 +쟻 +쟻 + +쟼 +쟼 +쟼 +쟼 +쟼 + +쟽 +쟽 +쟽 +쟽 +쟽 + +쟾 +쟾 +쟾 +쟾 +쟾 + +쟿 +쟿 +쟿 +쟿 +쟿 + +저 +저 +저 +저 +저 + +적 +적 +적 +적 +적 + +젂 +젂 +젂 +젂 +젂 + +젃 +젃 +젃 +젃 +젃 + +전 +전 +전 +전 +전 + +젅 +젅 +젅 +젅 +젅 + +젆 +젆 +젆 +젆 +젆 + +젇 +젇 +젇 +젇 +젇 + +절 +절 +절 +절 +절 + +젉 +젉 +젉 +젉 +젉 + +젊 +젊 +젊 +젊 +젊 + +젋 +젋 +젋 +젋 +젋 + +젌 +젌 +젌 +젌 +젌 + +젍 +젍 +젍 +젍 +젍 + +젎 +젎 +젎 +젎 +젎 + +젏 +젏 +젏 +젏 +젏 + +점 +점 +점 +점 +점 + +접 +접 +접 +접 +접 + +젒 +젒 +젒 +젒 +젒 + +젓 +젓 +젓 +젓 +젓 + +젔 +젔 +젔 +젔 +젔 + +정 +정 +정 +정 +정 + +젖 +젖 +젖 +젖 +젖 + +젗 +젗 +젗 +젗 +젗 + +젘 +젘 +젘 +젘 +젘 + +젙 +젙 +젙 +젙 +젙 + +젚 +젚 +젚 +젚 +젚 + +젛 +젛 +젛 +젛 +젛 + +제 +제 +제 +제 +제 + +젝 +젝 +젝 +젝 +젝 + +젞 +젞 +젞 +젞 +젞 + +젟 +젟 +젟 +젟 +젟 + +젠 +젠 +젠 +젠 +젠 + +젡 +젡 +젡 +젡 +젡 + +젢 +젢 +젢 +젢 +젢 + +젣 +젣 +젣 +젣 +젣 + +젤 +젤 +젤 +젤 +젤 + +젥 +젥 +젥 +젥 +젥 + +젦 +젦 +젦 +젦 +젦 + +젧 +젧 +젧 +젧 +젧 + +젨 +젨 +젨 +젨 +젨 + +젩 +젩 +젩 +젩 +젩 + +젪 +젪 +젪 +젪 +젪 + +젫 +젫 +젫 +젫 +젫 + +젬 +젬 +젬 +젬 +젬 + +젭 +젭 +젭 +젭 +젭 + +젮 +젮 +젮 +젮 +젮 + +젯 +젯 +젯 +젯 +젯 + +젰 +젰 +젰 +젰 +젰 + +젱 +젱 +젱 +젱 +젱 + +젲 +젲 +젲 +젲 +젲 + +젳 +젳 +젳 +젳 +젳 + +젴 +젴 +젴 +젴 +젴 + +젵 +젵 +젵 +젵 +젵 + +젶 +젶 +젶 +젶 +젶 + +젷 +젷 +젷 +젷 +젷 + +져 +져 +져 +져 +져 + +젹 +젹 +젹 +젹 +젹 + +젺 +젺 +젺 +젺 +젺 + +젻 +젻 +젻 +젻 +젻 + +젼 +젼 +젼 +젼 +젼 + +젽 +젽 +젽 +젽 +젽 + +젾 +젾 +젾 +젾 +젾 + +젿 +젿 +젿 +젿 +젿 + +졀 +졀 +졀 +졀 +졀 + +졁 +졁 +졁 +졁 +졁 + +졂 +졂 +졂 +졂 +졂 + +졃 +졃 +졃 +졃 +졃 + +졄 +졄 +졄 +졄 +졄 + +졅 +졅 +졅 +졅 +졅 + +졆 +졆 +졆 +졆 +졆 + +졇 +졇 +졇 +졇 +졇 + +졈 +졈 +졈 +졈 +졈 + +졉 +졉 +졉 +졉 +졉 + +졊 +졊 +졊 +졊 +졊 + +졋 +졋 +졋 +졋 +졋 + +졌 +졌 +졌 +졌 +졌 + +졍 +졍 +졍 +졍 +졍 + +졎 +졎 +졎 +졎 +졎 + +졏 +졏 +졏 +졏 +졏 + +졐 +졐 +졐 +졐 +졐 + +졑 +졑 +졑 +졑 +졑 + +졒 +졒 +졒 +졒 +졒 + +졓 +졓 +졓 +졓 +졓 + +졔 +졔 +졔 +졔 +졔 + +졕 +졕 +졕 +졕 +졕 + +졖 +졖 +졖 +졖 +졖 + +졗 +졗 +졗 +졗 +졗 + +졘 +졘 +졘 +졘 +졘 + +졙 +졙 +졙 +졙 +졙 + +졚 +졚 +졚 +졚 +졚 + +졛 +졛 +졛 +졛 +졛 + +졜 +졜 +졜 +졜 +졜 + +졝 +졝 +졝 +졝 +졝 + +졞 +졞 +졞 +졞 +졞 + +졟 +졟 +졟 +졟 +졟 + +졠 +졠 +졠 +졠 +졠 + +졡 +졡 +졡 +졡 +졡 + +졢 +졢 +졢 +졢 +졢 + +졣 +졣 +졣 +졣 +졣 + +졤 +졤 +졤 +졤 +졤 + +졥 +졥 +졥 +졥 +졥 + +졦 +졦 +졦 +졦 +졦 + +졧 +졧 +졧 +졧 +졧 + +졨 +졨 +졨 +졨 +졨 + +졩 +졩 +졩 +졩 +졩 + +졪 +졪 +졪 +졪 +졪 + +졫 +졫 +졫 +졫 +졫 + +졬 +졬 +졬 +졬 +졬 + +졭 +졭 +졭 +졭 +졭 + +졮 +졮 +졮 +졮 +졮 + +졯 +졯 +졯 +졯 +졯 + +조 +조 +조 +조 +조 + +족 +족 +족 +족 +족 + +졲 +졲 +졲 +졲 +졲 + +졳 +졳 +졳 +졳 +졳 + +존 +존 +존 +존 +존 + +졵 +졵 +졵 +졵 +졵 + +졶 +졶 +졶 +졶 +졶 + +졷 +졷 +졷 +졷 +졷 + +졸 +졸 +졸 +졸 +졸 + +졹 +졹 +졹 +졹 +졹 + +졺 +졺 +졺 +졺 +졺 + +졻 +졻 +졻 +졻 +졻 + +졼 +졼 +졼 +졼 +졼 + +졽 +졽 +졽 +졽 +졽 + +졾 +졾 +졾 +졾 +졾 + +졿 +졿 +졿 +졿 +졿 + +좀 +좀 +좀 +좀 +좀 + +좁 +좁 +좁 +좁 +좁 + +좂 +좂 +좂 +좂 +좂 + +좃 +좃 +좃 +좃 +좃 + +좄 +좄 +좄 +좄 +좄 + +종 +종 +종 +종 +종 + +좆 +좆 +좆 +좆 +좆 + +좇 +좇 +좇 +좇 +좇 + +좈 +좈 +좈 +좈 +좈 + +좉 +좉 +좉 +좉 +좉 + +좊 +좊 +좊 +좊 +좊 + +좋 +좋 +좋 +좋 +좋 + +좌 +좌 +좌 +좌 +좌 + +좍 +좍 +좍 +좍 +좍 + +좎 +좎 +좎 +좎 +좎 + +좏 +좏 +좏 +좏 +좏 + +좐 +좐 +좐 +좐 +좐 + +좑 +좑 +좑 +좑 +좑 + +좒 +좒 +좒 +좒 +좒 + +좓 +좓 +좓 +좓 +좓 + +좔 +좔 +좔 +좔 +좔 + +좕 +좕 +좕 +좕 +좕 + +좖 +좖 +좖 +좖 +좖 + +좗 +좗 +좗 +좗 +좗 + +좘 +좘 +좘 +좘 +좘 + +좙 +좙 +좙 +좙 +좙 + +좚 +좚 +좚 +좚 +좚 + +좛 +좛 +좛 +좛 +좛 + +좜 +좜 +좜 +좜 +좜 + +좝 +좝 +좝 +좝 +좝 + +좞 +좞 +좞 +좞 +좞 + +좟 +좟 +좟 +좟 +좟 + +좠 +좠 +좠 +좠 +좠 + +좡 +좡 +좡 +좡 +좡 + +좢 +좢 +좢 +좢 +좢 + +좣 +좣 +좣 +좣 +좣 + +좤 +좤 +좤 +좤 +좤 + +좥 +좥 +좥 +좥 +좥 + +좦 +좦 +좦 +좦 +좦 + +좧 +좧 +좧 +좧 +좧 + +좨 +좨 +좨 +좨 +좨 + +좩 +좩 +좩 +좩 +좩 + +좪 +좪 +좪 +좪 +좪 + +좫 +좫 +좫 +좫 +좫 + +좬 +좬 +좬 +좬 +좬 + +좭 +좭 +좭 +좭 +좭 + +좮 +좮 +좮 +좮 +좮 + +좯 +좯 +좯 +좯 +좯 + +좰 +좰 +좰 +좰 +좰 + +좱 +좱 +좱 +좱 +좱 + +좲 +좲 +좲 +좲 +좲 + +좳 +좳 +좳 +좳 +좳 + +좴 +좴 +좴 +좴 +좴 + +좵 +좵 +좵 +좵 +좵 + +좶 +좶 +좶 +좶 +좶 + +좷 +좷 +좷 +좷 +좷 + +좸 +좸 +좸 +좸 +좸 + +좹 +좹 +좹 +좹 +좹 + +좺 +좺 +좺 +좺 +좺 + +좻 +좻 +좻 +좻 +좻 + +좼 +좼 +좼 +좼 +좼 + +좽 +좽 +좽 +좽 +좽 + +좾 +좾 +좾 +좾 +좾 + +좿 +좿 +좿 +좿 +좿 + +죀 +죀 +죀 +죀 +죀 + +죁 +죁 +죁 +죁 +죁 + +죂 +죂 +죂 +죂 +죂 + +죃 +죃 +죃 +죃 +죃 + +죄 +죄 +죄 +죄 +죄 + +죅 +죅 +죅 +죅 +죅 + +죆 +죆 +죆 +죆 +죆 + +죇 +죇 +죇 +죇 +죇 + +죈 +죈 +죈 +죈 +죈 + +죉 +죉 +죉 +죉 +죉 + +죊 +죊 +죊 +죊 +죊 + +죋 +죋 +죋 +죋 +죋 + +죌 +죌 +죌 +죌 +죌 + +죍 +죍 +죍 +죍 +죍 + +죎 +죎 +죎 +죎 +죎 + +죏 +죏 +죏 +죏 +죏 + +죐 +죐 +죐 +죐 +죐 + +죑 +죑 +죑 +죑 +죑 + +죒 +죒 +죒 +죒 +죒 + +죓 +죓 +죓 +죓 +죓 + +죔 +죔 +죔 +죔 +죔 + +죕 +죕 +죕 +죕 +죕 + +죖 +죖 +죖 +죖 +죖 + +죗 +죗 +죗 +죗 +죗 + +죘 +죘 +죘 +죘 +죘 + +죙 +죙 +죙 +죙 +죙 + +죚 +죚 +죚 +죚 +죚 + +죛 +죛 +죛 +죛 +죛 + +죜 +죜 +죜 +죜 +죜 + +죝 +죝 +죝 +죝 +죝 + +죞 +죞 +죞 +죞 +죞 + +죟 +죟 +죟 +죟 +죟 + +죠 +죠 +죠 +죠 +죠 + +죡 +죡 +죡 +죡 +죡 + +죢 +죢 +죢 +죢 +죢 + +죣 +죣 +죣 +죣 +죣 + +죤 +죤 +죤 +죤 +죤 + +죥 +죥 +죥 +죥 +죥 + +죦 +죦 +죦 +죦 +죦 + +죧 +죧 +죧 +죧 +죧 + +죨 +죨 +죨 +죨 +죨 + +죩 +죩 +죩 +죩 +죩 + +죪 +죪 +죪 +죪 +죪 + +죫 +죫 +죫 +죫 +죫 + +죬 +죬 +죬 +죬 +죬 + +죭 +죭 +죭 +죭 +죭 + +죮 +죮 +죮 +죮 +죮 + +죯 +죯 +죯 +죯 +죯 + +죰 +죰 +죰 +죰 +죰 + +죱 +죱 +죱 +죱 +죱 + +죲 +죲 +죲 +죲 +죲 + +죳 +죳 +죳 +죳 +죳 + +죴 +죴 +죴 +죴 +죴 + +죵 +죵 +죵 +죵 +죵 + +죶 +죶 +죶 +죶 +죶 + +죷 +죷 +죷 +죷 +죷 + +죸 +죸 +죸 +죸 +죸 + +죹 +죹 +죹 +죹 +죹 + +죺 +죺 +죺 +죺 +죺 + +죻 +죻 +죻 +죻 +죻 + +주 +주 +주 +주 +주 + +죽 +죽 +죽 +죽 +죽 + +죾 +죾 +죾 +죾 +죾 + +죿 +죿 +죿 +죿 +죿 + +준 +준 +준 +준 +준 + +줁 +줁 +줁 +줁 +줁 + +줂 +줂 +줂 +줂 +줂 + +줃 +줃 +줃 +줃 +줃 + +줄 +줄 +줄 +줄 +줄 + +줅 +줅 +줅 +줅 +줅 + +줆 +줆 +줆 +줆 +줆 + +줇 +줇 +줇 +줇 +줇 + +줈 +줈 +줈 +줈 +줈 + +줉 +줉 +줉 +줉 +줉 + +줊 +줊 +줊 +줊 +줊 + +줋 +줋 +줋 +줋 +줋 + +줌 +줌 +줌 +줌 +줌 + +줍 +줍 +줍 +줍 +줍 + +줎 +줎 +줎 +줎 +줎 + +줏 +줏 +줏 +줏 +줏 + +줐 +줐 +줐 +줐 +줐 + +중 +중 +중 +중 +중 + +줒 +줒 +줒 +줒 +줒 + +줓 +줓 +줓 +줓 +줓 + +줔 +줔 +줔 +줔 +줔 + +줕 +줕 +줕 +줕 +줕 + +줖 +줖 +줖 +줖 +줖 + +줗 +줗 +줗 +줗 +줗 + +줘 +줘 +줘 +줘 +줘 + +줙 +줙 +줙 +줙 +줙 + +줚 +줚 +줚 +줚 +줚 + +줛 +줛 +줛 +줛 +줛 + +줜 +줜 +줜 +줜 +줜 + +줝 +줝 +줝 +줝 +줝 + +줞 +줞 +줞 +줞 +줞 + +줟 +줟 +줟 +줟 +줟 + +줠 +줠 +줠 +줠 +줠 + +줡 +줡 +줡 +줡 +줡 + +줢 +줢 +줢 +줢 +줢 + +줣 +줣 +줣 +줣 +줣 + +줤 +줤 +줤 +줤 +줤 + +줥 +줥 +줥 +줥 +줥 + +줦 +줦 +줦 +줦 +줦 + +줧 +줧 +줧 +줧 +줧 + +줨 +줨 +줨 +줨 +줨 + +줩 +줩 +줩 +줩 +줩 + +줪 +줪 +줪 +줪 +줪 + +줫 +줫 +줫 +줫 +줫 + +줬 +줬 +줬 +줬 +줬 + +줭 +줭 +줭 +줭 +줭 + +줮 +줮 +줮 +줮 +줮 + +줯 +줯 +줯 +줯 +줯 + +줰 +줰 +줰 +줰 +줰 + +줱 +줱 +줱 +줱 +줱 + +줲 +줲 +줲 +줲 +줲 + +줳 +줳 +줳 +줳 +줳 + +줴 +줴 +줴 +줴 +줴 + +줵 +줵 +줵 +줵 +줵 + +줶 +줶 +줶 +줶 +줶 + +줷 +줷 +줷 +줷 +줷 + +줸 +줸 +줸 +줸 +줸 + +줹 +줹 +줹 +줹 +줹 + +줺 +줺 +줺 +줺 +줺 + +줻 +줻 +줻 +줻 +줻 + +줼 +줼 +줼 +줼 +줼 + +줽 +줽 +줽 +줽 +줽 + +줾 +줾 +줾 +줾 +줾 + +줿 +줿 +줿 +줿 +줿 + +쥀 +쥀 +쥀 +쥀 +쥀 + +쥁 +쥁 +쥁 +쥁 +쥁 + +쥂 +쥂 +쥂 +쥂 +쥂 + +쥃 +쥃 +쥃 +쥃 +쥃 + +쥄 +쥄 +쥄 +쥄 +쥄 + +쥅 +쥅 +쥅 +쥅 +쥅 + +쥆 +쥆 +쥆 +쥆 +쥆 + +쥇 +쥇 +쥇 +쥇 +쥇 + +쥈 +쥈 +쥈 +쥈 +쥈 + +쥉 +쥉 +쥉 +쥉 +쥉 + +쥊 +쥊 +쥊 +쥊 +쥊 + +쥋 +쥋 +쥋 +쥋 +쥋 + +쥌 +쥌 +쥌 +쥌 +쥌 + +쥍 +쥍 +쥍 +쥍 +쥍 + +쥎 +쥎 +쥎 +쥎 +쥎 + +쥏 +쥏 +쥏 +쥏 +쥏 + +쥐 +쥐 +쥐 +쥐 +쥐 + +쥑 +쥑 +쥑 +쥑 +쥑 + +쥒 +쥒 +쥒 +쥒 +쥒 + +쥓 +쥓 +쥓 +쥓 +쥓 + +쥔 +쥔 +쥔 +쥔 +쥔 + +쥕 +쥕 +쥕 +쥕 +쥕 + +쥖 +쥖 +쥖 +쥖 +쥖 + +쥗 +쥗 +쥗 +쥗 +쥗 + +쥘 +쥘 +쥘 +쥘 +쥘 + +쥙 +쥙 +쥙 +쥙 +쥙 + +쥚 +쥚 +쥚 +쥚 +쥚 + +쥛 +쥛 +쥛 +쥛 +쥛 + +쥜 +쥜 +쥜 +쥜 +쥜 + +쥝 +쥝 +쥝 +쥝 +쥝 + +쥞 +쥞 +쥞 +쥞 +쥞 + +쥟 +쥟 +쥟 +쥟 +쥟 + +쥠 +쥠 +쥠 +쥠 +쥠 + +쥡 +쥡 +쥡 +쥡 +쥡 + +쥢 +쥢 +쥢 +쥢 +쥢 + +쥣 +쥣 +쥣 +쥣 +쥣 + +쥤 +쥤 +쥤 +쥤 +쥤 + +쥥 +쥥 +쥥 +쥥 +쥥 + +쥦 +쥦 +쥦 +쥦 +쥦 + +쥧 +쥧 +쥧 +쥧 +쥧 + +쥨 +쥨 +쥨 +쥨 +쥨 + +쥩 +쥩 +쥩 +쥩 +쥩 + +쥪 +쥪 +쥪 +쥪 +쥪 + +쥫 +쥫 +쥫 +쥫 +쥫 + +쥬 +쥬 +쥬 +쥬 +쥬 + +쥭 +쥭 +쥭 +쥭 +쥭 + +쥮 +쥮 +쥮 +쥮 +쥮 + +쥯 +쥯 +쥯 +쥯 +쥯 + +쥰 +쥰 +쥰 +쥰 +쥰 + +쥱 +쥱 +쥱 +쥱 +쥱 + +쥲 +쥲 +쥲 +쥲 +쥲 + +쥳 +쥳 +쥳 +쥳 +쥳 + +쥴 +쥴 +쥴 +쥴 +쥴 + +쥵 +쥵 +쥵 +쥵 +쥵 + +쥶 +쥶 +쥶 +쥶 +쥶 + +쥷 +쥷 +쥷 +쥷 +쥷 + +쥸 +쥸 +쥸 +쥸 +쥸 + +쥹 +쥹 +쥹 +쥹 +쥹 + +쥺 +쥺 +쥺 +쥺 +쥺 + +쥻 +쥻 +쥻 +쥻 +쥻 + +쥼 +쥼 +쥼 +쥼 +쥼 + +쥽 +쥽 +쥽 +쥽 +쥽 + +쥾 +쥾 +쥾 +쥾 +쥾 + +쥿 +쥿 +쥿 +쥿 +쥿 + +즀 +즀 +즀 +즀 +즀 + +즁 +즁 +즁 +즁 +즁 + +즂 +즂 +즂 +즂 +즂 + +즃 +즃 +즃 +즃 +즃 + +즄 +즄 +즄 +즄 +즄 + +즅 +즅 +즅 +즅 +즅 + +즆 +즆 +즆 +즆 +즆 + +즇 +즇 +즇 +즇 +즇 + +즈 +즈 +즈 +즈 +즈 + +즉 +즉 +즉 +즉 +즉 + +즊 +즊 +즊 +즊 +즊 + +즋 +즋 +즋 +즋 +즋 + +즌 +즌 +즌 +즌 +즌 + +즍 +즍 +즍 +즍 +즍 + +즎 +즎 +즎 +즎 +즎 + +즏 +즏 +즏 +즏 +즏 + +즐 +즐 +즐 +즐 +즐 + +즑 +즑 +즑 +즑 +즑 + +즒 +즒 +즒 +즒 +즒 + +즓 +즓 +즓 +즓 +즓 + +즔 +즔 +즔 +즔 +즔 + +즕 +즕 +즕 +즕 +즕 + +즖 +즖 +즖 +즖 +즖 + +즗 +즗 +즗 +즗 +즗 + +즘 +즘 +즘 +즘 +즘 + +즙 +즙 +즙 +즙 +즙 + +즚 +즚 +즚 +즚 +즚 + +즛 +즛 +즛 +즛 +즛 + +즜 +즜 +즜 +즜 +즜 + +증 +증 +증 +증 +증 + +즞 +즞 +즞 +즞 +즞 + +즟 +즟 +즟 +즟 +즟 + +즠 +즠 +즠 +즠 +즠 + +즡 +즡 +즡 +즡 +즡 + +즢 +즢 +즢 +즢 +즢 + +즣 +즣 +즣 +즣 +즣 + +즤 +즤 +즤 +즤 +즤 + +즥 +즥 +즥 +즥 +즥 + +즦 +즦 +즦 +즦 +즦 + +즧 +즧 +즧 +즧 +즧 + +즨 +즨 +즨 +즨 +즨 + +즩 +즩 +즩 +즩 +즩 + +즪 +즪 +즪 +즪 +즪 + +즫 +즫 +즫 +즫 +즫 + +즬 +즬 +즬 +즬 +즬 + +즭 +즭 +즭 +즭 +즭 + +즮 +즮 +즮 +즮 +즮 + +즯 +즯 +즯 +즯 +즯 + +즰 +즰 +즰 +즰 +즰 + +즱 +즱 +즱 +즱 +즱 + +즲 +즲 +즲 +즲 +즲 + +즳 +즳 +즳 +즳 +즳 + +즴 +즴 +즴 +즴 +즴 + +즵 +즵 +즵 +즵 +즵 + +즶 +즶 +즶 +즶 +즶 + +즷 +즷 +즷 +즷 +즷 + +즸 +즸 +즸 +즸 +즸 + +즹 +즹 +즹 +즹 +즹 + +즺 +즺 +즺 +즺 +즺 + +즻 +즻 +즻 +즻 +즻 + +즼 +즼 +즼 +즼 +즼 + +즽 +즽 +즽 +즽 +즽 + +즾 +즾 +즾 +즾 +즾 + +즿 +즿 +즿 +즿 +즿 + +지 +지 +지 +지 +지 + +직 +직 +직 +직 +직 + +짂 +짂 +짂 +짂 +짂 + +짃 +짃 +짃 +짃 +짃 + +진 +진 +진 +진 +진 + +짅 +짅 +짅 +짅 +짅 + +짆 +짆 +짆 +짆 +짆 + +짇 +짇 +짇 +짇 +짇 + +질 +질 +질 +질 +질 + +짉 +짉 +짉 +짉 +짉 + +짊 +짊 +짊 +짊 +짊 + +짋 +짋 +짋 +짋 +짋 + +짌 +짌 +짌 +짌 +짌 + +짍 +짍 +짍 +짍 +짍 + +짎 +짎 +짎 +짎 +짎 + +짏 +짏 +짏 +짏 +짏 + +짐 +짐 +짐 +짐 +짐 + +집 +집 +집 +집 +집 + +짒 +짒 +짒 +짒 +짒 + +짓 +짓 +짓 +짓 +짓 + +짔 +짔 +짔 +짔 +짔 + +징 +징 +징 +징 +징 + +짖 +짖 +짖 +짖 +짖 + +짗 +짗 +짗 +짗 +짗 + +짘 +짘 +짘 +짘 +짘 + +짙 +짙 +짙 +짙 +짙 + +짚 +짚 +짚 +짚 +짚 + +짛 +짛 +짛 +짛 +짛 + +짜 +짜 +짜 +짜 +짜 + +짝 +짝 +짝 +짝 +짝 + +짞 +짞 +짞 +짞 +짞 + +짟 +짟 +짟 +짟 +짟 + +짠 +짠 +짠 +짠 +짠 + +짡 +짡 +짡 +짡 +짡 + +짢 +짢 +짢 +짢 +짢 + +짣 +짣 +짣 +짣 +짣 + +짤 +짤 +짤 +짤 +짤 + +짥 +짥 +짥 +짥 +짥 + +짦 +짦 +짦 +짦 +짦 + +짧 +짧 +짧 +짧 +짧 + +짨 +짨 +짨 +짨 +짨 + +짩 +짩 +짩 +짩 +짩 + +짪 +짪 +짪 +짪 +짪 + +짫 +짫 +짫 +짫 +짫 + +짬 +짬 +짬 +짬 +짬 + +짭 +짭 +짭 +짭 +짭 + +짮 +짮 +짮 +짮 +짮 + +짯 +짯 +짯 +짯 +짯 + +짰 +짰 +짰 +짰 +짰 + +짱 +짱 +짱 +짱 +짱 + +짲 +짲 +짲 +짲 +짲 + +짳 +짳 +짳 +짳 +짳 + +짴 +짴 +짴 +짴 +짴 + +짵 +짵 +짵 +짵 +짵 + +짶 +짶 +짶 +짶 +짶 + +짷 +짷 +짷 +짷 +짷 + +째 +째 +째 +째 +째 + +짹 +짹 +짹 +짹 +짹 + +짺 +짺 +짺 +짺 +짺 + +짻 +짻 +짻 +짻 +짻 + +짼 +짼 +짼 +짼 +짼 + +짽 +짽 +짽 +짽 +짽 + +짾 +짾 +짾 +짾 +짾 + +짿 +짿 +짿 +짿 +짿 + +쨀 +쨀 +쨀 +쨀 +쨀 + +쨁 +쨁 +쨁 +쨁 +쨁 + +쨂 +쨂 +쨂 +쨂 +쨂 + +쨃 +쨃 +쨃 +쨃 +쨃 + +쨄 +쨄 +쨄 +쨄 +쨄 + +쨅 +쨅 +쨅 +쨅 +쨅 + +쨆 +쨆 +쨆 +쨆 +쨆 + +쨇 +쨇 +쨇 +쨇 +쨇 + +쨈 +쨈 +쨈 +쨈 +쨈 + +쨉 +쨉 +쨉 +쨉 +쨉 + +쨊 +쨊 +쨊 +쨊 +쨊 + +쨋 +쨋 +쨋 +쨋 +쨋 + +쨌 +쨌 +쨌 +쨌 +쨌 + +쨍 +쨍 +쨍 +쨍 +쨍 + +쨎 +쨎 +쨎 +쨎 +쨎 + +쨏 +쨏 +쨏 +쨏 +쨏 + +쨐 +쨐 +쨐 +쨐 +쨐 + +쨑 +쨑 +쨑 +쨑 +쨑 + +쨒 +쨒 +쨒 +쨒 +쨒 + +쨓 +쨓 +쨓 +쨓 +쨓 + +쨔 +쨔 +쨔 +쨔 +쨔 + +쨕 +쨕 +쨕 +쨕 +쨕 + +쨖 +쨖 +쨖 +쨖 +쨖 + +쨗 +쨗 +쨗 +쨗 +쨗 + +쨘 +쨘 +쨘 +쨘 +쨘 + +쨙 +쨙 +쨙 +쨙 +쨙 + +쨚 +쨚 +쨚 +쨚 +쨚 + +쨛 +쨛 +쨛 +쨛 +쨛 + +쨜 +쨜 +쨜 +쨜 +쨜 + +쨝 +쨝 +쨝 +쨝 +쨝 + +쨞 +쨞 +쨞 +쨞 +쨞 + +쨟 +쨟 +쨟 +쨟 +쨟 + +쨠 +쨠 +쨠 +쨠 +쨠 + +쨡 +쨡 +쨡 +쨡 +쨡 + +쨢 +쨢 +쨢 +쨢 +쨢 + +쨣 +쨣 +쨣 +쨣 +쨣 + +쨤 +쨤 +쨤 +쨤 +쨤 + +쨥 +쨥 +쨥 +쨥 +쨥 + +쨦 +쨦 +쨦 +쨦 +쨦 + +쨧 +쨧 +쨧 +쨧 +쨧 + +쨨 +쨨 +쨨 +쨨 +쨨 + +쨩 +쨩 +쨩 +쨩 +쨩 + +쨪 +쨪 +쨪 +쨪 +쨪 + +쨫 +쨫 +쨫 +쨫 +쨫 + +쨬 +쨬 +쨬 +쨬 +쨬 + +쨭 +쨭 +쨭 +쨭 +쨭 + +쨮 +쨮 +쨮 +쨮 +쨮 + +쨯 +쨯 +쨯 +쨯 +쨯 + +쨰 +쨰 +쨰 +쨰 +쨰 + +쨱 +쨱 +쨱 +쨱 +쨱 + +쨲 +쨲 +쨲 +쨲 +쨲 + +쨳 +쨳 +쨳 +쨳 +쨳 + +쨴 +쨴 +쨴 +쨴 +쨴 + +쨵 +쨵 +쨵 +쨵 +쨵 + +쨶 +쨶 +쨶 +쨶 +쨶 + +쨷 +쨷 +쨷 +쨷 +쨷 + +쨸 +쨸 +쨸 +쨸 +쨸 + +쨹 +쨹 +쨹 +쨹 +쨹 + +쨺 +쨺 +쨺 +쨺 +쨺 + +쨻 +쨻 +쨻 +쨻 +쨻 + +쨼 +쨼 +쨼 +쨼 +쨼 + +쨽 +쨽 +쨽 +쨽 +쨽 + +쨾 +쨾 +쨾 +쨾 +쨾 + +쨿 +쨿 +쨿 +쨿 +쨿 + +쩀 +쩀 +쩀 +쩀 +쩀 + +쩁 +쩁 +쩁 +쩁 +쩁 + +쩂 +쩂 +쩂 +쩂 +쩂 + +쩃 +쩃 +쩃 +쩃 +쩃 + +쩄 +쩄 +쩄 +쩄 +쩄 + +쩅 +쩅 +쩅 +쩅 +쩅 + +쩆 +쩆 +쩆 +쩆 +쩆 + +쩇 +쩇 +쩇 +쩇 +쩇 + +쩈 +쩈 +쩈 +쩈 +쩈 + +쩉 +쩉 +쩉 +쩉 +쩉 + +쩊 +쩊 +쩊 +쩊 +쩊 + +쩋 +쩋 +쩋 +쩋 +쩋 + +쩌 +쩌 +쩌 +쩌 +쩌 + +쩍 +쩍 +쩍 +쩍 +쩍 + +쩎 +쩎 +쩎 +쩎 +쩎 + +쩏 +쩏 +쩏 +쩏 +쩏 + +쩐 +쩐 +쩐 +쩐 +쩐 + +쩑 +쩑 +쩑 +쩑 +쩑 + +쩒 +쩒 +쩒 +쩒 +쩒 + +쩓 +쩓 +쩓 +쩓 +쩓 + +쩔 +쩔 +쩔 +쩔 +쩔 + +쩕 +쩕 +쩕 +쩕 +쩕 + +쩖 +쩖 +쩖 +쩖 +쩖 + +쩗 +쩗 +쩗 +쩗 +쩗 + +쩘 +쩘 +쩘 +쩘 +쩘 + +쩙 +쩙 +쩙 +쩙 +쩙 + +쩚 +쩚 +쩚 +쩚 +쩚 + +쩛 +쩛 +쩛 +쩛 +쩛 + +쩜 +쩜 +쩜 +쩜 +쩜 + +쩝 +쩝 +쩝 +쩝 +쩝 + +쩞 +쩞 +쩞 +쩞 +쩞 + +쩟 +쩟 +쩟 +쩟 +쩟 + +쩠 +쩠 +쩠 +쩠 +쩠 + +쩡 +쩡 +쩡 +쩡 +쩡 + +쩢 +쩢 +쩢 +쩢 +쩢 + +쩣 +쩣 +쩣 +쩣 +쩣 + +쩤 +쩤 +쩤 +쩤 +쩤 + +쩥 +쩥 +쩥 +쩥 +쩥 + +쩦 +쩦 +쩦 +쩦 +쩦 + +쩧 +쩧 +쩧 +쩧 +쩧 + +쩨 +쩨 +쩨 +쩨 +쩨 + +쩩 +쩩 +쩩 +쩩 +쩩 + +쩪 +쩪 +쩪 +쩪 +쩪 + +쩫 +쩫 +쩫 +쩫 +쩫 + +쩬 +쩬 +쩬 +쩬 +쩬 + +쩭 +쩭 +쩭 +쩭 +쩭 + +쩮 +쩮 +쩮 +쩮 +쩮 + +쩯 +쩯 +쩯 +쩯 +쩯 + +쩰 +쩰 +쩰 +쩰 +쩰 + +쩱 +쩱 +쩱 +쩱 +쩱 + +쩲 +쩲 +쩲 +쩲 +쩲 + +쩳 +쩳 +쩳 +쩳 +쩳 + +쩴 +쩴 +쩴 +쩴 +쩴 + +쩵 +쩵 +쩵 +쩵 +쩵 + +쩶 +쩶 +쩶 +쩶 +쩶 + +쩷 +쩷 +쩷 +쩷 +쩷 + +쩸 +쩸 +쩸 +쩸 +쩸 + +쩹 +쩹 +쩹 +쩹 +쩹 + +쩺 +쩺 +쩺 +쩺 +쩺 + +쩻 +쩻 +쩻 +쩻 +쩻 + +쩼 +쩼 +쩼 +쩼 +쩼 + +쩽 +쩽 +쩽 +쩽 +쩽 + +쩾 +쩾 +쩾 +쩾 +쩾 + +쩿 +쩿 +쩿 +쩿 +쩿 + +쪀 +쪀 +쪀 +쪀 +쪀 + +쪁 +쪁 +쪁 +쪁 +쪁 + +쪂 +쪂 +쪂 +쪂 +쪂 + +쪃 +쪃 +쪃 +쪃 +쪃 + +쪄 +쪄 +쪄 +쪄 +쪄 + +쪅 +쪅 +쪅 +쪅 +쪅 + +쪆 +쪆 +쪆 +쪆 +쪆 + +쪇 +쪇 +쪇 +쪇 +쪇 + +쪈 +쪈 +쪈 +쪈 +쪈 + +쪉 +쪉 +쪉 +쪉 +쪉 + +쪊 +쪊 +쪊 +쪊 +쪊 + +쪋 +쪋 +쪋 +쪋 +쪋 + +쪌 +쪌 +쪌 +쪌 +쪌 + +쪍 +쪍 +쪍 +쪍 +쪍 + +쪎 +쪎 +쪎 +쪎 +쪎 + +쪏 +쪏 +쪏 +쪏 +쪏 + +쪐 +쪐 +쪐 +쪐 +쪐 + +쪑 +쪑 +쪑 +쪑 +쪑 + +쪒 +쪒 +쪒 +쪒 +쪒 + +쪓 +쪓 +쪓 +쪓 +쪓 + +쪔 +쪔 +쪔 +쪔 +쪔 + +쪕 +쪕 +쪕 +쪕 +쪕 + +쪖 +쪖 +쪖 +쪖 +쪖 + +쪗 +쪗 +쪗 +쪗 +쪗 + +쪘 +쪘 +쪘 +쪘 +쪘 + +쪙 +쪙 +쪙 +쪙 +쪙 + +쪚 +쪚 +쪚 +쪚 +쪚 + +쪛 +쪛 +쪛 +쪛 +쪛 + +쪜 +쪜 +쪜 +쪜 +쪜 + +쪝 +쪝 +쪝 +쪝 +쪝 + +쪞 +쪞 +쪞 +쪞 +쪞 + +쪟 +쪟 +쪟 +쪟 +쪟 + +쪠 +쪠 +쪠 +쪠 +쪠 + +쪡 +쪡 +쪡 +쪡 +쪡 + +쪢 +쪢 +쪢 +쪢 +쪢 + +쪣 +쪣 +쪣 +쪣 +쪣 + +쪤 +쪤 +쪤 +쪤 +쪤 + +쪥 +쪥 +쪥 +쪥 +쪥 + +쪦 +쪦 +쪦 +쪦 +쪦 + +쪧 +쪧 +쪧 +쪧 +쪧 + +쪨 +쪨 +쪨 +쪨 +쪨 + +쪩 +쪩 +쪩 +쪩 +쪩 + +쪪 +쪪 +쪪 +쪪 +쪪 + +쪫 +쪫 +쪫 +쪫 +쪫 + +쪬 +쪬 +쪬 +쪬 +쪬 + +쪭 +쪭 +쪭 +쪭 +쪭 + +쪮 +쪮 +쪮 +쪮 +쪮 + +쪯 +쪯 +쪯 +쪯 +쪯 + +쪰 +쪰 +쪰 +쪰 +쪰 + +쪱 +쪱 +쪱 +쪱 +쪱 + +쪲 +쪲 +쪲 +쪲 +쪲 + +쪳 +쪳 +쪳 +쪳 +쪳 + +쪴 +쪴 +쪴 +쪴 +쪴 + +쪵 +쪵 +쪵 +쪵 +쪵 + +쪶 +쪶 +쪶 +쪶 +쪶 + +쪷 +쪷 +쪷 +쪷 +쪷 + +쪸 +쪸 +쪸 +쪸 +쪸 + +쪹 +쪹 +쪹 +쪹 +쪹 + +쪺 +쪺 +쪺 +쪺 +쪺 + +쪻 +쪻 +쪻 +쪻 +쪻 + +쪼 +쪼 +쪼 +쪼 +쪼 + +쪽 +쪽 +쪽 +쪽 +쪽 + +쪾 +쪾 +쪾 +쪾 +쪾 + +쪿 +쪿 +쪿 +쪿 +쪿 + +쫀 +쫀 +쫀 +쫀 +쫀 + +쫁 +쫁 +쫁 +쫁 +쫁 + +쫂 +쫂 +쫂 +쫂 +쫂 + +쫃 +쫃 +쫃 +쫃 +쫃 + +쫄 +쫄 +쫄 +쫄 +쫄 + +쫅 +쫅 +쫅 +쫅 +쫅 + +쫆 +쫆 +쫆 +쫆 +쫆 + +쫇 +쫇 +쫇 +쫇 +쫇 + +쫈 +쫈 +쫈 +쫈 +쫈 + +쫉 +쫉 +쫉 +쫉 +쫉 + +쫊 +쫊 +쫊 +쫊 +쫊 + +쫋 +쫋 +쫋 +쫋 +쫋 + +쫌 +쫌 +쫌 +쫌 +쫌 + +쫍 +쫍 +쫍 +쫍 +쫍 + +쫎 +쫎 +쫎 +쫎 +쫎 + +쫏 +쫏 +쫏 +쫏 +쫏 + +쫐 +쫐 +쫐 +쫐 +쫐 + +쫑 +쫑 +쫑 +쫑 +쫑 + +쫒 +쫒 +쫒 +쫒 +쫒 + +쫓 +쫓 +쫓 +쫓 +쫓 + +쫔 +쫔 +쫔 +쫔 +쫔 + +쫕 +쫕 +쫕 +쫕 +쫕 + +쫖 +쫖 +쫖 +쫖 +쫖 + +쫗 +쫗 +쫗 +쫗 +쫗 + +쫘 +쫘 +쫘 +쫘 +쫘 + +쫙 +쫙 +쫙 +쫙 +쫙 + +쫚 +쫚 +쫚 +쫚 +쫚 + +쫛 +쫛 +쫛 +쫛 +쫛 + +쫜 +쫜 +쫜 +쫜 +쫜 + +쫝 +쫝 +쫝 +쫝 +쫝 + +쫞 +쫞 +쫞 +쫞 +쫞 + +쫟 +쫟 +쫟 +쫟 +쫟 + +쫠 +쫠 +쫠 +쫠 +쫠 + +쫡 +쫡 +쫡 +쫡 +쫡 + +쫢 +쫢 +쫢 +쫢 +쫢 + +쫣 +쫣 +쫣 +쫣 +쫣 + +쫤 +쫤 +쫤 +쫤 +쫤 + +쫥 +쫥 +쫥 +쫥 +쫥 + +쫦 +쫦 +쫦 +쫦 +쫦 + +쫧 +쫧 +쫧 +쫧 +쫧 + +쫨 +쫨 +쫨 +쫨 +쫨 + +쫩 +쫩 +쫩 +쫩 +쫩 + +쫪 +쫪 +쫪 +쫪 +쫪 + +쫫 +쫫 +쫫 +쫫 +쫫 + +쫬 +쫬 +쫬 +쫬 +쫬 + +쫭 +쫭 +쫭 +쫭 +쫭 + +쫮 +쫮 +쫮 +쫮 +쫮 + +쫯 +쫯 +쫯 +쫯 +쫯 + +쫰 +쫰 +쫰 +쫰 +쫰 + +쫱 +쫱 +쫱 +쫱 +쫱 + +쫲 +쫲 +쫲 +쫲 +쫲 + +쫳 +쫳 +쫳 +쫳 +쫳 + +쫴 +쫴 +쫴 +쫴 +쫴 + +쫵 +쫵 +쫵 +쫵 +쫵 + +쫶 +쫶 +쫶 +쫶 +쫶 + +쫷 +쫷 +쫷 +쫷 +쫷 + +쫸 +쫸 +쫸 +쫸 +쫸 + +쫹 +쫹 +쫹 +쫹 +쫹 + +쫺 +쫺 +쫺 +쫺 +쫺 + +쫻 +쫻 +쫻 +쫻 +쫻 + +쫼 +쫼 +쫼 +쫼 +쫼 + +쫽 +쫽 +쫽 +쫽 +쫽 + +쫾 +쫾 +쫾 +쫾 +쫾 + +쫿 +쫿 +쫿 +쫿 +쫿 + +쬀 +쬀 +쬀 +쬀 +쬀 + +쬁 +쬁 +쬁 +쬁 +쬁 + +쬂 +쬂 +쬂 +쬂 +쬂 + +쬃 +쬃 +쬃 +쬃 +쬃 + +쬄 +쬄 +쬄 +쬄 +쬄 + +쬅 +쬅 +쬅 +쬅 +쬅 + +쬆 +쬆 +쬆 +쬆 +쬆 + +쬇 +쬇 +쬇 +쬇 +쬇 + +쬈 +쬈 +쬈 +쬈 +쬈 + +쬉 +쬉 +쬉 +쬉 +쬉 + +쬊 +쬊 +쬊 +쬊 +쬊 + +쬋 +쬋 +쬋 +쬋 +쬋 + +쬌 +쬌 +쬌 +쬌 +쬌 + +쬍 +쬍 +쬍 +쬍 +쬍 + +쬎 +쬎 +쬎 +쬎 +쬎 + +쬏 +쬏 +쬏 +쬏 +쬏 + +쬐 +쬐 +쬐 +쬐 +쬐 + +쬑 +쬑 +쬑 +쬑 +쬑 + +쬒 +쬒 +쬒 +쬒 +쬒 + +쬓 +쬓 +쬓 +쬓 +쬓 + +쬔 +쬔 +쬔 +쬔 +쬔 + +쬕 +쬕 +쬕 +쬕 +쬕 + +쬖 +쬖 +쬖 +쬖 +쬖 + +쬗 +쬗 +쬗 +쬗 +쬗 + +쬘 +쬘 +쬘 +쬘 +쬘 + +쬙 +쬙 +쬙 +쬙 +쬙 + +쬚 +쬚 +쬚 +쬚 +쬚 + +쬛 +쬛 +쬛 +쬛 +쬛 + +쬜 +쬜 +쬜 +쬜 +쬜 + +쬝 +쬝 +쬝 +쬝 +쬝 + +쬞 +쬞 +쬞 +쬞 +쬞 + +쬟 +쬟 +쬟 +쬟 +쬟 + +쬠 +쬠 +쬠 +쬠 +쬠 + +쬡 +쬡 +쬡 +쬡 +쬡 + +쬢 +쬢 +쬢 +쬢 +쬢 + +쬣 +쬣 +쬣 +쬣 +쬣 + +쬤 +쬤 +쬤 +쬤 +쬤 + +쬥 +쬥 +쬥 +쬥 +쬥 + +쬦 +쬦 +쬦 +쬦 +쬦 + +쬧 +쬧 +쬧 +쬧 +쬧 + +쬨 +쬨 +쬨 +쬨 +쬨 + +쬩 +쬩 +쬩 +쬩 +쬩 + +쬪 +쬪 +쬪 +쬪 +쬪 + +쬫 +쬫 +쬫 +쬫 +쬫 + +쬬 +쬬 +쬬 +쬬 +쬬 + +쬭 +쬭 +쬭 +쬭 +쬭 + +쬮 +쬮 +쬮 +쬮 +쬮 + +쬯 +쬯 +쬯 +쬯 +쬯 + +쬰 +쬰 +쬰 +쬰 +쬰 + +쬱 +쬱 +쬱 +쬱 +쬱 + +쬲 +쬲 +쬲 +쬲 +쬲 + +쬳 +쬳 +쬳 +쬳 +쬳 + +쬴 +쬴 +쬴 +쬴 +쬴 + +쬵 +쬵 +쬵 +쬵 +쬵 + +쬶 +쬶 +쬶 +쬶 +쬶 + +쬷 +쬷 +쬷 +쬷 +쬷 + +쬸 +쬸 +쬸 +쬸 +쬸 + +쬹 +쬹 +쬹 +쬹 +쬹 + +쬺 +쬺 +쬺 +쬺 +쬺 + +쬻 +쬻 +쬻 +쬻 +쬻 + +쬼 +쬼 +쬼 +쬼 +쬼 + +쬽 +쬽 +쬽 +쬽 +쬽 + +쬾 +쬾 +쬾 +쬾 +쬾 + +쬿 +쬿 +쬿 +쬿 +쬿 + +쭀 +쭀 +쭀 +쭀 +쭀 + +쭁 +쭁 +쭁 +쭁 +쭁 + +쭂 +쭂 +쭂 +쭂 +쭂 + +쭃 +쭃 +쭃 +쭃 +쭃 + +쭄 +쭄 +쭄 +쭄 +쭄 + +쭅 +쭅 +쭅 +쭅 +쭅 + +쭆 +쭆 +쭆 +쭆 +쭆 + +쭇 +쭇 +쭇 +쭇 +쭇 + +쭈 +쭈 +쭈 +쭈 +쭈 + +쭉 +쭉 +쭉 +쭉 +쭉 + +쭊 +쭊 +쭊 +쭊 +쭊 + +쭋 +쭋 +쭋 +쭋 +쭋 + +쭌 +쭌 +쭌 +쭌 +쭌 + +쭍 +쭍 +쭍 +쭍 +쭍 + +쭎 +쭎 +쭎 +쭎 +쭎 + +쭏 +쭏 +쭏 +쭏 +쭏 + +쭐 +쭐 +쭐 +쭐 +쭐 + +쭑 +쭑 +쭑 +쭑 +쭑 + +쭒 +쭒 +쭒 +쭒 +쭒 + +쭓 +쭓 +쭓 +쭓 +쭓 + +쭔 +쭔 +쭔 +쭔 +쭔 + +쭕 +쭕 +쭕 +쭕 +쭕 + +쭖 +쭖 +쭖 +쭖 +쭖 + +쭗 +쭗 +쭗 +쭗 +쭗 + +쭘 +쭘 +쭘 +쭘 +쭘 + +쭙 +쭙 +쭙 +쭙 +쭙 + +쭚 +쭚 +쭚 +쭚 +쭚 + +쭛 +쭛 +쭛 +쭛 +쭛 + +쭜 +쭜 +쭜 +쭜 +쭜 + +쭝 +쭝 +쭝 +쭝 +쭝 + +쭞 +쭞 +쭞 +쭞 +쭞 + +쭟 +쭟 +쭟 +쭟 +쭟 + +쭠 +쭠 +쭠 +쭠 +쭠 + +쭡 +쭡 +쭡 +쭡 +쭡 + +쭢 +쭢 +쭢 +쭢 +쭢 + +쭣 +쭣 +쭣 +쭣 +쭣 + +쭤 +쭤 +쭤 +쭤 +쭤 + +쭥 +쭥 +쭥 +쭥 +쭥 + +쭦 +쭦 +쭦 +쭦 +쭦 + +쭧 +쭧 +쭧 +쭧 +쭧 + +쭨 +쭨 +쭨 +쭨 +쭨 + +쭩 +쭩 +쭩 +쭩 +쭩 + +쭪 +쭪 +쭪 +쭪 +쭪 + +쭫 +쭫 +쭫 +쭫 +쭫 + +쭬 +쭬 +쭬 +쭬 +쭬 + +쭭 +쭭 +쭭 +쭭 +쭭 + +쭮 +쭮 +쭮 +쭮 +쭮 + +쭯 +쭯 +쭯 +쭯 +쭯 + +쭰 +쭰 +쭰 +쭰 +쭰 + +쭱 +쭱 +쭱 +쭱 +쭱 + +쭲 +쭲 +쭲 +쭲 +쭲 + +쭳 +쭳 +쭳 +쭳 +쭳 + +쭴 +쭴 +쭴 +쭴 +쭴 + +쭵 +쭵 +쭵 +쭵 +쭵 + +쭶 +쭶 +쭶 +쭶 +쭶 + +쭷 +쭷 +쭷 +쭷 +쭷 + +쭸 +쭸 +쭸 +쭸 +쭸 + +쭹 +쭹 +쭹 +쭹 +쭹 + +쭺 +쭺 +쭺 +쭺 +쭺 + +쭻 +쭻 +쭻 +쭻 +쭻 + +쭼 +쭼 +쭼 +쭼 +쭼 + +쭽 +쭽 +쭽 +쭽 +쭽 + +쭾 +쭾 +쭾 +쭾 +쭾 + +쭿 +쭿 +쭿 +쭿 +쭿 + +쮀 +쮀 +쮀 +쮀 +쮀 + +쮁 +쮁 +쮁 +쮁 +쮁 + +쮂 +쮂 +쮂 +쮂 +쮂 + +쮃 +쮃 +쮃 +쮃 +쮃 + +쮄 +쮄 +쮄 +쮄 +쮄 + +쮅 +쮅 +쮅 +쮅 +쮅 + +쮆 +쮆 +쮆 +쮆 +쮆 + +쮇 +쮇 +쮇 +쮇 +쮇 + +쮈 +쮈 +쮈 +쮈 +쮈 + +쮉 +쮉 +쮉 +쮉 +쮉 + +쮊 +쮊 +쮊 +쮊 +쮊 + +쮋 +쮋 +쮋 +쮋 +쮋 + +쮌 +쮌 +쮌 +쮌 +쮌 + +쮍 +쮍 +쮍 +쮍 +쮍 + +쮎 +쮎 +쮎 +쮎 +쮎 + +쮏 +쮏 +쮏 +쮏 +쮏 + +쮐 +쮐 +쮐 +쮐 +쮐 + +쮑 +쮑 +쮑 +쮑 +쮑 + +쮒 +쮒 +쮒 +쮒 +쮒 + +쮓 +쮓 +쮓 +쮓 +쮓 + +쮔 +쮔 +쮔 +쮔 +쮔 + +쮕 +쮕 +쮕 +쮕 +쮕 + +쮖 +쮖 +쮖 +쮖 +쮖 + +쮗 +쮗 +쮗 +쮗 +쮗 + +쮘 +쮘 +쮘 +쮘 +쮘 + +쮙 +쮙 +쮙 +쮙 +쮙 + +쮚 +쮚 +쮚 +쮚 +쮚 + +쮛 +쮛 +쮛 +쮛 +쮛 + +쮜 +쮜 +쮜 +쮜 +쮜 + +쮝 +쮝 +쮝 +쮝 +쮝 + +쮞 +쮞 +쮞 +쮞 +쮞 + +쮟 +쮟 +쮟 +쮟 +쮟 + +쮠 +쮠 +쮠 +쮠 +쮠 + +쮡 +쮡 +쮡 +쮡 +쮡 + +쮢 +쮢 +쮢 +쮢 +쮢 + +쮣 +쮣 +쮣 +쮣 +쮣 + +쮤 +쮤 +쮤 +쮤 +쮤 + +쮥 +쮥 +쮥 +쮥 +쮥 + +쮦 +쮦 +쮦 +쮦 +쮦 + +쮧 +쮧 +쮧 +쮧 +쮧 + +쮨 +쮨 +쮨 +쮨 +쮨 + +쮩 +쮩 +쮩 +쮩 +쮩 + +쮪 +쮪 +쮪 +쮪 +쮪 + +쮫 +쮫 +쮫 +쮫 +쮫 + +쮬 +쮬 +쮬 +쮬 +쮬 + +쮭 +쮭 +쮭 +쮭 +쮭 + +쮮 +쮮 +쮮 +쮮 +쮮 + +쮯 +쮯 +쮯 +쮯 +쮯 + +쮰 +쮰 +쮰 +쮰 +쮰 + +쮱 +쮱 +쮱 +쮱 +쮱 + +쮲 +쮲 +쮲 +쮲 +쮲 + +쮳 +쮳 +쮳 +쮳 +쮳 + +쮴 +쮴 +쮴 +쮴 +쮴 + +쮵 +쮵 +쮵 +쮵 +쮵 + +쮶 +쮶 +쮶 +쮶 +쮶 + +쮷 +쮷 +쮷 +쮷 +쮷 + +쮸 +쮸 +쮸 +쮸 +쮸 + +쮹 +쮹 +쮹 +쮹 +쮹 + +쮺 +쮺 +쮺 +쮺 +쮺 + +쮻 +쮻 +쮻 +쮻 +쮻 + +쮼 +쮼 +쮼 +쮼 +쮼 + +쮽 +쮽 +쮽 +쮽 +쮽 + +쮾 +쮾 +쮾 +쮾 +쮾 + +쮿 +쮿 +쮿 +쮿 +쮿 + +쯀 +쯀 +쯀 +쯀 +쯀 + +쯁 +쯁 +쯁 +쯁 +쯁 + +쯂 +쯂 +쯂 +쯂 +쯂 + +쯃 +쯃 +쯃 +쯃 +쯃 + +쯄 +쯄 +쯄 +쯄 +쯄 + +쯅 +쯅 +쯅 +쯅 +쯅 + +쯆 +쯆 +쯆 +쯆 +쯆 + +쯇 +쯇 +쯇 +쯇 +쯇 + +쯈 +쯈 +쯈 +쯈 +쯈 + +쯉 +쯉 +쯉 +쯉 +쯉 + +쯊 +쯊 +쯊 +쯊 +쯊 + +쯋 +쯋 +쯋 +쯋 +쯋 + +쯌 +쯌 +쯌 +쯌 +쯌 + +쯍 +쯍 +쯍 +쯍 +쯍 + +쯎 +쯎 +쯎 +쯎 +쯎 + +쯏 +쯏 +쯏 +쯏 +쯏 + +쯐 +쯐 +쯐 +쯐 +쯐 + +쯑 +쯑 +쯑 +쯑 +쯑 + +쯒 +쯒 +쯒 +쯒 +쯒 + +쯓 +쯓 +쯓 +쯓 +쯓 + +쯔 +쯔 +쯔 +쯔 +쯔 + +쯕 +쯕 +쯕 +쯕 +쯕 + +쯖 +쯖 +쯖 +쯖 +쯖 + +쯗 +쯗 +쯗 +쯗 +쯗 + +쯘 +쯘 +쯘 +쯘 +쯘 + +쯙 +쯙 +쯙 +쯙 +쯙 + +쯚 +쯚 +쯚 +쯚 +쯚 + +쯛 +쯛 +쯛 +쯛 +쯛 + +쯜 +쯜 +쯜 +쯜 +쯜 + +쯝 +쯝 +쯝 +쯝 +쯝 + +쯞 +쯞 +쯞 +쯞 +쯞 + +쯟 +쯟 +쯟 +쯟 +쯟 + +쯠 +쯠 +쯠 +쯠 +쯠 + +쯡 +쯡 +쯡 +쯡 +쯡 + +쯢 +쯢 +쯢 +쯢 +쯢 + +쯣 +쯣 +쯣 +쯣 +쯣 + +쯤 +쯤 +쯤 +쯤 +쯤 + +쯥 +쯥 +쯥 +쯥 +쯥 + +쯦 +쯦 +쯦 +쯦 +쯦 + +쯧 +쯧 +쯧 +쯧 +쯧 + +쯨 +쯨 +쯨 +쯨 +쯨 + +쯩 +쯩 +쯩 +쯩 +쯩 + +쯪 +쯪 +쯪 +쯪 +쯪 + +쯫 +쯫 +쯫 +쯫 +쯫 + +쯬 +쯬 +쯬 +쯬 +쯬 + +쯭 +쯭 +쯭 +쯭 +쯭 + +쯮 +쯮 +쯮 +쯮 +쯮 + +쯯 +쯯 +쯯 +쯯 +쯯 + +쯰 +쯰 +쯰 +쯰 +쯰 + +쯱 +쯱 +쯱 +쯱 +쯱 + +쯲 +쯲 +쯲 +쯲 +쯲 + +쯳 +쯳 +쯳 +쯳 +쯳 + +쯴 +쯴 +쯴 +쯴 +쯴 + +쯵 +쯵 +쯵 +쯵 +쯵 + +쯶 +쯶 +쯶 +쯶 +쯶 + +쯷 +쯷 +쯷 +쯷 +쯷 + +쯸 +쯸 +쯸 +쯸 +쯸 + +쯹 +쯹 +쯹 +쯹 +쯹 + +쯺 +쯺 +쯺 +쯺 +쯺 + +쯻 +쯻 +쯻 +쯻 +쯻 + +쯼 +쯼 +쯼 +쯼 +쯼 + +쯽 +쯽 +쯽 +쯽 +쯽 + +쯾 +쯾 +쯾 +쯾 +쯾 + +쯿 +쯿 +쯿 +쯿 +쯿 + +찀 +찀 +찀 +찀 +찀 + +찁 +찁 +찁 +찁 +찁 + +찂 +찂 +찂 +찂 +찂 + +찃 +찃 +찃 +찃 +찃 + +찄 +찄 +찄 +찄 +찄 + +찅 +찅 +찅 +찅 +찅 + +찆 +찆 +찆 +찆 +찆 + +찇 +찇 +찇 +찇 +찇 + +찈 +찈 +찈 +찈 +찈 + +찉 +찉 +찉 +찉 +찉 + +찊 +찊 +찊 +찊 +찊 + +찋 +찋 +찋 +찋 +찋 + +찌 +찌 +찌 +찌 +찌 + +찍 +찍 +찍 +찍 +찍 + +찎 +찎 +찎 +찎 +찎 + +찏 +찏 +찏 +찏 +찏 + +찐 +찐 +찐 +찐 +찐 + +찑 +찑 +찑 +찑 +찑 + +찒 +찒 +찒 +찒 +찒 + +찓 +찓 +찓 +찓 +찓 + +찔 +찔 +찔 +찔 +찔 + +찕 +찕 +찕 +찕 +찕 + +찖 +찖 +찖 +찖 +찖 + +찗 +찗 +찗 +찗 +찗 + +찘 +찘 +찘 +찘 +찘 + +찙 +찙 +찙 +찙 +찙 + +찚 +찚 +찚 +찚 +찚 + +찛 +찛 +찛 +찛 +찛 + +찜 +찜 +찜 +찜 +찜 + +찝 +찝 +찝 +찝 +찝 + +찞 +찞 +찞 +찞 +찞 + +찟 +찟 +찟 +찟 +찟 + +찠 +찠 +찠 +찠 +찠 + +찡 +찡 +찡 +찡 +찡 + +찢 +찢 +찢 +찢 +찢 + +찣 +찣 +찣 +찣 +찣 + +찤 +찤 +찤 +찤 +찤 + +찥 +찥 +찥 +찥 +찥 + +찦 +찦 +찦 +찦 +찦 + +찧 +찧 +찧 +찧 +찧 + +차 +차 +차 +차 +차 + +착 +착 +착 +착 +착 + +찪 +찪 +찪 +찪 +찪 + +찫 +찫 +찫 +찫 +찫 + +찬 +찬 +찬 +찬 +찬 + +찭 +찭 +찭 +찭 +찭 + +찮 +찮 +찮 +찮 +찮 + +찯 +찯 +찯 +찯 +찯 + +찰 +찰 +찰 +찰 +찰 + +찱 +찱 +찱 +찱 +찱 + +찲 +찲 +찲 +찲 +찲 + +찳 +찳 +찳 +찳 +찳 + +찴 +찴 +찴 +찴 +찴 + +찵 +찵 +찵 +찵 +찵 + +찶 +찶 +찶 +찶 +찶 + +찷 +찷 +찷 +찷 +찷 + +참 +참 +참 +참 +참 + +찹 +찹 +찹 +찹 +찹 + +찺 +찺 +찺 +찺 +찺 + +찻 +찻 +찻 +찻 +찻 + +찼 +찼 +찼 +찼 +찼 + +창 +창 +창 +창 +창 + +찾 +찾 +찾 +찾 +찾 + +찿 +찿 +찿 +찿 +찿 + +챀 +챀 +챀 +챀 +챀 + +챁 +챁 +챁 +챁 +챁 + +챂 +챂 +챂 +챂 +챂 + +챃 +챃 +챃 +챃 +챃 + +채 +채 +채 +채 +채 + +책 +책 +책 +책 +책 + +챆 +챆 +챆 +챆 +챆 + +챇 +챇 +챇 +챇 +챇 + +챈 +챈 +챈 +챈 +챈 + +챉 +챉 +챉 +챉 +챉 + +챊 +챊 +챊 +챊 +챊 + +챋 +챋 +챋 +챋 +챋 + +챌 +챌 +챌 +챌 +챌 + +챍 +챍 +챍 +챍 +챍 + +챎 +챎 +챎 +챎 +챎 + +챏 +챏 +챏 +챏 +챏 + +챐 +챐 +챐 +챐 +챐 + +챑 +챑 +챑 +챑 +챑 + +챒 +챒 +챒 +챒 +챒 + +챓 +챓 +챓 +챓 +챓 + +챔 +챔 +챔 +챔 +챔 + +챕 +챕 +챕 +챕 +챕 + +챖 +챖 +챖 +챖 +챖 + +챗 +챗 +챗 +챗 +챗 + +챘 +챘 +챘 +챘 +챘 + +챙 +챙 +챙 +챙 +챙 + +챚 +챚 +챚 +챚 +챚 + +챛 +챛 +챛 +챛 +챛 + +챜 +챜 +챜 +챜 +챜 + +챝 +챝 +챝 +챝 +챝 + +챞 +챞 +챞 +챞 +챞 + +챟 +챟 +챟 +챟 +챟 + +챠 +챠 +챠 +챠 +챠 + +챡 +챡 +챡 +챡 +챡 + +챢 +챢 +챢 +챢 +챢 + +챣 +챣 +챣 +챣 +챣 + +챤 +챤 +챤 +챤 +챤 + +챥 +챥 +챥 +챥 +챥 + +챦 +챦 +챦 +챦 +챦 + +챧 +챧 +챧 +챧 +챧 + +챨 +챨 +챨 +챨 +챨 + +챩 +챩 +챩 +챩 +챩 + +챪 +챪 +챪 +챪 +챪 + +챫 +챫 +챫 +챫 +챫 + +챬 +챬 +챬 +챬 +챬 + +챭 +챭 +챭 +챭 +챭 + +챮 +챮 +챮 +챮 +챮 + +챯 +챯 +챯 +챯 +챯 + +챰 +챰 +챰 +챰 +챰 + +챱 +챱 +챱 +챱 +챱 + +챲 +챲 +챲 +챲 +챲 + +챳 +챳 +챳 +챳 +챳 + +챴 +챴 +챴 +챴 +챴 + +챵 +챵 +챵 +챵 +챵 + +챶 +챶 +챶 +챶 +챶 + +챷 +챷 +챷 +챷 +챷 + +챸 +챸 +챸 +챸 +챸 + +챹 +챹 +챹 +챹 +챹 + +챺 +챺 +챺 +챺 +챺 + +챻 +챻 +챻 +챻 +챻 + +챼 +챼 +챼 +챼 +챼 + +챽 +챽 +챽 +챽 +챽 + +챾 +챾 +챾 +챾 +챾 + +챿 +챿 +챿 +챿 +챿 + +첀 +첀 +첀 +첀 +첀 + +첁 +첁 +첁 +첁 +첁 + +첂 +첂 +첂 +첂 +첂 + +첃 +첃 +첃 +첃 +첃 + +첄 +첄 +첄 +첄 +첄 + +첅 +첅 +첅 +첅 +첅 + +첆 +첆 +첆 +첆 +첆 + +첇 +첇 +첇 +첇 +첇 + +첈 +첈 +첈 +첈 +첈 + +첉 +첉 +첉 +첉 +첉 + +첊 +첊 +첊 +첊 +첊 + +첋 +첋 +첋 +첋 +첋 + +첌 +첌 +첌 +첌 +첌 + +첍 +첍 +첍 +첍 +첍 + +첎 +첎 +첎 +첎 +첎 + +첏 +첏 +첏 +첏 +첏 + +첐 +첐 +첐 +첐 +첐 + +첑 +첑 +첑 +첑 +첑 + +첒 +첒 +첒 +첒 +첒 + +첓 +첓 +첓 +첓 +첓 + +첔 +첔 +첔 +첔 +첔 + +첕 +첕 +첕 +첕 +첕 + +첖 +첖 +첖 +첖 +첖 + +첗 +첗 +첗 +첗 +첗 + +처 +처 +처 +처 +처 + +척 +척 +척 +척 +척 + +첚 +첚 +첚 +첚 +첚 + +첛 +첛 +첛 +첛 +첛 + +천 +천 +천 +천 +천 + +첝 +첝 +첝 +첝 +첝 + +첞 +첞 +첞 +첞 +첞 + +첟 +첟 +첟 +첟 +첟 + +철 +철 +철 +철 +철 + +첡 +첡 +첡 +첡 +첡 + +첢 +첢 +첢 +첢 +첢 + +첣 +첣 +첣 +첣 +첣 + +첤 +첤 +첤 +첤 +첤 + +첥 +첥 +첥 +첥 +첥 + +첦 +첦 +첦 +첦 +첦 + +첧 +첧 +첧 +첧 +첧 + +첨 +첨 +첨 +첨 +첨 + +첩 +첩 +첩 +첩 +첩 + +첪 +첪 +첪 +첪 +첪 + +첫 +첫 +첫 +첫 +첫 + +첬 +첬 +첬 +첬 +첬 + +청 +청 +청 +청 +청 + +첮 +첮 +첮 +첮 +첮 + +첯 +첯 +첯 +첯 +첯 + +첰 +첰 +첰 +첰 +첰 + +첱 +첱 +첱 +첱 +첱 + +첲 +첲 +첲 +첲 +첲 + +첳 +첳 +첳 +첳 +첳 + +체 +체 +체 +체 +체 + +첵 +첵 +첵 +첵 +첵 + +첶 +첶 +첶 +첶 +첶 + +첷 +첷 +첷 +첷 +첷 + +첸 +첸 +첸 +첸 +첸 + +첹 +첹 +첹 +첹 +첹 + +첺 +첺 +첺 +첺 +첺 + +첻 +첻 +첻 +첻 +첻 + +첼 +첼 +첼 +첼 +첼 + +첽 +첽 +첽 +첽 +첽 + +첾 +첾 +첾 +첾 +첾 + +첿 +첿 +첿 +첿 +첿 + +쳀 +쳀 +쳀 +쳀 +쳀 + +쳁 +쳁 +쳁 +쳁 +쳁 + +쳂 +쳂 +쳂 +쳂 +쳂 + +쳃 +쳃 +쳃 +쳃 +쳃 + +쳄 +쳄 +쳄 +쳄 +쳄 + +쳅 +쳅 +쳅 +쳅 +쳅 + +쳆 +쳆 +쳆 +쳆 +쳆 + +쳇 +쳇 +쳇 +쳇 +쳇 + +쳈 +쳈 +쳈 +쳈 +쳈 + +쳉 +쳉 +쳉 +쳉 +쳉 + +쳊 +쳊 +쳊 +쳊 +쳊 + +쳋 +쳋 +쳋 +쳋 +쳋 + +쳌 +쳌 +쳌 +쳌 +쳌 + +쳍 +쳍 +쳍 +쳍 +쳍 + +쳎 +쳎 +쳎 +쳎 +쳎 + +쳏 +쳏 +쳏 +쳏 +쳏 + +쳐 +쳐 +쳐 +쳐 +쳐 + +쳑 +쳑 +쳑 +쳑 +쳑 + +쳒 +쳒 +쳒 +쳒 +쳒 + +쳓 +쳓 +쳓 +쳓 +쳓 + +쳔 +쳔 +쳔 +쳔 +쳔 + +쳕 +쳕 +쳕 +쳕 +쳕 + +쳖 +쳖 +쳖 +쳖 +쳖 + +쳗 +쳗 +쳗 +쳗 +쳗 + +쳘 +쳘 +쳘 +쳘 +쳘 + +쳙 +쳙 +쳙 +쳙 +쳙 + +쳚 +쳚 +쳚 +쳚 +쳚 + +쳛 +쳛 +쳛 +쳛 +쳛 + +쳜 +쳜 +쳜 +쳜 +쳜 + +쳝 +쳝 +쳝 +쳝 +쳝 + +쳞 +쳞 +쳞 +쳞 +쳞 + +쳟 +쳟 +쳟 +쳟 +쳟 + +쳠 +쳠 +쳠 +쳠 +쳠 + +쳡 +쳡 +쳡 +쳡 +쳡 + +쳢 +쳢 +쳢 +쳢 +쳢 + +쳣 +쳣 +쳣 +쳣 +쳣 + +쳤 +쳤 +쳤 +쳤 +쳤 + +쳥 +쳥 +쳥 +쳥 +쳥 + +쳦 +쳦 +쳦 +쳦 +쳦 + +쳧 +쳧 +쳧 +쳧 +쳧 + +쳨 +쳨 +쳨 +쳨 +쳨 + +쳩 +쳩 +쳩 +쳩 +쳩 + +쳪 +쳪 +쳪 +쳪 +쳪 + +쳫 +쳫 +쳫 +쳫 +쳫 + +쳬 +쳬 +쳬 +쳬 +쳬 + +쳭 +쳭 +쳭 +쳭 +쳭 + +쳮 +쳮 +쳮 +쳮 +쳮 + +쳯 +쳯 +쳯 +쳯 +쳯 + +쳰 +쳰 +쳰 +쳰 +쳰 + +쳱 +쳱 +쳱 +쳱 +쳱 + +쳲 +쳲 +쳲 +쳲 +쳲 + +쳳 +쳳 +쳳 +쳳 +쳳 + +쳴 +쳴 +쳴 +쳴 +쳴 + +쳵 +쳵 +쳵 +쳵 +쳵 + +쳶 +쳶 +쳶 +쳶 +쳶 + +쳷 +쳷 +쳷 +쳷 +쳷 + +쳸 +쳸 +쳸 +쳸 +쳸 + +쳹 +쳹 +쳹 +쳹 +쳹 + +쳺 +쳺 +쳺 +쳺 +쳺 + +쳻 +쳻 +쳻 +쳻 +쳻 + +쳼 +쳼 +쳼 +쳼 +쳼 + +쳽 +쳽 +쳽 +쳽 +쳽 + +쳾 +쳾 +쳾 +쳾 +쳾 + +쳿 +쳿 +쳿 +쳿 +쳿 + +촀 +촀 +촀 +촀 +촀 + +촁 +촁 +촁 +촁 +촁 + +촂 +촂 +촂 +촂 +촂 + +촃 +촃 +촃 +촃 +촃 + +촄 +촄 +촄 +촄 +촄 + +촅 +촅 +촅 +촅 +촅 + +촆 +촆 +촆 +촆 +촆 + +촇 +촇 +촇 +촇 +촇 + +초 +초 +초 +초 +초 + +촉 +촉 +촉 +촉 +촉 + +촊 +촊 +촊 +촊 +촊 + +촋 +촋 +촋 +촋 +촋 + +촌 +촌 +촌 +촌 +촌 + +촍 +촍 +촍 +촍 +촍 + +촎 +촎 +촎 +촎 +촎 + +촏 +촏 +촏 +촏 +촏 + +촐 +촐 +촐 +촐 +촐 + +촑 +촑 +촑 +촑 +촑 + +촒 +촒 +촒 +촒 +촒 + +촓 +촓 +촓 +촓 +촓 + +촔 +촔 +촔 +촔 +촔 + +촕 +촕 +촕 +촕 +촕 + +촖 +촖 +촖 +촖 +촖 + +촗 +촗 +촗 +촗 +촗 + +촘 +촘 +촘 +촘 +촘 + +촙 +촙 +촙 +촙 +촙 + +촚 +촚 +촚 +촚 +촚 + +촛 +촛 +촛 +촛 +촛 + +촜 +촜 +촜 +촜 +촜 + +총 +총 +총 +총 +총 + +촞 +촞 +촞 +촞 +촞 + +촟 +촟 +촟 +촟 +촟 + +촠 +촠 +촠 +촠 +촠 + +촡 +촡 +촡 +촡 +촡 + +촢 +촢 +촢 +촢 +촢 + +촣 +촣 +촣 +촣 +촣 + +촤 +촤 +촤 +촤 +촤 + +촥 +촥 +촥 +촥 +촥 + +촦 +촦 +촦 +촦 +촦 + +촧 +촧 +촧 +촧 +촧 + +촨 +촨 +촨 +촨 +촨 + +촩 +촩 +촩 +촩 +촩 + +촪 +촪 +촪 +촪 +촪 + +촫 +촫 +촫 +촫 +촫 + +촬 +촬 +촬 +촬 +촬 + +촭 +촭 +촭 +촭 +촭 + +촮 +촮 +촮 +촮 +촮 + +촯 +촯 +촯 +촯 +촯 + +촰 +촰 +촰 +촰 +촰 + +촱 +촱 +촱 +촱 +촱 + +촲 +촲 +촲 +촲 +촲 + +촳 +촳 +촳 +촳 +촳 + +촴 +촴 +촴 +촴 +촴 + +촵 +촵 +촵 +촵 +촵 + +촶 +촶 +촶 +촶 +촶 + +촷 +촷 +촷 +촷 +촷 + +촸 +촸 +촸 +촸 +촸 + +촹 +촹 +촹 +촹 +촹 + +촺 +촺 +촺 +촺 +촺 + +촻 +촻 +촻 +촻 +촻 + +촼 +촼 +촼 +촼 +촼 + +촽 +촽 +촽 +촽 +촽 + +촾 +촾 +촾 +촾 +촾 + +촿 +촿 +촿 +촿 +촿 + +쵀 +쵀 +쵀 +쵀 +쵀 + +쵁 +쵁 +쵁 +쵁 +쵁 + +쵂 +쵂 +쵂 +쵂 +쵂 + +쵃 +쵃 +쵃 +쵃 +쵃 + +쵄 +쵄 +쵄 +쵄 +쵄 + +쵅 +쵅 +쵅 +쵅 +쵅 + +쵆 +쵆 +쵆 +쵆 +쵆 + +쵇 +쵇 +쵇 +쵇 +쵇 + +쵈 +쵈 +쵈 +쵈 +쵈 + +쵉 +쵉 +쵉 +쵉 +쵉 + +쵊 +쵊 +쵊 +쵊 +쵊 + +쵋 +쵋 +쵋 +쵋 +쵋 + +쵌 +쵌 +쵌 +쵌 +쵌 + +쵍 +쵍 +쵍 +쵍 +쵍 + +쵎 +쵎 +쵎 +쵎 +쵎 + +쵏 +쵏 +쵏 +쵏 +쵏 + +쵐 +쵐 +쵐 +쵐 +쵐 + +쵑 +쵑 +쵑 +쵑 +쵑 + +쵒 +쵒 +쵒 +쵒 +쵒 + +쵓 +쵓 +쵓 +쵓 +쵓 + +쵔 +쵔 +쵔 +쵔 +쵔 + +쵕 +쵕 +쵕 +쵕 +쵕 + +쵖 +쵖 +쵖 +쵖 +쵖 + +쵗 +쵗 +쵗 +쵗 +쵗 + +쵘 +쵘 +쵘 +쵘 +쵘 + +쵙 +쵙 +쵙 +쵙 +쵙 + +쵚 +쵚 +쵚 +쵚 +쵚 + +쵛 +쵛 +쵛 +쵛 +쵛 + +최 +최 +최 +최 +최 + +쵝 +쵝 +쵝 +쵝 +쵝 + +쵞 +쵞 +쵞 +쵞 +쵞 + +쵟 +쵟 +쵟 +쵟 +쵟 + +쵠 +쵠 +쵠 +쵠 +쵠 + +쵡 +쵡 +쵡 +쵡 +쵡 + +쵢 +쵢 +쵢 +쵢 +쵢 + +쵣 +쵣 +쵣 +쵣 +쵣 + +쵤 +쵤 +쵤 +쵤 +쵤 + +쵥 +쵥 +쵥 +쵥 +쵥 + +쵦 +쵦 +쵦 +쵦 +쵦 + +쵧 +쵧 +쵧 +쵧 +쵧 + +쵨 +쵨 +쵨 +쵨 +쵨 + +쵩 +쵩 +쵩 +쵩 +쵩 + +쵪 +쵪 +쵪 +쵪 +쵪 + +쵫 +쵫 +쵫 +쵫 +쵫 + +쵬 +쵬 +쵬 +쵬 +쵬 + +쵭 +쵭 +쵭 +쵭 +쵭 + +쵮 +쵮 +쵮 +쵮 +쵮 + +쵯 +쵯 +쵯 +쵯 +쵯 + +쵰 +쵰 +쵰 +쵰 +쵰 + +쵱 +쵱 +쵱 +쵱 +쵱 + +쵲 +쵲 +쵲 +쵲 +쵲 + +쵳 +쵳 +쵳 +쵳 +쵳 + +쵴 +쵴 +쵴 +쵴 +쵴 + +쵵 +쵵 +쵵 +쵵 +쵵 + +쵶 +쵶 +쵶 +쵶 +쵶 + +쵷 +쵷 +쵷 +쵷 +쵷 + +쵸 +쵸 +쵸 +쵸 +쵸 + +쵹 +쵹 +쵹 +쵹 +쵹 + +쵺 +쵺 +쵺 +쵺 +쵺 + +쵻 +쵻 +쵻 +쵻 +쵻 + +쵼 +쵼 +쵼 +쵼 +쵼 + +쵽 +쵽 +쵽 +쵽 +쵽 + +쵾 +쵾 +쵾 +쵾 +쵾 + +쵿 +쵿 +쵿 +쵿 +쵿 + +춀 +춀 +춀 +춀 +춀 + +춁 +춁 +춁 +춁 +춁 + +춂 +춂 +춂 +춂 +춂 + +춃 +춃 +춃 +춃 +춃 + +춄 +춄 +춄 +춄 +춄 + +춅 +춅 +춅 +춅 +춅 + +춆 +춆 +춆 +춆 +춆 + +춇 +춇 +춇 +춇 +춇 + +춈 +춈 +춈 +춈 +춈 + +춉 +춉 +춉 +춉 +춉 + +춊 +춊 +춊 +춊 +춊 + +춋 +춋 +춋 +춋 +춋 + +춌 +춌 +춌 +춌 +춌 + +춍 +춍 +춍 +춍 +춍 + +춎 +춎 +춎 +춎 +춎 + +춏 +춏 +춏 +춏 +춏 + +춐 +춐 +춐 +춐 +춐 + +춑 +춑 +춑 +춑 +춑 + +춒 +춒 +춒 +춒 +춒 + +춓 +춓 +춓 +춓 +춓 + +추 +추 +추 +추 +추 + +축 +축 +축 +축 +축 + +춖 +춖 +춖 +춖 +춖 + +춗 +춗 +춗 +춗 +춗 + +춘 +춘 +춘 +춘 +춘 + +춙 +춙 +춙 +춙 +춙 + +춚 +춚 +춚 +춚 +춚 + +춛 +춛 +춛 +춛 +춛 + +출 +출 +출 +출 +출 + +춝 +춝 +춝 +춝 +춝 + +춞 +춞 +춞 +춞 +춞 + +춟 +춟 +춟 +춟 +춟 + +춠 +춠 +춠 +춠 +춠 + +춡 +춡 +춡 +춡 +춡 + +춢 +춢 +춢 +춢 +춢 + +춣 +춣 +춣 +춣 +춣 + +춤 +춤 +춤 +춤 +춤 + +춥 +춥 +춥 +춥 +춥 + +춦 +춦 +춦 +춦 +춦 + +춧 +춧 +춧 +춧 +춧 + +춨 +춨 +춨 +춨 +춨 + +충 +충 +충 +충 +충 + +춪 +춪 +춪 +춪 +춪 + +춫 +춫 +춫 +춫 +춫 + +춬 +춬 +춬 +춬 +춬 + +춭 +춭 +춭 +춭 +춭 + +춮 +춮 +춮 +춮 +춮 + +춯 +춯 +춯 +춯 +춯 + +춰 +춰 +춰 +춰 +춰 + +춱 +춱 +춱 +춱 +춱 + +춲 +춲 +춲 +춲 +춲 + +춳 +춳 +춳 +춳 +춳 + +춴 +춴 +춴 +춴 +춴 + +춵 +춵 +춵 +춵 +춵 + +춶 +춶 +춶 +춶 +춶 + +춷 +춷 +춷 +춷 +춷 + +춸 +춸 +춸 +춸 +춸 + +춹 +춹 +춹 +춹 +춹 + +춺 +춺 +춺 +춺 +춺 + +춻 +춻 +춻 +춻 +춻 + +춼 +춼 +춼 +춼 +춼 + +춽 +춽 +춽 +춽 +춽 + +춾 +춾 +춾 +춾 +춾 + +춿 +춿 +춿 +춿 +춿 + +췀 +췀 +췀 +췀 +췀 + +췁 +췁 +췁 +췁 +췁 + +췂 +췂 +췂 +췂 +췂 + +췃 +췃 +췃 +췃 +췃 + +췄 +췄 +췄 +췄 +췄 + +췅 +췅 +췅 +췅 +췅 + +췆 +췆 +췆 +췆 +췆 + +췇 +췇 +췇 +췇 +췇 + +췈 +췈 +췈 +췈 +췈 + +췉 +췉 +췉 +췉 +췉 + +췊 +췊 +췊 +췊 +췊 + +췋 +췋 +췋 +췋 +췋 + +췌 +췌 +췌 +췌 +췌 + +췍 +췍 +췍 +췍 +췍 + +췎 +췎 +췎 +췎 +췎 + +췏 +췏 +췏 +췏 +췏 + +췐 +췐 +췐 +췐 +췐 + +췑 +췑 +췑 +췑 +췑 + +췒 +췒 +췒 +췒 +췒 + +췓 +췓 +췓 +췓 +췓 + +췔 +췔 +췔 +췔 +췔 + +췕 +췕 +췕 +췕 +췕 + +췖 +췖 +췖 +췖 +췖 + +췗 +췗 +췗 +췗 +췗 + +췘 +췘 +췘 +췘 +췘 + +췙 +췙 +췙 +췙 +췙 + +췚 +췚 +췚 +췚 +췚 + +췛 +췛 +췛 +췛 +췛 + +췜 +췜 +췜 +췜 +췜 + +췝 +췝 +췝 +췝 +췝 + +췞 +췞 +췞 +췞 +췞 + +췟 +췟 +췟 +췟 +췟 + +췠 +췠 +췠 +췠 +췠 + +췡 +췡 +췡 +췡 +췡 + +췢 +췢 +췢 +췢 +췢 + +췣 +췣 +췣 +췣 +췣 + +췤 +췤 +췤 +췤 +췤 + +췥 +췥 +췥 +췥 +췥 + +췦 +췦 +췦 +췦 +췦 + +췧 +췧 +췧 +췧 +췧 + +취 +취 +취 +취 +취 + +췩 +췩 +췩 +췩 +췩 + +췪 +췪 +췪 +췪 +췪 + +췫 +췫 +췫 +췫 +췫 + +췬 +췬 +췬 +췬 +췬 + +췭 +췭 +췭 +췭 +췭 + +췮 +췮 +췮 +췮 +췮 + +췯 +췯 +췯 +췯 +췯 + +췰 +췰 +췰 +췰 +췰 + +췱 +췱 +췱 +췱 +췱 + +췲 +췲 +췲 +췲 +췲 + +췳 +췳 +췳 +췳 +췳 + +췴 +췴 +췴 +췴 +췴 + +췵 +췵 +췵 +췵 +췵 + +췶 +췶 +췶 +췶 +췶 + +췷 +췷 +췷 +췷 +췷 + +췸 +췸 +췸 +췸 +췸 + +췹 +췹 +췹 +췹 +췹 + +췺 +췺 +췺 +췺 +췺 + +췻 +췻 +췻 +췻 +췻 + +췼 +췼 +췼 +췼 +췼 + +췽 +췽 +췽 +췽 +췽 + +췾 +췾 +췾 +췾 +췾 + +췿 +췿 +췿 +췿 +췿 + +츀 +츀 +츀 +츀 +츀 + +츁 +츁 +츁 +츁 +츁 + +츂 +츂 +츂 +츂 +츂 + +츃 +츃 +츃 +츃 +츃 + +츄 +츄 +츄 +츄 +츄 + +츅 +츅 +츅 +츅 +츅 + +츆 +츆 +츆 +츆 +츆 + +츇 +츇 +츇 +츇 +츇 + +츈 +츈 +츈 +츈 +츈 + +츉 +츉 +츉 +츉 +츉 + +츊 +츊 +츊 +츊 +츊 + +츋 +츋 +츋 +츋 +츋 + +츌 +츌 +츌 +츌 +츌 + +츍 +츍 +츍 +츍 +츍 + +츎 +츎 +츎 +츎 +츎 + +츏 +츏 +츏 +츏 +츏 + +츐 +츐 +츐 +츐 +츐 + +츑 +츑 +츑 +츑 +츑 + +츒 +츒 +츒 +츒 +츒 + +츓 +츓 +츓 +츓 +츓 + +츔 +츔 +츔 +츔 +츔 + +츕 +츕 +츕 +츕 +츕 + +츖 +츖 +츖 +츖 +츖 + +츗 +츗 +츗 +츗 +츗 + +츘 +츘 +츘 +츘 +츘 + +츙 +츙 +츙 +츙 +츙 + +츚 +츚 +츚 +츚 +츚 + +츛 +츛 +츛 +츛 +츛 + +츜 +츜 +츜 +츜 +츜 + +츝 +츝 +츝 +츝 +츝 + +츞 +츞 +츞 +츞 +츞 + +츟 +츟 +츟 +츟 +츟 + +츠 +츠 +츠 +츠 +츠 + +측 +측 +측 +측 +측 + +츢 +츢 +츢 +츢 +츢 + +츣 +츣 +츣 +츣 +츣 + +츤 +츤 +츤 +츤 +츤 + +츥 +츥 +츥 +츥 +츥 + +츦 +츦 +츦 +츦 +츦 + +츧 +츧 +츧 +츧 +츧 + +츨 +츨 +츨 +츨 +츨 + +츩 +츩 +츩 +츩 +츩 + +츪 +츪 +츪 +츪 +츪 + +츫 +츫 +츫 +츫 +츫 + +츬 +츬 +츬 +츬 +츬 + +츭 +츭 +츭 +츭 +츭 + +츮 +츮 +츮 +츮 +츮 + +츯 +츯 +츯 +츯 +츯 + +츰 +츰 +츰 +츰 +츰 + +츱 +츱 +츱 +츱 +츱 + +츲 +츲 +츲 +츲 +츲 + +츳 +츳 +츳 +츳 +츳 + +츴 +츴 +츴 +츴 +츴 + +층 +층 +층 +층 +층 + +츶 +츶 +츶 +츶 +츶 + +츷 +츷 +츷 +츷 +츷 + +츸 +츸 +츸 +츸 +츸 + +츹 +츹 +츹 +츹 +츹 + +츺 +츺 +츺 +츺 +츺 + +츻 +츻 +츻 +츻 +츻 + +츼 +츼 +츼 +츼 +츼 + +츽 +츽 +츽 +츽 +츽 + +츾 +츾 +츾 +츾 +츾 + +츿 +츿 +츿 +츿 +츿 + +칀 +칀 +칀 +칀 +칀 + +칁 +칁 +칁 +칁 +칁 + +칂 +칂 +칂 +칂 +칂 + +칃 +칃 +칃 +칃 +칃 + +칄 +칄 +칄 +칄 +칄 + +칅 +칅 +칅 +칅 +칅 + +칆 +칆 +칆 +칆 +칆 + +칇 +칇 +칇 +칇 +칇 + +칈 +칈 +칈 +칈 +칈 + +칉 +칉 +칉 +칉 +칉 + +칊 +칊 +칊 +칊 +칊 + +칋 +칋 +칋 +칋 +칋 + +칌 +칌 +칌 +칌 +칌 + +칍 +칍 +칍 +칍 +칍 + +칎 +칎 +칎 +칎 +칎 + +칏 +칏 +칏 +칏 +칏 + +칐 +칐 +칐 +칐 +칐 + +칑 +칑 +칑 +칑 +칑 + +칒 +칒 +칒 +칒 +칒 + +칓 +칓 +칓 +칓 +칓 + +칔 +칔 +칔 +칔 +칔 + +칕 +칕 +칕 +칕 +칕 + +칖 +칖 +칖 +칖 +칖 + +칗 +칗 +칗 +칗 +칗 + +치 +치 +치 +치 +치 + +칙 +칙 +칙 +칙 +칙 + +칚 +칚 +칚 +칚 +칚 + +칛 +칛 +칛 +칛 +칛 + +친 +친 +친 +친 +친 + +칝 +칝 +칝 +칝 +칝 + +칞 +칞 +칞 +칞 +칞 + +칟 +칟 +칟 +칟 +칟 + +칠 +칠 +칠 +칠 +칠 + +칡 +칡 +칡 +칡 +칡 + +칢 +칢 +칢 +칢 +칢 + +칣 +칣 +칣 +칣 +칣 + +칤 +칤 +칤 +칤 +칤 + +칥 +칥 +칥 +칥 +칥 + +칦 +칦 +칦 +칦 +칦 + +칧 +칧 +칧 +칧 +칧 + +침 +침 +침 +침 +침 + +칩 +칩 +칩 +칩 +칩 + +칪 +칪 +칪 +칪 +칪 + +칫 +칫 +칫 +칫 +칫 + +칬 +칬 +칬 +칬 +칬 + +칭 +칭 +칭 +칭 +칭 + +칮 +칮 +칮 +칮 +칮 + +칯 +칯 +칯 +칯 +칯 + +칰 +칰 +칰 +칰 +칰 + +칱 +칱 +칱 +칱 +칱 + +칲 +칲 +칲 +칲 +칲 + +칳 +칳 +칳 +칳 +칳 + +카 +카 +카 +카 +카 + +칵 +칵 +칵 +칵 +칵 + +칶 +칶 +칶 +칶 +칶 + +칷 +칷 +칷 +칷 +칷 + +칸 +칸 +칸 +칸 +칸 + +칹 +칹 +칹 +칹 +칹 + +칺 +칺 +칺 +칺 +칺 + +칻 +칻 +칻 +칻 +칻 + +칼 +칼 +칼 +칼 +칼 + +칽 +칽 +칽 +칽 +칽 + +칾 +칾 +칾 +칾 +칾 + +칿 +칿 +칿 +칿 +칿 + +캀 +캀 +캀 +캀 +캀 + +캁 +캁 +캁 +캁 +캁 + +캂 +캂 +캂 +캂 +캂 + +캃 +캃 +캃 +캃 +캃 + +캄 +캄 +캄 +캄 +캄 + +캅 +캅 +캅 +캅 +캅 + +캆 +캆 +캆 +캆 +캆 + +캇 +캇 +캇 +캇 +캇 + +캈 +캈 +캈 +캈 +캈 + +캉 +캉 +캉 +캉 +캉 + +캊 +캊 +캊 +캊 +캊 + +캋 +캋 +캋 +캋 +캋 + +캌 +캌 +캌 +캌 +캌 + +캍 +캍 +캍 +캍 +캍 + +캎 +캎 +캎 +캎 +캎 + +캏 +캏 +캏 +캏 +캏 + +캐 +캐 +캐 +캐 +캐 + +캑 +캑 +캑 +캑 +캑 + +캒 +캒 +캒 +캒 +캒 + +캓 +캓 +캓 +캓 +캓 + +캔 +캔 +캔 +캔 +캔 + +캕 +캕 +캕 +캕 +캕 + +캖 +캖 +캖 +캖 +캖 + +캗 +캗 +캗 +캗 +캗 + +캘 +캘 +캘 +캘 +캘 + +캙 +캙 +캙 +캙 +캙 + +캚 +캚 +캚 +캚 +캚 + +캛 +캛 +캛 +캛 +캛 + +캜 +캜 +캜 +캜 +캜 + +캝 +캝 +캝 +캝 +캝 + +캞 +캞 +캞 +캞 +캞 + +캟 +캟 +캟 +캟 +캟 + +캠 +캠 +캠 +캠 +캠 + +캡 +캡 +캡 +캡 +캡 + +캢 +캢 +캢 +캢 +캢 + +캣 +캣 +캣 +캣 +캣 + +캤 +캤 +캤 +캤 +캤 + +캥 +캥 +캥 +캥 +캥 + +캦 +캦 +캦 +캦 +캦 + +캧 +캧 +캧 +캧 +캧 + +캨 +캨 +캨 +캨 +캨 + +캩 +캩 +캩 +캩 +캩 + +캪 +캪 +캪 +캪 +캪 + +캫 +캫 +캫 +캫 +캫 + +캬 +캬 +캬 +캬 +캬 + +캭 +캭 +캭 +캭 +캭 + +캮 +캮 +캮 +캮 +캮 + +캯 +캯 +캯 +캯 +캯 + +캰 +캰 +캰 +캰 +캰 + +캱 +캱 +캱 +캱 +캱 + +캲 +캲 +캲 +캲 +캲 + +캳 +캳 +캳 +캳 +캳 + +캴 +캴 +캴 +캴 +캴 + +캵 +캵 +캵 +캵 +캵 + +캶 +캶 +캶 +캶 +캶 + +캷 +캷 +캷 +캷 +캷 + +캸 +캸 +캸 +캸 +캸 + +캹 +캹 +캹 +캹 +캹 + +캺 +캺 +캺 +캺 +캺 + +캻 +캻 +캻 +캻 +캻 + +캼 +캼 +캼 +캼 +캼 + +캽 +캽 +캽 +캽 +캽 + +캾 +캾 +캾 +캾 +캾 + +캿 +캿 +캿 +캿 +캿 + +컀 +컀 +컀 +컀 +컀 + +컁 +컁 +컁 +컁 +컁 + +컂 +컂 +컂 +컂 +컂 + +컃 +컃 +컃 +컃 +컃 + +컄 +컄 +컄 +컄 +컄 + +컅 +컅 +컅 +컅 +컅 + +컆 +컆 +컆 +컆 +컆 + +컇 +컇 +컇 +컇 +컇 + +컈 +컈 +컈 +컈 +컈 + +컉 +컉 +컉 +컉 +컉 + +컊 +컊 +컊 +컊 +컊 + +컋 +컋 +컋 +컋 +컋 + +컌 +컌 +컌 +컌 +컌 + +컍 +컍 +컍 +컍 +컍 + +컎 +컎 +컎 +컎 +컎 + +컏 +컏 +컏 +컏 +컏 + +컐 +컐 +컐 +컐 +컐 + +컑 +컑 +컑 +컑 +컑 + +컒 +컒 +컒 +컒 +컒 + +컓 +컓 +컓 +컓 +컓 + +컔 +컔 +컔 +컔 +컔 + +컕 +컕 +컕 +컕 +컕 + +컖 +컖 +컖 +컖 +컖 + +컗 +컗 +컗 +컗 +컗 + +컘 +컘 +컘 +컘 +컘 + +컙 +컙 +컙 +컙 +컙 + +컚 +컚 +컚 +컚 +컚 + +컛 +컛 +컛 +컛 +컛 + +컜 +컜 +컜 +컜 +컜 + +컝 +컝 +컝 +컝 +컝 + +컞 +컞 +컞 +컞 +컞 + +컟 +컟 +컟 +컟 +컟 + +컠 +컠 +컠 +컠 +컠 + +컡 +컡 +컡 +컡 +컡 + +컢 +컢 +컢 +컢 +컢 + +컣 +컣 +컣 +컣 +컣 + +커 +커 +커 +커 +커 + +컥 +컥 +컥 +컥 +컥 + +컦 +컦 +컦 +컦 +컦 + +컧 +컧 +컧 +컧 +컧 + +컨 +컨 +컨 +컨 +컨 + +컩 +컩 +컩 +컩 +컩 + +컪 +컪 +컪 +컪 +컪 + +컫 +컫 +컫 +컫 +컫 + +컬 +컬 +컬 +컬 +컬 + +컭 +컭 +컭 +컭 +컭 + +컮 +컮 +컮 +컮 +컮 + +컯 +컯 +컯 +컯 +컯 + +컰 +컰 +컰 +컰 +컰 + +컱 +컱 +컱 +컱 +컱 + +컲 +컲 +컲 +컲 +컲 + +컳 +컳 +컳 +컳 +컳 + +컴 +컴 +컴 +컴 +컴 + +컵 +컵 +컵 +컵 +컵 + +컶 +컶 +컶 +컶 +컶 + +컷 +컷 +컷 +컷 +컷 + +컸 +컸 +컸 +컸 +컸 + +컹 +컹 +컹 +컹 +컹 + +컺 +컺 +컺 +컺 +컺 + +컻 +컻 +컻 +컻 +컻 + +컼 +컼 +컼 +컼 +컼 + +컽 +컽 +컽 +컽 +컽 + +컾 +컾 +컾 +컾 +컾 + +컿 +컿 +컿 +컿 +컿 + +케 +케 +케 +케 +케 + +켁 +켁 +켁 +켁 +켁 + +켂 +켂 +켂 +켂 +켂 + +켃 +켃 +켃 +켃 +켃 + +켄 +켄 +켄 +켄 +켄 + +켅 +켅 +켅 +켅 +켅 + +켆 +켆 +켆 +켆 +켆 + +켇 +켇 +켇 +켇 +켇 + +켈 +켈 +켈 +켈 +켈 + +켉 +켉 +켉 +켉 +켉 + +켊 +켊 +켊 +켊 +켊 + +켋 +켋 +켋 +켋 +켋 + +켌 +켌 +켌 +켌 +켌 + +켍 +켍 +켍 +켍 +켍 + +켎 +켎 +켎 +켎 +켎 + +켏 +켏 +켏 +켏 +켏 + +켐 +켐 +켐 +켐 +켐 + +켑 +켑 +켑 +켑 +켑 + +켒 +켒 +켒 +켒 +켒 + +켓 +켓 +켓 +켓 +켓 + +켔 +켔 +켔 +켔 +켔 + +켕 +켕 +켕 +켕 +켕 + +켖 +켖 +켖 +켖 +켖 + +켗 +켗 +켗 +켗 +켗 + +켘 +켘 +켘 +켘 +켘 + +켙 +켙 +켙 +켙 +켙 + +켚 +켚 +켚 +켚 +켚 + +켛 +켛 +켛 +켛 +켛 + +켜 +켜 +켜 +켜 +켜 + +켝 +켝 +켝 +켝 +켝 + +켞 +켞 +켞 +켞 +켞 + +켟 +켟 +켟 +켟 +켟 + +켠 +켠 +켠 +켠 +켠 + +켡 +켡 +켡 +켡 +켡 + +켢 +켢 +켢 +켢 +켢 + +켣 +켣 +켣 +켣 +켣 + +켤 +켤 +켤 +켤 +켤 + +켥 +켥 +켥 +켥 +켥 + +켦 +켦 +켦 +켦 +켦 + +켧 +켧 +켧 +켧 +켧 + +켨 +켨 +켨 +켨 +켨 + +켩 +켩 +켩 +켩 +켩 + +켪 +켪 +켪 +켪 +켪 + +켫 +켫 +켫 +켫 +켫 + +켬 +켬 +켬 +켬 +켬 + +켭 +켭 +켭 +켭 +켭 + +켮 +켮 +켮 +켮 +켮 + +켯 +켯 +켯 +켯 +켯 + +켰 +켰 +켰 +켰 +켰 + +켱 +켱 +켱 +켱 +켱 + +켲 +켲 +켲 +켲 +켲 + +켳 +켳 +켳 +켳 +켳 + +켴 +켴 +켴 +켴 +켴 + +켵 +켵 +켵 +켵 +켵 + +켶 +켶 +켶 +켶 +켶 + +켷 +켷 +켷 +켷 +켷 + +켸 +켸 +켸 +켸 +켸 + +켹 +켹 +켹 +켹 +켹 + +켺 +켺 +켺 +켺 +켺 + +켻 +켻 +켻 +켻 +켻 + +켼 +켼 +켼 +켼 +켼 + +켽 +켽 +켽 +켽 +켽 + +켾 +켾 +켾 +켾 +켾 + +켿 +켿 +켿 +켿 +켿 + +콀 +콀 +콀 +콀 +콀 + +콁 +콁 +콁 +콁 +콁 + +콂 +콂 +콂 +콂 +콂 + +콃 +콃 +콃 +콃 +콃 + +콄 +콄 +콄 +콄 +콄 + +콅 +콅 +콅 +콅 +콅 + +콆 +콆 +콆 +콆 +콆 + +콇 +콇 +콇 +콇 +콇 + +콈 +콈 +콈 +콈 +콈 + +콉 +콉 +콉 +콉 +콉 + +콊 +콊 +콊 +콊 +콊 + +콋 +콋 +콋 +콋 +콋 + +콌 +콌 +콌 +콌 +콌 + +콍 +콍 +콍 +콍 +콍 + +콎 +콎 +콎 +콎 +콎 + +콏 +콏 +콏 +콏 +콏 + +콐 +콐 +콐 +콐 +콐 + +콑 +콑 +콑 +콑 +콑 + +콒 +콒 +콒 +콒 +콒 + +콓 +콓 +콓 +콓 +콓 + +코 +코 +코 +코 +코 + +콕 +콕 +콕 +콕 +콕 + +콖 +콖 +콖 +콖 +콖 + +콗 +콗 +콗 +콗 +콗 + +콘 +콘 +콘 +콘 +콘 + +콙 +콙 +콙 +콙 +콙 + +콚 +콚 +콚 +콚 +콚 + +콛 +콛 +콛 +콛 +콛 + +콜 +콜 +콜 +콜 +콜 + +콝 +콝 +콝 +콝 +콝 + +콞 +콞 +콞 +콞 +콞 + +콟 +콟 +콟 +콟 +콟 + +콠 +콠 +콠 +콠 +콠 + +콡 +콡 +콡 +콡 +콡 + +콢 +콢 +콢 +콢 +콢 + +콣 +콣 +콣 +콣 +콣 + +콤 +콤 +콤 +콤 +콤 + +콥 +콥 +콥 +콥 +콥 + +콦 +콦 +콦 +콦 +콦 + +콧 +콧 +콧 +콧 +콧 + +콨 +콨 +콨 +콨 +콨 + +콩 +콩 +콩 +콩 +콩 + +콪 +콪 +콪 +콪 +콪 + +콫 +콫 +콫 +콫 +콫 + +콬 +콬 +콬 +콬 +콬 + +콭 +콭 +콭 +콭 +콭 + +콮 +콮 +콮 +콮 +콮 + +콯 +콯 +콯 +콯 +콯 + +콰 +콰 +콰 +콰 +콰 + +콱 +콱 +콱 +콱 +콱 + +콲 +콲 +콲 +콲 +콲 + +콳 +콳 +콳 +콳 +콳 + +콴 +콴 +콴 +콴 +콴 + +콵 +콵 +콵 +콵 +콵 + +콶 +콶 +콶 +콶 +콶 + +콷 +콷 +콷 +콷 +콷 + +콸 +콸 +콸 +콸 +콸 + +콹 +콹 +콹 +콹 +콹 + +콺 +콺 +콺 +콺 +콺 + +콻 +콻 +콻 +콻 +콻 + +콼 +콼 +콼 +콼 +콼 + +콽 +콽 +콽 +콽 +콽 + +콾 +콾 +콾 +콾 +콾 + +콿 +콿 +콿 +콿 +콿 + +쾀 +쾀 +쾀 +쾀 +쾀 + +쾁 +쾁 +쾁 +쾁 +쾁 + +쾂 +쾂 +쾂 +쾂 +쾂 + +쾃 +쾃 +쾃 +쾃 +쾃 + +쾄 +쾄 +쾄 +쾄 +쾄 + +쾅 +쾅 +쾅 +쾅 +쾅 + +쾆 +쾆 +쾆 +쾆 +쾆 + +쾇 +쾇 +쾇 +쾇 +쾇 + +쾈 +쾈 +쾈 +쾈 +쾈 + +쾉 +쾉 +쾉 +쾉 +쾉 + +쾊 +쾊 +쾊 +쾊 +쾊 + +쾋 +쾋 +쾋 +쾋 +쾋 + +쾌 +쾌 +쾌 +쾌 +쾌 + +쾍 +쾍 +쾍 +쾍 +쾍 + +쾎 +쾎 +쾎 +쾎 +쾎 + +쾏 +쾏 +쾏 +쾏 +쾏 + +쾐 +쾐 +쾐 +쾐 +쾐 + +쾑 +쾑 +쾑 +쾑 +쾑 + +쾒 +쾒 +쾒 +쾒 +쾒 + +쾓 +쾓 +쾓 +쾓 +쾓 + +쾔 +쾔 +쾔 +쾔 +쾔 + +쾕 +쾕 +쾕 +쾕 +쾕 + +쾖 +쾖 +쾖 +쾖 +쾖 + +쾗 +쾗 +쾗 +쾗 +쾗 + +쾘 +쾘 +쾘 +쾘 +쾘 + +쾙 +쾙 +쾙 +쾙 +쾙 + +쾚 +쾚 +쾚 +쾚 +쾚 + +쾛 +쾛 +쾛 +쾛 +쾛 + +쾜 +쾜 +쾜 +쾜 +쾜 + +쾝 +쾝 +쾝 +쾝 +쾝 + +쾞 +쾞 +쾞 +쾞 +쾞 + +쾟 +쾟 +쾟 +쾟 +쾟 + +쾠 +쾠 +쾠 +쾠 +쾠 + +쾡 +쾡 +쾡 +쾡 +쾡 + +쾢 +쾢 +쾢 +쾢 +쾢 + +쾣 +쾣 +쾣 +쾣 +쾣 + +쾤 +쾤 +쾤 +쾤 +쾤 + +쾥 +쾥 +쾥 +쾥 +쾥 + +쾦 +쾦 +쾦 +쾦 +쾦 + +쾧 +쾧 +쾧 +쾧 +쾧 + +쾨 +쾨 +쾨 +쾨 +쾨 + +쾩 +쾩 +쾩 +쾩 +쾩 + +쾪 +쾪 +쾪 +쾪 +쾪 + +쾫 +쾫 +쾫 +쾫 +쾫 + +쾬 +쾬 +쾬 +쾬 +쾬 + +쾭 +쾭 +쾭 +쾭 +쾭 + +쾮 +쾮 +쾮 +쾮 +쾮 + +쾯 +쾯 +쾯 +쾯 +쾯 + +쾰 +쾰 +쾰 +쾰 +쾰 + +쾱 +쾱 +쾱 +쾱 +쾱 + +쾲 +쾲 +쾲 +쾲 +쾲 + +쾳 +쾳 +쾳 +쾳 +쾳 + +쾴 +쾴 +쾴 +쾴 +쾴 + +쾵 +쾵 +쾵 +쾵 +쾵 + +쾶 +쾶 +쾶 +쾶 +쾶 + +쾷 +쾷 +쾷 +쾷 +쾷 + +쾸 +쾸 +쾸 +쾸 +쾸 + +쾹 +쾹 +쾹 +쾹 +쾹 + +쾺 +쾺 +쾺 +쾺 +쾺 + +쾻 +쾻 +쾻 +쾻 +쾻 + +쾼 +쾼 +쾼 +쾼 +쾼 + +쾽 +쾽 +쾽 +쾽 +쾽 + +쾾 +쾾 +쾾 +쾾 +쾾 + +쾿 +쾿 +쾿 +쾿 +쾿 + +쿀 +쿀 +쿀 +쿀 +쿀 + +쿁 +쿁 +쿁 +쿁 +쿁 + +쿂 +쿂 +쿂 +쿂 +쿂 + +쿃 +쿃 +쿃 +쿃 +쿃 + +쿄 +쿄 +쿄 +쿄 +쿄 + +쿅 +쿅 +쿅 +쿅 +쿅 + +쿆 +쿆 +쿆 +쿆 +쿆 + +쿇 +쿇 +쿇 +쿇 +쿇 + +쿈 +쿈 +쿈 +쿈 +쿈 + +쿉 +쿉 +쿉 +쿉 +쿉 + +쿊 +쿊 +쿊 +쿊 +쿊 + +쿋 +쿋 +쿋 +쿋 +쿋 + +쿌 +쿌 +쿌 +쿌 +쿌 + +쿍 +쿍 +쿍 +쿍 +쿍 + +쿎 +쿎 +쿎 +쿎 +쿎 + +쿏 +쿏 +쿏 +쿏 +쿏 + +쿐 +쿐 +쿐 +쿐 +쿐 + +쿑 +쿑 +쿑 +쿑 +쿑 + +쿒 +쿒 +쿒 +쿒 +쿒 + +쿓 +쿓 +쿓 +쿓 +쿓 + +쿔 +쿔 +쿔 +쿔 +쿔 + +쿕 +쿕 +쿕 +쿕 +쿕 + +쿖 +쿖 +쿖 +쿖 +쿖 + +쿗 +쿗 +쿗 +쿗 +쿗 + +쿘 +쿘 +쿘 +쿘 +쿘 + +쿙 +쿙 +쿙 +쿙 +쿙 + +쿚 +쿚 +쿚 +쿚 +쿚 + +쿛 +쿛 +쿛 +쿛 +쿛 + +쿜 +쿜 +쿜 +쿜 +쿜 + +쿝 +쿝 +쿝 +쿝 +쿝 + +쿞 +쿞 +쿞 +쿞 +쿞 + +쿟 +쿟 +쿟 +쿟 +쿟 + +쿠 +쿠 +쿠 +쿠 +쿠 + +쿡 +쿡 +쿡 +쿡 +쿡 + +쿢 +쿢 +쿢 +쿢 +쿢 + +쿣 +쿣 +쿣 +쿣 +쿣 + +쿤 +쿤 +쿤 +쿤 +쿤 + +쿥 +쿥 +쿥 +쿥 +쿥 + +쿦 +쿦 +쿦 +쿦 +쿦 + +쿧 +쿧 +쿧 +쿧 +쿧 + +쿨 +쿨 +쿨 +쿨 +쿨 + +쿩 +쿩 +쿩 +쿩 +쿩 + +쿪 +쿪 +쿪 +쿪 +쿪 + +쿫 +쿫 +쿫 +쿫 +쿫 + +쿬 +쿬 +쿬 +쿬 +쿬 + +쿭 +쿭 +쿭 +쿭 +쿭 + +쿮 +쿮 +쿮 +쿮 +쿮 + +쿯 +쿯 +쿯 +쿯 +쿯 + +쿰 +쿰 +쿰 +쿰 +쿰 + +쿱 +쿱 +쿱 +쿱 +쿱 + +쿲 +쿲 +쿲 +쿲 +쿲 + +쿳 +쿳 +쿳 +쿳 +쿳 + +쿴 +쿴 +쿴 +쿴 +쿴 + +쿵 +쿵 +쿵 +쿵 +쿵 + +쿶 +쿶 +쿶 +쿶 +쿶 + +쿷 +쿷 +쿷 +쿷 +쿷 + +쿸 +쿸 +쿸 +쿸 +쿸 + +쿹 +쿹 +쿹 +쿹 +쿹 + +쿺 +쿺 +쿺 +쿺 +쿺 + +쿻 +쿻 +쿻 +쿻 +쿻 + +쿼 +쿼 +쿼 +쿼 +쿼 + +쿽 +쿽 +쿽 +쿽 +쿽 + +쿾 +쿾 +쿾 +쿾 +쿾 + +쿿 +쿿 +쿿 +쿿 +쿿 + +퀀 +퀀 +퀀 +퀀 +퀀 + +퀁 +퀁 +퀁 +퀁 +퀁 + +퀂 +퀂 +퀂 +퀂 +퀂 + +퀃 +퀃 +퀃 +퀃 +퀃 + +퀄 +퀄 +퀄 +퀄 +퀄 + +퀅 +퀅 +퀅 +퀅 +퀅 + +퀆 +퀆 +퀆 +퀆 +퀆 + +퀇 +퀇 +퀇 +퀇 +퀇 + +퀈 +퀈 +퀈 +퀈 +퀈 + +퀉 +퀉 +퀉 +퀉 +퀉 + +퀊 +퀊 +퀊 +퀊 +퀊 + +퀋 +퀋 +퀋 +퀋 +퀋 + +퀌 +퀌 +퀌 +퀌 +퀌 + +퀍 +퀍 +퀍 +퀍 +퀍 + +퀎 +퀎 +퀎 +퀎 +퀎 + +퀏 +퀏 +퀏 +퀏 +퀏 + +퀐 +퀐 +퀐 +퀐 +퀐 + +퀑 +퀑 +퀑 +퀑 +퀑 + +퀒 +퀒 +퀒 +퀒 +퀒 + +퀓 +퀓 +퀓 +퀓 +퀓 + +퀔 +퀔 +퀔 +퀔 +퀔 + +퀕 +퀕 +퀕 +퀕 +퀕 + +퀖 +퀖 +퀖 +퀖 +퀖 + +퀗 +퀗 +퀗 +퀗 +퀗 + +퀘 +퀘 +퀘 +퀘 +퀘 + +퀙 +퀙 +퀙 +퀙 +퀙 + +퀚 +퀚 +퀚 +퀚 +퀚 + +퀛 +퀛 +퀛 +퀛 +퀛 + +퀜 +퀜 +퀜 +퀜 +퀜 + +퀝 +퀝 +퀝 +퀝 +퀝 + +퀞 +퀞 +퀞 +퀞 +퀞 + +퀟 +퀟 +퀟 +퀟 +퀟 + +퀠 +퀠 +퀠 +퀠 +퀠 + +퀡 +퀡 +퀡 +퀡 +퀡 + +퀢 +퀢 +퀢 +퀢 +퀢 + +퀣 +퀣 +퀣 +퀣 +퀣 + +퀤 +퀤 +퀤 +퀤 +퀤 + +퀥 +퀥 +퀥 +퀥 +퀥 + +퀦 +퀦 +퀦 +퀦 +퀦 + +퀧 +퀧 +퀧 +퀧 +퀧 + +퀨 +퀨 +퀨 +퀨 +퀨 + +퀩 +퀩 +퀩 +퀩 +퀩 + +퀪 +퀪 +퀪 +퀪 +퀪 + +퀫 +퀫 +퀫 +퀫 +퀫 + +퀬 +퀬 +퀬 +퀬 +퀬 + +퀭 +퀭 +퀭 +퀭 +퀭 + +퀮 +퀮 +퀮 +퀮 +퀮 + +퀯 +퀯 +퀯 +퀯 +퀯 + +퀰 +퀰 +퀰 +퀰 +퀰 + +퀱 +퀱 +퀱 +퀱 +퀱 + +퀲 +퀲 +퀲 +퀲 +퀲 + +퀳 +퀳 +퀳 +퀳 +퀳 + +퀴 +퀴 +퀴 +퀴 +퀴 + +퀵 +퀵 +퀵 +퀵 +퀵 + +퀶 +퀶 +퀶 +퀶 +퀶 + +퀷 +퀷 +퀷 +퀷 +퀷 + +퀸 +퀸 +퀸 +퀸 +퀸 + +퀹 +퀹 +퀹 +퀹 +퀹 + +퀺 +퀺 +퀺 +퀺 +퀺 + +퀻 +퀻 +퀻 +퀻 +퀻 + +퀼 +퀼 +퀼 +퀼 +퀼 + +퀽 +퀽 +퀽 +퀽 +퀽 + +퀾 +퀾 +퀾 +퀾 +퀾 + +퀿 +퀿 +퀿 +퀿 +퀿 + +큀 +큀 +큀 +큀 +큀 + +큁 +큁 +큁 +큁 +큁 + +큂 +큂 +큂 +큂 +큂 + +큃 +큃 +큃 +큃 +큃 + +큄 +큄 +큄 +큄 +큄 + +큅 +큅 +큅 +큅 +큅 + +큆 +큆 +큆 +큆 +큆 + +큇 +큇 +큇 +큇 +큇 + +큈 +큈 +큈 +큈 +큈 + +큉 +큉 +큉 +큉 +큉 + +큊 +큊 +큊 +큊 +큊 + +큋 +큋 +큋 +큋 +큋 + +큌 +큌 +큌 +큌 +큌 + +큍 +큍 +큍 +큍 +큍 + +큎 +큎 +큎 +큎 +큎 + +큏 +큏 +큏 +큏 +큏 + +큐 +큐 +큐 +큐 +큐 + +큑 +큑 +큑 +큑 +큑 + +큒 +큒 +큒 +큒 +큒 + +큓 +큓 +큓 +큓 +큓 + +큔 +큔 +큔 +큔 +큔 + +큕 +큕 +큕 +큕 +큕 + +큖 +큖 +큖 +큖 +큖 + +큗 +큗 +큗 +큗 +큗 + +큘 +큘 +큘 +큘 +큘 + +큙 +큙 +큙 +큙 +큙 + +큚 +큚 +큚 +큚 +큚 + +큛 +큛 +큛 +큛 +큛 + +큜 +큜 +큜 +큜 +큜 + +큝 +큝 +큝 +큝 +큝 + +큞 +큞 +큞 +큞 +큞 + +큟 +큟 +큟 +큟 +큟 + +큠 +큠 +큠 +큠 +큠 + +큡 +큡 +큡 +큡 +큡 + +큢 +큢 +큢 +큢 +큢 + +큣 +큣 +큣 +큣 +큣 + +큤 +큤 +큤 +큤 +큤 + +큥 +큥 +큥 +큥 +큥 + +큦 +큦 +큦 +큦 +큦 + +큧 +큧 +큧 +큧 +큧 + +큨 +큨 +큨 +큨 +큨 + +큩 +큩 +큩 +큩 +큩 + +큪 +큪 +큪 +큪 +큪 + +큫 +큫 +큫 +큫 +큫 + +크 +크 +크 +크 +크 + +큭 +큭 +큭 +큭 +큭 + +큮 +큮 +큮 +큮 +큮 + +큯 +큯 +큯 +큯 +큯 + +큰 +큰 +큰 +큰 +큰 + +큱 +큱 +큱 +큱 +큱 + +큲 +큲 +큲 +큲 +큲 + +큳 +큳 +큳 +큳 +큳 + +클 +클 +클 +클 +클 + +큵 +큵 +큵 +큵 +큵 + +큶 +큶 +큶 +큶 +큶 + +큷 +큷 +큷 +큷 +큷 + +큸 +큸 +큸 +큸 +큸 + +큹 +큹 +큹 +큹 +큹 + +큺 +큺 +큺 +큺 +큺 + +큻 +큻 +큻 +큻 +큻 + +큼 +큼 +큼 +큼 +큼 + +큽 +큽 +큽 +큽 +큽 + +큾 +큾 +큾 +큾 +큾 + +큿 +큿 +큿 +큿 +큿 + +킀 +킀 +킀 +킀 +킀 + +킁 +킁 +킁 +킁 +킁 + +킂 +킂 +킂 +킂 +킂 + +킃 +킃 +킃 +킃 +킃 + +킄 +킄 +킄 +킄 +킄 + +킅 +킅 +킅 +킅 +킅 + +킆 +킆 +킆 +킆 +킆 + +킇 +킇 +킇 +킇 +킇 + +킈 +킈 +킈 +킈 +킈 + +킉 +킉 +킉 +킉 +킉 + +킊 +킊 +킊 +킊 +킊 + +킋 +킋 +킋 +킋 +킋 + +킌 +킌 +킌 +킌 +킌 + +킍 +킍 +킍 +킍 +킍 + +킎 +킎 +킎 +킎 +킎 + +킏 +킏 +킏 +킏 +킏 + +킐 +킐 +킐 +킐 +킐 + +킑 +킑 +킑 +킑 +킑 + +킒 +킒 +킒 +킒 +킒 + +킓 +킓 +킓 +킓 +킓 + +킔 +킔 +킔 +킔 +킔 + +킕 +킕 +킕 +킕 +킕 + +킖 +킖 +킖 +킖 +킖 + +킗 +킗 +킗 +킗 +킗 + +킘 +킘 +킘 +킘 +킘 + +킙 +킙 +킙 +킙 +킙 + +킚 +킚 +킚 +킚 +킚 + +킛 +킛 +킛 +킛 +킛 + +킜 +킜 +킜 +킜 +킜 + +킝 +킝 +킝 +킝 +킝 + +킞 +킞 +킞 +킞 +킞 + +킟 +킟 +킟 +킟 +킟 + +킠 +킠 +킠 +킠 +킠 + +킡 +킡 +킡 +킡 +킡 + +킢 +킢 +킢 +킢 +킢 + +킣 +킣 +킣 +킣 +킣 + +키 +키 +키 +키 +키 + +킥 +킥 +킥 +킥 +킥 + +킦 +킦 +킦 +킦 +킦 + +킧 +킧 +킧 +킧 +킧 + +킨 +킨 +킨 +킨 +킨 + +킩 +킩 +킩 +킩 +킩 + +킪 +킪 +킪 +킪 +킪 + +킫 +킫 +킫 +킫 +킫 + +킬 +킬 +킬 +킬 +킬 + +킭 +킭 +킭 +킭 +킭 + +킮 +킮 +킮 +킮 +킮 + +킯 +킯 +킯 +킯 +킯 + +킰 +킰 +킰 +킰 +킰 + +킱 +킱 +킱 +킱 +킱 + +킲 +킲 +킲 +킲 +킲 + +킳 +킳 +킳 +킳 +킳 + +킴 +킴 +킴 +킴 +킴 + +킵 +킵 +킵 +킵 +킵 + +킶 +킶 +킶 +킶 +킶 + +킷 +킷 +킷 +킷 +킷 + +킸 +킸 +킸 +킸 +킸 + +킹 +킹 +킹 +킹 +킹 + +킺 +킺 +킺 +킺 +킺 + +킻 +킻 +킻 +킻 +킻 + +킼 +킼 +킼 +킼 +킼 + +킽 +킽 +킽 +킽 +킽 + +킾 +킾 +킾 +킾 +킾 + +킿 +킿 +킿 +킿 +킿 + +타 +타 +타 +타 +타 + +탁 +탁 +탁 +탁 +탁 + +탂 +탂 +탂 +탂 +탂 + +탃 +탃 +탃 +탃 +탃 + +탄 +탄 +탄 +탄 +탄 + +탅 +탅 +탅 +탅 +탅 + +탆 +탆 +탆 +탆 +탆 + +탇 +탇 +탇 +탇 +탇 + +탈 +탈 +탈 +탈 +탈 + +탉 +탉 +탉 +탉 +탉 + +탊 +탊 +탊 +탊 +탊 + +탋 +탋 +탋 +탋 +탋 + +탌 +탌 +탌 +탌 +탌 + +탍 +탍 +탍 +탍 +탍 + +탎 +탎 +탎 +탎 +탎 + +탏 +탏 +탏 +탏 +탏 + +탐 +탐 +탐 +탐 +탐 + +탑 +탑 +탑 +탑 +탑 + +탒 +탒 +탒 +탒 +탒 + +탓 +탓 +탓 +탓 +탓 + +탔 +탔 +탔 +탔 +탔 + +탕 +탕 +탕 +탕 +탕 + +탖 +탖 +탖 +탖 +탖 + +탗 +탗 +탗 +탗 +탗 + +탘 +탘 +탘 +탘 +탘 + +탙 +탙 +탙 +탙 +탙 + +탚 +탚 +탚 +탚 +탚 + +탛 +탛 +탛 +탛 +탛 + +태 +태 +태 +태 +태 + +택 +택 +택 +택 +택 + +탞 +탞 +탞 +탞 +탞 + +탟 +탟 +탟 +탟 +탟 + +탠 +탠 +탠 +탠 +탠 + +탡 +탡 +탡 +탡 +탡 + +탢 +탢 +탢 +탢 +탢 + +탣 +탣 +탣 +탣 +탣 + +탤 +탤 +탤 +탤 +탤 + +탥 +탥 +탥 +탥 +탥 + +탦 +탦 +탦 +탦 +탦 + +탧 +탧 +탧 +탧 +탧 + +탨 +탨 +탨 +탨 +탨 + +탩 +탩 +탩 +탩 +탩 + +탪 +탪 +탪 +탪 +탪 + +탫 +탫 +탫 +탫 +탫 + +탬 +탬 +탬 +탬 +탬 + +탭 +탭 +탭 +탭 +탭 + +탮 +탮 +탮 +탮 +탮 + +탯 +탯 +탯 +탯 +탯 + +탰 +탰 +탰 +탰 +탰 + +탱 +탱 +탱 +탱 +탱 + +탲 +탲 +탲 +탲 +탲 + +탳 +탳 +탳 +탳 +탳 + +탴 +탴 +탴 +탴 +탴 + +탵 +탵 +탵 +탵 +탵 + +탶 +탶 +탶 +탶 +탶 + +탷 +탷 +탷 +탷 +탷 + +탸 +탸 +탸 +탸 +탸 + +탹 +탹 +탹 +탹 +탹 + +탺 +탺 +탺 +탺 +탺 + +탻 +탻 +탻 +탻 +탻 + +탼 +탼 +탼 +탼 +탼 + +탽 +탽 +탽 +탽 +탽 + +탾 +탾 +탾 +탾 +탾 + +탿 +탿 +탿 +탿 +탿 + +턀 +턀 +턀 +턀 +턀 + +턁 +턁 +턁 +턁 +턁 + +턂 +턂 +턂 +턂 +턂 + +턃 +턃 +턃 +턃 +턃 + +턄 +턄 +턄 +턄 +턄 + +턅 +턅 +턅 +턅 +턅 + +턆 +턆 +턆 +턆 +턆 + +턇 +턇 +턇 +턇 +턇 + +턈 +턈 +턈 +턈 +턈 + +턉 +턉 +턉 +턉 +턉 + +턊 +턊 +턊 +턊 +턊 + +턋 +턋 +턋 +턋 +턋 + +턌 +턌 +턌 +턌 +턌 + +턍 +턍 +턍 +턍 +턍 + +턎 +턎 +턎 +턎 +턎 + +턏 +턏 +턏 +턏 +턏 + +턐 +턐 +턐 +턐 +턐 + +턑 +턑 +턑 +턑 +턑 + +턒 +턒 +턒 +턒 +턒 + +턓 +턓 +턓 +턓 +턓 + +턔 +턔 +턔 +턔 +턔 + +턕 +턕 +턕 +턕 +턕 + +턖 +턖 +턖 +턖 +턖 + +턗 +턗 +턗 +턗 +턗 + +턘 +턘 +턘 +턘 +턘 + +턙 +턙 +턙 +턙 +턙 + +턚 +턚 +턚 +턚 +턚 + +턛 +턛 +턛 +턛 +턛 + +턜 +턜 +턜 +턜 +턜 + +턝 +턝 +턝 +턝 +턝 + +턞 +턞 +턞 +턞 +턞 + +턟 +턟 +턟 +턟 +턟 + +턠 +턠 +턠 +턠 +턠 + +턡 +턡 +턡 +턡 +턡 + +턢 +턢 +턢 +턢 +턢 + +턣 +턣 +턣 +턣 +턣 + +턤 +턤 +턤 +턤 +턤 + +턥 +턥 +턥 +턥 +턥 + +턦 +턦 +턦 +턦 +턦 + +턧 +턧 +턧 +턧 +턧 + +턨 +턨 +턨 +턨 +턨 + +턩 +턩 +턩 +턩 +턩 + +턪 +턪 +턪 +턪 +턪 + +턫 +턫 +턫 +턫 +턫 + +턬 +턬 +턬 +턬 +턬 + +턭 +턭 +턭 +턭 +턭 + +턮 +턮 +턮 +턮 +턮 + +턯 +턯 +턯 +턯 +턯 + +터 +터 +터 +터 +터 + +턱 +턱 +턱 +턱 +턱 + +턲 +턲 +턲 +턲 +턲 + +턳 +턳 +턳 +턳 +턳 + +턴 +턴 +턴 +턴 +턴 + +턵 +턵 +턵 +턵 +턵 + +턶 +턶 +턶 +턶 +턶 + +턷 +턷 +턷 +턷 +턷 + +털 +털 +털 +털 +털 + +턹 +턹 +턹 +턹 +턹 + +턺 +턺 +턺 +턺 +턺 + +턻 +턻 +턻 +턻 +턻 + +턼 +턼 +턼 +턼 +턼 + +턽 +턽 +턽 +턽 +턽 + +턾 +턾 +턾 +턾 +턾 + +턿 +턿 +턿 +턿 +턿 + +텀 +텀 +텀 +텀 +텀 + +텁 +텁 +텁 +텁 +텁 + +텂 +텂 +텂 +텂 +텂 + +텃 +텃 +텃 +텃 +텃 + +텄 +텄 +텄 +텄 +텄 + +텅 +텅 +텅 +텅 +텅 + +텆 +텆 +텆 +텆 +텆 + +텇 +텇 +텇 +텇 +텇 + +텈 +텈 +텈 +텈 +텈 + +텉 +텉 +텉 +텉 +텉 + +텊 +텊 +텊 +텊 +텊 + +텋 +텋 +텋 +텋 +텋 + +테 +테 +테 +테 +테 + +텍 +텍 +텍 +텍 +텍 + +텎 +텎 +텎 +텎 +텎 + +텏 +텏 +텏 +텏 +텏 + +텐 +텐 +텐 +텐 +텐 + +텑 +텑 +텑 +텑 +텑 + +텒 +텒 +텒 +텒 +텒 + +텓 +텓 +텓 +텓 +텓 + +텔 +텔 +텔 +텔 +텔 + +텕 +텕 +텕 +텕 +텕 + +텖 +텖 +텖 +텖 +텖 + +텗 +텗 +텗 +텗 +텗 + +텘 +텘 +텘 +텘 +텘 + +텙 +텙 +텙 +텙 +텙 + +텚 +텚 +텚 +텚 +텚 + +텛 +텛 +텛 +텛 +텛 + +템 +템 +템 +템 +템 + +텝 +텝 +텝 +텝 +텝 + +텞 +텞 +텞 +텞 +텞 + +텟 +텟 +텟 +텟 +텟 + +텠 +텠 +텠 +텠 +텠 + +텡 +텡 +텡 +텡 +텡 + +텢 +텢 +텢 +텢 +텢 + +텣 +텣 +텣 +텣 +텣 + +텤 +텤 +텤 +텤 +텤 + +텥 +텥 +텥 +텥 +텥 + +텦 +텦 +텦 +텦 +텦 + +텧 +텧 +텧 +텧 +텧 + +텨 +텨 +텨 +텨 +텨 + +텩 +텩 +텩 +텩 +텩 + +텪 +텪 +텪 +텪 +텪 + +텫 +텫 +텫 +텫 +텫 + +텬 +텬 +텬 +텬 +텬 + +텭 +텭 +텭 +텭 +텭 + +텮 +텮 +텮 +텮 +텮 + +텯 +텯 +텯 +텯 +텯 + +텰 +텰 +텰 +텰 +텰 + +텱 +텱 +텱 +텱 +텱 + +텲 +텲 +텲 +텲 +텲 + +텳 +텳 +텳 +텳 +텳 + +텴 +텴 +텴 +텴 +텴 + +텵 +텵 +텵 +텵 +텵 + +텶 +텶 +텶 +텶 +텶 + +텷 +텷 +텷 +텷 +텷 + +텸 +텸 +텸 +텸 +텸 + +텹 +텹 +텹 +텹 +텹 + +텺 +텺 +텺 +텺 +텺 + +텻 +텻 +텻 +텻 +텻 + +텼 +텼 +텼 +텼 +텼 + +텽 +텽 +텽 +텽 +텽 + +텾 +텾 +텾 +텾 +텾 + +텿 +텿 +텿 +텿 +텿 + +톀 +톀 +톀 +톀 +톀 + +톁 +톁 +톁 +톁 +톁 + +톂 +톂 +톂 +톂 +톂 + +톃 +톃 +톃 +톃 +톃 + +톄 +톄 +톄 +톄 +톄 + +톅 +톅 +톅 +톅 +톅 + +톆 +톆 +톆 +톆 +톆 + +톇 +톇 +톇 +톇 +톇 + +톈 +톈 +톈 +톈 +톈 + +톉 +톉 +톉 +톉 +톉 + +톊 +톊 +톊 +톊 +톊 + +톋 +톋 +톋 +톋 +톋 + +톌 +톌 +톌 +톌 +톌 + +톍 +톍 +톍 +톍 +톍 + +톎 +톎 +톎 +톎 +톎 + +톏 +톏 +톏 +톏 +톏 + +톐 +톐 +톐 +톐 +톐 + +톑 +톑 +톑 +톑 +톑 + +톒 +톒 +톒 +톒 +톒 + +톓 +톓 +톓 +톓 +톓 + +톔 +톔 +톔 +톔 +톔 + +톕 +톕 +톕 +톕 +톕 + +톖 +톖 +톖 +톖 +톖 + +톗 +톗 +톗 +톗 +톗 + +톘 +톘 +톘 +톘 +톘 + +톙 +톙 +톙 +톙 +톙 + +톚 +톚 +톚 +톚 +톚 + +톛 +톛 +톛 +톛 +톛 + +톜 +톜 +톜 +톜 +톜 + +톝 +톝 +톝 +톝 +톝 + +톞 +톞 +톞 +톞 +톞 + +톟 +톟 +톟 +톟 +톟 + +토 +토 +토 +토 +토 + +톡 +톡 +톡 +톡 +톡 + +톢 +톢 +톢 +톢 +톢 + +톣 +톣 +톣 +톣 +톣 + +톤 +톤 +톤 +톤 +톤 + +톥 +톥 +톥 +톥 +톥 + +톦 +톦 +톦 +톦 +톦 + +톧 +톧 +톧 +톧 +톧 + +톨 +톨 +톨 +톨 +톨 + +톩 +톩 +톩 +톩 +톩 + +톪 +톪 +톪 +톪 +톪 + +톫 +톫 +톫 +톫 +톫 + +톬 +톬 +톬 +톬 +톬 + +톭 +톭 +톭 +톭 +톭 + +톮 +톮 +톮 +톮 +톮 + +톯 +톯 +톯 +톯 +톯 + +톰 +톰 +톰 +톰 +톰 + +톱 +톱 +톱 +톱 +톱 + +톲 +톲 +톲 +톲 +톲 + +톳 +톳 +톳 +톳 +톳 + +톴 +톴 +톴 +톴 +톴 + +통 +통 +통 +통 +통 + +톶 +톶 +톶 +톶 +톶 + +톷 +톷 +톷 +톷 +톷 + +톸 +톸 +톸 +톸 +톸 + +톹 +톹 +톹 +톹 +톹 + +톺 +톺 +톺 +톺 +톺 + +톻 +톻 +톻 +톻 +톻 + +톼 +톼 +톼 +톼 +톼 + +톽 +톽 +톽 +톽 +톽 + +톾 +톾 +톾 +톾 +톾 + +톿 +톿 +톿 +톿 +톿 + +퇀 +퇀 +퇀 +퇀 +퇀 + +퇁 +퇁 +퇁 +퇁 +퇁 + +퇂 +퇂 +퇂 +퇂 +퇂 + +퇃 +퇃 +퇃 +퇃 +퇃 + +퇄 +퇄 +퇄 +퇄 +퇄 + +퇅 +퇅 +퇅 +퇅 +퇅 + +퇆 +퇆 +퇆 +퇆 +퇆 + +퇇 +퇇 +퇇 +퇇 +퇇 + +퇈 +퇈 +퇈 +퇈 +퇈 + +퇉 +퇉 +퇉 +퇉 +퇉 + +퇊 +퇊 +퇊 +퇊 +퇊 + +퇋 +퇋 +퇋 +퇋 +퇋 + +퇌 +퇌 +퇌 +퇌 +퇌 + +퇍 +퇍 +퇍 +퇍 +퇍 + +퇎 +퇎 +퇎 +퇎 +퇎 + +퇏 +퇏 +퇏 +퇏 +퇏 + +퇐 +퇐 +퇐 +퇐 +퇐 + +퇑 +퇑 +퇑 +퇑 +퇑 + +퇒 +퇒 +퇒 +퇒 +퇒 + +퇓 +퇓 +퇓 +퇓 +퇓 + +퇔 +퇔 +퇔 +퇔 +퇔 + +퇕 +퇕 +퇕 +퇕 +퇕 + +퇖 +퇖 +퇖 +퇖 +퇖 + +퇗 +퇗 +퇗 +퇗 +퇗 + +퇘 +퇘 +퇘 +퇘 +퇘 + +퇙 +퇙 +퇙 +퇙 +퇙 + +퇚 +퇚 +퇚 +퇚 +퇚 + +퇛 +퇛 +퇛 +퇛 +퇛 + +퇜 +퇜 +퇜 +퇜 +퇜 + +퇝 +퇝 +퇝 +퇝 +퇝 + +퇞 +퇞 +퇞 +퇞 +퇞 + +퇟 +퇟 +퇟 +퇟 +퇟 + +퇠 +퇠 +퇠 +퇠 +퇠 + +퇡 +퇡 +퇡 +퇡 +퇡 + +퇢 +퇢 +퇢 +퇢 +퇢 + +퇣 +퇣 +퇣 +퇣 +퇣 + +퇤 +퇤 +퇤 +퇤 +퇤 + +퇥 +퇥 +퇥 +퇥 +퇥 + +퇦 +퇦 +퇦 +퇦 +퇦 + +퇧 +퇧 +퇧 +퇧 +퇧 + +퇨 +퇨 +퇨 +퇨 +퇨 + +퇩 +퇩 +퇩 +퇩 +퇩 + +퇪 +퇪 +퇪 +퇪 +퇪 + +퇫 +퇫 +퇫 +퇫 +퇫 + +퇬 +퇬 +퇬 +퇬 +퇬 + +퇭 +퇭 +퇭 +퇭 +퇭 + +퇮 +퇮 +퇮 +퇮 +퇮 + +퇯 +퇯 +퇯 +퇯 +퇯 + +퇰 +퇰 +퇰 +퇰 +퇰 + +퇱 +퇱 +퇱 +퇱 +퇱 + +퇲 +퇲 +퇲 +퇲 +퇲 + +퇳 +퇳 +퇳 +퇳 +퇳 + +퇴 +퇴 +퇴 +퇴 +퇴 + +퇵 +퇵 +퇵 +퇵 +퇵 + +퇶 +퇶 +퇶 +퇶 +퇶 + +퇷 +퇷 +퇷 +퇷 +퇷 + +퇸 +퇸 +퇸 +퇸 +퇸 + +퇹 +퇹 +퇹 +퇹 +퇹 + +퇺 +퇺 +퇺 +퇺 +퇺 + +퇻 +퇻 +퇻 +퇻 +퇻 + +퇼 +퇼 +퇼 +퇼 +퇼 + +퇽 +퇽 +퇽 +퇽 +퇽 + +퇾 +퇾 +퇾 +퇾 +퇾 + +퇿 +퇿 +퇿 +퇿 +퇿 + +툀 +툀 +툀 +툀 +툀 + +툁 +툁 +툁 +툁 +툁 + +툂 +툂 +툂 +툂 +툂 + +툃 +툃 +툃 +툃 +툃 + +툄 +툄 +툄 +툄 +툄 + +툅 +툅 +툅 +툅 +툅 + +툆 +툆 +툆 +툆 +툆 + +툇 +툇 +툇 +툇 +툇 + +툈 +툈 +툈 +툈 +툈 + +툉 +툉 +툉 +툉 +툉 + +툊 +툊 +툊 +툊 +툊 + +툋 +툋 +툋 +툋 +툋 + +툌 +툌 +툌 +툌 +툌 + +툍 +툍 +툍 +툍 +툍 + +툎 +툎 +툎 +툎 +툎 + +툏 +툏 +툏 +툏 +툏 + +툐 +툐 +툐 +툐 +툐 + +툑 +툑 +툑 +툑 +툑 + +툒 +툒 +툒 +툒 +툒 + +툓 +툓 +툓 +툓 +툓 + +툔 +툔 +툔 +툔 +툔 + +툕 +툕 +툕 +툕 +툕 + +툖 +툖 +툖 +툖 +툖 + +툗 +툗 +툗 +툗 +툗 + +툘 +툘 +툘 +툘 +툘 + +툙 +툙 +툙 +툙 +툙 + +툚 +툚 +툚 +툚 +툚 + +툛 +툛 +툛 +툛 +툛 + +툜 +툜 +툜 +툜 +툜 + +툝 +툝 +툝 +툝 +툝 + +툞 +툞 +툞 +툞 +툞 + +툟 +툟 +툟 +툟 +툟 + +툠 +툠 +툠 +툠 +툠 + +툡 +툡 +툡 +툡 +툡 + +툢 +툢 +툢 +툢 +툢 + +툣 +툣 +툣 +툣 +툣 + +툤 +툤 +툤 +툤 +툤 + +툥 +툥 +툥 +툥 +툥 + +툦 +툦 +툦 +툦 +툦 + +툧 +툧 +툧 +툧 +툧 + +툨 +툨 +툨 +툨 +툨 + +툩 +툩 +툩 +툩 +툩 + +툪 +툪 +툪 +툪 +툪 + +툫 +툫 +툫 +툫 +툫 + +투 +투 +투 +투 +투 + +툭 +툭 +툭 +툭 +툭 + +툮 +툮 +툮 +툮 +툮 + +툯 +툯 +툯 +툯 +툯 + +툰 +툰 +툰 +툰 +툰 + +툱 +툱 +툱 +툱 +툱 + +툲 +툲 +툲 +툲 +툲 + +툳 +툳 +툳 +툳 +툳 + +툴 +툴 +툴 +툴 +툴 + +툵 +툵 +툵 +툵 +툵 + +툶 +툶 +툶 +툶 +툶 + +툷 +툷 +툷 +툷 +툷 + +툸 +툸 +툸 +툸 +툸 + +툹 +툹 +툹 +툹 +툹 + +툺 +툺 +툺 +툺 +툺 + +툻 +툻 +툻 +툻 +툻 + +툼 +툼 +툼 +툼 +툼 + +툽 +툽 +툽 +툽 +툽 + +툾 +툾 +툾 +툾 +툾 + +툿 +툿 +툿 +툿 +툿 + +퉀 +퉀 +퉀 +퉀 +퉀 + +퉁 +퉁 +퉁 +퉁 +퉁 + +퉂 +퉂 +퉂 +퉂 +퉂 + +퉃 +퉃 +퉃 +퉃 +퉃 + +퉄 +퉄 +퉄 +퉄 +퉄 + +퉅 +퉅 +퉅 +퉅 +퉅 + +퉆 +퉆 +퉆 +퉆 +퉆 + +퉇 +퉇 +퉇 +퉇 +퉇 + +퉈 +퉈 +퉈 +퉈 +퉈 + +퉉 +퉉 +퉉 +퉉 +퉉 + +퉊 +퉊 +퉊 +퉊 +퉊 + +퉋 +퉋 +퉋 +퉋 +퉋 + +퉌 +퉌 +퉌 +퉌 +퉌 + +퉍 +퉍 +퉍 +퉍 +퉍 + +퉎 +퉎 +퉎 +퉎 +퉎 + +퉏 +퉏 +퉏 +퉏 +퉏 + +퉐 +퉐 +퉐 +퉐 +퉐 + +퉑 +퉑 +퉑 +퉑 +퉑 + +퉒 +퉒 +퉒 +퉒 +퉒 + +퉓 +퉓 +퉓 +퉓 +퉓 + +퉔 +퉔 +퉔 +퉔 +퉔 + +퉕 +퉕 +퉕 +퉕 +퉕 + +퉖 +퉖 +퉖 +퉖 +퉖 + +퉗 +퉗 +퉗 +퉗 +퉗 + +퉘 +퉘 +퉘 +퉘 +퉘 + +퉙 +퉙 +퉙 +퉙 +퉙 + +퉚 +퉚 +퉚 +퉚 +퉚 + +퉛 +퉛 +퉛 +퉛 +퉛 + +퉜 +퉜 +퉜 +퉜 +퉜 + +퉝 +퉝 +퉝 +퉝 +퉝 + +퉞 +퉞 +퉞 +퉞 +퉞 + +퉟 +퉟 +퉟 +퉟 +퉟 + +퉠 +퉠 +퉠 +퉠 +퉠 + +퉡 +퉡 +퉡 +퉡 +퉡 + +퉢 +퉢 +퉢 +퉢 +퉢 + +퉣 +퉣 +퉣 +퉣 +퉣 + +퉤 +퉤 +퉤 +퉤 +퉤 + +퉥 +퉥 +퉥 +퉥 +퉥 + +퉦 +퉦 +퉦 +퉦 +퉦 + +퉧 +퉧 +퉧 +퉧 +퉧 + +퉨 +퉨 +퉨 +퉨 +퉨 + +퉩 +퉩 +퉩 +퉩 +퉩 + +퉪 +퉪 +퉪 +퉪 +퉪 + +퉫 +퉫 +퉫 +퉫 +퉫 + +퉬 +퉬 +퉬 +퉬 +퉬 + +퉭 +퉭 +퉭 +퉭 +퉭 + +퉮 +퉮 +퉮 +퉮 +퉮 + +퉯 +퉯 +퉯 +퉯 +퉯 + +퉰 +퉰 +퉰 +퉰 +퉰 + +퉱 +퉱 +퉱 +퉱 +퉱 + +퉲 +퉲 +퉲 +퉲 +퉲 + +퉳 +퉳 +퉳 +퉳 +퉳 + +퉴 +퉴 +퉴 +퉴 +퉴 + +퉵 +퉵 +퉵 +퉵 +퉵 + +퉶 +퉶 +퉶 +퉶 +퉶 + +퉷 +퉷 +퉷 +퉷 +퉷 + +퉸 +퉸 +퉸 +퉸 +퉸 + +퉹 +퉹 +퉹 +퉹 +퉹 + +퉺 +퉺 +퉺 +퉺 +퉺 + +퉻 +퉻 +퉻 +퉻 +퉻 + +퉼 +퉼 +퉼 +퉼 +퉼 + +퉽 +퉽 +퉽 +퉽 +퉽 + +퉾 +퉾 +퉾 +퉾 +퉾 + +퉿 +퉿 +퉿 +퉿 +퉿 + +튀 +튀 +튀 +튀 +튀 + +튁 +튁 +튁 +튁 +튁 + +튂 +튂 +튂 +튂 +튂 + +튃 +튃 +튃 +튃 +튃 + +튄 +튄 +튄 +튄 +튄 + +튅 +튅 +튅 +튅 +튅 + +튆 +튆 +튆 +튆 +튆 + +튇 +튇 +튇 +튇 +튇 + +튈 +튈 +튈 +튈 +튈 + +튉 +튉 +튉 +튉 +튉 + +튊 +튊 +튊 +튊 +튊 + +튋 +튋 +튋 +튋 +튋 + +튌 +튌 +튌 +튌 +튌 + +튍 +튍 +튍 +튍 +튍 + +튎 +튎 +튎 +튎 +튎 + +튏 +튏 +튏 +튏 +튏 + +튐 +튐 +튐 +튐 +튐 + +튑 +튑 +튑 +튑 +튑 + +튒 +튒 +튒 +튒 +튒 + +튓 +튓 +튓 +튓 +튓 + +튔 +튔 +튔 +튔 +튔 + +튕 +튕 +튕 +튕 +튕 + +튖 +튖 +튖 +튖 +튖 + +튗 +튗 +튗 +튗 +튗 + +튘 +튘 +튘 +튘 +튘 + +튙 +튙 +튙 +튙 +튙 + +튚 +튚 +튚 +튚 +튚 + +튛 +튛 +튛 +튛 +튛 + +튜 +튜 +튜 +튜 +튜 + +튝 +튝 +튝 +튝 +튝 + +튞 +튞 +튞 +튞 +튞 + +튟 +튟 +튟 +튟 +튟 + +튠 +튠 +튠 +튠 +튠 + +튡 +튡 +튡 +튡 +튡 + +튢 +튢 +튢 +튢 +튢 + +튣 +튣 +튣 +튣 +튣 + +튤 +튤 +튤 +튤 +튤 + +튥 +튥 +튥 +튥 +튥 + +튦 +튦 +튦 +튦 +튦 + +튧 +튧 +튧 +튧 +튧 + +튨 +튨 +튨 +튨 +튨 + +튩 +튩 +튩 +튩 +튩 + +튪 +튪 +튪 +튪 +튪 + +튫 +튫 +튫 +튫 +튫 + +튬 +튬 +튬 +튬 +튬 + +튭 +튭 +튭 +튭 +튭 + +튮 +튮 +튮 +튮 +튮 + +튯 +튯 +튯 +튯 +튯 + +튰 +튰 +튰 +튰 +튰 + +튱 +튱 +튱 +튱 +튱 + +튲 +튲 +튲 +튲 +튲 + +튳 +튳 +튳 +튳 +튳 + +튴 +튴 +튴 +튴 +튴 + +튵 +튵 +튵 +튵 +튵 + +튶 +튶 +튶 +튶 +튶 + +튷 +튷 +튷 +튷 +튷 + +트 +트 +트 +트 +트 + +특 +특 +특 +특 +특 + +튺 +튺 +튺 +튺 +튺 + +튻 +튻 +튻 +튻 +튻 + +튼 +튼 +튼 +튼 +튼 + +튽 +튽 +튽 +튽 +튽 + +튾 +튾 +튾 +튾 +튾 + +튿 +튿 +튿 +튿 +튿 + +틀 +틀 +틀 +틀 +틀 + +틁 +틁 +틁 +틁 +틁 + +틂 +틂 +틂 +틂 +틂 + +틃 +틃 +틃 +틃 +틃 + +틄 +틄 +틄 +틄 +틄 + +틅 +틅 +틅 +틅 +틅 + +틆 +틆 +틆 +틆 +틆 + +틇 +틇 +틇 +틇 +틇 + +틈 +틈 +틈 +틈 +틈 + +틉 +틉 +틉 +틉 +틉 + +틊 +틊 +틊 +틊 +틊 + +틋 +틋 +틋 +틋 +틋 + +틌 +틌 +틌 +틌 +틌 + +틍 +틍 +틍 +틍 +틍 + +틎 +틎 +틎 +틎 +틎 + +틏 +틏 +틏 +틏 +틏 + +틐 +틐 +틐 +틐 +틐 + +틑 +틑 +틑 +틑 +틑 + +틒 +틒 +틒 +틒 +틒 + +틓 +틓 +틓 +틓 +틓 + +틔 +틔 +틔 +틔 +틔 + +틕 +틕 +틕 +틕 +틕 + +틖 +틖 +틖 +틖 +틖 + +틗 +틗 +틗 +틗 +틗 + +틘 +틘 +틘 +틘 +틘 + +틙 +틙 +틙 +틙 +틙 + +틚 +틚 +틚 +틚 +틚 + +틛 +틛 +틛 +틛 +틛 + +틜 +틜 +틜 +틜 +틜 + +틝 +틝 +틝 +틝 +틝 + +틞 +틞 +틞 +틞 +틞 + +틟 +틟 +틟 +틟 +틟 + +틠 +틠 +틠 +틠 +틠 + +틡 +틡 +틡 +틡 +틡 + +틢 +틢 +틢 +틢 +틢 + +틣 +틣 +틣 +틣 +틣 + +틤 +틤 +틤 +틤 +틤 + +틥 +틥 +틥 +틥 +틥 + +틦 +틦 +틦 +틦 +틦 + +틧 +틧 +틧 +틧 +틧 + +틨 +틨 +틨 +틨 +틨 + +틩 +틩 +틩 +틩 +틩 + +틪 +틪 +틪 +틪 +틪 + +틫 +틫 +틫 +틫 +틫 + +틬 +틬 +틬 +틬 +틬 + +틭 +틭 +틭 +틭 +틭 + +틮 +틮 +틮 +틮 +틮 + +틯 +틯 +틯 +틯 +틯 + +티 +티 +티 +티 +티 + +틱 +틱 +틱 +틱 +틱 + +틲 +틲 +틲 +틲 +틲 + +틳 +틳 +틳 +틳 +틳 + +틴 +틴 +틴 +틴 +틴 + +틵 +틵 +틵 +틵 +틵 + +틶 +틶 +틶 +틶 +틶 + +틷 +틷 +틷 +틷 +틷 + +틸 +틸 +틸 +틸 +틸 + +틹 +틹 +틹 +틹 +틹 + +틺 +틺 +틺 +틺 +틺 + +틻 +틻 +틻 +틻 +틻 + +틼 +틼 +틼 +틼 +틼 + +틽 +틽 +틽 +틽 +틽 + +틾 +틾 +틾 +틾 +틾 + +틿 +틿 +틿 +틿 +틿 + +팀 +팀 +팀 +팀 +팀 + +팁 +팁 +팁 +팁 +팁 + +팂 +팂 +팂 +팂 +팂 + +팃 +팃 +팃 +팃 +팃 + +팄 +팄 +팄 +팄 +팄 + +팅 +팅 +팅 +팅 +팅 + +팆 +팆 +팆 +팆 +팆 + +팇 +팇 +팇 +팇 +팇 + +팈 +팈 +팈 +팈 +팈 + +팉 +팉 +팉 +팉 +팉 + +팊 +팊 +팊 +팊 +팊 + +팋 +팋 +팋 +팋 +팋 + +파 +파 +파 +파 +파 + +팍 +팍 +팍 +팍 +팍 + +팎 +팎 +팎 +팎 +팎 + +팏 +팏 +팏 +팏 +팏 + +판 +판 +판 +판 +판 + +팑 +팑 +팑 +팑 +팑 + +팒 +팒 +팒 +팒 +팒 + +팓 +팓 +팓 +팓 +팓 + +팔 +팔 +팔 +팔 +팔 + +팕 +팕 +팕 +팕 +팕 + +팖 +팖 +팖 +팖 +팖 + +팗 +팗 +팗 +팗 +팗 + +팘 +팘 +팘 +팘 +팘 + +팙 +팙 +팙 +팙 +팙 + +팚 +팚 +팚 +팚 +팚 + +팛 +팛 +팛 +팛 +팛 + +팜 +팜 +팜 +팜 +팜 + +팝 +팝 +팝 +팝 +팝 + +팞 +팞 +팞 +팞 +팞 + +팟 +팟 +팟 +팟 +팟 + +팠 +팠 +팠 +팠 +팠 + +팡 +팡 +팡 +팡 +팡 + +팢 +팢 +팢 +팢 +팢 + +팣 +팣 +팣 +팣 +팣 + +팤 +팤 +팤 +팤 +팤 + +팥 +팥 +팥 +팥 +팥 + +팦 +팦 +팦 +팦 +팦 + +팧 +팧 +팧 +팧 +팧 + +패 +패 +패 +패 +패 + +팩 +팩 +팩 +팩 +팩 + +팪 +팪 +팪 +팪 +팪 + +팫 +팫 +팫 +팫 +팫 + +팬 +팬 +팬 +팬 +팬 + +팭 +팭 +팭 +팭 +팭 + +팮 +팮 +팮 +팮 +팮 + +팯 +팯 +팯 +팯 +팯 + +팰 +팰 +팰 +팰 +팰 + +팱 +팱 +팱 +팱 +팱 + +팲 +팲 +팲 +팲 +팲 + +팳 +팳 +팳 +팳 +팳 + +팴 +팴 +팴 +팴 +팴 + +팵 +팵 +팵 +팵 +팵 + +팶 +팶 +팶 +팶 +팶 + +팷 +팷 +팷 +팷 +팷 + +팸 +팸 +팸 +팸 +팸 + +팹 +팹 +팹 +팹 +팹 + +팺 +팺 +팺 +팺 +팺 + +팻 +팻 +팻 +팻 +팻 + +팼 +팼 +팼 +팼 +팼 + +팽 +팽 +팽 +팽 +팽 + +팾 +팾 +팾 +팾 +팾 + +팿 +팿 +팿 +팿 +팿 + +퍀 +퍀 +퍀 +퍀 +퍀 + +퍁 +퍁 +퍁 +퍁 +퍁 + +퍂 +퍂 +퍂 +퍂 +퍂 + +퍃 +퍃 +퍃 +퍃 +퍃 + +퍄 +퍄 +퍄 +퍄 +퍄 + +퍅 +퍅 +퍅 +퍅 +퍅 + +퍆 +퍆 +퍆 +퍆 +퍆 + +퍇 +퍇 +퍇 +퍇 +퍇 + +퍈 +퍈 +퍈 +퍈 +퍈 + +퍉 +퍉 +퍉 +퍉 +퍉 + +퍊 +퍊 +퍊 +퍊 +퍊 + +퍋 +퍋 +퍋 +퍋 +퍋 + +퍌 +퍌 +퍌 +퍌 +퍌 + +퍍 +퍍 +퍍 +퍍 +퍍 + +퍎 +퍎 +퍎 +퍎 +퍎 + +퍏 +퍏 +퍏 +퍏 +퍏 + +퍐 +퍐 +퍐 +퍐 +퍐 + +퍑 +퍑 +퍑 +퍑 +퍑 + +퍒 +퍒 +퍒 +퍒 +퍒 + +퍓 +퍓 +퍓 +퍓 +퍓 + +퍔 +퍔 +퍔 +퍔 +퍔 + +퍕 +퍕 +퍕 +퍕 +퍕 + +퍖 +퍖 +퍖 +퍖 +퍖 + +퍗 +퍗 +퍗 +퍗 +퍗 + +퍘 +퍘 +퍘 +퍘 +퍘 + +퍙 +퍙 +퍙 +퍙 +퍙 + +퍚 +퍚 +퍚 +퍚 +퍚 + +퍛 +퍛 +퍛 +퍛 +퍛 + +퍜 +퍜 +퍜 +퍜 +퍜 + +퍝 +퍝 +퍝 +퍝 +퍝 + +퍞 +퍞 +퍞 +퍞 +퍞 + +퍟 +퍟 +퍟 +퍟 +퍟 + +퍠 +퍠 +퍠 +퍠 +퍠 + +퍡 +퍡 +퍡 +퍡 +퍡 + +퍢 +퍢 +퍢 +퍢 +퍢 + +퍣 +퍣 +퍣 +퍣 +퍣 + +퍤 +퍤 +퍤 +퍤 +퍤 + +퍥 +퍥 +퍥 +퍥 +퍥 + +퍦 +퍦 +퍦 +퍦 +퍦 + +퍧 +퍧 +퍧 +퍧 +퍧 + +퍨 +퍨 +퍨 +퍨 +퍨 + +퍩 +퍩 +퍩 +퍩 +퍩 + +퍪 +퍪 +퍪 +퍪 +퍪 + +퍫 +퍫 +퍫 +퍫 +퍫 + +퍬 +퍬 +퍬 +퍬 +퍬 + +퍭 +퍭 +퍭 +퍭 +퍭 + +퍮 +퍮 +퍮 +퍮 +퍮 + +퍯 +퍯 +퍯 +퍯 +퍯 + +퍰 +퍰 +퍰 +퍰 +퍰 + +퍱 +퍱 +퍱 +퍱 +퍱 + +퍲 +퍲 +퍲 +퍲 +퍲 + +퍳 +퍳 +퍳 +퍳 +퍳 + +퍴 +퍴 +퍴 +퍴 +퍴 + +퍵 +퍵 +퍵 +퍵 +퍵 + +퍶 +퍶 +퍶 +퍶 +퍶 + +퍷 +퍷 +퍷 +퍷 +퍷 + +퍸 +퍸 +퍸 +퍸 +퍸 + +퍹 +퍹 +퍹 +퍹 +퍹 + +퍺 +퍺 +퍺 +퍺 +퍺 + +퍻 +퍻 +퍻 +퍻 +퍻 + +퍼 +퍼 +퍼 +퍼 +퍼 + +퍽 +퍽 +퍽 +퍽 +퍽 + +퍾 +퍾 +퍾 +퍾 +퍾 + +퍿 +퍿 +퍿 +퍿 +퍿 + +펀 +펀 +펀 +펀 +펀 + +펁 +펁 +펁 +펁 +펁 + +펂 +펂 +펂 +펂 +펂 + +펃 +펃 +펃 +펃 +펃 + +펄 +펄 +펄 +펄 +펄 + +펅 +펅 +펅 +펅 +펅 + +펆 +펆 +펆 +펆 +펆 + +펇 +펇 +펇 +펇 +펇 + +펈 +펈 +펈 +펈 +펈 + +펉 +펉 +펉 +펉 +펉 + +펊 +펊 +펊 +펊 +펊 + +펋 +펋 +펋 +펋 +펋 + +펌 +펌 +펌 +펌 +펌 + +펍 +펍 +펍 +펍 +펍 + +펎 +펎 +펎 +펎 +펎 + +펏 +펏 +펏 +펏 +펏 + +펐 +펐 +펐 +펐 +펐 + +펑 +펑 +펑 +펑 +펑 + +펒 +펒 +펒 +펒 +펒 + +펓 +펓 +펓 +펓 +펓 + +펔 +펔 +펔 +펔 +펔 + +펕 +펕 +펕 +펕 +펕 + +펖 +펖 +펖 +펖 +펖 + +펗 +펗 +펗 +펗 +펗 + +페 +페 +페 +페 +페 + +펙 +펙 +펙 +펙 +펙 + +펚 +펚 +펚 +펚 +펚 + +펛 +펛 +펛 +펛 +펛 + +펜 +펜 +펜 +펜 +펜 + +펝 +펝 +펝 +펝 +펝 + +펞 +펞 +펞 +펞 +펞 + +펟 +펟 +펟 +펟 +펟 + +펠 +펠 +펠 +펠 +펠 + +펡 +펡 +펡 +펡 +펡 + +펢 +펢 +펢 +펢 +펢 + +펣 +펣 +펣 +펣 +펣 + +펤 +펤 +펤 +펤 +펤 + +펥 +펥 +펥 +펥 +펥 + +펦 +펦 +펦 +펦 +펦 + +펧 +펧 +펧 +펧 +펧 + +펨 +펨 +펨 +펨 +펨 + +펩 +펩 +펩 +펩 +펩 + +펪 +펪 +펪 +펪 +펪 + +펫 +펫 +펫 +펫 +펫 + +펬 +펬 +펬 +펬 +펬 + +펭 +펭 +펭 +펭 +펭 + +펮 +펮 +펮 +펮 +펮 + +펯 +펯 +펯 +펯 +펯 + +펰 +펰 +펰 +펰 +펰 + +펱 +펱 +펱 +펱 +펱 + +펲 +펲 +펲 +펲 +펲 + +펳 +펳 +펳 +펳 +펳 + +펴 +펴 +펴 +펴 +펴 + +펵 +펵 +펵 +펵 +펵 + +펶 +펶 +펶 +펶 +펶 + +펷 +펷 +펷 +펷 +펷 + +편 +편 +편 +편 +편 + +펹 +펹 +펹 +펹 +펹 + +펺 +펺 +펺 +펺 +펺 + +펻 +펻 +펻 +펻 +펻 + +펼 +펼 +펼 +펼 +펼 + +펽 +펽 +펽 +펽 +펽 + +펾 +펾 +펾 +펾 +펾 + +펿 +펿 +펿 +펿 +펿 + +폀 +폀 +폀 +폀 +폀 + +폁 +폁 +폁 +폁 +폁 + +폂 +폂 +폂 +폂 +폂 + +폃 +폃 +폃 +폃 +폃 + +폄 +폄 +폄 +폄 +폄 + +폅 +폅 +폅 +폅 +폅 + +폆 +폆 +폆 +폆 +폆 + +폇 +폇 +폇 +폇 +폇 + +폈 +폈 +폈 +폈 +폈 + +평 +평 +평 +평 +평 + +폊 +폊 +폊 +폊 +폊 + +폋 +폋 +폋 +폋 +폋 + +폌 +폌 +폌 +폌 +폌 + +폍 +폍 +폍 +폍 +폍 + +폎 +폎 +폎 +폎 +폎 + +폏 +폏 +폏 +폏 +폏 + +폐 +폐 +폐 +폐 +폐 + +폑 +폑 +폑 +폑 +폑 + +폒 +폒 +폒 +폒 +폒 + +폓 +폓 +폓 +폓 +폓 + +폔 +폔 +폔 +폔 +폔 + +폕 +폕 +폕 +폕 +폕 + +폖 +폖 +폖 +폖 +폖 + +폗 +폗 +폗 +폗 +폗 + +폘 +폘 +폘 +폘 +폘 + +폙 +폙 +폙 +폙 +폙 + +폚 +폚 +폚 +폚 +폚 + +폛 +폛 +폛 +폛 +폛 + +폜 +폜 +폜 +폜 +폜 + +폝 +폝 +폝 +폝 +폝 + +폞 +폞 +폞 +폞 +폞 + +폟 +폟 +폟 +폟 +폟 + +폠 +폠 +폠 +폠 +폠 + +폡 +폡 +폡 +폡 +폡 + +폢 +폢 +폢 +폢 +폢 + +폣 +폣 +폣 +폣 +폣 + +폤 +폤 +폤 +폤 +폤 + +폥 +폥 +폥 +폥 +폥 + +폦 +폦 +폦 +폦 +폦 + +폧 +폧 +폧 +폧 +폧 + +폨 +폨 +폨 +폨 +폨 + +폩 +폩 +폩 +폩 +폩 + +폪 +폪 +폪 +폪 +폪 + +폫 +폫 +폫 +폫 +폫 + +포 +포 +포 +포 +포 + +폭 +폭 +폭 +폭 +폭 + +폮 +폮 +폮 +폮 +폮 + +폯 +폯 +폯 +폯 +폯 + +폰 +폰 +폰 +폰 +폰 + +폱 +폱 +폱 +폱 +폱 + +폲 +폲 +폲 +폲 +폲 + +폳 +폳 +폳 +폳 +폳 + +폴 +폴 +폴 +폴 +폴 + +폵 +폵 +폵 +폵 +폵 + +폶 +폶 +폶 +폶 +폶 + +폷 +폷 +폷 +폷 +폷 + +폸 +폸 +폸 +폸 +폸 + +폹 +폹 +폹 +폹 +폹 + +폺 +폺 +폺 +폺 +폺 + +폻 +폻 +폻 +폻 +폻 + +폼 +폼 +폼 +폼 +폼 + +폽 +폽 +폽 +폽 +폽 + +폾 +폾 +폾 +폾 +폾 + +폿 +폿 +폿 +폿 +폿 + +퐀 +퐀 +퐀 +퐀 +퐀 + +퐁 +퐁 +퐁 +퐁 +퐁 + +퐂 +퐂 +퐂 +퐂 +퐂 + +퐃 +퐃 +퐃 +퐃 +퐃 + +퐄 +퐄 +퐄 +퐄 +퐄 + +퐅 +퐅 +퐅 +퐅 +퐅 + +퐆 +퐆 +퐆 +퐆 +퐆 + +퐇 +퐇 +퐇 +퐇 +퐇 + +퐈 +퐈 +퐈 +퐈 +퐈 + +퐉 +퐉 +퐉 +퐉 +퐉 + +퐊 +퐊 +퐊 +퐊 +퐊 + +퐋 +퐋 +퐋 +퐋 +퐋 + +퐌 +퐌 +퐌 +퐌 +퐌 + +퐍 +퐍 +퐍 +퐍 +퐍 + +퐎 +퐎 +퐎 +퐎 +퐎 + +퐏 +퐏 +퐏 +퐏 +퐏 + +퐐 +퐐 +퐐 +퐐 +퐐 + +퐑 +퐑 +퐑 +퐑 +퐑 + +퐒 +퐒 +퐒 +퐒 +퐒 + +퐓 +퐓 +퐓 +퐓 +퐓 + +퐔 +퐔 +퐔 +퐔 +퐔 + +퐕 +퐕 +퐕 +퐕 +퐕 + +퐖 +퐖 +퐖 +퐖 +퐖 + +퐗 +퐗 +퐗 +퐗 +퐗 + +퐘 +퐘 +퐘 +퐘 +퐘 + +퐙 +퐙 +퐙 +퐙 +퐙 + +퐚 +퐚 +퐚 +퐚 +퐚 + +퐛 +퐛 +퐛 +퐛 +퐛 + +퐜 +퐜 +퐜 +퐜 +퐜 + +퐝 +퐝 +퐝 +퐝 +퐝 + +퐞 +퐞 +퐞 +퐞 +퐞 + +퐟 +퐟 +퐟 +퐟 +퐟 + +퐠 +퐠 +퐠 +퐠 +퐠 + +퐡 +퐡 +퐡 +퐡 +퐡 + +퐢 +퐢 +퐢 +퐢 +퐢 + +퐣 +퐣 +퐣 +퐣 +퐣 + +퐤 +퐤 +퐤 +퐤 +퐤 + +퐥 +퐥 +퐥 +퐥 +퐥 + +퐦 +퐦 +퐦 +퐦 +퐦 + +퐧 +퐧 +퐧 +퐧 +퐧 + +퐨 +퐨 +퐨 +퐨 +퐨 + +퐩 +퐩 +퐩 +퐩 +퐩 + +퐪 +퐪 +퐪 +퐪 +퐪 + +퐫 +퐫 +퐫 +퐫 +퐫 + +퐬 +퐬 +퐬 +퐬 +퐬 + +퐭 +퐭 +퐭 +퐭 +퐭 + +퐮 +퐮 +퐮 +퐮 +퐮 + +퐯 +퐯 +퐯 +퐯 +퐯 + +퐰 +퐰 +퐰 +퐰 +퐰 + +퐱 +퐱 +퐱 +퐱 +퐱 + +퐲 +퐲 +퐲 +퐲 +퐲 + +퐳 +퐳 +퐳 +퐳 +퐳 + +퐴 +퐴 +퐴 +퐴 +퐴 + +퐵 +퐵 +퐵 +퐵 +퐵 + +퐶 +퐶 +퐶 +퐶 +퐶 + +퐷 +퐷 +퐷 +퐷 +퐷 + +퐸 +퐸 +퐸 +퐸 +퐸 + +퐹 +퐹 +퐹 +퐹 +퐹 + +퐺 +퐺 +퐺 +퐺 +퐺 + +퐻 +퐻 +퐻 +퐻 +퐻 + +퐼 +퐼 +퐼 +퐼 +퐼 + +퐽 +퐽 +퐽 +퐽 +퐽 + +퐾 +퐾 +퐾 +퐾 +퐾 + +퐿 +퐿 +퐿 +퐿 +퐿 + +푀 +푀 +푀 +푀 +푀 + +푁 +푁 +푁 +푁 +푁 + +푂 +푂 +푂 +푂 +푂 + +푃 +푃 +푃 +푃 +푃 + +푄 +푄 +푄 +푄 +푄 + +푅 +푅 +푅 +푅 +푅 + +푆 +푆 +푆 +푆 +푆 + +푇 +푇 +푇 +푇 +푇 + +푈 +푈 +푈 +푈 +푈 + +푉 +푉 +푉 +푉 +푉 + +푊 +푊 +푊 +푊 +푊 + +푋 +푋 +푋 +푋 +푋 + +푌 +푌 +푌 +푌 +푌 + +푍 +푍 +푍 +푍 +푍 + +푎 +푎 +푎 +푎 +푎 + +푏 +푏 +푏 +푏 +푏 + +푐 +푐 +푐 +푐 +푐 + +푑 +푑 +푑 +푑 +푑 + +푒 +푒 +푒 +푒 +푒 + +푓 +푓 +푓 +푓 +푓 + +푔 +푔 +푔 +푔 +푔 + +푕 +푕 +푕 +푕 +푕 + +푖 +푖 +푖 +푖 +푖 + +푗 +푗 +푗 +푗 +푗 + +푘 +푘 +푘 +푘 +푘 + +푙 +푙 +푙 +푙 +푙 + +푚 +푚 +푚 +푚 +푚 + +푛 +푛 +푛 +푛 +푛 + +표 +표 +표 +표 +표 + +푝 +푝 +푝 +푝 +푝 + +푞 +푞 +푞 +푞 +푞 + +푟 +푟 +푟 +푟 +푟 + +푠 +푠 +푠 +푠 +푠 + +푡 +푡 +푡 +푡 +푡 + +푢 +푢 +푢 +푢 +푢 + +푣 +푣 +푣 +푣 +푣 + +푤 +푤 +푤 +푤 +푤 + +푥 +푥 +푥 +푥 +푥 + +푦 +푦 +푦 +푦 +푦 + +푧 +푧 +푧 +푧 +푧 + +푨 +푨 +푨 +푨 +푨 + +푩 +푩 +푩 +푩 +푩 + +푪 +푪 +푪 +푪 +푪 + +푫 +푫 +푫 +푫 +푫 + +푬 +푬 +푬 +푬 +푬 + +푭 +푭 +푭 +푭 +푭 + +푮 +푮 +푮 +푮 +푮 + +푯 +푯 +푯 +푯 +푯 + +푰 +푰 +푰 +푰 +푰 + +푱 +푱 +푱 +푱 +푱 + +푲 +푲 +푲 +푲 +푲 + +푳 +푳 +푳 +푳 +푳 + +푴 +푴 +푴 +푴 +푴 + +푵 +푵 +푵 +푵 +푵 + +푶 +푶 +푶 +푶 +푶 + +푷 +푷 +푷 +푷 +푷 + +푸 +푸 +푸 +푸 +푸 + +푹 +푹 +푹 +푹 +푹 + +푺 +푺 +푺 +푺 +푺 + +푻 +푻 +푻 +푻 +푻 + +푼 +푼 +푼 +푼 +푼 + +푽 +푽 +푽 +푽 +푽 + +푾 +푾 +푾 +푾 +푾 + +푿 +푿 +푿 +푿 +푿 + +풀 +풀 +풀 +풀 +풀 + +풁 +풁 +풁 +풁 +풁 + +풂 +풂 +풂 +풂 +풂 + +풃 +풃 +풃 +풃 +풃 + +풄 +풄 +풄 +풄 +풄 + +풅 +풅 +풅 +풅 +풅 + +풆 +풆 +풆 +풆 +풆 + +풇 +풇 +풇 +풇 +풇 + +품 +품 +품 +품 +품 + +풉 +풉 +풉 +풉 +풉 + +풊 +풊 +풊 +풊 +풊 + +풋 +풋 +풋 +풋 +풋 + +풌 +풌 +풌 +풌 +풌 + +풍 +풍 +풍 +풍 +풍 + +풎 +풎 +풎 +풎 +풎 + +풏 +풏 +풏 +풏 +풏 + +풐 +풐 +풐 +풐 +풐 + +풑 +풑 +풑 +풑 +풑 + +풒 +풒 +풒 +풒 +풒 + +풓 +풓 +풓 +풓 +풓 + +풔 +풔 +풔 +풔 +풔 + +풕 +풕 +풕 +풕 +풕 + +풖 +풖 +풖 +풖 +풖 + +풗 +풗 +풗 +풗 +풗 + +풘 +풘 +풘 +풘 +풘 + +풙 +풙 +풙 +풙 +풙 + +풚 +풚 +풚 +풚 +풚 + +풛 +풛 +풛 +풛 +풛 + +풜 +풜 +풜 +풜 +풜 + +풝 +풝 +풝 +풝 +풝 + +풞 +풞 +풞 +풞 +풞 + +풟 +풟 +풟 +풟 +풟 + +풠 +풠 +풠 +풠 +풠 + +풡 +풡 +풡 +풡 +풡 + +풢 +풢 +풢 +풢 +풢 + +풣 +풣 +풣 +풣 +풣 + +풤 +풤 +풤 +풤 +풤 + +풥 +풥 +풥 +풥 +풥 + +풦 +풦 +풦 +풦 +풦 + +풧 +풧 +풧 +풧 +풧 + +풨 +풨 +풨 +풨 +풨 + +풩 +풩 +풩 +풩 +풩 + +풪 +풪 +풪 +풪 +풪 + +풫 +풫 +풫 +풫 +풫 + +풬 +풬 +풬 +풬 +풬 + +풭 +풭 +풭 +풭 +풭 + +풮 +풮 +풮 +풮 +풮 + +풯 +풯 +풯 +풯 +풯 + +풰 +풰 +풰 +풰 +풰 + +풱 +풱 +풱 +풱 +풱 + +풲 +풲 +풲 +풲 +풲 + +풳 +풳 +풳 +풳 +풳 + +풴 +풴 +풴 +풴 +풴 + +풵 +풵 +풵 +풵 +풵 + +풶 +풶 +풶 +풶 +풶 + +풷 +풷 +풷 +풷 +풷 + +풸 +풸 +풸 +풸 +풸 + +풹 +풹 +풹 +풹 +풹 + +풺 +풺 +풺 +풺 +풺 + +풻 +풻 +풻 +풻 +풻 + +풼 +풼 +풼 +풼 +풼 + +풽 +풽 +풽 +풽 +풽 + +풾 +풾 +풾 +풾 +풾 + +풿 +풿 +풿 +풿 +풿 + +퓀 +퓀 +퓀 +퓀 +퓀 + +퓁 +퓁 +퓁 +퓁 +퓁 + +퓂 +퓂 +퓂 +퓂 +퓂 + +퓃 +퓃 +퓃 +퓃 +퓃 + +퓄 +퓄 +퓄 +퓄 +퓄 + +퓅 +퓅 +퓅 +퓅 +퓅 + +퓆 +퓆 +퓆 +퓆 +퓆 + +퓇 +퓇 +퓇 +퓇 +퓇 + +퓈 +퓈 +퓈 +퓈 +퓈 + +퓉 +퓉 +퓉 +퓉 +퓉 + +퓊 +퓊 +퓊 +퓊 +퓊 + +퓋 +퓋 +퓋 +퓋 +퓋 + +퓌 +퓌 +퓌 +퓌 +퓌 + +퓍 +퓍 +퓍 +퓍 +퓍 + +퓎 +퓎 +퓎 +퓎 +퓎 + +퓏 +퓏 +퓏 +퓏 +퓏 + +퓐 +퓐 +퓐 +퓐 +퓐 + +퓑 +퓑 +퓑 +퓑 +퓑 + +퓒 +퓒 +퓒 +퓒 +퓒 + +퓓 +퓓 +퓓 +퓓 +퓓 + +퓔 +퓔 +퓔 +퓔 +퓔 + +퓕 +퓕 +퓕 +퓕 +퓕 + +퓖 +퓖 +퓖 +퓖 +퓖 + +퓗 +퓗 +퓗 +퓗 +퓗 + +퓘 +퓘 +퓘 +퓘 +퓘 + +퓙 +퓙 +퓙 +퓙 +퓙 + +퓚 +퓚 +퓚 +퓚 +퓚 + +퓛 +퓛 +퓛 +퓛 +퓛 + +퓜 +퓜 +퓜 +퓜 +퓜 + +퓝 +퓝 +퓝 +퓝 +퓝 + +퓞 +퓞 +퓞 +퓞 +퓞 + +퓟 +퓟 +퓟 +퓟 +퓟 + +퓠 +퓠 +퓠 +퓠 +퓠 + +퓡 +퓡 +퓡 +퓡 +퓡 + +퓢 +퓢 +퓢 +퓢 +퓢 + +퓣 +퓣 +퓣 +퓣 +퓣 + +퓤 +퓤 +퓤 +퓤 +퓤 + +퓥 +퓥 +퓥 +퓥 +퓥 + +퓦 +퓦 +퓦 +퓦 +퓦 + +퓧 +퓧 +퓧 +퓧 +퓧 + +퓨 +퓨 +퓨 +퓨 +퓨 + +퓩 +퓩 +퓩 +퓩 +퓩 + +퓪 +퓪 +퓪 +퓪 +퓪 + +퓫 +퓫 +퓫 +퓫 +퓫 + +퓬 +퓬 +퓬 +퓬 +퓬 + +퓭 +퓭 +퓭 +퓭 +퓭 + +퓮 +퓮 +퓮 +퓮 +퓮 + +퓯 +퓯 +퓯 +퓯 +퓯 + +퓰 +퓰 +퓰 +퓰 +퓰 + +퓱 +퓱 +퓱 +퓱 +퓱 + +퓲 +퓲 +퓲 +퓲 +퓲 + +퓳 +퓳 +퓳 +퓳 +퓳 + +퓴 +퓴 +퓴 +퓴 +퓴 + +퓵 +퓵 +퓵 +퓵 +퓵 + +퓶 +퓶 +퓶 +퓶 +퓶 + +퓷 +퓷 +퓷 +퓷 +퓷 + +퓸 +퓸 +퓸 +퓸 +퓸 + +퓹 +퓹 +퓹 +퓹 +퓹 + +퓺 +퓺 +퓺 +퓺 +퓺 + +퓻 +퓻 +퓻 +퓻 +퓻 + +퓼 +퓼 +퓼 +퓼 +퓼 + +퓽 +퓽 +퓽 +퓽 +퓽 + +퓾 +퓾 +퓾 +퓾 +퓾 + +퓿 +퓿 +퓿 +퓿 +퓿 + +픀 +픀 +픀 +픀 +픀 + +픁 +픁 +픁 +픁 +픁 + +픂 +픂 +픂 +픂 +픂 + +픃 +픃 +픃 +픃 +픃 + +프 +프 +프 +프 +프 + +픅 +픅 +픅 +픅 +픅 + +픆 +픆 +픆 +픆 +픆 + +픇 +픇 +픇 +픇 +픇 + +픈 +픈 +픈 +픈 +픈 + +픉 +픉 +픉 +픉 +픉 + +픊 +픊 +픊 +픊 +픊 + +픋 +픋 +픋 +픋 +픋 + +플 +플 +플 +플 +플 + +픍 +픍 +픍 +픍 +픍 + +픎 +픎 +픎 +픎 +픎 + +픏 +픏 +픏 +픏 +픏 + +픐 +픐 +픐 +픐 +픐 + +픑 +픑 +픑 +픑 +픑 + +픒 +픒 +픒 +픒 +픒 + +픓 +픓 +픓 +픓 +픓 + +픔 +픔 +픔 +픔 +픔 + +픕 +픕 +픕 +픕 +픕 + +픖 +픖 +픖 +픖 +픖 + +픗 +픗 +픗 +픗 +픗 + +픘 +픘 +픘 +픘 +픘 + +픙 +픙 +픙 +픙 +픙 + +픚 +픚 +픚 +픚 +픚 + +픛 +픛 +픛 +픛 +픛 + +픜 +픜 +픜 +픜 +픜 + +픝 +픝 +픝 +픝 +픝 + +픞 +픞 +픞 +픞 +픞 + +픟 +픟 +픟 +픟 +픟 + +픠 +픠 +픠 +픠 +픠 + +픡 +픡 +픡 +픡 +픡 + +픢 +픢 +픢 +픢 +픢 + +픣 +픣 +픣 +픣 +픣 + +픤 +픤 +픤 +픤 +픤 + +픥 +픥 +픥 +픥 +픥 + +픦 +픦 +픦 +픦 +픦 + +픧 +픧 +픧 +픧 +픧 + +픨 +픨 +픨 +픨 +픨 + +픩 +픩 +픩 +픩 +픩 + +픪 +픪 +픪 +픪 +픪 + +픫 +픫 +픫 +픫 +픫 + +픬 +픬 +픬 +픬 +픬 + +픭 +픭 +픭 +픭 +픭 + +픮 +픮 +픮 +픮 +픮 + +픯 +픯 +픯 +픯 +픯 + +픰 +픰 +픰 +픰 +픰 + +픱 +픱 +픱 +픱 +픱 + +픲 +픲 +픲 +픲 +픲 + +픳 +픳 +픳 +픳 +픳 + +픴 +픴 +픴 +픴 +픴 + +픵 +픵 +픵 +픵 +픵 + +픶 +픶 +픶 +픶 +픶 + +픷 +픷 +픷 +픷 +픷 + +픸 +픸 +픸 +픸 +픸 + +픹 +픹 +픹 +픹 +픹 + +픺 +픺 +픺 +픺 +픺 + +픻 +픻 +픻 +픻 +픻 + +피 +피 +피 +피 +피 + +픽 +픽 +픽 +픽 +픽 + +픾 +픾 +픾 +픾 +픾 + +픿 +픿 +픿 +픿 +픿 + +핀 +핀 +핀 +핀 +핀 + +핁 +핁 +핁 +핁 +핁 + +핂 +핂 +핂 +핂 +핂 + +핃 +핃 +핃 +핃 +핃 + +필 +필 +필 +필 +필 + +핅 +핅 +핅 +핅 +핅 + +핆 +핆 +핆 +핆 +핆 + +핇 +핇 +핇 +핇 +핇 + +핈 +핈 +핈 +핈 +핈 + +핉 +핉 +핉 +핉 +핉 + +핊 +핊 +핊 +핊 +핊 + +핋 +핋 +핋 +핋 +핋 + +핌 +핌 +핌 +핌 +핌 + +핍 +핍 +핍 +핍 +핍 + +핎 +핎 +핎 +핎 +핎 + +핏 +핏 +핏 +핏 +핏 + +핐 +핐 +핐 +핐 +핐 + +핑 +핑 +핑 +핑 +핑 + +핒 +핒 +핒 +핒 +핒 + +핓 +핓 +핓 +핓 +핓 + +핔 +핔 +핔 +핔 +핔 + +핕 +핕 +핕 +핕 +핕 + +핖 +핖 +핖 +핖 +핖 + +핗 +핗 +핗 +핗 +핗 + +하 +하 +하 +하 +하 + +학 +학 +학 +학 +학 + +핚 +핚 +핚 +핚 +핚 + +핛 +핛 +핛 +핛 +핛 + +한 +한 +한 +한 +한 + +핝 +핝 +핝 +핝 +핝 + +핞 +핞 +핞 +핞 +핞 + +핟 +핟 +핟 +핟 +핟 + +할 +할 +할 +할 +할 + +핡 +핡 +핡 +핡 +핡 + +핢 +핢 +핢 +핢 +핢 + +핣 +핣 +핣 +핣 +핣 + +핤 +핤 +핤 +핤 +핤 + +핥 +핥 +핥 +핥 +핥 + +핦 +핦 +핦 +핦 +핦 + +핧 +핧 +핧 +핧 +핧 + +함 +함 +함 +함 +함 + +합 +합 +합 +합 +합 + +핪 +핪 +핪 +핪 +핪 + +핫 +핫 +핫 +핫 +핫 + +핬 +핬 +핬 +핬 +핬 + +항 +항 +항 +항 +항 + +핮 +핮 +핮 +핮 +핮 + +핯 +핯 +핯 +핯 +핯 + +핰 +핰 +핰 +핰 +핰 + +핱 +핱 +핱 +핱 +핱 + +핲 +핲 +핲 +핲 +핲 + +핳 +핳 +핳 +핳 +핳 + +해 +해 +해 +해 +해 + +핵 +핵 +핵 +핵 +핵 + +핶 +핶 +핶 +핶 +핶 + +핷 +핷 +핷 +핷 +핷 + +핸 +핸 +핸 +핸 +핸 + +핹 +핹 +핹 +핹 +핹 + +핺 +핺 +핺 +핺 +핺 + +핻 +핻 +핻 +핻 +핻 + +핼 +핼 +핼 +핼 +핼 + +핽 +핽 +핽 +핽 +핽 + +핾 +핾 +핾 +핾 +핾 + +핿 +핿 +핿 +핿 +핿 + +햀 +햀 +햀 +햀 +햀 + +햁 +햁 +햁 +햁 +햁 + +햂 +햂 +햂 +햂 +햂 + +햃 +햃 +햃 +햃 +햃 + +햄 +햄 +햄 +햄 +햄 + +햅 +햅 +햅 +햅 +햅 + +햆 +햆 +햆 +햆 +햆 + +햇 +햇 +햇 +햇 +햇 + +했 +했 +했 +했 +했 + +행 +행 +행 +행 +행 + +햊 +햊 +햊 +햊 +햊 + +햋 +햋 +햋 +햋 +햋 + +햌 +햌 +햌 +햌 +햌 + +햍 +햍 +햍 +햍 +햍 + +햎 +햎 +햎 +햎 +햎 + +햏 +햏 +햏 +햏 +햏 + +햐 +햐 +햐 +햐 +햐 + +햑 +햑 +햑 +햑 +햑 + +햒 +햒 +햒 +햒 +햒 + +햓 +햓 +햓 +햓 +햓 + +햔 +햔 +햔 +햔 +햔 + +햕 +햕 +햕 +햕 +햕 + +햖 +햖 +햖 +햖 +햖 + +햗 +햗 +햗 +햗 +햗 + +햘 +햘 +햘 +햘 +햘 + +햙 +햙 +햙 +햙 +햙 + +햚 +햚 +햚 +햚 +햚 + +햛 +햛 +햛 +햛 +햛 + +햜 +햜 +햜 +햜 +햜 + +햝 +햝 +햝 +햝 +햝 + +햞 +햞 +햞 +햞 +햞 + +햟 +햟 +햟 +햟 +햟 + +햠 +햠 +햠 +햠 +햠 + +햡 +햡 +햡 +햡 +햡 + +햢 +햢 +햢 +햢 +햢 + +햣 +햣 +햣 +햣 +햣 + +햤 +햤 +햤 +햤 +햤 + +향 +향 +향 +향 +향 + +햦 +햦 +햦 +햦 +햦 + +햧 +햧 +햧 +햧 +햧 + +햨 +햨 +햨 +햨 +햨 + +햩 +햩 +햩 +햩 +햩 + +햪 +햪 +햪 +햪 +햪 + +햫 +햫 +햫 +햫 +햫 + +햬 +햬 +햬 +햬 +햬 + +햭 +햭 +햭 +햭 +햭 + +햮 +햮 +햮 +햮 +햮 + +햯 +햯 +햯 +햯 +햯 + +햰 +햰 +햰 +햰 +햰 + +햱 +햱 +햱 +햱 +햱 + +햲 +햲 +햲 +햲 +햲 + +햳 +햳 +햳 +햳 +햳 + +햴 +햴 +햴 +햴 +햴 + +햵 +햵 +햵 +햵 +햵 + +햶 +햶 +햶 +햶 +햶 + +햷 +햷 +햷 +햷 +햷 + +햸 +햸 +햸 +햸 +햸 + +햹 +햹 +햹 +햹 +햹 + +햺 +햺 +햺 +햺 +햺 + +햻 +햻 +햻 +햻 +햻 + +햼 +햼 +햼 +햼 +햼 + +햽 +햽 +햽 +햽 +햽 + +햾 +햾 +햾 +햾 +햾 + +햿 +햿 +햿 +햿 +햿 + +헀 +헀 +헀 +헀 +헀 + +헁 +헁 +헁 +헁 +헁 + +헂 +헂 +헂 +헂 +헂 + +헃 +헃 +헃 +헃 +헃 + +헄 +헄 +헄 +헄 +헄 + +헅 +헅 +헅 +헅 +헅 + +헆 +헆 +헆 +헆 +헆 + +헇 +헇 +헇 +헇 +헇 + +허 +허 +허 +허 +허 + +헉 +헉 +헉 +헉 +헉 + +헊 +헊 +헊 +헊 +헊 + +헋 +헋 +헋 +헋 +헋 + +헌 +헌 +헌 +헌 +헌 + +헍 +헍 +헍 +헍 +헍 + +헎 +헎 +헎 +헎 +헎 + +헏 +헏 +헏 +헏 +헏 + +헐 +헐 +헐 +헐 +헐 + +헑 +헑 +헑 +헑 +헑 + +헒 +헒 +헒 +헒 +헒 + +헓 +헓 +헓 +헓 +헓 + +헔 +헔 +헔 +헔 +헔 + +헕 +헕 +헕 +헕 +헕 + +헖 +헖 +헖 +헖 +헖 + +헗 +헗 +헗 +헗 +헗 + +험 +험 +험 +험 +험 + +헙 +헙 +헙 +헙 +헙 + +헚 +헚 +헚 +헚 +헚 + +헛 +헛 +헛 +헛 +헛 + +헜 +헜 +헜 +헜 +헜 + +헝 +헝 +헝 +헝 +헝 + +헞 +헞 +헞 +헞 +헞 + +헟 +헟 +헟 +헟 +헟 + +헠 +헠 +헠 +헠 +헠 + +헡 +헡 +헡 +헡 +헡 + +헢 +헢 +헢 +헢 +헢 + +헣 +헣 +헣 +헣 +헣 + +헤 +헤 +헤 +헤 +헤 + +헥 +헥 +헥 +헥 +헥 + +헦 +헦 +헦 +헦 +헦 + +헧 +헧 +헧 +헧 +헧 + +헨 +헨 +헨 +헨 +헨 + +헩 +헩 +헩 +헩 +헩 + +헪 +헪 +헪 +헪 +헪 + +헫 +헫 +헫 +헫 +헫 + +헬 +헬 +헬 +헬 +헬 + +헭 +헭 +헭 +헭 +헭 + +헮 +헮 +헮 +헮 +헮 + +헯 +헯 +헯 +헯 +헯 + +헰 +헰 +헰 +헰 +헰 + +헱 +헱 +헱 +헱 +헱 + +헲 +헲 +헲 +헲 +헲 + +헳 +헳 +헳 +헳 +헳 + +헴 +헴 +헴 +헴 +헴 + +헵 +헵 +헵 +헵 +헵 + +헶 +헶 +헶 +헶 +헶 + +헷 +헷 +헷 +헷 +헷 + +헸 +헸 +헸 +헸 +헸 + +헹 +헹 +헹 +헹 +헹 + +헺 +헺 +헺 +헺 +헺 + +헻 +헻 +헻 +헻 +헻 + +헼 +헼 +헼 +헼 +헼 + +헽 +헽 +헽 +헽 +헽 + +헾 +헾 +헾 +헾 +헾 + +헿 +헿 +헿 +헿 +헿 + +혀 +혀 +혀 +혀 +혀 + +혁 +혁 +혁 +혁 +혁 + +혂 +혂 +혂 +혂 +혂 + +혃 +혃 +혃 +혃 +혃 + +현 +현 +현 +현 +현 + +혅 +혅 +혅 +혅 +혅 + +혆 +혆 +혆 +혆 +혆 + +혇 +혇 +혇 +혇 +혇 + +혈 +혈 +혈 +혈 +혈 + +혉 +혉 +혉 +혉 +혉 + +혊 +혊 +혊 +혊 +혊 + +혋 +혋 +혋 +혋 +혋 + +혌 +혌 +혌 +혌 +혌 + +혍 +혍 +혍 +혍 +혍 + +혎 +혎 +혎 +혎 +혎 + +혏 +혏 +혏 +혏 +혏 + +혐 +혐 +혐 +혐 +혐 + +협 +협 +협 +협 +협 + +혒 +혒 +혒 +혒 +혒 + +혓 +혓 +혓 +혓 +혓 + +혔 +혔 +혔 +혔 +혔 + +형 +형 +형 +형 +형 + +혖 +혖 +혖 +혖 +혖 + +혗 +혗 +혗 +혗 +혗 + +혘 +혘 +혘 +혘 +혘 + +혙 +혙 +혙 +혙 +혙 + +혚 +혚 +혚 +혚 +혚 + +혛 +혛 +혛 +혛 +혛 + +혜 +혜 +혜 +혜 +혜 + +혝 +혝 +혝 +혝 +혝 + +혞 +혞 +혞 +혞 +혞 + +혟 +혟 +혟 +혟 +혟 + +혠 +혠 +혠 +혠 +혠 + +혡 +혡 +혡 +혡 +혡 + +혢 +혢 +혢 +혢 +혢 + +혣 +혣 +혣 +혣 +혣 + +혤 +혤 +혤 +혤 +혤 + +혥 +혥 +혥 +혥 +혥 + +혦 +혦 +혦 +혦 +혦 + +혧 +혧 +혧 +혧 +혧 + +혨 +혨 +혨 +혨 +혨 + +혩 +혩 +혩 +혩 +혩 + +혪 +혪 +혪 +혪 +혪 + +혫 +혫 +혫 +혫 +혫 + +혬 +혬 +혬 +혬 +혬 + +혭 +혭 +혭 +혭 +혭 + +혮 +혮 +혮 +혮 +혮 + +혯 +혯 +혯 +혯 +혯 + +혰 +혰 +혰 +혰 +혰 + +혱 +혱 +혱 +혱 +혱 + +혲 +혲 +혲 +혲 +혲 + +혳 +혳 +혳 +혳 +혳 + +혴 +혴 +혴 +혴 +혴 + +혵 +혵 +혵 +혵 +혵 + +혶 +혶 +혶 +혶 +혶 + +혷 +혷 +혷 +혷 +혷 + +호 +호 +호 +호 +호 + +혹 +혹 +혹 +혹 +혹 + +혺 +혺 +혺 +혺 +혺 + +혻 +혻 +혻 +혻 +혻 + +혼 +혼 +혼 +혼 +혼 + +혽 +혽 +혽 +혽 +혽 + +혾 +혾 +혾 +혾 +혾 + +혿 +혿 +혿 +혿 +혿 + +홀 +홀 +홀 +홀 +홀 + +홁 +홁 +홁 +홁 +홁 + +홂 +홂 +홂 +홂 +홂 + +홃 +홃 +홃 +홃 +홃 + +홄 +홄 +홄 +홄 +홄 + +홅 +홅 +홅 +홅 +홅 + +홆 +홆 +홆 +홆 +홆 + +홇 +홇 +홇 +홇 +홇 + +홈 +홈 +홈 +홈 +홈 + +홉 +홉 +홉 +홉 +홉 + +홊 +홊 +홊 +홊 +홊 + +홋 +홋 +홋 +홋 +홋 + +홌 +홌 +홌 +홌 +홌 + +홍 +홍 +홍 +홍 +홍 + +홎 +홎 +홎 +홎 +홎 + +홏 +홏 +홏 +홏 +홏 + +홐 +홐 +홐 +홐 +홐 + +홑 +홑 +홑 +홑 +홑 + +홒 +홒 +홒 +홒 +홒 + +홓 +홓 +홓 +홓 +홓 + +화 +화 +화 +화 +화 + +확 +확 +확 +확 +확 + +홖 +홖 +홖 +홖 +홖 + +홗 +홗 +홗 +홗 +홗 + +환 +환 +환 +환 +환 + +홙 +홙 +홙 +홙 +홙 + +홚 +홚 +홚 +홚 +홚 + +홛 +홛 +홛 +홛 +홛 + +활 +활 +활 +활 +활 + +홝 +홝 +홝 +홝 +홝 + +홞 +홞 +홞 +홞 +홞 + +홟 +홟 +홟 +홟 +홟 + +홠 +홠 +홠 +홠 +홠 + +홡 +홡 +홡 +홡 +홡 + +홢 +홢 +홢 +홢 +홢 + +홣 +홣 +홣 +홣 +홣 + +홤 +홤 +홤 +홤 +홤 + +홥 +홥 +홥 +홥 +홥 + +홦 +홦 +홦 +홦 +홦 + +홧 +홧 +홧 +홧 +홧 + +홨 +홨 +홨 +홨 +홨 + +황 +황 +황 +황 +황 + +홪 +홪 +홪 +홪 +홪 + +홫 +홫 +홫 +홫 +홫 + +홬 +홬 +홬 +홬 +홬 + +홭 +홭 +홭 +홭 +홭 + +홮 +홮 +홮 +홮 +홮 + +홯 +홯 +홯 +홯 +홯 + +홰 +홰 +홰 +홰 +홰 + +홱 +홱 +홱 +홱 +홱 + +홲 +홲 +홲 +홲 +홲 + +홳 +홳 +홳 +홳 +홳 + +홴 +홴 +홴 +홴 +홴 + +홵 +홵 +홵 +홵 +홵 + +홶 +홶 +홶 +홶 +홶 + +홷 +홷 +홷 +홷 +홷 + +홸 +홸 +홸 +홸 +홸 + +홹 +홹 +홹 +홹 +홹 + +홺 +홺 +홺 +홺 +홺 + +홻 +홻 +홻 +홻 +홻 + +홼 +홼 +홼 +홼 +홼 + +홽 +홽 +홽 +홽 +홽 + +홾 +홾 +홾 +홾 +홾 + +홿 +홿 +홿 +홿 +홿 + +횀 +횀 +횀 +횀 +횀 + +횁 +횁 +횁 +횁 +횁 + +횂 +횂 +횂 +횂 +횂 + +횃 +횃 +횃 +횃 +횃 + +횄 +횄 +횄 +횄 +횄 + +횅 +횅 +횅 +횅 +횅 + +횆 +횆 +횆 +횆 +횆 + +횇 +횇 +횇 +횇 +횇 + +횈 +횈 +횈 +횈 +횈 + +횉 +횉 +횉 +횉 +횉 + +횊 +횊 +횊 +횊 +횊 + +횋 +횋 +횋 +횋 +횋 + +회 +회 +회 +회 +회 + +획 +획 +획 +획 +획 + +횎 +횎 +횎 +횎 +횎 + +횏 +횏 +횏 +횏 +횏 + +횐 +횐 +횐 +횐 +횐 + +횑 +횑 +횑 +횑 +횑 + +횒 +횒 +횒 +횒 +횒 + +횓 +횓 +횓 +횓 +횓 + +횔 +횔 +횔 +횔 +횔 + +횕 +횕 +횕 +횕 +횕 + +횖 +횖 +횖 +횖 +횖 + +횗 +횗 +횗 +횗 +횗 + +횘 +횘 +횘 +횘 +횘 + +횙 +횙 +횙 +횙 +횙 + +횚 +횚 +횚 +횚 +횚 + +횛 +횛 +횛 +횛 +횛 + +횜 +횜 +횜 +횜 +횜 + +횝 +횝 +횝 +횝 +횝 + +횞 +횞 +횞 +횞 +횞 + +횟 +횟 +횟 +횟 +횟 + +횠 +횠 +횠 +횠 +횠 + +횡 +횡 +횡 +횡 +횡 + +횢 +횢 +횢 +횢 +횢 + +횣 +횣 +횣 +횣 +횣 + +횤 +횤 +횤 +횤 +횤 + +횥 +횥 +횥 +횥 +횥 + +횦 +횦 +횦 +횦 +횦 + +횧 +횧 +횧 +횧 +횧 + +효 +효 +효 +효 +효 + +횩 +횩 +횩 +횩 +횩 + +횪 +횪 +횪 +횪 +횪 + +횫 +횫 +횫 +횫 +횫 + +횬 +횬 +횬 +횬 +횬 + +횭 +횭 +횭 +횭 +횭 + +횮 +횮 +횮 +횮 +횮 + +횯 +횯 +횯 +횯 +횯 + +횰 +횰 +횰 +횰 +횰 + +횱 +횱 +횱 +횱 +횱 + +횲 +횲 +횲 +횲 +횲 + +횳 +횳 +횳 +횳 +횳 + +횴 +횴 +횴 +횴 +횴 + +횵 +횵 +횵 +횵 +횵 + +횶 +횶 +횶 +횶 +횶 + +횷 +횷 +횷 +횷 +횷 + +횸 +횸 +횸 +횸 +횸 + +횹 +횹 +횹 +횹 +횹 + +횺 +횺 +횺 +횺 +횺 + +횻 +횻 +횻 +횻 +횻 + +횼 +횼 +횼 +횼 +횼 + +횽 +횽 +횽 +횽 +횽 + +횾 +횾 +횾 +횾 +횾 + +횿 +횿 +횿 +횿 +횿 + +훀 +훀 +훀 +훀 +훀 + +훁 +훁 +훁 +훁 +훁 + +훂 +훂 +훂 +훂 +훂 + +훃 +훃 +훃 +훃 +훃 + +후 +후 +후 +후 +후 + +훅 +훅 +훅 +훅 +훅 + +훆 +훆 +훆 +훆 +훆 + +훇 +훇 +훇 +훇 +훇 + +훈 +훈 +훈 +훈 +훈 + +훉 +훉 +훉 +훉 +훉 + +훊 +훊 +훊 +훊 +훊 + +훋 +훋 +훋 +훋 +훋 + +훌 +훌 +훌 +훌 +훌 + +훍 +훍 +훍 +훍 +훍 + +훎 +훎 +훎 +훎 +훎 + +훏 +훏 +훏 +훏 +훏 + +훐 +훐 +훐 +훐 +훐 + +훑 +훑 +훑 +훑 +훑 + +훒 +훒 +훒 +훒 +훒 + +훓 +훓 +훓 +훓 +훓 + +훔 +훔 +훔 +훔 +훔 + +훕 +훕 +훕 +훕 +훕 + +훖 +훖 +훖 +훖 +훖 + +훗 +훗 +훗 +훗 +훗 + +훘 +훘 +훘 +훘 +훘 + +훙 +훙 +훙 +훙 +훙 + +훚 +훚 +훚 +훚 +훚 + +훛 +훛 +훛 +훛 +훛 + +훜 +훜 +훜 +훜 +훜 + +훝 +훝 +훝 +훝 +훝 + +훞 +훞 +훞 +훞 +훞 + +훟 +훟 +훟 +훟 +훟 + +훠 +훠 +훠 +훠 +훠 + +훡 +훡 +훡 +훡 +훡 + +훢 +훢 +훢 +훢 +훢 + +훣 +훣 +훣 +훣 +훣 + +훤 +훤 +훤 +훤 +훤 + +훥 +훥 +훥 +훥 +훥 + +훦 +훦 +훦 +훦 +훦 + +훧 +훧 +훧 +훧 +훧 + +훨 +훨 +훨 +훨 +훨 + +훩 +훩 +훩 +훩 +훩 + +훪 +훪 +훪 +훪 +훪 + +훫 +훫 +훫 +훫 +훫 + +훬 +훬 +훬 +훬 +훬 + +훭 +훭 +훭 +훭 +훭 + +훮 +훮 +훮 +훮 +훮 + +훯 +훯 +훯 +훯 +훯 + +훰 +훰 +훰 +훰 +훰 + +훱 +훱 +훱 +훱 +훱 + +훲 +훲 +훲 +훲 +훲 + +훳 +훳 +훳 +훳 +훳 + +훴 +훴 +훴 +훴 +훴 + +훵 +훵 +훵 +훵 +훵 + +훶 +훶 +훶 +훶 +훶 + +훷 +훷 +훷 +훷 +훷 + +훸 +훸 +훸 +훸 +훸 + +훹 +훹 +훹 +훹 +훹 + +훺 +훺 +훺 +훺 +훺 + +훻 +훻 +훻 +훻 +훻 + +훼 +훼 +훼 +훼 +훼 + +훽 +훽 +훽 +훽 +훽 + +훾 +훾 +훾 +훾 +훾 + +훿 +훿 +훿 +훿 +훿 + +휀 +휀 +휀 +휀 +휀 + +휁 +휁 +휁 +휁 +휁 + +휂 +휂 +휂 +휂 +휂 + +휃 +휃 +휃 +휃 +휃 + +휄 +휄 +휄 +휄 +휄 + +휅 +휅 +휅 +휅 +휅 + +휆 +휆 +휆 +휆 +휆 + +휇 +휇 +휇 +휇 +휇 + +휈 +휈 +휈 +휈 +휈 + +휉 +휉 +휉 +휉 +휉 + +휊 +휊 +휊 +휊 +휊 + +휋 +휋 +휋 +휋 +휋 + +휌 +휌 +휌 +휌 +휌 + +휍 +휍 +휍 +휍 +휍 + +휎 +휎 +휎 +휎 +휎 + +휏 +휏 +휏 +휏 +휏 + +휐 +휐 +휐 +휐 +휐 + +휑 +휑 +휑 +휑 +휑 + +휒 +휒 +휒 +휒 +휒 + +휓 +휓 +휓 +휓 +휓 + +휔 +휔 +휔 +휔 +휔 + +휕 +휕 +휕 +휕 +휕 + +휖 +휖 +휖 +휖 +휖 + +휗 +휗 +휗 +휗 +휗 + +휘 +휘 +휘 +휘 +휘 + +휙 +휙 +휙 +휙 +휙 + +휚 +휚 +휚 +휚 +휚 + +휛 +휛 +휛 +휛 +휛 + +휜 +휜 +휜 +휜 +휜 + +휝 +휝 +휝 +휝 +휝 + +휞 +휞 +휞 +휞 +휞 + +휟 +휟 +휟 +휟 +휟 + +휠 +휠 +휠 +휠 +휠 + +휡 +휡 +휡 +휡 +휡 + +휢 +휢 +휢 +휢 +휢 + +휣 +휣 +휣 +휣 +휣 + +휤 +휤 +휤 +휤 +휤 + +휥 +휥 +휥 +휥 +휥 + +휦 +휦 +휦 +휦 +휦 + +휧 +휧 +휧 +휧 +휧 + +휨 +휨 +휨 +휨 +휨 + +휩 +휩 +휩 +휩 +휩 + +휪 +휪 +휪 +휪 +휪 + +휫 +휫 +휫 +휫 +휫 + +휬 +휬 +휬 +휬 +휬 + +휭 +휭 +휭 +휭 +휭 + +휮 +휮 +휮 +휮 +휮 + +휯 +휯 +휯 +휯 +휯 + +휰 +휰 +휰 +휰 +휰 + +휱 +휱 +휱 +휱 +휱 + +휲 +휲 +휲 +휲 +휲 + +휳 +휳 +휳 +휳 +휳 + +휴 +휴 +휴 +휴 +휴 + +휵 +휵 +휵 +휵 +휵 + +휶 +휶 +휶 +휶 +휶 + +휷 +휷 +휷 +휷 +휷 + +휸 +휸 +휸 +휸 +휸 + +휹 +휹 +휹 +휹 +휹 + +휺 +휺 +휺 +휺 +휺 + +휻 +휻 +휻 +휻 +휻 + +휼 +휼 +휼 +휼 +휼 + +휽 +휽 +휽 +휽 +휽 + +휾 +휾 +휾 +휾 +휾 + +휿 +휿 +휿 +휿 +휿 + +흀 +흀 +흀 +흀 +흀 + +흁 +흁 +흁 +흁 +흁 + +흂 +흂 +흂 +흂 +흂 + +흃 +흃 +흃 +흃 +흃 + +흄 +흄 +흄 +흄 +흄 + +흅 +흅 +흅 +흅 +흅 + +흆 +흆 +흆 +흆 +흆 + +흇 +흇 +흇 +흇 +흇 + +흈 +흈 +흈 +흈 +흈 + +흉 +흉 +흉 +흉 +흉 + +흊 +흊 +흊 +흊 +흊 + +흋 +흋 +흋 +흋 +흋 + +흌 +흌 +흌 +흌 +흌 + +흍 +흍 +흍 +흍 +흍 + +흎 +흎 +흎 +흎 +흎 + +흏 +흏 +흏 +흏 +흏 + +흐 +흐 +흐 +흐 +흐 + +흑 +흑 +흑 +흑 +흑 + +흒 +흒 +흒 +흒 +흒 + +흓 +흓 +흓 +흓 +흓 + +흔 +흔 +흔 +흔 +흔 + +흕 +흕 +흕 +흕 +흕 + +흖 +흖 +흖 +흖 +흖 + +흗 +흗 +흗 +흗 +흗 + +흘 +흘 +흘 +흘 +흘 + +흙 +흙 +흙 +흙 +흙 + +흚 +흚 +흚 +흚 +흚 + +흛 +흛 +흛 +흛 +흛 + +흜 +흜 +흜 +흜 +흜 + +흝 +흝 +흝 +흝 +흝 + +흞 +흞 +흞 +흞 +흞 + +흟 +흟 +흟 +흟 +흟 + +흠 +흠 +흠 +흠 +흠 + +흡 +흡 +흡 +흡 +흡 + +흢 +흢 +흢 +흢 +흢 + +흣 +흣 +흣 +흣 +흣 + +흤 +흤 +흤 +흤 +흤 + +흥 +흥 +흥 +흥 +흥 + +흦 +흦 +흦 +흦 +흦 + +흧 +흧 +흧 +흧 +흧 + +흨 +흨 +흨 +흨 +흨 + +흩 +흩 +흩 +흩 +흩 + +흪 +흪 +흪 +흪 +흪 + +흫 +흫 +흫 +흫 +흫 + +희 +희 +희 +희 +희 + +흭 +흭 +흭 +흭 +흭 + +흮 +흮 +흮 +흮 +흮 + +흯 +흯 +흯 +흯 +흯 + +흰 +흰 +흰 +흰 +흰 + +흱 +흱 +흱 +흱 +흱 + +흲 +흲 +흲 +흲 +흲 + +흳 +흳 +흳 +흳 +흳 + +흴 +흴 +흴 +흴 +흴 + +흵 +흵 +흵 +흵 +흵 + +흶 +흶 +흶 +흶 +흶 + +흷 +흷 +흷 +흷 +흷 + +흸 +흸 +흸 +흸 +흸 + +흹 +흹 +흹 +흹 +흹 + +흺 +흺 +흺 +흺 +흺 + +흻 +흻 +흻 +흻 +흻 + +흼 +흼 +흼 +흼 +흼 + +흽 +흽 +흽 +흽 +흽 + +흾 +흾 +흾 +흾 +흾 + +흿 +흿 +흿 +흿 +흿 + +힀 +힀 +힀 +힀 +힀 + +힁 +힁 +힁 +힁 +힁 + +힂 +힂 +힂 +힂 +힂 + +힃 +힃 +힃 +힃 +힃 + +힄 +힄 +힄 +힄 +힄 + +힅 +힅 +힅 +힅 +힅 + +힆 +힆 +힆 +힆 +힆 + +힇 +힇 +힇 +힇 +힇 + +히 +히 +히 +히 +히 + +힉 +힉 +힉 +힉 +힉 + +힊 +힊 +힊 +힊 +힊 + +힋 +힋 +힋 +힋 +힋 + +힌 +힌 +힌 +힌 +힌 + +힍 +힍 +힍 +힍 +힍 + +힎 +힎 +힎 +힎 +힎 + +힏 +힏 +힏 +힏 +힏 + +힐 +힐 +힐 +힐 +힐 + +힑 +힑 +힑 +힑 +힑 + +힒 +힒 +힒 +힒 +힒 + +힓 +힓 +힓 +힓 +힓 + +힔 +힔 +힔 +힔 +힔 + +힕 +힕 +힕 +힕 +힕 + +힖 +힖 +힖 +힖 +힖 + +힗 +힗 +힗 +힗 +힗 + +힘 +힘 +힘 +힘 +힘 + +힙 +힙 +힙 +힙 +힙 + +힚 +힚 +힚 +힚 +힚 + +힛 +힛 +힛 +힛 +힛 + +힜 +힜 +힜 +힜 +힜 + +힝 +힝 +힝 +힝 +힝 + +힞 +힞 +힞 +힞 +힞 + +힟 +힟 +힟 +힟 +힟 + +힠 +힠 +힠 +힠 +힠 + +힡 +힡 +힡 +힡 +힡 + +힢 +힢 +힢 +힢 +힢 + +힣 +힣 +힣 +힣 +힣 + +豈 +豈 +豈 +豈 +豈 + +更 +更 +更 +更 +更 + +車 +車 +車 +車 +車 + +賈 +賈 +賈 +賈 +賈 + +滑 +滑 +滑 +滑 +滑 + +串 +串 +串 +串 +串 + +句 +句 +句 +句 +句 + +龜 +龜 +龜 +龜 +龜 + +龜 +龜 +龜 +龜 +龜 + +契 +契 +契 +契 +契 + +金 +金 +金 +金 +金 + +喇 +喇 +喇 +喇 +喇 + +奈 +奈 +奈 +奈 +奈 + +懶 +懶 +懶 +懶 +懶 + +癩 +癩 +癩 +癩 +癩 + +羅 +羅 +羅 +羅 +羅 + +蘿 +蘿 +蘿 +蘿 +蘿 + +螺 +螺 +螺 +螺 +螺 + +裸 +裸 +裸 +裸 +裸 + +邏 +邏 +邏 +邏 +邏 + +樂 +樂 +樂 +樂 +樂 + +洛 +洛 +洛 +洛 +洛 + +烙 +烙 +烙 +烙 +烙 + +珞 +珞 +珞 +珞 +珞 + +落 +落 +落 +落 +落 + +酪 +酪 +酪 +酪 +酪 + +駱 +駱 +駱 +駱 +駱 + +亂 +亂 +亂 +亂 +亂 + +卵 +卵 +卵 +卵 +卵 + +欄 +欄 +欄 +欄 +欄 + +爛 +爛 +爛 +爛 +爛 + +蘭 +蘭 +蘭 +蘭 +蘭 + +鸞 +鸞 +鸞 +鸞 +鸞 + +嵐 +嵐 +嵐 +嵐 +嵐 + +濫 +濫 +濫 +濫 +濫 + +藍 +藍 +藍 +藍 +藍 + +襤 +襤 +襤 +襤 +襤 + +拉 +拉 +拉 +拉 +拉 + +臘 +臘 +臘 +臘 +臘 + +蠟 +蠟 +蠟 +蠟 +蠟 + +廊 +廊 +廊 +廊 +廊 + +朗 +朗 +朗 +朗 +朗 + +浪 +浪 +浪 +浪 +浪 + +狼 +狼 +狼 +狼 +狼 + +郎 +郎 +郎 +郎 +郎 + +來 +來 +來 +來 +來 + +冷 +冷 +冷 +冷 +冷 + +勞 +勞 +勞 +勞 +勞 + +擄 +擄 +擄 +擄 +擄 + +櫓 +櫓 +櫓 +櫓 +櫓 + +爐 +爐 +爐 +爐 +爐 + +盧 +盧 +盧 +盧 +盧 + +老 +老 +老 +老 +老 + +蘆 +蘆 +蘆 +蘆 +蘆 + +虜 +虜 +虜 +虜 +虜 + +路 +路 +路 +路 +路 + +露 +露 +露 +露 +露 + +魯 +魯 +魯 +魯 +魯 + +鷺 +鷺 +鷺 +鷺 +鷺 + +碌 +碌 +碌 +碌 +碌 + +祿 +祿 +祿 +祿 +祿 + +綠 +綠 +綠 +綠 +綠 + +菉 +菉 +菉 +菉 +菉 + +錄 +錄 +錄 +錄 +錄 + +鹿 +鹿 +鹿 +鹿 +鹿 + +論 +論 +論 +論 +論 + +壟 +壟 +壟 +壟 +壟 + +弄 +弄 +弄 +弄 +弄 + +籠 +籠 +籠 +籠 +籠 + +聾 +聾 +聾 +聾 +聾 + +牢 +牢 +牢 +牢 +牢 + +磊 +磊 +磊 +磊 +磊 + +賂 +賂 +賂 +賂 +賂 + +雷 +雷 +雷 +雷 +雷 + +壘 +壘 +壘 +壘 +壘 + +屢 +屢 +屢 +屢 +屢 + +樓 +樓 +樓 +樓 +樓 + +淚 +淚 +淚 +淚 +淚 + +漏 +漏 +漏 +漏 +漏 + +累 +累 +累 +累 +累 + +縷 +縷 +縷 +縷 +縷 + +陋 +陋 +陋 +陋 +陋 + +勒 +勒 +勒 +勒 +勒 + +肋 +肋 +肋 +肋 +肋 + +凜 +凜 +凜 +凜 +凜 + +凌 +凌 +凌 +凌 +凌 + +稜 +稜 +稜 +稜 +稜 + +綾 +綾 +綾 +綾 +綾 + +菱 +菱 +菱 +菱 +菱 + +陵 +陵 +陵 +陵 +陵 + +讀 +讀 +讀 +讀 +讀 + +拏 +拏 +拏 +拏 +拏 + +樂 +樂 +樂 +樂 +樂 + +諾 +諾 +諾 +諾 +諾 + +丹 +丹 +丹 +丹 +丹 + +寧 +寧 +寧 +寧 +寧 + +怒 +怒 +怒 +怒 +怒 + +率 +率 +率 +率 +率 + +異 +異 +異 +異 +異 + +北 +北 +北 +北 +北 + +磻 +磻 +磻 +磻 +磻 + +便 +便 +便 +便 +便 + +復 +復 +復 +復 +復 + +不 +不 +不 +不 +不 + +泌 +泌 +泌 +泌 +泌 + +數 +數 +數 +數 +數 + +索 +索 +索 +索 +索 + +參 +參 +參 +參 +參 + +塞 +塞 +塞 +塞 +塞 + +省 +省 +省 +省 +省 + +葉 +葉 +葉 +葉 +葉 + +說 +說 +說 +說 +說 + +殺 +殺 +殺 +殺 +殺 + +辰 +辰 +辰 +辰 +辰 + +沈 +沈 +沈 +沈 +沈 + +拾 +拾 +拾 +拾 +拾 + +若 +若 +若 +若 +若 + +掠 +掠 +掠 +掠 +掠 + +略 +略 +略 +略 +略 + +亮 +亮 +亮 +亮 +亮 + +兩 +兩 +兩 +兩 +兩 + +凉 +凉 +凉 +凉 +凉 + +梁 +梁 +梁 +梁 +梁 + +糧 +糧 +糧 +糧 +糧 + +良 +良 +良 +良 +良 + +諒 +諒 +諒 +諒 +諒 + +量 +量 +量 +量 +量 + +勵 +勵 +勵 +勵 +勵 + +呂 +呂 +呂 +呂 +呂 + +女 +女 +女 +女 +女 + +廬 +廬 +廬 +廬 +廬 + +旅 +旅 +旅 +旅 +旅 + +濾 +濾 +濾 +濾 +濾 + +礪 +礪 +礪 +礪 +礪 + +閭 +閭 +閭 +閭 +閭 + +驪 +驪 +驪 +驪 +驪 + +麗 +麗 +麗 +麗 +麗 + +黎 +黎 +黎 +黎 +黎 + +力 +力 +力 +力 +力 + +曆 +曆 +曆 +曆 +曆 + +歷 +歷 +歷 +歷 +歷 + +轢 +轢 +轢 +轢 +轢 + +年 +年 +年 +年 +年 + +憐 +憐 +憐 +憐 +憐 + +戀 +戀 +戀 +戀 +戀 + +撚 +撚 +撚 +撚 +撚 + +漣 +漣 +漣 +漣 +漣 + +煉 +煉 +煉 +煉 +煉 + +璉 +璉 +璉 +璉 +璉 + +秊 +秊 +秊 +秊 +秊 + +練 +練 +練 +練 +練 + +聯 +聯 +聯 +聯 +聯 + +輦 +輦 +輦 +輦 +輦 + +蓮 +蓮 +蓮 +蓮 +蓮 + +連 +連 +連 +連 +連 + +鍊 +鍊 +鍊 +鍊 +鍊 + +列 +列 +列 +列 +列 + +劣 +劣 +劣 +劣 +劣 + +咽 +咽 +咽 +咽 +咽 + +烈 +烈 +烈 +烈 +烈 + +裂 +裂 +裂 +裂 +裂 + +說 +說 +說 +說 +說 + +廉 +廉 +廉 +廉 +廉 + +念 +念 +念 +念 +念 + +捻 +捻 +捻 +捻 +捻 + +殮 +殮 +殮 +殮 +殮 + +簾 +簾 +簾 +簾 +簾 + +獵 +獵 +獵 +獵 +獵 + +令 +令 +令 +令 +令 + +囹 +囹 +囹 +囹 +囹 + +寧 +寧 +寧 +寧 +寧 + +嶺 +嶺 +嶺 +嶺 +嶺 + +怜 +怜 +怜 +怜 +怜 + +玲 +玲 +玲 +玲 +玲 + +瑩 +瑩 +瑩 +瑩 +瑩 + +羚 +羚 +羚 +羚 +羚 + +聆 +聆 +聆 +聆 +聆 + +鈴 +鈴 +鈴 +鈴 +鈴 + +零 +零 +零 +零 +零 + +靈 +靈 +靈 +靈 +靈 + +領 +領 +領 +領 +領 + +例 +例 +例 +例 +例 + +禮 +禮 +禮 +禮 +禮 + +醴 +醴 +醴 +醴 +醴 + +隸 +隸 +隸 +隸 +隸 + +惡 +惡 +惡 +惡 +惡 + +了 +了 +了 +了 +了 + +僚 +僚 +僚 +僚 +僚 + +寮 +寮 +寮 +寮 +寮 + +尿 +尿 +尿 +尿 +尿 + +料 +料 +料 +料 +料 + +樂 +樂 +樂 +樂 +樂 + +燎 +燎 +燎 +燎 +燎 + +療 +療 +療 +療 +療 + +蓼 +蓼 +蓼 +蓼 +蓼 + +遼 +遼 +遼 +遼 +遼 + +龍 +龍 +龍 +龍 +龍 + +暈 +暈 +暈 +暈 +暈 + +阮 +阮 +阮 +阮 +阮 + +劉 +劉 +劉 +劉 +劉 + +杻 +杻 +杻 +杻 +杻 + +柳 +柳 +柳 +柳 +柳 + +流 +流 +流 +流 +流 + +溜 +溜 +溜 +溜 +溜 + +琉 +琉 +琉 +琉 +琉 + +留 +留 +留 +留 +留 + +硫 +硫 +硫 +硫 +硫 + +紐 +紐 +紐 +紐 +紐 + +類 +類 +類 +類 +類 + +六 +六 +六 +六 +六 + +戮 +戮 +戮 +戮 +戮 + +陸 +陸 +陸 +陸 +陸 + +倫 +倫 +倫 +倫 +倫 + +崙 +崙 +崙 +崙 +崙 + +淪 +淪 +淪 +淪 +淪 + +輪 +輪 +輪 +輪 +輪 + +律 +律 +律 +律 +律 + +慄 +慄 +慄 +慄 +慄 + +栗 +栗 +栗 +栗 +栗 + +率 +率 +率 +率 +率 + +隆 +隆 +隆 +隆 +隆 + +利 +利 +利 +利 +利 + +吏 +吏 +吏 +吏 +吏 + +履 +履 +履 +履 +履 + +易 +易 +易 +易 +易 + +李 +李 +李 +李 +李 + +梨 +梨 +梨 +梨 +梨 + +泥 +泥 +泥 +泥 +泥 + +理 +理 +理 +理 +理 + +痢 +痢 +痢 +痢 +痢 + +罹 +罹 +罹 +罹 +罹 + +裏 +裏 +裏 +裏 +裏 + +裡 +裡 +裡 +裡 +裡 + +里 +里 +里 +里 +里 + +離 +離 +離 +離 +離 + +匿 +匿 +匿 +匿 +匿 + +溺 +溺 +溺 +溺 +溺 + +吝 +吝 +吝 +吝 +吝 + +燐 +燐 +燐 +燐 +燐 + +璘 +璘 +璘 +璘 +璘 + +藺 +藺 +藺 +藺 +藺 + +隣 +隣 +隣 +隣 +隣 + +鱗 +鱗 +鱗 +鱗 +鱗 + +麟 +麟 +麟 +麟 +麟 + +林 +林 +林 +林 +林 + +淋 +淋 +淋 +淋 +淋 + +臨 +臨 +臨 +臨 +臨 + +立 +立 +立 +立 +立 + +笠 +笠 +笠 +笠 +笠 + +粒 +粒 +粒 +粒 +粒 + +狀 +狀 +狀 +狀 +狀 + +炙 +炙 +炙 +炙 +炙 + +識 +識 +識 +識 +識 + +什 +什 +什 +什 +什 + +茶 +茶 +茶 +茶 +茶 + +刺 +刺 +刺 +刺 +刺 + +切 +切 +切 +切 +切 + +度 +度 +度 +度 +度 + +拓 +拓 +拓 +拓 +拓 + +糖 +糖 +糖 +糖 +糖 + +宅 +宅 +宅 +宅 +宅 + +洞 +洞 +洞 +洞 +洞 + +暴 +暴 +暴 +暴 +暴 + +輻 +輻 +輻 +輻 +輻 + +行 +行 +行 +行 +行 + +降 +降 +降 +降 +降 + +見 +見 +見 +見 +見 + +廓 +廓 +廓 +廓 +廓 + +兀 +兀 +兀 +兀 +兀 + +嗀 +嗀 +嗀 +嗀 +嗀 + +塚 +塚 +塚 +塚 +塚 + +晴 +晴 +晴 +晴 +晴 + +凞 +凞 +凞 +凞 +凞 + +猪 +猪 +猪 +猪 +猪 + +益 +益 +益 +益 +益 + +礼 +礼 +礼 +礼 +礼 + +神 +神 +神 +神 +神 + +祥 +祥 +祥 +祥 +祥 + +福 +福 +福 +福 +福 + +靖 +靖 +靖 +靖 +靖 + +精 +精 +精 +精 +精 + +羽 +羽 +羽 +羽 +羽 + +蘒 +蘒 +蘒 +蘒 +蘒 + +諸 +諸 +諸 +諸 +諸 + +逸 +逸 +逸 +逸 +逸 + +都 +都 +都 +都 +都 + +飯 +飯 +飯 +飯 +飯 + +飼 +飼 +飼 +飼 +飼 + +館 +館 +館 +館 +館 + +鶴 +鶴 +鶴 +鶴 +鶴 + +郞 +郞 +郞 +郞 +郞 + +隷 +隷 +隷 +隷 +隷 + +侮 +侮 +侮 +侮 +侮 + +僧 +僧 +僧 +僧 +僧 + +免 +免 +免 +免 +免 + +勉 +勉 +勉 +勉 +勉 + +勤 +勤 +勤 +勤 +勤 + +卑 +卑 +卑 +卑 +卑 + +喝 +喝 +喝 +喝 +喝 + +嘆 +嘆 +嘆 +嘆 +嘆 + +器 +器 +器 +器 +器 + +塀 +塀 +塀 +塀 +塀 + +墨 +墨 +墨 +墨 +墨 + +層 +層 +層 +層 +層 + +屮 +屮 +屮 +屮 +屮 + +悔 +悔 +悔 +悔 +悔 + +慨 +慨 +慨 +慨 +慨 + +憎 +憎 +憎 +憎 +憎 + +懲 +懲 +懲 +懲 +懲 + +敏 +敏 +敏 +敏 +敏 + +既 +既 +既 +既 +既 + +暑 +暑 +暑 +暑 +暑 + +梅 +梅 +梅 +梅 +梅 + +海 +海 +海 +海 +海 + +渚 +渚 +渚 +渚 +渚 + +漢 +漢 +漢 +漢 +漢 + +煮 +煮 +煮 +煮 +煮 + +爫 +爫 +爫 +爫 +爫 + +琢 +琢 +琢 +琢 +琢 + +碑 +碑 +碑 +碑 +碑 + +社 +社 +社 +社 +社 + +祉 +祉 +祉 +祉 +祉 + +祈 +祈 +祈 +祈 +祈 + +祐 +祐 +祐 +祐 +祐 + +祖 +祖 +祖 +祖 +祖 + +祝 +祝 +祝 +祝 +祝 + +禍 +禍 +禍 +禍 +禍 + +禎 +禎 +禎 +禎 +禎 + +穀 +穀 +穀 +穀 +穀 + +突 +突 +突 +突 +突 + +節 +節 +節 +節 +節 + +練 +練 +練 +練 +練 + +縉 +縉 +縉 +縉 +縉 + +繁 +繁 +繁 +繁 +繁 + +署 +署 +署 +署 +署 + +者 +者 +者 +者 +者 + +臭 +臭 +臭 +臭 +臭 + +艹 +艹 +艹 +艹 +艹 + +艹 +艹 +艹 +艹 +艹 + +著 +著 +著 +著 +著 + +褐 +褐 +褐 +褐 +褐 + +視 +視 +視 +視 +視 + +謁 +謁 +謁 +謁 +謁 + +謹 +謹 +謹 +謹 +謹 + +賓 +賓 +賓 +賓 +賓 + +贈 +贈 +贈 +贈 +贈 + +辶 +辶 +辶 +辶 +辶 + +逸 +逸 +逸 +逸 +逸 + +難 +難 +難 +難 +難 + +響 +響 +響 +響 +響 + +頻 +頻 +頻 +頻 +頻 + +恵 +恵 +恵 +恵 +恵 + +𤋮 +𤋮 +𤋮 +𤋮 +𤋮 + +舘 +舘 +舘 +舘 +舘 + +並 +並 +並 +並 +並 + +况 +况 +况 +况 +况 + +全 +全 +全 +全 +全 + +侀 +侀 +侀 +侀 +侀 + +充 +充 +充 +充 +充 + +冀 +冀 +冀 +冀 +冀 + +勇 +勇 +勇 +勇 +勇 + +勺 +勺 +勺 +勺 +勺 + +喝 +喝 +喝 +喝 +喝 + +啕 +啕 +啕 +啕 +啕 + +喙 +喙 +喙 +喙 +喙 + +嗢 +嗢 +嗢 +嗢 +嗢 + +塚 +塚 +塚 +塚 +塚 + +墳 +墳 +墳 +墳 +墳 + +奄 +奄 +奄 +奄 +奄 + +奔 +奔 +奔 +奔 +奔 + +婢 +婢 +婢 +婢 +婢 + +嬨 +嬨 +嬨 +嬨 +嬨 + +廒 +廒 +廒 +廒 +廒 + +廙 +廙 +廙 +廙 +廙 + +彩 +彩 +彩 +彩 +彩 + +徭 +徭 +徭 +徭 +徭 + +惘 +惘 +惘 +惘 +惘 + +慎 +慎 +慎 +慎 +慎 + +愈 +愈 +愈 +愈 +愈 + +憎 +憎 +憎 +憎 +憎 + +慠 +慠 +慠 +慠 +慠 + +懲 +懲 +懲 +懲 +懲 + +戴 +戴 +戴 +戴 +戴 + +揄 +揄 +揄 +揄 +揄 + +搜 +搜 +搜 +搜 +搜 + +摒 +摒 +摒 +摒 +摒 + +敖 +敖 +敖 +敖 +敖 + +晴 +晴 +晴 +晴 +晴 + +朗 +朗 +朗 +朗 +朗 + +望 +望 +望 +望 +望 + +杖 +杖 +杖 +杖 +杖 + +歹 +歹 +歹 +歹 +歹 + +殺 +殺 +殺 +殺 +殺 + +流 +流 +流 +流 +流 + +滛 +滛 +滛 +滛 +滛 + +滋 +滋 +滋 +滋 +滋 + +漢 +漢 +漢 +漢 +漢 + +瀞 +瀞 +瀞 +瀞 +瀞 + +煮 +煮 +煮 +煮 +煮 + +瞧 +瞧 +瞧 +瞧 +瞧 + +爵 +爵 +爵 +爵 +爵 + +犯 +犯 +犯 +犯 +犯 + +猪 +猪 +猪 +猪 +猪 + +瑱 +瑱 +瑱 +瑱 +瑱 + +甆 +甆 +甆 +甆 +甆 + +画 +画 +画 +画 +画 + +瘝 +瘝 +瘝 +瘝 +瘝 + +瘟 +瘟 +瘟 +瘟 +瘟 + +益 +益 +益 +益 +益 + +盛 +盛 +盛 +盛 +盛 + +直 +直 +直 +直 +直 + +睊 +睊 +睊 +睊 +睊 + +着 +着 +着 +着 +着 + +磌 +磌 +磌 +磌 +磌 + +窱 +窱 +窱 +窱 +窱 + +節 +節 +節 +節 +節 + +类 +类 +类 +类 +类 + +絛 +絛 +絛 +絛 +絛 + +練 +練 +練 +練 +練 + +缾 +缾 +缾 +缾 +缾 + +者 +者 +者 +者 +者 + +荒 +荒 +荒 +荒 +荒 + +華 +華 +華 +華 +華 + +蝹 +蝹 +蝹 +蝹 +蝹 + +襁 +襁 +襁 +襁 +襁 + +覆 +覆 +覆 +覆 +覆 + +視 +視 +視 +視 +視 + +調 +調 +調 +調 +調 + +諸 +諸 +諸 +諸 +諸 + +請 +請 +請 +請 +請 + +謁 +謁 +謁 +謁 +謁 + +諾 +諾 +諾 +諾 +諾 + +諭 +諭 +諭 +諭 +諭 + +謹 +謹 +謹 +謹 +謹 + +變 +變 +變 +變 +變 + +贈 +贈 +贈 +贈 +贈 + +輸 +輸 +輸 +輸 +輸 + +遲 +遲 +遲 +遲 +遲 + +醙 +醙 +醙 +醙 +醙 + +鉶 +鉶 +鉶 +鉶 +鉶 + +陼 +陼 +陼 +陼 +陼 + +難 +難 +難 +難 +難 + +靖 +靖 +靖 +靖 +靖 + +韛 +韛 +韛 +韛 +韛 + +響 +響 +響 +響 +響 + +頋 +頋 +頋 +頋 +頋 + +頻 +頻 +頻 +頻 +頻 + +鬒 +鬒 +鬒 +鬒 +鬒 + +龜 +龜 +龜 +龜 +龜 + +𢡊 +𢡊 +𢡊 +𢡊 +𢡊 + +𢡄 +𢡄 +𢡄 +𢡄 +𢡄 + +𣏕 +𣏕 +𣏕 +𣏕 +𣏕 + +㮝 +㮝 +㮝 +㮝 +㮝 + +䀘 +䀘 +䀘 +䀘 +䀘 + +䀹 +䀹 +䀹 +䀹 +䀹 + +𥉉 +𥉉 +𥉉 +𥉉 +𥉉 + +𥳐 +𥳐 +𥳐 +𥳐 +𥳐 + +𧻓 +𧻓 +𧻓 +𧻓 +𧻓 + +齃 +齃 +齃 +齃 +齃 + +龎 +龎 +龎 +龎 +龎 + +ff +ff +ff +ff +ff + +fi +fi +fi +fi +fi + +fl +fl +fl +fl +fl + +ffi +ffi +ffi +ffi +ffi + +ffl +ffl +ffl +ffl +ffl + +ſt +ſt +ſt +st +st + +st +st +st +st +st + +ﬓ +ﬓ +ﬓ +մն +մն + +ﬔ +ﬔ +ﬔ +մե +մե + +ﬕ +ﬕ +ﬕ +մի +մի + +ﬖ +ﬖ +ﬖ +վն +վն + +ﬗ +ﬗ +ﬗ +մխ +մխ + +יִ +יִ +יִ +יִ +יִ + +ײַ +ײַ +ײַ +ײַ +ײַ + +ﬠ +ﬠ +ﬠ +ע +ע + +ﬡ +ﬡ +ﬡ +א +א + +ﬢ +ﬢ +ﬢ +ד +ד + +ﬣ +ﬣ +ﬣ +ה +ה + +ﬤ +ﬤ +ﬤ +כ +כ + +ﬥ +ﬥ +ﬥ +ל +ל + +ﬦ +ﬦ +ﬦ +ם +ם + +ﬧ +ﬧ +ﬧ +ר +ר + +ﬨ +ﬨ +ﬨ +ת +ת + +﬩ +﬩ +﬩ ++ ++ + +שׁ +שׁ +שׁ +שׁ +שׁ + +שׂ +שׂ +שׂ +שׂ +שׂ + +שּׁ +שּׁ +שּׁ +שּׁ +שּׁ + +שּׂ +שּׂ +שּׂ +שּׂ +שּׂ + +אַ +אַ +אַ +אַ +אַ + +אָ +אָ +אָ +אָ +אָ + +אּ +אּ +אּ +אּ +אּ + +בּ +בּ +בּ +בּ +בּ + +גּ +גּ +גּ +גּ +גּ + +דּ +דּ +דּ +דּ +דּ + +הּ +הּ +הּ +הּ +הּ + +וּ +וּ +וּ +וּ +וּ + +זּ +זּ +זּ +זּ +זּ + +טּ +טּ +טּ +טּ +טּ + +יּ +יּ +יּ +יּ +יּ + +ךּ +ךּ +ךּ +ךּ +ךּ + +כּ +כּ +כּ +כּ +כּ + +לּ +לּ +לּ +לּ +לּ + +מּ +מּ +מּ +מּ +מּ + +נּ +נּ +נּ +נּ +נּ + +סּ +סּ +סּ +סּ +סּ + +ףּ +ףּ +ףּ +ףּ +ףּ + +פּ +פּ +פּ +פּ +פּ + +צּ +צּ +צּ +צּ +צּ + +קּ +קּ +קּ +קּ +קּ + +רּ +רּ +רּ +רּ +רּ + +שּ +שּ +שּ +שּ +שּ + +תּ +תּ +תּ +תּ +תּ + +וֹ +וֹ +וֹ +וֹ +וֹ + +בֿ +בֿ +בֿ +בֿ +בֿ + +כֿ +כֿ +כֿ +כֿ +כֿ + +פֿ +פֿ +פֿ +פֿ +פֿ + +ﭏ +ﭏ +ﭏ +אל +אל + +ﭐ +ﭐ +ﭐ +ٱ +ٱ + +ﭑ +ﭑ +ﭑ +ٱ +ٱ + +ﭒ +ﭒ +ﭒ +ٻ +ٻ + +ﭓ +ﭓ +ﭓ +ٻ +ٻ + +ﭔ +ﭔ +ﭔ +ٻ +ٻ + +ﭕ +ﭕ +ﭕ +ٻ +ٻ + +ﭖ +ﭖ +ﭖ +پ +پ + +ﭗ +ﭗ +ﭗ +پ +پ + +ﭘ +ﭘ +ﭘ +پ +پ + +ﭙ +ﭙ +ﭙ +پ +پ + +ﭚ +ﭚ +ﭚ +ڀ +ڀ + +ﭛ +ﭛ +ﭛ +ڀ +ڀ + +ﭜ +ﭜ +ﭜ +ڀ +ڀ + +ﭝ +ﭝ +ﭝ +ڀ +ڀ + +ﭞ +ﭞ +ﭞ +ٺ +ٺ + +ﭟ +ﭟ +ﭟ +ٺ +ٺ + +ﭠ +ﭠ +ﭠ +ٺ +ٺ + +ﭡ +ﭡ +ﭡ +ٺ +ٺ + +ﭢ +ﭢ +ﭢ +ٿ +ٿ + +ﭣ +ﭣ +ﭣ +ٿ +ٿ + +ﭤ +ﭤ +ﭤ +ٿ +ٿ + +ﭥ +ﭥ +ﭥ +ٿ +ٿ + +ﭦ +ﭦ +ﭦ +ٹ +ٹ + +ﭧ +ﭧ +ﭧ +ٹ +ٹ + +ﭨ +ﭨ +ﭨ +ٹ +ٹ + +ﭩ +ﭩ +ﭩ +ٹ +ٹ + +ﭪ +ﭪ +ﭪ +ڤ +ڤ + +ﭫ +ﭫ +ﭫ +ڤ +ڤ + +ﭬ +ﭬ +ﭬ +ڤ +ڤ + +ﭭ +ﭭ +ﭭ +ڤ +ڤ + +ﭮ +ﭮ +ﭮ +ڦ +ڦ + +ﭯ +ﭯ +ﭯ +ڦ +ڦ + +ﭰ +ﭰ +ﭰ +ڦ +ڦ + +ﭱ +ﭱ +ﭱ +ڦ +ڦ + +ﭲ +ﭲ +ﭲ +ڄ +ڄ + +ﭳ +ﭳ +ﭳ +ڄ +ڄ + +ﭴ +ﭴ +ﭴ +ڄ +ڄ + +ﭵ +ﭵ +ﭵ +ڄ +ڄ + +ﭶ +ﭶ +ﭶ +ڃ +ڃ + +ﭷ +ﭷ +ﭷ +ڃ +ڃ + +ﭸ +ﭸ +ﭸ +ڃ +ڃ + +ﭹ +ﭹ +ﭹ +ڃ +ڃ + +ﭺ +ﭺ +ﭺ +چ +چ + +ﭻ +ﭻ +ﭻ +چ +چ + +ﭼ +ﭼ +ﭼ +چ +چ + +ﭽ +ﭽ +ﭽ +چ +چ + +ﭾ +ﭾ +ﭾ +ڇ +ڇ + +ﭿ +ﭿ +ﭿ +ڇ +ڇ + +ﮀ +ﮀ +ﮀ +ڇ +ڇ + +ﮁ +ﮁ +ﮁ +ڇ +ڇ + +ﮂ +ﮂ +ﮂ +ڍ +ڍ + +ﮃ +ﮃ +ﮃ +ڍ +ڍ + +ﮄ +ﮄ +ﮄ +ڌ +ڌ + +ﮅ +ﮅ +ﮅ +ڌ +ڌ + +ﮆ +ﮆ +ﮆ +ڎ +ڎ + +ﮇ +ﮇ +ﮇ +ڎ +ڎ + +ﮈ +ﮈ +ﮈ +ڈ +ڈ + +ﮉ +ﮉ +ﮉ +ڈ +ڈ + +ﮊ +ﮊ +ﮊ +ژ +ژ + +ﮋ +ﮋ +ﮋ +ژ +ژ + +ﮌ +ﮌ +ﮌ +ڑ +ڑ + +ﮍ +ﮍ +ﮍ +ڑ +ڑ + +ﮎ +ﮎ +ﮎ +ک +ک + +ﮏ +ﮏ +ﮏ +ک +ک + +ﮐ +ﮐ +ﮐ +ک +ک + +ﮑ +ﮑ +ﮑ +ک +ک + +ﮒ +ﮒ +ﮒ +گ +گ + +ﮓ +ﮓ +ﮓ +گ +گ + +ﮔ +ﮔ +ﮔ +گ +گ + +ﮕ +ﮕ +ﮕ +گ +گ + +ﮖ +ﮖ +ﮖ +ڳ +ڳ + +ﮗ +ﮗ +ﮗ +ڳ +ڳ + +ﮘ +ﮘ +ﮘ +ڳ +ڳ + +ﮙ +ﮙ +ﮙ +ڳ +ڳ + +ﮚ +ﮚ +ﮚ +ڱ +ڱ + +ﮛ +ﮛ +ﮛ +ڱ +ڱ + +ﮜ +ﮜ +ﮜ +ڱ +ڱ + +ﮝ +ﮝ +ﮝ +ڱ +ڱ + +ﮞ +ﮞ +ﮞ +ں +ں + +ﮟ +ﮟ +ﮟ +ں +ں + +ﮠ +ﮠ +ﮠ +ڻ +ڻ + +ﮡ +ﮡ +ﮡ +ڻ +ڻ + +ﮢ +ﮢ +ﮢ +ڻ +ڻ + +ﮣ +ﮣ +ﮣ +ڻ +ڻ + +ﮤ +ﮤ +ﮤ +ۀ +ۀ + +ﮥ +ﮥ +ﮥ +ۀ +ۀ + +ﮦ +ﮦ +ﮦ +ہ +ہ + +ﮧ +ﮧ +ﮧ +ہ +ہ + +ﮨ +ﮨ +ﮨ +ہ +ہ + +ﮩ +ﮩ +ﮩ +ہ +ہ + +ﮪ +ﮪ +ﮪ +ھ +ھ + +ﮫ +ﮫ +ﮫ +ھ +ھ + +ﮬ +ﮬ +ﮬ +ھ +ھ + +ﮭ +ﮭ +ﮭ +ھ +ھ + +ﮮ +ﮮ +ﮮ +ے +ے + +ﮯ +ﮯ +ﮯ +ے +ے + +ﮰ +ﮰ +ﮰ +ۓ +ۓ + +ﮱ +ﮱ +ﮱ +ۓ +ۓ + +ﯓ +ﯓ +ﯓ +ڭ +ڭ + +ﯔ +ﯔ +ﯔ +ڭ +ڭ + +ﯕ +ﯕ +ﯕ +ڭ +ڭ + +ﯖ +ﯖ +ﯖ +ڭ +ڭ + +ﯗ +ﯗ +ﯗ +ۇ +ۇ + +ﯘ +ﯘ +ﯘ +ۇ +ۇ + +ﯙ +ﯙ +ﯙ +ۆ +ۆ + +ﯚ +ﯚ +ﯚ +ۆ +ۆ + +ﯛ +ﯛ +ﯛ +ۈ +ۈ + +ﯜ +ﯜ +ﯜ +ۈ +ۈ + +ﯝ +ﯝ +ﯝ +ۇٴ +ۇٴ + +ﯞ +ﯞ +ﯞ +ۋ +ۋ + +ﯟ +ﯟ +ﯟ +ۋ +ۋ + +ﯠ +ﯠ +ﯠ +ۅ +ۅ + +ﯡ +ﯡ +ﯡ +ۅ +ۅ + +ﯢ +ﯢ +ﯢ +ۉ +ۉ + +ﯣ +ﯣ +ﯣ +ۉ +ۉ + +ﯤ +ﯤ +ﯤ +ې +ې + +ﯥ +ﯥ +ﯥ +ې +ې + +ﯦ +ﯦ +ﯦ +ې +ې + +ﯧ +ﯧ +ﯧ +ې +ې + +ﯨ +ﯨ +ﯨ +ى +ى + +ﯩ +ﯩ +ﯩ +ى +ى + +ﯪ +ﯪ +ﯪ +ئا +ئا + +ﯫ +ﯫ +ﯫ +ئا +ئا + +ﯬ +ﯬ +ﯬ +ئە +ئە + +ﯭ +ﯭ +ﯭ +ئە +ئە + +ﯮ +ﯮ +ﯮ +ئو +ئو + +ﯯ +ﯯ +ﯯ +ئو +ئو + +ﯰ +ﯰ +ﯰ +ئۇ +ئۇ + +ﯱ +ﯱ +ﯱ +ئۇ +ئۇ + +ﯲ +ﯲ +ﯲ +ئۆ +ئۆ + +ﯳ +ﯳ +ﯳ +ئۆ +ئۆ + +ﯴ +ﯴ +ﯴ +ئۈ +ئۈ + +ﯵ +ﯵ +ﯵ +ئۈ +ئۈ + +ﯶ +ﯶ +ﯶ +ئې +ئې + +ﯷ +ﯷ +ﯷ +ئې +ئې + +ﯸ +ﯸ +ﯸ +ئې +ئې + +ﯹ +ﯹ +ﯹ +ئى +ئى + +ﯺ +ﯺ +ﯺ +ئى +ئى + +ﯻ +ﯻ +ﯻ +ئى +ئى + +ﯼ +ﯼ +ﯼ +ی +ی + +ﯽ +ﯽ +ﯽ +ی +ی + +ﯾ +ﯾ +ﯾ +ی +ی + +ﯿ +ﯿ +ﯿ +ی +ی + +ﰀ +ﰀ +ﰀ +ئج +ئج + +ﰁ +ﰁ +ﰁ +ئح +ئح + +ﰂ +ﰂ +ﰂ +ئم +ئم + +ﰃ +ﰃ +ﰃ +ئى +ئى + +ﰄ +ﰄ +ﰄ +ئي +ئي + +ﰅ +ﰅ +ﰅ +بج +بج + +ﰆ +ﰆ +ﰆ +بح +بح + +ﰇ +ﰇ +ﰇ +بخ +بخ + +ﰈ +ﰈ +ﰈ +بم +بم + +ﰉ +ﰉ +ﰉ +بى +بى + +ﰊ +ﰊ +ﰊ +بي +بي + +ﰋ +ﰋ +ﰋ +تج +تج + +ﰌ +ﰌ +ﰌ +تح +تح + +ﰍ +ﰍ +ﰍ +تخ +تخ + +ﰎ +ﰎ +ﰎ +تم +تم + +ﰏ +ﰏ +ﰏ +تى +تى + +ﰐ +ﰐ +ﰐ +تي +تي + +ﰑ +ﰑ +ﰑ +ثج +ثج + +ﰒ +ﰒ +ﰒ +ثم +ثم + +ﰓ +ﰓ +ﰓ +ثى +ثى + +ﰔ +ﰔ +ﰔ +ثي +ثي + +ﰕ +ﰕ +ﰕ +جح +جح + +ﰖ +ﰖ +ﰖ +جم +جم + +ﰗ +ﰗ +ﰗ +حج +حج + +ﰘ +ﰘ +ﰘ +حم +حم + +ﰙ +ﰙ +ﰙ +خج +خج + +ﰚ +ﰚ +ﰚ +خح +خح + +ﰛ +ﰛ +ﰛ +خم +خم + +ﰜ +ﰜ +ﰜ +سج +سج + +ﰝ +ﰝ +ﰝ +سح +سح + +ﰞ +ﰞ +ﰞ +سخ +سخ + +ﰟ +ﰟ +ﰟ +سم +سم + +ﰠ +ﰠ +ﰠ +صح +صح + +ﰡ +ﰡ +ﰡ +صم +صم + +ﰢ +ﰢ +ﰢ +ضج +ضج + +ﰣ +ﰣ +ﰣ +ضح +ضح + +ﰤ +ﰤ +ﰤ +ضخ +ضخ + +ﰥ +ﰥ +ﰥ +ضم +ضم + +ﰦ +ﰦ +ﰦ +طح +طح + +ﰧ +ﰧ +ﰧ +طم +طم + +ﰨ +ﰨ +ﰨ +ظم +ظم + +ﰩ +ﰩ +ﰩ +عج +عج + +ﰪ +ﰪ +ﰪ +عم +عم + +ﰫ +ﰫ +ﰫ +غج +غج + +ﰬ +ﰬ +ﰬ +غم +غم + +ﰭ +ﰭ +ﰭ +فج +فج + +ﰮ +ﰮ +ﰮ +فح +فح + +ﰯ +ﰯ +ﰯ +فخ +فخ + +ﰰ +ﰰ +ﰰ +فم +فم + +ﰱ +ﰱ +ﰱ +فى +فى + +ﰲ +ﰲ +ﰲ +في +في + +ﰳ +ﰳ +ﰳ +قح +قح + +ﰴ +ﰴ +ﰴ +قم +قم + +ﰵ +ﰵ +ﰵ +قى +قى + +ﰶ +ﰶ +ﰶ +قي +قي + +ﰷ +ﰷ +ﰷ +كا +كا + +ﰸ +ﰸ +ﰸ +كج +كج + +ﰹ +ﰹ +ﰹ +كح +كح + +ﰺ +ﰺ +ﰺ +كخ +كخ + +ﰻ +ﰻ +ﰻ +كل +كل + +ﰼ +ﰼ +ﰼ +كم +كم + +ﰽ +ﰽ +ﰽ +كى +كى + +ﰾ +ﰾ +ﰾ +كي +كي + +ﰿ +ﰿ +ﰿ +لج +لج + +ﱀ +ﱀ +ﱀ +لح +لح + +ﱁ +ﱁ +ﱁ +لخ +لخ + +ﱂ +ﱂ +ﱂ +لم +لم + +ﱃ +ﱃ +ﱃ +لى +لى + +ﱄ +ﱄ +ﱄ +لي +لي + +ﱅ +ﱅ +ﱅ +مج +مج + +ﱆ +ﱆ +ﱆ +مح +مح + +ﱇ +ﱇ +ﱇ +مخ +مخ + +ﱈ +ﱈ +ﱈ +مم +مم + +ﱉ +ﱉ +ﱉ +مى +مى + +ﱊ +ﱊ +ﱊ +مي +مي + +ﱋ +ﱋ +ﱋ +نج +نج + +ﱌ +ﱌ +ﱌ +نح +نح + +ﱍ +ﱍ +ﱍ +نخ +نخ + +ﱎ +ﱎ +ﱎ +نم +نم + +ﱏ +ﱏ +ﱏ +نى +نى + +ﱐ +ﱐ +ﱐ +ني +ني + +ﱑ +ﱑ +ﱑ +هج +هج + +ﱒ +ﱒ +ﱒ +هم +هم + +ﱓ +ﱓ +ﱓ +هى +هى + +ﱔ +ﱔ +ﱔ +هي +هي + +ﱕ +ﱕ +ﱕ +يج +يج + +ﱖ +ﱖ +ﱖ +يح +يح + +ﱗ +ﱗ +ﱗ +يخ +يخ + +ﱘ +ﱘ +ﱘ +يم +يم + +ﱙ +ﱙ +ﱙ +يى +يى + +ﱚ +ﱚ +ﱚ +يي +يي + +ﱛ +ﱛ +ﱛ +ذٰ +ذٰ + +ﱜ +ﱜ +ﱜ +رٰ +رٰ + +ﱝ +ﱝ +ﱝ +ىٰ +ىٰ + +ﱞ +ﱞ +ﱞ + ٌّ + ٌّ + +ﱟ +ﱟ +ﱟ + ٍّ + ٍّ + +ﱠ +ﱠ +ﱠ + َّ + َّ + +ﱡ +ﱡ +ﱡ + ُّ + ُّ + +ﱢ +ﱢ +ﱢ + ِّ + ِّ + +ﱣ +ﱣ +ﱣ + ّٰ + ّٰ + +ﱤ +ﱤ +ﱤ +ئر +ئر + +ﱥ +ﱥ +ﱥ +ئز +ئز + +ﱦ +ﱦ +ﱦ +ئم +ئم + +ﱧ +ﱧ +ﱧ +ئن +ئن + +ﱨ +ﱨ +ﱨ +ئى +ئى + +ﱩ +ﱩ +ﱩ +ئي +ئي + +ﱪ +ﱪ +ﱪ +بر +بر + +ﱫ +ﱫ +ﱫ +بز +بز + +ﱬ +ﱬ +ﱬ +بم +بم + +ﱭ +ﱭ +ﱭ +بن +بن + +ﱮ +ﱮ +ﱮ +بى +بى + +ﱯ +ﱯ +ﱯ +بي +بي + +ﱰ +ﱰ +ﱰ +تر +تر + +ﱱ +ﱱ +ﱱ +تز +تز + +ﱲ +ﱲ +ﱲ +تم +تم + +ﱳ +ﱳ +ﱳ +تن +تن + +ﱴ +ﱴ +ﱴ +تى +تى + +ﱵ +ﱵ +ﱵ +تي +تي + +ﱶ +ﱶ +ﱶ +ثر +ثر + +ﱷ +ﱷ +ﱷ +ثز +ثز + +ﱸ +ﱸ +ﱸ +ثم +ثم + +ﱹ +ﱹ +ﱹ +ثن +ثن + +ﱺ +ﱺ +ﱺ +ثى +ثى + +ﱻ +ﱻ +ﱻ +ثي +ثي + +ﱼ +ﱼ +ﱼ +فى +فى + +ﱽ +ﱽ +ﱽ +في +في + +ﱾ +ﱾ +ﱾ +قى +قى + +ﱿ +ﱿ +ﱿ +قي +قي + +ﲀ +ﲀ +ﲀ +كا +كا + +ﲁ +ﲁ +ﲁ +كل +كل + +ﲂ +ﲂ +ﲂ +كم +كم + +ﲃ +ﲃ +ﲃ +كى +كى + +ﲄ +ﲄ +ﲄ +كي +كي + +ﲅ +ﲅ +ﲅ +لم +لم + +ﲆ +ﲆ +ﲆ +لى +لى + +ﲇ +ﲇ +ﲇ +لي +لي + +ﲈ +ﲈ +ﲈ +ما +ما + +ﲉ +ﲉ +ﲉ +مم +مم + +ﲊ +ﲊ +ﲊ +نر +نر + +ﲋ +ﲋ +ﲋ +نز +نز + +ﲌ +ﲌ +ﲌ +نم +نم + +ﲍ +ﲍ +ﲍ +نن +نن + +ﲎ +ﲎ +ﲎ +نى +نى + +ﲏ +ﲏ +ﲏ +ني +ني + +ﲐ +ﲐ +ﲐ +ىٰ +ىٰ + +ﲑ +ﲑ +ﲑ +ير +ير + +ﲒ +ﲒ +ﲒ +يز +يز + +ﲓ +ﲓ +ﲓ +يم +يم + +ﲔ +ﲔ +ﲔ +ين +ين + +ﲕ +ﲕ +ﲕ +يى +يى + +ﲖ +ﲖ +ﲖ +يي +يي + +ﲗ +ﲗ +ﲗ +ئج +ئج + +ﲘ +ﲘ +ﲘ +ئح +ئح + +ﲙ +ﲙ +ﲙ +ئخ +ئخ + +ﲚ +ﲚ +ﲚ +ئم +ئم + +ﲛ +ﲛ +ﲛ +ئه +ئه + +ﲜ +ﲜ +ﲜ +بج +بج + +ﲝ +ﲝ +ﲝ +بح +بح + +ﲞ +ﲞ +ﲞ +بخ +بخ + +ﲟ +ﲟ +ﲟ +بم +بم + +ﲠ +ﲠ +ﲠ +به +به + +ﲡ +ﲡ +ﲡ +تج +تج + +ﲢ +ﲢ +ﲢ +تح +تح + +ﲣ +ﲣ +ﲣ +تخ +تخ + +ﲤ +ﲤ +ﲤ +تم +تم + +ﲥ +ﲥ +ﲥ +ته +ته + +ﲦ +ﲦ +ﲦ +ثم +ثم + +ﲧ +ﲧ +ﲧ +جح +جح + +ﲨ +ﲨ +ﲨ +جم +جم + +ﲩ +ﲩ +ﲩ +حج +حج + +ﲪ +ﲪ +ﲪ +حم +حم + +ﲫ +ﲫ +ﲫ +خج +خج + +ﲬ +ﲬ +ﲬ +خم +خم + +ﲭ +ﲭ +ﲭ +سج +سج + +ﲮ +ﲮ +ﲮ +سح +سح + +ﲯ +ﲯ +ﲯ +سخ +سخ + +ﲰ +ﲰ +ﲰ +سم +سم + +ﲱ +ﲱ +ﲱ +صح +صح + +ﲲ +ﲲ +ﲲ +صخ +صخ + +ﲳ +ﲳ +ﲳ +صم +صم + +ﲴ +ﲴ +ﲴ +ضج +ضج + +ﲵ +ﲵ +ﲵ +ضح +ضح + +ﲶ +ﲶ +ﲶ +ضخ +ضخ + +ﲷ +ﲷ +ﲷ +ضم +ضم + +ﲸ +ﲸ +ﲸ +طح +طح + +ﲹ +ﲹ +ﲹ +ظم +ظم + +ﲺ +ﲺ +ﲺ +عج +عج + +ﲻ +ﲻ +ﲻ +عم +عم + +ﲼ +ﲼ +ﲼ +غج +غج + +ﲽ +ﲽ +ﲽ +غم +غم + +ﲾ +ﲾ +ﲾ +فج +فج + +ﲿ +ﲿ +ﲿ +فح +فح + +ﳀ +ﳀ +ﳀ +فخ +فخ + +ﳁ +ﳁ +ﳁ +فم +فم + +ﳂ +ﳂ +ﳂ +قح +قح + +ﳃ +ﳃ +ﳃ +قم +قم + +ﳄ +ﳄ +ﳄ +كج +كج + +ﳅ +ﳅ +ﳅ +كح +كح + +ﳆ +ﳆ +ﳆ +كخ +كخ + +ﳇ +ﳇ +ﳇ +كل +كل + +ﳈ +ﳈ +ﳈ +كم +كم + +ﳉ +ﳉ +ﳉ +لج +لج + +ﳊ +ﳊ +ﳊ +لح +لح + +ﳋ +ﳋ +ﳋ +لخ +لخ + +ﳌ +ﳌ +ﳌ +لم +لم + +ﳍ +ﳍ +ﳍ +له +له + +ﳎ +ﳎ +ﳎ +مج +مج + +ﳏ +ﳏ +ﳏ +مح +مح + +ﳐ +ﳐ +ﳐ +مخ +مخ + +ﳑ +ﳑ +ﳑ +مم +مم + +ﳒ +ﳒ +ﳒ +نج +نج + +ﳓ +ﳓ +ﳓ +نح +نح + +ﳔ +ﳔ +ﳔ +نخ +نخ + +ﳕ +ﳕ +ﳕ +نم +نم + +ﳖ +ﳖ +ﳖ +نه +نه + +ﳗ +ﳗ +ﳗ +هج +هج + +ﳘ +ﳘ +ﳘ +هم +هم + +ﳙ +ﳙ +ﳙ +هٰ +هٰ + +ﳚ +ﳚ +ﳚ +يج +يج + +ﳛ +ﳛ +ﳛ +يح +يح + +ﳜ +ﳜ +ﳜ +يخ +يخ + +ﳝ +ﳝ +ﳝ +يم +يم + +ﳞ +ﳞ +ﳞ +يه +يه + +ﳟ +ﳟ +ﳟ +ئم +ئم + +ﳠ +ﳠ +ﳠ +ئه +ئه + +ﳡ +ﳡ +ﳡ +بم +بم + +ﳢ +ﳢ +ﳢ +به +به + +ﳣ +ﳣ +ﳣ +تم +تم + +ﳤ +ﳤ +ﳤ +ته +ته + +ﳥ +ﳥ +ﳥ +ثم +ثم + +ﳦ +ﳦ +ﳦ +ثه +ثه + +ﳧ +ﳧ +ﳧ +سم +سم + +ﳨ +ﳨ +ﳨ +سه +سه + +ﳩ +ﳩ +ﳩ +شم +شم + +ﳪ +ﳪ +ﳪ +شه +شه + +ﳫ +ﳫ +ﳫ +كل +كل + +ﳬ +ﳬ +ﳬ +كم +كم + +ﳭ +ﳭ +ﳭ +لم +لم + +ﳮ +ﳮ +ﳮ +نم +نم + +ﳯ +ﳯ +ﳯ +نه +نه + +ﳰ +ﳰ +ﳰ +يم +يم + +ﳱ +ﳱ +ﳱ +يه +يه + +ﳲ +ﳲ +ﳲ +ـَّ +ـَّ + +ﳳ +ﳳ +ﳳ +ـُّ +ـُّ + +ﳴ +ﳴ +ﳴ +ـِّ +ـِّ + +ﳵ +ﳵ +ﳵ +طى +طى + +ﳶ +ﳶ +ﳶ +طي +طي + +ﳷ +ﳷ +ﳷ +عى +عى + +ﳸ +ﳸ +ﳸ +عي +عي + +ﳹ +ﳹ +ﳹ +غى +غى + +ﳺ +ﳺ +ﳺ +غي +غي + +ﳻ +ﳻ +ﳻ +سى +سى + +ﳼ +ﳼ +ﳼ +سي +سي + +ﳽ +ﳽ +ﳽ +شى +شى + +ﳾ +ﳾ +ﳾ +شي +شي + +ﳿ +ﳿ +ﳿ +حى +حى + +ﴀ +ﴀ +ﴀ +حي +حي + +ﴁ +ﴁ +ﴁ +جى +جى + +ﴂ +ﴂ +ﴂ +جي +جي + +ﴃ +ﴃ +ﴃ +خى +خى + +ﴄ +ﴄ +ﴄ +خي +خي + +ﴅ +ﴅ +ﴅ +صى +صى + +ﴆ +ﴆ +ﴆ +صي +صي + +ﴇ +ﴇ +ﴇ +ضى +ضى + +ﴈ +ﴈ +ﴈ +ضي +ضي + +ﴉ +ﴉ +ﴉ +شج +شج + +ﴊ +ﴊ +ﴊ +شح +شح + +ﴋ +ﴋ +ﴋ +شخ +شخ + +ﴌ +ﴌ +ﴌ +شم +شم + +ﴍ +ﴍ +ﴍ +شر +شر + +ﴎ +ﴎ +ﴎ +سر +سر + +ﴏ +ﴏ +ﴏ +صر +صر + +ﴐ +ﴐ +ﴐ +ضر +ضر + +ﴑ +ﴑ +ﴑ +طى +طى + +ﴒ +ﴒ +ﴒ +طي +طي + +ﴓ +ﴓ +ﴓ +عى +عى + +ﴔ +ﴔ +ﴔ +عي +عي + +ﴕ +ﴕ +ﴕ +غى +غى + +ﴖ +ﴖ +ﴖ +غي +غي + +ﴗ +ﴗ +ﴗ +سى +سى + +ﴘ +ﴘ +ﴘ +سي +سي + +ﴙ +ﴙ +ﴙ +شى +شى + +ﴚ +ﴚ +ﴚ +شي +شي + +ﴛ +ﴛ +ﴛ +حى +حى + +ﴜ +ﴜ +ﴜ +حي +حي + +ﴝ +ﴝ +ﴝ +جى +جى + +ﴞ +ﴞ +ﴞ +جي +جي + +ﴟ +ﴟ +ﴟ +خى +خى + +ﴠ +ﴠ +ﴠ +خي +خي + +ﴡ +ﴡ +ﴡ +صى +صى + +ﴢ +ﴢ +ﴢ +صي +صي + +ﴣ +ﴣ +ﴣ +ضى +ضى + +ﴤ +ﴤ +ﴤ +ضي +ضي + +ﴥ +ﴥ +ﴥ +شج +شج + +ﴦ +ﴦ +ﴦ +شح +شح + +ﴧ +ﴧ +ﴧ +شخ +شخ + +ﴨ +ﴨ +ﴨ +شم +شم + +ﴩ +ﴩ +ﴩ +شر +شر + +ﴪ +ﴪ +ﴪ +سر +سر + +ﴫ +ﴫ +ﴫ +صر +صر + +ﴬ +ﴬ +ﴬ +ضر +ضر + +ﴭ +ﴭ +ﴭ +شج +شج + +ﴮ +ﴮ +ﴮ +شح +شح + +ﴯ +ﴯ +ﴯ +شخ +شخ + +ﴰ +ﴰ +ﴰ +شم +شم + +ﴱ +ﴱ +ﴱ +سه +سه + +ﴲ +ﴲ +ﴲ +شه +شه + +ﴳ +ﴳ +ﴳ +طم +طم + +ﴴ +ﴴ +ﴴ +سج +سج + +ﴵ +ﴵ +ﴵ +سح +سح + +ﴶ +ﴶ +ﴶ +سخ +سخ + +ﴷ +ﴷ +ﴷ +شج +شج + +ﴸ +ﴸ +ﴸ +شح +شح + +ﴹ +ﴹ +ﴹ +شخ +شخ + +ﴺ +ﴺ +ﴺ +طم +طم + +ﴻ +ﴻ +ﴻ +ظم +ظم + +ﴼ +ﴼ +ﴼ +اً +اً + +ﴽ +ﴽ +ﴽ +اً +اً + +ﵐ +ﵐ +ﵐ +تجم +تجم + +ﵑ +ﵑ +ﵑ +تحج +تحج + +ﵒ +ﵒ +ﵒ +تحج +تحج + +ﵓ +ﵓ +ﵓ +تحم +تحم + +ﵔ +ﵔ +ﵔ +تخم +تخم + +ﵕ +ﵕ +ﵕ +تمج +تمج + +ﵖ +ﵖ +ﵖ +تمح +تمح + +ﵗ +ﵗ +ﵗ +تمخ +تمخ + +ﵘ +ﵘ +ﵘ +جمح +جمح + +ﵙ +ﵙ +ﵙ +جمح +جمح + +ﵚ +ﵚ +ﵚ +حمي +حمي + +ﵛ +ﵛ +ﵛ +حمى +حمى + +ﵜ +ﵜ +ﵜ +سحج +سحج + +ﵝ +ﵝ +ﵝ +سجح +سجح + +ﵞ +ﵞ +ﵞ +سجى +سجى + +ﵟ +ﵟ +ﵟ +سمح +سمح + +ﵠ +ﵠ +ﵠ +سمح +سمح + +ﵡ +ﵡ +ﵡ +سمج +سمج + +ﵢ +ﵢ +ﵢ +سمم +سمم + +ﵣ +ﵣ +ﵣ +سمم +سمم + +ﵤ +ﵤ +ﵤ +صحح +صحح + +ﵥ +ﵥ +ﵥ +صحح +صحح + +ﵦ +ﵦ +ﵦ +صمم +صمم + +ﵧ +ﵧ +ﵧ +شحم +شحم + +ﵨ +ﵨ +ﵨ +شحم +شحم + +ﵩ +ﵩ +ﵩ +شجي +شجي + +ﵪ +ﵪ +ﵪ +شمخ +شمخ + +ﵫ +ﵫ +ﵫ +شمخ +شمخ + +ﵬ +ﵬ +ﵬ +شمم +شمم + +ﵭ +ﵭ +ﵭ +شمم +شمم + +ﵮ +ﵮ +ﵮ +ضحى +ضحى + +ﵯ +ﵯ +ﵯ +ضخم +ضخم + +ﵰ +ﵰ +ﵰ +ضخم +ضخم + +ﵱ +ﵱ +ﵱ +طمح +طمح + +ﵲ +ﵲ +ﵲ +طمح +طمح + +ﵳ +ﵳ +ﵳ +طمم +طمم + +ﵴ +ﵴ +ﵴ +طمي +طمي + +ﵵ +ﵵ +ﵵ +عجم +عجم + +ﵶ +ﵶ +ﵶ +عمم +عمم + +ﵷ +ﵷ +ﵷ +عمم +عمم + +ﵸ +ﵸ +ﵸ +عمى +عمى + +ﵹ +ﵹ +ﵹ +غمم +غمم + +ﵺ +ﵺ +ﵺ +غمي +غمي + +ﵻ +ﵻ +ﵻ +غمى +غمى + +ﵼ +ﵼ +ﵼ +فخم +فخم + +ﵽ +ﵽ +ﵽ +فخم +فخم + +ﵾ +ﵾ +ﵾ +قمح +قمح + +ﵿ +ﵿ +ﵿ +قمم +قمم + +ﶀ +ﶀ +ﶀ +لحم +لحم + +ﶁ +ﶁ +ﶁ +لحي +لحي + +ﶂ +ﶂ +ﶂ +لحى +لحى + +ﶃ +ﶃ +ﶃ +لجج +لجج + +ﶄ +ﶄ +ﶄ +لجج +لجج + +ﶅ +ﶅ +ﶅ +لخم +لخم + +ﶆ +ﶆ +ﶆ +لخم +لخم + +ﶇ +ﶇ +ﶇ +لمح +لمح + +ﶈ +ﶈ +ﶈ +لمح +لمح + +ﶉ +ﶉ +ﶉ +محج +محج + +ﶊ +ﶊ +ﶊ +محم +محم + +ﶋ +ﶋ +ﶋ +محي +محي + +ﶌ +ﶌ +ﶌ +مجح +مجح + +ﶍ +ﶍ +ﶍ +مجم +مجم + +ﶎ +ﶎ +ﶎ +مخج +مخج + +ﶏ +ﶏ +ﶏ +مخم +مخم + +ﶒ +ﶒ +ﶒ +مجخ +مجخ + +ﶓ +ﶓ +ﶓ +همج +همج + +ﶔ +ﶔ +ﶔ +همم +همم + +ﶕ +ﶕ +ﶕ +نحم +نحم + +ﶖ +ﶖ +ﶖ +نحى +نحى + +ﶗ +ﶗ +ﶗ +نجم +نجم + +ﶘ +ﶘ +ﶘ +نجم +نجم + +ﶙ +ﶙ +ﶙ +نجى +نجى + +ﶚ +ﶚ +ﶚ +نمي +نمي + +ﶛ +ﶛ +ﶛ +نمى +نمى + +ﶜ +ﶜ +ﶜ +يمم +يمم + +ﶝ +ﶝ +ﶝ +يمم +يمم + +ﶞ +ﶞ +ﶞ +بخي +بخي + +ﶟ +ﶟ +ﶟ +تجي +تجي + +ﶠ +ﶠ +ﶠ +تجى +تجى + +ﶡ +ﶡ +ﶡ +تخي +تخي + +ﶢ +ﶢ +ﶢ +تخى +تخى + +ﶣ +ﶣ +ﶣ +تمي +تمي + +ﶤ +ﶤ +ﶤ +تمى +تمى + +ﶥ +ﶥ +ﶥ +جمي +جمي + +ﶦ +ﶦ +ﶦ +جحى +جحى + +ﶧ +ﶧ +ﶧ +جمى +جمى + +ﶨ +ﶨ +ﶨ +سخى +سخى + +ﶩ +ﶩ +ﶩ +صحي +صحي + +ﶪ +ﶪ +ﶪ +شحي +شحي + +ﶫ +ﶫ +ﶫ +ضحي +ضحي + +ﶬ +ﶬ +ﶬ +لجي +لجي + +ﶭ +ﶭ +ﶭ +لمي +لمي + +ﶮ +ﶮ +ﶮ +يحي +يحي + +ﶯ +ﶯ +ﶯ +يجي +يجي + +ﶰ +ﶰ +ﶰ +يمي +يمي + +ﶱ +ﶱ +ﶱ +ممي +ممي + +ﶲ +ﶲ +ﶲ +قمي +قمي + +ﶳ +ﶳ +ﶳ +نحي +نحي + +ﶴ +ﶴ +ﶴ +قمح +قمح + +ﶵ +ﶵ +ﶵ +لحم +لحم + +ﶶ +ﶶ +ﶶ +عمي +عمي + +ﶷ +ﶷ +ﶷ +كمي +كمي + +ﶸ +ﶸ +ﶸ +نجح +نجح + +ﶹ +ﶹ +ﶹ +مخي +مخي + +ﶺ +ﶺ +ﶺ +لجم +لجم + +ﶻ +ﶻ +ﶻ +كمم +كمم + +ﶼ +ﶼ +ﶼ +لجم +لجم + +ﶽ +ﶽ +ﶽ +نجح +نجح + +ﶾ +ﶾ +ﶾ +جحي +جحي + +ﶿ +ﶿ +ﶿ +حجي +حجي + +ﷀ +ﷀ +ﷀ +مجي +مجي + +ﷁ +ﷁ +ﷁ +فمي +فمي + +ﷂ +ﷂ +ﷂ +بحي +بحي + +ﷃ +ﷃ +ﷃ +كمم +كمم + +ﷄ +ﷄ +ﷄ +عجم +عجم + +ﷅ +ﷅ +ﷅ +صمم +صمم + +ﷆ +ﷆ +ﷆ +سخي +سخي + +ﷇ +ﷇ +ﷇ +نجي +نجي + +ﷰ +ﷰ +ﷰ +صلے +صلے + +ﷱ +ﷱ +ﷱ +قلے +قلے + +ﷲ +ﷲ +ﷲ +الله +الله + +ﷳ +ﷳ +ﷳ +اكبر +اكبر + +ﷴ +ﷴ +ﷴ +محمد +محمد + +ﷵ +ﷵ +ﷵ +صلعم +صلعم + +ﷶ +ﷶ +ﷶ +رسول +رسول + +ﷷ +ﷷ +ﷷ +عليه +عليه + +ﷸ +ﷸ +ﷸ +وسلم +وسلم + +ﷹ +ﷹ +ﷹ +صلى +صلى + +ﷺ +ﷺ +ﷺ +صلى الله عليه وسلم +صلى الله عليه وسلم + +ﷻ +ﷻ +ﷻ +جل جلاله +جل جلاله + +﷼ +﷼ +﷼ +ریال +ریال + +︐ +︐ +︐ +, +, + +︑ +︑ +︑ +、 +、 + +︒ +︒ +︒ +。 +。 + +︓ +︓ +︓ +: +: + +︔ +︔ +︔ +; +; + +︕ +︕ +︕ +! +! + +︖ +︖ +︖ +? +? + +︗ +︗ +︗ +〖 +〖 + +︘ +︘ +︘ +〗 +〗 + +︙ +︙ +︙ +... +... + +︰ +︰ +︰ +.. +.. + +︱ +︱ +︱ +— +— + +︲ +︲ +︲ +– +– + +︳ +︳ +︳ +_ +_ + +︴ +︴ +︴ +_ +_ + +︵ +︵ +︵ +( +( + +︶ +︶ +︶ +) +) + +︷ +︷ +︷ +{ +{ + +︸ +︸ +︸ +} +} + +︹ +︹ +︹ +〔 +〔 + +︺ +︺ +︺ +〕 +〕 + +︻ +︻ +︻ +【 +【 + +︼ +︼ +︼ +】 +】 + +︽ +︽ +︽ +《 +《 + +︾ +︾ +︾ +》 +》 + +︿ +︿ +︿ +〈 +〈 + +﹀ +﹀ +﹀ +〉 +〉 + +﹁ +﹁ +﹁ +「 +「 + +﹂ +﹂ +﹂ +」 +」 + +﹃ +﹃ +﹃ +『 +『 + +﹄ +﹄ +﹄ +』 +』 + +﹇ +﹇ +﹇ +[ +[ + +﹈ +﹈ +﹈ +] +] + +﹉ +﹉ +﹉ + ̅ + ̅ + +﹊ +﹊ +﹊ + ̅ + ̅ + +﹋ +﹋ +﹋ + ̅ + ̅ + +﹌ +﹌ +﹌ + ̅ + ̅ + +﹍ +﹍ +﹍ +_ +_ + +﹎ +﹎ +﹎ +_ +_ + +﹏ +﹏ +﹏ +_ +_ + +﹐ +﹐ +﹐ +, +, + +﹑ +﹑ +﹑ +、 +、 + +﹒ +﹒ +﹒ +. +. + +﹔ +﹔ +﹔ +; +; + +﹕ +﹕ +﹕ +: +: + +﹖ +﹖ +﹖ +? +? + +﹗ +﹗ +﹗ +! +! + +﹘ +﹘ +﹘ +— +— + +﹙ +﹙ +﹙ +( +( + +﹚ +﹚ +﹚ +) +) + +﹛ +﹛ +﹛ +{ +{ + +﹜ +﹜ +﹜ +} +} + +﹝ +﹝ +﹝ +〔 +〔 + +﹞ +﹞ +﹞ +〕 +〕 + +﹟ +﹟ +﹟ +# +# + +﹠ +﹠ +﹠ +& +& + +﹡ +﹡ +﹡ +* +* + +﹢ +﹢ +﹢ ++ ++ + +﹣ +﹣ +﹣ +- +- + +﹤ +﹤ +﹤ +< +< + +﹥ +﹥ +﹥ +> +> + +﹦ +﹦ +﹦ += += + +﹨ +﹨ +﹨ +\ +\ + +﹩ +﹩ +﹩ +$ +$ + +﹪ +﹪ +﹪ +% +% + +﹫ +﹫ +﹫ +@ +@ + +ﹰ +ﹰ +ﹰ + ً + ً + +ﹱ +ﹱ +ﹱ +ـً +ـً + +ﹲ +ﹲ +ﹲ + ٌ + ٌ + +ﹴ +ﹴ +ﹴ + ٍ + ٍ + +ﹶ +ﹶ +ﹶ + َ + َ + +ﹷ +ﹷ +ﹷ +ـَ +ـَ + +ﹸ +ﹸ +ﹸ + ُ + ُ + +ﹹ +ﹹ +ﹹ +ـُ +ـُ + +ﹺ +ﹺ +ﹺ + ِ + ِ + +ﹻ +ﹻ +ﹻ +ـِ +ـِ + +ﹼ +ﹼ +ﹼ + ّ + ّ + +ﹽ +ﹽ +ﹽ +ـّ +ـّ + +ﹾ +ﹾ +ﹾ + ْ + ْ + +ﹿ +ﹿ +ﹿ +ـْ +ـْ + +ﺀ +ﺀ +ﺀ +ء +ء + +ﺁ +ﺁ +ﺁ +آ +آ + +ﺂ +ﺂ +ﺂ +آ +آ + +ﺃ +ﺃ +ﺃ +أ +أ + +ﺄ +ﺄ +ﺄ +أ +أ + +ﺅ +ﺅ +ﺅ +ؤ +ؤ + +ﺆ +ﺆ +ﺆ +ؤ +ؤ + +ﺇ +ﺇ +ﺇ +إ +إ + +ﺈ +ﺈ +ﺈ +إ +إ + +ﺉ +ﺉ +ﺉ +ئ +ئ + +ﺊ +ﺊ +ﺊ +ئ +ئ + +ﺋ +ﺋ +ﺋ +ئ +ئ + +ﺌ +ﺌ +ﺌ +ئ +ئ + +ﺍ +ﺍ +ﺍ +ا +ا + +ﺎ +ﺎ +ﺎ +ا +ا + +ﺏ +ﺏ +ﺏ +ب +ب + +ﺐ +ﺐ +ﺐ +ب +ب + +ﺑ +ﺑ +ﺑ +ب +ب + +ﺒ +ﺒ +ﺒ +ب +ب + +ﺓ +ﺓ +ﺓ +ة +ة + +ﺔ +ﺔ +ﺔ +ة +ة + +ﺕ +ﺕ +ﺕ +ت +ت + +ﺖ +ﺖ +ﺖ +ت +ت + +ﺗ +ﺗ +ﺗ +ت +ت + +ﺘ +ﺘ +ﺘ +ت +ت + +ﺙ +ﺙ +ﺙ +ث +ث + +ﺚ +ﺚ +ﺚ +ث +ث + +ﺛ +ﺛ +ﺛ +ث +ث + +ﺜ +ﺜ +ﺜ +ث +ث + +ﺝ +ﺝ +ﺝ +ج +ج + +ﺞ +ﺞ +ﺞ +ج +ج + +ﺟ +ﺟ +ﺟ +ج +ج + +ﺠ +ﺠ +ﺠ +ج +ج + +ﺡ +ﺡ +ﺡ +ح +ح + +ﺢ +ﺢ +ﺢ +ح +ح + +ﺣ +ﺣ +ﺣ +ح +ح + +ﺤ +ﺤ +ﺤ +ح +ح + +ﺥ +ﺥ +ﺥ +خ +خ + +ﺦ +ﺦ +ﺦ +خ +خ + +ﺧ +ﺧ +ﺧ +خ +خ + +ﺨ +ﺨ +ﺨ +خ +خ + +ﺩ +ﺩ +ﺩ +د +د + +ﺪ +ﺪ +ﺪ +د +د + +ﺫ +ﺫ +ﺫ +ذ +ذ + +ﺬ +ﺬ +ﺬ +ذ +ذ + +ﺭ +ﺭ +ﺭ +ر +ر + +ﺮ +ﺮ +ﺮ +ر +ر + +ﺯ +ﺯ +ﺯ +ز +ز + +ﺰ +ﺰ +ﺰ +ز +ز + +ﺱ +ﺱ +ﺱ +س +س + +ﺲ +ﺲ +ﺲ +س +س + +ﺳ +ﺳ +ﺳ +س +س + +ﺴ +ﺴ +ﺴ +س +س + +ﺵ +ﺵ +ﺵ +ش +ش + +ﺶ +ﺶ +ﺶ +ش +ش + +ﺷ +ﺷ +ﺷ +ش +ش + +ﺸ +ﺸ +ﺸ +ش +ش + +ﺹ +ﺹ +ﺹ +ص +ص + +ﺺ +ﺺ +ﺺ +ص +ص + +ﺻ +ﺻ +ﺻ +ص +ص + +ﺼ +ﺼ +ﺼ +ص +ص + +ﺽ +ﺽ +ﺽ +ض +ض + +ﺾ +ﺾ +ﺾ +ض +ض + +ﺿ +ﺿ +ﺿ +ض +ض + +ﻀ +ﻀ +ﻀ +ض +ض + +ﻁ +ﻁ +ﻁ +ط +ط + +ﻂ +ﻂ +ﻂ +ط +ط + +ﻃ +ﻃ +ﻃ +ط +ط + +ﻄ +ﻄ +ﻄ +ط +ط + +ﻅ +ﻅ +ﻅ +ظ +ظ + +ﻆ +ﻆ +ﻆ +ظ +ظ + +ﻇ +ﻇ +ﻇ +ظ +ظ + +ﻈ +ﻈ +ﻈ +ظ +ظ + +ﻉ +ﻉ +ﻉ +ع +ع + +ﻊ +ﻊ +ﻊ +ع +ع + +ﻋ +ﻋ +ﻋ +ع +ع + +ﻌ +ﻌ +ﻌ +ع +ع + +ﻍ +ﻍ +ﻍ +غ +غ + +ﻎ +ﻎ +ﻎ +غ +غ + +ﻏ +ﻏ +ﻏ +غ +غ + +ﻐ +ﻐ +ﻐ +غ +غ + +ﻑ +ﻑ +ﻑ +ف +ف + +ﻒ +ﻒ +ﻒ +ف +ف + +ﻓ +ﻓ +ﻓ +ف +ف + +ﻔ +ﻔ +ﻔ +ف +ف + +ﻕ +ﻕ +ﻕ +ق +ق + +ﻖ +ﻖ +ﻖ +ق +ق + +ﻗ +ﻗ +ﻗ +ق +ق + +ﻘ +ﻘ +ﻘ +ق +ق + +ﻙ +ﻙ +ﻙ +ك +ك + +ﻚ +ﻚ +ﻚ +ك +ك + +ﻛ +ﻛ +ﻛ +ك +ك + +ﻜ +ﻜ +ﻜ +ك +ك + +ﻝ +ﻝ +ﻝ +ل +ل + +ﻞ +ﻞ +ﻞ +ل +ل + +ﻟ +ﻟ +ﻟ +ل +ل + +ﻠ +ﻠ +ﻠ +ل +ل + +ﻡ +ﻡ +ﻡ +م +م + +ﻢ +ﻢ +ﻢ +م +م + +ﻣ +ﻣ +ﻣ +م +م + +ﻤ +ﻤ +ﻤ +م +م + +ﻥ +ﻥ +ﻥ +ن +ن + +ﻦ +ﻦ +ﻦ +ن +ن + +ﻧ +ﻧ +ﻧ +ن +ن + +ﻨ +ﻨ +ﻨ +ن +ن + +ﻩ +ﻩ +ﻩ +ه +ه + +ﻪ +ﻪ +ﻪ +ه +ه + +ﻫ +ﻫ +ﻫ +ه +ه + +ﻬ +ﻬ +ﻬ +ه +ه + +ﻭ +ﻭ +ﻭ +و +و + +ﻮ +ﻮ +ﻮ +و +و + +ﻯ +ﻯ +ﻯ +ى +ى + +ﻰ +ﻰ +ﻰ +ى +ى + +ﻱ +ﻱ +ﻱ +ي +ي + +ﻲ +ﻲ +ﻲ +ي +ي + +ﻳ +ﻳ +ﻳ +ي +ي + +ﻴ +ﻴ +ﻴ +ي +ي + +ﻵ +ﻵ +ﻵ +لآ +لآ + +ﻶ +ﻶ +ﻶ +لآ +لآ + +ﻷ +ﻷ +ﻷ +لأ +لأ + +ﻸ +ﻸ +ﻸ +لأ +لأ + +ﻹ +ﻹ +ﻹ +لإ +لإ + +ﻺ +ﻺ +ﻺ +لإ +لإ + +ﻻ +ﻻ +ﻻ +لا +لا + +ﻼ +ﻼ +ﻼ +لا +لا + +! +! +! +! +! + +" +" +" +" +" + +# +# +# +# +# + +$ +$ +$ +$ +$ + +% +% +% +% +% + +& +& +& +& +& + +' +' +' +' +' + +( +( +( +( +( + +) +) +) +) +) + +* +* +* +* +* + ++ ++ ++ ++ ++ + +, +, +, +, +, + +- +- +- +- +- + +. +. +. +. +. + +/ +/ +/ +/ +/ + +0 +0 +0 +0 +0 + +1 +1 +1 +1 +1 + +2 +2 +2 +2 +2 + +3 +3 +3 +3 +3 + +4 +4 +4 +4 +4 + +5 +5 +5 +5 +5 + +6 +6 +6 +6 +6 + +7 +7 +7 +7 +7 + +8 +8 +8 +8 +8 + +9 +9 +9 +9 +9 + +: +: +: +: +: + +; +; +; +; +; + +< +< +< +< +< + += += += += += + +> +> +> +> +> + +? +? +? +? +? + +@ +@ +@ +@ +@ + +A +A +A +A +A + +B +B +B +B +B + +C +C +C +C +C + +D +D +D +D +D + +E +E +E +E +E + +F +F +F +F +F + +G +G +G +G +G + +H +H +H +H +H + +I +I +I +I +I + +J +J +J +J +J + +K +K +K +K +K + +L +L +L +L +L + +M +M +M +M +M + +N +N +N +N +N + +O +O +O +O +O + +P +P +P +P +P + +Q +Q +Q +Q +Q + +R +R +R +R +R + +S +S +S +S +S + +T +T +T +T +T + +U +U +U +U +U + +V +V +V +V +V + +W +W +W +W +W + +X +X +X +X +X + +Y +Y +Y +Y +Y + +Z +Z +Z +Z +Z + +[ +[ +[ +[ +[ + +\ +\ +\ +\ +\ + +] +] +] +] +] + +^ +^ +^ +^ +^ + +_ +_ +_ +_ +_ + +` +` +` +` +` + +a +a +a +a +a + +b +b +b +b +b + +c +c +c +c +c + +d +d +d +d +d + +e +e +e +e +e + +f +f +f +f +f + +g +g +g +g +g + +h +h +h +h +h + +i +i +i +i +i + +j +j +j +j +j + +k +k +k +k +k + +l +l +l +l +l + +m +m +m +m +m + +n +n +n +n +n + +o +o +o +o +o + +p +p +p +p +p + +q +q +q +q +q + +r +r +r +r +r + +s +s +s +s +s + +t +t +t +t +t + +u +u +u +u +u + +v +v +v +v +v + +w +w +w +w +w + +x +x +x +x +x + +y +y +y +y +y + +z +z +z +z +z + +{ +{ +{ +{ +{ + +| +| +| +| +| + +} +} +} +} +} + +~ +~ +~ +~ +~ + +⦅ +⦅ +⦅ +⦅ +⦅ + +⦆ +⦆ +⦆ +⦆ +⦆ + +。 +。 +。 +。 +。 + +「 +「 +「 +「 +「 + +」 +」 +」 +」 +」 + +、 +、 +、 +、 +、 + +・ +・ +・ +・ +・ + +ヲ +ヲ +ヲ +ヲ +ヲ + +ァ +ァ +ァ +ァ +ァ + +ィ +ィ +ィ +ィ +ィ + +ゥ +ゥ +ゥ +ゥ +ゥ + +ェ +ェ +ェ +ェ +ェ + +ォ +ォ +ォ +ォ +ォ + +ャ +ャ +ャ +ャ +ャ + +ュ +ュ +ュ +ュ +ュ + +ョ +ョ +ョ +ョ +ョ + +ッ +ッ +ッ +ッ +ッ + +ー +ー +ー +ー +ー + +ア +ア +ア +ア +ア + +イ +イ +イ +イ +イ + +ウ +ウ +ウ +ウ +ウ + +エ +エ +エ +エ +エ + +オ +オ +オ +オ +オ + +カ +カ +カ +カ +カ + +キ +キ +キ +キ +キ + +ク +ク +ク +ク +ク + +ケ +ケ +ケ +ケ +ケ + +コ +コ +コ +コ +コ + +サ +サ +サ +サ +サ + +シ +シ +シ +シ +シ + +ス +ス +ス +ス +ス + +セ +セ +セ +セ +セ + +ソ +ソ +ソ +ソ +ソ + +タ +タ +タ +タ +タ + +チ +チ +チ +チ +チ + +ツ +ツ +ツ +ツ +ツ + +テ +テ +テ +テ +テ + +ト +ト +ト +ト +ト + +ナ +ナ +ナ +ナ +ナ + +ニ +ニ +ニ +ニ +ニ + +ヌ +ヌ +ヌ +ヌ +ヌ + +ネ +ネ +ネ +ネ +ネ + +ノ +ノ +ノ +ノ +ノ + +ハ +ハ +ハ +ハ +ハ + +ヒ +ヒ +ヒ +ヒ +ヒ + +フ +フ +フ +フ +フ + +ヘ +ヘ +ヘ +ヘ +ヘ + +ホ +ホ +ホ +ホ +ホ + +マ +マ +マ +マ +マ + +ミ +ミ +ミ +ミ +ミ + +ム +ム +ム +ム +ム + +メ +メ +メ +メ +メ + +モ +モ +モ +モ +モ + +ヤ +ヤ +ヤ +ヤ +ヤ + +ユ +ユ +ユ +ユ +ユ + +ヨ +ヨ +ヨ +ヨ +ヨ + +ラ +ラ +ラ +ラ +ラ + +リ +リ +リ +リ +リ + +ル +ル +ル +ル +ル + +レ +レ +レ +レ +レ + +ロ +ロ +ロ +ロ +ロ + +ワ +ワ +ワ +ワ +ワ + +ン +ン +ン +ン +ン + +゙ +゙ +゙ +゙ +゙ + +゚ +゚ +゚ +゚ +゚ + +ᅠ +ᅠ +ᅠ +ᅠ +ᅠ + +ᄀ +ᄀ +ᄀ +ᄀ +ᄀ + +ᄁ +ᄁ +ᄁ +ᄁ +ᄁ + +ᆪ +ᆪ +ᆪ +ᆪ +ᆪ + +ᄂ +ᄂ +ᄂ +ᄂ +ᄂ + +ᆬ +ᆬ +ᆬ +ᆬ +ᆬ + +ᆭ +ᆭ +ᆭ +ᆭ +ᆭ + +ᄃ +ᄃ +ᄃ +ᄃ +ᄃ + +ᄄ +ᄄ +ᄄ +ᄄ +ᄄ + +ᄅ +ᄅ +ᄅ +ᄅ +ᄅ + +ᆰ +ᆰ +ᆰ +ᆰ +ᆰ + +ᆱ +ᆱ +ᆱ +ᆱ +ᆱ + +ᆲ +ᆲ +ᆲ +ᆲ +ᆲ + +ᆳ +ᆳ +ᆳ +ᆳ +ᆳ + +ᆴ +ᆴ +ᆴ +ᆴ +ᆴ + +ᆵ +ᆵ +ᆵ +ᆵ +ᆵ + +ᄚ +ᄚ +ᄚ +ᄚ +ᄚ + +ᄆ +ᄆ +ᄆ +ᄆ +ᄆ + +ᄇ +ᄇ +ᄇ +ᄇ +ᄇ + +ᄈ +ᄈ +ᄈ +ᄈ +ᄈ + +ᄡ +ᄡ +ᄡ +ᄡ +ᄡ + +ᄉ +ᄉ +ᄉ +ᄉ +ᄉ + +ᄊ +ᄊ +ᄊ +ᄊ +ᄊ + +ᄋ +ᄋ +ᄋ +ᄋ +ᄋ + +ᄌ +ᄌ +ᄌ +ᄌ +ᄌ + +ᄍ +ᄍ +ᄍ +ᄍ +ᄍ + +ᄎ +ᄎ +ᄎ +ᄎ +ᄎ + +ᄏ +ᄏ +ᄏ +ᄏ +ᄏ + +ᄐ +ᄐ +ᄐ +ᄐ +ᄐ + +ᄑ +ᄑ +ᄑ +ᄑ +ᄑ + +ᄒ +ᄒ +ᄒ +ᄒ +ᄒ + +ᅡ +ᅡ +ᅡ +ᅡ +ᅡ + +ᅢ +ᅢ +ᅢ +ᅢ +ᅢ + +ᅣ +ᅣ +ᅣ +ᅣ +ᅣ + +ᅤ +ᅤ +ᅤ +ᅤ +ᅤ + +ᅥ +ᅥ +ᅥ +ᅥ +ᅥ + +ᅦ +ᅦ +ᅦ +ᅦ +ᅦ + +ᅧ +ᅧ +ᅧ +ᅧ +ᅧ + +ᅨ +ᅨ +ᅨ +ᅨ +ᅨ + +ᅩ +ᅩ +ᅩ +ᅩ +ᅩ + +ᅪ +ᅪ +ᅪ +ᅪ +ᅪ + +ᅫ +ᅫ +ᅫ +ᅫ +ᅫ + +ᅬ +ᅬ +ᅬ +ᅬ +ᅬ + +ᅭ +ᅭ +ᅭ +ᅭ +ᅭ + +ᅮ +ᅮ +ᅮ +ᅮ +ᅮ + +ᅯ +ᅯ +ᅯ +ᅯ +ᅯ + +ᅰ +ᅰ +ᅰ +ᅰ +ᅰ + +ᅱ +ᅱ +ᅱ +ᅱ +ᅱ + +ᅲ +ᅲ +ᅲ +ᅲ +ᅲ + +ᅳ +ᅳ +ᅳ +ᅳ +ᅳ + +ᅴ +ᅴ +ᅴ +ᅴ +ᅴ + +ᅵ +ᅵ +ᅵ +ᅵ +ᅵ + +¢ +¢ +¢ +¢ +¢ + +£ +£ +£ +£ +£ + +¬ +¬ +¬ +¬ +¬ + + ̄ + ̄ + ̄ + ̄ + ̄ + +¦ +¦ +¦ +¦ +¦ + +¥ +¥ +¥ +¥ +¥ + +₩ +₩ +₩ +₩ +₩ + +│ +│ +│ +│ +│ + +← +← +← +← +← + +↑ +↑ +↑ +↑ +↑ + +→ +→ +→ +→ +→ + +↓ +↓ +↓ +↓ +↓ + +■ +■ +■ +■ +■ + +○ +○ +○ +○ +○ + +𑂚 +𑂚 +𑂚 +𑂚 +𑂚 + +𑂜 +𑂜 +𑂜 +𑂜 +𑂜 + +𑂫 +𑂫 +𑂫 +𑂫 +𑂫 + +𑄮 +𑄮 +𑄮 +𑄮 +𑄮 + +𑄯 +𑄯 +𑄯 +𑄯 +𑄯 + +𑍋 +𑍋 +𑍋 +𑍋 +𑍋 + +𑍌 +𑍌 +𑍌 +𑍌 +𑍌 + +𑒻 +𑒻 +𑒻 +𑒻 +𑒻 + +𑒼 +𑒼 +𑒼 +𑒼 +𑒼 + +𑒾 +𑒾 +𑒾 +𑒾 +𑒾 + +𑖺 +𑖺 +𑖺 +𑖺 +𑖺 + +𑖻 +𑖻 +𑖻 +𑖻 +𑖻 + +𝅗𝅥 +𝅗𝅥 +𝅗𝅥 +𝅗𝅥 +𝅗𝅥 + +𝅘𝅥 +𝅘𝅥 +𝅘𝅥 +𝅘𝅥 +𝅘𝅥 + +𝅘𝅥𝅮 +𝅘𝅥𝅮 +𝅘𝅥𝅮 +𝅘𝅥𝅮 +𝅘𝅥𝅮 + +𝅘𝅥𝅯 +𝅘𝅥𝅯 +𝅘𝅥𝅯 +𝅘𝅥𝅯 +𝅘𝅥𝅯 + +𝅘𝅥𝅰 +𝅘𝅥𝅰 +𝅘𝅥𝅰 +𝅘𝅥𝅰 +𝅘𝅥𝅰 + +𝅘𝅥𝅱 +𝅘𝅥𝅱 +𝅘𝅥𝅱 +𝅘𝅥𝅱 +𝅘𝅥𝅱 + +𝅘𝅥𝅲 +𝅘𝅥𝅲 +𝅘𝅥𝅲 +𝅘𝅥𝅲 +𝅘𝅥𝅲 + +𝆹𝅥 +𝆹𝅥 +𝆹𝅥 +𝆹𝅥 +𝆹𝅥 + +𝆺𝅥 +𝆺𝅥 +𝆺𝅥 +𝆺𝅥 +𝆺𝅥 + +𝆹𝅥𝅮 +𝆹𝅥𝅮 +𝆹𝅥𝅮 +𝆹𝅥𝅮 +𝆹𝅥𝅮 + +𝆺𝅥𝅮 +𝆺𝅥𝅮 +𝆺𝅥𝅮 +𝆺𝅥𝅮 +𝆺𝅥𝅮 + +𝆹𝅥𝅯 +𝆹𝅥𝅯 +𝆹𝅥𝅯 +𝆹𝅥𝅯 +𝆹𝅥𝅯 + +𝆺𝅥𝅯 +𝆺𝅥𝅯 +𝆺𝅥𝅯 +𝆺𝅥𝅯 +𝆺𝅥𝅯 + +𝐀 +𝐀 +𝐀 +A +A + +𝐁 +𝐁 +𝐁 +B +B + +𝐂 +𝐂 +𝐂 +C +C + +𝐃 +𝐃 +𝐃 +D +D + +𝐄 +𝐄 +𝐄 +E +E + +𝐅 +𝐅 +𝐅 +F +F + +𝐆 +𝐆 +𝐆 +G +G + +𝐇 +𝐇 +𝐇 +H +H + +𝐈 +𝐈 +𝐈 +I +I + +𝐉 +𝐉 +𝐉 +J +J + +𝐊 +𝐊 +𝐊 +K +K + +𝐋 +𝐋 +𝐋 +L +L + +𝐌 +𝐌 +𝐌 +M +M + +𝐍 +𝐍 +𝐍 +N +N + +𝐎 +𝐎 +𝐎 +O +O + +𝐏 +𝐏 +𝐏 +P +P + +𝐐 +𝐐 +𝐐 +Q +Q + +𝐑 +𝐑 +𝐑 +R +R + +𝐒 +𝐒 +𝐒 +S +S + +𝐓 +𝐓 +𝐓 +T +T + +𝐔 +𝐔 +𝐔 +U +U + +𝐕 +𝐕 +𝐕 +V +V + +𝐖 +𝐖 +𝐖 +W +W + +𝐗 +𝐗 +𝐗 +X +X + +𝐘 +𝐘 +𝐘 +Y +Y + +𝐙 +𝐙 +𝐙 +Z +Z + +𝐚 +𝐚 +𝐚 +a +a + +𝐛 +𝐛 +𝐛 +b +b + +𝐜 +𝐜 +𝐜 +c +c + +𝐝 +𝐝 +𝐝 +d +d + +𝐞 +𝐞 +𝐞 +e +e + +𝐟 +𝐟 +𝐟 +f +f + +𝐠 +𝐠 +𝐠 +g +g + +𝐡 +𝐡 +𝐡 +h +h + +𝐢 +𝐢 +𝐢 +i +i + +𝐣 +𝐣 +𝐣 +j +j + +𝐤 +𝐤 +𝐤 +k +k + +𝐥 +𝐥 +𝐥 +l +l + +𝐦 +𝐦 +𝐦 +m +m + +𝐧 +𝐧 +𝐧 +n +n + +𝐨 +𝐨 +𝐨 +o +o + +𝐩 +𝐩 +𝐩 +p +p + +𝐪 +𝐪 +𝐪 +q +q + +𝐫 +𝐫 +𝐫 +r +r + +𝐬 +𝐬 +𝐬 +s +s + +𝐭 +𝐭 +𝐭 +t +t + +𝐮 +𝐮 +𝐮 +u +u + +𝐯 +𝐯 +𝐯 +v +v + +𝐰 +𝐰 +𝐰 +w +w + +𝐱 +𝐱 +𝐱 +x +x + +𝐲 +𝐲 +𝐲 +y +y + +𝐳 +𝐳 +𝐳 +z +z + +𝐴 +𝐴 +𝐴 +A +A + +𝐵 +𝐵 +𝐵 +B +B + +𝐶 +𝐶 +𝐶 +C +C + +𝐷 +𝐷 +𝐷 +D +D + +𝐸 +𝐸 +𝐸 +E +E + +𝐹 +𝐹 +𝐹 +F +F + +𝐺 +𝐺 +𝐺 +G +G + +𝐻 +𝐻 +𝐻 +H +H + +𝐼 +𝐼 +𝐼 +I +I + +𝐽 +𝐽 +𝐽 +J +J + +𝐾 +𝐾 +𝐾 +K +K + +𝐿 +𝐿 +𝐿 +L +L + +𝑀 +𝑀 +𝑀 +M +M + +𝑁 +𝑁 +𝑁 +N +N + +𝑂 +𝑂 +𝑂 +O +O + +𝑃 +𝑃 +𝑃 +P +P + +𝑄 +𝑄 +𝑄 +Q +Q + +𝑅 +𝑅 +𝑅 +R +R + +𝑆 +𝑆 +𝑆 +S +S + +𝑇 +𝑇 +𝑇 +T +T + +𝑈 +𝑈 +𝑈 +U +U + +𝑉 +𝑉 +𝑉 +V +V + +𝑊 +𝑊 +𝑊 +W +W + +𝑋 +𝑋 +𝑋 +X +X + +𝑌 +𝑌 +𝑌 +Y +Y + +𝑍 +𝑍 +𝑍 +Z +Z + +𝑎 +𝑎 +𝑎 +a +a + +𝑏 +𝑏 +𝑏 +b +b + +𝑐 +𝑐 +𝑐 +c +c + +𝑑 +𝑑 +𝑑 +d +d + +𝑒 +𝑒 +𝑒 +e +e + +𝑓 +𝑓 +𝑓 +f +f + +𝑔 +𝑔 +𝑔 +g +g + +𝑖 +𝑖 +𝑖 +i +i + +𝑗 +𝑗 +𝑗 +j +j + +𝑘 +𝑘 +𝑘 +k +k + +𝑙 +𝑙 +𝑙 +l +l + +𝑚 +𝑚 +𝑚 +m +m + +𝑛 +𝑛 +𝑛 +n +n + +𝑜 +𝑜 +𝑜 +o +o + +𝑝 +𝑝 +𝑝 +p +p + +𝑞 +𝑞 +𝑞 +q +q + +𝑟 +𝑟 +𝑟 +r +r + +𝑠 +𝑠 +𝑠 +s +s + +𝑡 +𝑡 +𝑡 +t +t + +𝑢 +𝑢 +𝑢 +u +u + +𝑣 +𝑣 +𝑣 +v +v + +𝑤 +𝑤 +𝑤 +w +w + +𝑥 +𝑥 +𝑥 +x +x + +𝑦 +𝑦 +𝑦 +y +y + +𝑧 +𝑧 +𝑧 +z +z + +𝑨 +𝑨 +𝑨 +A +A + +𝑩 +𝑩 +𝑩 +B +B + +𝑪 +𝑪 +𝑪 +C +C + +𝑫 +𝑫 +𝑫 +D +D + +𝑬 +𝑬 +𝑬 +E +E + +𝑭 +𝑭 +𝑭 +F +F + +𝑮 +𝑮 +𝑮 +G +G + +𝑯 +𝑯 +𝑯 +H +H + +𝑰 +𝑰 +𝑰 +I +I + +𝑱 +𝑱 +𝑱 +J +J + +𝑲 +𝑲 +𝑲 +K +K + +𝑳 +𝑳 +𝑳 +L +L + +𝑴 +𝑴 +𝑴 +M +M + +𝑵 +𝑵 +𝑵 +N +N + +𝑶 +𝑶 +𝑶 +O +O + +𝑷 +𝑷 +𝑷 +P +P + +𝑸 +𝑸 +𝑸 +Q +Q + +𝑹 +𝑹 +𝑹 +R +R + +𝑺 +𝑺 +𝑺 +S +S + +𝑻 +𝑻 +𝑻 +T +T + +𝑼 +𝑼 +𝑼 +U +U + +𝑽 +𝑽 +𝑽 +V +V + +𝑾 +𝑾 +𝑾 +W +W + +𝑿 +𝑿 +𝑿 +X +X + +𝒀 +𝒀 +𝒀 +Y +Y + +𝒁 +𝒁 +𝒁 +Z +Z + +𝒂 +𝒂 +𝒂 +a +a + +𝒃 +𝒃 +𝒃 +b +b + +𝒄 +𝒄 +𝒄 +c +c + +𝒅 +𝒅 +𝒅 +d +d + +𝒆 +𝒆 +𝒆 +e +e + +𝒇 +𝒇 +𝒇 +f +f + +𝒈 +𝒈 +𝒈 +g +g + +𝒉 +𝒉 +𝒉 +h +h + +𝒊 +𝒊 +𝒊 +i +i + +𝒋 +𝒋 +𝒋 +j +j + +𝒌 +𝒌 +𝒌 +k +k + +𝒍 +𝒍 +𝒍 +l +l + +𝒎 +𝒎 +𝒎 +m +m + +𝒏 +𝒏 +𝒏 +n +n + +𝒐 +𝒐 +𝒐 +o +o + +𝒑 +𝒑 +𝒑 +p +p + +𝒒 +𝒒 +𝒒 +q +q + +𝒓 +𝒓 +𝒓 +r +r + +𝒔 +𝒔 +𝒔 +s +s + +𝒕 +𝒕 +𝒕 +t +t + +𝒖 +𝒖 +𝒖 +u +u + +𝒗 +𝒗 +𝒗 +v +v + +𝒘 +𝒘 +𝒘 +w +w + +𝒙 +𝒙 +𝒙 +x +x + +𝒚 +𝒚 +𝒚 +y +y + +𝒛 +𝒛 +𝒛 +z +z + +𝒜 +𝒜 +𝒜 +A +A + +𝒞 +𝒞 +𝒞 +C +C + +𝒟 +𝒟 +𝒟 +D +D + +𝒢 +𝒢 +𝒢 +G +G + +𝒥 +𝒥 +𝒥 +J +J + +𝒦 +𝒦 +𝒦 +K +K + +𝒩 +𝒩 +𝒩 +N +N + +𝒪 +𝒪 +𝒪 +O +O + +𝒫 +𝒫 +𝒫 +P +P + +𝒬 +𝒬 +𝒬 +Q +Q + +𝒮 +𝒮 +𝒮 +S +S + +𝒯 +𝒯 +𝒯 +T +T + +𝒰 +𝒰 +𝒰 +U +U + +𝒱 +𝒱 +𝒱 +V +V + +𝒲 +𝒲 +𝒲 +W +W + +𝒳 +𝒳 +𝒳 +X +X + +𝒴 +𝒴 +𝒴 +Y +Y + +𝒵 +𝒵 +𝒵 +Z +Z + +𝒶 +𝒶 +𝒶 +a +a + +𝒷 +𝒷 +𝒷 +b +b + +𝒸 +𝒸 +𝒸 +c +c + +𝒹 +𝒹 +𝒹 +d +d + +𝒻 +𝒻 +𝒻 +f +f + +𝒽 +𝒽 +𝒽 +h +h + +𝒾 +𝒾 +𝒾 +i +i + +𝒿 +𝒿 +𝒿 +j +j + +𝓀 +𝓀 +𝓀 +k +k + +𝓁 +𝓁 +𝓁 +l +l + +𝓂 +𝓂 +𝓂 +m +m + +𝓃 +𝓃 +𝓃 +n +n + +𝓅 +𝓅 +𝓅 +p +p + +𝓆 +𝓆 +𝓆 +q +q + +𝓇 +𝓇 +𝓇 +r +r + +𝓈 +𝓈 +𝓈 +s +s + +𝓉 +𝓉 +𝓉 +t +t + +𝓊 +𝓊 +𝓊 +u +u + +𝓋 +𝓋 +𝓋 +v +v + +𝓌 +𝓌 +𝓌 +w +w + +𝓍 +𝓍 +𝓍 +x +x + +𝓎 +𝓎 +𝓎 +y +y + +𝓏 +𝓏 +𝓏 +z +z + +𝓐 +𝓐 +𝓐 +A +A + +𝓑 +𝓑 +𝓑 +B +B + +𝓒 +𝓒 +𝓒 +C +C + +𝓓 +𝓓 +𝓓 +D +D + +𝓔 +𝓔 +𝓔 +E +E + +𝓕 +𝓕 +𝓕 +F +F + +𝓖 +𝓖 +𝓖 +G +G + +𝓗 +𝓗 +𝓗 +H +H + +𝓘 +𝓘 +𝓘 +I +I + +𝓙 +𝓙 +𝓙 +J +J + +𝓚 +𝓚 +𝓚 +K +K + +𝓛 +𝓛 +𝓛 +L +L + +𝓜 +𝓜 +𝓜 +M +M + +𝓝 +𝓝 +𝓝 +N +N + +𝓞 +𝓞 +𝓞 +O +O + +𝓟 +𝓟 +𝓟 +P +P + +𝓠 +𝓠 +𝓠 +Q +Q + +𝓡 +𝓡 +𝓡 +R +R + +𝓢 +𝓢 +𝓢 +S +S + +𝓣 +𝓣 +𝓣 +T +T + +𝓤 +𝓤 +𝓤 +U +U + +𝓥 +𝓥 +𝓥 +V +V + +𝓦 +𝓦 +𝓦 +W +W + +𝓧 +𝓧 +𝓧 +X +X + +𝓨 +𝓨 +𝓨 +Y +Y + +𝓩 +𝓩 +𝓩 +Z +Z + +𝓪 +𝓪 +𝓪 +a +a + +𝓫 +𝓫 +𝓫 +b +b + +𝓬 +𝓬 +𝓬 +c +c + +𝓭 +𝓭 +𝓭 +d +d + +𝓮 +𝓮 +𝓮 +e +e + +𝓯 +𝓯 +𝓯 +f +f + +𝓰 +𝓰 +𝓰 +g +g + +𝓱 +𝓱 +𝓱 +h +h + +𝓲 +𝓲 +𝓲 +i +i + +𝓳 +𝓳 +𝓳 +j +j + +𝓴 +𝓴 +𝓴 +k +k + +𝓵 +𝓵 +𝓵 +l +l + +𝓶 +𝓶 +𝓶 +m +m + +𝓷 +𝓷 +𝓷 +n +n + +𝓸 +𝓸 +𝓸 +o +o + +𝓹 +𝓹 +𝓹 +p +p + +𝓺 +𝓺 +𝓺 +q +q + +𝓻 +𝓻 +𝓻 +r +r + +𝓼 +𝓼 +𝓼 +s +s + +𝓽 +𝓽 +𝓽 +t +t + +𝓾 +𝓾 +𝓾 +u +u + +𝓿 +𝓿 +𝓿 +v +v + +𝔀 +𝔀 +𝔀 +w +w + +𝔁 +𝔁 +𝔁 +x +x + +𝔂 +𝔂 +𝔂 +y +y + +𝔃 +𝔃 +𝔃 +z +z + +𝔄 +𝔄 +𝔄 +A +A + +𝔅 +𝔅 +𝔅 +B +B + +𝔇 +𝔇 +𝔇 +D +D + +𝔈 +𝔈 +𝔈 +E +E + +𝔉 +𝔉 +𝔉 +F +F + +𝔊 +𝔊 +𝔊 +G +G + +𝔍 +𝔍 +𝔍 +J +J + +𝔎 +𝔎 +𝔎 +K +K + +𝔏 +𝔏 +𝔏 +L +L + +𝔐 +𝔐 +𝔐 +M +M + +𝔑 +𝔑 +𝔑 +N +N + +𝔒 +𝔒 +𝔒 +O +O + +𝔓 +𝔓 +𝔓 +P +P + +𝔔 +𝔔 +𝔔 +Q +Q + +𝔖 +𝔖 +𝔖 +S +S + +𝔗 +𝔗 +𝔗 +T +T + +𝔘 +𝔘 +𝔘 +U +U + +𝔙 +𝔙 +𝔙 +V +V + +𝔚 +𝔚 +𝔚 +W +W + +𝔛 +𝔛 +𝔛 +X +X + +𝔜 +𝔜 +𝔜 +Y +Y + +𝔞 +𝔞 +𝔞 +a +a + +𝔟 +𝔟 +𝔟 +b +b + +𝔠 +𝔠 +𝔠 +c +c + +𝔡 +𝔡 +𝔡 +d +d + +𝔢 +𝔢 +𝔢 +e +e + +𝔣 +𝔣 +𝔣 +f +f + +𝔤 +𝔤 +𝔤 +g +g + +𝔥 +𝔥 +𝔥 +h +h + +𝔦 +𝔦 +𝔦 +i +i + +𝔧 +𝔧 +𝔧 +j +j + +𝔨 +𝔨 +𝔨 +k +k + +𝔩 +𝔩 +𝔩 +l +l + +𝔪 +𝔪 +𝔪 +m +m + +𝔫 +𝔫 +𝔫 +n +n + +𝔬 +𝔬 +𝔬 +o +o + +𝔭 +𝔭 +𝔭 +p +p + +𝔮 +𝔮 +𝔮 +q +q + +𝔯 +𝔯 +𝔯 +r +r + +𝔰 +𝔰 +𝔰 +s +s + +𝔱 +𝔱 +𝔱 +t +t + +𝔲 +𝔲 +𝔲 +u +u + +𝔳 +𝔳 +𝔳 +v +v + +𝔴 +𝔴 +𝔴 +w +w + +𝔵 +𝔵 +𝔵 +x +x + +𝔶 +𝔶 +𝔶 +y +y + +𝔷 +𝔷 +𝔷 +z +z + +𝔸 +𝔸 +𝔸 +A +A + +𝔹 +𝔹 +𝔹 +B +B + +𝔻 +𝔻 +𝔻 +D +D + +𝔼 +𝔼 +𝔼 +E +E + +𝔽 +𝔽 +𝔽 +F +F + +𝔾 +𝔾 +𝔾 +G +G + +𝕀 +𝕀 +𝕀 +I +I + +𝕁 +𝕁 +𝕁 +J +J + +𝕂 +𝕂 +𝕂 +K +K + +𝕃 +𝕃 +𝕃 +L +L + +𝕄 +𝕄 +𝕄 +M +M + +𝕆 +𝕆 +𝕆 +O +O + +𝕊 +𝕊 +𝕊 +S +S + +𝕋 +𝕋 +𝕋 +T +T + +𝕌 +𝕌 +𝕌 +U +U + +𝕍 +𝕍 +𝕍 +V +V + +𝕎 +𝕎 +𝕎 +W +W + +𝕏 +𝕏 +𝕏 +X +X + +𝕐 +𝕐 +𝕐 +Y +Y + +𝕒 +𝕒 +𝕒 +a +a + +𝕓 +𝕓 +𝕓 +b +b + +𝕔 +𝕔 +𝕔 +c +c + +𝕕 +𝕕 +𝕕 +d +d + +𝕖 +𝕖 +𝕖 +e +e + +𝕗 +𝕗 +𝕗 +f +f + +𝕘 +𝕘 +𝕘 +g +g + +𝕙 +𝕙 +𝕙 +h +h + +𝕚 +𝕚 +𝕚 +i +i + +𝕛 +𝕛 +𝕛 +j +j + +𝕜 +𝕜 +𝕜 +k +k + +𝕝 +𝕝 +𝕝 +l +l + +𝕞 +𝕞 +𝕞 +m +m + +𝕟 +𝕟 +𝕟 +n +n + +𝕠 +𝕠 +𝕠 +o +o + +𝕡 +𝕡 +𝕡 +p +p + +𝕢 +𝕢 +𝕢 +q +q + +𝕣 +𝕣 +𝕣 +r +r + +𝕤 +𝕤 +𝕤 +s +s + +𝕥 +𝕥 +𝕥 +t +t + +𝕦 +𝕦 +𝕦 +u +u + +𝕧 +𝕧 +𝕧 +v +v + +𝕨 +𝕨 +𝕨 +w +w + +𝕩 +𝕩 +𝕩 +x +x + +𝕪 +𝕪 +𝕪 +y +y + +𝕫 +𝕫 +𝕫 +z +z + +𝕬 +𝕬 +𝕬 +A +A + +𝕭 +𝕭 +𝕭 +B +B + +𝕮 +𝕮 +𝕮 +C +C + +𝕯 +𝕯 +𝕯 +D +D + +𝕰 +𝕰 +𝕰 +E +E + +𝕱 +𝕱 +𝕱 +F +F + +𝕲 +𝕲 +𝕲 +G +G + +𝕳 +𝕳 +𝕳 +H +H + +𝕴 +𝕴 +𝕴 +I +I + +𝕵 +𝕵 +𝕵 +J +J + +𝕶 +𝕶 +𝕶 +K +K + +𝕷 +𝕷 +𝕷 +L +L + +𝕸 +𝕸 +𝕸 +M +M + +𝕹 +𝕹 +𝕹 +N +N + +𝕺 +𝕺 +𝕺 +O +O + +𝕻 +𝕻 +𝕻 +P +P + +𝕼 +𝕼 +𝕼 +Q +Q + +𝕽 +𝕽 +𝕽 +R +R + +𝕾 +𝕾 +𝕾 +S +S + +𝕿 +𝕿 +𝕿 +T +T + +𝖀 +𝖀 +𝖀 +U +U + +𝖁 +𝖁 +𝖁 +V +V + +𝖂 +𝖂 +𝖂 +W +W + +𝖃 +𝖃 +𝖃 +X +X + +𝖄 +𝖄 +𝖄 +Y +Y + +𝖅 +𝖅 +𝖅 +Z +Z + +𝖆 +𝖆 +𝖆 +a +a + +𝖇 +𝖇 +𝖇 +b +b + +𝖈 +𝖈 +𝖈 +c +c + +𝖉 +𝖉 +𝖉 +d +d + +𝖊 +𝖊 +𝖊 +e +e + +𝖋 +𝖋 +𝖋 +f +f + +𝖌 +𝖌 +𝖌 +g +g + +𝖍 +𝖍 +𝖍 +h +h + +𝖎 +𝖎 +𝖎 +i +i + +𝖏 +𝖏 +𝖏 +j +j + +𝖐 +𝖐 +𝖐 +k +k + +𝖑 +𝖑 +𝖑 +l +l + +𝖒 +𝖒 +𝖒 +m +m + +𝖓 +𝖓 +𝖓 +n +n + +𝖔 +𝖔 +𝖔 +o +o + +𝖕 +𝖕 +𝖕 +p +p + +𝖖 +𝖖 +𝖖 +q +q + +𝖗 +𝖗 +𝖗 +r +r + +𝖘 +𝖘 +𝖘 +s +s + +𝖙 +𝖙 +𝖙 +t +t + +𝖚 +𝖚 +𝖚 +u +u + +𝖛 +𝖛 +𝖛 +v +v + +𝖜 +𝖜 +𝖜 +w +w + +𝖝 +𝖝 +𝖝 +x +x + +𝖞 +𝖞 +𝖞 +y +y + +𝖟 +𝖟 +𝖟 +z +z + +𝖠 +𝖠 +𝖠 +A +A + +𝖡 +𝖡 +𝖡 +B +B + +𝖢 +𝖢 +𝖢 +C +C + +𝖣 +𝖣 +𝖣 +D +D + +𝖤 +𝖤 +𝖤 +E +E + +𝖥 +𝖥 +𝖥 +F +F + +𝖦 +𝖦 +𝖦 +G +G + +𝖧 +𝖧 +𝖧 +H +H + +𝖨 +𝖨 +𝖨 +I +I + +𝖩 +𝖩 +𝖩 +J +J + +𝖪 +𝖪 +𝖪 +K +K + +𝖫 +𝖫 +𝖫 +L +L + +𝖬 +𝖬 +𝖬 +M +M + +𝖭 +𝖭 +𝖭 +N +N + +𝖮 +𝖮 +𝖮 +O +O + +𝖯 +𝖯 +𝖯 +P +P + +𝖰 +𝖰 +𝖰 +Q +Q + +𝖱 +𝖱 +𝖱 +R +R + +𝖲 +𝖲 +𝖲 +S +S + +𝖳 +𝖳 +𝖳 +T +T + +𝖴 +𝖴 +𝖴 +U +U + +𝖵 +𝖵 +𝖵 +V +V + +𝖶 +𝖶 +𝖶 +W +W + +𝖷 +𝖷 +𝖷 +X +X + +𝖸 +𝖸 +𝖸 +Y +Y + +𝖹 +𝖹 +𝖹 +Z +Z + +𝖺 +𝖺 +𝖺 +a +a + +𝖻 +𝖻 +𝖻 +b +b + +𝖼 +𝖼 +𝖼 +c +c + +𝖽 +𝖽 +𝖽 +d +d + +𝖾 +𝖾 +𝖾 +e +e + +𝖿 +𝖿 +𝖿 +f +f + +𝗀 +𝗀 +𝗀 +g +g + +𝗁 +𝗁 +𝗁 +h +h + +𝗂 +𝗂 +𝗂 +i +i + +𝗃 +𝗃 +𝗃 +j +j + +𝗄 +𝗄 +𝗄 +k +k + +𝗅 +𝗅 +𝗅 +l +l + +𝗆 +𝗆 +𝗆 +m +m + +𝗇 +𝗇 +𝗇 +n +n + +𝗈 +𝗈 +𝗈 +o +o + +𝗉 +𝗉 +𝗉 +p +p + +𝗊 +𝗊 +𝗊 +q +q + +𝗋 +𝗋 +𝗋 +r +r + +𝗌 +𝗌 +𝗌 +s +s + +𝗍 +𝗍 +𝗍 +t +t + +𝗎 +𝗎 +𝗎 +u +u + +𝗏 +𝗏 +𝗏 +v +v + +𝗐 +𝗐 +𝗐 +w +w + +𝗑 +𝗑 +𝗑 +x +x + +𝗒 +𝗒 +𝗒 +y +y + +𝗓 +𝗓 +𝗓 +z +z + +𝗔 +𝗔 +𝗔 +A +A + +𝗕 +𝗕 +𝗕 +B +B + +𝗖 +𝗖 +𝗖 +C +C + +𝗗 +𝗗 +𝗗 +D +D + +𝗘 +𝗘 +𝗘 +E +E + +𝗙 +𝗙 +𝗙 +F +F + +𝗚 +𝗚 +𝗚 +G +G + +𝗛 +𝗛 +𝗛 +H +H + +𝗜 +𝗜 +𝗜 +I +I + +𝗝 +𝗝 +𝗝 +J +J + +𝗞 +𝗞 +𝗞 +K +K + +𝗟 +𝗟 +𝗟 +L +L + +𝗠 +𝗠 +𝗠 +M +M + +𝗡 +𝗡 +𝗡 +N +N + +𝗢 +𝗢 +𝗢 +O +O + +𝗣 +𝗣 +𝗣 +P +P + +𝗤 +𝗤 +𝗤 +Q +Q + +𝗥 +𝗥 +𝗥 +R +R + +𝗦 +𝗦 +𝗦 +S +S + +𝗧 +𝗧 +𝗧 +T +T + +𝗨 +𝗨 +𝗨 +U +U + +𝗩 +𝗩 +𝗩 +V +V + +𝗪 +𝗪 +𝗪 +W +W + +𝗫 +𝗫 +𝗫 +X +X + +𝗬 +𝗬 +𝗬 +Y +Y + +𝗭 +𝗭 +𝗭 +Z +Z + +𝗮 +𝗮 +𝗮 +a +a + +𝗯 +𝗯 +𝗯 +b +b + +𝗰 +𝗰 +𝗰 +c +c + +𝗱 +𝗱 +𝗱 +d +d + +𝗲 +𝗲 +𝗲 +e +e + +𝗳 +𝗳 +𝗳 +f +f + +𝗴 +𝗴 +𝗴 +g +g + +𝗵 +𝗵 +𝗵 +h +h + +𝗶 +𝗶 +𝗶 +i +i + +𝗷 +𝗷 +𝗷 +j +j + +𝗸 +𝗸 +𝗸 +k +k + +𝗹 +𝗹 +𝗹 +l +l + +𝗺 +𝗺 +𝗺 +m +m + +𝗻 +𝗻 +𝗻 +n +n + +𝗼 +𝗼 +𝗼 +o +o + +𝗽 +𝗽 +𝗽 +p +p + +𝗾 +𝗾 +𝗾 +q +q + +𝗿 +𝗿 +𝗿 +r +r + +𝘀 +𝘀 +𝘀 +s +s + +𝘁 +𝘁 +𝘁 +t +t + +𝘂 +𝘂 +𝘂 +u +u + +𝘃 +𝘃 +𝘃 +v +v + +𝘄 +𝘄 +𝘄 +w +w + +𝘅 +𝘅 +𝘅 +x +x + +𝘆 +𝘆 +𝘆 +y +y + +𝘇 +𝘇 +𝘇 +z +z + +𝘈 +𝘈 +𝘈 +A +A + +𝘉 +𝘉 +𝘉 +B +B + +𝘊 +𝘊 +𝘊 +C +C + +𝘋 +𝘋 +𝘋 +D +D + +𝘌 +𝘌 +𝘌 +E +E + +𝘍 +𝘍 +𝘍 +F +F + +𝘎 +𝘎 +𝘎 +G +G + +𝘏 +𝘏 +𝘏 +H +H + +𝘐 +𝘐 +𝘐 +I +I + +𝘑 +𝘑 +𝘑 +J +J + +𝘒 +𝘒 +𝘒 +K +K + +𝘓 +𝘓 +𝘓 +L +L + +𝘔 +𝘔 +𝘔 +M +M + +𝘕 +𝘕 +𝘕 +N +N + +𝘖 +𝘖 +𝘖 +O +O + +𝘗 +𝘗 +𝘗 +P +P + +𝘘 +𝘘 +𝘘 +Q +Q + +𝘙 +𝘙 +𝘙 +R +R + +𝘚 +𝘚 +𝘚 +S +S + +𝘛 +𝘛 +𝘛 +T +T + +𝘜 +𝘜 +𝘜 +U +U + +𝘝 +𝘝 +𝘝 +V +V + +𝘞 +𝘞 +𝘞 +W +W + +𝘟 +𝘟 +𝘟 +X +X + +𝘠 +𝘠 +𝘠 +Y +Y + +𝘡 +𝘡 +𝘡 +Z +Z + +𝘢 +𝘢 +𝘢 +a +a + +𝘣 +𝘣 +𝘣 +b +b + +𝘤 +𝘤 +𝘤 +c +c + +𝘥 +𝘥 +𝘥 +d +d + +𝘦 +𝘦 +𝘦 +e +e + +𝘧 +𝘧 +𝘧 +f +f + +𝘨 +𝘨 +𝘨 +g +g + +𝘩 +𝘩 +𝘩 +h +h + +𝘪 +𝘪 +𝘪 +i +i + +𝘫 +𝘫 +𝘫 +j +j + +𝘬 +𝘬 +𝘬 +k +k + +𝘭 +𝘭 +𝘭 +l +l + +𝘮 +𝘮 +𝘮 +m +m + +𝘯 +𝘯 +𝘯 +n +n + +𝘰 +𝘰 +𝘰 +o +o + +𝘱 +𝘱 +𝘱 +p +p + +𝘲 +𝘲 +𝘲 +q +q + +𝘳 +𝘳 +𝘳 +r +r + +𝘴 +𝘴 +𝘴 +s +s + +𝘵 +𝘵 +𝘵 +t +t + +𝘶 +𝘶 +𝘶 +u +u + +𝘷 +𝘷 +𝘷 +v +v + +𝘸 +𝘸 +𝘸 +w +w + +𝘹 +𝘹 +𝘹 +x +x + +𝘺 +𝘺 +𝘺 +y +y + +𝘻 +𝘻 +𝘻 +z +z + +𝘼 +𝘼 +𝘼 +A +A + +𝘽 +𝘽 +𝘽 +B +B + +𝘾 +𝘾 +𝘾 +C +C + +𝘿 +𝘿 +𝘿 +D +D + +𝙀 +𝙀 +𝙀 +E +E + +𝙁 +𝙁 +𝙁 +F +F + +𝙂 +𝙂 +𝙂 +G +G + +𝙃 +𝙃 +𝙃 +H +H + +𝙄 +𝙄 +𝙄 +I +I + +𝙅 +𝙅 +𝙅 +J +J + +𝙆 +𝙆 +𝙆 +K +K + +𝙇 +𝙇 +𝙇 +L +L + +𝙈 +𝙈 +𝙈 +M +M + +𝙉 +𝙉 +𝙉 +N +N + +𝙊 +𝙊 +𝙊 +O +O + +𝙋 +𝙋 +𝙋 +P +P + +𝙌 +𝙌 +𝙌 +Q +Q + +𝙍 +𝙍 +𝙍 +R +R + +𝙎 +𝙎 +𝙎 +S +S + +𝙏 +𝙏 +𝙏 +T +T + +𝙐 +𝙐 +𝙐 +U +U + +𝙑 +𝙑 +𝙑 +V +V + +𝙒 +𝙒 +𝙒 +W +W + +𝙓 +𝙓 +𝙓 +X +X + +𝙔 +𝙔 +𝙔 +Y +Y + +𝙕 +𝙕 +𝙕 +Z +Z + +𝙖 +𝙖 +𝙖 +a +a + +𝙗 +𝙗 +𝙗 +b +b + +𝙘 +𝙘 +𝙘 +c +c + +𝙙 +𝙙 +𝙙 +d +d + +𝙚 +𝙚 +𝙚 +e +e + +𝙛 +𝙛 +𝙛 +f +f + +𝙜 +𝙜 +𝙜 +g +g + +𝙝 +𝙝 +𝙝 +h +h + +𝙞 +𝙞 +𝙞 +i +i + +𝙟 +𝙟 +𝙟 +j +j + +𝙠 +𝙠 +𝙠 +k +k + +𝙡 +𝙡 +𝙡 +l +l + +𝙢 +𝙢 +𝙢 +m +m + +𝙣 +𝙣 +𝙣 +n +n + +𝙤 +𝙤 +𝙤 +o +o + +𝙥 +𝙥 +𝙥 +p +p + +𝙦 +𝙦 +𝙦 +q +q + +𝙧 +𝙧 +𝙧 +r +r + +𝙨 +𝙨 +𝙨 +s +s + +𝙩 +𝙩 +𝙩 +t +t + +𝙪 +𝙪 +𝙪 +u +u + +𝙫 +𝙫 +𝙫 +v +v + +𝙬 +𝙬 +𝙬 +w +w + +𝙭 +𝙭 +𝙭 +x +x + +𝙮 +𝙮 +𝙮 +y +y + +𝙯 +𝙯 +𝙯 +z +z + +𝙰 +𝙰 +𝙰 +A +A + +𝙱 +𝙱 +𝙱 +B +B + +𝙲 +𝙲 +𝙲 +C +C + +𝙳 +𝙳 +𝙳 +D +D + +𝙴 +𝙴 +𝙴 +E +E + +𝙵 +𝙵 +𝙵 +F +F + +𝙶 +𝙶 +𝙶 +G +G + +𝙷 +𝙷 +𝙷 +H +H + +𝙸 +𝙸 +𝙸 +I +I + +𝙹 +𝙹 +𝙹 +J +J + +𝙺 +𝙺 +𝙺 +K +K + +𝙻 +𝙻 +𝙻 +L +L + +𝙼 +𝙼 +𝙼 +M +M + +𝙽 +𝙽 +𝙽 +N +N + +𝙾 +𝙾 +𝙾 +O +O + +𝙿 +𝙿 +𝙿 +P +P + +𝚀 +𝚀 +𝚀 +Q +Q + +𝚁 +𝚁 +𝚁 +R +R + +𝚂 +𝚂 +𝚂 +S +S + +𝚃 +𝚃 +𝚃 +T +T + +𝚄 +𝚄 +𝚄 +U +U + +𝚅 +𝚅 +𝚅 +V +V + +𝚆 +𝚆 +𝚆 +W +W + +𝚇 +𝚇 +𝚇 +X +X + +𝚈 +𝚈 +𝚈 +Y +Y + +𝚉 +𝚉 +𝚉 +Z +Z + +𝚊 +𝚊 +𝚊 +a +a + +𝚋 +𝚋 +𝚋 +b +b + +𝚌 +𝚌 +𝚌 +c +c + +𝚍 +𝚍 +𝚍 +d +d + +𝚎 +𝚎 +𝚎 +e +e + +𝚏 +𝚏 +𝚏 +f +f + +𝚐 +𝚐 +𝚐 +g +g + +𝚑 +𝚑 +𝚑 +h +h + +𝚒 +𝚒 +𝚒 +i +i + +𝚓 +𝚓 +𝚓 +j +j + +𝚔 +𝚔 +𝚔 +k +k + +𝚕 +𝚕 +𝚕 +l +l + +𝚖 +𝚖 +𝚖 +m +m + +𝚗 +𝚗 +𝚗 +n +n + +𝚘 +𝚘 +𝚘 +o +o + +𝚙 +𝚙 +𝚙 +p +p + +𝚚 +𝚚 +𝚚 +q +q + +𝚛 +𝚛 +𝚛 +r +r + +𝚜 +𝚜 +𝚜 +s +s + +𝚝 +𝚝 +𝚝 +t +t + +𝚞 +𝚞 +𝚞 +u +u + +𝚟 +𝚟 +𝚟 +v +v + +𝚠 +𝚠 +𝚠 +w +w + +𝚡 +𝚡 +𝚡 +x +x + +𝚢 +𝚢 +𝚢 +y +y + +𝚣 +𝚣 +𝚣 +z +z + +𝚤 +𝚤 +𝚤 +ı +ı + +𝚥 +𝚥 +𝚥 +ȷ +ȷ + +𝚨 +𝚨 +𝚨 +Α +Α + +𝚩 +𝚩 +𝚩 +Β +Β + +𝚪 +𝚪 +𝚪 +Γ +Γ + +𝚫 +𝚫 +𝚫 +Δ +Δ + +𝚬 +𝚬 +𝚬 +Ε +Ε + +𝚭 +𝚭 +𝚭 +Ζ +Ζ + +𝚮 +𝚮 +𝚮 +Η +Η + +𝚯 +𝚯 +𝚯 +Θ +Θ + +𝚰 +𝚰 +𝚰 +Ι +Ι + +𝚱 +𝚱 +𝚱 +Κ +Κ + +𝚲 +𝚲 +𝚲 +Λ +Λ + +𝚳 +𝚳 +𝚳 +Μ +Μ + +𝚴 +𝚴 +𝚴 +Ν +Ν + +𝚵 +𝚵 +𝚵 +Ξ +Ξ + +𝚶 +𝚶 +𝚶 +Ο +Ο + +𝚷 +𝚷 +𝚷 +Π +Π + +𝚸 +𝚸 +𝚸 +Ρ +Ρ + +𝚹 +𝚹 +𝚹 +Θ +Θ + +𝚺 +𝚺 +𝚺 +Σ +Σ + +𝚻 +𝚻 +𝚻 +Τ +Τ + +𝚼 +𝚼 +𝚼 +Υ +Υ + +𝚽 +𝚽 +𝚽 +Φ +Φ + +𝚾 +𝚾 +𝚾 +Χ +Χ + +𝚿 +𝚿 +𝚿 +Ψ +Ψ + +𝛀 +𝛀 +𝛀 +Ω +Ω + +𝛁 +𝛁 +𝛁 +∇ +∇ + +𝛂 +𝛂 +𝛂 +α +α + +𝛃 +𝛃 +𝛃 +β +β + +𝛄 +𝛄 +𝛄 +γ +γ + +𝛅 +𝛅 +𝛅 +δ +δ + +𝛆 +𝛆 +𝛆 +ε +ε + +𝛇 +𝛇 +𝛇 +ζ +ζ + +𝛈 +𝛈 +𝛈 +η +η + +𝛉 +𝛉 +𝛉 +θ +θ + +𝛊 +𝛊 +𝛊 +ι +ι + +𝛋 +𝛋 +𝛋 +κ +κ + +𝛌 +𝛌 +𝛌 +λ +λ + +𝛍 +𝛍 +𝛍 +μ +μ + +𝛎 +𝛎 +𝛎 +ν +ν + +𝛏 +𝛏 +𝛏 +ξ +ξ + +𝛐 +𝛐 +𝛐 +ο +ο + +𝛑 +𝛑 +𝛑 +π +π + +𝛒 +𝛒 +𝛒 +ρ +ρ + +𝛓 +𝛓 +𝛓 +ς +ς + +𝛔 +𝛔 +𝛔 +σ +σ + +𝛕 +𝛕 +𝛕 +τ +τ + +𝛖 +𝛖 +𝛖 +υ +υ + +𝛗 +𝛗 +𝛗 +φ +φ + +𝛘 +𝛘 +𝛘 +χ +χ + +𝛙 +𝛙 +𝛙 +ψ +ψ + +𝛚 +𝛚 +𝛚 +ω +ω + +𝛛 +𝛛 +𝛛 +∂ +∂ + +𝛜 +𝛜 +𝛜 +ε +ε + +𝛝 +𝛝 +𝛝 +θ +θ + +𝛞 +𝛞 +𝛞 +κ +κ + +𝛟 +𝛟 +𝛟 +φ +φ + +𝛠 +𝛠 +𝛠 +ρ +ρ + +𝛡 +𝛡 +𝛡 +π +π + +𝛢 +𝛢 +𝛢 +Α +Α + +𝛣 +𝛣 +𝛣 +Β +Β + +𝛤 +𝛤 +𝛤 +Γ +Γ + +𝛥 +𝛥 +𝛥 +Δ +Δ + +𝛦 +𝛦 +𝛦 +Ε +Ε + +𝛧 +𝛧 +𝛧 +Ζ +Ζ + +𝛨 +𝛨 +𝛨 +Η +Η + +𝛩 +𝛩 +𝛩 +Θ +Θ + +𝛪 +𝛪 +𝛪 +Ι +Ι + +𝛫 +𝛫 +𝛫 +Κ +Κ + +𝛬 +𝛬 +𝛬 +Λ +Λ + +𝛭 +𝛭 +𝛭 +Μ +Μ + +𝛮 +𝛮 +𝛮 +Ν +Ν + +𝛯 +𝛯 +𝛯 +Ξ +Ξ + +𝛰 +𝛰 +𝛰 +Ο +Ο + +𝛱 +𝛱 +𝛱 +Π +Π + +𝛲 +𝛲 +𝛲 +Ρ +Ρ + +𝛳 +𝛳 +𝛳 +Θ +Θ + +𝛴 +𝛴 +𝛴 +Σ +Σ + +𝛵 +𝛵 +𝛵 +Τ +Τ + +𝛶 +𝛶 +𝛶 +Υ +Υ + +𝛷 +𝛷 +𝛷 +Φ +Φ + +𝛸 +𝛸 +𝛸 +Χ +Χ + +𝛹 +𝛹 +𝛹 +Ψ +Ψ + +𝛺 +𝛺 +𝛺 +Ω +Ω + +𝛻 +𝛻 +𝛻 +∇ +∇ + +𝛼 +𝛼 +𝛼 +α +α + +𝛽 +𝛽 +𝛽 +β +β + +𝛾 +𝛾 +𝛾 +γ +γ + +𝛿 +𝛿 +𝛿 +δ +δ + +𝜀 +𝜀 +𝜀 +ε +ε + +𝜁 +𝜁 +𝜁 +ζ +ζ + +𝜂 +𝜂 +𝜂 +η +η + +𝜃 +𝜃 +𝜃 +θ +θ + +𝜄 +𝜄 +𝜄 +ι +ι + +𝜅 +𝜅 +𝜅 +κ +κ + +𝜆 +𝜆 +𝜆 +λ +λ + +𝜇 +𝜇 +𝜇 +μ +μ + +𝜈 +𝜈 +𝜈 +ν +ν + +𝜉 +𝜉 +𝜉 +ξ +ξ + +𝜊 +𝜊 +𝜊 +ο +ο + +𝜋 +𝜋 +𝜋 +π +π + +𝜌 +𝜌 +𝜌 +ρ +ρ + +𝜍 +𝜍 +𝜍 +ς +ς + +𝜎 +𝜎 +𝜎 +σ +σ + +𝜏 +𝜏 +𝜏 +τ +τ + +𝜐 +𝜐 +𝜐 +υ +υ + +𝜑 +𝜑 +𝜑 +φ +φ + +𝜒 +𝜒 +𝜒 +χ +χ + +𝜓 +𝜓 +𝜓 +ψ +ψ + +𝜔 +𝜔 +𝜔 +ω +ω + +𝜕 +𝜕 +𝜕 +∂ +∂ + +𝜖 +𝜖 +𝜖 +ε +ε + +𝜗 +𝜗 +𝜗 +θ +θ + +𝜘 +𝜘 +𝜘 +κ +κ + +𝜙 +𝜙 +𝜙 +φ +φ + +𝜚 +𝜚 +𝜚 +ρ +ρ + +𝜛 +𝜛 +𝜛 +π +π + +𝜜 +𝜜 +𝜜 +Α +Α + +𝜝 +𝜝 +𝜝 +Β +Β + +𝜞 +𝜞 +𝜞 +Γ +Γ + +𝜟 +𝜟 +𝜟 +Δ +Δ + +𝜠 +𝜠 +𝜠 +Ε +Ε + +𝜡 +𝜡 +𝜡 +Ζ +Ζ + +𝜢 +𝜢 +𝜢 +Η +Η + +𝜣 +𝜣 +𝜣 +Θ +Θ + +𝜤 +𝜤 +𝜤 +Ι +Ι + +𝜥 +𝜥 +𝜥 +Κ +Κ + +𝜦 +𝜦 +𝜦 +Λ +Λ + +𝜧 +𝜧 +𝜧 +Μ +Μ + +𝜨 +𝜨 +𝜨 +Ν +Ν + +𝜩 +𝜩 +𝜩 +Ξ +Ξ + +𝜪 +𝜪 +𝜪 +Ο +Ο + +𝜫 +𝜫 +𝜫 +Π +Π + +𝜬 +𝜬 +𝜬 +Ρ +Ρ + +𝜭 +𝜭 +𝜭 +Θ +Θ + +𝜮 +𝜮 +𝜮 +Σ +Σ + +𝜯 +𝜯 +𝜯 +Τ +Τ + +𝜰 +𝜰 +𝜰 +Υ +Υ + +𝜱 +𝜱 +𝜱 +Φ +Φ + +𝜲 +𝜲 +𝜲 +Χ +Χ + +𝜳 +𝜳 +𝜳 +Ψ +Ψ + +𝜴 +𝜴 +𝜴 +Ω +Ω + +𝜵 +𝜵 +𝜵 +∇ +∇ + +𝜶 +𝜶 +𝜶 +α +α + +𝜷 +𝜷 +𝜷 +β +β + +𝜸 +𝜸 +𝜸 +γ +γ + +𝜹 +𝜹 +𝜹 +δ +δ + +𝜺 +𝜺 +𝜺 +ε +ε + +𝜻 +𝜻 +𝜻 +ζ +ζ + +𝜼 +𝜼 +𝜼 +η +η + +𝜽 +𝜽 +𝜽 +θ +θ + +𝜾 +𝜾 +𝜾 +ι +ι + +𝜿 +𝜿 +𝜿 +κ +κ + +𝝀 +𝝀 +𝝀 +λ +λ + +𝝁 +𝝁 +𝝁 +μ +μ + +𝝂 +𝝂 +𝝂 +ν +ν + +𝝃 +𝝃 +𝝃 +ξ +ξ + +𝝄 +𝝄 +𝝄 +ο +ο + +𝝅 +𝝅 +𝝅 +π +π + +𝝆 +𝝆 +𝝆 +ρ +ρ + +𝝇 +𝝇 +𝝇 +ς +ς + +𝝈 +𝝈 +𝝈 +σ +σ + +𝝉 +𝝉 +𝝉 +τ +τ + +𝝊 +𝝊 +𝝊 +υ +υ + +𝝋 +𝝋 +𝝋 +φ +φ + +𝝌 +𝝌 +𝝌 +χ +χ + +𝝍 +𝝍 +𝝍 +ψ +ψ + +𝝎 +𝝎 +𝝎 +ω +ω + +𝝏 +𝝏 +𝝏 +∂ +∂ + +𝝐 +𝝐 +𝝐 +ε +ε + +𝝑 +𝝑 +𝝑 +θ +θ + +𝝒 +𝝒 +𝝒 +κ +κ + +𝝓 +𝝓 +𝝓 +φ +φ + +𝝔 +𝝔 +𝝔 +ρ +ρ + +𝝕 +𝝕 +𝝕 +π +π + +𝝖 +𝝖 +𝝖 +Α +Α + +𝝗 +𝝗 +𝝗 +Β +Β + +𝝘 +𝝘 +𝝘 +Γ +Γ + +𝝙 +𝝙 +𝝙 +Δ +Δ + +𝝚 +𝝚 +𝝚 +Ε +Ε + +𝝛 +𝝛 +𝝛 +Ζ +Ζ + +𝝜 +𝝜 +𝝜 +Η +Η + +𝝝 +𝝝 +𝝝 +Θ +Θ + +𝝞 +𝝞 +𝝞 +Ι +Ι + +𝝟 +𝝟 +𝝟 +Κ +Κ + +𝝠 +𝝠 +𝝠 +Λ +Λ + +𝝡 +𝝡 +𝝡 +Μ +Μ + +𝝢 +𝝢 +𝝢 +Ν +Ν + +𝝣 +𝝣 +𝝣 +Ξ +Ξ + +𝝤 +𝝤 +𝝤 +Ο +Ο + +𝝥 +𝝥 +𝝥 +Π +Π + +𝝦 +𝝦 +𝝦 +Ρ +Ρ + +𝝧 +𝝧 +𝝧 +Θ +Θ + +𝝨 +𝝨 +𝝨 +Σ +Σ + +𝝩 +𝝩 +𝝩 +Τ +Τ + +𝝪 +𝝪 +𝝪 +Υ +Υ + +𝝫 +𝝫 +𝝫 +Φ +Φ + +𝝬 +𝝬 +𝝬 +Χ +Χ + +𝝭 +𝝭 +𝝭 +Ψ +Ψ + +𝝮 +𝝮 +𝝮 +Ω +Ω + +𝝯 +𝝯 +𝝯 +∇ +∇ + +𝝰 +𝝰 +𝝰 +α +α + +𝝱 +𝝱 +𝝱 +β +β + +𝝲 +𝝲 +𝝲 +γ +γ + +𝝳 +𝝳 +𝝳 +δ +δ + +𝝴 +𝝴 +𝝴 +ε +ε + +𝝵 +𝝵 +𝝵 +ζ +ζ + +𝝶 +𝝶 +𝝶 +η +η + +𝝷 +𝝷 +𝝷 +θ +θ + +𝝸 +𝝸 +𝝸 +ι +ι + +𝝹 +𝝹 +𝝹 +κ +κ + +𝝺 +𝝺 +𝝺 +λ +λ + +𝝻 +𝝻 +𝝻 +μ +μ + +𝝼 +𝝼 +𝝼 +ν +ν + +𝝽 +𝝽 +𝝽 +ξ +ξ + +𝝾 +𝝾 +𝝾 +ο +ο + +𝝿 +𝝿 +𝝿 +π +π + +𝞀 +𝞀 +𝞀 +ρ +ρ + +𝞁 +𝞁 +𝞁 +ς +ς + +𝞂 +𝞂 +𝞂 +σ +σ + +𝞃 +𝞃 +𝞃 +τ +τ + +𝞄 +𝞄 +𝞄 +υ +υ + +𝞅 +𝞅 +𝞅 +φ +φ + +𝞆 +𝞆 +𝞆 +χ +χ + +𝞇 +𝞇 +𝞇 +ψ +ψ + +𝞈 +𝞈 +𝞈 +ω +ω + +𝞉 +𝞉 +𝞉 +∂ +∂ + +𝞊 +𝞊 +𝞊 +ε +ε + +𝞋 +𝞋 +𝞋 +θ +θ + +𝞌 +𝞌 +𝞌 +κ +κ + +𝞍 +𝞍 +𝞍 +φ +φ + +𝞎 +𝞎 +𝞎 +ρ +ρ + +𝞏 +𝞏 +𝞏 +π +π + +𝞐 +𝞐 +𝞐 +Α +Α + +𝞑 +𝞑 +𝞑 +Β +Β + +𝞒 +𝞒 +𝞒 +Γ +Γ + +𝞓 +𝞓 +𝞓 +Δ +Δ + +𝞔 +𝞔 +𝞔 +Ε +Ε + +𝞕 +𝞕 +𝞕 +Ζ +Ζ + +𝞖 +𝞖 +𝞖 +Η +Η + +𝞗 +𝞗 +𝞗 +Θ +Θ + +𝞘 +𝞘 +𝞘 +Ι +Ι + +𝞙 +𝞙 +𝞙 +Κ +Κ + +𝞚 +𝞚 +𝞚 +Λ +Λ + +𝞛 +𝞛 +𝞛 +Μ +Μ + +𝞜 +𝞜 +𝞜 +Ν +Ν + +𝞝 +𝞝 +𝞝 +Ξ +Ξ + +𝞞 +𝞞 +𝞞 +Ο +Ο + +𝞟 +𝞟 +𝞟 +Π +Π + +𝞠 +𝞠 +𝞠 +Ρ +Ρ + +𝞡 +𝞡 +𝞡 +Θ +Θ + +𝞢 +𝞢 +𝞢 +Σ +Σ + +𝞣 +𝞣 +𝞣 +Τ +Τ + +𝞤 +𝞤 +𝞤 +Υ +Υ + +𝞥 +𝞥 +𝞥 +Φ +Φ + +𝞦 +𝞦 +𝞦 +Χ +Χ + +𝞧 +𝞧 +𝞧 +Ψ +Ψ + +𝞨 +𝞨 +𝞨 +Ω +Ω + +𝞩 +𝞩 +𝞩 +∇ +∇ + +𝞪 +𝞪 +𝞪 +α +α + +𝞫 +𝞫 +𝞫 +β +β + +𝞬 +𝞬 +𝞬 +γ +γ + +𝞭 +𝞭 +𝞭 +δ +δ + +𝞮 +𝞮 +𝞮 +ε +ε + +𝞯 +𝞯 +𝞯 +ζ +ζ + +𝞰 +𝞰 +𝞰 +η +η + +𝞱 +𝞱 +𝞱 +θ +θ + +𝞲 +𝞲 +𝞲 +ι +ι + +𝞳 +𝞳 +𝞳 +κ +κ + +𝞴 +𝞴 +𝞴 +λ +λ + +𝞵 +𝞵 +𝞵 +μ +μ + +𝞶 +𝞶 +𝞶 +ν +ν + +𝞷 +𝞷 +𝞷 +ξ +ξ + +𝞸 +𝞸 +𝞸 +ο +ο + +𝞹 +𝞹 +𝞹 +π +π + +𝞺 +𝞺 +𝞺 +ρ +ρ + +𝞻 +𝞻 +𝞻 +ς +ς + +𝞼 +𝞼 +𝞼 +σ +σ + +𝞽 +𝞽 +𝞽 +τ +τ + +𝞾 +𝞾 +𝞾 +υ +υ + +𝞿 +𝞿 +𝞿 +φ +φ + +𝟀 +𝟀 +𝟀 +χ +χ + +𝟁 +𝟁 +𝟁 +ψ +ψ + +𝟂 +𝟂 +𝟂 +ω +ω + +𝟃 +𝟃 +𝟃 +∂ +∂ + +𝟄 +𝟄 +𝟄 +ε +ε + +𝟅 +𝟅 +𝟅 +θ +θ + +𝟆 +𝟆 +𝟆 +κ +κ + +𝟇 +𝟇 +𝟇 +φ +φ + +𝟈 +𝟈 +𝟈 +ρ +ρ + +𝟉 +𝟉 +𝟉 +π +π + +𝟊 +𝟊 +𝟊 +Ϝ +Ϝ + +𝟋 +𝟋 +𝟋 +ϝ +ϝ + +𝟎 +𝟎 +𝟎 +0 +0 + +𝟏 +𝟏 +𝟏 +1 +1 + +𝟐 +𝟐 +𝟐 +2 +2 + +𝟑 +𝟑 +𝟑 +3 +3 + +𝟒 +𝟒 +𝟒 +4 +4 + +𝟓 +𝟓 +𝟓 +5 +5 + +𝟔 +𝟔 +𝟔 +6 +6 + +𝟕 +𝟕 +𝟕 +7 +7 + +𝟖 +𝟖 +𝟖 +8 +8 + +𝟗 +𝟗 +𝟗 +9 +9 + +𝟘 +𝟘 +𝟘 +0 +0 + +𝟙 +𝟙 +𝟙 +1 +1 + +𝟚 +𝟚 +𝟚 +2 +2 + +𝟛 +𝟛 +𝟛 +3 +3 + +𝟜 +𝟜 +𝟜 +4 +4 + +𝟝 +𝟝 +𝟝 +5 +5 + +𝟞 +𝟞 +𝟞 +6 +6 + +𝟟 +𝟟 +𝟟 +7 +7 + +𝟠 +𝟠 +𝟠 +8 +8 + +𝟡 +𝟡 +𝟡 +9 +9 + +𝟢 +𝟢 +𝟢 +0 +0 + +𝟣 +𝟣 +𝟣 +1 +1 + +𝟤 +𝟤 +𝟤 +2 +2 + +𝟥 +𝟥 +𝟥 +3 +3 + +𝟦 +𝟦 +𝟦 +4 +4 + +𝟧 +𝟧 +𝟧 +5 +5 + +𝟨 +𝟨 +𝟨 +6 +6 + +𝟩 +𝟩 +𝟩 +7 +7 + +𝟪 +𝟪 +𝟪 +8 +8 + +𝟫 +𝟫 +𝟫 +9 +9 + +𝟬 +𝟬 +𝟬 +0 +0 + +𝟭 +𝟭 +𝟭 +1 +1 + +𝟮 +𝟮 +𝟮 +2 +2 + +𝟯 +𝟯 +𝟯 +3 +3 + +𝟰 +𝟰 +𝟰 +4 +4 + +𝟱 +𝟱 +𝟱 +5 +5 + +𝟲 +𝟲 +𝟲 +6 +6 + +𝟳 +𝟳 +𝟳 +7 +7 + +𝟴 +𝟴 +𝟴 +8 +8 + +𝟵 +𝟵 +𝟵 +9 +9 + +𝟶 +𝟶 +𝟶 +0 +0 + +𝟷 +𝟷 +𝟷 +1 +1 + +𝟸 +𝟸 +𝟸 +2 +2 + +𝟹 +𝟹 +𝟹 +3 +3 + +𝟺 +𝟺 +𝟺 +4 +4 + +𝟻 +𝟻 +𝟻 +5 +5 + +𝟼 +𝟼 +𝟼 +6 +6 + +𝟽 +𝟽 +𝟽 +7 +7 + +𝟾 +𝟾 +𝟾 +8 +8 + +𝟿 +𝟿 +𝟿 +9 +9 + +𞸀 +𞸀 +𞸀 +ا +ا + +𞸁 +𞸁 +𞸁 +ب +ب + +𞸂 +𞸂 +𞸂 +ج +ج + +𞸃 +𞸃 +𞸃 +د +د + +𞸅 +𞸅 +𞸅 +و +و + +𞸆 +𞸆 +𞸆 +ز +ز + +𞸇 +𞸇 +𞸇 +ح +ح + +𞸈 +𞸈 +𞸈 +ط +ط + +𞸉 +𞸉 +𞸉 +ي +ي + +𞸊 +𞸊 +𞸊 +ك +ك + +𞸋 +𞸋 +𞸋 +ل +ل + +𞸌 +𞸌 +𞸌 +م +م + +𞸍 +𞸍 +𞸍 +ن +ن + +𞸎 +𞸎 +𞸎 +س +س + +𞸏 +𞸏 +𞸏 +ع +ع + +𞸐 +𞸐 +𞸐 +ف +ف + +𞸑 +𞸑 +𞸑 +ص +ص + +𞸒 +𞸒 +𞸒 +ق +ق + +𞸓 +𞸓 +𞸓 +ر +ر + +𞸔 +𞸔 +𞸔 +ش +ش + +𞸕 +𞸕 +𞸕 +ت +ت + +𞸖 +𞸖 +𞸖 +ث +ث + +𞸗 +𞸗 +𞸗 +خ +خ + +𞸘 +𞸘 +𞸘 +ذ +ذ + +𞸙 +𞸙 +𞸙 +ض +ض + +𞸚 +𞸚 +𞸚 +ظ +ظ + +𞸛 +𞸛 +𞸛 +غ +غ + +𞸜 +𞸜 +𞸜 +ٮ +ٮ + +𞸝 +𞸝 +𞸝 +ں +ں + +𞸞 +𞸞 +𞸞 +ڡ +ڡ + +𞸟 +𞸟 +𞸟 +ٯ +ٯ + +𞸡 +𞸡 +𞸡 +ب +ب + +𞸢 +𞸢 +𞸢 +ج +ج + +𞸤 +𞸤 +𞸤 +ه +ه + +𞸧 +𞸧 +𞸧 +ح +ح + +𞸩 +𞸩 +𞸩 +ي +ي + +𞸪 +𞸪 +𞸪 +ك +ك + +𞸫 +𞸫 +𞸫 +ل +ل + +𞸬 +𞸬 +𞸬 +م +م + +𞸭 +𞸭 +𞸭 +ن +ن + +𞸮 +𞸮 +𞸮 +س +س + +𞸯 +𞸯 +𞸯 +ع +ع + +𞸰 +𞸰 +𞸰 +ف +ف + +𞸱 +𞸱 +𞸱 +ص +ص + +𞸲 +𞸲 +𞸲 +ق +ق + +𞸴 +𞸴 +𞸴 +ش +ش + +𞸵 +𞸵 +𞸵 +ت +ت + +𞸶 +𞸶 +𞸶 +ث +ث + +𞸷 +𞸷 +𞸷 +خ +خ + +𞸹 +𞸹 +𞸹 +ض +ض + +𞸻 +𞸻 +𞸻 +غ +غ + +𞹂 +𞹂 +𞹂 +ج +ج + +𞹇 +𞹇 +𞹇 +ح +ح + +𞹉 +𞹉 +𞹉 +ي +ي + +𞹋 +𞹋 +𞹋 +ل +ل + +𞹍 +𞹍 +𞹍 +ن +ن + +𞹎 +𞹎 +𞹎 +س +س + +𞹏 +𞹏 +𞹏 +ع +ع + +𞹑 +𞹑 +𞹑 +ص +ص + +𞹒 +𞹒 +𞹒 +ق +ق + +𞹔 +𞹔 +𞹔 +ش +ش + +𞹗 +𞹗 +𞹗 +خ +خ + +𞹙 +𞹙 +𞹙 +ض +ض + +𞹛 +𞹛 +𞹛 +غ +غ + +𞹝 +𞹝 +𞹝 +ں +ں + +𞹟 +𞹟 +𞹟 +ٯ +ٯ + +𞹡 +𞹡 +𞹡 +ب +ب + +𞹢 +𞹢 +𞹢 +ج +ج + +𞹤 +𞹤 +𞹤 +ه +ه + +𞹧 +𞹧 +𞹧 +ح +ح + +𞹨 +𞹨 +𞹨 +ط +ط + +𞹩 +𞹩 +𞹩 +ي +ي + +𞹪 +𞹪 +𞹪 +ك +ك + +𞹬 +𞹬 +𞹬 +م +م + +𞹭 +𞹭 +𞹭 +ن +ن + +𞹮 +𞹮 +𞹮 +س +س + +𞹯 +𞹯 +𞹯 +ع +ع + +𞹰 +𞹰 +𞹰 +ف +ف + +𞹱 +𞹱 +𞹱 +ص +ص + +𞹲 +𞹲 +𞹲 +ق +ق + +𞹴 +𞹴 +𞹴 +ش +ش + +𞹵 +𞹵 +𞹵 +ت +ت + +𞹶 +𞹶 +𞹶 +ث +ث + +𞹷 +𞹷 +𞹷 +خ +خ + +𞹹 +𞹹 +𞹹 +ض +ض + +𞹺 +𞹺 +𞹺 +ظ +ظ + +𞹻 +𞹻 +𞹻 +غ +غ + +𞹼 +𞹼 +𞹼 +ٮ +ٮ + +𞹾 +𞹾 +𞹾 +ڡ +ڡ + +𞺀 +𞺀 +𞺀 +ا +ا + +𞺁 +𞺁 +𞺁 +ب +ب + +𞺂 +𞺂 +𞺂 +ج +ج + +𞺃 +𞺃 +𞺃 +د +د + +𞺄 +𞺄 +𞺄 +ه +ه + +𞺅 +𞺅 +𞺅 +و +و + +𞺆 +𞺆 +𞺆 +ز +ز + +𞺇 +𞺇 +𞺇 +ح +ح + +𞺈 +𞺈 +𞺈 +ط +ط + +𞺉 +𞺉 +𞺉 +ي +ي + +𞺋 +𞺋 +𞺋 +ل +ل + +𞺌 +𞺌 +𞺌 +م +م + +𞺍 +𞺍 +𞺍 +ن +ن + +𞺎 +𞺎 +𞺎 +س +س + +𞺏 +𞺏 +𞺏 +ع +ع + +𞺐 +𞺐 +𞺐 +ف +ف + +𞺑 +𞺑 +𞺑 +ص +ص + +𞺒 +𞺒 +𞺒 +ق +ق + +𞺓 +𞺓 +𞺓 +ر +ر + +𞺔 +𞺔 +𞺔 +ش +ش + +𞺕 +𞺕 +𞺕 +ت +ت + +𞺖 +𞺖 +𞺖 +ث +ث + +𞺗 +𞺗 +𞺗 +خ +خ + +𞺘 +𞺘 +𞺘 +ذ +ذ + +𞺙 +𞺙 +𞺙 +ض +ض + +𞺚 +𞺚 +𞺚 +ظ +ظ + +𞺛 +𞺛 +𞺛 +غ +غ + +𞺡 +𞺡 +𞺡 +ب +ب + +𞺢 +𞺢 +𞺢 +ج +ج + +𞺣 +𞺣 +𞺣 +د +د + +𞺥 +𞺥 +𞺥 +و +و + +𞺦 +𞺦 +𞺦 +ز +ز + +𞺧 +𞺧 +𞺧 +ح +ح + +𞺨 +𞺨 +𞺨 +ط +ط + +𞺩 +𞺩 +𞺩 +ي +ي + +𞺫 +𞺫 +𞺫 +ل +ل + +𞺬 +𞺬 +𞺬 +م +م + +𞺭 +𞺭 +𞺭 +ن +ن + +𞺮 +𞺮 +𞺮 +س +س + +𞺯 +𞺯 +𞺯 +ع +ع + +𞺰 +𞺰 +𞺰 +ف +ف + +𞺱 +𞺱 +𞺱 +ص +ص + +𞺲 +𞺲 +𞺲 +ق +ق + +𞺳 +𞺳 +𞺳 +ر +ر + +𞺴 +𞺴 +𞺴 +ش +ش + +𞺵 +𞺵 +𞺵 +ت +ت + +𞺶 +𞺶 +𞺶 +ث +ث + +𞺷 +𞺷 +𞺷 +خ +خ + +𞺸 +𞺸 +𞺸 +ذ +ذ + +𞺹 +𞺹 +𞺹 +ض +ض + +𞺺 +𞺺 +𞺺 +ظ +ظ + +𞺻 +𞺻 +𞺻 +غ +غ + +🄀 +🄀 +🄀 +0. +0. + +🄁 +🄁 +🄁 +0, +0, + +🄂 +🄂 +🄂 +1, +1, + +🄃 +🄃 +🄃 +2, +2, + +🄄 +🄄 +🄄 +3, +3, + +🄅 +🄅 +🄅 +4, +4, + +🄆 +🄆 +🄆 +5, +5, + +🄇 +🄇 +🄇 +6, +6, + +🄈 +🄈 +🄈 +7, +7, + +🄉 +🄉 +🄉 +8, +8, + +🄊 +🄊 +🄊 +9, +9, + +🄐 +🄐 +🄐 +(A) +(A) + +🄑 +🄑 +🄑 +(B) +(B) + +🄒 +🄒 +🄒 +(C) +(C) + +🄓 +🄓 +🄓 +(D) +(D) + +🄔 +🄔 +🄔 +(E) +(E) + +🄕 +🄕 +🄕 +(F) +(F) + +🄖 +🄖 +🄖 +(G) +(G) + +🄗 +🄗 +🄗 +(H) +(H) + +🄘 +🄘 +🄘 +(I) +(I) + +🄙 +🄙 +🄙 +(J) +(J) + +🄚 +🄚 +🄚 +(K) +(K) + +🄛 +🄛 +🄛 +(L) +(L) + +🄜 +🄜 +🄜 +(M) +(M) + +🄝 +🄝 +🄝 +(N) +(N) + +🄞 +🄞 +🄞 +(O) +(O) + +🄟 +🄟 +🄟 +(P) +(P) + +🄠 +🄠 +🄠 +(Q) +(Q) + +🄡 +🄡 +🄡 +(R) +(R) + +🄢 +🄢 +🄢 +(S) +(S) + +🄣 +🄣 +🄣 +(T) +(T) + +🄤 +🄤 +🄤 +(U) +(U) + +🄥 +🄥 +🄥 +(V) +(V) + +🄦 +🄦 +🄦 +(W) +(W) + +🄧 +🄧 +🄧 +(X) +(X) + +🄨 +🄨 +🄨 +(Y) +(Y) + +🄩 +🄩 +🄩 +(Z) +(Z) + +🄪 +🄪 +🄪 +〔S〕 +〔S〕 + +🄫 +🄫 +🄫 +C +C + +🄬 +🄬 +🄬 +R +R + +🄭 +🄭 +🄭 +CD +CD + +🄮 +🄮 +🄮 +WZ +WZ + +🄰 +🄰 +🄰 +A +A + +🄱 +🄱 +🄱 +B +B + +🄲 +🄲 +🄲 +C +C + +🄳 +🄳 +🄳 +D +D + +🄴 +🄴 +🄴 +E +E + +🄵 +🄵 +🄵 +F +F + +🄶 +🄶 +🄶 +G +G + +🄷 +🄷 +🄷 +H +H + +🄸 +🄸 +🄸 +I +I + +🄹 +🄹 +🄹 +J +J + +🄺 +🄺 +🄺 +K +K + +🄻 +🄻 +🄻 +L +L + +🄼 +🄼 +🄼 +M +M + +🄽 +🄽 +🄽 +N +N + +🄾 +🄾 +🄾 +O +O + +🄿 +🄿 +🄿 +P +P + +🅀 +🅀 +🅀 +Q +Q + +🅁 +🅁 +🅁 +R +R + +🅂 +🅂 +🅂 +S +S + +🅃 +🅃 +🅃 +T +T + +🅄 +🅄 +🅄 +U +U + +🅅 +🅅 +🅅 +V +V + +🅆 +🅆 +🅆 +W +W + +🅇 +🅇 +🅇 +X +X + +🅈 +🅈 +🅈 +Y +Y + +🅉 +🅉 +🅉 +Z +Z + +🅊 +🅊 +🅊 +HV +HV + +🅋 +🅋 +🅋 +MV +MV + +🅌 +🅌 +🅌 +SD +SD + +🅍 +🅍 +🅍 +SS +SS + +🅎 +🅎 +🅎 +PPV +PPV + +🅏 +🅏 +🅏 +WC +WC + +🅪 +🅪 +🅪 +MC +MC + +🅫 +🅫 +🅫 +MD +MD + +🆐 +🆐 +🆐 +DJ +DJ + +🈀 +🈀 +🈀 +ほか +ほか + +🈁 +🈁 +🈁 +ココ +ココ + +🈂 +🈂 +🈂 +サ +サ + +🈐 +🈐 +🈐 +手 +手 + +🈑 +🈑 +🈑 +字 +字 + +🈒 +🈒 +🈒 +双 +双 + +🈓 +🈓 +🈓 +デ +デ + +🈔 +🈔 +🈔 +二 +二 + +🈕 +🈕 +🈕 +多 +多 + +🈖 +🈖 +🈖 +解 +解 + +🈗 +🈗 +🈗 +天 +天 + +🈘 +🈘 +🈘 +交 +交 + +🈙 +🈙 +🈙 +映 +映 + +🈚 +🈚 +🈚 +無 +無 + +🈛 +🈛 +🈛 +料 +料 + +🈜 +🈜 +🈜 +前 +前 + +🈝 +🈝 +🈝 +後 +後 + +🈞 +🈞 +🈞 +再 +再 + +🈟 +🈟 +🈟 +新 +新 + +🈠 +🈠 +🈠 +初 +初 + +🈡 +🈡 +🈡 +終 +終 + +🈢 +🈢 +🈢 +生 +生 + +🈣 +🈣 +🈣 +販 +販 + +🈤 +🈤 +🈤 +声 +声 + +🈥 +🈥 +🈥 +吹 +吹 + +🈦 +🈦 +🈦 +演 +演 + +🈧 +🈧 +🈧 +投 +投 + +🈨 +🈨 +🈨 +捕 +捕 + +🈩 +🈩 +🈩 +一 +一 + +🈪 +🈪 +🈪 +三 +三 + +🈫 +🈫 +🈫 +遊 +遊 + +🈬 +🈬 +🈬 +左 +左 + +🈭 +🈭 +🈭 +中 +中 + +🈮 +🈮 +🈮 +右 +右 + +🈯 +🈯 +🈯 +指 +指 + +🈰 +🈰 +🈰 +走 +走 + +🈱 +🈱 +🈱 +打 +打 + +🈲 +🈲 +🈲 +禁 +禁 + +🈳 +🈳 +🈳 +空 +空 + +🈴 +🈴 +🈴 +合 +合 + +🈵 +🈵 +🈵 +満 +満 + +🈶 +🈶 +🈶 +有 +有 + +🈷 +🈷 +🈷 +月 +月 + +🈸 +🈸 +🈸 +申 +申 + +🈹 +🈹 +🈹 +割 +割 + +🈺 +🈺 +🈺 +営 +営 + +🈻 +🈻 +🈻 +配 +配 + +🉀 +🉀 +🉀 +〔本〕 +〔本〕 + +🉁 +🉁 +🉁 +〔三〕 +〔三〕 + +🉂 +🉂 +🉂 +〔二〕 +〔二〕 + +🉃 +🉃 +🉃 +〔安〕 +〔安〕 + +🉄 +🉄 +🉄 +〔点〕 +〔点〕 + +🉅 +🉅 +🉅 +〔打〕 +〔打〕 + +🉆 +🉆 +🉆 +〔盗〕 +〔盗〕 + +🉇 +🉇 +🉇 +〔勝〕 +〔勝〕 + +🉈 +🉈 +🉈 +〔敗〕 +〔敗〕 + +🉐 +🉐 +🉐 +得 +得 + +🉑 +🉑 +🉑 +可 +可 + +丽 +丽 +丽 +丽 +丽 + +丸 +丸 +丸 +丸 +丸 + +乁 +乁 +乁 +乁 +乁 + +𠄢 +𠄢 +𠄢 +𠄢 +𠄢 + +你 +你 +你 +你 +你 + +侮 +侮 +侮 +侮 +侮 + +侻 +侻 +侻 +侻 +侻 + +倂 +倂 +倂 +倂 +倂 + +偺 +偺 +偺 +偺 +偺 + +備 +備 +備 +備 +備 + +僧 +僧 +僧 +僧 +僧 + +像 +像 +像 +像 +像 + +㒞 +㒞 +㒞 +㒞 +㒞 + +𠘺 +𠘺 +𠘺 +𠘺 +𠘺 + +免 +免 +免 +免 +免 + +兔 +兔 +兔 +兔 +兔 + +兤 +兤 +兤 +兤 +兤 + +具 +具 +具 +具 +具 + +𠔜 +𠔜 +𠔜 +𠔜 +𠔜 + +㒹 +㒹 +㒹 +㒹 +㒹 + +內 +內 +內 +內 +內 + +再 +再 +再 +再 +再 + +𠕋 +𠕋 +𠕋 +𠕋 +𠕋 + +冗 +冗 +冗 +冗 +冗 + +冤 +冤 +冤 +冤 +冤 + +仌 +仌 +仌 +仌 +仌 + +冬 +冬 +冬 +冬 +冬 + +况 +况 +况 +况 +况 + +𩇟 +𩇟 +𩇟 +𩇟 +𩇟 + +凵 +凵 +凵 +凵 +凵 + +刃 +刃 +刃 +刃 +刃 + +㓟 +㓟 +㓟 +㓟 +㓟 + +刻 +刻 +刻 +刻 +刻 + +剆 +剆 +剆 +剆 +剆 + +割 +割 +割 +割 +割 + +剷 +剷 +剷 +剷 +剷 + +㔕 +㔕 +㔕 +㔕 +㔕 + +勇 +勇 +勇 +勇 +勇 + +勉 +勉 +勉 +勉 +勉 + +勤 +勤 +勤 +勤 +勤 + +勺 +勺 +勺 +勺 +勺 + +包 +包 +包 +包 +包 + +匆 +匆 +匆 +匆 +匆 + +北 +北 +北 +北 +北 + +卉 +卉 +卉 +卉 +卉 + +卑 +卑 +卑 +卑 +卑 + +博 +博 +博 +博 +博 + +即 +即 +即 +即 +即 + +卽 +卽 +卽 +卽 +卽 + +卿 +卿 +卿 +卿 +卿 + +卿 +卿 +卿 +卿 +卿 + +卿 +卿 +卿 +卿 +卿 + +𠨬 +𠨬 +𠨬 +𠨬 +𠨬 + +灰 +灰 +灰 +灰 +灰 + +及 +及 +及 +及 +及 + +叟 +叟 +叟 +叟 +叟 + +𠭣 +𠭣 +𠭣 +𠭣 +𠭣 + +叫 +叫 +叫 +叫 +叫 + +叱 +叱 +叱 +叱 +叱 + +吆 +吆 +吆 +吆 +吆 + +咞 +咞 +咞 +咞 +咞 + +吸 +吸 +吸 +吸 +吸 + +呈 +呈 +呈 +呈 +呈 + +周 +周 +周 +周 +周 + +咢 +咢 +咢 +咢 +咢 + +哶 +哶 +哶 +哶 +哶 + +唐 +唐 +唐 +唐 +唐 + +啓 +啓 +啓 +啓 +啓 + +啣 +啣 +啣 +啣 +啣 + +善 +善 +善 +善 +善 + +善 +善 +善 +善 +善 + +喙 +喙 +喙 +喙 +喙 + +喫 +喫 +喫 +喫 +喫 + +喳 +喳 +喳 +喳 +喳 + +嗂 +嗂 +嗂 +嗂 +嗂 + +圖 +圖 +圖 +圖 +圖 + +嘆 +嘆 +嘆 +嘆 +嘆 + +圗 +圗 +圗 +圗 +圗 + +噑 +噑 +噑 +噑 +噑 + +噴 +噴 +噴 +噴 +噴 + +切 +切 +切 +切 +切 + +壮 +壮 +壮 +壮 +壮 + +城 +城 +城 +城 +城 + +埴 +埴 +埴 +埴 +埴 + +堍 +堍 +堍 +堍 +堍 + +型 +型 +型 +型 +型 + +堲 +堲 +堲 +堲 +堲 + +報 +報 +報 +報 +報 + +墬 +墬 +墬 +墬 +墬 + +𡓤 +𡓤 +𡓤 +𡓤 +𡓤 + +売 +売 +売 +売 +売 + +壷 +壷 +壷 +壷 +壷 + +夆 +夆 +夆 +夆 +夆 + +多 +多 +多 +多 +多 + +夢 +夢 +夢 +夢 +夢 + +奢 +奢 +奢 +奢 +奢 + +𡚨 +𡚨 +𡚨 +𡚨 +𡚨 + +𡛪 +𡛪 +𡛪 +𡛪 +𡛪 + +姬 +姬 +姬 +姬 +姬 + +娛 +娛 +娛 +娛 +娛 + +娧 +娧 +娧 +娧 +娧 + +姘 +姘 +姘 +姘 +姘 + +婦 +婦 +婦 +婦 +婦 + +㛮 +㛮 +㛮 +㛮 +㛮 + +㛼 +㛼 +㛼 +㛼 +㛼 + +嬈 +嬈 +嬈 +嬈 +嬈 + +嬾 +嬾 +嬾 +嬾 +嬾 + +嬾 +嬾 +嬾 +嬾 +嬾 + +𡧈 +𡧈 +𡧈 +𡧈 +𡧈 + +寃 +寃 +寃 +寃 +寃 + +寘 +寘 +寘 +寘 +寘 + +寧 +寧 +寧 +寧 +寧 + +寳 +寳 +寳 +寳 +寳 + +𡬘 +𡬘 +𡬘 +𡬘 +𡬘 + +寿 +寿 +寿 +寿 +寿 + +将 +将 +将 +将 +将 + +当 +当 +当 +当 +当 + +尢 +尢 +尢 +尢 +尢 + +㞁 +㞁 +㞁 +㞁 +㞁 + +屠 +屠 +屠 +屠 +屠 + +屮 +屮 +屮 +屮 +屮 + +峀 +峀 +峀 +峀 +峀 + +岍 +岍 +岍 +岍 +岍 + +𡷤 +𡷤 +𡷤 +𡷤 +𡷤 + +嵃 +嵃 +嵃 +嵃 +嵃 + +𡷦 +𡷦 +𡷦 +𡷦 +𡷦 + +嵮 +嵮 +嵮 +嵮 +嵮 + +嵫 +嵫 +嵫 +嵫 +嵫 + +嵼 +嵼 +嵼 +嵼 +嵼 + +巡 +巡 +巡 +巡 +巡 + +巢 +巢 +巢 +巢 +巢 + +㠯 +㠯 +㠯 +㠯 +㠯 + +巽 +巽 +巽 +巽 +巽 + +帨 +帨 +帨 +帨 +帨 + +帽 +帽 +帽 +帽 +帽 + +幩 +幩 +幩 +幩 +幩 + +㡢 +㡢 +㡢 +㡢 +㡢 + +𢆃 +𢆃 +𢆃 +𢆃 +𢆃 + +㡼 +㡼 +㡼 +㡼 +㡼 + +庰 +庰 +庰 +庰 +庰 + +庳 +庳 +庳 +庳 +庳 + +庶 +庶 +庶 +庶 +庶 + +廊 +廊 +廊 +廊 +廊 + +𪎒 +𪎒 +𪎒 +𪎒 +𪎒 + +廾 +廾 +廾 +廾 +廾 + +𢌱 +𢌱 +𢌱 +𢌱 +𢌱 + +𢌱 +𢌱 +𢌱 +𢌱 +𢌱 + +舁 +舁 +舁 +舁 +舁 + +弢 +弢 +弢 +弢 +弢 + +弢 +弢 +弢 +弢 +弢 + +㣇 +㣇 +㣇 +㣇 +㣇 + +𣊸 +𣊸 +𣊸 +𣊸 +𣊸 + +𦇚 +𦇚 +𦇚 +𦇚 +𦇚 + +形 +形 +形 +形 +形 + +彫 +彫 +彫 +彫 +彫 + +㣣 +㣣 +㣣 +㣣 +㣣 + +徚 +徚 +徚 +徚 +徚 + +忍 +忍 +忍 +忍 +忍 + +志 +志 +志 +志 +志 + +忹 +忹 +忹 +忹 +忹 + +悁 +悁 +悁 +悁 +悁 + +㤺 +㤺 +㤺 +㤺 +㤺 + +㤜 +㤜 +㤜 +㤜 +㤜 + +悔 +悔 +悔 +悔 +悔 + +𢛔 +𢛔 +𢛔 +𢛔 +𢛔 + +惇 +惇 +惇 +惇 +惇 + +慈 +慈 +慈 +慈 +慈 + +慌 +慌 +慌 +慌 +慌 + +慎 +慎 +慎 +慎 +慎 + +慌 +慌 +慌 +慌 +慌 + +慺 +慺 +慺 +慺 +慺 + +憎 +憎 +憎 +憎 +憎 + +憲 +憲 +憲 +憲 +憲 + +憤 +憤 +憤 +憤 +憤 + +憯 +憯 +憯 +憯 +憯 + +懞 +懞 +懞 +懞 +懞 + +懲 +懲 +懲 +懲 +懲 + +懶 +懶 +懶 +懶 +懶 + +成 +成 +成 +成 +成 + +戛 +戛 +戛 +戛 +戛 + +扝 +扝 +扝 +扝 +扝 + +抱 +抱 +抱 +抱 +抱 + +拔 +拔 +拔 +拔 +拔 + +捐 +捐 +捐 +捐 +捐 + +𢬌 +𢬌 +𢬌 +𢬌 +𢬌 + +挽 +挽 +挽 +挽 +挽 + +拼 +拼 +拼 +拼 +拼 + +捨 +捨 +捨 +捨 +捨 + +掃 +掃 +掃 +掃 +掃 + +揤 +揤 +揤 +揤 +揤 + +𢯱 +𢯱 +𢯱 +𢯱 +𢯱 + +搢 +搢 +搢 +搢 +搢 + +揅 +揅 +揅 +揅 +揅 + +掩 +掩 +掩 +掩 +掩 + +㨮 +㨮 +㨮 +㨮 +㨮 + +摩 +摩 +摩 +摩 +摩 + +摾 +摾 +摾 +摾 +摾 + +撝 +撝 +撝 +撝 +撝 + +摷 +摷 +摷 +摷 +摷 + +㩬 +㩬 +㩬 +㩬 +㩬 + +敏 +敏 +敏 +敏 +敏 + +敬 +敬 +敬 +敬 +敬 + +𣀊 +𣀊 +𣀊 +𣀊 +𣀊 + +旣 +旣 +旣 +旣 +旣 + +書 +書 +書 +書 +書 + +晉 +晉 +晉 +晉 +晉 + +㬙 +㬙 +㬙 +㬙 +㬙 + +暑 +暑 +暑 +暑 +暑 + +㬈 +㬈 +㬈 +㬈 +㬈 + +㫤 +㫤 +㫤 +㫤 +㫤 + +冒 +冒 +冒 +冒 +冒 + +冕 +冕 +冕 +冕 +冕 + +最 +最 +最 +最 +最 + +暜 +暜 +暜 +暜 +暜 + +肭 +肭 +肭 +肭 +肭 + +䏙 +䏙 +䏙 +䏙 +䏙 + +朗 +朗 +朗 +朗 +朗 + +望 +望 +望 +望 +望 + +朡 +朡 +朡 +朡 +朡 + +杞 +杞 +杞 +杞 +杞 + +杓 +杓 +杓 +杓 +杓 + +𣏃 +𣏃 +𣏃 +𣏃 +𣏃 + +㭉 +㭉 +㭉 +㭉 +㭉 + +柺 +柺 +柺 +柺 +柺 + +枅 +枅 +枅 +枅 +枅 + +桒 +桒 +桒 +桒 +桒 + +梅 +梅 +梅 +梅 +梅 + +𣑭 +𣑭 +𣑭 +𣑭 +𣑭 + +梎 +梎 +梎 +梎 +梎 + +栟 +栟 +栟 +栟 +栟 + +椔 +椔 +椔 +椔 +椔 + +㮝 +㮝 +㮝 +㮝 +㮝 + +楂 +楂 +楂 +楂 +楂 + +榣 +榣 +榣 +榣 +榣 + +槪 +槪 +槪 +槪 +槪 + +檨 +檨 +檨 +檨 +檨 + +𣚣 +𣚣 +𣚣 +𣚣 +𣚣 + +櫛 +櫛 +櫛 +櫛 +櫛 + +㰘 +㰘 +㰘 +㰘 +㰘 + +次 +次 +次 +次 +次 + +𣢧 +𣢧 +𣢧 +𣢧 +𣢧 + +歔 +歔 +歔 +歔 +歔 + +㱎 +㱎 +㱎 +㱎 +㱎 + +歲 +歲 +歲 +歲 +歲 + +殟 +殟 +殟 +殟 +殟 + +殺 +殺 +殺 +殺 +殺 + +殻 +殻 +殻 +殻 +殻 + +𣪍 +𣪍 +𣪍 +𣪍 +𣪍 + +𡴋 +𡴋 +𡴋 +𡴋 +𡴋 + +𣫺 +𣫺 +𣫺 +𣫺 +𣫺 + +汎 +汎 +汎 +汎 +汎 + +𣲼 +𣲼 +𣲼 +𣲼 +𣲼 + +沿 +沿 +沿 +沿 +沿 + +泍 +泍 +泍 +泍 +泍 + +汧 +汧 +汧 +汧 +汧 + +洖 +洖 +洖 +洖 +洖 + +派 +派 +派 +派 +派 + +海 +海 +海 +海 +海 + +流 +流 +流 +流 +流 + +浩 +浩 +浩 +浩 +浩 + +浸 +浸 +浸 +浸 +浸 + +涅 +涅 +涅 +涅 +涅 + +𣴞 +𣴞 +𣴞 +𣴞 +𣴞 + +洴 +洴 +洴 +洴 +洴 + +港 +港 +港 +港 +港 + +湮 +湮 +湮 +湮 +湮 + +㴳 +㴳 +㴳 +㴳 +㴳 + +滋 +滋 +滋 +滋 +滋 + +滇 +滇 +滇 +滇 +滇 + +𣻑 +𣻑 +𣻑 +𣻑 +𣻑 + +淹 +淹 +淹 +淹 +淹 + +潮 +潮 +潮 +潮 +潮 + +𣽞 +𣽞 +𣽞 +𣽞 +𣽞 + +𣾎 +𣾎 +𣾎 +𣾎 +𣾎 + +濆 +濆 +濆 +濆 +濆 + +瀹 +瀹 +瀹 +瀹 +瀹 + +瀞 +瀞 +瀞 +瀞 +瀞 + +瀛 +瀛 +瀛 +瀛 +瀛 + +㶖 +㶖 +㶖 +㶖 +㶖 + +灊 +灊 +灊 +灊 +灊 + +災 +災 +災 +災 +災 + +灷 +灷 +灷 +灷 +灷 + +炭 +炭 +炭 +炭 +炭 + +𠔥 +𠔥 +𠔥 +𠔥 +𠔥 + +煅 +煅 +煅 +煅 +煅 + +𤉣 +𤉣 +𤉣 +𤉣 +𤉣 + +熜 +熜 +熜 +熜 +熜 + +𤎫 +𤎫 +𤎫 +𤎫 +𤎫 + +爨 +爨 +爨 +爨 +爨 + +爵 +爵 +爵 +爵 +爵 + +牐 +牐 +牐 +牐 +牐 + +𤘈 +𤘈 +𤘈 +𤘈 +𤘈 + +犀 +犀 +犀 +犀 +犀 + +犕 +犕 +犕 +犕 +犕 + +𤜵 +𤜵 +𤜵 +𤜵 +𤜵 + +𤠔 +𤠔 +𤠔 +𤠔 +𤠔 + +獺 +獺 +獺 +獺 +獺 + +王 +王 +王 +王 +王 + +㺬 +㺬 +㺬 +㺬 +㺬 + +玥 +玥 +玥 +玥 +玥 + +㺸 +㺸 +㺸 +㺸 +㺸 + +㺸 +㺸 +㺸 +㺸 +㺸 + +瑇 +瑇 +瑇 +瑇 +瑇 + +瑜 +瑜 +瑜 +瑜 +瑜 + +瑱 +瑱 +瑱 +瑱 +瑱 + +璅 +璅 +璅 +璅 +璅 + +瓊 +瓊 +瓊 +瓊 +瓊 + +㼛 +㼛 +㼛 +㼛 +㼛 + +甤 +甤 +甤 +甤 +甤 + +𤰶 +𤰶 +𤰶 +𤰶 +𤰶 + +甾 +甾 +甾 +甾 +甾 + +𤲒 +𤲒 +𤲒 +𤲒 +𤲒 + +異 +異 +異 +異 +異 + +𢆟 +𢆟 +𢆟 +𢆟 +𢆟 + +瘐 +瘐 +瘐 +瘐 +瘐 + +𤾡 +𤾡 +𤾡 +𤾡 +𤾡 + +𤾸 +𤾸 +𤾸 +𤾸 +𤾸 + +𥁄 +𥁄 +𥁄 +𥁄 +𥁄 + +㿼 +㿼 +㿼 +㿼 +㿼 + +䀈 +䀈 +䀈 +䀈 +䀈 + +直 +直 +直 +直 +直 + +𥃳 +𥃳 +𥃳 +𥃳 +𥃳 + +𥃲 +𥃲 +𥃲 +𥃲 +𥃲 + +𥄙 +𥄙 +𥄙 +𥄙 +𥄙 + +𥄳 +𥄳 +𥄳 +𥄳 +𥄳 + +眞 +眞 +眞 +眞 +眞 + +真 +真 +真 +真 +真 + +真 +真 +真 +真 +真 + +睊 +睊 +睊 +睊 +睊 + +䀹 +䀹 +䀹 +䀹 +䀹 + +瞋 +瞋 +瞋 +瞋 +瞋 + +䁆 +䁆 +䁆 +䁆 +䁆 + +䂖 +䂖 +䂖 +䂖 +䂖 + +𥐝 +𥐝 +𥐝 +𥐝 +𥐝 + +硎 +硎 +硎 +硎 +硎 + +碌 +碌 +碌 +碌 +碌 + +磌 +磌 +磌 +磌 +磌 + +䃣 +䃣 +䃣 +䃣 +䃣 + +𥘦 +𥘦 +𥘦 +𥘦 +𥘦 + +祖 +祖 +祖 +祖 +祖 + +𥚚 +𥚚 +𥚚 +𥚚 +𥚚 + +𥛅 +𥛅 +𥛅 +𥛅 +𥛅 + +福 +福 +福 +福 +福 + +秫 +秫 +秫 +秫 +秫 + +䄯 +䄯 +䄯 +䄯 +䄯 + +穀 +穀 +穀 +穀 +穀 + +穊 +穊 +穊 +穊 +穊 + +穏 +穏 +穏 +穏 +穏 + +𥥼 +𥥼 +𥥼 +𥥼 +𥥼 + +𥪧 +𥪧 +𥪧 +𥪧 +𥪧 + +𥪧 +𥪧 +𥪧 +𥪧 +𥪧 + +竮 +竮 +竮 +竮 +竮 + +䈂 +䈂 +䈂 +䈂 +䈂 + +𥮫 +𥮫 +𥮫 +𥮫 +𥮫 + +篆 +篆 +篆 +篆 +篆 + +築 +築 +築 +築 +築 + +䈧 +䈧 +䈧 +䈧 +䈧 + +𥲀 +𥲀 +𥲀 +𥲀 +𥲀 + +糒 +糒 +糒 +糒 +糒 + +䊠 +䊠 +䊠 +䊠 +䊠 + +糨 +糨 +糨 +糨 +糨 + +糣 +糣 +糣 +糣 +糣 + +紀 +紀 +紀 +紀 +紀 + +𥾆 +𥾆 +𥾆 +𥾆 +𥾆 + +絣 +絣 +絣 +絣 +絣 + +䌁 +䌁 +䌁 +䌁 +䌁 + +緇 +緇 +緇 +緇 +緇 + +縂 +縂 +縂 +縂 +縂 + +繅 +繅 +繅 +繅 +繅 + +䌴 +䌴 +䌴 +䌴 +䌴 + +𦈨 +𦈨 +𦈨 +𦈨 +𦈨 + +𦉇 +𦉇 +𦉇 +𦉇 +𦉇 + +䍙 +䍙 +䍙 +䍙 +䍙 + +𦋙 +𦋙 +𦋙 +𦋙 +𦋙 + +罺 +罺 +罺 +罺 +罺 + +𦌾 +𦌾 +𦌾 +𦌾 +𦌾 + +羕 +羕 +羕 +羕 +羕 + +翺 +翺 +翺 +翺 +翺 + +者 +者 +者 +者 +者 + +𦓚 +𦓚 +𦓚 +𦓚 +𦓚 + +𦔣 +𦔣 +𦔣 +𦔣 +𦔣 + +聠 +聠 +聠 +聠 +聠 + +𦖨 +𦖨 +𦖨 +𦖨 +𦖨 + +聰 +聰 +聰 +聰 +聰 + +𣍟 +𣍟 +𣍟 +𣍟 +𣍟 + +䏕 +䏕 +䏕 +䏕 +䏕 + +育 +育 +育 +育 +育 + +脃 +脃 +脃 +脃 +脃 + +䐋 +䐋 +䐋 +䐋 +䐋 + +脾 +脾 +脾 +脾 +脾 + +媵 +媵 +媵 +媵 +媵 + +𦞧 +𦞧 +𦞧 +𦞧 +𦞧 + +𦞵 +𦞵 +𦞵 +𦞵 +𦞵 + +𣎓 +𣎓 +𣎓 +𣎓 +𣎓 + +𣎜 +𣎜 +𣎜 +𣎜 +𣎜 + +舁 +舁 +舁 +舁 +舁 + +舄 +舄 +舄 +舄 +舄 + +辞 +辞 +辞 +辞 +辞 + +䑫 +䑫 +䑫 +䑫 +䑫 + +芑 +芑 +芑 +芑 +芑 + +芋 +芋 +芋 +芋 +芋 + +芝 +芝 +芝 +芝 +芝 + +劳 +劳 +劳 +劳 +劳 + +花 +花 +花 +花 +花 + +芳 +芳 +芳 +芳 +芳 + +芽 +芽 +芽 +芽 +芽 + +苦 +苦 +苦 +苦 +苦 + +𦬼 +𦬼 +𦬼 +𦬼 +𦬼 + +若 +若 +若 +若 +若 + +茝 +茝 +茝 +茝 +茝 + +荣 +荣 +荣 +荣 +荣 + +莭 +莭 +莭 +莭 +莭 + +茣 +茣 +茣 +茣 +茣 + +莽 +莽 +莽 +莽 +莽 + +菧 +菧 +菧 +菧 +菧 + +著 +著 +著 +著 +著 + +荓 +荓 +荓 +荓 +荓 + +菊 +菊 +菊 +菊 +菊 + +菌 +菌 +菌 +菌 +菌 + +菜 +菜 +菜 +菜 +菜 + +𦰶 +𦰶 +𦰶 +𦰶 +𦰶 + +𦵫 +𦵫 +𦵫 +𦵫 +𦵫 + +𦳕 +𦳕 +𦳕 +𦳕 +𦳕 + +䔫 +䔫 +䔫 +䔫 +䔫 + +蓱 +蓱 +蓱 +蓱 +蓱 + +蓳 +蓳 +蓳 +蓳 +蓳 + +蔖 +蔖 +蔖 +蔖 +蔖 + +𧏊 +𧏊 +𧏊 +𧏊 +𧏊 + +蕤 +蕤 +蕤 +蕤 +蕤 + +𦼬 +𦼬 +𦼬 +𦼬 +𦼬 + +䕝 +䕝 +䕝 +䕝 +䕝 + +䕡 +䕡 +䕡 +䕡 +䕡 + +𦾱 +𦾱 +𦾱 +𦾱 +𦾱 + +𧃒 +𧃒 +𧃒 +𧃒 +𧃒 + +䕫 +䕫 +䕫 +䕫 +䕫 + +虐 +虐 +虐 +虐 +虐 + +虜 +虜 +虜 +虜 +虜 + +虧 +虧 +虧 +虧 +虧 + +虩 +虩 +虩 +虩 +虩 + +蚩 +蚩 +蚩 +蚩 +蚩 + +蚈 +蚈 +蚈 +蚈 +蚈 + +蜎 +蜎 +蜎 +蜎 +蜎 + +蛢 +蛢 +蛢 +蛢 +蛢 + +蝹 +蝹 +蝹 +蝹 +蝹 + +蜨 +蜨 +蜨 +蜨 +蜨 + +蝫 +蝫 +蝫 +蝫 +蝫 + +螆 +螆 +螆 +螆 +螆 + +䗗 +䗗 +䗗 +䗗 +䗗 + +蟡 +蟡 +蟡 +蟡 +蟡 + +蠁 +蠁 +蠁 +蠁 +蠁 + +䗹 +䗹 +䗹 +䗹 +䗹 + +衠 +衠 +衠 +衠 +衠 + +衣 +衣 +衣 +衣 +衣 + +𧙧 +𧙧 +𧙧 +𧙧 +𧙧 + +裗 +裗 +裗 +裗 +裗 + +裞 +裞 +裞 +裞 +裞 + +䘵 +䘵 +䘵 +䘵 +䘵 + +裺 +裺 +裺 +裺 +裺 + +㒻 +㒻 +㒻 +㒻 +㒻 + +𧢮 +𧢮 +𧢮 +𧢮 +𧢮 + +𧥦 +𧥦 +𧥦 +𧥦 +𧥦 + +䚾 +䚾 +䚾 +䚾 +䚾 + +䛇 +䛇 +䛇 +䛇 +䛇 + +誠 +誠 +誠 +誠 +誠 + +諭 +諭 +諭 +諭 +諭 + +變 +變 +變 +變 +變 + +豕 +豕 +豕 +豕 +豕 + +𧲨 +𧲨 +𧲨 +𧲨 +𧲨 + +貫 +貫 +貫 +貫 +貫 + +賁 +賁 +賁 +賁 +賁 + +贛 +贛 +贛 +贛 +贛 + +起 +起 +起 +起 +起 + +𧼯 +𧼯 +𧼯 +𧼯 +𧼯 + +𠠄 +𠠄 +𠠄 +𠠄 +𠠄 + +跋 +跋 +跋 +跋 +跋 + +趼 +趼 +趼 +趼 +趼 + +跰 +跰 +跰 +跰 +跰 + +𠣞 +𠣞 +𠣞 +𠣞 +𠣞 + +軔 +軔 +軔 +軔 +軔 + +輸 +輸 +輸 +輸 +輸 + +𨗒 +𨗒 +𨗒 +𨗒 +𨗒 + +𨗭 +𨗭 +𨗭 +𨗭 +𨗭 + +邔 +邔 +邔 +邔 +邔 + +郱 +郱 +郱 +郱 +郱 + +鄑 +鄑 +鄑 +鄑 +鄑 + +𨜮 +𨜮 +𨜮 +𨜮 +𨜮 + +鄛 +鄛 +鄛 +鄛 +鄛 + +鈸 +鈸 +鈸 +鈸 +鈸 + +鋗 +鋗 +鋗 +鋗 +鋗 + +鋘 +鋘 +鋘 +鋘 +鋘 + +鉼 +鉼 +鉼 +鉼 +鉼 + +鏹 +鏹 +鏹 +鏹 +鏹 + +鐕 +鐕 +鐕 +鐕 +鐕 + +𨯺 +𨯺 +𨯺 +𨯺 +𨯺 + +開 +開 +開 +開 +開 + +䦕 +䦕 +䦕 +䦕 +䦕 + +閷 +閷 +閷 +閷 +閷 + +𨵷 +𨵷 +𨵷 +𨵷 +𨵷 + +䧦 +䧦 +䧦 +䧦 +䧦 + +雃 +雃 +雃 +雃 +雃 + +嶲 +嶲 +嶲 +嶲 +嶲 + +霣 +霣 +霣 +霣 +霣 + +𩅅 +𩅅 +𩅅 +𩅅 +𩅅 + +𩈚 +𩈚 +𩈚 +𩈚 +𩈚 + +䩮 +䩮 +䩮 +䩮 +䩮 + +䩶 +䩶 +䩶 +䩶 +䩶 + +韠 +韠 +韠 +韠 +韠 + +𩐊 +𩐊 +𩐊 +𩐊 +𩐊 + +䪲 +䪲 +䪲 +䪲 +䪲 + +𩒖 +𩒖 +𩒖 +𩒖 +𩒖 + +頋 +頋 +頋 +頋 +頋 + +頋 +頋 +頋 +頋 +頋 + +頩 +頩 +頩 +頩 +頩 + +𩖶 +𩖶 +𩖶 +𩖶 +𩖶 + +飢 +飢 +飢 +飢 +飢 + +䬳 +䬳 +䬳 +䬳 +䬳 + +餩 +餩 +餩 +餩 +餩 + +馧 +馧 +馧 +馧 +馧 + +駂 +駂 +駂 +駂 +駂 + +駾 +駾 +駾 +駾 +駾 + +䯎 +䯎 +䯎 +䯎 +䯎 + +𩬰 +𩬰 +𩬰 +𩬰 +𩬰 + +鬒 +鬒 +鬒 +鬒 +鬒 + +鱀 +鱀 +鱀 +鱀 +鱀 + +鳽 +鳽 +鳽 +鳽 +鳽 + +䳎 +䳎 +䳎 +䳎 +䳎 + +䳭 +䳭 +䳭 +䳭 +䳭 + +鵧 +鵧 +鵧 +鵧 +鵧 + +𪃎 +𪃎 +𪃎 +𪃎 +𪃎 + +䳸 +䳸 +䳸 +䳸 +䳸 + +𪄅 +𪄅 +𪄅 +𪄅 +𪄅 + +𪈎 +𪈎 +𪈎 +𪈎 +𪈎 + +𪊑 +𪊑 +𪊑 +𪊑 +𪊑 + +麻 +麻 +麻 +麻 +麻 + +䵖 +䵖 +䵖 +䵖 +䵖 + +黹 +黹 +黹 +黹 +黹 + +黾 +黾 +黾 +黾 +黾 + +鼅 +鼅 +鼅 +鼅 +鼅 + +鼏 +鼏 +鼏 +鼏 +鼏 + +鼖 +鼖 +鼖 +鼖 +鼖 + +鼻 +鼻 +鼻 +鼻 +鼻 + +𪘀 +𪘀 +𪘀 +𪘀 +𪘀 + +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b + +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b + +à֮́̕b +à֮́̕b +à֮́̕b +à֮́̕b +à֮́̕b + +á֮̀̕b +á֮̀̕b +á֮̀̕b +á֮̀̕b +á֮̀̕b + +à֮̂̕b +à֮̂̕b +à֮̂̕b +à֮̂̕b +à֮̂̕b + +ầ֮̕b +ầ֮̕b +ầ֮̕b +ầ֮̕b +ầ֮̕b + +à֮̃̕b +à֮̃̕b +à֮̃̕b +à֮̃̕b +à֮̃̕b + +ã֮̀̕b +ã֮̀̕b +ã֮̀̕b +ã֮̀̕b +ã֮̀̕b + +à֮̄̕b +à֮̄̕b +à֮̄̕b +à֮̄̕b +à֮̄̕b + +ā֮̀̕b +ā֮̀̕b +ā֮̀̕b +ā֮̀̕b +ā֮̀̕b + +à֮̅̕b +à֮̅̕b +à֮̅̕b +à֮̅̕b +à֮̅̕b + +a֮̅̀̕b +a֮̅̀̕b +a֮̅̀̕b +a֮̅̀̕b +a֮̅̀̕b + +à֮̆̕b +à֮̆̕b +à֮̆̕b +à֮̆̕b +à֮̆̕b + +ằ֮̕b +ằ֮̕b +ằ֮̕b +ằ֮̕b +ằ֮̕b + +à֮̇̕b +à֮̇̕b +à֮̇̕b +à֮̇̕b +à֮̇̕b + +ȧ֮̀̕b +ȧ֮̀̕b +ȧ֮̀̕b +ȧ֮̀̕b +ȧ֮̀̕b + +à֮̈̕b +à֮̈̕b +à֮̈̕b +à֮̈̕b +à֮̈̕b + +ä֮̀̕b +ä֮̀̕b +ä֮̀̕b +ä֮̀̕b +ä֮̀̕b + +à֮̉̕b +à֮̉̕b +à֮̉̕b +à֮̉̕b +à֮̉̕b + +ả֮̀̕b +ả֮̀̕b +ả֮̀̕b +ả֮̀̕b +ả֮̀̕b + +à֮̊̕b +à֮̊̕b +à֮̊̕b +à֮̊̕b +à֮̊̕b + +å֮̀̕b +å֮̀̕b +å֮̀̕b +å֮̀̕b +å֮̀̕b + +à֮̋̕b +à֮̋̕b +à֮̋̕b +à֮̋̕b +à֮̋̕b + +a֮̋̀̕b +a֮̋̀̕b +a֮̋̀̕b +a֮̋̀̕b +a֮̋̀̕b + +à֮̌̕b +à֮̌̕b +à֮̌̕b +à֮̌̕b +à֮̌̕b + +ǎ֮̀̕b +ǎ֮̀̕b +ǎ֮̀̕b +ǎ֮̀̕b +ǎ֮̀̕b + +à֮̍̕b +à֮̍̕b +à֮̍̕b +à֮̍̕b +à֮̍̕b + +a֮̍̀̕b +a֮̍̀̕b +a֮̍̀̕b +a֮̍̀̕b +a֮̍̀̕b + +à֮̎̕b +à֮̎̕b +à֮̎̕b +à֮̎̕b +à֮̎̕b + +a֮̎̀̕b +a֮̎̀̕b +a֮̎̀̕b +a֮̎̀̕b +a֮̎̀̕b + +à֮̏̕b +à֮̏̕b +à֮̏̕b +à֮̏̕b +à֮̏̕b + +ȁ֮̀̕b +ȁ֮̀̕b +ȁ֮̀̕b +ȁ֮̀̕b +ȁ֮̀̕b + +à֮̐̕b +à֮̐̕b +à֮̐̕b +à֮̐̕b +à֮̐̕b + +a֮̐̀̕b +a֮̐̀̕b +a֮̐̀̕b +a֮̐̀̕b +a֮̐̀̕b + +à֮̑̕b +à֮̑̕b +à֮̑̕b +à֮̑̕b +à֮̑̕b + +ȃ֮̀̕b +ȃ֮̀̕b +ȃ֮̀̕b +ȃ֮̀̕b +ȃ֮̀̕b + +à֮̒̕b +à֮̒̕b +à֮̒̕b +à֮̒̕b +à֮̒̕b + +a֮̒̀̕b +a֮̒̀̕b +a֮̒̀̕b +a֮̒̀̕b +a֮̒̀̕b + +à֮̓̕b +à֮̓̕b +à֮̓̕b +à֮̓̕b +à֮̓̕b + +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b + +à֮̔̕b +à֮̔̕b +à֮̔̕b +à֮̔̕b +à֮̔̕b + +a֮̔̀̕b +a֮̔̀̕b +a֮̔̀̕b +a֮̔̀̕b +a֮̔̀̕b + +à̕̕͜b +à̕̕͜b +à̕̕͜b +à̕̕͜b +à̕̕͜b + +à̕̕͜b +à̕̕͜b +à̕̕͜b +à̕̕͜b +à̕̕͜b + +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b + +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b +a〪̖̖֚b + +a〪̖̗֚b +a〪̖̗֚b +a〪̖̗֚b +a〪̖̗֚b +a〪̖̗֚b + +a〪̗̖֚b +a〪̗̖֚b +a〪̗̖֚b +a〪̗̖֚b +a〪̗̖֚b + +a〪̖̘֚b +a〪̖̘֚b +a〪̖̘֚b +a〪̖̘֚b +a〪̖̘֚b + +a〪̘̖֚b +a〪̘̖֚b +a〪̘̖֚b +a〪̘̖֚b +a〪̘̖֚b + +a〪̖̙֚b +a〪̖̙֚b +a〪̖̙֚b +a〪̖̙֚b +a〪̖̙֚b + +a〪̙̖֚b +a〪̙̖֚b +a〪̙̖֚b +a〪̙̖֚b +a〪̙̖֚b + +à̕̚͜b +à̕̚͜b +à̕̚͜b +à̕̚͜b +à̕̚͜b + +à̚̕͜b +à̚̕͜b +à̚̕͜b +à̚̕͜b +à̚̕͜b + +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b + +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b +a᷎̛̛〪b + +a〪̖̜֚b +a〪̖̜֚b +a〪̖̜֚b +a〪̖̜֚b +a〪̖̜֚b + +a〪̜̖֚b +a〪̜̖֚b +a〪̜̖֚b +a〪̜̖֚b +a〪̜̖֚b + +a〪̖̝֚b +a〪̖̝֚b +a〪̖̝֚b +a〪̖̝֚b +a〪̖̝֚b + +a〪̝̖֚b +a〪̝̖֚b +a〪̝̖֚b +a〪̝̖֚b +a〪̝̖֚b + +a〪̖̞֚b +a〪̖̞֚b +a〪̖̞֚b +a〪̖̞֚b +a〪̖̞֚b + +a〪̞̖֚b +a〪̞̖֚b +a〪̞̖֚b +a〪̞̖֚b +a〪̞̖֚b + +a〪̖̟֚b +a〪̖̟֚b +a〪̖̟֚b +a〪̖̟֚b +a〪̖̟֚b + +a〪̟̖֚b +a〪̟̖֚b +a〪̟̖֚b +a〪̟̖֚b +a〪̟̖֚b + +a〪̖̠֚b +a〪̖̠֚b +a〪̖̠֚b +a〪̖̠֚b +a〪̖̠֚b + +a〪̠̖֚b +a〪̠̖֚b +a〪̠̖֚b +a〪̠̖֚b +a〪̠̖֚b + +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b + +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b +aུ̡̡᷎b + +aུ̡̢᷎b +aུ̡̢᷎b +aུ̡̢᷎b +aུ̡̢᷎b +aུ̡̢᷎b + +aུ̢̡᷎b +aུ̢̡᷎b +aུ̢̡᷎b +aུ̢̡᷎b +aུ̢̡᷎b + +a〪̖̣֚b +a〪̖̣֚b +a〪̖̣֚b +a〪̖̣֚b +a〪̖̣֚b + +ạ〪̖֚b +ạ〪̖֚b +ạ〪̖֚b +ạ〪̖֚b +ạ〪̖֚b + +a〪̖̤֚b +a〪̖̤֚b +a〪̖̤֚b +a〪̖̤֚b +a〪̖̤֚b + +a〪̤̖֚b +a〪̤̖֚b +a〪̤̖֚b +a〪̤̖֚b +a〪̤̖֚b + +a〪̖̥֚b +a〪̖̥֚b +a〪̖̥֚b +a〪̖̥֚b +a〪̖̥֚b + +ḁ〪̖֚b +ḁ〪̖֚b +ḁ〪̖֚b +ḁ〪̖֚b +ḁ〪̖֚b + +a〪̖̦֚b +a〪̖̦֚b +a〪̖̦֚b +a〪̖̦֚b +a〪̖̦֚b + +a〪̦̖֚b +a〪̦̖֚b +a〪̦̖֚b +a〪̦̖֚b +a〪̦̖֚b + +aུ̡̧᷎b +aུ̡̧᷎b +aུ̡̧᷎b +aུ̡̧᷎b +aུ̡̧᷎b + +aུ̧̡᷎b +aུ̧̡᷎b +aུ̧̡᷎b +aུ̧̡᷎b +aུ̧̡᷎b + +aུ̡̨᷎b +aུ̡̨᷎b +aུ̡̨᷎b +aུ̡̨᷎b +aུ̡̨᷎b + +ąུ̡᷎b +ąུ̡᷎b +ąུ̡᷎b +ąུ̡᷎b +ąུ̡᷎b + +a〪̖̩֚b +a〪̖̩֚b +a〪̖̩֚b +a〪̖̩֚b +a〪̖̩֚b + +a〪̩̖֚b +a〪̩̖֚b +a〪̩̖֚b +a〪̩̖֚b +a〪̩̖֚b + +a〪̖̪֚b +a〪̖̪֚b +a〪̖̪֚b +a〪̖̪֚b +a〪̖̪֚b + +a〪̪̖֚b +a〪̪̖֚b +a〪̪̖֚b +a〪̪̖֚b +a〪̪̖֚b + +a〪̖̫֚b +a〪̖̫֚b +a〪̖̫֚b +a〪̖̫֚b +a〪̖̫֚b + +a〪̫̖֚b +a〪̫̖֚b +a〪̫̖֚b +a〪̫̖֚b +a〪̫̖֚b + +a〪̖̬֚b +a〪̖̬֚b +a〪̖̬֚b +a〪̖̬֚b +a〪̖̬֚b + +a〪̬̖֚b +a〪̬̖֚b +a〪̬̖֚b +a〪̬̖֚b +a〪̬̖֚b + +a〪̖̭֚b +a〪̖̭֚b +a〪̖̭֚b +a〪̖̭֚b +a〪̖̭֚b + +a〪̭̖֚b +a〪̭̖֚b +a〪̭̖֚b +a〪̭̖֚b +a〪̭̖֚b + +a〪̖̮֚b +a〪̖̮֚b +a〪̖̮֚b +a〪̖̮֚b +a〪̖̮֚b + +a〪̮̖֚b +a〪̮̖֚b +a〪̮̖֚b +a〪̮̖֚b +a〪̮̖֚b + +a〪̖̯֚b +a〪̖̯֚b +a〪̖̯֚b +a〪̖̯֚b +a〪̖̯֚b + +a〪̯̖֚b +a〪̯̖֚b +a〪̯̖֚b +a〪̯̖֚b +a〪̯̖֚b + +a〪̖̰֚b +a〪̖̰֚b +a〪̖̰֚b +a〪̖̰֚b +a〪̖̰֚b + +a〪̰̖֚b +a〪̰̖֚b +a〪̰̖֚b +a〪̰̖֚b +a〪̰̖֚b + +a〪̖̱֚b +a〪̖̱֚b +a〪̖̱֚b +a〪̖̱֚b +a〪̖̱֚b + +a〪̱̖֚b +a〪̱̖֚b +a〪̱̖֚b +a〪̱̖֚b +a〪̱̖֚b + +a〪̖̲֚b +a〪̖̲֚b +a〪̖̲֚b +a〪̖̲֚b +a〪̖̲֚b + +a〪̲̖֚b +a〪̲̖֚b +a〪̲̖֚b +a〪̲̖֚b +a〪̲̖֚b + +a〪̖̳֚b +a〪̖̳֚b +a〪̖̳֚b +a〪̖̳֚b +a〪̖̳֚b + +a〪̳̖֚b +a〪̳̖֚b +a〪̳̖֚b +a〪̳̖֚b +a〪̳̖֚b + +a̴̴़b +a̴̴़b +a̴̴़b +a̴̴़b +a̴̴़b + +a̴̴़b +a̴̴़b +a̴̴़b +a̴̴़b +a̴̴़b + +a̴̵़b +a̴̵़b +a̴̵़b +a̴̵़b +a̴̵़b + +a̵̴़b +a̵̴़b +a̵̴़b +a̵̴़b +a̵̴़b + +a̴̶़b +a̴̶़b +a̴̶़b +a̴̶़b +a̴̶़b + +a̶̴़b +a̶̴़b +a̶̴़b +a̶̴़b +a̶̴़b + +a̴̷़b +a̴̷़b +a̴̷़b +a̴̷़b +a̴̷़b + +a̷̴़b +a̷̴़b +a̷̴़b +a̷̴़b +a̷̴़b + +a̴̸़b +a̴̸़b +a̴̸़b +a̴̸़b +a̴̸़b + +a̸̴़b +a̸̴़b +a̸̴़b +a̸̴़b +a̸̴़b + +a〪̖̹֚b +a〪̖̹֚b +a〪̖̹֚b +a〪̖̹֚b +a〪̖̹֚b + +a〪̹̖֚b +a〪̹̖֚b +a〪̹̖֚b +a〪̹̖֚b +a〪̹̖֚b + +a〪̖̺֚b +a〪̖̺֚b +a〪̖̺֚b +a〪̖̺֚b +a〪̖̺֚b + +a〪̺̖֚b +a〪̺̖֚b +a〪̺̖֚b +a〪̺̖֚b +a〪̺̖֚b + +a〪̖̻֚b +a〪̖̻֚b +a〪̖̻֚b +a〪̖̻֚b +a〪̖̻֚b + +a〪̻̖֚b +a〪̻̖֚b +a〪̻̖֚b +a〪̻̖֚b +a〪̻̖֚b + +a〪̖̼֚b +a〪̖̼֚b +a〪̖̼֚b +a〪̖̼֚b +a〪̖̼֚b + +a〪̼̖֚b +a〪̼̖֚b +a〪̼̖֚b +a〪̼̖֚b +a〪̼̖֚b + +à֮̽̕b +à֮̽̕b +à֮̽̕b +à֮̽̕b +à֮̽̕b + +a֮̽̀̕b +a֮̽̀̕b +a֮̽̀̕b +a֮̽̀̕b +a֮̽̀̕b + +à֮̾̕b +à֮̾̕b +à֮̾̕b +à֮̾̕b +à֮̾̕b + +a֮̾̀̕b +a֮̾̀̕b +a֮̾̀̕b +a֮̾̀̕b +a֮̾̀̕b + +à֮̿̕b +à֮̿̕b +à֮̿̕b +à֮̿̕b +à֮̿̕b + +a֮̿̀̕b +a֮̿̀̕b +a֮̿̀̕b +a֮̿̀̕b +a֮̿̀̕b + +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b + +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b +à֮̀̕b + +à֮́̕b +à֮́̕b +à֮́̕b +à֮́̕b +à֮́̕b + +á֮̀̕b +á֮̀̕b +á֮̀̕b +á֮̀̕b +á֮̀̕b + +à֮͂̕b +à֮͂̕b +à֮͂̕b +à֮͂̕b +à֮͂̕b + +a֮͂̀̕b +a֮͂̀̕b +a֮͂̀̕b +a֮͂̀̕b +a֮͂̀̕b + +à֮̓̕b +à֮̓̕b +à֮̓̕b +à֮̓̕b +à֮̓̕b + +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b +a֮̓̀̕b + +à֮̈́̕b +à֮̈́̕b +à֮̈́̕b +à֮̈́̕b +à֮̈́̕b + +ä֮́̀̕b +ä֮́̀̕b +ä֮́̀̕b +ä֮́̀̕b +ä֮́̀̕b + +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb + +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb +a͝ͅͅb + +à֮͆̕b +à֮͆̕b +à֮͆̕b +à֮͆̕b +à֮͆̕b + +a֮͆̀̕b +a֮͆̀̕b +a֮͆̀̕b +a֮͆̀̕b +a֮͆̀̕b + +a〪̖͇֚b +a〪̖͇֚b +a〪̖͇֚b +a〪̖͇֚b +a〪̖͇֚b + +a〪͇̖֚b +a〪͇̖֚b +a〪͇̖֚b +a〪͇̖֚b +a〪͇̖֚b + +a〪̖͈֚b +a〪̖͈֚b +a〪̖͈֚b +a〪̖͈֚b +a〪̖͈֚b + +a〪͈̖֚b +a〪͈̖֚b +a〪͈̖֚b +a〪͈̖֚b +a〪͈̖֚b + +a〪̖͉֚b +a〪̖͉֚b +a〪̖͉֚b +a〪̖͉֚b +a〪̖͉֚b + +a〪͉̖֚b +a〪͉̖֚b +a〪͉̖֚b +a〪͉̖֚b +a〪͉̖֚b + +à֮͊̕b +à֮͊̕b +à֮͊̕b +à֮͊̕b +à֮͊̕b + +a֮͊̀̕b +a֮͊̀̕b +a֮͊̀̕b +a֮͊̀̕b +a֮͊̀̕b + +à֮͋̕b +à֮͋̕b +à֮͋̕b +à֮͋̕b +à֮͋̕b + +a֮͋̀̕b +a֮͋̀̕b +a֮͋̀̕b +a֮͋̀̕b +a֮͋̀̕b + +à֮͌̕b +à֮͌̕b +à֮͌̕b +à֮͌̕b +à֮͌̕b + +a֮͌̀̕b +a֮͌̀̕b +a֮͌̀̕b +a֮͌̀̕b +a֮͌̀̕b + +a〪̖͍֚b +a〪̖͍֚b +a〪̖͍֚b +a〪̖͍֚b +a〪̖͍֚b + +a〪͍̖֚b +a〪͍̖֚b +a〪͍̖֚b +a〪͍̖֚b +a〪͍̖֚b + +a〪̖͎֚b +a〪̖͎֚b +a〪̖͎֚b +a〪̖͎֚b +a〪̖͎֚b + +a〪͎̖֚b +a〪͎̖֚b +a〪͎̖֚b +a〪͎̖֚b +a〪͎̖֚b + +à֮͐̕b +à֮͐̕b +à֮͐̕b +à֮͐̕b +à֮͐̕b + +a֮͐̀̕b +a֮͐̀̕b +a֮͐̀̕b +a֮͐̀̕b +a֮͐̀̕b + +à֮͑̕b +à֮͑̕b +à֮͑̕b +à֮͑̕b +à֮͑̕b + +a֮͑̀̕b +a֮͑̀̕b +a֮͑̀̕b +a֮͑̀̕b +a֮͑̀̕b + +à֮͒̕b +à֮͒̕b +à֮͒̕b +à֮͒̕b +à֮͒̕b + +a֮͒̀̕b +a֮͒̀̕b +a֮͒̀̕b +a֮͒̀̕b +a֮͒̀̕b + +a〪̖͓֚b +a〪̖͓֚b +a〪̖͓֚b +a〪̖͓֚b +a〪̖͓֚b + +a〪͓̖֚b +a〪͓̖֚b +a〪͓̖֚b +a〪͓̖֚b +a〪͓̖֚b + +a〪̖͔֚b +a〪̖͔֚b +a〪̖͔֚b +a〪̖͔֚b +a〪̖͔֚b + +a〪͔̖֚b +a〪͔̖֚b +a〪͔̖֚b +a〪͔̖֚b +a〪͔̖֚b + +a〪̖͕֚b +a〪̖͕֚b +a〪̖͕֚b +a〪̖͕֚b +a〪̖͕֚b + +a〪͕̖֚b +a〪͕̖֚b +a〪͕̖֚b +a〪͕̖֚b +a〪͕̖֚b + +a〪̖͖֚b +a〪̖͖֚b +a〪̖͖֚b +a〪̖͖֚b +a〪̖͖֚b + +a〪͖̖֚b +a〪͖̖֚b +a〪͖̖֚b +a〪͖̖֚b +a〪͖̖֚b + +à֮͗̕b +à֮͗̕b +à֮͗̕b +à֮͗̕b +à֮͗̕b + +a֮͗̀̕b +a֮͗̀̕b +a֮͗̀̕b +a֮͗̀̕b +a֮͗̀̕b + +à̕͘͜b +à̕͘͜b +à̕͘͜b +à̕͘͜b +à̕͘͜b + +à͘̕͜b +à͘̕͜b +à͘̕͜b +à͘̕͜b +à͘̕͜b + +a〪̖͙֚b +a〪̖͙֚b +a〪̖͙֚b +a〪̖͙֚b +a〪̖͙֚b + +a〪͙̖֚b +a〪͙̖֚b +a〪͙̖֚b +a〪͙̖֚b +a〪͙̖֚b + +a〪̖͚֚b +a〪̖͚֚b +a〪̖͚֚b +a〪̖͚֚b +a〪̖͚֚b + +a〪͚̖֚b +a〪͚̖֚b +a〪͚̖֚b +a〪͚̖֚b +a〪͚̖֚b + +à֮͛̕b +à֮͛̕b +à֮͛̕b +à֮͛̕b +à֮͛̕b + +a֮͛̀̕b +a֮͛̀̕b +a֮͛̀̕b +a֮͛̀̕b +a֮͛̀̕b + +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b + +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b +a̕͜͜͝b + +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb + +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb +a͜͝͝ͅb + +a͜͝͞ͅb +a͜͝͞ͅb +a͜͝͞ͅb +a͜͝͞ͅb +a͜͝͞ͅb + +a͜͞͝ͅb +a͜͞͝ͅb +a͜͞͝ͅb +a͜͞͝ͅb +a͜͞͝ͅb + +a̕͜͟͝b +a̕͜͟͝b +a̕͜͟͝b +a̕͜͟͝b +a̕͜͟͝b + +a̕͟͜͝b +a̕͟͜͝b +a̕͟͜͝b +a̕͟͜͝b +a̕͟͜͝b + +a͜͝͠ͅb +a͜͝͠ͅb +a͜͝͠ͅb +a͜͝͠ͅb +a͜͝͠ͅb + +a͜͠͝ͅb +a͜͠͝ͅb +a͜͠͝ͅb +a͜͠͝ͅb +a͜͠͝ͅb + +a͜͝͡ͅb +a͜͝͡ͅb +a͜͝͡ͅb +a͜͝͡ͅb +a͜͝͡ͅb + +a͜͡͝ͅb +a͜͡͝ͅb +a͜͡͝ͅb +a͜͡͝ͅb +a͜͡͝ͅb + +a̕͜͢͝b +a̕͜͢͝b +a̕͜͢͝b +a̕͜͢͝b +a̕͜͢͝b + +a̕͢͜͝b +a̕͢͜͝b +a̕͢͜͝b +a̕͢͜͝b +a̕͢͜͝b + +à֮ͣ̕b +à֮ͣ̕b +à֮ͣ̕b +à֮ͣ̕b +à֮ͣ̕b + +a֮ͣ̀̕b +a֮ͣ̀̕b +a֮ͣ̀̕b +a֮ͣ̀̕b +a֮ͣ̀̕b + +à֮ͤ̕b +à֮ͤ̕b +à֮ͤ̕b +à֮ͤ̕b +à֮ͤ̕b + +a֮ͤ̀̕b +a֮ͤ̀̕b +a֮ͤ̀̕b +a֮ͤ̀̕b +a֮ͤ̀̕b + +à֮ͥ̕b +à֮ͥ̕b +à֮ͥ̕b +à֮ͥ̕b +à֮ͥ̕b + +a֮ͥ̀̕b +a֮ͥ̀̕b +a֮ͥ̀̕b +a֮ͥ̀̕b +a֮ͥ̀̕b + +à֮ͦ̕b +à֮ͦ̕b +à֮ͦ̕b +à֮ͦ̕b +à֮ͦ̕b + +a֮ͦ̀̕b +a֮ͦ̀̕b +a֮ͦ̀̕b +a֮ͦ̀̕b +a֮ͦ̀̕b + +à֮ͧ̕b +à֮ͧ̕b +à֮ͧ̕b +à֮ͧ̕b +à֮ͧ̕b + +a֮ͧ̀̕b +a֮ͧ̀̕b +a֮ͧ̀̕b +a֮ͧ̀̕b +a֮ͧ̀̕b + +à֮ͨ̕b +à֮ͨ̕b +à֮ͨ̕b +à֮ͨ̕b +à֮ͨ̕b + +a֮ͨ̀̕b +a֮ͨ̀̕b +a֮ͨ̀̕b +a֮ͨ̀̕b +a֮ͨ̀̕b + +à֮ͩ̕b +à֮ͩ̕b +à֮ͩ̕b +à֮ͩ̕b +à֮ͩ̕b + +a֮ͩ̀̕b +a֮ͩ̀̕b +a֮ͩ̀̕b +a֮ͩ̀̕b +a֮ͩ̀̕b + +à֮ͪ̕b +à֮ͪ̕b +à֮ͪ̕b +à֮ͪ̕b +à֮ͪ̕b + +a֮ͪ̀̕b +a֮ͪ̀̕b +a֮ͪ̀̕b +a֮ͪ̀̕b +a֮ͪ̀̕b + +à֮ͫ̕b +à֮ͫ̕b +à֮ͫ̕b +à֮ͫ̕b +à֮ͫ̕b + +a֮ͫ̀̕b +a֮ͫ̀̕b +a֮ͫ̀̕b +a֮ͫ̀̕b +a֮ͫ̀̕b + +à֮ͬ̕b +à֮ͬ̕b +à֮ͬ̕b +à֮ͬ̕b +à֮ͬ̕b + +a֮ͬ̀̕b +a֮ͬ̀̕b +a֮ͬ̀̕b +a֮ͬ̀̕b +a֮ͬ̀̕b + +à֮ͭ̕b +à֮ͭ̕b +à֮ͭ̕b +à֮ͭ̕b +à֮ͭ̕b + +a֮ͭ̀̕b +a֮ͭ̀̕b +a֮ͭ̀̕b +a֮ͭ̀̕b +a֮ͭ̀̕b + +à֮ͮ̕b +à֮ͮ̕b +à֮ͮ̕b +à֮ͮ̕b +à֮ͮ̕b + +a֮ͮ̀̕b +a֮ͮ̀̕b +a֮ͮ̀̕b +a֮ͮ̀̕b +a֮ͮ̀̕b + +à֮ͯ̕b +à֮ͯ̕b +à֮ͯ̕b +à֮ͯ̕b +à֮ͯ̕b + +a֮ͯ̀̕b +a֮ͯ̀̕b +a֮ͯ̀̕b +a֮ͯ̀̕b +a֮ͯ̀̕b + +à֮҃̕b +à֮҃̕b +à֮҃̕b +à֮҃̕b +à֮҃̕b + +a֮҃̀̕b +a֮҃̀̕b +a֮҃̀̕b +a֮҃̀̕b +a֮҃̀̕b + +à֮҄̕b +à֮҄̕b +à֮҄̕b +à֮҄̕b +à֮҄̕b + +a֮҄̀̕b +a֮҄̀̕b +a֮҄̀̕b +a֮҄̀̕b +a֮҄̀̕b + +à֮҅̕b +à֮҅̕b +à֮҅̕b +à֮҅̕b +à֮҅̕b + +a֮҅̀̕b +a֮҅̀̕b +a֮҅̀̕b +a֮҅̀̕b +a֮҅̀̕b + +à֮҆̕b +à֮҆̕b +à֮҆̕b +à֮҆̕b +à֮҆̕b + +a֮҆̀̕b +a֮҆̀̕b +a֮҆̀̕b +a֮҆̀̕b +a֮҆̀̕b + +à֮҇̕b +à֮҇̕b +à֮҇̕b +à֮҇̕b +à֮҇̕b + +a֮҇̀̕b +a֮҇̀̕b +a֮҇̀̕b +a֮҇̀̕b +a֮҇̀̕b + +a〪̖֑֚b +a〪̖֑֚b +a〪̖֑֚b +a〪̖֑֚b +a〪̖֑֚b + +a〪֑̖֚b +a〪֑̖֚b +a〪֑̖֚b +a〪֑̖֚b +a〪֑̖֚b + +à֮֒̕b +à֮֒̕b +à֮֒̕b +à֮֒̕b +à֮֒̕b + +a֮֒̀̕b +a֮֒̀̕b +a֮֒̀̕b +a֮֒̀̕b +a֮֒̀̕b + +à֮֓̕b +à֮֓̕b +à֮֓̕b +à֮֓̕b +à֮֓̕b + +a֮֓̀̕b +a֮֓̀̕b +a֮֓̀̕b +a֮֓̀̕b +a֮֓̀̕b + +à֮֔̕b +à֮֔̕b +à֮֔̕b +à֮֔̕b +à֮֔̕b + +a֮֔̀̕b +a֮֔̀̕b +a֮֔̀̕b +a֮֔̀̕b +a֮֔̀̕b + +à֮֕̕b +à֮֕̕b +à֮֕̕b +à֮֕̕b +à֮֕̕b + +a֮֕̀̕b +a֮֕̀̕b +a֮֕̀̕b +a֮֕̀̕b +a֮֕̀̕b + +a〪̖֖֚b +a〪̖֖֚b +a〪̖֖֚b +a〪̖֖֚b +a〪̖֖֚b + +a〪֖̖֚b +a〪֖̖֚b +a〪֖̖֚b +a〪֖̖֚b +a〪֖̖֚b + +à֮֗̕b +à֮֗̕b +à֮֗̕b +à֮֗̕b +à֮֗̕b + +a֮֗̀̕b +a֮֗̀̕b +a֮֗̀̕b +a֮֗̀̕b +a֮֗̀̕b + +à֮֘̕b +à֮֘̕b +à֮֘̕b +à֮֘̕b +à֮֘̕b + +a֮֘̀̕b +a֮֘̀̕b +a֮֘̀̕b +a֮֘̀̕b +a֮֘̀̕b + +à֮֙̕b +à֮֙̕b +à֮֙̕b +à֮֙̕b +à֮֙̕b + +a֮֙̀̕b +a֮֙̀̕b +a֮֙̀̕b +a֮֙̀̕b +a֮֙̀̕b + +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b + +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b +a̖֚֚〮b + +a〪̖֛֚b +a〪̖֛֚b +a〪̖֛֚b +a〪̖֛֚b +a〪̖֛֚b + +a〪֛̖֚b +a〪֛̖֚b +a〪֛̖֚b +a〪֛̖֚b +a〪֛̖֚b + +à֮֜̕b +à֮֜̕b +à֮֜̕b +à֮֜̕b +à֮֜̕b + +a֮֜̀̕b +a֮֜̀̕b +a֮֜̀̕b +a֮֜̀̕b +a֮֜̀̕b + +à֮֝̕b +à֮֝̕b +à֮֝̕b +à֮֝̕b +à֮֝̕b + +a֮֝̀̕b +a֮֝̀̕b +a֮֝̀̕b +a֮֝̀̕b +a֮֝̀̕b + +à֮֞̕b +à֮֞̕b +à֮֞̕b +à֮֞̕b +à֮֞̕b + +a֮֞̀̕b +a֮֞̀̕b +a֮֞̀̕b +a֮֞̀̕b +a֮֞̀̕b + +à֮֟̕b +à֮֟̕b +à֮֟̕b +à֮֟̕b +à֮֟̕b + +a֮֟̀̕b +a֮֟̀̕b +a֮֟̀̕b +a֮֟̀̕b +a֮֟̀̕b + +à֮֠̕b +à֮֠̕b +à֮֠̕b +à֮֠̕b +à֮֠̕b + +a֮֠̀̕b +a֮֠̀̕b +a֮֠̀̕b +a֮֠̀̕b +a֮֠̀̕b + +à֮֡̕b +à֮֡̕b +à֮֡̕b +à֮֡̕b +à֮֡̕b + +a֮֡̀̕b +a֮֡̀̕b +a֮֡̀̕b +a֮֡̀̕b +a֮֡̀̕b + +a〪̖֢֚b +a〪̖֢֚b +a〪̖֢֚b +a〪̖֢֚b +a〪̖֢֚b + +a〪֢̖֚b +a〪֢̖֚b +a〪֢̖֚b +a〪֢̖֚b +a〪֢̖֚b + +a〪̖֣֚b +a〪̖֣֚b +a〪̖֣֚b +a〪̖֣֚b +a〪̖֣֚b + +a〪֣̖֚b +a〪֣̖֚b +a〪֣̖֚b +a〪֣̖֚b +a〪֣̖֚b + +a〪̖֤֚b +a〪̖֤֚b +a〪̖֤֚b +a〪̖֤֚b +a〪̖֤֚b + +a〪֤̖֚b +a〪֤̖֚b +a〪֤̖֚b +a〪֤̖֚b +a〪֤̖֚b + +a〪̖֥֚b +a〪̖֥֚b +a〪̖֥֚b +a〪̖֥֚b +a〪̖֥֚b + +a〪֥̖֚b +a〪֥̖֚b +a〪֥̖֚b +a〪֥̖֚b +a〪֥̖֚b + +a〪̖֦֚b +a〪̖֦֚b +a〪̖֦֚b +a〪̖֦֚b +a〪̖֦֚b + +a〪֦̖֚b +a〪֦̖֚b +a〪֦̖֚b +a〪֦̖֚b +a〪֦̖֚b + +a〪̖֧֚b +a〪̖֧֚b +a〪̖֧֚b +a〪̖֧֚b +a〪̖֧֚b + +a〪֧̖֚b +a〪֧̖֚b +a〪֧̖֚b +a〪֧̖֚b +a〪֧̖֚b + +à֮֨̕b +à֮֨̕b +à֮֨̕b +à֮֨̕b +à֮֨̕b + +a֮֨̀̕b +a֮֨̀̕b +a֮֨̀̕b +a֮֨̀̕b +a֮֨̀̕b + +à֮֩̕b +à֮֩̕b +à֮֩̕b +à֮֩̕b +à֮֩̕b + +a֮֩̀̕b +a֮֩̀̕b +a֮֩̀̕b +a֮֩̀̕b +a֮֩̀̕b + +a〪̖֪֚b +a〪̖֪֚b +a〪̖֪֚b +a〪̖֪֚b +a〪̖֪֚b + +a〪֪̖֚b +a〪֪̖֚b +a〪֪̖֚b +a〪֪̖֚b +a〪֪̖֚b + +à֮֫̕b +à֮֫̕b +à֮֫̕b +à֮֫̕b +à֮֫̕b + +a֮֫̀̕b +a֮֫̀̕b +a֮֫̀̕b +a֮֫̀̕b +a֮֫̀̕b + +à֮֬̕b +à֮֬̕b +à֮֬̕b +à֮֬̕b +à֮֬̕b + +a֮֬̀̕b +a֮֬̀̕b +a֮֬̀̕b +a֮֬̀̕b +a֮֬̀̕b + +a̖֚֭〮b +a̖֚֭〮b +a̖֚֭〮b +a̖֚֭〮b +a̖֚֭〮b + +a̖֭֚〮b +a̖֭֚〮b +a̖֭֚〮b +a̖֭֚〮b +a̖֭֚〮b + +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b + +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b +à𝅭֮֮b + +à֮֯̕b +à֮֯̕b +à֮֯̕b +à֮֯̕b +à֮֯̕b + +a֮֯̀̕b +a֮֯̀̕b +a֮֯̀̕b +a֮֯̀̕b +a֮֯̀̕b + +a्ְְֱb +a्ְְֱb +a्ְְֱb +a्ְְֱb +a्ְְֱb + +a्ְְֱb +a्ְְֱb +a्ְְֱb +a्ְְֱb +a्ְְֱb + +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb + +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb +aְֱֱֲb + +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb + +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb +aֱֲֲֳb + +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb + +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb +aֲֳֳִb + +aֳִִֵb +aֳִִֵb +aֳִִֵb +aֳִִֵb +aֳִִֵb + +aֳִִֵb +aֳִִֵb +aֳִִֵb +aֳִִֵb +aֳִִֵb + +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb + +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb +aִֵֵֶb + +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb + +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb +aֵֶֶַb + +aֶַַָb +aֶַַָb +aֶַַָb +aֶַַָb +aֶַַָb + +aֶַַָb +aֶַַָb +aֶַַָb +aֶַַָb +aֶַַָb + +aַָָֹb +aַָָֹb +aַָָֹb +aַָָֹb +aַָָֹb + +aַָָֹb +aַָָֹb +aַָָֹb +aַָָֹb +aַָָֹb + +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb + +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb +aָֹֹֻb + +aָֹֺֻb +aָֹֺֻb +aָֹֺֻb +aָֹֺֻb +aָֹֺֻb + +aָֺֹֻb +aָֺֹֻb +aָֺֹֻb +aָֺֹֻb +aָֺֹֻb + +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb + +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb +aֹֻֻּb + +aֻּּֽb +aֻּּֽb +aֻּּֽb +aֻּּֽb +aֻּּֽb + +aֻּּֽb +aֻּּֽb +aֻּּֽb +aֻּּֽb +aֻּּֽb + +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb + +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb +aּֽֽֿb + +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb + +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb +aֽֿֿׁb + +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb + +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb +aֿׁׁׂb + +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb + +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb +aׁׂׂﬞb + +à֮ׄ̕b +à֮ׄ̕b +à֮ׄ̕b +à֮ׄ̕b +à֮ׄ̕b + +a֮ׄ̀̕b +a֮ׄ̀̕b +a֮ׄ̀̕b +a֮ׄ̀̕b +a֮ׄ̀̕b + +a〪̖ׅ֚b +a〪̖ׅ֚b +a〪̖ׅ֚b +a〪̖ׅ֚b +a〪̖ׅ֚b + +a〪ׅ̖֚b +a〪ׅ̖֚b +a〪ׅ̖֚b +a〪ׅ̖֚b +a〪ׅ̖֚b + +aַָׇֹb +aַָׇֹb +aַָׇֹb +aַָׇֹb +aַָׇֹb + +aַׇָֹb +aַׇָֹb +aַׇָֹb +aַׇָֹb +aַׇָֹb + +à֮ؐ̕b +à֮ؐ̕b +à֮ؐ̕b +à֮ؐ̕b +à֮ؐ̕b + +a֮ؐ̀̕b +a֮ؐ̀̕b +a֮ؐ̀̕b +a֮ؐ̀̕b +a֮ؐ̀̕b + +à֮ؑ̕b +à֮ؑ̕b +à֮ؑ̕b +à֮ؑ̕b +à֮ؑ̕b + +a֮ؑ̀̕b +a֮ؑ̀̕b +a֮ؑ̀̕b +a֮ؑ̀̕b +a֮ؑ̀̕b + +à֮ؒ̕b +à֮ؒ̕b +à֮ؒ̕b +à֮ؒ̕b +à֮ؒ̕b + +a֮ؒ̀̕b +a֮ؒ̀̕b +a֮ؒ̀̕b +a֮ؒ̀̕b +a֮ؒ̀̕b + +à֮ؓ̕b +à֮ؓ̕b +à֮ؓ̕b +à֮ؓ̕b +à֮ؓ̕b + +a֮ؓ̀̕b +a֮ؓ̀̕b +a֮ؓ̀̕b +a֮ؓ̀̕b +a֮ؓ̀̕b + +à֮ؔ̕b +à֮ؔ̕b +à֮ؔ̕b +à֮ؔ̕b +à֮ؔ̕b + +a֮ؔ̀̕b +a֮ؔ̀̕b +a֮ؔ̀̕b +a֮ؔ̀̕b +a֮ؔ̀̕b + +à֮ؕ̕b +à֮ؕ̕b +à֮ؕ̕b +à֮ؕ̕b +à֮ؕ̕b + +a֮ؕ̀̕b +a֮ؕ̀̕b +a֮ؕ̀̕b +a֮ؕ̀̕b +a֮ؕ̀̕b + +à֮ؖ̕b +à֮ؖ̕b +à֮ؖ̕b +à֮ؖ̕b +à֮ؖ̕b + +a֮ؖ̀̕b +a֮ؖ̀̕b +a֮ؖ̀̕b +a֮ؖ̀̕b +a֮ؖ̀̕b + +à֮ؗ̕b +à֮ؗ̕b +à֮ؗ̕b +à֮ؗ̕b +à֮ؗ̕b + +a֮ؗ̀̕b +a֮ؗ̀̕b +a֮ؗ̀̕b +a֮ؗ̀̕b +a֮ؗ̀̕b + +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb + +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb +aٍؘؘؙb + +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb + +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb +aؘؙؙؚb + +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb + +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb +aؙؚؚّb + +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb + +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb +aﬞًًٌb + +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb + +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb +aًٌٌٍb + +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb + +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb +aٌٍٍؘb + +aٍؘَؙb +aٍؘَؙb +aٍؘَؙb +aٍؘَؙb +aٍؘَؙb + +aٍَؘؙb +aٍَؘؙb +aٍَؘؙb +aٍَؘؙb +aٍَؘؙb + +aؘؙُؚb +aؘؙُؚb +aؘؙُؚb +aؘؙُؚb +aؘؙُؚb + +aؘُؙؚb +aؘُؙؚb +aؘُؙؚb +aؘُؙؚb +aؘُؙؚb + +aؙؚِّb +aؙؚِّb +aؙؚِّb +aؙؚِّb +aؙؚِّb + +aؙِؚّb +aؙِؚّb +aؙِؚّb +aؙِؚّb +aؙِؚّb + +aؚّّْb +aؚّّْb +aؚّّْb +aؚّّْb +aؚّّْb + +aؚّّْb +aؚّّْb +aؚّّْb +aؚّّْb +aؚّّْb + +aّْْٰb +aّْْٰb +aّْْٰb +aّْْٰb +aّْْٰb + +aّْْٰb +aّْْٰb +aّْْٰb +aّْْٰb +aّْْٰb + +à֮ٓ̕b +à֮ٓ̕b +à֮ٓ̕b +à֮ٓ̕b +à֮ٓ̕b + +a֮ٓ̀̕b +a֮ٓ̀̕b +a֮ٓ̀̕b +a֮ٓ̀̕b +a֮ٓ̀̕b + +à֮ٔ̕b +à֮ٔ̕b +à֮ٔ̕b +à֮ٔ̕b +à֮ٔ̕b + +a֮ٔ̀̕b +a֮ٔ̀̕b +a֮ٔ̀̕b +a֮ٔ̀̕b +a֮ٔ̀̕b + +a〪̖ٕ֚b +a〪̖ٕ֚b +a〪̖ٕ֚b +a〪̖ٕ֚b +a〪̖ٕ֚b + +a〪ٕ̖֚b +a〪ٕ̖֚b +a〪ٕ̖֚b +a〪ٕ̖֚b +a〪ٕ̖֚b + +a〪̖ٖ֚b +a〪̖ٖ֚b +a〪̖ٖ֚b +a〪̖ٖ֚b +a〪̖ٖ֚b + +a〪ٖ̖֚b +a〪ٖ̖֚b +a〪ٖ̖֚b +a〪ٖ̖֚b +a〪ٖ̖֚b + +à֮ٗ̕b +à֮ٗ̕b +à֮ٗ̕b +à֮ٗ̕b +à֮ٗ̕b + +a֮ٗ̀̕b +a֮ٗ̀̕b +a֮ٗ̀̕b +a֮ٗ̀̕b +a֮ٗ̀̕b + +à֮٘̕b +à֮٘̕b +à֮٘̕b +à֮٘̕b +à֮٘̕b + +a֮٘̀̕b +a֮٘̀̕b +a֮٘̀̕b +a֮٘̀̕b +a֮٘̀̕b + +à֮ٙ̕b +à֮ٙ̕b +à֮ٙ̕b +à֮ٙ̕b +à֮ٙ̕b + +a֮ٙ̀̕b +a֮ٙ̀̕b +a֮ٙ̀̕b +a֮ٙ̀̕b +a֮ٙ̀̕b + +à֮ٚ̕b +à֮ٚ̕b +à֮ٚ̕b +à֮ٚ̕b +à֮ٚ̕b + +a֮ٚ̀̕b +a֮ٚ̀̕b +a֮ٚ̀̕b +a֮ٚ̀̕b +a֮ٚ̀̕b + +à֮ٛ̕b +à֮ٛ̕b +à֮ٛ̕b +à֮ٛ̕b +à֮ٛ̕b + +a֮ٛ̀̕b +a֮ٛ̀̕b +a֮ٛ̀̕b +a֮ٛ̀̕b +a֮ٛ̀̕b + +a〪̖ٜ֚b +a〪̖ٜ֚b +a〪̖ٜ֚b +a〪̖ٜ֚b +a〪̖ٜ֚b + +a〪ٜ̖֚b +a〪ٜ̖֚b +a〪ٜ̖֚b +a〪ٜ̖֚b +a〪ٜ̖֚b + +à֮ٝ̕b +à֮ٝ̕b +à֮ٝ̕b +à֮ٝ̕b +à֮ٝ̕b + +a֮ٝ̀̕b +a֮ٝ̀̕b +a֮ٝ̀̕b +a֮ٝ̀̕b +a֮ٝ̀̕b + +à֮ٞ̕b +à֮ٞ̕b +à֮ٞ̕b +à֮ٞ̕b +à֮ٞ̕b + +a֮ٞ̀̕b +a֮ٞ̀̕b +a֮ٞ̀̕b +a֮ٞ̀̕b +a֮ٞ̀̕b + +a〪̖ٟ֚b +a〪̖ٟ֚b +a〪̖ٟ֚b +a〪̖ٟ֚b +a〪̖ٟ֚b + +a〪ٟ̖֚b +a〪ٟ̖֚b +a〪ٟ̖֚b +a〪ٟ̖֚b +a〪ٟ̖֚b + +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb + +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb +aْٰٰܑb + +à֮ۖ̕b +à֮ۖ̕b +à֮ۖ̕b +à֮ۖ̕b +à֮ۖ̕b + +a֮ۖ̀̕b +a֮ۖ̀̕b +a֮ۖ̀̕b +a֮ۖ̀̕b +a֮ۖ̀̕b + +à֮ۗ̕b +à֮ۗ̕b +à֮ۗ̕b +à֮ۗ̕b +à֮ۗ̕b + +a֮ۗ̀̕b +a֮ۗ̀̕b +a֮ۗ̀̕b +a֮ۗ̀̕b +a֮ۗ̀̕b + +à֮ۘ̕b +à֮ۘ̕b +à֮ۘ̕b +à֮ۘ̕b +à֮ۘ̕b + +a֮ۘ̀̕b +a֮ۘ̀̕b +a֮ۘ̀̕b +a֮ۘ̀̕b +a֮ۘ̀̕b + +à֮ۙ̕b +à֮ۙ̕b +à֮ۙ̕b +à֮ۙ̕b +à֮ۙ̕b + +a֮ۙ̀̕b +a֮ۙ̀̕b +a֮ۙ̀̕b +a֮ۙ̀̕b +a֮ۙ̀̕b + +à֮ۚ̕b +à֮ۚ̕b +à֮ۚ̕b +à֮ۚ̕b +à֮ۚ̕b + +a֮ۚ̀̕b +a֮ۚ̀̕b +a֮ۚ̀̕b +a֮ۚ̀̕b +a֮ۚ̀̕b + +à֮ۛ̕b +à֮ۛ̕b +à֮ۛ̕b +à֮ۛ̕b +à֮ۛ̕b + +a֮ۛ̀̕b +a֮ۛ̀̕b +a֮ۛ̀̕b +a֮ۛ̀̕b +a֮ۛ̀̕b + +à֮ۜ̕b +à֮ۜ̕b +à֮ۜ̕b +à֮ۜ̕b +à֮ۜ̕b + +a֮ۜ̀̕b +a֮ۜ̀̕b +a֮ۜ̀̕b +a֮ۜ̀̕b +a֮ۜ̀̕b + +à֮۟̕b +à֮۟̕b +à֮۟̕b +à֮۟̕b +à֮۟̕b + +a֮۟̀̕b +a֮۟̀̕b +a֮۟̀̕b +a֮۟̀̕b +a֮۟̀̕b + +à֮۠̕b +à֮۠̕b +à֮۠̕b +à֮۠̕b +à֮۠̕b + +a֮۠̀̕b +a֮۠̀̕b +a֮۠̀̕b +a֮۠̀̕b +a֮۠̀̕b + +à֮ۡ̕b +à֮ۡ̕b +à֮ۡ̕b +à֮ۡ̕b +à֮ۡ̕b + +a֮ۡ̀̕b +a֮ۡ̀̕b +a֮ۡ̀̕b +a֮ۡ̀̕b +a֮ۡ̀̕b + +à֮ۢ̕b +à֮ۢ̕b +à֮ۢ̕b +à֮ۢ̕b +à֮ۢ̕b + +a֮ۢ̀̕b +a֮ۢ̀̕b +a֮ۢ̀̕b +a֮ۢ̀̕b +a֮ۢ̀̕b + +a〪̖ۣ֚b +a〪̖ۣ֚b +a〪̖ۣ֚b +a〪̖ۣ֚b +a〪̖ۣ֚b + +a〪ۣ̖֚b +a〪ۣ̖֚b +a〪ۣ̖֚b +a〪ۣ̖֚b +a〪ۣ̖֚b + +à֮ۤ̕b +à֮ۤ̕b +à֮ۤ̕b +à֮ۤ̕b +à֮ۤ̕b + +a֮ۤ̀̕b +a֮ۤ̀̕b +a֮ۤ̀̕b +a֮ۤ̀̕b +a֮ۤ̀̕b + +à֮ۧ̕b +à֮ۧ̕b +à֮ۧ̕b +à֮ۧ̕b +à֮ۧ̕b + +a֮ۧ̀̕b +a֮ۧ̀̕b +a֮ۧ̀̕b +a֮ۧ̀̕b +a֮ۧ̀̕b + +à֮ۨ̕b +à֮ۨ̕b +à֮ۨ̕b +à֮ۨ̕b +à֮ۨ̕b + +a֮ۨ̀̕b +a֮ۨ̀̕b +a֮ۨ̀̕b +a֮ۨ̀̕b +a֮ۨ̀̕b + +a〪̖۪֚b +a〪̖۪֚b +a〪̖۪֚b +a〪̖۪֚b +a〪̖۪֚b + +a〪۪̖֚b +a〪۪̖֚b +a〪۪̖֚b +a〪۪̖֚b +a〪۪̖֚b + +à֮۫̕b +à֮۫̕b +à֮۫̕b +à֮۫̕b +à֮۫̕b + +a֮۫̀̕b +a֮۫̀̕b +a֮۫̀̕b +a֮۫̀̕b +a֮۫̀̕b + +à֮۬̕b +à֮۬̕b +à֮۬̕b +à֮۬̕b +à֮۬̕b + +a֮۬̀̕b +a֮۬̀̕b +a֮۬̀̕b +a֮۬̀̕b +a֮۬̀̕b + +a〪̖ۭ֚b +a〪̖ۭ֚b +a〪̖ۭ֚b +a〪̖ۭ֚b +a〪̖ۭ֚b + +a〪ۭ̖֚b +a〪ۭ̖֚b +a〪ۭ̖֚b +a〪ۭ̖֚b +a〪ۭ̖֚b + +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb + +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb +aٰܑܑౕb + +à֮ܰ̕b +à֮ܰ̕b +à֮ܰ̕b +à֮ܰ̕b +à֮ܰ̕b + +a֮ܰ̀̕b +a֮ܰ̀̕b +a֮ܰ̀̕b +a֮ܰ̀̕b +a֮ܰ̀̕b + +a〪̖ܱ֚b +a〪̖ܱ֚b +a〪̖ܱ֚b +a〪̖ܱ֚b +a〪̖ܱ֚b + +a〪ܱ̖֚b +a〪ܱ̖֚b +a〪ܱ̖֚b +a〪ܱ̖֚b +a〪ܱ̖֚b + +à֮ܲ̕b +à֮ܲ̕b +à֮ܲ̕b +à֮ܲ̕b +à֮ܲ̕b + +a֮ܲ̀̕b +a֮ܲ̀̕b +a֮ܲ̀̕b +a֮ܲ̀̕b +a֮ܲ̀̕b + +à֮ܳ̕b +à֮ܳ̕b +à֮ܳ̕b +à֮ܳ̕b +à֮ܳ̕b + +a֮ܳ̀̕b +a֮ܳ̀̕b +a֮ܳ̀̕b +a֮ܳ̀̕b +a֮ܳ̀̕b + +a〪̖ܴ֚b +a〪̖ܴ֚b +a〪̖ܴ֚b +a〪̖ܴ֚b +a〪̖ܴ֚b + +a〪ܴ̖֚b +a〪ܴ̖֚b +a〪ܴ̖֚b +a〪ܴ̖֚b +a〪ܴ̖֚b + +à֮ܵ̕b +à֮ܵ̕b +à֮ܵ̕b +à֮ܵ̕b +à֮ܵ̕b + +a֮ܵ̀̕b +a֮ܵ̀̕b +a֮ܵ̀̕b +a֮ܵ̀̕b +a֮ܵ̀̕b + +à֮ܶ̕b +à֮ܶ̕b +à֮ܶ̕b +à֮ܶ̕b +à֮ܶ̕b + +a֮ܶ̀̕b +a֮ܶ̀̕b +a֮ܶ̀̕b +a֮ܶ̀̕b +a֮ܶ̀̕b + +a〪̖ܷ֚b +a〪̖ܷ֚b +a〪̖ܷ֚b +a〪̖ܷ֚b +a〪̖ܷ֚b + +a〪ܷ̖֚b +a〪ܷ̖֚b +a〪ܷ̖֚b +a〪ܷ̖֚b +a〪ܷ̖֚b + +a〪̖ܸ֚b +a〪̖ܸ֚b +a〪̖ܸ֚b +a〪̖ܸ֚b +a〪̖ܸ֚b + +a〪ܸ̖֚b +a〪ܸ̖֚b +a〪ܸ̖֚b +a〪ܸ̖֚b +a〪ܸ̖֚b + +a〪̖ܹ֚b +a〪̖ܹ֚b +a〪̖ܹ֚b +a〪̖ܹ֚b +a〪̖ܹ֚b + +a〪ܹ̖֚b +a〪ܹ̖֚b +a〪ܹ̖֚b +a〪ܹ̖֚b +a〪ܹ̖֚b + +à֮ܺ̕b +à֮ܺ̕b +à֮ܺ̕b +à֮ܺ̕b +à֮ܺ̕b + +a֮ܺ̀̕b +a֮ܺ̀̕b +a֮ܺ̀̕b +a֮ܺ̀̕b +a֮ܺ̀̕b + +a〪̖ܻ֚b +a〪̖ܻ֚b +a〪̖ܻ֚b +a〪̖ܻ֚b +a〪̖ܻ֚b + +a〪ܻ̖֚b +a〪ܻ̖֚b +a〪ܻ̖֚b +a〪ܻ̖֚b +a〪ܻ̖֚b + +a〪̖ܼ֚b +a〪̖ܼ֚b +a〪̖ܼ֚b +a〪̖ܼ֚b +a〪̖ܼ֚b + +a〪ܼ̖֚b +a〪ܼ̖֚b +a〪ܼ̖֚b +a〪ܼ̖֚b +a〪ܼ̖֚b + +à֮ܽ̕b +à֮ܽ̕b +à֮ܽ̕b +à֮ܽ̕b +à֮ܽ̕b + +a֮ܽ̀̕b +a֮ܽ̀̕b +a֮ܽ̀̕b +a֮ܽ̀̕b +a֮ܽ̀̕b + +a〪̖ܾ֚b +a〪̖ܾ֚b +a〪̖ܾ֚b +a〪̖ܾ֚b +a〪̖ܾ֚b + +a〪ܾ̖֚b +a〪ܾ̖֚b +a〪ܾ̖֚b +a〪ܾ̖֚b +a〪ܾ̖֚b + +à֮ܿ̕b +à֮ܿ̕b +à֮ܿ̕b +à֮ܿ̕b +à֮ܿ̕b + +a֮ܿ̀̕b +a֮ܿ̀̕b +a֮ܿ̀̕b +a֮ܿ̀̕b +a֮ܿ̀̕b + +à֮݀̕b +à֮݀̕b +à֮݀̕b +à֮݀̕b +à֮݀̕b + +a֮݀̀̕b +a֮݀̀̕b +a֮݀̀̕b +a֮݀̀̕b +a֮݀̀̕b + +à֮݁̕b +à֮݁̕b +à֮݁̕b +à֮݁̕b +à֮݁̕b + +a֮݁̀̕b +a֮݁̀̕b +a֮݁̀̕b +a֮݁̀̕b +a֮݁̀̕b + +a〪̖݂֚b +a〪̖݂֚b +a〪̖݂֚b +a〪̖݂֚b +a〪̖݂֚b + +a〪݂̖֚b +a〪݂̖֚b +a〪݂̖֚b +a〪݂̖֚b +a〪݂̖֚b + +à֮݃̕b +à֮݃̕b +à֮݃̕b +à֮݃̕b +à֮݃̕b + +a֮݃̀̕b +a֮݃̀̕b +a֮݃̀̕b +a֮݃̀̕b +a֮݃̀̕b + +a〪̖݄֚b +a〪̖݄֚b +a〪̖݄֚b +a〪̖݄֚b +a〪̖݄֚b + +a〪݄̖֚b +a〪݄̖֚b +a〪݄̖֚b +a〪݄̖֚b +a〪݄̖֚b + +à֮݅̕b +à֮݅̕b +à֮݅̕b +à֮݅̕b +à֮݅̕b + +a֮݅̀̕b +a֮݅̀̕b +a֮݅̀̕b +a֮݅̀̕b +a֮݅̀̕b + +a〪̖݆֚b +a〪̖݆֚b +a〪̖݆֚b +a〪̖݆֚b +a〪̖݆֚b + +a〪݆̖֚b +a〪݆̖֚b +a〪݆̖֚b +a〪݆̖֚b +a〪݆̖֚b + +à֮݇̕b +à֮݇̕b +à֮݇̕b +à֮݇̕b +à֮݇̕b + +a֮݇̀̕b +a֮݇̀̕b +a֮݇̀̕b +a֮݇̀̕b +a֮݇̀̕b + +a〪̖݈֚b +a〪̖݈֚b +a〪̖݈֚b +a〪̖݈֚b +a〪̖݈֚b + +a〪݈̖֚b +a〪݈̖֚b +a〪݈̖֚b +a〪݈̖֚b +a〪݈̖֚b + +à֮݉̕b +à֮݉̕b +à֮݉̕b +à֮݉̕b +à֮݉̕b + +a֮݉̀̕b +a֮݉̀̕b +a֮݉̀̕b +a֮݉̀̕b +a֮݉̀̕b + +à֮݊̕b +à֮݊̕b +à֮݊̕b +à֮݊̕b +à֮݊̕b + +a֮݊̀̕b +a֮݊̀̕b +a֮݊̀̕b +a֮݊̀̕b +a֮݊̀̕b + +à֮߫̕b +à֮߫̕b +à֮߫̕b +à֮߫̕b +à֮߫̕b + +a֮߫̀̕b +a֮߫̀̕b +a֮߫̀̕b +a֮߫̀̕b +a֮߫̀̕b + +à֮߬̕b +à֮߬̕b +à֮߬̕b +à֮߬̕b +à֮߬̕b + +a֮߬̀̕b +a֮߬̀̕b +a֮߬̀̕b +a֮߬̀̕b +a֮߬̀̕b + +à֮߭̕b +à֮߭̕b +à֮߭̕b +à֮߭̕b +à֮߭̕b + +a֮߭̀̕b +a֮߭̀̕b +a֮߭̀̕b +a֮߭̀̕b +a֮߭̀̕b + +à֮߮̕b +à֮߮̕b +à֮߮̕b +à֮߮̕b +à֮߮̕b + +a֮߮̀̕b +a֮߮̀̕b +a֮߮̀̕b +a֮߮̀̕b +a֮߮̀̕b + +à֮߯̕b +à֮߯̕b +à֮߯̕b +à֮߯̕b +à֮߯̕b + +a֮߯̀̕b +a֮߯̀̕b +a֮߯̀̕b +a֮߯̀̕b +a֮߯̀̕b + +à֮߰̕b +à֮߰̕b +à֮߰̕b +à֮߰̕b +à֮߰̕b + +a֮߰̀̕b +a֮߰̀̕b +a֮߰̀̕b +a֮߰̀̕b +a֮߰̀̕b + +à֮߱̕b +à֮߱̕b +à֮߱̕b +à֮߱̕b +à֮߱̕b + +a֮߱̀̕b +a֮߱̀̕b +a֮߱̀̕b +a֮߱̀̕b +a֮߱̀̕b + +a〪̖߲֚b +a〪̖߲֚b +a〪̖߲֚b +a〪̖߲֚b +a〪̖߲֚b + +a〪߲̖֚b +a〪߲̖֚b +a〪߲̖֚b +a〪߲̖֚b +a〪߲̖֚b + +à֮߳̕b +à֮߳̕b +à֮߳̕b +à֮߳̕b +à֮߳̕b + +a֮߳̀̕b +a֮߳̀̕b +a֮߳̀̕b +a֮߳̀̕b +a֮߳̀̕b + +à֮ࠖ̕b +à֮ࠖ̕b +à֮ࠖ̕b +à֮ࠖ̕b +à֮ࠖ̕b + +a֮ࠖ̀̕b +a֮ࠖ̀̕b +a֮ࠖ̀̕b +a֮ࠖ̀̕b +a֮ࠖ̀̕b + +à֮ࠗ̕b +à֮ࠗ̕b +à֮ࠗ̕b +à֮ࠗ̕b +à֮ࠗ̕b + +a֮ࠗ̀̕b +a֮ࠗ̀̕b +a֮ࠗ̀̕b +a֮ࠗ̀̕b +a֮ࠗ̀̕b + +à֮࠘̕b +à֮࠘̕b +à֮࠘̕b +à֮࠘̕b +à֮࠘̕b + +a֮࠘̀̕b +a֮࠘̀̕b +a֮࠘̀̕b +a֮࠘̀̕b +a֮࠘̀̕b + +à֮࠙̕b +à֮࠙̕b +à֮࠙̕b +à֮࠙̕b +à֮࠙̕b + +a֮࠙̀̕b +a֮࠙̀̕b +a֮࠙̀̕b +a֮࠙̀̕b +a֮࠙̀̕b + +à֮ࠛ̕b +à֮ࠛ̕b +à֮ࠛ̕b +à֮ࠛ̕b +à֮ࠛ̕b + +a֮ࠛ̀̕b +a֮ࠛ̀̕b +a֮ࠛ̀̕b +a֮ࠛ̀̕b +a֮ࠛ̀̕b + +à֮ࠜ̕b +à֮ࠜ̕b +à֮ࠜ̕b +à֮ࠜ̕b +à֮ࠜ̕b + +a֮ࠜ̀̕b +a֮ࠜ̀̕b +a֮ࠜ̀̕b +a֮ࠜ̀̕b +a֮ࠜ̀̕b + +à֮ࠝ̕b +à֮ࠝ̕b +à֮ࠝ̕b +à֮ࠝ̕b +à֮ࠝ̕b + +a֮ࠝ̀̕b +a֮ࠝ̀̕b +a֮ࠝ̀̕b +a֮ࠝ̀̕b +a֮ࠝ̀̕b + +à֮ࠞ̕b +à֮ࠞ̕b +à֮ࠞ̕b +à֮ࠞ̕b +à֮ࠞ̕b + +a֮ࠞ̀̕b +a֮ࠞ̀̕b +a֮ࠞ̀̕b +a֮ࠞ̀̕b +a֮ࠞ̀̕b + +à֮ࠟ̕b +à֮ࠟ̕b +à֮ࠟ̕b +à֮ࠟ̕b +à֮ࠟ̕b + +a֮ࠟ̀̕b +a֮ࠟ̀̕b +a֮ࠟ̀̕b +a֮ࠟ̀̕b +a֮ࠟ̀̕b + +à֮ࠠ̕b +à֮ࠠ̕b +à֮ࠠ̕b +à֮ࠠ̕b +à֮ࠠ̕b + +a֮ࠠ̀̕b +a֮ࠠ̀̕b +a֮ࠠ̀̕b +a֮ࠠ̀̕b +a֮ࠠ̀̕b + +à֮ࠡ̕b +à֮ࠡ̕b +à֮ࠡ̕b +à֮ࠡ̕b +à֮ࠡ̕b + +a֮ࠡ̀̕b +a֮ࠡ̀̕b +a֮ࠡ̀̕b +a֮ࠡ̀̕b +a֮ࠡ̀̕b + +à֮ࠢ̕b +à֮ࠢ̕b +à֮ࠢ̕b +à֮ࠢ̕b +à֮ࠢ̕b + +a֮ࠢ̀̕b +a֮ࠢ̀̕b +a֮ࠢ̀̕b +a֮ࠢ̀̕b +a֮ࠢ̀̕b + +à֮ࠣ̕b +à֮ࠣ̕b +à֮ࠣ̕b +à֮ࠣ̕b +à֮ࠣ̕b + +a֮ࠣ̀̕b +a֮ࠣ̀̕b +a֮ࠣ̀̕b +a֮ࠣ̀̕b +a֮ࠣ̀̕b + +à֮ࠥ̕b +à֮ࠥ̕b +à֮ࠥ̕b +à֮ࠥ̕b +à֮ࠥ̕b + +a֮ࠥ̀̕b +a֮ࠥ̀̕b +a֮ࠥ̀̕b +a֮ࠥ̀̕b +a֮ࠥ̀̕b + +à֮ࠦ̕b +à֮ࠦ̕b +à֮ࠦ̕b +à֮ࠦ̕b +à֮ࠦ̕b + +a֮ࠦ̀̕b +a֮ࠦ̀̕b +a֮ࠦ̀̕b +a֮ࠦ̀̕b +a֮ࠦ̀̕b + +à֮ࠧ̕b +à֮ࠧ̕b +à֮ࠧ̕b +à֮ࠧ̕b +à֮ࠧ̕b + +a֮ࠧ̀̕b +a֮ࠧ̀̕b +a֮ࠧ̀̕b +a֮ࠧ̀̕b +a֮ࠧ̀̕b + +à֮ࠩ̕b +à֮ࠩ̕b +à֮ࠩ̕b +à֮ࠩ̕b +à֮ࠩ̕b + +a֮ࠩ̀̕b +a֮ࠩ̀̕b +a֮ࠩ̀̕b +a֮ࠩ̀̕b +a֮ࠩ̀̕b + +à֮ࠪ̕b +à֮ࠪ̕b +à֮ࠪ̕b +à֮ࠪ̕b +à֮ࠪ̕b + +a֮ࠪ̀̕b +a֮ࠪ̀̕b +a֮ࠪ̀̕b +a֮ࠪ̀̕b +a֮ࠪ̀̕b + +à֮ࠫ̕b +à֮ࠫ̕b +à֮ࠫ̕b +à֮ࠫ̕b +à֮ࠫ̕b + +a֮ࠫ̀̕b +a֮ࠫ̀̕b +a֮ࠫ̀̕b +a֮ࠫ̀̕b +a֮ࠫ̀̕b + +à֮ࠬ̕b +à֮ࠬ̕b +à֮ࠬ̕b +à֮ࠬ̕b +à֮ࠬ̕b + +a֮ࠬ̀̕b +a֮ࠬ̀̕b +a֮ࠬ̀̕b +a֮ࠬ̀̕b +a֮ࠬ̀̕b + +à֮࠭̕b +à֮࠭̕b +à֮࠭̕b +à֮࠭̕b +à֮࠭̕b + +a֮࠭̀̕b +a֮࠭̀̕b +a֮࠭̀̕b +a֮࠭̀̕b +a֮࠭̀̕b + +a〪̖࡙֚b +a〪̖࡙֚b +a〪̖࡙֚b +a〪̖࡙֚b +a〪̖࡙֚b + +a〪࡙̖֚b +a〪࡙̖֚b +a〪࡙̖֚b +a〪࡙̖֚b +a〪࡙̖֚b + +a〪̖࡚֚b +a〪̖࡚֚b +a〪̖࡚֚b +a〪̖࡚֚b +a〪̖࡚֚b + +a〪࡚̖֚b +a〪࡚̖֚b +a〪࡚̖֚b +a〪࡚̖֚b +a〪࡚̖֚b + +a〪̖࡛֚b +a〪̖࡛֚b +a〪̖࡛֚b +a〪̖࡛֚b +a〪̖࡛֚b + +a〪࡛̖֚b +a〪࡛̖֚b +a〪࡛̖֚b +a〪࡛̖֚b +a〪࡛̖֚b + +à֮ࣔ̕b +à֮ࣔ̕b +à֮ࣔ̕b +à֮ࣔ̕b +à֮ࣔ̕b + +a֮ࣔ̀̕b +a֮ࣔ̀̕b +a֮ࣔ̀̕b +a֮ࣔ̀̕b +a֮ࣔ̀̕b + +à֮ࣕ̕b +à֮ࣕ̕b +à֮ࣕ̕b +à֮ࣕ̕b +à֮ࣕ̕b + +a֮ࣕ̀̕b +a֮ࣕ̀̕b +a֮ࣕ̀̕b +a֮ࣕ̀̕b +a֮ࣕ̀̕b + +à֮ࣖ̕b +à֮ࣖ̕b +à֮ࣖ̕b +à֮ࣖ̕b +à֮ࣖ̕b + +a֮ࣖ̀̕b +a֮ࣖ̀̕b +a֮ࣖ̀̕b +a֮ࣖ̀̕b +a֮ࣖ̀̕b + +à֮ࣗ̕b +à֮ࣗ̕b +à֮ࣗ̕b +à֮ࣗ̕b +à֮ࣗ̕b + +a֮ࣗ̀̕b +a֮ࣗ̀̕b +a֮ࣗ̀̕b +a֮ࣗ̀̕b +a֮ࣗ̀̕b + +à֮ࣘ̕b +à֮ࣘ̕b +à֮ࣘ̕b +à֮ࣘ̕b +à֮ࣘ̕b + +a֮ࣘ̀̕b +a֮ࣘ̀̕b +a֮ࣘ̀̕b +a֮ࣘ̀̕b +a֮ࣘ̀̕b + +à֮ࣙ̕b +à֮ࣙ̕b +à֮ࣙ̕b +à֮ࣙ̕b +à֮ࣙ̕b + +a֮ࣙ̀̕b +a֮ࣙ̀̕b +a֮ࣙ̀̕b +a֮ࣙ̀̕b +a֮ࣙ̀̕b + +à֮ࣚ̕b +à֮ࣚ̕b +à֮ࣚ̕b +à֮ࣚ̕b +à֮ࣚ̕b + +a֮ࣚ̀̕b +a֮ࣚ̀̕b +a֮ࣚ̀̕b +a֮ࣚ̀̕b +a֮ࣚ̀̕b + +à֮ࣛ̕b +à֮ࣛ̕b +à֮ࣛ̕b +à֮ࣛ̕b +à֮ࣛ̕b + +a֮ࣛ̀̕b +a֮ࣛ̀̕b +a֮ࣛ̀̕b +a֮ࣛ̀̕b +a֮ࣛ̀̕b + +à֮ࣜ̕b +à֮ࣜ̕b +à֮ࣜ̕b +à֮ࣜ̕b +à֮ࣜ̕b + +a֮ࣜ̀̕b +a֮ࣜ̀̕b +a֮ࣜ̀̕b +a֮ࣜ̀̕b +a֮ࣜ̀̕b + +à֮ࣝ̕b +à֮ࣝ̕b +à֮ࣝ̕b +à֮ࣝ̕b +à֮ࣝ̕b + +a֮ࣝ̀̕b +a֮ࣝ̀̕b +a֮ࣝ̀̕b +a֮ࣝ̀̕b +a֮ࣝ̀̕b + +à֮ࣞ̕b +à֮ࣞ̕b +à֮ࣞ̕b +à֮ࣞ̕b +à֮ࣞ̕b + +a֮ࣞ̀̕b +a֮ࣞ̀̕b +a֮ࣞ̀̕b +a֮ࣞ̀̕b +a֮ࣞ̀̕b + +à֮ࣟ̕b +à֮ࣟ̕b +à֮ࣟ̕b +à֮ࣟ̕b +à֮ࣟ̕b + +a֮ࣟ̀̕b +a֮ࣟ̀̕b +a֮ࣟ̀̕b +a֮ࣟ̀̕b +a֮ࣟ̀̕b + +à֮࣠̕b +à֮࣠̕b +à֮࣠̕b +à֮࣠̕b +à֮࣠̕b + +a֮࣠̀̕b +a֮࣠̀̕b +a֮࣠̀̕b +a֮࣠̀̕b +a֮࣠̀̕b + +à֮࣡̕b +à֮࣡̕b +à֮࣡̕b +à֮࣡̕b +à֮࣡̕b + +a֮࣡̀̕b +a֮࣡̀̕b +a֮࣡̀̕b +a֮࣡̀̕b +a֮࣡̀̕b + +a〪̖ࣣ֚b +a〪̖ࣣ֚b +a〪̖ࣣ֚b +a〪̖ࣣ֚b +a〪̖ࣣ֚b + +a〪ࣣ̖֚b +a〪ࣣ̖֚b +a〪ࣣ̖֚b +a〪ࣣ̖֚b +a〪ࣣ̖֚b + +à֮ࣤ̕b +à֮ࣤ̕b +à֮ࣤ̕b +à֮ࣤ̕b +à֮ࣤ̕b + +a֮ࣤ̀̕b +a֮ࣤ̀̕b +a֮ࣤ̀̕b +a֮ࣤ̀̕b +a֮ࣤ̀̕b + +à֮ࣥ̕b +à֮ࣥ̕b +à֮ࣥ̕b +à֮ࣥ̕b +à֮ࣥ̕b + +a֮ࣥ̀̕b +a֮ࣥ̀̕b +a֮ࣥ̀̕b +a֮ࣥ̀̕b +a֮ࣥ̀̕b + +a〪̖ࣦ֚b +a〪̖ࣦ֚b +a〪̖ࣦ֚b +a〪̖ࣦ֚b +a〪̖ࣦ֚b + +a〪ࣦ̖֚b +a〪ࣦ̖֚b +a〪ࣦ̖֚b +a〪ࣦ̖֚b +a〪ࣦ̖֚b + +à֮ࣧ̕b +à֮ࣧ̕b +à֮ࣧ̕b +à֮ࣧ̕b +à֮ࣧ̕b + +a֮ࣧ̀̕b +a֮ࣧ̀̕b +a֮ࣧ̀̕b +a֮ࣧ̀̕b +a֮ࣧ̀̕b + +à֮ࣨ̕b +à֮ࣨ̕b +à֮ࣨ̕b +à֮ࣨ̕b +à֮ࣨ̕b + +a֮ࣨ̀̕b +a֮ࣨ̀̕b +a֮ࣨ̀̕b +a֮ࣨ̀̕b +a֮ࣨ̀̕b + +a〪̖ࣩ֚b +a〪̖ࣩ֚b +a〪̖ࣩ֚b +a〪̖ࣩ֚b +a〪̖ࣩ֚b + +a〪ࣩ̖֚b +a〪ࣩ̖֚b +a〪ࣩ̖֚b +a〪ࣩ̖֚b +a〪ࣩ̖֚b + +à֮࣪̕b +à֮࣪̕b +à֮࣪̕b +à֮࣪̕b +à֮࣪̕b + +a֮࣪̀̕b +a֮࣪̀̕b +a֮࣪̀̕b +a֮࣪̀̕b +a֮࣪̀̕b + +à֮࣫̕b +à֮࣫̕b +à֮࣫̕b +à֮࣫̕b +à֮࣫̕b + +a֮࣫̀̕b +a֮࣫̀̕b +a֮࣫̀̕b +a֮࣫̀̕b +a֮࣫̀̕b + +à֮࣬̕b +à֮࣬̕b +à֮࣬̕b +à֮࣬̕b +à֮࣬̕b + +a֮࣬̀̕b +a֮࣬̀̕b +a֮࣬̀̕b +a֮࣬̀̕b +a֮࣬̀̕b + +a〪̖࣭֚b +a〪̖࣭֚b +a〪̖࣭֚b +a〪̖࣭֚b +a〪̖࣭֚b + +a〪࣭̖֚b +a〪࣭̖֚b +a〪࣭̖֚b +a〪࣭̖֚b +a〪࣭̖֚b + +a〪̖࣮֚b +a〪̖࣮֚b +a〪̖࣮֚b +a〪̖࣮֚b +a〪̖࣮֚b + +a〪࣮̖֚b +a〪࣮̖֚b +a〪࣮̖֚b +a〪࣮̖֚b +a〪࣮̖֚b + +a〪̖࣯֚b +a〪̖࣯֚b +a〪̖࣯֚b +a〪̖࣯֚b +a〪̖࣯֚b + +a〪࣯̖֚b +a〪࣯̖֚b +a〪࣯̖֚b +a〪࣯̖֚b +a〪࣯̖֚b + +aﬞًࣰٌb +aﬞًࣰٌb +aﬞًࣰٌb +aﬞًࣰٌb +aﬞًࣰٌb + +aﬞࣰًٌb +aﬞࣰًٌb +aﬞࣰًٌb +aﬞࣰًٌb +aﬞࣰًٌb + +aًٌࣱٍb +aًٌࣱٍb +aًٌࣱٍb +aًٌࣱٍb +aًٌࣱٍb + +aًࣱٌٍb +aًࣱٌٍb +aًࣱٌٍb +aًࣱٌٍb +aًࣱٌٍb + +aٌٍࣲؘb +aٌٍࣲؘb +aٌٍࣲؘb +aٌٍࣲؘb +aٌٍࣲؘb + +aٌࣲٍؘb +aٌࣲٍؘb +aٌࣲٍؘb +aٌࣲٍؘb +aٌࣲٍؘb + +à֮ࣳ̕b +à֮ࣳ̕b +à֮ࣳ̕b +à֮ࣳ̕b +à֮ࣳ̕b + +a֮ࣳ̀̕b +a֮ࣳ̀̕b +a֮ࣳ̀̕b +a֮ࣳ̀̕b +a֮ࣳ̀̕b + +à֮ࣴ̕b +à֮ࣴ̕b +à֮ࣴ̕b +à֮ࣴ̕b +à֮ࣴ̕b + +a֮ࣴ̀̕b +a֮ࣴ̀̕b +a֮ࣴ̀̕b +a֮ࣴ̀̕b +a֮ࣴ̀̕b + +à֮ࣵ̕b +à֮ࣵ̕b +à֮ࣵ̕b +à֮ࣵ̕b +à֮ࣵ̕b + +a֮ࣵ̀̕b +a֮ࣵ̀̕b +a֮ࣵ̀̕b +a֮ࣵ̀̕b +a֮ࣵ̀̕b + +a〪̖ࣶ֚b +a〪̖ࣶ֚b +a〪̖ࣶ֚b +a〪̖ࣶ֚b +a〪̖ࣶ֚b + +a〪ࣶ̖֚b +a〪ࣶ̖֚b +a〪ࣶ̖֚b +a〪ࣶ̖֚b +a〪ࣶ̖֚b + +à֮ࣷ̕b +à֮ࣷ̕b +à֮ࣷ̕b +à֮ࣷ̕b +à֮ࣷ̕b + +a֮ࣷ̀̕b +a֮ࣷ̀̕b +a֮ࣷ̀̕b +a֮ࣷ̀̕b +a֮ࣷ̀̕b + +à֮ࣸ̕b +à֮ࣸ̕b +à֮ࣸ̕b +à֮ࣸ̕b +à֮ࣸ̕b + +a֮ࣸ̀̕b +a֮ࣸ̀̕b +a֮ࣸ̀̕b +a֮ࣸ̀̕b +a֮ࣸ̀̕b + +a〪̖ࣹ֚b +a〪̖ࣹ֚b +a〪̖ࣹ֚b +a〪̖ࣹ֚b +a〪̖ࣹ֚b + +a〪ࣹ̖֚b +a〪ࣹ̖֚b +a〪ࣹ̖֚b +a〪ࣹ̖֚b +a〪ࣹ̖֚b + +a〪̖ࣺ֚b +a〪̖ࣺ֚b +a〪̖ࣺ֚b +a〪̖ࣺ֚b +a〪̖ࣺ֚b + +a〪ࣺ̖֚b +a〪ࣺ̖֚b +a〪ࣺ̖֚b +a〪ࣺ̖֚b +a〪ࣺ̖֚b + +à֮ࣻ̕b +à֮ࣻ̕b +à֮ࣻ̕b +à֮ࣻ̕b +à֮ࣻ̕b + +a֮ࣻ̀̕b +a֮ࣻ̀̕b +a֮ࣻ̀̕b +a֮ࣻ̀̕b +a֮ࣻ̀̕b + +à֮ࣼ̕b +à֮ࣼ̕b +à֮ࣼ̕b +à֮ࣼ̕b +à֮ࣼ̕b + +a֮ࣼ̀̕b +a֮ࣼ̀̕b +a֮ࣼ̀̕b +a֮ࣼ̀̕b +a֮ࣼ̀̕b + +à֮ࣽ̕b +à֮ࣽ̕b +à֮ࣽ̕b +à֮ࣽ̕b +à֮ࣽ̕b + +a֮ࣽ̀̕b +a֮ࣽ̀̕b +a֮ࣽ̀̕b +a֮ࣽ̀̕b +a֮ࣽ̀̕b + +à֮ࣾ̕b +à֮ࣾ̕b +à֮ࣾ̕b +à֮ࣾ̕b +à֮ࣾ̕b + +a֮ࣾ̀̕b +a֮ࣾ̀̕b +a֮ࣾ̀̕b +a֮ࣾ̀̕b +a֮ࣾ̀̕b + +à֮ࣿ̕b +à֮ࣿ̕b +à֮ࣿ̕b +à֮ࣿ̕b +à֮ࣿ̕b + +a֮ࣿ̀̕b +a֮ࣿ̀̕b +a֮ࣿ̀̕b +a֮ࣿ̀̕b +a֮ࣿ̀̕b + +a̴़़゙b +a̴़़゙b +a̴़़゙b +a̴़़゙b +a̴़़゙b + +a̴़़゙b +a̴़़゙b +a̴़़゙b +a̴़़゙b +a̴़़゙b + +a゙््ְb +a゙््ְb +a゙््ְb +a゙््ְb +a゙््ְb + +a゙््ְb +a゙््ְb +a゙््ְb +a゙््ְb +a゙््ְb + +à֮॑̕b +à֮॑̕b +à֮॑̕b +à֮॑̕b +à֮॑̕b + +a֮॑̀̕b +a֮॑̀̕b +a֮॑̀̕b +a֮॑̀̕b +a֮॑̀̕b + +a〪̖॒֚b +a〪̖॒֚b +a〪̖॒֚b +a〪̖॒֚b +a〪̖॒֚b + +a〪॒̖֚b +a〪॒̖֚b +a〪॒̖֚b +a〪॒̖֚b +a〪॒̖֚b + +à֮॓̕b +à֮॓̕b +à֮॓̕b +à֮॓̕b +à֮॓̕b + +a֮॓̀̕b +a֮॓̀̕b +a֮॓̀̕b +a֮॓̀̕b +a֮॓̀̕b + +à֮॔̕b +à֮॔̕b +à֮॔̕b +à֮॔̕b +à֮॔̕b + +a֮॔̀̕b +a֮॔̀̕b +a֮॔̀̕b +a֮॔̀̕b +a֮॔̀̕b + +a̴़়゙b +a̴़়゙b +a̴़়゙b +a̴़়゙b +a̴़়゙b + +a̴়़゙b +a̴়़゙b +a̴়़゙b +a̴়़゙b +a̴়़゙b + +a゙्্ְb +a゙्্ְb +a゙्্ְb +a゙्্ְb +a゙्্ְb + +a゙্्ְb +a゙্्ְb +a゙্्ְb +a゙্्ְb +a゙্्ְb + +a̴़਼゙b +a̴़਼゙b +a̴़਼゙b +a̴़਼゙b +a̴़਼゙b + +a̴਼़゙b +a̴਼़゙b +a̴਼़゙b +a̴਼़゙b +a̴਼़゙b + +a゙्੍ְb +a゙्੍ְb +a゙्੍ְb +a゙्੍ְb +a゙्੍ְb + +a゙੍्ְb +a゙੍्ְb +a゙੍्ְb +a゙੍्ְb +a゙੍्ְb + +a̴़઼゙b +a̴़઼゙b +a̴़઼゙b +a̴़઼゙b +a̴़઼゙b + +a̴઼़゙b +a̴઼़゙b +a̴઼़゙b +a̴઼़゙b +a̴઼़゙b + +a゙्્ְb +a゙्્ְb +a゙्્ְb +a゙्્ְb +a゙्્ְb + +a゙્्ְb +a゙્्ְb +a゙્्ְb +a゙્्ְb +a゙્्ְb + +a̴़଼゙b +a̴़଼゙b +a̴़଼゙b +a̴़଼゙b +a̴़଼゙b + +a̴଼़゙b +a̴଼़゙b +a̴଼़゙b +a̴଼़゙b +a̴଼़゙b + +a゙्୍ְb +a゙्୍ְb +a゙्୍ְb +a゙्୍ְb +a゙्୍ְb + +a゙୍्ְb +a゙୍्ְb +a゙୍्ְb +a゙୍्ְb +a゙୍्ְb + +a゙्்ְb +a゙्்ְb +a゙्்ְb +a゙्்ְb +a゙्்ְb + +a゙்्ְb +a゙்्ְb +a゙்्ְb +a゙்्ְb +a゙்्ְb + +a゙्్ְb +a゙्్ְb +a゙्్ְb +a゙्్ְb +a゙्్ְb + +a゙్्ְb +a゙్्ְb +a゙్्ְb +a゙్्ְb +a゙్्ְb + +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb + +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb +aܑౕౕౖb + +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb + +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb +aౕౖౖุb + +a̴़಼゙b +a̴़಼゙b +a̴़಼゙b +a̴़಼゙b +a̴़಼゙b + +a̴಼़゙b +a̴಼़゙b +a̴಼़゙b +a̴಼़゙b +a̴಼़゙b + +a゙्್ְb +a゙्್ְb +a゙्್ְb +a゙्್ְb +a゙्್ְb + +a゙್्ְb +a゙್्ְb +a゙್्ְb +a゙್्ְb +a゙್्ְb + +a゙्്ְb +a゙्്ְb +a゙्്ְb +a゙्്ְb +a゙्്ְb + +a゙്्ְb +a゙്्ְb +a゙്्ְb +a゙്्ְb +a゙്्ְb + +a゙्්ְb +a゙्්ְb +a゙्්ְb +a゙्්ְb +a゙्්ְb + +a゙්्ְb +a゙්्ְb +a゙්्ְb +a゙්्ְb +a゙්्ְb + +aౖุุ่b +aౖุุ่b +aౖุุ่b +aౖุุ่b +aౖุุ่b + +aౖุุ่b +aౖุุ่b +aౖุุ่b +aౖุุ่b +aౖุุ่b + +aౖุู่b +aౖุู่b +aౖุู่b +aౖุู่b +aౖุู่b + +aౖูุ่b +aౖูุ่b +aౖูุ่b +aౖูุ่b +aౖูุ่b + +a゙्ฺְb +a゙्ฺְb +a゙्ฺְb +a゙्ฺְb +a゙्ฺְb + +a゙ฺ्ְb +a゙ฺ्ְb +a゙ฺ्ְb +a゙ฺ्ְb +a゙ฺ्ְb + +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb + +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb +aุ่่ຸb + +aุ่้ຸb +aุ่้ຸb +aุ่้ຸb +aุ่้ຸb +aุ่้ຸb + +aุ้่ຸb +aุ้่ຸb +aุ้่ຸb +aุ้่ຸb +aุ้่ຸb + +aุ่๊ຸb +aุ่๊ຸb +aุ่๊ຸb +aุ่๊ຸb +aุ่๊ຸb + +aุ๊่ຸb +aุ๊่ຸb +aุ๊่ຸb +aุ๊่ຸb +aุ๊่ຸb + +aุ่๋ຸb +aุ่๋ຸb +aุ่๋ຸb +aุ่๋ຸb +aุ่๋ຸb + +aุ๋่ຸb +aุ๋่ຸb +aุ๋่ຸb +aุ๋่ຸb +aุ๋่ຸb + +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b + +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b +a่ຸຸ່b + +a่ຸູ່b +a่ຸູ່b +a่ຸູ່b +a่ຸູ່b +a่ຸູ່b + +a่ູຸ່b +a่ູຸ່b +a่ູຸ່b +a่ູຸ່b +a่ູຸ່b + +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb + +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb +aຸ່່ཱb + +aຸ່້ཱb +aຸ່້ཱb +aຸ່້ཱb +aຸ່້ཱb +aຸ່້ཱb + +aຸ້່ཱb +aຸ້່ཱb +aຸ້່ཱb +aຸ້່ཱb +aຸ້່ཱb + +aຸ່໊ཱb +aຸ່໊ཱb +aຸ່໊ཱb +aຸ່໊ཱb +aຸ່໊ཱb + +aຸ໊່ཱb +aຸ໊່ཱb +aຸ໊່ཱb +aຸ໊່ཱb +aຸ໊່ཱb + +aຸ່໋ཱb +aຸ່໋ཱb +aຸ່໋ཱb +aຸ່໋ཱb +aຸ່໋ཱb + +aຸ໋່ཱb +aຸ໋່ཱb +aຸ໋່ཱb +aຸ໋່ཱb +aຸ໋່ཱb + +a〪̖༘֚b +a〪̖༘֚b +a〪̖༘֚b +a〪̖༘֚b +a〪̖༘֚b + +a〪༘̖֚b +a〪༘̖֚b +a〪༘̖֚b +a〪༘̖֚b +a〪༘̖֚b + +a〪̖༙֚b +a〪̖༙֚b +a〪̖༙֚b +a〪̖༙֚b +a〪̖༙֚b + +a〪༙̖֚b +a〪༙̖֚b +a〪༙̖֚b +a〪༙̖֚b +a〪༙̖֚b + +a〪̖༵֚b +a〪̖༵֚b +a〪̖༵֚b +a〪̖༵֚b +a〪̖༵֚b + +a〪༵̖֚b +a〪༵̖֚b +a〪༵̖֚b +a〪༵̖֚b +a〪༵̖֚b + +a〪̖༷֚b +a〪̖༷֚b +a〪̖༷֚b +a〪̖༷֚b +a〪̖༷֚b + +a〪༷̖֚b +a〪༷̖֚b +a〪༷̖֚b +a〪༷̖֚b +a〪༷̖֚b + +a᷎̛༹〪b +a᷎̛༹〪b +a᷎̛༹〪b +a᷎̛༹〪b +a᷎̛༹〪b + +a᷎༹̛〪b +a᷎༹̛〪b +a᷎༹̛〪b +a᷎༹̛〪b +a᷎༹̛〪b + +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb + +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb +a່ཱཱིb + +aཱིིུb +aཱིིུb +aཱིིུb +aཱིིུb +aཱིིུb + +aཱིིུb +aཱིིུb +aཱིིུb +aཱིིུb +aཱིིུb + +aིུུ̡b +aིུུ̡b +aིུུ̡b +aིུུ̡b +aིུུ̡b + +aིུུ̡b +aིུུ̡b +aིུུ̡b +aིུུ̡b +aིུུ̡b + +aཱིེུb +aཱིེུb +aཱིེུb +aཱིེུb +aཱིེུb + +aཱེིུb +aཱེིུb +aཱེིུb +aཱེིུb +aཱེིུb + +aཱིཻུb +aཱིཻུb +aཱིཻུb +aཱིཻུb +aཱིཻུb + +aཱཻིུb +aཱཻིུb +aཱཻིུb +aཱཻིུb +aཱཻིུb + +aཱིོུb +aཱིོུb +aཱིོུb +aཱིོུb +aཱིོུb + +aཱོིུb +aཱོིུb +aཱོིུb +aཱོིུb +aཱོིུb + +aཱིཽུb +aཱིཽུb +aཱིཽུb +aཱིཽུb +aཱིཽུb + +aཱཽིུb +aཱཽིུb +aཱཽིུb +aཱཽིུb +aཱཽིུb + +aཱིྀུb +aཱིྀུb +aཱིྀུb +aཱིྀུb +aཱིྀུb + +aཱྀིུb +aཱྀིུb +aཱྀིུb +aཱྀིུb +aཱྀིུb + +à֮ྂ̕b +à֮ྂ̕b +à֮ྂ̕b +à֮ྂ̕b +à֮ྂ̕b + +a֮ྂ̀̕b +a֮ྂ̀̕b +a֮ྂ̀̕b +a֮ྂ̀̕b +a֮ྂ̀̕b + +à֮ྃ̕b +à֮ྃ̕b +à֮ྃ̕b +à֮ྃ̕b +à֮ྃ̕b + +a֮ྃ̀̕b +a֮ྃ̀̕b +a֮ྃ̀̕b +a֮ྃ̀̕b +a֮ྃ̀̕b + +a゙्྄ְb +a゙्྄ְb +a゙्྄ְb +a゙्྄ְb +a゙्྄ְb + +a゙྄्ְb +a゙྄्ְb +a゙྄्ְb +a゙྄्ְb +a゙྄्ְb + +à֮྆̕b +à֮྆̕b +à֮྆̕b +à֮྆̕b +à֮྆̕b + +a֮྆̀̕b +a֮྆̀̕b +a֮྆̀̕b +a֮྆̀̕b +a֮྆̀̕b + +à֮྇̕b +à֮྇̕b +à֮྇̕b +à֮྇̕b +à֮྇̕b + +a֮྇̀̕b +a֮྇̀̕b +a֮྇̀̕b +a֮྇̀̕b +a֮྇̀̕b + +a〪̖࿆֚b +a〪̖࿆֚b +a〪̖࿆֚b +a〪̖࿆֚b +a〪̖࿆֚b + +a〪࿆̖֚b +a〪࿆̖֚b +a〪࿆̖֚b +a〪࿆̖֚b +a〪࿆̖֚b + +a̴़့゙b +a̴़့゙b +a̴़့゙b +a̴़့゙b +a̴़့゙b + +a̴့़゙b +a̴့़゙b +a̴့़゙b +a̴့़゙b +a̴့़゙b + +a゙्္ְb +a゙्္ְb +a゙्္ְb +a゙्္ְb +a゙्္ְb + +a゙္्ְb +a゙္्ְb +a゙္्ְb +a゙္्ְb +a゙္्ְb + +a゙्်ְb +a゙्်ְb +a゙्်ְb +a゙्်ְb +a゙्်ְb + +a゙်्ְb +a゙်्ְb +a゙်्ְb +a゙်्ְb +a゙်्ְb + +a〪̖ႍ֚b +a〪̖ႍ֚b +a〪̖ႍ֚b +a〪̖ႍ֚b +a〪̖ႍ֚b + +a〪ႍ̖֚b +a〪ႍ̖֚b +a〪ႍ̖֚b +a〪ႍ̖֚b +a〪ႍ̖֚b + +à֮፝̕b +à֮፝̕b +à֮፝̕b +à֮፝̕b +à֮፝̕b + +a֮፝̀̕b +a֮፝̀̕b +a֮፝̀̕b +a֮፝̀̕b +a֮፝̀̕b + +à֮፞̕b +à֮፞̕b +à֮፞̕b +à֮፞̕b +à֮፞̕b + +a֮፞̀̕b +a֮፞̀̕b +a֮፞̀̕b +a֮፞̀̕b +a֮፞̀̕b + +à֮፟̕b +à֮፟̕b +à֮፟̕b +à֮፟̕b +à֮፟̕b + +a֮፟̀̕b +a֮፟̀̕b +a֮፟̀̕b +a֮፟̀̕b +a֮፟̀̕b + +a゙्᜔ְb +a゙्᜔ְb +a゙्᜔ְb +a゙्᜔ְb +a゙्᜔ְb + +a゙᜔्ְb +a゙᜔्ְb +a゙᜔्ְb +a゙᜔्ְb +a゙᜔्ְb + +a゙्᜴ְb +a゙्᜴ְb +a゙्᜴ְb +a゙्᜴ְb +a゙्᜴ְb + +a゙᜴्ְb +a゙᜴्ְb +a゙᜴्ְb +a゙᜴्ְb +a゙᜴्ְb + +a゙्្ְb +a゙्្ְb +a゙्្ְb +a゙्្ְb +a゙्្ְb + +a゙្्ְb +a゙្्ְb +a゙្्ְb +a゙្्ְb +a゙្्ְb + +à֮៝̕b +à֮៝̕b +à֮៝̕b +à֮៝̕b +à֮៝̕b + +a֮៝̀̕b +a֮៝̀̕b +a֮៝̀̕b +a֮៝̀̕b +a֮៝̀̕b + +à𝅭֮ᢩb +à𝅭֮ᢩb +à𝅭֮ᢩb +à𝅭֮ᢩb +à𝅭֮ᢩb + +à𝅭ᢩ֮b +à𝅭ᢩ֮b +à𝅭ᢩ֮b +à𝅭ᢩ֮b +à𝅭ᢩ֮b + +a̖֚᤹〮b +a̖֚᤹〮b +a̖֚᤹〮b +a̖֚᤹〮b +a̖֚᤹〮b + +a̖᤹֚〮b +a̖᤹֚〮b +a̖᤹֚〮b +a̖᤹֚〮b +a̖᤹֚〮b + +à֮᤺̕b +à֮᤺̕b +à֮᤺̕b +à֮᤺̕b +à֮᤺̕b + +a֮᤺̀̕b +a֮᤺̀̕b +a֮᤺̀̕b +a֮᤺̀̕b +a֮᤺̀̕b + +a〪̖᤻֚b +a〪̖᤻֚b +a〪̖᤻֚b +a〪̖᤻֚b +a〪̖᤻֚b + +a〪᤻̖֚b +a〪᤻̖֚b +a〪᤻̖֚b +a〪᤻̖֚b +a〪᤻̖֚b + +à֮ᨗ̕b +à֮ᨗ̕b +à֮ᨗ̕b +à֮ᨗ̕b +à֮ᨗ̕b + +a֮ᨗ̀̕b +a֮ᨗ̀̕b +a֮ᨗ̀̕b +a֮ᨗ̀̕b +a֮ᨗ̀̕b + +a〪̖ᨘ֚b +a〪̖ᨘ֚b +a〪̖ᨘ֚b +a〪̖ᨘ֚b +a〪̖ᨘ֚b + +a〪ᨘ̖֚b +a〪ᨘ̖֚b +a〪ᨘ̖֚b +a〪ᨘ̖֚b +a〪ᨘ̖֚b + +a゙्᩠ְb +a゙्᩠ְb +a゙्᩠ְb +a゙्᩠ְb +a゙्᩠ְb + +a゙᩠्ְb +a゙᩠्ְb +a゙᩠्ְb +a゙᩠्ְb +a゙᩠्ְb + +à֮᩵̕b +à֮᩵̕b +à֮᩵̕b +à֮᩵̕b +à֮᩵̕b + +a֮᩵̀̕b +a֮᩵̀̕b +a֮᩵̀̕b +a֮᩵̀̕b +a֮᩵̀̕b + +à֮᩶̕b +à֮᩶̕b +à֮᩶̕b +à֮᩶̕b +à֮᩶̕b + +a֮᩶̀̕b +a֮᩶̀̕b +a֮᩶̀̕b +a֮᩶̀̕b +a֮᩶̀̕b + +à֮᩷̕b +à֮᩷̕b +à֮᩷̕b +à֮᩷̕b +à֮᩷̕b + +a֮᩷̀̕b +a֮᩷̀̕b +a֮᩷̀̕b +a֮᩷̀̕b +a֮᩷̀̕b + +à֮᩸̕b +à֮᩸̕b +à֮᩸̕b +à֮᩸̕b +à֮᩸̕b + +a֮᩸̀̕b +a֮᩸̀̕b +a֮᩸̀̕b +a֮᩸̀̕b +a֮᩸̀̕b + +à֮᩹̕b +à֮᩹̕b +à֮᩹̕b +à֮᩹̕b +à֮᩹̕b + +a֮᩹̀̕b +a֮᩹̀̕b +a֮᩹̀̕b +a֮᩹̀̕b +a֮᩹̀̕b + +à֮᩺̕b +à֮᩺̕b +à֮᩺̕b +à֮᩺̕b +à֮᩺̕b + +a֮᩺̀̕b +a֮᩺̀̕b +a֮᩺̀̕b +a֮᩺̀̕b +a֮᩺̀̕b + +à֮᩻̕b +à֮᩻̕b +à֮᩻̕b +à֮᩻̕b +à֮᩻̕b + +a֮᩻̀̕b +a֮᩻̀̕b +a֮᩻̀̕b +a֮᩻̀̕b +a֮᩻̀̕b + +à֮᩼̕b +à֮᩼̕b +à֮᩼̕b +à֮᩼̕b +à֮᩼̕b + +a֮᩼̀̕b +a֮᩼̀̕b +a֮᩼̀̕b +a֮᩼̀̕b +a֮᩼̀̕b + +a〪̖᩿֚b +a〪̖᩿֚b +a〪̖᩿֚b +a〪̖᩿֚b +a〪̖᩿֚b + +a〪᩿̖֚b +a〪᩿̖֚b +a〪᩿̖֚b +a〪᩿̖֚b +a〪᩿̖֚b + +à֮᪰̕b +à֮᪰̕b +à֮᪰̕b +à֮᪰̕b +à֮᪰̕b + +a֮᪰̀̕b +a֮᪰̀̕b +a֮᪰̀̕b +a֮᪰̀̕b +a֮᪰̀̕b + +à֮᪱̕b +à֮᪱̕b +à֮᪱̕b +à֮᪱̕b +à֮᪱̕b + +a֮᪱̀̕b +a֮᪱̀̕b +a֮᪱̀̕b +a֮᪱̀̕b +a֮᪱̀̕b + +à֮᪲̕b +à֮᪲̕b +à֮᪲̕b +à֮᪲̕b +à֮᪲̕b + +a֮᪲̀̕b +a֮᪲̀̕b +a֮᪲̀̕b +a֮᪲̀̕b +a֮᪲̀̕b + +à֮᪳̕b +à֮᪳̕b +à֮᪳̕b +à֮᪳̕b +à֮᪳̕b + +a֮᪳̀̕b +a֮᪳̀̕b +a֮᪳̀̕b +a֮᪳̀̕b +a֮᪳̀̕b + +à֮᪴̕b +à֮᪴̕b +à֮᪴̕b +à֮᪴̕b +à֮᪴̕b + +a֮᪴̀̕b +a֮᪴̀̕b +a֮᪴̀̕b +a֮᪴̀̕b +a֮᪴̀̕b + +a〪̖᪵֚b +a〪̖᪵֚b +a〪̖᪵֚b +a〪̖᪵֚b +a〪̖᪵֚b + +a〪᪵̖֚b +a〪᪵̖֚b +a〪᪵̖֚b +a〪᪵̖֚b +a〪᪵̖֚b + +a〪̖᪶֚b +a〪̖᪶֚b +a〪̖᪶֚b +a〪̖᪶֚b +a〪̖᪶֚b + +a〪᪶̖֚b +a〪᪶̖֚b +a〪᪶̖֚b +a〪᪶̖֚b +a〪᪶̖֚b + +a〪̖᪷֚b +a〪̖᪷֚b +a〪̖᪷֚b +a〪̖᪷֚b +a〪̖᪷֚b + +a〪᪷̖֚b +a〪᪷̖֚b +a〪᪷̖֚b +a〪᪷̖֚b +a〪᪷̖֚b + +a〪̖᪸֚b +a〪̖᪸֚b +a〪̖᪸֚b +a〪̖᪸֚b +a〪̖᪸֚b + +a〪᪸̖֚b +a〪᪸̖֚b +a〪᪸̖֚b +a〪᪸̖֚b +a〪᪸̖֚b + +a〪̖᪹֚b +a〪̖᪹֚b +a〪̖᪹֚b +a〪̖᪹֚b +a〪̖᪹֚b + +a〪᪹̖֚b +a〪᪹̖֚b +a〪᪹̖֚b +a〪᪹̖֚b +a〪᪹̖֚b + +a〪̖᪺֚b +a〪̖᪺֚b +a〪̖᪺֚b +a〪̖᪺֚b +a〪̖᪺֚b + +a〪᪺̖֚b +a〪᪺̖֚b +a〪᪺̖֚b +a〪᪺̖֚b +a〪᪺̖֚b + +à֮᪻̕b +à֮᪻̕b +à֮᪻̕b +à֮᪻̕b +à֮᪻̕b + +a֮᪻̀̕b +a֮᪻̀̕b +a֮᪻̀̕b +a֮᪻̀̕b +a֮᪻̀̕b + +à֮᪼̕b +à֮᪼̕b +à֮᪼̕b +à֮᪼̕b +à֮᪼̕b + +a֮᪼̀̕b +a֮᪼̀̕b +a֮᪼̀̕b +a֮᪼̀̕b +a֮᪼̀̕b + +a〪̖᪽֚b +a〪̖᪽֚b +a〪̖᪽֚b +a〪̖᪽֚b +a〪̖᪽֚b + +a〪᪽̖֚b +a〪᪽̖֚b +a〪᪽̖֚b +a〪᪽̖֚b +a〪᪽̖֚b + +a̴़᬴゙b +a̴़᬴゙b +a̴़᬴゙b +a̴़᬴゙b +a̴़᬴゙b + +a̴᬴़゙b +a̴᬴़゙b +a̴᬴़゙b +a̴᬴़゙b +a̴᬴़゙b + +a゙्᭄ְb +a゙्᭄ְb +a゙्᭄ְb +a゙्᭄ְb +a゙्᭄ְb + +a゙᭄्ְb +a゙᭄्ְb +a゙᭄्ְb +a゙᭄्ְb +a゙᭄्ְb + +à֮᭫̕b +à֮᭫̕b +à֮᭫̕b +à֮᭫̕b +à֮᭫̕b + +a֮᭫̀̕b +a֮᭫̀̕b +a֮᭫̀̕b +a֮᭫̀̕b +a֮᭫̀̕b + +a〪̖᭬֚b +a〪̖᭬֚b +a〪̖᭬֚b +a〪̖᭬֚b +a〪̖᭬֚b + +a〪᭬̖֚b +a〪᭬̖֚b +a〪᭬̖֚b +a〪᭬̖֚b +a〪᭬̖֚b + +à֮᭭̕b +à֮᭭̕b +à֮᭭̕b +à֮᭭̕b +à֮᭭̕b + +a֮᭭̀̕b +a֮᭭̀̕b +a֮᭭̀̕b +a֮᭭̀̕b +a֮᭭̀̕b + +à֮᭮̕b +à֮᭮̕b +à֮᭮̕b +à֮᭮̕b +à֮᭮̕b + +a֮᭮̀̕b +a֮᭮̀̕b +a֮᭮̀̕b +a֮᭮̀̕b +a֮᭮̀̕b + +à֮᭯̕b +à֮᭯̕b +à֮᭯̕b +à֮᭯̕b +à֮᭯̕b + +a֮᭯̀̕b +a֮᭯̀̕b +a֮᭯̀̕b +a֮᭯̀̕b +a֮᭯̀̕b + +à֮᭰̕b +à֮᭰̕b +à֮᭰̕b +à֮᭰̕b +à֮᭰̕b + +a֮᭰̀̕b +a֮᭰̀̕b +a֮᭰̀̕b +a֮᭰̀̕b +a֮᭰̀̕b + +à֮᭱̕b +à֮᭱̕b +à֮᭱̕b +à֮᭱̕b +à֮᭱̕b + +a֮᭱̀̕b +a֮᭱̀̕b +a֮᭱̀̕b +a֮᭱̀̕b +a֮᭱̀̕b + +à֮᭲̕b +à֮᭲̕b +à֮᭲̕b +à֮᭲̕b +à֮᭲̕b + +a֮᭲̀̕b +a֮᭲̀̕b +a֮᭲̀̕b +a֮᭲̀̕b +a֮᭲̀̕b + +à֮᭳̕b +à֮᭳̕b +à֮᭳̕b +à֮᭳̕b +à֮᭳̕b + +a֮᭳̀̕b +a֮᭳̀̕b +a֮᭳̀̕b +a֮᭳̀̕b +a֮᭳̀̕b + +a゙्᮪ְb +a゙्᮪ְb +a゙्᮪ְb +a゙्᮪ְb +a゙्᮪ְb + +a゙᮪्ְb +a゙᮪्ְb +a゙᮪्ְb +a゙᮪्ְb +a゙᮪्ְb + +a゙्᮫ְb +a゙्᮫ְb +a゙्᮫ְb +a゙्᮫ְb +a゙्᮫ְb + +a゙᮫्ְb +a゙᮫्ְb +a゙᮫्ְb +a゙᮫्ְb +a゙᮫्ְb + +a̴़᯦゙b +a̴़᯦゙b +a̴़᯦゙b +a̴़᯦゙b +a̴़᯦゙b + +a̴᯦़゙b +a̴᯦़゙b +a̴᯦़゙b +a̴᯦़゙b +a̴᯦़゙b + +a゙्᯲ְb +a゙्᯲ְb +a゙्᯲ְb +a゙्᯲ְb +a゙्᯲ְb + +a゙᯲्ְb +a゙᯲्ְb +a゙᯲्ְb +a゙᯲्ְb +a゙᯲्ְb + +a゙्᯳ְb +a゙्᯳ְb +a゙्᯳ְb +a゙्᯳ְb +a゙्᯳ְb + +a゙᯳्ְb +a゙᯳्ְb +a゙᯳्ְb +a゙᯳्ְb +a゙᯳्ְb + +a̴़᰷゙b +a̴़᰷゙b +a̴़᰷゙b +a̴़᰷゙b +a̴़᰷゙b + +a̴᰷़゙b +a̴᰷़゙b +a̴᰷़゙b +a̴᰷़゙b +a̴᰷़゙b + +à֮᳐̕b +à֮᳐̕b +à֮᳐̕b +à֮᳐̕b +à֮᳐̕b + +a֮᳐̀̕b +a֮᳐̀̕b +a֮᳐̀̕b +a֮᳐̀̕b +a֮᳐̀̕b + +à֮᳑̕b +à֮᳑̕b +à֮᳑̕b +à֮᳑̕b +à֮᳑̕b + +a֮᳑̀̕b +a֮᳑̀̕b +a֮᳑̀̕b +a֮᳑̀̕b +a֮᳑̀̕b + +à֮᳒̕b +à֮᳒̕b +à֮᳒̕b +à֮᳒̕b +à֮᳒̕b + +a֮᳒̀̕b +a֮᳒̀̕b +a֮᳒̀̕b +a֮᳒̀̕b +a֮᳒̀̕b + +a̴᳔़b +a̴᳔़b +a̴᳔़b +a̴᳔़b +a̴᳔़b + +a᳔̴़b +a᳔̴़b +a᳔̴़b +a᳔̴़b +a᳔̴़b + +a〪̖᳕֚b +a〪̖᳕֚b +a〪̖᳕֚b +a〪̖᳕֚b +a〪̖᳕֚b + +a〪᳕̖֚b +a〪᳕̖֚b +a〪᳕̖֚b +a〪᳕̖֚b +a〪᳕̖֚b + +a〪̖᳖֚b +a〪̖᳖֚b +a〪̖᳖֚b +a〪̖᳖֚b +a〪̖᳖֚b + +a〪᳖̖֚b +a〪᳖̖֚b +a〪᳖̖֚b +a〪᳖̖֚b +a〪᳖̖֚b + +a〪̖᳗֚b +a〪̖᳗֚b +a〪̖᳗֚b +a〪̖᳗֚b +a〪̖᳗֚b + +a〪᳗̖֚b +a〪᳗̖֚b +a〪᳗̖֚b +a〪᳗̖֚b +a〪᳗̖֚b + +a〪̖᳘֚b +a〪̖᳘֚b +a〪̖᳘֚b +a〪̖᳘֚b +a〪̖᳘֚b + +a〪᳘̖֚b +a〪᳘̖֚b +a〪᳘̖֚b +a〪᳘̖֚b +a〪᳘̖֚b + +a〪̖᳙֚b +a〪̖᳙֚b +a〪̖᳙֚b +a〪̖᳙֚b +a〪̖᳙֚b + +a〪᳙̖֚b +a〪᳙̖֚b +a〪᳙̖֚b +a〪᳙̖֚b +a〪᳙̖֚b + +à֮᳚̕b +à֮᳚̕b +à֮᳚̕b +à֮᳚̕b +à֮᳚̕b + +a֮᳚̀̕b +a֮᳚̀̕b +a֮᳚̀̕b +a֮᳚̀̕b +a֮᳚̀̕b + +à֮᳛̕b +à֮᳛̕b +à֮᳛̕b +à֮᳛̕b +à֮᳛̕b + +a֮᳛̀̕b +a֮᳛̀̕b +a֮᳛̀̕b +a֮᳛̀̕b +a֮᳛̀̕b + +a〪̖᳜֚b +a〪̖᳜֚b +a〪̖᳜֚b +a〪̖᳜֚b +a〪̖᳜֚b + +a〪᳜̖֚b +a〪᳜̖֚b +a〪᳜̖֚b +a〪᳜̖֚b +a〪᳜̖֚b + +a〪̖᳝֚b +a〪̖᳝֚b +a〪̖᳝֚b +a〪̖᳝֚b +a〪̖᳝֚b + +a〪᳝̖֚b +a〪᳝̖֚b +a〪᳝̖֚b +a〪᳝̖֚b +a〪᳝̖֚b + +a〪̖᳞֚b +a〪̖᳞֚b +a〪̖᳞֚b +a〪̖᳞֚b +a〪̖᳞֚b + +a〪᳞̖֚b +a〪᳞̖֚b +a〪᳞̖֚b +a〪᳞̖֚b +a〪᳞̖֚b + +a〪̖᳟֚b +a〪̖᳟֚b +a〪̖᳟֚b +a〪̖᳟֚b +a〪̖᳟֚b + +a〪᳟̖֚b +a〪᳟̖֚b +a〪᳟̖֚b +a〪᳟̖֚b +a〪᳟̖֚b + +à֮᳠̕b +à֮᳠̕b +à֮᳠̕b +à֮᳠̕b +à֮᳠̕b + +a֮᳠̀̕b +a֮᳠̀̕b +a֮᳠̀̕b +a֮᳠̀̕b +a֮᳠̀̕b + +a̴᳢़b +a̴᳢़b +a̴᳢़b +a̴᳢़b +a̴᳢़b + +a᳢̴़b +a᳢̴़b +a᳢̴़b +a᳢̴़b +a᳢̴़b + +a̴᳣़b +a̴᳣़b +a̴᳣़b +a̴᳣़b +a̴᳣़b + +a᳣̴़b +a᳣̴़b +a᳣̴़b +a᳣̴़b +a᳣̴़b + +a̴᳤़b +a̴᳤़b +a̴᳤़b +a̴᳤़b +a̴᳤़b + +a᳤̴़b +a᳤̴़b +a᳤̴़b +a᳤̴़b +a᳤̴़b + +a̴᳥़b +a̴᳥़b +a̴᳥़b +a̴᳥़b +a̴᳥़b + +a᳥̴़b +a᳥̴़b +a᳥̴़b +a᳥̴़b +a᳥̴़b + +a̴᳦़b +a̴᳦़b +a̴᳦़b +a̴᳦़b +a̴᳦़b + +a᳦̴़b +a᳦̴़b +a᳦̴़b +a᳦̴़b +a᳦̴़b + +a̴᳧़b +a̴᳧़b +a̴᳧़b +a̴᳧़b +a̴᳧़b + +a᳧̴़b +a᳧̴़b +a᳧̴़b +a᳧̴़b +a᳧̴़b + +a̴᳨़b +a̴᳨़b +a̴᳨़b +a̴᳨़b +a̴᳨़b + +a᳨̴़b +a᳨̴़b +a᳨̴़b +a᳨̴़b +a᳨̴़b + +a〪̖᳭֚b +a〪̖᳭֚b +a〪̖᳭֚b +a〪̖᳭֚b +a〪̖᳭֚b + +a〪᳭̖֚b +a〪᳭̖֚b +a〪᳭̖֚b +a〪᳭̖֚b +a〪᳭̖֚b + +à֮᳴̕b +à֮᳴̕b +à֮᳴̕b +à֮᳴̕b +à֮᳴̕b + +a֮᳴̀̕b +a֮᳴̀̕b +a֮᳴̀̕b +a֮᳴̀̕b +a֮᳴̀̕b + +à֮᳸̕b +à֮᳸̕b +à֮᳸̕b +à֮᳸̕b +à֮᳸̕b + +a֮᳸̀̕b +a֮᳸̀̕b +a֮᳸̀̕b +a֮᳸̀̕b +a֮᳸̀̕b + +à֮᳹̕b +à֮᳹̕b +à֮᳹̕b +à֮᳹̕b +à֮᳹̕b + +a֮᳹̀̕b +a֮᳹̀̕b +a֮᳹̀̕b +a֮᳹̀̕b +a֮᳹̀̕b + +à֮᷀̕b +à֮᷀̕b +à֮᷀̕b +à֮᷀̕b +à֮᷀̕b + +a֮᷀̀̕b +a֮᷀̀̕b +a֮᷀̀̕b +a֮᷀̀̕b +a֮᷀̀̕b + +à֮᷁̕b +à֮᷁̕b +à֮᷁̕b +à֮᷁̕b +à֮᷁̕b + +a֮᷁̀̕b +a֮᷁̀̕b +a֮᷁̀̕b +a֮᷁̀̕b +a֮᷁̀̕b + +a〪̖᷂֚b +a〪̖᷂֚b +a〪̖᷂֚b +a〪̖᷂֚b +a〪̖᷂֚b + +a〪᷂̖֚b +a〪᷂̖֚b +a〪᷂̖֚b +a〪᷂̖֚b +a〪᷂̖֚b + +à֮᷃̕b +à֮᷃̕b +à֮᷃̕b +à֮᷃̕b +à֮᷃̕b + +a֮᷃̀̕b +a֮᷃̀̕b +a֮᷃̀̕b +a֮᷃̀̕b +a֮᷃̀̕b + +à֮᷄̕b +à֮᷄̕b +à֮᷄̕b +à֮᷄̕b +à֮᷄̕b + +a֮᷄̀̕b +a֮᷄̀̕b +a֮᷄̀̕b +a֮᷄̀̕b +a֮᷄̀̕b + +à֮᷅̕b +à֮᷅̕b +à֮᷅̕b +à֮᷅̕b +à֮᷅̕b + +a֮᷅̀̕b +a֮᷅̀̕b +a֮᷅̀̕b +a֮᷅̀̕b +a֮᷅̀̕b + +à֮᷆̕b +à֮᷆̕b +à֮᷆̕b +à֮᷆̕b +à֮᷆̕b + +a֮᷆̀̕b +a֮᷆̀̕b +a֮᷆̀̕b +a֮᷆̀̕b +a֮᷆̀̕b + +à֮᷇̕b +à֮᷇̕b +à֮᷇̕b +à֮᷇̕b +à֮᷇̕b + +a֮᷇̀̕b +a֮᷇̀̕b +a֮᷇̀̕b +a֮᷇̀̕b +a֮᷇̀̕b + +à֮᷈̕b +à֮᷈̕b +à֮᷈̕b +à֮᷈̕b +à֮᷈̕b + +a֮᷈̀̕b +a֮᷈̀̕b +a֮᷈̀̕b +a֮᷈̀̕b +a֮᷈̀̕b + +à֮᷉̕b +à֮᷉̕b +à֮᷉̕b +à֮᷉̕b +à֮᷉̕b + +a֮᷉̀̕b +a֮᷉̀̕b +a֮᷉̀̕b +a֮᷉̀̕b +a֮᷉̀̕b + +a〪̖᷊֚b +a〪̖᷊֚b +a〪̖᷊֚b +a〪̖᷊֚b +a〪̖᷊֚b + +a〪᷊̖֚b +a〪᷊̖֚b +a〪᷊̖֚b +a〪᷊̖֚b +a〪᷊̖֚b + +à֮᷋̕b +à֮᷋̕b +à֮᷋̕b +à֮᷋̕b +à֮᷋̕b + +a֮᷋̀̕b +a֮᷋̀̕b +a֮᷋̀̕b +a֮᷋̀̕b +a֮᷋̀̕b + +à֮᷌̕b +à֮᷌̕b +à֮᷌̕b +à֮᷌̕b +à֮᷌̕b + +a֮᷌̀̕b +a֮᷌̀̕b +a֮᷌̀̕b +a֮᷌̀̕b +a֮᷌̀̕b + +a͜͝᷍ͅb +a͜͝᷍ͅb +a͜͝᷍ͅb +a͜͝᷍ͅb +a͜͝᷍ͅb + +a͜᷍͝ͅb +a͜᷍͝ͅb +a͜᷍͝ͅb +a͜᷍͝ͅb +a͜᷍͝ͅb + +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b + +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b +a̡᷎᷎̛b + +a〪̖᷏֚b +a〪̖᷏֚b +a〪̖᷏֚b +a〪̖᷏֚b +a〪̖᷏֚b + +a〪᷏̖֚b +a〪᷏̖֚b +a〪᷏̖֚b +a〪᷏̖֚b +a〪᷏̖֚b + +aུ̡᷐᷎b +aུ̡᷐᷎b +aུ̡᷐᷎b +aུ̡᷐᷎b +aུ̡᷐᷎b + +aུ᷐̡᷎b +aུ᷐̡᷎b +aུ᷐̡᷎b +aུ᷐̡᷎b +aུ᷐̡᷎b + +à֮᷑̕b +à֮᷑̕b +à֮᷑̕b +à֮᷑̕b +à֮᷑̕b + +a֮᷑̀̕b +a֮᷑̀̕b +a֮᷑̀̕b +a֮᷑̀̕b +a֮᷑̀̕b + +à֮᷒̕b +à֮᷒̕b +à֮᷒̕b +à֮᷒̕b +à֮᷒̕b + +a֮᷒̀̕b +a֮᷒̀̕b +a֮᷒̀̕b +a֮᷒̀̕b +a֮᷒̀̕b + +à֮ᷓ̕b +à֮ᷓ̕b +à֮ᷓ̕b +à֮ᷓ̕b +à֮ᷓ̕b + +a֮ᷓ̀̕b +a֮ᷓ̀̕b +a֮ᷓ̀̕b +a֮ᷓ̀̕b +a֮ᷓ̀̕b + +à֮ᷔ̕b +à֮ᷔ̕b +à֮ᷔ̕b +à֮ᷔ̕b +à֮ᷔ̕b + +a֮ᷔ̀̕b +a֮ᷔ̀̕b +a֮ᷔ̀̕b +a֮ᷔ̀̕b +a֮ᷔ̀̕b + +à֮ᷕ̕b +à֮ᷕ̕b +à֮ᷕ̕b +à֮ᷕ̕b +à֮ᷕ̕b + +a֮ᷕ̀̕b +a֮ᷕ̀̕b +a֮ᷕ̀̕b +a֮ᷕ̀̕b +a֮ᷕ̀̕b + +à֮ᷖ̕b +à֮ᷖ̕b +à֮ᷖ̕b +à֮ᷖ̕b +à֮ᷖ̕b + +a֮ᷖ̀̕b +a֮ᷖ̀̕b +a֮ᷖ̀̕b +a֮ᷖ̀̕b +a֮ᷖ̀̕b + +à֮ᷗ̕b +à֮ᷗ̕b +à֮ᷗ̕b +à֮ᷗ̕b +à֮ᷗ̕b + +a֮ᷗ̀̕b +a֮ᷗ̀̕b +a֮ᷗ̀̕b +a֮ᷗ̀̕b +a֮ᷗ̀̕b + +à֮ᷘ̕b +à֮ᷘ̕b +à֮ᷘ̕b +à֮ᷘ̕b +à֮ᷘ̕b + +a֮ᷘ̀̕b +a֮ᷘ̀̕b +a֮ᷘ̀̕b +a֮ᷘ̀̕b +a֮ᷘ̀̕b + +à֮ᷙ̕b +à֮ᷙ̕b +à֮ᷙ̕b +à֮ᷙ̕b +à֮ᷙ̕b + +a֮ᷙ̀̕b +a֮ᷙ̀̕b +a֮ᷙ̀̕b +a֮ᷙ̀̕b +a֮ᷙ̀̕b + +à֮ᷚ̕b +à֮ᷚ̕b +à֮ᷚ̕b +à֮ᷚ̕b +à֮ᷚ̕b + +a֮ᷚ̀̕b +a֮ᷚ̀̕b +a֮ᷚ̀̕b +a֮ᷚ̀̕b +a֮ᷚ̀̕b + +à֮ᷛ̕b +à֮ᷛ̕b +à֮ᷛ̕b +à֮ᷛ̕b +à֮ᷛ̕b + +a֮ᷛ̀̕b +a֮ᷛ̀̕b +a֮ᷛ̀̕b +a֮ᷛ̀̕b +a֮ᷛ̀̕b + +à֮ᷜ̕b +à֮ᷜ̕b +à֮ᷜ̕b +à֮ᷜ̕b +à֮ᷜ̕b + +a֮ᷜ̀̕b +a֮ᷜ̀̕b +a֮ᷜ̀̕b +a֮ᷜ̀̕b +a֮ᷜ̀̕b + +à֮ᷝ̕b +à֮ᷝ̕b +à֮ᷝ̕b +à֮ᷝ̕b +à֮ᷝ̕b + +a֮ᷝ̀̕b +a֮ᷝ̀̕b +a֮ᷝ̀̕b +a֮ᷝ̀̕b +a֮ᷝ̀̕b + +à֮ᷞ̕b +à֮ᷞ̕b +à֮ᷞ̕b +à֮ᷞ̕b +à֮ᷞ̕b + +a֮ᷞ̀̕b +a֮ᷞ̀̕b +a֮ᷞ̀̕b +a֮ᷞ̀̕b +a֮ᷞ̀̕b + +à֮ᷟ̕b +à֮ᷟ̕b +à֮ᷟ̕b +à֮ᷟ̕b +à֮ᷟ̕b + +a֮ᷟ̀̕b +a֮ᷟ̀̕b +a֮ᷟ̀̕b +a֮ᷟ̀̕b +a֮ᷟ̀̕b + +à֮ᷠ̕b +à֮ᷠ̕b +à֮ᷠ̕b +à֮ᷠ̕b +à֮ᷠ̕b + +a֮ᷠ̀̕b +a֮ᷠ̀̕b +a֮ᷠ̀̕b +a֮ᷠ̀̕b +a֮ᷠ̀̕b + +à֮ᷡ̕b +à֮ᷡ̕b +à֮ᷡ̕b +à֮ᷡ̕b +à֮ᷡ̕b + +a֮ᷡ̀̕b +a֮ᷡ̀̕b +a֮ᷡ̀̕b +a֮ᷡ̀̕b +a֮ᷡ̀̕b + +à֮ᷢ̕b +à֮ᷢ̕b +à֮ᷢ̕b +à֮ᷢ̕b +à֮ᷢ̕b + +a֮ᷢ̀̕b +a֮ᷢ̀̕b +a֮ᷢ̀̕b +a֮ᷢ̀̕b +a֮ᷢ̀̕b + +à֮ᷣ̕b +à֮ᷣ̕b +à֮ᷣ̕b +à֮ᷣ̕b +à֮ᷣ̕b + +a֮ᷣ̀̕b +a֮ᷣ̀̕b +a֮ᷣ̀̕b +a֮ᷣ̀̕b +a֮ᷣ̀̕b + +à֮ᷤ̕b +à֮ᷤ̕b +à֮ᷤ̕b +à֮ᷤ̕b +à֮ᷤ̕b + +a֮ᷤ̀̕b +a֮ᷤ̀̕b +a֮ᷤ̀̕b +a֮ᷤ̀̕b +a֮ᷤ̀̕b + +à֮ᷥ̕b +à֮ᷥ̕b +à֮ᷥ̕b +à֮ᷥ̕b +à֮ᷥ̕b + +a֮ᷥ̀̕b +a֮ᷥ̀̕b +a֮ᷥ̀̕b +a֮ᷥ̀̕b +a֮ᷥ̀̕b + +à֮ᷦ̕b +à֮ᷦ̕b +à֮ᷦ̕b +à֮ᷦ̕b +à֮ᷦ̕b + +a֮ᷦ̀̕b +a֮ᷦ̀̕b +a֮ᷦ̀̕b +a֮ᷦ̀̕b +a֮ᷦ̀̕b + +à֮ᷧ̕b +à֮ᷧ̕b +à֮ᷧ̕b +à֮ᷧ̕b +à֮ᷧ̕b + +a֮ᷧ̀̕b +a֮ᷧ̀̕b +a֮ᷧ̀̕b +a֮ᷧ̀̕b +a֮ᷧ̀̕b + +à֮ᷨ̕b +à֮ᷨ̕b +à֮ᷨ̕b +à֮ᷨ̕b +à֮ᷨ̕b + +a֮ᷨ̀̕b +a֮ᷨ̀̕b +a֮ᷨ̀̕b +a֮ᷨ̀̕b +a֮ᷨ̀̕b + +à֮ᷩ̕b +à֮ᷩ̕b +à֮ᷩ̕b +à֮ᷩ̕b +à֮ᷩ̕b + +a֮ᷩ̀̕b +a֮ᷩ̀̕b +a֮ᷩ̀̕b +a֮ᷩ̀̕b +a֮ᷩ̀̕b + +à֮ᷪ̕b +à֮ᷪ̕b +à֮ᷪ̕b +à֮ᷪ̕b +à֮ᷪ̕b + +a֮ᷪ̀̕b +a֮ᷪ̀̕b +a֮ᷪ̀̕b +a֮ᷪ̀̕b +a֮ᷪ̀̕b + +à֮ᷫ̕b +à֮ᷫ̕b +à֮ᷫ̕b +à֮ᷫ̕b +à֮ᷫ̕b + +a֮ᷫ̀̕b +a֮ᷫ̀̕b +a֮ᷫ̀̕b +a֮ᷫ̀̕b +a֮ᷫ̀̕b + +à֮ᷬ̕b +à֮ᷬ̕b +à֮ᷬ̕b +à֮ᷬ̕b +à֮ᷬ̕b + +a֮ᷬ̀̕b +a֮ᷬ̀̕b +a֮ᷬ̀̕b +a֮ᷬ̀̕b +a֮ᷬ̀̕b + +à֮ᷭ̕b +à֮ᷭ̕b +à֮ᷭ̕b +à֮ᷭ̕b +à֮ᷭ̕b + +a֮ᷭ̀̕b +a֮ᷭ̀̕b +a֮ᷭ̀̕b +a֮ᷭ̀̕b +a֮ᷭ̀̕b + +à֮ᷮ̕b +à֮ᷮ̕b +à֮ᷮ̕b +à֮ᷮ̕b +à֮ᷮ̕b + +a֮ᷮ̀̕b +a֮ᷮ̀̕b +a֮ᷮ̀̕b +a֮ᷮ̀̕b +a֮ᷮ̀̕b + +à֮ᷯ̕b +à֮ᷯ̕b +à֮ᷯ̕b +à֮ᷯ̕b +à֮ᷯ̕b + +a֮ᷯ̀̕b +a֮ᷯ̀̕b +a֮ᷯ̀̕b +a֮ᷯ̀̕b +a֮ᷯ̀̕b + +à֮ᷰ̕b +à֮ᷰ̕b +à֮ᷰ̕b +à֮ᷰ̕b +à֮ᷰ̕b + +a֮ᷰ̀̕b +a֮ᷰ̀̕b +a֮ᷰ̀̕b +a֮ᷰ̀̕b +a֮ᷰ̀̕b + +à֮ᷱ̕b +à֮ᷱ̕b +à֮ᷱ̕b +à֮ᷱ̕b +à֮ᷱ̕b + +a֮ᷱ̀̕b +a֮ᷱ̀̕b +a֮ᷱ̀̕b +a֮ᷱ̀̕b +a֮ᷱ̀̕b + +à֮ᷲ̕b +à֮ᷲ̕b +à֮ᷲ̕b +à֮ᷲ̕b +à֮ᷲ̕b + +a֮ᷲ̀̕b +a֮ᷲ̀̕b +a֮ᷲ̀̕b +a֮ᷲ̀̕b +a֮ᷲ̀̕b + +à֮ᷳ̕b +à֮ᷳ̕b +à֮ᷳ̕b +à֮ᷳ̕b +à֮ᷳ̕b + +a֮ᷳ̀̕b +a֮ᷳ̀̕b +a֮ᷳ̀̕b +a֮ᷳ̀̕b +a֮ᷳ̀̕b + +à֮ᷴ̕b +à֮ᷴ̕b +à֮ᷴ̕b +à֮ᷴ̕b +à֮ᷴ̕b + +a֮ᷴ̀̕b +a֮ᷴ̀̕b +a֮ᷴ̀̕b +a֮ᷴ̀̕b +a֮ᷴ̀̕b + +à֮᷵̕b +à֮᷵̕b +à֮᷵̕b +à֮᷵̕b +à֮᷵̕b + +a֮᷵̀̕b +a֮᷵̀̕b +a֮᷵̀̕b +a֮᷵̀̕b +a֮᷵̀̕b + +à֮᷻̕b +à֮᷻̕b +à֮᷻̕b +à֮᷻̕b +à֮᷻̕b + +a֮᷻̀̕b +a֮᷻̀̕b +a֮᷻̀̕b +a֮᷻̀̕b +a֮᷻̀̕b + +a̕͜᷼͝b +a̕͜᷼͝b +a̕͜᷼͝b +a̕͜᷼͝b +a̕͜᷼͝b + +a̕᷼͜͝b +a̕᷼͜͝b +a̕᷼͜͝b +a̕᷼͜͝b +a̕᷼͜͝b + +a〪̖᷽֚b +a〪̖᷽֚b +a〪̖᷽֚b +a〪̖᷽֚b +a〪̖᷽֚b + +a〪᷽̖֚b +a〪᷽̖֚b +a〪᷽̖֚b +a〪᷽̖֚b +a〪᷽̖֚b + +à֮᷾̕b +à֮᷾̕b +à֮᷾̕b +à֮᷾̕b +à֮᷾̕b + +a֮᷾̀̕b +a֮᷾̀̕b +a֮᷾̀̕b +a֮᷾̀̕b +a֮᷾̀̕b + +a〪̖᷿֚b +a〪̖᷿֚b +a〪̖᷿֚b +a〪̖᷿֚b +a〪̖᷿֚b + +a〪᷿̖֚b +a〪᷿̖֚b +a〪᷿̖֚b +a〪᷿̖֚b +a〪᷿̖֚b + +à֮⃐̕b +à֮⃐̕b +à֮⃐̕b +à֮⃐̕b +à֮⃐̕b + +a֮⃐̀̕b +a֮⃐̀̕b +a֮⃐̀̕b +a֮⃐̀̕b +a֮⃐̀̕b + +à֮⃑̕b +à֮⃑̕b +à֮⃑̕b +à֮⃑̕b +à֮⃑̕b + +a֮⃑̀̕b +a֮⃑̀̕b +a֮⃑̀̕b +a֮⃑̀̕b +a֮⃑̀̕b + +a̴⃒़b +a̴⃒़b +a̴⃒़b +a̴⃒़b +a̴⃒़b + +a⃒̴़b +a⃒̴़b +a⃒̴़b +a⃒̴़b +a⃒̴़b + +a̴⃓़b +a̴⃓़b +a̴⃓़b +a̴⃓़b +a̴⃓़b + +a⃓̴़b +a⃓̴़b +a⃓̴़b +a⃓̴़b +a⃓̴़b + +à֮⃔̕b +à֮⃔̕b +à֮⃔̕b +à֮⃔̕b +à֮⃔̕b + +a֮⃔̀̕b +a֮⃔̀̕b +a֮⃔̀̕b +a֮⃔̀̕b +a֮⃔̀̕b + +à֮⃕̕b +à֮⃕̕b +à֮⃕̕b +à֮⃕̕b +à֮⃕̕b + +a֮⃕̀̕b +a֮⃕̀̕b +a֮⃕̀̕b +a֮⃕̀̕b +a֮⃕̀̕b + +à֮⃖̕b +à֮⃖̕b +à֮⃖̕b +à֮⃖̕b +à֮⃖̕b + +a֮⃖̀̕b +a֮⃖̀̕b +a֮⃖̀̕b +a֮⃖̀̕b +a֮⃖̀̕b + +à֮⃗̕b +à֮⃗̕b +à֮⃗̕b +à֮⃗̕b +à֮⃗̕b + +a֮⃗̀̕b +a֮⃗̀̕b +a֮⃗̀̕b +a֮⃗̀̕b +a֮⃗̀̕b + +a̴⃘़b +a̴⃘़b +a̴⃘़b +a̴⃘़b +a̴⃘़b + +a⃘̴़b +a⃘̴़b +a⃘̴़b +a⃘̴़b +a⃘̴़b + +a̴⃙़b +a̴⃙़b +a̴⃙़b +a̴⃙़b +a̴⃙़b + +a⃙̴़b +a⃙̴़b +a⃙̴़b +a⃙̴़b +a⃙̴़b + +a̴⃚़b +a̴⃚़b +a̴⃚़b +a̴⃚़b +a̴⃚़b + +a⃚̴़b +a⃚̴़b +a⃚̴़b +a⃚̴़b +a⃚̴़b + +à֮⃛̕b +à֮⃛̕b +à֮⃛̕b +à֮⃛̕b +à֮⃛̕b + +a֮⃛̀̕b +a֮⃛̀̕b +a֮⃛̀̕b +a֮⃛̀̕b +a֮⃛̀̕b + +à֮⃜̕b +à֮⃜̕b +à֮⃜̕b +à֮⃜̕b +à֮⃜̕b + +a֮⃜̀̕b +a֮⃜̀̕b +a֮⃜̀̕b +a֮⃜̀̕b +a֮⃜̀̕b + +à֮⃡̕b +à֮⃡̕b +à֮⃡̕b +à֮⃡̕b +à֮⃡̕b + +a֮⃡̀̕b +a֮⃡̀̕b +a֮⃡̀̕b +a֮⃡̀̕b +a֮⃡̀̕b + +a̴⃥़b +a̴⃥़b +a̴⃥़b +a̴⃥़b +a̴⃥़b + +a⃥̴़b +a⃥̴़b +a⃥̴़b +a⃥̴़b +a⃥̴़b + +a̴⃦़b +a̴⃦़b +a̴⃦़b +a̴⃦़b +a̴⃦़b + +a⃦̴़b +a⃦̴़b +a⃦̴़b +a⃦̴़b +a⃦̴़b + +à֮⃧̕b +à֮⃧̕b +à֮⃧̕b +à֮⃧̕b +à֮⃧̕b + +a֮⃧̀̕b +a֮⃧̀̕b +a֮⃧̀̕b +a֮⃧̀̕b +a֮⃧̀̕b + +a〪̖⃨֚b +a〪̖⃨֚b +a〪̖⃨֚b +a〪̖⃨֚b +a〪̖⃨֚b + +a〪⃨̖֚b +a〪⃨̖֚b +a〪⃨̖֚b +a〪⃨̖֚b +a〪⃨̖֚b + +à֮⃩̕b +à֮⃩̕b +à֮⃩̕b +à֮⃩̕b +à֮⃩̕b + +a֮⃩̀̕b +a֮⃩̀̕b +a֮⃩̀̕b +a֮⃩̀̕b +a֮⃩̀̕b + +a̴⃪़b +a̴⃪़b +a̴⃪़b +a̴⃪़b +a̴⃪़b + +a⃪̴़b +a⃪̴़b +a⃪̴़b +a⃪̴़b +a⃪̴़b + +a̴⃫़b +a̴⃫़b +a̴⃫़b +a̴⃫़b +a̴⃫़b + +a⃫̴़b +a⃫̴़b +a⃫̴़b +a⃫̴़b +a⃫̴़b + +a〪̖⃬֚b +a〪̖⃬֚b +a〪̖⃬֚b +a〪̖⃬֚b +a〪̖⃬֚b + +a〪⃬̖֚b +a〪⃬̖֚b +a〪⃬̖֚b +a〪⃬̖֚b +a〪⃬̖֚b + +a〪̖⃭֚b +a〪̖⃭֚b +a〪̖⃭֚b +a〪̖⃭֚b +a〪̖⃭֚b + +a〪⃭̖֚b +a〪⃭̖֚b +a〪⃭̖֚b +a〪⃭̖֚b +a〪⃭̖֚b + +a〪̖⃮֚b +a〪̖⃮֚b +a〪̖⃮֚b +a〪̖⃮֚b +a〪̖⃮֚b + +a〪⃮̖֚b +a〪⃮̖֚b +a〪⃮̖֚b +a〪⃮̖֚b +a〪⃮̖֚b + +a〪̖⃯֚b +a〪̖⃯֚b +a〪̖⃯֚b +a〪̖⃯֚b +a〪̖⃯֚b + +a〪⃯̖֚b +a〪⃯̖֚b +a〪⃯̖֚b +a〪⃯̖֚b +a〪⃯̖֚b + +à֮⃰̕b +à֮⃰̕b +à֮⃰̕b +à֮⃰̕b +à֮⃰̕b + +a֮⃰̀̕b +a֮⃰̀̕b +a֮⃰̀̕b +a֮⃰̀̕b +a֮⃰̀̕b + +à֮⳯̕b +à֮⳯̕b +à֮⳯̕b +à֮⳯̕b +à֮⳯̕b + +a֮⳯̀̕b +a֮⳯̀̕b +a֮⳯̀̕b +a֮⳯̀̕b +a֮⳯̀̕b + +à֮⳰̕b +à֮⳰̕b +à֮⳰̕b +à֮⳰̕b +à֮⳰̕b + +a֮⳰̀̕b +a֮⳰̀̕b +a֮⳰̀̕b +a֮⳰̀̕b +a֮⳰̀̕b + +à֮⳱̕b +à֮⳱̕b +à֮⳱̕b +à֮⳱̕b +à֮⳱̕b + +a֮⳱̀̕b +a֮⳱̀̕b +a֮⳱̀̕b +a֮⳱̀̕b +a֮⳱̀̕b + +a゙्⵿ְb +a゙्⵿ְb +a゙्⵿ְb +a゙्⵿ְb +a゙्⵿ְb + +a゙⵿्ְb +a゙⵿्ְb +a゙⵿्ְb +a゙⵿्ְb +a゙⵿्ְb + +à֮ⷠ̕b +à֮ⷠ̕b +à֮ⷠ̕b +à֮ⷠ̕b +à֮ⷠ̕b + +a֮ⷠ̀̕b +a֮ⷠ̀̕b +a֮ⷠ̀̕b +a֮ⷠ̀̕b +a֮ⷠ̀̕b + +à֮ⷡ̕b +à֮ⷡ̕b +à֮ⷡ̕b +à֮ⷡ̕b +à֮ⷡ̕b + +a֮ⷡ̀̕b +a֮ⷡ̀̕b +a֮ⷡ̀̕b +a֮ⷡ̀̕b +a֮ⷡ̀̕b + +à֮ⷢ̕b +à֮ⷢ̕b +à֮ⷢ̕b +à֮ⷢ̕b +à֮ⷢ̕b + +a֮ⷢ̀̕b +a֮ⷢ̀̕b +a֮ⷢ̀̕b +a֮ⷢ̀̕b +a֮ⷢ̀̕b + +à֮ⷣ̕b +à֮ⷣ̕b +à֮ⷣ̕b +à֮ⷣ̕b +à֮ⷣ̕b + +a֮ⷣ̀̕b +a֮ⷣ̀̕b +a֮ⷣ̀̕b +a֮ⷣ̀̕b +a֮ⷣ̀̕b + +à֮ⷤ̕b +à֮ⷤ̕b +à֮ⷤ̕b +à֮ⷤ̕b +à֮ⷤ̕b + +a֮ⷤ̀̕b +a֮ⷤ̀̕b +a֮ⷤ̀̕b +a֮ⷤ̀̕b +a֮ⷤ̀̕b + +à֮ⷥ̕b +à֮ⷥ̕b +à֮ⷥ̕b +à֮ⷥ̕b +à֮ⷥ̕b + +a֮ⷥ̀̕b +a֮ⷥ̀̕b +a֮ⷥ̀̕b +a֮ⷥ̀̕b +a֮ⷥ̀̕b + +à֮ⷦ̕b +à֮ⷦ̕b +à֮ⷦ̕b +à֮ⷦ̕b +à֮ⷦ̕b + +a֮ⷦ̀̕b +a֮ⷦ̀̕b +a֮ⷦ̀̕b +a֮ⷦ̀̕b +a֮ⷦ̀̕b + +à֮ⷧ̕b +à֮ⷧ̕b +à֮ⷧ̕b +à֮ⷧ̕b +à֮ⷧ̕b + +a֮ⷧ̀̕b +a֮ⷧ̀̕b +a֮ⷧ̀̕b +a֮ⷧ̀̕b +a֮ⷧ̀̕b + +à֮ⷨ̕b +à֮ⷨ̕b +à֮ⷨ̕b +à֮ⷨ̕b +à֮ⷨ̕b + +a֮ⷨ̀̕b +a֮ⷨ̀̕b +a֮ⷨ̀̕b +a֮ⷨ̀̕b +a֮ⷨ̀̕b + +à֮ⷩ̕b +à֮ⷩ̕b +à֮ⷩ̕b +à֮ⷩ̕b +à֮ⷩ̕b + +a֮ⷩ̀̕b +a֮ⷩ̀̕b +a֮ⷩ̀̕b +a֮ⷩ̀̕b +a֮ⷩ̀̕b + +à֮ⷪ̕b +à֮ⷪ̕b +à֮ⷪ̕b +à֮ⷪ̕b +à֮ⷪ̕b + +a֮ⷪ̀̕b +a֮ⷪ̀̕b +a֮ⷪ̀̕b +a֮ⷪ̀̕b +a֮ⷪ̀̕b + +à֮ⷫ̕b +à֮ⷫ̕b +à֮ⷫ̕b +à֮ⷫ̕b +à֮ⷫ̕b + +a֮ⷫ̀̕b +a֮ⷫ̀̕b +a֮ⷫ̀̕b +a֮ⷫ̀̕b +a֮ⷫ̀̕b + +à֮ⷬ̕b +à֮ⷬ̕b +à֮ⷬ̕b +à֮ⷬ̕b +à֮ⷬ̕b + +a֮ⷬ̀̕b +a֮ⷬ̀̕b +a֮ⷬ̀̕b +a֮ⷬ̀̕b +a֮ⷬ̀̕b + +à֮ⷭ̕b +à֮ⷭ̕b +à֮ⷭ̕b +à֮ⷭ̕b +à֮ⷭ̕b + +a֮ⷭ̀̕b +a֮ⷭ̀̕b +a֮ⷭ̀̕b +a֮ⷭ̀̕b +a֮ⷭ̀̕b + +à֮ⷮ̕b +à֮ⷮ̕b +à֮ⷮ̕b +à֮ⷮ̕b +à֮ⷮ̕b + +a֮ⷮ̀̕b +a֮ⷮ̀̕b +a֮ⷮ̀̕b +a֮ⷮ̀̕b +a֮ⷮ̀̕b + +à֮ⷯ̕b +à֮ⷯ̕b +à֮ⷯ̕b +à֮ⷯ̕b +à֮ⷯ̕b + +a֮ⷯ̀̕b +a֮ⷯ̀̕b +a֮ⷯ̀̕b +a֮ⷯ̀̕b +a֮ⷯ̀̕b + +à֮ⷰ̕b +à֮ⷰ̕b +à֮ⷰ̕b +à֮ⷰ̕b +à֮ⷰ̕b + +a֮ⷰ̀̕b +a֮ⷰ̀̕b +a֮ⷰ̀̕b +a֮ⷰ̀̕b +a֮ⷰ̀̕b + +à֮ⷱ̕b +à֮ⷱ̕b +à֮ⷱ̕b +à֮ⷱ̕b +à֮ⷱ̕b + +a֮ⷱ̀̕b +a֮ⷱ̀̕b +a֮ⷱ̀̕b +a֮ⷱ̀̕b +a֮ⷱ̀̕b + +à֮ⷲ̕b +à֮ⷲ̕b +à֮ⷲ̕b +à֮ⷲ̕b +à֮ⷲ̕b + +a֮ⷲ̀̕b +a֮ⷲ̀̕b +a֮ⷲ̀̕b +a֮ⷲ̀̕b +a֮ⷲ̀̕b + +à֮ⷳ̕b +à֮ⷳ̕b +à֮ⷳ̕b +à֮ⷳ̕b +à֮ⷳ̕b + +a֮ⷳ̀̕b +a֮ⷳ̀̕b +a֮ⷳ̀̕b +a֮ⷳ̀̕b +a֮ⷳ̀̕b + +à֮ⷴ̕b +à֮ⷴ̕b +à֮ⷴ̕b +à֮ⷴ̕b +à֮ⷴ̕b + +a֮ⷴ̀̕b +a֮ⷴ̀̕b +a֮ⷴ̀̕b +a֮ⷴ̀̕b +a֮ⷴ̀̕b + +à֮ⷵ̕b +à֮ⷵ̕b +à֮ⷵ̕b +à֮ⷵ̕b +à֮ⷵ̕b + +a֮ⷵ̀̕b +a֮ⷵ̀̕b +a֮ⷵ̀̕b +a֮ⷵ̀̕b +a֮ⷵ̀̕b + +à֮ⷶ̕b +à֮ⷶ̕b +à֮ⷶ̕b +à֮ⷶ̕b +à֮ⷶ̕b + +a֮ⷶ̀̕b +a֮ⷶ̀̕b +a֮ⷶ̀̕b +a֮ⷶ̀̕b +a֮ⷶ̀̕b + +à֮ⷷ̕b +à֮ⷷ̕b +à֮ⷷ̕b +à֮ⷷ̕b +à֮ⷷ̕b + +a֮ⷷ̀̕b +a֮ⷷ̀̕b +a֮ⷷ̀̕b +a֮ⷷ̀̕b +a֮ⷷ̀̕b + +à֮ⷸ̕b +à֮ⷸ̕b +à֮ⷸ̕b +à֮ⷸ̕b +à֮ⷸ̕b + +a֮ⷸ̀̕b +a֮ⷸ̀̕b +a֮ⷸ̀̕b +a֮ⷸ̀̕b +a֮ⷸ̀̕b + +à֮ⷹ̕b +à֮ⷹ̕b +à֮ⷹ̕b +à֮ⷹ̕b +à֮ⷹ̕b + +a֮ⷹ̀̕b +a֮ⷹ̀̕b +a֮ⷹ̀̕b +a֮ⷹ̀̕b +a֮ⷹ̀̕b + +à֮ⷺ̕b +à֮ⷺ̕b +à֮ⷺ̕b +à֮ⷺ̕b +à֮ⷺ̕b + +a֮ⷺ̀̕b +a֮ⷺ̀̕b +a֮ⷺ̀̕b +a֮ⷺ̀̕b +a֮ⷺ̀̕b + +à֮ⷻ̕b +à֮ⷻ̕b +à֮ⷻ̕b +à֮ⷻ̕b +à֮ⷻ̕b + +a֮ⷻ̀̕b +a֮ⷻ̀̕b +a֮ⷻ̀̕b +a֮ⷻ̀̕b +a֮ⷻ̀̕b + +à֮ⷼ̕b +à֮ⷼ̕b +à֮ⷼ̕b +à֮ⷼ̕b +à֮ⷼ̕b + +a֮ⷼ̀̕b +a֮ⷼ̀̕b +a֮ⷼ̀̕b +a֮ⷼ̀̕b +a֮ⷼ̀̕b + +à֮ⷽ̕b +à֮ⷽ̕b +à֮ⷽ̕b +à֮ⷽ̕b +à֮ⷽ̕b + +a֮ⷽ̀̕b +a֮ⷽ̀̕b +a֮ⷽ̀̕b +a֮ⷽ̀̕b +a֮ⷽ̀̕b + +à֮ⷾ̕b +à֮ⷾ̕b +à֮ⷾ̕b +à֮ⷾ̕b +à֮ⷾ̕b + +a֮ⷾ̀̕b +a֮ⷾ̀̕b +a֮ⷾ̀̕b +a֮ⷾ̀̕b +a֮ⷾ̀̕b + +à֮ⷿ̕b +à֮ⷿ̕b +à֮ⷿ̕b +à֮ⷿ̕b +à֮ⷿ̕b + +a֮ⷿ̀̕b +a֮ⷿ̀̕b +a֮ⷿ̀̕b +a֮ⷿ̀̕b +a֮ⷿ̀̕b + +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b + +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b +a̛〪〪̖b + +à𝅭֮〫b +à𝅭֮〫b +à𝅭֮〫b +à𝅭֮〫b +à𝅭֮〫b + +à𝅭〫֮b +à𝅭〫֮b +à𝅭〫֮b +à𝅭〫֮b +à𝅭〫֮b + +à̕〬͜b +à̕〬͜b +à̕〬͜b +à̕〬͜b +à̕〬͜b + +à〬̕͜b +à〬̕͜b +à〬̕͜b +à〬̕͜b +à〬̕͜b + +a̖֚〭〮b +a̖֚〭〮b +a̖֚〭〮b +a̖֚〭〮b +a̖֚〭〮b + +a̖〭֚〮b +a̖〭֚〮b +a̖〭֚〮b +a̖〭֚〮b +a̖〭֚〮b + +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b + +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b +a֚〮〮𝅭b + +a֚〮〯𝅭b +a֚〮〯𝅭b +a֚〮〯𝅭b +a֚〮〯𝅭b +a֚〮〯𝅭b + +a֚〯〮𝅭b +a֚〯〮𝅭b +a֚〯〮𝅭b +a֚〯〮𝅭b +a֚〯〮𝅭b + +a़゙゙्b +a़゙゙्b +a़゙゙्b +a़゙゙्b +a़゙゙्b + +a़゙゙्b +a़゙゙्b +a़゙゙्b +a़゙゙्b +a़゙゙्b + +a़゙゚्b +a़゙゚्b +a़゙゚्b +a़゙゚्b +a़゙゚्b + +a़゚゙्b +a़゚゙्b +a़゚゙्b +a़゚゙्b +a़゚゙्b + +à֮꙯̕b +à֮꙯̕b +à֮꙯̕b +à֮꙯̕b +à֮꙯̕b + +a֮꙯̀̕b +a֮꙯̀̕b +a֮꙯̀̕b +a֮꙯̀̕b +a֮꙯̀̕b + +à֮ꙴ̕b +à֮ꙴ̕b +à֮ꙴ̕b +à֮ꙴ̕b +à֮ꙴ̕b + +a֮ꙴ̀̕b +a֮ꙴ̀̕b +a֮ꙴ̀̕b +a֮ꙴ̀̕b +a֮ꙴ̀̕b + +à֮ꙵ̕b +à֮ꙵ̕b +à֮ꙵ̕b +à֮ꙵ̕b +à֮ꙵ̕b + +a֮ꙵ̀̕b +a֮ꙵ̀̕b +a֮ꙵ̀̕b +a֮ꙵ̀̕b +a֮ꙵ̀̕b + +à֮ꙶ̕b +à֮ꙶ̕b +à֮ꙶ̕b +à֮ꙶ̕b +à֮ꙶ̕b + +a֮ꙶ̀̕b +a֮ꙶ̀̕b +a֮ꙶ̀̕b +a֮ꙶ̀̕b +a֮ꙶ̀̕b + +à֮ꙷ̕b +à֮ꙷ̕b +à֮ꙷ̕b +à֮ꙷ̕b +à֮ꙷ̕b + +a֮ꙷ̀̕b +a֮ꙷ̀̕b +a֮ꙷ̀̕b +a֮ꙷ̀̕b +a֮ꙷ̀̕b + +à֮ꙸ̕b +à֮ꙸ̕b +à֮ꙸ̕b +à֮ꙸ̕b +à֮ꙸ̕b + +a֮ꙸ̀̕b +a֮ꙸ̀̕b +a֮ꙸ̀̕b +a֮ꙸ̀̕b +a֮ꙸ̀̕b + +à֮ꙹ̕b +à֮ꙹ̕b +à֮ꙹ̕b +à֮ꙹ̕b +à֮ꙹ̕b + +a֮ꙹ̀̕b +a֮ꙹ̀̕b +a֮ꙹ̀̕b +a֮ꙹ̀̕b +a֮ꙹ̀̕b + +à֮ꙺ̕b +à֮ꙺ̕b +à֮ꙺ̕b +à֮ꙺ̕b +à֮ꙺ̕b + +a֮ꙺ̀̕b +a֮ꙺ̀̕b +a֮ꙺ̀̕b +a֮ꙺ̀̕b +a֮ꙺ̀̕b + +à֮ꙻ̕b +à֮ꙻ̕b +à֮ꙻ̕b +à֮ꙻ̕b +à֮ꙻ̕b + +a֮ꙻ̀̕b +a֮ꙻ̀̕b +a֮ꙻ̀̕b +a֮ꙻ̀̕b +a֮ꙻ̀̕b + +à֮꙼̕b +à֮꙼̕b +à֮꙼̕b +à֮꙼̕b +à֮꙼̕b + +a֮꙼̀̕b +a֮꙼̀̕b +a֮꙼̀̕b +a֮꙼̀̕b +a֮꙼̀̕b + +à֮꙽̕b +à֮꙽̕b +à֮꙽̕b +à֮꙽̕b +à֮꙽̕b + +a֮꙽̀̕b +a֮꙽̀̕b +a֮꙽̀̕b +a֮꙽̀̕b +a֮꙽̀̕b + +à֮ꚞ̕b +à֮ꚞ̕b +à֮ꚞ̕b +à֮ꚞ̕b +à֮ꚞ̕b + +a֮ꚞ̀̕b +a֮ꚞ̀̕b +a֮ꚞ̀̕b +a֮ꚞ̀̕b +a֮ꚞ̀̕b + +à֮ꚟ̕b +à֮ꚟ̕b +à֮ꚟ̕b +à֮ꚟ̕b +à֮ꚟ̕b + +a֮ꚟ̀̕b +a֮ꚟ̀̕b +a֮ꚟ̀̕b +a֮ꚟ̀̕b +a֮ꚟ̀̕b + +à֮꛰̕b +à֮꛰̕b +à֮꛰̕b +à֮꛰̕b +à֮꛰̕b + +a֮꛰̀̕b +a֮꛰̀̕b +a֮꛰̀̕b +a֮꛰̀̕b +a֮꛰̀̕b + +à֮꛱̕b +à֮꛱̕b +à֮꛱̕b +à֮꛱̕b +à֮꛱̕b + +a֮꛱̀̕b +a֮꛱̀̕b +a֮꛱̀̕b +a֮꛱̀̕b +a֮꛱̀̕b + +a゙्꠆ְb +a゙्꠆ְb +a゙्꠆ְb +a゙्꠆ְb +a゙्꠆ְb + +a゙꠆्ְb +a゙꠆्ְb +a゙꠆्ְb +a゙꠆्ְb +a゙꠆्ְb + +a゙्꣄ְb +a゙्꣄ְb +a゙्꣄ְb +a゙्꣄ְb +a゙्꣄ְb + +a゙꣄्ְb +a゙꣄्ְb +a゙꣄्ְb +a゙꣄्ְb +a゙꣄्ְb + +à֮꣠̕b +à֮꣠̕b +à֮꣠̕b +à֮꣠̕b +à֮꣠̕b + +a֮꣠̀̕b +a֮꣠̀̕b +a֮꣠̀̕b +a֮꣠̀̕b +a֮꣠̀̕b + +à֮꣡̕b +à֮꣡̕b +à֮꣡̕b +à֮꣡̕b +à֮꣡̕b + +a֮꣡̀̕b +a֮꣡̀̕b +a֮꣡̀̕b +a֮꣡̀̕b +a֮꣡̀̕b + +à֮꣢̕b +à֮꣢̕b +à֮꣢̕b +à֮꣢̕b +à֮꣢̕b + +a֮꣢̀̕b +a֮꣢̀̕b +a֮꣢̀̕b +a֮꣢̀̕b +a֮꣢̀̕b + +à֮꣣̕b +à֮꣣̕b +à֮꣣̕b +à֮꣣̕b +à֮꣣̕b + +a֮꣣̀̕b +a֮꣣̀̕b +a֮꣣̀̕b +a֮꣣̀̕b +a֮꣣̀̕b + +à֮꣤̕b +à֮꣤̕b +à֮꣤̕b +à֮꣤̕b +à֮꣤̕b + +a֮꣤̀̕b +a֮꣤̀̕b +a֮꣤̀̕b +a֮꣤̀̕b +a֮꣤̀̕b + +à֮꣥̕b +à֮꣥̕b +à֮꣥̕b +à֮꣥̕b +à֮꣥̕b + +a֮꣥̀̕b +a֮꣥̀̕b +a֮꣥̀̕b +a֮꣥̀̕b +a֮꣥̀̕b + +à֮꣦̕b +à֮꣦̕b +à֮꣦̕b +à֮꣦̕b +à֮꣦̕b + +a֮꣦̀̕b +a֮꣦̀̕b +a֮꣦̀̕b +a֮꣦̀̕b +a֮꣦̀̕b + +à֮꣧̕b +à֮꣧̕b +à֮꣧̕b +à֮꣧̕b +à֮꣧̕b + +a֮꣧̀̕b +a֮꣧̀̕b +a֮꣧̀̕b +a֮꣧̀̕b +a֮꣧̀̕b + +à֮꣨̕b +à֮꣨̕b +à֮꣨̕b +à֮꣨̕b +à֮꣨̕b + +a֮꣨̀̕b +a֮꣨̀̕b +a֮꣨̀̕b +a֮꣨̀̕b +a֮꣨̀̕b + +à֮꣩̕b +à֮꣩̕b +à֮꣩̕b +à֮꣩̕b +à֮꣩̕b + +a֮꣩̀̕b +a֮꣩̀̕b +a֮꣩̀̕b +a֮꣩̀̕b +a֮꣩̀̕b + +à֮꣪̕b +à֮꣪̕b +à֮꣪̕b +à֮꣪̕b +à֮꣪̕b + +a֮꣪̀̕b +a֮꣪̀̕b +a֮꣪̀̕b +a֮꣪̀̕b +a֮꣪̀̕b + +à֮꣫̕b +à֮꣫̕b +à֮꣫̕b +à֮꣫̕b +à֮꣫̕b + +a֮꣫̀̕b +a֮꣫̀̕b +a֮꣫̀̕b +a֮꣫̀̕b +a֮꣫̀̕b + +à֮꣬̕b +à֮꣬̕b +à֮꣬̕b +à֮꣬̕b +à֮꣬̕b + +a֮꣬̀̕b +a֮꣬̀̕b +a֮꣬̀̕b +a֮꣬̀̕b +a֮꣬̀̕b + +à֮꣭̕b +à֮꣭̕b +à֮꣭̕b +à֮꣭̕b +à֮꣭̕b + +a֮꣭̀̕b +a֮꣭̀̕b +a֮꣭̀̕b +a֮꣭̀̕b +a֮꣭̀̕b + +à֮꣮̕b +à֮꣮̕b +à֮꣮̕b +à֮꣮̕b +à֮꣮̕b + +a֮꣮̀̕b +a֮꣮̀̕b +a֮꣮̀̕b +a֮꣮̀̕b +a֮꣮̀̕b + +à֮꣯̕b +à֮꣯̕b +à֮꣯̕b +à֮꣯̕b +à֮꣯̕b + +a֮꣯̀̕b +a֮꣯̀̕b +a֮꣯̀̕b +a֮꣯̀̕b +a֮꣯̀̕b + +à֮꣰̕b +à֮꣰̕b +à֮꣰̕b +à֮꣰̕b +à֮꣰̕b + +a֮꣰̀̕b +a֮꣰̀̕b +a֮꣰̀̕b +a֮꣰̀̕b +a֮꣰̀̕b + +à֮꣱̕b +à֮꣱̕b +à֮꣱̕b +à֮꣱̕b +à֮꣱̕b + +a֮꣱̀̕b +a֮꣱̀̕b +a֮꣱̀̕b +a֮꣱̀̕b +a֮꣱̀̕b + +a〪̖꤫֚b +a〪̖꤫֚b +a〪̖꤫֚b +a〪̖꤫֚b +a〪̖꤫֚b + +a〪꤫̖֚b +a〪꤫̖֚b +a〪꤫̖֚b +a〪꤫̖֚b +a〪꤫̖֚b + +a〪̖꤬֚b +a〪̖꤬֚b +a〪̖꤬֚b +a〪̖꤬֚b +a〪̖꤬֚b + +a〪꤬̖֚b +a〪꤬̖֚b +a〪꤬̖֚b +a〪꤬̖֚b +a〪꤬̖֚b + +a〪̖꤭֚b +a〪̖꤭֚b +a〪̖꤭֚b +a〪̖꤭֚b +a〪̖꤭֚b + +a〪꤭̖֚b +a〪꤭̖֚b +a〪꤭̖֚b +a〪꤭̖֚b +a〪꤭̖֚b + +a゙्꥓ְb +a゙्꥓ְb +a゙्꥓ְb +a゙्꥓ְb +a゙्꥓ְb + +a゙꥓्ְb +a゙꥓्ְb +a゙꥓्ְb +a゙꥓्ְb +a゙꥓्ְb + +a̴़꦳゙b +a̴़꦳゙b +a̴़꦳゙b +a̴़꦳゙b +a̴़꦳゙b + +a̴꦳़゙b +a̴꦳़゙b +a̴꦳़゙b +a̴꦳़゙b +a̴꦳़゙b + +a゙्꧀ְb +a゙्꧀ְb +a゙्꧀ְb +a゙्꧀ְb +a゙्꧀ְb + +a゙꧀्ְb +a゙꧀्ְb +a゙꧀्ְb +a゙꧀्ְb +a゙꧀्ְb + +à֮ꪰ̕b +à֮ꪰ̕b +à֮ꪰ̕b +à֮ꪰ̕b +à֮ꪰ̕b + +a֮ꪰ̀̕b +a֮ꪰ̀̕b +a֮ꪰ̀̕b +a֮ꪰ̀̕b +a֮ꪰ̀̕b + +à֮ꪲ̕b +à֮ꪲ̕b +à֮ꪲ̕b +à֮ꪲ̕b +à֮ꪲ̕b + +a֮ꪲ̀̕b +a֮ꪲ̀̕b +a֮ꪲ̀̕b +a֮ꪲ̀̕b +a֮ꪲ̀̕b + +à֮ꪳ̕b +à֮ꪳ̕b +à֮ꪳ̕b +à֮ꪳ̕b +à֮ꪳ̕b + +a֮ꪳ̀̕b +a֮ꪳ̀̕b +a֮ꪳ̀̕b +a֮ꪳ̀̕b +a֮ꪳ̀̕b + +a〪̖ꪴ֚b +a〪̖ꪴ֚b +a〪̖ꪴ֚b +a〪̖ꪴ֚b +a〪̖ꪴ֚b + +a〪ꪴ̖֚b +a〪ꪴ̖֚b +a〪ꪴ̖֚b +a〪ꪴ̖֚b +a〪ꪴ̖֚b + +à֮ꪷ̕b +à֮ꪷ̕b +à֮ꪷ̕b +à֮ꪷ̕b +à֮ꪷ̕b + +a֮ꪷ̀̕b +a֮ꪷ̀̕b +a֮ꪷ̀̕b +a֮ꪷ̀̕b +a֮ꪷ̀̕b + +à֮ꪸ̕b +à֮ꪸ̕b +à֮ꪸ̕b +à֮ꪸ̕b +à֮ꪸ̕b + +a֮ꪸ̀̕b +a֮ꪸ̀̕b +a֮ꪸ̀̕b +a֮ꪸ̀̕b +a֮ꪸ̀̕b + +à֮ꪾ̕b +à֮ꪾ̕b +à֮ꪾ̕b +à֮ꪾ̕b +à֮ꪾ̕b + +a֮ꪾ̀̕b +a֮ꪾ̀̕b +a֮ꪾ̀̕b +a֮ꪾ̀̕b +a֮ꪾ̀̕b + +à֮꪿̕b +à֮꪿̕b +à֮꪿̕b +à֮꪿̕b +à֮꪿̕b + +a֮꪿̀̕b +a֮꪿̀̕b +a֮꪿̀̕b +a֮꪿̀̕b +a֮꪿̀̕b + +à֮꫁̕b +à֮꫁̕b +à֮꫁̕b +à֮꫁̕b +à֮꫁̕b + +a֮꫁̀̕b +a֮꫁̀̕b +a֮꫁̀̕b +a֮꫁̀̕b +a֮꫁̀̕b + +a゙्꫶ְb +a゙्꫶ְb +a゙्꫶ְb +a゙्꫶ְb +a゙्꫶ְb + +a゙꫶्ְb +a゙꫶्ְb +a゙꫶्ְb +a゙꫶्ְb +a゙꫶्ְb + +a゙्꯭ְb +a゙्꯭ְb +a゙्꯭ְb +a゙्꯭ְb +a゙्꯭ְb + +a゙꯭्ְb +a゙꯭्ְb +a゙꯭्ְb +a゙꯭्ְb +a゙꯭्ְb + +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb + +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb +aׂﬞﬞًb + +à֮︠̕b +à֮︠̕b +à֮︠̕b +à֮︠̕b +à֮︠̕b + +a֮︠̀̕b +a֮︠̀̕b +a֮︠̀̕b +a֮︠̀̕b +a֮︠̀̕b + +à֮︡̕b +à֮︡̕b +à֮︡̕b +à֮︡̕b +à֮︡̕b + +a֮︡̀̕b +a֮︡̀̕b +a֮︡̀̕b +a֮︡̀̕b +a֮︡̀̕b + +à֮︢̕b +à֮︢̕b +à֮︢̕b +à֮︢̕b +à֮︢̕b + +a֮︢̀̕b +a֮︢̀̕b +a֮︢̀̕b +a֮︢̀̕b +a֮︢̀̕b + +à֮︣̕b +à֮︣̕b +à֮︣̕b +à֮︣̕b +à֮︣̕b + +a֮︣̀̕b +a֮︣̀̕b +a֮︣̀̕b +a֮︣̀̕b +a֮︣̀̕b + +à֮︤̕b +à֮︤̕b +à֮︤̕b +à֮︤̕b +à֮︤̕b + +a֮︤̀̕b +a֮︤̀̕b +a֮︤̀̕b +a֮︤̀̕b +a֮︤̀̕b + +à֮︥̕b +à֮︥̕b +à֮︥̕b +à֮︥̕b +à֮︥̕b + +a֮︥̀̕b +a֮︥̀̕b +a֮︥̀̕b +a֮︥̀̕b +a֮︥̀̕b + +à֮︦̕b +à֮︦̕b +à֮︦̕b +à֮︦̕b +à֮︦̕b + +a֮︦̀̕b +a֮︦̀̕b +a֮︦̀̕b +a֮︦̀̕b +a֮︦̀̕b + +a〪̖︧֚b +a〪̖︧֚b +a〪̖︧֚b +a〪̖︧֚b +a〪̖︧֚b + +a〪︧̖֚b +a〪︧̖֚b +a〪︧̖֚b +a〪︧̖֚b +a〪︧̖֚b + +a〪̖︨֚b +a〪̖︨֚b +a〪̖︨֚b +a〪̖︨֚b +a〪̖︨֚b + +a〪︨̖֚b +a〪︨̖֚b +a〪︨̖֚b +a〪︨̖֚b +a〪︨̖֚b + +a〪̖︩֚b +a〪̖︩֚b +a〪̖︩֚b +a〪̖︩֚b +a〪̖︩֚b + +a〪︩̖֚b +a〪︩̖֚b +a〪︩̖֚b +a〪︩̖֚b +a〪︩̖֚b + +a〪̖︪֚b +a〪̖︪֚b +a〪̖︪֚b +a〪̖︪֚b +a〪̖︪֚b + +a〪︪̖֚b +a〪︪̖֚b +a〪︪̖֚b +a〪︪̖֚b +a〪︪̖֚b + +a〪̖︫֚b +a〪̖︫֚b +a〪̖︫֚b +a〪̖︫֚b +a〪̖︫֚b + +a〪︫̖֚b +a〪︫̖֚b +a〪︫̖֚b +a〪︫̖֚b +a〪︫̖֚b + +a〪̖︬֚b +a〪̖︬֚b +a〪̖︬֚b +a〪̖︬֚b +a〪̖︬֚b + +a〪︬̖֚b +a〪︬̖֚b +a〪︬̖֚b +a〪︬̖֚b +a〪︬̖֚b + +a〪̖︭֚b +a〪̖︭֚b +a〪̖︭֚b +a〪̖︭֚b +a〪̖︭֚b + +a〪︭̖֚b +a〪︭̖֚b +a〪︭̖֚b +a〪︭̖֚b +a〪︭̖֚b + +à֮︮̕b +à֮︮̕b +à֮︮̕b +à֮︮̕b +à֮︮̕b + +a֮︮̀̕b +a֮︮̀̕b +a֮︮̀̕b +a֮︮̀̕b +a֮︮̀̕b + +à֮︯̕b +à֮︯̕b +à֮︯̕b +à֮︯̕b +à֮︯̕b + +a֮︯̀̕b +a֮︯̀̕b +a֮︯̀̕b +a֮︯̀̕b +a֮︯̀̕b + +a〪̖𐇽֚b +a〪̖𐇽֚b +a〪̖𐇽֚b +a〪̖𐇽֚b +a〪̖𐇽֚b + +a〪𐇽̖֚b +a〪𐇽̖֚b +a〪𐇽̖֚b +a〪𐇽̖֚b +a〪𐇽̖֚b + +a〪̖𐋠֚b +a〪̖𐋠֚b +a〪̖𐋠֚b +a〪̖𐋠֚b +a〪̖𐋠֚b + +a〪𐋠̖֚b +a〪𐋠̖֚b +a〪𐋠̖֚b +a〪𐋠̖֚b +a〪𐋠̖֚b + +à֮𐍶̕b +à֮𐍶̕b +à֮𐍶̕b +à֮𐍶̕b +à֮𐍶̕b + +a֮𐍶̀̕b +a֮𐍶̀̕b +a֮𐍶̀̕b +a֮𐍶̀̕b +a֮𐍶̀̕b + +à֮𐍷̕b +à֮𐍷̕b +à֮𐍷̕b +à֮𐍷̕b +à֮𐍷̕b + +a֮𐍷̀̕b +a֮𐍷̀̕b +a֮𐍷̀̕b +a֮𐍷̀̕b +a֮𐍷̀̕b + +à֮𐍸̕b +à֮𐍸̕b +à֮𐍸̕b +à֮𐍸̕b +à֮𐍸̕b + +a֮𐍸̀̕b +a֮𐍸̀̕b +a֮𐍸̀̕b +a֮𐍸̀̕b +a֮𐍸̀̕b + +à֮𐍹̕b +à֮𐍹̕b +à֮𐍹̕b +à֮𐍹̕b +à֮𐍹̕b + +a֮𐍹̀̕b +a֮𐍹̀̕b +a֮𐍹̀̕b +a֮𐍹̀̕b +a֮𐍹̀̕b + +à֮𐍺̕b +à֮𐍺̕b +à֮𐍺̕b +à֮𐍺̕b +à֮𐍺̕b + +a֮𐍺̀̕b +a֮𐍺̀̕b +a֮𐍺̀̕b +a֮𐍺̀̕b +a֮𐍺̀̕b + +a〪̖𐨍֚b +a〪̖𐨍֚b +a〪̖𐨍֚b +a〪̖𐨍֚b +a〪̖𐨍֚b + +a〪𐨍̖֚b +a〪𐨍̖֚b +a〪𐨍̖֚b +a〪𐨍̖֚b +a〪𐨍̖֚b + +à֮𐨏̕b +à֮𐨏̕b +à֮𐨏̕b +à֮𐨏̕b +à֮𐨏̕b + +a֮𐨏̀̕b +a֮𐨏̀̕b +a֮𐨏̀̕b +a֮𐨏̀̕b +a֮𐨏̀̕b + +à֮𐨸̕b +à֮𐨸̕b +à֮𐨸̕b +à֮𐨸̕b +à֮𐨸̕b + +a֮𐨸̀̕b +a֮𐨸̀̕b +a֮𐨸̀̕b +a֮𐨸̀̕b +a֮𐨸̀̕b + +a̴𐨹़b +a̴𐨹़b +a̴𐨹़b +a̴𐨹़b +a̴𐨹़b + +a𐨹̴़b +a𐨹̴़b +a𐨹̴़b +a𐨹̴़b +a𐨹̴़b + +a〪̖𐨺֚b +a〪̖𐨺֚b +a〪̖𐨺֚b +a〪̖𐨺֚b +a〪̖𐨺֚b + +a〪𐨺̖֚b +a〪𐨺̖֚b +a〪𐨺̖֚b +a〪𐨺̖֚b +a〪𐨺̖֚b + +a゙्𐨿ְb +a゙्𐨿ְb +a゙्𐨿ְb +a゙्𐨿ְb +a゙्𐨿ְb + +a゙𐨿्ְb +a゙𐨿्ְb +a゙𐨿्ְb +a゙𐨿्ְb +a゙𐨿्ְb + +à֮𐫥̕b +à֮𐫥̕b +à֮𐫥̕b +à֮𐫥̕b +à֮𐫥̕b + +a֮𐫥̀̕b +a֮𐫥̀̕b +a֮𐫥̀̕b +a֮𐫥̀̕b +a֮𐫥̀̕b + +a〪̖𐫦֚b +a〪̖𐫦֚b +a〪̖𐫦֚b +a〪̖𐫦֚b +a〪̖𐫦֚b + +a〪𐫦̖֚b +a〪𐫦̖֚b +a〪𐫦̖֚b +a〪𐫦̖֚b +a〪𐫦̖֚b + +a゙्𑁆ְb +a゙्𑁆ְb +a゙्𑁆ְb +a゙्𑁆ְb +a゙्𑁆ְb + +a゙𑁆्ְb +a゙𑁆्ְb +a゙𑁆्ְb +a゙𑁆्ְb +a゙𑁆्ְb + +a゙्𑁿ְb +a゙्𑁿ְb +a゙्𑁿ְb +a゙्𑁿ְb +a゙्𑁿ְb + +a゙𑁿्ְb +a゙𑁿्ְb +a゙𑁿्ְb +a゙𑁿्ְb +a゙𑁿्ְb + +a゙्𑂹ְb +a゙्𑂹ְb +a゙्𑂹ְb +a゙्𑂹ְb +a゙्𑂹ְb + +a゙𑂹्ְb +a゙𑂹्ְb +a゙𑂹्ְb +a゙𑂹्ְb +a゙𑂹्ְb + +a̴़𑂺゙b +a̴़𑂺゙b +a̴़𑂺゙b +a̴़𑂺゙b +a̴़𑂺゙b + +a̴𑂺़゙b +a̴𑂺़゙b +a̴𑂺़゙b +a̴𑂺़゙b +a̴𑂺़゙b + +à֮𑄀̕b +à֮𑄀̕b +à֮𑄀̕b +à֮𑄀̕b +à֮𑄀̕b + +a֮𑄀̀̕b +a֮𑄀̀̕b +a֮𑄀̀̕b +a֮𑄀̀̕b +a֮𑄀̀̕b + +à֮𑄁̕b +à֮𑄁̕b +à֮𑄁̕b +à֮𑄁̕b +à֮𑄁̕b + +a֮𑄁̀̕b +a֮𑄁̀̕b +a֮𑄁̀̕b +a֮𑄁̀̕b +a֮𑄁̀̕b + +à֮𑄂̕b +à֮𑄂̕b +à֮𑄂̕b +à֮𑄂̕b +à֮𑄂̕b + +a֮𑄂̀̕b +a֮𑄂̀̕b +a֮𑄂̀̕b +a֮𑄂̀̕b +a֮𑄂̀̕b + +a゙्𑄳ְb +a゙्𑄳ְb +a゙्𑄳ְb +a゙्𑄳ְb +a゙्𑄳ְb + +a゙𑄳्ְb +a゙𑄳्ְb +a゙𑄳्ְb +a゙𑄳्ְb +a゙𑄳्ְb + +a゙्𑄴ְb +a゙्𑄴ְb +a゙्𑄴ְb +a゙्𑄴ְb +a゙्𑄴ְb + +a゙𑄴्ְb +a゙𑄴्ְb +a゙𑄴्ְb +a゙𑄴्ְb +a゙𑄴्ְb + +a̴़𑅳゙b +a̴़𑅳゙b +a̴़𑅳゙b +a̴़𑅳゙b +a̴़𑅳゙b + +a̴𑅳़゙b +a̴𑅳़゙b +a̴𑅳़゙b +a̴𑅳़゙b +a̴𑅳़゙b + +a゙्𑇀ְb +a゙्𑇀ְb +a゙्𑇀ְb +a゙्𑇀ְb +a゙्𑇀ְb + +a゙𑇀्ְb +a゙𑇀्ְb +a゙𑇀्ְb +a゙𑇀्ְb +a゙𑇀्ְb + +a̴़𑇊゙b +a̴़𑇊゙b +a̴़𑇊゙b +a̴़𑇊゙b +a̴़𑇊゙b + +a̴𑇊़゙b +a̴𑇊़゙b +a̴𑇊़゙b +a̴𑇊़゙b +a̴𑇊़゙b + +a゙्𑈵ְb +a゙्𑈵ְb +a゙्𑈵ְb +a゙्𑈵ְb +a゙्𑈵ְb + +a゙𑈵्ְb +a゙𑈵्ְb +a゙𑈵्ְb +a゙𑈵्ְb +a゙𑈵्ְb + +a̴़𑈶゙b +a̴़𑈶゙b +a̴़𑈶゙b +a̴़𑈶゙b +a̴़𑈶゙b + +a̴𑈶़゙b +a̴𑈶़゙b +a̴𑈶़゙b +a̴𑈶़゙b +a̴𑈶़゙b + +a̴़𑋩゙b +a̴़𑋩゙b +a̴़𑋩゙b +a̴़𑋩゙b +a̴़𑋩゙b + +a̴𑋩़゙b +a̴𑋩़゙b +a̴𑋩़゙b +a̴𑋩़゙b +a̴𑋩़゙b + +a゙्𑋪ְb +a゙्𑋪ְb +a゙्𑋪ְb +a゙्𑋪ְb +a゙्𑋪ְb + +a゙𑋪्ְb +a゙𑋪्ְb +a゙𑋪्ְb +a゙𑋪्ְb +a゙𑋪्ְb + +a̴़𑌼゙b +a̴़𑌼゙b +a̴़𑌼゙b +a̴़𑌼゙b +a̴़𑌼゙b + +a̴𑌼़゙b +a̴𑌼़゙b +a̴𑌼़゙b +a̴𑌼़゙b +a̴𑌼़゙b + +a゙्𑍍ְb +a゙्𑍍ְb +a゙्𑍍ְb +a゙्𑍍ְb +a゙्𑍍ְb + +a゙𑍍्ְb +a゙𑍍्ְb +a゙𑍍्ְb +a゙𑍍्ְb +a゙𑍍्ְb + +à֮𑍦̕b +à֮𑍦̕b +à֮𑍦̕b +à֮𑍦̕b +à֮𑍦̕b + +a֮𑍦̀̕b +a֮𑍦̀̕b +a֮𑍦̀̕b +a֮𑍦̀̕b +a֮𑍦̀̕b + +à֮𑍧̕b +à֮𑍧̕b +à֮𑍧̕b +à֮𑍧̕b +à֮𑍧̕b + +a֮𑍧̀̕b +a֮𑍧̀̕b +a֮𑍧̀̕b +a֮𑍧̀̕b +a֮𑍧̀̕b + +à֮𑍨̕b +à֮𑍨̕b +à֮𑍨̕b +à֮𑍨̕b +à֮𑍨̕b + +a֮𑍨̀̕b +a֮𑍨̀̕b +a֮𑍨̀̕b +a֮𑍨̀̕b +a֮𑍨̀̕b + +à֮𑍩̕b +à֮𑍩̕b +à֮𑍩̕b +à֮𑍩̕b +à֮𑍩̕b + +a֮𑍩̀̕b +a֮𑍩̀̕b +a֮𑍩̀̕b +a֮𑍩̀̕b +a֮𑍩̀̕b + +à֮𑍪̕b +à֮𑍪̕b +à֮𑍪̕b +à֮𑍪̕b +à֮𑍪̕b + +a֮𑍪̀̕b +a֮𑍪̀̕b +a֮𑍪̀̕b +a֮𑍪̀̕b +a֮𑍪̀̕b + +à֮𑍫̕b +à֮𑍫̕b +à֮𑍫̕b +à֮𑍫̕b +à֮𑍫̕b + +a֮𑍫̀̕b +a֮𑍫̀̕b +a֮𑍫̀̕b +a֮𑍫̀̕b +a֮𑍫̀̕b + +à֮𑍬̕b +à֮𑍬̕b +à֮𑍬̕b +à֮𑍬̕b +à֮𑍬̕b + +a֮𑍬̀̕b +a֮𑍬̀̕b +a֮𑍬̀̕b +a֮𑍬̀̕b +a֮𑍬̀̕b + +à֮𑍰̕b +à֮𑍰̕b +à֮𑍰̕b +à֮𑍰̕b +à֮𑍰̕b + +a֮𑍰̀̕b +a֮𑍰̀̕b +a֮𑍰̀̕b +a֮𑍰̀̕b +a֮𑍰̀̕b + +à֮𑍱̕b +à֮𑍱̕b +à֮𑍱̕b +à֮𑍱̕b +à֮𑍱̕b + +a֮𑍱̀̕b +a֮𑍱̀̕b +a֮𑍱̀̕b +a֮𑍱̀̕b +a֮𑍱̀̕b + +à֮𑍲̕b +à֮𑍲̕b +à֮𑍲̕b +à֮𑍲̕b +à֮𑍲̕b + +a֮𑍲̀̕b +a֮𑍲̀̕b +a֮𑍲̀̕b +a֮𑍲̀̕b +a֮𑍲̀̕b + +à֮𑍳̕b +à֮𑍳̕b +à֮𑍳̕b +à֮𑍳̕b +à֮𑍳̕b + +a֮𑍳̀̕b +a֮𑍳̀̕b +a֮𑍳̀̕b +a֮𑍳̀̕b +a֮𑍳̀̕b + +à֮𑍴̕b +à֮𑍴̕b +à֮𑍴̕b +à֮𑍴̕b +à֮𑍴̕b + +a֮𑍴̀̕b +a֮𑍴̀̕b +a֮𑍴̀̕b +a֮𑍴̀̕b +a֮𑍴̀̕b + +a゙्𑑂ְb +a゙्𑑂ְb +a゙्𑑂ְb +a゙्𑑂ְb +a゙्𑑂ְb + +a゙𑑂्ְb +a゙𑑂्ְb +a゙𑑂्ְb +a゙𑑂्ְb +a゙𑑂्ְb + +a̴़𑑆゙b +a̴़𑑆゙b +a̴़𑑆゙b +a̴़𑑆゙b +a̴़𑑆゙b + +a̴𑑆़゙b +a̴𑑆़゙b +a̴𑑆़゙b +a̴𑑆़゙b +a̴𑑆़゙b + +a゙्𑓂ְb +a゙्𑓂ְb +a゙्𑓂ְb +a゙्𑓂ְb +a゙्𑓂ְb + +a゙𑓂्ְb +a゙𑓂्ְb +a゙𑓂्ְb +a゙𑓂्ְb +a゙𑓂्ְb + +a̴़𑓃゙b +a̴़𑓃゙b +a̴़𑓃゙b +a̴़𑓃゙b +a̴़𑓃゙b + +a̴𑓃़゙b +a̴𑓃़゙b +a̴𑓃़゙b +a̴𑓃़゙b +a̴𑓃़゙b + +a゙्𑖿ְb +a゙्𑖿ְb +a゙्𑖿ְb +a゙्𑖿ְb +a゙्𑖿ְb + +a゙𑖿्ְb +a゙𑖿्ְb +a゙𑖿्ְb +a゙𑖿्ְb +a゙𑖿्ְb + +a̴़𑗀゙b +a̴़𑗀゙b +a̴़𑗀゙b +a̴़𑗀゙b +a̴़𑗀゙b + +a̴𑗀़゙b +a̴𑗀़゙b +a̴𑗀़゙b +a̴𑗀़゙b +a̴𑗀़゙b + +a゙्𑘿ְb +a゙्𑘿ְb +a゙्𑘿ְb +a゙्𑘿ְb +a゙्𑘿ְb + +a゙𑘿्ְb +a゙𑘿्ְb +a゙𑘿्ְb +a゙𑘿्ְb +a゙𑘿्ְb + +a゙्𑚶ְb +a゙्𑚶ְb +a゙्𑚶ְb +a゙्𑚶ְb +a゙्𑚶ְb + +a゙𑚶्ְb +a゙𑚶्ְb +a゙𑚶्ְb +a゙𑚶्ְb +a゙𑚶्ְb + +a̴़𑚷゙b +a̴़𑚷゙b +a̴़𑚷゙b +a̴़𑚷゙b +a̴़𑚷゙b + +a̴𑚷़゙b +a̴𑚷़゙b +a̴𑚷़゙b +a̴𑚷़゙b +a̴𑚷़゙b + +a゙्𑜫ְb +a゙्𑜫ְb +a゙्𑜫ְb +a゙्𑜫ְb +a゙्𑜫ְb + +a゙𑜫्ְb +a゙𑜫्ְb +a゙𑜫्ְb +a゙𑜫्ְb +a゙𑜫्ְb + +a゙्𑰿ְb +a゙्𑰿ְb +a゙्𑰿ְb +a゙्𑰿ְb +a゙्𑰿ְb + +a゙𑰿्ְb +a゙𑰿्ְb +a゙𑰿्ְb +a゙𑰿्ְb +a゙𑰿्ְb + +a̴𖫰़b +a̴𖫰़b +a̴𖫰़b +a̴𖫰़b +a̴𖫰़b + +a𖫰̴़b +a𖫰̴़b +a𖫰̴़b +a𖫰̴़b +a𖫰̴़b + +a̴𖫱़b +a̴𖫱़b +a̴𖫱़b +a̴𖫱़b +a̴𖫱़b + +a𖫱̴़b +a𖫱̴़b +a𖫱̴़b +a𖫱̴़b +a𖫱̴़b + +a̴𖫲़b +a̴𖫲़b +a̴𖫲़b +a̴𖫲़b +a̴𖫲़b + +a𖫲̴़b +a𖫲̴़b +a𖫲̴़b +a𖫲̴़b +a𖫲̴़b + +a̴𖫳़b +a̴𖫳़b +a̴𖫳़b +a̴𖫳़b +a̴𖫳़b + +a𖫳̴़b +a𖫳̴़b +a𖫳̴़b +a𖫳̴़b +a𖫳̴़b + +a̴𖫴़b +a̴𖫴़b +a̴𖫴़b +a̴𖫴़b +a̴𖫴़b + +a𖫴̴़b +a𖫴̴़b +a𖫴̴़b +a𖫴̴़b +a𖫴̴़b + +à֮𖬰̕b +à֮𖬰̕b +à֮𖬰̕b +à֮𖬰̕b +à֮𖬰̕b + +a֮𖬰̀̕b +a֮𖬰̀̕b +a֮𖬰̀̕b +a֮𖬰̀̕b +a֮𖬰̀̕b + +à֮𖬱̕b +à֮𖬱̕b +à֮𖬱̕b +à֮𖬱̕b +à֮𖬱̕b + +a֮𖬱̀̕b +a֮𖬱̀̕b +a֮𖬱̀̕b +a֮𖬱̀̕b +a֮𖬱̀̕b + +à֮𖬲̕b +à֮𖬲̕b +à֮𖬲̕b +à֮𖬲̕b +à֮𖬲̕b + +a֮𖬲̀̕b +a֮𖬲̀̕b +a֮𖬲̀̕b +a֮𖬲̀̕b +a֮𖬲̀̕b + +à֮𖬳̕b +à֮𖬳̕b +à֮𖬳̕b +à֮𖬳̕b +à֮𖬳̕b + +a֮𖬳̀̕b +a֮𖬳̀̕b +a֮𖬳̀̕b +a֮𖬳̀̕b +a֮𖬳̀̕b + +à֮𖬴̕b +à֮𖬴̕b +à֮𖬴̕b +à֮𖬴̕b +à֮𖬴̕b + +a֮𖬴̀̕b +a֮𖬴̀̕b +a֮𖬴̀̕b +a֮𖬴̀̕b +a֮𖬴̀̕b + +à֮𖬵̕b +à֮𖬵̕b +à֮𖬵̕b +à֮𖬵̕b +à֮𖬵̕b + +a֮𖬵̀̕b +a֮𖬵̀̕b +a֮𖬵̀̕b +a֮𖬵̀̕b +a֮𖬵̀̕b + +à֮𖬶̕b +à֮𖬶̕b +à֮𖬶̕b +à֮𖬶̕b +à֮𖬶̕b + +a֮𖬶̀̕b +a֮𖬶̀̕b +a֮𖬶̀̕b +a֮𖬶̀̕b +a֮𖬶̀̕b + +a̴𛲞़b +a̴𛲞़b +a̴𛲞़b +a̴𛲞़b +a̴𛲞़b + +a𛲞̴़b +a𛲞̴़b +a𛲞̴़b +a𛲞̴़b +a𛲞̴़b + +a᷎̛𝅥〪b +a᷎̛𝅥〪b +a᷎̛𝅥〪b +a᷎̛𝅥〪b +a᷎̛𝅥〪b + +a᷎𝅥̛〪b +a᷎𝅥̛〪b +a᷎𝅥̛〪b +a᷎𝅥̛〪b +a᷎𝅥̛〪b + +a᷎̛𝅦〪b +a᷎̛𝅦〪b +a᷎̛𝅦〪b +a᷎̛𝅦〪b +a᷎̛𝅦〪b + +a᷎𝅦̛〪b +a᷎𝅦̛〪b +a᷎𝅦̛〪b +a᷎𝅦̛〪b +a᷎𝅦̛〪b + +a̴𝅧़b +a̴𝅧़b +a̴𝅧़b +a̴𝅧़b +a̴𝅧़b + +a𝅧̴़b +a𝅧̴़b +a𝅧̴़b +a𝅧̴़b +a𝅧̴़b + +a̴𝅨़b +a̴𝅨़b +a̴𝅨़b +a̴𝅨़b +a̴𝅨़b + +a𝅨̴़b +a𝅨̴़b +a𝅨̴़b +a𝅨̴़b +a𝅨̴़b + +a̴𝅩़b +a̴𝅩़b +a̴𝅩़b +a̴𝅩़b +a̴𝅩़b + +a𝅩̴़b +a𝅩̴़b +a𝅩̴़b +a𝅩̴़b +a𝅩̴़b + +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b + +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b +a〮𝅭𝅭֮b + +a᷎̛𝅮〪b +a᷎̛𝅮〪b +a᷎̛𝅮〪b +a᷎̛𝅮〪b +a᷎̛𝅮〪b + +a᷎𝅮̛〪b +a᷎𝅮̛〪b +a᷎𝅮̛〪b +a᷎𝅮̛〪b +a᷎𝅮̛〪b + +a᷎̛𝅯〪b +a᷎̛𝅯〪b +a᷎̛𝅯〪b +a᷎̛𝅯〪b +a᷎̛𝅯〪b + +a᷎𝅯̛〪b +a᷎𝅯̛〪b +a᷎𝅯̛〪b +a᷎𝅯̛〪b +a᷎𝅯̛〪b + +a᷎̛𝅰〪b +a᷎̛𝅰〪b +a᷎̛𝅰〪b +a᷎̛𝅰〪b +a᷎̛𝅰〪b + +a᷎𝅰̛〪b +a᷎𝅰̛〪b +a᷎𝅰̛〪b +a᷎𝅰̛〪b +a᷎𝅰̛〪b + +a᷎̛𝅱〪b +a᷎̛𝅱〪b +a᷎̛𝅱〪b +a᷎̛𝅱〪b +a᷎̛𝅱〪b + +a᷎𝅱̛〪b +a᷎𝅱̛〪b +a᷎𝅱̛〪b +a᷎𝅱̛〪b +a᷎𝅱̛〪b + +a᷎̛𝅲〪b +a᷎̛𝅲〪b +a᷎̛𝅲〪b +a᷎̛𝅲〪b +a᷎̛𝅲〪b + +a᷎𝅲̛〪b +a᷎𝅲̛〪b +a᷎𝅲̛〪b +a᷎𝅲̛〪b +a᷎𝅲̛〪b + +a〪̖𝅻֚b +a〪̖𝅻֚b +a〪̖𝅻֚b +a〪̖𝅻֚b +a〪̖𝅻֚b + +a〪𝅻̖֚b +a〪𝅻̖֚b +a〪𝅻̖֚b +a〪𝅻̖֚b +a〪𝅻̖֚b + +a〪̖𝅼֚b +a〪̖𝅼֚b +a〪̖𝅼֚b +a〪̖𝅼֚b +a〪̖𝅼֚b + +a〪𝅼̖֚b +a〪𝅼̖֚b +a〪𝅼̖֚b +a〪𝅼̖֚b +a〪𝅼̖֚b + +a〪̖𝅽֚b +a〪̖𝅽֚b +a〪̖𝅽֚b +a〪̖𝅽֚b +a〪̖𝅽֚b + +a〪𝅽̖֚b +a〪𝅽̖֚b +a〪𝅽̖֚b +a〪𝅽̖֚b +a〪𝅽̖֚b + +a〪̖𝅾֚b +a〪̖𝅾֚b +a〪̖𝅾֚b +a〪̖𝅾֚b +a〪̖𝅾֚b + +a〪𝅾̖֚b +a〪𝅾̖֚b +a〪𝅾̖֚b +a〪𝅾̖֚b +a〪𝅾̖֚b + +a〪̖𝅿֚b +a〪̖𝅿֚b +a〪̖𝅿֚b +a〪̖𝅿֚b +a〪̖𝅿֚b + +a〪𝅿̖֚b +a〪𝅿̖֚b +a〪𝅿̖֚b +a〪𝅿̖֚b +a〪𝅿̖֚b + +a〪̖𝆀֚b +a〪̖𝆀֚b +a〪̖𝆀֚b +a〪̖𝆀֚b +a〪̖𝆀֚b + +a〪𝆀̖֚b +a〪𝆀̖֚b +a〪𝆀̖֚b +a〪𝆀̖֚b +a〪𝆀̖֚b + +a〪̖𝆁֚b +a〪̖𝆁֚b +a〪̖𝆁֚b +a〪̖𝆁֚b +a〪̖𝆁֚b + +a〪𝆁̖֚b +a〪𝆁̖֚b +a〪𝆁̖֚b +a〪𝆁̖֚b +a〪𝆁̖֚b + +a〪̖𝆂֚b +a〪̖𝆂֚b +a〪̖𝆂֚b +a〪̖𝆂֚b +a〪̖𝆂֚b + +a〪𝆂̖֚b +a〪𝆂̖֚b +a〪𝆂̖֚b +a〪𝆂̖֚b +a〪𝆂̖֚b + +à֮𝆅̕b +à֮𝆅̕b +à֮𝆅̕b +à֮𝆅̕b +à֮𝆅̕b + +a֮𝆅̀̕b +a֮𝆅̀̕b +a֮𝆅̀̕b +a֮𝆅̀̕b +a֮𝆅̀̕b + +à֮𝆆̕b +à֮𝆆̕b +à֮𝆆̕b +à֮𝆆̕b +à֮𝆆̕b + +a֮𝆆̀̕b +a֮𝆆̀̕b +a֮𝆆̀̕b +a֮𝆆̀̕b +a֮𝆆̀̕b + +à֮𝆇̕b +à֮𝆇̕b +à֮𝆇̕b +à֮𝆇̕b +à֮𝆇̕b + +a֮𝆇̀̕b +a֮𝆇̀̕b +a֮𝆇̀̕b +a֮𝆇̀̕b +a֮𝆇̀̕b + +à֮𝆈̕b +à֮𝆈̕b +à֮𝆈̕b +à֮𝆈̕b +à֮𝆈̕b + +a֮𝆈̀̕b +a֮𝆈̀̕b +a֮𝆈̀̕b +a֮𝆈̀̕b +a֮𝆈̀̕b + +à֮𝆉̕b +à֮𝆉̕b +à֮𝆉̕b +à֮𝆉̕b +à֮𝆉̕b + +a֮𝆉̀̕b +a֮𝆉̀̕b +a֮𝆉̀̕b +a֮𝆉̀̕b +a֮𝆉̀̕b + +a〪̖𝆊֚b +a〪̖𝆊֚b +a〪̖𝆊֚b +a〪̖𝆊֚b +a〪̖𝆊֚b + +a〪𝆊̖֚b +a〪𝆊̖֚b +a〪𝆊̖֚b +a〪𝆊̖֚b +a〪𝆊̖֚b + +a〪̖𝆋֚b +a〪̖𝆋֚b +a〪̖𝆋֚b +a〪̖𝆋֚b +a〪̖𝆋֚b + +a〪𝆋̖֚b +a〪𝆋̖֚b +a〪𝆋̖֚b +a〪𝆋̖֚b +a〪𝆋̖֚b + +à֮𝆪̕b +à֮𝆪̕b +à֮𝆪̕b +à֮𝆪̕b +à֮𝆪̕b + +a֮𝆪̀̕b +a֮𝆪̀̕b +a֮𝆪̀̕b +a֮𝆪̀̕b +a֮𝆪̀̕b + +à֮𝆫̕b +à֮𝆫̕b +à֮𝆫̕b +à֮𝆫̕b +à֮𝆫̕b + +a֮𝆫̀̕b +a֮𝆫̀̕b +a֮𝆫̀̕b +a֮𝆫̀̕b +a֮𝆫̀̕b + +à֮𝆬̕b +à֮𝆬̕b +à֮𝆬̕b +à֮𝆬̕b +à֮𝆬̕b + +a֮𝆬̀̕b +a֮𝆬̀̕b +a֮𝆬̀̕b +a֮𝆬̀̕b +a֮𝆬̀̕b + +à֮𝆭̕b +à֮𝆭̕b +à֮𝆭̕b +à֮𝆭̕b +à֮𝆭̕b + +a֮𝆭̀̕b +a֮𝆭̀̕b +a֮𝆭̀̕b +a֮𝆭̀̕b +a֮𝆭̀̕b + +à֮𝉂̕b +à֮𝉂̕b +à֮𝉂̕b +à֮𝉂̕b +à֮𝉂̕b + +a֮𝉂̀̕b +a֮𝉂̀̕b +a֮𝉂̀̕b +a֮𝉂̀̕b +a֮𝉂̀̕b + +à֮𝉃̕b +à֮𝉃̕b +à֮𝉃̕b +à֮𝉃̕b +à֮𝉃̕b + +a֮𝉃̀̕b +a֮𝉃̀̕b +a֮𝉃̀̕b +a֮𝉃̀̕b +a֮𝉃̀̕b + +à֮𝉄̕b +à֮𝉄̕b +à֮𝉄̕b +à֮𝉄̕b +à֮𝉄̕b + +a֮𝉄̀̕b +a֮𝉄̀̕b +a֮𝉄̀̕b +a֮𝉄̀̕b +a֮𝉄̀̕b + +à֮𞀀̕b +à֮𞀀̕b +à֮𞀀̕b +à֮𞀀̕b +à֮𞀀̕b + +a֮𞀀̀̕b +a֮𞀀̀̕b +a֮𞀀̀̕b +a֮𞀀̀̕b +a֮𞀀̀̕b + +à֮𞀁̕b +à֮𞀁̕b +à֮𞀁̕b +à֮𞀁̕b +à֮𞀁̕b + +a֮𞀁̀̕b +a֮𞀁̀̕b +a֮𞀁̀̕b +a֮𞀁̀̕b +a֮𞀁̀̕b + +à֮𞀂̕b +à֮𞀂̕b +à֮𞀂̕b +à֮𞀂̕b +à֮𞀂̕b + +a֮𞀂̀̕b +a֮𞀂̀̕b +a֮𞀂̀̕b +a֮𞀂̀̕b +a֮𞀂̀̕b + +à֮𞀃̕b +à֮𞀃̕b +à֮𞀃̕b +à֮𞀃̕b +à֮𞀃̕b + +a֮𞀃̀̕b +a֮𞀃̀̕b +a֮𞀃̀̕b +a֮𞀃̀̕b +a֮𞀃̀̕b + +à֮𞀄̕b +à֮𞀄̕b +à֮𞀄̕b +à֮𞀄̕b +à֮𞀄̕b + +a֮𞀄̀̕b +a֮𞀄̀̕b +a֮𞀄̀̕b +a֮𞀄̀̕b +a֮𞀄̀̕b + +à֮𞀅̕b +à֮𞀅̕b +à֮𞀅̕b +à֮𞀅̕b +à֮𞀅̕b + +a֮𞀅̀̕b +a֮𞀅̀̕b +a֮𞀅̀̕b +a֮𞀅̀̕b +a֮𞀅̀̕b + +à֮𞀆̕b +à֮𞀆̕b +à֮𞀆̕b +à֮𞀆̕b +à֮𞀆̕b + +a֮𞀆̀̕b +a֮𞀆̀̕b +a֮𞀆̀̕b +a֮𞀆̀̕b +a֮𞀆̀̕b + +à֮𞀈̕b +à֮𞀈̕b +à֮𞀈̕b +à֮𞀈̕b +à֮𞀈̕b + +a֮𞀈̀̕b +a֮𞀈̀̕b +a֮𞀈̀̕b +a֮𞀈̀̕b +a֮𞀈̀̕b + +à֮𞀉̕b +à֮𞀉̕b +à֮𞀉̕b +à֮𞀉̕b +à֮𞀉̕b + +a֮𞀉̀̕b +a֮𞀉̀̕b +a֮𞀉̀̕b +a֮𞀉̀̕b +a֮𞀉̀̕b + +à֮𞀊̕b +à֮𞀊̕b +à֮𞀊̕b +à֮𞀊̕b +à֮𞀊̕b + +a֮𞀊̀̕b +a֮𞀊̀̕b +a֮𞀊̀̕b +a֮𞀊̀̕b +a֮𞀊̀̕b + +à֮𞀋̕b +à֮𞀋̕b +à֮𞀋̕b +à֮𞀋̕b +à֮𞀋̕b + +a֮𞀋̀̕b +a֮𞀋̀̕b +a֮𞀋̀̕b +a֮𞀋̀̕b +a֮𞀋̀̕b + +à֮𞀌̕b +à֮𞀌̕b +à֮𞀌̕b +à֮𞀌̕b +à֮𞀌̕b + +a֮𞀌̀̕b +a֮𞀌̀̕b +a֮𞀌̀̕b +a֮𞀌̀̕b +a֮𞀌̀̕b + +à֮𞀍̕b +à֮𞀍̕b +à֮𞀍̕b +à֮𞀍̕b +à֮𞀍̕b + +a֮𞀍̀̕b +a֮𞀍̀̕b +a֮𞀍̀̕b +a֮𞀍̀̕b +a֮𞀍̀̕b + +à֮𞀎̕b +à֮𞀎̕b +à֮𞀎̕b +à֮𞀎̕b +à֮𞀎̕b + +a֮𞀎̀̕b +a֮𞀎̀̕b +a֮𞀎̀̕b +a֮𞀎̀̕b +a֮𞀎̀̕b + +à֮𞀏̕b +à֮𞀏̕b +à֮𞀏̕b +à֮𞀏̕b +à֮𞀏̕b + +a֮𞀏̀̕b +a֮𞀏̀̕b +a֮𞀏̀̕b +a֮𞀏̀̕b +a֮𞀏̀̕b + +à֮𞀐̕b +à֮𞀐̕b +à֮𞀐̕b +à֮𞀐̕b +à֮𞀐̕b + +a֮𞀐̀̕b +a֮𞀐̀̕b +a֮𞀐̀̕b +a֮𞀐̀̕b +a֮𞀐̀̕b + +à֮𞀑̕b +à֮𞀑̕b +à֮𞀑̕b +à֮𞀑̕b +à֮𞀑̕b + +a֮𞀑̀̕b +a֮𞀑̀̕b +a֮𞀑̀̕b +a֮𞀑̀̕b +a֮𞀑̀̕b + +à֮𞀒̕b +à֮𞀒̕b +à֮𞀒̕b +à֮𞀒̕b +à֮𞀒̕b + +a֮𞀒̀̕b +a֮𞀒̀̕b +a֮𞀒̀̕b +a֮𞀒̀̕b +a֮𞀒̀̕b + +à֮𞀓̕b +à֮𞀓̕b +à֮𞀓̕b +à֮𞀓̕b +à֮𞀓̕b + +a֮𞀓̀̕b +a֮𞀓̀̕b +a֮𞀓̀̕b +a֮𞀓̀̕b +a֮𞀓̀̕b + +à֮𞀔̕b +à֮𞀔̕b +à֮𞀔̕b +à֮𞀔̕b +à֮𞀔̕b + +a֮𞀔̀̕b +a֮𞀔̀̕b +a֮𞀔̀̕b +a֮𞀔̀̕b +a֮𞀔̀̕b + +à֮𞀕̕b +à֮𞀕̕b +à֮𞀕̕b +à֮𞀕̕b +à֮𞀕̕b + +a֮𞀕̀̕b +a֮𞀕̀̕b +a֮𞀕̀̕b +a֮𞀕̀̕b +a֮𞀕̀̕b + +à֮𞀖̕b +à֮𞀖̕b +à֮𞀖̕b +à֮𞀖̕b +à֮𞀖̕b + +a֮𞀖̀̕b +a֮𞀖̀̕b +a֮𞀖̀̕b +a֮𞀖̀̕b +a֮𞀖̀̕b + +à֮𞀗̕b +à֮𞀗̕b +à֮𞀗̕b +à֮𞀗̕b +à֮𞀗̕b + +a֮𞀗̀̕b +a֮𞀗̀̕b +a֮𞀗̀̕b +a֮𞀗̀̕b +a֮𞀗̀̕b + +à֮𞀘̕b +à֮𞀘̕b +à֮𞀘̕b +à֮𞀘̕b +à֮𞀘̕b + +a֮𞀘̀̕b +a֮𞀘̀̕b +a֮𞀘̀̕b +a֮𞀘̀̕b +a֮𞀘̀̕b + +à֮𞀛̕b +à֮𞀛̕b +à֮𞀛̕b +à֮𞀛̕b +à֮𞀛̕b + +a֮𞀛̀̕b +a֮𞀛̀̕b +a֮𞀛̀̕b +a֮𞀛̀̕b +a֮𞀛̀̕b + +à֮𞀜̕b +à֮𞀜̕b +à֮𞀜̕b +à֮𞀜̕b +à֮𞀜̕b + +a֮𞀜̀̕b +a֮𞀜̀̕b +a֮𞀜̀̕b +a֮𞀜̀̕b +a֮𞀜̀̕b + +à֮𞀝̕b +à֮𞀝̕b +à֮𞀝̕b +à֮𞀝̕b +à֮𞀝̕b + +a֮𞀝̀̕b +a֮𞀝̀̕b +a֮𞀝̀̕b +a֮𞀝̀̕b +a֮𞀝̀̕b + +à֮𞀞̕b +à֮𞀞̕b +à֮𞀞̕b +à֮𞀞̕b +à֮𞀞̕b + +a֮𞀞̀̕b +a֮𞀞̀̕b +a֮𞀞̀̕b +a֮𞀞̀̕b +a֮𞀞̀̕b + +à֮𞀟̕b +à֮𞀟̕b +à֮𞀟̕b +à֮𞀟̕b +à֮𞀟̕b + +a֮𞀟̀̕b +a֮𞀟̀̕b +a֮𞀟̀̕b +a֮𞀟̀̕b +a֮𞀟̀̕b + +à֮𞀠̕b +à֮𞀠̕b +à֮𞀠̕b +à֮𞀠̕b +à֮𞀠̕b + +a֮𞀠̀̕b +a֮𞀠̀̕b +a֮𞀠̀̕b +a֮𞀠̀̕b +a֮𞀠̀̕b + +à֮𞀡̕b +à֮𞀡̕b +à֮𞀡̕b +à֮𞀡̕b +à֮𞀡̕b + +a֮𞀡̀̕b +a֮𞀡̀̕b +a֮𞀡̀̕b +a֮𞀡̀̕b +a֮𞀡̀̕b + +à֮𞀣̕b +à֮𞀣̕b +à֮𞀣̕b +à֮𞀣̕b +à֮𞀣̕b + +a֮𞀣̀̕b +a֮𞀣̀̕b +a֮𞀣̀̕b +a֮𞀣̀̕b +a֮𞀣̀̕b + +à֮𞀤̕b +à֮𞀤̕b +à֮𞀤̕b +à֮𞀤̕b +à֮𞀤̕b + +a֮𞀤̀̕b +a֮𞀤̀̕b +a֮𞀤̀̕b +a֮𞀤̀̕b +a֮𞀤̀̕b + +à֮𞀦̕b +à֮𞀦̕b +à֮𞀦̕b +à֮𞀦̕b +à֮𞀦̕b + +a֮𞀦̀̕b +a֮𞀦̀̕b +a֮𞀦̀̕b +a֮𞀦̀̕b +a֮𞀦̀̕b + +à֮𞀧̕b +à֮𞀧̕b +à֮𞀧̕b +à֮𞀧̕b +à֮𞀧̕b + +a֮𞀧̀̕b +a֮𞀧̀̕b +a֮𞀧̀̕b +a֮𞀧̀̕b +a֮𞀧̀̕b + +à֮𞀨̕b +à֮𞀨̕b +à֮𞀨̕b +à֮𞀨̕b +à֮𞀨̕b + +a֮𞀨̀̕b +a֮𞀨̀̕b +a֮𞀨̀̕b +a֮𞀨̀̕b +a֮𞀨̀̕b + +à֮𞀩̕b +à֮𞀩̕b +à֮𞀩̕b +à֮𞀩̕b +à֮𞀩̕b + +a֮𞀩̀̕b +a֮𞀩̀̕b +a֮𞀩̀̕b +a֮𞀩̀̕b +a֮𞀩̀̕b + +à֮𞀪̕b +à֮𞀪̕b +à֮𞀪̕b +à֮𞀪̕b +à֮𞀪̕b + +a֮𞀪̀̕b +a֮𞀪̀̕b +a֮𞀪̀̕b +a֮𞀪̀̕b +a֮𞀪̀̕b + +a〪̖𞣐֚b +a〪̖𞣐֚b +a〪̖𞣐֚b +a〪̖𞣐֚b +a〪̖𞣐֚b + +a〪𞣐̖֚b +a〪𞣐̖֚b +a〪𞣐̖֚b +a〪𞣐̖֚b +a〪𞣐̖֚b + +a〪̖𞣑֚b +a〪̖𞣑֚b +a〪̖𞣑֚b +a〪̖𞣑֚b +a〪̖𞣑֚b + +a〪𞣑̖֚b +a〪𞣑̖֚b +a〪𞣑̖֚b +a〪𞣑̖֚b +a〪𞣑̖֚b + +a〪̖𞣒֚b +a〪̖𞣒֚b +a〪̖𞣒֚b +a〪̖𞣒֚b +a〪̖𞣒֚b + +a〪𞣒̖֚b +a〪𞣒̖֚b +a〪𞣒̖֚b +a〪𞣒̖֚b +a〪𞣒̖֚b + +a〪̖𞣓֚b +a〪̖𞣓֚b +a〪̖𞣓֚b +a〪̖𞣓֚b +a〪̖𞣓֚b + +a〪𞣓̖֚b +a〪𞣓̖֚b +a〪𞣓̖֚b +a〪𞣓̖֚b +a〪𞣓̖֚b + +a〪̖𞣔֚b +a〪̖𞣔֚b +a〪̖𞣔֚b +a〪̖𞣔֚b +a〪̖𞣔֚b + +a〪𞣔̖֚b +a〪𞣔̖֚b +a〪𞣔̖֚b +a〪𞣔̖֚b +a〪𞣔̖֚b + +a〪̖𞣕֚b +a〪̖𞣕֚b +a〪̖𞣕֚b +a〪̖𞣕֚b +a〪̖𞣕֚b + +a〪𞣕̖֚b +a〪𞣕̖֚b +a〪𞣕̖֚b +a〪𞣕̖֚b +a〪𞣕̖֚b + +a〪̖𞣖֚b +a〪̖𞣖֚b +a〪̖𞣖֚b +a〪̖𞣖֚b +a〪̖𞣖֚b + +a〪𞣖̖֚b +a〪𞣖̖֚b +a〪𞣖̖֚b +a〪𞣖̖֚b +a〪𞣖̖֚b + +à֮𞥄̕b +à֮𞥄̕b +à֮𞥄̕b +à֮𞥄̕b +à֮𞥄̕b + +a֮𞥄̀̕b +a֮𞥄̀̕b +a֮𞥄̀̕b +a֮𞥄̀̕b +a֮𞥄̀̕b + +à֮𞥅̕b +à֮𞥅̕b +à֮𞥅̕b +à֮𞥅̕b +à֮𞥅̕b + +a֮𞥅̀̕b +a֮𞥅̀̕b +a֮𞥅̀̕b +a֮𞥅̀̕b +a֮𞥅̀̕b + +à֮𞥆̕b +à֮𞥆̕b +à֮𞥆̕b +à֮𞥆̕b +à֮𞥆̕b + +a֮𞥆̀̕b +a֮𞥆̀̕b +a֮𞥆̀̕b +a֮𞥆̀̕b +a֮𞥆̀̕b + +à֮𞥇̕b +à֮𞥇̕b +à֮𞥇̕b +à֮𞥇̕b +à֮𞥇̕b + +a֮𞥇̀̕b +a֮𞥇̀̕b +a֮𞥇̀̕b +a֮𞥇̀̕b +a֮𞥇̀̕b + +à֮𞥈̕b +à֮𞥈̕b +à֮𞥈̕b +à֮𞥈̕b +à֮𞥈̕b + +a֮𞥈̀̕b +a֮𞥈̀̕b +a֮𞥈̀̕b +a֮𞥈̀̕b +a֮𞥈̀̕b + +à֮𞥉̕b +à֮𞥉̕b +à֮𞥉̕b +à֮𞥉̕b +à֮𞥉̕b + +a֮𞥉̀̕b +a֮𞥉̀̕b +a֮𞥉̀̕b +a֮𞥉̀̕b +a֮𞥉̀̕b + +a̴़𞥊゙b +a̴़𞥊゙b +a̴़𞥊゙b +a̴़𞥊゙b +a̴़𞥊゙b + +a̴𞥊़゙b +a̴𞥊़゙b +a̴𞥊़゙b +a̴𞥊़゙b +a̴𞥊़゙b + +ে̴া +ে̴া +ে̴া +ে̴া +ে̴া + +ে̴ৗ +ে̴ৗ +ে̴ৗ +ে̴ৗ +ে̴ৗ + +େ̴ା +େ̴ା +େ̴ା +େ̴ା +େ̴ା + +େ̴ୖ +େ̴ୖ +େ̴ୖ +େ̴ୖ +େ̴ୖ + +େ̴ୗ +େ̴ୗ +େ̴ୗ +େ̴ୗ +େ̴ୗ + +ஒ̴ௗ +ஒ̴ௗ +ஒ̴ௗ +ஒ̴ௗ +ஒ̴ௗ + +ெ̴ா +ெ̴ா +ெ̴ா +ெ̴ா +ெ̴ா + +ெ̴ௗ +ெ̴ௗ +ெ̴ௗ +ெ̴ௗ +ெ̴ௗ + +ே̴ா +ே̴ா +ே̴ா +ே̴ா +ே̴ா + +ಿ̴ೕ +ಿ̴ೕ +ಿ̴ೕ +ಿ̴ೕ +ಿ̴ೕ + +ೆ̴ೂ +ೆ̴ೂ +ೆ̴ೂ +ೆ̴ೂ +ೆ̴ೂ + +ೆ̴ೕ +ೆ̴ೕ +ೆ̴ೕ +ೆ̴ೕ +ೆ̴ೕ + +ೆ̴ೖ +ೆ̴ೖ +ೆ̴ೖ +ೆ̴ೖ +ೆ̴ೖ + +ೊ̴ೕ +ೊ̴ೕ +ೊ̴ೕ +ೊ̴ೕ +ೊ̴ೕ + +െ̴ാ +െ̴ാ +െ̴ാ +െ̴ാ +െ̴ാ + +െ̴ൗ +െ̴ൗ +െ̴ൗ +െ̴ൗ +െ̴ൗ + +േ̴ാ +േ̴ാ +േ̴ാ +േ̴ാ +േ̴ാ + +ෙ̴ා +ෙ̴ා +ෙ̴ා +ෙ̴ා +ෙ̴ා + +ෙ̴ෟ +ෙ̴ෟ +ෙ̴ෟ +ෙ̴ෟ +ෙ̴ෟ + +ཀ̴ྵ +ཀ̴ྵ +ཀ̴ྵ +ཀ̴ྵ +ཀ̴ྵ + +ག̴ྷ +ག̴ྷ +ག̴ྷ +ག̴ྷ +ག̴ྷ + +ཌ̴ྷ +ཌ̴ྷ +ཌ̴ྷ +ཌ̴ྷ +ཌ̴ྷ + +ད̴ྷ +ད̴ྷ +ད̴ྷ +ད̴ྷ +ད̴ྷ + +བ̴ྷ +བ̴ྷ +བ̴ྷ +བ̴ྷ +བ̴ྷ + +ཛ̴ྷ +ཛ̴ྷ +ཛ̴ྷ +ཛ̴ྷ +ཛ̴ྷ + +ྐ̴ྵ +ྐ̴ྵ +ྐ̴ྵ +ྐ̴ྵ +ྐ̴ྵ + +ྒ̴ྷ +ྒ̴ྷ +ྒ̴ྷ +ྒ̴ྷ +ྒ̴ྷ + +ྜ̴ྷ +ྜ̴ྷ +ྜ̴ྷ +ྜ̴ྷ +ྜ̴ྷ + +ྡ̴ྷ +ྡ̴ྷ +ྡ̴ྷ +ྡ̴ྷ +ྡ̴ྷ + +ྦ̴ྷ +ྦ̴ྷ +ྦ̴ྷ +ྦ̴ྷ +ྦ̴ྷ + +ྫ̴ྷ +ྫ̴ྷ +ྫ̴ྷ +ྫ̴ྷ +ྫ̴ྷ + +ဥ̴ီ +ဥ̴ီ +ဥ̴ီ +ဥ̴ီ +ဥ̴ီ + +ᄀ̴ᅡ +ᄀ̴ᅡ +ᄀ̴ᅡ +ᄀ̴ᅡ +ᄀ̴ᅡ + +ᄀ̴ᅮ +ᄀ̴ᅮ +ᄀ̴ᅮ +ᄀ̴ᅮ +ᄀ̴ᅮ + +ᄁ̴ᅦ +ᄁ̴ᅦ +ᄁ̴ᅦ +ᄁ̴ᅦ +ᄁ̴ᅦ + +ᄁ̴ᅳ +ᄁ̴ᅳ +ᄁ̴ᅳ +ᄁ̴ᅳ +ᄁ̴ᅳ + +ᄂ̴ᅫ +ᄂ̴ᅫ +ᄂ̴ᅫ +ᄂ̴ᅫ +ᄂ̴ᅫ + +ᄃ̴ᅣ +ᄃ̴ᅣ +ᄃ̴ᅣ +ᄃ̴ᅣ +ᄃ̴ᅣ + +ᄃ̴ᅰ +ᄃ̴ᅰ +ᄃ̴ᅰ +ᄃ̴ᅰ +ᄃ̴ᅰ + +ᄄ̴ᅨ +ᄄ̴ᅨ +ᄄ̴ᅨ +ᄄ̴ᅨ +ᄄ̴ᅨ + +ᄄ̴ᅵ +ᄄ̴ᅵ +ᄄ̴ᅵ +ᄄ̴ᅵ +ᄄ̴ᅵ + +ᄅ̴ᅭ +ᄅ̴ᅭ +ᄅ̴ᅭ +ᄅ̴ᅭ +ᄅ̴ᅭ + +ᄆ̴ᅥ +ᄆ̴ᅥ +ᄆ̴ᅥ +ᄆ̴ᅥ +ᄆ̴ᅥ + +ᄆ̴ᅲ +ᄆ̴ᅲ +ᄆ̴ᅲ +ᄆ̴ᅲ +ᄆ̴ᅲ + +ᄇ̴ᅪ +ᄇ̴ᅪ +ᄇ̴ᅪ +ᄇ̴ᅪ +ᄇ̴ᅪ + +ᄈ̴ᅢ +ᄈ̴ᅢ +ᄈ̴ᅢ +ᄈ̴ᅢ +ᄈ̴ᅢ + +ᄈ̴ᅯ +ᄈ̴ᅯ +ᄈ̴ᅯ +ᄈ̴ᅯ +ᄈ̴ᅯ + +ᄉ̴ᅧ +ᄉ̴ᅧ +ᄉ̴ᅧ +ᄉ̴ᅧ +ᄉ̴ᅧ + +ᄉ̴ᅴ +ᄉ̴ᅴ +ᄉ̴ᅴ +ᄉ̴ᅴ +ᄉ̴ᅴ + +ᄊ̴ᅬ +ᄊ̴ᅬ +ᄊ̴ᅬ +ᄊ̴ᅬ +ᄊ̴ᅬ + +ᄋ̴ᅤ +ᄋ̴ᅤ +ᄋ̴ᅤ +ᄋ̴ᅤ +ᄋ̴ᅤ + +ᄋ̴ᅱ +ᄋ̴ᅱ +ᄋ̴ᅱ +ᄋ̴ᅱ +ᄋ̴ᅱ + +ᄌ̴ᅩ +ᄌ̴ᅩ +ᄌ̴ᅩ +ᄌ̴ᅩ +ᄌ̴ᅩ + +ᄍ̴ᅡ +ᄍ̴ᅡ +ᄍ̴ᅡ +ᄍ̴ᅡ +ᄍ̴ᅡ + +ᄍ̴ᅮ +ᄍ̴ᅮ +ᄍ̴ᅮ +ᄍ̴ᅮ +ᄍ̴ᅮ + +ᄎ̴ᅦ +ᄎ̴ᅦ +ᄎ̴ᅦ +ᄎ̴ᅦ +ᄎ̴ᅦ + +ᄎ̴ᅳ +ᄎ̴ᅳ +ᄎ̴ᅳ +ᄎ̴ᅳ +ᄎ̴ᅳ + +ᄏ̴ᅫ +ᄏ̴ᅫ +ᄏ̴ᅫ +ᄏ̴ᅫ +ᄏ̴ᅫ + +ᄐ̴ᅣ +ᄐ̴ᅣ +ᄐ̴ᅣ +ᄐ̴ᅣ +ᄐ̴ᅣ + +ᄐ̴ᅰ +ᄐ̴ᅰ +ᄐ̴ᅰ +ᄐ̴ᅰ +ᄐ̴ᅰ + +ᄑ̴ᅨ +ᄑ̴ᅨ +ᄑ̴ᅨ +ᄑ̴ᅨ +ᄑ̴ᅨ + +ᄑ̴ᅵ +ᄑ̴ᅵ +ᄑ̴ᅵ +ᄑ̴ᅵ +ᄑ̴ᅵ + +ᄒ̴ᅭ +ᄒ̴ᅭ +ᄒ̴ᅭ +ᄒ̴ᅭ +ᄒ̴ᅭ + +ᬅ̴ᬵ +ᬅ̴ᬵ +ᬅ̴ᬵ +ᬅ̴ᬵ +ᬅ̴ᬵ + +ᬇ̴ᬵ +ᬇ̴ᬵ +ᬇ̴ᬵ +ᬇ̴ᬵ +ᬇ̴ᬵ + +ᬉ̴ᬵ +ᬉ̴ᬵ +ᬉ̴ᬵ +ᬉ̴ᬵ +ᬉ̴ᬵ + +ᬋ̴ᬵ +ᬋ̴ᬵ +ᬋ̴ᬵ +ᬋ̴ᬵ +ᬋ̴ᬵ + +ᬍ̴ᬵ +ᬍ̴ᬵ +ᬍ̴ᬵ +ᬍ̴ᬵ +ᬍ̴ᬵ + +ᬑ̴ᬵ +ᬑ̴ᬵ +ᬑ̴ᬵ +ᬑ̴ᬵ +ᬑ̴ᬵ + +ᬺ̴ᬵ +ᬺ̴ᬵ +ᬺ̴ᬵ +ᬺ̴ᬵ +ᬺ̴ᬵ + +ᬼ̴ᬵ +ᬼ̴ᬵ +ᬼ̴ᬵ +ᬼ̴ᬵ +ᬼ̴ᬵ + +ᬾ̴ᬵ +ᬾ̴ᬵ +ᬾ̴ᬵ +ᬾ̴ᬵ +ᬾ̴ᬵ + +ᬿ̴ᬵ +ᬿ̴ᬵ +ᬿ̴ᬵ +ᬿ̴ᬵ +ᬿ̴ᬵ + +ᭂ̴ᬵ +ᭂ̴ᬵ +ᭂ̴ᬵ +ᭂ̴ᬵ +ᭂ̴ᬵ + +걔̴ᆮ +걔̴ᆮ +걔̴ᆮ +걔̴ᆮ +걔̴ᆮ + +겨̴ᆵ +겨̴ᆵ +겨̴ᆵ +겨̴ᆵ +겨̴ᆵ + +과̴ᆼ +과̴ᆼ +과̴ᆼ +과̴ᆼ +과̴ᆼ + +귀̴ᆮ +귀̴ᆮ +귀̴ᆮ +귀̴ᆮ +귀̴ᆮ + +긔̴ᆵ +긔̴ᆵ +긔̴ᆵ +긔̴ᆵ +긔̴ᆵ + +깨̴ᆼ +깨̴ᆼ +깨̴ᆼ +깨̴ᆼ +깨̴ᆼ + +꼬̴ᆮ +꼬̴ᆮ +꼬̴ᆮ +꼬̴ᆮ +꼬̴ᆮ + +꾀̴ᆵ +꾀̴ᆵ +꾀̴ᆵ +꾀̴ᆵ +꾀̴ᆵ + +꿔̴ᆼ +꿔̴ᆼ +꿔̴ᆼ +꿔̴ᆼ +꿔̴ᆼ + +나̴ᆮ +나̴ᆮ +나̴ᆮ +나̴ᆮ +나̴ᆮ + +냬̴ᆵ +냬̴ᆵ +냬̴ᆵ +냬̴ᆵ +냬̴ᆵ + +녀̴ᆼ +녀̴ᆼ +녀̴ᆼ +녀̴ᆼ +녀̴ᆼ + +누̴ᆮ +누̴ᆮ +누̴ᆮ +누̴ᆮ +누̴ᆮ + +뉘̴ᆵ +뉘̴ᆵ +뉘̴ᆵ +뉘̴ᆵ +뉘̴ᆵ + +늬̴ᆼ +늬̴ᆼ +늬̴ᆼ +늬̴ᆼ +늬̴ᆼ + +데̴ᆮ +데̴ᆮ +데̴ᆮ +데̴ᆮ +데̴ᆮ + +도̴ᆵ +도̴ᆵ +도̴ᆵ +도̴ᆵ +도̴ᆵ + +되̴ᆼ +되̴ᆼ +되̴ᆼ +되̴ᆼ +되̴ᆼ + +드̴ᆮ +드̴ᆮ +드̴ᆮ +드̴ᆮ +드̴ᆮ + +따̴ᆵ +따̴ᆵ +따̴ᆵ +따̴ᆵ +따̴ᆵ + +떄̴ᆼ +떄̴ᆼ +떄̴ᆼ +떄̴ᆼ +떄̴ᆼ + +뙈̴ᆮ +뙈̴ᆮ +뙈̴ᆮ +뙈̴ᆮ +뙈̴ᆮ + +뚜̴ᆵ +뚜̴ᆵ +뚜̴ᆵ +뚜̴ᆵ +뚜̴ᆵ + +뛰̴ᆼ +뛰̴ᆼ +뛰̴ᆼ +뛰̴ᆼ +뛰̴ᆼ + +랴̴ᆮ +랴̴ᆮ +랴̴ᆮ +랴̴ᆮ +랴̴ᆮ + +레̴ᆵ +레̴ᆵ +레̴ᆵ +레̴ᆵ +레̴ᆵ + +로̴ᆼ +로̴ᆼ +로̴ᆼ +로̴ᆼ +로̴ᆼ + +뤠̴ᆮ +뤠̴ᆮ +뤠̴ᆮ +뤠̴ᆮ +뤠̴ᆮ + +르̴ᆵ +르̴ᆵ +르̴ᆵ +르̴ᆵ +르̴ᆵ + +마̴ᆼ +마̴ᆼ +마̴ᆼ +마̴ᆼ +마̴ᆼ + +몌̴ᆮ +몌̴ᆮ +몌̴ᆮ +몌̴ᆮ +몌̴ᆮ + +뫠̴ᆵ +뫠̴ᆵ +뫠̴ᆵ +뫠̴ᆵ +뫠̴ᆵ + +무̴ᆼ +무̴ᆼ +무̴ᆼ +무̴ᆼ +무̴ᆼ + +미̴ᆮ +미̴ᆮ +미̴ᆮ +미̴ᆮ +미̴ᆮ + +뱌̴ᆵ +뱌̴ᆵ +뱌̴ᆵ +뱌̴ᆵ +뱌̴ᆵ + +베̴ᆼ +베̴ᆼ +베̴ᆼ +베̴ᆼ +베̴ᆼ + +뵤̴ᆮ +뵤̴ᆮ +뵤̴ᆮ +뵤̴ᆮ +뵤̴ᆮ + +붸̴ᆵ +붸̴ᆵ +붸̴ᆵ +붸̴ᆵ +붸̴ᆵ + +브̴ᆼ +브̴ᆼ +브̴ᆼ +브̴ᆼ +브̴ᆼ + +뻐̴ᆮ +뻐̴ᆮ +뻐̴ᆮ +뻐̴ᆮ +뻐̴ᆮ + +뼤̴ᆵ +뼤̴ᆵ +뼤̴ᆵ +뼤̴ᆵ +뼤̴ᆵ + +뽸̴ᆼ +뽸̴ᆼ +뽸̴ᆼ +뽸̴ᆼ +뽸̴ᆼ + +쀼̴ᆮ +쀼̴ᆮ +쀼̴ᆮ +쀼̴ᆮ +쀼̴ᆮ + +삐̴ᆵ +삐̴ᆵ +삐̴ᆵ +삐̴ᆵ +삐̴ᆵ + +샤̴ᆼ +샤̴ᆼ +샤̴ᆼ +샤̴ᆼ +샤̴ᆼ + +솨̴ᆮ +솨̴ᆮ +솨̴ᆮ +솨̴ᆮ +솨̴ᆮ + +쇼̴ᆵ +쇼̴ᆵ +쇼̴ᆵ +쇼̴ᆵ +쇼̴ᆵ + +쉐̴ᆼ +쉐̴ᆼ +쉐̴ᆼ +쉐̴ᆼ +쉐̴ᆼ + +쌔̴ᆮ +쌔̴ᆮ +쌔̴ᆮ +쌔̴ᆮ +쌔̴ᆮ + +써̴ᆵ +써̴ᆵ +써̴ᆵ +써̴ᆵ +써̴ᆵ + +쎼̴ᆼ +쎼̴ᆼ +쎼̴ᆼ +쎼̴ᆼ +쎼̴ᆼ + +쒀̴ᆮ +쒀̴ᆮ +쒀̴ᆮ +쒀̴ᆮ +쒀̴ᆮ + +쓔̴ᆵ +쓔̴ᆵ +쓔̴ᆵ +쓔̴ᆵ +쓔̴ᆵ + +씨̴ᆼ +씨̴ᆼ +씨̴ᆼ +씨̴ᆼ +씨̴ᆼ + +여̴ᆮ +여̴ᆮ +여̴ᆮ +여̴ᆮ +여̴ᆮ + +와̴ᆵ +와̴ᆵ +와̴ᆵ +와̴ᆵ +와̴ᆵ + +요̴ᆼ +요̴ᆼ +요̴ᆼ +요̴ᆼ +요̴ᆼ + +의̴ᆮ +의̴ᆮ +의̴ᆮ +의̴ᆮ +의̴ᆮ + +재̴ᆵ +재̴ᆵ +재̴ᆵ +재̴ᆵ +재̴ᆵ + +저̴ᆼ +저̴ᆼ +저̴ᆼ +저̴ᆼ +저̴ᆼ + +죄̴ᆮ +죄̴ᆮ +죄̴ᆮ +죄̴ᆮ +죄̴ᆮ + +줘̴ᆵ +줘̴ᆵ +줘̴ᆵ +줘̴ᆵ +줘̴ᆵ + +쥬̴ᆼ +쥬̴ᆼ +쥬̴ᆼ +쥬̴ᆼ +쥬̴ᆼ + +쨰̴ᆮ +쨰̴ᆮ +쨰̴ᆮ +쨰̴ᆮ +쨰̴ᆮ + +쪄̴ᆵ +쪄̴ᆵ +쪄̴ᆵ +쪄̴ᆵ +쪄̴ᆵ + +쫘̴ᆼ +쫘̴ᆼ +쫘̴ᆼ +쫘̴ᆼ +쫘̴ᆼ + +쮜̴ᆮ +쮜̴ᆮ +쮜̴ᆮ +쮜̴ᆮ +쮜̴ᆮ + +쯰̴ᆵ +쯰̴ᆵ +쯰̴ᆵ +쯰̴ᆵ +쯰̴ᆵ + +채̴ᆼ +채̴ᆼ +채̴ᆼ +채̴ᆼ +채̴ᆼ + +초̴ᆮ +초̴ᆮ +초̴ᆮ +초̴ᆮ +초̴ᆮ + +최̴ᆵ +최̴ᆵ +최̴ᆵ +최̴ᆵ +최̴ᆵ + +춰̴ᆼ +춰̴ᆼ +춰̴ᆼ +춰̴ᆼ +춰̴ᆼ + +카̴ᆮ +카̴ᆮ +카̴ᆮ +카̴ᆮ +카̴ᆮ + +컈̴ᆵ +컈̴ᆵ +컈̴ᆵ +컈̴ᆵ +컈̴ᆵ + +켜̴ᆼ +켜̴ᆼ +켜̴ᆼ +켜̴ᆼ +켜̴ᆼ + +쿠̴ᆮ +쿠̴ᆮ +쿠̴ᆮ +쿠̴ᆮ +쿠̴ᆮ + +퀴̴ᆵ +퀴̴ᆵ +퀴̴ᆵ +퀴̴ᆵ +퀴̴ᆵ + +킈̴ᆼ +킈̴ᆼ +킈̴ᆼ +킈̴ᆼ +킈̴ᆼ + +테̴ᆮ +테̴ᆮ +테̴ᆮ +테̴ᆮ +테̴ᆮ + +토̴ᆵ +토̴ᆵ +토̴ᆵ +토̴ᆵ +토̴ᆵ + +퇴̴ᆼ +퇴̴ᆼ +퇴̴ᆼ +퇴̴ᆼ +퇴̴ᆼ + +트̴ᆮ +트̴ᆮ +트̴ᆮ +트̴ᆮ +트̴ᆮ + +파̴ᆵ +파̴ᆵ +파̴ᆵ +파̴ᆵ +파̴ᆵ + +퍠̴ᆼ +퍠̴ᆼ +퍠̴ᆼ +퍠̴ᆼ +퍠̴ᆼ + +퐤̴ᆮ +퐤̴ᆮ +퐤̴ᆮ +퐤̴ᆮ +퐤̴ᆮ + +푸̴ᆵ +푸̴ᆵ +푸̴ᆵ +푸̴ᆵ +푸̴ᆵ + +퓌̴ᆼ +퓌̴ᆼ +퓌̴ᆼ +퓌̴ᆼ +퓌̴ᆼ + +햐̴ᆮ +햐̴ᆮ +햐̴ᆮ +햐̴ᆮ +햐̴ᆮ + +헤̴ᆵ +헤̴ᆵ +헤̴ᆵ +헤̴ᆵ +헤̴ᆵ + +호̴ᆼ +호̴ᆼ +호̴ᆼ +호̴ᆼ +호̴ᆼ + +훼̴ᆮ +훼̴ᆮ +훼̴ᆮ +훼̴ᆮ +훼̴ᆮ + +흐̴ᆵ +흐̴ᆵ +흐̴ᆵ +흐̴ᆵ +흐̴ᆵ + +𑄱̴𑄧 +𑄱̴𑄧 +𑄱̴𑄧 +𑄱̴𑄧 +𑄱̴𑄧 + +𑄲̴𑄧 +𑄲̴𑄧 +𑄲̴𑄧 +𑄲̴𑄧 +𑄲̴𑄧 + +𑍇̴𑌾 +𑍇̴𑌾 +𑍇̴𑌾 +𑍇̴𑌾 +𑍇̴𑌾 + +𑍇̴𑍗 +𑍇̴𑍗 +𑍇̴𑍗 +𑍇̴𑍗 +𑍇̴𑍗 + +𑒹̴𑒰 +𑒹̴𑒰 +𑒹̴𑒰 +𑒹̴𑒰 +𑒹̴𑒰 + +𑒹̴𑒺 +𑒹̴𑒺 +𑒹̴𑒺 +𑒹̴𑒺 +𑒹̴𑒺 + +𑒹̴𑒽 +𑒹̴𑒽 +𑒹̴𑒽 +𑒹̴𑒽 +𑒹̴𑒽 + +𑖸̴𑖯 +𑖸̴𑖯 +𑖸̴𑖯 +𑖸̴𑖯 +𑖸̴𑖯 + +𑖹̴𑖯 +𑖹̴𑖯 +𑖹̴𑖯 +𑖹̴𑖯 +𑖹̴𑖯 + diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/test/test_unf_ext.rb b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/test/test_unf_ext.rb new file mode 100644 index 000000000000..2476672b8bc7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/test/test_unf_ext.rb @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +require 'helper' +require 'pathname' + +class TestUnf < Test::Unit::TestCase + test "raise ArgumentError if an unknown normalization form is given" do + normalizer = UNF::Normalizer.new + assert_raises(ArgumentError) { normalizer.normalize("が", :nfck) } + end + + test "pass all tests bundled with the original unf" do + normalizer = UNF::Normalizer.new + open(Pathname(__FILE__).dirname + 'normalization-test.txt', 'r:utf-8').each_slice(6) { |lines| + flunk "broken test file" if lines.size != 6 || lines.pop !~ /^$/ + str, nfc, nfd, nfkc, nfkd = lines + assert_equal nfd, normalizer.normalize(str, :nfd) + assert_equal nfd, normalizer.normalize(nfd, :nfd) + assert_equal nfd, normalizer.normalize(nfc, :nfd) + assert_equal nfkd, normalizer.normalize(nfkc, :nfd) + assert_equal nfkd, normalizer.normalize(nfkc, :nfd) + + assert_equal nfc, normalizer.normalize(str, :nfc) + assert_equal nfc, normalizer.normalize(nfd, :nfc) + assert_equal nfc, normalizer.normalize(nfc, :nfc) + assert_equal nfkc, normalizer.normalize(nfkc, :nfc) + assert_equal nfkc, normalizer.normalize(nfkd, :nfc) + + assert_equal nfkd, normalizer.normalize(str, :nfkd) + assert_equal nfkd, normalizer.normalize(nfd, :nfkd) + assert_equal nfkd, normalizer.normalize(nfc, :nfkd) + assert_equal nfkd, normalizer.normalize(nfkc, :nfkd) + assert_equal nfkd, normalizer.normalize(nfkd, :nfkd) + + assert_equal nfkc, normalizer.normalize(str, :nfkc) + assert_equal nfkc, normalizer.normalize(nfd, :nfkc) + assert_equal nfkc, normalizer.normalize(nfc, :nfkc) + assert_equal nfkc, normalizer.normalize(nfkc, :nfkc) + assert_equal nfkc, normalizer.normalize(nfkd, :nfkc) + } + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/unf_ext.gemspec b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/unf_ext.gemspec new file mode 100644 index 000000000000..aebaeae14194 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unf_ext-0.0.7.7/unf_ext.gemspec @@ -0,0 +1,42 @@ +# -*- encoding: utf-8 -*- +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'unf_ext/version' + +Gem::Specification.new do |gem| + gem.name = "unf_ext" + gem.version = UNF::Normalizer::VERSION + gem.authors = ["Takeru Ohta", "Akinori MUSHA"] + gem.email = ["knu@idaemons.org"] + gem.description = %q{Unicode Normalization Form support library for CRuby} + gem.summary = %q{Unicode Normalization Form support library for CRuby} + gem.homepage = "https://github.com/knu/ruby-unf_ext" + gem.licenses = ["MIT"] + + gem.files = `git ls-files`.split($/) + gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } + gem.test_files = gem.files.grep(%r{^(test|spec|features)/}).grep(%r{/test_[^/]+\.rb$}) + gem.require_paths = ["lib"] + gem.extensions = ["ext/unf_ext/extconf.rb"] + + gem.extra_rdoc_files = [ + "LICENSE.txt", + "README.md" + ] + + if RUBY_VERSION < "1.9" + gem.add_development_dependency("rake", [">= 0.9.2.2", "< 11"]) + gem.add_development_dependency('i18n', '< 0.7.0') + # Cap dependency on activesupport with < 4.0 on behalf of + # shoulda-matchers to satisfy bundler. + gem.add_development_dependency("activesupport", ["< 4.0"]) + gem.add_development_dependency("test-unit", ["= 3.1.5"]) + else + gem.add_development_dependency("rake", [">= 0.9.2.2"]) + gem.add_development_dependency("test-unit") + end + gem.add_development_dependency("rdoc", ["> 2.4.2"]) + gem.add_development_dependency("bundler", [">= 1.2"]) + gem.add_development_dependency("rake-compiler", [">= 0.7.9"]) + gem.add_development_dependency("rake-compiler-dock", [">= 1.0.1"]) +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/CHANGELOG.md b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/CHANGELOG.md new file mode 100644 index 000000000000..021744b3400c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/CHANGELOG.md @@ -0,0 +1,133 @@ +# CHANGELOG + +## 1.7.0 + +- Unicode 13 + +## 1.6.1 + +- Fix that ambiguous and overwrite options where ignored for emoji-measuring + +## 1.6.0 + +- Unicode 12.1 + +## 1.5.0 + +- Unicode 12 + +## 1.4.1 + +- Only bundle required lib/* and data/* files in actual rubygem, patch by @tas50 + +## 1.4.0 + +- Unicode 11 + +## 1.3.3 + +- Replace Gem::Util.gunzip with direct zlib implementation + This removes the dependency on rubygems, fixes #17 + +## 1.3.2 + +- Explicitly load rubygems/util, fixes regression in 1.3.1 (autoload issue) + +## 1.3.1 + +- Use `Gem::Util` for `gunzip`, removes deprecation warning, patch by @Schwad + +## 1.3.0 + +- Unicode 10 + +## 1.2.1 + +- Fix bug that `emoji: true` would fail for emoji without modifier + +## 1.2.0 + +- Add zero-width codepoint ranges: U+2060..U+206F, U+FFF0..U+FFF8, U+E0000..U+E0FFF +- Add full-witdh codepoint ranges: U+3400..U+4DBF, U+4E00..U+9FFF, U+F900..U+FAFF, U+20000..U+2FFFD, U+30000..U+3FFFD +- Experimental emoji support using the [unicode-emoji](https://github.com/janlelis/unicode-emoji) gem +- Fix minor bug in index compression scheme + +## 1.1.3 + +- Fix that non-UTF-8 encodings do not throw errors, patch by @windwiny + +## 1.1.2 + +- Reduce memory consumption and increase performance, patch by @rrosenblum + +## 1.1.1 + +- Always load index into memory, fixes #9 + +## 1.1.0 + +- Support Unicode 9.0 + +## 1.0.5 + +- Actually include new index from 1.0.4 + +## 1.0.4 + +- New index format (much smaller) and internal API changes +- Move index generation to a builder plugin for the unicoder gem +- No public API changes + +## 1.0.3 + +- Avoid circular dependency warning + +## 1.0.2 + +- Fix error that gemspec might be invalid under some circumstances (see gh#6) + +## 1.0.1 + +- Inofficially allow Ruby 1.9 + +## 1.0.0 + +- Faster than 0.3.1 +- Advanced determination of character width +- This includes: Treat width of most chars of general categories (Mn, Me, Cf) as 0 +- This includes: Introduce list of characters with special widths +- Allow custom overrides for specific codepoints +- Set required Ruby version to 2.0 +- Add NO_STRING_EXT mode to disable monkey patching +- Internal API & index format changed drastically +- Remove require 'unicode/display_size' (use 'unicode/display_width' instead) + +## 0.3.1 + +- Faster than 0.3.0 +- Deprecate usage of aliases: String#display_size and String#display_length +- Eliminate Ruby warnings (@amatsuda) + +## 0.3.0 + +- Update EastAsianWidth from 7.0 to 8.0 +- Add rake task to update EastAsianWidth.txt +- Move code to generate index from library to Rakefile +- Update project's meta files +- Deprecate requiring 'unicode-display_size' + +## 0.2.0 + +- Update EastAsianWidth from 6.0 to 7.0 +- Don't build index table automatically when not available +- Don't include EastAsianWidth.txt in gem (only index) + + +## 0.1.0 + +- Fix github issue #1 + + +## 0.1.0 + +- Initial release diff --git a/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/MIT-LICENSE.txt b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/MIT-LICENSE.txt new file mode 100644 index 000000000000..8252de864c77 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/MIT-LICENSE.txt @@ -0,0 +1,22 @@ +The MIT LICENSE + +Copyright (c) 2011, 2015-2020 Jan Lelis + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/README.md b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/README.md new file mode 100644 index 000000000000..deee0f2aee49 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/README.md @@ -0,0 +1,124 @@ +## Unicode::DisplayWidth [![[version]](https://badge.fury.io/rb/unicode-display_width.svg)](https://badge.fury.io/rb/unicode-display_width) [<img src="https://travis-ci.org/janlelis/unicode-display_width.png" />](https://travis-ci.org/janlelis/unicode-display_width) + +Determines the monospace display width of a string in Ruby. Implementation based on [EastAsianWidth.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt) and other data, 100% in Ruby. Other than [wcwidth()](https://github.com/janlelis/wcswidth-ruby), which fulfills a similar purpose, it does not rely on the OS vendor to provide an up-to-date method for measuring string width. + +Unicode version: **13.0.0** (March 2020) + +Supported Rubies: **2.7**, **2.6**, **2.5**, **2.4** + +Old Rubies that might still work: **2.3**, **2.2**, **2.1**, **2.0**, **1.9** + +## Introduction to Character Widths + +Guessing the correct space a character will consume on terminals is not easy. There is no single standard. Most implementations combine data from [East Asian Width](https://www.unicode.org/reports/tr11/), some [General Categories](https://en.wikipedia.org/wiki/Unicode_character_property#General_Category), and hand-picked adjustments. + +### How this Library Handles Widths + +Further at the top means higher precedence. Please expect changes to this algorithm with every MINOR version update (the X in 1.X.0)! + +Width | Characters | Comment +-------|------------------------------|-------------------------------------------------- +X | (user defined) | Overwrites any other values +-1 | `"\b"` | Backspace (total width never below 0) +0 | `"\0"`, `"\x05"`, `"\a"`, `"\n"`, `"\v"`, `"\f"`, `"\r"`, `"\x0E"`, `"\x0F"` | [C0 control codes](https://en.wikipedia.org/wiki/C0_and_C1_control_codes#C0_.28ASCII_and_derivatives.29) that do not change horizontal width +1 | `"\u{00AD}"` | SOFT HYPHEN +2 | `"\u{2E3A}"` | TWO-EM DASH +3 | `"\u{2E3B}"` | THREE-EM DASH +0 | General Categories: Mn, Me, Cf (non-arabic) | Excludes ARABIC format characters +0 | `"\u{1160}".."\u{11FF}"` | HANGUL JUNGSEONG +0 | `"\u{2060}".."\u{206F}"`, `"\u{FFF0}".."\u{FFF8}"`, `"\u{E0000}".."\u{E0FFF}"` | Ignorable ranges +2 | East Asian Width: F, W | Full-width characters +2 | `"\u{3400}".."\u{4DBF}"`, `"\u{4E00}".."\u{9FFF}"`, `"\u{F900}".."\u{FAFF}"`, `"\u{20000}".."\u{2FFFD}"`, `"\u{30000}".."\u{3FFFD}"` | Full-width ranges +1 or 2 | East Asian Width: A | Ambiguous characters, user defined, default: 1 +1 | All other codepoints | - + +## Install + +Install the gem with: + + $ gem install unicode-display_width + +Or add to your Gemfile: + + gem 'unicode-display_width' + +## Usage + +```ruby +require 'unicode/display_width' + +Unicode::DisplayWidth.of("⚀") # => 1 +Unicode::DisplayWidth.of("一") # => 2 +``` + +### Ambiguous Characters + +The second parameter defines the value returned by characters defined as ambiguous: + +```ruby +Unicode::DisplayWidth.of("·", 1) # => 1 +Unicode::DisplayWidth.of("·", 2) # => 2 +``` + +### Custom Overwrites + +You can overwrite how to handle specific code points by passing a hash (or even a proc) as third parameter: + +```ruby +Unicode::DisplayWidth.of("a\tb", 1, 0x09 => 10)) # => 12 +``` + +### Emoji Support + +Experimental emoji support is included. It will adjust the string's size for modifier and zero-width joiner sequences. You will need to add the [unicode-emoji](https://github.com/janlelis/unicode-emoji) gem to your Gemfile: + +```ruby +gem 'unicode-display_width' +gem 'unicode-emoji' +``` + +You can then activate the emoji string width adjustments by passing `emoji: true` as fourth parameter: + +```ruby +Unicode::DisplayWidth.of "🤾🏽‍♀️" # => 5 +Unicode::DisplayWidth.of "🤾🏽‍♀️", 1, {}, emoji: true # => 2 +``` + +### Usage with String Extension + +Activated by default. Will be deactivated in version 2.0: + +```ruby +require 'unicode/display_width/string_ext' + +"⚀".display_width #=> 1 +'一'.display_width #=> 2 +``` + +You can actively opt-out from the string extension with: `require 'unicode/display_width/no_string_ext'` + +### Usage From the CLI + +Use this one-liner to print out display widths for strings from the command-line: + +``` +$ gem install unicode-display_width +$ ruby -r unicode/display_width -e 'puts Unicode::DisplayWidth.of $*[0]' -- "一" +``` +Replace "一" with the actual string to measure + +## Other Implementations & Discussion + +- Python: https://github.com/jquast/wcwidth +- JavaScript: https://github.com/mycoboco/wcwidth.js +- C: https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c +- C for Julia: https://github.com/JuliaLang/utf8proc/issues/2 + +See [unicode-x](https://github.com/janlelis/unicode-x) for more Unicode related micro libraries. + +## Copyright & Info + +- Copyright (c) 2011, 2015-2020 Jan Lelis, https://janlelis.com, released under the MIT +license +- Early versions based on runpaint's unicode-data interface: Copyright (c) 2009 Run Paint Run Run +- Unicode data: https://www.unicode.org/copyright.html#Exhibit1 diff --git a/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/data/display_width.marshal.gz b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/data/display_width.marshal.gz new file mode 100644 index 000000000000..37514fe3c56c Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/data/display_width.marshal.gz differ diff --git a/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width.rb b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width.rb new file mode 100644 index 000000000000..532223d58239 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width.rb @@ -0,0 +1,51 @@ +require_relative 'display_width/constants' +require_relative 'display_width/index' + +module Unicode + module DisplayWidth + DEPTHS = [0x10000, 0x1000, 0x100, 0x10].freeze + + def self.of(string, ambiguous = 1, overwrite = {}, options = {}) + res = string.codepoints.inject(0){ |total_width, codepoint| + index_or_value = INDEX + codepoint_depth_offset = codepoint + DEPTHS.each{ |depth| + index_or_value = index_or_value[codepoint_depth_offset / depth] + codepoint_depth_offset = codepoint_depth_offset % depth + break unless index_or_value.is_a? Array + } + width = index_or_value.is_a?(Array) ? index_or_value[codepoint_depth_offset] : index_or_value + width = ambiguous if width == :A + total_width + (overwrite[codepoint] || width || 1) + } + + res -= emoji_extra_width_of(string, ambiguous, overwrite) if options[:emoji] + res < 0 ? 0 : res + end + + def self.emoji_extra_width_of(string, ambiguous = 1, overwrite = {}, _ = {}) + require "unicode/emoji" + + extra_width = 0 + modifier_regex = /[#{ Unicode::Emoji::EMOJI_MODIFIERS.pack("U*") }]/ + zwj_regex = /(?<=#{ [Unicode::Emoji::ZWJ].pack("U") })./ + + string.scan(Unicode::Emoji::REGEX){ |emoji| + extra_width += 2 * emoji.scan(modifier_regex).size + + emoji.scan(zwj_regex){ |zwj_succ| + extra_width += self.of(zwj_succ, ambiguous, overwrite) + } + } + + extra_width + end + end +end + +# Allows you to opt-out of the default string extension. Will eventually be removed, +# so you must opt-in for the core extension by requiring 'display_width/string_ext' +unless defined?(Unicode::DisplayWidth::NO_STRING_EXT) && Unicode::DisplayWidth::NO_STRING_EXT + require_relative 'display_width/string_ext' +end + diff --git a/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/constants.rb b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/constants.rb new file mode 100644 index 000000000000..7bbdd0162be3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/constants.rb @@ -0,0 +1,8 @@ +module Unicode + module DisplayWidth + VERSION = '1.7.0' + UNICODE_VERSION = "13.0.0".freeze + DATA_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../../../data/').freeze + INDEX_FILENAME = (DATA_DIRECTORY + '/display_width.marshal.gz').freeze + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/index.rb b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/index.rb new file mode 100644 index 000000000000..fedfc68ec57a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/index.rb @@ -0,0 +1,12 @@ +require 'zlib' +require_relative 'constants' + +module Unicode + module DisplayWidth + File.open(INDEX_FILENAME, "rb") do |file| + serialized_data = Zlib::GzipReader.new(file).read + serialized_data.force_encoding Encoding::BINARY + INDEX = Marshal.load(serialized_data) + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/no_string_ext.rb b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/no_string_ext.rb new file mode 100644 index 000000000000..4f65b5ff0593 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/no_string_ext.rb @@ -0,0 +1,7 @@ +module Unicode + module DisplayWidth + NO_STRING_EXT = true + end +end + +require_relative '../display_width' diff --git a/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/string_ext.rb b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/string_ext.rb new file mode 100644 index 000000000000..81fc44d30231 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/unicode-display_width-1.7.0/lib/unicode/display_width/string_ext.rb @@ -0,0 +1,17 @@ +require_relative '../display_width' unless defined? Unicode::DisplayWidth + +class String + def display_width(ambiguous = 1, overwrite = {}, options = {}) + Unicode::DisplayWidth.of(self, ambiguous, overwrite, options) + end + + def display_size(*args) + warn "Deprecation warning: Please use `String#display_width` instead of `String#display_size`" + display_width(*args) + end + + def display_length(*args) + warn "Deprecation warning: Please use `String#display_width` instead of `String#display_length`" + display_width(*args) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/MIT-LICENSE b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/MIT-LICENSE new file mode 100644 index 000000000000..d6a2b6e3753e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2019–ω Xavier Noria + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/README.md b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/README.md new file mode 100644 index 000000000000..efd613afc11d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/README.md @@ -0,0 +1,841 @@ +# Zeitwerk + + + +[![Gem Version](https://img.shields.io/gem/v/zeitwerk.svg?style=for-the-badge)](https://rubygems.org/gems/zeitwerk) +[![Build Status](https://img.shields.io/travis/com/fxn/zeitwerk/master?style=for-the-badge)](https://travis-ci.com/fxn/zeitwerk) + +<!-- TOC --> + +- [Introduction](#introduction) +- [Synopsis](#synopsis) +- [File structure](#file-structure) + - [Implicit namespaces](#implicit-namespaces) + - [Explicit namespaces](#explicit-namespaces) + - [Collapsing directories](#collapsing-directories) + - [Nested root directories](#nested-root-directories) +- [Usage](#usage) + - [Setup](#setup) + - [Generic](#generic) + - [for_gem](#for_gem) + - [Autoloading](#autoloading) + - [Eager loading](#eager-loading) + - [Reloading](#reloading) + - [Inflection](#inflection) + - [Zeitwerk::Inflector](#zeitwerkinflector) + - [Zeitwerk::GemInflector](#zeitwerkgeminflector) + - [Custom inflector](#custom-inflector) + - [The on_load callback](#the-on_load-callback) + - [Logging](#logging) + - [Loader tag](#loader-tag) + - [Ignoring parts of the project](#ignoring-parts-of-the-project) + - [Use case: Files that do not follow the conventions](#use-case-files-that-do-not-follow-the-conventions) + - [Use case: The adapter pattern](#use-case-the-adapter-pattern) + - [Use case: Test files mixed with implementation files](#use-case-test-files-mixed-with-implementation-files) + - [Edge cases](#edge-cases) + - [Reopening third-party namespaces](#reopening-third-party-namespaces) + - [Rules of thumb](#rules-of-thumb) + - [Debuggers](#debuggers) + - [Break](#break) + - [Byebug](#byebug) +- [Pronunciation](#pronunciation) +- [Supported Ruby versions](#supported-ruby-versions) +- [Testing](#testing) +- [Motivation](#motivation) +- [Thanks](#thanks) +- [License](#license) + +<!-- /TOC --> + +<a id="markdown-introduction" name="introduction"></a> +## Introduction + +Zeitwerk is an efficient and thread-safe code loader for Ruby. + +Given a [conventional file structure](#file-structure), Zeitwerk is able to load your project's classes and modules on demand (autoloading), or upfront (eager loading). You don't need to write `require` calls for your own files, rather, you can streamline your programming knowing that your classes and modules are available everywhere. This feature is efficient, thread-safe, and matches Ruby's semantics for constants. + +Zeitwerk is also able to reload code, which may be handy while developing web applications. Coordination is needed to reload in a thread-safe manner. The documentation below explains how to do this. + +The gem is designed so that any project, gem dependency, application, etc. can have their own independent loader, coexisting in the same process, managing their own project trees, and independent of each other. Each loader has its own configuration, inflector, and optional logger. + +Internally, Zeitwerk issues `require` calls exclusively using absolute file names, so there are no costly file system lookups in `$LOAD_PATH`. Technically, the directories managed by Zeitwerk do not even need to be in `$LOAD_PATH`. + +Furthermore, Zeitwerk does at most one single scan of the project tree, and it descends into subdirectories lazily, only if their namespaces are used. + +<a id="markdown-synopsis" name="synopsis"></a> +## Synopsis + +Main interface for gems: + +```ruby +# lib/my_gem.rb (main file) + +require "zeitwerk" +loader = Zeitwerk::Loader.for_gem +loader.setup # ready! + +module MyGem + # ... +end + +loader.eager_load # optionally +``` + +Main generic interface: + +```ruby +loader = Zeitwerk::Loader.new +loader.push_dir(...) +loader.setup # ready! +``` + +The `loader` variable can go out of scope. Zeitwerk keeps a registry with all of them, and so the object won't be garbage collected. + +You can reload if you want to: + +```ruby +loader = Zeitwerk::Loader.new +loader.push_dir(...) +loader.enable_reloading # you need to opt-in before setup +loader.setup +... +loader.reload +``` + +and you can eager load all the code: + +```ruby +loader.eager_load +``` + +It is also possible to broadcast `eager_load` to all instances: + +```ruby +Zeitwerk::Loader.eager_load_all +``` + +<a id="markdown-file-structure" name="file-structure"></a> +## File structure + +To have a file structure Zeitwerk can work with, just name files and directories after the name of the classes and modules they define: + +``` +lib/my_gem.rb -> MyGem +lib/my_gem/foo.rb -> MyGem::Foo +lib/my_gem/bar_baz.rb -> MyGem::BarBaz +lib/my_gem/woo/zoo.rb -> MyGem::Woo::Zoo +``` + +Every directory configured with `push_dir` acts as root namespace. There can be several of them. For example, given + +```ruby +loader.push_dir(Rails.root.join("app/models")) +loader.push_dir(Rails.root.join("app/controllers")) +``` + +Zeitwerk understands that their respective files and subdirectories belong to the root namespace: + +``` +app/models/user.rb -> User +app/controllers/admin/users_controller.rb -> Admin::UsersController +``` + +Alternatively, you can associate a custom namespace to a root directory by passing a class or module object in the optional `namespace` keyword argument. + +For example, Active Job queue adapters have to define a constant after their name in `ActiveJob::QueueAdapters`. + +So, if you declare + +```ruby +require "active_job" +require "active_job/queue_adapters" +loader.push_dir("#{__dir__}/adapters", namespace: ActiveJob::QueueAdapters) +``` + +your adapter can be stored directly in that directory instead of the canonical `#{__dir__}/active_job/queue_adapters`. + +Please, note that the given namespace must be non-reloadable, though autoloaded constants in that namespace can be. That is, if you associate `app/api` with an existing `Api` module, that module should not be reloadable. However, if the project defines and autoloads the class `Api::V2::Deliveries`, that one can be reloaded. + +<a id="markdown-implicit-namespaces" name="implicit-namespaces"></a> +### Implicit namespaces + +Directories without a matching Ruby file get modules autovivified automatically by Zeitwerk. For example, in + +``` +app/controllers/admin/users_controller.rb -> Admin::UsersController +``` + +`Admin` is autovivified as a module on demand, you do not need to define an `Admin` class or module in an `admin.rb` file explicitly. + +<a id="markdown-explicit-namespaces" name="explicit-namespaces"></a> +### Explicit namespaces + +Classes and modules that act as namespaces can also be explicitly defined, though. For instance, consider + +``` +app/models/hotel.rb -> Hotel +app/models/hotel/pricing.rb -> Hotel::Pricing +``` + +There, `app/models/hotel.rb` defines `Hotel`, and thus Zeitwerk does not autovivify a module. + +The classes and modules from the namespace are already available in the body of the class or module defining it: + +```ruby +class Hotel < ApplicationRecord + include Pricing # works + ... +end +``` + +An explicit namespace must be managed by one single loader. Loaders that reopen namespaces owned by other projects are responsible for loading their constants before setup. + +<a id="markdown-collapsing-directories" name="collapsing-directories"></a> +### Collapsing directories + +Say some directories in a project exist for organizational purposes only, and you prefer not to have them as namespaces. For example, the `actions` subdirectory in the next example is not meant to represent a namespace, it is there only to group all actions related to bookings: + +``` +booking.rb -> Booking +booking/actions/create.rb -> Booking::Create +``` + +To make it work that way, configure Zeitwerk to collapse said directory: + +```ruby +loader.collapse("#{__dir__}/booking/actions") +``` + +This method accepts an arbitrary number of strings or `Pathname` objects, and also an array of them. + +You can pass directories and glob patterns. Glob patterns are expanded when they are added, and again on each reload. + +To illustrate usage of glob patterns, if `actions` in the example above is part of a standardized structure, you could use a wildcard: + +```ruby +loader.collapse("#{__dir__}/*/actions") +``` + +<a id="markdown-nested-root-directories" name="nested-root-directories"></a> +### Nested root directories + +Root directories should not be ideally nested, but Zeitwerk supports them because in Rails, for example, both `app/models` and `app/models/concerns` belong to the autoload paths. + +Zeitwerk detects nested root directories, and treats them as roots only. In the example above, `concerns` is not considered to be a namespace below `app/models`. For example, the file: + +``` +app/models/concerns/geolocatable.rb +``` + +should define `Geolocatable`, not `Concerns::Geolocatable`. + +<a id="markdown-usage" name="usage"></a> +## Usage + +<a id="markdown-setup" name="setup"></a> +### Setup + +<a id="markdown-generic" name="generic"></a> +#### Generic + +Loaders are ready to load code right after calling `setup` on them: + +```ruby +loader.setup +``` + +This method is synchronized and idempotent. + +Customization should generally be done before that call. In particular, in the generic interface you may set the root directories from which you want to load files: + +```ruby +loader.push_dir(...) +loader.push_dir(...) +loader.setup +``` + +<a id="markdown-for_gem" name="for_gem"></a> +#### for_gem + +`Zeitwerk::Loader.for_gem` is a convenience shortcut for the common case in which a gem has its entry point directly under the `lib` directory: + +``` +lib/my_gem.rb # MyGem +lib/my_gem/version.rb # MyGem::VERSION +lib/my_gem/foo.rb # MyGem::Foo +``` + +Neither a gemspec nor a version file are technically required, this helper works as long as the code is organized using that standard structure. + +If the entry point of your gem lives in a subdirectory of `lib` because it is reopening a namespace defined somewhere else, please use the generic API to setup the loader, and make sure you check the section [_Reopening third-party namespaces_](https://github.com/fxn/zeitwerk#reopening-third-party-namespaces) down below. + +Conceptually, `for_gem` translates to: + +```ruby +# lib/my_gem.rb + +require "zeitwerk" +loader = Zeitwerk::Loader.new +loader.tag = File.basename(__FILE__, ".rb") +loader.inflector = Zeitwerk::GemInflector.new(__FILE__) +loader.push_dir(__dir__) +``` + +except that this method returns the same object in subsequent calls from the same file, in the unlikely case the gem wants to be able to reload. + +If the main module references project constants at the top-level, Zeitwerk has to be ready to load them. Their definitions, in turn, may reference other project constants. And this is recursive. Therefore, it is important that the `setup` call happens above the main module definition: + +```ruby +# lib/my_gem.rb (main file) + +require "zeitwerk" +loader = Zeitwerk::Loader.for_gem +loader.setup + +module MyGem + # Since the setup has been performed, at this point we are already able + # to reference project constants, in this case MyGem::MyLogger. + include MyLogger +end +``` + +<a id="markdown-autoloading" name="autoloading"></a> +### Autoloading + +After `setup`, you are able to reference classes and modules from the project without issuing `require` calls for them. They are all available everywhere, autoloading loads them on demand. This works even if the reference to the class or module is first hit in client code, outside your project. + +Let's revisit the example above: + +```ruby +# lib/my_gem.rb (main file) + +require "zeitwerk" +loader = Zeitwerk::Loader.for_gem +loader.setup + +module MyGem + include MyLogger # (*) +end +``` + +That works, and there is no `require "my_gem/my_logger"`. When `(*)` is reached, Zeitwerk seamlessly autoloads `MyGem::MyLogger`. + +If autoloading a file does not define the expected class or module, Zeitwerk raises `Zeitwerk::NameError`, which is a subclass of `NameError`. + +<a id="markdown-eager-loading" name="eager-loading"></a> +### Eager loading + +Zeitwerk instances are able to eager load their managed files: + +```ruby +loader.eager_load +``` + +That skips [ignored files and directories](#ignoring-parts-of-the-project), and you can also tell Zeitwerk that certain files or directories are autoloadable, but should not be eager loaded: + +```ruby +db_adapters = "#{__dir__}/my_gem/db_adapters" +loader.do_not_eager_load(db_adapters) +loader.setup +loader.eager_load # won't eager load the database adapters +``` + +In gems, the method needs to be invoked after the main namespace has been defined, as shown in [Synopsis](https://github.com/fxn/zeitwerk#synopsis). + +Eager loading is synchronized and idempotent. + +If eager loading a file does not define the expected class or module, Zeitwerk raises `Zeitwerk::NameError`, which is a subclass of `NameError`. + +If you want to eager load yourself and all dependencies using Zeitwerk, you can broadcast the `eager_load` call to all instances: + +```ruby +Zeitwerk::Loader.eager_load_all +``` + +This may be handy in top-level services, like web applications. + +Note that thanks to idempotence `Zeitwerk::Loader.eager_load_all` won't eager load twice if any of the instances already eager loaded. + +<a id="markdown-reloading" name="reloading"></a> +### Reloading + +Zeitwerk is able to reload code, but you need to enable this feature: + +```ruby +loader = Zeitwerk::Loader.new +loader.push_dir(...) +loader.enable_reloading # you need to opt-in before setup +loader.setup +... +loader.reload +``` + +There is no way to undo this, either you want to reload or you don't. + +Enabling reloading after setup raises `Zeitwerk::Error`. Attempting to reload without having it enabled raises `Zeitwerk::ReloadingDisabledError`. + +Generally speaking, reloading is useful while developing running services like web applications. Gems that implement regular libraries, so to speak, or services running in testing or production environments, won't normally have a use case for reloading. If reloading is not enabled, Zeitwerk is able to use less memory. + +Reloading removes the currently loaded classes and modules and resets the loader so that it will pick whatever is in the file system now. + +It is important to highlight that this is an instance method. Don't worry about project dependencies managed by Zeitwerk, their loaders are independent. + +In order for reloading to be thread-safe, you need to implement some coordination. For example, a web framework that serves each request with its own thread may have a globally accessible RW lock. When a request comes in, the framework acquires the lock for reading at the beginning, and the code in the framework that calls `loader.reload` needs to acquire the lock for writing. + +On reloading, client code has to update anything that would otherwise be storing a stale object. For example, if the routing layer of a web framework stores controller class objects or instances in internal structures, on reload it has to refresh them somehow, possibly reevaluating routes. + +<a id="markdown-inflection" name="inflection"></a> +### Inflection + +Each individual loader needs an inflector to figure out which constant path would a given file or directory map to. Zeitwerk ships with two basic inflectors. + +<a id="markdown-zeitwerkinflector" name="zeitwerkinflector"></a> +#### Zeitwerk::Inflector + +This is a very basic inflector that converts snake case to camel case: + +``` +user -> User +users_controller -> UsersController +html_parser -> HtmlParser +``` + +The camelize logic can be overridden easily for individual basenames: + +```ruby +loader.inflector.inflect( + "html_parser" => "HTMLParser", + "mysql_adapter" => "MySQLAdapter" +) +``` + +The `inflect` method can be invoked several times if you prefer this other style: + +```ruby +loader.inflector.inflect "html_parser" => "HTMLParser" +loader.inflector.inflect "mysql_adapter" => "MySQLAdapter" +``` + +Overrides need to be configured before calling `setup`. + +There are no inflection rules or global configuration that can affect this inflector. It is deterministic. + +Loaders instantiated with `Zeitwerk::Loader.new` have an inflector of this type, independent of each other. + +<a id="markdown-zeitwerkgeminflector" name="zeitwerkgeminflector"></a> +#### Zeitwerk::GemInflector + +This inflector is like the basic one, except it expects `lib/my_gem/version.rb` to define `MyGem::VERSION`. + +Loaders instantiated with `Zeitwerk::Loader.for_gem` have an inflector of this type, independent of each other. + +<a id="markdown-custom-inflector" name="custom-inflector"></a> +#### Custom inflector + +The inflectors that ship with Zeitwerk are deterministic and simple. But you can configure your own: + +```ruby +# frozen_string_literal: true + +class MyInflector < Zeitwerk::Inflector + def camelize(basename, abspath) + if basename =~ /\Ahtml_(.*)/ + "HTML" + super($1, abspath) + else + super + end + end +end +``` + +The first argument, `basename`, is a string with the basename of the file or directory to be inflected. In the case of a file, without extension. In the case of a directory, without trailing slash. The inflector needs to return this basename inflected. Therefore, a simple constant name without colons. + +The second argument, `abspath`, is a string with the absolute path to the file or directory in case you need it to decide how to inflect the basename. Paths to directories don't have trailing slashes. + +Then, assign the inflector: + +```ruby +loader.inflector = MyInflector.new +``` + +This needs to be done before calling `setup`. + +If a custom inflector definition in a gem takes too much space in the main file, you can extract it. For example, this is a simple pattern: + +```ruby +# lib/my_gem/inflector.rb +module MyGem + class Inflector < Zeitwerk::GemInflector + ... + end +end + +# lib/my_gem.rb +require "zeitwerk" +require_relative "my_gem/inflector" + +loader = Zeitwerk::Loader.for_gem +loader.inflector = MyGem::Inflector.new(__FILE__) +loader.setup + +module MyGem + # ... +end +``` + +Since `MyGem` is referenced before the namespace is defined in the main file, it is important to use this style: + +```ruby +# Correct, effectively defines MyGem. +module MyGem + class Inflector < Zeitwerk::GemInflector + # ... + end +end +``` + +instead of: + +```ruby +# Raises uninitialized constant MyGem (NameError). +class MyGem::Inflector < Zeitwerk::GemInflector + # ... +end +``` + +<a id="markdown-the-on_load-callback" name="the-on_load-callback"></a> +### The on_load callback + +The usual place to run something when a file is loaded is the file itself. However, sometimes you'd like to be called, and this is possible with the `on_load` callback. + +For example, let's imagine this class belongs to a Rails application: + +```ruby +class SomeApiClient + class << self + attr_accessor :endpoint + end +end +``` + +With `on_load`, it is easy to schedule code at boot time that initializes `endpoint` according to the configuration: + +```ruby +# config/environments/development.rb +loader.on_load("SomeApiClient") do + SomeApiClient.endpoint = "https://api.dev" +end + +# config/environments/production.rb +loader.on_load("SomeApiClient") do + SomeApiClient.endpoint = "https://api.prod" +end +``` + +Uses cases: + +* Doing something with an autoloadable class or module in a Rails application during initialization, in a way that plays well with reloading. As in the previous example. +* Delaying the execution of the block until the class is loaded for performance. +* Delaying the execution of the block until the class is loaded because it follows the adapter pattern and better not to load the class if the user does not need it. +* Etc. + +However, let me stress that the easiest way to accomplish that is to write whatever you have to do in the actual target file. `on_load` use cases are edgy, use it only if appropriate. + +`on_load` receives the name of the target class or module as a string. The given block is executed every time its corresponding file is loaded. That includes reloads. + +Multiple callbacks on the same target are supported, and they run in order of definition. + +The block is executed once the loader has loaded the target. In particular, if the target was already loaded when the callback is defined, the block won't run. But if you reload and load the target again, then it will. Normally, you'll want to define `on_load` callbacks before `setup`. + +Defining a callback for a target not managed by the receiver is not an error, the block simply won't ever be executed. + +<a id="markdown-logging" name="logging"></a> +### Logging + +Zeitwerk is silent by default, but you can ask loaders to trace their activity. Logging is meant just for troubleshooting, shouldn't normally be enabled. + +The `log!` method is a quick shortcut to let the loader log to `$stdout`: + +``` +loader.log! +``` + +If you want more control, a logger can be configured as a callable + +```ruby +loader.logger = method(:puts) +loader.logger = ->(msg) { ... } +``` + +as well as anything that responds to `debug`: + +```ruby +loader.logger = Logger.new($stderr) +loader.logger = Rails.logger +``` + +In both cases, the corresponding methods are going to be passed exactly one argument with the message to be logged. + +It is also possible to set a global default this way: + +```ruby +Zeitwerk::Loader.default_logger = method(:puts) +``` + +If there is a logger configured, you'll see traces when autoloads are set, files loaded, and modules autovivified. While reloading, removed autoloads and unloaded objects are also traced. + +As a curiosity, if your project has namespaces you'll notice in the traces Zeitwerk sets autoloads for _directories_. That's a technique used to be able to descend into subdirectories on demand, avoiding that way unnecessary tree walks. + +<a id="markdown-loader-tag" name="loader-tag"></a> +#### Loader tag + +Loaders have a tag that is printed in traces in order to be able to distinguish them in globally logged activity: + +``` +Zeitwerk@9fa54b: autoload set for User, to be loaded from ... +``` + +By default, a random tag like the one above is assigned, but you can change it: + +``` +loader.tag = "grep_me" +``` + +The tag of a loader returned by `for_gem` is the basename of the root file without extension: + +``` +Zeitwerk@my_gem: constant MyGem::Foo loaded from ... +``` + +<a id="markdown-ignoring-parts-of-the-project" name="ignoring-parts-of-the-project"></a> +### Ignoring parts of the project + +Zeitwerk ignores automatically any file or directory whose name starts with a dot, and any files that do not have extension ".rb". + +However, sometimes it might still be convenient to tell Zeitwerk to completely ignore some particular Ruby file or directory. That is possible with `ignore`, which accepts an arbitrary number of strings or `Pathname` objects, and also an array of them. + +You can ignore file names, directory names, and glob patterns. Glob patterns are expanded when they are added and again on each reload. + +Let's see some use cases. + +<a id="markdown-use-case-files-that-do-not-follow-the-conventions" name="use-case-files-that-do-not-follow-the-conventions"></a> +#### Use case: Files that do not follow the conventions + +Let's suppose that your gem decorates something in `Kernel`: + +```ruby +# lib/my_gem/core_ext/kernel.rb + +Kernel.module_eval do + # ... +end +``` + +That file does not define a constant path after the path name and you need to tell Zeitwerk: + +```ruby +kernel_ext = "#{__dir__}/my_gem/core_ext/kernel.rb" +loader.ignore(kernel_ext) +loader.setup +``` + +You can also ignore the whole directory: + +```ruby +core_ext = "#{__dir__}/my_gem/core_ext" +loader.ignore(core_ext) +loader.setup +``` + +<a id="markdown-use-case-the-adapter-pattern" name="use-case-the-adapter-pattern"></a> +#### Use case: The adapter pattern + +Another use case for ignoring files is the adapter pattern. + +Let's imagine your project talks to databases, supports several, and has adapters for each one of them. Those adapters may have top-level `require` calls that load their respective drivers: + +```ruby +# my_gem/db_adapters/postgresql.rb +require "pg" +``` + +but you don't want your users to install them all, only the one they are going to use. + +On the other hand, if your code is eager loaded by you or a parent project (with `Zeitwerk::Loader.eager_load_all`), those `require` calls are going to be executed. Ignoring the adapters prevents that: + +```ruby +db_adapters = "#{__dir__}/my_gem/db_adapters" +loader.ignore(db_adapters) +loader.setup +``` + +The chosen adapter, then, has to be loaded by hand somehow: + +```ruby +require "my_gem/db_adapters/#{config[:db_adapter]}" +``` + +Note that since the directory is ignored, the required adapter can instantiate another loader to manage its subtree, if desired. Such loader would coexist with the main one just fine. + +<a id="markdown-use-case-test-files-mixed-with-implementation-files" name="use-case-test-files-mixed-with-implementation-files"></a> +#### Use case: Test files mixed with implementation files + +There are project layouts that put implementation files and test files together. To ignore the test files, you can use a glob pattern like this: + +```ruby +tests = "#{__dir__}/**/*_test.rb" +loader.ignore(tests) +loader.setup +``` + +<a id="markdown-edge-cases" name="edge-cases"></a> +### Edge cases + +A class or module that acts as a namespace: + +```ruby +# trip.rb +class Trip + include Geolocation +end + +# trip/geolocation.rb +module Trip::Geolocation + ... +end +``` + +has to be defined with the `class` or `module` keywords, as in the example above. + +For technical reasons, raw constant assignment is not supported: + +```ruby +# trip.rb +Trip = Class.new { ... } # NOT SUPPORTED +Trip = Struct.new { ... } # NOT SUPPORTED +``` + +This only affects explicit namespaces, those idioms work well for any other ordinary class or module. + +<a id="markdown-reopening-third-party-namespaces" name="reopening-third-party-namespaces"></a> +### Reopening third-party namespaces + +Projects managed by Zeitwerk can work with namespaces defined by third-party libraries. However, they have to be loaded in memory before calling `setup`. + +For example, let's imagine you're writing a gem that implements an adapter for [Active Job](https://guides.rubyonrails.org/active_job_basics.html) that uses AwesomeQueue as backend. By convention, your gem has to define a class called `ActiveJob::QueueAdapters::AwesomeQueue`, and it has to do so in a file with a matching path: + +```ruby +# lib/active_job/queue_adapters/awesome_queue.rb +module ActiveJob + module QueueAdapters + class AwesomeQueue + # ... + end + end +end +``` + +It is very important that your gem _reopens_ the modules `ActiveJob` and `ActiveJob::QueueAdapters` instead of _defining_ them. Because their proper definition lives in Active Job. Furthermore, if the project reloads, you do not want any of `ActiveJob` or `ActiveJob::QueueAdapters` to be reloaded. + +Bottom line, Zeitwerk should not be managing those namespaces. Active Job owns them and defines them. Your gem needs to _reopen_ them. + +In order to do so, you need to make sure those modules are loaded before calling `setup`. For instance, in the entry file for the gem: + +```ruby +# Ensure these namespaces are reopened, not defined. +require "active_job" +require "active_job/queue_adapters" + +require "zeitwerk" +loader = Zeitwerk::Loader.for_gem +loader.setup +``` + +With that, when Zeitwerk scans the file system and reaches the gem directories `lib/active_job` and `lib/active_job/queue_adapters`, it detects the corresponding modules already exist and therefore understands it does not have to manage them. The loader just descends into those directories. Eventually will reach `lib/active_job/queue_adapters/awesome_queue.rb`, and since `ActiveJob::QueueAdapters::AwesomeQueue` is unknown, Zeitwerk will manage it. Which is what happens regularly with the files in your gem. On reload, the namespaces are safe, won't be reloaded. The loader only reloads what it manages, which in this case is the adapter itself. + +<a id="markdown-rules-of-thumb" name="rules-of-thumb"></a> +### Rules of thumb + +1. Different loaders should manage different directory trees. It is an error condition to configure overlapping root directories in different loaders. + +2. Think the mere existence of a file is effectively like writing a `require` call for them, which is executed on demand (autoload) or upfront (eager load). + +3. In that line, if two loaders manage files that translate to the same constant in the same namespace, the first one wins, the rest are ignored. Similar to what happens with `require` and `$LOAD_PATH`, only the first occurrence matters. + +4. Projects that reopen a namespace defined by some dependency have to ensure said namespace is loaded before setup. That is, the project has to make sure it reopens, rather than define. This is often accomplished just loading the dependency. + +5. Objects stored in reloadable constants should not be cached in places that are not reloaded. For example, non-reloadable classes should not subclass a reloadable class, or mixin a reloadable module. Otherwise, after reloading, those classes or module objects would become stale. Referring to constants in dynamic places like method calls or lambdas is fine. + +6. In a given process, ideally, there should be at most one loader with reloading enabled. Technically, you can have more, but it may get tricky if one refers to constants managed by the other one. Do that only if you know what you are doing. + +<a id="markdown-debuggers" name="debuggers"></a> +### Debuggers + +<a id="markdown-break" name="break"></a> +#### Break + +Zeitwerk works fine with [@gsamokovarov](https://github.com/gsamokovarov)'s [Break](https://github.com/gsamokovarov/break) debugger. + +<a id="markdown-byebug" name="byebug"></a> +#### Byebug + +Zeitwerk and [Byebug](https://github.com/deivid-rodriguez/byebug) are incompatible, classes or modules that belong to [explicit namespaces](#explicit-namespaces) are not autoloaded inside a Byebug session. See [this issue](https://github.com/deivid-rodriguez/byebug/issues/564#issuecomment-499413606) for further details. + +<a id="markdown-pronunciation" name="pronunciation"></a> +## Pronunciation + +"Zeitwerk" is pronounced [this way](http://share.hashref.com/zeitwerk/zeitwerk_pronunciation.mp3). + +<a id="markdown-supported-ruby-versions" name="supported-ruby-versions"></a> +## Supported Ruby versions + +Zeitwerk works with MRI 2.4.4 and above. + +<a id="markdown-testing" name="testing"></a> +## Testing + +In order to run the test suite of Zeitwerk, `cd` into the project root and execute + +``` +bin/test +``` + +To run one particular suite, pass its file name as an argument: + +``` +bin/test test/lib/zeitwerk/test_eager_load.rb +``` + +Furthermore, the project has a development dependency on [`minitest-focus`](https://github.com/seattlerb/minitest-focus). To run an individual test mark it with `focus`: + +```ruby +focus +test "capitalizes the first letter" do + assert_equal "User", camelize("user") +end +``` + +and run `bin/test`. + +<a id="markdown-motivation" name="motivation"></a> +## Motivation + +Since `require` has global side-effects, and there is no static way to verify that you have issued the `require` calls for code that your file depends on, in practice it is very easy to forget some. That introduces bugs that depend on the load order. Zeitwerk provides a way to forget about `require` in your own code, just name things following conventions and done. + +On the other hand, autoloading in Rails is based on `const_missing`, which lacks fundamental information like the nesting and the resolution algorithm that was being used. Because of that, Rails autoloading is not able to match Ruby's semantics and that introduces a series of gotchas. The original goal of this project was to bring a better autoloading mechanism for Rails 6. + +<a id="markdown-thanks" name="thanks"></a> +## Thanks + +I'd like to thank [@matthewd](https://github.com/matthewd) for the discussions we've had about this topic in the past years, I learned a couple of tricks used in Zeitwerk from him. + +Also, would like to thank [@Shopify](https://github.com/Shopify), [@rafaelfranca](https://github.com/rafaelfranca), and [@dylanahsmith](https://github.com/dylanahsmith), for sharing [this PoC](https://github.com/Shopify/autoload_reloader). The technique Zeitwerk uses to support explicit namespaces was copied from that project. + +Jean Boussier ([@casperisfine](https://github.com/casperisfine), [@byroot](https://github.com/byroot)) deserves special mention. Jean migrated autoloading in Shopify when Zeitwerk integration in Rails was yet unreleased. His work and positive attitude have been outstanding, and thanks to his feedback the interface and performance of Zeitwerk are way, way better. Kudos man ❤️. + +Finally, many thanks to [@schurig](https://github.com/schurig) for recording an [audio file](http://share.hashref.com/zeitwerk/zeitwerk_pronunciation.mp3) with the pronunciation of "Zeitwerk" in perfect German. 💯 + +<a id="markdown-license" name="license"></a> +## License + +Released under the MIT License, Copyright (c) 2019–<i>ω</i> Xavier Noria. diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk.rb new file mode 100644 index 000000000000..f3bb471a012f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +module Zeitwerk + require_relative "zeitwerk/real_mod_name" + require_relative "zeitwerk/loader" + require_relative "zeitwerk/registry" + require_relative "zeitwerk/explicit_namespace" + require_relative "zeitwerk/inflector" + require_relative "zeitwerk/gem_inflector" + require_relative "zeitwerk/kernel" + require_relative "zeitwerk/error" +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/error.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/error.rb new file mode 100644 index 000000000000..9b8ef27e2b48 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/error.rb @@ -0,0 +1,10 @@ +module Zeitwerk + class Error < StandardError + end + + class ReloadingDisabledError < Error + end + + class NameError < ::NameError + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/explicit_namespace.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/explicit_namespace.rb new file mode 100644 index 000000000000..563bde392259 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/explicit_namespace.rb @@ -0,0 +1,81 @@ +module Zeitwerk + # Centralizes the logic for the trace point used to detect the creation of + # explicit namespaces, needed to descend into matching subdirectories right + # after the constant has been defined. + # + # The implementation assumes an explicit namespace is managed by one loader. + # Loaders that reopen namespaces owned by other projects are responsible for + # loading their constant before setup. This is documented. + module ExplicitNamespace # :nodoc: all + class << self + include RealModName + + # Maps constant paths that correspond to explicit namespaces according to + # the file system, to the loader responsible for them. + # + # @private + # @sig Hash[String, Zeitwerk::Loader] + attr_reader :cpaths + + # @private + # @sig Mutex + attr_reader :mutex + + # @private + # @sig TracePoint + attr_reader :tracer + + # Asserts `cpath` corresponds to an explicit namespace for which `loader` + # is responsible. + # + # @private + # @sig (String, Zeitwerk::Loader) -> void + def register(cpath, loader) + mutex.synchronize do + cpaths[cpath] = loader + # We check enabled? because, looking at the C source code, enabling an + # enabled tracer does not seem to be a simple no-op. + tracer.enable unless tracer.enabled? + end + end + + # @private + # @sig (Zeitwerk::Loader) -> void + def unregister(loader) + cpaths.delete_if { |_cpath, l| l == loader } + disable_tracer_if_unneeded + end + + private + + # @sig () -> void + def disable_tracer_if_unneeded + mutex.synchronize do + tracer.disable if cpaths.empty? + end + end + + # @sig (TracePoint) -> void + def tracepoint_class_callback(event) + # If the class is a singleton class, we won't do anything with it so we + # can bail out immediately. This is several orders of magnitude faster + # than accessing its name. + return if event.self.singleton_class? + + # Note that it makes sense to compute the hash code unconditionally, + # because the trace point is disabled if cpaths is empty. + if loader = cpaths.delete(real_mod_name(event.self)) + loader.on_namespace_loaded(event.self) + disable_tracer_if_unneeded + end + end + end + + @cpaths = {} + @mutex = Mutex.new + + # We go through a method instead of defining a block mainly to have a better + # label when profiling. + @tracer = TracePoint.new(:class, &method(:tracepoint_class_callback)) + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/gem_inflector.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/gem_inflector.rb new file mode 100644 index 000000000000..8e59de591a89 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/gem_inflector.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Zeitwerk + class GemInflector < Inflector + # @sig (String) -> void + def initialize(root_file) + namespace = File.basename(root_file, ".rb") + lib_dir = File.dirname(root_file) + @version_file = File.join(lib_dir, namespace, "version.rb") + end + + # @sig (String, String) -> String + def camelize(basename, abspath) + abspath == @version_file ? "VERSION" : super + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/inflector.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/inflector.rb new file mode 100644 index 000000000000..8cac2df0f275 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/inflector.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module Zeitwerk + class Inflector + # Very basic snake case -> camel case conversion. + # + # inflector = Zeitwerk::Inflector.new + # inflector.camelize("post", ...) # => "Post" + # inflector.camelize("users_controller", ...) # => "UsersController" + # inflector.camelize("api", ...) # => "Api" + # + # Takes into account hard-coded mappings configured with `inflect`. + # + # @sig (String, String) -> String + def camelize(basename, _abspath) + overrides[basename] || basename.split('_').each(&:capitalize!).join + end + + # Configures hard-coded inflections: + # + # inflector = Zeitwerk::Inflector.new + # inflector.inflect( + # "html_parser" => "HTMLParser", + # "mysql_adapter" => "MySQLAdapter" + # ) + # + # inflector.camelize("html_parser", abspath) # => "HTMLParser" + # inflector.camelize("mysql_adapter", abspath) # => "MySQLAdapter" + # inflector.camelize("users_controller", abspath) # => "UsersController" + # + # @sig (Hash[String, String]) -> void + def inflect(inflections) + overrides.merge!(inflections) + end + + private + + # Hard-coded basename to constant name user maps that override the default + # inflection logic. + # + # @sig () -> Hash[String, String] + def overrides + @overrides ||= {} + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/kernel.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/kernel.rb new file mode 100644 index 000000000000..d35299f3f45d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/kernel.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +module Kernel + module_function + + # We are going to decorate Kerner#require with two goals. + # + # First, by intercepting Kernel#require calls, we are able to autovivify + # modules on required directories, and also do internal housekeeping when + # managed files are loaded. + # + # On the other hand, if you publish a new version of a gem that is now managed + # by Zeitwerk, client code can reference directly your classes and modules and + # should not require anything. But if someone has legacy require calls around, + # they will work as expected, and in a compatible way. + # + # We cannot decorate with prepend + super because Kernel has already been + # included in Object, and changes in ancestors don't get propagated into + # already existing ancestor chains. + alias_method :zeitwerk_original_require, :require + + # @sig (String) -> true | false + def require(path) + if loader = Zeitwerk::Registry.loader_for(path) + if path.end_with?(".rb") + zeitwerk_original_require(path).tap do |required| + loader.on_file_autoloaded(path) if required + end + else + loader.on_dir_autoloaded(path) + true + end + else + zeitwerk_original_require(path).tap do |required| + if required + realpath = $LOADED_FEATURES.last + if loader = Zeitwerk::Registry.loader_for(realpath) + loader.on_file_autoloaded(realpath) + end + end + end + end + end + + # By now, I have seen no way so far to decorate require_relative. + # + # For starters, at least in CRuby, require_relative does not delegate to + # require. Both require and require_relative delegate the bulk of their work + # to an internal C function called rb_require_safe. So, our require wrapper is + # not executed. + # + # On the other hand, we cannot use the aliasing technique above because + # require_relative receives a path relative to the directory of the file in + # which the call is performed. If a wrapper here invoked the original method, + # Ruby would resolve the relative path taking lib/zeitwerk as base directory. + # + # A workaround could be to extract the base directory from caller_locations, + # but what if someone else decorated require_relative before us? You can't + # really know with certainty where's the original call site in the stack. + # + # However, the main use case for require_relative is to load files from your + # own project. Projects managed by Zeitwerk don't do this for files managed by + # Zeitwerk, precisely. +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb new file mode 100644 index 000000000000..5e40402c6e3a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader.rb @@ -0,0 +1,812 @@ +# frozen_string_literal: true + +require "set" +require "securerandom" + +module Zeitwerk + class Loader + require_relative "loader/callbacks" + include Callbacks + include RealModName + + # @sig String + attr_reader :tag + + # @sig #camelize + attr_accessor :inflector + + # @sig #call | #debug | nil + attr_accessor :logger + + # Absolute paths of the root directories. Stored in a hash to preserve + # order, easily handle duplicates, and also be able to have a fast lookup, + # needed for detecting nested paths. + # + # "/Users/fxn/blog/app/assets" => true, + # "/Users/fxn/blog/app/channels" => true, + # ... + # + # This is a private collection maintained by the loader. The public + # interface for it is `push_dir` and `dirs`. + # + # @private + # @sig Hash[String, true] + attr_reader :root_dirs + + # Absolute paths of files or directories that have to be preloaded. + # + # @private + # @sig Array[String] + attr_reader :preloads + + # Absolute paths of files, directories, or glob patterns to be totally + # ignored. + # + # @private + # @sig Set[String] + attr_reader :ignored_glob_patterns + + # The actual collection of absolute file and directory names at the time the + # ignored glob patterns were expanded. Computed on setup, and recomputed on + # reload. + # + # @private + # @sig Set[String] + attr_reader :ignored_paths + + # Absolute paths of directories or glob patterns to be collapsed. + # + # @private + # @sig Set[String] + attr_reader :collapse_glob_patterns + + # The actual collection of absolute directory names at the time the collapse + # glob patterns were expanded. Computed on setup, and recomputed on reload. + # + # @private + # @sig Set[String] + attr_reader :collapse_dirs + + # Maps real absolute paths for which an autoload has been set ---and not + # executed--- to their corresponding parent class or module and constant + # name. + # + # "/Users/fxn/blog/app/models/user.rb" => [Object, :User], + # "/Users/fxn/blog/app/models/hotel/pricing.rb" => [Hotel, :Pricing] + # ... + # + # @private + # @sig Hash[String, [Module, Symbol]] + attr_reader :autoloads + + # We keep track of autoloaded directories to remove them from the registry + # at the end of eager loading. + # + # Files are removed as they are autoloaded, but directories need to wait due + # to concurrency (see why in Zeitwerk::Loader::Callbacks#on_dir_autoloaded). + # + # @private + # @sig Array[String] + attr_reader :autoloaded_dirs + + # Stores metadata needed for unloading. Its entries look like this: + # + # "Admin::Role" => [".../admin/role.rb", [Admin, :Role]] + # + # The cpath as key helps implementing unloadable_cpath? The real file name + # is stored in order to be able to delete it from $LOADED_FEATURES, and the + # pair [Module, Symbol] is used to remove_const the constant from the class + # or module object. + # + # If reloading is enabled, this hash is filled as constants are autoloaded + # or eager loaded. Otherwise, the collection remains empty. + # + # @private + # @sig Hash[String, [String, [Module, Symbol]]] + attr_reader :to_unload + + # Maps constant paths of namespaces to arrays of corresponding directories. + # + # For example, given this mapping: + # + # "Admin" => [ + # "/Users/fxn/blog/app/controllers/admin", + # "/Users/fxn/blog/app/models/admin", + # ... + # ] + # + # when `Admin` gets defined we know that it plays the role of a namespace and + # that its children are spread over those directories. We'll visit them to set + # up the corresponding autoloads. + # + # @private + # @sig Hash[String, Array[String]] + attr_reader :lazy_subdirs + + # Absolute paths of files or directories not to be eager loaded. + # + # @private + # @sig Set[String] + attr_reader :eager_load_exclusions + + # User-oriented callbacks to be fired when a constant is loaded. + attr_reader :on_load_callbacks + + # @private + # @sig Mutex + attr_reader :mutex + + # @private + # @sig Mutex + attr_reader :mutex2 + + def initialize + @initialized_at = Time.now + + @tag = SecureRandom.hex(3) + @inflector = Inflector.new + @logger = self.class.default_logger + + @root_dirs = {} + @preloads = [] + @ignored_glob_patterns = Set.new + @ignored_paths = Set.new + @collapse_glob_patterns = Set.new + @collapse_dirs = Set.new + @autoloads = {} + @autoloaded_dirs = [] + @to_unload = {} + @lazy_subdirs = {} + @eager_load_exclusions = Set.new + @on_load_callbacks = {} + + # TODO: find a better name for these mutexes. + @mutex = Mutex.new + @mutex2 = Mutex.new + @setup = false + @eager_loaded = false + + @reloading_enabled = false + + Registry.register_loader(self) + end + + # Sets a tag for the loader, useful for logging. + # + # @param tag [#to_s] + # @sig (#to_s) -> void + def tag=(tag) + @tag = tag.to_s + end + + # Absolute paths of the root directories. This is a read-only collection, + # please push here via `push_dir`. + # + # @sig () -> Array[String] + def dirs + root_dirs.keys.freeze + end + + # Pushes `path` to the list of root directories. + # + # Raises `Zeitwerk::Error` if `path` does not exist, or if another loader in + # the same process already manages that directory or one of its ascendants + # or descendants. + # + # @raise [Zeitwerk::Error] + # @sig (String | Pathname, Module) -> void + def push_dir(path, namespace: Object) + # Note that Class < Module. + unless namespace.is_a?(Module) + raise Error, "#{namespace.inspect} is not a class or module object, should be" + end + + abspath = File.expand_path(path) + if dir?(abspath) + raise_if_conflicting_directory(abspath) + root_dirs[abspath] = namespace + else + raise Error, "the root directory #{abspath} does not exist" + end + end + + # You need to call this method before setup in order to be able to reload. + # There is no way to undo this, either you want to reload or you don't. + # + # @raise [Zeitwerk::Error] + # @sig () -> void + def enable_reloading + mutex.synchronize do + break if @reloading_enabled + + if @setup + raise Error, "cannot enable reloading after setup" + else + @reloading_enabled = true + end + end + end + + # @sig () -> bool + def reloading_enabled? + @reloading_enabled + end + + # Files or directories to be preloaded instead of lazy loaded. + # + # @sig (*(String | Pathname | Array[String | Pathname])) -> void + def preload(*paths) + mutex.synchronize do + expand_paths(paths).each do |abspath| + preloads << abspath + do_preload_abspath(abspath) if @setup + end + end + end + + # Configure files, directories, or glob patterns to be totally ignored. + # + # @sig (*(String | Pathname | Array[String | Pathname])) -> void + def ignore(*glob_patterns) + glob_patterns = expand_paths(glob_patterns) + mutex.synchronize do + ignored_glob_patterns.merge(glob_patterns) + ignored_paths.merge(expand_glob_patterns(glob_patterns)) + end + end + + # Configure directories or glob patterns to be collapsed. + # + # @sig (*(String | Pathname | Array[String | Pathname])) -> void + def collapse(*glob_patterns) + glob_patterns = expand_paths(glob_patterns) + mutex.synchronize do + collapse_glob_patterns.merge(glob_patterns) + collapse_dirs.merge(expand_glob_patterns(glob_patterns)) + end + end + + # Configure a block to be invoked once a certain constant path is loaded. + # Supports multiple callbacks, and if there are many, they are executed in + # the order in which they were defined. + # + # loader.on_load("SomeApiClient") do + # SomeApiClient.endpoint = "https://api.dev" + # end + # + # @raise [TypeError] + # @sig (String) { () -> void } -> void + def on_load(cpath, &block) + raise TypeError, "on_load only accepts strings" unless cpath.is_a?(String) + + mutex.synchronize do + (on_load_callbacks[cpath] ||= []) << block + end + end + + # Sets autoloads in the root namespace and preloads files, if any. + # + # @sig () -> void + def setup + mutex.synchronize do + break if @setup + + actual_root_dirs.each do |root_dir, namespace| + set_autoloads_in_dir(root_dir, namespace) + end + do_preload + + @setup = true + end + end + + # Removes loaded constants and configured autoloads. + # + # The objects the constants stored are no longer reachable through them. In + # addition, since said objects are normally not referenced from anywhere + # else, they are eligible for garbage collection, which would effectively + # unload them. + # + # @private + # @sig () -> void + def unload + mutex.synchronize do + # We are going to keep track of the files that were required by our + # autoloads to later remove them from $LOADED_FEATURES, thus making them + # loadable by Kernel#require again. + # + # Directories are not stored in $LOADED_FEATURES, keeping track of files + # is enough. + unloaded_files = Set.new + + autoloads.each do |realpath, (parent, cname)| + if parent.autoload?(cname) + unload_autoload(parent, cname) + else + # Could happen if loaded with require_relative. That is unsupported, + # and the constant path would escape unloadable_cpath? This is just + # defensive code to clean things up as much as we are able to. + unload_cref(parent, cname) if cdef?(parent, cname) + unloaded_files.add(realpath) if ruby?(realpath) + end + end + + to_unload.each_value do |(realpath, (parent, cname))| + unload_cref(parent, cname) if cdef?(parent, cname) + unloaded_files.add(realpath) if ruby?(realpath) + end + + unless unloaded_files.empty? + # Bootsnap decorates Kernel#require to speed it up using a cache and + # this optimization does not check if $LOADED_FEATURES has the file. + # + # To make it aware of changes, the gem defines singleton methods in + # $LOADED_FEATURES: + # + # https://github.com/Shopify/bootsnap/blob/master/lib/bootsnap/load_path_cache/core_ext/loaded_features.rb + # + # Rails applications may depend on bootsnap, so for unloading to work + # in that setting it is preferable that we restrict our API choice to + # one of those methods. + $LOADED_FEATURES.reject! { |file| unloaded_files.member?(file) } + end + + autoloads.clear + autoloaded_dirs.clear + to_unload.clear + lazy_subdirs.clear + + Registry.on_unload(self) + ExplicitNamespace.unregister(self) + + @setup = false + @eager_loaded = false + end + end + + # Unloads all loaded code, and calls setup again so that the loader is able + # to pick any changes in the file system. + # + # This method is not thread-safe, please see how this can be achieved by + # client code in the README of the project. + # + # @raise [Zeitwerk::Error] + # @sig () -> void + def reload + if reloading_enabled? + unload + recompute_ignored_paths + recompute_collapse_dirs + setup + else + raise ReloadingDisabledError, "can't reload, please call loader.enable_reloading before setup" + end + end + + # Eager loads all files in the root directories, recursively. Files do not + # need to be in `$LOAD_PATH`, absolute file names are used. Ignored files + # are not eager loaded. You can opt-out specifically in specific files and + # directories with `do_not_eager_load`. + # + # @sig () -> void + def eager_load + mutex.synchronize do + break if @eager_loaded + + queue = [] + actual_root_dirs.each do |root_dir, namespace| + queue << [namespace, root_dir] unless eager_load_exclusions.member?(root_dir) + end + + while to_eager_load = queue.shift + namespace, dir = to_eager_load + + ls(dir) do |basename, abspath| + next if eager_load_exclusions.member?(abspath) + + if ruby?(abspath) + if cref = autoloads[File.realpath(abspath)] + cref[0].const_get(cref[1], false) + end + elsif dir?(abspath) && !root_dirs.key?(abspath) + if collapse_dirs.member?(abspath) + queue << [namespace, abspath] + else + cname = inflector.camelize(basename, abspath) + queue << [namespace.const_get(cname, false), abspath] + end + end + end + end + + autoloaded_dirs.each do |autoloaded_dir| + Registry.unregister_autoload(autoloaded_dir) + end + autoloaded_dirs.clear + + @eager_loaded = true + end + end + + # Let eager load ignore the given files or directories. The constants + # defined in those files are still autoloadable. + # + # @sig (*(String | Pathname | Array[String | Pathname])) -> void + def do_not_eager_load(*paths) + mutex.synchronize { eager_load_exclusions.merge(expand_paths(paths)) } + end + + # Says if the given constant path would be unloaded on reload. This + # predicate returns `false` if reloading is disabled. + # + # @sig (String) -> bool + def unloadable_cpath?(cpath) + to_unload.key?(cpath) + end + + # Returns an array with the constant paths that would be unloaded on reload. + # This predicate returns an empty array if reloading is disabled. + # + # @sig () -> Array[String] + def unloadable_cpaths + to_unload.keys.freeze + end + + # Logs to `$stdout`, handy shortcut for debugging. + # + # @sig () -> void + def log! + @logger = ->(msg) { puts msg } + end + + # @private + # @sig (String) -> bool + def manages?(dir) + dir = dir + "/" + ignored_paths.each do |ignored_path| + return false if dir.start_with?(ignored_path + "/") + end + + root_dirs.each_key do |root_dir| + return true if root_dir.start_with?(dir) || dir.start_with?(root_dir + "/") + end + + false + end + + # --- Class methods --------------------------------------------------------------------------- + + class << self + # @sig #call | #debug | nil + attr_accessor :default_logger + + # @private + # @sig Mutex + attr_accessor :mutex + + # This is a shortcut for + # + # require "zeitwerk" + # loader = Zeitwerk::Loader.new + # loader.tag = File.basename(__FILE__, ".rb") + # loader.inflector = Zeitwerk::GemInflector.new(__FILE__) + # loader.push_dir(__dir__) + # + # except that this method returns the same object in subsequent calls from + # the same file, in the unlikely case the gem wants to be able to reload. + # + # @sig () -> Zeitwerk::Loader + def for_gem + called_from = caller_locations(1, 1).first.path + Registry.loader_for_gem(called_from) + end + + # Broadcasts `eager_load` to all loaders. + # + # @sig () -> void + def eager_load_all + Registry.loaders.each(&:eager_load) + end + + # Returns an array with the absolute paths of the root directories of all + # registered loaders. This is a read-only collection. + # + # @sig () -> Array[String] + def all_dirs + Registry.loaders.flat_map(&:dirs).freeze + end + end + + self.mutex = Mutex.new + + private # ------------------------------------------------------------------------------------- + + # @sig () -> Array[String] + def actual_root_dirs + root_dirs.reject do |root_dir, _namespace| + !dir?(root_dir) || ignored_paths.member?(root_dir) + end + end + + # @sig (String, Module) -> void + def set_autoloads_in_dir(dir, parent) + ls(dir) do |basename, abspath| + begin + if ruby?(basename) + basename[-3..-1] = '' + cname = inflector.camelize(basename, abspath).to_sym + autoload_file(parent, cname, abspath) + elsif dir?(abspath) + # In a Rails application, `app/models/concerns` is a subdirectory of + # `app/models`, but both of them are root directories. + # + # To resolve the ambiguity file name -> constant path this introduces, + # the `app/models/concerns` directory is totally ignored as a namespace, + # it counts only as root. The guard checks that. + unless root_dirs.key?(abspath) + cname = inflector.camelize(basename, abspath).to_sym + if collapse_dirs.member?(abspath) + set_autoloads_in_dir(abspath, parent) + else + autoload_subdir(parent, cname, abspath) + end + end + end + rescue ::NameError => error + path_type = ruby?(abspath) ? "file" : "directory" + + raise NameError.new(<<~MESSAGE, error.name) + #{error.message} inferred by #{inflector.class} from #{path_type} + + #{abspath} + + Possible ways to address this: + + * Tell Zeitwerk to ignore this particular #{path_type}. + * Tell Zeitwerk to ignore one of its parent directories. + * Rename the #{path_type} to comply with the naming conventions. + * Modify the inflector to handle this case. + MESSAGE + end + end + end + + # @sig (Module, Symbol, String) -> void + def autoload_subdir(parent, cname, subdir) + if autoload_path = autoload_for?(parent, cname) + cpath = cpath(parent, cname) + register_explicit_namespace(cpath) if ruby?(autoload_path) + # We do not need to issue another autoload, the existing one is enough + # no matter if it is for a file or a directory. Just remember the + # subdirectory has to be visited if the namespace is used. + (lazy_subdirs[cpath] ||= []) << subdir + elsif !cdef?(parent, cname) + # First time we find this namespace, set an autoload for it. + (lazy_subdirs[cpath(parent, cname)] ||= []) << subdir + set_autoload(parent, cname, subdir) + else + # For whatever reason the constant that corresponds to this namespace has + # already been defined, we have to recurse. + set_autoloads_in_dir(subdir, parent.const_get(cname)) + end + end + + # @sig (Module, Symbol, String) -> void + def autoload_file(parent, cname, file) + if autoload_path = autoload_for?(parent, cname) + # First autoload for a Ruby file wins, just ignore subsequent ones. + if ruby?(autoload_path) + log("file #{file} is ignored because #{autoload_path} has precedence") if logger + else + promote_namespace_from_implicit_to_explicit( + dir: autoload_path, + file: file, + parent: parent, + cname: cname + ) + end + elsif cdef?(parent, cname) + log("file #{file} is ignored because #{cpath(parent, cname)} is already defined") if logger + else + set_autoload(parent, cname, file) + end + end + + # `dir` is the directory that would have autovivified a namespace. `file` is + # the file where we've found the namespace is explicitly defined. + # + # @sig (dir: String, file: String, parent: Module, cname: Symbol) -> void + def promote_namespace_from_implicit_to_explicit(dir:, file:, parent:, cname:) + autoloads.delete(dir) + Registry.unregister_autoload(dir) + + set_autoload(parent, cname, file) + register_explicit_namespace(cpath(parent, cname)) + end + + # @sig (Module, Symbol, String) -> void + def set_autoload(parent, cname, abspath) + # $LOADED_FEATURES stores real paths since Ruby 2.4.4. We set and save the + # real path to be able to delete it from $LOADED_FEATURES on unload, and to + # be able to do a lookup later in Kernel#require for manual require calls. + # + # We freeze realpath because that saves allocations in Module#autoload. + # See #125. + realpath = File.realpath(abspath).freeze + parent.autoload(cname, realpath) + if logger + if ruby?(realpath) + log("autoload set for #{cpath(parent, cname)}, to be loaded from #{realpath}") + else + log("autoload set for #{cpath(parent, cname)}, to be autovivified from #{realpath}") + end + end + + autoloads[realpath] = [parent, cname] + Registry.register_autoload(self, realpath) + + # See why in the documentation of Zeitwerk::Registry.inceptions. + unless parent.autoload?(cname) + Registry.register_inception(cpath(parent, cname), realpath, self) + end + end + + # @sig (Module, Symbol) -> String? + def autoload_for?(parent, cname) + strict_autoload_path(parent, cname) || Registry.inception?(cpath(parent, cname)) + end + + # The autoload? predicate takes into account the ancestor chain of the + # receiver, like const_defined? and other methods in the constants API do. + # + # For example, given + # + # class A + # autoload :X, "x.rb" + # end + # + # class B < A + # end + # + # B.autoload?(:X) returns "x.rb". + # + # We need a way to strictly check in parent ignoring ancestors. + # + # @sig (Module, Symbol) -> String? + if method(:autoload?).arity == 1 + def strict_autoload_path(parent, cname) + parent.autoload?(cname) if cdef?(parent, cname) + end + else + def strict_autoload_path(parent, cname) + parent.autoload?(cname, false) + end + end + + # This method is called this way because I prefer `preload` to be the method + # name to configure preloads in the public interface. + # + # @sig () -> void + def do_preload + preloads.each do |abspath| + do_preload_abspath(abspath) + end + end + + # @sig (String) -> void + def do_preload_abspath(abspath) + if ruby?(abspath) + do_preload_file(abspath) + elsif dir?(abspath) + do_preload_dir(abspath) + end + end + + # @sig (String) -> void + def do_preload_dir(dir) + ls(dir) do |_basename, abspath| + do_preload_abspath(abspath) + end + end + + # @sig (String) -> bool + def do_preload_file(file) + log("preloading #{file}") if logger + require file + end + + # @sig (Module, Symbol) -> String + def cpath(parent, cname) + parent.equal?(Object) ? cname.to_s : "#{real_mod_name(parent)}::#{cname}" + end + + # @sig (String) { (String, String) -> void } -> void + def ls(dir) + Dir.foreach(dir) do |basename| + next if basename.start_with?(".") + + abspath = File.join(dir, basename) + next if ignored_paths.member?(abspath) + + # We freeze abspath because that saves allocations when passed later to + # File methods. See #125. + yield basename, abspath.freeze + end + end + + # @sig (String) -> bool + def ruby?(path) + path.end_with?(".rb") + end + + # @sig (String) -> bool + def dir?(path) + File.directory?(path) + end + + # @sig (String | Pathname | Array[String | Pathname]) -> Array[String] + def expand_paths(paths) + paths.flatten.map! { |path| File.expand_path(path) } + end + + # @sig (Array[String]) -> Array[String] + def expand_glob_patterns(glob_patterns) + # Note that Dir.glob works with regular file names just fine. That is, + # glob patterns technically need no wildcards. + glob_patterns.flat_map { |glob_pattern| Dir.glob(glob_pattern) } + end + + # @sig () -> void + def recompute_ignored_paths + ignored_paths.replace(expand_glob_patterns(ignored_glob_patterns)) + end + + # @sig () -> void + def recompute_collapse_dirs + collapse_dirs.replace(expand_glob_patterns(collapse_glob_patterns)) + end + + # @sig (String) -> void + def log(message) + method_name = logger.respond_to?(:debug) ? :debug : :call + logger.send(method_name, "Zeitwerk@#{tag}: #{message}") + end + + # @sig (Module, Symbol) -> bool + def cdef?(parent, cname) + parent.const_defined?(cname, false) + end + + # @sig (String) -> void + def register_explicit_namespace(cpath) + ExplicitNamespace.register(cpath, self) + end + + # @sig (String) -> void + def raise_if_conflicting_directory(dir) + self.class.mutex.synchronize do + Registry.loaders.each do |loader| + if loader != self && loader.manages?(dir) + require "pp" + raise Error, + "loader\n\n#{pretty_inspect}\n\nwants to manage directory #{dir}," \ + " which is already managed by\n\n#{loader.pretty_inspect}\n" + EOS + end + end + end + end + + # @sig (Module, Symbol) -> void + def unload_autoload(parent, cname) + parent.__send__(:remove_const, cname) + log("autoload for #{cpath(parent, cname)} removed") if logger + end + + # @sig (Module, Symbol) -> void + def unload_cref(parent, cname) + parent.__send__(:remove_const, cname) + log("#{cpath(parent, cname)} unloaded") if logger + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader/callbacks.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader/callbacks.rb new file mode 100644 index 000000000000..49c18d8a1fad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/loader/callbacks.rb @@ -0,0 +1,86 @@ +module Zeitwerk::Loader::Callbacks + include Zeitwerk::RealModName + + # Invoked from our decorated Kernel#require when a managed file is autoloaded. + # + # @private + # @sig (String) -> void + def on_file_autoloaded(file) + cref = autoloads.delete(file) + cpath = cpath(*cref) + + to_unload[cpath] = [file, cref] if reloading_enabled? + Zeitwerk::Registry.unregister_autoload(file) + + if logger && cdef?(*cref) + log("constant #{cpath} loaded from file #{file}") + elsif !cdef?(*cref) + raise Zeitwerk::NameError.new("expected file #{file} to define constant #{cpath}, but didn't", cref.last) + end + + run_on_load_callbacks(cpath) + end + + # Invoked from our decorated Kernel#require when a managed directory is + # autoloaded. + # + # @private + # @sig (String) -> void + def on_dir_autoloaded(dir) + # Module#autoload does not serialize concurrent requires, and we handle + # directories ourselves, so the callback needs to account for concurrency. + # + # Multi-threading would introduce a race condition here in which thread t1 + # autovivifies the module, and while autoloads for its children are being + # set, thread t2 autoloads the same namespace. + # + # Without the mutex and subsequent delete call, t2 would reset the module. + # That not only would reassign the constant (undesirable per se) but, worse, + # the module object created by t2 wouldn't have any of the autoloads for its + # children, since t1 would have correctly deleted its lazy_subdirs entry. + mutex2.synchronize do + if cref = autoloads.delete(dir) + autovivified_module = cref[0].const_set(cref[1], Module.new) + cpath = autovivified_module.name + log("module #{cpath} autovivified from directory #{dir}") if logger + + to_unload[cpath] = [dir, cref] if reloading_enabled? + + # We don't unregister `dir` in the registry because concurrent threads + # wouldn't find a loader associated to it in Kernel#require and would + # try to require the directory. Instead, we are going to keep track of + # these to be able to unregister later if eager loading. + autoloaded_dirs << dir + + on_namespace_loaded(autovivified_module) + + run_on_load_callbacks(cpath) + end + end + end + + # Invoked when a class or module is created or reopened, either from the + # tracer or from module autovivification. If the namespace has matching + # subdirectories, we descend into them now. + # + # @private + # @sig (Module) -> void + def on_namespace_loaded(namespace) + if subdirs = lazy_subdirs.delete(real_mod_name(namespace)) + subdirs.each do |subdir| + set_autoloads_in_dir(subdir, namespace) + end + end + end + + private + + # @sig (String) -> void + def run_on_load_callbacks(cpath) + # Very common, do not even compute a hash code. + return if on_load_callbacks.empty? + + callbacks = reloading_enabled? ? on_load_callbacks[cpath] : on_load_callbacks.delete(cpath) + callbacks.each(&:call) if callbacks + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/real_mod_name.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/real_mod_name.rb new file mode 100644 index 000000000000..c1233069b6a3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/real_mod_name.rb @@ -0,0 +1,20 @@ +module Zeitwerk::RealModName + UNBOUND_METHOD_MODULE_NAME = Module.instance_method(:name) + private_constant :UNBOUND_METHOD_MODULE_NAME + + # Returns the real name of the class or module, as set after the first + # constant to which it was assigned (or nil). + # + # The name method can be overridden, hence the indirection in this method. + # + # @sig (Module) -> String? + if UnboundMethod.method_defined?(:bind_call) + def real_mod_name(mod) + UNBOUND_METHOD_MODULE_NAME.bind_call(mod) + end + else + def real_mod_name(mod) + UNBOUND_METHOD_MODULE_NAME.bind(mod).call + end + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/registry.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/registry.rb new file mode 100644 index 000000000000..dcb78dbe3431 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/registry.rb @@ -0,0 +1,136 @@ +# frozen_string_literal: true + +module Zeitwerk + module Registry # :nodoc: all + class << self + # Keeps track of all loaders. Useful to broadcast messages and to prevent + # them from being garbage collected. + # + # @private + # @sig Array[Zeitwerk::Loader] + attr_reader :loaders + + # Registers loaders created with `for_gem` to make the method idempotent + # in case of reload. + # + # @private + # @sig Hash[String, Zeitwerk::Loader] + attr_reader :loaders_managing_gems + + # Maps real paths to the loaders responsible for them. + # + # This information is used by our decorated `Kernel#require` to be able to + # invoke callbacks and autovivify modules. + # + # @private + # @sig Hash[String, Zeitwerk::Loader] + attr_reader :autoloads + + # This hash table addresses an edge case in which an autoload is ignored. + # + # For example, let's suppose we want to autoload in a gem like this: + # + # # lib/my_gem.rb + # loader = Zeitwerk::Loader.new + # loader.push_dir(__dir__) + # loader.setup + # + # module MyGem + # end + # + # if you require "my_gem", as Bundler would do, this happens while setting + # up autoloads: + # + # 1. Object.autoload?(:MyGem) returns `nil` because the autoload for + # the constant is issued by Zeitwerk while the same file is being + # required. + # 2. The constant `MyGem` is undefined while setup runs. + # + # Therefore, a directory `lib/my_gem` would autovivify a module according to + # the existing information. But that would be wrong. + # + # To overcome this fundamental limitation, we keep track of the constant + # paths that are in this situation ---in the example above, "MyGem"--- and + # take this collection into account for the autovivification logic. + # + # Note that you cannot generally address this by moving the setup code + # below the constant definition, because we want libraries to be able to + # use managed constants in the module body: + # + # module MyGem + # include MyConcern + # end + # + # @private + # @sig Hash[String, [String, Zeitwerk::Loader]] + attr_reader :inceptions + + # Registers a loader. + # + # @private + # @sig (Zeitwerk::Loader) -> void + def register_loader(loader) + loaders << loader + end + + # This method returns always a loader, the same instance for the same root + # file. That is how Zeitwerk::Loader.for_gem is idempotent. + # + # @private + # @sig (String) -> Zeitwerk::Loader + def loader_for_gem(root_file) + loaders_managing_gems[root_file] ||= begin + Loader.new.tap do |loader| + loader.tag = File.basename(root_file, ".rb") + loader.inflector = GemInflector.new(root_file) + loader.push_dir(File.dirname(root_file)) + end + end + end + + # @private + # @sig (Zeitwerk::Loader, String) -> String + def register_autoload(loader, realpath) + autoloads[realpath] = loader + end + + # @private + # @sig (String) -> void + def unregister_autoload(realpath) + autoloads.delete(realpath) + end + + # @private + # @sig (String, String, Zeitwerk::Loader) -> void + def register_inception(cpath, realpath, loader) + inceptions[cpath] = [realpath, loader] + end + + # @private + # @sig (String) -> String? + def inception?(cpath) + if pair = inceptions[cpath] + pair.first + end + end + + # @private + # @sig (String) -> Zeitwerk::Loader? + def loader_for(path) + autoloads[path] + end + + # @private + # @sig (Zeitwerk::Loader) -> void + def on_unload(loader) + autoloads.delete_if { |_path, object| object == loader } + inceptions.delete_if { |_cpath, (_path, object)| object == loader } + end + end + + @loaders = [] + @loaders_managing_gems = {} + @autoloads = {} + @inceptions = {} + end +end diff --git a/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/version.rb b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/version.rb new file mode 100644 index 000000000000..080ab2b27733 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/gems/zeitwerk-2.4.2/lib/zeitwerk/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Zeitwerk + VERSION = "2.4.2" +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/activesupport-6.0.3.6.gemspec b/vendor/bundler/ruby/2.5.0/specifications/activesupport-6.0.3.6.gemspec new file mode 100644 index 000000000000..6775b4150429 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/activesupport-6.0.3.6.gemspec @@ -0,0 +1,47 @@ +# -*- encoding: utf-8 -*- +# stub: activesupport 6.0.3.6 ruby lib + +Gem::Specification.new do |s| + s.name = "activesupport".freeze + s.version = "6.0.3.6" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rails/rails/issues", "changelog_uri" => "https://github.com/rails/rails/blob/v6.0.3.6/activesupport/CHANGELOG.md", "documentation_uri" => "https://api.rubyonrails.org/v6.0.3.6/", "mailing_list_uri" => "https://discuss.rubyonrails.org/c/rubyonrails-talk", "source_code_uri" => "https://github.com/rails/rails/tree/v6.0.3.6/activesupport" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["David Heinemeier Hansson".freeze] + s.date = "2021-03-26" + s.description = "A toolkit of support libraries and Ruby core extensions extracted from the Rails framework. Rich support for multibyte strings, internationalization, time zones, and testing.".freeze + s.email = "david@loudthinking.com".freeze + s.homepage = "https://rubyonrails.org".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--encoding".freeze, "UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "A toolkit of support libraries and Ruby core extensions extracted from the Rails framework.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<i18n>.freeze, ["< 2", ">= 0.7"]) + s.add_runtime_dependency(%q<tzinfo>.freeze, ["~> 1.1"]) + s.add_runtime_dependency(%q<minitest>.freeze, ["~> 5.1"]) + s.add_runtime_dependency(%q<concurrent-ruby>.freeze, [">= 1.0.2", "~> 1.0"]) + s.add_runtime_dependency(%q<zeitwerk>.freeze, [">= 2.2.2", "~> 2.2"]) + else + s.add_dependency(%q<i18n>.freeze, ["< 2", ">= 0.7"]) + s.add_dependency(%q<tzinfo>.freeze, ["~> 1.1"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.1"]) + s.add_dependency(%q<concurrent-ruby>.freeze, [">= 1.0.2", "~> 1.0"]) + s.add_dependency(%q<zeitwerk>.freeze, [">= 2.2.2", "~> 2.2"]) + end + else + s.add_dependency(%q<i18n>.freeze, ["< 2", ">= 0.7"]) + s.add_dependency(%q<tzinfo>.freeze, ["~> 1.1"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.1"]) + s.add_dependency(%q<concurrent-ruby>.freeze, [">= 1.0.2", "~> 1.0"]) + s.add_dependency(%q<zeitwerk>.freeze, [">= 2.2.2", "~> 2.2"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/addressable-2.8.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/addressable-2.8.0.gemspec new file mode 100644 index 000000000000..e8e1f9c53465 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/addressable-2.8.0.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- +# stub: addressable 2.8.0 ruby lib + +Gem::Specification.new do |s| + s.name = "addressable".freeze + s.version = "2.8.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Bob Aman".freeze] + s.date = "2021-07-03" + s.description = "Addressable is an alternative implementation to the URI implementation that is\npart of Ruby's standard library. It is flexible, offers heuristic parsing, and\nadditionally provides extensive support for IRIs and URI templates.\n".freeze + s.email = "bob@sporkmonger.com".freeze + s.extra_rdoc_files = ["README.md".freeze] + s.files = ["README.md".freeze] + s.homepage = "https://github.com/sporkmonger/addressable".freeze + s.licenses = ["Apache-2.0".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "URI Implementation".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<public_suffix>.freeze, ["< 5.0", ">= 2.0.2"]) + s.add_development_dependency(%q<bundler>.freeze, ["< 3.0", ">= 1.0"]) + else + s.add_dependency(%q<public_suffix>.freeze, ["< 5.0", ">= 2.0.2"]) + s.add_dependency(%q<bundler>.freeze, ["< 3.0", ">= 1.0"]) + end + else + s.add_dependency(%q<public_suffix>.freeze, ["< 5.0", ">= 2.0.2"]) + s.add_dependency(%q<bundler>.freeze, ["< 3.0", ">= 1.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/autoprefixer-rails-9.8.6.5.gemspec b/vendor/bundler/ruby/2.5.0/specifications/autoprefixer-rails-9.8.6.5.gemspec new file mode 100644 index 000000000000..c1fff474447c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/autoprefixer-rails-9.8.6.5.gemspec @@ -0,0 +1,53 @@ +# -*- encoding: utf-8 -*- +# stub: autoprefixer-rails 9.8.6.5 ruby lib + +Gem::Specification.new do |s| + s.name = "autoprefixer-rails".freeze + s.version = "9.8.6.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/ai/autoprefixer-rails/issues", "changelog_uri" => "https://github.com/ai/autoprefixer-rails/blob/master/CHANGELOG.md", "source_code_uri" => "https://github.com/ai/autoprefixer-rails" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Andrey Sitnik".freeze] + s.date = "2020-09-16" + s.email = "andrey@sitnik.ru".freeze + s.extra_rdoc_files = ["README.md".freeze, "LICENSE".freeze, "CHANGELOG.md".freeze] + s.files = ["CHANGELOG.md".freeze, "LICENSE".freeze, "README.md".freeze] + s.homepage = "https://github.com/ai/autoprefixer-rails".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Parse CSS and add vendor prefixes to CSS rules using values from the Can I Use website.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<execjs>.freeze, [">= 0"]) + s.add_development_dependency(%q<rails>.freeze, [">= 0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<rspec-rails>.freeze, [">= 0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.85.1"]) + s.add_development_dependency(%q<rubocop-packaging>.freeze, ["~> 0.1.1"]) + s.add_development_dependency(%q<standard>.freeze, [">= 0"]) + else + s.add_dependency(%q<execjs>.freeze, [">= 0"]) + s.add_dependency(%q<rails>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec-rails>.freeze, [">= 0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.85.1"]) + s.add_dependency(%q<rubocop-packaging>.freeze, ["~> 0.1.1"]) + s.add_dependency(%q<standard>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<execjs>.freeze, [">= 0"]) + s.add_dependency(%q<rails>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec-rails>.freeze, [">= 0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.85.1"]) + s.add_dependency(%q<rubocop-packaging>.freeze, ["~> 0.1.1"]) + s.add_dependency(%q<standard>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/coffee-script-2.4.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/coffee-script-2.4.1.gemspec new file mode 100644 index 000000000000..4bc619afb1c1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/coffee-script-2.4.1.gemspec @@ -0,0 +1,41 @@ +# -*- encoding: utf-8 -*- +# stub: coffee-script 2.4.1 ruby lib + +Gem::Specification.new do |s| + s.name = "coffee-script".freeze + s.version = "2.4.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jeremy Ashkenas".freeze, "Joshua Peek".freeze, "Sam Stephenson".freeze] + s.date = "2015-04-06" + s.description = " Ruby CoffeeScript is a bridge to the JS CoffeeScript compiler.\n".freeze + s.email = "josh@joshpeek.com".freeze + s.homepage = "http://github.com/josh/ruby-coffee-script".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Ruby CoffeeScript Compiler".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<coffee-script-source>.freeze, [">= 0"]) + s.add_runtime_dependency(%q<execjs>.freeze, [">= 0"]) + s.add_development_dependency(%q<json>.freeze, [">= 0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + else + s.add_dependency(%q<coffee-script-source>.freeze, [">= 0"]) + s.add_dependency(%q<execjs>.freeze, [">= 0"]) + s.add_dependency(%q<json>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<coffee-script-source>.freeze, [">= 0"]) + s.add_dependency(%q<execjs>.freeze, [">= 0"]) + s.add_dependency(%q<json>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/coffee-script-source-1.11.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/coffee-script-source-1.11.1.gemspec new file mode 100644 index 000000000000..0faa39d791b0 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/coffee-script-source-1.11.1.gemspec @@ -0,0 +1,21 @@ +# -*- encoding: utf-8 -*- +# stub: coffee-script-source 1.11.1 ruby lib + +Gem::Specification.new do |s| + s.name = "coffee-script-source".freeze + s.version = "1.11.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jeremy Ashkenas".freeze] + s.date = "2016-10-02" + s.description = " CoffeeScript is a little language that compiles into JavaScript.\n Underneath all of those embarrassing braces and semicolons,\n JavaScript has always had a gorgeous object model at its heart.\n CoffeeScript is an attempt to expose the good parts of JavaScript\n in a simple way.\n".freeze + s.email = "jashkenas@gmail.com".freeze + s.homepage = "http://coffeescript.org".freeze + s.licenses = ["MIT".freeze] + s.rubyforge_project = "coffee-script-source".freeze + s.rubygems_version = "2.7.6".freeze + s.summary = "The CoffeeScript Compiler".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/colorator-1.1.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/colorator-1.1.0.gemspec new file mode 100644 index 000000000000..b1ac4af79d1d --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/colorator-1.1.0.gemspec @@ -0,0 +1,34 @@ +# -*- encoding: utf-8 -*- +# stub: colorator 1.1.0 ruby lib + +Gem::Specification.new do |s| + s.name = "colorator".freeze + s.version = "1.1.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Parker Moore".freeze, "Brandon Mathis".freeze] + s.date = "2016-06-29" + s.email = ["parkrmoore@gmail.com".freeze, "brandon@imathis.com".freeze] + s.extra_rdoc_files = ["README.markdown".freeze, "LICENSE".freeze] + s.files = ["LICENSE".freeze, "README.markdown".freeze] + s.homepage = "https://github.com/octopress/colorator".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Colorize your text in the terminal.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.1"]) + else + s.add_dependency(%q<rspec>.freeze, ["~> 3.1"]) + end + else + s.add_dependency(%q<rspec>.freeze, ["~> 3.1"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/commonmarker-0.17.13.gemspec b/vendor/bundler/ruby/2.5.0/specifications/commonmarker-0.17.13.gemspec new file mode 100644 index 000000000000..6879bfc51fa1 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/specifications/commonmarker-0.17.13.gemspec differ diff --git a/vendor/bundler/ruby/2.5.0/specifications/concurrent-ruby-1.1.8.gemspec b/vendor/bundler/ruby/2.5.0/specifications/concurrent-ruby-1.1.8.gemspec new file mode 100644 index 000000000000..4fb5dd460741 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/concurrent-ruby-1.1.8.gemspec @@ -0,0 +1,24 @@ +# -*- encoding: utf-8 -*- +# stub: concurrent-ruby 1.1.8 ruby lib/concurrent-ruby + +Gem::Specification.new do |s| + s.name = "concurrent-ruby".freeze + s.version = "1.1.8" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "changelog_uri" => "https://github.com/ruby-concurrency/concurrent-ruby/blob/master/CHANGELOG.md", "source_code_uri" => "https://github.com/ruby-concurrency/concurrent-ruby" } if s.respond_to? :metadata= + s.require_paths = ["lib/concurrent-ruby".freeze] + s.authors = ["Jerry D'Antonio".freeze, "Petr Chalupa".freeze, "The Ruby Concurrency Team".freeze] + s.date = "2021-01-20" + s.description = "Modern concurrency tools including agents, futures, promises, thread pools, actors, supervisors, and more.\nInspired by Erlang, Clojure, Go, JavaScript, actors, and classic concurrency patterns.\n".freeze + s.email = "concurrent-ruby@googlegroups.com".freeze + s.extra_rdoc_files = ["README.md".freeze, "LICENSE.txt".freeze, "CHANGELOG.md".freeze] + s.files = ["CHANGELOG.md".freeze, "LICENSE.txt".freeze, "README.md".freeze] + s.homepage = "http://www.concurrent-ruby.com".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell, F#, C#, Java, and classic concurrency patterns.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/dnsruby-1.61.5.gemspec b/vendor/bundler/ruby/2.5.0/specifications/dnsruby-1.61.5.gemspec new file mode 100644 index 000000000000..8f548cac0759 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/dnsruby-1.61.5.gemspec @@ -0,0 +1,57 @@ +# -*- encoding: utf-8 -*- +# stub: dnsruby 1.61.5 ruby lib + +Gem::Specification.new do |s| + s.name = "dnsruby".freeze + s.version = "1.61.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/alexdalitz/dnsruby/issues", "changelog_uri" => "https://github.com/alexdalitz/dnsruby/blob/master/RELEASE_NOTES.md", "documentation_uri" => "https://www.rubydoc.info/gems/dnsruby/", "homepage_uri" => "https://github.com/alexdalitz/dnsruby", "source_code_uri" => "https://github.com/alexdalitz/dnsruby", "yard.run" => "yard" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Alex Dalitz".freeze] + s.date = "2020-10-29" + s.description = "Dnsruby is a pure Ruby DNS client library which implements a\nstub resolver. It aims to comply with all DNS RFCs, including\nDNSSEC NSEC3 support.".freeze + s.email = "alex@caerkettontech.com".freeze + s.extra_rdoc_files = ["DNSSEC".freeze, "EXAMPLES".freeze, "README.md".freeze, "EVENTMACHINE".freeze] + s.files = ["DNSSEC".freeze, "EVENTMACHINE".freeze, "EXAMPLES".freeze, "README.md".freeze] + s.homepage = "https://github.com/alexdalitz/dnsruby".freeze + s.licenses = ["Apache License, Version 2.0".freeze] + s.post_install_message = "Installing dnsruby...\n For issues and source code: https://github.com/alexdalitz/dnsruby\n For general discussion (please tell us how you use dnsruby): https://groups.google.com/forum/#!forum/dnsruby".freeze + s.rubygems_version = "2.7.6".freeze + s.summary = "Ruby DNS(SEC) implementation".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rake>.freeze, [">= 12.3.3"]) + s.add_development_dependency(%q<minitest>.freeze, ["~> 5.4"]) + s.add_development_dependency(%q<rubydns>.freeze, ["~> 2.0.1"]) + s.add_development_dependency(%q<nio4r>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<minitest-display>.freeze, [">= 0.3.0"]) + s.add_development_dependency(%q<yard>.freeze, ["~> 0.9"]) + s.add_development_dependency(%q<coveralls>.freeze, ["~> 0.7"]) + s.add_runtime_dependency(%q<simpleidn>.freeze, ["~> 0.1"]) + else + s.add_dependency(%q<rake>.freeze, [">= 12.3.3"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.4"]) + s.add_dependency(%q<rubydns>.freeze, ["~> 2.0.1"]) + s.add_dependency(%q<nio4r>.freeze, ["~> 2.0"]) + s.add_dependency(%q<minitest-display>.freeze, [">= 0.3.0"]) + s.add_dependency(%q<yard>.freeze, ["~> 0.9"]) + s.add_dependency(%q<coveralls>.freeze, ["~> 0.7"]) + s.add_dependency(%q<simpleidn>.freeze, ["~> 0.1"]) + end + else + s.add_dependency(%q<rake>.freeze, [">= 12.3.3"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.4"]) + s.add_dependency(%q<rubydns>.freeze, ["~> 2.0.1"]) + s.add_dependency(%q<nio4r>.freeze, ["~> 2.0"]) + s.add_dependency(%q<minitest-display>.freeze, [">= 0.3.0"]) + s.add_dependency(%q<yard>.freeze, ["~> 0.9"]) + s.add_dependency(%q<coveralls>.freeze, ["~> 0.7"]) + s.add_dependency(%q<simpleidn>.freeze, ["~> 0.1"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/em-websocket-0.5.2.gemspec b/vendor/bundler/ruby/2.5.0/specifications/em-websocket-0.5.2.gemspec new file mode 100644 index 000000000000..1176a116e7db --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/em-websocket-0.5.2.gemspec @@ -0,0 +1,35 @@ +# -*- encoding: utf-8 -*- +# stub: em-websocket 0.5.2 ruby lib + +Gem::Specification.new do |s| + s.name = "em-websocket".freeze + s.version = "0.5.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ilya Grigorik".freeze, "Martyn Loughran".freeze] + s.date = "2020-09-23" + s.description = "EventMachine based WebSocket server".freeze + s.email = ["ilya@igvita.com".freeze, "me@mloughran.com".freeze] + s.homepage = "http://github.com/igrigorik/em-websocket".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "EventMachine based WebSocket server".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<eventmachine>.freeze, [">= 0.12.9"]) + s.add_runtime_dependency(%q<http_parser.rb>.freeze, ["~> 0.6.0"]) + else + s.add_dependency(%q<eventmachine>.freeze, [">= 0.12.9"]) + s.add_dependency(%q<http_parser.rb>.freeze, ["~> 0.6.0"]) + end + else + s.add_dependency(%q<eventmachine>.freeze, [">= 0.12.9"]) + s.add_dependency(%q<http_parser.rb>.freeze, ["~> 0.6.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/ethon-0.12.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/ethon-0.12.0.gemspec new file mode 100644 index 000000000000..593940879363 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/ethon-0.12.0.gemspec @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- +# stub: ethon 0.12.0 ruby lib + +Gem::Specification.new do |s| + s.name = "ethon".freeze + s.version = "0.12.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Hans Hasselberg".freeze] + s.date = "2019-01-10" + s.description = "Very lightweight libcurl wrapper.".freeze + s.email = ["me@hans.io".freeze] + s.homepage = "https://github.com/typhoeus/ethon".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Libcurl wrapper.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<ffi>.freeze, [">= 1.3.0"]) + else + s.add_dependency(%q<ffi>.freeze, [">= 1.3.0"]) + end + else + s.add_dependency(%q<ffi>.freeze, [">= 1.3.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/eventmachine-1.2.7.gemspec b/vendor/bundler/ruby/2.5.0/specifications/eventmachine-1.2.7.gemspec new file mode 100644 index 000000000000..917974516c02 Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/specifications/eventmachine-1.2.7.gemspec differ diff --git a/vendor/bundler/ruby/2.5.0/specifications/execjs-2.7.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/execjs-2.7.0.gemspec new file mode 100644 index 000000000000..3d8b834211ad --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/execjs-2.7.0.gemspec @@ -0,0 +1,33 @@ +# -*- encoding: utf-8 -*- +# stub: execjs 2.7.0 ruby lib + +Gem::Specification.new do |s| + s.name = "execjs".freeze + s.version = "2.7.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Sam Stephenson".freeze, "Josh Peek".freeze] + s.date = "2016-05-20" + s.description = "ExecJS lets you run JavaScript code from Ruby.".freeze + s.email = ["sstephenson@gmail.com".freeze, "josh@joshpeek.com".freeze] + s.homepage = "https://github.com/rails/execjs".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Run JavaScript code from Ruby".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + else + s.add_dependency(%q<rake>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<rake>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/faraday-1.3.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/faraday-1.3.0.gemspec new file mode 100644 index 000000000000..bf822114d74f Binary files /dev/null and b/vendor/bundler/ruby/2.5.0/specifications/faraday-1.3.0.gemspec differ diff --git a/vendor/bundler/ruby/2.5.0/specifications/faraday-net_http-1.0.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/faraday-net_http-1.0.1.gemspec new file mode 100644 index 000000000000..f7e96f4069ab --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/faraday-net_http-1.0.1.gemspec @@ -0,0 +1,61 @@ +# -*- encoding: utf-8 -*- +# stub: faraday-net_http 1.0.1 ruby lib + +Gem::Specification.new do |s| + s.name = "faraday-net_http".freeze + s.version = "1.0.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "changelog_uri" => "https://github.com/lostisland/faraday-net_http", "homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Jan van der Pas".freeze] + s.date = "2021-01-12" + s.description = "Faraday adapter for Net::HTTP".freeze + s.email = ["janvanderpas@gmail.com".freeze] + s.homepage = "https://github.com/lostisland/faraday-net_http".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Faraday adapter for Net::HTTP".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<faraday>.freeze, ["~> 1.0"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.19.0"]) + s.add_development_dependency(%q<multipart-parser>.freeze, ["~> 0.1.1"]) + s.add_development_dependency(%q<webmock>.freeze, ["~> 3.4"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.91.1"]) + s.add_development_dependency(%q<rubocop-packaging>.freeze, ["~> 0.5"]) + s.add_development_dependency(%q<rubocop-performance>.freeze, ["~> 1.0"]) + else + s.add_dependency(%q<faraday>.freeze, ["~> 1.0"]) + s.add_dependency(%q<bundler>.freeze, ["~> 2.0"]) + s.add_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<simplecov>.freeze, ["~> 0.19.0"]) + s.add_dependency(%q<multipart-parser>.freeze, ["~> 0.1.1"]) + s.add_dependency(%q<webmock>.freeze, ["~> 3.4"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.91.1"]) + s.add_dependency(%q<rubocop-packaging>.freeze, ["~> 0.5"]) + s.add_dependency(%q<rubocop-performance>.freeze, ["~> 1.0"]) + end + else + s.add_dependency(%q<faraday>.freeze, ["~> 1.0"]) + s.add_dependency(%q<bundler>.freeze, ["~> 2.0"]) + s.add_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<simplecov>.freeze, ["~> 0.19.0"]) + s.add_dependency(%q<multipart-parser>.freeze, ["~> 0.1.1"]) + s.add_dependency(%q<webmock>.freeze, ["~> 3.4"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.91.1"]) + s.add_dependency(%q<rubocop-packaging>.freeze, ["~> 0.5"]) + s.add_dependency(%q<rubocop-performance>.freeze, ["~> 1.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/ffi-1.15.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/ffi-1.15.0.gemspec new file mode 100644 index 000000000000..41b12f79deff --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/ffi-1.15.0.gemspec @@ -0,0 +1,50 @@ +# -*- encoding: utf-8 -*- +# stub: ffi 1.15.0 ruby lib +# stub: ext/ffi_c/extconf.rb + +Gem::Specification.new do |s| + s.name = "ffi".freeze + s.version = "1.15.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/ffi/ffi/issues", "changelog_uri" => "https://github.com/ffi/ffi/blob/master/CHANGELOG.md", "documentation_uri" => "https://github.com/ffi/ffi/wiki", "mailing_list_uri" => "http://groups.google.com/group/ruby-ffi", "source_code_uri" => "https://github.com/ffi/ffi/", "wiki_uri" => "https://github.com/ffi/ffi/wiki" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Wayne Meissner".freeze] + s.date = "2021-03-05" + s.description = "Ruby FFI library".freeze + s.email = "wmeissner@gmail.com".freeze + s.extensions = ["ext/ffi_c/extconf.rb".freeze] + s.files = ["ext/ffi_c/extconf.rb".freeze] + s.homepage = "https://github.com/ffi/ffi/wiki".freeze + s.licenses = ["BSD-3-Clause".freeze] + s.rdoc_options = ["--exclude=ext/ffi_c/.*\\.o$".freeze, "--exclude=ffi_c\\.(bundle|so)$".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Ruby FFI".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_development_dependency(%q<rake-compiler>.freeze, ["~> 1.0"]) + s.add_development_dependency(%q<rake-compiler-dock>.freeze, ["~> 1.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 2.14.1"]) + s.add_development_dependency(%q<rubygems-tasks>.freeze, ["~> 0.2.4"]) + else + s.add_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.0"]) + s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 1.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 2.14.1"]) + s.add_dependency(%q<rubygems-tasks>.freeze, ["~> 0.2.4"]) + end + else + s.add_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.0"]) + s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 1.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 2.14.1"]) + s.add_dependency(%q<rubygems-tasks>.freeze, ["~> 0.2.4"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/forwardable-extended-2.6.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/forwardable-extended-2.6.0.gemspec new file mode 100644 index 000000000000..3121acc7e877 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/forwardable-extended-2.6.0.gemspec @@ -0,0 +1,20 @@ +# -*- encoding: utf-8 -*- +# stub: forwardable-extended 2.6.0 ruby lib + +Gem::Specification.new do |s| + s.name = "forwardable-extended".freeze + s.version = "2.6.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jordon Bedwell".freeze] + s.date = "2016-04-06" + s.description = "Forwardable with hash, and instance variable extensions.".freeze + s.email = ["jordon@envygeeks.io".freeze] + s.homepage = "http://github.com/envygeeks/forwardable-extended".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Forwardable with hash, and instance variable extensions.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/gemoji-3.0.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/gemoji-3.0.1.gemspec new file mode 100644 index 000000000000..f3ac4ab62388 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/gemoji-3.0.1.gemspec @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +# stub: gemoji 3.0.1 ruby lib + +Gem::Specification.new do |s| + s.name = "gemoji".freeze + s.version = "3.0.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["GitHub".freeze] + s.date = "2019-04-25" + s.description = "Character information and metadata for standard and custom emoji.".freeze + s.email = "support@github.com".freeze + s.executables = ["gemoji".freeze] + s.files = ["bin/gemoji".freeze] + s.homepage = "https://github.com/github/gemoji".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new("> 1.9".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Emoji library".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/github-pages-214.gemspec b/vendor/bundler/ruby/2.5.0/specifications/github-pages-214.gemspec new file mode 100644 index 000000000000..26040a00255c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/github-pages-214.gemspec @@ -0,0 +1,173 @@ +# -*- encoding: utf-8 -*- +# stub: github-pages 214 ruby lib + +Gem::Specification.new do |s| + s.name = "github-pages".freeze + s.version = "214" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["GitHub, Inc.".freeze] + s.date = "2021-03-31" + s.description = "Bootstrap the GitHub Pages Jekyll environment locally.".freeze + s.email = "support@github.com".freeze + s.executables = ["github-pages".freeze] + s.files = ["bin/github-pages".freeze] + s.homepage = "https://github.com/github/pages-gem".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Track GitHub Pages dependencies.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["= 3.9.0"]) + s.add_runtime_dependency(%q<jekyll-sass-converter>.freeze, ["= 1.5.2"]) + s.add_runtime_dependency(%q<kramdown>.freeze, ["= 2.3.1"]) + s.add_runtime_dependency(%q<kramdown-parser-gfm>.freeze, ["= 1.1.0"]) + s.add_runtime_dependency(%q<jekyll-commonmark-ghpages>.freeze, ["= 0.1.6"]) + s.add_runtime_dependency(%q<liquid>.freeze, ["= 4.0.3"]) + s.add_runtime_dependency(%q<rouge>.freeze, ["= 3.26.0"]) + s.add_runtime_dependency(%q<github-pages-health-check>.freeze, ["= 1.17.0"]) + s.add_runtime_dependency(%q<jekyll-redirect-from>.freeze, ["= 0.16.0"]) + s.add_runtime_dependency(%q<jekyll-sitemap>.freeze, ["= 1.4.0"]) + s.add_runtime_dependency(%q<jekyll-feed>.freeze, ["= 0.15.1"]) + s.add_runtime_dependency(%q<jekyll-gist>.freeze, ["= 1.5.0"]) + s.add_runtime_dependency(%q<jekyll-paginate>.freeze, ["= 1.1.0"]) + s.add_runtime_dependency(%q<jekyll-coffeescript>.freeze, ["= 1.1.1"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["= 2.7.1"]) + s.add_runtime_dependency(%q<jekyll-github-metadata>.freeze, ["= 2.13.0"]) + s.add_runtime_dependency(%q<jekyll-avatar>.freeze, ["= 0.7.0"]) + s.add_runtime_dependency(%q<jekyll-remote-theme>.freeze, ["= 0.4.3"]) + s.add_runtime_dependency(%q<jemoji>.freeze, ["= 0.12.0"]) + s.add_runtime_dependency(%q<jekyll-mentions>.freeze, ["= 1.6.0"]) + s.add_runtime_dependency(%q<jekyll-relative-links>.freeze, ["= 0.6.1"]) + s.add_runtime_dependency(%q<jekyll-optional-front-matter>.freeze, ["= 0.3.2"]) + s.add_runtime_dependency(%q<jekyll-readme-index>.freeze, ["= 0.3.0"]) + s.add_runtime_dependency(%q<jekyll-default-layout>.freeze, ["= 0.1.4"]) + s.add_runtime_dependency(%q<jekyll-titles-from-headings>.freeze, ["= 0.5.3"]) + s.add_runtime_dependency(%q<jekyll-swiss>.freeze, ["= 1.0.0"]) + s.add_runtime_dependency(%q<minima>.freeze, ["= 2.5.1"]) + s.add_runtime_dependency(%q<jekyll-theme-primer>.freeze, ["= 0.5.4"]) + s.add_runtime_dependency(%q<jekyll-theme-architect>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-cayman>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-dinky>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-hacker>.freeze, ["= 0.1.2"]) + s.add_runtime_dependency(%q<jekyll-theme-leap-day>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-merlot>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-midnight>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-minimal>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-modernist>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-slate>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-tactile>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<jekyll-theme-time-machine>.freeze, ["= 0.1.1"]) + s.add_runtime_dependency(%q<mercenary>.freeze, ["~> 0.3"]) + s.add_runtime_dependency(%q<nokogiri>.freeze, ["< 2.0", ">= 1.10.4"]) + s.add_runtime_dependency(%q<terminal-table>.freeze, ["~> 1.4"]) + s.add_development_dependency(%q<jekyll_test_plugin_malicious>.freeze, ["~> 0.2"]) + s.add_development_dependency(%q<pry>.freeze, ["~> 0.10"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.3"]) + s.add_development_dependency(%q<rubocop-github>.freeze, ["= 0.16.0"]) + else + s.add_dependency(%q<jekyll>.freeze, ["= 3.9.0"]) + s.add_dependency(%q<jekyll-sass-converter>.freeze, ["= 1.5.2"]) + s.add_dependency(%q<kramdown>.freeze, ["= 2.3.1"]) + s.add_dependency(%q<kramdown-parser-gfm>.freeze, ["= 1.1.0"]) + s.add_dependency(%q<jekyll-commonmark-ghpages>.freeze, ["= 0.1.6"]) + s.add_dependency(%q<liquid>.freeze, ["= 4.0.3"]) + s.add_dependency(%q<rouge>.freeze, ["= 3.26.0"]) + s.add_dependency(%q<github-pages-health-check>.freeze, ["= 1.17.0"]) + s.add_dependency(%q<jekyll-redirect-from>.freeze, ["= 0.16.0"]) + s.add_dependency(%q<jekyll-sitemap>.freeze, ["= 1.4.0"]) + s.add_dependency(%q<jekyll-feed>.freeze, ["= 0.15.1"]) + s.add_dependency(%q<jekyll-gist>.freeze, ["= 1.5.0"]) + s.add_dependency(%q<jekyll-paginate>.freeze, ["= 1.1.0"]) + s.add_dependency(%q<jekyll-coffeescript>.freeze, ["= 1.1.1"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["= 2.7.1"]) + s.add_dependency(%q<jekyll-github-metadata>.freeze, ["= 2.13.0"]) + s.add_dependency(%q<jekyll-avatar>.freeze, ["= 0.7.0"]) + s.add_dependency(%q<jekyll-remote-theme>.freeze, ["= 0.4.3"]) + s.add_dependency(%q<jemoji>.freeze, ["= 0.12.0"]) + s.add_dependency(%q<jekyll-mentions>.freeze, ["= 1.6.0"]) + s.add_dependency(%q<jekyll-relative-links>.freeze, ["= 0.6.1"]) + s.add_dependency(%q<jekyll-optional-front-matter>.freeze, ["= 0.3.2"]) + s.add_dependency(%q<jekyll-readme-index>.freeze, ["= 0.3.0"]) + s.add_dependency(%q<jekyll-default-layout>.freeze, ["= 0.1.4"]) + s.add_dependency(%q<jekyll-titles-from-headings>.freeze, ["= 0.5.3"]) + s.add_dependency(%q<jekyll-swiss>.freeze, ["= 1.0.0"]) + s.add_dependency(%q<minima>.freeze, ["= 2.5.1"]) + s.add_dependency(%q<jekyll-theme-primer>.freeze, ["= 0.5.4"]) + s.add_dependency(%q<jekyll-theme-architect>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-cayman>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-dinky>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-hacker>.freeze, ["= 0.1.2"]) + s.add_dependency(%q<jekyll-theme-leap-day>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-merlot>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-midnight>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-minimal>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-modernist>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-slate>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-tactile>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-time-machine>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<mercenary>.freeze, ["~> 0.3"]) + s.add_dependency(%q<nokogiri>.freeze, ["< 2.0", ">= 1.10.4"]) + s.add_dependency(%q<terminal-table>.freeze, ["~> 1.4"]) + s.add_dependency(%q<jekyll_test_plugin_malicious>.freeze, ["~> 0.2"]) + s.add_dependency(%q<pry>.freeze, ["~> 0.10"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.3"]) + s.add_dependency(%q<rubocop-github>.freeze, ["= 0.16.0"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["= 3.9.0"]) + s.add_dependency(%q<jekyll-sass-converter>.freeze, ["= 1.5.2"]) + s.add_dependency(%q<kramdown>.freeze, ["= 2.3.1"]) + s.add_dependency(%q<kramdown-parser-gfm>.freeze, ["= 1.1.0"]) + s.add_dependency(%q<jekyll-commonmark-ghpages>.freeze, ["= 0.1.6"]) + s.add_dependency(%q<liquid>.freeze, ["= 4.0.3"]) + s.add_dependency(%q<rouge>.freeze, ["= 3.26.0"]) + s.add_dependency(%q<github-pages-health-check>.freeze, ["= 1.17.0"]) + s.add_dependency(%q<jekyll-redirect-from>.freeze, ["= 0.16.0"]) + s.add_dependency(%q<jekyll-sitemap>.freeze, ["= 1.4.0"]) + s.add_dependency(%q<jekyll-feed>.freeze, ["= 0.15.1"]) + s.add_dependency(%q<jekyll-gist>.freeze, ["= 1.5.0"]) + s.add_dependency(%q<jekyll-paginate>.freeze, ["= 1.1.0"]) + s.add_dependency(%q<jekyll-coffeescript>.freeze, ["= 1.1.1"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["= 2.7.1"]) + s.add_dependency(%q<jekyll-github-metadata>.freeze, ["= 2.13.0"]) + s.add_dependency(%q<jekyll-avatar>.freeze, ["= 0.7.0"]) + s.add_dependency(%q<jekyll-remote-theme>.freeze, ["= 0.4.3"]) + s.add_dependency(%q<jemoji>.freeze, ["= 0.12.0"]) + s.add_dependency(%q<jekyll-mentions>.freeze, ["= 1.6.0"]) + s.add_dependency(%q<jekyll-relative-links>.freeze, ["= 0.6.1"]) + s.add_dependency(%q<jekyll-optional-front-matter>.freeze, ["= 0.3.2"]) + s.add_dependency(%q<jekyll-readme-index>.freeze, ["= 0.3.0"]) + s.add_dependency(%q<jekyll-default-layout>.freeze, ["= 0.1.4"]) + s.add_dependency(%q<jekyll-titles-from-headings>.freeze, ["= 0.5.3"]) + s.add_dependency(%q<jekyll-swiss>.freeze, ["= 1.0.0"]) + s.add_dependency(%q<minima>.freeze, ["= 2.5.1"]) + s.add_dependency(%q<jekyll-theme-primer>.freeze, ["= 0.5.4"]) + s.add_dependency(%q<jekyll-theme-architect>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-cayman>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-dinky>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-hacker>.freeze, ["= 0.1.2"]) + s.add_dependency(%q<jekyll-theme-leap-day>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-merlot>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-midnight>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-minimal>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-modernist>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-slate>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-tactile>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<jekyll-theme-time-machine>.freeze, ["= 0.1.1"]) + s.add_dependency(%q<mercenary>.freeze, ["~> 0.3"]) + s.add_dependency(%q<nokogiri>.freeze, ["< 2.0", ">= 1.10.4"]) + s.add_dependency(%q<terminal-table>.freeze, ["~> 1.4"]) + s.add_dependency(%q<jekyll_test_plugin_malicious>.freeze, ["~> 0.2"]) + s.add_dependency(%q<pry>.freeze, ["~> 0.10"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.3"]) + s.add_dependency(%q<rubocop-github>.freeze, ["= 0.16.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/github-pages-health-check-1.17.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/github-pages-health-check-1.17.0.gemspec new file mode 100644 index 000000000000..5568c7a278a7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/github-pages-health-check-1.17.0.gemspec @@ -0,0 +1,45 @@ +# -*- encoding: utf-8 -*- +# stub: github-pages-health-check 1.17.0 ruby lib + +Gem::Specification.new do |s| + s.name = "github-pages-health-check".freeze + s.version = "1.17.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["GitHub, Inc.".freeze] + s.date = "2021-01-04" + s.description = "Checks your GitHub Pages site for commons DNS configuration issues.".freeze + s.email = "support@github.com".freeze + s.homepage = "https://github.com/github/github-pages-health-check".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.2.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Checks your GitHub Pages site for commons DNS configuration issues".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<addressable>.freeze, ["~> 2.3"]) + s.add_runtime_dependency(%q<dnsruby>.freeze, ["~> 1.60"]) + s.add_runtime_dependency(%q<octokit>.freeze, ["~> 4.0"]) + s.add_runtime_dependency(%q<public_suffix>.freeze, ["< 5.0", ">= 2.0.2"]) + s.add_runtime_dependency(%q<typhoeus>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<addressable>.freeze, ["~> 2.3"]) + s.add_dependency(%q<dnsruby>.freeze, ["~> 1.60"]) + s.add_dependency(%q<octokit>.freeze, ["~> 4.0"]) + s.add_dependency(%q<public_suffix>.freeze, ["< 5.0", ">= 2.0.2"]) + s.add_dependency(%q<typhoeus>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<addressable>.freeze, ["~> 2.3"]) + s.add_dependency(%q<dnsruby>.freeze, ["~> 1.60"]) + s.add_dependency(%q<octokit>.freeze, ["~> 4.0"]) + s.add_dependency(%q<public_suffix>.freeze, ["< 5.0", ">= 2.0.2"]) + s.add_dependency(%q<typhoeus>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/html-pipeline-2.14.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/html-pipeline-2.14.0.gemspec new file mode 100644 index 000000000000..0e9e39c4c9e1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/html-pipeline-2.14.0.gemspec @@ -0,0 +1,36 @@ +# -*- encoding: utf-8 -*- +# stub: html-pipeline 2.14.0 ruby lib + +Gem::Specification.new do |s| + s.name = "html-pipeline".freeze + s.version = "2.14.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ryan Tomayko".freeze, "Jerry Cheung".freeze, "Garen J. Torikian".freeze] + s.date = "2020-08-11" + s.description = "GitHub HTML processing filters and utilities".freeze + s.email = ["ryan@github.com".freeze, "jerry@github.com".freeze, "gjtorikian@gmail.com".freeze] + s.homepage = "https://github.com/jch/html-pipeline".freeze + s.licenses = ["MIT".freeze] + s.post_install_message = "-------------------------------------------------\nThank you for installing html-pipeline!\nYou must bundle Filter gem dependencies.\nSee html-pipeline README.md for more details.\nhttps://github.com/jch/html-pipeline#dependencies\n-------------------------------------------------\n".freeze + s.rubygems_version = "2.7.6".freeze + s.summary = "Helpers for processing content through a chain of filters".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<activesupport>.freeze, [">= 2"]) + s.add_runtime_dependency(%q<nokogiri>.freeze, [">= 1.4"]) + else + s.add_dependency(%q<activesupport>.freeze, [">= 2"]) + s.add_dependency(%q<nokogiri>.freeze, [">= 1.4"]) + end + else + s.add_dependency(%q<activesupport>.freeze, [">= 2"]) + s.add_dependency(%q<nokogiri>.freeze, [">= 1.4"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/http_parser.rb-0.6.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/http_parser.rb-0.6.0.gemspec new file mode 100644 index 000000000000..25453e9a0f45 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/http_parser.rb-0.6.0.gemspec @@ -0,0 +1,50 @@ +# -*- encoding: utf-8 -*- +# stub: http_parser.rb 0.6.0 ruby lib +# stub: ext/ruby_http_parser/extconf.rb + +Gem::Specification.new do |s| + s.name = "http_parser.rb".freeze + s.version = "0.6.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Marc-Andre Cournoyer".freeze, "Aman Gupta".freeze] + s.date = "2013-12-11" + s.description = "Ruby bindings to http://github.com/ry/http-parser and http://github.com/a2800276/http-parser.java".freeze + s.email = ["macournoyer@gmail.com".freeze, "aman@tmm1.net".freeze] + s.extensions = ["ext/ruby_http_parser/extconf.rb".freeze] + s.files = ["ext/ruby_http_parser/extconf.rb".freeze] + s.homepage = "http://github.com/tmm1/http_parser.rb".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Simple callback-based HTTP request/response parser".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rake-compiler>.freeze, [">= 0.7.9"]) + s.add_development_dependency(%q<rspec>.freeze, [">= 2.0.1"]) + s.add_development_dependency(%q<json>.freeze, [">= 1.4.6"]) + s.add_development_dependency(%q<benchmark_suite>.freeze, [">= 0"]) + s.add_development_dependency(%q<ffi>.freeze, [">= 0"]) + s.add_development_dependency(%q<yajl-ruby>.freeze, [">= 0.8.1"]) + else + s.add_dependency(%q<rake-compiler>.freeze, [">= 0.7.9"]) + s.add_dependency(%q<rspec>.freeze, [">= 2.0.1"]) + s.add_dependency(%q<json>.freeze, [">= 1.4.6"]) + s.add_dependency(%q<benchmark_suite>.freeze, [">= 0"]) + s.add_dependency(%q<ffi>.freeze, [">= 0"]) + s.add_dependency(%q<yajl-ruby>.freeze, [">= 0.8.1"]) + end + else + s.add_dependency(%q<rake-compiler>.freeze, [">= 0.7.9"]) + s.add_dependency(%q<rspec>.freeze, [">= 2.0.1"]) + s.add_dependency(%q<json>.freeze, [">= 1.4.6"]) + s.add_dependency(%q<benchmark_suite>.freeze, [">= 0"]) + s.add_dependency(%q<ffi>.freeze, [">= 0"]) + s.add_dependency(%q<yajl-ruby>.freeze, [">= 0.8.1"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/i18n-0.9.5.gemspec b/vendor/bundler/ruby/2.5.0/specifications/i18n-0.9.5.gemspec new file mode 100644 index 000000000000..d56935d98936 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/i18n-0.9.5.gemspec @@ -0,0 +1,34 @@ +# -*- encoding: utf-8 -*- +# stub: i18n 0.9.5 ruby lib + +Gem::Specification.new do |s| + s.name = "i18n".freeze + s.version = "0.9.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 1.3.5".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Sven Fuchs".freeze, "Joshua Harvey".freeze, "Matt Aimonetti".freeze, "Stephan Soller".freeze, "Saimon Moore".freeze, "Ryan Bigg".freeze] + s.date = "2018-02-13" + s.description = "New wave Internationalization support for Ruby.".freeze + s.email = "rails-i18n@googlegroups.com".freeze + s.homepage = "http://github.com/svenfuchs/i18n".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze) + s.rubyforge_project = "[none]".freeze + s.rubygems_version = "2.7.6".freeze + s.summary = "New wave Internationalization support for Ruby".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0"]) + else + s.add_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0"]) + end + else + s.add_dependency(%q<concurrent-ruby>.freeze, ["~> 1.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-3.9.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-3.9.0.gemspec new file mode 100644 index 000000000000..15825e5167ae --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-3.9.0.gemspec @@ -0,0 +1,71 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll 3.9.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll".freeze + s.version = "3.9.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Tom Preston-Werner".freeze] + s.bindir = "exe".freeze + s.date = "2020-08-05" + s.description = "Jekyll is a simple, blog aware, static site generator.".freeze + s.email = "tom@mojombo.com".freeze + s.executables = ["jekyll".freeze] + s.extra_rdoc_files = ["README.markdown".freeze, "LICENSE".freeze] + s.files = ["LICENSE".freeze, "README.markdown".freeze, "exe/jekyll".freeze] + s.homepage = "https://github.com/jekyll/jekyll".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--charset=UTF-8".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.1.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "A simple, blog aware, static site generator.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 2 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<addressable>.freeze, ["~> 2.4"]) + s.add_runtime_dependency(%q<colorator>.freeze, ["~> 1.0"]) + s.add_runtime_dependency(%q<em-websocket>.freeze, ["~> 0.5"]) + s.add_runtime_dependency(%q<i18n>.freeze, ["~> 0.7"]) + s.add_runtime_dependency(%q<jekyll-sass-converter>.freeze, ["~> 1.0"]) + s.add_runtime_dependency(%q<jekyll-watch>.freeze, ["~> 2.0"]) + s.add_runtime_dependency(%q<liquid>.freeze, ["~> 4.0"]) + s.add_runtime_dependency(%q<mercenary>.freeze, ["~> 0.3.3"]) + s.add_runtime_dependency(%q<pathutil>.freeze, ["~> 0.9"]) + s.add_runtime_dependency(%q<rouge>.freeze, ["< 4", ">= 1.7"]) + s.add_runtime_dependency(%q<safe_yaml>.freeze, ["~> 1.0"]) + s.add_runtime_dependency(%q<kramdown>.freeze, ["< 3", ">= 1.17"]) + else + s.add_dependency(%q<addressable>.freeze, ["~> 2.4"]) + s.add_dependency(%q<colorator>.freeze, ["~> 1.0"]) + s.add_dependency(%q<em-websocket>.freeze, ["~> 0.5"]) + s.add_dependency(%q<i18n>.freeze, ["~> 0.7"]) + s.add_dependency(%q<jekyll-sass-converter>.freeze, ["~> 1.0"]) + s.add_dependency(%q<jekyll-watch>.freeze, ["~> 2.0"]) + s.add_dependency(%q<liquid>.freeze, ["~> 4.0"]) + s.add_dependency(%q<mercenary>.freeze, ["~> 0.3.3"]) + s.add_dependency(%q<pathutil>.freeze, ["~> 0.9"]) + s.add_dependency(%q<rouge>.freeze, ["< 4", ">= 1.7"]) + s.add_dependency(%q<safe_yaml>.freeze, ["~> 1.0"]) + s.add_dependency(%q<kramdown>.freeze, ["< 3", ">= 1.17"]) + end + else + s.add_dependency(%q<addressable>.freeze, ["~> 2.4"]) + s.add_dependency(%q<colorator>.freeze, ["~> 1.0"]) + s.add_dependency(%q<em-websocket>.freeze, ["~> 0.5"]) + s.add_dependency(%q<i18n>.freeze, ["~> 0.7"]) + s.add_dependency(%q<jekyll-sass-converter>.freeze, ["~> 1.0"]) + s.add_dependency(%q<jekyll-watch>.freeze, ["~> 2.0"]) + s.add_dependency(%q<liquid>.freeze, ["~> 4.0"]) + s.add_dependency(%q<mercenary>.freeze, ["~> 0.3.3"]) + s.add_dependency(%q<pathutil>.freeze, ["~> 0.9"]) + s.add_dependency(%q<rouge>.freeze, ["< 4", ">= 1.7"]) + s.add_dependency(%q<safe_yaml>.freeze, ["~> 1.0"]) + s.add_dependency(%q<kramdown>.freeze, ["< 3", ">= 1.17"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-autoprefixer-1.0.2.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-autoprefixer-1.0.2.gemspec new file mode 100644 index 000000000000..2ae06f9d19c9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-autoprefixer-1.0.2.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-autoprefixer 1.0.2 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-autoprefixer".freeze + s.version = "1.0.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Vincent Wochnik".freeze] + s.date = "2019-03-11" + s.description = "Autoprefixer integration for Jekyll".freeze + s.email = ["v.wochnik@gmail.com".freeze] + s.homepage = "https://github.com/vwochnik/jekyll-autoprefixer".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "This plugin provides simple autoprefixer support for Jekyll.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<autoprefixer-rails>.freeze, ["~> 9.3"]) + s.add_development_dependency(%q<jekyll>.freeze, ["~> 3.8"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.6"]) + else + s.add_dependency(%q<autoprefixer-rails>.freeze, ["~> 9.3"]) + s.add_dependency(%q<jekyll>.freeze, ["~> 3.8"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.6"]) + end + else + s.add_dependency(%q<autoprefixer-rails>.freeze, ["~> 9.3"]) + s.add_dependency(%q<jekyll>.freeze, ["~> 3.8"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.6"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-avatar-0.7.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-avatar-0.7.0.gemspec new file mode 100644 index 000000000000..2019ae286838 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-avatar-0.7.0.gemspec @@ -0,0 +1,46 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-avatar 0.7.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-avatar".freeze + s.version = "0.7.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ben Balter".freeze] + s.date = "2019-08-12" + s.email = ["ben.balter@github.com".freeze] + s.homepage = "https://github.com/benbalter/jekyll-avatar".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A Jekyll plugin for rendering GitHub avatars".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_development_dependency(%q<bundler>.freeze, ["< 3.0", "> 1.0"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 12.3"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rspec-html-matchers>.freeze, ["~> 0.9"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10.0"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<bundler>.freeze, ["< 3.0", "> 1.0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.3"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rspec-html-matchers>.freeze, ["~> 0.9"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10.0"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<bundler>.freeze, ["< 3.0", "> 1.0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.3"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rspec-html-matchers>.freeze, ["~> 0.9"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-coffeescript-1.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-coffeescript-1.1.1.gemspec new file mode 100644 index 000000000000..389027aef107 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-coffeescript-1.1.1.gemspec @@ -0,0 +1,49 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-coffeescript 1.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-coffeescript".freeze + s.version = "1.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Parker Moore".freeze] + s.date = "2018-02-03" + s.email = ["parkrmoore@gmail.com".freeze] + s.homepage = "https://github.com/jekyll/jekyll-coffeescript".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A CoffeeScript converter for Jekyll.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<coffee-script>.freeze, ["~> 2.2"]) + s.add_runtime_dependency(%q<coffee-script-source>.freeze, ["~> 1.11.1"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_development_dependency(%q<jekyll>.freeze, [">= 2.0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<rspec>.freeze, [">= 0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.51"]) + else + s.add_dependency(%q<coffee-script>.freeze, ["~> 2.2"]) + s.add_dependency(%q<coffee-script-source>.freeze, ["~> 1.11.1"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_dependency(%q<jekyll>.freeze, [">= 2.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, [">= 0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.51"]) + end + else + s.add_dependency(%q<coffee-script>.freeze, ["~> 2.2"]) + s.add_dependency(%q<coffee-script-source>.freeze, ["~> 1.11.1"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_dependency(%q<jekyll>.freeze, [">= 2.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, [">= 0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.51"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-commonmark-1.3.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-commonmark-1.3.1.gemspec new file mode 100644 index 000000000000..8285d9153178 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-commonmark-1.3.1.gemspec @@ -0,0 +1,47 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-commonmark 1.3.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-commonmark".freeze + s.version = "1.3.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Pat Hawks".freeze] + s.date = "2019-03-25" + s.email = "pat@pathawks.com".freeze + s.homepage = "https://github.com/pathawks/jekyll-commonmark".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "CommonMark generator for Jekyll".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<commonmarker>.freeze, ["~> 0.14"]) + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5"]) + else + s.add_dependency(%q<commonmarker>.freeze, ["~> 0.14"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5"]) + end + else + s.add_dependency(%q<commonmarker>.freeze, ["~> 0.14"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-commonmark-ghpages-0.1.6.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-commonmark-ghpages-0.1.6.gemspec new file mode 100644 index 000000000000..286db424ec06 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-commonmark-ghpages-0.1.6.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-commonmark-ghpages 0.1.6 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-commonmark-ghpages".freeze + s.version = "0.1.6" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ashe Connor".freeze] + s.date = "2019-01-21" + s.email = "kivikakk@github.com".freeze + s.homepage = "https://github.com/github/jekyll-commonmark-ghpages".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "CommonMark generator for Jekyll".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll-commonmark>.freeze, ["~> 1.2"]) + s.add_runtime_dependency(%q<commonmarker>.freeze, ["~> 0.17.6"]) + s.add_runtime_dependency(%q<rouge>.freeze, ["< 4.0", ">= 2.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + else + s.add_dependency(%q<jekyll-commonmark>.freeze, ["~> 1.2"]) + s.add_dependency(%q<commonmarker>.freeze, ["~> 0.17.6"]) + s.add_dependency(%q<rouge>.freeze, ["< 4.0", ">= 2.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<jekyll-commonmark>.freeze, ["~> 1.2"]) + s.add_dependency(%q<commonmarker>.freeze, ["~> 0.17.6"]) + s.add_dependency(%q<rouge>.freeze, ["< 4.0", ">= 2.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-default-layout-0.1.4.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-default-layout-0.1.4.gemspec new file mode 100644 index 000000000000..3c0512099d90 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-default-layout-0.1.4.gemspec @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-default-layout 0.1.4 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-default-layout".freeze + s.version = "0.1.4" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ben Balter".freeze] + s.date = "2016-12-08" + s.email = ["ben.balter@github.com".freeze] + s.homepage = "https://github.com/benbalter/jekyll-default-layout".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Silently sets default layouts for Jekyll pages and posts".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.43"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.43"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.43"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-feed-0.15.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-feed-0.15.1.gemspec new file mode 100644 index 000000000000..f75d80d3567e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-feed-0.15.1.gemspec @@ -0,0 +1,52 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-feed 0.15.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-feed".freeze + s.version = "0.15.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ben Balter".freeze] + s.date = "2020-10-04" + s.email = ["ben.balter@github.com".freeze] + s.extra_rdoc_files = ["README.md".freeze, "History.markdown".freeze, "LICENSE.txt".freeze] + s.files = ["History.markdown".freeze, "LICENSE.txt".freeze, "README.md".freeze] + s.homepage = "https://github.com/jekyll/jekyll-feed".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "A Jekyll plugin to generate an Atom feed of your Jekyll posts".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<nokogiri>.freeze, ["~> 1.6"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5"]) + s.add_development_dependency(%q<typhoeus>.freeze, ["< 2.0", ">= 0.7"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<nokogiri>.freeze, ["~> 1.6"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5"]) + s.add_dependency(%q<typhoeus>.freeze, ["< 2.0", ">= 0.7"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<nokogiri>.freeze, ["~> 1.6"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5"]) + s.add_dependency(%q<typhoeus>.freeze, ["< 2.0", ">= 0.7"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-gist-1.5.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-gist-1.5.0.gemspec new file mode 100644 index 000000000000..c783b64358b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-gist-1.5.0.gemspec @@ -0,0 +1,50 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-gist 1.5.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-gist".freeze + s.version = "1.5.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Parker Moore".freeze] + s.date = "2017-12-03" + s.email = ["parkrmoore@gmail.com".freeze] + s.homepage = "https://github.com/jekyll/jekyll-gist".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.1".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Liquid tag for displaying GitHub Gists in Jekyll sites.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<octokit>.freeze, ["~> 4.2"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.6"]) + s.add_development_dependency(%q<jekyll>.freeze, [">= 3.0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<rspec>.freeze, [">= 0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.51"]) + s.add_development_dependency(%q<webmock>.freeze, [">= 0"]) + else + s.add_dependency(%q<octokit>.freeze, ["~> 4.2"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.6"]) + s.add_dependency(%q<jekyll>.freeze, [">= 3.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, [">= 0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.51"]) + s.add_dependency(%q<webmock>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<octokit>.freeze, ["~> 4.2"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.6"]) + s.add_dependency(%q<jekyll>.freeze, [">= 3.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, [">= 0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.51"]) + s.add_dependency(%q<webmock>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-github-metadata-2.13.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-github-metadata-2.13.0.gemspec new file mode 100644 index 000000000000..ef1f157c3c60 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-github-metadata-2.13.0.gemspec @@ -0,0 +1,52 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-github-metadata 2.13.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-github-metadata".freeze + s.version = "2.13.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Parker Moore".freeze] + s.date = "2020-01-15" + s.email = ["parkrmoore@gmail.com".freeze] + s.homepage = "https://github.com/jekyll/github-metadata".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "The site.github namespace".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.4"]) + s.add_runtime_dependency(%q<octokit>.freeze, ["!= 4.4.0", "~> 4.0"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<netrc>.freeze, [">= 0"]) + s.add_development_dependency(%q<pry>.freeze, [">= 0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.8.0"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5.0"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.4"]) + s.add_dependency(%q<octokit>.freeze, ["!= 4.4.0", "~> 4.0"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<netrc>.freeze, [">= 0"]) + s.add_dependency(%q<pry>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.8.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5.0"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.4"]) + s.add_dependency(%q<octokit>.freeze, ["!= 4.4.0", "~> 4.0"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<netrc>.freeze, [">= 0"]) + s.add_dependency(%q<pry>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.8.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-mentions-1.6.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-mentions-1.6.0.gemspec new file mode 100644 index 000000000000..e6bf79668611 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-mentions-1.6.0.gemspec @@ -0,0 +1,47 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-mentions 1.6.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-mentions".freeze + s.version = "1.6.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["GitHub, Inc.".freeze] + s.date = "2020-03-05" + s.email = "support@github.com".freeze + s.homepage = "https://github.com/jekyll/jekyll-mentions".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "@mention support for your Jekyll site".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<html-pipeline>.freeze, ["~> 2.3"]) + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.4"]) + else + s.add_dependency(%q<html-pipeline>.freeze, ["~> 2.3"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.4"]) + end + else + s.add_dependency(%q<html-pipeline>.freeze, ["~> 2.3"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.4"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-optional-front-matter-0.3.2.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-optional-front-matter-0.3.2.gemspec new file mode 100644 index 000000000000..e59ddc2a2c7c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-optional-front-matter-0.3.2.gemspec @@ -0,0 +1,40 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-optional-front-matter 0.3.2 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-optional-front-matter".freeze + s.version = "0.3.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ben Balter".freeze] + s.date = "2019-10-23" + s.email = ["ben.balter@github.com".freeze] + s.homepage = "https://github.com/benbalter/jekyll-optional-front-matter".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A Jekyll plugin to make front matter optional for Markdown files".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-paginate-1.1.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-paginate-1.1.0.gemspec new file mode 100644 index 000000000000..52a709e149b9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-paginate-1.1.0.gemspec @@ -0,0 +1,40 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-paginate 1.1.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-paginate".freeze + s.version = "1.1.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Parker Moore".freeze] + s.date = "2014-10-14" + s.email = ["parkrmoore@gmail.com".freeze] + s.homepage = "https://github.com/jekyll/jekyll-paginate".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Built-in Pagination Generator for Jekyll".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<jekyll>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 2.0"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 2.0"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-paginate-v2-3.0.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-paginate-v2-3.0.0.gemspec new file mode 100644 index 000000000000..2f177bc9afbb --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-paginate-v2-3.0.0.gemspec @@ -0,0 +1,42 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-paginate-v2 3.0.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-paginate-v2".freeze + s.version = "3.0.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Sverrir Sigmundarson".freeze] + s.date = "2020-02-07" + s.description = "An enhanced zero-configuration in-place replacement for the now decomissioned built-in jekyll-paginate gem. This pagination gem offers full backwards compatability as well as a slew of new frequently requested features with minimal additional site and page configuration. Optional features include auto-generation of paginated collection, tag and category pages.".freeze + s.email = ["jekyll@sverrirs.com".freeze] + s.homepage = "https://github.com/sverrirs/jekyll-paginate-v2".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Pagination Generator for Jekyll 3 and newer".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 10.4"]) + s.add_development_dependency(%q<minitest>.freeze, ["~> 5.4"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.4"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.4"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.4"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.4"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-readme-index-0.3.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-readme-index-0.3.0.gemspec new file mode 100644 index 000000000000..7a327c9205dd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-readme-index-0.3.0.gemspec @@ -0,0 +1,46 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-readme-index 0.3.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-readme-index".freeze + s.version = "0.3.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ben Balter".freeze] + s.date = "2019-11-05" + s.email = ["ben.balter@github.com".freeze] + s.homepage = "https://github.com/benbalter/jekyll-readme-index".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A Jekyll plugin to render a project's README as the site's index.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.40"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10.0"]) + s.add_development_dependency(%q<rubocop-performance>.freeze, ["~> 1.5"]) + s.add_development_dependency(%q<rubocop-rspec>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.40"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10.0"]) + s.add_dependency(%q<rubocop-performance>.freeze, ["~> 1.5"]) + s.add_dependency(%q<rubocop-rspec>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.40"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10.0"]) + s.add_dependency(%q<rubocop-performance>.freeze, ["~> 1.5"]) + s.add_dependency(%q<rubocop-rspec>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-redirect-from-0.16.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-redirect-from-0.16.0.gemspec new file mode 100644 index 000000000000..7140b6eb63c4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-redirect-from-0.16.0.gemspec @@ -0,0 +1,47 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-redirect-from 0.16.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-redirect-from".freeze + s.version = "0.16.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Parker Moore".freeze] + s.date = "2020-01-26" + s.email = ["parkrmoore@gmail.com".freeze] + s.homepage = "https://github.com/jekyll/jekyll-redirect-from".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Seamlessly specify multiple redirection URLs for your pages and posts".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.3"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<jekyll-sitemap>.freeze, ["~> 1.0"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.3"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<jekyll-sitemap>.freeze, ["~> 1.0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.3"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<jekyll-sitemap>.freeze, ["~> 1.0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-relative-links-0.6.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-relative-links-0.6.1.gemspec new file mode 100644 index 000000000000..03b47a4e78e9 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-relative-links-0.6.1.gemspec @@ -0,0 +1,40 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-relative-links 0.6.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-relative-links".freeze + s.version = "0.6.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ben Balter".freeze] + s.date = "2019-10-23" + s.email = ["ben.balter@github.com".freeze] + s.homepage = "https://github.com/benbalter/jekyll-relative-links".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A Jekyll plugin to convert relative links to markdown files to their rendered equivalents.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.3"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.3"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.3"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-remote-theme-0.4.3.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-remote-theme-0.4.3.gemspec new file mode 100644 index 000000000000..7520642a9113 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-remote-theme-0.4.3.gemspec @@ -0,0 +1,65 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-remote-theme 0.4.3 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-remote-theme".freeze + s.version = "0.4.3" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ben Balter".freeze] + s.date = "2021-03-10" + s.email = ["ben.balter@github.com".freeze] + s.homepage = "https://github.com/benbalter/jekyll-remote-theme".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Jekyll plugin for building Jekyll sites with any GitHub-hosted theme".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<addressable>.freeze, ["~> 2.0"]) + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.5"]) + s.add_runtime_dependency(%q<jekyll-sass-converter>.freeze, ["!= 2.0.0", "<= 3.0.0", ">= 1.0"]) + s.add_runtime_dependency(%q<rubyzip>.freeze, ["< 3.0", ">= 1.3.0"]) + s.add_development_dependency(%q<jekyll-theme-primer>.freeze, ["~> 0.5"]) + s.add_development_dependency(%q<jekyll_test_plugin_malicious>.freeze, ["~> 0.2"]) + s.add_development_dependency(%q<kramdown-parser-gfm>.freeze, ["~> 1.0"]) + s.add_development_dependency(%q<pry>.freeze, ["~> 0.11"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + s.add_development_dependency(%q<webmock>.freeze, ["~> 3.0"]) + else + s.add_dependency(%q<addressable>.freeze, ["~> 2.0"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.5"]) + s.add_dependency(%q<jekyll-sass-converter>.freeze, ["!= 2.0.0", "<= 3.0.0", ">= 1.0"]) + s.add_dependency(%q<rubyzip>.freeze, ["< 3.0", ">= 1.3.0"]) + s.add_dependency(%q<jekyll-theme-primer>.freeze, ["~> 0.5"]) + s.add_dependency(%q<jekyll_test_plugin_malicious>.freeze, ["~> 0.2"]) + s.add_dependency(%q<kramdown-parser-gfm>.freeze, ["~> 1.0"]) + s.add_dependency(%q<pry>.freeze, ["~> 0.11"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + s.add_dependency(%q<webmock>.freeze, ["~> 3.0"]) + end + else + s.add_dependency(%q<addressable>.freeze, ["~> 2.0"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.5"]) + s.add_dependency(%q<jekyll-sass-converter>.freeze, ["!= 2.0.0", "<= 3.0.0", ">= 1.0"]) + s.add_dependency(%q<rubyzip>.freeze, ["< 3.0", ">= 1.3.0"]) + s.add_dependency(%q<jekyll-theme-primer>.freeze, ["~> 0.5"]) + s.add_dependency(%q<jekyll_test_plugin_malicious>.freeze, ["~> 0.2"]) + s.add_dependency(%q<kramdown-parser-gfm>.freeze, ["~> 1.0"]) + s.add_dependency(%q<pry>.freeze, ["~> 0.11"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + s.add_dependency(%q<webmock>.freeze, ["~> 3.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-sass-converter-1.5.2.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-sass-converter-1.5.2.gemspec new file mode 100644 index 000000000000..bbb7c31be235 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-sass-converter-1.5.2.gemspec @@ -0,0 +1,46 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-sass-converter 1.5.2 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-sass-converter".freeze + s.version = "1.5.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Parker Moore".freeze] + s.date = "2018-02-03" + s.email = ["parkrmoore@gmail.com".freeze] + s.homepage = "https://github.com/jekyll/jekyll-sass-converter".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A basic Sass converter for Jekyll.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<sass>.freeze, ["~> 3.4"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_development_dependency(%q<jekyll>.freeze, [">= 2.0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<rspec>.freeze, [">= 0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["= 0.51"]) + else + s.add_dependency(%q<sass>.freeze, ["~> 3.4"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_dependency(%q<jekyll>.freeze, [">= 2.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, [">= 0"]) + s.add_dependency(%q<rubocop>.freeze, ["= 0.51"]) + end + else + s.add_dependency(%q<sass>.freeze, ["~> 3.4"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.5"]) + s.add_dependency(%q<jekyll>.freeze, [">= 2.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, [">= 0"]) + s.add_dependency(%q<rubocop>.freeze, ["= 0.51"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-seo-tag-2.7.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-seo-tag-2.7.1.gemspec new file mode 100644 index 000000000000..66aca27fa8ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-seo-tag-2.7.1.gemspec @@ -0,0 +1,46 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-seo-tag 2.7.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-seo-tag".freeze + s.version = "2.7.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "allowed_push_host" => "https://rubygems.org" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Ben Balter".freeze] + s.bindir = "exe".freeze + s.date = "2020-10-18" + s.email = ["ben.balter@github.com".freeze] + s.homepage = "https://github.com/jekyll/jekyll-seo-tag".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "A Jekyll plugin to add metadata tags for search engines and social networks to better index and display your site's content.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.8"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 1.15"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.7"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.11"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.8"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.15"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.7"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.11"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.8"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.15"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.7"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.11"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-sitemap-1.4.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-sitemap-1.4.0.gemspec new file mode 100644 index 000000000000..ddc9ee4ed929 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-sitemap-1.4.0.gemspec @@ -0,0 +1,44 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-sitemap 1.4.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-sitemap".freeze + s.version = "1.4.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["GitHub, Inc.".freeze] + s.date = "2019-11-22" + s.email = "support@github.com".freeze + s.homepage = "https://github.com/jekyll/jekyll-sitemap".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Automatically generate a sitemap.xml for your Jekyll site.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.4"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.4"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.7"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.4"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-swiss-1.0.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-swiss-1.0.0.gemspec new file mode 100644 index 000000000000..e22cc4d502dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-swiss-1.0.0.gemspec @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-swiss 1.0.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-swiss".freeze + s.version = "1.0.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["broccolini".freeze] + s.date = "2018-06-02" + s.email = ["diana.mounter@gmail.com".freeze] + s.homepage = "http://broccolini.net/swiss".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A bold typographic theme for Jekyll, inspired by Swiss design.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<jekyll>.freeze, ["~> 3.2"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.12"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 10.0"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.2"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.12"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.0"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.2"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.12"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-architect-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-architect-0.1.1.gemspec new file mode 100644 index 000000000000..e9306df60904 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-architect-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-architect 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-architect".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jason Long".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-architect@github.com".freeze] + s.homepage = "https://github.com/pages-themes/architect".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Architect is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-cayman-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-cayman-0.1.1.gemspec new file mode 100644 index 000000000000..91b3411704d5 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-cayman-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-cayman 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-cayman".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jason Long".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-cayman@github.com".freeze] + s.homepage = "https://github.com/pages-themes/cayman".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Cayman is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-dinky-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-dinky-0.1.1.gemspec new file mode 100644 index 000000000000..8e002346cd7e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-dinky-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-dinky 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-dinky".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Diana Mounter".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-dinky@github.com".freeze] + s.homepage = "https://github.com/pages-themes/dinky".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Dinky is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-hacker-0.1.2.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-hacker-0.1.2.gemspec new file mode 100644 index 000000000000..08f2ad9763dc --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-hacker-0.1.2.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-hacker 0.1.2 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-hacker".freeze + s.version = "0.1.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jason Costello".freeze, "GitHub, Inc.".freeze] + s.date = "2020-08-08" + s.email = ["opensource+jekyll-theme-hacker@github.com".freeze] + s.homepage = "https://github.com/pages-themes/hacker".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Hacker is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", "> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", "> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", "> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-leap-day-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-leap-day-0.1.1.gemspec new file mode 100644 index 000000000000..d6d392b53758 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-leap-day-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-leap-day 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-leap-day".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Matt Graham".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-leap-day@github.com".freeze] + s.homepage = "https://github.com/pages-themes/leap-day".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Leap Day is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-merlot-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-merlot-0.1.1.gemspec new file mode 100644 index 000000000000..4695bad5b313 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-merlot-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-merlot 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-merlot".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Cameron McEfee".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-merlot@github.com".freeze] + s.homepage = "https://github.com/pages-themes/merlot".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Merlot is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-midnight-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-midnight-0.1.1.gemspec new file mode 100644 index 000000000000..9e9c31eed355 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-midnight-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-midnight 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-midnight".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Matt Graham".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-midnight@github.com".freeze] + s.homepage = "https://github.com/pages-themes/midnight".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Midnight is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-minimal-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-minimal-0.1.1.gemspec new file mode 100644 index 000000000000..0a5875885fcd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-minimal-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-minimal 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-minimal".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Steve Smith".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-minimal@github.com".freeze] + s.homepage = "https://github.com/pages-themes/minimal".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Minimal is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-modernist-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-modernist-0.1.1.gemspec new file mode 100644 index 000000000000..2cae66237bc7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-modernist-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-modernist 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-modernist".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Steve Smith".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-modernist@github.com".freeze] + s.homepage = "https://github.com/pages-themes/modernist".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Modernist is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-primer-0.5.4.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-primer-0.5.4.gemspec new file mode 100644 index 000000000000..f39e2c56cf92 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-primer-0.5.4.gemspec @@ -0,0 +1,46 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-primer 0.5.4 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-primer".freeze + s.version = "0.5.4" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["GitHub, Inc.".freeze] + s.date = "2019-10-23" + s.email = ["open-source@github.com".freeze] + s.homepage = "https://github.com/pages-themes/jekyll-theme-primer".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Primer is a Jekyll theme for GitHub Pages based on GitHub's Primer styles".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", "> 3.5"]) + s.add_runtime_dependency(%q<jekyll-github-metadata>.freeze, ["~> 2.9"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", "> 3.5"]) + s.add_dependency(%q<jekyll-github-metadata>.freeze, ["~> 2.9"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", "> 3.5"]) + s.add_dependency(%q<jekyll-github-metadata>.freeze, ["~> 2.9"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-slate-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-slate-0.1.1.gemspec new file mode 100644 index 000000000000..ea42f0a98013 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-slate-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-slate 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-slate".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jason Costello".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-slate@github.com".freeze] + s.homepage = "https://github.com/pages-themes/slate".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Slate is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-tactile-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-tactile-0.1.1.gemspec new file mode 100644 index 000000000000..dc57aef1aa35 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-tactile-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-tactile 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-tactile".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jason Long".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-tactile@github.com".freeze] + s.homepage = "https://github.com/pages-themes/tactile".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Tactile is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-time-machine-0.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-time-machine-0.1.1.gemspec new file mode 100644 index 000000000000..0a9017d864d4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-theme-time-machine-0.1.1.gemspec @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-theme-time-machine 0.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-theme-time-machine".freeze + s.version = "0.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jon Rohan".freeze, "GitHub, Inc.".freeze] + s.date = "2018-04-11" + s.email = ["opensource+jekyll-theme-time-machine@github.com".freeze] + s.homepage = "https://github.com/pages-themes/time-machine".freeze + s.licenses = ["CC0-1.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Time Machine is a Jekyll theme for GitHub Pages".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_development_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_development_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["~> 3.5"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.0"]) + s.add_dependency(%q<html-proofer>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.50"]) + s.add_dependency(%q<w3c_validators>.freeze, ["~> 1.3"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-titles-from-headings-0.5.3.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-titles-from-headings-0.5.3.gemspec new file mode 100644 index 000000000000..ac0acb861aa3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-titles-from-headings-0.5.3.gemspec @@ -0,0 +1,40 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-titles-from-headings 0.5.3 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-titles-from-headings".freeze + s.version = "0.5.3" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Ben Balter".freeze] + s.date = "2019-10-23" + s.email = ["ben.balter@github.com".freeze] + s.homepage = "https://github.com/benbalter/jekyll-titles-from-headings".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A Jekyll plugin to pull the page title from the first Markdown heading when none is specified.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.3"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.3"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.3"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.71"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.10"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jekyll-watch-2.2.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jekyll-watch-2.2.1.gemspec new file mode 100644 index 000000000000..8c062fb9936b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jekyll-watch-2.2.1.gemspec @@ -0,0 +1,47 @@ +# -*- encoding: utf-8 -*- +# stub: jekyll-watch 2.2.1 ruby lib + +Gem::Specification.new do |s| + s.name = "jekyll-watch".freeze + s.version = "2.2.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Parker Moore".freeze] + s.date = "2019-03-22" + s.email = ["parkrmoore@gmail.com".freeze] + s.homepage = "https://github.com/jekyll/jekyll-watch".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Rebuild your Jekyll site when a file changes with the `--watch` switch.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<listen>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.6"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5"]) + else + s.add_dependency(%q<listen>.freeze, ["~> 3.0"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.6"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5"]) + end + else + s.add_dependency(%q<listen>.freeze, ["~> 3.0"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.6"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.5"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/jemoji-0.12.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/jemoji-0.12.0.gemspec new file mode 100644 index 000000000000..eefcb5e8c468 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/jemoji-0.12.0.gemspec @@ -0,0 +1,50 @@ +# -*- encoding: utf-8 -*- +# stub: jemoji 0.12.0 ruby lib + +Gem::Specification.new do |s| + s.name = "jemoji".freeze + s.version = "0.12.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["GitHub, Inc.".freeze] + s.date = "2020-03-05" + s.email = "support@github.com".freeze + s.homepage = "https://github.com/jekyll/jemoji".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "GitHub-flavored emoji plugin for Jekyll".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<gemoji>.freeze, ["~> 3.0"]) + s.add_runtime_dependency(%q<html-pipeline>.freeze, ["~> 2.2"]) + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_development_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.4"]) + else + s.add_dependency(%q<gemoji>.freeze, ["~> 3.0"]) + s.add_dependency(%q<html-pipeline>.freeze, ["~> 2.2"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.4"]) + end + else + s.add_dependency(%q<gemoji>.freeze, ["~> 3.0"]) + s.add_dependency(%q<html-pipeline>.freeze, ["~> 2.2"]) + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.0"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + s.add_dependency(%q<rubocop-jekyll>.freeze, ["~> 0.4"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/kramdown-2.3.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/kramdown-2.3.1.gemspec new file mode 100644 index 000000000000..77c17539dae6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/kramdown-2.3.1.gemspec @@ -0,0 +1,45 @@ +# -*- encoding: utf-8 -*- +# stub: kramdown 2.3.1 ruby lib + +Gem::Specification.new do |s| + s.name = "kramdown".freeze + s.version = "2.3.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Thomas Leitner".freeze] + s.date = "2021-03-17" + s.description = "kramdown is yet-another-markdown-parser but fast, pure Ruby,\nusing a strict syntax definition and supporting several common extensions.\n".freeze + s.email = "t_leitner@gmx.at".freeze + s.executables = ["kramdown".freeze] + s.files = ["bin/kramdown".freeze] + s.homepage = "http://kramdown.gettalong.org".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--main".freeze, "lib/kramdown/document.rb".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "kramdown is a fast, pure-Ruby Markdown-superset converter.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<rexml>.freeze, [">= 0"]) + s.add_development_dependency(%q<minitest>.freeze, ["~> 5.0"]) + s.add_development_dependency(%q<rouge>.freeze, [">= 3.26.0", "~> 3.0"]) + s.add_development_dependency(%q<stringex>.freeze, ["~> 1.5.1"]) + else + s.add_dependency(%q<rexml>.freeze, [">= 0"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.0"]) + s.add_dependency(%q<rouge>.freeze, [">= 3.26.0", "~> 3.0"]) + s.add_dependency(%q<stringex>.freeze, ["~> 1.5.1"]) + end + else + s.add_dependency(%q<rexml>.freeze, [">= 0"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.0"]) + s.add_dependency(%q<rouge>.freeze, [">= 3.26.0", "~> 3.0"]) + s.add_dependency(%q<stringex>.freeze, ["~> 1.5.1"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/kramdown-parser-gfm-1.1.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/kramdown-parser-gfm-1.1.0.gemspec new file mode 100644 index 000000000000..5fea4f5611ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/kramdown-parser-gfm-1.1.0.gemspec @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- +# stub: kramdown-parser-gfm 1.1.0 ruby lib + +Gem::Specification.new do |s| + s.name = "kramdown-parser-gfm".freeze + s.version = "1.1.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Thomas Leitner".freeze] + s.date = "2019-05-29" + s.email = "t_leitner@gmx.at".freeze + s.homepage = "https://github.com/kramdown/parser-gfm".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "kramdown-parser-gfm provides a kramdown parser for the GFM dialect of Markdown".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<kramdown>.freeze, ["~> 2.0"]) + else + s.add_dependency(%q<kramdown>.freeze, ["~> 2.0"]) + end + else + s.add_dependency(%q<kramdown>.freeze, ["~> 2.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/liquid-4.0.3.gemspec b/vendor/bundler/ruby/2.5.0/specifications/liquid-4.0.3.gemspec new file mode 100644 index 000000000000..0515de9949c3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/liquid-4.0.3.gemspec @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- +# stub: liquid 4.0.3 ruby lib + +Gem::Specification.new do |s| + s.name = "liquid".freeze + s.version = "4.0.3" + + s.required_rubygems_version = Gem::Requirement.new(">= 1.3.7".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Tobias L\u00FCtke".freeze] + s.date = "2019-03-12" + s.email = ["tobi@leetsoft.com".freeze] + s.extra_rdoc_files = ["History.md".freeze, "README.md".freeze] + s.files = ["History.md".freeze, "README.md".freeze] + s.homepage = "http://www.liquidmarkup.org".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.1.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "A secure, non-evaling end user template engine with aesthetic markup.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rake>.freeze, ["~> 11.3"]) + s.add_development_dependency(%q<minitest>.freeze, [">= 0"]) + else + s.add_dependency(%q<rake>.freeze, ["~> 11.3"]) + s.add_dependency(%q<minitest>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<rake>.freeze, ["~> 11.3"]) + s.add_dependency(%q<minitest>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/listen-3.5.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/listen-3.5.1.gemspec new file mode 100644 index 000000000000..b538038afcdd --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/listen-3.5.1.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- +# stub: listen 3.5.1 ruby lib + +Gem::Specification.new do |s| + s.name = "listen".freeze + s.version = "3.5.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "allowed_push_host" => "https://rubygems.org", "bug_tracker_uri" => "https://github.com/guard/listen/issues", "changelog_uri" => "https://github.com/guard/listen/releases", "documentation_uri" => "https://www.rubydoc.info/gems/listen/3.5.1", "homepage_uri" => "https://github.com/guard/listen", "source_code_uri" => "https://github.com/guard/listen/tree/v3.5.1" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Thibaud Guillaume-Gentil".freeze] + s.date = "2021-03-30" + s.description = "The Listen gem listens to file modifications and notifies you about the changes. Works everywhere!".freeze + s.email = "thibaud@thibaud.gg".freeze + s.executables = ["listen".freeze] + s.files = ["bin/listen".freeze] + s.homepage = "https://github.com/guard/listen".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Listen to file modifications".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<rb-fsevent>.freeze, [">= 0.10.3", "~> 0.10"]) + s.add_runtime_dependency(%q<rb-inotify>.freeze, [">= 0.9.10", "~> 0.9"]) + else + s.add_dependency(%q<rb-fsevent>.freeze, [">= 0.10.3", "~> 0.10"]) + s.add_dependency(%q<rb-inotify>.freeze, [">= 0.9.10", "~> 0.9"]) + end + else + s.add_dependency(%q<rb-fsevent>.freeze, [">= 0.10.3", "~> 0.10"]) + s.add_dependency(%q<rb-inotify>.freeze, [">= 0.9.10", "~> 0.9"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/mercenary-0.3.6.gemspec b/vendor/bundler/ruby/2.5.0/specifications/mercenary-0.3.6.gemspec new file mode 100644 index 000000000000..042e2c4f4875 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/mercenary-0.3.6.gemspec @@ -0,0 +1,38 @@ +# -*- encoding: utf-8 -*- +# stub: mercenary 0.3.6 ruby lib + +Gem::Specification.new do |s| + s.name = "mercenary".freeze + s.version = "0.3.6" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Tom Preston-Werner".freeze, "Parker Moore".freeze] + s.date = "2016-04-08" + s.description = "Lightweight and flexible library for writing command-line apps in Ruby.".freeze + s.email = ["tom@mojombo.com".freeze, "parkrmoore@gmail.com".freeze] + s.homepage = "https://github.com/jekyll/mercenary".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Lightweight and flexible library for writing command-line apps in Ruby.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.3"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + else + s.add_dependency(%q<bundler>.freeze, ["~> 1.3"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + end + else + s.add_dependency(%q<bundler>.freeze, ["~> 1.3"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/mini_portile2-2.5.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/mini_portile2-2.5.1.gemspec new file mode 100644 index 000000000000..96c35a39342b --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/mini_portile2-2.5.1.gemspec @@ -0,0 +1,48 @@ +# -*- encoding: utf-8 -*- +# stub: mini_portile2 2.5.1 ruby lib + +Gem::Specification.new do |s| + s.name = "mini_portile2".freeze + s.version = "2.5.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Luis Lavena".freeze, "Mike Dalessio".freeze, "Lars Kanis".freeze] + s.date = "2021-04-28" + s.description = "Simplistic port-like solution for developers. It provides a standard and simplified way to compile against dependency libraries without messing up your system.".freeze + s.email = "mike.dalessio@gmail.com".freeze + s.homepage = "https://github.com/flavorjones/mini_portile".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Simplistic port-like solution for developers".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<bundler>.freeze, ["~> 2.1"]) + s.add_development_dependency(%q<minitar>.freeze, ["~> 0.7"]) + s.add_development_dependency(%q<minitest>.freeze, ["~> 5.11"]) + s.add_development_dependency(%q<minitest-hooks>.freeze, ["~> 1.5.0"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_development_dependency(%q<webrick>.freeze, ["~> 1.0"]) + else + s.add_dependency(%q<bundler>.freeze, ["~> 2.1"]) + s.add_dependency(%q<minitar>.freeze, ["~> 0.7"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.11"]) + s.add_dependency(%q<minitest-hooks>.freeze, ["~> 1.5.0"]) + s.add_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_dependency(%q<webrick>.freeze, ["~> 1.0"]) + end + else + s.add_dependency(%q<bundler>.freeze, ["~> 2.1"]) + s.add_dependency(%q<minitar>.freeze, ["~> 0.7"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.11"]) + s.add_dependency(%q<minitest-hooks>.freeze, ["~> 1.5.0"]) + s.add_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_dependency(%q<webrick>.freeze, ["~> 1.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/minima-2.5.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/minima-2.5.1.gemspec new file mode 100644 index 000000000000..a2813f461624 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/minima-2.5.1.gemspec @@ -0,0 +1,41 @@ +# -*- encoding: utf-8 -*- +# stub: minima 2.5.1 ruby lib + +Gem::Specification.new do |s| + s.name = "minima".freeze + s.version = "2.5.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "plugin_type" => "theme" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Joel Glovier".freeze] + s.date = "2019-08-16" + s.email = ["jglovier@github.com".freeze] + s.homepage = "https://github.com/jekyll/minima".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A beautiful, minimal theme for Jekyll.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.5"]) + s.add_runtime_dependency(%q<jekyll-feed>.freeze, ["~> 0.9"]) + s.add_runtime_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.1"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 1.15"]) + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.5"]) + s.add_dependency(%q<jekyll-feed>.freeze, ["~> 0.9"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.1"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.15"]) + end + else + s.add_dependency(%q<jekyll>.freeze, ["< 5.0", ">= 3.5"]) + s.add_dependency(%q<jekyll-feed>.freeze, ["~> 0.9"]) + s.add_dependency(%q<jekyll-seo-tag>.freeze, ["~> 2.1"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.15"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/minitest-5.14.4.gemspec b/vendor/bundler/ruby/2.5.0/specifications/minitest-5.14.4.gemspec new file mode 100644 index 000000000000..a9cdda3aaadf --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/minitest-5.14.4.gemspec @@ -0,0 +1,41 @@ +# -*- encoding: utf-8 -*- +# stub: minitest 5.14.4 ruby lib + +Gem::Specification.new do |s| + s.name = "minitest".freeze + s.version = "5.14.4" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/seattlerb/minitest/issues", "homepage_uri" => "https://github.com/seattlerb/minitest" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Ryan Davis".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIDPjCCAiagAwIBAgIBBTANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu\nZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB\nGRYDY29tMB4XDTIwMTIyMjIwMzgzMFoXDTIxMTIyMjIwMzgzMFowRTETMBEGA1UE\nAwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS\nJomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda\nb9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx\ntaCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT\noOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh\nGiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt\nqhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV\ngBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw\nHQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBCwUAA4IB\nAQAE3XRm1YZcCVjAJy5yMZvTOFrS7B2SYErc+0QwmKYbHztTTDY2m5Bii+jhpuxh\nH+ETcU1z8TUKLpsBUP4kUpIRowkVN1p/jKapV8T3Rbwq+VuYFe+GMKsf8wGZSecG\noMQ8DzzauZfbvhe2kDg7G9BBPU0wLQlY25rDcCy9bLnD7R0UK3ONqpwvsI5I7x5X\nZIMXR0a9/DG+55mawwdGzCQobDKiSNLK89KK7OcNTALKU0DfgdTkktdgKchzKHqZ\nd/AHw/kcnU6iuMUoJEcGiJd4gVCTn1l3cDcIvxakGslCA88Jubw0Sqatan0TnC9g\nKToW560QIey7SPfHWduzFJnV\n-----END CERTIFICATE-----\n".freeze] + s.date = "2021-02-24" + s.description = "minitest provides a complete suite of testing facilities supporting\nTDD, BDD, mocking, and benchmarking.\n\n \"I had a class with Jim Weirich on testing last week and we were\n allowed to choose our testing frameworks. Kirk Haines and I were\n paired up and we cracked open the code for a few test\n frameworks...\n\n I MUST say that minitest is *very* readable / understandable\n compared to the 'other two' options we looked at. Nicely done and\n thank you for helping us keep our mental sanity.\"\n\n -- Wayne E. Seguin\n\nminitest/test is a small and incredibly fast unit testing framework.\nIt provides a rich set of assertions to make your tests clean and\nreadable.\n\nminitest/spec is a functionally complete spec engine. It hooks onto\nminitest/test and seamlessly bridges test assertions over to spec\nexpectations.\n\nminitest/benchmark is an awesome way to assert the performance of your\nalgorithms in a repeatable manner. Now you can assert that your newb\nco-worker doesn't replace your linear algorithm with an exponential\none!\n\nminitest/mock by Steven Baker, is a beautifully tiny mock (and stub)\nobject framework.\n\nminitest/pride shows pride in testing and adds coloring to your test\noutput. I guess it is an example of how to write IO pipes too. :P\n\nminitest/test is meant to have a clean implementation for language\nimplementors that need a minimal set of methods to bootstrap a working\ntest suite. For example, there is no magic involved for test-case\ndiscovery.\n\n \"Again, I can't praise enough the idea of a testing/specing\n framework that I can actually read in full in one sitting!\"\n\n -- Piotr Szotkowski\n\nComparing to rspec:\n\n rspec is a testing DSL. minitest is ruby.\n\n -- Adam Hawkins, \"Bow Before MiniTest\"\n\nminitest doesn't reinvent anything that ruby already provides, like:\nclasses, modules, inheritance, methods. This means you only have to\nlearn ruby to use minitest and all of your regular OO practices like\nextract-method refactorings still apply.".freeze + s.email = ["ryand-ruby@zenspider.com".freeze] + s.extra_rdoc_files = ["History.rdoc".freeze, "Manifest.txt".freeze, "README.rdoc".freeze] + s.files = ["History.rdoc".freeze, "Manifest.txt".freeze, "README.rdoc".freeze] + s.homepage = "https://github.com/seattlerb/minitest".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] + s.required_ruby_version = Gem::Requirement.new(["< 4.0".freeze, ">= 2.2".freeze]) + s.rubygems_version = "2.7.6".freeze + s.summary = "minitest provides a complete suite of testing facilities supporting TDD, BDD, mocking, and benchmarking".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rdoc>.freeze, ["< 7", ">= 4.0"]) + s.add_development_dependency(%q<hoe>.freeze, ["~> 3.22"]) + else + s.add_dependency(%q<rdoc>.freeze, ["< 7", ">= 4.0"]) + s.add_dependency(%q<hoe>.freeze, ["~> 3.22"]) + end + else + s.add_dependency(%q<rdoc>.freeze, ["< 7", ">= 4.0"]) + s.add_dependency(%q<hoe>.freeze, ["~> 3.22"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/multipart-post-2.1.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/multipart-post-2.1.1.gemspec new file mode 100644 index 000000000000..53b95639e0f8 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/multipart-post-2.1.1.gemspec @@ -0,0 +1,38 @@ +# -*- encoding: utf-8 -*- +# stub: multipart-post 2.1.1 ruby lib + +Gem::Specification.new do |s| + s.name = "multipart-post".freeze + s.version = "2.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Nick Sieger".freeze, "Samuel Williams".freeze] + s.date = "2019-05-13" + s.description = "Use with Net::HTTP to do multipart form postspec. IO values that have #content_type, #original_filename, and #local_path will be posted as a binary file.".freeze + s.email = ["nick@nicksieger.com".freeze, "samuel.williams@oriontransfer.co.nz".freeze] + s.homepage = "https://github.com/nicksieger/multipart-post".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A multipart form post accessory for Net::HTTP.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<bundler>.freeze, ["< 3", ">= 1.3"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.4"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + else + s.add_dependency(%q<bundler>.freeze, ["< 3", ">= 1.3"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.4"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<bundler>.freeze, ["< 3", ">= 1.3"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.4"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/nokogiri-1.11.4-x86_64-linux.gemspec b/vendor/bundler/ruby/2.5.0/specifications/nokogiri-1.11.4-x86_64-linux.gemspec new file mode 100644 index 000000000000..2071d6d3778f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/nokogiri-1.11.4-x86_64-linux.gemspec @@ -0,0 +1,75 @@ +# -*- encoding: utf-8 -*- +# stub: nokogiri 1.11.4 x86_64-linux lib + +Gem::Specification.new do |s| + s.name = "nokogiri".freeze + s.version = "1.11.4" + s.platform = "x86_64-linux".freeze + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/sparklemotion/nokogiri/issues", "changelog_uri" => "https://nokogiri.org/CHANGELOG.html", "documentation_uri" => "https://nokogiri.org/rdoc/index.html", "homepage_uri" => "https://nokogiri.org", "source_code_uri" => "https://github.com/sparklemotion/nokogiri" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Mike Dalessio".freeze, "Aaron Patterson".freeze, "Yoko Harada".freeze, "Akinori MUSHA".freeze, "John Shahid".freeze, "Karol Bucek".freeze, "Lars Kanis".freeze, "Sergio Arbeo".freeze, "Timothy Elliott".freeze, "Nobuyoshi Nakada".freeze] + s.date = "2021-05-14" + s.description = "Nokogiri (\u92F8) makes it easy and painless to work with XML and HTML from Ruby. It provides a\nsensible, easy-to-understand API for reading, writing, modifying, and querying documents. It is\nfast and standards-compliant by relying on native parsers like libxml2 (C) and xerces (Java).\n".freeze + s.email = "nokogiri-talk@googlegroups.com".freeze + s.executables = ["nokogiri".freeze] + s.extra_rdoc_files = ["ext/nokogiri/xml_dtd.c".freeze, "ext/nokogiri/xml_xpath_context.c".freeze, "ext/nokogiri/xml_attr.c".freeze, "ext/nokogiri/libxml2_backwards_compat.c".freeze, "ext/nokogiri/xml_comment.c".freeze, "ext/nokogiri/nokogiri.c".freeze, "ext/nokogiri/xml_sax_parser_context.c".freeze, "ext/nokogiri/xml_node_set.c".freeze, "ext/nokogiri/xml_reader.c".freeze, "ext/nokogiri/xml_cdata.c".freeze, "ext/nokogiri/xml_element_content.c".freeze, "ext/nokogiri/html_entity_lookup.c".freeze, "ext/nokogiri/xml_namespace.c".freeze, "ext/nokogiri/xml_document.c".freeze, "ext/nokogiri/xml_element_decl.c".freeze, "ext/nokogiri/xml_schema.c".freeze, "ext/nokogiri/html_document.c".freeze, "ext/nokogiri/xml_processing_instruction.c".freeze, "ext/nokogiri/xml_text.c".freeze, "ext/nokogiri/xml_syntax_error.c".freeze, "ext/nokogiri/xml_document_fragment.c".freeze, "ext/nokogiri/xml_sax_push_parser.c".freeze, "ext/nokogiri/xml_encoding_handler.c".freeze, "ext/nokogiri/html_sax_push_parser.c".freeze, "ext/nokogiri/xml_relax_ng.c".freeze, "ext/nokogiri/xml_entity_decl.c".freeze, "ext/nokogiri/test_global_handlers.c".freeze, "ext/nokogiri/xml_node.c".freeze, "ext/nokogiri/xml_entity_reference.c".freeze, "ext/nokogiri/xslt_stylesheet.c".freeze, "ext/nokogiri/html_sax_parser_context.c".freeze, "ext/nokogiri/xml_sax_parser.c".freeze, "ext/nokogiri/xml_attribute_decl.c".freeze, "ext/nokogiri/html_element_description.c".freeze, "README.md".freeze] + s.files = ["README.md".freeze, "bin/nokogiri".freeze, "ext/nokogiri/html_document.c".freeze, "ext/nokogiri/html_element_description.c".freeze, "ext/nokogiri/html_entity_lookup.c".freeze, "ext/nokogiri/html_sax_parser_context.c".freeze, "ext/nokogiri/html_sax_push_parser.c".freeze, "ext/nokogiri/libxml2_backwards_compat.c".freeze, "ext/nokogiri/nokogiri.c".freeze, "ext/nokogiri/test_global_handlers.c".freeze, "ext/nokogiri/xml_attr.c".freeze, "ext/nokogiri/xml_attribute_decl.c".freeze, "ext/nokogiri/xml_cdata.c".freeze, "ext/nokogiri/xml_comment.c".freeze, "ext/nokogiri/xml_document.c".freeze, "ext/nokogiri/xml_document_fragment.c".freeze, "ext/nokogiri/xml_dtd.c".freeze, "ext/nokogiri/xml_element_content.c".freeze, "ext/nokogiri/xml_element_decl.c".freeze, "ext/nokogiri/xml_encoding_handler.c".freeze, "ext/nokogiri/xml_entity_decl.c".freeze, "ext/nokogiri/xml_entity_reference.c".freeze, "ext/nokogiri/xml_namespace.c".freeze, "ext/nokogiri/xml_node.c".freeze, "ext/nokogiri/xml_node_set.c".freeze, "ext/nokogiri/xml_processing_instruction.c".freeze, "ext/nokogiri/xml_reader.c".freeze, "ext/nokogiri/xml_relax_ng.c".freeze, "ext/nokogiri/xml_sax_parser.c".freeze, "ext/nokogiri/xml_sax_parser_context.c".freeze, "ext/nokogiri/xml_sax_push_parser.c".freeze, "ext/nokogiri/xml_schema.c".freeze, "ext/nokogiri/xml_syntax_error.c".freeze, "ext/nokogiri/xml_text.c".freeze, "ext/nokogiri/xml_xpath_context.c".freeze, "ext/nokogiri/xslt_stylesheet.c".freeze] + s.homepage = "https://nokogiri.org".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.required_ruby_version = Gem::Requirement.new(["< 3.1.dev".freeze, ">= 2.5".freeze]) + s.rubygems_version = "2.7.6".freeze + s.summary = "Nokogiri (\u92F8) makes it easy and painless to work with XML and HTML from Ruby.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<racc>.freeze, ["~> 1.4"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 2.2"]) + s.add_development_dependency(%q<concourse>.freeze, ["~> 0.41"]) + s.add_development_dependency(%q<hoe-markdown>.freeze, ["~> 1.4"]) + s.add_development_dependency(%q<minitest>.freeze, ["~> 5.8"]) + s.add_development_dependency(%q<minitest-reporters>.freeze, ["~> 1.4"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_development_dependency(%q<rake-compiler>.freeze, ["~> 1.1"]) + s.add_development_dependency(%q<rake-compiler-dock>.freeze, ["~> 1.1"]) + s.add_development_dependency(%q<rexical>.freeze, ["~> 1.0.5"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 1.7"]) + s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.20"]) + s.add_development_dependency(%q<yard>.freeze, ["~> 0.9"]) + else + s.add_dependency(%q<racc>.freeze, ["~> 1.4"]) + s.add_dependency(%q<bundler>.freeze, ["~> 2.2"]) + s.add_dependency(%q<concourse>.freeze, ["~> 0.41"]) + s.add_dependency(%q<hoe-markdown>.freeze, ["~> 1.4"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.8"]) + s.add_dependency(%q<minitest-reporters>.freeze, ["~> 1.4"]) + s.add_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.1"]) + s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 1.1"]) + s.add_dependency(%q<rexical>.freeze, ["~> 1.0.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 1.7"]) + s.add_dependency(%q<simplecov>.freeze, ["~> 0.20"]) + s.add_dependency(%q<yard>.freeze, ["~> 0.9"]) + end + else + s.add_dependency(%q<racc>.freeze, ["~> 1.4"]) + s.add_dependency(%q<bundler>.freeze, ["~> 2.2"]) + s.add_dependency(%q<concourse>.freeze, ["~> 0.41"]) + s.add_dependency(%q<hoe-markdown>.freeze, ["~> 1.4"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.8"]) + s.add_dependency(%q<minitest-reporters>.freeze, ["~> 1.4"]) + s.add_dependency(%q<rake>.freeze, ["~> 13.0"]) + s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.1"]) + s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 1.1"]) + s.add_dependency(%q<rexical>.freeze, ["~> 1.0.5"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 1.7"]) + s.add_dependency(%q<simplecov>.freeze, ["~> 0.20"]) + s.add_dependency(%q<yard>.freeze, ["~> 0.9"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/octokit-4.20.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/octokit-4.20.0.gemspec new file mode 100644 index 000000000000..07a063b2bf4c --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/octokit-4.20.0.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- +# stub: octokit 4.20.0 ruby lib + +Gem::Specification.new do |s| + s.name = "octokit".freeze + s.version = "4.20.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 1.3.5".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Wynn Netherland".freeze, "Erik Michaels-Ober".freeze, "Clint Shryock".freeze] + s.date = "2020-12-28" + s.description = "Simple wrapper for the GitHub API".freeze + s.email = ["wynn.netherland@gmail.com".freeze, "sferik@gmail.com".freeze, "clint@ctshryock.com".freeze] + s.homepage = "https://github.com/octokit/octokit.rb".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Ruby toolkit for working with the GitHub API".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<bundler>.freeze, ["< 3", ">= 1"]) + s.add_runtime_dependency(%q<sawyer>.freeze, [">= 0.5.3", "~> 0.8.0"]) + s.add_runtime_dependency(%q<faraday>.freeze, [">= 0.9"]) + else + s.add_dependency(%q<bundler>.freeze, ["< 3", ">= 1"]) + s.add_dependency(%q<sawyer>.freeze, [">= 0.5.3", "~> 0.8.0"]) + s.add_dependency(%q<faraday>.freeze, [">= 0.9"]) + end + else + s.add_dependency(%q<bundler>.freeze, ["< 3", ">= 1"]) + s.add_dependency(%q<sawyer>.freeze, [">= 0.5.3", "~> 0.8.0"]) + s.add_dependency(%q<faraday>.freeze, [">= 0.9"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/pathutil-0.16.2.gemspec b/vendor/bundler/ruby/2.5.0/specifications/pathutil-0.16.2.gemspec new file mode 100644 index 000000000000..93e50b7d8ee4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/pathutil-0.16.2.gemspec @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- +# stub: pathutil 0.16.2 ruby lib + +Gem::Specification.new do |s| + s.name = "pathutil".freeze + s.version = "0.16.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Jordon Bedwell".freeze] + s.date = "2018-10-30" + s.description = "Like Pathname but a little less insane.".freeze + s.email = ["jordon@envygeeks.io".freeze] + s.homepage = "http://github.com/envygeeks/pathutil".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Almost like Pathname but just a little less insane.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<forwardable-extended>.freeze, ["~> 2.6"]) + else + s.add_dependency(%q<forwardable-extended>.freeze, ["~> 2.6"]) + end + else + s.add_dependency(%q<forwardable-extended>.freeze, ["~> 2.6"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/public_suffix-4.0.6.gemspec b/vendor/bundler/ruby/2.5.0/specifications/public_suffix-4.0.6.gemspec new file mode 100644 index 000000000000..2c125210d75f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/public_suffix-4.0.6.gemspec @@ -0,0 +1,24 @@ +# -*- encoding: utf-8 -*- +# stub: public_suffix 4.0.6 ruby lib + +Gem::Specification.new do |s| + s.name = "public_suffix".freeze + s.version = "4.0.6" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/weppos/publicsuffix-ruby/issues", "changelog_uri" => "https://github.com/weppos/publicsuffix-ruby/blob/master/CHANGELOG.md", "documentation_uri" => "https://rubydoc.info/gems/public_suffix/4.0.6", "homepage_uri" => "https://simonecarletti.com/code/publicsuffix-ruby", "source_code_uri" => "https://github.com/weppos/publicsuffix-ruby/tree/v4.0.6" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Simone Carletti".freeze] + s.date = "2020-09-02" + s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains.".freeze + s.email = ["weppos@weppos.net".freeze] + s.extra_rdoc_files = ["LICENSE.txt".freeze] + s.files = ["LICENSE.txt".freeze] + s.homepage = "https://simonecarletti.com/code/publicsuffix-ruby".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Domain name parser based on the Public Suffix List.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/racc-1.5.2.gemspec b/vendor/bundler/ruby/2.5.0/specifications/racc-1.5.2.gemspec new file mode 100644 index 000000000000..9acf684512b4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/racc-1.5.2.gemspec @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +# stub: racc 1.5.2 ruby lib +# stub: ext/racc/cparse/extconf.rb + +Gem::Specification.new do |s| + s.name = "racc".freeze + s.version = "1.5.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Minero Aoki".freeze, "Aaron Patterson".freeze] + s.date = "2020-12-26" + s.description = "Racc is a LALR(1) parser generator.\n It is written in Ruby itself, and generates Ruby program.\n\n NOTE: Ruby 1.8.x comes with Racc runtime module. You\n can run your parsers generated by racc 1.4.x out of the\n box.\n".freeze + s.email = [nil, "aaron@tenderlovemaking.com".freeze] + s.executables = ["racc".freeze] + s.extensions = ["ext/racc/cparse/extconf.rb".freeze] + s.extra_rdoc_files = ["README.ja.rdoc".freeze, "README.rdoc".freeze, "rdoc/en/NEWS.en.rdoc".freeze, "rdoc/en/grammar.en.rdoc".freeze, "rdoc/ja/NEWS.ja.rdoc".freeze, "rdoc/ja/debug.ja.rdoc".freeze, "rdoc/ja/grammar.ja.rdoc".freeze, "rdoc/ja/parser.ja.rdoc".freeze] + s.files = ["README.ja.rdoc".freeze, "README.rdoc".freeze, "bin/racc".freeze, "ext/racc/cparse/extconf.rb".freeze, "rdoc/en/NEWS.en.rdoc".freeze, "rdoc/en/grammar.en.rdoc".freeze, "rdoc/ja/NEWS.ja.rdoc".freeze, "rdoc/ja/debug.ja.rdoc".freeze, "rdoc/ja/grammar.ja.rdoc".freeze, "rdoc/ja/parser.ja.rdoc".freeze] + s.homepage = "http://i.loveruby.net/en/projects/racc/".freeze + s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze] + s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Racc is a LALR(1) parser generator".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/rb-fsevent-0.10.4.gemspec b/vendor/bundler/ruby/2.5.0/specifications/rb-fsevent-0.10.4.gemspec new file mode 100644 index 000000000000..2bfb3d39fe69 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/rb-fsevent-0.10.4.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- +# stub: rb-fsevent 0.10.4 ruby lib + +Gem::Specification.new do |s| + s.name = "rb-fsevent".freeze + s.version = "0.10.4" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "source_code_uri" => "https://github.com/thibaudgg/rb-fsevent" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Thibaud Guillaume-Gentil".freeze, "Travis Tilley".freeze] + s.date = "2020-04-30" + s.description = "FSEvents API with Signals catching (without RubyCocoa)".freeze + s.email = ["thibaud@thibaud.gg".freeze, "ttilley@gmail.com".freeze] + s.homepage = "http://rubygems.org/gems/rb-fsevent".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Very simple & usable FSEvents API".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.6"]) + s.add_development_dependency(%q<guard-rspec>.freeze, ["~> 4.2"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 12.0"]) + else + s.add_dependency(%q<rspec>.freeze, ["~> 3.6"]) + s.add_dependency(%q<guard-rspec>.freeze, ["~> 4.2"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + end + else + s.add_dependency(%q<rspec>.freeze, ["~> 3.6"]) + s.add_dependency(%q<guard-rspec>.freeze, ["~> 4.2"]) + s.add_dependency(%q<rake>.freeze, ["~> 12.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/rb-inotify-0.10.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/rb-inotify-0.10.1.gemspec new file mode 100644 index 000000000000..f01f6de0cea3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/rb-inotify-0.10.1.gemspec @@ -0,0 +1,44 @@ +# -*- encoding: utf-8 -*- +# stub: rb-inotify 0.10.1 ruby lib + +Gem::Specification.new do |s| + s.name = "rb-inotify".freeze + s.version = "0.10.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Natalie Weizenbaum".freeze, "Samuel Williams".freeze] + s.date = "2019-12-24" + s.email = ["nex342@gmail.com".freeze, "samuel.williams@oriontransfer.co.nz".freeze] + s.homepage = "https://github.com/guard/rb-inotify".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.2".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "A Ruby wrapper for Linux inotify, using FFI".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<ffi>.freeze, ["~> 1.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.6"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<concurrent-ruby>.freeze, [">= 0"]) + else + s.add_dependency(%q<ffi>.freeze, ["~> 1.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.6"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<concurrent-ruby>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<ffi>.freeze, ["~> 1.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.6"]) + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<concurrent-ruby>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/rexml-3.2.5.gemspec b/vendor/bundler/ruby/2.5.0/specifications/rexml-3.2.5.gemspec new file mode 100644 index 000000000000..93b58d997fa1 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/rexml-3.2.5.gemspec @@ -0,0 +1,42 @@ +# -*- encoding: utf-8 -*- +# stub: rexml 3.2.5 ruby lib + +Gem::Specification.new do |s| + s.name = "rexml".freeze + s.version = "3.2.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Kouhei Sutou".freeze] + s.bindir = "exe".freeze + s.date = "2021-04-05" + s.description = "An XML toolkit for Ruby".freeze + s.email = ["kou@cozmixng.org".freeze] + s.extra_rdoc_files = ["LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "doc/rexml/context.rdoc".freeze, "doc/rexml/tasks/rdoc/child.rdoc".freeze, "doc/rexml/tasks/rdoc/document.rdoc".freeze, "doc/rexml/tasks/rdoc/element.rdoc".freeze, "doc/rexml/tasks/rdoc/node.rdoc".freeze, "doc/rexml/tasks/rdoc/parent.rdoc".freeze, "doc/rexml/tasks/tocs/child_toc.rdoc".freeze, "doc/rexml/tasks/tocs/document_toc.rdoc".freeze, "doc/rexml/tasks/tocs/element_toc.rdoc".freeze, "doc/rexml/tasks/tocs/master_toc.rdoc".freeze, "doc/rexml/tasks/tocs/node_toc.rdoc".freeze, "doc/rexml/tasks/tocs/parent_toc.rdoc".freeze] + s.files = ["LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "doc/rexml/context.rdoc".freeze, "doc/rexml/tasks/rdoc/child.rdoc".freeze, "doc/rexml/tasks/rdoc/document.rdoc".freeze, "doc/rexml/tasks/rdoc/element.rdoc".freeze, "doc/rexml/tasks/rdoc/node.rdoc".freeze, "doc/rexml/tasks/rdoc/parent.rdoc".freeze, "doc/rexml/tasks/tocs/child_toc.rdoc".freeze, "doc/rexml/tasks/tocs/document_toc.rdoc".freeze, "doc/rexml/tasks/tocs/element_toc.rdoc".freeze, "doc/rexml/tasks/tocs/master_toc.rdoc".freeze, "doc/rexml/tasks/tocs/node_toc.rdoc".freeze, "doc/rexml/tasks/tocs/parent_toc.rdoc".freeze] + s.homepage = "https://github.com/ruby/rexml".freeze + s.licenses = ["BSD-2-Clause".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "An XML toolkit for Ruby".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0"]) + s.add_development_dependency(%q<test-unit>.freeze, [">= 0"]) + else + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<test-unit>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<bundler>.freeze, [">= 0"]) + s.add_dependency(%q<rake>.freeze, [">= 0"]) + s.add_dependency(%q<test-unit>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/rouge-3.26.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/rouge-3.26.0.gemspec new file mode 100644 index 000000000000..19595d1487b3 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/rouge-3.26.0.gemspec @@ -0,0 +1,24 @@ +# -*- encoding: utf-8 -*- +# stub: rouge 3.26.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rouge".freeze + s.version = "3.26.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rouge-ruby/rouge/issues", "changelog_uri" => "https://github.com/rouge-ruby/rouge/blob/master/CHANGELOG.md", "documentation_uri" => "https://rouge-ruby.github.io/docs/", "source_code_uri" => "https://github.com/rouge-ruby/rouge" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Jeanine Adkisson".freeze] + s.date = "2020-12-08" + s.description = "Rouge aims to a be a simple, easy-to-extend drop-in replacement for pygments.".freeze + s.email = ["jneen@jneen.net".freeze] + s.executables = ["rougify".freeze] + s.files = ["bin/rougify".freeze] + s.homepage = "http://rouge.jneen.net/".freeze + s.licenses = ["MIT".freeze, "BSD-2-Clause".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "A pure-ruby colorizer based on pygments".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/ruby-enum-0.9.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/ruby-enum-0.9.0.gemspec new file mode 100644 index 000000000000..1de2846eea62 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/ruby-enum-0.9.0.gemspec @@ -0,0 +1,31 @@ +# -*- encoding: utf-8 -*- +# stub: ruby-enum 0.9.0 ruby lib + +Gem::Specification.new do |s| + s.name = "ruby-enum".freeze + s.version = "0.9.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Daniel Doubrovkine".freeze] + s.date = "2021-01-31" + s.email = "dblock@dblock.org".freeze + s.homepage = "http://github.com/dblock/ruby-enum".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Enum-like behavior for Ruby.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<i18n>.freeze, [">= 0"]) + else + s.add_dependency(%q<i18n>.freeze, [">= 0"]) + end + else + s.add_dependency(%q<i18n>.freeze, [">= 0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/ruby2_keywords-0.0.4.gemspec b/vendor/bundler/ruby/2.5.0/specifications/ruby2_keywords-0.0.4.gemspec new file mode 100644 index 000000000000..d0dc352ccf0f --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/ruby2_keywords-0.0.4.gemspec @@ -0,0 +1,19 @@ +# -*- encoding: utf-8 -*- +# stub: ruby2_keywords 0.0.4 ruby lib + +Gem::Specification.new do |s| + s.name = "ruby2_keywords".freeze + s.version = "0.0.4" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Nobuyoshi Nakada".freeze] + s.date = "2021-01-19" + s.homepage = "https://github.com/ruby/ruby2_keywords".freeze + s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze] + s.rdoc_options = ["--main".freeze, "README.md".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Shim library for Module#ruby2_keywords".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/rubyzip-2.3.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/rubyzip-2.3.0.gemspec new file mode 100644 index 000000000000..f30d5bc31886 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/rubyzip-2.3.0.gemspec @@ -0,0 +1,45 @@ +# -*- encoding: utf-8 -*- +# stub: rubyzip 2.3.0 ruby lib + +Gem::Specification.new do |s| + s.name = "rubyzip".freeze + s.version = "2.3.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/rubyzip/rubyzip/issues", "changelog_uri" => "https://github.com/rubyzip/rubyzip/blob/v2.3.0/Changelog.md", "documentation_uri" => "https://www.rubydoc.info/gems/rubyzip/2.3.0", "source_code_uri" => "https://github.com/rubyzip/rubyzip/tree/v2.3.0", "wiki_uri" => "https://github.com/rubyzip/rubyzip/wiki" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Alexander Simonov".freeze] + s.date = "2020-03-14" + s.email = ["alex@simonov.me".freeze] + s.homepage = "http://github.com/rubyzip/rubyzip".freeze + s.licenses = ["BSD 2-Clause".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "rubyzip is a ruby module for reading and writing zip files".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<coveralls>.freeze, ["~> 0.7"]) + s.add_development_dependency(%q<minitest>.freeze, ["~> 5.4"]) + s.add_development_dependency(%q<pry>.freeze, ["~> 0.10"]) + s.add_development_dependency(%q<rake>.freeze, [">= 12.3.3", "~> 12.3"]) + s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.79"]) + else + s.add_dependency(%q<coveralls>.freeze, ["~> 0.7"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.4"]) + s.add_dependency(%q<pry>.freeze, ["~> 0.10"]) + s.add_dependency(%q<rake>.freeze, [">= 12.3.3", "~> 12.3"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.79"]) + end + else + s.add_dependency(%q<coveralls>.freeze, ["~> 0.7"]) + s.add_dependency(%q<minitest>.freeze, ["~> 5.4"]) + s.add_dependency(%q<pry>.freeze, ["~> 0.10"]) + s.add_dependency(%q<rake>.freeze, [">= 12.3.3", "~> 12.3"]) + s.add_dependency(%q<rubocop>.freeze, ["~> 0.79"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/safe_yaml-1.0.5.gemspec b/vendor/bundler/ruby/2.5.0/specifications/safe_yaml-1.0.5.gemspec new file mode 100644 index 000000000000..d6602c75e69a --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/safe_yaml-1.0.5.gemspec @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +# stub: safe_yaml 1.0.5 ruby lib + +Gem::Specification.new do |s| + s.name = "safe_yaml".freeze + s.version = "1.0.5" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Dan Tao".freeze] + s.date = "2019-02-22" + s.description = "Parse YAML safely".freeze + s.email = "daniel.tao@gmail.com".freeze + s.executables = ["safe_yaml".freeze] + s.files = ["bin/safe_yaml".freeze] + s.homepage = "https://github.com/dtao/safe_yaml".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "SameYAML provides an alternative implementation of YAML.load suitable for accepting user input in Ruby applications.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/sass-3.7.4.gemspec b/vendor/bundler/ruby/2.5.0/specifications/sass-3.7.4.gemspec new file mode 100644 index 000000000000..8f80a5f17648 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/sass-3.7.4.gemspec @@ -0,0 +1,50 @@ +# -*- encoding: utf-8 -*- +# stub: sass 3.7.4 ruby lib + +Gem::Specification.new do |s| + s.name = "sass".freeze + s.version = "3.7.4" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "source_code_uri" => "https://github.com/sass/ruby-sass" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Natalie Weizenbaum".freeze, "Chris Eppstein".freeze, "Hampton Catlin".freeze] + s.date = "2019-04-04" + s.description = " Ruby Sass is deprecated! See https://sass-lang.com/ruby-sass for details.\n\n Sass makes CSS fun again. Sass is an extension of CSS, adding\n nested rules, variables, mixins, selector inheritance, and more.\n It's translated to well-formatted, standard CSS using the\n command line tool or a web-framework plugin.\n".freeze + s.email = "sass-lang@googlegroups.com".freeze + s.executables = ["sass".freeze, "sass-convert".freeze, "scss".freeze] + s.files = ["bin/sass".freeze, "bin/sass-convert".freeze, "bin/scss".freeze] + s.homepage = "https://sass-lang.com/".freeze + s.licenses = ["MIT".freeze] + s.post_install_message = "\nRuby Sass has reached end-of-life and should no longer be used.\n\n* If you use Sass as a command-line tool, we recommend using Dart Sass, the new\n primary implementation: https://sass-lang.com/install\n\n* If you use Sass as a plug-in for a Ruby web framework, we recommend using the\n sassc gem: https://github.com/sass/sassc-ruby#readme\n\n* For more details, please refer to the Sass blog:\n https://sass-lang.com/blog/posts/7828841\n\n".freeze + s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze) + s.rubyforge_project = "sass".freeze + s.rubygems_version = "2.7.6".freeze + s.summary = "A powerful but elegant CSS compiler that makes CSS fun again.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<sass-listen>.freeze, ["~> 4.0.0"]) + s.add_development_dependency(%q<yard>.freeze, ["~> 0.8.7.6"]) + s.add_development_dependency(%q<redcarpet>.freeze, ["~> 3.3"]) + s.add_development_dependency(%q<nokogiri>.freeze, ["~> 1.6.0"]) + s.add_development_dependency(%q<minitest>.freeze, [">= 5"]) + else + s.add_dependency(%q<sass-listen>.freeze, ["~> 4.0.0"]) + s.add_dependency(%q<yard>.freeze, ["~> 0.8.7.6"]) + s.add_dependency(%q<redcarpet>.freeze, ["~> 3.3"]) + s.add_dependency(%q<nokogiri>.freeze, ["~> 1.6.0"]) + s.add_dependency(%q<minitest>.freeze, [">= 5"]) + end + else + s.add_dependency(%q<sass-listen>.freeze, ["~> 4.0.0"]) + s.add_dependency(%q<yard>.freeze, ["~> 0.8.7.6"]) + s.add_dependency(%q<redcarpet>.freeze, ["~> 3.3"]) + s.add_dependency(%q<nokogiri>.freeze, ["~> 1.6.0"]) + s.add_dependency(%q<minitest>.freeze, [">= 5"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/sass-listen-4.0.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/sass-listen-4.0.0.gemspec new file mode 100644 index 000000000000..ec7a86fc7c69 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/sass-listen-4.0.0.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- +# stub: sass-listen 4.0.0 ruby lib + +Gem::Specification.new do |s| + s.name = "sass-listen".freeze + s.version = "4.0.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Thibaud Guillaume-Gentil".freeze] + s.date = "2017-07-13" + s.description = "This fork of guard/listen provides a stable API for users of the ruby Sass CLI".freeze + s.email = "thibaud@thibaud.gg".freeze + s.homepage = "https://github.com/sass/listen".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Fork of guard/listen".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<rb-fsevent>.freeze, [">= 0.9.4", "~> 0.9"]) + s.add_runtime_dependency(%q<rb-inotify>.freeze, [">= 0.9.7", "~> 0.9"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 1.3.5"]) + else + s.add_dependency(%q<rb-fsevent>.freeze, [">= 0.9.4", "~> 0.9"]) + s.add_dependency(%q<rb-inotify>.freeze, [">= 0.9.7", "~> 0.9"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.3.5"]) + end + else + s.add_dependency(%q<rb-fsevent>.freeze, [">= 0.9.4", "~> 0.9"]) + s.add_dependency(%q<rb-inotify>.freeze, [">= 0.9.7", "~> 0.9"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.3.5"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/sawyer-0.8.2.gemspec b/vendor/bundler/ruby/2.5.0/specifications/sawyer-0.8.2.gemspec new file mode 100644 index 000000000000..532da656a6f4 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/sawyer-0.8.2.gemspec @@ -0,0 +1,34 @@ +# -*- encoding: utf-8 -*- +# stub: sawyer 0.8.2 ruby lib + +Gem::Specification.new do |s| + s.name = "sawyer".freeze + s.version = "0.8.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 1.3.5".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Rick Olson".freeze, "Wynn Netherland".freeze] + s.date = "2019-05-01" + s.email = "technoweenie@gmail.com".freeze + s.homepage = "https://github.com/lostisland/sawyer".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Secret User Agent of HTTP".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 2 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<faraday>.freeze, ["< 2.0", "> 0.8"]) + s.add_runtime_dependency(%q<addressable>.freeze, [">= 2.3.5"]) + else + s.add_dependency(%q<faraday>.freeze, ["< 2.0", "> 0.8"]) + s.add_dependency(%q<addressable>.freeze, [">= 2.3.5"]) + end + else + s.add_dependency(%q<faraday>.freeze, ["< 2.0", "> 0.8"]) + s.add_dependency(%q<addressable>.freeze, [">= 2.3.5"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/simpleidn-0.2.1.gemspec b/vendor/bundler/ruby/2.5.0/specifications/simpleidn-0.2.1.gemspec new file mode 100644 index 000000000000..d7025b2a6b08 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/simpleidn-0.2.1.gemspec @@ -0,0 +1,42 @@ +# -*- encoding: utf-8 -*- +# stub: simpleidn 0.2.1 ruby lib + +Gem::Specification.new do |s| + s.name = "simpleidn".freeze + s.version = "0.2.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Morten M\u00F8ller Riis".freeze] + s.date = "2021-01-14" + s.description = "This gem allows easy conversion from punycode ACE strings to unicode UTF-8 strings and vice-versa.".freeze + s.email = ["mortenmoellerriis _AT_ gmail.com".freeze] + s.homepage = "https://github.com/mmriis/simpleidn".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.2".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Punycode ACE to unicode UTF-8 (and vice-versa) string conversion.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<unf>.freeze, ["~> 0.1.4"]) + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.11"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 10.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"]) + else + s.add_dependency(%q<unf>.freeze, ["~> 0.1.4"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.11"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + end + else + s.add_dependency(%q<unf>.freeze, ["~> 0.1.4"]) + s.add_dependency(%q<bundler>.freeze, ["~> 1.11"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/terminal-table-1.8.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/terminal-table-1.8.0.gemspec new file mode 100644 index 000000000000..9e73f4b8c940 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/terminal-table-1.8.0.gemspec @@ -0,0 +1,46 @@ +# -*- encoding: utf-8 -*- +# stub: terminal-table 1.8.0 ruby lib + +Gem::Specification.new do |s| + s.name = "terminal-table".freeze + s.version = "1.8.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["TJ Holowaychuk".freeze, "Scott J. Goldman".freeze] + s.date = "2017-05-17" + s.email = ["tj@vision-media.ca".freeze] + s.homepage = "https://github.com/tj/terminal-table".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Simple, feature rich ascii table generation library".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<bundler>.freeze, ["~> 1.10"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 10.0"]) + s.add_development_dependency(%q<rspec>.freeze, [">= 3.0"]) + s.add_development_dependency(%q<term-ansicolor>.freeze, [">= 0"]) + s.add_development_dependency(%q<pry>.freeze, [">= 0"]) + s.add_runtime_dependency(%q<unicode-display_width>.freeze, [">= 1.1.1", "~> 1.1"]) + else + s.add_dependency(%q<bundler>.freeze, ["~> 1.10"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.0"]) + s.add_dependency(%q<rspec>.freeze, [">= 3.0"]) + s.add_dependency(%q<term-ansicolor>.freeze, [">= 0"]) + s.add_dependency(%q<pry>.freeze, [">= 0"]) + s.add_dependency(%q<unicode-display_width>.freeze, [">= 1.1.1", "~> 1.1"]) + end + else + s.add_dependency(%q<bundler>.freeze, ["~> 1.10"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.0"]) + s.add_dependency(%q<rspec>.freeze, [">= 3.0"]) + s.add_dependency(%q<term-ansicolor>.freeze, [">= 0"]) + s.add_dependency(%q<pry>.freeze, [">= 0"]) + s.add_dependency(%q<unicode-display_width>.freeze, [">= 1.1.1", "~> 1.1"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/thread_safe-0.3.6.gemspec b/vendor/bundler/ruby/2.5.0/specifications/thread_safe-0.3.6.gemspec new file mode 100644 index 000000000000..a75a1c6381a6 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/thread_safe-0.3.6.gemspec @@ -0,0 +1,38 @@ +# -*- encoding: utf-8 -*- +# stub: thread_safe 0.3.6 ruby lib + +Gem::Specification.new do |s| + s.name = "thread_safe".freeze + s.version = "0.3.6" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Charles Oliver Nutter".freeze, "thedarkone".freeze] + s.date = "2017-02-22" + s.description = "A collection of data structures and utilities to make thread-safe programming in Ruby easier".freeze + s.email = ["headius@headius.com".freeze, "thedarkone2@gmail.com".freeze] + s.homepage = "https://github.com/ruby-concurrency/thread_safe".freeze + s.licenses = ["Apache-2.0".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Thread-safe collections and utilities for Ruby".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<atomic>.freeze, ["= 1.1.16"]) + s.add_development_dependency(%q<rake>.freeze, ["< 12.0"]) + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.2"]) + else + s.add_dependency(%q<atomic>.freeze, ["= 1.1.16"]) + s.add_dependency(%q<rake>.freeze, ["< 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.2"]) + end + else + s.add_dependency(%q<atomic>.freeze, ["= 1.1.16"]) + s.add_dependency(%q<rake>.freeze, ["< 12.0"]) + s.add_dependency(%q<rspec>.freeze, ["~> 3.2"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/typhoeus-1.4.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/typhoeus-1.4.0.gemspec new file mode 100644 index 000000000000..6426892a0c86 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/typhoeus-1.4.0.gemspec @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- +# stub: typhoeus 1.4.0 ruby lib + +Gem::Specification.new do |s| + s.name = "typhoeus".freeze + s.version = "1.4.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["David Balatero".freeze, "Paul Dix".freeze, "Hans Hasselberg".freeze] + s.date = "2020-05-08" + s.description = "Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic.".freeze + s.email = ["hans.hasselberg@gmail.com".freeze] + s.homepage = "https://github.com/typhoeus/typhoeus".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Parallel HTTP library on top of libcurl multi.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<ethon>.freeze, [">= 0.9.0"]) + else + s.add_dependency(%q<ethon>.freeze, [">= 0.9.0"]) + end + else + s.add_dependency(%q<ethon>.freeze, [">= 0.9.0"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/tzinfo-1.2.9.gemspec b/vendor/bundler/ruby/2.5.0/specifications/tzinfo-1.2.9.gemspec new file mode 100644 index 000000000000..2d47ff35b7ef --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/tzinfo-1.2.9.gemspec @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- +# stub: tzinfo 1.2.9 ruby lib + +Gem::Specification.new do |s| + s.name = "tzinfo".freeze + s.version = "1.2.9" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Philip Ross".freeze] + s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIDPDCCAiSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAkMSIwIAYDVQQDDBlwaGls\nLnJvc3MvREM9Z21haWwvREM9Y29tMB4XDTE5MTIyNDE0NTU0N1oXDTM5MTIyNDE0\nNTU0N1owJDEiMCAGA1UEAwwZcGhpbC5yb3NzL0RDPWdtYWlsL0RDPWNvbTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJGcwfqn4ZsmPl0b1Lt9dCzExrE5\nEeP/CRQjBdGHkF+mSpi69XysxdwLdfg5SPr9LfxthUug4nNFd5fDCiXM8hYe9jQD\nTmkIQKNBh4fFpGngn9gyy+SumCXi6b5L6d/aMc59NAOM6LJ88TOdH1648dh5rq3C\nULq82n3gg4+u0HHGjRPuR/pnCFQCZbANYdX+UBWd0qkOJn/EreNKROmEeHr/xKuh\n2/GlKFKt9KLcW3hwBB4fHHVYUzRau7D1m9KbEERdg//qNDC4B7fD2BFJuPbM5S7J\n41VwDAh1O8B/Qpg0f+S83K4Kodw4MiPGsug55UkNtd3mGR/zZJ9WM03DSwkCAwEA\nAaN5MHcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFA+Z8zvfzBuA\nesoHIfz7+jxfUOcfMB4GA1UdEQQXMBWBE3BoaWwucm9zc0BnbWFpbC5jb20wHgYD\nVR0SBBcwFYETcGhpbC5yb3NzQGdtYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEA\nJ80xgZ3gGdQVA8N+8NJANU5HLuZIU9jOaAlziU9ImoTgPiOHKGZC4as1TwT4kBt1\nQcnu7YSANYRrxP5tpOHsWPF/MQYgerAFCZS5+PzOTudwZ+7OsMW4/EMHy6aCVHEd\nc7HzQRC4mSrDRpWxzyBnZ5nX5OAmIkKA8NgeKybT/4Ku6iFPPUQwlyxQaO+Wlxdo\nFqHwpjRyoiVSpe4RUTNK3d3qesWPYi7Lxn6k6ZZeEdvG6ya33AXktE3jmmF+jPR1\nJ3Zn/kSTjTekiaspyGbczC3PUaeJNxr+yCvR4sk71Xmk/GaKKGOHedJ1uj/LAXrA\nMR0mpl7b8zCg0PFC1J73uw==\n-----END CERTIFICATE-----\n".freeze] + s.date = "2020-12-16" + s.description = "TZInfo provides daylight savings aware transformations between times in different time zones.".freeze + s.email = "phil.ross@gmail.com".freeze + s.extra_rdoc_files = ["README.md".freeze, "CHANGES.md".freeze, "LICENSE".freeze] + s.files = ["CHANGES.md".freeze, "LICENSE".freeze, "README.md".freeze] + s.homepage = "https://tzinfo.github.io".freeze + s.licenses = ["MIT".freeze] + s.rdoc_options = ["--title".freeze, "TZInfo".freeze, "--main".freeze, "README.md".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Daylight savings aware timezone library".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<thread_safe>.freeze, ["~> 0.1"]) + else + s.add_dependency(%q<thread_safe>.freeze, ["~> 0.1"]) + end + else + s.add_dependency(%q<thread_safe>.freeze, ["~> 0.1"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/unf-0.1.4.gemspec b/vendor/bundler/ruby/2.5.0/specifications/unf-0.1.4.gemspec new file mode 100644 index 000000000000..f689eaacc469 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/unf-0.1.4.gemspec @@ -0,0 +1,46 @@ +# -*- encoding: utf-8 -*- +# stub: unf 0.1.4 ruby lib + +Gem::Specification.new do |s| + s.name = "unf".freeze + s.version = "0.1.4" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Akinori MUSHA".freeze] + s.date = "2014-04-04" + s.description = "This is a wrapper library to bring Unicode Normalization Form support\nto Ruby/JRuby.\n".freeze + s.email = ["knu@idaemons.org".freeze] + s.extra_rdoc_files = ["README.md".freeze, "LICENSE".freeze] + s.files = ["LICENSE".freeze, "README.md".freeze] + s.homepage = "https://github.com/knu/ruby-unf".freeze + s.licenses = ["2-clause BSDL".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "A wrapper library to bring Unicode Normalization Form support to Ruby/JRuby".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q<unf_ext>.freeze, [">= 0"]) + s.add_development_dependency(%q<shoulda>.freeze, [">= 0"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 1.2.0"]) + s.add_development_dependency(%q<rake>.freeze, [">= 0.9.2.2"]) + s.add_development_dependency(%q<rdoc>.freeze, ["> 2.4.2"]) + else + s.add_dependency(%q<unf_ext>.freeze, [">= 0"]) + s.add_dependency(%q<shoulda>.freeze, [">= 0"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.2.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0.9.2.2"]) + s.add_dependency(%q<rdoc>.freeze, ["> 2.4.2"]) + end + else + s.add_dependency(%q<unf_ext>.freeze, [">= 0"]) + s.add_dependency(%q<shoulda>.freeze, [">= 0"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.2.0"]) + s.add_dependency(%q<rake>.freeze, [">= 0.9.2.2"]) + s.add_dependency(%q<rdoc>.freeze, ["> 2.4.2"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/unf_ext-0.0.7.7.gemspec b/vendor/bundler/ruby/2.5.0/specifications/unf_ext-0.0.7.7.gemspec new file mode 100644 index 000000000000..4b5b321de473 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/unf_ext-0.0.7.7.gemspec @@ -0,0 +1,51 @@ +# -*- encoding: utf-8 -*- +# stub: unf_ext 0.0.7.7 ruby lib +# stub: ext/unf_ext/extconf.rb + +Gem::Specification.new do |s| + s.name = "unf_ext".freeze + s.version = "0.0.7.7" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib".freeze] + s.authors = ["Takeru Ohta".freeze, "Akinori MUSHA".freeze] + s.date = "2020-03-29" + s.description = "Unicode Normalization Form support library for CRuby".freeze + s.email = ["knu@idaemons.org".freeze] + s.extensions = ["ext/unf_ext/extconf.rb".freeze] + s.extra_rdoc_files = ["LICENSE.txt".freeze, "README.md".freeze] + s.files = ["LICENSE.txt".freeze, "README.md".freeze, "ext/unf_ext/extconf.rb".freeze] + s.homepage = "https://github.com/knu/ruby-unf_ext".freeze + s.licenses = ["MIT".freeze] + s.rubygems_version = "2.7.6".freeze + s.summary = "Unicode Normalization Form support library for CRuby".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rake>.freeze, [">= 0.9.2.2"]) + s.add_development_dependency(%q<test-unit>.freeze, [">= 0"]) + s.add_development_dependency(%q<rdoc>.freeze, ["> 2.4.2"]) + s.add_development_dependency(%q<bundler>.freeze, [">= 1.2"]) + s.add_development_dependency(%q<rake-compiler>.freeze, [">= 0.7.9"]) + s.add_development_dependency(%q<rake-compiler-dock>.freeze, [">= 1.0.1"]) + else + s.add_dependency(%q<rake>.freeze, [">= 0.9.2.2"]) + s.add_dependency(%q<test-unit>.freeze, [">= 0"]) + s.add_dependency(%q<rdoc>.freeze, ["> 2.4.2"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.2"]) + s.add_dependency(%q<rake-compiler>.freeze, [">= 0.7.9"]) + s.add_dependency(%q<rake-compiler-dock>.freeze, [">= 1.0.1"]) + end + else + s.add_dependency(%q<rake>.freeze, [">= 0.9.2.2"]) + s.add_dependency(%q<test-unit>.freeze, [">= 0"]) + s.add_dependency(%q<rdoc>.freeze, ["> 2.4.2"]) + s.add_dependency(%q<bundler>.freeze, [">= 1.2"]) + s.add_dependency(%q<rake-compiler>.freeze, [">= 0.7.9"]) + s.add_dependency(%q<rake-compiler-dock>.freeze, [">= 1.0.1"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/unicode-display_width-1.7.0.gemspec b/vendor/bundler/ruby/2.5.0/specifications/unicode-display_width-1.7.0.gemspec new file mode 100644 index 000000000000..d0af6b3a381e --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/unicode-display_width-1.7.0.gemspec @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- +# stub: unicode-display_width 1.7.0 ruby lib + +Gem::Specification.new do |s| + s.name = "unicode-display_width".freeze + s.version = "1.7.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/janlelis/unicode-display_width/issues", "changelog_uri" => "https://github.com/janlelis/unicode-display_width/blob/master/CHANGELOG.md", "source_code_uri" => "https://github.com/janlelis/unicode-display_width" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Jan Lelis".freeze] + s.date = "2020-03-11" + s.description = "[Unicode 13.0.0] Determines the monospace display width of a string using EastAsianWidth.txt, Unicode general category, and other data.".freeze + s.email = ["hi@ruby.consulting".freeze] + s.extra_rdoc_files = ["README.md".freeze, "MIT-LICENSE.txt".freeze, "CHANGELOG.md".freeze] + s.files = ["CHANGELOG.md".freeze, "MIT-LICENSE.txt".freeze, "README.md".freeze] + s.homepage = "https://github.com/janlelis/unicode-display_width".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Determines the monospace display width of a string in Ruby.".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_development_dependency(%q<rspec>.freeze, ["~> 3.4"]) + s.add_development_dependency(%q<rake>.freeze, ["~> 10.4"]) + else + s.add_dependency(%q<rspec>.freeze, ["~> 3.4"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.4"]) + end + else + s.add_dependency(%q<rspec>.freeze, ["~> 3.4"]) + s.add_dependency(%q<rake>.freeze, ["~> 10.4"]) + end +end diff --git a/vendor/bundler/ruby/2.5.0/specifications/zeitwerk-2.4.2.gemspec b/vendor/bundler/ruby/2.5.0/specifications/zeitwerk-2.4.2.gemspec new file mode 100644 index 000000000000..8a00715c9ae7 --- /dev/null +++ b/vendor/bundler/ruby/2.5.0/specifications/zeitwerk-2.4.2.gemspec @@ -0,0 +1,22 @@ +# -*- encoding: utf-8 -*- +# stub: zeitwerk 2.4.2 ruby lib + +Gem::Specification.new do |s| + s.name = "zeitwerk".freeze + s.version = "2.4.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= + s.metadata = { "bug_tracker_uri" => "https://github.com/fxn/zeitwerk/issues", "changelog_uri" => "https://github.com/fxn/zeitwerk/blob/master/CHANGELOG.md", "homepage_uri" => "https://github.com/fxn/zeitwerk", "source_code_uri" => "https://github.com/fxn/zeitwerk" } if s.respond_to? :metadata= + s.require_paths = ["lib".freeze] + s.authors = ["Xavier Noria".freeze] + s.date = "2020-11-27" + s.description = " Zeitwerk implements constant autoloading with Ruby semantics. Each gem\n and application may have their own independent autoloader, with its own\n configuration, inflector, and logger. Supports autoloading,\n reloading, and eager loading.\n".freeze + s.email = "fxn@hashref.com".freeze + s.homepage = "https://github.com/fxn/zeitwerk".freeze + s.licenses = ["MIT".freeze] + s.required_ruby_version = Gem::Requirement.new(">= 2.4.4".freeze) + s.rubygems_version = "2.7.6".freeze + s.summary = "Efficient and thread-safe constant autoloader".freeze + + s.installed_by_version = "2.7.6" if s.respond_to? :installed_by_version +end
a c